diff --git a/.dir-locals.el b/.dir-locals.el new file mode 100644 index 00000000000..5cdd32a553a --- /dev/null +++ b/.dir-locals.el @@ -0,0 +1,7 @@ +;;; Directory Local Variables -*- no-byte-compile: t -*- +;;; For more information see (info "(emacs) Directory Variables") + +((c++-mode . ((c-file-style . "filament") + (apheleia-inhibit . t))) + (c-mode . ((c-file-style . "filament") + (apheleia-inhibit . t)))) diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000000..3e033d0c895 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 + +[*.{c,cpp,h,inc,kt,java,js,md}] +indent_style = space +indent_size = 4 +max_line_length = 100 diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 7faddd90696..69bc29cc63b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -4,6 +4,8 @@ about: Create a report to help us improve --- +⚠️ **Issues not using this template will be systematically closed.** + **Describe the bug** A clear and concise description of what the bug is. @@ -18,8 +20,8 @@ A clear and concise description of what you expected to happen. If applicable, add screenshots to help explain your problem. **Logs** -If applicable, copy logs from your console here. Please *do not* -use screenshots of logs, copy them as text. +If applicable, copy **full** logs from your console here. Please *do not* +use screenshots of logs, copy them as text, use gist or attach an *uncompressed* file. **Desktop (please complete the following information):** - OS: [e.g. iOS] diff --git a/.github/actions/android-continuous/action.yml b/.github/actions/android-continuous/action.yml new file mode 100644 index 00000000000..ecf23fc5244 --- /dev/null +++ b/.github/actions/android-continuous/action.yml @@ -0,0 +1,17 @@ +name: 'Android Continuous' +inputs: + build-abi: + description: 'The target platform ABI' + required: true + default: 'armeabi-v7a' +runs: + using: "composite" + steps: + - uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '17' + - name: Run build script + run: | + cd build/android && printf "y" | ./build.sh continuous ${{ inputs.build-abi }} + shell: bash diff --git a/.github/actions/ubuntu-apt-add-src/action.yml b/.github/actions/ubuntu-apt-add-src/action.yml new file mode 100644 index 00000000000..c104574a632 --- /dev/null +++ b/.github/actions/ubuntu-apt-add-src/action.yml @@ -0,0 +1,9 @@ +name: 'ubuntu apt add deb-src' +runs: + using: "composite" + steps: + - name: "ubuntu apt add deb-src" + run: | + echo "deb-src http://archive.ubuntu.com/ubuntu jammy main restricted universe" | sudo tee /etc/apt/sources.list.d/my.list + sudo apt-get update + shell: bash diff --git a/.github/workflows/android-continuous.yml b/.github/workflows/android-continuous.yml index d13d80e3e31..3c5d3901f6d 100644 --- a/.github/workflows/android-continuous.yml +++ b/.github/workflows/android-continuous.yml @@ -10,30 +10,13 @@ on: jobs: build-android: name: build-android - runs-on: macos-latest + # We intentially use a larger runner here to enable larger disk space + # (standard linux runner will fail on disk space and faster build time). + runs-on: ubuntu-22.04-32core steps: - - uses: actions/checkout@v3.3.0 - - name: Run build script - run: | - cd build/android && printf "y" | ./build.sh continuous - - uses: actions/upload-artifact@v1.0.0 + - uses: actions/checkout@v4.1.6 + - name: Run Android Continuous + uses: ./.github/actions/android-continuous with: - name: filament-android - path: out/filament-android-release.aar - - uses: actions/upload-artifact@v1.0.0 - with: - name: filamat-android-full - path: out/filamat-android-release.aar - - uses: actions/upload-artifact@v1.0.0 - with: - name: filamat-android-lite - path: out/filamat-android-lite-release.aar - - uses: actions/upload-artifact@v1.0.0 - with: - name: gltfio-android-release - path: out/gltfio-android-release.aar - - uses: actions/upload-artifact@v1.0.0 - with: - name: filament-utils-android-release - path: out/filament-utils-android-release.aar + build-abi: armeabi-v7a,arm64-v8a,x86_64 diff --git a/.github/workflows/cocopods-deploy.yml b/.github/workflows/cocopods-deploy.yml new file mode 100644 index 00000000000..26e08c048df --- /dev/null +++ b/.github/workflows/cocopods-deploy.yml @@ -0,0 +1,30 @@ +name: CocoaPods Deploy + +# This must be run after the iOS release job has finished, and the iOS release +# asset has been uploaded to Github. +on: + workflow_dispatch: + inputs: + release_tag: + description: 'Release tag to deploy (e.g., v1.42.2)' + required: true + default: 'v1.42.2' + +jobs: + cocoapods-deploy: + name: cocoapods-deploy + runs-on: macos-14 + steps: + - name: Check out iOS/CocoaPods directory + uses: Bhacaz/checkout-files@49fc3050859046bf4f4873678d46099985640e89 + with: + files: ios/CocoaPods + token: ${{ secrets.GITHUB_TOKEN }} + branch: ${{ github.event.inputs.release_tag }} + - name: Move podspec to root + run: mv ios/CocoaPods/*.podspec . + - name: Install CocoaPods + run: gem install cocoapods + - uses: michaelhenry/deploy-to-cocoapods-github-action@745686ab065f90596e0d5cfcf97bb2416d94262e + env: + COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }} diff --git a/.github/workflows/ios-continuous.yml b/.github/workflows/ios-continuous.yml index c9bc5bd85bc..28b29151596 100644 --- a/.github/workflows/ios-continuous.yml +++ b/.github/workflows/ios-continuous.yml @@ -10,14 +10,14 @@ on: jobs: build-ios: name: build-ios - runs-on: macos-latest + runs-on: macos-14-xlarge steps: - - uses: actions/checkout@v3.3.0 + - uses: actions/checkout@v4.1.6 - name: Run build script run: | cd build/ios && printf "y" | ./build.sh continuous - - uses: actions/upload-artifact@v1.0.0 + - uses: actions/upload-artifact@v4 with: name: filament-ios path: out/filament-release-ios.tgz diff --git a/.github/workflows/linux-continuous.yml b/.github/workflows/linux-continuous.yml index e5596570f25..bc211e09546 100644 --- a/.github/workflows/linux-continuous.yml +++ b/.github/workflows/linux-continuous.yml @@ -10,14 +10,14 @@ on: jobs: build-linux: name: build-linux - runs-on: ubuntu-18.04 + runs-on: ubuntu-22.04-16core steps: - - uses: actions/checkout@v3.3.0 + - uses: actions/checkout@v4.1.6 - name: Run build script run: | cd build/linux && printf "y" | ./build.sh continuous - - uses: actions/upload-artifact@v1.0.0 + - uses: actions/upload-artifact@v4 with: name: filament-linux path: out/filament-release-linux.tgz diff --git a/.github/workflows/mac-continuous.yml b/.github/workflows/mac-continuous.yml index 80402fa5a26..e0a46ab4ba1 100644 --- a/.github/workflows/mac-continuous.yml +++ b/.github/workflows/mac-continuous.yml @@ -10,14 +10,14 @@ on: jobs: build-mac: name: build-mac - runs-on: macos-latest + runs-on: macos-14-xlarge steps: - - uses: actions/checkout@v3.3.0 + - uses: actions/checkout@v4.1.6 - name: Run build script run: | cd build/mac && printf "y" | ./build.sh continuous - - uses: actions/upload-artifact@v1.0.0 + - uses: actions/upload-artifact@v4 with: name: filament-mac path: out/filament-release-darwin.tgz diff --git a/.github/workflows/npm-deploy.yml b/.github/workflows/npm-deploy.yml new file mode 100644 index 00000000000..44ef2dbbeec --- /dev/null +++ b/.github/workflows/npm-deploy.yml @@ -0,0 +1,33 @@ +name: Npm Deploy + +on: + workflow_dispatch: + inputs: + release_tag: + description: 'Release tag to deploy (e.g., v1.42.2)' + required: true + default: 'v1.42.2' + +jobs: + npm-deploy: + name: npm-deploy + runs-on: macos-14 + steps: + - uses: actions/checkout@v4.1.6 + with: + ref: ${{ github.event.inputs.release_tag }} + # Setup .npmrc file to publish to npm + - uses: actions/setup-node@v3 + with: + node-version: '18.x' + registry-url: 'https://registry.npmjs.org' + - name: Run build script + run: | + cd build/web && printf "y" | ./build.sh release + - name: Deploy to npm + run: | + cd out/cmake-webgl-release/web/filament-js + npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + diff --git a/.github/workflows/presubmit.yml b/.github/workflows/presubmit.yml index eed86d2f0a3..28479f236d1 100644 --- a/.github/workflows/presubmit.yml +++ b/.github/workflows/presubmit.yml @@ -15,10 +15,10 @@ jobs: strategy: matrix: - os: [macos-latest, ubuntu-18.04] + os: [macos-14-xlarge, ubuntu-22.04-16core] steps: - - uses: actions/checkout@v3.3.0 + - uses: actions/checkout@v4.1.6 - name: Run build script run: | WORKFLOW_OS=`echo \`uname\` | sed "s/Darwin/mac/" | tr [:upper:] [:lower:]` @@ -29,10 +29,10 @@ jobs: build-windows: name: build-windows - runs-on: windows-2019 + runs-on: win-2019-16core steps: - - uses: actions/checkout@v3.3.0 + - uses: actions/checkout@v4.1.6 - name: Run build script run: | build\windows\build-github.bat presubmit @@ -40,20 +40,26 @@ jobs: build-android: name: build-android - runs-on: macos-latest + runs-on: ubuntu-22.04-16core steps: - - uses: actions/checkout@v3.3.0 + - uses: actions/checkout@v4.1.6 + - uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '17' - name: Run build script + # Only build 1 64 bit target during presubmit to cut down build times during presubmit + # Continuous builds will build everything run: | - cd build/android && printf "y" | ./build.sh presubmit + cd build/android && printf "y" | ./build.sh presubmit arm64-v8a build-ios: name: build-iOS - runs-on: macos-latest + runs-on: macos-14-xlarge steps: - - uses: actions/checkout@v3.3.0 + - uses: actions/checkout@v4.1.6 - name: Run build script run: | cd build/ios && printf "y" | ./build.sh presubmit @@ -63,10 +69,25 @@ jobs: build-web: name: build-web - runs-on: macos-latest + runs-on: ubuntu-22.04-16core steps: - - uses: actions/checkout@v3.3.0 + - uses: actions/checkout@v4.1.6 - name: Run build script run: | cd build/web && printf "y" | ./build.sh presubmit + + test-renderdiff: + name: test-renderdiff + runs-on: ubuntu-22.04-32core + + steps: + - uses: actions/checkout@v4.1.6 + - uses: ./.github/actions/ubuntu-apt-add-src + - name: Run script + run: | + source ./build/linux/ci-common.sh && bash test/renderdiff/test.sh + - uses: actions/upload-artifact@v4 + with: + name: presubmit-renderdiff-result + path: ./out/renderdiff_tests diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 92b70224bac..bb9d0394e60 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,7 +31,7 @@ jobs: strategy: matrix: - os: [macos-latest, ubuntu-18.04] + os: [macos-14-xlarge, ubuntu-22.04-32core] steps: - name: Decide Git ref @@ -41,7 +41,7 @@ jobs: TAG=${REF##*/} echo "ref=${REF}" >> $GITHUB_OUTPUT echo "tag=${TAG}" >> $GITHUB_OUTPUT - - uses: actions/checkout@v3.3.0 + - uses: actions/checkout@v4.1.6 with: ref: ${{ steps.git_ref.outputs.ref }} - name: Run build script @@ -65,7 +65,7 @@ jobs: build-web: name: build-web - runs-on: macos-latest + runs-on: ubuntu-22.04-16core if: github.event_name == 'release' || github.event.inputs.platform == 'web' steps: @@ -76,7 +76,7 @@ jobs: TAG=${REF##*/} echo "ref=${REF}" >> $GITHUB_OUTPUT echo "tag=${TAG}" >> $GITHUB_OUTPUT - - uses: actions/checkout@v3.3.0 + - uses: actions/checkout@v4.1.6 with: ref: ${{ steps.git_ref.outputs.ref }} - name: Run build script @@ -98,7 +98,7 @@ jobs: build-android: name: build-android - runs-on: macos-latest + runs-on: ubuntu-22.04-16core if: github.event_name == 'release' || github.event.inputs.platform == 'android' steps: @@ -109,24 +109,27 @@ jobs: TAG=${REF##*/} echo "ref=${REF}" >> $GITHUB_OUTPUT echo "tag=${TAG}" >> $GITHUB_OUTPUT - - uses: actions/checkout@v3.3.0 + - uses: actions/checkout@v4.1.6 with: ref: ${{ steps.git_ref.outputs.ref }} + - uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '17' - name: Run build script env: TAG: ${{ steps.git_ref.outputs.tag }} run: | - cd build/android && printf "y" | ./build.sh release + cd build/android && printf "y" | ./build.sh release armeabi-v7a,arm64-v8a,x86,x86_64 cd ../.. mv out/filament-android-release.aar out/filament-${TAG}-android.aar mv out/filamat-android-release.aar out/filamat-${TAG}-android.aar - mv out/filamat-android-lite-release.aar out/filamat-${TAG}-lite-android.aar mv out/gltfio-android-release.aar out/gltfio-${TAG}-android.aar mv out/filament-utils-android-release.aar out/filament-utils-${TAG}-android.aar - name: Sign sample-gltf-viewer run: | echo "${APK_KEYSTORE_BASE64}" > filament.jks.base64 - base64 --decode filament.jks.base64 > filament.jks + base64 --decode -i filament.jks.base64 > filament.jks BUILD_TOOLS_VERSION=$(ls ${ANDROID_HOME}/build-tools | sort -V | tail -n 1) APKSIGNER=${ANDROID_HOME}/build-tools/${BUILD_TOOLS_VERSION}/apksigner IN_FILE="out/sample-gltf-viewer-release.apk" @@ -149,7 +152,7 @@ jobs: build-ios: name: build-ios - runs-on: macos-latest + runs-on: macos-14-xlarge if: github.event_name == 'release' || github.event.inputs.platform == 'ios' steps: @@ -160,7 +163,7 @@ jobs: TAG=${REF##*/} echo "ref=${REF}" >> $GITHUB_OUTPUT echo "tag=${TAG}" >> $GITHUB_OUTPUT - - uses: actions/checkout@v3.3.0 + - uses: actions/checkout@v4.1.6 with: ref: ${{ steps.git_ref.outputs.ref }} - name: Run build script @@ -182,7 +185,7 @@ jobs: build-windows: name: build-windows - runs-on: windows-2019 + runs-on: windows-2019-32core if: github.event_name == 'release' || github.event.inputs.platform == 'windows' steps: @@ -194,7 +197,7 @@ jobs: echo "ref=${REF}" >> $GITHUB_OUTPUT echo "tag=${TAG}" >> $GITHUB_OUTPUT shell: bash - - uses: actions/checkout@v3.3.0 + - uses: actions/checkout@v4.1.6 with: ref: ${{ steps.git_ref.outputs.ref }} - name: Run build script @@ -202,7 +205,7 @@ jobs: TAG: ${{ steps.git_ref.outputs.tag }} run: | build\windows\build-github.bat release - cd ..\.. + echo on move out\filament-windows.tgz out\filament-%TAG%-windows.tgz shell: cmd - uses: actions/github-script@v6 diff --git a/.github/workflows/verify-release-notes.yml b/.github/workflows/verify-release-notes.yml index f4901364489..d7021cc5394 100644 --- a/.github/workflows/verify-release-notes.yml +++ b/.github/workflows/verify-release-notes.yml @@ -24,3 +24,4 @@ jobs: with: repo-token: ${{ secrets.GITHUB_TOKEN }} pull-request-number: ${{ github.event.pull_request.number }} + release-notes-file: 'NEW_RELEASE_NOTES.md' diff --git a/.github/workflows/web-continuous.yml b/.github/workflows/web-continuous.yml index ceabe618b24..b471aa9361b 100644 --- a/.github/workflows/web-continuous.yml +++ b/.github/workflows/web-continuous.yml @@ -10,14 +10,14 @@ on: jobs: build-web: name: build-web - runs-on: macos-latest + runs-on: ubuntu-22.04-16core steps: - - uses: actions/checkout@v3.3.0 + - uses: actions/checkout@v4.1.6 - name: Run build script run: | cd build/web && printf "y" | ./build.sh continuous - - uses: actions/upload-artifact@v1.0.0 + - uses: actions/upload-artifact@v4 with: name: filament-web path: out/filament-release-web.tgz diff --git a/.github/workflows/windows-continuous.yml b/.github/workflows/windows-continuous.yml index c2b115e577c..316fd3bc985 100644 --- a/.github/workflows/windows-continuous.yml +++ b/.github/workflows/windows-continuous.yml @@ -10,15 +10,15 @@ on: jobs: build-windows: name: build-windows - runs-on: windows-2019 + runs-on: windows-2019-32core steps: - - uses: actions/checkout@v3.3.0 + - uses: actions/checkout@v4.1.6 - name: Run build script run: | build\windows\build-github.bat continuous shell: cmd - - uses: actions/upload-artifact@v1.0.0 + - uses: actions/upload-artifact@v4 with: name: filament-windows path: out/filament-windows.tgz diff --git a/.gitignore b/.gitignore index 196b33a061f..8a48127ca4c 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,5 @@ settings.json test*.png test*.json results +/compile_commands.json +/.cache diff --git a/BUILDING.md b/BUILDING.md index a6054b074d2..167e1736ed6 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -5,7 +5,7 @@ To build Filament, you must first install the following tools: - CMake 3.19 (or more recent) -- clang 7.0 (or more recent) +- clang 14.0 (or more recent) - [ninja 1.10](https://github.com/ninja-build/ninja/wiki/Pre-built-Ninja-packages) (or more recent) Additional dependencies may be required for your operating system. Please refer to the appropriate @@ -13,9 +13,10 @@ section below. To build Filament for Android you must also install the following: -- Android Studio Arctic Fox or more recent +- Android Studio Flamingo or more recent - Android SDK - Android NDK 25.1 or higher +- Java 17 ### Environment variables @@ -39,25 +40,27 @@ inside the Filament source tree. To trigger an incremental debug build: -``` -$ ./build.sh debug +```shell +./build.sh debug ``` To trigger an incremental release build: -``` -$ ./build.sh release +```shell +./build.sh release ``` To trigger both incremental debug and release builds: -``` -$ ./build.sh debug release +```shell +./build.sh debug release ``` +If build fails for some reasons, it may leave the `out/` directory in a broken state. You can +force a clean build by adding the `-c` flag in that case. + To install the libraries and executables in `out/debug/` and `out/release/`, add the `-i` flag. -You can force a clean build by adding the `-c` flag. The script offers more features described -by executing `build.sh -h`. +The script offers more features described by executing `build.sh -h`. ### Filament-specific CMake Options @@ -70,14 +73,13 @@ The following CMake options are boolean options specific to Filament: - `FILAMENT_SUPPORTS_VULKAN`: Include the Vulkan backend - `FILAMENT_INSTALL_BACKEND_TEST`: Install the backend test library so it can be consumed on iOS - `FILAMENT_USE_EXTERNAL_GLES3`: Experimental: Compile Filament against OpenGL ES 3 -- `FILAMENT_USE_SWIFTSHADER`: Compile Filament against SwiftShader - `FILAMENT_SKIP_SAMPLES`: Don't build sample apps To turn an option on or off: -``` -$ cd -$ cmake . -DOPTION=ON # Relace OPTION with the option name, set to ON / OFF +```shell +cd +cmake . -DOPTION=ON # Replace OPTION with the option name, set to ON / OFF ``` Options can also be set with the CMake GUI. @@ -86,10 +88,10 @@ Options can also be set with the CMake GUI. Make sure you've installed the following dependencies: -- `clang-7` or higher +- `clang-14` or higher - `libglu1-mesa-dev` -- `libc++-7-dev` (`libcxx-devel` and `libcxx-static` on Fedora) or higher -- `libc++abi-7-dev` (`libcxxabi-static` on Fedora) or higher +- `libc++-14-dev` (`libcxx-devel` and `libcxx-static` on Fedora) or higher +- `libc++abi-14-dev` (`libcxxabi-static` on Fedora) or higher - `ninja-build` - `libxi-dev` - `libxcomposite-dev` (`libXcomposite-devel` on Fedora) @@ -101,38 +103,38 @@ script. If you'd like to run `cmake` directly rather than using the build script, it can be invoked as follows, with some caveats that are explained further down. -``` -$ mkdir out/cmake-release -$ cd out/cmake-release -$ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../release/filament ../.. +```shell +mkdir out/cmake-release +cd out/cmake-release +cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../release/filament ../.. ``` Your Linux distribution might default to `gcc` instead of `clang`, if that's the case invoke `cmake` with the following command: -``` -$ mkdir out/cmake-release -$ cd out/cmake-release -# Or use a specific version of clang, for instance /usr/bin/clang-7 -$ CC=/usr/bin/clang CXX=/usr/bin/clang++ CXXFLAGS=-stdlib=libc++ \ - cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../release/filament ../.. +```shell +mkdir out/cmake-release +cd out/cmake-release +# Or use a specific version of clang, for instance /usr/bin/clang-14 +CC=/usr/bin/clang CXX=/usr/bin/clang++ CXXFLAGS=-stdlib=libc++ \ + cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../release/filament ../.. ``` You can also export the `CC` and `CXX` environment variables to always point to `clang`. Another solution is to use `update-alternatives` to both change the default compiler, and point to a specific version of clang: -``` -$ update-alternatives --install /usr/bin/clang clang /usr/bin/clang-7 100 -$ update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-7 100 -$ update-alternatives --install /usr/bin/cc cc /usr/bin/clang 100 -$ update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++ 100 +```shell +update-alternatives --install /usr/bin/clang clang /usr/bin/clang-14 100 +update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-14 100 +update-alternatives --install /usr/bin/cc cc /usr/bin/clang 100 +update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++ 100 ``` Finally, invoke `ninja`: -``` -$ ninja +```shell +ninja ``` This will build Filament, its tests and samples, and various host tools. @@ -142,8 +144,8 @@ This will build Filament, its tests and samples, and various host tools. To compile Filament you must have the most recent version of Xcode installed and you need to make sure the command line tools are setup by running: -``` -$ xcode-select --install +```shell +xcode-select --install ``` If you wish to run the Vulkan backend instead of the default Metal backend, you must install @@ -151,11 +153,11 @@ the LunarG SDK, enable "System Global Components", and reboot your machine. Then run `cmake` and `ninja` to trigger a build: -``` -$ mkdir out/cmake-release -$ cd out/cmake-release -$ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../release/filament ../.. -$ ninja +```shell +mkdir out/cmake-release +cd out/cmake-release +cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../release/filament ../.. +ninja ``` ### iOS @@ -163,24 +165,24 @@ $ ninja The easiest way to build Filament for iOS is to use `build.sh` and the `-p ios` flag. For instance to build the debug target: -``` -$ ./build.sh -p ios debug +```shell +./build.sh -p ios debug ``` See [ios/samples/README.md](./ios/samples/README.md) for more information. ### Windows -#### Building on Windows with Visual Studio 2019 +#### Building on Windows with Visual Studio 2019 or later Install the following components: -- [Visual Studio 2019](https://www.visualstudio.com/downloads) -- [Windows 10 SDK](https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk) +- [Visual Studio 2019 or later](https://www.visualstudio.com/downloads) +- [Windows SDK](https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/) - [Python 3.7](https://www.python.org/ftp/python/3.7.0/python-3.7.0.exe) - [CMake 3.14 or later](https://github.com/Kitware/CMake/releases/download/v3.14.7/cmake-3.14.7-win64-x64.msi) -The latest Windows SDK can also by installed by opening Visual Studio and selecting _Get Tools and +The latest Windows SDK can also be installed by opening Visual Studio and selecting _Get Tools and Features..._ under the _Tools_ menu. By default, Windows treats the file system as case insensitive. Please do not enable case @@ -190,10 +192,10 @@ using `fsutil.exe file queryCaseSensitiveInfo`. Next, open `x64 Native Tools Command Prompt for VS 2019`, create a working directory, and run CMake in it: -``` -> mkdir out -> cd out -> cmake .. +```bat +mkdir out +cd out +cmake .. ``` Open the generated solution file `TNT.sln` in Visual Studio. @@ -203,15 +205,15 @@ target in the _Solution Explorer_ and choose _Build_ to build a specific target. For example, build the `material_sandbox` sample and run it from the `out` directory with: -``` -> samples\Debug\material_sandbox.exe ..\assets\models\monkey\monkey.obj +```bat +samples\Debug\material_sandbox.exe ..\assets\models\monkey\monkey.obj ``` You can also use CMake to invoke the build without opening Visual Studio. For example, from the `out` folder run the following command. -``` -> cmake --build . --target gltf_viewer --config Release +```bat +cmake --build . --target gltf_viewer --config Release ``` ### Android @@ -236,8 +238,8 @@ To build Android on Windows machines, see [android/Windows.md](android/Windows.m The easiest way to build Filament for Android is to use `build.sh` and the `-p android` flag. For instance to build the release target: -``` -$ ./build.sh -p android release +```shell +./build.sh -p android release ``` Run `build.sh -h` for more information. @@ -247,23 +249,23 @@ Run `build.sh -h` for more information. Invoke CMake in a build directory of your choice, inside of filament's directory. The commands below show how to build Filament for ARM 64-bit (`aarch64`). -``` -$ mkdir out/android-build-release-aarch64 -$ cd out/android-build-release-aarch64 -$ cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=../../build/toolchain-aarch64-linux-android.cmake \ - -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../android-release/filament ../.. +```shell +mkdir out/android-build-release-aarch64 +cd out/android-build-release-aarch64 +cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=../../build/toolchain-aarch64-linux-android.cmake \ + -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../android-release/filament ../.. ``` And then invoke `ninja`: -``` -$ ninja install +```shell +ninja install ``` or -``` -$ ninja install/strip +```shell +ninja install/strip ``` This will generate Filament's Android binaries in `out/android-release`. This location is important @@ -295,8 +297,8 @@ AAR. Alternatively you can build the AAR from the command line by executing the following in the `android/` directory: -``` -$ ./gradlew -Pcom.google.android.filament.dist-dir=../../out/android-release/filament assembleRelease +```shell +./gradlew -Pcom.google.android.filament.dist-dir=../../out/android-release/filament assembleRelease ``` The `-Pcom.google.android.filament.dist-dir` can be used to specify a different installation @@ -310,7 +312,7 @@ sure to add the newly created module as a dependency to your application. If you do not wish to include all supported ABIs, make sure to create the appropriate flavors in your Gradle build file. For example: -``` +```gradle flavorDimensions 'cpuArch' productFlavors { arm8 { @@ -352,9 +354,9 @@ started, follow the instructions for building Filament on your platform ([macOS] Next, you need to install the Emscripten SDK. The following instructions show how to install the same version that our continuous builds use. -``` +```shell cd -curl -L https://github.com/emscripten-core/emsdk/archive/refs/tags/3.1.15.zip > emsdk.zip +curl -L https://github.com/emscripten-core/emsdk/archive/refs/tags/3.1.60.zip > emsdk.zip unzip emsdk.zip ; mv emsdk-* emsdk ; cd emsdk python ./emsdk.py install latest python ./emsdk.py activate latest @@ -363,7 +365,7 @@ source ./emsdk_env.sh After this you can invoke the [easy build](#easy-build) script as follows: -``` +```shell export EMSDK= ./build.sh -p webgl release ``` @@ -373,7 +375,7 @@ creates a `samples` folder that can be used as the root of a simple static web s cannot open the HTML directly from the filesystem due to CORS. We recommend using the emrun tool to create a quick localhost server: -``` +```shell emrun out/cmake-webgl-release/web/samples --no_browser --port 8000 ``` @@ -394,7 +396,7 @@ Some of the samples accept FBX/OBJ meshes while others rely on the `filamesh` fi generate a `filamesh ` file from an FBX/OBJ asset, run the `filamesh` tool (`./tools/filamesh/filamesh` in your build directory): -``` +```shell filamesh ./assets/models/monkey/monkey.obj monkey.filamesh ``` @@ -404,7 +406,7 @@ files for the IBL (which are PNGs containing `R11F_G11F_B10F` data) or a path to containing two `.ktx` files (one for the IBL itself, one for the skybox). To generate an IBL simply use this command: -``` +```shell cmgen -f ktx -x ./ibls/ my_ibl.exr ``` @@ -423,42 +425,72 @@ value is the desired roughness between 0 and 1. ## Generating C++ documentation -To generate the documentation you must first install `doxygen` and `graphviz`, then run the +To generate the documentation you must first install `doxygen` and `graphviz`, then run the following commands: -``` -$ cd filament/filament -$ doxygen docs/doxygen/filament.doxygen +```shell +cd filament/filament +doxygen docs/doxygen/filament.doxygen ``` Finally simply open `docs/html/index.html` in your web browser. -## SwiftShader +## Software Rasterization -To try out Filament's Vulkan support with SwiftShader, first build SwiftShader and set the -`SWIFTSHADER_LD_LIBRARY_PATH` variable to the folder that contains `libvk_swiftshader.dylib`: +We have tested swiftshader and Mesa for software rasterization on the Vulkan/GL backends. -``` +To use this for Vulkan, please first make sure that the [Vulkan SDK](https://www.lunarg.com/vulkan-sdk/) is +installed on your machine. If you are doing a manual installation of the SDK on Linux, you will have +to source `setup-env.sh` in the SDK's root folder to make sure the Vulkan loader is the first lib loaded. + +### Swiftshader (Vulkan) [tested on macOS and Linux] + +First, build SwiftShader + +```shell git clone https://github.com/google/swiftshader.git cd swiftshader/build cmake .. && make -j -export SWIFTSHADER_LD_LIBRARY_PATH=`pwd` ``` -Next, go to your Filament repo and use the [easy build](#easy-build) script with `-t`. +and then set `VK_ICD_FILENAMES` to the ICD json produced in the build. For example, +```shell +export VK_ICD_FILENAMES=/Users/user/swiftshader/build/Darwin/vk_swiftshader_icd.json +``` -## SwiftShader for CI +Build and run Filament as usual and specify the Vulkan backend when creating the Engine. -Continuous testing turnaround can be quite slow if you need to build SwiftShader from scratch, so we -provide an Ubuntu-based Docker image that has it already built. The Docker image also includes -everything necessary for building Filament. You can fetch and run the image as follows: +### Mesa's LLVMPipe (GL) and Lavapipe (Vulkan) [tested on Linux] +We will only cover steps that build Mesa from source. The official documentation of Mesa mentioned +that in general precompiled libraries [are **not** made available](https://docs.mesa3d.org/precompiled.html). + +Download the repo and make sure you have the build depedencies. For example (assuming an Ubuntu/Debian distro), +```shell +git clone https://gitlab.freedesktop.org/mesa/mesa.git +sudo apt-get build-dep mesa ``` -docker pull ghcr.io/filament-assets/swiftshader -docker run -it ghcr.io/filament-assets/swiftshader + +To build both the GL and Vulkan rasterizers, + +```shell +cd mesa +mkdir -p out +meson setup builddir/ -Dprefix=$(pwd)/out -Dglx=xlib -Dgallium-drivers=swrast -Dvulkan-drivers=swrast +meson install -C builddir/ +``` + +For GL, we need to ensure that we load the GL lib from the mesa output directory. For example, to run +the debug `gltf_viewer`, we would execute +```shell +LD_LIBRARY_PATH=/Users/user/mesa/out/lib/x86_64-linux-gnu \ + ./out/cmake-debug/samples/gltf_viewer -a opengl ``` -To do more with the container, see the helper script at `build/swiftshader/test.sh`. +For Vulkan, we need to set the path to the ICD json, which tells the loader where to find the driver +library. To run `gltf_viewer`, we would execute +```shell +VK_ICD_FILENAMES=/Users/user/mesa/out/share/vulkan/icd.d/lvp_icd.x86_64.json \ + ./out/cmake-debug/samples/gltf_viewer -a vulkan -If you are a team member, you can update the public image to the latest SwiftShader by -following the instructions at the top of `build/swiftshader/Dockerfile`. +``` diff --git a/CMakeLists.txt b/CMakeLists.txt index 28f801ec95b..f9de5b2a5e4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,14 @@ # ================================================================================================== cmake_minimum_required(VERSION 3.19) +# ================================================================================================== +# Toolchain configuration +# ================================================================================================== +if (APPLE AND NOT IOS) + # This must be set before project() is called + set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15 CACHE STRING "") +endif() + # ================================================================================================== # Project declaration # ================================================================================================== @@ -13,8 +21,6 @@ project(TNT) # ================================================================================================== option(FILAMENT_USE_EXTERNAL_GLES3 "Experimental: Compile Filament against OpenGL ES 3" OFF) -option(FILAMENT_USE_SWIFTSHADER "Compile Filament against SwiftShader" OFF) - option(FILAMENT_ENABLE_LTO "Enable link-time optimizations if supported by the compiler" OFF) option(FILAMENT_SKIP_SAMPLES "Don't build samples" OFF) @@ -31,6 +37,16 @@ option(FILAMENT_SKIP_SDL2 "Skip dependencies of SDL2, and SDL2" OFF) option(FILAMENT_LINUX_IS_MOBILE "Treat Linux as Mobile" OFF) +option(FILAMENT_ENABLE_ASAN_UBSAN "Enable Address and Undefined Behavior Sanitizers" OFF) + +option(FILAMENT_ENABLE_TSAN "Enable Thread Sanitizer" OFF) + +option(FILAMENT_ENABLE_FEATURE_LEVEL_0 "Enable Feature Level 0" ON) + +option(FILAMENT_ENABLE_MULTIVIEW "Enable multiview for Filament" OFF) + +option(FILAMENT_SUPPORTS_OSMESA "Enable OSMesa (headless GL context) for Filament" OFF) + set(FILAMENT_NDK_VERSION "" CACHE STRING "Android NDK version or version prefix to be used when building for Android." ) @@ -55,6 +71,17 @@ set(FILAMENT_METAL_HANDLE_ARENA_SIZE_IN_MB "8" CACHE STRING "Size of the Metal handle arena, default 8." ) +set(FILAMENT_BACKEND_DEBUG_FLAG "" CACHE STRING + "A debug flag meant for enabling/disabling backend debugging paths" +) + +set(FILAMENT_OSMESA_PATH "" CACHE STRING + "Path to the OSMesa header and lib" +) + +# Enable exceptions by default in spirv-cross. +set(SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS OFF) + # ================================================================================================== # CMake policies # ================================================================================================== @@ -67,25 +94,30 @@ endif() # ================================================================================================== find_program(CCACHE_PROGRAM ccache) if (CCACHE_PROGRAM) - set(C_LAUNCHER "${CCACHE_PROGRAM}") - set(CXX_LAUNCHER "${CCACHE_PROGRAM}") + if (WIN32) + set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") + set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") + else() + set(C_LAUNCHER "${CCACHE_PROGRAM}") + set(CXX_LAUNCHER "${CCACHE_PROGRAM}") - configure_file(build/launch-c.in launch-c) - configure_file(build/launch-cxx.in launch-cxx) + configure_file(build/launch-c.in launch-c) + configure_file(build/launch-cxx.in launch-cxx) - execute_process(COMMAND chmod a+rx - "${CMAKE_CURRENT_BINARY_DIR}/launch-c" - "${CMAKE_CURRENT_BINARY_DIR}/launch-cxx" - ) + execute_process(COMMAND chmod a+rx + "${CMAKE_CURRENT_BINARY_DIR}/launch-c" + "${CMAKE_CURRENT_BINARY_DIR}/launch-cxx" + ) - if (CMAKE_GENERATOR STREQUAL "Xcode") - set(CMAKE_XCODE_ATTRIBUTE_CC "${CMAKE_CURRENT_BINARY_DIR}/launch-c") - set(CMAKE_XCODE_ATTRIBUTE_CXX "${CMAKE_CURRENT_BINARY_DIR}/launch-cxx") - set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_CURRENT_BINARY_DIR}/launch-c") - set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_CURRENT_BINARY_DIR}/launch-cxx") - else() - set(CMAKE_C_COMPILER_LAUNCHER "${CMAKE_CURRENT_BINARY_DIR}/launch-c") - set(CMAKE_CXX_COMPILER_LAUNCHER "${CMAKE_CURRENT_BINARY_DIR}/launch-cxx") + if (CMAKE_GENERATOR STREQUAL "Xcode") + set(CMAKE_XCODE_ATTRIBUTE_CC "${CMAKE_CURRENT_BINARY_DIR}/launch-c") + set(CMAKE_XCODE_ATTRIBUTE_CXX "${CMAKE_CURRENT_BINARY_DIR}/launch-cxx") + set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_CURRENT_BINARY_DIR}/launch-c") + set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_CURRENT_BINARY_DIR}/launch-cxx") + else() + set(CMAKE_C_COMPILER_LAUNCHER "${CMAKE_CURRENT_BINARY_DIR}/launch-c") + set(CMAKE_CXX_COMPILER_LAUNCHER "${CMAKE_CURRENT_BINARY_DIR}/launch-cxx") + endif() endif() endif() @@ -106,12 +138,22 @@ else() endif() if (LINUX) + if (NOT FILAMENT_OSMESA_PATH STREQUAL "") + if (NOT EXISTS ${FILAMENT_OSMESA_PATH}/) + message(FATAL_ERROR "Cannot find specified OSMesa build directory: ${FILAMENT_OSMESA_PATH}") + endif() + set(FILAMENT_SUPPORTS_OSMESA TRUE) + endif() + if (FILAMENT_SUPPORTS_WAYLAND) add_definitions(-DFILAMENT_SUPPORTS_WAYLAND) set(FILAMENT_SUPPORTS_X11 FALSE) elseif (FILAMENT_SUPPORTS_EGL_ON_LINUX) add_definitions(-DFILAMENT_SUPPORTS_EGL_ON_LINUX) set(FILAMENT_SUPPORTS_X11 FALSE) + elseif (FILAMENT_SUPPORTS_OSMESA) + set(FILAMENT_SUPPORTS_X11 FALSE) + add_definitions(-DFILAMENT_SUPPORTS_OSMESA) else () if (FILAMENT_SUPPORTS_XCB) add_definitions(-DFILAMENT_SUPPORTS_XCB) @@ -121,7 +163,7 @@ if (LINUX) add_definitions(-DFILAMENT_SUPPORTS_XLIB) endif() - if (FILAMENT_SUPPORTS_XCB OR FILAMENT_SUPORTS_XLIB) + if (FILAMENT_SUPPORTS_XCB OR FILAMENT_SUPPORTS_XLIB) add_definitions(-DFILAMENT_SUPPORTS_X11) set(FILAMENT_SUPPORTS_X11 TRUE) endif() @@ -140,15 +182,6 @@ if (NOT ANDROID AND NOT WEBGL AND NOT IOS AND NOT FILAMENT_LINUX_IS_MOBILE) set(IS_HOST_PLATFORM TRUE) endif() -if (IOS) - # Remove the headerpad_max_install_names linker flag on iOS. It causes warnings when linking - # executables with bitcode. - string(REPLACE "-Wl,-headerpad_max_install_names" "" CMAKE_C_LINK_FLAGS ${CMAKE_C_LINK_FLAGS}) - string(REPLACE "-Wl,-headerpad_max_install_names" "" CMAKE_CXX_LINK_FLAGS ${CMAKE_CXX_LINK_FLAGS}) - string(REPLACE "-Wl,-headerpad_max_install_names" "" CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS ${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS}) - string(REPLACE "-Wl,-headerpad_max_install_names" "" CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS ${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS}) -endif() - if (WIN32) # Link statically against c/c++ lib to avoid missing redistriburable such as # "VCRUNTIME140.dll not found. Try reinstalling the app.", but give users @@ -205,6 +238,21 @@ if (WIN32) # we don't need them on CI. string(REPLACE "/INCREMENTAL" "/INCREMENTAL:NO" ${LinkerFlag} ${${LinkerFlag}}) endforeach() + + # We turn off compile-time optimizations for CI, as options that speed up the compile-time + # (e.g. /MP) might increase memory usage, leading to instabilities on limited CI machines. + option(FILAMENT_SHORTEN_MSVC_COMPILATION "Shorten compile-time in Visual Studio" OFF) + else() + option(FILAMENT_SHORTEN_MSVC_COMPILATION "Shorten compile-time in Visual Studio" ON) + endif() + + if (MSVC) + if (FILAMENT_SHORTEN_MSVC_COMPILATION) + # enable multi-processor compilation + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") + # disable run-time STL checks to improve tools (e.g. matc) performance + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /D_ITERATOR_DEBUG_LEVEL=0") + endif() endif() endif() @@ -288,10 +336,6 @@ if (FILAMENT_SUPPORTS_EGL_ON_LINUX) set(EGL TRUE) endif() -if (FILAMENT_USE_SWIFTSHADER) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DFILAMENT_USE_SWIFTSHADER") -endif() - if (WIN32) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_USE_MATH_DEFINES=1") endif() @@ -317,6 +361,7 @@ endif() if (CYGWIN) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -fno-rtti") + set(SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS ON) endif() if (MSVC) @@ -344,8 +389,9 @@ endif() if (NOT MSVC AND NOT IOS) # Omitting stack frame pointers prevents the generation of readable stack traces in crash reports on iOS set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fomit-frame-pointer") +endif() - # These aren't compatible with -fembed-bitcode (and seem to have no effect on Apple platforms anyway) +if (NOT MSVC) set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -ffunction-sections -fdata-sections") endif() @@ -353,6 +399,7 @@ endif() # saved by -fno-exception and 10 KiB saved by -fno-rtti). if (ANDROID OR IOS OR WEBGL) set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-exceptions -fno-rtti") + set(SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS ON) if (ANDROID OR WEBGL) # Omitting unwind info prevents the generation of readable stack traces in crash reports on iOS @@ -360,6 +407,13 @@ if (ANDROID OR IOS OR WEBGL) endif() endif() +# Turn off exceptions on iOS debug as well. This fixes an availability error we see when using +# std::visit, which is not supported on iOS 11.0 when exceptions are enabled. +if (IOS) + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-exceptions") + set(SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS ON) +endif() + # With WebGL, we disable RTTI even for debug builds because we pass emscripten::val back and forth # between C++ and JavaScript in order to efficiently access typed arrays, which are unbound. # NOTE: This is not documented in emscripten so we should consider a different approach. @@ -374,10 +428,16 @@ endif() # ================================================================================================== # Debug compiler flags # ================================================================================================== -# ASAN is deactivated for now because: -# -fsanitize=undefined causes extremely long link times -# -fsanitize=address causes a crash with assimp, which we can't explain for now -#set(EXTRA_SANITIZE_OPTIONS "-fsanitize=undefined -fsanitize=address") +if (FILAMENT_ENABLE_ASAN_UBSAN) + set(EXTRA_SANITIZE_OPTIONS "-fsanitize=address -fsanitize=undefined") +endif() +if (FILAMENT_ENABLE_TSAN) + set(EXTRA_SANITIZE_OPTIONS "-fsanitize=thread") +endif() +if (ANDROID) + # keep STL debug infos (mimics what the NDK does) + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-limit-debug-info") +endif() if (NOT MSVC AND NOT WEBGL) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fstack-protector") endif() @@ -396,8 +456,22 @@ endif() if (NOT WEBGL) set(GC_SECTIONS "-Wl,--gc-sections") endif() + +# Prevents stacks from being made for executable by explicitly adding this linker flag. Otherwise, +# it generates warnings newly introduced as of GNU LD 2.39. Modern security practices strongly +# recommend marking the stack as non-executable using the -z noexecstack linker flag to prevent +# stack-based buffer overflow exploits. +# See: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ffcf9c5700e49c0aee42dcba9a12ba21338e8136 +if (LINUX) + set(NO_EXEC_STACK "-Wl,-z,noexecstack") +endif() + set(B_SYMBOLIC_FUNCTIONS "-Wl,-Bsymbolic-functions") +if (ANDROID) + set(BINARY_ALIGNMENT "-Wl,-z,max-page-size=16384") +endif() + if (APPLE) set(GC_SECTIONS "-Wl,-dead_strip") set(B_SYMBOLIC_FUNCTIONS "") @@ -410,8 +484,8 @@ if (APPLE) set(CMAKE_CXX_ARCHIVE_CREATE " qc -S ") endif() -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GC_SECTIONS}") -set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${GC_SECTIONS} ${B_SYMBOLIC_FUNCTIONS}") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GC_SECTIONS} ${NO_EXEC_STACK}") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${GC_SECTIONS} ${B_SYMBOLIC_FUNCTIONS} ${BINARY_ALIGNMENT}") if (WEBGL_PTHREADS) set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pthread") @@ -460,11 +534,14 @@ else() option(FILAMENT_BUILD_FILAMAT "Build filamat and JNI buildings" OFF) endif() -# By default, link in matdbg for Desktop + Debug only since it pulls in filamat and a web server. +# By default, link in matdbg/fgviewer for Desktop + Debug only since it pulls in filamat and a web server. if (CMAKE_BUILD_TYPE STREQUAL "Debug" AND IS_HOST_PLATFORM) option(FILAMENT_ENABLE_MATDBG "Enable the material debugger" ON) + # TODO: Uncomment below when fgviewer is ready + # option(FILAMENT_ENABLE_FGVIEWER "Enable the frame graph viewer" ON) else() option(FILAMENT_ENABLE_MATDBG "Enable the material debugger" OFF) + option(FILAMENT_ENABLE_FGVIEWER "Enable the frame graph viewer" OFF) endif() # Only optimize materials in Release mode (so error message lines match the source code) @@ -474,6 +551,29 @@ else() option(FILAMENT_DISABLE_MATOPT "Disable material optimizations" ON) endif() +# This only affects the prebuilt shader files in gltfio and samples, not filament library. +# The value can be either "instanced", "multiview", or "none" +set(FILAMENT_SAMPLES_STEREO_TYPE "none" CACHE STRING + "Stereoscopic type that shader files in gltfio and samples are built for." +) +string(TOLOWER "${FILAMENT_SAMPLES_STEREO_TYPE}" FILAMENT_SAMPLES_STEREO_TYPE) +if (NOT FILAMENT_SAMPLES_STEREO_TYPE STREQUAL "instanced" + AND NOT FILAMENT_SAMPLES_STEREO_TYPE STREQUAL "multiview" + AND NOT FILAMENT_SAMPLES_STEREO_TYPE STREQUAL "none") + message(FATAL_ERROR "Invalid stereo type: \"${FILAMENT_SAMPLES_STEREO_TYPE}\" choose either \"instanced\", \"multiview\", or \"none\" ") +endif () + +# Compiling samples for multiview implies enabling multiview feature as well. +if (FILAMENT_SAMPLES_STEREO_TYPE STREQUAL "multiview") + set(FILAMENT_ENABLE_MULTIVIEW ON) +endif () + +# Define backend flag for debug only +if (CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT FILAMENT_BACKEND_DEBUG_FLAG STREQUAL "") + add_definitions(-DFILAMENT_BACKEND_DEBUG_FLAG=${FILAMENT_BACKEND_DEBUG_FLAG}) + unset(FILAMENT_BACKEND_DEBUG_FLAG) +endif() + # ================================================================================================== # Material compilation flags # ================================================================================================== @@ -497,9 +597,19 @@ if (FILAMENT_SUPPORTS_METAL) set(MATC_API_FLAGS ${MATC_API_FLAGS} -a metal) endif() -# Disable optimizations and enable debug info (preserves names in SPIR-V) +# Disable ESSL 1.0 code generation. +if (NOT FILAMENT_ENABLE_FEATURE_LEVEL_0) + set(MATC_API_FLAGS ${MATC_API_FLAGS} -1) +endif() + +# Enable debug info (preserves names in SPIR-V) +if (FILAMENT_ENABLE_MATDBG) + set(MATC_OPT_FLAGS ${MATC_OPT_FLAGS} -d) +endif() + +# Disable optimizations if (FILAMENT_DISABLE_MATOPT) - set(MATC_OPT_FLAGS -gd) + set(MATC_OPT_FLAGS ${MATC_OPT_FLAGS} -g) endif() set(MATC_BASE_FLAGS ${MATC_API_FLAGS} -p ${MATC_TARGET} ${MATC_OPT_FLAGS}) @@ -567,9 +677,9 @@ function(combine_static_libs TARGET OUTPUT DEPS) # Loop through the dependent libraries and query their location on disk. set(DEPS_FILES ) foreach(DEPENDENCY ${DEPS}) - if(TARGET ${DEPENDENCY}) + if (TARGET ${DEPENDENCY}) get_property(dep_type TARGET ${DEPENDENCY} PROPERTY TYPE) - if(dep_type STREQUAL "STATIC_LIBRARY") + if (dep_type STREQUAL "STATIC_LIBRARY") list(APPEND DEPS_FILES "$") endif() endif() @@ -592,21 +702,6 @@ else() set(IMPORT_EXECUTABLES ${FILAMENT}/${IMPORT_EXECUTABLES_DIR}/ImportExecutables-${CMAKE_BUILD_TYPE}.cmake) endif() -# ================================================================================================== -# Try to find Vulkan if the SDK is installed, otherwise fall back to the bundled version. -# This needs to stay in our top-level CMakeLists because it sets up variables that are used by the -# "bluevk" and "samples" targets. -# ================================================================================================== - -if (FILAMENT_USE_SWIFTSHADER) - if (NOT FILAMENT_SUPPORTS_VULKAN) - message(ERROR "SwiftShader is only useful when Vulkan is enabled.") - endif() - find_library(SWIFTSHADER_VK NAMES vk_swiftshader HINTS "$ENV{SWIFTSHADER_LD_LIBRARY_PATH}") - message(STATUS "Found SwiftShader VK library in: ${SWIFTSHADER_VK}.") - add_definitions(-DFILAMENT_VKLIBRARY_PATH=\"${SWIFTSHADER_VK}\") -endif() - # ================================================================================================== # Common Functions # ================================================================================================== @@ -639,7 +734,7 @@ function(get_resgen_vars ARCHIVE_DIR ARCHIVE_NAME) set(RESGEN_OUTPUTS "${OUTPUTS}" PARENT_SCOPE) set(RESGEN_FLAGS -qx ${ARCHIVE_DIR} -p ${ARCHIVE_NAME} PARENT_SCOPE) set(RESGEN_SOURCE "${ARCHIVE_DIR}/${ARCHIVE_NAME}${ASM_SUFFIX}.S" PARENT_SCOPE) - set(RESGEN_SOURCE_FLAGS "-I${ARCHIVE_DIR} ${ASM_ARCH_FLAG}" PARENT_SCOPE) + set(RESGEN_SOURCE_FLAGS "-I'${ARCHIVE_DIR}' ${ASM_ARCH_FLAG}" PARENT_SCOPE) endif() endfunction() @@ -654,7 +749,6 @@ add_subdirectory(${LIBRARIES}/filabridge) add_subdirectory(${LIBRARIES}/filaflat) add_subdirectory(${LIBRARIES}/filagui) add_subdirectory(${LIBRARIES}/filameshio) -add_subdirectory(${LIBRARIES}/geometry) add_subdirectory(${LIBRARIES}/gltfio) add_subdirectory(${LIBRARIES}/ibl) add_subdirectory(${LIBRARIES}/iblprefilter) @@ -669,18 +763,21 @@ add_subdirectory(${FILAMENT}/filament) add_subdirectory(${FILAMENT}/shaders) add_subdirectory(${EXTERNAL}/basisu/tnt) add_subdirectory(${EXTERNAL}/civetweb/tnt) -add_subdirectory(${EXTERNAL}/hat-trie/tnt) add_subdirectory(${EXTERNAL}/imgui/tnt) add_subdirectory(${EXTERNAL}/robin-map/tnt) add_subdirectory(${EXTERNAL}/smol-v/tnt) add_subdirectory(${EXTERNAL}/benchmark/tnt) add_subdirectory(${EXTERNAL}/meshoptimizer/tnt) +add_subdirectory(${EXTERNAL}/mikktspace) add_subdirectory(${EXTERNAL}/cgltf/tnt) add_subdirectory(${EXTERNAL}/draco/tnt) add_subdirectory(${EXTERNAL}/jsmn/tnt) add_subdirectory(${EXTERNAL}/stb/tnt) add_subdirectory(${EXTERNAL}/getopt) +# Note that this has to be placed after mikktspace in order for combine_static_libs to work. +add_subdirectory(${LIBRARIES}/geometry) + if (FILAMENT_BUILD_FILAMAT OR IS_HOST_PLATFORM) # spirv-tools must come before filamat, as filamat relies on the presence of the # spirv-tools_SOURCE_DIR variable. @@ -693,11 +790,18 @@ if (FILAMENT_BUILD_FILAMAT OR IS_HOST_PLATFORM) if (FILAMENT_ENABLE_MATDBG OR IS_HOST_PLATFORM) add_subdirectory(${LIBRARIES}/matdbg) endif() + + # TODO: Uncomment below when fgviewer is ready + # if (FILAMENT_ENABLE_FGVIEWER OR IS_HOST_PLATFORM) + # add_subdirectory(${LIBRARIES}/fgviewer) + # endif() endif() if (FILAMENT_SUPPORTS_VULKAN) add_subdirectory(${LIBRARIES}/bluevk) add_subdirectory(${EXTERNAL}/vkmemalloc/tnt) + set(SPIRV_HEADERS_SKIP_EXAMPLES ON) + add_subdirectory(${EXTERNAL}/spirv-headers) endif() set(FILAMENT_SAMPLES_BINARY_DIR ${PROJECT_BINARY_DIR}/samples) @@ -730,6 +834,9 @@ if (IS_HOST_PLATFORM) add_subdirectory(${TOOLS}/glslminifier) add_subdirectory(${TOOLS}/matc) add_subdirectory(${TOOLS}/matinfo) + if (NOT WIN32) # matedit not yet supported on Windows + add_subdirectory(${TOOLS}/matedit) + endif() add_subdirectory(${TOOLS}/mipgen) add_subdirectory(${TOOLS}/normal-blending) add_subdirectory(${TOOLS}/resgen) diff --git a/CODE_STYLE.md b/CODE_STYLE.md index 0a1e7857268..41233f2792a 100644 --- a/CODE_STYLE.md +++ b/CODE_STYLE.md @@ -121,9 +121,21 @@ private: - other headers are sorted in reverse order of their layering, that is, lower layer headers last - within a layer, headers are sorted alphabetically - strive for implementing one class per file -- `STL` limited in public headers to: - - `type_traits` +- `STL` limited in **filament** public headers to: + - `array` + - `initializer_list` + - `iterator` - `limits` + - `optional` + - `type_traits` + - `utility` + - `variant` + +For **libfilament** the rule of thumb is that STL headers that don't generate code are allowed (e.g. `type_traits`), +conversely containers and algorithms are not allowed. There are exceptions such as `array`. See above for the full list. +- The following `STL` headers are banned entirely, from public and private headers as well as implementation files: + - `iostream` + *Sorting the headers is important to help catching missing `#include` directives.* diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 955e451e093..571600da2fb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,7 +27,7 @@ again. ## Code Style -See [CodeStyle.md](/CODE_STYLE.md) +See [CODE_STYLE.md](/CODE_STYLE.md) ## Code reviews diff --git a/LICENSE b/LICENSE index d6456956733..73774b41caf 100644 --- a/LICENSE +++ b/LICENSE @@ -187,7 +187,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2023 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/NEW_RELEASE_NOTES.md b/NEW_RELEASE_NOTES.md new file mode 100644 index 00000000000..4a1a9c7fa7e --- /dev/null +++ b/NEW_RELEASE_NOTES.md @@ -0,0 +1,9 @@ +# Filament Release Notes log + +**If you are merging a PR into main**: please add the release note below, under the *Release notes +for next branch cut* header. + +**If you are cherry-picking a commit into an rc/ branch**: add the release note under the +appropriate header in [RELEASE_NOTES.md](./RELEASE_NOTES.md). + +## Release notes for next branch cut diff --git a/README.md b/README.md index 890dcb6e8cf..5cd0c006c51 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ repositories { } dependencies { - implementation 'com.google.android.filament:filament-android:1.31.1' + implementation 'com.google.android.filament:filament-android:1.56.6' } ``` @@ -40,8 +40,8 @@ Here are all the libraries available in the group `com.google.android.filament`: | Artifact | Description | | ------------- | ------------- | | [![filament-android](https://maven-badges.herokuapp.com/maven-central/com.google.android.filament/filament-android/badge.svg?subject=filament-android)](https://maven-badges.herokuapp.com/maven-central/com.google.android.filament/filament-android) | The Filament rendering engine itself. | +| [![filament-android-debug](https://maven-badges.herokuapp.com/maven-central/com.google.android.filament/filament-android-debug/badge.svg?subject=filament-android-debug)](https://maven-badges.herokuapp.com/maven-central/com.google.android.filament/filament-android-debug) | Debug version of `filament-android`. | | [![gltfio-android](https://maven-badges.herokuapp.com/maven-central/com.google.android.filament/gltfio-android/badge.svg?subject=gltfio-android)](https://maven-badges.herokuapp.com/maven-central/com.google.android.filament/gltfio-android) | A glTF 2.0 loader for Filament, depends on `filament-android`. | -| [![gltfio-android-lite](https://maven-badges.herokuapp.com/maven-central/com.google.android.filament/gltfio-android-lite/badge.svg?subject=gltfio-android-lite)](https://maven-badges.herokuapp.com/maven-central/com.google.android.filament/gltfio-android-lite) | Trimmed version of `gltfio` that does not support some glTF extensions. | | [![filament-utils-android](https://maven-badges.herokuapp.com/maven-central/com.google.android.filament/filament-utils-android/badge.svg?subject=filament-utils-android)](https://maven-badges.herokuapp.com/maven-central/com.google.android.filament/filament-utils-android) | KTX loading, Kotlin math, and camera utilities, depends on `gltfio-android`. | | [![filamat-android](https://maven-badges.herokuapp.com/maven-central/com.google.android.filament/filamat-android/badge.svg?subject=filamat-android)](https://maven-badges.herokuapp.com/maven-central/com.google.android.filament/filamat-android) | A runtime material builder/compiler. This library is large but contains a full shader compiler/validator/optimizer and supports both OpenGL and Vulkan. | | [![filamat-android-lite](https://maven-badges.herokuapp.com/maven-central/com.google.android.filament/filamat-android-lite/badge.svg?subject=filamat-android-lite)](https://maven-badges.herokuapp.com/maven-central/com.google.android.filament/filamat-android-lite) | A much smaller alternative to `filamat-android` that can only generate OpenGL shaders. It does not provide validation or optimizations. | @@ -50,19 +50,9 @@ Here are all the libraries available in the group `com.google.android.filament`: iOS projects can use CocoaPods to install the latest release: +```shell +pod 'Filament', '~> 1.56.6' ``` -pod 'Filament', '~> 1.31.1' -``` - -### Snapshots - -If you prefer to live on the edge, you can download a continuous build by following the following -steps: - -1. Find the [commit](https://github.com/google/filament/commits/main) you're interested in. -2. Click the green check mark under the commit message. -3. Click on the _Details_ link for the platform you're interested in. -4. On the top left click _Summary_, then in the _Artifacts_ section choose the desired artifact. ## Documentation @@ -176,6 +166,7 @@ steps: - [x] KHR_materials_unlit - [x] KHR_materials_variants - [x] KHR_materials_volume + - [x] KHR_materials_specular - [x] KHR_mesh_quantization - [x] KHR_texture_basisu - [x] KHR_texture_transform diff --git a/RELEASE_GUIDE.md b/RELEASE_GUIDE.md index 31ff6656f21..478771e6f7a 100644 --- a/RELEASE_GUIDE.md +++ b/RELEASE_GUIDE.md @@ -9,26 +9,15 @@ Before starting, ensure that each of these branches is up-to-date with origin: - rc/$RELEASE - main -## 0. Make sure the rc/$RELEASE branch has the correct version. +## 0. Check versions. -It should have the version corresponding to its name, $RELEASE. +Make sure the rc/$RELEASE branch has the correct Filament version. It should have the version +corresponding to its name, $RELEASE. -## 1. Update RELEASE_NOTES.md on the rc branch. +Make sure `MATERIAL_VERSION` has been bumped to a new version if this is a MAJOR or MINOR release +(first two version numbers). -Checkout the rc/$RELEASE branch. In RELEASE_NOTES.md, locate the header corresponding to $RELEASE -and write release notes. To see which commits make up the release, run: - -``` -build/common/release.sh -c rc/$RELEASE -``` - -Commit the changes to rc/$RELEASE with the title: - -``` -Update RELEASE_NOTES for $RELEASE -``` - -## 2. Bump versions on main to $RELEASE. +## 1. Bump Filament versions on main to $RELEASE. Checkout main and run the following command to bump Filament's version to $RELEASE: @@ -44,49 +33,19 @@ Release Filament $RELEASE Do not push to origin yet. -## 3. Cherry-pick RELEASE_NOTES change from rc branch to main. - -``` -git cherry-pick rc/$RELEASE -``` - -Update the headers. The "main branch" header becomes a header for $NEXT_RELEASE, and a new "main -branch" header is added. +## 2. Update RELEASE_NOTES.md on main. -For example, this: +Create a new header in RELEASE_NOTES.md for $NEXT_RELEASE. Copy the release notes in +NEW_RELEASE_NOTES.md to RELEASE_NOTES.md under the new header. Clear NEW_RELEASE_NOTES.md. -``` -## main branch -- foo -- bar - -## v1.9.3 -- baz -- bat -``` - -becomes: - -``` -## main branch - -## v1.9.4 -- foo -- bar - -## v1.9.3 -- baz -- bat -``` - -Ammend these changes to the cherry-picked change. +Amend these changes to the "Release Filament $RELEASE" commit. ``` git add -u git commit --amend --no-edit ``` -## 4. Run release script. +## 3. Run release script. ``` build/common/release.sh rc/$RELEASE rc/$NEXT_RELEASE @@ -95,18 +54,18 @@ build/common/release.sh rc/$RELEASE rc/$NEXT_RELEASE This script will merge rc/$RELEASE into release, delete the rc branch, and create a new rc branch called rc/$NEXT_RELEASE. Verify that everything looks okay locally. -## 5. Push the release branch. +## 4. Push the release branch. ``` git push origin release ``` -## 6. Create the GitHub release. +## 5. Create the GitHub release. Use the GitHub UI to create a GitHub release corresponding to $RELEASE version. Make sure the target is set to the release branch. -## 7. Delete the old rc branch (optional). +## 6. Delete the old rc branch (optional). This step is optional. The old rc branch may be left alive for a few weeks for posterity. @@ -114,7 +73,7 @@ This step is optional. The old rc branch may be left alive for a few weeks for p git push origin --delete rc/$RELEASE ``` -## 8. Bump the version on the new rc branch to $NEXT_RELEASE. +## 7. Bump the version on the new rc branch to $NEXT_RELEASE. ``` git checkout rc/$NEXT_RELEASE @@ -127,19 +86,19 @@ Commit the changes to rc/$NEXT_RELEASE with the title: Bump version to $NEXT_RELEASE ``` -## 9. Push main. +## 8. Push main. ``` git push origin main ``` -## 10. Push the new rc branch. +## 9. Push the new rc branch. ``` git push origin -u rc/$NEXT_RELEASE ``` -## 11. Rebuild the GitHub release (if failed). +## 10. Rebuild the GitHub release (if failed). Sometimes the GitHub release job will fail. In this case, you can manually re-run the release job. @@ -169,3 +128,15 @@ Navigate to [Filament's release workflow](https://github.com/google/filament/actions/workflows/release.yml). Hit the _Run workflow_ dropdown. Modify _Platform to build_ and _Release tag to build_, then hit _Run workflow_. This will initiate a new release run. + +## 11. Kick off the npm and CocoaPods release jobs + +Navigate to [Filament's npm deploy +workflow](https://github.com/google/filament/actions/workflows/npm-deploy.yml). +Hit the _Run workflow_ dropdown. Modify _Release tag to deploy_ to the tag corresponding to this +release (for example, v1.42.2). + +Navigate to [Filament's CocoaPods deploy +workflow](https://github.com/google/filament/actions/workflows/cocopods-deploy.yml). +Hit the _Run workflow_ dropdown. Modify _Release tag to deploy_ to the tag corresponding to this +release (for example, v1.42.2). diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index cf44dad8d34..ffccaa339ab 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -3,10 +3,397 @@ This file contains one line summaries of commits that are worthy of mentioning in release notes. A new header is inserted each time a *tag* is created. -## main branch +**Do not edit this file unless you are performing a release or cherry-picking into an rc/ branch.** +Instead, if you are authoring a PR for the main branch, add your release note to +[NEW_RELEASE_NOTES.md](./NEW_RELEASE_NOTES.md). + +## v1.56.7 + + +## v1.56.6 + +fix crash: the 'target_node' of Animation Channel may be nullpointer. + +## v1.56.5 + + +## v1.56.4 + + +## v1.56.3 + + +## v1.56.2 + +- vk: fix stage pool gc logic + +## v1.56.1 + +## v1.56.0 + +- backend: descriptor layouts distinguish samplers and external samplers (b/376089915) [⚠️ **New Material Version**] + +## v1.55.1 + + +## v1.55.0 +- Add descriptor sets to describe shader resources. [⚠️ **New Material Version**] + +## v1.54.5 + + +## v1.54.4 + +- Add support for multi-layered render target with array textures. + +## v1.54.3 + + +## v1.54.2 + +- Add a `name` API to Filament objects for debugging handle use-after-free assertions + +## v1.54.1 + + +## v1.54.0 + +- materials: add a new `stereoscopicType` material parameter. [⚠️ **New Material Version**] +- Fix a crash when compiling shaders on IMG devices + +## v1.53.5 + +- engine: Fix bug causing certain sampler parameters to not be applied correctly in GLES 2.0 and on + certain GLES 3.0 drivers. + +## v1.53.4 + + +## v1.53.3 + +- Add drag and drop support for IBL files for desktop gltf_viewer. + +## v1.53.2 + + +## v1.53.1 + + +## v1.53.0 + +- engine: fix skinning normals with large transforms (b/342459864) [⚠️ **New Material Version**] + +## v1.52.3 + + +## v1.52.2 + + +## v1.52.1 + +- Add instructions for using Mesa for software rasterization + +## v1.51.9 + + +## v1.51.8 + +- filagui: Fix regression which broke WebGL +- Add a new Engine::Config setting to control preferred shader language +- Add `getEyeIndex` vertex API +- ios: Remove bitcode from iOS builds + +## v1.51.7 + +- Add new matedit tool +- filagui: Support rendering `GL_TEXTURE_EXTERNAL_OES` textures. +- `setFrameScheduledCallback` now takes a `utils::Invocable`. +- engine: Add `isPaused()` + +## v1.51.6 + +- Add new matedit tool +- filagui: Support rendering `GL_TEXTURE_EXTERNAL_OES` textures. + +## v1.51.5 + + +## v1.51.4 + + +## v1.51.3 + + +## v1.51.2 + +- engine: Add experimental APIs `Engine::builder::paused()` and `Engine::setPaused()` + +## v1.51.1 + + +## v1.51.0 + +- materials: add support for post-lighting mix factor (b/328498606) [⚠️ **New Material Version**] + +## v1.50.6 + +- Add new API `SwapChain::getFrameScheduledCallback` +- vulkan: fixed validation error VUID-vkAcquireNextImageKHR-semaphore-01779 +- opengl: Add support for protected content swapchains and contexts + +## v1.50.5 + +- android: NDK 26.1.10909125 is used by default +- android: Minimum API level on Android is now API 21 instead of API 19. This allows the use of OpenGL ES 3.1 +- rendering: New PBR Neutral tone mapper, designed to preserve materials color appearance +- android: Change default frameRateOptions.interval to 1.0 + +## v1.50.4 + + +## v1.50.3 + + +## v1.50.2 + + +## v1.50.1 + +- Metal: fix some shader artifacts by disabling fast math optimizations. +- backend: remove `atan2` overload which had a typo and wasn't useful. Fixes b/320856413. +- utils: remove usages of `SpinLock`. Fixes b/321101014. + +## v1.50.0 +- engine: TAA now supports 4x upscaling [BETA] [⚠️ **New Material Version**] + +## v1.49.3 + +- matc: Generate stereo variants for FL0 materials [⚠️ **Recompile materials**] + +## v1.49.2 + + +## v1.49.1 + + +## v1.49.0 + +- matc: Fix ESSL 1.0 codegen when using external samplers [⚠️ **Recompile materials**] + +## v1.48.0 + +- matc: New option `-1` to disable generation of ESSL 1.0 code in Feature Level 0 materials +- matc: Support optimizations for ESSL 1.0 code [⚠️ **Recompile materials**] + +## v1.47.0 + +- engine: Support up to 4 side-by-side stereoscopic eyes, configurable at Engine creation time. See + `Engine::Config::stereoscopicEyeCount`. [⚠️ **Recompile Materials**] + +## v1.46.0 + +- engine: Allow instantiating Engine at a given feature level via `Engine::Builder::featureLevel` +- matc: Enable `GL_OES_standard_derivatives` extension in ESSL 1.0 shaders +- matc: Fix code generation of double sided and masked materials in ESSL 1.0 shaders +- filagui: Add support for feature level 0 +- matc: Add support for post-process materials in feature level 0 +- engine: Add `Material::getFeatureLevel()` +- engine: Add missing `Material::getReflectionMode()` method in Java +- engine: Support basic usage of post-processing materials on feature level 0 +- engine: Fix critical GLES 2.0 bugs +- engine: Add `FILAMENT_ENABLE_FEATURE_LEVEL_0` build-time option optionally allow building Filament + without FL0 support. + +## v1.45.1 + +- engine: Added parameter for configuring JobSystem thread count +- engine: In Java, introduce Engine.Builder +- gltfio: fix ubershader index for transmission&volume material +- engine: New tone mapper: `AgXTonemapper`. +- matinfo: Add support for viewing ESSL 1.0 shaders +- engine: Add `Renderer::getClearOptions()` [b/243846268] +- engine: Fix stable shadows (again) when an IBL rotation is used + +## v1.45.0 + +- materials: fix alpha masked materials when MSAA is turned on [⚠️ **Recompile materials**] +- materials: better support materials with custom depth [**Recompile Materials**] +- engine: fade shadows at shadowFar distance instead of hard cutoff [⚠️ **New Material Version**] + +## v1.44.0 + +- engine: add support for skinning with more than four bones per vertex. +- engine: remove `BloomOptions::anamorphism` which wasn't working well in most cases [**API CHANGE**] +- engine: new API to return a Material's supported variants, C++ only (b/297456590) +- build: fix emscripten-1.3.46 build +- engine: materials built for feature level 0 can now also be loaded in higher feature levels [⚠️ + **New Material Version**] + +## v1.43.1 + +## v1.43.0 + +- gltfio: Fix possible change of scale sign when decomposing transform matrix for animation +- engine: Fixes "stable" shadows (see b/299310624) + +## v1.42.2 + +- Fix possible NPE when updating fog options from Java/Kotlin +- The `emissive` property was not applied properly to `MASKED` materials, and could cause + dark fringes to appear (recompile materials) +- Allow glTF materials with transmission/volume extensions to choose their alpha mode + instead of forcing `MASKED` +- Fix a crash in gltfio when not using ubershaders +- Use flatmat for mat parameter in jsbinding +- Fix TextureFlags for sheenRoughnessMap when textures of sheenRoughnessMap and sheenColorMap is same +- Directional shadows can now be transformed (b/297095805) + +## v1.42.1 + +- Fix potential `EXC_BAD_ACCESS` with Metal backend: b/297059776 +- `setFrameCompletedCallback` now takes a `backend::CallbackHandler`. + +## v1.42.0 + +- engine: add preliminary support for instanced stereoscopic rendering [⚠️ **Recompile materials**] + +## v1.41.0 + +- backend: fix #6997 : picking can fail on Adreno [⚠️ **New Material Version**] +- backend: A partial workaround for PowerVR devices (#5118, b/190221124) [⚠️ **Recompile Materials**] + +## v1.40.5 + +- backend: Disable timer queries on all Mali GPUs (fixes b/233754398) +- engine: Add a way to query the validity of most filament objects (see `Engine::isValid`) +- opengl: fix b/290388359 : possible crash when shutting down the engine +- engine: Improve precision of frame time measurement when using emulated TimerQueries +- backend: Improve frame pacing on Android and Vulkan. +- backend: workaround b/291140208 (gltf_viewer crashes on Nexus 6P) +- engine: support `setDepthFunc` for `MaterialInstance` +- web: Added setDepthFunc()/getDepthFunc() to MaterialInstance +- android: Added setDepthFunc()/getDepthFunc() to MaterialInstance + +## v1.40.4 + +- gltfio: fix crash when compute morph target without material +- matc: fix buggy `variant-filter` flag +- web: Added missing setMat3Parameter()/setMat4Parameter() to MaterialInstance +- opengl: fix b/290670707 : crash when using the blob cache +- engine: fix a crash with `Material::compile()` when a callback is specified + +## v1.40.3 + +## v1.40.2 + +- rendering: dynamic resolution would not work with a translucent render target and quality > low +- Java/Kotlin: user callbacks were not invoked on successful texture upload + +## v1.40.1 + +## v1.40.0 + +- matc: fix VSM high precision option on mobile [⚠️ **Recompile materials**] +- vulkan: support sRGB swap chain +- Add new `getMaxAutomaticInstances()` API on `Engine` to get max supported automatic instances. +- UiHelper: fix jank when a `TextureView` is resized (fixes b\282220665) +- backend: parallel shader compilation support. This breaks and improves the recent `Material::compile` API. + +## v1.39.0 + +- matc: workaround a bug in spirv-tools causing vsm to fail [⚠️ **Recompile materials**] + +## v1.38.0 + +- engine: a new feature to set a transform on the global-scale fog [⚠️ **Recompile materials**] +- engine: large-scale fog can now be opted-out on a per-renderable basis +- engine: improve froxelizer resource efficiency [⚠️ **Recompile materials**] +- matc: better accounting and validation of used samplers in user materials +- engine: add support for sampling fog color from a custom texture [⚠️ **Recompile materials**] +- vulkan: introduce new custom swapchain API +- vulkan: new context sharing API + +## v1.37.0 + +- backend: added `Platform` blob cache APIs, typically used to cache programs [⚠️ **Recompile materials**] + +## v1.36.0 + +- engine: a local transform can now be supplied for each GPU instance [⚠️ **Recompile materials**] +- everything: Add limited support for OpenGL ES 2.0 devices. [⚠️ **Recompile Materials**] +- platform: New virtual on `OpenGLPlatform` to preserve ancillary buffers + +## v1.35.0 + +- materials: Materials can now access up to 4 global `vec4` visible by all materials [⚠️ **Recompile Materials**] + +## v1.34.0 + +- materials: picking is done in float (prepare for ES2) [⚠️ **New Material Version**] +- materials: postLightingBlending is now applied before the fog [⚠️ **Recompile materials**] +- vulkan: fix adreno optimized material artifacts [⚠️ **Recompile Materials**] + +## v1.33.0 + +- materials: prepare ES2 support [⚠️ **New Material Version**] + +## v1.32.4 + +- engine: Add support for _constant parameters_, which are constants that can be specialized after material compilation. +- materials: improved size reduction of OpenGL/Metal shaders by ~65% when compiling materials with + size optimizations (`matc -S`) [⚠️ **Recompile Materials**] +- engine: fix potential crash on Metal devices with A8X GPU (iPad Air 2) [⚠️ **Recompile Materials**] +- opengl: support the external image on macOS + +## v1.32.3 + +- fog: added an option to disable the fog after a certain distance [⚠️ **Recompile Materials**]. +- fog: fog color now takes exposure and IBL intensity into account [⚠️ **Recompile Materials**]. +- materials: implement cascades debugging as a post-process [⚠️ **Recompile Materials**]. +- materials: use 9 digits or less for floats [⚠️ **Recompile Materials**]. +- gltfio: fix skinning when objects are far from the origin +- materials: remove 4 unneeded variants from `unlit` materials [⚠️ **Recompile Materials**]. + +## v1.32.2 + +- lighting: the sun disc was computed in low/medium quality instead of high quality. This will + provide performance improvements to mobile devices [⚠️ **Recompile Materials**] + +## v1.32.1 + +## v1.32.0 + +- fog: fixed fog height falloff and computation precision on mobile [⚠️ **Recompile Materials**] +- materials: new alphaToCoverage property can be used to control alpha to coverage behavior +- materials: added `getUserWorldFromWorldMatrix()` and `getUserWorldPosition()` to retrieve the + API-level (user) world position in materials. Deprecated `getWorldOffset()`. [⚠️ **Recompile + Materials**] +- engine: fix precision issue with `shading_view` in large scenes +- vulkan: readPixels is now async (#6560) + +## v1.31.7 + +## v1.31.6 + +- engine: the default render channel is now 2 instead of 0 +- gltfio: Fix crash when a MIME type has no texture provider + +## v1.31.5 + +- gltfio: fix potential early freeing of data provided with `ResourceLoader::addResourceData`. + +## v1.31.4 + +- engine: fix broken picking [⚠️ **Recompile Materials to get the fix**] +- engine: added support for sRGB swapchains. See `SwapChain.h` +- bluegl: support Windows32 + +## v1.31.3 -## v1.31.2 - vulkan: fix memory leak in readPixels +- engine: added support for draw-commands channels (stronger ordering of commands/renderables) + +## v1.31.2 ## v1.31.1 @@ -293,7 +680,7 @@ A new header is inserted each time a *tag* is created. - engine: Binary size improvements. - engine: Add basic support for instanced renderables [**NEW API**]. -- engine: Fix, first imaged passsed to `Stream::SetAcquiredImage` is ignored and leaked. +- engine: Fix, first imaged passed to `Stream::SetAcquiredImage` is ignored and leaked. - Vulkan: Robustness improvements. - Java: Fix, lookAt z axis negated. - gltfio: Be graceful when model has > 4 weights per vert. diff --git a/android/Windows.md b/android/Windows.md deleted file mode 100644 index 0e80198226e..00000000000 --- a/android/Windows.md +++ /dev/null @@ -1,145 +0,0 @@ -# Building Filament for Android on Windows - -## Prerequisites - -In addition to the requirements for [building Filament on Windows](../BUILDING.md#windows), you'll -need the Android SDK and NDK. See [Getting Started with the -NDK](https://developer.android.com/ndk/guides/) for detailed installation instructions. - -You'll also need [Ninja 1.8](https://github.com/ninja-build/ninja/wiki/Pre-built-Ninja-packages) (or -more recent) and [Git for Windows](https://git-scm.com/download/win) to clone the repository and run -Bash scripts. - -Ensure the `%ANDROID_HOME%` environment variable is set to your Android SDK installation location. - -On Windows, we require VS2019 for building the host tools. All of the following commands should be -executed in a *Visual Studio x64 Native Tools Command Prompt for VS 2019*. - -### A Note About Python 3 - -Python 3 is required. If CMake errors because it cannot find Python 3: - -``` -Could NOT find PythonInterp: Found unsuitable version "1.4", but required is at least "3" -``` - -then add the following flag to the CMake invocations: - -``` --DPYTHON_EXECUTABLE:FILEPATH=\path\to\python3 -``` - -## Desktop Tools - -First, a few Filament tools need to be compiled for desktop. - -1. From Filament's root directory, create a desktop build directory and run CMake. - -``` -mkdir out\cmake-release -cd out\cmake-release -cmake ^ - -G Ninja ^ - -DCMAKE_INSTALL_PREFIX=..\release\filament ^ - -DFILAMENT_ENABLE_JAVA=NO ^ - -DCMAKE_BUILD_TYPE=Release ^ - ..\.. -``` - -2. Build the required desktop host tools. - -``` -ninja matc resgen cmgen -``` - -The build should succeed and a `ImportExecutables-Release.cmake` file should automatically be -created at Filament's root directory. - -If you are going to build Filament samples you should install desktop host tools: - -``` -ninja install -``` - -## Build - -1. Create the build directories. - -``` -mkdir out\cmake-android-release-aarch64 -mkdir out\cmake-android-release-arm7 -mkdir out\cmake-android-release-x86_64 -mkdir out\cmake-android-release-x86 -``` - -2. Run CMake for each architecture. - -``` -cd out\cmake-android-release-aarch64 -cmake ^ - -G Ninja ^ - -DCMAKE_BUILD_TYPE=Release ^ - -DCMAKE_INSTALL_PREFIX=..\android-release\filament ^ - -DCMAKE_TOOLCHAIN_FILE=..\..\build\toolchain-aarch64-linux-android.cmake ^ - ..\.. - -cd out\cmake-android-release-arm7 -cmake ^ - -G Ninja ^ - -DCMAKE_BUILD_TYPE=Release ^ - -DCMAKE_INSTALL_PREFIX=..\android-release\filament ^ - -DCMAKE_TOOLCHAIN_FILE=..\..\build\toolchain-arm7-linux-android.cmake ^ - ..\.. - -cd out\cmake-android-release-x86_64 -cmake ^ - -G Ninja ^ - -DCMAKE_BUILD_TYPE=Release ^ - -DCMAKE_INSTALL_PREFIX=..\android-release\filament ^ - -DCMAKE_TOOLCHAIN_FILE=..\..\build\toolchain-x86_64-linux-android.cmake ^ - ..\.. - -cd out\cmake-android-release-x86 -cmake ^ - -G Ninja ^ - -DCMAKE_BUILD_TYPE=Release ^ - -DCMAKE_INSTALL_PREFIX=..\android-release\filament ^ - -DCMAKE_TOOLCHAIN_FILE=..\..\build\toolchain-x86-linux-android.cmake ^ - ..\.. -``` - -3. Build. - -Inside of each build directory, run: - -``` -ninja install -``` - -## Generate AAR - -The Gradle project used to generate the AAR is located at `\android`. - -``` -cd android -gradlew -Pcom.google.android.filament.dist-dir=..\out\android-release\filament assembleRelease -copy filament-android\build\outputs\aar\filament-android-release.aar ..\..\out\ -``` - -If you're only interested in building for a single ABI, you'll need to pass a `com.google.android.filament.abis` parameter: - -``` -gradlew -Pcom.google.android.filament.dist-dir=..\out\android-release\filament assembleRelease -Pcom.google.android.filament.abis=x86 -``` - -If you're only interested in building SDK, you may skip samples build by passing a `com.google.android.filament.skip-samples` flag: - -``` -gradlew -Pcom.google.android.filament.dist-dir=..\out\android-release\filament assembleRelease -Pfilament_skip_samples -``` - - -`filament-android-release.aar` should now be present at `\out\filament-android-release.aar`. - -See [Using Filament's AAR](../README.md) for usage instructions. - diff --git a/android/build.gradle b/android/build.gradle index 4ee683a93ba..293387890ee 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -11,8 +11,14 @@ // com.google.android.filament.exclude-vulkan // When set, support for Vulkan will be excluded. // +// com.google.android.filament.fgviewer +// When set, enables fgviewer +// // com.google.android.filament.matdbg -// When set, enables matdbg, disables shader optimizations +// When set, enables matdbg +// +// com.google.android.filament.matnopt +// When set, disable shader optimizations. // // com.google.android.filament.skip-samples // Exclude samples from the project. Useful to speed up compilation. @@ -58,10 +64,19 @@ buildscript { .gradleProperty("com.google.android.filament.exclude-vulkan") .isPresent() + // TODO: Uncomment below when fgviewer is ready + // def fgviewer = providers + // .gradleProperty("com.google.android.filament.fgviewer") + // .isPresent() + def matdbg = providers .gradleProperty("com.google.android.filament.matdbg") .isPresent() + def matnopt = providers + .gradleProperty("com.google.android.filament.matnopt") + .isPresent() + def abis = ["arm64-v8a", "armeabi-v7a", "x86_64", "x86"] def newAbis = providers .gradleProperty("com.google.android.filament.abis") @@ -72,15 +87,16 @@ buildscript { } ext.versions = [ - 'minSdk': 19, - 'targetSdk': 33, - 'compileSdk': 33, - 'kotlin': '1.8.0', - 'kotlin_coroutines': '1.6.4', - 'buildTools': '33.0.1', - 'ndk': '25.1.8937393', - 'androidx_core': '1.9.0', - 'androidx_annotations': '1.3.0' + 'jdk': 17, + 'minSdk': 21, + 'targetSdk': 34, + 'compileSdk': 34, + 'kotlin': '2.0.21', + 'kotlin_coroutines': '1.9.0', + 'buildTools': '35.0.0', + 'ndk': '27.0.11718014', + 'androidx_core': '1.13.1', + 'androidx_annotations': '1.9.0' ] ext.deps = [ @@ -96,7 +112,7 @@ buildscript { ] dependencies { - classpath 'com.android.tools.build:gradle:7.4.0' + classpath 'com.android.tools.build:gradle:8.6.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}" } @@ -107,8 +123,10 @@ buildscript { "-DANDROID_STL=c++_static", "-DFILAMENT_DIST_DIR=${filamentPath}".toString(), "-DFILAMENT_SUPPORTS_VULKAN=${excludeVulkan ? 'OFF' : 'ON'}".toString(), + // TODO: Uncomment below when fgviewer is ready + // "-DFILAMENT_ENABLE_FGVIEWER=${fgviewer ? 'ON' : 'OFF'}".toString(), "-DFILAMENT_ENABLE_MATDBG=${matdbg ? 'ON' : 'OFF'}".toString(), - "-DFILAMENT_DISABLE_MATOPT=${matdbg ? 'ON' : 'OFF'}".toString() + "-DFILAMENT_DISABLE_MATOPT=${matnopt ? 'ON' : 'OFF'}".toString() ] ext.cppFlags = [ @@ -119,6 +137,7 @@ buildscript { "-fno-asynchronous-unwind-tables", "-fno-rtti", "-ffast-math", + "-fno-finite-math-only", "-ffp-contract=fast", "-fvisibility-inlines-hidden", "-fvisibility=hidden", @@ -143,7 +162,7 @@ buildscript { } plugins { - id "io.github.gradle-nexus.publish-plugin" version "1.1.0" + id "io.github.gradle-nexus.publish-plugin" version "1.3.0" } // See https://github.com/gradle-nexus/publish-plugin @@ -186,6 +205,7 @@ subprojects { } ndk { + //noinspection ChromeOsAbiSupport abiFilters(*rootProject.ext.abis) } @@ -206,8 +226,8 @@ subprojects { } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility versions.jdk + targetCompatibility versions.jdk } } } diff --git a/android/buildSrc/src/main/groovy/FilamentPlugin.groovy b/android/buildSrc/src/main/groovy/FilamentPlugin.groovy index e32fcc249e5..10f0b5e0c50 100644 --- a/android/buildSrc/src/main/groovy/FilamentPlugin.groovy +++ b/android/buildSrc/src/main/groovy/FilamentPlugin.groovy @@ -142,6 +142,14 @@ abstract class MaterialCompiler extends TaskWithBinary { if (!exclude_vulkan) { matcArgs += ['-a', 'vulkan'] } + + def mat_no_opt = providers + .gradleProperty("com.google.android.filament.matnopt") + .forUseAtConfigurationTime().present + if (mat_no_opt) { + matcArgs += ['-g'] + } + matcArgs += ['-a', 'opengl', '-p', 'mobile', '-o', getOutputFile(file), file] exec.exec { diff --git a/android/filamat-android/CMakeLists.txt b/android/filamat-android/CMakeLists.txt index 1ad88da9c36..3b7bc49c762 100644 --- a/android/filamat-android/CMakeLists.txt +++ b/android/filamat-android/CMakeLists.txt @@ -6,9 +6,6 @@ option(FILAMENT_ENABLE_MATDBG "Enables Material debugger" OFF) set(FILAMENT_DIR ${FILAMENT_DIST_DIR}) set(FILAMAT_FLAVOR "filamat") -if(FILAMAT_LITE) - set(FILAMAT_FLAVOR "filamat_lite") -endif() if (FILAMENT_SUPPORTS_VULKAN) message("Library filamat ignores Vulkan settings") @@ -41,6 +38,7 @@ set(FILAMAT_INCLUDE_DIRS include_directories(${FILAMENT_DIR}/include) set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} -Wl,--version-script=${CMAKE_SOURCE_DIR}/libfilamat-jni.map") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=16384") add_library(filamat-jni SHARED src/main/cpp/MaterialBuilder.cpp) target_include_directories(filamat-jni PRIVATE ${FILAMAT_INCLUDE_DIRS}) diff --git a/android/filamat-android/build.gradle b/android/filamat-android/build.gradle index 5e9c4f5c58c..d8588c066c3 100644 --- a/android/filamat-android/build.gradle +++ b/android/filamat-android/build.gradle @@ -1,20 +1,10 @@ android { namespace 'com.google.android.filament.filamat' - flavorDimensions "functionality" - productFlavors { - full { - dimension "functionality" - } - - lite { - dimension "functionality" - - externalNativeBuild { - cmake { - arguments.add("-DFILAMAT_LITE=ON") - } - } + publishing { + singleVariant("release") { + withSourcesJar() + withJavadocJar() } } } @@ -28,14 +18,9 @@ apply from: rootProject.file('gradle/gradle-mvn-push.gradle') afterEvaluate { project -> publishing { publications { - fullRelease(MavenPublication) { + release(MavenPublication) { artifactId = POM_ARTIFACT_ID_FULL - from components.fullRelease - } - - liteRelease(MavenPublication) { - artifactId = POM_ARTIFACT_ID_LITE - from components.liteRelease + from components.release } } } diff --git a/android/filamat-android/src/main/cpp/MaterialBuilder.cpp b/android/filamat-android/src/main/cpp/MaterialBuilder.cpp index 2c70f2526a0..c17505e2848 100644 --- a/android/filamat-android/src/main/cpp/MaterialBuilder.cpp +++ b/android/filamat-android/src/main/cpp/MaterialBuilder.cpp @@ -250,6 +250,13 @@ Java_com_google_android_filament_filamat_MaterialBuilder_nMaterialBuilderMaskThr builder->maskThreshold(maskThreshold); } +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_filamat_MaterialBuilder_nMaterialBuilderAlphaToCoverage(JNIEnv*, + jclass, jlong nativeBuilder, jboolean enable) { + auto builder = (MaterialBuilder*) nativeBuilder; + builder->alphaToCoverage(enable); +} + extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_filamat_MaterialBuilder_nMaterialBuilderShadowMultiplier( JNIEnv*, jclass, jlong nativeBuilder, jboolean shadowMultiplier) { diff --git a/android/filamat-android/src/main/java/com/google/android/filament/filamat/MaterialBuilder.java b/android/filamat-android/src/main/java/com/google/android/filament/filamat/MaterialBuilder.java index 435f2fe75dd..000262ed95d 100644 --- a/android/filamat-android/src/main/java/com/google/android/filament/filamat/MaterialBuilder.java +++ b/android/filamat-android/src/main/java/com/google/android/filament/filamat/MaterialBuilder.java @@ -360,6 +360,12 @@ public MaterialBuilder maskThreshold(float threshold) { return this; } + @NonNull + public MaterialBuilder alphaToCoverage(boolean enable) { + nMaterialBuilderAlphaToCoverage(mNativeObject, enable); + return this; + } + @NonNull public MaterialBuilder shadowMultiplier(boolean shadowMultiplier) { nMaterialBuilderShadowMultiplier(mNativeObject, shadowMultiplier); @@ -584,6 +590,7 @@ private static native void nMaterialBuilderVariable(long nativeBuilder, int vari private static native void nMaterialBuilderDepthCulling(long nativeBuilder, boolean enable); private static native void nMaterialBuilderDoubleSided(long nativeBuilder, boolean doubleSided); private static native void nMaterialBuilderMaskThreshold(long nativeBuilder, float mode); + private static native void nMaterialBuilderAlphaToCoverage(long nativeBuilder, boolean enable); private static native void nMaterialBuilderShadowMultiplier(long mNativeObject, boolean shadowMultiplier); diff --git a/android/filament-android/CMakeLists.txt b/android/filament-android/CMakeLists.txt index f2a12683ff5..21da97e6b70 100644 --- a/android/filament-android/CMakeLists.txt +++ b/android/filament-android/CMakeLists.txt @@ -2,6 +2,8 @@ cmake_minimum_required(VERSION 3.19) project(filament-android) option(FILAMENT_SUPPORTS_VULKAN "Enables Vulkan on Android" OFF) +# TODO: Uncomment below when fgviewer is ready +# option(FILAMENT_ENABLE_FGVIEWER "Enables Frame Graph Viewer" OFF) option(FILAMENT_ENABLE_MATDBG "Enables Material debugger" OFF) option(FILAMENT_DISABLE_MATOPT "Disables material optimizations" OFF) @@ -51,6 +53,13 @@ add_library(smol-v STATIC IMPORTED) set_target_properties(smol-v PROPERTIES IMPORTED_LOCATION ${FILAMENT_DIR}/lib/${ANDROID_ABI}/libsmol-v.a) +# TODO: Uncomment below when fgviewer is ready +# if (FILAMENT_ENABLE_FGVIEWER) +# add_library(fgviewer STATIC IMPORTED) +# set_target_properties(fgviewer PROPERTIES IMPORTED_LOCATION +# ${FILAMENT_DIR}/lib/${ANDROID_ABI}/libfgviewer.a) +# endif() + if (FILAMENT_ENABLE_MATDBG) add_library(matdbg STATIC IMPORTED) set_target_properties(matdbg PROPERTIES IMPORTED_LOCATION @@ -59,6 +68,7 @@ endif() set(VERSION_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/libfilament-jni.map") set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} -Wl,--version-script=${VERSION_SCRIPT}") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=16384") add_library(filament-jni SHARED src/main/cpp/BufferObject.cpp @@ -116,6 +126,8 @@ target_link_libraries(filament-jni # libgeometry is PUBLIC because gltfio uses it. PUBLIC geometry + # TODO: Uncomment below when fgviewer is ready + # $<$:fgviewer> $<$:matdbg> $<$:filamat> $<$:bluevk> diff --git a/android/filament-android/build.gradle b/android/filament-android/build.gradle index b311edd2cec..b3a07143c61 100644 --- a/android/filament-android/build.gradle +++ b/android/filament-android/build.gradle @@ -1,5 +1,12 @@ android { namespace 'com.google.android.filament' + + publishing { + singleVariant("release") { + withSourcesJar() + withJavadocJar() + } + } } dependencies { diff --git a/android/filament-android/src/main/cpp/Engine.cpp b/android/filament-android/src/main/cpp/Engine.cpp index 3d720a88a3f..56aecc66dd9 100644 --- a/android/filament-android/src/main/cpp/Engine.cpp +++ b/android/filament-android/src/main/cpp/Engine.cpp @@ -25,15 +25,8 @@ using namespace filament; using namespace utils; -extern "C" JNIEXPORT jlong JNICALL -Java_com_google_android_filament_Engine_nCreateEngine(JNIEnv*, jclass, jlong backend, - jlong sharedContext) { - return (jlong) Engine::create((Engine::Backend) backend, nullptr, (void*) sharedContext); -} - extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_Engine_nDestroyEngine(JNIEnv*, jclass, - jlong nativeEngine) { +Java_com_google_android_filament_Engine_nDestroyEngine(JNIEnv*, jclass, jlong nativeEngine) { Engine* engine = (Engine*) nativeEngine; Engine::destroy(&engine); } @@ -278,6 +271,127 @@ Java_com_google_android_filament_Engine_nDestroyEntity(JNIEnv*, jclass, engine->destroy(entity); } + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nIsValidRenderer(JNIEnv*, jclass, + jlong nativeEngine, jlong nativeRenderer) { + Engine* engine = (Engine *)nativeEngine; + return (jboolean)engine->isValid((Renderer*)nativeRenderer); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nIsValidView(JNIEnv*, jclass, + jlong nativeEngine, jlong nativeView) { + Engine* engine = (Engine *)nativeEngine; + return (jboolean)engine->isValid((View*)nativeView); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nIsValidScene(JNIEnv*, jclass, + jlong nativeEngine, jlong nativeScene) { + Engine* engine = (Engine *)nativeEngine; + return (jboolean)engine->isValid((Scene*)nativeScene); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nIsValidFence(JNIEnv*, jclass, + jlong nativeEngine, jlong nativeFence) { + Engine* engine = (Engine *)nativeEngine; + return (jboolean)engine->isValid((Fence*)nativeFence); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nIsValidStream(JNIEnv*, jclass, + jlong nativeEngine, jlong nativeStream) { + Engine* engine = (Engine *)nativeEngine; + return (jboolean)engine->isValid((Stream*)nativeStream); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nIsValidIndexBuffer(JNIEnv*, jclass, + jlong nativeEngine, jlong nativeIndexBuffer) { + Engine* engine = (Engine *)nativeEngine; + return (jboolean)engine->isValid((IndexBuffer*)nativeIndexBuffer); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nIsValidVertexBuffer(JNIEnv*, jclass, + jlong nativeEngine, jlong nativeVertexBuffer) { + Engine* engine = (Engine *)nativeEngine; + return (jboolean)engine->isValid((VertexBuffer*)nativeVertexBuffer); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nIsValidSkinningBuffer(JNIEnv*, jclass, + jlong nativeEngine, jlong nativeSkinningBuffer) { + Engine* engine = (Engine *)nativeEngine; + return (jboolean)engine->isValid((SkinningBuffer*)nativeSkinningBuffer); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nIsValidIndirectLight(JNIEnv*, jclass, + jlong nativeEngine, jlong nativeIndirectLight) { + Engine* engine = (Engine *)nativeEngine; + return (jboolean)engine->isValid((IndirectLight*)nativeIndirectLight); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nIsValidMaterial(JNIEnv*, jclass, + jlong nativeEngine, jlong nativeMaterial) { + Engine* engine = (Engine *)nativeEngine; + return (jboolean)engine->isValid((Material*)nativeMaterial); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nIsValidMaterialInstance(JNIEnv*, jclass, + jlong nativeEngine, jlong nativeMaterial, jlong nativeMaterialInstance) { + Engine* engine = (Engine *)nativeEngine; + return (jboolean)engine->isValid((Material*)nativeMaterial, + (MaterialInstance*)nativeMaterialInstance); +} + +extern "C" JNIEXPORT jboolean JNICALL + Java_com_google_android_filament_Engine_nIsValidExpensiveMaterialInstance(JNIEnv*, jclass, + jlong nativeEngine, jlong nativeMaterialInstance) { + Engine* engine = (Engine *)nativeEngine; + return (jboolean)engine->isValidExpensive((MaterialInstance*)nativeMaterialInstance); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nIsValidSkybox(JNIEnv*, jclass, + jlong nativeEngine, jlong nativeSkybox) { + Engine* engine = (Engine *)nativeEngine; + return (jboolean)engine->isValid((Skybox*)nativeSkybox); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nIsValidColorGrading(JNIEnv*, jclass, + jlong nativeEngine, jlong nativeColorGrading) { + Engine* engine = (Engine *)nativeEngine; + return (jboolean)engine->isValid((ColorGrading*)nativeColorGrading); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nIsValidTexture(JNIEnv*, jclass, + jlong nativeEngine, jlong nativeTexture) { + Engine* engine = (Engine *)nativeEngine; + return (jboolean)engine->isValid((Texture*)nativeTexture); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nIsValidRenderTarget(JNIEnv*, jclass, + jlong nativeEngine, jlong nativeTarget) { + Engine* engine = (Engine *)nativeEngine; + return (jboolean)engine->isValid((RenderTarget*)nativeTarget); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nIsValidSwapChain(JNIEnv*, jclass, + jlong nativeEngine, jlong nativeSwapChain) { + Engine* engine = (Engine *)nativeEngine; + return (jboolean)engine->isValid((SwapChain*)nativeSwapChain); +} + extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_Engine_nFlushAndWait(JNIEnv*, jclass, jlong nativeEngine) { @@ -285,6 +399,34 @@ Java_com_google_android_filament_Engine_nFlushAndWait(JNIEnv*, jclass, engine->flushAndWait(); } +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_Engine_nFlush(JNIEnv*, jclass, + jlong nativeEngine) { + Engine* engine = (Engine*) nativeEngine; + engine->flush(); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nIsPaused(JNIEnv*, jclass, + jlong nativeEngine) { + Engine* engine = (Engine*) nativeEngine; + return (jboolean)engine->isPaused(); +} + +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_Engine_nSetPaused(JNIEnv*, jclass, + jlong nativeEngine, jboolean paused) { + Engine* engine = (Engine*) nativeEngine; + engine->setPaused(paused); +} + +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_Engine_nUnprotected(JNIEnv*, jclass, + jlong nativeEngine, jboolean paused) { + Engine* engine = (Engine*) nativeEngine; + engine->unprotected(); +} + // Managers... extern "C" JNIEXPORT jlong JNICALL @@ -329,6 +471,13 @@ Java_com_google_android_filament_Engine_nIsAutomaticInstancingEnabled(JNIEnv*, j return (jboolean)engine->isAutomaticInstancingEnabled(); } +extern "C" JNIEXPORT jlong JNICALL +Java_com_google_android_filament_Engine_nGetMaxStereoscopicEyes(JNIEnv*, jclass, jlong nativeEngine) { + Engine* engine = (Engine*) nativeEngine; + return (jlong) engine->getMaxStereoscopicEyes(); +} + + extern "C" JNIEXPORT jint JNICALL Java_com_google_android_filament_Engine_nGetSupportedFeatureLevel(JNIEnv *, jclass, jlong nativeEngine) { @@ -348,4 +497,123 @@ Java_com_google_android_filament_Engine_nGetActiveFeatureLevel(JNIEnv *, jclass, jlong nativeEngine) { Engine* engine = (Engine*) nativeEngine; return (jint)engine->getActiveFeatureLevel(); -} \ No newline at end of file +} + +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nHasFeatureFlag(JNIEnv *env, jclass clazz, + jlong nativeEngine, jstring name_) { + Engine* engine = (Engine*) nativeEngine; + const char *name = env->GetStringUTFChars(name_, 0); + std::optional result = engine->getFeatureFlag(name); + env->ReleaseStringUTFChars(name_, name); + return result.has_value(); +} +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nSetFeatureFlag(JNIEnv *env, jclass clazz, + jlong nativeEngine, jstring name_, jboolean value) { + Engine* engine = (Engine*) nativeEngine; + const char *name = env->GetStringUTFChars(name_, 0); + jboolean result = engine->setFeatureFlag(name, (bool)value); + env->ReleaseStringUTFChars(name_, name); + return result; +} +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Engine_nGetFeatureFlag(JNIEnv *env, jclass clazz, + jlong nativeEngine, jstring name_) { + Engine* engine = (Engine*) nativeEngine; + const char *name = env->GetStringUTFChars(name_, 0); + std::optional result = engine->getFeatureFlag(name); + env->ReleaseStringUTFChars(name_, name); + return result.value_or(false); // we should never fail here +} + +extern "C" JNIEXPORT jlong JNICALL Java_com_google_android_filament_Engine_nCreateBuilder(JNIEnv*, + jclass) { + Engine::Builder* builder = new Engine::Builder{}; + return (jlong) builder; +} + +extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_Engine_nDestroyBuilder(JNIEnv*, + jclass, jlong nativeBuilder) { + Engine::Builder* builder = (Engine::Builder*) nativeBuilder; + delete builder; +} + +extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_Engine_nSetBuilderBackend( + JNIEnv*, jclass, jlong nativeBuilder, jlong backend) { + Engine::Builder* builder = (Engine::Builder*) nativeBuilder; + builder->backend((Engine::Backend) backend); +} + +extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_Engine_nSetBuilderConfig(JNIEnv*, + jclass, jlong nativeBuilder, jlong commandBufferSizeMB, jlong perRenderPassArenaSizeMB, + jlong driverHandleArenaSizeMB, jlong minCommandBufferSizeMB, jlong perFrameCommandsSizeMB, + jlong jobSystemThreadCount, jboolean disableParallelShaderCompile, + jint stereoscopicType, jlong stereoscopicEyeCount, + jlong resourceAllocatorCacheSizeMB, jlong resourceAllocatorCacheMaxAge, + jboolean disableHandleUseAfterFreeCheck, + jint preferredShaderLanguage, + jboolean forceGLES2Context, jboolean assertNativeWindowIsValid) { + Engine::Builder* builder = (Engine::Builder*) nativeBuilder; + Engine::Config config = { + .commandBufferSizeMB = (uint32_t) commandBufferSizeMB, + .perRenderPassArenaSizeMB = (uint32_t) perRenderPassArenaSizeMB, + .driverHandleArenaSizeMB = (uint32_t) driverHandleArenaSizeMB, + .minCommandBufferSizeMB = (uint32_t) minCommandBufferSizeMB, + .perFrameCommandsSizeMB = (uint32_t) perFrameCommandsSizeMB, + .jobSystemThreadCount = (uint32_t) jobSystemThreadCount, + .disableParallelShaderCompile = (bool) disableParallelShaderCompile, + .stereoscopicType = (Engine::StereoscopicType) stereoscopicType, + .stereoscopicEyeCount = (uint8_t) stereoscopicEyeCount, + .resourceAllocatorCacheSizeMB = (uint32_t) resourceAllocatorCacheSizeMB, + .resourceAllocatorCacheMaxAge = (uint8_t) resourceAllocatorCacheMaxAge, + .disableHandleUseAfterFreeCheck = (bool) disableHandleUseAfterFreeCheck, + .preferredShaderLanguage = (Engine::Config::ShaderLanguage) preferredShaderLanguage, + .forceGLES2Context = (bool) forceGLES2Context, + .assertNativeWindowIsValid = (bool) assertNativeWindowIsValid, + }; + builder->config(&config); +} + +extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_Engine_nSetBuilderFeatureLevel( + JNIEnv*, jclass, jlong nativeBuilder, jint ordinal) { + Engine::Builder* builder = (Engine::Builder*) nativeBuilder; + builder->featureLevel((Engine::FeatureLevel)ordinal); +} + +extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_Engine_nSetBuilderSharedContext( + JNIEnv*, jclass, jlong nativeBuilder, jlong sharedContext) { + Engine::Builder* builder = (Engine::Builder*) nativeBuilder; + builder->sharedContext((void*) sharedContext); +} + +extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_Engine_nSetBuilderPaused( + JNIEnv*, jclass, jlong nativeBuilder, jboolean paused) { + Engine::Builder* builder = (Engine::Builder*) nativeBuilder; + builder->paused((bool) paused); +} + +extern "C" +JNIEXPORT void JNICALL +Java_com_google_android_filament_Engine_nSetBuilderFeature(JNIEnv *env, jclass clazz, + jlong nativeBuilder, jstring name_, jboolean value) { + Engine::Builder* builder = (Engine::Builder*) nativeBuilder; + const char *name = env->GetStringUTFChars(name_, 0); + builder->feature(name, (bool)value); + env->ReleaseStringUTFChars(name_, name); +} + +extern "C" JNIEXPORT jlong JNICALL +Java_com_google_android_filament_Engine_nBuilderBuild(JNIEnv*, jclass, jlong nativeBuilder) { + Engine::Builder* builder = (Engine::Builder*) nativeBuilder; + return (jlong) builder->build(); +} + +extern "C" +JNIEXPORT jlong JNICALL +Java_com_google_android_filament_Engine_getSteadyClockTimeNano(JNIEnv *env, jclass clazz) { + return (jlong)Engine::getSteadyClockTimeNano(); +} diff --git a/android/filament-android/src/main/cpp/IndirectLight.cpp b/android/filament-android/src/main/cpp/IndirectLight.cpp index bd7b85498f5..3834521b437 100644 --- a/android/filament-android/src/main/cpp/IndirectLight.cpp +++ b/android/filament-android/src/main/cpp/IndirectLight.cpp @@ -167,7 +167,7 @@ Java_com_google_android_filament_IndirectLight_nGetDirectionEstimateStatic(JNIEn jfloat *outDirection = env->GetFloatArrayElements(outDirection_, NULL); *reinterpret_cast(outDirection) = IndirectLight::getDirectionEstimate((filament::math::float3*)sh); env->ReleaseFloatArrayElements(outDirection_, outDirection, 0); - env->ReleaseFloatArrayElements(sh_, sh, JNI_ABORT); + env->ReleaseFloatArrayElements(sh_, sh, 0); } extern "C" JNIEXPORT void JNICALL @@ -178,5 +178,5 @@ Java_com_google_android_filament_IndirectLight_nGetColorEstimateStatic(JNIEnv *e *reinterpret_cast(outColor) = IndirectLight::getColorEstimate((filament::math::float3*)sh, math::float3{x, y, z}); env->ReleaseFloatArrayElements(outColor_, outColor, 0); - env->ReleaseFloatArrayElements(sh_, sh, JNI_ABORT); + env->ReleaseFloatArrayElements(sh_, sh, 0); } diff --git a/android/filament-android/src/main/cpp/LightManager.cpp b/android/filament-android/src/main/cpp/LightManager.cpp index c81ab547e35..23b9a7af212 100644 --- a/android/filament-android/src/main/cpp/LightManager.cpp +++ b/android/filament-android/src/main/cpp/LightManager.cpp @@ -79,7 +79,8 @@ Java_com_google_android_filament_LightManager_nBuilderShadowOptions(JNIEnv* env, jfloat shadowFarHint, jboolean stable, jboolean lispsm, jfloat polygonOffsetConstant, jfloat polygonOffsetSlope, jboolean screenSpaceContactShadows, jint stepCount, - jfloat maxShadowDistance, jboolean elvsm, jfloat blurWidth, jfloat shadowBulbRadius) { + jfloat maxShadowDistance, jboolean elvsm, jfloat blurWidth, jfloat shadowBulbRadius, + jfloatArray transform) { LightManager::Builder *builder = (LightManager::Builder *) nativeBuilder; LightManager::ShadowOptions shadowOptions { .mapSize = (uint32_t)mapSize, @@ -102,12 +103,18 @@ Java_com_google_android_filament_LightManager_nBuilderShadowOptions(JNIEnv* env, }, .shadowBulbRadius = shadowBulbRadius }; + jfloat *nativeSplits = env->GetFloatArrayElements(splitPositions, NULL); const jsize splitCount = std::min((jsize) 3, env->GetArrayLength(splitPositions)); - for (jsize i = 0; i < splitCount; i++) { - shadowOptions.cascadeSplitPositions[i] = nativeSplits[i]; - } + std::copy_n(nativeSplits, splitCount, shadowOptions.cascadeSplitPositions); env->ReleaseFloatArrayElements(splitPositions, nativeSplits, 0); + + jfloat* nativeTransform = env->GetFloatArrayElements(transform, NULL); + std::copy_n(nativeTransform, + std::min(4, env->GetArrayLength(transform)), + shadowOptions.transform.xyzw.v); + env->ReleaseFloatArrayElements(transform, nativeTransform, 0); + builder->shadowOptions(shadowOptions); } diff --git a/android/filament-android/src/main/cpp/Material.cpp b/android/filament-android/src/main/cpp/Material.cpp index 44b50c5d615..027627128e7 100644 --- a/android/filament-android/src/main/cpp/Material.cpp +++ b/android/filament-android/src/main/cpp/Material.cpp @@ -19,17 +19,24 @@ #include #include "common/NioUtils.h" +#include "common/CallbackUtils.h" using namespace filament; extern "C" JNIEXPORT jlong JNICALL Java_com_google_android_filament_Material_nBuilderBuild(JNIEnv *env, jclass, - jlong nativeEngine, jobject buffer_, jint size) { + jlong nativeEngine, jobject buffer_, jint size, jint shBandCount, jint shadowQuality) { Engine* engine = (Engine*) nativeEngine; AutoBuffer buffer(env, buffer_, size); - Material* material = Material::Builder() + auto builder = Material::Builder(); + if (shBandCount) { + builder.sphericalHarmonicsBandCount(shBandCount); + } + builder.shadowSamplingQuality((Material::Builder::ShadowSamplingQuality)shadowQuality); + Material* material = builder .package(buffer.getData(), buffer.getSize()) .build(*engine); + return (jlong) material; } @@ -105,6 +112,22 @@ Java_com_google_android_filament_Material_nGetRefractionType(JNIEnv*, jclass, return (jint) material->getRefractionType(); } +extern "C" +JNIEXPORT jint JNICALL +Java_com_google_android_filament_Material_nGetReflectionMode(JNIEnv*, jclass, + jlong nativeMaterial) { + Material* material = (Material*) nativeMaterial; + return (jint) material->getReflectionMode(); +} + +extern "C" +JNIEXPORT jint JNICALL +Java_com_google_android_filament_Material_nGetFeatureLevel(JNIEnv*, jclass, + jlong nativeMaterial) { + Material* material = (Material*) nativeMaterial; + return (jint) material->getFeatureLevel(); +} + extern "C" JNIEXPORT jint JNICALL Java_com_google_android_filament_Material_nGetVertexDomain(JNIEnv*, jclass, @@ -153,6 +176,14 @@ Java_com_google_android_filament_Material_nIsDoubleSided(JNIEnv*, jclass, return (jboolean) material->isDoubleSided(); } +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Material_nIsAlphaToCoverageEnabled(JNIEnv*, jclass, + jlong nativeMaterial) { + Material* material = (Material*) nativeMaterial; + return (jboolean) material->isAlphaToCoverageEnabled(); +} + extern "C" JNIEXPORT jfloat JNICALL Java_com_google_android_filament_Material_nGetMaskThreshold(JNIEnv*, jclass, @@ -247,3 +278,17 @@ Java_com_google_android_filament_Material_nHasParameter(JNIEnv* env, jclass, env->ReleaseStringUTFChars(name_, name); return (jboolean) hasParameter; } + +extern "C" +JNIEXPORT void JNICALL +Java_com_google_android_filament_Material_nCompile(JNIEnv *env, jclass clazz, + jlong nativeMaterial, jint priority, jint variants, jobject handler, jobject runnable) { + Material* material = (Material*) nativeMaterial; + JniCallback* jniCallback = JniCallback::make(env, handler, runnable); + material->compile( + (Material::CompilerPriorityQueue) priority, + (UserVariantFilterBit) variants, + jniCallback->getHandler(), [jniCallback](Material*){ + JniCallback::postToJavaAndDestroy(jniCallback); + }); +} diff --git a/android/filament-android/src/main/cpp/MaterialInstance.cpp b/android/filament-android/src/main/cpp/MaterialInstance.cpp index 13561e0f503..c5c4ba78fbb 100644 --- a/android/filament-android/src/main/cpp/MaterialInstance.cpp +++ b/android/filament-android/src/main/cpp/MaterialInstance.cpp @@ -205,7 +205,7 @@ Java_com_google_android_filament_MaterialInstance_nSetIntParameterArray(JNIEnv * break; } - env->ReleaseIntArrayElements(v_, v, 0); + env->ReleaseIntArrayElements(v_, v, JNI_ABORT); env->ReleaseStringUTFChars(name_, name); } @@ -246,17 +246,21 @@ Java_com_google_android_filament_MaterialInstance_nSetFloatParameterArray(JNIEnv env->ReleaseStringUTFChars(name_, name); } +// defined in TextureSampler.cpp +namespace filament::JniUtils { + TextureSampler from_long(jlong params) noexcept; +} // TextureSamplerJniUtils + extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_MaterialInstance_nSetParameterTexture( JNIEnv *env, jclass, jlong nativeMaterialInstance, jstring name_, - jlong nativeTexture, jint sampler_) { + jlong nativeTexture, jlong sampler_) { MaterialInstance* instance = (MaterialInstance*) nativeMaterialInstance; Texture* texture = (Texture*) nativeTexture; - TextureSampler& sampler = reinterpret_cast(sampler_); const char *name = env->GetStringUTFChars(name_, 0); - instance->setParameter(name, texture, sampler); + instance->setParameter(name, texture, JniUtils::from_long(sampler_)); env->ReleaseStringUTFChars(name_, name); } @@ -357,6 +361,14 @@ Java_com_google_android_filament_MaterialInstance_nSetDepthCulling(JNIEnv*, instance->setDepthCulling(enable); } +extern "C" +JNIEXPORT void JNICALL +Java_com_google_android_filament_MaterialInstance_nSetDepthFunc(JNIEnv*, + jclass, jlong nativeMaterialInstance, jlong function) { + MaterialInstance* instance = (MaterialInstance*) nativeMaterialInstance; + instance->setDepthFunc(static_cast(function)); +} + extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_MaterialInstance_nSetStencilCompareFunction(JNIEnv*, jclass, @@ -457,7 +469,6 @@ extern "C" JNIEXPORT jfloat JNICALL Java_com_google_android_filament_MaterialInstance_nGetMaskThreshold(JNIEnv* env, jclass clazz, jlong nativeMaterialInstance) { - // TODO: implement nGetMaskThreshold() MaterialInstance* instance = (MaterialInstance*)nativeMaterialInstance; return instance->getMaskThreshold(); } @@ -466,7 +477,6 @@ extern "C" JNIEXPORT jfloat JNICALL Java_com_google_android_filament_MaterialInstance_nGetSpecularAntiAliasingVariance(JNIEnv* env, jclass clazz, jlong nativeMaterialInstance) { - // TODO: implement nGetSpecularAntiAliasingVariance() MaterialInstance* instance = (MaterialInstance*)nativeMaterialInstance; return instance->getSpecularAntiAliasingVariance(); } @@ -475,7 +485,6 @@ extern "C" JNIEXPORT jfloat JNICALL Java_com_google_android_filament_MaterialInstance_nGetSpecularAntiAliasingThreshold(JNIEnv* env, jclass clazz, jlong nativeMaterialInstance) { - // TODO: implement nGetSpecularAntiAliasingThreshold() MaterialInstance* instance = (MaterialInstance*)nativeMaterialInstance; return instance->getSpecularAntiAliasingThreshold(); } @@ -484,7 +493,6 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_google_android_filament_MaterialInstance_nIsDoubleSided(JNIEnv* env, jclass clazz, jlong nativeMaterialInstance) { - // TODO: implement nIsDoubleSided() MaterialInstance* instance = (MaterialInstance*)nativeMaterialInstance; return instance->isDoubleSided(); } @@ -493,7 +501,6 @@ extern "C" JNIEXPORT jint JNICALL Java_com_google_android_filament_MaterialInstance_nGetCullingMode(JNIEnv* env, jclass clazz, jlong nativeMaterialInstance) { - // TODO: implement nGetCullingMode() MaterialInstance* instance = (MaterialInstance*)nativeMaterialInstance; return (jint)instance->getCullingMode(); } @@ -502,7 +509,6 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_google_android_filament_MaterialInstance_nIsColorWriteEnabled(JNIEnv* env, jclass clazz, jlong nativeMaterialInstance) { - // TODO: implement nIsColorWriteEnabled() MaterialInstance* instance = (MaterialInstance*)nativeMaterialInstance; return instance->isColorWriteEnabled(); } @@ -511,7 +517,6 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_google_android_filament_MaterialInstance_nIsDepthWriteEnabled(JNIEnv* env, jclass clazz, jlong nativeMaterialInstance) { - // TODO: implement nIsDepthWriteEnabled() MaterialInstance* instance = (MaterialInstance*)nativeMaterialInstance; return instance->isDepthWriteEnabled(); } @@ -520,7 +525,6 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_google_android_filament_MaterialInstance_nIsStencilWriteEnabled(JNIEnv* env, jclass clazz, jlong nativeMaterialInstance) { - // TODO: implement nIsStencilWriteEnabled() MaterialInstance* instance = (MaterialInstance*)nativeMaterialInstance; return instance->isStencilWriteEnabled(); } @@ -529,7 +533,14 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_google_android_filament_MaterialInstance_nIsDepthCullingEnabled(JNIEnv* env, jclass clazz, jlong nativeMaterialInstance) { - // TODO: implement nIsDepthCullingEnabled() MaterialInstance* instance = (MaterialInstance*)nativeMaterialInstance; return instance->isDepthCullingEnabled(); } + +extern "C" +JNIEXPORT jint JNICALL +Java_com_google_android_filament_MaterialInstance_nGetDepthFunc(JNIEnv* env, jclass clazz, + jlong nativeMaterialInstance) { + MaterialInstance* instance = (MaterialInstance*)nativeMaterialInstance; + return (jint)instance->getDepthFunc(); +} diff --git a/android/filament-android/src/main/cpp/RenderableManager.cpp b/android/filament-android/src/main/cpp/RenderableManager.cpp index 6a1b32c6225..d9b56e02fb6 100644 --- a/android/filament-android/src/main/cpp/RenderableManager.cpp +++ b/android/filament-android/src/main/cpp/RenderableManager.cpp @@ -104,6 +104,14 @@ Java_com_google_android_filament_RenderableManager_nBuilderGeometry__JIIJJIIII(J (size_t) count); } +extern "C" +JNIEXPORT void JNICALL +Java_com_google_android_filament_RenderableManager_nBuilderGeometryType(JNIEnv*, jclass, + jlong nativeBuilder, int type) { + RenderableManager::Builder *builder = (RenderableManager::Builder *) nativeBuilder; + builder->geometryType((RenderableManager::Builder::GeometryType)type); +} + extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_RenderableManager_nBuilderMaterial(JNIEnv*, jclass, @@ -150,6 +158,13 @@ Java_com_google_android_filament_RenderableManager_nBuilderPriority(JNIEnv*, jcl builder->priority((uint8_t) priority); } +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_RenderableManager_nBuilderChannel(JNIEnv*, jclass, + jlong nativeBuilder, jint channel) { + RenderableManager::Builder *builder = (RenderableManager::Builder *) nativeBuilder; + builder->channel((uint8_t) channel); +} + extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_RenderableManager_nBuilderCulling(JNIEnv*, jclass, jlong nativeBuilder, jboolean enabled) { @@ -194,12 +209,19 @@ Java_com_google_android_filament_RenderableManager_nBuilderSkinning(JNIEnv*, jcl } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_RenderableManager_nEnableSkinningBuffers(JNIEnv*, jclass, +Java_com_google_android_filament_RenderableManager_nBuilderEnableSkinningBuffers(JNIEnv*, jclass, jlong nativeBuilder, jboolean enabled) { RenderableManager::Builder *builder = (RenderableManager::Builder *) nativeBuilder; builder->enableSkinningBuffers(enabled); } +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_RenderableManager_nBuilderFog(JNIEnv*, jclass, + jlong nativeBuilder, jboolean enabled) { + RenderableManager::Builder *builder = (RenderableManager::Builder *) nativeBuilder; + builder->fog(enabled); +} + extern "C" JNIEXPORT jint JNICALL Java_com_google_android_filament_RenderableManager_nBuilderSkinningBones(JNIEnv* env, jclass, jlong nativeBuilder, jint boneCount, jobject bones, jint remaining) { @@ -223,12 +245,18 @@ Java_com_google_android_filament_RenderableManager_nBuilderMorphing(JNIEnv*, jcl } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_RenderableManager_nBuilderSetMorphTargetBufferAt(JNIEnv*, jclass, - jlong nativeBuilder, int level, int primitiveIndex, jlong nativeMorphTargetBuffer, - int offset, int count) { +Java_com_google_android_filament_RenderableManager_nBuilderMorphingStandard(JNIEnv*, jclass, + jlong nativeBuilder, jlong nativeMorphTargetBuffer) { RenderableManager::Builder *builder = (RenderableManager::Builder *) nativeBuilder; MorphTargetBuffer *morphTargetBuffer = (MorphTargetBuffer *) nativeMorphTargetBuffer; - builder->morphing(level, primitiveIndex, morphTargetBuffer, offset, count); + builder->morphing(morphTargetBuffer); +} + +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_RenderableManager_nBuilderSetMorphTargetBufferOffsetAt(JNIEnv*, jclass, + jlong nativeBuilder, int level, int primitiveIndex, int offset) { + RenderableManager::Builder *builder = (RenderableManager::Builder *) nativeBuilder; + builder->morphing(level, primitiveIndex, offset); } extern "C" JNIEXPORT void JNICALL @@ -300,13 +328,12 @@ Java_com_google_android_filament_RenderableManager_nSetMorphWeights(JNIEnv* env, } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_RenderableManager_nSetMorphTargetBufferAt(JNIEnv*, +Java_com_google_android_filament_RenderableManager_nSetMorphTargetBufferOffsetAt(JNIEnv*, jclass, jlong nativeRenderableManager, jint i, int level, jint primitiveIndex, - jlong nativeMorphTargetBuffer, jint offset, jint count) { + jlong, jint offset) { RenderableManager *rm = (RenderableManager *) nativeRenderableManager; - MorphTargetBuffer *morphTargetBuffer = (MorphTargetBuffer *) nativeMorphTargetBuffer; - rm->setMorphTargetBufferAt((RenderableManager::Instance) i, (uint8_t) level, - (size_t) primitiveIndex, morphTargetBuffer, (size_t) offset, (size_t) count); + rm->setMorphTargetBufferOffsetAt((RenderableManager::Instance) i, (uint8_t) level, + (size_t) primitiveIndex, (size_t) offset); } extern "C" JNIEXPORT jint JNICALL @@ -339,6 +366,13 @@ Java_com_google_android_filament_RenderableManager_nSetPriority(JNIEnv*, jclass, rm->setPriority((RenderableManager::Instance) i, (uint8_t) priority); } +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_RenderableManager_nSetChannel(JNIEnv*, jclass, + jlong nativeRenderableManager, jint i, jint channel) { + RenderableManager *rm = (RenderableManager *) nativeRenderableManager; + rm->setChannel((RenderableManager::Instance) i, (uint8_t) channel); +} + extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_RenderableManager_nSetCulling(JNIEnv*, jclass, jlong nativeRenderableManager, jint i, jboolean enabled) { @@ -346,6 +380,20 @@ Java_com_google_android_filament_RenderableManager_nSetCulling(JNIEnv*, jclass, rm->setCulling((RenderableManager::Instance) i, enabled); } +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_RenderableManager_nSetFogEnabled(JNIEnv*, jclass, + jlong nativeRenderableManager, jint i, jboolean enabled) { + RenderableManager *rm = (RenderableManager *) nativeRenderableManager; + rm->setFogEnabled((RenderableManager::Instance) i, enabled); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_RenderableManager_nGetFogEnabled(JNIEnv*, jclass, + jlong nativeRenderableManager, jint i) { + RenderableManager *rm = (RenderableManager *) nativeRenderableManager; + return (jboolean)rm->getFogEnabled((RenderableManager::Instance) i); +} + extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_RenderableManager_nSetCastShadows(JNIEnv*, jclass, jlong nativeRenderableManager, jint i, jboolean enabled) { @@ -411,6 +459,13 @@ Java_com_google_android_filament_RenderableManager_nSetMaterialInstanceAt(JNIEnv materialInstance); } +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_RenderableManager_nClearMaterialInstanceAt(JNIEnv*, jclass, + jlong nativeRenderableManager, jint i, jint primitiveIndex) { + RenderableManager *rm = (RenderableManager *) nativeRenderableManager; + rm->clearMaterialInstanceAt((RenderableManager::Instance) i, (size_t) primitiveIndex); +} + extern "C" JNIEXPORT jlong JNICALL Java_com_google_android_filament_RenderableManager_nGetMaterialInstanceAt(JNIEnv*, jclass, jlong nativeRenderableManager, jint i, jint primitiveIndex) { diff --git a/android/filament-android/src/main/cpp/Renderer.cpp b/android/filament-android/src/main/cpp/Renderer.cpp index c48b616f563..0020ea21d64 100644 --- a/android/filament-android/src/main/cpp/Renderer.cpp +++ b/android/filament-android/src/main/cpp/Renderer.cpp @@ -28,6 +28,14 @@ using namespace filament; using namespace backend; + +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_Renderer_nSkipFrame(JNIEnv *, jclass, jlong nativeRenderer, + jlong vsyncSteadyClockTimeNano) { + Renderer *renderer = (Renderer *) nativeRenderer; + renderer->skipFrame(uint64_t(vsyncSteadyClockTimeNano)); +} + extern "C" JNIEXPORT jboolean JNICALL Java_com_google_android_filament_Renderer_nBeginFrame(JNIEnv *, jclass, jlong nativeRenderer, jlong nativeSwapChain, jlong frameTimeNanos) { @@ -187,3 +195,10 @@ Java_com_google_android_filament_Renderer_nSetPresentationTime(JNIEnv *, jclass Renderer *renderer = (Renderer *) nativeRenderer; renderer->setPresentationTime(monotonicClockNanos); } + +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_Renderer_nSetVsyncTime(JNIEnv *, jclass, + jlong nativeRenderer, jlong steadyClockTimeNano) { + Renderer *renderer = (Renderer *) nativeRenderer; + renderer->setVsyncTime(steadyClockTimeNano); +} diff --git a/android/filament-android/src/main/cpp/Scene.cpp b/android/filament-android/src/main/cpp/Scene.cpp index 25e6be09ba4..bfbc70d5e4c 100644 --- a/android/filament-android/src/main/cpp/Scene.cpp +++ b/android/filament-android/src/main/cpp/Scene.cpp @@ -71,6 +71,13 @@ Java_com_google_android_filament_Scene_nRemoveEntities(JNIEnv *env, jclass type, env->ReleaseIntArrayElements(entities, (jint*) nativeEntities, JNI_ABORT); } +extern "C" JNIEXPORT jint JNICALL +Java_com_google_android_filament_Scene_nGetEntityCount(JNIEnv *env, jclass type, + jlong nativeScene) { + Scene* scene = (Scene*) nativeScene; + return (jint) scene->getEntityCount(); +} + extern "C" JNIEXPORT jint JNICALL Java_com_google_android_filament_Scene_nGetRenderableCount(JNIEnv *env, jclass type, jlong nativeScene) { @@ -91,3 +98,22 @@ Java_com_google_android_filament_Scene_nHasEntity(JNIEnv *env, jclass type, jlon Entity entity = Entity::import(entityId); return (jboolean) scene->hasEntity(entity); } + +extern "C" +JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_Scene_nGetEntities(JNIEnv *env, jclass , + jlong nativeScene, jintArray outArray, jint length) { + Scene const* const scene = (Scene*) nativeScene; + if (length < scene->getEntityCount()) { + // should not happen because we already checked on the java side + return JNI_FALSE; + } + jint *out = (jint *) env->GetIntArrayElements(outArray, nullptr); + scene->forEach([out, length, i = 0](Entity entity)mutable { + if (i < length) { // this is just paranoia here + out[i++] = (jint) entity.getId(); + } + }); + env->ReleaseIntArrayElements(outArray, (jint*) out, 0); + return JNI_TRUE; +} diff --git a/android/filament-android/src/main/cpp/SwapChain.cpp b/android/filament-android/src/main/cpp/SwapChain.cpp index 0ddc85f12f9..e1424595b29 100644 --- a/android/filament-android/src/main/cpp/SwapChain.cpp +++ b/android/filament-android/src/main/cpp/SwapChain.cpp @@ -16,6 +16,7 @@ #include +#include #include #include "common/CallbackUtils.h" @@ -26,9 +27,22 @@ extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_SwapChain_nSetFrameCompletedCallback(JNIEnv* env, jclass, jlong nativeSwapChain, jobject handler, jobject runnable) { SwapChain* swapChain = (SwapChain*) nativeSwapChain; - auto *callback = JniCallback::make(env, handler, runnable); - swapChain->setFrameCompletedCallback([](void* user) { - JniCallback* callback = (JniCallback*)user; + auto* callback = JniCallback::make(env, handler, runnable); + swapChain->setFrameCompletedCallback(nullptr, [callback](SwapChain* swapChain) { JniCallback::postToJavaAndDestroy(callback); - }, callback); + }); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_SwapChain_nIsSRGBSwapChainSupported( + JNIEnv *, jclass, jlong nativeEngine) { + Engine* engine = (Engine*) nativeEngine; + return (jboolean)SwapChain::isSRGBSwapChainSupported(*engine); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_SwapChain_nIsProtectedContentSupported( + JNIEnv *, jclass, jlong nativeEngine) { + Engine* engine = (Engine*) nativeEngine; + return (jboolean)SwapChain::isProtectedContentSupported(*engine); } diff --git a/android/filament-android/src/main/cpp/Texture.cpp b/android/filament-android/src/main/cpp/Texture.cpp index bb5be8fd436..ff3fd36d269 100644 --- a/android/filament-android/src/main/cpp/Texture.cpp +++ b/android/filament-android/src/main/cpp/Texture.cpp @@ -138,6 +138,13 @@ Java_com_google_android_filament_Texture_nBuilderImportTexture(JNIEnv*, jclass, builder->import((intptr_t)id); } +extern "C" +JNIEXPORT void JNICALL +Java_com_google_android_filament_Texture_nBuilderExternal(JNIEnv*, jclass, jlong nativeBuilder) { + Texture::Builder *builder = (Texture::Builder *) nativeBuilder; + builder->external(); +} + extern "C" JNIEXPORT jlong JNICALL Java_com_google_android_filament_Texture_nBuilderBuild(JNIEnv*, jclass, jlong nativeBuilder, jlong nativeEngine) { @@ -511,9 +518,7 @@ class AutoBitmap : public JniCallback { private: void* mData = nullptr; - jobject mBitmap = nullptr; - jobject mHandler = nullptr; - jobject mCallback = nullptr; + jobject mBitmap{}; AndroidBitmapInfo mInfo{}; }; diff --git a/android/filament-android/src/main/cpp/TextureSampler.cpp b/android/filament-android/src/main/cpp/TextureSampler.cpp index 8b97aad5010..5c9b23d0d74 100644 --- a/android/filament-android/src/main/cpp/TextureSampler.cpp +++ b/android/filament-android/src/main/cpp/TextureSampler.cpp @@ -18,142 +18,139 @@ #include +#include + using namespace filament; -extern "C" JNIEXPORT jint JNICALL -Java_com_google_android_filament_TextureSampler_nCreateSampler(JNIEnv *env, jclass type, jint min, +namespace filament::JniUtils { + +jlong to_long(TextureSampler const& sampler) noexcept { + return jlong(utils::bit_cast(sampler.getSamplerParams())); +} + +TextureSampler from_long(jlong params) noexcept { + return TextureSampler{ + utils::bit_cast( + static_cast(params))}; +} + +} // namespace filament::JniUtils + +using namespace JniUtils; + +extern "C" JNIEXPORT jlong JNICALL +Java_com_google_android_filament_TextureSampler_nCreateSampler(JNIEnv *, jclass, jint min, jint max, jint s, jint t, jint r) { - return TextureSampler(static_cast(min), - static_cast(max), static_cast(s), - static_cast(t), - static_cast(r)).getSamplerParams().u; + TextureSampler sampler(static_cast(min), + static_cast(max), + static_cast(s), + static_cast(t), + static_cast(r)); + return to_long(sampler); } -extern "C" JNIEXPORT jint JNICALL -Java_com_google_android_filament_TextureSampler_nCreateCompareSampler(JNIEnv *env, jclass type, +extern "C" JNIEXPORT jlong JNICALL +Java_com_google_android_filament_TextureSampler_nCreateCompareSampler(JNIEnv *, jclass, jint mode, jint function) { - return TextureSampler(static_cast(mode), - static_cast(function)).getSamplerParams().u; + TextureSampler sampler(static_cast(mode), + static_cast(function)); + return to_long(sampler); } extern "C" JNIEXPORT jint JNICALL -Java_com_google_android_filament_TextureSampler_nGetMinFilter(JNIEnv *env, jclass type, - jint sampler_) { - TextureSampler &sampler = reinterpret_cast(sampler_); - return static_cast(sampler.getMinFilter()); +Java_com_google_android_filament_TextureSampler_nGetMinFilter(JNIEnv *, jclass, jlong sampler) { + return static_cast(from_long(sampler).getMinFilter()); } -extern "C" JNIEXPORT jint JNICALL -Java_com_google_android_filament_TextureSampler_nSetMinFilter(JNIEnv *env, jclass type, - jint sampler_, jint filter) { - TextureSampler &sampler = reinterpret_cast(sampler_); +extern "C" JNIEXPORT jlong JNICALL +Java_com_google_android_filament_TextureSampler_nSetMinFilter(JNIEnv *, jclass, jlong sampler_, jint filter) { + TextureSampler sampler{from_long(sampler_)}; sampler.setMinFilter(static_cast(filter)); - return sampler.getSamplerParams().u; + return to_long(sampler); } extern "C" JNIEXPORT jint JNICALL -Java_com_google_android_filament_TextureSampler_nGetMagFilter(JNIEnv *env, jclass type, - jint sampler_) { - TextureSampler &sampler = reinterpret_cast(sampler_); - return static_cast(sampler.getMagFilter()); +Java_com_google_android_filament_TextureSampler_nGetMagFilter(JNIEnv *, jclass, jlong sampler) { + return static_cast(from_long(sampler).getMagFilter()); } -extern "C" JNIEXPORT jint JNICALL -Java_com_google_android_filament_TextureSampler_nSetMagFilter(JNIEnv *env, jclass type, - jint sampler_, jint filter) { - TextureSampler &sampler = reinterpret_cast(sampler_); +extern "C" JNIEXPORT jlong JNICALL +Java_com_google_android_filament_TextureSampler_nSetMagFilter(JNIEnv *, jclass, jlong sampler_, jint filter) { + TextureSampler sampler{from_long(sampler_)}; sampler.setMagFilter(static_cast(filter)); - return sampler.getSamplerParams().u; + return to_long(sampler); } extern "C" JNIEXPORT jint JNICALL -Java_com_google_android_filament_TextureSampler_nGetWrapModeS(JNIEnv *env, jclass type, - jint sampler_) { - TextureSampler &sampler = reinterpret_cast(sampler_); - return static_cast(sampler.getWrapModeS()); +Java_com_google_android_filament_TextureSampler_nGetWrapModeS(JNIEnv *, jclass, jlong sampler) { + return static_cast(from_long(sampler).getWrapModeS()); } -extern "C" JNIEXPORT jint JNICALL -Java_com_google_android_filament_TextureSampler_nSetWrapModeS(JNIEnv *env, jclass type, - jint sampler_, jint mode) { - TextureSampler &sampler = reinterpret_cast(sampler_); +extern "C" JNIEXPORT jlong JNICALL +Java_com_google_android_filament_TextureSampler_nSetWrapModeS(JNIEnv *, jclass, jlong sampler_, jint mode) { + TextureSampler sampler{from_long(sampler_)}; sampler.setWrapModeS(static_cast(mode)); - return sampler.getSamplerParams().u; + return to_long(sampler); } extern "C" JNIEXPORT jint JNICALL -Java_com_google_android_filament_TextureSampler_nGetWrapModeT(JNIEnv *env, jclass type, - jint sampler_) { - TextureSampler &sampler = reinterpret_cast(sampler_); - return static_cast(sampler.getWrapModeT()); +Java_com_google_android_filament_TextureSampler_nGetWrapModeT(JNIEnv *, jclass, jlong sampler) { + return static_cast(from_long(sampler).getWrapModeT()); } -extern "C" JNIEXPORT jint JNICALL -Java_com_google_android_filament_TextureSampler_nSetWrapModeT(JNIEnv *env, jclass type, - jint sampler_, jint mode) { - TextureSampler &sampler = reinterpret_cast(sampler_); +extern "C" JNIEXPORT jlong JNICALL +Java_com_google_android_filament_TextureSampler_nSetWrapModeT(JNIEnv *, jclass, jlong sampler_, jint mode) { + TextureSampler sampler{from_long(sampler_)}; sampler.setWrapModeT(static_cast(mode)); - return sampler.getSamplerParams().u; + return to_long(sampler); } extern "C" JNIEXPORT jint JNICALL -Java_com_google_android_filament_TextureSampler_nGetWrapModeR(JNIEnv *env, jclass type, - jint sampler_) { - TextureSampler &sampler = reinterpret_cast(sampler_); - return static_cast(sampler.getWrapModeR()); +Java_com_google_android_filament_TextureSampler_nGetWrapModeR(JNIEnv *, jclass, jlong sampler) { + return static_cast(from_long(sampler).getWrapModeR()); } -extern "C" JNIEXPORT jint JNICALL -Java_com_google_android_filament_TextureSampler_nSetWrapModeR(JNIEnv *env, jclass type, - jint sampler_, jint mode) { - TextureSampler &sampler = reinterpret_cast(sampler_); +extern "C" JNIEXPORT jlong JNICALL +Java_com_google_android_filament_TextureSampler_nSetWrapModeR(JNIEnv *, jclass, jlong sampler_, jint mode) { + TextureSampler sampler{from_long(sampler_)}; sampler.setWrapModeR(static_cast(mode)); - return sampler.getSamplerParams().u; + return to_long(sampler); } extern "C" JNIEXPORT jint JNICALL -Java_com_google_android_filament_TextureSampler_nGetCompareMode(JNIEnv *env, jclass type, - jint sampler_) { - TextureSampler &sampler = reinterpret_cast(sampler_); - return static_cast(sampler.getCompareMode()); +Java_com_google_android_filament_TextureSampler_nGetCompareMode(JNIEnv *, jclass, jlong sampler) { + return static_cast(from_long(sampler).getCompareMode()); } -extern "C" JNIEXPORT jint JNICALL -Java_com_google_android_filament_TextureSampler_nSetCompareMode(JNIEnv *env, jclass type, - jint sampler_, jint mode) { - TextureSampler &sampler = reinterpret_cast(sampler_); +extern "C" JNIEXPORT jlong JNICALL +Java_com_google_android_filament_TextureSampler_nSetCompareMode(JNIEnv *, jclass, jlong sampler_, jint mode) { + TextureSampler sampler{from_long(sampler_)}; sampler.setCompareMode(static_cast(mode), sampler.getCompareFunc()); - return sampler.getSamplerParams().u; + return to_long(sampler); } extern "C" JNIEXPORT jint JNICALL -Java_com_google_android_filament_TextureSampler_nGetCompareFunction(JNIEnv *env, jclass type, - jint sampler_) { - TextureSampler &sampler = reinterpret_cast(sampler_); - return static_cast(sampler.getCompareFunc()); +Java_com_google_android_filament_TextureSampler_nGetCompareFunction(JNIEnv *, jclass, jlong sampler) { + return static_cast(from_long(sampler).getCompareFunc()); } -extern "C" JNIEXPORT jint JNICALL -Java_com_google_android_filament_TextureSampler_nSetCompareFunction(JNIEnv *env, jclass type, - jint sampler_, jint function) { - TextureSampler &sampler = reinterpret_cast(sampler_); +extern "C" JNIEXPORT jlong JNICALL +Java_com_google_android_filament_TextureSampler_nSetCompareFunction(JNIEnv *, jclass, jlong sampler_, jint function) { + TextureSampler sampler{from_long(sampler_)}; sampler.setCompareMode(sampler.getCompareMode(), static_cast(function)); - return sampler.getSamplerParams().u; + return to_long(sampler); } extern "C" JNIEXPORT jfloat JNICALL -Java_com_google_android_filament_TextureSampler_nGetAnisotropy(JNIEnv *env, jclass type, - jint sampler_) { - TextureSampler &sampler = reinterpret_cast(sampler_); - return sampler.getAnisotropy(); +Java_com_google_android_filament_TextureSampler_nGetAnisotropy(JNIEnv *, jclass, jlong sampler) { + return from_long(sampler).getAnisotropy(); } -extern "C" JNIEXPORT jint JNICALL -Java_com_google_android_filament_TextureSampler_nSetAnisotropy(JNIEnv *env, jclass type, - jint sampler_, jfloat anisotropy) { - TextureSampler &sampler = reinterpret_cast(sampler_); +extern "C" JNIEXPORT jlong JNICALL +Java_com_google_android_filament_TextureSampler_nSetAnisotropy(JNIEnv *, jclass, jlong sampler_, jfloat anisotropy) { + TextureSampler sampler{from_long(sampler_)}; sampler.setAnisotropy(anisotropy); - return sampler.getSamplerParams().u; + return to_long(sampler); } diff --git a/android/filament-android/src/main/cpp/ToneMapper.cpp b/android/filament-android/src/main/cpp/ToneMapper.cpp index ea040538cd7..860b95508bc 100644 --- a/android/filament-android/src/main/cpp/ToneMapper.cpp +++ b/android/filament-android/src/main/cpp/ToneMapper.cpp @@ -47,6 +47,16 @@ Java_com_google_android_filament_ToneMapper_nCreateFilmicToneMapper(JNIEnv*, jcl return (jlong) new FilmicToneMapper(); } +extern "C" JNIEXPORT jlong JNICALL +Java_com_google_android_filament_ToneMapper_nCreatePBRNeutralToneMapper(JNIEnv*, jclass) { + return (jlong) new PBRNeutralToneMapper(); +} + +extern "C" JNIEXPORT jlong JNICALL +Java_com_google_android_filament_ToneMapper_nCreateAgxToneMapper(JNIEnv*, jclass, jint look) { + return (jlong) new AgxToneMapper(AgxToneMapper::AgxLook(look)); +} + extern "C" JNIEXPORT jlong JNICALL Java_com_google_android_filament_ToneMapper_nCreateGenericToneMapper(JNIEnv*, jclass, jfloat contrast, jfloat midGrayIn, jfloat midGrayOut, jfloat hdrMax) { diff --git a/android/filament-android/src/main/cpp/View.cpp b/android/filament-android/src/main/cpp/View.cpp index b0609a8ba9d..f1eae2c4de6 100644 --- a/android/filament-android/src/main/cpp/View.cpp +++ b/android/filament-android/src/main/cpp/View.cpp @@ -49,6 +49,12 @@ Java_com_google_android_filament_View_nSetCamera(JNIEnv*, jclass, view->setCamera(camera); } +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_View_nHasCamera(JNIEnv*, jclass, jlong nativeView) { + View* view = (View*) nativeView; + return (jboolean)view->hasCamera(); +} + extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_View_nSetColorGrading(JNIEnv*, jclass, jlong nativeView, jlong nativeColorGrading) { @@ -216,6 +222,20 @@ Java_com_google_android_filament_View_nIsFrontFaceWindingInverted(JNIEnv*, return static_cast(view->isFrontFaceWindingInverted()); } +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_View_nSetTransparentPickingEnabled(JNIEnv*, + jclass, jlong nativeView, jboolean enabled) { + View* view = (View*) nativeView; + view->setTransparentPickingEnabled(enabled); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_View_nIsTransparentPickingEnabled(JNIEnv*, + jclass, jlong nativeView) { + View* view = (View*) nativeView; + return static_cast(view->isTransparentPickingEnabled()); +} + extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_View_nSetAmbientOcclusion(JNIEnv*, jclass, jlong nativeView, jint ordinal) { View* view = (View*) nativeView; @@ -282,7 +302,7 @@ Java_com_google_android_filament_View_nSetSSCTOptions(JNIEnv *, jclass, jlong na extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_View_nSetBloomOptions(JNIEnv*, jclass, jlong nativeView, jlong nativeTexture, - jfloat dirtStrength, jfloat strength, jint resolution, jfloat anamorphism, jint levels, + jfloat dirtStrength, jfloat strength, jint resolution, jint levels, jint blendMode, jboolean threshold, jboolean enabled, jfloat highlight, jboolean lensFlare, jboolean starburst, jfloat chromaticAberration, jint ghostCount, jfloat ghostSpacing, jfloat ghostThreshold, jfloat haloThickness, jfloat haloRadius, @@ -294,7 +314,6 @@ Java_com_google_android_filament_View_nSetBloomOptions(JNIEnv*, jclass, .dirtStrength = dirtStrength, .strength = strength, .resolution = (uint32_t)resolution, - .anamorphism = anamorphism, .levels = (uint8_t)levels, .blendMode = (View::BloomOptions::BlendMode)blendMode, .threshold = (bool)threshold, @@ -315,12 +334,14 @@ Java_com_google_android_filament_View_nSetBloomOptions(JNIEnv*, jclass, extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_View_nSetFogOptions(JNIEnv *, jclass , jlong nativeView, - jfloat distance, jfloat maximumOpacity, jfloat height, jfloat heightFalloff, jfloat r, - jfloat g, jfloat b, jfloat density, jfloat inScatteringStart, - jfloat inScatteringSize, jboolean fogColorFromIbl, jboolean enabled) { + jfloat distance, jfloat maximumOpacity, jfloat height, jfloat heightFalloff, jfloat cutOffDistance, + jfloat r, jfloat g, jfloat b, jfloat density, jfloat inScatteringStart, + jfloat inScatteringSize, jboolean fogColorFromIbl, jlong skyColorNativeObject, jboolean enabled) { View* view = (View*) nativeView; + Texture* skyColor = (Texture*) skyColorNativeObject; View::FogOptions options = { .distance = distance, + .cutOffDistance = cutOffDistance, .maximumOpacity = maximumOpacity, .height = height, .heightFalloff = heightFalloff, @@ -329,6 +350,7 @@ Java_com_google_android_filament_View_nSetFogOptions(JNIEnv *, jclass , jlong na .inScatteringStart = inScatteringStart, .inScatteringSize = inScatteringSize, .fogColorFromIbl = (bool)fogColorFromIbl, + .skyColor = skyColor, .enabled = (bool)enabled }; view->setFogOptions(options); @@ -478,6 +500,17 @@ Java_com_google_android_filament_View_nIsStencilBufferEnabled(JNIEnv *, jclass, return view->isStencilBufferEnabled(); } +extern "C" +JNIEXPORT void JNICALL +Java_com_google_android_filament_View_nSetStereoscopicOptions(JNIEnv *, jclass, jlong nativeView, + jboolean enabled) { + View* view = (View*) nativeView; + View::StereoscopicOptions options { + .enabled = (bool) enabled + }; + view->setStereoscopicOptions(options); +} + extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_View_nSetGuardBandOptions(JNIEnv *, jclass, @@ -485,3 +518,39 @@ Java_com_google_android_filament_View_nSetGuardBandOptions(JNIEnv *, jclass, View* view = (View*) nativeView; view->setGuardBandOptions({ .enabled = (bool)enabled }); } + +extern "C" +JNIEXPORT void JNICALL +Java_com_google_android_filament_View_nSetMaterialGlobal(JNIEnv * , jclass, jlong nativeView, + jint index, jfloat x, jfloat y, jfloat z, jfloat w) { + View *view = (View *) nativeView; + view->setMaterialGlobal((uint32_t)index, { x, y, z, w }); +} + +extern "C" +JNIEXPORT void JNICALL +Java_com_google_android_filament_View_nGetMaterialGlobal(JNIEnv *env, jclass clazz, + jlong nativeView, jint index, jfloatArray out_) { + jfloat* out = env->GetFloatArrayElements(out_, nullptr); + View *view = (View *) nativeView; + auto result = view->getMaterialGlobal(index); + std::copy_n(result.v, 4, out); + env->ReleaseFloatArrayElements(out_, out, 0); +} + +extern "C" +JNIEXPORT int JNICALL +Java_com_google_android_filament_View_nGetFogEntity(JNIEnv *env, jclass clazz, + jlong nativeView) { + View *view = (View *) nativeView; + return (jint)view->getFogEntity().getId(); +} + +extern "C" +JNIEXPORT void JNICALL +Java_com_google_android_filament_View_nClearFrameHistory(JNIEnv *env, jclass clazz, + jlong nativeView, jlong nativeEngine) { + View *view = (View *) nativeView; + Engine *engine = (Engine *) nativeEngine; + view->clearFrameHistory(*engine); +} diff --git a/android/filament-android/src/main/java/com/google/android/filament/ColorGrading.java b/android/filament-android/src/main/java/com/google/android/filament/ColorGrading.java index 00511ddb107..680e2585b89 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/ColorGrading.java +++ b/android/filament-android/src/main/java/com/google/android/filament/ColorGrading.java @@ -118,6 +118,7 @@ public enum LutFormat { * * @deprecated Use {@link ColorGrading.Builder#toneMapper(ToneMapper)} */ + @Deprecated public enum ToneMapping { /** Linear tone mapping (i.e. no tone mapping). */ LINEAR, @@ -231,6 +232,7 @@ public Builder toneMapper(ToneMapper toneMapper) { * * @deprecated Use {@link #toneMapper(ToneMapper)} */ + @Deprecated public Builder toneMapping(ToneMapping toneMapping) { nBuilderToneMapping(mNativeBuilder, toneMapping.ordinal()); return this; diff --git a/android/filament-android/src/main/java/com/google/android/filament/Engine.java b/android/filament-android/src/main/java/com/google/android/filament/Engine.java index c047c96224a..1e49bf54a33 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/Engine.java +++ b/android/filament-android/src/main/java/com/google/android/filament/Engine.java @@ -111,6 +111,8 @@ public class Engine { private long mNativeObject; + private Config mConfig; + @NonNull private final TransformManager mTransformManager; @NonNull private final LightManager mLightManager; @NonNull private final RenderableManager mRenderableManager; @@ -150,16 +152,348 @@ public enum FeatureLevel { FEATURE_LEVEL_0, /** OpenGL ES 3.0 features (default) */ FEATURE_LEVEL_1, + /** OpenGL ES 3.1 features + 16 textures units + cubemap arrays */ + FEATURE_LEVEL_2, /** OpenGL ES 3.1 features + 31 textures units + cubemap arrays */ - FEATURE_LEVEL_2 + FEATURE_LEVEL_3, }; - private Engine(long nativeEngine) { + /** + * The type of technique for stereoscopic rendering. (Note that the materials used will need to be + * compatible with the chosen technique.) + */ + public enum StereoscopicType { + /** No stereoscopic rendering. */ + NONE, + /** Stereoscopic rendering is performed using instanced rendering technique. */ + INSTANCED, + /** Stereoscopic rendering is performed using the multiview feature from the graphics backend. */ + MULTIVIEW, + }; + + /** + * Constructs Engine objects using a builder pattern. + */ + public static class Builder { + @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"}) + private final BuilderFinalizer mFinalizer; + private final long mNativeBuilder; + private Config mConfig; + + public Builder() { + mNativeBuilder = nCreateBuilder(); + mFinalizer = new BuilderFinalizer(mNativeBuilder); + } + + /** + * Sets the {@link Backend} for the Engine. + * + * @param backend Driver backend to use + * @return A reference to this Builder for chaining calls. + */ + public Builder backend(Backend backend) { + nSetBuilderBackend(mNativeBuilder, backend.ordinal()); + return this; + } + + /** + * Sets a sharedContext for the Engine. + * + * @param sharedContext A platform-dependant OpenGL context used as a shared context + * when creating filament's internal context. On Android this parameter + * must be an instance of {@link android.opengl.EGLContext}. + * @return A reference to this Builder for chaining calls. + */ + public Builder sharedContext(Object sharedContext) { + if (Platform.get().validateSharedContext(sharedContext)) { + nSetBuilderSharedContext(mNativeBuilder, + Platform.get().getSharedContextNativeHandle(sharedContext)); + return this; + } + throw new IllegalArgumentException("Invalid shared context " + sharedContext); + } + + /** + * Configure the Engine with custom parameters. + * + * @param config A {@link Config} object + * @return A reference to this Builder for chaining calls. + */ + public Builder config(Config config) { + mConfig = config; + nSetBuilderConfig(mNativeBuilder, config.commandBufferSizeMB, + config.perRenderPassArenaSizeMB, config.driverHandleArenaSizeMB, + config.minCommandBufferSizeMB, config.perFrameCommandsSizeMB, + config.jobSystemThreadCount, config.disableParallelShaderCompile, + config.stereoscopicType.ordinal(), config.stereoscopicEyeCount, + config.resourceAllocatorCacheSizeMB, config.resourceAllocatorCacheMaxAge, + config.disableHandleUseAfterFreeCheck, + config.preferredShaderLanguage.ordinal(), + config.forceGLES2Context, config.assertNativeWindowIsValid); + return this; + } + + /** + * Sets the initial featureLevel for the Engine. + * + * @param featureLevel The feature level at which initialize Filament. + * @return A reference to this Builder for chaining calls. + */ + public Builder featureLevel(FeatureLevel featureLevel) { + nSetBuilderFeatureLevel(mNativeBuilder, featureLevel.ordinal()); + return this; + } + + /** + * Sets the initial paused state of the rendering thread. + * + *

Warning: This is an experimental API. See {@link Engine#setPaused(boolean)} for + * caveats. + * + * @param paused Whether to start the rendering thread paused. + * @return A reference to this Builder for chaining calls. + */ + public Builder paused(boolean paused) { + nSetBuilderPaused(mNativeBuilder, paused); + return this; + } + + /** + * Set a feature flag value. This is the only way to set constant feature flags. + * @param name feature name + * @param value true to enable, false to disable + * @return A reference to this Builder for chaining calls. + */ + public Builder feature(@NonNull String name, boolean value) { + nSetBuilderFeature(mNativeBuilder, name, value); + return this; + } + + /** + * Creates an instance of Engine + * + * @return A newly created Engine, or null if the GPU driver couldn't + * be initialized, for instance if it doesn't support the right version of OpenGL or + * OpenGL ES. + * + * @exception IllegalStateException can be thrown if there isn't enough memory to + * allocate the command buffer. + */ + public Engine build() { + long nativeEngine = nBuilderBuild(mNativeBuilder); + if (nativeEngine == 0) throw new IllegalStateException("Couldn't create Engine"); + return new Engine(nativeEngine, mConfig); + } + + private static class BuilderFinalizer { + private final long mNativeObject; + + BuilderFinalizer(long nativeObject) { + mNativeObject = nativeObject; + } + + @Override + public void finalize() { + try { + super.finalize(); + } catch (Throwable t) { // Ignore + } finally { + nDestroyBuilder(mNativeObject); + } + } + } + } + + /** + * Parameters for customizing the initialization of {@link Engine}. + */ + public static class Config { + + // #defines in Engine.h + private static final long FILAMENT_PER_RENDER_PASS_ARENA_SIZE_IN_MB = 3; + private static final long FILAMENT_PER_FRAME_COMMANDS_SIZE_IN_MB = 2; + private static final long FILAMENT_MIN_COMMAND_BUFFERS_SIZE_IN_MB = 1; + private static final long FILAMENT_COMMAND_BUFFER_SIZE_IN_MB = + FILAMENT_MIN_COMMAND_BUFFERS_SIZE_IN_MB * 3; + + /** + * Size in MiB of the low-level command buffer arena. + * + * Each new command buffer is allocated from here. If this buffer is too small the program + * might terminate or rendering errors might occur. + * + * This is typically set to minCommandBufferSizeMB * 3, so that up to 3 frames can be + * batched-up at once. + * + * This value affects the application's memory usage. + */ + public long commandBufferSizeMB = FILAMENT_COMMAND_BUFFER_SIZE_IN_MB; + + /** + * Size in MiB of the per-frame data arena. + * + * This is the main arena used for allocations when preparing a frame. + * e.g.: Froxel data and high-level commands are allocated from this arena. + * + * If this size is too small, the program will abort on debug builds and have undefined + * behavior otherwise. + * + * This value affects the application's memory usage. + */ + public long perRenderPassArenaSizeMB = FILAMENT_PER_RENDER_PASS_ARENA_SIZE_IN_MB; + + /** + * Size in MiB of the backend's handle arena. + * + * Backends will fallback to slower heap-based allocations when running out of space and + * log this condition. + * + * If 0, then the default value for the given platform is used + * + * This value affects the application's memory usage. + */ + public long driverHandleArenaSizeMB = 0; + + /** + * Minimum size in MiB of a low-level command buffer. + * + * This is how much space is guaranteed to be available for low-level commands when a new + * buffer is allocated. If this is too small, the engine might have to stall to wait for + * more space to become available, this situation is logged. + * + * This value does not affect the application's memory usage. + */ + public long minCommandBufferSizeMB = FILAMENT_MIN_COMMAND_BUFFERS_SIZE_IN_MB; + + /** + * Size in MiB of the per-frame high level command buffer. + * + * This buffer is related to the number of draw calls achievable within a frame, if it is + * too small, the program will abort on debug builds and have undefined behavior otherwise. + * + * It is allocated from the 'per-render-pass arena' above. Make sure that at least 1 MiB is + * left in the per-render-pass arena when deciding the size of this buffer. + * + * This value does not affect the application's memory usage. + */ + public long perFrameCommandsSizeMB = FILAMENT_PER_FRAME_COMMANDS_SIZE_IN_MB; + + /** + * Number of threads to use in Engine's JobSystem. + * + * Engine uses a utils::JobSystem to carry out paralleization of Engine workloads. This + * value sets the number of threads allocated for JobSystem. Configuring this value can be + * helpful in CPU-constrained environments where too many threads can cause contention of + * CPU and reduce performance. + * + * The default value is 0, which implies that the Engine will use a heuristic to determine + * the number of threads to use. + */ + public long jobSystemThreadCount = 0; + + /** + * Number of most-recently destroyed textures to track for use-after-free. + * + * This will cause the backend to throw an exception when a texture is freed but still bound + * to a SamplerGroup and used in a draw call. 0 disables completely. + * + * Currently only respected by the Metal backend. + */ + public long textureUseAfterFreePoolSize = 0; + + /** + * Set to `true` to forcibly disable parallel shader compilation in the backend. + * Currently only honored by the GL backend. + * @Deprecated use "backend.disable_parallel_shader_compile" feature flag instead + */ + public boolean disableParallelShaderCompile = false; + + /** + * The type of technique for stereoscopic rendering. + * + * This setting determines the algorithm used when stereoscopic rendering is enabled. This + * decision applies to the entire Engine for the lifetime of the Engine. E.g., multiple + * Views created from the Engine must use the same stereoscopic type. + * + * Each view can enable stereoscopic rendering via the StereoscopicOptions::enable flag. + * + * @see View#setStereoscopicOptions + */ + public StereoscopicType stereoscopicType = StereoscopicType.NONE; + + /** + * The number of eyes to render when stereoscopic rendering is enabled. Supported values are + * between 1 and Engine#getMaxStereoscopicEyes() (inclusive). + * + * @see View#setStereoscopicOptions + * @see Engine#getMaxStereoscopicEyes + */ + public long stereoscopicEyeCount = 2; + + /** + * @Deprecated This value is no longer used. + */ + public long resourceAllocatorCacheSizeMB = 64; + + /** + * This value determines how many frames texture entries are kept for in the cache. This + * is a soft limit, meaning some texture older than this are allowed to stay in the cache. + * Typically only one texture is evicted per frame. + * The default is 1. + */ + public long resourceAllocatorCacheMaxAge = 1; + + /** + * Disable backend handles use-after-free checks. + * @Deprecated use "backend.disable_handle_use_after_free_check" feature flag instead + */ + public boolean disableHandleUseAfterFreeCheck = false; + + /** + * Sets a preferred shader language for Filament to use. + * + * The Metal backend supports two shader languages: MSL (Metal Shading Language) and + * METAL_LIBRARY (precompiled .metallib). This option controls which shader language is + * used when materials contain both. + * + * By default, when preferredShaderLanguage is unset, Filament will prefer METAL_LIBRARY + * shaders if present within a material, falling back to MSL. Setting + * preferredShaderLanguage to ShaderLanguage::MSL will instead instruct Filament to check + * for the presence of MSL in a material first, falling back to METAL_LIBRARY if MSL is not + * present. + * + * When using a non-Metal backend, setting this has no effect. + */ + public enum ShaderLanguage { + DEFAULT, + MSL, + METAL_LIBRARY, + }; + public ShaderLanguage preferredShaderLanguage = ShaderLanguage.DEFAULT; + + /** + * When the OpenGL ES backend is used, setting this value to true will force a GLES2.0 + * context if supported by the Platform, or if not, will have the backend pretend + * it's a GLES2 context. Ignored on other backends. + */ + public boolean forceGLES2Context = false; + + /** + * Assert the native window associated to a SwapChain is valid when calling makeCurrent(). + * This is only supported for: + * - PlatformEGLAndroid + * @Deprecated use "backend.opengl.assert_native_window_is_valid" feature flag instead + */ + public boolean assertNativeWindowIsValid = false; + } + + private Engine(long nativeEngine, Config config) { mNativeObject = nativeEngine; mTransformManager = new TransformManager(nGetTransformManager(nativeEngine)); mLightManager = new LightManager(nGetLightManager(nativeEngine)); mRenderableManager = new RenderableManager(nGetRenderableManager(nativeEngine)); mEntityManager = new EntityManager(nGetEntityManager(nativeEngine)); + mConfig = config; } /** @@ -177,9 +511,7 @@ private Engine(long nativeEngine) { */ @NonNull public static Engine create() { - long nativeEngine = nCreateEngine(0, 0); - if (nativeEngine == 0) throw new IllegalStateException("Couldn't create Engine"); - return new Engine(nativeEngine); + return new Builder().build(); } /** @@ -199,9 +531,9 @@ public static Engine create() { */ @NonNull public static Engine create(@NonNull Backend backend) { - long nativeEngine = nCreateEngine(backend.ordinal(), 0); - if (nativeEngine == 0) throw new IllegalStateException("Couldn't create Engine"); - return new Engine(nativeEngine); + return new Builder() + .backend(backend) + .build(); } /** @@ -223,13 +555,9 @@ public static Engine create(@NonNull Backend backend) { */ @NonNull public static Engine create(@NonNull Object sharedContext) { - if (Platform.get().validateSharedContext(sharedContext)) { - long nativeEngine = nCreateEngine(0, - Platform.get().getSharedContextNativeHandle(sharedContext)); - if (nativeEngine == 0) throw new IllegalStateException("Couldn't create Engine"); - return new Engine(nativeEngine); - } - throw new IllegalArgumentException("Invalid shared context " + sharedContext); + return new Builder() + .sharedContext(sharedContext) + .build(); } /** @@ -296,17 +624,23 @@ public FeatureLevel getSupportedFeatureLevel() { } /** - * Activate all features of a given feature level. By default FeatureLevel::FEATURE_LEVEL_1 is - * active. The selected feature level must not be higher than the value returned by - * getActiveFeatureLevel() and it's not possible lower the active feature level. + * Activate all features of a given feature level. If an explicit feature level is not specified + * at Engine initialization time via {@link Builder#featureLevel}, the default feature level is + * {@link FeatureLevel#FEATURE_LEVEL_0} on devices not compatible with GLES 3.0; otherwise, the + * default is {@link FeatureLevel::FEATURE_LEVEL_1}. The selected feature level must not be + * higher than the value returned by {@link #getActiveFeatureLevel} and it's not possible lower + * the active feature level. Additionally, it is not possible to modify the feature level at all + * if the Engine was initialized at {@link FeatureLevel#FEATURE_LEVEL_0}. * - * @param featureLevel the feature level to activate. If featureLevel is lower than - * getActiveFeatureLevel(), the current (higher) feature level is kept. - * If featureLevel is higher than getSupportedFeatureLevel(), an exception - * is thrown, or the program is terminated if exceptions are disabled. + * @param featureLevel the feature level to activate. If featureLevel is lower than {@link + * #getActiveFeatureLevel}, the current (higher) feature level is kept. If + * featureLevel is higher than {@link #getSupportedFeatureLevel}, or if the + * engine was initialized at feature level 0, an exception is thrown, or the + * program is terminated if exceptions are disabled. * * @return the active feature level. * + * @see Builder#featureLevel * @see #getSupportedFeatureLevel * @see #getActiveFeatureLevel */ @@ -352,6 +686,37 @@ public boolean isAutomaticInstancingEnabled() { return nIsAutomaticInstancingEnabled(getNativeObject()); } + /** + * Retrieves the configuration settings of this {@link Engine}. + * + * This method returns the configuration object that was supplied to the Engine's {@link + * Builder#config} method during the creation of this Engine. If the {@link Builder::config} + * method was not explicitly called (or called with null), this method returns the default + * configuration settings. + * + * @return a {@link Config} object with this Engine's configuration + * @see Builder#config + */ + @NonNull + public Config getConfig() { + if (mConfig == null) { + mConfig = new Config(); + } + return mConfig; + } + + /** + * Returns the maximum number of stereoscopic eyes supported by Filament. The actual number of + * eyes rendered is set at Engine creation time with the {@link Config#stereoscopicEyeCount} + * setting. + * + * @return the max number of stereoscopic eyes supported + * @see Config#stereoscopicEyeCount + */ + public long getMaxStereoscopicEyes() { + return nGetMaxStereoscopicEyes(getNativeObject()); + } + // SwapChain @@ -366,7 +731,7 @@ public boolean isAutomaticInstancingEnabled() { */ @NonNull public SwapChain createSwapChain(@NonNull Object surface) { - return createSwapChain(surface, SwapChain.CONFIG_DEFAULT); + return createSwapChain(surface, SwapChainFlags.CONFIG_DEFAULT); } /** @@ -374,15 +739,15 @@ public SwapChain createSwapChain(@NonNull Object surface) { * * @param surface on Android, must be an instance of {@link android.view.Surface} * - * @param flags configuration flags, see {@link SwapChain} + * @param flags configuration flags, see {@link SwapChainFlags} * * @return a newly created {@link SwapChain} object * * @exception IllegalStateException can be thrown if the SwapChain couldn't be created * - * @see SwapChain#CONFIG_DEFAULT - * @see SwapChain#CONFIG_TRANSPARENT - * @see SwapChain#CONFIG_READABLE + * @see SwapChainFlags#CONFIG_DEFAULT + * @see SwapChainFlags#CONFIG_TRANSPARENT + * @see SwapChainFlags#CONFIG_READABLE * */ @NonNull @@ -400,21 +765,22 @@ public SwapChain createSwapChain(@NonNull Object surface, long flags) { * * @param width width of the rendering buffer * @param height height of the rendering buffer - * @param flags configuration flags, see {@link SwapChain} + * @param flags configuration flags, see {@link SwapChainFlags} * * @return a newly created {@link SwapChain} object * * @exception IllegalStateException can be thrown if the SwapChain couldn't be created * - * @see SwapChain#CONFIG_DEFAULT - * @see SwapChain#CONFIG_TRANSPARENT - * @see SwapChain#CONFIG_READABLE + * @see SwapChainFlags#CONFIG_DEFAULT + * @see SwapChainFlags#CONFIG_TRANSPARENT + * @see SwapChainFlags#CONFIG_READABLE * */ @NonNull public SwapChain createSwapChain(int width, int height, long flags) { if (width >= 0 && height >= 0) { - long nativeSwapChain = nCreateSwapChainHeadless(getNativeObject(), width, height, flags); + long nativeSwapChain = + nCreateSwapChainHeadless(getNativeObject(), width, height, flags); if (nativeSwapChain == 0) throw new IllegalStateException("Couldn't create SwapChain"); return new SwapChain(nativeSwapChain, null); } @@ -426,11 +792,12 @@ public SwapChain createSwapChain(int width, int height, long flags) { * * @param surface a properly initialized {@link NativeSurface} * - * @param flags configuration flags, see {@link SwapChain} + * @param flags configuration flags, see {@link SwapChainFlags} * * @return a newly created {@link SwapChain} object * - * @exception IllegalStateException can be thrown if the {@link SwapChain} couldn't be created + * @exception IllegalStateException can be thrown if the {@link SwapChainFlags} couldn't be + * created */ @NonNull public SwapChain createSwapChainFromNativeSurface(@NonNull NativeSurface surface, long flags) { @@ -449,6 +816,160 @@ public void destroySwapChain(@NonNull SwapChain swapChain) { swapChain.clearNativeObject(); } + /** + * Returns whether the object is valid. + * @param object Object to check for validity + * @return returns true if the specified object is valid. + */ + public boolean isValidRenderer(@NonNull Renderer object) { + return nIsValidRenderer(getNativeObject(), object.getNativeObject()); + } + + /** + * Returns whether the object is valid. + * @param object Object to check for validity + * @return returns true if the specified object is valid. + */ + public boolean isValidView(@NonNull View object) { + return nIsValidView(getNativeObject(), object.getNativeObject()); + } + + /** + * Returns whether the object is valid. + * @param object Object to check for validity + * @return returns true if the specified object is valid. + */ + public boolean isValidScene(@NonNull Scene object) { + return nIsValidScene(getNativeObject(), object.getNativeObject()); + } + + /** + * Returns whether the object is valid. + * @param object Object to check for validity + * @return returns true if the specified object is valid. + */ + public boolean isValidFence(@NonNull Fence object) { + return nIsValidFence(getNativeObject(), object.getNativeObject()); + } + + /** + * Returns whether the object is valid. + * @param object Object to check for validity + * @return returns true if the specified object is valid. + */ + public boolean isValidStream(@NonNull Stream object) { + return nIsValidStream(getNativeObject(), object.getNativeObject()); + } + + /** + * Returns whether the object is valid. + * @param object Object to check for validity + * @return returns true if the specified object is valid. + */ + public boolean isValidIndexBuffer(@NonNull IndexBuffer object) { + return nIsValidIndexBuffer(getNativeObject(), object.getNativeObject()); + } + + /** + * Returns whether the object is valid. + * @param object Object to check for validity + * @return returns true if the specified object is valid. + */ + public boolean isValidVertexBuffer(@NonNull VertexBuffer object) { + return nIsValidVertexBuffer(getNativeObject(), object.getNativeObject()); + } + + /** + * Returns whether the object is valid. + * @param object Object to check for validity + * @return returns true if the specified object is valid. + */ + public boolean isValidSkinningBuffer(@NonNull SkinningBuffer object) { + return nIsValidSkinningBuffer(getNativeObject(), object.getNativeObject()); + } + + /** + * Returns whether the object is valid. + * @param object Object to check for validity + * @return returns true if the specified object is valid. + */ + public boolean isValidIndirectLight(@NonNull IndirectLight object) { + return nIsValidIndirectLight(getNativeObject(), object.getNativeObject()); + } + + /** + * Returns whether the object is valid. + * @param object Object to check for validity + * @return returns true if the specified object is valid. + */ + public boolean isValidMaterial(@NonNull Material object) { + return nIsValidMaterial(getNativeObject(), object.getNativeObject()); + } + + /** + * Returns whether the object is valid. + * @param ma Material + * @param mi MaterialInstance to check for validity + * @return returns true if the specified object is valid. + */ + public boolean isValidMaterialInstance(@NonNull Material ma, MaterialInstance mi) { + return nIsValidMaterialInstance(getNativeObject(), ma.getNativeObject(), mi.getNativeObject()); + } + + /** + * Returns whether the object is valid. + * @param object Object to check for validity + * @return returns true if the specified object is valid. + */ + public boolean isValidExpensiveMaterialInstance(@NonNull MaterialInstance object) { + return nIsValidExpensiveMaterialInstance(getNativeObject(), object.getNativeObject()); + } + + /** + * Returns whether the object is valid. + * @param object Object to check for validity + * @return returns true if the specified object is valid. + */ + public boolean isValidSkybox(@NonNull Skybox object) { + return nIsValidSkybox(getNativeObject(), object.getNativeObject()); + } + + /** + * Returns whether the object is valid. + * @param object Object to check for validity + * @return returns true if the specified object is valid. + */ + public boolean isValidColorGrading(@NonNull ColorGrading object) { + return nIsValidColorGrading(getNativeObject(), object.getNativeObject()); + } + + /** + * Returns whether the object is valid. + * @param object Object to check for validity + * @return returns true if the specified object is valid. + */ + public boolean isValidTexture(@NonNull Texture object) { + return nIsValidTexture(getNativeObject(), object.getNativeObject()); + } + + /** + * Returns whether the object is valid. + * @param object Object to check for validity + * @return returns true if the specified object is valid. + */ + public boolean isValidRenderTarget(@NonNull RenderTarget object) { + return nIsValidRenderTarget(getNativeObject(), object.getNativeObject()); + } + + /** + * Returns whether the object is valid. + * @param object Object to check for validity + * @return returns true if the specified object is valid. + */ + public boolean isValidSwapChain(@NonNull SwapChain object) { + return nIsValidSwapChain(getNativeObject(), object.getNativeObject()); + } + // View /** @@ -753,6 +1274,96 @@ public void flushAndWait() { nFlushAndWait(getNativeObject()); } + /** + * Kicks the hardware thread (e.g. the OpenGL, Vulkan or Metal thread) but does not wait + * for commands to be either executed or the hardware finished. + * + *

This is typically used after creating a lot of objects to start draining the command + * queue which has a limited size.

+ */ + public void flush() { + nFlush(getNativeObject()); + } + + /** + * Get paused state of rendering thread. + * + *

Warning: This is an experimental API. + * + * @see #setPaused + */ + public boolean isPaused() { + return nIsPaused(getNativeObject()); + } + + /** + * Pause or resume the rendering thread. + * + *

Warning: This is an experimental API. In particular, note the following caveats. + * + *

  • + * Buffer callbacks will never be called as long as the rendering thread is paused. + * Do not rely on a buffer callback to unpause the thread. + *
  • + * While the rendering thread is paused, rendering commands will continue to be queued until the + * buffer limit is reached. When the limit is reached, the program will abort. + *
+ */ + public void setPaused(boolean paused) { + nSetPaused(getNativeObject(), paused); + } + + /** + * Switch the command queue to unprotected mode. Protected mode can be activated via + * Renderer::beginFrame() using a protected SwapChain. + * @see Renderer + * @see SwapChain + */ + public void unprotected() { + nUnprotected(getNativeObject()); + } + + /** + * Get the current time. This is a convenience function that simply returns the + * time in nanosecond since epoch of std::chrono::steady_clock. + * @return current time in nanosecond since epoch of std::chrono::steady_clock. + * @see Renderer#beginFrame + */ + public static native long getSteadyClockTimeNano(); + + + /** + * Checks if a feature flag exists + * @param name name of the feature flag to check + * @return true if it exists false otherwise + */ + public boolean hasFeatureFlag(@NonNull String name) { + return nHasFeatureFlag(mNativeObject, name); + } + + /** + * Set the value of a non-constant feature flag. + * @param name name of the feature flag to set + * @param value value to set + * @return true if the value was set, false if the feature flag is constant or doesn't exist. + */ + public boolean setFeatureFlag(@NonNull String name, boolean value) { + return nSetFeatureFlag(mNativeObject, name, value); + } + + /** + * Retrieves the value of any feature flag. + * @param name name of the feature flag + * @return the value of the flag if it exists + * @exception IllegalArgumentException is thrown if the feature flag doesn't exist + */ + public boolean getFeatureFlag(@NonNull String name) { + if (!hasFeatureFlag(name)) { + throw new IllegalArgumentException("The feature flag \"" + name + "\" doesn't exist"); + } + return nGetFeatureFlag(mNativeObject, name); + } + @UsedByReflection("TextureHelper.java") public long getNativeObject() { if (mNativeObject == 0) { @@ -779,23 +1390,22 @@ private static void assertDestroy(boolean success) { } } - private static native long nCreateEngine(long backend, long sharedContext); private static native void nDestroyEngine(long nativeEngine); private static native long nGetBackend(long nativeEngine); private static native long nCreateSwapChain(long nativeEngine, Object nativeWindow, long flags); private static native long nCreateSwapChainHeadless(long nativeEngine, int width, int height, long flags); private static native long nCreateSwapChainFromRawPointer(long nativeEngine, long pointer, long flags); - private static native boolean nDestroySwapChain(long nativeEngine, long nativeSwapChain); private static native long nCreateView(long nativeEngine); - private static native boolean nDestroyView(long nativeEngine, long nativeView); private static native long nCreateRenderer(long nativeEngine); - private static native boolean nDestroyRenderer(long nativeEngine, long nativeRenderer); private static native long nCreateCamera(long nativeEngine, int entity); private static native long nGetCameraComponent(long nativeEngine, int entity); private static native void nDestroyCameraComponent(long nativeEngine, int entity); private static native long nCreateScene(long nativeEngine); - private static native boolean nDestroyScene(long nativeEngine, long nativeScene); private static native long nCreateFence(long nativeEngine); + + private static native boolean nDestroyRenderer(long nativeEngine, long nativeRenderer); + private static native boolean nDestroyView(long nativeEngine, long nativeView); + private static native boolean nDestroyScene(long nativeEngine, long nativeScene); private static native boolean nDestroyFence(long nativeEngine, long nativeFence); private static native boolean nDestroyStream(long nativeEngine, long nativeStream); private static native boolean nDestroyIndexBuffer(long nativeEngine, long nativeIndexBuffer); @@ -808,8 +1418,30 @@ private static void assertDestroy(boolean success) { private static native boolean nDestroyColorGrading(long nativeEngine, long nativeColorGrading); private static native boolean nDestroyTexture(long nativeEngine, long nativeTexture); private static native boolean nDestroyRenderTarget(long nativeEngine, long nativeTarget); + private static native boolean nDestroySwapChain(long nativeEngine, long nativeSwapChain); + private static native boolean nIsValidRenderer(long nativeEngine, long nativeRenderer); + private static native boolean nIsValidView(long nativeEngine, long nativeView); + private static native boolean nIsValidScene(long nativeEngine, long nativeScene); + private static native boolean nIsValidFence(long nativeEngine, long nativeFence); + private static native boolean nIsValidStream(long nativeEngine, long nativeStream); + private static native boolean nIsValidIndexBuffer(long nativeEngine, long nativeIndexBuffer); + private static native boolean nIsValidVertexBuffer(long nativeEngine, long nativeVertexBuffer); + private static native boolean nIsValidSkinningBuffer(long nativeEngine, long nativeSkinningBuffer); + private static native boolean nIsValidIndirectLight(long nativeEngine, long nativeIndirectLight); + private static native boolean nIsValidMaterial(long nativeEngine, long nativeMaterial); + private static native boolean nIsValidMaterialInstance(long nativeEngine, long nativeMaterial, long nativeMaterialInstance); + private static native boolean nIsValidExpensiveMaterialInstance(long nativeEngine, long nativeMaterialInstance); + private static native boolean nIsValidSkybox(long nativeEngine, long nativeSkybox); + private static native boolean nIsValidColorGrading(long nativeEngine, long nativeColorGrading); + private static native boolean nIsValidTexture(long nativeEngine, long nativeTexture); + private static native boolean nIsValidRenderTarget(long nativeEngine, long nativeTarget); + private static native boolean nIsValidSwapChain(long nativeEngine, long nativeSwapChain); private static native void nDestroyEntity(long nativeEngine, int entity); private static native void nFlushAndWait(long nativeEngine); + private static native void nFlush(long nativeEngine); + private static native boolean nIsPaused(long nativeEngine); + private static native void nSetPaused(long nativeEngine, boolean paused); + private static native void nUnprotected(long nativeEngine); private static native long nGetTransformManager(long nativeEngine); private static native long nGetLightManager(long nativeEngine); private static native long nGetRenderableManager(long nativeEngine); @@ -817,7 +1449,28 @@ private static void assertDestroy(boolean success) { private static native long nGetEntityManager(long nativeEngine); private static native void nSetAutomaticInstancingEnabled(long nativeEngine, boolean enable); private static native boolean nIsAutomaticInstancingEnabled(long nativeEngine); + private static native long nGetMaxStereoscopicEyes(long nativeEngine); private static native int nGetSupportedFeatureLevel(long nativeEngine); private static native int nSetActiveFeatureLevel(long nativeEngine, int ordinal); private static native int nGetActiveFeatureLevel(long nativeEngine); + private static native boolean nHasFeatureFlag(long nativeEngine, String name); + private static native boolean nSetFeatureFlag(long nativeEngine, String name, boolean value); + private static native boolean nGetFeatureFlag(long nativeEngine, String name); + + private static native long nCreateBuilder(); + private static native void nDestroyBuilder(long nativeBuilder); + private static native void nSetBuilderBackend(long nativeBuilder, long backend); + private static native void nSetBuilderConfig(long nativeBuilder, long commandBufferSizeMB, + long perRenderPassArenaSizeMB, long driverHandleArenaSizeMB, + long minCommandBufferSizeMB, long perFrameCommandsSizeMB, long jobSystemThreadCount, + boolean disableParallelShaderCompile, int stereoscopicType, long stereoscopicEyeCount, + long resourceAllocatorCacheSizeMB, long resourceAllocatorCacheMaxAge, + boolean disableHandleUseAfterFreeCheck, + int preferredShaderLanguage, + boolean forceGLES2Context, boolean assertNativeWindowIsValid); + private static native void nSetBuilderFeatureLevel(long nativeBuilder, int ordinal); + private static native void nSetBuilderSharedContext(long nativeBuilder, long sharedContext); + private static native void nSetBuilderPaused(long nativeBuilder, boolean paused); + private static native void nSetBuilderFeature(long nativeBuilder, String name, boolean value); + private static native long nBuilderBuild(long nativeBuilder); } diff --git a/android/filament-android/src/main/java/com/google/android/filament/LightManager.java b/android/filament-android/src/main/java/com/google/android/filament/LightManager.java index 1c0ce0b0978..bc930d7c6cf 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/LightManager.java +++ b/android/filament-android/src/main/java/com/google/android/filament/LightManager.java @@ -258,6 +258,7 @@ public static class ShadowOptions { * shadows that are too far and wouldn't contribute to the scene much, improving * performance and quality. This value is always positive. * Use 0.0f to use the camera far distance. + * This only affect directional lights. */ public float shadowFar = 0.0f; @@ -368,6 +369,17 @@ public static class ShadowOptions { * enabled. (2cm by default). */ public float shadowBulbRadius = 0.02f; + + /** + * Transforms the shadow direction. Must be a unit quaternion. + * The default is identity. + * Ignored if the light type isn't directional. For artistic use. Use with caution. + * The quaternion is stored as the imaginary part in the first 3 elements and the real + * part in the last element of the transform array. + */ + @NonNull + @Size(min = 4, max = 4) + public float[] transform = { 0.0f, 0.0f, 0.0f, 1.0f }; } public static class ShadowCascades { @@ -506,7 +518,7 @@ public Builder shadowOptions(@NonNull ShadowOptions options) { options.polygonOffsetConstant, options.polygonOffsetSlope, options.screenSpaceContactShadows, options.stepCount, options.maxShadowDistance, - options.elvsm, options.blurWidth, options.shadowBulbRadius); + options.elvsm, options.blurWidth, options.shadowBulbRadius, options.transform); return this; } @@ -1169,7 +1181,7 @@ private static native void nBuilderShadowOptions(long nativeBuilder, int mapSize boolean stable, boolean lispsm, float polygonOffsetConstant, float polygonOffsetSlope, boolean screenSpaceContactShadows, int stepCount, float maxShadowDistance, - boolean elvsm, float blurWidth, float shadowBulbRadius); + boolean elvsm, float blurWidth, float shadowBulbRadius, float[] transform); private static native void nBuilderCastLight(long nativeBuilder, boolean enabled); private static native void nBuilderPosition(long nativeBuilder, float x, float y, float z); private static native void nBuilderDirection(long nativeBuilder, float x, float y, float z); diff --git a/android/filament-android/src/main/java/com/google/android/filament/Material.java b/android/filament-android/src/main/java/com/google/android/filament/Material.java index 54aeca69e71..b304f8a6ab7 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/Material.java +++ b/android/filament-android/src/main/java/com/google/android/filament/Material.java @@ -18,9 +18,11 @@ import androidx.annotation.IntRange; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.Size; import com.google.android.filament.proguard.UsedByNative; +import com.google.android.filament.Engine.FeatureLevel; import java.nio.Buffer; import java.util.ArrayList; @@ -46,6 +48,8 @@ private EnumCache() { } static final BlendingMode[] sBlendingModeValues = BlendingMode.values(); static final RefractionMode[] sRefractionModeValues = RefractionMode.values(); static final RefractionType[] sRefractionTypeValues = RefractionType.values(); + static final ReflectionMode[] sReflectionModeValues = ReflectionMode.values(); + static final FeatureLevel[] sFeatureLevelValues = FeatureLevel.values(); static final VertexDomain[] sVertexDomainValues = VertexDomain.values(); static final CullingMode[] sCullingModeValues = CullingMode.values(); static final VertexBuffer.VertexAttribute[] sVertexAttributeValues = @@ -181,6 +185,18 @@ public enum RefractionType { THIN } + /** + * Supported reflection modes + * + * @see + * + * Lighting: reflections + */ + public enum ReflectionMode { + DEFAULT, + SCREEN_SPACE + } + /** * Supported types of vertex domains * @@ -223,6 +239,31 @@ public enum CullingMode { FRONT_AND_BACK } + public enum CompilerPriorityQueue { + HIGH, + LOW + } + + public static class UserVariantFilterBit { + /** Directional lighting */ + public static int DIRECTIONAL_LIGHTING = 0x01; + /** Dynamic lighting */ + public static int DYNAMIC_LIGHTING = 0x02; + /** Shadow receiver */ + public static int SHADOW_RECEIVER = 0x04; + /** Skinning */ + public static int SKINNING = 0x08; + /** Fog */ + public static int FOG = 0x10; + /** Variance shadow maps */ + public static int VSM = 0x20; + /** Screen-space reflections */ + public static int SSR = 0x40; + /** Instanced stereo rendering */ + public static int STE = 0x80; + public static int ALL = 0xFF; + } + @UsedByNative("Material.cpp") public static class Parameter { private static final Type[] sTypeValues = Type.values(); @@ -303,8 +344,18 @@ public Material(long nativeMaterial) { } public static class Builder { + public enum ShadowSamplingQuality { + /** 2x2 PCF */ + HARD, + /** 3x3 gaussian filter */ + LOW, + } + private Buffer mBuffer; private int mSize; + private int mShBandCount = 0; + private ShadowSamplingQuality mShadowSamplingQuality = ShadowSamplingQuality.LOW; + /** * Specifies the material data. The material data is a binary blob produced by @@ -320,6 +371,34 @@ public Builder payload(@NonNull Buffer buffer, @IntRange(from = 0) int size) { return this; } + /** + * Sets the quality of the indirect lights computations. This is only taken into account + * if this material is lit and in the surface domain. This setting will affect the + * IndirectLight computation if one is specified on the Scene and Spherical Harmonics + * are used for the irradiance. + * + * @param shBandCount Number of spherical harmonic bands. Must be 1, 2 or 3 (default). + * @return Reference to this Builder for chaining calls. + * @see IndirectLight + */ + @NonNull + public Builder sphericalHarmonicsBandCount(@IntRange(from = 0) int shBandCount) { + mShBandCount = shBandCount; + return this; + } + + /** + * Set the quality of shadow sampling. This is only taken into account + * if this material is lit and in the surface domain. + * @param quality + * @return Reference to this Builder for chaining calls. + */ + @NonNull + public Builder shadowSamplingQuality(ShadowSamplingQuality quality) { + mShadowSamplingQuality = quality; + return this; + } + /** * Creates and returns the Material object. * @@ -331,12 +410,62 @@ public Builder payload(@NonNull Buffer buffer, @IntRange(from = 0) int size) { */ @NonNull public Material build(@NonNull Engine engine) { - long nativeMaterial = nBuilderBuild(engine.getNativeObject(), mBuffer, mSize); + long nativeMaterial = nBuilderBuild(engine.getNativeObject(), + mBuffer, mSize, mShBandCount, mShadowSamplingQuality.ordinal()); if (nativeMaterial == 0) throw new IllegalStateException("Couldn't create Material"); return new Material(nativeMaterial); } } + + /** + * Asynchronously ensures that a subset of this Material's variants are compiled. After issuing + * several compile() calls in a row, it is recommended to call {@link Engine#flush} + * such that the backend can start the compilation work as soon as possible. + * The provided callback is guaranteed to be called on the main thread after all specified + * variants of the material are compiled. This can take hundreds of milliseconds. + *

+ * If all the material's variants are already compiled, the callback will be scheduled as + * soon as possible, but this might take a few dozen millisecond, corresponding to how + * many previous frames are enqueued in the backend. This also varies by backend. Therefore, + * it is recommended to only call this method once per material shortly after creation. + *

+ *

+ * If the same variant is scheduled for compilation multiple times, the first scheduling + * takes precedence; later scheduling are ignored. + *

+ *

+ * caveat: A consequence is that if a variant is scheduled on the low priority queue and later + * scheduled again on the high priority queue, the later scheduling is ignored. + * Therefore, the second callback could be called before the variant is compiled. + * However, the first callback, if specified, will trigger as expected. + *

+ *

+ * The callback is guaranteed to be called. If the engine is destroyed while some material + * variants are still compiling or in the queue, these will be discarded and the corresponding + * callback will be called. In that case however the Material pointer passed to the callback + * is guaranteed to be invalid (either because it's been destroyed by the user already, or, + * because it's been cleaned-up by the Engine). + *

+ *

+ * {@link UserVariantFilterBit#ALL} should be used with caution. Only variants that an application + * needs should be included in the variants argument. For example, the STE variant is only used + * for stereoscopic rendering. If an application is not planning to render in stereo, this bit + * should be turned off to avoid unnecessary material compilations. + *

+ * @param priority Which priority queue to use, LOW or HIGH. + * @param variants Variants to include to the compile command. + * @param handler An {@link java.util.concurrent.Executor Executor}. On Android this can also be a {@link android.os.Handler Handler}. + * @param callback callback called on the main thread when the compilation is done on + * by backend. + */ + public void compile(@NonNull CompilerPriorityQueue priority, + int variants, + @Nullable Object handler, + @Nullable Runnable callback) { + nCompile(getNativeObject(), priority.ordinal(), variants, handler, callback); + } + /** * Creates a new instance of this material. Material instances should be freed using * {@link Engine#destroyMaterialInstance(MaterialInstance)}. @@ -437,6 +566,28 @@ public RefractionType getRefractionType() { return EnumCache.sRefractionTypeValues[nGetRefractionType(getNativeObject())]; } + /** + * Returns the reflection mode of this material. + * + * @see + * + * Lighting: reflections + */ + public ReflectionMode getReflectionMode() { + return EnumCache.sReflectionModeValues[nGetReflectionMode(getNativeObject())]; + } + + /** + * Returns the minimum required feature level for this material. + * + * @see + * + * General: featureLevel + */ + public FeatureLevel getFeatureLevel() { + return EnumCache.sFeatureLevelValues[nGetFeatureLevel(getNativeObject())]; + } + /** * Returns the vertex domain of this material. * @@ -503,6 +654,17 @@ public boolean isDoubleSided() { return nIsDoubleSided(getNativeObject()); } + /** + * Indicates whether instances of this material will use alpha to coverage. + * + * @see + * + * Rasterization: alphaToCoverage + */ + public boolean isAlphaToCoverageEnabled() { + return nIsAlphaToCoverageEnabled(getNativeObject()); + } + /** * Returns the alpha mask threshold used when the blending mode is set to masked. * @@ -900,11 +1062,12 @@ void clearNativeObject() { mNativeObject = 0; } - private static native long nBuilderBuild(long nativeEngine, @NonNull Buffer buffer, int size); + private static native long nBuilderBuild(long nativeEngine, @NonNull Buffer buffer, int size, int shBandCount, int shadowQuality); private static native long nCreateInstance(long nativeMaterial); private static native long nCreateInstanceWithName(long nativeMaterial, @NonNull String name); private static native long nGetDefaultInstance(long nativeMaterial); + private static native void nCompile(long nativeMaterial, int priority, int variants, Object handler, Runnable runnable); private static native String nGetName(long nativeMaterial); private static native int nGetShading(long nativeMaterial); private static native int nGetInterpolation(long nativeMaterial); @@ -915,11 +1078,14 @@ void clearNativeObject() { private static native boolean nIsDepthWriteEnabled(long nativeMaterial); private static native boolean nIsDepthCullingEnabled(long nativeMaterial); private static native boolean nIsDoubleSided(long nativeMaterial); + private static native boolean nIsAlphaToCoverageEnabled(long nativeMaterial); private static native float nGetMaskThreshold(long nativeMaterial); private static native float nGetSpecularAntiAliasingVariance(long nativeMaterial); private static native float nGetSpecularAntiAliasingThreshold(long nativeMaterial); private static native int nGetRefractionMode(long nativeMaterial); private static native int nGetRefractionType(long nativeMaterial); + private static native int nGetReflectionMode(long nativeMaterial); + private static native int nGetFeatureLevel(long nativeMaterial); private static native int nGetParameterCount(long nativeMaterial); diff --git a/android/filament-android/src/main/java/com/google/android/filament/MaterialInstance.java b/android/filament-android/src/main/java/com/google/android/filament/MaterialInstance.java index bde26df5ac1..389999b7d8e 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/MaterialInstance.java +++ b/android/filament-android/src/main/java/com/google/android/filament/MaterialInstance.java @@ -625,6 +625,15 @@ public void setDepthCulling(boolean enable) { nSetDepthCulling(getNativeObject(), enable); } + /** + * Sets the depth comparison function (default is {@link TextureSampler.CompareFunction#GE}). + * + * @param func the depth comparison function + */ + public void setDepthFunc(TextureSampler.CompareFunction func) { + nSetDepthFunc(getNativeObject(), func.ordinal()); + } + /** * Returns whether depth culling is enabled. */ @@ -632,6 +641,13 @@ public boolean isDepthCullingEnabled() { return nIsDepthCullingEnabled(getNativeObject()); } + /** + * Returns the depth comparison function. + */ + public TextureSampler.CompareFunction getDepthFunc() { + return TextureSampler.EnumCache.sCompareFunctionValues[nGetDepthFunc(getNativeObject())]; + } + /** * Sets the stencil comparison function (default is {@link TextureSampler.CompareFunction#ALWAYS}). * @@ -884,7 +900,7 @@ private static native void nSetFloatParameterArray(long nativeMaterialInstance, @IntRange(from = 0) int offset, @IntRange(from = 1) int count); private static native void nSetParameterTexture(long nativeMaterialInstance, - @NonNull String name, long nativeTexture, int sampler); + @NonNull String name, long nativeTexture, long sampler); private static native void nSetScissor(long nativeMaterialInstance, @IntRange(from = 0) int left, @IntRange(from = 0) int bottom, @@ -908,6 +924,7 @@ private static native void nSetSpecularAntiAliasingThreshold(long nativeMaterial private static native void nSetDepthWrite(long nativeMaterialInstance, boolean enable); private static native void nSetStencilWrite(long nativeMaterialInstance, boolean enable); private static native void nSetDepthCulling(long nativeMaterialInstance, boolean enable); + private static native void nSetDepthFunc(long nativeMaterialInstance, long function); private static native void nSetStencilCompareFunction(long nativeMaterialInstance, long function, long face); @@ -939,4 +956,5 @@ private static native void nSetStencilWriteMask(long nativeMaterialInstance, int private static native boolean nIsDepthWriteEnabled(long nativeMaterialInstance); private static native boolean nIsStencilWriteEnabled(long nativeMaterialInstance); private static native boolean nIsDepthCullingEnabled(long nativeMaterialInstance); + private static native int nGetDepthFunc(long nativeMaterialInstance); } diff --git a/android/filament-android/src/main/java/com/google/android/filament/MorphTargetBuffer.java b/android/filament-android/src/main/java/com/google/android/filament/MorphTargetBuffer.java index f82ca4780b0..619870d372d 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/MorphTargetBuffer.java +++ b/android/filament-android/src/main/java/com/google/android/filament/MorphTargetBuffer.java @@ -74,7 +74,7 @@ public Builder count(@IntRange(from = 1) int count) { * * @exception IllegalStateException if the MorphTargetBuffer could not be created * - * @see #setMorphTargetBufferAt + * @see #setMorphTargetBufferOffsetAt */ @NonNull public MorphTargetBuffer build(@NonNull Engine engine) { diff --git a/android/filament-android/src/main/java/com/google/android/filament/RenderTarget.java b/android/filament-android/src/main/java/com/google/android/filament/RenderTarget.java index 2485f5c64e7..f7ebda4400e 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/RenderTarget.java +++ b/android/filament-android/src/main/java/com/google/android/filament/RenderTarget.java @@ -81,8 +81,6 @@ public Builder() { /** * Sets a texture to a given attachment point. * - *

All RenderTargets must have a non-null COLOR attachment.

- * * @param attachment The attachment point of the texture. * @param texture The associated texture object. * @return A reference to this Builder for chaining calls. diff --git a/android/filament-android/src/main/java/com/google/android/filament/RenderableManager.java b/android/filament-android/src/main/java/com/google/android/filament/RenderableManager.java index ddb2cce5cac..81053197c55 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/RenderableManager.java +++ b/android/filament-android/src/main/java/com/google/android/filament/RenderableManager.java @@ -175,6 +175,32 @@ public Builder geometry(@IntRange(from = 0) int index, @NonNull PrimitiveType ty return this; } + /** + * Type of geometry for a Renderable + */ + public enum GeometryType { + /** dynamic gemoetry has no restriction */ + DYNAMIC, + /** bounds and world space transform are immutable */ + STATIC_BOUNDS, + /** skinning/morphing not allowed and Vertex/IndexBuffer immutables */ + STATIC + } + + /** + * Specify whether this renderable has static bounds. In this context his means that + * the renderable's bounding box cannot change and that the renderable's transform is + * assumed immutable. Changing the renderable's transform via the TransformManager + * can lead to corrupted graphics. Note that skinning and morphing are not forbidden. + * Disabled by default. + * @param enable whether this renderable has static bounds. false by default. + */ + @NonNull + public Builder geometryType(GeometryType type) { + nBuilderGeometryType(mNativeBuilder, type.ordinal()); + return this; + } + /** * Binds a material instance to the specified primitive. * @@ -257,23 +283,79 @@ public Builder layerMask(@IntRange(from = 0, to = 255) int select, * Provides coarse-grained control over draw order. * *

In general Filament reserves the right to re-order renderables to allow for efficient - * rendering. However clients can control ordering at a coarse level using priority.

+ * rendering. However clients can control ordering at a coarse level using \em priority. + * The priority is applied separately for opaque and translucent objects, that is, opaque + * objects are always drawn before translucent objects regardless of the priority.

* *

For example, this could be used to draw a semitransparent HUD, if a client wishes to * avoid using a separate View for the HUD. Note that priority is completely orthogonal to * {@link Builder#layerMask}, which merely controls visibility.

+ + *

The Skybox always using the lowest priority, so it's drawn last, which may improve + * performance.

* *

The priority is clamped to the range [0..7], defaults to 4; 7 is lowest priority * (rendered last).

* * @see Builder#blendOrder */ + + /** + * Provides coarse-grained control over draw order. + * + *

In general Filament reserves the right to re-order renderables to allow for efficient + * rendering. However clients can control ordering at a coarse level using priority. + * The priority is applied separately for opaque and translucent objects, that is, opaque + * objects are always drawn before translucent objects regardless of the priority.

+ * + *

For example, this could be used to draw a semitransparent HUD, if a client wishes to + * avoid using a separate View for the HUD. Note that priority is completely orthogonal to + * {@link Builder#layerMask}, which merely controls visibility.

+ + *

The Skybox always using the lowest priority, so it's drawn last, which may improve + * performance.

+ * + * @param priority clamped to the range [0..7], defaults to 4; 7 is lowest priority + * (rendered last). + * + * @return Builder reference for chaining calls. + * + * @see Builder#channel + * @see Builder#blendOrder + * @see #setPriority + * @see #setBlendOrderAt + */ @NonNull public Builder priority(@IntRange(from = 0, to = 7) int priority) { nBuilderPriority(mNativeBuilder, priority); return this; } + /** + * Set the channel this renderable is associated to. There can be 4 channels. + * + *

All renderables in a given channel are rendered together, regardless of anything else. + * They are sorted as usual within a channel.

+ *

Channels work similarly to priorities, except that they enforce the strongest + * ordering.

+ * + *

Channels 0 and 1 may not have render primitives using a material with `refractionType` + * set to `screenspace`.

+ * + * @param channel clamped to the range [0..3], defaults to 2. + * + * @return Builder reference for chaining calls. + * + * @see Builder::blendOrder() + * @see Builder::priority() + * @see RenderableManager::setBlendOrderAt() + */ + @NonNull + public Builder channel(@IntRange(from = 0, to = 3) int channel) { + nBuilderChannel(mNativeBuilder, channel); + return this; + } + /** * Controls frustum culling, true by default. * @@ -300,16 +382,16 @@ public Builder lightChannel(@IntRange(from = 0, to = 7) int channel, boolean ena /** * Specifies the number of draw instance of this renderable. The default is 1 instance and - * the maximum number of instances allowed is 65535. 0 is invalid. + * the maximum number of instances allowed is 32767. 0 is invalid. * All instances are culled using the same bounding box, so care must be taken to make * sure all instances render inside the specified bounding box. * The material can use getInstanceIndex() in the vertex shader to get the instance index and * possibly adjust the position or transform. * - * @param instanceCount the number of instances silently clamped between 1 and 65535. + * @param instanceCount the number of instances silently clamped between 1 and 32767. */ @NonNull - public Builder instances(@IntRange(from = 1, to = 65535) int instanceCount) { + public Builder instances(@IntRange(from = 1, to = 32767) int instanceCount) { nBuilderInstances(mNativeBuilder, instanceCount); return this; } @@ -361,7 +443,19 @@ public Builder screenSpaceContactShadows(boolean enabled) { */ @NonNull public Builder enableSkinningBuffers(boolean enabled) { - nEnableSkinningBuffers(mNativeBuilder, enabled); + nBuilderEnableSkinningBuffers(mNativeBuilder, enabled); + return this; + } + + /** + * Controls if this renderable is affected by the large-scale fog. + * @param enabled If true, enables large-scale fog on this object. Disables it otherwise. + * True by default. + * @return this Builder object for chaining calls + */ + @NonNull + public Builder fog(boolean enabled) { + nBuilderFog(mNativeBuilder, enabled); return this; } @@ -430,14 +524,7 @@ public Builder skinning(@IntRange(from = 0, to = 255) int boneCount, @NonNull Bu } /** - * Controls if the renderable has vertex morphing targets, zero by default. This is - * required to enable GPU morphing. - * - *

Filament supports two morphing modes: standard (default) and legacy.

- * - *

For standard morphing, A {@link MorphTargetBuffer} must be created and provided via - * {@link RenderableManager#setMorphTargetBufferAt}. Standard morphing supports up to - * CONFIG_MAX_MORPH_TARGET_COUNT morph targets.

+ * Controls if the renderable has legacy vertex morphing targets, zero by default. * * For legacy morphing, the attached {@link VertexBuffer} must provide data in the * appropriate {@link VertexBuffer.VertexAttribute} slots (MORPH_POSITION_0 etc). @@ -455,6 +542,22 @@ public Builder morphing(@IntRange(from = 0, to = 255) int targetCount) { return this; } + /** + * Controls if the renderable has vertex morphing targets, zero by default. + * + *

For standard morphing, A {@link MorphTargetBuffer} must be provided. + * Standard morphing supports up to + * CONFIG_MAX_MORPH_TARGET_COUNT morph targets.

+ * + *

See also {@link RenderableManager#setMorphWeights}, which can be called on a per-frame basis + * to advance the animation.

+ */ + @NonNull + public Builder morphing(@NonNull MorphTargetBuffer morphTargetBuffer) { + nBuilderMorphingStandard(mNativeBuilder, morphTargetBuffer.getNativeObject()); + return this; + } + /** * Specifies the morph target buffer for a primitive. * @@ -466,31 +569,13 @@ public Builder morphing(@IntRange(from = 0, to = 255) int targetCount) { * * @param level the level of detail (lod), only 0 can be specified * @param primitiveIndex zero-based index of the primitive, must be less than the count passed to Builder constructor - * @param morphTargetBuffer specifies the morph target buffer * @param offset specifies where in the morph target buffer to start reading (expressed as a number of vertices) - * @param count number of vertices in the morph target buffer to read, must equal the geometry's count (for triangles, this should be a multiple of 3) */ @NonNull public Builder morphing(@IntRange(from = 0) int level, @IntRange(from = 0) int primitiveIndex, - @NonNull MorphTargetBuffer morphTargetBuffer, - @IntRange(from = 0) int offset, - @IntRange(from = 0) int count) { - nBuilderSetMorphTargetBufferAt(mNativeBuilder, level, primitiveIndex, - morphTargetBuffer.getNativeObject(), offset, count); - return this; - } - - /** - * Utility method to specify morph target buffer for a primitive. - * For details, see the {@link RenderableManager.Builder#morphing}. - */ - @NonNull - public Builder morphing(@IntRange(from = 0) int level, - @IntRange(from = 0) int primitiveIndex, - @NonNull MorphTargetBuffer morphTargetBuffer) { - nBuilderSetMorphTargetBufferAt(mNativeBuilder, level, primitiveIndex, - morphTargetBuffer.getNativeObject(), 0, morphTargetBuffer.getVertexCount()); + @IntRange(from = 0) int offset) { + nBuilderSetMorphTargetBufferOffsetAt(mNativeBuilder, level, primitiveIndex, offset); return this; } @@ -593,26 +678,11 @@ public void setMorphWeights(@EntityInstance int i, @NonNull float[] weights, @In * * @see Builder#morphing */ - public void setMorphTargetBufferAt(@EntityInstance int i, - @IntRange(from = 0) int level, - @IntRange(from = 0) int primitiveIndex, - @NonNull MorphTargetBuffer morphTargetBuffer, - @IntRange(from = 0) int offset, - @IntRange(from = 0) int count) { - nSetMorphTargetBufferAt(mNativeObject, i, level, primitiveIndex, - morphTargetBuffer.getNativeObject(), offset, count); - } - - /** - * Utility method to change morph target buffer for the given primitive. - * For details, see the {@link RenderableManager#setMorphTargetBufferAt}. - */ - public void setMorphTargetBufferAt(@EntityInstance int i, + public void setMorphTargetBufferOffsetAt(@EntityInstance int i, @IntRange(from = 0) int level, @IntRange(from = 0) int primitiveIndex, - @NonNull MorphTargetBuffer morphTargetBuffer) { - nSetMorphTargetBufferAt(mNativeObject, i, level, primitiveIndex, - morphTargetBuffer.getNativeObject(), 0, morphTargetBuffer.getVertexCount()); + @IntRange(from = 0) int offset) { + nSetMorphTargetBufferOffsetAt(mNativeObject, i, level, primitiveIndex, 0, offset); } /** @@ -655,6 +725,15 @@ public void setPriority(@EntityInstance int i, @IntRange(from = 0, to = 7) int p nSetPriority(mNativeObject, i, priority); } + /** + * Changes the channel of a renderable + * + * @see Builder#channel + */ + public void setChannel(@EntityInstance int i, @IntRange(from = 0, to = 3) int channel) { + nSetChannel(mNativeObject, i, channel); + } + /** * Changes whether or not frustum culling is on. * @@ -664,6 +743,23 @@ public void setCulling(@EntityInstance int i, boolean enabled) { nSetCulling(mNativeObject, i, enabled); } + /** + * Changes whether or not the large-scale fog is applied to this renderable + * @see Builder#fog + */ + public void setFogEnabled(@EntityInstance int i, boolean enabled) { + nSetFogEnabled(mNativeObject, i, enabled); + } + + /** + * Returns whether large-scale fog is enabled for this renderable. + * @return True if fog is enabled for this renderable. + * @see Builder#fog + */ + public boolean getFogEnabled(@EntityInstance int i) { + return nGetFogEnabled(mNativeObject, i); + } + /** * Enables or disables a light channel. * Light channel 0 is enabled by default. @@ -773,6 +869,13 @@ public void setMaterialInstanceAt(@EntityInstance int i, @IntRange(from = 0) int nSetMaterialInstanceAt(mNativeObject, i, primitiveIndex, materialInstance.getNativeObject()); } + /** + * Clears the material instance for the given primitive. + */ + public void clearMaterialInstanceAt(@EntityInstance int i, @IntRange(from = 0) int primitiveIndex) { + nClearMaterialInstanceAt(mNativeObject, i, primitiveIndex); + } + /** * Creates a MaterialInstance Java wrapper object for a particular material instance. */ @@ -870,12 +973,14 @@ public long getNativeObject() { private static native void nBuilderGeometry(long nativeBuilder, int index, int value, long nativeVertexBuffer, long nativeIndexBuffer); private static native void nBuilderGeometry(long nativeBuilder, int index, int value, long nativeVertexBuffer, long nativeIndexBuffer, int offset, int count); private static native void nBuilderGeometry(long nativeBuilder, int index, int value, long nativeVertexBuffer, long nativeIndexBuffer, int offset, int minIndex, int maxIndex, int count); + private static native void nBuilderGeometryType(long nativeBuilder, int type); private static native void nBuilderMaterial(long nativeBuilder, int index, long nativeMaterialInstance); private static native void nBuilderBlendOrder(long nativeBuilder, int index, int blendOrder); private static native void nBuilderGlobalBlendOrderEnabled(long nativeBuilder, int index, boolean enabled); private static native void nBuilderBoundingBox(long nativeBuilder, float cx, float cy, float cz, float ex, float ey, float ez); private static native void nBuilderLayerMask(long nativeBuilder, int select, int value); private static native void nBuilderPriority(long nativeBuilder, int priority); + private static native void nBuilderChannel(long nativeBuilder, int channel); private static native void nBuilderCulling(long nativeBuilder, boolean enabled); private static native void nBuilderCastShadows(long nativeBuilder, boolean enabled); private static native void nBuilderReceiveShadows(long nativeBuilder, boolean enabled); @@ -884,8 +989,10 @@ public long getNativeObject() { private static native int nBuilderSkinningBones(long nativeBuilder, int boneCount, Buffer bones, int remaining); private static native void nBuilderSkinningBuffer(long nativeBuilder, long nativeSkinningBuffer, int boneCount, int offset); private static native void nBuilderMorphing(long nativeBuilder, int targetCount); - private static native void nBuilderSetMorphTargetBufferAt(long nativeBuilder, int level, int primitiveIndex, long nativeMorphTargetBuffer, int offset, int count); - private static native void nEnableSkinningBuffers(long nativeBuilder, boolean enabled); + private static native void nBuilderMorphingStandard(long nativeBuilder, long nativeMorphTargetBuffer); + private static native void nBuilderSetMorphTargetBufferOffsetAt(long nativeBuilder, int level, int primitiveIndex, int offset); + private static native void nBuilderEnableSkinningBuffers(long nativeBuilder, boolean enabled); + private static native void nBuilderFog(long nativeBuilder, boolean enabled); private static native void nBuilderLightChannel(long nativeRenderableManager, int channel, boolean enable); private static native void nBuilderInstances(long nativeRenderableManager, int instances); @@ -893,12 +1000,15 @@ public long getNativeObject() { private static native int nSetBonesAsMatrices(long nativeObject, int i, Buffer matrices, int remaining, int boneCount, int offset); private static native int nSetBonesAsQuaternions(long nativeObject, int i, Buffer quaternions, int remaining, int boneCount, int offset); private static native void nSetMorphWeights(long nativeObject, int instance, float[] weights, int offset); - private static native void nSetMorphTargetBufferAt(long nativeObject, int i, int level, int primitiveIndex, long nativeMorphTargetBuffer, int offset, int count); + private static native void nSetMorphTargetBufferOffsetAt(long nativeObject, int i, int level, int primitiveIndex, long nativeMorphTargetBuffer, int offset); private static native int nGetMorphTargetCount(long nativeObject, int i); private static native void nSetAxisAlignedBoundingBox(long nativeRenderableManager, int i, float cx, float cy, float cz, float ex, float ey, float ez); private static native void nSetLayerMask(long nativeRenderableManager, int i, int select, int value); private static native void nSetPriority(long nativeRenderableManager, int i, int priority); + private static native void nSetChannel(long nativeRenderableManager, int i, int channel); private static native void nSetCulling(long nativeRenderableManager, int i, boolean enabled); + private static native void nSetFogEnabled(long nativeRenderableManager, int i, boolean enabled); + private static native boolean nGetFogEnabled(long nativeRenderableManager, int i); private static native void nSetLightChannel(long nativeRenderableManager, int i, int channel, boolean enable); private static native boolean nGetLightChannel(long nativeRenderableManager, int i, int channel); private static native void nSetCastShadows(long nativeRenderableManager, int i, boolean enabled); @@ -909,6 +1019,7 @@ public long getNativeObject() { private static native void nGetAxisAlignedBoundingBox(long nativeRenderableManager, int i, float[] center, float[] halfExtent); private static native int nGetPrimitiveCount(long nativeRenderableManager, int i); private static native void nSetMaterialInstanceAt(long nativeRenderableManager, int i, int primitiveIndex, long nativeMaterialInstance); + private static native void nClearMaterialInstanceAt(long nativeRenderableManager, int i, int primitiveIndex); private static native long nGetMaterialInstanceAt(long nativeRenderableManager, int i, int primitiveIndex); private static native void nSetGeometryAt(long nativeRenderableManager, int i, int primitiveIndex, int primitiveType, long nativeVertexBuffer, long nativeIndexBuffer, int offset, int count); private static native void nSetBlendOrderAt(long nativeRenderableManager, int i, int primitiveIndex, int blendOrder); diff --git a/android/filament-android/src/main/java/com/google/android/filament/Renderer.java b/android/filament-android/src/main/java/com/google/android/filament/Renderer.java index 3a9b6ab94db..509a3c080ce 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/Renderer.java +++ b/android/filament-android/src/main/java/com/google/android/filament/Renderer.java @@ -101,7 +101,7 @@ public static class FrameRateOptions { /** * Desired frame interval in unit of 1 / DisplayInfo.refreshRate. */ - public float interval = 1.0f / 60.0f; + public float interval = 1.0f; /** * Additional headroom for the GPU as a ratio of the targetFrameTime. @@ -284,6 +284,33 @@ public void setPresentationTime(long monotonicClockNanos) { nSetPresentationTime(getNativeObject(), monotonicClockNanos); } + /** + * The use of this method is optional. It sets the VSYNC time expressed as the duration in + * nanosecond since epoch of std::chrono::steady_clock. + * If called, passing 0 to frameTimeNanos in Renderer.BeginFrame will use this + * time instead. + * @param steadyClockTimeNano duration in nanosecond since epoch of std::chrono::steady_clock + * @see Engine#getSteadyClockTimeNano + * @see Renderer#beginFrame + */ + public void setVsyncTime(long steadyClockTimeNano) { + nSetVsyncTime(getNativeObject(), steadyClockTimeNano); + } + + /** + * Call skipFrame when momentarily skipping frames, for instance if the content of the + * scene doesn't change. + * + * @param vsyncSteadyClockTimeNano The time in nanoseconds when the frame started being rendered, + * in the {@link System#nanoTime()} timebase. Divide this value by 1000000 to + * convert it to the {@link android.os.SystemClock#uptimeMillis()} + * time base. This typically comes from + * {@link android.view.Choreographer.FrameCallback}. + */ + public void skipFrame(long vsyncSteadyClockTimeNano) { + nSkipFrame(getNativeObject(), vsyncSteadyClockTimeNano); + } + /** * Sets up a frame for this Renderer. *

beginFrame manages frame pacing, and returns whether or not a frame should be @@ -702,6 +729,8 @@ void clearNativeObject() { } private static native void nSetPresentationTime(long nativeObject, long monotonicClockNanos); + private static native void nSetVsyncTime(long nativeObject, long steadyClockTimeNano); + private static native void nSkipFrame(long nativeObject, long vsyncSteadyClockTimeNano); private static native boolean nBeginFrame(long nativeRenderer, long nativeSwapChain, long frameTimeNanos); private static native void nEndFrame(long nativeRenderer); private static native void nRender(long nativeRenderer, long nativeView); diff --git a/android/filament-android/src/main/java/com/google/android/filament/Scene.java b/android/filament-android/src/main/java/com/google/android/filament/Scene.java index 283b7024e73..9a41a4f64e5 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/Scene.java +++ b/android/filament-android/src/main/java/com/google/android/filament/Scene.java @@ -16,6 +16,7 @@ package com.google.android.filament; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; /** @@ -146,18 +147,29 @@ public void removeEntities(@Entity int[] entities) { } /** - * Returns the number of {@link RenderableManager} components in the Scene. + * Returns the total number of Entities in the Scene, whether alive or not. * - * @return number of {@link RenderableManager} components in the Scene.. + * @return the total number of Entities in the Scene. + */ + public int getEntityCount() { + return nGetEntityCount(getNativeObject()); + } + + /** + * Returns the number of active (alive) {@link RenderableManager} components in the + * Scene. + * + * @return number of {@link RenderableManager} components in the Scene. */ public int getRenderableCount() { return nGetRenderableCount(getNativeObject()); } /** - * Returns the number of {@link LightManager} components in the Scene. + * Returns the number of active (alive) {@link LightManager} components in the + * Scene. * - * @return number of {@link LightManager} components in the Scene.. + * @return number of {@link LightManager} components in the Scene. */ public int getLightCount() { return nGetLightCount(getNativeObject()); @@ -179,6 +191,52 @@ public long getNativeObject() { return mNativeObject; } + /** + * Returns the list of all entities in the Scene. If outArray is provided and large enough, + * it is used to store the list and returned, otherwise a new array is allocated and returned. + * @param outArray an array to store the list of entities in the scene. + * @return outArray if it was used or a newly allocated array. + * @see #getEntityCount + */ + public int[] getEntities(@Nullable int[] outArray) { + int c = getEntityCount(); + if (outArray == null || outArray.length < c) { + outArray = new int[c]; + } + boolean success = nGetEntities(getNativeObject(), outArray, outArray.length); + if (!success) { + throw new IllegalStateException("Error retriving Scene's entities"); + } + return outArray; + } + + /** + * Returns the list of all entities in the Scene in a newly allocated array. + * @return an array containing the list of all entities in the scene. + * @see #getEntityCount + */ + public int[] getEntities() { + return getEntities(null); + } + + public interface EntityProcessor { + void process(@Entity int entity); + } + + /** + * Invokes user functor on each entity in the scene. + * + * It is not allowed to add or remove an entity from the scene within the functor. + * + * @param entityProcessor User provided functor called for each entity in the scene + */ + public void forEach(@NonNull EntityProcessor entityProcessor) { + int[] entities = getEntities(null); + for (int entity : entities) { + entityProcessor.process(entity); + } + } + void clearNativeObject() { mNativeObject = 0; } @@ -189,7 +247,9 @@ void clearNativeObject() { private static native void nAddEntities(long nativeScene, int[] entities); private static native void nRemove(long nativeScene, int entity); private static native void nRemoveEntities(long nativeScene, int[] entities); + private static native int nGetEntityCount(long nativeScene); private static native int nGetRenderableCount(long nativeScene); private static native int nGetLightCount(long nativeScene); private static native boolean nHasEntity(long nativeScene, int entity); + private static native boolean nGetEntities(long nativeScene, int[] outArray, int length); } diff --git a/android/filament-android/src/main/java/com/google/android/filament/SwapChain.java b/android/filament-android/src/main/java/com/google/android/filament/SwapChain.java index 391f1f6e1dc..db47d215635 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/SwapChain.java +++ b/android/filament-android/src/main/java/com/google/android/filament/SwapChain.java @@ -68,32 +68,33 @@ public class SwapChain { private final Object mSurface; private long mNativeObject; - public static final long CONFIG_DEFAULT = 0x0; - - /** - * This flag indicates that the SwapChain must be allocated with an - * alpha-channel. - */ - public static final long CONFIG_TRANSPARENT = 0x1; + SwapChain(long nativeSwapChain, Object surface) { + mNativeObject = nativeSwapChain; + mSurface = surface; + } /** - * This flag indicates that the SwapChain may be used as a source surface - * for reading back render results. This config must be set when creating - * any SwapChain that will be used as the source for a blit operation. + * Return whether createSwapChain supports the CONFIG_PROTECTED_CONTENT flag. + * The default implementation returns false. * - * @see Renderer#copyFrame + * @param engine A reference to the filament Engine + * @return true if CONFIG_PROTECTED_CONTENT is supported, false otherwise. + * @see SwapChainFlags#CONFIG_PROTECTED_CONTENT */ - public static final long CONFIG_READABLE = 0x2; + public static boolean isProtectedContentSupported(@NonNull Engine engine) { + return nIsProtectedContentSupported(engine.getNativeObject()); + } /** - * Indicates that the native X11 window is an XCB window rather than an XLIB window. - * This is ignored on non-Linux platforms and in builds that support only one X11 API. + * Return whether createSwapChain supports the CONFIG_SRGB_COLORSPACE flag. + * The default implementation returns false. + * + * @param engine A reference to the filament Engine + * @return true if CONFIG_SRGB_COLORSPACE is supported, false otherwise. + * @see SwapChainFlags#CONFIG_SRGB_COLORSPACE */ - public static final long CONFIG_ENABLE_XCB = 0x4; - - SwapChain(long nativeSwapChain, Object surface) { - mNativeObject = nativeSwapChain; - mSurface = surface; + public static boolean isSRGBSwapChainSupported(@NonNull Engine engine) { + return nIsSRGBSwapChainSupported(engine.getNativeObject()); } /** @@ -114,10 +115,6 @@ public Object getNativeWindow() { *

* *

- * The FrameCompletedCallback is guaranteed to be called on the main Filament thread. - *

- * - *

* Warning: Only Filament's Metal backend supports frame callbacks. Other backends ignore the * callback (which will never be called) and proceed normally. *

@@ -141,4 +138,6 @@ void clearNativeObject() { } private static native void nSetFrameCompletedCallback(long nativeSwapChain, Object handler, Runnable callback); + private static native boolean nIsSRGBSwapChainSupported(long nativeEngine); + private static native boolean nIsProtectedContentSupported(long nativeEngine); } diff --git a/android/filament-android/src/main/java/com/google/android/filament/SwapChainFlags.java b/android/filament-android/src/main/java/com/google/android/filament/SwapChainFlags.java new file mode 100644 index 00000000000..daef2dd15f2 --- /dev/null +++ b/android/filament-android/src/main/java/com/google/android/filament/SwapChainFlags.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.filament; + +// Note: SwapChainFlags is kept separate from SwapChain so that UiHelper does not need to depend +// on SwapChain. This allows clients to use UiHelper without requiring all of Filament's Java +// classes. + +/** + * Flags that a SwapChain can be created with to control behavior. + * + * @see Engine#createSwapChain + * @see Engine#createSwapChainFromNativeSurface + */ +public final class SwapChainFlags { + + public static final long CONFIG_DEFAULT = 0x0; + + /** + * This flag indicates that the SwapChain must be allocated with an + * alpha-channel. + */ + public static final long CONFIG_TRANSPARENT = 0x1; + + /** + * This flag indicates that the SwapChain may be used as a source surface + * for reading back render results. This config must be set when creating + * any SwapChain that will be used as the source for a blit operation. + * + * @see Renderer#copyFrame + */ + public static final long CONFIG_READABLE = 0x2; + + /** + * Indicates that the native X11 window is an XCB window rather than an XLIB window. + * This is ignored on non-Linux platforms and in builds that support only one X11 API. + */ + public static final long CONFIG_ENABLE_XCB = 0x4; + + /** + * Indicates that the SwapChain must automatically perform linear to sRGB encoding. + * + * This flag is ignored if isSRGBSwapChainSupported() is false. + * + * When using this flag, post-processing should be disabled. + * + * @see SwapChain#isSRGBSwapChainSupported + * @see View#setPostProcessingEnabled + */ + public static final long CONFIG_SRGB_COLORSPACE = 0x10; + + /** + * Indicates that this SwapChain should allocate a stencil buffer in addition to a depth buffer. + * + * This flag is necessary when using View::setStencilBufferEnabled and rendering directly into + * the SwapChain (when post-processing is disabled). + * + * The specific format of the stencil buffer depends on platform support. The following pixel + * formats are tried, in order of preference: + * + * Depth only (without CONFIG_HAS_STENCIL_BUFFER): + * - DEPTH32F + * - DEPTH24 + * + * Depth + stencil (with CONFIG_HAS_STENCIL_BUFFER): + * - DEPTH32F_STENCIL8 + * - DEPTH24F_STENCIL8 + * + * Note that enabling the stencil buffer may hinder depth precision and should only be used if + * necessary. + * + * @see View#setStencilBufferEnabled + * @see View#setPostProcessingEnabled + */ + public static final long CONFIG_HAS_STENCIL_BUFFER = 0x20; + + /** + * The SwapChain contains protected content. Only supported when isProtectedContentSupported() + * is true. + */ + public static final long CONFIG_PROTECTED_CONTENT = 0x40; +} + diff --git a/android/filament-android/src/main/java/com/google/android/filament/Texture.java b/android/filament-android/src/main/java/com/google/android/filament/Texture.java index db312a93442..eaf81adc3cf 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/Texture.java +++ b/android/filament-android/src/main/java/com/google/android/filament/Texture.java @@ -800,6 +800,19 @@ public Builder importTexture(long id) { return this; } + /** + * Creates an external texture. The content must be set using setExternalImage(). + * The sampler can be SAMPLER_EXTERNAL or SAMPLER_2D depending on the format. Generally + * YUV formats must use SAMPLER_EXTERNAL. This depends on the backend features and is not + * validated. + * @return This Builder, for chaining calls. + */ + @NonNull + public Builder external() { + nBuilderExternal(mNativeBuilder); + return this; + } + /** * Creates a new Texture instance. * @param engine The {@link Engine} to associate this Texture with. @@ -849,6 +862,10 @@ public static class Usage { public static final int SAMPLEABLE = 0x10; /** Texture can be used as a subpass input */ public static final int SUBPASS_INPUT = 0x20; + /** Texture can be used the source of a blit() */ + public static final int BLIT_SRC = 0x40; + /** Texture can be used the destination of a blit() */ + public static final int BLIT_DST = 0x80; /** by default textures are UPLOADABLE and SAMPLEABLE*/ public static final int DEFAULT = UPLOADABLE | SAMPLEABLE; } @@ -1257,6 +1274,7 @@ void clearNativeObject() { private static native void nBuilderUsage(long nativeBuilder, int flags); private static native void nBuilderSwizzle(long nativeBuilder, int r, int g, int b, int a); private static native void nBuilderImportTexture(long nativeBuilder, long id); + private static native void nBuilderExternal(long nativeBuilder); private static native long nBuilderBuild(long nativeBuilder, long nativeEngine); private static native int nGetWidth(long nativeTexture, int level); diff --git a/android/filament-android/src/main/java/com/google/android/filament/TextureSampler.java b/android/filament-android/src/main/java/com/google/android/filament/TextureSampler.java index 3dbdfb58cff..1c42f1086c7 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/TextureSampler.java +++ b/android/filament-android/src/main/java/com/google/android/filament/TextureSampler.java @@ -126,7 +126,7 @@ public enum CompareFunction { NEVER } - int mSampler = 0; // bit field used by native + long mSampler = 0; // bit field used by native /** * Initializes the TextureSampler with default values. @@ -276,7 +276,7 @@ public WrapMode getWrapModeR() { } /** - * Sets the wrapping mode in the t (depth) direction. + * Sets the wrapping mode in the r (depth) direction. * @param mode wrapping mode */ public void setWrapModeR(WrapMode mode) { @@ -342,26 +342,26 @@ private static MinFilter minFilterFromMagFilter(@NonNull MagFilter minMag) { } } - private static native int nCreateSampler(int min, int max, int s, int t, int r); - private static native int nCreateCompareSampler(int mode, int function); + private static native long nCreateSampler(int min, int max, int s, int t, int r); + private static native long nCreateCompareSampler(int mode, int function); - private static native int nGetMinFilter(int sampler); - private static native int nSetMinFilter(int sampler, int filter); - private static native int nGetMagFilter(int sampler); - private static native int nSetMagFilter(int sampler, int filter); + private static native int nGetMinFilter(long sampler); + private static native long nSetMinFilter(long sampler, int filter); + private static native int nGetMagFilter(long sampler); + private static native long nSetMagFilter(long sampler, int filter); - private static native int nGetWrapModeS(int sampler); - private static native int nSetWrapModeS(int sampler, int mode); - private static native int nGetWrapModeT(int sampler); - private static native int nSetWrapModeT(int sampler, int mode); - private static native int nGetWrapModeR(int sampler); - private static native int nSetWrapModeR(int sampler, int mode); + private static native int nGetWrapModeS(long sampler); + private static native long nSetWrapModeS(long sampler, int mode); + private static native int nGetWrapModeT(long sampler); + private static native long nSetWrapModeT(long sampler, int mode); + private static native int nGetWrapModeR(long sampler); + private static native long nSetWrapModeR(long sampler, int mode); - private static native int nGetCompareMode(int sampler); - private static native int nSetCompareMode(int sampler, int mode); - private static native int nGetCompareFunction(int sampler); - private static native int nSetCompareFunction(int sampler, int function); + private static native int nGetCompareMode(long sampler); + private static native long nSetCompareMode(long sampler, int mode); + private static native int nGetCompareFunction(long sampler); + private static native long nSetCompareFunction(long sampler, int function); - private static native float nGetAnisotropy(int sampler); - private static native int nSetAnisotropy(int sampler, float anisotropy); + private static native float nGetAnisotropy(long sampler); + private static native long nSetAnisotropy(long sampler, float anisotropy); } diff --git a/android/filament-android/src/main/java/com/google/android/filament/ToneMapper.java b/android/filament-android/src/main/java/com/google/android/filament/ToneMapper.java index 15800562e3e..c3d3490441b 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/ToneMapper.java +++ b/android/filament-android/src/main/java/com/google/android/filament/ToneMapper.java @@ -16,12 +16,14 @@ *
  • Configurable tone mapping operators
  • *
      *
    • GenericToneMapper
    • + *
    • AgXToneMapper
    • *
    *
  • Fixed-aesthetic tone mapping operators
  • *
      *
    • ACESToneMapper
    • *
    • ACESLegacyToneMapper
    • *
    • FilmicToneMapper
    • + *
    • PBRNeutralToneMapper
    • *
    *
  • Debug/validation tone mapping operators
  • *
      @@ -100,6 +102,55 @@ public Filmic() { } } + /** + * Khronos PBR Neutral tone mapping operator. This tone mapper was designed + * to preserve the appearance of materials across lighting conditions while + * avoiding artifacts in the highlights in high dynamic range conditions. + */ + public static class PBRNeutralToneMapper extends ToneMapper { + public PBRNeutralToneMapper() { + super(nCreatePBRNeutralToneMapper()); + } + } + + /** + * AgX tone mapping operator. + */ + public static class Agx extends ToneMapper { + public enum AgxLook { + /** + * Base contrast with no look applied + */ + NONE, + + /** + * A punchy and more chroma laden look for sRGB displays + */ + PUNCHY, + + /** + * A golden tinted, slightly washed look for BT.1886 displays + */ + GOLDEN + } + + /** + * Builds a new AgX tone mapper with no look applied. + */ + public Agx() { + this(AgxLook.NONE); + } + + /** + * Builds a new AgX tone mapper. + * + * @param look: an optional creative adjustment to contrast and saturation + */ + public Agx(AgxLook look) { + super(nCreateAgxToneMapper(look.ordinal())); + } + } + /** * Generic tone mapping operator that gives control over the tone mapping * curve. This operator can be used to control the aesthetics of the final @@ -194,6 +245,8 @@ public void setHdrMax(float hdrMax) { private static native long nCreateACESToneMapper(); private static native long nCreateACESLegacyToneMapper(); private static native long nCreateFilmicToneMapper(); + private static native long nCreatePBRNeutralToneMapper(); + private static native long nCreateAgxToneMapper(int look); private static native long nCreateGenericToneMapper( float contrast, float midGrayIn, float midGrayOut, float hdrMax); diff --git a/android/filament-android/src/main/java/com/google/android/filament/View.java b/android/filament-android/src/main/java/com/google/android/filament/View.java index 4cbdea625f3..0bcd1299b7b 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/View.java +++ b/android/filament-android/src/main/java/com/google/android/filament/View.java @@ -27,6 +27,8 @@ import static com.google.android.filament.Asserts.assertFloat4In; import static com.google.android.filament.Colors.LinearColor; +import com.google.android.filament.proguard.UsedByNative; + /** * Encompasses all the state needed for rendering a {@link Scene}. * @@ -73,6 +75,7 @@ public class View { private AmbientOcclusionOptions mAmbientOcclusionOptions; private BloomOptions mBloomOptions; private FogOptions mFogOptions; + private StereoscopicOptions mStereoscopicOptions; private RenderTarget mRenderTarget; private BlendMode mBlendMode; private DepthOfFieldOptions mDepthOfFieldOptions; @@ -238,6 +241,15 @@ public void setCamera(@Nullable Camera camera) { nSetCamera(getNativeObject(), camera == null ? 0 : camera.getNativeObject()); } + /** + * Query whether a camera is set. + * @return true if a camera is set, false otherwise + * @see #setCamera + */ + public boolean hasCamera() { + return nHasCamera(getNativeObject()); + } + /** * Gets this View's associated Camera, or null if none has been assigned. * @@ -733,6 +745,33 @@ public void setFrontFaceWindingInverted(boolean inverted) { nSetFrontFaceWindingInverted(getNativeObject(), inverted); } + /** + * Returns true if transparent picking is enabled. + * + * @see #setTransparentPickingEnabled + */ + public boolean isTransparentPickingEnabled() { + return nIsTransparentPickingEnabled(getNativeObject()); + } + + /** + * Enables or disables transparent picking. Disabled by default. + * + * When transparent picking is enabled, View::pick() will pick from both + * transparent and opaque renderables. When disabled, View::pick() will only + * pick from opaque renderables. + * + *

      + * Transparent picking will create an extra pass for rendering depth + * from both transparent and opaque renderables. + *

      + * + * @param enabled true enables transparent picking, false disables it. + */ + public void setTransparentPickingEnabled(boolean enabled) { + nSetTransparentPickingEnabled(getNativeObject(), enabled); + } + /** * Sets options relative to dynamic lighting for this view. * @@ -902,7 +941,7 @@ public void setBloomOptions(@NonNull BloomOptions options) { mBloomOptions = options; nSetBloomOptions(getNativeObject(), options.dirt != null ? options.dirt.getNativeObject() : 0, options.dirtStrength, options.strength, options.resolution, - options.anamorphism, options.levels, options.blendMode.ordinal(), + options.levels, options.blendMode.ordinal(), options.threshold, options.enabled, options.highlight, options.lensFlare, options.starburst, options.chromaticAberration, options.ghostCount, options.ghostSpacing, options.ghostThreshold, @@ -962,9 +1001,11 @@ public void setFogOptions(@NonNull FogOptions options) { assertFloat3In(options.color); mFogOptions = options; nSetFogOptions(getNativeObject(), options.distance, options.maximumOpacity, options.height, - options.heightFalloff, options.color[0], options.color[1], options.color[2], + options.heightFalloff, options.cutOffDistance, + options.color[0], options.color[1], options.color[2], options.density, options.inScatteringStart, options.inScatteringSize, options.fogColorFromIbl, + options.skyColor == null ? 0 : options.skyColor.getNativeObject(), options.enabled); } @@ -1028,7 +1069,8 @@ public DepthOfFieldOptions getDepthOfFieldOptions() { *

      * *

      - * Post-processing must be enabled in order to use the stencil buffer. + * If post-processing is disabled, then the SwapChain must have the CONFIG_HAS_STENCIL_BUFFER + * flag set in order to use the stencil buffer. *

      * *

      @@ -1050,6 +1092,51 @@ public boolean isStencilBufferEnabled() { return nIsStencilBufferEnabled(getNativeObject()); } + /** + * Sets the stereoscopic rendering options for this view. + * + *

      + * Currently, only one type of stereoscopic rendering is supported: side-by-side. + * Side-by-side stereo rendering splits the viewport into two halves: a left and right half. + * Eye 0 will render to the left half, while Eye 1 will render into the right half. + *

      + * + *

      + * Currently, the following features are not supported with stereoscopic rendering: + * - post-processing + * - shadowing + * - punctual lights + *

      + * + *

      + * Stereo rendering depends on device and platform support. To check if stereo rendering is + * supported, use {@link Engine#isStereoSupported()}. If stereo rendering is not supported, then + * the stereoscopic options have no effect. + *

      + * + * @param options The stereoscopic options to use on this view + * @see #getStereoscopicOptions + */ + public void setStereoscopicOptions(@NonNull StereoscopicOptions options) { + mStereoscopicOptions = options; + nSetStereoscopicOptions(getNativeObject(), options.enabled); + } + + /** + * Gets the stereoscopic options. + * + * @return options Stereoscopic options currently set. + * @see #setStereoscopicOptions + */ + @NonNull + public StereoscopicOptions getStereoscopicOptions() { + if (mStereoscopicOptions == null) { + mStereoscopicOptions = new StereoscopicOptions(); + } + return mStereoscopicOptions; + } + + /** * A class containing the result of a picking query */ @@ -1094,10 +1181,29 @@ public void pick(int x, int y, nPick(getNativeObject(), x, y, handler, internalCallback); } + @UsedByNative("View.cpp") private static class InternalOnPickCallback implements Runnable { + private final OnPickCallback mUserCallback; + private final PickingQueryResult mPickingQueryResult = new PickingQueryResult(); + + @UsedByNative("View.cpp") + @Entity + int mRenderable; + + @UsedByNative("View.cpp") + float mDepth; + + @UsedByNative("View.cpp") + float mFragCoordsX; + @UsedByNative("View.cpp") + float mFragCoordsY; + @UsedByNative("View.cpp") + float mFragCoordsZ; + public InternalOnPickCallback(OnPickCallback mUserCallback) { this.mUserCallback = mUserCallback; } + @Override public void run() { mPickingQueryResult.renderable = mRenderable; @@ -1107,13 +1213,63 @@ public void run() { mPickingQueryResult.fragCoords[2] = mFragCoordsZ; mUserCallback.onPick(mPickingQueryResult); } - private final OnPickCallback mUserCallback; - private final PickingQueryResult mPickingQueryResult = new PickingQueryResult(); - @Entity int mRenderable; - float mDepth; - float mFragCoordsX; - float mFragCoordsY; - float mFragCoordsZ; + } + + /** + * Set the value of material global variables. There are up-to four such variable each of + * type float4. These variables can be read in a user Material with + * `getMaterialGlobal{0|1|2|3}()`. All variable start with a default value of { 0, 0, 0, 1 } + * + * @param index index of the variable to set between 0 and 3. + * @param value new value for the variable. + * @see #getMaterialGlobal + */ + public void setMaterialGlobal(int index, @NonNull @Size(min = 4) float[] value) { + Asserts.assertFloat4In(value); + nSetMaterialGlobal(getNativeObject(), index, value[0], value[1], value[2], value[3]); + } + + /** + * Get the value of the material global variables. + * All variable start with a default value of { 0, 0, 0, 1 } + * + * @param index index of the variable to set between 0 and 3. + * @param out A 4-float array where the value will be stored, or null in which case the array is + * allocated. + * @return A 4-float array containing the current value of the variable. + * @see #setMaterialGlobal + */ + @NonNull @Size(min = 4) + public float[] getMaterialGlobal(int index, @Nullable @Size(min = 4) float[] out) { + out = Asserts.assertFloat4(out); + nGetMaterialGlobal(getNativeObject(), index, out); + return out; + } + + /** + * Get an Entity representing the large scale fog object. + * This entity is always inherited by the View's Scene. + * + * It is for example possible to create a TransformManager component with this + * Entity and apply a transformation globally on the fog. + * + * @return an Entity representing the large scale fog object. + */ + @Entity + public int getFogEntity() { + return nGetFogEntity(getNativeObject()); + } + + /** + * When certain temporal features are used (e.g.: TAA or Screen-space reflections), the view + * keeps a history of previous frame renders associated with the Renderer the view was last + * used with. When switching Renderer, it may be necessary to clear that history by calling + * this method. Similarly, if the whole content of the screen change, like when a cut-scene + * starts, clearing the history might be needed to avoid artifacts due to the previous frame + * being very different. + */ + public void clearFrameHistory(Engine engine) { + nClearFrameHistory(getNativeObject(), engine.getNativeObject()); } public long getNativeObject() { @@ -1130,6 +1286,7 @@ void clearNativeObject() { private static native void nSetName(long nativeView, String name); private static native void nSetScene(long nativeView, long nativeScene); private static native void nSetCamera(long nativeView, long nativeCamera); + private static native boolean nHasCamera(long nativeView); private static native void nSetViewport(long nativeView, int left, int bottom, int width, int height); private static native void nSetVisibleLayers(long nativeView, int select, int value); private static native void nSetShadowingEnabled(long nativeView, boolean enabled); @@ -1151,13 +1308,16 @@ void clearNativeObject() { private static native boolean nIsPostProcessingEnabled(long nativeView); private static native void nSetFrontFaceWindingInverted(long nativeView, boolean inverted); private static native boolean nIsFrontFaceWindingInverted(long nativeView); + private static native void nSetTransparentPickingEnabled(long nativeView, boolean enabled); + private static native boolean nIsTransparentPickingEnabled(long nativeView); private static native void nSetAmbientOcclusion(long nativeView, int ordinal); private static native int nGetAmbientOcclusion(long nativeView); private static native void nSetAmbientOcclusionOptions(long nativeView, float radius, float bias, float power, float resolution, float intensity, float bilateralThreshold, int quality, int lowPassFilter, int upsampling, boolean enabled, boolean bentNormals, float minHorizonAngleRad); private static native void nSetSSCTOptions(long nativeView, float ssctLightConeRad, float ssctStartTraceDistance, float ssctContactDistanceMax, float ssctIntensity, float v, float v1, float v2, float ssctDepthBias, float ssctDepthSlopeBias, int ssctSampleCount, int ssctRayCount, boolean ssctEnabled); - private static native void nSetBloomOptions(long nativeView, long dirtNativeObject, float dirtStrength, float strength, int resolution, float anamorphism, int levels, int blendMode, boolean threshold, boolean enabled, float highlight, + private static native void nSetBloomOptions(long nativeView, long dirtNativeObject, float dirtStrength, float strength, int resolution, int levels, int blendMode, boolean threshold, boolean enabled, float highlight, boolean lensFlare, boolean starburst, float chromaticAberration, int ghostCount, float ghostSpacing, float ghostThreshold, float haloThickness, float haloRadius, float haloThreshold); - private static native void nSetFogOptions(long nativeView, float distance, float maximumOpacity, float height, float heightFalloff, float v, float v1, float v2, float density, float inScatteringStart, float inScatteringSize, boolean fogColorFromIbl, boolean enabled); + private static native void nSetFogOptions(long nativeView, float distance, float maximumOpacity, float height, float heightFalloff, float cutOffDistance, float v, float v1, float v2, float density, float inScatteringStart, float inScatteringSize, boolean fogColorFromIbl, long skyColorNativeObject, boolean enabled); + private static native void nSetStereoscopicOptions(long nativeView, boolean enabled); private static native void nSetBlendMode(long nativeView, int blendMode); private static native void nSetDepthOfFieldOptions(long nativeView, float cocScale, float maxApertureDiameter, boolean enabled, int filter, boolean nativeResolution, int foregroundRingCount, int backgroundRingCount, int fastGatherRingCount, int maxForegroundCOC, int maxBackgroundCOC); @@ -1172,6 +1332,10 @@ private static native void nSetDepthOfFieldOptions(long nativeView, float cocSca private static native void nPick(long nativeView, int x, int y, Object handler, InternalOnPickCallback internalCallback); private static native void nSetStencilBufferEnabled(long nativeView, boolean enabled); private static native boolean nIsStencilBufferEnabled(long nativeView); + private static native void nSetMaterialGlobal(long nativeView, int index, float x, float y, float z, float w); + private static native void nGetMaterialGlobal(long nativeView, int index, float[] out); + private static native int nGetFogEntity(long nativeView); + private static native void nClearFrameHistory(long nativeView, long nativeEngine); /** * List of available ambient occlusion techniques. @@ -1288,8 +1452,6 @@ public static class DynamicResolutionOptions { * blendMode: Whether the bloom effect is purely additive (false) or mixed with the original * image (true). * - * anamorphism: Bloom's aspect ratio (x/y), for artistic purposes. - * * threshold: When enabled, a threshold at 1.0 is applied on the source image, this is * useful for artistic reasons and is usually needed when a dirt texture is used. * @@ -1327,13 +1489,9 @@ public enum BlendMode { /** * resolution of vertical axis (2^levels to 2048) */ - public int resolution = 360; + public int resolution = 384; /** - * bloom x/y aspect-ratio (1/32 to 32) - */ - public float anamorphism = 1.0f; - /** - * number of blur levels (3 to 11) + * number of blur levels (1 to 11) */ public int levels = 6; /** @@ -1353,6 +1511,17 @@ public enum BlendMode { * limit highlights to this value before bloom [10, +inf] */ public float highlight = 1000.0f; + /** + * Bloom quality level. + * LOW (default): use a more optimized down-sampling filter, however there can be artifacts + * with dynamic resolution, this can be alleviated by using the homogenous mode. + * MEDIUM: Good balance between quality and performance. + * HIGH: In this mode the bloom resolution is automatically increased to avoid artifacts. + * This mode can be significantly slower on mobile, especially at high resolution. + * This mode greatly improves the anamorphic bloom. + */ + @NonNull + public QualityLevel quality = QualityLevel.LOW; /** * enable screen-space lens flare */ @@ -1392,48 +1561,109 @@ public enum BlendMode { } /** - * Options to control fog in the scene + * Options to control large-scale fog in the scene */ public static class FogOptions { /** - * distance in world units from the camera where the fog starts ( >= 0.0 ) + * Distance in world units [m] from the camera to where the fog starts ( >= 0.0 ) */ public float distance = 0.0f; + /** + * Distance in world units [m] after which the fog calculation is disabled. + * This can be used to exclude the skybox, which is desirable if it already contains clouds or + * fog. The default value is +infinity which applies the fog to everything. + * + * Note: The SkyBox is typically at a distance of 1e19 in world space (depending on the near + * plane distance and projection used though). + */ + public float cutOffDistance = Float.POSITIVE_INFINITY; /** * fog's maximum opacity between 0 and 1 */ public float maximumOpacity = 1.0f; /** - * fog's floor in world units + * Fog's floor in world units [m]. This sets the "sea level". */ public float height = 0.0f; /** - * how fast fog dissipates with altitude + * How fast the fog dissipates with altitude. heightFalloff has a unit of [1/m]. + * It can be expressed as 1/H, where H is the altitude change in world units [m] that causes a + * factor 2.78 (e) change in fog density. + * + * A falloff of 0 means the fog density is constant everywhere and may result is slightly + * faster computations. */ public float heightFalloff = 1.0f; /** - * fog's color (linear), see fogColorFromIbl + * Fog's color is used for ambient light in-scattering, a good value is + * to use the average of the ambient light, possibly tinted towards blue + * for outdoors environments. Color component's values should be between 0 and 1, values + * above one are allowed but could create a non energy-conservative fog (this is dependant + * on the IBL's intensity as well). + * + * We assume that our fog has no absorption and therefore all the light it scatters out + * becomes ambient light in-scattering and has lost all directionality, i.e.: scattering is + * isotropic. This somewhat simulates Rayleigh scattering. + * + * This value is used as a tint instead, when fogColorFromIbl is enabled. + * + * @see fogColorFromIbl */ @NonNull @Size(min = 3) - public float[] color = {0.5f, 0.5f, 0.5f}; + public float[] color = {1.0f, 1.0f, 1.0f}; /** - * fog's density at altitude given by 'height' + * Extinction factor in [1/m] at altitude 'height'. The extinction factor controls how much + * light is absorbed and out-scattered per unit of distance. Each unit of extinction reduces + * the incoming light to 37% of its original value. + * + * Note: The extinction factor is related to the fog density, it's usually some constant K times + * the density at sea level (more specifically at fog height). The constant K depends on + * the composition of the fog/atmosphere. + * + * For historical reason this parameter is called `density`. */ public float density = 0.1f; /** - * distance in world units from the camera where in-scattering starts + * Distance in world units [m] from the camera where the Sun in-scattering starts. */ public float inScatteringStart = 0.0f; /** - * size of in-scattering (>0 to activate). Good values are >> 1 (e.g. ~10 - 100). + * Very inaccurately simulates the Sun's in-scattering. That is, the light from the sun that + * is scattered (by the fog) towards the camera. + * Size of the Sun in-scattering (>0 to activate). Good values are >> 1 (e.g. ~10 - 100). + * Smaller values result is a larger scattering size. */ public float inScatteringSize = -1.0f; /** - * Fog color will be modulated by the IBL color in the view direction. + * The fog color will be sampled from the IBL in the view direction and tinted by `color`. + * Depending on the scene this can produce very convincing results. + * + * This simulates a more anisotropic phase-function. + * + * `fogColorFromIbl` is ignored when skyTexture is specified. + * + * @see skyColor */ public boolean fogColorFromIbl = false; /** - * enable or disable fog + * skyTexture must be a mipmapped cubemap. When provided, the fog color will be sampled from + * this texture, higher resolution mip levels will be used for objects at the far clip plane, + * and lower resolution mip levels for objects closer to the camera. The skyTexture should + * typically be heavily blurred; a typical way to produce this texture is to blur the base + * level with a strong gaussian filter or even an irradiance filter and then generate mip + * levels as usual. How blurred the base level is somewhat of an artistic decision. + * + * This simulates a more anisotropic phase-function. + * + * `fogColorFromIbl` is ignored when skyTexture is specified. + * + * @see Texture + * @see fogColorFromIbl + */ + @Nullable + public Texture skyColor = null; + /** + * Enable or disable large-scale fog */ public boolean enabled = false; } @@ -1458,6 +1688,10 @@ public enum Filter { * circle of confusion scale factor (amount of blur) */ public float cocScale = 1.0f; + /** + * width/height aspect ratio of the circle of confusion (simulate anamorphic lenses) + */ + public float cocAspectRatio = 1.0f; /** * maximum aperture diameter in meters (zero to disable rotation) */ @@ -1673,7 +1907,7 @@ public static class AmbientOcclusionOptions { } /** - * Options for Temporal Multi-Sample Anti-aliasing (MSAA) + * Options for Multi-Sample Anti-aliasing (MSAA) * @see setMultiSampleAntiAliasingOptions() */ public static class MultiSampleAntiAliasingOptions { @@ -1697,21 +1931,111 @@ public static class MultiSampleAntiAliasingOptions { /** * Options for Temporal Anti-aliasing (TAA) + * Most TAA parameters are extremely costly to change, as they will trigger the TAA post-process + * shaders to be recompiled. These options should be changed or set during initialization. + * `filterWidth`, `feedback` and `jitterPattern`, however, can be changed at any time. + * + * `feedback` of 0.1 effectively accumulates a maximum of 19 samples in steady state. + * see "A Survey of Temporal Antialiasing Techniques" by Lei Yang and all for more information. + * * @see setTemporalAntiAliasingOptions() */ public static class TemporalAntiAliasingOptions { + public enum BoxType { + /** + * use an AABB neighborhood + */ + AABB, + /** + * use the variance of the neighborhood (not recommended) + */ + VARIANCE, + /** + * use both AABB and variance + */ + AABB_VARIANCE, + } + + public enum BoxClipping { + /** + * Accurate box clipping + */ + ACCURATE, + /** + * clamping + */ + CLAMP, + /** + * no rejections (use for debugging) + */ + NONE, + } + + public enum JitterPattern { + RGSS_X4, + UNIFORM_HELIX_X4, + HALTON_23_X8, + HALTON_23_X16, + HALTON_23_X32, + } + /** - * reconstruction filter width typically between 0 (sharper, aliased) and 1 (smoother) + * reconstruction filter width typically between 0.2 (sharper, aliased) and 1.5 (smoother) */ public float filterWidth = 1.0f; /** * history feedback, between 0 (maximum temporal AA) and 1 (no temporal AA). */ - public float feedback = 0.04f; + public float feedback = 0.12f; + /** + * texturing lod bias (typically -1 or -2) + */ + public float lodBias = -1.0f; + /** + * post-TAA sharpen, especially useful when upscaling is true. + */ + public float sharpness = 0.0f; /** * enables or disables temporal anti-aliasing */ public boolean enabled = false; + /** + * 4x TAA upscaling. Disables Dynamic Resolution. [BETA] + */ + public boolean upscaling = false; + /** + * whether to filter the history buffer + */ + public boolean filterHistory = true; + /** + * whether to apply the reconstruction filter to the input + */ + public boolean filterInput = true; + /** + * whether to use the YcoCg color-space for history rejection + */ + public boolean useYCoCg = false; + /** + * type of color gamut box + */ + @NonNull + public TemporalAntiAliasingOptions.BoxType boxType = TemporalAntiAliasingOptions.BoxType.AABB; + /** + * clipping algorithm + */ + @NonNull + public TemporalAntiAliasingOptions.BoxClipping boxClipping = TemporalAntiAliasingOptions.BoxClipping.ACCURATE; + @NonNull + public TemporalAntiAliasingOptions.JitterPattern jitterPattern = TemporalAntiAliasingOptions.JitterPattern.HALTON_23_X16; + public float varianceGamma = 1.0f; + /** + * adjust the feedback dynamically to reduce flickering + */ + public boolean preventFlickering = false; + /** + * whether to apply history reprojection (debug option) + */ + public boolean historyReprojection = true; } /** @@ -1798,6 +2122,7 @@ public enum ShadowType { * PCF with soft shadows and contact hardening */ PCSS, + PCFd, } /** @@ -1860,4 +2185,11 @@ public static class SoftShadowOptions { */ public float penumbraRatioScale = 1.0f; } + + /** + * Options for stereoscopic (multi-eye) rendering. + */ + public static class StereoscopicOptions { + public boolean enabled = false; + } } diff --git a/android/filament-android/src/main/java/com/google/android/filament/android/FilamentHelper.java b/android/filament-android/src/main/java/com/google/android/filament/android/FilamentHelper.java new file mode 100644 index 00000000000..6cb738e7dff --- /dev/null +++ b/android/filament-android/src/main/java/com/google/android/filament/android/FilamentHelper.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.filament.android; + +import com.google.android.filament.Engine; +import com.google.android.filament.Fence; + +public class FilamentHelper { + + /** + * Wait for all pending frames to be processed before returning. This is to avoid a race + * between the surface being resized before pending frames are rendered into it. + *

      + * For {@link android.view.TextureView} this must be called before the texture's size is + * reconfigured, which unfortunately is done by the Android framework before + * {@link UiHelper} listeners are invoked. Therefore synchronizePendingFrames + * cannot be called from + * {@link android.view.TextureView.SurfaceTextureListener#onSurfaceTextureSizeChanged}; instead + * a subclass of {@link android.view.TextureView} must be used in order to call it from + * {@link android.view.TextureView#onSizeChanged}: + *

      + *
      +     * public class MyTextureView extends TextureView {
      +     *     private Engine engine;
      +     *     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
      +     *         FilamentHelper.synchronizePendingFrames(engine);
      +     *         super.onSizeChanged(w, h, oldw, oldh);
      +     *     }
      +     * }
      +     * 
      + * + * Otherwise, this is typically called from {@link UiHelper.RendererCallback#onResized}, + * {@link android.view.SurfaceHolder.Callback#surfaceChanged}. + * + * @param engine Filament engine to synchronize + * + * @see UiHelper.RendererCallback#onResized + * @see android.view.SurfaceHolder.Callback#surfaceChanged + * @see android.view.TextureView#onSizeChanged + */ + static public void synchronizePendingFrames(Engine engine) { + Fence fence = engine.createFence(); + fence.wait(Fence.Mode.FLUSH, Fence.WAIT_FOR_EVER); + engine.destroyFence(fence); + } +} diff --git a/android/filament-android/src/main/java/com/google/android/filament/android/UiHelper.java b/android/filament-android/src/main/java/com/google/android/filament/android/UiHelper.java index ae1bdcd7c0b..4d6f3a140f1 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/android/UiHelper.java +++ b/android/filament-android/src/main/java/com/google/android/filament/android/UiHelper.java @@ -27,7 +27,7 @@ import android.view.SurfaceView; import android.view.TextureView; -import com.google.android.filament.SwapChain; +import com.google.android.filament.SwapChainFlags; /** * UiHelper is a simple class that can manage either a SurfaceView, TextureView, or a SurfaceHolder @@ -84,6 +84,14 @@ * // The native surface has changed size. This is always called at least once * // after the surface is created (after onNativeWindowChanged() is invoked). * public void onResized(int width, int height) { + * + * // Wait for all pending frames to be processed before returning. This is to + * // avoid a race between the surface being resized before pending frames are + * // rendered into it. + * Fence fence = mEngine.createFence(); + * fence.wait(Fence.Mode.FLUSH, Fence.WAIT_FOR_EVER); + * mEngine.destroyFence(fence); + * * // Compute camera projection and set the viewport on the view * } * }); @@ -174,28 +182,85 @@ private interface RenderSurface { void detach(); } - private static class SurfaceViewHandler implements RenderSurface { - private SurfaceView mSurfaceView; + private class SurfaceViewHandler implements RenderSurface, SurfaceHolder.Callback { + @NonNull private final SurfaceView mSurfaceView; + + SurfaceViewHandler(@NonNull SurfaceView surfaceView) { + mSurfaceView = surfaceView; + + @NonNull SurfaceHolder holder = surfaceView.getHolder(); + holder.addCallback(this); + + if (mDesiredWidth > 0 && mDesiredHeight > 0) { + holder.setFixedSize(mDesiredWidth, mDesiredHeight); + } - SurfaceViewHandler(SurfaceView surface) { - mSurfaceView = surface; + // in case the SurfaceView's surface already existed + final Surface surface = holder.getSurface(); + if (surface != null && surface.isValid()) { + surfaceCreated(holder); + // there is no way to retrieve the actual PixelFormat, since it is not used + // in the callback, we can use whatever we want. + surfaceChanged(holder, PixelFormat.RGBA_8888, + holder.getSurfaceFrame().width(), holder.getSurfaceFrame().height()); + } } @Override public void resize(int width, int height) { - mSurfaceView.getHolder().setFixedSize(width, height); + @NonNull SurfaceHolder holder = mSurfaceView.getHolder(); + holder.setFixedSize(width, height); } @Override public void detach() { + @NonNull SurfaceHolder holder = mSurfaceView.getHolder(); + holder.removeCallback(this); + } + + @Override + public void surfaceCreated(@NonNull SurfaceHolder holder) { + if (LOGGING) Log.d(LOG_TAG, "surfaceCreated()"); + createSwapChain(holder.getSurface()); + } + + @Override + public void surfaceChanged( + @NonNull SurfaceHolder holder, int format, int width, int height) { + // Note: this is always called at least once after surfaceCreated() + if (LOGGING) Log.d(LOG_TAG, "surfaceChanged(" + width + ", " + height + ")"); + if (mRenderCallback != null) { + mRenderCallback.onResized(width, height); + } + } + + @Override + public void surfaceDestroyed(@NonNull SurfaceHolder holder) { + if (LOGGING) Log.d(LOG_TAG, "surfaceDestroyed()"); + destroySwapChain(); } } - private static class SurfaceHolderHandler implements RenderSurface { - private SurfaceHolder mSurfaceHolder; + private class SurfaceHolderHandler implements RenderSurface, SurfaceHolder.Callback { + private final SurfaceHolder mSurfaceHolder; + + SurfaceHolderHandler(@NonNull SurfaceHolder holder) { + mSurfaceHolder = holder; + holder.addCallback(this); + + if (mDesiredWidth > 0 && mDesiredHeight > 0) { + holder.setFixedSize(mDesiredWidth, mDesiredHeight); + } - SurfaceHolderHandler(SurfaceHolder surface) { - mSurfaceHolder = surface; + // in case the SurfaceHolder's surface already existed + final Surface surface = holder.getSurface(); + if (surface != null && surface.isValid()) { + surfaceCreated(holder); + // there is no way to retrieve the actual PixelFormat, since it is not used + // in the callback, we can use whatever we want. + surfaceChanged(holder, PixelFormat.RGBA_8888, + holder.getSurfaceFrame().width(), holder.getSurfaceFrame().height()); + } } @Override @@ -205,30 +270,127 @@ public void resize(int width, int height) { @Override public void detach() { + mSurfaceHolder.removeCallback(this); + } + + @Override + public void surfaceCreated(@NonNull SurfaceHolder holder) { + if (LOGGING) Log.d(LOG_TAG, "surfaceCreated()"); + createSwapChain(holder.getSurface()); + } + + @Override + public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) { + // Note: this is always called at least once after surfaceCreated() + if (LOGGING) Log.d(LOG_TAG, "surfaceChanged(" + width + ", " + height + ")"); + if (mRenderCallback != null) { + mRenderCallback.onResized(width, height); + } + } + + @Override + public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) { + if (LOGGING) Log.d(LOG_TAG, "surfaceDestroyed()"); + destroySwapChain(); } } - private class TextureViewHandler implements RenderSurface { - private TextureView mTextureView; + private class TextureViewHandler implements RenderSurface, TextureView.SurfaceTextureListener { + private final TextureView mTextureView; private Surface mSurface; - TextureViewHandler(TextureView surface) { mTextureView = surface; } + TextureViewHandler(@NonNull TextureView view) { + mTextureView = view; + mTextureView.setSurfaceTextureListener(this); + // in case the View's SurfaceTexture already existed + if (view.isAvailable()) { + SurfaceTexture surfaceTexture = view.getSurfaceTexture(); + if (surfaceTexture != null) { + this.onSurfaceTextureAvailable(surfaceTexture, + mDesiredWidth, mDesiredHeight); + } + } + } @Override public void resize(int width, int height) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) { - mTextureView.getSurfaceTexture().setDefaultBufferSize(width, height); + final SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture(); + if (surfaceTexture != null) { + surfaceTexture.setDefaultBufferSize(width, height); + } + } + if (mRenderCallback != null) { + // the call above won't cause TextureView.onSurfaceTextureSizeChanged() + mRenderCallback.onResized(width, height); } - // the call above won't cause TextureView.onSurfaceTextureSizeChanged() - mRenderCallback.onResized(width, height); } @Override public void detach() { + mTextureView.setSurfaceTextureListener(null); + } + + + @Override + public void onSurfaceTextureAvailable( + @NonNull SurfaceTexture surfaceTexture, int width, int height) { + if (LOGGING) Log.d(LOG_TAG, "onSurfaceTextureAvailable()"); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) { + if (mDesiredWidth > 0 && mDesiredHeight > 0) { + surfaceTexture.setDefaultBufferSize(mDesiredWidth, mDesiredHeight); + } + } + + final Surface surface = new Surface(surfaceTexture); + setSurface(surface); + createSwapChain(surface); + + if (mRenderCallback != null) { + // Call this the first time because onSurfaceTextureSizeChanged() + // isn't called at initialization time + mRenderCallback.onResized(width, height); + } + } + + @Override + public void onSurfaceTextureSizeChanged( + @NonNull SurfaceTexture surfaceTexture, int width, int height) { + if (LOGGING) Log.d(LOG_TAG, "onSurfaceTextureSizeChanged()"); + if (mRenderCallback != null) { + if (mDesiredWidth > 0 && mDesiredHeight > 0) { + surfaceTexture.setDefaultBufferSize(mDesiredWidth, mDesiredHeight); + mRenderCallback.onResized(mDesiredWidth, mDesiredHeight); + } else { + mRenderCallback.onResized(width, height); + } + // We must recreate the SwapChain to guarantee that it sees the new size. + // More precisely, for an EGL client, the EGLSurface must be recreated. For + // a Vulkan client, the SwapChain must be recreated. Calling + // onNativeWindowChanged() will accomplish that. + // This requirement comes from SurfaceTexture.setDefaultBufferSize() + // documentation. + final Surface surface = getSurface(); + if (surface != null) { + mRenderCallback.onNativeWindowChanged(surface); + } + } + } + + @Override + public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surfaceTexture) { + if (LOGGING) Log.d(LOG_TAG, "onSurfaceTextureDestroyed()"); setSurface(null); + destroySwapChain(); + return true; } - void setSurface(Surface surface) { + @Override + public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surface) { } + + + private void setSurface(@Nullable Surface surface) { if (surface == null) { if (mSurface != null) { mSurface.release(); @@ -236,6 +398,10 @@ void setSurface(Surface surface) { } mSurface = surface; } + + private Surface getSurface() { + return mSurface; + } } /** @@ -279,6 +445,9 @@ public RendererCallback getRenderCallback() { * {@link #attachTo(TextureView)}, or {@link #attachTo(SurfaceHolder)}. */ public void detach() { + if (mRenderSurface != null) { + mRenderSurface.detach(); + } destroySwapChain(); mNativeWindow = null; mRenderSurface = null; @@ -286,7 +455,6 @@ public void detach() { /** * Checks whether we are ready to render into the attached surface. - * * Using OpenGL ES when this returns true, will result in drawing commands being lost, * HOWEVER, GLES state will be preserved. This is useful to initialize the engine. * @@ -331,7 +499,6 @@ public boolean isOpaque() { /** * Controls whether the render target (SurfaceView or TextureView) is opaque or not. * The render target is considered opaque by default. - * * Must be called before calling {@link #attachTo(SurfaceView)}, {@link #attachTo(TextureView)}, * or {@link #attachTo(SurfaceHolder)}. * @@ -354,10 +521,8 @@ public boolean isMediaOverlay() { * positioned above other surfaces but below the activity's surface. This property * only has an effect when used in combination with {@link #setOpaque(boolean) setOpaque(false)} * and does not affect TextureView targets. - * * Must be called before calling {@link #attachTo(SurfaceView)} * or {@link #attachTo(TextureView)}. - * * Has no effect when using {@link #attachTo(SurfaceHolder)}. * * @param overlay Indicates whether the render target should be rendered below the activity's @@ -373,12 +538,11 @@ public void setMediaOverlay(boolean overlay) { * the options set on this UiHelper. */ public long getSwapChainFlags() { - return isOpaque() ? SwapChain.CONFIG_DEFAULT : SwapChain.CONFIG_TRANSPARENT; + return isOpaque() ? SwapChainFlags.CONFIG_DEFAULT : SwapChainFlags.CONFIG_TRANSPARENT; } /** * Associate UiHelper with a SurfaceView. - * * As soon as SurfaceView is ready (i.e. has a Surface), we'll create the * EGL resources needed, and call user callbacks if needed. */ @@ -393,163 +557,32 @@ public void attachTo(@NonNull SurfaceView view) { view.setZOrderOnTop(translucent); } - int format = isOpaque() ? PixelFormat.OPAQUE : PixelFormat.TRANSLUCENT; - view.getHolder().setFormat(format); - + view.getHolder().setFormat(isOpaque() ? PixelFormat.OPAQUE : PixelFormat.TRANSLUCENT); mRenderSurface = new SurfaceViewHandler(view); - - final SurfaceHolder.Callback callback = new SurfaceHolder.Callback() { - @Override - public void surfaceCreated(SurfaceHolder holder) { - if (LOGGING) Log.d(LOG_TAG, "surfaceCreated()"); - createSwapChain(holder.getSurface()); - } - - @Override - public void surfaceChanged( - SurfaceHolder holder, int format, int width, int height) { - // Note: this is always called at least once after surfaceCreated() - if (LOGGING) Log.d(LOG_TAG, "surfaceChanged(" + width + ", " + height + ")"); - mRenderCallback.onResized(width, height); - } - - @Override - public void surfaceDestroyed(SurfaceHolder holder) { - if (LOGGING) Log.d(LOG_TAG, "surfaceDestroyed()"); - destroySwapChain(); - } - }; - - SurfaceHolder holder = view.getHolder(); - holder.addCallback(callback); - if (mDesiredWidth > 0 && mDesiredHeight > 0) { - holder.setFixedSize(mDesiredWidth, mDesiredHeight); - } - - // in case the SurfaceView's surface already existed - final Surface surface = holder.getSurface(); - if (surface != null && surface.isValid()) { - callback.surfaceCreated(holder); - callback.surfaceChanged(holder, format, - holder.getSurfaceFrame().width(), holder.getSurfaceFrame().height()); - } } } /** * Associate UiHelper with a TextureView. - * * As soon as TextureView is ready (i.e. has a buffer), we'll create the * EGL resources needed, and call user callbacks if needed. */ public void attachTo(@NonNull TextureView view) { if (attach(view)) { view.setOpaque(isOpaque()); - mRenderSurface = new TextureViewHandler(view); - - TextureView.SurfaceTextureListener listener = new TextureView.SurfaceTextureListener() { - @Override - public void onSurfaceTextureAvailable( - SurfaceTexture surfaceTexture, int width, int height) { - if (LOGGING) Log.d(LOG_TAG, "onSurfaceTextureAvailable()"); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) { - if (mDesiredWidth > 0 && mDesiredHeight > 0) { - surfaceTexture.setDefaultBufferSize(mDesiredWidth, mDesiredHeight); - } - } - - Surface surface = new Surface(surfaceTexture); - TextureViewHandler textureViewHandler = (TextureViewHandler) mRenderSurface; - textureViewHandler.setSurface(surface); - - createSwapChain(surface); - - // Call this the first time because onSurfaceTextureSizeChanged() - // isn't called at initialization time - mRenderCallback.onResized(width, height); - } - - @Override - public void onSurfaceTextureSizeChanged( - SurfaceTexture surfaceTexture, int width, int height) { - if (LOGGING) Log.d(LOG_TAG, "onSurfaceTextureSizeChanged()"); - if (mDesiredWidth > 0 && mDesiredHeight > 0) { - surfaceTexture.setDefaultBufferSize(mDesiredWidth, mDesiredHeight); - mRenderCallback.onResized(mDesiredWidth, mDesiredHeight); - } else { - mRenderCallback.onResized(width, height); - } - } - - @Override - public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { - if (LOGGING) Log.d(LOG_TAG, "onSurfaceTextureDestroyed()"); - destroySwapChain(); - return true; - } - - @Override - public void onSurfaceTextureUpdated(SurfaceTexture surface) { } - }; - - view.setSurfaceTextureListener(listener); - - // in case the View's SurfaceTexture already existed - if (view.isAvailable()) { - SurfaceTexture surfaceTexture = view.getSurfaceTexture(); - listener.onSurfaceTextureAvailable(surfaceTexture, mDesiredWidth, mDesiredHeight); - } } } /** * Associate UiHelper with a SurfaceHolder. - * * As soon as a Surface is created, we'll create the * EGL resources needed, and call user callbacks if needed. */ public void attachTo(@NonNull SurfaceHolder holder) { if (attach(holder)) { - int format = isOpaque() ? PixelFormat.OPAQUE : PixelFormat.TRANSLUCENT; - holder.setFormat(format); - + holder.setFormat(isOpaque() ? PixelFormat.OPAQUE : PixelFormat.TRANSLUCENT); mRenderSurface = new SurfaceHolderHandler(holder); - - final SurfaceHolder.Callback callback = new SurfaceHolder.Callback() { - @Override - public void surfaceCreated(SurfaceHolder surfaceHolder) { - if (LOGGING) Log.d(LOG_TAG, "surfaceCreated()"); - createSwapChain(holder.getSurface()); - } - - @Override - public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { - // Note: this is always called at least once after surfaceCreated() - if (LOGGING) Log.d(LOG_TAG, "surfaceChanged(" + width + ", " + height + ")"); - mRenderCallback.onResized(width, height); - } - - @Override - public void surfaceDestroyed(SurfaceHolder surfaceHolder) { - if (LOGGING) Log.d(LOG_TAG, "surfaceDestroyed()"); - destroySwapChain(); - } - }; - - holder.addCallback(callback); - if (mDesiredWidth > 0 && mDesiredHeight > 0) { - holder.setFixedSize(mDesiredWidth, mDesiredHeight); - } - - // in case the SurfaceHolder's surface already existed - final Surface surface = holder.getSurface(); - if (surface != null && surface.isValid()) { - callback.surfaceCreated(holder); - callback.surfaceChanged(holder, format, - holder.getSurfaceFrame().width(), holder.getSurfaceFrame().height()); - } } } @@ -560,6 +593,10 @@ private boolean attach(@NonNull Object nativeWindow) { // nothing to do return false; } + if (mRenderSurface != null) { + mRenderSurface.detach(); + mRenderSurface = null; + } destroySwapChain(); } mNativeWindow = nativeWindow; @@ -567,15 +604,16 @@ private boolean attach(@NonNull Object nativeWindow) { } private void createSwapChain(@NonNull Surface surface) { - mRenderCallback.onNativeWindowChanged(surface); + if (mRenderCallback != null) { + mRenderCallback.onNativeWindowChanged(surface); + } mHasSwapChain = true; } private void destroySwapChain() { - if (mRenderSurface != null) { - mRenderSurface.detach(); + if (mRenderCallback != null) { + mRenderCallback.onDetachedFromSurface(); } - mRenderCallback.onDetachedFromSurface(); mHasSwapChain = false; } } diff --git a/android/filament-utils-android/CMakeLists.txt b/android/filament-utils-android/CMakeLists.txt index 92c4a319b34..6c77cfa2b32 100644 --- a/android/filament-utils-android/CMakeLists.txt +++ b/android/filament-utils-android/CMakeLists.txt @@ -31,6 +31,7 @@ set_target_properties(iblprefilter PROPERTIES IMPORTED_LOCATION ${FILAMENT_DIR}/lib/${ANDROID_ABI}/libfilament-iblprefilter.a) set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libfilament-utils-jni.map") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=16384") add_library(filament-utils-jni SHARED src/main/cpp/AutomationEngine.cpp diff --git a/android/filament-utils-android/build.gradle b/android/filament-utils-android/build.gradle index 64bd0c0bbd0..d8a7a1741e6 100644 --- a/android/filament-utils-android/build.gradle +++ b/android/filament-utils-android/build.gradle @@ -1,4 +1,7 @@ apply plugin: 'kotlin-android' +kotlin { + jvmToolchain(versions.jdk) +} android { namespace 'com.google.android.filament.utils' @@ -9,9 +12,6 @@ android { } } - defaultConfig { - missingDimensionStrategy 'functionality', 'full' - } packagingOptions { // No need to package up the following shared libs, which arise as a side effect of our // externalNativeBuild dependencies. When clients pick and choose from project-level gradle @@ -21,16 +21,11 @@ android { excludes += ['lib/*/libfilament-jni.so', 'lib/*/libgltfio-jni.so'] } } -} -configurations.all { config -> - // Hack to preserve the version of the dependencies - if (!config.name.endsWith('Publication')) { - resolutionStrategy { - dependencySubstitution { - substitute(module("com.google.android.filament:gltfio-android:${VERSION_NAME}")).with(project(":gltfio-android")) - substitute(module("com.google.android.filament:gltfio-android-lite:${VERSION_NAME}")).with(project(":gltfio-android")) - } + publishing { + singleVariant("release") { + withSourcesJar() + withJavadocJar() } } } @@ -43,7 +38,7 @@ dependencies { implementation deps.coroutines.android api project(':filament-android') - api module("com.google.android.filament:gltfio-android:${VERSION_NAME}") + api project(':gltfio-android') } apply from: rootProject.file('gradle/gradle-mvn-push.gradle') diff --git a/android/filament-utils-android/src/main/cpp/AutomationEngine.cpp b/android/filament-utils-android/src/main/cpp/AutomationEngine.cpp index 44eb5ed6b18..e55a9605ee8 100644 --- a/android/filament-utils-android/src/main/cpp/AutomationEngine.cpp +++ b/android/filament-utils-android/src/main/cpp/AutomationEngine.cpp @@ -166,6 +166,8 @@ Java_com_google_android_filament_utils_AutomationEngine_nGetViewerOptions(JNIEnv const jfieldID cameraAperture = env->GetFieldID(klass, "cameraAperture", "F"); const jfieldID cameraSpeed = env->GetFieldID(klass, "cameraSpeed", "F"); const jfieldID cameraISO = env->GetFieldID(klass, "cameraISO", "F"); + const jfieldID cameraNear = env->GetFieldID(klass, "cameraNear", "F"); + const jfieldID cameraFar = env->GetFieldID(klass, "cameraFar", "F"); const jfieldID groundShadowStrength = env->GetFieldID(klass, "groundShadowStrength", "F"); const jfieldID groundPlaneEnabled = env->GetFieldID(klass, "groundPlaneEnabled", "Z"); const jfieldID skyboxEnabled = env->GetFieldID(klass, "skyboxEnabled", "Z"); @@ -177,6 +179,8 @@ Java_com_google_android_filament_utils_AutomationEngine_nGetViewerOptions(JNIEnv env->SetFloatField(result, cameraAperture, options.cameraAperture); env->SetFloatField(result, cameraSpeed, options.cameraSpeed); env->SetFloatField(result, cameraISO, options.cameraISO); + env->SetFloatField(result, cameraNear, options.cameraNear); + env->SetFloatField(result, cameraFar, options.cameraFar); env->SetFloatField(result, groundShadowStrength, options.groundShadowStrength); env->SetBooleanField(result, groundPlaneEnabled, options.groundPlaneEnabled); env->SetBooleanField(result, skyboxEnabled, options.skyboxEnabled); diff --git a/android/filament-utils-android/src/main/cpp/Manipulator.cpp b/android/filament-utils-android/src/main/cpp/Manipulator.cpp index 22d471def24..84ac111e759 100644 --- a/android/filament-utils-android/src/main/cpp/Manipulator.cpp +++ b/android/filament-utils-android/src/main/cpp/Manipulator.cpp @@ -125,6 +125,11 @@ extern "C" JNIEXPORT void Java_com_google_android_filament_utils_Manipulator_nBu builder->groundPlane(a, b, c, d); } +extern "C" JNIEXPORT void Java_com_google_android_filament_utils_Manipulator_nBuilderPanning(JNIEnv*, jclass, jlong nativeBuilder, jboolean enabled) { + Builder* builder = (Builder*) nativeBuilder; + builder->panning(enabled); +} + extern "C" JNIEXPORT long Java_com_google_android_filament_utils_Manipulator_nBuilderBuild(JNIEnv*, jclass, jlong nativeBuilder, jint mode) { Builder* builder = (Builder*) nativeBuilder; return (jlong) builder->build((Mode) mode); diff --git a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/AutomationEngine.java b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/AutomationEngine.java index 93987d6c36a..daa1da4274b 100644 --- a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/AutomationEngine.java +++ b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/AutomationEngine.java @@ -97,6 +97,8 @@ public static class ViewerOptions { public float cameraAperture = 16.0f; public float cameraSpeed = 125.0f; public float cameraISO = 100.0f; + public float cameraNear = 0.1f; + public float cameraFar = 100.0f; public float groundShadowStrength = 0.75f; public boolean groundPlaneEnabled = false; public boolean skyboxEnabled = true; diff --git a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Half.kt b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Half.kt new file mode 100644 index 00000000000..f985d58b6ff --- /dev/null +++ b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Half.kt @@ -0,0 +1,1171 @@ +/* + * Copyright (C) 2022 Romain Guy + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Operators +, *, / based on http://half.sourceforge.net/ by Christian Rau +// and licensed under MIT + +@file:Suppress("NOTHING_TO_INLINE") + +package com.google.android.filament.utils + +import com.google.android.filament.utils.Half.Companion.POSITIVE_INFINITY +import com.google.android.filament.utils.Half.Companion.POSITIVE_ZERO + +import kotlin.jvm.JvmInline + +/** + * Converts the specified double-precision float value into a + * half-precision float value. The following special cases are handled: + * + * - If the input is NaN (see [Double.isNaN]), the returned value is [Half.NaN] + * - If the input is [Double.POSITIVE_INFINITY] or [Double.NEGATIVE_INFINITY], + * the returned value is respectively [Half.POSITIVE_INFINITY] or [Half.NEGATIVE_INFINITY] + * - If the input is 0 (positive or negative), the returned value is [Half.POSITIVE_ZERO] + * or [Half.NEGATIVE_ZERO] + * - If the input is less than [Half.MIN_VALUE], the returned value is flushed to + * [Half.POSITIVE_ZERO] or [Half.NEGATIVE_ZERO] + * - If the input is less than [Half.MIN_NORMAL], the returned value is a denormal + * half-precision float + * - Otherwise, the returned value is rounded to the nearest representable + * half-precision float value + * + * @param value The double-precision float value to convert to half-precision + * @return A half-precision float value + */ +fun Half(value: Double) = Half(floatToHalf(value.toFloat())) + +/** + * Converts this double-precision float value into a half-precision float value. + * The following special cases are handled: + * + * - If the input is NaN (see [Double.isNaN]), the returned value is [Half.NaN] + * - If the input is [Double.POSITIVE_INFINITY] or [Double.NEGATIVE_INFINITY], + * the returned value is respectively [Half.POSITIVE_INFINITY] or [Half.NEGATIVE_INFINITY] + * - If the input is 0 (positive or negative), the returned value is [Half.POSITIVE_ZERO] + * or [Half.NEGATIVE_ZERO] + * - If the input is less than [Half.MIN_VALUE], the returned value is flushed to + * [Half.POSITIVE_ZERO] or [Half.NEGATIVE_ZERO] + * - If the input is less than [Half.MIN_NORMAL], the returned value is a denormal + * half-precision float + * - Otherwise, the returned value is rounded to the nearest representable + * half-precision float value + * + * @return A half-precision float value + */ +fun Double.toHalf() = Half(floatToHalf(toFloat())) + +/** + * Converts this double-precision float value into a half-precision float value. + * The following special cases are handled: + * + * - If the input is NaN (see [Double.isNaN]), the returned value is [Half.NaN] + * - If the input is [Double.POSITIVE_INFINITY] or [Double.NEGATIVE_INFINITY], + * the returned value is respectively [Half.POSITIVE_INFINITY] or [Half.NEGATIVE_INFINITY] + * - If the input is 0 (positive or negative), the returned value is [Half.POSITIVE_ZERO] + * or [Half.NEGATIVE_ZERO] + * - If the input is less than [Half.MIN_VALUE], the returned value is flushed to + * [Half.POSITIVE_ZERO] or [Half.NEGATIVE_ZERO] + * - If the input is less than [Half.MIN_NORMAL], the returned value is a denormal + * half-precision float + * - Otherwise, the returned value is rounded to the nearest representable + * half-precision float value + * + * @return A half-precision float value + */ +val Double.h: Half + get() = Half(floatToHalf(toFloat())) + +/** + * Converts the specified single-precision float value into a + * half-precision float value. The following special cases are handled: + * + * - If the input is NaN (see [Float.isNaN]), the returned value is [Half.NaN] + * - If the input is [Float.POSITIVE_INFINITY] or [Float.NEGATIVE_INFINITY], + * the returned value is respectively [Half.POSITIVE_INFINITY] or [Half.NEGATIVE_INFINITY] + * - If the input is 0 (positive or negative), the returned value is [Half.POSITIVE_ZERO] + * or [Half.NEGATIVE_ZERO] + * - If the input is less than [Half.MIN_VALUE], the returned value is flushed to + * [Half.POSITIVE_ZERO] or [Half.NEGATIVE_ZERO] + * - If the input is less than [Half.MIN_NORMAL], the returned value is a denormal + * half-precision float + * - Otherwise, the returned value is rounded to the nearest representable + * half-precision float value + * + * @param value The single-precision float value to convert to half-precision + * @return A half-precision float value + */ +fun Half(value: Float) = Half(floatToHalf(value)) + +/** + * Converts this single-precision float value into a half-precision float value. + * The following special cases are handled: + * + * - If the input is NaN (see [Float.isNaN]), the returned value is [Half.NaN] + * - If the input is [Float.POSITIVE_INFINITY] or [Float.NEGATIVE_INFINITY], + * the returned value is respectively [Half.POSITIVE_INFINITY] or [Half.NEGATIVE_INFINITY] + * - If the input is 0 (positive or negative), the returned value is [Half.POSITIVE_ZERO] + * or [Half.NEGATIVE_ZERO] + * - If the input is less than [Half.MIN_VALUE], the returned value is flushed to + * [Half.POSITIVE_ZERO] or [Half.NEGATIVE_ZERO] + * - If the input is less than [Half.MIN_NORMAL], the returned value is a denormal + * half-precision float + * - Otherwise, the returned value is rounded to the nearest representable + * half-precision float value + * + * @return A half-precision float value + */ +fun Float.toHalf() = Half(floatToHalf(this)) + +/** + * Converts this single-precision float value into a half-precision float value. + * The following special cases are handled: + * + * - If the input is NaN (see [Float.isNaN]), the returned value is [Half.NaN] + * - If the input is [Float.POSITIVE_INFINITY] or [Float.NEGATIVE_INFINITY], + * the returned value is respectively [Half.POSITIVE_INFINITY] or [Half.NEGATIVE_INFINITY] + * - If the input is 0 (positive or negative), the returned value is [Half.POSITIVE_ZERO] + * or [Half.NEGATIVE_ZERO] + * - If the input is less than [Half.MIN_VALUE], the returned value is flushed to + * [Half.POSITIVE_ZERO] or [Half.NEGATIVE_ZERO] + * - If the input is less than [Half.MIN_NORMAL], the returned value is a denormal + * half-precision float + * - Otherwise, the returned value is rounded to the nearest representable + * half-precision float value + * + * @return A half-precision float value + */ +val Float.h: Half + get() = Half(floatToHalf(this)) + +/** + * Returns the half-precision float value represented by the specified string. + * The string is converted to a half-precision float value as if by the + * [String.toFloat()] method.

      + * + * Calling this function is equivalent to calling: + * ``` + * Half(value.toFloat()) + * ``` + * + * @param value A string to be converted to a {@code Half} + * @throws NumberFormatException if the string does not contain a parsable number + * + * @see String.toFloat + */ +fun Half(value: String) = Half(floatToHalf(value.toFloat())) + +/** + * Returns the half-precision float value represented by the specified string. + * The string is converted to a half-precision float value as if by the + * [String.toFloat()] method.

      + * + * Calling this function is equivalent to calling: + * ``` + * Half(value.toFloat()) + * ``` + * + * @throws NumberFormatException if the string does not contain a parsable number + * + * @see String.toFloat + */ +fun String.toHalf() = Half(floatToHalf(toFloat())) + +/** + * The [Half] class is a wrapper and a utility class to manipulate half-precision 16-bit + * [IEEE 754](https://en.wikipedia.org/wiki/Half-precision_floating-point_format) + * floating point data types (also called fp16 or binary16). A half-precision float can be + * created from or converted to single-precision floats, and is stored in a short data type. + * + * The IEEE 754 standard specifies an fp16 as having the following format: + * - Sign bit: 1 bit + * - Exponent width: 5 bits + * - Significand: 10 bits + * + * The format is laid out as follows: + * ``` + * 1 11111 1111111111 + * ^ --^-- -----^---- + * sign | |_______ significand + * | + * -- exponent + * ``` + * + * Half-precision floating points can be useful to save memory and/or + * bandwidth at the expense of range and precision when compared to single-precision + * floating points (fp32). + * + * To help you decide whether fp16 is the right storage type for you need, please + * refer to the table below that shows the available precision throughout the range of + * possible values. The _precision_ column indicates the step size between two + * consecutive numbers in a specific part of the range. + * + * | Range start | Precision | + * |------------------|----------------------| + * | 0 | 1 ⁄ 16,777,216 | + * | 1 ⁄ 16,384 | 1 ⁄ 16,777,216 | + * | 1 ⁄ 8,192 | 1 ⁄ 8,388,608 | + * | 1 ⁄ 4,096 | 1 ⁄ 4,194,304 | + * | 1 ⁄ 2,048 | 1 ⁄ 2,097,152 | + * | 1 ⁄ 1,024 | 1 ⁄ 1,048,576 | + * | 1 ⁄ 512 | 1 ⁄ 524,288 | + * | 1 ⁄ 256 | 1 ⁄ 262,144 | + * | 1 ⁄ 128 | 1 ⁄ 131,072 | + * | 1 ⁄ 64 | 1 ⁄ 65,536 | + * | 1 ⁄ 32 | 1 ⁄ 32,768 | + * | 1 ⁄ 16 | 1 ⁄ 16,384 | + * | 1 ⁄ 8 | 1 ⁄ 8,192 | + * | 1 ⁄ 4 | 1 ⁄ 4,096 | + * | 1 ⁄ 2 | 1 ⁄ 2,048 | + * | 1 | 1 ⁄ 1,024 | + * | 2 | 1 ⁄ 512 | + * | 4 | 1 ⁄ 256 | + * | 8 | 1 ⁄ 128 | + * | 16 | 1 ⁄ 64 | + * | 32 | 1 ⁄ 32 | + * | 64 | 1 ⁄ 16 | + * | 128 | 1 ⁄ 8 | + * | 256 | 1 ⁄ 4 | + * | 512 | 1 ⁄ 2 | + * | 1,024 | 1 | + * | 2,048 | 2 | + * | 4,096 | 4 | + * | 8,192 | 8 | + * | 16,384 | 16 | + * | 32,768 | 32 | + * + * This table shows that numbers higher than 1024 lose all fractional precision. + */ +@JvmInline +value class Half(private val v: UShort) : Comparable { + companion object { + /** + * The number of bits used to represent a half-precision float value. + */ + const val SIZE = 16 + + /** + * Epsilon is the difference between 1.0 and the next value representable + * by a half-precision floating-point. + */ + val EPSILON = Half(0x1400.toUShort()) + + /** + * Maximum exponent a finite half-precision float may have. + */ + const val MAX_EXPONENT = 15 + + /** + * Minimum exponent a normalized half-precision float may have. + */ + const val MIN_EXPONENT = -14 + + /** + * Smallest negative value a half-precision float may have. + */ + val LOWEST_VALUE = Half(0xfbff.toUShort()) + + /** + * Maximum positive finite value a half-precision float may have. + */ + val MAX_VALUE = Half(0x7bff.toUShort()) + + /** + * Smallest positive normal value a half-precision float may have. + */ + val MIN_NORMAL = Half(0x0400.toUShort()) + + /** + * Smallest positive non-zero value a half-precision float may have. + */ + val MIN_VALUE = Half(0x0001.toUShort()) + + /** + * A Not-a-Number representation of a half-precision float. + */ + val NaN = Half(0x7e00.toUShort()) + + /** + * Negative infinity of type half-precision float. + */ + val NEGATIVE_INFINITY = Half(0xfc00.toUShort()) + + /** + * Negative 0 of type half-precision float. + */ + val NEGATIVE_ZERO = Half(0x8000.toUShort()) + + /** + * Positive infinity of type half-precision float. + */ + val POSITIVE_INFINITY = Half(0x7c00.toUShort()) + + /** + * Positive 0 of type half-precision float. + */ + val POSITIVE_ZERO = Half(0x0000.toUShort()) + + /** + * Returns the [Half] value corresponding to the given bit representation according to + * the IEEE 754 floating-point half-precision bit layout. + */ + fun fromBits(bits: Int) = Half((bits and 0xffff).toUShort()) + } + + /** + * Returns the sign of this half-precision float value: + * - `Half(-1.0)` if the value is negative, + * - [POSITIVE_ZERO] if the value is zero, + * - `Half(1.0)` if the value is positive + * - [NaN] is the value is Not-a-Number + */ + val sign: Half + get() { + val bits = v.toInt() + val abs = bits and FP16_ABS + return when { + abs > FP16_EXPONENT_MAX -> NaN + abs == 0 -> POSITIVE_ZERO + else -> if (bits and FP16_SIGN_MASK != 0) Half(-1.0f) else Half(1.0f) + } + } + + /** + * Returns the unbiased exponent used in the representation of this half-precision float value. + * if the value is NaN or infinite, this method returns [MAX_EXPONENT] + 1. + * If the argument is 0 or a subnormal representation, this method returns [MIN_EXPONENT] - 1. + */ + val exponent: Int + get() = ((v.toInt() ushr FP16_EXPONENT_SHIFT) and FP16_EXPONENT_MASK) - FP16_EXPONENT_BIAS + + /** + * Returns the significand, or mantissa, used in the representation of this + * half-precision float value. + */ + val significand: Int + get() = v.toInt() and FP16_SIGNIFICAND_MASK + + /** + * Returns the absolute value of this half-precision float. + * Special values are handled in the following ways: + * - If the specified half-precision float is NaN, the result is NaN + * - If the specified half-precision float is zero (negative or positive), + * the result is positive zero (see [POSITIVE_ZERO]) + * - If the specified half-precision float is infinity (negative or positive), + * the result is positive infinity (see [POSITIVE_INFINITY]) + * + * @return The absolute value of the specified half-precision float + */ + val absoluteValue: Half + get() = Half((v.toInt() and FP16_ABS).toUShort()) + + /** + * Returns the ulp of this value. + * An ulp is a positive distance between this value and the next nearest [Half] value + * larger in magnitude. + * + * Special Cases: + * - `NaN.ulp` is [NaN] + * - `x.ulp` is [POSITIVE_INFINITY] when x is [POSITIVE_INFINITY] or [NEGATIVE_INFINITY] + * - `0.0.ulp` is [MIN_VALUE] + */ + val ulp: Half + get() = when { + isNaN() -> NaN + isInfinite() -> POSITIVE_INFINITY + // 0x7bff == MAX_VALUE, return 2^4 + v.toInt() and FP16_ABS == 0x7bff -> Half(0x4c00.toUShort()) + else -> { + val d = absoluteValue + d.nextUp() - d + } + } + + /** + * Returns a bit representation of this half-precision floating point value as [Int] + * according to the IEEE 754 floating-point half-precision bit layout. + */ + fun toBits() = v.toInt() + + /** + * Returns the value of this [Half] as a `byte` after a narrowing primitive conversion. + * + * @return The half-precision float value represented by this object converted to type `byte` + * @see halfToShort + */ + fun toByte() = halfToShort(v).toInt().toByte() + + /** + * Returns the value of this [Half] as a `short` after a narrowing primitive conversion. + * + * @return The half-precision float value represented by this object converted to type `short` + * @see halfToShort + */ + fun toShort() = halfToShort(v).toInt().toShort() + + /** + * Returns the value of this [Half] as a `int` after a narrowing primitive conversion. + * + * @return The half-precision float value represented by this object converted to type `int` + * @see halfToShort + * */ + fun toInt() = halfToShort(v).toInt() + + /** + * Returns the value of this [Half] as a `long` after a narrowing primitive conversion. + * + * @return The half-precision float value represented by this object converted to type `long` + * @see halfToShort + */ + fun toLong() = halfToShort(v).toLong() + + /** + * Returns the value of this [Half] as a `float` after a widening primitive conversion. + * + * The following special cases are handled: + * - If the input is [Half.NaN], the returned value is [Float.NaN] + * - If the input is [Half.POSITIVE_INFINITY] or + * [Half.NEGATIVE_INFINITY], the returned value is respectively [Float.POSITIVE_INFINITY] + * or [Float.NEGATIVE_INFINITY] + * - If the input is 0 (positive or negative), the returned value is +/-0.0f + * - Otherwise, the returned value is a normalized single-precision float value + * + * @return The half-precision float value represented by this object converted to type `float` + */ + fun toFloat() = halfToShort(v) + + /** + * Returns the value of this [Half] as a `double` after a widening primitive conversion. + * + * The following special cases are handled: + * - If the input is [Half.NaN], the returned value is [Double.NaN] + * - If the input is [Half.POSITIVE_INFINITY] or + * [Half.NEGATIVE_INFINITY], the returned value is respectively [Double.POSITIVE_INFINITY] + * or [Double.NEGATIVE_INFINITY] + * - If the input is 0 (positive or negative), the returned value is +/-0.0f + * - Otherwise, the returned value is a normalized double-precision float value + * + * @return The half-precision float value represented by this object converted to type `double` + */ + fun toDouble() = halfToShort(v).toDouble() + + /** + * Returns true if this half-precision float value represents a Not-a-Number, false otherwise. + */ + fun isNaN() = (v.toInt() and FP16_ABS) > FP16_EXPONENT_MAX + + /** + * Returns true if this half-precision float value represents infinity, false otherwise. + */ + fun isInfinite() = (v.toInt() and FP16_ABS) == FP16_EXPONENT_MAX + + /** + * Returns true if this half-precision float value does not represent infinity nor NaN, + * false otherwise. + */ + fun isFinite() = (v.toInt() and FP16_EXPONENT_MAX) != FP16_EXPONENT_MAX + + /** + * Returns true if this half-precision float value represents zero, false otherwise. + */ + fun isZero() = (v.toInt() and FP16_ABS) == 0 + + /** + * Returns true if this half-precision float value is normalized (does not have a subnormal + * representation). If this value is [Half.POSITIVE_INFINITY], [Half.NEGATIVE_INFINITY], + * [Half.POSITIVE_ZERO], [Half.NEGATIVE_ZERO], NaN or any subnormal number, this method + * returns false. + * + * @return True if the value is normalized, false otherwise + */ + fun isNormalized() = (v.toInt() and FP16_EXPONENT_MAX) != 0 + && (v.toInt() and FP16_EXPONENT_MAX) != FP16_EXPONENT_MAX + + /** + * Returns this value with the sign bit same as of the [sign] value. + * If [sign] is NaN the sign of the result is undefined. + */ + fun withSign(sign: Half) = + Half(((sign.v.toInt() and FP16_SIGN_MASK) or (v.toInt() and FP16_ABS)).toUShort()) + + /** + * Returns the [Half] value nearest to this value in direction of positive infinity. + */ + fun nextUp(): Half = when { + isNaN() || v == POSITIVE_INFINITY.v -> this + isZero() -> MIN_VALUE + else -> Half((toBits() + if (v.toInt() and FP16_SIGN_MASK == 0) 1 else -1).toUShort()) + } + + /** + * Returns the [Half] value nearest to this value in direction of negative infinity. + */ + fun nextDown(): Half = when { + isNaN() || v == NEGATIVE_INFINITY.v -> this + isZero() -> -MIN_VALUE + else -> Half((toBits() + if (v.toInt() and FP16_SIGN_MASK == 0) -1 else 1).toUShort()) + } + + /** + * Returns the [Half] value nearest to this value in direction from this value towards + * the value [to]. + * + * Special cases: + * - `x.nextTowards(y)` is `NaN` if either `x` or `y` are `NaN` + * - `x.nextTowards(x) == x` + */ + fun nextTowards(to: Half) = when { + isNaN() || to.isNaN() -> NaN + to == this -> this + to > this -> nextUp() + else -> nextDown() + } + + /** + * Rounds this [Half] value to the nearest integer and converts the result to [Int]. + * Ties are rounded towards positive infinity. + * + * @throws IllegalArgumentException when this value is `NaN` + */ + fun roundToInt() = when { + isNaN() -> throw IllegalArgumentException("Cannot round NaN value.") + else -> round(this).toInt() + } + + /** + * Rounds this [Half] value to the nearest integer and converts the result to [Long]. + * Ties are rounded towards positive infinity. + * + * @throws IllegalArgumentException when this value is `NaN` + */ + fun roundToLong() = when { + isNaN() -> throw IllegalArgumentException("Cannot round NaN value.") + else -> round(this).toLong() + } + + operator fun unaryMinus() = Half((v.toInt() xor FP16_SIGN_MASK).toUShort()) + + operator fun unaryPlus() = Half(v) + + operator fun plus(other: Half): Half { + val xbits = toBits() + val ybits = other.toBits() + + val sub = ((xbits xor ybits) and FP16_SIGN_MASK) != 0 + + var ax = xbits and FP16_ABS + var ay = ybits and FP16_ABS + + // Handle NaNs and infinities + if (ax >= FP16_EXPONENT_MAX || ay >= FP16_EXPONENT_MAX) { + return Half(( + if (ax > FP16_EXPONENT_MAX || ay > FP16_EXPONENT_MAX) quiet(ax, ay) + else if (ay != FP16_EXPONENT_MAX) xbits + else if (sub && ax == FP16_EXPONENT_MAX) FP16_QUIET_NAN + else ybits + ).toUShort()) + } + + // Handle zero operands, including signs + if (ax == 0) return if (ay != 0) other else Half((xbits and ybits).toUShort()) + if (ay == 0) return this + + // Compute the sign of the result + val s = (if (sub && ay > ax) ybits else xbits) and FP16_SIGN_MASK + + if (ay > ax) { + val t = ax + ax = ay + ay = t + } + + var e = (ax shr 10) + if (ax <= FP16_SIGNIFICAND_MASK) 1 else 0 + val d = e - (ay shr 10) - if (ay <= FP16_SIGNIFICAND_MASK) 1 else 0 + + var mx = ((ax and FP16_SIGNIFICAND_MASK) or + ((if (ax > FP16_SIGNIFICAND_MASK) 1 else 0) shl 10)) shl 3 + var my: Int + + if (d < 13) { + my = ((ay and FP16_SIGNIFICAND_MASK) or + ((if (ay > FP16_SIGNIFICAND_MASK) 1 else 0) shl 10)) shl 3 + my = (my shr d) or (if ((my and ((1 shl d) - 1)) != 0) 1 else 0) + } else { + my = 1 + } + + if (sub) { + mx -= my + if (mx == 0) return POSITIVE_ZERO + while (mx < 0x2000 && e > 1) { + mx = mx shl 1 + e-- + } + } else { + mx += my + val i = mx shr 14 + e += i + if (e > 30) return Half((s or FP16_EXPONENT_MAX).toUShort()) + mx = (mx shr i) or (mx and i) + } + + // Guard and sticky bits + val v = s +((e - 1) shl 10) + (mx shr 3) + val G = (mx shr 2) and 1 + val S = if (mx and 0x3 != 0) 1 else 0 + + return Half((v + (G and (S or v))).toUShort()) + } + + operator fun minus(other: Half) = this + (-other) + + operator fun times(other: Half): Half { + val xbits = toBits() + val ybits = other.toBits() + + val s = (xbits xor ybits) and FP16_SIGN_MASK + var e = -16 + + var ax = xbits and FP16_ABS + var ay = ybits and FP16_ABS + + // Handle NaNs and infinities + if (ax >= FP16_EXPONENT_MAX || ay >= FP16_EXPONENT_MAX) { + return Half((when { + ax > FP16_EXPONENT_MAX || ay > FP16_EXPONENT_MAX -> quiet(ax, ay) + (ax == FP16_EXPONENT_MAX && ay == 0) || (ay == FP16_EXPONENT_MAX && ax == 0) -> FP16_QUIET_NAN + else -> s or FP16_EXPONENT_MAX + }).toUShort()) + } + + // Either operand is 0, return 0 with the appropriate sign + if (ax == 0 || ay ==0) return Half(s.toUShort()) + + while (ax < 0x400) { + ax = ax shl 1 + e-- + } + while (ay < 0x400) { + ay = ay shl 1 + e-- + } + + // Add leading 1. and perform the multiplication as uint32 + val m = + ((ax and FP16_SIGNIFICAND_MASK) or 0x400).toUInt() * + ((ay and FP16_SIGNIFICAND_MASK) or 0x400).toUInt() + + val i = m shr 21 + e += (ax shr 10) + (ay shr 10) + i.toInt() + + // Overflow and underflow + if (e > 29) return Half((s or FP16_EXPONENT_MAX).toUShort()) + else if (e < -11) return Half(s.toUShort()) + + return fixedToHalf(s, e, m shr i.toInt(), m and i, 20) + } + + operator fun div(other: Half): Half { + val xbits = toBits() + val ybits = other.toBits() + + val s = (xbits xor ybits) and FP16_SIGN_MASK + var e = 14 + + var ax = xbits and FP16_ABS + var ay = ybits and FP16_ABS + + // Handle NaNs and infinities + if (ax >= FP16_EXPONENT_MAX || ay >= FP16_EXPONENT_MAX) { + return Half((when { + ax > FP16_EXPONENT_MAX || ay > FP16_EXPONENT_MAX -> quiet(ax, ay) + ax == ay -> FP16_QUIET_NAN + else -> s or (if (ax == FP16_EXPONENT_MAX) FP16_EXPONENT_MAX else 0) + }).toUShort()) + } + + // Divisions by 0, return NaN or infinity + if (ax == 0) return Half((if (ay == 0) FP16_QUIET_NAN else s).toUShort()) + if (ay == 0) return Half((s or FP16_EXPONENT_MAX).toUShort()) + + while (ax < 0x400) { + ax = ax shl 1 + e-- + } + while (ay < 0x400) { + ay = ay shl 1 + e++ + } + + // Prepare for division in uint32 by adding back the leading 1. + var mx = ((ax and FP16_SIGNIFICAND_MASK) or 0x400).toUInt() + var my = ((ay and FP16_SIGNIFICAND_MASK) or 0x400).toUInt() + + val i = if (mx < my) 1 else 0 + e += (ax shr 10) - (ay shr 10) - i + + // Overflow and underflow + if (e > 29) return Half((s or FP16_EXPONENT_MAX).toUShort()) + else if (e < -11) return Half(s.toUShort()) + + mx = mx shl (12 + i) + my = my shl 1 + + return fixedToHalf(s, e, mx / my, if (mx % my != 0U) 1U else 0U, 11) + } + + operator fun inc() = this + Half(0x3c00.toUShort()) + + operator fun dec() = this + Half(0xbc00.toUShort()) + + override fun compareTo(other: Half): Int { + // Preserve the sign for comparisons later + var x = v.toShort().toInt() + var y = other.v.toShort().toInt() + + // Collapse NaNs, but we want to keep (signed) values to preserve the ordering of + // -0.0 and +0.0 + if (x and FP16_ABS > FP16_EXPONENT_MAX) x = FP16_NAN // NaN + if (y and FP16_ABS > FP16_EXPONENT_MAX) y = FP16_NAN // NaN + + if (x == y) return 0 + + val a = (x xor (FP16_SIGN_MASK or (FP16_SIGN_MASK - (x shr 15)))) + (x shr 15) + val b = (y xor (FP16_SIGN_MASK or (FP16_SIGN_MASK - (y shr 15)))) + (y shr 15) + + return if (a < b) -1 else 1 + } + + override fun toString() = toFloat().toString() + + /** + * + * Returns a hexadecimal string representation of the specified half-precision + * float value. If the value is a NaN, the result is `"NaN"`, + * otherwise the result follows this format: + * + * - If the sign is positive, no sign character appears in the result + * - If the sign is negative, the first character is `'-'` + * - If the value is inifinity, the string is `"Infinity"` + * - If the value is 0, the string is `"0x0.0p0"` + * - If the value has a normalized representation, the exponent and + * significand are represented in the string in two fields. The significand + * starts with `"0x1."` followed by its lowercase hexadecimal + * representation. Trailing zeroes are removed unless all digits are 0, then + * a single zero is used. The significand representation is followed by the + * exponent, represented by `"p"`, itself followed by a decimal + * string of the unbiased exponent + * - If the value has a subnormal representation, the significand starts + * with `"0x0."` followed by its lowercase hexadecimal + * representation. Trailing zeroes are removed unless all digits are 0, then + * a single zero is used. The significand representation is followed by the + * exponent, represented by `"p-14"` + * + * @return A hexadecimal string representation of the specified value + */ + fun toHexString(): String { + val o = StringBuilder() + val bits = v.toInt() + val s = bits ushr FP16_SIGN_SHIFT + val e = bits ushr FP16_EXPONENT_SHIFT and FP16_EXPONENT_MASK + val m = bits and FP16_SIGNIFICAND_MASK + if (e == 0x1f) { // Infinite or NaN + if (m == 0) { + if (s != 0) o.append('-') + o.append("Infinity") + } else { + o.append("NaN") + } + } else { + if (s == 1) o.append('-') + if (e == 0) { + if (m == 0) { + o.append("0x0.0p0") + } else { + o.append("0x0.") + val significand = m.toString(16) + o.append(significand.replaceFirst("0{2,}$".toRegex(), "")) + o.append("p-14") + } + } else { + o.append("0x1.") + val significand = m.toString(16) + o.append(significand.replaceFirst("0{2,}$".toRegex(), "")) + o.append('p') + o.append((e - FP16_EXPONENT_BIAS).toString()) + } + } + return o.toString() + } +} + +fun sqrt(x: Half): Half { + val bits = x.toBits() + var a = bits and FP16_ABS + var e = 15 + + if (a == 0 || a >= FP16_EXPONENT_MAX) { + return Half((when { + a > FP16_EXPONENT_MAX -> quiet(bits) + bits > FP16_SIGN_MASK -> FP16_QUIET_NAN + else -> bits + }).toUShort()) + } + + while (a < 0x400) { + a = a shl 1 + e-- + } + + // Bring back 1. + var r = ((a and FP16_SIGNIFICAND_MASK) or 0x400).toUInt() shl 10 + e += a shr 10 + val i = e and 1 + r = r shl i + e = (e - i) / 2 + + var m = 0U + var b = 1U shl 20 + while (b != 0U) { + if (r < m + b) { + m = m shr 1 + } else { + r -= m + b + m = (m shr 1) + b + } + b = b shr 2 + } + + // Guard and sticky bits + val v = (e shl 10).toUInt() + (m and 0x3ffU) + val G = if (r > m) 1U else 0U + val S = if (r != 0U) 1U else 0U + + return Half((v + (G and (S or v))).toUShort()) +} + +/** + * Returns the absolute value of the specified half-precision float. + * Special values are handled in the following ways: + * - If the specified half-precision float is NaN, the result is NaN + * - If the specified half-precision float is zero (negative or positive), + * the result is positive zero (see [POSITIVE_ZERO]) + * - If the specified half-precision float is infinity (negative or positive), + * the result is positive infinity (see [POSITIVE_INFINITY]) + * + * @return The absolute value of the specified half-precision float + */ +fun abs(x: Half) = x.absoluteValue + +/** + * Returns the smaller of two half-precision float values (the value closest + * to negative infinity). Special values are handled in the following ways: + * + * - If either value is NaN, the result is NaN + * - [Half.NEGATIVE_ZERO] is smaller than [Half.POSITIVE_ZERO] + * + * @param x The first half-precision value + * @param y The second half-precision value + * @return The smaller of the two specified half-precision values + */ +fun min(x: Half, y: Half): Half { + val a = x.toBits() + if (a and FP16_ABS > FP16_EXPONENT_MAX) return Half.NaN + + val b = y.toBits() + if (b and FP16_ABS > FP16_EXPONENT_MAX) return Half.NaN + + if (a and FP16_ABS == 0 && b and FP16_ABS == 0) { + return if (a and FP16_SIGN_MASK != 0) x else y + } + + return if ((if (a and FP16_SIGN_MASK != 0) 0x8000 - (a and 0xffff) else a and 0xffff) < + (if (b and FP16_SIGN_MASK != 0) 0x8000 - (b and 0xffff) else b and 0xffff)) x else y +} + +/** + * Returns the larger of two half-precision float values (the value closest + * to positive infinity). Special values are handled in the following ways: + * + * - If either value is NaN, the result is NaN + * - [Half.POSITIVE_ZERO] is greater than [Half.NEGATIVE_ZERO] + * + * + * @param x The first half-precision value + * @param y The second half-precision value + * + * @return The larger of the two specified half-precision values + */ +fun max(x: Half, y: Half): Half { + val a = x.toBits() + if (a and FP16_ABS > FP16_EXPONENT_MAX) return Half.NaN + + val b = y.toBits() + if (b and FP16_ABS > FP16_EXPONENT_MAX) return Half.NaN + + if (a and FP16_ABS == 0 && b and FP16_ABS == 0) { + return if (a and FP16_SIGN_MASK != 0) y else x + } + + return if ((if (a and FP16_SIGN_MASK != 0) 0x8000 - (a and 0xffff) else a and 0xffff) > + (if (b and FP16_SIGN_MASK != 0) 0x8000 - (b and 0xffff) else b and 0xffff)) x else y +} + +/** + * Returns the closest integral half-precision float value to the specified + * half-precision float value. Special values are handled in the + * following ways: + * + * - If the specified half-precision float is NaN, the result is NaN + * - If the specified half-precision float is infinity (negative or positive), + * the result is infinity (with the same sign) + * - If the specified half-precision float is zero (negative or positive), + * the result is zero (with the same sign) + * + * @param x A half-precision float value + * @return The value of the specified half-precision float rounded to the nearest + * half-precision float value + */ +fun round(x: Half): Half { + val bits = x.toBits() + var a = bits and FP16_ABS + var result = bits + + if (a < 0x3c00) { // < 1.0 + result = (result and FP16_SIGN_MASK) or (0x3c00 and (if (a >= 0x3800) 0xffff else 0x0)) + } else if (a < 0x6400) { // No fractional values above 1024 + a = 25 - (a shr 10) + val mask = (1 shl a) - 1 + result += 1 shl (a - 1) + result = result and mask.inv() + } else { + if (a > FP16_EXPONENT_MAX) result = quiet(result) + } + + return Half(result.toUShort()) +} + +/** + * Returns the largest half-precision float value toward positive infinity + * less than or equal to the specified half-precision float value. + * Special values are handled in the following ways: + * + * - If the specified half-precision float is NaN, the result is NaN + * - If the specified half-precision float is infinity (negative or positive), + * the result is infinity (with the same sign) + * - If the specified half-precision float is zero (negative or positive), + * the result is zero (with the same sign) + * + * @param x A half-precision float value + * @return The largest half-precision float value toward positive infinity + * less than or equal to the specified half-precision float value + */ +fun floor(x: Half): Half { + val bits = x.toBits() + var a = bits and FP16_ABS + var result = bits + + if (a < 0x3c00) { // < 1.0 + result = (result and FP16_SIGN_MASK) or (0x3c00 and if (bits > 0x8000) 0xffff else 0x0) + } else if (a < 0x6400) { // No fractional values above 1024 + a = 25 - (a shr 10) + val mask = (1 shl a) - 1 + result += mask and -(bits shr 15) + result = result and mask.inv() + } else { + if (a > FP16_EXPONENT_MAX) result = quiet(result) + } + + return Half(result.toUShort()) +} + +/** + * Returns the smallest half-precision float value toward negative infinity + * greater than or equal to the specified half-precision float value. + * Special values are handled in the following ways: + * + * - If the specified half-precision float is NaN, the result is NaN + * - If the specified half-precision float is infinity (negative or positive), + * the result is infinity (with the same sign) + * - If the specified half-precision float is zero (negative or positive), + * the result is zero (with the same sign) + * + * @param x A half-precision float value + * @return The smallest half-precision float value toward negative infinity + * greater than or equal to the specified half-precision float value + */ +fun ceil(x: Half): Half { + val bits = x.toBits() + var a = bits and FP16_ABS + var result = bits + + if (a < 0x3c00) { // < 1.0 + result = result and FP16_SIGN_MASK + result = result or (0x3c00 and -((bits shr 15).inv() and if (a != 0) 1 else 0)) + } else if (a < 0x6400) { // No fractional values above 1024 + a = 25 - (a shr 10) + val mask = (1 shl a) - 1 + result += mask and (bits shr 15) - 1 + result = result and mask.inv() + } else { + if (a > FP16_EXPONENT_MAX) result = quiet(result) + } + + return Half(result.toUShort()) +} + +/** + * Returns the truncated half-precision float value of the specified + * half-precision float value. Special values are handled in the following ways: + * + * - If the specified half-precision float is NaN, the result is NaN + * - If the specified half-precision float is infinity (negative or positive), + * the result is infinity (with the same sign) + * - If the specified half-precision float is zero (negative or positive), + * the result is zero (with the same sign) + * + * @param x A half-precision float value + * @return The truncated half-precision float value of the specified + * half-precision float value + */ +fun truncate(x: Half): Half { + val bits = x.toBits() + var a = bits and FP16_ABS + var result = bits + + if (a < 0x3c00) { // < 1.0 + result = result and FP16_SIGN_MASK + } else if (a < 0x6400) { // No fractional values above 1024 + a = 25 - (a shr 10) + val mask = (1 shl a) - 1 + result = result and mask.inv() + } else { + if (a > FP16_EXPONENT_MAX) result = quiet(result) + } + + return Half(result.toUShort()) +} + +// No user-serviceable parts starting from here + +private const val FP16_SIGN_SHIFT = 15 +private const val FP16_SIGN_MASK = 0x8000 +private const val FP16_EXPONENT_SHIFT = 10 +private const val FP16_EXPONENT_MASK = 0x1f +private const val FP16_SIGNIFICAND_MASK = 0x3ff +private const val FP16_EXPONENT_BIAS = 15 +private const val FP16_ABS = 0x7fff +private const val FP16_EXPONENT_MAX = 0x7c00 +private const val FP16_NAN = 0x7e00 +private const val FP16_QUIET_NAN = 0x7fff +private const val FP32_SIGN_SHIFT = 31 +private const val FP32_EXPONENT_SHIFT = 23 +private const val FP32_EXPONENT_MASK = 0xff +private const val FP32_SIGNIFICAND_MASK = 0x7fffff +private const val FP32_EXPONENT_BIAS = 127 +private const val FP32_QNAN_MASK = 0x400000 +private const val FP32_DENORMAL_MAGIC = 126 shl 23 +private val FP32_DENORMAL_FLOAT = Float.fromBits(FP32_DENORMAL_MAGIC) + +private fun floatToHalf(f: Float): UShort { + val bits: Int = f.toBits() + val s = bits ushr FP32_SIGN_SHIFT + var e = (bits ushr FP32_EXPONENT_SHIFT) and FP32_EXPONENT_MASK + var m = bits and FP32_SIGNIFICAND_MASK + var outE = 0 + var outM = 0 + if (e == 0xff) { // Infinite or NaN + outE = 0x1f + outM = if (m != 0) 0x200 else 0 + } else { + e = e - FP32_EXPONENT_BIAS + FP16_EXPONENT_BIAS + if (e >= 0x1f) { // Overflow + outE = 0x31 + } else if (e <= 0) { // Underflow + if (e < -10) { + // The absolute fp32 value is less than MIN_VALUE, flush to +/-0 + } else { + // The fp32 value is a normalized float less than MIN_NORMAL, + // we convert to a denorm fp16 + m = m or 0x800000 shr 1 - e + if (m and 0x1000 != 0) m += 0x2000 + outM = m shr 13 + } + } else { + outE = e + outM = m shr 13 + if (m and 0x1000 != 0) { + // Round to nearest "0.5" up + var out = outE shl FP16_EXPONENT_SHIFT or outM + out++ + return (out or (s shl FP16_SIGN_SHIFT)).toUShort() + } + } + } + return (s shl FP16_SIGN_SHIFT or (outE shl FP16_EXPONENT_SHIFT) or outM).toUShort() +} + +private fun halfToShort(h: UShort): Float { + val bits = h.toInt() + val s = bits and FP16_SIGN_MASK + val e = bits ushr FP16_EXPONENT_SHIFT and FP16_EXPONENT_MASK + val m = bits and FP16_SIGNIFICAND_MASK + var outE = 0 + var outM = 0 + if (e == 0) { // Denormal or 0 + if (m != 0) { + // Convert denorm fp16 into normalized fp32 + var o: Float = Float.fromBits(FP32_DENORMAL_MAGIC + m) + o -= FP32_DENORMAL_FLOAT + return if (s == 0) o else -o + } + } else { + outM = m shl 13 + if (e == 0x1f) { // Infinite or NaN + outE = 0xff + if (outM != 0) { // SNaNs are quieted + outM = outM or FP32_QNAN_MASK + } + } else { + outE = e - FP16_EXPONENT_BIAS + FP32_EXPONENT_BIAS + } + } + val out = s shl 16 or (outE shl FP32_EXPONENT_SHIFT) or outM + return Float.fromBits(out) +} + +private inline fun quiet(x: Int) = x or 0x200 + +private inline fun quiet(x: Int, y: Int) = + (if (x and FP16_ABS > FP16_EXPONENT_MAX) x else y) or 0x200 + +private fun fixedToHalf(sign: Int, e: Int, m: UInt, s: UInt, fraction: Int): Half { + // Compute guard and sticky bits + val v: UInt + val S: UInt + val G: UInt + + if (e < 0) { + v = sign.toUInt() + (m shr (fraction - 10 - e)) + G = (m shr (fraction - 11 - e)) and 1U + S = s or (if ((m and ((1U shl (fraction - 11 - e)) - 1.toUInt())) != 0U) 1 else 0).toUInt() + } else { + v = sign.toUInt() + (e.toUInt() shl 10) + (m shr (fraction - 10)) + G = (m shr (fraction - 11)) and 1U + S = s or (if ((m and ((1U shl (fraction - 11)) - 1.toUInt())) != 0U) 1 else 0).toUInt() + } + + return Half((v + (G and (S or v))).toUShort()) +} \ No newline at end of file diff --git a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Manipulator.java b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Manipulator.java index 2c0ab85a146..548a6e6f8cf 100644 --- a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Manipulator.java +++ b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Manipulator.java @@ -274,6 +274,17 @@ public Builder groundPlane(float a, float b, float c, float d) { return this; } + /** + * Sets whether panning is enabled in the manipulator. + * + * @return this Builder object for chaining calls + */ + @NonNull + public Builder panning(Boolean enabled) { + nBuilderPanning(mNativeBuilder, enabled); + return this; + } + /** * Creates and returns the Manipulator object. * @@ -483,6 +494,7 @@ public void jumpToBookmark(Bookmark bookmark) { private static native void nBuilderFlightPanSpeed(long nativeBuilder, float x, float y); private static native void nBuilderFlightMoveDamping(long nativeBuilder, float damping); private static native void nBuilderGroundPlane(long nativeBuilder, float a, float b, float c, float d); + private static native void nBuilderPanning(long nativeBuilder, Boolean enabled); private static native long nBuilderBuild(long nativeBuilder, int mode); private static native void nDestroyManipulator(long nativeManip); diff --git a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Matrix.kt b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Matrix.kt index 1f6a79c9bd1..ade4428135f 100644 --- a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Matrix.kt +++ b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Matrix.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -@file:Suppress("unused") +@file:Suppress("NOTHING_TO_INLINE", "unused") package com.google.android.filament.utils @@ -24,8 +24,16 @@ enum class MatrixColumn { X, Y, Z, W } -enum class RotationsOrder { - XYZ, XZY, YXZ, YZX, ZXY, ZYX +enum class RotationsOrder( + val yaw: VectorComponent, + val pitch: VectorComponent, + val roll: VectorComponent) { + XYZ(VectorComponent.X, VectorComponent.Y, VectorComponent.Z), + XZY(VectorComponent.X, VectorComponent.Z, VectorComponent.Y), + YXZ(VectorComponent.Y, VectorComponent.X, VectorComponent.Z), + YZX(VectorComponent.Y, VectorComponent.Z, VectorComponent.X), + ZXY(VectorComponent.Z, VectorComponent.X, VectorComponent.Y), + ZYX(VectorComponent.Z, VectorComponent.Y, VectorComponent.X); } data class Mat2( @@ -77,6 +85,12 @@ data class Mat2( operator fun minus(v: Float) = Mat2(x - v, y - v) operator fun times(v: Float) = Mat2(x * v, y * v) operator fun div(v: Float) = Mat2(x / v, y / v) + inline fun compareTo(v: Float, delta: Float = 0.0f) = Mat2( + x.compareTo(v, delta), + y.compareTo(v, delta) + ) + + inline fun equals(v: Float, delta: Float = 0.0f) = x.equals(v, delta) && y.equals(v, delta) operator fun times(m: Mat2) = Mat2( Float2( @@ -89,12 +103,18 @@ data class Mat2( ) ) + inline fun compareTo(m: Mat2, delta: Float = 0.0f) = Mat2( + x.compareTo(m.x, delta), + y.compareTo(m.y, delta) + ) + + inline fun equals(m: Mat2, delta: Float = 0.0f) = x.equals(m.x, delta) && y.equals(m.y, delta) + operator fun times(v: Float2) = Float2( x.x * v.x + y.x * v.y, x.y * v.x + y.y * v.y, ) - fun toFloatArray() = floatArrayOf( x.x, y.x, x.y, y.y @@ -106,7 +126,6 @@ data class Mat2( |${x.y} ${y.y}| """.trimIndent() } - } data class Mat3( @@ -162,6 +181,14 @@ data class Mat3( operator fun minus(v: Float) = Mat3(x - v, y - v, z - v) operator fun times(v: Float) = Mat3(x * v, y * v, z * v) operator fun div(v: Float) = Mat3(x / v, y / v, z / v) + inline fun compareTo(v: Float, delta: Float = 0.0f) = Mat3( + x.compareTo(v, delta), + y.compareTo(v, delta), + z.compareTo(v, delta) + ) + + inline fun equals(v: Float, delta: Float = 0.0f) = + x.equals(v, delta) && y.equals(v, delta) && z.equals(v, delta) operator fun times(m: Mat3) = Mat3( Float3( @@ -181,6 +208,15 @@ data class Mat3( ) ) + inline fun compareTo(m: Mat3, delta: Float = 0.0f) = Mat3( + x.compareTo(m.x, delta), + y.compareTo(m.y, delta), + z.compareTo(m.z, delta) + ) + + inline fun equals(m: Mat3, delta: Float = 0.0f) = + x.equals(m.x, delta) && y.equals(m.y, delta) && z.equals(m.z, delta) + operator fun times(v: Float3) = Float3( x.x * v.x + y.x * v.y + z.x * v.z, x.y * v.x + y.y * v.y + z.y * v.z, @@ -212,6 +248,7 @@ data class Mat4( constructor(m: Mat4) : this(m.x.copy(), m.y.copy(), m.z.copy(), m.w.copy()) companion object { + fun of(vararg a: Float): Mat4 { require(a.size >= 16) return Mat4( @@ -302,6 +339,15 @@ data class Mat4( operator fun minus(v: Float) = Mat4(x - v, y - v, z - v, w - v) operator fun times(v: Float) = Mat4(x * v, y * v, z * v, w * v) operator fun div(v: Float) = Mat4(x / v, y / v, z / v, w / v) + inline fun compareTo(v: Float, delta: Float = 0.0f) = Mat4( + x.compareTo(v, delta), + y.compareTo(v, delta), + z.compareTo(v, delta), + w.compareTo(v, delta) + ) + + inline fun equals(v: Float, delta: Float = 0.0f) = + x.equals(v, delta) && y.equals(v, delta) && z.equals(v, delta) && w.equals(v, delta) operator fun times(m: Mat4) = Mat4( Float4( @@ -330,6 +376,16 @@ data class Mat4( ) ) + inline fun compareTo(m: Mat4, delta: Float = 0.0f) = Mat4( + x.compareTo(m.x, delta), + y.compareTo(m.y, delta), + z.compareTo(m.z, delta), + w.compareTo(m.w, delta) + ) + + inline fun equals(m: Mat4, delta: Float = 0.0f) = + x.equals(m.x, delta) && y.equals(m.y, delta) && z.equals(m.z, delta) && w.equals(m.w, delta) + operator fun times(v: Float4) = Float4( x.x * v.x + y.x * v.y + z.x * v.z+ w.x * v.w, x.y * v.x + y.y * v.y + z.y * v.z+ w.y * v.w, @@ -337,6 +393,26 @@ data class Mat4( x.w * v.x + y.w * v.y + z.w * v.z+ w.w * v.w ) + /** + * Get the Euler angles in degrees from this rotation Matrix + * + * Don't forget to extract the rotation with [rotation] if this is a transposed matrix + * + * @param order The order in which to apply rotations. + * Default is [RotationsOrder.ZYX] which means that the object will first be rotated around its Z + * axis, then its Y axis and finally its X axis. + * + * @see eulerAngles + */ + fun toEulerAngles(order: RotationsOrder = RotationsOrder.ZYX) = eulerAngles(this, order) + + /** + * Get the [Quaternion] from this rotation Matrix + * + * Don't forget to extract the rotation with [rotation] if this is a transposed matrix + * + * @see quaternion + */ fun toQuaternion() = quaternion(this) fun toFloatArray() = floatArrayOf( @@ -356,6 +432,78 @@ data class Mat4( } } +inline fun equal(a: Mat2, b: Float, delta: Float = 0.0f) = Bool2( + a.x.equals(b, delta), + a.y.equals(b, delta) +) + +inline fun equal(a: Mat2, b: Mat2, delta: Float = 0.0f) = Bool2( + a.x.equals(b.x, delta), + a.y.equals(b.y, delta) +) + +inline fun notEqual(a: Mat2, b: Float, delta: Float = 0.0f) = Bool2( + !a.x.equals(b, delta), + !a.y.equals(b, delta) +) + +inline fun notEqual(a: Mat2, b: Mat2, delta: Float = 0.0f) = Bool2( + !a.x.equals(b.x, delta), + !a.y.equals(b.y, delta) +) + +inline fun equal(a: Mat3, b: Float, delta: Float = 0.0f) = Bool3( + a.x.equals(b, delta), + a.y.equals(b, delta), + a.z.equals(b, delta) +) + +inline fun equal(a: Mat3, b: Mat3, delta: Float = 0.0f) = Bool3( + a.x.equals(b.x, delta), + a.y.equals(b.y, delta), + a.z.equals(b.z, delta) +) + +inline fun notEqual(a: Mat3, b: Float, delta: Float = 0.0f) = Bool3( + !a.x.equals(b, delta), + !a.y.equals(b, delta), + !a.z.equals(b, delta) +) + +inline fun notEqual(a: Mat3, b: Mat3, delta: Float = 0.0f) = Bool3( + !a.x.equals(b.x, delta), + !a.y.equals(b.y, delta), + !a.z.equals(b.z, delta) +) + +inline fun equal(a: Mat4, b: Float, delta: Float = 0.0f) = Bool4( + a.x.equals(b, delta), + a.y.equals(b, delta), + a.z.equals(b, delta), + a.w.equals(b, delta) +) + +inline fun equal(a: Mat4, b: Mat4, delta: Float = 0.0f) = Bool4( + a.x.equals(b.x, delta), + a.y.equals(b.y, delta), + a.z.equals(b.z, delta), + a.w.equals(b.w, delta) +) + +inline fun notEqual(a: Mat4, b: Float, delta: Float = 0.0f) = Bool4( + !a.x.equals(b, delta), + !a.y.equals(b, delta), + !a.z.equals(b, delta), + !a.w.equals(b, delta) +) + +inline fun notEqual(a: Mat4, b: Mat4, delta: Float = 0.0f) = Bool4( + !a.x.equals(b.x, delta), + !a.y.equals(b.y, delta), + !a.z.equals(b.z, delta), + !a.w.equals(b.w, delta) +) + fun transpose(m: Mat2) = Mat2( Float2(m.x.x, m.y.x), Float2(m.x.y, m.y.y) @@ -494,14 +642,7 @@ fun rotation(m: Mat4) = Mat4(normalize(m.right), normalize(m.up), normalize(m.fo */ fun rotation(d: Float3, order: RotationsOrder = RotationsOrder.ZYX): Mat4 { val r = transform(d, ::radians) - return when(order) { - RotationsOrder.XZY -> rotation(r.x, r.z, r.y) - RotationsOrder.XYZ -> rotation(r.x, r.y, r.z) - RotationsOrder.YXZ -> rotation(r.y, r.x, r.z) - RotationsOrder.YZX -> rotation(r.y, r.z, r.x) - RotationsOrder.ZYX -> rotation(r.z, r.y, r.x) - RotationsOrder.ZXY -> rotation(r.z, r.x, r.y) - } + return rotation(r[order.yaw], r[order.pitch], r[order.roll], order) } /** @@ -599,13 +740,93 @@ fun rotation(quaternion: Quaternion): Mat4 { Float4( 2.0f * (n.x * n.z + n.y * n.w), 2.0f * (n.y * n.z - n.x * n.w), - 1.0f - 2.0f * (n.x * n.x + n.y * n.y), + 1.0f - 2.0f * (n.x * n.x + n.y * n.y) ) ) } /** - * Extract Quaternion rotation from a Matrix + * Get the Euler angles in degrees from a rotation Matrix + * + * @param m The rotation matrix. + * Don't forget to extract the rotation with [rotation] if it's transposed + * @param order The order in which to apply rotations. + * Default is [RotationsOrder.ZYX] which means that the object will first be rotated around its Z + * axis, then its Y axis and finally its X axis. + */ +fun eulerAngles(m: Mat4, order: RotationsOrder = RotationsOrder.ZYX): Float3 { + // We need to more simplify this with RotationsOrder VectorComponents mapped to MatrixColumn + return transform(Float3().apply { + when (order) { + RotationsOrder.XYZ -> { + this[order.pitch] = asin(clamp(m.z.x, -1.0f, 1.0f)) + if (abs(m.z.x) < 0.9999999f) { + this[order.yaw] = atan2(-m.z.y, m.z.z) + this[order.roll] = atan2(-m.y.x, m.x.x) + } else { + this[order.yaw] = atan2(m.y.z, m.y.y) + this[order.roll] = 0.0f + } + } + RotationsOrder.XZY -> { + this[order.pitch] = asin(-clamp(m.y.x, -1.0f, 1.0f)) + if (abs(m.y.x) < 0.9999999f) { + this[order.yaw] = atan2(m.y.z, m.y.y) + this[order.roll] = atan2(m.z.x, m.x.x) + } else { + this[order.yaw] = atan2(-m.z.y, m.z.z) + this[order.roll] = 0.0f + } + } + RotationsOrder.YXZ -> { + this[order.pitch] = asin(-clamp(m.z.y, -1.0f, 1.0f)) + if (abs(m.z.y) < 0.9999999f) { + this[order.yaw] = atan2(m.z.x, m.z.z) + this[order.roll] = atan2(m.x.y, m.y.y) + } else { + this[order.yaw] = atan2(-m.x.z, m.x.x) + this[order.roll] = 0.0f + } + } + RotationsOrder.YZX -> { + this[order.pitch] = asin(clamp(m.x.y, -1.0f, 1.0f)) + if (abs(m.x.y) < 0.9999999f) { + this[order.roll] = atan2(-m.z.y, m.y.y) + this[order.yaw] = atan2(-m.x.z, m.x.x) + } else { + this[order.roll] = 0.0f + this[order.yaw] = atan2(m.z.x, m.z.z) + } + } + RotationsOrder.ZXY -> { + this[order.pitch] = asin(clamp(m.y.z, -1.0f, 1.0f)) + if (abs(m.y.z) < 0.9999999f) { + this[order.roll] = atan2(-m.x.z, m.z.z) + this[order.yaw] = atan2(-m.y.x, m.y.y) + } else { + this[order.roll] = 0.0f + this[order.yaw] = atan2(m.x.y, m.x.x) + } + } + RotationsOrder.ZYX -> { + this[order.pitch] = asin(-clamp(m.x.z, -1.0f, 1.0f)) + if (abs(m.x.z) < 0.9999999f) { + this[order.roll] = atan2(m.y.z, m.z.z) + this[order.yaw] = atan2(m.x.y, m.x.x) + } else { + this[order.roll] = 0.0f + this[order.yaw] = atan2(-m.y.x, m.y.y) + } + } + } + }, ::degrees) +} + +/** + * Get the [Quaternion] from a rotation Matrix + * + * @param m The rotation matrix. + * Don't forget to extract the rotation with [rotation] if it's transposed */ fun quaternion(m: Mat4): Quaternion { val trace = m.x.x + m.y.y + m.z.z @@ -673,9 +894,14 @@ fun perspective(fov: Float, ratio: Float, near: Float, far: Float): Mat4 { } fun ortho(l: Float, r: Float, b: Float, t: Float, n: Float, f: Float) = Mat4( - Float4(x = 2.0f / (r - 1.0f)), - Float4(y = 2.0f / (t - b)), - Float4(z = -2.0f / (f - n)), - Float4(-(r + l) / (r - l), -(t + b) / (t - b), -(f + n) / (f - n), 1.0f) + Float4(x = 2.0f / (r - l)), + Float4(y = 2.0f / (t - b)), + Float4(z = -2.0f / (f - n)), + Float4( + -(r + l) / (r - l), + -(t + b) / (t - b), + -(f + n) / (f - n), + 1.0f + ) ) diff --git a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/ModelViewer.kt b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/ModelViewer.kt index 8e5939fe39b..2f11466b494 100644 --- a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/ModelViewer.kt +++ b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/ModelViewer.kt @@ -27,8 +27,8 @@ import com.google.android.filament.gltfio.* import kotlinx.coroutines.* import java.nio.Buffer -private const val kNearPlane = 0.05 // 5 cm -private const val kFarPlane = 1000.0 // 1 km +private const val kNearPlane = 0.05f // 5 cm +private const val kFarPlane = 1000.0f // 1 km private const val kAperture = 16f private const val kShutterSpeed = 1f / 125f private const val kSensitivity = 100f @@ -80,6 +80,18 @@ class ModelViewer( updateCameraProjection() } + var cameraNear = kNearPlane + set(value) { + field = value + updateCameraProjection() + } + + var cameraFar = kFarPlane + set(value) { + field = value + updateCameraProjection() + } + val scene: Scene val view: View val camera: Camera @@ -179,7 +191,7 @@ class ModelViewer( asset = assetLoader.createAsset(buffer) asset?.let { asset -> resourceLoader.asyncBeginLoad(asset) - animator = asset.getInstance().animator + animator = asset.instance.animator asset.releaseSourceData() } } @@ -202,7 +214,7 @@ class ModelViewer( resourceLoader.addResourceData(uri, resourceBuffer) } resourceLoader.asyncBeginLoad(asset) - animator = asset.getInstance().animator + animator = asset.instance.animator asset.releaseSourceData() } } @@ -299,7 +311,7 @@ class ModelViewer( var count = 0 val popRenderables = { count = asset.popRenderables(readyRenderables); count != 0 } while (popRenderables()) { - for (i in 0..count - 1) { + for (i in 0 until count) { val ri = rcm.getInstance(readyRenderables[i]) rcm.setScreenSpaceContactShadows(ri, true) } @@ -359,7 +371,7 @@ class ModelViewer( resourceLoader.addResourceData(uri, buffer) } resourceLoader.asyncBeginLoad(asset) - animator = asset.getInstance().animator + animator = asset.instance.animator asset.releaseSourceData() } } @@ -368,7 +380,8 @@ class ModelViewer( val width = view.viewport.width val height = view.viewport.height val aspect = width.toDouble() / height.toDouble() - camera.setLensProjection(cameraFocalLength.toDouble(), aspect, kNearPlane, kFarPlane) + camera.setLensProjection(cameraFocalLength.toDouble(), aspect, + cameraNear.toDouble(), cameraFar.toDouble()) } inner class SurfaceCallback : UiHelper.RendererCallback { @@ -392,9 +405,19 @@ class ModelViewer( view.viewport = Viewport(0, 0, width, height) cameraManipulator.setViewport(width, height) updateCameraProjection() + synchronizePendingFrames(engine) } } + private fun synchronizePendingFrames(engine: Engine) { + // Wait for all pending frames to be processed before returning. This is to + // avoid a race between the surface being resized before pending frames are + // rendered into it. + val fence = engine.createFence() + fence.wait(Fence.Mode.FLUSH, Fence.WAIT_FOR_EVER) + engine.destroyFence(fence) + } + companion object { private val kDefaultObjectPosition = Float3(0.0f, 0.0f, -4.0f) } diff --git a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Quaternion.kt b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Quaternion.kt index da57c8b7f31..bb694db214f 100644 --- a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Quaternion.kt +++ b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Quaternion.kt @@ -33,9 +33,9 @@ data class Quaternion( var x: Float = 0.0f, var y: Float = 0.0f, var z: Float = 0.0f, - var w: Float = 0.0f) { + var w: Float = 1.0f) { - constructor(v: Float3, w: Float = 0.0f) : this(v.x, v.y, v.z, w) + constructor(v: Float3, w: Float = 1.0f) : this(v.x, v.y, v.z, w) constructor(v: Float4) : this(v.x, v.y, v.z, v.w) constructor(q: Quaternion) : this(q.x, q.y, q.z, q.w) @@ -52,42 +52,84 @@ data class Quaternion( } /** - * Construct a Quaternion from Euler angles using YPR around ZYX respectively + * Construct a Quaternion from Euler angles using YPR around a specified order * - * The Euler angles are applied in ZYX order. - * i.e: a vector is first rotated about X (roll) then Y (pitch) and then Z (yaw). + * Uses intrinsic Tait-Bryan angles. This means that rotations are performed with respect to + * the local coordinate system. + * That is, for order 'XYZ', the rotation is first around the X axis (which is the same as + * the world-X axis), then around local-Y (which may now be different from the world + * Y-axis), then local-Z (which may be different from the world Z-axis) * * @param d Per axis Euler angles in degrees + * Yaw, pitch, roll (YPR) are taken accordingly to the rotations order input. + * @param order The order in which to apply rotations. + * Default is [RotationsOrder.ZYX] which means that the object will first be rotated around + * its Z axis, then its Y axis and finally its X axis. */ - fun fromEuler(d: Float3): Quaternion { + fun fromEuler(d: Float3, order: RotationsOrder = RotationsOrder.ZYX): Quaternion { val r = transform(d, ::radians) - return fromEulerZYX(r.z, r.y, r.x) + return fromEuler(r[order.yaw], r[order.pitch], r[order.roll], order) } /** - * Construct a Quaternion from Euler angles using YPR around ZYX respectively + * Construct a Quaternion from Euler yaw, pitch, roll around a specified order. * - * The Euler angles are applied in ZYX order. - * i.e: a vector is first rotated about X (roll) then Y (pitch) and then Z (yaw). - * - * @param roll about X axis in radians - * @param pitch about Y axis in radians - * @param yaw about Z axis in radians + * @param roll about 1st rotation axis in radians. Z in case of ZYX order + * @param pitch about 2nd rotation axis in radians. Y in case of ZYX order + * @param yaw about 3rd rotation axis in radians. X in case of ZYX order + * @param order The order in which to apply rotations. + * Default is [RotationsOrder.ZYX] which means that the object will first be rotated around its Z + * axis, then its Y axis and finally its X axis. */ - fun fromEulerZYX(yaw: Float = 0.0f, pitch: Float = 0.0f, roll: Float = 0.0f): Quaternion { - val cy = cos(yaw * 0.5f) - val sy = sin(yaw * 0.5f) - val cp = cos(pitch * 0.5f) - val sp = sin(pitch * 0.5f) - val cr = cos(roll * 0.5f) - val sr = sin(roll * 0.5f) - - return Quaternion( - sr * cp * cy - cr * sp * sy, - cr * sp * cy + sr * cp * sy, - cr * cp * sy - sr * sp * cy, - cr * cp * cy + sr * sp * sy - ) + fun fromEuler( + yaw: Float = 0.0f, + pitch: Float = 0.0f, + roll: Float = 0.0f, + order: RotationsOrder = RotationsOrder.ZYX + ): Quaternion { + val c1 = cos(yaw * 0.5f) + val s1 = sin(yaw * 0.5f) + val c2 = cos(pitch * 0.5f) + val s2 = sin(pitch * 0.5f) + val c3 = cos(roll * 0.5f) + val s3 = sin(roll * 0.5f) + return when (order) { + RotationsOrder.XZY -> Quaternion( + s1 * c2 * c3 - c1 * s2 * s3, + c1 * c2 * s3 - s1 * s2 * c3, + s1 * c2 * s3 + c1 * s2 * c3, + s1 * s2 * s3 + c1 * c2 * c3) + RotationsOrder.XYZ -> Quaternion( + s1 * c2 * c3 + s2 * s3 * c1, + s2 * c1 * c3 - s1 * s3 * c2, + s1 * s2 * c3 + s3 * c1 * c2, + c1 * c2 * c3 - s1 * s2 * s3 + ) + RotationsOrder.YXZ -> Quaternion( + s1 * c2 * s3 + c1 * s2 * c3, + s1 * c2 * c3 - c1 * s2 * s3, + c1 * c2 * s3 - s1 * s2 * c3, + s1 * s2 * s3 + c1 * c2 * c3 + ) + RotationsOrder.YZX -> Quaternion( + s1 * s2 * c3 + c1 * c2 * s3, + s1 * c2 * c3 + c1 * s2 * s3, + c1 * s2 * c3 - s1 * c2 * s3, + c1 * c2 * c3 - s1 * s2 * s3 + ) + RotationsOrder.ZYX -> Quaternion( + c1 * c2 * s3 - s1 * s2 * c3, + s1 * c2 * s3 + c1 * s2 * c3, + s1 * c2 * c3 - c1 * s2 * s3, + s1 * s2 * s3 + c1 * c2 * c3 + ) + RotationsOrder.ZXY -> Quaternion( + c1 * s2 * c3 - s1 * c2 * s3, + s1 * s2 * c3 + c1 * c2 * s3, + s1 * c2 * c3 + c1 * s2 * s3, + c1 * c2 * c3 - s1 * s2 * s3 + ) + } } } @@ -222,16 +264,44 @@ data class Quaternion( inline operator fun minus(v: Float) = Quaternion(x - v, y - v, z - v, w - v) inline operator fun times(v: Float) = Quaternion(x * v, y * v, z * v, w * v) inline operator fun div(v: Float) = Quaternion(x / v, y / v, z / v, w / v) + inline fun compareTo(v: Float, delta: Float = 0.0f) = Float4( + x.compareTo(v, delta), + y.compareTo(v, delta), + z.compareTo(v, delta), + w.compareTo(v, delta) + ) + + inline fun equals(v: Float, delta: Float = 0.0f) = Bool4( + x.equals(v, delta), + y.equals(v, delta), + z.equals(v, delta), + w.equals(v, delta) + ) inline operator fun times(v: Float3) = (this * Quaternion(v, 0.0f) * inverse(this)).xyz inline operator fun plus(q: Quaternion) = Quaternion(x + q.x, y + q.y, z + q.z, w + q.w) inline operator fun minus(q: Quaternion) = Quaternion(x - q.x, y - q.y, z - q.z, w - q.w) inline operator fun times(q: Quaternion) = Quaternion( - w * q.x + x * q.w + y * q.z - z * q.y, - w * q.y - x * q.z + y * q.w + z * q.x, - w * q.z + x * q.y - y * q.x + z * q.w, - w * q.w - x * q.x - y * q.y - z * q.z) + w * q.x + x * q.w + y * q.z - z * q.y, + w * q.y - x * q.z + y * q.w + z * q.x, + w * q.z + x * q.y - y * q.x + z * q.w, + w * q.w - x * q.x - y * q.y - z * q.z + ) + + inline fun compareTo(v: Float4, delta: Float = 0.0f) = Float4( + x.compareTo(v.x, delta), + y.compareTo(v.y, delta), + z.compareTo(v.z, delta), + w.compareTo(v.w, delta) + ) + + inline fun equals(v: Float4, delta: Float = 0.0f) = Bool4( + x.equals(v.x, delta), + y.equals(v.y, delta), + z.equals(v.z, delta), + w.equals(v.w, delta) + ) inline fun transform(block: (Float) -> Float): Quaternion { x = block(x) @@ -253,6 +323,103 @@ inline operator fun Float.minus(q: Quaternion) = Quaternion(this - q.x, this - q inline operator fun Float.times(q: Quaternion) = Quaternion(this * q.x, this * q.y, this * q.z, this * q.w) inline operator fun Float.div(q: Quaternion) = Quaternion(this / q.x, this / q.y, this / q.z, this / q.w) +inline fun lessThan(a: Quaternion, b: Float) = Bool4( + a.x < b, + a.y < b, + a.z < b, + a.w < b +) + +inline fun lessThan(a: Quaternion, b: Quaternion) = Bool4( + a.x < b.x, + a.y < b.y, + a.z < b.z, + a.w < b.w +) + +inline fun lessThanEqual(a: Quaternion, b: Float) = Bool4( + a.x <= b, + a.y <= b, + a.z <= b, + a.w <= b +) + +inline fun lessThanEqual(a: Quaternion, b: Quaternion) = Bool4( + a.x <= b.x, + a.y <= b.y, + a.z <= b.z, + a.w <= b.w +) + +inline fun greaterThan(a: Quaternion, b: Float) = Bool4( + a.x > b, + a.y > b, + a.z > b, + a.w > b +) + +inline fun greaterThan(a: Quaternion, b: Quaternion) = Bool4( + a.x > b.y, + a.y > b.y, + a.z > b.z, + a.w > b.w +) + +inline fun greaterThanEqual(a: Quaternion, b: Float) = Bool4( + a.x >= b, + a.y >= b, + a.z >= b, + a.w >= b +) + +inline fun greaterThanEqual(a: Quaternion, b: Quaternion) = Bool4( + a.x >= b.x, + a.y >= b.y, + a.z >= b.z, + a.w >= b.w +) + +inline fun equal(a: Quaternion, b: Float, delta: Float = 0.0f) = Bool4( + a.x.equals(b, delta), + a.y.equals(b, delta), + a.z.equals(b, delta), + a.w.equals(b, delta) +) + +inline fun equal(a: Quaternion, b: Quaternion, delta: Float = 0.0f) = Bool4( + a.x.equals(b.x, delta), + a.y.equals(b.y, delta), + a.z.equals(b.z, delta), + a.w.equals(b.w, delta) +) + +inline fun notEqual(a: Quaternion, b: Float, delta: Float = 0.0f) = Bool4( + !a.x.equals(b, delta), + !a.y.equals(b, delta), + !a.z.equals(b, delta), + !a.w.equals(b, delta) +) + +inline fun notEqual(a: Quaternion, b: Quaternion, delta: Float = 0.0f) = Bool4( + !a.x.equals(b.x, delta), + !a.y.equals(b.y, delta), + !a.z.equals(b.z, delta), + !a.w.equals(b.w, delta) +) + +inline infix fun Quaternion.lt(b: Float) = Bool4(x < b, y < b, z < b, w < b) +inline infix fun Quaternion.lt(b: Float4) = Bool4(x < b.x, y < b.y, z < b.z, w < b.w) +inline infix fun Quaternion.lte(b: Float) = Bool4(x <= b, y <= b, z <= b, w <= b) +inline infix fun Quaternion.lte(b: Float4) = Bool4(x <= b.x, y <= b.y, z <= b.z, w <= b.w) +inline infix fun Quaternion.gt(b: Float) = Bool4(x > b, y > b, z > b, w > b) +inline infix fun Quaternion.gt(b: Float4) = Bool4(x > b.x, y > b.y, z > b.z, w > b.w) +inline infix fun Quaternion.gte(b: Float) = Bool4(x >= b, y >= b, z >= b, w >= b) +inline infix fun Quaternion.gte(b: Float4) = Bool4(x >= b.x, y >= b.y, z >= b.z, w >= b.w) +inline infix fun Quaternion.eq(b: Float) = Bool4(x == b, y == b, z == b, w == b) +inline infix fun Quaternion.eq(b: Float4) = Bool4(x == b.x, y == b.y, z == b.z, w == b.w) +inline infix fun Quaternion.neq(b: Float) = Bool4(x != b, y != b, z != b, w != b) +inline infix fun Quaternion.neq(b: Float4) = Bool4(x != b.x, y != b.y, z != b.z, w != b.w) + inline fun abs(q: Quaternion) = Quaternion(abs(q.x), abs(q.y), abs(q.z), abs(q.w)) inline fun length(q: Quaternion) = sqrt(q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w) inline fun length2(q: Quaternion) = q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w @@ -278,6 +445,10 @@ fun cross(a: Quaternion, b: Quaternion): Quaternion { return Quaternion(m.x, m.y, m.z, 0.0f) } +fun angle(a: Quaternion, b: Quaternion): Float { + return 2.0f * acos(abs(clamp(dot(a, b), -1.0f, 1.0f))) +} + /** * Spherical linear interpolation between two given orientations * @@ -287,36 +458,38 @@ fun cross(a: Quaternion, b: Quaternion): Quaternion { * @param a The beginning value * @param b The ending value * @param t The ratio between the two floats - * @param valueEps Prevent blowing up when slerping between two quaternions that are very near each - * other. Linear interpolation (lerp) is returned in this case. + * @param dotThreshold If the quaternion dot product is greater than this value + * (i.e. the quaternions are very close to each other), then the quaternions are + * linearly interpolated instead of spherically interpolated. * * @return Interpolated value between the two floats */ -fun slerp(a: Quaternion, b: Quaternion, t: Float, valueEps: Float = 0.0000000001f): Quaternion { +fun slerp(a: Quaternion, b: Quaternion, t: Float, dotThreshold: Float = 0.9995f): Quaternion { // could also be computed as: pow(q * inverse(p), t) * p; - val d = dot(a, b) - val absd = abs(d) - // Prevent blowing up when slerping between two quaternions that are very near each other. - if ((1.0f - absd) < valueEps) { - return normalize(lerp(if (d < 0.0f) -a else a, b, t)) + var dot = dot(a, b) + var b1 = b + + // If the dot product is negative, then the interpolation won't follow the shortest angular path + // between the two quaterions. In this case, invert the end quaternion to produce an equivalent + // rotation that will give us the path we want. + if (dot < 0.0f) { + dot = -dot + b1 = -b } - val npq = sqrt(dot(a, a) * dot(b, b)) // ||p|| * ||q|| - val acos = acos(clamp(absd / npq, -1.0f, 1.0f)) - val acos0 = acos * (1.0f - t) - val acos1 = acos * t - val sina = sin(acos) - if (sina < valueEps) { - return normalize(lerp(a, b, t)) + + // Prevent blowing up when slerping between two quaternions that are very near each other. + return if (dot < dotThreshold) { + val angle = acos(dot) + val s = sin(angle) + a * sin((1.0f - t) * angle) / s + b1 * sin(t * angle) / s + } else { + // If the angle is too small, use linear interpolation + nlerp(a, b1, t) } - val isina = 1.0f / sina - val s0 = sin(acos0) * isina - val s1 = sin(acos1) * isina - // ensure we're taking the "short" side - return normalize(s0 * a + (if (d < 0.0f) -s1 else (s1)) * b) } fun lerp(a: Quaternion, b: Quaternion, t: Float): Quaternion { - return ((1 - t) * a) + (t * b) + return ((1.0f - t) * a) + (t * b) } fun nlerp(a: Quaternion, b: Quaternion, t: Float): Quaternion { @@ -324,19 +497,12 @@ fun nlerp(a: Quaternion, b: Quaternion, t: Float): Quaternion { } /** - * Convert a Quaternion to Euler angles using YPR around ZYX respectively + * Convert a Quaternion to Euler angles * - * The Euler angles are applied in ZYX order + * @param order The order in which to apply rotations. + * Default is [RotationsOrder.ZYX] which means that the object will first be rotated around its Z + * axis, then its Y axis and finally its X axis. */ -fun eulerAngles(q: Quaternion): Float3 { - val nq = normalize(q) - return Float3( - // roll (x-axis rotation) - degrees(atan2(2.0f * (nq.y * nq.z + nq.w * nq.x), - nq.w * nq.w - nq.x * nq.x - nq.y * nq.y + nq.z * nq.z)), - // pitch (y-axis rotation) - degrees(asin(-2.0f * (nq.x * nq.z - nq.w * nq.y))), - // yaw (z-axis rotation) - degrees(atan2(2.0f * (nq.x * nq.y + nq.w * nq.z), - nq.w * nq.w + nq.x * nq.x - nq.y * nq.y - nq.z * nq.z))) +fun eulerAngles(q: Quaternion, order: RotationsOrder = RotationsOrder.ZYX): Float3 { + return eulerAngles(rotation(q), order) } diff --git a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Scalar.kt b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Scalar.kt index a6126aa3d1d..5283b153aaf 100644 --- a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Scalar.kt +++ b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Scalar.kt @@ -28,12 +28,21 @@ const val INV_PI = 1.0f / FPI const val INV_TWO_PI = INV_PI * 0.5f const val INV_FOUR_PI = INV_PI * 0.25f -inline fun clamp(x: Float, min: Float, max: Float)= if (x < min) min else (if (x > max) max else x) +val HALF_ONE = Half(0x3c00.toUShort()) +val HALF_TWO = Half(0x4000.toUShort()) + +inline fun clamp(x: Float, min: Float, max: Float) = if (x < min) min else (if (x > max) max else x) + +inline fun clamp(x: Half, min: Half, max: Half) = if (x < min) min else (if (x > max) max else x) inline fun saturate(x: Float) = clamp(x, 0.0f, 1.0f) +inline fun saturate(x: Half) = clamp(x, Half.POSITIVE_ZERO, HALF_ONE) + inline fun mix(a: Float, b: Float, x: Float) = a * (1.0f - x) + b * x +inline fun mix(a: Half, b: Half, x: Half) = a * (HALF_ONE - x) + b * x + inline fun degrees(v: Float) = v * (180.0f * INV_PI) inline fun radians(v: Float) = v * (FPI / 180.0f) @@ -42,4 +51,6 @@ inline fun fract(v: Float) = v % 1 inline fun sqr(v: Float) = v * v +inline fun sqr(v: Half) = v * v + inline fun pow(x: Float, y: Float) = (x.toDouble().pow(y.toDouble())).toFloat() diff --git a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/TextureLoader.kt b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/TextureLoader.kt index 5d9dc297a71..aeea9665533 100644 --- a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/TextureLoader.kt +++ b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/TextureLoader.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.google.android.filament.textured +package com.google.android.filament.utils import android.content.res.Resources import android.graphics.Bitmap diff --git a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Vector.kt b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Vector.kt index 23e59de1fc2..d43a87fc5ac 100644 --- a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Vector.kt +++ b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/Vector.kt @@ -22,6 +22,8 @@ import kotlin.math.abs import kotlin.math.max import kotlin.math.min import kotlin.math.sqrt +import kotlin.math.acos +import kotlin.math.absoluteValue enum class VectorComponent { X, Y, Z, W, @@ -124,11 +126,23 @@ data class Float2(var x: Float = 0.0f, var y: Float = 0.0f) { inline operator fun minus(v: Float) = Float2(x - v, y - v) inline operator fun times(v: Float) = Float2(x * v, y * v) inline operator fun div(v: Float) = Float2(x / v, y / v) + inline fun compareTo(v: Float, delta: Float = 0.0f) = Float2( + x.compareTo(v, delta), + y.compareTo(v, delta) + ) + + inline fun equals(v: Float, delta: Float = 0.0f) = x.equals(v, delta) && y.equals(v, delta) inline operator fun plus(v: Float2) = Float2(x + v.x, y + v.y) inline operator fun minus(v: Float2) = Float2(x - v.x, y - v.y) inline operator fun times(v: Float2) = Float2(x * v.x, y * v.y) inline operator fun div(v: Float2) = Float2(x / v.x, y / v.y) + inline fun compareTo(v: Float2, delta: Float = 0.0f) = Float2( + x.compareTo(v.x, delta), + y.compareTo(v.y, delta) + ) + + inline fun equals(v: Float2, delta: Float = 0.0f) = x.equals(v.x, delta) && y.equals(v.y, delta) inline fun transform(block: (Float) -> Float): Float2 { x = block(x) @@ -291,6 +305,14 @@ data class Float3(var x: Float = 0.0f, var y: Float = 0.0f, var z: Float = 0.0f) inline operator fun minus(v: Float) = Float3(x - v, y - v, z - v) inline operator fun times(v: Float) = Float3(x * v, y * v, z * v) inline operator fun div(v: Float) = Float3(x / v, y / v, z / v) + inline fun compareTo(v: Float, delta: Float = 0.0f) = Float3( + x.compareTo(v, delta), + y.compareTo(v, delta), + z.compareTo(v, delta) + ) + + inline fun equals(v: Float, delta: Float = 0.0f) = + x.equals(v, delta) && y.equals(v, delta) && z.equals(v, delta) inline operator fun plus(v: Float2) = Float3(x + v.x, y + v.y, z) inline operator fun minus(v: Float2) = Float3(x - v.x, y - v.y, z) @@ -301,6 +323,14 @@ data class Float3(var x: Float = 0.0f, var y: Float = 0.0f, var z: Float = 0.0f) inline operator fun minus(v: Float3) = Float3(x - v.x, y - v.y, z - v.z) inline operator fun times(v: Float3) = Float3(x * v.x, y * v.y, z * v.z) inline operator fun div(v: Float3) = Float3(x / v.x, y / v.y, z / v.z) + inline fun compareTo(v: Float3, delta: Float = 0.0f) = Float3( + x.compareTo(v.x, delta), + y.compareTo(v.y, delta), + z.compareTo(v.z, delta) + ) + + inline fun equals(v: Float3, delta: Float = 0.0f) = + x.equals(v.x, delta) && y.equals(v.y, delta) && z.equals(v.z, delta) inline fun transform(block: (Float) -> Float): Float3 { x = block(x) @@ -534,6 +564,15 @@ data class Float4( inline operator fun minus(v: Float) = Float4(x - v, y - v, z - v, w - v) inline operator fun times(v: Float) = Float4(x * v, y * v, z * v, w * v) inline operator fun div(v: Float) = Float4(x / v, y / v, z / v, w / v) + inline fun compareTo(v: Float, delta: Float = 0.0f) = Float4( + x.compareTo(v, delta), + y.compareTo(v, delta), + z.compareTo(v, delta), + w.compareTo(v, delta) + ) + + inline fun equals(v: Float, delta: Float = 0.0f) = + x.equals(v, delta) && y.equals(v, delta) && z.equals(v, delta) && w.equals(v, delta) inline operator fun plus(v: Float2) = Float4(x + v.x, y + v.y, z, w) inline operator fun minus(v: Float2) = Float4(x - v.x, y - v.y, z, w) @@ -549,6 +588,15 @@ data class Float4( inline operator fun minus(v: Float4) = Float4(x - v.x, y - v.y, z - v.z, w - v.w) inline operator fun times(v: Float4) = Float4(x * v.x, y * v.y, z * v.z, w * v.w) inline operator fun div(v: Float4) = Float4(x / v.x, y / v.y, z / v.z, w / v.w) + inline fun compareTo(v: Float4, delta: Float = 0.0f) = Float4( + x.compareTo(v.x, delta), + y.compareTo(v.y, delta), + z.compareTo(v.z, delta), + w.compareTo(v.w, delta) + ) + + inline fun equals(v: Float4, delta: Float = 0.0f) = + x.equals(v.x, delta) && y.equals(v.y, delta) && z.equals(v.z, delta) && w.equals(v.w, delta) inline fun transform(block: (Float) -> Float): Float4 { x = block(x) @@ -566,6 +614,12 @@ inline operator fun Float.minus(v: Float2) = Float2(this - v.x, this - v.y) inline operator fun Float.times(v: Float2) = Float2(this * v.x, this * v.y) inline operator fun Float.div(v: Float2) = Float2(this / v.x, this / v.y) +inline fun Float.compareTo(v: Float, delta: Float): Float = when { + equals(v, delta) -> 0.0f + else -> compareTo(v).toFloat() +} + +inline fun Float.equals(v: Float, delta: Float) = (this - v).absoluteValue < delta inline fun abs(v: Float2) = Float2(abs(v.x), abs(v.y)) inline fun length(v: Float2) = sqrt(v.x * v.x + v.y * v.y) inline fun length2(v: Float2) = v.x * v.x + v.y * v.y @@ -583,6 +637,11 @@ fun refract(i: Float2, n: Float2, eta: Float): Float2 { return if (k < 0.0f) Float2(0.0f) else eta * i - (eta * d + sqrt(k)) * n } +inline fun angle(a: Float2, b: Float2): Float { + val l = length(a) * length(b) + return if (l == 0.0f) 0.0f else acos(clamp(dot(a, b) / l, -1.0f, 1.0f)) +} + inline fun clamp(v: Float2, min: Float, max: Float): Float2 { return Float2( clamp(v.x, min, max), @@ -626,10 +685,25 @@ inline fun greaterThan(a: Float2, b: Float) = Bool2(a.x > b, a.y > b) inline fun greaterThan(a: Float2, b: Float2) = Bool2(a.x > b.y, a.y > b.y) inline fun greaterThanEqual(a: Float2, b: Float) = Bool2(a.x >= b, a.y >= b) inline fun greaterThanEqual(a: Float2, b: Float2) = Bool2(a.x >= b.x, a.y >= b.y) -inline fun equal(a: Float2, b: Float) = Bool2(a.x == b, a.y == b) -inline fun equal(a: Float2, b: Float2) = Bool2(a.x == b.x, a.y == b.y) -inline fun notEqual(a: Float2, b: Float) = Bool2(a.x != b, a.y != b) -inline fun notEqual(a: Float2, b: Float2) = Bool2(a.x != b.x, a.y != b.y) +inline fun equal(a: Float2, b: Float, delta: Float = 0.0f) = Bool2( + a.x.equals(b, delta), + a.y.equals(b, delta) +) + +inline fun equal(a: Float2, b: Float2, delta: Float = 0.0f) = Bool2( + a.x.equals(b.x, delta), + a.y.equals(b.y, delta) +) + +inline fun notEqual(a: Float2, b: Float, delta: Float = 0.0f) = Bool2( + !a.x.equals(b, delta), + !a.y.equals(b, delta) +) + +inline fun notEqual(a: Float2, b: Float2, delta: Float = 0.0f) = Bool2( + !a.x.equals(b.x, delta), + !a.y.equals(b.y, delta) +) inline infix fun Float2.lt(b: Float) = Bool2(x < b, y < b) inline infix fun Float2.lt(b: Float2) = Bool2(x < b.x, y < b.y) @@ -675,6 +749,11 @@ fun refract(i: Float3, n: Float3, eta: Float): Float3 { return if (k < 0.0f) Float3(0.0f) else eta * i - (eta * d + sqrt(k)) * n } +inline fun angle(a: Float3, b: Float3): Float { + val l = length(a) * length(b) + return if (l == 0.0f) 0.0f else acos(clamp(dot(a, b) / l, -1.0f, 1.0f)) +} + inline fun clamp(v: Float3, min: Float, max: Float): Float3 { return Float3( clamp(v.x, min, max), @@ -722,10 +801,29 @@ inline fun greaterThan(a: Float3, b: Float) = Bool3(a.x > b, a.y > b, a.z > b) inline fun greaterThan(a: Float3, b: Float3) = Bool3(a.x > b.y, a.y > b.y, a.z > b.z) inline fun greaterThanEqual(a: Float3, b: Float) = Bool3(a.x >= b, a.y >= b, a.z >= b) inline fun greaterThanEqual(a: Float3, b: Float3) = Bool3(a.x >= b.x, a.y >= b.y, a.z >= b.z) -inline fun equal(a: Float3, b: Float) = Bool3(a.x == b, a.y == b, a.z == b) -inline fun equal(a: Float3, b: Float3) = Bool3(a.x == b.x, a.y == b.y, a.z == b.z) -inline fun notEqual(a: Float3, b: Float) = Bool3(a.x != b, a.y != b, a.z != b) -inline fun notEqual(a: Float3, b: Float3) = Bool3(a.x != b.x, a.y != b.y, a.z != b.z) +inline fun equal(a: Float3, b: Float, delta: Float = 0.0f) = Bool3( + a.x.equals(b, delta), + a.y.equals(b, delta), + a.z.equals(b, delta) +) + +inline fun equal(a: Float3, b: Float3, delta: Float = 0.0f) = Bool3( + a.x.equals(b.x, delta), + a.y.equals(b.y, delta), + a.z.equals(b.z, delta) +) + +inline fun notEqual(a: Float3, b: Float, delta: Float = 0.0f) = Bool3( + !a.x.equals(b, delta), + !a.y.equals(b, delta), + !a.z.equals(b, delta) +) + +inline fun notEqual(a: Float3, b: Float3, delta: Float = 0.0f) = Bool3( + !a.x.equals(b.x, delta), + !a.y.equals(b.y, delta), + !a.z.equals(b.z, delta) +) inline infix fun Float3.lt(b: Float) = Bool3(x < b, y < b, z < b) inline infix fun Float3.lt(b: Float3) = Bool3(x < b.x, y < b.y, z < b.z) @@ -807,17 +905,44 @@ inline fun transform(v: Float4, block: (Float) -> Float) = v.copy().transform(bl inline fun lessThan(a: Float4, b: Float) = Bool4(a.x < b, a.y < b, a.z < b, a.w < b) inline fun lessThan(a: Float4, b: Float4) = Bool4(a.x < b.x, a.y < b.y, a.z < b.z, a.w < b.w) inline fun lessThanEqual(a: Float4, b: Float) = Bool4(a.x <= b, a.y <= b, a.z <= b, a.w <= b) -inline fun lessThanEqual(a: Float4, b: Float4) = Bool4(a.x <= b.x, a.y <= b.y, a.z <= b.z, a.w <= b.w) +inline fun lessThanEqual(a: Float4, b: Float4) = + Bool4(a.x <= b.x, a.y <= b.y, a.z <= b.z, a.w <= b.w) + inline fun greaterThan(a: Float4, b: Float) = Bool4(a.x > b, a.y > b, a.z > b, a.w > b) inline fun greaterThan(a: Float4, b: Float4) = Bool4(a.x > b.y, a.y > b.y, a.z > b.z, a.w > b.w) inline fun greaterThanEqual(a: Float4, b: Float) = Bool4(a.x >= b, a.y >= b, a.z >= b, a.w >= b) -inline fun greaterThanEqual(a: Float4, b: Float4) = Bool4(a.x >= b.x, a.y >= b.y, a.z >= b.z, a.w >= b.w) -inline fun equal(a: Float4, b: Float) = Bool4(a.x == b, a.y == b, a.z == b, a.w == b) -inline fun equal(a: Float4, b: Float4) = Bool4(a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w) -inline fun notEqual(a: Float4, b: Float) = Bool4(a.x != b, a.y != b, a.z != b, a.w != b) -inline fun notEqual(a: Float4, b: Float4) = Bool4(a.x != b.x, a.y != b.y, a.z != b.z, a.w != b.w) - -inline infix fun Float4.lt(b: Float) = Bool4(x < b, y < b, z < b, a < b) +inline fun greaterThanEqual(a: Float4, b: Float4) = + Bool4(a.x >= b.x, a.y >= b.y, a.z >= b.z, a.w >= b.w) + +inline fun equal(a: Float4, b: Float, delta: Float = 0.0f) = Bool4( + a.x.equals(b, delta), + a.y.equals(b, delta), + a.z.equals(b, delta), + a.w.equals(b, delta) +) + +inline fun equal(a: Float4, b: Float4, delta: Float = 0.0f) = Bool4( + a.x.equals(b.x, delta), + a.y.equals(b.y, delta), + a.z.equals(b.z, delta), + a.w.equals(b.w, delta) +) + +inline fun notEqual(a: Float4, b: Float, delta: Float = 0.0f) = Bool4( + !a.x.equals(b, delta), + !a.y.equals(b, delta), + !a.z.equals(b, delta), + !a.w.equals(b, delta) +) + +inline fun notEqual(a: Float4, b: Float4, delta: Float = 0.0f) = Bool4( + !a.x.equals(b.x, delta), + !a.y.equals(b.y, delta), + !a.z.equals(b.z, delta), + !a.w.equals(b.w, delta) +) + +inline infix fun Float4.lt(b: Float) = Bool4(x < b, y < b, z < b, w < b) inline infix fun Float4.lt(b: Float4) = Bool4(x < b.x, y < b.y, z < b.z, w < b.w) inline infix fun Float4.lte(b: Float) = Bool4(x <= b, y <= b, z <= b, w <= b) inline infix fun Float4.lte(b: Float4) = Bool4(x <= b.x, y <= b.y, z <= b.z, w <= b.w) @@ -1277,3 +1402,753 @@ data class Bool4( set(index4, v) } } + +data class Half2(var x: Half = Half.POSITIVE_ZERO, var y: Half = Half.POSITIVE_ZERO) { + constructor(v: Half) : this(v, v) + constructor(v: Half2) : this(v.x, v.y) + + inline var r: Half + get() = x + set(value) { + x = value + } + inline var g: Half + get() = y + set(value) { + y = value + } + + inline var s: Half + get() = x + set(value) { + x = value + } + inline var t: Half + get() = y + set(value) { + y = value + } + + inline var xy: Half2 + get() = Half2(x, y) + set(value) { + x = value.x + y = value.y + } + inline var rg: Half2 + get() = Half2(x, y) + set(value) { + x = value.x + y = value.y + } + inline var st: Half2 + get() = Half2(x, y) + set(value) { + x = value.x + y = value.y + } + + operator fun get(index: VectorComponent) = when (index) { + VectorComponent.X, VectorComponent.R, VectorComponent.S -> x + VectorComponent.Y, VectorComponent.G, VectorComponent.T -> y + else -> throw IllegalArgumentException("index must be X, Y, R, G, S or T") + } + + operator fun get(index1: VectorComponent, index2: VectorComponent): Half2 { + return Half2(get(index1), get(index2)) + } + + operator fun get(index: Int) = when (index) { + 0 -> x + 1 -> y + else -> throw IllegalArgumentException("index must be in 0..1") + } + + operator fun get(index1: Int, index2: Int) = Half2(get(index1), get(index2)) + + inline operator fun invoke(index: Int) = get(index - 1) + + operator fun set(index: Int, v: Half) = when (index) { + 0 -> x = v + 1 -> y = v + else -> throw IllegalArgumentException("index must be in 0..1") + } + + operator fun set(index1: Int, index2: Int, v: Half) { + set(index1, v) + set(index2, v) + } + + operator fun set(index: VectorComponent, v: Half) = when (index) { + VectorComponent.X, VectorComponent.R, VectorComponent.S -> x = v + VectorComponent.Y, VectorComponent.G, VectorComponent.T -> y = v + else -> throw IllegalArgumentException("index must be X, Y, R, G, S or T") + } + + operator fun set(index1: VectorComponent, index2: VectorComponent, v: Half) { + set(index1, v) + set(index2, v) + } + + operator fun unaryMinus() = Half2(-x, -y) + operator fun inc() = Half2(x++, y++) + operator fun dec() = Half2(x--, y--) + + inline operator fun plus(v: Half) = Half2(x + v, y + v) + inline operator fun minus(v: Half) = Half2(x - v, y - v) + inline operator fun times(v: Half) = Half2(x * v, y * v) + inline operator fun div(v: Half) = Half2(x / v, y / v) + + inline operator fun plus(v: Half2) = Half2(x + v.x, y + v.y) + inline operator fun minus(v: Half2) = Half2(x - v.x, y - v.y) + inline operator fun times(v: Half2) = Half2(x * v.x, y * v.y) + inline operator fun div(v: Half2) = Half2(x / v.x, y / v.y) + + inline fun transform(block: (Half) -> Half): Half2 { + x = block(x) + y = block(y) + return this + } + + fun toFloatArray() = floatArrayOf(x.toFloat(), y.toFloat()) +} + +data class Half3( + var x: Half = Half.POSITIVE_ZERO, + var y: Half = Half.POSITIVE_ZERO, + var z: Half = Half.POSITIVE_ZERO +) { + constructor(v: Half) : this(v, v, v) + constructor(v: Half2, z: Half = Half.POSITIVE_ZERO) : this(v.x, v.y, z) + constructor(v: Half3) : this(v.x, v.y, v.z) + + inline var r: Half + get() = x + set(value) { + x = value + } + inline var g: Half + get() = y + set(value) { + y = value + } + inline var b: Half + get() = z + set(value) { + z = value + } + + inline var s: Half + get() = x + set(value) { + x = value + } + inline var t: Half + get() = y + set(value) { + y = value + } + inline var p: Half + get() = z + set(value) { + z = value + } + + inline var xy: Half2 + get() = Half2(x, y) + set(value) { + x = value.x + y = value.y + } + inline var rg: Half2 + get() = Half2(x, y) + set(value) { + x = value.x + y = value.y + } + inline var st: Half2 + get() = Half2(x, y) + set(value) { + x = value.x + y = value.y + } + + inline var rgb: Half3 + get() = Half3(x, y, z) + set(value) { + x = value.x + y = value.y + z = value.z + } + inline var xyz: Half3 + get() = Half3(x, y, z) + set(value) { + x = value.x + y = value.y + z = value.z + } + inline var stp: Half3 + get() = Half3(x, y, z) + set(value) { + x = value.x + y = value.y + z = value.z + } + + operator fun get(index: VectorComponent) = when (index) { + VectorComponent.X, VectorComponent.R, VectorComponent.S -> x + VectorComponent.Y, VectorComponent.G, VectorComponent.T -> y + VectorComponent.Z, VectorComponent.B, VectorComponent.P -> z + else -> throw IllegalArgumentException("index must be X, Y, Z, R, G, B, S, T or P") + } + + operator fun get(index1: VectorComponent, index2: VectorComponent): Half2 { + return Half2(get(index1), get(index2)) + } + operator fun get( + index1: VectorComponent, index2: VectorComponent, index3: VectorComponent): Half3 { + return Half3(get(index1), get(index2), get(index3)) + } + + operator fun get(index: Int) = when (index) { + 0 -> x + 1 -> y + 2 -> z + else -> throw IllegalArgumentException("index must be in 0..2") + } + + operator fun get(index1: Int, index2: Int) = Half2(get(index1), get(index2)) + operator fun get(index1: Int, index2: Int, index3: Int): Half3 { + return Half3(get(index1), get(index2), get(index3)) + } + + inline operator fun invoke(index: Int) = get(index - 1) + + operator fun set(index: Int, v: Half) = when (index) { + 0 -> x = v + 1 -> y = v + 2 -> z = v + else -> throw IllegalArgumentException("index must be in 0..2") + } + + operator fun set(index1: Int, index2: Int, v: Half) { + set(index1, v) + set(index2, v) + } + + operator fun set(index1: Int, index2: Int, index3: Int, v: Half) { + set(index1, v) + set(index2, v) + set(index3, v) + } + + operator fun set(index: VectorComponent, v: Half) = when (index) { + VectorComponent.X, VectorComponent.R, VectorComponent.S -> x = v + VectorComponent.Y, VectorComponent.G, VectorComponent.T -> y = v + VectorComponent.Z, VectorComponent.B, VectorComponent.P -> z = v + else -> throw IllegalArgumentException("index must be X, Y, Z, R, G, B, S, T or P") + } + + operator fun set(index1: VectorComponent, index2: VectorComponent, v: Half) { + set(index1, v) + set(index2, v) + } + + operator fun set( + index1: VectorComponent, index2: VectorComponent, index3: VectorComponent, v: Half) { + set(index1, v) + set(index2, v) + set(index3, v) + } + + operator fun unaryMinus() = Half3(-x, -y, -z) + operator fun inc() = Half3(x++, y++, z++) + operator fun dec() = Half3(x--, y--, z--) + + inline operator fun plus(v: Half) = Half3(x + v, y + v, z + v) + inline operator fun minus(v: Half) = Half3(x - v, y - v, z - v) + inline operator fun times(v: Half) = Half3(x * v, y * v, z * v) + inline operator fun div(v: Half) = Half3(x / v, y / v, z / v) + + inline operator fun plus(v: Half2) = Half3(x + v.x, y + v.y, z) + inline operator fun minus(v: Half2) = Half3(x - v.x, y - v.y, z) + inline operator fun times(v: Half2) = Half3(x * v.x, y * v.y, z) + inline operator fun div(v: Half2) = Half3(x / v.x, y / v.y, z) + + inline operator fun plus(v: Half3) = Half3(x + v.x, y + v.y, z + v.z) + inline operator fun minus(v: Half3) = Half3(x - v.x, y - v.y, z - v.z) + inline operator fun times(v: Half3) = Half3(x * v.x, y * v.y, z * v.z) + inline operator fun div(v: Half3) = Half3(x / v.x, y / v.y, z / v.z) + + inline fun transform(block: (Half) -> Half): Half3 { + x = block(x) + y = block(y) + z = block(z) + return this + } + + fun toFloatArray() = floatArrayOf(x.toFloat(), y.toFloat(), z.toFloat()) +} + +data class Half4( + var x: Half = Half.POSITIVE_ZERO, + var y: Half = Half.POSITIVE_ZERO, + var z: Half = Half.POSITIVE_ZERO, + var w: Half = Half.POSITIVE_ZERO +) { + constructor(v: Half) : this(v, v, v, v) + constructor(v: Half2, z: Half = Half.POSITIVE_ZERO, w: Half = Half.POSITIVE_ZERO) : this(v.x, v.y, z, w) + constructor(v: Half3, w: Half = Half.POSITIVE_ZERO) : this(v.x, v.y, v.z, w) + constructor(v: Half4) : this(v.x, v.y, v.z, v.w) + + inline var r: Half + get() = x + set(value) { + x = value + } + inline var g: Half + get() = y + set(value) { + y = value + } + inline var b: Half + get() = z + set(value) { + z = value + } + inline var a: Half + get() = w + set(value) { + w = value + } + + inline var s: Half + get() = x + set(value) { + x = value + } + inline var t: Half + get() = y + set(value) { + y = value + } + inline var p: Half + get() = z + set(value) { + z = value + } + inline var q: Half + get() = w + set(value) { + w = value + } + + inline var xy: Half2 + get() = Half2(x, y) + set(value) { + x = value.x + y = value.y + } + inline var rg: Half2 + get() = Half2(x, y) + set(value) { + x = value.x + y = value.y + } + inline var st: Half2 + get() = Half2(x, y) + set(value) { + x = value.x + y = value.y + } + + inline var rgb: Half3 + get() = Half3(x, y, z) + set(value) { + x = value.x + y = value.y + z = value.z + } + inline var xyz: Half3 + get() = Half3(x, y, z) + set(value) { + x = value.x + y = value.y + z = value.z + } + inline var stp: Half3 + get() = Half3(x, y, z) + set(value) { + x = value.x + y = value.y + z = value.z + } + + inline var rgba: Half4 + get() = Half4(x, y, z, w) + set(value) { + x = value.x + y = value.y + z = value.z + w = value.w + } + inline var xyzw: Half4 + get() = Half4(x, y, z, w) + set(value) { + x = value.x + y = value.y + z = value.z + w = value.w + } + inline var stpq: Half4 + get() = Half4(x, y, z, w) + set(value) { + x = value.x + y = value.y + z = value.z + w = value.w + } + + operator fun get(index: VectorComponent) = when (index) { + VectorComponent.X, VectorComponent.R, VectorComponent.S -> x + VectorComponent.Y, VectorComponent.G, VectorComponent.T -> y + VectorComponent.Z, VectorComponent.B, VectorComponent.P -> z + VectorComponent.W, VectorComponent.A, VectorComponent.Q -> w + } + + operator fun get(index1: VectorComponent, index2: VectorComponent): Half2 { + return Half2(get(index1), get(index2)) + } + operator fun get( + index1: VectorComponent, + index2: VectorComponent, + index3: VectorComponent): Half3 { + return Half3(get(index1), get(index2), get(index3)) + } + operator fun get( + index1: VectorComponent, + index2: VectorComponent, + index3: VectorComponent, + index4: VectorComponent): Half4 { + return Half4(get(index1), get(index2), get(index3), get(index4)) + } + + operator fun get(index: Int) = when (index) { + 0 -> x + 1 -> y + 2 -> z + 3 -> w + else -> throw IllegalArgumentException("index must be in 0..3") + } + + operator fun get(index1: Int, index2: Int) = Half2(get(index1), get(index2)) + operator fun get(index1: Int, index2: Int, index3: Int): Half3 { + return Half3(get(index1), get(index2), get(index3)) + } + operator fun get(index1: Int, index2: Int, index3: Int, index4: Int): Half4 { + return Half4(get(index1), get(index2), get(index3), get(index4)) + } + + inline operator fun invoke(index: Int) = get(index - 1) + + operator fun set(index: Int, v: Half) = when (index) { + 0 -> x = v + 1 -> y = v + 2 -> z = v + 3 -> w = v + else -> throw IllegalArgumentException("index must be in 0..3") + } + + operator fun set(index1: Int, index2: Int, v: Half) { + set(index1, v) + set(index2, v) + } + + operator fun set(index1: Int, index2: Int, index3: Int, v: Half) { + set(index1, v) + set(index2, v) + set(index3, v) + } + + operator fun set(index1: Int, index2: Int, index3: Int, index4: Int, v: Half) { + set(index1, v) + set(index2, v) + set(index3, v) + set(index4, v) + } + + operator fun set(index: VectorComponent, v: Half) = when (index) { + VectorComponent.X, VectorComponent.R, VectorComponent.S -> x = v + VectorComponent.Y, VectorComponent.G, VectorComponent.T -> y = v + VectorComponent.Z, VectorComponent.B, VectorComponent.P -> z = v + VectorComponent.W, VectorComponent.A, VectorComponent.Q -> w = v + } + + operator fun set(index1: VectorComponent, index2: VectorComponent, v: Half) { + set(index1, v) + set(index2, v) + } + + operator fun set( + index1: VectorComponent, index2: VectorComponent, index3: VectorComponent, v: Half) { + set(index1, v) + set(index2, v) + set(index3, v) + } + + operator fun set( + index1: VectorComponent, index2: VectorComponent, + index3: VectorComponent, index4: VectorComponent, v: Half) { + set(index1, v) + set(index2, v) + set(index3, v) + set(index4, v) + } + + operator fun unaryMinus() = Half4(-x, -y, -z, -w) + operator fun inc() = Half4(x++, y++, z++, w++) + operator fun dec() = Half4(x--, y--, z--, w--) + + inline operator fun plus(v: Half) = Half4(x + v, y + v, z + v, w + v) + inline operator fun minus(v: Half) = Half4(x - v, y - v, z - v, w - v) + inline operator fun times(v: Half) = Half4(x * v, y * v, z * v, w * v) + inline operator fun div(v: Half) = Half4(x / v, y / v, z / v, w / v) + + inline operator fun plus(v: Half2) = Half4(x + v.x, y + v.y, z, w) + inline operator fun minus(v: Half2) = Half4(x - v.x, y - v.y, z, w) + inline operator fun times(v: Half2) = Half4(x * v.x, y * v.y, z, w) + inline operator fun div(v: Half2) = Half4(x / v.x, y / v.y, z, w) + + inline operator fun plus(v: Half3) = Half4(x + v.x, y + v.y, z + v.z, w) + inline operator fun minus(v: Half3) = Half4(x - v.x, y - v.y, z - v.z, w) + inline operator fun times(v: Half3) = Half4(x * v.x, y * v.y, z * v.z, w) + inline operator fun div(v: Half3) = Half4(x / v.x, y / v.y, z / v.z, w) + + inline operator fun plus(v: Half4) = Half4(x + v.x, y + v.y, z + v.z, w + v.w) + inline operator fun minus(v: Half4) = Half4(x - v.x, y - v.y, z - v.z, w - v.w) + inline operator fun times(v: Half4) = Half4(x * v.x, y * v.y, z * v.z, w * v.w) + inline operator fun div(v: Half4) = Half4(x / v.x, y / v.y, z / v.z, w / v.w) + + inline fun transform(block: (Half) -> Half): Half4 { + x = block(x) + y = block(y) + z = block(z) + w = block(w) + return this + } + + fun toFloatArray() = floatArrayOf(x.toFloat(), y.toFloat(), z.toFloat(), w.toFloat()) +} + +inline fun min(v: Half2) = min(v.x, v.y) +inline fun min(a: Half2, b: Half2) = Half2(min(a.x, b.x), min(a.y, b.y)) +inline fun max(v: Half2) = max(v.x, v.y) +inline fun max(a: Half2, b: Half2) = Half2(max(a.x, b.x), max(a.y, b.y)) + +inline fun transform(v: Half2, block: (Half) -> Half) = v.copy().transform(block) + +inline fun lessThan(a: Half2, b: Half) = Bool2(a.x < b, a.y < b) +inline fun lessThan(a: Half2, b: Half2) = Bool2(a.x < b.x, a.y < b.y) +inline fun lessThanEqual(a: Half2, b: Half) = Bool2(a.x <= b, a.y <= b) +inline fun lessThanEqual(a: Half2, b: Half2) = Bool2(a.x <= b.x, a.y <= b.y) +inline fun greaterThan(a: Half2, b: Half) = Bool2(a.x > b, a.y > b) +inline fun greaterThan(a: Half2, b: Half2) = Bool2(a.x > b.y, a.y > b.y) +inline fun greaterThanEqual(a: Half2, b: Half) = Bool2(a.x >= b, a.y >= b) +inline fun greaterThanEqual(a: Half2, b: Half2) = Bool2(a.x >= b.x, a.y >= b.y) +inline fun equal(a: Half2, b: Half) = Bool2(a.x == b, a.y == b) +inline fun equal(a: Half2, b: Half2) = Bool2(a.x == b.x, a.y == b.y) +inline fun notEqual(a: Half2, b: Half) = Bool2(a.x != b, a.y != b) +inline fun notEqual(a: Half2, b: Half2) = Bool2(a.x != b.x, a.y != b.y) + +inline infix fun Half2.lt(b: Half) = Bool2(x < b, y < b) +inline infix fun Half2.lt(b: Half2) = Bool2(x < b.x, y < b.y) +inline infix fun Half2.lte(b: Half) = Bool2(x <= b, y <= b) +inline infix fun Half2.lte(b: Half2) = Bool2(x <= b.x, y <= b.y) +inline infix fun Half2.gt(b: Half) = Bool2(x > b, y > b) +inline infix fun Half2.gt(b: Half2) = Bool2(x > b.x, y > b.y) +inline infix fun Half2.gte(b: Half) = Bool2(x >= b, y >= b) +inline infix fun Half2.gte(b: Half2) = Bool2(x >= b.x, y >= b.y) +inline infix fun Half2.eq(b: Half) = Bool2(x == b, y == b) +inline infix fun Half2.eq(b: Half2) = Bool2(x == b.x, y == b.y) +inline infix fun Half2.neq(b: Half) = Bool2(x != b, y != b) +inline infix fun Half2.neq(b: Half2) = Bool2(x != b.x, y != b.y) + +inline operator fun Half.plus(v: Half3) = Half3(this + v.x, this + v.y, this + v.z) +inline operator fun Half.minus(v: Half3) = Half3(this - v.x, this - v.y, this - v.z) +inline operator fun Half.times(v: Half3) = Half3(this * v.x, this * v.y, this * v.z) +inline operator fun Half.div(v: Half3) = Half3(this / v.x, this / v.y, this / v.z) + +inline fun abs(v: Half3) = Half3(abs(v.x), abs(v.y), abs(v.z)) +inline fun length(v: Half3) = sqrt(v.x * v.x + v.y * v.y + v.z * v.z) +inline fun length2(v: Half3) = v.x * v.x + v.y * v.y + v.z * v.z +inline fun distance(a: Half3, b: Half3) = length(a - b) +inline fun dot(a: Half3, b: Half3) = a.x * b.x + a.y * b.y + a.z * b.z +inline fun cross(a: Half3, b: Half3): Half3 { + return Half3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x) +} +inline infix fun Half3.x(v: Half3): Half3 { + return Half3(y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x) +} +fun normalize(v: Half3): Half3 { + val l = HALF_ONE / length(v) + return Half3(v.x * l, v.y * l, v.z * l) +} + +inline fun reflect(i: Half3, n: Half3) = i - HALF_TWO * dot(n, i) * n +fun refract(i: Half3, n: Half3, eta: Half): Half3 { + val d = dot(n, i) + val k = HALF_ONE - eta * eta * (HALF_ONE - sqr(d)) + return if (k < Half.POSITIVE_ZERO) Half3() else eta * i - (eta * d + sqrt(k)) * n +} + +inline fun clamp(v: Half3, min: Half, max: Half): Half3 { + return Half3( + clamp(v.x, min, max), + clamp(v.y, min, max), + clamp(v.z, min, max) + ) +} + +inline fun clamp(v: Half3, min: Half3, max: Half3): Half3 { + return Half3( + clamp(v.x, min.x, max.x), + clamp(v.y, min.y, max.y), + clamp(v.z, min.z, max.z) + ) +} + +inline fun mix(a: Half3, b: Half3, x: Half): Half3 { + return Half3( + mix(a.x, b.x, x), + mix(a.y, b.y, x), + mix(a.z, b.z, x) + ) +} + +inline fun mix(a: Half3, b: Half3, x: Half3): Half3 { + return Half3( + mix(a.x, b.x, x.x), + mix(a.y, b.y, x.y), + mix(a.z, b.z, x.z) + ) +} + +inline fun min(v: Half3) = min(v.x, min(v.y, v.z)) +inline fun min(a: Half3, b: Half3) = Half3(min(a.x, b.x), min(a.y, b.y), min(a.z, b.z)) +inline fun max(v: Half3) = max(v.x, max(v.y, v.z)) +inline fun max(a: Half3, b: Half3) = Half3(max(a.x, b.x), max(a.y, b.y), max(a.z, b.z)) + +inline fun transform(v: Half3, block: (Half) -> Half) = v.copy().transform(block) + +inline fun lessThan(a: Half3, b: Half) = Bool3(a.x < b, a.y < b, a.z < b) +inline fun lessThan(a: Half3, b: Half3) = Bool3(a.x < b.x, a.y < b.y, a.z < b.z) +inline fun lessThanEqual(a: Half3, b: Half) = Bool3(a.x <= b, a.y <= b, a.z <= b) +inline fun lessThanEqual(a: Half3, b: Half3) = Bool3(a.x <= b.x, a.y <= b.y, a.z <= b.z) +inline fun greaterThan(a: Half3, b: Half) = Bool3(a.x > b, a.y > b, a.z > b) +inline fun greaterThan(a: Half3, b: Half3) = Bool3(a.x > b.y, a.y > b.y, a.z > b.z) +inline fun greaterThanEqual(a: Half3, b: Half) = Bool3(a.x >= b, a.y >= b, a.z >= b) +inline fun greaterThanEqual(a: Half3, b: Half3) = Bool3(a.x >= b.x, a.y >= b.y, a.z >= b.z) +inline fun equal(a: Half3, b: Half) = Bool3(a.x == b, a.y == b, a.z == b) +inline fun equal(a: Half3, b: Half3) = Bool3(a.x == b.x, a.y == b.y, a.z == b.z) +inline fun notEqual(a: Half3, b: Half) = Bool3(a.x != b, a.y != b, a.z != b) +inline fun notEqual(a: Half3, b: Half3) = Bool3(a.x != b.x, a.y != b.y, a.z != b.z) + +inline infix fun Half3.lt(b: Half) = Bool3(x < b, y < b, z < b) +inline infix fun Half3.lt(b: Half3) = Bool3(x < b.x, y < b.y, z < b.z) +inline infix fun Half3.lte(b: Half) = Bool3(x <= b, y <= b, z <= b) +inline infix fun Half3.lte(b: Half3) = Bool3(x <= b.x, y <= b.y, z <= b.z) +inline infix fun Half3.gt(b: Half) = Bool3(x > b, y > b, z > b) +inline infix fun Half3.gt(b: Half3) = Bool3(x > b.x, y > b.y, z > b.z) +inline infix fun Half3.gte(b: Half) = Bool3(x >= b, y >= b, z >= b) +inline infix fun Half3.gte(b: Half3) = Bool3(x >= b.x, y >= b.y, z >= b.z) +inline infix fun Half3.eq(b: Half) = Bool3(x == b, y == b, z == b) +inline infix fun Half3.eq(b: Half3) = Bool3(x == b.x, y == b.y, z == b.z) +inline infix fun Half3.neq(b: Half) = Bool3(x != b, y != b, z != b) +inline infix fun Half3.neq(b: Half3) = Bool3(x != b.x, y != b.y, z != b.z) + +inline operator fun Half.plus(v: Half4) = Half4(this + v.x, this + v.y, this + v.z, this + v.w) +inline operator fun Half.minus(v: Half4) = Half4(this - v.x, this - v.y, this - v.z, this - v.w) +inline operator fun Half.times(v: Half4) = Half4(this * v.x, this * v.y, this * v.z, this * v.w) +inline operator fun Half.div(v: Half4) = Half4(this / v.x, this / v.y, this / v.z, this / v.w) + +inline fun abs(v: Half4) = Half4(abs(v.x), abs(v.y), abs(v.z), abs(v.w)) +inline fun length(v: Half4) = sqrt(v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w) +inline fun length2(v: Half4) = v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w +inline fun distance(a: Half4, b: Half4) = length(a - b) +inline fun dot(a: Half4, b: Half4) = a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w +fun normalize(v: Half4): Half4 { + val l = HALF_ONE / length(v) + return Half4(v.x * l, v.y * l, v.z * l, v.w * l) +} + +inline fun clamp(v: Half4, min: Half, max: Half): Half4 { + return Half4( + clamp(v.x, min, max), + clamp(v.y, min, max), + clamp(v.z, min, max), + clamp(v.w, min, max) + ) +} + +inline fun clamp(v: Half4, min: Half4, max: Half4): Half4 { + return Half4( + clamp(v.x, min.x, max.x), + clamp(v.y, min.y, max.y), + clamp(v.z, min.z, max.z), + clamp(v.w, min.z, max.w) + ) +} + +inline fun mix(a: Half4, b: Half4, x: Half): Half4 { + return Half4( + mix(a.x, b.x, x), + mix(a.y, b.y, x), + mix(a.z, b.z, x), + mix(a.w, b.w, x) + ) +} + +inline fun mix(a: Half4, b: Half4, x: Half4): Half4 { + return Half4( + mix(a.x, b.x, x.x), + mix(a.y, b.y, x.y), + mix(a.z, b.z, x.z), + mix(a.w, b.w, x.w)) +} + +inline fun min(v: Half4) = min(v.x, min(v.y, min(v.z, v.w))) +inline fun min(a: Half4, b: Half4): Half4 { + return Half4(min(a.x, b.x), min(a.y, b.y), min(a.z, b.z), min(a.w, b.w)) +} +inline fun max(v: Half4) = max(v.x, max(v.y, max(v.z, v.w))) +inline fun max(a: Half4, b: Half4): Half4 { + return Half4(max(a.x, b.x), max(a.y, b.y), max(a.z, b.z), max(a.w, b.w)) +} + +inline fun transform(v: Half4, block: (Half) -> Half) = v.copy().transform(block) + +inline fun lessThan(a: Half4, b: Half) = Bool4(a.x < b, a.y < b, a.z < b, a.w < b) +inline fun lessThan(a: Half4, b: Half4) = Bool4(a.x < b.x, a.y < b.y, a.z < b.z, a.w < b.w) +inline fun lessThanEqual(a: Half4, b: Half) = Bool4(a.x <= b, a.y <= b, a.z <= b, a.w <= b) +inline fun lessThanEqual(a: Half4, b: Half4) = Bool4(a.x <= b.x, a.y <= b.y, a.z <= b.z, a.w <= b.w) +inline fun greaterThan(a: Half4, b: Half) = Bool4(a.x > b, a.y > b, a.z > b, a.w > b) +inline fun greaterThan(a: Half4, b: Half4) = Bool4(a.x > b.y, a.y > b.y, a.z > b.z, a.w > b.w) +inline fun greaterThanEqual(a: Half4, b: Half) = Bool4(a.x >= b, a.y >= b, a.z >= b, a.w >= b) +inline fun greaterThanEqual(a: Half4, b: Half4) = Bool4(a.x >= b.x, a.y >= b.y, a.z >= b.z, a.w >= b.w) +inline fun equal(a: Half4, b: Half) = Bool4(a.x == b, a.y == b, a.z == b, a.w == b) +inline fun equal(a: Half4, b: Half4) = Bool4(a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w) +inline fun notEqual(a: Half4, b: Half) = Bool4(a.x != b, a.y != b, a.z != b, a.w != b) +inline fun notEqual(a: Half4, b: Half4) = Bool4(a.x != b.x, a.y != b.y, a.z != b.z, a.w != b.w) + +inline infix fun Half4.lt(b: Half) = Bool4(x < b, y < b, z < b, a < b) +inline infix fun Half4.lt(b: Half4) = Bool4(x < b.x, y < b.y, z < b.z, w < b.w) +inline infix fun Half4.lte(b: Half) = Bool4(x <= b, y <= b, z <= b, w <= b) +inline infix fun Half4.lte(b: Half4) = Bool4(x <= b.x, y <= b.y, z <= b.z, w <= b.w) +inline infix fun Half4.gt(b: Half) = Bool4(x > b, y > b, z > b, w > b) +inline infix fun Half4.gt(b: Half4) = Bool4(x > b.x, y > b.y, z > b.z, w > b.w) +inline infix fun Half4.gte(b: Half) = Bool4(x >= b, y >= b, z >= b, w >= b) +inline infix fun Half4.gte(b: Half4) = Bool4(x >= b.x, y >= b.y, z >= b.z, w >= b.w) +inline infix fun Half4.eq(b: Half) = Bool4(x == b, y == b, z == b, w == b) +inline infix fun Half4.eq(b: Half4) = Bool4(x == b.x, y == b.y, z == b.z, w == b.w) +inline infix fun Half4.neq(b: Half) = Bool4(x != b, y != b, z != b, w != b) +inline infix fun Half4.neq(b: Half4) = Bool4(x != b.x, y != b.y, z != b.z, w != b.w) diff --git a/android/gltfio-android/CMakeLists.txt b/android/gltfio-android/CMakeLists.txt index a3bf446307d..72acf110e25 100644 --- a/android/gltfio-android/CMakeLists.txt +++ b/android/gltfio-android/CMakeLists.txt @@ -44,6 +44,7 @@ set_target_properties(uberarchive PROPERTIES IMPORTED_LOCATION ${FILAMENT_DIR}/lib/${ANDROID_ABI}/libuberarchive.a) set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libgltfio-jni.map") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=16384") set(GLTFIO_SRCS ${GLTFIO_DIR}/include/gltfio/Animator.h @@ -52,6 +53,7 @@ set(GLTFIO_SRCS ${GLTFIO_DIR}/include/gltfio/FilamentInstance.h ${GLTFIO_DIR}/include/gltfio/MaterialProvider.h ${GLTFIO_DIR}/include/gltfio/NodeManager.h + ${GLTFIO_DIR}/include/gltfio/TrsTransformManager.h ${GLTFIO_DIR}/include/gltfio/ResourceLoader.h ${GLTFIO_DIR}/include/gltfio/TextureProvider.h ${GLTFIO_DIR}/include/gltfio/math.h @@ -69,18 +71,31 @@ set(GLTFIO_SRCS ${GLTFIO_DIR}/src/FilamentAsset.cpp ${GLTFIO_DIR}/src/FilamentInstance.cpp ${GLTFIO_DIR}/src/FNodeManager.h + ${GLTFIO_DIR}/src/FTrsTransformManager.h ${GLTFIO_DIR}/src/GltfEnums.h ${GLTFIO_DIR}/src/Ktx2Provider.cpp ${GLTFIO_DIR}/src/MaterialProvider.cpp ${GLTFIO_DIR}/src/NodeManager.cpp + ${GLTFIO_DIR}/src/TrsTransformManager.cpp ${GLTFIO_DIR}/src/ResourceLoader.cpp ${GLTFIO_DIR}/src/StbProvider.cpp ${GLTFIO_DIR}/src/TangentsJob.cpp ${GLTFIO_DIR}/src/TangentsJob.h ${GLTFIO_DIR}/src/UbershaderProvider.cpp + ${GLTFIO_DIR}/src/Utility.cpp + ${GLTFIO_DIR}/src/Utility.h ${GLTFIO_DIR}/src/Wireframe.cpp ${GLTFIO_DIR}/src/Wireframe.h ${GLTFIO_DIR}/src/downcast.h + ${GLTFIO_DIR}/src/extended/AssetLoaderExtended.cpp + ${GLTFIO_DIR}/src/extended/AssetLoaderExtended.h + ${GLTFIO_DIR}/src/extended/ResourceLoaderExtended.cpp + ${GLTFIO_DIR}/src/extended/ResourceLoaderExtended.h + ${GLTFIO_DIR}/src/extended/TangentsJobExtended.cpp + ${GLTFIO_DIR}/src/extended/TangentsJobExtended.h + ${GLTFIO_DIR}/src/extended/TangentSpaceMeshWrapper.cpp + ${GLTFIO_DIR}/src/extended/TangentSpaceMeshWrapper.h + src/main/cpp/Animator.cpp src/main/cpp/AssetLoader.cpp @@ -105,7 +120,6 @@ set(GLTFIO_INCLUDE_DIRS ../../third_party/cgltf ../../third_party/meshoptimizer/src ../../third_party/robin-map - ../../third_party/hat-trie ../../third_party/stb ../../libs/utils/include ../../libs/ktxreader/include diff --git a/android/gltfio-android/build.gradle b/android/gltfio-android/build.gradle index a4a3113fc78..21703aee1db 100644 --- a/android/gltfio-android/build.gradle +++ b/android/gltfio-android/build.gradle @@ -1,12 +1,6 @@ android { namespace 'com.google.android.filament.gltfio' - flavorDimensions "functionality" - productFlavors { - full { - dimension "functionality" - } - } packagingOptions { // No need to package up the following shared libs, which arise as a side effect of our // externalNativeBuild dependencies. When clients pick and choose from project-level gradle @@ -16,6 +10,13 @@ android { excludes += ['lib/*/libfilament-jni.so'] } } + + publishing { + singleVariant("release") { + withSourcesJar() + withJavadocJar() + } + } } dependencies { @@ -29,9 +30,9 @@ apply from: rootProject.file('gradle/gradle-mvn-push.gradle') afterEvaluate { project -> publishing { publications { - fullRelease(MavenPublication) { + release(MavenPublication) { artifactId = POM_ARTIFACT_ID_FULL - from components.fullRelease + from components.release } } } diff --git a/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/FilamentInstance.java b/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/FilamentInstance.java index 71d286cda88..9998ee0cacb 100644 --- a/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/FilamentInstance.java +++ b/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/FilamentInstance.java @@ -144,7 +144,7 @@ public int getJointCountAt(@IntRange(from = 0) int skinIndex) { * * Ignored if variantIndex is out of bounds. */ - void applyMaterialVariant(@IntRange(from = 0) int variantIndex) { + public void applyMaterialVariant(@IntRange(from = 0) int variantIndex) { nApplyMaterialVariant(mNativeObject, variantIndex); } diff --git a/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/MaterialProvider.java b/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/MaterialProvider.java index ee8aaa0fd11..83ae3ab110c 100644 --- a/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/MaterialProvider.java +++ b/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/MaterialProvider.java @@ -28,47 +28,81 @@ @UsedByNative("AssetLoader.cpp") public interface MaterialProvider { - /** * MaterialKey specifies the requirements for a requested glTF material. * The provider creates Filament materials that fulfill these requirements. */ @UsedByNative("MaterialKey.cpp") public static class MaterialKey { + @UsedByNative("MaterialKey.cpp") public boolean doubleSided; + @UsedByNative("MaterialKey.cpp") public boolean unlit; + @UsedByNative("MaterialKey.cpp") public boolean hasVertexColors; + @UsedByNative("MaterialKey.cpp") public boolean hasBaseColorTexture; + @UsedByNative("MaterialKey.cpp") public boolean hasNormalTexture; + @UsedByNative("MaterialKey.cpp") public boolean hasOcclusionTexture; + @UsedByNative("MaterialKey.cpp") public boolean hasEmissiveTexture; + @UsedByNative("MaterialKey.cpp") public boolean useSpecularGlossiness; + @UsedByNative("MaterialKey.cpp") public int alphaMode; // 0 = OPAQUE, 1 = MASK, 2 = BLEND + @UsedByNative("MaterialKey.cpp") public boolean enableDiagnostics; + @UsedByNative("MaterialKey.cpp") public boolean hasMetallicRoughnessTexture; // piggybacks with specularRoughness + @UsedByNative("MaterialKey.cpp") public int metallicRoughnessUV; // piggybacks with specularRoughness + @UsedByNative("MaterialKey.cpp") public int baseColorUV; + @UsedByNative("MaterialKey.cpp") public boolean hasClearCoatTexture; + @UsedByNative("MaterialKey.cpp") public int clearCoatUV; + @UsedByNative("MaterialKey.cpp") public boolean hasClearCoatRoughnessTexture; + @UsedByNative("MaterialKey.cpp") public int clearCoatRoughnessUV; + @UsedByNative("MaterialKey.cpp") public boolean hasClearCoatNormalTexture; + @UsedByNative("MaterialKey.cpp") public int clearCoatNormalUV; + @UsedByNative("MaterialKey.cpp") public boolean hasClearCoat; + @UsedByNative("MaterialKey.cpp") public boolean hasTransmission; + @UsedByNative("MaterialKey.cpp") public boolean hasTextureTransforms; + @UsedByNative("MaterialKey.cpp") public int emissiveUV; + @UsedByNative("MaterialKey.cpp") public int aoUV; + @UsedByNative("MaterialKey.cpp") public int normalUV; + @UsedByNative("MaterialKey.cpp") public boolean hasTransmissionTexture; + @UsedByNative("MaterialKey.cpp") public int transmissionUV; + @UsedByNative("MaterialKey.cpp") public boolean hasSheenColorTexture; + @UsedByNative("MaterialKey.cpp") public int sheenColorUV; + @UsedByNative("MaterialKey.cpp") public boolean hasSheenRoughnessTexture; + @UsedByNative("MaterialKey.cpp") public int sheenRoughnessUV; + @UsedByNative("MaterialKey.cpp") public boolean hasVolumeThicknessTexture; + @UsedByNative("MaterialKey.cpp") public int volumeThicknessUV; + @UsedByNative("MaterialKey.cpp") public boolean hasSheen; + @UsedByNative("MaterialKey.cpp") public boolean hasIOR; public MaterialKey() {} diff --git a/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/UbershaderProvider.java b/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/UbershaderProvider.java index f9260599526..bf01da6c166 100644 --- a/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/UbershaderProvider.java +++ b/android/gltfio-android/src/main/java/com/google/android/filament/gltfio/UbershaderProvider.java @@ -20,6 +20,7 @@ import com.google.android.filament.MaterialInstance; import com.google.android.filament.Material; import com.google.android.filament.VertexBuffer; +import com.google.android.filament.proguard.UsedByNative; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -94,6 +95,7 @@ public void destroyMaterials() { nDestroyMaterials(mNativeObject); } + @UsedByNative("AssetLoader.cpp") public long getNativeObject() { return mNativeObject; } diff --git a/android/gradle.properties b/android/gradle.properties index e9b5cbe0fe4..e4f778ef79e 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,5 +1,5 @@ GROUP=com.google.android.filament -VERSION_NAME=1.31.1 +VERSION_NAME=1.56.6 POM_DESCRIPTION=Real-time physically based rendering engine for Android. @@ -18,7 +18,12 @@ POM_DEVELOPER_NAME=Filament Team org.gradle.jvmargs=-Xmx1536m android.useAndroidX=true +android.defaults.buildfeatures.buildconfig=true +android.nonTransitiveRClass=false +android.nonFinalResIds=false com.google.android.filament.tools-dir=../../../out/release/filament com.google.android.filament.dist-dir=../out/android-release/filament com.google.android.filament.abis=all +#com.google.android.filament.matdbg +#com.google.android.filament.matnopt diff --git a/android/gradle/gradle-mvn-push.gradle b/android/gradle/gradle-mvn-push.gradle index 18ee2a3eb36..c6bf2751f6d 100644 --- a/android/gradle/gradle-mvn-push.gradle +++ b/android/gradle/gradle-mvn-push.gradle @@ -86,63 +86,10 @@ afterEvaluate { project -> } } - if (project.getPlugins().hasPlugin('com.android.application') || - project.getPlugins().hasPlugin('com.android.library')) { - - task androidJavadocs(type: Javadoc) { - source = android.sourceSets.main.java.source - classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) - excludes = ['**/*.kt'] - } - - task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) { - classifier = 'javadoc' - from androidJavadocs.destinationDir - } - - task androidSourcesJar(type: Jar) { - classifier = 'sources' - from android.sourceSets.main.java.source - } - } - - if (JavaVersion.current().isJava8Compatible()) { - allprojects { - tasks.withType(Javadoc) { - options.addStringOption('Xdoclint:none', '-quiet') - } - } - } - - if (JavaVersion.current().isJava9Compatible()) { - allprojects { - tasks.withType(Javadoc) { - options.addBooleanOption('html5', true) - } - } - } - - artifacts { - if (project.getPlugins().hasPlugin('com.android.application') || - project.getPlugins().hasPlugin('com.android.library')) { - archives androidSourcesJar - archives androidJavadocsJar - } - } - - android.libraryVariants.all { variant -> - tasks.androidJavadocs.doFirst { - classpath += files(variant.javaCompileProvider.get().classpath.files.join(File.pathSeparator)) - } - } - publishing.publications.all { publication -> publication.groupId = GROUP publication.version = VERSION_NAME - publication.artifact androidSourcesJar - publication.artifact androidJavadocsJar - configurePom(publication.pom) } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 37da3ec8454..e6abf1cccf0 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Wed Nov 17 10:40:18 PST 2021 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/android/samples/README.md b/android/samples/README.md index 151583bb82d..cdfc93e2e21 100644 --- a/android/samples/README.md +++ b/android/samples/README.md @@ -87,9 +87,9 @@ compile Filament's native library and Filament's AAR for this project. The easie is to install all the required dependencies and to run the following commands at the root of the source tree: -``` -$ ./build.sh -p desktop -i release -$ ./build.sh -p android release +```shell +./build.sh -p desktop -i release +./build.sh -p android release ``` This will build all the native components and the AAR required by this sample application. @@ -100,8 +100,8 @@ distribution/install directory for desktop (produced by make/ninja install). Thi contain `bin/matc` and `bin/cmgen`. Example: -``` -$ ./gradlew -Pfilament_tools_dir=../../dist-release assembleDebug +```shell +./gradlew -Pfilament_tools_dir=../../dist-release assembleDebug ``` ## Important: SDK location @@ -110,14 +110,24 @@ Either ensure your `ANDROID_HOME` environment variable is set or make sure the r contains a `local.properties` file with the `sdk.dir` property pointing to your installation of the Android SDK. -## Android Studio +## Compiling + +### Android Studio You must use the latest stable release of Android Studio. To open the project, point Studio to the `android` folder. After opening the project and syncing to gradle, select the sample of your choice using the drop-down widget in the toolbar. -## Compiling - To compile and run each sample make sure you have selected the appropriate build variant (arm7, arm8, x86 or x86_64). If you are not sure you can simply select the "universal" variant which includes all the other ones. + +### Command Line + +From the `android` directory in the project root: + +```shell +./gradlew :samples:sample-hello-triangle:installDebug +``` + +Replace `sample-hello-triangle` with your preferred project. diff --git a/android/samples/sample-gltf-viewer/build.gradle b/android/samples/sample-gltf-viewer/build.gradle index 5f1b6de3088..e2e83b94717 100644 --- a/android/samples/sample-gltf-viewer/build.gradle +++ b/android/samples/sample-gltf-viewer/build.gradle @@ -6,6 +6,10 @@ plugins { project.ext.isSample = true +kotlin { + jvmToolchain(versions.jdk) +} + filamentTools { cmgenArgs = "-q --format=ktx --size=256 --extract-blur=0.1 --deploy=src/main/assets/envs/default_env" iblInputFile = project.layout.projectDirectory.file("../../../third_party/environments/lightroom_14b.hdr") @@ -13,7 +17,7 @@ filamentTools { } // don't forget to update MainACtivity.kt when/if changing this. -task copyMesh(type: Copy) { +tasks.register('copyMesh', Copy) { from "../../../third_party/models/BusterDrone" into "src/main/assets/models" } @@ -30,9 +34,8 @@ android { compileSdkVersion versions.compileSdk defaultConfig { applicationId "com.google.android.filament.gltf" - minSdkVersion 19 + minSdkVersion versions.minSdk targetSdkVersion versions.targetSdk - missingDimensionStrategy 'functionality', 'full' } // NOTE: This is a workaround required because the AGP task collectReleaseDependencies @@ -40,6 +43,11 @@ android { dependenciesInfo { includeInApk = false } + + compileOptions { + sourceCompatibility versions.jdk + targetCompatibility versions.jdk + } } dependencies { diff --git a/android/samples/sample-gltf-viewer/src/main/java/com/google/android/filament/gltf/MainActivity.kt b/android/samples/sample-gltf-viewer/src/main/java/com/google/android/filament/gltf/MainActivity.kt index 6e449261fdd..102c4944e6e 100644 --- a/android/samples/sample-gltf-viewer/src/main/java/com/google/android/filament/gltf/MainActivity.kt +++ b/android/samples/sample-gltf-viewer/src/main/java/com/google/android/filament/gltf/MainActivity.kt @@ -26,8 +26,10 @@ import android.widget.TextView import android.widget.Toast import com.google.android.filament.Fence import com.google.android.filament.IndirectLight +import com.google.android.filament.Material import com.google.android.filament.Skybox import com.google.android.filament.View +import com.google.android.filament.View.OnPickCallback import com.google.android.filament.utils.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -56,7 +58,9 @@ class MainActivity : Activity() { private lateinit var modelViewer: ModelViewer private lateinit var titlebarHint: TextView private val doubleTapListener = DoubleTapListener() + private val singleTapListener = SingleTapListener() private lateinit var doubleTapDetector: GestureDetector + private lateinit var singleTapDetector: GestureDetector private var remoteServer: RemoteServer? = null private var statusToast: Toast? = null private var statusText: String? = null @@ -77,6 +81,7 @@ class MainActivity : Activity() { choreographer = Choreographer.getInstance() doubleTapDetector = GestureDetector(applicationContext, doubleTapListener) + singleTapDetector = GestureDetector(applicationContext, singleTapListener) modelViewer = ModelViewer(surfaceView) viewerContent.view = modelViewer.view @@ -88,6 +93,7 @@ class MainActivity : Activity() { surfaceView.setOnTouchListener { _, event -> modelViewer.onTouchEvent(event) doubleTapDetector.onTouchEvent(event) + singleTapDetector.onTouchEvent(event) true } @@ -229,6 +235,7 @@ class MainActivity : Activity() { modelViewer.scene.skybox = sky modelViewer.scene.indirectLight = ibl viewerContent.indirectLight = ibl + } } } @@ -337,6 +344,11 @@ class MainActivity : Activity() { remoteServer?.close() } + override fun onBackPressed() { + super.onBackPressed() + finish() + } + fun loadModelData(message: RemoteServer.ReceivedMessage) { Log.i(TAG, "Downloaded model ${message.label} (${message.buffer.capacity()} bytes)") clearStatusText() @@ -356,6 +368,8 @@ class MainActivity : Activity() { automation.applySettings(modelViewer.engine, json, viewerContent) modelViewer.view.colorGrading = automation.getColorGrading(modelViewer.engine) modelViewer.cameraFocalLength = automation.viewerOptions.cameraFocalLength + modelViewer.cameraNear = automation.viewerOptions.cameraNear + modelViewer.cameraFar = automation.viewerOptions.cameraFar updateRootTransform() } @@ -379,6 +393,36 @@ class MainActivity : Activity() { Log.i(TAG, "The Filament backend took $total ms to load the model geometry.") modelViewer.engine.destroyFence(it) loadStartFence = null + + val materials = mutableSetOf() + val rcm = modelViewer.engine.renderableManager + modelViewer.scene.forEach { + val entity = it + if (rcm.hasComponent(entity)) { + val ri = rcm.getInstance(entity) + val c = rcm.getPrimitiveCount(ri) + for (i in 0 until c) { + val mi = rcm.getMaterialInstanceAt(ri, i) + val ma = mi.material + materials.add(ma) + } + } + } + materials.forEach { + it.compile( + Material.CompilerPriorityQueue.HIGH, + Material.UserVariantFilterBit.DIRECTIONAL_LIGHTING or + Material.UserVariantFilterBit.DYNAMIC_LIGHTING or + Material.UserVariantFilterBit.SHADOW_RECEIVER, + null, null) + it.compile( + Material.CompilerPriorityQueue.LOW, + Material.UserVariantFilterBit.FOG or + Material.UserVariantFilterBit.SKINNING or + Material.UserVariantFilterBit.SSR or + Material.UserVariantFilterBit.VSM, + null, null) + } } } @@ -423,4 +467,19 @@ class MainActivity : Activity() { return super.onDoubleTap(e) } } + + // Just for testing purposes + inner class SingleTapListener : GestureDetector.SimpleOnGestureListener() { + override fun onSingleTapUp(event: MotionEvent): Boolean { + modelViewer.view.pick( + event.x.toInt(), + surfaceView.height - event.y.toInt(), + surfaceView.handler, { + val name = modelViewer.asset!!.getName(it.renderable) + Log.v("Filament", "Picked ${it.renderable}: " + name) + }, + ) + return super.onSingleTapUp(event) + } + } } diff --git a/android/samples/sample-hello-camera/build.gradle b/android/samples/sample-hello-camera/build.gradle index aba41bbb466..1307ea169bf 100644 --- a/android/samples/sample-hello-camera/build.gradle +++ b/android/samples/sample-hello-camera/build.gradle @@ -6,6 +6,10 @@ plugins { project.ext.isSample = true +kotlin { + jvmToolchain(versions.jdk) +} + filamentTools { materialInputDir = project.layout.projectDirectory.dir("src/main/materials") materialOutputDir = project.layout.projectDirectory.dir("src/main/assets/materials") @@ -36,6 +40,11 @@ android { aaptOptions { noCompress 'filamat', 'ktx' } + + compileOptions { + sourceCompatibility versions.jdk + targetCompatibility versions.jdk + } } dependencies { diff --git a/android/samples/sample-hello-camera/src/main/java/com/google/android/filament/hellocam/MainActivity.kt b/android/samples/sample-hello-camera/src/main/java/com/google/android/filament/hellocam/MainActivity.kt index 500b0919e90..b8097ee52ed 100644 --- a/android/samples/sample-hello-camera/src/main/java/com/google/android/filament/hellocam/MainActivity.kt +++ b/android/samples/sample-hello-camera/src/main/java/com/google/android/filament/hellocam/MainActivity.kt @@ -30,6 +30,7 @@ import com.google.android.filament.* import com.google.android.filament.RenderableManager.* import com.google.android.filament.VertexBuffer.* import com.google.android.filament.android.DisplayHelper +import com.google.android.filament.android.FilamentHelper import com.google.android.filament.android.UiHelper import java.nio.ByteBuffer @@ -401,6 +402,8 @@ class MainActivity : Activity(), ActivityCompat.OnRequestPermissionsResultCallba camera.setProjection(45.0, aspect, 0.1, 20.0, Camera.Fov.VERTICAL) view.viewport = Viewport(0, 0, width, height) + + FilamentHelper.synchronizePendingFrames(engine) } } diff --git a/android/samples/sample-hello-triangle/build.gradle b/android/samples/sample-hello-triangle/build.gradle index ea4c6bf0162..66f2874526c 100644 --- a/android/samples/sample-hello-triangle/build.gradle +++ b/android/samples/sample-hello-triangle/build.gradle @@ -6,6 +6,10 @@ plugins { project.ext.isSample = true +kotlin { + jvmToolchain(versions.jdk) +} + filamentTools { materialInputDir = project.layout.projectDirectory.dir("src/main/materials") materialOutputDir = project.layout.projectDirectory.dir("src/main/assets/materials") @@ -36,6 +40,11 @@ android { aaptOptions { noCompress 'filamat', 'ktx' } + + compileOptions { + sourceCompatibility versions.jdk + targetCompatibility versions.jdk + } } dependencies { diff --git a/android/samples/sample-hello-triangle/src/main/AndroidManifest.xml b/android/samples/sample-hello-triangle/src/main/AndroidManifest.xml index 9b149c25801..7ebe637288f 100644 --- a/android/samples/sample-hello-triangle/src/main/AndroidManifest.xml +++ b/android/samples/sample-hello-triangle/src/main/AndroidManifest.xml @@ -1,6 +1,8 @@ + + - Image-Based Lighting + Material Builder diff --git a/android/samples/sample-multi-view/build.gradle b/android/samples/sample-multi-view/build.gradle index 4d2570cafde..82da8e39868 100644 --- a/android/samples/sample-multi-view/build.gradle +++ b/android/samples/sample-multi-view/build.gradle @@ -6,6 +6,10 @@ plugins { project.ext.isSample = true +kotlin { + jvmToolchain(versions.jdk) +} + filamentTools { materialInputDir = project.layout.projectDirectory.dir("src/main/materials") materialOutputDir = project.layout.projectDirectory.dir("src/main/assets/materials") @@ -35,6 +39,11 @@ android { aaptOptions { noCompress 'filamat', 'ktx' } + + compileOptions { + sourceCompatibility versions.jdk + targetCompatibility versions.jdk + } } dependencies { diff --git a/android/samples/sample-multi-view/src/main/java/com/google/android/filament/multiview/MainActivity.kt b/android/samples/sample-multi-view/src/main/java/com/google/android/filament/multiview/MainActivity.kt index aec5aaf1481..7bb529189e3 100644 --- a/android/samples/sample-multi-view/src/main/java/com/google/android/filament/multiview/MainActivity.kt +++ b/android/samples/sample-multi-view/src/main/java/com/google/android/filament/multiview/MainActivity.kt @@ -30,6 +30,7 @@ import com.google.android.filament.RenderableManager.* import com.google.android.filament.Renderer.ClearOptions import com.google.android.filament.VertexBuffer.* import com.google.android.filament.android.DisplayHelper +import com.google.android.filament.android.FilamentHelper import com.google.android.filament.android.UiHelper import java.nio.ByteBuffer @@ -458,6 +459,8 @@ class MainActivity : Activity() { view1.viewport = Viewport(width / 2, 0, width / 2, height / 2) view2.viewport = Viewport(0, height / 2, width / 2, height / 2) view4.viewport = Viewport(width / 4, height / 4, width / 2, height / 2) + + FilamentHelper.synchronizePendingFrames(engine) } } diff --git a/android/samples/sample-page-curl/build.gradle b/android/samples/sample-page-curl/build.gradle index 893b2628b84..46f20d0104c 100644 --- a/android/samples/sample-page-curl/build.gradle +++ b/android/samples/sample-page-curl/build.gradle @@ -6,6 +6,10 @@ plugins { project.ext.isSample = true +kotlin { + jvmToolchain(versions.jdk) +} + filamentTools { iblInputFile = project.layout.projectDirectory.file("../../../third_party/environments/studio_small_02_2k.hdr") iblOutputDir = project.layout.projectDirectory.dir("src/main/assets/envs") @@ -38,6 +42,11 @@ android { aaptOptions { noCompress 'filamat' } + + compileOptions { + sourceCompatibility versions.jdk + targetCompatibility versions.jdk + } } dependencies { diff --git a/android/samples/sample-page-curl/src/main/java/com/google/android/filament/pagecurl/MainActivity.java b/android/samples/sample-page-curl/src/main/java/com/google/android/filament/pagecurl/MainActivity.java index be13ed91c4a..9b038d4eb55 100644 --- a/android/samples/sample-page-curl/src/main/java/com/google/android/filament/pagecurl/MainActivity.java +++ b/android/samples/sample-page-curl/src/main/java/com/google/android/filament/pagecurl/MainActivity.java @@ -37,6 +37,7 @@ import com.google.android.filament.Engine; import com.google.android.filament.Entity; import com.google.android.filament.EntityManager; +import com.google.android.filament.Fence; import com.google.android.filament.Filament; import com.google.android.filament.IndirectLight; import com.google.android.filament.LightManager; @@ -49,6 +50,7 @@ import com.google.android.filament.Viewport; import com.google.android.filament.android.DisplayHelper; +import com.google.android.filament.android.FilamentHelper; import com.google.android.filament.android.TextureHelper; import com.google.android.filament.android.UiHelper; @@ -107,6 +109,7 @@ public void onResized(int width, int height) { mCamera.setProjection(60.0, aspect, 1.0, 2000.0, Camera.Fov.HORIZONTAL); } mView.setViewport(new Viewport(0, 0, width, height)); + FilamentHelper.synchronizePendingFrames(mEngine); } @Override diff --git a/android/samples/sample-stream-test/build.gradle b/android/samples/sample-stream-test/build.gradle index ef1a04e9659..c812d4be532 100644 --- a/android/samples/sample-stream-test/build.gradle +++ b/android/samples/sample-stream-test/build.gradle @@ -6,6 +6,10 @@ plugins { project.ext.isSample = true +kotlin { + jvmToolchain(versions.jdk) +} + filamentTools { materialInputDir = project.layout.projectDirectory.dir("src/main/materials") materialOutputDir = project.layout.projectDirectory.dir("src/main/assets/materials") @@ -36,6 +40,11 @@ android { aaptOptions { noCompress 'filamat', 'ktx' } + + compileOptions { + sourceCompatibility versions.jdk + targetCompatibility versions.jdk + } } dependencies { diff --git a/android/samples/sample-stream-test/src/main/java/com/google/android/filament/streamtest/MainActivity.kt b/android/samples/sample-stream-test/src/main/java/com/google/android/filament/streamtest/MainActivity.kt index 45237c0285a..1aae2f2e98d 100644 --- a/android/samples/sample-stream-test/src/main/java/com/google/android/filament/streamtest/MainActivity.kt +++ b/android/samples/sample-stream-test/src/main/java/com/google/android/filament/streamtest/MainActivity.kt @@ -38,6 +38,7 @@ import android.os.Build import android.view.MotionEvent import androidx.annotation.RequiresApi import com.google.android.filament.android.DisplayHelper +import com.google.android.filament.android.FilamentHelper class MainActivity : Activity(), ActivityCompat.OnRequestPermissionsResultCallback { @@ -401,6 +402,8 @@ class MainActivity : Activity(), ActivityCompat.OnRequestPermissionsResultCallba camera.setProjection(45.0, aspect, 0.1, 20.0, Camera.Fov.VERTICAL) view.viewport = Viewport(0, 0, width, height) + + FilamentHelper.synchronizePendingFrames(engine) } } diff --git a/android/samples/sample-texture-view/build.gradle b/android/samples/sample-texture-view/build.gradle index 787babc022d..b7368d1c91c 100644 --- a/android/samples/sample-texture-view/build.gradle +++ b/android/samples/sample-texture-view/build.gradle @@ -6,6 +6,10 @@ plugins { project.ext.isSample = true +kotlin { + jvmToolchain(versions.jdk) +} + filamentTools { materialInputDir = project.layout.projectDirectory.dir("src/main/materials") materialOutputDir = project.layout.projectDirectory.dir("src/main/assets/materials") @@ -36,6 +40,11 @@ android { aaptOptions { noCompress 'filamat', 'ktx' } + + compileOptions { + sourceCompatibility versions.jdk + targetCompatibility versions.jdk + } } dependencies { diff --git a/android/samples/sample-texture-view/src/main/java/com/google/android/filament/textureview/MainActivity.kt b/android/samples/sample-texture-view/src/main/java/com/google/android/filament/textureview/MainActivity.kt index 1d17c613f7b..390aae6460a 100644 --- a/android/samples/sample-texture-view/src/main/java/com/google/android/filament/textureview/MainActivity.kt +++ b/android/samples/sample-texture-view/src/main/java/com/google/android/filament/textureview/MainActivity.kt @@ -29,6 +29,7 @@ import com.google.android.filament.RenderableManager.PrimitiveType import com.google.android.filament.VertexBuffer.AttributeType import com.google.android.filament.VertexBuffer.VertexAttribute import com.google.android.filament.android.DisplayHelper +import com.google.android.filament.android.FilamentHelper import com.google.android.filament.android.UiHelper import java.nio.ByteBuffer import java.nio.ByteOrder @@ -327,6 +328,8 @@ class MainActivity : Activity() { -aspect * zoom, aspect * zoom, -zoom, zoom, 0.0, 10.0) view.viewport = Viewport(0, 0, width, height) + + FilamentHelper.synchronizePendingFrames(engine) } } diff --git a/android/samples/sample-textured-object/build.gradle b/android/samples/sample-textured-object/build.gradle index 985790dbacf..0fa72916e69 100644 --- a/android/samples/sample-textured-object/build.gradle +++ b/android/samples/sample-textured-object/build.gradle @@ -6,6 +6,10 @@ plugins { project.ext.isSample = true +kotlin { + jvmToolchain(versions.jdk) +} + filamentTools { materialInputDir = project.layout.projectDirectory.dir("src/main/materials") materialOutputDir = project.layout.projectDirectory.dir("src/main/assets/materials") @@ -29,7 +33,6 @@ android { applicationId "com.google.android.filament.textured" minSdkVersion versions.minSdk targetSdkVersion versions.targetSdk - missingDimensionStrategy 'functionality', 'full' } // NOTE: This is a workaround required because the AGP task collectReleaseDependencies @@ -43,6 +46,11 @@ android { aaptOptions { noCompress 'filamat', 'ktx' } + + compileOptions { + sourceCompatibility versions.jdk + targetCompatibility versions.jdk + } } dependencies { diff --git a/android/samples/sample-textured-object/src/main/java/com/google/android/filament/textured/MainActivity.kt b/android/samples/sample-textured-object/src/main/java/com/google/android/filament/textured/MainActivity.kt index cf335468541..4016d35f38a 100644 --- a/android/samples/sample-textured-object/src/main/java/com/google/android/filament/textured/MainActivity.kt +++ b/android/samples/sample-textured-object/src/main/java/com/google/android/filament/textured/MainActivity.kt @@ -26,6 +26,7 @@ import android.view.animation.LinearInterpolator import com.google.android.filament.* import com.google.android.filament.android.DisplayHelper +import com.google.android.filament.android.FilamentHelper import com.google.android.filament.utils.* import com.google.android.filament.android.UiHelper @@ -230,7 +231,7 @@ class MainActivity : Activity() { animator.repeatCount = ValueAnimator.INFINITE animator.addUpdateListener { a -> val v = (a.animatedValue as Float) - camera.lookAt(cos(v) * 4.5, 1.5, sin(v) * 4.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0) + camera.lookAt(cos(v) * 5.5, 1.5, sin(v) * 5.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0) } animator.start() } @@ -252,7 +253,7 @@ class MainActivity : Activity() { // Stop the animation and any pending frame choreographer.removeFrameCallback(frameScheduler) - animator.cancel(); + animator.cancel() // Always detach the surface before destroying the engine uiHelper.detach() @@ -323,6 +324,8 @@ class MainActivity : Activity() { camera.setProjection(45.0, aspect, 0.1, 20.0, Camera.Fov.VERTICAL) view.viewport = Viewport(0, 0, width, height) + + FilamentHelper.synchronizePendingFrames(engine) } } diff --git a/android/samples/sample-transparent-view/build.gradle b/android/samples/sample-transparent-view/build.gradle index cd249aef924..d06c7815fcc 100644 --- a/android/samples/sample-transparent-view/build.gradle +++ b/android/samples/sample-transparent-view/build.gradle @@ -6,6 +6,10 @@ plugins { project.ext.isSample = true +kotlin { + jvmToolchain(versions.jdk) +} + filamentTools { materialInputDir = project.layout.projectDirectory.dir("src/main/materials") materialOutputDir = project.layout.projectDirectory.dir("src/main/assets/materials") @@ -36,6 +40,11 @@ android { aaptOptions { noCompress 'filamat', 'ktx' } + + compileOptions { + sourceCompatibility versions.jdk + targetCompatibility versions.jdk + } } dependencies { diff --git a/android/samples/sample-transparent-view/src/main/java/com/google/android/filament/transparentrendering/MainActivity.kt b/android/samples/sample-transparent-view/src/main/java/com/google/android/filament/transparentrendering/MainActivity.kt index 22c63c05c86..5991d7e47c5 100644 --- a/android/samples/sample-transparent-view/src/main/java/com/google/android/filament/transparentrendering/MainActivity.kt +++ b/android/samples/sample-transparent-view/src/main/java/com/google/android/filament/transparentrendering/MainActivity.kt @@ -33,6 +33,7 @@ import com.google.android.filament.* import com.google.android.filament.RenderableManager.* import com.google.android.filament.VertexBuffer.* import com.google.android.filament.android.DisplayHelper +import com.google.android.filament.android.FilamentHelper import com.google.android.filament.android.UiHelper import java.nio.ByteBuffer @@ -139,9 +140,9 @@ class MainActivity : Activity() { camera = engine.createCamera(engine.entityManager.create()) // clear the swapchain with transparent pixels - val options = renderer.clearOptions - options.clear = true - renderer.clearOptions = options + renderer.clearOptions = renderer.clearOptions.apply { + clear = true + } } private fun setupView() { @@ -350,6 +351,8 @@ class MainActivity : Activity() { -aspect * zoom, aspect * zoom, -zoom, zoom, 0.0, 10.0) view.viewport = Viewport(0, 0, width, height) + + FilamentHelper.synchronizePendingFrames(engine) } } diff --git a/assets/models/monkey/albedo.png b/assets/models/monkey/color.png similarity index 100% rename from assets/models/monkey/albedo.png rename to assets/models/monkey/color.png diff --git a/build.sh b/build.sh index 064001a19c5..3f972d75c16 100755 --- a/build.sh +++ b/build.sh @@ -22,9 +22,13 @@ function print_help { echo " All (and only) git-ignored files under android/ are deleted." echo " This is sometimes needed instead of -c (which still misses some clean steps)." echo " -d" - echo " Enable matdbg and disable material optimization." + echo " Enable matdbg." + echo " -t" + echo " Enable fgviewer." echo " -f" echo " Always invoke CMake before incremental builds." + echo " -g" + echo " Disable material optimization." echo " -i" echo " Install build output" echo " -m" @@ -42,8 +46,6 @@ function print_help { echo " Exclude Vulkan support from the Android build." echo " -s" echo " Add iOS simulator support to the iOS build." - echo " -t" - echo " Enable SwiftShader support for Vulkan in desktop builds." echo " -e" echo " Enable EGL on Linux support for desktop builds." echo " -l" @@ -56,6 +58,20 @@ function print_help { echo " When building for Android, also build select sample APKs." echo " sampleN is an Android sample, e.g., sample-gltf-viewer." echo " This automatically performs a partial desktop build and install." + echo " -b" + echo " Enable Address and Undefined Behavior Sanitizers (asan/ubsan) for debugging." + echo " This is only for the desktop build." + echo " -x value" + echo " Define a preprocessor flag FILAMENT_BACKEND_DEBUG_FLAG with [value]. This is useful for" + echo " enabling debug paths in the backend from the build script. For example, make a" + echo " systrace-enabled build without directly changing #defines. Remember to add -f when" + echo " changing this option." + echo " -X osmesa_path" + echo " Indicates a path to a completed OSMesa build. OSMesa is used to create an offscreen GL" + echo " context for software rasterization" + echo " -S type" + echo " Enable stereoscopic rendering where type is one of [instanced|multiview]. This is only" + echo " meant for building the samples." echo "" echo "Build types:" echo " release" @@ -85,8 +101,8 @@ function print_help { echo " Desktop matc target, release build:" echo " \$ ./$self_name release matc" echo "" - echo " Build gltf_viewer then immediately run it with no arguments:" - echo " \$ ./$self_name release run_gltf_viewer" + echo " Build gltf_viewer:" + echo " \$ ./$self_name release gltf_viewer" echo "" } @@ -111,6 +127,27 @@ function print_matdbg_help { echo "" } +function print_fgviewer_help { + echo "fgviewer is enabled in the build, but some extra steps are needed." + echo "" + echo "FOR DESKTOP BUILDS:" + echo "" + echo "Please set the port environment variable before launching. e.g., on macOS do:" + echo " export FILAMENT_FGVIEWER_PORT=8085" + echo "" + echo "FOR ANDROID BUILDS:" + echo "" + echo "1) For Android Studio builds, make sure to set:" + echo " -Pcom.google.android.filament.fgviewer" + echo " option in Preferences > Build > Compiler > Command line options." + echo "" + echo "2) The port number is hardcoded to 8085 so you will need to do:" + echo " adb forward tcp:8085 tcp:8085" + echo "" + echo "3) Be sure to enable INTERNET permission in your app's manifest file." + echo "" +} + # Unless explicitly specified, NDK version will be selected as highest available version within same major release chain FILAMENT_NDK_VERSION=${FILAMENT_NDK_VERSION:-$(cat `dirname $0`/build/android/ndk.version | cut -f 1 -d ".")} @@ -155,13 +192,23 @@ INSTALL_COMMAND= VULKAN_ANDROID_OPTION="-DFILAMENT_SUPPORTS_VULKAN=ON" VULKAN_ANDROID_GRADLE_OPTION="" -SWIFTSHADER_OPTION="-DFILAMENT_USE_SWIFTSHADER=OFF" - EGL_ON_LINUX_OPTION="-DFILAMENT_SUPPORTS_EGL_ON_LINUX=OFF" MATDBG_OPTION="-DFILAMENT_ENABLE_MATDBG=OFF" +FGVIEWER_OPTION="-DFILAMENT_ENABLE_FGVIEWER=OFF" MATDBG_GRADLE_OPTION="" +MATOPT_OPTION="" +MATOPT_GRADLE_OPTION="" + +ASAN_UBSAN_OPTION="" + +BACKEND_DEBUG_FLAG_OPTION="" + +STEREOSCOPIC_OPTION="" + +OSMESA_OPTION="" + IOS_BUILD_SIMULATOR=false BUILD_UNIVERSAL_LIBRARIES=false @@ -181,6 +228,7 @@ function build_clean { rm -Rf android/filamat-android/build android/filamat-android/.externalNativeBuild android/filamat-android/.cxx rm -Rf android/gltfio-android/build android/gltfio-android/.externalNativeBuild android/gltfio-android/.cxx rm -Rf android/filament-utils-android/build android/filament-utils-android/.externalNativeBuild android/filament-utils-android/.cxx + rm -f compile_commands.json } function build_clean_aggressive { @@ -200,13 +248,10 @@ function build_desktop_target { echo "Building ${lc_target} in out/cmake-${lc_target}..." mkdir -p "out/cmake-${lc_target}" - cd "out/cmake-${lc_target}" + pushd "out/cmake-${lc_target}" > /dev/null - # On macOS, set the deployment target to 10.15. local lc_name=$(echo "${UNAME}" | tr '[:upper:]' '[:lower:]') if [[ "${lc_name}" == "darwin" ]]; then - local deployment_target="-DCMAKE_OSX_DEPLOYMENT_TARGET=10.15" - if [[ "${BUILD_UNIVERSAL_LIBRARIES}" == "true" ]]; then local architectures="-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64" fi @@ -218,12 +263,18 @@ function build_desktop_target { -DIMPORT_EXECUTABLES_DIR=out \ -DCMAKE_BUILD_TYPE="$1" \ -DCMAKE_INSTALL_PREFIX="../${lc_target}/filament" \ - ${SWIFTSHADER_OPTION} \ ${EGL_ON_LINUX_OPTION} \ + ${FGVIEWER_OPTION} \ ${MATDBG_OPTION} \ - ${deployment_target} \ + ${MATOPT_OPTION} \ + ${ASAN_UBSAN_OPTION} \ + ${BACKEND_DEBUG_FLAG_OPTION} \ + ${STEREOSCOPIC_OPTION} \ + ${OSMESA_OPTION} \ ${architectures} \ ../.. + ln -sf "out/cmake-${lc_target}/compile_commands.json" \ + ../../compile_commands.json fi ${BUILD_COMMAND} ${build_targets} @@ -235,12 +286,13 @@ function build_desktop_target { if [[ -d "../${lc_target}/filament" ]]; then if [[ "${ISSUE_ARCHIVES}" == "true" ]]; then echo "Generating out/filament-${lc_target}-${LC_UNAME}.tgz..." - cd "../${lc_target}" + pushd "../${lc_target}" > /dev/null tar -czvf "../filament-${lc_target}-${LC_UNAME}.tgz" filament + popd > /dev/null fi fi - cd ../.. + popd > /dev/null } function build_desktop { @@ -258,7 +310,7 @@ function build_webgl_with_target { echo "Building WebGL ${lc_target}..." mkdir -p "out/cmake-webgl-${lc_target}" - cd "out/cmake-webgl-${lc_target}" + pushd "out/cmake-webgl-${lc_target}" > /dev/null if [[ ! "${BUILD_TARGETS}" ]]; then BUILD_TARGETS=${BUILD_CUSTOM_TARGETS} @@ -277,7 +329,10 @@ function build_webgl_with_target { -DCMAKE_BUILD_TYPE="$1" \ -DCMAKE_INSTALL_PREFIX="../webgl-${lc_target}/filament" \ -DWEBGL=1 \ + ${BACKEND_DEBUG_FLAG_OPTION} \ ../.. + ln -sf "out/cmake-webgl-${lc_target}/compile_commands.json" \ + ../../compile_commands.json ${BUILD_COMMAND} ${BUILD_TARGETS} ) fi @@ -295,17 +350,17 @@ function build_webgl_with_target { if [[ "${ISSUE_ARCHIVES}" == "true" ]]; then echo "Generating out/filament-${lc_target}-web.tgz..." - cd web/filament-js + pushd web/filament-js > /dev/null tar -cvf "../../../filament-${lc_target}-web.tar" filament.js tar -rvf "../../../filament-${lc_target}-web.tar" filament.wasm tar -rvf "../../../filament-${lc_target}-web.tar" filament.d.ts - cd - + popd > /dev/null gzip -c "../filament-${lc_target}-web.tar" > "../filament-${lc_target}-web.tgz" rm "../filament-${lc_target}-web.tar" fi fi - cd ../.. + popd > /dev/null } function build_webgl { @@ -336,7 +391,7 @@ function build_android_target { echo "Building Android ${lc_target} (${arch})..." mkdir -p "out/cmake-android-${lc_target}-${arch}" - cd "out/cmake-android-${lc_target}-${arch}" + pushd "out/cmake-android-${lc_target}-${arch}" > /dev/null if [[ ! -d "CMakeFiles" ]] || [[ "${ISSUE_CMAKE_ALWAYS}" == "true" ]]; then cmake \ @@ -346,15 +401,21 @@ function build_android_target { -DFILAMENT_NDK_VERSION="${FILAMENT_NDK_VERSION}" \ -DCMAKE_INSTALL_PREFIX="../android-${lc_target}/filament" \ -DCMAKE_TOOLCHAIN_FILE="../../build/toolchain-${arch}-linux-android.cmake" \ + ${FGVIEWER_OPTION} \ ${MATDBG_OPTION} \ + ${MATOPT_OPTION} \ ${VULKAN_ANDROID_OPTION} \ + ${BACKEND_DEBUG_FLAG_OPTION} \ + ${STEREOSCOPIC_OPTION} \ ../.. + ln -sf "out/cmake-android-${lc_target}-${arch}/compile_commands.json" \ + ../../compile_commands.json fi # We must always install Android libraries to build the AAR ${BUILD_COMMAND} install - cd ../.. + popd > /dev/null } function build_android_arch { @@ -375,9 +436,9 @@ function archive_android { if [[ -d "out/android-${lc_target}/filament" ]]; then if [[ "${ISSUE_ARCHIVES}" == "true" ]]; then echo "Generating out/filament-android-${lc_target}-${LC_UNAME}.tgz..." - cd "out/android-${lc_target}" + pushd "out/android-${lc_target}" > /dev/null tar -czvf "../filament-android-${lc_target}-${LC_UNAME}.tgz" filament - cd ../.. + popd > /dev/null fi fi } @@ -455,7 +516,7 @@ function build_android { archive_android "Release" fi - cd android + pushd android > /dev/null if [[ "${ISSUE_DEBUG_BUILD}" == "true" ]]; then ./gradlew \ @@ -463,6 +524,7 @@ function build_android { -Pcom.google.android.filament.abis=${ABI_GRADLE_OPTION} \ ${VULKAN_ANDROID_GRADLE_OPTION} \ ${MATDBG_GRADLE_OPTION} \ + ${MATOPT_GRADLE_OPTION} \ :filament-android:assembleDebug \ :gltfio-android:assembleDebug \ :filament-utils-android:assembleDebug @@ -477,19 +539,20 @@ function build_android { ./gradlew \ -Pcom.google.android.filament.dist-dir=../out/android-debug/filament \ -Pcom.google.android.filament.abis=${ABI_GRADLE_OPTION} \ + ${MATOPT_GRADLE_OPTION} \ :samples:${sample}:assembleDebug done fi if [[ "${INSTALL_COMMAND}" ]]; then echo "Installing out/filamat-android-debug.aar..." - cp filamat-android/build/outputs/aar/filamat-android-full-debug.aar ../out/filamat-android-debug.aar + cp filamat-android/build/outputs/aar/filamat-android-debug.aar ../out/filamat-android-debug.aar echo "Installing out/filament-android-debug.aar..." cp filament-android/build/outputs/aar/filament-android-debug.aar ../out/ echo "Installing out/gltfio-android-debug.aar..." - cp gltfio-android/build/outputs/aar/gltfio-android-full-debug.aar ../out/gltfio-android-debug.aar + cp gltfio-android/build/outputs/aar/gltfio-android-debug.aar ../out/gltfio-android-debug.aar echo "Installing out/filament-utils-android-debug.aar..." cp filament-utils-android/build/outputs/aar/filament-utils-android-debug.aar ../out/filament-utils-android-debug.aar @@ -497,7 +560,7 @@ function build_android { if [[ "${BUILD_ANDROID_SAMPLES}" == "true" ]]; then for sample in ${ANDROID_SAMPLES}; do echo "Installing out/${sample}-debug.apk" - cp samples/${sample}/build/outputs/apk/debug/${sample}-debug-unsigned.apk \ + cp samples/${sample}/build/outputs/apk/debug/${sample}-debug.apk \ ../out/${sample}-debug.apk done fi @@ -510,6 +573,7 @@ function build_android { -Pcom.google.android.filament.abis=${ABI_GRADLE_OPTION} \ ${VULKAN_ANDROID_GRADLE_OPTION} \ ${MATDBG_GRADLE_OPTION} \ + ${MATOPT_GRADLE_OPTION} \ :filament-android:assembleRelease \ :gltfio-android:assembleRelease \ :filament-utils-android:assembleRelease @@ -524,20 +588,20 @@ function build_android { ./gradlew \ -Pcom.google.android.filament.dist-dir=../out/android-release/filament \ -Pcom.google.android.filament.abis=${ABI_GRADLE_OPTION} \ + ${MATOPT_GRADLE_OPTION} \ :samples:${sample}:assembleRelease done fi if [[ "${INSTALL_COMMAND}" ]]; then echo "Installing out/filamat-android-release.aar..." - cp filamat-android/build/outputs/aar/filamat-android-lite-release.aar ../out/ - cp filamat-android/build/outputs/aar/filamat-android-full-release.aar ../out/filamat-android-release.aar + cp filamat-android/build/outputs/aar/filamat-android-release.aar ../out/filamat-android-release.aar echo "Installing out/filament-android-release.aar..." cp filament-android/build/outputs/aar/filament-android-release.aar ../out/ echo "Installing out/gltfio-android-release.aar..." - cp gltfio-android/build/outputs/aar/gltfio-android-full-release.aar ../out/gltfio-android-release.aar + cp gltfio-android/build/outputs/aar/gltfio-android-release.aar ../out/gltfio-android-release.aar echo "Installing out/filament-utils-android-release.aar..." cp filament-utils-android/build/outputs/aar/filament-utils-android-release.aar ../out/filament-utils-android-release.aar @@ -552,7 +616,7 @@ function build_android { fi fi - cd .. + popd > /dev/null } function build_ios_target { @@ -563,7 +627,7 @@ function build_ios_target { echo "Building iOS ${lc_target} (${arch}) for ${platform}..." mkdir -p "out/cmake-ios-${lc_target}-${arch}" - cd "out/cmake-ios-${lc_target}-${arch}" + pushd "out/cmake-ios-${lc_target}-${arch}" > /dev/null if [[ ! -d "CMakeFiles" ]] || [[ "${ISSUE_CMAKE_ALWAYS}" == "true" ]]; then cmake \ @@ -575,8 +639,13 @@ function build_ios_target { -DPLATFORM_NAME="${platform}" \ -DIOS=1 \ -DCMAKE_TOOLCHAIN_FILE=../../third_party/clang/iOS.cmake \ + ${FGVIEWER_OPTION} \ ${MATDBG_OPTION} \ + ${MATOPT_OPTION} \ + ${STEREOSCOPIC_OPTION} \ ../.. + ln -sf "out/cmake-ios-${lc_target}-${arch}/compile_commands.json" \ + ../../compile_commands.json fi ${BUILD_COMMAND} @@ -586,7 +655,7 @@ function build_ios_target { ${BUILD_COMMAND} ${INSTALL_COMMAND} fi - cd ../.. + popd > /dev/null } function archive_ios { @@ -595,9 +664,9 @@ function archive_ios { if [[ -d "out/ios-${lc_target}/filament" ]]; then if [[ "${ISSUE_ARCHIVES}" == "true" ]]; then echo "Generating out/filament-${lc_target}-ios.tgz..." - cd "out/ios-${lc_target}" + pushd "out/ios-${lc_target}" > /dev/null tar -czvf "../filament-${lc_target}-ios.tgz" filament - cd ../.. + popd > /dev/null fi fi } @@ -656,14 +725,14 @@ function build_web_docs { mkdir -p out/web-docs cp -f docs/web-docs-package.json out/web-docs/package.json - cd out/web-docs + pushd out/web-docs > /dev/null npm install > /dev/null # Generate documents npx markdeep-rasterizer ../../docs/Filament.md.html ../../docs/Materials.md.html ../../docs/ - cd ../.. + popd > /dev/null } function validate_build_command { @@ -707,6 +776,13 @@ function validate_build_command { exit 1 fi fi + + # Make sure FILAMENT_BACKEND_DEBUG_FLAG is only meant for debug builds + if [[ "${ISSUE_DEBUG_BUILD}" != "true" ]] && [[ ! -z "${BACKEND_DEBUG_FLAG_OPTION}" ]]; then + echo "Error: cannot specify FILAMENT_BACKEND_DEBUG_FLAG in non-debug build" + exit 1 + fi + set -e } @@ -736,15 +812,28 @@ function run_tests { fi } +function check_debug_release_build { + if [[ "${ISSUE_DEBUG_BUILD}" == "true" || \ + "${ISSUE_RELEASE_BUILD}" == "true" || \ + "${ISSUE_CLEAN}" == "true" || \ + "${ISSUE_WEB_DOCS}" == "true" ]]; then + "$@"; + else + echo "You must declare a debug or release target for $@ builds." + echo "" + exit 1 + fi +} + # Beginning of the script pushd "$(dirname "$0")" > /dev/null -while getopts ":hacCfijmp:q:uvslwtedk:" opt; do +while getopts ":hacCfgijmp:q:uvslwedtk:bx:S:X:" opt; do case ${opt} in h) print_help - exit 1 + exit 0 ;; a) ISSUE_ARCHIVES=true @@ -758,12 +847,22 @@ while getopts ":hacCfijmp:q:uvslwtedk:" opt; do ;; d) PRINT_MATDBG_HELP=true - MATDBG_OPTION="-DFILAMENT_ENABLE_MATDBG=ON, -DFILAMENT_DISABLE_MATOPT=ON, -DFILAMENT_BUILD_FILAMAT=ON" + MATDBG_OPTION="-DFILAMENT_ENABLE_MATDBG=ON, -DFILAMENT_BUILD_FILAMAT=ON" MATDBG_GRADLE_OPTION="-Pcom.google.android.filament.matdbg" ;; + t) + # TODO: Uncomment below when fgviewer is ready + # PRINT_FGVIEWER_HELP=true + # FGVIEWER_OPTION="-DFILAMENT_ENABLE_FGVIEWER=ON" + #FGVIEWER_GRADLE_OPTION="-Pcom.google.android.filament.fgviewer" + ;; f) ISSUE_CMAKE_ALWAYS=true ;; + g) + MATOPT_OPTION="-DFILAMENT_DISABLE_MATOPT=ON" + MATOPT_GRADLE_OPTION="-Pcom.google.android.filament.matnopt" + ;; i) INSTALL_COMMAND=install ;; @@ -776,7 +875,7 @@ while getopts ":hacCfijmp:q:uvslwtedk:" opt; do platforms=$(echo "${OPTARG}" | tr ',' '\n') for platform in ${platforms} do - case ${platform} in + case $(echo "${platform}" | tr '[:upper:]' '[:lower:]') in desktop) ISSUE_DESKTOP_BUILD=true ;; @@ -795,6 +894,12 @@ while getopts ":hacCfijmp:q:uvslwtedk:" opt; do ISSUE_DESKTOP_BUILD=true ISSUE_WEBGL_BUILD=false ;; + *) + echo "Unknown platform ${platform}" + echo "Platform must be one of [desktop|android|ios|webgl|all]" + echo "" + exit 1 + ;; esac done ;; @@ -807,7 +912,7 @@ while getopts ":hacCfijmp:q:uvslwtedk:" opt; do abis=$(echo "${OPTARG}" | tr ',' '\n') for abi in ${abis} do - case ${abi} in + case $(echo "${abi}" | tr '[:upper:]' '[:lower:]') in armeabi-v7a) ABI_ARMEABI_V7A=true ;; @@ -826,6 +931,12 @@ while getopts ":hacCfijmp:q:uvslwtedk:" opt; do ABI_X86=true ABI_X86_64=true ;; + *) + echo "Unknown abi ${abi}" + echo "ABI must be one of [armeabi-v7a|arm64-v8a|x86|x86_64|all]" + echo "" + exit 1 + ;; esac done ;; @@ -843,10 +954,6 @@ while getopts ":hacCfijmp:q:uvslwtedk:" opt; do IOS_BUILD_SIMULATOR=true echo "iOS simulator support enabled." ;; - t) - SWIFTSHADER_OPTION="-DFILAMENT_USE_SWIFTSHADER=ON" - echo "SwiftShader support enabled." - ;; e) EGL_ON_LINUX_OPTION="-DFILAMENT_SUPPORTS_EGL_ON_LINUX=ON -DFILAMENT_SKIP_SDL2=ON -DFILAMENT_SKIP_SAMPLES=ON" echo "EGL on Linux support enabled; skipping SDL2." @@ -863,6 +970,27 @@ while getopts ":hacCfijmp:q:uvslwtedk:" opt; do BUILD_ANDROID_SAMPLES=true ANDROID_SAMPLES=$(echo "${OPTARG}" | tr ',' '\n') ;; + b) ASAN_UBSAN_OPTION="-DFILAMENT_ENABLE_ASAN_UBSAN=ON" + echo "Enabled ASAN/UBSAN" + ;; + x) BACKEND_DEBUG_FLAG_OPTION="-DFILAMENT_BACKEND_DEBUG_FLAG=${OPTARG}" + ;; + S) case $(echo "${OPTARG}" | tr '[:upper:]' '[:lower:]') in + instanced) + STEREOSCOPIC_OPTION="-DFILAMENT_SAMPLES_STEREO_TYPE=instanced" + ;; + multiview) + STEREOSCOPIC_OPTION="-DFILAMENT_SAMPLES_STEREO_TYPE=multiview" + ;; + *) + echo "Unknown stereoscopic type ${OPTARG}" + echo "Type must be one of [instanced|multiview]" + echo "" + exit 1 + esac + ;; + X) OSMESA_OPTION="-DFILAMENT_OSMESA_PATH=${OPTARG}" + ;; \?) echo "Invalid option: -${OPTARG}" >&2 echo "" @@ -886,9 +1014,9 @@ fi shift $((OPTIND - 1)) for arg; do - if [[ "${arg}" == "release" ]]; then + if [[ $(echo "${arg}" | tr '[:upper:]' '[:lower:]') == "release" ]]; then ISSUE_RELEASE_BUILD=true - elif [[ "${arg}" == "debug" ]]; then + elif [[ $(echo "${arg}" | tr '[:upper:]' '[:lower:]') == "debug" ]]; then ISSUE_DEBUG_BUILD=true else BUILD_CUSTOM_TARGETS="${BUILD_CUSTOM_TARGETS} ${arg}" @@ -906,19 +1034,19 @@ if [[ "${ISSUE_CLEAN_AGGRESSIVE}" == "true" ]]; then fi if [[ "${ISSUE_DESKTOP_BUILD}" == "true" ]]; then - build_desktop + check_debug_release_build build_desktop fi if [[ "${ISSUE_ANDROID_BUILD}" == "true" ]]; then - build_android + check_debug_release_build build_android fi if [[ "${ISSUE_IOS_BUILD}" == "true" ]]; then - build_ios + check_debug_release_build build_ios fi if [[ "${ISSUE_WEBGL_BUILD}" == "true" ]]; then - build_webgl + check_debug_release_build build_webgl fi if [[ "${ISSUE_WEB_DOCS}" == "true" ]]; then @@ -932,3 +1060,7 @@ fi if [[ "${PRINT_MATDBG_HELP}" == "true" ]]; then print_matdbg_help fi + +if [[ "${PRINT_FGVIEWER_HELP}" == "true" ]]; then + print_fgviewer_help +fi diff --git a/build/android/build.sh b/build/android/build.sh index 3df4981458b..c9821b8fb43 100755 --- a/build/android/build.sh +++ b/build/android/build.sh @@ -44,21 +44,23 @@ elif [[ "$LC_UNAME" == "darwin" ]]; then fi source `dirname $0`/../common/build-common.sh +if [[ "$GITHUB_WORKFLOW" ]]; then + java_version=$(java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1) + if [[ "$java_version" < 17 ]]; then + echo "Android builds require Java 17, found version ${java_version} instead" + exit 0 + fi +fi + # Unless explicitly specified, NDK version will be set to match exactly the required one FILAMENT_NDK_VERSION=${FILAMENT_NDK_VERSION:-$(cat `dirname $0`/ndk.version)} # Install the required NDK version specifically (if not present) if [[ ! -d "${ANDROID_HOME}/ndk/$FILAMENT_NDK_VERSION" ]]; then - # NOTE: We MUST use Java 1.8 to run sdkmanager currently, it fails starting with Java 11 - JAVA_HOME=${JAVA_HOME_8_X64} ${ANDROID_HOME}/tools/bin/sdkmanager "ndk;$FILAMENT_NDK_VERSION" > /dev/null + yes | ${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager --licenses + ${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager "ndk;$FILAMENT_NDK_VERSION" fi - -# Only build 1 64 bit target during presubmit to cut down build times during presubmit -# Continuous builds will build everything ANDROID_ABIS= -if [[ "$TARGET" == "presubmit" ]]; then - ANDROID_ABIS="-q arm64-v8a" -fi # Build the Android sample-gltf-viewer APK during release. BUILD_SAMPLES= @@ -66,5 +68,19 @@ if [[ "$TARGET" == "release" ]]; then BUILD_SAMPLES="-k sample-gltf-viewer" fi +function build_android() { + local ABI=$1 + + # Do the following in two steps so that we do not run out of space + if [[ -n "${BUILD_DEBUG}" ]]; then + FILAMENT_NDK_VERSION=${FILAMENT_NDK_VERSION} ./build.sh -p android -q ${ABI} -c ${BUILD_SAMPLES} ${GENERATE_ARCHIVES} ${BUILD_DEBUG} + rm -rf out/cmake-android-debug-* + fi + if [[ -n "${BUILD_RELEASE}" ]]; then + FILAMENT_NDK_VERSION=${FILAMENT_NDK_VERSION} ./build.sh -p android -q ${ABI} -c ${BUILD_SAMPLES} ${GENERATE_ARCHIVES} ${BUILD_RELEASE} + rm -rf out/cmake-android-release-* + fi +} + pushd `dirname $0`/../.. > /dev/null -FILAMENT_NDK_VERSION=${FILAMENT_NDK_VERSION} ./build.sh -p android $ANDROID_ABIS -c $BUILD_SAMPLES $GENERATE_ARCHIVES $BUILD_DEBUG $BUILD_RELEASE +build_android $2 diff --git a/build/android/ndk.version b/build/android/ndk.version index 46e2cdd8608..f58ef0240a5 100644 --- a/build/android/ndk.version +++ b/build/android/ndk.version @@ -1 +1 @@ -25.1.8937393 \ No newline at end of file +27.0.11718014 \ No newline at end of file diff --git a/build/common/bump-version.sh b/build/common/bump-version.sh index 2a8bcb135d9..f8c11d935d9 100755 --- a/build/common/bump-version.sh +++ b/build/common/bump-version.sh @@ -2,6 +2,11 @@ set -e +case "$(uname -s)" in + Darwin*) IS_DARWIN=1;; + *) ;; +esac + function print_help { local SELF_NAME SELF_NAME=$(basename "$0") @@ -45,7 +50,11 @@ function replace { FIND_STR="${1//\{\{VERSION\}\}/${VERSION_REGEX}}" REPLACE_STR="${1//\{\{VERSION\}\}/${NEW_VERSION}}" local FILE_NAME="$2" - sed -i '' -E "s/${FIND_STR}/${REPLACE_STR}/" "${FILE_NAME}" + if [ $IS_DARWIN == 1 ]; then + sed -i '' -E "s/${FIND_STR}/${REPLACE_STR}/" "${FILE_NAME}" + else + sed -i -E "s/${FIND_STR}/${REPLACE_STR}/" "${FILE_NAME}" + fi } # The following are the canonical locations where the Filament version number is referenced. diff --git a/build/common/ci-common.sh b/build/common/ci-common.sh index 7ea0b8de46c..cb36ca7cddf 100755 --- a/build/common/ci-common.sh +++ b/build/common/ci-common.sh @@ -3,12 +3,4 @@ if [[ "$GITHUB_WORKFLOW" ]]; then echo "Running workflow $GITHUB_WORKFLOW (event: $GITHUB_EVENT_NAME, action: $GITHUB_ACTION)" CONTINUOUS_INTEGRATION=true - - # Force Java to be Java 11 minimum, it defaults to 8 in GitHub runners for some platforms - export JAVA_HOME=${JAVA_HOME_11_X64} - java_version=$(java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1) - if [[ "$java_version" < 11 ]]; then - echo "Android builds require Java 11, found version ${java_version} instead" - exit 0 - fi fi diff --git a/build/common/test_list.txt b/build/common/test_list.txt index 39a71c5f4f2..3121fccfd00 100644 --- a/build/common/test_list.txt +++ b/build/common/test_list.txt @@ -5,7 +5,6 @@ libs/math/test_math libs/image/test_image compare libs/image/tests/reference/ libs/utils/test_utils libs/filamat/test_filamat -libs/filamat/test_filamat_lite tools/matc/test_matc tools/cmgen/test_cmgen compare tools/glslminifier/test_glslminifier diff --git a/build/linux/ci-common.sh b/build/linux/ci-common.sh index dc9c3111106..bc3abd0fc24 100755 --- a/build/linux/ci-common.sh +++ b/build/linux/ci-common.sh @@ -1,16 +1,16 @@ #!/bin/bash # version of clang we want to use -GITHUB_CLANG_VERSION=8 +export GITHUB_CLANG_VERSION=14 # version of CMake to use instead of the default one -CMAKE_VERSION=3.19.5 +export GITHUB_CMAKE_VERSION=3.19.5 # version of ninja to use -NINJA_VERSION=1.10.2 +export GITHUB_NINJA_VERSION=1.10.2 # Steps for GitHub Workflows if [[ "$GITHUB_WORKFLOW" ]]; then # Install ninja - wget -q https://github.com/ninja-build/ninja/releases/download/v$NINJA_VERSION/ninja-linux.zip + wget -q https://github.com/ninja-build/ninja/releases/download/v$GITHUB_NINJA_VERSION/ninja-linux.zip unzip -q ninja-linux.zip export PATH="$PWD:$PATH" @@ -18,9 +18,9 @@ if [[ "$GITHUB_WORKFLOW" ]]; then mkdir -p cmake cd cmake - sudo wget https://github.com/Kitware/CMake/releases/download/v$CMAKE_VERSION/cmake-$CMAKE_VERSION-Linux-x86_64.sh - sudo chmod +x ./cmake-$CMAKE_VERSION-Linux-x86_64.sh - sudo ./cmake-$CMAKE_VERSION-Linux-x86_64.sh --skip-license > /dev/null + sudo wget https://github.com/Kitware/CMake/releases/download/v$GITHUB_CMAKE_VERSION/cmake-$GITHUB_CMAKE_VERSION-Linux-x86_64.sh + sudo chmod +x ./cmake-$GITHUB_CMAKE_VERSION-Linux-x86_64.sh + sudo ./cmake-$GITHUB_CMAKE_VERSION-Linux-x86_64.sh --skip-license > /dev/null sudo update-alternatives --install /usr/bin/cmake cmake $(pwd)/bin/cmake 1000 --force cd .. diff --git a/build/linux/combine-static-libs.sh b/build/linux/combine-static-libs.sh index 4d0c7930812..063cca94a6a 100755 --- a/build/linux/combine-static-libs.sh +++ b/build/linux/combine-static-libs.sh @@ -125,7 +125,13 @@ if [[ "${has_universal}" == "true" ]]; then arch_output="${OUTPUT_PATH%.a}_${arch}.a" arch_outputs+=("$arch_output") - combine_static_libs "$arch_output" $(find "$(pwd)/${archs_temp_dir}/${arch}" -iname '*.a') + + archives=() + while IFS= read -r -d $'\0'; do + archives+=("$REPLY") + done < <(find "$(pwd)/${archs_temp_dir}/${arch}" -iname '*.a' -print0) + + combine_static_libs "$arch_output" "${archives[@]}" done # Finally, combine the single-architecture archives into a universal binary. diff --git a/build/swiftshader/Dockerfile b/build/swiftshader/Dockerfile deleted file mode 100644 index 4c0ce984fd0..00000000000 --- a/build/swiftshader/Dockerfile +++ /dev/null @@ -1,53 +0,0 @@ -# Build the image: -# docker build --no-cache --tag ssfilament -f build/swiftshader/Dockerfile . -# docker tag ssfilament ghcr.io/filament-assets/swiftshader -# -# Publish the image: -# docker login ghcr.io --username --password -# docker push ghcr.io/filament-assets/swiftshader -# -# Run the image and mount the current directory: -# docker run -it -v `pwd`:/trees/filament -t ssfilament - -FROM ubuntu:focal -WORKDIR /trees -ARG DEBIAN_FRONTEND=noninteractive -ENV SWIFTSHADER_LD_LIBRARY_PATH=/trees/swiftshader/build -ENV CXXFLAGS='-fno-builtin -Wno-pass-failed' - -RUN apt-get update && \ - apt-get --no-install-recommends install -y \ - apt-transport-https \ - apt-utils \ - build-essential \ - cmake \ - ca-certificates \ - git \ - ninja-build \ - python \ - python3 \ - xorg-dev \ - clang-7 \ - libc++-7-dev \ - libc++abi-7-dev \ - lldb - -# Ensure that clang is used instead of gcc. -RUN set -eux ;\ - update-alternatives --install /usr/bin/clang clang /usr/bin/clang-7 100 ;\ - update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-7 100 ;\ - update-alternatives --install /usr/bin/cc cc /usr/bin/clang 100 ;\ - update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++ 100 - -# Get patch files from the local Filament tree. -COPY build/swiftshader/*.diff . - -# Clone SwiftShader, apply patches, and build it. -RUN set -eux ;\ - git clone https://swiftshader.googlesource.com/SwiftShader swiftshader ;\ - cd swiftshader ;\ - git checkout 139f5c3 ;\ - git apply /trees/*.diff ;\ - cd build ;\ - cmake .. -GNinja -DCMAKE_BUILD_TYPE=Release ;\ - ninja diff --git a/build/swiftshader/gallery.py b/build/swiftshader/gallery.py deleted file mode 100755 index 01c27cafb39..00000000000 --- a/build/swiftshader/gallery.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python3 - -from pathlib import Path -import os - -spath = os.path.dirname(os.path.realpath(__file__)) - -path = Path(spath) - -folder = "../../results/" - -images = list(path.glob(folder + '*.png')) - -images.sort() - -gallery = open(path.absolute().joinpath(folder + 'index.html'), 'w') - -gallery.write(""" - - - - - - - -""") - -tag = '' - -for image in images: - group = image.stem.rstrip('0123456789') - before = f'https://filament-assets.github.io/golden/{group}/{image.name}' - after = image.name - gallery.write('\n') - gallery.write(f'

      {image.stem}.json

      \n') - gallery.write('\n') - gallery.write(f' \n') - gallery.write('\n') - -gallery.write(""" - -""") diff --git a/build/swiftshader/patch_00.diff b/build/swiftshader/patch_00.diff deleted file mode 100644 index fbdfd646991..00000000000 --- a/build/swiftshader/patch_00.diff +++ /dev/null @@ -1,62 +0,0 @@ -diff --git a/src/Vulkan/VkPipeline.cpp b/src/Vulkan/VkPipeline.cpp -index 86913ec72..3b35345af 100644 ---- a/src/Vulkan/VkPipeline.cpp -+++ b/src/Vulkan/VkPipeline.cpp -@@ -71,7 +71,56 @@ std::vector preprocessSpirv( - if(optimize) - { - // Full optimization list taken from spirv-opt. -- opt.RegisterPerformancePasses(); -+ -+ // We have removed CreateRedundancyEliminationPass because it segfaults when encountering: -+ // %389 = OpCompositeConstruct %7 %386 %387 %388 %86 -+ // When inserting an entry into instruction_to_value_ (which is an unordered_map) -+ // This could perhaps be investigated further with help from asan. -+ -+ using namespace spvtools; -+ opt.RegisterPass(CreateWrapOpKillPass()) -+ .RegisterPass(CreateDeadBranchElimPass()) -+ .RegisterPass(CreateMergeReturnPass()) -+ .RegisterPass(CreateInlineExhaustivePass()) -+ .RegisterPass(CreateAggressiveDCEPass()) -+ .RegisterPass(CreatePrivateToLocalPass()) -+ .RegisterPass(CreateLocalSingleBlockLoadStoreElimPass()) -+ .RegisterPass(CreateLocalSingleStoreElimPass()) -+ .RegisterPass(CreateAggressiveDCEPass()) -+ .RegisterPass(CreateScalarReplacementPass()) -+ .RegisterPass(CreateLocalAccessChainConvertPass()) -+ .RegisterPass(CreateLocalSingleBlockLoadStoreElimPass()) -+ .RegisterPass(CreateLocalSingleStoreElimPass()) -+ .RegisterPass(CreateAggressiveDCEPass()) -+ .RegisterPass(CreateLocalMultiStoreElimPass()) -+ .RegisterPass(CreateAggressiveDCEPass()) -+ .RegisterPass(CreateCCPPass()) -+ .RegisterPass(CreateAggressiveDCEPass()) -+ .RegisterPass(CreateLoopUnrollPass(true)) -+ .RegisterPass(CreateDeadBranchElimPass()) -+ .RegisterPass(CreateRedundancyEliminationPass()) // workaround for SEGFAULT -+ .RegisterPass(CreateCombineAccessChainsPass()) -+ .RegisterPass(CreateSimplificationPass()) -+ .RegisterPass(CreateScalarReplacementPass()) -+ .RegisterPass(CreateLocalAccessChainConvertPass()) -+ .RegisterPass(CreateLocalSingleBlockLoadStoreElimPass()) -+ .RegisterPass(CreateLocalSingleStoreElimPass()) -+ .RegisterPass(CreateAggressiveDCEPass()) -+ .RegisterPass(CreateSSARewritePass()) -+ .RegisterPass(CreateAggressiveDCEPass()) -+ .RegisterPass(CreateVectorDCEPass()) -+ .RegisterPass(CreateDeadInsertElimPass()) -+ .RegisterPass(CreateDeadBranchElimPass()) -+ .RegisterPass(CreateSimplificationPass()) -+ .RegisterPass(CreateIfConversionPass()) -+ .RegisterPass(CreateCopyPropagateArraysPass()) -+ .RegisterPass(CreateReduceLoadSizePass()) -+ .RegisterPass(CreateAggressiveDCEPass()) -+ .RegisterPass(CreateBlockMergePass()) -+ .RegisterPass(CreateRedundancyEliminationPass()) // workaround for SEGFAULT -+ .RegisterPass(CreateDeadBranchElimPass()) -+ .RegisterPass(CreateBlockMergePass()) -+ .RegisterPass(CreateSimplificationPass()); - } - - std::vector optimized; diff --git a/build/swiftshader/test.sh b/build/swiftshader/test.sh deleted file mode 100755 index 47320e217f5..00000000000 --- a/build/swiftshader/test.sh +++ /dev/null @@ -1,127 +0,0 @@ -#!/bin/bash -set -e - -function print_help { - local self_name=$(basename "$0") - echo "This script issues docker commands for testing Filament with SwiftShader." - echo "The usual sequence of commands is: fetch, start, build filament release, and run." - echo "" - echo "Usage:" - echo " $self_name [command]" - echo "" - echo "Commands:" - echo " build filament [debug | release]" - echo " Use the container to build Filament." - echo " build swiftshader [debug | release]" - echo " Use the container to do a clean rebuild of SwiftShader." - echo " (Note that the container already has SwiftShader built.)" - echo " fetch" - echo " Download the docker image from the central repository." - echo " help" - echo " Print this help message." - echo " logs" - echo " Print messages from the container's kernel ring buffer." - echo " This is useful for diagnosing OOM issues." - echo " run [lldb]" - echo " Launch a test inside the container, optionally via lldb." - echo " shell" - echo " Interact with a bash prompt in the container." - echo " start" - echo " Start a container from the image." - echo " stop" - echo " Stop the container." - echo "" -} - -# Change the current working directory to the Filament root. -pushd "$(dirname "$0")/../.." > /dev/null - -if [[ "$1" == "build" ]] && [[ "$2" == "filament" ]]; then - docker exec runner filament/build.sh -t $3 gltf_viewer - exit $? -fi - -if [[ "$1" == "build" ]] && [[ "$2" == "swiftshader" ]]; then - BUILD_TYPE="$3" - BUILD_TYPE="$(tr '[:lower:]' '[:upper:]' <<< ${BUILD_TYPE:0:1})${BUILD_TYPE:1}" - docker exec --workdir /trees/swiftshader runner rm -rf build - docker exec --workdir /trees/swiftshader runner mkdir build - docker exec --workdir /trees/swiftshader/build runner cmake -GNinja -DCMAKE_BUILD_TYPE="$BUILD_TYPE" .. - docker exec --workdir /trees/swiftshader/build runner ninja - exit $? -fi - -if [[ "$1" == "fetch" ]]; then - docker pull ghcr.io/filament-assets/swiftshader:latest - docker tag ghcr.io/filament-assets/swiftshader:latest ssfilament - exit $? -fi - -if [[ "$1" == "help" ]]; then - print_help - exit 0 -fi - -if [[ "$1" == "logs" ]]; then - docker exec runner dmesg --human --read-clear - exit $? -fi - -if [[ "$1" == "run" ]] && [[ "$2" == "lldb" ]]; then - docker exec -i --workdir /trees/filament/results runner \ - lldb --batch -o run -o bt -- \ - ../out/cmake-release/samples/gltf_viewer \ - --headless \ - --batch ../libs/viewer/tests/basic.json \ - --api vulkan - docker exec runner /trees/filament/build/swiftshader/gallery.py - exit $? -fi - -if [[ "$1" == "run" ]]; then - docker exec --tty --workdir /trees/filament/results runner \ - /usr/bin/catchsegv \ - ../out/cmake-release/samples/gltf_viewer \ - --headless \ - --batch ../libs/viewer/tests/basic.json \ - --api vulkan - docker exec runner /trees/filament/build/swiftshader/gallery.py - exit $? -fi - -if [[ "$1" == "shell" ]]; then - docker exec --interactive --tty runner /bin/bash - exit $? -fi - -# Notes on options being passed to docker's run command: -# -# - The memory constraint seems to prevent an OOM signal in GitHub Actions. -# - The cap / security args allow use of lldb and creation of core dumps. -# - The privileged arg allows use of dmesg for examining OOM logs. -# -# Currently, a GitHub Actions VM has 2 CPUs, 7 GB RAM, and 14 GB of SSD disk space. -# -# Please be aware that Docker Desktop might impose additional resource constraints, and that those -# settings can only be controlled with its GUI. We recommend at least 7 GB of memory and 2 GB swap. -if [[ "$1" == "start" ]]; then - mkdir -p results - docker run --tty --rm --detach --privileged \ - --memory 6.5g \ - --name runner \ - --cap-add=SYS_PTRACE \ - --security-opt seccomp=unconfined \ - --security-opt apparmor=unconfined \ - --volume `pwd`:/trees/filament \ - --workdir /trees \ - ssfilament - exit $? -fi - -if [[ "$1" == "stop" ]]; then - docker container rm runner --force - exit $? -fi - -print_help -exit 1 diff --git a/build/toolchain-arm7-linux-android.cmake b/build/toolchain-arm7-linux-android.cmake index ce94ab5659c..a3f6036c320 100644 --- a/build/toolchain-arm7-linux-android.cmake +++ b/build/toolchain-arm7-linux-android.cmake @@ -21,7 +21,7 @@ set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_VERSION 1) # android -set(API_LEVEL 19) +set(API_LEVEL 21) # architecture set(ARCH armv7a-linux-androideabi) diff --git a/build/toolchain-x86-linux-android.cmake b/build/toolchain-x86-linux-android.cmake index 88e1b1a79a7..8c50712337f 100644 --- a/build/toolchain-x86-linux-android.cmake +++ b/build/toolchain-x86-linux-android.cmake @@ -21,7 +21,7 @@ set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_VERSION 1) # android -set(API_LEVEL 19) +set(API_LEVEL 21) # architecture set(ARCH i686-linux-android) diff --git a/build/web/ci-common.sh b/build/web/ci-common.sh index f2f1a9cb1d0..e7726a8f7cb 100755 --- a/build/web/ci-common.sh +++ b/build/web/ci-common.sh @@ -1,7 +1,6 @@ #!/bin/bash if [ `uname` == "Linux" ];then - curl -OL https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-linux.zip - unzip -q ninja-linux.zip + source `dirname $0`/../linux/ci-common.sh elif [ `uname` == "Darwin" ];then curl -OL https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-mac.zip unzip -q ninja-mac.zip @@ -13,11 +12,8 @@ fi chmod +x ninja export PATH="$PWD:$PATH" -# FIXME: kokoro machines have node and npm but currently they are symlinked to non-existent files -# npm install -g typescript - # Install emscripten. -curl -L https://github.com/emscripten-core/emsdk/archive/refs/tags/3.1.15.zip > emsdk.zip +curl -L https://github.com/emscripten-core/emsdk/archive/refs/tags/3.1.60.zip > emsdk.zip unzip emsdk.zip ; mv emsdk-* emsdk ; cd emsdk ./emsdk install latest ./emsdk activate latest diff --git a/build/windows/build-github.bat b/build/windows/build-github.bat index 7d41ae27703..24cdd20ea56 100644 --- a/build/windows/build-github.bat +++ b/build/windows/build-github.bat @@ -115,17 +115,23 @@ cmake ..\.. ^ -DFILAMENT_SUPPORTS_VULKAN=ON ^ || exit /b +set build_flags=-j %NUMBER_OF_PROCESSORS% + +@echo on + +:: we've upgraded the windows machines, so the following are no longer accurate as of 09/19/24, but +:: keeping around the comment for record. + :: Attempt to fix "error C1060: compiler is out of heap space" seen on CI. :: Some resource libraries require significant heap space to compile, so first compile them serially. -@echo on -cmake --build . --target filagui --config %config% || exit /b -cmake --build . --target uberarchive --config %config% || exit /b -cmake --build . --target gltf-demo-resources --config %config% || exit /b -cmake --build . --target filamentapp-resources --config %config% || exit /b -cmake --build . --target sample-resources --config %config% || exit /b -cmake --build . --target suzanne-resources --config %config% || exit /b - -cmake --build . %INSTALL% --config %config% -- /m || exit /b +:: cmake --build . --target filagui --config %config% %build_flags% || exit /b +:: cmake --build . --target uberarchive --config %config% %build_flags% || exit /b +:: cmake --build . --target gltf-demo-resources --config %config% %build_flags% || exit /b +:: cmake --build . --target filamentapp-resources --config %config% %build_flags% || exit /b +:: cmake --build . --target sample-resources --config %config% %build_flags% || exit /b +:: cmake --build . --target suzanne-resources --config %config% %build_flags% || exit /b + +cmake --build . %INSTALL% --config %config% %build_flags% -- /m || exit /b @echo off echo Disk info after building variant: %variant% diff --git a/docs/Filament.html b/docs/Filament.html index f72327512a1..cf6f9e71949 100644 --- a/docs/Filament.html +++ b/docs/Filament.html @@ -476,7 +476,7 @@

      -For the specular term, \(f_m\) is a mirror BRDF that can be modeled with the Fresnel law, noted \(F\) in the Cook-Torrance approximation of the microfacet model integration: +For the specular term, \(f_r\) is a mirror BRDF that can be modeled with the Fresnel law, noted \(F\) in the Cook-Torrance approximation of the microfacet model integration:

      @@ -857,7 +857,7 @@ // perceptually linear roughness to roughness (see parameterization) float roughness = perceptualRoughness * perceptualRoughness; - float D = D_GGX(NoH, a); + float D = D_GGX(NoH, roughness); vec3 F = F_Schlick(LoH, f0); float V = V_SmithGGXCorrelated(NoV, NoL, roughness); @@ -3164,7 +3164,7 @@

      However, in practice we're using importance sampling which needs to take the \(pdf\) of the distribution -into account and adds a term \(\frac{\left<\VoH\right>}{D(h_i, \alpha)\left<\NoH\right>}\). +into account and adds a term \(\frac{4\left<\VoH\right>}{D(h_i, \alpha)\left<\NoH\right>}\). See Importance Sampling For The IBL section:

      @@ -5274,7 +5274,7 @@

      $$\begin{equation} -p(T_r(x)) = p(x) |J(T_r)| +p(T_r(x)) = p(x) |J(T_r)|^{-1} \end{equation}$$

      @@ -5285,8 +5285,8 @@

      $$\begin{equation}\label{iblPDF} -p(l,v,\Theta) = D(h,\alpha) \left< \NoH \right> |J_{h \rightarrow l}| \\ -|J_{h \rightarrow l}| = \frac{1}{4 \left< \VoH \right>} +p(l,v,\Theta) = D(h,\alpha) \left< \NoH \right> |J_{h \rightarrow l}|^{-1} \\ +|J_{h \rightarrow l}| = 4 \left< \VoH \right> \end{equation}$$

      @@ -5776,7 +5776,7 @@ $$\begin{align*} C^0_l &= 2\pi \int_0^{\pi} \left< cos \theta \right> y^0_l(\theta) sin \theta d\theta \\ -C^0_l &= 2\pi K^)_l \int_0^{\frac{\pi}{2}} P^0_l(cos \theta) cos \theta sin \theta d\theta \\ +C^0_l &= 2\pi K^m_l \int_0^{\frac{\pi}{2}} P^0_l(cos \theta) cos \theta sin \theta d\theta \\ C^m_l &= 0, m != 0 \end{align*}$$ diff --git a/docs/Filament.md.html b/docs/Filament.md.html index 9a37a5c8321..167f967bd51 100644 --- a/docs/Filament.md.html +++ b/docs/Filament.md.html @@ -200,7 +200,7 @@ ## Specular BRDF -For the specular term, $f_m$ is a mirror BRDF that can be modeled with the Fresnel law, noted $F$ in the Cook-Torrance approximation of the microfacet model integration: +For the specular term, $f_r$ is a mirror BRDF that can be modeled with the Fresnel law, noted $F$ in the Cook-Torrance approximation of the microfacet model integration: $$\begin{equation} f_r(v,l) = \frac{D(h, \alpha) G(v, l, \alpha) F(v, h, f0)}{4(\NoV)(\NoL)} @@ -485,7 +485,7 @@ // perceptually linear roughness to roughness (see parameterization) float roughness = perceptualRoughness * perceptualRoughness; - float D = D_GGX(NoH, a); + float D = D_GGX(NoH, roughness); vec3 F = F_Schlick(LoH, f0); float V = V_SmithGGXCorrelated(NoV, NoL, roughness); @@ -2016,7 +2016,7 @@ \end{equation}$$ However, in practice we're using _importance sampling_ which needs to take the $pdf$ of the distribution -into account and adds a term $\frac{\left<\VoH\right>}{D(h_i, \alpha)\left<\NoH\right>}$. +into account and adds a term $\frac{4\left<\VoH\right>}{D(h_i, \alpha)\left<\NoH\right>}$. See Importance Sampling For The IBL section: $$\begin{equation}\label{iblImportanceSampling} @@ -3486,15 +3486,15 @@ **do not** have the same PDF as $h_i$. The PDF of a transformed distribution is given by: $$\begin{equation} -p(T_r(x)) = p(x) |J(T_r)| +p(T_r(x)) = p(x) |J(T_r)|^{-1} \end{equation}$$ Where $|J(T_r)|$ is the determinant of the Jacobian of the transform. In our case we're considering the transform from $h_i$ to $l_i$ and the determinant of its Jacobian is given in \ref{iblPDF}. $$\begin{equation}\label{iblPDF} -p(l,v,\Theta) = D(h,\alpha) \left< \NoH \right> |J_{h \rightarrow l}| \\ -|J_{h \rightarrow l}| = \frac{1}{4 \left< \VoH \right>} +p(l,v,\Theta) = D(h,\alpha) \left< \NoH \right> |J_{h \rightarrow l}|^{-1} \\ +|J_{h \rightarrow l}| = 4 \left< \VoH \right> \end{equation}$$ ### Choosing important directions diff --git a/docs/Materials.html b/docs/Materials.html index 6fcb8bdb506..339a3b0cae0 100644 --- a/docs/Materials.html +++ b/docs/Materials.html @@ -89,36 +89,39 @@     4.2.2  General: featureLevel
          4.2.3  General: shadingModel
          4.2.4  General: parameters
      -    4.2.5  General: variantFilter
      -    4.2.6  General: flipUV
      -    4.2.7  General: quality
      -    4.2.8  General: instanced
      -    4.2.9  General: vertexDomainDeviceJittered
      -    4.2.10  Vertex and attributes: requires
      -    4.2.11  Vertex and attributes: variables
      -    4.2.12  Vertex and attributes: vertexDomain
      -    4.2.13  Vertex and attributes: interpolation
      -    4.2.14  Blending and transparency: blending
      -    4.2.15  Blending and transparency: postLightingBlending
      -    4.2.16  Blending and transparency: transparency
      -    4.2.17  Blending and transparency: maskThreshold
      -    4.2.18  Blending and transparency: refractionMode
      -    4.2.19  Blending and transparency: refractionType
      -    4.2.20  Rasterization: culling
      -    4.2.21  Rasterization: colorWrite
      -    4.2.22  Rasterization: depthWrite
      -    4.2.23  Rasterization: depthCulling
      -    4.2.24  Rasterization: doubleSided
      -    4.2.25  Lighting: reflections
      -    4.2.26  Lighting: shadowMultiplier
      -    4.2.27  Lighting: transparentShadow
      -    4.2.28  Lighting: clearCoatIorChange
      -    4.2.29  Lighting: multiBounceAmbientOcclusion
      -    4.2.30  Lighting: specularAmbientOcclusion
      -    4.2.31  Anti-aliasing: specularAntiAliasing
      -    4.2.32  Anti-aliasing: specularAntiAliasingVariance
      -    4.2.33  Anti-aliasing: specularAntiAliasingThreshold
      -    4.2.34  Shading: customSurfaceShading
      +    4.2.5  General: constants
      +    4.2.6  General: variantFilter
      +    4.2.7  General: flipUV
      +    4.2.8  General: quality
      +    4.2.9  General: instanced
      +    4.2.10  General: vertexDomainDeviceJittered
      +    4.2.11  Vertex and attributes: requires
      +    4.2.12  Vertex and attributes: variables
      +    4.2.13  Vertex and attributes: vertexDomain
      +    4.2.14  Vertex and attributes: interpolation
      +    4.2.15  Blending and transparency: blending
      +    4.2.16  Blending and transparency: blendFunction
      +    4.2.17  Blending and transparency: postLightingBlending
      +    4.2.18  Blending and transparency: transparency
      +    4.2.19  Blending and transparency: maskThreshold
      +    4.2.20  Blending and transparency: refractionMode
      +    4.2.21  Blending and transparency: refractionType
      +    4.2.22  Rasterization: culling
      +    4.2.23  Rasterization: colorWrite
      +    4.2.24  Rasterization: depthWrite
      +    4.2.25  Rasterization: depthCulling
      +    4.2.26  Rasterization: doubleSided
      +    4.2.27  Rasterization: alphaToCoverage
      +    4.2.28  Lighting: reflections
      +    4.2.29  Lighting: shadowMultiplier
      +    4.2.30  Lighting: transparentShadow
      +    4.2.31  Lighting: clearCoatIorChange
      +    4.2.32  Lighting: multiBounceAmbientOcclusion
      +    4.2.33  Lighting: specularAmbientOcclusion
      +    4.2.34  Anti-aliasing: specularAntiAliasing
      +    4.2.35  Anti-aliasing: specularAntiAliasingVariance
      +    4.2.36  Anti-aliasing: specularAntiAliasingThreshold
      +    4.2.37  Shading: customSurfaceShading
        4.3  Vertex block
          4.3.1  Material vertex inputs
          4.3.2  Custom vertex attributes
      @@ -131,8 +134,9 @@     4.5.2  Math
          4.5.3  Matrices
          4.5.4  Frame constants
      -    4.5.5  Vertex only
      -    4.5.6  Fragment only
      +    4.5.5  Material globals
      +    4.5.6  Vertex only
      +    4.5.7  Fragment only
      Compiling materials
        5.1  Shader validation
        5.2  Flags
      @@ -144,6 +148,9 @@ Handling colors
        6.1  Linear colors
        6.2  Pre-multiplied alpha
      +Sampler usage in Materials
      +  7.1  Feature level 1 and 2
      +  7.2  Feature level 3

         

      About

      @@ -778,7 +785,7 @@ The bentNormal property defines the average unoccluded direction at a point on the surface. It is used to improve the accuracy of indirect lighting. Bent normals can also improve the quality of -specular ambient occlusion (see section 4.2.30 about +specular ambient occlusion (see section 4.2.33 about specularAmbientOcclusion).

      @@ -893,7 +900,7 @@

      The appearance of a refractive material will greatly depend on the refractionType and -refractionMode settings of the material. Refer to section 4.2.19 and section 4.2.18 +refractionMode settings of the material. Refer to section 4.2.21 and section 4.2.20 for more information.

      @@ -1564,13 +1571,69 @@ material.reflectance = materialParams.metallicReflectance.y; } } -   

      General: variantFilter

      +   

      General: constants

      +

      + + +

      Type

      array of constant objects + +

      Value

      Each entry is an object with the properties name and type, both of string type. The name + must be a valid GLSL identifier. Entries also have an optional default, which can either be a + bool or number, depending on the type of the constant. The type must be one of the types + described in table 15. + +

      + + + + +
      Type Description Default
      int A signed, 32 bit GLSL int 0
      float A single-precision GLSL float 0.0
      bool A GLSL bool false
       Table 15: Material constants types
      + +

      + +

      Description

      Lists the constant parameters accepted by your material. These constants can be set, or + “specialized”, at runtime when loading a material package. Multiple materials can be loaded from + the same material package with differing constant parameter specializations. Once a material is + loaded from a material package, its constant parameters cannot be changed. Compared to regular + parameters, constant parameters allow the compiler to generate more efficient code. Access + constant parameters from the shader by prefixing the name with materialConstant_. For example, + a constant parameter named myConstant is accessed in the shader as + materialConstant_myConstant. If a constant parameter is not set at runtime, the default is + used. + +

      material {
      +    constants : [
      +        {
      +           name : overrideAlpha,
      +           type : bool
      +        },
      +        {
      +           name : customAlpha,
      +           type : float,
      +           default : 0.5
      +        }
      +    ],
      +    shadingModel : lit,
      +    blending : transparent,
      +}
      +
      +fragment {
      +    void material(inout MaterialInputs material) {
      +        prepareMaterial(material);
      +        if (materialConstants_overrideAlpha) {
      +            material.baseColor.a = materialConstants_customAlpha;
      +            material.baseColor.rgb *= material.baseColor.a;
      +        }
      +    }
      +}
      +   

      General: variantFilter

      Type

      array of string -

      Value

      Each entry must be any of dynamicLighting, directionalLighting, shadowReceiver,skinning or ssr. +

      Value

      Each entry must be any of dynamicLighting, directionalLighting, shadowReceiver, + skinning, ssr, or stereo.

      Description

      Used to specify a list of shader variants that the application guarantees will never be needed. These shader variants are skipped during the code generation phase, thus reducing @@ -1597,7 +1660,9 @@

    • vsm, used when VSM shadows are enabled and the object is a shadow receiver
    • -
    • ssr, used when screen-space reflections are enabled in the View
    +
  • ssr, used when screen-space reflections are enabled in the View +
  • +
  • stereo, used when stereoscopic rendering is enabled in the View
  • material {
         name : "Invisible shadow plane",
    @@ -1606,7 +1671,7 @@
         blending : transparent,
         variantFilter : [ skinning ]
     }
    -   

    General: flipUV

    +   

    General: flipUV

    @@ -1621,7 +1686,7 @@

    material {
         flipUV : false
     }
    -   

    General: quality

    +   

    General: quality

    @@ -1637,7 +1702,7 @@

    material {
         quality : default
     }
    -   

    General: instanced

    +   

    General: instanced

    @@ -1654,7 +1719,7 @@

    material {
         instanced : true
     }
    -   

    General: vertexDomainDeviceJittered

    +   

    General: vertexDomainDeviceJittered

    @@ -1673,7 +1738,7 @@

    material {
         vertexDomainDeviceJittered : true
     }
    -   

    Vertex and attributes: requires

    +   

    Vertex and attributes: requires

    @@ -1708,7 +1773,7 @@ material.baseColor.rgb *= getCustom0().rgb; } } -   

    Vertex and attributes: variables

    +   

    Vertex and attributes: variables

    @@ -1722,7 +1787,12 @@ declare a variable called eyeDirection you can access it in the fragment shader using variable_eyeDirection. In the vertex shader, the interpolant name is simply a member of the MaterialVertexInputs structure (material.eyeDirection in your example). Each - interpolant is of type float4 (vec4) in the shaders. + interpolant is of type float4 (vec4) in the shaders. By default the precision of the + interpolant is highp in both the vertex and fragment shaders. + An alternate syntax can be used to specify both the name and precision of the interpolant. + In this case the specified precision is used as-is in both fragment and vertex stages, in + particular if default is specified the default precision is used is the fragment shader + (mediump) and in the vertex shader (highp).

    material {
         name : Skybox,
    @@ -1733,7 +1803,11 @@
             }
         ],
         variables : [
    -         eyeDirection
    +         eyeDirection,
    +         {
    +            name : eyeColor,
    +            precision : medium
    +         }
         ],
         vertexDomain : device,
         depthWrite : false,
    @@ -1755,7 +1829,7 @@
             material.eyeDirection.xyz = mulMat3x3Float3(getWorldFromViewMatrix(), u);
         }
     }
    -   

    Vertex and attributes: vertexDomain

    +   

    Vertex and attributes: vertexDomain

    @@ -1784,7 +1858,7 @@

    material {
         vertexDomain : device
     }
    -   

    Vertex and attributes: interpolation

    +   

    Vertex and attributes: interpolation

    @@ -1800,13 +1874,13 @@

    material {
         interpolation : flat
     }
    -   

    Blending and transparency: blending

    +   

    Blending and transparency: blending

    Type

    string -

    Value

    Any of opaque, transparent, fade, add, masked, multiply, screen. Defaults to opaque. +

    Value

    Any of opaque, transparent, fade, add, masked, multiply, screen, custom. Defaults to opaque.

    Description

    Defines how/if the rendered object is blended with the content of the render target. The possible blending modes are: @@ -1836,12 +1910,44 @@

  • Masked: blending is disabled. This blending mode enables alpha masking. The alpha channel of the material's output defines whether a fragment is discarded or not. Additionally, ALPHA_TO_COVERAGE is enabled for non-translucent views. See the maskThreshold section for more - information.
  • + information. + +
  • Custom: blending is enabled. But the blending function is user specified. See blendFunction.
  • -

    material {
    +

    When blending is set to masked, alpha to coverage is automatically enabled for the material. + If this behavior is undesirable, refer to the Rasterization: alphaToCoverage section to turn + alpha to coverage off using the alphaToCoverage property.
    + +

    material {
         blending : transparent
     }
    -   

    Blending and transparency: postLightingBlending

    +   

    Blending and transparency: blendFunction

    +

    + + +

    Type

    object + +

    Fields

    srcRGB, srcA, dstRGB, dstA + +

    Description

    - srcRGB: source function applied to the RGB channels + - srcA: source function applied to the alpha channel + - srcRGB: destination function applied to the RGB channels + - srcRGB: destination function applied to the alpha channel + The values possible for each functions are one of zero, one, srcColor, oneMinusSrcColor, + dstColor, oneMinusDstColor, srcAlpha, oneMinusSrcAlpha, dstAlpha, + oneMinusDstAlpha, srcAlphaSaturate + +

    material {
    +    blending : custom,
    +    blendFunction :
    +    {
    +        srcRGB: one,
    +        srcA: one,
    +        dstRGB: oneMinusSrcColor,
    +        dstA: oneMinusSrcAlpha
    +    }
    + }
    +   

    Blending and transparency: postLightingBlending

    @@ -1871,7 +1977,7 @@

    material {
         postLightingBlending : add
     }
    -   

    Blending and transparency: transparency

    +   

    Blending and transparency: transparency

    @@ -1918,7 +2024,7 @@ and sorting issues are minimized or eliminated

    -   

    Blending and transparency: maskThreshold

    +   

    Blending and transparency: maskThreshold

    @@ -1935,7 +2041,7 @@ blending : masked, maskThreshold : 0.5 }

    -   

    Blending and transparency: refractionMode

    +   

    Blending and transparency: refractionMode

    @@ -1956,7 +2062,7 @@

    material {
         refractionMode : cubemap,
     }
    -   

    Blending and transparency: refractionType

    +   

    Blending and transparency: refractionType

    @@ -1975,7 +2081,7 @@ refractionMode : cubemap, refractionType : thin, } -   

    Rasterization: culling

    +   

    Rasterization: culling

    @@ -1989,7 +2095,7 @@

    material {
         culling : none
     }
    -   

    Rasterization: colorWrite

    +   

    Rasterization: colorWrite

    @@ -2002,7 +2108,7 @@

    material {
         colorWrite : false
     }
    -   

    Rasterization: depthWrite

    +   

    Rasterization: depthWrite

    @@ -2015,7 +2121,7 @@

    material {
         depthWrite : false
     }
    -   

    Rasterization: depthCulling

    +   

    Rasterization: depthCulling

    @@ -2029,7 +2135,7 @@

    material {
         depthCulling : false
     }
    -   

    Rasterization: doubleSided

    +   

    Rasterization: doubleSided

    @@ -2054,7 +2160,34 @@ material.baseColor = materialParams.albedo; } } -   

    Lighting: reflections

    +   

    Rasterization: alphaToCoverage

    +

    + + +

    Type

    boolean + +

    Value

    true or false. Defaults to false. + +

    Description

    Enables or disables alpha to coverage. When alpha to coverage is enabled, the coverage of + fragment is derived from its alpha. This property is only meaningful when MSAA is enabled. + Note: setting blending to masked automatically enables alpha to coverage. If this is not + desired, you can override this behavior by setting alpha to coverage to false as in the + example below. + +

    material {
    +    name : "Alpha to coverage",
    +    shadingModel : lit,
    +    blending : masked,
    +    alphaToCoverage : false
    +}
    +
    +fragment {
    +    void material(inout MaterialInputs material) {
    +        prepareMaterial(material);
    +        material.baseColor = materialParams.albedo;
    +    }
    +}
    +   

    Lighting: reflections

    @@ -2071,7 +2204,7 @@ name : "Glossy metal", reflections : screenspace } -   

    Lighting: shadowMultiplier

    +   

    Lighting: shadowMultiplier

    @@ -2098,7 +2231,7 @@ material.baseColor = vec4(0.0, 0.0, 0.0, 0.7); } } -   

    Lighting: transparentShadow

    +   

    Lighting: transparentShadow

    @@ -2132,7 +2265,7 @@ by T-Art.

    -   

    Lighting: clearCoatIorChange

    +   

    Lighting: clearCoatIorChange

    @@ -2154,7 +2287,7 @@ (right).

    -   

    Lighting: multiBounceAmbientOcclusion

    +   

    Lighting: multiBounceAmbientOcclusion

    @@ -2183,7 +2316,7 @@ occclusion enabled and disabled.

    -   

    Lighting: specularAmbientOcclusion

    +   

    Lighting: specularAmbientOcclusion

    @@ -2209,7 +2342,7 @@ particularly visible under the hose.

    -   

    Anti-aliasing: specularAntiAliasing

    +   

    Anti-aliasing: specularAntiAliasing

    @@ -2226,7 +2359,7 @@

    material {
         specularAntiAliasing : true
     }
    -   

    Anti-aliasing: specularAntiAliasingVariance

    +   

    Anti-aliasing: specularAntiAliasingVariance

    @@ -2241,7 +2374,7 @@

    material {
         specularAntiAliasingVariance : 0.2
     }
    -   

    Anti-aliasing: specularAntiAliasingThreshold

    +   

    Anti-aliasing: specularAntiAliasingThreshold

    @@ -2255,7 +2388,7 @@

    material {
         specularAntiAliasingThreshold : 0.1
     }
    -   

    Shading: customSurfaceShading

    +   

    Shading: customSurfaceShading

    @@ -2335,8 +2468,9 @@

    To achieve good precision, the worldPosition coordinate in the vertex shader is shifted by the - camera position. To get the true world-space position, users can add this to - getWorldOffset().

    + camera position. To get the true world-space position, users can use + getUserWorldPosition(), however be aware that the true world-position might not + be able to fit in a float or might be represented with severely reduced precision.

    @@ -2707,12 +2841,13 @@

    - - - + + + + - +
    Name Type Description
    getResolution() float4 Dimensions of the view's effective viewport in pixels: width, height, 1 / width, 1 / height. This might be different from View::getViewport() for instance because of added rendering guard-bands. This can be used in conjunction with getNormalizedViewportCoord() to generate pixel coordinates.
    getWorldCameraPosition() float3 Position of the camera/eye in world space
    getWorldOffset() float3 The shift required to obtain API-level world space
    getResolution() float4 Dimensions of the view's effective (physical) viewport in pixels: width, height, 1 / width, 1 / height. This might be different from View::getViewport() for instance because of added rendering guard-bands.
    getWorldCameraPosition() float3 Position of the camera/eye in world space (see note below)
    getWorldOffset() float3 [deprecated] The shift required to obtain API-level world space. Use getUserWorldPosition() instead
    getUserWorldFromWorldMatrix() float4×4 Matrix that converts from world space to API-level (user) world space.
    getTime() float Current time as a remainder of 1 second. Yields a value between 0 and 1
    getUserTime() float4 Current time in seconds: time, (double)time - time, 0, 0
    getUserTimeMode(float m) float Current time modulo m in seconds
    getUserTimeMod(float m) float Current time modulo m in seconds
    getExposure() float Photometric exposure of the camera
    getEV100() float Exposure value at ISO 100 of the camera
    @@ -2725,10 +2860,21 @@ To achieve good precision, the “world space” in Filament's shading system does not necessarily match the API-level world space. To obtain the position of the API-level camera, custom - materials can add getWorldOffset() to getWorldCameraPosition().

    + materials can use getUserWorldFromWorldMatrix() to transform getWorldCameraPosition().

    + +

    +   

    Material globals

    +

    + +

    + + + + +
    Name Type Description
    getMaterialGlobal0() float4 A vec4 visible by all materials, its value is set by View::setMaterialGlobal(0, float4). Its default value is {0,0,0,1}.
    getMaterialGlobal1() float4 A vec4 visible by all materials, its value is set by View::setMaterialGlobal(1, float4). Its default value is {0,0,0,1}.
    getMaterialGlobal2() float4 A vec4 visible by all materials, its value is set by View::setMaterialGlobal(2, float4). Its default value is {0,0,0,1}.
    getMaterialGlobal3() float4 A vec4 visible by all materials, its value is set by View::setMaterialGlobal(3, float4). Its default value is {0,0,0,1}.

    -   

    Vertex only

    +   

    Vertex only

    @@ -2739,10 +2885,11 @@ getWorldFromModelMatrix() float4×4 Matrix that converts from model (object) space to world space getWorldFromModelNormalMatrix() float3×3 Matrix that converts normals from model (object) space to world space getVertexIndex() int Index of the current vertex + getEyeIndex() int Index of the eye being rendered, starting at 0

    -   

    Fragment only

    +   

    Fragment only

    @@ -2750,11 +2897,12 @@

    + - + @@ -2769,12 +2917,13 @@

    -

    world space
    +

    world-space

    - To obtain API-level world space coordinates, custom materials should add getWorldOffset() to - getWorldPosition() (et al).

    + To obtain API-level world-space coordinates, custom materials should use getUserWorldPosition() + or use getUserWorldFromWorldMatrix(). Note that API-level world-space coordinates should + never or rarely be used because they may not fit in a float3 or have severely reduced precision.

    @@ -2814,7 +2963,7 @@

    -The command line flags relevant to application development are described in table 15. +The command line flags relevant to application development are described in table 16.

    Name Type Description
    getWorldTangentFrame() float3×3 Matrix containing in each column the tangent (frame[0]), bi-tangent (frame[1]) and normal (frame[2]) of the vertex in world space. If the material does not compute a tangent space normal for bump mapping or if the shading is not anisotropic, only the normal is valid in this matrix.
    getWorldPosition() float3 Position of the fragment in world space (see note below about world-space)
    getUserWorldPosition() float3 Position of the fragment in API-level (user) world-space (see note below about world-space)
    getWorldViewVector() float3 Normalized vector in world space from the fragment position to the eye
    getWorldNormalVector() float3 Normalized normal in world space, after bump mapping (must be used after prepareMaterial())
    getWorldGeometricNormalVector() float3 Normalized normal in world space, before bump mapping (can be used before prepareMaterial())
    getWorldReflectedVector() float3 Reflection of the view vector about the normal (must be used after prepareMaterial())
    getNormalizedViewportCoord() float3 Normalized viewport position (i.e. NDC coordinates normalized to [0, 1], can be used before prepareMaterial())
    getNormalizedViewportCoord() float3 Normalized user viewport position (i.e. NDC coordinates normalized to [0, 1] for the position, [1, 0] for the depth), can be used before prepareMaterial()). Because the user viewport is smaller than the actual physical viewport, these coordinates can be negative or superior to 1 in the non-visible area of the physical viewport.
    getNdotV() float The result of dot(normal, view), always strictly greater than 0 (must be used after prepareMaterial())
    getColor() float4 Interpolated color of the fragment, if the color attribute is required
    getUV0() float2 First interpolated set of UV coordinates, only available if the uv0 attribute is required
    @@ -2823,7 +2972,7 @@ -
    Flag Value Usage
    -o, —output [path] Specify the output file path
    -S, —optimize-size N/A Optimize compiled material for size instead of just performance
    -r, —reflect parameters Outputs the specified metadata as JSON
    -v, —variant-filter [variant] Filters out the specified, comma-separated variants
     Table 15: List of matc flags
    +
     Table 16: List of matc flags

    @@ -2969,7 +3118,47 @@ Bitmap will be pre-multiplied by default. +

    +   

    Sampler usage in Materials

    +

    + + +The number of usable sampler parameters (e.g.: type is sampler2d) in materials is limited and +depends on the material properties, shading model, feature level and variant filter. + +

    +   

    Feature level 1 and 2

    +

    + + +unlit materials can use up to 12 samplers by default. +

    +lit materials can use up to 9 samplers by default, however if refractionMode or reflectionMode +is set to screenspace that number is reduced to 8. + +

    + +Finally if variantFilter contains the fog filter, an extra sampler is made available, such that +unlit materials can use up to 13 and lit materials up to 10 samplers by default. + +

    +   

    Feature level 3

    +

    + + +16 samplers are available. + +

    + +

    external samplers
    + +

    + + Be aware that external samplers account for 2 regular samplers.

    + +

    +

    formatted by Markdeep 1.13  
    \ No newline at end of file diff --git a/docs/Materials.md.html b/docs/Materials.md.html index 91888aa7755..753e3a6b2f5 100644 --- a/docs/Materials.md.html +++ b/docs/Materials.md.html @@ -1076,13 +1076,71 @@ } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +### General: constants + +Type +: array of constant objects + +Value +: Each entry is an object with the properties `name` and `type`, both of `string` type. The name + must be a valid GLSL identifier. Entries also have an optional `default`, which can either be a + `bool` or `number`, depending on the `type` of the constant. The type must be one of the types + described in table [materialConstantsTypes]. + + Type | Description | Default +:----------------------|:-----------------------------------------|:------------------ +int | A signed, 32 bit GLSL int | 0 +float | A single-precision GLSL float | 0.0 +bool | A GLSL bool | false +[Table [materialConstantsTypes]: Material constants types] + +Description +: Lists the constant parameters accepted by your material. These constants can be set, or + "specialized", at runtime when loading a material package. Multiple materials can be loaded from + the same material package with differing constant parameter specializations. Once a material is + loaded from a material package, its constant parameters cannot be changed. Compared to regular + parameters, constant parameters allow the compiler to generate more efficient code. Access + constant parameters from the shader by prefixing the name with `materialConstant_`. For example, + a constant parameter named `myConstant` is accessed in the shader as + `materialConstant_myConstant`. If a constant parameter is not set at runtime, the default is + used. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + constants : [ + { + name : overrideAlpha, + type : bool + }, + { + name : customAlpha, + type : float, + default : 0.5 + } + ], + shadingModel : lit, + blending : transparent, +} + +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + if (materialConstants_overrideAlpha) { + material.baseColor.a = materialConstants_customAlpha; + material.baseColor.rgb *= material.baseColor.a; + } + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ### General: variantFilter Type : array of `string` Value -: Each entry must be any of `dynamicLighting`, `directionalLighting`, `shadowReceiver`,`skinning` or `ssr`. +: Each entry must be any of `dynamicLighting`, `directionalLighting`, `shadowReceiver`, + `skinning`, `ssr`, or `stereo`. Description : Used to specify a list of shader variants that the application guarantees will never be @@ -1101,6 +1159,7 @@ - `fog`, used when global fog is applied to the scene - `vsm`, used when VSM shadows are enabled and the object is a shadow receiver - `ssr`, used when screen-space reflections are enabled in the View +- `stereo`, used when stereoscopic rendering is enabled in the View ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON material { @@ -1249,7 +1308,12 @@ declare a variable called `eyeDirection` you can access it in the fragment shader using `variable_eyeDirection`. In the vertex shader, the interpolant name is simply a member of the `MaterialVertexInputs` structure (`material.eyeDirection` in your example). Each - interpolant is of type `float4` (`vec4`) in the shaders. + interpolant is of type `float4` (`vec4`) in the shaders. By default the precision of the + interpolant is `highp` in *both* the vertex and fragment shaders. + An alternate syntax can be used to specify both the name and precision of the interpolant. + In this case the specified precision is used as-is in both fragment and vertex stages, in + particular if `default` is specified the default precision is used is the fragment shader + (`mediump`) and in the vertex shader (`highp`). ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON material { @@ -1261,7 +1325,11 @@ } ], variables : [ - eyeDirection + eyeDirection, + { + name : eyeColor, + precision : medium + } ], vertexDomain : device, depthWrite : false, @@ -1338,7 +1406,7 @@ : `string` Value -: Any of `opaque`, `transparent`, `fade`, `add`, `masked`, `multiply`, `screen`. Defaults to `opaque`. +: Any of `opaque`, `transparent`, `fade`, `add`, `masked`, `multiply`, `screen`, `custom`. Defaults to `opaque`. Description : Defines how/if the rendered object is blended with the content of the render target. @@ -1361,6 +1429,12 @@ of the material's output defines whether a fragment is discarded or not. Additionally, ALPHA_TO_COVERAGE is enabled for non-translucent views. See the maskThreshold section for more information. + - **Custom**: blending is enabled. But the blending function is user specified. See `blendFunction`. + +!!! Note + When `blending` is set to `masked`, alpha to coverage is automatically enabled for the material. + If this behavior is undesirable, refer to the Rasterization: alphaToCoverage section to turn + alpha to coverage off using the `alphaToCoverage` property. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON material { @@ -1368,6 +1442,36 @@ } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +### Blending and transparency: blendFunction + +Type +: `object` + +Fields +: `srcRGB`, `srcA`, `dstRGB`, `dstA` + +Description +: - *srcRGB*: source function applied to the RGB channels + - *srcA*: source function applied to the alpha channel + - *srcRGB*: destination function applied to the RGB channels + - *srcRGB*: destination function applied to the alpha channel + The values possible for each functions are one of `zero`, `one`, `srcColor`, `oneMinusSrcColor`, + `dstColor`, `oneMinusDstColor`, `srcAlpha`, `oneMinusSrcAlpha`, `dstAlpha`, + `oneMinusDstAlpha`, `srcAlphaSaturate` + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + blending : custom, + blendFunction : + { + srcRGB: one, + srcA: one, + dstRGB: oneMinusSrcColor, + dstA: oneMinusSrcAlpha + } + } +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ### Blending and transparency: postLightingBlending Type @@ -1602,6 +1706,37 @@ } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +### Rasterization: alphaToCoverage + +Type +: `boolean` + +Value +: `true` or `false`. Defaults to `false`. + +Description +: Enables or disables alpha to coverage. When alpha to coverage is enabled, the coverage of + fragment is derived from its alpha. This property is only meaningful when MSAA is enabled. + Note: setting `blending` to `masked` automatically enables alpha to coverage. If this is not + desired, you can override this behavior by setting alpha to coverage to false as in the + example below. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + name : "Alpha to coverage", + shadingModel : lit, + blending : masked, + alphaToCoverage : false +} + +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + material.baseColor = materialParams.albedo; + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ### Lighting: reflections Type @@ -1910,8 +2045,9 @@ !!! TIP: worldPosition To achieve good precision, the `worldPosition` coordinate in the vertex shader is shifted by the - camera position. To get the true world-space position, users can add this to - `getWorldOffset()`. + camera position. To get the true world-space position, users can use + `getUserWorldPosition()`, however be aware that the true world-position might not + be able to fit in a `float` or might be represented with severely reduced precision. !!! TIP: UV attributes By default the vertex shader of a material will flip the Y coordinate of the UV attributes @@ -2264,18 +2400,28 @@ Name | Type | Description :-----------------------------------|:--------:|:------------------------------------ **getResolution()** | float4 | Dimensions of the view's effective (physical) viewport in pixels: `width`, `height`, `1 / width`, `1 / height`. This might be different from `View::getViewport()` for instance because of added rendering guard-bands. -**getWorldCameraPosition()** | float3 | Position of the camera/eye in world space -**getWorldOffset()** | float3 | The shift required to obtain API-level world space +**getWorldCameraPosition()** | float3 | Position of the camera/eye in world space (see note below) +**getWorldOffset()** | float3 | [deprecated] The shift required to obtain API-level world space. Use getUserWorldPosition() instead +**getUserWorldFromWorldMatrix()** | float4x4 | Matrix that converts from world space to API-level (user) world space. **getTime()** | float | Current time as a remainder of 1 second. Yields a value between 0 and 1 **getUserTime()** | float4 | Current time in seconds: `time`, `(double)time - time`, `0`, `0` -**getUserTimeMode(float m)** | float | Current time modulo m in seconds +**getUserTimeMod(float m)** | float | Current time modulo m in seconds **getExposure()** | float | Photometric exposure of the camera **getEV100()** | float | [Exposure value at ISO 100](https://en.wikipedia.org/wiki/Exposure_value) of the camera !!! TIP: world space To achieve good precision, the "world space" in Filament's shading system does not necessarily match the API-level world space. To obtain the position of the API-level camera, custom - materials can add `getWorldOffset()` to `getWorldCameraPosition()`. + materials can use `getUserWorldFromWorldMatrix()` to transform `getWorldCameraPosition()`. + +### Material globals + + Name | Type | Description +:-----------------------------------|:--------:|:------------------------------------ +**getMaterialGlobal0()** | float4 | A vec4 visible by all materials, its value is set by `View::setMaterialGlobal(0, float4)`. Its default value is {0,0,0,1}. +**getMaterialGlobal1()** | float4 | A vec4 visible by all materials, its value is set by `View::setMaterialGlobal(1, float4)`. Its default value is {0,0,0,1}. +**getMaterialGlobal2()** | float4 | A vec4 visible by all materials, its value is set by `View::setMaterialGlobal(2, float4)`. Its default value is {0,0,0,1}. +**getMaterialGlobal3()** | float4 | A vec4 visible by all materials, its value is set by `View::setMaterialGlobal(3, float4)`. Its default value is {0,0,0,1}. ### Vertex only @@ -2288,6 +2434,7 @@ **getWorldFromModelMatrix()** | float4x4 | Matrix that converts from model (object) space to world space **getWorldFromModelNormalMatrix()** | float3x3 | Matrix that converts normals from model (object) space to world space **getVertexIndex()** | int | Index of the current vertex +**getEyeIndex()** | int | Index of the eye being rendered, starting at 0 ### Fragment only @@ -2297,6 +2444,7 @@ :---------------------------------------|:--------:|:------------------------------------ **getWorldTangentFrame()** | float3x3 | Matrix containing in each column the `tangent` (`frame[0]`), `bi-tangent` (`frame[1]`) and `normal` (`frame[2]`) of the vertex in world space. If the material does not compute a tangent space normal for bump mapping or if the shading is not anisotropic, only the `normal` is valid in this matrix. **getWorldPosition()** | float3 | Position of the fragment in world space (see note below about world-space) +**getUserWorldPosition()** | float3 | Position of the fragment in API-level (user) world-space (see note below about world-space) **getWorldViewVector()** | float3 | Normalized vector in world space from the fragment position to the eye **getWorldNormalVector()** | float3 | Normalized normal in world space, after bump mapping (must be used after `prepareMaterial()`) **getWorldGeometricNormalVector()** | float3 | Normalized normal in world space, before bump mapping (can be used before `prepareMaterial()`) @@ -2313,9 +2461,10 @@ **ycbcrToRgb(float, float2)** | float3 | Converts a luminance and CbCr pair to a sRGB color **uvToRenderTargetUV(float2)** | float2 | Transforms a UV coordinate to allow sampling from a `RenderTarget` attachment -!!! TIP: world space - To obtain API-level world space coordinates, custom materials should add `getWorldOffset()` to - `getWorldPosition()` (et al). +!!! TIP: world-space + To obtain API-level world-space coordinates, custom materials should use `getUserWorldPosition()` + or use `getUserWorldFromWorldMatrix()`. Note that API-level world-space coordinates should + never or rarely be used because they may not fit in a float3 or have severely reduced precision. !!! TIP: sampling from render targets When sampling from a `filament::Texture` that is attached to a `filament::RenderTarget` for @@ -2487,4 +2636,26 @@ [Bitmap](https://developer.android.com/reference/android/graphics/Bitmap.html) will be pre-multiplied by default. +# Sampler usage in Materials + +The number of usable sampler parameters (e.g.: type is `sampler2d`) in materials is limited and +depends on the material properties, shading model, feature level and variant filter. + +## Feature level 1 and 2 + +`unlit` materials can use up to 12 samplers by default. + +`lit` materials can use up to 9 samplers by default, however if `refractionMode` or `reflectionMode` +is set to `screenspace` that number is reduced to 8. + +Finally if `variantFilter` contains the `fog` filter, an extra sampler is made available, such that +`unlit` materials can use up to 13 and `lit` materials up to 10 samplers by default. + +## Feature level 3 + +16 samplers are available. + +!!! TIP: external samplers + Be aware that `external` samplers account for 2 regular samplers. + diff --git a/docs/remote/filament.js b/docs/remote/filament.js index 024e3e9e6d8..8465e47b9cf 100644 --- a/docs/remote/filament.js +++ b/docs/remote/filament.js @@ -6,7 +6,7 @@ var Filament = (() => { function(Filament) { Filament = Filament || {}; -var Module=typeof Filament!="undefined"?Filament:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}var fs;var nodePath;var requireNodeFS;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}requireNodeFS=()=>{if(!nodePath){fs=require("fs");nodePath=require("path")}};read_=function shell_read(filename,binary){requireNodeFS();filename=nodePath["normalize"](filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{requireNodeFS();filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",function(reason){throw reason});quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var tempRet0=0;var setTempRet0=value=>{tempRet0=value};var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf-16le"):undefined;function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder){return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr))}else{var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="filament.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["Zb"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["$b"];addOnInit(Module["asm"]["_b"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}var tempDouble;var tempI64;var ASM_CONSTS={1005868:()=>{const options=window.filament_glOptions;const context=window.filament_glContext;const handle=GL.registerContext(context,options);window.filament_contextHandle=handle;GL.makeContextCurrent(handle)},1006082:()=>{const handle=window.filament_contextHandle;GL.makeContextCurrent(handle)},1006163:($0,$1,$2,$3,$4,$5)=>{const fn=Emval.toValue($0);fn({"renderable":Emval.toValue($1),"depth":$2,"fragCoords":[$3,$4,$5]})}};function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return function(){return crypto_module["randomBytes"](1)[0]}}catch(e){}}return function(){abort("randomDevice")}}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){abort()}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{path=PATH_FS.resolve(FS.cwd(),path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(p=>!!p),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get:function(){return this.shared.position},set:function(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>{return parent.node_ops.lookup(parent,name)},mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;for(var i=0;i{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{return null}},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node},createPreloadedFile:(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(Browser.handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=()=>{out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=()=>{ok++;if(ok+fail==total)finish()};putRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(8);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}var tupleRegistrations={};function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAP32[pointer>>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}return name}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i{if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push(()=>{typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}});if(0===unregisteredTypes.length){onComplete(typeConverters)}}function __embind_finalize_value_array(rawTupleType){var reg=tupleRegistrations[rawTupleType];delete tupleRegistrations[rawTupleType];var elements=reg.elements;var elementsLength=elements.length;var elementTypes=elements.map(function(elt){return elt.getterReturnType}).concat(elements.map(function(elt){return elt.setterArgumentType}));var rawConstructor=reg.rawConstructor;var rawDestructor=reg.rawDestructor;whenDependentTypesAreResolved([rawTupleType],elementTypes,function(elementTypes){elements.forEach((elt,i)=>{var getterReturnType=elementTypes[i];var getter=elt.getter;var getterContext=elt.getterContext;var setterArgumentType=elementTypes[i+elementsLength];var setter=elt.setter;var setterContext=elt.setterContext;elt.read=ptr=>{return getterReturnType["fromWireType"](getter(getterContext,ptr))};elt.write=(ptr,o)=>{var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,o));runDestructors(destructors)}});return[{name:reg.name,"fromWireType":function(ptr){var rv=new Array(elementsLength);for(var i=0;ifield.getterReturnType).concat(fieldRecords.map(field=>field.setterArgumentType));whenDependentTypesAreResolved([structType],fieldTypes,fieldTypes=>{var fields={};fieldRecords.forEach((field,i)=>{var fieldName=field.fieldName;var getterReturnType=fieldTypes[i];var getter=field.getter;var getterContext=field.getterContext;var setterArgumentType=fieldTypes[i+fieldRecords.length];var setter=field.setter;var setterContext=field.setterContext;fields[fieldName]={read:ptr=>{return getterReturnType["fromWireType"](getter(getterContext,ptr))},write:(ptr,o)=>{var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,o));runDestructors(destructors)}}});return[{name:reg.name,"fromWireType":function(ptr){var rv={};for(var i in fields){rv[i]=fields[i].read(ptr)}rawDestructor(ptr);return rv},"toWireType":function(destructors,o){for(var fieldName in fields){if(!(fieldName in o)){throw new TypeError('Missing field: "'+fieldName+'"')}}var ptr=rawConstructor();for(fieldName in fields){fields[fieldName].write(ptr,o[fieldName])}if(destructors!==null){destructors.push(rawDestructor,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:rawDestructor}]})}function __embind_register_bigint(primitiveType,name,size,minRange,maxRange){}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}function registerType(rawType,registeredInstance,options={}){if(!("argPackAdvance"in registeredInstance)){throw new TypeError("registerType registeredInstance requires argPackAdvance")}var name=registeredInstance.name;if(!rawType){throwBindingError('type "'+name+'" must have a positive integer typeid pointer')}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError("Cannot register type '"+name+"' twice")}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(cb=>cb())}}function __embind_register_bool(rawType,name,size,trueValue,falseValue){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(wt){return!!wt},"toWireType":function(destructors,o){return o?trueValue:falseValue},"argPackAdvance":8,"readValueFromPointer":function(pointer){var heap;if(size===1){heap=HEAP8}else if(size===2){heap=HEAP16}else if(size===4){heap=HEAP32}else{throw new TypeError("Unknown boolean type size: "+name)}return this["fromWireType"](heap[pointer>>shift])},destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}var finalizationRegistry=false;function detachFinalizer(handle){}function runDestructor($$){if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function releaseClassHandle($$){$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}var registeredPointers={};function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}var delayFunction=undefined;function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record}}))}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function attachFinalizer(handle){if("undefined"===typeof FinalizationRegistry){attachFinalizer=handle=>handle;return handle}finalizationRegistry=new FinalizationRegistry(info=>{releaseClassHandle(info.$$)});attachFinalizer=handle=>{var $$=handle.$$;var hasSmartPtr=!!$$.smartPtr;if(hasSmartPtr){var info={$$:$$};finalizationRegistry.register(handle,info,handle)}return handle};detachFinalizer=handle=>finalizationRegistry.unregister(handle);return attachFinalizer(handle)}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+embindRepr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+embindRepr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,Emval.toHandle(function(){clonedHandle["delete"]()}));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+embindRepr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function dynCall(sig,ptr,args){if(sig.includes("j")){return dynCallLegacy(sig,ptr,args)}var rtn=getWasmTableEntry(ptr).apply(null,args);return rtn}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=0;Object.assign(argCache,arguments);return dynCall(sig,ptr,argCache)}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(){if(signature.includes("j")){return getDynCaller(signature,rawFunction)}return getWasmTableEntry(rawFunction)}var fp=makeDynCaller();if(typeof fp!="function"){throwBindingError("unknown function pointer with signature "+signature+": "+rawFunction)}return fp}var UnboundTypeError=undefined;function getTypeName(type){var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv}function throwUnboundTypeError(message,types){var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(message+": "+unboundTypes.map(getTypeName).join([", "]))}function __embind_register_class(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor){name=readLatin1String(name);getActualType=embind__requireFunction(getActualTypeSignature,getActualType);if(upcast){upcast=embind__requireFunction(upcastSignature,upcast)}if(downcast){downcast=embind__requireFunction(downcastSignature,downcast)}rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,function(){throwUnboundTypeError("Cannot construct "+name+" due to unbound types",[baseClassRawType])});whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],function(base){base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype}else{basePrototype=ClassHandle.prototype}var constructor=createNamedFunction(legalFunctionName,function(){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError("Use 'new' to construct "+name)}if(undefined===registeredClass.constructor_body){throw new BindingError(name+" has no accessible constructor")}var body=registeredClass.constructor_body[arguments.length];if(undefined===body){throw new BindingError("Tried to invoke ctor of "+name+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(registeredClass.constructor_body).toString()+") parameters instead!")}return body.apply(this,arguments)});var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+"*",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+" const*",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return[referenceConverter,pointerConverter,constPointerConverter]})}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i>2])}return array}function __embind_register_class_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,fn){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=classType.name+"."+methodName;function unboundTypesHandler(){throwUnboundTypeError("Cannot call "+humanName+" due to unbound types",rawArgTypes)}if(methodName.startsWith("@@")){methodName=Symbol[methodName.substring(2)]}var proto=classType.registeredClass.constructor;if(undefined===proto[methodName]){unboundTypesHandler.argCount=argCount-1;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-1]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));var func=craftInvokerFunction(humanName,invokerArgsArray,null,rawInvoker,fn);if(undefined===proto[methodName].overloadTable){func.argCount=argCount-1;proto[methodName]=func}else{proto[methodName].overloadTable[argCount-1]=func}return[]});return[]})}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){assert(argCount>0);var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=()=>{throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){argTypes.splice(1,0,null);classType.registeredClass.constructor_body[argCount-1]=craftInvokerFunction(humanName,argTypes,null,invoker,rawConstructor);return[]});return[]})}function __embind_register_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,context,isPureVirtual){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=classType.name+"."+methodName;if(methodName.startsWith("@@")){methodName=Symbol[methodName.substring(2)]}if(isPureVirtual){classType.registeredClass.pureVirtualFunctions.push(methodName)}function unboundTypesHandler(){throwUnboundTypeError("Cannot call "+humanName+" due to unbound types",rawArgTypes)}var proto=classType.registeredClass.instancePrototype;var method=proto[methodName];if(undefined===method||undefined===method.overloadTable&&method.className!==classType.name&&method.argCount===argCount-2){unboundTypesHandler.argCount=argCount-2;unboundTypesHandler.className=classType.name;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-2]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){var memberFunction=craftInvokerFunction(humanName,argTypes,classType,rawInvoker,context);if(undefined===proto[methodName].overloadTable){memberFunction.argCount=argCount-2;proto[methodName]=memberFunction}else{proto[methodName].overloadTable[argCount-2]=memberFunction}return[]});return[]})}function validateThis(this_,classType,humanName){if(!(this_ instanceof Object)){throwBindingError(humanName+' with invalid "this": '+this_)}if(!(this_ instanceof classType.registeredClass.constructor)){throwBindingError(humanName+' incompatible with "this" of type '+this_.constructor.name)}if(!this_.$$.ptr){throwBindingError("cannot call emscripten binding method "+humanName+" on deleted object")}return upcastPointer(this_.$$.ptr,this_.$$.ptrType.registeredClass,classType.registeredClass)}function __embind_register_class_property(classType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext){fieldName=readLatin1String(fieldName);getter=embind__requireFunction(getterSignature,getter);whenDependentTypesAreResolved([],[classType],function(classType){classType=classType[0];var humanName=classType.name+"."+fieldName;var desc={get:function(){throwUnboundTypeError("Cannot access "+humanName+" due to unbound types",[getterReturnType,setterArgumentType])},enumerable:true,configurable:true};if(setter){desc.set=()=>{throwUnboundTypeError("Cannot access "+humanName+" due to unbound types",[getterReturnType,setterArgumentType])}}else{desc.set=v=>{throwBindingError(humanName+" is a read-only property")}}Object.defineProperty(classType.registeredClass.instancePrototype,fieldName,desc);whenDependentTypesAreResolved([],setter?[getterReturnType,setterArgumentType]:[getterReturnType],function(types){var getterReturnType=types[0];var desc={get:function(){var ptr=validateThis(this,classType,humanName+" getter");return getterReturnType["fromWireType"](getter(getterContext,ptr))},enumerable:true};if(setter){setter=embind__requireFunction(setterSignature,setter);var setterArgumentType=types[1];desc.set=function(v){var ptr=validateThis(this,classType,humanName+" setter");var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,v));runDestructors(destructors)}}Object.defineProperty(classType.registeredClass.instancePrototype,fieldName,desc);return[]});return[]})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i{if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value},toHandle:value=>{switch(value){case undefined:return 1;case null:return 2;case true:return 3;case false:return 4;default:{var handle=emval_free_list.length?emval_free_list.pop():emval_handle_array.length;emval_handle_array[handle]={refcount:1,value:value};return handle}}}};function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(handle){var rv=Emval.toValue(handle);__emval_decref(handle);return rv},"toWireType":function(destructors,value){return Emval.toHandle(value)},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function enumReadValueFromPointer(name,shift,signed){switch(shift){case 0:return function(pointer){var heap=signed?HEAP8:HEAPU8;return this["fromWireType"](heap[pointer])};case 1:return function(pointer){var heap=signed?HEAP16:HEAPU16;return this["fromWireType"](heap[pointer>>1])};case 2:return function(pointer){var heap=signed?HEAP32:HEAPU32;return this["fromWireType"](heap[pointer>>2])};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_enum(rawType,name,size,isSigned){var shift=getShiftFromSize(size);name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,"fromWireType":function(c){return this.constructor.values[c]},"toWireType":function(destructors,c){return c.value},"argPackAdvance":8,"readValueFromPointer":enumReadValueFromPointer(name,shift,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __embind_register_enum_value(rawEnumType,name,enumValue){var enumType=requireRegisteredType(rawEnumType,"enum");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(enumType.name+"_"+name,function(){})}});Enum.values[enumValue]=Value;Enum[name]=Value}function embindRepr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function __embind_register_function(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn){var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,function(){throwUnboundTypeError("Cannot call "+name+" due to unbound types",argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn),argCount-1);return[]})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=value=>value;if(minRange===0){var bitshift=32-8*size;fromWireType=value=>value<>>bitshift}var isUnsignedType=name.includes("unsigned");var checkAssertions=(value,toTypeName)=>{};var toWireType;if(isUnsignedType){toWireType=function(destructors,value){checkAssertions(value,this.name);return value>>>0}}else{toWireType=function(destructors,value){checkAssertions(value,this.name);return value}}registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":toWireType,"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var payload=value+4;var str;if(stdStringIsUTF8){var decodeStartPtr=payload;for(var i=0;i<=length;++i){var currentBytePtr=payload+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+i]=charCode}}else{for(var i=0;iHEAPU16;shift=1}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;getHeap=()=>HEAPU32;shift=2}registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value=="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_value_array(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor){tupleRegistrations[rawType]={name:readLatin1String(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),elements:[]}}function __embind_register_value_array_element(rawTupleType,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext){tupleRegistrations[rawTupleType].elements.push({getterReturnType:getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext:getterContext,setterArgumentType:setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext:setterContext})}function __embind_register_value_object(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor){structRegistrations[rawType]={name:readLatin1String(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),fields:[]}}function __embind_register_value_object_field(structType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext){structRegistrations[structType].fields.push({fieldName:readLatin1String(fieldName),getterReturnType:getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext:getterContext,setterArgumentType:setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext:setterContext})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}var nowIsMonotonic=true;function __emscripten_get_now_is_monotonic(){return nowIsMonotonic}function __emval_as(handle,returnType,destructorsRef){handle=Emval.toValue(handle);returnType=requireRegisteredType(returnType,"emval::as");var destructors=[];var rd=Emval.toHandle(destructors);HEAPU32[destructorsRef>>2]=rd;return returnType["toWireType"](destructors,handle)}function __emval_get_property(handle,key){handle=Emval.toValue(handle);key=Emval.toValue(key);return Emval.toHandle(handle[key])}function __emval_incref(handle){if(handle>4){emval_handle_array[handle].refcount+=1}}var emval_symbols={};function getStringOrSymbol(address){var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}return symbol}function __emval_new_cstring(v){return Emval.toHandle(getStringOrSymbol(v))}function __emval_run_destructors(handle){var destructors=Emval.toValue(handle);runDestructors(destructors);__emval_decref(handle)}function __emval_take_value(type,arg){type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](arg);return Emval.toHandle(v)}function _abort(){abort("")}var readAsmConstArgsArray=[];function readAsmConstArgs(sigPtr,buf){readAsmConstArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){buf+=ch!=105&buf;readAsmConstArgsArray.push(ch==105?HEAP32[buf]:HEAPF64[buf++>>1]);++buf}return readAsmConstArgsArray}function _emscripten_asm_const_int(code,sigPtr,argbuf){var args=readAsmConstArgs(sigPtr,argbuf);return ASM_CONSTS[code].apply(null,args)}function getHeapMax(){return 2147483648}function _emscripten_get_heap_max(){return getHeapMax()}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=()=>{var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else _emscripten_get_now=()=>performance.now();function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doReadv(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var offset=convertI32PairToI53Checked(offset_low,offset_high);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doWritev(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function _getentropy(buffer,size){if(!_getentropy.randomDevice){_getentropy.randomDevice=getRandomDevice()}for(var i=0;i>0]=_getentropy.randomDevice()}return 0}function __webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(ctx){return!!(ctx.dibvbi=ctx.getExtension("WEBGL_draw_instanced_base_vertex_base_instance"))}function __webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(ctx){return!!(ctx.mdibvbi=ctx.getExtension("WEBGL_multi_draw_instanced_base_vertex_base_instance"))}function __webgl_enable_WEBGL_multi_draw(ctx){return!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"))}var GL={counter:1,buffers:[],mappedBuffers:{},programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:[],offscreenCanvases:{},queries:[],samplers:[],transformFeedbacks:[],syncs:[],byteSizeByTypeRoot:5120,byteSizeByType:[1,1,2,2,4,4,4,2,3,4,8],stringCache:{},stringiCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:function(table){var ret=GL.counter++;for(var i=table.length;i>1;var quadIndexes=new Uint16Array(numIndexes);var i=0,v=0;while(1){quadIndexes[i++]=v;if(i>=numIndexes)break;quadIndexes[i++]=v+1;if(i>=numIndexes)break;quadIndexes[i++]=v+2;if(i>=numIndexes)break;quadIndexes[i++]=v;if(i>=numIndexes)break;quadIndexes[i++]=v+2;if(i>=numIndexes)break;quadIndexes[i++]=v+3;if(i>=numIndexes)break;v+=4}context.GLctx.bufferData(34963,quadIndexes,35044);context.GLctx.bindBuffer(34963,null)}},getTempVertexBuffer:function getTempVertexBuffer(sizeBytes){var idx=GL.log2ceilLookup(sizeBytes);var ringbuffer=GL.currentContext.tempVertexBuffers1[idx];var nextFreeBufferIndex=GL.currentContext.tempVertexBufferCounters1[idx];GL.currentContext.tempVertexBufferCounters1[idx]=GL.currentContext.tempVertexBufferCounters1[idx]+1&GL.numTempVertexBuffersPerSize-1;var vbo=ringbuffer[nextFreeBufferIndex];if(vbo){return vbo}var prevVBO=GLctx.getParameter(34964);ringbuffer[nextFreeBufferIndex]=GLctx.createBuffer();GLctx.bindBuffer(34962,ringbuffer[nextFreeBufferIndex]);GLctx.bufferData(34962,1<>2]:-1;source+=UTF8ToString(HEAP32[string+i*4>>2],len<0?undefined:len)}return source},calcBufLength:function calcBufLength(size,type,stride,count){if(stride>0){return count*stride}var typeSize=GL.byteSizeByType[type-GL.byteSizeByTypeRoot];return size*typeSize*count},usedTempBuffers:[],preDrawHandleClientVertexAttribBindings:function preDrawHandleClientVertexAttribBindings(count){GL.resetBufferBinding=false;for(var i=0;i=2){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query_webgl2")}if(context.version<2||!GLctx.disjointTimerQueryExt){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};function _glActiveTexture(x0){GLctx["activeTexture"](x0)}function _glAttachShader(program,shader){GLctx.attachShader(GL.programs[program],GL.shaders[shader])}function _glBeginQuery(target,id){GLctx["beginQuery"](target,GL.queries[id])}function _glBindBuffer(target,buffer){if(target==34962){GLctx.currentArrayBufferBinding=buffer}else if(target==34963){GLctx.currentElementArrayBufferBinding=buffer}if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,GL.buffers[buffer])}function _glBindBufferBase(target,index,buffer){GLctx["bindBufferBase"](target,index,GL.buffers[buffer])}function _glBindBufferRange(target,index,buffer,offset,ptrsize){GLctx["bindBufferRange"](target,index,GL.buffers[buffer],offset,ptrsize)}function _glBindFramebuffer(target,framebuffer){GLctx.bindFramebuffer(target,GL.framebuffers[framebuffer])}function _glBindRenderbuffer(target,renderbuffer){GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])}function _glBindSampler(unit,sampler){GLctx["bindSampler"](unit,GL.samplers[sampler])}function _glBindTexture(target,texture){GLctx.bindTexture(target,GL.textures[texture])}function _glBindVertexArray(vao){GLctx["bindVertexArray"](GL.vaos[vao]);var ibo=GLctx.getParameter(34965);GLctx.currentElementArrayBufferBinding=ibo?ibo.name|0:0}function _glBlendEquationSeparate(x0,x1){GLctx["blendEquationSeparate"](x0,x1)}function _glBlendFuncSeparate(x0,x1,x2,x3){GLctx["blendFuncSeparate"](x0,x1,x2,x3)}function _glBlitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9){GLctx["blitFramebuffer"](x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)}function _glBufferData(target,size,data,usage){if(true){if(data&&size){GLctx.bufferData(target,HEAPU8,usage,data,size)}else{GLctx.bufferData(target,size,usage)}}else{GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)}}function _glBufferSubData(target,offset,size,data){if(true){size&&GLctx.bufferSubData(target,offset,HEAPU8,data,size);return}GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))}function _glClearBufferfi(x0,x1,x2,x3){GLctx["clearBufferfi"](x0,x1,x2,x3)}function _glClearBufferfv(buffer,drawbuffer,value){GLctx["clearBufferfv"](buffer,drawbuffer,HEAPF32,value>>2)}function _glClearBufferiv(buffer,drawbuffer,value){GLctx["clearBufferiv"](buffer,drawbuffer,HEAP32,value>>2)}function convertI32PairToI53(lo,hi){return(lo>>>0)+hi*4294967296}function _glClientWaitSync(sync,flags,timeoutLo,timeoutHi){return GLctx.clientWaitSync(GL.syncs[sync],flags,convertI32PairToI53(timeoutLo,timeoutHi))}function _glColorMask(red,green,blue,alpha){GLctx.colorMask(!!red,!!green,!!blue,!!alpha)}function _glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}function _glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data){if(true){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,imageSize,data)}else{GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,HEAPU8,data,imageSize)}return}GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,data?HEAPU8.subarray(data,data+imageSize):null)}function _glCompressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data){if(GLctx.currentPixelUnpackBufferBinding){GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)}else{GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,HEAPU8,data,imageSize)}}function _glCopyBufferSubData(x0,x1,x2,x3,x4){GLctx["copyBufferSubData"](x0,x1,x2,x3,x4)}function _glCreateProgram(){var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id}function _glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id}function _glCullFace(x0){GLctx["cullFace"](x0)}function _glDeleteBuffers(n,buffers){for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GLctx.currentArrayBufferBinding)GLctx.currentArrayBufferBinding=0;if(id==GLctx.currentElementArrayBufferBinding)GLctx.currentElementArrayBufferBinding=0;if(id==GLctx.currentPixelPackBufferBinding)GLctx.currentPixelPackBufferBinding=0;if(id==GLctx.currentPixelUnpackBufferBinding)GLctx.currentPixelUnpackBufferBinding=0}}function _glDeleteFramebuffers(n,framebuffers){for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}}function _glDeleteProgram(id){if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null}function _glDeleteQueries(n,ids){for(var i=0;i>2];var query=GL.queries[id];if(!query)continue;GLctx["deleteQuery"](query);GL.queries[id]=null}}function _glDeleteRenderbuffers(n,renderbuffers){for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}}function _glDeleteSamplers(n,samplers){for(var i=0;i>2];var sampler=GL.samplers[id];if(!sampler)continue;GLctx["deleteSampler"](sampler);sampler.name=0;GL.samplers[id]=null}}function _glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null}function _glDeleteSync(id){if(!id)return;var sync=GL.syncs[id];if(!sync){GL.recordError(1281);return}GLctx.deleteSync(sync);sync.name=0;GL.syncs[id]=null}function _glDeleteTextures(n,textures){for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}function _glDeleteVertexArrays(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}function _glDepthFunc(x0){GLctx["depthFunc"](x0)}function _glDepthMask(flag){GLctx.depthMask(!!flag)}function _glDepthRangef(x0,x1){GLctx["depthRange"](x0,x1)}function _glDetachShader(program,shader){GLctx.detachShader(GL.programs[program],GL.shaders[shader])}function _glDisable(x0){GLctx["disable"](x0)}function _glDisableVertexAttribArray(index){var cb=GL.currentContext.clientBuffers[index];cb.enabled=false;GLctx.disableVertexAttribArray(index)}var tempFixedLengthArray=[];function _glDrawBuffers(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}function _glDrawElementsInstanced(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _glDrawElements(mode,count,type,indices){var buf;if(!GLctx.currentElementArrayBufferBinding){var size=GL.calcBufLength(1,type,0,count);buf=GL.getTempIndexBuffer(size);GLctx.bindBuffer(34963,buf);GLctx.bufferSubData(34963,0,HEAPU8.subarray(indices,indices+size));indices=0}GL.preDrawHandleClientVertexAttribBindings(count);GLctx.drawElements(mode,count,type,indices);GL.postDrawHandleClientVertexAttribBindings(count);if(!GLctx.currentElementArrayBufferBinding){GLctx.bindBuffer(34963,null)}}function _glDrawRangeElements(mode,start,end,count,type,indices){_glDrawElements(mode,count,type,indices)}function _glEnable(x0){GLctx["enable"](x0)}function _glEnableVertexAttribArray(index){var cb=GL.currentContext.clientBuffers[index];cb.enabled=true;GLctx.enableVertexAttribArray(index)}function _glEndQuery(x0){GLctx["endQuery"](x0)}function _glFenceSync(condition,flags){var sync=GLctx.fenceSync(condition,flags);if(sync){var id=GL.getNewId(GL.syncs);sync.name=id;GL.syncs[id]=sync;return id}else{return 0}}function _glFinish(){GLctx["finish"]()}function _glFlush(){GLctx["flush"]()}function _glFramebufferRenderbuffer(target,attachment,renderbuffertarget,renderbuffer){GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])}function _glFramebufferTexture2D(target,attachment,textarget,texture,level){GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)}function _glFramebufferTextureLayer(target,attachment,texture,level,layer){GLctx.framebufferTextureLayer(target,attachment,GL.textures[texture],level,layer)}function _glFrontFace(x0){GLctx["frontFace"](x0)}function __glGenObject(n,buffers,createFunction,objectTable){for(var i=0;i>2]=id}}function _glGenBuffers(n,buffers){__glGenObject(n,buffers,"createBuffer",GL.buffers)}function _glGenFramebuffers(n,ids){__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)}function _glGenQueries(n,ids){__glGenObject(n,ids,"createQuery",GL.queries)}function _glGenRenderbuffers(n,renderbuffers){__glGenObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)}function _glGenSamplers(n,samplers){__glGenObject(n,samplers,"createSampler",GL.samplers)}function _glGenTextures(n,textures){__glGenObject(n,textures,"createTexture",GL.textures)}function _glGenVertexArrays(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}function _glGetBufferSubData(target,offset,size,data){if(!data){GL.recordError(1281);return}size&&GLctx["getBufferSubData"](target,offset,HEAPU8,data,size)}function _glGetError(){var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error}function writeI53ToI64(ptr,num){HEAPU32[ptr>>2]=num;HEAPU32[ptr+4>>2]=(num-HEAPU32[ptr>>2])/4294967296}function emscriptenWebGLGet(name_,p,type){if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 34814:case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break;case 33309:if(GL.currentContext.version<2){GL.recordError(1282);return}var exts=GLctx.getSupportedExtensions()||[];ret=2*exts.length;break;case 33307:case 33308:if(GL.currentContext.version<2){GL.recordError(1280);return}ret=name_==33307?3:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i>2]=result[i];break;case 2:HEAPF32[p+i*4>>2]=result[i];break;case 4:HEAP8[p+i>>0]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Unknown object returned from WebGL getParameter("+name_+")! (error: "+e+")");return}}break;default:GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Native code calling glGet"+type+"v("+name_+") and it returns "+result+" of type "+typeof result+"!");return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:HEAP32[p>>2]=ret;break;case 2:HEAPF32[p>>2]=ret;break;case 4:HEAP8[p>>0]=ret?1:0;break}}function _glGetFloatv(name_,p){emscriptenWebGLGet(name_,p,2)}function _glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,0)}function _glGetProgramInfoLog(program,maxLength,length,infoLog){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glGetProgramiv(program,pname,p){if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){for(var i=0;i>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){for(var i=0;i>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){for(var i=0;i>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}}function _glGetQueryObjectuiv(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx["getQueryParameter"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}function _glGetShaderInfoLog(shader,maxLength,length,infoLog){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glGetShaderiv(shader,pname,p){if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}}function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _glGetString(name_){var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s&&stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);if(true)glVersion="OpenGL ES 3.0 ("+glVersion+")";else{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret}function _glGetUniformBlockIndex(program,uniformBlockName){return GLctx["getUniformBlockIndex"](GL.programs[program],UTF8ToString(uniformBlockName))}function jstoi_q(str){return parseInt(str)}function webglGetLeftBracePos(name){return name.slice(-1)=="]"&&name.lastIndexOf("[")}function webglPrepareUniformLocationsBeforeFirstUse(program){var uniformLocsById=program.uniformLocsById,uniformSizeAndIdsByName=program.uniformSizeAndIdsByName,i,j;if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};for(i=0;i0?nm.slice(0,lb):nm;var id=program.uniformIdCounter;program.uniformIdCounter+=sz;uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex>2]}GLctx["invalidateFramebuffer"](target,list)}function _glLinkProgram(program){program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}}function emscriptenWebGLGetBufferBinding(target){switch(target){case 34962:target=34964;break;case 34963:target=34965;break;case 35051:target=35053;break;case 35052:target=35055;break;case 35982:target=35983;break;case 36662:target=36662;break;case 36663:target=36663;break;case 35345:target=35368;break}var buffer=GLctx.getParameter(target);if(buffer)return buffer.name|0;else return 0}function emscriptenWebGLValidateMapBufferTarget(target){switch(target){case 34962:case 34963:case 36662:case 36663:case 35051:case 35052:case 35882:case 35982:case 35345:return true;default:return false}}function _glMapBufferRange(target,offset,length,access){if(access!=26&&access!=10){err("glMapBufferRange is only supported when access is MAP_WRITE|INVALIDATE_BUFFER");return 0}if(!emscriptenWebGLValidateMapBufferTarget(target)){GL.recordError(1280);err("GL_INVALID_ENUM in glMapBufferRange");return 0}var mem=_malloc(length);if(!mem)return 0;GL.mappedBuffers[emscriptenWebGLGetBufferBinding(target)]={offset:offset,length:length,mem:mem,access:access};return mem}function _glPixelStorei(pname,param){if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)}function _glPolygonOffset(x0,x1){GLctx["polygonOffset"](x0,x1)}function computeUnpackAlignedImageSize(width,height,sizePerPixel,alignment){function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=width*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,alignment);return height*alignedRowSize}function __colorChannelsInGlTextureFormat(format){var colorChannels={5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4};return colorChannels[format-6402]||1}function heapObjectForWebGLType(type){type-=5120;if(type==0)return HEAP8;if(type==1)return HEAPU8;if(type==2)return HEAP16;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922||type==28520||type==30779||type==30782)return HEAPU32;return HEAPU16}function heapAccessShiftForWebGLHeap(heap){return 31-Math.clz32(heap.BYTES_PER_ELEMENT)}function emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat){var heap=heapObjectForWebGLType(type);var shift=heapAccessShiftForWebGLHeap(heap);var byteSize=1<>shift,pixels+bytes>>shift)}function _glReadPixels(x,y,width,height,format,type,pixels){if(true){if(GLctx.currentPixelPackBufferBinding){GLctx.readPixels(x,y,width,height,format,type,pixels)}else{var heap=heapObjectForWebGLType(type);GLctx.readPixels(x,y,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}return}var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)}function _glRenderbufferStorage(x0,x1,x2,x3){GLctx["renderbufferStorage"](x0,x1,x2,x3)}function _glRenderbufferStorageMultisample(x0,x1,x2,x3,x4){GLctx["renderbufferStorageMultisample"](x0,x1,x2,x3,x4)}function _glSamplerParameterf(sampler,pname,param){GLctx["samplerParameterf"](GL.samplers[sampler],pname,param)}function _glSamplerParameteri(sampler,pname,param){GLctx["samplerParameteri"](GL.samplers[sampler],pname,param)}function _glScissor(x0,x1,x2,x3){GLctx["scissor"](x0,x1,x2,x3)}function _glShaderSource(shader,count,string,length){var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)}function _glStencilFuncSeparate(x0,x1,x2,x3){GLctx["stencilFuncSeparate"](x0,x1,x2,x3)}function _glStencilMaskSeparate(x0,x1){GLctx["stencilMaskSeparate"](x0,x1)}function _glStencilOpSeparate(x0,x1,x2,x3){GLctx["stencilOpSeparate"](x0,x1,x2,x3)}function _glTexParameterf(x0,x1,x2){GLctx["texParameterf"](x0,x1,x2)}function _glTexParameteri(x0,x1,x2){GLctx["texParameteri"](x0,x1,x2)}function _glTexStorage2D(x0,x1,x2,x3,x4){GLctx["texStorage2D"](x0,x1,x2,x3,x4)}function _glTexStorage3D(x0,x1,x2,x3,x4,x5){GLctx["texStorage3D"](x0,x1,x2,x3,x4,x5)}function _glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels){if(true){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,null)}return}var pixelData=null;if(pixels)pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)}function _glTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,null)}}function webglGetUniformLocation(location){var p=GLctx.currentProgram;if(p){var webglLoc=p.uniformLocsById[location];if(typeof webglLoc=="number"){p.uniformLocsById[location]=webglLoc=GLctx.getUniformLocation(p,p.uniformArrayNamesById[location]+(webglLoc>0?"["+webglLoc+"]":""))}return webglLoc}else{GL.recordError(1282)}}function _glUniform1i(location,v0){GLctx.uniform1i(webglGetUniformLocation(location),v0)}function _glUniformBlockBinding(program,uniformBlockIndex,uniformBlockBinding){program=GL.programs[program];GLctx["uniformBlockBinding"](program,uniformBlockIndex,uniformBlockBinding)}function _glUnmapBuffer(target){if(!emscriptenWebGLValidateMapBufferTarget(target)){GL.recordError(1280);err("GL_INVALID_ENUM in glUnmapBuffer");return 0}var buffer=emscriptenWebGLGetBufferBinding(target);var mapping=GL.mappedBuffers[buffer];if(!mapping){GL.recordError(1282);err("buffer was never mapped in glUnmapBuffer");return 0}GL.mappedBuffers[buffer]=null;if(!(mapping.access&16))if(true){GLctx.bufferSubData(target,mapping.offset,HEAPU8,mapping.mem,mapping.length)}else{GLctx.bufferSubData(target,mapping.offset,HEAPU8.subarray(mapping.mem,mapping.mem+mapping.length))}_free(mapping.mem);return 1}function _glUseProgram(program){program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program}function _glVertexAttrib4f(x0,x1,x2,x3,x4){GLctx["vertexAttrib4f"](x0,x1,x2,x3,x4)}function _glVertexAttribI4ui(x0,x1,x2,x3,x4){GLctx["vertexAttribI4ui"](x0,x1,x2,x3,x4)}function _glVertexAttribIPointer(index,size,type,stride,ptr){var cb=GL.currentContext.clientBuffers[index];if(!GLctx.currentArrayBufferBinding){cb.size=size;cb.type=type;cb.normalized=false;cb.stride=stride;cb.ptr=ptr;cb.clientside=true;cb.vertexAttribPointerAdaptor=function(index,size,type,normalized,stride,ptr){this.vertexAttribIPointer(index,size,type,stride,ptr)};return}cb.clientside=false;GLctx["vertexAttribIPointer"](index,size,type,stride,ptr)}function _glVertexAttribPointer(index,size,type,normalized,stride,ptr){var cb=GL.currentContext.clientBuffers[index];if(!GLctx.currentArrayBufferBinding){cb.size=size;cb.type=type;cb.normalized=normalized;cb.stride=stride;cb.ptr=ptr;cb.clientside=true;cb.vertexAttribPointerAdaptor=function(index,size,type,normalized,stride,ptr){this.vertexAttribPointer(index,size,type,normalized,stride,ptr)};return}cb.clientside=false;GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}function _glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,x3)}function _glWaitSync(sync,flags,timeoutLo,timeoutHi){GLctx.waitSync(GL.syncs[sync],flags,convertI32PairToI53(timeoutLo,timeoutHi))}function _setTempRet0(val){setTempRet0(val)}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm){return _strftime(s,maxsize,format,tm)}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();InternalError=Module["InternalError"]=extendError(Error,"InternalError");embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");init_ClassHandle();init_embind();init_RegisteredPointer();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();var GLctx;for(var i=0;i<32;++i)tempFixedLengthArray.push(new Array(i));function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var asmLibraryArg={"Ga":___syscall_fcntl64,"yb":___syscall_ioctl,"zb":___syscall_openat,"ub":___syscall_stat64,"x":__embind_finalize_value_array,"m":__embind_finalize_value_object,"nb":__embind_register_bigint,"Eb":__embind_register_bool,"e":__embind_register_class,"l":__embind_register_class_class_function,"k":__embind_register_class_constructor,"a":__embind_register_class_function,"w":__embind_register_class_property,"Db":__embind_register_emval,"h":__embind_register_enum,"b":__embind_register_enum_value,"Ia":__embind_register_float,"T":__embind_register_function,"D":__embind_register_integer,"p":__embind_register_memory_view,"Ha":__embind_register_std_string,"ea":__embind_register_std_wstring,"y":__embind_register_value_array,"f":__embind_register_value_array_element,"n":__embind_register_value_object,"d":__embind_register_value_object_field,"Fb":__embind_register_void,"Bb":__emscripten_get_now_is_monotonic,"s":__emval_as,"g":__emval_decref,"t":__emval_get_property,"S":__emval_incref,"H":__emval_new_cstring,"r":__emval_run_destructors,"u":__emval_take_value,"c":_abort,"ca":_emscripten_asm_const_int,"qb":_emscripten_get_heap_max,"Ab":_emscripten_get_now,"Cb":_emscripten_memcpy_big,"tb":_emscripten_resize_heap,"vb":_environ_get,"wb":_environ_sizes_get,"da":_fd_close,"xb":_fd_read,"mb":_fd_seek,"Fa":_fd_write,"rb":_getentropy,"i":_glActiveTexture,"W":_glAttachShader,"Wb":_glBeginQuery,"o":_glBindBuffer,"ta":_glBindBufferBase,"U":_glBindBufferRange,"q":_glBindFramebuffer,"Na":_glBindRenderbuffer,"aa":_glBindSampler,"j":_glBindTexture,"A":_glBindVertexArray,"wa":_glBlendEquationSeparate,"va":_glBlendFuncSeparate,"fa":_glBlitFramebuffer,"K":_glBufferData,"ha":_glBufferSubData,"Kb":_glClearBufferfi,"E":_glClearBufferfv,"Jb":_glClearBufferiv,"ob":_glClientWaitSync,"_":_glColorMask,"eb":_glCompileShader,"Ka":_glCompressedTexSubImage2D,"Ja":_glCompressedTexSubImage3D,"Ra":_glCopyBufferSubData,"db":_glCreateProgram,"gb":_glCreateShader,"xa":_glCullFace,"$":_glDeleteBuffers,"ia":_glDeleteFramebuffers,"oa":_glDeleteProgram,"Va":_glDeleteQueries,"ja":_glDeleteRenderbuffers,"za":_glDeleteSamplers,"X":_glDeleteShader,"L":_glDeleteSync,"ka":_glDeleteTextures,"ib":_glDeleteVertexArrays,"ba":_glDepthFunc,"Z":_glDepthMask,"qa":_glDepthRangef,"pa":_glDetachShader,"v":_glDisable,"Nb":_glDisableVertexAttribArray,"Xa":_glDrawBuffers,"Xb":_glDrawElementsInstanced,"Yb":_glDrawRangeElements,"G":_glEnable,"Qb":_glEnableVertexAttribArray,"Vb":_glEndQuery,"V":_glFenceSync,"Da":_glFinish,"lb":_glFlush,"M":_glFramebufferRenderbuffer,"Pa":_glFramebufferTexture2D,"Oa":_glFramebufferTextureLayer,"ya":_glFrontFace,"O":_glGenBuffers,"la":_glGenFramebuffers,"Wa":_glGenQueries,"Y":_glGenRenderbuffers,"Ba":_glGenSamplers,"N":_glGenTextures,"hb":_glGenVertexArrays,"Ta":_glGenerateMipmap,"Ib":_glGetBufferSubData,"Ca":_glGetError,"kb":_glGetFloatv,"C":_glGetIntegerv,"ab":_glGetProgramInfoLog,"na":_glGetProgramiv,"Ub":_glGetQueryObjectuiv,"bb":_glGetShaderInfoLog,"ma":_glGetShaderiv,"I":_glGetString,"$a":_glGetUniformBlockIndex,"Za":_glGetUniformLocation,"jb":_glHint,"ga":_glInvalidateFramebuffer,"cb":_glLinkProgram,"Hb":_glMapBufferRange,"B":_glPixelStorei,"ua":_glPolygonOffset,"Sa":_glReadPixels,"Lb":_glRenderbufferStorage,"Mb":_glRenderbufferStorageMultisample,"Aa":_glSamplerParameterf,"J":_glSamplerParameteri,"sa":_glScissor,"fb":_glShaderSource,"Q":_glStencilFuncSeparate,"F":_glStencilMaskSeparate,"P":_glStencilOpSeparate,"Ua":_glTexParameterf,"z":_glTexParameteri,"Tb":_glTexStorage2D,"Qa":_glTexStorage3D,"Ma":_glTexSubImage2D,"La":_glTexSubImage3D,"Ya":_glUniform1i,"_a":_glUniformBlockBinding,"Gb":_glUnmapBuffer,"R":_glUseProgram,"Ob":_glVertexAttrib4f,"Pb":_glVertexAttribI4ui,"Sb":_glVertexAttribIPointer,"Rb":_glVertexAttribPointer,"ra":_glViewport,"pb":_glWaitSync,"Ea":_setTempRet0,"sb":_strftime_l};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["_b"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["ac"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["bc"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["cc"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["dc"]).apply(null,arguments)};var ___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=function(){return(___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=Module["asm"]["ec"]).apply(null,arguments)};var dynCall_iiiiij=Module["dynCall_iiiiij"]=function(){return(dynCall_iiiiij=Module["dynCall_iiiiij"]=Module["asm"]["fc"]).apply(null,arguments)};var dynCall_jii=Module["dynCall_jii"]=function(){return(dynCall_jii=Module["dynCall_jii"]=Module["asm"]["gc"]).apply(null,arguments)};var dynCall_iiij=Module["dynCall_iiij"]=function(){return(dynCall_iiij=Module["dynCall_iiij"]=Module["asm"]["hc"]).apply(null,arguments)};var dynCall_vij=Module["dynCall_vij"]=function(){return(dynCall_vij=Module["dynCall_vij"]=Module["asm"]["ic"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["jc"]).apply(null,arguments)};var dynCall_viijii=Module["dynCall_viijii"]=function(){return(dynCall_viijii=Module["dynCall_viijii"]=Module["asm"]["kc"]).apply(null,arguments)};var dynCall_iiiiijj=Module["dynCall_iiiiijj"]=function(){return(dynCall_iiiiijj=Module["dynCall_iiiiijj"]=Module["asm"]["lc"]).apply(null,arguments)};var dynCall_iiiiiijj=Module["dynCall_iiiiiijj"]=function(){return(dynCall_iiiiiijj=Module["dynCall_iiiiiijj"]=Module["asm"]["mc"]).apply(null,arguments)};var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run(); +var Module=typeof Filament!="undefined"?Filament:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}var fs;var nodePath;var requireNodeFS;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}requireNodeFS=()=>{if(!nodePath){fs=require("fs");nodePath=require("path")}};read_=function shell_read(filename,binary){requireNodeFS();filename=nodePath["normalize"](filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{requireNodeFS();filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",function(reason){throw reason});quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var tempRet0=0;var setTempRet0=value=>{tempRet0=value};var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf-16le"):undefined;function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder){return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr))}else{var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="filament.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["sc"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["uc"];addOnInit(Module["asm"]["tc"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}var tempDouble;var tempI64;var ASM_CONSTS={1682804:()=>{const options=window.filament_glOptions;const context=window.filament_glContext;const handle=GL.registerContext(context,options);window.filament_contextHandle=handle;GL.makeContextCurrent(handle)},1683018:()=>{const handle=window.filament_contextHandle;GL.makeContextCurrent(handle)},1683099:($0,$1,$2,$3,$4,$5)=>{const fn=Emval.toValue($0);fn({"renderable":Emval.toValue($1),"depth":$2,"fragCoords":[$3,$4,$5]})}};function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return function(){return crypto_module["randomBytes"](1)[0]}}catch(e){}}return function(){abort("randomDevice")}}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){abort()}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{path=PATH_FS.resolve(FS.cwd(),path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(p=>!!p),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get:function(){return this.shared.position},set:function(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>{return parent.node_ops.lookup(parent,name)},mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;for(var i=0;i{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{return null}},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node},createPreloadedFile:(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(Browser.handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=()=>{out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=()=>{ok++;if(ok+fail==total)finish()};putRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(8);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}var tupleRegistrations={};function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAP32[pointer>>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}return name}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i{if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push(()=>{typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}});if(0===unregisteredTypes.length){onComplete(typeConverters)}}function __embind_finalize_value_array(rawTupleType){var reg=tupleRegistrations[rawTupleType];delete tupleRegistrations[rawTupleType];var elements=reg.elements;var elementsLength=elements.length;var elementTypes=elements.map(function(elt){return elt.getterReturnType}).concat(elements.map(function(elt){return elt.setterArgumentType}));var rawConstructor=reg.rawConstructor;var rawDestructor=reg.rawDestructor;whenDependentTypesAreResolved([rawTupleType],elementTypes,function(elementTypes){elements.forEach((elt,i)=>{var getterReturnType=elementTypes[i];var getter=elt.getter;var getterContext=elt.getterContext;var setterArgumentType=elementTypes[i+elementsLength];var setter=elt.setter;var setterContext=elt.setterContext;elt.read=ptr=>{return getterReturnType["fromWireType"](getter(getterContext,ptr))};elt.write=(ptr,o)=>{var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,o));runDestructors(destructors)}});return[{name:reg.name,"fromWireType":function(ptr){var rv=new Array(elementsLength);for(var i=0;ifield.getterReturnType).concat(fieldRecords.map(field=>field.setterArgumentType));whenDependentTypesAreResolved([structType],fieldTypes,fieldTypes=>{var fields={};fieldRecords.forEach((field,i)=>{var fieldName=field.fieldName;var getterReturnType=fieldTypes[i];var getter=field.getter;var getterContext=field.getterContext;var setterArgumentType=fieldTypes[i+fieldRecords.length];var setter=field.setter;var setterContext=field.setterContext;fields[fieldName]={read:ptr=>{return getterReturnType["fromWireType"](getter(getterContext,ptr))},write:(ptr,o)=>{var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,o));runDestructors(destructors)}}});return[{name:reg.name,"fromWireType":function(ptr){var rv={};for(var i in fields){rv[i]=fields[i].read(ptr)}rawDestructor(ptr);return rv},"toWireType":function(destructors,o){for(var fieldName in fields){if(!(fieldName in o)){throw new TypeError('Missing field: "'+fieldName+'"')}}var ptr=rawConstructor();for(fieldName in fields){fields[fieldName].write(ptr,o[fieldName])}if(destructors!==null){destructors.push(rawDestructor,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:rawDestructor}]})}function __embind_register_bigint(primitiveType,name,size,minRange,maxRange){}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}function registerType(rawType,registeredInstance,options={}){if(!("argPackAdvance"in registeredInstance)){throw new TypeError("registerType registeredInstance requires argPackAdvance")}var name=registeredInstance.name;if(!rawType){throwBindingError('type "'+name+'" must have a positive integer typeid pointer')}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError("Cannot register type '"+name+"' twice")}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(cb=>cb())}}function __embind_register_bool(rawType,name,size,trueValue,falseValue){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(wt){return!!wt},"toWireType":function(destructors,o){return o?trueValue:falseValue},"argPackAdvance":8,"readValueFromPointer":function(pointer){var heap;if(size===1){heap=HEAP8}else if(size===2){heap=HEAP16}else if(size===4){heap=HEAP32}else{throw new TypeError("Unknown boolean type size: "+name)}return this["fromWireType"](heap[pointer>>shift])},destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}var finalizationRegistry=false;function detachFinalizer(handle){}function runDestructor($$){if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function releaseClassHandle($$){$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}var registeredPointers={};function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}var delayFunction=undefined;function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record}}))}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function attachFinalizer(handle){if("undefined"===typeof FinalizationRegistry){attachFinalizer=handle=>handle;return handle}finalizationRegistry=new FinalizationRegistry(info=>{releaseClassHandle(info.$$)});attachFinalizer=handle=>{var $$=handle.$$;var hasSmartPtr=!!$$.smartPtr;if(hasSmartPtr){var info={$$:$$};finalizationRegistry.register(handle,info,handle)}return handle};detachFinalizer=handle=>finalizationRegistry.unregister(handle);return attachFinalizer(handle)}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+embindRepr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+embindRepr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,Emval.toHandle(function(){clonedHandle["delete"]()}));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+embindRepr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function dynCall(sig,ptr,args){if(sig.includes("j")){return dynCallLegacy(sig,ptr,args)}var rtn=getWasmTableEntry(ptr).apply(null,args);return rtn}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=0;Object.assign(argCache,arguments);return dynCall(sig,ptr,argCache)}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(){if(signature.includes("j")){return getDynCaller(signature,rawFunction)}return getWasmTableEntry(rawFunction)}var fp=makeDynCaller();if(typeof fp!="function"){throwBindingError("unknown function pointer with signature "+signature+": "+rawFunction)}return fp}var UnboundTypeError=undefined;function getTypeName(type){var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv}function throwUnboundTypeError(message,types){var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(message+": "+unboundTypes.map(getTypeName).join([", "]))}function __embind_register_class(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor){name=readLatin1String(name);getActualType=embind__requireFunction(getActualTypeSignature,getActualType);if(upcast){upcast=embind__requireFunction(upcastSignature,upcast)}if(downcast){downcast=embind__requireFunction(downcastSignature,downcast)}rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,function(){throwUnboundTypeError("Cannot construct "+name+" due to unbound types",[baseClassRawType])});whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],function(base){base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype}else{basePrototype=ClassHandle.prototype}var constructor=createNamedFunction(legalFunctionName,function(){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError("Use 'new' to construct "+name)}if(undefined===registeredClass.constructor_body){throw new BindingError(name+" has no accessible constructor")}var body=registeredClass.constructor_body[arguments.length];if(undefined===body){throw new BindingError("Tried to invoke ctor of "+name+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(registeredClass.constructor_body).toString()+") parameters instead!")}return body.apply(this,arguments)});var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+"*",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+" const*",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return[referenceConverter,pointerConverter,constPointerConverter]})}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i>2])}return array}function __embind_register_class_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,fn){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=classType.name+"."+methodName;function unboundTypesHandler(){throwUnboundTypeError("Cannot call "+humanName+" due to unbound types",rawArgTypes)}if(methodName.startsWith("@@")){methodName=Symbol[methodName.substring(2)]}var proto=classType.registeredClass.constructor;if(undefined===proto[methodName]){unboundTypesHandler.argCount=argCount-1;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-1]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));var func=craftInvokerFunction(humanName,invokerArgsArray,null,rawInvoker,fn);if(undefined===proto[methodName].overloadTable){func.argCount=argCount-1;proto[methodName]=func}else{proto[methodName].overloadTable[argCount-1]=func}return[]});return[]})}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){assert(argCount>0);var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=()=>{throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){argTypes.splice(1,0,null);classType.registeredClass.constructor_body[argCount-1]=craftInvokerFunction(humanName,argTypes,null,invoker,rawConstructor);return[]});return[]})}function __embind_register_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,context,isPureVirtual){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=classType.name+"."+methodName;if(methodName.startsWith("@@")){methodName=Symbol[methodName.substring(2)]}if(isPureVirtual){classType.registeredClass.pureVirtualFunctions.push(methodName)}function unboundTypesHandler(){throwUnboundTypeError("Cannot call "+humanName+" due to unbound types",rawArgTypes)}var proto=classType.registeredClass.instancePrototype;var method=proto[methodName];if(undefined===method||undefined===method.overloadTable&&method.className!==classType.name&&method.argCount===argCount-2){unboundTypesHandler.argCount=argCount-2;unboundTypesHandler.className=classType.name;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-2]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){var memberFunction=craftInvokerFunction(humanName,argTypes,classType,rawInvoker,context);if(undefined===proto[methodName].overloadTable){memberFunction.argCount=argCount-2;proto[methodName]=memberFunction}else{proto[methodName].overloadTable[argCount-2]=memberFunction}return[]});return[]})}function validateThis(this_,classType,humanName){if(!(this_ instanceof Object)){throwBindingError(humanName+' with invalid "this": '+this_)}if(!(this_ instanceof classType.registeredClass.constructor)){throwBindingError(humanName+' incompatible with "this" of type '+this_.constructor.name)}if(!this_.$$.ptr){throwBindingError("cannot call emscripten binding method "+humanName+" on deleted object")}return upcastPointer(this_.$$.ptr,this_.$$.ptrType.registeredClass,classType.registeredClass)}function __embind_register_class_property(classType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext){fieldName=readLatin1String(fieldName);getter=embind__requireFunction(getterSignature,getter);whenDependentTypesAreResolved([],[classType],function(classType){classType=classType[0];var humanName=classType.name+"."+fieldName;var desc={get:function(){throwUnboundTypeError("Cannot access "+humanName+" due to unbound types",[getterReturnType,setterArgumentType])},enumerable:true,configurable:true};if(setter){desc.set=()=>{throwUnboundTypeError("Cannot access "+humanName+" due to unbound types",[getterReturnType,setterArgumentType])}}else{desc.set=v=>{throwBindingError(humanName+" is a read-only property")}}Object.defineProperty(classType.registeredClass.instancePrototype,fieldName,desc);whenDependentTypesAreResolved([],setter?[getterReturnType,setterArgumentType]:[getterReturnType],function(types){var getterReturnType=types[0];var desc={get:function(){var ptr=validateThis(this,classType,humanName+" getter");return getterReturnType["fromWireType"](getter(getterContext,ptr))},enumerable:true};if(setter){setter=embind__requireFunction(setterSignature,setter);var setterArgumentType=types[1];desc.set=function(v){var ptr=validateThis(this,classType,humanName+" setter");var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,v));runDestructors(destructors)}}Object.defineProperty(classType.registeredClass.instancePrototype,fieldName,desc);return[]});return[]})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i{if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value},toHandle:value=>{switch(value){case undefined:return 1;case null:return 2;case true:return 3;case false:return 4;default:{var handle=emval_free_list.length?emval_free_list.pop():emval_handle_array.length;emval_handle_array[handle]={refcount:1,value:value};return handle}}}};function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(handle){var rv=Emval.toValue(handle);__emval_decref(handle);return rv},"toWireType":function(destructors,value){return Emval.toHandle(value)},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function enumReadValueFromPointer(name,shift,signed){switch(shift){case 0:return function(pointer){var heap=signed?HEAP8:HEAPU8;return this["fromWireType"](heap[pointer])};case 1:return function(pointer){var heap=signed?HEAP16:HEAPU16;return this["fromWireType"](heap[pointer>>1])};case 2:return function(pointer){var heap=signed?HEAP32:HEAPU32;return this["fromWireType"](heap[pointer>>2])};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_enum(rawType,name,size,isSigned){var shift=getShiftFromSize(size);name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,"fromWireType":function(c){return this.constructor.values[c]},"toWireType":function(destructors,c){return c.value},"argPackAdvance":8,"readValueFromPointer":enumReadValueFromPointer(name,shift,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __embind_register_enum_value(rawEnumType,name,enumValue){var enumType=requireRegisteredType(rawEnumType,"enum");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(enumType.name+"_"+name,function(){})}});Enum.values[enumValue]=Value;Enum[name]=Value}function embindRepr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function __embind_register_function(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn){var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,function(){throwUnboundTypeError("Cannot call "+name+" due to unbound types",argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn),argCount-1);return[]})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=value=>value;if(minRange===0){var bitshift=32-8*size;fromWireType=value=>value<>>bitshift}var isUnsignedType=name.includes("unsigned");var checkAssertions=(value,toTypeName)=>{};var toWireType;if(isUnsignedType){toWireType=function(destructors,value){checkAssertions(value,this.name);return value>>>0}}else{toWireType=function(destructors,value){checkAssertions(value,this.name);return value}}registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":toWireType,"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var payload=value+4;var str;if(stdStringIsUTF8){var decodeStartPtr=payload;for(var i=0;i<=length;++i){var currentBytePtr=payload+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+i]=charCode}}else{for(var i=0;iHEAPU16;shift=1}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;getHeap=()=>HEAPU32;shift=2}registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value=="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_value_array(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor){tupleRegistrations[rawType]={name:readLatin1String(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),elements:[]}}function __embind_register_value_array_element(rawTupleType,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext){tupleRegistrations[rawTupleType].elements.push({getterReturnType:getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext:getterContext,setterArgumentType:setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext:setterContext})}function __embind_register_value_object(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor){structRegistrations[rawType]={name:readLatin1String(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),fields:[]}}function __embind_register_value_object_field(structType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext){structRegistrations[structType].fields.push({fieldName:readLatin1String(fieldName),getterReturnType:getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext:getterContext,setterArgumentType:setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext:setterContext})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}function __emscripten_date_now(){return Date.now()}function __emscripten_err(str){err(UTF8ToString(str))}var nowIsMonotonic=true;function __emscripten_get_now_is_monotonic(){return nowIsMonotonic}function __emscripten_out(str){out(UTF8ToString(str))}function __emval_as(handle,returnType,destructorsRef){handle=Emval.toValue(handle);returnType=requireRegisteredType(returnType,"emval::as");var destructors=[];var rd=Emval.toHandle(destructors);HEAPU32[destructorsRef>>2]=rd;return returnType["toWireType"](destructors,handle)}function __emval_get_property(handle,key){handle=Emval.toValue(handle);key=Emval.toValue(key);return Emval.toHandle(handle[key])}function __emval_incref(handle){if(handle>4){emval_handle_array[handle].refcount+=1}}var emval_symbols={};function getStringOrSymbol(address){var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}return symbol}function __emval_new_cstring(v){return Emval.toHandle(getStringOrSymbol(v))}function __emval_run_destructors(handle){var destructors=Emval.toValue(handle);runDestructors(destructors);__emval_decref(handle)}function __emval_take_value(type,arg){type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](arg);return Emval.toHandle(v)}function _abort(){abort("")}var readAsmConstArgsArray=[];function readAsmConstArgs(sigPtr,buf){readAsmConstArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){buf+=ch!=105&buf;readAsmConstArgsArray.push(ch==105?HEAP32[buf]:HEAPF64[buf++>>1]);++buf}return readAsmConstArgsArray}function _emscripten_asm_const_int(code,sigPtr,argbuf){var args=readAsmConstArgs(sigPtr,argbuf);return ASM_CONSTS[code].apply(null,args)}function getHeapMax(){return 2147483648}function _emscripten_get_heap_max(){return getHeapMax()}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=()=>{var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else _emscripten_get_now=()=>performance.now();function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doReadv(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var offset=convertI32PairToI53Checked(offset_low,offset_high);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doWritev(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function _getentropy(buffer,size){if(!_getentropy.randomDevice){_getentropy.randomDevice=getRandomDevice()}for(var i=0;i>0]=_getentropy.randomDevice()}return 0}function __webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(ctx){return!!(ctx.dibvbi=ctx.getExtension("WEBGL_draw_instanced_base_vertex_base_instance"))}function __webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(ctx){return!!(ctx.mdibvbi=ctx.getExtension("WEBGL_multi_draw_instanced_base_vertex_base_instance"))}function __webgl_enable_WEBGL_multi_draw(ctx){return!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"))}var GL={counter:1,buffers:[],mappedBuffers:{},programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:[],offscreenCanvases:{},queries:[],samplers:[],transformFeedbacks:[],syncs:[],byteSizeByTypeRoot:5120,byteSizeByType:[1,1,2,2,4,4,4,2,3,4,8],stringCache:{},stringiCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:function(table){var ret=GL.counter++;for(var i=table.length;i>1;var quadIndexes=new Uint16Array(numIndexes);var i=0,v=0;while(1){quadIndexes[i++]=v;if(i>=numIndexes)break;quadIndexes[i++]=v+1;if(i>=numIndexes)break;quadIndexes[i++]=v+2;if(i>=numIndexes)break;quadIndexes[i++]=v;if(i>=numIndexes)break;quadIndexes[i++]=v+2;if(i>=numIndexes)break;quadIndexes[i++]=v+3;if(i>=numIndexes)break;v+=4}context.GLctx.bufferData(34963,quadIndexes,35044);context.GLctx.bindBuffer(34963,null)}},getTempVertexBuffer:function getTempVertexBuffer(sizeBytes){var idx=GL.log2ceilLookup(sizeBytes);var ringbuffer=GL.currentContext.tempVertexBuffers1[idx];var nextFreeBufferIndex=GL.currentContext.tempVertexBufferCounters1[idx];GL.currentContext.tempVertexBufferCounters1[idx]=GL.currentContext.tempVertexBufferCounters1[idx]+1&GL.numTempVertexBuffersPerSize-1;var vbo=ringbuffer[nextFreeBufferIndex];if(vbo){return vbo}var prevVBO=GLctx.getParameter(34964);ringbuffer[nextFreeBufferIndex]=GLctx.createBuffer();GLctx.bindBuffer(34962,ringbuffer[nextFreeBufferIndex]);GLctx.bufferData(34962,1<>2]:-1;source+=UTF8ToString(HEAP32[string+i*4>>2],len<0?undefined:len)}return source},calcBufLength:function calcBufLength(size,type,stride,count){if(stride>0){return count*stride}var typeSize=GL.byteSizeByType[type-GL.byteSizeByTypeRoot];return size*typeSize*count},usedTempBuffers:[],preDrawHandleClientVertexAttribBindings:function preDrawHandleClientVertexAttribBindings(count){GL.resetBufferBinding=false;for(var i=0;i=2){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query_webgl2")}if(context.version<2||!GLctx.disjointTimerQueryExt){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};function _glActiveTexture(x0){GLctx["activeTexture"](x0)}function _glAttachShader(program,shader){GLctx.attachShader(GL.programs[program],GL.shaders[shader])}function _glBeginQuery(target,id){GLctx["beginQuery"](target,GL.queries[id])}function _glBindAttribLocation(program,index,name){GLctx.bindAttribLocation(GL.programs[program],index,UTF8ToString(name))}function _glBindBuffer(target,buffer){if(target==34962){GLctx.currentArrayBufferBinding=buffer}else if(target==34963){GLctx.currentElementArrayBufferBinding=buffer}if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,GL.buffers[buffer])}function _glBindBufferBase(target,index,buffer){GLctx["bindBufferBase"](target,index,GL.buffers[buffer])}function _glBindBufferRange(target,index,buffer,offset,ptrsize){GLctx["bindBufferRange"](target,index,GL.buffers[buffer],offset,ptrsize)}function _glBindFramebuffer(target,framebuffer){GLctx.bindFramebuffer(target,GL.framebuffers[framebuffer])}function _glBindRenderbuffer(target,renderbuffer){GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])}function _glBindSampler(unit,sampler){GLctx["bindSampler"](unit,GL.samplers[sampler])}function _glBindTexture(target,texture){GLctx.bindTexture(target,GL.textures[texture])}function _glBindVertexArray(vao){GLctx["bindVertexArray"](GL.vaos[vao]);var ibo=GLctx.getParameter(34965);GLctx.currentElementArrayBufferBinding=ibo?ibo.name|0:0}function _glBlendEquationSeparate(x0,x1){GLctx["blendEquationSeparate"](x0,x1)}function _glBlendFuncSeparate(x0,x1,x2,x3){GLctx["blendFuncSeparate"](x0,x1,x2,x3)}function _glBlitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9){GLctx["blitFramebuffer"](x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)}function _glBufferData(target,size,data,usage){if(true){if(data&&size){GLctx.bufferData(target,HEAPU8,usage,data,size)}else{GLctx.bufferData(target,size,usage)}}else{GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)}}function _glBufferSubData(target,offset,size,data){if(true){size&&GLctx.bufferSubData(target,offset,HEAPU8,data,size);return}GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))}function _glClear(x0){GLctx["clear"](x0)}function _glClearBufferfi(x0,x1,x2,x3){GLctx["clearBufferfi"](x0,x1,x2,x3)}function _glClearBufferfv(buffer,drawbuffer,value){GLctx["clearBufferfv"](buffer,drawbuffer,HEAPF32,value>>2)}function _glClearBufferiv(buffer,drawbuffer,value){GLctx["clearBufferiv"](buffer,drawbuffer,HEAP32,value>>2)}function _glClearColor(x0,x1,x2,x3){GLctx["clearColor"](x0,x1,x2,x3)}function _glClearDepthf(x0){GLctx["clearDepth"](x0)}function _glClearStencil(x0){GLctx["clearStencil"](x0)}function convertI32PairToI53(lo,hi){return(lo>>>0)+hi*4294967296}function _glClientWaitSync(sync,flags,timeoutLo,timeoutHi){return GLctx.clientWaitSync(GL.syncs[sync],flags,convertI32PairToI53(timeoutLo,timeoutHi))}function _glColorMask(red,green,blue,alpha){GLctx.colorMask(!!red,!!green,!!blue,!!alpha)}function _glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}function _glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data){if(true){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,imageSize,data)}else{GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,HEAPU8,data,imageSize)}return}GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,data?HEAPU8.subarray(data,data+imageSize):null)}function _glCompressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data){if(GLctx.currentPixelUnpackBufferBinding){GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)}else{GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,HEAPU8,data,imageSize)}}function _glCopyBufferSubData(x0,x1,x2,x3,x4){GLctx["copyBufferSubData"](x0,x1,x2,x3,x4)}function _glCreateProgram(){var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id}function _glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id}function _glCullFace(x0){GLctx["cullFace"](x0)}function _glDeleteBuffers(n,buffers){for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GLctx.currentArrayBufferBinding)GLctx.currentArrayBufferBinding=0;if(id==GLctx.currentElementArrayBufferBinding)GLctx.currentElementArrayBufferBinding=0;if(id==GLctx.currentPixelPackBufferBinding)GLctx.currentPixelPackBufferBinding=0;if(id==GLctx.currentPixelUnpackBufferBinding)GLctx.currentPixelUnpackBufferBinding=0}}function _glDeleteFramebuffers(n,framebuffers){for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}}function _glDeleteProgram(id){if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null}function _glDeleteQueries(n,ids){for(var i=0;i>2];var query=GL.queries[id];if(!query)continue;GLctx["deleteQuery"](query);GL.queries[id]=null}}function _glDeleteRenderbuffers(n,renderbuffers){for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}}function _glDeleteSamplers(n,samplers){for(var i=0;i>2];var sampler=GL.samplers[id];if(!sampler)continue;GLctx["deleteSampler"](sampler);sampler.name=0;GL.samplers[id]=null}}function _glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null}function _glDeleteSync(id){if(!id)return;var sync=GL.syncs[id];if(!sync){GL.recordError(1281);return}GLctx.deleteSync(sync);sync.name=0;GL.syncs[id]=null}function _glDeleteTextures(n,textures){for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}function _glDeleteVertexArrays(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}function _glDepthFunc(x0){GLctx["depthFunc"](x0)}function _glDepthMask(flag){GLctx.depthMask(!!flag)}function _glDepthRangef(x0,x1){GLctx["depthRange"](x0,x1)}function _glDetachShader(program,shader){GLctx.detachShader(GL.programs[program],GL.shaders[shader])}function _glDisable(x0){GLctx["disable"](x0)}function _glDisableVertexAttribArray(index){var cb=GL.currentContext.clientBuffers[index];cb.enabled=false;GLctx.disableVertexAttribArray(index)}var tempFixedLengthArray=[];function _glDrawBuffers(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}function _glDrawElements(mode,count,type,indices){var buf;if(!GLctx.currentElementArrayBufferBinding){var size=GL.calcBufLength(1,type,0,count);buf=GL.getTempIndexBuffer(size);GLctx.bindBuffer(34963,buf);GLctx.bufferSubData(34963,0,HEAPU8.subarray(indices,indices+size));indices=0}GL.preDrawHandleClientVertexAttribBindings(count);GLctx.drawElements(mode,count,type,indices);GL.postDrawHandleClientVertexAttribBindings(count);if(!GLctx.currentElementArrayBufferBinding){GLctx.bindBuffer(34963,null)}}function _glDrawElementsInstanced(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _glEnable(x0){GLctx["enable"](x0)}function _glEnableVertexAttribArray(index){var cb=GL.currentContext.clientBuffers[index];cb.enabled=true;GLctx.enableVertexAttribArray(index)}function _glEndQuery(x0){GLctx["endQuery"](x0)}function _glFenceSync(condition,flags){var sync=GLctx.fenceSync(condition,flags);if(sync){var id=GL.getNewId(GL.syncs);sync.name=id;GL.syncs[id]=sync;return id}else{return 0}}function _glFinish(){GLctx["finish"]()}function _glFlush(){GLctx["flush"]()}function _glFramebufferRenderbuffer(target,attachment,renderbuffertarget,renderbuffer){GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])}function _glFramebufferTexture2D(target,attachment,textarget,texture,level){GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)}function _glFramebufferTextureLayer(target,attachment,texture,level,layer){GLctx.framebufferTextureLayer(target,attachment,GL.textures[texture],level,layer)}function _glFrontFace(x0){GLctx["frontFace"](x0)}function __glGenObject(n,buffers,createFunction,objectTable){for(var i=0;i>2]=id}}function _glGenBuffers(n,buffers){__glGenObject(n,buffers,"createBuffer",GL.buffers)}function _glGenFramebuffers(n,ids){__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)}function _glGenQueries(n,ids){__glGenObject(n,ids,"createQuery",GL.queries)}function _glGenRenderbuffers(n,renderbuffers){__glGenObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)}function _glGenSamplers(n,samplers){__glGenObject(n,samplers,"createSampler",GL.samplers)}function _glGenTextures(n,textures){__glGenObject(n,textures,"createTexture",GL.textures)}function _glGenVertexArrays(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}function _glGetBufferSubData(target,offset,size,data){if(!data){GL.recordError(1281);return}size&&GLctx["getBufferSubData"](target,offset,HEAPU8,data,size)}function _glGetError(){var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error}function writeI53ToI64(ptr,num){HEAPU32[ptr>>2]=num;HEAPU32[ptr+4>>2]=(num-HEAPU32[ptr>>2])/4294967296}function emscriptenWebGLGet(name_,p,type){if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 34814:case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break;case 33309:if(GL.currentContext.version<2){GL.recordError(1282);return}var exts=GLctx.getSupportedExtensions()||[];ret=2*exts.length;break;case 33307:case 33308:if(GL.currentContext.version<2){GL.recordError(1280);return}ret=name_==33307?3:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i>2]=result[i];break;case 2:HEAPF32[p+i*4>>2]=result[i];break;case 4:HEAP8[p+i>>0]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Unknown object returned from WebGL getParameter("+name_+")! (error: "+e+")");return}}break;default:GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Native code calling glGet"+type+"v("+name_+") and it returns "+result+" of type "+typeof result+"!");return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:HEAP32[p>>2]=ret;break;case 2:HEAPF32[p>>2]=ret;break;case 4:HEAP8[p>>0]=ret?1:0;break}}function _glGetFloatv(name_,p){emscriptenWebGLGet(name_,p,2)}function _glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,0)}function _glGetProgramBinary(program,bufSize,length,binaryFormat,binary){GL.recordError(1282)}function _glGetProgramInfoLog(program,maxLength,length,infoLog){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glGetProgramiv(program,pname,p){if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){for(var i=0;i>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){for(var i=0;i>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){for(var i=0;i>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}}function _glGetQueryObjectuiv(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx["getQueryParameter"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}function _glGetShaderInfoLog(shader,maxLength,length,infoLog){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glGetShaderiv(shader,pname,p){if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}}function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _glGetString(name_){var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s&&stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);if(true)glVersion="OpenGL ES 3.0 ("+glVersion+")";else{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret}function _glGetUniformBlockIndex(program,uniformBlockName){return GLctx["getUniformBlockIndex"](GL.programs[program],UTF8ToString(uniformBlockName))}function jstoi_q(str){return parseInt(str)}function webglGetLeftBracePos(name){return name.slice(-1)=="]"&&name.lastIndexOf("[")}function webglPrepareUniformLocationsBeforeFirstUse(program){var uniformLocsById=program.uniformLocsById,uniformSizeAndIdsByName=program.uniformSizeAndIdsByName,i,j;if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};for(i=0;i0?nm.slice(0,lb):nm;var id=program.uniformIdCounter;program.uniformIdCounter+=sz;uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex>2]}GLctx["invalidateFramebuffer"](target,list)}function _glLinkProgram(program){program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}}function emscriptenWebGLGetBufferBinding(target){switch(target){case 34962:target=34964;break;case 34963:target=34965;break;case 35051:target=35053;break;case 35052:target=35055;break;case 35982:target=35983;break;case 36662:target=36662;break;case 36663:target=36663;break;case 35345:target=35368;break}var buffer=GLctx.getParameter(target);if(buffer)return buffer.name|0;else return 0}function emscriptenWebGLValidateMapBufferTarget(target){switch(target){case 34962:case 34963:case 36662:case 36663:case 35051:case 35052:case 35882:case 35982:case 35345:return true;default:return false}}function _glMapBufferRange(target,offset,length,access){if(access!=26&&access!=10){err("glMapBufferRange is only supported when access is MAP_WRITE|INVALIDATE_BUFFER");return 0}if(!emscriptenWebGLValidateMapBufferTarget(target)){GL.recordError(1280);err("GL_INVALID_ENUM in glMapBufferRange");return 0}var mem=_malloc(length);if(!mem)return 0;GL.mappedBuffers[emscriptenWebGLGetBufferBinding(target)]={offset:offset,length:length,mem:mem,access:access};return mem}function _glPixelStorei(pname,param){if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)}function _glPolygonOffset(x0,x1){GLctx["polygonOffset"](x0,x1)}function _glProgramBinary(program,binaryFormat,binary,length){GL.recordError(1280)}function computeUnpackAlignedImageSize(width,height,sizePerPixel,alignment){function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=width*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,alignment);return height*alignedRowSize}function __colorChannelsInGlTextureFormat(format){var colorChannels={5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4};return colorChannels[format-6402]||1}function heapObjectForWebGLType(type){type-=5120;if(type==0)return HEAP8;if(type==1)return HEAPU8;if(type==2)return HEAP16;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922||type==28520||type==30779||type==30782)return HEAPU32;return HEAPU16}function heapAccessShiftForWebGLHeap(heap){return 31-Math.clz32(heap.BYTES_PER_ELEMENT)}function emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat){var heap=heapObjectForWebGLType(type);var shift=heapAccessShiftForWebGLHeap(heap);var byteSize=1<>shift,pixels+bytes>>shift)}function _glReadPixels(x,y,width,height,format,type,pixels){if(true){if(GLctx.currentPixelPackBufferBinding){GLctx.readPixels(x,y,width,height,format,type,pixels)}else{var heap=heapObjectForWebGLType(type);GLctx.readPixels(x,y,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}return}var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)}function _glRenderbufferStorage(x0,x1,x2,x3){GLctx["renderbufferStorage"](x0,x1,x2,x3)}function _glRenderbufferStorageMultisample(x0,x1,x2,x3,x4){GLctx["renderbufferStorageMultisample"](x0,x1,x2,x3,x4)}function _glSamplerParameterf(sampler,pname,param){GLctx["samplerParameterf"](GL.samplers[sampler],pname,param)}function _glSamplerParameteri(sampler,pname,param){GLctx["samplerParameteri"](GL.samplers[sampler],pname,param)}function _glScissor(x0,x1,x2,x3){GLctx["scissor"](x0,x1,x2,x3)}function _glShaderSource(shader,count,string,length){var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)}function _glStencilFuncSeparate(x0,x1,x2,x3){GLctx["stencilFuncSeparate"](x0,x1,x2,x3)}function _glStencilMaskSeparate(x0,x1){GLctx["stencilMaskSeparate"](x0,x1)}function _glStencilOpSeparate(x0,x1,x2,x3){GLctx["stencilOpSeparate"](x0,x1,x2,x3)}function _glTexImage2D(target,level,internalFormat,width,height,border,format,type,pixels){if(true){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,null)}return}GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null)}function _glTexParameterf(x0,x1,x2){GLctx["texParameterf"](x0,x1,x2)}function _glTexParameteri(x0,x1,x2){GLctx["texParameteri"](x0,x1,x2)}function _glTexStorage2D(x0,x1,x2,x3,x4){GLctx["texStorage2D"](x0,x1,x2,x3,x4)}function _glTexStorage3D(x0,x1,x2,x3,x4,x5){GLctx["texStorage3D"](x0,x1,x2,x3,x4,x5)}function _glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels){if(true){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,null)}return}var pixelData=null;if(pixels)pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)}function _glTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,null)}}function webglGetUniformLocation(location){var p=GLctx.currentProgram;if(p){var webglLoc=p.uniformLocsById[location];if(typeof webglLoc=="number"){p.uniformLocsById[location]=webglLoc=GLctx.getUniformLocation(p,p.uniformArrayNamesById[location]+(webglLoc>0?"["+webglLoc+"]":""))}return webglLoc}else{GL.recordError(1282)}}function _glUniform1f(location,v0){GLctx.uniform1f(webglGetUniformLocation(location),v0)}function _glUniform1fv(location,count,value){count&&GLctx.uniform1fv(webglGetUniformLocation(location),HEAPF32,value>>2,count)}function _glUniform1i(location,v0){GLctx.uniform1i(webglGetUniformLocation(location),v0)}function _glUniform1iv(location,count,value){count&&GLctx.uniform1iv(webglGetUniformLocation(location),HEAP32,value>>2,count)}function _glUniform2fv(location,count,value){count&&GLctx.uniform2fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*2)}function _glUniform2iv(location,count,value){count&&GLctx.uniform2iv(webglGetUniformLocation(location),HEAP32,value>>2,count*2)}function _glUniform3fv(location,count,value){count&&GLctx.uniform3fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*3)}function _glUniform3iv(location,count,value){count&&GLctx.uniform3iv(webglGetUniformLocation(location),HEAP32,value>>2,count*3)}function _glUniform4fv(location,count,value){count&&GLctx.uniform4fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*4)}function _glUniform4iv(location,count,value){count&&GLctx.uniform4iv(webglGetUniformLocation(location),HEAP32,value>>2,count*4)}function _glUniformBlockBinding(program,uniformBlockIndex,uniformBlockBinding){program=GL.programs[program];GLctx["uniformBlockBinding"](program,uniformBlockIndex,uniformBlockBinding)}function _glUniformMatrix3fv(location,count,transpose,value){count&&GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*9)}function _glUniformMatrix4fv(location,count,transpose,value){count&&GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*16)}function _glUnmapBuffer(target){if(!emscriptenWebGLValidateMapBufferTarget(target)){GL.recordError(1280);err("GL_INVALID_ENUM in glUnmapBuffer");return 0}var buffer=emscriptenWebGLGetBufferBinding(target);var mapping=GL.mappedBuffers[buffer];if(!mapping){GL.recordError(1282);err("buffer was never mapped in glUnmapBuffer");return 0}GL.mappedBuffers[buffer]=null;if(!(mapping.access&16))if(true){GLctx.bufferSubData(target,mapping.offset,HEAPU8,mapping.mem,mapping.length)}else{GLctx.bufferSubData(target,mapping.offset,HEAPU8.subarray(mapping.mem,mapping.mem+mapping.length))}_free(mapping.mem);return 1}function _glUseProgram(program){program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program}function _glVertexAttrib4f(x0,x1,x2,x3,x4){GLctx["vertexAttrib4f"](x0,x1,x2,x3,x4)}function _glVertexAttribI4ui(x0,x1,x2,x3,x4){GLctx["vertexAttribI4ui"](x0,x1,x2,x3,x4)}function _glVertexAttribIPointer(index,size,type,stride,ptr){var cb=GL.currentContext.clientBuffers[index];if(!GLctx.currentArrayBufferBinding){cb.size=size;cb.type=type;cb.normalized=false;cb.stride=stride;cb.ptr=ptr;cb.clientside=true;cb.vertexAttribPointerAdaptor=function(index,size,type,normalized,stride,ptr){this.vertexAttribIPointer(index,size,type,stride,ptr)};return}cb.clientside=false;GLctx["vertexAttribIPointer"](index,size,type,stride,ptr)}function _glVertexAttribPointer(index,size,type,normalized,stride,ptr){var cb=GL.currentContext.clientBuffers[index];if(!GLctx.currentArrayBufferBinding){cb.size=size;cb.type=type;cb.normalized=normalized;cb.stride=stride;cb.ptr=ptr;cb.clientside=true;cb.vertexAttribPointerAdaptor=function(index,size,type,normalized,stride,ptr){this.vertexAttribPointer(index,size,type,normalized,stride,ptr)};return}cb.clientside=false;GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}function _glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,x3)}function _setTempRet0(val){setTempRet0(val)}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm){return _strftime(s,maxsize,format,tm)}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();InternalError=Module["InternalError"]=extendError(Error,"InternalError");embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");init_ClassHandle();init_embind();init_RegisteredPointer();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();var GLctx;for(var i=0;i<32;++i)tempFixedLengthArray.push(new Array(i));function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var asmLibraryArg={"Ga":___syscall_fcntl64,"Lb":___syscall_ioctl,"Mb":___syscall_openat,"Hb":___syscall_stat64,"x":__embind_finalize_value_array,"l":__embind_finalize_value_object,"Bb":__embind_register_bigint,"Sb":__embind_register_bool,"f":__embind_register_class,"k":__embind_register_class_class_function,"o":__embind_register_class_constructor,"a":__embind_register_class_function,"w":__embind_register_class_property,"Rb":__embind_register_emval,"j":__embind_register_enum,"b":__embind_register_enum_value,"Ia":__embind_register_float,"da":__embind_register_function,"B":__embind_register_integer,"q":__embind_register_memory_view,"Ha":__embind_register_std_string,"pa":__embind_register_std_wstring,"y":__embind_register_value_array,"h":__embind_register_value_array_element,"m":__embind_register_value_object,"d":__embind_register_value_object_field,"Tb":__embind_register_void,"Pb":__emscripten_date_now,"zb":__emscripten_err,"Ob":__emscripten_get_now_is_monotonic,"yb":__emscripten_out,"s":__emval_as,"i":__emval_decref,"t":__emval_get_property,"ca":__emval_incref,"G":__emval_new_cstring,"r":__emval_run_destructors,"u":__emval_take_value,"c":_abort,"qa":_emscripten_asm_const_int,"Gb":_emscripten_get_heap_max,"Nb":_emscripten_get_now,"Qb":_emscripten_memcpy_big,"Fb":_emscripten_resize_heap,"Ib":_environ_get,"Jb":_environ_sizes_get,"oa":_fd_close,"Kb":_fd_read,"Ab":_fd_seek,"Fa":_fd_write,"Db":_getentropy,"e":_glActiveTexture,"na":_glAttachShader,"kb":_glBeginQuery,"sb":_glBindAttribLocation,"n":_glBindBuffer,"va":_glBindBufferBase,"Wa":_glBindBufferRange,"P":_glBindFramebuffer,"Oa":_glBindRenderbuffer,"_":_glBindSampler,"g":_glBindTexture,"gb":_glBindVertexArray,"xa":_glBlendEquationSeparate,"wa":_glBlendFuncSeparate,"fa":_glBlitFramebuffer,"E":_glBufferData,"ga":_glBufferSubData,"Xb":_glClear,"ac":_glClearBufferfi,"C":_glClearBufferfv,"$b":_glClearBufferiv,"_b":_glClearColor,"Zb":_glClearDepthf,"Yb":_glClearStencil,"Cb":_glClientWaitSync,"la":_glColorMask,"tb":_glCompileShader,"La":_glCompressedTexSubImage2D,"Ka":_glCompressedTexSubImage3D,"lc":_glCopyBufferSubData,"Ea":_glCreateProgram,"vb":_glCreateShader,"ya":_glCullFace,"ia":_glDeleteBuffers,"U":_glDeleteFramebuffers,"$":_glDeleteProgram,"jb":_glDeleteQueries,"Ta":_glDeleteRenderbuffers,"Aa":_glDeleteSamplers,"R":_glDeleteShader,"Qa":_glDeleteSync,"Ua":_glDeleteTextures,"hb":_glDeleteVertexArrays,"ma":_glDepthFunc,"ka":_glDepthMask,"sa":_glDepthRangef,"S":_glDetachShader,"p":_glDisable,"dc":_glDisableVertexAttribArray,"kc":_glDrawBuffers,"Ja":_glDrawElements,"Ra":_glDrawElementsInstanced,"v":_glEnable,"ec":_glEnableVertexAttribArray,"lb":_glEndQuery,"ha":_glFenceSync,"Da":_glFinish,"ob":_glFlush,"H":_glFramebufferRenderbuffer,"A":_glFramebufferTexture2D,"L":_glFramebufferTextureLayer,"za":_glFrontFace,"X":_glGenBuffers,"ea":_glGenFramebuffers,"ib":_glGenQueries,"ra":_glGenRenderbuffers,"Ca":_glGenSamplers,"M":_glGenTextures,"fb":_glGenVertexArrays,"nc":_glGenerateMipmap,"Wb":_glGetBufferSubData,"aa":_glGetError,"eb":_glGetFloatv,"z":_glGetIntegerv,"wb":_glGetProgramBinary,"pb":_glGetProgramInfoLog,"T":_glGetProgramiv,"mb":_glGetQueryObjectuiv,"qb":_glGetShaderInfoLog,"Q":_glGetShaderiv,"J":_glGetString,"cb":_glGetUniformBlockIndex,"W":_glGetUniformLocation,"db":_glHint,"nb":_glInvalidateFramebuffer,"rb":_glLinkProgram,"Vb":_glMapBufferRange,"N":_glPixelStorei,"ja":_glPolygonOffset,"xb":_glProgramBinary,"Sa":_glReadPixels,"bc":_glRenderbufferStorage,"cc":_glRenderbufferStorageMultisample,"Ba":_glSamplerParameterf,"I":_glSamplerParameteri,"ua":_glScissor,"ub":_glShaderSource,"Z":_glStencilFuncSeparate,"F":_glStencilMaskSeparate,"Y":_glStencilOpSeparate,"K":_glTexImage2D,"Va":_glTexParameterf,"D":_glTexParameteri,"jc":_glTexStorage2D,"Pa":_glTexStorage3D,"Na":_glTexSubImage2D,"Ma":_glTexSubImage3D,"mc":_glUniform1f,"ab":_glUniform1fv,"V":_glUniform1i,"Ya":_glUniform1iv,"$a":_glUniform2fv,"Xa":_glUniform2iv,"_a":_glUniform3fv,"rc":_glUniform3iv,"Za":_glUniform4fv,"qc":_glUniform4iv,"bb":_glUniformBlockBinding,"pc":_glUniformMatrix3fv,"oc":_glUniformMatrix4fv,"Ub":_glUnmapBuffer,"O":_glUseProgram,"fc":_glVertexAttrib4f,"gc":_glVertexAttribI4ui,"ic":_glVertexAttribIPointer,"hc":_glVertexAttribPointer,"ta":_glViewport,"ba":_setTempRet0,"Eb":_strftime_l};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["tc"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["vc"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["wc"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["xc"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["yc"]).apply(null,arguments)};var ___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=function(){return(___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=Module["asm"]["zc"]).apply(null,arguments)};var dynCall_ji=Module["dynCall_ji"]=function(){return(dynCall_ji=Module["dynCall_ji"]=Module["asm"]["Ac"]).apply(null,arguments)};var dynCall_j=Module["dynCall_j"]=function(){return(dynCall_j=Module["dynCall_j"]=Module["asm"]["Bc"]).apply(null,arguments)};var dynCall_vij=Module["dynCall_vij"]=function(){return(dynCall_vij=Module["dynCall_vij"]=Module["asm"]["Cc"]).apply(null,arguments)};var dynCall_viij=Module["dynCall_viij"]=function(){return(dynCall_viij=Module["dynCall_viij"]=Module["asm"]["Dc"]).apply(null,arguments)};var dynCall_iiiiij=Module["dynCall_iiiiij"]=function(){return(dynCall_iiiiij=Module["dynCall_iiiiij"]=Module["asm"]["Ec"]).apply(null,arguments)};var dynCall_jii=Module["dynCall_jii"]=function(){return(dynCall_jii=Module["dynCall_jii"]=Module["asm"]["Fc"]).apply(null,arguments)};var dynCall_iiij=Module["dynCall_iiij"]=function(){return(dynCall_iiij=Module["dynCall_iiij"]=Module["asm"]["Gc"]).apply(null,arguments)};var dynCall_iiiij=Module["dynCall_iiiij"]=function(){return(dynCall_iiiij=Module["dynCall_iiiij"]=Module["asm"]["Hc"]).apply(null,arguments)};var dynCall_vijji=Module["dynCall_vijji"]=function(){return(dynCall_vijji=Module["dynCall_vijji"]=Module["asm"]["Ic"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["Jc"]).apply(null,arguments)};var dynCall_viijii=Module["dynCall_viijii"]=function(){return(dynCall_viijii=Module["dynCall_viijii"]=Module["asm"]["Kc"]).apply(null,arguments)};var dynCall_iiiiijj=Module["dynCall_iiiiijj"]=function(){return(dynCall_iiiiijj=Module["dynCall_iiiiijj"]=Module["asm"]["Lc"]).apply(null,arguments)};var dynCall_iiiiiijj=Module["dynCall_iiiiiijj"]=function(){return(dynCall_iiiiiijj=Module["dynCall_iiiiiijj"]=Module["asm"]["Mc"]).apply(null,arguments)};var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run(); return Filament.ready @@ -173,13 +173,13 @@ Filament.loadGeneratedExtensions = function() { // JavaScript binding for dirt is not yet supported, must use default value. // JavaScript binding for dirtStrength is not yet supported, must use default value. strength: 0.10, - resolution: 360, - anamorphism: 1.0, + resolution: 384, levels: 6, blendMode: Filament.View$BloomOptions$BlendMode.ADD, threshold: true, enabled: false, highlight: 1000.0, + quality: Filament.View$QualityLevel.LOW, lensFlare: false, starburst: true, chromaticAberration: 0.005, @@ -196,14 +196,16 @@ Filament.loadGeneratedExtensions = function() { Filament.View.prototype.setFogOptionsDefaults = function(overrides) { const options = { distance: 0.0, + cutOffDistance: Infinity, maximumOpacity: 1.0, height: 0.0, heightFalloff: 1.0, - color: [0.5, 0.5, 0.5], + color: [ 1.0, 1.0, 1.0 ], density: 0.1, inScatteringStart: 0.0, inScatteringSize: -1.0, fogColorFromIbl: false, + // JavaScript binding for skyColor is not yet supported, must use default value. enabled: false, }; return Object.assign(options, overrides); @@ -212,6 +214,7 @@ Filament.loadGeneratedExtensions = function() { Filament.View.prototype.setDepthOfFieldOptionsDefaults = function(overrides) { const options = { cocScale: 1.0, + cocAspectRatio: 1.0, maxApertureDiameter: 0.01, enabled: false, filter: Filament.View$DepthOfFieldOptions$Filter.MEDIAN, @@ -290,8 +293,20 @@ Filament.loadGeneratedExtensions = function() { Filament.View.prototype.setTemporalAntiAliasingOptionsDefaults = function(overrides) { const options = { filterWidth: 1.0, - feedback: 0.04, + feedback: 0.12, + lodBias: -1.0, + sharpness: 0.0, enabled: false, + upscaling: false, + filterHistory: true, + filterInput: true, + useYCoCg: false, + boxType: Filament.View$TemporalAntiAliasingOptions$BoxType.AABB, + boxClipping: Filament.View$TemporalAntiAliasingOptions$BoxClipping.ACCURATE, + jitterPattern: Filament.View$TemporalAntiAliasingOptions$JitterPattern.HALTON_23_X16, + varianceGamma: 1.0, + preventFlickering: false, + historyReprojection: true, }; return Object.assign(options, overrides); }; @@ -334,6 +349,13 @@ Filament.loadGeneratedExtensions = function() { return Object.assign(options, overrides); }; + Filament.View.prototype.setStereoscopicOptionsDefaults = function(overrides) { + const options = { + enabled: false, + }; + return Object.assign(options, overrides); + }; + }; /* @@ -677,6 +699,12 @@ Filament.loadClassExtensions = function() { this._setGuardBandOptions(options); }; + /// setStereoscopicOptions ::method:: + Filament.View.prototype.setStereoscopicOptions = function(overrides) { + const options = this.setStereoscopicOptionsDefaults(overrides); + this._setStereoscopicOptions(options); + } + /// BufferObject ::core class:: /// setBuffer ::method:: diff --git a/docs/remote/filament.wasm b/docs/remote/filament.wasm index 2c5360c7aee..ebf6f07e370 100755 Binary files a/docs/remote/filament.wasm and b/docs/remote/filament.wasm differ diff --git a/docs/viewer/filament-viewer.js b/docs/viewer/filament-viewer.js index 01439952f48..652d55d8ae4 100644 --- a/docs/viewer/filament-viewer.js +++ b/docs/viewer/filament-viewer.js @@ -15,7 +15,7 @@ */ // If you are bundling this with rollup, webpack, or esbuild, the following URL should be trimmed. -import { LitElement, html, css } from "https://unpkg.com/lit?module"; +import { LitElement, html, css } from "https://unpkg.com/lit@2.8.0?module"; // This little utility checks if the Filament module is ready for action. // If so, it immediately calls the given function. If not, it asks the Filament @@ -287,12 +287,12 @@ class FilamentViewer extends LitElement { // Dropping a glb file is simple because there are no external resources. if (this.srcBlob && this.srcBlob.name.endsWith(".glb")) { this.srcBlob.arrayBuffer().then(buffer => { - this.asset = this.loader.createAssetFromBinary(new Uint8Array(buffer)); + this.asset = this.loader.createAsset(new Uint8Array(buffer)); const aabb = this.asset.getBoundingBox(); this.assetRoot = this.asset.getRoot(); this.unitCubeTransform = Filament.fitIntoUnitCube(aabb, zoffset); this.asset.loadResources(); - this.animator = this.asset.getAnimator(); + this.animator = this.asset.getInstance().getAnimator(); this.animationStartTime = Date.now(); this._updateOverlay(); }); @@ -304,8 +304,6 @@ class FilamentViewer extends LitElement { const config = { normalizeSkinningWeights: true, - recomputeBoundingBoxes: false, - ignoreBindTransform: false, asyncInterval: 30 }; @@ -320,22 +318,20 @@ class FilamentViewer extends LitElement { resourceLoader.delete(); stbProvider.delete(); ktx2Provider.delete(); - this.animator = this.asset.getAnimator(); + this.animator = this.asset.getInstance().getAnimator(); this.animationStartTime = Date.now(); } }, config.asyncInterval); }; this.srcBlob.arrayBuffer().then(buffer => { - this.asset = this.loader.createAssetFromJson(new Uint8Array(buffer)); + this.asset = this.loader.createAsset(new Uint8Array(buffer)); const aabb = this.asset.getBoundingBox(); this.assetRoot = this.asset.getRoot(); this.unitCubeTransform = Filament.fitIntoUnitCube(aabb, zoffset); const resourceLoader = new Filament.gltfio$ResourceLoader(this.engine, - config.normalizeSkinningWeights, - config.recomputeBoundingBoxes, - config.ignoreBindTransform); + config.normalizeSkinningWeights); const stbProvider = new Filament.gltfio$StbProvider(this.engine); const ktx2Provider = new Filament.gltfio$Ktx2Provider(this.engine); @@ -367,12 +363,7 @@ class FilamentViewer extends LitElement { return response.arrayBuffer(); }).then(arrayBuffer => { const modelData = new Uint8Array(arrayBuffer); - if (this.src.endsWith(".glb")) { - this.asset = this.loader.createAssetFromBinary(modelData); - } else { - this.asset = this.loader.createAssetFromJson(modelData); - } - + this.asset = this.loader.createAsset(modelData); const aabb = this.asset.getBoundingBox(); this.assetRoot = this.asset.getRoot(); this.unitCubeTransform = Filament.fitIntoUnitCube(aabb, zoffset); @@ -380,7 +371,7 @@ class FilamentViewer extends LitElement { const basePath = '' + new URL(this.src, document.location); this.asset.loadResources(() => { - this.animator = this.asset.getAnimator(); + this.animator = this.asset.getInstance().getAnimator(); this.animationStartTime = Date.now(); this._applyMaterialVariant(); }, null, basePath); @@ -441,14 +432,15 @@ class FilamentViewer extends LitElement { if (!this.hasAttribute("materialVariant")) { return; } - const names = this.asset.getMaterialVariantNames(); + const instance = this.asset.getInstance(); + const names = instance.getMaterialVariantNames(); const index = this.materialVariant; if (index < 0 || index >= names.length) { console.error(`Material variant ${index} does not exist in this asset.`); return; } console.info(this.src, `Applying material variant: ${names[index]}`); - this.asset.applyMaterialVariant(index); + instance.applyMaterialVariant(index); } } diff --git a/docs/viewer/index.html b/docs/viewer/index.html index 8d1ca5a7609..1bb823d718e 100644 --- a/docs/viewer/index.html +++ b/docs/viewer/index.html @@ -43,7 +43,7 @@

    - + diff --git a/docs/webgl/albedo.ktx2 b/docs/webgl/albedo.ktx2 new file mode 100644 index 00000000000..6af67d329b5 Binary files /dev/null and b/docs/webgl/albedo.ktx2 differ diff --git a/docs/webgl/ao.ktx2 b/docs/webgl/ao.ktx2 new file mode 100644 index 00000000000..a39c250e65d Binary files /dev/null and b/docs/webgl/ao.ktx2 differ diff --git a/docs/webgl/default_env/default_env_ibl.ktx b/docs/webgl/default_env/default_env_ibl.ktx index 0fd6f9ee1b5..2cc9b33270e 100644 Binary files a/docs/webgl/default_env/default_env_ibl.ktx and b/docs/webgl/default_env/default_env_ibl.ktx differ diff --git a/docs/webgl/default_env/default_env_skybox.ktx b/docs/webgl/default_env/default_env_skybox.ktx index fe758498214..798b2b67764 100644 Binary files a/docs/webgl/default_env/default_env_skybox.ktx and b/docs/webgl/default_env/default_env_skybox.ktx differ diff --git a/docs/webgl/filament.js b/docs/webgl/filament.js index 024e3e9e6d8..7a093e04856 100644 --- a/docs/webgl/filament.js +++ b/docs/webgl/filament.js @@ -3,22 +3,20 @@ var Filament = (() => { var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; return ( -function(Filament) { - Filament = Filament || {}; +function(moduleArg = {}) { -var Module=typeof Filament!="undefined"?Filament:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}var fs;var nodePath;var requireNodeFS;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}requireNodeFS=()=>{if(!nodePath){fs=require("fs");nodePath=require("path")}};read_=function shell_read(filename,binary){requireNodeFS();filename=nodePath["normalize"](filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{requireNodeFS();filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",function(reason){throw reason});quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var tempRet0=0;var setTempRet0=value=>{tempRet0=value};var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf-16le"):undefined;function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder){return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr))}else{var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="filament.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["Zb"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["$b"];addOnInit(Module["asm"]["_b"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}var tempDouble;var tempI64;var ASM_CONSTS={1005868:()=>{const options=window.filament_glOptions;const context=window.filament_glContext;const handle=GL.registerContext(context,options);window.filament_contextHandle=handle;GL.makeContextCurrent(handle)},1006082:()=>{const handle=window.filament_contextHandle;GL.makeContextCurrent(handle)},1006163:($0,$1,$2,$3,$4,$5)=>{const fn=Emval.toValue($0);fn({"renderable":Emval.toValue($1),"depth":$2,"fragCoords":[$3,$4,$5]})}};function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return function(){return crypto_module["randomBytes"](1)[0]}}catch(e){}}return function(){abort("randomDevice")}}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){abort()}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{path=PATH_FS.resolve(FS.cwd(),path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(p=>!!p),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get:function(){return this.shared.position},set:function(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>{return parent.node_ops.lookup(parent,name)},mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;for(var i=0;i{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{return null}},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node},createPreloadedFile:(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(Browser.handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=()=>{out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=()=>{ok++;if(ok+fail==total)finish()};putRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(8);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}var tupleRegistrations={};function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAP32[pointer>>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}return name}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i{if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push(()=>{typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}});if(0===unregisteredTypes.length){onComplete(typeConverters)}}function __embind_finalize_value_array(rawTupleType){var reg=tupleRegistrations[rawTupleType];delete tupleRegistrations[rawTupleType];var elements=reg.elements;var elementsLength=elements.length;var elementTypes=elements.map(function(elt){return elt.getterReturnType}).concat(elements.map(function(elt){return elt.setterArgumentType}));var rawConstructor=reg.rawConstructor;var rawDestructor=reg.rawDestructor;whenDependentTypesAreResolved([rawTupleType],elementTypes,function(elementTypes){elements.forEach((elt,i)=>{var getterReturnType=elementTypes[i];var getter=elt.getter;var getterContext=elt.getterContext;var setterArgumentType=elementTypes[i+elementsLength];var setter=elt.setter;var setterContext=elt.setterContext;elt.read=ptr=>{return getterReturnType["fromWireType"](getter(getterContext,ptr))};elt.write=(ptr,o)=>{var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,o));runDestructors(destructors)}});return[{name:reg.name,"fromWireType":function(ptr){var rv=new Array(elementsLength);for(var i=0;ifield.getterReturnType).concat(fieldRecords.map(field=>field.setterArgumentType));whenDependentTypesAreResolved([structType],fieldTypes,fieldTypes=>{var fields={};fieldRecords.forEach((field,i)=>{var fieldName=field.fieldName;var getterReturnType=fieldTypes[i];var getter=field.getter;var getterContext=field.getterContext;var setterArgumentType=fieldTypes[i+fieldRecords.length];var setter=field.setter;var setterContext=field.setterContext;fields[fieldName]={read:ptr=>{return getterReturnType["fromWireType"](getter(getterContext,ptr))},write:(ptr,o)=>{var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,o));runDestructors(destructors)}}});return[{name:reg.name,"fromWireType":function(ptr){var rv={};for(var i in fields){rv[i]=fields[i].read(ptr)}rawDestructor(ptr);return rv},"toWireType":function(destructors,o){for(var fieldName in fields){if(!(fieldName in o)){throw new TypeError('Missing field: "'+fieldName+'"')}}var ptr=rawConstructor();for(fieldName in fields){fields[fieldName].write(ptr,o[fieldName])}if(destructors!==null){destructors.push(rawDestructor,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:rawDestructor}]})}function __embind_register_bigint(primitiveType,name,size,minRange,maxRange){}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}function registerType(rawType,registeredInstance,options={}){if(!("argPackAdvance"in registeredInstance)){throw new TypeError("registerType registeredInstance requires argPackAdvance")}var name=registeredInstance.name;if(!rawType){throwBindingError('type "'+name+'" must have a positive integer typeid pointer')}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError("Cannot register type '"+name+"' twice")}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(cb=>cb())}}function __embind_register_bool(rawType,name,size,trueValue,falseValue){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(wt){return!!wt},"toWireType":function(destructors,o){return o?trueValue:falseValue},"argPackAdvance":8,"readValueFromPointer":function(pointer){var heap;if(size===1){heap=HEAP8}else if(size===2){heap=HEAP16}else if(size===4){heap=HEAP32}else{throw new TypeError("Unknown boolean type size: "+name)}return this["fromWireType"](heap[pointer>>shift])},destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}var finalizationRegistry=false;function detachFinalizer(handle){}function runDestructor($$){if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function releaseClassHandle($$){$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}var registeredPointers={};function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}var delayFunction=undefined;function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record}}))}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function attachFinalizer(handle){if("undefined"===typeof FinalizationRegistry){attachFinalizer=handle=>handle;return handle}finalizationRegistry=new FinalizationRegistry(info=>{releaseClassHandle(info.$$)});attachFinalizer=handle=>{var $$=handle.$$;var hasSmartPtr=!!$$.smartPtr;if(hasSmartPtr){var info={$$:$$};finalizationRegistry.register(handle,info,handle)}return handle};detachFinalizer=handle=>finalizationRegistry.unregister(handle);return attachFinalizer(handle)}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+embindRepr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+embindRepr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,Emval.toHandle(function(){clonedHandle["delete"]()}));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+embindRepr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function dynCall(sig,ptr,args){if(sig.includes("j")){return dynCallLegacy(sig,ptr,args)}var rtn=getWasmTableEntry(ptr).apply(null,args);return rtn}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=0;Object.assign(argCache,arguments);return dynCall(sig,ptr,argCache)}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(){if(signature.includes("j")){return getDynCaller(signature,rawFunction)}return getWasmTableEntry(rawFunction)}var fp=makeDynCaller();if(typeof fp!="function"){throwBindingError("unknown function pointer with signature "+signature+": "+rawFunction)}return fp}var UnboundTypeError=undefined;function getTypeName(type){var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv}function throwUnboundTypeError(message,types){var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(message+": "+unboundTypes.map(getTypeName).join([", "]))}function __embind_register_class(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor){name=readLatin1String(name);getActualType=embind__requireFunction(getActualTypeSignature,getActualType);if(upcast){upcast=embind__requireFunction(upcastSignature,upcast)}if(downcast){downcast=embind__requireFunction(downcastSignature,downcast)}rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,function(){throwUnboundTypeError("Cannot construct "+name+" due to unbound types",[baseClassRawType])});whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],function(base){base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype}else{basePrototype=ClassHandle.prototype}var constructor=createNamedFunction(legalFunctionName,function(){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError("Use 'new' to construct "+name)}if(undefined===registeredClass.constructor_body){throw new BindingError(name+" has no accessible constructor")}var body=registeredClass.constructor_body[arguments.length];if(undefined===body){throw new BindingError("Tried to invoke ctor of "+name+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(registeredClass.constructor_body).toString()+") parameters instead!")}return body.apply(this,arguments)});var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+"*",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+" const*",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return[referenceConverter,pointerConverter,constPointerConverter]})}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i>2])}return array}function __embind_register_class_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,fn){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=classType.name+"."+methodName;function unboundTypesHandler(){throwUnboundTypeError("Cannot call "+humanName+" due to unbound types",rawArgTypes)}if(methodName.startsWith("@@")){methodName=Symbol[methodName.substring(2)]}var proto=classType.registeredClass.constructor;if(undefined===proto[methodName]){unboundTypesHandler.argCount=argCount-1;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-1]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));var func=craftInvokerFunction(humanName,invokerArgsArray,null,rawInvoker,fn);if(undefined===proto[methodName].overloadTable){func.argCount=argCount-1;proto[methodName]=func}else{proto[methodName].overloadTable[argCount-1]=func}return[]});return[]})}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){assert(argCount>0);var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=()=>{throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){argTypes.splice(1,0,null);classType.registeredClass.constructor_body[argCount-1]=craftInvokerFunction(humanName,argTypes,null,invoker,rawConstructor);return[]});return[]})}function __embind_register_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,context,isPureVirtual){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=classType.name+"."+methodName;if(methodName.startsWith("@@")){methodName=Symbol[methodName.substring(2)]}if(isPureVirtual){classType.registeredClass.pureVirtualFunctions.push(methodName)}function unboundTypesHandler(){throwUnboundTypeError("Cannot call "+humanName+" due to unbound types",rawArgTypes)}var proto=classType.registeredClass.instancePrototype;var method=proto[methodName];if(undefined===method||undefined===method.overloadTable&&method.className!==classType.name&&method.argCount===argCount-2){unboundTypesHandler.argCount=argCount-2;unboundTypesHandler.className=classType.name;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-2]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){var memberFunction=craftInvokerFunction(humanName,argTypes,classType,rawInvoker,context);if(undefined===proto[methodName].overloadTable){memberFunction.argCount=argCount-2;proto[methodName]=memberFunction}else{proto[methodName].overloadTable[argCount-2]=memberFunction}return[]});return[]})}function validateThis(this_,classType,humanName){if(!(this_ instanceof Object)){throwBindingError(humanName+' with invalid "this": '+this_)}if(!(this_ instanceof classType.registeredClass.constructor)){throwBindingError(humanName+' incompatible with "this" of type '+this_.constructor.name)}if(!this_.$$.ptr){throwBindingError("cannot call emscripten binding method "+humanName+" on deleted object")}return upcastPointer(this_.$$.ptr,this_.$$.ptrType.registeredClass,classType.registeredClass)}function __embind_register_class_property(classType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext){fieldName=readLatin1String(fieldName);getter=embind__requireFunction(getterSignature,getter);whenDependentTypesAreResolved([],[classType],function(classType){classType=classType[0];var humanName=classType.name+"."+fieldName;var desc={get:function(){throwUnboundTypeError("Cannot access "+humanName+" due to unbound types",[getterReturnType,setterArgumentType])},enumerable:true,configurable:true};if(setter){desc.set=()=>{throwUnboundTypeError("Cannot access "+humanName+" due to unbound types",[getterReturnType,setterArgumentType])}}else{desc.set=v=>{throwBindingError(humanName+" is a read-only property")}}Object.defineProperty(classType.registeredClass.instancePrototype,fieldName,desc);whenDependentTypesAreResolved([],setter?[getterReturnType,setterArgumentType]:[getterReturnType],function(types){var getterReturnType=types[0];var desc={get:function(){var ptr=validateThis(this,classType,humanName+" getter");return getterReturnType["fromWireType"](getter(getterContext,ptr))},enumerable:true};if(setter){setter=embind__requireFunction(setterSignature,setter);var setterArgumentType=types[1];desc.set=function(v){var ptr=validateThis(this,classType,humanName+" setter");var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,v));runDestructors(destructors)}}Object.defineProperty(classType.registeredClass.instancePrototype,fieldName,desc);return[]});return[]})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i{if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value},toHandle:value=>{switch(value){case undefined:return 1;case null:return 2;case true:return 3;case false:return 4;default:{var handle=emval_free_list.length?emval_free_list.pop():emval_handle_array.length;emval_handle_array[handle]={refcount:1,value:value};return handle}}}};function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(handle){var rv=Emval.toValue(handle);__emval_decref(handle);return rv},"toWireType":function(destructors,value){return Emval.toHandle(value)},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function enumReadValueFromPointer(name,shift,signed){switch(shift){case 0:return function(pointer){var heap=signed?HEAP8:HEAPU8;return this["fromWireType"](heap[pointer])};case 1:return function(pointer){var heap=signed?HEAP16:HEAPU16;return this["fromWireType"](heap[pointer>>1])};case 2:return function(pointer){var heap=signed?HEAP32:HEAPU32;return this["fromWireType"](heap[pointer>>2])};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_enum(rawType,name,size,isSigned){var shift=getShiftFromSize(size);name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,"fromWireType":function(c){return this.constructor.values[c]},"toWireType":function(destructors,c){return c.value},"argPackAdvance":8,"readValueFromPointer":enumReadValueFromPointer(name,shift,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __embind_register_enum_value(rawEnumType,name,enumValue){var enumType=requireRegisteredType(rawEnumType,"enum");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(enumType.name+"_"+name,function(){})}});Enum.values[enumValue]=Value;Enum[name]=Value}function embindRepr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function __embind_register_function(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn){var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,function(){throwUnboundTypeError("Cannot call "+name+" due to unbound types",argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn),argCount-1);return[]})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=value=>value;if(minRange===0){var bitshift=32-8*size;fromWireType=value=>value<>>bitshift}var isUnsignedType=name.includes("unsigned");var checkAssertions=(value,toTypeName)=>{};var toWireType;if(isUnsignedType){toWireType=function(destructors,value){checkAssertions(value,this.name);return value>>>0}}else{toWireType=function(destructors,value){checkAssertions(value,this.name);return value}}registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":toWireType,"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var payload=value+4;var str;if(stdStringIsUTF8){var decodeStartPtr=payload;for(var i=0;i<=length;++i){var currentBytePtr=payload+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+i]=charCode}}else{for(var i=0;iHEAPU16;shift=1}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;getHeap=()=>HEAPU32;shift=2}registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value=="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_value_array(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor){tupleRegistrations[rawType]={name:readLatin1String(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),elements:[]}}function __embind_register_value_array_element(rawTupleType,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext){tupleRegistrations[rawTupleType].elements.push({getterReturnType:getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext:getterContext,setterArgumentType:setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext:setterContext})}function __embind_register_value_object(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor){structRegistrations[rawType]={name:readLatin1String(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),fields:[]}}function __embind_register_value_object_field(structType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext){structRegistrations[structType].fields.push({fieldName:readLatin1String(fieldName),getterReturnType:getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext:getterContext,setterArgumentType:setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext:setterContext})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}var nowIsMonotonic=true;function __emscripten_get_now_is_monotonic(){return nowIsMonotonic}function __emval_as(handle,returnType,destructorsRef){handle=Emval.toValue(handle);returnType=requireRegisteredType(returnType,"emval::as");var destructors=[];var rd=Emval.toHandle(destructors);HEAPU32[destructorsRef>>2]=rd;return returnType["toWireType"](destructors,handle)}function __emval_get_property(handle,key){handle=Emval.toValue(handle);key=Emval.toValue(key);return Emval.toHandle(handle[key])}function __emval_incref(handle){if(handle>4){emval_handle_array[handle].refcount+=1}}var emval_symbols={};function getStringOrSymbol(address){var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}return symbol}function __emval_new_cstring(v){return Emval.toHandle(getStringOrSymbol(v))}function __emval_run_destructors(handle){var destructors=Emval.toValue(handle);runDestructors(destructors);__emval_decref(handle)}function __emval_take_value(type,arg){type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](arg);return Emval.toHandle(v)}function _abort(){abort("")}var readAsmConstArgsArray=[];function readAsmConstArgs(sigPtr,buf){readAsmConstArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){buf+=ch!=105&buf;readAsmConstArgsArray.push(ch==105?HEAP32[buf]:HEAPF64[buf++>>1]);++buf}return readAsmConstArgsArray}function _emscripten_asm_const_int(code,sigPtr,argbuf){var args=readAsmConstArgs(sigPtr,argbuf);return ASM_CONSTS[code].apply(null,args)}function getHeapMax(){return 2147483648}function _emscripten_get_heap_max(){return getHeapMax()}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=()=>{var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else _emscripten_get_now=()=>performance.now();function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doReadv(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var offset=convertI32PairToI53Checked(offset_low,offset_high);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doWritev(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function _getentropy(buffer,size){if(!_getentropy.randomDevice){_getentropy.randomDevice=getRandomDevice()}for(var i=0;i>0]=_getentropy.randomDevice()}return 0}function __webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(ctx){return!!(ctx.dibvbi=ctx.getExtension("WEBGL_draw_instanced_base_vertex_base_instance"))}function __webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(ctx){return!!(ctx.mdibvbi=ctx.getExtension("WEBGL_multi_draw_instanced_base_vertex_base_instance"))}function __webgl_enable_WEBGL_multi_draw(ctx){return!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"))}var GL={counter:1,buffers:[],mappedBuffers:{},programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:[],offscreenCanvases:{},queries:[],samplers:[],transformFeedbacks:[],syncs:[],byteSizeByTypeRoot:5120,byteSizeByType:[1,1,2,2,4,4,4,2,3,4,8],stringCache:{},stringiCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:function(table){var ret=GL.counter++;for(var i=table.length;i>1;var quadIndexes=new Uint16Array(numIndexes);var i=0,v=0;while(1){quadIndexes[i++]=v;if(i>=numIndexes)break;quadIndexes[i++]=v+1;if(i>=numIndexes)break;quadIndexes[i++]=v+2;if(i>=numIndexes)break;quadIndexes[i++]=v;if(i>=numIndexes)break;quadIndexes[i++]=v+2;if(i>=numIndexes)break;quadIndexes[i++]=v+3;if(i>=numIndexes)break;v+=4}context.GLctx.bufferData(34963,quadIndexes,35044);context.GLctx.bindBuffer(34963,null)}},getTempVertexBuffer:function getTempVertexBuffer(sizeBytes){var idx=GL.log2ceilLookup(sizeBytes);var ringbuffer=GL.currentContext.tempVertexBuffers1[idx];var nextFreeBufferIndex=GL.currentContext.tempVertexBufferCounters1[idx];GL.currentContext.tempVertexBufferCounters1[idx]=GL.currentContext.tempVertexBufferCounters1[idx]+1&GL.numTempVertexBuffersPerSize-1;var vbo=ringbuffer[nextFreeBufferIndex];if(vbo){return vbo}var prevVBO=GLctx.getParameter(34964);ringbuffer[nextFreeBufferIndex]=GLctx.createBuffer();GLctx.bindBuffer(34962,ringbuffer[nextFreeBufferIndex]);GLctx.bufferData(34962,1<>2]:-1;source+=UTF8ToString(HEAP32[string+i*4>>2],len<0?undefined:len)}return source},calcBufLength:function calcBufLength(size,type,stride,count){if(stride>0){return count*stride}var typeSize=GL.byteSizeByType[type-GL.byteSizeByTypeRoot];return size*typeSize*count},usedTempBuffers:[],preDrawHandleClientVertexAttribBindings:function preDrawHandleClientVertexAttribBindings(count){GL.resetBufferBinding=false;for(var i=0;i=2){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query_webgl2")}if(context.version<2||!GLctx.disjointTimerQueryExt){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};function _glActiveTexture(x0){GLctx["activeTexture"](x0)}function _glAttachShader(program,shader){GLctx.attachShader(GL.programs[program],GL.shaders[shader])}function _glBeginQuery(target,id){GLctx["beginQuery"](target,GL.queries[id])}function _glBindBuffer(target,buffer){if(target==34962){GLctx.currentArrayBufferBinding=buffer}else if(target==34963){GLctx.currentElementArrayBufferBinding=buffer}if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,GL.buffers[buffer])}function _glBindBufferBase(target,index,buffer){GLctx["bindBufferBase"](target,index,GL.buffers[buffer])}function _glBindBufferRange(target,index,buffer,offset,ptrsize){GLctx["bindBufferRange"](target,index,GL.buffers[buffer],offset,ptrsize)}function _glBindFramebuffer(target,framebuffer){GLctx.bindFramebuffer(target,GL.framebuffers[framebuffer])}function _glBindRenderbuffer(target,renderbuffer){GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])}function _glBindSampler(unit,sampler){GLctx["bindSampler"](unit,GL.samplers[sampler])}function _glBindTexture(target,texture){GLctx.bindTexture(target,GL.textures[texture])}function _glBindVertexArray(vao){GLctx["bindVertexArray"](GL.vaos[vao]);var ibo=GLctx.getParameter(34965);GLctx.currentElementArrayBufferBinding=ibo?ibo.name|0:0}function _glBlendEquationSeparate(x0,x1){GLctx["blendEquationSeparate"](x0,x1)}function _glBlendFuncSeparate(x0,x1,x2,x3){GLctx["blendFuncSeparate"](x0,x1,x2,x3)}function _glBlitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9){GLctx["blitFramebuffer"](x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)}function _glBufferData(target,size,data,usage){if(true){if(data&&size){GLctx.bufferData(target,HEAPU8,usage,data,size)}else{GLctx.bufferData(target,size,usage)}}else{GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)}}function _glBufferSubData(target,offset,size,data){if(true){size&&GLctx.bufferSubData(target,offset,HEAPU8,data,size);return}GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))}function _glClearBufferfi(x0,x1,x2,x3){GLctx["clearBufferfi"](x0,x1,x2,x3)}function _glClearBufferfv(buffer,drawbuffer,value){GLctx["clearBufferfv"](buffer,drawbuffer,HEAPF32,value>>2)}function _glClearBufferiv(buffer,drawbuffer,value){GLctx["clearBufferiv"](buffer,drawbuffer,HEAP32,value>>2)}function convertI32PairToI53(lo,hi){return(lo>>>0)+hi*4294967296}function _glClientWaitSync(sync,flags,timeoutLo,timeoutHi){return GLctx.clientWaitSync(GL.syncs[sync],flags,convertI32PairToI53(timeoutLo,timeoutHi))}function _glColorMask(red,green,blue,alpha){GLctx.colorMask(!!red,!!green,!!blue,!!alpha)}function _glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}function _glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data){if(true){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,imageSize,data)}else{GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,HEAPU8,data,imageSize)}return}GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,data?HEAPU8.subarray(data,data+imageSize):null)}function _glCompressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data){if(GLctx.currentPixelUnpackBufferBinding){GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)}else{GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,HEAPU8,data,imageSize)}}function _glCopyBufferSubData(x0,x1,x2,x3,x4){GLctx["copyBufferSubData"](x0,x1,x2,x3,x4)}function _glCreateProgram(){var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id}function _glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id}function _glCullFace(x0){GLctx["cullFace"](x0)}function _glDeleteBuffers(n,buffers){for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GLctx.currentArrayBufferBinding)GLctx.currentArrayBufferBinding=0;if(id==GLctx.currentElementArrayBufferBinding)GLctx.currentElementArrayBufferBinding=0;if(id==GLctx.currentPixelPackBufferBinding)GLctx.currentPixelPackBufferBinding=0;if(id==GLctx.currentPixelUnpackBufferBinding)GLctx.currentPixelUnpackBufferBinding=0}}function _glDeleteFramebuffers(n,framebuffers){for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}}function _glDeleteProgram(id){if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null}function _glDeleteQueries(n,ids){for(var i=0;i>2];var query=GL.queries[id];if(!query)continue;GLctx["deleteQuery"](query);GL.queries[id]=null}}function _glDeleteRenderbuffers(n,renderbuffers){for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}}function _glDeleteSamplers(n,samplers){for(var i=0;i>2];var sampler=GL.samplers[id];if(!sampler)continue;GLctx["deleteSampler"](sampler);sampler.name=0;GL.samplers[id]=null}}function _glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null}function _glDeleteSync(id){if(!id)return;var sync=GL.syncs[id];if(!sync){GL.recordError(1281);return}GLctx.deleteSync(sync);sync.name=0;GL.syncs[id]=null}function _glDeleteTextures(n,textures){for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}function _glDeleteVertexArrays(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}function _glDepthFunc(x0){GLctx["depthFunc"](x0)}function _glDepthMask(flag){GLctx.depthMask(!!flag)}function _glDepthRangef(x0,x1){GLctx["depthRange"](x0,x1)}function _glDetachShader(program,shader){GLctx.detachShader(GL.programs[program],GL.shaders[shader])}function _glDisable(x0){GLctx["disable"](x0)}function _glDisableVertexAttribArray(index){var cb=GL.currentContext.clientBuffers[index];cb.enabled=false;GLctx.disableVertexAttribArray(index)}var tempFixedLengthArray=[];function _glDrawBuffers(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}function _glDrawElementsInstanced(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _glDrawElements(mode,count,type,indices){var buf;if(!GLctx.currentElementArrayBufferBinding){var size=GL.calcBufLength(1,type,0,count);buf=GL.getTempIndexBuffer(size);GLctx.bindBuffer(34963,buf);GLctx.bufferSubData(34963,0,HEAPU8.subarray(indices,indices+size));indices=0}GL.preDrawHandleClientVertexAttribBindings(count);GLctx.drawElements(mode,count,type,indices);GL.postDrawHandleClientVertexAttribBindings(count);if(!GLctx.currentElementArrayBufferBinding){GLctx.bindBuffer(34963,null)}}function _glDrawRangeElements(mode,start,end,count,type,indices){_glDrawElements(mode,count,type,indices)}function _glEnable(x0){GLctx["enable"](x0)}function _glEnableVertexAttribArray(index){var cb=GL.currentContext.clientBuffers[index];cb.enabled=true;GLctx.enableVertexAttribArray(index)}function _glEndQuery(x0){GLctx["endQuery"](x0)}function _glFenceSync(condition,flags){var sync=GLctx.fenceSync(condition,flags);if(sync){var id=GL.getNewId(GL.syncs);sync.name=id;GL.syncs[id]=sync;return id}else{return 0}}function _glFinish(){GLctx["finish"]()}function _glFlush(){GLctx["flush"]()}function _glFramebufferRenderbuffer(target,attachment,renderbuffertarget,renderbuffer){GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])}function _glFramebufferTexture2D(target,attachment,textarget,texture,level){GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)}function _glFramebufferTextureLayer(target,attachment,texture,level,layer){GLctx.framebufferTextureLayer(target,attachment,GL.textures[texture],level,layer)}function _glFrontFace(x0){GLctx["frontFace"](x0)}function __glGenObject(n,buffers,createFunction,objectTable){for(var i=0;i>2]=id}}function _glGenBuffers(n,buffers){__glGenObject(n,buffers,"createBuffer",GL.buffers)}function _glGenFramebuffers(n,ids){__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)}function _glGenQueries(n,ids){__glGenObject(n,ids,"createQuery",GL.queries)}function _glGenRenderbuffers(n,renderbuffers){__glGenObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)}function _glGenSamplers(n,samplers){__glGenObject(n,samplers,"createSampler",GL.samplers)}function _glGenTextures(n,textures){__glGenObject(n,textures,"createTexture",GL.textures)}function _glGenVertexArrays(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}function _glGetBufferSubData(target,offset,size,data){if(!data){GL.recordError(1281);return}size&&GLctx["getBufferSubData"](target,offset,HEAPU8,data,size)}function _glGetError(){var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error}function writeI53ToI64(ptr,num){HEAPU32[ptr>>2]=num;HEAPU32[ptr+4>>2]=(num-HEAPU32[ptr>>2])/4294967296}function emscriptenWebGLGet(name_,p,type){if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 34814:case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break;case 33309:if(GL.currentContext.version<2){GL.recordError(1282);return}var exts=GLctx.getSupportedExtensions()||[];ret=2*exts.length;break;case 33307:case 33308:if(GL.currentContext.version<2){GL.recordError(1280);return}ret=name_==33307?3:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i>2]=result[i];break;case 2:HEAPF32[p+i*4>>2]=result[i];break;case 4:HEAP8[p+i>>0]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Unknown object returned from WebGL getParameter("+name_+")! (error: "+e+")");return}}break;default:GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Native code calling glGet"+type+"v("+name_+") and it returns "+result+" of type "+typeof result+"!");return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:HEAP32[p>>2]=ret;break;case 2:HEAPF32[p>>2]=ret;break;case 4:HEAP8[p>>0]=ret?1:0;break}}function _glGetFloatv(name_,p){emscriptenWebGLGet(name_,p,2)}function _glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,0)}function _glGetProgramInfoLog(program,maxLength,length,infoLog){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glGetProgramiv(program,pname,p){if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){for(var i=0;i>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){for(var i=0;i>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){for(var i=0;i>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}}function _glGetQueryObjectuiv(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx["getQueryParameter"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}function _glGetShaderInfoLog(shader,maxLength,length,infoLog){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glGetShaderiv(shader,pname,p){if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}}function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _glGetString(name_){var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s&&stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);if(true)glVersion="OpenGL ES 3.0 ("+glVersion+")";else{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret}function _glGetUniformBlockIndex(program,uniformBlockName){return GLctx["getUniformBlockIndex"](GL.programs[program],UTF8ToString(uniformBlockName))}function jstoi_q(str){return parseInt(str)}function webglGetLeftBracePos(name){return name.slice(-1)=="]"&&name.lastIndexOf("[")}function webglPrepareUniformLocationsBeforeFirstUse(program){var uniformLocsById=program.uniformLocsById,uniformSizeAndIdsByName=program.uniformSizeAndIdsByName,i,j;if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};for(i=0;i0?nm.slice(0,lb):nm;var id=program.uniformIdCounter;program.uniformIdCounter+=sz;uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex>2]}GLctx["invalidateFramebuffer"](target,list)}function _glLinkProgram(program){program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}}function emscriptenWebGLGetBufferBinding(target){switch(target){case 34962:target=34964;break;case 34963:target=34965;break;case 35051:target=35053;break;case 35052:target=35055;break;case 35982:target=35983;break;case 36662:target=36662;break;case 36663:target=36663;break;case 35345:target=35368;break}var buffer=GLctx.getParameter(target);if(buffer)return buffer.name|0;else return 0}function emscriptenWebGLValidateMapBufferTarget(target){switch(target){case 34962:case 34963:case 36662:case 36663:case 35051:case 35052:case 35882:case 35982:case 35345:return true;default:return false}}function _glMapBufferRange(target,offset,length,access){if(access!=26&&access!=10){err("glMapBufferRange is only supported when access is MAP_WRITE|INVALIDATE_BUFFER");return 0}if(!emscriptenWebGLValidateMapBufferTarget(target)){GL.recordError(1280);err("GL_INVALID_ENUM in glMapBufferRange");return 0}var mem=_malloc(length);if(!mem)return 0;GL.mappedBuffers[emscriptenWebGLGetBufferBinding(target)]={offset:offset,length:length,mem:mem,access:access};return mem}function _glPixelStorei(pname,param){if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)}function _glPolygonOffset(x0,x1){GLctx["polygonOffset"](x0,x1)}function computeUnpackAlignedImageSize(width,height,sizePerPixel,alignment){function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=width*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,alignment);return height*alignedRowSize}function __colorChannelsInGlTextureFormat(format){var colorChannels={5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4};return colorChannels[format-6402]||1}function heapObjectForWebGLType(type){type-=5120;if(type==0)return HEAP8;if(type==1)return HEAPU8;if(type==2)return HEAP16;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922||type==28520||type==30779||type==30782)return HEAPU32;return HEAPU16}function heapAccessShiftForWebGLHeap(heap){return 31-Math.clz32(heap.BYTES_PER_ELEMENT)}function emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat){var heap=heapObjectForWebGLType(type);var shift=heapAccessShiftForWebGLHeap(heap);var byteSize=1<>shift,pixels+bytes>>shift)}function _glReadPixels(x,y,width,height,format,type,pixels){if(true){if(GLctx.currentPixelPackBufferBinding){GLctx.readPixels(x,y,width,height,format,type,pixels)}else{var heap=heapObjectForWebGLType(type);GLctx.readPixels(x,y,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}return}var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)}function _glRenderbufferStorage(x0,x1,x2,x3){GLctx["renderbufferStorage"](x0,x1,x2,x3)}function _glRenderbufferStorageMultisample(x0,x1,x2,x3,x4){GLctx["renderbufferStorageMultisample"](x0,x1,x2,x3,x4)}function _glSamplerParameterf(sampler,pname,param){GLctx["samplerParameterf"](GL.samplers[sampler],pname,param)}function _glSamplerParameteri(sampler,pname,param){GLctx["samplerParameteri"](GL.samplers[sampler],pname,param)}function _glScissor(x0,x1,x2,x3){GLctx["scissor"](x0,x1,x2,x3)}function _glShaderSource(shader,count,string,length){var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)}function _glStencilFuncSeparate(x0,x1,x2,x3){GLctx["stencilFuncSeparate"](x0,x1,x2,x3)}function _glStencilMaskSeparate(x0,x1){GLctx["stencilMaskSeparate"](x0,x1)}function _glStencilOpSeparate(x0,x1,x2,x3){GLctx["stencilOpSeparate"](x0,x1,x2,x3)}function _glTexParameterf(x0,x1,x2){GLctx["texParameterf"](x0,x1,x2)}function _glTexParameteri(x0,x1,x2){GLctx["texParameteri"](x0,x1,x2)}function _glTexStorage2D(x0,x1,x2,x3,x4){GLctx["texStorage2D"](x0,x1,x2,x3,x4)}function _glTexStorage3D(x0,x1,x2,x3,x4,x5){GLctx["texStorage3D"](x0,x1,x2,x3,x4,x5)}function _glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels){if(true){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,null)}return}var pixelData=null;if(pixels)pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)}function _glTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,null)}}function webglGetUniformLocation(location){var p=GLctx.currentProgram;if(p){var webglLoc=p.uniformLocsById[location];if(typeof webglLoc=="number"){p.uniformLocsById[location]=webglLoc=GLctx.getUniformLocation(p,p.uniformArrayNamesById[location]+(webglLoc>0?"["+webglLoc+"]":""))}return webglLoc}else{GL.recordError(1282)}}function _glUniform1i(location,v0){GLctx.uniform1i(webglGetUniformLocation(location),v0)}function _glUniformBlockBinding(program,uniformBlockIndex,uniformBlockBinding){program=GL.programs[program];GLctx["uniformBlockBinding"](program,uniformBlockIndex,uniformBlockBinding)}function _glUnmapBuffer(target){if(!emscriptenWebGLValidateMapBufferTarget(target)){GL.recordError(1280);err("GL_INVALID_ENUM in glUnmapBuffer");return 0}var buffer=emscriptenWebGLGetBufferBinding(target);var mapping=GL.mappedBuffers[buffer];if(!mapping){GL.recordError(1282);err("buffer was never mapped in glUnmapBuffer");return 0}GL.mappedBuffers[buffer]=null;if(!(mapping.access&16))if(true){GLctx.bufferSubData(target,mapping.offset,HEAPU8,mapping.mem,mapping.length)}else{GLctx.bufferSubData(target,mapping.offset,HEAPU8.subarray(mapping.mem,mapping.mem+mapping.length))}_free(mapping.mem);return 1}function _glUseProgram(program){program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program}function _glVertexAttrib4f(x0,x1,x2,x3,x4){GLctx["vertexAttrib4f"](x0,x1,x2,x3,x4)}function _glVertexAttribI4ui(x0,x1,x2,x3,x4){GLctx["vertexAttribI4ui"](x0,x1,x2,x3,x4)}function _glVertexAttribIPointer(index,size,type,stride,ptr){var cb=GL.currentContext.clientBuffers[index];if(!GLctx.currentArrayBufferBinding){cb.size=size;cb.type=type;cb.normalized=false;cb.stride=stride;cb.ptr=ptr;cb.clientside=true;cb.vertexAttribPointerAdaptor=function(index,size,type,normalized,stride,ptr){this.vertexAttribIPointer(index,size,type,stride,ptr)};return}cb.clientside=false;GLctx["vertexAttribIPointer"](index,size,type,stride,ptr)}function _glVertexAttribPointer(index,size,type,normalized,stride,ptr){var cb=GL.currentContext.clientBuffers[index];if(!GLctx.currentArrayBufferBinding){cb.size=size;cb.type=type;cb.normalized=normalized;cb.stride=stride;cb.ptr=ptr;cb.clientside=true;cb.vertexAttribPointerAdaptor=function(index,size,type,normalized,stride,ptr){this.vertexAttribPointer(index,size,type,normalized,stride,ptr)};return}cb.clientside=false;GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}function _glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,x3)}function _glWaitSync(sync,flags,timeoutLo,timeoutHi){GLctx.waitSync(GL.syncs[sync],flags,convertI32PairToI53(timeoutLo,timeoutHi))}function _setTempRet0(val){setTempRet0(val)}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm){return _strftime(s,maxsize,format,tm)}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();InternalError=Module["InternalError"]=extendError(Error,"InternalError");embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");init_ClassHandle();init_embind();init_RegisteredPointer();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();var GLctx;for(var i=0;i<32;++i)tempFixedLengthArray.push(new Array(i));function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var asmLibraryArg={"Ga":___syscall_fcntl64,"yb":___syscall_ioctl,"zb":___syscall_openat,"ub":___syscall_stat64,"x":__embind_finalize_value_array,"m":__embind_finalize_value_object,"nb":__embind_register_bigint,"Eb":__embind_register_bool,"e":__embind_register_class,"l":__embind_register_class_class_function,"k":__embind_register_class_constructor,"a":__embind_register_class_function,"w":__embind_register_class_property,"Db":__embind_register_emval,"h":__embind_register_enum,"b":__embind_register_enum_value,"Ia":__embind_register_float,"T":__embind_register_function,"D":__embind_register_integer,"p":__embind_register_memory_view,"Ha":__embind_register_std_string,"ea":__embind_register_std_wstring,"y":__embind_register_value_array,"f":__embind_register_value_array_element,"n":__embind_register_value_object,"d":__embind_register_value_object_field,"Fb":__embind_register_void,"Bb":__emscripten_get_now_is_monotonic,"s":__emval_as,"g":__emval_decref,"t":__emval_get_property,"S":__emval_incref,"H":__emval_new_cstring,"r":__emval_run_destructors,"u":__emval_take_value,"c":_abort,"ca":_emscripten_asm_const_int,"qb":_emscripten_get_heap_max,"Ab":_emscripten_get_now,"Cb":_emscripten_memcpy_big,"tb":_emscripten_resize_heap,"vb":_environ_get,"wb":_environ_sizes_get,"da":_fd_close,"xb":_fd_read,"mb":_fd_seek,"Fa":_fd_write,"rb":_getentropy,"i":_glActiveTexture,"W":_glAttachShader,"Wb":_glBeginQuery,"o":_glBindBuffer,"ta":_glBindBufferBase,"U":_glBindBufferRange,"q":_glBindFramebuffer,"Na":_glBindRenderbuffer,"aa":_glBindSampler,"j":_glBindTexture,"A":_glBindVertexArray,"wa":_glBlendEquationSeparate,"va":_glBlendFuncSeparate,"fa":_glBlitFramebuffer,"K":_glBufferData,"ha":_glBufferSubData,"Kb":_glClearBufferfi,"E":_glClearBufferfv,"Jb":_glClearBufferiv,"ob":_glClientWaitSync,"_":_glColorMask,"eb":_glCompileShader,"Ka":_glCompressedTexSubImage2D,"Ja":_glCompressedTexSubImage3D,"Ra":_glCopyBufferSubData,"db":_glCreateProgram,"gb":_glCreateShader,"xa":_glCullFace,"$":_glDeleteBuffers,"ia":_glDeleteFramebuffers,"oa":_glDeleteProgram,"Va":_glDeleteQueries,"ja":_glDeleteRenderbuffers,"za":_glDeleteSamplers,"X":_glDeleteShader,"L":_glDeleteSync,"ka":_glDeleteTextures,"ib":_glDeleteVertexArrays,"ba":_glDepthFunc,"Z":_glDepthMask,"qa":_glDepthRangef,"pa":_glDetachShader,"v":_glDisable,"Nb":_glDisableVertexAttribArray,"Xa":_glDrawBuffers,"Xb":_glDrawElementsInstanced,"Yb":_glDrawRangeElements,"G":_glEnable,"Qb":_glEnableVertexAttribArray,"Vb":_glEndQuery,"V":_glFenceSync,"Da":_glFinish,"lb":_glFlush,"M":_glFramebufferRenderbuffer,"Pa":_glFramebufferTexture2D,"Oa":_glFramebufferTextureLayer,"ya":_glFrontFace,"O":_glGenBuffers,"la":_glGenFramebuffers,"Wa":_glGenQueries,"Y":_glGenRenderbuffers,"Ba":_glGenSamplers,"N":_glGenTextures,"hb":_glGenVertexArrays,"Ta":_glGenerateMipmap,"Ib":_glGetBufferSubData,"Ca":_glGetError,"kb":_glGetFloatv,"C":_glGetIntegerv,"ab":_glGetProgramInfoLog,"na":_glGetProgramiv,"Ub":_glGetQueryObjectuiv,"bb":_glGetShaderInfoLog,"ma":_glGetShaderiv,"I":_glGetString,"$a":_glGetUniformBlockIndex,"Za":_glGetUniformLocation,"jb":_glHint,"ga":_glInvalidateFramebuffer,"cb":_glLinkProgram,"Hb":_glMapBufferRange,"B":_glPixelStorei,"ua":_glPolygonOffset,"Sa":_glReadPixels,"Lb":_glRenderbufferStorage,"Mb":_glRenderbufferStorageMultisample,"Aa":_glSamplerParameterf,"J":_glSamplerParameteri,"sa":_glScissor,"fb":_glShaderSource,"Q":_glStencilFuncSeparate,"F":_glStencilMaskSeparate,"P":_glStencilOpSeparate,"Ua":_glTexParameterf,"z":_glTexParameteri,"Tb":_glTexStorage2D,"Qa":_glTexStorage3D,"Ma":_glTexSubImage2D,"La":_glTexSubImage3D,"Ya":_glUniform1i,"_a":_glUniformBlockBinding,"Gb":_glUnmapBuffer,"R":_glUseProgram,"Ob":_glVertexAttrib4f,"Pb":_glVertexAttribI4ui,"Sb":_glVertexAttribIPointer,"Rb":_glVertexAttribPointer,"ra":_glViewport,"pb":_glWaitSync,"Ea":_setTempRet0,"sb":_strftime_l};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["_b"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["ac"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["bc"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["cc"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["dc"]).apply(null,arguments)};var ___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=function(){return(___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=Module["asm"]["ec"]).apply(null,arguments)};var dynCall_iiiiij=Module["dynCall_iiiiij"]=function(){return(dynCall_iiiiij=Module["dynCall_iiiiij"]=Module["asm"]["fc"]).apply(null,arguments)};var dynCall_jii=Module["dynCall_jii"]=function(){return(dynCall_jii=Module["dynCall_jii"]=Module["asm"]["gc"]).apply(null,arguments)};var dynCall_iiij=Module["dynCall_iiij"]=function(){return(dynCall_iiij=Module["dynCall_iiij"]=Module["asm"]["hc"]).apply(null,arguments)};var dynCall_vij=Module["dynCall_vij"]=function(){return(dynCall_vij=Module["dynCall_vij"]=Module["asm"]["ic"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["jc"]).apply(null,arguments)};var dynCall_viijii=Module["dynCall_viijii"]=function(){return(dynCall_viijii=Module["dynCall_viijii"]=Module["asm"]["kc"]).apply(null,arguments)};var dynCall_iiiiijj=Module["dynCall_iiiiijj"]=function(){return(dynCall_iiiiijj=Module["dynCall_iiiiijj"]=Module["asm"]["lc"]).apply(null,arguments)};var dynCall_iiiiiijj=Module["dynCall_iiiiiijj"]=function(){return(dynCall_iiiiiijj=Module["dynCall_iiiiiijj"]=Module["asm"]["mc"]).apply(null,arguments)};var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run(); +var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=(filename,binary)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror,binary=true)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,binary?undefined:"utf8",(err,data)=>{if(err)onerror(err);else onload(binary?data.buffer:data)})};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow};Module["inspect"]=()=>"[Emscripten Module object]"}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="filament.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(binaryFile)){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{if(!response["ok"]){throw"failed to load wasm binary file at '"+binaryFile+"'"}return response["arrayBuffer"]()}).catch(()=>getBinarySync(binaryFile))}else if(readAsync){return new Promise((resolve,reject)=>{readAsync(binaryFile,response=>resolve(new Uint8Array(response)),reject)})}}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(instance=>instance).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function createWasm(){var info={"a":wasmImports};function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["rc"];updateMemoryViews();wasmTable=wasmExports["tc"];addOnInit(wasmExports["sc"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var tempDouble;var tempI64;var ASM_CONSTS={1682772:()=>{const options=window.filament_glOptions;const context=window.filament_glContext;const handle=GL.registerContext(context,options);window.filament_contextHandle=handle;GL.makeContextCurrent(handle)},1682986:()=>{const handle=window.filament_contextHandle;GL.makeContextCurrent(handle)},1683067:($0,$1,$2,$3,$4,$5)=>{const fn=Emval.toValue($0);fn({"renderable":Emval.toValue($1),"depth":$2,"fragCoords":[$3,$4,$5]})}};var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var setErrNo=value=>{HEAP32[___errno_location()>>2]=value;return value};var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");var randomFillSync=crypto_module["randomFillSync"];if(randomFillSync){return view=>crypto_module["randomFillSync"](view)}var randomBytes=crypto_module["randomBytes"];return view=>(view.set(randomBytes(view.byteLength)),view)}catch(e){}}abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw FS.genericErrors[44]},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url,arrayBuffer=>{assert(arrayBuffer,`Loading data file "${url}" failed (no arrayBuffer).`);onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)};var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn);var preloadPlugins=Module["preloadPlugins"]||[];var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{var flagModes={"r":0,"r+":2,"w":512|64|1,"w+":512|64|2,"a":1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath(path,opts={}){path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get(){return this.node},set(val){this.node=val}},isRead:{get(){return(this.flags&2097155)!==1}},isWrite:{get(){return(this.flags&2097155)!==0}},isAppend:{get(){return this.flags&1024}},flags:{get(){return this.shared.flags},set(val){this.shared.flags=val}},position:{get(){return this.shared.position},set(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;i0,ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error(`Invalid encoding type "${opts.encoding}"`)}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError(){if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.name="ErrnoError";this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit(){FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init(input,output,error){FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit(){FS.init.initialized=false;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+24>>2]=tempI64[0],HEAP32[buf+28>>2]=tempI64[1];HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAPU32[buf+48>>2]=atime%1e3*1e3;tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=mtime%1e3*1e3;tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=ctime%1e3*1e3;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];return 0},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get(){var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret},getp(){return SYSCALLS.get()},getStr(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream}};function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.getp();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=SYSCALLS.getp();HEAP32[argp>>2]=termios.c_iflag||0;HEAP32[argp+4>>2]=termios.c_oflag||0;HEAP32[argp+8>>2]=termios.c_cflag||0;HEAP32[argp+12>>2]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17>>0]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=SYSCALLS.getp();var c_iflag=HEAP32[argp>>2];var c_oflag=HEAP32[argp+4>>2];var c_cflag=HEAP32[argp+8>>2];var c_lflag=HEAP32[argp+12>>2];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17>>0])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag:c_iflag,c_oflag:c_oflag,c_cflag:c_cflag,c_lflag:c_lflag,c_cc:c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.getp();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.getp();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=SYSCALLS.getp();HEAP16[argp>>1]=winsize[0];HEAP16[argp+2>>1]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var tupleRegistrations={};var runDestructors=destructors=>{while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}};function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAP32[pointer>>2])}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var InternalError;var throwInternalError=message=>{throw new InternalError(message)};var whenDependentTypesAreResolved=(myTypes,dependentTypes,getTypeConverters)=>{myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i{if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push(()=>{typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}});if(0===unregisteredTypes.length){onComplete(typeConverters)}};var __embind_finalize_value_array=rawTupleType=>{var reg=tupleRegistrations[rawTupleType];delete tupleRegistrations[rawTupleType];var elements=reg.elements;var elementsLength=elements.length;var elementTypes=elements.map(elt=>elt.getterReturnType).concat(elements.map(elt=>elt.setterArgumentType));var rawConstructor=reg.rawConstructor;var rawDestructor=reg.rawDestructor;whenDependentTypesAreResolved([rawTupleType],elementTypes,function(elementTypes){elements.forEach((elt,i)=>{var getterReturnType=elementTypes[i];var getter=elt.getter;var getterContext=elt.getterContext;var setterArgumentType=elementTypes[i+elementsLength];var setter=elt.setter;var setterContext=elt.setterContext;elt.read=ptr=>getterReturnType["fromWireType"](getter(getterContext,ptr));elt.write=(ptr,o)=>{var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,o));runDestructors(destructors)}});return[{name:reg.name,"fromWireType":ptr=>{var rv=new Array(elementsLength);for(var i=0;i{if(elementsLength!==o.length){throw new TypeError(`Incorrect number of tuple elements for ${reg.name}: expected=${elementsLength}, actual=${o.length}`)}var ptr=rawConstructor();for(var i=0;i{var reg=structRegistrations[structType];delete structRegistrations[structType];var rawConstructor=reg.rawConstructor;var rawDestructor=reg.rawDestructor;var fieldRecords=reg.fields;var fieldTypes=fieldRecords.map(field=>field.getterReturnType).concat(fieldRecords.map(field=>field.setterArgumentType));whenDependentTypesAreResolved([structType],fieldTypes,fieldTypes=>{var fields={};fieldRecords.forEach((field,i)=>{var fieldName=field.fieldName;var getterReturnType=fieldTypes[i];var getter=field.getter;var getterContext=field.getterContext;var setterArgumentType=fieldTypes[i+fieldRecords.length];var setter=field.setter;var setterContext=field.setterContext;fields[fieldName]={read:ptr=>getterReturnType["fromWireType"](getter(getterContext,ptr)),write:(ptr,o)=>{var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,o));runDestructors(destructors)}}});return[{name:reg.name,"fromWireType":ptr=>{var rv={};for(var i in fields){rv[i]=fields[i].read(ptr)}rawDestructor(ptr);return rv},"toWireType":(destructors,o)=>{for(var fieldName in fields){if(!(fieldName in o)){throw new TypeError(`Missing field: "${fieldName}"`)}}var ptr=rawConstructor();for(fieldName in fields){fields[fieldName].write(ptr,o[fieldName])}if(destructors!==null){destructors.push(rawDestructor,ptr)}return ptr},"argPackAdvance":GenericWireTypeSize,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:rawDestructor}]})};var __embind_register_bigint=(primitiveType,name,size,minRange,maxRange)=>{};var embind_init_charCodes=()=>{var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes};var embind_charCodes;var readLatin1String=ptr=>{var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret};var BindingError;var throwBindingError=message=>{throw new BindingError(message)};function sharedRegisterType(rawType,registeredInstance,options={}){var name=registeredInstance.name;if(!rawType){throwBindingError(`type "${name}" must have a positive integer typeid pointer`)}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError(`Cannot register type '${name}' twice`)}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(cb=>cb())}}function registerType(rawType,registeredInstance,options={}){if(!("argPackAdvance"in registeredInstance)){throw new TypeError("registerType registeredInstance requires argPackAdvance")}return sharedRegisterType(rawType,registeredInstance,options)}var GenericWireTypeSize=8;var __embind_register_bool=(rawType,name,trueValue,falseValue)=>{name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(wt){return!!wt},"toWireType":function(destructors,o){return o?trueValue:falseValue},"argPackAdvance":GenericWireTypeSize,"readValueFromPointer":function(pointer){return this["fromWireType"](HEAPU8[pointer])},destructorFunction:null})};var shallowCopyInternalPointer=o=>({count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType});var throwInstanceAlreadyDeleted=obj=>{function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")};var finalizationRegistry=false;var detachFinalizer=handle=>{};var runDestructor=$$=>{if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}};var releaseClassHandle=$$=>{$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}};var downcastPointer=(ptr,ptrClass,desiredClass)=>{if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)};var registeredPointers={};var getInheritedInstanceCount=()=>Object.keys(registeredInstances).length;var getLiveInheritedInstances=()=>{var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv};var deletionQueue=[];var flushPendingDeletes=()=>{while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}};var delayFunction;var setDelayFunction=fn=>{delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}};var init_embind=()=>{Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction};var registeredInstances={};var getBasestPointer=(class_,ptr)=>{if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr};var getInheritedInstance=(class_,ptr)=>{ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]};var makeClassHandle=(prototype,record)=>{if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record}}))};function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}var attachFinalizer=handle=>{if("undefined"===typeof FinalizationRegistry){attachFinalizer=handle=>handle;return handle}finalizationRegistry=new FinalizationRegistry(info=>{releaseClassHandle(info.$$)});attachFinalizer=handle=>{var $$=handle.$$;var hasSmartPtr=!!$$.smartPtr;if(hasSmartPtr){var info={$$:$$};finalizationRegistry.register(handle,info,handle)}return handle};detachFinalizer=handle=>finalizationRegistry.unregister(handle);return attachFinalizer(handle)};var init_ClassHandle=()=>{Object.assign(ClassHandle.prototype,{"isAliasOf"(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;other.$$=other.$$;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right},"clone"(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}},"delete"(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}},"isDeleted"(){return!this.$$.ptr},"deleteLater"(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}})};function ClassHandle(){}var char_0=48;var char_9=57;var makeLegalFunctionName=name=>{if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return`_${name}`}return name};function createNamedFunction(name,body){name=makeLegalFunctionName(name);return{[name]:function(){return body.apply(this,arguments)}}[name]}var ensureOverloadTable=(proto,methodName,humanName)=>{if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError(`Function '${humanName}' called with an invalid number of arguments (${arguments.length}) - expects one of (${proto[methodName].overloadTable})!`)}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}};var exposePublicSymbol=(name,value,numArguments)=>{if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError(`Cannot register public name '${name}' twice`)}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError(`Cannot register multiple overloads of a function with the same number of arguments (${numArguments})!`)}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}};function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}var upcastPointer=(ptr,ptrClass,desiredClass)=>{while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError(`Expected null or instance of ${desiredClass.name}, got an instance of ${ptrClass.name}`)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr};function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError(`null is not a valid ${this.name}`)}return 0}if(!handle.$$){throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`)}if(!handle.$$.ptr){throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError(`null is not a valid ${this.name}`)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`)}if(!handle.$$.ptr){throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError(`Cannot convert argument of type ${handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name} to parameter type ${this.name}`)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError(`Cannot convert argument of type ${handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name} to parameter type ${this.name}`)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,Emval.toHandle(()=>clonedHandle["delete"]()));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError(`null is not a valid ${this.name}`)}return 0}if(!handle.$$){throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`)}if(!handle.$$.ptr){throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`)}if(handle.$$.ptrType.isConst){throwBindingError(`Cannot convert argument of type ${handle.$$.ptrType.name} to parameter type ${this.name}`)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function readPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}var init_RegisteredPointer=()=>{Object.assign(RegisteredPointer.prototype,{getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr},destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}},"argPackAdvance":GenericWireTypeSize,"readValueFromPointer":readPointer,"deleteObject"(handle){if(handle!==null){handle["delete"]()}},"fromWireType":RegisteredPointer_fromWireType})};function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}var replacePublicSymbol=(name,value,numArguments)=>{if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}};var dynCallLegacy=(sig,ptr,args)=>{var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)};var wasmTableMirror=[];var wasmTable;var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var dynCall=(sig,ptr,args)=>{if(sig.includes("j")){return dynCallLegacy(sig,ptr,args)}var rtn=getWasmTableEntry(ptr).apply(null,args);return rtn};var getDynCaller=(sig,ptr)=>{var argCache=[];return function(){argCache.length=0;Object.assign(argCache,arguments);return dynCall(sig,ptr,argCache)}};var embind__requireFunction=(signature,rawFunction)=>{signature=readLatin1String(signature);function makeDynCaller(){if(signature.includes("j")){return getDynCaller(signature,rawFunction)}return getWasmTableEntry(rawFunction)}var fp=makeDynCaller();if(typeof fp!="function"){throwBindingError(`unknown function pointer with signature ${signature}: ${rawFunction}`)}return fp};var extendError=(baseErrorType,errorName)=>{var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return`${this.name}: ${this.message}`}};return errorClass};var UnboundTypeError;var getTypeName=type=>{var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv};var throwUnboundTypeError=(message,types)=>{var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(`${message}: `+unboundTypes.map(getTypeName).join([", "]))};var __embind_register_class=(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor)=>{name=readLatin1String(name);getActualType=embind__requireFunction(getActualTypeSignature,getActualType);if(upcast){upcast=embind__requireFunction(upcastSignature,upcast)}if(downcast){downcast=embind__requireFunction(downcastSignature,downcast)}rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,function(){throwUnboundTypeError(`Cannot construct ${name} due to unbound types`,[baseClassRawType])});whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],function(base){base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype}else{basePrototype=ClassHandle.prototype}var constructor=createNamedFunction(legalFunctionName,function(){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError("Use 'new' to construct "+name)}if(undefined===registeredClass.constructor_body){throw new BindingError(name+" has no accessible constructor")}var body=registeredClass.constructor_body[arguments.length];if(undefined===body){throw new BindingError(`Tried to invoke ctor of ${name} with invalid number of parameters (${arguments.length}) - expected (${Object.keys(registeredClass.constructor_body).toString()}) parameters instead!`)}return body.apply(this,arguments)});var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);if(registeredClass.baseClass){if(registeredClass.baseClass.__derivedClasses===undefined){registeredClass.baseClass.__derivedClasses=[]}registeredClass.baseClass.__derivedClasses.push(registeredClass)}var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+"*",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+" const*",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return[referenceConverter,pointerConverter,constPointerConverter]})};function newFunc(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError(`new_ called with constructor type ${typeof constructor} which is not a function`)}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc,isAsync){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i0?", ":"")+argsListWired}invokerFnBody+=(returns||isAsync?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i{var array=[];for(var i=0;i>2])}return array};var __embind_register_class_class_function=(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,fn,isAsync)=>{var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=`${classType.name}.${methodName}`;function unboundTypesHandler(){throwUnboundTypeError(`Cannot call ${humanName} due to unbound types`,rawArgTypes)}if(methodName.startsWith("@@")){methodName=Symbol[methodName.substring(2)]}var proto=classType.registeredClass.constructor;if(undefined===proto[methodName]){unboundTypesHandler.argCount=argCount-1;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-1]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));var func=craftInvokerFunction(humanName,invokerArgsArray,null,rawInvoker,fn,isAsync);if(undefined===proto[methodName].overloadTable){func.argCount=argCount-1;proto[methodName]=func}else{proto[methodName].overloadTable[argCount-1]=func}if(classType.registeredClass.__derivedClasses){for(const derivedClass of classType.registeredClass.__derivedClasses){if(!derivedClass.constructor.hasOwnProperty(methodName)){derivedClass.constructor[methodName]=func}}}return[]});return[]})};var __embind_register_class_constructor=(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor)=>{var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=`constructor ${classType.name}`;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError(`Cannot register multiple constructors with identical number of parameters (${argCount-1}) for class '${classType.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`)}classType.registeredClass.constructor_body[argCount-1]=()=>{throwUnboundTypeError(`Cannot construct ${classType.name} due to unbound types`,rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,argTypes=>{argTypes.splice(1,0,null);classType.registeredClass.constructor_body[argCount-1]=craftInvokerFunction(humanName,argTypes,null,invoker,rawConstructor);return[]});return[]})};var __embind_register_class_function=(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,context,isPureVirtual,isAsync)=>{var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=`${classType.name}.${methodName}`;if(methodName.startsWith("@@")){methodName=Symbol[methodName.substring(2)]}if(isPureVirtual){classType.registeredClass.pureVirtualFunctions.push(methodName)}function unboundTypesHandler(){throwUnboundTypeError(`Cannot call ${humanName} due to unbound types`,rawArgTypes)}var proto=classType.registeredClass.instancePrototype;var method=proto[methodName];if(undefined===method||undefined===method.overloadTable&&method.className!==classType.name&&method.argCount===argCount-2){unboundTypesHandler.argCount=argCount-2;unboundTypesHandler.className=classType.name;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-2]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){var memberFunction=craftInvokerFunction(humanName,argTypes,classType,rawInvoker,context,isAsync);if(undefined===proto[methodName].overloadTable){memberFunction.argCount=argCount-2;proto[methodName]=memberFunction}else{proto[methodName].overloadTable[argCount-2]=memberFunction}return[]});return[]})};var validateThis=(this_,classType,humanName)=>{if(!(this_ instanceof Object)){throwBindingError(`${humanName} with invalid "this": ${this_}`)}if(!(this_ instanceof classType.registeredClass.constructor)){throwBindingError(`${humanName} incompatible with "this" of type ${this_.constructor.name}`)}if(!this_.$$.ptr){throwBindingError(`cannot call emscripten binding method ${humanName} on deleted object`)}return upcastPointer(this_.$$.ptr,this_.$$.ptrType.registeredClass,classType.registeredClass)};var __embind_register_class_property=(classType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext)=>{fieldName=readLatin1String(fieldName);getter=embind__requireFunction(getterSignature,getter);whenDependentTypesAreResolved([],[classType],function(classType){classType=classType[0];var humanName=`${classType.name}.${fieldName}`;var desc={get(){throwUnboundTypeError(`Cannot access ${humanName} due to unbound types`,[getterReturnType,setterArgumentType])},enumerable:true,configurable:true};if(setter){desc.set=()=>throwUnboundTypeError(`Cannot access ${humanName} due to unbound types`,[getterReturnType,setterArgumentType])}else{desc.set=v=>throwBindingError(humanName+" is a read-only property")}Object.defineProperty(classType.registeredClass.instancePrototype,fieldName,desc);whenDependentTypesAreResolved([],setter?[getterReturnType,setterArgumentType]:[getterReturnType],function(types){var getterReturnType=types[0];var desc={get(){var ptr=validateThis(this,classType,humanName+" getter");return getterReturnType["fromWireType"](getter(getterContext,ptr))},enumerable:true};if(setter){setter=embind__requireFunction(setterSignature,setter);var setterArgumentType=types[1];desc.set=function(v){var ptr=validateThis(this,classType,humanName+" setter");var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,v));runDestructors(destructors)}}Object.defineProperty(classType.registeredClass.instancePrototype,fieldName,desc);return[]});return[]})};function handleAllocatorInit(){Object.assign(HandleAllocator.prototype,{get(id){return this.allocated[id]},has(id){return this.allocated[id]!==undefined},allocate(handle){var id=this.freelist.pop()||this.allocated.length;this.allocated[id]=handle;return id},free(id){this.allocated[id]=undefined;this.freelist.push(id)}})}function HandleAllocator(){this.allocated=[undefined];this.freelist=[]}var emval_handles=new HandleAllocator;var __emval_decref=handle=>{if(handle>=emval_handles.reserved&&0===--emval_handles.get(handle).refcount){emval_handles.free(handle)}};var count_emval_handles=()=>{var count=0;for(var i=emval_handles.reserved;i{emval_handles.allocated.push({value:undefined},{value:null},{value:true},{value:false});emval_handles.reserved=emval_handles.allocated.length;Module["count_emval_handles"]=count_emval_handles};var Emval={toValue:handle=>{if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handles.get(handle).value},toHandle:value=>{switch(value){case undefined:return 1;case null:return 2;case true:return 3;case false:return 4;default:{return emval_handles.allocate({refcount:1,value:value})}}}};var __embind_register_emval=(rawType,name)=>{name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":handle=>{var rv=Emval.toValue(handle);__emval_decref(handle);return rv},"toWireType":(destructors,value)=>Emval.toHandle(value),"argPackAdvance":GenericWireTypeSize,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})};var enumReadValueFromPointer=(name,width,signed)=>{switch(width){case 1:return signed?function(pointer){return this["fromWireType"](HEAP8[pointer>>0])}:function(pointer){return this["fromWireType"](HEAPU8[pointer>>0])};case 2:return signed?function(pointer){return this["fromWireType"](HEAP16[pointer>>1])}:function(pointer){return this["fromWireType"](HEAPU16[pointer>>1])};case 4:return signed?function(pointer){return this["fromWireType"](HEAP32[pointer>>2])}:function(pointer){return this["fromWireType"](HEAPU32[pointer>>2])};default:throw new TypeError(`invalid integer width (${width}): ${name}`)}};var __embind_register_enum=(rawType,name,size,isSigned)=>{name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,"fromWireType":function(c){return this.constructor.values[c]},"toWireType":(destructors,c)=>c.value,"argPackAdvance":GenericWireTypeSize,"readValueFromPointer":enumReadValueFromPointer(name,size,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)};var requireRegisteredType=(rawType,humanName)=>{var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl};var __embind_register_enum_value=(rawEnumType,name,enumValue)=>{var enumType=requireRegisteredType(rawEnumType,"enum");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(`${enumType.name}_${name}`,function(){})}});Enum.values[enumValue]=Value;Enum[name]=Value};var embindRepr=v=>{if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}};var floatReadValueFromPointer=(name,width)=>{switch(width){case 4:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 8:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError(`invalid float width (${width}): ${name}`)}};var __embind_register_float=(rawType,name,size)=>{name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":value=>value,"toWireType":(destructors,value)=>value,"argPackAdvance":GenericWireTypeSize,"readValueFromPointer":floatReadValueFromPointer(name,size),destructorFunction:null})};var __embind_register_function=(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn,isAsync)=>{var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,function(){throwUnboundTypeError(`Cannot call ${name} due to unbound types`,argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn,isAsync),argCount-1);return[]})};var integerReadValueFromPointer=(name,width,signed)=>{switch(width){case 1:return signed?pointer=>HEAP8[pointer>>0]:pointer=>HEAPU8[pointer>>0];case 2:return signed?pointer=>HEAP16[pointer>>1]:pointer=>HEAPU16[pointer>>1];case 4:return signed?pointer=>HEAP32[pointer>>2]:pointer=>HEAPU32[pointer>>2];default:throw new TypeError(`invalid integer width (${width}): ${name}`)}};var __embind_register_integer=(primitiveType,name,size,minRange,maxRange)=>{name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var fromWireType=value=>value;if(minRange===0){var bitshift=32-8*size;fromWireType=value=>value<>>bitshift}var isUnsignedType=name.includes("unsigned");var checkAssertions=(value,toTypeName)=>{};var toWireType;if(isUnsignedType){toWireType=function(destructors,value){checkAssertions(value,this.name);return value>>>0}}else{toWireType=function(destructors,value){checkAssertions(value,this.name);return value}}registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":toWireType,"argPackAdvance":GenericWireTypeSize,"readValueFromPointer":integerReadValueFromPointer(name,size,minRange!==0),destructorFunction:null})};var __embind_register_memory_view=(rawType,dataTypeIndex,name)=>{var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){var size=HEAPU32[handle>>2];var data=HEAPU32[handle+4>>2];return new TA(HEAP8.buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":GenericWireTypeSize,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var __embind_register_std_string=(rawType,name)=>{name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType"(value){var length=HEAPU32[value>>2];var payload=value+4;var str;if(stdStringIsUTF8){var decodeStartPtr=payload;for(var i=0;i<=length;++i){var currentBytePtr=payload+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+i]=charCode}}else{for(var i=0;i{var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder)return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr));var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str};var stringToUTF16=(str,outPtr,maxBytesToWrite)=>{if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr};var lengthBytesUTF16=str=>str.length*2;var UTF32ToString=(ptr,maxBytesToRead)=>{var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str};var stringToUTF32=(str,outPtr,maxBytesToWrite)=>{if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr};var lengthBytesUTF32=str=>{var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len};var __embind_register_std_wstring=(rawType,charSize,name)=>{name=readLatin1String(name);var decodeString,encodeString,getHeap,lengthBytesUTF,shift;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16;getHeap=()=>HEAPU16;shift=1}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;getHeap=()=>HEAPU32;shift=2}registerType(rawType,{name:name,"fromWireType":value=>{var length=HEAPU32[value>>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":(destructors,value)=>{if(!(typeof value=="string")){throwBindingError(`Cannot pass non-string to C++ string type ${name}`)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":GenericWireTypeSize,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction(ptr){_free(ptr)}})};var __embind_register_value_array=(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor)=>{tupleRegistrations[rawType]={name:readLatin1String(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),elements:[]}};var __embind_register_value_array_element=(rawTupleType,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext)=>{tupleRegistrations[rawTupleType].elements.push({getterReturnType:getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext:getterContext,setterArgumentType:setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext:setterContext})};var __embind_register_value_object=(rawType,name,constructorSignature,rawConstructor,destructorSignature,rawDestructor)=>{structRegistrations[rawType]={name:readLatin1String(name),rawConstructor:embind__requireFunction(constructorSignature,rawConstructor),rawDestructor:embind__requireFunction(destructorSignature,rawDestructor),fields:[]}};var __embind_register_value_object_field=(structType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext)=>{structRegistrations[structType].fields.push({fieldName:readLatin1String(fieldName),getterReturnType:getterReturnType,getter:embind__requireFunction(getterSignature,getter),getterContext:getterContext,setterArgumentType:setterArgumentType,setter:embind__requireFunction(setterSignature,setter),setterContext:setterContext})};var __embind_register_void=(rawType,name)=>{name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":()=>undefined,"toWireType":(destructors,o)=>undefined})};var nowIsMonotonic=true;var __emscripten_get_now_is_monotonic=()=>nowIsMonotonic;var __emval_as=(handle,returnType,destructorsRef)=>{handle=Emval.toValue(handle);returnType=requireRegisteredType(returnType,"emval::as");var destructors=[];var rd=Emval.toHandle(destructors);HEAPU32[destructorsRef>>2]=rd;return returnType["toWireType"](destructors,handle)};var __emval_get_property=(handle,key)=>{handle=Emval.toValue(handle);key=Emval.toValue(key);return Emval.toHandle(handle[key])};var __emval_incref=handle=>{if(handle>4){emval_handles.get(handle).refcount+=1}};var emval_symbols={};var getStringOrSymbol=address=>{var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}return symbol};var __emval_new_cstring=v=>Emval.toHandle(getStringOrSymbol(v));var __emval_run_destructors=handle=>{var destructors=Emval.toValue(handle);runDestructors(destructors);__emval_decref(handle)};var __emval_take_value=(type,arg)=>{type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](arg);return Emval.toHandle(v)};var _abort=()=>{abort("")};var readEmAsmArgsArray=[];var readEmAsmArgs=(sigPtr,buf)=>{readEmAsmArgsArray.length=0;var ch;while(ch=HEAPU8[sigPtr++]){var wide=ch!=105;wide&=ch!=112;buf+=wide&&buf%8?4:0;readEmAsmArgsArray.push(ch==112?HEAPU32[buf>>2]:ch==105?HEAP32[buf>>2]:HEAPF64[buf>>3]);buf+=wide?8:4}return readEmAsmArgsArray};var runEmAsmFunction=(code,sigPtr,argbuf)=>{var args=readEmAsmArgs(sigPtr,argbuf);return ASM_CONSTS[code].apply(null,args)};var _emscripten_asm_const_int=(code,sigPtr,argbuf)=>runEmAsmFunction(code,sigPtr,argbuf);var _emscripten_date_now=()=>Date.now();var _emscripten_err=str=>err(UTF8ToString(str));var getHeapMax=()=>2147483648;var _emscripten_get_heap_max=()=>getHeapMax();var _emscripten_get_now;_emscripten_get_now=()=>performance.now();var _emscripten_memcpy_js=(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num);var _emscripten_out=str=>out(UTF8ToString(str));var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToAscii=(str,buffer)=>{for(var i=0;i>0]=str.charCodeAt(i)}HEAP8[buffer>>0]=0};var _environ_get=(__environ,environ_buf)=>{var bufSize=0;getEnvStrings().forEach((string,i)=>{var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;stringToAscii(string,ptr);bufSize+=string.length+1});return 0};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(string=>bufSize+=string.length+1);HEAPU32[penviron_buf_size>>2]=bufSize;return 0};function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!=="undefined"){offset+=curr}}return ret};function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var _getentropy=(buffer,size)=>{randomFill(HEAPU8.subarray(buffer,buffer+size));return 0};var webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance=ctx=>!!(ctx.dibvbi=ctx.getExtension("WEBGL_draw_instanced_base_vertex_base_instance"));var webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance=ctx=>!!(ctx.mdibvbi=ctx.getExtension("WEBGL_multi_draw_instanced_base_vertex_base_instance"));var webgl_enable_WEBGL_multi_draw=ctx=>!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"));var GL={counter:1,buffers:[],mappedBuffers:{},programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:[],offscreenCanvases:{},queries:[],samplers:[],transformFeedbacks:[],syncs:[],byteSizeByTypeRoot:5120,byteSizeByType:[1,1,2,2,4,4,4,2,3,4,8],stringCache:{},stringiCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:table=>{var ret=GL.counter++;for(var i=table.length;i32-Math.clz32(i===0?0:i-1),generateTempBuffers:(quads,context)=>{var largestIndex=GL.log2ceilLookup(GL.MAX_TEMP_BUFFER_SIZE);context.tempVertexBufferCounters1=[];context.tempVertexBufferCounters2=[];context.tempVertexBufferCounters1.length=context.tempVertexBufferCounters2.length=largestIndex+1;context.tempVertexBuffers1=[];context.tempVertexBuffers2=[];context.tempVertexBuffers1.length=context.tempVertexBuffers2.length=largestIndex+1;context.tempIndexBuffers=[];context.tempIndexBuffers.length=largestIndex+1;for(var i=0;i<=largestIndex;++i){context.tempIndexBuffers[i]=null;context.tempVertexBufferCounters1[i]=context.tempVertexBufferCounters2[i]=0;var ringbufferLength=GL.numTempVertexBuffersPerSize;context.tempVertexBuffers1[i]=[];context.tempVertexBuffers2[i]=[];var ringbuffer1=context.tempVertexBuffers1[i];var ringbuffer2=context.tempVertexBuffers2[i];ringbuffer1.length=ringbuffer2.length=ringbufferLength;for(var j=0;j>1;var quadIndexes=new Uint16Array(numIndexes);var i=0,v=0;while(1){quadIndexes[i++]=v;if(i>=numIndexes)break;quadIndexes[i++]=v+1;if(i>=numIndexes)break;quadIndexes[i++]=v+2;if(i>=numIndexes)break;quadIndexes[i++]=v;if(i>=numIndexes)break;quadIndexes[i++]=v+2;if(i>=numIndexes)break;quadIndexes[i++]=v+3;if(i>=numIndexes)break;v+=4}context.GLctx.bufferData(34963,quadIndexes,35044);context.GLctx.bindBuffer(34963,null)}},getTempVertexBuffer:function getTempVertexBuffer(sizeBytes){var idx=GL.log2ceilLookup(sizeBytes);var ringbuffer=GL.currentContext.tempVertexBuffers1[idx];var nextFreeBufferIndex=GL.currentContext.tempVertexBufferCounters1[idx];GL.currentContext.tempVertexBufferCounters1[idx]=GL.currentContext.tempVertexBufferCounters1[idx]+1&GL.numTempVertexBuffersPerSize-1;var vbo=ringbuffer[nextFreeBufferIndex];if(vbo){return vbo}var prevVBO=GLctx.getParameter(34964);ringbuffer[nextFreeBufferIndex]=GLctx.createBuffer();GLctx.bindBuffer(34962,ringbuffer[nextFreeBufferIndex]);GLctx.bufferData(34962,1<{var source="";for(var i=0;i>2]:-1;source+=UTF8ToString(HEAP32[string+i*4>>2],len<0?undefined:len)}return source},calcBufLength:function calcBufLength(size,type,stride,count){if(stride>0){return count*stride}var typeSize=GL.byteSizeByType[type-GL.byteSizeByTypeRoot];return size*typeSize*count},usedTempBuffers:[],preDrawHandleClientVertexAttribBindings:function preDrawHandleClientVertexAttribBindings(count){GL.resetBufferBinding=false;for(var i=0;i{if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;function fixedGetContext(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}canvas.getContext=fixedGetContext}var ctx=canvas.getContext("webgl2",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:(ctx,webGLContextAttributes)=>{var handle=GL.getNewId(GL.contexts);var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault=="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}context.maxVertexAttribs=context.GLctx.getParameter(34921);context.clientBuffers=[];for(var i=0;i{GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext&&GL.currentContext.GLctx;return!(contextHandle&&!GLctx)},getContext:contextHandle=>GL.contexts[contextHandle],deleteContext:contextHandle=>{if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents=="object")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;GL.contexts[contextHandle]=null},initExtensions:context=>{if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(GLctx);webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(GLctx);if(context.version>=2){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query_webgl2")}if(context.version<2||!GLctx.disjointTimerQueryExt){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(ext=>{if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};function _glActiveTexture(x0){GLctx.activeTexture(x0)}var _glAttachShader=(program,shader)=>{GLctx.attachShader(GL.programs[program],GL.shaders[shader])};var _glBeginQuery=(target,id)=>{GLctx.beginQuery(target,GL.queries[id])};var _glBindAttribLocation=(program,index,name)=>{GLctx.bindAttribLocation(GL.programs[program],index,UTF8ToString(name))};var _glBindBuffer=(target,buffer)=>{if(target==34962){GLctx.currentArrayBufferBinding=buffer}else if(target==34963){GLctx.currentElementArrayBufferBinding=buffer}if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,GL.buffers[buffer])};var _glBindBufferBase=(target,index,buffer)=>{GLctx.bindBufferBase(target,index,GL.buffers[buffer])};var _glBindBufferRange=(target,index,buffer,offset,ptrsize)=>{GLctx.bindBufferRange(target,index,GL.buffers[buffer],offset,ptrsize)};var _glBindFramebuffer=(target,framebuffer)=>{GLctx.bindFramebuffer(target,GL.framebuffers[framebuffer])};var _glBindRenderbuffer=(target,renderbuffer)=>{GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])};var _glBindSampler=(unit,sampler)=>{GLctx.bindSampler(unit,GL.samplers[sampler])};var _glBindTexture=(target,texture)=>{GLctx.bindTexture(target,GL.textures[texture])};var _glBindVertexArray=vao=>{GLctx.bindVertexArray(GL.vaos[vao]);var ibo=GLctx.getParameter(34965);GLctx.currentElementArrayBufferBinding=ibo?ibo.name|0:0};function _glBlendEquationSeparate(x0,x1){GLctx.blendEquationSeparate(x0,x1)}function _glBlendFuncSeparate(x0,x1,x2,x3){GLctx.blendFuncSeparate(x0,x1,x2,x3)}function _glBlitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9){GLctx.blitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)}var _glBufferData=(target,size,data,usage)=>{if(true){if(data&&size){GLctx.bufferData(target,HEAPU8,usage,data,size)}else{GLctx.bufferData(target,size,usage)}}else{GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)}};var _glBufferSubData=(target,offset,size,data)=>{if(true){size&&GLctx.bufferSubData(target,offset,HEAPU8,data,size);return}GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))};function _glClear(x0){GLctx.clear(x0)}function _glClearBufferfi(x0,x1,x2,x3){GLctx.clearBufferfi(x0,x1,x2,x3)}var _glClearBufferfv=(buffer,drawbuffer,value)=>{GLctx.clearBufferfv(buffer,drawbuffer,HEAPF32,value>>2)};var _glClearBufferiv=(buffer,drawbuffer,value)=>{GLctx.clearBufferiv(buffer,drawbuffer,HEAP32,value>>2)};function _glClearColor(x0,x1,x2,x3){GLctx.clearColor(x0,x1,x2,x3)}function _glClearDepthf(x0){GLctx.clearDepth(x0)}function _glClearStencil(x0){GLctx.clearStencil(x0)}var convertI32PairToI53=(lo,hi)=>(lo>>>0)+hi*4294967296;var _glClientWaitSync=(sync,flags,timeout_low,timeout_high)=>{var timeout=convertI32PairToI53(timeout_low,timeout_high);return GLctx.clientWaitSync(GL.syncs[sync],flags,timeout)};var _glColorMask=(red,green,blue,alpha)=>{GLctx.colorMask(!!red,!!green,!!blue,!!alpha)};var _glCompileShader=shader=>{GLctx.compileShader(GL.shaders[shader])};var _glCompressedTexSubImage2D=(target,level,xoffset,yoffset,width,height,format,imageSize,data)=>{if(true){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx.compressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data)}else{GLctx.compressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,HEAPU8,data,imageSize)}return}GLctx.compressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,data?HEAPU8.subarray(data,data+imageSize):null)};var _glCompressedTexSubImage3D=(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)=>{if(GLctx.currentPixelUnpackBufferBinding){GLctx.compressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)}else{GLctx.compressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,HEAPU8,data,imageSize)}};function _glCopyBufferSubData(x0,x1,x2,x3,x4){GLctx.copyBufferSubData(x0,x1,x2,x3,x4)}var _glCreateProgram=()=>{var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id};var _glCreateShader=shaderType=>{var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id};function _glCullFace(x0){GLctx.cullFace(x0)}var _glDeleteBuffers=(n,buffers)=>{for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GLctx.currentArrayBufferBinding)GLctx.currentArrayBufferBinding=0;if(id==GLctx.currentElementArrayBufferBinding)GLctx.currentElementArrayBufferBinding=0;if(id==GLctx.currentPixelPackBufferBinding)GLctx.currentPixelPackBufferBinding=0;if(id==GLctx.currentPixelUnpackBufferBinding)GLctx.currentPixelUnpackBufferBinding=0}};var _glDeleteFramebuffers=(n,framebuffers)=>{for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}};var _glDeleteProgram=id=>{if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null};var _glDeleteQueries=(n,ids)=>{for(var i=0;i>2];var query=GL.queries[id];if(!query)continue;GLctx.deleteQuery(query);GL.queries[id]=null}};var _glDeleteRenderbuffers=(n,renderbuffers)=>{for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}};var _glDeleteSamplers=(n,samplers)=>{for(var i=0;i>2];var sampler=GL.samplers[id];if(!sampler)continue;GLctx.deleteSampler(sampler);sampler.name=0;GL.samplers[id]=null}};var _glDeleteShader=id=>{if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null};var _glDeleteSync=id=>{if(!id)return;var sync=GL.syncs[id];if(!sync){GL.recordError(1281);return}GLctx.deleteSync(sync);sync.name=0;GL.syncs[id]=null};var _glDeleteTextures=(n,textures)=>{for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}};var _glDeleteVertexArrays=(n,vaos)=>{for(var i=0;i>2];GLctx.deleteVertexArray(GL.vaos[id]);GL.vaos[id]=null}};function _glDepthFunc(x0){GLctx.depthFunc(x0)}var _glDepthMask=flag=>{GLctx.depthMask(!!flag)};function _glDepthRangef(x0,x1){GLctx.depthRange(x0,x1)}var _glDetachShader=(program,shader)=>{GLctx.detachShader(GL.programs[program],GL.shaders[shader])};function _glDisable(x0){GLctx.disable(x0)}var _glDisableVertexAttribArray=index=>{var cb=GL.currentContext.clientBuffers[index];cb.enabled=false;GLctx.disableVertexAttribArray(index)};var tempFixedLengthArray=[];var _glDrawBuffers=(n,bufs)=>{var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx.drawBuffers(bufArray)};var _glDrawElements=(mode,count,type,indices)=>{var buf;if(!GLctx.currentElementArrayBufferBinding){var size=GL.calcBufLength(1,type,0,count);buf=GL.getTempIndexBuffer(size);GLctx.bindBuffer(34963,buf);GLctx.bufferSubData(34963,0,HEAPU8.subarray(indices,indices+size));indices=0}GL.preDrawHandleClientVertexAttribBindings(count);GLctx.drawElements(mode,count,type,indices);GL.postDrawHandleClientVertexAttribBindings(count);if(!GLctx.currentElementArrayBufferBinding){GLctx.bindBuffer(34963,null)}};var _glDrawElementsInstanced=(mode,count,type,indices,primcount)=>{GLctx.drawElementsInstanced(mode,count,type,indices,primcount)};function _glEnable(x0){GLctx.enable(x0)}var _glEnableVertexAttribArray=index=>{var cb=GL.currentContext.clientBuffers[index];cb.enabled=true;GLctx.enableVertexAttribArray(index)};function _glEndQuery(x0){GLctx.endQuery(x0)}var _glFenceSync=(condition,flags)=>{var sync=GLctx.fenceSync(condition,flags);if(sync){var id=GL.getNewId(GL.syncs);sync.name=id;GL.syncs[id]=sync;return id}return 0};function _glFinish(){GLctx.finish()}function _glFlush(){GLctx.flush()}var _glFramebufferRenderbuffer=(target,attachment,renderbuffertarget,renderbuffer)=>{GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])};var _glFramebufferTexture2D=(target,attachment,textarget,texture,level)=>{GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)};var _glFramebufferTextureLayer=(target,attachment,texture,level,layer)=>{GLctx.framebufferTextureLayer(target,attachment,GL.textures[texture],level,layer)};function _glFrontFace(x0){GLctx.frontFace(x0)}var __glGenObject=(n,buffers,createFunction,objectTable)=>{for(var i=0;i>2]=id}};var _glGenBuffers=(n,buffers)=>{__glGenObject(n,buffers,"createBuffer",GL.buffers)};var _glGenFramebuffers=(n,ids)=>{__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)};var _glGenQueries=(n,ids)=>{__glGenObject(n,ids,"createQuery",GL.queries)};var _glGenRenderbuffers=(n,renderbuffers)=>{__glGenObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)};var _glGenSamplers=(n,samplers)=>{__glGenObject(n,samplers,"createSampler",GL.samplers)};var _glGenTextures=(n,textures)=>{__glGenObject(n,textures,"createTexture",GL.textures)};function _glGenVertexArrays(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _glGenerateMipmap(x0){GLctx.generateMipmap(x0)}var _glGetBufferSubData=(target,offset,size,data)=>{if(!data){GL.recordError(1281);return}size&&GLctx.getBufferSubData(target,offset,HEAPU8,data,size)};var _glGetError=()=>{var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error};var writeI53ToI64=(ptr,num)=>{HEAPU32[ptr>>2]=num;var lower=HEAPU32[ptr>>2];HEAPU32[ptr+4>>2]=(num-lower)/4294967296};var emscriptenWebGLGet=(name_,p,type)=>{if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 34814:case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break;case 33309:if(GL.currentContext.version<2){GL.recordError(1282);return}var exts=GLctx.getSupportedExtensions()||[];ret=2*exts.length;break;case 33307:case 33308:if(GL.currentContext.version<2){GL.recordError(1280);return}ret=name_==33307?3:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i>2]=result[i];break;case 2:HEAPF32[p+i*4>>2]=result[i];break;case 4:HEAP8[p+i>>0]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Unknown object returned from WebGL getParameter("+name_+")! (error: "+e+")");return}}break;default:GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Native code calling glGet"+type+"v("+name_+") and it returns "+result+" of type "+typeof result+"!");return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:HEAP32[p>>2]=ret;break;case 2:HEAPF32[p>>2]=ret;break;case 4:HEAP8[p>>0]=ret?1:0;break}};var _glGetFloatv=(name_,p)=>{emscriptenWebGLGet(name_,p,2)};var _glGetIntegerv=(name_,p)=>{emscriptenWebGLGet(name_,p,0)};var _glGetProgramBinary=(program,bufSize,length,binaryFormat,binary)=>{GL.recordError(1282)};var _glGetProgramInfoLog=(program,maxLength,length,infoLog)=>{var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull};var _glGetProgramiv=(program,pname,p)=>{if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){for(var i=0;i>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){for(var i=0;i>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){for(var i=0;i>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}};var _glGetQueryObjectuiv=(id,pname,params)=>{if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx.getQueryParameter(query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret};var _glGetShaderInfoLog=(shader,maxLength,length,infoLog)=>{var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull};var _glGetShaderiv=(shader,pname,p)=>{if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}};var stringToNewUTF8=str=>{var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8(str,ret,size);return ret};var _glGetString=name_=>{var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(e=>"GL_"+e));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s&&stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);if(true)glVersion="OpenGL ES 3.0 ("+glVersion+")";else{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret};var _glGetUniformBlockIndex=(program,uniformBlockName)=>GLctx.getUniformBlockIndex(GL.programs[program],UTF8ToString(uniformBlockName));var jstoi_q=str=>parseInt(str);var webglGetLeftBracePos=name=>name.slice(-1)=="]"&&name.lastIndexOf("[");var webglPrepareUniformLocationsBeforeFirstUse=program=>{var uniformLocsById=program.uniformLocsById,uniformSizeAndIdsByName=program.uniformSizeAndIdsByName,i,j;if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};for(i=0;i0?nm.slice(0,lb):nm;var id=program.uniformIdCounter;program.uniformIdCounter+=sz;uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j{name=UTF8ToString(name);if(program=GL.programs[program]){webglPrepareUniformLocationsBeforeFirstUse(program);var uniformLocsById=program.uniformLocsById;var arrayIndex=0;var uniformBaseName=name;var leftBrace=webglGetLeftBracePos(name);if(leftBrace>0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex{var list=tempFixedLengthArray[numAttachments];for(var i=0;i>2]}GLctx.invalidateFramebuffer(target,list)};var _glLinkProgram=program=>{program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}};var emscriptenWebGLGetBufferBinding=target=>{switch(target){case 34962:target=34964;break;case 34963:target=34965;break;case 35051:target=35053;break;case 35052:target=35055;break;case 35982:target=35983;break;case 36662:target=36662;break;case 36663:target=36663;break;case 35345:target=35368;break}var buffer=GLctx.getParameter(target);if(buffer)return buffer.name|0;else return 0};var emscriptenWebGLValidateMapBufferTarget=target=>{switch(target){case 34962:case 34963:case 36662:case 36663:case 35051:case 35052:case 35882:case 35982:case 35345:return true;default:return false}};var _glMapBufferRange=(target,offset,length,access)=>{if((access&(1|32))!=0){err("glMapBufferRange access does not support MAP_READ or MAP_UNSYNCHRONIZED");return 0}if((access&2)==0){err("glMapBufferRange access must include MAP_WRITE");return 0}if((access&(4|8))==0){err("glMapBufferRange access must include INVALIDATE_BUFFER or INVALIDATE_RANGE");return 0}if(!emscriptenWebGLValidateMapBufferTarget(target)){GL.recordError(1280);err("GL_INVALID_ENUM in glMapBufferRange");return 0}var mem=_malloc(length),binding=emscriptenWebGLGetBufferBinding(target);if(!mem)return 0;if(!GL.mappedBuffers[binding])GL.mappedBuffers[binding]={};binding=GL.mappedBuffers[binding];binding.offset=offset;binding.length=length;binding.mem=mem;binding.access=access;return mem};var _glPixelStorei=(pname,param)=>{if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)};function _glPolygonOffset(x0,x1){GLctx.polygonOffset(x0,x1)}var _glProgramBinary=(program,binaryFormat,binary,length)=>{GL.recordError(1280)};var computeUnpackAlignedImageSize=(width,height,sizePerPixel,alignment)=>{function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=width*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,alignment);return height*alignedRowSize};var colorChannelsInGlTextureFormat=format=>{var colorChannels={5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4};return colorChannels[format-6402]||1};var heapObjectForWebGLType=type=>{type-=5120;if(type==0)return HEAP8;if(type==1)return HEAPU8;if(type==2)return HEAP16;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922||type==28520||type==30779||type==30782)return HEAPU32;return HEAPU16};var heapAccessShiftForWebGLHeap=heap=>31-Math.clz32(heap.BYTES_PER_ELEMENT);var emscriptenWebGLGetTexPixelData=(type,format,width,height,pixels,internalFormat)=>{var heap=heapObjectForWebGLType(type);var shift=heapAccessShiftForWebGLHeap(heap);var byteSize=1<>shift,pixels+bytes>>shift)};var _glReadPixels=(x,y,width,height,format,type,pixels)=>{if(true){if(GLctx.currentPixelPackBufferBinding){GLctx.readPixels(x,y,width,height,format,type,pixels)}else{var heap=heapObjectForWebGLType(type);GLctx.readPixels(x,y,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}return}var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)};function _glRenderbufferStorage(x0,x1,x2,x3){GLctx.renderbufferStorage(x0,x1,x2,x3)}function _glRenderbufferStorageMultisample(x0,x1,x2,x3,x4){GLctx.renderbufferStorageMultisample(x0,x1,x2,x3,x4)}var _glSamplerParameterf=(sampler,pname,param)=>{GLctx.samplerParameterf(GL.samplers[sampler],pname,param)};var _glSamplerParameteri=(sampler,pname,param)=>{GLctx.samplerParameteri(GL.samplers[sampler],pname,param)};function _glScissor(x0,x1,x2,x3){GLctx.scissor(x0,x1,x2,x3)}var _glShaderSource=(shader,count,string,length)=>{var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)};function _glStencilFuncSeparate(x0,x1,x2,x3){GLctx.stencilFuncSeparate(x0,x1,x2,x3)}function _glStencilMaskSeparate(x0,x1){GLctx.stencilMaskSeparate(x0,x1)}function _glStencilOpSeparate(x0,x1,x2,x3){GLctx.stencilOpSeparate(x0,x1,x2,x3)}var _glTexImage2D=(target,level,internalFormat,width,height,border,format,type,pixels)=>{if(true){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,null)}return}GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null)};function _glTexParameterf(x0,x1,x2){GLctx.texParameterf(x0,x1,x2)}function _glTexParameteri(x0,x1,x2){GLctx.texParameteri(x0,x1,x2)}function _glTexStorage2D(x0,x1,x2,x3,x4){GLctx.texStorage2D(x0,x1,x2,x3,x4)}function _glTexStorage3D(x0,x1,x2,x3,x4,x5){GLctx.texStorage3D(x0,x1,x2,x3,x4,x5)}var _glTexSubImage2D=(target,level,xoffset,yoffset,width,height,format,type,pixels)=>{if(true){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,null)}return}var pixelData=null;if(pixels)pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)};var _glTexSubImage3D=(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)=>{if(GLctx.currentPixelUnpackBufferBinding){GLctx.texSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,null)}};var webglGetUniformLocation=location=>{var p=GLctx.currentProgram;if(p){var webglLoc=p.uniformLocsById[location];if(typeof webglLoc=="number"){p.uniformLocsById[location]=webglLoc=GLctx.getUniformLocation(p,p.uniformArrayNamesById[location]+(webglLoc>0?"["+webglLoc+"]":""))}return webglLoc}else{GL.recordError(1282)}};var _glUniform1f=(location,v0)=>{GLctx.uniform1f(webglGetUniformLocation(location),v0)};var _glUniform1fv=(location,count,value)=>{count&&GLctx.uniform1fv(webglGetUniformLocation(location),HEAPF32,value>>2,count)};var _glUniform1i=(location,v0)=>{GLctx.uniform1i(webglGetUniformLocation(location),v0)};var _glUniform1iv=(location,count,value)=>{count&&GLctx.uniform1iv(webglGetUniformLocation(location),HEAP32,value>>2,count)};var _glUniform2fv=(location,count,value)=>{count&&GLctx.uniform2fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*2)};var _glUniform2iv=(location,count,value)=>{count&&GLctx.uniform2iv(webglGetUniformLocation(location),HEAP32,value>>2,count*2)};var _glUniform3fv=(location,count,value)=>{count&&GLctx.uniform3fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*3)};var _glUniform3iv=(location,count,value)=>{count&&GLctx.uniform3iv(webglGetUniformLocation(location),HEAP32,value>>2,count*3)};var _glUniform4fv=(location,count,value)=>{count&&GLctx.uniform4fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*4)};var _glUniform4iv=(location,count,value)=>{count&&GLctx.uniform4iv(webglGetUniformLocation(location),HEAP32,value>>2,count*4)};var _glUniformBlockBinding=(program,uniformBlockIndex,uniformBlockBinding)=>{program=GL.programs[program];GLctx.uniformBlockBinding(program,uniformBlockIndex,uniformBlockBinding)};var _glUniformMatrix3fv=(location,count,transpose,value)=>{count&&GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*9)};var _glUniformMatrix4fv=(location,count,transpose,value)=>{count&&GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*16)};var _glUnmapBuffer=target=>{if(!emscriptenWebGLValidateMapBufferTarget(target)){GL.recordError(1280);err("GL_INVALID_ENUM in glUnmapBuffer");return 0}var buffer=emscriptenWebGLGetBufferBinding(target);var mapping=GL.mappedBuffers[buffer];if(!mapping||!mapping.mem){GL.recordError(1282);err("buffer was never mapped in glUnmapBuffer");return 0}if(!(mapping.access&16))if(true){GLctx.bufferSubData(target,mapping.offset,HEAPU8,mapping.mem,mapping.length)}else{GLctx.bufferSubData(target,mapping.offset,HEAPU8.subarray(mapping.mem,mapping.mem+mapping.length))}_free(mapping.mem);mapping.mem=0;return 1};var _glUseProgram=program=>{program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program};function _glVertexAttrib4f(x0,x1,x2,x3,x4){GLctx.vertexAttrib4f(x0,x1,x2,x3,x4)}function _glVertexAttribI4ui(x0,x1,x2,x3,x4){GLctx.vertexAttribI4ui(x0,x1,x2,x3,x4)}var _glVertexAttribIPointer=(index,size,type,stride,ptr)=>{var cb=GL.currentContext.clientBuffers[index];if(!GLctx.currentArrayBufferBinding){cb.size=size;cb.type=type;cb.normalized=false;cb.stride=stride;cb.ptr=ptr;cb.clientside=true;cb.vertexAttribPointerAdaptor=function(index,size,type,normalized,stride,ptr){this.vertexAttribIPointer(index,size,type,stride,ptr)};return}cb.clientside=false;GLctx.vertexAttribIPointer(index,size,type,stride,ptr)};var _glVertexAttribPointer=(index,size,type,normalized,stride,ptr)=>{var cb=GL.currentContext.clientBuffers[index];if(!GLctx.currentArrayBufferBinding){cb.size=size;cb.type=type;cb.normalized=normalized;cb.stride=stride;cb.ptr=ptr;cb.clientside=true;cb.vertexAttribPointerAdaptor=function(index,size,type,normalized,stride,ptr){this.vertexAttribPointer(index,size,type,normalized,stride,ptr)};return}cb.clientside=false;GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)};function _glViewport(x0,x1,x2,x3){GLctx.viewport(x0,x1,x2,x3)}var isLeapYear=year=>year%4===0&&(year%100!==0||year%400===0);var arraySum=(array,index)=>{var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum};var MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];var addDays=(date,days)=>{var newDate=new Date(date.getTime());while(days>0){var leap=isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var _strftime=(s,maxsize,format,tm)=>{var tm_zone=HEAPU32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}return thisDate.getFullYear()}return thisDate.getFullYear()-1}var EXPANSION_RULES_2={"%a":date=>WEEKDAYS[date.tm_wday].substring(0,3),"%A":date=>WEEKDAYS[date.tm_wday],"%b":date=>MONTHS[date.tm_mon].substring(0,3),"%B":date=>MONTHS[date.tm_mon],"%C":date=>{var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":date=>leadingNulls(date.tm_mday,2),"%e":date=>leadingSomething(date.tm_mday,2," "),"%g":date=>getWeekBasedYear(date).toString().substring(2),"%G":date=>getWeekBasedYear(date),"%H":date=>leadingNulls(date.tm_hour,2),"%I":date=>{var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":date=>leadingNulls(date.tm_mday+arraySum(isLeapYear(date.tm_year+1900)?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR,date.tm_mon-1),3),"%m":date=>leadingNulls(date.tm_mon+1,2),"%M":date=>leadingNulls(date.tm_min,2),"%n":()=>"\n","%p":date=>{if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}return"PM"},"%S":date=>leadingNulls(date.tm_sec,2),"%t":()=>"\t","%u":date=>date.tm_wday||7,"%U":date=>{var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":date=>{var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":date=>date.tm_wday,"%W":date=>{var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":date=>(date.tm_year+1900).toString().substring(2),"%Y":date=>date.tm_year+1900,"%z":date=>{var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":date=>date.tm_zone,"%%":()=>"%"};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1};var _strftime_l=(s,maxsize,format,tm,loc)=>_strftime(s,maxsize,format,tm);var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();InternalError=Module["InternalError"]=class InternalError extends Error{constructor(message){super(message);this.name="InternalError"}};embind_init_charCodes();BindingError=Module["BindingError"]=class BindingError extends Error{constructor(message){super(message);this.name="BindingError"}};init_ClassHandle();init_embind();init_RegisteredPointer();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");handleAllocatorInit();init_emval();var GLctx;for(var i=0;i<32;++i)tempFixedLengthArray.push(new Array(i));var wasmImports={Fa:___syscall_fcntl64,Kb:___syscall_ioctl,Lb:___syscall_openat,Gb:___syscall_stat64,x:__embind_finalize_value_array,l:__embind_finalize_value_object,Ab:__embind_register_bigint,Rb:__embind_register_bool,f:__embind_register_class,k:__embind_register_class_class_function,o:__embind_register_class_constructor,a:__embind_register_class_function,w:__embind_register_class_property,Qb:__embind_register_emval,j:__embind_register_enum,b:__embind_register_enum_value,Ha:__embind_register_float,ca:__embind_register_function,B:__embind_register_integer,p:__embind_register_memory_view,Ga:__embind_register_std_string,pa:__embind_register_std_wstring,y:__embind_register_value_array,h:__embind_register_value_array_element,m:__embind_register_value_object,d:__embind_register_value_object_field,Sb:__embind_register_void,Nb:__emscripten_get_now_is_monotonic,s:__emval_as,i:__emval_decref,t:__emval_get_property,ba:__emval_incref,G:__emval_new_cstring,r:__emval_run_destructors,u:__emval_take_value,c:_abort,na:_emscripten_asm_const_int,Ob:_emscripten_date_now,yb:_emscripten_err,Fb:_emscripten_get_heap_max,Mb:_emscripten_get_now,Pb:_emscripten_memcpy_js,xb:_emscripten_out,Eb:_emscripten_resize_heap,Hb:_environ_get,Ib:_environ_sizes_get,oa:_fd_close,Jb:_fd_read,zb:_fd_seek,Ea:_fd_write,Cb:_getentropy,e:_glActiveTexture,ma:_glAttachShader,jb:_glBeginQuery,rb:_glBindAttribLocation,n:_glBindBuffer,ua:_glBindBufferBase,Va:_glBindBufferRange,P:_glBindFramebuffer,Na:_glBindRenderbuffer,_:_glBindSampler,g:_glBindTexture,fb:_glBindVertexArray,wa:_glBlendEquationSeparate,va:_glBlendFuncSeparate,ea:_glBlitFramebuffer,E:_glBufferData,fa:_glBufferSubData,Wb:_glClear,$b:_glClearBufferfi,C:_glClearBufferfv,_b:_glClearBufferiv,Zb:_glClearColor,Yb:_glClearDepthf,Xb:_glClearStencil,Bb:_glClientWaitSync,ka:_glColorMask,sb:_glCompileShader,Ka:_glCompressedTexSubImage2D,Ja:_glCompressedTexSubImage3D,kc:_glCopyBufferSubData,Da:_glCreateProgram,ub:_glCreateShader,xa:_glCullFace,ha:_glDeleteBuffers,U:_glDeleteFramebuffers,$:_glDeleteProgram,ib:_glDeleteQueries,Sa:_glDeleteRenderbuffers,za:_glDeleteSamplers,R:_glDeleteShader,Pa:_glDeleteSync,Ta:_glDeleteTextures,gb:_glDeleteVertexArrays,la:_glDepthFunc,ja:_glDepthMask,ra:_glDepthRangef,S:_glDetachShader,q:_glDisable,cc:_glDisableVertexAttribArray,jc:_glDrawBuffers,Ia:_glDrawElements,Qa:_glDrawElementsInstanced,v:_glEnable,dc:_glEnableVertexAttribArray,kb:_glEndQuery,ga:_glFenceSync,Ca:_glFinish,nb:_glFlush,H:_glFramebufferRenderbuffer,A:_glFramebufferTexture2D,L:_glFramebufferTextureLayer,ya:_glFrontFace,X:_glGenBuffers,da:_glGenFramebuffers,hb:_glGenQueries,qa:_glGenRenderbuffers,Ba:_glGenSamplers,M:_glGenTextures,eb:_glGenVertexArrays,mc:_glGenerateMipmap,Vb:_glGetBufferSubData,aa:_glGetError,db:_glGetFloatv,z:_glGetIntegerv,vb:_glGetProgramBinary,ob:_glGetProgramInfoLog,T:_glGetProgramiv,lb:_glGetQueryObjectuiv,pb:_glGetShaderInfoLog,Q:_glGetShaderiv,J:_glGetString,bb:_glGetUniformBlockIndex,W:_glGetUniformLocation,cb:_glHint,mb:_glInvalidateFramebuffer,qb:_glLinkProgram,Ub:_glMapBufferRange,N:_glPixelStorei,ia:_glPolygonOffset,wb:_glProgramBinary,Ra:_glReadPixels,ac:_glRenderbufferStorage,bc:_glRenderbufferStorageMultisample,Aa:_glSamplerParameterf,I:_glSamplerParameteri,ta:_glScissor,tb:_glShaderSource,Z:_glStencilFuncSeparate,F:_glStencilMaskSeparate,Y:_glStencilOpSeparate,K:_glTexImage2D,Ua:_glTexParameterf,D:_glTexParameteri,ic:_glTexStorage2D,Oa:_glTexStorage3D,Ma:_glTexSubImage2D,La:_glTexSubImage3D,lc:_glUniform1f,$a:_glUniform1fv,V:_glUniform1i,Xa:_glUniform1iv,_a:_glUniform2fv,Wa:_glUniform2iv,Za:_glUniform3fv,qc:_glUniform3iv,Ya:_glUniform4fv,pc:_glUniform4iv,ab:_glUniformBlockBinding,oc:_glUniformMatrix3fv,nc:_glUniformMatrix4fv,Tb:_glUnmapBuffer,O:_glUseProgram,ec:_glVertexAttrib4f,fc:_glVertexAttribI4ui,hc:_glVertexAttribIPointer,gc:_glVertexAttribPointer,sa:_glViewport,Db:_strftime_l};var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["sc"])();var _malloc=a0=>(_malloc=wasmExports["uc"])(a0);var _free=a0=>(_free=wasmExports["vc"])(a0);var ___errno_location=()=>(___errno_location=wasmExports["wc"])();var ___getTypeName=a0=>(___getTypeName=wasmExports["xc"])(a0);var __embind_initialize_bindings=Module["__embind_initialize_bindings"]=()=>(__embind_initialize_bindings=Module["__embind_initialize_bindings"]=wasmExports["yc"])();var dynCall_ji=Module["dynCall_ji"]=(a0,a1)=>(dynCall_ji=Module["dynCall_ji"]=wasmExports["zc"])(a0,a1);var dynCall_j=Module["dynCall_j"]=a0=>(dynCall_j=Module["dynCall_j"]=wasmExports["Ac"])(a0);var dynCall_vij=Module["dynCall_vij"]=(a0,a1,a2,a3)=>(dynCall_vij=Module["dynCall_vij"]=wasmExports["Bc"])(a0,a1,a2,a3);var dynCall_viij=Module["dynCall_viij"]=(a0,a1,a2,a3,a4)=>(dynCall_viij=Module["dynCall_viij"]=wasmExports["Cc"])(a0,a1,a2,a3,a4);var dynCall_iiiiij=Module["dynCall_iiiiij"]=(a0,a1,a2,a3,a4,a5,a6)=>(dynCall_iiiiij=Module["dynCall_iiiiij"]=wasmExports["Dc"])(a0,a1,a2,a3,a4,a5,a6);var dynCall_jii=Module["dynCall_jii"]=(a0,a1,a2)=>(dynCall_jii=Module["dynCall_jii"]=wasmExports["Ec"])(a0,a1,a2);var dynCall_iiij=Module["dynCall_iiij"]=(a0,a1,a2,a3,a4)=>(dynCall_iiij=Module["dynCall_iiij"]=wasmExports["Fc"])(a0,a1,a2,a3,a4);var dynCall_iiiij=Module["dynCall_iiiij"]=(a0,a1,a2,a3,a4,a5)=>(dynCall_iiiij=Module["dynCall_iiiij"]=wasmExports["Gc"])(a0,a1,a2,a3,a4,a5);var dynCall_vijji=Module["dynCall_vijji"]=(a0,a1,a2,a3,a4,a5,a6)=>(dynCall_vijji=Module["dynCall_vijji"]=wasmExports["Hc"])(a0,a1,a2,a3,a4,a5,a6);var dynCall_jiji=Module["dynCall_jiji"]=(a0,a1,a2,a3,a4)=>(dynCall_jiji=Module["dynCall_jiji"]=wasmExports["Ic"])(a0,a1,a2,a3,a4);var dynCall_viijii=Module["dynCall_viijii"]=(a0,a1,a2,a3,a4,a5,a6)=>(dynCall_viijii=Module["dynCall_viijii"]=wasmExports["Jc"])(a0,a1,a2,a3,a4,a5,a6);var dynCall_iiiiijj=Module["dynCall_iiiiijj"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8)=>(dynCall_iiiiijj=Module["dynCall_iiiiijj"]=wasmExports["Kc"])(a0,a1,a2,a3,a4,a5,a6,a7,a8);var dynCall_iiiiiijj=Module["dynCall_iiiiiijj"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)=>(dynCall_iiiiiijj=Module["dynCall_iiiiiijj"]=wasmExports["Lc"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run(); - return Filament.ready + return moduleArg.ready } + ); })(); if (typeof exports === 'object' && typeof module === 'object') module.exports = Filament; else if (typeof define === 'function' && define['amd']) - define([], function() { return Filament; }); -else if (typeof exports === 'object') - exports["Filament"] = Filament; + define([], () => Filament); /* * Copyright (C) 2018 The Android Open Source Project * @@ -173,13 +171,13 @@ Filament.loadGeneratedExtensions = function() { // JavaScript binding for dirt is not yet supported, must use default value. // JavaScript binding for dirtStrength is not yet supported, must use default value. strength: 0.10, - resolution: 360, - anamorphism: 1.0, + resolution: 384, levels: 6, blendMode: Filament.View$BloomOptions$BlendMode.ADD, threshold: true, enabled: false, highlight: 1000.0, + quality: Filament.View$QualityLevel.LOW, lensFlare: false, starburst: true, chromaticAberration: 0.005, @@ -196,14 +194,16 @@ Filament.loadGeneratedExtensions = function() { Filament.View.prototype.setFogOptionsDefaults = function(overrides) { const options = { distance: 0.0, + cutOffDistance: Infinity, maximumOpacity: 1.0, height: 0.0, heightFalloff: 1.0, - color: [0.5, 0.5, 0.5], + color: [ 1.0, 1.0, 1.0 ], density: 0.1, inScatteringStart: 0.0, inScatteringSize: -1.0, fogColorFromIbl: false, + // JavaScript binding for skyColor is not yet supported, must use default value. enabled: false, }; return Object.assign(options, overrides); @@ -212,6 +212,7 @@ Filament.loadGeneratedExtensions = function() { Filament.View.prototype.setDepthOfFieldOptionsDefaults = function(overrides) { const options = { cocScale: 1.0, + cocAspectRatio: 1.0, maxApertureDiameter: 0.01, enabled: false, filter: Filament.View$DepthOfFieldOptions$Filter.MEDIAN, @@ -290,8 +291,20 @@ Filament.loadGeneratedExtensions = function() { Filament.View.prototype.setTemporalAntiAliasingOptionsDefaults = function(overrides) { const options = { filterWidth: 1.0, - feedback: 0.04, + feedback: 0.12, + lodBias: -1.0, + sharpness: 0.0, enabled: false, + upscaling: false, + filterHistory: true, + filterInput: true, + useYCoCg: false, + boxType: Filament.View$TemporalAntiAliasingOptions$BoxType.AABB, + boxClipping: Filament.View$TemporalAntiAliasingOptions$BoxClipping.ACCURATE, + jitterPattern: Filament.View$TemporalAntiAliasingOptions$JitterPattern.HALTON_23_X16, + varianceGamma: 1.0, + preventFlickering: false, + historyReprojection: true, }; return Object.assign(options, overrides); }; @@ -334,6 +347,13 @@ Filament.loadGeneratedExtensions = function() { return Object.assign(options, overrides); }; + Filament.View.prototype.setStereoscopicOptionsDefaults = function(overrides) { + const options = { + enabled: false, + }; + return Object.assign(options, overrides); + }; + }; /* @@ -677,6 +697,12 @@ Filament.loadClassExtensions = function() { this._setGuardBandOptions(options); }; + /// setStereoscopicOptions ::method:: + Filament.View.prototype.setStereoscopicOptions = function(overrides) { + const options = this.setStereoscopicOptionsDefaults(overrides); + this._setStereoscopicOptions(options); + } + /// BufferObject ::core class:: /// setBuffer ::method:: diff --git a/docs/webgl/filament.wasm b/docs/webgl/filament.wasm index 8023c92e084..263adb064fd 100644 Binary files a/docs/webgl/filament.wasm and b/docs/webgl/filament.wasm differ diff --git a/docs/webgl/metallic.ktx2 b/docs/webgl/metallic.ktx2 new file mode 100644 index 00000000000..a6de1f86458 Binary files /dev/null and b/docs/webgl/metallic.ktx2 differ diff --git a/docs/webgl/normal.ktx2 b/docs/webgl/normal.ktx2 new file mode 100644 index 00000000000..9b24f4d8b4c Binary files /dev/null and b/docs/webgl/normal.ktx2 differ diff --git a/docs/webgl/parquet.filamat b/docs/webgl/parquet.filamat index 579d57f36ce..815f479039c 100644 Binary files a/docs/webgl/parquet.filamat and b/docs/webgl/parquet.filamat differ diff --git a/docs/webgl/plastic.filamat b/docs/webgl/plastic.filamat index 44772ae9615..b2e395a8744 100644 Binary files a/docs/webgl/plastic.filamat and b/docs/webgl/plastic.filamat differ diff --git a/docs/webgl/reference.html b/docs/webgl/reference.html index 77a9fce786c..caca8d96b91 100644 --- a/docs/webgl/reference.html +++ b/docs/webgl/reference.html @@ -587,6 +587,7 @@

    class Engine

  • overrides Dictionary with one or more of the following properties: mapSize, shadowCascades, constantBias, normalBias, shadowFar, shadowNearHint, shadowFarHint, stable, polygonOffsetConstant, polygonOffsetSlope, \
  • +
  • engine.setStereoscopicOptions()
  • engine.setTemporalAntiAliasingOptions()
  • engine.setVignetteOptions()
  • @@ -1462,6 +1463,8 @@

    enum Texture$Usage

  • STENCIL_ATTACHMENT
  • UPLOADABLE
  • SAMPLEABLE
  • +
  • BLIT_SRC
  • +
  • BLIT_DST
  • SUBPASS_INPUT
  • diff --git a/docs/webgl/roughness.ktx2 b/docs/webgl/roughness.ktx2 new file mode 100644 index 00000000000..73b865aee8a Binary files /dev/null and b/docs/webgl/roughness.ktx2 differ diff --git a/docs/webgl/suzanne.filamesh b/docs/webgl/suzanne.filamesh index 34a9a990728..106c4e9c1a5 100644 Binary files a/docs/webgl/suzanne.filamesh and b/docs/webgl/suzanne.filamesh differ diff --git a/docs/webgl/textured.filamat b/docs/webgl/textured.filamat index 7e1e72b2676..63d8ae8f601 100644 Binary files a/docs/webgl/textured.filamat and b/docs/webgl/textured.filamat differ diff --git a/docs/webgl/triangle.filamat b/docs/webgl/triangle.filamat index 0190da781f8..22b420d2eca 100644 Binary files a/docs/webgl/triangle.filamat and b/docs/webgl/triangle.filamat differ diff --git a/docs/webgl/tutorial_suzanne.html b/docs/webgl/tutorial_suzanne.html index bfaf97e97cd..7a1730dd7c0 100644 --- a/docs/webgl/tutorial_suzanne.html +++ b/docs/webgl/tutorial_suzanne.html @@ -22,27 +22,26 @@

    Create mipmapped textures

    Next, let's create mipmapped KTX files using filament's mipgen tool. We'll create compressed and non-compressed variants for each texture, since not all platforms support the same compression formats. First copy over the PNG files from the monkey folder, then do:

    -
    # Create mipmaps for base color and two compressed variants.
    -mipgen albedo.png albedo.ktx
    -mipgen --compression=astc_fast_ldr_4x4 albedo.png albedo_astc.ktx
    -mipgen --compression=s3tc_rgb_dxt1 albedo.png albedo_s3tc_srgb.ktx
    +
    # Create mipmaps for base color
    +mipgen albedo.png albedo.ktx2
    +mipgen --compression=uastc albedo.png albedo.ktx2
     
     # Create mipmaps for the normal map and a compressed variant.
     mipgen --strip-alpha --kernel=NORMALS --linear normal.png normal.ktx
    -mipgen --strip-alpha --kernel=NORMALS --linear --compression=etc_rgb8_normalxyz_40 \
    -    normal.png normal_etc.ktx
    +mipgen --strip-alpha --kernel=NORMALS --linear --compression=uastc_normals \
    +    normal.png normal.ktx2
     
     # Create mipmaps for the single-component roughness map and a compressed variant.
     mipgen --grayscale roughness.png roughness.ktx
    -mipgen --grayscale --compression=etc_r11_numeric_40 roughness.png roughness_etc.ktx
    +mipgen --grayscale --compression=uastc roughness.png roughness.ktx2
     
     # Create mipmaps for the single-component metallic map and a compressed variant.
     mipgen --grayscale metallic.png metallic.ktx
    -mipgen --grayscale --compression=etc_r11_numeric_40 metallic.png metallic_etc.ktx
    +mipgen --grayscale --compression=uastc metallic.png metallic.ktx2
     
     # Create mipmaps for the single-component occlusion map and a compressed variant.
     mipgen --grayscale ao.png ao.ktx
    -mipgen --grayscale --compression=etc_r11_numeric_40 ao.png ao_etc.ktx
    +mipgen --grayscale --compression=uastc ao.png ao.ktx2
     

    For more information on mipgen's arguments and supported formats, do mipgen --help.

    @@ -207,11 +206,11 @@

    Fetch assets asychronously

    recreate the skybox using a higher-resolution texture. As a last step we unhide the renderable that was created in the app constructor.

    Filament.fetch([sky_large_url, albedo_url, roughness_url, metallic_url, normal_url, ao_url], () => {
    -    const albedo = this.engine.createTextureFromKtx1(albedo_url, {srgb: true});
    -    const roughness = this.engine.createTextureFromKtx1(roughness_url);
    -    const metallic = this.engine.createTextureFromKtx1(metallic_url);
    -    const normal = this.engine.createTextureFromKtx1(normal_url);
    -    const ao = this.engine.createTextureFromKtx1(ao_url);
    +    const albedo = this.engine.createTextureFromKtx2(albedo_url, {srgb: true});
    +    const roughness = this.engine.createTextureFromKtx2(roughness_url);
    +    const metallic = this.engine.createTextureFromKtx2(metallic_url);
    +    const normal = this.engine.createTextureFromKtx2(normal_url);
    +    const ao = this.engine.createTextureFromKtx2(ao_url);
     
         const sampler = new Filament.TextureSampler(
             Filament.MinFilter.LINEAR_MIPMAP_LINEAR,
    diff --git a/docs/webgl/tutorial_suzanne.js b/docs/webgl/tutorial_suzanne.js
    index c02043ecec5..1201b41a49b 100644
    --- a/docs/webgl/tutorial_suzanne.js
    +++ b/docs/webgl/tutorial_suzanne.js
    @@ -33,13 +33,13 @@ class App {
         });
         Filament.fetch([sky_large_url, albedo_url, roughness_url, metallic_url, normal_url, ao_url],
         () => {
    -      const albedo = this.engine.createTextureFromKtx1(albedo_url, {
    +      const albedo = this.engine.createTextureFromKtx2(albedo_url, {
             srgb: true
           });
    -      const roughness = this.engine.createTextureFromKtx1(roughness_url);
    -      const metallic = this.engine.createTextureFromKtx1(metallic_url);
    -      const normal = this.engine.createTextureFromKtx1(normal_url);
    -      const ao = this.engine.createTextureFromKtx1(ao_url);
    +      const roughness = this.engine.createTextureFromKtx2(roughness_url);
    +      const metallic = this.engine.createTextureFromKtx2(metallic_url);
    +      const normal = this.engine.createTextureFromKtx2(normal_url);
    +      const ao = this.engine.createTextureFromKtx2(ao_url);
           const sampler = new Filament.TextureSampler(Filament.MinFilter.LINEAR_MIPMAP_LINEAR,
             Filament.MagFilter.LINEAR, Filament.WrapMode.CLAMP_TO_EDGE);
           this.matinstance.setTextureParameter('albedo', albedo, sampler);
    diff --git a/docs_src/.gitignore b/docs_src/.gitignore
    new file mode 100644
    index 00000000000..9df0444c32f
    --- /dev/null
    +++ b/docs_src/.gitignore
    @@ -0,0 +1,2 @@
    +book
    +src/dup/*.md
    diff --git a/docs_src/README.md b/docs_src/README.md
    new file mode 100644
    index 00000000000..a827206f765
    --- /dev/null
    +++ b/docs_src/README.md
    @@ -0,0 +1,89 @@
    +# Documentation
    +
    +Filament's documentation (which you are reading) is a collection of pages created with [`mdBook`].
    +
    +## How the book is created and updated {#how-to-create}
    +### Prerequisites
    + - Install [`mdBook`] for your platform
    + - `selenium` package for python
    +   ```shell
    +   python3 -m pip install selenium
    +   ```
    +
    +### Generate  {#how-to-generate}
    +We wrote a python script to gather and transform the different documents in the project tree into a
    +single book. This script can be found in [`docs_src/build/run.py`]. In addition,
    +[`docs_src/build/duplicates.json`] is used to describe the markdown files that are copied and
    +transformed from the source tree. These copies are placed into `docs_src/src/dup`.
    +
    +To collect the pages and generate the book, run the following
    +```shell
    +cd docs_src
    +python3 build/run.py
    +```
    +
    +### Copy to `docs`
    +`docs` is the github-specfic directory for producing a web frontend (i.e. documentation) for a
    +project.
    +
    +(To be completed)
    +
    +## Document sources
    +We list the different document sources and how they are copied and processed into the collection
    +of markdown files that are then processed with `mdBook`.
    +
    +### Introductory docs {#introductory-doc}
    +The [github landing page] for Filament displays an extensive introduction to Filament. It
    +links to `BUILDING.md` and `CONTRIBUTING.md`, which are conventional pages for building or
    +contributing to the project. We copy these pages from their respective locations in the project
    +tree into `docs_src/src/dup`. Moreover, to restore valid linkage between the pages, we need
    +to perform a number of URL replacements in addition to the copy. These replacements are
    +described in [`docs_src/build/duplicates.json`].
    +
    +### Core concept docs
    +The primary design of Filament as a phyiscally-based renderer and details of its materials
    +system are described in `Filament.md.html` and `Materials.md.html`, respectively. These two
    +documents are written in [`markdeep`]. To embed them into our book, we
    + 1. Convert the markdeep into html
    + 2. Embed the html output in a markdown file
    + 3. Place the markdown file in `docs_src/src/main`
    +
    +We describe step 1 in detail for the sake of record:
    + - Start a local-only server to serve the markdeep file (e.g. `Filament.md.html`)
    + - Start a `selenium` driver (essentially run chromium in headless mode)
    + - Visit the local page through the driver (i.e. open url `http://localhost:xx/Filament.md.html?export`)
    + - Parse out the exported output in the retrieved html (note that the output of the markdeep
    +   export is an html with the output captured in a `
    ` tag).
    + - Replace css styling in the exported output as needed (so they don't interfere with the book's css.
    + - Replace resource urls to refer to locations relative to the mdbook structure.
    +
    +### READMEs
    +Filament depends on a number of libraries, which reside in the directory `libs`. These individual
    +libaries often have README.md in their root to describe itself. We collect these descriptions into our
    +book. In addition, client usage of Filament also requires using a set of binary tools, which are
    +located in `tools`. Some of tools also have README.md as description. We also collect them into the book.
    +
    +The process for copying and processing these READMEs is outlined in [Introductory docs](#introductory-doc).
    +
    +### Other technical notes
    +These are technical documents that do not fit into a library, tool, or directory of the
    +Filament source tree. We collect them into the `docs_src/src/notes` directory. No additional
    +processing are needed for these documents.
    +
    +## Adding more documents
    +To add any documentation, first consider the type of the document you like to add. If it
    +belongs to any of the above sources, then simply place the document in the appropriate place,
    +add a link in `SUMMARY.md`, and perform the steps outlined in
    +[how-to create section](#how-to-create).
    +
    +For example, if you are adding a general technical note, then you would
    + - Place the document (file with extension `.md`) in `docs_src/src/notes`
    + - Add a link in [`docs_src/src/SUMMARY.md`]
    + - Run the commands in the [Generate](#how-to-generate) section
    +
    +[github landing page]: https://google.github.io/filament
    +[`mdBook`]: https://rust-lang.github.io/mdBook/
    +[`markdeep`]: https://casual-effects.com/markdeep/
    +[`docs_src/build/run.py`]: https://github.com/google/filament/blob/main/docs_src/build/run.py
    +[`docs_src/build/duplicates.json`]: https://github.com/google/filament/blob/main/docs_src/build/duplicates.json
    +[`docs_src/src/SUMMARY.md`]: https://github.com/google/filament/blob/main/docs_src/src/SUMMARY.md
    diff --git a/docs_src/book.toml b/docs_src/book.toml
    new file mode 100644
    index 00000000000..1050eee0002
    --- /dev/null
    +++ b/docs_src/book.toml
    @@ -0,0 +1,20 @@
    +[book]
    +authors = []
    +language = "en"
    +multilingual = false
    +src = "src"
    +title = "Filament"
    +
    +[build]
    +create-missing = false
    +
    +[output.html]
    +mathjax-support = true
    +default-theme = "light"
    +preferred-dark-theme = "light"
    +
    +[output.html.print]
    +enable = false
    +
    +[output.html.fold]
    +enable = false
    diff --git a/docs_src/build/duplicates.json b/docs_src/build/duplicates.json
    new file mode 100644
    index 00000000000..d6713799125
    --- /dev/null
    +++ b/docs_src/build/duplicates.json
    @@ -0,0 +1,74 @@
    +{
    +    "README.md": {
    +        "dest": "dup/intro.md",
    +        "link_transforms": {
    +            "BUILDING.md": "building.md",
    +            "/CONTRIBUTING.md": "contributing.md",
    +            "/CODE_STYLE.md": "code_style.md",
    +            "docs/images/samples": "../images/samples"
    +        }
    +    },
    +    "BUILDING.md": {
    +        "dest": "dup/building.md"
    +    },
    +    "CONTRIBUTING.md": {
    +        "dest": "dup/contributing.md"
    +    },
    +    "CODE_STYLE.md": {
    +        "dest": "dup/code_style.md"
    +    },
    +    "libs/uberz/README.md": {
    +        "dest": "dup/uberz.md"
    +    },
    +    "libs/bluegl/README.md": {
    +        "dest": "dup/bluegl.md"
    +    },
    +    "libs/bluevk/README.md": {
    +        "dest": "dup/bluevk.md"
    +    },
    +    "libs/gltfio/README.md": {
    +        "dest": "dup/gltfio.md"
    +    },
    +    "libs/filamat/README.md": {
    +        "dest": "dup/filamat.md"
    +    },
    +    "libs/iblprefilter/README.md": {
    +        "dest": "dup/iblprefilter.md"
    +    },
    +    "libs/matdbg/README.md": {
    +        "dest": "dup/matdbg.md"
    +    },
    +    "tools/normal-blending/README.md": {
    +        "dest": "dup/normal_blending.md"
    +    },
    +    "tools/filamesh/README.md": {
    +        "dest": "dup/filamesh.md"
    +    },
    +    "tools/beamsplitter/README.md": {
    +        "dest": "dup/beamsplitter.md"
    +    },
    +    "tools/cmgen/README.md": {
    +        "dest": "dup/cmgen.md"
    +    },
    +    "tools/mipgen/README.md": {
    +        "dest": "dup/mipgen.md"
    +    },
    +    "tools/matinfo/README.md": {
    +        "dest": "dup/matinfo.md"
    +    },
    +    "tools/roughness-prefilter/README.md": {
    +        "dest": "dup/roughness_prefilter.md"
    +    },
    +    "tools/zbloat/README.md": {
    +        "dest": "dup/zbloat.md"
    +    },
    +    "tools/cso-lut/README.md": {
    +        "dest": "dup/cso_lut.md"
    +    },
    +    "tools/specular-color/README.md": {
    +        "dest": "dup/specular_color.md"
    +    },
    +    "docs_src/README.md": {
    +        "dest": "dup/docs.md"
    +    }
    +}
    diff --git a/docs_src/build/install_mdbook.sh b/docs_src/build/install_mdbook.sh
    new file mode 100644
    index 00000000000..f8f1a236a69
    --- /dev/null
    +++ b/docs_src/build/install_mdbook.sh
    @@ -0,0 +1,87 @@
    +#!/usr/bin/bash
    +
    +# Copyright (C) 2025 The Android Open Source Project
    +#
    +# Licensed under the Apache License, Version 2.0 (the "License");
    +# you may not use this file except in compliance with the License.
    +# You may obtain a copy of the License at
    +#
    +#      http://www.apache.org/licenses/LICENSE-2.0
    +#
    +# Unless required by applicable law or agreed to in writing, software
    +# distributed under the License is distributed on an "AS IS" BASIS,
    +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +# See the License for the specific language governing permissions and
    +# limitations under the License.
    +
    +DARWIN_X86=1
    +LINUX_X86=2
    +DARWIN_ARM=3
    +LINUX_ARM=4
    +
    +function add_cargo_path() {
    +    local BASH_P="${HOME}/.bashrc"
    +    local PATH_LINE='export PATH=${PATH}:~/.cargo/bin'
    +    local TYPE=$1
    +    if [ ${TYPE} == ${DARWIN_ARM} ] || [ ${TYPE} == ${DARWIN_X86} ]; then
    +        BASH_P="${HOME}/.bash_profile"
    +    fi
    +    if ! (grep "${PATH_LINE}" ${BASH_P}); then
    +        echo "${PATH_LINE}" >> ${BASH_P}
    +    fi
    +    source ${BASH_P}
    +}
    +
    +function download_mdbook() {
    +    if command -v mdbook >/dev/null 2>&1; then
    +        echo "mdbook already installed"
    +        exit 0
    +    fi
    +
    +    local CHECK_UNAME="
    +import sys;
    +parts=[a.lower() for a in sys.stdin.read().strip().split(' ')];
    +def get_type():
    +  if 'darwin' in parts:
    +    if 'x86_64' in parts:
    +      return ${DARWIN_X86}
    +    elif 'aarch' in parts:
    +      return ${DARWIN_ARM}
    +  elif 'linux' in parts:
    +    if 'x86_64' in parts:
    +      return ${LINUX_X86}
    +    elif 'aarch' in parts:
    +      return ${LINUX_ARM}
    +  return 0
    +print(get_type())
    +"
    +    local TYPE=`uname -a | python3 -c "${CHECK_UNAME}"`
    +    if [ ${TYPE} == ${DARWIN_ARM} ] || [ ${TYPE} == ${LINUX_ARM} ]; then
    +        # No github prebuilts are available, we build it with rust from source.
    +        # First, need to install rust and cargo
    +        if ! (command -v rustc >/dev/null 2>&1) || ! (command -v cargo >/dev/null 2>&1); then
    +            echo "*** Need to install Rust ***"
    +            curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    +        fi
    +        if ! (command -v cargo >/dev/null 2>&1); then
    +            echo "*** Still cannot find `cargo` ***"
    +            exit 1
    +        fi
    +        cargo install mdbook
    +    else
    +        # Download prebuilts from github
    +        mkdir -p ${HOME}/.cargo/bin
    +        echo "*** Downloading mdbook from github release ***"
    +        DL_URL='https://github.com/rust-lang/mdBook/releases/download/v0.4.43/mdbook-v0.4.43-x86_64-apple-darwin.tar.gz '
    +        if [ ${TYPE} == ${LINUX_X86} ]; then
    +            DL_URL='https://github.com/rust-lang/mdBook/releases/download/v0.4.43/mdbook-v0.4.43-x86_64-unknown-linux-gnu.tar.gz'
    +        fi
    +        curl -L -o ~/Downloads/mdbook.tar.gz ${DL_URL}
    +        mkdir -p /tmp/mdbook
    +        tar -xvzf ~/Downloads/mdbook.tar.gz -C /tmp/mdbook >/dev/null 2>&1
    +        mv /tmp/mdbook/mdbook ~/.cargo/bin/
    +    fi
    +    add_cargo_path ${TYPE}
    +}
    +
    +download_mdbook
    diff --git a/docs_src/build/run.py b/docs_src/build/run.py
    new file mode 100644
    index 00000000000..42573e9f85c
    --- /dev/null
    +++ b/docs_src/build/run.py
    @@ -0,0 +1,128 @@
    +# Copyright (C) 2025 The Android Open Source Project
    +#
    +# Licensed under the Apache License, Version 2.0 (the "License");
    +# you may not use this file except in compliance with the License.
    +# You may obtain a copy of the License at
    +#
    +#      http://www.apache.org/licenses/LICENSE-2.0
    +#
    +# Unless required by applicable law or agreed to in writing, software
    +# distributed under the License is distributed on an "AS IS" BASIS,
    +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +# See the License for the specific language governing permissions and
    +# limitations under the License.
    +
    +import json
    +import os
    +import re
    +from utils import execute, ArgParseImpl
    +
    +CUR_DIR = os.path.dirname(os.path.abspath(__file__))
    +DOCS_SRC_DIR = os.path.join(CUR_DIR, '../')
    +ROOT_DIR = os.path.join(CUR_DIR, '../../')
    +SRC_DIR = os.path.join(CUR_DIR, '../src')
    +MARKDEEP_DIR = os.path.join(CUR_DIR, '../markdeep')
    +DUP_DIR = os.path.join(SRC_DIR, 'dup')
    +MAIN_DIR = os.path.join(SRC_DIR, 'main')
    +
    +def transform_dup_file_link(line, transforms):
    +  URL_CONTENT = '[-a-zA-Z0-9()@:%_\+.~#?&//=]+'
    +  res = re.findall(f'\[(.+)\]\(({URL_CONTENT})\)', line)
    +  for text, url in  res:
    +    word = f'[{text}]({url})'
    +    for tkey in transforms.keys():
    +      if url.startswith(tkey):
    +        nurl = url.replace(tkey, transforms[tkey])
    +        line = line.replace(word, f'[{text}]({nurl})')
    +        break
    +  return line
    +
    +def pull_duplicates():
    +  if not os.path.exists(DUP_DIR):
    +    os.mkdir(DUP_DIR)
    +
    +  config = {}
    +  with open(f'{CUR_DIR}/duplicates.json') as config_txt:
    +    config = json.loads(config_txt.read())
    +
    +  for fin in config.keys():
    +    new_name = config[fin]['dest']
    +    link_transforms = config[fin].get('link_transforms', {})
    +    fpath = os.path.join(ROOT_DIR, fin)
    +    new_fpath = os.path.join(SRC_DIR, new_name)
    +
    +    with open(fpath, 'r') as in_file:
    +      with open(new_fpath, 'w') as out_file:
    +        for line in in_file.readlines():
    +          out_file.write(transform_dup_file_link(line, link_transforms))
    +
    +def pull_markdeep_docs():
    +  import http.server
    +  import socketserver
    +  import threading
    +  from selenium import webdriver
    +  from selenium.webdriver.chrome.options import Options
    +  from selenium.webdriver.common.by import By
    +  import time
    +
    +  class Server(socketserver.ThreadingMixIn, http.server.HTTPServer):
    +    """Handle requests in a separate thread."""
    +
    +  class Handler(http.server.SimpleHTTPRequestHandler):
    +    def __init__(self, *args, **kwargs):
    +        super().__init__(*args, directory=MARKDEEP_DIR, **kwargs)
    +
    +  def start_server(port):
    +    """Starts the web server in a separate thread."""
    +    httpd = Server(("", port), Handler)
    +    server_thread = threading.Thread(target=httpd.serve_forever)
    +    server_thread.daemon = True  # Allow main thread to exit
    +    server_thread.start()
    +    print(f"Server started on port {port}...")
    +    return httpd
    +
    +  PORT = 12345
    +  httpd = start_server(PORT)
    +
    +  # Set up Chrome options for headless mode
    +  chrome_options = Options()
    +  chrome_options.add_argument("--headless")
    +
    +  # This option is necessary for running on some VMs
    +  chrome_options.add_argument("--no-sandbox")
    +
    +  # Create a new Chrome instance in headless mode
    +  driver = webdriver.Chrome(options=chrome_options)
    +
    +  for doc in ['Filament', 'Materials']:
    +    # Open the URL with ?export, which markdeep will export the resulting html.
    +    driver.get(f"http://localhost:{PORT}/{doc}.md.html?export")
    +
    +    time.sleep(3)
    +    # We extract the html from the resulting "page" (an html output itself).
    +    text = driver.find_elements(By.TAG_NAME, "pre")[0].text
    +
    +    # 1. Remove the double empty lines.  These make the following text seem like markdown text as oppose to embedded html.
    +    # 2. Remove the max-width styling from the body tag.
    +    # 3. Remove the font-family styling from the body tag.
    +    text = text.replace("\n\n","\n")\
    +               .replace("max-width:680px;", "")\
    +               .replace("font-family:Palatino", "--font-family:Palatino")\
    +               .replace("\"./images", "\"../images")\
    +               .replace("\"images/", "\"../images/")
    +
    +    # Save the page source as .md with embedded html
    +    with open(f'{MAIN_DIR}/{doc.lower()}.md', "w", encoding="utf-8") as f:
    +      f.write(text)
    +
    +  # Close the browser
    +  driver.quit()
    +  # Shutdown the server
    +  httpd.shutdown()
    +
    +if __name__ == "__main__":
    +  pull_duplicates()
    +  pull_markdeep_docs()
    +
    +  res, err = execute('mdbook build', cwd=DOCS_SRC_DIR)
    +  assert res == 0, f"failed to execute `mdbook`. return-code={res} err=\"{err}\""
    diff --git a/docs_src/build/utils.py b/docs_src/build/utils.py
    new file mode 100644
    index 00000000000..80aa1453254
    --- /dev/null
    +++ b/docs_src/build/utils.py
    @@ -0,0 +1,68 @@
    +# Copyright (C) 2025 The Android Open Source Project
    +#
    +# Licensed under the Apache License, Version 2.0 (the "License");
    +# you may not use this file except in compliance with the License.
    +# You may obtain a copy of the License at
    +#
    +#      http://www.apache.org/licenses/LICENSE-2.0
    +#
    +# Unless required by applicable law or agreed to in writing, software
    +# distributed under the License is distributed on an "AS IS" BASIS,
    +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +# See the License for the specific language governing permissions and
    +# limitations under the License.
    +
    +import subprocess
    +import os
    +import argparse
    +import sys
    +
    +def execute(cmd,
    +            cwd=None,
    +            capture_output=True,
    +            stdin=None,
    +            env=None,
    +            raise_errors=False):
    +  in_env = os.environ
    +  in_env.update(env if env else {})
    +  home = os.environ['HOME']
    +  if f'{home}/bin' not in in_env['PATH']:
    +    in_env['PATH'] = in_env['PATH'] + f':{home}/bin'
    +
    +  stdout = subprocess.PIPE if capture_output else sys.stdout
    +  stderr = subprocess.PIPE if capture_output else sys.stdout
    +  output = ''
    +  err_output = ''
    +  return_code = -1
    +  kwargs = {
    +      'cwd': cwd,
    +      'env': in_env,
    +      'stdout': stdout,
    +      'stderr': stderr,
    +      'stdin': stdin,
    +      'universal_newlines': True
    +  }
    +  if capture_output:
    +    process = subprocess.Popen(cmd.split(' '), **kwargs)
    +    output, err_output = process.communicate()
    +    return_code = process.returncode
    +  else:
    +    return_code = subprocess.call(cmd.split(' '), **kwargs)
    +
    +  if return_code:
    +    # Error
    +    if raise_errors:
    +      raise subprocess.CalledProcessError(return_code, cmd)
    +  if output:
    +    if type(output) != str:
    +      try:
    +        output = output.decode('utf-8').strip()
    +      except UnicodeDecodeError as e:
    +        print('cannot decode ', output, file=sys.stderr)
    +  return return_code, (output if return_code == 0 else err_output)
    +
    +class ArgParseImpl(argparse.ArgumentParser):
    +  def error(self, message):
    +    sys.stderr.write('error: %s\n' % message)
    +    self.print_help()
    +    sys.exit(1)
    diff --git a/docs_src/markdeep/Filament.md.html b/docs_src/markdeep/Filament.md.html
    new file mode 100644
    index 00000000000..167f967bd51
    --- /dev/null
    +++ b/docs_src/markdeep/Filament.md.html
    @@ -0,0 +1,4315 @@
    +               
    +
    +
    +
    +**Physically Based Rendering in Filament**
    +
    +![](images/filament_logo.png)
    +
    +# About
    +
    +This document is part of the [Filament project](https://github.com/google/filament). To report errors in this document please use the [project's issue tracker](https://github.com/google/filament/issues).
    +
    +## Authors
    +
    +- [Romain Guy](https://github.com/romainguy), [@romainguy](https://twitter.com/romainguy)
    +- [Mathias Agopian](https://github.com/pixelflinger), [@darthmoosious](https://twitter.com/darthmoosious)
    +
    +# Overview
    +
    +Filament is a physically based rendering (PBR) engine for Android. The goal of Filament is to offer a set of tools and APIs for Android developers that will enable them to create high quality 2D and 3D rendering with ease.
    +
    +The goal of this document is to explain the equations and theory behind the material and lighting models used in Filament. This document is intended as a reference for contributors to Filament or developers interested in the inner workings of the engine. We will provide code snippets as needed to make the relationship between theory and practice as clear as possible.
    +
    +This document is not intended as a design document. It focuses solely on algorithms and its content could be used to implement PBR in any engine. However, this document explains why we chose specific algorithms/models over others.
    +
    +Unless noted otherwise, all the 3D renderings present in this document have been generated in-engine (prototype or production). Many of these 3D renderings were captured during the early stages of development of Filament and do not reflect the final quality.
    +
    +## Principles
    +
    +Real-time rendering is an active area of research and there is a large number of equations, algorithms and implementation to choose from for every single feature that needs to be implemented (the book *Rendering real-time shadows*, for instance, is a 400 pages summary of dozens of shadows rendering techniques). As such, we must first define our goals (or principles, to follow Brent Burley's seminal paper Physically-based shading at Disney [#Burley12]) before we can make informed decisions.
    +
    +Real-time mobile performance
    +:   Our primary goal is to design and implement a rendering system able to perform efficiently on mobile platforms. The primary target will be OpenGL ES 3.x class GPUs.
    +
    +Quality
    +:   Our rendering system will emphasize overall picture quality. We will however accept quality compromises to support low and medium performance GPUs.
    +
    +Ease of use
    +:   Artists need to be able to iterate often and quickly on their assets and our rendering system must allow them to do so intuitively. We must therefore provide parameters that are easy to understand (for instance, no specular power).
    +
    +    We also understand that not all developers have the luxury to work with artists. The physically based approach of our system will allow developers to craft visually plausible materials without the need to understand the theory behind our implementation.
    +
    +    For both artists and developers, our system will rely on as few parameters as possible to reduce trial and error and allow users to quickly master the material model.
    +
    +    In addition, any combination of parameter values should lead to physically plausible results. Physically implausible materials must be hard to create.
    +
    +Familiarity
    +:   Our system should use physical units everywhere possible: distances in meters or centimeters, color temperatures in Kelvin, light units in lumens or candelas, etc.
    +
    +Flexibility
    +:   A physically based approach must not preclude non-realistic rendering. User interfaces for instance will need unlit materials.
    +
    +Deployment size
    +:   While not directly related to the content of this document, it bears emphasizing our desire to keep the rendering library as small as possible so any application can bundle it without increasing the binary to undesirable sizes.
    +
    +## Physically based rendering
    +
    +We chose to adopt PBR for its benefits from an artistic and production efficient standpoints, and because it is compatible with our goals.
    +
    +Physically based rendering is a rendering method that provides a more accurate representation of materials and how they interact with light when compared to traditional real-time models. The separation of materials and lighting at the core of the PBR method makes it easier to create realistic assets that look accurate in all lighting conditions.
    +
    +# Notation
    +
    +$$
    +\newcommand{NoL}{n \cdot l}
    +\newcommand{NoV}{n \cdot v}
    +\newcommand{NoH}{n \cdot h}
    +\newcommand{VoH}{v \cdot h}
    +\newcommand{LoH}{l \cdot h}
    +\newcommand{fNormal}{f_{0}}
    +\newcommand{fDiffuse}{f_d}
    +\newcommand{fSpecular}{f_r}
    +\newcommand{fX}{f_x}
    +\newcommand{aa}{\alpha^2}
    +\newcommand{fGrazing}{f_{90}}
    +\newcommand{schlick}{F_{Schlick}}
    +\newcommand{nior}{n_{ior}}
    +\newcommand{Ed}{E_d}
    +\newcommand{Lt}{L_{\bot}}
    +\newcommand{Lout}{L_{out}}
    +\newcommand{cosTheta}{\left< \cos \theta \right> }
    +$$
    +
    +The equations found throughout this document use the symbols described in table [symbols].
    +
    +
    +          Symbol             |           Definition
    +:---------------------------:|:---------------------------|
    +$v$                          | View unit vector
    +$l$                          | Incident light unit vector
    +$n$                          | Surface normal unit vector
    +$h$                          | Half unit vector between $l$ and $v$
    +$f$                          | BRDF
    +$\fDiffuse$                  | Diffuse component of a BRDF
    +$\fSpecular$                 | Specular component of a BRDF
    +$\alpha$                     | Roughness, remapped from using input `perceptualRoughness`
    +$\sigma$                     | Diffuse reflectance
    +$\Omega$                     | Spherical domain
    +$\fNormal$                   | Reflectance at normal incidence
    +$\fGrazing$                  | Reflectance at grazing angle
    +$\chi^+(a)$                  | Heaviside function (1 if $a > 0$ and 0 otherwise)
    +$n_{ior}$                    | Index of refraction (IOR) of an interface
    +$\left< \NoL \right>$        | Dot product clamped to [0..1]
    +$\left< a \right>$           | Saturated value (clamped to [0..1])
    +[Table [symbols]: Symbols definitions]
    +
    +# Material system
    +
    +The sections below describe multiple material models to simplify the description of various surface features such as anisotropy or the clear coat layer. In practice however some of these models are condensed into a single one. For instance, the standard model, the clear coat model and the anisotropic model can be combined to form a single, more flexible and powerful model. Please refer to the [Materials documentation](./Materials.md.html) to get a description of the material models as implemented in Filament.
    +
    +## Standard model
    +
    +The goal of our model is to represent standard material appearances. A material model is described mathematically by a BSDF (Bidirectional Scattering Distribution Function), which is itself composed of two other functions: the BRDF (Bidirectional Reflectance Distribution Function) and the BTDF (Bidirectional Transmittance Function).
    +
    +Since we aim to model commonly encountered surfaces, our standard material model will focus on the BRDF and ignore the BTDF, or approximate it greatly. Our standard model will therefore only be able to correctly mimic reflective, isotropic, dielectric or conductive surfaces with short mean free paths.
    +
    +The BRDF describes the surface response of a standard material as a function made of two terms:
    +- A diffuse component, or $f_d$
    +- A specular component, or $f_r$
    +
    +The relationship between a surface, the surface normal, incident light and these terms is shown in figure [frFd] (we ignore subsurface scattering for now):
    +
    +![Figure [frFd]: Interaction of the light with a surface using BRDF model with a diffuse term $ f_d $ and a specular term $ f_r $](images/diagram_fr_fd.png)
    +
    +The complete surface response can be expressed as such:
    +
    +$$\begin{equation}\label{brdf}
    +f(v,l)=f_d(v,l)+f_r(v,l)
    +\end{equation}$$
    +
    +This equation characterizes the surface response for incident light from a single direction. The full rendering equation would require to integrate $l$ over the entire hemisphere.
    +
    +Commonly encountered surfaces are usually not made of a flat interface so we need a model that can characterize the interaction of light with an irregular interface.
    +
    +A microfacet BRDF is a good physically plausible BRDF for that purpose. Such BRDF states that surfaces are not smooth at a micro level, but made of a large number of randomly aligned planar surface fragments, called microfacets. Figure [microfacetVsFlat] shows the difference between a flat interface and an irregular interface at a micro level:
    +
    +![Figure [microfacetVsFlat]: Irregular interface as modeled by a microfacet model (left) and flat interface (right)](images/diagram_microfacet.png)
    +
    +Only the microfacets whose normal is oriented halfway between the light direction and the view direction will reflect visible light, as shown in figure [microfacets].
    +
    +![Figure [microfacets]: Microfacets](images/diagram_macrosurface.png)
    +
    +However, not all microfacets with a properly oriented normal will contribute reflected light as the BRDF takes into account masking and shadowing. This is illustrated in figure [microfacetShadowing].
    +
    +![Figure [microfacetShadowing]: Masking and shadowing of microfacets](images/diagram_shadowing_masking.png)
    +
    +A microfacet BRDF is heavily influenced by a _roughness_ parameter which describes how smooth (low roughness) or how rough (high roughness) a surface is at a micro level. The smoother the surface, the more facets are aligned and the more pronounced the reflected light is. The rougher the surface, the fewer facets are oriented towards the camera and incoming light is scattered away from the camera after reflection, giving a blurry aspect to the specular highlights.
    +
    +Figure [roughness] shows surfaces of different roughness and how light interacts with them.
    +
    +![Figure [roughness]: Varying roughness (from left to right, rough to smooth) and the resulting BRDF specular component lobe](images/diagram_roughness.png)
    +
    +!!! Note: About roughness
    +    The roughness parameter as set by the user is called `perceptualRoughness` in the shader snippets throughout this document. The variable called `roughness` is the `perceptualRoughness` with a remapping explained in section [Parameterization].
    +
    +A microfacet model is described by the following equation (where x stands for the specular or diffuse component):
    +
    +$$\begin{equation}
    +\fX(v,l) = \frac{1}{| \NoV | | \NoL |}
    +\int_\Omega D(m,\alpha) G(v,l,m) f_m(v,l,m) (v \cdot m) (l \cdot m) dm
    +\end{equation}$$
    +
    +The term $D$ models the distribution of the microfacets (this term is also referred to as the NDF or Normal Distribution Function). This term plays a primordial role in the appearance of surfaces as shown in figure [roughness].
    +
    +The term $G$ models the visibility (or occlusion or shadow-masking) of the microfacets.
    +
    +Since this equation is valid for both the specular and diffuse components, the difference lies in the microfacet BRDF $f_m$.
    +
    +It is important to note that this equation is used to integrate over the hemisphere at a _micro level_:
    +
    +![Figure [microLevel]: Modeling the surface response at a single point requires an integration at the micro level](images/diagram_micro_vs_macro.png)
    +
    +The diagram above shows that at a macro level, the surfaces is considered flat. This helps simplify our equations by assuming that a shaded fragment lit from a single direction corresponds to a single point at the surface.
    +
    +At a micro level however, the surface is not flat and we cannot assume a single ray of light anymore (we can however assume that the incident rays are parallel). Since the micro facets will scatter the light in different directions given a bundle of parallel incident rays, we must integrate the surface response over a hemisphere, noted m in the above diagram.
    +
    +It is obviously not practical to compute the full integration over the microfacets hemisphere for each shaded fragment. We will therefore rely on approximations of the integration for both the specular and diffuse components.
    +
    +## Dielectrics and conductors
    +
    +To better understand some of the equations and behaviors shown below, we must first clearly understand the difference between metallic (conductor) and non-metallic (dielectric) surfaces.
    +
    +We saw earlier that when incident light hits a surface governed by a BRDF, the light is reflected as two separate components: the diffuse reflectance and the specular reflectance. The modelization of this behavior is straightforward as shown in figure [bsdfBrdf].
    +
    +![Figure [bsdfBrdf]: Modelization of the BRDF part of a BSDF](images/diagram_fr_fd.png)
    +
    +This modelization is a simplification of how the light actually interacts with the surface. In reality, part of the incident light will penetrate the surface, scatter inside, and exit the surface again as diffuse reflectance. This phenomenon is illustrated in figure [diffuseScattering].
    +
    +![Figure [diffuseScattering]: Scattering of diffuse light](images/diagram_scattering.png)
    +
    +Here lies the difference between conductors and dielectrics. There is no subsurface scattering occurring with purely metallic materials, which means there is no diffuse component (and we will see later that this has an influence on the perceived color of the specular component). Scattering happens in dielectrics, which means they have both specular and diffuse components.
    +
    +To properly modelize the BRDF we must therefore distinguish between dielectrics and conductors (scattering not shown for clarity), as shown in figure [dielectricConductor].
    +
    +![Figure [dielectricConductor]: BRDF modelization for dielectric and conductor surfaces](images/diagram_brdf_dielectric_conductor.png)
    +
    +## Energy conservation
    +
    +Energy conservation is one of the key components of a good BRDF for physically based rendering. An energy conservative BRDF states that the total amount of specular and diffuse reflectance energy is less than the total amount of incident energy. Without an energy conservative BRDF, artists must manually ensure that the light reflected off a surface is never more intense than the incident light.
    +
    +## Specular BRDF
    +
    +For the specular term, $f_r$ is a mirror BRDF that can be modeled with the Fresnel law, noted $F$ in the Cook-Torrance approximation of the microfacet model integration:
    +
    +$$\begin{equation}
    +f_r(v,l) = \frac{D(h, \alpha) G(v, l, \alpha) F(v, h, f0)}{4(\NoV)(\NoL)}
    +\end{equation}$$
    +
    +Given our real-time constraints, we must use an approximation for the three terms $D$, $G$ and $F$. [#Karis13a] has compiled a great list of formulations for these three terms that can be used with the Cook-Torrance specular BRDF. The sections that follow describe the equations we picked for these terms.
    +
    +### Normal distribution function (specular D)
    +
    +[#Burley12] observed that long-tailed normal distribution functions (NDF) are a good fit for real-world surfaces. The GGX distribution described in [#Walter07] is a distribution with long-tailed falloff and short peak in the highlights, with a simple formulation suitable for real-time implementations. It is also a popular model, equivalent to the Trowbridge-Reitz distribution, in modern physically based renderers.
    +
    +$$\begin{equation}
    +D_{GGX}(h,\alpha) = \frac{\aa}{\pi ( (\NoH)^2 (\aa - 1) + 1)^2}
    +\end{equation}$$
    +
    +The GLSL implementation of the NDF, shown in listing [specularD], is simple and efficient.
    +
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +float D_GGX(float NoH, float roughness) {
    +    float a = NoH * roughness;
    +    float k = roughness / (1.0 - NoH * NoH + a * a);
    +    return k * k * (1.0 / PI);
    +}
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +[Listing [specularD]: Implementation of the specular D term in GLSL]
    +
    +We can improve this implementation by using half precision floats. This optimization requires changes to the original equation as there are two problems when computing $1 - (\NoH)^2$ in half-floats. First, this computation suffers from floating point cancellation when $(\NoH)^2$ is close to 1 (highlights). Secondly $\NoH$ does not have enough precision around 1.
    +
    +The solution involves Lagrange's identity:
    +
    +$$\begin{equation}
    +| a \times b |^2 = |a|^2 |b|^2 - (a \cdot b)^2
    +\end{equation}$$
    +
    +Since both $n$ and $h$ are unit vectors, $|n \times h|^2 = 1 - (\NoH)^2$. This allows us to compute $1 - (\NoH)^2$ directly with half precision floats by using a simple cross product. Listing [specularDfp16] shows the final optimized implementation.
    +
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +#define MEDIUMP_FLT_MAX    65504.0
    +#define saturateMediump(x) min(x, MEDIUMP_FLT_MAX)
    +
    +float D_GGX(float roughness, float NoH, const vec3 n, const vec3 h) {
    +    vec3 NxH = cross(n, h);
    +    float a = NoH * roughness;
    +    float k = roughness / (dot(NxH, NxH) + a * a);
    +    float d = k * k * (1.0 / PI);
    +    return saturateMediump(d);
    +}
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +[Listing [specularDfp16]: Implementation of the specular D term in GLSL optimized for fp16]
    +
    +### Geometric shadowing (specular G)
    +
    +Eric Heitz showed in [#Heitz14] that the Smith geometric shadowing function is the correct and exact $G$ term to use. The Smith formulation is the following:
    +
    +$$\begin{equation}
    +G(v,l,\alpha) = G_1(l,\alpha) G_1(v,\alpha)
    +\end{equation}$$
    +
    +$G_1$ can in turn follow several models, and is commonly set to the GGX formulation:
    +
    +$$\begin{equation}
    +G_1(v,\alpha) = G_{GGX}(v,\alpha) = \frac{2 (\NoV)}{\NoV + \sqrt{\aa + (1 - \aa) (\NoV)^2}}
    +\end{equation}$$
    +
    +The full Smith-GGX formulation thus becomes:
    +
    +$$\begin{equation}
    +G(v,l,\alpha) = \frac{2 (\NoL)}{\NoL + \sqrt{\aa + (1 - \aa) (\NoL)^2}} \frac{2 (\NoV)}{\NoV + \sqrt{\aa + (1 - \aa) (\NoV)^2}}
    +\end{equation}$$
    +
    +We can observe that the dividends $2 (\NoL)$ and $2 (n \cdot v)$ allow us to simplify the original function $f_r$ by introducing a visibility function $V$:
    +
    +$$\begin{equation}
    +f_r(v,l) = D(h, \alpha) V(v, l, \alpha) F(v, h, f_0)
    +\end{equation}$$
    +
    +Where:
    +
    +$$\begin{equation}
    +V(v,l,\alpha) = \frac{G(v, l, \alpha)}{4 (\NoV) (\NoL)} = V_1(l,\alpha) V_1(v,\alpha)
    +\end{equation}$$
    +
    +And:
    +
    +$$\begin{equation}
    +V_1(v,\alpha) = \frac{1}{\NoV + \sqrt{\aa + (1 - \aa) (\NoV)^2}}
    +\end{equation}$$
    +
    +Heitz notes however that taking the height of the microfacets into account to correlate masking and shadowing leads to more accurate results. He defines the height-correlated Smith function thusly:
    +
    +$$\begin{equation}
    +G(v,l,h,\alpha) = \frac{\chi^+(\VoH) \chi^+(\LoH)}{1 + \Lambda(v) + \Lambda(l)}
    +\end{equation}$$
    +
    +$$\begin{equation}
    +\Lambda(m) = \frac{-1 + \sqrt{1 + \aa tan^2(\theta_m)}}{2} = \frac{-1 + \sqrt{1 + \aa \frac{(1 - cos^2(\theta_m))}{cos^2(\theta_m)}}}{2}
    +\end{equation}$$
    +
    +Replacing $cos(\theta_m)$ by $\NoV$, we obtain:
    +
    +$$\begin{equation}
    +\Lambda(v) = \frac{1}{2} \left( \frac{\sqrt{\aa + (1 - \aa)(\NoV)^2}}{\NoV} - 1 \right)
    +\end{equation}$$
    +
    +From which we can derive the visibility function:
    +
    +$$\begin{equation}
    +V(v,l,\alpha) = \frac{0.5}{\NoL \sqrt{(\NoV)^2 (1 - \aa) + \aa} + \NoV \sqrt{(\NoL)^2 (1 - \aa) + \aa}}
    +\end{equation}$$
    +
    +The GLSL implementation of the visibility term, shown in listing [specularV], is a bit more expensive than we would like since it requires two `sqrt` operations.
    +
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +float V_SmithGGXCorrelated(float NoV, float NoL, float roughness) {
    +    float a2 = roughness * roughness;
    +    float GGXV = NoL * sqrt(NoV * NoV * (1.0 - a2) + a2);
    +    float GGXL = NoV * sqrt(NoL * NoL * (1.0 - a2) + a2);
    +    return 0.5 / (GGXV + GGXL);
    +}
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +[Listing [specularV]: Implementation of the specular V term in GLSL]
    +
    +We can optimize this visibility function by using an approximation after noticing that all the terms under the square roots are squares and that all the terms are in the $[0..1]$ range:
    +
    +$$\begin{equation}
    +V(v,l,\alpha) = \frac{0.5}{\NoL (\NoV (1 - \alpha) + \alpha) + \NoV (\NoL (1 - \alpha) + \alpha)}
    +\end{equation}$$
    +
    +This approximation is mathematically wrong but saves two square root operations and is good enough for real-time mobile applications, as shown in listing [approximatedSpecularV].
    +
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +float V_SmithGGXCorrelatedFast(float NoV, float NoL, float roughness) {
    +    float a = roughness;
    +    float GGXV = NoL * (NoV * (1.0 - a) + a);
    +    float GGXL = NoV * (NoL * (1.0 - a) + a);
    +    return 0.5 / (GGXV + GGXL);
    +}
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +[Listing [approximatedSpecularV]: Implementation of the approximated specular V term in GLSL]
    +
    +[#Hammon17] proposes the same approximation based on the same observation that the square root can be removed. It does so by rewriting the expressions as _lerps_:
    +
    +$$\begin{equation}
    +V(v,l,\alpha) = \frac{0.5}{lerp(2 (\NoL) (\NoV), \NoL + \NoV, \alpha)}
    +\end{equation}$$
    +
    +### Fresnel (specular F)
    +
    +The Fresnel effect plays an important role in the appearance of physically based materials. This effect models the fact that the amount of light the viewer sees reflected from a surface depends on the viewing angle. Large bodies of water are a perfect way to experience this phenomenon, as shown in figure [fresnelLake]. When looking at the water straight down (at normal incidence) you can see through the water. However, when looking further out in the distance (at grazing angle, where perceived light rays are getting parallel to the surface), you will see the specular reflections on the water become more intense.
    +
    +The amount of light reflected depends not only on the viewing angle, but also on the index of refraction (IOR) of the material. At normal incidence (perpendicular to the surface, or 0 degree angle), the amount of light reflected back is noted $\fNormal$ and can be derived from the IOR as we will see in section [Reflectance remapping]. The amount of light reflected back at grazing angle is noted $\fGrazing$ and approaches 100% for smooth materials.
    +
    +![Figure [fresnelLake]: The Fresnel effect is particularly evident on large bodies of water](images/photo_fresnel_lake.jpg)
    +
    +More formally, the Fresnel term defines how light reflects and refracts at the interface between two different media, or the ratio of reflected and transmitted energy. [#Schlick94] describes an inexpensive approximation of the Fresnel term for the Cook-Torrance specular BRDF:
    +
    +$$\begin{equation}
    +F_{Schlick}(v,h,\fNormal,\fGrazing) = \fNormal + (\fGrazing - \fNormal)(1 - \VoH)^5
    +\end{equation}$$
    +
    +The constant $\fNormal$ represents the specular reflectance at normal incidence and is achromatic for dielectrics, and chromatic for metals. The actual value depends on the index of refraction of the interface. The GLSL implementation of this term requires the use of a `pow`, as shown in listing [specularF], which can be replaced by a few multiplications.
    +
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +vec3 F_Schlick(float u, vec3 f0, float f90) {
    +    return f0 + (vec3(f90) - f0) * pow(1.0 - u, 5.0);
    +}
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +[Listing [specularF]: Implementation of the specular F term in GLSL]
    +
    +This Fresnel function can be seen as interpolating between the incident specular reflectance and the reflectance at grazing angles, represented here by $\fGrazing$. Observation of real world materials show that both dielectrics and conductors exhibit achromatic specular reflectance at grazing angles and that the Fresnel reflectance is 1.0 at 90 degrees. A more correct $\fGrazing$ is discussed in section [Specular occlusion].
    +
    +Using $\fGrazing$ set to 1, the Schlick approximation for the Fresnel term can be optimized for scalar operations by refactoring the code slightly. The result is shown in listing [scalarSpecularF].
    +
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +vec3 F_Schlick(float u, vec3 f0) {
    +    float f = pow(1.0 - u, 5.0);
    +    return f + f0 * (1.0 - f);
    +}
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +[Listing [scalarSpecularF]: Scalar optimization of the specular F term in GLSL]
    +
    +## Diffuse BRDF
    +
    +In the diffuse term, $f_m$ is a Lambertian function and the diffuse term of the BRDF becomes:
    +
    +$$\begin{equation}
    +\fDiffuse(v,l) = \frac{\sigma}{\pi} \frac{1}{| \NoV | | \NoL |}
    +\int_\Omega D(m,\alpha) G(v,l,m) (v \cdot m) (l \cdot m) dm
    +\end{equation}$$
    +
    +Our implementation will instead use a simple Lambertian BRDF that assumes a uniform diffuse response over the microfacets hemisphere:
    +
    +$$\begin{equation}
    +\fDiffuse(v,l) = \frac{\sigma}{\pi}
    +\end{equation}$$
    +
    +In practice, the diffuse reflectance $\sigma$ is multiplied later, as shown in listing [diffuseBRDF].
    +
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +float Fd_Lambert() {
    +    return 1.0 / PI;
    +}
    +
    +vec3 Fd = diffuseColor * Fd_Lambert();
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +[Listing [diffuseBRDF]: Implementation of the diffuse Lambertian BRDF in GLSL]
    +
    +The Lambertian BRDF is obviously extremely efficient and delivers results close enough to more complex models.
    +
    +However, the diffuse part would ideally be coherent with the specular term and take into account the surface roughness. Both the Disney diffuse BRDF [#Burley12] and Oren-Nayar model [#Oren94] take the roughness into account and create some retro-reflection at grazing angles. Given our constraints we decided that the extra runtime cost does not justify the slight increase in quality. This sophisticated diffuse model also renders image-based and spherical harmonics more difficult to express and implement.
    +
    +For completeness, the Disney diffuse BRDF expressed in [#Burley12] is the following:
    +
    +$$\begin{equation}
    +\fDiffuse(v,l) = \frac{\sigma}{\pi} \schlick(n,l,1,\fGrazing) \schlick(n,v,1,\fGrazing)
    +\end{equation}$$
    +
    +Where:
    +
    +$$\begin{equation}
    +\fGrazing=0.5 + 2 \cdot \alpha cos^2(\theta_d)
    +\end{equation}$$
    +
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +float F_Schlick(float u, float f0, float f90) {
    +    return f0 + (f90 - f0) * pow(1.0 - u, 5.0);
    +}
    +
    +float Fd_Burley(float NoV, float NoL, float LoH, float roughness) {
    +    float f90 = 0.5 + 2.0 * roughness * LoH * LoH;
    +    float lightScatter = F_Schlick(NoL, 1.0, f90);
    +    float viewScatter = F_Schlick(NoV, 1.0, f90);
    +    return lightScatter * viewScatter * (1.0 / PI);
    +}
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +[Listing [diffuseBRDF]: Implementation of the diffuse Disney BRDF in GLSL]
    +
    +Figure [lambert_vs_disney] shows a comparison between a simple Lambertian diffuse BRDF and the higher quality Disney diffuse BRDF, using a fully rough dielectric material. For comparison purposes, the right sphere was mirrored. The surface response is very similar with both BRDFs but the Disney one exhibits some nice retro-reflections at grazing angles (look closely at the left edge of the spheres).
    +
    +![Figure [lambert_vs_disney]: Comparison between the Lambertian diffuse BRDF (left) and the Disney diffuse BRDF (right)](images/diagram_lambert_vs_disney.png)
    +
    +We could allow artists/developers to choose the Disney diffuse BRDF depending on the quality they desire and the performance of the target device. It is important to note however that the Disney diffuse BRDF is not energy conserving as expressed here.
    +
    +## Standard model summary
    +
    +**Specular term**: a Cook-Torrance specular microfacet model, with a GGX normal distribution function, a Smith-GGX height-correlated visibility function, and a Schlick Fresnel function.
    +
    +**Diffuse term**: a Lambertian diffuse model.
    +
    +The full GLSL implementation of the standard model is shown in listing [glslBRDF].
    +
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +float D_GGX(float NoH, float a) {
    +    float a2 = a * a;
    +    float f = (NoH * a2 - NoH) * NoH + 1.0;
    +    return a2 / (PI * f * f);
    +}
    +
    +vec3 F_Schlick(float u, vec3 f0) {
    +    return f0 + (vec3(1.0) - f0) * pow(1.0 - u, 5.0);
    +}
    +
    +float V_SmithGGXCorrelated(float NoV, float NoL, float a) {
    +    float a2 = a * a;
    +    float GGXL = NoV * sqrt((-NoL * a2 + NoL) * NoL + a2);
    +    float GGXV = NoL * sqrt((-NoV * a2 + NoV) * NoV + a2);
    +    return 0.5 / (GGXV + GGXL);
    +}
    +
    +float Fd_Lambert() {
    +    return 1.0 / PI;
    +}
    +
    +void BRDF(...) {
    +    vec3 h = normalize(v + l);
    +
    +    float NoV = abs(dot(n, v)) + 1e-5;
    +    float NoL = clamp(dot(n, l), 0.0, 1.0);
    +    float NoH = clamp(dot(n, h), 0.0, 1.0);
    +    float LoH = clamp(dot(l, h), 0.0, 1.0);
    +
    +    // perceptually linear roughness to roughness (see parameterization)
    +    float roughness = perceptualRoughness * perceptualRoughness;
    +
    +    float D = D_GGX(NoH, roughness);
    +    vec3  F = F_Schlick(LoH, f0);
    +    float V = V_SmithGGXCorrelated(NoV, NoL, roughness);
    +
    +    // specular BRDF
    +    vec3 Fr = (D * V) * F;
    +
    +    // diffuse BRDF
    +    vec3 Fd = diffuseColor * Fd_Lambert();
    +
    +    // apply lighting...
    +}
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +[Listing [glslBRDF]: Evaluation of the BRDF in GLSL]
    +
    +## Improving the BRDFs
    +
    +We mentioned in section [Energy conservation] that energy conservation is one of the key components of a good BRDF. Unfortunately the BRDFs explored previously suffer from two problems that we will examine below.
    +
    +### Energy gain in diffuse reflectance
    +
    +The Lambert diffuse BRDF does not account for the light that reflects at the surface and that is therefore not able to participate in the diffuse scattering event.
    +
    +[TODO: talk about the issue with fr+fd]
    +
    +### Energy loss in specular reflectance
    +
    +The Cook-Torrance BRDF we presented earlier attempts to model several events at the microfacet level but does so by accounting for a single bounce of light. This approximation can cause a loss of energy at high roughness, the surface is not energy preserving. Figure [singleVsMultiBounce] shows why this loss of energy occurs. In the single bounce (or single scattering) model, a ray of light hitting the surface can be reflected back onto another microfacet and thus be discarded because of the masking and shadowing term. If we however account for multiple bounces (multiscattering), the same ray of light might escape the microfacet field and be reflected back towards the viewer.
    +
    +![Figure [singleVsMultiBounce]: Single scattering (left) vs multiscattering](images/diagram_single_vs_multi_scatter.png)
    +
    +Based on this simple explanation, we can intuitively deduce that the rougher a surface is, the higher the chances are that energy gets lost because of the failure to account for multiple scattering events. This loss of energy appears to darken rough materials. Metallic surfaces are particularly affected because all of their reflectance is specular. This darkening effect is illustrated in figure [metallicRoughEnergyLoss]. With multiscattering, energy preservation can be achieved, as shown in figure [metallicRoughEnergyPreservation].
    +
    +![Figure [metallicRoughEnergyLoss]: Darkening increases with roughness due to single scattering](images/material_metallic_energy_loss.png)
    +
    +![Figure [metallicRoughEnergyPreservation]: Energy preservation with multiscattering](images/material_metallic_energy_preservation.png)
    +
    +We can use a white furnace, a uniform lighting environment set to pure white, to validate the energy preservation property of a BRDF. When energy preservation is achieved, a purely reflective metallic surface ($\fNormal = 1$) should be indistinguishable from the background, no matter the roughness of said surface. Figure [whiteFurnaceLoss] shows what such a surface looks like with the specular BRDF presented in the previous sections. The loss of energy as the roughness increases is obvious. In contrast, figure [whiteFurnacePreservation] shows that accounting for multiscattering events addresses the energy loss.
    +
    +![Figure [whiteFurnaceLoss]: Darkening increases with roughness due to single scattering](images/material_furnace_energy_loss.png)
    +
    +![Figure [whiteFurnacePreservation]: Energy preservation with multiscattering](images/material_furnace_energy_preservation.png)
    +
    +Multiple-scattering microfacet BRDFs are discussed in depth in [#Heitz16]. Unfortunately this paper only presents a stochastic evaluation of the multiscattering BRDF. This solution is therefore not suitable for real-time rendering. Kulla and Conty present a different approach in [#Kulla17]. Their idea is to add an energy compensation term as an additional BRDF lobe shown in equation $\ref{energyCompensationLobe}$:
    +
    +$$\begin{equation}\label{energyCompensationLobe}
    +f_{ms}(l,v) = \frac{(1 - E(l)) (1 - E(v)) F_{avg}^2 E_{avg}}{\pi (1 - E_{avg}) (1 - F_{avg}(1 - E_{avg}))}
    +\end{equation}$$
    +
    +Where $E$ is the directional albedo of the specular BRDF $f_r$, with $\fNormal$ set to 1:
    +
    +$$\begin{equation}
    +E(l) = \int_{\Omega} f(l,v) (\NoV) dv
    +\end{equation}$$
    +
    +The term $E_{avg}$ is the cosine-weighted average of $E$:
    +
    +$$\begin{equation}
    +E_{avg} = 2 \int_0^1 E(\mu) \mu d\mu
    +\end{equation}$$
    +
    +Similarly, $F_{avg}$ is the cosine-weighted average of the Fresnel term:
    +
    +$$\begin{equation}
    +F_{avg} = 2 \int_0^1 F(\mu) \mu d\mu
    +\end{equation}$$
    +
    +Both terms $E$ and $E_{avg}$ can be precomputed and stored in lookup tables. while $F_{avg}$ can be greatly simplified when the Schlick approximation is used:
    +
    +$$\begin{equation}\label{averageFresnel}
    +F_{avg} = \frac{1 + 20 \fNormal}{21}
    +\end{equation}$$
    +
    +This new lobe is combined with the original single scattering lobe, previously noted $f_r$:
    +
    +$$\begin{equation}
    +f_{r}(l,v) = f_{ss}(l,v) + f_{ms}(l,v)
    +\end{equation}$$
    +
    +In [#Lagarde18], with credit to Emmanuel Turquin, Lagarde and Golubev make the observation that equation $\ref{averageFresnel}$ can be simplified to $\fNormal$. They also propose to apply energy compensation by adding a scaled GGX specular lobe:
    +
    +$$\begin{equation}\label{energyCompensation}
    +f_{ms}(l,v) = \fNormal \frac{1 - E(l)}{E(l)} f_{ss}(l,v)
    +\end{equation}$$
    +
    +The key insight is that $E(l)$ can not only be precomputed but also shared with image-based lighting pre-integration. The multiscattering energy compensation formula thus becomes:
    +
    +$$\begin{equation}\label{scaledEnergyCompensationLobe}
    +f_r(l,v) = f_{ss}(l,v) + \fNormal \left( \frac{1}{r} - 1 \right) f_{ss}(l,v)
    +\end{equation}$$
    +
    +Where $r$ is defined as:
    +
    +$$\begin{equation}
    +r = \int_{\Omega} D(l,v) V(l,v) \left< \NoL \right> dl
    +\end{equation}$$
    +
    +We can implement specular energy compensation at a negligible cost if we store $r$ in the DFG lookup table presented in section [Image based lights]. Listing [energyCompensationImpl] shows that the implementation is a direct conversion of equation $\ref{scaledEnergyCompensationLobe}$.
    +
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +vec3 energyCompensation = 1.0 + f0 * (1.0 / dfg.y - 1.0);
    +// Scale the specular lobe to account for multiscattering
    +Fr *= pixel.energyCompensation;
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +[Listing [energyCompensationImpl]: Implementation of the energy compensation specular lobe]
    +
    +Please refer to section [Image based lights] and section [Pre-integration for multiscattering] to learn how the DFG lookup table is derived and computed.
    +
    +## Parameterization
    +
    +Disney's material model described in [#Burley12] is a good starting point but its numerous parameters makes it impractical for real-time implementations. In addition, we would like our standard material model to be easy to understand and easy to use for both artists and developers.
    +
    +### Standard parameters
    +
    +Table [standardParameters] describes the list of parameters that satisfy our constraints.
    +
    +
    +       Parameter      |      Definition
    +---------------------:|:---------------------
    +**BaseColor**         | Diffuse albedo for non-metallic surfaces, and specular color for metallic surfaces
    +**Metallic**          | Whether a surface appears to be dielectric (0.0) or conductor (1.0). Often used as a binary value (0 or 1)
    +**Roughness**         | Perceived smoothness (0.0) or roughness (1.0) of a surface. Smooth surfaces exhibit sharp reflections
    +**Reflectance**       | Fresnel reflectance at normal incidence for dielectric surfaces. This replaces an explicit index of refraction
    +**Emissive**          | Additional diffuse albedo to simulate emissive surfaces (such as neons, etc.) This parameter is mostly useful in an HDR pipeline with a bloom pass
    +**Ambient occlusion** | Defines how much of the ambient light is accessible to a surface point. It is a per-pixel shadowing factor between 0.0 and 1.0. This parameter will be discussed in more details in the lighting section
    +[Table [standardParameters]: Parameters of the standard model]
    +
    +Figure [material_parameters] shows how the metallic, roughness and reflectance parameters affect the appearance of a surface.
    +
    +![Figure [material_parameters]: From top to bottom: varying metallic, varying dielectric roughness, varying metallic roughness, varying reflectance](images/material_parameters.png)
    +
    +### Types and ranges
    +
    +It is important to understand the type and range of the different parameters of our material model, described in table [standardParametersTypes].
    +
    +
    +       Parameter      |    Type and range
    +---------------------:|:---------------------
    +**BaseColor**         | Linear RGB [0..1]
    +**Metallic**          | Scalar [0..1]
    +**Roughness**         | Scalar [0..1]
    +**Reflectance**       | Scalar [0..1]
    +**Emissive**          | Linear RGB [0..1] + exposure compensation
    +**Ambient occlusion** | Scalar [0..1]
    +[Table [standardParametersTypes]: Range and type of the standard model's parameters]
    +
    +Note that the types and ranges described here are what the shader will expect. The API and/or tools UI could and should allow to specify the parameters using other types and ranges when they are more intuitive for artists.
    +
    +For instance, the base color could be expressed in sRGB space and converted to linear space before being sent off to the shader. It can also be useful for artists to express the metallic, roughness and reflectance parameters as gray values between 0 and 255 (black to white).
    +
    +Another example: the emissive parameter could be expressed as a color temperature and an intensity, to simulate the light emitted by a black body.
    +
    +### Remapping
    +
    +To make the standard material model easier and more intuitive to use for artists, we must remap the parameters _baseColor_, _roughness_ and _reflectance_.
    +
    +#### Base color remapping
    +
    +The base color of a material is affected by the "metallicness" of said material. Dielectrics have achromatic specular reflectance but retain their base color as the diffuse color. Conductors on the other hand use their base color as the specular color and do not have a diffuse component.
    +
    +The lighting equations must therefore use the diffuse color and $\fNormal$ instead of the base color. The diffuse color can easily be computed from the base color, as show in listing [baseColorToDiffuse].
    +
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +vec3 diffuseColor = (1.0 - metallic) * baseColor.rgb;
    +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    +[Listing [baseColorToDiffuse]: Conversion of base color to diffuse in GLSL]
    +
    +#### Reflectance remapping
    +
    +**Dielectrics**
    +
    +The Fresnel term relies on $\fNormal$, the specular reflectance at normal incidence angle, and is achromatic for dielectrics. We will use the remapping for dielectric surfaces described in [#Lagarde14] :
    +
    +$$\begin{equation}
    +\fNormal = 0.16 \cdot reflectance^2
    +\end{equation}$$
    +
    +The goal is to map $\fNormal$ onto a range that can represent the Fresnel values of both common dielectric surfaces (4% reflectance) and gemstones (8% to 16%). The mapping function is chosen to yield a 4% Fresnel reflectance value for an input reflectance of 0.5 (or 128 on a linear RGB gray scale). Figure [reflectance] show those common values and how they relate to the mapping function.
    +
    +![Figure [reflectance]: Common reflectance values](images/diagram_reflectance.png)
    +
    +If the index of refraction is known (for instance, an air-water interface has an IOR of 1.33), the Fresnel reflectance can be calculated as follows:
    +
    +$$\begin{equation}\label{fresnelEquation}
    +\fNormal(n_{ior}) = \frac{(\nior - 1)^2}{(\nior + 1)^2}
    +\end{equation}$$
    +
    +And if the reflectance value is known, we can compute the corresponding IOR:
    +
    +$$\begin{equation}
    +n_{ior} = \frac{2}{1 - \sqrt{\fNormal}} - 1 
    +\end{equation}$$
    +
    +Table [commonMatReflectance] describes acceptable Fresnel reflectance values for various types of materials (no real world material has a value under 2%).
    +
    +
    +          Material         |    Reflectance   |        IOR       |   Linear value
    +--------------------------:|:-----------------|:-----------------|:----------------
    +Water                      | 2%               | 1.33             | 0.35
    +Fabric                     | 4% to 5.6%       | 1.5 to 1.62      | 0.5 to 0.59
    +Common liquids             | 2% to 4%         | 1.33 to 1.5      | 0.35 to 0.5
    +Common gemstones           | 5% to 16%        | 1.58 to 2.33     | 0.56 to 1.0
    +Plastics, glass            | 4% to 5%         | 1.5 to 1.58      | 0.5 to 0.56
    +Other dielectric materials | 2% to 5%         | 1.33 to 1.58     | 0.35 to 0.56
    +Eyes                       | 2.5%             | 1.38             | 0.39
    +Skin                       | 2.8%             | 1.4              | 0.42
    +Hair                       | 4.6%             | 1.55             | 0.54
    +Teeth                      | 5.8%             | 1.63             | 0.6
    +Default value              | 4%               | 1.5              | 0.5
    +[Table [commonMatReflectance]: Reflectance of common materials (source: Real-Time Rendering 4th Edition)]
    +
    +Table [fNormalMetals] lists the $\fNormal$ values for a few metals. The values are given in sRGB and must be used as the base color in our material model. Please refer to the annex, section [Specular color], for an explanation of how these sRGB colors are computed from measured data.
    +
    +
    +    Metal  | $\fNormal$ in sRGB  |  Hexadecimal |               Color
    +----------:|:-------------------:|:------------:|-------------------------------------------------------
    +Silver     | 0.97, 0.96, 0.91    | #f7f4e8     | 
     
    +Aluminum | 0.91, 0.92, 0.92 | #e8eaea |
     
    +Titanium | 0.76, 0.73, 0.69 | #c1baaf |
     
    +Iron | 0.77, 0.78, 0.78 | #c4c6c6 |
     
    +Platinum | 0.83, 0.81, 0.78 | #d3cec6 |
     
    +Gold | 1.00, 0.85, 0.57 | #ffd891 |
     
    +Brass | 0.98, 0.90, 0.59 | #f9e596 |
     
    +Copper | 0.97, 0.74, 0.62 | #f7bc9e |
     
    +[Table [fNormalMetals]: $\fNormal$ for common metals] + +All materials have a Fresnel reflectance of 100% at grazing angles so we will set $\fGrazing$ in the following way when evaluating the specular BRDF $\fSpecular$: + +$$\begin{equation} +\fGrazing = 1.0 +\end{equation}$$ + +Figure [grazing_reflectance] shows a red plastic ball. If you look closely at the edges of the sphere, you will be able to notice the achromatic specular reflectance at grazing angles. + +![Figure [grazing_reflectance]: The specular reflectance becomes achromatic at grazing angles](images/material_grazing_reflectance.png) + +**Conductors** + +The specular reflectance of metallic surfaces is chromatic: + +$$\begin{equation} +\fNormal = baseColor \cdot metallic +\end{equation}$$ + +Listing [fNormal] shows how $\fNormal$ is computed for both dielectric and metallic materials. It shows that the color of the specular reflectance is derived from the base color in the metallic case. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +vec3 f0 = 0.16 * reflectance * reflectance * (1.0 - metallic) + baseColor * metallic; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [fNormal]: Computing $\fNormal$ for dielectric and metallic materials in GLSL] + +#### Roughness remapping and clamping + +The roughness set by the user, called `perceptualRoughness` here, is remapped to a perceptually linear range using the following formulation: + +$$\begin{equation} +\alpha = perceptualRoughness^2 +\end{equation}$$ + +Figure [roughness_remap] shows a silver metallic surface with increasing roughness (from 0.0 to 1.0), using the unmodified roughness value (bottom) and the remapped value (top). + +![Figure [roughness_remap]: Roughness remapping comparison: perceptually linear roughness (top) and roughness (bottom)](images/material_roughness_remap.png) + +Using this visual comparison, it is obvious that the remapped roughness is easier to understand by artists and developers. Without this remapping, shiny metallic surfaces would have to be confined to a very small range between 0.0 and 0.05. + +Brent Burley made similar observations in his presentation [#Burley12]. After experimenting with other remappings (cubic and quadratic mappings for instance), we have reached the conclusion that this simple square remapping delivers visually pleasing and intuitive results while being cheap for real-time applications. + +Last but not least, it is important to note that the roughness parameters is used in various computations at runtime where limited floating point precision can become an issue. For instance, _mediump_ precision floats are often implemented as half-floats (fp16) on mobile GPUs. + +This cause problems when computing small values like $\frac{1}{perceptualRoughness^4}$ in our lighting equations (roughness squared in the GGX computation). The smallest value that can be represented as a half-float is $2^{-14}$ or $6.1 \times 10^{-5}$. To avoid divisions by 0 on devices that do not support denormals, the result of $\frac{1}{roughness^4}$ must therefore not be lower than $6.1 \times 10^{-5}$. To do so, we must clamp the roughness to 0.089, which gives us $6.274 \times 10^{-5}$. + +Denormals should also be avoided to prevent performance drops. The roughness can also not be set to 0 to avoid obvious divisions by 0. + +Since we also want specular highlights to have a minimum size (a roughness close to 0 creates almost invisible highlights), we should clamp the roughness to a safe range in the shader. This clamping has the added benefit of correcting specular aliasing[^frostbiteRoughnessClamp] that can appear for low roughness values. + +[^frostbiteRoughnessClamp]: The Frostbite engine clamps the roughness of analytical lights to 0.045 to reduce specular aliasing. This is possible when using single precision floats (fp32). + +### Blending and layering + +As noted in [#Burley12] and [#Neubelt13], this model allows for robust blending between different materials by simply interpolating the different parameters. In particular, this allows to layer different materials using simple masks. + +For instance, figure [materialBlending] shows how the studio Ready at Dawn used material blending and layering in _The Order: 1886_ to create complex appearances from a library of simple materials (gold, copper, wood, rust, etc.). + +![Figure [materialBlending]: Material blending and layering. Source: Ready at Dawn Studios](images/material_blending.png) + +The blending and layering of materials is effectively an interpolation of the various parameters of the material model. Figure [material_interpolation] show an interpolation between shiny metallic chrome and rough red plastic. While the intermediate blended materials make little physical sense, they look plausible. + +![Figure [material_interpolation]: Interpolation from shiny chrome (left) to rough red plastic (right)](images/material_interpolation.png) + +### Crafting physically based materials + +Designing physically based materials is fairly easy once you understand the nature of the four main parameters: base color, metallic, roughness and reflectance. + +We provide a [useful chart/reference guide](./Material%20Properties.pdf) to help artists and developers craft their own physically based materials. + +![Crafting physically based materials](images/material_chart.jpg) + +In addition, here is a quick summary of how to use our material model: + +All materials +: **Base color** should be devoid of lighting information, except for micro-occlusion. + + **Metallic** is almost a binary value. Pure conductors have a metallic value of 1 and pure dielectrics have a metallic value of 0. You should try to use values close at or close to 0 and 1. Intermediate values are meant for transitions between surface types (metal to rust for instance). + +Non-metallic materials +: **Base color** represents the reflected color and should be an sRGB value in the range 50-240 (strict range) or 30-240 (tolerant range). + + **Metallic** should be 0 or close to 0. + + **Reflectance** should be set to 127 sRGB (0.5 linear, 4% reflectance) if you cannot find a proper value. Do not use values under 90 sRGB (0.35 linear, 2% reflectance). + +Metallic materials +: **Base color** represents both the specular color and reflectance. Use values with a luminosity of 67% to 100% (170-255 sRGB). Oxidized or dirty metals should use a lower luminosity than clean metals to take into account the non-metallic components. + + **Metallic** should be 1 or close to 1. + + **Reflectance** is ignored (calculated from the base color). + +## Clear coat model + +The standard material model described previously is a good fit for isotropic surfaces made of a single layer. Multi-layer materials are unfortunately fairly common, particularly materials with a thin translucent layer over a standard layer. Real world examples of such materials include car paints, soda cans, lacquered wood, acrylic, etc. + +![Figure [materialClearCoat]: Comparison of a blue metallic surface under the standard material model (left) and the clear coat model (right)](images/material_clear_coat.png) + +A clear coat layer can be simulated as an extension of the standard material model by adding a second specular lobe, which implies evaluating a second specular BRDF. To simplify the implementation and parameterization, the clear coat layer will always be isotropic and dielectric. The base layer can be anything allowed by the standard model (dielectric or conductor). + +Since incoming light will traverse the clear coat layer, we must also take the loss of energy into account as shown in figure [clearCoatModel]. Our model will however not simulate inter reflection and refraction behaviors. + +![Figure [clearCoatModel]: Clear coat surface model](images/diagram_clear_coat.png) + +### Clear coat specular BRDF + +The clear coat layer will be modeled using the same Cook-Torrance microfacet BRDF used in the standard model. Since the clear coat layer is always isotropic and dielectric, with low roughness values (see section [Clear coat parameterization]), we can choose cheaper DFG terms without notably sacrificing visual quality. + +A survey of the terms listed in [#Karis13a] and [#Burley12] shows that the Fresnel and NDF terms we already use in the standard model are not computationally more expensive than other terms. [#Kelemen01] describes a much simpler term that can replace our Smith-GGX visibility term: + +$$\begin{equation} +V(l,h) = \frac{1}{4(\LoH)^2} +\end{equation}$$ + +This masking-shadowing function is not physically based, as shown in [#Heitz14], but its simplicity makes it desirable for real-time rendering. + +In summary, our clear coat BRDF is a Cook-Torrance specular microfacet model, with a GGX normal distribution function, a Kelemen visibility function, and a Schlick Fresnel function. Listing [kelemen] shows how trivial the GLSL implementation is. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +float V_Kelemen(float LoH) { + return 0.25 / (LoH * LoH); +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [kelemen]: Implementation of the Kelemen visibility term in GLSL] + +**Note on the Fresnel term** + +The Fresnel term of the specular BRDF requires $\fNormal$, the specular reflectance at normal incidence angle. This parameter can be computed from an index of refraction of an interface. We will assume that our clear coat layer is made of polyurethane, a common compound [used in coatings and varnishes](https://en.wikipedia.org/wiki/List_of_polyurethane_applications#Varnish), or similar. An air-polyurethane interface [has an IOR of 1.5](http://www.clearpur.com/transparent-polyurethanes/), from which we can deduce $\fNormal$: + +$$\begin{equation} +\fNormal(1.5) = \frac{(1.5 - 1)^2}{(1.5 + 1)^2} = 0.04 +\end{equation}$$ + +This corresponds to a Fresnel reflectance of 4% that we know is associated with common dielectric materials. + +### Integration in the surface response + +Because we must take into account the loss of energy caused by the addition of the clear coat layer, we can reformulate the BRDF from equation $\ref{brdf}$ thusly: + +$$\begin{equation} +f(v,l)=\fDiffuse(v,l) (1 - F_c) + \fSpecular(v,l) (1 - F_c) + f_c(v,l) +\end{equation}$$ + +Where $F_c$ is the Fresnel term of the clear coat BRDF and $f_c$ the clear coat BRDF + +### Clear coat parameterization + +The clear coat material model encompasses all the parameters previously defined for the standard material mode, plus two parameters described in table [clearCoatParameters]. + + + Parameter | Definition +----------------------:|:--------------------- +**ClearCoat** | Strength of the clear coat layer. Scalar between 0 and 1 +**ClearCoatRoughness** | Perceived smoothness or roughness of the clear coat layer. Scalar between 0 and 1 +[Table [clearCoatParameters]: Clear coat model parameters] + +The clear coat roughness parameter is remapped and clamped in a similar way to the roughness parameter of the standard material. + +Figure [clearCoat] and figure [clearCoatRoughness] show how the clear coat parameters affect the appearance of a surface. + +![Figure [clearCoat]: Clear coat varying from 0.0 (left) to 1.0 (right) with metallic set to 1.0 and roughness to 0.8](images/material_clear_coat1.png) + +![Figure [clearCoatRoughness]: Clear coat roughness varying from 0.0 (left) to 1.0 (right) with metallic set to 1.0, roughness to 0.8 and clear coat to 1.0](images/material_clear_coat2.png) + +Listing [clearCoatBRDF] shows the GLSL implementation of the clear coat material model after remapping, parameterization and integration in the standard surface response. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +void BRDF(...) { + // compute Fd and Fr from standard model + + // remapping and linearization of clear coat roughness + clearCoatPerceptualRoughness = clamp(clearCoatPerceptualRoughness, 0.089, 1.0); + clearCoatRoughness = clearCoatPerceptualRoughness * clearCoatPerceptualRoughness; + + // clear coat BRDF + float Dc = D_GGX(clearCoatRoughness, NoH); + float Vc = V_Kelemen(clearCoatRoughness, LoH); + float Fc = F_Schlick(0.04, LoH) * clearCoat; // clear coat strength + float Frc = (Dc * Vc) * Fc; + + // account for energy loss in the base layer + return color * ((Fd + Fr * (1.0 - Fc)) * (1.0 - Fc) + Frc); +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [clearCoatBRDF]: Implementation of the clear coat BRDF in GLSL] + +### Base layer modification + +The presence of a clear coat layer means that we should recompute $\fNormal$, since it is normally based on an air-material interface. The base layer thus requires $\fNormal$ to be computed based on a clear coat-material interface instead. + +This can be achieved by computing the material's index of refraction (IOR) from $\fNormal$, then computing a new $\fNormal$ based on the newly computed IOR and the IOR of the clear coat layer (1.5). + +First, we compute the base layer's IOR: + +$$ +IOR_{base} = \frac{1 + \sqrt{\fNormal}}{1 - \sqrt{\fNormal}} +$$ + +Then we compute the new $\fNormal$ from this new index of refraction: + +$$ +f_{0_{base}} = \left( \frac{IOR_{base} - 1.5}{IOR_{base} + 1.5} \right) ^2 +$$ + +Since the clear coat layer's IOR is fixed, we can combine both steps to simplify: + +$$ +f_{0_{base}} = \frac{\left( 1 - 5 \sqrt{\fNormal} \right) ^2}{\left( 5 - \sqrt{\fNormal} \right) ^2} +$$ + +We should also modify the base layer's apparent roughness based on the IOR of the clear coat layer but this is something we have opted to leave out for now. + +## Anisotropic model + +The standard material model described previously can only describe isotropic surfaces, that is, surfaces whose properties are identical in all directions. Many real-world materials, such as brushed metal, can, however, only be replicated using an anisotropic model. + +![Figure [anisotropic]: Comparison of isotropic material (left) and anisotropic material (right)](images/material_anisotropic.png) + +### Anisotropic specular BRDF + +The isotropic specular BRDF described previously can be modified to handle anisotropic materials. Burley achieves this by using an anisotropic GGX NDF: + +$$\begin{equation} +D_{aniso}(h,\alpha) = \frac{1}{\pi \alpha_t \alpha_b} \frac{1}{((\frac{t \cdot h}{\alpha_t})^2 + (\frac{b \cdot h}{\alpha_b})^2 + (\NoH)^2)^2} +\end{equation}$$ + +This NDF unfortunately relies on two supplemental roughness terms noted $\alpha_b$, the roughness along the bitangent direction, and $\alpha_t$, the roughness along the tangent direction. Neubelt and Pettineo [#Neubelt13] propose a way to derive $\alpha_b$ from $\alpha_t$ by using an _anisotropy_ parameter that describes the relationship between the two roughness values for a material: + +$$ +\begin{align*} + \alpha_t &= \alpha \\ + \alpha_b &= lerp(0, \alpha, 1 - anisotropy) +\end{align*} +$$ + +The relationship defined in [#Burley12] is different, offers more pleasant and intuitive results, but is slightly more expensive: + +$$ +\begin{align*} + \alpha_t &= \frac{\alpha}{\sqrt{1 - 0.9 \times anisotropy}} \\ + \alpha_b &= \alpha \sqrt{1 - 0.9 \times anisotropy} +\end{align*} +$$ + +We instead opted to follow the relationship described in [#Kulla17] as it allows creation of sharp highlights: + +$$ +\begin{align*} + \alpha_t &= \alpha \times (1 + anisotropy) \\ + \alpha_b &= \alpha \times (1 - anisotropy) +\end{align*} +$$ + +Note that this NDF requires the tangent and bitangent directions in addition to the normal direction. Since these directions are already needed for normal mapping, providing them may not be an issue. + +The resulting implementation is described in listing [anisotropicBRDF]. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +float at = max(roughness * (1.0 + anisotropy), 0.001); +float ab = max(roughness * (1.0 - anisotropy), 0.001); + +float D_GGX_Anisotropic(float NoH, const vec3 h, + const vec3 t, const vec3 b, float at, float ab) { + float ToH = dot(t, h); + float BoH = dot(b, h); + float a2 = at * ab; + highp vec3 v = vec3(ab * ToH, at * BoH, a2 * NoH); + highp float v2 = dot(v, v); + float w2 = a2 / v2; + return a2 * w2 * w2 * (1.0 / PI); +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [anisotropicBRDF]: Implementation of Burley's anisotropic NDF in GLSL] + +In addition, [#Heitz14] presents an anisotropic masking-shadowing function to match the height-correlated GGX distribution. The masking-shadowing term can be greatly simplified by using the visibility function instead: + +$$\begin{equation} +G(v,l,h,\alpha) = \frac{\chi^+(\VoH) \chi^+(\LoH)}{1 + \Lambda(v) + \Lambda(l)} +\end{equation}$$ + +$$\begin{equation} +\Lambda(m) = \frac{-1 + \sqrt{1 + \alpha_0^2 tan^2(\theta_m)}}{2} = \frac{-1 + \sqrt{1 + \alpha_0^2 \frac{(1 - cos^2(\theta_m))}{cos^2(\theta_m)}}}{2} +\end{equation}$$ + +Where: + +$$\begin{equation} +\alpha_0 = \sqrt{cos^2(\phi_0)\alpha_x^2 + sin^2(\phi_0)\alpha_y^2} +\end{equation}$$ + +After derivation we obtain: + +$$\begin{equation} +V_{aniso}(\NoL,\NoV,\alpha) = \frac{1}{2((\NoL)\hat{\Lambda}_v+(\NoV)\hat{\Lambda}_l)} \\ +\hat{\Lambda}_v = \sqrt{\alpha^2_t(t \cdot v)^2+\alpha^2_b(b \cdot v)^2+(\NoV)^2} \\ +\hat{\Lambda}_l = \sqrt{\alpha^2_t(t \cdot l)^2+\alpha^2_b(b \cdot l)^2+(\NoL)^2} +\end{equation}$$ + +The term $ \hat{\Lambda}_v $ is the same for every light and can be computed only once if needed. The resulting implementation is described in listing [anisotropicV]. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +float at = max(roughness * (1.0 + anisotropy), 0.001); +float ab = max(roughness * (1.0 - anisotropy), 0.001); + +float V_SmithGGXCorrelated_Anisotropic(float at, float ab, float ToV, float BoV, + float ToL, float BoL, float NoV, float NoL) { + float lambdaV = NoL * length(vec3(at * ToV, ab * BoV, NoV)); + float lambdaL = NoV * length(vec3(at * ToL, ab * BoL, NoL)); + float v = 0.5 / (lambdaV + lambdaL); + return saturateMediump(v); +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [anisotropicV]: Implementation of the anisotropic visibility function in GLSL] + +### Anisotropic parameterization + +The anisotropic material model encompasses all the parameters previously defined for the standard material mode, plus an extra parameter described in table [anisotropicParameters]. + + + Parameter | Definition +----------------------:|:--------------------- +**Anisotropy** | Amount of anisotropy. Scalar between -1 and 1 +[Table [anisotropicParameters]: Anisotropic model parameters] + +No further remapping is required. Note that negative values will align the anisotropy with the bitangent direction instead of the tangent direction. Figure [anisotropyParameter] shows how the anisotropy parameter affect the appearance of a rough metallic surface. + +![Figure [anisotropyParameter]: Anisotropy varying from 0.0 (left) to 1.0 (right)](images/materials/anisotropy.png) + +## Subsurface model + +[TODO] + +### Subsurface specular BRDF + +[TODO] + +### Subsurface parameterization + +[TODO] + +## Cloth model + +All the material models described previously are designed to simulate dense surfaces, both at a macro and at a micro level. Clothes and fabrics are however often made of loosely connected threads that absorb and scatter incident light. The microfacet BRDFs presented earlier do a poor job of recreating the nature of cloth due to their underlying assumption that a surface is made of random grooves that behave as perfect mirrors. When compared to hard surfaces, cloth is characterized by a softer specular lobe with a large falloff and the presence of fuzz lighting, caused by forward/backward scattering. Some fabrics also exhibit two-tone specular colors (velvets for instance). + +Figure [materialCloth] shows how a traditional microfacet BRDF fails to capture the appearance of a sample of denim fabric. The surface appears rigid (almost plastic-like), more similar to a tarp than a piece of clothing. This figure also shows how important the softer specular lobe caused by absorption and scattering is to the faithful recreation of the fabric. + +![Figure [materialCloth]: Comparison of denim fabric rendered using a traditional microfacet BRDF (left) and our cloth BRDF (right)](images/screenshot_cloth.png) + +Velvet is an interesting use case for a cloth material model. As shown in figure [materialVelvet] this type of fabric exhibits strong rim lighting due to forward and backward scattering. These scattering events are caused by fibers standing straight at the surface of the fabric. When the incident light comes from the direction opposite to the view direction, the fibers will forward-scatter the light. Similarly, when the incident light from the same direction as the view direction, the fibers will scatter the light backward. + +![Figure [materialVelvet]: Velvet fabric showcasing forward and backward scattering](images/screenshot_cloth_velvet.png) + +Since fibers are flexible, we should in theory model the ability to groom the surface. While our model does not replicate this characteristic, it does model a visible front facing specular contribution that can be attributed to the random variance in the direction of the fibers. + +It is important to note that there are types of fabrics that are still best modeled by hard surface material models. For instance, leather, silk and satin can be recreated using the standard or anisotropic material models. + +### Cloth specular BRDF + +The cloth specular BRDF we use is a modified microfacet BRDF as described by Ashikhmin and Premoze in [#Ashikhmin07]. In their work, Ashikhmin and Premoze note that the distribution term is what contributes most to a BRDF and that the shadowing/masking term is not necessary for their velvet distribution. The distribution term itself is an inverted Gaussian distribution. This helps achieve fuzz lighting (forward and backward scattering) while an offset is added to simulate the front facing specular contribution. The so-called velvet NDF is defined as follows: + +$$\begin{equation} +D_{velvet}(v,h,\alpha) = c_{norm}(1 + 4 exp\left(\frac{-{cot}^2\theta_{h}}{\alpha^2}\right)) +\end{equation}$$ + +This NDF is a variant of the NDF the same authors describe in [#Ashikhmin00], notably modified to include an offset (set to 1 here) and an amplitude (4). In [#Neubelt13], Neubelt and Pettineo propose a normalized version of this NDF: + +$$\begin{equation} +D_{velvet}(v,h,\alpha) = \frac{1}{\pi(1 + 4\alpha^2)} (1 + 4 \frac{exp\left(\frac{-{cot}^2\theta_{h}}{\alpha^2}\right)}{{sin}^4\theta_{h}}) +\end{equation}$$ + +For the full specular BRDF, we also follow [#Neubelt13] and replace the traditional denominator with a smoother variant: + +$$\begin{equation}\label{clothSpecularBRDF} +f_{r}(v,h,\alpha) = \frac{D_{velvet}(v,h,\alpha)}{4(\NoL + \NoV - (\NoL)(\NoV))} +\end{equation}$$ + +The implementation of the velvet NDF is presented in listing [clothBRDF], optimized to properly fit in half float formats and to avoid computing a costly cotangent, relying instead on trigonometric identities. Note that we removed the Fresnel component from this BRDF. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +float D_Ashikhmin(float roughness, float NoH) { + // Ashikhmin 2007, "Distribution-based BRDFs" + float a2 = roughness * roughness; + float cos2h = NoH * NoH; + float sin2h = max(1.0 - cos2h, 0.0078125); // 2^(-14/2), so sin2h^2 > 0 in fp16 + float sin4h = sin2h * sin2h; + float cot2 = -cos2h / (a2 * sin2h); + return 1.0 / (PI * (4.0 * a2 + 1.0) * sin4h) * (4.0 * exp(cot2) + sin4h); +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [clothBRDF]: Implementation of Ashikhmin's velvet NDF in GLSL] + +In [#Estevez17] Estevez and Kulla propose a different NDF (called the "Charlie" sheen) that is based on an exponentiated sinusoidal instead of an inverted Gaussian. This NDF is appealing for several reasons: its parameterization feels more natural and intuitive, it provides a softer appearance and, as shown in equation $\ref{charlieNDF}$, its implementation is simpler: + +$$\begin{equation}\label{charlieNDF} +D(m) = \frac{(2 + \frac{1}{\alpha}) sin(\theta)^{\frac{1}{\alpha}}}{2 \pi} +\end{equation}$$ + +[#Estevez17] also presents a new shadowing term that we omit here because of its cost. We instead rely on the visibility term from [#Neubelt13] (shown in equation $\ref{clothSpecularBRDF}$ above). +The implementation of this NDF is presented in listing [clothCharlieBRDF], optimized to properly fit in half float formats. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +float D_Charlie(float roughness, float NoH) { + // Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF" + float invAlpha = 1.0 / roughness; + float cos2h = NoH * NoH; + float sin2h = max(1.0 - cos2h, 0.0078125); // 2^(-14/2), so sin2h^2 > 0 in fp16 + return (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI); +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [clothCharlieBRDF]: Implementation of the "Charlie" NDF in GLSL] + +#### Sheen color + +To offer better control over the appearance of cloth and to give users the ability to recreate two-tone specular materials, we introduce the ability to directly modify the specular reflectance. Figure [materialClothSheen] shows an example of using the parameter we call "sheen color". + +![Figure [materialClothSheen]: Blue fabric without (left) and with (right) sheen](images/screenshot_cloth_sheen.png) + +### Cloth diffuse BRDF + +Our cloth material model still relies on a Lambertian diffuse BRDF. It is however slightly modified to be energy conservative (akin to the energy conservation of our clear coat material model) and offers an optional subsurface scattering term. This extra term is not physically based and can be used to simulate the scattering, partial absorption and re-emission of light in certain types of fabrics. + +First, here is the diffuse term without the optional subsurface scattering: + +$$\begin{equation} +f_{d}(v,h) = \frac{c_{diff}}{\pi}(1 - F(v,h)) +\end{equation}$$ + +Where $F(v,h)$ is the Fresnel term of the cloth specular BRDF in equation $\ref{clothSpecularBRDF}$. In practice we've opted to leave out the $1 - F(v, h)$ term in the diffuse component. The effect is a bit subtle and we deemed it wasn't worth the added cost. + +Subsurface scattering is implemented using the wrapped diffuse lighting technique, in its energy conservative form: + +$$\begin{equation} +f_{d}(v,h) = \frac{c_{diff}}{\pi}(1 - F(v,h)) \left< \frac{\NoL + w}{(1 + w)^2} \right> \left< c_{subsurface} + \NoL \right> +\end{equation}$$ + +Where $w$ is a value between 0 and 1 defining by how much the diffuse light should wrap around the terminator. To avoid introducing another parameter, we fix $w = 0.5$. Note that with wrap diffuse lighting, the diffuse term must not be multiplied by $\NoL$. The effect of this cheap +subsurface scattering approximation can be seen in figure [materialClothSubsurface]. + +![Figure [materialClothSubsurface]: White cloth (left column) vs white cloth with brown subsurface scattering (right)](images/screenshot_cloth_subsurface.png) + +The complete implementation of our cloth BRDF, including sheen color and optional subsurface scattering, can be found in listing [clothFullBRDF]. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// specular BRDF +float D = distributionCloth(roughness, NoH); +float V = visibilityCloth(NoV, NoL); +vec3 F = sheenColor; +vec3 Fr = (D * V) * F; + +// diffuse BRDF +float diffuse = diffuse(roughness, NoV, NoL, LoH); +#if defined(MATERIAL_HAS_SUBSURFACE_COLOR) +// energy conservative wrap diffuse +diffuse *= saturate((dot(n, light.l) + 0.5) / 2.25); +#endif +vec3 Fd = diffuse * pixel.diffuseColor; + +#if defined(MATERIAL_HAS_SUBSURFACE_COLOR) +// cheap subsurface scatter +Fd *= saturate(subsurfaceColor + NoL); +vec3 color = Fd + Fr * NoL; +color *= (lightIntensity * lightAttenuation) * lightColor; +#else +vec3 color = Fd + Fr; +color *= (lightIntensity * lightAttenuation * NoL) * lightColor; +#endif +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [clothFullBRDF]: Implementation of our cloth BRDF in GLSL] + +### Cloth parameterization + +The cloth material model encompasses all the parameters previously defined for the standard material mode except for _metallic_ and _reflectance_. Two extra parameters described in table [clothParameters] are also available. + + + Parameter | Definition +---------------------:|:--------------------- +**SheenColor** | Specular tint to create two-tone specular fabrics (defaults to 0.04 to match the standard reflectance) +**SubsurfaceColor** | Tint for the diffuse color after scattering and absorption through the material +[Table [clothParameters]: Cloth model parameters] + + +To create a velvet-like material, the base color can be set to black (or a dark color). Chromaticity information should instead be set on the sheen color. To create more common fabrics such as denim, cotton, etc. use the base color for chromaticity and use the default sheen color or set the sheen color to the luminance of the base color. + +# Lighting + +The correctness and coherence of the lighting environment is paramount to achieving plausible visuals. After surveying existing rendering engines (such as Unity or Unreal Engine 4) as well as the traditional real-time rendering literature, it is obvious that coherency is rarely achieved. + +The Unreal Engine, for instance, lets artists specify the "brightness" of a point light in lumens, a unit of luminous power. The brightness of directional lights is however expressed using an arbitrary unnamed unit. To match the brightness of a point light with a luminous power of 5,000 lumens, the artist must use a directional light of brightness 10. This kind of mismatch makes it difficult for artists to maintain the visual integrity of a scene when adding, removing or modifying lights. +Using solely arbitrary units is a coherent solution but it makes reusing lighting rigs a difficult task. For instance, an outdoor scene will use a directional light of brightness 10 as the sun and all other lights will be defined relative to that value. Moving these lights to an indoor environment would make them too bright. + +Our goal is therefore to make all lighting correct by default, while giving artists enough freedom to achieve the desired look. We will support a number of lights, split in two categories, direct and indirect lighting: + +**Direct lighting**: punctual lights, photometric lights, area lights. + +**Indirect lighting**: image based lights (IBLs), for both local[^localProbesMobile] and distant light probes. + +[^localProbesMobile]: Local light probes might be too expensive to support on mobile, we will first focus our efforts on distant light probes set at infinity + +## Units + +The following sections will discuss how to implement various types of lights and the proposed equations make use of different symbols and units summarized in table [lightUnits]. + + + Photometric term | Notation | Unit +-----------------------:|:------------------:|:----------------- +Luminous power | $\Phi$ | Lumen ($lm$) +Luminous intensity | $I$ | Candela ($cd$) or $\frac{lm}{sr}$ +Illuminance | $E$ | Lux ($lx$) or $\frac{lm}{m^2}$ +Luminance | $L$ | Nit ($nt$) or $\frac{cd}{m^2}$ +Radiant power | $\Phi_e$ | Watt ($W$) +Luminous efficacy | $\eta$ | Lumens per watt ($\frac{lm}{W}$) +Luminous efficiency | $V$ | Percentage (%) +[Table [lightUnits]: Photometric units] + +To get properly coherent lighting, we must use light units that respect the ratio between various light intensities found in real-world scenes. These intensities can vary greatly, from around 800 $lm$ for a household light bulb to 120,000 $lx$ for a daylight sky and sun illumination. + +The easiest way to achieve lighting coherency is to adopt physical light units. This will in turn enable full reusability of lighting rigs. Using physical light units also allows us to use a physically based camera. + +Table [lightTypesUnits] shows the light unit associated with each type of light we intend to support. + + + Light type | Unit +------------------------:|:--------------------- +Directional light | Illuminance ($lx$ or $\frac{lm}{m^2}$) +Point light | Luminous power ($lm$) +Spot light | Luminous power ($lm$) +Photometric light | Luminous intensity ($cd$) +Masked photometric light | Luminous power ($lm$) +Area light | Luminous power ($lm$) +Image based light | Luminance ($\frac{cd}{m^2}$) +[Table [lightTypesUnits]: Intensity unity for each light type] + +**Notes about the radiant power unit** + +Even though commercially available light bulbs often display their brightness in lumens on the packaging, it is common to refer to the brightness of a light bulb by using its required energy in watts. The number of watts only indicates how much energy a bulb uses, not how bright it is. It is even more important to understand this difference now that more energy efficient bulbs are readily available (halogens, LEDs, etc.). + +However, since artists might be accustomed to gauging a light's brightness by its power, we should allow users to use the power unit to define the brightness of a light. The conversion is presented in equation $\ref{radiantPowerToLuminousPower}$. + +$$\begin{equation}\label{radiantPowerToLuminousPower} +\Phi = \Phi_e \eta +\end{equation}$$ + +In equation $\ref{radiantPowerToLuminousPower}$, $\eta$ is the luminous efficacy of the light, expressed in lumens per watt. Knowing that the [maximum possible luminous efficacy](http://en.wikipedia.org/wiki/Luminous_efficacy) is 683 $\frac{lm}{W}$ we can also use luminous efficiency $V$ (also called luminous coefficient), as shown in equation $\ref{radiantPowerLuminousEfficiency}$. + +$$\begin{equation}\label{radiantPowerLuminousEfficiency} +\Phi = \Phi_e 683 \times V +\end{equation}$$ + +Table [lightTypesEfficacy] can be used as a reference to convert watts to lumens using either the luminous efficacy or the luminous efficiency of various types of lights. More specific values are available on Wikipedia's [luminous efficacy](http://en.wikipedia.org/wiki/Luminous_efficacy) page. + + + Light type | Efficacy $\eta$ | Efficiency $V$ +-----------------------:|:------------------:|:----------------- +Incandescent | 14-35 | 2-5% +LED | 28-100 | 4-15% +Fluorescent | 60-100 | 9-15% +[Table [lightTypesEfficacy]: Efficacy and efficiency of various light types] + +### Light units validation + +One of the big advantages of using physical light units is the ability to physically validate our equations. We can use specialized devices to measure three light units. + +#### Illuminance + +The illuminance reaching a surface can be measured using an incident light meter. For our tests, we use a [Sekonic L-478D](http://www.sekonic.com/products/l-478d/overview.aspx), shown in figure [sekonic]. + +The incident light meter uses a white diffuse dome to capture the illuminance reaching a surface. It is important to orient the dome properly depending on the desired measurement. For instance, orienting the dome perpendicular to the sun on a bright clear day will give very different results than orienting the dome horizontally. + +![Figure [sekonic]: Sekonic L-478D incident light meter](images/photo_light_meter.jpg) + +#### Luminance + +The luminance at a surface, or the product of the incident light and the surface, can be measured using a luminance meter, also often called a spot meter. While incident light meters use a diffuse hemisphere to capture light from all directions, a spot meter uses a shield to measure incident light from a single direction. For our tests, we use a [Sekonic 5 degree Viewfinder](http://www.sekonic.com/products/l-478dr/accessories/np-finder-5-degree-for-l-478.aspx) that can replace the diffuser on the L-478D to measure luminance in a 5 degree cone. + +![Sekonic L-478D working as a luminance meter using a special viewfinder](images/photo_incident_light_meter.jpg) + +#### Luminous intensity + +The luminous intensity of a light source cannot be measured directly but can be derived from the measured illuminance if we know the distance between the measuring device and the light source. Equation $\ref{derivedLuminousIntensity}$ is a simple application of the inverse square law discussed in section [Punctual lights]. + +$$\begin{equation}\label{derivedLuminousIntensity} +I = E \cdot d^2 +\end{equation}$$ + +## Direct lighting + +We have defined the light units for all the light types supported by the renderer in the section above but we have not defined the light unit for the result of the lighting equations. Choosing physical light units means that we will compute luminance values in our shaders, and therefore that all our light evaluation functions will compute the luminance $L_{out}$ (or outgoing radiance) at any given point. The luminance depends on the illuminance $E$ and the BSDF $f(v,l)$ : + +$$\begin{equation}\label{luminanceEquation} +L_{out} = f(v,l)E +\end{equation}$$ + +### Directional lights + +The main purpose of directional lights is to recreate important light sources for outdoor environment, i.e. the sun and/or the moon. While directional lights do not truly exist in the physical world, any light source sufficiently far from the light receptor can be assumed to be directional (i.e. all the incident light rays are parallel, as shown in figure [directionalLight]). + +![Figure [directionalLight]: Interaction between a directional light and a surface. The light source is a virtual construct that can only be represented by a direction](images/diagram_directional_light.png) + +This approximation proves to work incredibly well for the diffuse response of a surface but the specular response is incorrect. The Frostbite engine solves this problem by treating the "sun" directional light as a disc area light. However, our tests have shown that the quality increase does not justify the added computational costs. + +We earlier stated that we chose an illuminance light unit ($lx$) for directional lights. This is in part due to the fact that we can easily find illuminance values for the sky and the sun (online or with a light meter) but also to simplify the luminance equation described in $\ref{luminanceEquation}$. + +$$\begin{equation}\label{directionalLuminanceEquation} +L_{out} = f(v,l) E_{\bot} \left< \NoL \right> +\end{equation}$$ + +In the simplified luminance equation $\ref{directionalLuminanceEquation}$, $E_{\bot}$ is the illuminance of the light source for a surface perpendicular to said light source. If the directional light source simulates the sun, $E_{\bot}$ is the illuminance of the sun for a surface perpendicular to the sun direction. + +Table [sunSkyIlluminance] provides useful reference values for the sun and sky illumination, measured[^illuminanceMeasures] on a clear day in March, in California. + + + Light | 10am | 12pm | 5:30pm +--------------------------:|---------:|---------:|---------: +$Sky_{\bot} + Sun_{\bot}$ | 120,000 | 130,000 | 90,000 +$Sky_{\bot}$ | 20,000 | 25,000 | 9,000 +$Sun_{\bot}$ | 100,000 | 105,000 | 81,000 +[Table [sunSkyIlluminance]: Illuminance values in $lx$ (a full moon has an illuminance of 1 $lx$)] + +Dynamic directional lights are particularly cheap to evaluate at runtime, as shown in listing [glslDirectionalLight]. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +vec3 l = normalize(-lightDirection); +float NoL = clamp(dot(n, l), 0.0, 1.0); + +// lightIntensity is the illuminance +// at perpendicular incidence in lux +float illuminance = lightIntensity * NoL; +vec3 luminance = BSDF(v, l) * illuminance; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [glslDirectionalLight]: Implementation of directional lights in GLSL] + +Figure [directionalLightTest] shows the effect of lighting a simple scene with a directional light setup to approximate a midday Sun (illuminance set to 110,000 $lx$). For illustration purposes, only direct lighting is shown. + +![Figure [directionalLightTest]: Series of dielectric materials of varying roughness under a directional light](images/screenshot_directional_light.png) + +[^illuminanceMeasures]: Measurements taken with an incident light meter (Sekonic L-478D) + +### Punctual lights + +Our engine will support two types of punctual lights, commonly found in most if not all rendering engines: point lights and spot lights. These types of lights are traditionally physically inaccurate for two reasons: + +1. They are truly punctual and infinitesimally small. +2. They do not follow the [inverse square law](http://en.wikipedia.org/wiki/Inverse-square_law). + +The first issue can be addressed with area lights but, given the cheaper nature of punctual lights it is deemed practical to use infinitesimally small punctual lights whenever possible. + +The second issue is easy to fix. For a given punctual light, the perceived intensity decreases proportionally to the square of the distance from the viewer (more precisely, the light receptor). + +For punctual lights following the inverse square law, the term $E$ of equation $ \ref{luminanceEquation} $ is expressed in equation $\ref{punctualLightEquation}$, where $d$ is the distance from a point at the surface to the light. + +$$\begin{equation}\label{punctualLightEquation} +E = L_{in} \left< \NoL \right> = \frac{I}{d^2} \left< \NoL \right> +\end{equation}$$ + +The difference between point and spot lights lies in how $E$ is computed, and in particular how the luminous intensity $I$ is computed from the luminous power $\Phi$. + +#### Point lights + +A point light is defined only by a position in space, as shown in figure [pointLight]. + +![Figure [pointLight]: Interaction between a point light and a surface. The attenuation only depends on the distance to the light](images/diagram_point_light.png) + +The luminous power of a point light is calculated by integrating the luminous intensity over the light's solid angle, as show in equation $\ref{pointLightLuminousPower}$. The luminous intensity can then be easily derived from the luminous power. + +$$\begin{equation}\label{pointLightLuminousPower} +\Phi = \int_{\Omega} I dl = \int_{0}^{2\pi} \int_{0}^{\pi} I d\theta d\phi = 4 \pi I \\ +I = \frac{\Phi}{4 \pi} +\end{equation}$$ + +By simple substitution of $I$ in $\ref{punctualLightEquation}$ and $E$ in $ \ref{luminanceEquation} $ we can formulate the luminance equation of a point light as a function of the luminous power (see $ \ref{pointLightLuminanceEquation} $). + +$$\begin{equation}\label{pointLightLuminanceEquation} +L_{out} = f(v,l) \frac{\Phi}{4 \pi d^2} \left< \NoL \right> +\end{equation}$$ + +Figure [pointLightTest] shows the effect of lighting a simple scene with a point light subject to distance attenuation. Light falloff is exaggerated for illustration purposes. + +![Figure [pointLightTest]: Inverse square law applied to point lights evaluation](images/screenshot_point_light.png) + +#### Spot lights + +A spot light is defined by a position in space, a direction vector and two cone angles, $ \theta_{inner} $ and $ \theta_{outer} $ (see figure [spotLight]). These two angles are used to define the angular falloff attenuation of the spot light. The light evaluation function of a spot light must therefore take into account both the inverse square law and these two angles to properly evaluate the luminance attenuation. + +![Figure [spotLight]: Interaction between a spot light and a surface. The attenuation depends on the distance to the light and the angle between the surface the spot light's direction vector](images/diagram_spot_light.png) + +Equation $ \ref{spotLightLuminousPower} $ describes how the luminous power of a spot light can be calculated in a similar fashion to point lights, using $ \theta_{outer} $ the outer angle of the spot light's cone in the range [0..$\pi$]. + +$$\begin{equation}\label{spotLightLuminousPower} +\Phi = \int_{\Omega} I dl = \int_{0}^{2\pi} \int_{0}^{\theta_{outer}} I d\theta d\phi = 2 \pi (1 - cos\frac{\theta_{outer}}{2})I \\ +I = \frac{\Phi}{2 \pi (1 - cos\frac{\theta_{outer}}{2})} +\end{equation}$$ + +While this formulation is physically correct, it makes spot lights a little difficult to use: changing the outer angle of the cone changes the illumination levels. Figure [spotLightTestFocused] shows the same scene lit by a spot light, with an outer angle of 55 degrees and an outer angle of 15 degrees. Observes how the illumination level increases as the cone aperture decreases. + +![Figure [spotLightTestFocused]: Comparison of spot light outer angles, 55 degrees (left) and 15 degrees (right)](images/screenshot_spot_light_focused.png) + +The coupling of illumination and the outer cone means that an artist cannot tweak the influence cone of a spot light without also changing the perceived illumination. It therefore makes sense to provide artists with a parameter to disable this coupling. Equations $ \ref{spotLightLuminousPowerB} $ shows how to formulate the luminous power for that purpose. + +$$\begin{equation}\label{spotLightLuminousPowerB} +\Phi = \pi I \\ +I = \frac{\Phi}{\pi} \\ +\end{equation}$$ + +With this new formulation to compute the luminous intensity, the test scene in figure [spotLightTest] exhibits similar illumination levels with both cone apertures. + +![Figure [spotLightTest]: Comparison of spot light outer angles, 55 degrees (left) and 15 degrees (right)](images/screenshot_spot_light.png) + +This new formulation can also be considered physically based if the spot's reflector is replaced with a matte, diffuse mask that absorbs light perfectly. + +The spot light evaluation function can be expressed in two ways: + +- **With a light absorber** + $$\begin{equation}\label{spotAbsorber} + L_{out} = f(v,l) \frac{\Phi}{\pi d^2} \left< \NoL \right> \lambda(l) + \end{equation}$$ +- **With a light reflector** + $$\begin{equation}\label{spotReflector} + L_{out} = f(v,l) \frac{\Phi}{2 \pi (1 - cos\frac{\theta_{outer}}{2}) d^2} \left< \NoL \right> \lambda(l) + \end{equation}$$ + +The term $ \lambda(l) $ in equations $ \ref{spotAbsorber} $ and $ \ref{spotReflector} $ is the spot's angle attenuation factor described in equation + $ \ref{spotAngleAtt} $ below. + +$$\begin{equation}\label{spotAngleAtt} +\lambda(l) = \frac{l \cdot spotDirection - cos\theta_{outer}}{cos\theta_{inner} - cos\theta_{outer}} +\end{equation}$$ + +#### Attenuation function + +A proper evaluation of the inverse square law attenuation factor is mandatory for physically based punctual lights. The simple mathematical formulation is unfortunately impractical for implementation purposes: + +1. The division by the squared distance can lead to divides by 0 when objects intersect or "touch" light sources. + +2. The influence sphere of each light is infinite ($ \frac{I}{d^2} $ is asymptotic, it never reaches 0) which means that to correctly shade a pixel we need to evaluate every light in the world. + + +The first issue can be solved easily by setting the assumption that punctual lights are not truly punctual but instead small area lights. To do this we can simply treat punctual lights as spheres of 1 cm radius, as show in equation $\ref{finitePunctualLight}$. + +$$\begin{equation}\label{finitePunctualLight} +E = \frac{I}{max(d^2, {0.01}^2)} +\end{equation}$$ + +We can solve the second issue by introducing an influence radius for each light. There are several advantages to this solution. Tools can quickly show artists what parts of the world will be influenced by every light (the tool just needs to draw a sphere centered on each light). The rendering engine can cull lights more aggressively using this extra piece of information and artists/developers can assist the engine by manually tweaking the influence radius of a light. + +Mathematically, the illuminance of a light should smoothly reach zero at the limit defined by the influence radius. [#Karis13b] proposes to window the inverse square function in such a way that the majority of the light's influence remains unaffected. The proposed windowing is described in equation $\ref{attenuationWindowing}$, where $r$ is the light's radius of influence. + +$$\begin{equation}\label{attenuationWindowing} +E = \frac{I}{max(d^2, {0.01}^2)} \left< 1 - \frac{d^4}{r^4} \right>^2 +\end{equation}$$ + +Listing [glslPunctualLight] demonstrates how to implement physically based punctual lights in GLSL. Note that the light intensity used in this piece of code is the luminous intensity $I$ in $cd$, converted from the luminous power CPU-side. This snippet is not optimized and some of the computations can be offloaded to the CPU (for instance the square of the light's inverse falloff radius, or the spot scale and angle). + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +float getSquareFalloffAttenuation(vec3 posToLight, float lightInvRadius) { + float distanceSquare = dot(posToLight, posToLight); + float factor = distanceSquare * lightInvRadius * lightInvRadius; + float smoothFactor = max(1.0 - factor * factor, 0.0); + return (smoothFactor * smoothFactor) / max(distanceSquare, 1e-4); +} + +float getSpotAngleAttenuation(vec3 l, vec3 lightDir, + float innerAngle, float outerAngle) { + // the scale and offset computations can be done CPU-side + float cosOuter = cos(outerAngle); + float spotScale = 1.0 / max(cos(innerAngle) - cosOuter, 1e-4) + float spotOffset = -cosOuter * spotScale + + float cd = dot(normalize(-lightDir), l); + float attenuation = clamp(cd * spotScale + spotOffset, 0.0, 1.0); + return attenuation * attenuation; +} + +vec3 evaluatePunctualLight() { + vec3 l = normalize(posToLight); + float NoL = clamp(dot(n, l), 0.0, 1.0); + vec3 posToLight = lightPosition - worldPosition; + + float attenuation; + attenuation = getSquareFalloffAttenuation(posToLight, lightInvRadius); + attenuation *= getSpotAngleAttenuation(l, lightDir, innerAngle, outerAngle); + + vec3 luminance = (BSDF(v, l) * lightIntensity * attenuation * NoL) * lightColor; + return luminance; +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [glslPunctualLight]: Implementation of punctual lights in GLSL] + +### Photometric lights + +Punctual lights are an extremely practical and efficient way to light a scene but do not give artists enough control over the light distribution. The field of architectural lighting design concerns itself with designing lighting systems to serve humans needs by taking into account: + +- The amount of light provided +- The color of the light +- The distribution of light within the space + +The lighting system we have described so far can easily address the first two points but we need a way to define the distribution of light within the space. Light distribution is especially important for indoor scenes or for some types of outdoor scenes or even road lighting. Figure [lightDistributionTest] shows scenes where the light distribution is controlled by the artist. This type of distribution control is widely used when putting objects on display (museums, stores or galleries for instance). + +![Figure [lightDistributionTest]: Controlling the distribution of a point light](images/screenshot_photometric_lights.png) + +Photometric lights use a photometric profile to describe their intensity distribution. There are two commonly used formats, IES (Illuminating Engineering Society) and EULUMDAT (European Lumen Data format) but we will focus on the former. IES profiles are supported by many tools and engines, such as Unreal Engine 4, Frostbite, Renderman, Maya and Killzone. In addition, IES light profiles are commonly made available by bulbs and luminaires manufacturers (Philips offers [an extensive array of IES files](http://www.usa.lighting.philips.com/connect/tools_literature/photometric_data_1.wpd) for download for instance). Photometric profiles are particularly useful when they measure a luminaire or light fixture, in which the light source is partially covered. The luminaire will block the light emitted in certain directions, thus shaping the light distribution. + +![Example of a real world luminaires that can be described by photometric profiles](images/photo_photometric_lights.jpg) + +An IES profile stores luminous intensity for various angles on a sphere around the measured light source. This spherical coordinate system is usually referred to as the photometric web, which can be visualized using specialized tools such as [IESviewer](http://www.photometricviewer.com/). Figure [xarrow] below shows the photometric web of the XArrow IES profile [provided by Pixar](http://renderman.pixar.com/view/DP25764) for use with Renderman. This picture also shows a rendering in 3D space of the XArrow IES profile by our tool `lightgen`. + +![Figure [xarrow]: The XArrow IES profile rendered as a photometric web and as a point light in 3D space](images/screenshot_xarrow.png) + +The IES format is poorly documented and it is not uncommon to find syntax variations between files found on the Internet. The best resource to understand IES profile is Ian Ashdown's "Parsing the IESNA LM-63 photometric data file" document [#Ashdown98]. Succinctly, an IES profiles stores luminous intensities in candela at various angles around the light source. For each measured horizontal angle, a series of luminous intensities at different vertical angles is provided. It is however fairly common for measured light sources to be horizontally symmetrical. The XArrow profile shown above is a good example: intensities vary with vertical angles (vertical axis) but are symmetrical on the horizontal axis. The range of vertical angles in an IES profile is 0 to 180 degrees and the range of horizontal angles is 0 to 360 degrees. + +Figure [lightenSamples] shows the series of IES profiles provided by Pixar for Renderman, rendered using our `lightgen` tool. + +![Figure [lightenSamples]: Series of IES light profiles rendered with lightgen](images/screenshot_lightgen_samples.png) + +IES profiles can be applied directly to any punctual light, point or spot. To do so, we must first process the IES profile and generate a photometric profile as a texture. For performance considerations, the photometric profile we generate is a 1D texture that represents the average luminous intensity for all horizontal angles at a specific vertical angle (i.e., each pixel represents a vertical angle). To truly represent a photometric light, we should use a 2D texture but since most lights are fully, or mostly, symmetrical on the horizontal plane, we can accept this approximation. The values stored in the texture are normalized by the inverse maximum intensity defined in the IES profile. This allows us to easily store the texture in any float format or, at the cost of a bit of precision, in a luminance 8-bit texture (grayscale PNG for instance). Storing normalized values also allows us to treat photometric profiles as a mask: + +Photometric profile as a mask +: The luminous intensity is defined by the artist by setting the luminous power of the light, as with any other punctual light. The artist defined intensity is divided by the intensity of the light computed from the IES profile. IES profiles contain a luminous intensity but it is only valid for a bare light bulb whereas the measured intensity values take into account the light fixture. To measure the intensity of the luminaire, instead of the bulb, we perform a Monte-Carlo integration of the unit sphere using the intensities from the profile[^xarrowIntensity]. + +Photometric profile +: The luminous intensity comes from the profile itself. All the values sampled from the 1D texture are simply multiplied by the maximum intensity. We also provide a multiplier for convenience. + +The photometric profile can be applied at rendering time as a simple attenuation. The luminance equation $ \ref{photometricLightEvaluation} $ describes the photometric point light evaluation function. + +$$\begin{equation}\label{photometricLightEvaluation} +L_{out} = f(v,l) \frac{I}{d^2} \left< \NoL \right> \Psi(l) +\end{equation}$$ + +The term $ \Psi(l) $ is the photometric attenuation function. It depends on the light vector, but also on the direction of the light. Spot lights already possess a direction vector but we need to introduce one for photometric point lights as well. + +The photometric attenuation function can be easily implemented in GLSL by adding a new attenuation factor to the implementation of punctual lights (listing [glslPunctualLight]). The modified implementation is show in listing [glslPhotometricPunctualLight]. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +float getPhotometricAttenuation(vec3 posToLight, vec3 lightDir) { + float cosTheta = dot(-posToLight, lightDir); + float angle = acos(cosTheta) * (1.0 / PI); + return texture2DLodEXT(lightProfileMap, vec2(angle, 0.0), 0.0).r; +} + +vec3 evaluatePunctualLight() { + vec3 l = normalize(posToLight); + float NoL = clamp(dot(n, l), 0.0, 1.0); + vec3 posToLight = lightPosition - worldPosition; + + float attenuation; + attenuation = getSquareFalloffAttenuation(posToLight, lightInvRadius); + attenuation *= getSpotAngleAttenuation(l, lightDirection, innerAngle, outerAngle); + attenuation *= getPhotometricAttenuation(l, lightDirection); + + float luminance = (BSDF(v, l) * lightIntensity * attenuation * NoL) * lightColor; + return luminance; +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [glslPhotometricPunctualLight]: Implementation of attenuation from photometric profiles in GLSL] + +The light intensity is computed CPU-side (listing [photometricLightIntensity]) and depends on whether the photometric profile is used as a mask. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +float multiplier; +// Photometric profile used as a mask +if (photometricLight.isMasked()) { + // The desired intensity is set by the artist + // The integrated intensity comes from a Monte-Carlo + // integration over the unit sphere around the luminaire + multiplier = photometricLight.getDesiredIntensity() / + photometricLight.getIntegratedIntensity(); +} else { + // Multiplier provided for convenience, set to 1.0 by default + multiplier = photometricLight.getMultiplier(); +} + +// The max intensity in cd comes from the IES profile +float lightIntensity = photometricLight.getMaxIntensity() * multiplier; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [photometricLightIntensity]: Computing the intensity of a photometric light on the CPU] + +[^xarrowIntensity]: The XArrow profile declares a luminous intensity of 1,750 lm but a Monte-Carlo integration shows an intensity of only 350 lm. + +### Area lights + +[TODO] + +### Lights parameterization + +Similarly to the parameterization of the standard material model, our goal is to make lights parameterization intuitive and easy to use for artists and developers alike. In that spirit, we decided to separate the light color (or hue) from the light intensity. A light color will therefore be defined as a linear RGB color (or sRGB in the tools UI for convenience). + +The full list of light parameters is presented in table [lightParameters]. + + + Parameter | Definition +--------------------------:|:--------------------- +**Type** | Directional, point, spot or area +**Direction** | Used for directional lights, spot lights, photometric point lights, and linear and tubular area lights (orientation) +**Color** | The color of emitted light, as a linear RGB color. Can be specified as an sRGB color or a color temperature in the tools +**Intensity** | The light's brightness. The unit depends on the type of light +**Falloff radius** | Maximum distance of influence +**Inner angle** | Angle of the inner cone for spot lights, in degrees +**Outer angle** | Angle of the outer cone for spot lights, in degrees +**Length** | Length of the area light, used to create linear or tubular lights +**Radius** | Radius of the area light, used to create spherical or tubular lights +**Photometric profile** | Texture representing a photometric light profile, works only for punctual lights +**Masked profile** | Boolean indicating whether the IES profile is used as a mask or not. When used as a mask, the light's brightness will be multiplied by the ratio between the user specified intensity and the integrated IES profile intensity. When not used as a mask, the user specified intensity is ignored but the IES multiplier is used instead +**Photometric multiplier** | Brightness multiplier for photometric lights (if IES as mask is turned off) +[Table [lightParameters]: Light types parameters] + +**Note**: to simplify the implementation, all luminous powers will converted to luminous intensities ($cd$) before being sent to the shader. The conversion is light dependent and is explained in the previous sections. + +**Note**: the light type can be inferred from other parameters (e.g. a point light has a length, radius, inner angle and outer angle of 0). + +#### Color temperature + +However, real-world artificial lights are often defined by their color temperature, measured in Kelvin (K). The color temperature of a light source is the temperature of an ideal black-body radiator that radiates light of comparable hue to that of the light source. For convenience, the tools should allow the artist to specify the hue of a light source as a color temperature (a meaningful range is 1,000 K to 12,500 K). + +To compute RGB values from a temperature, we can use the Planckian locus, shown in figure [planckianLocus]. This locus is the path that the color of an incandescent black body takes in a chromaticity space as the body's temperature changes. + +![Figure [planckianLocus]: The Planckian locus visualized on a CIE 1931 chromaticity diagram (source: Wikipedia)](images/diagram_planckian_locus.png) + +The easiest way to compute RGB values from this locus is to use the formula described in [#Krystek85]. Krystek's algorithm (equation $\ref{krystek}$) works in the CIE 1960 (UCS) space, using the following formula where $T$ is the desired temperature, and $u$ and $v$ the coordinates in UCS. + +$$\begin{equation}\label{krystek} +u(T) = \frac{0.860117757 + 1.54118254 \times 10^{-4}T + 1.28641212 \times 10^{-7}T^2}{1 + 8.42420235 \times 10^{-4}T + 7.08145163 \times 10^{-7}T^2} \\ +v(T) = \frac{0.317398726 + 4.22806245 + \times 10^{-5}T + 4.20481691 \times 10^{-8}T^2}{1 - 2.89741816 + \times 10^{-5}T + 1.61456053 \times 10^{-7}T^2} +\end{equation}$$ + +This approximation is accurate to roughly $ 9 \times 10^{-5} $ in the range 1,000K to 15,000K. From the CIE 1960 space we can compute the coordinates in xyY space (CIES 1931), using the formula from equation $\ref{cieToxyY}$. + +$$\begin{equation}\label{cieToxyY} +x = \frac{3u}{2u - 8v + 4} \\ +y = \frac{2v}{2u - 8v + 4} +\end{equation}$$ + +The formulas above are valid for black body color temperatures, and therefore correlated color temperatures of standard illuminants. If we wish to compute the precise chromaticity coordinates of standard CIE illuminants in the D series we can use equation $\ref{seriesDtoxyY}$. + +$$\begin{equation}\label{seriesDtoxyY} +x = \begin{cases} 0.244063 + 0.09911 \frac{10^3}{T} + 2.9678 \frac{10^6}{T^2} - 4.6070 \frac{10^9}{T^3} & 4,000K \le T \le 7,000K \\ +0.237040 + 0.24748 \frac{10^3}{T} + 1.9018 \frac{10^6}{T^2} - 2.0064 \frac{10^9}{T^3} & 7,000K \le T \le 25,000K \end{cases} \\ +y = -3x^2 + 2.87 x - 0.275 +\end{equation}$$ + +From the xyY space, we can then convert to the CIE XYZ space (equation $\ref{xyYtoXYZ}$). + +$$\begin{equation}\label{xyYtoXYZ} +X = \frac{xY}{y} \\ +Z = \frac{(1 - x - y)Y}{y} +\end{equation}$$ + +For our needs, we will fix $Y = 1$. This allows us to convert from the XYZ space to linear RGB with a simple 3x3 matrix, as shown in equation $\ref{XYZtoRGB}$. + +$$\begin{equation}\label{XYZtoRGB} +\left[ \begin{matrix} R \\ G \\ B \end{matrix} \right] = M^{-1} \left[ \begin{matrix} X \\ Y \\ Z \end{matrix} \right] +\end{equation}$$ + +The transformation matrix M is calculated from the target RGB color space primaries. Equation $ \ref{XYZtoRGBValues} $ shows the conversion using the inverse matrix for the sRGB color space. + +$$\begin{equation}\label{XYZtoRGBValues} +\left[ \begin{matrix} R \\ G \\ B \end{matrix} \right] = \left[ \begin{matrix} 3.2404542 & -1.5371385 & -0.4985314 \\ -0.9692660 & 1.8760108 & 0.0415560 \\ 0.0556434 & -0.2040259 & 1.0572252 \end{matrix} \right] \left[ \begin{matrix} X \\ Y \\ Z \end{matrix} \right] +\end{equation}$$ + +The result of these operations is a linear RGB triplet in the sRGB color space. Since we care about the chromaticity of the results, we must apply a normalization step to avoid clamping values greater than 1.0 and distort resulting colors: + +$$\begin{equation}\label{normalizedRGB} +\hat{C}_{linear} = \frac{C_{linear}}{max(C_{linear})} +\end{equation}$$ + +We must finally apply the sRGB opto-electronic conversion function (OECF, shown in equation $ \ref{OECFsRGB} $) to obtain a displayable value (the value should remain linear if passed to the renderer for shading). + +$$\begin{equation}\label{OECFsRGB} +C_{sRGB} = \begin{cases} 12.92 \times \hat{C}_{linear} & \hat{C}_{linear} \le 0.0031308 \\ +1.055 \times \hat{C}_{linear}^{\frac{1}{2.4}} - 0.055 & \hat{C}_{linear} \gt 0.0031308 \end{cases} +\end{equation}$$ + +For convenience, figure [colorTemperatureScaleCCT] shows the range of correlated color temperatures from 1,000K to 12,500K. All the colors used below assume CIE $ D_{65} $ as the white point (as is the case in the sRGB color space). + +![Figure [colorTemperatureScaleCCT]: Scale of correlated color temperatures](images/diagram_color_temperature_cct.png) + +Similarly, figure [colorTemperatureScaleCIE] shows the range of CIE standard illuminants series D from 1,000K to 12,500K. + +![Figure [colorTemperatureScaleCIE]: Scale of CIE standard illuminants series D](images/diagram_color_temperature_cie.png) + +For reference, figure [colorTemperatureScaleCCTClamped] shows the range of correlated color temperatures without the normalization step presented in equation $\ref{normalizedRGB}$. + +![Figure [colorTemperatureScaleCCTClamped]: Unnormalized scale of correlated color temperatures](images/diagram_color_temperature_cct_clamped.png) + +Table [colorTemperatureSamples] presents the correlated color temperature of various common light sources as sRGB color swatches. These colors are relative to the $ D_{65} $ white point, so their perceived hue might vary based on your display's white point. See [What colour is the Sun?](http://jila.colorado.edu/~ajsh/colour/Tspectrum.html) for more information. + + + Temperature (K) | Light source | Color +--------------------:|:-----------------------------|------------------------------------------------------- +1,700-1,800 | Match flame |
     
    +1,850-1,930 | Candle flame |
     
    +2,000-3,000 | Sun at sunrise/sunset |
     
    +2,500-2,900 | Household tungsten lightbulb |
     
    +3,000 | Tungsten lamp 1K |
     
    +3,200-3,500 | Quartz lights |
     
    +3,200-3,700 | Fluorescent lights |
     
    +3,275 | Tungsten lamp 2K |
     
    +3,380 | Tungsten lamp 5K, 10K |
     
    +5,000-5,400 | Sun at noon |
     
    +5,500-6,500 | Daylight (sun + sky) |
     
    +5,500-6,500 | Sun through clouds/haze |
     
    +6,000-7,500 | Overcast sky |
     
    +6,500 | RGB monitor white point |
     
    +7,000-8,000 | Shaded areas outdoors |
     
    +8,000-10,000 | Partly cloudy sky |
     
    +[Table [colorTemperatureSamples]: Normalized correlated color temperatures for common light sources] + +### Pre-exposed lights + +Physically based rendering and physical light units pose an interesting challenge: how to store and handle the large range of values produced by the lighting code? Assuming computations performed at full precision in the shaders, we still want to be able to store the linear output of the lighting pass in a reasonably sized buffer (`RGB16F` or equivalent). The most obvious and easiest way to achieve this is to simply apply the camera exposure (see the Physically based camera section for more information) before writing out the result of the lighting pass. This simple step is shown in listing [preexposedLighting]: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +fragColor = luminance * camera.exposure; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [preexposedLighting]: The output of the lighting pass is pre-exposed to fit in half-float buffers] + +This solution solves the storage problem but requires intermediate computations to be performed with single precision floats. We would instead prefer to perform all (or at least most) of the lighting work using half precision floats instead. Doing so can greatly improve performance and power usage, particularly on mobile devices. Half precision floats are however ill-suited for this kind of work as common illuminance and luminance values (for the sun for instance) can exceed their range. The solution is to simply pre-expose the lights themselves instead of the result of the lighting pass. This can be done efficiently on the CPU if updating a light's constant buffer is cheap. This can also be done on the GPU, as shown in listing [preexposedLights]. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// The inputs must be highp/single precision, +// both for range (intensity) and precision (exposure) +// The output is mediump/half precision +float computePreExposedIntensity(highp float intensity, highp float exposure) { + return intensity * exposure; +} + +Light getPointLight(uint index) { + Light light; + uint lightIndex = // fetch light index; + + // the intensity must be highp/single precision + highp vec4 colorIntensity = lightsUniforms.lights[lightIndex][1]; + + // pre-expose the light + light.colorIntensity.w = computePreExposedIntensity( + colorIntensity.w, frameUniforms.exposure); + + return light; +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [preexposedLights]: Pre-exposing lights allows the entire shading pipeline to use half precision floats] + +In practice we pre-expose the following lights: +- Punctual lights (point and spot): on the GPU +- Directional light: on the CPU +- IBLs: on the CPU +- Material emissive: on the GPU + +## Image based lights + +In real life, light comes from every direction either directly from light sources or indirectly after bouncing off objects in the environment, being partially absorbed in the process. In a way the whole environment around an object can be seen as a light source. Images, in particular cubemaps, are a great way to encode such an “environment light”. This is called Image Based Lighting (IBL) or sometimes Indirect Lighting. + +![Figure [iblBall]: The object shown here is lit only by image-encoded environment lights. Notice the subtle lighting effects that can be applied using this technique.](images/screenshot_ball_ibl.png) + +There are limitations with image-based lighting. Obviously the environment image must be acquired somehow and as we'll see below it needs to be pre-processed before it can be used for lighting. Typically, the environment image is acquired offline in the real world, or generated by the engine either offline or at run time; either way, local or distant probes are used. + +These probes can be used to acquire the distant or local environment. In this document, we're focusing on distant environment probes, where the light is assumed to come from infinitely far away (which means every point on the object's surface uses the same environment map). + +The whole environment contributes light to a given point on the object's surface; this is called _irradiance_ ($E$). The resulting light bouncing off of the object is called radiance ($L_{out}$). Incident lighting must be applied consistently to the diffuse and specular parts of the BRDF. + +The radiance $L_{out}$ resulting from the interaction between an image based light's (IBL) irradiance and a material model (BRDF) $f(\Theta)$[^ibl1] is computed as follows: + +$$\begin{equation} +L_{out}(n, v, \Theta) = \int_\Omega f(l, v, \Theta) L_{\bot}(l) \left< \NoL \right> dl +\end{equation}$$ + +Note that here we're looking at the behavior of the surface at **macro** level (not to be confused with the micro level equation), which is why it only depends on $\vec n$ and $\vec v$. Essentially, we're applying the BRDF to “point-lights” coming from all directions and encoded in the IBL. + +### IBL Types ### + +There are four common types of IBLs used in modern rendering engines: + +- **Distant light probes**, used to capture lighting information at "infinity", where parallax can be ignored. Distant probes typically contain the sky, distant landscape features or buildings, etc. They are either captured by the engine or acquired from a camera as high dynamic range images (HDRI). + +- **Local light probes**, used to capture a certain area of the world from a specific point of view. The capture is projected on a cube or sphere depending on the surrounding geometry. Local probes are more accurate than distance probes and are particularly useful to add local reflections to materials. + +- **Planar reflections**, used to capture reflections by rendering the scene mirrored by a plane. This technique works only for flat surfaces such as building floors, roads and water. + +- **Screen space reflection**, used to capture reflections based on the rendered scene (using the previous frame for instance) by ray-marching in the depth buffer. SSR gives great result but can be very expensive. + +In addition we must distinguish between static and dynamic IBLs. Implementing a fully dynamic day/night cycle requires for instance to recompute the distant light probes dynamically[^iblTypes1]. Both planar and screen space reflections are inherently dynamic. + +### IBL Unit ### + +As discussed previously in the direct lighting section, all our lights must use physical units. As such our IBLs will use the luminance unit $\frac{cd}{m^2}$, which is also the output unit of all our direct lighting equations. Using the luminance unit is straightforward for light probes captures by the engine (dynamically or statically offline). + +High dynamic range images are a bit more delicate to handle however. Cameras do not record measured luminance but a device-dependent value that is only _related_ to the original scene luminance. As such, we must provide artists with a multiplier that allows them to recover, or at the very least closely approximate, the original absolute luminance. + +To properly reconstruct the luminance of an HDRI for IBL, artists must do more than simply take photos of the environment and record extra information: + +- **Color calibration**: using a gray card or a [MacBeth ColorChecker](http://en.wikipedia.org/wiki/ColorChecker) + +- **Camera settings**: aperture, shutter and ISO + +- **Luminance samples**: using a spot/luminance meter + +[TODO] Measure and list common luminance values (clear sky, interior, etc.) + +### Processing light probes ### + +We saw previously that the radiance of an IBL is computed by integrating over the surface's hemisphere. Since this would obviously be too expensive to do in real-time, we must first pre-process our light probes to convert them into a format better suited for real-time interactions. + +The sections below will discuss the techniques used to accelerate the evaluation of light probes: + +- **Specular reflectance**: pre-filtered importance sampling and split-sum approximation + +- **Diffuse reflectance**: irradiance map and spherical harmonics + +### Distant light probes ### + +#### Diffuse BRDF integration #### + +Using the Lambertian BRDF[^iblDiffuse1], we get the radiance: + +$$ +\begin{align*} + f_d(\sigma) &= \frac{\sigma}{\pi} \\ +L_d(n, \sigma) &= \int_{\Omega} f_d(\sigma) L_{\bot}(l) \left< \NoL \right> dl \\ + &= \frac{\sigma}{\pi} \int_{\Omega} L_{\bot}(l) \left< \NoL \right> dl \\ + &= \frac{\sigma}{\pi} E_d(n) \quad \text{with the irradiance} \; + E_d(n) = \int_{\Omega} L_{\bot}(l) \left< \NoL \right> dl +\end{align*} +$$ + +Or in the discrete domain: + +$$ E_d(n) \equiv \sum_{\forall \, i \in image} L_{\bot}(s_i) \left< n \cdot s_i \right> \Omega_s $$ + +$\Omega_s$ is the solid-angle[^iblDiffuse2] associated to sample $i$. + +The irradiance integral $\Ed$ can be trivially, albeit slowly[^iblDiffuse3], precomputed and stored into a cubemap for efficient access at runtime. Typically, _image_ is a cubemap or an equirectangular image. The term $ \frac{\sigma}{\pi} $ is independent of the IBL and is added at runtime to obtain the _radiance_. + +![Figure [iblOriginal]: Image-based environment](images/ibl/ibl_river_roughness_m0.png style="max-width:100%;") + +![Figure [iblIrradiance]: Image-based irradiance map using the Lambertian BRDF](images/ibl/ibl_irradiance.png style="max-width:100%;") + + +[^ibl1]: $\Theta$ represents the parameters of the material model $f$, i.e.: _roughness_, albedo and so on... + +[^iblTypes1]: This can be done through blending of static probes or by spreading the workload over time + +[^iblDiffuse1]: The Lambertian BRDF doesn't depend on $\vec l$, $\vec v$ or $\theta$, so $L_d(n,v,\theta) \equiv L_d(n,\sigma)$ + +[^iblDiffuse2]: $\Omega_s$ can be approximated by $\frac{2\pi}{6 \cdot width \cdot height}$ for a cubemap + +[^iblDiffuse3]: $O(12\,n^2\,m^2)$, with $n$ and $m$ respectively the dimensions of the environment and the precomputed cubemap + + +However, the irradiance can also be approximated very closely by a decomposition into Spherical Harmonics (SH, described in more details in the Spherical Harmonics section) and calculated at runtime cheaply. It is usually best to avoid texture fetches on mobile and free-up a texture unit. Even if it is stored into a cubemap, it is orders of magnitude faster to pre-compute the integral using SH decomposition followed by a rendering. + +SH decomposition is similar in concept to a Fourier transform, it expresses the signal over an orthonormal base in the frequency domain. The properties that interests us most are: + +- Very few coefficients are needed to encode $\cosTheta$ + +- Convolutions by a kernel that _has a circular symmetry_ are very inexpensive and become products in SH space + +In practice only 4 or 9 coefficients (i.e.: 2 or 3 bands) are enough for $\cosTheta$ meaning we don't need more either for $\Lt$. + +![Figure [iblSH3]: 3 bands (9 coefficients)](images/ibl/ibl_irradiance_sh3.png style="max-width:100%;") + +![Figure [iblSH2]: 2 bands (4 coefficients)](images/ibl/ibl_irradiance_sh2.png style="max-width:100%;") + + +In practice we pre-convolve $\Lt$ with $\cosTheta$ and pre-scale these coefficients by the basis scaling factors $K_l^m$ so that the reconstruction code is as simple as possible in the shader: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +vec3 irradianceSH(vec3 n) { + // uniform vec3 sphericalHarmonics[9] + // We can use only the first 2 bands for better performance + return + sphericalHarmonics[0] + + sphericalHarmonics[1] * (n.y) + + sphericalHarmonics[2] * (n.z) + + sphericalHarmonics[3] * (n.x) + + sphericalHarmonics[4] * (n.y * n.x) + + sphericalHarmonics[5] * (n.y * n.z) + + sphericalHarmonics[6] * (3.0 * n.z * n.z - 1.0) + + sphericalHarmonics[7] * (n.z * n.x) + + sphericalHarmonics[8] * (n.x * n.x - n.y * n.y); +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [irradianceSH]: GLSL code to reconstruct the irradiance from the pre-scaled SH] + +Note that with 2 bands, the computation above becomes a single $4 \times 4$ matrix-by-vector multiply. + +Additionally, because of the pre-scaling by $K_l^m$, the SH coefficients can be thought of as colors, in particular `sphericalHarmonics[0]` is directly the average irradiance. + + +#### Specular BRDF integration #### + +As we've seen above, the radiance $\Lout$ resulting from the interaction between an IBL's irradiance and a BRDF is: + +$$\begin{equation}\label{specularBRDFIntegration} +\Lout(n, v, \Theta) = \int_\Omega f(l, v, \Theta) \Lt(l) \left< \NoL \right> \partial l +\end{equation}$$ + +We recognize the convolution of $\Lt$ by $f(l, v, \Theta) \left< \NoL \right>$, +i.e.: the environment is *filtered* using the BRDF as a kernel. Indeed at higher roughness, +specular reflections look more *blurry*. + +Plugging the expression of $f$ in equation $\ref{specularBRDFIntegration}$, we obtain: + +$$\begin{equation} +\Lout(n,v,\Theta) = \int_\Omega D(l, v, \alpha) F(l, v, f_0, f_{90}) V(l, v, \alpha) \left< \NoL \right> \Lt(l) \partial l +\end{equation}$$ + +This expression depends on $v$, $\alpha$, $f_0$ and $f_{90}$ inside the integral, +which makes its evaluation extremely costly and unsuitable for real-time on mobile +(even using pre-filtered importance sampling). + +##### Simplifying the BRDF integration ##### + +Since there is no closed-form solution or an easy way to compute the $\Lout$ integral, we use a simplified +equation instead: $\hat{I}$, whereby we assume that $v = n$, that is the view direction $v$ is always +equal to the surface normal $n$. Clearly, this assumption will break all view-dependant effects of +the convolution, such as the increased blur in reflections closer to the viewer +(a.k.a. stretchy reflections). + +Such a simplification would also have a severe impact on constant environments, such as the white +furnace, because it would affect the magnitude of the constant (i.e. DC) term of the result. We +can at least correct for that by using a scale factor, $K$, in our simplified integral, which +will make sure the average irradiance stay correct when chosen properly. + + - $I$ is our original integral, i.e.: $I(g) = \int_\Omega g(l) \left< \NoL \right> \partial l$ + - $\hat{I}$ is the simplified integral where $v = n$ + - $K$ is a scale factor that ensures the average irradiance is unchanged by $\hat{I}$ + - $\tilde{I}$ is our final approximation of $I$, $\tilde{I} = \hat{I} \times K$ + + +Because $I$ is an integral multiplications can be distributed over it. i.e.: $I(g()f()) = I(g())I(f())$. + +Armed with that, + +$$\begin{equation} +I( f(\Theta) \Lt ) \approx \tilde{I}( f(\Theta) \Lt ) \\ +\tilde{I}( f(\Theta) \Lt ) = K \times \hat{I}( f(\Theta) \Lt ) \\ +K = \frac{I(f(\Theta))}{\hat{I}(f(\Theta))} +\end{equation}$$ + + +From the equation above we can see that $\tilde{I}$ is equivalent to $I$ when $\Lt$ is a constant, +and yields the correct result: + +$$\begin{align*} +\tilde{I}(f(\Theta)\Lt^{constant}) &= \Lt^{constant} \hat{I}(f(\Theta)) \frac{I(f(\Theta))}{\hat{I}(f(\Theta))} \\ + &= \Lt^{constant} I(f(\Theta)) \\ + &= I(f(\Theta)\Lt^{constant}) +\end{align*}$$ + + +Similarly, we can also demonstrate that the result is correct when $v = n$, since in that case $I = \hat{I}$: + +$$\begin{align*} +\tilde{I}(f(\Theta)\Lt) &= I(f(\Theta)\Lt) \frac{I(f(\Theta))}{I(f(\Theta))} \\ + &= I(f(\Theta)\Lt) +\end{align*}$$ + +Finally, we can show that the scale factor $K$ satisfies our average irradiance ($\bar{\Lt}$) +requirement by plugging $\Lt = \bar{\Lt} + (\Lt - \bar{\Lt}) = \bar{\Lt} + \Delta\Lt$ into $\tilde{I}$: + +$$\begin{align*} +\tilde{I}(f(\Theta)\Lt) &= \tilde{I}\left[f\left(\Theta\right) \left(\bar{\Lt} + \Delta\Lt\right)\right] \\ + &= K \times \hat{I}\left[f\left(\Theta\right) \left(\bar{\Lt} + \Delta\Lt\right)\right] \\ + &= K \times \left[\hat{I}\left(f\left(\Theta\right)\bar{\Lt}\right) + \hat{I}\left(f\left(\Theta\right)\Delta\Lt\right)\right] \\ + &= K \times \hat{I}\left(f\left(\Theta\right)\bar{\Lt}\right) + K \times \hat{I}\left(f\left(\Theta\right) \Delta\Lt\right) \\ + &= \tilde{I}\left(f\left(\Theta\right)\bar{\Lt}\right) + \tilde{I}\left(f\left(\Theta\right) \Delta\Lt\right) \\ + &= I\left(f\left(\Theta\right)\bar{\Lt}\right) + \tilde{I}\left(f\left(\Theta\right) \Delta\Lt\right) +\end{align*}$$ + +The above result shows that the average irradiance is computed correctly, i.e.: $I(f(\Theta)\bar{\Lt})$. + +A way to think about this approximation is that it splits the radiance $\Lt$ in two parts, +the average $\bar{\Lt}$ and the delta from the average $\Delta\Lt$ and computes the correct +integration of the average part then adds the simplified integration of the delta part: + +$$\begin{equation} +approximation(\Lt) = correct(\bar{\Lt}) + simplified(\Lt - \bar{\Lt}) +\end{equation}$$ + + + +Now, let's look at each term: + +$$\begin{equation}\label{iblPartialEquations} +\hat{I}(f(n, \alpha) \Lt) = \int_\Omega f(l, n, \alpha) \Lt(l) \left< \NoL \right> \partial l \\ +\hat{I}(f(n, \alpha)) = \int_\Omega f(l, n, \alpha) \left< \NoL \right> \partial l \\ +I(f(n, v, \alpha)) = \int_\Omega f(l, n, v, \alpha) \left< \NoL \right> \partial l +\end{equation}$$ + + +All three of these equations can be easily pre-calculated and stored in look-up tables, as explained +below. + + +##### Discrete Domain ##### + +In the discrete domain the equations in \ref{iblPartialEquations} become: + +$$\begin{equation} +\hat{I}(f(n, \alpha) \Lt) \equiv \frac{1}{N}\sum_{\forall \, i \in image} f(l_i, n, \alpha) \Lt(l_i) \left<\NoL\right> \\ +\hat{I}(f(n, \alpha)) \equiv \frac{1}{N}\sum_{\forall \, i \in image} f(l_i, n, \alpha) \left<\NoL\right> \\ +I(f(n, v, \alpha)) \equiv \frac{1}{N}\sum_{\forall \, i \in image} f(l_i, n, v, \alpha) \left<\NoL\right> +\end{equation}$$ + +However, in practice we're using _importance sampling_ which needs to take the $pdf$ of the distribution +into account and adds a term $\frac{4\left<\VoH\right>}{D(h_i, \alpha)\left<\NoH\right>}$. +See Importance Sampling For The IBL section: + +$$\begin{equation}\label{iblImportanceSampling} +\hat{I}(f(n, \alpha) \Lt) \equiv \frac{4}{N}\sum_i^N f(l_i, n, \alpha) \frac{\left<\VoH\right>}{D(h_i, \alpha)\left<\NoH\right>} \Lt(l_i) \left<\NoL\right> \\ +\hat{I}(f(n, \alpha)) \equiv \frac{4}{N}\sum_i^N f(l_i, n, \alpha) \frac{\left<\VoH\right>}{D(h_i, \alpha)\left<\NoH\right>} \left<\NoL\right> \\ +I(f(n, v, \alpha)) \equiv \frac{4}{N}\sum_i^N f(l_i, n, v, \alpha) \frac{\left<\VoH\right>}{D(h_i, \alpha)\left<\NoH\right>} \left<\NoL\right> +\end{equation}$$ + + +Recalling that for $\hat{I}$, we assume that $v = n$, equations \ref{iblImportanceSampling}, +simplifies to: + +$$\begin{equation} +\hat{I}(f(n, \alpha) \Lt) \equiv \frac{4}{N}\sum_i^N \frac{f(l_i, n, \alpha)}{D(h_i, \alpha)} \Lt(l_i) \left<\NoL\right> \\ +\hat{I}(f(n, \alpha)) \equiv \frac{4}{N}\sum_i^N \frac{f(l_i, n, \alpha)}{D(h_i, \alpha)} \left<\NoL\right> \\ +I(f(n, v, \alpha)) \equiv \frac{4}{N}\sum_i^N \frac{f(l_i, n, v, \alpha)}{D(h_i, \alpha)} \frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> +\end{equation}$$ + +Then, the first two equations can be merged together such that $LD(n, \alpha) = \frac{\hat{I}(f(n, \alpha) \Lt)}{\hat{I}(f(n, \alpha))}$ + +$$\begin{equation}\label{iblLD} +LD(n, \alpha) \equiv \frac{\sum_i^N \frac{f(l_i, n, \alpha)}{D(h_i, \alpha)} \Lt(l_i) \left<\NoL\right>}{\sum_i^N \frac{f(l_i, n, \alpha)}{D(h_i, \alpha)}\left<\NoL\right>} +\end{equation}$$ +$$\begin{equation}\label{iblDFV} +I(f(n, v, \alpha)) \equiv \frac{4}{N}\sum_i^N \frac{f(l_i, n, v, \alpha)}{D(h_i, \alpha)} \frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> +\end{equation}$$ + +Note that at this point, we could almost compute both remaining equations off-line. The only difficulty +is that we don't know $f_0$ nor $f_{90}$ when we precompute those integrals. We will see below that +we can incorporate these terms at runtime for equation \ref{iblDFV}, alas, this is not possible for +equation \ref{iblLD} and we have to assume $f_0 = f_{90} = 1$ (i.e.: the fresnel term always evaluates to 1). + +We also have to deal with the visibility term of the brdf, in practice keeping it yields to slightly +worst results compared to the ground truth, so we also set $V = 1$. + +Let's substitute $f$ in equations \ref{iblLD} and \ref{iblDFV}: + +$$\begin{equation} +f(l_i, n, \alpha) = D(h_i, \alpha)F(f_0, f_{90}, \left<\VoH\right>)V(l_i, v, \alpha) +\end{equation}$$ + +The first simplification is that the term $D(h_i, \alpha)$ in the brdf cancels out with the +denominator (which came from the $pdf$ due to importance sampling) and F and V disappear since we +assume their value is 1. + +$$\begin{equation} +LD(n, \alpha) \equiv \frac{\sum_i^N V(l_i, v, \alpha)\left<\NoL\right>\Lt(l_i) }{\sum_i^N \left<\NoL\right>} +\end{equation}$$ +$$\begin{equation}\label{iblFV} +I(f(n, v, \alpha)) \equiv \frac{4}{N}\sum_i^N \color{green}{F(f_0, f_{90}, \left<\VoH\right>)} V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> +\end{equation}$$ + +Now, let's substitute the fresnel term into equation \ref{iblFV}: + +$$\begin{equation} +F(f_0, f_{90}, \left<\VoH\right>) = f_0 (1 - F_c(\left<\VoH\right>)) + f_{90} F_c(\left<\VoH\right>) \\ +F_c(\left<\VoH\right>) = (1 - \left<\VoH\right>)^5 +\end{equation}$$ + + +$$\begin{equation} +I(f(n, v, \alpha)) \equiv \frac{4}{N}\sum_i^N \left[\color{green}{f_0 (1 - F_c(\left<\VoH\right>)) + f_{90} F_c(\left<\VoH\right>)}\right] V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> \\ +\end{equation}$$ + +$$ +\begin{align*} +I(f(n, v, \alpha)) \equiv & \color{green}{f_0 } \frac{4}{N}\sum_i^N \color{green}{(1 - F_c(\left<\VoH\right>))} V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> \\ + + & \color{green}{f_{90}} \frac{4}{N}\sum_i^N \color{green}{ F_c(\left<\VoH\right>) } V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> +\end{align*} +$$ + + +And finally, we extract the equations that can be calculated off-line (i.e.: the part that doesn't +depend on the runtime parameters $f_0$ and $f_{90}$): + +$$\begin{equation}\label{iblAllEquations} +DFG_1(\alpha, \left<\NoV\right>) = \frac{4}{N}\sum_i^N \color{green}{(1 - F_c(\left<\VoH\right>))} V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> \\ +DFG_2(\alpha, \left<\NoV\right>) = \frac{4}{N}\sum_i^N \color{green}{ F_c(\left<\VoH\right>) } V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> \\ +I(f(n, v, \alpha)) \equiv \color{green}{f_0} \color{red}{DFG_1(\alpha, \left<\NoV\right>)} + \color{green}{f_{90}} \color{red}{DFG_2(\alpha, \left<\NoV\right>)} +\end{equation}$$ + + +Notice that $DFG_1$ and $DFG_2$ only depend on $\NoV$, that is the angle between the normal $n$ and +the view direction $v$. This is true because the integral is symmetrical with respect to $n$. +When integrating, we can choose any $v$ we please as long as it satisfies $\NoV$ +(e.g.: when calculating $\VoH$). + + +Putting everything back together: + +$$ +\begin{align*} +\Lout(n,v,\alpha,f_0,f_{90}) &\simeq \big[ f_0 \color{red}{DFG_1(\NoV, \alpha)} + f_{90} \color{red}{DFG_2(\NoV, \alpha)} \big] \times LD(n, \alpha) \\ +DFG_1(\alpha, \left<\NoV\right>) &= \frac{4}{N}\sum_i^N \color{green}{(1 - F_c(\left<\VoH\right>))} V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> \\ +DFG_2(\alpha, \left<\NoV\right>) &= \frac{4}{N}\sum_i^N \color{green}{ F_c(\left<\VoH\right>) } V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> \\ +LD(n, \alpha) &= \frac{\sum_i^N V(l_i, n, \alpha)\left<\NoL\right>\Lt(l_i) }{\sum_i^N \left<\NoL\right>} +\end{align*} +$$ + +#### The $DFG_1$ and $DFG_2$ term visualized #### + +Both $DFG_1$ and $DFG_2$ can either be pre-calculated in a regular 2D texture indexed by $(\NoV, \alpha)$ +and sampled bilinearly, or computed at runtime using an analytic approximation of the surfaces. +See sample code in the annex. +The pre-calculated textures are shown in table [textureDFG]. +A C++ implementation of the pre-computation can be found in section [Precomputing L for image-based lighting]. + + +$DFG_1$ | $DFG_2$ | ${ DFG_1, DFG_2, 0 }$ +-------------------------|--------------------------|---------------------- +![](images/ibl/dfg1.png) | ![](images/ibl/dfg2.png) | ![](images/ibl/dfg.png) +[Table [textureDFG]: Y axis: $\alpha$. X axis: $cos \theta$] + + +$DFG_1$ and $DFG_2$ are conveniently within the $[0, 1]$ range, however 8-bits textures don't have +enough precision and will cause problems. +Unfortunately, on mobile, 16-bits or float textures are not ubiquitous and there are a limited +number of samplers. +Despite the attractive simplicity of the shader code using a texture, it might be better to use an +analytic approximation. Note however that since we only need to store two terms, +OpenGL ES 3.0's RG16F texture format is a good candidate. + +Such analytic approximation is described in [#Karis14], itself based on [#Lazarov13]. +[#Narkowicz14] is another interesting approximation. Note that these two approximations are not +compatible with the energy compensation term presented in section [Pre-integration for multiscattering]. +Table [textureApproxDFG] presents a visual representation of these approximations. + +$DFG_1$ | $DFG_2$ | ${ DFG_1, DFG_2, 0 }$ +--------------------------------|---------------------------------|---------------------- +![](images/ibl/dfg1_approx.png) | ![](images/ibl/dfg2_approx.png) | ![](images/ibl/dfg_approx.png) +[Table [textureApproxDFG]: Y axis: $\alpha$. X axis: $cos \theta$] + + +#### The $LD$ term visualized #### + +$LD$ is the convolution of the environment by a function that only depends on the $\alpha$ parameter +(itself related to the roughness, see section [Roughness remapping and clamping]). +$LD$ can conveniently be stored in a mip-mapped cubemap where increasing LODs receive the environment +pre-filtered with increasing roughness. This works well because this convolution is a +powerful low-pass filter. To make good use of each mipmap level, it is necessary to remap +$\alpha$; we find that using a power remapping with $\gamma = 2$ works well and is convenient. + +$$ +\begin{align*} + \alpha &= perceptualRoughness^2 \\ + lod_{\alpha} &= \alpha^{\frac{1}{2}} = perceptualRoughness \\ +\end{align*} +$$ + +See an example below: + + +![$\alpha=0.0$](images/ibl/ibl_river_roughness_m0.png style="max-width:100%;") +![$\alpha=0.2$](images/ibl/ibl_river_roughness_m1.png style="max-width:100%;") +![$\alpha=0.4$](images/ibl/ibl_river_roughness_m2.png style="max-width:100%;") +![$0.6$](images/ibl/ibl_river_roughness_m3.png style="max-width:100%;") +![$0.8$](images/ibl/ibl_river_roughness_m4.png style="max-width:100%;") + +#### Indirect specular and indirect diffuse components visualized #### + +Figure [iblVisualized] shows how indirect lighting interacts with dielectrics and conductors. Direct lighting was removed for illustration purposes. + +![Figure [iblVisualized]: Indirect diffuse and specular decomposition](images/ibl/ibl_visualization.jpg) + +#### IBL evaluation implementation #### + +Listing [iblEvaluation] presents a GLSL implementation to evaluate the IBL, using the various textures described in the previous sections. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +vec3 ibl(vec3 n, vec3 v, vec3 diffuseColor, vec3 f0, vec3 f90, + float perceptualRoughness) { + vec3 r = reflect(n); + vec3 Ld = textureCube(irradianceEnvMap, r) * diffuseColor; + float lod = computeLODFromRoughness(perceptualRoughness); + vec3 Lld = textureCube(prefilteredEnvMap, r, lod); + vec2 Ldfg = textureLod(dfgLut, vec2(dot(n, v), perceptualRoughness), 0.0).xy; + vec3 Lr = (f0 * Ldfg.x + f90 * Ldfg.y) * Lld; + return Ld + Lr; +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [iblEvaluation]: GLSL implementation of image based lighting evaluation] + +We can however save a couple of texture lookups by using Spherical Harmonics instead of an +irradiance cubemap and the analytical approximation of the $DFG$ LUT, as shown in listing [optimizedIblEvaluation]. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +vec3 irradianceSH(vec3 n) { + // uniform vec3 sphericalHarmonics[9] + // We can use only the first 2 bands for better performance + return + sphericalHarmonics[0] + + sphericalHarmonics[1] * (n.y) + + sphericalHarmonics[2] * (n.z) + + sphericalHarmonics[3] * (n.x) + + sphericalHarmonics[4] * (n.y * n.x) + + sphericalHarmonics[5] * (n.y * n.z) + + sphericalHarmonics[6] * (3.0 * n.z * n.z - 1.0) + + sphericalHarmonics[7] * (n.z * n.x) + + sphericalHarmonics[8] * (n.x * n.x - n.y * n.y); +} + +// NOTE: this is the DFG LUT implementation of the function above +vec2 prefilteredDFG_LUT(float coord, float NoV) { + // coord = sqrt(roughness), which is the mapping used by the + // IBL prefiltering code when computing the mipmaps + return textureLod(dfgLut, vec2(NoV, coord), 0.0).rg; +} + +vec3 evaluateSpecularIBL(vec3 r, float perceptualRoughness) { + // This assumes a 256x256 cubemap, with 9 mip levels + float lod = 8.0 * perceptualRoughness; + // decodeEnvironmentMap() either decodes RGBM or is a no-op if the + // cubemap is stored in a float texture + return decodeEnvironmentMap(textureCubeLodEXT(environmentMap, r, lod)); +} + +vec3 evaluateIBL(vec3 n, vec3 v, vec3 diffuseColor, vec3 f0, vec3 f90, float perceptualRoughness) { + float NoV = max(dot(n, v), 0.0); + vec3 r = reflect(-v, n); + + // Specular indirect + vec3 indirectSpecular = evaluateSpecularIBL(r, perceptualRoughness); + vec2 env = prefilteredDFG_LUT(perceptualRoughness, NoV); + vec3 specularColor = f0 * env.x + f90 * env.y; + + // Diffuse indirect + // We multiply by the Lambertian BRDF to compute radiance from irradiance + // With the Disney BRDF we would have to remove the Fresnel term that + // depends on NoL (it would be rolled into the SH). The Lambertian BRDF + // can be baked directly in the SH to save a multiplication here + vec3 indirectDiffuse = max(irradianceSH(n), 0.0) * Fd_Lambert(); + + // Indirect contribution + return diffuseColor * indirectDiffuse + indirectSpecular * specularColor; +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [optimizedIblEvaluation]: GLSL implementation of image based lighting evaluation] + + +#### Pre-integration for multiscattering #### + +In section [Energy loss in specular reflectance] we discussed how to use a second scaled specular lobe +to compensate for the energy loss due to only accounting for a single scattering event in our BRDF. +This energy compensation lobe is scaled by a term that depends on $r$ defined in the following way: + +$$\begin{equation} +r = \int_{\Omega} D(l,v) V(l,v) \left< \NoL \right> \partial l +\end{equation}$$ + +Or, evaluated with importance sampling (See Importance Sampling For The IBL section): + +$$\begin{equation} +r \equiv \frac{4}{N}\sum_i^N V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> +\end{equation}$$ + +This equality is very similar to the terms $DFG_1$ and $DFG_2$ seen in equation $\ref{iblAllEquations}$. +In fact, it's the same, except without the Fresnel term. + +By making the further assumption that $f_{90} = 1$, we can rewrite $DFG_1$ and $DFG_2$ and the +$\Lout$ reconstruction: + +$$ +\begin{align*} +\Lout(n,v,\alpha,f_0) &\simeq \big[ (1 - f_0) \color{red}{DFG_1^{multiscatter}(\NoV, \alpha)} + f_0 \color{red}{DFG_2^{multiscatter}(\NoV, \alpha)} \big] \times LD(n, \alpha) \\ +DFG_1^{multiscatter}(\alpha, \left<\NoV\right>) &= \frac{4}{N}\sum_i^N \color{green}{F_c(\left<\VoH\right>)} V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> \\ +DFG_2^{multiscatter}(\alpha, \left<\NoV\right>) &= \frac{4}{N}\sum_i^N V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> \\ +LD(n, \alpha) &= \frac{\sum_i^N V(l_i, n, \alpha)\left<\NoL\right>\Lt(l_i) }{\sum_i^N V(l_i, n, \alpha)\left<\NoL\right>} +\end{align*} +$$ + +These two new $DFG$ terms simply need to replace the ones used in the implementation shown in section [Precomputing L for image-based lighting]: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +float Fc = pow(1 - VoH, 5.0f); +r.x += Gv * Fc; +r.y += Gv; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [multiscatterIBLPreintegration]: C++ implementation of the $L_{DFG}$ term for multiscattering] + +To perform the reconstruction we need to slightly modify listing [multiscatterIBLEvaluation]: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +vec2 dfg = textureLod(dfgLut, vec2(dot(n, v), perceptualRoughness), 0.0).xy; +// (1 - f0) * dfg.x + f0 * dfg.y +vec3 specularColor = mix(dfg.xxx, dfg.yyy, f0); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [multiscatterIBLEvaluation]: GLSL implementation of image based lighting evaluation, with multiscattering LUT] + + +#### Summary #### + +In order to calculate the specular contribution of distant image-based lights, we had to make a few +approximations and compromises: + + - $v = n$, by far the assumption contributing to the largest error when integrating the + non-constant part of the IBL. This results in the complete loss of roughness anisotropy + with respect to the view point. + + - Roughness contribution for the non-constant part of the IBL is quantized and trilinear filtering + is used to interpolate between these levels. This is most visible at low roughnes (e.g.: around 0.0625 + for a 9 LODs cubemap). + + - Because mipmap levels are used to store the pre-integrated environment, they can't be used for + texture minification, as they ought to. This can causes aliasing or moiré artifacts in high frequency + regions or the environment at low roughness and/or distant or small objects. + This can also impact performance due to the resulting poor cache access pattern. + + - No Fresnel for the non-constant part of the IBL. + + - Visibility = 1 for the non-constant part of the IBL. + + - Schlick's Fresnel + + - $f_{90} = 1$ in the multiscattering case. + + +![Figure [iblPrefilterVsImportanceSampling]: +Comparison between importance-sampled reference (top) and prefiltered IBL (middle).](images/ibl/ibl_prefilter_vs_reference.png) + +![Figure [iblStretchyReflectionLoss]: +Error in reflections due to assuming $v = n$ (bottom) -- loss of "stretchy reflections".](images/ibl/ibl_stretchy_reflections_error.png) + +![Figure [iblRoughnessInLods0]: +Error due to storing the roughness in cubemaps LODs at roughness = 0.0625 (i.e.: sampling exactly between levels). +Notice how instead of bluring we see a "cross-fade" between two blurs.](images/ibl/ibl_trilinear_0.png) + +![Figure [iblRoughnessInLods1]: +Error due to storing the roughness in cubemaps LODs at roughness = 0.125 (i.e.: sampling exactly level 1). +When the roughness closely matches a LOD, the error due to trilinear filtering in the cubemap is +reduced. Notice the errors due to $v = n$ at grazing angles.](images/ibl/ibl_trilinear_1.png) + +![Figure [iblMoirePattern]: +Moiré pattern due to texture minification on a metallic sphere at $\alpha = 0$ +using an environment made of colored vertical stripes (skybox hidden).](images/ibl/ibl_no_mipmaping.png) + + +### Clear coat ### + +When sampling the IBL, the clear coat layer is calculated as a second specular lobe. This specular lobe is oriented along the view direction since we cannot reasonably integrate over the hemisphere. Listing [clearCoatIBL] demonstrates this approximation in practice. It also shows the energy conservation step. It is important to note that this second specular lobe is computed exactly the same way as the main specular lobe, using the same DFG approximation. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// clearCoat_NoV == shading_NoV if the clear coat layer doesn't have its own normal map +float Fc = F_Schlick(0.04, 1.0, clearCoat_NoV) * clearCoat; +// base layer attenuation for energy compensation +iblDiffuse *= 1.0 - Fc; +iblSpecular *= sq(1.0 - Fc); +iblSpecular += specularIBL(r, clearCoatPerceptualRoughness) * Fc; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [clearCoatIBL]: GLSL implementation of the clear coat specular lobe for image-based lighting] + +### Anisotropy ### + +[#McAuley15] describes a technique called “bent reflection vector”, based [#Revie12]. The bent reflection vector is a rough approximation of anisotropic lighting but the alternative is to use importance sampling. This approximation is sufficiently cheap to compute and provides good results, as shown in figure [anisotropicIBL1] and figure [anisotropicIBL2]. + +![Figure [anisotropicIBL1]: Anisotropic indirect specular reflections using bent normals (left: roughness 0.3, right: roughness: 0.0; both: anisotropy 1.0)](images/screenshot_anisotropic_ibl1.jpg) + +![Figure [anisotropicIBL2]: Anisotropic reflections with varying roughness, metallicness, etc.](images/screenshot_anisotropic_ibl2.jpg) + +The implementation of this technique is straightforward, as demonstrated in listing [bentReflectionVector]. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +vec3 anisotropicTangent = cross(bitangent, v); +vec3 anisotropicNormal = cross(anisotropicTangent, bitangent); +vec3 bentNormal = normalize(mix(n, anisotropicNormal, anisotropy)); +vec3 r = reflect(-v, bentNormal); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [bentReflectionVector]: GLSL implementation of the bent reflection vector] + +This technique can be made more useful by accepting negative `anisotropy` values, as shown in listing [bentReflectionVectorDirection]. When the anisotropy is negative, the highlights are not in the direction of the tangent, but in the direction of the bitangent instead. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +vec3 anisotropicDirection = anisotropy >= 0.0 ? bitangent : tangent; +vec3 anisotropicTangent = cross(anisotropicDirection, v); +vec3 anisotropicNormal = cross(anisotropicTangent, anisotropicDirection); +vec3 bentNormal = normalize(mix(n, anisotropicNormal, anisotropy)); +vec3 r = reflect(-v, bentNormal); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [bentReflectionVectorDirection]: GLSL implementation of the bent reflection vector] + +Figure [anisotropicDirection] demonstrates this modified implementation in practice. + +![Figure [anisotropicDirection]: Control of the anisotropy direction using positive (left) and negative (right) values](images/screenshot_anisotropy_direction.png) + +### Subsurface ### + +[TODO] Explain subsurface and IBL + +### Cloth ### + +The IBL implementation for the cloth material model is more complicated than for the other material models. The main difference stems from the use of a different NDF ("Charlie" vs height-correlated Smith GGX). As described in this section, we use the split-sum approximation to compute the DFG term of the BRDF when computing an IBL. This DFG term is designed for a different BRDF and cannot be used for the cloth BRDF. Since we designed our cloth BRDF to not need a Fresnel term, we can generate a single DG term in the 3rd channel of the DFG LUT. The result is shown in figure [dfgClothLUT]. + +The DG term is generated using uniform sampling as recommended in [#Estevez17]. With uniform sampling the $pdf$ is simply $\frac{1}{2\pi}$ and we must still use the Jacobian $\frac{1}{4\left< \VoH \right>}$. + +![Figure [dfgClothLUT]: DFG LUT with a 3rd channel encoding the DG term of the cloth BRDF](images/ibl/dfg_cloth.png) + +The remainder of the image-based lighting implementation follows the same steps as the implementation of regular lights, including the optional subsurface scattering term and its wrap diffuse component. Just as with the clear coat IBL implementation, we cannot integrate over the hemisphere and use the view direction as the dominant light direction to compute the wrap diffuse component. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +float diffuse = Fd_Lambert() * ambientOcclusion; +#if defined(SHADING_MODEL_CLOTH) +#if defined(MATERIAL_HAS_SUBSURFACE_COLOR) +diffuse *= saturate((NoV + 0.5) / 2.25); +#endif +#endif + +vec3 indirectDiffuse = irradianceIBL(n) * diffuse; +#if defined(SHADING_MODEL_CLOTH) && defined(MATERIAL_HAS_SUBSURFACE_COLOR) +indirectDiffuse *= saturate(subsurfaceColor + NoV); +#endif + +vec3 ibl = diffuseColor * indirectDiffuse + indirectSpecular * specularColor; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [clothApprox]: GLSL implementation of the DFG approximation for the cloth NDF] + +It is important to note that this only addresses part of the IBL problem. The pre-filtered specular environment maps described earlier are convolved with the standard shading model's BRDF, which differs from the cloth BRDF. To get accurate result we should in theory provide one set of IBLs per BRDF used in the engine. Providing a second set of IBLs is however not practical for our use case so we decided to rely on the existing IBLs instead. + +## Static lighting + +[TODO] Spherical-harmonics or spherical-gaussian lightmaps, irradiance volumes, PRT?… + +## Transparency and translucency lighting + +Transparent and translucent materials are important to add realism and correctness to scenes. Filament must therefore provide lighting models for both types of materials to allow artists to properly recreate realistic scenes. Translucency can also be used effectively in a number of non-realistic settings. + +### Transparency + +To properly light a transparent surface, we must first understand how the material's opacity is applied. Observe a window and you will see that the diffuse reflectance is transparent. On the other hand, the brighter the specular reflectance, the less opaque the window appears. This effect can be seen in figure [cameraTransparency]: the scene is properly reflected onto the glass surfaces but the specular highlight of the sun is bright enough to appear opaque. + +![Figure [cameraTransparency]: Example of a complex object where lit surface transparency plays an important role](images/screenshot_camera_transparency.jpg) + +![Figure [litCar]: Example of a complex object where lit surface transparency plays an important role](images/screenshot_car.jpg) + +To properly implement opacity, we will use the premultiplied alpha format. Given a desired opacity noted $ \alpha_{opacity} $ and a diffuse color $ \sigma $ (linear, unpremultiplied), we can compute the effective opacity of a fragment. + +$$\begin{align*} +color &= \sigma * \alpha_{opacity} \\ +opacity &= \alpha_{opacity} +\end{align*}$$ + +The physical interpretation is that the RGB components of the source color define how much light is emitted by the pixel, whereas the alpha component defines how much of the light behind the pixel is blocked by said pixel. We must therefore use the following blending functions: + +$$\begin{align*} +Blend_{src} &= 1 \\ +Blend_{dst} &= 1 - src_{\alpha} +\end{align*}$$ + +The GLSL implementation of these equations is presented in listing [surfaceTransparency]. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// baseColor has already been premultiplied +vec4 shadeSurface(vec4 baseColor) { + float alpha = baseColor.a; + + vec3 diffuseColor = evaluateDiffuseLighting(); + vec3 specularColor = evaluateSpecularLighting(); + + return vec4(diffuseColor + specularColor, alpha); +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [surfaceTransparency]: Implementation of lit surface transparency in GLSL] + +### Translucency + +Translucent materials can be divided into two categories: +- Surface translucency +- Volume translucency + +Volume translucency is useful to light particle systems, for instance clouds or smoke. Surface translucency can be used to imitate materials with transmitted scattering such as wax, marble, skin, etc. + +[TODO] Surface translucency (BRDF+BTDF, BSSRDF) + +![Figure [translucency]: Front-lit translucent object (left) and back-lit translucent object (right), using approximated BTDF and BSSRDF. Model: Lucy from the Stanford University Computer Graphics Laboratory](images/screenshot_translucency.png) + +## Occlusion + +Occlusion is an important darkening factor used to recreate shadowing at various scales: + +Small scale +: Micro-occlusion used to handle creases, cracks and cavities. + +Medium scale +: Macro-occlusion used to handle occlusion by an object's own geometry or by geometry baked in normal maps (bricks, etc.). + +Large scale +: Occlusion coming from contact between objects, or from an object's own geometry. + +We currently ignore micro-occlusion, which is often exposed in tools and engines under the form of a "cavity map". Sébastien Lagarde offers an interesting discussion in [#Lagarde14] on how micro-occlusion is handled in Frostbite: diffuse micro-occlusion is pre-baked in diffuse maps and specular micro-occlusion is pre-baked in reflectance textures. +In our system, micro-occlusion can simply be baked in the base color map. This must be done knowing that the specular light will not be affected by micro-occlusion. + +Medium scale ambient occlusion is pre-baked in ambient occlusion maps, exposed as a material parameter, as seen in the material parameterization section earlier. + +Large scale ambient occlusion is often computed using screen-space techniques such as *SSAO* (screen-space ambient occlusion), *HBAO* (horizon based ambient occlusion), etc. Note that these techniques can also contribute to medium scale ambient occlusion when the camera is close enough to surfaces. + +**Note**: to prevent over darkening when using both medium and large scale occlusion, Lagarde recommends to use $min({AO}_{medium}, {AO}_{large})$. + +### Diffuse occlusion + +Morgan McGuire formalizes ambient occlusion in the context of physically based rendering in [#McGuire10]. In his formulation, McGuire defines an ambient illumination function $ L_a $, which in our case is encoded with spherical harmonics. He also defines a visibility function $V$, with $V(l)=1$ if there is an unoccluded line of sight from the surface in direction $l$, and 0 otherwise. + +With these two functions, the ambient term of the rendering equation can be expressed as shown in equation $\ref{diffuseAO}$. + +$$\begin{equation}\label{diffuseAO} +L(l,v) = \int_{\Omega} f(l,v) L_a(l) V(l) \left< \NoL \right> dl +\end{equation}$$ + +This expression can be approximated by separating the visibility term from the illumination function, as shown in equation $\ref{diffuseAOApprox}$. + +$$\begin{equation}\label{diffuseAOApprox} +L(l,v) \approx \left( \pi \int_{\Omega} f(l,v) L_a(l) dl \right) \left( \frac{1}{\pi} \int_{\Omega} V(l) \left< \NoL \right> dl \right) +\end{equation}$$ + +This approximation is only exact when the distant light $ L_a $ is constant and $f$ is a Lambertian term. McGuire states however that this approximation is reasonable if both functions are relatively smooth over most of the sphere. This happens to be the case with a distant light probe (IBL). + +The left term of this approximation is the pre-computed diffuse component of our IBL. The right term is a scalar factor between 0 and 1 that indicates the fractional accessibility of a point. Its opposite is the diffuse ambient occlusion term, show in equation $\ref{diffuseAOTerm}$. + +$$\begin{equation}\label{diffuseAOTerm} +{AO} = 1 - \frac{1}{\pi} \int_{\Omega} V(l) \left< \NoL \right> dl +\end{equation}$$ + +Since we use a pre-computed diffuse term, we cannot compute the exact accessibility of shaded points at runtime. To compensate for this lack of information in our precomputed term, we partially reconstruct incident lighting by applying an ambient occlusion factor specific to the surface's material at the shaded point. + +In practice, baked ambient occlusion is stored as a grayscale texture which can often be lower resolution than other textures (base color or normals for instance). It is important to note that the ambient occlusion property of our material model intends to recreate macro-level diffuse ambient occlusion. While this approximation is not physically correct, it constitutes an acceptable tradeoff of quality vs performance. + +Figure [aoComparison] shows two different materials without and with diffuse ambient occlusion. Notice how the material ambient occlusion is used to recreate the natural shadowing that occurs between the different tiles. Without ambient occlusion, both materials appear too flat. + +![Figure [aoComparison]: Comparison of materials without diffuse ambient occlusion (left) and with (right)](images/screenshot_ao.jpg) + +Applying baked diffuse ambient occlusion in a GLSL shader is straightforward, as shown in listing [bakedDiffuseAO]. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// diffuse indirect +vec3 indirectDiffuse = max(irradianceSH(n), 0.0) * Fd_Lambert(); +// ambient occlusion +indirectDiffuse *= texture2D(aoMap, outUV).r; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [bakedDiffuseAO]: Implementation of baked diffuse ambient occlusion in GLSL] + +Note how the ambient occlusion term is only applied to indirect lighting. + +### Specular occlusion + +Specular micro-occlusion can be derived from $\fNormal$, itself derived from the diffuse color. The derivation is based on the knowledge that no real-world material has a reflectance lower than 2%. Values in the 0-2% range can therefore be treated as pre-baked specular occlusion used to smoothly extinguish the Fresnel term. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +float f90 = clamp(dot(f0, 50.0 * 0.33), 0.0, 1.0); +// cheap luminance approximation +float f90 = clamp(50.0 * f0.g, 0.0, 1.0); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [specularMicroOcclusion]: Pre-baked specular occlusion in GLSL] + +The derivations mentioned earlier for ambient occlusion assume Lambertian surfaces and are only valid for indirect diffuse lighting. The lack of information about surface accessibility is particularly harmful to the reconstruction of indirect specular lighting. It usually manifests itself as light leaks. + +Sébastien Lagarde proposes an empirical approach to derive the specular occlusion term from the diffuse occlusion term in [#Lagarde14]. The result does not have any physical basis but produces visually pleasant results. The goal of his formulation is return the diffuse occlusion term unmodified for rough surfaces. For smooth surfaces, the formulation, implemented in listing [specularOcclusion], reduces the influence of occlusion at normal incidence and increases it at grazing angles. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +float computeSpecularAO(float NoV, float ao, float roughness) { + return clamp(pow(NoV + ao, exp2(-16.0 * roughness - 1.0)) - 1.0 + ao, 0.0, 1.0); +} + +// specular indirect +vec3 indirectSpecular = evaluateSpecularIBL(r, perceptualRoughness); +// ambient occlusion +float ao = texture2D(aoMap, outUV).r; +indirectSpecular *= computeSpecularAO(NoV, ao, roughness); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [specularOcclusion]: Implementation of Lagarde's specular occlusion factor in GLSL] + +Note how the specular occlusion factor is only applied to indirect lighting. + +#### Horizon specular occlusion + +When computing the specular IBL contribution for a surface that uses a normal map, it is possible to end up with a reflection vector pointing towards the surface. If this reflection vector is used for shading directly, the surface will be lit in places where it should not be lit (assuming opaque surfaces). This is another occurrence of light leaking that can easily be minimized using a simple technique described by Jeff Russell [#Russell15]. + +The key idea is to occlude light coming from behind the surface. This can easily be achieved since a negative dot product between the reflected vector and the surface's normal indicates a reflection vector pointing towards the surface. Our implementation shown in listing [horizonOcclusion] is similar to Russell's, albeit without the artist controlled horizon fading factor. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// specular indirect +vec3 indirectSpecular = evaluateSpecularIBL(r, perceptualRoughness); + +// horizon occlusion with falloff, should be computed for direct specular too +float horizon = min(1.0 + dot(r, n), 1.0); +indirectSpecular *= horizon * horizon; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [horizonOcclusion]: Implementation of horizon specular occlusion in GLSL] + +Horizon specular occlusion fading is cheap but can easily be omitted to improve performance as needed. + +## Normal mapping + +There are two common use cases of normal maps: replacing high-poly meshes with low-poly meshes (using a base map) and adding surface details (using a detail map). + +Let's imagine that we want to render a piece of furniture covered in tufted leather. Modeling the geometry to accurately represent the tufted pattern would require too many triangles so we instead bake a high-poly mesh into a normal map. Once the base map is applied to a simplified mesh (in this case, a quad), we get the result in figure [normalMapped]. The base map used to create this effect is shown in figure [baseNormalMap]. + +![Figure [normalMapped]: Low-poly mesh without normal mapping (left) and with (right)](images/screenshot_normal_mapping.jpg) + +![Figure [baseNormalMap]: Normal map used as a base map](images/screenshot_normal_map.jpg) + +A simple problem arises if we now want to combine this base map with a second normal map. For instance, let's use the detail map shown in figure [detailNormalMap] to add cracks in the leather. + +![Figure [detailNormalMap]: Normal map used as a detail map](images/screenshot_normal_map_detail.jpg) + +Given the nature of normal maps (XYZ components stored in tangent space), it is fairly obvious that naive approaches such as linear or overlay blending cannot work. We will use two more advanced techniques: a mathematically correct one and an approximation suitable for real-time shading. + +### Reoriented normal mapping + +Colin Barré-Brisebois and Stephen Hill propose in [#Hill12] a mathematically sound solution called *Reoriented Normal Mapping*, which consists in rotating the basis of the detail map onto the normal from the base map. This technique relies on the shortest arc quaternion to apply the rotation, which greatly simplifies thanks to the properties of the tangent space. + +Following the simplifications described in [#Hill12], we can produce the GLSL implementation shown in listing [reorientedNormalMapping]. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +vec3 t = texture(baseMap, uv).xyz * vec3( 2.0, 2.0, 2.0) + vec3(-1.0, -1.0, 0.0); +vec3 u = texture(detailMap, uv).xyz * vec3(-2.0, -2.0, 2.0) + vec3( 1.0, 1.0, -1.0); +vec3 r = normalize(t * dot(t, u) - u * t.z); +return r; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [reorientedNormalMapping]: Implementation of reoriented normal mapping in GLSL] + +Note that this implementation assumes that the normals are stored uncompressed and in the [0..1] range in the source textures. + +The normalization step is not strictly necessary and can be skipped if the technique is used at runtime. If so, the computation of `r` becomes `t * dot(t, u) / t.z - u`. + +Since this technique is slightly more expensive than the one described below, we will mostly use it offline. We therefore provide a simple offline tool to combine two normal maps. Figure [blendedNormalMaps] presents the output of the tool with the base map and the detail map shown previously. + +![Figure [blendedNormalMaps]: Blended normal and detail map (left) and resulting render when combined with a diffuse map (right)](images/screenshot_normal_map_blended.jpg) + +### UDN blending + +The technique called UDN blending, described in [#Hill12], is a variant of the partial derivative blending technique. Its main advantage is the low number of shader instructions it requires (see listing [udnBlending]). While it leads to a reduction in details over flat areas, UDN blending is interesting if blending must be performed at runtime. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +vec3 t = texture(baseMap, uv).xyz * 2.0 - 1.0; +vec3 u = texture(detailMap, uv).xyz * 2.0 - 1.0; +vec3 r = normalize(t.xy + u.xy, t.z); +return r; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [udnBlending]: Implementation of UDN blending in GLSL] + +The results are visually close to Reoriented Normal Mapping but a careful comparison of the data shows that UDN is indeed less correct. Figure [blendedNormalMapsUDN] presents the result of the UDN blending approach using the same source data as in the previous examples. + +![Figure [blendedNormalMapsUDN]: Blended normal and detail map using the UDN blending technique](images/screenshot_normal_map_blended_udn.jpg) + +# Volumetric effects + +## Exponential height fog + +![Figure [exponentialHeightFog1]: Example of directional in-scattering with exponential height fog](images/screenshot_fog1.jpg) + +![Figure [exponentialHeightFog2]: Example of directional in-scattering with exponential height fog](images/screenshot_fog2.jpg) + +# Anti-aliasing + +[TODO] MSAA, geometric AA (normals and roughness), shader anti-aliasing (object-space shading?) + +# Imaging pipeline + +The lighting section of this document describes how light interacts with surfaces in the scene in a physically based manner. To achieve plausible results, we must go a step further and consider the transformations necessary to convert the scene luminance, as computed by our lighting equations, into displayable pixel values. + +The series of transformations we are going to use form the following imaging pipeline: + +************************************************************************************* +* .-------------. .--------------. .---------------. * +* | Scene | | Normalized | | | * +* | luminance +----->| luminance +----->| White balance | * +* | | | (HDR) | | | * +* '-------------' '--------------' '-------+-------' * +* | * +* v * +* .---------------. * +* | | * +* | Color grading | * +* | | * +* '-------+-------' * +* | * +* v * +* .---------------. * +* | | * +* | Tone mapping | * +* | | * +* '-------+-------' * +* | * +* v * +* .---------------. .-------------. * +* | | | Pixel | * +* | OETF +----->| value | * +* | | | (LDR) | * +* '---------------' '-------------' * +************************************************************************************* + +**Note**: the *OETF* step is the application of the opto-electronic transfer function of the target color space. For clarity this diagram does not include post-processing steps such as vignette, bloom, etc. These effects will be discussed separately. + +[TODO] Color spaces (ACES, sRGB, Rec. 709, Rec. 2020, etc.), gamma/linear, etc. + +## Physically based camera + +The first step in the image transformation process is to use a physically based camera to properly expose the scene's outgoing luminance. + +### Exposure settings + +Because we use photometric units throughout the lighting pipeline, the light reaching the camera is an energy expressed in luminance $L$, in $cd.m^{-2}$. Light incident to the camera sensor can cover a large range of values, from $10^{-5}cd.m^{-2}$ for starlight to $10^{9}cd.m^{-2}$ for the sun. Since we obviously cannot manipulate and even less record such a large range of values, we need to remap them. + +This range remapping is done in a camera by exposing the sensor for a certain time. To maximize the use of the limited range of the sensor, the scene's light range is centered around the "middle gray", a value halfway between black and white. The exposition is therefore achieved by manipulating, either manually or automatically, 3 settings: + +- Aperture +- Shutter speed +- Sensitivity (also called gain) + +Aperture +: Noted $N$ and expressed in f-stops ƒ, this setting controls how open or closed the camera system's aperture is. Since an f-stop indicate the ratio of the lens' focal length to the diameter of the entrance pupil, high-values (ƒ/16) indicate a small aperture and small values (ƒ/1.4) indicate a wide aperture. In addition to the exposition, the aperture setting controls the depth of field. + +Shutter speed +: Noted $t$ and expressed in seconds $s$, this setting controls how long the aperture remains opened (it also controls the timing of the sensor shutter(s), whether electronic or mechanical). In addition to the exposition, the shutter speed controls motion blur. + +Sensitivity +: Noted $S$ and expressed in ISO, this setting controls how the light reaching the sensor is quantized. Because of its unit, this setting is often referred to as simply the "ISO" or "ISO setting". In addition to the exposition, the sensitivity setting controls the amount of noise. + +### Exposure value + +Since referring to these 3 settings in our equations would be unwieldy, we instead summarize the “exposure triangle” by an exposure value, noted EV[^reciprocity]. + +The EV is expressed in a base-2 logarithmic scale, with a difference of 1 EV called a stop. One positive stop (+1 EV) corresponds to a factor of two in luminance and one negative stop (-1 EV) corresponds to a factor of half in luminance. + +Equation $ \ref{ev} $ shows the [formal definition of EV](https://en.wikipedia.org/wiki/Exposure_value). + +$$\begin{equation}\label{ev} +EV = log_2(\frac{N^2}{t}) +\end{equation}$$ + +Note that this definition is only function of the aperture and shutter speed, but not the sensitivity. An exposure value is by convention defined for ISO 100, or $ EV_{100} $, and because we wish to work with this convention, we need to be able to express $ EV_{100} $ as a function of the sensitivity. + +Since we know that EV is a base-2 logarithmic scale in which each stop increases or decreases the brightness by a factor of 2, we can formally define $ EV_{S} $, the exposure value at given sensitivity (equation $\ref{evS}$). + +$$\begin{equation}\label{evS} +{EV}_S = EV_{100} + log_2(\frac{S}{100}) +\end{equation}$$ + +Calculating the $ EV_{100} $ as a function of the 3 camera settings is trivial, as shown in $\ref{ev100}$. + +$$\begin{equation}\label{ev100} +{EV}_{100} = EV_{S} - log_2(\frac{S}{100}) = log_2(\frac{N^2}{t}) - log_2(\frac{S}{100}) +\end{equation}$$ + +Note that the operator (photographer, etc.) can achieve the same exposure (and therefore EV) with several combinations of aperture, shutter speed and sensitivity. This allows some artistic control in the process (depth of field vs motion blur vs grain). + +[^reciprocity]: We assume a digital sensor, which means we don't need to take reciprocity failure into account + +#### Exposure value and luminance + +A camera, similar to a spot meter, is able to measure the average luminance of a scene and convert it into EV to achieve automatic exposure, or at the very least offer the user exposure guidance. + +It is possible to define EV as a function of the scene luminance $L$, given a per-device calibration constant $K$ (equation $ \ref{evK} $). + +$$\begin{equation}\label{evK} +EV = log_2(\frac{L \times S}{K}) +\end{equation}$$ + +That constant $K$ is the reflected-light meter constant, which varies between manufacturers. We could find two common values for this constant: 12.5, used by Canon, Nikon and Sekonic, and 14, used by Pentax and Minolta. Given the wide availability of Canon and Nikon cameras, as well as our own usage of Sekonic light meters, we will choose to use $ K = 12.5 $. + +Since we want to work with $ EV_{100} $, we can substitute $K$ and $S$ in equation $ \ref{evK} $ to obtain equation $ \ref{ev100L} $. + +$$\begin{equation}\label{ev100L} +EV = log_2(L \frac{100}{12.5}) +\end{equation}$$ + +Given this relationship, it would be possible to implement automatic exposure in our engine by first measuring the average luminance of a frame. An easy way to achieve this is to simply downsample a luminance buffer down to 1 pixel and read the remaining value. This technique is unfortunately rarely stable and can easily be affected by extreme values. Many games use a different approach which consists in using a luminance histogram to remove extreme values. + +For validation and testing purposes, the luminance can be computed from a given EV: + +$$\begin{equation} +L = 2^{EV_{100}} \times \frac{12.5}{100} = 2^{EV_{100} - 3} +\end{equation}$$ + +#### Exposure value and illuminance + +It is possible to define EV as a function of the illuminance $E$, given a per-device calibration constant $C$: + +$$\begin{equation}\label{evC} +EV = log_2(\frac{E \times S}{C}) +\end{equation}$$ + +The constant $C$ is the incident-light meter constant, which varies between manufacturers and/or types of sensors. There are two common types of sensors: flat and hemispherical. For flat sensors, a common value is 250. With hemispherical sensors, we could find two common values: 320, used by Minolta, and 340, used by Sekonic. + +Since we want to work with $ EV_{100} $, we can substitute $S$ $ \ref{evC} $ to obtain equation $ \ref{ev100C} $. + +$$\begin{equation}\label{ev100C} +EV = log_2(E \frac{100}{C}) +\end{equation}$$ + +The illuminance can then be computed from a given EV. For a flat sensor with $ C = 250 $ we obtain equation $ \ref{eFlatSensor} $. + +$$\begin{equation}\label{eFlatSensor} +E = 2^{EV_{100}} \times 2.5 +\end{equation}$$ + +For a hemispherical sensor with $ C = 340 $ we obtain equation $ \ref{eHemisphereSensor} $ + +$$\begin{equation}\label{eHemisphereSensor} +E = 2^{EV_{100}} \times 3.4 +\end{equation}$$ + +#### Exposure compensation + +Even though an exposure value actually indicates combinations of camera settings, it is often used by photographers to describe light intensity. This is why cameras let photographers apply an exposure compensation to over or under-expose an image. This setting can be used for artistic control but also to achieve proper exposure (snow for instance will be exposed for as 18% middle-gray). + +Applying an exposure compensation $EC$ is a simple as adding an offset to the exposure value, as shown in equation $ \ref{ec} $. + +$$\begin{equation}\label{ec} +EV_{100}' = EV_{100} - EC +\end{equation}$$ + +This equation uses a negative sign because we are using $EC$ in f-stops to adjust the final exposure. Increasing the EV is akin to closing down the aperture of the lens (or reducing shutter speed or reducing sensitivity). A higher EV will produce darker images. + +### Exposure + +To convert the scene luminance into normalized luminance, we must use the [photometric exposure](https://en.wikipedia.org/wiki/Exposure_value#Camera_settings_vs._photometric_exposure) (or luminous exposure), or amount of scene luminance that reaches the camera sensor. The photometric exposure, expressed in lux seconds and noted $H$, is given by equation $ \ref{photometricExposure} $. + +$$\begin{equation}\label{photometricExposure} +H = \frac{q \cdot t}{N^2} L +\end{equation}$$ + +Where $L$ is the luminance of the scene, $t$ the shutter speed, $N$ the aperture and $q$ the lens and vignetting attenuation (typically $ q = 0.65 $[^lensAttenuation]). This definition does not take the sensor sensitivity into account. To do so, we must use one of the three ways to relate photometric exposure and sensitivity: saturation-based speed, noise-based speed and standard output sensitivity. + +We choose the saturation-based speed relation, which gives us $ H_{sat} $, the maximum possible exposure that does not lead to clipped or bloomed camera output (equation $ \ref{hSat} $). + +$$\begin{equation}\label{hSat} +H_{sat} = \frac{78}{S_{sat}} +\end{equation}$$ + +We combine equations $ \ref{hSat} $ and $ \ref{photometricExposure} $ in equation $ \ref{lmax} $ to compute the maximum luminance $ L_{max} $ that will saturate the sensor given exposure settings $S$, $N$ and $t$. + +$$\begin{equation}\label{lmax} +L_{max} = \frac{N^2}{q \cdot t} \frac{78}{S} +\end{equation}$$ + +This maximum luminance can then be used to normalize incident luminance $L$ as shown in equation $ \ref{normalizedLuminance} $. + +$$\begin{equation}\label{normalizedLuminance} +L' = L \frac{1}{L_{max}} +\end{equation}$$ + +$ L_{max} $ can be simplified using equation $ \ref{ev} $, $ S = 100 $ and $ q = 0.65 $: + +$$\begin{align*} +L_{max} &= \frac{N^2}{t} \frac{78}{q \cdot S} \\ +L_{max} &= 2^{EV_{100}} \frac{78}{q \cdot S} \\ +L_{max} &= 2^{EV_{100}} \times 1.2 +\end{align*}$$ + +Listing [fragmentExposure] shows how the exposure term can be applied directly to the pixel color computed in a fragment shader. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Computes the camera's EV100 from exposure settings +// aperture in f-stops +// shutterSpeed in seconds +// sensitivity in ISO +float exposureSettings(float aperture, float shutterSpeed, float sensitivity) { + return log2((aperture * aperture) / shutterSpeed * 100.0 / sensitivity); +} + +// Computes the exposure normalization factor from +// the camera's EV100 +float exposure(float ev100) { + return 1.0 / (pow(2.0, ev100) * 1.2); +} + +float ev100 = exposureSettings(aperture, shutterSpeed, sensitivity); +float exposure = exposure(ev100); + +vec4 color = evaluateLighting(); +color.rgb *= exposure; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [fragmentExposure]: Implementation of exposure in GLSL] + +In practice the exposure factor can be pre-computed on the CPU to save shader instructions. + +[^lensAttenuation]: See *Film Speed, Measurements and calculations* on Wikipedia (https://en.wikipedia.org/wiki/Film_speed) + +### Automatic exposure + +The process described above relies on artists setting the camera exposure settings manually. This can prove cumbersome in practice since camera movements and/or dynamic effects can greatly affect the scene's luminance. Since we know how to compute the exposure value from a given luminance (see section [Exposure value and luminance]), we can transform our camera into a spot meter. To do so, we need to measure the scene's luminance. + +There are two common techniques used to measure the scene's luminance: + +- **Luminance downsampling**, by downsampling the previous frame successively until obtaining a 1x1 log luminance buffer that can be read on the CPU (this could also be achieved using a compute shader). The result is the average log luminance of the scene. The first downsampling must extract the luminance of each pixel first. This technique can be unstable and its output should be smoothed over time. +- **Using a luminance histogram**, to find the average log luminance. This technique has an advantage over the previous one as it allows to ignore extreme values and offers more stable results. + +Note that both methods will find the average luminance after multiplication by the albedo. This is not entirely correct but the alternative is to keep a luminance buffer that contains the luminance of each pixel before multiplication by the surface albedo. This is expensive both computationally and memory-wise. + +These two techniques also limit the metering system to average metering, where each pixel has the same influence (or weight) over the final exposure. Cameras typically offer 3 modes of metering: + +Spot metering +: In which only a small circle in the center of the image contributes to the final exposure. That circle is usually 1 to 5% of the total image size. + +Center-weighted metering +: Gives more influence to scene luminance values located in the center of the screen. + +Multi-zone or matrix metering +: A metering mode that differs for each manufacturer. The goal of this mode is to prioritize exposure for the most important parts of the scene. This is often achieved by splitting the image into a grid and by classifying each cell (using focus information, min/max luminance, etc.). Advanced implementations attempt to compare the scene to a known dataset to achieve proper exposure (backlit sunset, overcast snowy day, etc.). + +#### Spot metering + +The weight $w$ of each luminance value to use when computing the scene luminance is given by equation $ \ref{spotMetering} $. + +$$\begin{equation}\label{spotMetering} +w(x,y) = \begin{cases} 1 & \left| p_{x,y} - s_{x,y} \right| \le s_r \\ 0 & \left| p_{x,y} - s_{x,y} \right| \gt s_r \end{cases} +\end{equation}$$ + +Where $p$ is the position of the pixel, $s$ the center of the spot and $ s_r $ the radius of the spot. + +#### Center-weighted metering + +$$\begin{equation}\label{centerMetering} +w(x,y) = smooth(\left| p_{x,y} - c \right| \times \frac{2}{width} ) +\end{equation}$$ + +Where $c$ is the center of the time and $ smooth() $ a smoothing function such as GLSL's `smoothstep()`. + +#### Adaptation + +To smooth the result of the metering, we can use equation $ \ref{adaptation} $, an exponential feedback loop as described by Pattanaik et al. in [Pattanaik00]. + +$$\begin{equation}\label{adaptation} +L_{avg} = L_{avg} + (L - L_{avg}) \times (1 - e^{-\Delta t \cdot \tau}) +\end{equation}$$ + +Where $ \Delta t $ is the delta time from the previous frame and $\tau$ a constant that controls the adaptation rate. + +### Bloom + +Because the EV scale is almost perceptually linear, the exposure value is also often used as a light unit. This means we could let artists specify the intensity of lights or emissive surfaces using exposure compensation as a unit. The intensity of emitted light would therefore be relative to the exposure settings. Using exposure compensation as a light unit should be avoided whenever possible but can be useful to force (or cancel) a bloom effect around emissive surfaces independently of the camera settings (for instance, a lightsaber in a game should always bloom). + +![Figure [bloom]: Saturated photosites on a sensor create a blooming effect in the bright parts of the scene](images/screenshot_bloom.jpg) + +With $c$ the bloom color and $ EV_{100} $ the current exposure value, we can easily compute the luminance of the bloom value as show in equation $ \ref{bloomEV} $. + +$$\begin{equation}\label{bloomEV} +EV_{bloom} = EV_{100} + EC \\ +L_{bloom} = c \times 2^{EV_{bloom} - 3} +\end{equation}$$ + +Equation $ \ref{bloomEV} $ can be used in a fragment shader to implement emissive blooms, as shown in listing [fragmentEmissive]. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +vec4 surfaceShading() { + vec4 color = evaluateLights(); + // rgb = color, w = exposure compensation + vec4 emissive = getEmissive(); + color.rgb += emissive.rgb * pow(2.0, ev100 + emissive.w - 3.0); + color.rgb *= exposure; + return color; +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [fragmentEmissive]: Implementation of emissive bloom in GLSL] + +## Optics post-processing + +### Color fringing + +[TODO] + +![Figure [fringing]: Example of color fringing: look at the ear on the left or the chin at the bottom.](images/screenshot_fringing.jpg) + +### Lens flares + +[TODO] Notes: there is a physically based approach to generating lens flares, by tracing rays through the optical assembly of the lens, but we are going to use an image-based approach. This approach is cheaper and has a few welcome benefits such as free emitters occlusion and unlimited light sources support. + +## Filmic post-processing + +[TODO] Perform post-processing on the scene referred data (linear space, before tone-mapping) as much as possible + +It is important to provide color correction tools to give artists greater artistic control over the final image. These tools are found in every photo or video processing application, such as Adobe Photoshop or Adobe After Effects. + +### Contrast + +### Curves + +### Levels + +### Color grading + +## Light path + +The light path, or rendering method, used by the engine can have serious performance implications and may impose strong limitations on how many lights can be used in a scene. There are traditionally two different rendering methods used by 3D engines forward and deferred rendering. + +Our goal is to use a rendering method that obeys the following constraints: + +- Low bandwidth requirements +- Multiple dynamic lights per pixel + +Additionally, we would like to easily support: + +- MSAA +- Transparency +- Multiple material models + +Deferred rendering is used by many modern 3D rendering engines to easily support dozens, hundreds or even thousands of light source (amongst other benefits). This method is unfortunately very expensive in terms of bandwidth. With our default PBR material model, our G-buffer would use between 160 and 192 bits per pixel, which would translate directly to rather high bandwidth requirements. + +Forward rendering methods on the other hand have historically been bad at handling multiple lights. A common implementation is to render the scene multiple times, once per visible light, and to blend (add) the results. Another technique consists in assigning a fixed maximum of lights to each object in the scene. This is however impractical when objects occupy a vast amount of space in the world (building, road, etc.). + +Tiled shading can be applied to both forward and deferred rendering methods. The idea is to split the screen in a grid of tiles and for each tile, find the list of lights that affect the pixels within that tile. This has the advantage of reducing overdraw (in deferred rendering) and shading computations of large objects (in forward rendering). This technique suffers however from depth discontinuities issues that can lead to large amounts of extraneous work. + +The scene displayed in figure [sponza] was rendered using clustered forward rendering. + +![Figure [sponza]: Clustered forward rendering with dozens of dynamic lights and MSAA](images/screenshot_sponza.jpg) + +Figure [sponzaTiles] shows the same scene split in tiles (in this case, a 1280x720 render target with 80x80px tiles). + +![Figure [sponzaTiles]: Tiled shading (16x9 tiles)](images/screenshot_sponza_tiles.jpg) + +### Clustered Forward Rendering + +We decided to explore another method called Clustered Shading, in its forward variant. Clustered shading expands on the idea of tiled rendering but adds a segmentation on the 3rd axis. The “clustering” is done in view space, by splitting the frustum into a 3D grid. + +The frustum is first sliced on the depth axis as show in figure [sponzaSlices]. + +![Figure [sponzaSlices]: Depth slicing (16 slices)](images/screenshot_sponza_slices.jpg) + +And the depth slices are then combined with the screen tiles to "voxelize" the frustum. We call each cluster a froxel as it makes it clear what they represent (a voxel in frustum space). The result of the "froxelization" pass is shown in figure [froxel1] and figure [froxel2]. + +![Figure [froxel1]: Frustum voxelization (5x3 tiles, 8 depth slices)](images/screenshot_sponza_froxels1.jpg) + +![Figure [froxel2]: Frustum voxelization (5x3 tiles, 8 depth slices)](images/screenshot_sponza_froxels2.jpg) + +Before rendering a frame, each light in the scene is assigned to any froxel it intersects with. The result of the lights assignment pass is a list of lights for each froxel. During the rendering pass, we can compute the ID of the froxel a fragment belongs to and therefore the list of lights that can affect that fragment. + +The depth slicing is not linear, but exponential. In a typical scene, there will be more pixels close to the near plane than to the far plane. An exponential grid of froxels will therefore improve the assignment of lights where it matters the most. + +Figure [froxelDistribution] shows how much world space unit each depth slice uses with exponential slicing. + +![Figure [froxelDistribution]: Near: 0.1m, Far: 100m, 16 slices](images/diagram_froxels1.png) + +A simple exponential voxelization is unfortunately not enough. The graphic above clearly illustrates how world space is distributed across slices but it fails to show what happens close to the near plane. If we examine the same distribution in a smaller range (0.1m to 7m) we can see an interesting problem appear as shown in figure [froxelDistributionClose]. + +![Figure [froxelDistributionClose]: Depth distribution in the 0.1-7m range](images/diagram_froxels2.png) + +This graphic shows that a simple exponential distribution uses up half of the slices very close to the camera. In this particular case, we use 8 slices out of 16in the first 5 meters. Since dynamic world lights are either point lights (spheres) or spot lights (cones), such a fine resolution is completely unnecessary so close to the near plane. + +Our solution is to manually tweak the size of the first froxel depending on the scene and the near and far planes. By doing so, we can better distribute the remaining froxels across the frustum. Figure [froxelDistributionExp] shows for instance what happens when we use a special froxel between 0.1m and 5m. + +![Figure [froxelDistributionExp]: Near: 0.1, Far: 100m, 16 slices, Special froxel: 0.1-5m](images/diagram_froxels3.png) + +This new distribution is much more efficient and allows a better assignment of the lights throughout the entire frustum. + +### Implementation notes + +Lights assignment can be done in two different ways, on the GPU or on the CPU. + +#### GPU lights assignment + +This implementation requires OpenGL ES 3.1 and support for compute shaders. The lights are stored in Shader Storage Buffer Objects (SSBO) and passed to a compute shader that assigns each light to the corresponding froxels. + +The frustum voxelization can be executed only once by a first compute shader (as long as the projection matrix does not change), and the lights assignment can be performed each frame by another compute shader. + +The threading model of compute shaders is particularly well suited for this task. We simply invoke as many workgroups as we have froxels (we can directly map the X, Y and Z workgroup counts to our froxel grid resolution). Each workground will in turn be threaded and traverse all the lights to assign. + +Intersection tests imply simple sphere/frustum or cone/frustum tests. + +See the annex for the source code of a GPU implementation (point lights only). + +#### CPU lights assignment + +On non-OpenGL ES 3.1 devices, lights assignment can be performed efficiently on the CPU. The algorithm is different from the GPU implementation. Instead of iterating over every light for each froxel, the engine will “rasterize” each light as froxels. For instance, given a point light’s center and radius, it is trivial to compute the list of froxels it intersects with. + +This technique has the added benefit of providing tighter culling than in the GPU variant. The CPU implementation can also more easily generate a packed list of lights. + +#### Shading + +The list of lights per froxel can be passed to the fragment shader either as an SSBO (OpenGL ES 3.1) or a texture. + +#### From depth to froxel + +Given a near plane $n$, a far plane $f$, a maximum number of depth slices $m$ and a linear depth value $z$ in the range [0..1], equation $\ref{zToCluster}$ can be used to compute the index of the cluster for a given position. + +$$\begin{equation}\label{zToCluster} +zToCluster(z,n,f,m)=floor \left( max \left( log2(z) \frac{m}{-log2(\frac{n}{f})} + m, 0 \right) \right) +\end{equation}$$ + +This formula suffers however from the resolution issue mentioned previously. We can fix it by introducing $sn$, a special near value that defines the extent of the first froxel (the first froxel occupies the range [n..sn], the remaining froxels [sn..f]). + +$$\begin{equation}\label{zToClusterFix} +zToCluster(z,n,sn,f,m)=floor \left( max \left( log2(z) \frac{m-1}{-log2(\frac{sn}{f})} + m, 0 \right) \right) +\end{equation}$$ + +Equation $\ref{linearZ}$ can be used to compute a linear depth value from `gl_FragCoord.z` (assuming a standard OpenGL projection matrix). + +$$\begin{equation}\label{linearZ} +linearZ(z)=\frac{n}{f+z(n-f)} +\end{equation}$$ + +This equation can be simplified by pre-computing two terms $c0$ and $c1$, as shown in equation $\ref{linearZFix}$. + +$$\begin{equation}\label{linearZFix} +c1 = \frac{f}{n} \\ +c0 = 1 - c1 \\ +linearZ(z)=\frac{1}{z \cdot c0 + c1} +\end{equation}$$ + +This simplification is important because we pass the linear z value to a `log2` in $\ref{zToClusterFix}$. Since the division becomes a negation under a logarithmic, we can avoid a division by using $-log2(z \cdot c0 + c1)$ instead. + +All put together, computing the froxel index of a given fragment can be implemented fairly easily as shown in listing [fragCoordToFroxel]. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#define MAX_LIGHT_COUNT 16 // max number of lights per froxel + +uniform uvec4 froxels; // res x, res y, count y, count y +uniform vec4 zParams; // c0, c1, index scale, index bias + +uint getDepthSlice() { + return uint(max(0.0, log2(zParams.x * gl_FragCoord.z + zParams.y) * + zParams.z + zParams.w)); +} + +uint getFroxelOffset(uint depthSlice) { + uvec2 froxelCoord = uvec2(gl_FragCoord.xy) / froxels.xy; + froxelCoord.y = (froxels.w - 1u) - froxelCoord.y; + + uint index = froxelCoord.x + froxelCoord.y * froxels.z + + depthSlice * froxels.z * froxels.w; + return index * MAX_FROXEL_LIGHT_COUNT; +} + +uint slice = getDepthSlice(); +uint offset = getFroxelOffset(slice); + +// Compute lighting... +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [fragCoordToFroxel]: GLSL implementation to compute a froxel index from a fragment's screen coordinates] + +Several uniforms must be pre-computed for perform the index evaluation efficiently. The code used to pre-compute these uniforms can be found in listing [froxelIndexPrecomputation]. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +froxels[0] = TILE_RESOLUTION_IN_PX; +froxels[1] = TILE_RESOLUTION_IN_PX; +froxels[2] = numberOfTilesInX; +froxels[3] = numberOfTilesInY; + +zParams[0] = 1.0f - Z_FAR / Z_NEAR; +zParams[1] = Z_FAR / Z_NEAR; +zParams[2] = (MAX_DEPTH_SLICES - 1) / log2(Z_SPECIAL_NEAR / Z_FAR); +zParams[3] = MAX_DEPTH_SLICES; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [froxelIndexPrecomputation]] + +#### From froxel to depth + +Given a froxel index $i$, a special near plane $sn$, a far plane $f$ and a maximum number of depth slices $m$, equation $\ref{clusterToZ}$ computes the minimum depth of a given froxel. + +$$\begin{equation}\label{clusterToZ} +clusterToZ(i \ge 1,sn,f,m)=2^{(i-m) \frac{-log2(\frac{sn}{f})}{m-1}} +\end{equation}$$ + +For $i=0$, the z value is 0. The result of this equation is in the [0..1] range and should be multiplied by $f$ to get a distance in world units. + +The compute shader implementation should use `exp2` instead of a `pow`. The division can be precomputed and passed as a uniform. + +## Validation + +Given the complexity of our lighting system, it is important to validate our implementation. We will do so in several ways: using reference renderings, light measurements and data visualization. + +[TODO] Explain light measurement validation (reading EV from the render target and comparing against values measure with light meters/cameras, etc.) + +### Scene referred visualization + +A quick and easy way to validate a scene's lighting is to modify the shader to output colors that provide an intuitive mapping to relevant data. This can easily be done by using a custom debug tone-mapping operator that outputs fake colors. + +#### Luminance stops + +With emissive materials and IBLs, it is fairly easy to obtain a scene in which specular highlights are brighter than their apparent caster. This type of issue can be difficult to observe after tone-mapping and quantization but is fairly obvious in the scene-referred space. Figure [luminanceViz] shows how the custom operator described in listing [tonemapLuminanceViz] is used to show the exposed luminance of a scene. + +![Figure [luminanceViz]: Visualizing luminance by color coding the stops: cyan is middle gray, blue is 1 stop darker, green 1 stop brighter, etc.](images/screenshot_luminance_debug.png) + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +vec3 Tonemap_DisplayRange(const vec3 x) { + // The 5th color in the array (cyan) represents middle gray (18%) + // Every stop above or below middle gray causes a color shift + float v = log2(luminance(x) / 0.18); + v = clamp(v + 5.0, 0.0, 15.0); + int index = int(floor(v)); + return mix(debugColors[index], debugColors[min(15, index + 1)], fract(v)); +} + +const vec3 debugColors[16] = vec3[]( + vec3(0.0, 0.0, 0.0), // black + vec3(0.0, 0.0, 0.1647), // darkest blue + vec3(0.0, 0.0, 0.3647), // darker blue + vec3(0.0, 0.0, 0.6647), // dark blue + vec3(0.0, 0.0, 0.9647), // blue + vec3(0.0, 0.9255, 0.9255), // cyan + vec3(0.0, 0.5647, 0.0), // dark green + vec3(0.0, 0.7843, 0.0), // green + vec3(1.0, 1.0, 0.0), // yellow + vec3(0.90588, 0.75294, 0.0), // yellow-orange + vec3(1.0, 0.5647, 0.0), // orange + vec3(1.0, 0.0, 0.0), // bright red + vec3(0.8392, 0.0, 0.0), // red + vec3(1.0, 0.0, 1.0), // magenta + vec3(0.6, 0.3333, 0.7882), // purple + vec3(1.0, 1.0, 1.0) // white +); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [tonemapLuminanceViz]: GLSL implementation of a custom debug tone-mapping operator for luminance visualization] + +### Reference renderings + +To validate our implementation against reference renderings, we will use a commercial-grade Open Source physically based offline path tracer called Mitsuba. Mitsuba offers many different integrators, samplers and material models, which should allow us to provide fair comparisons with our real-time renderer. This path tracer also relies on a simple XML scene description format that should be easy to automatically generate from our own scene descriptions. + +Figure [mitsubaReference] and figure [filamentReference] show a simple scene, a perfectly smooth dielectric sphere, rendered respectively with Mitsuba and Filament. + +![Figure [mitsubaReference]: Rendered in 2048x1440 in 1 minute and 42 seconds on a 12 core 2013 MacPro](images/screenshot_ref_mitsuba.jpg) + +![Figure [filamentReference]: Rendered in 2048x1440 with MSAA 4x at 60 fps on a Nexus 9 device (Tegra K1 GPU)](images/screenshot_ref_filament.jpg) + +The parameters used to render both scenes are the following: + +**Filament** + +- Material + - Base color: sRGB 0.81, 0, 0 + - Metallic: 0 + - Roughness: 0 + - Reflectance: 0.5 +- Indirect light: IBL + - 256x256 cubemap generated by cmgen from office.exr + - Multiplier: 35,000 +- Direct light: directional light + - Linear color: 1.0, 0.96, 0.95 + - Intensity: 120,000 lux +- Exposure + - Aperture: f/16 + - Shutter speed: 1/125s + - ISO: 100 + +**Mitsuba** + +- BSDF: roughplastic + - Distribution: GGX + - Alpha: 0 + - Diffuse reflectance: sRGB 0.81, 0, 0 +- Emitter: environment map + - Source: office.exr + - Scale: 35,000 +- Emitter: directional + - Irradiance: linear RGB 120,000 115,200 114,000 +- Film: LDR + - Exposure: -15.23, computed from log2(filamentExposure) +- Integrator: path +- Sampler: ldsampler + - Sample count: 256 + +The full Mitsuba scene can be found as an annex. Both scenes were rendered at the same resolution (2048x1440). + +#### Comparison + +The slight differences between the two renderings come from the various approximations used by Filament: RGBM 256x256 reflection probe, RGBM 1024x1024 background map, Lambert diffuse, split-sum approximation, analytical approximation of the DFG term, etc. + +Figure [referenceComparison] shows the luminance gradient of the images produced by both engines. The comparison was performed on LDR images. + +![Figure [referenceComparison]: Luminance gradients from Mitsuba (left) and Filament (right)](images/screenshot_ref_comparison.png) + +The biggest difference is visible at grazing angles, which is most likely explained by Filament's use of a Lambertian diffuse term. The Disney diffuse term and its grazing retro-reflections would move Filament closer to Mitsuba. + +## Coordinates systems + +### World coordinates system + +Filament uses a Y-up, right-handed coordinate system. + +![Figure [coordinates]: Red +X, green +Y, blue +Z (rendered in Marmoset Toolbag).](images/screenshot_coordinates.jpg) + + +### Camera coordinates system + +Filament's Camera looks towards its local -Z axis. That is, when placing a camera in the world +without any transform applied to it, the camera looks down the world's -Z axis. + + +### Cubemaps coordinates system + +All cubemaps used in Filament follow the OpenGL convention for face +alignment shown in figure [cubemapCoordinates]. + +![Figure [cubemapCoordinates]: Horizontal cross representation of a cubemap following the OpenGL faces alignment convention.](images/screenshot_cubemap_coordinates.png) + +Note that environment background and reflection probes are mirrored (see section [Mirroring]). + + +#### Mirroring + +To simplify the rendering of reflections, IBL cubemaps are stored mirrored on the X axis. This is +the default behaviour of the `cmgen` tool. This means that an IBL cubemap used as environment +background needs to be mirrored again at runtime. +An easy way to achieve this for skyboxes is to use textured back faces. Filament does +this by default. + + +#### Equirectangular environment maps + +To convert equirectangular environment maps to horizontal/vertical cross cubemaps we position the ++Z face in the center of the source rectilinear environment map. + + +#### World space orientation of environment maps and Skyboxes + +When specifying a skybox or an IBL in Filament, the specified cubemap is oriented such that its +-Z face points towards the +Z axis of the world (this is because filament assumes mirrored cubemaps, +see section [Mirroring]). However, because environments and skyboxes are expected to be pre-mirrored, +their -Z (back) face points towards the world's -Z axis as expected (and the camera looks toward that +direction by default, see section [Camera coordinates system]). + + +# Annex + +## Specular color + +The specular color of a metallic surface, or $\fNormal$, can be computed directly from measured spectral data. Online databases such as [Refractive Index](https://refractiveindex.info/?shelf=3d&book=metals&page=brass) provide tables of complex IOR measured at different wavelengths for various materials. + +Earlier in this document, we presented equation $\ref{fresnelEquation}$ to compute the Fresnel reflectance at normal incidence for a dielectric surface given its IOR. The same equation can be rewritten for conductors by using complex numbers to represent the surface's IOR: + +$$\begin{equation} +c_{ior} = n_{ior} + ik +\end{equation}$$ + +Equation $\ref{fresnelComplexIOR}$ presents the resulting Fresnel formula, where $c^*$ is the conjugate of the complex number $c$: + +$$\begin{equation}\label{fresnelComplexIOR} +\fNormal(c_{ior}) = \frac{(c_{ior} - 1)(c_{ior}^* - 1)}{(c_{ior} + 1)(c_{ior}^* + 1)} +\end{equation}$$ + +To compute the specular color of a material we need to evaluate the complex Fresnel equation at each spectral sample of complex IOR over the visible spectrum. For each spectral sample, we obtain a spectral reflectance sample. To find the RGB color at normal incidence, we must multiply each sample by the CIE XYZ CMFs (color matching functions) and the spectral power distribution of the desired illuminant. We choose the standard illuminant D65 because we want to compute a color in the sRGB color space. + +We then sum (integrate) and normalize all the samples to obtain $\fNormal$ in the XYZ color space. From there, a simple color space conversion yields a linear sRGB color or a non-linear sRGB color after applying the opto-electronic transfer function (OETF, commonly known as "gamma" curve). Note that for some materials such as gold the final sRGB color might fall out of gamut. We use a simple normalization step as a cheap form of gamut remapping but it would be interesting to consider computing values in a color space with a wider gamut (for instance BT.2020). + +To achieve the desired result we used the ICE 1931 2 degrees CMFs, from 360nm to 830nm at 1nm intervals ([source](http://cvrl.ioo.ucl.ac.uk/cmfs.htm)), and the CIE Standard Illuminant D65 relative spectral power distribution, from 300nm to 830nm, at 5nm intervals ([source](http://files.cie.co.at/204.xls)). + +Our implementation is presented in listing [specularColorImpl], with the actual data omitted for brevity. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// CIE 1931 2-deg color matching functions (CMFs), from 360nm to 830nm, +// at 1nm intervals +// +// Data source: +// http://cvrl.ioo.ucl.ac.uk/cmfs.htm +// http://cvrl.ioo.ucl.ac.uk/database/text/cmfs/ciexyz31.htm +const size_t CIE_XYZ_START = 360; +const size_t CIE_XYZ_COUNT = 471; +const float3 CIE_XYZ[CIE_XYZ_COUNT] = { ... }; + +// CIE Standard Illuminant D65 relative spectral power distribution, +// from 300nm to 830, at 5nm intervals +// +// Data source: +// https://en.wikipedia.org/wiki/Illuminant_D65 +// https://cielab.xyz/pdf/CIE_sel_colorimetric_tables.xls +const size_t CIE_D65_INTERVAL = 5; +const size_t CIE_D65_START = 300; +const size_t CIE_D65_END = 830; +const size_t CIE_D65_COUNT = 107; +const float CIE_D65[CIE_D65_COUNT] = { ... }; + +struct Sample { + float w = 0.0f; // wavelength + std::complex ior; // complex IOR, n + ik +}; + +static float illuminantD65(float w) { + auto i0 = size_t((w - CIE_D65_START) / CIE_D65_INTERVAL); + uint2 indexBounds{i0, std::min(i0 + 1, CIE_D65_END)}; + + float2 wavelengthBounds = CIE_D65_START + float2{indexBounds} * CIE_D65_INTERVAL; + float t = (w - wavelengthBounds.x) / (wavelengthBounds.y - wavelengthBounds.x); + return lerp(CIE_D65[indexBounds.x], CIE_D65[indexBounds.y], t); +} + +// For std::lower_bound +bool operator<(const Sample& lhs, const Sample& rhs) { + return lhs.w < rhs.w; +} + +// The wavelength w must be between 360nm and 830nm +static std::complex findSample(const std::vector& samples, float w) { + auto i1 = std::lower_bound( + samples.begin(), samples.end(), Sample{w, 0.0f + 0.0if}); + auto i0 = i1 - 1; + + // Interpolate the complex IORs + float t = (w - i0->w) / (i1->w - i0->w); + float n = lerp(i0->ior.real(), i1->ior.real(), t); + float k = lerp(i0->ior.imag(), i1->ior.imag(), t); + return { n, k }; +} + +static float fresnel(const std::complex& sample) { + return (((sample - (1.0f + 0if)) * (std::conj(sample) - (1.0f + 0if))) / + ((sample + (1.0f + 0if)) * (std::conj(sample) + (1.0f + 0if)))).real(); +} + +static float3 XYZ_to_sRGB(const float3& v) { + const mat3f XYZ_sRGB{ + 3.2404542f, -0.9692660f, 0.0556434f, + -1.5371385f, 1.8760108f, -0.2040259f, + -0.4985314f, 0.0415560f, 1.0572252f + }; + return XYZ_sRGB * v; +} + +// Outputs a linear sRGB color +static float3 computeColor(const std::vector& samples) { + float3 xyz{0.0f}; + float y = 0.0f; + + for (size_t i = 0; i < CIE_XYZ_COUNT; i++) { + // Current wavelength + float w = CIE_XYZ_START + i; + + // Find most appropriate CIE XYZ sample for the wavelength + auto sample = findSample(samples, w); + // Compute Fresnel reflectance at normal incidence + float f0 = fresnel(sample); + + // We need to multiply by the spectral power distribution of the illuminant + float d65 = illuminantD65(w); + + xyz += f0 * CIE_XYZ[i] * d65; + y += CIE_XYZ[i].y * d65; + } + + // Normalize so that 100% reflectance at every wavelength yields Y=1 + xyz /= y; + + float3 linear = XYZ_to_sRGB(xyz); + + // Normalize out-of-gamut values + if (any(greaterThan(linear, float3{1.0f}))) linear *= 1.0f / max(linear); + + return linear; +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [specularColorImpl]: C++ implementation to compute the base color of a metallic surface from spectral data] + +Special thanks to Naty Hoffman for his valuable help on this topic. + +## Importance sampling for the IBL + +In the discrete domain, the integral can be approximated with sampling as defined in equation $\ref{iblSampling}$. + +$$\begin{equation}\label{iblSampling} +\Lout(n,v,\Theta) \equiv \frac{1}{N} \sum_{i}^{N} f(l_{i}^{uniform},v,\Theta) L_{\perp}(l_i) \left< n \cdot l_i^{uniform} \right> +\end{equation}$$ + +Unfortunately, we would need too many samples to evaluate this integral. A technique commonly used +is to choose samples that are more "important" more often, this is called _importance sampling_. +In our case we'll use the distribution of micro-facets normals, $D_{ggx}$, as the distribution of +important samples. + +The evaluation of $ \Lout(n,v,\Theta) $ with importance sampling is presented in equation $\ref{annexIblImportanceSampling}$. + +$$\begin{equation}\label{annexIblImportanceSampling} +\Lout(n,v,\Theta) \equiv \frac{1}{N} \sum_{i}^{N} \frac{f(l_{i},v,\Theta)}{p(l_i,v,\Theta)} L_{\perp}(l_i) \left< n \cdot l_i \right> +\end{equation}$$ + +In equation $\ref{annexIblImportanceSampling}$, $p$ is the probability density function (PDF) of the +distribution of _important direction samples_ $l_i$. These samples depend on $h_i$, $v$ and $\alpha$. +The definition of the PDF is shown in equation $\ref{iblPDF}$. + +$h_i$ is given by the distribution we chose, see section [Choosing important directions] for more details. + +The _important direction samples_ $l_i$ are calculated as the reflection of $v$ around $h_i$, and therefore +**do not** have the same PDF as $h_i$. The PDF of a transformed distribution is given by: + +$$\begin{equation} +p(T_r(x)) = p(x) |J(T_r)|^{-1} +\end{equation}$$ + +Where $|J(T_r)|$ is the determinant of the Jacobian of the transform. In our case we're considering +the transform from $h_i$ to $l_i$ and the determinant of its Jacobian is given in \ref{iblPDF}. + +$$\begin{equation}\label{iblPDF} +p(l,v,\Theta) = D(h,\alpha) \left< \NoH \right> |J_{h \rightarrow l}|^{-1} \\ +|J_{h \rightarrow l}| = 4 \left< \VoH \right> +\end{equation}$$ + +### Choosing important directions + +Refer to section [Choosing important directions for sampling the BRDF] for more details. Given a uniform distribution $(\zeta_{\phi},\zeta_{\theta})$ the important direction $l$ is defined by equation $\ref{importantDirection}$. + +$$\begin{equation}\label{importantDirection} +\phi = 2 \pi \zeta_{\phi} \\ +\theta = cos^{-1} \sqrt{\frac{1 - \zeta_{\theta}}{(\alpha^2 - 1)\zeta_{\theta}+1}} \\ +l = \{ cos \phi sin \theta, sin \phi sin \theta, cos \theta \} +\end{equation}$$ + +Typically, $ (\zeta_{\phi},\zeta_{\theta}) $ are chosen using the Hammersley uniform distribution algorithm described in section [Hammersley sequence]. + +### Pre-filtered importance sampling + +Importance sampling considers only the PDF to generate important directions; in particular, it is oblivious to the actual content of the IBL. If the latter contains high frequencies in areas without a lot of samples, the integration won’t be accurate. This can be somewhat mitigated by using a technique called _pre-filtered importance sampling_, in addition this allows the integral to converge with many fewer samples. + +Pre-filtered importance sampling uses several images of the environment increasingly low-pass filtered. This is typically implemented very efficiently with mipmaps and a box filter. The LOD is selected based on the sample importance, that is, low probability samples use a higher LOD index (more filtered). + +This technique is described in details in [#Krivanek08]. + +The cubemap LOD is determined in the following way: + +$$\begin{align*} +lod &= log_4 \left( K\frac{\Omega_s}{\Omega_p} \right) \\ +K &= 4.0 \\ +\Omega_s &= \frac{1}{N \cdot p(l_i)} \\ +\Omega_p &\approx \frac{4\pi}{6 \cdot width \cdot height} +\end{align*}$$ + +Where $K$ is a constant determined empirically, $p$ the PDF of the BRDF, $ \Omega_{s} $ the solid angle associated to the sample and $\Omega_p$ the solid angle associated with the texel in the cubemap. + +Cubemap sampling is done using seamless trilinear filtering. It is extremely important to sample the cubemap correctly across faces using OpenGL's seamless sampling feature or any other technique that avoids/reduces seams. + +Table [importanceSamplingViz] shows a comparison between importance sampling and pre-filtered importance sampling when applied to figure [importanceSamplingRef]. + +![Figure [importanceSamplingRef]: Importance sampling image reference](images/image_is_original.png) + + + Samples | Importance sampling | Pre-filtered importance sampling +---------|-------------------------------|--------------------------------------- + 4096 | ![](images/image_is_4096.png) |   + 1024 | ![](images/image_is_1024.png) | ![](images/image_fis_1024.png) + 32 | ![](images/image_is_32.png) | ![](images/image_fis_32.png) +[Table [importanceSamplingViz]: Importance sampling vs pre-filtered importance sampling with $\alpha = 0.4$] + +The reference renderer used in the comparison below performs no approximation. In particular, it does not assume $v = n$ and does not perform the split sum approximation. The pre-filtered renderer uses all the techniques discussed in this section: pre-filtered cubemaps, the analytic formulation of the DFG term, and of course the split sum approximation. + +Left: reference renderer, right: pre-filtered importance sampling. + +![](images/image_is_ref_1.png) ![](images/image_filtered_1.png) +![](images/image_is_ref_2.png) ![](images/image_filtered_2.png) +![](images/image_is_ref_3.png) ![](images/image_filtered_3.png) +![](images/image_is_ref_4.png) ![](images/image_filtered_4.png) + +## Choosing important directions for sampling the BRDF + +For simplicity we use the $ D $ term of the BRDF as the PDF, however the PDF must be normalized such that the integral over the hemisphere is 1: + +$$\begin{equation} +\int_{\Omega}p(m)dm = 1 \\ +\int_{\Omega}D(m)(n \cdot m)dm = 1 \\ +\int_{\phi=0}^{2\pi}\int_{\theta=0}^{\frac{\pi}{2}}D(\theta,\phi) cos \theta sin \theta d\theta d\phi = 1 \\ +\end{equation}$$ + +The PDF of the BRDF can therefore be expressed as in equation $\ref{importantPDF}$: + +$$\begin{equation}\label{importantPDF} +p(\theta,\phi) = \frac{\alpha^2}{\pi(cos^2\theta (\alpha^2-1) + 1)^2} cos\theta sin\theta +\end{equation}$$ + +The term $sin\theta$ comes from the differential solid angle $sin\theta d\phi d\theta$ since we integrate over a sphere. We sample $\theta$ and $\phi$ independently: + +$$\begin{align*} +p(\theta) &= \int_0^{2\pi} p(\theta,\phi) d\phi = \frac{2\alpha^2}{(cos^2\theta (\alpha^2-1) + 1)^2} cos\theta sin\theta \\ +p(\phi) &= \frac{p(\theta,\phi)}{p(\phi)} = \frac{1}{2\pi} +\end{align*}$$ + +The expression of $ p(\phi) $ is true for an isotropic distribution of normals. + +We then calculate the cumulative distribution function (CDF) for each variable: + +$$\begin{align*} +P(s_{\phi}) &= \int_{0}^{s_{\phi}} p(\phi) d\phi = \frac{s_{\phi}}{2\pi} \\ +P(s_{\theta}) &= \int_{0}^{s_{\theta}} p(\theta) d\theta = 2 \alpha^2 \left( \frac{1}{(2\alpha^4-4\alpha^2+2) cos(s_{\theta})^2 + 2\alpha^2 - 2} - \frac{1}{2\alpha^4-2\alpha^2} \right) +\end{align*}$$ + +We set $ P(s_{\phi}) $ and $ P(s_{\theta}) $ to random variables $ \zeta_{\phi} $ and $ \zeta_{\theta} $ and solve for $ s_{\phi} $ and $ s_{\theta} $ respectively: + +$$\begin{align*} +P(s_{\phi}) &= \zeta_{\phi} \rightarrow s_{\phi} = 2\pi\zeta_{\phi} \\ +P(s_{\theta}) &= \zeta_{\theta} \rightarrow s_{\theta} = cos^{-1} \sqrt{\frac{1-\zeta_{\theta}}{(\alpha^2-1)\zeta_{\theta}+1}} +\end{align*}$$ + +So given a uniform distribution $ (\zeta_{\phi},\zeta_{\theta}) $, our important direction $l$ is defined as: + +$$\begin{align*} +\phi &= 2\pi\zeta_{\phi} \\ +\theta &= cos^{-1} \sqrt{\frac{1-\zeta_{\theta}}{(\alpha^2-1)\zeta_{\theta}+1}} \\ +l &= \{ cos\phi sin\theta,sin\phi sin\theta,cos\theta \} +\end{align*}$$ + +## Hammersley sequence + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +vec2f hammersley(uint i, float numSamples) { + uint bits = i; + bits = (bits << 16) | (bits >> 16); + bits = ((bits & 0x55555555) << 1) | ((bits & 0xAAAAAAAA) >> 1); + bits = ((bits & 0x33333333) << 2) | ((bits & 0xCCCCCCCC) >> 2); + bits = ((bits & 0x0F0F0F0F) << 4) | ((bits & 0xF0F0F0F0) >> 4); + bits = ((bits & 0x00FF00FF) << 8) | ((bits & 0xFF00FF00) >> 8); + return vec2f(i / numSamples, bits / exp2(32)); +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[C++ implementation of a Hammersley sequence generator] + +## Precomputing L for image-based lighting + +The term $ L_{DFG} $ is only dependent on $ \NoV $. Below, the normal is arbitrarily set to $ n=\left[0, 0, 1\right] $ and $v$ is chosen to satisfy $ \NoV $. The vector $ h_i $ is the $ D_{GGX}(\alpha) $ important direction sample $i$. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +float GDFG(float NoV, float NoL, float a) { + float a2 = a * a; + float GGXL = NoV * sqrt((-NoL * a2 + NoL) * NoL + a2); + float GGXV = NoL * sqrt((-NoV * a2 + NoV) * NoV + a2); + return (2 * NoL) / (GGXV + GGXL); +} + +float2 DFG(float NoV, float a) { + float3 V; + V.x = sqrt(1.0f - NoV*NoV); + V.y = 0.0f; + V.z = NoV; + + float2 r = 0.0f; + for (uint i = 0; i < sampleCount; i++) { + float2 Xi = hammersley(i, sampleCount); + float3 H = importanceSampleGGX(Xi, a, N); + float3 L = 2.0f * dot(V, H) * H - V; + + float VoH = saturate(dot(V, H)); + float NoL = saturate(L.z); + float NoH = saturate(H.z); + + if (NoL > 0.0f) { + float G = GDFG(NoV, NoL, a); + float Gv = G * VoH / NoH; + float Fc = pow(1 - VoH, 5.0f); + r.x += Gv * (1 - Fc); + r.y += Gv * Fc; + } + } + return r * (1.0f / sampleCount); +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[C++ implementation of the $ L_{DFG} $ term] + +## Spherical Harmonics + + Symbol | Definition +:---------------------------:|:---------------------------| +$K^m_l$ | Normalization factors +$P^m_l(x)$ | Associated Legendre polynomials +$y^m_l$ | Spherical harmonics bases, or SH bases +$L^m_l$ | SH coefficients of the $L(s)$ function defined on the unit sphere +[Table [shSymbols]: Spherical harmonics symbols definitions] + +### Basis functions + +Spherical parameterization of points on the surface of the unit sphere: + +$$\begin{equation} +\{ x, y, z \} = \{ cos \phi sin \theta, sin \phi sin \theta, cos \theta \} +\end{equation}$$ + +The complex spherical harmonics bases are given by: + +$$\begin{equation} +Y^m_l(\theta, \phi) = K^m_l e^{im\theta} P^{|m|}_l(cos \theta), l \in N, -l <= m <= l +\end{equation}$$ + +However we only need the real bases: + +$$\begin{align*} +y^{m > 0}_l &= \sqrt{2} K^m_l cos(m \phi) P^m_l(cos \theta) \\ +y^{m < 0}_l &= \sqrt{2} K^m_l sin(|m| \phi) P^{|m|}_l(cos \theta) \\ +y^0_l &= K^0_l P^0_l(cos \theta) +\end{align*}$$ + +The normalization factors are given by: + +$$\begin{equation} +K^m_l = \sqrt{\frac{(2l + 1)(l - |m|)!}{4 \pi (l + |m|)!}} +\end{equation}$$ + +The associated Legendre polynomials $P^{|m|}_l$ can be calculated from the following recursions: + +$$\begin{equation}\label{shRecursions} +P^0_0(x) = 1 \\ +P^0_1(x) = x \\ +P^l_l(x) = (-1)^l (2l - 1)!! (1 - x^2)^{\frac{l}{2}} \\ +P^m_l(x) = \frac{((2l - 1) x P^m_{l - 1} - (l + m - 1) P^m_{l - 2})}{l - m} \\ +\end{equation}$$ + +Computing $y^{|m|}_l$ requires to compute $P^{|m|}_l(z)$ first. +This can be accomplished fairly easily using the recursions in equation $\ref{shRecursions}$. +The third recursion can be used to "move diagonally" in table [basisFunctions], i.e. calculating $y^0_0$, $y^1_1$, $y^2_2$ etc. +Then, the fourth recursion can be used to move vertically. + + Band index | Basis functions $-l <= m <= l$ +:-----------:|:---------------------------------:| +$l = 0$ | $y^0_0$ +$l = 1$ | $y^{-1}_1$ $y^0_1$ $y^1_1$ +$l = 2$ | $y^{-2}_2$ $y^{-1}_2$ $y^0_2$ $y^1_2$ $y^2_2$ +[Table [basisFunctions]: Basis functions per band] + +It’s also fairly easy to compute the trigonometric terms recursively: + +$$\begin{align*} +C_m &\equiv cos(m \phi)sin(\theta)^m \\ +S_m &\equiv sin(m \phi)sin(\theta)^m \\ +\{ x, y, z \} &= \{ cos \phi sin \theta, sin \phi sin \theta, cos \theta \} +\end{align*}$$ + +Using the angle sum trigonometric identities: + +$$\begin{align*} +cos(m \phi + \phi) &= cos(m \phi) cos(\phi) - sin(m \phi) sin(\phi) \Leftrightarrow C_{m + 1} = x C_m - y S_m \\ +sin(m \phi + \phi) &= sin(m \phi) cos(\phi) + cos(m \phi) sin(\phi) \Leftrightarrow S_{m + 1} = x S_m - y C_m +\end{align*}$$ + + +Listing [nonNormalizedSHBasis] shows the C++ code to compute the non-normalized SH basis $\frac{y^m_l(s)}{\sqrt{2} K^m_l}$: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +static inline size_t SHindex(ssize_t m, size_t l) { + return l * (l + 1) + m; +} + +void computeShBasis( + double* const SHb, + size_t numBands, + const vec3& s) +{ + // handle m=0 separately, since it produces only one coefficient + double Pml_2 = 0; + double Pml_1 = 1; + SHb[0] = Pml_1; + for (ssize_t l = 1; l < numBands; l++) { + double Pml = ((2 * l - 1) * Pml_1 * s.z - (l - 1) * Pml_2) / l; + Pml_2 = Pml_1; + Pml_1 = Pml; + SHb[SHindex(0, l)] = Pml; + } + double Pmm = 1; + for (ssize_t m = 1; m < numBands ; m++) { + Pmm = (1 - 2 * m) * Pmm; + double Pml_2 = Pmm; + double Pml_1 = (2 * m + 1)*Pmm*s.z; + // l == m + SHb[SHindex(-m, m)] = Pml_2; + SHb[SHindex( m, m)] = Pml_2; + if (m + 1 < numBands) { + // l == m+1 + SHb[SHindex(-m, m + 1)] = Pml_1; + SHb[SHindex( m, m + 1)] = Pml_1; + for (ssize_t l = m + 2; l < numBands; l++) { + double Pml = ((2 * l - 1) * Pml_1 * s.z - (l + m - 1) * Pml_2) + / (l - m); + Pml_2 = Pml_1; + Pml_1 = Pml; + SHb[SHindex(-m, l)] = Pml; + SHb[SHindex( m, l)] = Pml; + } + } + } + double Cm = s.x; + double Sm = s.y; + for (ssize_t m = 1; m <= numBands ; m++) { + for (ssize_t l = m; l < numBands ; l++) { + SHb[SHindex(-m, l)] *= Sm; + SHb[SHindex( m, l)] *= Cm; + } + double Cm1 = Cm * s.x - Sm * s.y; + double Sm1 = Sm * s.x + Cm * s.y; + Cm = Cm1; + Sm = Sm1; + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [nonNormalizedSHBasis]: C++ implementation to compute a non-normalized SH basis] + +Normalized SH basis functions $y^m_l(s)$ for the first 3 bands: + + Band | $m = -2$ | $m = -1$ | $m = 0$ | $m = 1$ | $m = 2$ | +:-------:|:------------------------------------:|:-------------------------------------:|:---------------------------------------------------:|:-------------------------------------:|:---------------------------------------------:| +$l = 0$ | | | $\frac{1}{2}\sqrt{\frac{1}{\pi}}$ | | | +$l = 1$ | | $-\frac{1}{2}\sqrt{\frac{3}{\pi}}y$ | $\frac{1}{2}\sqrt{\frac{3}{\pi}}z$ | $-\frac{1}{2}\sqrt{\frac{3}{\pi}}x$ | | +$l = 2$ | $\frac{1}{2}\sqrt{\frac{15}{\pi}}xy$ | $-\frac{1}{2}\sqrt{\frac{15}{\pi}}yz$ | $\frac{1}{4}\sqrt{\frac{5}{\pi}}(2z^2 - x^2 - y^2)$ | $-\frac{1}{2}\sqrt{\frac{15}{\pi}}xz$ | $\frac{1}{4}\sqrt{\frac{15}{\pi}}(x^2 - y^2)$ | +[Table [basisFunctions]: Normalized basis functions per band] + +### Decomposition and reconstruction + +A function $L(s)$ defined on a sphere is projected to the SH basis as follows: + +$$\begin{equation} +L^m_l = \int_\Omega L(s) y^m_l(s) ds \\ +L^m_l = \int_{\theta = 0}^{\pi} \int_{\phi = 0}^{2\pi} L(\theta, \phi) y^m_l(\theta, \phi) sin \theta d\theta d\phi +\end{equation}$$ + +Note that each $L^m_l$ is a vector of 3 values, one for each RGB color channel. + +The inverse transformation, or reconstruction, or rendering, from the SH coefficients is given by: + +$$\begin{equation} +\hat{L}(s) = \sum_l \sum_{m = -l}^l L^m_l y^m_l(s) +\end{equation}$$ + +### Decomposition of $\left< cos \theta \right>$ + +Since $\left< cos \theta \right>$ does not depend on $\phi$ (azimuthal independence), the integral simplifies to: + +$$\begin{align*} +C^0_l &= 2\pi \int_0^{\pi} \left< cos \theta \right> y^0_l(\theta) sin \theta d\theta \\ +C^0_l &= 2\pi K^m_l \int_0^{\frac{\pi}{2}} P^0_l(cos \theta) cos \theta sin \theta d\theta \\ +C^m_l &= 0, m != 0 +\end{align*}$$ + +In [#Ramamoorthi01] an analytical solution to the integral is described: + +$$\begin{align*} +C_1 &= \sqrt{\frac{\pi}{3}} \\ +C_{odd} &= 0 \\ +C_{l, even} &= 2\pi \sqrt{\frac{2l + 1}{4\pi}} \frac{(-1)^{\frac{l}{2} - 1}}{(l + 2)(l - 1)} \frac{l!}{2^l (\frac{l!}{2})^2} +\end{align*}$$ + +The first few coefficients are: + +$$\begin{align*} +C_0 &= +0.88623 \\ +C_1 &= +1.02333 \\ +C_2 &= +0.49542 \\ +C_3 &= +0.00000 \\ +C_4 &= -0.11078 +\end{align*}$$ + +Very few coefficients are needed to reasonably approximate $\left< cos \theta \right>$, as shown in figure [shCosThetaApprox]. + +![Figure [shCosThetaApprox]: Approximation of $cos \theta$ with SH coefficients](images/chart_sh_cos_thera_approx.png) + +### Convolution + +Convolutions by a kernel $h$ that has a circular symmetry can be applied directly and easily in SH space: + +$$\begin{equation} +(h * f)^m_l = \sqrt{\frac{4\pi}{2l + 1}} h^0_l(s) f^m_l(s) +\end{equation}$$ + +Conveniently, $\sqrt{\frac{4\pi}{2l + 1}} = \frac{1}{K^0_l}$, so in practice we pre-multiply $C_l$ by $\frac{1}{K^0_l}$ and we get a simpler expression: + +$$\begin{equation} +\hat{C}_{l, even} = 2\pi \frac{(-1)^{\frac{l}{2} - 1}}{(l + 2)(l - 1)} \frac{l!}{2^l (\frac{l!}{2})^2} \\ +\hat{C}_1 = \frac{2\pi}{3} +\end{equation}$$ + +Here is the C++ code to compute $\hat{C}_l$: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +static double factorial(size_t n, size_t d = 1); + +// < cos(theta) > SH coefficients pre-multiplied by 1 / K(0,l) +double computeTruncatedCosSh(size_t l) { + if (l == 0) { + return M_PI; + } else if (l == 1) { + return 2 * M_PI / 3; + } else if (l & 1) { + return 0; + } + const size_t l_2 = l / 2; + double A0 = ((l_2 & 1) ? 1.0 : -1.0) / ((l + 2) * (l - 1)); + double A1 = factorial(l, l_2) / (factorial(l_2) * (1 << l)); + return 2 * M_PI * A0 * A1; +} + +// returns n! / d! +double factorial(size_t n, size_t d ) { + d = std::max(size_t(1), d); + n = std::max(size_t(1), n); + double r = 1.0; + if (n == d) { + // intentionally left blank + } else if (n > d) { + for ( ; n>d ; n--) { + r *= n; + } + } else { + for ( ; d>n ; d--) { + r *= d; + } + r = 1.0 / r; + } + return r; +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +## Sample validation scene for Mitsuba + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +<scene version="0.5.0"> + <integrator type="path"/> + + <shape type="serialized" id="sphere_mesh"> + <string name="filename" value="plastic_sphere.serialized"/> + <integer name="shapeIndex" value="0"/> + + <bsdf type="roughplastic"> + <string name="distribution" value="ggx"/> + <float name="alpha" value="0.0"/> + <srgb name="diffuseReflectance" value="0.81, 0.0, 0.0"/> + </bsdf> + </shape> + + <emitter type="envmap"> + <string name="filename" value="../../environments/office/office.exr"/> + <float name="scale" value="35000.0" /> + <boolean name="cache" value="false" /> + </emitter> + + <emitter type="directional"> + <vector name="direction" x="-1" y="-1" z="1" /> + <rgb name="irradiance" value="120000.0, 115200.0, 114000.0" /> + </emitter> + + <sensor type="perspective"> + <float name="farClip" value="12.0"/> + <float name="focusDistance" value="4.1"/> + <float name="fov" value="45"/> + <string name="fovAxis" value="y"/> + <float name="nearClip" value="0.01"/> + <transform name="toWorld"> + + <lookat target="0, 0, 0" origin="0, 0, -3.1" up="0, 1, 0"/> + </transform> + + <sampler type="ldsampler"> + <integer name="sampleCount" value="256"/> + </sampler> + + <film type="ldrfilm"> + <integer name="height" value="1440"/> + <integer name="width" value="2048"/> + <float name="exposure" value="-15.23" /> + <rfilter type="gaussian"/> + </film> + </sensor> +</scene> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +## Light assignment with froxels + +Assigning lights to froxels can be implemented on the GPU using two compute shaders. The first one, shown in listing [froxelGeneration], creates the froxels data (4 planes + a min Z and max Z per froxel) in an SSBO and needs to be run only once. The shader requires the following uniforms: + +Projection matrix +: The projection matrix used to render the scene (view space to clip space transformation). + +Inverse projection matrix +: The inverse of the projection matrix used to render the scene (clip space to view space transformation). + +Depth parameters +: $-log2(\frac{z_{lighnear}}{z_{far}}) \frac{1}{maxSlices-1}$, maximum number of depth slices, Z near and Z far. + +Clip space size +: $\frac{F_x \times F_r}{w} \times 2$, with $F_x$ the number of tiles on the X axis, $F_r$ the resolution in pixels of a tile and w the width in pixels of the render target. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#version 310 es + +precision highp float; +precision highp int; + + +#define FROXEL_RESOLUTION 80u + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; + +layout(location = 0) uniform mat4 projectionMatrix; +layout(location = 1) uniform mat4 projectionInverseMatrix; +layout(location = 2) uniform vec4 depthParams; // index scale, index bias, near, far +layout(location = 3) uniform float clipSpaceSize; + +struct Froxel { + // NOTE: the planes should be stored in vec4[4] but the + // Adreno shader compiler has a bug that causes the data + // to not be read properly inside the loop + vec4 plane0; + vec4 plane1; + vec4 plane2; + vec4 plane3; + vec2 minMaxZ; +}; + +layout(binding = 0, std140) writeonly restrict buffer FroxelBuffer { + Froxel data[]; +} froxels; + +shared vec4 corners[4]; +shared vec2 minMaxZ; + +vec4 projectionToView(vec4 p) { + p = projectionInverseMatrix * p; + return p / p.w; +} + +vec4 createPlane(vec4 b, vec4 c) { + // standard plane equation, with a at (0, 0, 0) + return vec4(normalize(cross(c.xyz, b.xyz)), 1.0); +} + +void main() { + uint index = gl_WorkGroupID.x + gl_WorkGroupID.y * gl_NumWorkGroups.x + + gl_WorkGroupID.z * gl_NumWorkGroups.x * gl_NumWorkGroups.y; + + if (gl_LocalInvocationIndex == 0u) { + // first tile the screen and build the frustum for the current tile + vec2 renderTargetSize = vec2(FROXEL_RESOLUTION * gl_NumWorkGroups.xy); + vec2 frustumMin = vec2(FROXEL_RESOLUTION * gl_WorkGroupID.xy); + vec2 frustumMax = vec2(FROXEL_RESOLUTION * (gl_WorkGroupID.xy + 1u)); + + corners[0] = vec4( + frustumMin.x / renderTargetSize.x * clipSpaceSize - 1.0, + (renderTargetSize.y - frustumMin.y) / renderTargetSize.y + * clipSpaceSize - 1.0, + 1.0, + 1.0 + ); + corners[1] = vec4( + frustumMax.x / renderTargetSize.x * clipSpaceSize - 1.0, + (renderTargetSize.y - frustumMin.y) / renderTargetSize.y + * clipSpaceSize - 1.0, + 1.0, + 1.0 + ); + corners[2] = vec4( + frustumMax.x / renderTargetSize.x * clipSpaceSize - 1.0, + (renderTargetSize.y - frustumMax.y) / renderTargetSize.y + * clipSpaceSize - 1.0, + 1.0, + 1.0 + ); + corners[3] = vec4( + frustumMin.x / renderTargetSize.x * clipSpaceSize - 1.0, + (renderTargetSize.y - frustumMax.y) / renderTargetSize.y + * clipSpaceSize - 1.0, + 1.0, + 1.0 + ); + + uint froxelSlice = gl_WorkGroupID.z; + minMaxZ = vec2(0.0, 0.0); + if (froxelSlice > 0u) { + minMaxZ.x = exp2((float(froxelSlice) - depthParams.y) * depthParams.x) + * depthParams.w; + } + minMaxZ.y = exp2((float(froxelSlice + 1u) - depthParams.y) * depthParams.x) + * depthParams.w; + } + + if (gl_LocalInvocationIndex == 0u) { + vec4 frustum[4]; + frustum[0] = projectionToView(corners[0]); + frustum[1] = projectionToView(corners[1]); + frustum[2] = projectionToView(corners[2]); + frustum[3] = projectionToView(corners[3]); + + froxels.data[index].plane0 = createPlane(frustum[0], frustum[1]); + froxels.data[index].plane1 = createPlane(frustum[1], frustum[2]); + froxels.data[index].plane2 = createPlane(frustum[2], frustum[3]); + froxels.data[index].plane3 = createPlane(frustum[3], frustum[0]); + froxels.data[index].minMaxZ = minMaxZ; + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [froxelGeneration]: GLSL implementation of froxels data generation (compute shader)] + +The second compute shader, shown in listing [froxelEvaluation], runs every frame (if the camera and/or lights have changed) and assigns all the lights to their respective froxels. This shader relies only on a couple of uniforms (the number of point/spot lights and the view matrix) and four SSBOs: + +Light index buffer +: For each froxel, the index of each light that affects said froxel. The indices for point lights are written first and if there is enough space left, the indices for spot lights are written as well. A sentinel of value 0x7fffffffu separates point and spot lights and/or marks the end of the froxel's list of lights. Each froxel has a maximum number of lights (point + spot). + +Point lights buffer +: Array of structures describing the scene's point lights. + +Spot lights buffer +: Array of structures describing the scene's spot lights. + +Froxels buffer +: The list of froxels represented by planes, created by the previous compute shader. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#version 310 es +precision highp float; +precision highp int; + +#define LIGHT_BUFFER_SENTINEL 0x7fffffffu +#define MAX_FROXEL_LIGHT_COUNT 32u + +#define THREADS_PER_FROXEL_X 8u +#define THREADS_PER_FROXEL_Y 8u +#define THREADS_PER_FROXEL_Z 1u +#define THREADS_PER_FROXEL (THREADS_PER_FROXEL_X * \ + THREADS_PER_FROXEL_Y * THREADS_PER_FROXEL_Z) + +layout(local_size_x = THREADS_PER_FROXEL_X, + local_size_y = THREADS_PER_FROXEL_Y, + local_size_z = THREADS_PER_FROXEL_Z) in; + +// x = point lights, y = spot lights +layout(location = 0) uniform uvec2 totalLightCount; +layout(location = 1) uniform mat4 viewMatrix; + +layout(binding = 0, packed) writeonly restrict buffer LightIndexBuffer { + uint index[]; +} lightIndexBuffer; + +struct PointLight { + vec4 positionFalloff; // x, y, z, falloff + vec4 colorIntensity; // r, g, b, intensity + vec4 directionIES; // dir x, dir y, dir z, IES profile index +}; + +layout(binding = 1, std140) readonly restrict buffer PointLightBuffer { + PointLight lights[]; +} pointLights; + +struct SpotLight { + vec4 positionFalloff; // x, y, z, falloff + vec4 colorIntensity; // r, g, b, intensity + vec4 directionIES; // dir x, dir y, dir z, IES profile index + vec4 angle; // angle scale, angle offset, unused, unused +}; + +layout(binding = 2, std140) readonly restrict buffer SpotLightBuffer { + SpotLight lights[]; +} spotLights; + +struct Froxel { + // NOTE: the planes should be stored in vec4[4] but the + // Adreno shader compiler has a bug that causes the data + // to not be read properly inside the loop + vec4 plane0; + vec4 plane1; + vec4 plane2; + vec4 plane3; + vec2 minMaxZ; +}; + +layout(binding = 3, std140) readonly restrict buffer FroxelBuffer { + Froxel data[]; +} froxels; + +shared uint groupLightCounter; +shared uint groupLightIndexBuffer[MAX_FROXEL_LIGHT_COUNT]; + +float signedDistanceFromPlane(vec4 p, vec4 plane) { + // plane.w == 0.0, simplify computation + return dot(plane.xyz, p.xyz); +} + +void synchronize() { + memoryBarrierShared(); + barrier(); +} + +void main() { + if (gl_LocalInvocationIndex == 0u) { + groupLightCounter = 0u; + } + memoryBarrierShared(); + + uint froxelIndex = gl_WorkGroupID.x + gl_WorkGroupID.y * gl_NumWorkGroups.x + + gl_WorkGroupID.z * gl_NumWorkGroups.x * gl_NumWorkGroups.y; + Froxel current = froxels.data[froxelIndex]; + + uint offset = gl_LocalInvocationID.x + + gl_LocalInvocationID.y * THREADS_PER_FROXEL_X; + for (uint i = 0u; i < totalLightCount.x && + groupLightCounter < MAX_FROXEL_LIGHT_COUNT && + offset + i < totalLightCount.x; i += THREADS_PER_FROXEL) { + + uint currentLight = offset + i; + + vec4 center = pointLights.lights[currentLight].positionFalloff; + center.xyz = (viewMatrix * vec4(center.xyz, 1.0)).xyz; + float r = inversesqrt(center.w); + + if (-center.z + r > current.minMaxZ.x && + -center.z - r <= current.minMaxZ.y) { + if (signedDistanceFromPlane(center, current.plane0) < r && + signedDistanceFromPlane(center, current.plane1) < r && + signedDistanceFromPlane(center, current.plane2) < r && + signedDistanceFromPlane(center, current.plane3) < r) { + + uint index = atomicAdd(groupLightCounter, 1u); + groupLightIndexBuffer[index] = currentLight; + } + } + } + + synchronize(); + + uint pointLightCount = groupLightCounter; + offset = froxelIndex * MAX_FROXEL_LIGHT_COUNT; + + for (uint i = gl_LocalInvocationIndex; i < pointLightCount; + i += THREADS_PER_FROXEL) { + lightIndexBuffer.index[offset + i] = groupLightIndexBuffer[i]; + } + + if (gl_LocalInvocationIndex == 0u) { + if (pointLightCount < MAX_FROXEL_LIGHT_COUNT) { + lightIndexBuffer.index[offset + pointLightCount] = LIGHT_BUFFER_SENTINEL; + } + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[Listing [froxelEvaluation]: GLSL implementation of assigning lights to froxels (compute shader)] + +# Revisions + +February 20, 2019: Cloth shading + - Removed Fresnel term from the cloth BRDF + - Removed cloth DFG approximations, replaced with a new channel in the DFG LUT + +August 21, 2018: Multiscattering + - Added section [Energy loss in specular reflectance] on how to compensate for energy loss in single scattering BRDFs + +August 17, 2018: Specular color + - Added section [Specular color] to explain how the base color of various metals is computed + +August 15, 2018: Fresnel + - Added a description of the Fresnel effect in section [Fresnel (specular F)] + +August 9, 2018: Lighting + - Added explanation about pre-exposed lights + +August 7, 2018: Cloth model + - Added description of the "Charlie" NDF + +August 3, 2018: First public version + +# Bibliography + +[#Ashdown98]: Ian Ashdown. 1998. Parsing the IESNA LM-63 photometric data file. http://lumen.iee.put.poznan.pl/kw/iesna.txt + +[#Ashikhmin00]: Michael Ashikhmin, Simon Premoze and Peter Shirley. A Microfacet-based BRDF Generator. *SIGGRAPH '00 Proceedings*, 65-74. + +[#Ashikhmin07]: Michael Ashikhmin and Simon Premoze. 2007. Distribution-based BRDFs. + +[#Burley12]: Brent Burley. 2012. Physically Based Shading at Disney. *Physically Based Shading in Film and Game Production, ACM SIGGRAPH 2012 Courses*. + +[#Estevez17]: Alejandro Conty Estevez and Christopher Kulla. 2017. Production Friendly Microfacet Sheen BRDF. *ACM SIGGRAPH 2017*. + +[#Hammon17]: Earl Hammon. 217. PBR Diffuse Lighting for GGX+Smith Microsurfaces. *GDC 2017*. + +[#Heitz14]: Eric Heitz. 2014. Understanding the Masking-Shadowing Function +in Microfacet-Based BRDFs. *Journal of Computer Graphics Techniques*, 3 (2). + +[#Heitz16]: Eric Heitz et al. 2016. Multiple-Scattering Microfacet BSDFs with the Smith Model. *ACM SIGGRAPH 2016*. + +[#Hill12]: Colin Barré-Brisebois and Stephen Hill. 2012. Blending in Detail. http://blog.selfshadow.com/publications/blending-in-detail/ + +[#Karis13a]: Brian Karis. 2013. Specular BRDF Reference. http://graphicrants.blogspot.com/2013/08/specular-brdf-reference.html + +[#Karis13b]: Brian Karis, 2013. Real Shading in Unreal Engine 4. https://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf + +[#Karis14]: Brian Karis. 2014. Physically Based Shading on Mobile. https://www.unrealengine.com/blog/physically-based-shading-on-mobile + +[#Kelemen01]: Csaba Kelemen et al. 2001. A Microfacet Based Coupled Specular-Matte BRDF Model with Importance Sampling. *Eurographics Short Presentations*. + +[#Krystek85]: M. Krystek. 1985. An algorithm to calculate correlated color temperature. *Color Research & Application*, 10 (1), 38–40. + +[#Krivanek08]: Jaroslave Krivànek and Mark Colbert. 2008. Real-time Shading with Filtered Importance Sampling. *Eurographics Symposium on Rendering 2008*, Volume 27, Number 4. + +[#Kulla17]: Christopher Kulla and Alejandro Conty. 2017. Revisiting Physically Based Shading at Imageworks. *ACM SIGGRAPH 2017* + +[#Lagarde14]: Sébastien Lagarde and Charles de Rousiers. 2014. Moving Frostbite to PBR. *Physically Based Shading in Theory and Practice, ACM SIGGRAPH 2014 Courses*. + +[#Lagarde18]: Sébastien Lagarde and Evgenii Golubev. 2018. The road toward unified rendering with Unity’s high definition rendering pipeline. *Advances in Real-Time Rendering in Games, ACM SIGGRAPH 2018 Courses*. + +[#Lazarov13]: Dimitar Lazarov. 2013. Physically-Based Shading in Call of Duty: Black Ops. *Physically Based Shading in Theory and Practice, ACM SIGGRAPH 2013 Courses*. + +[#McAuley15]: Stephen McAuley. 2015. Rendering the World of Far Cry 4. *GDC 2015*. + +[#McGuire10]: Morgan McGuire. 2010. Ambient Occlusion Volumes. *High Performance Graphics*. + +[#Narkowicz14]: Krzysztof Narkowicz. 2014. Analytical DFG Term for IBL. https://knarkowicz.wordpress.com/2014/12/27/analytical-dfg-term-for-ibl + +[#Neubelt13]: David Neubelt and Matt Pettineo. 2013. Crafting a Next-Gen Material Pipeline for The Order: 1886. *Physically Based Shading in Theory and Practice, ACM SIGGRAPH 2013 Courses*. + +[#Oren94]: Michael Oren and Shree K. Nayar. 1994. Generalization of lambert's reflectance model. *SIGGRAPH*, 239–246. ACM. + +[#Pattanaik00]: Sumanta Pattanaik00 et al. 2000. Time-Dependent Visual Adaptation +For Fast Realistic Image Display. *SIGGRAPH '00 Proceedings of the 27th annual conference on Computer graphics and interactive techniques*, 47-54. + +[#Ramamoorthi01]: Ravi Ramamoorthi and Pat Hanrahan. 2001. On the relationship between radiance and irradiance: determining the illumination from images of a convex Lambertian object. *Journal of the Optical Society of America*, Volume 18, Number 10, October 2001. + +[#Revie12]: Donald Revie. 2012. Implementing Fur in Deferred Shading. *GPU Pro 2*, Chapter 2. + +[#Russell15]: Jeff Russell. 2015. Horizon Occlusion for Normal Mapped Reflections. http://marmosetco.tumblr.com/post/81245981087 + +[#Schlick94]: Christophe Schlick. 1994. An Inexpensive BRDF Model for Physically-Based Rendering. *Computer Graphics Forum*, 13 (3), 233–246. + +[#Walter07]: Bruce Walter et al. 2007. Microfacet Models for Refraction through Rough Surfaces. *Proceedings of the Eurographics Symposium on Rendering*. + + diff --git a/docs_src/markdeep/Materials.md.html b/docs_src/markdeep/Materials.md.html new file mode 100644 index 00000000000..753e3a6b2f5 --- /dev/null +++ b/docs_src/markdeep/Materials.md.html @@ -0,0 +1,2661 @@ + + + + +**Filament Materials Guide** + +![](images/filament_logo.png) + +# About + +This document is part of the [Filament project](https://github.com/google/filament). To report errors in this document please use the [project's issue tracker](https://github.com/google/filament/issues). + +## Authors + +- [Romain Guy](https://github.com/romainguy), [@romainguy](https://twitter.com/romainguy) +- [Mathias Agopian](https://github.com/pixelflinger), [@darthmoosious](https://twitter.com/darthmoosious) + +# Overview + +Filament is a physically based rendering (PBR) engine for Android. Filament offers a customizable +material system that you can use to create both simple and complex materials. This document +describes all the features available to materials and how to create your own material. + +## Core concepts + +Material +: A material defines the visual appearance of a surface. To completely describe and render a + surface, a material provides the following information: + - Material model + - Set of use-controllable named parameters + - Raster state (blending mode, backface culling, etc.) + - Vertex shader code + - Fragment shader code + +Material model +: Also called _shading model_ or _lighting model_, the material model defines the intrinsic + properties of a surface. These properties have a direct influence on the way lighting is + computed and therefore on the appearance of a surface. + +Material definition +: A text file that describes all the information required by a material. This is the file that you + will directly author to create new materials. + +Material package +: At runtime, materials are loaded from _material packages_ compiled from material definitions + using the `matc` tool. A material package contains all the information required to describe a + material, and shaders generated for the target runtime platforms. This is necessary because + different platforms (Android, macOS, Linux, etc.) use different graphics APIs or different + variants of similar graphics APIs (OpenGL vs OpenGL ES for instance). + +Material instance +: A material instance is a reference to a material and a set of values for the different values of + that material. Material instances are not covered in this document as they are created and + manipulated directly from code using Filament's APIs. + +# Material models + +Filament materials can use one of the following material models: +- Lit (or standard) +- Subsurface +- Cloth +- Unlit +- Specular glossiness (legacy) + +## Lit model + +The lit model is Filament's standard material model. This physically-based shading model was +designed after to offer good interoperability with other common tools and engines such as _Unity 5_, +_Unreal Engine 4_, _Substance Designer_ or _Marmoset Toolbag_. + +This material model can be used to describe many non-metallic surfaces (_dielectrics_) +or metallic surfaces (_conductors_). + +The appearance of a material using the standard model is controlled using the properties described +in table [standardProperties]. + + + Property | Definition +-----------------------:|:--------------------- +**baseColor** | Diffuse albedo for non-metallic surfaces, and specular color for metallic surfaces +**metallic** | Whether a surface appears to be dielectric (0.0) or conductor (1.0). Often used as a binary value (0 or 1) +**roughness** | Perceived smoothness (1.0) or roughness (0.0) of a surface. Smooth surfaces exhibit sharp reflections +**reflectance** | Fresnel reflectance at normal incidence for dielectric surfaces. This directly controls the strength of the reflections +**sheenColor** | Strength of the sheen layer +**sheenRoughness** | Perceived smoothness or roughness of the sheen layer +**clearCoat** | Strength of the clear coat layer +**clearCoatRoughness** | Perceived smoothness or roughness of the clear coat layer +**anisotropy** | Amount of anisotropy in either the tangent or bitangent direction +**anisotropyDirection** | Local surface direction in tangent space +**ambientOcclusion** | Defines how much of the ambient light is accessible to a surface point. It is a per-pixel shadowing factor between 0.0 and 1.0 +**normal** | A detail normal used to perturb the surface using _bump mapping_ (_normal mapping_) +**bentNormal** | A normal pointing in the average unoccluded direction. Can be used to improve indirect lighting quality +**clearCoatNormal** | A detail normal used to perturb the clear coat layer using _bump mapping_ (_normal mapping_) +**emissive** | Additional diffuse albedo to simulate emissive surfaces (such as neons, etc.) This property is mostly useful in an HDR pipeline with a bloom pass +**postLightingColor** | Additional color that can be blended with the result of the lighting computations. See `postLightingBlending` +**ior** | Index of refraction, either for refractive objects or as an alternative to reflectance +**transmission** | Defines how much of the diffuse light of a dielectric is transmitted through the object, in other words this defines how transparent an object is +**absorption** | Absorption factor for refractive objects +**microThickness** | Thickness of the thin layer of refractive objects +**thickness** | Thickness of the solid volume of refractive objects +[Table [standardProperties]: Properties of the standard model] + +The type and range of each property is described in table [standardPropertiesTypes]. + + Property | Type | Range | Note +-----------------------:|:--------:|:------------------------:|:------------------------- +**baseColor** | float4 | [0..1] | Pre-multiplied linear RGB +**metallic** | float | [0..1] | Should be 0 or 1 +**roughness** | float | [0..1] | +**reflectance** | float | [0..1] | Prefer values > 0.35 +**sheenColor** | float3 | [0..1] | Linear RGB +**sheenRoughness** | float | [0..1] | +**clearCoat** | float | [0..1] | Should be 0 or 1 +**clearCoatRoughness** | float | [0..1] | +**anisotropy** | float | [-1..1] | Anisotropy is in the tangent direction when this value is positive +**anisotropyDirection** | float3 | [0..1] | Linear RGB, encodes a direction vector in tangent space +**ambientOcclusion** | float | [0..1] | +**normal** | float3 | [0..1] | Linear RGB, encodes a direction vector in tangent space +**bentNormal** | float3 | [0..1] | Linear RGB, encodes a direction vector in tangent space +**clearCoatNormal** | float3 | [0..1] | Linear RGB, encodes a direction vector in tangent space +**emissive** | float4 | rgb=[0..n], a=[0..1] | Linear RGB intensity in nits, alpha encodes the exposure weight +**postLightingColor** | float4 | [0..1] | Pre-multiplied linear RGB +**ior** | float | [1..n] | Optional, usually deduced from the reflectance +**transmission** | float | [0..1] | +**absorption** | float3 | [0..n] | +**microThickness** | float | [0..n] | +**thickness** | float | [0..n] | +[Table [standardPropertiesTypes]: Range and type of the standard model's properties] + + +!!! Note: About linear RGB + Several material model properties expect RGB colors. Filament materials use RGB colors in linear + space and you must take proper care of supplying colors in that space. See the Linear colors + section for more information. + +!!! Note: About pre-multiplied RGB + Filament materials expect colors to use pre-multiplied alpha. See the Pre-multiplied alpha + section for more information. + +!!! Note: About `absorption` + The light attenuation through the material is defined as $e^{-absorption \cdot distance}$, + and the distance depends on the `thickness` parameter. If `thickness` is not provided, then + the `absorption` parameter is used directly and the light attenuation through the material + becomes $1 - absorption$. To obtain a certain color at a desired distance, the above + equation can be inverted such as $absorption = -\frac{ln(color)}{distance}$. + +!!! Note: About `ior` and `reflectance` + The index of refraction (IOR) and the reflectance represent the same physical attribute, + therefore they don't need to be both specified. Typically, only the reflectance is specified, + and the IOR is deduced automatically. When only the IOR is specified, the reflectance is then + deduced automatically. It is possible to specify both, in which case their values are kept + as-is, which can lead to physically impossible materials, however, this might be desirable + for artistic reasons. + +!!! Note: About `thickness` and `microThickness` for refraction + `thickness` represents the thickness of solid objects in the direction of the normal, for + satisfactory results, this should be provided per fragment (e.g.: as a texture) or at least per + vertex. `microThickness` represent the thickness of the thin layer of an object, and can + generally be provided as a constant value. For example, a 1mm thin hollow sphere of radius 1m, + would have a `thickness` of 1 and a `microThickness` of 0.001. Currently `thickness` is not + used when `refractionType` is set to `thin`. + +### Base color + +The `baseColor` property defines the perceived color of an object (sometimes called albedo). The +effect of `baseColor` depends on the nature of the surface, controlled by the `metallic` property +explained in the Metallic section. + +Non-metals (dielectrics) +: Defines the diffuse color of the surface. Real-world values are typically found in the range + $[10..240]$ if the value is encoded between 0 and 255, or in the range $[0.04..0.94]$ between 0 + and 1. Several examples of base colors for non-metallic surfaces can be found in + table [baseColorsDielectrics]. + + Metal | sRGB | Hexadecimal | Color +----------:|:-------------------:|:------------:|------------------------------------------------------- +Coal | 0.19, 0.19, 0.19 | #323232 |
     
    +Rubber | 0.21, 0.21, 0.21 | #353535 |
     
    +Mud | 0.33, 0.24, 0.19 | #553d31 |
     
    +Wood | 0.53, 0.36, 0.24 | #875c3c |
     
    +Vegetation | 0.48, 0.51, 0.31 | #7b824e |
     
    +Brick | 0.58, 0.49, 0.46 | #947d75 |
     
    +Sand | 0.69, 0.66, 0.52 | #b1a884 |
     
    +Concrete | 0.75, 0.75, 0.73 | #c0bfbb |
     
    +[Table [baseColorsDielectrics]: `baseColor` for common non-metals] + +Metals (conductors) +: Defines the specular color of the surface. Real-world values are typically found in the range + $[170..255]$ if the value is encoded between 0 and 255, or in the range $[0.66..1.0]$ between 0 and + 1. Several examples of base colors for metallic surfaces can be found in table [baseColorsConductors]. + + Metal | sRGB | Hexadecimal | Color +----------:|:-------------------:|:------------:|------------------------------------------------------- +Silver | 0.97, 0.96, 0.91 | #f7f4e8 |
     
    +Aluminum | 0.91, 0.92, 0.92 | #e8eaea |
     
    +Titanium | 0.76, 0.73, 0.69 | #c1baaf |
     
    +Iron | 0.77, 0.78, 0.78 | #c4c6c6 |
     
    +Platinum | 0.83, 0.81, 0.78 | #d3cec6 |
     
    +Gold | 1.00, 0.85, 0.57 | #ffd891 |
     
    +Brass | 0.98, 0.90, 0.59 | #f9e596 |
     
    +Copper | 0.97, 0.74, 0.62 | #f7bc9e |
     
    +[Table [baseColorsConductors]: `baseColor` for common metals] + +### Metallic + +The `metallic` property defines whether the surface is a metallic (_conductor_) or a non-metallic +(_dielectric_) surface. This property should be used as a binary value, set to either 0 or 1. +Intermediate values are only truly useful to create transitions between different types of surfaces +when using textures. + +This property can dramatically change the appearance of a surface. Non-metallic surfaces have +chromatic diffuse reflection and achromatic specular reflection (reflected light does not change +color). Metallic surfaces do not have any diffuse reflection and chromatic specular reflection +(reflected light takes on the color of the surfaced as defined by `baseColor`). + +The effect of `metallic` is shown in figure [metallicProperty] (click on the image to see a +larger version). + +![Figure [metallicProperty]: `metallic` varying from 0.0 +(left) to 1.0 (right)](images/materials/metallic.png) + +### Roughness + +The `roughness` property controls the perceived smoothness of the surface. When `roughness` is set +to 0, the surface is perfectly smooth and highly glossy. The rougher a surface is, the "blurrier" +the reflections are. This property is often called _glossiness_ in other engines and tools, and is +simply the opposite of the roughness (`roughness = 1 - glossiness`). + +### Non-metals + +The effect of `roughness` on non-metallic surfaces is shown in figure [roughnessProperty] (click +on the image to see a larger version). + +![Figure [roughnessProperty]: Dielectric `roughness` varying from 0.0 +(left) to 1.0 (right)](images/materials/dielectric_roughness.png) + +### Metals + +The effect of `roughness` on metallic surfaces is shown in figure [roughnessConductorProperty] +(click on the image to see a larger version). + +![Figure [roughnessConductorProperty]: Conductor `roughness` varying from 0.0 +(left) to 1.0 (right)](images/materials/conductor_roughness.png) + +### Refraction + +When refraction through an object is enabled (using a `refractonType` of `thin` or `solid`), the +`roughness` property will also affect the refractions, as shown in figure +[roughnessRefractionProperty] (click on the image to see a larger version). + +![Figure [roughnessRefractionProperty]: Refractive sphere with `roughness` varying from 0.0 + (left) to 1.0 (right)](images/materials/refraction_roughness.png) + +### Reflectance + +The `reflectance` property only affects non-metallic surfaces. This property can be used to control +the specular intensity and index of refraction of materials. This value is defined +between 0 and 1 and represents a remapping of a percentage of reflectance. For instance, the +default value of 0.5 corresponds to a reflectance of 4%. Values below 0.35 (2% reflectance) should +be avoided as no real-world materials have such low reflectance. + +The effect of `reflectance` on non-metallic surfaces is shown in figure [reflectanceProperty] +(click on the image to see a larger version). + +![Figure [reflectanceProperty]: `reflectance` varying from 0.0 (left) +to 1.0 (right)](images/materials/reflectance.png) + +Figure [reflectance] shows common values and how they relate to the mapping function. + +![Figure [reflectance]: Common reflectance values](images/diagram_reflectance.png) + +Table [commonMatReflectance] describes acceptable reflectance values for various types of materials +(no real world material has a value under 2%). + + +Material | Reflectance | IOR | Linear value +--------------------------:|:-----------------|:-----------------|:---------------- +Water | 2% | 1.33 | 0.35 +Fabric | 4% to 5.6% | 1.5 to 1.62 | 0.5 to 0.59 +Common liquids | 2% to 4% | 1.33 to 1.5 | 0.35 to 0.5 +Common gemstones | 5% to 16% | 1.58 to 2.33 | 0.56 to 1.0 +Plastics, glass | 4% to 5% | 1.5 to 1.58 | 0.5 to 0.56 +Other dielectric materials | 2% to 5% | 1.33 to 1.58 | 0.35 to 0.56 +Eyes | 2.5% | 1.38 | 0.39 +Skin | 2.8% | 1.4 | 0.42 +Hair | 4.6% | 1.55 | 0.54 +Teeth | 5.8% | 1.63 | 0.6 +Default value | 4% | 1.5 | 0.5 +[Table [commonMatReflectance]: Reflectance of common materials] + +Note that the `reflectance` property also defines the index of refraction of the surface. +When this property is defined it is not necessary to define the `ior` property. Setting +either of these properties will automatically compute the other property. It is possible +to specify both, in which case their values are kept as-is, which can lead to physically +impossible materials, however, this might be desirable for artistic reasons. + +The `reflectance` property is designed as a normalized property in the range 0..1 which makes +it easy to define from a texture. + +See section [Index of refraction] for more information about the `ior` property and refractive +indices. + +### Sheen color + +The sheen color controls the color appearance and strength of an optional sheen layer on top of the +base layer described by the properties above. The sheen layer always sits below the clear coat layer +if such a layer is present. + +The sheen layer can be used to represent cloth and fabric materials. Please refer to +section [Cloth model] for more information about cloth and fabric materials. + +The effect of `sheenColor` is shown in figure [materialSheenColor] +(click on the image to see a larger version). + +![Figure [materialSheenColor]: Different sheen colors](images/screenshot_sheen_color.png) + +!!! Note + If you do not need the other properties offered by the standard lit material model but want to + create a cloth-like or fabric-like appearance, it is more efficient to use the dedicated cloth + model described in section [Cloth model]. + +### Sheen roughness + +The `sheenRoughness` property is similar to the `roughness` property but applies only to the +sheen layer. + +The effect of `sheenRoughness` on a rough metal is shown in figure [sheenRoughnessProperty] +(click on the image to see a larger version). In this picture, the base layer is a dark blue, with +`metallic` set to `0.0` and `roughness` set to `1.0`. + +![Figure [sheenRoughnessProperty]: `sheenRoughness` varying from 0.0 +(left) to 1.0 (right)](images/materials/sheen_roughness.png) + +### Clear coat + +Multi-layer materials are fairly common, particularly materials with a thin translucent +layer over a base layer. Real world examples of such materials include car paints, soda cans, +lacquered wood and acrylic. + +The `clearCoat` property can be used to describe materials with two layers. The clear coat layer +will always be isotropic and dielectric. + +![Figure [clearCoat]: Comparison of a carbon-fiber material under the standard material model +(left) and the clear coat model (right)](images/material_carbon_fiber.png) + +The `clearCoat` property controls the strength of the clear coat layer. This should be treated as a +binary value, set to either 0 or 1. Intermediate values are useful to control transitions between +parts of the surface that have a clear coat layers and parts that don't. + +The effect of `clearCoat` on a rough metal is shown in figure [clearCoatProperty] +(click on the image to see a larger version). + +![Figure [clearCoatProperty]: `clearCoat` varying from 0.0 +(left) to 1.0 (right)](images/materials/clear_coat.png) + +!!! Warning + The clear coat layer effectively doubles the cost of specular computations. Do not assign a + value, even 0.0, to the clear coat property if you don't need this second layer. + +!!! Note + The clear coat layer is added on top of the sheen layer if present. + +### Clear coat roughness + +The `clearCoatRoughness` property is similar to the `roughness` property but applies only to the +clear coat layer. + +The effect of `clearCoatRoughness` on a rough metal is shown in figure [clearCoatRoughnessProperty] +(click on the image to see a larger version). + +![Figure [clearCoatRoughnessProperty]: `clearCoatRoughness` varying from 0.0 +(left) to 1.0 (right)](images/materials/clear_coat_roughness.png) + +### Anisotropy + +Many real-world materials, such as brushed metal, can only be replicated using an anisotropic +reflectance model. A material can be changed from the default isotropic model to an anisotropic +model by using the `anisotropy` property. + +![Figure [anisotropic]: Comparison of isotropic material +(left) and anistropic material (right)](images/material_anisotropic.png) + +The effect of `anisotropy` on a rough metal is shown in figure [anisotropyProperty] +(click on the image to see a larger version). + +![Figure [anisotropyProperty]: `anisotropy` varying from 0.0 +(left) to 1.0 (right)](images/materials/anisotropy.png) + +The figure [anisotropyDir] below shows how the direction of the anisotropic highlights can be +controlled by using either positive or negative values: positive values define anisotropy in the +tangent direction and negative values in the bitangent direction. + +![Figure [anisotropyDir]: Positive (left) vs negative +(right) `anisotropy` values](images/screenshot_anisotropy_direction.png) + +!!! Tip + The anisotropic material model is slightly more expensive than the standard material model. Do + not assign a value (even 0.0) to the `anisotropy` property if you don't need anisotropy. + +### Anisotropy direction + +The `anisotropyDirection` property defines the direction of the surface at a given point and thus +control the shape of the specular highlights. It is specified as vector of 3 values that usually +come from a texture, encoding the directions local to the surface in tangent space. Because the +direction is in tangent space, the Z component should be set to 0. + +The effect of `anisotropyDirection` on a metal is shown in figure [anisotropyDirectionProperty] +(click on the image to see a larger version). + +![Figure [anisotropyDirectionProperty]: Anisotropic metal rendered +with a direction map](images/screenshot_anisotropy.png) + +The result shown in figure [anisotropyDirectionProperty] was obtained using the direction map shown +in figure [anisotropyDirectionProperty]. + +![Figure [anisotropyDirectionProperty]: Example of Lighting: specularAmbientOcclusiona direction map](images/screenshot_anisotropy_map.jpg) + +### Ambient occlusion + +The `ambientOcclusion` property defines how much of the ambient light is accessible to a surface +point. It is a per-pixel shadowing factor between 0.0 (fully shadowed) and 1.0 (fully lit). This +property only affects diffuse indirect lighting (image-based lighting), not direct lights such as +directional, point and spot lights, nor specular lighting. + +![Figure [aoExample]: Comparison of materials without diffuse ambient occlusion +(left) and with (right)](images/screenshot_ao.jpg) + +### Normal + +The `normal` property defines the normal of the surface at a given point. It usually comes from a +_normal map_ texture, which allows to vary the property per-pixel. The normal is supplied in tangent +space, which means that +Z points outside of the surface. + +For example, let's imagine that we want to render a piece of furniture covered in tufted leather. +Modeling the geometry to accurately represent the tufted pattern would require too many triangles +so we instead bake a high-poly mesh into a normal map. Once the base map is applied to a simplified +mesh, we get the result in figure [normalMapped]. + +Note that the `normal` property affects the _base layer_ and not the clear coat layer. + +![Figure [normalMapped]: Low-poly mesh without normal mapping (left) +and with (right)](images/screenshot_normal_mapping.jpg) + +!!! Warning + Using a normal map increases the runtime cost of the material model. + +### Bent normal + +The `bentNormal` property defines the average unoccluded direction at a point on the surface. It is +used to improve the accuracy of indirect lighting. Bent normals can also improve the quality of +specular ambient occlusion (see section [Lighting: specularAmbientOcclusion] about +`specularAmbientOcclusion`). + +Bent normals can greatly increase the visual fidelity of an asset with various cavities and concave +areas, as shown in figure [bentNormalMapped]. See the areas of the ears, nostrils and eyes for +instance. + +![Figure [bentNormalMapped]: Example of a model rendered with and without a bent normal map. Both +versions use the same ambient occlusion map.](images/material_bent_normal.gif) + +### Clear coat normal + +The `clearCoatNormal` property defines the normal of the clear coat layer at a given point. It +behaves otherwise like the `normal` property. + +![Figure [clearCoatNormalMapped]: A material with a clear coat normal +map and a surface normal map](images/screenshot_clear_coat_normal.jpg) + +!!! Warning + Using a clear coat normal map increases the runtime cost of the material model. + +### Emissive + +The `emissive` property can be used to simulate additional light emitted by the surface. It is +defined as a `float4` value that contains an RGB intensity in nits as well as an exposure +weight (in the alpha channel). + +The intensity in nits allows an emissive surface to function as a light and can be used to recreate +real world surfaces. For instance a computer display has an intensity between 200 and 1,000 nits. + +If you prefer to work in EV (or f-stops), you can simplify multiply your emissive color by the +output of the API `filament::Exposure::luminance(ev)`. This API returns the luminance in nits of +the specific EV. You can perform this conversion yourself using the following formula, where $L$ +is the final intensity in nits: $ L = 2^{EV - 3} $. + +The exposure weight carried in the alpha channel can be used to undo the camera exposure, and thus +force an emissive surface to bloom. When the exposure weight is set to 0, the emissive intensity is +not affected by the camera exposure. When the weight is set to 1, the intensity is multiplied by +the camera exposure like with any regular light. + +### Post-lighting color + +The `postLightingColor` can be used to modify the surface color after lighting computations. This +property has no physical meaning and only exists to implement specific effects or to help with +debugging. This property is defined as a `float4` value containing a pre-multiplied RGB color in +linear space. + +The post-lighting color is blended with the result of lighting according to the blending mode +specified by the `postLightingBlending` material option. Please refer to the documentation of +this option for more information. + +!!! Tip + `postLightingColor` can be used as a simpler `emissive` property by setting + `postLightingBlending` to `add` and by providing an RGB color with alpha set to `0.0`. + +### Index of refraction + +The `ior` property only affects non-metallic surfaces. This property can be used to control the +index of refraction and the specular intensity of materials. The `ior` property is intended to +be used with refractive (transmissive) materials, which are enabled when the `refractionMode` is +set to `cubemap` or `screenspace`. It can also be used on non-refractive objects as an alternative +to setting the reflectance. + +The index of refraction (or refractive index) of a material is a dimensionless number that describes +how fast light travels through that material. The higher the number, the slower light travels +through the medium. More importantly for rendering materials, the refractive index determines how +the path light travels is bent when entering the material. Higher indices of refraction will cause +light to bend further away from the initial path. + +Table [commonMatIOR] describes acceptable refractive indices for various types of materials. + +Material | IOR +--------------------------:|:----------------- +Air | 1.0 +Water | 1.33 +Common liquids | 1.33 to 1.5 +Common gemstones | 1.58 to 2.33 +Plastics, glass | 1.5 to 1.58 +Other dielectric materials | 1.33 to 1.58 +[Table [commonMatIOR]: Index of refraction of common materials] + +The appearance of a refractive material will greatly depend on the `refractionType` and +`refractionMode` settings of the material. Refer to section +[Blending and transparency: refractionType] and section [Blending and transparency: refractionMode] +for more information. + +The effect of `ior` when `refractionMode` is set to `cubemap` and `refractionType` is set to `solid` +can be seen in figure [iorProperty2] (click on the image to see a larger version). + +![Figure [iorProperty2]: `transmission` varying from 1.0 +(left) to 1.5 (right)](images/materials/ior.png) + +Figure [iorProperty] shows the comparison of a sphere of `ior` 1.0 with a sphere of `ior` 1.33, with +the `refractionMode` set to `screenspace` and the `refractionType` set to `solid` +(click on the image to see a larger version). + +![Figure [iorProperty]: `ior` of 1.0 (left) and 1.33 (right)](images/material_ior.png) + +Note that the `ior` property also defines the reflectance (or specular intensity) of the surface. +When this property is defined it is not necessary to define the `reflectance` property. Setting +either of these properties will automatically compute the other property. It is possible to specify +both, in which case their values are kept as-is, which can lead to physically impossible materials, +however, this might be desirable for artistic reasons. + +See the Reflectance section for more information on the `reflectance` property. + +!!! Tip + Refractive materials are affected by the `roughness` property. Rough materials will scatter + light, creating a diffusion effect useful to recreate "blurry" appearances such as frosted + glass, certain plastics, etc. + +### Transmission + +The `transmission` property defines what ratio of diffuse light is transmitted through a refractive +material. This property only affects materials with a `refractionMode` set to `cubemap` or +`screenspace`. + +When `transmission` is set to 0, no amount of light is transmitted and the diffuse component of +the surface is 100% visible. When `transmission` is set to 1, all the light is transmitted and the +diffuse component is not visible anymore, only the specular component is. + +The effect of `transmission` on a glossy dielectric (`ior` of 1.5, `refractionMode` set to +`cubemap`, `refractionType` set to `solid`) is shown in figure [transmissionProperty] +(click on the image to see a larger version). + +![Figure [transmissionProperty]: `transmission` varying from 0.0 +(left) to 1.0 (right)](images/materials/transmission.png) + +!!! Tip + The `transmission` property is useful to create decals, paint, etc. at the surface of refractive + materials. + +### Absorption + +The `absorption` property defines the absorption coefficients of light transmitted through the +material. Figure [absorptionExample] shows the effect of `absorption` on a refracting object with +an index of refraction of 1.5 and a base color set to white. + +![Figure [absorptionExample]: Refracting object without (left) +and with (right) absorption](images/material_absorption.png) + +Transmittance through a volume is exponential with respect to the optical depth (defined either +with `microThickness` or `thickness`). The computed color follows the following formula: + +$$color \cdot e^{-absorption \cdot distance}$$ + +Where `distance` is either `microThickness` or `thickness`, that is the distance light will travel +through the material at a given point. If no thickness/distance is specified, the computed color +follows this formula instead: + +$$color \cdot (1 - absorption)$$ + +The effect of varying the `absorption` coefficients is shown in figure [absorptionProperty] +(click on the image to see a larger version). In this picture, the object has a fixed `thickness` +of 4.5 and an index of refraction set to 1.3. + +![Figure [absorptionProperty]: `absorption` varying from (0.0, 0.02, 0.14) +(left) to (0.0, 0.36, 2.3) (right)](images/materials/absorption.png) + +Setting the absorption coefficients directly can be unintuitive which is why we recommend working +with a _transmittance color_ and a _"at distance"_ factor instead. These two parameters allow an +artist to specify the precise color the material should have at a specified distance through the +volume. The value to pass to `absorption` can be computed this way: + +$$absorption = -\frac{ln(transmittanceColor)}{atDistance}$$ + +While this computation can be done in the material itself we recommend doing it offline whenever +possible. Filament provides an API for this purpose, `Color::absorptionAtDistance()`. + +### Micro-thickness and thickness + +The `microThickness` and `thickness` properties define the optical depth of the material of a +refracting object. `microThickness` is used when `refractionType` is set to `thin`, and `thickness` +is used when `refractionType` is set to `volume`. + +`thickness` represents the thickness of solid objects in the direction of the normal, for +satisfactory results, this should be provided per fragment (e.g.: as a texture) or at least per +vertex. + +`microThickness` represent the thickness of the thin layer (shell) of an object, and can generally +be provided as a constant value. For example, a 1mm thin hollow sphere of radius 1m, would have a +`thickness` of 1 and a `microThickness` of 0.001. Currently `thickness` is not used when +`refractionType` is set to `thin`. Both properties are made available for possible future use. + +Both `thickness` and `microThickness` are used to compute the transmitted color of the material +when the `absorption` property is set. In solid volumes, `thickness` will also affect how light +rays are refracted. + +The effect `thickness` in a solid volume with `refractionMode` set to `screenSpace` is shown in +figure [thicknessProperty] (click on the image to see a larger version). Note how the `thickness` +value not only changes the effect of `absorption` but also modifies the direction of the refracted +light. + +![Figure [thicknessProperty]: `thickness` varying from 0.0 +(left) to 2.0 (right)](images/materials/thickness.png) + +Figure [varyingThickness] shows what a prism with spatially varying `thickness` looks like when +the `refractionType` is set to `solid` and `absorption` coefficients are set. + +![Figure [varyingThickness]: `thickness` varying from 0.0 at the top of the prism to 3.0 at the +bottom of the prism](images/material_thickness.png) + +## Subsurface model + +### Thickness + +### Subsurface color + +### Subsurface power + +## Cloth model + +All the material models described previously are designed to simulate dense surfaces, both at a +macro and at a micro level. Clothes and fabrics are however often made of loosely connected threads +that absorb and scatter incident light. When compared to hard surfaces, cloth is characterized by +a softer specular lob with a large falloff and the presence of fuzz lighting, caused by +forward/backward scattering. Some fabrics also exhibit two-tone specular colors +(velvets for instance). + +Figure [materialCloth] shows how the standard material model fails to capture the appearance of a +sample of denim fabric. The surface appears rigid (almost plastic-like), more similar to a tarp +than a piece of clothing. This figure also shows how important the softer specular lobe caused by +absorption and scattering is to the faithful recreation of the fabric. + +![Figure [materialCloth]: Comparison of denim fabric rendered using the standard model +(left) and the cloth model (right)](images/screenshot_cloth.png) + +Velvet is an interesting use case for a cloth material model. As shown in figure [materialVelvet] +this type of fabric exhibits strong rim lighting due to forward and backward scattering. These +scattering events are caused by fibers standing straight at the surface of the fabric. When the +incident light comes from the direction opposite to the view direction, the fibers will forward +scatter the light. Similarly, when the incident light from the same direction as the view +direction, the fibers will scatter the light backward. + +![Figure [materialVelvet]: Velvet fabric showcasing forward and +backward scattering](images/screenshot_cloth_velvet.png) + +It is important to note that there are types of fabrics that are still best modeled by hard surface +material models. For instance, leather, silk and satin can be recreated using the standard or +anisotropic material models. + +The cloth material model encompasses all the parameters previously defined for the standard +material mode except for _metallic_ and _reflectance_. Two extra parameters described in +table [clothProperties] are also available. + + + Parameter | Definition +---------------------:|:--------------------- +**sheenColor** | Specular tint to create two-tone specular fabrics (defaults to $\sqrt{baseColor}$) +**subsurfaceColor** | Tint for the diffuse color after scattering and absorption through the material +[Table [clothProperties]: Cloth model parameters] + +The type and range of each property is described in table [clothPropertiesTypes]. + + Property | Type | Range | Note +---------------------:|:--------:|:------------------------:|:------------------------- +**sheenColor** | float3 | [0..1] | Linear RGB +**subsurfaceColor** | float3 | [0..1] | Linear RGB +[Table [clothPropertiesTypes]: Range and type of the cloth model's properties] + +To create a velvet-like material, the base color can be set to black (or a dark color). +Chromaticity information should instead be set on the sheen color. To create more common fabrics +such as denim, cotton, etc. use the base color for chromaticity and use the default sheen color +or set the sheen color to the luminance of the base color. + +!!! Tip + To see the effect of the `roughness` parameter make sure the `sheenColor` is brighter than + `baseColor`. This can be used to create a fuzz effect. Taking the luminance of `baseColor` + as the `sheenColor` will produce a fairly natural effect that works for common cloth. A dark + `baseColor` combined with a bright/saturated `sheenColor` can be used to create velvet. + +!!! Tip + The `subsurfaceColor` parameter should be used with care. High values can interfere with shadows + in some areas. It is best suited for subtle transmission effects through the material. + +### Sheen color + +The `sheenColor` property can be used to directly modify the specular reflectance. It offers +better control over the appearance of cloth and gives give the ability to create +two-tone specular materials. + +The effect of `sheenColor` is shown in figure [materialClothSheen] +(click on the image to see a larger version). + +![Figure [materialClothSheen]: Blue fabric without (left) and with (right) sheen](images/screenshot_cloth_sheen.png) + +### Subsurface color + +The `subsurfaceColor` property is not physically-based and can be used to simulate the scattering, +partial absorption and re-emission of light in certain types of fabrics. This is particularly +useful to create softer fabrics. + +!!! Warning + The cloth material model is more expensive to compute when the `subsurfaceColor` property is used. + +The effect of `subsurfaceColor` is shown in figure [materialClothSubsurface] +(click on the image to see a larger version). + +![Figure [materialClothSubsurface]: White cloth (left column) vs white cloth with +brown subsurface scatting (right)](images/screenshot_cloth_subsurface.png) + +## Unlit model + +The unlit material model can be used to turn off all lighting computations. Its primary purpose is +to render pre-lit elements such as a cubemap, external content (such as a video or camera stream), +user interfaces, visualization/debugging etc. The unlit model exposes only two properties described +in table [unlitProperties]. + + Property | Definition +---------------------:|:--------------------- +**baseColor** | Surface diffuse color +**emissive** | Additional diffuse color to simulate emissive surfaces. This property is mostly useful in an HDR pipeline with a bloom pass +**postLightingColor** | Additional color to blend with base color and emissive +[Table [unlitProperties]: Properties of the standard model] + +The type and range of each property is described in table [unlitPropertiesTypes]. + + Property | Type | Range | Note +---------------------:|:--------:|:------------------------:|:------------------------- +**baseColor** | float4 | [0..1] | Pre-multiplied linear RGB +**emissive** | float4 | rgb=[0..n], a=[0..1] | Linear RGB intensity in nits, alpha encodes the exposure weight +**postLightingColor** | float4 | [0..1] | Pre-multiplied linear RGB +[Table [unlitPropertiesTypes]: Range and type of the unlit model's properties] + +The value of `postLightingColor` is blended with the sum of `emissive` and `baseColor` according to +the blending mode specified by the `postLightingBlending` material option. + +Figure [materialUnlit] shows an example of the unlit material model +(click on the image to see a larger version). + +![Figure [materialUnlit]: The unlit model is used to render debug information](images/screenshot_unlit.jpg) + +## Specular glossiness + +This alternative lighting model exists to comply with legacy standards. Since it is not a +physically-based formulation, we do not recommend using it except when loading legacy assets. + +This model encompasses the parameters previously defined for the standard lit mode except for +_metallic_, _reflectance_, and _roughness_. It adds parameters for _specularColor_ and _glossiness_. + +Parameter | Definition +---------------------:|:--------------------- +**baseColor** | Surface diffuse color +**specularColor** | Specular tint (defaults to black) +**glossiness** | Glossiness (defaults to 0.0) +[Table [glossinessProperties]: Properties of the specular-glossiness shading model] + +The type and range of each property is described in table [glossinessPropertiesTypes]. + + Property | Type | Range | Note +---------------------:|:--------:|:------------------------:|:------------------------- +**baseColor** | float4 | [0..1] | Pre-multiplied linear RGB +**specularColor** | float3 | [0..1] | Linear RGB +**glossiness** | float | [0..1] | Inverse of roughness +[Table [glossinessPropertiesTypes]: Range and type of the specular-glossiness model's properties] + +# Material definitions + +A material definition is a text file that describes all the information required by a material: + +- Name +- User parameters +- Material model +- Required attributes +- Interpolants (called _variables_) +- Raster state (blending mode, etc.) +- Shader code (fragment shader, optionally vertex shader) + +## Format + +The material definition format is a format loosely based on [JSON](https://www.json.org/) that we +call _JSONish_. At the top level a material definition is composed of 3 different blocks that use +the JSON object notation: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + // material properties +} + +vertex { + // vertex shader, optional +} + +fragment { + // fragment shader +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A minimum viable material definition must contain a `material` preamble and a `fragment` block. The +`vertex` block is optional. + +### Differences with JSON + +In JSON, an object is made of key/value _pairs_. A JSON pair has the following syntax: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +"key" : value +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Where value can be a string, number, object, array or a literal (`true`, `false` or `null`). While +this syntax is perfectly valid in a material definition, a variant without quotes around strings is +also accepted in JSONish: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +key : value +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Quotes remain mandatory when the string contains spaces. + +The `vertex` and `fragment` blocks contain unescaped, unquoted GLSL code, which is not valid in JSON. + +Single-line C++-style comments are allowed. + +The key of a pair is case-sensitive. + +The value of a pair is not case-sensitive. + +### Example + +The following code listing shows an example of a valid material definition. This definition uses +the _lit_ material model (see Lit model section), uses the default opaque blending mode, requires +that a set of UV coordinates be presented in the rendered mesh and defines 3 user parameters. The +following sections of this document describe the `material` and `fragment` blocks in detail. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + name : "Textured material", + parameters : [ + { + type : sampler2d, + name : texture + }, + { + type : float, + name : metallic + }, + { + type : float, + name : roughness + } + ], + requires : [ + uv0 + ], + shadingModel : lit, + blending : opaque +} + +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + material.baseColor = texture(materialParams_texture, getUV0()); + material.metallic = materialParams.metallic; + material.roughness = materialParams.roughness; + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +## Material block + +The material block is mandatory block that contains a list of property pairs to describe all +non-shader data. + +### General: name + +Type +: `string` + +Value +: Any string. Double quotes are required if the name contains spaces. + +Description +: Sets the name of the material. The name is retained at runtime for debugging purpose. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + name : stone +} + +material { + name : "Wet pavement" +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### General: featureLevel + +Type +: `number` + +Value +: An integer value, either 1, 2 or 3. Defaults to 1. + + Feature Level | Guaranteed features +:----------------------|:--------------------------------- +1 | 9 textures per material +2 | 9 textures per material, cubemap arrays, ESSL 3.10 +3 | 12 textures per material, cubemap arrays, ESSL 3.10 +[Table [featureLevels]: Feature levels] + +Description +: Sets the feature level of the material. Each feature level defines a set of features the + material can use. If the material uses a feature not supported by the selected level, `matc` + will generate an error during compilation. A given feature level is guaranteed to support + all features of lower feature levels. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + featureLevel : 2 +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Bugs +: `matc` doesn't verify that a material is not using features above its selected feature level. + + +### General: shadingModel + +Type +: `string` + +Value +: Any of `lit`, `subsurface`, `cloth`, `unlit`, `specularGlossiness`. Defaults to `lit`. + +Description +: Selects the material model as described in the Material models section. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + shadingModel : unlit +} + +material { + shadingModel : "subsurface" +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### General: parameters + +Type +: array of parameter objects + +Value +: Each entry is an object with the properties `name` and `type`, both of `string` type. The + name must be a valid GLSL identifier. Entries also have an optional `precision`, which can be + one of `default` (best precision for the platform, typically `high` on desktop, `medium` on + mobile), `low`, `medium`, `high`. The type must be one of the types described in + table [materialParamsTypes]. + + Type | Description +:----------------------|:--------------------------------- +bool | Single boolean +bool2 | Vector of 2 booleans +bool3 | Vector of 3 booleans +bool4 | Vector of 4 booleans +float | Single float +float2 | Vector of 2 floats +float3 | Vector of 3 floats +float4 | Vector of 4 floats +int | Single integer +int2 | Vector of 2 integers +int3 | Vector of 3 integers +int4 | Vector of 4 integers +uint | Single unsigned integer +uint2 | Vector of 2 unsigned integers +uint3 | Vector of 3 unsigned integers +uint4 | Vector of 4 unsigned integers +float3x3 | Matrix of 3x3 floats +float4x4 | Matrix of 4x4 floats +sampler2d | 2D texture +sampler2dArray | Array of 2D textures +samplerExternal | External texture (platform-specific) +samplerCubemap | Cubemap texture +[Table [materialParamsTypes]: Material parameter types] + +Samplers +: Sampler types can also specify a `format` which can be either `int` or `float` (defaults to + `float`). + +Arrays +: A parameter can define an array of values by appending `[size]` after the type name, where + `size` is a positive integer. For instance: `float[9]` declares an array of nine `float` + values. This syntax does not apply to samplers as arrays are treated as separate types. + +Description +: Lists the parameters required by your material. These parameters can be set at runtime using + Filament's material API. Accessing parameters from the shaders varies depending on the type of + parameter: + + - **Samplers types**: use the parameter name prefixed with `materialParams_`. For instance, + `materialParams_myTexture`. + - **Other types**: use the parameter name as the field of a structure called `materialParams`. + For instance, `materialParams.myColor`. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + parameters : [ + { + type : float4, + name : albedo + }, + { + type : sampler2d, + format : float, + precision : high, + name : roughness + }, + { + type : float2, + name : metallicReflectance + } + ], + requires : [ + uv0 + ], + shadingModel : lit, +} + +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + material.baseColor = materialParams.albedo; + material.roughness = texture(materialParams_roughness, getUV0()); + material.metallic = materialParams.metallicReflectance.x; + material.reflectance = materialParams.metallicReflectance.y; + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### General: constants + +Type +: array of constant objects + +Value +: Each entry is an object with the properties `name` and `type`, both of `string` type. The name + must be a valid GLSL identifier. Entries also have an optional `default`, which can either be a + `bool` or `number`, depending on the `type` of the constant. The type must be one of the types + described in table [materialConstantsTypes]. + + Type | Description | Default +:----------------------|:-----------------------------------------|:------------------ +int | A signed, 32 bit GLSL int | 0 +float | A single-precision GLSL float | 0.0 +bool | A GLSL bool | false +[Table [materialConstantsTypes]: Material constants types] + +Description +: Lists the constant parameters accepted by your material. These constants can be set, or + "specialized", at runtime when loading a material package. Multiple materials can be loaded from + the same material package with differing constant parameter specializations. Once a material is + loaded from a material package, its constant parameters cannot be changed. Compared to regular + parameters, constant parameters allow the compiler to generate more efficient code. Access + constant parameters from the shader by prefixing the name with `materialConstant_`. For example, + a constant parameter named `myConstant` is accessed in the shader as + `materialConstant_myConstant`. If a constant parameter is not set at runtime, the default is + used. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + constants : [ + { + name : overrideAlpha, + type : bool + }, + { + name : customAlpha, + type : float, + default : 0.5 + } + ], + shadingModel : lit, + blending : transparent, +} + +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + if (materialConstants_overrideAlpha) { + material.baseColor.a = materialConstants_customAlpha; + material.baseColor.rgb *= material.baseColor.a; + } + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### General: variantFilter + +Type +: array of `string` + +Value +: Each entry must be any of `dynamicLighting`, `directionalLighting`, `shadowReceiver`, + `skinning`, `ssr`, or `stereo`. + +Description +: Used to specify a list of shader variants that the application guarantees will never be + needed. These shader variants are skipped during the code generation phase, thus reducing + the overall size of the material. + Note that some variants may automatically be filtered out. For instance, all lighting related + variants (`directionalLighting`, etc.) are filtered out when compiling an `unlit` material. + Use the variant filter with caution, filtering out a variant required at runtime may lead + to crashes. + +Description of the variants: +- `directionalLighting`, used when a directional light is present in the scene +- `dynamicLighting`, used when a non-directional light (point, spot, etc.) is present in the scene +- `shadowReceiver`, used when an object can receive shadows +- `skinning`, used when an object is animated using GPU skinning +- `fog`, used when global fog is applied to the scene +- `vsm`, used when VSM shadows are enabled and the object is a shadow receiver +- `ssr`, used when screen-space reflections are enabled in the View +- `stereo`, used when stereoscopic rendering is enabled in the View + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + name : "Invisible shadow plane", + shadingModel : unlit, + shadowMultiplier : true, + blending : transparent, + variantFilter : [ skinning ] +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### General: flipUV + +Type +: `boolean` + +Value +: `true` or `false`. Defaults to `true`. + +Description +: When set to `true` (default value), the Y coordinate of UV attributes will be flipped when + read by this material's vertex shader. Flipping is equivalent to `y = 1.0 - y`. When set + to `false`, flipping is disabled and the UV attributes are read as is. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + flipUV : false +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### General: quality + +Type +: `string` + +Value +: Any of `low`, `normal`, `high`, `default`. Defaults to `default`. + +Description +: Set some global quality parameters of the material. `low` enables optimizations that can + slightly affect correctness and is the default on mobile platforms. `normal` does not affect + correctness and is otherwise similar to `low`. `high` enables quality settings that can + adversely affect performance and is the default on desktop platforms. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + quality : default +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### General: instanced + +Type +: `boolean` + +Value +: `true` or `false`. Defaults to `false`. + +Description +: Allows a material to access the instance index (i.e.: **`gl_InstanceIndex`**) of instanced + primitives using `getInstanceIndex()` in the material's shader code. Never use + **`gl_InstanceIndex`** directly. This is typically used with + `RenderableManager::Builder::instances()`. `getInstanceIndex()` is available in both the + vertex and fragment shader. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + instanced : true +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### General: vertexDomainDeviceJittered + +Type +: `boolean` + +Value +: `true` or `false`. Defaults to `false`. + +Description +: Only meaningful for `vertexDomain:Device` materials, this parameter specifies whether the + filament clip-space transforms need to be applied or not, which affects TAA and guard bands. + Generally it needs to be applied because by definition `vertexDomain:Device` materials + vertices are not transformed and used *as is*. + However, if the vertex shader uses for instance `getViewFromClipMatrix()` (or other + matrices based on the projection), the clip-space transform is already applied. + Setting this parameter incorrectly can prevent TAA or the guard bands to work correctly. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + vertexDomainDeviceJittered : true +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Vertex and attributes: requires + +Type +: array of `string` + +Value +: Each entry must be any of `uv0`, `uv1`, `color`, `position`, `tangents`, `custom0` + through `custom7`. + +Description +: Lists the vertex attributes required by the material. The `position` attribute is always + required and does not need to be specified. The `tangents` attribute is automatically required + when selecting any shading model that is not `unlit`. See the shader sections of this document + for more information on how to access these attributes from the shaders. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + parameters : [ + { + type : sampler2d, + name : texture + }, + ], + requires : [ + uv0, + custom0 + ], + shadingModel : lit, +} + +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + material.baseColor = texture(materialParams_texture, getUV0()); + material.baseColor.rgb *= getCustom0().rgb; + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Vertex and attributes: variables + +Type +: array of `string` + +Value +: Up to 4 strings, each must be a valid GLSL identifier. + +Description +: Defines custom interpolants (or variables) that are output by the material's vertex shader. + Each entry of the array defines the name of an interpolant. The full name in the fragment + shader is the name of the interpolant with the `variable_` prefix. For instance, if you + declare a variable called `eyeDirection` you can access it in the fragment shader using + `variable_eyeDirection`. In the vertex shader, the interpolant name is simply a member of + the `MaterialVertexInputs` structure (`material.eyeDirection` in your example). Each + interpolant is of type `float4` (`vec4`) in the shaders. By default the precision of the + interpolant is `highp` in *both* the vertex and fragment shaders. + An alternate syntax can be used to specify both the name and precision of the interpolant. + In this case the specified precision is used as-is in both fragment and vertex stages, in + particular if `default` is specified the default precision is used is the fragment shader + (`mediump`) and in the vertex shader (`highp`). + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + name : Skybox, + parameters : [ + { + type : samplerCubemap, + name : skybox + } + ], + variables : [ + eyeDirection, + { + name : eyeColor, + precision : medium + } + ], + vertexDomain : device, + depthWrite : false, + shadingModel : unlit +} + +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + float3 sky = texture(materialParams_skybox, variable_eyeDirection.xyz).rgb; + material.baseColor = vec4(sky, 1.0); + } +} + +vertex { + void materialVertex(inout MaterialVertexInputs material) { + float3 p = getPosition().xyz; + float3 u = mulMat4x4Float3(getViewFromClipMatrix(), p).xyz; + material.eyeDirection.xyz = mulMat3x3Float3(getWorldFromViewMatrix(), u); + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Vertex and attributes: vertexDomain + +Type +: `string` + +Value +: Any of `object`, `world`, `view`, `device`. Defaults to `object`. + +Description +: Defines the domain (or coordinate space) of the rendered mesh. The domain influences how the + vertices are transformed in the vertex shader. The possible domains are: + + - **Object**: the vertices are defined in the object (or model) coordinate space. The + vertices are transformed using the rendered object's transform matrix + - **World**: the vertices are defined in world coordinate space. The vertices are not + transformed using the rendered object's transform. + - **View**: the vertices are defined in view (or eye or camera) coordinate space. The + vertices are not transformed using the rendered object's transform. + - **Device**: the vertices are defined in normalized device (or clip) coordinate space. + The vertices are not transformed using the rendered object's transform. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + vertexDomain : device +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Vertex and attributes: interpolation + +Type +: `string` + +Value +: Any of `smooth`, `flat`. Defaults to `smooth`. + +Description +: Defines how interpolants (or variables) are interpolated between vertices. When this property + is set to `smooth`, a perspective correct interpolation is performed on each interpolant. + When set to `flat`, no interpolation is performed and all the fragments within a given + triangle will be shaded the same. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + interpolation : flat +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Blending and transparency: blending + +Type +: `string` + +Value +: Any of `opaque`, `transparent`, `fade`, `add`, `masked`, `multiply`, `screen`, `custom`. Defaults to `opaque`. + +Description +: Defines how/if the rendered object is blended with the content of the render target. + The possible blending modes are: + + - **Opaque**: blending is disabled, the alpha channel of the material's output is ignored. + - **Transparent**: blending is enabled. The material's output is alpha composited with the + render target, using Porter-Duff's `source over` rule. This blending mode assumes + pre-multiplied alpha. + - **Fade**: acts as `transparent` but transparency is also applied to specular lighting. In + `transparent` mode, the material's alpha values only applies to diffuse lighting. This + blending mode is useful to fade lit objects in and out. + - **Add**: blending is enabled. The material's output is added to the content of the + render target. + - **Multiply**: blending is enabled. The material's output is multiplied with the content of the + render target, darkening the content. + - **Screen**: blending is enabled. Effectively the opposite of the `multiply`, the content of the + render target is brightened. + - **Masked**: blending is disabled. This blending mode enables alpha masking. The alpha channel + of the material's output defines whether a fragment is discarded or not. Additionally, + ALPHA_TO_COVERAGE is enabled for non-translucent views. See the maskThreshold section for more + information. + - **Custom**: blending is enabled. But the blending function is user specified. See `blendFunction`. + +!!! Note + When `blending` is set to `masked`, alpha to coverage is automatically enabled for the material. + If this behavior is undesirable, refer to the Rasterization: alphaToCoverage section to turn + alpha to coverage off using the `alphaToCoverage` property. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + blending : transparent +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Blending and transparency: blendFunction + +Type +: `object` + +Fields +: `srcRGB`, `srcA`, `dstRGB`, `dstA` + +Description +: - *srcRGB*: source function applied to the RGB channels + - *srcA*: source function applied to the alpha channel + - *srcRGB*: destination function applied to the RGB channels + - *srcRGB*: destination function applied to the alpha channel + The values possible for each functions are one of `zero`, `one`, `srcColor`, `oneMinusSrcColor`, + `dstColor`, `oneMinusDstColor`, `srcAlpha`, `oneMinusSrcAlpha`, `dstAlpha`, + `oneMinusDstAlpha`, `srcAlphaSaturate` + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + blending : custom, + blendFunction : + { + srcRGB: one, + srcA: one, + dstRGB: oneMinusSrcColor, + dstA: oneMinusSrcAlpha + } + } +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Blending and transparency: postLightingBlending + +Type +: `string` + +Value +: Any of `opaque`, `transparent`, `add`. Defaults to `transparent`. + +Description +: Defines how the `postLightingColor` material property is blended with the result of the + lighting computations. The possible blending modes are: + + - **Opaque**: blending is disabled, the material will output `postLightingColor` directly. + - **Transparent**: blending is enabled. The material's computed color is alpha composited with + the `postLightingColor`, using Porter-Duff's `source over` rule. This blending mode assumes + pre-multiplied alpha. + - **Add**: blending is enabled. The material's computed color is added to `postLightingColor`. + - **Multiply**: blending is enabled. The material's computed color is multiplied with `postLightingColor`. + - **Screen**: blending is enabled. The material's computed color is inverted and multiplied with `postLightingColor`, + and the result is added to the material's computed color. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + postLightingBlending : add +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Blending and transparency: transparency + +Type +: `string` + +Value +: Any of `default`, `twoPassesOneSide` or `twoPassesTwoSides`. Defaults to `default`. + +Description +: Controls how transparent objects are rendered. It is only valid when the `blending` mode is + not `opaque` and `refractionMode` is `none`. None of these methods can accurately render + concave geometry, but in practice they are often good enough. + +The three possible transparency modes are: +- `default`: the transparent object is rendered normally (as seen in figure [transparencyDefault]), + honoring the `culling` mode, etc. +- `twoPassesOneSide`: the transparent object is first rendered in the depth buffer, then again in + the color buffer, honoring the `culling` mode. This effectively renders only half of the + transparent object as shown in figure [transparencyTwoPassesOneSide]. +- `twoPassesTwoSides`: the transparent object is rendered twice in the color buffer: first with its + back faces, then with its front faces. This mode lets you render both set of faces while reducing + or eliminating sorting issues, as shown in figure [transparencyTwoPassesTwoSides]. + `twoPassesTwoSides` can be combined with `doubleSided` for better effect. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + transparency : twoPassesOneSide +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +![Figure [transparencyDefault]: This double sided model shows the type of sorting issues transparent +objects can be subject to in `default` mode](images/screenshot_transparency_default.png) + +![Figure [transparencyTwoPassesOneSide]: In `twoPassesOneSide` mode, only one set of faces is visible +and correctly sorted](images/screenshot_twopasses_oneside.png) + +![Figure [transparencyTwoPassesTwoSides]: In `twoPassesTwoSides` mode, both set of faces are visible +and sorting issues are minimized or eliminated](images/screenshot_twopasses_twosides.png) + +### Blending and transparency: maskThreshold + +Type +: `number` + +Value +: A value between `0.0` and `1.0`. Defaults to `0.4`. + +Description +: Sets the minimum alpha value a fragment must have to not be discarded when the `blending` mode + is set to `masked`. If the fragment is not discarded, its source alpha is set to 1. When the + blending mode is not `masked`, this value is ignored. This value can be used to controlled the + appearance of alpha-masked objects. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + blending : masked, + maskThreshold : 0.5 +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Blending and transparency: refractionMode + +Type +: `string` + +Value +: Any of `none`, `cubemap`, `screenspace`. Defaults to `none`. + +Description +: Activates refraction when set to anything but `none`. A value of `cubemap` will only use the + IBL cubemap as source of refraction, while this is significantly more efficient, no scene + objects will be refracted, only the distant environment encoded in the cubemap. This mode is + adequate for an object viewer for instance. A value of `screenspace` will employ the more + advanced screen-space refraction algorithm which allows opaque objects in the scene to be + refracted. In `cubemap` mode, refracted rays are assumed to emerge from the center of the + object and the `thickness` parameter is only used for computing the absorption, but has no + impact on the refraction itself. In `screenspace` mode, refracted rays are assumed to travel + parallel to the view direction when they exit the refractive medium. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + refractionMode : cubemap, +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Blending and transparency: refractionType + +Type +: `string` + +Value +: Any of `solid`, `thin`. Defaults to `solid`. + +Description +: This is only meaningful when `refractionMode` is set to anything but `none`. `refractionType` + defines the refraction model used. `solid` is used for thick objects such as a crystal ball, + an ice cube or as sculpture. `thin` is used for thin objects such as a window, an ornament + ball or a soap bubble. In `solid` mode all refracive objects are assumed to be a sphere + tangent to the entry point and of radius `thickness`. In `thin` mode, all refractive objects + are assumed to be flat and thin and of thickness `thickness`. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + refractionMode : cubemap, + refractionType : thin, +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Rasterization: culling + +Type +: `string` + +Value +: Any of `none`, `front`, `back`, `frontAndBack`. Defaults to `back`. + +Description +: Defines which triangles should be culled: none, front-facing triangles, back-facing + triangles or all. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + culling : none +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Rasterization: colorWrite + +Type +: `boolean` + +Value +: `true` or `false`. Defaults to `true`. + +Description +: Enables or disables writes to the color buffer. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + colorWrite : false +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Rasterization: depthWrite + +Type +: `boolean` + +Value +: `true` or `false`. Defaults to `true` for opaque materials, `false` for transparent materials. + +Description +: Enables or disables writes to the depth buffer. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + depthWrite : false +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Rasterization: depthCulling + +Type +: `boolean` + +Value +: `true` or `false`. Defaults to `true`. + +Description +: Enables or disables depth testing. When depth testing is disabled, an object rendered with + this material will always appear on top of other opaque objects. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + depthCulling : false +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Rasterization: doubleSided + +Type +: `boolean` + +Value +: `true` or `false`. Defaults to `false`. + +Description +: Enables two-sided rendering and its capability to be toggled at run time. When set to `true`, + `culling` is automatically set to `none`; if the triangle is back-facing, the triangle's + normal is flipped to become front-facing. When explicitly set to `false`, this allows the + double-sidedness to be toggled at run time. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + name : "Double sided material", + shadingModel : lit, + doubleSided : true +} + +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + material.baseColor = materialParams.albedo; + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Rasterization: alphaToCoverage + +Type +: `boolean` + +Value +: `true` or `false`. Defaults to `false`. + +Description +: Enables or disables alpha to coverage. When alpha to coverage is enabled, the coverage of + fragment is derived from its alpha. This property is only meaningful when MSAA is enabled. + Note: setting `blending` to `masked` automatically enables alpha to coverage. If this is not + desired, you can override this behavior by setting alpha to coverage to false as in the + example below. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + name : "Alpha to coverage", + shadingModel : lit, + blending : masked, + alphaToCoverage : false +} + +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + material.baseColor = materialParams.albedo; + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Lighting: reflections + +Type +: `string` + +Value +: `default` or `screenspace`. Defaults to `default`. + +Description +: Controls the source of specular reflections for this material. When this property is set to + `default`, reflections only come image-based lights. When this property is set to + `screenspace`, reflections come from the screen space's color buffer in addition to + image-based lights. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + name : "Glossy metal", + reflections : screenspace +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Lighting: shadowMultiplier + +Type +: `boolean` + +Value +: `true` or `false`. Defaults to `false`. + +Description +: Only available in the `unlit` shading model. If this property is enabled, the final color + computed by the material is multiplied by the shadowing factor (or visibility). This allows to + create transparent shadow-receiving objects (for instance an invisible ground plane in AR). + This is only supported with shadows from directional lights. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + name : "Invisible shadow plane", + shadingModel : unlit, + shadowMultiplier : true, + blending : transparent +} + +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + // baseColor defines the color and opacity of the final shadow + material.baseColor = vec4(0.0, 0.0, 0.0, 0.7); + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Lighting: transparentShadow + +Type +: `boolean` + +Value +: `true` or `false`. Defaults to `false`. + +Description +: Enables transparent shadows on this material. When this feature is enabled, Filament emulates + transparent shadows using a dithering pattern: they work best with variance shadow maps (VSM) + and blurring enabled. The opacity of the shadow derives directly from the alpha channel of + the material's `baseColor` property. Transparent shadows can be enabled on opaque objects, + making them compatible with refractive/transmissive objects that are otherwise considered + opaque. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + name : "Clear plastic with stickers", + transparentShadow : true, + blending : transparent, + // ... +} + +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + material.baseColor = texture(materialParams_baseColor, getUV0()); + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +![Figure [transparentShadow]: Objects rendered with transparent shadows and blurry VSM with a +radius of 4. Model [Bottle of Water](https://sketchfab.com/3d-models/bottle-of-water-48fd4f6e90d84d89b5740ee78587d0ff) +by [T-Art](https://sketchfab.com/person-x).](images/screenshot_transparent_shadows.jpg) + +### Lighting: clearCoatIorChange + +Type +: `boolean` + +Value +: `true` or `false`. Defaults to `true`. + +Description +: When adding a clear coat layer, the change in index of refraction (IoR) is taken into account + to modify the specular color of the base layer. This appears to darken `baseColor`. When this + effect is disabled, `baseColor` is left unmodified. See figure [clearCoatIorChange] for an + example of how this property can affect a red metallic base layer. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + clearCoatIorChange : false +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +![Figure [clearCoatIorChange]: The same rough metallic ball with a clear coat layer rendered +with `clearCoatIorChange` enabled (left) and disabled +(right).](images/screenshot_clear_coat_ior_change.jpg) + +### Lighting: multiBounceAmbientOcclusion + +Type +: `boolean` + +Value +: `true` or `false`. Defaults to `false` on mobile, `true` on desktop. + +Description +: Multi-bounce ambient occlusion takes into account interreflections when applying ambient + occlusion to image-based lighting. Turning this feature on avoids over-darkening occluded + areas. It also takes the surface color into account to generate colored ambient occlusion. + Figure [multiBounceAO] compares the ambient occlusion term of a surface with and without + multi-bounce ambient occlusion. Notice how multi-bounce ambient occlusion introduces color + in the occluded areas. Figure [multiBounceAOAnimated] toggles between multi-bounce ambient + occlusion on and off on a lit brick material to highlight the effects of this property. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + multiBounceAmbientOcclusion : true +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +![Figure [multiBounceAO]: Brick texture amient occlusion map rendered with multi-bounce ambient +occclusion enabled (left) and disabled (right).](images/screenshot_multi_bounce_ao.jpg) + +![Figure [multiBounceAOAnimated]: Brick texture rendered with multi-bounce ambient +occclusion enabled and disabled.](images/screenshot_multi_bounce_ao.gif) + +### Lighting: specularAmbientOcclusion + +Type +: `string` + +Value +: `none`, `simple` or `bentNormals`. Defaults to `none` on mobile, `simple` on desktop. For + compatibility reasons, `true` and `false` are also accepted and map respectively to `simple` + and `none`. + +Description +: Static ambient occlusion maps and dynamic ambient occlusion (SSAO, etc.) apply to diffuse + indirect lighting. When setting this property to other than `none`, a new ambient occlusion + term is derived from the surface roughness and applied to specular indirect lighting. + This effect helps remove unwanted specular reflections as shown in figure [specularAO]. + When this value is set to `simple`, Filament uses a cheap but approximate method of computing + the specular ambient occlusion term. If this value is set to `bentNormals`, Filament will use + a much more accurate but much more expensive method. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + specularAmbientOcclusion : simple +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +![Figure [specularAO]: Comparison of specular ambient occlusion on and off. The effect is +particularly visible under the hose.](images/screenshot_specular_ao.gif) + +### Anti-aliasing: specularAntiAliasing + +Type +: `boolean` + +Value +: `true` or `false`. Defaults to `false`. + +Description +: Reduces specular aliasing and preserves the shape of specular highlights as an object moves + away from the camera. This anti-aliasing solution is particularly effective on glossy materials + (low roughness) but increases the cost of the material. The strength of the anti-aliasing + effect can be controlled using two other properties: `specularAntiAliasingVariance` and + `specularAntiAliasingThreshold`. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + specularAntiAliasing : true +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Anti-aliasing: specularAntiAliasingVariance + +Type +: `float` + +Value +: A value between 0 and 1, set to 0.15 by default. + +Description +: Sets the screen space variance of the filter kernel used when applying specular anti-aliasing. + Higher values will increase the effect of the filter but may increase roughness in unwanted + areas. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + specularAntiAliasingVariance : 0.2 +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Anti-aliasing: specularAntiAliasingThreshold + +Type +: `float` + +Value +: A value between 0 and 1, set to 0.2 by default. + +Description +: Sets the clamping threshold used to suppress estimation errors when applying specular + anti-aliasing. When set to 0, specular anti-aliasing is disabled. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + specularAntiAliasingThreshold : 0.1 +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Shading: customSurfaceShading + +Type +: `bool` + +Value +: `true` or `false`. Defaults to `false`. + +Description +: Enables custom surface shading when set to true. When surface shading is enabled, the fragment + shader must provide an extra function that will be invoked for every light in the scene that + may influence the current fragment. Please refer to the Custom surface shading section below + for more information. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + customSurfaceShading : true +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +## Vertex block + +The vertex block is optional and can be used to control the vertex shading stage of the material. +The vertex block must contain valid +[ESSL 3.0](https://www.khronos.org/registry/OpenGL/specs/es/3.0/GLSL_ES_Specification_3.00.pdf) code +(the version of GLSL supported in OpenGL ES 3.0). You are free to create multiple functions inside +the vertex block but you **must** declare the `materialVertex` function: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GLSL +vertex { + void materialVertex(inout MaterialVertexInputs material) { + // vertex shading code + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This function will be invoked automatically at runtime by the shading system and gives you the +ability to read and modify material properties using the `MaterialVertexInputs` structure. This full +definition of the structure can be found in the Material vertex inputs section. + +You can use this structure to compute your custom variables/interpolants or to modify the value of +the attributes. For instance, the following vertex blocks modifies both the color and the UV +coordinates of the vertex over time: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GLSL +material { + requires : [uv0, color] +} +vertex { + void materialVertex(inout MaterialVertexInputs material) { + material.color *= sin(getUserTime().x); + material.uv0 *= sin(getUserTime().x); + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In addition to the `MaterialVertexInputs` structure, your vertex shading code can use all the public +APIs listed in the Shader public APIs section. + +### Material vertex inputs + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GLSL +struct MaterialVertexInputs { + float4 color; // if the color attribute is required + float2 uv0; // if the uv0 attribute is required + float2 uv1; // if the uv1 attribute is required + float3 worldNormal; // only if the shading model is not unlit + float4 worldPosition; // always available (see note below about world-space) + + mat4 clipSpaceTransform; // default: identity, transforms the clip-space position, only available for `vertexDomain:device` + + // variable* names are replaced with actual names + float4 variable0; // if 1 or more variables is defined + float4 variable1; // if 2 or more variables is defined + float4 variable2; // if 3 or more variables is defined + float4 variable3; // if 4 or more variables is defined +}; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +!!! TIP: worldPosition + To achieve good precision, the `worldPosition` coordinate in the vertex shader is shifted by the + camera position. To get the true world-space position, users can use + `getUserWorldPosition()`, however be aware that the true world-position might not + be able to fit in a `float` or might be represented with severely reduced precision. + +!!! TIP: UV attributes + By default the vertex shader of a material will flip the Y coordinate of the UV attributes + of the current mesh: `material.uv0 = vec2(mesh_uv0.x, 1.0 - mesh_uv0.y)`. You can control + this behavior using the `flipUV` property and setting it to `false`. + +### Custom vertex attributes + +You can use up to 8 custom vertex attributes, all of type `float4`. These attributes can be accessed +using the vertex block shader functions `getCustom0()` to `getCustom7()`. However, before using +custom attributes, you *must* declare those attributes as required in the `requires` property of +the material: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JSON +material { + requires : [ + custom0, + custom1, + custom2 + ] +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +## Fragment block + +The fragment block must be used to control the fragment shading stage of the material. The fragment +block must contain valid +[ESSL 3.0](https://www.khronos.org/registry/OpenGL/specs/es/3.0/GLSL_ES_Specification_3.00.pdf) +code (the version of GLSL supported in OpenGL ES 3.0). You are free to create multiple functions +inside the fragment block but you **must** declare the `material` function: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GLSL +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + // fragment shading code + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This function will be invoked automatically at runtime by the shading system and gives you the +ability to read and modify material properties using the `MaterialInputs` structure. This full +definition of the structure can be found in the Material fragment inputs section. The full +definition of the various members of the structure can be found in the Material models section +of this document. + +The goal of the `material()` function is to compute the material properties specific to the selected +shading model. For instance, here is a fragment block that creates a glossy red metal using the +standard lit shading model: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GLSL +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + material.baseColor.rgb = vec3(1.0, 0.0, 0.0); + material.metallic = 1.0; + material.roughness = 0.0; + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### prepareMaterial function + +Note that you **must** call `prepareMaterial(material)` before exiting the `material()` function. +This `prepareMaterial` function sets up the internal state of the material model. Some of the APIs +described in the Fragment APIs section - like `shading_normal` for instance - can only be accessed +_after_ invoking `prepareMaterial()`. + +It is also important to remember that the `normal` property - as described in the Material fragment +inputs section - only has an effect when modified _before_ calling `prepareMaterial()`. Here is an +example of a fragment shader that properly modifies the `normal` property to implement a glossy red +plastic with bump mapping: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GLSL +fragment { + void material(inout MaterialInputs material) { + // fetch the normal in tangent space + vec3 normal = texture(materialParams_normalMap, getUV0()).xyz; + material.normal = normal * 2.0 - 1.0; + + // prepare the material + prepareMaterial(material); + + // from now on, shading_normal, etc. can be accessed + material.baseColor.rgb = vec3(1.0, 0.0, 0.0); + material.metallic = 0.0; + material.roughness = 1.0; + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Material fragment inputs + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GLSL +struct MaterialInputs { + float4 baseColor; // default: float4(1.0) + float4 emissive; // default: float4(0.0, 0.0, 0.0, 1.0) + float4 postLightingColor; // default: float4(0.0) + + // no other field is available with the unlit shading model + float roughness; // default: 1.0 + float metallic; // default: 0.0, not available with cloth or specularGlossiness + float reflectance; // default: 0.5, not available with cloth or specularGlossiness + float ambientOcclusion; // default: 0.0 + + // not available when the shading model is subsurface or cloth + float3 sheenColor; // default: float3(0.0) + float sheenRoughness; // default: 0.0 + float clearCoat; // default: 1.0 + float clearCoatRoughness; // default: 0.0 + float3 clearCoatNormal; // default: float3(0.0, 0.0, 1.0) + float anisotropy; // default: 0.0 + float3 anisotropyDirection; // default: float3(1.0, 0.0, 0.0) + + // only available when the shading model is subsurface or refraction is enabled + float thickness; // default: 0.5 + + // only available when the shading model is subsurface + float subsurfacePower; // default: 12.234 + float3 subsurfaceColor; // default: float3(1.0) + + // only available when the shading model is cloth + float3 sheenColor; // default: sqrt(baseColor) + float3 subsurfaceColor; // default: float3(0.0) + + // only available when the shading model is specularGlossiness + float3 specularColor; // default: float3(0.0) + float glossiness; // default: 0.0 + + // not available when the shading model is unlit + // must be set before calling prepareMaterial() + float3 normal; // default: float3(0.0, 0.0, 1.0) + + // only available when refraction is enabled + float transmission; // default: 1.0 + float3 absorption; // default float3(0.0, 0.0, 0.0) + float ior; // default: 1.5 + float microThickness; // default: 0.0, not available with refractionType "solid" +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Custom surface shading + +When `customSurfaceShading` is set to `true` in the material block, the fragment block **must** +declare and implement the `surfaceShading` function: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GLSL +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + // prepare material inputs + } + + vec3 surfaceShading( + const MaterialInputs materialInputs, + const ShadingData shadingData, + const LightData lightData + ) { + return vec3(1.0); // output of custom lighting + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This function will be invoked for every light (directional, spot or point) in the scene that may +influence the current fragment. The `surfaceShading` is invoked with 3 sets of data: + +- `MaterialInputs`, as described in the Material fragment inputs section and prepared in the + `material` function explained above +- `ShadingData`, a structure containing values derived from `MaterialInputs` (see below) +- `LightData`, a structure containing values specific to the light being currently + evaluated (see below) + +The `surfaceShading` function must return an RGB color in linear sRGB. Alpha blending and alpha +masking are handled outside of this function and must therefore be ignored. + +!!! Note: About shadowed fragments + The `surfaceShading` function is invoked even when a fragment is known to be fully in the shadow + of the current light (`lightData.NdotL <= 0.0` or `lightData.visibility <= 0.0`). This gives + more flexibility to the `surfaceShading` function as it provides a simple way to handle constant + ambient lighting for instance. + +!!! Warning: Shading models + Custom surface shading only works with the `lit` shading model. Attempting to use any other + model will result in an error. + +#### Shading data structure + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GLSL +struct ShadingData { + // The material's diffuse color, as derived from baseColor and metallic. + // This color is pre-multiplied by alpha and in the linear sRGB color space. + vec3 diffuseColor; + + // The material's specular color, as derived from baseColor and metallic. + // This color is pre-multiplied by alpha and in the linear sRGB color space. + vec3 f0; + + // The perceptual roughness is the roughness value set in MaterialInputs, + // with extra processing: + // - Clamped to safe values + // - Filtered if specularAntiAliasing is enabled + // This value is between 0.0 and 1.0. + float perceptualRoughness; + + // The roughness value expected by BRDFs. This value is the square of + // perceptualRoughness. This value is between 0.0 and 1.0. + float roughness; +}; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +#### Light data structure + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GLSL +struct LightData { + // The color (.rgb) and pre-exposed intensity (.w) of the light. + // The color is an RGB value in the linear sRGB color space. + // The pre-exposed intensity is the intensity of the light multiplied by + // the camera's exposure value. + vec4 colorIntensity; + + // The normalized light vector, in world space (direction from the + // current fragment's position to the light). + vec3 l; + + // The dot product of the shading normal (with normal mapping applied) + // and the light vector. This value is equal to the result of + // saturate(dot(getWorldSpaceNormal(), lightData.l)). + // This value is always between 0.0 and 1.0. When the value is <= 0.0, + // the current fragment is not visible from the light and lighting + // computations can be skipped. + float NdotL; + + // The position of the light in world space. + vec3 worldPosition; + + // Attenuation of the light based on the distance from the current + // fragment to the light in world space. This value between 0.0 and 1.0 + // is computed differently for each type of light (it's always 1.0 for + // directional lights). + float attenuation; + + // Visibility factor computed from shadow maps or other occlusion data + // specific to the light being evaluated. This value is between 0.0 and + // 1.0. + float visibility; +}; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +#### Example + +The material below shows how to use custom surface shading to implement a simplified toon shader: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +material { + name : Toon, + shadingModel : lit, + parameters : [ + { + type : float3, + name : baseColor + } + ], + customSurfaceShading : true +} + +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + material.baseColor.rgb = materialParams.baseColor; + } + + vec3 surfaceShading( + const MaterialInputs materialInputs, + const ShadingData shadingData, + const LightData lightData + ) { + // Number of visible shade transitions + const float shades = 5.0; + // Ambient intensity + const float ambient = 0.1; + + float toon = max(ceil(lightData.NdotL * shades) / shades, ambient); + + // Shadowing and attenuation + toon *= lightData.visibility * lightData.attenuation; + + // Color and intensity + vec3 light = lightData.colorIntensity.rgb * lightData.colorIntensity.w; + + return shadingData.diffuseColor * light * toon; + } +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The result can be seen in figure [toonShading]. + +![Figure [toonShading]: simple toon shading implemented with custom +surface shading](images/screenshot_toon_shading.png) + + +## Shader public APIs + +### Types + +While GLSL types can be used directly (`vec4` or `mat4`) we recommend the use of the following +type aliases: + + Name | GLSL type | Description +:--------------------------------|:------------:|:------------------------------------ +**bool2** | bvec2 | A vector of 2 booleans +**bool3** | bvec3 | A vector of 3 booleans +**bool4** | bvec4 | A vector of 4 booleans +**int2** | ivec2 | A vector of 2 integers +**int3** | ivec3 | A vector of 3 integers +**int4** | ivec4 | A vector of 4 integers +**uint2** | uvec2 | A vector of 2 unsigned integers +**uint3** | uvec3 | A vector of 3 unsigned integers +**uint4** | uvec4 | A vector of 4 unsigned integers +**float2** | float2 | A vector of 2 floats +**float3** | float3 | A vector of 3 floats +**float4** | float4 | A vector of 4 floats +**float4x4** | mat4 | A 4x4 float matrix +**float3x3** | mat3 | A 3x3 float matrix + +### Math + Name | Type | Description +:-----------------------------------------|:--------:|:------------------------------------ +**PI** | float | A constant that represent $\pi$ +**HALF_PI** | float | A constant that represent $\frac{\pi}{2}$ +**saturate(float x)** | float | Clamps the specified value between 0.0 and 1.0 +**pow5(float x)** | float | Computes $x^5$ +**sq(float x)** | float | Computes $x^2$ +**max3(float3 v)** | float | Returns the maximum value of the specified `float3` +**mulMat4x4Float3(float4x4 m, float3 v)** | float4 | Returns $m * v$ +**mulMat3x3Float3(float4x4 m, float3 v)** | float4 | Returns $m * v$ + +### Matrices + + Name | Type | Description +:-----------------------------------|:--------:|:------------------------------------ +**getViewFromWorldMatrix()** | float4x4 | Matrix that converts from world space to view/eye space +**getWorldFromViewMatrix()** | float4x4 | Matrix that converts from view/eye space to world space +**getClipFromViewMatrix()** | float4x4 | Matrix that converts from view/eye space to clip (NDC) space +**getViewFromClipMatrix()** | float4x4 | Matrix that converts from clip (NDC) space to view/eye space +**getClipFromWorldMatrix()** | float4x4 | Matrix that converts from world to clip (NDC) space +**getWorldFromClipMatrix()** | float4x4 | Matrix that converts from clip (NDC) space to world space + +### Frame constants + + Name | Type | Description +:-----------------------------------|:--------:|:------------------------------------ +**getResolution()** | float4 | Dimensions of the view's effective (physical) viewport in pixels: `width`, `height`, `1 / width`, `1 / height`. This might be different from `View::getViewport()` for instance because of added rendering guard-bands. +**getWorldCameraPosition()** | float3 | Position of the camera/eye in world space (see note below) +**getWorldOffset()** | float3 | [deprecated] The shift required to obtain API-level world space. Use getUserWorldPosition() instead +**getUserWorldFromWorldMatrix()** | float4x4 | Matrix that converts from world space to API-level (user) world space. +**getTime()** | float | Current time as a remainder of 1 second. Yields a value between 0 and 1 +**getUserTime()** | float4 | Current time in seconds: `time`, `(double)time - time`, `0`, `0` +**getUserTimeMod(float m)** | float | Current time modulo m in seconds +**getExposure()** | float | Photometric exposure of the camera +**getEV100()** | float | [Exposure value at ISO 100](https://en.wikipedia.org/wiki/Exposure_value) of the camera + +!!! TIP: world space + To achieve good precision, the "world space" in Filament's shading system does not necessarily + match the API-level world space. To obtain the position of the API-level camera, custom + materials can use `getUserWorldFromWorldMatrix()` to transform `getWorldCameraPosition()`. + +### Material globals + + Name | Type | Description +:-----------------------------------|:--------:|:------------------------------------ +**getMaterialGlobal0()** | float4 | A vec4 visible by all materials, its value is set by `View::setMaterialGlobal(0, float4)`. Its default value is {0,0,0,1}. +**getMaterialGlobal1()** | float4 | A vec4 visible by all materials, its value is set by `View::setMaterialGlobal(1, float4)`. Its default value is {0,0,0,1}. +**getMaterialGlobal2()** | float4 | A vec4 visible by all materials, its value is set by `View::setMaterialGlobal(2, float4)`. Its default value is {0,0,0,1}. +**getMaterialGlobal3()** | float4 | A vec4 visible by all materials, its value is set by `View::setMaterialGlobal(3, float4)`. Its default value is {0,0,0,1}. + +### Vertex only + +The following APIs are only available from the vertex block: + + Name | Type | Description +:------------------------------------|:--------:|:------------------------------------ +**getPosition()** | float4 | Vertex position in the domain defined by the material (default: object/model space) +**getCustom0()** to **getCustom7()** | float4 | Custom vertex attribute +**getWorldFromModelMatrix()** | float4x4 | Matrix that converts from model (object) space to world space +**getWorldFromModelNormalMatrix()** | float3x3 | Matrix that converts normals from model (object) space to world space +**getVertexIndex()** | int | Index of the current vertex +**getEyeIndex()** | int | Index of the eye being rendered, starting at 0 + +### Fragment only + +The following APIs are only available from the fragment block: + + Name | Type | Description +:---------------------------------------|:--------:|:------------------------------------ +**getWorldTangentFrame()** | float3x3 | Matrix containing in each column the `tangent` (`frame[0]`), `bi-tangent` (`frame[1]`) and `normal` (`frame[2]`) of the vertex in world space. If the material does not compute a tangent space normal for bump mapping or if the shading is not anisotropic, only the `normal` is valid in this matrix. +**getWorldPosition()** | float3 | Position of the fragment in world space (see note below about world-space) +**getUserWorldPosition()** | float3 | Position of the fragment in API-level (user) world-space (see note below about world-space) +**getWorldViewVector()** | float3 | Normalized vector in world space from the fragment position to the eye +**getWorldNormalVector()** | float3 | Normalized normal in world space, after bump mapping (must be used after `prepareMaterial()`) +**getWorldGeometricNormalVector()** | float3 | Normalized normal in world space, before bump mapping (can be used before `prepareMaterial()`) +**getWorldReflectedVector()** | float3 | Reflection of the view vector about the normal (must be used after `prepareMaterial()`) +**getNormalizedViewportCoord()** | float3 | Normalized user viewport position (i.e. NDC coordinates normalized to [0, 1] for the position, [1, 0] for the depth), can be used before `prepareMaterial()`). Because the user viewport is smaller than the actual physical viewport, these coordinates can be negative or superior to 1 in the non-visible area of the physical viewport. +**getNdotV()** | float | The result of `dot(normal, view)`, always strictly greater than 0 (must be used after `prepareMaterial()`) +**getColor()** | float4 | Interpolated color of the fragment, if the color attribute is required +**getUV0()** | float2 | First interpolated set of UV coordinates, only available if the uv0 attribute is required +**getUV1()** | float2 | First interpolated set of UV coordinates, only available if the uv1 attribute is required +**getMaskThreshold()** | float | Returns the mask threshold, only available when `blending` is set to `masked` +**inverseTonemap(float3)** | float3 | Applies the inverse tone mapping operator to the specified linear sRGB color and returns a linear sRGB color. This operation may be an approximation and works best with the "Filmic" tone mapping operator +**inverseTonemapSRGB(float3)** | float3 | Applies the inverse tone mapping operator to the specified non-linear sRGB color and returns a linear sRGB color. This operation may be an approximation and works best with the "Filmic" tone mapping operator +**luminance(float3)** | float | Computes the luminance of the specified linear sRGB color +**ycbcrToRgb(float, float2)** | float3 | Converts a luminance and CbCr pair to a sRGB color +**uvToRenderTargetUV(float2)** | float2 | Transforms a UV coordinate to allow sampling from a `RenderTarget` attachment + +!!! TIP: world-space + To obtain API-level world-space coordinates, custom materials should use `getUserWorldPosition()` + or use `getUserWorldFromWorldMatrix()`. Note that API-level world-space coordinates should + never or rarely be used because they may not fit in a float3 or have severely reduced precision. + +!!! TIP: sampling from render targets + When sampling from a `filament::Texture` that is attached to a `filament::RenderTarget` for + materials in the surface domain, please use `uvToRenderTargetUV` to transform the texture + coordinate. This will flip the coordinate depending on which backend is being used. + +# Compiling materials + +Material packages can be compiled from material definitions using the command line tool called +`matc`. The simplest way to use `matc` is to specify an input material definition (`car_paint.mat` +in the example below) and an output material package (`car_paint.filamat` in the example below): + +```text +$ matc -o ./materials/bin/car_paint.filamat ./materials/src/car_paint.mat +``` + +## Shader validation + +`matc` attempts to validate shaders when compiling a material package. The example below shows an +example of an error message generated when compiling a material definition containing a typo in the +fragment shader (`metalic` instead of `metallic`). The reported line numbers are line numbers in the +source material definition file. + +```text +ERROR: 0:13: 'metalic' : no such field in structure +ERROR: 0:13: '' : compilation terminated +ERROR: 2 compilation errors. No code generated. + +Could not compile material metal.mat +``` + +## Flags + +The command line flags relevant to application development are described in table [matcFlags]. + + Flag | Value | Usage +-------------------------------:|:------------------:|:--------------------- +**-o**, **--output** | [path] | Specify the output file path +**-p**, **--platform** | desktop/mobile/all | Select the target platform(s) +**-a**, **--api** | opengl/vulkan/all | Specify the target graphics API +**-S**, **--optimize-size** | N/A | Optimize compiled material for size instead of just performance +**-r**, **--reflect** | parameters | Outputs the specified metadata as JSON +**-v**, **--variant-filter** | [variant] | Filters out the specified, comma-separated variants +[Table [matcFlags]: List of `matc` flags] + +`matc` offers a few other flags that are irrelevant to application developers and for internal +use only. + +### --platform + +By default, `matc` generates material packages containing shaders for all supported platforms. If +you wish to reduce the size of your material packages, it is recommended to select only the +appropriate target platform. For instance, to compile a material package for Android only, run +the following command: + +```text +$ matc -p mobile -o ./materials/bin/car_paint.filamat ./materials/src/car_paint.mat +``` + +### --api + +By default, `matc` generates material packages containing shaders for the OpenGL API. You can choose +to generate shaders for the Vulkan API in addition to the OpenGL shaders. If you intend on targeting +only Vulkan capable devices, you can reduce the size of the material packages by generating only +the set of Vulkan shaders: + +```text +$ matc -a vulkan -o ./materials/bin/car_paint.filamat ./materials/src/car_paint.mat +``` + +### --optimize-size + +This flag applies fewer optimization techniques to try and keep the final material as small as +possible. If the compiled material is deemed too large by default, using this flag might be +a good compromise between runtime performance and size. + +### --reflect + +This flag was designed to help build tools around `matc`. It allows you to print out specific +metadata in JSON format. The example below prints out the list of parameters defined in Filament's +standard skybox material. It produces a list of 2 parameters, named `showSun` and `skybox`, +respectively a boolean and a cubemap texture. + +```text +$ matc --reflect parameters filament/src/materials/skybox.mat +{ + "parameters": [ + { + "name": "showSun", + "type": "bool", + "size": "1" + }, + { + "name": "skybox", + "type": "samplerCubemap", + "format": "float", + "precision": "default" + } + ] +} +``` + +### --variant-filter + +This flag can be used to further reduce the size of a compiled material. It is used to specify a +list of shader variants that the application guarantees will never be needed. These shader variants +are skipped during the code generation phase of `matc`, thus reducing the overall size of the +material. + +The variants must be specified as a comma-separated list, using one of the following available +variants: + +- `directionalLighting`, used when a directional light is present in the scene +- `dynamicLighting`, used when a non-directional light (point, spot, etc.) is present in the scene +- `shadowReceiver`, used when an object can receive shadows +- `skinning`, used when an object is animated using GPU skinning or vertex morphing +- `fog`, used when global fog is applied to the scene +- `vsm`, used when VSM shadows are enabled and the object is a shadow receiver +- `ssr`, used when screen-space reflections are enabled in the View + +Example: +``` +--variant-filter=skinning,shadowReceiver +``` + +Note that some variants may automatically be filtered out. For instance, all lighting related +variants (`directionalLighting`, etc.) are filtered out when compiling an `unlit` material. + +When this flag is used, the specified variant filters are merged with the variant filters specified +in the material itself. + +Use this flag with caution, filtering out a variant required at runtime may lead to crashes. + +# Handling colors + +## Linear colors + +If the color data comes from a texture, simply make sure you use an sRGB texture to benefit from +automatic hardware conversion from sRGB to linear. If the color data is passed as a parameter to +the material you can convert from sRGB to linear by running the following algorithm on each +color channel: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GLSL +float sRGB_to_linear(float color) { + return color <= 0.04045 ? color / 12.92 : pow((color + 0.055) / 1.055, 2.4); +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Alternatively you can use one of the two cheaper but less accurate versions shown below: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GLSL +// Cheaper +linearColor = pow(color, 2.2); +// Cheapest +linearColor = color * color; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +## Pre-multiplied alpha + +A color uses pre-multiplied alpha if its RGB components are multiplied by the alpha channel: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GLSL +// Compute pre-multiplied color +color.rgb *= color.a; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If the color is sampled from a texture, you can simply ensure that the texture data is +pre-multiplied ahead of time. On Android, any texture uploaded from a +[Bitmap](https://developer.android.com/reference/android/graphics/Bitmap.html) will be +pre-multiplied by default. + +# Sampler usage in Materials + +The number of usable sampler parameters (e.g.: type is `sampler2d`) in materials is limited and +depends on the material properties, shading model, feature level and variant filter. + +## Feature level 1 and 2 + +`unlit` materials can use up to 12 samplers by default. + +`lit` materials can use up to 9 samplers by default, however if `refractionMode` or `reflectionMode` +is set to `screenspace` that number is reduced to 8. + +Finally if `variantFilter` contains the `fog` filter, an extra sampler is made available, such that +`unlit` materials can use up to 13 and `lit` materials up to 10 samplers by default. + +## Feature level 3 + +16 samplers are available. + +!!! TIP: external samplers + Be aware that `external` samplers account for 2 regular samplers. + + diff --git a/docs_src/markdeep/README.md b/docs_src/markdeep/README.md new file mode 100644 index 00000000000..35c30efa842 --- /dev/null +++ b/docs_src/markdeep/README.md @@ -0,0 +1,10 @@ +# Markdeep documents + +Markdeep documents require special processing before they can be compiled into the group. +The "original" are stored in this folder. The processing part takes place in +`docs_src/build/run.py`. + +## Editing +While editing the file, you might consider doing the following + - `python3 -m http.server 8001` + - visit `http://localhost:8001/Filament.md.html` in the browser to view the result \ No newline at end of file diff --git a/docs_src/src/SUMMARY.md b/docs_src/src/SUMMARY.md new file mode 100644 index 00000000000..7b756517f41 --- /dev/null +++ b/docs_src/src/SUMMARY.md @@ -0,0 +1,39 @@ +# Summary + +- [Introduction](./dup/intro.md) + - [Build](./dup/building.md) + - [Build for Android on Windows](./build/windows_android.md) + - [Contribute](./dup/contributing.md) + - [Coding Style](./dup/code_style.md) +- [Core Concepts](./main/README.md) + - [Filament](./main/filament.md) + - [Materials](./main/materials.md) +- [Tutorials and Samples](./samples/README.md) + - [iOS Tutorial](./samples/ios.md) + - [Web Tutorial](./samples/web.md) +- [Technical Notes](./notes/README.md) + - [Versioning](./notes/versioning.md) + - [Documentation](./dup/docs.md) + - [Debugging](./notes/debugging.md) + - [Metal](./notes/metal_debugging.md) + - [Vulkan](./notes/vulkan_debugging.md) + - [SPIR-V](./notes/spirv_debugging.md) + - [Libraries](./notes/libs.md) + - [bluegl](./dup/bluegl.md) + - [bluevk](./dup/bluevk.md) + - [filamat](./dup/filamat.md) + - [gltfio](./dup/gltfio.md) + - [iblprefilter](./dup/iblprefilter.md) + - [matdbg](./dup/matdbg.md) + - [uberz](./dup/uberz.md) + - [Tools](./notes/tools.md) + - [beamsplitter](./dup/beamsplitter.md) + - [cmgen](./dup/cmgen.md) + - [cso-lut](./dup/cso_lut.md) + - [filamesh](./dup/filamesh.md) + - [normal-blending](./dup/normal_blending.md) + - [mipgen](./dup/mipgen.md) + - [matinfo](./dup/matinfo.md) + - [roughness-prefilter](./dup/roughness_prefilter.md) + - [specular-color](./dup/specular_color.md) + - [zbloat](./dup/zbloat.md) diff --git a/docs_src/src/build/windows_android.md b/docs_src/src/build/windows_android.md new file mode 100644 index 00000000000..cfe80835049 --- /dev/null +++ b/docs_src/src/build/windows_android.md @@ -0,0 +1,145 @@ +# Building Filament for Android on Windows + +## Prerequisites + +In addition to the requirements for [building Filament on Windows](../BUILDING.md#windows), you'll +need the Android SDK and NDK. See [Getting Started with the +NDK](https://developer.android.com/ndk/guides/) for detailed installation instructions. + +You'll also need [Ninja 1.8](https://github.com/ninja-build/ninja/wiki/Pre-built-Ninja-packages) (or +more recent) and [Git for Windows](https://git-scm.com/download/win) to clone the repository and run +Bash scripts. + +Ensure the `%ANDROID_HOME%` environment variable is set to your Android SDK installation location. + +On Windows, we require VS2019 for building the host tools. All of the following commands should be +executed in a *Visual Studio x64 Native Tools Command Prompt for VS 2019*. + +### A Note About Python 3 + +Python 3 is required. If CMake errors because it cannot find Python 3: + +``` +Could NOT find PythonInterp: Found unsuitable version "1.4", but required is at least "3" +``` + +then add the following flag to the CMake invocations: + +``` +-DPYTHON_EXECUTABLE:FILEPATH=\path\to\python3 +``` + +## Desktop Tools + +First, a few Filament tools need to be compiled for desktop. + +1. From Filament's root directory, create a desktop build directory and run CMake. + +``` +mkdir out\cmake-release +cd out\cmake-release +cmake ^ + -G Ninja ^ + -DCMAKE_INSTALL_PREFIX=..\release\filament ^ + -DFILAMENT_ENABLE_JAVA=NO ^ + -DCMAKE_BUILD_TYPE=Release ^ + ..\.. +``` + +2. Build the required desktop host tools. + +``` +ninja matc resgen cmgen +``` + +The build should succeed and a `ImportExecutables-Release.cmake` file should automatically be +created at Filament's root directory. + +If you are going to build Filament samples you should install desktop host tools: + +``` +ninja install +``` + +## Build + +1. Create the build directories. + +``` +mkdir out\cmake-android-release-aarch64 +mkdir out\cmake-android-release-arm7 +mkdir out\cmake-android-release-x86_64 +mkdir out\cmake-android-release-x86 +``` + +2. Run CMake for each architecture. + +``` +cd out\cmake-android-release-aarch64 +cmake ^ + -G Ninja ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_INSTALL_PREFIX=..\android-release\filament ^ + -DCMAKE_TOOLCHAIN_FILE=..\..\build\toolchain-aarch64-linux-android.cmake ^ + ..\.. + +cd out\cmake-android-release-arm7 +cmake ^ + -G Ninja ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_INSTALL_PREFIX=..\android-release\filament ^ + -DCMAKE_TOOLCHAIN_FILE=..\..\build\toolchain-arm7-linux-android.cmake ^ + ..\.. + +cd out\cmake-android-release-x86_64 +cmake ^ + -G Ninja ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_INSTALL_PREFIX=..\android-release\filament ^ + -DCMAKE_TOOLCHAIN_FILE=..\..\build\toolchain-x86_64-linux-android.cmake ^ + ..\.. + +cd out\cmake-android-release-x86 +cmake ^ + -G Ninja ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DCMAKE_INSTALL_PREFIX=..\android-release\filament ^ + -DCMAKE_TOOLCHAIN_FILE=..\..\build\toolchain-x86-linux-android.cmake ^ + ..\.. +``` + +3. Build. + +Inside of each build directory, run: + +``` +ninja install +``` + +## Generate AAR + +The Gradle project used to generate the AAR is located at `\android`. + +``` +cd android +gradlew -Pcom.google.android.filament.dist-dir=..\out\android-release\filament assembleRelease +copy filament-android\build\outputs\aar\filament-android-release.aar ..\..\out\ +``` + +If you're only interested in building for a single ABI, you'll need to pass a `com.google.android.filament.abis` parameter: + +``` +gradlew -Pcom.google.android.filament.dist-dir=..\out\android-release\filament assembleRelease -Pcom.google.android.filament.abis=x86 +``` + +If you're only interested in building SDK, you may skip samples build by passing a `com.google.android.filament.skip-samples` flag: + +``` +gradlew -Pcom.google.android.filament.dist-dir=..\out\android-release\filament assembleRelease -Pcom.google.android.filament.skip-samples +``` + + +`filament-android-release.aar` should now be present at `\out\filament-android-release.aar`. + +See [Using Filament's AAR](../README.md) for usage instructions. + diff --git a/docs_src/src/dup/README.txt b/docs_src/src/dup/README.txt new file mode 100644 index 00000000000..554222e3098 --- /dev/null +++ b/docs_src/src/dup/README.txt @@ -0,0 +1,2 @@ +Do not manually edit any file in this folder. They have been autogenerated +by a script. diff --git a/docs_src/src/images/chart_sh_cos_thera_approx.png b/docs_src/src/images/chart_sh_cos_thera_approx.png new file mode 100644 index 00000000000..c3bb69c0158 Binary files /dev/null and b/docs_src/src/images/chart_sh_cos_thera_approx.png differ diff --git a/docs_src/src/images/diagram_brdf_dielectric_conductor.png b/docs_src/src/images/diagram_brdf_dielectric_conductor.png new file mode 100644 index 00000000000..ec45e9ca996 Binary files /dev/null and b/docs_src/src/images/diagram_brdf_dielectric_conductor.png differ diff --git a/docs_src/src/images/diagram_clear_coat.png b/docs_src/src/images/diagram_clear_coat.png new file mode 100644 index 00000000000..fc1c1505a66 Binary files /dev/null and b/docs_src/src/images/diagram_clear_coat.png differ diff --git a/docs_src/src/images/diagram_color_temperature_cct.png b/docs_src/src/images/diagram_color_temperature_cct.png new file mode 100644 index 00000000000..e8f936bdef7 Binary files /dev/null and b/docs_src/src/images/diagram_color_temperature_cct.png differ diff --git a/docs_src/src/images/diagram_color_temperature_cct_clamped.png b/docs_src/src/images/diagram_color_temperature_cct_clamped.png new file mode 100644 index 00000000000..a2a1ec7b9ed Binary files /dev/null and b/docs_src/src/images/diagram_color_temperature_cct_clamped.png differ diff --git a/docs_src/src/images/diagram_color_temperature_cie.png b/docs_src/src/images/diagram_color_temperature_cie.png new file mode 100644 index 00000000000..d661f7b38ef Binary files /dev/null and b/docs_src/src/images/diagram_color_temperature_cie.png differ diff --git a/docs_src/src/images/diagram_directional_light.png b/docs_src/src/images/diagram_directional_light.png new file mode 100644 index 00000000000..175772c2830 Binary files /dev/null and b/docs_src/src/images/diagram_directional_light.png differ diff --git a/docs_src/src/images/diagram_fr_fd.png b/docs_src/src/images/diagram_fr_fd.png new file mode 100644 index 00000000000..5794760e5ba Binary files /dev/null and b/docs_src/src/images/diagram_fr_fd.png differ diff --git a/docs_src/src/images/diagram_froxels1.png b/docs_src/src/images/diagram_froxels1.png new file mode 100644 index 00000000000..33486477bb2 Binary files /dev/null and b/docs_src/src/images/diagram_froxels1.png differ diff --git a/docs_src/src/images/diagram_froxels2.png b/docs_src/src/images/diagram_froxels2.png new file mode 100644 index 00000000000..7f7bccf5d7f Binary files /dev/null and b/docs_src/src/images/diagram_froxels2.png differ diff --git a/docs_src/src/images/diagram_froxels3.png b/docs_src/src/images/diagram_froxels3.png new file mode 100644 index 00000000000..695a89a3b2c Binary files /dev/null and b/docs_src/src/images/diagram_froxels3.png differ diff --git a/docs_src/src/images/diagram_lambert_vs_disney.png b/docs_src/src/images/diagram_lambert_vs_disney.png new file mode 100644 index 00000000000..2cef9ab17dc Binary files /dev/null and b/docs_src/src/images/diagram_lambert_vs_disney.png differ diff --git a/docs_src/src/images/diagram_macrosurface.png b/docs_src/src/images/diagram_macrosurface.png new file mode 100644 index 00000000000..1d39160c46a Binary files /dev/null and b/docs_src/src/images/diagram_macrosurface.png differ diff --git a/docs_src/src/images/diagram_micro_vs_macro.png b/docs_src/src/images/diagram_micro_vs_macro.png new file mode 100644 index 00000000000..13a96296841 Binary files /dev/null and b/docs_src/src/images/diagram_micro_vs_macro.png differ diff --git a/docs_src/src/images/diagram_microfacet.png b/docs_src/src/images/diagram_microfacet.png new file mode 100644 index 00000000000..2311e42981e Binary files /dev/null and b/docs_src/src/images/diagram_microfacet.png differ diff --git a/docs_src/src/images/diagram_planckian_locus.png b/docs_src/src/images/diagram_planckian_locus.png new file mode 100644 index 00000000000..bea8ae6c226 Binary files /dev/null and b/docs_src/src/images/diagram_planckian_locus.png differ diff --git a/docs_src/src/images/diagram_point_light.png b/docs_src/src/images/diagram_point_light.png new file mode 100644 index 00000000000..44ca40189ff Binary files /dev/null and b/docs_src/src/images/diagram_point_light.png differ diff --git a/docs_src/src/images/diagram_reflectance.png b/docs_src/src/images/diagram_reflectance.png new file mode 100644 index 00000000000..ca4cf781ba9 Binary files /dev/null and b/docs_src/src/images/diagram_reflectance.png differ diff --git a/docs_src/src/images/diagram_roughness.png b/docs_src/src/images/diagram_roughness.png new file mode 100644 index 00000000000..a428bff9175 Binary files /dev/null and b/docs_src/src/images/diagram_roughness.png differ diff --git a/docs_src/src/images/diagram_scattering.png b/docs_src/src/images/diagram_scattering.png new file mode 100644 index 00000000000..d8dbd0c966c Binary files /dev/null and b/docs_src/src/images/diagram_scattering.png differ diff --git a/docs_src/src/images/diagram_shadowing_masking.png b/docs_src/src/images/diagram_shadowing_masking.png new file mode 100644 index 00000000000..78b37d71187 Binary files /dev/null and b/docs_src/src/images/diagram_shadowing_masking.png differ diff --git a/docs_src/src/images/diagram_single_vs_multi_scatter.png b/docs_src/src/images/diagram_single_vs_multi_scatter.png new file mode 100644 index 00000000000..81bfeb5c938 Binary files /dev/null and b/docs_src/src/images/diagram_single_vs_multi_scatter.png differ diff --git a/docs_src/src/images/diagram_spot_light.png b/docs_src/src/images/diagram_spot_light.png new file mode 100644 index 00000000000..7aa74421d61 Binary files /dev/null and b/docs_src/src/images/diagram_spot_light.png differ diff --git a/docs_src/src/images/filament_logo.png b/docs_src/src/images/filament_logo.png new file mode 100644 index 00000000000..58aacf78ad3 Binary files /dev/null and b/docs_src/src/images/filament_logo.png differ diff --git a/docs_src/src/images/filament_logo_small.png b/docs_src/src/images/filament_logo_small.png new file mode 100644 index 00000000000..710976c5160 Binary files /dev/null and b/docs_src/src/images/filament_logo_small.png differ diff --git a/docs_src/src/images/ibl/dfg.png b/docs_src/src/images/ibl/dfg.png new file mode 100644 index 00000000000..7d1f48aa214 Binary files /dev/null and b/docs_src/src/images/ibl/dfg.png differ diff --git a/docs_src/src/images/ibl/dfg1.png b/docs_src/src/images/ibl/dfg1.png new file mode 100644 index 00000000000..599b0ced0b9 Binary files /dev/null and b/docs_src/src/images/ibl/dfg1.png differ diff --git a/docs_src/src/images/ibl/dfg1_approx.png b/docs_src/src/images/ibl/dfg1_approx.png new file mode 100644 index 00000000000..59855e199e8 Binary files /dev/null and b/docs_src/src/images/ibl/dfg1_approx.png differ diff --git a/docs_src/src/images/ibl/dfg2.png b/docs_src/src/images/ibl/dfg2.png new file mode 100644 index 00000000000..2702a94233a Binary files /dev/null and b/docs_src/src/images/ibl/dfg2.png differ diff --git a/docs_src/src/images/ibl/dfg2_approx.png b/docs_src/src/images/ibl/dfg2_approx.png new file mode 100644 index 00000000000..64848da0c1c Binary files /dev/null and b/docs_src/src/images/ibl/dfg2_approx.png differ diff --git a/docs_src/src/images/ibl/dfg_approx.png b/docs_src/src/images/ibl/dfg_approx.png new file mode 100644 index 00000000000..d3f17555c97 Binary files /dev/null and b/docs_src/src/images/ibl/dfg_approx.png differ diff --git a/docs_src/src/images/ibl/dfg_cloth.png b/docs_src/src/images/ibl/dfg_cloth.png new file mode 100644 index 00000000000..1a05807775f Binary files /dev/null and b/docs_src/src/images/ibl/dfg_cloth.png differ diff --git a/docs_src/src/images/ibl/ibl_irradiance.png b/docs_src/src/images/ibl/ibl_irradiance.png new file mode 100644 index 00000000000..3718d42077c Binary files /dev/null and b/docs_src/src/images/ibl/ibl_irradiance.png differ diff --git a/docs_src/src/images/ibl/ibl_irradiance_sh2.png b/docs_src/src/images/ibl/ibl_irradiance_sh2.png new file mode 100644 index 00000000000..8ec7bc15e22 Binary files /dev/null and b/docs_src/src/images/ibl/ibl_irradiance_sh2.png differ diff --git a/docs_src/src/images/ibl/ibl_irradiance_sh3.png b/docs_src/src/images/ibl/ibl_irradiance_sh3.png new file mode 100644 index 00000000000..703a60aaddb Binary files /dev/null and b/docs_src/src/images/ibl/ibl_irradiance_sh3.png differ diff --git a/docs_src/src/images/ibl/ibl_no_mipmaping.png b/docs_src/src/images/ibl/ibl_no_mipmaping.png new file mode 100644 index 00000000000..e9f43777a2a Binary files /dev/null and b/docs_src/src/images/ibl/ibl_no_mipmaping.png differ diff --git a/docs_src/src/images/ibl/ibl_prefilter_vs_reference.png b/docs_src/src/images/ibl/ibl_prefilter_vs_reference.png new file mode 100644 index 00000000000..87d7e03d7ba Binary files /dev/null and b/docs_src/src/images/ibl/ibl_prefilter_vs_reference.png differ diff --git a/docs_src/src/images/ibl/ibl_river_roughness_m0.png b/docs_src/src/images/ibl/ibl_river_roughness_m0.png new file mode 100644 index 00000000000..f029919a458 Binary files /dev/null and b/docs_src/src/images/ibl/ibl_river_roughness_m0.png differ diff --git a/docs_src/src/images/ibl/ibl_river_roughness_m1.png b/docs_src/src/images/ibl/ibl_river_roughness_m1.png new file mode 100644 index 00000000000..c0156e8a880 Binary files /dev/null and b/docs_src/src/images/ibl/ibl_river_roughness_m1.png differ diff --git a/docs_src/src/images/ibl/ibl_river_roughness_m2.png b/docs_src/src/images/ibl/ibl_river_roughness_m2.png new file mode 100644 index 00000000000..0efd9f579f7 Binary files /dev/null and b/docs_src/src/images/ibl/ibl_river_roughness_m2.png differ diff --git a/docs_src/src/images/ibl/ibl_river_roughness_m3.png b/docs_src/src/images/ibl/ibl_river_roughness_m3.png new file mode 100644 index 00000000000..f1b42a63cde Binary files /dev/null and b/docs_src/src/images/ibl/ibl_river_roughness_m3.png differ diff --git a/docs_src/src/images/ibl/ibl_river_roughness_m4.png b/docs_src/src/images/ibl/ibl_river_roughness_m4.png new file mode 100644 index 00000000000..04129140137 Binary files /dev/null and b/docs_src/src/images/ibl/ibl_river_roughness_m4.png differ diff --git a/docs_src/src/images/ibl/ibl_river_roughness_m5.png b/docs_src/src/images/ibl/ibl_river_roughness_m5.png new file mode 100644 index 00000000000..57c75c8b088 Binary files /dev/null and b/docs_src/src/images/ibl/ibl_river_roughness_m5.png differ diff --git a/docs_src/src/images/ibl/ibl_river_roughness_m6.png b/docs_src/src/images/ibl/ibl_river_roughness_m6.png new file mode 100644 index 00000000000..0a4d29f5976 Binary files /dev/null and b/docs_src/src/images/ibl/ibl_river_roughness_m6.png differ diff --git a/docs_src/src/images/ibl/ibl_river_roughness_m7.png b/docs_src/src/images/ibl/ibl_river_roughness_m7.png new file mode 100644 index 00000000000..d3b71237120 Binary files /dev/null and b/docs_src/src/images/ibl/ibl_river_roughness_m7.png differ diff --git a/docs_src/src/images/ibl/ibl_stretchy_reflections_error.png b/docs_src/src/images/ibl/ibl_stretchy_reflections_error.png new file mode 100644 index 00000000000..c8e2bb39489 Binary files /dev/null and b/docs_src/src/images/ibl/ibl_stretchy_reflections_error.png differ diff --git a/docs_src/src/images/ibl/ibl_trilinear_0.png b/docs_src/src/images/ibl/ibl_trilinear_0.png new file mode 100644 index 00000000000..39ca22e840e Binary files /dev/null and b/docs_src/src/images/ibl/ibl_trilinear_0.png differ diff --git a/docs_src/src/images/ibl/ibl_trilinear_1.png b/docs_src/src/images/ibl/ibl_trilinear_1.png new file mode 100644 index 00000000000..5ce39b0c310 Binary files /dev/null and b/docs_src/src/images/ibl/ibl_trilinear_1.png differ diff --git a/docs_src/src/images/ibl/ibl_visualization.jpg b/docs_src/src/images/ibl/ibl_visualization.jpg new file mode 100644 index 00000000000..7fe141a3cd0 Binary files /dev/null and b/docs_src/src/images/ibl/ibl_visualization.jpg differ diff --git a/docs_src/src/images/image_filtered_1.png b/docs_src/src/images/image_filtered_1.png new file mode 100644 index 00000000000..f9f1fd82f1e Binary files /dev/null and b/docs_src/src/images/image_filtered_1.png differ diff --git a/docs_src/src/images/image_filtered_2.png b/docs_src/src/images/image_filtered_2.png new file mode 100644 index 00000000000..0e42263432b Binary files /dev/null and b/docs_src/src/images/image_filtered_2.png differ diff --git a/docs_src/src/images/image_filtered_3.png b/docs_src/src/images/image_filtered_3.png new file mode 100644 index 00000000000..d19e3257e73 Binary files /dev/null and b/docs_src/src/images/image_filtered_3.png differ diff --git a/docs_src/src/images/image_filtered_4.png b/docs_src/src/images/image_filtered_4.png new file mode 100644 index 00000000000..1054dfcbef6 Binary files /dev/null and b/docs_src/src/images/image_filtered_4.png differ diff --git a/docs_src/src/images/image_fis_1024.png b/docs_src/src/images/image_fis_1024.png new file mode 100644 index 00000000000..25bb4436019 Binary files /dev/null and b/docs_src/src/images/image_fis_1024.png differ diff --git a/docs_src/src/images/image_fis_32.png b/docs_src/src/images/image_fis_32.png new file mode 100644 index 00000000000..4a73da0465a Binary files /dev/null and b/docs_src/src/images/image_fis_32.png differ diff --git a/docs_src/src/images/image_is_1024.png b/docs_src/src/images/image_is_1024.png new file mode 100644 index 00000000000..b2ba367cb86 Binary files /dev/null and b/docs_src/src/images/image_is_1024.png differ diff --git a/docs_src/src/images/image_is_32.png b/docs_src/src/images/image_is_32.png new file mode 100644 index 00000000000..d4f1b96d19e Binary files /dev/null and b/docs_src/src/images/image_is_32.png differ diff --git a/docs_src/src/images/image_is_4096.png b/docs_src/src/images/image_is_4096.png new file mode 100644 index 00000000000..70fcaf74d56 Binary files /dev/null and b/docs_src/src/images/image_is_4096.png differ diff --git a/docs_src/src/images/image_is_original.png b/docs_src/src/images/image_is_original.png new file mode 100644 index 00000000000..425268719da Binary files /dev/null and b/docs_src/src/images/image_is_original.png differ diff --git a/docs_src/src/images/image_is_ref_1.png b/docs_src/src/images/image_is_ref_1.png new file mode 100644 index 00000000000..fe29a4b2939 Binary files /dev/null and b/docs_src/src/images/image_is_ref_1.png differ diff --git a/docs_src/src/images/image_is_ref_2.png b/docs_src/src/images/image_is_ref_2.png new file mode 100644 index 00000000000..61c2d38680c Binary files /dev/null and b/docs_src/src/images/image_is_ref_2.png differ diff --git a/docs_src/src/images/image_is_ref_3.png b/docs_src/src/images/image_is_ref_3.png new file mode 100644 index 00000000000..f11d7400dca Binary files /dev/null and b/docs_src/src/images/image_is_ref_3.png differ diff --git a/docs_src/src/images/image_is_ref_4.png b/docs_src/src/images/image_is_ref_4.png new file mode 100644 index 00000000000..ddc18dbe796 Binary files /dev/null and b/docs_src/src/images/image_is_ref_4.png differ diff --git a/site/content/posts/cocoapods/blue-screen.png b/docs_src/src/images/ios_sample/blue-screen.png similarity index 100% rename from site/content/posts/cocoapods/blue-screen.png rename to docs_src/src/images/ios_sample/blue-screen.png diff --git a/site/content/posts/cocoapods/colored-triangle.png b/docs_src/src/images/ios_sample/colored-triangle.png similarity index 100% rename from site/content/posts/cocoapods/colored-triangle.png rename to docs_src/src/images/ios_sample/colored-triangle.png diff --git a/site/content/posts/cocoapods/default-options.png b/docs_src/src/images/ios_sample/default-options.png similarity index 100% rename from site/content/posts/cocoapods/default-options.png rename to docs_src/src/images/ios_sample/default-options.png diff --git a/site/content/posts/cocoapods/mtkview.gif b/docs_src/src/images/ios_sample/mtkview.gif similarity index 100% rename from site/content/posts/cocoapods/mtkview.gif rename to docs_src/src/images/ios_sample/mtkview.gif diff --git a/site/content/posts/cocoapods/obj-cpp.png b/docs_src/src/images/ios_sample/obj-cpp.png similarity index 100% rename from site/content/posts/cocoapods/obj-cpp.png rename to docs_src/src/images/ios_sample/obj-cpp.png diff --git a/site/content/posts/cocoapods/rotating-triangle.gif b/docs_src/src/images/ios_sample/rotating-triangle.gif similarity index 100% rename from site/content/posts/cocoapods/rotating-triangle.gif rename to docs_src/src/images/ios_sample/rotating-triangle.gif diff --git a/site/content/posts/cocoapods/single-view-app.png b/docs_src/src/images/ios_sample/single-view-app.png similarity index 100% rename from site/content/posts/cocoapods/single-view-app.png rename to docs_src/src/images/ios_sample/single-view-app.png diff --git a/site/content/posts/cocoapods/view.png b/docs_src/src/images/ios_sample/view.png similarity index 100% rename from site/content/posts/cocoapods/view.png rename to docs_src/src/images/ios_sample/view.png diff --git a/site/content/posts/cocoapods/white-triangle.png b/docs_src/src/images/ios_sample/white-triangle.png similarity index 100% rename from site/content/posts/cocoapods/white-triangle.png rename to docs_src/src/images/ios_sample/white-triangle.png diff --git a/docs_src/src/images/material_absorption.png b/docs_src/src/images/material_absorption.png new file mode 100644 index 00000000000..ffbca78b10e Binary files /dev/null and b/docs_src/src/images/material_absorption.png differ diff --git a/docs_src/src/images/material_anisotropic.png b/docs_src/src/images/material_anisotropic.png new file mode 100644 index 00000000000..68b812d6dc7 Binary files /dev/null and b/docs_src/src/images/material_anisotropic.png differ diff --git a/docs_src/src/images/material_bent_normal.gif b/docs_src/src/images/material_bent_normal.gif new file mode 100644 index 00000000000..9cc3ee234ba Binary files /dev/null and b/docs_src/src/images/material_bent_normal.gif differ diff --git a/docs_src/src/images/material_blending.png b/docs_src/src/images/material_blending.png new file mode 100644 index 00000000000..f810e9beb1d Binary files /dev/null and b/docs_src/src/images/material_blending.png differ diff --git a/docs_src/src/images/material_carbon_fiber.png b/docs_src/src/images/material_carbon_fiber.png new file mode 100644 index 00000000000..4b5851a9edc Binary files /dev/null and b/docs_src/src/images/material_carbon_fiber.png differ diff --git a/docs_src/src/images/material_chart.jpg b/docs_src/src/images/material_chart.jpg new file mode 100644 index 00000000000..856ebcd8f82 Binary files /dev/null and b/docs_src/src/images/material_chart.jpg differ diff --git a/docs_src/src/images/material_clear_coat.png b/docs_src/src/images/material_clear_coat.png new file mode 100644 index 00000000000..bbf3b2954d1 Binary files /dev/null and b/docs_src/src/images/material_clear_coat.png differ diff --git a/docs_src/src/images/material_clear_coat1.png b/docs_src/src/images/material_clear_coat1.png new file mode 100644 index 00000000000..65bf963106f Binary files /dev/null and b/docs_src/src/images/material_clear_coat1.png differ diff --git a/docs_src/src/images/material_clear_coat2.png b/docs_src/src/images/material_clear_coat2.png new file mode 100644 index 00000000000..1e50aa5f3e2 Binary files /dev/null and b/docs_src/src/images/material_clear_coat2.png differ diff --git a/docs_src/src/images/material_furnace_energy_loss.png b/docs_src/src/images/material_furnace_energy_loss.png new file mode 100644 index 00000000000..b025d26bfbb Binary files /dev/null and b/docs_src/src/images/material_furnace_energy_loss.png differ diff --git a/docs_src/src/images/material_furnace_energy_preservation.png b/docs_src/src/images/material_furnace_energy_preservation.png new file mode 100644 index 00000000000..e116ce2593f Binary files /dev/null and b/docs_src/src/images/material_furnace_energy_preservation.png differ diff --git a/docs_src/src/images/material_grazing_reflectance.png b/docs_src/src/images/material_grazing_reflectance.png new file mode 100644 index 00000000000..92da8ce4931 Binary files /dev/null and b/docs_src/src/images/material_grazing_reflectance.png differ diff --git a/docs_src/src/images/material_interpolation.png b/docs_src/src/images/material_interpolation.png new file mode 100644 index 00000000000..88bbf3d2417 Binary files /dev/null and b/docs_src/src/images/material_interpolation.png differ diff --git a/docs_src/src/images/material_ior.png b/docs_src/src/images/material_ior.png new file mode 100644 index 00000000000..99752738218 Binary files /dev/null and b/docs_src/src/images/material_ior.png differ diff --git a/docs_src/src/images/material_metallic_energy_loss.png b/docs_src/src/images/material_metallic_energy_loss.png new file mode 100644 index 00000000000..a4120d18acd Binary files /dev/null and b/docs_src/src/images/material_metallic_energy_loss.png differ diff --git a/docs_src/src/images/material_metallic_energy_preservation.png b/docs_src/src/images/material_metallic_energy_preservation.png new file mode 100644 index 00000000000..ca95e1197be Binary files /dev/null and b/docs_src/src/images/material_metallic_energy_preservation.png differ diff --git a/docs_src/src/images/material_parameters.png b/docs_src/src/images/material_parameters.png new file mode 100644 index 00000000000..4116632c7fc Binary files /dev/null and b/docs_src/src/images/material_parameters.png differ diff --git a/docs_src/src/images/material_roughness_remap.png b/docs_src/src/images/material_roughness_remap.png new file mode 100644 index 00000000000..c98dfaaf830 Binary files /dev/null and b/docs_src/src/images/material_roughness_remap.png differ diff --git a/docs_src/src/images/material_thickness.png b/docs_src/src/images/material_thickness.png new file mode 100644 index 00000000000..bada6592913 Binary files /dev/null and b/docs_src/src/images/material_thickness.png differ diff --git a/docs_src/src/images/materials/absorption.png b/docs_src/src/images/materials/absorption.png new file mode 100644 index 00000000000..6c1ebf8652c Binary files /dev/null and b/docs_src/src/images/materials/absorption.png differ diff --git a/docs_src/src/images/materials/anisotropy.png b/docs_src/src/images/materials/anisotropy.png new file mode 100644 index 00000000000..c568d486529 Binary files /dev/null and b/docs_src/src/images/materials/anisotropy.png differ diff --git a/docs_src/src/images/materials/clear_coat.png b/docs_src/src/images/materials/clear_coat.png new file mode 100644 index 00000000000..d3d41bc5bd1 Binary files /dev/null and b/docs_src/src/images/materials/clear_coat.png differ diff --git a/docs_src/src/images/materials/clear_coat_roughness.png b/docs_src/src/images/materials/clear_coat_roughness.png new file mode 100644 index 00000000000..03f169c85b6 Binary files /dev/null and b/docs_src/src/images/materials/clear_coat_roughness.png differ diff --git a/docs_src/src/images/materials/conductor_roughness.png b/docs_src/src/images/materials/conductor_roughness.png new file mode 100644 index 00000000000..1fe537984f1 Binary files /dev/null and b/docs_src/src/images/materials/conductor_roughness.png differ diff --git a/docs_src/src/images/materials/dielectric_roughness.png b/docs_src/src/images/materials/dielectric_roughness.png new file mode 100644 index 00000000000..0fe95758408 Binary files /dev/null and b/docs_src/src/images/materials/dielectric_roughness.png differ diff --git a/docs_src/src/images/materials/ior.png b/docs_src/src/images/materials/ior.png new file mode 100644 index 00000000000..e1b8ced8d90 Binary files /dev/null and b/docs_src/src/images/materials/ior.png differ diff --git a/docs_src/src/images/materials/metallic.png b/docs_src/src/images/materials/metallic.png new file mode 100644 index 00000000000..34dbbd83f9e Binary files /dev/null and b/docs_src/src/images/materials/metallic.png differ diff --git a/docs_src/src/images/materials/reflectance.png b/docs_src/src/images/materials/reflectance.png new file mode 100644 index 00000000000..5a1a510d8f5 Binary files /dev/null and b/docs_src/src/images/materials/reflectance.png differ diff --git a/docs_src/src/images/materials/refraction_roughness.png b/docs_src/src/images/materials/refraction_roughness.png new file mode 100644 index 00000000000..64cf1a4f123 Binary files /dev/null and b/docs_src/src/images/materials/refraction_roughness.png differ diff --git a/docs_src/src/images/materials/sheen_roughness.png b/docs_src/src/images/materials/sheen_roughness.png new file mode 100644 index 00000000000..c1247f46e44 Binary files /dev/null and b/docs_src/src/images/materials/sheen_roughness.png differ diff --git a/docs_src/src/images/materials/thickness.png b/docs_src/src/images/materials/thickness.png new file mode 100644 index 00000000000..d64320f0aed Binary files /dev/null and b/docs_src/src/images/materials/thickness.png differ diff --git a/docs_src/src/images/materials/transmission.png b/docs_src/src/images/materials/transmission.png new file mode 100644 index 00000000000..88d9a036f7d Binary files /dev/null and b/docs_src/src/images/materials/transmission.png differ diff --git a/docs_src/src/images/photo_fresnel_lake.jpg b/docs_src/src/images/photo_fresnel_lake.jpg new file mode 100644 index 00000000000..0e34475a848 Binary files /dev/null and b/docs_src/src/images/photo_fresnel_lake.jpg differ diff --git a/docs_src/src/images/photo_incident_light_meter.jpg b/docs_src/src/images/photo_incident_light_meter.jpg new file mode 100644 index 00000000000..f7017ad930f Binary files /dev/null and b/docs_src/src/images/photo_incident_light_meter.jpg differ diff --git a/docs_src/src/images/photo_light_meter.jpg b/docs_src/src/images/photo_light_meter.jpg new file mode 100644 index 00000000000..2ca1f94b5fb Binary files /dev/null and b/docs_src/src/images/photo_light_meter.jpg differ diff --git a/docs_src/src/images/photo_photometric_lights.jpg b/docs_src/src/images/photo_photometric_lights.jpg new file mode 100644 index 00000000000..f1af42c0fec Binary files /dev/null and b/docs_src/src/images/photo_photometric_lights.jpg differ diff --git a/docs_src/src/images/samples/app_gmm_ar_nav.jpg b/docs_src/src/images/samples/app_gmm_ar_nav.jpg new file mode 100644 index 00000000000..093400ebcbc Binary files /dev/null and b/docs_src/src/images/samples/app_gmm_ar_nav.jpg differ diff --git a/docs_src/src/images/samples/app_google_3d_viewer.jpg b/docs_src/src/images/samples/app_google_3d_viewer.jpg new file mode 100644 index 00000000000..446370ef908 Binary files /dev/null and b/docs_src/src/images/samples/app_google_3d_viewer.jpg differ diff --git a/docs_src/src/images/samples/example_bistro1.jpg b/docs_src/src/images/samples/example_bistro1.jpg new file mode 100644 index 00000000000..29d7befdcde Binary files /dev/null and b/docs_src/src/images/samples/example_bistro1.jpg differ diff --git a/docs_src/src/images/samples/example_bistro2.jpg b/docs_src/src/images/samples/example_bistro2.jpg new file mode 100644 index 00000000000..ecd092cd92b Binary files /dev/null and b/docs_src/src/images/samples/example_bistro2.jpg differ diff --git a/docs_src/src/images/samples/example_helmet.jpg b/docs_src/src/images/samples/example_helmet.jpg new file mode 100644 index 00000000000..8f495435032 Binary files /dev/null and b/docs_src/src/images/samples/example_helmet.jpg differ diff --git a/docs_src/src/images/samples/example_live_wallpaper.jpg b/docs_src/src/images/samples/example_live_wallpaper.jpg new file mode 100644 index 00000000000..74ad33f1aeb Binary files /dev/null and b/docs_src/src/images/samples/example_live_wallpaper.jpg differ diff --git a/docs_src/src/images/samples/example_materials1.jpg b/docs_src/src/images/samples/example_materials1.jpg new file mode 100644 index 00000000000..54266b97cf6 Binary files /dev/null and b/docs_src/src/images/samples/example_materials1.jpg differ diff --git a/docs_src/src/images/samples/example_materials2.jpg b/docs_src/src/images/samples/example_materials2.jpg new file mode 100644 index 00000000000..c5745515e96 Binary files /dev/null and b/docs_src/src/images/samples/example_materials2.jpg differ diff --git a/docs_src/src/images/samples/example_ssr.jpg b/docs_src/src/images/samples/example_ssr.jpg new file mode 100644 index 00000000000..46018afffbe Binary files /dev/null and b/docs_src/src/images/samples/example_ssr.jpg differ diff --git a/docs_src/src/images/samples/sample_gltf_viewer.jpg b/docs_src/src/images/samples/sample_gltf_viewer.jpg new file mode 100644 index 00000000000..1ecbd3b38f2 Binary files /dev/null and b/docs_src/src/images/samples/sample_gltf_viewer.jpg differ diff --git a/docs_src/src/images/samples/sample_hello_camera.jpg b/docs_src/src/images/samples/sample_hello_camera.jpg new file mode 100644 index 00000000000..e945e8db06b Binary files /dev/null and b/docs_src/src/images/samples/sample_hello_camera.jpg differ diff --git a/docs_src/src/images/samples/sample_hello_triangle.jpg b/docs_src/src/images/samples/sample_hello_triangle.jpg new file mode 100644 index 00000000000..224ee043665 Binary files /dev/null and b/docs_src/src/images/samples/sample_hello_triangle.jpg differ diff --git a/docs_src/src/images/samples/sample_image_based_lighting.jpg b/docs_src/src/images/samples/sample_image_based_lighting.jpg new file mode 100644 index 00000000000..334e2a2067a Binary files /dev/null and b/docs_src/src/images/samples/sample_image_based_lighting.jpg differ diff --git a/docs_src/src/images/samples/sample_lit_cube.jpg b/docs_src/src/images/samples/sample_lit_cube.jpg new file mode 100644 index 00000000000..b5ef384e087 Binary files /dev/null and b/docs_src/src/images/samples/sample_lit_cube.jpg differ diff --git a/docs_src/src/images/samples/sample_page_curl.jpg b/docs_src/src/images/samples/sample_page_curl.jpg new file mode 100644 index 00000000000..6ea94d1ca42 Binary files /dev/null and b/docs_src/src/images/samples/sample_page_curl.jpg differ diff --git a/docs_src/src/images/samples/sample_stream_test.jpg b/docs_src/src/images/samples/sample_stream_test.jpg new file mode 100644 index 00000000000..d4429264774 Binary files /dev/null and b/docs_src/src/images/samples/sample_stream_test.jpg differ diff --git a/docs_src/src/images/samples/sample_texture_view.jpg b/docs_src/src/images/samples/sample_texture_view.jpg new file mode 100644 index 00000000000..76eb15cd7ec Binary files /dev/null and b/docs_src/src/images/samples/sample_texture_view.jpg differ diff --git a/docs_src/src/images/samples/sample_textured_object.jpg b/docs_src/src/images/samples/sample_textured_object.jpg new file mode 100644 index 00000000000..2f04e30a601 Binary files /dev/null and b/docs_src/src/images/samples/sample_textured_object.jpg differ diff --git a/docs_src/src/images/samples/sample_transparent_rendering.jpg b/docs_src/src/images/samples/sample_transparent_rendering.jpg new file mode 100644 index 00000000000..8a5d0c0e1e3 Binary files /dev/null and b/docs_src/src/images/samples/sample_transparent_rendering.jpg differ diff --git a/docs_src/src/images/screenshot_anisotropic_ibl1.jpg b/docs_src/src/images/screenshot_anisotropic_ibl1.jpg new file mode 100644 index 00000000000..0462fdd5632 Binary files /dev/null and b/docs_src/src/images/screenshot_anisotropic_ibl1.jpg differ diff --git a/docs_src/src/images/screenshot_anisotropic_ibl2.jpg b/docs_src/src/images/screenshot_anisotropic_ibl2.jpg new file mode 100644 index 00000000000..b7aca5984ff Binary files /dev/null and b/docs_src/src/images/screenshot_anisotropic_ibl2.jpg differ diff --git a/docs_src/src/images/screenshot_anisotropy.png b/docs_src/src/images/screenshot_anisotropy.png new file mode 100644 index 00000000000..9eda502fd9f Binary files /dev/null and b/docs_src/src/images/screenshot_anisotropy.png differ diff --git a/docs_src/src/images/screenshot_anisotropy_direction.png b/docs_src/src/images/screenshot_anisotropy_direction.png new file mode 100644 index 00000000000..a0825b36e68 Binary files /dev/null and b/docs_src/src/images/screenshot_anisotropy_direction.png differ diff --git a/docs_src/src/images/screenshot_anisotropy_map.jpg b/docs_src/src/images/screenshot_anisotropy_map.jpg new file mode 100644 index 00000000000..8e5bde1c53e Binary files /dev/null and b/docs_src/src/images/screenshot_anisotropy_map.jpg differ diff --git a/docs_src/src/images/screenshot_ao.jpg b/docs_src/src/images/screenshot_ao.jpg new file mode 100644 index 00000000000..8ed57a6e389 Binary files /dev/null and b/docs_src/src/images/screenshot_ao.jpg differ diff --git a/docs_src/src/images/screenshot_ball_ibl.png b/docs_src/src/images/screenshot_ball_ibl.png new file mode 100644 index 00000000000..a4533160931 Binary files /dev/null and b/docs_src/src/images/screenshot_ball_ibl.png differ diff --git a/docs_src/src/images/screenshot_bloom.jpg b/docs_src/src/images/screenshot_bloom.jpg new file mode 100644 index 00000000000..c7f62f54d4a Binary files /dev/null and b/docs_src/src/images/screenshot_bloom.jpg differ diff --git a/docs_src/src/images/screenshot_camera_transparency.jpg b/docs_src/src/images/screenshot_camera_transparency.jpg new file mode 100644 index 00000000000..32336edcd40 Binary files /dev/null and b/docs_src/src/images/screenshot_camera_transparency.jpg differ diff --git a/docs_src/src/images/screenshot_car.jpg b/docs_src/src/images/screenshot_car.jpg new file mode 100644 index 00000000000..3c0970e42e5 Binary files /dev/null and b/docs_src/src/images/screenshot_car.jpg differ diff --git a/docs_src/src/images/screenshot_clear_coat_ior_change.jpg b/docs_src/src/images/screenshot_clear_coat_ior_change.jpg new file mode 100644 index 00000000000..49d74fd0ca7 Binary files /dev/null and b/docs_src/src/images/screenshot_clear_coat_ior_change.jpg differ diff --git a/docs_src/src/images/screenshot_clear_coat_normal.jpg b/docs_src/src/images/screenshot_clear_coat_normal.jpg new file mode 100644 index 00000000000..4debc92d317 Binary files /dev/null and b/docs_src/src/images/screenshot_clear_coat_normal.jpg differ diff --git a/docs_src/src/images/screenshot_cloth.png b/docs_src/src/images/screenshot_cloth.png new file mode 100644 index 00000000000..666034c628f Binary files /dev/null and b/docs_src/src/images/screenshot_cloth.png differ diff --git a/docs_src/src/images/screenshot_cloth_sheen.png b/docs_src/src/images/screenshot_cloth_sheen.png new file mode 100644 index 00000000000..9be7ded2cb6 Binary files /dev/null and b/docs_src/src/images/screenshot_cloth_sheen.png differ diff --git a/docs_src/src/images/screenshot_cloth_subsurface.png b/docs_src/src/images/screenshot_cloth_subsurface.png new file mode 100644 index 00000000000..e78e80f22df Binary files /dev/null and b/docs_src/src/images/screenshot_cloth_subsurface.png differ diff --git a/docs_src/src/images/screenshot_cloth_velvet.png b/docs_src/src/images/screenshot_cloth_velvet.png new file mode 100644 index 00000000000..9d6b04928f5 Binary files /dev/null and b/docs_src/src/images/screenshot_cloth_velvet.png differ diff --git a/docs_src/src/images/screenshot_coordinates.jpg b/docs_src/src/images/screenshot_coordinates.jpg new file mode 100644 index 00000000000..998b55e1c67 Binary files /dev/null and b/docs_src/src/images/screenshot_coordinates.jpg differ diff --git a/docs_src/src/images/screenshot_cubemap_coordinates.png b/docs_src/src/images/screenshot_cubemap_coordinates.png new file mode 100644 index 00000000000..5a8c58c7717 Binary files /dev/null and b/docs_src/src/images/screenshot_cubemap_coordinates.png differ diff --git a/docs_src/src/images/screenshot_directional_light.png b/docs_src/src/images/screenshot_directional_light.png new file mode 100644 index 00000000000..16f32ad924f Binary files /dev/null and b/docs_src/src/images/screenshot_directional_light.png differ diff --git a/docs_src/src/images/screenshot_fog1.jpg b/docs_src/src/images/screenshot_fog1.jpg new file mode 100644 index 00000000000..bf60c6e5a5f Binary files /dev/null and b/docs_src/src/images/screenshot_fog1.jpg differ diff --git a/docs_src/src/images/screenshot_fog2.jpg b/docs_src/src/images/screenshot_fog2.jpg new file mode 100644 index 00000000000..5ddf155fcfe Binary files /dev/null and b/docs_src/src/images/screenshot_fog2.jpg differ diff --git a/docs_src/src/images/screenshot_fringing.jpg b/docs_src/src/images/screenshot_fringing.jpg new file mode 100644 index 00000000000..a9b5c22c9e9 Binary files /dev/null and b/docs_src/src/images/screenshot_fringing.jpg differ diff --git a/docs_src/src/images/screenshot_lightgen_samples.png b/docs_src/src/images/screenshot_lightgen_samples.png new file mode 100644 index 00000000000..80b292806c4 Binary files /dev/null and b/docs_src/src/images/screenshot_lightgen_samples.png differ diff --git a/docs_src/src/images/screenshot_luminance_debug.png b/docs_src/src/images/screenshot_luminance_debug.png new file mode 100644 index 00000000000..431ebed660c Binary files /dev/null and b/docs_src/src/images/screenshot_luminance_debug.png differ diff --git a/docs_src/src/images/screenshot_multi_bounce_ao.gif b/docs_src/src/images/screenshot_multi_bounce_ao.gif new file mode 100644 index 00000000000..4208dc99050 Binary files /dev/null and b/docs_src/src/images/screenshot_multi_bounce_ao.gif differ diff --git a/docs_src/src/images/screenshot_multi_bounce_ao.jpg b/docs_src/src/images/screenshot_multi_bounce_ao.jpg new file mode 100644 index 00000000000..2f629906d21 Binary files /dev/null and b/docs_src/src/images/screenshot_multi_bounce_ao.jpg differ diff --git a/docs_src/src/images/screenshot_normal_map.jpg b/docs_src/src/images/screenshot_normal_map.jpg new file mode 100644 index 00000000000..dd186561e48 Binary files /dev/null and b/docs_src/src/images/screenshot_normal_map.jpg differ diff --git a/docs_src/src/images/screenshot_normal_map_blended.jpg b/docs_src/src/images/screenshot_normal_map_blended.jpg new file mode 100644 index 00000000000..af8fd0da76f Binary files /dev/null and b/docs_src/src/images/screenshot_normal_map_blended.jpg differ diff --git a/docs_src/src/images/screenshot_normal_map_blended_udn.jpg b/docs_src/src/images/screenshot_normal_map_blended_udn.jpg new file mode 100644 index 00000000000..0453bf0e3bb Binary files /dev/null and b/docs_src/src/images/screenshot_normal_map_blended_udn.jpg differ diff --git a/docs_src/src/images/screenshot_normal_map_detail.jpg b/docs_src/src/images/screenshot_normal_map_detail.jpg new file mode 100644 index 00000000000..7372941cf61 Binary files /dev/null and b/docs_src/src/images/screenshot_normal_map_detail.jpg differ diff --git a/docs_src/src/images/screenshot_normal_mapping.jpg b/docs_src/src/images/screenshot_normal_mapping.jpg new file mode 100644 index 00000000000..4c3ff5f5668 Binary files /dev/null and b/docs_src/src/images/screenshot_normal_mapping.jpg differ diff --git a/docs_src/src/images/screenshot_photometric_lights.png b/docs_src/src/images/screenshot_photometric_lights.png new file mode 100644 index 00000000000..6a2fe85b973 Binary files /dev/null and b/docs_src/src/images/screenshot_photometric_lights.png differ diff --git a/docs_src/src/images/screenshot_point_light.png b/docs_src/src/images/screenshot_point_light.png new file mode 100644 index 00000000000..bca0cc9457b Binary files /dev/null and b/docs_src/src/images/screenshot_point_light.png differ diff --git a/docs_src/src/images/screenshot_ref_comparison.png b/docs_src/src/images/screenshot_ref_comparison.png new file mode 100644 index 00000000000..b050291896a Binary files /dev/null and b/docs_src/src/images/screenshot_ref_comparison.png differ diff --git a/docs_src/src/images/screenshot_ref_filament.jpg b/docs_src/src/images/screenshot_ref_filament.jpg new file mode 100644 index 00000000000..43a749ef935 Binary files /dev/null and b/docs_src/src/images/screenshot_ref_filament.jpg differ diff --git a/docs_src/src/images/screenshot_ref_mitsuba.jpg b/docs_src/src/images/screenshot_ref_mitsuba.jpg new file mode 100644 index 00000000000..d3c2cccf6d1 Binary files /dev/null and b/docs_src/src/images/screenshot_ref_mitsuba.jpg differ diff --git a/docs_src/src/images/screenshot_sheen_color.png b/docs_src/src/images/screenshot_sheen_color.png new file mode 100644 index 00000000000..02f27ab820f Binary files /dev/null and b/docs_src/src/images/screenshot_sheen_color.png differ diff --git a/docs_src/src/images/screenshot_specular_ao.gif b/docs_src/src/images/screenshot_specular_ao.gif new file mode 100644 index 00000000000..9d81e7dc4cb Binary files /dev/null and b/docs_src/src/images/screenshot_specular_ao.gif differ diff --git a/docs_src/src/images/screenshot_sponza.jpg b/docs_src/src/images/screenshot_sponza.jpg new file mode 100644 index 00000000000..cf8934a3c5f Binary files /dev/null and b/docs_src/src/images/screenshot_sponza.jpg differ diff --git a/docs_src/src/images/screenshot_sponza_froxels1.jpg b/docs_src/src/images/screenshot_sponza_froxels1.jpg new file mode 100644 index 00000000000..1d8702b14f8 Binary files /dev/null and b/docs_src/src/images/screenshot_sponza_froxels1.jpg differ diff --git a/docs_src/src/images/screenshot_sponza_froxels2.jpg b/docs_src/src/images/screenshot_sponza_froxels2.jpg new file mode 100644 index 00000000000..c297e312d2f Binary files /dev/null and b/docs_src/src/images/screenshot_sponza_froxels2.jpg differ diff --git a/docs_src/src/images/screenshot_sponza_slices.jpg b/docs_src/src/images/screenshot_sponza_slices.jpg new file mode 100644 index 00000000000..7cb48b2771c Binary files /dev/null and b/docs_src/src/images/screenshot_sponza_slices.jpg differ diff --git a/docs_src/src/images/screenshot_sponza_tiles.jpg b/docs_src/src/images/screenshot_sponza_tiles.jpg new file mode 100644 index 00000000000..c3e2aa86afa Binary files /dev/null and b/docs_src/src/images/screenshot_sponza_tiles.jpg differ diff --git a/docs_src/src/images/screenshot_spot_light.png b/docs_src/src/images/screenshot_spot_light.png new file mode 100644 index 00000000000..8d0939ba181 Binary files /dev/null and b/docs_src/src/images/screenshot_spot_light.png differ diff --git a/docs_src/src/images/screenshot_spot_light_focused.png b/docs_src/src/images/screenshot_spot_light_focused.png new file mode 100644 index 00000000000..96c4d91f858 Binary files /dev/null and b/docs_src/src/images/screenshot_spot_light_focused.png differ diff --git a/docs_src/src/images/screenshot_toon_shading.png b/docs_src/src/images/screenshot_toon_shading.png new file mode 100644 index 00000000000..059cc5bca92 Binary files /dev/null and b/docs_src/src/images/screenshot_toon_shading.png differ diff --git a/docs_src/src/images/screenshot_translucency.png b/docs_src/src/images/screenshot_translucency.png new file mode 100644 index 00000000000..b27980f91c0 Binary files /dev/null and b/docs_src/src/images/screenshot_translucency.png differ diff --git a/docs_src/src/images/screenshot_transparency_default.png b/docs_src/src/images/screenshot_transparency_default.png new file mode 100644 index 00000000000..e9174998e97 Binary files /dev/null and b/docs_src/src/images/screenshot_transparency_default.png differ diff --git a/docs_src/src/images/screenshot_transparent_shadows.jpg b/docs_src/src/images/screenshot_transparent_shadows.jpg new file mode 100644 index 00000000000..819cf63d93f Binary files /dev/null and b/docs_src/src/images/screenshot_transparent_shadows.jpg differ diff --git a/docs_src/src/images/screenshot_twopasses_oneside.png b/docs_src/src/images/screenshot_twopasses_oneside.png new file mode 100644 index 00000000000..8c2c366b0c0 Binary files /dev/null and b/docs_src/src/images/screenshot_twopasses_oneside.png differ diff --git a/docs_src/src/images/screenshot_twopasses_twosides.png b/docs_src/src/images/screenshot_twopasses_twosides.png new file mode 100644 index 00000000000..bb877fdc09b Binary files /dev/null and b/docs_src/src/images/screenshot_twopasses_twosides.png differ diff --git a/docs_src/src/images/screenshot_unlit.jpg b/docs_src/src/images/screenshot_unlit.jpg new file mode 100644 index 00000000000..e03fb31612b Binary files /dev/null and b/docs_src/src/images/screenshot_unlit.jpg differ diff --git a/docs_src/src/images/screenshot_xarrow.png b/docs_src/src/images/screenshot_xarrow.png new file mode 100644 index 00000000000..bdf91d44e55 Binary files /dev/null and b/docs_src/src/images/screenshot_xarrow.png differ diff --git a/docs_src/src/main/README.md b/docs_src/src/main/README.md new file mode 100644 index 00000000000..c0d25f7e5ee --- /dev/null +++ b/docs_src/src/main/README.md @@ -0,0 +1,5 @@ +# Core Concepts + + +- [Filament](main/filament.md) - High-level designs; Filament's PBR/math assumptions; implementation details. +- [Materials](main/materials.md) - A guide to Filament's material definition. diff --git a/docs_src/src/main/filament.md b/docs_src/src/main/filament.md new file mode 100644 index 00000000000..7a15685b6ee --- /dev/null +++ b/docs_src/src/main/filament.md @@ -0,0 +1,4410 @@ + + +$$\newcommand{\n}{\hat{n}}\newcommand{\thetai}{\theta_\mathrm{i}}\newcommand{\thetao}{\theta_\mathrm{o}}\newcommand{\d}[1]{\mathrm{d}#1}\newcommand{\w}{\hat{\omega}}\newcommand{\wi}{\w_\mathrm{i}}\newcommand{\wo}{\w_\mathrm{o}}\newcommand{\wh}{\w_\mathrm{h}}\newcommand{\Li}{L_\mathrm{i}}\newcommand{\Lo}{L_\mathrm{o}}\newcommand{\Le}{L_\mathrm{e}}\newcommand{\Lr}{L_\mathrm{r}}\newcommand{\Lt}{L_\mathrm{t}}\newcommand{\O}{\mathrm{O}}\newcommand{\degrees}{{^{\large\circ}}}\newcommand{\T}{\mathsf{T}}\newcommand{\mathset}[1]{\mathbb{#1}}\newcommand{\Real}{\mathset{R}}\newcommand{\Integer}{\mathset{Z}}\newcommand{\Boolean}{\mathset{B}}\newcommand{\Complex}{\mathset{C}}\newcommand{\un}[1]{\,\mathrm{#1}}$$ + +

    Physically Based Rendering in Filament

    Physically Based Rendering in Filament
    +
    +

    +

    +

    +
    Contents

    (Top)
    +About
    +  1.1  Authors
    +Overview
    +  2.1  Principles
    +  2.2  Physically based rendering
    +Notation
    +Material system
    +  4.1  Standard model
    +  4.2  Dielectrics and conductors
    +  4.3  Energy conservation
    +  4.4  Specular BRDF
    +    4.4.1  Normal distribution function (specular D)
    +    4.4.2  Geometric shadowing (specular G)
    +    4.4.3  Fresnel (specular F)
    +  4.5  Diffuse BRDF
    +  4.6  Standard model summary
    +  4.7  Improving the BRDFs
    +    4.7.1  Energy gain in diffuse reflectance
    +    4.7.2  Energy loss in specular reflectance
    +  4.8  Parameterization
    +    4.8.1  Standard parameters
    +    4.8.2  Types and ranges
    +    4.8.3  Remapping
    +    4.8.4  Blending and layering
    +    4.8.5  Crafting physically based materials
    +  4.9  Clear coat model
    +    4.9.1  Clear coat specular BRDF
    +    4.9.2  Integration in the surface response
    +    4.9.3  Clear coat parameterization
    +    4.9.4  Base layer modification
    +  4.10  Anisotropic model
    +    4.10.1  Anisotropic specular BRDF
    +    4.10.2  Anisotropic parameterization
    +  4.11  Subsurface model
    +    4.11.1  Subsurface specular BRDF
    +    4.11.2  Subsurface parameterization
    +  4.12  Cloth model
    +    4.12.1  Cloth specular BRDF
    +    4.12.2  Cloth diffuse BRDF
    +    4.12.3  Cloth parameterization
    +Lighting
    +  5.1  Units
    +    5.1.1  Light units validation
    +  5.2  Direct lighting
    +    5.2.1  Directional lights
    +    5.2.2  Punctual lights
    +    5.2.3  Photometric lights
    +    5.2.4  Area lights
    +    5.2.5  Lights parameterization
    +    5.2.6  Pre-exposed lights
    +  5.3  Image based lights
    +    5.3.1  IBL Types
    +    5.3.2  IBL Unit
    +    5.3.3  Processing light probes
    +    5.3.4  Distant light probes
    +    5.3.5  Clear coat
    +    5.3.6  Anisotropy
    +    5.3.7  Subsurface
    +    5.3.8  Cloth
    +  5.4  Static lighting
    +  5.5  Transparency and translucency lighting
    +    5.5.1  Transparency
    +    5.5.2  Translucency
    +  5.6  Occlusion
    +    5.6.1  Diffuse occlusion
    +    5.6.2  Specular occlusion
    +  5.7  Normal mapping
    +    5.7.1  Reoriented normal mapping
    +    5.7.2  UDN blending
    +Volumetric effects
    +  6.1  Exponential height fog
    +Anti-aliasing
    +Imaging pipeline
    +  8.1  Physically based camera
    +    8.1.1  Exposure settings
    +    8.1.2  Exposure value
    +    8.1.3  Exposure
    +    8.1.4  Automatic exposure
    +    8.1.5  Bloom
    +  8.2  Optics post-processing
    +    8.2.1  Color fringing
    +    8.2.2  Lens flares
    +  8.3  Filmic post-processing
    +    8.3.1  Contrast
    +    8.3.2  Curves
    +    8.3.3  Levels
    +    8.3.4  Color grading
    +  8.4  Light path
    +    8.4.1  Clustered Forward Rendering
    +    8.4.2  Implementation notes
    +  8.5  Validation
    +    8.5.1  Scene referred visualization
    +    8.5.2  Reference renderings
    +  8.6  Coordinates systems
    +    8.6.1  World coordinates system
    +    8.6.2  Camera coordinates system
    +    8.6.3  Cubemaps coordinates system
    +Annex
    +  9.1  Specular color
    +  9.2  Importance sampling for the IBL
    +    9.2.1  Choosing important directions
    +    9.2.2  Pre-filtered importance sampling
    +  9.3  Choosing important directions for sampling the BRDF
    +  9.4  Hammersley sequence
    +  9.5  Precomputing L for image-based lighting
    +  9.6  Spherical Harmonics
    +    9.6.1  Basis functions
    +    9.6.2  Decomposition and reconstruction
    +    9.6.3  Decomposition of \(\left< cos \theta \right>\)
    +    9.6.4  Convolution
    +  9.7  Sample validation scene for Mitsuba
    +  9.8  Light assignment with froxels
    +10  Revisions
    +11  Bibliography
    +

       

    About

    +

    + +This document is part of the Filament project. To report errors in this document please use the project's issue tracker. +

    +   

    Authors

    +

    + +

    +

    +   

    Overview

    +

    + +Filament is a physically based rendering (PBR) engine for Android. The goal of Filament is to offer a set of tools and APIs for Android developers that will enable them to create high quality 2D and 3D rendering with ease. +

    +The goal of this document is to explain the equations and theory behind the material and lighting models used in Filament. This document is intended as a reference for contributors to Filament or developers interested in the inner workings of the engine. We will provide code snippets as needed to make the relationship between theory and practice as clear as possible. +

    +This document is not intended as a design document. It focuses solely on algorithms and its content could be used to implement PBR in any engine. However, this document explains why we chose specific algorithms/models over others. +

    +Unless noted otherwise, all the 3D renderings present in this document have been generated in-engine (prototype or production). Many of these 3D renderings were captured during the early stages of development of Filament and do not reflect the final quality. +

    +   

    Principles

    +

    + +Real-time rendering is an active area of research and there is a large number of equations, algorithms and implementation to choose from for every single feature that needs to be implemented (the book Rendering real-time shadows, for instance, is a 400 pages summary of dozens of shadows rendering techniques). As such, we must first define our goals (or principles, to follow Brent Burley's seminal paper Physically-based shading at Disney [Burley12]) before we can make informed decisions. +

    +

    Real-time mobile performance

    Our primary goal is to design and implement a rendering system able to perform efficiently on mobile platforms. The primary target will be OpenGL ES 3.x class GPUs. +

    Quality

    Our rendering system will emphasize overall picture quality. We will however accept quality compromises to support low and medium performance GPUs. +

    Ease of use

    Artists need to be able to iterate often and quickly on their assets and our rendering system must allow them to do so intuitively. We must therefore provide parameters that are easy to understand (for instance, no specular power). +

    + We also understand that not all developers have the luxury to work with artists. The physically based approach of our system will allow developers to craft visually plausible materials without the need to understand the theory behind our implementation. +

    + For both artists and developers, our system will rely on as few parameters as possible to reduce trial and error and allow users to quickly master the material model. +

    + In addition, any combination of parameter values should lead to physically plausible results. Physically implausible materials must be hard to create. +

    Familiarity

    Our system should use physical units everywhere possible: distances in meters or centimeters, color temperatures in Kelvin, light units in lumens or candelas, etc. +

    Flexibility

    A physically based approach must not preclude non-realistic rendering. User interfaces for instance will need unlit materials. +

    Deployment size

    While not directly related to the content of this document, it bears emphasizing our desire to keep the rendering library as small as possible so any application can bundle it without increasing the binary to undesirable sizes. +

    +   

    Physically based rendering

    +

    + +We chose to adopt PBR for its benefits from an artistic and production efficient standpoints, and because it is compatible with our goals. +

    +Physically based rendering is a rendering method that provides a more accurate representation of materials and how they interact with light when compared to traditional real-time models. The separation of materials and lighting at the core of the PBR method makes it easier to create realistic assets that look accurate in all lighting conditions. +

    +   

    Notation

    +

    + +$$ +\newcommand{NoL}{n \cdot l} +\newcommand{NoV}{n \cdot v} +\newcommand{NoH}{n \cdot h} +\newcommand{VoH}{v \cdot h} +\newcommand{LoH}{l \cdot h} +\newcommand{fNormal}{f_{0}} +\newcommand{fDiffuse}{f_d} +\newcommand{fSpecular}{f_r} +\newcommand{fX}{f_x} +\newcommand{aa}{\alpha^2} +\newcommand{fGrazing}{f_{90}} +\newcommand{schlick}{F_{Schlick}} +\newcommand{nior}{n_{ior}} +\newcommand{Ed}{E_d} +\newcommand{Lt}{L_{\bot}} +\newcommand{Lout}{L_{out}} +\newcommand{cosTheta}{\left< \cos \theta \right> } +$$ +

    +The equations found throughout this document use the symbols described in table 1. +

    +

    +  + + + + + + + + + + + + + + + + +
    Symbol Definition
    \(v\) View unit vector
    \(l\) Incident light unit vector
    \(n\) Surface normal unit vector
    \(h\) Half unit vector between \(l\) and \(v\)
    \(f\) BRDF
    \(\fDiffuse\) Diffuse component of a BRDF
    \(\fSpecular\) Specular component of a BRDF
    \(\alpha\) Roughness, remapped from using input perceptualRoughness
    \(\sigma\) Diffuse reflectance
    \(\Omega\) Spherical domain
    \(\fNormal\) Reflectance at normal incidence
    \(\fGrazing\) Reflectance at grazing angle
    \(\chi^+(a)\) Heaviside function (1 if \(a > 0\) and 0 otherwise)
    \(n_{ior}\) Index of refraction (IOR) of an interface
    \(\left< \NoL \right>\) Dot product clamped to [0..1]
    \(\left< a \right>\) Saturated value (clamped to [0..1])
    Table 1: Symbols definitions
    +

    +   

    Material system

    +

    + +The sections below describe multiple material models to simplify the description of various surface features such as anisotropy or the clear coat layer. In practice however some of these models are condensed into a single one. For instance, the standard model, the clear coat model and the anisotropic model can be combined to form a single, more flexible and powerful model. Please refer to the Materials documentation to get a description of the material models as implemented in Filament. +

    +   

    Standard model

    +

    + +The goal of our model is to represent standard material appearances. A material model is described mathematically by a BSDF (Bidirectional Scattering Distribution Function), which is itself composed of two other functions: the BRDF (Bidirectional Reflectance Distribution Function) and the BTDF (Bidirectional Transmittance Function). +

    +Since we aim to model commonly encountered surfaces, our standard material model will focus on the BRDF and ignore the BTDF, or approximate it greatly. Our standard model will therefore only be able to correctly mimic reflective, isotropic, dielectric or conductive surfaces with short mean free paths. +

    +The BRDF describes the surface response of a standard material as a function made of two terms: +

    +

      +
    • A diffuse component, or \(f_d\) +
    • +
    • A specular component, or \(f_r\)
    +

    +The relationship between a surface, the surface normal, incident light and these terms is shown in figure 1 (we ignore subsurface scattering for now): +

    +

     
    Figure 1: Interaction of the light with a surface using BRDF model with a diffuse term \( f_d \) and a specular term \( f_r \)
    +

    +The complete surface response can be expressed as such: +

    +$$\begin{equation}\label{brdf} +f(v,l)=f_d(v,l)+f_r(v,l) +\end{equation}$$ +

    +This equation characterizes the surface response for incident light from a single direction. The full rendering equation would require to integrate \(l\) over the entire hemisphere. +

    +Commonly encountered surfaces are usually not made of a flat interface so we need a model that can characterize the interaction of light with an irregular interface. +

    +A microfacet BRDF is a good physically plausible BRDF for that purpose. Such BRDF states that surfaces are not smooth at a micro level, but made of a large number of randomly aligned planar surface fragments, called microfacets. Figure 2 shows the difference between a flat interface and an irregular interface at a micro level: +

    +

     
    Figure 2: Irregular interface as modeled by a microfacet model (left) and flat interface (right)
    +

    +Only the microfacets whose normal is oriented halfway between the light direction and the view direction will reflect visible light, as shown in figure 3. +

    +

     
    Figure 3: Microfacets
    +

    +However, not all microfacets with a properly oriented normal will contribute reflected light as the BRDF takes into account masking and shadowing. This is illustrated in figure 4. +

    +

     
    Figure 4: Masking and shadowing of microfacets
    +

    +A microfacet BRDF is heavily influenced by a roughness parameter which describes how smooth (low roughness) or how rough (high roughness) a surface is at a micro level. The smoother the surface, the more facets are aligned and the more pronounced the reflected light is. The rougher the surface, the fewer facets are oriented towards the camera and incoming light is scattered away from the camera after reflection, giving a blurry aspect to the specular highlights. +

    +Figure 5 shows surfaces of different roughness and how light interacts with them. +

    +

     
    Figure 5: Varying roughness (from left to right, rough to smooth) and the resulting BRDF specular component lobe
    +

    +

    About roughness
    +

    + The roughness parameter as set by the user is called perceptualRoughness in the shader snippets throughout this document. The variable called roughness is the perceptualRoughness with a remapping explained in section 4.8.

    +

    +A microfacet model is described by the following equation (where x stands for the specular or diffuse component): +

    +$$\begin{equation} +\fX(v,l) = \frac{1}{| \NoV | | \NoL |} +\int_\Omega D(m,\alpha) G(v,l,m) f_m(v,l,m) (v \cdot m) (l \cdot m) dm +\end{equation}$$ +

    +The term \(D\) models the distribution of the microfacets (this term is also referred to as the NDF or Normal Distribution Function). This term plays a primordial role in the appearance of surfaces as shown in figure 5. +

    +The term \(G\) models the visibility (or occlusion or shadow-masking) of the microfacets. +

    +Since this equation is valid for both the specular and diffuse components, the difference lies in the microfacet BRDF \(f_m\). +

    +It is important to note that this equation is used to integrate over the hemisphere at a micro level: +

    +

     
    Figure 6: Modeling the surface response at a single point requires an integration at the micro level
    +

    +The diagram above shows that at a macro level, the surfaces is considered flat. This helps simplify our equations by assuming that a shaded fragment lit from a single direction corresponds to a single point at the surface. +

    +At a micro level however, the surface is not flat and we cannot assume a single ray of light anymore (we can however assume that the incident rays are parallel). Since the micro facets will scatter the light in different directions given a bundle of parallel incident rays, we must integrate the surface response over a hemisphere, noted m in the above diagram. +

    +It is obviously not practical to compute the full integration over the microfacets hemisphere for each shaded fragment. We will therefore rely on approximations of the integration for both the specular and diffuse components. +

    +   

    Dielectrics and conductors

    +

    + +To better understand some of the equations and behaviors shown below, we must first clearly understand the difference between metallic (conductor) and non-metallic (dielectric) surfaces. +

    +We saw earlier that when incident light hits a surface governed by a BRDF, the light is reflected as two separate components: the diffuse reflectance and the specular reflectance. The modelization of this behavior is straightforward as shown in figure 7. +

    +

     
    Figure 7: Modelization of the BRDF part of a BSDF
    +

    +This modelization is a simplification of how the light actually interacts with the surface. In reality, part of the incident light will penetrate the surface, scatter inside, and exit the surface again as diffuse reflectance. This phenomenon is illustrated in figure 8. +

    +

     
    Figure 8: Scattering of diffuse light
    +

    +Here lies the difference between conductors and dielectrics. There is no subsurface scattering occurring with purely metallic materials, which means there is no diffuse component (and we will see later that this has an influence on the perceived color of the specular component). Scattering happens in dielectrics, which means they have both specular and diffuse components. +

    +To properly modelize the BRDF we must therefore distinguish between dielectrics and conductors (scattering not shown for clarity), as shown in figure 9. +

    +

     
    Figure 9: BRDF modelization for dielectric and conductor surfaces
    +

    +   

    Energy conservation

    +

    + +Energy conservation is one of the key components of a good BRDF for physically based rendering. An energy conservative BRDF states that the total amount of specular and diffuse reflectance energy is less than the total amount of incident energy. Without an energy conservative BRDF, artists must manually ensure that the light reflected off a surface is never more intense than the incident light. +

    +   

    Specular BRDF

    +

    + +For the specular term, \(f_r\) is a mirror BRDF that can be modeled with the Fresnel law, noted \(F\) in the Cook-Torrance approximation of the microfacet model integration: +

    +$$\begin{equation} +f_r(v,l) = \frac{D(h, \alpha) G(v, l, \alpha) F(v, h, f0)}{4(\NoV)(\NoL)} +\end{equation}$$ +

    +Given our real-time constraints, we must use an approximation for the three terms \(D\), \(G\) and \(F\). [Karis13a] has compiled a great list of formulations for these three terms that can be used with the Cook-Torrance specular BRDF. The sections that follow describe the equations we picked for these terms. +

    +   

    Normal distribution function (specular D)

    +

    + +[Burley12] observed that long-tailed normal distribution functions (NDF) are a good fit for real-world surfaces. The GGX distribution described in [Walter07] is a distribution with long-tailed falloff and short peak in the highlights, with a simple formulation suitable for real-time implementations. It is also a popular model, equivalent to the Trowbridge-Reitz distribution, in modern physically based renderers. +

    +$$\begin{equation} +D_{GGX}(h,\alpha) = \frac{\aa}{\pi ( (\NoH)^2 (\aa - 1) + 1)^2} +\end{equation}$$ +

    +The GLSL implementation of the NDF, shown in listing 1, is simple and efficient. +

     
    float D_GGX(float NoH, float roughness) {
    +    float a = NoH * roughness;
    +    float k = roughness / (1.0 - NoH * NoH + a * a);
    +    return k * k * (1.0 / PI);
    +}
    Listing 1: Implementation of the specular D term in GLSL
    +

    + +We can improve this implementation by using half precision floats. This optimization requires changes to the original equation as there are two problems when computing \(1 - (\NoH)^2\) in half-floats. First, this computation suffers from floating point cancellation when \((\NoH)^2\) is close to 1 (highlights). Secondly \(\NoH\) does not have enough precision around 1. +

    +The solution involves Lagrange's identity: +

    +$$\begin{equation} +| a \times b |^2 = |a|^2 |b|^2 - (a \cdot b)^2 +\end{equation}$$ +

    +Since both \(n\) and \(h\) are unit vectors, \(|n \times h|^2 = 1 - (\NoH)^2\). This allows us to compute \(1 - (\NoH)^2\) directly with half precision floats by using a simple cross product. Listing 2 shows the final optimized implementation. +

     
    #define MEDIUMP_FLT_MAX    65504.0
    +#define saturateMediump(x) min(x, MEDIUMP_FLT_MAX)
    +
    +float D_GGX(float roughness, float NoH, const vec3 n, const vec3 h) {
    +    vec3 NxH = cross(n, h);
    +    float a = NoH * roughness;
    +    float k = roughness / (dot(NxH, NxH) + a * a);
    +    float d = k * k * (1.0 / PI);
    +    return saturateMediump(d);
    +}
    Listing 2: Implementation of the specular D term in GLSL optimized for fp16
    +   

    Geometric shadowing (specular G)

    +

    + +Eric Heitz showed in [Heitz14] that the Smith geometric shadowing function is the correct and exact \(G\) term to use. The Smith formulation is the following: +

    +$$\begin{equation} +G(v,l,\alpha) = G_1(l,\alpha) G_1(v,\alpha) +\end{equation}$$ +

    +\(G_1\) can in turn follow several models, and is commonly set to the GGX formulation: +

    +$$\begin{equation} +G_1(v,\alpha) = G_{GGX}(v,\alpha) = \frac{2 (\NoV)}{\NoV + \sqrt{\aa + (1 - \aa) (\NoV)^2}} +\end{equation}$$ +

    +The full Smith-GGX formulation thus becomes: +

    +$$\begin{equation} +G(v,l,\alpha) = \frac{2 (\NoL)}{\NoL + \sqrt{\aa + (1 - \aa) (\NoL)^2}} \frac{2 (\NoV)}{\NoV + \sqrt{\aa + (1 - \aa) (\NoV)^2}} +\end{equation}$$ +

    +We can observe that the dividends \(2 (\NoL)\) and \(2 (n \cdot v)\) allow us to simplify the original function \(f_r\) by introducing a visibility function \(V\): +

    +$$\begin{equation} +f_r(v,l) = D(h, \alpha) V(v, l, \alpha) F(v, h, f_0) +\end{equation}$$ +

    +Where: +

    +$$\begin{equation} +V(v,l,\alpha) = \frac{G(v, l, \alpha)}{4 (\NoV) (\NoL)} = V_1(l,\alpha) V_1(v,\alpha) +\end{equation}$$ +

    +And: +

    +$$\begin{equation} +V_1(v,\alpha) = \frac{1}{\NoV + \sqrt{\aa + (1 - \aa) (\NoV)^2}} +\end{equation}$$ +

    +Heitz notes however that taking the height of the microfacets into account to correlate masking and shadowing leads to more accurate results. He defines the height-correlated Smith function thusly: +

    +$$\begin{equation} +G(v,l,h,\alpha) = \frac{\chi^+(\VoH) \chi^+(\LoH)}{1 + \Lambda(v) + \Lambda(l)} +\end{equation}$$ +

    +$$\begin{equation} +\Lambda(m) = \frac{-1 + \sqrt{1 + \aa tan^2(\theta_m)}}{2} = \frac{-1 + \sqrt{1 + \aa \frac{(1 - cos^2(\theta_m))}{cos^2(\theta_m)}}}{2} +\end{equation}$$ +

    +Replacing \(cos(\theta_m)\) by \(\NoV\), we obtain: +

    +$$\begin{equation} +\Lambda(v) = \frac{1}{2} \left( \frac{\sqrt{\aa + (1 - \aa)(\NoV)^2}}{\NoV} - 1 \right) +\end{equation}$$ +

    +From which we can derive the visibility function: +

    +$$\begin{equation} +V(v,l,\alpha) = \frac{0.5}{\NoL \sqrt{(\NoV)^2 (1 - \aa) + \aa} + \NoV \sqrt{(\NoL)^2 (1 - \aa) + \aa}} +\end{equation}$$ +

    +The GLSL implementation of the visibility term, shown in listing 3, is a bit more expensive than we would like since it requires two sqrt operations. +

     
    float V_SmithGGXCorrelated(float NoV, float NoL, float roughness) {
    +    float a2 = roughness * roughness;
    +    float GGXV = NoL * sqrt(NoV * NoV * (1.0 - a2) + a2);
    +    float GGXL = NoV * sqrt(NoL * NoL * (1.0 - a2) + a2);
    +    return 0.5 / (GGXV + GGXL);
    +}
    Listing 3: Implementation of the specular V term in GLSL
    +

    + +We can optimize this visibility function by using an approximation after noticing that all the terms under the square roots are squares and that all the terms are in the \([0..1]\) range: +

    +$$\begin{equation} +V(v,l,\alpha) = \frac{0.5}{\NoL (\NoV (1 - \alpha) + \alpha) + \NoV (\NoL (1 - \alpha) + \alpha)} +\end{equation}$$ +

    +This approximation is mathematically wrong but saves two square root operations and is good enough for real-time mobile applications, as shown in listing 4. +

     
    float V_SmithGGXCorrelatedFast(float NoV, float NoL, float roughness) {
    +    float a = roughness;
    +    float GGXV = NoL * (NoV * (1.0 - a) + a);
    +    float GGXL = NoV * (NoL * (1.0 - a) + a);
    +    return 0.5 / (GGXV + GGXL);
    +}
    Listing 4: Implementation of the approximated specular V term in GLSL
    +

    + +[Hammon17] proposes the same approximation based on the same observation that the square root can be removed. It does so by rewriting the expressions as lerps: +

    +$$\begin{equation} +V(v,l,\alpha) = \frac{0.5}{lerp(2 (\NoL) (\NoV), \NoL + \NoV, \alpha)} +\end{equation}$$ +

    +   

    Fresnel (specular F)

    +

    + +The Fresnel effect plays an important role in the appearance of physically based materials. This effect models the fact that the amount of light the viewer sees reflected from a surface depends on the viewing angle. Large bodies of water are a perfect way to experience this phenomenon, as shown in figure 10. When looking at the water straight down (at normal incidence) you can see through the water. However, when looking further out in the distance (at grazing angle, where perceived light rays are getting parallel to the surface), you will see the specular reflections on the water become more intense. +

    +The amount of light reflected depends not only on the viewing angle, but also on the index of refraction (IOR) of the material. At normal incidence (perpendicular to the surface, or 0° angle), the amount of light reflected back is noted \(\fNormal\) and can be derived from the IOR as we will see in section 4.8.3.2. The amount of light reflected back at grazing angle is noted \(\fGrazing\) and approaches 100% for smooth materials. +

    +

     
    Figure 10: The Fresnel effect is particularly evident on large bodies of water
    +

    +More formally, the Fresnel term defines how light reflects and refracts at the interface between two different media, or the ratio of reflected and transmitted energy. [Schlick94] describes an inexpensive approximation of the Fresnel term for the Cook-Torrance specular BRDF: +

    +$$\begin{equation} +F_{Schlick}(v,h,\fNormal,\fGrazing) = \fNormal + (\fGrazing - \fNormal)(1 - \VoH)^5 +\end{equation}$$ +

    +The constant \(\fNormal\) represents the specular reflectance at normal incidence and is achromatic for dielectrics, and chromatic for metals. The actual value depends on the index of refraction of the interface. The GLSL implementation of this term requires the use of a pow, as shown in listing 5, which can be replaced by a few multiplications. +

     
    vec3 F_Schlick(float u, vec3 f0, float f90) {
    +    return f0 + (vec3(f90) - f0) * pow(1.0 - u, 5.0);
    +}
    Listing 5: Implementation of the specular F term in GLSL
    +

    + +This Fresnel function can be seen as interpolating between the incident specular reflectance and the reflectance at grazing angles, represented here by \(\fGrazing\). Observation of real world materials show that both dielectrics and conductors exhibit achromatic specular reflectance at grazing angles and that the Fresnel reflectance is 1.0 at 90°. A more correct \(\fGrazing\) is discussed in section 5.6.2. +

    +Using \(\fGrazing\) set to 1, the Schlick approximation for the Fresnel term can be optimized for scalar operations by refactoring the code slightly. The result is shown in listing 6. +

     
    vec3 F_Schlick(float u, vec3 f0) {
    +    float f = pow(1.0 - u, 5.0);
    +    return f + f0 * (1.0 - f);
    +}
    Listing 6: Scalar optimization of the specular F term in GLSL
    +   

    Diffuse BRDF

    +

    + +In the diffuse term, \(f_m\) is a Lambertian function and the diffuse term of the BRDF becomes: +

    +$$\begin{equation} +\fDiffuse(v,l) = \frac{\sigma}{\pi} \frac{1}{| \NoV | | \NoL |} +\int_\Omega D(m,\alpha) G(v,l,m) (v \cdot m) (l \cdot m) dm +\end{equation}$$ +

    +Our implementation will instead use a simple Lambertian BRDF that assumes a uniform diffuse response over the microfacets hemisphere: +

    +$$\begin{equation} +\fDiffuse(v,l) = \frac{\sigma}{\pi} +\end{equation}$$ +

    +In practice, the diffuse reflectance \(\sigma\) is multiplied later, as shown in listing 8. +

     
    float Fd_Lambert() {
    +    return 1.0 / PI;
    +}
    +
    +vec3 Fd = diffuseColor * Fd_Lambert();
    Listing 7: Implementation of the diffuse Lambertian BRDF in GLSL
    +

    + +The Lambertian BRDF is obviously extremely efficient and delivers results close enough to more complex models. +

    +However, the diffuse part would ideally be coherent with the specular term and take into account the surface roughness. Both the Disney diffuse BRDF [Burley12] and Oren-Nayar model [Oren94] take the roughness into account and create some retro-reflection at grazing angles. Given our constraints we decided that the extra runtime cost does not justify the slight increase in quality. This sophisticated diffuse model also renders image-based and spherical harmonics more difficult to express and implement. +

    +For completeness, the Disney diffuse BRDF expressed in [Burley12] is the following: +

    +$$\begin{equation} +\fDiffuse(v,l) = \frac{\sigma}{\pi} \schlick(n,l,1,\fGrazing) \schlick(n,v,1,\fGrazing) +\end{equation}$$ +

    +Where: +

    +$$\begin{equation} +\fGrazing=0.5 + 2 \cdot \alpha cos^2(\theta_d) +\end{equation}$$ +

     
    float F_Schlick(float u, float f0, float f90) {
    +    return f0 + (f90 - f0) * pow(1.0 - u, 5.0);
    +}
    +
    +float Fd_Burley(float NoV, float NoL, float LoH, float roughness) {
    +    float f90 = 0.5 + 2.0 * roughness * LoH * LoH;
    +    float lightScatter = F_Schlick(NoL, 1.0, f90);
    +    float viewScatter = F_Schlick(NoV, 1.0, f90);
    +    return lightScatter * viewScatter * (1.0 / PI);
    +}
    Listing 8: Implementation of the diffuse Disney BRDF in GLSL
    +

    + +Figure 11 shows a comparison between a simple Lambertian diffuse BRDF and the higher quality Disney diffuse BRDF, using a fully rough dielectric material. For comparison purposes, the right sphere was mirrored. The surface response is very similar with both BRDFs but the Disney one exhibits some nice retro-reflections at grazing angles (look closely at the left edge of the spheres). +

    +

     
    Figure 11: Comparison between the Lambertian diffuse BRDF (left) and the Disney diffuse BRDF (right)
    +

    +We could allow artists/developers to choose the Disney diffuse BRDF depending on the quality they desire and the performance of the target device. It is important to note however that the Disney diffuse BRDF is not energy conserving as expressed here. +

    +   

    Standard model summary

    +

    + +Specular term: a Cook-Torrance specular microfacet model, with a GGX normal distribution function, a Smith-GGX height-correlated visibility function, and a Schlick Fresnel function. +

    +Diffuse term: a Lambertian diffuse model. +

    +The full GLSL implementation of the standard model is shown in listing 9. +

     
    float D_GGX(float NoH, float a) {
    +    float a2 = a * a;
    +    float f = (NoH * a2 - NoH) * NoH + 1.0;
    +    return a2 / (PI * f * f);
    +}
    +
    +vec3 F_Schlick(float u, vec3 f0) {
    +    return f0 + (vec3(1.0) - f0) * pow(1.0 - u, 5.0);
    +}
    +
    +float V_SmithGGXCorrelated(float NoV, float NoL, float a) {
    +    float a2 = a * a;
    +    float GGXL = NoV * sqrt((-NoL * a2 + NoL) * NoL + a2);
    +    float GGXV = NoL * sqrt((-NoV * a2 + NoV) * NoV + a2);
    +    return 0.5 / (GGXV + GGXL);
    +}
    +
    +float Fd_Lambert() {
    +    return 1.0 / PI;
    +}
    +
    +void BRDF(...) {
    +    vec3 h = normalize(v + l);
    +
    +    float NoV = abs(dot(n, v)) + 1e-5;
    +    float NoL = clamp(dot(n, l), 0.0, 1.0);
    +    float NoH = clamp(dot(n, h), 0.0, 1.0);
    +    float LoH = clamp(dot(l, h), 0.0, 1.0);
    +
    +    // perceptually linear roughness to roughness (see parameterization)
    +    float roughness = perceptualRoughness * perceptualRoughness;
    +
    +    float D = D_GGX(NoH, roughness);
    +    vec3  F = F_Schlick(LoH, f0);
    +    float V = V_SmithGGXCorrelated(NoV, NoL, roughness);
    +
    +    // specular BRDF
    +    vec3 Fr = (D * V) * F;
    +
    +    // diffuse BRDF
    +    vec3 Fd = diffuseColor * Fd_Lambert();
    +
    +    // apply lighting...
    +}
    Listing 9: Evaluation of the BRDF in GLSL
    +   

    Improving the BRDFs

    +

    + +We mentioned in section 4.3 that energy conservation is one of the key components of a good BRDF. Unfortunately the BRDFs explored previously suffer from two problems that we will examine below. +

    +   

    Energy gain in diffuse reflectance

    +

    + +The Lambert diffuse BRDF does not account for the light that reflects at the surface and that is therefore not able to participate in the diffuse scattering event. +

    +[TODO: talk about the issue with fr+fd] +

    +   

    Energy loss in specular reflectance

    +

    + +The Cook-Torrance BRDF we presented earlier attempts to model several events at the microfacet level but does so by accounting for a single bounce of light. This approximation can cause a loss of energy at high roughness, the surface is not energy preserving. Figure 12 shows why this loss of energy occurs. In the single bounce (or single scattering) model, a ray of light hitting the surface can be reflected back onto another microfacet and thus be discarded because of the masking and shadowing term. If we however account for multiple bounces (multiscattering), the same ray of light might escape the microfacet field and be reflected back towards the viewer. +

    +

     
    Figure 12: Single scattering (left) vs multiscattering
    +

    +Based on this simple explanation, we can intuitively deduce that the rougher a surface is, the higher the chances are that energy gets lost because of the failure to account for multiple scattering events. This loss of energy appears to darken rough materials. Metallic surfaces are particularly affected because all of their reflectance is specular. This darkening effect is illustrated in figure 13. With multiscattering, energy preservation can be achieved, as shown in figure 14. +

    +

     
    Figure 13: Darkening increases with roughness due to single scattering
    +

    +

     
    Figure 14: Energy preservation with multiscattering
    +

    +We can use a white furnace, a uniform lighting environment set to pure white, to validate the energy preservation property of a BRDF. When energy preservation is achieved, a purely reflective metallic surface (\(\fNormal = 1\)) should be indistinguishable from the background, no matter the roughness of said surface. Figure 15 shows what such a surface looks like with the specular BRDF presented in the previous sections. The loss of energy as the roughness increases is obvious. In contrast, figure 16 shows that accounting for multiscattering events addresses the energy loss. +

    +

     
    Figure 15: Darkening increases with roughness due to single scattering
    +

    +

     
    Figure 16: Energy preservation with multiscattering
    +

    +Multiple-scattering microfacet BRDFs are discussed in depth in [Heitz16]. Unfortunately this paper only presents a stochastic evaluation of the multiscattering BRDF. This solution is therefore not suitable for real-time rendering. Kulla and Conty present a different approach in [Kulla17]. Their idea is to add an energy compensation term as an additional BRDF lobe shown in equation \(\ref{energyCompensationLobe}\): +

    +$$\begin{equation}\label{energyCompensationLobe} +f_{ms}(l,v) = \frac{(1 - E(l)) (1 - E(v)) F_{avg}^2 E_{avg}}{\pi (1 - E_{avg}) (1 - F_{avg}(1 - E_{avg}))} +\end{equation}$$ +

    +Where \(E\) is the directional albedo of the specular BRDF \(f_r\), with \(\fNormal\) set to 1: +

    +$$\begin{equation} +E(l) = \int_{\Omega} f(l,v) (\NoV) dv +\end{equation}$$ +

    +The term \(E_{avg}\) is the cosine-weighted average of \(E\): +

    +$$\begin{equation} +E_{avg} = 2 \int_0^1 E(\mu) \mu d\mu +\end{equation}$$ +

    +Similarly, \(F_{avg}\) is the cosine-weighted average of the Fresnel term: +

    +$$\begin{equation} +F_{avg} = 2 \int_0^1 F(\mu) \mu d\mu +\end{equation}$$ +

    +Both terms \(E\) and \(E_{avg}\) can be precomputed and stored in lookup tables. while \(F_{avg}\) can be greatly simplified when the Schlick approximation is used: +

    +$$\begin{equation}\label{averageFresnel} +F_{avg} = \frac{1 + 20 \fNormal}{21} +\end{equation}$$ +

    +This new lobe is combined with the original single scattering lobe, previously noted \(f_r\): +

    +$$\begin{equation} +f_{r}(l,v) = f_{ss}(l,v) + f_{ms}(l,v) +\end{equation}$$ +

    +In [Lagarde18], with credit to Emmanuel Turquin, Lagarde and Golubev make the observation that equation \(\ref{averageFresnel}\) can be simplified to \(\fNormal\). They also propose to apply energy compensation by adding a scaled GGX specular lobe: +

    +$$\begin{equation}\label{energyCompensation} +f_{ms}(l,v) = \fNormal \frac{1 - E(l)}{E(l)} f_{ss}(l,v) +\end{equation}$$ +

    +The key insight is that \(E(l)\) can not only be precomputed but also shared with image-based lighting pre-integration. The multiscattering energy compensation formula thus becomes: +

    +$$\begin{equation}\label{scaledEnergyCompensationLobe} +f_r(l,v) = f_{ss}(l,v) + \fNormal \left( \frac{1}{r} - 1 \right) f_{ss}(l,v) +\end{equation}$$ +

    +Where \(r\) is defined as: +

    +$$\begin{equation} +r = \int_{\Omega} D(l,v) V(l,v) \left< \NoL \right> dl +\end{equation}$$ +

    +We can implement specular energy compensation at a negligible cost if we store \(r\) in the DFG lookup table presented in section 5.3. Listing 10 shows that the implementation is a direct conversion of equation \(\ref{scaledEnergyCompensationLobe}\). +

     
    vec3 energyCompensation = 1.0 + f0 * (1.0 / dfg.y - 1.0);
    +// Scale the specular lobe to account for multiscattering
    +Fr *= pixel.energyCompensation;
    Listing 10: Implementation of the energy compensation specular lobe
    +

    + +Please refer to section 5.3 and section 5.3.4.7 to learn how the DFG lookup table is derived and computed. +

    +   

    Parameterization

    +

    + +Disney's material model described in [Burley12] is a good starting point but its numerous parameters makes it impractical for real-time implementations. In addition, we would like our standard material model to be easy to understand and easy to use for both artists and developers. +

    +   

    Standard parameters

    +

    + +Table 2 describes the list of parameters that satisfy our constraints. +

    +

    +  + + + + + + +
    Parameter Definition
    BaseColor Diffuse albedo for non-metallic surfaces, and specular color for metallic surfaces
    Metallic Whether a surface appears to be dielectric (0.0) or conductor (1.0). Often used as a binary value (0 or 1)
    Roughness Perceived smoothness (0.0) or roughness (1.0) of a surface. Smooth surfaces exhibit sharp reflections
    Reflectance Fresnel reflectance at normal incidence for dielectric surfaces. This replaces an explicit index of refraction
    Emissive Additional diffuse albedo to simulate emissive surfaces (such as neons, etc.) This parameter is mostly useful in an HDR pipeline with a bloom pass
    Ambient occlusion Defines how much of the ambient light is accessible to a surface point. It is a per-pixel shadowing factor between 0.0 and 1.0. This parameter will be discussed in more details in the lighting section
    Table 2: Parameters of the standard model
    +

    +Figure 17 shows how the metallic, roughness and reflectance parameters affect the appearance of a surface. +

    +

     
    Figure 17: From top to bottom: varying metallic, varying dielectric roughness, varying metallic roughness, varying reflectance
    +

    +   

    Types and ranges

    +

    + +It is important to understand the type and range of the different parameters of our material model, described in table 3. +

    +

    +  + + + + + + +
    Parameter Type and range
    BaseColor Linear RGB [0..1]
    Metallic Scalar [0..1]
    Roughness Scalar [0..1]
    Reflectance Scalar [0..1]
    Emissive Linear RGB [0..1] + exposure compensation
    Ambient occlusion Scalar [0..1]
    Table 3: Range and type of the standard model's parameters
    +

    +Note that the types and ranges described here are what the shader will expect. The API and/or tools UI could and should allow to specify the parameters using other types and ranges when they are more intuitive for artists. +

    +For instance, the base color could be expressed in sRGB space and converted to linear space before being sent off to the shader. It can also be useful for artists to express the metallic, roughness and reflectance parameters as gray values between 0 and 255 (black to white). +

    +Another example: the emissive parameter could be expressed as a color temperature and an intensity, to simulate the light emitted by a black body. +

    +   

    Remapping

    +

    + +To make the standard material model easier and more intuitive to use for artists, we must remap the parameters baseColor, roughness and reflectance. +

    +   

    Base color remapping

    +

    + +The base color of a material is affected by the “metallicness” of said material. Dielectrics have achromatic specular reflectance but retain their base color as the diffuse color. Conductors on the other hand use their base color as the specular color and do not have a diffuse component. +

    +The lighting equations must therefore use the diffuse color and \(\fNormal\) instead of the base color. The diffuse color can easily be computed from the base color, as show in listing 11. +

     
    vec3 diffuseColor = (1.0 - metallic) * baseColor.rgb;
    Listing 11: Conversion of base color to diffuse in GLSL
    +   

    Reflectance remapping

    +

    + +Dielectrics +

    +The Fresnel term relies on \(\fNormal\), the specular reflectance at normal incidence angle, and is achromatic for dielectrics. We will use the remapping for dielectric surfaces described in [Lagarde14] : +

    +$$\begin{equation} +\fNormal = 0.16 \cdot reflectance^2 +\end{equation}$$ +

    +The goal is to map \(\fNormal\) onto a range that can represent the Fresnel values of both common dielectric surfaces (4% reflectance) and gemstones (8% to 16%). The mapping function is chosen to yield a 4% Fresnel reflectance value for an input reflectance of 0.5 (or 128 on a linear RGB gray scale). Figure 18 show those common values and how they relate to the mapping function. +

    +

     
    Figure 18: Common reflectance values
    +

    +If the index of refraction is known (for instance, an air-water interface has an IOR of 1.33), the Fresnel reflectance can be calculated as follows: +

    +$$\begin{equation}\label{fresnelEquation} +\fNormal(n_{ior}) = \frac{(\nior - 1)^2}{(\nior + 1)^2} +\end{equation}$$ +

    +And if the reflectance value is known, we can compute the corresponding IOR: +

    +$$\begin{equation} +n_{ior} = \frac{2}{1 - \sqrt{\fNormal}} - 1 +\end{equation}$$ +

    +Table 4 describes acceptable Fresnel reflectance values for various types of materials (no real world material has a value under 2%). +

    +

    +  + + + + + + + + + + + +
    Material Reflectance IOR Linear value
    Water 2% 1.33 0.35
    Fabric 4% to 5.6% 1.5 to 1.62 0.5 to 0.59
    Common liquids 2% to 4% 1.33 to 1.5 0.35 to 0.5
    Common gemstones 5% to 16% 1.58 to 2.33 0.56 to 1.0
    Plastics, glass 4% to 5% 1.5 to 1.58 0.5 to 0.56
    Other dielectric materials 2% to 5% 1.33 to 1.58 0.35 to 0.56
    Eyes 2.5% 1.38 0.39
    Skin 2.8% 1.4 0.42
    Hair 4.6% 1.55 0.54
    Teeth 5.8% 1.63 0.6
    Default value 4% 1.5 0.5
    Table 4: Reflectance of common materials (source: Real-Time Rendering 4th Edition)
    +

    +Table 5 lists the \(\fNormal\) values for a few metals. The values are given in sRGB and must be used as the base color in our material model. Please refer to the annex, section 9.1, for an explanation of how these sRGB colors are computed from measured data. +

    +

    +  + + + + + + + + +
    Metal \(\fNormal\) in sRGB Hexadecimal Color
    Silver 0.97, 0.96, 0.91 #f7f4e8
     
    Aluminum 0.91, 0.92, 0.92 #e8eaea
     
    Titanium 0.76, 0.73, 0.69 #c1baaf
     
    Iron 0.77, 0.78, 0.78 #c4c6c6
     
    Platinum 0.83, 0.81, 0.78 #d3cec6
     
    Gold 1.00, 0.85, 0.57 #ffd891
     
    Brass 0.98, 0.90, 0.59 #f9e596
     
    Copper 0.97, 0.74, 0.62 #f7bc9e
     
    Table 5: \(\fNormal\) for common metals
    +

    +All materials have a Fresnel reflectance of 100% at grazing angles so we will set \(\fGrazing\) in the following way when evaluating the specular BRDF \(\fSpecular\): +

    +$$\begin{equation} +\fGrazing = 1.0 +\end{equation}$$ +

    +Figure 19 shows a red plastic ball. If you look closely at the edges of the sphere, you will be able to notice the achromatic specular reflectance at grazing angles. +

    +

     
    Figure 19: The specular reflectance becomes achromatic at grazing angles
    +

    +Conductors +

    +The specular reflectance of metallic surfaces is chromatic: +

    +$$\begin{equation} +\fNormal = baseColor \cdot metallic +\end{equation}$$ +

    +Listing 12 shows how \(\fNormal\) is computed for both dielectric and metallic materials. It shows that the color of the specular reflectance is derived from the base color in the metallic case. +

     
    vec3 f0 = 0.16 * reflectance * reflectance * (1.0 - metallic) + baseColor * metallic;
    Listing 12: Computing \(\fNormal\) for dielectric and metallic materials in GLSL
    +   

    Roughness remapping and clamping

    +

    + +The roughness set by the user, called perceptualRoughness here, is remapped to a perceptually linear range using the following formulation: +

    +$$\begin{equation} +\alpha = perceptualRoughness^2 +\end{equation}$$ +

    +Figure 20 shows a silver metallic surface with increasing roughness (from 0.0 to 1.0), using the unmodified roughness value (bottom) and the remapped value (top). +

    +

     
    Figure 20: Roughness remapping comparison: perceptually linear roughness (top) and roughness (bottom)
    +

    +Using this visual comparison, it is obvious that the remapped roughness is easier to understand by artists and developers. Without this remapping, shiny metallic surfaces would have to be confined to a very small range between 0.0 and 0.05. +

    +Brent Burley made similar observations in his presentation [Burley12]. After experimenting with other remappings (cubic and quadratic mappings for instance), we have reached the conclusion that this simple square remapping delivers visually pleasing and intuitive results while being cheap for real-time applications. +

    +Last but not least, it is important to note that the roughness parameters is used in various computations at runtime where limited floating point precision can become an issue. For instance, mediump precision floats are often implemented as half-floats (fp16) on mobile GPUs. +

    +This cause problems when computing small values like \(\frac{1}{perceptualRoughness^4}\) in our lighting equations (roughness squared in the GGX computation). The smallest value that can be represented as a half-float is \(2^{-14}\) or \(6.1 \times 10^{-5}\). To avoid divisions by 0 on devices that do not support denormals, the result of \(\frac{1}{roughness^4}\) must therefore not be lower than \(6.1 \times 10^{-5}\). To do so, we must clamp the roughness to 0.089, which gives us \(6.274 \times 10^{-5}\). +

    +Denormals should also be avoided to prevent performance drops. The roughness can also not be set to 0 to avoid obvious divisions by 0. +

    +Since we also want specular highlights to have a minimum size (a roughness close to 0 creates almost invisible highlights), we should clamp the roughness to a safe range in the shader. This clamping has the added benefit of correcting specular aliasing1 that can appear for low roughness values. +

    +

     1 The Frostbite engine clamps the roughness of analytical lights to 0.045 to reduce specular aliasing. This is possible when using single precision floats (fp32). +
    +

    +   

    Blending and layering

    +

    + +As noted in [Burley12] and [Neubelt13], this model allows for robust blending between different materials by simply interpolating the different parameters. In particular, this allows to layer different materials using simple masks. +

    +For instance, figure 21 shows how the studio Ready at Dawn used material blending and layering in The Order: 1886 to create complex appearances from a library of simple materials (gold, copper, wood, rust, etc.). +

    +

     
    Figure 21: Material blending and layering. Source: Ready at Dawn Studios
    +

    +The blending and layering of materials is effectively an interpolation of the various parameters of the material model. Figure 22 show an interpolation between shiny metallic chrome and rough red plastic. While the intermediate blended materials make little physical sense, they look plausible. +

    +

     
    Figure 22: Interpolation from shiny chrome (left) to rough red plastic (right)
    +

    +   

    Crafting physically based materials

    +

    + +Designing physically based materials is fairly easy once you understand the nature of the four main parameters: base color, metallic, roughness and reflectance. +

    +We provide a useful chart/reference guide to help artists and developers craft their own physically based materials. +

    +

    Crafting physically based materials
    +

    +In addition, here is a quick summary of how to use our material model: +

    +

    All materials

    Base color should be devoid of lighting information, except for micro-occlusion. +

    + Metallic is almost a binary value. Pure conductors have a metallic value of 1 and pure dielectrics have a metallic value of 0. You should try to use values close at or close to 0 and 1. Intermediate values are meant for transitions between surface types (metal to rust for instance). +

    Non-metallic materials

    Base color represents the reflected color and should be an sRGB value in the range 50-240 (strict range) or 30-240 (tolerant range). +

    + Metallic should be 0 or close to 0. +

    + Reflectance should be set to 127 sRGB (0.5 linear, 4% reflectance) if you cannot find a proper value. Do not use values under 90 sRGB (0.35 linear, 2% reflectance). +

    Metallic materials

    Base color represents both the specular color and reflectance. Use values with a luminosity of 67% to 100% (170-255 sRGB). Oxidized or dirty metals should use a lower luminosity than clean metals to take into account the non-metallic components. +

    + Metallic should be 1 or close to 1. +

    + Reflectance is ignored (calculated from the base color). +

    +   

    Clear coat model

    +

    + +The standard material model described previously is a good fit for isotropic surfaces made of a single layer. Multi-layer materials are unfortunately fairly common, particularly materials with a thin translucent layer over a standard layer. Real world examples of such materials include car paints, soda cans, lacquered wood, acrylic, etc. +

    +

     
    Figure 23: Comparison of a blue metallic surface under the standard material model (left) and the clear coat model (right)
    +

    +A clear coat layer can be simulated as an extension of the standard material model by adding a second specular lobe, which implies evaluating a second specular BRDF. To simplify the implementation and parameterization, the clear coat layer will always be isotropic and dielectric. The base layer can be anything allowed by the standard model (dielectric or conductor). +

    +Since incoming light will traverse the clear coat layer, we must also take the loss of energy into account as shown in figure 24. Our model will however not simulate inter reflection and refraction behaviors. +

    +

     
    Figure 24: Clear coat surface model
    +

    +   

    Clear coat specular BRDF

    +

    + +The clear coat layer will be modeled using the same Cook-Torrance microfacet BRDF used in the standard model. Since the clear coat layer is always isotropic and dielectric, with low roughness values (see section 4.9.3), we can choose cheaper DFG terms without notably sacrificing visual quality. +

    +A survey of the terms listed in [Karis13a] and [Burley12] shows that the Fresnel and NDF terms we already use in the standard model are not computationally more expensive than other terms. [Kelemen01] describes a much simpler term that can replace our Smith-GGX visibility term: +

    +$$\begin{equation} +V(l,h) = \frac{1}{4(\LoH)^2} +\end{equation}$$ +

    +This masking-shadowing function is not physically based, as shown in [Heitz14], but its simplicity makes it desirable for real-time rendering. +

    +In summary, our clear coat BRDF is a Cook-Torrance specular microfacet model, with a GGX normal distribution function, a Kelemen visibility function, and a Schlick Fresnel function. Listing 13 shows how trivial the GLSL implementation is. +

     
    float V_Kelemen(float LoH) {
    +    return 0.25 / (LoH * LoH);
    +}
    Listing 13: Implementation of the Kelemen visibility term in GLSL
    +

    + +Note on the Fresnel term +

    +The Fresnel term of the specular BRDF requires \(\fNormal\), the specular reflectance at normal incidence angle. This parameter can be computed from an index of refraction of an interface. We will assume that our clear coat layer is made of polyurethane, a common compound used in coatings and varnishes, or similar. An air-polyurethane interface has an IOR of 1.5, from which we can deduce \(\fNormal\): +

    +$$\begin{equation} +\fNormal(1.5) = \frac{(1.5 - 1)^2}{(1.5 + 1)^2} = 0.04 +\end{equation}$$ +

    +This corresponds to a Fresnel reflectance of 4% that we know is associated with common dielectric materials. +

    +   

    Integration in the surface response

    +

    + +Because we must take into account the loss of energy caused by the addition of the clear coat layer, we can reformulate the BRDF from equation \(\ref{brdf}\) thusly: +

    +$$\begin{equation} +f(v,l)=\fDiffuse(v,l) (1 - F_c) + \fSpecular(v,l) (1 - F_c) + f_c(v,l) +\end{equation}$$ +

    +Where \(F_c\) is the Fresnel term of the clear coat BRDF and \(f_c\) the clear coat BRDF +

    +   

    Clear coat parameterization

    +

    + +The clear coat material model encompasses all the parameters previously defined for the standard material mode, plus two parameters described in table 6. +

    +

    +  + + +
    Parameter Definition
    ClearCoat Strength of the clear coat layer. Scalar between 0 and 1
    ClearCoatRoughness Perceived smoothness or roughness of the clear coat layer. Scalar between 0 and 1
    Table 6: Clear coat model parameters
    +

    +The clear coat roughness parameter is remapped and clamped in a similar way to the roughness parameter of the standard material. +

    +Figure 25 and figure 26 show how the clear coat parameters affect the appearance of a surface. +

    +

     
    Figure 25: Clear coat varying from 0.0 (left) to 1.0 (right) with metallic set to 1.0 and roughness to 0.8
    +

    +

     
    Figure 26: Clear coat roughness varying from 0.0 (left) to 1.0 (right) with metallic set to 1.0, roughness to 0.8 and clear coat to 1.0
    +

    +Listing 14 shows the GLSL implementation of the clear coat material model after remapping, parameterization and integration in the standard surface response. +

     
    void BRDF(...) {
    +    // compute Fd and Fr from standard model
    +
    +    // remapping and linearization of clear coat roughness
    +    clearCoatPerceptualRoughness = clamp(clearCoatPerceptualRoughness, 0.089, 1.0);
    +    clearCoatRoughness = clearCoatPerceptualRoughness * clearCoatPerceptualRoughness;
    +
    +    // clear coat BRDF
    +    float  Dc = D_GGX(clearCoatRoughness, NoH);
    +    float  Vc = V_Kelemen(clearCoatRoughness, LoH);
    +    float  Fc = F_Schlick(0.04, LoH) * clearCoat; // clear coat strength
    +    float Frc = (Dc * Vc) * Fc;
    +
    +    // account for energy loss in the base layer
    +    return color * ((Fd + Fr * (1.0 - Fc)) * (1.0 - Fc) + Frc);
    +}
    Listing 14: Implementation of the clear coat BRDF in GLSL
    +   

    Base layer modification

    +

    + +The presence of a clear coat layer means that we should recompute \(\fNormal\), since it is normally based on an air-material interface. The base layer thus requires \(\fNormal\) to be computed based on a clear coat-material interface instead. +

    +This can be achieved by computing the material's index of refraction (IOR) from \(\fNormal\), then computing a new \(\fNormal\) based on the newly computed IOR and the IOR of the clear coat layer (1.5). +

    +First, we compute the base layer's IOR: +

    +$$ +IOR_{base} = \frac{1 + \sqrt{\fNormal}}{1 - \sqrt{\fNormal}} +$$ +

    +Then we compute the new \(\fNormal\) from this new index of refraction: +

    +$$ +f_{0_{base}} = \left( \frac{IOR_{base} - 1.5}{IOR_{base} + 1.5} \right) ^2 +$$ +

    +Since the clear coat layer's IOR is fixed, we can combine both steps to simplify: +

    +$$ +f_{0_{base}} = \frac{\left( 1 - 5 \sqrt{\fNormal} \right) ^2}{\left( 5 - \sqrt{\fNormal} \right) ^2} +$$ +

    +We should also modify the base layer's apparent roughness based on the IOR of the clear coat layer but this is something we have opted to leave out for now. +

    +   

    Anisotropic model

    +

    + +The standard material model described previously can only describe isotropic surfaces, that is, surfaces whose properties are identical in all directions. Many real-world materials, such as brushed metal, can, however, only be replicated using an anisotropic model. +

    +

     
    Figure 27: Comparison of isotropic material (left) and anisotropic material (right)
    +

    +   

    Anisotropic specular BRDF

    +

    + +The isotropic specular BRDF described previously can be modified to handle anisotropic materials. Burley achieves this by using an anisotropic GGX NDF: +

    +$$\begin{equation} +D_{aniso}(h,\alpha) = \frac{1}{\pi \alpha_t \alpha_b} \frac{1}{((\frac{t \cdot h}{\alpha_t})^2 + (\frac{b \cdot h}{\alpha_b})^2 + (\NoH)^2)^2} +\end{equation}$$ +

    +This NDF unfortunately relies on two supplemental roughness terms noted \(\alpha_b\), the roughness along the bitangent direction, and \(\alpha_t\), the roughness along the tangent direction. Neubelt and Pettineo [Neubelt13] propose a way to derive \(\alpha_b\) from \(\alpha_t\) by using an anisotropy parameter that describes the relationship between the two roughness values for a material: +

    +$$ +\begin{align*} + \alpha_t &= \alpha \\ + \alpha_b &= lerp(0, \alpha, 1 - anisotropy) +\end{align*} +$$ +

    +The relationship defined in [Burley12] is different, offers more pleasant and intuitive results, but is slightly more expensive: +

    +$$ +\begin{align*} + \alpha_t &= \frac{\alpha}{\sqrt{1 - 0.9 \times anisotropy}} \\ + \alpha_b &= \alpha \sqrt{1 - 0.9 \times anisotropy} +\end{align*} +$$ +

    +We instead opted to follow the relationship described in [Kulla17] as it allows creation of sharp highlights: +

    +$$ +\begin{align*} + \alpha_t &= \alpha \times (1 + anisotropy) \\ + \alpha_b &= \alpha \times (1 - anisotropy) +\end{align*} +$$ +

    +Note that this NDF requires the tangent and bitangent directions in addition to the normal direction. Since these directions are already needed for normal mapping, providing them may not be an issue. +

    +The resulting implementation is described in listing 15. +

     
    float at = max(roughness * (1.0 + anisotropy), 0.001);
    +float ab = max(roughness * (1.0 - anisotropy), 0.001);
    +
    +float D_GGX_Anisotropic(float NoH, const vec3 h,
    +        const vec3 t, const vec3 b, float at, float ab) {
    +    float ToH = dot(t, h);
    +    float BoH = dot(b, h);
    +    float a2 = at * ab;
    +    highp vec3 v = vec3(ab * ToH, at * BoH, a2 * NoH);
    +    highp float v2 = dot(v, v);
    +    float w2 = a2 / v2;
    +    return a2 * w2 * w2 * (1.0 / PI);
    +}
    Listing 15: Implementation of Burley's anisotropic NDF in GLSL
    +

    + +In addition, [Heitz14] presents an anisotropic masking-shadowing function to match the height-correlated GGX distribution. The masking-shadowing term can be greatly simplified by using the visibility function instead: +

    +$$\begin{equation} +G(v,l,h,\alpha) = \frac{\chi^+(\VoH) \chi^+(\LoH)}{1 + \Lambda(v) + \Lambda(l)} +\end{equation}$$ +

    +$$\begin{equation} +\Lambda(m) = \frac{-1 + \sqrt{1 + \alpha_0^2 tan^2(\theta_m)}}{2} = \frac{-1 + \sqrt{1 + \alpha_0^2 \frac{(1 - cos^2(\theta_m))}{cos^2(\theta_m)}}}{2} +\end{equation}$$ +

    +Where: +

    +$$\begin{equation} +\alpha_0 = \sqrt{cos^2(\phi_0)\alpha_x^2 + sin^2(\phi_0)\alpha_y^2} +\end{equation}$$ +

    +After derivation we obtain: +

    +$$\begin{equation} +V_{aniso}(\NoL,\NoV,\alpha) = \frac{1}{2((\NoL)\hat{\Lambda}_v+(\NoV)\hat{\Lambda}_l)} \\ +\hat{\Lambda}_v = \sqrt{\alpha^2_t(t \cdot v)^2+\alpha^2_b(b \cdot v)^2+(\NoV)^2} \\ +\hat{\Lambda}_l = \sqrt{\alpha^2_t(t \cdot l)^2+\alpha^2_b(b \cdot l)^2+(\NoL)^2} +\end{equation}$$ +

    +The term \( \hat{\Lambda}_v \) is the same for every light and can be computed only once if needed. The resulting implementation is described in listing 16. +

     
    float at = max(roughness * (1.0 + anisotropy), 0.001);
    +float ab = max(roughness * (1.0 - anisotropy), 0.001);
    +
    +float V_SmithGGXCorrelated_Anisotropic(float at, float ab, float ToV, float BoV,
    +        float ToL, float BoL, float NoV, float NoL) {
    +    float lambdaV = NoL * length(vec3(at * ToV, ab * BoV, NoV));
    +    float lambdaL = NoV * length(vec3(at * ToL, ab * BoL, NoL));
    +    float v = 0.5 / (lambdaV + lambdaL);
    +    return saturateMediump(v);
    +}
    Listing 16: Implementation of the anisotropic visibility function in GLSL
    +   

    Anisotropic parameterization

    +

    + +The anisotropic material model encompasses all the parameters previously defined for the standard material mode, plus an extra parameter described in table 7. +

    +

    +  + +
    Parameter Definition
    Anisotropy Amount of anisotropy. Scalar between −1 and 1
    Table 7: Anisotropic model parameters
    +

    +No further remapping is required. Note that negative values will align the anisotropy with the bitangent direction instead of the tangent direction. Figure 28 shows how the anisotropy parameter affect the appearance of a rough metallic surface. +

    +

     
    Figure 28: Anisotropy varying from 0.0 (left) to 1.0 (right)
    +

    +   

    Subsurface model

    +

    + +[TODO] +

    +   

    Subsurface specular BRDF

    +

    + +[TODO] +

    +   

    Subsurface parameterization

    +

    + +[TODO] +

    +   

    Cloth model

    +

    + +All the material models described previously are designed to simulate dense surfaces, both at a macro and at a micro level. Clothes and fabrics are however often made of loosely connected threads that absorb and scatter incident light. The microfacet BRDFs presented earlier do a poor job of recreating the nature of cloth due to their underlying assumption that a surface is made of random grooves that behave as perfect mirrors. When compared to hard surfaces, cloth is characterized by a softer specular lobe with a large falloff and the presence of fuzz lighting, caused by forward/backward scattering. Some fabrics also exhibit two-tone specular colors (velvets for instance). +

    +Figure 29 shows how a traditional microfacet BRDF fails to capture the appearance of a sample of denim fabric. The surface appears rigid (almost plastic-like), more similar to a tarp than a piece of clothing. This figure also shows how important the softer specular lobe caused by absorption and scattering is to the faithful recreation of the fabric. +

    +

     
    Figure 29: Comparison of denim fabric rendered using a traditional microfacet BRDF (left) and our cloth BRDF (right)
    +

    +Velvet is an interesting use case for a cloth material model. As shown in figure 30 this type of fabric exhibits strong rim lighting due to forward and backward scattering. These scattering events are caused by fibers standing straight at the surface of the fabric. When the incident light comes from the direction opposite to the view direction, the fibers will forward-scatter the light. Similarly, when the incident light from the same direction as the view direction, the fibers will scatter the light backward. +

    +

     
    Figure 30: Velvet fabric showcasing forward and backward scattering
    +

    +Since fibers are flexible, we should in theory model the ability to groom the surface. While our model does not replicate this characteristic, it does model a visible front facing specular contribution that can be attributed to the random variance in the direction of the fibers. +

    +It is important to note that there are types of fabrics that are still best modeled by hard surface material models. For instance, leather, silk and satin can be recreated using the standard or anisotropic material models. +

    +   

    Cloth specular BRDF

    +

    + +The cloth specular BRDF we use is a modified microfacet BRDF as described by Ashikhmin and Premoze in [Ashikhmin07]. In their work, Ashikhmin and Premoze note that the distribution term is what contributes most to a BRDF and that the shadowing/masking term is not necessary for their velvet distribution. The distribution term itself is an inverted Gaussian distribution. This helps achieve fuzz lighting (forward and backward scattering) while an offset is added to simulate the front facing specular contribution. The so-called velvet NDF is defined as follows: +

    +$$\begin{equation} +D_{velvet}(v,h,\alpha) = c_{norm}(1 + 4 exp\left(\frac{-{cot}^2\theta_{h}}{\alpha^2}\right)) +\end{equation}$$ +

    +This NDF is a variant of the NDF the same authors describe in [Ashikhmin00], notably modified to include an offset (set to 1 here) and an amplitude (4). In [Neubelt13], Neubelt and Pettineo propose a normalized version of this NDF: +

    +$$\begin{equation} +D_{velvet}(v,h,\alpha) = \frac{1}{\pi(1 + 4\alpha^2)} (1 + 4 \frac{exp\left(\frac{-{cot}^2\theta_{h}}{\alpha^2}\right)}{{sin}^4\theta_{h}}) +\end{equation}$$ +

    +For the full specular BRDF, we also follow [Neubelt13] and replace the traditional denominator with a smoother variant: +

    +$$\begin{equation}\label{clothSpecularBRDF} +f_{r}(v,h,\alpha) = \frac{D_{velvet}(v,h,\alpha)}{4(\NoL + \NoV - (\NoL)(\NoV))} +\end{equation}$$ +

    +The implementation of the velvet NDF is presented in listing 17, optimized to properly fit in half float formats and to avoid computing a costly cotangent, relying instead on trigonometric identities. Note that we removed the Fresnel component from this BRDF. +

     
    float D_Ashikhmin(float roughness, float NoH) {
    +    // Ashikhmin 2007, "Distribution-based BRDFs"
    + float a2 = roughness * roughness;
    + float cos2h = NoH * NoH;
    + float sin2h = max(1.0 - cos2h, 0.0078125); // 2^(-14/2), so sin2h^2 > 0 in fp16
    + float sin4h = sin2h * sin2h;
    + float cot2 = -cos2h / (a2 * sin2h);
    + return 1.0 / (PI * (4.0 * a2 + 1.0) * sin4h) * (4.0 * exp(cot2) + sin4h);
    +}
    Listing 17: Implementation of Ashikhmin's velvet NDF in GLSL
    +

    + +In [Estevez17] Estevez and Kulla propose a different NDF (called the “Charlie” sheen) that is based on an exponentiated sinusoidal instead of an inverted Gaussian. This NDF is appealing for several reasons: its parameterization feels more natural and intuitive, it provides a softer appearance and, as shown in equation \(\ref{charlieNDF}\), its implementation is simpler: +

    +$$\begin{equation}\label{charlieNDF} +D(m) = \frac{(2 + \frac{1}{\alpha}) sin(\theta)^{\frac{1}{\alpha}}}{2 \pi} +\end{equation}$$ +

    +[Estevez17] also presents a new shadowing term that we omit here because of its cost. We instead rely on the visibility term from [Neubelt13] (shown in equation \(\ref{clothSpecularBRDF}\) above). +The implementation of this NDF is presented in listing 18, optimized to properly fit in half float formats. +

     
    float D_Charlie(float roughness, float NoH) {
    +    // Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF"
    +    float invAlpha  = 1.0 / roughness;
    +    float cos2h = NoH * NoH;
    +    float sin2h = max(1.0 - cos2h, 0.0078125); // 2^(-14/2), so sin2h^2 > 0 in fp16
    +    return (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);
    +}
    Listing 18: Implementation of the “Charlie” NDF in GLSL
    +   

    Sheen color

    +

    + +To offer better control over the appearance of cloth and to give users the ability to recreate two-tone specular materials, we introduce the ability to directly modify the specular reflectance. Figure 31 shows an example of using the parameter we call “sheen color”. +

    +

     
    Figure 31: Blue fabric without (left) and with (right) sheen
    +

    +   

    Cloth diffuse BRDF

    +

    + +Our cloth material model still relies on a Lambertian diffuse BRDF. It is however slightly modified to be energy conservative (akin to the energy conservation of our clear coat material model) and offers an optional subsurface scattering term. This extra term is not physically based and can be used to simulate the scattering, partial absorption and re-emission of light in certain types of fabrics. +

    +First, here is the diffuse term without the optional subsurface scattering: +

    +$$\begin{equation} +f_{d}(v,h) = \frac{c_{diff}}{\pi}(1 - F(v,h)) +\end{equation}$$ +

    +Where \(F(v,h)\) is the Fresnel term of the cloth specular BRDF in equation \(\ref{clothSpecularBRDF}\). In practice we've opted to leave out the \(1 - F(v, h)\) term in the diffuse component. The effect is a bit subtle and we deemed it wasn't worth the added cost. +

    +Subsurface scattering is implemented using the wrapped diffuse lighting technique, in its energy conservative form: +

    +$$\begin{equation} +f_{d}(v,h) = \frac{c_{diff}}{\pi}(1 - F(v,h)) \left< \frac{\NoL + w}{(1 + w)^2} \right> \left< c_{subsurface} + \NoL \right> +\end{equation}$$ +

    +Where \(w\) is a value between 0 and 1 defining by how much the diffuse light should wrap around the terminator. To avoid introducing another parameter, we fix \(w = 0.5\). Note that with wrap diffuse lighting, the diffuse term must not be multiplied by \(\NoL\). The effect of this cheap +subsurface scattering approximation can be seen in figure 32. +

    +

     
    Figure 32: White cloth (left column) vs white cloth with brown subsurface scattering (right)
    +

    +The complete implementation of our cloth BRDF, including sheen color and optional subsurface scattering, can be found in listing 19. +

     
    // specular BRDF
    +float D = distributionCloth(roughness, NoH);
    +float V = visibilityCloth(NoV, NoL);
    +vec3  F = sheenColor;
    +vec3 Fr = (D * V) * F;
    +
    +// diffuse BRDF
    +float diffuse = diffuse(roughness, NoV, NoL, LoH);
    +#if defined(MATERIAL_HAS_SUBSURFACE_COLOR)
    +// energy conservative wrap diffuse
    +diffuse *= saturate((dot(n, light.l) + 0.5) / 2.25);
    +#endif
    +vec3 Fd = diffuse * pixel.diffuseColor;
    +
    +#if defined(MATERIAL_HAS_SUBSURFACE_COLOR)
    +// cheap subsurface scatter
    +Fd *= saturate(subsurfaceColor + NoL);
    +vec3 color = Fd + Fr * NoL;
    +color *= (lightIntensity * lightAttenuation) * lightColor;
    +#else
    +vec3 color = Fd + Fr;
    +color *= (lightIntensity * lightAttenuation * NoL) * lightColor;
    +#endif
    Listing 19: Implementation of our cloth BRDF in GLSL
    +   

    Cloth parameterization

    +

    + +The cloth material model encompasses all the parameters previously defined for the standard material mode except for metallic and reflectance. Two extra parameters described in table 8 are also available. +

    +

    +  + + +
    Parameter Definition
    SheenColor Specular tint to create two-tone specular fabrics (defaults to 0.04 to match the standard reflectance)
    SubsurfaceColor Tint for the diffuse color after scattering and absorption through the material
    Table 8: Cloth model parameters
    +

    +To create a velvet-like material, the base color can be set to black (or a dark color). Chromaticity information should instead be set on the sheen color. To create more common fabrics such as denim, cotton, etc. use the base color for chromaticity and use the default sheen color or set the sheen color to the luminance of the base color. +

    +   

    Lighting

    +

    + +The correctness and coherence of the lighting environment is paramount to achieving plausible visuals. After surveying existing rendering engines (such as Unity or Unreal Engine 4) as well as the traditional real-time rendering literature, it is obvious that coherency is rarely achieved. +

    +The Unreal Engine, for instance, lets artists specify the “brightness” of a point light in lumens, a unit of luminous power. The brightness of directional lights is however expressed using an arbitrary unnamed unit. To match the brightness of a point light with a luminous power of 5,000 lumens, the artist must use a directional light of brightness 10. This kind of mismatch makes it difficult for artists to maintain the visual integrity of a scene when adding, removing or modifying lights. +Using solely arbitrary units is a coherent solution but it makes reusing lighting rigs a difficult task. For instance, an outdoor scene will use a directional light of brightness 10 as the sun and all other lights will be defined relative to that value. Moving these lights to an indoor environment would make them too bright. +

    +Our goal is therefore to make all lighting correct by default, while giving artists enough freedom to achieve the desired look. We will support a number of lights, split in two categories, direct and indirect lighting: +

    +Direct lighting: punctual lights, photometric lights, area lights. +

    +Indirect lighting: image based lights (IBLs), for both local2 and distant light probes. +

    +

     2 Local light probes might be too expensive to support on mobile, we will first focus our efforts on distant light probes set at infinity +
    +

    +   

    Units

    +

    + +The following sections will discuss how to implement various types of lights and the proposed equations make use of different symbols and units summarized in table 9. +

    +

    +  + + + + + + + +
    Photometric term Notation Unit
    Luminous power \(\Phi\) Lumen (\(lm\))
    Luminous intensity \(I\) Candela (\(cd\)) or \(\frac{lm}{sr}\)
    Illuminance \(E\) Lux (\(lx\)) or \(\frac{lm}{m^2}\)
    Luminance \(L\) Nit (\(nt\)) or \(\frac{cd}{m^2}\)
    Radiant power \(\Phi_e\) Watt (\(W\))
    Luminous efficacy \(\eta\) Lumens per watt (\(\frac{lm}{W}\))
    Luminous efficiency \(V\) Percentage (%)
    Table 9: Photometric units
    +

    +To get properly coherent lighting, we must use light units that respect the ratio between various light intensities found in real-world scenes. These intensities can vary greatly, from around 800 \(lm\) for a household light bulb to 120,000 \(lx\) for a daylight sky and sun illumination. +

    +The easiest way to achieve lighting coherency is to adopt physical light units. This will in turn enable full reusability of lighting rigs. Using physical light units also allows us to use a physically based camera. +

    +Table 10 shows the light unit associated with each type of light we intend to support. +

    +

    +  + + + + + + + +
    Light type Unit
    Directional light Illuminance (\(lx\) or \(\frac{lm}{m^2}\))
    Point light Luminous power (\(lm\))
    Spot light Luminous power (\(lm\))
    Photometric light Luminous intensity (\(cd\))
    Masked photometric light Luminous power (\(lm\))
    Area light Luminous power (\(lm\))
    Image based light Luminance (\(\frac{cd}{m^2}\))
    Table 10: Intensity unity for each light type
    +

    +Notes about the radiant power unit +

    +Even though commercially available light bulbs often display their brightness in lumens on the packaging, it is common to refer to the brightness of a light bulb by using its required energy in watts. The number of watts only indicates how much energy a bulb uses, not how bright it is. It is even more important to understand this difference now that more energy efficient bulbs are readily available (halogens, LEDs, etc.). +

    +However, since artists might be accustomed to gauging a light's brightness by its power, we should allow users to use the power unit to define the brightness of a light. The conversion is presented in equation \(\ref{radiantPowerToLuminousPower}\). +

    +$$\begin{equation}\label{radiantPowerToLuminousPower} +\Phi = \Phi_e \eta +\end{equation}$$ +

    +In equation \(\ref{radiantPowerToLuminousPower}\), \(\eta\) is the luminous efficacy of the light, expressed in lumens per watt. Knowing that the maximum possible luminous efficacy is 683 \(\frac{lm}{W}\) we can also use luminous efficiency \(V\) (also called luminous coefficient), as shown in equation \(\ref{radiantPowerLuminousEfficiency}\). +

    +$$\begin{equation}\label{radiantPowerLuminousEfficiency} +\Phi = \Phi_e 683 \times V +\end{equation}$$ +

    +Table 11 can be used as a reference to convert watts to lumens using either the luminous efficacy or the luminous efficiency of various types of lights. More specific values are available on Wikipedia's luminous efficacy page. +

    +

    +  + + + +
    Light type Efficacy \(\eta\) Efficiency \(V\)
    Incandescent 14-35 2-5%
    LED 28-100 4-15%
    Fluorescent 60-100 9-15%
    Table 11: Efficacy and efficiency of various light types
    +

    +   

    Light units validation

    +

    + +One of the big advantages of using physical light units is the ability to physically validate our equations. We can use specialized devices to measure three light units. +

    +   

    Illuminance

    +

    + +The illuminance reaching a surface can be measured using an incident light meter. For our tests, we use a Sekonic L-478D, shown in figure 33. +

    +The incident light meter uses a white diffuse dome to capture the illuminance reaching a surface. It is important to orient the dome properly depending on the desired measurement. For instance, orienting the dome perpendicular to the sun on a bright clear day will give very different results than orienting the dome horizontally. +

    +

     
    Figure 33: Sekonic L-478D incident light meter
    +

    +   

    Luminance

    +

    + +The luminance at a surface, or the product of the incident light and the surface, can be measured using a luminance meter, also often called a spot meter. While incident light meters use a diffuse hemisphere to capture light from all directions, a spot meter uses a shield to measure incident light from a single direction. For our tests, we use a Sekonic 5° Viewfinder that can replace the diffuser on the L-478D to measure luminance in a 5° cone. +

    +

    Sekonic L-478D working as a luminance meter using a special viewfinder
    +

    +   

    Luminous intensity

    +

    + +The luminous intensity of a light source cannot be measured directly but can be derived from the measured illuminance if we know the distance between the measuring device and the light source. Equation \(\ref{derivedLuminousIntensity}\) is a simple application of the inverse square law discussed in section 5.2.2. +

    +$$\begin{equation}\label{derivedLuminousIntensity} +I = E \cdot d^2 +\end{equation}$$ +

    +   

    Direct lighting

    +

    + +We have defined the light units for all the light types supported by the renderer in the section above but we have not defined the light unit for the result of the lighting equations. Choosing physical light units means that we will compute luminance values in our shaders, and therefore that all our light evaluation functions will compute the luminance \(L_{out}\) (or outgoing radiance) at any given point. The luminance depends on the illuminance \(E\) and the BSDF \(f(v,l)\) : +

    +$$\begin{equation}\label{luminanceEquation} +L_{out} = f(v,l)E +\end{equation}$$ +

    +   

    Directional lights

    +

    + +The main purpose of directional lights is to recreate important light sources for outdoor environment, i.e. the sun and/or the moon. While directional lights do not truly exist in the physical world, any light source sufficiently far from the light receptor can be assumed to be directional (i.e. all the incident light rays are parallel, as shown in figure 34). +

    +

     
    Figure 34: Interaction between a directional light and a surface. The light source is a virtual construct that can only be represented by a direction
    +

    +This approximation proves to work incredibly well for the diffuse response of a surface but the specular response is incorrect. The Frostbite engine solves this problem by treating the “sun” directional light as a disc area light. However, our tests have shown that the quality increase does not justify the added computational costs. +

    +We earlier stated that we chose an illuminance light unit (\(lx\)) for directional lights. This is in part due to the fact that we can easily find illuminance values for the sky and the sun (online or with a light meter) but also to simplify the luminance equation described in \(\ref{luminanceEquation}\). +

    +$$\begin{equation}\label{directionalLuminanceEquation} +L_{out} = f(v,l) E_{\bot} \left< \NoL \right> +\end{equation}$$ +

    +In the simplified luminance equation \(\ref{directionalLuminanceEquation}\), \(E_{\bot}\) is the illuminance of the light source for a surface perpendicular to said light source. If the directional light source simulates the sun, \(E_{\bot}\) is the illuminance of the sun for a surface perpendicular to the sun direction. +

    +Table 12 provides useful reference values for the sun and sky illumination, measured3 on a clear day in March, in California. +

    +

    +  + + + +
    Light 10am 12pm 5:30pm
    \(Sky_{\bot} + Sun_{\bot}\) 120,000 130,000 90,000
    \(Sky_{\bot}\) 20,000 25,000 9,000
    \(Sun_{\bot}\) 100,000 105,000 81,000
    Table 12: Illuminance values in \(lx\) (a full moon has an illuminance of 1 \(lx\))
    +

    +Dynamic directional lights are particularly cheap to evaluate at runtime, as shown in listing 20. +

     
    vec3 l = normalize(-lightDirection);
    +float NoL = clamp(dot(n, l), 0.0, 1.0);
    +
    +// lightIntensity is the illuminance
    +// at perpendicular incidence in lux
    +float illuminance = lightIntensity * NoL;
    +vec3 luminance = BSDF(v, l) * illuminance;
    Listing 20: Implementation of directional lights in GLSL
    +

    + +Figure 35 shows the effect of lighting a simple scene with a directional light setup to approximate a midday Sun (illuminance set to 110,000 \(lx\)). For illustration purposes, only direct lighting is shown. +

    +

     
    Figure 35: Series of dielectric materials of varying roughness under a directional light
    +

    +

     3 Measurements taken with an incident light meter (Sekonic L-478D) +
    +

    +   

    Punctual lights

    +

    + +Our engine will support two types of punctual lights, commonly found in most if not all rendering engines: point lights and spot lights. These types of lights are traditionally physically inaccurate for two reasons: +

    +

      +
    1. They are truly punctual and infinitesimally small. +
    2. +
    3. They do not follow the inverse square law.
    +

    +The first issue can be addressed with area lights but, given the cheaper nature of punctual lights it is deemed practical to use infinitesimally small punctual lights whenever possible. +

    +The second issue is easy to fix. For a given punctual light, the perceived intensity decreases proportionally to the square of the distance from the viewer (more precisely, the light receptor). +

    +For punctual lights following the inverse square law, the term \(E\) of equation \( \ref{luminanceEquation} \) is expressed in equation \(\ref{punctualLightEquation}\), where \(d\) is the distance from a point at the surface to the light. +

    +$$\begin{equation}\label{punctualLightEquation} +E = L_{in} \left< \NoL \right> = \frac{I}{d^2} \left< \NoL \right> +\end{equation}$$ +

    +The difference between point and spot lights lies in how \(E\) is computed, and in particular how the luminous intensity \(I\) is computed from the luminous power \(\Phi\). +

    +   

    Point lights

    +

    + +A point light is defined only by a position in space, as shown in figure 36. +

    +

     
    Figure 36: Interaction between a point light and a surface. The attenuation only depends on the distance to the light
    +

    +The luminous power of a point light is calculated by integrating the luminous intensity over the light's solid angle, as show in equation \(\ref{pointLightLuminousPower}\). The luminous intensity can then be easily derived from the luminous power. +

    +$$\begin{equation}\label{pointLightLuminousPower} +\Phi = \int_{\Omega} I dl = \int_{0}^{2\pi} \int_{0}^{\pi} I d\theta d\phi = 4 \pi I \\ +I = \frac{\Phi}{4 \pi} +\end{equation}$$ +

    +By simple substitution of \(I\) in \(\ref{punctualLightEquation}\) and \(E\) in \( \ref{luminanceEquation} \) we can formulate the luminance equation of a point light as a function of the luminous power (see \( \ref{pointLightLuminanceEquation} \)). +

    +$$\begin{equation}\label{pointLightLuminanceEquation} +L_{out} = f(v,l) \frac{\Phi}{4 \pi d^2} \left< \NoL \right> +\end{equation}$$ +

    +Figure 37 shows the effect of lighting a simple scene with a point light subject to distance attenuation. Light falloff is exaggerated for illustration purposes. +

    +

     
    Figure 37: Inverse square law applied to point lights evaluation
    +

    +   

    Spot lights

    +

    + +A spot light is defined by a position in space, a direction vector and two cone angles, \( \theta_{inner} \) and \( \theta_{outer} \) (see figure 38). These two angles are used to define the angular falloff attenuation of the spot light. The light evaluation function of a spot light must therefore take into account both the inverse square law and these two angles to properly evaluate the luminance attenuation. +

    +

     
    Figure 38: Interaction between a spot light and a surface. The attenuation depends on the distance to the light and the angle between the surface the spot light's direction vector
    +

    +Equation \( \ref{spotLightLuminousPower} \) describes how the luminous power of a spot light can be calculated in a similar fashion to point lights, using \( \theta_{outer} \) the outer angle of the spot light's cone in the range [0..\(\pi\)]. +

    +$$\begin{equation}\label{spotLightLuminousPower} +\Phi = \int_{\Omega} I dl = \int_{0}^{2\pi} \int_{0}^{\theta_{outer}} I d\theta d\phi = 2 \pi (1 - cos\frac{\theta_{outer}}{2})I \\ +I = \frac{\Phi}{2 \pi (1 - cos\frac{\theta_{outer}}{2})} +\end{equation}$$ +

    +While this formulation is physically correct, it makes spot lights a little difficult to use: changing the outer angle of the cone changes the illumination levels. Figure 39 shows the same scene lit by a spot light, with an outer angle of 55° and an outer angle of 15°. Observes how the illumination level increases as the cone aperture decreases. +

    +

     
    Figure 39: Comparison of spot light outer angles, 55° (left) and 15° (right)
    +

    +The coupling of illumination and the outer cone means that an artist cannot tweak the influence cone of a spot light without also changing the perceived illumination. It therefore makes sense to provide artists with a parameter to disable this coupling. Equations \( \ref{spotLightLuminousPowerB} \) shows how to formulate the luminous power for that purpose. +

    +$$\begin{equation}\label{spotLightLuminousPowerB} +\Phi = \pi I \\ +I = \frac{\Phi}{\pi} \\ +\end{equation}$$ +

    +With this new formulation to compute the luminous intensity, the test scene in figure 40 exhibits similar illumination levels with both cone apertures. +

    +

     
    Figure 40: Comparison of spot light outer angles, 55° (left) and 15° (right)
    +

    +This new formulation can also be considered physically based if the spot's reflector is replaced with a matte, diffuse mask that absorbs light perfectly. +

    +The spot light evaluation function can be expressed in two ways: +

    +

      +
    • With a light absorber + $$\begin{equation}\label{spotAbsorber} + L_{out} = f(v,l) \frac{\Phi}{\pi d^2} \left< \NoL \right> \lambda(l) + \end{equation}$$ +
    • +
    • With a light reflector + $$\begin{equation}\label{spotReflector} + L_{out} = f(v,l) \frac{\Phi}{2 \pi (1 - cos\frac{\theta_{outer}}{2}) d^2} \left< \NoL \right> \lambda(l) + \end{equation}$$
    +

    +The term \( \lambda(l) \) in equations \( \ref{spotAbsorber} \) and \( \ref{spotReflector} \) is the spot's angle attenuation factor described in equation + \( \ref{spotAngleAtt} \) below. +

    +$$\begin{equation}\label{spotAngleAtt} +\lambda(l) = \frac{l \cdot spotDirection - cos\theta_{outer}}{cos\theta_{inner} - cos\theta_{outer}} +\end{equation}$$ +

    +   

    Attenuation function

    +

    + +A proper evaluation of the inverse square law attenuation factor is mandatory for physically based punctual lights. The simple mathematical formulation is unfortunately impractical for implementation purposes: +

    +

      +
    1. The division by the squared distance can lead to divides by 0 when objects intersect or “touch” light sources. +

      +

    2. +
    3. The influence sphere of each light is infinite (\( \frac{I}{d^2} \) is asymptotic, it never reaches 0) which means that to correctly shade a pixel we need to evaluate every light in the world.
    +

    +The first issue can be solved easily by setting the assumption that punctual lights are not truly punctual but instead small area lights. To do this we can simply treat punctual lights as spheres of 1 cm radius, as show in equation \(\ref{finitePunctualLight}\). +

    +$$\begin{equation}\label{finitePunctualLight} +E = \frac{I}{max(d^2, {0.01}^2)} +\end{equation}$$ +

    +We can solve the second issue by introducing an influence radius for each light. There are several advantages to this solution. Tools can quickly show artists what parts of the world will be influenced by every light (the tool just needs to draw a sphere centered on each light). The rendering engine can cull lights more aggressively using this extra piece of information and artists/developers can assist the engine by manually tweaking the influence radius of a light. +

    +Mathematically, the illuminance of a light should smoothly reach zero at the limit defined by the influence radius. [Karis13b] proposes to window the inverse square function in such a way that the majority of the light's influence remains unaffected. The proposed windowing is described in equation \(\ref{attenuationWindowing}\), where \(r\) is the light's radius of influence. +

    +$$\begin{equation}\label{attenuationWindowing} +E = \frac{I}{max(d^2, {0.01}^2)} \left< 1 - \frac{d^4}{r^4} \right>^2 +\end{equation}$$ +

    +Listing 21 demonstrates how to implement physically based punctual lights in GLSL. Note that the light intensity used in this piece of code is the luminous intensity \(I\) in \(cd\), converted from the luminous power CPU-side. This snippet is not optimized and some of the computations can be offloaded to the CPU (for instance the square of the light's inverse falloff radius, or the spot scale and angle). +

     
    float getSquareFalloffAttenuation(vec3 posToLight, float lightInvRadius) {
    +    float distanceSquare = dot(posToLight, posToLight);
    +    float factor = distanceSquare * lightInvRadius * lightInvRadius;
    +    float smoothFactor = max(1.0 - factor * factor, 0.0);
    +    return (smoothFactor * smoothFactor) / max(distanceSquare, 1e-4);
    +}
    +
    +float getSpotAngleAttenuation(vec3 l, vec3 lightDir,
    +        float innerAngle, float outerAngle) {
    +    // the scale and offset computations can be done CPU-side
    +    float cosOuter = cos(outerAngle);
    +    float spotScale = 1.0 / max(cos(innerAngle) - cosOuter, 1e-4)
    +    float spotOffset = -cosOuter * spotScale
    +
    +    float cd = dot(normalize(-lightDir), l);
    +    float attenuation = clamp(cd * spotScale + spotOffset, 0.0, 1.0);
    +    return attenuation * attenuation;
    +}
    +
    +vec3 evaluatePunctualLight() {
    +    vec3 l = normalize(posToLight);
    +    float NoL = clamp(dot(n, l), 0.0, 1.0);
    +    vec3 posToLight = lightPosition - worldPosition;
    +
    +    float attenuation;
    +    attenuation  = getSquareFalloffAttenuation(posToLight, lightInvRadius);
    +    attenuation *= getSpotAngleAttenuation(l, lightDir, innerAngle, outerAngle);
    +
    +    vec3 luminance = (BSDF(v, l) * lightIntensity * attenuation * NoL) * lightColor;
    +    return luminance;
    +}
    Listing 21: Implementation of punctual lights in GLSL
    +   

    Photometric lights

    +

    + +Punctual lights are an extremely practical and efficient way to light a scene but do not give artists enough control over the light distribution. The field of architectural lighting design concerns itself with designing lighting systems to serve humans needs by taking into account: +

    +

      +
    • The amount of light provided +
    • +
    • The color of the light +
    • +
    • The distribution of light within the space
    +

    +The lighting system we have described so far can easily address the first two points but we need a way to define the distribution of light within the space. Light distribution is especially important for indoor scenes or for some types of outdoor scenes or even road lighting. Figure 41 shows scenes where the light distribution is controlled by the artist. This type of distribution control is widely used when putting objects on display (museums, stores or galleries for instance). +

    +

     
    Figure 41: Controlling the distribution of a point light
    +

    +Photometric lights use a photometric profile to describe their intensity distribution. There are two commonly used formats, IES (Illuminating Engineering Society) and EULUMDAT (European Lumen Data format) but we will focus on the former. IES profiles are supported by many tools and engines, such as Unreal Engine 4, Frostbite, Renderman, Maya and Killzone. In addition, IES light profiles are commonly made available by bulbs and luminaires manufacturers (Philips offers an extensive array of IES files for download for instance). Photometric profiles are particularly useful when they measure a luminaire or light fixture, in which the light source is partially covered. The luminaire will block the light emitted in certain directions, thus shaping the light distribution. +

    +

    Example of a real world luminaires that can be described by photometric profiles
    +

    +An IES profile stores luminous intensity for various angles on a sphere around the measured light source. This spherical coordinate system is usually referred to as the photometric web, which can be visualized using specialized tools such as IESviewer. Figure 42 below shows the photometric web of the XArrow IES profile provided by Pixar for use with Renderman. This picture also shows a rendering in 3D space of the XArrow IES profile by our tool lightgen. +

    +

     
    Figure 42: The XArrow IES profile rendered as a photometric web and as a point light in 3D space
    +

    +The IES format is poorly documented and it is not uncommon to find syntax variations between files found on the Internet. The best resource to understand IES profile is Ian Ashdown's “Parsing the IESNA LM-63 photometric data file” document [Ashdown98]. Succinctly, an IES profiles stores luminous intensities in candela at various angles around the light source. For each measured horizontal angle, a series of luminous intensities at different vertical angles is provided. It is however fairly common for measured light sources to be horizontally symmetrical. The XArrow profile shown above is a good example: intensities vary with vertical angles (vertical axis) but are symmetrical on the horizontal axis. The range of vertical angles in an IES profile is 0 to 180° and the range of horizontal angles is 0 to 360°. +

    +Figure 43 shows the series of IES profiles provided by Pixar for Renderman, rendered using our lightgen tool. +

    +

     
    Figure 43: Series of IES light profiles rendered with lightgen
    +

    +IES profiles can be applied directly to any punctual light, point or spot. To do so, we must first process the IES profile and generate a photometric profile as a texture. For performance considerations, the photometric profile we generate is a 1D texture that represents the average luminous intensity for all horizontal angles at a specific vertical angle (i.e., each pixel represents a vertical angle). To truly represent a photometric light, we should use a 2D texture but since most lights are fully, or mostly, symmetrical on the horizontal plane, we can accept this approximation. The values stored in the texture are normalized by the inverse maximum intensity defined in the IES profile. This allows us to easily store the texture in any float format or, at the cost of a bit of precision, in a luminance 8-bit texture (grayscale PNG for instance). Storing normalized values also allows us to treat photometric profiles as a mask: +

    +

    Photometric profile as a mask

    The luminous intensity is defined by the artist by setting the luminous power of the light, as with any other punctual light. The artist defined intensity is divided by the intensity of the light computed from the IES profile. IES profiles contain a luminous intensity but it is only valid for a bare light bulb whereas the measured intensity values take into account the light fixture. To measure the intensity of the luminaire, instead of the bulb, we perform a Monte-Carlo integration of the unit sphere using the intensities from the profile4. +

    Photometric profile

    The luminous intensity comes from the profile itself. All the values sampled from the 1D texture are simply multiplied by the maximum intensity. We also provide a multiplier for convenience. +

    The photometric profile can be applied at rendering time as a simple attenuation. The luminance equation \( \ref{photometricLightEvaluation} \) describes the photometric point light evaluation function. +

    +$$\begin{equation}\label{photometricLightEvaluation} +L_{out} = f(v,l) \frac{I}{d^2} \left< \NoL \right> \Psi(l) +\end{equation}$$ +

    +The term \( \Psi(l) \) is the photometric attenuation function. It depends on the light vector, but also on the direction of the light. Spot lights already possess a direction vector but we need to introduce one for photometric point lights as well. +

    +The photometric attenuation function can be easily implemented in GLSL by adding a new attenuation factor to the implementation of punctual lights (listing 21). The modified implementation is show in listing 22. +

     
    float getPhotometricAttenuation(vec3 posToLight, vec3 lightDir) {
    +    float cosTheta = dot(-posToLight, lightDir);
    +    float angle = acos(cosTheta) * (1.0 / PI);
    +    return texture2DLodEXT(lightProfileMap, vec2(angle, 0.0), 0.0).r;
    +}
    +
    +vec3 evaluatePunctualLight() {
    +    vec3 l = normalize(posToLight);
    +    float NoL = clamp(dot(n, l), 0.0, 1.0);
    +    vec3 posToLight = lightPosition - worldPosition;
    +
    +    float attenuation;
    +    attenuation  = getSquareFalloffAttenuation(posToLight, lightInvRadius);
    +    attenuation *= getSpotAngleAttenuation(l, lightDirection, innerAngle, outerAngle);
    +    attenuation *= getPhotometricAttenuation(l, lightDirection);
    +
    +    float luminance = (BSDF(v, l) * lightIntensity * attenuation * NoL) * lightColor;
    +    return luminance;
    +}
    Listing 22: Implementation of attenuation from photometric profiles in GLSL
    +

    + +The light intensity is computed CPU-side (listing 23) and depends on whether the photometric profile is used as a mask. +

     
    float multiplier;
    +// Photometric profile used as a mask
    +if (photometricLight.isMasked()) {
    +    // The desired intensity is set by the artist
    +    // The integrated intensity comes from a Monte-Carlo
    +    // integration over the unit sphere around the luminaire
    +    multiplier = photometricLight.getDesiredIntensity() /
    +            photometricLight.getIntegratedIntensity();
    +} else {
    +    // Multiplier provided for convenience, set to 1.0 by default
    +    multiplier = photometricLight.getMultiplier();
    +}
    +
    +// The max intensity in cd comes from the IES profile
    +float lightIntensity = photometricLight.getMaxIntensity() * multiplier;
    Listing 23: Computing the intensity of a photometric light on the CPU
    +

    + +

     4 The XArrow profile declares a luminous intensity of 1,750 lm but a Monte-Carlo integration shows an intensity of only 350 lm. +
    +

    +   

    Area lights

    +

    + +[TODO] +

    +   

    Lights parameterization

    +

    + +Similarly to the parameterization of the standard material model, our goal is to make lights parameterization intuitive and easy to use for artists and developers alike. In that spirit, we decided to separate the light color (or hue) from the light intensity. A light color will therefore be defined as a linear RGB color (or sRGB in the tools UI for convenience). +

    +The full list of light parameters is presented in table 13. +

    +

    +  + + + + + + + + + + + + +
    Parameter Definition
    Type Directional, point, spot or area
    Direction Used for directional lights, spot lights, photometric point lights, and linear and tubular area lights (orientation)
    Color The color of emitted light, as a linear RGB color. Can be specified as an sRGB color or a color temperature in the tools
    Intensity The light's brightness. The unit depends on the type of light
    Falloff radius Maximum distance of influence
    Inner angle Angle of the inner cone for spot lights, in degrees
    Outer angle Angle of the outer cone for spot lights, in degrees
    Length Length of the area light, used to create linear or tubular lights
    Radius Radius of the area light, used to create spherical or tubular lights
    Photometric profile Texture representing a photometric light profile, works only for punctual lights
    Masked profile Boolean indicating whether the IES profile is used as a mask or not. When used as a mask, the light's brightness will be multiplied by the ratio between the user specified intensity and the integrated IES profile intensity. When not used as a mask, the user specified intensity is ignored but the IES multiplier is used instead
    Photometric multiplier Brightness multiplier for photometric lights (if IES as mask is turned off)
    Table 13: Light types parameters
    +

    +Note: to simplify the implementation, all luminous powers will converted to luminous intensities (\(cd\)) before being sent to the shader. The conversion is light dependent and is explained in the previous sections. +

    +Note: the light type can be inferred from other parameters (e.g. a point light has a length, radius, inner angle and outer angle of 0). +

    +   

    Color temperature

    +

    + +However, real-world artificial lights are often defined by their color temperature, measured in Kelvin (K). The color temperature of a light source is the temperature of an ideal black-body radiator that radiates light of comparable hue to that of the light source. For convenience, the tools should allow the artist to specify the hue of a light source as a color temperature (a meaningful range is 1,000 K to 12,500 K). +

    +To compute RGB values from a temperature, we can use the Planckian locus, shown in figure 44. This locus is the path that the color of an incandescent black body takes in a chromaticity space as the body's temperature changes. +

    +

     
    Figure 44: The Planckian locus visualized on a CIE 1931 chromaticity diagram (source: Wikipedia)
    +

    +The easiest way to compute RGB values from this locus is to use the formula described in [Krystek85]. Krystek's algorithm (equation \(\ref{krystek}\)) works in the CIE 1960 (UCS) space, using the following formula where \(T\) is the desired temperature, and \(u\) and \(v\) the coordinates in UCS. +

    +$$\begin{equation}\label{krystek} +u(T) = \frac{0.860117757 + 1.54118254 \times 10^{-4}T + 1.28641212 \times 10^{-7}T^2}{1 + 8.42420235 \times 10^{-4}T + 7.08145163 \times 10^{-7}T^2} \\ +v(T) = \frac{0.317398726 + 4.22806245 + \times 10^{-5}T + 4.20481691 \times 10^{-8}T^2}{1 - 2.89741816 + \times 10^{-5}T + 1.61456053 \times 10^{-7}T^2} +\end{equation}$$ +

    +This approximation is accurate to roughly \( 9 \times 10^{-5} \) in the range 1,000K to 15,000K. From the CIE 1960 space we can compute the coordinates in xyY space (CIES 1931), using the formula from equation \(\ref{cieToxyY}\). +

    +$$\begin{equation}\label{cieToxyY} +x = \frac{3u}{2u - 8v + 4} \\ +y = \frac{2v}{2u - 8v + 4} +\end{equation}$$ +

    +The formulas above are valid for black body color temperatures, and therefore correlated color temperatures of standard illuminants. If we wish to compute the precise chromaticity coordinates of standard CIE illuminants in the D series we can use equation \(\ref{seriesDtoxyY}\). +

    +$$\begin{equation}\label{seriesDtoxyY} +x = \begin{cases} 0.244063 + 0.09911 \frac{10^3}{T} + 2.9678 \frac{10^6}{T^2} - 4.6070 \frac{10^9}{T^3} & 4,000K \le T \le 7,000K \\ +0.237040 + 0.24748 \frac{10^3}{T} + 1.9018 \frac{10^6}{T^2} - 2.0064 \frac{10^9}{T^3} & 7,000K \le T \le 25,000K \end{cases} \\ +y = -3x^2 + 2.87 x - 0.275 +\end{equation}$$ +

    +From the xyY space, we can then convert to the CIE XYZ space (equation \(\ref{xyYtoXYZ}\)). +

    +$$\begin{equation}\label{xyYtoXYZ} +X = \frac{xY}{y} \\ +Z = \frac{(1 - x - y)Y}{y} +\end{equation}$$ +

    +For our needs, we will fix \(Y = 1\). This allows us to convert from the XYZ space to linear RGB with a simple 3×3 matrix, as shown in equation \(\ref{XYZtoRGB}\). +

    +$$\begin{equation}\label{XYZtoRGB} +\left[ \begin{matrix} R \\ G \\ B \end{matrix} \right] = M^{-1} \left[ \begin{matrix} X \\ Y \\ Z \end{matrix} \right] +\end{equation}$$ +

    +The transformation matrix M is calculated from the target RGB color space primaries. Equation \( \ref{XYZtoRGBValues} \) shows the conversion using the inverse matrix for the sRGB color space. +

    +$$\begin{equation}\label{XYZtoRGBValues} +\left[ \begin{matrix} R \\ G \\ B \end{matrix} \right] = \left[ \begin{matrix} 3.2404542 & -1.5371385 & -0.4985314 \\ -0.9692660 & 1.8760108 & 0.0415560 \\ 0.0556434 & -0.2040259 & 1.0572252 \end{matrix} \right] \left[ \begin{matrix} X \\ Y \\ Z \end{matrix} \right] +\end{equation}$$ +

    +The result of these operations is a linear RGB triplet in the sRGB color space. Since we care about the chromaticity of the results, we must apply a normalization step to avoid clamping values greater than 1.0 and distort resulting colors: +

    +$$\begin{equation}\label{normalizedRGB} +\hat{C}_{linear} = \frac{C_{linear}}{max(C_{linear})} +\end{equation}$$ +

    +We must finally apply the sRGB opto-electronic conversion function (OECF, shown in equation \( \ref{OECFsRGB} \)) to obtain a displayable value (the value should remain linear if passed to the renderer for shading). +

    +$$\begin{equation}\label{OECFsRGB} +C_{sRGB} = \begin{cases} 12.92 \times \hat{C}_{linear} & \hat{C}_{linear} \le 0.0031308 \\ +1.055 \times \hat{C}_{linear}^{\frac{1}{2.4}} - 0.055 & \hat{C}_{linear} \gt 0.0031308 \end{cases} +\end{equation}$$ +

    +For convenience, figure 45 shows the range of correlated color temperatures from 1,000K to 12,500K. All the colors used below assume CIE \( D_{65} \) as the white point (as is the case in the sRGB color space). +

    +

     
    Figure 45: Scale of correlated color temperatures
    +

    +Similarly, figure 46 shows the range of CIE standard illuminants series D from 1,000K to 12,500K. +

    +

     
    Figure 46: Scale of CIE standard illuminants series D
    +

    +For reference, figure 47 shows the range of correlated color temperatures without the normalization step presented in equation \(\ref{normalizedRGB}\). +

    +

     
    Figure 47: Unnormalized scale of correlated color temperatures
    +

    +Table 14 presents the correlated color temperature of various common light sources as sRGB color swatches. These colors are relative to the \( D_{65} \) white point, so their perceived hue might vary based on your display's white point. See What colour is the Sun? for more information. +

    +

    +  + + + + + + + + + + + + + + + + +
    Temperature (K) Light source Color
    1,700-1,800 Match flame
     
    1,850-1,930 Candle flame
     
    2,000-3,000 Sun at sunrise/sunset
     
    2,500-2,900 Household tungsten lightbulb
     
    3,000 Tungsten lamp 1K
     
    3,200-3,500 Quartz lights
     
    3,200-3,700 Fluorescent lights
     
    3,275 Tungsten lamp 2K
     
    3,380 Tungsten lamp 5K, 10K
     
    5,000-5,400 Sun at noon
     
    5,500-6,500 Daylight (sun + sky)
     
    5,500-6,500 Sun through clouds/haze
     
    6,000-7,500 Overcast sky
     
    6,500 RGB monitor white point
     
    7,000-8,000 Shaded areas outdoors
     
    8,000-10,000 Partly cloudy sky
     
    Table 14: Normalized correlated color temperatures for common light sources
    +

    +   

    Pre-exposed lights

    +

    + +Physically based rendering and physical light units pose an interesting challenge: how to store and handle the large range of values produced by the lighting code? Assuming computations performed at full precision in the shaders, we still want to be able to store the linear output of the lighting pass in a reasonably sized buffer (RGB16F or equivalent). The most obvious and easiest way to achieve this is to simply apply the camera exposure (see the Physically based camera section for more information) before writing out the result of the lighting pass. This simple step is shown in listing 24: +

     
    fragColor = luminance * camera.exposure;
    Listing 24: The output of the lighting pass is pre-exposed to fit in half-float buffers
    +

    + +This solution solves the storage problem but requires intermediate computations to be performed with single precision floats. We would instead prefer to perform all (or at least most) of the lighting work using half precision floats instead. Doing so can greatly improve performance and power usage, particularly on mobile devices. Half precision floats are however ill-suited for this kind of work as common illuminance and luminance values (for the sun for instance) can exceed their range. The solution is to simply pre-expose the lights themselves instead of the result of the lighting pass. This can be done efficiently on the CPU if updating a light's constant buffer is cheap. This can also be done on the GPU, as shown in listing 25. +

     
    // The inputs must be highp/single precision,
    +// both for range (intensity) and precision (exposure)
    +// The output is mediump/half precision
    +float computePreExposedIntensity(highp float intensity, highp float exposure) {
    +    return intensity * exposure;
    +}
    +
    +Light getPointLight(uint index) {
    +    Light light;
    +    uint lightIndex = // fetch light index;
    +
    +    // the intensity must be highp/single precision
    +    highp vec4 colorIntensity  = lightsUniforms.lights[lightIndex][1];
    +
    +    // pre-expose the light
    +    light.colorIntensity.w = computePreExposedIntensity(
    +            colorIntensity.w, frameUniforms.exposure);
    +
    +    return light;
    +}
    Listing 25: Pre-exposing lights allows the entire shading pipeline to use half precision floats
    +

    + +In practice we pre-expose the following lights: +

    +

      +
    • Punctual lights (point and spot): on the GPU +
    • +
    • Directional light: on the CPU +
    • +
    • IBLs: on the CPU +
    • +
    • Material emissive: on the GPU
    +

    +   

    Image based lights

    +

    + +In real life, light comes from every direction either directly from light sources or indirectly after bouncing off objects in the environment, being partially absorbed in the process. In a way the whole environment around an object can be seen as a light source. Images, in particular cubemaps, are a great way to encode such an “environment light”. This is called Image Based Lighting (IBL) or sometimes Indirect Lighting. +

    +

     
    Figure 48: The object shown here is lit only by image-encoded environment lights. Notice the subtle lighting effects that can be applied using this technique.
    +

    +There are limitations with image-based lighting. Obviously the environment image must be acquired somehow and as we'll see below it needs to be pre-processed before it can be used for lighting. Typically, the environment image is acquired offline in the real world, or generated by the engine either offline or at run time; either way, local or distant probes are used. +

    +These probes can be used to acquire the distant or local environment. In this document, we're focusing on distant environment probes, where the light is assumed to come from infinitely far away (which means every point on the object's surface uses the same environment map). +

    +The whole environment contributes light to a given point on the object's surface; this is called irradiance (\(E\)). The resulting light bouncing off of the object is called radiance (\(L_{out}\)). Incident lighting must be applied consistently to the diffuse and specular parts of the BRDF. +

    +The radiance \(L_{out}\) resulting from the interaction between an image based light's (IBL) irradiance and a material model (BRDF) \(f(\Theta)\)5 is computed as follows: +

    +$$\begin{equation} +L_{out}(n, v, \Theta) = \int_\Omega f(l, v, \Theta) L_{\bot}(l) \left< \NoL \right> dl +\end{equation}$$ +

    +Note that here we're looking at the behavior of the surface at macro level (not to be confused with the micro level equation), which is why it only depends on \(\vec n\) and \(\vec v\). Essentially, we're applying the BRDF to “point-lights” coming from all directions and encoded in the IBL. +

    +   

    IBL Types

    +

    + +There are four common types of IBLs used in modern rendering engines: +

    +

      +
    • Distant light probes, used to capture lighting information at “infinity”, where parallax can be ignored. Distant probes typically contain the sky, distant landscape features or buildings, etc. They are either captured by the engine or acquired from a camera as high dynamic range images (HDRI). +

      +

    • +
    • Local light probes, used to capture a certain area of the world from a specific point of view. The capture is projected on a cube or sphere depending on the surrounding geometry. Local probes are more accurate than distance probes and are particularly useful to add local reflections to materials. +

      +

    • +
    • Planar reflections, used to capture reflections by rendering the scene mirrored by a plane. This technique works only for flat surfaces such as building floors, roads and water. +

      +

    • +
    • Screen space reflection, used to capture reflections based on the rendered scene (using the previous frame for instance) by ray-marching in the depth buffer. SSR gives great result but can be very expensive.
    +

    +In addition we must distinguish between static and dynamic IBLs. Implementing a fully dynamic day/night cycle requires for instance to recompute the distant light probes dynamically6. Both planar and screen space reflections are inherently dynamic. +

    +   

    IBL Unit

    +

    + +As discussed previously in the direct lighting section, all our lights must use physical units. As such our IBLs will use the luminance unit \(\frac{cd}{m^2}\), which is also the output unit of all our direct lighting equations. Using the luminance unit is straightforward for light probes captures by the engine (dynamically or statically offline). +

    +High dynamic range images are a bit more delicate to handle however. Cameras do not record measured luminance but a device-dependent value that is only related to the original scene luminance. As such, we must provide artists with a multiplier that allows them to recover, or at the very least closely approximate, the original absolute luminance. +

    +To properly reconstruct the luminance of an HDRI for IBL, artists must do more than simply take photos of the environment and record extra information: +

    +

      +
    • Color calibration: using a gray card or a MacBeth ColorChecker +

      +

    • +
    • Camera settings: aperture, shutter and ISO +

      +

    • +
    • Luminance samples: using a spot/luminance meter
    +

    +[TODO] Measure and list common luminance values (clear sky, interior, etc.) +

    +   

    Processing light probes

    +

    + +We saw previously that the radiance of an IBL is computed by integrating over the surface's hemisphere. Since this would obviously be too expensive to do in real-time, we must first pre-process our light probes to convert them into a format better suited for real-time interactions. +

    +The sections below will discuss the techniques used to accelerate the evaluation of light probes: +

    +

      +
    • Specular reflectance: pre-filtered importance sampling and split-sum approximation +

      +

    • +
    • Diffuse reflectance: irradiance map and spherical harmonics
    +

    +   

    Distant light probes

    +   

    Diffuse BRDF integration

    +

    + +Using the Lambertian BRDF7, we get the radiance: +

    +$$ +\begin{align*} + f_d(\sigma) &= \frac{\sigma}{\pi} \\ +L_d(n, \sigma) &= \int_{\Omega} f_d(\sigma) L_{\bot}(l) \left< \NoL \right> dl \\ + &= \frac{\sigma}{\pi} \int_{\Omega} L_{\bot}(l) \left< \NoL \right> dl \\ + &= \frac{\sigma}{\pi} E_d(n) \quad \text{with the irradiance} \; + E_d(n) = \int_{\Omega} L_{\bot}(l) \left< \NoL \right> dl +\end{align*} +$$ +

    +Or in the discrete domain: +

    +$$ E_d(n) \equiv \sum_{\forall \, i \in image} L_{\bot}(s_i) \left< n \cdot s_i \right> \Omega_s $$ +

    +\(\Omega_s\) is the solid-angle8 associated to sample \(i\). +

    +The irradiance integral \(\Ed\) can be trivially, albeit slowly9, precomputed and stored into a cubemap for efficient access at runtime. Typically, image is a cubemap or an equirectangular image. The term \( \frac{\sigma}{\pi} \) is independent of the IBL and is added at runtime to obtain the radiance. +

    +

     
    Figure 49: Image-based environment
    +

    +

     
    Figure 50: Image-based irradiance map using the Lambertian BRDF
    +

    +

     5 \(\Theta\) represents the parameters of the material model \(f\), i.e.: roughness, albedo and so on... +
    +

    +

     6 This can be done through blending of static probes or by spreading the workload over time +
    +

    +

     7 The Lambertian BRDF doesn't depend on \(\vec l\), \(\vec v\) or \(\theta\), so \(L_d(n,v,\theta) \equiv L_d(n,\sigma)\) +
    +

    +

     8 \(\Omega_s\) can be approximated by \(\frac{2\pi}{6 \cdot width \cdot height}\) for a cubemap +
    +

    +

     9 \(O(12\,n^2\,m^2)\), with \(n\) and \(m\) respectively the dimensions of the environment and the precomputed cubemap +
    +

    +However, the irradiance can also be approximated very closely by a decomposition into Spherical Harmonics (SH, described in more details in the Spherical Harmonics section) and calculated at runtime cheaply. It is usually best to avoid texture fetches on mobile and free-up a texture unit. Even if it is stored into a cubemap, it is orders of magnitude faster to pre-compute the integral using SH decomposition followed by a rendering. +

    +SH decomposition is similar in concept to a Fourier transform, it expresses the signal over an orthonormal base in the frequency domain. The properties that interests us most are: +

    +

      +
    • Very few coefficients are needed to encode \(\cosTheta\) +

      +

    • +
    • Convolutions by a kernel that has a circular symmetry are very inexpensive and become products in SH space
    +

    +In practice only 4 or 9 coefficients (i.e.: 2 or 3 bands) are enough for \(\cosTheta\) meaning we don't need more either for \(\Lt\). +

    +

     
    Figure 51: 3 bands (9 coefficients)
    +

    +

     
    Figure 52: 2 bands (4 coefficients)
    +

    +In practice we pre-convolve \(\Lt\) with \(\cosTheta\) and pre-scale these coefficients by the basis scaling factors \(K_l^m\) so that the reconstruction code is as simple as possible in the shader: +

     
    vec3 irradianceSH(vec3 n) {
    +    // uniform vec3 sphericalHarmonics[9]
    +    // We can use only the first 2 bands for better performance
    +    return
    +          sphericalHarmonics[0]
    +        + sphericalHarmonics[1] * (n.y)
    +        + sphericalHarmonics[2] * (n.z)
    +        + sphericalHarmonics[3] * (n.x)
    +        + sphericalHarmonics[4] * (n.y * n.x)
    +        + sphericalHarmonics[5] * (n.y * n.z)
    +        + sphericalHarmonics[6] * (3.0 * n.z * n.z - 1.0)
    +        + sphericalHarmonics[7] * (n.z * n.x)
    +        + sphericalHarmonics[8] * (n.x * n.x - n.y * n.y);
    +}
    Listing 26: GLSL code to reconstruct the irradiance from the pre-scaled SH
    +

    + +Note that with 2 bands, the computation above becomes a single \(4 \times 4\) matrix-by-vector multiply. +

    +Additionally, because of the pre-scaling by \(K_l^m\), the SH coefficients can be thought of as colors, in particular sphericalHarmonics[0] is directly the average irradiance. +

    +   

    Specular BRDF integration

    +

    + +As we've seen above, the radiance \(\Lout\) resulting from the interaction between an IBL's irradiance and a BRDF is: +

    +$$\begin{equation}\label{specularBRDFIntegration} +\Lout(n, v, \Theta) = \int_\Omega f(l, v, \Theta) \Lt(l) \left< \NoL \right> \partial l +\end{equation}$$ +

    +We recognize the convolution of \(\Lt\) by \(f(l, v, \Theta) \left< \NoL \right>\), +i.e.: the environment is filtered using the BRDF as a kernel. Indeed at higher roughness, +specular reflections look more blurry. +

    +Plugging the expression of \(f\) in equation \(\ref{specularBRDFIntegration}\), we obtain: +

    +$$\begin{equation} +\Lout(n,v,\Theta) = \int_\Omega D(l, v, \alpha) F(l, v, f_0, f_{90}) V(l, v, \alpha) \left< \NoL \right> \Lt(l) \partial l +\end{equation}$$ +

    +This expression depends on \(v\), \(\alpha\), \(f_0\) and \(f_{90}\) inside the integral, +which makes its evaluation extremely costly and unsuitable for real-time on mobile +(even using pre-filtered importance sampling). +

    +   
    Simplifying the BRDF integration
    +

    + +Since there is no closed-form solution or an easy way to compute the \(\Lout\) integral, we use a simplified +equation instead: \(\hat{I}\), whereby we assume that \(v = n\), that is the view direction \(v\) is always +equal to the surface normal \(n\). Clearly, this assumption will break all view-dependant effects of +the convolution, such as the increased blur in reflections closer to the viewer +(a.k.a. stretchy reflections). +

    +Such a simplification would also have a severe impact on constant environments, such as the white +furnace, because it would affect the magnitude of the constant (i.e. DC) term of the result. We +can at least correct for that by using a scale factor, \(K\), in our simplified integral, which +will make sure the average irradiance stay correct when chosen properly. +

    +

      +
    • \(I\) is our original integral, i.e.: \(I(g) = \int_\Omega g(l) \left< \NoL \right> \partial l\) +
    • +
    • \(\hat{I}\) is the simplified integral where \(v = n\) +
    • +
    • \(K\) is a scale factor that ensures the average irradiance is unchanged by \(\hat{I}\) +
    • +
    • \(\tilde{I}\) is our final approximation of \(I\), \(\tilde{I} = \hat{I} \times K\)
    +

    +Because \(I\) is an integral multiplications can be distributed over it. i.e.: \(I(g()f()) = I(g())I(f())\). +

    +Armed with that, +

    +$$\begin{equation} +I( f(\Theta) \Lt ) \approx \tilde{I}( f(\Theta) \Lt ) \\ +\tilde{I}( f(\Theta) \Lt ) = K \times \hat{I}( f(\Theta) \Lt ) \\ +K = \frac{I(f(\Theta))}{\hat{I}(f(\Theta))} +\end{equation}$$ +

    +From the equation above we can see that \(\tilde{I}\) is equivalent to \(I\) when \(\Lt\) is a constant, +and yields the correct result: +

    +$$\begin{align*} +\tilde{I}(f(\Theta)\Lt^{constant}) &= \Lt^{constant} \hat{I}(f(\Theta)) \frac{I(f(\Theta))}{\hat{I}(f(\Theta))} \\ + &= \Lt^{constant} I(f(\Theta)) \\ + &= I(f(\Theta)\Lt^{constant}) +\end{align*}$$ +

    +Similarly, we can also demonstrate that the result is correct when \(v = n\), since in that case \(I = \hat{I}\): +

    +$$\begin{align*} +\tilde{I}(f(\Theta)\Lt) &= I(f(\Theta)\Lt) \frac{I(f(\Theta))}{I(f(\Theta))} \\ + &= I(f(\Theta)\Lt) +\end{align*}$$ +

    +Finally, we can show that the scale factor \(K\) satisfies our average irradiance (\(\bar{\Lt}\)) +requirement by plugging \(\Lt = \bar{\Lt} + (\Lt - \bar{\Lt}) = \bar{\Lt} + \Delta\Lt\) into \(\tilde{I}\): +

    +$$\begin{align*} +\tilde{I}(f(\Theta)\Lt) &= \tilde{I}\left[f\left(\Theta\right) \left(\bar{\Lt} + \Delta\Lt\right)\right] \\ + &= K \times \hat{I}\left[f\left(\Theta\right) \left(\bar{\Lt} + \Delta\Lt\right)\right] \\ + &= K \times \left[\hat{I}\left(f\left(\Theta\right)\bar{\Lt}\right) + \hat{I}\left(f\left(\Theta\right)\Delta\Lt\right)\right] \\ + &= K \times \hat{I}\left(f\left(\Theta\right)\bar{\Lt}\right) + K \times \hat{I}\left(f\left(\Theta\right) \Delta\Lt\right) \\ + &= \tilde{I}\left(f\left(\Theta\right)\bar{\Lt}\right) + \tilde{I}\left(f\left(\Theta\right) \Delta\Lt\right) \\ + &= I\left(f\left(\Theta\right)\bar{\Lt}\right) + \tilde{I}\left(f\left(\Theta\right) \Delta\Lt\right) +\end{align*}$$ +

    +The above result shows that the average irradiance is computed correctly, i.e.: \(I(f(\Theta)\bar{\Lt})\). +

    +A way to think about this approximation is that it splits the radiance \(\Lt\) in two parts, +the average \(\bar{\Lt}\) and the delta from the average \(\Delta\Lt\) and computes the correct +integration of the average part then adds the simplified integration of the delta part: +

    +$$\begin{equation} +approximation(\Lt) = correct(\bar{\Lt}) + simplified(\Lt - \bar{\Lt}) +\end{equation}$$ +

    +Now, let's look at each term: +

    +$$\begin{equation}\label{iblPartialEquations} +\hat{I}(f(n, \alpha) \Lt) = \int_\Omega f(l, n, \alpha) \Lt(l) \left< \NoL \right> \partial l \\ +\hat{I}(f(n, \alpha)) = \int_\Omega f(l, n, \alpha) \left< \NoL \right> \partial l \\ +I(f(n, v, \alpha)) = \int_\Omega f(l, n, v, \alpha) \left< \NoL \right> \partial l +\end{equation}$$ +

    +All three of these equations can be easily pre-calculated and stored in look-up tables, as explained +below. +

    +   
    Discrete Domain
    +

    + +In the discrete domain the equations in \ref{iblPartialEquations} become: +

    +$$\begin{equation} +\hat{I}(f(n, \alpha) \Lt) \equiv \frac{1}{N}\sum_{\forall \, i \in image} f(l_i, n, \alpha) \Lt(l_i) \left<\NoL\right> \\ +\hat{I}(f(n, \alpha)) \equiv \frac{1}{N}\sum_{\forall \, i \in image} f(l_i, n, \alpha) \left<\NoL\right> \\ +I(f(n, v, \alpha)) \equiv \frac{1}{N}\sum_{\forall \, i \in image} f(l_i, n, v, \alpha) \left<\NoL\right> +\end{equation}$$ +

    +However, in practice we're using importance sampling which needs to take the \(pdf\) of the distribution +into account and adds a term \(\frac{4\left<\VoH\right>}{D(h_i, \alpha)\left<\NoH\right>}\). +See Importance Sampling For The IBL section: +

    +$$\begin{equation}\label{iblImportanceSampling} +\hat{I}(f(n, \alpha) \Lt) \equiv \frac{4}{N}\sum_i^N f(l_i, n, \alpha) \frac{\left<\VoH\right>}{D(h_i, \alpha)\left<\NoH\right>} \Lt(l_i) \left<\NoL\right> \\ +\hat{I}(f(n, \alpha)) \equiv \frac{4}{N}\sum_i^N f(l_i, n, \alpha) \frac{\left<\VoH\right>}{D(h_i, \alpha)\left<\NoH\right>} \left<\NoL\right> \\ +I(f(n, v, \alpha)) \equiv \frac{4}{N}\sum_i^N f(l_i, n, v, \alpha) \frac{\left<\VoH\right>}{D(h_i, \alpha)\left<\NoH\right>} \left<\NoL\right> +\end{equation}$$ +

    +Recalling that for \(\hat{I}\), we assume that \(v = n\), equations \ref{iblImportanceSampling}, +simplifies to: +

    +$$\begin{equation} +\hat{I}(f(n, \alpha) \Lt) \equiv \frac{4}{N}\sum_i^N \frac{f(l_i, n, \alpha)}{D(h_i, \alpha)} \Lt(l_i) \left<\NoL\right> \\ +\hat{I}(f(n, \alpha)) \equiv \frac{4}{N}\sum_i^N \frac{f(l_i, n, \alpha)}{D(h_i, \alpha)} \left<\NoL\right> \\ +I(f(n, v, \alpha)) \equiv \frac{4}{N}\sum_i^N \frac{f(l_i, n, v, \alpha)}{D(h_i, \alpha)} \frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> +\end{equation}$$ +

    +Then, the first two equations can be merged together such that \(LD(n, \alpha) = \frac{\hat{I}(f(n, \alpha) \Lt)}{\hat{I}(f(n, \alpha))}\) +

    +$$\begin{equation}\label{iblLD} +LD(n, \alpha) \equiv \frac{\sum_i^N \frac{f(l_i, n, \alpha)}{D(h_i, \alpha)} \Lt(l_i) \left<\NoL\right>}{\sum_i^N \frac{f(l_i, n, \alpha)}{D(h_i, \alpha)}\left<\NoL\right>} +\end{equation}$$ +$$\begin{equation}\label{iblDFV} +I(f(n, v, \alpha)) \equiv \frac{4}{N}\sum_i^N \frac{f(l_i, n, v, \alpha)}{D(h_i, \alpha)} \frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> +\end{equation}$$ +

    +Note that at this point, we could almost compute both remaining equations off-line. The only difficulty +is that we don't know \(f_0\) nor \(f_{90}\) when we precompute those integrals. We will see below that +we can incorporate these terms at runtime for equation \ref{iblDFV}, alas, this is not possible for +equation \ref{iblLD} and we have to assume \(f_0 = f_{90} = 1\) (i.e.: the fresnel term always evaluates to 1). +

    +We also have to deal with the visibility term of the brdf, in practice keeping it yields to slightly +worst results compared to the ground truth, so we also set \(V = 1\). +

    +Let's substitute \(f\) in equations \ref{iblLD} and \ref{iblDFV}: +

    +$$\begin{equation} +f(l_i, n, \alpha) = D(h_i, \alpha)F(f_0, f_{90}, \left<\VoH\right>)V(l_i, v, \alpha) +\end{equation}$$ +

    +The first simplification is that the term \(D(h_i, \alpha)\) in the brdf cancels out with the +denominator (which came from the \(pdf\) due to importance sampling) and F and V disappear since we +assume their value is 1. +

    +$$\begin{equation} +LD(n, \alpha) \equiv \frac{\sum_i^N V(l_i, v, \alpha)\left<\NoL\right>\Lt(l_i) }{\sum_i^N \left<\NoL\right>} +\end{equation}$$ +$$\begin{equation}\label{iblFV} +I(f(n, v, \alpha)) \equiv \frac{4}{N}\sum_i^N \color{green}{F(f_0, f_{90}, \left<\VoH\right>)} V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> +\end{equation}$$ +

    +Now, let's substitute the fresnel term into equation \ref{iblFV}: +

    +$$\begin{equation} +F(f_0, f_{90}, \left<\VoH\right>) = f_0 (1 - F_c(\left<\VoH\right>)) + f_{90} F_c(\left<\VoH\right>) \\ +F_c(\left<\VoH\right>) = (1 - \left<\VoH\right>)^5 +\end{equation}$$ +

    +$$\begin{equation} +I(f(n, v, \alpha)) \equiv \frac{4}{N}\sum_i^N \left[\color{green}{f_0 (1 - F_c(\left<\VoH\right>)) + f_{90} F_c(\left<\VoH\right>)}\right] V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> \\ +\end{equation}$$ +

    +$$ +\begin{align*} +I(f(n, v, \alpha)) \equiv & \color{green}{f_0 } \frac{4}{N}\sum_i^N \color{green}{(1 - F_c(\left<\VoH\right>))} V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> \\ + + & \color{green}{f_{90}} \frac{4}{N}\sum_i^N \color{green}{ F_c(\left<\VoH\right>) } V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> +\end{align*} +$$ +

    +And finally, we extract the equations that can be calculated off-line (i.e.: the part that doesn't +depend on the runtime parameters \(f_0\) and \(f_{90}\)): +

    +$$\begin{equation}\label{iblAllEquations} +DFG_1(\alpha, \left<\NoV\right>) = \frac{4}{N}\sum_i^N \color{green}{(1 - F_c(\left<\VoH\right>))} V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> \\ +DFG_2(\alpha, \left<\NoV\right>) = \frac{4}{N}\sum_i^N \color{green}{ F_c(\left<\VoH\right>) } V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> \\ +I(f(n, v, \alpha)) \equiv \color{green}{f_0} \color{red}{DFG_1(\alpha, \left<\NoV\right>)} + \color{green}{f_{90}} \color{red}{DFG_2(\alpha, \left<\NoV\right>)} +\end{equation}$$ +

    +Notice that \(DFG_1\) and \(DFG_2\) only depend on \(\NoV\), that is the angle between the normal \(n\) and +the view direction \(v\). This is true because the integral is symmetrical with respect to \(n\). +When integrating, we can choose any \(v\) we please as long as it satisfies \(\NoV\) +(e.g.: when calculating \(\VoH\)). +

    +Putting everything back together: +

    +$$ +\begin{align*} +\Lout(n,v,\alpha,f_0,f_{90}) &\simeq \big[ f_0 \color{red}{DFG_1(\NoV, \alpha)} + f_{90} \color{red}{DFG_2(\NoV, \alpha)} \big] \times LD(n, \alpha) \\ +DFG_1(\alpha, \left<\NoV\right>) &= \frac{4}{N}\sum_i^N \color{green}{(1 - F_c(\left<\VoH\right>))} V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> \\ +DFG_2(\alpha, \left<\NoV\right>) &= \frac{4}{N}\sum_i^N \color{green}{ F_c(\left<\VoH\right>) } V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> \\ +LD(n, \alpha) &= \frac{\sum_i^N V(l_i, n, \alpha)\left<\NoL\right>\Lt(l_i) }{\sum_i^N \left<\NoL\right>} +\end{align*} +$$ +

    +   

    The \(DFG_1\) and \(DFG_2\) term visualized

    +

    + +Both \(DFG_1\) and \(DFG_2\) can either be pre-calculated in a regular 2D texture indexed by \((\NoV, \alpha)\) +and sampled bilinearly, or computed at runtime using an analytic approximation of the surfaces. +See sample code in the annex. +The pre-calculated textures are shown in table 15. +A C++ implementation of the pre-computation can be found in section 9.5. +

    +

    +  + +
    \(DFG_1\) \(DFG_2\) \({ DFG_1, DFG_2, 0 }\)
    Table 15: Y axis: \(\alpha\). X axis: \(cos \theta\)
    +

    +\(DFG_1\) and \(DFG_2\) are conveniently within the \([0, 1]\) range, however 8-bits textures don't have +enough precision and will cause problems. +Unfortunately, on mobile, 16-bits or float textures are not ubiquitous and there are a limited +number of samplers. +Despite the attractive simplicity of the shader code using a texture, it might be better to use an +analytic approximation. Note however that since we only need to store two terms, +OpenGL ES 3.0's RG16F texture format is a good candidate. +

    +Such analytic approximation is described in [Karis14], itself based on [Lazarov13]. +[Narkowicz14] is another interesting approximation. Note that these two approximations are not +compatible with the energy compensation term presented in section 5.3.4.7. +Table 16 presents a visual representation of these approximations. +

    +  + +
    \(DFG_1\) \(DFG_2\) \({ DFG_1, DFG_2, 0 }\)
    Table 16: Y axis: \(\alpha\). X axis: \(cos \theta\)
    +

    +   

    The \(LD\) term visualized

    +

    + +\(LD\) is the convolution of the environment by a function that only depends on the \(\alpha\) parameter +(itself related to the roughness, see section 4.8.3.3). +\(LD\) can conveniently be stored in a mip-mapped cubemap where increasing LODs receive the environment +pre-filtered with increasing roughness. This works well because this convolution is a +powerful low-pass filter. To make good use of each mipmap level, it is necessary to remap +\(\alpha\); we find that using a power remapping with \(\gamma = 2\) works well and is convenient. +

    +$$ +\begin{align*} + \alpha &= perceptualRoughness^2 \\ + lod_{\alpha} &= \alpha^{\frac{1}{2}} = perceptualRoughness \\ +\end{align*} +$$ +

    +See an example below: +

    +
    +

    +

    \(\alpha=0.0\)
    +

    +

    +

    +

    \(\alpha=0.2\)
    +

    +

    +

    +

    \(\alpha=0.4\)
    +

    +

    +

    +

    \(0.6\)
    +

    +

    +

    +

    \(0.8\)
    +

    +

    +

    +   

    Indirect specular and indirect diffuse components visualized

    +

    + +Figure 53 shows how indirect lighting interacts with dielectrics and conductors. Direct lighting was removed for illustration purposes. +

    +

     
    Figure 53: Indirect diffuse and specular decomposition
    +

    +   

    IBL evaluation implementation

    +

    + +Listing 27 presents a GLSL implementation to evaluate the IBL, using the various textures described in the previous sections. +

     
    vec3 ibl(vec3 n, vec3 v, vec3 diffuseColor, vec3 f0, vec3 f90,
    +        float perceptualRoughness) {
    +    vec3 r = reflect(n);
    +    vec3 Ld = textureCube(irradianceEnvMap, r) * diffuseColor;
    +    float lod = computeLODFromRoughness(perceptualRoughness);
    +    vec3 Lld = textureCube(prefilteredEnvMap, r, lod);
    +    vec2 Ldfg = textureLod(dfgLut, vec2(dot(n, v), perceptualRoughness), 0.0).xy;
    +    vec3 Lr =  (f0 * Ldfg.x + f90 * Ldfg.y) * Lld;
    +    return Ld + Lr;
    +}
    Listing 27: GLSL implementation of image based lighting evaluation
    +

    + +We can however save a couple of texture lookups by using Spherical Harmonics instead of an +irradiance cubemap and the analytical approximation of the \(DFG\) LUT, as shown in listing 28. +

     
    vec3 irradianceSH(vec3 n) {
    +    // uniform vec3 sphericalHarmonics[9]
    +    // We can use only the first 2 bands for better performance
    +    return
    +          sphericalHarmonics[0]
    +        + sphericalHarmonics[1] * (n.y)
    +        + sphericalHarmonics[2] * (n.z)
    +        + sphericalHarmonics[3] * (n.x)
    +        + sphericalHarmonics[4] * (n.y * n.x)
    +        + sphericalHarmonics[5] * (n.y * n.z)
    +        + sphericalHarmonics[6] * (3.0 * n.z * n.z - 1.0)
    +        + sphericalHarmonics[7] * (n.z * n.x)
    +        + sphericalHarmonics[8] * (n.x * n.x - n.y * n.y);
    +}
    +
    +// NOTE: this is the DFG LUT implementation of the function above
    +vec2 prefilteredDFG_LUT(float coord, float NoV) {
    +    // coord = sqrt(roughness), which is the mapping used by the
    +    // IBL prefiltering code when computing the mipmaps
    +    return textureLod(dfgLut, vec2(NoV, coord), 0.0).rg;
    +}
    +
    +vec3 evaluateSpecularIBL(vec3 r, float perceptualRoughness) {
    +    // This assumes a 256x256 cubemap, with 9 mip levels
    +    float lod = 8.0 * perceptualRoughness;
    +    // decodeEnvironmentMap() either decodes RGBM or is a no-op if the
    +    // cubemap is stored in a float texture
    +    return decodeEnvironmentMap(textureCubeLodEXT(environmentMap, r, lod));
    +}
    +
    +vec3 evaluateIBL(vec3 n, vec3 v, vec3 diffuseColor, vec3 f0, vec3 f90, float perceptualRoughness) {
    +    float NoV = max(dot(n, v), 0.0);
    +    vec3 r = reflect(-v, n);
    +
    +    // Specular indirect
    +    vec3 indirectSpecular = evaluateSpecularIBL(r, perceptualRoughness);
    +    vec2 env = prefilteredDFG_LUT(perceptualRoughness, NoV);
    +    vec3 specularColor = f0 * env.x + f90 * env.y;
    +
    +    // Diffuse indirect
    +    // We multiply by the Lambertian BRDF to compute radiance from irradiance
    +    // With the Disney BRDF we would have to remove the Fresnel term that
    +    // depends on NoL (it would be rolled into the SH). The Lambertian BRDF
    +    // can be baked directly in the SH to save a multiplication here
    +    vec3 indirectDiffuse = max(irradianceSH(n), 0.0) * Fd_Lambert();
    +
    +    // Indirect contribution
    +    return diffuseColor * indirectDiffuse + indirectSpecular * specularColor;
    +}
    Listing 28: GLSL implementation of image based lighting evaluation
    +   

    Pre-integration for multiscattering

    +

    + +In section 4.7.2 we discussed how to use a second scaled specular lobe +to compensate for the energy loss due to only accounting for a single scattering event in our BRDF. +This energy compensation lobe is scaled by a term that depends on \(r\) defined in the following way: +

    +$$\begin{equation} +r = \int_{\Omega} D(l,v) V(l,v) \left< \NoL \right> \partial l +\end{equation}$$ +

    +Or, evaluated with importance sampling (See Importance Sampling For The IBL section): +

    +$$\begin{equation} +r \equiv \frac{4}{N}\sum_i^N V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> +\end{equation}$$ +

    +This equality is very similar to the terms \(DFG_1\) and \(DFG_2\) seen in equation \(\ref{iblAllEquations}\). +In fact, it's the same, except without the Fresnel term. +

    +By making the further assumption that \(f_{90} = 1\), we can rewrite \(DFG_1\) and \(DFG_2\) and the +\(\Lout\) reconstruction: +

    +$$ +\begin{align*} +\Lout(n,v,\alpha,f_0) &\simeq \big[ (1 - f_0) \color{red}{DFG_1^{multiscatter}(\NoV, \alpha)} + f_0 \color{red}{DFG_2^{multiscatter}(\NoV, \alpha)} \big] \times LD(n, \alpha) \\ +DFG_1^{multiscatter}(\alpha, \left<\NoV\right>) &= \frac{4}{N}\sum_i^N \color{green}{F_c(\left<\VoH\right>)} V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> \\ +DFG_2^{multiscatter}(\alpha, \left<\NoV\right>) &= \frac{4}{N}\sum_i^N V(l_i, v, \alpha)\frac{\left<\VoH\right>}{\left<\NoH\right>} \left<\NoL\right> \\ +LD(n, \alpha) &= \frac{\sum_i^N V(l_i, n, \alpha)\left<\NoL\right>\Lt(l_i) }{\sum_i^N V(l_i, n, \alpha)\left<\NoL\right>} +\end{align*} +$$ +

    +These two new \(DFG\) terms simply need to replace the ones used in the implementation shown in section 9.5: +

     
    float Fc = pow(1 - VoH, 5.0f);
    +r.x += Gv * Fc;
    +r.y += Gv;
    Listing 29: C++ implementation of the \(L_{DFG}\) term for multiscattering
    +

    + +To perform the reconstruction we need to slightly modify listing 30: +

     
    vec2 dfg = textureLod(dfgLut, vec2(dot(n, v), perceptualRoughness), 0.0).xy;
    +// (1 - f0) * dfg.x + f0 * dfg.y
    +vec3 specularColor = mix(dfg.xxx, dfg.yyy, f0);
    Listing 30: GLSL implementation of image based lighting evaluation, with multiscattering LUT
    +   

    Summary

    +

    + +In order to calculate the specular contribution of distant image-based lights, we had to make a few +approximations and compromises: +

    +

      +
    • \(v = n\), by far the assumption contributing to the largest error when integrating the + non-constant part of the IBL. This results in the complete loss of roughness anisotropy + with respect to the view point. +

      +

    • +
    • Roughness contribution for the non-constant part of the IBL is quantized and trilinear filtering + is used to interpolate between these levels. This is most visible at low roughnes (e.g.: around 0.0625 + for a 9 LODs cubemap). +

      +

    • +
    • Because mipmap levels are used to store the pre-integrated environment, they can't be used for + texture minification, as they ought to. This can causes aliasing or moiré artifacts in high frequency + regions or the environment at low roughness and/or distant or small objects. + This can also impact performance due to the resulting poor cache access pattern. +

      +

    • +
    • No Fresnel for the non-constant part of the IBL. +

      +

    • +
    • Visibility = 1 for the non-constant part of the IBL. +

      +

    • +
    • Schlick's Fresnel +

      +

    • +
    • \(f_{90} = 1\) in the multiscattering case.
    +

    +

     
    Figure 54: +
    +

    +

     
    Figure 55: +
    +

    +

     
    Figure 56: +
    +

    +

     
    Figure 57: +
    +

    +

     
    Figure 58: +
    +

    +   

    Clear coat

    +

    + +When sampling the IBL, the clear coat layer is calculated as a second specular lobe. This specular lobe is oriented along the view direction since we cannot reasonably integrate over the hemisphere. Listing 31 demonstrates this approximation in practice. It also shows the energy conservation step. It is important to note that this second specular lobe is computed exactly the same way as the main specular lobe, using the same DFG approximation. +

     
    // clearCoat_NoV == shading_NoV if the clear coat layer doesn't have its own normal map
    +float Fc = F_Schlick(0.04, 1.0, clearCoat_NoV) * clearCoat;
    +// base layer attenuation for energy compensation
    +iblDiffuse  *= 1.0 - Fc;
    +iblSpecular *= sq(1.0 - Fc);
    +iblSpecular += specularIBL(r, clearCoatPerceptualRoughness) * Fc;
    Listing 31: GLSL implementation of the clear coat specular lobe for image-based lighting
    +   

    Anisotropy

    +

    + +[McAuley15] describes a technique called “bent reflection vector”, based [Revie12]. The bent reflection vector is a rough approximation of anisotropic lighting but the alternative is to use importance sampling. This approximation is sufficiently cheap to compute and provides good results, as shown in figure 59 and figure 60. +

    +

     
    Figure 59: Anisotropic indirect specular reflections using bent normals (left: roughness 0.3, right: roughness: 0.0; both: anisotropy 1.0)
    +

    +

     
    Figure 60: Anisotropic reflections with varying roughness, metallicness, etc.
    +

    +The implementation of this technique is straightforward, as demonstrated in listing 32. +

     
    vec3 anisotropicTangent = cross(bitangent, v);
    +vec3 anisotropicNormal = cross(anisotropicTangent, bitangent);
    +vec3 bentNormal = normalize(mix(n, anisotropicNormal, anisotropy));
    +vec3 r = reflect(-v, bentNormal);
    Listing 32: GLSL implementation of the bent reflection vector
    +

    + +This technique can be made more useful by accepting negative anisotropy values, as shown in listing 33. When the anisotropy is negative, the highlights are not in the direction of the tangent, but in the direction of the bitangent instead. +

     
    vec3 anisotropicDirection = anisotropy >= 0.0 ? bitangent : tangent;
    +vec3 anisotropicTangent = cross(anisotropicDirection, v);
    +vec3 anisotropicNormal = cross(anisotropicTangent, anisotropicDirection);
    +vec3 bentNormal = normalize(mix(n, anisotropicNormal, anisotropy));
    +vec3 r = reflect(-v, bentNormal);
    Listing 33: GLSL implementation of the bent reflection vector
    +

    + +Figure 61 demonstrates this modified implementation in practice. +

    +

     
    Figure 61: Control of the anisotropy direction using positive (left) and negative (right) values
    +

    +   

    Subsurface

    +

    + +[TODO] Explain subsurface and IBL +

    +   

    Cloth

    +

    + +The IBL implementation for the cloth material model is more complicated than for the other material models. The main difference stems from the use of a different NDF (“Charlie” vs height-correlated Smith GGX). As described in this section, we use the split-sum approximation to compute the DFG term of the BRDF when computing an IBL. This DFG term is designed for a different BRDF and cannot be used for the cloth BRDF. Since we designed our cloth BRDF to not need a Fresnel term, we can generate a single DG term in the 3rd channel of the DFG LUT. The result is shown in figure 62. +

    +The DG term is generated using uniform sampling as recommended in [Estevez17]. With uniform sampling the \(pdf\) is simply \(\frac{1}{2\pi}\) and we must still use the Jacobian \(\frac{1}{4\left< \VoH \right>}\). +

    +

     
    Figure 62: DFG LUT with a 3rd channel encoding the DG term of the cloth BRDF
    +

    +The remainder of the image-based lighting implementation follows the same steps as the implementation of regular lights, including the optional subsurface scattering term and its wrap diffuse component. Just as with the clear coat IBL implementation, we cannot integrate over the hemisphere and use the view direction as the dominant light direction to compute the wrap diffuse component. +

     
    float diffuse = Fd_Lambert() * ambientOcclusion;
    +#if defined(SHADING_MODEL_CLOTH)
    +#if defined(MATERIAL_HAS_SUBSURFACE_COLOR)
    +diffuse *= saturate((NoV + 0.5) / 2.25);
    +#endif
    +#endif
    +
    +vec3 indirectDiffuse = irradianceIBL(n) * diffuse;
    +#if defined(SHADING_MODEL_CLOTH) && defined(MATERIAL_HAS_SUBSURFACE_COLOR)
    +indirectDiffuse *= saturate(subsurfaceColor + NoV);
    +#endif
    +
    +vec3 ibl = diffuseColor * indirectDiffuse + indirectSpecular * specularColor;
    Listing 34: GLSL implementation of the DFG approximation for the cloth NDF
    +

    + +It is important to note that this only addresses part of the IBL problem. The pre-filtered specular environment maps described earlier are convolved with the standard shading model's BRDF, which differs from the cloth BRDF. To get accurate result we should in theory provide one set of IBLs per BRDF used in the engine. Providing a second set of IBLs is however not practical for our use case so we decided to rely on the existing IBLs instead. +

    +   

    Static lighting

    +

    + +[TODO] Spherical-harmonics or spherical-gaussian lightmaps, irradiance volumes, PRT?… +

    +   

    Transparency and translucency lighting

    +

    + +Transparent and translucent materials are important to add realism and correctness to scenes. Filament must therefore provide lighting models for both types of materials to allow artists to properly recreate realistic scenes. Translucency can also be used effectively in a number of non-realistic settings. +

    +   

    Transparency

    +

    + +To properly light a transparent surface, we must first understand how the material's opacity is applied. Observe a window and you will see that the diffuse reflectance is transparent. On the other hand, the brighter the specular reflectance, the less opaque the window appears. This effect can be seen in figure 63: the scene is properly reflected onto the glass surfaces but the specular highlight of the sun is bright enough to appear opaque. +

    +

     
    Figure 63: Example of a complex object where lit surface transparency plays an important role
    +

    +

     
    Figure 64: Example of a complex object where lit surface transparency plays an important role
    +

    +To properly implement opacity, we will use the premultiplied alpha format. Given a desired opacity noted \( \alpha_{opacity} \) and a diffuse color \( \sigma \) (linear, unpremultiplied), we can compute the effective opacity of a fragment. +

    +$$\begin{align*} +color &= \sigma * \alpha_{opacity} \\ +opacity &= \alpha_{opacity} +\end{align*}$$ +

    +The physical interpretation is that the RGB components of the source color define how much light is emitted by the pixel, whereas the alpha component defines how much of the light behind the pixel is blocked by said pixel. We must therefore use the following blending functions: +

    +$$\begin{align*} +Blend_{src} &= 1 \\ +Blend_{dst} &= 1 - src_{\alpha} +\end{align*}$$ +

    +The GLSL implementation of these equations is presented in listing 35. +

     
    // baseColor has already been premultiplied
    +vec4 shadeSurface(vec4 baseColor) {
    +    float alpha = baseColor.a;
    +
    +    vec3 diffuseColor = evaluateDiffuseLighting();
    +    vec3 specularColor = evaluateSpecularLighting();    
    +
    +    return vec4(diffuseColor + specularColor, alpha);
    +}
    Listing 35: Implementation of lit surface transparency in GLSL
    +   

    Translucency

    +

    + +Translucent materials can be divided into two categories: +

    +

      +
    • Surface translucency +
    • +
    • Volume translucency
    +

    +Volume translucency is useful to light particle systems, for instance clouds or smoke. Surface translucency can be used to imitate materials with transmitted scattering such as wax, marble, skin, etc. +

    +[TODO] Surface translucency (BRDF+BTDF, BSSRDF) +

    +

     
    Figure 65: Front-lit translucent object (left) and back-lit translucent object (right), using approximated BTDF and BSSRDF. Model: Lucy from the Stanford University Computer Graphics Laboratory
    +

    +   

    Occlusion

    +

    + +Occlusion is an important darkening factor used to recreate shadowing at various scales: +

    +

    Small scale

    Micro-occlusion used to handle creases, cracks and cavities. +

    Medium scale

    Macro-occlusion used to handle occlusion by an object's own geometry or by geometry baked in normal maps (bricks, etc.). +

    Large scale

    Occlusion coming from contact between objects, or from an object's own geometry. +

    We currently ignore micro-occlusion, which is often exposed in tools and engines under the form of a “cavity map”. Sébastien Lagarde offers an interesting discussion in [Lagarde14] on how micro-occlusion is handled in Frostbite: diffuse micro-occlusion is pre-baked in diffuse maps and specular micro-occlusion is pre-baked in reflectance textures. +In our system, micro-occlusion can simply be baked in the base color map. This must be done knowing that the specular light will not be affected by micro-occlusion. +

    +Medium scale ambient occlusion is pre-baked in ambient occlusion maps, exposed as a material parameter, as seen in the material parameterization section earlier. +

    +Large scale ambient occlusion is often computed using screen-space techniques such as SSAO (screen-space ambient occlusion), HBAO (horizon based ambient occlusion), etc. Note that these techniques can also contribute to medium scale ambient occlusion when the camera is close enough to surfaces. +

    +Note: to prevent over darkening when using both medium and large scale occlusion, Lagarde recommends to use \(min({AO}_{medium}, {AO}_{large})\). +

    +   

    Diffuse occlusion

    +

    + +Morgan McGuire formalizes ambient occlusion in the context of physically based rendering in [McGuire10]. In his formulation, McGuire defines an ambient illumination function \( L_a \), which in our case is encoded with spherical harmonics. He also defines a visibility function \(V\), with \(V(l)=1\) if there is an unoccluded line of sight from the surface in direction \(l\), and 0 otherwise. +

    +With these two functions, the ambient term of the rendering equation can be expressed as shown in equation \(\ref{diffuseAO}\). +

    +$$\begin{equation}\label{diffuseAO} +L(l,v) = \int_{\Omega} f(l,v) L_a(l) V(l) \left< \NoL \right> dl +\end{equation}$$ +

    +This expression can be approximated by separating the visibility term from the illumination function, as shown in equation \(\ref{diffuseAOApprox}\). +

    +$$\begin{equation}\label{diffuseAOApprox} +L(l,v) \approx \left( \pi \int_{\Omega} f(l,v) L_a(l) dl \right) \left( \frac{1}{\pi} \int_{\Omega} V(l) \left< \NoL \right> dl \right) +\end{equation}$$ +

    +This approximation is only exact when the distant light \( L_a \) is constant and \(f\) is a Lambertian term. McGuire states however that this approximation is reasonable if both functions are relatively smooth over most of the sphere. This happens to be the case with a distant light probe (IBL). +

    +The left term of this approximation is the pre-computed diffuse component of our IBL. The right term is a scalar factor between 0 and 1 that indicates the fractional accessibility of a point. Its opposite is the diffuse ambient occlusion term, show in equation \(\ref{diffuseAOTerm}\). +

    +$$\begin{equation}\label{diffuseAOTerm} +{AO} = 1 - \frac{1}{\pi} \int_{\Omega} V(l) \left< \NoL \right> dl +\end{equation}$$ +

    +Since we use a pre-computed diffuse term, we cannot compute the exact accessibility of shaded points at runtime. To compensate for this lack of information in our precomputed term, we partially reconstruct incident lighting by applying an ambient occlusion factor specific to the surface's material at the shaded point. +

    +In practice, baked ambient occlusion is stored as a grayscale texture which can often be lower resolution than other textures (base color or normals for instance). It is important to note that the ambient occlusion property of our material model intends to recreate macro-level diffuse ambient occlusion. While this approximation is not physically correct, it constitutes an acceptable tradeoff of quality vs performance. +

    +Figure 66 shows two different materials without and with diffuse ambient occlusion. Notice how the material ambient occlusion is used to recreate the natural shadowing that occurs between the different tiles. Without ambient occlusion, both materials appear too flat. +

    +

     
    Figure 66: Comparison of materials without diffuse ambient occlusion (left) and with (right)
    +

    +Applying baked diffuse ambient occlusion in a GLSL shader is straightforward, as shown in listing 36. +

     
    // diffuse indirect
    +vec3 indirectDiffuse = max(irradianceSH(n), 0.0) * Fd_Lambert();
    +// ambient occlusion
    +indirectDiffuse *= texture2D(aoMap, outUV).r;
    Listing 36: Implementation of baked diffuse ambient occlusion in GLSL
    +

    + +Note how the ambient occlusion term is only applied to indirect lighting. +

    +   

    Specular occlusion

    +

    + +Specular micro-occlusion can be derived from \(\fNormal\), itself derived from the diffuse color. The derivation is based on the knowledge that no real-world material has a reflectance lower than 2%. Values in the 0-2% range can therefore be treated as pre-baked specular occlusion used to smoothly extinguish the Fresnel term. +

     
    float f90 = clamp(dot(f0, 50.0 * 0.33), 0.0, 1.0);
    +// cheap luminance approximation
    +float f90 = clamp(50.0 * f0.g, 0.0, 1.0);
    Listing 37: Pre-baked specular occlusion in GLSL
    +

    + +The derivations mentioned earlier for ambient occlusion assume Lambertian surfaces and are only valid for indirect diffuse lighting. The lack of information about surface accessibility is particularly harmful to the reconstruction of indirect specular lighting. It usually manifests itself as light leaks. +

    +Sébastien Lagarde proposes an empirical approach to derive the specular occlusion term from the diffuse occlusion term in [Lagarde14]. The result does not have any physical basis but produces visually pleasant results. The goal of his formulation is return the diffuse occlusion term unmodified for rough surfaces. For smooth surfaces, the formulation, implemented in listing 38, reduces the influence of occlusion at normal incidence and increases it at grazing angles. +

     
    float computeSpecularAO(float NoV, float ao, float roughness) {
    +    return clamp(pow(NoV + ao, exp2(-16.0 * roughness - 1.0)) - 1.0 + ao, 0.0, 1.0);
    +}
    +
    +// specular indirect
    +vec3 indirectSpecular = evaluateSpecularIBL(r, perceptualRoughness);
    +// ambient occlusion
    +float ao = texture2D(aoMap, outUV).r;
    +indirectSpecular *= computeSpecularAO(NoV, ao, roughness);
    Listing 38: Implementation of Lagarde's specular occlusion factor in GLSL
    +

    + +Note how the specular occlusion factor is only applied to indirect lighting. +

    +   

    Horizon specular occlusion

    +

    + +When computing the specular IBL contribution for a surface that uses a normal map, it is possible to end up with a reflection vector pointing towards the surface. If this reflection vector is used for shading directly, the surface will be lit in places where it should not be lit (assuming opaque surfaces). This is another occurrence of light leaking that can easily be minimized using a simple technique described by Jeff Russell [Russell15]. +

    +The key idea is to occlude light coming from behind the surface. This can easily be achieved since a negative dot product between the reflected vector and the surface's normal indicates a reflection vector pointing towards the surface. Our implementation shown in listing 39 is similar to Russell's, albeit without the artist controlled horizon fading factor. +

     
    // specular indirect
    +vec3 indirectSpecular = evaluateSpecularIBL(r, perceptualRoughness);
    +
    +// horizon occlusion with falloff, should be computed for direct specular too
    +float horizon = min(1.0 + dot(r, n), 1.0);
    +indirectSpecular *= horizon * horizon;
    Listing 39: Implementation of horizon specular occlusion in GLSL
    +

    + +Horizon specular occlusion fading is cheap but can easily be omitted to improve performance as needed. +

    +   

    Normal mapping

    +

    + +There are two common use cases of normal maps: replacing high-poly meshes with low-poly meshes (using a base map) and adding surface details (using a detail map). +

    +Let's imagine that we want to render a piece of furniture covered in tufted leather. Modeling the geometry to accurately represent the tufted pattern would require too many triangles so we instead bake a high-poly mesh into a normal map. Once the base map is applied to a simplified mesh (in this case, a quad), we get the result in figure 67. The base map used to create this effect is shown in figure 68. +

    +

     
    Figure 67: Low-poly mesh without normal mapping (left) and with (right)
    +

    +

     
    Figure 68: Normal map used as a base map
    +

    +A simple problem arises if we now want to combine this base map with a second normal map. For instance, let's use the detail map shown in figure 69 to add cracks in the leather. +

    +

     
    Figure 69: Normal map used as a detail map
    +

    +Given the nature of normal maps (XYZ components stored in tangent space), it is fairly obvious that naive approaches such as linear or overlay blending cannot work. We will use two more advanced techniques: a mathematically correct one and an approximation suitable for real-time shading. +

    +   

    Reoriented normal mapping

    +

    + +Colin Barré-Brisebois and Stephen Hill propose in [Hill12] a mathematically sound solution called Reoriented Normal Mapping, which consists in rotating the basis of the detail map onto the normal from the base map. This technique relies on the shortest arc quaternion to apply the rotation, which greatly simplifies thanks to the properties of the tangent space. +

    +Following the simplifications described in [Hill12], we can produce the GLSL implementation shown in listing 40. +

     
    vec3 t = texture(baseMap,   uv).xyz * vec3( 2.0,  2.0, 2.0) + vec3(-1.0, -1.0,  0.0);
    +vec3 u = texture(detailMap, uv).xyz * vec3(-2.0, -2.0, 2.0) + vec3( 1.0,  1.0, -1.0);
    +vec3 r = normalize(t * dot(t, u) - u * t.z);
    +return r;
    Listing 40: Implementation of reoriented normal mapping in GLSL
    +

    + +Note that this implementation assumes that the normals are stored uncompressed and in the [0..1] range in the source textures. +

    +The normalization step is not strictly necessary and can be skipped if the technique is used at runtime. If so, the computation of r becomes t * dot(t, u) / t.z - u. +

    +Since this technique is slightly more expensive than the one described below, we will mostly use it offline. We therefore provide a simple offline tool to combine two normal maps. Figure 70 presents the output of the tool with the base map and the detail map shown previously. +

    +

     
    Figure 70: Blended normal and detail map (left) and resulting render when combined with a diffuse map (right)
    +

    +   

    UDN blending

    +

    + +The technique called UDN blending, described in [Hill12], is a variant of the partial derivative blending technique. Its main advantage is the low number of shader instructions it requires (see listing 41). While it leads to a reduction in details over flat areas, UDN blending is interesting if blending must be performed at runtime. +

     
    vec3 t = texture(baseMap,   uv).xyz * 2.0 - 1.0;
    +vec3 u = texture(detailMap, uv).xyz * 2.0 - 1.0;
    +vec3 r = normalize(t.xy + u.xy, t.z);
    +return r;
    Listing 41: Implementation of UDN blending in GLSL
    +

    + +The results are visually close to Reoriented Normal Mapping but a careful comparison of the data shows that UDN is indeed less correct. Figure 71 presents the result of the UDN blending approach using the same source data as in the previous examples. +

    +

     
    Figure 71: Blended normal and detail map using the UDN blending technique
    +

    +   

    Volumetric effects

    +   

    Exponential height fog

    +

    + +

     
    Figure 72: Example of directional in-scattering with exponential height fog
    +

    +

     
    Figure 73: Example of directional in-scattering with exponential height fog
    +

    +   

    Anti-aliasing

    +

    + +[TODO] MSAA, geometric AA (normals and roughness), shader anti-aliasing (object-space shading?) +

    +   

    Imaging pipeline

    +

    + +The lighting section of this document describes how light interacts with surfaces in the scene in a physically based manner. To achieve plausible results, we must go a step further and consider the transformations necessary to convert the scene luminance, as computed by our lighting equations, into displayable pixel values. +

    +The series of transformations we are going to use form the following imaging pipeline: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SceneNormalizedluminanceluminanceWhitebalance(HDR)ColorgradingTonemappingPixelOETFvalue(LDR) +

    +Note: the OETF step is the application of the opto-electronic transfer function of the target color space. For clarity this diagram does not include post-processing steps such as vignette, bloom, etc. These effects will be discussed separately. +

    +[TODO] Color spaces (ACES, sRGB, Rec. 709, Rec. 2020, etc.), gamma/linear, etc. +

    +   

    Physically based camera

    +

    + +The first step in the image transformation process is to use a physically based camera to properly expose the scene's outgoing luminance. +

    +   

    Exposure settings

    +

    + +Because we use photometric units throughout the lighting pipeline, the light reaching the camera is an energy expressed in luminance \(L\), in \(cd.m^{-2}\). Light incident to the camera sensor can cover a large range of values, from \(10^{-5}cd.m^{-2}\) for starlight to \(10^{9}cd.m^{-2}\) for the sun. Since we obviously cannot manipulate and even less record such a large range of values, we need to remap them. +

    +This range remapping is done in a camera by exposing the sensor for a certain time. To maximize the use of the limited range of the sensor, the scene's light range is centered around the “middle gray”, a value halfway between black and white. The exposition is therefore achieved by manipulating, either manually or automatically, 3 settings: +

    +

      +
    • Aperture +
    • +
    • Shutter speed +
    • +
    • Sensitivity (also called gain)
    +

    +

    Aperture

    Noted \(N\) and expressed in f-stops ƒ, this setting controls how open or closed the camera system's aperture is. Since an f-stop indicate the ratio of the lens' focal length to the diameter of the entrance pupil, high-values (ƒ/16) indicate a small aperture and small values (ƒ/1.4) indicate a wide aperture. In addition to the exposition, the aperture setting controls the depth of field. +

    Shutter speed

    Noted \(t\) and expressed in seconds \(s\), this setting controls how long the aperture remains opened (it also controls the timing of the sensor shutter(s), whether electronic or mechanical). In addition to the exposition, the shutter speed controls motion blur. +

    Sensitivity

    Noted \(S\) and expressed in ISO, this setting controls how the light reaching the sensor is quantized. Because of its unit, this setting is often referred to as simply the “ISO” or “ISO setting”. In addition to the exposition, the sensitivity setting controls the amount of noise. +

    +   

    Exposure value

    +

    + +Since referring to these 3 settings in our equations would be unwieldy, we instead summarize the “exposure triangle” by an exposure value, noted EV10. +

    +The EV is expressed in a base-2 logarithmic scale, with a difference of 1 EV called a stop. One positive stop (+1 EV) corresponds to a factor of two in luminance and one negative stop (−1 EV) corresponds to a factor of half in luminance. +

    +Equation \( \ref{ev} \) shows the formal definition of EV. +

    +$$\begin{equation}\label{ev} +EV = log_2(\frac{N^2}{t}) +\end{equation}$$ +

    +Note that this definition is only function of the aperture and shutter speed, but not the sensitivity. An exposure value is by convention defined for ISO 100, or \( EV_{100} \), and because we wish to work with this convention, we need to be able to express \( EV_{100} \) as a function of the sensitivity. +

    +Since we know that EV is a base-2 logarithmic scale in which each stop increases or decreases the brightness by a factor of 2, we can formally define \( EV_{S} \), the exposure value at given sensitivity (equation \(\ref{evS}\)). +

    +$$\begin{equation}\label{evS} +{EV}_S = EV_{100} + log_2(\frac{S}{100}) +\end{equation}$$ +

    +Calculating the \( EV_{100} \) as a function of the 3 camera settings is trivial, as shown in \(\ref{ev100}\). +

    +$$\begin{equation}\label{ev100} +{EV}_{100} = EV_{S} - log_2(\frac{S}{100}) = log_2(\frac{N^2}{t}) - log_2(\frac{S}{100}) +\end{equation}$$ +

    +Note that the operator (photographer, etc.) can achieve the same exposure (and therefore EV) with several combinations of aperture, shutter speed and sensitivity. This allows some artistic control in the process (depth of field vs motion blur vs grain). +

    +

     10 We assume a digital sensor, which means we don't need to take reciprocity failure into account +
    +

    +   

    Exposure value and luminance

    +

    + +A camera, similar to a spot meter, is able to measure the average luminance of a scene and convert it into EV to achieve automatic exposure, or at the very least offer the user exposure guidance. +

    +It is possible to define EV as a function of the scene luminance \(L\), given a per-device calibration constant \(K\) (equation \( \ref{evK} \)). +

    +$$\begin{equation}\label{evK} +EV = log_2(\frac{L \times S}{K}) +\end{equation}$$ +

    +That constant \(K\) is the reflected-light meter constant, which varies between manufacturers. We could find two common values for this constant: 12.5, used by Canon, Nikon and Sekonic, and 14, used by Pentax and Minolta. Given the wide availability of Canon and Nikon cameras, as well as our own usage of Sekonic light meters, we will choose to use \( K = 12.5 \). +

    +Since we want to work with \( EV_{100} \), we can substitute \(K\) and \(S\) in equation \( \ref{evK} \) to obtain equation \( \ref{ev100L} \). +

    +$$\begin{equation}\label{ev100L} +EV = log_2(L \frac{100}{12.5}) +\end{equation}$$ +

    +Given this relationship, it would be possible to implement automatic exposure in our engine by first measuring the average luminance of a frame. An easy way to achieve this is to simply downsample a luminance buffer down to 1 pixel and read the remaining value. This technique is unfortunately rarely stable and can easily be affected by extreme values. Many games use a different approach which consists in using a luminance histogram to remove extreme values. +

    +For validation and testing purposes, the luminance can be computed from a given EV: +

    +$$\begin{equation} +L = 2^{EV_{100}} \times \frac{12.5}{100} = 2^{EV_{100} - 3} +\end{equation}$$ +

    +   

    Exposure value and illuminance

    +

    + +It is possible to define EV as a function of the illuminance \(E\), given a per-device calibration constant \(C\): +

    +$$\begin{equation}\label{evC} +EV = log_2(\frac{E \times S}{C}) +\end{equation}$$ +

    +The constant \(C\) is the incident-light meter constant, which varies between manufacturers and/or types of sensors. There are two common types of sensors: flat and hemispherical. For flat sensors, a common value is 250. With hemispherical sensors, we could find two common values: 320, used by Minolta, and 340, used by Sekonic. +

    +Since we want to work with \( EV_{100} \), we can substitute \(S\) \( \ref{evC} \) to obtain equation \( \ref{ev100C} \). +

    +$$\begin{equation}\label{ev100C} +EV = log_2(E \frac{100}{C}) +\end{equation}$$ +

    +The illuminance can then be computed from a given EV. For a flat sensor with \( C = 250 \) we obtain equation \( \ref{eFlatSensor} \). +

    +$$\begin{equation}\label{eFlatSensor} +E = 2^{EV_{100}} \times 2.5 +\end{equation}$$ +

    +For a hemispherical sensor with \( C = 340 \) we obtain equation \( \ref{eHemisphereSensor} \) +

    +$$\begin{equation}\label{eHemisphereSensor} +E = 2^{EV_{100}} \times 3.4 +\end{equation}$$ +

    +   

    Exposure compensation

    +

    + +Even though an exposure value actually indicates combinations of camera settings, it is often used by photographers to describe light intensity. This is why cameras let photographers apply an exposure compensation to over or under-expose an image. This setting can be used for artistic control but also to achieve proper exposure (snow for instance will be exposed for as 18% middle-gray). +

    +Applying an exposure compensation \(EC\) is a simple as adding an offset to the exposure value, as shown in equation \( \ref{ec} \). +

    +$$\begin{equation}\label{ec} +EV_{100}' = EV_{100} - EC +\end{equation}$$ +

    +This equation uses a negative sign because we are using \(EC\) in f-stops to adjust the final exposure. Increasing the EV is akin to closing down the aperture of the lens (or reducing shutter speed or reducing sensitivity). A higher EV will produce darker images. +

    +   

    Exposure

    +

    + +To convert the scene luminance into normalized luminance, we must use the photometric exposure (or luminous exposure), or amount of scene luminance that reaches the camera sensor. The photometric exposure, expressed in lux seconds and noted \(H\), is given by equation \( \ref{photometricExposure} \). +

    +$$\begin{equation}\label{photometricExposure} +H = \frac{q \cdot t}{N^2} L +\end{equation}$$ +

    +Where \(L\) is the luminance of the scene, \(t\) the shutter speed, \(N\) the aperture and \(q\) the lens and vignetting attenuation (typically \( q = 0.65 \)11). This definition does not take the sensor sensitivity into account. To do so, we must use one of the three ways to relate photometric exposure and sensitivity: saturation-based speed, noise-based speed and standard output sensitivity. +

    +We choose the saturation-based speed relation, which gives us \( H_{sat} \), the maximum possible exposure that does not lead to clipped or bloomed camera output (equation \( \ref{hSat} \)). +

    +$$\begin{equation}\label{hSat} +H_{sat} = \frac{78}{S_{sat}} +\end{equation}$$ +

    +We combine equations \( \ref{hSat} \) and \( \ref{photometricExposure} \) in equation \( \ref{lmax} \) to compute the maximum luminance \( L_{max} \) that will saturate the sensor given exposure settings \(S\), \(N\) and \(t\). +

    +$$\begin{equation}\label{lmax} +L_{max} = \frac{N^2}{q \cdot t} \frac{78}{S} +\end{equation}$$ +

    +This maximum luminance can then be used to normalize incident luminance \(L\) as shown in equation \( \ref{normalizedLuminance} \). +

    +$$\begin{equation}\label{normalizedLuminance} +L' = L \frac{1}{L_{max}} +\end{equation}$$ +

    +\( L_{max} \) can be simplified using equation \( \ref{ev} \), \( S = 100 \) and \( q = 0.65 \): +

    +$$\begin{align*} +L_{max} &= \frac{N^2}{t} \frac{78}{q \cdot S} \\ +L_{max} &= 2^{EV_{100}} \frac{78}{q \cdot S} \\ +L_{max} &= 2^{EV_{100}} \times 1.2 +\end{align*}$$ +

    +Listing 42 shows how the exposure term can be applied directly to the pixel color computed in a fragment shader. +

     
    // Computes the camera's EV100 from exposure settings
    +// aperture in f-stops
    +// shutterSpeed in seconds
    +// sensitivity in ISO
    +float exposureSettings(float aperture, float shutterSpeed, float sensitivity) {
    +    return log2((aperture * aperture) / shutterSpeed * 100.0 / sensitivity);
    +}
    +
    +// Computes the exposure normalization factor from
    +// the camera's EV100
    +float exposure(float ev100) {
    +    return 1.0 / (pow(2.0, ev100) * 1.2);
    +}
    +
    +float ev100 = exposureSettings(aperture, shutterSpeed, sensitivity);
    +float exposure = exposure(ev100);
    +
    +vec4 color = evaluateLighting();
    +color.rgb *= exposure;
    Listing 42: Implementation of exposure in GLSL
    +

    + +In practice the exposure factor can be pre-computed on the CPU to save shader instructions. +

    +

     11 See Film Speed, Measurements and calculations on Wikipedia (https://en.wikipedia.org/wiki/Film_speed) +
    +

    +   

    Automatic exposure

    +

    + +The process described above relies on artists setting the camera exposure settings manually. This can prove cumbersome in practice since camera movements and/or dynamic effects can greatly affect the scene's luminance. Since we know how to compute the exposure value from a given luminance (see section 8.1.2.1), we can transform our camera into a spot meter. To do so, we need to measure the scene's luminance. +

    +There are two common techniques used to measure the scene's luminance: +

    +

      +
    • Luminance downsampling, by downsampling the previous frame successively until obtaining a 1×1 log luminance buffer that can be read on the CPU (this could also be achieved using a compute shader). The result is the average log luminance of the scene. The first downsampling must extract the luminance of each pixel first. This technique can be unstable and its output should be smoothed over time. +
    • +
    • Using a luminance histogram, to find the average log luminance. This technique has an advantage over the previous one as it allows to ignore extreme values and offers more stable results.
    +

    +Note that both methods will find the average luminance after multiplication by the albedo. This is not entirely correct but the alternative is to keep a luminance buffer that contains the luminance of each pixel before multiplication by the surface albedo. This is expensive both computationally and memory-wise. +

    +These two techniques also limit the metering system to average metering, where each pixel has the same influence (or weight) over the final exposure. Cameras typically offer 3 modes of metering: +

    +

    Spot metering

    In which only a small circle in the center of the image contributes to the final exposure. That circle is usually 1 to 5% of the total image size. +

    Center-weighted metering

    Gives more influence to scene luminance values located in the center of the screen. +

    Multi-zone or matrix metering

    A metering mode that differs for each manufacturer. The goal of this mode is to prioritize exposure for the most important parts of the scene. This is often achieved by splitting the image into a grid and by classifying each cell (using focus information, min/max luminance, etc.). Advanced implementations attempt to compare the scene to a known dataset to achieve proper exposure (backlit sunset, overcast snowy day, etc.). +

    +   

    Spot metering

    +

    + +The weight \(w\) of each luminance value to use when computing the scene luminance is given by equation \( \ref{spotMetering} \). +

    +$$\begin{equation}\label{spotMetering} +w(x,y) = \begin{cases} 1 & \left| p_{x,y} - s_{x,y} \right| \le s_r \\ 0 & \left| p_{x,y} - s_{x,y} \right| \gt s_r \end{cases} +\end{equation}$$ +

    +Where \(p\) is the position of the pixel, \(s\) the center of the spot and \( s_r \) the radius of the spot. +

    +   

    Center-weighted metering

    +

    + +$$\begin{equation}\label{centerMetering} +w(x,y) = smooth(\left| p_{x,y} - c \right| \times \frac{2}{width} ) +\end{equation}$$ +

    +Where \(c\) is the center of the time and \( smooth() \) a smoothing function such as GLSL's smoothstep(). +

    +   

    Adaptation

    +

    + +To smooth the result of the metering, we can use equation \( \ref{adaptation} \), an exponential feedback loop as described by Pattanaik et al. in [Pattanaik00]. +

    +$$\begin{equation}\label{adaptation} +L_{avg} = L_{avg} + (L - L_{avg}) \times (1 - e^{-\Delta t \cdot \tau}) +\end{equation}$$ +

    +Where \( \Delta t \) is the delta time from the previous frame and \(\tau\) a constant that controls the adaptation rate. +

    +   

    Bloom

    +

    + +Because the EV scale is almost perceptually linear, the exposure value is also often used as a light unit. This means we could let artists specify the intensity of lights or emissive surfaces using exposure compensation as a unit. The intensity of emitted light would therefore be relative to the exposure settings. Using exposure compensation as a light unit should be avoided whenever possible but can be useful to force (or cancel) a bloom effect around emissive surfaces independently of the camera settings (for instance, a lightsaber in a game should always bloom). +

    +

     
    Figure 74: Saturated photosites on a sensor create a blooming effect in the bright parts of the scene
    +

    +With \(c\) the bloom color and \( EV_{100} \) the current exposure value, we can easily compute the luminance of the bloom value as show in equation \( \ref{bloomEV} \). +

    +$$\begin{equation}\label{bloomEV} +EV_{bloom} = EV_{100} + EC \\ +L_{bloom} = c \times 2^{EV_{bloom} - 3} +\end{equation}$$ +

    +Equation \( \ref{bloomEV} \) can be used in a fragment shader to implement emissive blooms, as shown in listing 43. +

     
    vec4 surfaceShading() {
    +    vec4 color = evaluateLights();
    +    // rgb = color, w = exposure compensation
    +    vec4 emissive = getEmissive();
    +    color.rgb += emissive.rgb * pow(2.0, ev100 + emissive.w - 3.0);
    +    color.rgb *= exposure;
    +    return color;
    +}
    Listing 43: Implementation of emissive bloom in GLSL
    +   

    Optics post-processing

    +   

    Color fringing

    +

    + +[TODO] +

    +

     
    Figure 75: Example of color fringing: look at the ear on the left or the chin at the bottom.
    +

    +   

    Lens flares

    +

    + +[TODO] Notes: there is a physically based approach to generating lens flares, by tracing rays through the optical assembly of the lens, but we are going to use an image-based approach. This approach is cheaper and has a few welcome benefits such as free emitters occlusion and unlimited light sources support. +

    +   

    Filmic post-processing

    +

    + +[TODO] Perform post-processing on the scene referred data (linear space, before tone-mapping) as much as possible +

    +It is important to provide color correction tools to give artists greater artistic control over the final image. These tools are found in every photo or video processing application, such as Adobe Photoshop or Adobe After Effects. +

    +   

    Contrast

    +   

    Curves

    +   

    Levels

    +   

    Color grading

    +   

    Light path

    +

    + +The light path, or rendering method, used by the engine can have serious performance implications and may impose strong limitations on how many lights can be used in a scene. There are traditionally two different rendering methods used by 3D engines forward and deferred rendering. +

    +Our goal is to use a rendering method that obeys the following constraints: +

    +

      +
    • Low bandwidth requirements +
    • +
    • Multiple dynamic lights per pixel
    +

    +Additionally, we would like to easily support: +

    +

      +
    • MSAA +
    • +
    • Transparency +
    • +
    • Multiple material models
    +

    +Deferred rendering is used by many modern 3D rendering engines to easily support dozens, hundreds or even thousands of light source (amongst other benefits). This method is unfortunately very expensive in terms of bandwidth. With our default PBR material model, our G-buffer would use between 160 and 192 bits per pixel, which would translate directly to rather high bandwidth requirements. +

    +Forward rendering methods on the other hand have historically been bad at handling multiple lights. A common implementation is to render the scene multiple times, once per visible light, and to blend (add) the results. Another technique consists in assigning a fixed maximum of lights to each object in the scene. This is however impractical when objects occupy a vast amount of space in the world (building, road, etc.). +

    +Tiled shading can be applied to both forward and deferred rendering methods. The idea is to split the screen in a grid of tiles and for each tile, find the list of lights that affect the pixels within that tile. This has the advantage of reducing overdraw (in deferred rendering) and shading computations of large objects (in forward rendering). This technique suffers however from depth discontinuities issues that can lead to large amounts of extraneous work. +

    +The scene displayed in figure 76 was rendered using clustered forward rendering. +

    +

     
    Figure 76: Clustered forward rendering with dozens of dynamic lights and MSAA
    +

    +Figure 77 shows the same scene split in tiles (in this case, a 1280×720 render target with 80×80px tiles). +

    +

     
    Figure 77: Tiled shading (16×9 tiles)
    +

    +   

    Clustered Forward Rendering

    +

    + +We decided to explore another method called Clustered Shading, in its forward variant. Clustered shading expands on the idea of tiled rendering but adds a segmentation on the 3rd axis. The “clustering” is done in view space, by splitting the frustum into a 3D grid. +

    +The frustum is first sliced on the depth axis as show in figure 78. +

    +

     
    Figure 78: Depth slicing (16 slices)
    +

    +And the depth slices are then combined with the screen tiles to “voxelize” the frustum. We call each cluster a froxel as it makes it clear what they represent (a voxel in frustum space). The result of the “froxelization” pass is shown in figure 79 and figure 80. +

    +

     
    Figure 79: Frustum voxelization (5×3 tiles, 8 depth slices)
    +

    +

     
    Figure 80: Frustum voxelization (5×3 tiles, 8 depth slices)
    +

    +Before rendering a frame, each light in the scene is assigned to any froxel it intersects with. The result of the lights assignment pass is a list of lights for each froxel. During the rendering pass, we can compute the ID of the froxel a fragment belongs to and therefore the list of lights that can affect that fragment. +

    +The depth slicing is not linear, but exponential. In a typical scene, there will be more pixels close to the near plane than to the far plane. An exponential grid of froxels will therefore improve the assignment of lights where it matters the most. +

    +Figure 81 shows how much world space unit each depth slice uses with exponential slicing. +

    +

     
    Figure 81: Near: 0.1m, Far: 100m, 16 slices
    +

    +A simple exponential voxelization is unfortunately not enough. The graphic above clearly illustrates how world space is distributed across slices but it fails to show what happens close to the near plane. If we examine the same distribution in a smaller range (0.1m to 7m) we can see an interesting problem appear as shown in figure 82. +

    +

     
    Figure 82: Depth distribution in the 0.1-7m range
    +

    +This graphic shows that a simple exponential distribution uses up half of the slices very close to the camera. In this particular case, we use 8 slices out of 16in the first 5 meters. Since dynamic world lights are either point lights (spheres) or spot lights (cones), such a fine resolution is completely unnecessary so close to the near plane. +

    +Our solution is to manually tweak the size of the first froxel depending on the scene and the near and far planes. By doing so, we can better distribute the remaining froxels across the frustum. Figure 83 shows for instance what happens when we use a special froxel between 0.1m and 5m. +

    +

     
    Figure 83: Near: 0.1, Far: 100m, 16 slices, Special froxel: 0.1-5m
    +

    +This new distribution is much more efficient and allows a better assignment of the lights throughout the entire frustum. +

    +   

    Implementation notes

    +

    + +Lights assignment can be done in two different ways, on the GPU or on the CPU. +

    +   

    GPU lights assignment

    +

    + +This implementation requires OpenGL ES 3.1 and support for compute shaders. The lights are stored in Shader Storage Buffer Objects (SSBO) and passed to a compute shader that assigns each light to the corresponding froxels. +

    +The frustum voxelization can be executed only once by a first compute shader (as long as the projection matrix does not change), and the lights assignment can be performed each frame by another compute shader. +

    +The threading model of compute shaders is particularly well suited for this task. We simply invoke as many workgroups as we have froxels (we can directly map the X, Y and Z workgroup counts to our froxel grid resolution). Each workground will in turn be threaded and traverse all the lights to assign. +

    +Intersection tests imply simple sphere/frustum or cone/frustum tests. +

    +See the annex for the source code of a GPU implementation (point lights only). +

    +   

    CPU lights assignment

    +

    + +On non-OpenGL ES 3.1 devices, lights assignment can be performed efficiently on the CPU. The algorithm is different from the GPU implementation. Instead of iterating over every light for each froxel, the engine will “rasterize” each light as froxels. For instance, given a point light’s center and radius, it is trivial to compute the list of froxels it intersects with. +

    +This technique has the added benefit of providing tighter culling than in the GPU variant. The CPU implementation can also more easily generate a packed list of lights. +

    +   

    Shading

    +

    + +The list of lights per froxel can be passed to the fragment shader either as an SSBO (OpenGL ES 3.1) or a texture. +

    +   

    From depth to froxel

    +

    + +Given a near plane \(n\), a far plane \(f\), a maximum number of depth slices \(m\) and a linear depth value \(z\) in the range [0..1], equation \(\ref{zToCluster}\) can be used to compute the index of the cluster for a given position. +

    +$$\begin{equation}\label{zToCluster} +zToCluster(z,n,f,m)=floor \left( max \left( log2(z) \frac{m}{-log2(\frac{n}{f})} + m, 0 \right) \right) +\end{equation}$$ +

    +This formula suffers however from the resolution issue mentioned previously. We can fix it by introducing \(sn\), a special near value that defines the extent of the first froxel (the first froxel occupies the range [n..sn], the remaining froxels [sn..f]). +

    +$$\begin{equation}\label{zToClusterFix} +zToCluster(z,n,sn,f,m)=floor \left( max \left( log2(z) \frac{m-1}{-log2(\frac{sn}{f})} + m, 0 \right) \right) +\end{equation}$$ +

    +Equation \(\ref{linearZ}\) can be used to compute a linear depth value from gl_FragCoord.z (assuming a standard OpenGL projection matrix). +

    +$$\begin{equation}\label{linearZ} +linearZ(z)=\frac{n}{f+z(n-f)} +\end{equation}$$ +

    +This equation can be simplified by pre-computing two terms \(c0\) and \(c1\), as shown in equation \(\ref{linearZFix}\). +

    +$$\begin{equation}\label{linearZFix} +c1 = \frac{f}{n} \\ +c0 = 1 - c1 \\ +linearZ(z)=\frac{1}{z \cdot c0 + c1} +\end{equation}$$ +

    +This simplification is important because we pass the linear z value to a log2 in \(\ref{zToClusterFix}\). Since the division becomes a negation under a logarithmic, we can avoid a division by using \(-log2(z \cdot c0 + c1)\) instead. +

    +All put together, computing the froxel index of a given fragment can be implemented fairly easily as shown in listing 44. +

     
    #define MAX_LIGHT_COUNT 16 // max number of lights per froxel
    +
    +uniform uvec4 froxels; // res x, res y, count y, count y
    +uniform vec4 zParams;  // c0, c1, index scale, index bias
    +
    +uint getDepthSlice() {
    +    return uint(max(0.0, log2(zParams.x * gl_FragCoord.z + zParams.y) *
    +            zParams.z + zParams.w));
    +}
    +
    +uint getFroxelOffset(uint depthSlice) {
    +    uvec2 froxelCoord = uvec2(gl_FragCoord.xy) / froxels.xy;
    +    froxelCoord.y = (froxels.w - 1u) - froxelCoord.y;
    +
    +    uint index = froxelCoord.x + froxelCoord.y * froxels.z +
    +            depthSlice * froxels.z * froxels.w;
    +    return index * MAX_FROXEL_LIGHT_COUNT;
    +}
    +
    +uint slice = getDepthSlice();
    +uint offset = getFroxelOffset(slice);
    +
    +// Compute lighting...
    Listing 44: GLSL implementation to compute a froxel index from a fragment's screen coordinates
    +

    + +Several uniforms must be pre-computed for perform the index evaluation efficiently. The code used to pre-compute these uniforms can be found in listing ?. +

    froxels[0] = TILE_RESOLUTION_IN_PX;
    +froxels[1] = TILE_RESOLUTION_IN_PX;
    +froxels[2] = numberOfTilesInX;
    +froxels[3] = numberOfTilesInY;
    +
    +zParams[0] = 1.0f - Z_FAR / Z_NEAR;
    +zParams[1] = Z_FAR / Z_NEAR;
    +zParams[2] = (MAX_DEPTH_SLICES - 1) / log2(Z_SPECIAL_NEAR / Z_FAR);
    +zParams[3] = MAX_DEPTH_SLICES;
    [Listing ?]
    +   

    From froxel to depth

    +

    + +Given a froxel index \(i\), a special near plane \(sn\), a far plane \(f\) and a maximum number of depth slices \(m\), equation \(\ref{clusterToZ}\) computes the minimum depth of a given froxel. +

    +$$\begin{equation}\label{clusterToZ} +clusterToZ(i \ge 1,sn,f,m)=2^{(i-m) \frac{-log2(\frac{sn}{f})}{m-1}} +\end{equation}$$ +

    +For \(i=0\), the z value is 0. The result of this equation is in the [0..1] range and should be multiplied by \(f\) to get a distance in world units. +

    +The compute shader implementation should use exp2 instead of a pow. The division can be precomputed and passed as a uniform. +

    +   

    Validation

    +

    + +Given the complexity of our lighting system, it is important to validate our implementation. We will do so in several ways: using reference renderings, light measurements and data visualization. +

    +[TODO] Explain light measurement validation (reading EV from the render target and comparing against values measure with light meters/cameras, etc.) +

    +   

    Scene referred visualization

    +

    + +A quick and easy way to validate a scene's lighting is to modify the shader to output colors that provide an intuitive mapping to relevant data. This can easily be done by using a custom debug tone-mapping operator that outputs fake colors. +

    +   

    Luminance stops

    +

    + +With emissive materials and IBLs, it is fairly easy to obtain a scene in which specular highlights are brighter than their apparent caster. This type of issue can be difficult to observe after tone-mapping and quantization but is fairly obvious in the scene-referred space. Figure 84 shows how the custom operator described in listing 45 is used to show the exposed luminance of a scene. +

    +

     
    Figure 84: Visualizing luminance by color coding the stops: cyan is middle gray, blue is 1 stop darker, green 1 stop brighter, etc.
    +

     
    vec3 Tonemap_DisplayRange(const vec3 x) {
    +    // The 5th color in the array (cyan) represents middle gray (18%)
    +    // Every stop above or below middle gray causes a color shift
    +    float v = log2(luminance(x) / 0.18);
    +    v = clamp(v + 5.0, 0.0, 15.0);
    +    int index = int(floor(v));
    +    return mix(debugColors[index], debugColors[min(15, index + 1)], fract(v));
    +}
    +
    +const vec3 debugColors[16] = vec3[](
    +     vec3(0.0, 0.0, 0.0),         // black
    +     vec3(0.0, 0.0, 0.1647),      // darkest blue
    +     vec3(0.0, 0.0, 0.3647),      // darker blue
    +     vec3(0.0, 0.0, 0.6647),      // dark blue
    +     vec3(0.0, 0.0, 0.9647),      // blue
    +     vec3(0.0, 0.9255, 0.9255),   // cyan
    +     vec3(0.0, 0.5647, 0.0),      // dark green
    +     vec3(0.0, 0.7843, 0.0),      // green
    +     vec3(1.0, 1.0, 0.0),         // yellow
    +     vec3(0.90588, 0.75294, 0.0), // yellow-orange
    +     vec3(1.0, 0.5647, 0.0),      // orange
    +     vec3(1.0, 0.0, 0.0),         // bright red
    +     vec3(0.8392, 0.0, 0.0),      // red
    +     vec3(1.0, 0.0, 1.0),         // magenta
    +     vec3(0.6, 0.3333, 0.7882),   // purple
    +     vec3(1.0, 1.0, 1.0)          // white
    +);
    Listing 45: GLSL implementation of a custom debug tone-mapping operator for luminance visualization
    +   

    Reference renderings

    +

    + +To validate our implementation against reference renderings, we will use a commercial-grade Open Source physically based offline path tracer called Mitsuba. Mitsuba offers many different integrators, samplers and material models, which should allow us to provide fair comparisons with our real-time renderer. This path tracer also relies on a simple XML scene description format that should be easy to automatically generate from our own scene descriptions. +

    +Figure 85 and figure 86 show a simple scene, a perfectly smooth dielectric sphere, rendered respectively with Mitsuba and Filament. +

    +

     
    Figure 85: Rendered in 2048×1440 in 1 minute and 42 seconds on a 12 core 2013 MacPro
    +

    +

     
    Figure 86: Rendered in 2048×1440 with MSAA 4x at 60 fps on a Nexus 9 device (Tegra K1 GPU)
    +

    +The parameters used to render both scenes are the following: +

    +Filament +

    +

      +
    • Material +
        +
      • Base color: sRGB 0.81, 0, 0 +
      • +
      • Metallic: 0 +
      • +
      • Roughness: 0 +
      • +
      • Reflectance: 0.5 +
      +
    • Indirect light: IBL +
        +
      • 256×256 cubemap generated by cmgen from office.exr +
      • +
      • Multiplier: 35,000 +
      +
    • Direct light: directional light +
        +
      • Linear color: 1.0, 0.96, 0.95 +
      • +
      • Intensity: 120,000 lux +
      +
    • Exposure +
        +
      • Aperture: f/16 +
      • +
      • Shutter speed: 1/125s +
      • +
      • ISO: 100
    +

    +Mitsuba +

    +

      +
    • BSDF: roughplastic +
        +
      • Distribution: GGX +
      • +
      • Alpha: 0 +
      • +
      • Diffuse reflectance: sRGB 0.81, 0, 0 +
      +
    • Emitter: environment map +
        +
      • Source: office.exr +
      • +
      • Scale: 35,000 +
      +
    • Emitter: directional +
        +
      • Irradiance: linear RGB 120,000 115,200 114,000 +
      +
    • Film: LDR +
        +
      • Exposure: −15.23, computed from log2(filamentExposure) +
      +
    • Integrator: path +
    • +
    • Sampler: ldsampler +
        +
      • Sample count: 256
    +

    +The full Mitsuba scene can be found as an annex. Both scenes were rendered at the same resolution (2048×1440). +

    +   

    Comparison

    +

    + +The slight differences between the two renderings come from the various approximations used by Filament: RGBM 256×256 reflection probe, RGBM 1024×1024 background map, Lambert diffuse, split-sum approximation, analytical approximation of the DFG term, etc. +

    +Figure 87 shows the luminance gradient of the images produced by both engines. The comparison was performed on LDR images. +

    +

     
    Figure 87: Luminance gradients from Mitsuba (left) and Filament (right)
    +

    +The biggest difference is visible at grazing angles, which is most likely explained by Filament's use of a Lambertian diffuse term. The Disney diffuse term and its grazing retro-reflections would move Filament closer to Mitsuba. +

    +   

    Coordinates systems

    +   

    World coordinates system

    +

    + +Filament uses a Y-up, right-handed coordinate system. +

    +

     
    Figure 88: Red +X, green +Y, blue +Z (rendered in Marmoset Toolbag).
    +

    +   

    Camera coordinates system

    +

    + +Filament's Camera looks towards its local -Z axis. That is, when placing a camera in the world +without any transform applied to it, the camera looks down the world's -Z axis. +

    +   

    Cubemaps coordinates system

    +

    + +All cubemaps used in Filament follow the OpenGL convention for face +alignment shown in figure 89. +

    +

     
    Figure 89: Horizontal cross representation of a cubemap following the OpenGL faces alignment convention.
    +

    +Note that environment background and reflection probes are mirrored (see section 8.6.3.1). +

    +   

    Mirroring

    +

    + +To simplify the rendering of reflections, IBL cubemaps are stored mirrored on the X axis. This is +the default behaviour of the cmgen tool. This means that an IBL cubemap used as environment +background needs to be mirrored again at runtime. +An easy way to achieve this for skyboxes is to use textured back faces. Filament does +this by default. +

    +   

    Equirectangular environment maps

    +

    + +To convert equirectangular environment maps to horizontal/vertical cross cubemaps we position the ++Z face in the center of the source rectilinear environment map. +

    +   

    World space orientation of environment maps and Skyboxes

    +

    + +When specifying a skybox or an IBL in Filament, the specified cubemap is oriented such that its +-Z face points towards the +Z axis of the world (this is because filament assumes mirrored cubemaps, +see section 8.6.3.1). However, because environments and skyboxes are expected to be pre-mirrored, +their -Z (back) face points towards the world's -Z axis as expected (and the camera looks toward that +direction by default, see section 8.6.2). +

    +   

    Annex

    +   

    Specular color

    +

    + +The specular color of a metallic surface, or \(\fNormal\), can be computed directly from measured spectral data. Online databases such as Refractive Index provide tables of complex IOR measured at different wavelengths for various materials. +

    +Earlier in this document, we presented equation \(\ref{fresnelEquation}\) to compute the Fresnel reflectance at normal incidence for a dielectric surface given its IOR. The same equation can be rewritten for conductors by using complex numbers to represent the surface's IOR: +

    +$$\begin{equation} +c_{ior} = n_{ior} + ik +\end{equation}$$ +

    +Equation \(\ref{fresnelComplexIOR}\) presents the resulting Fresnel formula, where \(c^*\) is the conjugate of the complex number \(c\): +

    +$$\begin{equation}\label{fresnelComplexIOR} +\fNormal(c_{ior}) = \frac{(c_{ior} - 1)(c_{ior}^* - 1)}{(c_{ior} + 1)(c_{ior}^* + 1)} +\end{equation}$$ +

    +To compute the specular color of a material we need to evaluate the complex Fresnel equation at each spectral sample of complex IOR over the visible spectrum. For each spectral sample, we obtain a spectral reflectance sample. To find the RGB color at normal incidence, we must multiply each sample by the CIE XYZ CMFs (color matching functions) and the spectral power distribution of the desired illuminant. We choose the standard illuminant D65 because we want to compute a color in the sRGB color space. +

    +We then sum (integrate) and normalize all the samples to obtain \(\fNormal\) in the XYZ color space. From there, a simple color space conversion yields a linear sRGB color or a non-linear sRGB color after applying the opto-electronic transfer function (OETF, commonly known as “gamma” curve). Note that for some materials such as gold the final sRGB color might fall out of gamut. We use a simple normalization step as a cheap form of gamut remapping but it would be interesting to consider computing values in a color space with a wider gamut (for instance BT.2020). +

    +To achieve the desired result we used the ICE 1931 2° CMFs, from 360nm to 830nm at 1nm intervals (source), and the CIE Standard Illuminant D65 relative spectral power distribution, from 300nm to 830nm, at 5nm intervals (source). +

    +Our implementation is presented in listing 46, with the actual data omitted for brevity. +

     
    // CIE 1931 2-deg color matching functions (CMFs), from 360nm to 830nm,
    +// at 1nm intervals
    +//
    +// Data source:
    +//     http://cvrl.ioo.ucl.ac.uk/cmfs.htm
    +//     http://cvrl.ioo.ucl.ac.uk/database/text/cmfs/ciexyz31.htm
    +const size_t CIE_XYZ_START = 360;
    +const size_t CIE_XYZ_COUNT = 471;
    +const float3 CIE_XYZ[CIE_XYZ_COUNT] = { ... };
    +
    +// CIE Standard Illuminant D65 relative spectral power distribution,
    +// from 300nm to 830, at 5nm intervals
    +//
    +// Data source:
    +//     https://en.wikipedia.org/wiki/Illuminant_D65
    +//     https://cielab.xyz/pdf/CIE_sel_colorimetric_tables.xls
    +const size_t CIE_D65_INTERVAL = 5;
    +const size_t CIE_D65_START = 300;
    +const size_t CIE_D65_END = 830;
    +const size_t CIE_D65_COUNT = 107;
    +const float CIE_D65[CIE_D65_COUNT] = { ... };
    +
    +struct Sample {
    +    float w = 0.0f; // wavelength
    +    std::complex<float> ior; // complex IOR, n + ik
    +};
    +
    +static float illuminantD65(float w) {
    +    auto i0 = size_t((w - CIE_D65_START) / CIE_D65_INTERVAL);
    +    uint2 indexBounds{i0, std::min(i0 + 1, CIE_D65_END)};
    +
    +    float2 wavelengthBounds = CIE_D65_START + float2{indexBounds} * CIE_D65_INTERVAL;
    +    float t = (w - wavelengthBounds.x) / (wavelengthBounds.y - wavelengthBounds.x);
    +    return lerp(CIE_D65[indexBounds.x], CIE_D65[indexBounds.y], t);
    +}
    +
    +// For std::lower_bound
    +bool operator<(const Sample& lhs, const Sample& rhs) {
    +    return lhs.w < rhs.w;
    +}
    +
    +// The wavelength w must be between 360nm and 830nm
    +static std::complex<float> findSample(const std::vector<sample>& samples, float w) {
    +    auto i1 = std::lower_bound(
    +         samples.begin(), samples.end(), Sample{w, 0.0f + 0.0if});
    +    auto i0 = i1 - 1;
    +
    +    // Interpolate the complex IORs
    +    float t = (w - i0->w) / (i1->w - i0->w);
    +    float n = lerp(i0->ior.real(), i1->ior.real(), t);
    +    float k = lerp(i0->ior.imag(), i1->ior.imag(), t);
    +    return { n, k };
    +}
    +
    +static float fresnel(const std::complex<float>& sample) {
    +    return (((sample - (1.0f + 0if)) * (std::conj(sample) - (1.0f + 0if))) /
    +            ((sample + (1.0f + 0if)) * (std::conj(sample) + (1.0f + 0if)))).real();
    +}
    +
    +static float3 XYZ_to_sRGB(const float3& v) {
    +    const mat3f XYZ_sRGB{
    +             3.2404542f, -0.9692660f,  0.0556434f,
    +            -1.5371385f,  1.8760108f, -0.2040259f,
    +            -0.4985314f,  0.0415560f,  1.0572252f
    +    };
    +    return XYZ_sRGB * v;
    +}
    +
    +// Outputs a linear sRGB color
    +static float3 computeColor(const std::vector<sample>& samples) {
    +    float3 xyz{0.0f};
    +    float y = 0.0f;
    +
    +    for (size_t i = 0; i < CIE_XYZ_COUNT; i++) {
    +        // Current wavelength
    +        float w = CIE_XYZ_START + i;
    +
    +        // Find most appropriate CIE XYZ sample for the wavelength
    +        auto sample = findSample(samples, w);
    +        // Compute Fresnel reflectance at normal incidence
    +        float f0 = fresnel(sample);
    +
    +        // We need to multiply by the spectral power distribution of the illuminant
    +        float d65 = illuminantD65(w);
    +
    +        xyz += f0 * CIE_XYZ[i] * d65;
    +        y += CIE_XYZ[i].y * d65;
    +    }
    +
    +    // Normalize so that 100% reflectance at every wavelength yields Y=1
    +    xyz /= y;
    +
    +    float3 linear = XYZ_to_sRGB(xyz);
    +
    +    // Normalize out-of-gamut values
    +    if (any(greaterThan(linear, float3{1.0f}))) linear *= 1.0f / max(linear);
    +
    +    return linear;
    +}
    Listing 46: C++ implementation to compute the base color of a metallic surface from spectral data
    +

    + +Special thanks to Naty Hoffman for his valuable help on this topic. +

    +   

    Importance sampling for the IBL

    +

    + +In the discrete domain, the integral can be approximated with sampling as defined in equation \(\ref{iblSampling}\). +

    +$$\begin{equation}\label{iblSampling} +\Lout(n,v,\Theta) \equiv \frac{1}{N} \sum_{i}^{N} f(l_{i}^{uniform},v,\Theta) L_{\perp}(l_i) \left< n \cdot l_i^{uniform} \right> +\end{equation}$$ +

    +Unfortunately, we would need too many samples to evaluate this integral. A technique commonly used +is to choose samples that are more “important” more often, this is called importance sampling. +In our case we'll use the distribution of micro-facets normals, \(D_{ggx}\), as the distribution of +important samples. +

    +The evaluation of \( \Lout(n,v,\Theta) \) with importance sampling is presented in equation \(\ref{annexIblImportanceSampling}\). +

    +$$\begin{equation}\label{annexIblImportanceSampling} +\Lout(n,v,\Theta) \equiv \frac{1}{N} \sum_{i}^{N} \frac{f(l_{i},v,\Theta)}{p(l_i,v,\Theta)} L_{\perp}(l_i) \left< n \cdot l_i \right> +\end{equation}$$ +

    +In equation \(\ref{annexIblImportanceSampling}\), \(p\) is the probability density function (PDF) of the +distribution of important direction samples \(l_i\). These samples depend on \(h_i\), \(v\) and \(\alpha\). +The definition of the PDF is shown in equation \(\ref{iblPDF}\). +

    +\(h_i\) is given by the distribution we chose, see section 9.2.1 for more details. +

    +The important direction samples \(l_i\) are calculated as the reflection of \(v\) around \(h_i\), and therefore +do not have the same PDF as \(h_i\). The PDF of a transformed distribution is given by: +

    +$$\begin{equation} +p(T_r(x)) = p(x) |J(T_r)|^{-1} +\end{equation}$$ +

    +Where \(|J(T_r)|\) is the determinant of the Jacobian of the transform. In our case we're considering +the transform from \(h_i\) to \(l_i\) and the determinant of its Jacobian is given in \ref{iblPDF}. +

    +$$\begin{equation}\label{iblPDF} +p(l,v,\Theta) = D(h,\alpha) \left< \NoH \right> |J_{h \rightarrow l}|^{-1} \\ +|J_{h \rightarrow l}| = 4 \left< \VoH \right> +\end{equation}$$ +

    +   

    Choosing important directions

    +

    + +Refer to section 9.3 for more details. Given a uniform distribution \((\zeta_{\phi},\zeta_{\theta})\) the important direction \(l\) is defined by equation \(\ref{importantDirection}\). +

    +$$\begin{equation}\label{importantDirection} +\phi = 2 \pi \zeta_{\phi} \\ +\theta = cos^{-1} \sqrt{\frac{1 - \zeta_{\theta}}{(\alpha^2 - 1)\zeta_{\theta}+1}} \\ +l = \{ cos \phi sin \theta, sin \phi sin \theta, cos \theta \} +\end{equation}$$ +

    +Typically, \( (\zeta_{\phi},\zeta_{\theta}) \) are chosen using the Hammersley uniform distribution algorithm described in section 9.4. +

    +   

    Pre-filtered importance sampling

    +

    + +Importance sampling considers only the PDF to generate important directions; in particular, it is oblivious to the actual content of the IBL. If the latter contains high frequencies in areas without a lot of samples, the integration won’t be accurate. This can be somewhat mitigated by using a technique called pre-filtered importance sampling, in addition this allows the integral to converge with many fewer samples. +

    +Pre-filtered importance sampling uses several images of the environment increasingly low-pass filtered. This is typically implemented very efficiently with mipmaps and a box filter. The LOD is selected based on the sample importance, that is, low probability samples use a higher LOD index (more filtered). +

    +This technique is described in details in [Krivanek08]. +

    +The cubemap LOD is determined in the following way: +

    +$$\begin{align*} +lod &= log_4 \left( K\frac{\Omega_s}{\Omega_p} \right) \\ +K &= 4.0 \\ +\Omega_s &= \frac{1}{N \cdot p(l_i)} \\ +\Omega_p &\approx \frac{4\pi}{6 \cdot width \cdot height} +\end{align*}$$ +

    +Where \(K\) is a constant determined empirically, \(p\) the PDF of the BRDF, \( \Omega_{s} \) the solid angle associated to the sample and \(\Omega_p\) the solid angle associated with the texel in the cubemap. +

    +Cubemap sampling is done using seamless trilinear filtering. It is extremely important to sample the cubemap correctly across faces using OpenGL's seamless sampling feature or any other technique that avoids/reduces seams. +

    +Table 17 shows a comparison between importance sampling and pre-filtered importance sampling when applied to figure 90. +

    +

     
    Figure 90: Importance sampling image reference
    +

    +

    +  + + + +
    Samples Importance sampling Pre-filtered importance sampling
    4096  
    1024
    32
    Table 17: Importance sampling vs pre-filtered importance sampling with \(\alpha = 0.4\)
    +

    +The reference renderer used in the comparison below performs no approximation. In particular, it does not assume \(v = n\) and does not perform the split sum approximation. The pre-filtered renderer uses all the techniques discussed in this section: pre-filtered cubemaps, the analytic formulation of the DFG term, and of course the split sum approximation. +

    +Left: reference renderer, right: pre-filtered importance sampling. +

    +
    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +   

    Choosing important directions for sampling the BRDF

    +

    + +For simplicity we use the \( D \) term of the BRDF as the PDF, however the PDF must be normalized such that the integral over the hemisphere is 1: +

    +$$\begin{equation} +\int_{\Omega}p(m)dm = 1 \\ +\int_{\Omega}D(m)(n \cdot m)dm = 1 \\ +\int_{\phi=0}^{2\pi}\int_{\theta=0}^{\frac{\pi}{2}}D(\theta,\phi) cos \theta sin \theta d\theta d\phi = 1 \\ +\end{equation}$$ +

    +The PDF of the BRDF can therefore be expressed as in equation \(\ref{importantPDF}\): +

    +$$\begin{equation}\label{importantPDF} +p(\theta,\phi) = \frac{\alpha^2}{\pi(cos^2\theta (\alpha^2-1) + 1)^2} cos\theta sin\theta +\end{equation}$$ +

    +The term \(sin\theta\) comes from the differential solid angle \(sin\theta d\phi d\theta\) since we integrate over a sphere. We sample \(\theta\) and \(\phi\) independently: +

    +$$\begin{align*} +p(\theta) &= \int_0^{2\pi} p(\theta,\phi) d\phi = \frac{2\alpha^2}{(cos^2\theta (\alpha^2-1) + 1)^2} cos\theta sin\theta \\ +p(\phi) &= \frac{p(\theta,\phi)}{p(\phi)} = \frac{1}{2\pi} +\end{align*}$$ +

    +The expression of \( p(\phi) \) is true for an isotropic distribution of normals. +

    +We then calculate the cumulative distribution function (CDF) for each variable: +

    +$$\begin{align*} +P(s_{\phi}) &= \int_{0}^{s_{\phi}} p(\phi) d\phi = \frac{s_{\phi}}{2\pi} \\ +P(s_{\theta}) &= \int_{0}^{s_{\theta}} p(\theta) d\theta = 2 \alpha^2 \left( \frac{1}{(2\alpha^4-4\alpha^2+2) cos(s_{\theta})^2 + 2\alpha^2 - 2} - \frac{1}{2\alpha^4-2\alpha^2} \right) +\end{align*}$$ +

    +We set \( P(s_{\phi}) \) and \( P(s_{\theta}) \) to random variables \( \zeta_{\phi} \) and \( \zeta_{\theta} \) and solve for \( s_{\phi} \) and \( s_{\theta} \) respectively: +

    +$$\begin{align*} +P(s_{\phi}) &= \zeta_{\phi} \rightarrow s_{\phi} = 2\pi\zeta_{\phi} \\ +P(s_{\theta}) &= \zeta_{\theta} \rightarrow s_{\theta} = cos^{-1} \sqrt{\frac{1-\zeta_{\theta}}{(\alpha^2-1)\zeta_{\theta}+1}} +\end{align*}$$ +

    +So given a uniform distribution \( (\zeta_{\phi},\zeta_{\theta}) \), our important direction \(l\) is defined as: +

    +$$\begin{align*} +\phi &= 2\pi\zeta_{\phi} \\ +\theta &= cos^{-1} \sqrt{\frac{1-\zeta_{\theta}}{(\alpha^2-1)\zeta_{\theta}+1}} \\ +l &= \{ cos\phi sin\theta,sin\phi sin\theta,cos\theta \} +\end{align*}$$ +

    +   

    Hammersley sequence

    +
    vec2f hammersley(uint i, float numSamples) {
    +    uint bits = i;
    +    bits = (bits << 16) | (bits >> 16);
    +    bits = ((bits & 0x55555555) << 1) | ((bits & 0xAAAAAAAA) >> 1);
    +    bits = ((bits & 0x33333333) << 2) | ((bits & 0xCCCCCCCC) >> 2);
    +    bits = ((bits & 0x0F0F0F0F) << 4) | ((bits & 0xF0F0F0F0) >> 4);
    +    bits = ((bits & 0x00FF00FF) << 8) | ((bits & 0xFF00FF00) >> 8);
    +    return vec2f(i / numSamples, bits / exp2(32));
    +}
    [C++ implementation of a Hammersley sequence generator]
    +   

    Precomputing L for image-based lighting

    +

    + +The term \( L_{DFG} \) is only dependent on \( \NoV \). Below, the normal is arbitrarily set to \( n=\left[0, 0, 1\right] \) and \(v\) is chosen to satisfy \( \NoV \). The vector \( h_i \) is the \( D_{GGX}(\alpha) \) important direction sample \(i\). +

    float GDFG(float NoV, float NoL, float a) {
    +    float a2 = a * a;
    +    float GGXL = NoV * sqrt((-NoL * a2 + NoL) * NoL + a2);
    +    float GGXV = NoL * sqrt((-NoV * a2 + NoV) * NoV + a2);
    +    return (2 * NoL) / (GGXV + GGXL);
    +}
    +
    +float2 DFG(float NoV, float a) {
    +    float3 V;
    +    V.x = sqrt(1.0f - NoV*NoV);
    +    V.y = 0.0f;
    +    V.z = NoV;
    +
    +    float2 r = 0.0f;
    +    for (uint i = 0; i < sampleCount; i++) {
    +        float2 Xi = hammersley(i, sampleCount);
    +        float3 H = importanceSampleGGX(Xi, a, N);
    +        float3 L = 2.0f * dot(V, H) * H - V;
    +
    +        float VoH = saturate(dot(V, H));
    +        float NoL = saturate(L.z);
    +        float NoH = saturate(H.z);
    +
    +        if (NoL > 0.0f) {
    +            float G = GDFG(NoV, NoL, a);
    +            float Gv = G * VoH / NoH;
    +            float Fc = pow(1 - VoH, 5.0f);
    +            r.x += Gv * (1 - Fc);
    +            r.y += Gv * Fc;
    +        }
    +    }
    +    return r * (1.0f / sampleCount);
    +}
    [C++ implementation of the \( L_{DFG} \) term]
    +   

    Spherical Harmonics

    +

    +

    +  + + + + +
    Symbol Definition
    \(K^m_l\) Normalization factors
    \(P^m_l(x)\) Associated Legendre polynomials
    \(y^m_l\) Spherical harmonics bases, or SH bases
    \(L^m_l\) SH coefficients of the \(L(s)\) function defined on the unit sphere
    Table 18: Spherical harmonics symbols definitions
    +

    +   

    Basis functions

    +

    + +Spherical parameterization of points on the surface of the unit sphere: +

    +$$\begin{equation} +\{ x, y, z \} = \{ cos \phi sin \theta, sin \phi sin \theta, cos \theta \} +\end{equation}$$ +

    +The complex spherical harmonics bases are given by: +

    +$$\begin{equation} +Y^m_l(\theta, \phi) = K^m_l e^{im\theta} P^{|m|}_l(cos \theta), l \in N, -l <= m <= l +\end{equation}$$ +

    +However we only need the real bases: +

    +$$\begin{align*} +y^{m > 0}_l &= \sqrt{2} K^m_l cos(m \phi) P^m_l(cos \theta) \\ +y^{m < 0}_l &= \sqrt{2} K^m_l sin(|m| \phi) P^{|m|}_l(cos \theta) \\ +y^0_l &= K^0_l P^0_l(cos \theta) +\end{align*}$$ +

    +The normalization factors are given by: +

    +$$\begin{equation} +K^m_l = \sqrt{\frac{(2l + 1)(l - |m|)!}{4 \pi (l + |m|)!}} +\end{equation}$$ +

    +The associated Legendre polynomials \(P^{|m|}_l\) can be calculated from the following recursions: +

    +$$\begin{equation}\label{shRecursions} +P^0_0(x) = 1 \\ +P^0_1(x) = x \\ +P^l_l(x) = (-1)^l (2l - 1)!! (1 - x^2)^{\frac{l}{2}} \\ +P^m_l(x) = \frac{((2l - 1) x P^m_{l - 1} - (l + m - 1) P^m_{l - 2})}{l - m} \\ +\end{equation}$$ +

    +Computing \(y^{|m|}_l\) requires to compute \(P^{|m|}_l(z)\) first. +This can be accomplished fairly easily using the recursions in equation \(\ref{shRecursions}\). +The third recursion can be used to “move diagonally” in table 20, i.e. calculating \(y^0_0\), \(y^1_1\), \(y^2_2\) etc. +Then, the fourth recursion can be used to move vertically. +

    +  + + + +
    Band index Basis functions \(-l <= m <= l\)
    \(l = 0\) \(y^0_0\)
    \(l = 1\) \(y^{-1}_1\) \(y^0_1\) \(y^1_1\)
    \(l = 2\) \(y^{-2}_2\) \(y^{-1}_2\) \(y^0_2\) \(y^1_2\) \(y^2_2\)
    Table 19: Basis functions per band
    +

    +It’s also fairly easy to compute the trigonometric terms recursively: +

    +$$\begin{align*} +C_m &\equiv cos(m \phi)sin(\theta)^m \\ +S_m &\equiv sin(m \phi)sin(\theta)^m \\ +\{ x, y, z \} &= \{ cos \phi sin \theta, sin \phi sin \theta, cos \theta \} +\end{align*}$$ +

    +Using the angle sum trigonometric identities: +

    +$$\begin{align*} +cos(m \phi + \phi) &= cos(m \phi) cos(\phi) - sin(m \phi) sin(\phi) \Leftrightarrow C_{m + 1} = x C_m - y S_m \\ +sin(m \phi + \phi) &= sin(m \phi) cos(\phi) + cos(m \phi) sin(\phi) \Leftrightarrow S_{m + 1} = x S_m - y C_m +\end{align*}$$ +

    +Listing 47 shows the C++ code to compute the non-normalized SH basis \(\frac{y^m_l(s)}{\sqrt{2} K^m_l}\): +

     
    static inline size_t SHindex(ssize_t m, size_t l) {
    +    return l * (l + 1) + m;
    +}
    +
    +void computeShBasis(
    +        double* const SHb,
    +        size_t numBands,
    +        const vec3& s)
    +{
    +    // handle m=0 separately, since it produces only one coefficient
    +    double Pml_2 = 0;
    +    double Pml_1 = 1;
    +    SHb[0] =  Pml_1;
    +    for (ssize_t l = 1; l < numBands; l++) {
    +        double Pml = ((2 * l - 1) * Pml_1 * s.z - (l - 1) * Pml_2) / l;
    +        Pml_2 = Pml_1;
    +        Pml_1 = Pml;
    +        SHb[SHindex(0, l)] = Pml;
    +    }
    +    double Pmm = 1;
    +    for (ssize_t m = 1; m < numBands ; m++) {
    +        Pmm = (1 - 2 * m) * Pmm;
    +        double Pml_2 = Pmm;
    +        double Pml_1 = (2 * m + 1)*Pmm*s.z;
    +        // l == m
    +        SHb[SHindex(-m, m)] = Pml_2;
    +        SHb[SHindex( m, m)] = Pml_2;
    +        if (m + 1 < numBands) {
    +            // l == m+1
    +            SHb[SHindex(-m, m + 1)] = Pml_1;
    +            SHb[SHindex( m, m + 1)] = Pml_1;
    +            for (ssize_t l = m + 2; l < numBands; l++) {
    +                double Pml = ((2 * l - 1) * Pml_1 * s.z - (l + m - 1) * Pml_2)
    +                        / (l - m);
    +                Pml_2 = Pml_1;
    +                Pml_1 = Pml;
    +                SHb[SHindex(-m, l)] = Pml;
    +                SHb[SHindex( m, l)] = Pml;
    +            }
    +        }
    +    }
    +    double Cm = s.x;
    +    double Sm = s.y;
    +    for (ssize_t m = 1; m <= numBands ; m++) {
    +        for (ssize_t l = m; l < numBands ; l++) {
    +            SHb[SHindex(-m, l)] *= Sm;
    +            SHb[SHindex( m, l)] *= Cm;
    +        }
    +        double Cm1 = Cm * s.x - Sm * s.y;
    +        double Sm1 = Sm * s.x + Cm * s.y;
    +        Cm = Cm1;
    +        Sm = Sm1;
    +    }
    +}
    Listing 47: C++ implementation to compute a non-normalized SH basis
    +

    + +Normalized SH basis functions \(y^m_l(s)\) for the first 3 bands: +

    +  + + + +
    Band \(m = -2\) \(m = -1\) \(m = 0\) \(m = 1\) \(m = 2\)
    \(l = 0\) \(\frac{1}{2}\sqrt{\frac{1}{\pi}}\)
    \(l = 1\) \(-\frac{1}{2}\sqrt{\frac{3}{\pi}}y\) \(\frac{1}{2}\sqrt{\frac{3}{\pi}}z\) \(-\frac{1}{2}\sqrt{\frac{3}{\pi}}x\)
    \(l = 2\) \(\frac{1}{2}\sqrt{\frac{15}{\pi}}xy\) \(-\frac{1}{2}\sqrt{\frac{15}{\pi}}yz\) \(\frac{1}{4}\sqrt{\frac{5}{\pi}}(2z^2 - x^2 - y^2)\) \(-\frac{1}{2}\sqrt{\frac{15}{\pi}}xz\) \(\frac{1}{4}\sqrt{\frac{15}{\pi}}(x^2 - y^2)\)
    Table 20: Normalized basis functions per band
    +

    +   

    Decomposition and reconstruction

    +

    + +A function \(L(s)\) defined on a sphere is projected to the SH basis as follows: +

    +$$\begin{equation} +L^m_l = \int_\Omega L(s) y^m_l(s) ds \\ +L^m_l = \int_{\theta = 0}^{\pi} \int_{\phi = 0}^{2\pi} L(\theta, \phi) y^m_l(\theta, \phi) sin \theta d\theta d\phi +\end{equation}$$ +

    +Note that each \(L^m_l\) is a vector of 3 values, one for each RGB color channel. +

    +The inverse transformation, or reconstruction, or rendering, from the SH coefficients is given by: +

    +$$\begin{equation} +\hat{L}(s) = \sum_l \sum_{m = -l}^l L^m_l y^m_l(s) +\end{equation}$$ +

    +   

    Decomposition of \(\left< cos \theta \right>\)

    +

    + +Since \(\left< cos \theta \right>\) does not depend on \(\phi\) (azimuthal independence), the integral simplifies to: +

    +$$\begin{align*} +C^0_l &= 2\pi \int_0^{\pi} \left< cos \theta \right> y^0_l(\theta) sin \theta d\theta \\ +C^0_l &= 2\pi K^m_l \int_0^{\frac{\pi}{2}} P^0_l(cos \theta) cos \theta sin \theta d\theta \\ +C^m_l &= 0, m != 0 +\end{align*}$$ +

    +In [Ramamoorthi01] an analytical solution to the integral is described: +

    +$$\begin{align*} +C_1 &= \sqrt{\frac{\pi}{3}} \\ +C_{odd} &= 0 \\ +C_{l, even} &= 2\pi \sqrt{\frac{2l + 1}{4\pi}} \frac{(-1)^{\frac{l}{2} - 1}}{(l + 2)(l - 1)} \frac{l!}{2^l (\frac{l!}{2})^2} +\end{align*}$$ +

    +The first few coefficients are: +

    +$$\begin{align*} +C_0 &= +0.88623 \\ +C_1 &= +1.02333 \\ +C_2 &= +0.49542 \\ +C_3 &= +0.00000 \\ +C_4 &= -0.11078 +\end{align*}$$ +

    +Very few coefficients are needed to reasonably approximate \(\left< cos \theta \right>\), as shown in figure 91. +

    +

     
    Figure 91: Approximation of \(cos \theta\) with SH coefficients
    +

    +   

    Convolution

    +

    + +Convolutions by a kernel \(h\) that has a circular symmetry can be applied directly and easily in SH space: +

    +$$\begin{equation} +(h * f)^m_l = \sqrt{\frac{4\pi}{2l + 1}} h^0_l(s) f^m_l(s) +\end{equation}$$ +

    +Conveniently, \(\sqrt{\frac{4\pi}{2l + 1}} = \frac{1}{K^0_l}\), so in practice we pre-multiply \(C_l\) by \(\frac{1}{K^0_l}\) and we get a simpler expression: +

    +$$\begin{equation} +\hat{C}_{l, even} = 2\pi \frac{(-1)^{\frac{l}{2} - 1}}{(l + 2)(l - 1)} \frac{l!}{2^l (\frac{l!}{2})^2} \\ +\hat{C}_1 = \frac{2\pi}{3} +\end{equation}$$ +

    +Here is the C++ code to compute \(\hat{C}_l\): +

    static double factorial(size_t n, size_t d = 1);
    +
    +// < cos(theta) > SH coefficients pre-multiplied by 1 / K(0,l)
    +double computeTruncatedCosSh(size_t l) {
    +    if (l == 0) {
    +        return M_PI;
    +    } else if (l == 1) {
    +        return 2 * M_PI / 3;
    +    } else if (l & 1) {
    +        return 0;
    +    }
    +    const size_t l_2 = l / 2;
    +    double A0 = ((l_2 & 1) ? 1.0 : -1.0) / ((l + 2) * (l - 1));
    +    double A1 = factorial(l, l_2) / (factorial(l_2) * (1 << l));
    +    return 2 * M_PI * A0 * A1;
    +}
    +
    +// returns n! / d!
    +double factorial(size_t n, size_t d ) {
    +   d = std::max(size_t(1), d);
    +   n = std::max(size_t(1), n);
    +   double r = 1.0;
    +   if (n == d) {
    +       // intentionally left blank
    +   } else if (n > d) {
    +       for ( ; n>d ; n--) {
    +           r *= n;
    +       }
    +   } else {
    +       for ( ; d>n ; d--) {
    +           r *= d;
    +       }
    +       r = 1.0 / r;
    +   }
    +   return r;
    +}
    +   

    Sample validation scene for Mitsuba

    +
    <scene version="0.5.0">
    +    <integrator type="path"/>
    +
    +    <shape type="serialized" id="sphere_mesh">
    +        <string name="filename" value="plastic_sphere.serialized"/>
    +        <integer name="shapeIndex" value="0"/>
    +
    +        <bsdf type="roughplastic">
    +            <string name="distribution" value="ggx"/>
    +            <float name="alpha" value="0.0"/>
    +            <srgb name="diffuseReflectance" value="0.81, 0.0, 0.0"/>
    +        </bsdf>
    +    </shape>
    +
    +    <emitter type="envmap">
    +        <string name="filename" value="../../environments/office/office.exr"/>
    +        <float name="scale" value="35000.0" />
    +        <boolean name="cache" value="false" />
    +    </emitter>
    +
    +    <emitter type="directional">
    +        <vector name="direction" x="-1" y="-1" z="1" />
    +        <rgb name="irradiance" value="120000.0, 115200.0, 114000.0" />
    +    </emitter>
    +
    +    <sensor type="perspective">
    +        <float name="farClip" value="12.0"/>
    +        <float name="focusDistance" value="4.1"/>
    +        <float name="fov" value="45"/>
    +        <string name="fovAxis" value="y"/>
    +        <float name="nearClip" value="0.01"/>
    +        <transform name="toWorld">
    +
    +            <lookat target="0, 0, 0" origin="0, 0, -3.1" up="0, 1, 0"/>
    +        </transform>
    +
    +        <sampler type="ldsampler">
    +            <integer name="sampleCount" value="256"/>
    +        </sampler>
    +
    +        <film type="ldrfilm">
    +            <integer name="height" value="1440"/>
    +            <integer name="width" value="2048"/>
    +            <float name="exposure" value="-15.23" />
    +            <rfilter type="gaussian"/>
    +        </film>
    +    </sensor>
    +</scene>
    +   

    Light assignment with froxels

    +

    + +Assigning lights to froxels can be implemented on the GPU using two compute shaders. The first one, shown in listing 48, creates the froxels data (4 planes + a min Z and max Z per froxel) in an SSBO and needs to be run only once. The shader requires the following uniforms: +

    +

    Projection matrix

    The projection matrix used to render the scene (view space to clip space transformation). +

    Inverse projection matrix

    The inverse of the projection matrix used to render the scene (clip space to view space transformation). +

    Depth parameters

    \(-log2(\frac{z_{lighnear}}{z_{far}}) \frac{1}{maxSlices-1}\), maximum number of depth slices, Z near and Z far. +

    Clip space size

    \(\frac{F_x \times F_r}{w} \times 2\), with \(F_x\) the number of tiles on the X axis, \(F_r\) the resolution in pixels of a tile and w the width in pixels of the render target. +

     
    #version 310 es
    +
    +precision highp float;
    +precision highp int;
    +
    +
    +#define FROXEL_RESOLUTION 80u
    +
    +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
    +
    +layout(location = 0) uniform mat4 projectionMatrix;
    +layout(location = 1) uniform mat4 projectionInverseMatrix;
    +layout(location = 2) uniform vec4 depthParams; // index scale, index bias, near, far
    +layout(location = 3) uniform float clipSpaceSize;
    +
    +struct Froxel {
    +    // NOTE: the planes should be stored in vec4[4] but the
    +    // Adreno shader compiler has a bug that causes the data
    +    // to not be read properly inside the loop
    +    vec4 plane0;
    +    vec4 plane1;
    +    vec4 plane2;
    +    vec4 plane3;
    +    vec2 minMaxZ;
    +};
    +
    +layout(binding = 0, std140) writeonly restrict buffer FroxelBuffer {
    +    Froxel data[];
    +} froxels;
    +
    +shared vec4 corners[4];
    +shared vec2 minMaxZ;
    +
    +vec4 projectionToView(vec4 p) {
    +    p = projectionInverseMatrix * p;
    +    return p / p.w;
    +}
    +
    +vec4 createPlane(vec4 b, vec4 c) {
    +    // standard plane equation, with a at (0, 0, 0)
    +    return vec4(normalize(cross(c.xyz, b.xyz)), 1.0);
    +}
    +
    +void main() {
    +    uint index = gl_WorkGroupID.x + gl_WorkGroupID.y * gl_NumWorkGroups.x +
    +            gl_WorkGroupID.z * gl_NumWorkGroups.x * gl_NumWorkGroups.y;
    +
    +    if (gl_LocalInvocationIndex == 0u) {
    +        // first tile the screen and build the frustum for the current tile
    +        vec2 renderTargetSize = vec2(FROXEL_RESOLUTION * gl_NumWorkGroups.xy);
    +        vec2 frustumMin = vec2(FROXEL_RESOLUTION * gl_WorkGroupID.xy);
    +        vec2 frustumMax = vec2(FROXEL_RESOLUTION * (gl_WorkGroupID.xy + 1u));
    +
    +        corners[0] = vec4(
    +            frustumMin.x / renderTargetSize.x * clipSpaceSize - 1.0,
    +            (renderTargetSize.y - frustumMin.y) / renderTargetSize.y
    +       * clipSpaceSize - 1.0,
    +            1.0,
    +            1.0
    +        );
    +        corners[1] = vec4(
    +            frustumMax.x / renderTargetSize.x * clipSpaceSize - 1.0,
    +            (renderTargetSize.y - frustumMin.y) / renderTargetSize.y
    +       * clipSpaceSize - 1.0,
    +            1.0,
    +            1.0
    +        );
    +        corners[2] = vec4(
    +            frustumMax.x / renderTargetSize.x * clipSpaceSize - 1.0,
    +            (renderTargetSize.y - frustumMax.y) / renderTargetSize.y
    +       * clipSpaceSize - 1.0,
    +            1.0,
    +            1.0
    +        );
    +        corners[3] = vec4(
    +            frustumMin.x / renderTargetSize.x * clipSpaceSize - 1.0,
    +            (renderTargetSize.y - frustumMax.y) / renderTargetSize.y
    +       * clipSpaceSize - 1.0,
    +            1.0,
    +            1.0
    +        );
    +
    +        uint froxelSlice = gl_WorkGroupID.z;
    +        minMaxZ = vec2(0.0, 0.0);
    +        if (froxelSlice > 0u) {
    +            minMaxZ.x = exp2((float(froxelSlice) - depthParams.y) * depthParams.x)
    +                    * depthParams.w;
    +        }
    +        minMaxZ.y = exp2((float(froxelSlice + 1u) - depthParams.y) * depthParams.x)
    +                * depthParams.w;
    +    }
    +
    +    if (gl_LocalInvocationIndex == 0u) {
    +        vec4 frustum[4];
    +        frustum[0] = projectionToView(corners[0]);
    +        frustum[1] = projectionToView(corners[1]);
    +        frustum[2] = projectionToView(corners[2]);
    +        frustum[3] = projectionToView(corners[3]);
    +
    +        froxels.data[index].plane0 = createPlane(frustum[0], frustum[1]);
    +        froxels.data[index].plane1 = createPlane(frustum[1], frustum[2]);
    +        froxels.data[index].plane2 = createPlane(frustum[2], frustum[3]);
    +        froxels.data[index].plane3 = createPlane(frustum[3], frustum[0]);
    +        froxels.data[index].minMaxZ = minMaxZ;
    +    }
    +}
    Listing 48: GLSL implementation of froxels data generation (compute shader)
    +

    + +The second compute shader, shown in listing 49, runs every frame (if the camera and/or lights have changed) and assigns all the lights to their respective froxels. This shader relies only on a couple of uniforms (the number of point/spot lights and the view matrix) and four SSBOs: +

    +

    Light index buffer

    For each froxel, the index of each light that affects said froxel. The indices for point lights are written first and if there is enough space left, the indices for spot lights are written as well. A sentinel of value 0×7fffffffu separates point and spot lights and/or marks the end of the froxel's list of lights. Each froxel has a maximum number of lights (point + spot). +

    Point lights buffer

    Array of structures describing the scene's point lights. +

    Spot lights buffer

    Array of structures describing the scene's spot lights. +

    Froxels buffer

    The list of froxels represented by planes, created by the previous compute shader. +

     
    #version 310 es
    +precision highp float;
    +precision highp int;
    +
    +#define LIGHT_BUFFER_SENTINEL 0x7fffffffu
    +#define MAX_FROXEL_LIGHT_COUNT 32u
    +
    +#define THREADS_PER_FROXEL_X 8u
    +#define THREADS_PER_FROXEL_Y 8u
    +#define THREADS_PER_FROXEL_Z 1u
    +#define THREADS_PER_FROXEL (THREADS_PER_FROXEL_X * \
    +        THREADS_PER_FROXEL_Y * THREADS_PER_FROXEL_Z)
    +
    +layout(local_size_x = THREADS_PER_FROXEL_X,
    +       local_size_y = THREADS_PER_FROXEL_Y,
    +       local_size_z = THREADS_PER_FROXEL_Z) in;
    +
    +// x = point lights, y = spot lights
    +layout(location = 0) uniform uvec2 totalLightCount;
    +layout(location = 1) uniform mat4 viewMatrix;
    +
    +layout(binding = 0, packed) writeonly restrict buffer LightIndexBuffer {
    +    uint index[];
    +} lightIndexBuffer;
    +
    +struct PointLight {
    +    vec4 positionFalloff; // x, y, z, falloff
    +    vec4 colorIntensity;  // r, g, b, intensity
    +    vec4 directionIES;    // dir x, dir y, dir z, IES profile index
    +};
    +
    +layout(binding = 1, std140) readonly restrict buffer PointLightBuffer {
    +    PointLight lights[];
    +} pointLights;
    +
    +struct SpotLight {
    +    vec4 positionFalloff; // x, y, z, falloff
    +    vec4 colorIntensity;  // r, g, b, intensity
    +    vec4 directionIES;    // dir x, dir y, dir z, IES profile index
    +    vec4 angle;           // angle scale, angle offset, unused, unused
    +};
    +
    +layout(binding = 2, std140) readonly restrict buffer SpotLightBuffer {
    +    SpotLight lights[];
    +} spotLights;
    +
    +struct Froxel {
    +    // NOTE: the planes should be stored in vec4[4] but the
    +    // Adreno shader compiler has a bug that causes the data
    +    // to not be read properly inside the loop
    +    vec4 plane0;
    +    vec4 plane1;
    +    vec4 plane2;
    +    vec4 plane3;
    +    vec2 minMaxZ;
    +};
    +
    +layout(binding = 3, std140) readonly restrict buffer FroxelBuffer {
    +    Froxel data[];
    +} froxels;
    +
    +shared uint groupLightCounter;
    +shared uint groupLightIndexBuffer[MAX_FROXEL_LIGHT_COUNT];
    +
    +float signedDistanceFromPlane(vec4 p, vec4 plane) {
    +    // plane.w == 0.0, simplify computation
    +    return dot(plane.xyz, p.xyz);
    +}
    +
    +void synchronize() {
    +    memoryBarrierShared();
    +    barrier();
    +}
    +
    +void main() {
    +    if (gl_LocalInvocationIndex == 0u) {
    +        groupLightCounter = 0u;
    +    }
    +    memoryBarrierShared();
    +
    +    uint froxelIndex = gl_WorkGroupID.x + gl_WorkGroupID.y * gl_NumWorkGroups.x +
    +            gl_WorkGroupID.z * gl_NumWorkGroups.x * gl_NumWorkGroups.y;
    +    Froxel current = froxels.data[froxelIndex];
    +
    +    uint offset = gl_LocalInvocationID.x +
    +         gl_LocalInvocationID.y * THREADS_PER_FROXEL_X;
    +    for (uint i = 0u; i < totalLightCount.x &&
    +      groupLightCounter < MAX_FROXEL_LIGHT_COUNT &&
    +            offset + i < totalLightCount.x; i += THREADS_PER_FROXEL) {
    +
    +        uint currentLight = offset + i;
    +
    +        vec4 center = pointLights.lights[currentLight].positionFalloff;
    +        center.xyz = (viewMatrix * vec4(center.xyz, 1.0)).xyz;
    +        float r = inversesqrt(center.w);
    +
    +        if (-center.z + r > current.minMaxZ.x &&
    +                -center.z - r <= current.minMaxZ.y) {
    +            if (signedDistanceFromPlane(center, current.plane0) < r &&
    +                signedDistanceFromPlane(center, current.plane1) < r &&
    +                signedDistanceFromPlane(center, current.plane2) < r &&
    +                signedDistanceFromPlane(center, current.plane3) < r) {
    +
    +                uint index = atomicAdd(groupLightCounter, 1u);
    +                groupLightIndexBuffer[index] = currentLight;
    +            }
    +        }
    +    }
    +
    +    synchronize();
    +
    +    uint pointLightCount = groupLightCounter;
    +    offset = froxelIndex * MAX_FROXEL_LIGHT_COUNT;
    +
    +    for (uint i = gl_LocalInvocationIndex; i < pointLightCount;
    +            i += THREADS_PER_FROXEL) {
    +        lightIndexBuffer.index[offset + i] = groupLightIndexBuffer[i];
    +    }
    +
    +    if (gl_LocalInvocationIndex == 0u) {
    +        if (pointLightCount < MAX_FROXEL_LIGHT_COUNT) {
    +            lightIndexBuffer.index[offset + pointLightCount] = LIGHT_BUFFER_SENTINEL;
    +        }
    +    }
    +}
    Listing 49: GLSL implementation of assigning lights to froxels (compute shader)
    +   

    Revisions

    +

    + +
     Friday
    3 August 2018
    First public version
    +

    +

     Tuesday
    7 August 2018
    Cloth model
    +

    +

      +
    • Added description of the “Charlie” NDF
    +

    +

     Thursday
    9 August 2018
    Lighting
    +

    +

      +
    • Added explanation about pre-exposed lights
    +

    +

     Wednesday
    15 August 2018
    Fresnel
    +

    +

      +
    • Added a description of the Fresnel effect in section 4.4.3
    +

    +

     Friday
    17 August 2018
    Specular color
    +

    +

      +
    • Added section 9.1 to explain how the base color of various metals is computed
    +

    +

     Tuesday
    21 August 2018
    Multiscattering
    +

    +

      +
    • Added section 4.7.2 on how to compensate for energy loss in single scattering BRDFs
    +

    +

     Wednesday
    20 February 2019
    Cloth shading
    +

    +

      +
    • Removed Fresnel term from the cloth BRDF +
    • +
    • Removed cloth DFG approximations, replaced with a new channel in the DFG LUT
    +

    +

    +

    +   

    Bibliography

    +

    +

    [ Ashdown98] Ian Ashdown. 1998. Parsing the IESNA LM-63 photometric data file. http://lumen.iee.put.poznan.pl/kw/iesna.txt +
    [ Ashikhmin00] Michael Ashikhmin, Simon Premoze and Peter Shirley. A Microfacet-based BRDF Generator. SIGGRAPH '00 Proceedings, 65-74. +
    [ Ashikhmin07] Michael Ashikhmin and Simon Premoze. 2007. Distribution-based BRDFs. +
    [ Burley12] Brent Burley. 2012. Physically Based Shading at Disney. Physically Based Shading in Film and Game Production, ACM SIGGRAPH 2012 Courses. +
    [ Estevez17] Alejandro Conty Estevez and Christopher Kulla. 2017. Production Friendly Microfacet Sheen BRDF. ACM SIGGRAPH 2017. +
    [ Hammon17] Earl Hammon. 217. PBR Diffuse Lighting for GGX+Smith Microsurfaces. GDC 2017. +
    [ Heitz14] Eric Heitz. 2014. Understanding the Masking-Shadowing Function +in Microfacet-Based BRDFs. Journal of Computer Graphics Techniques, 3 (2). +
    [ Heitz16] Eric Heitz et al. 2016. Multiple-Scattering Microfacet BSDFs with the Smith Model. ACM SIGGRAPH 2016. +
    [ Hill12] Colin Barré-Brisebois and Stephen Hill. 2012. Blending in Detail. http://blog.selfshadow.com/publications/blending-in-detail/ +
    [ Karis13a] Brian Karis. 2013. Specular BRDF Reference. http://graphicrants.blogspot.com/2013/08/specular-brdf-reference.html +
    [ Karis13b] Brian Karis, 2013. Real Shading in Unreal Engine 4. https://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf +
    [ Karis14] Brian Karis. 2014. Physically Based Shading on Mobile. https://www.unrealengine.com/blog/physically-based-shading-on-mobile +
    [ Kelemen01] Csaba Kelemen et al. 2001. A Microfacet Based Coupled Specular-Matte BRDF Model with Importance Sampling. Eurographics Short Presentations. +
    [ Krystek85] M. Krystek. 1985. An algorithm to calculate correlated color temperature. Color Research & Application, 10 (1), 38–40. +
    [ Krivanek08] Jaroslave Krivànek and Mark Colbert. 2008. Real-time Shading with Filtered Importance Sampling. Eurographics Symposium on Rendering 2008, Volume 27, Number 4. +
    [ Kulla17] Christopher Kulla and Alejandro Conty. 2017. Revisiting Physically Based Shading at Imageworks. ACM SIGGRAPH 2017 +
    [ Lagarde14] Sébastien Lagarde and Charles de Rousiers. 2014. Moving Frostbite to PBR. Physically Based Shading in Theory and Practice, ACM SIGGRAPH 2014 Courses. +
    [ Lagarde18] Sébastien Lagarde and Evgenii Golubev. 2018. The road toward unified rendering with Unity’s high definition rendering pipeline. Advances in Real-Time Rendering in Games, ACM SIGGRAPH 2018 Courses. +
    [ Lazarov13] Dimitar Lazarov. 2013. Physically-Based Shading in Call of Duty: Black Ops. Physically Based Shading in Theory and Practice, ACM SIGGRAPH 2013 Courses. +
    [ McAuley15] Stephen McAuley. 2015. Rendering the World of Far Cry 4. GDC 2015. +
    [ McGuire10] Morgan McGuire. 2010. Ambient Occlusion Volumes. High Performance Graphics. +
    [ Narkowicz14] Krzysztof Narkowicz. 2014. Analytical DFG Term for IBL. https://knarkowicz.wordpress.com/2014/12/27/analytical-dfg-term-for-ibl +
    [ Neubelt13] David Neubelt and Matt Pettineo. 2013. Crafting a Next-Gen Material Pipeline for The Order: 1886. Physically Based Shading in Theory and Practice, ACM SIGGRAPH 2013 Courses. +
    [ Oren94] Michael Oren and Shree K. Nayar. 1994. Generalization of lambert's reflectance model. SIGGRAPH, 239–246. ACM. +
    [ Pattanaik00] Sumanta Pattanaik00 et al. 2000. Time-Dependent Visual Adaptation +For Fast Realistic Image Display. SIGGRAPH '00 Proceedings of the 27th annual conference on Computer graphics and interactive techniques, 47-54. +
    [ Ramamoorthi01] Ravi Ramamoorthi and Pat Hanrahan. 2001. On the relationship between radiance and irradiance: determining the illumination from images of a convex Lambertian object. Journal of the Optical Society of America, Volume 18, Number 10, October 2001. +
    [ Revie12] Donald Revie. 2012. Implementing Fur in Deferred Shading. GPU Pro 2, Chapter 2. +
    [ Russell15] Jeff Russell. 2015. Horizon Occlusion for Normal Mapped Reflections. http://marmosetco.tumblr.com/post/81245981087 +
    [ Schlick94] Christophe Schlick. 1994. An Inexpensive BRDF Model for Physically-Based Rendering. Computer Graphics Forum, 13 (3), 233–246. +
    [ Walter07] Bruce Walter et al. 2007. Microfacet Models for Refraction through Rough Surfaces. Proceedings of the Eurographics Symposium on Rendering. +
    +

    formatted by Markdeep 1.18  
    \ No newline at end of file diff --git a/docs_src/src/main/materials.md b/docs_src/src/main/materials.md new file mode 100644 index 00000000000..fd09d3438b2 --- /dev/null +++ b/docs_src/src/main/materials.md @@ -0,0 +1,2471 @@ + + +$$\newcommand{\n}{\hat{n}}\newcommand{\thetai}{\theta_\mathrm{i}}\newcommand{\thetao}{\theta_\mathrm{o}}\newcommand{\d}[1]{\mathrm{d}#1}\newcommand{\w}{\hat{\omega}}\newcommand{\wi}{\w_\mathrm{i}}\newcommand{\wo}{\w_\mathrm{o}}\newcommand{\wh}{\w_\mathrm{h}}\newcommand{\Li}{L_\mathrm{i}}\newcommand{\Lo}{L_\mathrm{o}}\newcommand{\Le}{L_\mathrm{e}}\newcommand{\Lr}{L_\mathrm{r}}\newcommand{\Lt}{L_\mathrm{t}}\newcommand{\O}{\mathrm{O}}\newcommand{\degrees}{{^{\large\circ}}}\newcommand{\T}{\mathsf{T}}\newcommand{\mathset}[1]{\mathbb{#1}}\newcommand{\Real}{\mathset{R}}\newcommand{\Integer}{\mathset{Z}}\newcommand{\Boolean}{\mathset{B}}\newcommand{\Complex}{\mathset{C}}\newcommand{\un}[1]{\,\mathrm{#1}}$$ + +

    Filament Materials Guide

    Filament Materials Guide
    +
    +

    +

    +

    +
    Contents

    (Top)
    +About
    +  1.1  Authors
    +Overview
    +  2.1  Core concepts
    +Material models
    +  3.1  Lit model
    +    3.1.1  Base color
    +    3.1.2  Metallic
    +    3.1.3  Roughness
    +    3.1.4  Non-metals
    +    3.1.5  Metals
    +    3.1.6  Refraction
    +    3.1.7  Reflectance
    +    3.1.8  Sheen color
    +    3.1.9  Sheen roughness
    +    3.1.10  Clear coat
    +    3.1.11  Clear coat roughness
    +    3.1.12  Anisotropy
    +    3.1.13  Anisotropy direction
    +    3.1.14  Ambient occlusion
    +    3.1.15  Normal
    +    3.1.16  Bent normal
    +    3.1.17  Clear coat normal
    +    3.1.18  Emissive
    +    3.1.19  Post-lighting color
    +    3.1.20  Index of refraction
    +    3.1.21  Transmission
    +    3.1.22  Absorption
    +    3.1.23  Micro-thickness and thickness
    +  3.2  Subsurface model
    +    3.2.1  Thickness
    +    3.2.2  Subsurface color
    +    3.2.3  Subsurface power
    +  3.3  Cloth model
    +    3.3.1  Sheen color
    +    3.3.2  Subsurface color
    +  3.4  Unlit model
    +  3.5  Specular glossiness
    +Material definitions
    +  4.1  Format
    +    4.1.1  Differences with JSON
    +    4.1.2  Example
    +  4.2  Material block
    +    4.2.1  General: name
    +    4.2.2  General: featureLevel
    +    4.2.3  General: shadingModel
    +    4.2.4  General: parameters
    +    4.2.5  General: constants
    +    4.2.6  General: variantFilter
    +    4.2.7  General: flipUV
    +    4.2.8  General: quality
    +    4.2.9  General: instanced
    +    4.2.10  General: vertexDomainDeviceJittered
    +    4.2.11  Vertex and attributes: requires
    +    4.2.12  Vertex and attributes: variables
    +    4.2.13  Vertex and attributes: vertexDomain
    +    4.2.14  Vertex and attributes: interpolation
    +    4.2.15  Blending and transparency: blending
    +    4.2.16  Blending and transparency: blendFunction
    +    4.2.17  Blending and transparency: postLightingBlending
    +    4.2.18  Blending and transparency: transparency
    +    4.2.19  Blending and transparency: maskThreshold
    +    4.2.20  Blending and transparency: refractionMode
    +    4.2.21  Blending and transparency: refractionType
    +    4.2.22  Rasterization: culling
    +    4.2.23  Rasterization: colorWrite
    +    4.2.24  Rasterization: depthWrite
    +    4.2.25  Rasterization: depthCulling
    +    4.2.26  Rasterization: doubleSided
    +    4.2.27  Rasterization: alphaToCoverage
    +    4.2.28  Lighting: reflections
    +    4.2.29  Lighting: shadowMultiplier
    +    4.2.30  Lighting: transparentShadow
    +    4.2.31  Lighting: clearCoatIorChange
    +    4.2.32  Lighting: multiBounceAmbientOcclusion
    +    4.2.33  Lighting: specularAmbientOcclusion
    +    4.2.34  Anti-aliasing: specularAntiAliasing
    +    4.2.35  Anti-aliasing: specularAntiAliasingVariance
    +    4.2.36  Anti-aliasing: specularAntiAliasingThreshold
    +    4.2.37  Shading: customSurfaceShading
    +  4.3  Vertex block
    +    4.3.1  Material vertex inputs
    +    4.3.2  Custom vertex attributes
    +  4.4  Fragment block
    +    4.4.1  prepareMaterial function
    +    4.4.2  Material fragment inputs
    +    4.4.3  Custom surface shading
    +  4.5  Shader public APIs
    +    4.5.1  Types
    +    4.5.2  Math
    +    4.5.3  Matrices
    +    4.5.4  Frame constants
    +    4.5.5  Material globals
    +    4.5.6  Vertex only
    +    4.5.7  Fragment only
    +Compiling materials
    +  5.1  Shader validation
    +  5.2  Flags
    +    5.2.1  —platform
    +    5.2.2  —api
    +    5.2.3  —optimize-size
    +    5.2.4  —reflect
    +    5.2.5  —variant-filter
    +Handling colors
    +  6.1  Linear colors
    +  6.2  Pre-multiplied alpha
    +Sampler usage in Materials
    +  7.1  Feature level 1 and 2
    +  7.2  Feature level 3
    +

       

    About

    +

    + +This document is part of the Filament project. To report errors in this document please use the project's issue tracker. +

    +   

    Authors

    +

    + +

    +

    +   

    Overview

    +

    + +Filament is a physically based rendering (PBR) engine for Android. Filament offers a customizable +material system that you can use to create both simple and complex materials. This document +describes all the features available to materials and how to create your own material. +

    +   

    Core concepts

    +

    + +

    Material

    A material defines the visual appearance of a surface. To completely describe and render a + surface, a material provides the following information: +

    +

      +
    • Material model +
    • +
    • Set of use-controllable named parameters +
    • +
    • Raster state (blending mode, backface culling, etc.) +
    • +
    • Vertex shader code +
    • +
    • Fragment shader code
    +

    Material model

    Also called shading model or lighting model, the material model defines the intrinsic + properties of a surface. These properties have a direct influence on the way lighting is + computed and therefore on the appearance of a surface. +

    Material definition

    A text file that describes all the information required by a material. This is the file that you + will directly author to create new materials. +

    Material package

    At runtime, materials are loaded from material packages compiled from material definitions + using the matc tool. A material package contains all the information required to describe a + material, and shaders generated for the target runtime platforms. This is necessary because + different platforms (Android, macOS, Linux, etc.) use different graphics APIs or different + variants of similar graphics APIs (OpenGL vs OpenGL ES for instance). +

    Material instance

    A material instance is a reference to a material and a set of values for the different values of + that material. Material instances are not covered in this document as they are created and + manipulated directly from code using Filament's APIs. +

    +   

    Material models

    +

    + +Filament materials can use one of the following material models: +

    +

      +
    • Lit (or standard) +
    • +
    • Subsurface +
    • +
    • Cloth +
    • +
    • Unlit +
    • +
    • Specular glossiness (legacy)
    +

    +   

    Lit model

    +

    + +The lit model is Filament's standard material model. This physically-based shading model was +designed after to offer good interoperability with other common tools and engines such as Unity 5, +Unreal Engine 4, Substance Designer or Marmoset Toolbag. +

    +This material model can be used to describe many non-metallic surfaces (dielectrics) +or metallic surfaces (conductors). +

    +The appearance of a material using the standard model is controlled using the properties described +in table 1. +

    +

    +  + + + + + + + + + + + + + + + + + + + + + +
    Property Definition
    baseColor Diffuse albedo for non-metallic surfaces, and specular color for metallic surfaces
    metallic Whether a surface appears to be dielectric (0.0) or conductor (1.0). Often used as a binary value (0 or 1)
    roughness Perceived smoothness (1.0) or roughness (0.0) of a surface. Smooth surfaces exhibit sharp reflections
    reflectance Fresnel reflectance at normal incidence for dielectric surfaces. This directly controls the strength of the reflections
    sheenColor Strength of the sheen layer
    sheenRoughness Perceived smoothness or roughness of the sheen layer
    clearCoat Strength of the clear coat layer
    clearCoatRoughness Perceived smoothness or roughness of the clear coat layer
    anisotropy Amount of anisotropy in either the tangent or bitangent direction
    anisotropyDirection Local surface direction in tangent space
    ambientOcclusion Defines how much of the ambient light is accessible to a surface point. It is a per-pixel shadowing factor between 0.0 and 1.0
    normal A detail normal used to perturb the surface using bump mapping (normal mapping)
    bentNormal A normal pointing in the average unoccluded direction. Can be used to improve indirect lighting quality
    clearCoatNormal A detail normal used to perturb the clear coat layer using bump mapping (normal mapping)
    emissive Additional diffuse albedo to simulate emissive surfaces (such as neons, etc.) This property is mostly useful in an HDR pipeline with a bloom pass
    postLightingColor Additional color that can be blended with the result of the lighting computations. See postLightingBlending
    ior Index of refraction, either for refractive objects or as an alternative to reflectance
    transmission Defines how much of the diffuse light of a dielectric is transmitted through the object, in other words this defines how transparent an object is
    absorption Absorption factor for refractive objects
    microThickness Thickness of the thin layer of refractive objects
    thickness Thickness of the solid volume of refractive objects
    Table 1: Properties of the standard model
    +

    +The type and range of each property is described in table 2. +

    +  + + + + + + + + + + + + + + + + + + + + + +
    Property Type Range Note
    baseColor float4 [0..1] Pre-multiplied linear RGB
    metallic float [0..1] Should be 0 or 1
    roughness float [0..1]  
    reflectance float [0..1] Prefer values > 0.35
    sheenColor float3 [0..1] Linear RGB
    sheenRoughness float [0..1]  
    clearCoat float [0..1] Should be 0 or 1
    clearCoatRoughness float [0..1]  
    anisotropy float [−1..1] Anisotropy is in the tangent direction when this value is positive
    anisotropyDirection float3 [0..1] Linear RGB, encodes a direction vector in tangent space
    ambientOcclusion float [0..1]  
    normal float3 [0..1] Linear RGB, encodes a direction vector in tangent space
    bentNormal float3 [0..1] Linear RGB, encodes a direction vector in tangent space
    clearCoatNormal float3 [0..1] Linear RGB, encodes a direction vector in tangent space
    emissive float4 rgb=[0..n], a=[0..1] Linear RGB intensity in nits, alpha encodes the exposure weight
    postLightingColor float4 [0..1] Pre-multiplied linear RGB
    ior float [1..n] Optional, usually deduced from the reflectance
    transmission float [0..1]  
    absorption float3 [0..n]  
    microThickness float [0..n]  
    thickness float [0..n]  
    Table 2: Range and type of the standard model's properties
    +

    +

    About linear RGB
    +

    + Several material model properties expect RGB colors. Filament materials use RGB colors in linear + space and you must take proper care of supplying colors in that space. See the Linear colors section for more information.

    +

    +

    About pre-multiplied RGB
    +

    + Filament materials expect colors to use pre-multiplied alpha. See the Pre-multiplied alpha section for more information.

    +

    +

    About absorption
    +

    + The light attenuation through the material is defined as \(e^{-absorption \cdot distance}\), + and the distance depends on the thickness parameter. If thickness is not provided, then + the absorption parameter is used directly and the light attenuation through the material + becomes \(1 - absorption\). To obtain a certain color at a desired distance, the above + equation can be inverted such as \(absorption = -\frac{ln(color)}{distance}\).

    +

    +

    About ior and reflectance
    +

    + The index of refraction (IOR) and the reflectance represent the same physical attribute, + therefore they don't need to be both specified. Typically, only the reflectance is specified, + and the IOR is deduced automatically. When only the IOR is specified, the reflectance is then + deduced automatically. It is possible to specify both, in which case their values are kept + as-is, which can lead to physically impossible materials, however, this might be desirable + for artistic reasons.

    +

    +

    About thickness and microThickness for refraction
    +

    + thickness represents the thickness of solid objects in the direction of the normal, for + satisfactory results, this should be provided per fragment (e.g.: as a texture) or at least per + vertex. microThickness represent the thickness of the thin layer of an object, and can + generally be provided as a constant value. For example, a 1mm thin hollow sphere of radius 1m, + would have a thickness of 1 and a microThickness of 0.001. Currently thickness is not + used when refractionType is set to thin.

    +

    +   

    Base color

    +

    + +The baseColor property defines the perceived color of an object (sometimes called albedo). The +effect of baseColor depends on the nature of the surface, controlled by the metallic property +explained in the Metallic section. +

    +

    Non-metals (dielectrics)

    Defines the diffuse color of the surface. Real-world values are typically found in the range + \([10..240]\) if the value is encoded between 0 and 255, or in the range \([0.04..0.94]\) between 0 + and 1. Several examples of base colors for non-metallic surfaces can be found in + table 3. +

    +  + + + + + + + + +
    Metal sRGB Hexadecimal Color
    Coal 0.19, 0.19, 0.19 #323232
     
    Rubber 0.21, 0.21, 0.21 #353535
     
    Mud 0.33, 0.24, 0.19 #553d31
     
    Wood 0.53, 0.36, 0.24 #875c3c
     
    Vegetation 0.48, 0.51, 0.31 #7b824e
     
    Brick 0.58, 0.49, 0.46 #947d75
     
    Sand 0.69, 0.66, 0.52 #b1a884
     
    Concrete 0.75, 0.75, 0.73 #c0bfbb
     
    Table 3: baseColor for common non-metals
    +

    +

    Metals (conductors)

    Defines the specular color of the surface. Real-world values are typically found in the range + \([170..255]\) if the value is encoded between 0 and 255, or in the range \([0.66..1.0]\) between 0 and + 1. Several examples of base colors for metallic surfaces can be found in table 4. +

    +  + + + + + + + + +
    Metal sRGB Hexadecimal Color
    Silver 0.97, 0.96, 0.91 #f7f4e8
     
    Aluminum 0.91, 0.92, 0.92 #e8eaea
     
    Titanium 0.76, 0.73, 0.69 #c1baaf
     
    Iron 0.77, 0.78, 0.78 #c4c6c6
     
    Platinum 0.83, 0.81, 0.78 #d3cec6
     
    Gold 1.00, 0.85, 0.57 #ffd891
     
    Brass 0.98, 0.90, 0.59 #f9e596
     
    Copper 0.97, 0.74, 0.62 #f7bc9e
     
    Table 4: baseColor for common metals
    +

    +   

    Metallic

    +

    + +The metallic property defines whether the surface is a metallic (conductor) or a non-metallic +(dielectric) surface. This property should be used as a binary value, set to either 0 or 1. +Intermediate values are only truly useful to create transitions between different types of surfaces +when using textures. +

    +This property can dramatically change the appearance of a surface. Non-metallic surfaces have +chromatic diffuse reflection and achromatic specular reflection (reflected light does not change +color). Metallic surfaces do not have any diffuse reflection and chromatic specular reflection +(reflected light takes on the color of the surfaced as defined by baseColor). +

    +The effect of metallic is shown in figure 1 (click on the image to see a +larger version). +

    +

     
    Figure 1: metallic varying from 0.0 +
    +

    +   

    Roughness

    +

    + +The roughness property controls the perceived smoothness of the surface. When roughness is set +to 0, the surface is perfectly smooth and highly glossy. The rougher a surface is, the “blurrier” +the reflections are. This property is often called glossiness in other engines and tools, and is +simply the opposite of the roughness (roughness = 1 - glossiness). +

    +   

    Non-metals

    +

    + +The effect of roughness on non-metallic surfaces is shown in figure 2 (click +on the image to see a larger version). +

    +

     
    Figure 2: Dielectric roughness varying from 0.0 +
    +

    +   

    Metals

    +

    + +The effect of roughness on metallic surfaces is shown in figure 3 +(click on the image to see a larger version). +

    +

     
    Figure 3: Conductor roughness varying from 0.0 +
    +

    +   

    Refraction

    +

    + +When refraction through an object is enabled (using a refractonType of thin or solid), the +roughness property will also affect the refractions, as shown in figure 4 (click on the image to see a larger version). +

    +

     
    Figure 4: Refractive sphere with roughness varying from 0.0 +
    +

    +   

    Reflectance

    +

    + +The reflectance property only affects non-metallic surfaces. This property can be used to control +the specular intensity and index of refraction of materials. This value is defined +between 0 and 1 and represents a remapping of a percentage of reflectance. For instance, the +default value of 0.5 corresponds to a reflectance of 4%. Values below 0.35 (2% reflectance) should +be avoided as no real-world materials have such low reflectance. +

    +The effect of reflectance on non-metallic surfaces is shown in figure 5 +(click on the image to see a larger version). +

    +

     
    Figure 5: reflectance varying from 0.0 (left) +
    +

    +Figure 6 shows common values and how they relate to the mapping function. +

    +

     
    Figure 6: Common reflectance values
    +

    +Table 5 describes acceptable reflectance values for various types of materials +(no real world material has a value under 2%). +

    +

    +  + + + + + + + + + + + +
    Material Reflectance IOR Linear value
    Water 2% 1.33 0.35
    Fabric 4% to 5.6% 1.5 to 1.62 0.5 to 0.59
    Common liquids 2% to 4% 1.33 to 1.5 0.35 to 0.5
    Common gemstones 5% to 16% 1.58 to 2.33 0.56 to 1.0
    Plastics, glass 4% to 5% 1.5 to 1.58 0.5 to 0.56
    Other dielectric materials 2% to 5% 1.33 to 1.58 0.35 to 0.56
    Eyes 2.5% 1.38 0.39
    Skin 2.8% 1.4 0.42
    Hair 4.6% 1.55 0.54
    Teeth 5.8% 1.63 0.6
    Default value 4% 1.5 0.5
    Table 5: Reflectance of common materials
    +

    +Note that the reflectance property also defines the index of refraction of the surface. +When this property is defined it is not necessary to define the ior property. Setting +either of these properties will automatically compute the other property. It is possible +to specify both, in which case their values are kept as-is, which can lead to physically +impossible materials, however, this might be desirable for artistic reasons. +

    +The reflectance property is designed as a normalized property in the range 0..1 which makes +it easy to define from a texture. +

    +See section 3.1.20 for more information about the ior property and refractive +indices. +

    +   

    Sheen color

    +

    + +The sheen color controls the color appearance and strength of an optional sheen layer on top of the +base layer described by the properties above. The sheen layer always sits below the clear coat layer +if such a layer is present. +

    +The sheen layer can be used to represent cloth and fabric materials. Please refer to +section 3.3 for more information about cloth and fabric materials. +

    +The effect of sheenColor is shown in figure 7 +(click on the image to see a larger version). +

    +

     
    Figure 7: Different sheen colors
    +

    +

    If you do not need the other properties offered by the standard lit material model but want to + create a cloth-like or fabric-like appearance, it is more efficient to use the dedicated cloth + model described in section 3.3.
    +

    +   

    Sheen roughness

    +

    + +The sheenRoughness property is similar to the roughness property but applies only to the +sheen layer. +

    +The effect of sheenRoughness on a rough metal is shown in figure 8 +(click on the image to see a larger version). In this picture, the base layer is a dark blue, with +metallic set to 0.0 and roughness set to 1.0. +

    +

     
    Figure 8: sheenRoughness varying from 0.0 +
    +

    +   

    Clear coat

    +

    + +Multi-layer materials are fairly common, particularly materials with a thin translucent +layer over a base layer. Real world examples of such materials include car paints, soda cans, +lacquered wood and acrylic. +

    +The clearCoat property can be used to describe materials with two layers. The clear coat layer +will always be isotropic and dielectric. +

    +

     
    Figure 9: Comparison of a carbon-fiber material under the standard material model +
    +

    +The clearCoat property controls the strength of the clear coat layer. This should be treated as a +binary value, set to either 0 or 1. Intermediate values are useful to control transitions between +parts of the surface that have a clear coat layers and parts that don't. +

    +The effect of clearCoat on a rough metal is shown in figure 10 +(click on the image to see a larger version). +

    +

     
    Figure 10: clearCoat varying from 0.0 +
    +

    +

    The clear coat layer effectively doubles the cost of specular computations. Do not assign a + value, even 0.0, to the clear coat property if you don't need this second layer.
    +

    +

    The clear coat layer is added on top of the sheen layer if present.
    +

    +   

    Clear coat roughness

    +

    + +The clearCoatRoughness property is similar to the roughness property but applies only to the +clear coat layer. +

    +The effect of clearCoatRoughness on a rough metal is shown in figure 11 +(click on the image to see a larger version). +

    +

     
    Figure 11: clearCoatRoughness varying from 0.0 +
    +

    +   

    Anisotropy

    +

    + +Many real-world materials, such as brushed metal, can only be replicated using an anisotropic +reflectance model. A material can be changed from the default isotropic model to an anisotropic +model by using the anisotropy property. +

    +

     
    Figure 12: Comparison of isotropic material +
    +

    +The effect of anisotropy on a rough metal is shown in figure 13 +(click on the image to see a larger version). +

    +

     
    Figure 13: anisotropy varying from 0.0 +
    +

    +The figure 14 below shows how the direction of the anisotropic highlights can be +controlled by using either positive or negative values: positive values define anisotropy in the +tangent direction and negative values in the bitangent direction. +

    +

     
    Figure 14: Positive (left) vs negative +
    +

    +

    The anisotropic material model is slightly more expensive than the standard material model. Do + not assign a value (even 0.0) to the anisotropy property if you don't need anisotropy.
    +

    +   

    Anisotropy direction

    +

    + +The anisotropyDirection property defines the direction of the surface at a given point and thus +control the shape of the specular highlights. It is specified as vector of 3 values that usually +come from a texture, encoding the directions local to the surface in tangent space. Because the +direction is in tangent space, the Z component should be set to 0. +

    +The effect of anisotropyDirection on a metal is shown in figure 16 +(click on the image to see a larger version). +

    +

     
    Figure 15: Anisotropic metal rendered +
    +

    +The result shown in figure 16 was obtained using the direction map shown +in figure 16. +

    +

     
    Figure 16: Example of Lighting: specularAmbientOcclusiona direction map
    +

    +   

    Ambient occlusion

    +

    + +The ambientOcclusion property defines how much of the ambient light is accessible to a surface +point. It is a per-pixel shadowing factor between 0.0 (fully shadowed) and 1.0 (fully lit). This +property only affects diffuse indirect lighting (image-based lighting), not direct lights such as +directional, point and spot lights, nor specular lighting. +

    +

     
    Figure 17: Comparison of materials without diffuse ambient occlusion +
    +

    +   

    Normal

    +

    + +The normal property defines the normal of the surface at a given point. It usually comes from a +normal map texture, which allows to vary the property per-pixel. The normal is supplied in tangent +space, which means that +Z points outside of the surface. +

    +For example, let's imagine that we want to render a piece of furniture covered in tufted leather. +Modeling the geometry to accurately represent the tufted pattern would require too many triangles +so we instead bake a high-poly mesh into a normal map. Once the base map is applied to a simplified +mesh, we get the result in figure 18. +

    +Note that the normal property affects the base layer and not the clear coat layer. +

    +

     
    Figure 18: Low-poly mesh without normal mapping (left) +
    +

    +

    Using a normal map increases the runtime cost of the material model.
    +

    +   

    Bent normal

    +

    + +The bentNormal property defines the average unoccluded direction at a point on the surface. It is +used to improve the accuracy of indirect lighting. Bent normals can also improve the quality of +specular ambient occlusion (see section 4.2.33 about +specularAmbientOcclusion). +

    +Bent normals can greatly increase the visual fidelity of an asset with various cavities and concave +areas, as shown in figure 19. See the areas of the ears, nostrils and eyes for +instance. +

    +

     
    Figure 19: Example of a model rendered with and without a bent normal map. Both +
    +

    +   

    Clear coat normal

    +

    + +The clearCoatNormal property defines the normal of the clear coat layer at a given point. It +behaves otherwise like the normal property. +

    +

     
    Figure 20: A material with a clear coat normal +
    +

    +

    Using a clear coat normal map increases the runtime cost of the material model.
    +

    +   

    Emissive

    +

    + +The emissive property can be used to simulate additional light emitted by the surface. It is +defined as a float4 value that contains an RGB intensity in nits as well as an exposure +weight (in the alpha channel). +

    +The intensity in nits allows an emissive surface to function as a light and can be used to recreate +real world surfaces. For instance a computer display has an intensity between 200 and 1,000 nits. +

    +If you prefer to work in EV (or f-stops), you can simplify multiply your emissive color by the +output of the API filament::Exposure::luminance(ev). This API returns the luminance in nits of +the specific EV. You can perform this conversion yourself using the following formula, where \(L\) +is the final intensity in nits: \( L = 2^{EV - 3} \). +

    +The exposure weight carried in the alpha channel can be used to undo the camera exposure, and thus +force an emissive surface to bloom. When the exposure weight is set to 0, the emissive intensity is +not affected by the camera exposure. When the weight is set to 1, the intensity is multiplied by +the camera exposure like with any regular light. +

    +   

    Post-lighting color

    +

    + +The postLightingColor can be used to modify the surface color after lighting computations. This +property has no physical meaning and only exists to implement specific effects or to help with +debugging. This property is defined as a float4 value containing a pre-multiplied RGB color in +linear space. +

    +The post-lighting color is blended with the result of lighting according to the blending mode +specified by the postLightingBlending material option. Please refer to the documentation of +this option for more information. +

    +

    postLightingColor can be used as a simpler emissive property by setting + postLightingBlending to add and by providing an RGB color with alpha set to 0.0.
    +

    +   

    Index of refraction

    +

    + +The ior property only affects non-metallic surfaces. This property can be used to control the +index of refraction and the specular intensity of materials. The ior property is intended to +be used with refractive (transmissive) materials, which are enabled when the refractionMode is +set to cubemap or screenspace. It can also be used on non-refractive objects as an alternative +to setting the reflectance. +

    +The index of refraction (or refractive index) of a material is a dimensionless number that describes +how fast light travels through that material. The higher the number, the slower light travels +through the medium. More importantly for rendering materials, the refractive index determines how +the path light travels is bent when entering the material. Higher indices of refraction will cause +light to bend further away from the initial path. +

    +Table 6 describes acceptable refractive indices for various types of materials. +

    +  + + + + + + +
    Material IOR
    Air 1.0
    Water 1.33
    Common liquids 1.33 to 1.5
    Common gemstones 1.58 to 2.33
    Plastics, glass 1.5 to 1.58
    Other dielectric materials 1.33 to 1.58
    Table 6: Index of refraction of common materials
    +

    +The appearance of a refractive material will greatly depend on the refractionType and +refractionMode settings of the material. Refer to section 4.2.21 and section 4.2.20 +for more information. +

    +The effect of ior when refractionMode is set to cubemap and refractionType is set to solid +can be seen in figure 21 (click on the image to see a larger version). +

    +

     
    Figure 21: transmission varying from 1.0 +
    +

    +Figure 22 shows the comparison of a sphere of ior 1.0 with a sphere of ior 1.33, with +the refractionMode set to screenspace and the refractionType set to solid +(click on the image to see a larger version). +

    +

     
    Figure 22: ior of 1.0 (left) and 1.33 (right)
    +

    +Note that the ior property also defines the reflectance (or specular intensity) of the surface. +When this property is defined it is not necessary to define the reflectance property. Setting +either of these properties will automatically compute the other property. It is possible to specify +both, in which case their values are kept as-is, which can lead to physically impossible materials, +however, this might be desirable for artistic reasons. +

    +See the Reflectance section for more information on the reflectance property. +

    +

    Refractive materials are affected by the roughness property. Rough materials will scatter + light, creating a diffusion effect useful to recreate “blurry” appearances such as frosted + glass, certain plastics, etc.
    +

    +   

    Transmission

    +

    + +The transmission property defines what ratio of diffuse light is transmitted through a refractive +material. This property only affects materials with a refractionMode set to cubemap or +screenspace. +

    +When transmission is set to 0, no amount of light is transmitted and the diffuse component of +the surface is 100% visible. When transmission is set to 1, all the light is transmitted and the +diffuse component is not visible anymore, only the specular component is. +

    +The effect of transmission on a glossy dielectric (ior of 1.5, refractionMode set to +cubemap, refractionType set to solid) is shown in figure 23 +(click on the image to see a larger version). +

    +

     
    Figure 23: transmission varying from 0.0 +
    +

    +

    The transmission property is useful to create decals, paint, etc. at the surface of refractive + materials.
    +

    +   

    Absorption

    +

    + +The absorption property defines the absorption coefficients of light transmitted through the +material. Figure 24 shows the effect of absorption on a refracting object with +an index of refraction of 1.5 and a base color set to white. +

    +

     
    Figure 24: Refracting object without (left) +
    +

    +Transmittance through a volume is exponential with respect to the optical depth (defined either +with microThickness or thickness). The computed color follows the following formula: +

    +$$color \cdot e^{-absorption \cdot distance}$$ +

    +Where distance is either microThickness or thickness, that is the distance light will travel +through the material at a given point. If no thickness/distance is specified, the computed color +follows this formula instead: +

    +$$color \cdot (1 - absorption)$$ +

    +The effect of varying the absorption coefficients is shown in figure 25 +(click on the image to see a larger version). In this picture, the object has a fixed thickness +of 4.5 and an index of refraction set to 1.3. +

    +

     
    Figure 25: absorption varying from (0.0, 0.02, 0.14) +
    +

    +Setting the absorption coefficients directly can be unintuitive which is why we recommend working +with a transmittance color and a “at distance” factor instead. These two parameters allow an +artist to specify the precise color the material should have at a specified distance through the +volume. The value to pass to absorption can be computed this way: +

    +$$absorption = -\frac{ln(transmittanceColor)}{atDistance}$$ +

    +While this computation can be done in the material itself we recommend doing it offline whenever +possible. Filament provides an API for this purpose, Color::absorptionAtDistance(). +

    +   

    Micro-thickness and thickness

    +

    + +The microThickness and thickness properties define the optical depth of the material of a +refracting object. microThickness is used when refractionType is set to thin, and thickness +is used when refractionType is set to volume. +

    +thickness represents the thickness of solid objects in the direction of the normal, for +satisfactory results, this should be provided per fragment (e.g.: as a texture) or at least per +vertex. +

    +microThickness represent the thickness of the thin layer (shell) of an object, and can generally +be provided as a constant value. For example, a 1mm thin hollow sphere of radius 1m, would have a +thickness of 1 and a microThickness of 0.001. Currently thickness is not used when +refractionType is set to thin. Both properties are made available for possible future use. +

    +Both thickness and microThickness are used to compute the transmitted color of the material +when the absorption property is set. In solid volumes, thickness will also affect how light +rays are refracted. +

    +The effect thickness in a solid volume with refractionMode set to screenSpace is shown in +figure 26 (click on the image to see a larger version). Note how the thickness +value not only changes the effect of absorption but also modifies the direction of the refracted +light. +

    +

     
    Figure 26: thickness varying from 0.0 +
    +

    +Figure 27 shows what a prism with spatially varying thickness looks like when +the refractionType is set to solid and absorption coefficients are set. +

    +

     
    Figure 27: thickness varying from 0.0 at the top of the prism to 3.0 at the +
    +

    +   

    Subsurface model

    +   

    Thickness

    +   

    Subsurface color

    +   

    Subsurface power

    +   

    Cloth model

    +

    + +All the material models described previously are designed to simulate dense surfaces, both at a +macro and at a micro level. Clothes and fabrics are however often made of loosely connected threads +that absorb and scatter incident light. When compared to hard surfaces, cloth is characterized by +a softer specular lob with a large falloff and the presence of fuzz lighting, caused by +forward/backward scattering. Some fabrics also exhibit two-tone specular colors +(velvets for instance). +

    +Figure 28 shows how the standard material model fails to capture the appearance of a +sample of denim fabric. The surface appears rigid (almost plastic-like), more similar to a tarp +than a piece of clothing. This figure also shows how important the softer specular lobe caused by +absorption and scattering is to the faithful recreation of the fabric. +

    +

     
    Figure 28: Comparison of denim fabric rendered using the standard model +
    +

    +Velvet is an interesting use case for a cloth material model. As shown in figure 29 +this type of fabric exhibits strong rim lighting due to forward and backward scattering. These +scattering events are caused by fibers standing straight at the surface of the fabric. When the +incident light comes from the direction opposite to the view direction, the fibers will forward +scatter the light. Similarly, when the incident light from the same direction as the view +direction, the fibers will scatter the light backward. +

    +

     
    Figure 29: Velvet fabric showcasing forward and +
    +

    +It is important to note that there are types of fabrics that are still best modeled by hard surface +material models. For instance, leather, silk and satin can be recreated using the standard or +anisotropic material models. +

    +The cloth material model encompasses all the parameters previously defined for the standard +material mode except for metallic and reflectance. Two extra parameters described in +table 7 are also available. +

    +

    +  + + +
    Parameter Definition
    sheenColor Specular tint to create two-tone specular fabrics (defaults to \(\sqrt{baseColor}\))
    subsurfaceColor Tint for the diffuse color after scattering and absorption through the material
    Table 7: Cloth model parameters
    +

    +The type and range of each property is described in table 8. +

    +  + + +
    Property Type Range Note
    sheenColor float3 [0..1] Linear RGB
    subsurfaceColor float3 [0..1] Linear RGB
    Table 8: Range and type of the cloth model's properties
    +

    +To create a velvet-like material, the base color can be set to black (or a dark color). +Chromaticity information should instead be set on the sheen color. To create more common fabrics +such as denim, cotton, etc. use the base color for chromaticity and use the default sheen color +or set the sheen color to the luminance of the base color. +

    +

    To see the effect of the roughness parameter make sure the sheenColor is brighter than + baseColor. This can be used to create a fuzz effect. Taking the luminance of baseColor + as the sheenColor will produce a fairly natural effect that works for common cloth. A dark + baseColor combined with a bright/saturated sheenColor can be used to create velvet.
    +

    +

    The subsurfaceColor parameter should be used with care. High values can interfere with shadows + in some areas. It is best suited for subtle transmission effects through the material.
    +

    +   

    Sheen color

    +

    + +The sheenColor property can be used to directly modify the specular reflectance. It offers +better control over the appearance of cloth and gives give the ability to create +two-tone specular materials. +

    +The effect of sheenColor is shown in figure 30 +(click on the image to see a larger version). +

    +

     
    Figure 30: Blue fabric without (left) and with (right) sheen
    +

    +   

    Subsurface color

    +

    + +The subsurfaceColor property is not physically-based and can be used to simulate the scattering, +partial absorption and re-emission of light in certain types of fabrics. This is particularly +useful to create softer fabrics. +

    +

    The cloth material model is more expensive to compute when the subsurfaceColor property is used.
    +

    +The effect of subsurfaceColor is shown in figure 31 +(click on the image to see a larger version). +

    +

     
    Figure 31: White cloth (left column) vs white cloth with +
    +

    +   

    Unlit model

    +

    + +The unlit material model can be used to turn off all lighting computations. Its primary purpose is +to render pre-lit elements such as a cubemap, external content (such as a video or camera stream), +user interfaces, visualization/debugging etc. The unlit model exposes only two properties described +in table 9. +

    +  + + + +
    Property Definition
    baseColor Surface diffuse color
    emissive Additional diffuse color to simulate emissive surfaces. This property is mostly useful in an HDR pipeline with a bloom pass
    postLightingColor Additional color to blend with base color and emissive
    Table 9: Properties of the standard model
    +

    +The type and range of each property is described in table 10. +

    +  + + + +
    Property Type Range Note
    baseColor float4 [0..1] Pre-multiplied linear RGB
    emissive float4 rgb=[0..n], a=[0..1] Linear RGB intensity in nits, alpha encodes the exposure weight
    postLightingColor float4 [0..1] Pre-multiplied linear RGB
    Table 10: Range and type of the unlit model's properties
    +

    +The value of postLightingColor is blended with the sum of emissive and baseColor according to +the blending mode specified by the postLightingBlending material option. +

    +Figure 32 shows an example of the unlit material model +(click on the image to see a larger version). +

    +

     
    Figure 32: The unlit model is used to render debug information
    +

    +   

    Specular glossiness

    +

    + +This alternative lighting model exists to comply with legacy standards. Since it is not a +physically-based formulation, we do not recommend using it except when loading legacy assets. +

    +This model encompasses the parameters previously defined for the standard lit mode except for +metallic, reflectance, and roughness. It adds parameters for specularColor and glossiness. +

    +  + + + +
    Parameter Definition
    baseColor Surface diffuse color
    specularColor Specular tint (defaults to black)
    glossiness Glossiness (defaults to 0.0)
    Table 11: Properties of the specular-glossiness shading model
    +

    +The type and range of each property is described in table 12. +

    +  + + + +
    Property Type Range Note
    baseColor float4 [0..1] Pre-multiplied linear RGB
    specularColor float3 [0..1] Linear RGB
    glossiness float [0..1] Inverse of roughness
    Table 12: Range and type of the specular-glossiness model's properties
    +

    +   

    Material definitions

    +

    + +A material definition is a text file that describes all the information required by a material: +

    +

      +
    • Name +
    • +
    • User parameters +
    • +
    • Material model +
    • +
    • Required attributes +
    • +
    • Interpolants (called variables) +
    • +
    • Raster state (blending mode, etc.) +
    • +
    • Shader code (fragment shader, optionally vertex shader)
    +

    +   

    Format

    +

    + +The material definition format is a format loosely based on JSON that we +call JSONish. At the top level a material definition is composed of 3 different blocks that use +the JSON object notation: +

    material {
    +    // material properties
    +}
    +
    +vertex {
    +    // vertex shader, optional
    +}
    +
    +fragment {
    +    // fragment shader
    +}

    +A minimum viable material definition must contain a material preamble and a fragment block. The +vertex block is optional. +

    +   

    Differences with JSON

    +

    + +In JSON, an object is made of key/value pairs. A JSON pair has the following syntax: +

    "key" : value

    +Where value can be a string, number, object, array or a literal (true, false or null). While +this syntax is perfectly valid in a material definition, a variant without quotes around strings is +also accepted in JSONish: +

    key : value

    +Quotes remain mandatory when the string contains spaces. +

    +The vertex and fragment blocks contain unescaped, unquoted GLSL code, which is not valid in JSON. +

    +Single-line C++-style comments are allowed. +

    +The key of a pair is case-sensitive. +

    +The value of a pair is not case-sensitive. +

    +   

    Example

    +

    + +The following code listing shows an example of a valid material definition. This definition uses +the lit material model (see Lit model section), uses the default opaque blending mode, requires +that a set of UV coordinates be presented in the rendered mesh and defines 3 user parameters. The +following sections of this document describe the material and fragment blocks in detail. +

    material {
    +    name : "Textured material",
    +    parameters : [
    +        {
    +           type : sampler2d,
    +           name : texture
    +        },
    +        {
    +           type : float,
    +           name : metallic
    +        },
    +        {
    +            type : float,
    +            name : roughness
    +        }
    +    ],
    +    requires : [
    +        uv0
    +    ],
    +    shadingModel : lit,
    +    blending : opaque
    +}
    +
    +fragment {
    +    void material(inout MaterialInputs material) {
    +        prepareMaterial(material);
    +        material.baseColor = texture(materialParams_texture, getUV0());
    +        material.metallic = materialParams.metallic;
    +        material.roughness = materialParams.roughness;
    +    }
    +}
    +   

    Material block

    +

    + +The material block is mandatory block that contains a list of property pairs to describe all +non-shader data. +

    +   

    General: name

    +

    + +

    Type

    string +

    Value

    Any string. Double quotes are required if the name contains spaces. +

    Description

    Sets the name of the material. The name is retained at runtime for debugging purpose. +

    material {
    +    name : stone
    +}
    +
    +material {
    +    name : "Wet pavement"
    +}
    +   

    General: featureLevel

    +

    + +

    Type

    number +

    Value

    An integer value, either 1, 2 or 3. Defaults to 1. +

    +  + + + +
    Feature Level Guaranteed features
    1 9 textures per material
    2 9 textures per material, cubemap arrays, ESSL 3.10
    3 12 textures per material, cubemap arrays, ESSL 3.10
    Table 13: Feature levels
    +

    +

    Description

    Sets the feature level of the material. Each feature level defines a set of features the + material can use. If the material uses a feature not supported by the selected level, matc + will generate an error during compilation. A given feature level is guaranteed to support + all features of lower feature levels. +

    material {
    +    featureLevel : 2
    +}

    +

    Bugs

    matc doesn't verify that a material is not using features above its selected feature level. +

    +   

    General: shadingModel

    +

    + +

    Type

    string +

    Value

    Any of lit, subsurface, cloth, unlit, specularGlossiness. Defaults to lit. +

    Description

    Selects the material model as described in the Material models section. +

    material {
    +    shadingModel : unlit
    +}
    +
    +material {
    +    shadingModel : "subsurface"
    +}
    +   

    General: parameters

    +

    + +

    Type

    array of parameter objects +

    Value

    Each entry is an object with the properties name and type, both of string type. The + name must be a valid GLSL identifier. Entries also have an optional precision, which can be + one of default (best precision for the platform, typically high on desktop, medium on + mobile), low, medium, high. The type must be one of the types described in + table 14. +

    +  + + + + + + + + + + + + + + + + + + + + + + +
    Type Description
    bool Single boolean
    bool2 Vector of 2 booleans
    bool3 Vector of 3 booleans
    bool4 Vector of 4 booleans
    float Single float
    float2 Vector of 2 floats
    float3 Vector of 3 floats
    float4 Vector of 4 floats
    int Single integer
    int2 Vector of 2 integers
    int3 Vector of 3 integers
    int4 Vector of 4 integers
    uint Single unsigned integer
    uint2 Vector of 2 unsigned integers
    uint3 Vector of 3 unsigned integers
    uint4 Vector of 4 unsigned integers
    float3×3 Matrix of 3×3 floats
    float4×4 Matrix of 4×4 floats
    sampler2d 2D texture
    sampler2dArray Array of 2D textures
    samplerExternal External texture (platform-specific)
    samplerCubemap Cubemap texture
    Table 14: Material parameter types
    +

    +

    Samplers

    Sampler types can also specify a format which can be either int or float (defaults to + float). +

    Arrays

    A parameter can define an array of values by appending [size] after the type name, where + size is a positive integer. For instance: float[9] declares an array of nine float + values. This syntax does not apply to samplers as arrays are treated as separate types. +

    Description

    Lists the parameters required by your material. These parameters can be set at runtime using + Filament's material API. Accessing parameters from the shaders varies depending on the type of + parameter: +

    +

      +
    • Samplers types: use the parameter name prefixed with materialParams_. For instance, + materialParams_myTexture. +
    • +
    • Other types: use the parameter name as the field of a structure called materialParams. + For instance, materialParams.myColor.
    +

    material {
    +    parameters : [
    +        {
    +           type : float4,
    +           name : albedo
    +        },
    +        {
    +           type      : sampler2d,
    +           format    : float,
    +           precision : high,
    +           name      : roughness
    +        },
    +        {
    +            type : float2,
    +            name : metallicReflectance
    +        }
    +    ],
    +    requires : [
    +        uv0
    +    ],
    +    shadingModel : lit,
    +}
    +
    +fragment {
    +    void material(inout MaterialInputs material) {
    +        prepareMaterial(material);
    +        material.baseColor = materialParams.albedo;
    +        material.roughness = texture(materialParams_roughness, getUV0());
    +        material.metallic = materialParams.metallicReflectance.x;
    +        material.reflectance = materialParams.metallicReflectance.y;
    +    }
    +}
    +   

    General: constants

    +

    + +

    Type

    array of constant objects +

    Value

    Each entry is an object with the properties name and type, both of string type. The name + must be a valid GLSL identifier. Entries also have an optional default, which can either be a + bool or number, depending on the type of the constant. The type must be one of the types + described in table 15. +

    +  + + + +
    Type Description Default
    int A signed, 32 bit GLSL int 0
    float A single-precision GLSL float 0.0
    bool A GLSL bool false
    Table 15: Material constants types
    +

    +

    Description

    Lists the constant parameters accepted by your material. These constants can be set, or + “specialized”, at runtime when loading a material package. Multiple materials can be loaded from + the same material package with differing constant parameter specializations. Once a material is + loaded from a material package, its constant parameters cannot be changed. Compared to regular + parameters, constant parameters allow the compiler to generate more efficient code. Access + constant parameters from the shader by prefixing the name with materialConstant_. For example, + a constant parameter named myConstant is accessed in the shader as + materialConstant_myConstant. If a constant parameter is not set at runtime, the default is + used. +

    material {
    +    constants : [
    +        {
    +           name : overrideAlpha,
    +           type : bool
    +        },
    +        {
    +           name : customAlpha,
    +           type : float,
    +           default : 0.5
    +        }
    +    ],
    +    shadingModel : lit,
    +    blending : transparent,
    +}
    +
    +fragment {
    +    void material(inout MaterialInputs material) {
    +        prepareMaterial(material);
    +        if (materialConstants_overrideAlpha) {
    +            material.baseColor.a = materialConstants_customAlpha;
    +            material.baseColor.rgb *= material.baseColor.a;
    +        }
    +    }
    +}
    +   

    General: variantFilter

    +

    + +

    Type

    array of string +

    Value

    Each entry must be any of dynamicLighting, directionalLighting, shadowReceiver, + skinning, ssr, or stereo. +

    Description

    Used to specify a list of shader variants that the application guarantees will never be + needed. These shader variants are skipped during the code generation phase, thus reducing + the overall size of the material. + Note that some variants may automatically be filtered out. For instance, all lighting related + variants (directionalLighting, etc.) are filtered out when compiling an unlit material. + Use the variant filter with caution, filtering out a variant required at runtime may lead + to crashes. +

    Description of the variants: +

    +

      +
    • directionalLighting, used when a directional light is present in the scene +
    • +
    • dynamicLighting, used when a non-directional light (point, spot, etc.) is present in the scene +
    • +
    • shadowReceiver, used when an object can receive shadows +
    • +
    • skinning, used when an object is animated using GPU skinning +
    • +
    • fog, used when global fog is applied to the scene +
    • +
    • vsm, used when VSM shadows are enabled and the object is a shadow receiver +
    • +
    • ssr, used when screen-space reflections are enabled in the View +
    • +
    • stereo, used when stereoscopic rendering is enabled in the View
    +

    material {
    +    name : "Invisible shadow plane",
    +    shadingModel : unlit,
    +    shadowMultiplier : true,
    +    blending : transparent,
    +    variantFilter : [ skinning ]
    +}
    +   

    General: flipUV

    +

    + +

    Type

    boolean +

    Value

    true or false. Defaults to true. +

    Description

    When set to true (default value), the Y coordinate of UV attributes will be flipped when + read by this material's vertex shader. Flipping is equivalent to y = 1.0 - y. When set + to false, flipping is disabled and the UV attributes are read as is. +

    material {
    +    flipUV : false
    +}
    +   

    General: quality

    +

    + +

    Type

    string +

    Value

    Any of low, normal, high, default. Defaults to default. +

    Description

    Set some global quality parameters of the material. low enables optimizations that can + slightly affect correctness and is the default on mobile platforms. normal does not affect + correctness and is otherwise similar to low. high enables quality settings that can + adversely affect performance and is the default on desktop platforms. +

    material {
    +    quality : default
    +}
    +   

    General: instanced

    +

    + +

    Type

    boolean +

    Value

    true or false. Defaults to false. +

    Description

    Allows a material to access the instance index (i.e.: gl_InstanceIndex) of instanced + primitives using getInstanceIndex() in the material's shader code. Never use + gl_InstanceIndex directly. This is typically used with + RenderableManager::Builder::instances(). getInstanceIndex() is available in both the + vertex and fragment shader. +

    material {
    +    instanced : true
    +}
    +   

    General: vertexDomainDeviceJittered

    +

    + +

    Type

    boolean +

    Value

    true or false. Defaults to false. +

    Description

    Only meaningful for vertexDomain:Device materials, this parameter specifies whether the + filament clip-space transforms need to be applied or not, which affects TAA and guard bands. + Generally it needs to be applied because by definition vertexDomain:Device materials + vertices are not transformed and used as is. + However, if the vertex shader uses for instance getViewFromClipMatrix() (or other + matrices based on the projection), the clip-space transform is already applied. + Setting this parameter incorrectly can prevent TAA or the guard bands to work correctly. +

    material {
    +    vertexDomainDeviceJittered : true
    +}
    +   

    Vertex and attributes: requires

    +

    + +

    Type

    array of string +

    Value

    Each entry must be any of uv0, uv1, color, position, tangents, custom0 + through custom7. +

    Description

    Lists the vertex attributes required by the material. The position attribute is always + required and does not need to be specified. The tangents attribute is automatically required + when selecting any shading model that is not unlit. See the shader sections of this document + for more information on how to access these attributes from the shaders. +

    material {
    +    parameters : [
    +        {
    +           type : sampler2d,
    +           name : texture
    +        },
    +    ],
    +    requires : [
    +        uv0,
    +        custom0
    +    ],
    +    shadingModel : lit,
    +}
    +
    +fragment {
    +    void material(inout MaterialInputs material) {
    +        prepareMaterial(material);
    +        material.baseColor = texture(materialParams_texture, getUV0());
    +        material.baseColor.rgb *= getCustom0().rgb;
    +    }
    +}
    +   

    Vertex and attributes: variables

    +

    + +

    Type

    array of string +

    Value

    Up to 4 strings, each must be a valid GLSL identifier. +

    Description

    Defines custom interpolants (or variables) that are output by the material's vertex shader. + Each entry of the array defines the name of an interpolant. The full name in the fragment + shader is the name of the interpolant with the variable_ prefix. For instance, if you + declare a variable called eyeDirection you can access it in the fragment shader using + variable_eyeDirection. In the vertex shader, the interpolant name is simply a member of + the MaterialVertexInputs structure (material.eyeDirection in your example). Each + interpolant is of type float4 (vec4) in the shaders. By default the precision of the + interpolant is highp in both the vertex and fragment shaders. + An alternate syntax can be used to specify both the name and precision of the interpolant. + In this case the specified precision is used as-is in both fragment and vertex stages, in + particular if default is specified the default precision is used is the fragment shader + (mediump) and in the vertex shader (highp). +

    material {
    +    name : Skybox,
    +    parameters : [
    +        {
    +           type : samplerCubemap,
    +           name : skybox
    +        }
    +    ],
    +    variables : [
    +         eyeDirection,
    +         {
    +            name : eyeColor,
    +            precision : medium
    +         }
    +    ],
    +    vertexDomain : device,
    +    depthWrite : false,
    +    shadingModel : unlit
    +}
    +
    +fragment {
    +    void material(inout MaterialInputs material) {
    +        prepareMaterial(material);
    +        float3 sky = texture(materialParams_skybox, variable_eyeDirection.xyz).rgb;
    +        material.baseColor = vec4(sky, 1.0);
    +    }
    +}
    +
    +vertex {
    +    void materialVertex(inout MaterialVertexInputs material) {
    +        float3 p = getPosition().xyz;
    +        float3 u = mulMat4x4Float3(getViewFromClipMatrix(), p).xyz;
    +        material.eyeDirection.xyz = mulMat3x3Float3(getWorldFromViewMatrix(), u);
    +    }
    +}
    +   

    Vertex and attributes: vertexDomain

    +

    + +

    Type

    string +

    Value

    Any of object, world, view, device. Defaults to object. +

    Description

    Defines the domain (or coordinate space) of the rendered mesh. The domain influences how the + vertices are transformed in the vertex shader. The possible domains are: +

    +

      +
    • Object: the vertices are defined in the object (or model) coordinate space. The + vertices are transformed using the rendered object's transform matrix +
    • +
    • World: the vertices are defined in world coordinate space. The vertices are not + transformed using the rendered object's transform. +
    • +
    • View: the vertices are defined in view (or eye or camera) coordinate space. The + vertices are not transformed using the rendered object's transform. +
    • +
    • Device: the vertices are defined in normalized device (or clip) coordinate space. + The vertices are not transformed using the rendered object's transform.
    +

    material {
    +    vertexDomain : device
    +}
    +   

    Vertex and attributes: interpolation

    +

    + +

    Type

    string +

    Value

    Any of smooth, flat. Defaults to smooth. +

    Description

    Defines how interpolants (or variables) are interpolated between vertices. When this property + is set to smooth, a perspective correct interpolation is performed on each interpolant. + When set to flat, no interpolation is performed and all the fragments within a given + triangle will be shaded the same. +

    material {
    +    interpolation : flat
    +}
    +   

    Blending and transparency: blending

    +

    + +

    Type

    string +

    Value

    Any of opaque, transparent, fade, add, masked, multiply, screen, custom. Defaults to opaque. +

    Description

    Defines how/if the rendered object is blended with the content of the render target. + The possible blending modes are: +

    +

      +
    • Opaque: blending is disabled, the alpha channel of the material's output is ignored. +
    • +
    • Transparent: blending is enabled. The material's output is alpha composited with the + render target, using Porter-Duff's source over rule. This blending mode assumes + pre-multiplied alpha. +
    • +
    • Fade: acts as transparent but transparency is also applied to specular lighting. In + transparent mode, the material's alpha values only applies to diffuse lighting. This + blending mode is useful to fade lit objects in and out. +
    • +
    • Add: blending is enabled. The material's output is added to the content of the + render target. +
    • +
    • Multiply: blending is enabled. The material's output is multiplied with the content of the + render target, darkening the content. +
    • +
    • Screen: blending is enabled. Effectively the opposite of the multiply, the content of the + render target is brightened. +
    • +
    • Masked: blending is disabled. This blending mode enables alpha masking. The alpha channel + of the material's output defines whether a fragment is discarded or not. Additionally, + ALPHA_TO_COVERAGE is enabled for non-translucent views. See the maskThreshold section for more + information. +
    • +
    • Custom: blending is enabled. But the blending function is user specified. See blendFunction.
    +

    When blending is set to masked, alpha to coverage is automatically enabled for the material. + If this behavior is undesirable, refer to the Rasterization: alphaToCoverage section to turn + alpha to coverage off using the alphaToCoverage property.
    +

    material {
    +    blending : transparent
    +}
    +   

    Blending and transparency: blendFunction

    +

    + +

    Type

    object +

    Fields

    srcRGB, srcA, dstRGB, dstA +

    Description

    - srcRGB: source function applied to the RGB channels + - srcA: source function applied to the alpha channel + - srcRGB: destination function applied to the RGB channels + - srcRGB: destination function applied to the alpha channel + The values possible for each functions are one of zero, one, srcColor, oneMinusSrcColor, + dstColor, oneMinusDstColor, srcAlpha, oneMinusSrcAlpha, dstAlpha, + oneMinusDstAlpha, srcAlphaSaturate +

    material {
    +    blending : custom,
    +    blendFunction :
    +    {
    +        srcRGB: one,
    +        srcA: one,
    +        dstRGB: oneMinusSrcColor,
    +        dstA: oneMinusSrcAlpha
    +    }
    + }
    +   

    Blending and transparency: postLightingBlending

    +

    + +

    Type

    string +

    Value

    Any of opaque, transparent, add. Defaults to transparent. +

    Description

    Defines how the postLightingColor material property is blended with the result of the + lighting computations. The possible blending modes are: +

    +

      +
    • Opaque: blending is disabled, the material will output postLightingColor directly. +
    • +
    • Transparent: blending is enabled. The material's computed color is alpha composited with + the postLightingColor, using Porter-Duff's source over rule. This blending mode assumes + pre-multiplied alpha. +
    • +
    • Add: blending is enabled. The material's computed color is added to postLightingColor. +
    • +
    • Multiply: blending is enabled. The material's computed color is multiplied with postLightingColor. +
    • +
    • Screen: blending is enabled. The material's computed color is inverted and multiplied with postLightingColor, + and the result is added to the material's computed color.
    +

    material {
    +    postLightingBlending : add
    +}
    +   

    Blending and transparency: transparency

    +

    + +

    Type

    string +

    Value

    Any of default, twoPassesOneSide or twoPassesTwoSides. Defaults to default. +

    Description

    Controls how transparent objects are rendered. It is only valid when the blending mode is + not opaque and refractionMode is none. None of these methods can accurately render + concave geometry, but in practice they are often good enough. +

    The three possible transparency modes are: +

    +

      +
    • default: the transparent object is rendered normally (as seen in figure 33), + honoring the culling mode, etc. +
    • +
    • twoPassesOneSide: the transparent object is first rendered in the depth buffer, then again in + the color buffer, honoring the culling mode. This effectively renders only half of the + transparent object as shown in figure 34. +
    • +
    • twoPassesTwoSides: the transparent object is rendered twice in the color buffer: first with its + back faces, then with its front faces. This mode lets you render both set of faces while reducing + or eliminating sorting issues, as shown in figure 35. + twoPassesTwoSides can be combined with doubleSided for better effect.
    +

    material {
    +    transparency : twoPassesOneSide
    +}

    +

     
    Figure 33: This double sided model shows the type of sorting issues transparent +
    +

    +

     
    Figure 34: In twoPassesOneSide mode, only one set of faces is visible +
    +

    +

     
    Figure 35: In twoPassesTwoSides mode, both set of faces are visible +
    +

    +   

    Blending and transparency: maskThreshold

    +

    + +

    Type

    number +

    Value

    A value between 0.0 and 1.0. Defaults to 0.4. +

    Description

    Sets the minimum alpha value a fragment must have to not be discarded when the blending mode + is set to masked. If the fragment is not discarded, its source alpha is set to 1. When the + blending mode is not masked, this value is ignored. This value can be used to controlled the + appearance of alpha-masked objects. +

    material {
    +    blending : masked,
    +    maskThreshold : 0.5
    +}
    +   

    Blending and transparency: refractionMode

    +

    + +

    Type

    string +

    Value

    Any of none, cubemap, screenspace. Defaults to none. +

    Description

    Activates refraction when set to anything but none. A value of cubemap will only use the + IBL cubemap as source of refraction, while this is significantly more efficient, no scene + objects will be refracted, only the distant environment encoded in the cubemap. This mode is + adequate for an object viewer for instance. A value of screenspace will employ the more + advanced screen-space refraction algorithm which allows opaque objects in the scene to be + refracted. In cubemap mode, refracted rays are assumed to emerge from the center of the + object and the thickness parameter is only used for computing the absorption, but has no + impact on the refraction itself. In screenspace mode, refracted rays are assumed to travel + parallel to the view direction when they exit the refractive medium. +

    material {
    +    refractionMode : cubemap,
    +}
    +   

    Blending and transparency: refractionType

    +

    + +

    Type

    string +

    Value

    Any of solid, thin. Defaults to solid. +

    Description

    This is only meaningful when refractionMode is set to anything but none. refractionType + defines the refraction model used. solid is used for thick objects such as a crystal ball, + an ice cube or as sculpture. thin is used for thin objects such as a window, an ornament + ball or a soap bubble. In solid mode all refracive objects are assumed to be a sphere + tangent to the entry point and of radius thickness. In thin mode, all refractive objects + are assumed to be flat and thin and of thickness thickness. +

    material {
    +    refractionMode : cubemap,
    +    refractionType : thin,
    +}
    +   

    Rasterization: culling

    +

    + +

    Type

    string +

    Value

    Any of none, front, back, frontAndBack. Defaults to back. +

    Description

    Defines which triangles should be culled: none, front-facing triangles, back-facing + triangles or all. +

    material {
    +    culling : none
    +}
    +   

    Rasterization: colorWrite

    +

    + +

    Type

    boolean +

    Value

    true or false. Defaults to true. +

    Description

    Enables or disables writes to the color buffer. +

    material {
    +    colorWrite : false
    +}
    +   

    Rasterization: depthWrite

    +

    + +

    Type

    boolean +

    Value

    true or false. Defaults to true for opaque materials, false for transparent materials. +

    Description

    Enables or disables writes to the depth buffer. +

    material {
    +    depthWrite : false
    +}
    +   

    Rasterization: depthCulling

    +

    + +

    Type

    boolean +

    Value

    true or false. Defaults to true. +

    Description

    Enables or disables depth testing. When depth testing is disabled, an object rendered with + this material will always appear on top of other opaque objects. +

    material {
    +    depthCulling : false
    +}
    +   

    Rasterization: doubleSided

    +

    + +

    Type

    boolean +

    Value

    true or false. Defaults to false. +

    Description

    Enables two-sided rendering and its capability to be toggled at run time. When set to true, + culling is automatically set to none; if the triangle is back-facing, the triangle's + normal is flipped to become front-facing. When explicitly set to false, this allows the + double-sidedness to be toggled at run time. +

    material {
    +    name : "Double sided material",
    +    shadingModel : lit,
    +    doubleSided : true
    +}
    +
    +fragment {
    +    void material(inout MaterialInputs material) {
    +        prepareMaterial(material);
    +        material.baseColor = materialParams.albedo;
    +    }
    +}
    +   

    Rasterization: alphaToCoverage

    +

    + +

    Type

    boolean +

    Value

    true or false. Defaults to false. +

    Description

    Enables or disables alpha to coverage. When alpha to coverage is enabled, the coverage of + fragment is derived from its alpha. This property is only meaningful when MSAA is enabled. + Note: setting blending to masked automatically enables alpha to coverage. If this is not + desired, you can override this behavior by setting alpha to coverage to false as in the + example below. +

    material {
    +    name : "Alpha to coverage",
    +    shadingModel : lit,
    +    blending : masked,
    +    alphaToCoverage : false
    +}
    +
    +fragment {
    +    void material(inout MaterialInputs material) {
    +        prepareMaterial(material);
    +        material.baseColor = materialParams.albedo;
    +    }
    +}
    +   

    Lighting: reflections

    +

    + +

    Type

    string +

    Value

    default or screenspace. Defaults to default. +

    Description

    Controls the source of specular reflections for this material. When this property is set to + default, reflections only come image-based lights. When this property is set to + screenspace, reflections come from the screen space's color buffer in addition to + image-based lights. +

    material {
    +    name : "Glossy metal",
    +    reflections : screenspace
    +}
    +   

    Lighting: shadowMultiplier

    +

    + +

    Type

    boolean +

    Value

    true or false. Defaults to false. +

    Description

    Only available in the unlit shading model. If this property is enabled, the final color + computed by the material is multiplied by the shadowing factor (or visibility). This allows to + create transparent shadow-receiving objects (for instance an invisible ground plane in AR). + This is only supported with shadows from directional lights. +

    material {
    +    name : "Invisible shadow plane",
    +    shadingModel : unlit,
    +    shadowMultiplier : true,
    +    blending : transparent
    +}
    +
    +fragment {
    +    void material(inout MaterialInputs material) {
    +        prepareMaterial(material);
    +        // baseColor defines the color and opacity of the final shadow
    +        material.baseColor = vec4(0.0, 0.0, 0.0, 0.7);
    +    }
    +}
    +   

    Lighting: transparentShadow

    +

    + +

    Type

    boolean +

    Value

    true or false. Defaults to false. +

    Description

    Enables transparent shadows on this material. When this feature is enabled, Filament emulates + transparent shadows using a dithering pattern: they work best with variance shadow maps (VSM) + and blurring enabled. The opacity of the shadow derives directly from the alpha channel of + the material's baseColor property. Transparent shadows can be enabled on opaque objects, + making them compatible with refractive/transmissive objects that are otherwise considered + opaque. +

    material {
    +    name : "Clear plastic with stickers",
    +    transparentShadow : true,
    +    blending : transparent,
    +    // ...
    +}
    +
    +fragment {
    +    void material(inout MaterialInputs material) {
    +        prepareMaterial(material);
    +        material.baseColor = texture(materialParams_baseColor, getUV0());
    +    }
    +}

    +

     
    Figure 36: Objects rendered with transparent shadows and blurry VSM with a +
    +

    +   

    Lighting: clearCoatIorChange

    +

    + +

    Type

    boolean +

    Value

    true or false. Defaults to true. +

    Description

    When adding a clear coat layer, the change in index of refraction (IoR) is taken into account + to modify the specular color of the base layer. This appears to darken baseColor. When this + effect is disabled, baseColor is left unmodified. See figure 37 for an + example of how this property can affect a red metallic base layer. +

    material {
    +    clearCoatIorChange : false
    +}

    +

     
    Figure 37: The same rough metallic ball with a clear coat layer rendered +
    +

    +   

    Lighting: multiBounceAmbientOcclusion

    +

    + +

    Type

    boolean +

    Value

    true or false. Defaults to false on mobile, true on desktop. +

    Description

    Multi-bounce ambient occlusion takes into account interreflections when applying ambient + occlusion to image-based lighting. Turning this feature on avoids over-darkening occluded + areas. It also takes the surface color into account to generate colored ambient occlusion. + Figure 38 compares the ambient occlusion term of a surface with and without + multi-bounce ambient occlusion. Notice how multi-bounce ambient occlusion introduces color + in the occluded areas. Figure 39 toggles between multi-bounce ambient + occlusion on and off on a lit brick material to highlight the effects of this property. +

    material {
    +    multiBounceAmbientOcclusion : true
    +}

    +

     
    Figure 38: Brick texture amient occlusion map rendered with multi-bounce ambient +
    +

    +

     
    Figure 39: Brick texture rendered with multi-bounce ambient +
    +

    +   

    Lighting: specularAmbientOcclusion

    +

    + +

    Type

    string +

    Value

    none, simple or bentNormals. Defaults to none on mobile, simple on desktop. For + compatibility reasons, true and false are also accepted and map respectively to simple + and none. +

    Description

    Static ambient occlusion maps and dynamic ambient occlusion (SSAO, etc.) apply to diffuse + indirect lighting. When setting this property to other than none, a new ambient occlusion + term is derived from the surface roughness and applied to specular indirect lighting. + This effect helps remove unwanted specular reflections as shown in figure 40. + When this value is set to simple, Filament uses a cheap but approximate method of computing + the specular ambient occlusion term. If this value is set to bentNormals, Filament will use + a much more accurate but much more expensive method. +

    material {
    +    specularAmbientOcclusion : simple
    +}

    +

     
    Figure 40: Comparison of specular ambient occlusion on and off. The effect is +
    +

    +   

    Anti-aliasing: specularAntiAliasing

    +

    + +

    Type

    boolean +

    Value

    true or false. Defaults to false. +

    Description

    Reduces specular aliasing and preserves the shape of specular highlights as an object moves + away from the camera. This anti-aliasing solution is particularly effective on glossy materials + (low roughness) but increases the cost of the material. The strength of the anti-aliasing + effect can be controlled using two other properties: specularAntiAliasingVariance and + specularAntiAliasingThreshold. +

    material {
    +    specularAntiAliasing : true
    +}
    +   

    Anti-aliasing: specularAntiAliasingVariance

    +

    + +

    Type

    float +

    Value

    A value between 0 and 1, set to 0.15 by default. +

    Description

    Sets the screen space variance of the filter kernel used when applying specular anti-aliasing. + Higher values will increase the effect of the filter but may increase roughness in unwanted + areas. +

    material {
    +    specularAntiAliasingVariance : 0.2
    +}
    +   

    Anti-aliasing: specularAntiAliasingThreshold

    +

    + +

    Type

    float +

    Value

    A value between 0 and 1, set to 0.2 by default. +

    Description

    Sets the clamping threshold used to suppress estimation errors when applying specular + anti-aliasing. When set to 0, specular anti-aliasing is disabled. +

    material {
    +    specularAntiAliasingThreshold : 0.1
    +}
    +   

    Shading: customSurfaceShading

    +

    + +

    Type

    bool +

    Value

    true or false. Defaults to false. +

    Description

    Enables custom surface shading when set to true. When surface shading is enabled, the fragment + shader must provide an extra function that will be invoked for every light in the scene that + may influence the current fragment. Please refer to the Custom surface shading section below + for more information. +

    material {
    +    customSurfaceShading : true
    +}
    +   

    Vertex block

    +

    + +The vertex block is optional and can be used to control the vertex shading stage of the material. +The vertex block must contain valid +ESSL 3.0 code +(the version of GLSL supported in OpenGL ES 3.0). You are free to create multiple functions inside +the vertex block but you must declare the materialVertex function: +

    vertex {
    +    void materialVertex(inout MaterialVertexInputs material) {
    +        // vertex shading code
    +    }
    +}

    +This function will be invoked automatically at runtime by the shading system and gives you the +ability to read and modify material properties using the MaterialVertexInputs structure. This full +definition of the structure can be found in the Material vertex inputs section. +

    +You can use this structure to compute your custom variables/interpolants or to modify the value of +the attributes. For instance, the following vertex blocks modifies both the color and the UV +coordinates of the vertex over time: +

    material {
    +    requires : [uv0, color]
    +}
    +vertex {
    +    void materialVertex(inout MaterialVertexInputs material) {
    +        material.color *= sin(getUserTime().x);
    +        material.uv0 *= sin(getUserTime().x);
    +    }
    +}

    +In addition to the MaterialVertexInputs structure, your vertex shading code can use all the public +APIs listed in the Shader public APIs section. +

    +   

    Material vertex inputs

    +
    struct MaterialVertexInputs {
    +    float4 color;              // if the color attribute is required
    +    float2 uv0;                // if the uv0 attribute is required
    +    float2 uv1;                // if the uv1 attribute is required
    +    float3 worldNormal;        // only if the shading model is not unlit
    +    float4 worldPosition;      // always available (see note below about world-space)
    +
    +    mat4   clipSpaceTransform; // default: identity, transforms the clip-space position, only available for `vertexDomain:device`
    +
    +    // variable* names are replaced with actual names
    +    float4 variable0;          // if 1 or more variables is defined
    +    float4 variable1;          // if 2 or more variables is defined
    +    float4 variable2;          // if 3 or more variables is defined
    +    float4 variable3;          // if 4 or more variables is defined
    +};

    + +

    worldPosition
    +

    + To achieve good precision, the worldPosition coordinate in the vertex shader is shifted by the + camera position. To get the true world-space position, users can use + getUserWorldPosition(), however be aware that the true world-position might not + be able to fit in a float or might be represented with severely reduced precision.

    +

    +

    UV attributes
    +

    + By default the vertex shader of a material will flip the Y coordinate of the UV attributes + of the current mesh: material.uv0 = vec2(mesh_uv0.x, 1.0 - mesh_uv0.y). You can control + this behavior using the flipUV property and setting it to false.

    +

    +   

    Custom vertex attributes

    +

    + +You can use up to 8 custom vertex attributes, all of type float4. These attributes can be accessed +using the vertex block shader functions getCustom0() to getCustom7(). However, before using +custom attributes, you must declare those attributes as required in the requires property of +the material: +

    material {
    +    requires : [
    +        custom0,
    +        custom1,
    +        custom2
    +    ]
    +}
    +   

    Fragment block

    +

    + +The fragment block must be used to control the fragment shading stage of the material. The fragment +block must contain valid +ESSL 3.0 +code (the version of GLSL supported in OpenGL ES 3.0). You are free to create multiple functions +inside the fragment block but you must declare the material function: +

    fragment {
    +    void material(inout MaterialInputs material) {
    +        prepareMaterial(material);
    +        // fragment shading code
    +    }
    +}

    +This function will be invoked automatically at runtime by the shading system and gives you the +ability to read and modify material properties using the MaterialInputs structure. This full +definition of the structure can be found in the Material fragment inputs section. The full +definition of the various members of the structure can be found in the Material models section +of this document. +

    +The goal of the material() function is to compute the material properties specific to the selected +shading model. For instance, here is a fragment block that creates a glossy red metal using the +standard lit shading model: +

    fragment {
    +    void material(inout MaterialInputs material) {
    +        prepareMaterial(material);
    +        material.baseColor.rgb = vec3(1.0, 0.0, 0.0);
    +        material.metallic = 1.0;
    +        material.roughness = 0.0;
    +    }
    +}
    +   

    prepareMaterial function

    +

    + +Note that you must call prepareMaterial(material) before exiting the material() function. +This prepareMaterial function sets up the internal state of the material model. Some of the APIs +described in the Fragment APIs section - like shading_normal for instance - can only be accessed +after invoking prepareMaterial(). +

    +It is also important to remember that the normal property - as described in the Material fragment +inputs section - only has an effect when modified before calling prepareMaterial(). Here is an +example of a fragment shader that properly modifies the normal property to implement a glossy red +plastic with bump mapping: +

    fragment {
    +    void material(inout MaterialInputs material) {
    +        // fetch the normal in tangent space
    +        vec3 normal = texture(materialParams_normalMap, getUV0()).xyz;
    +        material.normal = normal * 2.0 - 1.0;
    +
    +        // prepare the material
    +        prepareMaterial(material);
    +
    +        // from now on, shading_normal, etc. can be accessed
    +        material.baseColor.rgb = vec3(1.0, 0.0, 0.0);
    +        material.metallic = 0.0;
    +        material.roughness = 1.0;
    +    }
    +}
    +   

    Material fragment inputs

    +
    struct MaterialInputs {
    +    float4 baseColor;           // default: float4(1.0)
    +    float4 emissive;            // default: float4(0.0, 0.0, 0.0, 1.0)
    +    float4 postLightingColor;   // default: float4(0.0)
    +
    +    // no other field is available with the unlit shading model
    +    float  roughness;           // default: 1.0
    +    float  metallic;            // default: 0.0, not available with cloth or specularGlossiness
    +    float  reflectance;         // default: 0.5, not available with cloth or specularGlossiness
    +    float  ambientOcclusion;    // default: 0.0
    +
    +    // not available when the shading model is subsurface or cloth
    +    float3 sheenColor;          // default: float3(0.0)
    +    float  sheenRoughness;      // default: 0.0
    +    float  clearCoat;           // default: 1.0
    +    float  clearCoatRoughness;  // default: 0.0
    +    float3 clearCoatNormal;     // default: float3(0.0, 0.0, 1.0)
    +    float  anisotropy;          // default: 0.0
    +    float3 anisotropyDirection; // default: float3(1.0, 0.0, 0.0)
    +
    +    // only available when the shading model is subsurface or refraction is enabled
    +    float  thickness;           // default: 0.5
    +
    +    // only available when the shading model is subsurface
    +    float  subsurfacePower;     // default: 12.234
    +    float3 subsurfaceColor;     // default: float3(1.0)
    +
    +    // only available when the shading model is cloth
    +    float3 sheenColor;          // default: sqrt(baseColor)
    +    float3 subsurfaceColor;     // default: float3(0.0)
    +
    +    // only available when the shading model is specularGlossiness
    +    float3 specularColor;       // default: float3(0.0)
    +    float  glossiness;          // default: 0.0
    +
    +    // not available when the shading model is unlit
    +    // must be set before calling prepareMaterial()
    +    float3 normal;              // default: float3(0.0, 0.0, 1.0)
    +
    +    // only available when refraction is enabled
    +    float transmission;         // default: 1.0
    +    float3 absorption;          // default float3(0.0, 0.0, 0.0)
    +    float ior;                  // default: 1.5
    +    float microThickness;       // default: 0.0, not available with refractionType "solid"
    +}
    +   

    Custom surface shading

    +

    + +When customSurfaceShading is set to true in the material block, the fragment block must +declare and implement the surfaceShading function: +

    fragment {
    +    void material(inout MaterialInputs material) {
    +        prepareMaterial(material);
    +        // prepare material inputs
    +    }
    +
    +    vec3 surfaceShading(
    +        const MaterialInputs materialInputs,
    +        const ShadingData shadingData,
    +        const LightData lightData
    +    ) {
    +        return vec3(1.0); // output of custom lighting
    +    }
    +}

    +This function will be invoked for every light (directional, spot or point) in the scene that may +influence the current fragment. The surfaceShading is invoked with 3 sets of data: +

    +

      +
    • MaterialInputs, as described in the Material fragment inputs section and prepared in the + material function explained above +
    • +
    • ShadingData, a structure containing values derived from MaterialInputs (see below) +
    • +
    • LightData, a structure containing values specific to the light being currently + evaluated (see below)
    +

    +The surfaceShading function must return an RGB color in linear sRGB. Alpha blending and alpha +masking are handled outside of this function and must therefore be ignored. +

    +

    About shadowed fragments
    +

    + The surfaceShading function is invoked even when a fragment is known to be fully in the shadow + of the current light (lightData.NdotL <= 0.0 or lightData.visibility <= 0.0). This gives + more flexibility to the surfaceShading function as it provides a simple way to handle constant + ambient lighting for instance.

    +

    +

    Shading models
    +

    + Custom surface shading only works with the lit shading model. Attempting to use any other + model will result in an error.

    +

    +   

    Shading data structure

    +
    struct ShadingData {
    +    // The material's diffuse color, as derived from baseColor and metallic.
    +    // This color is pre-multiplied by alpha and in the linear sRGB color space.
    +    vec3  diffuseColor;
    +
    +    // The material's specular color, as derived from baseColor and metallic.
    +    // This color is pre-multiplied by alpha and in the linear sRGB color space.
    +    vec3  f0;
    +
    +    // The perceptual roughness is the roughness value set in MaterialInputs,
    +    // with extra processing:
    +    // - Clamped to safe values
    +    // - Filtered if specularAntiAliasing is enabled
    +    // This value is between 0.0 and 1.0.
    +    float perceptualRoughness;
    +
    +    // The roughness value expected by BRDFs. This value is the square of
    +    // perceptualRoughness. This value is between 0.0 and 1.0.
    +    float roughness;
    +};
    +   

    Light data structure

    +
    struct LightData {
    +    // The color (.rgb) and pre-exposed intensity (.w) of the light.
    +    // The color is an RGB value in the linear sRGB color space.
    +    // The pre-exposed intensity is the intensity of the light multiplied by
    +    // the camera's exposure value.
    +    vec4  colorIntensity;
    +
    +    // The normalized light vector, in world space (direction from the
    +    // current fragment's position to the light).
    +    vec3  l;
    +
    +    // The dot product of the shading normal (with normal mapping applied)
    +    // and the light vector. This value is equal to the result of
    +    // saturate(dot(getWorldSpaceNormal(), lightData.l)).
    +    // This value is always between 0.0 and 1.0. When the value is <= 0.0,
    +    // the current fragment is not visible from the light and lighting
    +    // computations can be skipped.
    +    float NdotL;
    +
    +    // The position of the light in world space.
    +    vec3  worldPosition;
    +
    +    // Attenuation of the light based on the distance from the current
    +    // fragment to the light in world space. This value between 0.0 and 1.0
    +    // is computed differently for each type of light (it's always 1.0 for
    +    // directional lights).
    +    float attenuation;
    +
    +    // Visibility factor computed from shadow maps or other occlusion data
    +    // specific to the light being evaluated. This value is between 0.0 and
    +    // 1.0.
    +    float visibility;
    +};
    +   

    Example

    +

    + +The material below shows how to use custom surface shading to implement a simplified toon shader: +

    material {
    +    name : Toon,
    +    shadingModel : lit,
    +    parameters : [
    +        {
    +            type : float3,
    +            name : baseColor
    +        }
    +    ],
    +    customSurfaceShading : true
    +}
    +
    +fragment {
    +    void material(inout MaterialInputs material) {
    +        prepareMaterial(material);
    +        material.baseColor.rgb = materialParams.baseColor;
    +    }
    +
    +    vec3 surfaceShading(
    +            const MaterialInputs materialInputs,
    +            const ShadingData shadingData,
    +            const LightData lightData
    +    ) {
    +        // Number of visible shade transitions
    +        const float shades = 5.0;
    +        // Ambient intensity
    +        const float ambient = 0.1;
    +
    +        float toon = max(ceil(lightData.NdotL * shades) / shades, ambient);
    +
    +        // Shadowing and attenuation
    +        toon *= lightData.visibility * lightData.attenuation;
    +
    +        // Color and intensity
    +        vec3 light = lightData.colorIntensity.rgb * lightData.colorIntensity.w;
    +
    +        return shadingData.diffuseColor * light * toon;
    +    }
    +}

    +The result can be seen in figure 41. +

    +

     
    Figure 41: simple toon shading implemented with custom +
    +

    +   

    Shader public APIs

    +   

    Types

    +

    + +While GLSL types can be used directly (vec4 or mat4) we recommend the use of the following +type aliases: +

    + + + + + + + + + + + + + + +
    Name GLSL type Description
    bool2 bvec2 A vector of 2 booleans
    bool3 bvec3 A vector of 3 booleans
    bool4 bvec4 A vector of 4 booleans
    int2 ivec2 A vector of 2 integers
    int3 ivec3 A vector of 3 integers
    int4 ivec4 A vector of 4 integers
    uint2 uvec2 A vector of 2 unsigned integers
    uint3 uvec3 A vector of 3 unsigned integers
    uint4 uvec4 A vector of 4 unsigned integers
    float2 float2 A vector of 2 floats
    float3 float3 A vector of 3 floats
    float4 float4 A vector of 4 floats
    float4×4 mat4 A 4×4 float matrix
    float3×3 mat3 A 3×3 float matrix
    +

    +   

    Math

    +

    +

    + + + + + + + + +
    Name Type Description
    PI float A constant that represent \(\pi\)
    HALF_PI float A constant that represent \(\frac{\pi}{2}\)
    saturate(float x) float Clamps the specified value between 0.0 and 1.0
    pow5(float x) float Computes \(x^5\)
    sq(float x) float Computes \(x^2\)
    max3(float3 v) float Returns the maximum value of the specified float3
    mulMat4×4Float3(float4×4 m, float3 v) float4 Returns \(m * v\)
    mulMat3×3Float3(float4×4 m, float3 v) float4 Returns \(m * v\)
    +

    +   

    Matrices

    +

    +

    + + + + + + +
    Name Type Description
    getViewFromWorldMatrix() float4×4 Matrix that converts from world space to view/eye space
    getWorldFromViewMatrix() float4×4 Matrix that converts from view/eye space to world space
    getClipFromViewMatrix() float4×4 Matrix that converts from view/eye space to clip (NDC) space
    getViewFromClipMatrix() float4×4 Matrix that converts from clip (NDC) space to view/eye space
    getClipFromWorldMatrix() float4×4 Matrix that converts from world to clip (NDC) space
    getWorldFromClipMatrix() float4×4 Matrix that converts from clip (NDC) space to world space
    +

    +   

    Frame constants

    +

    +

    + + + + + + + + + +
    Name Type Description
    getResolution() float4 Dimensions of the view's effective (physical) viewport in pixels: width, height, 1 / width, 1 / height. This might be different from View::getViewport() for instance because of added rendering guard-bands.
    getWorldCameraPosition() float3 Position of the camera/eye in world space (see note below)
    getWorldOffset() float3 [deprecated] The shift required to obtain API-level world space. Use getUserWorldPosition() instead
    getUserWorldFromWorldMatrix() float4×4 Matrix that converts from world space to API-level (user) world space.
    getTime() float Current time as a remainder of 1 second. Yields a value between 0 and 1
    getUserTime() float4 Current time in seconds: time, (double)time - time, 0, 0
    getUserTimeMod(float m) float Current time modulo m in seconds
    getExposure() float Photometric exposure of the camera
    getEV100() float Exposure value at ISO 100 of the camera
    +

    +

    world space
    +

    + To achieve good precision, the “world space” in Filament's shading system does not necessarily + match the API-level world space. To obtain the position of the API-level camera, custom + materials can use getUserWorldFromWorldMatrix() to transform getWorldCameraPosition().

    +

    +   

    Material globals

    +

    +

    + + + + +
    Name Type Description
    getMaterialGlobal0() float4 A vec4 visible by all materials, its value is set by View::setMaterialGlobal(0, float4). Its default value is {0,0,0,1}.
    getMaterialGlobal1() float4 A vec4 visible by all materials, its value is set by View::setMaterialGlobal(1, float4). Its default value is {0,0,0,1}.
    getMaterialGlobal2() float4 A vec4 visible by all materials, its value is set by View::setMaterialGlobal(2, float4). Its default value is {0,0,0,1}.
    getMaterialGlobal3() float4 A vec4 visible by all materials, its value is set by View::setMaterialGlobal(3, float4). Its default value is {0,0,0,1}.
    +

    +   

    Vertex only

    +

    + +The following APIs are only available from the vertex block: +

    + + + + + + +
    Name Type Description
    getPosition() float4 Vertex position in the domain defined by the material (default: object/model space)
    getCustom0() to getCustom7() float4 Custom vertex attribute
    getWorldFromModelMatrix() float4×4 Matrix that converts from model (object) space to world space
    getWorldFromModelNormalMatrix() float3×3 Matrix that converts normals from model (object) space to world space
    getVertexIndex() int Index of the current vertex
    getEyeIndex() int Index of the eye being rendered, starting at 0
    +

    +   

    Fragment only

    +

    + +The following APIs are only available from the fragment block: +

    + + + + + + + + + + + + + + + + + + +
    Name Type Description
    getWorldTangentFrame() float3×3 Matrix containing in each column the tangent (frame[0]), bi-tangent (frame[1]) and normal (frame[2]) of the vertex in world space. If the material does not compute a tangent space normal for bump mapping or if the shading is not anisotropic, only the normal is valid in this matrix.
    getWorldPosition() float3 Position of the fragment in world space (see note below about world-space)
    getUserWorldPosition() float3 Position of the fragment in API-level (user) world-space (see note below about world-space)
    getWorldViewVector() float3 Normalized vector in world space from the fragment position to the eye
    getWorldNormalVector() float3 Normalized normal in world space, after bump mapping (must be used after prepareMaterial())
    getWorldGeometricNormalVector() float3 Normalized normal in world space, before bump mapping (can be used before prepareMaterial())
    getWorldReflectedVector() float3 Reflection of the view vector about the normal (must be used after prepareMaterial())
    getNormalizedViewportCoord() float3 Normalized user viewport position (i.e. NDC coordinates normalized to [0, 1] for the position, [1, 0] for the depth), can be used before prepareMaterial()). Because the user viewport is smaller than the actual physical viewport, these coordinates can be negative or superior to 1 in the non-visible area of the physical viewport.
    getNdotV() float The result of dot(normal, view), always strictly greater than 0 (must be used after prepareMaterial())
    getColor() float4 Interpolated color of the fragment, if the color attribute is required
    getUV0() float2 First interpolated set of UV coordinates, only available if the uv0 attribute is required
    getUV1() float2 First interpolated set of UV coordinates, only available if the uv1 attribute is required
    getMaskThreshold() float Returns the mask threshold, only available when blending is set to masked
    inverseTonemap(float3) float3 Applies the inverse tone mapping operator to the specified linear sRGB color and returns a linear sRGB color. This operation may be an approximation and works best with the “Filmic” tone mapping operator
    inverseTonemapSRGB(float3) float3 Applies the inverse tone mapping operator to the specified non-linear sRGB color and returns a linear sRGB color. This operation may be an approximation and works best with the “Filmic” tone mapping operator
    luminance(float3) float Computes the luminance of the specified linear sRGB color
    ycbcrToRgb(float, float2) float3 Converts a luminance and CbCr pair to a sRGB color
    uvToRenderTargetUV(float2) float2 Transforms a UV coordinate to allow sampling from a RenderTarget attachment
    +

    +

    world-space
    +

    + To obtain API-level world-space coordinates, custom materials should use getUserWorldPosition() + or use getUserWorldFromWorldMatrix(). Note that API-level world-space coordinates should + never or rarely be used because they may not fit in a float3 or have severely reduced precision.

    +

    +

    sampling from render targets
    +

    + When sampling from a filament::Texture that is attached to a filament::RenderTarget for + materials in the surface domain, please use uvToRenderTargetUV to transform the texture + coordinate. This will flip the coordinate depending on which backend is being used.

    +

    +   

    Compiling materials

    +

    + +Material packages can be compiled from material definitions using the command line tool called +matc. The simplest way to use matc is to specify an input material definition (car_paint.mat +in the example below) and an output material package (car_paint.filamat in the example below): +

    $ matc -o ./materials/bin/car_paint.filamat ./materials/src/car_paint.mat
    +   

    Shader validation

    +

    + +matc attempts to validate shaders when compiling a material package. The example below shows an +example of an error message generated when compiling a material definition containing a typo in the +fragment shader (metalic instead of metallic). The reported line numbers are line numbers in the +source material definition file. +

    ERROR: 0:13: 'metalic' : no such field in structure
    +ERROR: 0:13: '' : compilation terminated
    +ERROR: 2 compilation errors.  No code generated.
    +
    +Could not compile material metal.mat
    +   

    Flags

    +

    + +The command line flags relevant to application development are described in table 16. +

    +  + + + + + + +
    Flag Value Usage
    -o, —output [path] Specify the output file path
    -p, —platform desktop/mobile/all Select the target platform(s)
    -a, —api opengl/vulkan/all Specify the target graphics API
    -S, —optimize-size N/A Optimize compiled material for size instead of just performance
    -r, —reflect parameters Outputs the specified metadata as JSON
    -v, —variant-filter [variant] Filters out the specified, comma-separated variants
    Table 16: List of matc flags
    +

    +matc offers a few other flags that are irrelevant to application developers and for internal +use only. +

    +   

    —platform

    +

    + +By default, matc generates material packages containing shaders for all supported platforms. If +you wish to reduce the size of your material packages, it is recommended to select only the +appropriate target platform. For instance, to compile a material package for Android only, run +the following command: +

    $ matc -p mobile -o ./materials/bin/car_paint.filamat ./materials/src/car_paint.mat
    +   

    —api

    +

    + +By default, matc generates material packages containing shaders for the OpenGL API. You can choose +to generate shaders for the Vulkan API in addition to the OpenGL shaders. If you intend on targeting +only Vulkan capable devices, you can reduce the size of the material packages by generating only +the set of Vulkan shaders: +

    $ matc -a vulkan -o ./materials/bin/car_paint.filamat ./materials/src/car_paint.mat
    +   

    —optimize-size

    +

    + +This flag applies fewer optimization techniques to try and keep the final material as small as +possible. If the compiled material is deemed too large by default, using this flag might be +a good compromise between runtime performance and size. +

    +   

    —reflect

    +

    + +This flag was designed to help build tools around matc. It allows you to print out specific +metadata in JSON format. The example below prints out the list of parameters defined in Filament's +standard skybox material. It produces a list of 2 parameters, named showSun and skybox, +respectively a boolean and a cubemap texture. +

    $ matc --reflect parameters filament/src/materials/skybox.mat 
    +{
    +  "parameters": [
    +    {
    +      "name": "showSun",
    +      "type": "bool",
    +      "size": "1"
    +    },
    +    {
    +      "name": "skybox",
    +      "type": "samplerCubemap",
    +      "format": "float",
    +      "precision": "default"
    +    }
    +  ]
    +}
    +   

    —variant-filter

    +

    + +This flag can be used to further reduce the size of a compiled material. It is used to specify a +list of shader variants that the application guarantees will never be needed. These shader variants +are skipped during the code generation phase of matc, thus reducing the overall size of the +material. +

    +The variants must be specified as a comma-separated list, using one of the following available +variants: +

    +

      +
    • directionalLighting, used when a directional light is present in the scene +
    • +
    • dynamicLighting, used when a non-directional light (point, spot, etc.) is present in the scene +
    • +
    • shadowReceiver, used when an object can receive shadows +
    • +
    • skinning, used when an object is animated using GPU skinning or vertex morphing +
    • +
    • fog, used when global fog is applied to the scene +
    • +
    • vsm, used when VSM shadows are enabled and the object is a shadow receiver +
    • +
    • ssr, used when screen-space reflections are enabled in the View
    +

    +Example: +

    --variant-filter=skinning,shadowReceiver

    +Note that some variants may automatically be filtered out. For instance, all lighting related +variants (directionalLighting, etc.) are filtered out when compiling an unlit material. +

    +When this flag is used, the specified variant filters are merged with the variant filters specified +in the material itself. +

    +Use this flag with caution, filtering out a variant required at runtime may lead to crashes. +

    +   

    Handling colors

    +   

    Linear colors

    +

    + +If the color data comes from a texture, simply make sure you use an sRGB texture to benefit from +automatic hardware conversion from sRGB to linear. If the color data is passed as a parameter to +the material you can convert from sRGB to linear by running the following algorithm on each +color channel: +

    float sRGB_to_linear(float color) {
    + return color <= 0.04045 ? color / 12.92 : pow((color + 0.055) / 1.055, 2.4);
    +}

    +Alternatively you can use one of the two cheaper but less accurate versions shown below: +

    // Cheaper
    +linearColor = pow(color, 2.2);
    +// Cheapest
    +linearColor = color * color;
    +   

    Pre-multiplied alpha

    +

    + +A color uses pre-multiplied alpha if its RGB components are multiplied by the alpha channel: +

    // Compute pre-multiplied color
    +color.rgb *= color.a;

    +If the color is sampled from a texture, you can simply ensure that the texture data is +pre-multiplied ahead of time. On Android, any texture uploaded from a +Bitmap will be +pre-multiplied by default. +

    +   

    Sampler usage in Materials

    +

    + +The number of usable sampler parameters (e.g.: type is sampler2d) in materials is limited and +depends on the material properties, shading model, feature level and variant filter. +

    +   

    Feature level 1 and 2

    +

    + +unlit materials can use up to 12 samplers by default. +

    +lit materials can use up to 9 samplers by default, however if refractionMode or reflectionMode +is set to screenspace that number is reduced to 8. +

    +Finally if variantFilter contains the fog filter, an extra sampler is made available, such that +unlit materials can use up to 13 and lit materials up to 10 samplers by default. +

    +   

    Feature level 3

    +

    + +16 samplers are available. +

    +

    external samplers
    +

    + Be aware that external samplers account for 2 regular samplers.

    +

    +

    formatted by Markdeep 1.18  
    \ No newline at end of file diff --git a/docs_src/src/notes/README.md b/docs_src/src/notes/README.md new file mode 100644 index 00000000000..32856227d9c --- /dev/null +++ b/docs_src/src/notes/README.md @@ -0,0 +1,3 @@ +# Technical Notes + +Documents that pertain to components and use cases of the project. \ No newline at end of file diff --git a/docs_src/src/notes/debugging.md b/docs_src/src/notes/debugging.md new file mode 100644 index 00000000000..0301348cdf8 --- /dev/null +++ b/docs_src/src/notes/debugging.md @@ -0,0 +1,3 @@ +# Debugging + +Helpful documents for specific debugging needs. diff --git a/docs_src/src/notes/libs.md b/docs_src/src/notes/libs.md new file mode 100644 index 00000000000..2417ed94364 --- /dev/null +++ b/docs_src/src/notes/libs.md @@ -0,0 +1,3 @@ +# Libraries + +Collection of README.md from the `/libs` folder. \ No newline at end of file diff --git a/docs_src/src/notes/metal_debugging.md b/docs_src/src/notes/metal_debugging.md new file mode 100644 index 00000000000..91548cb0f05 --- /dev/null +++ b/docs_src/src/notes/metal_debugging.md @@ -0,0 +1,42 @@ +# Debugging Metal + +## Enable Metal Validation + +To enable the Metal validation layers when running a sample through the command-line, set the +following environment variable: + +``` +export METAL_DEVICE_WRAPPER_TYPE=1 +``` + +You should then see the following output when running a sample with the Metal backend: + +``` +2020-10-13 18:01:44.101 gltf_viewer[73303:4946828] Metal API Validation Enabled +``` + +## Metal Frame Capture from gltf_viewer + +To capture Metal frames from within gltf_viewer: + +### 1. Create an Info.plist file + +Create an `Info.plist` file in the same directory as `gltf_viewer` (`cmake/samples`). Set its +contents to: + +``` + + + + + MetalCaptureEnabled + + + +``` + +### 2. Capture a frame + +Run gltf_viewer as normal, and hit the "Capture frame" button under the Debug menu. The captured +frame will be saved to `filament.gputrace` in the current working directory. This file can then be +opened with Xcode for inspection. diff --git a/docs_src/src/notes/spirv_debugging.md b/docs_src/src/notes/spirv_debugging.md new file mode 100644 index 00000000000..047fe3bc2ae --- /dev/null +++ b/docs_src/src/notes/spirv_debugging.md @@ -0,0 +1,199 @@ +# Investigating SPIRV-Cross / SPIRV-Tools issues + +There are 4 repositories at play here: +- [KhronosGroup/glslang](https://github.com/KhronosGroup/glslang) +- [KhronosGroup/spirv-tools](https://github.com/KhronosGroup/SPIRV-Tools) +- [KhronosGroup/spirv-cross](https://github.com/KhronosGroup/SPIRV-Cross) +- [KhronosGroup/SPIRV-Headers](https://github.com/KhronosGroup/SPIRV-Headers) + +Typically, the bug is present either in spirv-tools or spirv-cross. + +## Build and install command-line tools on PATH + +The goal is to replicate the bug outside of Filament, so we're going to use command-line versions of +the SPIRV tools. + +### Clone and build each repo + +Note: Filament checks-out versions of these repositories inside `third_party/`; however, I've found +it easiser to check out fresh copies separately so I can simply `git pull` to get the latest +versions. Furthermore, Filament has modified some of these repositories locally for its own use +case. Checking them out separately "proves" that the issue isn't Filament-specific. + +``` +git clone git@github.com:KhronosGroup/SPIRV-Tools.git +git clone git@github.com:KhronosGroup/SPIRV-Cross.git +git clone git@github.com:KhronosGroup/glslang.git +git clone git@github.com:KhronosGroup/SPIRV-Headers.git SPIRV-Tools/external/SPIRV-Headers + +cd SPIRV-Tools/ +mkdir build && cmake . -G Ninja -B build +ninja -C build +cd .. + +cd SPIRV-Cross/ +mkdir build && cmake . -G Ninja -B build +ninja -C build +cd .. + +cd glslang/ +mkdir build && cmake . -G Ninja -B build +ninja -C build +cd .. +``` + +### Add directories to PATH + +``` +export PATH=`pwd`/SPIRV-Tools/build/tools:$PATH +export PATH=`pwd`/glslang/build/StandAlone:$PATH +export PATH=`pwd`/spirv-cross/build:$PATH +``` + +Ensure the following tools now exist on your PATH: + +1. `glslangValidator` +2. `spiv-opt` +3. `spirv-val` +4. `spirv-cross` + +## Isolate the problematic GLSL shader + +First determine the Filament material and variant that causes the problem. + +What we want is the "raw" GLSL version of the shader, before any optimizations / cross-compilation +happens. + +We can use the `--save-raw-variants` debug flag in matc to export each GLSL +shader to a file. For example: + +``` +matc --save-raw-variants --optimize-size --variant-filter fog,ssr,vsm,stereo \ + -a all -p all -o mymaterial.filamat mymaterial.mat +``` + +Files will be named like `mymaterial_0x05.frag` or `mymaterial_0x05.vert`. + +Note that gltfio material "templates" first go through a build step. After building gltfio, the +gltfio Filament materials are output to: + +``` +out/cmake-release/libs/gltfio/*.mat +``` + +One of these materials can be compiled with the following command: + +``` +matc \ + -TCUSTOM_PARAMS="// no custom params" \ + -TCUSTOM_VERTEX="// no custom vertex" \ + -TCUSTOM_FRAGMENT="// no custom fragment" \ + -TDOUBLESIDED=false \ + -TTRANSPARENCY=default \ + -TSHADINGMODEL=unlit \ + -TBLENDING=opaque \ + --platform mobile --api metal -o temp.filamat \ + unlit_opaque.mat +``` + +## Reproduce the compilation error + +The goal is to generate a .spv file that doesn't pass validation (through the spirv-val tool). + +Reproducing the error usually involves a few steps: + +1. Compile the raw GLSL shader into SPIR-V. + +``` +glslangValidator -V -o unoptimized.spv in.frag +``` + +2. Optimize for performance. + +``` +spirv-opt -Oconfig=optimizations.cfg unoptimized.spv -o optimized.spv +``` + +See [optimizations.cfg](optimizations.cfg) for a template. This file should contain the same list of optimizations that +Filament employs. This should match the same optimizations specified in `GLSLPostProcessor`, for +example, `GLSLPostProcessor::registerPerformancePasses` or `GLSLPostProcessor::registerSizePasses`. + +3. For shaders targeting Metal, convert relaxed ops to half. + +``` +spirv-opt \ + --convert-relaxed-to-half \ + --simplify-instructions \ + --redundancy-elimination \ + --eliminate-dead-code-aggressive \ + optimized.spv \ + -o half.spv +``` + +4. Finally, validate the final SPIR-V. + +``` +spirv-val half.spv +``` + +5. Sometimes validation will still pass, but still generate invalid shaders after cross-compiling. + In these cases, you'll need to cross compile to the target language and manually pick out errors + in the generated shader. + +``` +# for OpenGL +spirv-cross optimized.spv > optimized.frag + +# for OpenGL ES +spirv-cross --es optimized.spv > optimized.frag + +# for MSL +spirv-cross --msl optimized.spv > optimized.metal +``` + +To invoke Apple's compiler to compile MSL, you can run: + +``` +xcrun -sdk macosx metal -c optimized.metal -o /dev/null +``` + +## Clean up the shader for a bug report + +These commands will run the preprocessor only on `in.frag`, and remove any empty lines. + +``` +glslangValidator -E in.frag > preprocessed.frag +sed '/^$/d' preprocessed.frag > preprocessed_small.frag +``` + +You can also run `clang-format` on the preprocessed shader to make it easier to read: + +``` +clang-format -i preprocessed_small.frag +``` + +I always try to "whittle down" the shader to a smaller version that still reproduces the error. This +might make it a bit easier on the Khronos team to diagnose the issue. I typically follow these steps +in a loop until I'm satisfied: + +1. Delete an unnecessary part of the shader +2. Run the steps to reproduce the error +3. If the error still reproduces, repeat +4. Otherwise, undo the change and make a smaller change + +There's also a [Reducer](https://github.com/KhronosGroup/SPIRV-Tools#reducer) tool that's part of +SPIRV-Tools which can be used to automate these steps. I haven't experimented much with this, but it +seems promising. + +## Submit an Issue with the relevant Khronos repository + +See some example issues that have been filed in the past: + +- https://github.com/KhronosGroup/SPIRV-Cross/issues/1935 +- https://github.com/KhronosGroup/SPIRV-Cross/issues/1088 +- https://github.com/KhronosGroup/SPIRV-Cross/issues/1026 +- https://github.com/KhronosGroup/SPIRV-Tools/issues/4452 +- https://github.com/KhronosGroup/SPIRV-Tools/issues/3406 +- https://github.com/KhronosGroup/SPIRV-Tools/issues/3099 +- https://github.com/KhronosGroup/SPIRV-Tools/issues/5044 + diff --git a/filament/docs/optimizations.cfg b/docs_src/src/notes/spirv_debugging_optimizations.cfg similarity index 100% rename from filament/docs/optimizations.cfg rename to docs_src/src/notes/spirv_debugging_optimizations.cfg diff --git a/docs_src/src/notes/tools.md b/docs_src/src/notes/tools.md new file mode 100644 index 00000000000..001db45daf5 --- /dev/null +++ b/docs_src/src/notes/tools.md @@ -0,0 +1,3 @@ +# Tools + +Collection of README.md from the `/tools` folder. \ No newline at end of file diff --git a/filament/docs/Versioning.md b/docs_src/src/notes/versioning.md similarity index 100% rename from filament/docs/Versioning.md rename to docs_src/src/notes/versioning.md diff --git a/docs_src/src/notes/vulkan_debugging.md b/docs_src/src/notes/vulkan_debugging.md new file mode 100644 index 00000000000..9120d5c6ba0 --- /dev/null +++ b/docs_src/src/notes/vulkan_debugging.md @@ -0,0 +1,15 @@ +# Debugging Vulkan + +## Enable Validation Logs + +Simply install the LunarG SDK (it's fast and easy), then make sure you've got the following +environment variables set up in your **bashrc** file. For example: + +``` +export VULKAN_SDK='/path_to_home/VulkanSDK/1.3.216.0/x86_64' +export VK_LAYER_PATH="$VULKAN_SDK/etc/explicit_layer.d" +export PATH="$VULKAN_SDK/bin:$PATH" +``` + +As long as you're running a debug build of Filament, you should now see extra debugging spew in your +console if there are any errors or performance issues being caught by validation. diff --git a/docs_src/src/samples/README.md b/docs_src/src/samples/README.md new file mode 100644 index 00000000000..3d9213b7386 --- /dev/null +++ b/docs_src/src/samples/README.md @@ -0,0 +1,5 @@ +# Tutorials and Samples + +New users of Filament are encouraged to peruse through the samples to get a better +understanding of basic API usage. Additionally, you will find detailed tutorials +for [iOS](ios.md) and [web](web.md). \ No newline at end of file diff --git a/docs_src/src/samples/ios.md b/docs_src/src/samples/ios.md new file mode 100644 index 00000000000..081a8bb60c6 --- /dev/null +++ b/docs_src/src/samples/ios.md @@ -0,0 +1,504 @@ +# CocoaPods Hello Triangle + +As of release 1.8.0, you can install Filament in your iOS application using CocoaPods. + +This guide will walk you through creating a basic "hello triangle" iOS application using Filament and the Metal backend. + +![a rotating triangle](../images/ios_sample/rotating-triangle.gif) + +The full source for this example is [here](https://github.com/google/filament/tree/main/ios/samples/HelloCocoaPods). If you're just looking to get something up and running quickly, download the project, `pod install`, build, and run. + +We'll be walking through 7 steps to get the rotating triangle up and running. All of the code we'll be writing will be in a single ViewController.mm file, and you can follow along [here](https://github.com/google/filament/blob/main/ios/samples/HelloCocoaPods/HelloCocoaPods/ViewController.mm). + +- [1. Creating a Boilerplate App]("#creating-a-boilerplate-app-with-filament) +- [2. Instantiating Filament](#instantiating-the-filament-engine) +- [3. Creating a SwapChain](#creating-a-swapchain) +- [4. Clearing the Screen](#clearing-the-screen) +- [5. Drawing a Triangle](#drawing-a-triangle) +- [6. Compiling a Custom Material](#compiling-a-custom-material) +- [7. Animating the Triangle](#animating-the-triangle) + +## Creating a Boilerplate App with Filament + +We'll start fresh by creating a new Single View App in Xcode. + +![create a single view app in Xcodde](../images/ios_sample/single-view-app.png) + +Give your app a name, and use the default options. + +![use the default options in Xcode](../images/ios_sample/default-options.png) + +If you haven't used CocoaPods before, I recommend watching [this Route 85 video](https://www.youtube.com/watch?v=iEAjvNRdZa0) to help you get set up. + +Create a Podfile in the Xcode project directory with the following: + +``` +platform :ios, '11.0' + +target 'HelloCocoaPods' do + pod 'Filament' +end +``` + +Then run: + +```shell +pod install +``` + +Close the project and then re-open the newly created HelloCocoaPods.xcworkspace file. + +## Instantiating the Filament Engine + +Before we do anything with Filament, we first need to include the appropriate headers. Filament exposes a C++ API, so any files that include Filament headers need to be compiled in a variant of C++. We'll be using Objective-C++. + +You should be able to simply change the extension of the default ViewController from .m to .mm, though I've found Xcode to be buggy with this on occasion. To make sure Xcode recognizes it as an Objective-C++ file, check that the type of file is "Objective-C++ Source". + +![change the type of ViewController.m to Objective-C++](../images/ios_sample/obj-cpp.png) + +Then, add the following to the top of ViewController. + +```obj-c +#include + +using namespace filament; +``` + +We'll need to keep track of a few Filament objects, so let's add a section for private instance variables and add a pointer for our `Engine` instance. + +```obj-c +@implementation Viewcontroller { + Engine* _engine; +} +``` + +The Filament `Engine` is our main entrypoint into Filament. We start by instantiating it inside `viewDidLoad`. + +```obj-c +- (void)viewDidLoad { + [super viewDidLoad]; + + _engine = Engine::create(Engine::Backend::METAL); +} +``` + +We specify `Engine::Backend::METAL` to select the Metal backend. Filament also supports OpenGL on iOS, but we strongly recommend sticking to Metal. + +Every Filament object we create must also be destroyed. Add the `dealloc` method and the following: + +```obj-c +- (void)dealloc { + _engine->destroy(&_engine); +} +``` + +If you compile and run the app now you should see output similar to the following: + +``` +FEngine (64 bits) created at 0x10ab94000 (threading is enabled) +FEngine resolved backend: Metal +``` + +## Creating a SwapChain + +Before we can render anything, we'll first need to create a `SwapChain`. The `SwapChain` represents a platform-specific surface that can be rendered into. On iOS with Metal, it's a [`CAMetalLayer`](https://developer.apple.com/documentation/quartzcore/cametallayer). + +We could set up our own `CAMetalLayer` if we wanted to, but Apple provides a `MTKView` that is already backed by a `CAMetalLayer`. It also has a delegate protocol with some methods that will make things easier for us. + +Inside Main.storyboard, change the type of ViewController's view to a `MTKView`. + +![ViewController view](../images/ios_sample/view.png) + +![change type of MTKView](../images/ios_sample/mtkview.gif) + +Include the SwapChain.h and MTKView.h headers and make the `ViewController` conform to the `MTKViewDelegate` protocol. + +```obj-c +#include + +#import + +@interface ViewController () + +@end +``` + +Add a new private var: + +```obj-c +SwapChain* _swapChain; +``` + +Inside `viewDidLoad`, we'll set our `ViewController` as the `MTKView` delegate and instantiate our `SwapChain`. To instantiate the `SwapChain`, we pass in `view.layer` which, because we set our `View` to a `MTKView`, will be a `CAMetalLayer`. Filament's API is platform-agnostic, which is why we need to cast the layer to a `void*`. + +```obj-c +MTKView* mtkView = (MTKView*) self.view; +mtkView.delegate = self; +_swapChain = _engine->createSwapChain((__bridge void*) mtkView.layer); +``` + +The `SwapChain` needs to be destroyed in our `dealloc` function. We'll destroy the objects in the reverse order we created them; the `Engine` object should always be the the last object we destroy. + +```obj-c +_engine->destroy(_swapChain); +_engine->destroy(&_engine); +``` + +Finally, add stubs for some `MTKViewDelegate` methods, which we'll fill in later. + +```obj-c +- (void)mtkView:(nonnull MTKView*)view drawableSizeWillChange:(CGSize)size { + // todo +} + +- (void)drawInMTKView:(nonnull MTKView*)view { + // todo +} +``` + +## Clearing The Screen + +We now have a Filament `Engine` and `SwapChain` set up. We'll need a few more objects before we can render anything. + +A Filament `Renderer` gives us an API to render frames into the `SwapChain`. It takes a `View`, which defines a `Viewport`, `Scene` and `Camera` for rendering. The `Camera` represents a vantage point into a `Scene`, which contains references to all the entities we want to render. + +Creating these are objects is straightforward. First, include the appropriate headers + +```c++ +#include +#include +#include +#include +#include + +#include +#include + +using namespace utils; +``` + +add the following private vars + +```obj-c +Renderer* _renderer; +View* _view; +Scene* _scene; +Camera* _camera; +Entity _cameraEntity; +``` + +and then instantiate them + +```obj-c +_renderer = _engine->createRenderer(); +_view = _engine->createView(); +_scene = _engine->createScene(); +``` + +The camera is a bit special. Filament uses an entity-component system, so we'll first need to create an `Entity` which we then attach a `Camera` component to. + +```obj-c +_cameraEntity = EntityManager::get().create(); +_camera = _engine->createCamera(_cameraEntity); +``` + +Let's also inform our `Renderer` to clear to a light blue clear color, so we can know everything is working. + +```obj-c +_renderer->setClearOptions({ + .clearColor = {0.25f, 0.5f, 1.0f, 1.0f}, + .clear = true +}); +``` + +The `Camera` and `Scene` need to be wired up to the `View`. + +```obj-c +_view->setScene(_scene); +_view->setCamera(_camera); +``` + +Our newly created objects get cleaned up inside `dealloc`. + +```obj-c +_engine->destroyCameraComponent(_cameraEntity); +EntityManager::get().destroy(_cameraEntity); +_engine->destroy(_scene); +_engine->destroy(_view); +_engine->destroy(_renderer); +``` + +We need to set the `Viewport` on our `View`, which we want to do whenever the size of our `SwapChain` changes. We'll also update the projection matrix on our camera. + +Let's create a new method, `resize:`, which will update the `Viewport` on our `View` to a given size. We'll call it in the `mtkView:drawableSizeWillChange:` delegate method, and at the end of `viewDidLoad`: + +```obj-c +- (void)resize:(CGSize)size { + _view->setViewport({0, 0, (uint32_t) size.width, (uint32_t) size.height}); + + const double aspect = size.width / size.height; + const double left = -2.0 * aspect; + const double right = 2.0 * aspect; + const double bottom = -2.0; + const double top = 2.0; + const double near = 0.0; + const double far = 1.0; + _camera->setProjection(Camera::Projection::ORTHO, left, right, bottom, top, near, far); +} + +- (void)viewDidLoad { + ... + + // Give our View a starting size based on the drawable size. + [self resize:mtkView.drawableSize]; +} + +- (void)mtkView(nonnull MTKView*)view drawableSizeWillChange:(CGSize)size { + [self resize:size]; +} +``` + +Lastly, in order to render, we'll call a few Filament API methods inside the `drawInMTKView:` method: + +```obj-c +- (void)drawInMTKView:(nonnull MTKView*)view { + if (_renderer->beginFrame(_swapChain)) { + _renderer->render(_view); + _renderer->endFrame(); + } +} +``` + +The `beginFrame` method instructs Filament to start rendering to our specific `SwapChain` instance. It returns `true` if the engine is ready for another frame. It returns `false` to signal us to skip this frame, which could happen if we're sending frames down too quickly for the GPU to process. + +At this point, you should be able to build and run the app, and you'll see a blue screen. + +![blue screen after clearing](../images/ios_sample/blue-screen.png) + +## Drawing a Triangle + +In order to draw a triangle, we need to create vertex and index buffers to define its geometry. We'll then create a `Renderable` component. + +We'll start by including some additional headers and adding a few new private vars: + +```obj-c +#include +#include +#include + +... + +VertexBuffer* _vertexBuffer; +IndexBuffer* _indexBuffer; +Entity _triangle; +``` + +First, we'll define the data for a single vertex. + +```obj-c +struct Vertex { + math::float2 position; + math::float3 color; +}; +``` + +Creating a `VertexBuffer` and `IndexBuffer` is a matter of giving Filament a pointer to the data, along with information on its layout and size. Filament uses `BufferDescriptors` to accomplish this. + +Inside `viewDidLoad`, we'll statically define some verticies and indices and create a `BufferDescriptor` for each. + +```obj-c +static const Vertex TRIANGLE_VERTICES[3] = { + { { 0.867, -0.500}, {1.0, 0.0, 0.0} }, + { { 0.000, 1.000}, {0.0, 1.0, 0.0} }, + { {-0.867, -0.500}, {0.0, 0.0, 1.0} }, +}; +static const uint16_t TRIANGLE_INDICES[3] = { 0, 1, 2 }; + +VertexBuffer::BufferDescriptor vertices(TRIANGLE_VERTICES, sizeof(Vertex) * 3, nullptr); +IndexBuffer::BufferDescriptor indices(TRIANGLE_INDICES, sizeof(uint16_t) * 3, nullptr); +``` + +The last argument is an optional callback function, which will be called after Filament is done uploading the data to the GPU. Inside the callback, you'd typically release the memory of any buffers via a `free` or `delete` call. We pass `nullptr` because we don't need a callback as our vertex and index buffer memory is static. + +Now we can instantiate our `VertexBuffer` and `IndexBuffer`. + +```obj-c +using Type = VertexBuffer::AttributeType; + +const uint8_t stride = sizeof(Vertex); +_vertexBuffer = VertexBuffer::Builder() + .vertexCount(3) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, Type::FLOAT2, offsetof(Vertex, position), stride) + .attribute(VertexAttribute::COLOR, 0, Type::FLOAT3, offsetof(Vertex, color), stride) + .build(*_engine); + +_indexBuffer = IndexBuffer::Builder() + .indexCount(3) + .bufferType(IndexBuffer::IndexType::USHORT) + .build(*_engine); + +_vertexBuffer->setBufferAt(*_engine, 0, std::move(vertices)); +_indexBuffer->setBuffer(*_engine, std::move(indices)); +``` + +We first create an `Entity` like we did for our camera. This time, we're attaching a `Renderable` component to the entity. The `Renderable` component takes geometry defined by our vertex and index buffers, and makes the entity visible in our scene. + +```obj-c +_triangle = utils::EntityManager::get().create(); + +using Primitive = RenderableManager::PrimitiveType; +RenderableManager::Builder(1) + .geometry(0, Primitive::TRIANGLES, _vertexBuffer, _indexBuffer, 0, 3) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .build(*_engine, _triangle); + +// Add the triangle to the scene. +_scene->addEntity(_triangle); +``` + +Destroy the entity and buffers in `dealloc`. + +```obj-c +_engine->destroy(_triangle); +EntityManager::get().destroy(_triangle); +_engine->destroy(_indexBuffer); +_engine->destroy(_vertexBuffer); +``` + +If you build and run the app now, you should see a plain white triangle. When we created the renderable, we didn't specify any specific `Material` to use, so Filament used a default, white material. Let's create a custom material to color the triangle. + +![a white triangle](../images/ios_sample/white-triangle.png) + +## Compiling a Custom Material + +For simplicity, we're going to compile a custom material at runtime. For production, we recommend using our matc tool to compile materials offline. You can download it as part of one of our [releases](https://github.com/google/filament/releases). + +First, add a few more headers. We'll be using Filament's filamat library to compile a custom material. + +```c++ +#include +#include + +#include +``` + +We'll store our material in a new private var. We'll also need one to store a material _instance_. You can think of a material as a "template", where a material instance is an instantiation of the template (similar to OOP classes and instances). For more information on Filament materials, read the [Filament Materials Guide](https://google.github.io/filament/Materials.html). + +```obj-c +Material* _material; +MaterialInstance* _materialInstance; +``` + +We'll use the filamat library to compile a material into a package, which we can then load into Filament. The material will be simple; it will load the interpolated color attribute and set it as the `baseColor`. + +Make sure to insert this code into `viewDidLoad` _before_ we create our `Renderable`. + +```obj-c +// init must be called before we can build any materials. +filamat::MaterialBuilder::init(); + +// Compile a custom material to use on the triangle. +filamat::Package pkg = filamat::MaterialBuilder() + // The material name, only used for debugging purposes. + .name("Triangle material") + // Use the unlit shading mode, because we don't have any lights in our scene. + .shading(filamat::MaterialBuilder::Shading::UNLIT) + // Expose the COLOR attribute visible to our shader code. + .require(VertexAttribute::COLOR) + // Custom GLSL fragment shader + .material("void material (inout MaterialInputs material) {" + " prepareMaterial(material);" + " material.baseColor = getColor();" + "}") + // Compile for Metal on mobile platforms. + .targetApi(filamat::MaterialBuilder::TargetApi::METAL) + .platform(filamat::MaterialBuilder::Platform::MOBILE) + .build(); +assert(pkg.isValid()); + +// shutdown should be called after all materials are built. +filamat::MaterialBuilder::shutdown(); +``` + +Now that we have a `filamat::Package` representing the material, we can use it to instantiate a Filament `Material`. Note that again, we recommend using the matc command-line tool to compile material packages during your app's compilation phase if possible, instead of at run-time. + +```obj-c +// Create a Filament material from the Package. +_material = Material::Builder() + .package(pkg.getData(), pkg.getSize()) + .build(*_engine); +_materialInstance = _material->getDefaultInstance(); +``` + +Now we can use the `MaterialInstance` when creating our `Renderable`. + +```obj-c +// Create a renderable using our geometry and material. +using Primitive = RenderableManager::PrimitiveType; +RenderableManager::Builder(1) + .geometry(0, Primitive::TRIANGLES, _vertexBuffer, _indexBuffer, 0, 3) + // Use the MaterialInstance we just created. + .material(0, _materialInstance) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .build(*_engine, _triangle); +``` + +Lastly, we make sure to destroy everything inside `dealloc`. + +```obj-c +_engine->destroy(_materialInstance); +_engine->destroy(_material); +``` + +Build and run. You should see the same triangle, but with colors. + +![the triangle with our custom material](../images/ios_sample/colored-triangle.png) + +## Animating the Triangle + +We'll do this by animating a transform on our triangle entity. First, include a new header. + +```obj-c +#include +``` + +When we create our triangle entity, we'll also attach a transform component. We've already seen two other components: `Renderable` and `Camera`. The `Transform` component allows us to set world-space transformations on entities. + +Inside `viewDidLoad`, after we create the triangle entity's `Renderable` component, we'll also attach a `Transform` component. + +```obj-c +// Add a Transform component to the triangle, so we can animate it. +_engine->getTransformManager().create(_triangle); +``` + +Create a new function, `update`, and add call it inside the `drawInMTKView:` method. + +```obj-c +- (void)update { + auto& tm = _engine->getTransformManager(); + auto i = tm.getInstance(_triangle); + const auto time = CACurrentMediaTime(); + tm.setTransform(i, math::mat4f::rotation(time, math::float3 {0.0, 0.0, 1.0})); +} + +- (void)drawInMTKView:(nonnull MTKView*)view { + [self update]; + if (_renderer->beginFrame(_swapChain)) { + _renderer->render(_view); + _renderer->endFrame(); + } +} +``` + +Now we should see the triangle rotate around its z axis. + +![a rotating triangle](../images/ios_sample/rotating-triangle.gif) + +## Next Steps + +In this guide we've covered how to install Filament with CocoaPods and get rendering using the Metal backend. We also compiled a custom material. Again, here's the [complete sample code](https://github.com/google/filament/tree/main/ios/samples/HelloCocoaPods) for the app. If you're interesting in learning more, check out Filament's additional [iOS samples](https://github.com/google/filament/tree/main/ios/samples). If you have any problems, feel free to open an [issue](https://github.com/google/filament/issues). diff --git a/docs_src/src/samples/web.md b/docs_src/src/samples/web.md new file mode 100644 index 00000000000..9f61c338a21 --- /dev/null +++ b/docs_src/src/samples/web.md @@ -0,0 +1,19 @@ +# Web Docs + +## tutorials + +1. [Triangle Tutorial](tutorial_triangle.html) +2. [Redball Tutorial](tutorial_redball.html) +3. [Suzanne Tutorial](tutorial_suzanne.html) + +## demos + +- [parquet](parquet.html) +- [suzanne](suzanne.html) +- [helmet](helmet.html) +- [knotess](https://prideout.net/knotess/) + +## other documentation + +- [JavaScript API reference](reference.html) +- [WebGL Meetup Slides](https://prideout.net/slides/filawasm) (2018) diff --git a/docs_src/theme/css/chrome.css b/docs_src/theme/css/chrome.css new file mode 100644 index 00000000000..3a412c2282d --- /dev/null +++ b/docs_src/theme/css/chrome.css @@ -0,0 +1,644 @@ +/* CSS for UI elements (a.k.a. chrome) */ + +html { + scrollbar-color: var(--scrollbar) var(--bg); +} +#searchresults a, +.content a:link, +a:visited, +a > .hljs { + color: var(--links); +} + +/* + body-container is necessary because mobile browsers don't seem to like + overflow-x on the body tag when there is a tag. +*/ +#body-container { + /* + This is used when the sidebar pushes the body content off the side of + the screen on small screens. Without it, dragging on mobile Safari + will want to reposition the viewport in a weird way. + */ + overflow-x: clip; +} + +/* Menu Bar */ + +#menu-bar, +#menu-bar-hover-placeholder { + z-index: 101; + margin: auto calc(0px - var(--page-padding)); +} +#menu-bar { + position: relative; + display: flex; + flex-wrap: wrap; + background-color: var(--bg); + border-block-end-color: var(--bg); + border-block-end-width: 1px; + border-block-end-style: solid; +} +#menu-bar.sticky, +#menu-bar-hover-placeholder:hover + #menu-bar, +#menu-bar:hover, +html.sidebar-visible #menu-bar { + position: -webkit-sticky; + position: sticky; + top: 0 !important; +} +#menu-bar-hover-placeholder { + position: sticky; + position: -webkit-sticky; + top: 0; + height: var(--menu-bar-height); +} +#menu-bar.bordered { + border-block-end-color: var(--table-border-color); +} +#menu-bar i, #menu-bar .icon-button { + position: relative; + padding: 0 8px; + z-index: 10; + line-height: var(--menu-bar-height); + cursor: pointer; + transition: color 0.5s; +} +@media only screen and (max-width: 420px) { + #menu-bar i, #menu-bar .icon-button { + padding: 0 5px; + } +} + +.icon-button { + border: none; + background: none; + padding: 0; + color: inherit; +} +.icon-button i { + margin: 0; +} + +.right-buttons { + margin: 0 15px; +} +.right-buttons a { + text-decoration: none; +} + +.left-buttons { + display: flex; + margin: 0 5px; +} +html:not(.js) .left-buttons button { + display: none; +} + +.menu-title { + display: inline-block; + font-weight: 200; + font-size: 2.4rem; + line-height: var(--menu-bar-height); + text-align: center; + margin: 0; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.menu-title { + cursor: pointer; +} + +.menu-bar, +.menu-bar:visited, +.nav-chapters, +.nav-chapters:visited, +.mobile-nav-chapters, +.mobile-nav-chapters:visited, +.menu-bar .icon-button, +.menu-bar a i { + color: var(--icons); +} + +.menu-bar i:hover, +.menu-bar .icon-button:hover, +.nav-chapters:hover, +.mobile-nav-chapters i:hover { + color: var(--icons-hover); +} + +/* Nav Icons */ + +.nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + + position: fixed; + top: 0; + bottom: 0; + margin: 0; + max-width: 150px; + min-width: 90px; + + display: flex; + justify-content: center; + align-content: center; + flex-direction: column; + + transition: color 0.5s, background-color 0.5s; +} + +.nav-chapters:hover { + text-decoration: none; + background-color: var(--theme-hover); + transition: background-color 0.15s, color 0.15s; +} + +.nav-wrapper { + margin-block-start: 50px; + display: none; +} + +.mobile-nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + width: 90px; + border-radius: 5px; + background-color: var(--sidebar-bg); +} + +/* Only Firefox supports flow-relative values */ +.previous { float: left; } +[dir=rtl] .previous { float: right; } + +/* Only Firefox supports flow-relative values */ +.next { + float: right; + right: var(--page-padding); +} +[dir=rtl] .next { + float: left; + right: unset; + left: var(--page-padding); +} + +/* Use the correct buttons for RTL layouts*/ +[dir=rtl] .previous i.fa-angle-left:before {content:"\f105";} +[dir=rtl] .next i.fa-angle-right:before { content:"\f104"; } + +@media only screen and (max-width: 1080px) { + .nav-wide-wrapper { display: none; } + .nav-wrapper { display: block; } +} + +/* sidebar-visible */ +@media only screen and (max-width: 1380px) { + #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wide-wrapper { display: none; } + #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wrapper { display: block; } +} + +/* Inline code */ + +:not(pre) > .hljs { + display: inline; + padding: 0.1em 0.3em; + border-radius: 3px; +} + +:not(pre):not(a) > .hljs { + color: var(--inline-code-color); + overflow-x: initial; +} + +a:hover > .hljs { + text-decoration: underline; +} + +pre { + position: relative; +} +pre > .buttons { + position: absolute; + z-index: 100; + right: 0px; + top: 2px; + margin: 0px; + padding: 2px 0px; + + color: var(--sidebar-fg); + cursor: pointer; + visibility: hidden; + opacity: 0; + transition: visibility 0.1s linear, opacity 0.1s linear; +} +pre:hover > .buttons { + visibility: visible; + opacity: 1 +} +pre > .buttons :hover { + color: var(--sidebar-active); + border-color: var(--icons-hover); + background-color: var(--theme-hover); +} +pre > .buttons i { + margin-inline-start: 8px; +} +pre > .buttons button { + cursor: inherit; + margin: 0px 5px; + padding: 4px 4px 3px 5px; + font-size: 23px; + + border-style: solid; + border-width: 1px; + border-radius: 4px; + border-color: var(--icons); + background-color: var(--theme-popup-bg); + transition: 100ms; + transition-property: color,border-color,background-color; + color: var(--icons); +} + +pre > .buttons button.clip-button { + padding: 2px 4px 0px 6px; +} +pre > .buttons button.clip-button::before { + /* clipboard image from octicons (https://github.com/primer/octicons/tree/v2.0.0) MIT license + */ + content: url('data:image/svg+xml,\ +\ +\ +'); + filter: var(--copy-button-filter); +} +pre > .buttons button.clip-button:hover::before { + filter: var(--copy-button-filter-hover); +} + +@media (pointer: coarse) { + pre > .buttons button { + /* On mobile, make it easier to tap buttons. */ + padding: 0.3rem 1rem; + } + + .sidebar-resize-indicator { + /* Hide resize indicator on devices with limited accuracy */ + display: none; + } +} +pre > code { + display: block; + padding: 1rem; +} + +/* FIXME: ACE editors overlap their buttons because ACE does absolute + positioning within the code block which breaks padding. The only solution I + can think of is to move the padding to the outer pre tag (or insert a div + wrapper), but that would require fixing a whole bunch of CSS rules. +*/ +.hljs.ace_editor { + padding: 0rem 0rem; +} + +pre > .result { + margin-block-start: 10px; +} + +/* Search */ + +#searchresults a { + text-decoration: none; +} + +mark { + border-radius: 2px; + padding-block-start: 0; + padding-block-end: 1px; + padding-inline-start: 3px; + padding-inline-end: 3px; + margin-block-start: 0; + margin-block-end: -1px; + margin-inline-start: -3px; + margin-inline-end: -3px; + background-color: var(--search-mark-bg); + transition: background-color 300ms linear; + cursor: pointer; +} + +mark.fade-out { + background-color: rgba(0,0,0,0) !important; + cursor: auto; +} + +.searchbar-outer { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); +} + +#searchbar { + width: 100%; + margin-block-start: 5px; + margin-block-end: 0; + margin-inline-start: auto; + margin-inline-end: auto; + padding: 10px 16px; + transition: box-shadow 300ms ease-in-out; + border: 1px solid var(--searchbar-border-color); + border-radius: 3px; + background-color: var(--searchbar-bg); + color: var(--searchbar-fg); +} +#searchbar:focus, +#searchbar.active { + box-shadow: 0 0 3px var(--searchbar-shadow-color); +} + +.searchresults-header { + font-weight: bold; + font-size: 1em; + padding-block-start: 18px; + padding-block-end: 0; + padding-inline-start: 5px; + padding-inline-end: 0; + color: var(--searchresults-header-fg); +} + +.searchresults-outer { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); + border-block-end: 1px dashed var(--searchresults-border-color); +} + +ul#searchresults { + list-style: none; + padding-inline-start: 20px; +} +ul#searchresults li { + margin: 10px 0px; + padding: 2px; + border-radius: 2px; +} +ul#searchresults li.focus { + background-color: var(--searchresults-li-bg); +} +ul#searchresults span.teaser { + display: block; + clear: both; + margin-block-start: 5px; + margin-block-end: 0; + margin-inline-start: 20px; + margin-inline-end: 0; + font-size: 0.8em; +} +ul#searchresults span.teaser em { + font-weight: bold; + font-style: normal; +} + +/* Sidebar */ + +.sidebar { + position: fixed; + left: 0; + top: 0; + bottom: 0; + width: var(--sidebar-width); + font-size: 0.875em; + box-sizing: border-box; + -webkit-overflow-scrolling: touch; + overscroll-behavior-y: contain; + background-color: var(--sidebar-bg); + color: var(--sidebar-fg); +} +.sidebar-iframe-inner { + background-color: var(--sidebar-bg); + color: var(--sidebar-fg); + padding: 10px 10px; + margin: 0; + font-size: 1.4rem; +} +.sidebar-iframe-outer { + border: none; + height: 100%; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} +[dir=rtl] .sidebar { left: unset; right: 0; } +.sidebar-resizing { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +html:not(.sidebar-resizing) .sidebar { + transition: transform 0.3s; /* Animation: slide away */ +} +.sidebar code { + line-height: 2em; +} +.sidebar .flogo { + max-height: 90px; + padding: 5px; +} +.sidebar .sidebar-scrollbox { + overflow-y: auto; + position: absolute; + top: 100px; + bottom: 0; + left: 0; + right: 0; + padding: 10px 10px; +} +.sidebar .sidebar-resize-handle { + position: absolute; + cursor: col-resize; + width: 0; + right: calc(var(--sidebar-resize-indicator-width) * -1); + top: 0; + bottom: 0; + display: flex; + align-items: center; +} + +.sidebar-resize-handle .sidebar-resize-indicator { + width: 100%; + height: 12px; + background-color: var(--icons); + margin-inline-start: var(--sidebar-resize-indicator-space); +} + +[dir=rtl] .sidebar .sidebar-resize-handle { + left: calc(var(--sidebar-resize-indicator-width) * -1); + right: unset; +} +.js .sidebar .sidebar-resize-handle { + cursor: col-resize; + width: calc(var(--sidebar-resize-indicator-width) - var(--sidebar-resize-indicator-space)); +} +/* sidebar-hidden */ +#sidebar-toggle-anchor:not(:checked) ~ .sidebar { + transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width))); + z-index: -1; +} +[dir=rtl] #sidebar-toggle-anchor:not(:checked) ~ .sidebar { + transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width))); +} +.sidebar::-webkit-scrollbar { + background: var(--sidebar-bg); +} +.sidebar::-webkit-scrollbar-thumb { + background: var(--scrollbar); +} + +/* sidebar-visible */ +#sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width))); +} +[dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width))); +} +@media only screen and (min-width: 620px) { + #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: none; + margin-inline-start: calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width)); + } + [dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: none; + } +} + +.chapter { + list-style: none outside none; + padding-inline-start: 0; + line-height: 2.2em; +} + +.chapter ol { + width: 100%; +} + +.chapter li { + display: flex; + color: var(--sidebar-non-existant); +} +.chapter li a { + display: block; + padding: 0; + text-decoration: none; + color: var(--sidebar-fg); +} + +.chapter li a:hover { + color: var(--sidebar-active); +} + +.chapter li a.active { + color: var(--sidebar-active); +} + +.chapter li > a.toggle { + cursor: pointer; + display: block; + margin-inline-start: auto; + padding: 0 10px; + user-select: none; + opacity: 0.68; +} + +.chapter li > a.toggle div { + transition: transform 0.5s; +} + +/* collapse the section */ +.chapter li:not(.expanded) + li > ol { + display: none; +} + +.chapter li.chapter-item { + line-height: 1.5em; + margin-block-start: 0.6em; +} + +.chapter li.expanded > a.toggle div { + transform: rotate(90deg); +} + +.spacer { + width: 100%; + height: 3px; + margin: 5px 0px; +} +.chapter .spacer { + background-color: var(--sidebar-spacer); +} + +@media (-moz-touch-enabled: 1), (pointer: coarse) { + .chapter li a { padding: 5px 0; } + .spacer { margin: 10px 0; } +} + +.section { + list-style: none outside none; + padding-inline-start: 20px; + line-height: 1.9em; +} + +/* Theme Menu Popup */ + +.theme-popup { + position: absolute; + left: 10px; + top: var(--menu-bar-height); + z-index: 1000; + border-radius: 4px; + font-size: 0.7em; + color: var(--fg); + background: var(--theme-popup-bg); + border: 1px solid var(--theme-popup-border); + margin: 0; + padding: 0; + list-style: none; + display: none; + /* Don't let the children's background extend past the rounded corners. */ + overflow: hidden; +} +[dir=rtl] .theme-popup { left: unset; right: 10px; } +.theme-popup .default { + color: var(--icons); +} +.theme-popup .theme { + width: 100%; + border: 0; + margin: 0; + padding: 2px 20px; + line-height: 25px; + white-space: nowrap; + text-align: start; + cursor: pointer; + color: inherit; + background: inherit; + font-size: inherit; +} +.theme-popup .theme:hover { + background-color: var(--theme-hover); +} + +.theme-selected::before { + display: inline-block; + content: "✓"; + margin-inline-start: -14px; + width: 14px; +} diff --git a/docs_src/theme/favicon.png b/docs_src/theme/favicon.png new file mode 100644 index 00000000000..7bc766e4946 Binary files /dev/null and b/docs_src/theme/favicon.png differ diff --git a/docs_src/theme/index.hbs b/docs_src/theme/index.hbs new file mode 100644 index 00000000000..4f8a40f97d7 --- /dev/null +++ b/docs_src/theme/index.hbs @@ -0,0 +1,323 @@ + + + + + + {{ title }} + {{#if is_print }} + + {{/if}} + {{#if base_url}} + + {{/if}} + + + + {{> head}} + + + + + + + + + + {{#if print_enable}} + + {{/if}} + + + + {{#if copy_fonts}} + + {{/if}} + + + + + + + + {{#each additional_css}} + + {{/each}} + + {{#if mathjax_support}} + + + {{/if}} + + + + + + + +
    + + + + + + + + + + + + + +
    + +
    + {{> header}} + + + + {{#if search_enabled}} + + {{/if}} + + + + +
    +
    + {{{ content }}} +
    + + +
    +
    + + + +
    + + {{#if live_reload_endpoint}} + + + {{/if}} + + {{#if google_analytics}} + + + {{/if}} + + {{#if playground_line_numbers}} + + {{/if}} + + {{#if playground_copyable}} + + {{/if}} + + {{#if playground_js}} + + + + + + {{/if}} + + {{#if search_js}} + + + + {{/if}} + + + + + + + {{#each additional_js}} + + {{/each}} + + {{#if is_print}} + {{#if mathjax_support}} + + {{else}} + + {{/if}} + {{/if}} + +
    + + diff --git a/filament/CMakeLists.txt b/filament/CMakeLists.txt index 545025cdc56..d218a391704 100644 --- a/filament/CMakeLists.txt +++ b/filament/CMakeLists.txt @@ -26,6 +26,7 @@ set(PUBLIC_HDRS include/filament/Frustum.h include/filament/IndexBuffer.h include/filament/IndirectLight.h + include/filament/InstanceBuffer.h include/filament/LightManager.h include/filament/Material.h include/filament/MaterialInstance.h @@ -50,7 +51,6 @@ set(PUBLIC_HDRS set(SRCS src/AtlasAllocator.cpp - src/Box.cpp src/BufferObject.cpp src/Camera.cpp src/Color.cpp @@ -61,20 +61,22 @@ set(SRCS src/Engine.cpp src/Exposure.cpp src/Fence.cpp + src/FilamentBuilder.cpp src/FrameInfo.cpp src/FrameSkipper.cpp src/Froxelizer.cpp src/Frustum.cpp + src/HwDescriptorSetLayoutFactory.cpp src/HwRenderPrimitiveFactory.cpp + src/HwVertexBufferInfoFactory.cpp src/IndexBuffer.cpp src/IndirectLight.cpp + src/InstanceBuffer.cpp src/LightManager.cpp src/Material.cpp src/MaterialInstance.cpp src/MaterialParser.cpp src/MorphTargetBuffer.cpp - src/PerViewUniforms.cpp - src/PerShadowMapUniforms.cpp src/PostProcessManager.cpp src/RenderPass.cpp src/RenderPrimitive.cpp @@ -109,6 +111,7 @@ set(SRCS src/details/Fence.cpp src/details/IndexBuffer.cpp src/details/IndirectLight.cpp + src/details/InstanceBuffer.cpp src/details/Material.cpp src/details/MaterialInstance.cpp src/details/MorphTargetBuffer.cpp @@ -122,6 +125,12 @@ set(SRCS src/details/Texture.cpp src/details/VertexBuffer.cpp src/details/View.cpp + src/ds/ColorPassDescriptorSet.cpp + src/ds/DescriptorSet.cpp + src/ds/DescriptorSetLayout.cpp + src/ds/PostProcessDescriptorSet.cpp + src/ds/ShadowMapDescriptorSet.cpp + src/ds/SsrPassDescriptorSet.cpp src/fg/Blackboard.cpp src/fg/DependencyGraph.cpp src/fg/FrameGraph.cpp @@ -135,6 +144,7 @@ set(SRCS set(PRIVATE_HDRS src/Allocators.h + src/Bimap.h src/BufferPoolAllocator.h src/ColorSpaceUtils.h src/Culler.h @@ -144,21 +154,21 @@ set(PRIVATE_HDRS src/FrameInfo.h src/FrameSkipper.h src/Froxelizer.h + src/HwDescriptorSetLayoutFactory.h src/HwRenderPrimitiveFactory.h + src/HwVertexBufferInfoFactory.h src/Intersections.h src/MaterialParser.h - src/PerViewUniforms.h - src/PerShadowMapUniforms.h src/PIDController.h src/PostProcessManager.h - src/RendererUtils.h src/RenderPass.h src/RenderPrimitive.h + src/RendererUtils.h src/ResourceAllocator.h src/ResourceList.h src/ShadowMap.h src/ShadowMapManager.h - src/TypedUniformBuffer.h + src/SharedHandle.h src/UniformBuffer.h src/components/CameraManager.h src/components/LightManager.h @@ -172,6 +182,7 @@ set(PRIVATE_HDRS src/details/Fence.h src/details/IndexBuffer.h src/details/IndirectLight.h + src/details/InstanceBuffer.h src/details/Material.h src/details/MaterialInstance.h src/details/MorphTargetBuffer.h @@ -185,6 +196,14 @@ set(PRIVATE_HDRS src/details/Texture.h src/details/VertexBuffer.h src/details/View.h + src/downcast.h + src/ds/ColorPassDescriptorSet.h + src/ds/DescriptorSetLayout.h + src/ds/PostProcessDescriptorSet.h + src/ds/ShadowMapDescriptorSet.h + src/ds/SsrPassDescriptorSet.h + src/ds/TypedBuffer.h + src/ds/TypedUniformBuffer.h src/fg/Blackboard.h src/fg/FrameGraph.h src/fg/FrameGraphId.h @@ -202,50 +221,59 @@ set(PRIVATE_HDRS src/materials/fsr/ffx_a.h src/materials/fsr/ffx_fsr1.h src/materials/fsr/ffx_fsr1_mobile.fs - src/downcast.h ) set(MATERIAL_SRCS - src/materials/fsr/fsr_easu.mat - src/materials/fsr/fsr_easu_mobile.mat - src/materials/fsr/fsr_easu_mobileF.mat - src/materials/fsr/fsr_rcas.mat + src/materials/antiAliasing/fxaa.mat + src/materials/antiAliasing/taa.mat + src/materials/blitDepth.mat + src/materials/blitLow.mat + src/materials/blitArray.mat + src/materials/bloom/bloomDownsample.mat + src/materials/bloom/bloomDownsample2x.mat + src/materials/bloom/bloomDownsample9.mat + src/materials/bloom/bloomUpsample.mat src/materials/colorGrading/colorGrading.mat src/materials/colorGrading/colorGradingAsSubpass.mat src/materials/colorGrading/customResolveAsSubpass.mat + src/materials/debugShadowCascades.mat src/materials/defaultMaterial.mat src/materials/dof/dof.mat src/materials/dof/dofCoc.mat - src/materials/dof/dofDownsample.mat src/materials/dof/dofCombine.mat - src/materials/dof/dofTiles.mat - src/materials/dof/dofTilesSwizzle.mat src/materials/dof/dofDilate.mat - src/materials/dof/dofMipmap.mat + src/materials/dof/dofDownsample.mat src/materials/dof/dofMedian.mat + src/materials/dof/dofMipmap.mat + src/materials/dof/dofTiles.mat + src/materials/dof/dofTilesSwizzle.mat src/materials/flare/flare.mat - src/materials/blitLow.mat - src/materials/bloom/bloomDownsample.mat - src/materials/bloom/bloomUpsample.mat + src/materials/fsr/fsr_easu.mat + src/materials/fsr/fsr_easu_mobile.mat + src/materials/fsr/fsr_easu_mobileF.mat + src/materials/fsr/fsr_rcas.mat + src/materials/resolveDepth.mat + src/materials/separableGaussianBlur.mat + src/materials/skybox.mat + src/materials/shadowmap.mat src/materials/ssao/bilateralBlur.mat src/materials/ssao/bilateralBlurBentNormals.mat src/materials/ssao/mipmapDepth.mat - src/materials/skybox.mat src/materials/ssao/sao.mat src/materials/ssao/saoBentNormals.mat - src/materials/separableGaussianBlur1.mat - src/materials/separableGaussianBlur2.mat - src/materials/separableGaussianBlur3.mat - src/materials/separableGaussianBlur4.mat - src/materials/separableGaussianBlur1L.mat - src/materials/separableGaussianBlur2L.mat - src/materials/separableGaussianBlur3L.mat - src/materials/separableGaussianBlur4L.mat - src/materials/antiAliasing/fxaa.mat - src/materials/antiAliasing/taa.mat src/materials/vsmMipmap.mat ) +set(MATERIAL_FL0_SRCS + src/materials/defaultMaterial.mat + src/materials/skybox.mat +) + +set(MATERIAL_MULTIVIEW_SRCS + src/materials/defaultMaterial.mat + src/materials/skybox.mat +) + # Embed the binary resource blob for materials. get_resgen_vars(${RESOURCE_DIR} materials) list(APPEND PRIVATE_HDRS ${RESGEN_HEADER}) @@ -270,6 +298,21 @@ if (NOT DFG_LUT_SIZE) endif() message(STATUS "DFG LUT size set to ${DFG_LUT_SIZE}x${DFG_LUT_SIZE}") +# Whether to include FL0 materials. +if (FILAMENT_ENABLE_FEATURE_LEVEL_0) + add_definitions(-DFILAMENT_ENABLE_FEATURE_LEVEL_0) +endif() + +# Whether to include MULTIVIEW materials. +if (FILAMENT_ENABLE_MULTIVIEW) + add_definitions(-DFILAMENT_ENABLE_MULTIVIEW) +endif() + +# Whether to force the profiling mode. +if (FILAMENT_FORCE_PROFILING_MODE) + add_definitions(-DFILAMENT_FORCE_PROFILING_MODE) +endif() + # ================================================================================================== # Definitions # ================================================================================================== @@ -300,15 +343,41 @@ foreach (mat_src ${MATERIAL_SRCS}) get_filename_component(localname "${mat_src}" NAME_WE) get_filename_component(fullname "${mat_src}" ABSOLUTE) set(output_path "${MATERIAL_DIR}/${localname}.filamat") - add_custom_command( OUTPUT ${output_path} COMMAND matc ${MATC_BASE_FLAGS} -o ${output_path} ${fullname} MAIN_DEPENDENCY ${fullname} DEPENDS matc - COMMENT "Compiling material ${mat_src} to ${output_path}" + COMMENT "Compiling material ${fullname} to ${output_path}" ) list(APPEND MATERIAL_BINS ${output_path}) + + list(FIND MATERIAL_FL0_SRCS ${mat_src} index) + if (${index} GREATER -1 AND FILAMENT_ENABLE_FEATURE_LEVEL_0) + string(REGEX REPLACE "[.]filamat$" "_fl0.filamat" output_path_fl0 ${output_path}) + add_custom_command( + OUTPUT ${output_path_fl0} + COMMAND matc ${MATC_BASE_FLAGS} -PfeatureLevel=0 -o ${output_path_fl0} ${fullname} + MAIN_DEPENDENCY ${fullname} + DEPENDS matc + COMMENT "Compiling material ${fullname} to ${output_path_fl0}" + ) + list(APPEND MATERIAL_BINS ${output_path_fl0}) + endif () + + list(FIND MATERIAL_MULTIVIEW_SRCS ${mat_src} index) + if (${index} GREATER -1 AND FILAMENT_ENABLE_MULTIVIEW) + string(REGEX REPLACE "[.]filamat$" "_multiview.filamat" output_path_multiview ${output_path}) + add_custom_command( + OUTPUT ${output_path_multiview} + COMMAND matc ${MATC_BASE_FLAGS} -PstereoscopicType=multiview -o ${output_path_multiview} ${fullname} + MAIN_DEPENDENCY ${fullname} + DEPENDS matc + COMMENT "Compiling material ${fullname} to ${output_path_multiview}" + ) + list(APPEND MATERIAL_BINS ${output_path_multiview}) + endif () + endforeach() # Additional dependencies on included files for materials @@ -375,8 +444,8 @@ add_custom_command( OUTPUT "${MATERIAL_DIR}/sao.filamat" DEPENDS src/materials/ssao/ssaoUtils.fs DEPENDS src/materials/ssao/ssct.fs - DEPENDS src/materials/ssao/depthUtils.fs - DEPENDS src/materials/ssao/geometry.fs + DEPENDS src/materials/utils/depthUtils.fs + DEPENDS src/materials/utils/geometry.fs DEPENDS src/materials/ssao/saoImpl.fs DEPENDS src/materials/ssao/ssctImpl.fs APPEND @@ -386,8 +455,8 @@ add_custom_command( OUTPUT "${MATERIAL_DIR}/saoBentNormals.filamat" DEPENDS src/materials/ssao/ssaoUtils.fs DEPENDS src/materials/ssao/ssct.fs - DEPENDS src/materials/ssao/depthUtils.fs - DEPENDS src/materials/ssao/geometry.fs + DEPENDS src/materials/utils/depthUtils.fs + DEPENDS src/materials/utils/geometry.fs DEPENDS src/materials/ssao/saoImpl.fs DEPENDS src/materials/ssao/ssctImpl.fs APPEND @@ -436,56 +505,7 @@ add_custom_command( ) add_custom_command( - OUTPUT "${MATERIAL_DIR}/separableGaussianBlur1.filamat" - DEPENDS src/materials/separableGaussianBlur.vs - DEPENDS src/materials/separableGaussianBlur.fs - APPEND -) - -add_custom_command( - OUTPUT "${MATERIAL_DIR}/separableGaussianBlur2.filamat" - DEPENDS src/materials/separableGaussianBlur.vs - DEPENDS src/materials/separableGaussianBlur.fs - APPEND -) - -add_custom_command( - OUTPUT "${MATERIAL_DIR}/separableGaussianBlur3.filamat" - DEPENDS src/materials/separableGaussianBlur.vs - DEPENDS src/materials/separableGaussianBlur.fs - APPEND -) - -add_custom_command( - OUTPUT "${MATERIAL_DIR}/separableGaussianBlur4.filamat" - DEPENDS src/materials/separableGaussianBlur.vs - DEPENDS src/materials/separableGaussianBlur.fs - APPEND -) - -add_custom_command( - OUTPUT "${MATERIAL_DIR}/separableGaussianBlur1L.filamat" - DEPENDS src/materials/separableGaussianBlur.vs - DEPENDS src/materials/separableGaussianBlur.fs - APPEND -) - -add_custom_command( - OUTPUT "${MATERIAL_DIR}/separableGaussianBlur2L.filamat" - DEPENDS src/materials/separableGaussianBlur.vs - DEPENDS src/materials/separableGaussianBlur.fs - APPEND -) - -add_custom_command( - OUTPUT "${MATERIAL_DIR}/separableGaussianBlur3L.filamat" - DEPENDS src/materials/separableGaussianBlur.vs - DEPENDS src/materials/separableGaussianBlur.fs - APPEND -) - -add_custom_command( - OUTPUT "${MATERIAL_DIR}/separableGaussianBlur4L.filamat" + OUTPUT "${MATERIAL_DIR}/separableGaussianBlur.filamat" DEPENDS src/materials/separableGaussianBlur.vs DEPENDS src/materials/separableGaussianBlur.fs APPEND @@ -541,6 +561,13 @@ target_link_libraries(${TARGET} PUBLIC filaflat) target_link_libraries(${TARGET} PUBLIC filabridge) target_link_libraries(${TARGET} PUBLIC ibl-lite) +if (FILAMENT_ENABLE_FGVIEWER) + target_link_libraries(${TARGET} PUBLIC fgviewer) + add_definitions(-DFILAMENT_ENABLE_FGVIEWER=1) +else() + add_definitions(-DFILAMENT_ENABLE_FGVIEWER=0) +endif() + if (FILAMENT_ENABLE_MATDBG) target_link_libraries(${TARGET} PUBLIC matdbg) add_definitions(-DFILAMENT_ENABLE_MATDBG=1) @@ -565,6 +592,7 @@ elseif(WEBGL) else() set(OPTIMIZATION_FLAGS -ffast-math + -fno-finite-math-only -ffp-contract=fast # TODO: aggressive vectorization is currently broken on Android # -fslp-vectorize-aggressive @@ -584,12 +612,20 @@ if (MSVC) set(FILAMENT_WARNINGS /W3) else() set(FILAMENT_WARNINGS - -Wall -Wextra -Wno-unused-parameter + -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wextra-semi -Wnewline-eof -Wdeprecated -Wundef -Wgnu-conditional-omitted-operand -Wweak-vtables -Wnon-virtual-dtor -Wclass-varargs -Wimplicit-fallthrough -Wover-aligned + -Werror ) + if (CMAKE_CXX_STANDARD EQUAL 20) + # The lambdas for passes in PostProcessManager.cpp capture this + # implicitly in a way that's deprecated in c++20, but can't easily be + # fixed in a way that's backwards compatible with c++17: + # https://www.nextptr.com/tutorial/ta1430524603/capture-this-in-lambda-expression-timeline-of-change + list(APPEND FILAMENT_WARNINGS -Wno-deprecated-this-capture) + endif() endif() target_compile_options(${TARGET} PRIVATE diff --git a/filament/README.md b/filament/README.md index 1560c96135e..79ec596bde7 100644 --- a/filament/README.md +++ b/filament/README.md @@ -61,7 +61,7 @@ with the platform name, for example, `filament-20181009-linux.tgz`. Create a file, `main.cpp`, in the same directory with the following contents: -``` +```c++ #include #include @@ -91,7 +91,7 @@ Copy your platform's Makefile below into a `Makefile` inside the same directory. ### Linux -``` +```make FILAMENT_LIBS=-lfilament -lbackend -lbluegl -lbluevk -lfilabridge -lfilaflat -lutils -lgeometry -lsmol-v -lvkshaders -libl CC=clang++ @@ -109,7 +109,7 @@ clean: ### macOS -``` +```make FILAMENT_LIBS=-lfilament -lbackend -lbluegl -lbluevk -lfilabridge -lfilaflat -lutils -lgeometry -lsmol-v -lvkshaders -libl FRAMEWORKS=-framework Cocoa -framework Metal -framework CoreVideo CC=clang++ @@ -137,7 +137,7 @@ be sure to also include `matdbg.lib` in `FILAMENT_LIBS`. When building Filament from source, the `USE_STATIC_CRT` CMake option can be used to change the run-time library version. -``` +```make FILAMENT_LIBS=filament.lib backend.lib bluegl.lib bluevk.lib filabridge.lib filaflat.lib \ utils.lib geometry.lib smol-v.lib ibl.lib vkshaders.lib CC=cl.exe @@ -171,12 +171,12 @@ and invoke `nmake` instead of `make`. ### Generating C++ documentation -To generate the documentation you must first install `doxygen` and `graphviz`, then run the +To generate the documentation you must first install `doxygen` and `graphviz`, then run the following commands: -``` -$ cd filament/filament -$ doxygen docs/doxygen/filament.doxygen +```shell +cd filament/filament +doxygen docs/doxygen/filament.doxygen ``` Finally simply open `docs/html/index.html` in your web browser. diff --git a/filament/backend/CMakeLists.txt b/filament/backend/CMakeLists.txt index 8fb2b333fb3..89c29cf53eb 100644 --- a/filament/backend/CMakeLists.txt +++ b/filament/backend/CMakeLists.txt @@ -12,6 +12,7 @@ set(PUBLIC_HDRS include/backend/AcquiredImage.h include/backend/BufferDescriptor.h include/backend/CallbackHandler.h + include/backend/DescriptorSetOffsetArray.h include/backend/DriverApiForward.h include/backend/DriverEnums.h include/backend/Handle.h @@ -25,11 +26,13 @@ set(PUBLIC_HDRS set(SRCS src/BackendUtils.cpp + src/BlobCacheKey.cpp src/Callable.cpp - src/CallbackHandler.cpp + src/CallbackManager.cpp src/CircularBuffer.cpp src/CommandBufferQueue.cpp src/CommandStream.cpp + src/CompilerThreadPool.cpp src/Driver.cpp src/Handle.cpp src/HandleAllocator.cpp @@ -39,7 +42,6 @@ set(SRCS src/Platform.cpp src/PlatformFactory.cpp src/Program.cpp - src/SamplerGroup.cpp ) set(PRIVATE_HDRS @@ -52,8 +54,9 @@ set(PRIVATE_HDRS include/private/backend/DriverAPI.inc include/private/backend/HandleAllocator.h include/private/backend/PlatformFactory.h - include/private/backend/SamplerGroup.h + src/CallbackManager.h src/CommandStreamDispatcher.h + src/CompilerThreadPool.h src/DataReshaper.h src/DriverBase.h ) @@ -62,13 +65,21 @@ set(PRIVATE_HDRS # OpenGL / OpenGL ES Sources # ================================================================================================== -if (FILAMENT_SUPPORTS_OPENGL AND NOT FILAMENT_USE_EXTERNAL_GLES3 AND NOT FILAMENT_USE_SWIFTSHADER) +if (FILAMENT_SUPPORTS_OPENGL AND NOT FILAMENT_USE_EXTERNAL_GLES3) list(APPEND SRCS include/backend/platforms/OpenGLPlatform.h + src/opengl/BindingMap.h src/opengl/gl_headers.cpp src/opengl/gl_headers.h + src/opengl/GLBufferObject.h + src/opengl/GLDescriptorSet.cpp + src/opengl/GLDescriptorSet.h + src/opengl/GLDescriptorSetLayout.h + src/opengl/GLTexture.h src/opengl/GLUtils.cpp src/opengl/GLUtils.h + src/opengl/OpenGLBlobCache.cpp + src/opengl/OpenGLBlobCache.h src/opengl/OpenGLContext.cpp src/opengl/OpenGLContext.h src/opengl/OpenGLDriver.cpp @@ -79,6 +90,8 @@ if (FILAMENT_SUPPORTS_OPENGL AND NOT FILAMENT_USE_EXTERNAL_GLES3 AND NOT FILAMEN src/opengl/OpenGLPlatform.cpp src/opengl/OpenGLTimerQuery.cpp src/opengl/OpenGLTimerQuery.h + src/opengl/ShaderCompilerService.cpp + src/opengl/ShaderCompilerService.h ) if (EGL) list(APPEND SRCS src/opengl/platforms/PlatformEGL.cpp) @@ -96,6 +109,7 @@ if (FILAMENT_SUPPORTS_OPENGL AND NOT FILAMENT_USE_EXTERNAL_GLES3 AND NOT FILAMEN list(APPEND SRCS src/opengl/platforms/CocoaTouchExternalImage.mm) elseif (APPLE) list(APPEND SRCS src/opengl/platforms/PlatformCocoaGL.mm) + list(APPEND SRCS src/opengl/platforms/CocoaExternalImage.mm) elseif (WEBGL) list(APPEND SRCS src/opengl/platforms/PlatformWebGL.cpp) elseif (LINUX) @@ -103,6 +117,8 @@ if (FILAMENT_SUPPORTS_OPENGL AND NOT FILAMENT_USE_EXTERNAL_GLES3 AND NOT FILAMEN list(APPEND SRCS src/opengl/platforms/PlatformGLX.cpp) elseif (FILAMENT_SUPPORTS_EGL_ON_LINUX) list(APPEND SRCS src/opengl/platforms/PlatformEGLHeadless.cpp) + elseif (FILAMENT_SUPPORTS_OSMESA) + list(APPEND SRCS src/opengl/platforms/PlatformOSMesa.cpp) endif() elseif (WIN32) list(APPEND SRCS src/opengl/platforms/PlatformWGL.cpp) @@ -114,7 +130,7 @@ endif() # ================================================================================================== if (FILAMENT_SUPPORTS_METAL) - set(METAL_SRCS + set(METAL_OBJC_SRCS src/metal/MetalBlitter.mm src/metal/MetalBuffer.mm src/metal/MetalBufferPool.mm @@ -124,18 +140,22 @@ if (FILAMENT_SUPPORTS_METAL) src/metal/MetalExternalImage.mm src/metal/MetalHandles.mm src/metal/MetalPlatform.mm - src/metal/MetalResourceTracker.cpp + src/metal/MetalShaderCompiler.mm src/metal/MetalState.mm src/metal/MetalTimerQuery.mm src/metal/MetalUtils.mm ) - list(APPEND SRCS ${METAL_SRCS}) + set(METAL_CPP_SRCS + src/metal/MetalResourceTracker.cpp + ) + + list(APPEND SRCS ${METAL_OBJC_SRCS} ${METAL_CPP_SRCS}) if (IOS) # Objective-C++ sources need an additional compiler flag on iOS to disable exceptions. set_property(SOURCE - ${METAL_SRCS} + ${METAL_OBJC_SRCS} src/opengl/platforms/PlatformCocoaTouchGL.mm src/opengl/platforms/CocoaTouchExternalImage.mm src/opengl/platforms/PlatformCocoaGL.mm @@ -153,6 +173,22 @@ endif() if (FILAMENT_SUPPORTS_VULKAN) list(APPEND SRCS include/backend/platforms/VulkanPlatform.h + src/vulkan/caching/VulkanDescriptorSetManager.cpp + src/vulkan/caching/VulkanDescriptorSetManager.h + src/vulkan/caching/VulkanPipelineLayoutCache.cpp + src/vulkan/caching/VulkanPipelineLayoutCache.h + src/vulkan/memory/ResourceManager.cpp + src/vulkan/memory/ResourceManager.h + src/vulkan/memory/ResourcePointer.h + src/vulkan/memory/Resource.cpp + src/vulkan/memory/Resource.h + src/vulkan/platform/VulkanPlatform.cpp + src/vulkan/platform/VulkanPlatformSwapChainImpl.cpp + src/vulkan/platform/VulkanPlatformSwapChainImpl.h + src/vulkan/spirv/VulkanSpirvUtils.cpp + src/vulkan/spirv/VulkanSpirvUtils.h + src/vulkan/VulkanAsyncHandles.cpp + src/vulkan/VulkanAsyncHandles.h src/vulkan/VulkanBlitter.cpp src/vulkan/VulkanBlitter.h src/vulkan/VulkanBuffer.cpp @@ -162,8 +198,6 @@ if (FILAMENT_SUPPORTS_VULKAN) src/vulkan/VulkanConstants.h src/vulkan/VulkanContext.cpp src/vulkan/VulkanContext.h - src/vulkan/VulkanDisposer.cpp - src/vulkan/VulkanDisposer.h src/vulkan/VulkanDriver.cpp src/vulkan/VulkanDriver.h src/vulkan/VulkanDriverFactory.h @@ -171,36 +205,31 @@ if (FILAMENT_SUPPORTS_VULKAN) src/vulkan/VulkanFboCache.h src/vulkan/VulkanHandles.cpp src/vulkan/VulkanHandles.h + src/vulkan/VulkanImageUtility.cpp + src/vulkan/VulkanImageUtility.h src/vulkan/VulkanMemory.h src/vulkan/VulkanMemory.cpp src/vulkan/VulkanPipelineCache.cpp src/vulkan/VulkanPipelineCache.h - src/vulkan/VulkanPlatform.cpp src/vulkan/VulkanSamplerCache.cpp src/vulkan/VulkanSamplerCache.h src/vulkan/VulkanStagePool.cpp src/vulkan/VulkanStagePool.h src/vulkan/VulkanSwapChain.cpp src/vulkan/VulkanSwapChain.h + src/vulkan/VulkanReadPixels.cpp + src/vulkan/VulkanReadPixels.h src/vulkan/VulkanTexture.cpp src/vulkan/VulkanTexture.h src/vulkan/VulkanUtility.cpp src/vulkan/VulkanUtility.h ) - if (LINUX) - if (FILAMENT_SUPPORTS_WAYLAND) - list(APPEND SRCS src/vulkan/PlatformVkLinuxWayland.cpp) - elseif (FILAMENT_SUPPORTS_X11) - list(APPEND SRCS src/vulkan/PlatformVkLinuxX11.cpp) - endif() - elseif (APPLE AND NOT IOS) - list(APPEND SRCS src/vulkan/PlatformVkCocoa.mm) - elseif (IOS) - list(APPEND SRCS src/vulkan/PlatformVkCocoaTouch.mm) + if (LINUX OR WIN32) + list(APPEND SRCS src/vulkan/platform/VulkanPlatformLinuxWindows.cpp) + elseif (APPLE OR IOS) + list(APPEND SRCS src/vulkan/platform/VulkanPlatformApple.mm) elseif (ANDROID) - list(APPEND SRCS src/vulkan/PlatformVkAndroid.cpp) - elseif (WIN32) - list(APPEND SRCS src/vulkan/PlatformVkWindows.cpp) + list(APPEND SRCS src/vulkan/platform/VulkanPlatformAndroid.cpp) endif() endif() @@ -303,6 +332,7 @@ endif() if (FILAMENT_SUPPORTS_VULKAN) target_link_libraries(${TARGET} PUBLIC bluevk vkmemalloc vkshaders smol-v) + target_link_libraries(${TARGET} PRIVATE SPIRV-Headers) endif() if (FILAMENT_SUPPORTS_METAL) @@ -329,6 +359,7 @@ elseif(WEBGL) else() set(OPTIMIZATION_FLAGS -ffast-math + -fno-finite-math-only -ffp-contract=fast # TODO: aggressive vectorization is currently broken on Android # -fslp-vectorize-aggressive @@ -341,16 +372,25 @@ set(LINUX_LINKER_OPTIMIZATION_FLAGS -Wl,--exclude-libs,bluegl ) +if (LINUX AND FILAMENT_SUPPORTS_OSMESA) + set(OSMESA_COMPILE_FLAGS + -I${FILAMENT_OSMESA_PATH}/include/GL) +endif() + if (MSVC) set(FILAMENT_WARNINGS /W3) else() set(FILAMENT_WARNINGS - -Wall -Wextra -Wno-unused-parameter + -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wextra-semi -Wnewline-eof -Wdeprecated -Wundef -Wgnu-conditional-omitted-operand -Wweak-vtables -Wnon-virtual-dtor -Wclass-varargs -Wimplicit-fallthrough -Wover-aligned + -Werror ) + if (CMAKE_CXX_STANDARD EQUAL 20) + list(APPEND FILAMENT_WARNINGS -Wno-deprecated-this-capture) + endif() endif() if (APPLE) @@ -360,6 +400,7 @@ endif() target_compile_options(${TARGET} PRIVATE ${FILAMENT_WARNINGS} + ${OSMESA_COMPILE_FLAGS} $<$:${OPTIMIZATION_FLAGS}> $<$,$>:${DARWIN_OPTIMIZATION_FLAGS}> ) @@ -369,6 +410,7 @@ if (FILAMENT_SUPPORTS_METAL) endif() target_link_libraries(${TARGET} PRIVATE + ${OSMESA_LINKER_FLAGS} $<$,$>:${LINUX_LINKER_OPTIMIZATION_FLAGS}> ) @@ -385,8 +427,8 @@ install(DIRECTORY ${PUBLIC_HDR_DIR}/backend DESTINATION include) # ================================================================================================== option(INSTALL_BACKEND_TEST "Install the backend test library so it can be consumed on iOS" OFF) -if (APPLE) - add_library(backend_test STATIC +if (APPLE OR LINUX) + set(BACKEND_TEST_SRC test/BackendTest.cpp test/ShaderGenerator.cpp test/TrianglePrimitive.cpp @@ -396,20 +438,31 @@ if (APPLE) test/test_MissingRequiredAttributes.cpp test/test_ReadPixels.cpp test/test_BufferUpdates.cpp + test/test_Callbacks.cpp test/test_MRT.cpp + test/test_PushConstants.cpp test/test_LoadImage.cpp - test/test_RenderExternalImage.cpp test/test_StencilBuffer.cpp test/test_Scissor.cpp - ) - - target_link_libraries(backend_test PRIVATE + test/test_MipLevels.cpp + test/test_Handles.cpp + ) + set(BACKEND_TEST_LIBS backend getopt gtest + imageio filamat SPIRV spirv-cross-glsl) +endif() + +if (APPLE) + # TODO: we should expand this test to Linux and other platforms. + list(APPEND BACKEND_TEST_SRC + test/test_RenderExternalImage.cpp) + add_library(backend_test STATIC ${BACKEND_TEST_SRC}) + target_link_libraries(backend_test PRIVATE ${BACKEND_TEST_LIBS}) set(BACKEND_TEST_DEPS OGLCompiler @@ -423,12 +476,11 @@ if (APPLE) glslang spirv-cross-core spirv-cross-glsl - spirv-cross-msl - ) + spirv-cross-msl) if (NOT IOS) target_link_libraries(backend_test PRIVATE image imageio) - list(APPEND BACKEND_TEST_DEPS image imageio) + list(APPEND BACKEND_TEST_DEPS image) endif() set(BACKEND_TEST_COMBINED_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/libbackendtest_combined.a") @@ -442,34 +494,63 @@ if (APPLE) endif() set_target_properties(backend_test PROPERTIES FOLDER Tests) + + if (APPLE AND NOT IOS) + add_executable(backend_test_mac test/mac_runner.mm) + target_link_libraries(backend_test_mac PRIVATE "-framework Metal -framework AppKit -framework QuartzCore") + # Because each test case is a separate file, the -force_load flag is necessary to prevent the + # linker from removing "unused" symbols. + target_link_libraries(backend_test_mac PRIVATE -force_load backend_test) + set_target_properties(backend_test_mac PROPERTIES FOLDER Tests) + + # This is needed after XCode 15.3 + set_target_properties(backend_test_mac PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE) + set_target_properties(backend_test_mac PROPERTIES INSTALL_RPATH /usr/local/lib) + endif() endif() -if (APPLE AND NOT IOS) - add_executable(backend_test_mac test/mac_runner.mm) - target_link_libraries(backend_test_mac PRIVATE "-framework Metal -framework AppKit -framework QuartzCore") - # Because each test case is a separate file, the -force_load flag is necessary to prevent the - # linker from removing "unused" symbols. - target_link_libraries(backend_test_mac PRIVATE -force_load backend_test) - set_target_properties(backend_test_mac PROPERTIES FOLDER Tests) +if (LINUX) + add_executable(backend_test_linux test/linux_runner.cpp ${BACKEND_TEST_SRC}) + target_link_libraries(backend_test_linux PRIVATE ${BACKEND_TEST_LIBS}) + set_target_properties(backend_test_linux PROPERTIES FOLDER Tests) endif() # ================================================================================================== # Compute tests +# +#if (NOT IOS AND NOT WEBGL) +# +#add_executable(compute_test +# test/ComputeTest.cpp +# test/Arguments.cpp +# test/test_ComputeBasic.cpp +# ) +# +#target_link_libraries(compute_test PRIVATE +# backend +# getopt +# gtest +# ) +# +#set_target_properties(compute_test PROPERTIES FOLDER Tests) +# +#endif() -if (NOT IOS AND NOT WEBGL) +# ================================================================================================== +# Metal utils tests -add_executable(compute_test - test/ComputeTest.cpp - test/Arguments.cpp - test/test_ComputeBasic.cpp - ) +if (APPLE AND NOT IOS) + +add_executable(metal_utils_test test/MetalTest.mm) + +target_compile_options(metal_utils_test PRIVATE "-fobjc-arc") -target_link_libraries(compute_test PRIVATE +target_link_libraries(metal_utils_test PRIVATE backend getopt gtest ) -set_target_properties(compute_test PROPERTIES FOLDER Tests) +set_target_properties(metal_utils_test PROPERTIES FOLDER Tests) endif() diff --git a/filament/backend/include/backend/BufferDescriptor.h b/filament/backend/include/backend/BufferDescriptor.h index 80fe182abb2..ebb57537cc9 100644 --- a/filament/backend/include/backend/BufferDescriptor.h +++ b/filament/backend/include/backend/BufferDescriptor.h @@ -23,7 +23,6 @@ #include #include -#include namespace filament::backend { @@ -113,7 +112,7 @@ class UTILS_PUBLIC BufferDescriptor { /** * Helper to create a BufferDescriptor that uses a KNOWN method pointer w/ object passed * by pointer as the callback. e.g.: - * auto bd = BufferDescriptor::make(buffer, size, &Foo::method, foo); + * auto bd = BufferDescriptor::make(buffer, size, foo); * * @param buffer Memory address of the CPU buffer to reference * @param size Size of the CPU buffer in bytes @@ -121,12 +120,12 @@ class UTILS_PUBLIC BufferDescriptor { * @return a new BufferDescriptor */ template - static BufferDescriptor make( - void const* buffer, size_t size, T* data, CallbackHandler* handler = nullptr) noexcept { + static BufferDescriptor make(void const* buffer, size_t size, T* data, + CallbackHandler* handler = nullptr) noexcept { return { buffer, size, handler, [](void* b, size_t s, void* u) { - (*static_cast(u)->*method)(b, s); + (static_cast(u)->*method)(b, s); }, data }; } @@ -145,14 +144,14 @@ class UTILS_PUBLIC BufferDescriptor { * @return a new BufferDescriptor */ template - static BufferDescriptor make( - void const* buffer, size_t size, T&& functor, CallbackHandler* handler = nullptr) noexcept { + static BufferDescriptor make(void const* buffer, size_t size, T&& functor, + CallbackHandler* handler = nullptr) noexcept { return { buffer, size, handler, [](void* b, size_t s, void* u) { - T& that = *static_cast(u); - that(b, s); - delete &that; + T* const that = static_cast(u); + that->operator()(b, s); + delete that; }, new T(std::forward(functor)) }; @@ -201,7 +200,7 @@ class UTILS_PUBLIC BufferDescriptor { return mUser; } - //! CPU mempry-buffer virtual address + //! CPU memory-buffer virtual address void* buffer = nullptr; //! CPU memory-buffer size in bytes diff --git a/filament/backend/include/backend/CallbackHandler.h b/filament/backend/include/backend/CallbackHandler.h index dee3aaa2515..036031a9d09 100644 --- a/filament/backend/include/backend/CallbackHandler.h +++ b/filament/backend/include/backend/CallbackHandler.h @@ -17,8 +17,6 @@ #ifndef TNT_FILAMENT_BACKEND_CALLBACKHANDLER_H #define TNT_FILAMENT_BACKEND_CALLBACKHANDLER_H -#include - namespace filament::backend { /** @@ -66,7 +64,7 @@ class CallbackHandler { virtual void post(void* user, Callback callback) = 0; protected: - virtual ~CallbackHandler(); + virtual ~CallbackHandler() = default; }; } // namespace filament::backend diff --git a/filament/backend/include/backend/DescriptorSetOffsetArray.h b/filament/backend/include/backend/DescriptorSetOffsetArray.h new file mode 100644 index 00000000000..55c06dbeb2d --- /dev/null +++ b/filament/backend/include/backend/DescriptorSetOffsetArray.h @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_COMMANDSTREAMVECTOR_H +#define TNT_FILAMENT_BACKEND_COMMANDSTREAMVECTOR_H + +#include + +#include + +#include +#include + +#include +#include + + +namespace filament::backend { + +void* allocateFromCommandStream(DriverApi& driver, size_t size, size_t alignment) noexcept; + +class DescriptorSetOffsetArray { +public: + using value_type = uint32_t; + using reference = value_type&; + using const_reference = value_type const&; + using size_type = uint32_t; + using difference_type = int32_t; + using pointer = value_type*; + using const_pointer = value_type const*; + using iterator = pointer; + using const_iterator = const_pointer; + + DescriptorSetOffsetArray() noexcept = default; + + ~DescriptorSetOffsetArray() noexcept = default; + + DescriptorSetOffsetArray(size_type size, DriverApi& driver) noexcept { + mOffsets = (value_type *)allocateFromCommandStream(driver, + size * sizeof(value_type), alignof(value_type)); + std::uninitialized_fill_n(mOffsets, size, 0); + } + + DescriptorSetOffsetArray(std::initializer_list list, DriverApi& driver) noexcept { + mOffsets = (value_type *)allocateFromCommandStream(driver, + list.size() * sizeof(value_type), alignof(value_type)); + std::uninitialized_copy(list.begin(), list.end(), mOffsets); + } + + DescriptorSetOffsetArray(DescriptorSetOffsetArray const&) = delete; + DescriptorSetOffsetArray& operator=(DescriptorSetOffsetArray const&) = delete; + + DescriptorSetOffsetArray(DescriptorSetOffsetArray&& rhs) noexcept + : mOffsets(rhs.mOffsets) { + rhs.mOffsets = nullptr; + } + + DescriptorSetOffsetArray& operator=(DescriptorSetOffsetArray&& rhs) noexcept { + if (this != &rhs) { + mOffsets = rhs.mOffsets; + rhs.mOffsets = nullptr; + } + return *this; + } + + bool empty() const noexcept { return mOffsets == nullptr; } + + value_type* data() noexcept { return mOffsets; } + const value_type* data() const noexcept { return mOffsets; } + + + reference operator[](size_type n) noexcept { + return *(data() + n); + } + + const_reference operator[](size_type n) const noexcept { + return *(data() + n); + } + + void clear() noexcept { + mOffsets = nullptr; + } + +private: + value_type *mOffsets = nullptr; +}; + +} // namespace filament::backend + +#if !defined(NDEBUG) +utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::DescriptorSetOffsetArray& rhs); +#endif + +#endif //TNT_FILAMENT_BACKEND_COMMANDSTREAMVECTOR_H diff --git a/filament/backend/include/backend/DriverEnums.h b/filament/backend/include/backend/DriverEnums.h index fb6c4be3203..2b68ced9c18 100644 --- a/filament/backend/include/backend/DriverEnums.h +++ b/filament/backend/include/backend/DriverEnums.h @@ -19,16 +19,23 @@ #ifndef TNT_FILAMENT_BACKEND_DRIVERENUMS_H #define TNT_FILAMENT_BACKEND_DRIVERENUMS_H -#include #include // Because we define ERROR in the FenceStatus enum. +#include #include +#include +#include +#include +#include +#include #include #include -#include // FIXME: STL headers are not allowed in public headers +#include +#include +#include #include #include @@ -42,15 +49,63 @@ */ namespace filament::backend { +/** + * Requests a SwapChain with an alpha channel. + */ static constexpr uint64_t SWAP_CHAIN_CONFIG_TRANSPARENT = 0x1; + +/** + * This flag indicates that the swap chain may be used as a source surface + * for reading back render results. This config flag must be set when creating + * any SwapChain that will be used as the source for a blit operation. + */ static constexpr uint64_t SWAP_CHAIN_CONFIG_READABLE = 0x2; + +/** + * Indicates that the native X11 window is an XCB window rather than an XLIB window. + * This is ignored on non-Linux platforms and in builds that support only one X11 API. + */ static constexpr uint64_t SWAP_CHAIN_CONFIG_ENABLE_XCB = 0x4; + +/** + * Indicates that the native window is a CVPixelBufferRef. + * + * This is only supported by the Metal backend. The CVPixelBuffer must be in the + * kCVPixelFormatType_32BGRA format. + * + * It is not necessary to add an additional retain call before passing the pixel buffer to + * Filament. Filament will call CVPixelBufferRetain during Engine::createSwapChain, and + * CVPixelBufferRelease when the swap chain is destroyed. + */ static constexpr uint64_t SWAP_CHAIN_CONFIG_APPLE_CVPIXELBUFFER = 0x8; +/** + * Indicates that the SwapChain must automatically perform linear to srgb encoding. + */ +static constexpr uint64_t SWAP_CHAIN_CONFIG_SRGB_COLORSPACE = 0x10; + +/** + * Indicates that the SwapChain should also contain a stencil component. + */ +static constexpr uint64_t SWAP_CHAIN_CONFIG_HAS_STENCIL_BUFFER = 0x20; +static constexpr uint64_t SWAP_CHAIN_HAS_STENCIL_BUFFER = SWAP_CHAIN_CONFIG_HAS_STENCIL_BUFFER; + +/** + * The SwapChain contains protected content. Currently only supported by OpenGLPlatform and + * only when OpenGLPlatform::isProtectedContextSupported() is true. + */ +static constexpr uint64_t SWAP_CHAIN_CONFIG_PROTECTED_CONTENT = 0x40; + static constexpr size_t MAX_VERTEX_ATTRIBUTE_COUNT = 16; // This is guaranteed by OpenGL ES. static constexpr size_t MAX_SAMPLER_COUNT = 62; // Maximum needed at feature level 3. static constexpr size_t MAX_VERTEX_BUFFER_COUNT = 16; // Max number of bound buffer objects. static constexpr size_t MAX_SSBO_COUNT = 4; // This is guaranteed by OpenGL ES. +static constexpr size_t MAX_DESCRIPTOR_SET_COUNT = 4; // This is guaranteed by Vulkan. +static constexpr size_t MAX_DESCRIPTOR_COUNT = 64; // per set + +static constexpr size_t MAX_PUSH_CONSTANT_COUNT = 32; // Vulkan 1.1 spec allows for 128-byte + // of push constant (we assume 4-byte + // types). // Per feature level caps // Use (int)FeatureLevel to index this array @@ -68,14 +123,15 @@ static_assert(MAX_VERTEX_BUFFER_COUNT <= MAX_VERTEX_ATTRIBUTE_COUNT, "The number of buffer objects that can be attached to a VertexBuffer must be " "less than or equal to the maximum number of vertex attributes."); -static constexpr size_t CONFIG_UNIFORM_BINDING_COUNT = 10; // This is guaranteed by OpenGL ES. +static constexpr size_t CONFIG_UNIFORM_BINDING_COUNT = 9; // This is guaranteed by OpenGL ES. static constexpr size_t CONFIG_SAMPLER_BINDING_COUNT = 4; // This is guaranteed by OpenGL ES. /** * Defines the backend's feature levels. */ enum class FeatureLevel : uint8_t { - FEATURE_LEVEL_1 = 1, //!< OpenGL ES 3.0 features (default) + FEATURE_LEVEL_0 = 0, //!< OpenGL ES 2.0 features + FEATURE_LEVEL_1, //!< OpenGL ES 3.0 features (default) FEATURE_LEVEL_2, //!< OpenGL ES 3.1 features + 16 textures units + cubemap arrays FEATURE_LEVEL_3 //!< OpenGL ES 3.1 features + 31 textures units + cubemap arrays }; @@ -91,6 +147,12 @@ enum class Backend : uint8_t { NOOP = 4, //!< Selects the no-op driver for testing purposes. }; +enum class TimerQueryResult : int8_t { + ERROR = -1, // an error occurred, result won't be available + NOT_READY = 0, // result to ready yet + AVAILABLE = 1, // result is available +}; + static constexpr const char* backendToString(Backend backend) { switch (backend) { case Backend::NOOP: @@ -106,6 +168,99 @@ static constexpr const char* backendToString(Backend backend) { } } +/** + * Defines the shader language. Similar to the above backend enum, with some differences: + * - The OpenGL backend can select between two shader languages: ESSL 1.0 and ESSL 3.0. + * - The Metal backend can prefer precompiled Metal libraries, while falling back to MSL. + */ +enum class ShaderLanguage { + ESSL1 = 0, + ESSL3 = 1, + SPIRV = 2, + MSL = 3, + METAL_LIBRARY = 4, +}; + +static constexpr const char* shaderLanguageToString(ShaderLanguage shaderLanguage) { + switch (shaderLanguage) { + case ShaderLanguage::ESSL1: + return "ESSL 1.0"; + case ShaderLanguage::ESSL3: + return "ESSL 3.0"; + case ShaderLanguage::SPIRV: + return "SPIR-V"; + case ShaderLanguage::MSL: + return "MSL"; + case ShaderLanguage::METAL_LIBRARY: + return "Metal precompiled library"; + } +} + +enum class ShaderStage : uint8_t { + VERTEX = 0, + FRAGMENT = 1, + COMPUTE = 2 +}; + +static constexpr size_t PIPELINE_STAGE_COUNT = 2; +enum class ShaderStageFlags : uint8_t { + NONE = 0, + VERTEX = 0x1, + FRAGMENT = 0x2, + COMPUTE = 0x4, + ALL_SHADER_STAGE_FLAGS = VERTEX | FRAGMENT | COMPUTE +}; + +static inline constexpr bool hasShaderType(ShaderStageFlags flags, ShaderStage type) noexcept { + switch (type) { + case ShaderStage::VERTEX: + return bool(uint8_t(flags) & uint8_t(ShaderStageFlags::VERTEX)); + case ShaderStage::FRAGMENT: + return bool(uint8_t(flags) & uint8_t(ShaderStageFlags::FRAGMENT)); + case ShaderStage::COMPUTE: + return bool(uint8_t(flags) & uint8_t(ShaderStageFlags::COMPUTE)); + } +} + +enum class DescriptorType : uint8_t { + UNIFORM_BUFFER, + SHADER_STORAGE_BUFFER, + SAMPLER, + INPUT_ATTACHMENT, + SAMPLER_EXTERNAL +}; + +enum class DescriptorFlags : uint8_t { + NONE = 0x00, + DYNAMIC_OFFSET = 0x01 +}; + +using descriptor_set_t = uint8_t; + +using descriptor_binding_t = uint8_t; + +struct DescriptorSetLayoutBinding { + DescriptorType type; + ShaderStageFlags stageFlags; + descriptor_binding_t binding; + DescriptorFlags flags = DescriptorFlags::NONE; + uint16_t count = 0; + + friend inline bool operator==( + DescriptorSetLayoutBinding const& lhs, + DescriptorSetLayoutBinding const& rhs) noexcept { + return lhs.type == rhs.type && + lhs.flags == rhs.flags && + lhs.count == rhs.count && + lhs.stageFlags == rhs.stageFlags; + } +}; + +struct DescriptorSetLayout { + utils::FixedCapacityVector bindings; +}; + + /** * Bitmask for selecting render buffers */ @@ -164,6 +319,18 @@ struct Viewport { int32_t right() const noexcept { return left + int32_t(width); } //! get the top coordinate in window space of the viewport int32_t top() const noexcept { return bottom + int32_t(height); } + + friend bool operator==(Viewport const& lhs, Viewport const& rhs) noexcept { + // clang can do this branchless with xor/or + return lhs.left == rhs.left && lhs.bottom == rhs.bottom && + lhs.width == rhs.width && lhs.height == rhs.height; + } + + friend bool operator!=(Viewport const& lhs, Viewport const& rhs) noexcept { + // clang is being dumb and uses branches + return bool(((lhs.left ^ rhs.left) | (lhs.bottom ^ rhs.bottom)) | + ((lhs.width ^ rhs.width) | (lhs.height ^ rhs.height))); + } }; /** @@ -184,15 +351,6 @@ enum class FenceStatus : int8_t { TIMEOUT_EXPIRED = 1, //!< wait()'s timeout expired. The Fence condition is not satisfied. }; -/** - * Status codes for sync objects - */ -enum class SyncStatus : int8_t { - ERROR = -1, //!< An error occurred. The Sync is not signaled. - SIGNALED = 0, //!< The Sync is signaled. - NOT_SIGNALED = 1, //!< The Sync is not signaled yet -}; - static constexpr uint64_t FENCE_WAIT_FOR_EVER = uint64_t(-1); /** @@ -248,6 +406,15 @@ enum class UniformType : uint8_t { STRUCT }; +/** + * Supported constant parameter types + */ +enum class ConstantType : uint8_t { + INT, + FLOAT, + BOOL +}; + enum class Precision : uint8_t { LOW, MEDIUM, @@ -255,6 +422,14 @@ enum class Precision : uint8_t { DEFAULT }; +/** + * Shader compiler priority queue + */ +enum class CompilerPriorityQueue : uint8_t { + HIGH, + LOW +}; + //! Texture sampler type enum class SamplerType : uint8_t { SAMPLER_2D, //!< 2D texture @@ -579,15 +754,19 @@ enum class TextureFormat : uint16_t { }; //! Bitmask describing the intended Texture Usage -enum class TextureUsage : uint8_t { - NONE = 0x0, - COLOR_ATTACHMENT = 0x1, //!< Texture can be used as a color attachment - DEPTH_ATTACHMENT = 0x2, //!< Texture can be used as a depth attachment - STENCIL_ATTACHMENT = 0x4, //!< Texture can be used as a stencil attachment - UPLOADABLE = 0x8, //!< Data can be uploaded into this texture (default) - SAMPLEABLE = 0x10, //!< Texture can be sampled (default) - SUBPASS_INPUT = 0x20, //!< Texture can be used as a subpass input - DEFAULT = UPLOADABLE | SAMPLEABLE //!< Default texture usage +enum class TextureUsage : uint16_t { + NONE = 0x0000, + COLOR_ATTACHMENT = 0x0001, //!< Texture can be used as a color attachment + DEPTH_ATTACHMENT = 0x0002, //!< Texture can be used as a depth attachment + STENCIL_ATTACHMENT = 0x0004, //!< Texture can be used as a stencil attachment + UPLOADABLE = 0x0008, //!< Data can be uploaded into this texture (default) + SAMPLEABLE = 0x0010, //!< Texture can be sampled (default) + SUBPASS_INPUT = 0x0020, //!< Texture can be used as a subpass input + BLIT_SRC = 0x0040, //!< Texture can be used the source of a blit() + BLIT_DST = 0x0080, //!< Texture can be used the destination of a blit() + PROTECTED = 0x0100, //!< Texture can be used for protected content + DEFAULT = UPLOADABLE | SAMPLEABLE, //!< Default texture usage + ALL_ATTACHMENTS = COLOR_ATTACHMENT | DEPTH_ATTACHMENT | STENCIL_ATTACHMENT | SUBPASS_INPUT, //!< Mask of all attachments }; //! Texture swizzle @@ -614,6 +793,17 @@ static constexpr bool isDepthFormat(TextureFormat format) noexcept { } } +static constexpr bool isStencilFormat(TextureFormat format) noexcept { + switch (format) { + case TextureFormat::STENCIL8: + case TextureFormat::DEPTH24_STENCIL8: + case TextureFormat::DEPTH32F_STENCIL8: + return true; + default: + return false; + } +} + static constexpr bool isUnsignedIntFormat(TextureFormat format) { switch (format) { case TextureFormat::R8UI: @@ -747,32 +937,66 @@ enum class SamplerCompareFunc : uint8_t { //! Sampler parameters struct SamplerParams { // NOLINT - union { - struct { - SamplerMagFilter filterMag : 1; //!< magnification filter (NEAREST) - SamplerMinFilter filterMin : 3; //!< minification filter (NEAREST) - SamplerWrapMode wrapS : 2; //!< s-coordinate wrap mode (CLAMP_TO_EDGE) - SamplerWrapMode wrapT : 2; //!< t-coordinate wrap mode (CLAMP_TO_EDGE) - - SamplerWrapMode wrapR : 2; //!< r-coordinate wrap mode (CLAMP_TO_EDGE) - uint8_t anisotropyLog2 : 3; //!< anisotropy level (0) - SamplerCompareMode compareMode : 1; //!< sampler compare mode (NONE) - uint8_t padding0 : 2; //!< reserved. must be 0. + SamplerMagFilter filterMag : 1; //!< magnification filter (NEAREST) + SamplerMinFilter filterMin : 3; //!< minification filter (NEAREST) + SamplerWrapMode wrapS : 2; //!< s-coordinate wrap mode (CLAMP_TO_EDGE) + SamplerWrapMode wrapT : 2; //!< t-coordinate wrap mode (CLAMP_TO_EDGE) + + SamplerWrapMode wrapR : 2; //!< r-coordinate wrap mode (CLAMP_TO_EDGE) + uint8_t anisotropyLog2 : 3; //!< anisotropy level (0) + SamplerCompareMode compareMode : 1; //!< sampler compare mode (NONE) + uint8_t padding0 : 2; //!< reserved. must be 0. + + SamplerCompareFunc compareFunc : 3; //!< sampler comparison function (LE) + uint8_t padding1 : 5; //!< reserved. must be 0. + uint8_t padding2 : 8; //!< reserved. must be 0. + + struct Hasher { + size_t operator()(SamplerParams p) const noexcept { + // we don't use std::hash<> here, so we don't have to include + return *reinterpret_cast(reinterpret_cast(&p)); + } + }; - SamplerCompareFunc compareFunc : 3; //!< sampler comparison function (LE) - uint8_t padding1 : 5; //!< reserved. must be 0. + struct EqualTo { + bool operator()(SamplerParams lhs, SamplerParams rhs) const noexcept { + assert_invariant(lhs.padding0 == 0); + assert_invariant(lhs.padding1 == 0); + assert_invariant(lhs.padding2 == 0); + auto* pLhs = reinterpret_cast(reinterpret_cast(&lhs)); + auto* pRhs = reinterpret_cast(reinterpret_cast(&rhs)); + return *pLhs == *pRhs; + } + }; - uint8_t padding2 : 8; //!< reserved. must be 0. - }; - uint32_t u; + struct LessThan { + bool operator()(SamplerParams lhs, SamplerParams rhs) const noexcept { + assert_invariant(lhs.padding0 == 0); + assert_invariant(lhs.padding1 == 0); + assert_invariant(lhs.padding2 == 0); + auto* pLhs = reinterpret_cast(reinterpret_cast(&lhs)); + auto* pRhs = reinterpret_cast(reinterpret_cast(&rhs)); + return *pLhs == *pRhs; + } }; + private: - friend inline bool operator < (SamplerParams lhs, SamplerParams rhs) { - return lhs.u < rhs.u; + friend inline bool operator == (SamplerParams lhs, SamplerParams rhs) noexcept { + return SamplerParams::EqualTo{}(lhs, rhs); + } + friend inline bool operator != (SamplerParams lhs, SamplerParams rhs) noexcept { + return !SamplerParams::EqualTo{}(lhs, rhs); + } + friend inline bool operator < (SamplerParams lhs, SamplerParams rhs) noexcept { + return SamplerParams::LessThan{}(lhs, rhs); } }; +static_assert(sizeof(SamplerParams) == 4); -static_assert(sizeof(SamplerParams) == sizeof(uint32_t), "SamplerParams must be 32 bits"); +// The limitation to 64-bits max comes from how we store a SamplerParams in our JNI code +// see android/.../TextureSampler.cpp +static_assert(sizeof(SamplerParams) <= sizeof(uint64_t), + "SamplerParams must be no more than 64 bits"); //! blending equation function enum class BlendEquation : uint8_t { @@ -919,7 +1143,7 @@ struct RasterState { bool inverseFrontFaces : 1; // 31 //! padding, must be 0 - uint8_t padding : 1; // 32 + bool depthClamp : 1; // 32 }; uint32_t u = 0; }; @@ -930,32 +1154,6 @@ struct RasterState { * \privatesection */ -enum class ShaderStage : uint8_t { - VERTEX = 0, - FRAGMENT = 1, - COMPUTE = 2 -}; - -static constexpr size_t PIPELINE_STAGE_COUNT = 2; -enum class ShaderStageFlags : uint8_t { - NONE = 0, - VERTEX = 0x1, - FRAGMENT = 0x2, - COMPUTE = 0x4, - ALL_SHADER_STAGE_FLAGS = VERTEX | FRAGMENT | COMPUTE -}; - -static inline constexpr bool hasShaderType(ShaderStageFlags flags, ShaderStage type) noexcept { - switch (type) { - case ShaderStage::VERTEX: - return bool(uint8_t(flags) & uint8_t(ShaderStageFlags::VERTEX)); - case ShaderStage::FRAGMENT: - return bool(uint8_t(flags) & uint8_t(ShaderStageFlags::FRAGMENT)); - case ShaderStage::COMPUTE: - return bool(uint8_t(flags) & uint8_t(ShaderStageFlags::COMPUTE)); - } -} - /** * Selects which buffers to clear at the beginning of the render pass, as well as which buffers * can be discarded at the beginning and end of the render pass. @@ -1057,11 +1255,27 @@ struct StencilState { //! Stencil operations for front-facing polygons StencilOperations front = { - .stencilFunc = StencilFunction::A, .ref = 0, .readMask = 0xff, .writeMask = 0xff }; + .stencilFunc = StencilFunction::A, + .stencilOpStencilFail = StencilOperation::KEEP, + .padding0 = 0, + .stencilOpDepthFail = StencilOperation::KEEP, + .stencilOpDepthStencilPass = StencilOperation::KEEP, + .padding1 = 0, + .ref = 0, + .readMask = 0xff, + .writeMask = 0xff }; //! Stencil operations for back-facing polygons StencilOperations back = { - .stencilFunc = StencilFunction::A, .ref = 0, .readMask = 0xff, .writeMask = 0xff }; + .stencilFunc = StencilFunction::A, + .stencilOpStencilFail = StencilOperation::KEEP, + .padding0 = 0, + .stencilOpDepthFail = StencilOperation::KEEP, + .stencilOpDepthStencilPass = StencilOperation::KEEP, + .padding1 = 0, + .ref = 0, + .readMask = 0xff, + .writeMask = 0xff }; //! Whether stencil-buffer writes are enabled bool stencilWrite = false; @@ -1069,32 +1283,43 @@ struct StencilState { uint8_t padding = 0; }; +using PushConstantVariant = std::variant; + static_assert(sizeof(StencilState::StencilOperations) == 5u, "StencilOperations size not what was intended"); static_assert(sizeof(StencilState) == 12u, "StencilState size not what was intended"); -using FrameScheduledCallback = void(*)(PresentCallable callable, void* user); - -using FrameCompletedCallback = void(*)(void* user); +using FrameScheduledCallback = utils::Invocable; enum class Workaround : uint16_t { // The EASU pass must split because shader compiler flattens early-exit branch SPLIT_EASU, - // Backend allows feedback loop with ancillary buffers (depth/stencil) as long as they're read-only for - // the whole render pass. + // Backend allows feedback loop with ancillary buffers (depth/stencil) as long as they're + // read-only for the whole render pass. ALLOW_READ_ONLY_ANCILLARY_FEEDBACK_LOOP, // for some uniform arrays, it's needed to do an initialization to avoid crash on adreno gpu - ADRENO_UNIFORM_ARRAY_CRASH + ADRENO_UNIFORM_ARRAY_CRASH, + // Workaround a Metal pipeline compilation error with the message: + // "Could not statically determine the target of a texture". See light_indirect.fs + METAL_STATIC_TEXTURE_TARGET_ERROR, + // Adreno drivers sometimes aren't able to blit into a layer of a texture array. + DISABLE_BLIT_INTO_TEXTURE_ARRAY, + // Multiple workarounds needed for PowerVR GPUs + POWER_VR_SHADER_WORKAROUNDS, }; +using StereoscopicType = backend::Platform::StereoscopicType; + } // namespace filament::backend template<> struct utils::EnableBitMaskOperators : public std::true_type {}; template<> struct utils::EnableBitMaskOperators : public std::true_type {}; +template<> struct utils::EnableBitMaskOperators + : public std::true_type {}; template<> struct utils::EnableBitMaskOperators : public std::true_type {}; template<> struct utils::EnableBitMaskOperators @@ -1127,12 +1352,16 @@ utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::Textu utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::TextureUsage usage); utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::BufferObjectBinding binding); utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::TextureSwizzle swizzle); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::ShaderStage shaderStage); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::ShaderStageFlags stageFlags); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::CompilerPriorityQueue compilerPriorityQueue); +utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::PushConstantVariant pushConstantVariant); utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::AttributeArray& type); +utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::DescriptorSetLayout& dsl); utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::PolygonOffset& po); utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::RasterState& rs); utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::RenderPassParams& b); utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::Viewport& v); -utils::io::ostream& operator<<(utils::io::ostream& out, filament::backend::ShaderStageFlags stageFlags); #endif #endif // TNT_FILAMENT_BACKEND_DRIVERENUMS_H diff --git a/filament/backend/include/backend/Handle.h b/filament/backend/include/backend/Handle.h index 7317e2c59b1..5b03df2150f 100644 --- a/filament/backend/include/backend/Handle.h +++ b/filament/backend/include/backend/Handle.h @@ -17,16 +17,15 @@ #ifndef TNT_FILAMENT_BACKEND_HANDLE_H #define TNT_FILAMENT_BACKEND_HANDLE_H -#include #if !defined(NDEBUG) -#include +#include #endif #include -#include +#include // FIXME: STL headers are not allowed in public headers +#include -#include -#include +#include namespace filament::backend { @@ -36,13 +35,14 @@ struct HwIndexBuffer; struct HwProgram; struct HwRenderPrimitive; struct HwRenderTarget; -struct HwSamplerGroup; struct HwStream; struct HwSwapChain; -struct HwSync; struct HwTexture; struct HwTimerQuery; +struct HwVertexBufferInfo; struct HwVertexBuffer; +struct HwDescriptorSetLayout; +struct HwDescriptorSet; /* * A handle to a backend resource. HandleBase is for internal use only. @@ -55,7 +55,7 @@ struct HwVertexBuffer; class HandleBase { public: using HandleId = uint32_t; - static constexpr const HandleId nullid = HandleId{ std::numeric_limits::max() }; + static constexpr const HandleId nullid = HandleId{ UINT32_MAX }; constexpr HandleBase() noexcept: object(nullid) {} @@ -65,14 +65,6 @@ class HandleBase { // clear the handle, this doesn't free associated resources void clear() noexcept { object = nullid; } - // compare handles - bool operator==(const HandleBase& rhs) const noexcept { return object == rhs.object; } - bool operator!=(const HandleBase& rhs) const noexcept { return object != rhs.object; } - bool operator<(const HandleBase& rhs) const noexcept { return object < rhs.object; } - bool operator<=(const HandleBase& rhs) const noexcept { return object <= rhs.object; } - bool operator>(const HandleBase& rhs) const noexcept { return object > rhs.object; } - bool operator>=(const HandleBase& rhs) const noexcept { return object >= rhs.object; } - // get this handle's handleId HandleId getId() const noexcept { return object; } @@ -85,6 +77,19 @@ class HandleBase { HandleBase(HandleBase const& rhs) noexcept = default; HandleBase& operator=(HandleBase const& rhs) noexcept = default; + HandleBase(HandleBase&& rhs) noexcept + : object(rhs.object) { + rhs.object = nullid; + } + + HandleBase& operator=(HandleBase&& rhs) noexcept { + if (this != &rhs) { + object = rhs.object; + rhs.object = nullid; + } + return *this; + } + private: HandleId object; }; @@ -99,11 +104,31 @@ struct Handle : public HandleBase { Handle() noexcept = default; Handle(Handle const& rhs) noexcept = default; - - Handle& operator=(Handle const& rhs) noexcept = default; + Handle(Handle&& rhs) noexcept = default; + + // Explicitly redefine copy/move assignment operators rather than just using default here. + // Because it doesn't make a call to the parent's method automatically during the std::move + // function call(https://en.cppreference.com/w/cpp/algorithm/move) in certain compilers like + // NDK 25.1.8937393 and below (see b/371980551) + Handle& operator=(Handle const& rhs) noexcept { + HandleBase::operator=(rhs); + return *this; + } + Handle& operator=(Handle&& rhs) noexcept { + HandleBase::operator=(std::move(rhs)); + return *this; + } explicit Handle(HandleId id) noexcept : HandleBase(id) { } + // compare handles of the same type + bool operator==(const Handle& rhs) const noexcept { return getId() == rhs.getId(); } + bool operator!=(const Handle& rhs) const noexcept { return getId() != rhs.getId(); } + bool operator<(const Handle& rhs) const noexcept { return getId() < rhs.getId(); } + bool operator<=(const Handle& rhs) const noexcept { return getId() <= rhs.getId(); } + bool operator>(const Handle& rhs) const noexcept { return getId() > rhs.getId(); } + bool operator>=(const Handle& rhs) const noexcept { return getId() >= rhs.getId(); } + // type-safe Handle cast template::value> > Handle(Handle const& base) noexcept : HandleBase(base) { } // NOLINT(hicpp-explicit-conversions,google-explicit-constructor) @@ -117,19 +142,20 @@ struct Handle : public HandleBase { // Types used by the command stream // (we use this renaming because the macro-system doesn't deal well with "<" and ">") -using BufferObjectHandle = Handle; -using FenceHandle = Handle; -using IndexBufferHandle = Handle; -using ProgramHandle = Handle; -using RenderPrimitiveHandle = Handle; -using RenderTargetHandle = Handle; -using SamplerGroupHandle = Handle; -using StreamHandle = Handle; -using SwapChainHandle = Handle; -using SyncHandle = Handle; -using TextureHandle = Handle; -using TimerQueryHandle = Handle; -using VertexBufferHandle = Handle; +using BufferObjectHandle = Handle; +using FenceHandle = Handle; +using IndexBufferHandle = Handle; +using ProgramHandle = Handle; +using RenderPrimitiveHandle = Handle; +using RenderTargetHandle = Handle; +using StreamHandle = Handle; +using SwapChainHandle = Handle; +using TextureHandle = Handle; +using TimerQueryHandle = Handle; +using VertexBufferHandle = Handle; +using VertexBufferInfoHandle = Handle; +using DescriptorSetLayoutHandle = Handle; +using DescriptorSetHandle = Handle; } // namespace filament::backend diff --git a/filament/backend/include/backend/PipelineState.h b/filament/backend/include/backend/PipelineState.h index 8b31c5f3dfd..051a381a521 100644 --- a/filament/backend/include/backend/PipelineState.h +++ b/filament/backend/include/backend/PipelineState.h @@ -20,7 +20,9 @@ #include #include -#include +#include + +#include #include @@ -28,15 +30,20 @@ namespace filament::backend { //! \privatesection +struct PipelineLayout { + using SetLayout = std::array, MAX_DESCRIPTOR_SET_COUNT>; + SetLayout setLayout; // 16 +}; + struct PipelineState { - Handle program; - RasterState rasterState; - StencilState stencilState; - PolygonOffset polygonOffset; - Viewport scissor{ 0, 0, - (uint32_t)std::numeric_limits::max(), - (uint32_t)std::numeric_limits::max() - }; + Handle program; // 4 + Handle vertexBufferInfo; // 4 + PipelineLayout pipelineLayout; // 16 + RasterState rasterState; // 4 + StencilState stencilState; // 12 + PolygonOffset polygonOffset; // 8 + PrimitiveType primitiveType = PrimitiveType::TRIANGLES; // 1 + uint8_t padding[3] = {}; // 3 }; } // namespace filament::backend diff --git a/filament/backend/include/backend/PixelBufferDescriptor.h b/filament/backend/include/backend/PixelBufferDescriptor.h index 2a1a2c66547..c45f344d02a 100644 --- a/filament/backend/include/backend/PixelBufferDescriptor.h +++ b/filament/backend/include/backend/PixelBufferDescriptor.h @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -141,7 +142,7 @@ class UTILS_PUBLIC PixelBufferDescriptor : public BufferDescriptor { CallbackHandler* handler = nullptr) noexcept { return { buffer, size, format, type, alignment, left, top, stride, handler, [](void* b, size_t s, void* u) { - (*static_cast(u)->*method)(b, s); }, data }; + (static_cast(u)->*method)(b, s); }, data }; } template @@ -149,7 +150,7 @@ class UTILS_PUBLIC PixelBufferDescriptor : public BufferDescriptor { PixelDataFormat format, PixelDataType type, T* data, CallbackHandler* handler = nullptr) noexcept { return { buffer, size, format, type, handler, [](void* b, size_t s, void* u) { - (*static_cast(u)->*method)(b, s); }, data }; + (static_cast(u)->*method)(b, s); }, data }; } template @@ -157,7 +158,7 @@ class UTILS_PUBLIC PixelBufferDescriptor : public BufferDescriptor { backend::CompressedPixelDataType format, uint32_t imageSize, T* data, CallbackHandler* handler = nullptr) noexcept { return { buffer, size, format, imageSize, handler, [](void* b, size_t s, void* u) { - (*static_cast(u)->*method)(b, s); }, data + (static_cast(u)->*method)(b, s); }, data }; } @@ -168,9 +169,9 @@ class UTILS_PUBLIC PixelBufferDescriptor : public BufferDescriptor { CallbackHandler* handler = nullptr) noexcept { return { buffer, size, format, type, alignment, left, top, stride, handler, [](void* b, size_t s, void* u) { - T& that = *static_cast(u); - that(b, s); - delete &that; + T* const that = static_cast(u); + that->operator()(b, s); + delete that; }, new T(std::forward(functor)) }; } @@ -181,9 +182,9 @@ class UTILS_PUBLIC PixelBufferDescriptor : public BufferDescriptor { CallbackHandler* handler = nullptr) noexcept { return { buffer, size, format, type, handler, [](void* b, size_t s, void* u) { - T& that = *static_cast(u); - that(b, s); - delete &that; + T* const that = static_cast(u); + that->operator()(b, s); + delete that; }, new T(std::forward(functor)) }; } @@ -194,9 +195,9 @@ class UTILS_PUBLIC PixelBufferDescriptor : public BufferDescriptor { CallbackHandler* handler = nullptr) noexcept { return { buffer, size, format, imageSize, handler, [](void* b, size_t s, void* u) { - T& that = *static_cast(u); - that(b, s); - delete &that; + T* const that = static_cast(u); + that->operator()(b, s); + delete that; }, new T(std::forward(functor)) }; } @@ -279,8 +280,8 @@ class UTILS_PUBLIC PixelBufferDescriptor : public BufferDescriptor { break; } - size_t bpr = bpp * stride; - size_t bprAligned = (bpr + (alignment - 1)) & (~alignment + 1); + size_t const bpr = bpp * stride; + size_t const bprAligned = (bpr + (alignment - 1)) & (~alignment + 1); return bprAligned * height; } diff --git a/filament/backend/include/backend/Platform.h b/filament/backend/include/backend/Platform.h index 210b047cc7f..f9adc51a623 100644 --- a/filament/backend/include/backend/Platform.h +++ b/filament/backend/include/backend/Platform.h @@ -19,9 +19,11 @@ #ifndef TNT_FILAMENT_BACKEND_PLATFORM_H #define TNT_FILAMENT_BACKEND_PLATFORM_H -#include - #include +#include + +#include +#include namespace filament::backend { @@ -39,14 +41,67 @@ class UTILS_PUBLIC Platform { struct Fence {}; struct Stream {}; + /** + * The type of technique for stereoscopic rendering. (Note that the materials used will need to + * be compatible with the chosen technique.) + */ + enum class StereoscopicType : uint8_t { + /** + * No stereoscopic rendering + */ + NONE, + /** + * Stereoscopic rendering is performed using instanced rendering technique. + */ + INSTANCED, + /** + * Stereoscopic rendering is performed using the multiview feature from the graphics + * backend. + */ + MULTIVIEW, + }; + struct DriverConfig { - /* - * size of handle arena in bytes. Setting to 0 indicates default value is to be used. + /** + * Size of handle arena in bytes. Setting to 0 indicates default value is to be used. * Driver clamps to valid values. */ size_t handleArenaSize = 0; + + size_t metalUploadBufferSizeBytes = 512 * 1024; + + /** + * Set to `true` to forcibly disable parallel shader compilation in the backend. + * Currently only honored by the GL and Metal backends. + */ + bool disableParallelShaderCompile = false; + + /** + * Disable backend handles use-after-free checks. + */ + bool disableHandleUseAfterFreeCheck = false; + + /** + * Force GLES2 context if supported, or pretend the context is ES2. Only meaningful on + * GLES 3.x backends. + */ + bool forceGLES2Context = false; + + /** + * Sets the technique for stereoscopic rendering. + */ + StereoscopicType stereoscopicType = StereoscopicType::NONE; + + /** + * Assert the native window associated to a SwapChain is valid when calling makeCurrent(). + * This is only supported for: + * - PlatformEGLAndroid + */ + bool assertNativeWindowIsValid = false; }; + Platform() noexcept; + virtual ~Platform() noexcept; /** @@ -68,7 +123,7 @@ class UTILS_PUBLIC Platform { * * @return nullptr on failure, or a pointer to the newly created driver. */ - virtual backend::Driver* createDriver(void* sharedContext, + virtual backend::Driver* UTILS_NULLABLE createDriver(void* UTILS_NULLABLE sharedContext, const DriverConfig& driverConfig) noexcept = 0; /** @@ -79,6 +134,133 @@ class UTILS_PUBLIC Platform { * thread, or if the platform does not need to perform any special processing. */ virtual bool pumpEvents() noexcept; + + /** + * InsertBlobFunc is an Invocable to an application-provided function that a + * backend implementation may use to insert a key/value pair into the + * cache. + */ + using InsertBlobFunc = utils::Invocable< + void(const void* UTILS_NONNULL key, size_t keySize, + const void* UTILS_NONNULL value, size_t valueSize)>; + + /* + * RetrieveBlobFunc is an Invocable to an application-provided function that a + * backend implementation may use to retrieve a cached value from the + * cache. + */ + using RetrieveBlobFunc = utils::Invocable< + size_t(const void* UTILS_NONNULL key, size_t keySize, + void* UTILS_NONNULL value, size_t valueSize)>; + + /** + * Sets the callback functions that the backend can use to interact with caching functionality + * provided by the application. + * + * Cache functions may only be specified once during the lifetime of a + * Platform. The and Invocables may be called at any time and + * from any thread from the time at which setBlobFunc is called until the time that Platform + * is destroyed. Concurrent calls to these functions from different threads is also allowed. + * Either function can be null. + * + * @param insertBlob an Invocable that inserts a new value into the cache and associates + * it with the given key + * @param retrieveBlob an Invocable that retrieves from the cache the value associated with a + * given key + */ + void setBlobFunc(InsertBlobFunc&& insertBlob, RetrieveBlobFunc&& retrieveBlob) noexcept; + + /** + * @return true if insertBlob is valid. + */ + bool hasInsertBlobFunc() const noexcept; + + /** + * @return true if retrieveBlob is valid. + */ + bool hasRetrieveBlobFunc() const noexcept; + + /** + * @return true if either of insertBlob or retrieveBlob are valid. + */ + bool hasBlobFunc() const noexcept { + return hasInsertBlobFunc() || hasRetrieveBlobFunc(); + } + + /** + * To insert a new binary value into the cache and associate it with a given + * key, the backend implementation can call the application-provided callback + * function insertBlob. + * + * No guarantees are made as to whether a given key/value pair is present in + * the cache after the set call. If a different value has been associated + * with the given key in the past then it is undefined which value, if any, is + * associated with the key after the set call. Note that while there are no + * guarantees, the cache implementation should attempt to cache the most + * recently set value for a given key. + * + * @param key pointer to the beginning of the key data that is to be inserted + * @param keySize specifies the size in byte of the data pointed to by + * @param value pointer to the beginning of the value data that is to be inserted + * @param valueSize specifies the size in byte of the data pointed to by + */ + void insertBlob(const void* UTILS_NONNULL key, size_t keySize, + const void* UTILS_NONNULL value, size_t valueSize); + + /** + * To retrieve the binary value associated with a given key from the cache, a + * the backend implementation can call the application-provided callback + * function retrieveBlob. + * + * If the cache contains a value for the given key and its size in bytes is + * less than or equal to then the value is written to the memory + * pointed to by . Otherwise nothing is written to the memory pointed + * to by . + * + * @param key pointer to the beginning of the key + * @param keySize specifies the size in bytes of the binary key pointed to by + * @param value pointer to a buffer to receive the cached binary data, if it exists + * @param valueSize specifies the size in bytes of the memory pointed to by + * @return If the cache contains a value associated with the given key then the + * size of that binary value in bytes is returned. Otherwise 0 is returned. + */ + size_t retrieveBlob(const void* UTILS_NONNULL key, size_t keySize, + void* UTILS_NONNULL value, size_t valueSize); + + using DebugUpdateStatFunc = utils::Invocable; + + /** + * Sets the callback function that the backend can use to update backend-specific statistics + * to aid with debugging. This callback is guaranteed to be called on the Filament driver + * thread. + * + * @param debugUpdateStat an Invocable that updates debug statistics + */ + void setDebugUpdateStatFunc(DebugUpdateStatFunc&& debugUpdateStat) noexcept; + + /** + * @return true if debugUpdateStat is valid. + */ + bool hasDebugUpdateStatFunc() const noexcept; + + /** + * To track backend-specific statistics, the backend implementation can call the + * application-provided callback function debugUpdateStatFunc to associate or update a value + * with a given key. It is possible for this function to be called multiple times with the + * same key, in which case newer values should overwrite older values. + * + * This function is guaranteed to be called only on a single thread, the Filament driver + * thread. + * + * @param key a null-terminated C-string with the key of the debug statistic + * @param value the updated value of key + */ + void debugUpdateStat(const char* UTILS_NONNULL key, uint64_t value); + +private: + InsertBlobFunc mInsertBlob; + RetrieveBlobFunc mRetrieveBlob; + DebugUpdateStatFunc mDebugUpdateStat; }; } // namespace filament diff --git a/filament/backend/include/backend/PresentCallable.h b/filament/backend/include/backend/PresentCallable.h index 26579420cb0..f37d7704b49 100644 --- a/filament/backend/include/backend/PresentCallable.h +++ b/filament/backend/include/backend/PresentCallable.h @@ -21,8 +21,7 @@ #include -namespace filament { -namespace backend { +namespace filament::backend { /** * A PresentCallable is a callable object that, when called, schedules a frame for presentation on @@ -49,7 +48,7 @@ namespace backend { * and optional user data: * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * swapChain->setFrameScheduledCallback(myFrameScheduledCallback, nullptr); + * swapChain->setFrameScheduledCallback(nullptr, myFrameScheduledCallback); * if (renderer->beginFrame(swapChain)) { * renderer->render(view); * renderer->endFrame(); @@ -59,8 +58,6 @@ namespace backend { * @remark Only Filament's Metal backend supports PresentCallables and frame callbacks. Other * backends ignore the callback (which will never be called) and proceed normally. * - * @remark The SwapChain::FrameScheduledCallback is called on an arbitrary thread. - * * Applications *must* call each PresentCallable they receive. Each PresentCallable represents a * frame that is waiting to be presented. If an application fails to call a PresentCallable, a * memory leak could occur. To "cancel" the presentation of a frame, pass false to the @@ -98,7 +95,6 @@ class UTILS_PUBLIC PresentCallable { */ using FrameFinishedCallback UTILS_DEPRECATED = void(*)(PresentCallable callable, void* user); -} // namespace backend -} // namespace filament +} // namespace filament::backend #endif // TNT_FILAMENT_BACKEND_PRESENTCALLABLE diff --git a/filament/backend/include/backend/Program.h b/filament/backend/include/backend/Program.h index 217bcbeb360..f8e9d50eb87 100644 --- a/filament/backend/include/backend/Program.h +++ b/filament/backend/include/backend/Program.h @@ -17,18 +17,22 @@ #ifndef TNT_FILAMENT_BACKEND_PRIVATE_PROGRAM_H #define TNT_FILAMENT_BACKEND_PRIVATE_PROGRAM_H -#include #include #include #include -#include #include #include #include +#include +#include +#include #include +#include +#include + namespace filament::backend { class Program { @@ -38,90 +42,149 @@ class Program { static constexpr size_t UNIFORM_BINDING_COUNT = CONFIG_UNIFORM_BINDING_COUNT; static constexpr size_t SAMPLER_BINDING_COUNT = CONFIG_SAMPLER_BINDING_COUNT; - struct Sampler { - utils::CString name = {}; // name of the sampler in the shader - uint32_t binding = 0; // binding point of the sampler in the shader + struct Descriptor { + utils::CString name; + backend::DescriptorType type; + backend::descriptor_binding_t binding; + }; + + struct SpecializationConstant { + using Type = std::variant; + uint32_t id; // id set in glsl + Type value; // value and type }; - struct SamplerGroupData { - utils::FixedCapacityVector samplers; - ShaderStageFlags stageFlags = ShaderStageFlags::ALL_SHADER_STAGE_FLAGS; + struct Uniform { // For ES2 support + utils::CString name; // full qualified name of the uniform field + uint16_t offset; // offset in 'uint32_t' into the uniform buffer + uint8_t size; // >1 for arrays + UniformType type; // uniform type }; - using UniformBlockInfo = std::array; - using SamplerGroupInfo = std::array; + using DescriptorBindingsInfo = utils::FixedCapacityVector; + using DescriptorSetInfo = std::array; + using SpecializationConstantsInfo = utils::FixedCapacityVector; using ShaderBlob = utils::FixedCapacityVector; using ShaderSource = std::array; + using AttributesInfo = utils::FixedCapacityVector>; + using UniformInfo = utils::FixedCapacityVector; + using BindingUniformsInfo = utils::FixedCapacityVector< + std::tuple>; + Program() noexcept; Program(const Program& rhs) = delete; Program& operator=(const Program& rhs) = delete; Program(Program&& rhs) noexcept; - Program& operator=(Program&& rhs) noexcept; + Program& operator=(Program&& rhs) noexcept = delete; ~Program() noexcept; + Program& priorityQueue(CompilerPriorityQueue priorityQueue) noexcept; + // sets the material name and variant for diagnostic purposes only Program& diagnostics(utils::CString const& name, utils::Invocable&& logger); - // sets one of the program's shader (e.g. vertex, fragment) + // Sets one of the program's shader (e.g. vertex, fragment) // string-based shaders are null terminated, consequently the size parameter must include the // null terminating character. Program& shader(ShaderStage shader, void const* data, size_t size); - // Note: This is only needed for GLES3.0 backends, because the layout(binding=) syntax is - // not permitted in glsl. The backend needs a way to associate a uniform block - // to a binding point. - Program& uniformBlockBindings( - utils::FixedCapacityVector> const& uniformBlockBindings) noexcept; + // Sets the language of the shader sources provided with shader() (defaults to ESSL3) + Program& shaderLanguage(ShaderLanguage shaderLanguage); - // sets the 'bindingPoint' sampler group descriptor for this program. - // 'samplers' can be destroyed after this call. - // This effectively associates a set of (BindingPoints, index) to a texture unit in the shader. - // Or more precisely, what layout(binding=) is set to in GLSL. - Program& setSamplerGroup(size_t bindingPoint, ShaderStageFlags stageFlags, - Sampler const* samplers, size_t count) noexcept; + // Descriptor binding (set, binding, type -> shader name) info + Program& descriptorBindings(backend::descriptor_set_t set, + DescriptorBindingsInfo descriptorBindings) noexcept; - struct SpecializationConstant { - uint32_t id; // id set in glsl - std::variant value; // value and type + Program& specializationConstants(SpecializationConstantsInfo specConstants) noexcept; + + struct PushConstant { + utils::CString name; + ConstantType type; }; - Program& specializationConstants( - utils::FixedCapacityVector specConstants) noexcept; + Program& pushConstants(ShaderStage stage, + utils::FixedCapacityVector constants) noexcept; + Program& cacheId(uint64_t cacheId) noexcept; - ShaderSource const& getShadersSource() const noexcept { return mShadersSource; } - ShaderSource& getShadersSource() noexcept { return mShadersSource; } + Program& multiview(bool multiview) noexcept; - UniformBlockInfo const& getUniformBlockBindings() const noexcept { return mUniformBlocks; } - UniformBlockInfo& getUniformBlockBindings() noexcept { return mUniformBlocks; } + // For ES2 support only... + Program& uniforms(uint32_t index, utils::CString name, UniformInfo uniforms) noexcept; + Program& attributes(AttributesInfo attributes) noexcept; - SamplerGroupInfo const& getSamplerGroupInfo() const { return mSamplerGroups; } - SamplerGroupInfo& getSamplerGroupInfo() { return mSamplerGroups; } + // + // Getters for program construction... + // + + ShaderSource const& getShadersSource() const noexcept { return mShadersSource; } + ShaderSource& getShadersSource() noexcept { return mShadersSource; } utils::CString const& getName() const noexcept { return mName; } utils::CString& getName() noexcept { return mName; } - utils::FixedCapacityVector const& getSpecializationConstants() const noexcept { + auto const& getShaderLanguage() const { return mShaderLanguage; } + + uint64_t getCacheId() const noexcept { return mCacheId; } + + bool isMultiview() const noexcept { return mMultiview; } + + CompilerPriorityQueue getPriorityQueue() const noexcept { return mPriorityQueue; } + + SpecializationConstantsInfo const& getSpecializationConstants() const noexcept { return mSpecializationConstants; } - utils::FixedCapacityVector& getSpecializationConstants() noexcept { + + SpecializationConstantsInfo& getSpecializationConstants() noexcept { return mSpecializationConstants; } + DescriptorSetInfo& getDescriptorBindings() noexcept { + return mDescriptorBindings; + } + + utils::FixedCapacityVector const& getPushConstants( + ShaderStage stage) const noexcept { + return mPushConstants[static_cast(stage)]; + } + + utils::FixedCapacityVector& getPushConstants(ShaderStage stage) noexcept { + return mPushConstants[static_cast(stage)]; + } + + auto const& getBindingUniformInfo() const { return mBindingUniformsInfo; } + auto& getBindingUniformInfo() { return mBindingUniformsInfo; } + + auto const& getAttributes() const { return mAttributes; } + auto& getAttributes() { return mAttributes; } + private: friend utils::io::ostream& operator<<(utils::io::ostream& out, const Program& builder); - UniformBlockInfo mUniformBlocks = {}; - SamplerGroupInfo mSamplerGroups = {}; ShaderSource mShadersSource; + ShaderLanguage mShaderLanguage = ShaderLanguage::ESSL3; utils::CString mName; + uint64_t mCacheId{}; + CompilerPriorityQueue mPriorityQueue = CompilerPriorityQueue::HIGH; utils::Invocable mLogger; - utils::FixedCapacityVector mSpecializationConstants; + SpecializationConstantsInfo mSpecializationConstants; + std::array, SHADER_TYPE_COUNT> mPushConstants; + DescriptorSetInfo mDescriptorBindings; + + // For ES2 support only + AttributesInfo mAttributes; + BindingUniformsInfo mBindingUniformsInfo; + + // Indicates the current engine was initialized with multiview stereo, and the variant for this + // program contains STE flag. This will be referred later for the OpenGL shader compiler to + // determine whether shader code replacement for the num_views should be performed. + // This variable could be promoted as a more generic variable later if other similar needs occur. + bool mMultiview = false; }; } // namespace filament::backend diff --git a/filament/backend/include/backend/SamplerDescriptor.h b/filament/backend/include/backend/SamplerDescriptor.h index fe78d6100c3..f99472daef3 100644 --- a/filament/backend/include/backend/SamplerDescriptor.h +++ b/filament/backend/include/backend/SamplerDescriptor.h @@ -24,9 +24,6 @@ #include -#include -#include - namespace filament::backend { struct UTILS_PUBLIC SamplerDescriptor { diff --git a/filament/backend/include/backend/TargetBufferInfo.h b/filament/backend/include/backend/TargetBufferInfo.h index a2f30d45394..00bbd025cb6 100644 --- a/filament/backend/include/backend/TargetBufferInfo.h +++ b/filament/backend/include/backend/TargetBufferInfo.h @@ -17,9 +17,11 @@ #ifndef TNT_FILAMENT_BACKEND_TARGETBUFFERINFO_H #define TNT_FILAMENT_BACKEND_TARGETBUFFERINFO_H -#include #include +#include + +#include #include namespace filament::backend { @@ -27,13 +29,33 @@ namespace filament::backend { //! \privatesection struct TargetBufferInfo { + // note: the parameters of this constructor are not in the order of this structure's fields + TargetBufferInfo(Handle handle, uint8_t level, uint16_t layer) noexcept + : handle(handle), level(level), layer(layer) { + } + + TargetBufferInfo(Handle handle, uint8_t level) noexcept + : handle(handle), level(level) { + } + + TargetBufferInfo(Handle handle) noexcept // NOLINT(*-explicit-constructor) + : handle(handle) { + } + + TargetBufferInfo() noexcept = default; + // texture to be used as render target Handle handle; // level to be used uint8_t level = 0; - // for cubemaps and 3D textures. See TextureCubemapFace for the face->layer mapping + // - For cubemap textures, this indicates the face of the cubemap. See TextureCubemapFace for + // the face->layer mapping) + // - For 2d array, cubemap array, and 3d textures, this indicates an index of a single layer of + // them. + // - For multiview textures (i.e., layerCount for the RenderTarget is greater than 1), this + // indicates a starting layer index of the current 2d array texture for multiview. uint16_t layer = 0; }; @@ -58,7 +80,7 @@ class MRT { MRT() noexcept = default; - MRT(TargetBufferInfo const& color) noexcept // NOLINT(hicpp-explicit-conversions) + MRT(TargetBufferInfo const& color) noexcept // NOLINT(hicpp-explicit-conversions, *-explicit-constructor) : mInfos{ color } { } diff --git a/filament/backend/include/backend/platforms/OpenGLPlatform.h b/filament/backend/include/backend/platforms/OpenGLPlatform.h index 74d7033740e..e00930c98ca 100644 --- a/filament/backend/include/backend/platforms/OpenGLPlatform.h +++ b/filament/backend/include/backend/platforms/OpenGLPlatform.h @@ -18,8 +18,15 @@ #define TNT_FILAMENT_BACKEND_PRIVATE_OPENGLPLATFORM_H #include +#include #include +#include +#include + +#include +#include + namespace filament::backend { class Driver; @@ -38,8 +45,8 @@ class OpenGLPlatform : public Platform { * Derived classes can use this to instantiate the default OpenGLDriver backend. * This is typically called from your implementation of createDriver() */ - static Driver* createDefaultDriver(OpenGLPlatform* platform, - void* sharedContext, const DriverConfig& driverConfig); + static Driver* UTILS_NULLABLE createDefaultDriver(OpenGLPlatform* UTILS_NONNULL platform, + void* UTILS_NULLABLE sharedContext, const DriverConfig& driverConfig); ~OpenGLPlatform() noexcept override; @@ -57,6 +64,22 @@ class OpenGLPlatform : public Platform { */ virtual void terminate() noexcept = 0; + /** + * Return whether createSwapChain supports the SWAP_CHAIN_CONFIG_SRGB_COLORSPACE flag. + * The default implementation returns false. + * + * @return true if SWAP_CHAIN_CONFIG_SRGB_COLORSPACE is supported, false otherwise. + */ + virtual bool isSRGBSwapChainSupported() const noexcept; + + /** + * Return whether protected contexts are supported by this backend. + * If protected context are supported, the SWAP_CHAIN_CONFIG_PROTECTED_CONTENT flag can be + * used when creating a SwapChain. + * The default implementation returns false. + */ + virtual bool isProtectedContextSupported() const noexcept; + /** * Called by the driver to create a SwapChain for this driver. * @@ -66,7 +89,8 @@ class OpenGLPlatform : public Platform { * @return The driver's SwapChain object. * */ - virtual SwapChain* createSwapChain(void* nativeWindow, uint64_t& flags) noexcept = 0; + virtual SwapChain* UTILS_NULLABLE createSwapChain( + void* UTILS_NULLABLE nativeWindow, uint64_t flags) noexcept = 0; /** * Called by the driver create a headless SwapChain. @@ -79,34 +103,123 @@ class OpenGLPlatform : public Platform { * TODO: we need a more generic way of passing construction parameters * A void* might be enough. */ - virtual SwapChain* createSwapChain(uint32_t width, uint32_t height, uint64_t& flags) noexcept = 0; + virtual SwapChain* UTILS_NULLABLE createSwapChain( + uint32_t width, uint32_t height, uint64_t flags) noexcept = 0; /** * Called by the driver to destroys the SwapChain * @param swapChain SwapChain to be destroyed. */ - virtual void destroySwapChain(SwapChain* swapChain) noexcept = 0; + virtual void destroySwapChain(SwapChain* UTILS_NONNULL swapChain) noexcept = 0; + + /** + * Returns the set of buffers that must be preserved up to the call to commit(). + * The default value is TargetBufferFlags::NONE. + * The color buffer is always preserved, however ancillary buffers, such as the depth buffer + * are generally discarded. The preserve flags can be used to make sure those ancillary + * buffers are preserved until the call to commit. + * + * @param swapChain + * @return buffer that must be preserved + * @see commit() + */ + virtual TargetBufferFlags getPreservedFlags(SwapChain* UTILS_NONNULL swapChain) noexcept; + + /** + * Returns true if the swapchain is protected + */ + virtual bool isSwapChainProtected(Platform::SwapChain* UTILS_NONNULL swapChain) noexcept; /** * Called by the driver to establish the default FBO. The default implementation returns 0. - * @return a GLuint casted to a uint32_t that is an OpenGL framebuffer object. + * + * This method can be called either on the regular or protected OpenGL contexts and can return + * a different or identical name, since these names exist in different namespaces. + * + * @return a GLuint casted to a uint32_t that is an OpenGL framebuffer object. + */ + virtual uint32_t getDefaultFramebufferObject() noexcept; + + /** + * Called by the backend when a frame starts. + * @param steady_clock_ns vsync time point on the monotonic clock + * @param refreshIntervalNs refresh interval in nanosecond + * @param frameId a frame id + */ + virtual void beginFrame( + int64_t monotonic_clock_ns, + int64_t refreshIntervalNs, + uint32_t frameId) noexcept; + + /** + * Called by the backend when a frame ends. + * @param frameId the frame id used in beginFrame + */ + virtual void endFrame( + uint32_t frameId) noexcept; + + /** + * Type of contexts available */ - virtual uint32_t createDefaultRenderTarget() noexcept; + enum class ContextType { + NONE, //!< No current context + UNPROTECTED, //!< current context is unprotected + PROTECTED //!< current context supports protected content + }; + + /** + * Returns the type of the context currently in use. This value is updated by makeCurrent() + * and therefore can be cached between calls. ContextType::PROTECTED can only be returned + * if isProtectedContextSupported() is true. + * @return ContextType + */ + virtual ContextType getCurrentContextType() const noexcept; + + /** + * Binds the requested context to the current thread and drawSwapChain to the default FBO + * returned by getDefaultFramebufferObject(). + * + * @param type type of context to bind to the current thread. + * @param drawSwapChain SwapChain to draw to. It must be bound to the default FBO. + * @param readSwapChain SwapChain to read from (for operation like `glBlitFramebuffer`) + * @return true on success, false on error. + */ + virtual bool makeCurrent(ContextType type, + SwapChain* UTILS_NONNULL drawSwapChain, + SwapChain* UTILS_NONNULL readSwapChain) noexcept = 0; /** * Called by the driver to make the OpenGL context active on the calling thread and bind - * the drawSwapChain to the default render target (FBO) created with createDefaultRenderTarget. + * the drawSwapChain to the default FBO returned by getDefaultFramebufferObject(). + * The context used is either the default context or the protected context. When a context + * change is necessary, the preContextChange and postContextChange callbacks are called, + * before and after the context change respectively. postContextChange is given the index + * of the new context (0 for default and 1 for protected). + * The default implementation just calls makeCurrent(getCurrentContextType(), SwapChain*, SwapChain*). + * * @param drawSwapChain SwapChain to draw to. It must be bound to the default FBO. * @param readSwapChain SwapChain to read from (for operation like `glBlitFramebuffer`) + * @param preContextChange called before the context changes + * @param postContextChange called after the context changes */ - virtual void makeCurrent(SwapChain* drawSwapChain, SwapChain* readSwapChain) noexcept = 0; + virtual void makeCurrent( + SwapChain* UTILS_NONNULL drawSwapChain, + SwapChain* UTILS_NONNULL readSwapChain, + utils::Invocable preContextChange, + utils::Invocable postContextChange) noexcept; + + /** + * Called by the backend just before calling commit() + * @see commit() + */ + virtual void preCommit() noexcept; /** * Called by the driver once the current frame finishes drawing. Typically, this should present * the drawSwapChain. This is for example where `eglMakeCurrent()` would be called. * @param swapChain the SwapChain to present. */ - virtual void commit(SwapChain* swapChain) noexcept = 0; + virtual void commit(SwapChain* UTILS_NONNULL swapChain) noexcept = 0; /** * Set the time the next committed buffer should be presented to the user at. @@ -131,14 +244,14 @@ class OpenGLPlatform : public Platform { * * @return A Fence object. The default implementation returns nullptr. */ - virtual Fence* createFence() noexcept; + virtual Fence* UTILS_NULLABLE createFence() noexcept; /** * Destroys a Fence object. The default implementation does nothing. * * @param fence Fence to destroy. */ - virtual void destroyFence(Fence* fence) noexcept; + virtual void destroyFence(Fence* UTILS_NONNULL fence) noexcept; /** * Waits on a Fence. @@ -148,7 +261,7 @@ class OpenGLPlatform : public Platform { * @return Whether the fence signaled or timed out. See backend::FenceStatus. * The default implementation always return backend::FenceStatus::ERROR. */ - virtual backend::FenceStatus waitFence(Fence* fence, uint64_t timeout) noexcept; + virtual backend::FenceStatus waitFence(Fence* UTILS_NONNULL fence, uint64_t timeout) noexcept; // -------------------------------------------------------------------------------------------- @@ -162,13 +275,13 @@ class OpenGLPlatform : public Platform { * @param nativeStream The native stream, this parameter depends on the concrete implementation. * @return A new Stream object. */ - virtual Stream* createStream(void* nativeStream) noexcept; + virtual Stream* UTILS_NULLABLE createStream(void* UTILS_NULLABLE nativeStream) noexcept; /** * Destroys a Stream. * @param stream Stream to destroy. */ - virtual void destroyStream(Stream* stream) noexcept; + virtual void destroyStream(Stream* UTILS_NONNULL stream) noexcept; /** * The specified stream takes ownership of the texture (tname) object @@ -178,20 +291,21 @@ class OpenGLPlatform : public Platform { * @param stream Stream to take ownership of the texture * @param tname GL texture id to "bind" to the Stream. */ - virtual void attach(Stream* stream, intptr_t tname) noexcept; + virtual void attach(Stream* UTILS_NONNULL stream, intptr_t tname) noexcept; /** * Destroys the texture associated to the stream * @param stream Stream to detach from its texture */ - virtual void detach(Stream* stream) noexcept; + virtual void detach(Stream* UTILS_NONNULL stream) noexcept; /** * Updates the content of the texture attached to the stream. * @param stream Stream to update * @param timestamp Output parameter: Timestamp of the image bound to the texture. */ - virtual void updateTexImage(Stream* stream, int64_t* timestamp) noexcept; + virtual void updateTexImage(Stream* UTILS_NONNULL stream, + int64_t* UTILS_NONNULL timestamp) noexcept; // -------------------------------------------------------------------------------------------- @@ -204,13 +318,13 @@ class OpenGLPlatform : public Platform { * implementation could just return { 0, GL_TEXTURE_2D } at this point. The actual * values can be delayed until setExternalImage. */ - virtual ExternalTexture *createExternalImageTexture() noexcept; + virtual ExternalTexture* UTILS_NULLABLE createExternalImageTexture() noexcept; /** * Destroys an external texture handle and associated data. * @param texture a pointer to the handle to destroy. */ - virtual void destroyExternalImage(ExternalTexture* texture) noexcept; + virtual void destroyExternalImage(ExternalTexture* UTILS_NONNULL texture) noexcept; // called on the application thread to allow Filament to take ownership of the image @@ -223,7 +337,7 @@ class OpenGLPlatform : public Platform { * @param externalImage A token representing the platform's external image. * @see destroyExternalImage */ - virtual void retainExternalImage(void* externalImage) noexcept; + virtual void retainExternalImage(void* UTILS_NONNULL externalImage) noexcept; /** * Called to bind the platform-specific externalImage to an ExternalTexture. @@ -237,7 +351,8 @@ class OpenGLPlatform : public Platform { * @param texture an in/out pointer to ExternalTexture, id and target can be updated if necessary. * @return true on success, false on error. */ - virtual bool setExternalImage(void* externalImage, ExternalTexture* texture) noexcept; + virtual bool setExternalImage(void* UTILS_NONNULL externalImage, + ExternalTexture* UTILS_NONNULL texture) noexcept; /** * The method allows platforms to convert a user-supplied external image object into a new type @@ -246,6 +361,33 @@ class OpenGLPlatform : public Platform { * @return Transformed image. */ virtual AcquiredImage transformAcquiredImage(AcquiredImage source) noexcept; + + // -------------------------------------------------------------------------------------------- + + /** + * Returns true if additional OpenGL contexts can be created. Default: false. + * @return true if additional OpenGL contexts can be created. + * @see createContext + */ + virtual bool isExtraContextSupported() const noexcept; + + /** + * Creates an OpenGL context with the same configuration than the main context and makes it + * current to the current thread. Must not be called from the main driver thread. + * createContext() is only supported if isExtraContextSupported() returns true. + * These additional contexts will be automatically terminated in terminate. + * + * @param shared whether the new context is shared with the main context. + * @see isExtraContextSupported() + * @see terminate() + */ + virtual void createContext(bool shared); + + /** + * Detach and destroy the current context if any and releases all resources associated to + * this thread. + */ + virtual void releaseContext() noexcept; }; } // namespace filament diff --git a/filament/backend/include/backend/platforms/PlatformCocoaGL.h b/filament/backend/include/backend/platforms/PlatformCocoaGL.h index ac5befb31b2..97c9c3ce892 100644 --- a/filament/backend/include/backend/platforms/PlatformCocoaGL.h +++ b/filament/backend/include/backend/platforms/PlatformCocoaGL.h @@ -17,11 +17,10 @@ #ifndef TNT_FILAMENT_BACKEND_OPENGL_OPENGL_PLATFORM_COCOA_GL_H #define TNT_FILAMENT_BACKEND_OPENGL_OPENGL_PLATFORM_COCOA_GL_H -#include - +#include #include -#include +#include namespace filament::backend { @@ -50,13 +49,20 @@ class PlatformCocoaGL : public OpenGLPlatform { // -------------------------------------------------------------------------------------------- // OpenGLPlatform Interface + bool isExtraContextSupported() const noexcept override; + void createContext(bool shared) override; + void terminate() noexcept override; - SwapChain* createSwapChain(void* nativewindow, uint64_t& flags) noexcept override; - SwapChain* createSwapChain(uint32_t width, uint32_t height, uint64_t& flags) noexcept override; + SwapChain* createSwapChain(void* nativewindow, uint64_t flags) noexcept override; + SwapChain* createSwapChain(uint32_t width, uint32_t height, uint64_t flags) noexcept override; void destroySwapChain(SwapChain* swapChain) noexcept override; - void makeCurrent(SwapChain* drawSwapChain, SwapChain* readSwapChain) noexcept override; + bool makeCurrent(ContextType type, SwapChain* drawSwapChain, SwapChain* readSwapChain) noexcept override; void commit(SwapChain* swapChain) noexcept override; + OpenGLPlatform::ExternalTexture* createExternalImageTexture() noexcept override; + void destroyExternalImage(ExternalTexture* texture) noexcept override; + void retainExternalImage(void* externalImage) noexcept override; + bool setExternalImage(void* externalImage, ExternalTexture* texture) noexcept override; private: PlatformCocoaGLImpl* pImpl = nullptr; diff --git a/filament/backend/include/backend/platforms/PlatformCocoaTouchGL.h b/filament/backend/include/backend/platforms/PlatformCocoaTouchGL.h index a28e3f34c1d..e7f1d1ffe44 100644 --- a/filament/backend/include/backend/platforms/PlatformCocoaTouchGL.h +++ b/filament/backend/include/backend/platforms/PlatformCocoaTouchGL.h @@ -30,7 +30,7 @@ struct PlatformCocoaTouchGLImpl; class PlatformCocoaTouchGL : public OpenGLPlatform { public: PlatformCocoaTouchGL(); - ~PlatformCocoaTouchGL() noexcept; + ~PlatformCocoaTouchGL() noexcept override; // -------------------------------------------------------------------------------------------- // Platform Interface @@ -45,12 +45,15 @@ class PlatformCocoaTouchGL : public OpenGLPlatform { void terminate() noexcept override; - uint32_t createDefaultRenderTarget() noexcept override; + uint32_t getDefaultFramebufferObject() noexcept override; - SwapChain* createSwapChain(void* nativewindow, uint64_t& flags) noexcept override; - SwapChain* createSwapChain(uint32_t width, uint32_t height, uint64_t& flags) noexcept override; + bool isExtraContextSupported() const noexcept override; + void createContext(bool shared) override; + + SwapChain* createSwapChain(void* nativewindow, uint64_t flags) noexcept override; + SwapChain* createSwapChain(uint32_t width, uint32_t height, uint64_t flags) noexcept override; void destroySwapChain(SwapChain* swapChain) noexcept override; - void makeCurrent(SwapChain* drawSwapChain, SwapChain* readSwapChain) noexcept override; + bool makeCurrent(ContextType type, SwapChain* drawSwapChain, SwapChain* readSwapChain) noexcept override; void commit(SwapChain* swapChain) noexcept override; OpenGLPlatform::ExternalTexture* createExternalImageTexture() noexcept override; diff --git a/filament/backend/include/backend/platforms/PlatformEGL.h b/filament/backend/include/backend/platforms/PlatformEGL.h index 1830e8c1b9a..ef6876536b1 100644 --- a/filament/backend/include/backend/platforms/PlatformEGL.h +++ b/filament/backend/include/backend/platforms/PlatformEGL.h @@ -17,14 +17,22 @@ #ifndef TNT_FILAMENT_BACKEND_OPENGL_OPENGL_PLATFORM_EGL_H #define TNT_FILAMENT_BACKEND_OPENGL_OPENGL_PLATFORM_EGL_H -#include +#include +#include +#include #include #include +#include -#include +#include -#include +#include +#include +#include + +#include +#include namespace filament::backend { @@ -36,7 +44,30 @@ class PlatformEGL : public OpenGLPlatform { PlatformEGL() noexcept; + // Return true if we're on an OpenGL platform (as opposed to OpenGL ES). false by default. + virtual bool isOpenGL() const noexcept; + protected: + // -------------------------------------------------------------------------------------------- + // Helper for EGL configs and attributes parameters + + class Config { + public: + Config(); + Config(std::initializer_list> list); + EGLint& operator[](EGLint name); + EGLint operator[](EGLint name) const; + void erase(EGLint name) noexcept; + EGLint const* data() const noexcept { + return reinterpret_cast(mConfig.data()); + } + size_t size() const noexcept { + return mConfig.size(); + } + private: + std::vector> mConfig = {{ EGL_NONE, EGL_NONE }}; + }; + // -------------------------------------------------------------------------------------------- // Platform Interface @@ -56,12 +87,30 @@ class PlatformEGL : public OpenGLPlatform { // -------------------------------------------------------------------------------------------- // OpenGLPlatform Interface + bool isExtraContextSupported() const noexcept override; + void createContext(bool shared) override; + void releaseContext() noexcept override; + void terminate() noexcept override; - SwapChain* createSwapChain(void* nativewindow, uint64_t& flags) noexcept override; - SwapChain* createSwapChain(uint32_t width, uint32_t height, uint64_t& flags) noexcept override; + bool isProtectedContextSupported() const noexcept override; + + bool isSRGBSwapChainSupported() const noexcept override; + SwapChain* createSwapChain(void* nativewindow, uint64_t flags) noexcept override; + SwapChain* createSwapChain(uint32_t width, uint32_t height, uint64_t flags) noexcept override; void destroySwapChain(SwapChain* swapChain) noexcept override; - void makeCurrent(SwapChain* drawSwapChain, SwapChain* readSwapChain) noexcept override; + bool isSwapChainProtected(SwapChain* swapChain) noexcept override; + + ContextType getCurrentContextType() const noexcept override; + + bool makeCurrent(ContextType type, + SwapChain* drawSwapChain, + SwapChain* readSwapChain) noexcept override; + + void makeCurrent(SwapChain* drawSwapChain, SwapChain* readSwapChain, + utils::Invocable preContextChange, + utils::Invocable postContextChange) noexcept override; + void commit(SwapChain* swapChain) noexcept override; bool canCreateFence() noexcept override; @@ -78,6 +127,8 @@ class PlatformEGL : public OpenGLPlatform { * @param name a string giving some context on the error. Typically __func__. */ static void logEglError(const char* name) noexcept; + static void logEglError(const char* name, EGLint error) noexcept; + static const char* getEglErrorName(EGLint error) noexcept; /** * Calls glGetError() to clear the current error flags. logs a warning to log.w if @@ -86,26 +137,75 @@ class PlatformEGL : public OpenGLPlatform { static void clearGlError() noexcept; /** - * Always use this instead of eglMakeCurrent(). + * Always use this instead of eglMakeCurrent(), as it tracks some state. */ - EGLBoolean makeCurrent(EGLSurface drawSurface, EGLSurface readSurface) noexcept; + + EGLContext getContextForType(ContextType type) const noexcept; + + // makes the draw and read surface current without changing the current context + EGLBoolean makeCurrent(EGLSurface drawSurface, EGLSurface readSurface) noexcept { + return egl.makeCurrent(drawSurface, readSurface); + } + + // makes context current and set draw and read surfaces to EGL_NO_SURFACE + EGLBoolean makeCurrent(EGLContext context) noexcept { + return egl.makeCurrent(context, mEGLDummySurface, mEGLDummySurface); + } // TODO: this should probably use getters instead. EGLDisplay mEGLDisplay = EGL_NO_DISPLAY; EGLContext mEGLContext = EGL_NO_CONTEXT; - EGLSurface mCurrentDrawSurface = EGL_NO_SURFACE; - EGLSurface mCurrentReadSurface = EGL_NO_SURFACE; + EGLContext mEGLContextProtected = EGL_NO_CONTEXT; EGLSurface mEGLDummySurface = EGL_NO_SURFACE; + ContextType mCurrentContextType = ContextType::NONE; + // mEGLConfig is valid only if ext.egl.KHR_no_config_context is false EGLConfig mEGLConfig = EGL_NO_CONFIG_KHR; - EGLConfig mEGLTransparentConfig = EGL_NO_CONFIG_KHR; + Config mContextAttribs; + std::vector mAdditionalContexts; // supported extensions detected at runtime struct { - bool OES_EGL_image_external_essl3 = false; + struct { + bool OES_EGL_image_external_essl3 = false; + } gl; + struct { + bool ANDROID_recordable = false; + bool KHR_create_context = false; + bool KHR_gl_colorspace = false; + bool KHR_no_config_context = false; + bool KHR_surfaceless_context = false; + bool EXT_protected_content = false; + } egl; } ext; -private: + struct SwapChainEGL : public Platform::SwapChain { + EGLSurface sur = EGL_NO_SURFACE; + Config attribs{}; + EGLNativeWindowType nativeWindow{}; + EGLConfig config{}; + uint64_t flags{}; + }; + void initializeGlExtensions() noexcept; + +protected: + EGLConfig findSwapChainConfig(uint64_t flags, bool window, bool pbuffer) const; + +private: + class EGL { + EGLDisplay& mEGLDisplay; + EGLSurface mCurrentDrawSurface = EGL_NO_SURFACE; + EGLSurface mCurrentReadSurface = EGL_NO_SURFACE; + EGLContext mCurrentContext = EGL_NO_CONTEXT; + public: + explicit EGL(EGLDisplay& dpy) : mEGLDisplay(dpy) {} + EGLBoolean makeCurrent(EGLContext context, + EGLSurface drawSurface, EGLSurface readSurface) noexcept; + + EGLBoolean makeCurrent(EGLSurface drawSurface, EGLSurface readSurface) noexcept { + return makeCurrent(mCurrentContext, drawSurface, readSurface); + } + } egl{ mEGLDisplay }; }; } // namespace filament::backend diff --git a/filament/backend/include/backend/platforms/PlatformEGLAndroid.h b/filament/backend/include/backend/platforms/PlatformEGLAndroid.h index 1c7a4cd7b6b..bc7d0c1f2f2 100644 --- a/filament/backend/include/backend/platforms/PlatformEGLAndroid.h +++ b/filament/backend/include/backend/platforms/PlatformEGLAndroid.h @@ -17,8 +17,18 @@ #ifndef TNT_FILAMENT_BACKEND_OPENGL_OPENGL_PLATFORM_EGL_ANDROID_H #define TNT_FILAMENT_BACKEND_OPENGL_OPENGL_PLATFORM_EGL_ANDROID_H +#include +#include +#include #include +#include + +#include + +#include +#include + namespace filament::backend { class ExternalStreamManagerAndroid; @@ -52,6 +62,13 @@ class PlatformEGLAndroid : public PlatformEGL { void terminate() noexcept override; + void beginFrame( + int64_t monotonic_clock_ns, + int64_t refreshIntervalNs, + uint32_t frameId) noexcept override; + + void preCommit() noexcept override; + /** * Set the presentation time using `eglPresentationTimeANDROID` * @param presentationTimeInNanosecond @@ -72,9 +89,28 @@ class PlatformEGLAndroid : public PlatformEGL { */ AcquiredImage transformAcquiredImage(AcquiredImage source) noexcept override; +protected: + bool makeCurrent(ContextType type, + SwapChain* drawSwapChain, + SwapChain* readSwapChain) noexcept override; + private: + struct InitializeJvmForPerformanceManagerIfNeeded { + InitializeJvmForPerformanceManagerIfNeeded(); + }; + int mOSVersion; ExternalStreamManagerAndroid& mExternalStreamManager; + InitializeJvmForPerformanceManagerIfNeeded const mInitializeJvmForPerformanceManagerIfNeeded; + utils::PerformanceHintManager mPerformanceHintManager; + utils::PerformanceHintManager::Session mPerformanceHintSession; + + using clock = std::chrono::high_resolution_clock; + clock::time_point mStartTimeOfActualWork; + + void* mNativeWindowLib = nullptr; + int32_t (*ANativeWindow_getBuffersDefaultDataSpace)(ANativeWindow* window) = nullptr; + bool mAssertNativeWindowIsValid = false; }; } // namespace filament::backend diff --git a/filament/backend/include/backend/platforms/PlatformEGLHeadless.h b/filament/backend/include/backend/platforms/PlatformEGLHeadless.h index 13d5fa0578e..40d285b9084 100644 --- a/filament/backend/include/backend/platforms/PlatformEGLHeadless.h +++ b/filament/backend/include/backend/platforms/PlatformEGLHeadless.h @@ -30,6 +30,9 @@ class PlatformEGLHeadless : public PlatformEGL { Driver* createDriver(void* sharedContext, const Platform::DriverConfig& driverConfig) noexcept override; + +protected: + bool isOpenGL() const noexcept override; }; } // namespace filament diff --git a/filament/backend/include/backend/platforms/PlatformGLX.h b/filament/backend/include/backend/platforms/PlatformGLX.h index e9323e957bd..796e27a1118 100644 --- a/filament/backend/include/backend/platforms/PlatformGLX.h +++ b/filament/backend/include/backend/platforms/PlatformGLX.h @@ -48,10 +48,10 @@ class PlatformGLX : public OpenGLPlatform { void terminate() noexcept override; - SwapChain* createSwapChain(void* nativewindow, uint64_t& flags) noexcept override; - SwapChain* createSwapChain(uint32_t width, uint32_t height, uint64_t& flags) noexcept override; + SwapChain* createSwapChain(void* nativewindow, uint64_t flags) noexcept override; + SwapChain* createSwapChain(uint32_t width, uint32_t height, uint64_t flags) noexcept override; void destroySwapChain(SwapChain* swapChain) noexcept override; - void makeCurrent(SwapChain* drawSwapChain, SwapChain* readSwapChain) noexcept override; + bool makeCurrent(ContextType type, SwapChain* drawSwapChain, SwapChain* readSwapChain) noexcept override; void commit(SwapChain* swapChain) noexcept override; private: diff --git a/filament/backend/include/backend/platforms/PlatformOSMesa.h b/filament/backend/include/backend/platforms/PlatformOSMesa.h new file mode 100644 index 00000000000..a1a72fc6f77 --- /dev/null +++ b/filament/backend/include/backend/platforms/PlatformOSMesa.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_OPENGL_OPENGL_PLATFORM_OSMESA_H +#define TNT_FILAMENT_BACKEND_OPENGL_OPENGL_PLATFORM_OSMESA_H + +#include + +#include "bluegl/BlueGL.h" + +#include + +#include +#include + +namespace filament::backend { + +/** + * A concrete implementation of OpenGLPlatform that uses OSMesa, which is an offscreen + * context that can be used in conjunction with Mesa for software rasterization. + * See https://docs.mesa3d.org/osmesa.html for more information. + */ +class PlatformOSMesa : public OpenGLPlatform { +protected: + // -------------------------------------------------------------------------------------------- + // Platform Interface + + Driver* createDriver(void* sharedGLContext, const DriverConfig& driverConfig) noexcept override; + + int getOSVersion() const noexcept final override { return 0; } + + // -------------------------------------------------------------------------------------------- + // OpenGLPlatform Interface + + void terminate() noexcept override; + + SwapChain* createSwapChain(void* nativewindow, uint64_t flags) noexcept override; + SwapChain* createSwapChain(uint32_t width, uint32_t height, uint64_t flags) noexcept override; + void destroySwapChain(SwapChain* swapChain) noexcept override; + bool makeCurrent(ContextType type, SwapChain* drawSwapChain, + SwapChain* readSwapChain) noexcept override; + void commit(SwapChain* swapChain) noexcept override; + +private: + OSMesaContext mContext; + void* mOsMesaApi = nullptr; +}; + +} // namespace filament::backend + +#endif // TNT_FILAMENT_BACKEND_OPENGL_OPENGL_PLATFORM_OSMESA_H diff --git a/filament/backend/include/backend/platforms/PlatformWGL.h b/filament/backend/include/backend/platforms/PlatformWGL.h index e7b40d10c68..e0003156b86 100644 --- a/filament/backend/include/backend/platforms/PlatformWGL.h +++ b/filament/backend/include/backend/platforms/PlatformWGL.h @@ -23,9 +23,10 @@ #include "utils/unwindows.h" #include - #include +#include + namespace filament::backend { /** @@ -46,10 +47,13 @@ class PlatformWGL : public OpenGLPlatform { void terminate() noexcept override; - SwapChain* createSwapChain(void* nativewindow, uint64_t& flags) noexcept override; - SwapChain* createSwapChain(uint32_t width, uint32_t height, uint64_t& flags) noexcept override; + bool isExtraContextSupported() const noexcept override; + void createContext(bool shared) override; + + SwapChain* createSwapChain(void* nativewindow, uint64_t flags) noexcept override; + SwapChain* createSwapChain(uint32_t width, uint32_t height, uint64_t flags) noexcept override; void destroySwapChain(SwapChain* swapChain) noexcept override; - void makeCurrent(SwapChain* drawSwapChain, SwapChain* readSwapChain) noexcept override; + bool makeCurrent(ContextType type, SwapChain* drawSwapChain, SwapChain* readSwapChain) noexcept override; void commit(SwapChain* swapChain) noexcept override; protected: @@ -57,6 +61,8 @@ class PlatformWGL : public OpenGLPlatform { HWND mHWnd = NULL; HDC mWhdc = NULL; PIXELFORMATDESCRIPTOR mPfd = {}; + std::vector mAdditionalContexts; + std::vector mAttribs; }; } // namespace filament::backend diff --git a/filament/backend/include/backend/platforms/PlatformWebGL.h b/filament/backend/include/backend/platforms/PlatformWebGL.h index 01d7860a44b..0d83fbb979e 100644 --- a/filament/backend/include/backend/platforms/PlatformWebGL.h +++ b/filament/backend/include/backend/platforms/PlatformWebGL.h @@ -43,10 +43,10 @@ class PlatformWebGL : public OpenGLPlatform { void terminate() noexcept override; - SwapChain* createSwapChain(void* nativewindow, uint64_t& flags) noexcept override; - SwapChain* createSwapChain(uint32_t width, uint32_t height, uint64_t& flags) noexcept override; + SwapChain* createSwapChain(void* nativewindow, uint64_t flags) noexcept override; + SwapChain* createSwapChain(uint32_t width, uint32_t height, uint64_t flags) noexcept override; void destroySwapChain(SwapChain* swapChain) noexcept override; - void makeCurrent(SwapChain* drawSwapChain, SwapChain* readSwapChain) noexcept override; + bool makeCurrent(ContextType type, SwapChain* drawSwapChain, SwapChain* readSwapChain) noexcept override; void commit(SwapChain* swapChain) noexcept override; }; diff --git a/filament/backend/include/backend/platforms/VulkanPlatform.h b/filament/backend/include/backend/platforms/VulkanPlatform.h index c0b83c684b3..d61818a8831 100644 --- a/filament/backend/include/backend/platforms/VulkanPlatform.h +++ b/filament/backend/include/backend/platforms/VulkanPlatform.h @@ -19,20 +19,346 @@ #include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include + namespace filament::backend { +using SwapChain = Platform::SwapChain; + /** - * A Platform interface that creates a Vulkan backend. + * Private implementation details for the provided vulkan platform. */ +struct VulkanPlatformPrivate; -class VulkanPlatform : public Platform { +/** + * A Platform interface that creates a Vulkan backend. + */ +class VulkanPlatform : public Platform, utils::PrivateImplementation { public: - // Given a Vulkan instance and native window handle, creates the platform-specific surface. - virtual void* createVkSurfaceKHR(void* nativeWindow, void* instance, uint64_t flags) noexcept = 0; - ~VulkanPlatform() override; + struct ExtensionHashFn { + std::size_t operator()(utils::CString const& s) const noexcept { + return std::hash{}(s.data()); + } + }; + // Utility for managing device or instance extensions during initialization. + using ExtensionSet = std::unordered_set; + + /** + * A collection of handles to objects and metadata that comprises a Vulkan context. The client + * can instantiate this struct and pass to Engine::Builder::sharedContext if they wishes to + * share their vulkan context. This is specifically necessary if the client wishes to override + * the swapchain API. + */ + struct VulkanSharedContext { + VkInstance instance = VK_NULL_HANDLE; + VkPhysicalDevice physicalDevice = VK_NULL_HANDLE; + VkDevice logicalDevice = VK_NULL_HANDLE; + uint32_t graphicsQueueFamilyIndex = 0xFFFFFFFF; + // In the usual case, the client needs to allocate at least one more graphics queue + // for Filament, and this index is the param to pass into vkGetDeviceQueue. In the case + // where the gpu only has one graphics queue. Then the client needs to ensure that no + // concurrent access can occur. + uint32_t graphicsQueueIndex = 0xFFFFFFFF; + }; + + /** + * Shorthand for the pointer to the Platform SwapChain struct, we use it also as a handle (i.e. + * identifier for the swapchain). + */ + using SwapChainPtr = Platform::SwapChain*; + + /** + * Collection of images, formats, and extent (width/height) that defines the swapchain. + */ + struct SwapChainBundle { + utils::FixedCapacityVector colors; + VkImage depth = VK_NULL_HANDLE; + VkFormat colorFormat = VK_FORMAT_UNDEFINED; + VkFormat depthFormat = VK_FORMAT_UNDEFINED; + VkExtent2D extent = {0, 0}; + bool isProtected = false; + }; + + struct ImageSyncData { + static constexpr uint32_t INVALID_IMAGE_INDEX = UINT32_MAX; + + // The index of the next image as returned by vkAcquireNextImage or equivalent. + uint32_t imageIndex = INVALID_IMAGE_INDEX; + + // Semaphore to be signaled once the image is available. + VkSemaphore imageReadySemaphore = VK_NULL_HANDLE; + + // A function called right before vkQueueSubmit. After this call, the image must be + // available. This pointer can be null if imageReadySemaphore is not VK_NULL_HANDLE. + std::function explicitImageReadyWait = nullptr; + }; + + VulkanPlatform(); + + ~VulkanPlatform() override; + + Driver* createDriver(void* sharedContext, + Platform::DriverConfig const& driverConfig) noexcept override; + + int getOSVersion() const noexcept override { + return 0; + } + + // ---------------------------------------------------- + // ---------- Platform Customization options ---------- + struct Customization { + /** + * The client can specify the GPU (i.e. VkDevice) for the platform. We allow the + * following preferences: + * 1) A substring to match against `VkPhysicalDeviceProperties.deviceName`. Empty string + * by default. + * 2) Index of the device in the list as returned by + * `vkEnumeratePhysicalDevices`. -1 by default to indicate no preference. + */ + struct GPUPreference { + utils::CString deviceName; + int8_t index = -1; + } gpu; + + /** + * Whether the platform supports sRGB swapchain. Default is true. + */ + bool isSRGBSwapChainSupported = true; + + /** + * When the platform window is resized, we will flush and wait on the command queues + * before recreating the swapchain. Default is true. + */ + bool flushAndWaitOnWindowResize = true; + + /** + * Whether the swapchain image should be transitioned to a layout suitable for + * presentation. Default is true. + */ + bool transitionSwapChainImageLayoutForPresent = true; + }; + + /** + * Client can override to indicate customized behavior or parameter for their platform. + * @return `Customization` struct that indicates the client's platform + * customizations. + */ + virtual Customization getCustomization() const noexcept { + return {}; + } + + // -------- End platform customization options -------- + // ---------------------------------------------------- + + /** + * Get the images handles and format of the memory backing the swapchain. This should be called + * after createSwapChain() or after recreateIfResized(). + * @param swapchain The handle returned by createSwapChain() + * @return An array of VkImages + */ + virtual SwapChainBundle getSwapChainBundle(SwapChainPtr handle); + + /** + * Acquire the next image for rendering. The `index` will be written with an non-negative + * integer that the backend can use to index into the `SwapChainBundle.colors` array. The + * corresponding VkImage will be used as the output color attachment. The client should signal + * the `clientSignal` semaphore when the image is ready to be used by the backend. + * @param handle The handle returned by createSwapChain() + * @param outImageSyncData The synchronization data used for image readiness + * @return Result of acquire + */ + virtual VkResult acquire(SwapChainPtr handle, ImageSyncData* outImageSyncData); + + /** + * Present the image corresponding to `index` to the display. The client should wait on + * `finishedDrawing` before presenting. + * @param handle The handle returned by createSwapChain() + * @param index Index that corresponding to an image in the + * `SwapChainBundle.colors` array. + * @param finishedDrawing Backend passes in a semaphore that the client will signal to + * indicate that the client may render into the image. + * @return Result of present + */ + virtual VkResult present(SwapChainPtr handle, uint32_t index, VkSemaphore finishedDrawing); + + /** + * Check if the surface size has changed. + * @param handle The handle returned by createSwapChain() + * @return Whether the swapchain has been resized + */ + virtual bool hasResized(SwapChainPtr handle); + + /** + * Check if the surface is protected. + * @param handle The handle returned by createSwapChain() + * @return Whether the swapchain is protected + */ + virtual bool isProtected(SwapChainPtr handle); + + /** + * Carry out a recreation of the swapchain. + * @param handle The handle returned by createSwapChain() + * @return Result of the recreation + */ + virtual VkResult recreate(SwapChainPtr handle); + + /** + * Create a swapchain given a platform window, or if given a null `nativeWindow`, then we + * try to create a headless swapchain with the given `extent`. + * @param flags Optional parameters passed to the client as defined in + * Filament::SwapChain.h. + * @param extent Optional width and height that indicates the size of the headless swapchain. + * @return Result of the operation + */ + virtual SwapChainPtr createSwapChain(void* nativeWindow, uint64_t flags = 0, + VkExtent2D extent = {0, 0}); + + /** + * Allows implementers to provide instance extensions that they'd like to include in the + * instance creation. + * @return A set of extensions to enable for the instance. + */ + virtual ExtensionSet getRequiredInstanceExtensions() { return {}; } + + /** + * Destroy the swapchain. + * @param handle The handle returned by createSwapChain() + */ + virtual void destroy(SwapChainPtr handle); + + /** + * Clean up any resources owned by the Platform. For example, if the Vulkan instance handle was + * generated by the platform, we need to clean it up in this method. + */ + virtual void terminate(); + + /** + * @return The instance (VkInstance) for the Vulkan backend. + */ + VkInstance getInstance() const noexcept; + + /** + * @return The logical device (VkDevice) that was selected as the backend device. + */ + VkDevice getDevice() const noexcept; + + /** + * @return The physical device (i.e gpu) that was selected as the backend physical device. + */ + VkPhysicalDevice getPhysicalDevice() const noexcept; + + /** + * @return The family index of the graphics queue selected for the Vulkan backend. + */ + uint32_t getGraphicsQueueFamilyIndex() const noexcept; + + /** + * @return The index of the graphics queue (if there are multiple graphics queues) + * selected for the Vulkan backend. + */ + uint32_t getGraphicsQueueIndex() const noexcept; + + /** + * @return The queue that was selected for the Vulkan backend. + */ + VkQueue getGraphicsQueue() const noexcept; + + /** + * @return The family index of the protected graphics queue selected for the + * Vulkan backend. + */ + uint32_t getProtectedGraphicsQueueFamilyIndex() const noexcept; + + /** + * @return The index of the protected graphics queue (if there are multiple + * graphics queues) selected for the Vulkan backend. + */ + uint32_t getProtectedGraphicsQueueIndex() const noexcept; + + /** + * @return The protected queue that was selected for the Vulkan backend. + */ + VkQueue getProtectedGraphicsQueue() const noexcept; + + struct ExternalImageMetadata { + /** + * The width of the external image + */ + uint32_t width; + + /** + * The height of the external image + */ + uint32_t height; + + /** + * The layer count of the external image + */ + uint32_t layers; + + /** + * The format of the external image + */ + VkFormat format; + + /** + * An external buffer can be protected. This tells you if it is. + */ + bool isProtected; + + /** + * The type of external format (opaque int) if used. + */ + uint64_t externalFormat; + + /** + * Image usage + */ + VkImageUsageFlags usage; + + /** + * Allocation size + */ + VkDeviceSize allocationSize; + + /** + * Heap information + */ + uint32_t memoryTypeBits; + }; + virtual ExternalImageMetadata getExternalImageMetadata(void* externalImage); + + using ImageData = std::pair; + virtual ImageData createExternalImage(void* externalImage, + const ExternalImageMetadata& metadata); + +private: + static ExtensionSet getSwapchainInstanceExtensions(); + static ExternalImageMetadata getExternalImageMetadataImpl(void* externalImage, + VkDevice device); + static ImageData createExternalImageImpl(void* externalImage, VkDevice device, + const VkAllocationCallbacks* allocator, const ExternalImageMetadata& metadata); + + // Platform dependent helper methods + using SurfaceBundle = std::tuple; + static SurfaceBundle createVkSurfaceKHR(void* nativeWindow, VkInstance instance, + uint64_t flags) noexcept; + + friend struct VulkanPlatformPrivate; }; -} // namespace filament::backend +}// namespace filament::backend -#endif //TNT_FILAMENT_BACKEND_PLATFORMS_VULKANPLATFORM_H +#endif// TNT_FILAMENT_BACKEND_PLATFORMS_VULKANPLATFORM_H diff --git a/filament/backend/include/private/backend/CircularBuffer.h b/filament/backend/include/private/backend/CircularBuffer.h index bee5b3bd647..7d2de52b009 100644 --- a/filament/backend/include/private/backend/CircularBuffer.h +++ b/filament/backend/include/private/backend/CircularBuffer.h @@ -17,7 +17,7 @@ #ifndef TNT_FILAMENT_BACKEND_PRIVATE_CIRCULARBUFFER_H #define TNT_FILAMENT_BACKEND_PRIVATE_CIRCULARBUFFER_H -#include +#include #include #include @@ -26,11 +26,6 @@ namespace filament::backend { class CircularBuffer { public: -// all allocations are at least one page - static constexpr size_t BLOCK_BITS = 12; // 4KB - static constexpr size_t BLOCK_SIZE = 1 << BLOCK_BITS; - static constexpr size_t BLOCK_MASK = BLOCK_SIZE - 1; - // bufferSize: total buffer size. // This must be at least 2*requiredSize to avoid blocking on flush, however // because sometimes the display can get ahead of the render() thread, it's good @@ -45,26 +40,36 @@ class CircularBuffer { ~CircularBuffer() noexcept; - // allocates 'size' bytes in the circular buffer and returns a pointer to the memory - // return the current head and moves it forward by size bytes - inline void* allocate(size_t size) noexcept { + static size_t getBlockSize() noexcept { return sPageSize; } + + // Total size of circular buffer. This is a constant. + size_t size() const noexcept { return mSize; } + + // Allocates `s` bytes in the circular buffer and returns a pointer to the memory. All + // allocations must not exceed size() bytes. + inline void* allocate(size_t s) noexcept { + // We can never allocate more that size(). + assert_invariant(getUsed() + s <= size()); char* const cur = static_cast(mHead); - mHead = cur + size; + mHead = cur + s; return cur; } - // Total size of circular buffer - size_t size() const noexcept { return mSize; } - - // returns true if the buffer is empty (e.g. after calling flush) + // Returns true if the buffer is empty, i.e.: no allocations were made since + // calling getBuffer(); bool empty() const noexcept { return mTail == mHead; } - void* getHead() const noexcept { return mHead; } + // Returns the size used since the last call to getBuffer() + size_t getUsed() const noexcept { return intptr_t(mHead) - intptr_t(mTail); } - void* getTail() const noexcept { return mTail; } - - // call at least once every getRequiredSize() bytes allocated from the buffer - void circularize() noexcept; + // Retrieves the current allocated range and frees it. It is the responsibility of the caller + // to make sure the returned range is no longer in use by the time allocate() allocates + // (size() - getUsed()) bytes. + struct Range { + void* tail; + void* head; + }; + Range getBuffer() noexcept; private: void* alloc(size_t size) noexcept; @@ -72,16 +77,19 @@ class CircularBuffer { // pointer to the beginning of the circular buffer (constant) void* mData = nullptr; - int mUsesAshmem = -1; + int mAshmemFd = -1; // size of the circular buffer (constant) - size_t mSize = 0; + size_t const mSize; // pointer to the beginning of recorded data void* mTail = nullptr; // pointer to the next available command void* mHead = nullptr; + + // system page size + static size_t sPageSize; }; } // namespace filament::backend diff --git a/filament/backend/include/private/backend/CommandBufferQueue.h b/filament/backend/include/private/backend/CommandBufferQueue.h index 026a8677da7..e8ff9aa896c 100644 --- a/filament/backend/include/private/backend/CommandBufferQueue.h +++ b/filament/backend/include/private/backend/CommandBufferQueue.h @@ -19,20 +19,21 @@ #include "private/backend/CircularBuffer.h" -#include #include #include #include -namespace filament { -namespace backend { +#include +#include + +namespace filament::backend { /* * A producer-consumer command queue that uses a CircularBuffer as main storage */ class CommandBufferQueue { - struct Slice { + struct Range { void* begin; void* end; }; @@ -45,29 +46,33 @@ class CommandBufferQueue { mutable utils::Mutex mLock; mutable utils::Condition mCondition; - mutable std::vector mCommandBuffersToExecute; + mutable std::vector mCommandBuffersToExecute; size_t mFreeSpace = 0; size_t mHighWatermark = 0; uint32_t mExitRequested = 0; + bool mPaused = false; static constexpr uint32_t EXIT_REQUESTED = 0x31415926; public: // requiredSize: guaranteed available space after flush() - CommandBufferQueue(size_t requiredSize, size_t bufferSize); + CommandBufferQueue(size_t requiredSize, size_t bufferSize, bool paused); ~CommandBufferQueue(); - CircularBuffer& getCircularBuffer() { return mCircularBuffer; } + CircularBuffer& getCircularBuffer() noexcept { return mCircularBuffer; } + CircularBuffer const& getCircularBuffer() const noexcept { return mCircularBuffer; } + + size_t getCapacity() const noexcept { return mRequiredSize; } size_t getHighWatermark() const noexcept { return mHighWatermark; } // wait for commands to be available and returns an array containing these commands - std::vector waitForCommands() const; + std::vector waitForCommands() const; // return the memory used by this command buffer to the circular buffer // WARNING: releaseBuffer() must be called in sequence of the Slices returned by // waitForCommands() - void releaseBuffer(Slice const& buffer); + void releaseBuffer(Range const& buffer); // all commands buffers (Slices) written to this point are returned by waitForCommand(). This // call blocks until the CircularBuffer has at least mRequiredSize bytes available. @@ -76,10 +81,13 @@ class CommandBufferQueue { // returns from waitForCommands() immediately. void requestExit(); + // suspend or unsuspend the queue. + bool isPaused() const noexcept; + void setPaused(bool paused); + bool isExitRequested() const; }; -} // namespace backend -} // namespace filament +} // namespace filament::backend #endif // TNT_FILAMENT_BACKEND_PRIVATE_COMMANDBUFFERQUEUE_H diff --git a/filament/backend/include/private/backend/CommandStream.h b/filament/backend/include/private/backend/CommandStream.h index ca5821829ee..f722794b52c 100644 --- a/filament/backend/include/private/backend/CommandStream.h +++ b/filament/backend/include/private/backend/CommandStream.h @@ -22,6 +22,7 @@ #include "private/backend/Driver.h" #include +#include #include #include #include @@ -31,11 +32,13 @@ #include #include +#include #include #include #include #include +#include #include #ifndef NDEBUG @@ -131,7 +134,7 @@ struct CommandType { public: template - static inline void execute(M&& method, D&& driver, CommandBase* base, intptr_t* next) noexcept { + static inline void execute(M&& method, D&& driver, CommandBase* base, intptr_t* next) { Command* self = static_cast(base); *next = align(sizeof(Command)); #if DEBUG_COMMAND_STREAM @@ -151,21 +154,21 @@ struct CommandType { } // placement new declared as "throw" to avoid the compiler's null-check - inline void* operator new(std::size_t size, void* ptr) { + inline void* operator new(std::size_t, void* ptr) { assert_invariant(ptr); return ptr; } }; }; -// convert an method of "class Driver" into a Command<> type +// convert a method of "class Driver" into a Command<> type #define COMMAND_TYPE(method) CommandType::Command<&Driver::method> // ------------------------------------------------------------------------------------------------ class CustomCommand : public CommandBase { std::function mCommand; - static void execute(Driver&, CommandBase* base, intptr_t* next) noexcept; + static void execute(Driver&, CommandBase* base, intptr_t* next); public: inline CustomCommand(CustomCommand&& rhs) = default; inline explicit CustomCommand(std::function cmd) @@ -210,6 +213,8 @@ class CommandStream { CommandStream(CommandStream const& rhs) noexcept = delete; CommandStream& operator=(CommandStream const& rhs) noexcept = delete; + CircularBuffer const& getCircularBuffer() const noexcept { return mCurrentBuffer; } + public: #define DECL_DRIVER_API(methodName, paramsDecl, params) \ inline void methodName(paramsDecl) { \ diff --git a/filament/backend/include/private/backend/Driver.h b/filament/backend/include/private/backend/Driver.h index 5c28841b13a..1fe16446813 100644 --- a/filament/backend/include/private/backend/Driver.h +++ b/filament/backend/include/private/backend/Driver.h @@ -17,16 +17,20 @@ #ifndef TNT_FILAMENT_BACKEND_PRIVATE_DRIVER_H #define TNT_FILAMENT_BACKEND_PRIVATE_DRIVER_H +#include +#include #include #include #include #include #include +#include #include #include +#include #include // Command debugging off. debugging virtuals are not called. @@ -73,7 +77,7 @@ class Driver { // the fn function will execute a batch of driver commands // this gives the driver a chance to wrap their execution in a meaningful manner // the default implementation simply calls fn - virtual void execute(std::function const& fn) noexcept; + virtual void execute(std::function const& fn); // This is called on debug build, or when enabled manually on the backend thread side. virtual void debugCommandBegin(CommandStream* cmds, diff --git a/filament/backend/include/private/backend/DriverAPI.inc b/filament/backend/include/private/backend/DriverAPI.inc index 3e9b39dba8a..6b951da975c 100644 --- a/filament/backend/include/private/backend/DriverAPI.inc +++ b/filament/backend/include/private/backend/DriverAPI.inc @@ -133,17 +133,19 @@ DECL_DRIVER_API_0(tick) DECL_DRIVER_API_N(beginFrame, int64_t, monotonic_clock_ns, + int64_t, refreshIntervalNs, uint32_t, frameId) DECL_DRIVER_API_N(setFrameScheduledCallback, backend::SwapChainHandle, sch, - backend::FrameScheduledCallback, callback, - void*, user) + backend::CallbackHandler*, handler, + backend::FrameScheduledCallback&&, callback, + uint64_t, flags) DECL_DRIVER_API_N(setFrameCompletedCallback, backend::SwapChainHandle, sch, - backend::FrameCompletedCallback, callback, - void*, user) + backend::CallbackHandler*, handler, + utils::Invocable&&, callback) DECL_DRIVER_API_N(setPresentationTime, int64_t, monotonic_clock_ns) @@ -161,17 +163,24 @@ DECL_DRIVER_API_0(finish) // reset state tracking, if the driver does any state tracking (e.g. GL) DECL_DRIVER_API_0(resetState) +DECL_DRIVER_API_N(setDebugTag, + backend::HandleBase::HandleId, handleId, + utils::CString, tag) + /* * Creating driver objects * ----------------------- */ -DECL_DRIVER_API_R_N(backend::VertexBufferHandle, createVertexBuffer, +DECL_DRIVER_API_R_N(backend::VertexBufferInfoHandle, createVertexBufferInfo, uint8_t, bufferCount, uint8_t, attributeCount, - uint32_t, vertexCount, backend::AttributeArray, attributes) +DECL_DRIVER_API_R_N(backend::VertexBufferHandle, createVertexBuffer, + uint32_t, vertexCount, + backend::VertexBufferInfoHandle, vbih) + DECL_DRIVER_API_R_N(backend::IndexBufferHandle, createIndexBuffer, backend::ElementType, elementType, uint32_t, indexCount, @@ -192,19 +201,33 @@ DECL_DRIVER_API_R_N(backend::TextureHandle, createTexture, uint32_t, depth, backend::TextureUsage, usage) -DECL_DRIVER_API_R_N(backend::TextureHandle, createTextureSwizzled, +DECL_DRIVER_API_R_N(backend::TextureHandle, createTextureView, + backend::TextureHandle, texture, + uint8_t, baseLevel, + uint8_t, levelCount) + +DECL_DRIVER_API_R_N(backend::TextureHandle, createTextureViewSwizzle, + backend::TextureHandle, texture, + backend::TextureSwizzle, r, + backend::TextureSwizzle, g, + backend::TextureSwizzle, b, + backend::TextureSwizzle, a) + +DECL_DRIVER_API_R_N(backend::TextureHandle, createTextureExternalImage, backend::SamplerType, target, - uint8_t, levels, backend::TextureFormat, format, - uint8_t, samples, uint32_t, width, uint32_t, height, - uint32_t, depth, backend::TextureUsage, usage, - backend::TextureSwizzle, r, - backend::TextureSwizzle, g, - backend::TextureSwizzle, b, - backend::TextureSwizzle, a) + void*, image) + +DECL_DRIVER_API_R_N(backend::TextureHandle, createTextureExternalImagePlane, + backend::TextureFormat, format, + uint32_t, width, + uint32_t, height, + backend::TextureUsage, usage, + void*, image, + uint32_t, plane) DECL_DRIVER_API_R_N(backend::TextureHandle, importTexture, intptr_t, id, @@ -217,17 +240,10 @@ DECL_DRIVER_API_R_N(backend::TextureHandle, importTexture, uint32_t, depth, backend::TextureUsage, usage) -DECL_DRIVER_API_R_N(backend::SamplerGroupHandle, createSamplerGroup, - uint32_t, size) - DECL_DRIVER_API_R_N(backend::RenderPrimitiveHandle, createRenderPrimitive, backend::VertexBufferHandle, vbh, backend::IndexBufferHandle, ibh, - backend::PrimitiveType, pt, - uint32_t, offset, - uint32_t, minIndex, - uint32_t, maxIndex, - uint32_t, count) + backend::PrimitiveType, pt) DECL_DRIVER_API_R_N(backend::ProgramHandle, createProgram, backend::Program&&, program) @@ -239,14 +255,13 @@ DECL_DRIVER_API_R_N(backend::RenderTargetHandle, createRenderTarget, uint32_t, width, uint32_t, height, uint8_t, samples, + uint8_t, layerCount, backend::MRT, color, backend::TargetBufferInfo, depth, backend::TargetBufferInfo, stencil) DECL_DRIVER_API_R_0(backend::FenceHandle, createFence) -DECL_DRIVER_API_R_0(backend::SyncHandle, createSync) - DECL_DRIVER_API_R_N(backend::SwapChainHandle, createSwapChain, void*, nativeWindow, uint64_t, flags) @@ -258,24 +273,53 @@ DECL_DRIVER_API_R_N(backend::SwapChainHandle, createSwapChainHeadless, DECL_DRIVER_API_R_0(backend::TimerQueryHandle, createTimerQuery) +DECL_DRIVER_API_R_N(backend::DescriptorSetLayoutHandle, createDescriptorSetLayout, + backend::DescriptorSetLayout&&, info) + +DECL_DRIVER_API_R_N(backend::DescriptorSetHandle, createDescriptorSet, + backend::DescriptorSetLayoutHandle, dslh) + +DECL_DRIVER_API_N(updateDescriptorSetBuffer, + backend::DescriptorSetHandle, dsh, + backend::descriptor_binding_t, binding, + backend::BufferObjectHandle, boh, + uint32_t, offset, + uint32_t, size +) + +DECL_DRIVER_API_N(updateDescriptorSetTexture, + backend::DescriptorSetHandle, dsh, + backend::descriptor_binding_t, binding, + backend::TextureHandle, th, + SamplerParams, params +) + +DECL_DRIVER_API_N(bindDescriptorSet, + backend::DescriptorSetHandle, dsh, + backend::descriptor_set_t, set, + backend::DescriptorSetOffsetArray&&, offsets +) + /* * Destroying driver objects * ------------------------- */ -DECL_DRIVER_API_N(destroyVertexBuffer, backend::VertexBufferHandle, vbh) -DECL_DRIVER_API_N(destroyIndexBuffer, backend::IndexBufferHandle, ibh) -DECL_DRIVER_API_N(destroyBufferObject, backend::BufferObjectHandle, ibh) -DECL_DRIVER_API_N(destroyRenderPrimitive, backend::RenderPrimitiveHandle, rph) -DECL_DRIVER_API_N(destroyProgram, backend::ProgramHandle, ph) -DECL_DRIVER_API_N(destroySamplerGroup, backend::SamplerGroupHandle, sbh) -DECL_DRIVER_API_N(destroyTexture, backend::TextureHandle, th) -DECL_DRIVER_API_N(destroyRenderTarget, backend::RenderTargetHandle, rth) -DECL_DRIVER_API_N(destroySwapChain, backend::SwapChainHandle, sch) -DECL_DRIVER_API_N(destroyStream, backend::StreamHandle, sh) -DECL_DRIVER_API_N(destroyTimerQuery, backend::TimerQueryHandle, sh) -DECL_DRIVER_API_N(destroySync, backend::SyncHandle, sh) +DECL_DRIVER_API_N(destroyVertexBuffer, backend::VertexBufferHandle, vbh) +DECL_DRIVER_API_N(destroyVertexBufferInfo, backend::VertexBufferInfoHandle, vbih) +DECL_DRIVER_API_N(destroyIndexBuffer, backend::IndexBufferHandle, ibh) +DECL_DRIVER_API_N(destroyBufferObject, backend::BufferObjectHandle, ibh) +DECL_DRIVER_API_N(destroyRenderPrimitive, backend::RenderPrimitiveHandle, rph) +DECL_DRIVER_API_N(destroyProgram, backend::ProgramHandle, ph) +DECL_DRIVER_API_N(destroyTexture, backend::TextureHandle, th) +DECL_DRIVER_API_N(destroyRenderTarget, backend::RenderTargetHandle, rth) +DECL_DRIVER_API_N(destroySwapChain, backend::SwapChainHandle, sch) +DECL_DRIVER_API_N(destroyStream, backend::StreamHandle, sh) +DECL_DRIVER_API_N(destroyTimerQuery, backend::TimerQueryHandle, sh) +DECL_DRIVER_API_N(destroyFence, backend::FenceHandle, fh) +DECL_DRIVER_API_N(destroyDescriptorSetLayout, backend::DescriptorSetLayoutHandle, dslh) +DECL_DRIVER_API_N(destroyDescriptorSet, backend::DescriptorSetHandle, dsh) /* * Synchronous APIs @@ -289,8 +333,7 @@ DECL_DRIVER_API_SYNCHRONOUS_N(void, setAcquiredImage, backend::StreamHandle, str DECL_DRIVER_API_SYNCHRONOUS_N(void, setStreamDimensions, backend::StreamHandle, stream, uint32_t, width, uint32_t, height) DECL_DRIVER_API_SYNCHRONOUS_N(int64_t, getStreamTimestamp, backend::StreamHandle, stream) DECL_DRIVER_API_SYNCHRONOUS_N(void, updateStreams, backend::DriverApi*, driver) -DECL_DRIVER_API_SYNCHRONOUS_N(void, destroyFence, backend::FenceHandle, fh) -DECL_DRIVER_API_SYNCHRONOUS_N(backend::FenceStatus, wait, backend::FenceHandle, fh, uint64_t, timeout) +DECL_DRIVER_API_SYNCHRONOUS_N(backend::FenceStatus, getFenceStatus, backend::FenceHandle, fh) DECL_DRIVER_API_SYNCHRONOUS_N(bool, isTextureFormatSupported, backend::TextureFormat, format) DECL_DRIVER_API_SYNCHRONOUS_0(bool, isTextureSwizzleSupported) DECL_DRIVER_API_SYNCHRONOUS_N(bool, isTextureFormatMipmappable, backend::TextureFormat, format) @@ -299,12 +342,19 @@ DECL_DRIVER_API_SYNCHRONOUS_0(bool, isFrameBufferFetchSupported) DECL_DRIVER_API_SYNCHRONOUS_0(bool, isFrameBufferFetchMultiSampleSupported) DECL_DRIVER_API_SYNCHRONOUS_0(bool, isFrameTimeSupported) DECL_DRIVER_API_SYNCHRONOUS_0(bool, isAutoDepthResolveSupported) +DECL_DRIVER_API_SYNCHRONOUS_0(bool, isSRGBSwapChainSupported) +DECL_DRIVER_API_SYNCHRONOUS_0(bool, isProtectedContentSupported) +DECL_DRIVER_API_SYNCHRONOUS_0(bool, isStereoSupported) +DECL_DRIVER_API_SYNCHRONOUS_0(bool, isParallelShaderCompileSupported) +DECL_DRIVER_API_SYNCHRONOUS_0(bool, isDepthStencilResolveSupported) +DECL_DRIVER_API_SYNCHRONOUS_N(bool, isDepthStencilBlitSupported, backend::TextureFormat, format) +DECL_DRIVER_API_SYNCHRONOUS_0(bool, isProtectedTexturesSupported) +DECL_DRIVER_API_SYNCHRONOUS_0(bool, isDepthClampSupported) DECL_DRIVER_API_SYNCHRONOUS_0(uint8_t, getMaxDrawBuffers) +DECL_DRIVER_API_SYNCHRONOUS_0(size_t, getMaxUniformBufferSize) DECL_DRIVER_API_SYNCHRONOUS_0(math::float2, getClipSpaceParams) -DECL_DRIVER_API_SYNCHRONOUS_0(bool, canGenerateMipmaps) DECL_DRIVER_API_SYNCHRONOUS_N(void, setupExternalImage, void*, image) -DECL_DRIVER_API_SYNCHRONOUS_N(bool, getTimerQueryValue, backend::TimerQueryHandle, query, uint64_t*, elapsedTime) -DECL_DRIVER_API_SYNCHRONOUS_N(backend::SyncStatus, getSyncStatus, backend::SyncHandle, sh) +DECL_DRIVER_API_SYNCHRONOUS_N(backend::TimerQueryResult, getTimerQueryValue, backend::TimerQueryHandle, query, uint64_t*, elapsedTime) DECL_DRIVER_API_SYNCHRONOUS_N(bool, isWorkaroundNeeded, backend::Workaround, workaround) DECL_DRIVER_API_SYNCHRONOUS_0(backend::FeatureLevel, getFeatureLevel) @@ -336,15 +386,6 @@ DECL_DRIVER_API_N(updateBufferObjectUnsynchronized, DECL_DRIVER_API_N(resetBufferObject, backend::BufferObjectHandle, ibh) -DECL_DRIVER_API_N(updateSamplerGroup, - backend::SamplerGroupHandle, ubh, - backend::BufferDescriptor&&, data) - -DECL_DRIVER_API_N(setMinMaxLevels, - backend::TextureHandle, th, - uint32_t, minLevel, - uint32_t, maxLevel) - DECL_DRIVER_API_N(update3DImage, backend::TextureHandle, th, uint32_t, level, @@ -359,15 +400,6 @@ DECL_DRIVER_API_N(update3DImage, DECL_DRIVER_API_N(generateMipmaps, backend::TextureHandle, th) -DECL_DRIVER_API_N(setExternalImage, - backend::TextureHandle, th, - void*, image) - -DECL_DRIVER_API_N(setExternalImagePlane, - backend::TextureHandle, th, - void*, image, - uint32_t, plane) - DECL_DRIVER_API_N(setExternalStream, backend::TextureHandle, th, backend::StreamHandle, sh) @@ -386,6 +418,11 @@ DECL_DRIVER_API_N(beginTimerQuery, DECL_DRIVER_API_N(endTimerQuery, backend::TimerQueryHandle, query) +DECL_DRIVER_API_N(compilePrograms, + backend::CompilerPriorityQueue, priority, + backend::CallbackHandler*, handler, + backend::CallbackHandler::Callback, callback, + void*, user) /* * Swap chain @@ -404,32 +441,16 @@ DECL_DRIVER_API_N(commit, * ----------------------- */ -DECL_DRIVER_API_N(bindUniformBuffer, - uint32_t, index, - backend::BufferObjectHandle, ubh) - -DECL_DRIVER_API_N(bindBufferRange, - BufferObjectBinding, bindingType, - uint32_t, index, - backend::BufferObjectHandle, ubh, - uint32_t, offset, - uint32_t, size) - -DECL_DRIVER_API_N(unbindBuffer, - BufferObjectBinding, bindingType, - uint32_t, index) - -DECL_DRIVER_API_N(bindSamplers, - uint32_t, index, - backend::SamplerGroupHandle, sbh) +DECL_DRIVER_API_N(setPushConstant, + backend::ShaderStage, stage, + uint8_t, index, + backend::PushConstantVariant, value) DECL_DRIVER_API_N(insertEventMarker, - const char*, string, - uint32_t, len = 0) + const char*, string) DECL_DRIVER_API_N(pushGroupMarker, - const char*, string, - uint32_t, len = 0) + const char*, string) DECL_DRIVER_API_0(popGroupMarker) @@ -462,7 +483,7 @@ DECL_DRIVER_API_N(readBufferSubData, * -------------------- */ -DECL_DRIVER_API_N(blit, +DECL_DRIVER_API_N(blitDEPRECATED, backend::TargetBufferFlags, buffers, backend::RenderTargetHandle, dst, backend::Viewport, dstRect, @@ -470,15 +491,47 @@ DECL_DRIVER_API_N(blit, backend::Viewport, srcRect, backend::SamplerMagFilter, filter) +DECL_DRIVER_API_N(resolve, + backend::TextureHandle, dst, + uint8_t, dstLevel, uint8_t, dstLayer, + backend::TextureHandle, src, + uint8_t, srcLevel, uint8_t, srcLayer) + +DECL_DRIVER_API_N(blit, + backend::TextureHandle, dst, + uint8_t, dstLevel, uint8_t, dstLayer, + math::uint2, dstOrigin, + backend::TextureHandle, src, + uint8_t, srcLevel, uint8_t, srcLayer, + math::uint2, srcOrigin, + math::uint2, size) + +DECL_DRIVER_API_N(bindPipeline, + backend::PipelineState const&, state) + +DECL_DRIVER_API_N(bindRenderPrimitive, + backend::RenderPrimitiveHandle, rph) + +DECL_DRIVER_API_N(draw2, + uint32_t, indexOffset, + uint32_t, indexCount, + uint32_t, instanceCount) + DECL_DRIVER_API_N(draw, backend::PipelineState, state, backend::RenderPrimitiveHandle, rph, + uint32_t, indexOffset, + uint32_t, indexCount, uint32_t, instanceCount) + DECL_DRIVER_API_N(dispatchCompute, backend::ProgramHandle, program, math::uint3, workGroupCount) +DECL_DRIVER_API_N(scissor, + Viewport, scissor) + #pragma clang diagnostic pop diff --git a/filament/backend/include/private/backend/DriverApi.h b/filament/backend/include/private/backend/DriverApi.h index 68d997a439d..dfd1a964d93 100644 --- a/filament/backend/include/private/backend/DriverApi.h +++ b/filament/backend/include/private/backend/DriverApi.h @@ -18,6 +18,17 @@ #define TNT_FILAMENT_BACKEND_PRIVATE_DRIVERAPI_H #include "backend/DriverApiForward.h" + #include "private/backend/CommandStream.h" +#include + +namespace filament::backend { + +inline void* allocateFromCommandStream(DriverApi& driver, size_t size, size_t alignment) noexcept { + return driver.allocate(size, alignment); +} + +} // namespace filament::backend + #endif // TNT_FILAMENT_BACKEND_PRIVATE_DRIVERAPI_H diff --git a/filament/backend/include/private/backend/HandleAllocator.h b/filament/backend/include/private/backend/HandleAllocator.h index 95481f5484e..93333363022 100644 --- a/filament/backend/include/private/backend/HandleAllocator.h +++ b/filament/backend/include/private/backend/HandleAllocator.h @@ -20,31 +20,37 @@ #include #include +#include #include +#include #include +#include +#include + #include + +#include +#include +#include #include +#include -#if !defined(NDEBUG) && UTILS_HAS_RTTI -# define HANDLE_TYPE_SAFETY 1 -#else -# define HANDLE_TYPE_SAFETY 0 -#endif +#include +#include -#define HandleAllocatorGL HandleAllocator<16, 64, 208> -#define HandleAllocatorVK HandleAllocator<16, 64, 880> -#define HandleAllocatorMTL HandleAllocator<16, 64, 576> +#define HandleAllocatorGL HandleAllocator<32, 96, 136> // ~4520 / pool / MiB +#define HandleAllocatorVK HandleAllocator<64, 160, 312> // ~1820 / pool / MiB +#define HandleAllocatorMTL HandleAllocator<32, 64, 552> // ~1660 / pool / MiB namespace filament::backend { /* * A utility class to efficiently allocate and manage Handle<> */ -template +template class HandleAllocator { public: - - HandleAllocator(const char* name, size_t size) noexcept; + HandleAllocator(const char* name, size_t size, bool disableUseAfterFreeCheck) noexcept; HandleAllocator(HandleAllocator const& rhs) = delete; HandleAllocator& operator=(HandleAllocator const& rhs) = delete; ~HandleAllocator(); @@ -60,15 +66,10 @@ class HandleAllocator { * */ template - Handle allocateAndConstruct(ARGS&& ... args) noexcept { - Handle h{ allocateHandle() }; + Handle allocateAndConstruct(ARGS&& ... args) { + Handle h{ allocateHandle() }; D* addr = handle_cast(h); new(addr) D(std::forward(args)...); -#if HANDLE_TYPE_SAFETY - mLock.lock(); - mHandleTypeId[addr] = typeid(D).name(); - mLock.unlock(); -#endif return h; } @@ -84,13 +85,7 @@ class HandleAllocator { */ template Handle allocate() noexcept { - Handle h{ allocateHandle() }; -#if HANDLE_TYPE_SAFETY - D* addr = handle_cast(h); - mLock.lock(); - mHandleTypeId[addr] = typeid(D).name(); - mLock.unlock(); -#endif + Handle h{ allocateHandle() }; return h; } @@ -103,21 +98,14 @@ class HandleAllocator { */ template typename std::enable_if_t, D>* - destroyAndConstruct(Handle const& handle, ARGS&& ... args) noexcept { + destroyAndConstruct(Handle const& handle, ARGS&& ... args) { assert_invariant(handle); D* addr = handle_cast(const_cast&>(handle)); assert_invariant(addr); - // currently we implement construct<> with dtor+ctor, we could use operator= also // but all our dtors are trivial, ~D() is actually a noop. addr->~D(); new(addr) D(std::forward(args)...); - -#if HANDLE_TYPE_SAFETY - mLock.lock(); - mHandleTypeId[addr] = typeid(D).name(); - mLock.unlock(); -#endif return addr; } @@ -134,12 +122,6 @@ class HandleAllocator { D* addr = handle_cast(const_cast&>(handle)); assert_invariant(addr); new(addr) D(std::forward(args)...); - -#if HANDLE_TYPE_SAFETY - mLock.lock(); - mHandleTypeId[addr] = typeid(D).name(); - mLock.unlock(); -#endif return addr; } @@ -155,19 +137,8 @@ class HandleAllocator { void deallocate(Handle& handle, D const* p) noexcept { // allow to destroy the nullptr, similarly to operator delete if (p) { -#if HANDLE_TYPE_SAFETY - mLock.lock(); - auto typeId = mHandleTypeId[p]; - mHandleTypeId.erase(p); - mLock.unlock(); - if (UTILS_UNLIKELY(typeId != typeid(D).name())) { - utils::slog.e << "Destroying handle " << handle.getId() << ", type " << typeid(D).name() - << ", but handle's actual type is " << typeId << utils::io::endl; - std::terminate(); - } -#endif p->~D(); - deallocateHandle(handle.getId()); + deallocateHandle(handle.getId()); } } @@ -193,81 +164,176 @@ class HandleAllocator { inline typename std::enable_if_t< std::is_pointer_v && std::is_base_of_v>, Dp> - handle_cast(Handle& handle) noexcept { + handle_cast(Handle& handle) { assert_invariant(handle); - void* const p = handleToPointer(handle.getId()); + auto [p, tag] = handleToPointer(handle.getId()); + + if (isPoolHandle(handle.getId())) { + // check for pool handle use-after-free + if (UTILS_UNLIKELY(!mUseAfterFreeCheckDisabled)) { + uint8_t const age = (tag & HANDLE_AGE_MASK) >> HANDLE_AGE_SHIFT; + auto const pNode = static_cast(p); + uint8_t const expectedAge = pNode[-1].age; + // getHandleTag() is only called if the check fails. + FILAMENT_CHECK_POSTCONDITION(expectedAge == age) + << "use-after-free of Handle with id=" << handle.getId() + << ", tag=" << getHandleTag(handle.getId()).c_str_safe(); + } + } else { + // check for heap handle use-after-free + if (UTILS_UNLIKELY(!mUseAfterFreeCheckDisabled)) { + uint8_t const index = (handle.getId() & HANDLE_INDEX_MASK); + // if we've already handed out this handle index before, it's definitely a + // use-after-free, otherwise it's probably just a corrupted handle + if (index < mId) { + FILAMENT_CHECK_POSTCONDITION(p != nullptr) + << "use-after-free of heap Handle with id=" << handle.getId() + << ", tag=" << getHandleTag(handle.getId()).c_str_safe(); + } else { + FILAMENT_CHECK_POSTCONDITION(p != nullptr) + << "corrupted heap Handle with id=" << handle.getId() + << ", tag=" << getHandleTag(handle.getId()).c_str_safe(); + } + } + } + return static_cast(p); } + template + bool is_valid(Handle& handle) { + if (!handle) { + // null handles are invalid + return false; + } + auto [p, tag] = handleToPointer(handle.getId()); + if (isPoolHandle(handle.getId())) { + uint8_t const age = (tag & HANDLE_AGE_MASK) >> HANDLE_AGE_SHIFT; + auto const pNode = static_cast(p); + uint8_t const expectedAge = pNode[-1].age; + return expectedAge == age; + } + return p != nullptr; + } + template inline typename std::enable_if_t< std::is_pointer_v && std::is_base_of_v>, Dp> - handle_cast(Handle const& handle) noexcept { + handle_cast(Handle const& handle) { return handle_cast(const_cast&>(handle)); } + void associateTagToHandle(HandleBase::HandleId id, utils::CString&& tag) noexcept { + // TODO: for now, only pool handles check for use-after-free, so we only keep tags for + // those + if (isPoolHandle(id)) { + // Truncate the age to get the debug tag + uint32_t const key = id & ~(HANDLE_DEBUG_TAG_MASK ^ HANDLE_AGE_MASK); + // This line is the costly part. In the future, we could potentially use a custom + // allocator. + mDebugTags[key] = std::move(tag); + } + } + + utils::CString getHandleTag(HandleBase::HandleId id) const noexcept { + if (!isPoolHandle(id)) { + return "(no tag)"; + } + uint32_t const key = id & ~(HANDLE_DEBUG_TAG_MASK ^ HANDLE_AGE_MASK); + if (auto pos = mDebugTags.find(key); pos != mDebugTags.end()) { + return pos->second; + } + return "(no tag)"; + } private: - // template + template + static constexpr size_t getBucketSize() noexcept { + if constexpr (sizeof(D) <= P0) { return P0; } + if constexpr (sizeof(D) <= P1) { return P1; } + static_assert(sizeof(D) <= P2); + return P2; + } + class Allocator { friend class HandleAllocator; - utils::PoolAllocator mPool0; - utils::PoolAllocator mPool1; - utils::PoolAllocator mPool2; + static constexpr size_t MIN_ALIGNMENT = alignof(std::max_align_t); + struct Node { uint8_t age; }; + // Note: using the `extra` parameter of PoolAllocator<>, even with a 1-byte structure, + // generally increases all pool allocations by 8-bytes because of alignment restrictions. + template + using Pool = utils::PoolAllocator; + Pool mPool0; + Pool mPool1; + Pool mPool2; UTILS_UNUSED_IN_RELEASE const utils::AreaPolicy::HeapArea& mArea; + bool mUseAfterFreeCheckDisabled; public: - static constexpr size_t MIN_ALIGNMENT_SHIFT = 4; - explicit Allocator(const utils::AreaPolicy::HeapArea& area); + explicit Allocator(const utils::AreaPolicy::HeapArea& area, bool disableUseAfterFreeCheck); + + static constexpr size_t getAlignment() noexcept { return MIN_ALIGNMENT; } // this is in fact always called with a constexpr size argument - [[nodiscard]] inline void* alloc(size_t size, size_t alignment, size_t extra) noexcept { + [[nodiscard]] inline void* alloc(size_t size, size_t, size_t, uint8_t* outAge) noexcept { void* p = nullptr; - if (size <= mPool0.getSize()) p = mPool0.alloc(size, 16, extra); - else if (size <= mPool1.getSize()) p = mPool1.alloc(size, 16, extra); - else if (size <= mPool2.getSize()) p = mPool2.alloc(size, 16, extra); + if (size <= mPool0.getSize()) p = mPool0.alloc(size); + else if (size <= mPool1.getSize()) p = mPool1.alloc(size); + else if (size <= mPool2.getSize()) p = mPool2.alloc(size); + if (UTILS_LIKELY(p)) { + Node const* const pNode = static_cast(p); + // we are guaranteed to have at least sizeof bytes of extra storage before + // the allocation address. + *outAge = pNode[-1].age; + } return p; } // this is in fact always called with a constexpr size argument - inline void free(void* p, size_t size) noexcept { + inline void free(void* p, size_t size, uint8_t age) noexcept { assert_invariant(p >= mArea.begin() && (char*)p + size <= (char*)mArea.end()); + + // check for double-free + Node* const pNode = static_cast(p); + uint8_t& expectedAge = pNode[-1].age; + if (UTILS_UNLIKELY(!mUseAfterFreeCheckDisabled)) { + FILAMENT_CHECK_POSTCONDITION(expectedAge == age) << + "double-free of Handle of size " << size << " at " << p; + } + expectedAge = (expectedAge + 1) & 0xF; // fixme + if (size <= mPool0.getSize()) { mPool0.free(p); return; } if (size <= mPool1.getSize()) { mPool1.free(p); return; } if (size <= mPool2.getSize()) { mPool2.free(p); return; } } }; - +// FIXME: We should be using a Spinlock here, at least on platforms where mutexes are not +// efficient (i.e. non-Linux). However, we've seen some hangs on that spinlock, which +// we don't understand well (b/308029108). #ifndef NDEBUG using HandleArena = utils::Arena; #else using HandleArena = utils::Arena; + utils::LockingPolicy::Mutex>; #endif // allocateHandle()/deallocateHandle() selects the pool to use at compile-time based on the // allocation size this is always inlined, because all these do is to call // allocateHandleInPool()/deallocateHandleFromPool() with the right pool size. - template + template HandleBase::HandleId allocateHandle() noexcept { - if constexpr (SIZE <= P0) { return allocateHandleInPool(); } - if constexpr (SIZE <= P1) { return allocateHandleInPool(); } - return allocateHandleInPool(); + constexpr size_t BUCKET_SIZE = getBucketSize(); + return allocateHandleInPool(); } - template + template void deallocateHandle(HandleBase::HandleId id) noexcept { - if constexpr (SIZE <= P0) { - deallocateHandleFromPool(id); - } else if constexpr (SIZE <= P1) { - deallocateHandleFromPool(id); - } else { - deallocateHandleFromPool(id); - } + constexpr size_t BUCKET_SIZE = getBucketSize(); + deallocateHandleFromPool(id); } // allocateHandleInPool()/deallocateHandleFromPool() is NOT inlined, which will cause three @@ -276,9 +342,11 @@ class HandleAllocator { template UTILS_NOINLINE HandleBase::HandleId allocateHandleInPool() noexcept { - void* p = mHandleArena.alloc(SIZE); + uint8_t age; + void* p = mHandleArena.alloc(SIZE, alignof(std::max_align_t), 0, &age); if (UTILS_LIKELY(p)) { - return pointerToHandle(p); + uint32_t const tag = (uint32_t(age) << HANDLE_AGE_SHIFT) & HANDLE_AGE_MASK; + return arenaPointerToHandle(p, tag); } else { return allocateHandleSlow(SIZE); } @@ -288,42 +356,63 @@ class HandleAllocator { UTILS_NOINLINE void deallocateHandleFromPool(HandleBase::HandleId id) noexcept { if (UTILS_LIKELY(isPoolHandle(id))) { - void* p = handleToPointer(id); - mHandleArena.free(p, SIZE); + auto [p, tag] = handleToPointer(id); + uint8_t const age = (tag & HANDLE_AGE_MASK) >> HANDLE_AGE_SHIFT; + mHandleArena.free(p, SIZE, age); } else { deallocateHandleSlow(id, SIZE); } } - static constexpr uint32_t HEAP_HANDLE_FLAG = 0x80000000u; + // number if bits allotted to the handle's age (currently 4 max) + static constexpr uint32_t HANDLE_AGE_BIT_COUNT = 4; + // number if bits allotted to the handle's debug tag (HANDLE_AGE_BIT_COUNT max) + static constexpr uint32_t HANDLE_DEBUG_TAG_BIT_COUNT = 2; + // bit shift for both the age and debug tag + static constexpr uint32_t HANDLE_AGE_SHIFT = 27; + // mask for the heap (vs pool) flag + static constexpr uint32_t HANDLE_HEAP_FLAG = 0x80000000u; + // mask for the age + static constexpr uint32_t HANDLE_AGE_MASK = + ((1 << HANDLE_AGE_BIT_COUNT) - 1) << HANDLE_AGE_SHIFT; + // mask for the debug tag + static constexpr uint32_t HANDLE_DEBUG_TAG_MASK = + ((1 << HANDLE_DEBUG_TAG_BIT_COUNT) - 1) << HANDLE_AGE_SHIFT; + // mask for the index + static constexpr uint32_t HANDLE_INDEX_MASK = 0x07FFFFFFu; + + static_assert(HANDLE_DEBUG_TAG_BIT_COUNT <= HANDLE_AGE_BIT_COUNT); static bool isPoolHandle(HandleBase::HandleId id) noexcept { - return (id & HEAP_HANDLE_FLAG) == 0u; + return (id & HANDLE_HEAP_FLAG) == 0u; } - HandleBase::HandleId allocateHandleSlow(size_t size) noexcept; + HandleBase::HandleId allocateHandleSlow(size_t size); void deallocateHandleSlow(HandleBase::HandleId id, size_t size) noexcept; // We inline this because it's just 4 instructions in the fast case - inline void* handleToPointer(HandleBase::HandleId id) const noexcept { + inline std::pair handleToPointer(HandleBase::HandleId id) const noexcept { // note: the null handle will end-up returning nullptr b/c it'll be handled as // a non-pool handle. if (UTILS_LIKELY(isPoolHandle(id))) { char* const base = (char*)mHandleArena.getArea().begin(); - size_t offset = id << Allocator::MIN_ALIGNMENT_SHIFT; - return static_cast(base + offset); + uint32_t const tag = id & HANDLE_AGE_MASK; + size_t const offset = (id & HANDLE_INDEX_MASK) * Allocator::getAlignment(); + return { static_cast(base + offset), tag }; } - return handleToPointerSlow(id); + return { handleToPointerSlow(id), 0 }; } void* handleToPointerSlow(HandleBase::HandleId id) const noexcept; // We inline this because it's just 3 instructions - inline HandleBase::HandleId pointerToHandle(void* p) const noexcept { + inline HandleBase::HandleId arenaPointerToHandle(void* p, uint32_t tag) const noexcept { char* const base = (char*)mHandleArena.getArea().begin(); - size_t offset = (char*)p - base; - auto id = HandleBase::HandleId(offset >> Allocator::MIN_ALIGNMENT_SHIFT); - assert_invariant((id & HEAP_HANDLE_FLAG) == 0); + size_t const offset = (char*)p - base; + assert_invariant((offset % Allocator::getAlignment()) == 0); + auto id = HandleBase::HandleId(offset / Allocator::getAlignment()); + id |= tag & HANDLE_AGE_MASK; + assert_invariant((id & HANDLE_HEAP_FLAG) == 0); return id; } @@ -332,10 +421,9 @@ class HandleAllocator { // Below is only used when running out of space in the HandleArena mutable utils::Mutex mLock; tsl::robin_map mOverflowMap; + tsl::robin_map mDebugTags; HandleBase::HandleId mId = 0; -#if HANDLE_TYPE_SAFETY - mutable std::unordered_map mHandleTypeId; -#endif + bool mUseAfterFreeCheckDisabled = false; }; } // namespace filament::backend diff --git a/filament/backend/include/private/backend/PlatformFactory.h b/filament/backend/include/private/backend/PlatformFactory.h index fcdfc3c50cd..bf75bfb7e24 100644 --- a/filament/backend/include/private/backend/PlatformFactory.h +++ b/filament/backend/include/private/backend/PlatformFactory.h @@ -19,9 +19,9 @@ #ifndef TNT_FILAMENT_BACKEND_PLATFORM_FACTORY_H #define TNT_FILAMENT_BACKEND_PLATFORM_FACTORY_H -#include "backend/DriverEnums.h" +#include -#include "utils/compiler.h" +#include namespace filament::backend { diff --git a/filament/backend/include/private/backend/SamplerGroup.h b/filament/backend/include/private/backend/SamplerGroup.h deleted file mode 100644 index 855dcd119cb..00000000000 --- a/filament/backend/include/private/backend/SamplerGroup.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef TNT_FILAMENT_BACKEND_PRIVATE_SAMPLERGROUP_H -#define TNT_FILAMENT_BACKEND_PRIVATE_SAMPLERGROUP_H - -#include "backend/DriverApiForward.h" - -#include -#include - -#include -#include -#include - -#include - -namespace filament::backend { - -class BufferDescriptor; - -/* - * FIXME: this should eventually be moved into Filament, outside of backend. - * (but it is currently used by metal/vulkan backens) - */ - -class SamplerGroup { -public: - - using SamplerParams = backend::SamplerParams; - - SamplerGroup() noexcept {} // NOLINT - - // create a sampler group - explicit SamplerGroup(size_t count) noexcept; - - // can be copied. Sets dirty flag. - SamplerGroup(const SamplerGroup& rhs) noexcept; - SamplerGroup& operator=(const SamplerGroup& rhs) noexcept; - - // and moved. Leaves rhs empty, keep diry flag on new SamplerGroup. - SamplerGroup(SamplerGroup&& rhs) noexcept = default; - SamplerGroup& operator=(SamplerGroup&& rhs) = default; - - ~SamplerGroup() noexcept = default; - - BufferDescriptor toBufferDescriptor(DriverApi& driver) const noexcept; - - // sampler count - size_t getSize() const noexcept { return mBuffer.size(); } - - // return if any samplers has been changed - bool isDirty() const noexcept { - return mDirty; - } - - // mark the whole group as clean (no modified uniforms) - void clean() const noexcept { mDirty = false; } - - // set sampler at given index - void setSampler(size_t index, backend::SamplerDescriptor sampler) noexcept; - - inline void clearSampler(size_t index) { - setSampler(index, {}); - } - - - // FIXME: This is now [[deprecated]]. Currently it is only used by the Vulkan/Metal backends. - backend::SamplerDescriptor* data() noexcept { return mBuffer.data(); } - -private: -#if !defined(NDEBUG) - friend utils::io::ostream& operator<<(utils::io::ostream& out, const SamplerGroup& rhs); -#endif - - utils::FixedCapacityVector mBuffer; - mutable bool mDirty = false; -}; - -} // namespace filament::backend - -#endif // TNT_FILAMENT_BACKEND_PRIVATE_SAMPLERGROUP_H diff --git a/filament/backend/src/BlobCacheKey.cpp b/filament/backend/src/BlobCacheKey.cpp new file mode 100644 index 00000000000..f4a163a09d5 --- /dev/null +++ b/filament/backend/src/BlobCacheKey.cpp @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "BlobCacheKey.h" + +#include + +namespace filament::backend { + +struct BlobCacheKey::Key { + uint64_t id; + Program::SpecializationConstant constants[]; +}; + +BlobCacheKey::BlobCacheKey() noexcept = default; + +BlobCacheKey::BlobCacheKey(uint64_t id, + BlobCacheKey::SpecializationConstants const& specConstants) { + mSize = sizeof(Key) + sizeof(Key::constants[0]) * specConstants.size(); + + Key* const pKey = (Key *)malloc(mSize); + memset(pKey, 0, mSize); + mData.reset(pKey, ::free); + + mData->id = id; + for (size_t i = 0; i < specConstants.size(); i++) { + mData->constants[i] = specConstants[i]; + } +} + +BlobCacheKey::BlobCacheKey(BlobCacheKey&& rhs) noexcept + : mData(std::move(rhs.mData)), mSize(rhs.mSize) { + rhs.mSize = 0; +} + +BlobCacheKey& BlobCacheKey::operator=(BlobCacheKey&& rhs) noexcept { + if (this != &rhs) { + using std::swap; + swap(mData, rhs.mData); + swap(mSize, rhs.mSize); + } + return *this; +} + +} // namespace filament::backend diff --git a/filament/backend/src/BlobCacheKey.h b/filament/backend/src/BlobCacheKey.h new file mode 100644 index 00000000000..caa57ede602 --- /dev/null +++ b/filament/backend/src/BlobCacheKey.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_PRIVATE_BLOBCACHEKEY_H +#define TNT_FILAMENT_BACKEND_PRIVATE_BLOBCACHEKEY_H + +#include + +namespace filament::backend { + +class BlobCacheKey { +public: + using SpecializationConstants = utils::FixedCapacityVector; + + BlobCacheKey() noexcept; + BlobCacheKey(uint64_t id, SpecializationConstants const& specConstants); + + BlobCacheKey(BlobCacheKey const& rhs) = default; + BlobCacheKey& operator=(BlobCacheKey const& rhs) = default; + + BlobCacheKey(BlobCacheKey&& rhs) noexcept; + BlobCacheKey& operator=(BlobCacheKey&& rhs) noexcept; + + void const* data() const noexcept { + return mData.get(); + } + + size_t size() const noexcept { + return mSize; + } + + explicit operator bool() const noexcept { return mSize > 0; } + + void swap(BlobCacheKey& other) noexcept { + using std::swap; + swap(other.mSize, mSize); + swap(other.mData, mData); + } + +private: + struct Key; + + friend void swap(BlobCacheKey& lhs, BlobCacheKey& rhs) noexcept { + lhs.swap(rhs); + } + + // we use a shared_ptr to play nice with std::function<>, it works because the buffer is const + std::shared_ptr mData{}; + size_t mSize{}; +}; + +} // namespace filament::backend + +#endif // TNT_FILAMENT_BACKEND_PRIVATE_BLOBCACHEKEY_H diff --git a/filament/backend/src/Callable.cpp b/filament/backend/src/Callable.cpp index 524d06a75dc..2c19e2a7863 100644 --- a/filament/backend/src/Callable.cpp +++ b/filament/backend/src/Callable.cpp @@ -27,8 +27,8 @@ PresentCallable::PresentCallable(PresentFn fn, void* user) noexcept } void PresentCallable::operator()(bool presentFrame) noexcept { - ASSERT_PRECONDITION(mPresentFn, "This PresentCallable was already called. " \ - "PresentCallables should be called exactly once."); + FILAMENT_CHECK_PRECONDITION(mPresentFn) << "This PresentCallable was already called. " + "PresentCallables should be called exactly once."; mPresentFn(presentFrame, mUser); // Set mPresentFn to nullptr to denote that the callable has been called. mPresentFn = nullptr; diff --git a/filament/backend/src/CallbackHandler.cpp b/filament/backend/src/CallbackHandler.cpp deleted file mode 100644 index a1c067b6d26..00000000000 --- a/filament/backend/src/CallbackHandler.cpp +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -namespace filament::backend { - -CallbackHandler::~CallbackHandler() = default; - -} // namespace filament::backend diff --git a/filament/backend/src/CallbackManager.cpp b/filament/backend/src/CallbackManager.cpp new file mode 100644 index 00000000000..8d85a9f4886 --- /dev/null +++ b/filament/backend/src/CallbackManager.cpp @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "CallbackManager.h" + +#include "DriverBase.h" + +namespace filament::backend { + +CallbackManager::CallbackManager(DriverBase& driver) noexcept + : mDriver(driver), mCallbacks(1) { +} + +CallbackManager::~CallbackManager() noexcept = default; + +void CallbackManager::terminate() noexcept { + for (auto&& item: mCallbacks) { + if (item.func) { + mDriver.scheduleCallback( + item.handler, item.user, item.func); + } + } +} + +CallbackManager::Handle CallbackManager::get() const noexcept { + Container::const_iterator const curr = getCurrent(); + curr->count.fetch_add(1); + return curr; +} + +void CallbackManager::put(Handle& curr) noexcept { + if (curr->count.fetch_sub(1) == 1) { + if (curr->func) { + mDriver.scheduleCallback( + curr->handler, curr->user, curr->func); + destroySlot(curr); + } + } + curr = {}; +} + +void CallbackManager::setCallback( + CallbackHandler* handler, CallbackHandler::Callback func, void* user) { + assert_invariant(func); + Container::iterator const curr = allocateNewSlot(); + curr->handler = handler; + curr->func = func; + curr->user = user; + if (curr->count == 0) { + mDriver.scheduleCallback( + curr->handler, curr->user, curr->func); + destroySlot(curr); + } +} + +} // namespace filament::backend diff --git a/filament/backend/src/CallbackManager.h b/filament/backend/src/CallbackManager.h new file mode 100644 index 00000000000..f4aee24c39c --- /dev/null +++ b/filament/backend/src/CallbackManager.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef TNT_FILAMENT_BACKEND_CALLBACKMANAGER_H +#define TNT_FILAMENT_BACKEND_CALLBACKMANAGER_H + +#include + +#include + +#include +#include +#include + +namespace filament::backend { + +class DriverBase; +class CallbackHandler; + +/* + * CallbackManager schedules user callbacks once all previous conditions are met. + * A "Condition" is created by calling "get" and is met by calling "put". These + * are typically called from different threads. + * The callback is specified with "setCallback", which atomically creates a new set of + * conditions to be met. + */ +class CallbackManager { + struct Callback { + mutable std::atomic_int count{}; + CallbackHandler* handler = nullptr; + CallbackHandler::Callback func = {}; + void* user = nullptr; + }; + + using Container = std::list; + +public: + using Handle = Container::const_iterator; + + explicit CallbackManager(DriverBase& driver) noexcept; + + ~CallbackManager() noexcept; + + // Calls all the pending callbacks regardless of remaining conditions to be met. This is to + // avoid leaking resources for instance. It also doesn't matter if the conditions are met + // because we're shutting down. + void terminate() noexcept; + + // creates a condition and get a handle for it + Handle get() const noexcept; + + // Announces the specified condition is met. If a callback was specified and all conditions + // prior to setting the callback are met, the callback is scheduled. + void put(Handle& curr) noexcept; + + // Sets a callback to be called when all previously created (get) conditions are met (put). + // If there were no conditions created, or they're all already met, the callback is scheduled + // immediately. + void setCallback(CallbackHandler* handler, CallbackHandler::Callback func, void* user); + +private: + Container::const_iterator getCurrent() const noexcept { + std::lock_guard const lock(mLock); + return --mCallbacks.end(); + } + + Container::iterator allocateNewSlot() noexcept { + std::lock_guard const lock(mLock); + auto curr = --mCallbacks.end(); + mCallbacks.emplace_back(); + return curr; + } + void destroySlot(Container::const_iterator curr) noexcept { + std::lock_guard const lock(mLock); + mCallbacks.erase(curr); + } + + DriverBase& mDriver; + mutable utils::Mutex mLock; + Container mCallbacks; +}; + +} // namespace filament::backend + +#endif // TNT_FILAMENT_BACKEND_CALLBACKMANAGER_H diff --git a/filament/backend/src/CircularBuffer.cpp b/filament/backend/src/CircularBuffer.cpp index 583ef95a25c..b8796623e01 100644 --- a/filament/backend/src/CircularBuffer.cpp +++ b/filament/backend/src/CircularBuffer.cpp @@ -16,7 +16,15 @@ #include "private/backend/CircularBuffer.h" -#if !defined(WIN32) && !defined(__EMSCRIPTEN__) && !defined(IOS) +#include +#include +#include +#include +#include +#include +#include + +#if !defined(WIN32) && !defined(__EMSCRIPTEN__) # include # include # define HAS_MMAP 1 @@ -24,20 +32,21 @@ # define HAS_MMAP 0 #endif +#include +#include #include - -#include -#include -#include -#include +#include +#include using namespace utils; namespace filament::backend { -CircularBuffer::CircularBuffer(size_t size) { +size_t CircularBuffer::sPageSize = arch::getPageSize(); + +CircularBuffer::CircularBuffer(size_t size) + : mSize(size) { mData = alloc(size); - mSize = size; mTail = mData; mHead = mData; } @@ -62,6 +71,7 @@ void* CircularBuffer::alloc(size_t size) noexcept { void* vaddr = MAP_FAILED; void* vaddr_shadow = MAP_FAILED; void* vaddr_guard = MAP_FAILED; + size_t const BLOCK_SIZE = getBlockSize(); int const fd = ashmem_create_region("filament::CircularBuffer", size + BLOCK_SIZE); if (fd >= 0) { // reserve/find enough address space @@ -72,6 +82,9 @@ void* CircularBuffer::alloc(size_t size) noexcept { // map the circular buffer once... vaddr = mmap(reserve_vaddr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); if (vaddr != MAP_FAILED) { + // populate the address space with pages (because this is a circular buffer, + // all the pages will be allocated eventually, might as well do it now) + memset(vaddr, 0, size); // and map the circular buffer again, behind the previous copy... vaddr_shadow = mmap((char*)vaddr + size, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); @@ -81,7 +94,7 @@ void* CircularBuffer::alloc(size_t size) noexcept { MAP_PRIVATE, fd, (off_t)size); if (vaddr_guard != MAP_FAILED && (vaddr_guard == (char*)vaddr_shadow + size)) { // woo-hoo success! - mUsesAshmem = fd; + mAshmemFd = fd; data = vaddr; } } @@ -89,10 +102,10 @@ void* CircularBuffer::alloc(size_t size) noexcept { } } - if (UTILS_UNLIKELY(mUsesAshmem < 0)) { + if (UTILS_UNLIKELY(mAshmemFd < 0)) { // ashmem failed if (vaddr_guard != MAP_FAILED) { - munmap(vaddr_guard, size); + munmap(vaddr_guard, BLOCK_SIZE); } if (vaddr_shadow != MAP_FAILED) { @@ -110,12 +123,11 @@ void* CircularBuffer::alloc(size_t size) noexcept { data = mmap(nullptr, size * 2 + BLOCK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - ASSERT_POSTCONDITION(data, - "couldn't allocate %u KiB of virtual address space for the command buffer", - (size * 2 / 1024)); + FILAMENT_CHECK_POSTCONDITION(data != MAP_FAILED) << + "couldn't allocate " << (size * 2 / 1024) << + " KiB of virtual address space for the command buffer"; - slog.d << "WARNING: Using soft CircularBuffer (" << (size * 2 / 1024) << " KiB)" - << io::endl; + slog.w << "Using 'soft' CircularBuffer (" << (size * 2 / 1024) << " KiB)" << io::endl; // guard page at the end void* guard = (void*)(uintptr_t(data) + size * 2); @@ -131,10 +143,11 @@ UTILS_NOINLINE void CircularBuffer::dealloc() noexcept { #if HAS_MMAP if (mData) { + size_t const BLOCK_SIZE = getBlockSize(); munmap(mData, mSize * 2 + BLOCK_SIZE); - if (mUsesAshmem >= 0) { - close(mUsesAshmem); - mUsesAshmem = -1; + if (mAshmemFd >= 0) { + close(mAshmemFd); + mAshmemFd = -1; } } #else @@ -144,23 +157,37 @@ void CircularBuffer::dealloc() noexcept { } -void CircularBuffer::circularize() noexcept { - if (mUsesAshmem > 0) { - intptr_t overflow = intptr_t(mHead) - (intptr_t(mData) + ssize_t(mSize)); - if (overflow >= 0) { - assert_invariant(size_t(overflow) <= mSize); - mHead = (void *) (intptr_t(mData) + overflow); - #ifndef NDEBUG - memset(mData, 0xA5, size_t(overflow)); - #endif - } - } else { - // Only circularize if mHead if in the second buffer. - if (intptr_t(mHead) - intptr_t(mData) > ssize_t(mSize)) { +CircularBuffer::Range CircularBuffer::getBuffer() noexcept { + Range const range{ .tail = mTail, .head = mHead }; + + char* const pData = static_cast(mData); + char const* const pEnd = pData + mSize; + char const* const pHead = static_cast(mHead); + if (UTILS_UNLIKELY(pHead >= pEnd)) { + size_t const overflow = pHead - pEnd; + if (UTILS_LIKELY(mAshmemFd > 0)) { + assert_invariant(overflow <= mSize); + mHead = static_cast(pData + overflow); + // Data Tail End Head [virtual] + // v v v v + // +-------------:----+-----:--------------+ + // | : | : | + // +-----:------------+--------------------+ + // Head |<------ copy ------>| [physical] + } else { + // Data Tail End Head + // v v v v + // +-------------:----+-----:--------------+ + // | : | : | + // +-----|------------+-----|--------------+ + // |<---------------->| + // sliding window mHead = mData; } } mTail = mHead; + + return range; } } // namespace filament::backend diff --git a/filament/backend/src/CommandBufferQueue.cpp b/filament/backend/src/CommandBufferQueue.cpp index 437ee0b40c3..39a81acffa6 100644 --- a/filament/backend/src/CommandBufferQueue.cpp +++ b/filament/backend/src/CommandBufferQueue.cpp @@ -15,23 +15,35 @@ */ #include "private/backend/CommandBufferQueue.h" +#include "private/backend/CircularBuffer.h" +#include "private/backend/CommandStream.h" +#include #include -#include +#include +#include #include +#include #include -#include "private/backend/BackendUtils.h" -#include "private/backend/CommandStream.h" +#include +#include +#include +#include +#include + +#include +#include using namespace utils; namespace filament::backend { -CommandBufferQueue::CommandBufferQueue(size_t requiredSize, size_t bufferSize) - : mRequiredSize((requiredSize + CircularBuffer::BLOCK_MASK) & ~CircularBuffer::BLOCK_MASK), +CommandBufferQueue::CommandBufferQueue(size_t requiredSize, size_t bufferSize, bool paused) + : mRequiredSize((requiredSize + (CircularBuffer::getBlockSize() - 1u)) & ~(CircularBuffer::getBlockSize() -1u)), mCircularBuffer(bufferSize), - mFreeSpace(mCircularBuffer.size()) { + mFreeSpace(mCircularBuffer.size()), + mPaused(paused) { assert_invariant(mCircularBuffer.size() > requiredSize); } @@ -45,10 +57,23 @@ void CommandBufferQueue::requestExit() { mCondition.notify_one(); } +bool CommandBufferQueue::isPaused() const noexcept { + std::lock_guard const lock(mLock); + return mPaused; +} + +void CommandBufferQueue::setPaused(bool paused) { + std::lock_guard const lock(mLock); + if (paused) { + mPaused = true; + } else { + mPaused = false; + mCondition.notify_one(); + } +} + bool CommandBufferQueue::isExitRequested() const { std::lock_guard const lock(mLock); - ASSERT_PRECONDITION( mExitRequested == 0 || mExitRequested == EXIT_REQUESTED, - "mExitRequested is corrupted (value = 0x%08x)!", mExitRequested); return (bool)mExitRequested; } @@ -65,67 +90,74 @@ void CommandBufferQueue::flush() noexcept { // always guaranteed to have enough space for the NoopCommand new(circularBuffer.allocate(sizeof(NoopCommand))) NoopCommand(nullptr); - // end of this slice - void* const head = circularBuffer.getHead(); + const size_t requiredSize = mRequiredSize; - // beginning of this slice - void* const tail = circularBuffer.getTail(); + // get the current buffer + auto const [begin, end] = circularBuffer.getBuffer(); - // size of this slice - uint32_t const used = uint32_t(intptr_t(head) - intptr_t(tail)); + assert_invariant(circularBuffer.empty()); + + // size of the current buffer + size_t const used = std::distance( + static_cast(begin), static_cast(end)); - circularBuffer.circularize(); std::unique_lock lock(mLock); - mCommandBuffersToExecute.push_back({ tail, head }); // circular buffer is too small, we corrupted the stream - ASSERT_POSTCONDITION(used <= mFreeSpace, + FILAMENT_CHECK_POSTCONDITION(used <= mFreeSpace) << "Backend CommandStream overflow. Commands are corrupted and unrecoverable.\n" "Please increase minCommandBufferSizeMB inside the Config passed to Engine::create.\n" - "Space used at this time: %u bytes", - (unsigned)used); + "Space used at this time: " << used << + " bytes, overflow: " << used - mFreeSpace << " bytes"; - // wait until there is enough space in the buffer mFreeSpace -= used; - const size_t requiredSize = mRequiredSize; + mCommandBuffersToExecute.push_back({ begin, end }); + mCondition.notify_one(); + + // wait until there is enough space in the buffer + if (UTILS_UNLIKELY(mFreeSpace < requiredSize)) { #ifndef NDEBUG - size_t totalUsed = circularBuffer.size() - mFreeSpace; - mHighWatermark = std::max(mHighWatermark, totalUsed); - if (UTILS_UNLIKELY(totalUsed > requiredSize)) { - slog.d << "CommandStream used too much space: " << totalUsed - << ", out of " << requiredSize << " (will block)" << io::endl; - } + size_t const totalUsed = circularBuffer.size() - mFreeSpace; + slog.d << "CommandStream used too much space (will block): " + << "needed space " << requiredSize << " out of " << mFreeSpace + << ", totalUsed=" << totalUsed << ", current=" << used + << ", queue size=" << mCommandBuffersToExecute.size() << " buffers" + << io::endl; + + mHighWatermark = std::max(mHighWatermark, totalUsed); #endif - mCondition.notify_one(); - if (UTILS_LIKELY(mFreeSpace < requiredSize)) { SYSTRACE_NAME("waiting: CircularBuffer::flush()"); + + FILAMENT_CHECK_POSTCONDITION(!mPaused) << + "CommandStream is full, but since the rendering thread is paused, " + "the buffer cannot flush and we will deadlock. Instead, abort."; + mCondition.wait(lock, [this, requiredSize]() -> bool { + // TODO: on macOS, we need to call pumpEvents from time to time return mFreeSpace >= requiredSize; }); } } -std::vector CommandBufferQueue::waitForCommands() const { +std::vector CommandBufferQueue::waitForCommands() const { if (!UTILS_HAS_THREADING) { return std::move(mCommandBuffersToExecute); } std::unique_lock lock(mLock); - while (mCommandBuffersToExecute.empty() && !mExitRequested) { + while ((mCommandBuffersToExecute.empty() || mPaused) && !mExitRequested) { mCondition.wait(lock); } - - ASSERT_PRECONDITION( mExitRequested == 0 || mExitRequested == EXIT_REQUESTED, - "mExitRequested is corrupted (value = 0x%08x)!", mExitRequested); - return std::move(mCommandBuffersToExecute); } -void CommandBufferQueue::releaseBuffer(CommandBufferQueue::Slice const& buffer) { +void CommandBufferQueue::releaseBuffer(CommandBufferQueue::Range const& buffer) { + size_t const used = std::distance( + static_cast(buffer.begin), static_cast(buffer.end)); std::lock_guard const lock(mLock); - mFreeSpace += uintptr_t(buffer.end) - uintptr_t(buffer.begin); + mFreeSpace += used; mCondition.notify_one(); } diff --git a/filament/backend/src/CommandStream.cpp b/filament/backend/src/CommandStream.cpp index 6e3d1c1b5fb..bb2207be530 100644 --- a/filament/backend/src/CommandStream.cpp +++ b/filament/backend/src/CommandStream.cpp @@ -20,11 +20,16 @@ #include #endif +#include #include +#include #include #include +#include #include +#include +#include #ifdef __ANDROID__ #include @@ -49,7 +54,7 @@ static void printParameterPack(io::ostream& out, const FIRST& first, const REMAI } static UTILS_NOINLINE UTILS_UNUSED std::string extractMethodName(std::string& command) noexcept { - constexpr const char startPattern[] = "::Command<&(filament::backend::Driver::"; + constexpr const char startPattern[] = "::Command<&filament::backend::Driver::"; auto pos = command.rfind(startPattern); auto end = command.rfind('('); pos += sizeof(startPattern) - 1; @@ -74,7 +79,8 @@ CommandStream::CommandStream(Driver& driver, CircularBuffer& buffer) noexcept } void CommandStream::execute(void* buffer) { - SYSTRACE_CALL(); + // NOTE: we can't use SYSTRACE_CALL() or similar here because, execute() below, also + // uses systrace BEGIN/END and the END is not guaranteed to be happening in this scope. Profiler profiler; @@ -99,6 +105,7 @@ void CommandStream::execute(void* buffer) { // we want to remove all this when tracing is completely disabled profiler.stop(); UTILS_UNUSED Profiler::Counters const counters = profiler.readCounters(); + SYSTRACE_CONTEXT(); SYSTRACE_VALUE32("GLThread (I)", counters.getInstructions()); SYSTRACE_VALUE32("GLThread (C)", counters.getCpuCycles()); SYSTRACE_VALUE32("GLThread (CPI x10)", counters.getCPI() * 10); @@ -148,7 +155,7 @@ void CommandType::Command::log() noexcept { // ------------------------------------------------------------------------------------------------ -void CustomCommand::execute(Driver&, CommandBase* base, intptr_t* next) noexcept { +void CustomCommand::execute(Driver&, CommandBase* base, intptr_t* next) { *next = CustomCommand::align(sizeof(CustomCommand)); static_cast(base)->mCommand(); static_cast(base)->~CustomCommand(); diff --git a/filament/backend/src/CompilerThreadPool.cpp b/filament/backend/src/CompilerThreadPool.cpp new file mode 100644 index 00000000000..591ae063c31 --- /dev/null +++ b/filament/backend/src/CompilerThreadPool.cpp @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "CompilerThreadPool.h" + +#include + +#include + +namespace filament::backend { + +using namespace utils; + +ProgramToken::~ProgramToken() = default; + +CompilerThreadPool::CompilerThreadPool() noexcept = default; + +CompilerThreadPool::~CompilerThreadPool() noexcept { + assert_invariant(mCompilerThreads.empty()); + assert_invariant(mQueues[0].empty()); + assert_invariant(mQueues[1].empty()); +} + +void CompilerThreadPool::init(uint32_t threadCount, + ThreadSetup&& threadSetup, ThreadCleanup&& threadCleanup) noexcept { + auto setup = std::make_shared(std::move(threadSetup)); + auto cleanup = std::make_shared(std::move(threadCleanup)); + + for (size_t i = 0; i < threadCount; i++) { + mCompilerThreads.emplace_back([this, setup, cleanup]() { + SYSTRACE_CONTEXT(); + + (*setup)(); + + // process jobs from the queue until we're asked to exit + while (!mExitRequested) { + std::unique_lock lock(mQueueLock); + mQueueCondition.wait(lock, [this]() { + return mExitRequested || + (!std::all_of( std::begin(mQueues), std::end(mQueues), + [](auto&& q) { return q.empty(); })); + }); + + SYSTRACE_VALUE32("CompilerThreadPool Jobs", + mQueues[0].size() + mQueues[1].size()); + + if (UTILS_LIKELY(!mExitRequested)) { + Job job; + // use the first queue that's not empty + auto& queue = [this]() -> auto& { + for (auto& q: mQueues) { + if (!q.empty()) { + return q; + } + } + return mQueues[0]; // we should never end-up here. + }(); + assert_invariant(!queue.empty()); + std::swap(job, queue.front().second); + queue.pop_front(); + + // execute the job without holding any locks + lock.unlock(); + job(); + } + } + + (*cleanup)(); + }); + + } +} + +auto CompilerThreadPool::find(program_token_t const& token) -> std::pair { + for (auto&& q: mQueues) { + auto pos = std::find_if(q.begin(), q.end(), [&token](auto&& item) { + return item.first == token; + }); + if (pos != q.end()) { + return { q, pos }; + } + } + // this can happen if the program is being processed right now + return { mQueues[0], mQueues[0].end() }; +} + +auto CompilerThreadPool::dequeue(program_token_t const& token) -> Job { + std::unique_lock const lock(mQueueLock); + Job job; + auto&& [q, pos] = find(token); + if (pos != q.end()) { + std::swap(job, pos->second); + q.erase(pos); + } + return job; +} + +void CompilerThreadPool::queue(CompilerPriorityQueue priorityQueue, + program_token_t const& token, Job&& job) { + std::unique_lock const lock(mQueueLock); + mQueues[size_t(priorityQueue)].emplace_back(token, std::move(job)); + mQueueCondition.notify_one(); +} + +void CompilerThreadPool::terminate() noexcept { + std::unique_lock lock(mQueueLock); + mExitRequested = true; + mQueueCondition.notify_all(); + lock.unlock(); + + for (auto& thread: mCompilerThreads) { + if (thread.joinable()) { + thread.join(); + } + } + mCompilerThreads.clear(); + + // Clear all the queues, dropping the remaining jobs. This relies on the jobs being cancelable. + for (auto&& q : mQueues) { + q.clear(); + } +} + +} // namespace filament::backend diff --git a/filament/backend/src/CompilerThreadPool.h b/filament/backend/src/CompilerThreadPool.h new file mode 100644 index 00000000000..fbdff68f695 --- /dev/null +++ b/filament/backend/src/CompilerThreadPool.h @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_COMPILERTHREADPOOL_H +#define TNT_FILAMENT_BACKEND_COMPILERTHREADPOOL_H + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace filament::backend { + +struct ProgramToken { + virtual ~ProgramToken(); +}; + +using program_token_t = std::shared_ptr; + +class Platform; + +class CompilerThreadPool { +public: + CompilerThreadPool() noexcept; + ~CompilerThreadPool() noexcept; + using Job = utils::Invocable; + using ThreadSetup = utils::Invocable; + using ThreadCleanup = utils::Invocable; + void init(uint32_t threadCount, + ThreadSetup&& threadSetup, ThreadCleanup&& threadCleanup) noexcept; + void terminate() noexcept; + void queue(CompilerPriorityQueue priorityQueue, program_token_t const& token, Job&& job); + Job dequeue(program_token_t const& token); + +private: + using Queue = std::deque>; + std::vector mCompilerThreads; + bool mExitRequested{ false }; + utils::Mutex mQueueLock; + utils::Condition mQueueCondition; + std::array mQueues; + // lock must be held for methods below + std::pair find(program_token_t const& token); +}; + +} // namespace filament::backend + +#endif // TNT_FILAMENT_BACKEND_COMPILERTHREADPOOL_H + diff --git a/filament/backend/src/DataReshaper.h b/filament/backend/src/DataReshaper.h index 4815113326e..eebe6b37d17 100644 --- a/filament/backend/src/DataReshaper.h +++ b/filament/backend/src/DataReshaper.h @@ -19,6 +19,7 @@ #include +#include #include #include diff --git a/filament/backend/src/Driver.cpp b/filament/backend/src/Driver.cpp index a4c29d3f81b..f33f855d9f4 100644 --- a/filament/backend/src/Driver.cpp +++ b/filament/backend/src/Driver.cpp @@ -21,7 +21,12 @@ #include #include +#include +#include +#include +#include +#include #include #include @@ -29,6 +34,13 @@ #include #include +#include +#include +#include + +#include +#include + using namespace utils; using namespace filament::math; @@ -63,6 +75,8 @@ DriverBase::DriverBase() noexcept { } DriverBase::~DriverBase() noexcept { + assert_invariant(mCallbacks.empty()); + assert_invariant(mServiceThreadCallbackQueue.empty()); if constexpr (UTILS_HAS_THREADING) { // quit our service thread std::unique_lock lock(mServiceThreadLock); @@ -95,11 +109,11 @@ void DriverBase::CallbackData::release(CallbackData* data) { void DriverBase::scheduleCallback(CallbackHandler* handler, void* user, CallbackHandler::Callback callback) { if (handler && UTILS_HAS_THREADING) { - std::lock_guard lock(mServiceThreadLock); + std::lock_guard const lock(mServiceThreadLock); mServiceThreadCallbackQueue.emplace_back(handler, callback, user); mServiceThreadCondition.notify_one(); } else { - std::lock_guard lock(mPurgeLock); + std::lock_guard const lock(mPurgeLock); mCallbacks.emplace_back(user, callback); } } @@ -117,7 +131,8 @@ void DriverBase::purge() noexcept { // ------------------------------------------------------------------------------------------------ void DriverBase::scheduleDestroySlow(BufferDescriptor&& buffer) noexcept { - scheduleCallback(buffer.getHandler(), [buffer = std::move(buffer)]() { + auto const handler = buffer.getHandler(); + scheduleCallback(handler, [buffer = std::move(buffer)]() { // user callback is called when BufferDescriptor gets destroyed }); } @@ -199,7 +214,7 @@ size_t Driver::getElementTypeSize(ElementType type) noexcept { Driver::~Driver() noexcept = default; -void Driver::execute(std::function const& fn) noexcept { +void Driver::execute(std::function const& fn) { fn(); } diff --git a/filament/backend/src/DriverBase.h b/filament/backend/src/DriverBase.h index 3de365245b9..14a4450dd03 100644 --- a/filament/backend/src/DriverBase.h +++ b/filament/backend/src/DriverBase.h @@ -49,21 +49,25 @@ struct AcquiredImage; struct HwBase { }; -struct HwVertexBuffer : public HwBase { - AttributeArray attributes{}; // 8 * MAX_VERTEX_ATTRIBUTE_COUNT - uint32_t vertexCount{}; // 4 + +struct HwVertexBufferInfo : public HwBase { uint8_t bufferCount{}; // 1 uint8_t attributeCount{}; // 1 - bool padding{}; // 1 - uint8_t bufferObjectsVersion{}; // 1 -> total struct is 136 bytes + bool padding[2]{}; // 2 + HwVertexBufferInfo() noexcept = default; + HwVertexBufferInfo(uint8_t bufferCount, uint8_t attributeCount) noexcept + : bufferCount(bufferCount), + attributeCount(attributeCount) { + } +}; +struct HwVertexBuffer : public HwBase { + uint32_t vertexCount{}; // 4 + uint8_t bufferObjectsVersion{0xff}; // 1 + bool padding[3]{}; // 2 HwVertexBuffer() noexcept = default; - HwVertexBuffer(uint8_t bufferCount, uint8_t attributeCount, uint32_t elementCount, - AttributeArray const& attributes) noexcept - : attributes(attributes), - vertexCount(elementCount), - bufferCount(bufferCount), - attributeCount(attributeCount) { + explicit HwVertexBuffer(uint32_t vertextCount) noexcept + : vertexCount(vertextCount) { } }; @@ -88,11 +92,6 @@ struct HwIndexBuffer : public HwBase { }; struct HwRenderPrimitive : public HwBase { - uint32_t offset{}; - uint32_t minIndex{}; - uint32_t maxIndex{}; - uint32_t count{}; - uint32_t maxVertexCount{}; PrimitiveType type = PrimitiveType::TRIANGLES; }; @@ -102,8 +101,12 @@ struct HwProgram : public HwBase { HwProgram() noexcept = default; }; -struct HwSamplerGroup : public HwBase { - HwSamplerGroup() noexcept = default; +struct HwDescriptorSetLayout : public HwBase { + HwDescriptorSetLayout() noexcept = default; +}; + +struct HwDescriptorSet : public HwBase { + HwDescriptorSet() noexcept = default; }; struct HwTexture : public HwBase { @@ -114,7 +117,9 @@ struct HwTexture : public HwBase { uint8_t levels : 4; // This allows up to 15 levels (max texture size of 32768 x 32768) uint8_t samples : 4; // Sample count per pixel (should always be a power of 2) TextureFormat format{}; + uint8_t reserved0 = 0; TextureUsage usage{}; + uint16_t reserved1 = 0; HwStream* hwStream = nullptr; HwTexture() noexcept : levels{}, samples{} {} @@ -135,9 +140,6 @@ struct HwFence : public HwBase { Platform::Fence* fence = nullptr; }; -struct HwSync : public HwBase { -}; - struct HwSwapChain : public HwBase { Platform::SwapChain* swapChain = nullptr; }; @@ -168,13 +170,6 @@ class DriverBase : public Driver { void purge() noexcept final; - // -------------------------------------------------------------------------------------------- - // Privates - // -------------------------------------------------------------------------------------------- - -protected: - class CallbackDataDetails; - // Helpers... struct CallbackData { CallbackData(CallbackData const &) = delete; @@ -205,6 +200,13 @@ class DriverBase : public Driver { void scheduleCallback(CallbackHandler* handler, void* user, CallbackHandler::Callback callback); + // -------------------------------------------------------------------------------------------- + // Privates + // -------------------------------------------------------------------------------------------- + +protected: + class CallbackDataDetails; + inline void scheduleDestroy(BufferDescriptor&& buffer) noexcept { if (buffer.hasCallback()) { scheduleDestroySlow(std::move(buffer)); diff --git a/filament/backend/src/Handle.cpp b/filament/backend/src/Handle.cpp index c715a5ee67e..77c1fbc6be4 100644 --- a/filament/backend/src/Handle.cpp +++ b/filament/backend/src/Handle.cpp @@ -16,11 +16,15 @@ #include +#include +#include +#include + #ifndef NDEBUG # include #endif -#include +#include using namespace utils; @@ -28,7 +32,7 @@ namespace filament::backend { #ifndef NDEBUG -static char const * const kOurNamespace = "filament::backend"; +static char const * const kOurNamespace = "filament::backend::"; // removes all occurrences of "what" from "str" UTILS_NOINLINE @@ -60,15 +64,16 @@ template io::ostream& operator<<(io::ostream& out, const Handle& template io::ostream& operator<<(io::ostream& out, const Handle& h) noexcept; template io::ostream& operator<<(io::ostream& out, const Handle& h) noexcept; template io::ostream& operator<<(io::ostream& out, const Handle& h) noexcept; -template io::ostream& operator<<(io::ostream& out, const Handle& h) noexcept; template io::ostream& operator<<(io::ostream& out, const Handle& h) noexcept; template io::ostream& operator<<(io::ostream& out, const Handle& h) noexcept; template io::ostream& operator<<(io::ostream& out, const Handle& h) noexcept; template io::ostream& operator<<(io::ostream& out, const Handle& h) noexcept; template io::ostream& operator<<(io::ostream& out, const Handle& h) noexcept; template io::ostream& operator<<(io::ostream& out, const Handle& h) noexcept; -template io::ostream& operator<<(io::ostream& out, const Handle& h) noexcept; template io::ostream& operator<<(io::ostream& out, const Handle& h) noexcept; +template io::ostream& operator<<(io::ostream& out, const Handle& h) noexcept; +template io::ostream& operator<<(io::ostream& out, const Handle& h) noexcept; +template io::ostream& operator<<(io::ostream& out, const Handle& h) noexcept; #endif diff --git a/filament/backend/src/HandleAllocator.cpp b/filament/backend/src/HandleAllocator.cpp index 3257e4e2c94..6cdcaa4af4f 100644 --- a/filament/backend/src/HandleAllocator.cpp +++ b/filament/backend/src/HandleAllocator.cpp @@ -16,9 +16,22 @@ #include "private/backend/HandleAllocator.h" +#include + +#include +#include #include +#include +#include +#include + +#include +#include +#include +#include #include +#include namespace filament::backend { @@ -26,23 +39,50 @@ using namespace utils; template UTILS_NOINLINE -HandleAllocator::Allocator::Allocator(AreaPolicy::HeapArea const& area) - : mArea(area) { - // TODO: we probably need a better way to set the size of these pools - const size_t unit = area.size() / 32; - const size_t offsetPool1 = unit; - const size_t offsetPool2 = 16 * unit; - char* const p = (char*)area.begin(); - mPool0 = PoolAllocator< P0, 16>(p, p + offsetPool1); - mPool1 = PoolAllocator< P1, 16>(p + offsetPool1, p + offsetPool2); - mPool2 = PoolAllocator< P2, 16>(p + offsetPool2, area.end()); +HandleAllocator::Allocator::Allocator(AreaPolicy::HeapArea const& area, + bool disableUseAfterFreeCheck) + : mArea(area), + mUseAfterFreeCheckDisabled(disableUseAfterFreeCheck) { + + // The largest handle this allocator can generate currently depends on the architecture's + // min alignment, typically 8 or 16 bytes. + // e.g. On Android armv8, the alignment is 16 bytes, so for a 1 MiB heap, the largest handle + // index will be 65536. Note that this is not the same as the number of handles (which + // will always be less). + // Because our maximum representable handle currently is 0x07FFFFFF, the maximum no-nonsensical + // heap size is 2 GiB, which amounts to 7.6 millions handles per pool (in the GL case). + size_t const maxHeapSize = std::min(area.size(), HANDLE_INDEX_MASK * getAlignment()); + + if (UTILS_UNLIKELY(maxHeapSize != area.size())) { + slog.w << "HandleAllocator heap size reduced to " + << maxHeapSize << " from " << area.size() << io::endl; + } + + // make sure we start with a clean arena. This is needed to ensure that all blocks start + // with an age of 0. + memset(area.data(), 0, maxHeapSize); + + // size the different pools so that they can all contain the same number of handles + size_t const count = maxHeapSize / (P0 + P1 + P2); + char* const p0 = static_cast(area.begin()); + char* const p1 = p0 + count * P0; + char* const p2 = p1 + count * P1; + + mPool0 = Pool(p0, count * P0); + mPool1 = Pool(p1, count * P1); + mPool2 = Pool(p2, count * P2); } // ------------------------------------------------------------------------------------------------ template -HandleAllocator::HandleAllocator(const char* name, size_t size) noexcept - : mHandleArena(name, size) { +HandleAllocator::HandleAllocator(const char* name, size_t size, + bool disableUseAfterFreeCheck) noexcept + : mHandleArena(name, size, disableUseAfterFreeCheck), + mUseAfterFreeCheckDisabled(disableUseAfterFreeCheck) { + // Reserve initial space for debug tags. This prevents excessive calls to malloc when the first + // few tags are set. + mDebugTags.reserve(512); } template @@ -70,14 +110,20 @@ void* HandleAllocator::handleToPointerSlow(HandleBase::HandleId id) } template -HandleBase::HandleId HandleAllocator::allocateHandleSlow(size_t size) noexcept { +HandleBase::HandleId HandleAllocator::allocateHandleSlow(size_t size) { void* p = ::malloc(size); std::unique_lock lock(mLock); - HandleBase::HandleId id = (++mId) | HEAP_HANDLE_FLAG; + + HandleBase::HandleId id = (++mId) | HANDLE_HEAP_FLAG; + + FILAMENT_CHECK_POSTCONDITION(mId < HANDLE_HEAP_FLAG) << + "No more Handle ids available! This can happen if HandleAllocator arena has been full" + " for a while. Please increase FILAMENT_OPENGL_HANDLE_ARENA_SIZE_IN_MB"; + mOverflowMap.emplace(id, p); lock.unlock(); - if (UTILS_UNLIKELY(id == (HEAP_HANDLE_FLAG|1u))) { // meaning id was zero + if (UTILS_UNLIKELY(id == (HANDLE_HEAP_FLAG | 1u))) { // meaning id was zero PANIC_LOG("HandleAllocator arena is full, using slower system heap. Please increase " "the appropriate constant (e.g. FILAMENT_OPENGL_HANDLE_ARENA_SIZE_IN_MB)."); } @@ -86,7 +132,7 @@ HandleBase::HandleId HandleAllocator::allocateHandleSlow(size_t size template void HandleAllocator::deallocateHandleSlow(HandleBase::HandleId id, size_t) noexcept { - assert_invariant(id & HEAP_HANDLE_FLAG); + assert_invariant(id & HANDLE_HEAP_FLAG); void* p = nullptr; auto& overflowMap = mOverflowMap; diff --git a/filament/backend/src/Platform.cpp b/filament/backend/src/Platform.cpp index f17d04bc1fe..77c85129417 100644 --- a/filament/backend/src/Platform.cpp +++ b/filament/backend/src/Platform.cpp @@ -18,6 +18,8 @@ namespace filament::backend { +Platform::Platform() noexcept = default; + // this generates the vtable in this translation unit Platform::~Platform() noexcept = default; @@ -25,4 +27,44 @@ bool Platform::pumpEvents() noexcept { return false; } +void Platform::setBlobFunc(InsertBlobFunc&& insertBlob, RetrieveBlobFunc&& retrieveBlob) noexcept { + mInsertBlob = std::move(insertBlob); + mRetrieveBlob = std::move(retrieveBlob); +} + +bool Platform::hasInsertBlobFunc() const noexcept { + return bool(mInsertBlob); +} + +bool Platform::hasRetrieveBlobFunc() const noexcept { + return bool(mRetrieveBlob); +} + +void Platform::insertBlob(void const* key, size_t keySize, void const* value, size_t valueSize) { + if (mInsertBlob) { + mInsertBlob(key, keySize, value, valueSize); + } +} + +size_t Platform::retrieveBlob(void const* key, size_t keySize, void* value, size_t valueSize) { + if (mRetrieveBlob) { + return mRetrieveBlob(key, keySize, value, valueSize); + } + return 0; +} + +void Platform::setDebugUpdateStatFunc(DebugUpdateStatFunc&& debugUpdateStat) noexcept { + mDebugUpdateStat = std::move(debugUpdateStat); +} + +bool Platform::hasDebugUpdateStatFunc() const noexcept { + return bool(mDebugUpdateStat); +} + +void Platform::debugUpdateStat(const char* key, uint64_t value) { + if (mDebugUpdateStat) { + mDebugUpdateStat(key, value); + } +} + } // namespace filament::backend diff --git a/filament/backend/src/PlatformFactory.cpp b/filament/backend/src/PlatformFactory.cpp index f30be0d8ef9..cccd9439c3e 100644 --- a/filament/backend/src/PlatformFactory.cpp +++ b/filament/backend/src/PlatformFactory.cpp @@ -24,53 +24,40 @@ #if defined(FILAMENT_SUPPORTS_OPENGL) && !defined(FILAMENT_USE_EXTERNAL_GLES3) #include "backend/platforms/PlatformEGLAndroid.h" #endif - #if defined(FILAMENT_DRIVER_SUPPORTS_VULKAN) - #include "vulkan/PlatformVkAndroid.h" - #endif -#elif defined(IOS) +#elif defined(FILAMENT_IOS) #if defined(FILAMENT_SUPPORTS_OPENGL) && !defined(FILAMENT_USE_EXTERNAL_GLES3) #include "backend/platforms/PlatformCocoaTouchGL.h" #endif - #if defined(FILAMENT_DRIVER_SUPPORTS_VULKAN) - #include "vulkan/PlatformVkCocoaTouch.h" - #endif #elif defined(__APPLE__) - #if defined(FILAMENT_SUPPORTS_OPENGL) && !defined(FILAMENT_USE_EXTERNAL_GLES3) && !defined(FILAMENT_USE_SWIFTSHADER) + #if defined(FILAMENT_SUPPORTS_OPENGL) && !defined(FILAMENT_USE_EXTERNAL_GLES3) #include #endif - #if defined(FILAMENT_DRIVER_SUPPORTS_VULKAN) - #include "vulkan/PlatformVkCocoa.h" - #endif #elif defined(__linux__) - #if defined(FILAMENT_SUPPORTS_GGP) - #include "vulkan/PlatformVkLinuxGGP.h" - #elif defined(FILAMENT_SUPPORTS_WAYLAND) - #if defined (FILAMENT_DRIVER_SUPPORTS_VULKAN) - #include "vulkan/PlatformVkLinuxWayland.h" - #endif - #elif defined(FILAMENT_SUPPORTS_X11) - #if defined(FILAMENT_SUPPORTS_OPENGL) && !defined(FILAMENT_USE_EXTERNAL_GLES3) && !defined(FILAMENT_USE_SWIFTSHADER) + #if defined(FILAMENT_SUPPORTS_X11) + #if defined(FILAMENT_SUPPORTS_OPENGL) && !defined(FILAMENT_USE_EXTERNAL_GLES3) #include "backend/platforms/PlatformGLX.h" #endif - #if defined (FILAMENT_DRIVER_SUPPORTS_VULKAN) - #include "vulkan/PlatformVkLinuxX11.h" - #endif #elif defined(FILAMENT_SUPPORTS_EGL_ON_LINUX) - #if defined(FILAMENT_SUPPORTS_OPENGL) && !defined(FILAMENT_USE_EXTERNAL_GLES3) && !defined(FILAMENT_USE_SWIFTSHADER) + #if defined(FILAMENT_SUPPORTS_OPENGL) && !defined(FILAMENT_USE_EXTERNAL_GLES3) #include "backend/platforms/PlatformEGLHeadless.h" #endif + #elif defined(FILAMENT_SUPPORTS_OSMESA) + #if defined(FILAMENT_SUPPORTS_OPENGL) && !defined(FILAMENT_USE_EXTERNAL_GLES3) + #include "backend/platforms/PlatformOSMesa.h" + #endif #endif #elif defined(WIN32) - #if defined(FILAMENT_SUPPORTS_OPENGL) && !defined(FILAMENT_USE_EXTERNAL_GLES3) && !defined(FILAMENT_USE_SWIFTSHADER) + #if defined(FILAMENT_SUPPORTS_OPENGL) && !defined(FILAMENT_USE_EXTERNAL_GLES3) #include "backend/platforms/PlatformWGL.h" #endif - #if defined(FILAMENT_DRIVER_SUPPORTS_VULKAN) - #include "vulkan/PlatformVkWindows.h" - #endif #elif defined(__EMSCRIPTEN__) #include "backend/platforms/PlatformWebGL.h" #endif +#if defined(FILAMENT_DRIVER_SUPPORTS_VULKAN) + #include "backend/platforms/VulkanPlatform.h" +#endif + #if defined (FILAMENT_SUPPORTS_METAL) namespace filament::backend { filament::backend::Platform* createDefaultMetalPlatform(); @@ -101,12 +88,12 @@ Platform* PlatformFactory::create(Backend* backend) noexcept { *backend = Backend::OPENGL; #elif defined(__ANDROID__) *backend = Backend::OPENGL; -#elif defined(IOS) || defined(__APPLE__) +#elif defined(FILAMENT_IOS) || defined(__APPLE__) *backend = Backend::METAL; #elif defined(FILAMENT_DRIVER_SUPPORTS_VULKAN) *backend = Backend::VULKAN; #else - * backend = Backend::OPENGL; + *backend = Backend::OPENGL; #endif } if (*backend == Backend::NOOP) { @@ -114,25 +101,7 @@ Platform* PlatformFactory::create(Backend* backend) noexcept { } if (*backend == Backend::VULKAN) { #if defined(FILAMENT_DRIVER_SUPPORTS_VULKAN) - #if defined(__ANDROID__) - return new PlatformVkAndroid(); - #elif defined(IOS) - return new PlatformVkCocoaTouch(); - #elif defined(__linux__) - #if defined(FILAMENT_SUPPORTS_GGP) - return new PlatformVkLinuxGGP(); - #elif defined(FILAMENT_SUPPORTS_WAYLAND) - return new PlatformVkLinuxWayland(); - #elif defined(FILAMENT_SUPPORTS_X11) - return new PlatformVkLinuxX11(); - #endif - #elif defined(__APPLE__) - return new PlatformVkCocoa(); - #elif defined(WIN32) - return new PlatformVkWindows(); - #else - return nullptr; - #endif + return new VulkanPlatform(); #else return nullptr; #endif @@ -146,12 +115,11 @@ Platform* PlatformFactory::create(Backend* backend) noexcept { } assert_invariant(*backend == Backend::OPENGL); #if defined(FILAMENT_SUPPORTS_OPENGL) - #if defined(FILAMENT_USE_EXTERNAL_GLES3) || defined(FILAMENT_USE_SWIFTSHADER) - // Swiftshader OpenGLES support is deprecated and incomplete + #if defined(FILAMENT_USE_EXTERNAL_GLES3) return nullptr; #elif defined(__ANDROID__) return new PlatformEGLAndroid(); - #elif defined(IOS) + #elif defined(FILAMENT_IOS) return new PlatformCocoaTouchGL(); #elif defined(__APPLE__) return new PlatformCocoaGL(); @@ -160,6 +128,10 @@ Platform* PlatformFactory::create(Backend* backend) noexcept { return new PlatformGLX(); #elif defined(FILAMENT_SUPPORTS_EGL_ON_LINUX) return new PlatformEGLHeadless(); + #elif defined(FILAMENT_SUPPORTS_OSMESA) + return new PlatformOSMesa(); + #else + return nullptr; #endif #elif defined(WIN32) return new PlatformWGL(); diff --git a/filament/backend/src/Program.cpp b/filament/backend/src/Program.cpp index 2e04067050c..bb4249f82a6 100644 --- a/filament/backend/src/Program.cpp +++ b/filament/backend/src/Program.cpp @@ -14,29 +14,36 @@ * limitations under the License. */ -#include "backend/Program.h" +#include +#include + +#include +#include +#include +#include + +#include + +#include +#include namespace filament::backend { using namespace utils; // We want these in the .cpp file, so they're not inlined (not worth it) -Program::Program() noexcept { // NOLINT(modernize-use-equals-default) +Program::Program() noexcept { // NOLINT(modernize-use-equals-default) } Program::Program(Program&& rhs) noexcept = default; -Program& Program::operator=(Program&& rhs) noexcept { - mUniformBlocks.operator=(rhs.mUniformBlocks); - mSamplerGroups.operator=(std::move(rhs.mSamplerGroups)); - mShadersSource.operator=(std::move(rhs.mShadersSource)); - mName.operator=(std::move(rhs.mName)); - mLogger.operator=(std::move(rhs.mLogger)); +Program::~Program() noexcept = default; + +Program& Program::priorityQueue(CompilerPriorityQueue priorityQueue) noexcept { + mPriorityQueue = priorityQueue; return *this; } -Program::~Program() noexcept = default; - Program& Program::diagnostics(CString const& name, Invocable&& logger) { mName = name; @@ -51,32 +58,49 @@ Program& Program::shader(ShaderStage shader, void const* data, size_t size) { return *this; } -Program& Program::uniformBlockBindings( - FixedCapacityVector> const& uniformBlockBindings) noexcept { - for (auto const& item : uniformBlockBindings) { - assert_invariant(item.second < UNIFORM_BINDING_COUNT); - mUniformBlocks[item.second] = item.first; - } +Program& Program::shaderLanguage(ShaderLanguage shaderLanguage) { + mShaderLanguage = shaderLanguage; + return *this; +} + +Program& Program::descriptorBindings(backend::descriptor_set_t set, + DescriptorBindingsInfo descriptorBindings) noexcept { + mDescriptorBindings[set] = std::move(descriptorBindings); return *this; } -Program& Program::setSamplerGroup(size_t bindingPoint, ShaderStageFlags stageFlags, - const Program::Sampler* samplers, size_t count) noexcept { - auto& groupData = mSamplerGroups[bindingPoint]; - groupData.stageFlags = stageFlags; - auto& samplerList = groupData.samplers; - samplerList.reserve(count); - samplerList.resize(count); - std::copy_n(samplers, count, samplerList.data()); +Program& Program::uniforms(uint32_t index, utils::CString name, UniformInfo uniforms) noexcept { + mBindingUniformsInfo.reserve(mBindingUniformsInfo.capacity() + 1); + mBindingUniformsInfo.emplace_back(index, std::move(name), std::move(uniforms)); return *this; } -Program& Program::specializationConstants( - FixedCapacityVector specConstants) noexcept { +Program& Program::attributes(AttributesInfo attributes) noexcept { + mAttributes = std::move(attributes); + return *this; +} + +Program& Program::specializationConstants(SpecializationConstantsInfo specConstants) noexcept { mSpecializationConstants = std::move(specConstants); return *this; } +Program& Program::pushConstants(ShaderStage stage, + utils::FixedCapacityVector constants) noexcept { + mPushConstants[static_cast(stage)] = std::move(constants); + return *this; +} + +Program& Program::cacheId(uint64_t cacheId) noexcept { + mCacheId = cacheId; + return *this; +} + +Program& Program::multiview(bool multiview) noexcept { + mMultiview = multiview; + return *this; +} + io::ostream& operator<<(io::ostream& out, const Program& builder) { out << "Program{"; builder.mLogger(out); @@ -84,5 +108,4 @@ io::ostream& operator<<(io::ostream& out, const Program& builder) { return out; } - } // namespace filament::backend diff --git a/filament/backend/src/SamplerGroup.cpp b/filament/backend/src/SamplerGroup.cpp deleted file mode 100644 index fa6d028d19d..00000000000 --- a/filament/backend/src/SamplerGroup.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "private/backend/SamplerGroup.h" - -#include "private/backend/DriverApi.h" - -#include "backend/BufferDescriptor.h" - -namespace filament::backend { - -// create a sampler buffer -SamplerGroup::SamplerGroup(size_t count) noexcept - : mBuffer(count) { -} - -SamplerGroup::SamplerGroup(const SamplerGroup& rhs) noexcept : - mBuffer(rhs.mBuffer), mDirty(true) { -} - -SamplerGroup& SamplerGroup::operator=(const SamplerGroup& rhs) noexcept { - if (this != &rhs) { - mBuffer = rhs.mBuffer; - mDirty = true; - } - return *this; -} - -void SamplerGroup::setSampler(size_t index, SamplerDescriptor sampler) noexcept { - if (UTILS_LIKELY(index < mBuffer.size())) { - // We cannot compare two texture handles to determine if an update is needed. Texture - // handles are (quickly) recycled and therefore can't be used for that purpose. e.g. if a - // texture is destroyed, its handle could be reused quickly by another texture. - // TODO: find a way to avoid marking dirty if the texture does not change. - mBuffer[index] = sampler; - mDirty = true; - } -} - -BufferDescriptor SamplerGroup::toBufferDescriptor(DriverApi& driver) const noexcept { - BufferDescriptor p; - p.size = mBuffer.size() * sizeof(SamplerDescriptor); - p.buffer = driver.allocate(p.size); // TODO: use out-of-line buffer if too large - memcpy(p.buffer, static_cast(mBuffer.data()), p.size); // inlined - clean(); - return p; -} - -#if !defined(NDEBUG) -utils::io::ostream& operator<<(utils::io::ostream& out, const SamplerGroup& rhs) { - return out << "SamplerGroup(size=" << rhs.getSize() << ")"; -} -#endif - -} // namespace filament::backend diff --git a/filament/backend/src/SystraceProfile.h b/filament/backend/src/SystraceProfile.h new file mode 100644 index 00000000000..ae561aa1f60 --- /dev/null +++ b/filament/backend/src/SystraceProfile.h @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_SYSTRACEPROFILE_H +#define TNT_FILAMENT_BACKEND_SYSTRACEPROFILE_H + +#include + +#define PROFILE_SCOPE(marker) SYSTRACE_NAME(marker) + +#define PROFILE_NAME_BEGINFRAME "backend::beginFrame" +#define PROFILE_NAME_ENDFRAME "backend::endFrame" + +#endif // TNT_FILAMENT_BACKEND_SYSTRACEPROFILE_H + diff --git a/filament/backend/src/VirtualMachineEnv.cpp b/filament/backend/src/VirtualMachineEnv.cpp index ba156a8ad48..c7ff7b17906 100644 --- a/filament/backend/src/VirtualMachineEnv.cpp +++ b/filament/backend/src/VirtualMachineEnv.cpp @@ -16,13 +16,23 @@ #include "private/backend/VirtualMachineEnv.h" +#include #include +#include + namespace filament { JavaVM* VirtualMachineEnv::sVirtualMachine = nullptr; -// This is called when the library is loaded. We need this to get a reference to the global VM +/* + * This is typically called by filament_jni.so when it is loaded. If filament_jni.so is not used, + * then this must be called manually -- however, this is a problem because VirtualMachineEnv.h + * is currently private and part of backend. + * For now, we authorize this usage, but we will need to fix it; by making a proper public + * API for this. + */ +UTILS_PUBLIC UTILS_NOINLINE jint VirtualMachineEnv::JNI_OnLoad(JavaVM* vm) noexcept { JNIEnv* env = nullptr; diff --git a/filament/backend/src/metal/MetalBlitter.h b/filament/backend/src/metal/MetalBlitter.h index 393b84d0bcc..3882c18df3b 100644 --- a/filament/backend/src/metal/MetalBlitter.h +++ b/filament/backend/src/metal/MetalBlitter.h @@ -24,8 +24,7 @@ #include #include -namespace filament { -namespace backend { +namespace filament::backend { struct MetalContext; @@ -37,8 +36,7 @@ class MetalBlitter { struct BlitArgs { struct Attachment { - id color = nil; - id depth = nil; + id texture = nil; MTLRegion region = {}; uint8_t level = 0; uint32_t slice = 0; // must be 0 on source attachment @@ -46,25 +44,13 @@ class MetalBlitter { // Valid source formats: 2D, 2DArray, 2DMultisample, 3D // Valid destination formats: 2D, 2DArray, 3D, Cube - Attachment source, destination; + Attachment source; + Attachment destination; SamplerMagFilter filter; - bool blitColor() const { - return source.color != nil && destination.color != nil; - } - - bool blitDepth() const { - return source.depth != nil && destination.depth != nil; - } - - bool colorDestinationIsFullAttachment() const { - return destination.color.width == destination.region.size.width && - destination.color.height == destination.region.size.height; - } - - bool depthDestinationIsFullAttachment() const { - return destination.depth.width == destination.region.size.width && - destination.depth.height == destination.region.size.height; + bool destinationIsFullAttachment() const { + return destination.texture.width == destination.region.size.width && + destination.texture.height == destination.region.size.height; } }; @@ -78,48 +64,36 @@ class MetalBlitter { private: - static void setupColorAttachment(const BlitArgs& args, MTLRenderPassDescriptor* descriptor, - uint32_t depthPlane); - static void setupDepthAttachment(const BlitArgs& args, MTLRenderPassDescriptor* descriptor, - uint32_t depthPlane); + static void setupAttachment(MTLRenderPassAttachmentDescriptor* descriptor, + const BlitArgs& args, uint32_t depthPlane); struct BlitFunctionKey { - bool blitColor; - bool blitDepth; - bool msaaColorSource; - bool msaaDepthSource; - bool sources3D; - - char padding[3]; + bool msaaColorSource{}; + bool sources3D{}; + char padding[2]{}; bool isValid() const noexcept { // MSAA 3D textures do not exist. - bool hasMsaa = msaaColorSource || msaaDepthSource; + bool const hasMsaa = msaaColorSource; return !(hasMsaa && sources3D); } bool operator==(const BlitFunctionKey& rhs) const noexcept { - return blitColor == rhs.blitColor && - blitDepth == rhs.blitDepth && - msaaColorSource == rhs.msaaColorSource && - msaaDepthSource == rhs.msaaDepthSource && + return msaaColorSource == rhs.msaaColorSource && sources3D == rhs.sources3D; } - - BlitFunctionKey() { - std::memset(this, 0, sizeof(BlitFunctionKey)); - } }; - void blitFastPath(id cmdBuffer, bool& blitColor, bool& blitDepth, + static bool blitFastPath(id cmdBuffer, const BlitArgs& args, const char* label); - void blitSlowPath(id cmdBuffer, bool& blitColor, bool& blitDepth, + + void blitSlowPath(id cmdBuffer, const BlitArgs& args, const char* label); - void blitDepthPlane(id cmdBuffer, bool blitColor, bool blitDepth, - const BlitArgs& args, uint32_t depthPlaneSource, uint32_t depthPlaneDest, - const char* label); - id createIntermediateTexture(id t, MTLSize size); - id compileFragmentFunction(BlitFunctionKey key); + + void blitDepthPlane(id cmdBuffer, const BlitArgs& args, + uint32_t depthPlaneSource, uint32_t depthPlaneDest, const char* label); + + id compileFragmentFunction(BlitFunctionKey key) const; id getBlitVertexFunction(); id getBlitFragmentFunction(BlitFunctionKey key); @@ -130,10 +104,9 @@ class MetalBlitter { tsl::robin_map mBlitFunctions; id mVertexFunction = nil; - }; -} // namespace backend -} // namespace filament +} // namespace filament::backend + #endif //TNT_METALBLITTER_H diff --git a/filament/backend/src/metal/MetalBlitter.mm b/filament/backend/src/metal/MetalBlitter.mm index d5b856e82b8..6675434bce8 100644 --- a/filament/backend/src/metal/MetalBlitter.mm +++ b/filament/backend/src/metal/MetalBlitter.mm @@ -20,9 +20,9 @@ #include "MetalUtils.h" #include +#include -namespace filament { -namespace backend { +namespace filament::backend { static const char* functionLibrary = R"( #include @@ -37,13 +37,7 @@ struct FragmentOut { -#ifdef BLIT_COLOR float4 color [[color(0)]]; -#endif - -#ifdef BLIT_DEPTH - float depth [[depth(any)]]; -#endif }; vertex VertexOut @@ -67,7 +61,6 @@ blitterFrag(VertexOut in [[stage_in]], sampler sourceSampler [[sampler(0)]], -#ifdef BLIT_COLOR #ifdef MSAA_COLOR_SOURCE texture2d_ms sourceColor [[texture(0)]], #elif SOURCES_3D @@ -75,32 +68,18 @@ #else texture2d sourceColor [[texture(0)]], #endif // MSAA_COLOR_SOURCE -#endif // BLIT_COLOR - -#ifdef BLIT_DEPTH -#ifdef MSAA_DEPTH_SOURCE - texture2d_ms sourceDepth [[texture(1)]], -#elif SOURCES_3D - texture3d sourceDepth [[texture(1)]], -#else - texture2d sourceDepth [[texture(1)]], -#endif // MSAA_DEPTH_SOURCE -#endif // BLIT_DEPTH constant FragmentArgs* args [[buffer(0)]]) { FragmentOut out = {}; -#if defined(BLIT_COLOR) || defined(BLIT_DEPTH) // These coordinates match the Vulkan vkCmdBlitImage spec: // https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkCmdBlitImage.html float2 uvbase = in.position.xy; // unnormalized coordinates at center of texel: (1.5, 2.5, etc) float2 uvoffset = uvbase - args->dstOffset; float2 uvscaled = uvoffset * args->scale; float2 uv = uvscaled + args->srcOffset; -#endif -#ifdef BLIT_COLOR #ifdef MSAA_COLOR_SOURCE out.color = float4(0.0); for (uint s = 0; s < sourceColor.get_num_samples(); s++) { @@ -116,201 +95,105 @@ float2 uvnorm = uv / float2(sourceColor.get_width(args->lod), sourceColor.get_height(args->lod)); out.color += sourceColor.sample(sourceSampler, uvnorm, level(args->lod)); #endif // MSAA_COLOR_SOURCE -#endif // BLIT_COLOR -#ifdef BLIT_DEPTH -#ifdef MSAA_DEPTH_SOURCE - out.depth = 0.0; - for (uint s = 0; s < sourceDepth.get_num_samples(); s++) { - out.depth += sourceDepth.read(static_cast(uv), s).r; - } - out.depth /= sourceDepth.get_num_samples(); -#elif SOURCES_3D - float2 uvnormd = uv / float2(sourceDepth.get_width(args->lod), sourceDepth.get_height(args->lod)); - float3 coords = float3(uvnormd, (static_cast(args->depthPlane) + 0.5) / - sourceDepth.get_depth(args->lod)); - out.depth = sourceDepth.sample(sourceSampler, coords, level(args->lod)).r; -#else - float2 uvnormd = uv / float2(sourceDepth.get_width(args->lod), sourceDepth.get_height(args->lod)); - out.depth = sourceDepth.sample(sourceSampler, uvnormd, level(args->lod)).r; -#endif // MSAA_DEPTH_SOURCE -#endif // BLIT_DEPTH return out; } )"; -MetalBlitter::MetalBlitter(MetalContext& context) noexcept : mContext(context) { } - -#define MTLSizeEqual(a, b) (a.width == b.width && a.height == b.height && a.depth == b.depth) - -void MetalBlitter::blit(id cmdBuffer, const BlitArgs& args, const char* label) { - bool blitColor = args.blitColor(); - bool blitDepth = args.blitDepth(); - - ASSERT_PRECONDITION(args.source.region.size.depth == args.destination.region.size.depth, - "Blitting requires the source and destination regions to have the same depth."); - if (args.source.color && args.source.depth) { - MTLTextureType colorType = args.source.color.textureType; - MTLTextureType depthType = args.source.depth.textureType; +template +inline bool MTLSizeEqual(T a, T b) noexcept { + return (a.width == b.width && a.height == b.height && a.depth == b.depth); +} - if (colorType == MTLTextureType2DMultisample) colorType = MTLTextureType2D; - if (depthType == MTLTextureType2DMultisample) depthType = MTLTextureType2D; +MetalBlitter::MetalBlitter(MetalContext& context) noexcept : mContext(context) { } - ASSERT_PRECONDITION(colorType == depthType, - "Blitting requires color and depth sources to be the same texture type."); - } +void MetalBlitter::blit(id cmdBuffer, const BlitArgs& args, const char* label) { + FILAMENT_CHECK_PRECONDITION(args.source.region.size.depth == args.destination.region.size.depth) + << "Blitting requires the source and destination regions to have the same depth."; // Determine if the blit for color or depth are eligible to use a MTLBlitCommandEncoder. - // blitColor and / or blitDepth are set to false upon success, to indicate that no more work is - // necessary for that attachment. - blitFastPath(cmdBuffer, blitColor, blitDepth, args, label); - - if (!blitColor && !blitDepth) { + // blitFastPath returns true upon success. + // blitFastPath fails if either the format or sampleCount don't match (i.e. resolve) + if (blitFastPath(cmdBuffer, args, label)) { return; } - // If the destination is MSAA and we weren't able to use the fast path, report an error, as - // blitting to a MSAA texture isn't supported through the "slow path" yet. - const bool colorDestinationIsMultisample = - blitColor && args.destination.color.textureType == MTLTextureType2DMultisample; - const bool depthDestinationIsMultisample = - blitDepth && args.destination.depth.textureType == MTLTextureType2DMultisample; - ASSERT_PRECONDITION(!colorDestinationIsMultisample && !depthDestinationIsMultisample, - "Blitting between MSAA render targets with differing pixel formats and/or regions is not supported."); - - // If the destination texture doesn't have the MTLTextureUsageRenderTarget flag, we have to blit - // to an intermediate texture first to perform the format conversion. Then, we can perform a - // "fast blit" to the final destination texture. - - id intermediateColor = nil; - id intermediateDepth = nil; - BlitArgs slowBlit = args; - BlitArgs finalBlit = args; - - MTLRegion sourceRegionNoOffset = MTLRegionMake3D(0, 0, 0, - args.source.region.size.width, args.source.region.size.height, - args.source.region.size.depth); - - if (blitColor && !(args.destination.color.usage & MTLTextureUsageRenderTarget)) { - intermediateColor = createIntermediateTexture(args.destination.color, args.source.region.size); - slowBlit.destination.color = finalBlit.source.color = intermediateColor; - slowBlit.destination.level = finalBlit.source.level = 0; - slowBlit.destination.slice = finalBlit.source.slice = 0; - slowBlit.destination.region = finalBlit.source.region = sourceRegionNoOffset; - } - if (blitDepth && !(args.destination.depth.usage & MTLTextureUsageRenderTarget)) { - intermediateDepth = createIntermediateTexture(args.destination.depth, args.source.region.size); - slowBlit.destination.depth = finalBlit.source.depth = intermediateDepth; - slowBlit.destination.level = finalBlit.source.level = 0; - slowBlit.destination.slice = finalBlit.source.slice = 0; - slowBlit.destination.region = finalBlit.source.region = sourceRegionNoOffset; - } + // If we end-up here, it means that either: + // - we're resolving a color texture + // - src/dest formats didn't match, or we're scaling -- this can only happen with the legacy + // blit() path and implies that the format is not depth. + // note: in the future we will support a fast-path resolve - blitSlowPath(cmdBuffer, blitColor, blitDepth, slowBlit, label); + UTILS_UNUSED_IN_RELEASE + const bool destinationIsMultisample = + args.destination.texture.textureType == MTLTextureType2DMultisample; - bool finalBlitColor = intermediateColor != nil; - bool finalBlitDepth = intermediateDepth != nil; - blitFastPath(cmdBuffer, finalBlitColor, finalBlitDepth, finalBlit, label); + assert_invariant(!destinationIsMultisample); + assert_invariant((args.destination.texture.usage & MTLTextureUsageRenderTarget)); + blitSlowPath(cmdBuffer, args, label); } -void MetalBlitter::blitFastPath(id cmdBuffer, bool& blitColor, bool& blitDepth, +bool MetalBlitter::blitFastPath(id cmdBuffer, const BlitArgs& args, const char* label) { - if (blitColor) { - if (args.source.color.sampleCount == args.destination.color.sampleCount && - args.source.color.pixelFormat == args.destination.color.pixelFormat && - MTLSizeEqual(args.source.region.size, args.destination.region.size)) { - - id blitEncoder = [cmdBuffer blitCommandEncoder]; - blitEncoder.label = @(label); - [blitEncoder copyFromTexture:args.source.color - sourceSlice:args.source.slice - sourceLevel:args.source.level - sourceOrigin:args.source.region.origin - sourceSize:args.source.region.size - toTexture:args.destination.color - destinationSlice:args.destination.slice - destinationLevel:args.destination.level - destinationOrigin:args.destination.region.origin]; - [blitEncoder endEncoding]; - - blitColor = false; - } - } - if (blitDepth) { - if (args.source.depth.sampleCount == args.destination.depth.sampleCount && - args.source.depth.pixelFormat == args.destination.depth.pixelFormat && - MTLSizeEqual(args.source.region.size, args.destination.region.size)) { - - id blitEncoder = [cmdBuffer blitCommandEncoder]; - blitEncoder.label = @(label); - [blitEncoder copyFromTexture:args.source.depth - sourceSlice:args.source.slice - sourceLevel:args.source.level - sourceOrigin:args.source.region.origin - sourceSize:args.source.region.size - toTexture:args.destination.depth - destinationSlice:args.destination.slice - destinationLevel:args.destination.level - destinationOrigin:args.destination.region.origin]; - [blitEncoder endEncoding]; - - blitDepth = false; - } + if (args.source.texture.sampleCount == args.destination.texture.sampleCount && + args.source.texture.pixelFormat == args.destination.texture.pixelFormat && + MTLSizeEqual(args.source.region.size, args.destination.region.size)) { + + id const blitEncoder = [cmdBuffer blitCommandEncoder]; + blitEncoder.label = @(label); + [blitEncoder copyFromTexture:args.source.texture + sourceSlice:args.source.slice + sourceLevel:args.source.level + sourceOrigin:args.source.region.origin + sourceSize:args.source.region.size + toTexture:args.destination.texture + destinationSlice:args.destination.slice + destinationLevel:args.destination.level + destinationOrigin:args.destination.region.origin]; + [blitEncoder endEncoding]; + + return true; } + return false; } -void MetalBlitter::blitSlowPath(id cmdBuffer, bool& blitColor, bool& blitDepth, +void MetalBlitter::blitSlowPath(id cmdBuffer, const BlitArgs& args, const char* label) { - + // scaling in any dimension is not allowed + assert_invariant(args.source.region.size.depth == args.destination.region.size.depth); + // we're always blitting a single plane uint32_t depthPlaneSource = args.source.region.origin.z; uint32_t depthPlaneDest = args.destination.region.origin.z; - - assert_invariant(args.source.region.size.depth == args.destination.region.size.depth); - uint32_t depthPlaneCount = args.source.region.size.depth; - for (NSUInteger d = 0; d < depthPlaneCount; d++) { - blitDepthPlane(cmdBuffer, blitColor, blitDepth, args, depthPlaneSource++, depthPlaneDest++, - label); + for (NSUInteger d = 0; d < args.source.region.size.depth; d++) { + blitDepthPlane(cmdBuffer, args, + depthPlaneSource++, depthPlaneDest++, label); } - - blitColor = false; - blitDepth = false; } -void MetalBlitter::blitDepthPlane(id cmdBuffer, bool blitColor, bool blitDepth, - const BlitArgs& args, uint32_t depthPlaneSource, uint32_t depthPlaneDest, - const char* label) { - MTLRenderPassDescriptor* descriptor = [MTLRenderPassDescriptor renderPassDescriptor]; +void MetalBlitter::blitDepthPlane(id cmdBuffer, const BlitArgs& args, + uint32_t depthPlaneSource, uint32_t depthPlaneDest, const char* label) { - if (blitColor) { - setupColorAttachment(args, descriptor, depthPlaneDest); - } + MTLRenderPassDescriptor* const descriptor = [MTLRenderPassDescriptor renderPassDescriptor]; - if (blitDepth) { - setupDepthAttachment(args, descriptor, depthPlaneDest); - } + setupAttachment(descriptor.colorAttachments[0], args, depthPlaneDest); - id encoder = [cmdBuffer renderCommandEncoderWithDescriptor:descriptor]; + id const encoder = + [cmdBuffer renderCommandEncoderWithDescriptor:descriptor]; encoder.label = @(label); BlitFunctionKey key; - key.blitColor = blitColor; - key.blitDepth = blitDepth; - key.msaaColorSource = blitColor && args.source.color.textureType == MTLTextureType2DMultisample; - key.msaaDepthSource = blitDepth && args.source.depth.textureType == MTLTextureType2DMultisample; - key.sources3D = blitColor && args.source.color.textureType == MTLTextureType3D; - if (key.sources3D && blitDepth) { - assert_invariant(args.source.depth.textureType == MTLTextureType3D); - } - id fragmentFunction = getBlitFragmentFunction(key); + key.msaaColorSource = args.source.texture.textureType == MTLTextureType2DMultisample; + key.sources3D = args.source.texture.textureType == MTLTextureType3D; + id const fragmentFunction = getBlitFragmentFunction(key); - MetalPipelineState pipelineState { + MetalPipelineState const pipelineState { .vertexFunction = getBlitVertexFunction(), .fragmentFunction = fragmentFunction, .vertexDescription = {}, .colorAttachmentPixelFormat = { - blitColor ? args.destination.color.pixelFormat : MTLPixelFormatInvalid, + args.destination.texture.pixelFormat, MTLPixelFormatInvalid, MTLPixelFormatInvalid, MTLPixelFormatInvalid, @@ -319,31 +202,21 @@ MTLPixelFormatInvalid, MTLPixelFormatInvalid }, - .depthAttachmentPixelFormat = - blitDepth ? args.destination.depth.pixelFormat : MTLPixelFormatInvalid, + .depthAttachmentPixelFormat = MTLPixelFormatInvalid, .sampleCount = 1, .blendState = {} }; - id pipeline = mContext.pipelineStateCache.getOrCreateState(pipelineState); + id const pipeline = + mContext.pipelineStateCache.getOrCreateState(pipelineState); [encoder setRenderPipelineState:pipeline]; // For texture arrays, create a view of the texture at the given slice (layer). - id srcTextureColor = args.source.color; + + id srcTextureColor = args.source.texture; if (srcTextureColor && srcTextureColor.textureType == MTLTextureType2DArray) { srcTextureColor = createTextureViewWithSingleSlice(srcTextureColor, args.source.slice); } - id srcTextureDepth = args.source.depth; - if (srcTextureDepth && srcTextureDepth.textureType == MTLTextureType2DArray) { - srcTextureDepth = createTextureViewWithSingleSlice(srcTextureDepth, args.source.slice); - } - - if (blitColor) { - [encoder setFragmentTexture:srcTextureColor atIndex:0]; - } - - if (blitDepth) { - [encoder setFragmentTexture:srcTextureDepth atIndex:1]; - } + [encoder setFragmentTexture:srcTextureColor atIndex:0]; SamplerMinFilter filterMin = SamplerMinFilter::NEAREST_MIPMAP_NEAREST; if (args.filter == SamplerMagFilter::NEAREST) { @@ -352,13 +225,13 @@ filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST; } - SamplerState s { + SamplerState const s { .samplerParams = { .filterMag = args.filter, .filterMin = filterMin } }; - id sampler = mContext.samplerStateCache.getOrCreateState(s); + id const sampler = mContext.samplerStateCache.getOrCreateState(s); [encoder setFragmentSamplerState:sampler atIndex:0]; MTLViewport viewport; @@ -370,11 +243,11 @@ viewport.zfar = 1.0; [encoder setViewport:viewport]; - DepthStencilState depthStencilState { + DepthStencilState const depthStencilState { .depthCompare = MTLCompareFunctionAlways, - .depthWriteEnabled = blitDepth + .depthWriteEnabled = false }; - id depthStencil = + id const depthStencil = mContext.depthStencilStateCache.getOrCreateState(depthStencilState); [encoder setDepthStencilState:depthStencil]; @@ -410,80 +283,42 @@ [encoder endEncoding]; } -id MetalBlitter::createIntermediateTexture(id t, MTLSize size) { - MTLTextureDescriptor* descriptor = [MTLTextureDescriptor new]; - descriptor.textureType = size.depth == 1 ? MTLTextureType2D : MTLTextureType3D; - descriptor.pixelFormat = t.pixelFormat; - descriptor.width = size.width; - descriptor.height = size.height; - descriptor.depth = size.depth; - descriptor.usage = t.usage & MTLTextureUsageRenderTarget; - return [mContext.device newTextureWithDescriptor:descriptor]; -} - void MetalBlitter::shutdown() noexcept { mBlitFunctions.clear(); mVertexFunction = nil; } -void MetalBlitter::setupColorAttachment(const BlitArgs& args, - MTLRenderPassDescriptor* descriptor, uint32_t depthPlane) { - descriptor.colorAttachments[0].texture = args.destination.color; - descriptor.colorAttachments[0].level = args.destination.level; - descriptor.colorAttachments[0].slice = args.destination.slice; - descriptor.colorAttachments[0].depthPlane = depthPlane; - - descriptor.colorAttachments[0].loadAction = MTLLoadActionLoad; +void MetalBlitter::setupAttachment(MTLRenderPassAttachmentDescriptor* descriptor, + const BlitArgs& args, uint32_t depthPlane) { + descriptor.texture = args.destination.texture; + descriptor.level = args.destination.level; + descriptor.slice = args.destination.slice; + descriptor.depthPlane = depthPlane; + descriptor.loadAction = MTLLoadActionLoad; // We don't need to load the contents of the attachment if we're blitting over all of it. - if (args.colorDestinationIsFullAttachment()) { - descriptor.colorAttachments[0].loadAction = MTLLoadActionDontCare; + if (args.destinationIsFullAttachment()) { + descriptor.loadAction = MTLLoadActionDontCare; } - - descriptor.colorAttachments[0].storeAction = MTLStoreActionStore; -} - -void MetalBlitter::setupDepthAttachment(const BlitArgs& args, MTLRenderPassDescriptor* descriptor, - uint32_t depthPlane) { - descriptor.depthAttachment.texture = args.destination.depth; - descriptor.depthAttachment.level = args.destination.level; - descriptor.depthAttachment.slice = args.destination.slice; - descriptor.depthAttachment.depthPlane = depthPlane; - - descriptor.depthAttachment.loadAction = MTLLoadActionLoad; - // We don't need to load the contents of the attachment if we're blitting over all of it. - if (args.depthDestinationIsFullAttachment()) { - descriptor.depthAttachment.loadAction = MTLLoadActionDontCare; - } - - descriptor.depthAttachment.storeAction = MTLStoreActionStore; + descriptor.storeAction = MTLStoreActionStore; } -id MetalBlitter::compileFragmentFunction(BlitFunctionKey key) { - MTLCompileOptions* options = [MTLCompileOptions new]; - NSMutableDictionary* macros = [NSMutableDictionary dictionary]; - if (key.blitColor) { - macros[@"BLIT_COLOR"] = @"1"; - } - if (key.blitDepth) { - macros[@"BLIT_DEPTH"] = @"1"; - } +id MetalBlitter::compileFragmentFunction(BlitFunctionKey key) const { + MTLCompileOptions* const options = [MTLCompileOptions new]; + NSMutableDictionary* const macros = [NSMutableDictionary dictionary]; if (key.msaaColorSource) { macros[@"MSAA_COLOR_SOURCE"] = @"1"; } - if (key.msaaDepthSource) { - macros[@"MSAA_DEPTH_SOURCE"] = @"1"; - } if (key.sources3D) { macros[@"SOURCES_3D"] = @"1"; } options.preprocessorMacros = macros; - NSString* objcSource = [NSString stringWithCString:functionLibrary - encoding:NSUTF8StringEncoding]; + NSString* const objcSource = [NSString stringWithCString:functionLibrary + encoding:NSUTF8StringEncoding]; NSError* error = nil; - id library = [mContext.device newLibraryWithSource:objcSource - options:options - error:&error]; - id function = [library newFunctionWithName:@"blitterFrag"]; + id const library = [mContext.device newLibraryWithSource:objcSource + options:options + error:&error]; + id const function = [library newFunctionWithName:@"blitterFrag"]; if (!library || !function) { if (error) { @@ -491,7 +326,8 @@ utils::slog.e << description << utils::io::endl; } } - ASSERT_POSTCONDITION(library && function, "Unable to compile fragment shader for MetalBlitter."); + FILAMENT_CHECK_POSTCONDITION(library && function) + << "Unable to compile fragment shader for MetalBlitter."; return function; } @@ -501,13 +337,14 @@ return mVertexFunction; } - NSString* objcSource = [NSString stringWithCString:functionLibrary - encoding:NSUTF8StringEncoding]; + NSString* const objcSource = [NSString stringWithCString:functionLibrary + encoding:NSUTF8StringEncoding]; NSError* error = nil; - id library = [mContext.device newLibraryWithSource:objcSource - options:nil - error:&error]; - id function = [library newFunctionWithName:@"blitterVertex"]; + id const library = [mContext.device newLibraryWithSource:objcSource + options:nil + error:&error]; + + id const function = [library newFunctionWithName:@"blitterVertex"]; if (!library || !function) { if (error) { @@ -515,7 +352,8 @@ utils::slog.e << description << utils::io::endl; } } - ASSERT_POSTCONDITION(library && function, "Unable to compile vertex shader for MetalBlitter."); + FILAMENT_CHECK_POSTCONDITION(library && function) + << "Unable to compile vertex shader for MetalBlitter."; mVertexFunction = function; @@ -535,5 +373,5 @@ return function; } -} // namespace backend -} // namespace filament +} // namespace filament::backend + diff --git a/filament/backend/src/metal/MetalBuffer.h b/filament/backend/src/metal/MetalBuffer.h index 4baccffc2ce..ec724a9f0bd 100644 --- a/filament/backend/src/metal/MetalBuffer.h +++ b/filament/backend/src/metal/MetalBuffer.h @@ -18,7 +18,7 @@ #define TNT_FILAMENT_DRIVER_METALBUFFER_H #include "MetalContext.h" -#include "MetalBufferPool.h" +#include "MetalPlatform.h" #include @@ -28,9 +28,134 @@ #include #include +#include +#include namespace filament::backend { +class ScopedAllocationTimer { +public: + ScopedAllocationTimer(const char* name) : mBeginning(clock_t::now()), mName(name) {} + ~ScopedAllocationTimer() { + using namespace std::literals::chrono_literals; + static constexpr std::chrono::seconds LONG_TIME_THRESHOLD = 10s; + + auto end = clock_t::now(); + std::chrono::duration allocationTimeMicroseconds = end - mBeginning; + + if (UTILS_UNLIKELY(allocationTimeMicroseconds > LONG_TIME_THRESHOLD)) { + if (platform && platform->hasDebugUpdateStatFunc()) { + char buffer[64]; + snprintf(buffer, sizeof(buffer), "filament.metal.long_buffer_allocation_time.%s", + mName); + platform->debugUpdateStat( + buffer, static_cast(allocationTimeMicroseconds.count())); + } + } + } + + static void setPlatform(MetalPlatform* p) { platform = p; } + +private: + typedef std::chrono::steady_clock clock_t; + + static MetalPlatform* platform; + + std::chrono::time_point mBeginning; + const char* mName; +}; + +class TrackedMetalBuffer { +public: + + static constexpr size_t EXCESS_BUFFER_COUNT = 30000; + + enum class Type { + NONE = 0, + GENERIC = 1, + RING = 2, // deprecated + STAGING = 3, + DESCRIPTOR_SET = 4, + }; + static constexpr size_t TypeCount = 4; + + static constexpr auto toIndex(Type t) { + assert_invariant(t != Type::NONE); + switch (t) { + case Type::NONE: + case Type::GENERIC: + return 0; + case Type::RING: + return 1; + case Type::STAGING: + return 2; + case Type::DESCRIPTOR_SET: + return 3; + } + } + + TrackedMetalBuffer() noexcept : mBuffer(nil) {} + TrackedMetalBuffer(nullptr_t) noexcept : mBuffer(nil) {} + TrackedMetalBuffer(id buffer, Type type) : mBuffer(buffer), mType(type) { + assert_invariant(type != Type::NONE); + if (buffer) { + aliveBuffers[toIndex(type)]++; + mType = type; + if (getAliveBuffers() >= EXCESS_BUFFER_COUNT) { + if (platform && platform->hasDebugUpdateStatFunc()) { + platform->debugUpdateStat("filament.metal.excess_buffers_allocated", + TrackedMetalBuffer::getAliveBuffers()); + } + } + } + } + + ~TrackedMetalBuffer() { + if (mBuffer) { + assert_invariant(mType != Type::NONE); + aliveBuffers[toIndex(mType)]--; + } + } + + TrackedMetalBuffer(TrackedMetalBuffer&&) = delete; + TrackedMetalBuffer(TrackedMetalBuffer const&) = delete; + TrackedMetalBuffer& operator=(TrackedMetalBuffer const&) = delete; + + TrackedMetalBuffer& operator=(TrackedMetalBuffer&& rhs) noexcept { + swap(rhs); + return *this; + } + + id get() const noexcept { return mBuffer; } + operator bool() const noexcept { return bool(mBuffer); } + + static uint64_t getAliveBuffers() { + uint64_t sum = 0; + for (const auto& v : aliveBuffers) { + sum += v; + } + return sum; + } + + static uint64_t getAliveBuffers(Type type) { + assert_invariant(type != Type::NONE); + return aliveBuffers[toIndex(type)]; + } + static void setPlatform(MetalPlatform* p) { platform = p; } + +private: + void swap(TrackedMetalBuffer& other) noexcept { + std::swap(mBuffer, other.mBuffer); + std::swap(mType, other.mType); + } + + id mBuffer; + Type mType = Type::NONE; + + static MetalPlatform* platform; + static std::array aliveBuffers; +}; + class MetalBuffer { public: @@ -38,6 +163,8 @@ class MetalBuffer { size_t size, bool forceGpuBuffer = false); ~MetalBuffer(); + [[nodiscard]] bool wasAllocationSuccessful() const noexcept { return mBuffer || mCpuBuffer; } + MetalBuffer(const MetalBuffer& rhs) = delete; MetalBuffer& operator=(const MetalBuffer& rhs) = delete; @@ -47,8 +174,10 @@ class MetalBuffer { * Update the buffer with data inside src. Potentially allocates a new buffer allocation to hold * the bytes which will be released when the current frame is finished. */ - void copyIntoBuffer(void* src, size_t size, size_t byteOffset); - void copyIntoBufferUnsynchronized(void* src, size_t size, size_t byteOffset); + using TagResolver = utils::Invocable; + void copyIntoBuffer(void* src, size_t size, size_t byteOffset, TagResolver&& getHandleTag); + void copyIntoBufferUnsynchronized( + void* src, size_t size, size_t byteOffset, TagResolver&& getHandleTag); /** * Denotes that this buffer is used for a draw call ensuring that its allocation remains valid @@ -58,7 +187,7 @@ class MetalBuffer { * is no device allocation. * */ - id getGpuBufferForDraw(id cmdBuffer) noexcept; + id getGpuBufferForDraw() noexcept; void* getCpuBuffer() const noexcept { return mCpuBuffer; } @@ -82,7 +211,18 @@ class MetalBuffer { private: - id mBuffer = nil; + enum class UploadStrategy { + POOL, + BUMP_ALLOCATOR, + }; + + void uploadWithPoolBuffer( + void* src, size_t size, size_t byteOffset, TagResolver&& getHandleTag) const; + void uploadWithBumpAllocator( + void* src, size_t size, size_t byteOffset, TagResolver&& getHandleTag) const; + + UploadStrategy mUploadStrategy; + TrackedMetalBuffer mBuffer; size_t mBufferSize = 0; void* mCpuBuffer = nullptr; MetalContext& mContext; @@ -110,7 +250,7 @@ class MetalRingBuffer { // In practice, MetalRingBuffer is used for argument buffers, which are kept in the constant // address space. Constant buffers have specific alignment requirements when specifying an // offset. -#if defined(IOS) +#if defined(FILAMENT_IOS) #if TARGET_OS_SIMULATOR // The iOS simulator has differing alignment requirements. static constexpr auto METAL_CONSTANT_BUFFER_OFFSET_ALIGNMENT = 256; @@ -131,7 +271,9 @@ class MetalRingBuffer { mBufferOptions(options), mSlotSizeBytes(computeSlotSize(layout)), mSlotCount(slotCount) { - mBuffer = [device newBufferWithLength:mSlotSizeBytes * mSlotCount options:mBufferOptions]; + ScopedAllocationTimer timer("ring"); + mBuffer = { [device newBufferWithLength:mSlotSizeBytes * mSlotCount options:mBufferOptions], + TrackedMetalBuffer::Type::RING }; assert_invariant(mBuffer); } @@ -149,9 +291,13 @@ class MetalRingBuffer { // If we already have an aux buffer, it will get freed here, unless it has been retained // by a MTLCommandBuffer. In that case, it will be freed when the command buffer // finishes executing. - mAuxBuffer = [mDevice newBufferWithLength:mSlotSizeBytes options:mBufferOptions]; + { + ScopedAllocationTimer timer("ring"); + mAuxBuffer = { [mDevice newBufferWithLength:mSlotSizeBytes options:mBufferOptions], + TrackedMetalBuffer::Type::RING }; + } assert_invariant(mAuxBuffer); - return {mAuxBuffer, 0}; + return { mAuxBuffer.get(), 0 }; } mCurrentSlot = (mCurrentSlot + 1) % mSlotCount; mOccupiedSlots->fetch_add(1, std::memory_order_relaxed); @@ -180,9 +326,9 @@ class MetalRingBuffer { */ std::pair, NSUInteger> getCurrentAllocation() const { if (UTILS_UNLIKELY(mAuxBuffer)) { - return { mAuxBuffer, 0 }; + return { mAuxBuffer.get(), 0 }; } - return { mBuffer, mCurrentSlot * mSlotSizeBytes }; + return { mBuffer.get(), mCurrentSlot * mSlotSizeBytes }; } bool canAccomodateLayout(MTLSizeAndAlign layout) const { @@ -191,8 +337,8 @@ class MetalRingBuffer { private: id mDevice; - id mBuffer; - id mAuxBuffer; + TrackedMetalBuffer mBuffer; + TrackedMetalBuffer mAuxBuffer; MTLResourceOptions mBufferOptions; diff --git a/filament/backend/src/metal/MetalBuffer.mm b/filament/backend/src/metal/MetalBuffer.mm index 4b04e4d5c84..6347ab70c6f 100644 --- a/filament/backend/src/metal/MetalBuffer.mm +++ b/filament/backend/src/metal/MetalBuffer.mm @@ -15,27 +15,49 @@ */ #include "MetalBuffer.h" +#include "MetalBufferPool.h" #include "MetalContext.h" namespace filament { namespace backend { +std::array TrackedMetalBuffer::aliveBuffers = { 0 }; +MetalPlatform* TrackedMetalBuffer::platform = nullptr; +MetalPlatform* ScopedAllocationTimer::platform = nullptr; + MetalBuffer::MetalBuffer(MetalContext& context, BufferObjectBinding bindingType, BufferUsage usage, - size_t size, bool forceGpuBuffer) : mBufferSize(size), mContext(context) { + size_t size, bool forceGpuBuffer) + : mBufferSize(size), mContext(context) { + const MetalBumpAllocator& allocator = *mContext.bumpAllocator; + // VERTEX is also used for index buffers + if (allocator.getCapacity() > 0 && bindingType == BufferObjectBinding::VERTEX) { + mUploadStrategy = UploadStrategy::BUMP_ALLOCATOR; + } else { + mUploadStrategy = UploadStrategy::POOL; + } + // If the buffer is less than 4K in size and is updated frequently, we don't use an explicit // buffer. Instead, we use immediate command encoder methods like setVertexBytes:length:atIndex:. // This won't work for SSBOs, since they are read/write. + + /* if (size <= 4 * 1024 && bindingType != BufferObjectBinding::SHADER_STORAGE && usage == BufferUsage::DYNAMIC && !forceGpuBuffer) { mBuffer = nil; mCpuBuffer = malloc(size); return; } + */ // Otherwise, we allocate a private GPU buffer. - mBuffer = [context.device newBufferWithLength:size options:MTLResourceStorageModePrivate]; - ASSERT_POSTCONDITION(mBuffer, "Could not allocate Metal buffer of size %zu.", size); + { + ScopedAllocationTimer timer("generic"); + mBuffer = { [context.device newBufferWithLength:size options:MTLResourceStorageModePrivate], + TrackedMetalBuffer::Type::GENERIC }; + } + // mBuffer might fail to be allocated. Clients can check for this by calling + // wasAllocationSuccessful(). } MetalBuffer::~MetalBuffer() { @@ -44,56 +66,51 @@ } } -void MetalBuffer::copyIntoBuffer(void* src, size_t size, size_t byteOffset) { +void MetalBuffer::copyIntoBuffer( + void* src, size_t size, size_t byteOffset, TagResolver&& getHandleTag) { if (size <= 0) { return; } - ASSERT_PRECONDITION(size + byteOffset <= mBufferSize, - "Attempting to copy %zu bytes into a buffer of size %zu at offset %zu", - size, mBufferSize, byteOffset); - // Either copy into the Metal buffer or into our cpu buffer. + FILAMENT_CHECK_PRECONDITION(src) + << "copyIntoBuffer called with a null src, tag=" << getHandleTag(); + FILAMENT_CHECK_PRECONDITION(size + byteOffset <= mBufferSize) + << "Attempting to copy " << size << " bytes into a buffer of size " << mBufferSize + << " at offset " << byteOffset << ", tag=" << getHandleTag(); + // The copy blit requires that byteOffset be a multiple of 4. + FILAMENT_CHECK_PRECONDITION(!(byteOffset & 0x3)) + << "byteOffset must be a multiple of 4, tag=" << getHandleTag(); + + // If we have a cpu buffer, we can directly copy into it. if (mCpuBuffer) { memcpy(static_cast(mCpuBuffer) + byteOffset, src, size); return; } - // Acquire a staging buffer to hold the contents of this update. - MetalBufferPool* bufferPool = mContext.bufferPool; - const MetalBufferPoolEntry* const staging = bufferPool->acquireBuffer(size); - memcpy(staging->buffer.contents, src, size); - - // The blit below requires that byteOffset be a multiple of 4. - ASSERT_PRECONDITION(!(byteOffset & 0x3u), "byteOffset must be a multiple of 4"); - - // Encode a blit from the staging buffer into the private GPU buffer. - id cmdBuffer = getPendingCommandBuffer(&mContext); - id blitEncoder = [cmdBuffer blitCommandEncoder]; - blitEncoder.label = @"Buffer upload blit"; - [blitEncoder copyFromBuffer:staging->buffer - sourceOffset:0 - toBuffer:mBuffer - destinationOffset:byteOffset - size:size]; - [blitEncoder endEncoding]; - [cmdBuffer addCompletedHandler:^(id cb) { - bufferPool->releaseBuffer(staging); - }]; + switch (mUploadStrategy) { + case UploadStrategy::BUMP_ALLOCATOR: + uploadWithBumpAllocator(src, size, byteOffset, std::move(getHandleTag)); + break; + case UploadStrategy::POOL: + uploadWithPoolBuffer(src, size, byteOffset, std::move(getHandleTag)); + break; + } } -void MetalBuffer::copyIntoBufferUnsynchronized(void* src, size_t size, size_t byteOffset) { +void MetalBuffer::copyIntoBufferUnsynchronized( + void* src, size_t size, size_t byteOffset, TagResolver&& getHandleTag) { // TODO: implement the unsynchronized version - copyIntoBuffer(src, size, byteOffset); + copyIntoBuffer(src, size, byteOffset, std::move(getHandleTag)); } -id MetalBuffer::getGpuBufferForDraw(id cmdBuffer) noexcept { +id MetalBuffer::getGpuBufferForDraw() noexcept { // If there's a CPU buffer, then we return nil here, as the CPU-side buffer will be bound // separately. if (mCpuBuffer) { return nil; } assert_invariant(mBuffer); - return mBuffer; + return mBuffer.get(); } void MetalBuffer::bindBuffers(id cmdBuffer, id encoder, @@ -129,7 +146,7 @@ } // getGpuBufferForDraw() might return nil, which means there isn't a device allocation for // this buffer. In this case, we'll bind the buffer below with the CPU-side memory. - id gpuBuffer = buffer->getGpuBufferForDraw(cmdBuffer); + id gpuBuffer = buffer->getGpuBufferForDraw(); if (!gpuBuffer) { continue; } @@ -189,5 +206,54 @@ } } +void MetalBuffer::uploadWithPoolBuffer( + void* src, size_t size, size_t byteOffset, TagResolver&& getHandleTag) const { + MetalBufferPool* bufferPool = mContext.bufferPool; + const MetalBufferPoolEntry* const staging = bufferPool->acquireBuffer(size); + FILAMENT_CHECK_POSTCONDITION(staging) + << "uploadWithPoolbuffer unable to acquire staging buffer of size " << size + << ", tag=" << getHandleTag(); + memcpy(staging->buffer.get().contents, src, size); + + // Encode a blit from the staging buffer into the private GPU buffer. + id cmdBuffer = getPendingCommandBuffer(&mContext); + id blitEncoder = [cmdBuffer blitCommandEncoder]; + blitEncoder.label = @"Buffer upload blit - pool buffer"; + [blitEncoder copyFromBuffer:staging->buffer.get() + sourceOffset:0 + toBuffer:mBuffer.get() + destinationOffset:byteOffset + size:size]; + [blitEncoder endEncoding]; + [cmdBuffer addCompletedHandler:^(id cb) { + bufferPool->releaseBuffer(staging); + }]; +} + +void MetalBuffer::uploadWithBumpAllocator( + void* src, size_t size, size_t byteOffset, TagResolver&& getHandleTag) const { + MetalBumpAllocator& allocator = *mContext.bumpAllocator; + auto [buffer, offset] = allocator.allocateStagingArea(size); + FILAMENT_CHECK_POSTCONDITION(buffer) + << "uploadWithBumpAllocator unable to acquire staging area of size " << size + << ", tag=" << getHandleTag(); + void* const contents = buffer.contents; + FILAMENT_CHECK_POSTCONDITION(contents) + << "uploadWithBumpAllocator unable to acquire pointer to staging area, size " << size + << ", tag=" << getHandleTag(); + memcpy(static_cast(contents) + offset, src, size); + + // Encode a blit from the staging buffer into the private GPU buffer. + id cmdBuffer = getPendingCommandBuffer(&mContext); + id blitEncoder = [cmdBuffer blitCommandEncoder]; + blitEncoder.label = @"Buffer upload blit - bump allocator"; + [blitEncoder copyFromBuffer:buffer + sourceOffset:offset + toBuffer:mBuffer.get() + destinationOffset:byteOffset + size:size]; + [blitEncoder endEncoding]; +} + } // namespace backend } // namespace filament diff --git a/filament/backend/src/metal/MetalBufferPool.h b/filament/backend/src/metal/MetalBufferPool.h index 2f494ba9974..770527e092a 100644 --- a/filament/backend/src/metal/MetalBufferPool.h +++ b/filament/backend/src/metal/MetalBufferPool.h @@ -19,6 +19,8 @@ #include +#include "MetalBuffer.h" + #include #include #include @@ -30,12 +32,34 @@ struct MetalContext; // Immutable POD representing a shared CPU-GPU buffer. struct MetalBufferPoolEntry { - id buffer; + TrackedMetalBuffer buffer; size_t capacity; mutable uint64_t lastAccessed; mutable uint32_t referenceCount; }; +class MetalBumpAllocator { +public: + MetalBumpAllocator(id device, size_t capacity); + + /** + * Allocates a staging area of the given size. Returns a pair of the buffer and the offset + * within the buffer. The buffer is guaranteed to be at least the given size, but may be larger. + * Clients must not write to the buffer beyond the returned offset + size. + * Clients are responsible for holding a reference to the returned buffer. + * Allocations are guaranteed to be aligned to 4 bytes. + */ + std::pair, size_t> allocateStagingArea(size_t size); + + size_t getCapacity() const noexcept { return mCapacity; } + +private: + id mDevice; + TrackedMetalBuffer mCurrentUploadBuffer = nil; + size_t mHead = 0; + size_t mCapacity; +}; + // Manages a pool of Metal buffers, periodically releasing ones that have been unused for awhile. class MetalBufferPool { public: @@ -73,7 +97,10 @@ class MetalBufferPool { std::unordered_set mUsedStages; // Store the current "time" (really just a frame count) and LRU eviction parameters. - uint64_t mCurrentFrame = 0; + // An atomic is necessary as mCurrentFrame is incremented in gc() (called on + // the driver thread) and read from acquireBuffer() and releaseBuffer(), + // which may be called on non-driver threads. + std::atomic mCurrentFrame = 0; static constexpr uint32_t TIME_BEFORE_EVICTION = 10; }; diff --git a/filament/backend/src/metal/MetalBufferPool.mm b/filament/backend/src/metal/MetalBufferPool.mm index ce29b4222fb..837d4c4d130 100644 --- a/filament/backend/src/metal/MetalBufferPool.mm +++ b/filament/backend/src/metal/MetalBufferPool.mm @@ -19,6 +19,7 @@ #include "MetalContext.h" #include +#include #include #include @@ -41,15 +42,20 @@ } // We were not able to find a sufficiently large stage, so create a new one. - id buffer = [mContext.device newBufferWithLength:numBytes - options:MTLResourceStorageModeShared]; - ASSERT_POSTCONDITION(buffer, "Could not allocate Metal staging buffer of size %zu.", numBytes); - MetalBufferPoolEntry* stage = new MetalBufferPoolEntry({ - .buffer = buffer, + id buffer = nil; + { + ScopedAllocationTimer timer("staging"); + buffer = [mContext.device newBufferWithLength:numBytes + options:MTLResourceStorageModeShared]; + } + FILAMENT_CHECK_POSTCONDITION(buffer) + << "Could not allocate Metal staging buffer of size " << numBytes << "."; + MetalBufferPoolEntry* stage = new MetalBufferPoolEntry { + .buffer = { buffer, TrackedMetalBuffer::Type::STAGING }, .capacity = numBytes, .lastAccessed = mCurrentFrame, .referenceCount = 1 - }); + }; mUsedStages.insert(stage); return stage; @@ -110,5 +116,39 @@ mFreeStages.clear(); } +MetalBumpAllocator::MetalBumpAllocator(id device, size_t capacity) + : mDevice(device), mCapacity(capacity) { + if (mCapacity > 0) { + mCurrentUploadBuffer = { [device newBufferWithLength:capacity options:MTLStorageModeShared], + TrackedMetalBuffer::Type::STAGING }; + } +} + +std::pair, size_t> MetalBumpAllocator::allocateStagingArea(size_t size) { + if (size == 0) { + return { nil, 0 }; + } + if (size > mCapacity) { + return { [mDevice newBufferWithLength:size options:MTLStorageModeShared], 0 }; + } + assert_invariant(mCurrentUploadBuffer); + + // Align the head to a 4-byte boundary. + mHead = (mHead + 3) & ~3; + + if (UTILS_LIKELY(mHead + size <= mCapacity)) { + const size_t oldHead = mHead; + mHead += size; + return { mCurrentUploadBuffer.get(), oldHead }; + } + + // We're finished with the current allocation. + mCurrentUploadBuffer = { [mDevice newBufferWithLength:mCapacity options:MTLStorageModeShared], + TrackedMetalBuffer::Type::STAGING }; + mHead = size; + + return { mCurrentUploadBuffer.get(), 0 }; +} + } // namespace backend } // namespace filament diff --git a/filament/backend/src/metal/MetalContext.h b/filament/backend/src/metal/MetalContext.h index 097659094b1..f85e08545bf 100644 --- a/filament/backend/src/metal/MetalContext.h +++ b/filament/backend/src/metal/MetalContext.h @@ -18,12 +18,17 @@ #define TNT_METALCONTEXT_H #include "MetalResourceTracker.h" +#include "MetalShaderCompiler.h" #include "MetalState.h" +#include + #include #include #include +#include + #include #include #include @@ -41,24 +46,88 @@ namespace backend { class MetalDriver; class MetalBlitter; class MetalBufferPool; +class MetalBumpAllocator; class MetalRenderTarget; -class MetalSamplerGroup; class MetalSwapChain; class MetalTexture; class MetalTimerQueryInterface; struct MetalUniformBuffer; struct MetalIndexBuffer; struct MetalVertexBuffer; +struct MetalDescriptorSet; constexpr static uint8_t MAX_SAMPLE_COUNT = 8; // Metal devices support at most 8 MSAA samples +class MetalPushConstantBuffer { +public: + void setPushConstant(PushConstantVariant value, uint8_t index); + bool isDirty() const { return mDirty; } + void setBytes(id encoder, ShaderStage stage); + void clear(); + +private: + std::vector mPushConstants; + bool mDirty = false; +}; + +class MetalDynamicOffsets { +public: + void setOffsets(uint32_t set, const uint32_t* offsets, uint32_t count) { + assert(set < MAX_DESCRIPTOR_SET_COUNT); + + auto getStartIndexForSet = [&](uint32_t s) { + uint32_t startIndex = 0; + for (uint32_t i = 0; i < s; i++) { + startIndex += mCounts[i]; + } + return startIndex; + }; + + const bool resizeNecessary = mCounts[set] != count; + if (UTILS_UNLIKELY(resizeNecessary)) { + int delta = count - mCounts[set]; + + auto thisSetStart = mOffsets.begin() + getStartIndexForSet(set); + if (delta > 0) { + mOffsets.insert(thisSetStart, delta, 0); + } else { + mOffsets.erase(thisSetStart, thisSetStart - delta); + } + + mCounts[set] = count; + } + + if (resizeNecessary || + !std::equal( + offsets, offsets + count, mOffsets.begin() + getStartIndexForSet(set))) { + std::copy(offsets, offsets + count, mOffsets.begin() + getStartIndexForSet(set)); + mDirty = true; + } + } + bool isDirty() const { return mDirty; } + void setDirty(bool dirty) { mDirty = dirty; } + + std::pair getOffsets() const { + return { mOffsets.size(), mOffsets.data() }; + } + +private: + std::array mCounts = { 0 }; + std::vector mOffsets; + bool mDirty = false; +}; + struct MetalContext { MetalDriver* driver; id device = nullptr; id commandQueue = nullptr; - id pendingCommandBuffer = nullptr; - id currentRenderPassEncoder = nullptr; + // The ID of pendingCommandBuffer (or the next command buffer, if pendingCommandBuffer is nil). + uint64_t pendingCommandBufferId = 1; + // read from driver thread, set from completion handlers + std::atomic latestCompletedCommandBufferId = 0; + id pendingCommandBuffer = nil; + id currentRenderPassEncoder = nil; std::atomic memorylessLimitsReached = false; @@ -66,6 +135,7 @@ struct MetalContext { bool supportsTextureSwizzling = false; bool supportsAutoDepthResolve = false; bool supportsMemorylessRenderTargets = false; + bool supportsDepthClamp = false; uint8_t maxColorRenderTargets = 4; struct { uint8_t common; @@ -73,6 +143,10 @@ struct MetalContext { uint8_t mac; } highestSupportedGpuFamily; + struct { + bool staticTextureTargetError; + } bugs; + // sampleCountLookup[requestedSamples] gives a <= sample count supported by the device. std::array sampleCountLookup; @@ -81,14 +155,16 @@ struct MetalContext { RenderPassFlags currentRenderPassFlags; MetalRenderTarget* currentRenderTarget = nullptr; + bool validPipelineBound = false; // State trackers. PipelineStateTracker pipelineState; DepthStencilStateTracker depthStencilState; - std::array uniformState; - std::array ssboState; CullModeStateTracker cullModeState; WindingStateTracker windingState; + DepthClampStateTracker depthClampState; + ScissorRectStateTracker scissorRectState; + Handle currentRenderPrimitive; // State caches. DepthStencilStateCache depthStencilStateCache; @@ -98,16 +174,21 @@ struct MetalContext { PolygonOffset currentPolygonOffset = {0.0f, 0.0f}; - MetalSamplerGroup* samplerBindings[Program::SAMPLER_BINDING_COUNT] = {}; + std::array currentPushConstants; - // Keeps track of sampler groups we've finalized for the current render pass. - tsl::robin_set finalizedSamplerGroups; + // Keeps track of descriptor sets we've finalized for the current render pass. + tsl::robin_set finalizedDescriptorSets; + std::array currentDescriptorSets = {}; + MetalBufferBindings vertexDescriptorBindings; + MetalBufferBindings fragmentDescriptorBindings; + MetalBufferBindings computeDescriptorBindings; + MetalDynamicOffsets dynamicOffsets; - // Keeps track of all alive sampler groups, textures. - tsl::robin_set samplerGroups; + // Keeps track of all alive textures. tsl::robin_set textures; MetalBufferPool* bufferPool; + MetalBumpAllocator* bumpAllocator; MetalSwapChain* currentDrawSwapChain = nil; MetalSwapChain* currentReadSwapChain = nil; @@ -118,13 +199,17 @@ struct MetalContext { // Empty texture used to prevent GPU errors when a sampler has been bound without a texture. id emptyTexture = nil; + id emptyBuffer = nil; MetalBlitter* blitter = nullptr; // Fences, only supported on macOS 10.14 and iOS 12 and above. API_AVAILABLE(macos(10.14), ios(12.0)) MTLSharedEventListener* eventListener = nil; - uint64_t signalId = 1; + // signalId is incremented in the MetalFence constructor, which is called on + // both the driver (MetalTimerQueryFence::beginTimeElapsedQuery) and main + // threads (in createFenceS), so an atomic is necessary. + std::atomic signalId = 1; MetalTimerQueryInterface* timerQueryImpl; @@ -132,6 +217,8 @@ struct MetalContext { MTLViewport currentViewport; + MetalShaderCompiler* shaderCompiler = nullptr; + #if defined(FILAMENT_METAL_PROFILING) // Logging and profiling. os_log_t log; diff --git a/filament/backend/src/metal/MetalContext.mm b/filament/backend/src/metal/MetalContext.mm index fce98eb5237..465ce293a37 100644 --- a/filament/backend/src/metal/MetalContext.mm +++ b/filament/backend/src/metal/MetalContext.mm @@ -101,9 +101,14 @@ void initializeSupportedGpuFamilies(MetalContext* context) { context->pendingCommandBuffer = [context->commandQueue commandBuffer]; // It's safe for this block to capture the context variable. MetalDriver::terminate will ensure // all frames and their completion handlers finish before context is deallocated. + uint64_t thisCommandBufferId = context->pendingCommandBufferId; [context->pendingCommandBuffer addCompletedHandler:^(id buffer) { context->resourceTracker.clearResources((__bridge void*) buffer); - + + // Command buffers should complete in order, so latestCompletedCommandBufferId will only + // ever increase. + context->latestCompletedCommandBufferId = thisCommandBufferId; + auto errorCode = (MTLCommandBufferError)buffer.error.code; if (@available(macOS 11.0, *)) { if (errorCode == MTLCommandBufferErrorMemoryless) { @@ -113,7 +118,8 @@ void initializeSupportedGpuFamilies(MetalContext* context) { } } }]; - ASSERT_POSTCONDITION(context->pendingCommandBuffer, "Could not obtain command buffer."); + FILAMENT_CHECK_POSTCONDITION(context->pendingCommandBuffer) + << "Could not obtain command buffer."; return context->pendingCommandBuffer; } @@ -124,6 +130,7 @@ void submitPendingCommands(MetalContext* context) { assert_invariant(context->pendingCommandBuffer.status != MTLCommandBufferStatusCommitted); [context->pendingCommandBuffer commit]; context->pendingCommandBuffer = nil; + context->pendingCommandBufferId++; } id getOrCreateEmptyTexture(MetalContext* context) { @@ -153,5 +160,67 @@ bool isInRenderPass(MetalContext* context) { return context->currentRenderPassEncoder != nil; } +void MetalPushConstantBuffer::setPushConstant(PushConstantVariant value, uint8_t index) { + if (mPushConstants.size() <= index) { + mPushConstants.resize(index + 1); + mDirty = true; + } + if (UTILS_LIKELY(mPushConstants[index] != value)) { + mDirty = true; + mPushConstants[index] = value; + } +} + +void MetalPushConstantBuffer::setBytes(id encoder, ShaderStage stage) { + constexpr size_t PUSH_CONSTANT_SIZE_BYTES = 4; + + static char buffer[MAX_PUSH_CONSTANT_COUNT * PUSH_CONSTANT_SIZE_BYTES]; + assert_invariant(mPushConstants.size() <= MAX_PUSH_CONSTANT_COUNT); + + size_t bufferSize = PUSH_CONSTANT_SIZE_BYTES * mPushConstants.size(); + for (size_t i = 0; i < mPushConstants.size(); i++) { + const auto& constant = mPushConstants[i]; + std::visit( + [i](auto arg) { + if constexpr (std::is_same_v) { + // bool push constants are converted to uints in MSL. + // We must ensure we write all the bytes for boolean values to work + // correctly. + uint32_t boolAsUint = arg ? 0x00000001 : 0x00000000; + *(reinterpret_cast(buffer + PUSH_CONSTANT_SIZE_BYTES * i)) = + boolAsUint; + } else { + *(decltype(arg)*)(buffer + PUSH_CONSTANT_SIZE_BYTES * i) = arg; + } + }, + constant); + } + + switch (stage) { + case ShaderStage::VERTEX: + [(id)encoder setVertexBytes:buffer + length:bufferSize + atIndex:PUSH_CONSTANT_BUFFER_INDEX]; + break; + case ShaderStage::FRAGMENT: + [(id)encoder setFragmentBytes:buffer + length:bufferSize + atIndex:PUSH_CONSTANT_BUFFER_INDEX]; + break; + case ShaderStage::COMPUTE: + [(id)encoder setBytes:buffer + length:bufferSize + atIndex:PUSH_CONSTANT_BUFFER_INDEX]; + break; + } + + mDirty = false; +} + +void MetalPushConstantBuffer::clear() { + mPushConstants.clear(); + mDirty = false; +} + } // namespace backend } // namespace filament diff --git a/filament/backend/src/metal/MetalDriver.h b/filament/backend/src/metal/MetalDriver.h index 9f48243bdf4..ca14adf9741 100644 --- a/filament/backend/src/metal/MetalDriver.h +++ b/filament/backend/src/metal/MetalDriver.h @@ -17,6 +17,7 @@ #ifndef TNT_FILAMENT_DRIVER_METALDRIVER_H #define TNT_FILAMENT_DRIVER_METALDRIVER_H +#include #include "private/backend/Driver.h" #include "DriverBase.h" @@ -28,17 +29,21 @@ #include #include +#include +#include +#include +#include + namespace filament { namespace backend { class MetalPlatform; class MetalBuffer; -class MetalSamplerGroup; +class MetalProgram; class MetalTexture; struct MetalUniformBuffer; struct MetalContext; -struct MetalProgram; struct BufferState; #ifndef FILAMENT_METAL_HANDLE_ARENA_SIZE_IN_MB @@ -56,9 +61,9 @@ class MetalDriver final : public DriverBase { private: friend class MetalSwapChain; + friend struct MetalDescriptorSet; MetalPlatform& mPlatform; - MetalContext* mContext; ShaderModel getShaderModel() const noexcept final; @@ -66,6 +71,26 @@ class MetalDriver final : public DriverBase { // Overrides the default implementation by wrapping the call to fn in an @autoreleasepool block. void execute(std::function const& fn) noexcept final; + /* + * Tasks run regularly on the driver thread. + * Not thread-safe; tasks are run from the driver thead and must be enqueued from the driver + * thread. + */ + void runAtNextTick(const std::function& fn) noexcept; + void executeTickOps() noexcept; + std::vector> mTickOps; + + // Tasks regularly executed on the driver thread after a command buffer has completed + struct DeferredTask { + DeferredTask(uint64_t commandBufferId, utils::Invocable&& fn) noexcept + : commandBufferId(commandBufferId), fn(std::move(fn)) {} + uint64_t commandBufferId; // after this command buffer completes + utils::Invocable fn; // execute this task + }; + void executeAfterCurrentCommandBufferCompletes(utils::Invocable&& fn) noexcept; + void executeDeferredOps() noexcept; + std::deque mDeferredTasks; + /* * Driver interface */ @@ -122,16 +147,13 @@ class MetalDriver final : public DriverBase { mHandleAllocator.deallocate(handle, p); } - inline void setRenderPrimitiveBuffer(Handle rph, + inline void setRenderPrimitiveBuffer(Handle rph, PrimitiveType pt, Handle vbh, Handle ibh); - inline void setRenderPrimitiveRange(Handle rph, PrimitiveType pt, - uint32_t offset, uint32_t minIndex, uint32_t maxIndex, uint32_t count); - - void finalizeSamplerGroup(MetalSamplerGroup* sg); void enumerateBoundBuffers(BufferObjectBinding bindingType, const std::function& f); + backend::StereoscopicType const mStereoscopicType; }; } // namespace backend diff --git a/filament/backend/src/metal/MetalDriver.mm b/filament/backend/src/metal/MetalDriver.mm index 77a9cd28a09..a8eee36dcb7 100644 --- a/filament/backend/src/metal/MetalDriver.mm +++ b/filament/backend/src/metal/MetalDriver.mm @@ -19,7 +19,10 @@ #include "CommandStreamDispatcher.h" #include "metal/MetalDriver.h" +#include + #include "MetalBlitter.h" +#include "MetalBufferPool.h" #include "MetalContext.h" #include "MetalDriverFactory.h" #include "MetalEnums.h" @@ -36,13 +39,59 @@ #include #include +#include +#include #include +#ifndef FILAMENT_METAL_DEBUG_LOG +#define FILAMENT_METAL_DEBUG_LOG 0 +#endif + +#if FILAMENT_METAL_DEBUG_LOG == 1 +#define DEBUG_LOG(x, ...) printf("[METAL DEBUG] " x, ##__VA_ARGS__) +#else +#define DEBUG_LOG(...) +#endif + namespace filament { namespace backend { Driver* MetalDriverFactory::create(MetalPlatform* const platform, const Platform::DriverConfig& driverConfig) { +#if 0 + // this is useful for development, but too verbose even for debug builds + // For reference on a 64-bits machine in Release mode: + // MetalTimerQuery : 16 few + // HwStream : 24 few + // MetalRenderPrimitive : 24 many + // MetalVertexBuffer : 32 moderate + // -- less than or equal 32 bytes + // MetalFence : 48 few + // MetalIndexBuffer : 56 moderate + // MetalBufferObject : 64 many + // -- less than or equal 64 bytes + // MetalProgram : 152 moderate + // MetalTexture : 152 moderate + // MetalSwapChain : 208 few + // MetalRenderTarget : 272 few + // MetalVertexBufferInfo : 552 moderate + // -- less than or equal to 552 bytes + + utils::slog.d + << "\nMetalSwapChain: " << sizeof(MetalSwapChain) + << "\nMetalBufferObject: " << sizeof(MetalBufferObject) + << "\nMetalVertexBuffer: " << sizeof(MetalVertexBuffer) + << "\nMetalVertexBufferInfo: " << sizeof(MetalVertexBufferInfo) + << "\nMetalIndexBuffer: " << sizeof(MetalIndexBuffer) + << "\nMetalRenderPrimitive: " << sizeof(MetalRenderPrimitive) + << "\nMetalTexture: " << sizeof(MetalTexture) + << "\nMetalTimerQuery: " << sizeof(MetalTimerQuery) + << "\nHwStream: " << sizeof(HwStream) + << "\nMetalRenderTarget: " << sizeof(MetalRenderTarget) + << "\nMetalFence: " << sizeof(MetalFence) + << "\nMetalProgram: " << sizeof(MetalProgram) + << utils::io::endl; +#endif return MetalDriver::create(platform, driverConfig); } @@ -50,7 +99,8 @@ Driver* MetalDriver::create(MetalPlatform* const platform, const Platform::DriverConfig& driverConfig) { assert_invariant(platform); size_t defaultSize = FILAMENT_METAL_HANDLE_ARENA_SIZE_IN_MB * 1024U * 1024U; - Platform::DriverConfig validConfig { .handleArenaSize = std::max(driverConfig.handleArenaSize, defaultSize) }; + Platform::DriverConfig validConfig {driverConfig}; + validConfig.handleArenaSize = std::max(driverConfig.handleArenaSize, defaultSize); return new MetalDriver(platform, validConfig); } @@ -58,15 +108,24 @@ return ConcreteDispatcher::make(); } -MetalDriver::MetalDriver(MetalPlatform* platform, const Platform::DriverConfig& driverConfig) noexcept - : mPlatform(*platform), - mContext(new MetalContext), - mHandleAllocator("Handles", driverConfig.handleArenaSize) { +MetalDriver::MetalDriver( + MetalPlatform* platform, const Platform::DriverConfig& driverConfig) noexcept + : mPlatform(*platform), + mContext(new MetalContext), + mHandleAllocator( + "Handles", driverConfig.handleArenaSize, driverConfig.disableHandleUseAfterFreeCheck), + mStereoscopicType(driverConfig.stereoscopicType) { mContext->driver = this; + TrackedMetalBuffer::setPlatform(platform); + ScopedAllocationTimer::setPlatform(platform); + mContext->device = mPlatform.createDevice(); assert_invariant(mContext->device); + mContext->emptyBuffer = [mContext->device newBufferWithLength:16 + options:MTLResourceStorageModePrivate]; + initializeSupportedGpuFamilies(mContext); utils::slog.v << "Supported GPU families: " << utils::io::endl; @@ -92,6 +151,11 @@ mContext->highestSupportedGpuFamily.mac >= 2; // newer macOS GPUs } + mContext->supportsDepthClamp = false; + if (@available(macOS 10.11, iOS 11.0, *)) { + mContext->supportsDepthClamp = true; + } + // In order to support resolve store action on depth attachment, the GPU needs to support it. // Note that support for depth resolve implies support for stencil resolve using .sample0 resolve filter. // (Other resolve filters are supported starting .apple5 and .mac2 families). @@ -117,12 +181,19 @@ sc[s] = [mContext->device supportsTextureSampleCount:s] ? s : sc[s - 1]; } + mContext->bugs.staticTextureTargetError = + [mContext->device.name containsString:@"Apple A8X GPU"] || + [mContext->device.name containsString:@"Apple A8 GPU"] || + [mContext->device.name containsString:@"Apple A7 GPU"]; + mContext->commandQueue = mPlatform.createCommandQueue(mContext->device); mContext->pipelineStateCache.setDevice(mContext->device); mContext->depthStencilStateCache.setDevice(mContext->device); mContext->samplerStateCache.setDevice(mContext->device); mContext->argumentEncoderCache.setDevice(mContext->device); mContext->bufferPool = new MetalBufferPool(*mContext); + mContext->bumpAllocator = + new MetalBumpAllocator(mContext->device, driverConfig.metalUploadBufferSizeBytes); mContext->blitter = new MetalBlitter(*mContext); if (@available(iOS 12, *)) { @@ -133,13 +204,20 @@ CVReturn success = CVMetalTextureCacheCreate(kCFAllocatorDefault, nullptr, mContext->device, nullptr, &mContext->textureCache); - ASSERT_POSTCONDITION(success == kCVReturnSuccess, "Could not create Metal texture cache."); + FILAMENT_CHECK_POSTCONDITION(success == kCVReturnSuccess) + << "Could not create Metal texture cache."; if (@available(iOS 12, *)) { dispatch_queue_t queue = dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0); mContext->eventListener = [[MTLSharedEventListener alloc] initWithDispatchQueue:queue]; } + const MetalShaderCompiler::Mode compilerMode = driverConfig.disableParallelShaderCompile + ? MetalShaderCompiler::Mode::SYNCHRONOUS + : MetalShaderCompiler::Mode::ASYNCHRONOUS; + mContext->shaderCompiler = new MetalShaderCompiler(mContext->device, *this, compilerMode); + mContext->shaderCompiler->init(); + #if defined(FILAMENT_METAL_PROFILING) mContext->log = os_log_create("com.google.filament", "Metal"); mContext->signpostId = os_signpost_id_generate(mContext->log); @@ -148,34 +226,58 @@ } MetalDriver::~MetalDriver() noexcept { + TrackedMetalBuffer::setPlatform(nullptr); + ScopedAllocationTimer::setPlatform(nullptr); mContext->device = nil; mContext->emptyTexture = nil; CFRelease(mContext->textureCache); delete mContext->bufferPool; + delete mContext->bumpAllocator; delete mContext->blitter; delete mContext->timerQueryImpl; + delete mContext->shaderCompiler; delete mContext; } void MetalDriver::tick(int) { + executeTickOps(); + executeDeferredOps(); } -void MetalDriver::beginFrame(int64_t monotonic_clock_ns, uint32_t frameId) { +void MetalDriver::beginFrame(int64_t monotonic_clock_ns, + int64_t refreshIntervalNs, uint32_t frameId) { + DEBUG_LOG("beginFrame(monotonic_clock_ns = %lld, refreshIntervalNs = %lld, frameId = %d)\n", + monotonic_clock_ns, refreshIntervalNs, frameId); #if defined(FILAMENT_METAL_PROFILING) os_signpost_interval_begin(mContext->log, mContext->signpostId, "Frame encoding", "%{public}d", frameId); #endif + if (mPlatform.hasDebugUpdateStatFunc()) { + mPlatform.debugUpdateStat("filament.metal.alive_buffers", TrackedMetalBuffer::getAliveBuffers()); + mPlatform.debugUpdateStat("filament.metal.alive_buffers.generic", + TrackedMetalBuffer::getAliveBuffers(TrackedMetalBuffer::Type::GENERIC)); + mPlatform.debugUpdateStat("filament.metal.alive_buffers.ring", + TrackedMetalBuffer::getAliveBuffers(TrackedMetalBuffer::Type::RING)); + mPlatform.debugUpdateStat("filament.metal.alive_buffers.staging", + TrackedMetalBuffer::getAliveBuffers(TrackedMetalBuffer::Type::STAGING)); + mPlatform.debugUpdateStat("filament.metal.alive_buffers.descriptor_set", + TrackedMetalBuffer::getAliveBuffers(TrackedMetalBuffer::Type::DESCRIPTOR_SET)); + } } -void MetalDriver::setFrameScheduledCallback(Handle sch, - FrameScheduledCallback callback, void* user) { +void MetalDriver::setFrameScheduledCallback(Handle sch, CallbackHandler* handler, + FrameScheduledCallback&& callback, uint64_t flags) { + // Turn off the CALLBACK_DEFAULT_USE_METAL_COMPLETION_HANDLER flag if a custom handler is provided. + if (handler) { + flags &= ~SwapChain::CALLBACK_DEFAULT_USE_METAL_COMPLETION_HANDLER; + } auto* swapChain = handle_cast(sch); - swapChain->setFrameScheduledCallback(callback, user); + swapChain->setFrameScheduledCallback(handler, std::move(callback), flags); } -void MetalDriver::setFrameCompletedCallback(Handle sch, - FrameCompletedCallback callback, void* user) { +void MetalDriver::setFrameCompletedCallback( + Handle sch, CallbackHandler* handler, utils::Invocable&& callback) { auto* swapChain = handle_cast(sch); - swapChain->setFrameCompletedCallback(callback, user); + swapChain->setFrameCompletedCallback(handler, std::move(callback)); } void MetalDriver::execute(std::function const& fn) noexcept { @@ -188,6 +290,7 @@ } void MetalDriver::endFrame(uint32_t frameId) { + DEBUG_LOG("endFrame(frameId = %d)\n", frameId); // If we haven't committed the command buffer (if the frame was canceled), do it now. There may // be commands in it (like fence signaling) that need to execute. submitPendingCommands(mContext); @@ -220,37 +323,163 @@ #endif } -void MetalDriver::flush(int) { +void MetalDriver::updateDescriptorSetBuffer( + backend::DescriptorSetHandle dsh, + backend::descriptor_binding_t binding, + backend::BufferObjectHandle boh, + uint32_t offset, + uint32_t size) { ASSERT_PRECONDITION(!isInRenderPass(mContext), - "flush must be called outside of a render pass."); + "updateDescriptorSetBuffer must be called outside of a render pass."); + DEBUG_LOG( + "updateDescriptorSetBuffer(dsh = %d, binding = %d, boh = %d, offset = %d, size = " + "%d)\n", + dsh.getId(), binding, boh.getId(), offset, size); + + auto* descriptorSet = handle_cast(dsh); + auto* bo = handle_cast(boh); + id mtlBuffer = bo->getBuffer()->getGpuBufferForDraw(); + descriptorSet->buffers[binding] = { mtlBuffer, offset, size }; + ShaderStageFlags stageFlags = descriptorSet->layout->getBindings()[binding].stageFlags; + if (any(stageFlags & ShaderStageFlags::VERTEX)) { + descriptorSet->vertexResources.push_back(mtlBuffer); + } + if (any(stageFlags & ShaderStageFlags::FRAGMENT)) { + descriptorSet->fragmentResources.push_back(mtlBuffer); + } +} + +void MetalDriver::updateDescriptorSetTexture( + backend::DescriptorSetHandle dsh, + backend::descriptor_binding_t binding, + backend::TextureHandle th, + SamplerParams params) { + ASSERT_PRECONDITION(!isInRenderPass(mContext), + "updateDescriptorSetTexture must be called outside of a render pass."); + DEBUG_LOG("updateDescriptorSetTexture(dsh = %d, binding = %d, th = %d, params = {...})\n", + dsh.getId(), binding, th.getId()); + + auto* descriptorSet = handle_cast(dsh); + auto* texture = handle_cast(th); + + id mtlTexture = texture->getMtlTextureForRead(); + if (texture->target == SamplerType::SAMPLER_EXTERNAL) { + auto externalImage = texture->getExternalImage(); + assert_invariant(externalImage != nil); + descriptorSet->externalImages.push_back(externalImage); + } + assert_invariant(mtlTexture != nil); + + descriptorSet->textures[binding] = MetalDescriptorSet::TextureBinding { mtlTexture, params }; + + auto const& bindings = descriptorSet->layout->getBindings(); + auto found = std::find_if(bindings.begin(), bindings.end(), + [binding](const auto& b) { return b.binding == binding; }); + assert_invariant(found != bindings.end()); + + ShaderStageFlags stageFlags = found->stageFlags; + if (any(stageFlags & ShaderStageFlags::VERTEX)) { + descriptorSet->vertexResources.push_back(mtlTexture); + } + if (any(stageFlags & ShaderStageFlags::FRAGMENT)) { + descriptorSet->fragmentResources.push_back(mtlTexture); + } +} + +void MetalDriver::flush(int) { + FILAMENT_CHECK_PRECONDITION(!isInRenderPass(mContext)) + << "flush must be called outside of a render pass."; submitPendingCommands(mContext); } void MetalDriver::finish(int) { - ASSERT_PRECONDITION(!isInRenderPass(mContext), - "finish must be called outside of a render pass."); + FILAMENT_CHECK_PRECONDITION(!isInRenderPass(mContext)) + << "finish must be called outside of a render pass."; // Wait for all frames to finish by submitting and waiting on a dummy command buffer. submitPendingCommands(mContext); - id oneOffBuffer = [mContext->commandQueue commandBuffer]; - [oneOffBuffer commit]; + + id oneOffBuffer = getPendingCommandBuffer(mContext); + submitPendingCommands(mContext); [oneOffBuffer waitUntilCompleted]; + + executeTickOps(); + executeDeferredOps(); +} + +void MetalDriver::createVertexBufferInfoR(Handle vbih, uint8_t bufferCount, + uint8_t attributeCount, AttributeArray attributes) { + construct_handle(vbih, *mContext, + bufferCount, attributeCount, attributes); } -void MetalDriver::createVertexBufferR(Handle vbh, uint8_t bufferCount, - uint8_t attributeCount, uint32_t vertexCount, AttributeArray attributes) { - construct_handle(vbh, *mContext, bufferCount, - attributeCount, vertexCount, attributes); +void MetalDriver::createVertexBufferR(Handle vbh, + uint32_t vertexCount, Handle vbih) { + MetalVertexBufferInfo const* const vbi = handle_cast(vbih); + construct_handle(vbh, *mContext, vertexCount, vbi->bufferCount, vbih); + // No actual GPU memory is allocated here, so no need to check for allocation success. } void MetalDriver::createIndexBufferR(Handle ibh, ElementType elementType, uint32_t indexCount, BufferUsage usage) { - auto elementSize = (uint8_t) getElementTypeSize(elementType); - construct_handle(ibh, *mContext, usage, elementSize, indexCount); + auto elementSize = (uint8_t)getElementTypeSize(elementType); + auto* indexBuffer = + construct_handle(ibh, *mContext, usage, elementSize, indexCount); + auto& buffer = indexBuffer->buffer; + // If the allocation was not successful, postpone the error message until the next tick, to give + // Filament a chance to call setDebugTag on the handle; this way we get a nicer error message. + if (UTILS_UNLIKELY(!buffer.wasAllocationSuccessful())) { + const size_t byteCount = buffer.getSize(); + runAtNextTick([byteCount, this, ibh]() { + FILAMENT_CHECK_POSTCONDITION(false) + << "Could not allocate Metal index buffer of size " << byteCount + << ", tag=" << mHandleAllocator.getHandleTag(ibh.getId()).c_str_safe(); + }); + } } void MetalDriver::createBufferObjectR(Handle boh, uint32_t byteCount, BufferObjectBinding bindingType, BufferUsage usage) { - construct_handle(boh, *mContext, bindingType, usage, byteCount); + auto* bufferObject = + construct_handle(boh, *mContext, bindingType, usage, byteCount); + // If the allocation was not successful, postpone the error message until the next tick, to give + // Filament a chance to call setDebugTag on the handle; this way we get a nicer error message. + if (UTILS_UNLIKELY(!bufferObject->getBuffer()->wasAllocationSuccessful())) { + runAtNextTick([byteCount, this, boh]() { + FILAMENT_CHECK_POSTCONDITION(false) + << "Could not allocate Metal buffer of size " << byteCount + << ", tag=" << mHandleAllocator.getHandleTag(boh.getId()).c_str_safe(); + }); + } +} + +// fixme: TextureUsage is a bitfield +inline const char* stringify(TextureUsage usage) { + switch (usage) { + case TextureUsage::NONE: return "NONE"; + case TextureUsage::COLOR_ATTACHMENT: return "COLOR_ATTACHMENT"; + case TextureUsage::DEPTH_ATTACHMENT: return "DEPTH_ATTACHMENT"; + case TextureUsage::STENCIL_ATTACHMENT: return "STENCIL_ATTACHMENT"; + case TextureUsage::UPLOADABLE: return "UPLOADABLE"; + case TextureUsage::SAMPLEABLE: return "SAMPLEABLE"; + case TextureUsage::SUBPASS_INPUT: return "SUBPASS_INPUT"; + case TextureUsage::BLIT_SRC: return "BLIT_SRC"; + case TextureUsage::BLIT_DST: return "BLIT_DST"; + case TextureUsage::PROTECTED: return "PROTECTED"; + case TextureUsage::DEFAULT: return "DEFAULT"; + default: return "UNKNOWN"; + } +} + +inline const char* stringify(SamplerType samplerType) { + switch (samplerType) { + case SamplerType::SAMPLER_2D: return "SAMPLER_2D"; + case SamplerType::SAMPLER_2D_ARRAY: return "SAMPLER_2D_ARRAY"; + case SamplerType::SAMPLER_CUBEMAP: return "SAMPLER_CUBEMAP"; + case SamplerType::SAMPLER_EXTERNAL: return "SAMPLER_EXTERNAL"; + case SamplerType::SAMPLER_3D: return "SAMPLER_3D"; + case SamplerType::SAMPLER_CUBEMAP_ARRAY: return "SAMPLER_CUBEMAP_ARRAY"; + } + return "UNKNOWN"; } void MetalDriver::createTextureR(Handle th, SamplerType target, uint8_t levels, @@ -260,22 +489,48 @@ auto& sc = mContext->sampleCountLookup; samples = sc[std::min(MAX_SAMPLE_COUNT, samples)]; - mContext->textures.insert(construct_handle(th, *mContext, - target, levels, format, samples, width, height, depth, usage, - TextureSwizzle::CHANNEL_0, TextureSwizzle::CHANNEL_1, - TextureSwizzle::CHANNEL_2, TextureSwizzle::CHANNEL_3)); + mContext->textures.insert(construct_handle( + th, *mContext, target, levels, format, samples, width, height, depth, usage)); + + DEBUG_LOG( + "createTextureR(th = %d, target = %s, levels = %d, format = ?, samples = %d, width = " + "%d, height = %d, depth = %d, usage = %s)\n", + th.getId(), stringify(target), levels, samples, width, height, depth, stringify(usage)); } -void MetalDriver::createTextureSwizzledR(Handle th, SamplerType target, uint8_t levels, - TextureFormat format, uint8_t samples, uint32_t width, uint32_t height, - uint32_t depth, TextureUsage usage, - TextureSwizzle r, TextureSwizzle g, TextureSwizzle b, TextureSwizzle a) { - // Clamp sample count to what the device supports. - auto& sc = mContext->sampleCountLookup; - samples = sc[std::min(MAX_SAMPLE_COUNT, samples)]; +void MetalDriver::createTextureViewR( + Handle th, Handle srch, uint8_t baseLevel, uint8_t levelCount) { + MetalTexture const* src = handle_cast(srch); + mContext->textures.insert( + construct_handle(th, *mContext, src, baseLevel, levelCount)); +} - mContext->textures.insert(construct_handle(th, *mContext, - target, levels, format, samples, width, height, depth, usage, r, g, b, a)); +void MetalDriver::createTextureViewSwizzleR(Handle th, Handle srch, + backend::TextureSwizzle r, backend::TextureSwizzle g, backend::TextureSwizzle b, + backend::TextureSwizzle a) { + MetalTexture const* src = handle_cast(srch); + mContext->textures.insert(construct_handle(th, *mContext, src, r, g, b, a)); +} + +void MetalDriver::createTextureExternalImageR(Handle th, + backend::SamplerType target, + backend::TextureFormat format, + uint32_t width, uint32_t height, backend::TextureUsage usage, void* image) { + mContext->textures.insert(construct_handle( + th, *mContext, format, width, height, usage, (CVPixelBufferRef)image)); + // This release matches the retain call in setupExternalImage. The MetalTexture will have + // retained the buffer by now. + CVPixelBufferRelease((CVPixelBufferRef)image); +} + +void MetalDriver::createTextureExternalImagePlaneR(Handle th, + backend::TextureFormat format, uint32_t width, uint32_t height, backend::TextureUsage usage, + void* image, uint32_t plane) { + mContext->textures.insert(construct_handle( + th, *mContext, format, width, height, usage, (CVPixelBufferRef)image, plane)); + // This release matches the retain call in setupExternalImage. The MetalTexture will have + // retained the buffer by now. + CVPixelBufferRelease((CVPixelBufferRef)image); } void MetalDriver::importTextureR(Handle th, intptr_t i, @@ -283,38 +538,37 @@ TextureFormat format, uint8_t samples, uint32_t width, uint32_t height, uint32_t depth, TextureUsage usage) { id metalTexture = (id) CFBridgingRelease((void*) i); - ASSERT_PRECONDITION(metalTexture.width == width, - "Imported id width (%d) != Filament texture width (%d)", - metalTexture.width, width); - ASSERT_PRECONDITION(metalTexture.height == height, - "Imported id height (%d) != Filament texture height (%d)", - metalTexture.height, height); - ASSERT_PRECONDITION(metalTexture.mipmapLevelCount == levels, - "Imported id levels (%d) != Filament texture levels (%d)", - metalTexture.mipmapLevelCount, levels); + FILAMENT_CHECK_PRECONDITION(metalTexture.width == width) + << "Imported id width (" << metalTexture.width + << ") != Filament texture width (" << width << ")"; + FILAMENT_CHECK_PRECONDITION(metalTexture.height == height) + << "Imported id height (" << metalTexture.height + << ") != Filament texture height (" << height << ")"; + FILAMENT_CHECK_PRECONDITION(metalTexture.mipmapLevelCount == levels) + << "Imported id levels (" << metalTexture.mipmapLevelCount + << ") != Filament texture levels (" << levels << ")"; MTLTextureType filamentMetalType = getMetalType(target); - ASSERT_PRECONDITION(metalTexture.textureType == filamentMetalType, - "Imported id type (%d) != Filament texture type (%d)", - metalTexture.textureType, filamentMetalType); + FILAMENT_CHECK_PRECONDITION(metalTexture.textureType == filamentMetalType) + << "Imported id type (" << metalTexture.textureType + << ") != Filament texture type (" << filamentMetalType << ")"; mContext->textures.insert(construct_handle(th, *mContext, target, levels, format, samples, width, height, depth, usage, metalTexture)); } -void MetalDriver::createSamplerGroupR(Handle sbh, uint32_t size) { - mContext->samplerGroups.insert(construct_handle(sbh, size)); -} - void MetalDriver::createRenderPrimitiveR(Handle rph, Handle vbh, Handle ibh, - PrimitiveType pt, uint32_t offset, - uint32_t minIndex, uint32_t maxIndex, uint32_t count) { + PrimitiveType pt) { construct_handle(rph); - MetalDriver::setRenderPrimitiveBuffer(rph, vbh, ibh); - MetalDriver::setRenderPrimitiveRange(rph, pt, offset, minIndex, maxIndex, count); + MetalDriver::setRenderPrimitiveBuffer(rph, pt, vbh, ibh); } void MetalDriver::createProgramR(Handle rph, Program&& program) { - construct_handle(rph, mContext->device, program); +#if FILAMENT_METAL_DEBUG_LOG + auto handleId = rph.getId(); + DEBUG_LOG("createProgramR(rph = %d, program = ", handleId); + utils::slog.d << program << utils::io::endl; +#endif + construct_handle(rph, *mContext, std::move(program)); } void MetalDriver::createDefaultRenderTargetR(Handle rth, int dummy) { @@ -323,10 +577,10 @@ void MetalDriver::createRenderTargetR(Handle rth, TargetBufferFlags targetBufferFlags, uint32_t width, uint32_t height, - uint8_t samples, MRT color, + uint8_t samples, uint8_t layerCount, MRT color, TargetBufferInfo depth, TargetBufferInfo stencil) { - ASSERT_PRECONDITION(!isInRenderPass(mContext), - "createRenderTarget must be called outside of a render pass."); + FILAMENT_CHECK_PRECONDITION(!isInRenderPass(mContext)) + << "createRenderTarget must be called outside of a render pass."; // Clamp sample count to what the device supports. auto& sc = mContext->sampleCountLookup; samples = sc[std::min(MAX_SAMPLE_COUNT, samples)]; @@ -337,34 +591,31 @@ continue; } const auto& buffer = color[i]; - ASSERT_PRECONDITION(buffer.handle, - "The COLOR%u flag was specified, but invalid color handle provided.", i); + FILAMENT_CHECK_PRECONDITION(buffer.handle) + << "The COLOR" << i << " flag was specified, but invalid color handle provided."; auto colorTexture = handle_cast(buffer.handle); - ASSERT_PRECONDITION(colorTexture->getMtlTextureForWrite(), - "Color texture passed to render target has no texture allocation"); - colorTexture->updateLodRange(buffer.level); + FILAMENT_CHECK_PRECONDITION(colorTexture->getMtlTextureForWrite()) + << "Color texture passed to render target has no texture allocation"; colorAttachments[i] = { colorTexture, color[i].level, color[i].layer }; } MetalRenderTarget::Attachment depthAttachment = {}; if (any(targetBufferFlags & TargetBufferFlags::DEPTH)) { - ASSERT_PRECONDITION(depth.handle, - "The DEPTH flag was specified, but invalid depth handle provided."); + FILAMENT_CHECK_PRECONDITION(depth.handle) + << "The DEPTH flag was specified, but invalid depth handle provided."; auto depthTexture = handle_cast(depth.handle); - ASSERT_PRECONDITION(depthTexture->getMtlTextureForWrite(), - "Depth texture passed to render target has no texture allocation."); - depthTexture->updateLodRange(depth.level); + FILAMENT_CHECK_PRECONDITION(depthTexture->getMtlTextureForWrite()) + << "Depth texture passed to render target has no texture allocation."; depthAttachment = { depthTexture, depth.level, depth.layer }; } MetalRenderTarget::Attachment stencilAttachment = {}; if (any(targetBufferFlags & TargetBufferFlags::STENCIL)) { - ASSERT_PRECONDITION(stencil.handle, - "The STENCIL flag was specified, but invalid stencil handle provided."); + FILAMENT_CHECK_PRECONDITION(stencil.handle) + << "The STENCIL flag was specified, but invalid stencil handle provided."; auto stencilTexture = handle_cast(stencil.handle); - ASSERT_PRECONDITION(stencilTexture->getMtlTextureForWrite(), - "Stencil texture passed to render target has no texture allocation."); - stencilTexture->updateLodRange(stencil.level); + FILAMENT_CHECK_PRECONDITION(stencilTexture->getMtlTextureForWrite()) + << "Stencil texture passed to render target has no texture allocation."; stencilAttachment = { stencilTexture, stencil.level, stencil.layer }; } @@ -377,15 +628,13 @@ fence->encode(); } -void MetalDriver::createSyncR(Handle sh, int) { - auto* fence = handle_cast(sh); - fence->encode(); -} - void MetalDriver::createSwapChainR(Handle sch, void* nativeWindow, uint64_t flags) { if (UTILS_UNLIKELY(flags & SWAP_CHAIN_CONFIG_APPLE_CVPIXELBUFFER)) { CVPixelBufferRef pixelBuffer = (CVPixelBufferRef) nativeWindow; construct_handle(sch, *mContext, pixelBuffer, flags); + // This release matches the retain call in setupExternalImage. The MetalSwapchain will have + // retained the buffer by now. + CVPixelBufferRelease((CVPixelBufferRef)pixelBuffer); } else { auto* metalLayer = (__bridge CAMetalLayer*) nativeWindow; construct_handle(sch, *mContext, metalLayer, flags); @@ -401,6 +650,78 @@ // nothing to do, timer query was constructed in createTimerQueryS } +const char* toString(DescriptorType type) { + switch (type) { + case DescriptorType::UNIFORM_BUFFER: + return "UNIFORM_BUFFER"; + case DescriptorType::SHADER_STORAGE_BUFFER: + return "SHADER_STORAGE_BUFFER"; + case DescriptorType::SAMPLER: + return "SAMPLER"; + case DescriptorType::INPUT_ATTACHMENT: + return "INPUT_ATTACHMENT"; + case DescriptorType::SAMPLER_EXTERNAL: + return "SAMPLER_EXTERNAL"; + } +} + +const char* toString(ShaderStageFlags flags) { + std::vector stages; + if (any(flags & ShaderStageFlags::VERTEX)) { + stages.push_back("VERTEX"); + } + if (any(flags & ShaderStageFlags::FRAGMENT)) { + stages.push_back("FRAGMENT"); + } + if (any(flags & ShaderStageFlags::COMPUTE)) { + stages.push_back("COMPUTE"); + } + if (stages.empty()) { + return "NONE"; + } + static char buffer[64]; + buffer[0] = '\0'; + for (size_t i = 0; i < stages.size(); i++) { + if (i > 0) { + strcat(buffer, " | "); + } + strcat(buffer, stages[i]); + } + return buffer; +} + +const char* toString(DescriptorFlags flags) { + if (flags == DescriptorFlags::DYNAMIC_OFFSET) { + return "DYNAMIC_OFFSET"; + } + return "NONE"; +} + +void MetalDriver::createDescriptorSetLayoutR( + Handle dslh, DescriptorSetLayout&& info) { + std::sort(info.bindings.begin(), info.bindings.end(), + [](const auto& a, const auto& b) { return a.binding < b.binding; }); + DEBUG_LOG("createDescriptorSetLayoutR(dslh = %d, info = {\n", dslh.getId()); + for (size_t i = 0; i < info.bindings.size(); i++) { + DEBUG_LOG(" {binding = %d, type = %s, count = %d, stage = %s, flags = %s},\n", + info.bindings[i].binding, toString(info.bindings[i].type), info.bindings[i].count, + toString(info.bindings[i].stageFlags), toString(info.bindings[i].flags)); + } + DEBUG_LOG("})\n"); + construct_handle(dslh, std::move(info)); +} + +void MetalDriver::createDescriptorSetR( + Handle dsh, Handle dslh) { + DEBUG_LOG("createDescriptorSetR(dsh = %d, dslh = %d)\n", dsh.getId(), dslh.getId()); + MetalDescriptorSetLayout* layout = handle_cast(dslh); + construct_handle(dsh, layout); +} + +Handle MetalDriver::createVertexBufferInfoS() noexcept { + return alloc_handle(); +} + Handle MetalDriver::createVertexBufferS() noexcept { return alloc_handle(); } @@ -417,16 +738,24 @@ return alloc_handle(); } -Handle MetalDriver::createTextureSwizzledS() noexcept { +Handle MetalDriver::createTextureViewS() noexcept { return alloc_handle(); } -Handle MetalDriver::importTextureS() noexcept { +Handle MetalDriver::createTextureViewSwizzleS() noexcept { return alloc_handle(); } -Handle MetalDriver::createSamplerGroupS() noexcept { - return alloc_handle(); +Handle MetalDriver::createTextureExternalImageS() noexcept { + return alloc_handle(); +} + +Handle MetalDriver::createTextureExternalImagePlaneS() noexcept { + return alloc_handle(); +} + +Handle MetalDriver::importTextureS() noexcept { + return alloc_handle(); } Handle MetalDriver::createRenderPrimitiveS() noexcept { @@ -451,12 +780,6 @@ return alloc_and_construct_handle(*mContext); } -Handle MetalDriver::createSyncS() noexcept { - // The handle must be constructed here, as a synchronous call to getSyncStatus might happen - // before createSyncR is executed. - return alloc_and_construct_handle(*mContext); -} - Handle MetalDriver::createSwapChainS() noexcept { return alloc_handle(); } @@ -471,6 +794,20 @@ return alloc_and_construct_handle(); } +Handle MetalDriver::createDescriptorSetLayoutS() noexcept { + return alloc_handle(); +} + +Handle MetalDriver::createDescriptorSetS() noexcept { + return alloc_handle(); +} + +void MetalDriver::destroyVertexBufferInfo(Handle vbih) { + if (vbih) { + destruct_handle(vbih); + } +} + void MetalDriver::destroyVertexBuffer(Handle vbh) { if (vbh) { destruct_handle(vbh); @@ -487,22 +824,6 @@ if (UTILS_UNLIKELY(!boh)) { return; } - auto* bo = handle_cast(boh); - // Unbind this buffer object from any uniform / SSBO slots it's still bound to. - bo->boundUniformBuffers.forEachSetBit([this](size_t index) { - mContext->uniformState[index] = BufferState { - .buffer = nullptr, - .offset = 0, - .bound = false - }; - }); - bo->boundSsbos.forEachSetBit([this](size_t index) { - mContext->ssboState[index] = BufferState { - .buffer = nullptr, - .offset = 0, - .bound = false - }; - }); destruct_handle(boh); } @@ -513,32 +834,31 @@ } void MetalDriver::destroyProgram(Handle ph) { - if (ph) { - destruct_handle(ph); - } -} - -void MetalDriver::destroySamplerGroup(Handle sbh) { - if (!sbh) { + if (UTILS_UNLIKELY(!ph)) { return; } - // Unbind this sampler group from our internal state. - auto* metalSampler = handle_cast(sbh); - for (auto& samplerBinding : mContext->samplerBindings) { - if (samplerBinding == metalSampler) { - samplerBinding = {}; - } + // Remove any cached pipeline states that refer to these programs. + auto* metalProgram = handle_cast(ph); + const auto& functions = metalProgram->getFunctionsIfPresent(); + if (UTILS_LIKELY(functions.isRaster())) { // only raster pipelines are cached + const auto& raster = functions.getRasterFunctions(); + mContext->pipelineStateCache.removeIf([&](const MetalPipelineState& state) { + const auto& [fragment, vertex] = raster; + return state.fragmentFunction == fragment || state.vertexFunction == vertex; + }); } - mContext->samplerGroups.erase(metalSampler); - destruct_handle(sbh); + destruct_handle(ph); } void MetalDriver::destroyTexture(Handle th) { + DEBUG_LOG("destroyTexture(th = %d)\n", th.getId()); if (!th) { return; } - mContext->textures.erase(handle_cast(th)); + auto* metalTexture = handle_cast(th); + mContext->textures.erase(metalTexture); + destruct_handle(th); } @@ -549,7 +869,23 @@ } void MetalDriver::destroySwapChain(Handle sch) { - if (sch) { + if (UTILS_UNLIKELY(!sch)) { + return; + } + auto* swapChain = handle_cast(sch); + if (mContext->currentDrawSwapChain == swapChain) { + mContext->currentDrawSwapChain = nullptr; + } + if (mContext->currentReadSwapChain == swapChain) { + mContext->currentReadSwapChain = nullptr; + } + // If the SwapChain is a pixel buffer, we need to wait for the current command buffer to + // complete before destroying it. This is because pixel buffer SwapChains hold a + // MetalExternalImage that could still being rendered into. + if (UTILS_UNLIKELY(swapChain->isPixelBuffer())) { + executeAfterCurrentCommandBufferCompletes( + [this, sch]() mutable { destruct_handle(sch); }); + } else { destruct_handle(sch); } } @@ -564,12 +900,30 @@ } } -void MetalDriver::destroySync(Handle sh) { - if (sh) { - destruct_handle(sh); +void MetalDriver::destroyDescriptorSetLayout(Handle dslh) { + DEBUG_LOG("destroyDescriptorSetLayout(dslh = %d)\n", dslh.getId()); + if (dslh) { + destruct_handle(dslh); } } +void MetalDriver::destroyDescriptorSet(Handle dsh) { + DEBUG_LOG("destroyDescriptorSet(dsh = %d)\n", dsh.getId()); + if (!dsh) { + return; + } + + // Unbind this descriptor set. + auto* descriptorSet = handle_cast(dsh); + for (size_t i = 0; i < MAX_DESCRIPTOR_SET_COUNT; i++) { + if (UTILS_UNLIKELY(mContext->currentDescriptorSets[i] == descriptorSet)) { + mContext->currentDescriptorSets[i] = nullptr; + } + } + + executeAfterCurrentCommandBufferCompletes( + [this, dsh]() mutable { destruct_handle(dsh); }); +} void MetalDriver::terminate() { // finish() will flush the pending command buffer and will ensure all GPU work has finished. @@ -581,10 +935,11 @@ MetalExternalImage::shutdown(*mContext); mContext->blitter->shutdown(); + mContext->shaderCompiler->terminate(); } ShaderModel MetalDriver::getShaderModel() const noexcept { -#if defined(IOS) +#if defined(FILAMENT_IOS) return ShaderModel::MOBILE; #else return ShaderModel::DESKTOP; @@ -622,12 +977,12 @@ } } -FenceStatus MetalDriver::wait(Handle fh, uint64_t timeout) { +FenceStatus MetalDriver::getFenceStatus(Handle fh) { auto* fence = handle_cast(fh); if (!fence) { return FenceStatus::ERROR; } - return fence->wait(timeout); + return fence->wait(0); } bool MetalDriver::isTextureFormatSupported(TextureFormat format) { @@ -658,7 +1013,7 @@ case MTLPixelFormatRGBA16Float: return true; -#if !defined(IOS) +#if !defined(FILAMENT_IOS) // Mipmappable only on desktop: case MTLPixelFormatR32Float: case MTLPixelFormatRG32Float: @@ -666,7 +1021,7 @@ return true; #endif -#if defined(IOS) +#if defined(FILAMENT_IOS) // Mipmappable only on iOS: case MTLPixelFormatRGB9E5Float: return true; @@ -706,6 +1061,48 @@ return mContext->supportsAutoDepthResolve; } +bool MetalDriver::isSRGBSwapChainSupported() { + // the SWAP_CHAIN_CONFIG_SRGB_COLORSPACE flag is not supported + return false; +} + +bool MetalDriver::isProtectedContentSupported() { + // the SWAP_CHAIN_CONFIG_PROTECTED_CONTENT flag is not supported + return false; +} + +bool MetalDriver::isStereoSupported() { + switch (mStereoscopicType) { + case backend::StereoscopicType::INSTANCED: + return true; + case backend::StereoscopicType::MULTIVIEW: + // TODO: implement multiview feature in Metal. + return false; + case backend::StereoscopicType::NONE: + return false; + } +} + +bool MetalDriver::isParallelShaderCompileSupported() { + return mContext->shaderCompiler->isParallelShaderCompileSupported(); +} + +bool MetalDriver::isDepthStencilResolveSupported() { + return false; +} + +bool MetalDriver::isDepthStencilBlitSupported(TextureFormat format) { + return true; +} + +bool MetalDriver::isProtectedTexturesSupported() { + return false; +} + +bool MetalDriver::isDepthClampSupported() { + return mContext->supportsDepthClamp; +} + bool MetalDriver::isWorkaroundNeeded(Workaround workaround) { switch (workaround) { case Workaround::SPLIT_EASU: @@ -714,6 +1111,12 @@ return true; case Workaround::ADRENO_UNIFORM_ARRAY_CRASH: return false; + case Workaround::METAL_STATIC_TEXTURE_TARGET_ERROR: + return mContext->bugs.staticTextureTargetError; + case Workaround::DISABLE_BLIT_INTO_TEXTURE_ARRAY: + return false; + default: + return false; } return false; } @@ -740,26 +1143,40 @@ return std::min(mContext->maxColorRenderTargets, MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT); } +size_t MetalDriver::getMaxUniformBufferSize() { + return 256 * 1024 * 1024; // TODO: return the actual size instead of hardcoding the minspec +} + void MetalDriver::updateIndexBuffer(Handle ibh, BufferDescriptor&& data, uint32_t byteOffset) { + FILAMENT_CHECK_PRECONDITION(data.buffer) + << "updateIndexBuffer called with a null buffer."; auto* ib = handle_cast(ibh); - ib->buffer.copyIntoBuffer(data.buffer, data.size, byteOffset); + ib->buffer.copyIntoBuffer(data.buffer, data.size, byteOffset, + [&]() { return mHandleAllocator.getHandleTag(ibh.getId()).c_str_safe(); }); scheduleDestroy(std::move(data)); } void MetalDriver::updateBufferObject(Handle boh, BufferDescriptor&& data, uint32_t byteOffset) { - ASSERT_PRECONDITION(!isInRenderPass(mContext), - "updateBufferObject must be called outside of a render pass."); + FILAMENT_CHECK_PRECONDITION(!isInRenderPass(mContext)) + << "updateBufferObject must be called outside of a render pass. tag=" + << mHandleAllocator.getHandleTag(boh.getId()).c_str_safe(); + FILAMENT_CHECK_PRECONDITION(data.buffer) + << "updateBufferObject called with a null buffer. tag=" + << mHandleAllocator.getHandleTag(boh.getId()).c_str_safe(); auto* bo = handle_cast(boh); - bo->updateBuffer(data.buffer, data.size, byteOffset); + + bo->updateBuffer(data.buffer, data.size, byteOffset, + [&]() { return mHandleAllocator.getHandleTag(boh.getId()).c_str_safe(); }); scheduleDestroy(std::move(data)); } void MetalDriver::updateBufferObjectUnsynchronized(Handle boh, BufferDescriptor&& data, uint32_t byteOffset) { auto* bo = handle_cast(boh); - bo->updateBufferUnsynchronized(data.buffer, data.size, byteOffset); + bo->updateBufferUnsynchronized(data.buffer, data.size, byteOffset, + [&]() { return mHandleAllocator.getHandleTag(boh.getId()).c_str_safe(); }); scheduleDestroy(std::move(data)); } @@ -780,187 +1197,60 @@ vertexBuffer->buffers[index] = bufferObject->getBuffer(); } -void MetalDriver::setMinMaxLevels(Handle th, uint32_t minLevel, uint32_t maxLevel) { -} - void MetalDriver::update3DImage(Handle th, uint32_t level, uint32_t xoffset, uint32_t yoffset, uint32_t zoffset, uint32_t width, uint32_t height, uint32_t depth, PixelBufferDescriptor&& data) { - ASSERT_PRECONDITION(!isInRenderPass(mContext), - "update3DImage must be called outside of a render pass."); + FILAMENT_CHECK_PRECONDITION(!isInRenderPass(mContext)) + << "update3DImage must be called outside of a render pass."; auto tex = handle_cast(th); tex->loadImage(level, MTLRegionMake3D(xoffset, yoffset, zoffset, width, height, depth), data); scheduleDestroy(std::move(data)); + + DEBUG_LOG( + "update3DImage(th = %d, level = %d, xoffset = %d, yoffset = %d, zoffset = %d, width = " + "%d, height = %d, depth = %d, data = ?)\n", + th.getId(), level, xoffset, yoffset, zoffset, width, height, depth); } void MetalDriver::setupExternalImage(void* image) { - // This is called when passing in a CVPixelBuffer as either an external image or swap chain. - // Here we take ownership of the passed in buffer. It will be released the next time - // setExternalImage is called, when the texture is destroyed, or when the swap chain is - // destroyed. + // setupExternalImage is called on the Filament thread when creating a Texture or SwapChain from + // a CVPixelBuffer external image. Here we take ownership of the passed in buffer by calling + // CVPixelBufferRetain. This keeps the buffer alive until the driver thread processes it (inside + // createTextureExternalImage or createSwapChain), allowing the application to free their + // reference to the buffer. CVPixelBufferRef pixelBuffer = (CVPixelBufferRef) image; CVPixelBufferRetain(pixelBuffer); } -void MetalDriver::setExternalImage(Handle th, void* image) { - ASSERT_PRECONDITION(!isInRenderPass(mContext), - "setExternalImage must be called outside of a render pass."); - auto texture = handle_cast(th); - texture->externalImage.set((CVPixelBufferRef) image); -} - -void MetalDriver::setExternalImagePlane(Handle th, void* image, uint32_t plane) { - ASSERT_PRECONDITION(!isInRenderPass(mContext), - "setExternalImagePlane must be called outside of a render pass."); - auto texture = handle_cast(th); - texture->externalImage.set((CVPixelBufferRef) image, plane); -} - void MetalDriver::setExternalStream(Handle th, Handle sh) { } -bool MetalDriver::getTimerQueryValue(Handle tqh, uint64_t* elapsedTime) { +TimerQueryResult MetalDriver::getTimerQueryValue(Handle tqh, uint64_t* elapsedTime) { auto* tq = handle_cast(tqh); - return mContext->timerQueryImpl->getQueryResult(tq, elapsedTime); -} - -SyncStatus MetalDriver::getSyncStatus(Handle sh) { - auto* fence = handle_cast(sh); - FenceStatus status = fence->wait(0); - if (status == FenceStatus::TIMEOUT_EXPIRED) { - return SyncStatus::NOT_SIGNALED; - } else if (status == FenceStatus::CONDITION_SATISFIED) { - return SyncStatus::SIGNALED; - } - return SyncStatus::ERROR; + return mContext->timerQueryImpl->getQueryResult(tq, elapsedTime) ? + TimerQueryResult::AVAILABLE : TimerQueryResult::NOT_READY; } void MetalDriver::generateMipmaps(Handle th) { - ASSERT_PRECONDITION(!isInRenderPass(mContext), - "generateMipmaps must be called outside of a render pass."); + FILAMENT_CHECK_PRECONDITION(!isInRenderPass(mContext)) + << "generateMipmaps must be called outside of a render pass."; auto tex = handle_cast(th); tex->generateMipmaps(); -} -bool MetalDriver::canGenerateMipmaps() { - return true; + DEBUG_LOG("generateMipmaps(th = %d)\n", th.getId()); } -void MetalDriver::updateSamplerGroup(Handle sbh, BufferDescriptor&& data) { - ASSERT_PRECONDITION(!isInRenderPass(mContext), - "updateSamplerGroup must be called outside of a render pass."); - - auto sb = handle_cast(sbh); - assert_invariant(sb->size == data.size / sizeof(SamplerDescriptor)); - auto const* const samplers = (SamplerDescriptor const*) data.buffer; - -#ifndef NDEBUG - // In debug builds, verify that all the textures in the sampler group are still alive. - // These bugs lead to memory corruption and can be difficult to track down. - for (size_t s = 0; s < data.size / sizeof(SamplerDescriptor); s++) { - if (!samplers[s].t) { - continue; - } - auto iter = mContext->textures.find(handle_cast(samplers[s].t)); - if (iter == mContext->textures.end()) { - utils::slog.e << "updateSamplerGroup: texture #" - << (int) s << " is dead, texture handle = " - << samplers[s].t << utils::io::endl; - } - assert_invariant(iter != mContext->textures.end()); +void MetalDriver::compilePrograms(CompilerPriorityQueue priority, + CallbackHandler* handler, CallbackHandler::Callback callback, void* user) { + if (callback) { + mContext->shaderCompiler->notifyWhenAllProgramsAreReady(handler, callback, user); } -#endif - - // Create a MTLArgumentEncoder for these textures. - // Ideally, we would create this encoder at createSamplerGroup time, but we need to know the - // texture type of each texture. It's also not guaranteed that the types won't change between - // calls to updateSamplerGroup. - utils::FixedCapacityVector textureTypes(sb->size); - std::transform(samplers, samplers + data.size / sizeof(SamplerDescriptor), textureTypes.begin(), - [this](const SamplerDescriptor& sampler) { - if (!sampler.t) { - // Use Type2D for non-bound textures. - return MTLTextureType2D; - } - auto* t = handle_cast(sampler.t); - if (t->target == SamplerType::SAMPLER_EXTERNAL) { - // Use Type2D for external image textures. - return MTLTextureType2D; - } - id mtlTexture = t->getMtlTextureForRead(); - assert_invariant(mtlTexture); - return mtlTexture.textureType; - }); - auto& encoderCache = mContext->argumentEncoderCache; - id encoder = - encoderCache.getOrCreateState(ArgumentEncoderState(std::move(textureTypes))); - sb->reset(getPendingCommandBuffer(mContext), encoder, mContext->device); - - // In a perfect world, all the MTLTexture bindings would be known at updateSamplerGroup time. - // However, there are two special cases preventing this: - // 1. External images - // 2. LOD-clamped textures - // - // Both of these cases prevent us from knowing the final id that will be bound into - // the argument buffer representing the sampler group. So, we bind what we can now and wait - // until draw call time to bind any special cases (done in finalizeSamplerGroup). - // The good news is that once a render pass has started, the texture bindings won't change. - // A SamplerGroup is "finalized" when all of its textures have been set and is ready for use in - // a draw call. - // Even if we do know all the final textures at this point, we still wait until draw call time - // to call finalizeSamplerGroup, which has one additional responsibility: to call useResources - // for all the textures, which is required by Metal. - for (size_t s = 0; s < data.size / sizeof(SamplerDescriptor); s++) { - if (!samplers[s].t) { - // Assign a default texture / sampler to empty slots. - // Metal requires all samplers referenced in shaders to be bound. - id empty = getOrCreateEmptyTexture(mContext); - sb->setFinalizedTexture(s, empty); - - id sampler = mContext->samplerStateCache.getOrCreateState({}); - sb->setFinalizedSampler(s, sampler); - - continue; - } - - // First, bind the sampler state. We always know the full sampler state at - // updateSamplerGroup time. - SamplerState samplerState { - .samplerParams = samplers[s].s, - }; - id sampler = mContext->samplerStateCache.getOrCreateState(samplerState); - sb->setFinalizedSampler(s, sampler); - - sb->setTextureHandle(s, samplers[s].t); - - auto* t = handle_cast(samplers[s].t); - assert_invariant(t); - - // If this texture is an external texture, we defer binding the texture until draw call time - // (in finalizeSamplerGroup). - if (t->target == SamplerType::SAMPLER_EXTERNAL) { - continue; - } - - if (!t->allLodsValid()) { - // The texture doesn't have all of its LODs loaded, and this could change by the time we - // issue a draw call with this sampler group. So, we defer binding the texture until - // draw call time (in finalizeSamplerGroup). - continue; - } - - // If we get here, we know we have a valid MTLTexture that's guaranteed not to change. - id mtlTexture = t->getMtlTextureForRead(); - assert_invariant(mtlTexture); - sb->setFinalizedTexture(s, mtlTexture); - } - - scheduleDestroy(std::move(data)); } void MetalDriver::beginRenderPass(Handle rth, const RenderPassParams& params) { + DEBUG_LOG("beginRenderPass(rth = %d, params = {...})\n", rth.getId()); #if defined(FILAMENT_METAL_PROFILING) const char* renderPassName = "Unknown"; @@ -1000,14 +1290,41 @@ mContext->depthStencilState.invalidate(); mContext->cullModeState.invalidate(); mContext->windingState.invalidate(); + mContext->scissorRectState.invalidate(); + mContext->depthClampState.invalidate(); mContext->currentPolygonOffset = {0.0f, 0.0f}; - mContext->finalizedSamplerGroups.clear(); + mContext->finalizedDescriptorSets.clear(); + mContext->vertexDescriptorBindings.invalidate(); + mContext->fragmentDescriptorBindings.invalidate(); + mContext->computeDescriptorBindings.invalidate(); + mContext->dynamicOffsets.setDirty(true); + + // Finalize any descriptor sets that were bound before the render pass. + for (size_t i = 0; i < MAX_DESCRIPTOR_SET_COUNT; i++) { + auto* descriptorSet = mContext->currentDescriptorSets[i]; + if (!descriptorSet) { + continue; + } + descriptorSet->finalize(this); + mContext->finalizedDescriptorSets.insert(descriptorSet); + } + + // Bind descriptor sets. + mContext->vertexDescriptorBindings.bindBuffers( + mContext->currentRenderPassEncoder, DESCRIPTOR_SET_BINDING_START); + mContext->fragmentDescriptorBindings.bindBuffers( + mContext->currentRenderPassEncoder, DESCRIPTOR_SET_BINDING_START); + + for (auto& pc : mContext->currentPushConstants) { + pc.clear(); + } } void MetalDriver::nextSubpass(int dummy) {} void MetalDriver::endRenderPass(int dummy) { + DEBUG_LOG("endRenderPass()\n"); #if defined(FILAMENT_METAL_PROFILING) os_signpost_interval_end(mContext->log, OS_SIGNPOST_ID_EXCLUSIVE, "Render pass"); #endif @@ -1019,23 +1336,14 @@ mContext->currentRenderPassEncoder = nil; } -void MetalDriver::setRenderPrimitiveBuffer(Handle rph, +void MetalDriver::setRenderPrimitiveBuffer(Handle rph, PrimitiveType pt, Handle vbh, Handle ibh) { auto primitive = handle_cast(rph); auto vertexBuffer = handle_cast(vbh); auto indexBuffer = handle_cast(ibh); - primitive->setBuffers(vertexBuffer, indexBuffer); -} - -void MetalDriver::setRenderPrimitiveRange(Handle rph, - PrimitiveType pt, uint32_t offset, uint32_t minIndex, uint32_t maxIndex, - uint32_t count) { - auto primitive = handle_cast(rph); + MetalVertexBufferInfo const* const vbi = handle_cast(vertexBuffer->vbih); + primitive->setBuffers(vbi, vertexBuffer, indexBuffer); primitive->type = pt; - primitive->offset = offset * primitive->indexBuffer->elementSize; - primitive->count = count; - primitive->minIndex = minIndex; - primitive->maxIndex = maxIndex > minIndex ? maxIndex : primitive->maxVertexCount - 1; } void MetalDriver::makeCurrent(Handle schDraw, Handle schRead) { @@ -1056,114 +1364,21 @@ swapChain->releaseDrawable(); } -void MetalDriver::bindUniformBuffer(uint32_t index, Handle boh) { - assert_invariant(index < Program::UNIFORM_BINDING_COUNT); - auto* bo = handle_cast(boh); - auto* currentBo = mContext->uniformState[index].buffer; - if (currentBo) { - currentBo->boundUniformBuffers.unset(index); - } - bo->boundUniformBuffers.set(index); - mContext->uniformState[index] = BufferState{ - .buffer = bo, - .offset = 0, - .bound = true - }; -} - -void MetalDriver::bindBufferRange(BufferObjectBinding bindingType, uint32_t index, - Handle boh, uint32_t offset, uint32_t size) { - - assert_invariant(bindingType == BufferObjectBinding::SHADER_STORAGE || - bindingType == BufferObjectBinding::UNIFORM); - - auto* bo = handle_cast(boh); - - switch (bindingType) { - default: - case BufferObjectBinding::UNIFORM: { - assert_invariant(index < Program::UNIFORM_BINDING_COUNT); - auto* currentBo = mContext->uniformState[index].buffer; - if (currentBo) { - currentBo->boundUniformBuffers.unset(index); - } - bo->boundUniformBuffers.set(index); - mContext->uniformState[index] = BufferState { - .buffer = bo, - .offset = offset, - .bound = true - }; - - break; - } - - case BufferObjectBinding::SHADER_STORAGE: { - assert_invariant(index < MAX_SSBO_COUNT); - auto* currentBo = mContext->ssboState[index].buffer; - if (currentBo) { - currentBo->boundSsbos.unset(index); - } - bo->boundSsbos.set(index); - mContext->ssboState[index] = BufferState { - .buffer = bo, - .offset = offset, - .bound = true - }; - - break; - } - } -} - -void MetalDriver::unbindBuffer(BufferObjectBinding bindingType, uint32_t index) { - - assert_invariant(bindingType == BufferObjectBinding::SHADER_STORAGE || - bindingType == BufferObjectBinding::UNIFORM); - - switch (bindingType) { - default: - case BufferObjectBinding::UNIFORM: { - assert_invariant(index < Program::UNIFORM_BINDING_COUNT); - auto* currentBo = mContext->uniformState[index].buffer; - if (currentBo) { - currentBo->boundUniformBuffers.unset(index); - } - mContext->uniformState[index] = BufferState { - .buffer = nullptr, - .offset = 0, - .bound = false - }; - - break; - } - - case BufferObjectBinding::SHADER_STORAGE: { - assert_invariant(index < MAX_SSBO_COUNT); - auto* currentBo = mContext->ssboState[index].buffer; - if (currentBo) { - currentBo->boundSsbos.unset(index); - } - mContext->ssboState[index] = BufferState { - .buffer = nullptr, - .offset = 0, - .bound = false - }; - - break; - } - } -} - -void MetalDriver::bindSamplers(uint32_t index, Handle sbh) { - auto sb = handle_cast(sbh); - mContext->samplerBindings[index] = sb; +void MetalDriver::setPushConstant(backend::ShaderStage stage, uint8_t index, + backend::PushConstantVariant value) { + FILAMENT_CHECK_PRECONDITION(isInRenderPass(mContext)) + << "setPushConstant must be called inside a render pass."; + assert_invariant(static_cast(stage) < mContext->currentPushConstants.size()); + MetalPushConstantBuffer& pushConstants = + mContext->currentPushConstants[static_cast(stage)]; + pushConstants.setPushConstant(value, index); } -void MetalDriver::insertEventMarker(const char* string, uint32_t len) { +void MetalDriver::insertEventMarker(const char* string) { } -void MetalDriver::pushGroupMarker(const char* string, uint32_t len) { +void MetalDriver::pushGroupMarker(const char* string) { mContext->groupMarkers.push(string); } @@ -1179,7 +1394,7 @@ if (@available(iOS 13, *)) { MTLCaptureDescriptor* descriptor = [MTLCaptureDescriptor new]; descriptor.captureObject = mContext->device; -#if defined(IOS) +#if defined(FILAMENT_IOS) descriptor.destination = MTLCaptureDestinationDeveloperTools; #else descriptor.destination = MTLCaptureDestinationGPUTraceDocument; @@ -1209,8 +1424,8 @@ void MetalDriver::readPixels(Handle src, uint32_t x, uint32_t y, uint32_t width, uint32_t height, PixelBufferDescriptor&& data) { - ASSERT_PRECONDITION(!isInRenderPass(mContext), - "readPixels must be called outside of a render pass."); + FILAMENT_CHECK_PRECONDITION(!isInRenderPass(mContext)) + << "readPixels must be called outside of a render pass."; auto srcTarget = handle_cast(src); // We always readPixels from the COLOR0 attachment. @@ -1224,24 +1439,26 @@ width = std::min(static_cast(srcTextureSize.width), width); const MTLPixelFormat format = getMetalFormat(data.format, data.type); - ASSERT_PRECONDITION(format != MTLPixelFormatInvalid, - "The chosen combination of PixelDataFormat (%d) and PixelDataType (%d) is not supported for " - "readPixels.", (int) data.format, (int) data.type); + FILAMENT_CHECK_PRECONDITION(format != MTLPixelFormatInvalid) + << "The chosen combination of PixelDataFormat (" << (int)data.format + << ") and PixelDataType (" << (int)data.type + << ") is not supported for " + "readPixels."; const bool formatConversionNecessary = srcTexture.pixelFormat != format; // TODO: MetalBlitter does not currently support format conversions to integer types. // The format and type must match the source pixel format exactly. - ASSERT_PRECONDITION(!formatConversionNecessary || !isMetalFormatInteger(format), - "readPixels does not support integer format conversions from MTLPixelFormat (%d) to (%d).", - (int) srcTexture.pixelFormat, (int) format); + FILAMENT_CHECK_PRECONDITION(!formatConversionNecessary || !isMetalFormatInteger(format)) + << "readPixels does not support integer format conversions from MTLPixelFormat (" + << (int)srcTexture.pixelFormat << ") to (" << (int)format << ")."; MTLTextureDescriptor* textureDescriptor = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:format width:srcTextureSize.width height:srcTextureSize.height mipmapped:NO]; -#if defined(IOS) +#if defined(FILAMENT_IOS) textureDescriptor.storageMode = MTLStorageModeShared; #else textureDescriptor.storageMode = MTLStorageModeManaged; @@ -1249,18 +1466,18 @@ textureDescriptor.usage = MTLTextureUsageShaderWrite | MTLTextureUsageRenderTarget; id readPixelsTexture = [mContext->device newTextureWithDescriptor:textureDescriptor]; - MetalBlitter::BlitArgs args; + MetalBlitter::BlitArgs args{}; args.filter = SamplerMagFilter::NEAREST; args.source.level = miplevel; args.source.region = MTLRegionMake2D(0, 0, srcTexture.width >> miplevel, srcTexture.height >> miplevel); + args.source.texture = srcTexture; args.destination.level = 0; args.destination.region = MTLRegionMake2D(0, 0, readPixelsTexture.width, readPixelsTexture.height); - args.source.color = srcTexture; - args.destination.color = readPixelsTexture; + args.destination.texture = readPixelsTexture; mContext->blitter->blit(getPendingCommandBuffer(mContext), args, "readPixels blit"); -#if !defined(IOS) +#if !defined(FILAMENT_IOS) // Managed textures on macOS require explicit synchronization between GPU / CPU. id blitEncoder = [getPendingCommandBuffer(mContext) blitCommandEncoder]; [blitEncoder synchronizeResource:readPixelsTexture]; @@ -1282,6 +1499,7 @@ fromRegion:srcRegion mipmapLevel:0]; scheduleDestroy(std::move(*p)); + delete p; }]; } @@ -1291,191 +1509,189 @@ scheduleDestroy(std::move(p)); } -void MetalDriver::blit(TargetBufferFlags buffers, - Handle dst, Viewport dstRect, - Handle src, Viewport srcRect, - SamplerMagFilter filter) { - // If we're the in middle of a render pass, finish it. - // This condition should only occur during copyFrame. It's okay to end the render pass because - // we don't issue any other rendering commands. - if (mContext->currentRenderPassEncoder) { - [mContext->currentRenderPassEncoder endEncoding]; - mContext->currentRenderPassEncoder = nil; - } +void MetalDriver::resolve( + Handle dst, uint8_t srcLevel, uint8_t srcLayer, + Handle src, uint8_t dstLevel, uint8_t dstLayer) { + auto* const srcTexture = handle_cast(src); + auto* const dstTexture = handle_cast(dst); + assert_invariant(srcTexture); + assert_invariant(dstTexture); - auto srcTarget = handle_cast(src); - auto dstTarget = handle_cast(dst); + FILAMENT_CHECK_PRECONDITION(mContext->currentRenderPassEncoder == nil) + << "resolve() cannot be invoked inside a render pass."; - ASSERT_PRECONDITION( - !(buffers & (TargetBufferFlags::COLOR_ALL & ~TargetBufferFlags::COLOR0)), - "Blitting only supports COLOR0"); + FILAMENT_CHECK_PRECONDITION( + dstTexture->width == srcTexture->width && dstTexture->height == srcTexture->height) + << "invalid resolve: src and dst sizes don't match"; - ASSERT_PRECONDITION(srcRect.left >= 0 && srcRect.bottom >= 0 && - dstRect.left >= 0 && dstRect.bottom >= 0, - "Source and destination rects must be positive."); + FILAMENT_CHECK_PRECONDITION(srcTexture->samples > 1 && dstTexture->samples == 1) + << "invalid resolve: src.samples=" << +srcTexture->samples + << ", dst.samples=" << +dstTexture->samples; - auto isBlitableTextureType = [](MTLTextureType t) { + FILAMENT_CHECK_PRECONDITION(srcTexture->format == dstTexture->format) + << "src and dst texture format don't match"; + + FILAMENT_CHECK_PRECONDITION(!isDepthFormat(srcTexture->format)) + << "can't resolve depth formats"; + + FILAMENT_CHECK_PRECONDITION(!isStencilFormat(srcTexture->format)) + << "can't resolve stencil formats"; + + FILAMENT_CHECK_PRECONDITION(any(dstTexture->usage & TextureUsage::BLIT_DST)) + << "texture doesn't have BLIT_DST"; + + FILAMENT_CHECK_PRECONDITION(any(srcTexture->usage & TextureUsage::BLIT_SRC)) + << "texture doesn't have BLIT_SRC"; + + // FIXME: on metal the blit() call below always take the slow path (using a shader) + + blit( dst, dstLevel, dstLayer, {}, + src, srcLevel, srcLayer, {}, + { dstTexture->width, dstTexture->height }); +} + +void MetalDriver::blit( + Handle dst, uint8_t srcLevel, uint8_t srcLayer, math::uint2 dstOrigin, + Handle src, uint8_t dstLevel, uint8_t dstLayer, math::uint2 srcOrigin, + math::uint2 size) { + + + auto isBlitableTextureType = [](MTLTextureType t) -> bool { return t == MTLTextureType2D || t == MTLTextureType2DMultisample || t == MTLTextureType2DArray; }; - // MetalBlitter supports blitting color and depth simultaneously, but for simplicitly we'll blit - // them separately. In practice, Filament only ever blits a single buffer at a time anyway. - - if (any(buffers & TargetBufferFlags::COLOR_ALL)) { - // We always blit from/to the COLOR0 attachment. - MetalRenderTarget::Attachment srcColorAttachment = srcTarget->getReadColorAttachment(0); - MetalRenderTarget::Attachment dstColorAttachment = dstTarget->getDrawColorAttachment(0); - - if (srcColorAttachment && dstColorAttachment) { - ASSERT_PRECONDITION(isBlitableTextureType(srcColorAttachment.getTexture().textureType) && - isBlitableTextureType(dstColorAttachment.getTexture().textureType), - "Metal does not support blitting to/from non-2D textures."); - - MetalBlitter::BlitArgs args; - args.filter = filter; - args.source.region = srcTarget->getRegionFromClientRect(srcRect); - args.destination.region = dstTarget->getRegionFromClientRect(dstRect); - args.source.color = srcColorAttachment.getTexture(); - args.destination.color = dstColorAttachment.getTexture(); - args.source.level = srcColorAttachment.level; - args.destination.level = dstColorAttachment.level; - args.source.slice = srcColorAttachment.layer; - args.destination.slice = dstColorAttachment.layer; - mContext->blitter->blit(getPendingCommandBuffer(mContext), args, "Color blit"); - } - } + auto* const srcTexture = handle_cast(src); + auto* const dstTexture = handle_cast(dst); + assert_invariant(srcTexture); + assert_invariant(dstTexture); - if (any(buffers & TargetBufferFlags::DEPTH)) { - MetalRenderTarget::Attachment srcDepthAttachment = srcTarget->getDepthAttachment(); - MetalRenderTarget::Attachment dstDepthAttachment = dstTarget->getDepthAttachment(); - - if (srcDepthAttachment && dstDepthAttachment) { - ASSERT_PRECONDITION(isBlitableTextureType(srcDepthAttachment.getTexture().textureType) && - isBlitableTextureType(dstDepthAttachment.getTexture().textureType), - "Metal does not support blitting to/from non-2D textures."); - - MetalBlitter::BlitArgs args; - args.filter = filter; - args.source.region = srcTarget->getRegionFromClientRect(srcRect); - args.destination.region = dstTarget->getRegionFromClientRect(dstRect); - args.source.depth = srcDepthAttachment.getTexture(); - args.destination.depth = dstDepthAttachment.getTexture(); - args.source.level = srcDepthAttachment.level; - args.destination.level = dstDepthAttachment.level; - args.source.slice = srcDepthAttachment.layer; - args.destination.slice = dstDepthAttachment.layer; - mContext->blitter->blit(getPendingCommandBuffer(mContext), args, "Depth blit"); - } - } + FILAMENT_CHECK_PRECONDITION(mContext->currentRenderPassEncoder == nil) + << "blit() cannot be invoked inside a render pass."; + + FILAMENT_CHECK_PRECONDITION(any(dstTexture->usage & TextureUsage::BLIT_DST)) + << "texture doesn't have BLIT_DST"; + + FILAMENT_CHECK_PRECONDITION(any(srcTexture->usage & TextureUsage::BLIT_SRC)) + << "texture doesn't have BLIT_SRC"; + + FILAMENT_CHECK_PRECONDITION(srcTexture->format == dstTexture->format) + << "src and dst texture format don't match"; + + FILAMENT_CHECK_PRECONDITION( + isBlitableTextureType(srcTexture->getMtlTextureForRead().textureType) && + isBlitableTextureType(dstTexture->getMtlTextureForWrite().textureType)) + << "Metal does not support blitting to/from non-2D textures."; + + MetalBlitter::BlitArgs args{}; + args.filter = SamplerMagFilter::NEAREST; + args.source.region = MTLRegionMake2D( + (NSUInteger)srcOrigin.x, + std::max(srcTexture->height - (int64_t)srcOrigin.y - size.y, (int64_t)0), + size.x, size.y); + args.destination.region = MTLRegionMake2D( + (NSUInteger)dstOrigin.x, + std::max(dstTexture->height - (int64_t)dstOrigin.y - size.y, (int64_t)0), + size.x, size.y); + + // FIXME: we shouldn't need to know the type here. This is an artifact of using the old API. + + args.source.texture = srcTexture->getMtlTextureForRead(); + args.destination.texture = dstTexture->getMtlTextureForWrite(); + args.source.level = srcLevel; + args.source.slice = srcLayer; + args.destination.level = dstLevel; + args.destination.slice = dstLayer; + + // TODO: The blit() call below always take the fast path. + + mContext->blitter->blit(getPendingCommandBuffer(mContext), args, "blit/resolve"); + + DEBUG_LOG( + "blit(dst = %d, srcLevel = %d, srcLayer = %d, dstOrigin = (%d, %d), src = %d, dstLevel " + "= %d, dstLayer = %d, srcOrigin = (%d, %d), size = (%d, %d))\n", + dst.getId(), srcLevel, srcLayer, dstOrigin.x, dstOrigin.y, src.getId(), dstLevel, + dstLayer, srcOrigin.x, srcOrigin.y, size.x, size.y); } -void MetalDriver::finalizeSamplerGroup(MetalSamplerGroup* samplerGroup) { - // All of the id objects have already been bound to the argument buffer. - // Here we bind any textures that were unable to be bound in updateSamplerGroup. +void MetalDriver::blitDEPRECATED(TargetBufferFlags buffers, + Handle dst, Viewport dstRect, + Handle src, Viewport srcRect, + SamplerMagFilter filter) { - id cmdBuffer = getPendingCommandBuffer(mContext); + // Note: blitDEPRECATED is only used by Renderer::copyFrame + // It is called between beginFrame and endFrame, but should never be called in the middle of + // a render pass. -#ifndef NDEBUG - // In debug builds, verify that all the textures in the sampler group are still alive. - // These bugs lead to memory corruption and can be difficult to track down. - const auto& handles = samplerGroup->getTextureHandles(); - for (size_t s = 0; s < handles.size(); s++) { - if (!handles[s]) { - continue; - } - auto iter = mContext->textures.find(handle_cast(handles[s])); - if (iter == mContext->textures.end()) { - utils::slog.e << "finalizeSamplerGroup: texture #" - << (int) s << " is dead, texture handle = " - << handles[s] << utils::io::endl; - } - assert_invariant(iter != mContext->textures.end()); - } -#endif + FILAMENT_CHECK_PRECONDITION(mContext->currentRenderPassEncoder == nil) + << "blitDEPRECATED() cannot be invoked inside a render pass."; - for (size_t binding = 0; binding < samplerGroup->size; binding++) { - auto [th, t] = samplerGroup->getFinalizedTexture(binding); + auto srcTarget = handle_cast(src); + auto dstTarget = handle_cast(dst); - // This may be an external texture, in which case we can't cache the id, we - // need to refetch it in case the external image has changed. - bool isExternalImage = false; - if (th) { - auto* texture = handle_cast(th); - isExternalImage = texture->target == SamplerType::SAMPLER_EXTERNAL; - } + FILAMENT_CHECK_PRECONDITION(buffers == TargetBufferFlags::COLOR0) + << "blitDEPRECATED only supports COLOR0"; - // If t is non-nil, then we've already finalized this texture. - if (t && !isExternalImage) { - continue; - } + FILAMENT_CHECK_PRECONDITION( + srcRect.left >= 0 && srcRect.bottom >= 0 && dstRect.left >= 0 && dstRect.bottom >= 0) + << "Source and destination rects must be positive."; - // It's possible that some texture handles are null, but we should have already handled - // these inside updateSamplerGroup by binding an "empty" texture. - assert_invariant(th); - auto* texture = handle_cast(th); - - // Determine if this SamplerGroup needs mutation. - // We can't just simply mutate the SamplerGroup, since it could currently be in use by the - // GPU from a prior render pass. - // If the SamplerGroup does need mutation, then there's two cases: - // 1. The SamplerGroup has not been finalized yet (which means it has not yet been used in a - // draw call). We're free to mutate it. - // 2. The SamplerGroup is finalized. We must call mutate(), which will create a new argument - // buffer that we can then mutate freely. - // TODO: don't just always call mutate, check to see if the texture is actually different. - - if (samplerGroup->isFinalized()) { - samplerGroup->mutate(cmdBuffer); - } + auto isBlitableTextureType = [](MTLTextureType t) { + return t == MTLTextureType2D || t == MTLTextureType2DMultisample || + t == MTLTextureType2DArray; + }; - // External images - if (texture->target == SamplerType::SAMPLER_EXTERNAL) { - if (texture->externalImage.isValid()) { - id mtlTexture = texture->externalImage.getMetalTextureForDraw(); - assert_invariant(mtlTexture); - samplerGroup->setFinalizedTexture(binding, mtlTexture); - } else { - // Bind an empty texture. - samplerGroup->setFinalizedTexture(binding, getOrCreateEmptyTexture(mContext)); - } - continue; - } + // We always blit from/to the COLOR0 attachment. + MetalRenderTarget::Attachment const srcColorAttachment = srcTarget->getReadColorAttachment(0); + MetalRenderTarget::Attachment const dstColorAttachment = dstTarget->getDrawColorAttachment(0); - samplerGroup->setFinalizedTexture(binding, texture->getMtlTextureForRead()); - } + if (srcColorAttachment && dstColorAttachment) { + FILAMENT_CHECK_PRECONDITION( + isBlitableTextureType(srcColorAttachment.getTexture().textureType) && + isBlitableTextureType(dstColorAttachment.getTexture().textureType)) + << "Metal does not support blitting to/from non-2D textures."; - samplerGroup->finalize(); + MetalBlitter::BlitArgs args{}; + args.filter = filter; + args.source.region = srcTarget->getRegionFromClientRect(srcRect); + args.source.texture = srcColorAttachment.getTexture(); + args.source.level = srcColorAttachment.level; + args.source.slice = srcColorAttachment.layer; - // At this point, all the id should be set to valid textures. Some of them will be - // the "empty" texture. Per Apple documentation, the useResource method must be called once per - // render pass. - samplerGroup->useResources(mContext->currentRenderPassEncoder); + args.destination.region = dstTarget->getRegionFromClientRect(dstRect); + args.destination.texture = dstColorAttachment.getTexture(); + args.destination.level = dstColorAttachment.level; + args.destination.slice = dstColorAttachment.layer; - // useResources won't retain references to the textures, so we need to do so manually. - for (id texture : samplerGroup->textures) { - const void* retainedTexture = CFBridgingRetain(texture); - [cmdBuffer addCompletedHandler:^(id cb) { - CFBridgingRelease(retainedTexture); - }]; + mContext->blitter->blit(getPendingCommandBuffer(mContext), args, "blitDEPRECATED"); } } -void MetalDriver::draw(PipelineState ps, Handle rph, uint32_t instanceCount) { - ASSERT_PRECONDITION(mContext->currentRenderPassEncoder != nullptr, - "Attempted to draw without a valid command encoder."); - auto primitive = handle_cast(rph); +void MetalDriver::bindPipeline(PipelineState const& ps) { + FILAMENT_CHECK_PRECONDITION(mContext->currentRenderPassEncoder != nullptr) + << "bindPipeline() without a valid command encoder."; + DEBUG_LOG("bindPipeline(ps = { program = %d }))\n", ps.program.getId()); + + MetalVertexBufferInfo const* const vbi = + handle_cast(ps.vertexBufferInfo); + auto program = handle_cast(ps.program); const auto& rs = ps.rasterState; + // This might block until the shader compilation has finished. + auto functions = program->getFunctions(); + // If the material debugger is enabled, avoid fatal (or cascading) errors and that can occur // during the draw call when the program is invalid. The shader compile error has already been // dumped to the console at this point, so it's fine to simply return early. - if (FILAMENT_ENABLE_MATDBG && UTILS_UNLIKELY(!program->isValid)) { + if (FILAMENT_ENABLE_MATDBG && UTILS_UNLIKELY(!functions)) { + mContext->validPipelineBound = false; return; } - ASSERT_PRECONDITION(program->isValid, "Attempting to draw with an invalid Metal program."); + functions.validate(); + + auto [fragment, vertex] = functions.getRasterFunctions(); // Pipeline state MTLPixelFormat colorPixelFormat[MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT] = { MTLPixelFormatInvalid }; @@ -1497,10 +1713,10 @@ stencilPixelFormat = stencilAttachment.getPixelFormat(); assert_invariant(isMetalFormatStencil(stencilPixelFormat)); } - MetalPipelineState pipelineState { - .vertexFunction = program->vertexFunction, - .fragmentFunction = program->fragmentFunction, - .vertexDescription = primitive->vertexDescription, + MetalPipelineState const pipelineState { + .vertexFunction = vertex, + .fragmentFunction = fragment, + .vertexDescription = vbi->vertexDescription, .colorAttachmentPixelFormat = { colorPixelFormat[0], colorPixelFormat[1], @@ -1515,13 +1731,13 @@ .stencilAttachmentPixelFormat = stencilPixelFormat, .sampleCount = mContext->currentRenderTarget->getSamples(), .blendState = BlendState { - .blendingEnabled = rs.hasBlending(), - .rgbBlendOperation = getMetalBlendOperation(rs.blendEquationRGB), .alphaBlendOperation = getMetalBlendOperation(rs.blendEquationAlpha), - .sourceRGBBlendFactor = getMetalBlendFactor(rs.blendFunctionSrcRGB), - .sourceAlphaBlendFactor = getMetalBlendFactor(rs.blendFunctionSrcAlpha), + .rgbBlendOperation = getMetalBlendOperation(rs.blendEquationRGB), + .destinationAlphaBlendFactor = getMetalBlendFactor(rs.blendFunctionDstAlpha), .destinationRGBBlendFactor = getMetalBlendFactor(rs.blendFunctionDstRGB), - .destinationAlphaBlendFactor = getMetalBlendFactor(rs.blendFunctionDstAlpha) + .sourceAlphaBlendFactor = getMetalBlendFactor(rs.blendFunctionSrcAlpha), + .sourceRGBBlendFactor = getMetalBlendFactor(rs.blendFunctionSrcRGB), + .blendingEnabled = rs.hasBlending(), }, .colorWrite = rs.colorWrite }; @@ -1547,6 +1763,15 @@ [mContext->currentRenderPassEncoder setFrontFacingWinding:winding]; } + // depth clip mode + if (mContext->supportsDepthClamp) { + MTLDepthClipMode depthClipMode = rs.depthClamp ? MTLDepthClipModeClamp : MTLDepthClipModeClip; + mContext->depthClampState.updateState(depthClipMode); + if (mContext->depthClampState.stateChanged()) { + [mContext->currentRenderPassEncoder setDepthClipMode:depthClipMode]; + } + } + // Set the depth-stencil state, if a state change is needed. DepthStencilState depthState; if (depthAttachment) { @@ -1594,144 +1819,177 @@ mContext->currentPolygonOffset = ps.polygonOffset; } - // Set scissor-rectangle. - // In order to do this, we compute the intersection between: - // 1. the scissor rectangle - // 2. the render target attachment dimensions (important, as the scissor can't be set larger) - // fmax/min are used below to guard against NaN and because the MTLViewport/MTLRegion - // coordinates are doubles. - MTLRegion scissor = mContext->currentRenderTarget->getRegionFromClientRect(ps.scissor); - const float sleft = scissor.origin.x, sright = scissor.origin.x + scissor.size.width; - const float stop = scissor.origin.y, sbottom = scissor.origin.y + scissor.size.height; + mContext->validPipelineBound = true; +} - // Attachment extent - const auto attachmentSize = mContext->currentRenderTarget->getAttachmentSize(); - const float aleft = 0.0f, atop = 0.0f; - const float aright = static_cast(attachmentSize.x); - const float abottom = static_cast(attachmentSize.y); +void MetalDriver::bindRenderPrimitive(Handle rph) { + FILAMENT_CHECK_PRECONDITION(mContext->currentRenderPassEncoder != nullptr) + << "bindRenderPrimitive() without a valid command encoder."; - const auto left = std::fmax(sleft, aleft); - const auto right = std::fmin(sright, aright); - const auto top = std::fmax(stop, atop); - const auto bottom = std::fmin(sbottom, abottom); + // Bind the user vertex buffers. + MetalBuffer* vertexBuffers[MAX_VERTEX_BUFFER_COUNT] = {}; + size_t vertexBufferOffsets[MAX_VERTEX_BUFFER_COUNT] = {}; + size_t maxBufferIndex = 0; - MTLScissorRect scissorRect = { - .x = static_cast(left), - .y = static_cast(top), - .width = static_cast(right - left), - .height = static_cast(bottom - top) - }; + MetalRenderPrimitive const* const primitive = handle_cast(rph); + MetalVertexBufferInfo const* const vbi = + handle_cast(primitive->vertexBuffer->vbih); - [mContext->currentRenderPassEncoder setScissorRect:scissorRect]; + mContext->currentRenderPrimitive = rph; - // Bind uniform buffers. - MetalBuffer* uniformsToBind[Program::UNIFORM_BINDING_COUNT] = { nil }; - NSUInteger offsets[Program::UNIFORM_BINDING_COUNT] = { 0 }; + auto vb = primitive->vertexBuffer; + for (auto m : vbi->bufferMapping) { + assert_invariant( + m.bufferArgumentIndex >= USER_VERTEX_BUFFER_BINDING_START && + m.bufferArgumentIndex < USER_VERTEX_BUFFER_BINDING_START + MAX_VERTEX_BUFFER_COUNT); + size_t const vertexBufferIndex = m.bufferArgumentIndex - USER_VERTEX_BUFFER_BINDING_START; + vertexBuffers[vertexBufferIndex] = vb->buffers[m.sourceBufferIndex]; + maxBufferIndex = std::max(maxBufferIndex, vertexBufferIndex); + } - enumerateBoundBuffers(BufferObjectBinding::UNIFORM, - [&uniformsToBind, &offsets](const BufferState& state, MetalBuffer* buffer, - uint32_t index) { - uniformsToBind[index] = buffer; - offsets[index] = state.offset; - }); + const auto bufferCount = maxBufferIndex + 1; MetalBuffer::bindBuffers(getPendingCommandBuffer(mContext), mContext->currentRenderPassEncoder, - UNIFORM_BUFFER_BINDING_START, MetalBuffer::Stage::VERTEX | MetalBuffer::Stage::FRAGMENT, - uniformsToBind, offsets, Program::UNIFORM_BINDING_COUNT); + USER_VERTEX_BUFFER_BINDING_START, MetalBuffer::Stage::VERTEX, vertexBuffers, + vertexBufferOffsets, bufferCount); - // Bind sampler groups (argument buffers). - for (size_t s = 0; s < Program::SAMPLER_BINDING_COUNT; s++) { - MetalSamplerGroup* const samplerGroup = mContext->samplerBindings[s]; - if (!samplerGroup) { - continue; - } - const auto& stageFlags = program->samplerGroupInfo[s].stageFlags; - if (stageFlags == ShaderStageFlags::NONE) { - continue; - } + // Bind the zero buffer, used for missing vertex attributes. + static const char bytes[16] = { 0 }; + [mContext->currentRenderPassEncoder setVertexBytes:bytes + length:16 + atIndex:ZERO_VERTEX_BUFFER_BINDING]; +} - auto iter = mContext->finalizedSamplerGroups.find(samplerGroup); - if (iter == mContext->finalizedSamplerGroups.end()) { - finalizeSamplerGroup(samplerGroup); - mContext->finalizedSamplerGroups.insert(samplerGroup); - } +void MetalDriver::bindDescriptorSet( + backend::DescriptorSetHandle dsh, + backend::descriptor_set_t set, + backend::DescriptorSetOffsetArray&& offsets) { - assert_invariant(samplerGroup->getArgumentBuffer()); + if (UTILS_UNLIKELY(!dsh)) { + DEBUG_LOG("bindDescriptorSet(dsh = null, set = %d, offsets = [])\n", set); + mContext->currentDescriptorSets[set] = nullptr; + mContext->vertexDescriptorBindings.setBuffer(nil, 0, set); + mContext->fragmentDescriptorBindings.setBuffer(nil, 0, set); + mContext->dynamicOffsets.setOffsets(set, nullptr, 0); + return; + } - if (uint8_t(stageFlags) & uint8_t(ShaderStageFlags::VERTEX)) { - [mContext->currentRenderPassEncoder setVertexBuffer:samplerGroup->getArgumentBuffer() - offset:samplerGroup->getArgumentBufferOffset() - atIndex:(SAMPLER_GROUP_BINDING_START + s)]; + auto descriptorSet = handle_cast(dsh); + const size_t dynamicBindings = descriptorSet->layout->getDynamicOffsetCount(); + utils::FixedCapacityVector offsetsVector(dynamicBindings, 0); +#if FILAMENT_METAL_DEBUG_LOG == 1 + printf("[METAL DEBUG] bindDescriptorSet(dsh = %d, set = %d, offsets = [", dsh.getId(), set); + for (size_t i = 0; i < dynamicBindings; i++) { + printf("%d", offsets[i]); + if (i < dynamicBindings - 1) { + printf(", "); } - if (uint8_t(stageFlags) & uint8_t(ShaderStageFlags::FRAGMENT)) { - [mContext->currentRenderPassEncoder setFragmentBuffer:samplerGroup->getArgumentBuffer() - offset:samplerGroup->getArgumentBufferOffset() - atIndex:(SAMPLER_GROUP_BINDING_START + s)]; + + offsetsVector[i] = offsets[i]; + } + printf("])\n"); +#endif + + // Bind the descriptor set. + mContext->currentDescriptorSets[set] = descriptorSet; + mContext->vertexDescriptorBindings.setBuffer( + descriptorSet->finalizeAndGetBuffer(this, ShaderStage::VERTEX), 0, set); + mContext->fragmentDescriptorBindings.setBuffer( + descriptorSet->finalizeAndGetBuffer(this, ShaderStage::FRAGMENT), 0, set); + mContext->dynamicOffsets.setOffsets(set, offsets.data(), dynamicBindings); + + // If we're inside a render pass, we should also finalize the descriptor set and update the + // argument buffers. Otherwise, we'll do this the next time we enter a render pass. + if (isInRenderPass(mContext)) { + auto found = mContext->finalizedDescriptorSets.find(descriptorSet); + if (found == mContext->finalizedDescriptorSets.end()) { + descriptorSet->finalize(this); + mContext->finalizedDescriptorSets.insert(descriptorSet); } + mContext->vertexDescriptorBindings.bindBuffers( + mContext->currentRenderPassEncoder, DESCRIPTOR_SET_BINDING_START); + mContext->fragmentDescriptorBindings.bindBuffers( + mContext->currentRenderPassEncoder, DESCRIPTOR_SET_BINDING_START); } +} - // Bind the user vertex buffers. +void MetalDriver::draw2(uint32_t indexOffset, uint32_t indexCount, uint32_t instanceCount) { + FILAMENT_CHECK_PRECONDITION(mContext->currentRenderPassEncoder != nullptr) + << "draw() without a valid command encoder."; + DEBUG_LOG("draw2(...)\n"); - MetalBuffer* buffers[MAX_VERTEX_BUFFER_COUNT] = {}; - size_t vertexBufferOffsets[MAX_VERTEX_BUFFER_COUNT] = {}; - size_t bufferIndex = 0; + if (FILAMENT_ENABLE_MATDBG && UTILS_UNLIKELY(!mContext->validPipelineBound)) { + return; + } - auto vb = primitive->vertexBuffer; - for (uint32_t attributeIndex = 0; attributeIndex < vb->attributes.size(); attributeIndex++) { - const auto& attribute = vb->attributes[attributeIndex]; - if (attribute.buffer == Attribute::BUFFER_UNUSED) { - continue; - } + // Bind the offset data. + if (mContext->dynamicOffsets.isDirty()) { + const auto [size, data] = mContext->dynamicOffsets.getOffsets(); + [mContext->currentRenderPassEncoder setFragmentBytes:data + length:size * sizeof(uint32_t) + atIndex:DYNAMIC_OFFSET_BINDING]; + [mContext->currentRenderPassEncoder setVertexBytes:data + length:size * sizeof(uint32_t) + atIndex:DYNAMIC_OFFSET_BINDING]; + mContext->dynamicOffsets.setDirty(false); + } - assert_invariant(vb->buffers[attribute.buffer]); - buffers[bufferIndex] = vb->buffers[attribute.buffer]; - vertexBufferOffsets[bufferIndex] = attribute.offset; - bufferIndex++; + // Update push constants. + for (size_t i = 0; i < Program::SHADER_TYPE_COUNT; i++) { + auto& pushConstants = mContext->currentPushConstants[i]; + if (UTILS_UNLIKELY(pushConstants.isDirty())) { + pushConstants.setBytes(mContext->currentRenderPassEncoder, static_cast(i)); + } } - const auto bufferCount = bufferIndex; - MetalBuffer::bindBuffers(getPendingCommandBuffer(mContext), mContext->currentRenderPassEncoder, - USER_VERTEX_BUFFER_BINDING_START, MetalBuffer::Stage::VERTEX, buffers, - vertexBufferOffsets, bufferCount); - - // Bind the zero buffer, used for missing vertex attributes. - static const char bytes[16] = { 0 }; - [mContext->currentRenderPassEncoder setVertexBytes:bytes - length:16 - atIndex:ZERO_VERTEX_BUFFER_BINDING]; + auto primitive = handle_cast(mContext->currentRenderPrimitive); MetalIndexBuffer* indexBuffer = primitive->indexBuffer; - id cmdBuffer = getPendingCommandBuffer(mContext); - id metalIndexBuffer = indexBuffer->buffer.getGpuBufferForDraw(cmdBuffer); + id metalIndexBuffer = indexBuffer->buffer.getGpuBufferForDraw(); [mContext->currentRenderPassEncoder drawIndexedPrimitives:getMetalPrimitiveType(primitive->type) - indexCount:primitive->count + indexCount:indexCount indexType:getIndexType(indexBuffer->elementSize) indexBuffer:metalIndexBuffer - indexBufferOffset:primitive->offset + indexBufferOffset:indexOffset * primitive->indexBuffer->elementSize instanceCount:instanceCount]; } +void MetalDriver::draw(PipelineState ps, Handle rph, + uint32_t const indexOffset, uint32_t const indexCount, uint32_t const instanceCount) { + MetalRenderPrimitive const* const rp = handle_cast(rph); + ps.primitiveType = rp->type; + ps.vertexBufferInfo = rp->vertexBuffer->vbih; + bindPipeline(ps); + bindRenderPrimitive(rph); + draw2(indexOffset, indexCount, instanceCount); +} + void MetalDriver::dispatchCompute(Handle program, math::uint3 workGroupCount) { - ASSERT_PRECONDITION(!isInRenderPass(mContext), - "dispatchCompute must be called outside of a render pass."); + FILAMENT_CHECK_PRECONDITION(!isInRenderPass(mContext)) + << "dispatchCompute must be called outside of a render pass."; auto mtlProgram = handle_cast(program); + // This might block until the shader compilation has finished. + auto functions = mtlProgram->getFunctions(); + // If the material debugger is enabled, avoid fatal (or cascading) errors and that can occur // during the draw call when the program is invalid. The shader compile error has already been // dumped to the console at this point, so it's fine to simply return early. - if (FILAMENT_ENABLE_MATDBG && UTILS_UNLIKELY(!mtlProgram->isValid)) { + if (FILAMENT_ENABLE_MATDBG && UTILS_UNLIKELY(!functions)) { return; } - assert_invariant(mtlProgram->isValid && mtlProgram->computeFunction); + auto compute = functions.getComputeFunction(); + + assert_invariant(bool(functions) && compute); id computeEncoder = [getPendingCommandBuffer(mContext) computeCommandEncoder]; NSError* error = nil; id computePipelineState = - [mContext->device newComputePipelineStateWithFunction:mtlProgram->computeFunction + [mContext->device newComputePipelineStateWithFunction:compute error:&error]; if (error) { auto description = [error.localizedDescription cStringUsingEncoding:NSUTF8StringEncoding]; @@ -1739,31 +1997,6 @@ } assert_invariant(!error); - // Bind uniform buffers. - MetalBuffer* uniformsToBind[Program::UNIFORM_BINDING_COUNT] = { nil }; - NSUInteger uniformOffsets[Program::UNIFORM_BINDING_COUNT] = { 0 }; - enumerateBoundBuffers(BufferObjectBinding::UNIFORM, - [&uniformsToBind, &uniformOffsets](const BufferState& state, MetalBuffer* buffer, - uint32_t index) { - uniformsToBind[index] = buffer; - uniformOffsets[index] = state.offset; - }); - MetalBuffer::bindBuffers(getPendingCommandBuffer(mContext), computeEncoder, - UNIFORM_BUFFER_BINDING_START, MetalBuffer::Stage::COMPUTE, uniformsToBind, - uniformOffsets, Program::UNIFORM_BINDING_COUNT); - - // Bind SSBOs. - MetalBuffer* ssbosToBind[MAX_SSBO_COUNT] = { nil }; - NSUInteger ssboOffsets[MAX_SSBO_COUNT] = { 0 }; - enumerateBoundBuffers(BufferObjectBinding::SHADER_STORAGE, - [&ssbosToBind, &ssboOffsets](const BufferState& state, MetalBuffer* buffer, - uint32_t index) { - ssbosToBind[index] = buffer; - ssboOffsets[index] = state.offset; - }); - MetalBuffer::bindBuffers(getPendingCommandBuffer(mContext), computeEncoder, SSBO_BINDING_START, - MetalBuffer::Stage::COMPUTE, ssbosToBind, ssboOffsets, MAX_SSBO_COUNT); - [computeEncoder setComputePipelineState:computePipelineState]; MTLSize threadgroupsPerGrid = MTLSizeMake(workGroupCount.x, workGroupCount.y, workGroupCount.z); @@ -1775,47 +2008,88 @@ [computeEncoder endEncoding]; } +void MetalDriver::scissor(Viewport scissorBox) { + // Set scissor-rectangle. + // In order to do this, we compute the intersection between: + // 1. the scissor rectangle + // 2. the render target attachment dimensions (important, as the scissor can't be set larger) + // fmax/min are used below to guard against NaN and because the MTLViewport/MTLRegion + // coordinates are doubles. + MTLRegion scissor = mContext->currentRenderTarget->getRegionFromClientRect(scissorBox); + const float sleft = scissor.origin.x, sright = scissor.origin.x + scissor.size.width; + const float stop = scissor.origin.y, sbottom = scissor.origin.y + scissor.size.height; + + // Attachment extent + const auto attachmentSize = mContext->currentRenderTarget->getAttachmentSize(); + const float aleft = 0.0f, atop = 0.0f; + const float aright = static_cast(attachmentSize.x); + const float abottom = static_cast(attachmentSize.y); + + const auto left = std::fmax(sleft, aleft); + const auto right = std::fmin(sright, aright); + const auto top = std::fmax(stop, atop); + const auto bottom = std::fmin(sbottom, abottom); + + MTLScissorRect scissorRect = { + .x = static_cast(left), + .y = static_cast(top), + .width = static_cast(right - left), + .height = static_cast(bottom - top) + }; + + auto& srs = mContext->scissorRectState; + srs.updateState(scissorRect); + if (srs.stateChanged()) { + [mContext->currentRenderPassEncoder setScissorRect:scissorRect]; + } +} + void MetalDriver::beginTimerQuery(Handle tqh) { - ASSERT_PRECONDITION(!isInRenderPass(mContext), - "beginTimerQuery must be called outside of a render pass."); + FILAMENT_CHECK_PRECONDITION(!isInRenderPass(mContext)) + << "beginTimerQuery must be called outside of a render pass."; auto* tq = handle_cast(tqh); mContext->timerQueryImpl->beginTimeElapsedQuery(tq); } void MetalDriver::endTimerQuery(Handle tqh) { - ASSERT_PRECONDITION(!isInRenderPass(mContext), - "endTimerQuery must be called outside of a render pass."); + FILAMENT_CHECK_PRECONDITION(!isInRenderPass(mContext)) + << "endTimerQuery must be called outside of a render pass."; auto* tq = handle_cast(tqh); mContext->timerQueryImpl->endTimeElapsedQuery(tq); } -void MetalDriver::enumerateBoundBuffers(BufferObjectBinding bindingType, - const std::function& f) { - assert_invariant(bindingType == BufferObjectBinding::UNIFORM || - bindingType == BufferObjectBinding::SHADER_STORAGE); +void MetalDriver::resetState(int) { +} - auto enumerate = [&](auto arrayType){ - for (auto i = 0u; i < arrayType.size(); i++) { - const auto& thisBuffer = arrayType[i]; - if (!thisBuffer.bound) { - continue; - } - f(thisBuffer, thisBuffer.buffer->getBuffer(), i); - } - }; +void MetalDriver::setDebugTag(HandleBase::HandleId handleId, utils::CString tag) { + mHandleAllocator.associateTagToHandle(handleId, std::move(tag)); +} - switch (bindingType) { - default: - case (BufferObjectBinding::UNIFORM): - enumerate(mContext->uniformState); - break; - case (BufferObjectBinding::SHADER_STORAGE): - enumerate(mContext->ssboState); - break; +void MetalDriver::runAtNextTick(const std::function& fn) noexcept { + mTickOps.push_back(fn); +} + +void MetalDriver::executeTickOps() noexcept { + std::vector> ops; + std::swap(ops, mTickOps); + for (const auto& f : ops) { + f(); } } -void MetalDriver::resetState(int) { +void MetalDriver::executeAfterCurrentCommandBufferCompletes(utils::Invocable&& fn) noexcept { + mDeferredTasks.emplace_back(mContext->pendingCommandBufferId, std::move(fn)); +} + +void MetalDriver::executeDeferredOps() noexcept { + for (; !mDeferredTasks.empty(); mDeferredTasks.pop_front()) { + const auto& task = mDeferredTasks.front(); + if (task.commandBufferId <= mContext->latestCompletedCommandBufferId) { + task.fn(); + } else { + break; + } + } } // explicit instantiation of the Dispatcher diff --git a/filament/backend/src/metal/MetalEnums.h b/filament/backend/src/metal/MetalEnums.h index c166a34bf5d..5a2038ed103 100644 --- a/filament/backend/src/metal/MetalEnums.h +++ b/filament/backend/src/metal/MetalEnums.h @@ -71,7 +71,8 @@ constexpr inline MTLIndexType getIndexType(size_t elementSize) noexcept { } else if (elementSize == 4) { return MTLIndexTypeUInt32; } - ASSERT_POSTCONDITION(false, "Index element size not supported."); + assert_invariant(false); + return MTLIndexTypeUInt16; } constexpr inline MTLVertexFormat getMetalFormat(ElementType type, bool normalized) noexcept { @@ -100,7 +101,7 @@ constexpr inline MTLVertexFormat getMetalFormat(ElementType type, bool normalize case ElementType::SHORT4: return MTLVertexFormatShort4Normalized; case ElementType::USHORT4: return MTLVertexFormatUShort4Normalized; default: - ASSERT_POSTCONDITION(false, "Normalized format does not exist."); + FILAMENT_CHECK_POSTCONDITION(false) << "Normalized format does not exist."; return MTLVertexFormatInvalid; } } @@ -195,7 +196,7 @@ inline MTLPixelFormat getMetalFormatLinear(MTLPixelFormat format) { case MTLPixelFormatRG8Unorm_sRGB: return MTLPixelFormatRG8Unorm; case MTLPixelFormatRGBA8Unorm_sRGB: return MTLPixelFormatRGBA8Unorm; case MTLPixelFormatBGRA8Unorm_sRGB: return MTLPixelFormatBGRA8Unorm; -#if !defined(IOS) +#if !defined(FILAMENT_IOS) case MTLPixelFormatBC1_RGBA_sRGB: return MTLPixelFormatBC1_RGBA; case MTLPixelFormatBC2_RGBA_sRGB: return MTLPixelFormatBC2_RGBA; case MTLPixelFormatBC3_RGBA_sRGB: return MTLPixelFormatBC3_RGBA; @@ -267,7 +268,7 @@ constexpr inline bool isMetalFormatStencil(MTLPixelFormat format) { case MTLPixelFormatStencil8: case MTLPixelFormatDepth32Float_Stencil8: case MTLPixelFormatX32_Stencil8: -#if !defined(IOS) +#if !defined(FILAMENT_IOS) case MTLPixelFormatDepth24Unorm_Stencil8: case MTLPixelFormatX24_Stencil8: #endif @@ -326,7 +327,8 @@ constexpr inline MTLCullMode getMetalCullMode(CullingMode cullMode) noexcept { case CullingMode::FRONT: return MTLCullModeFront; case CullingMode::BACK: return MTLCullModeBack; case CullingMode::FRONT_AND_BACK: - ASSERT_POSTCONDITION(false, "FRONT_AND_BACK culling is not supported in Metal."); + FILAMENT_CHECK_POSTCONDITION(false) + << "FRONT_AND_BACK culling is not supported in Metal."; } } diff --git a/filament/backend/src/metal/MetalExternalImage.h b/filament/backend/src/metal/MetalExternalImage.h index ad8ef8630b6..c9dc1b91372 100644 --- a/filament/backend/src/metal/MetalExternalImage.h +++ b/filament/backend/src/metal/MetalExternalImage.h @@ -32,100 +32,75 @@ struct MetalContext; * texture. */ class MetalExternalImage { - public: + MetalExternalImage() = default; - MetalExternalImage(MetalContext& context, - TextureSwizzle r = TextureSwizzle::CHANNEL_0, - TextureSwizzle g = TextureSwizzle::CHANNEL_1, - TextureSwizzle b = TextureSwizzle::CHANNEL_2, - TextureSwizzle a = TextureSwizzle::CHANNEL_3) noexcept; + MetalExternalImage(MetalExternalImage&&); + MetalExternalImage& operator=(MetalExternalImage&&); + ~MetalExternalImage() noexcept; - /** - * @return true, if this MetalExternalImage is holding a live external image. Returns false - * until set has been called with a valid CVPixelBuffer. The image can be cleared via - * set(nullptr), and isValid will return false again. - */ - bool isValid() const noexcept; + MetalExternalImage(const MetalExternalImage&) = delete; + MetalExternalImage& operator=(const MetalExternalImage&) = delete; /** - * Set this external image to the passed-in CVPixelBuffer. Future calls to - * getMetalTextureForDraw will return a texture backed by this CVPixelBuffer. Previous - * CVPixelBuffers and related resources will be released when all GPU work using them has - * finished. - * - * Calling set with a YCbCr image will encode a compute pass to convert the image from YCbCr to - * RGB. + * While the texture is used for rendering, this MetalExternalImage must be kept alive. */ - void set(CVPixelBufferRef image) noexcept; + id getMtlTexture() const noexcept; - /** - * Set this external image to a specific plane of the passed-in CVPixelBuffer. Future calls to - * getMetalTextureForDraw will return a texture backed by a single plane of this CVPixelBuffer. - * Previous CVPixelBuffers and related resources will be released when all GPU work using them - * has finished. - */ - void set(CVPixelBufferRef image, size_t plane) noexcept; + bool isValid() const noexcept { + return mImage != nil || mRgbTexture != nullptr; + } - /** - * Returns the width of the external image, or 0 if one is not set. For YCbCr images, returns - * the width of the luminance plane. - */ - size_t getWidth() const noexcept { return mWidth; } + NSUInteger getWidth() const noexcept; + NSUInteger getHeight() const noexcept; /** - * Returns the height of the external image, or 0 if one is not set. For YCbCr images, returns - * the height of the luminance plane. + * Create an external image with the passed-in CVPixelBuffer. + * + * Ownership is taken of the CVPixelBuffer, which will be released when the returned + * MetalExternalImage is destroyed (or, in the case of a YCbCr image, after the conversion has + * completed). + * + * Calling set with a YCbCr image will encode a compute pass to convert the image from + * YCbCr to RGB. */ - size_t getHeight() const noexcept { return mHeight; } + static MetalExternalImage createFromImage(MetalContext& context, CVPixelBufferRef image); /** - * Get a Metal texture used to draw this image and denote that it is used for the current frame. - * For future frames that use this external image, getMetalTextureForDraw must be called again. + * Create an external image with a specific plane of the passed-in CVPixelBuffer. + * + * Ownership is taken of the CVPixelBuffer, which will be released when the returned + * MetalExternalImage is destroyed. */ - id getMetalTextureForDraw() const noexcept; + static MetalExternalImage createFromImagePlane( + MetalContext& context, CVPixelBufferRef image, uint32_t plane); + + static void assertWritableImage(CVPixelBufferRef image); /** * Free resources. Should be called at least once when no further calls to set will occur. */ static void shutdown(MetalContext& context) noexcept; - static void assertWritableImage(CVPixelBufferRef image); - private: + MetalExternalImage(CVPixelBufferRef image, CVMetalTextureRef texture) noexcept + : mImage(image), mTexture(texture) {} + explicit MetalExternalImage(id texture) noexcept : mRgbTexture(texture) {} - void unset(); - - CVMetalTextureRef createTextureFromImage(CVPixelBufferRef image, MTLPixelFormat format, - size_t plane); - id createRgbTexture(size_t width, size_t height); - id createSwizzledTextureView(id texture) const; - id createSwizzledTextureView(CVMetalTextureRef texture) const; - void ensureComputePipelineState(); - id encodeColorConversionPass(id inYPlane, id - inCbCrTexture, id outTexture); + static id createRgbTexture(id device, size_t width, size_t height); + static CVMetalTextureRef createTextureFromImage(CVMetalTextureCacheRef textureCache, + CVPixelBufferRef image, MTLPixelFormat format, size_t plane); + static void ensureComputePipelineState(MetalContext& context); + static id encodeColorConversionPass(MetalContext& context, + id inYPlane, id inCbCrTexture, id outTexture); static constexpr size_t Y_PLANE = 0; static constexpr size_t CBCR_PLANE = 1; - MetalContext& mContext; - - // If the external image has a single plane, mImage and mTexture hold references to the image - // and created Metal texture, respectively. - // mTextureView is a view of mTexture with any swizzling applied. + // TODO: this could probably be a union. CVPixelBufferRef mImage = nullptr; CVMetalTextureRef mTexture = nullptr; - id mTextureView = nullptr; - size_t mWidth = 0; - size_t mHeight = 0; - - // If the external image is in the YCbCr format, this holds the result of the converted RGB - // texture. id mRgbTexture = nil; - - struct { - TextureSwizzle r, g, b, a; - } mSwizzle; }; } // namespace backend diff --git a/filament/backend/src/metal/MetalExternalImage.mm b/filament/backend/src/metal/MetalExternalImage.mm index 329e3bc0e8f..9ffb587dd1c 100644 --- a/filament/backend/src/metal/MetalExternalImage.mm +++ b/filament/backend/src/metal/MetalExternalImage.mm @@ -21,6 +21,7 @@ #include "MetalUtils.h" #include +#include #include #define NSERROR_CHECK(message) \ @@ -28,15 +29,11 @@ auto description = [error.localizedDescription cStringUsingEncoding:NSUTF8StringEncoding]; \ utils::slog.e << description << utils::io::endl; \ } \ - ASSERT_POSTCONDITION(error == nil, message); + FILAMENT_CHECK_POSTCONDITION(error == nil) << message; namespace filament { namespace backend { -static const auto cvBufferDeleter = [](const void* buffer) { - CVBufferRelease((CVMetalTextureRef) buffer); -}; - static const char* kernel = R"( #include #include @@ -70,55 +67,66 @@ } )"; -MetalExternalImage::MetalExternalImage(MetalContext& context, TextureSwizzle r, TextureSwizzle g, - TextureSwizzle b, TextureSwizzle a) noexcept : mContext(context), mSwizzle{r, g, b, a} { } - -bool MetalExternalImage::isValid() const noexcept { - return mRgbTexture != nil || mImage != nullptr; +NSUInteger MetalExternalImage::getWidth() const noexcept { + if (mImage) { + return CVPixelBufferGetWidth(mImage); + } + if (mRgbTexture) { + return mRgbTexture.width; + } + return 0; } -void MetalExternalImage::set(CVPixelBufferRef image) noexcept { - unset(); +NSUInteger MetalExternalImage::getHeight() const noexcept { + if (mImage) { + return CVPixelBufferGetHeight(mImage); + } + if (mRgbTexture) { + return mRgbTexture.height; + } + return 0; +} +MetalExternalImage MetalExternalImage::createFromImage( + MetalContext& context, CVPixelBufferRef image) { if (!image) { - return; + return {}; } OSType formatType = CVPixelBufferGetPixelFormatType(image); - ASSERT_POSTCONDITION(formatType == kCVPixelFormatType_32BGRA || - formatType == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, - "Metal external images must be in either 32BGRA or 420f format."); + FILAMENT_CHECK_POSTCONDITION(formatType == kCVPixelFormatType_32BGRA || + formatType == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) + << "Metal external images must be in either 32BGRA or 420f format."; size_t planeCount = CVPixelBufferGetPlaneCount(image); - ASSERT_POSTCONDITION(planeCount == 0 || planeCount == 2, - "The Metal backend does not support images with plane counts of %d.", planeCount); - + FILAMENT_CHECK_POSTCONDITION(planeCount == 0 || planeCount == 2) + << "The Metal backend does not support images with plane counts of " << planeCount + << "."; if (planeCount == 0) { - mImage = image; - mTexture = createTextureFromImage(image, MTLPixelFormatBGRA8Unorm, 0); - mTextureView = createSwizzledTextureView(mTexture); - mWidth = CVPixelBufferGetWidth(image); - mHeight = CVPixelBufferGetHeight(image); + CVMetalTextureRef texture = + createTextureFromImage(context.textureCache, image, MTLPixelFormatBGRA8Unorm, 0); + return { CVPixelBufferRetain(image), texture }; } if (planeCount == 2) { - CVMetalTextureRef yPlane = createTextureFromImage(image, MTLPixelFormatR8Unorm, Y_PLANE); - CVMetalTextureRef cbcrPlane = createTextureFromImage(image, MTLPixelFormatRG8Unorm, - CBCR_PLANE); + CVPixelBufferRetain(image); + + CVMetalTextureRef yPlane = + createTextureFromImage(context.textureCache, image, MTLPixelFormatR8Unorm, Y_PLANE); + CVMetalTextureRef cbcrPlane = + createTextureFromImage(context.textureCache, image, MTLPixelFormatRG8Unorm, CBCR_PLANE); // Get the size of luminance plane. - mWidth = CVPixelBufferGetWidthOfPlane(image, Y_PLANE); - mHeight = CVPixelBufferGetHeightOfPlane(image, Y_PLANE); + NSUInteger width = CVPixelBufferGetWidthOfPlane(image, Y_PLANE); + NSUInteger height = CVPixelBufferGetHeightOfPlane(image, Y_PLANE); - id rgbTexture = createRgbTexture(mWidth, mHeight); - id commandBuffer = encodeColorConversionPass( + id rgbTexture = createRgbTexture(context.device, width, height); + id commandBuffer = encodeColorConversionPass(context, CVMetalTextureGetTexture(yPlane), CVMetalTextureGetTexture(cbcrPlane), rgbTexture); - mRgbTexture = createSwizzledTextureView(rgbTexture); - [commandBuffer addCompletedHandler:^(id o) { CVBufferRelease(yPlane); CVBufferRelease(cbcrPlane); @@ -126,72 +134,85 @@ }]; [commandBuffer commit]; + return MetalExternalImage { rgbTexture }; } -} -void MetalExternalImage::set(CVPixelBufferRef image, size_t plane) noexcept { - unset(); + return {}; +} +MetalExternalImage MetalExternalImage::createFromImagePlane( + MetalContext& context, CVPixelBufferRef image, uint32_t plane) { if (!image) { - return; + return {}; } const OSType formatType = CVPixelBufferGetPixelFormatType(image); - ASSERT_POSTCONDITION(formatType == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, - "Metal planar external images must be in the 420f format."); - - mImage = image; - - auto getPlaneFormat = [] (size_t plane) { - // Right now Metal only supports kCVPixelFormatType_420YpCbCr8BiPlanarFullRange planar - // external images, so we can make the following assumptions about the format of each plane. - if (plane == 0) { - return MTLPixelFormatR8Unorm; // luminance - } - if (plane == 1) { - // CbCr - return MTLPixelFormatRG8Unorm; // CbCr - } - return MTLPixelFormatInvalid; + FILAMENT_CHECK_POSTCONDITION(formatType == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) + << "Metal planar external images must be in the 420f format."; + FILAMENT_CHECK_POSTCONDITION(plane == 0 || plane == 1) + << "Metal planar external images must be created from planes 0 or 1."; + + auto getPlaneFormat = [](size_t plane) { + // Right now Metal only supports kCVPixelFormatType_420YpCbCr8BiPlanarFullRange planar + // external images, so we can make the following assumptions about the format of each plane. + if (plane == 0) { + return MTLPixelFormatR8Unorm; // luminance + } + if (plane == 1) { + return MTLPixelFormatRG8Unorm; // CbCr + } + return MTLPixelFormatInvalid; }; const MTLPixelFormat format = getPlaneFormat(plane); assert_invariant(format != MTLPixelFormatInvalid); - mTexture = createTextureFromImage(image, format, plane); - mTextureView = createSwizzledTextureView(mTexture); + CVMetalTextureRef mTexture = createTextureFromImage(context.textureCache, image, format, plane); + return { CVPixelBufferRetain(image), mTexture }; +} + +MetalExternalImage::MetalExternalImage(MetalExternalImage&& rhs) { + std::swap(mImage, rhs.mImage); + std::swap(mTexture, rhs.mTexture); + std::swap(mRgbTexture, rhs.mRgbTexture); +} + +MetalExternalImage& MetalExternalImage::operator=(MetalExternalImage&& rhs) { + CVPixelBufferRelease(mImage); + CVBufferRelease(mTexture); + mImage = nullptr; + mTexture = nullptr; + mRgbTexture = nullptr; + std::swap(mImage, rhs.mImage); + std::swap(mTexture, rhs.mTexture); + std::swap(mRgbTexture, rhs.mRgbTexture); + return *this; } -id MetalExternalImage::getMetalTextureForDraw() const noexcept { +MetalExternalImage::~MetalExternalImage() noexcept { + CVPixelBufferRelease(mImage); + CVBufferRelease(mTexture); +} + +id MetalExternalImage::getMtlTexture() const noexcept { if (mRgbTexture) { return mRgbTexture; } - - // Retain the image and Metal texture until the GPU has finished with this frame. This does - // not need to be done for the RGB texture, because it is an Objective-C object whose - // lifetime is automatically managed by Metal. - auto& tracker = mContext.resourceTracker; - auto commandBuffer = getPendingCommandBuffer(&mContext); - if (tracker.trackResource((__bridge void*) commandBuffer, mImage, cvBufferDeleter)) { - CVPixelBufferRetain(mImage); - } - if (tracker.trackResource((__bridge void*) commandBuffer, mTexture, cvBufferDeleter)) { - CVBufferRetain(mTexture); + if (mTexture) { + return CVMetalTextureGetTexture(mTexture); } - - assert_invariant(mTextureView); - return mTextureView; + return nil; } -CVMetalTextureRef MetalExternalImage::createTextureFromImage(CVPixelBufferRef image, - MTLPixelFormat format, size_t plane) { +CVMetalTextureRef MetalExternalImage::createTextureFromImage(CVMetalTextureCacheRef textureCache, + CVPixelBufferRef image, MTLPixelFormat format, size_t plane) { const size_t width = CVPixelBufferGetWidthOfPlane(image, plane); const size_t height = CVPixelBufferGetHeightOfPlane(image, plane); CVMetalTextureRef texture; - CVReturn result = CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, - mContext.textureCache, image, nullptr, format, width, height, plane, &texture); - ASSERT_POSTCONDITION(result == kCVReturnSuccess, - "Could not create a CVMetalTexture from CVPixelBuffer."); + CVReturn result = CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, textureCache, + image, nullptr, format, width, height, plane, &texture); + FILAMENT_CHECK_POSTCONDITION(result == kCVReturnSuccess) + << "Could not create a CVMetalTexture from CVPixelBuffer."; return texture; } @@ -200,58 +221,19 @@ context.externalImageComputePipelineState = nil; } -void MetalExternalImage::assertWritableImage(CVPixelBufferRef image) { - OSType formatType = CVPixelBufferGetPixelFormatType(image); - ASSERT_PRECONDITION(formatType == kCVPixelFormatType_32BGRA, - "Metal SwapChain images must be in the 32BGRA format."); -} - -void MetalExternalImage::unset() { - CVPixelBufferRelease(mImage); - CVBufferRelease(mTexture); - - mImage = nullptr; - mTexture = nullptr; - mTextureView = nil; - mRgbTexture = nil; - mWidth = 0; - mHeight = 0; -} - -id MetalExternalImage::createRgbTexture(size_t width, size_t height) { +id MetalExternalImage::createRgbTexture( + id device, size_t width, size_t height) { MTLTextureDescriptor *descriptor = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatRGBA8Unorm width:width height:height mipmapped:NO]; descriptor.usage = MTLTextureUsageShaderWrite | MTLTextureUsageShaderRead; - return [mContext.device newTextureWithDescriptor:descriptor]; -} - -id MetalExternalImage::createSwizzledTextureView(id texture) const { - const bool isDefaultSwizzle = - mSwizzle.r == TextureSwizzle::CHANNEL_0 && - mSwizzle.g == TextureSwizzle::CHANNEL_1 && - mSwizzle.b == TextureSwizzle::CHANNEL_2 && - mSwizzle.a == TextureSwizzle::CHANNEL_3; - if (!isDefaultSwizzle && mContext.supportsTextureSwizzling) { - // Even though we've already checked supportsTextureSwizzling, we still need to guard these - // calls with @availability, otherwise the API usage will generate compiler warnings. - if (@available(iOS 13, *)) { - texture = createTextureViewWithSwizzle(texture, - getSwizzleChannels(mSwizzle.r, mSwizzle.g, mSwizzle.b, mSwizzle.a)); - } - } - return texture; + return [device newTextureWithDescriptor:descriptor]; } -id MetalExternalImage::createSwizzledTextureView(CVMetalTextureRef ref) const { - id texture = CVMetalTextureGetTexture(ref); - return createSwizzledTextureView(texture); -} - -void MetalExternalImage::ensureComputePipelineState() { - if (mContext.externalImageComputePipelineState != nil) { +void MetalExternalImage::ensureComputePipelineState(MetalContext& context) { + if (context.externalImageComputePipelineState != nil) { return; } @@ -259,29 +241,28 @@ NSString* objcSource = [NSString stringWithCString:kernel encoding:NSUTF8StringEncoding]; - id library = [mContext.device newLibraryWithSource:objcSource - options:nil - error:&error]; + id library = [context.device newLibraryWithSource:objcSource + options:nil + error:&error]; NSERROR_CHECK("Unable to compile Metal shading library."); id kernelFunction = [library newFunctionWithName:@"ycbcrToRgb"]; - mContext.externalImageComputePipelineState = - [mContext.device newComputePipelineStateWithFunction:kernelFunction - error:&error]; + context.externalImageComputePipelineState = + [context.device newComputePipelineStateWithFunction:kernelFunction error:&error]; NSERROR_CHECK("Unable to create Metal compute pipeline state."); } -id MetalExternalImage::encodeColorConversionPass(id inYPlane, - id inCbCrTexture, id outTexture) { - ensureComputePipelineState(); +id MetalExternalImage::encodeColorConversionPass(MetalContext& context, + id inYPlane, id inCbCrTexture, id outTexture) { + ensureComputePipelineState(context); - id commandBuffer = [mContext.commandQueue commandBuffer]; + id commandBuffer = [context.commandQueue commandBuffer]; commandBuffer.label = @"YCbCr to RGB conversion"; id computeEncoder = [commandBuffer computeCommandEncoder]; - [computeEncoder setComputePipelineState:mContext.externalImageComputePipelineState]; + [computeEncoder setComputePipelineState:context.externalImageComputePipelineState]; [computeEncoder setTexture:inYPlane atIndex:0]; [computeEncoder setTexture:inCbCrTexture atIndex:1]; [computeEncoder setTexture:outTexture atIndex:2]; @@ -299,5 +280,11 @@ return commandBuffer; } +void MetalExternalImage::assertWritableImage(CVPixelBufferRef image) { + OSType formatType = CVPixelBufferGetPixelFormatType(image); + FILAMENT_CHECK_PRECONDITION(formatType == kCVPixelFormatType_32BGRA) + << "Metal SwapChain images must be in the 32BGRA format."; +} + } // namespace backend } // namespace filament diff --git a/filament/backend/src/metal/MetalHandles.h b/filament/backend/src/metal/MetalHandles.h index b1f59d59e83..973e5d19eb9 100644 --- a/filament/backend/src/metal/MetalHandles.h +++ b/filament/backend/src/metal/MetalHandles.h @@ -29,9 +29,10 @@ #include "MetalExternalImage.h" #include "MetalState.h" // for MetalState::VertexDescription -#include "private/backend/SamplerGroup.h" +#include #include +#include #include #include @@ -41,6 +42,7 @@ #include #include #include +#include namespace filament { namespace backend { @@ -66,11 +68,14 @@ class MetalSwapChain : public HwSwapChain { id acquireDrawable(); id acquireDepthTexture(); + id acquireStencilTexture(); void releaseDrawable(); - void setFrameScheduledCallback(FrameScheduledCallback callback, void* user); - void setFrameCompletedCallback(FrameCompletedCallback callback, void* user); + void setFrameScheduledCallback( + CallbackHandler* handler, FrameScheduledCallback&& callback, uint64_t flags); + void setFrameCompletedCallback( + CallbackHandler* handler, utils::Invocable&& callback); // For CAMetalLayer-backed SwapChains, presents the drawable or schedules a // FrameScheduledCallback. @@ -79,6 +84,8 @@ class MetalSwapChain : public HwSwapChain { NSUInteger getSurfaceWidth() const; NSUInteger getSurfaceHeight() const; + bool isPixelBuffer() const { return type == SwapChainType::CVPIXELBUFFERREF; } + private: enum class SwapChainType { @@ -88,57 +95,85 @@ class MetalSwapChain : public HwSwapChain { }; bool isCaMetalLayer() const { return type == SwapChainType::CAMETALLAYER; } bool isHeadless() const { return type == SwapChainType::HEADLESS; } - bool isPixelBuffer() const { return type == SwapChainType::CVPIXELBUFFERREF; } void scheduleFrameScheduledCallback(); void scheduleFrameCompletedCallback(); + static MTLPixelFormat decideDepthStencilFormat(uint64_t flags); + void ensureDepthStencilTexture(); + MetalContext& context; id drawable = nil; - id depthTexture = nil; + id depthStencilTexture = nil; id headlessDrawable = nil; - NSUInteger headlessWidth; - NSUInteger headlessHeight; + MTLPixelFormat depthStencilFormat = MTLPixelFormatInvalid; + NSUInteger headlessWidth = 0; + NSUInteger headlessHeight = 0; CAMetalLayer* layer = nullptr; + std::shared_ptr layerDrawableMutex; MetalExternalImage externalImage; SwapChainType type; - // These two fields store a callback and user data to notify the client that a frame is ready - // for presentation. - // If frameScheduledCallback is nullptr, then the Metal backend automatically calls - // presentDrawable when the frame is committed. - // Otherwise, the Metal backend will not automatically present the frame. Instead, clients bear - // the responsibility of presenting the frame by calling the PresentCallable object. - FrameScheduledCallback frameScheduledCallback = nullptr; - void* frameScheduledUserData = nullptr; - - FrameCompletedCallback frameCompletedCallback = nullptr; - void* frameCompletedUserData = nullptr; + // These fields store a callback to notify the client that a frame is ready for presentation. If + // !frameScheduled.callback, then the Metal backend automatically calls presentDrawable when the + // frame is committed. Otherwise, the Metal backend will not automatically present the frame. + // Instead, clients bear the responsibility of presenting the frame by calling the + // PresentCallable object. + struct { + CallbackHandler* handler = nullptr; + std::shared_ptr callback = nullptr; + uint64_t flags = 0; + } frameScheduled; + + struct { + CallbackHandler* handler = nullptr; + std::shared_ptr> callback = nullptr; + } frameCompleted; }; class MetalBufferObject : public HwBufferObject { public: + + using TagResolver = MetalBuffer::TagResolver; + MetalBufferObject(MetalContext& context, BufferObjectBinding bindingType, BufferUsage usage, uint32_t byteCount); - void updateBuffer(void* data, size_t size, uint32_t byteOffset); - void updateBufferUnsynchronized(void* data, size_t size, uint32_t byteOffset); + void updateBuffer(void* data, size_t size, uint32_t byteOffset, TagResolver&& getHandleTag); + void updateBufferUnsynchronized( + void* data, size_t size, uint32_t byteOffset, TagResolver&& getHandleTag); MetalBuffer* getBuffer() { return &buffer; } - // Tracks which uniform/ssbo buffers this buffer object is bound into. - static_assert(Program::UNIFORM_BINDING_COUNT <= 32); - static_assert(MAX_SSBO_COUNT <= 32); - utils::bitset32 boundUniformBuffers; - utils::bitset32 boundSsbos; - private: MetalBuffer buffer; }; +struct MetalVertexBufferInfo : public HwVertexBufferInfo { + MetalVertexBufferInfo(MetalContext& context, + uint8_t bufferCount, uint8_t attributeCount, AttributeArray const& attributes); + + // This struct is used to create the pipeline description to describe vertex assembly. + VertexDescription vertexDescription = {}; + + struct Entry { + uint8_t sourceBufferIndex = 0; + uint8_t stride = 0; + // maps to -> + uint8_t bufferArgumentIndex = 0; + + Entry(uint8_t sourceBufferIndex, uint8_t stride, uint8_t bufferArgumentIndex) + : sourceBufferIndex(sourceBufferIndex), + stride(stride), + bufferArgumentIndex(bufferArgumentIndex) {} + }; + utils::FixedCapacityVector bufferMapping; +}; + struct MetalVertexBuffer : public HwVertexBuffer { - MetalVertexBuffer(MetalContext& context, uint8_t bufferCount, uint8_t attributeCount, - uint32_t vertexCount, AttributeArray const& attributes); + MetalVertexBuffer(MetalContext& context, + uint32_t vertexCount, uint32_t bufferCount, Handle vbih); + Handle vbih; utils::FixedCapacityVector buffers; }; @@ -150,27 +185,29 @@ struct MetalIndexBuffer : public HwIndexBuffer { }; struct MetalRenderPrimitive : public HwRenderPrimitive { - void setBuffers(MetalVertexBuffer* vertexBuffer, MetalIndexBuffer* indexBuffer); + MetalRenderPrimitive(); + void setBuffers(MetalVertexBufferInfo const* const vbi, + MetalVertexBuffer* vertexBuffer, MetalIndexBuffer* indexBuffer); // The pointers to MetalVertexBuffer and MetalIndexBuffer are "weak". // The MetalVertexBuffer and MetalIndexBuffer must outlive the MetalRenderPrimitive. MetalVertexBuffer* vertexBuffer = nullptr; MetalIndexBuffer* indexBuffer = nullptr; - - // This struct is used to create the pipeline description to describe vertex assembly. - VertexDescription vertexDescription = {}; }; -struct MetalProgram : public HwProgram { - MetalProgram(id device, const Program& program) noexcept; +class MetalProgram : public HwProgram { +public: + MetalProgram(MetalContext& context, Program&& program) noexcept; - id vertexFunction; - id fragmentFunction; - id computeFunction; + const MetalShaderCompiler::MetalFunctionBundle& getFunctions(); + const MetalShaderCompiler::MetalFunctionBundle& getFunctionsIfPresent() const; - Program::SamplerGroupInfo samplerGroupInfo; +private: + void initialize(); - bool isValid = false; + MetalContext& mContext; + MetalShaderCompiler::MetalFunctionBundle mFunctionBundle; + MetalShaderCompiler::program_token_t mToken; }; struct PixelBufferShape { @@ -189,50 +226,42 @@ struct PixelBufferShape { class MetalTexture : public HwTexture { public: MetalTexture(MetalContext& context, SamplerType target, uint8_t levels, TextureFormat format, - uint8_t samples, uint32_t width, uint32_t height, uint32_t depth, TextureUsage usage, - TextureSwizzle r, TextureSwizzle g, TextureSwizzle b, TextureSwizzle a) - noexcept; + uint8_t samples, uint32_t width, uint32_t height, uint32_t depth, + TextureUsage usage) noexcept; + + // constructors for creating texture views + MetalTexture(MetalContext& context, MetalTexture const* src, uint8_t baseLevel, + uint8_t levelCount) noexcept; + MetalTexture(MetalContext& context, MetalTexture const* src, TextureSwizzle r, TextureSwizzle g, + TextureSwizzle b, TextureSwizzle a) noexcept; // Constructor for importing an id outside of Filament. MetalTexture(MetalContext& context, SamplerType target, uint8_t levels, TextureFormat format, uint8_t samples, uint32_t width, uint32_t height, uint32_t depth, TextureUsage usage, id texture) noexcept; - ~MetalTexture(); + // Constructors for importing external images. + MetalTexture(MetalContext& context, TextureFormat format, uint32_t width, uint32_t height, + TextureUsage usage, CVPixelBufferRef image) noexcept; + MetalTexture(MetalContext& context, TextureFormat format, uint32_t width, uint32_t height, + TextureUsage usage, CVPixelBufferRef image, uint32_t plane) noexcept; - // Returns an id suitable for reading in a shader, taking into account swizzle and - // LOD clamping. - id getMtlTextureForRead() noexcept; + // Returns an id suitable for reading in a shader, taking into account swizzle. + id getMtlTextureForRead() const noexcept; // Returns the id for attaching to a render pass. - id getMtlTextureForWrite() noexcept { + id getMtlTextureForWrite() const noexcept { return texture; } + std::shared_ptr getExternalImage() const noexcept { return externalImage; } + void loadImage(uint32_t level, MTLRegion region, PixelBufferDescriptor& p) noexcept; void generateMipmaps() noexcept; - // A texture starts out with none of its mip levels (also referred to as LODs) available for - // reading. 3 actions update the range of LODs available: - // - calling loadImage - // - calling generateMipmaps - // - using the texture as a render target attachment - // The range of available mips can only increase, never decrease. - // A texture's available mips are consistent throughout a render pass. - void updateLodRange(uint32_t level); - void updateLodRange(uint32_t minLevel, uint32_t maxLevel); - - // Returns true if the texture has all of its mip levels accessible for reading. - // For any MetalTexture, once this is true, will always return true. - // The value returned will remain consistent for an entire render pass. - bool allLodsValid() const { - return minLod == 0 && maxLod == levels - 1; - } - static MTLPixelFormat decidePixelFormat(MetalContext* context, TextureFormat format); MetalContext& context; - MetalExternalImage externalImage; // A "sidecar" texture used to implement automatic MSAA resolve. // This is created by MetalRenderTarget and stored here so it can be used with multiple @@ -251,93 +280,12 @@ class MetalTexture : public HwTexture { id texture = nil; + std::shared_ptr externalImage; + // If non-nil, a swizzled texture view to use instead of "texture". // Filament swizzling only affects texture reads, so this should not be used when the texture is // bound as a render target attachment. id swizzledTextureView = nil; - id lodTextureView = nil; - - uint32_t minLod = UINT_MAX; - uint32_t maxLod = 0; -}; - -class MetalSamplerGroup : public HwSamplerGroup { -public: - explicit MetalSamplerGroup(size_t size) noexcept - : size(size), - textureHandles(size, Handle()), - textures(size, nil), - samplers(size, nil) {} - - inline void setTextureHandle(size_t index, Handle th) { - assert_invariant(!finalized); - textureHandles[index] = th; - } - -#ifndef NDEBUG - // This method is only used for debugging, to ensure all texture handles are alive. - const auto& getTextureHandles() const { - return textureHandles; - } -#endif - - // Encode a MTLTexture into this SamplerGroup at the given index. - inline void setFinalizedTexture(size_t index, id t) { - assert_invariant(!finalized); - textures[index] = t; - } - - // Encode a MTLSamplerState into this SamplerGroup at the given index. - inline void setFinalizedSampler(size_t index, id s) { - assert_invariant(!finalized); - samplers[index] = s; - } - - // A SamplerGroup is "finalized" when all of its textures have been set and is ready for use in - // a draw call. - // Once a SamplerGroup is finalized, it must be reset or mutated to be written into again. - void finalize(); - bool isFinalized() const noexcept { return finalized; } - - // Both of these methods "unfinalize" a SamplerGroup, allowing it to be updated via calls to - // setFinalizedTexture or setFinalizedSampler. The difference is that when reset is called, all - // the samplers/textures must be rebound. The MTLArgumentEncoder must be specified, in case - // the texture types have changed. - // Mutate re-encodes the current set of samplers/textures into the new argument - // buffer. - void reset(id cmdBuffer, id e, id device); - void mutate(id cmdBuffer); - - id getArgumentBuffer() const { - assert_invariant(finalized); - return argBuffer->getCurrentAllocation().first; - } - - NSUInteger getArgumentBufferOffset() const { - return argBuffer->getCurrentAllocation().second; - } - - inline std::pair, id> getFinalizedTexture(size_t index) { - return {textureHandles[index], textures[index]}; - } - - // Calls the Metal useResource:usage:stages: method for all the textures in this SamplerGroup. - void useResources(id renderPassEncoder); - - size_t size; - -public: - - // These vectors are kept in sync with one another. - utils::FixedCapacityVector> textureHandles; - utils::FixedCapacityVector> textures; - utils::FixedCapacityVector> samplers; - - id encoder; - - std::unique_ptr argBuffer = nullptr; - - bool finalized = false; }; class MetalRenderTarget : public HwRenderTarget { @@ -446,9 +394,7 @@ class MetalRenderTarget : public HwRenderTarget { }; // MetalFence is used to implement both Fences and Syncs. -// There's no diamond problem, because HwBase (superclass of HwFence and HwSync) is empty. -static_assert(std::is_empty_v); -class MetalFence : public HwFence, public HwSync { +class MetalFence : public HwFence { public: // MetalFence is special, as it gets constructed on the Filament thread. We must delay inserting @@ -490,12 +436,67 @@ struct MetalTimerQuery : public HwTimerQuery { struct Status { std::atomic available {false}; - uint64_t elapsed {0}; // only valid if available is true + std::atomic elapsed {0}; // only valid if available is true }; std::shared_ptr status; }; +class MetalDescriptorSetLayout : public HwDescriptorSetLayout { +public: + MetalDescriptorSetLayout(DescriptorSetLayout&& layout) noexcept; + + const auto& getBindings() const noexcept { return mLayout.bindings; } + + size_t getDynamicOffsetCount() const noexcept { return mDynamicOffsetCount; } + + /** + * Get an argument encoder for this descriptor set and shader stage. + * textureTypes should only include the textures present in the corresponding shader stage. + */ + id getArgumentEncoder(id device, ShaderStage stage, + utils::FixedCapacityVector const& textureTypes); + +private: + id getArgumentEncoderSlow(id device, ShaderStage stage, + utils::FixedCapacityVector const& textureTypes); + + DescriptorSetLayout mLayout; + size_t mDynamicOffsetCount = 0; + std::array, Program::SHADER_TYPE_COUNT> mCachedArgumentEncoder = { nil }; + std::array, Program::SHADER_TYPE_COUNT> + mCachedTextureTypes; +}; + +struct MetalDescriptorSet : public HwDescriptorSet { + MetalDescriptorSet(MetalDescriptorSetLayout* layout) noexcept; + + void finalize(MetalDriver* driver); + + id finalizeAndGetBuffer(MetalDriver* driver, ShaderStage stage); + + MetalDescriptorSetLayout* layout; + + struct BufferBinding { + id buffer; + uint32_t offset; + uint32_t size; + }; + struct TextureBinding { + id texture; + SamplerParams sampler; + }; + tsl::robin_map buffers; + tsl::robin_map textures; + + std::vector> vertexResources; + std::vector> fragmentResources; + + std::vector> externalImages; + + std::array cachedBuffer = { nil }; +}; + } // namespace backend } // namespace filament diff --git a/filament/backend/src/metal/MetalHandles.mm b/filament/backend/src/metal/MetalHandles.mm index 23301a77b65..fc12fe0a9a6 100644 --- a/filament/backend/src/metal/MetalHandles.mm +++ b/filament/backend/src/metal/MetalHandles.mm @@ -19,6 +19,7 @@ #include "MetalBlitter.h" #include "MetalEnums.h" #include "MetalUtils.h" +#include "MetalBufferPool.h" #include @@ -39,7 +40,15 @@ namespace backend { static inline MTLTextureUsage getMetalTextureUsage(TextureUsage usage) { - NSUInteger u = 0; + NSUInteger u = MTLTextureUsageUnknown; + + if (any(usage & TextureUsage::SAMPLEABLE)) { + u |= MTLTextureUsageShaderRead; + } + if (any(usage & TextureUsage::UPLOADABLE)) { + // This is only needed because of the slowpath is MetalBlitter + u |= MTLTextureUsageRenderTarget; + } if (any(usage & TextureUsage::COLOR_ATTACHMENT)) { u |= MTLTextureUsageRenderTarget; } @@ -49,16 +58,23 @@ static inline MTLTextureUsage getMetalTextureUsage(TextureUsage usage) { if (any(usage & TextureUsage::STENCIL_ATTACHMENT)) { u |= MTLTextureUsageRenderTarget; } - - // All textures can be blitted from, so they must have the UsageShaderRead flag. - u |= MTLTextureUsageShaderRead; + if (any(usage & TextureUsage::BLIT_DST)) { + // This is only needed because of the slowpath is MetalBlitter + u |= MTLTextureUsageRenderTarget; + } + if (any(usage & TextureUsage::BLIT_SRC)) { + u |= MTLTextureUsageShaderRead; + } return MTLTextureUsage(u); } MetalSwapChain::MetalSwapChain(MetalContext& context, CAMetalLayer* nativeWindow, uint64_t flags) - : context(context), layer(nativeWindow), externalImage(context), - type(SwapChainType::CAMETALLAYER) { + : context(context), + depthStencilFormat(decideDepthStencilFormat(flags)), + layer(nativeWindow), + layerDrawableMutex(std::make_shared()), + type(SwapChainType::CAMETALLAYER) { if (!(flags & SwapChain::CONFIG_TRANSPARENT) && !nativeWindow.opaque) { utils::slog.w << "Warning: Filament SwapChain has no CONFIG_TRANSPARENT flag, " @@ -79,19 +95,29 @@ static inline MTLTextureUsage getMetalTextureUsage(TextureUsage usage) { } MetalSwapChain::MetalSwapChain(MetalContext& context, int32_t width, int32_t height, uint64_t flags) - : context(context), headlessWidth(width), headlessHeight(height), externalImage(context), - type(SwapChainType::HEADLESS) { } + : context(context), + depthStencilFormat(decideDepthStencilFormat(flags)), + headlessWidth(width), + headlessHeight(height), + type(SwapChainType::HEADLESS) {} MetalSwapChain::MetalSwapChain(MetalContext& context, CVPixelBufferRef pixelBuffer, uint64_t flags) - : context(context), externalImage(context), type(SwapChainType::CVPIXELBUFFERREF) { + : context(context), + depthStencilFormat(decideDepthStencilFormat(flags)), + externalImage(MetalExternalImage::createFromImage(context, pixelBuffer)), + type(SwapChainType::CVPIXELBUFFERREF) { assert_invariant(flags & SWAP_CHAIN_CONFIG_APPLE_CVPIXELBUFFER); MetalExternalImage::assertWritableImage(pixelBuffer); - externalImage.set(pixelBuffer); assert_invariant(externalImage.isValid()); } +MTLPixelFormat MetalSwapChain::decideDepthStencilFormat(uint64_t flags) { + // These formats are supported on all devices, both iOS and macOS. + return flags & SwapChain::CONFIG_HAS_STENCIL_BUFFER ? MTLPixelFormatDepth32Float_Stencil8 + : MTLPixelFormatDepth32Float; +} + MetalSwapChain::~MetalSwapChain() { - externalImage.set(nullptr); } NSUInteger MetalSwapChain::getSurfaceWidth() const { @@ -131,7 +157,7 @@ static inline MTLTextureUsage getMetalTextureUsage(TextureUsage usage) { textureDescriptor.height = headlessHeight; // Specify MTLTextureUsageShaderRead so the headless surface can be blitted from. textureDescriptor.usage = MTLTextureUsageRenderTarget | MTLTextureUsageShaderRead; -#if defined(IOS) +#if defined(FILAMENT_IOS) textureDescriptor.storageMode = MTLStorageModeShared; #else textureDescriptor.storageMode = MTLStorageModeManaged; @@ -141,70 +167,86 @@ static inline MTLTextureUsage getMetalTextureUsage(TextureUsage usage) { } if (isPixelBuffer()) { - return externalImage.getMetalTextureForDraw(); + return externalImage.getMtlTexture(); } assert_invariant(isCaMetalLayer()); - drawable = [layer nextDrawable]; - ASSERT_POSTCONDITION(drawable != nil, "Could not obtain drawable."); + // CAMetalLayer's drawable pool is not thread safe. Use a mutex when + // calling -nextDrawable, or when releasing the last known reference + // to any CAMetalDrawable returned from a previous -nextDrawable. + { + std::lock_guard lock(*layerDrawableMutex); + drawable = [layer nextDrawable]; + } + + FILAMENT_CHECK_POSTCONDITION(drawable != nil) << "Could not obtain drawable."; return drawable.texture; } void MetalSwapChain::releaseDrawable() { - drawable = nil; + if (drawable) { + std::lock_guard lock(*layerDrawableMutex); + drawable = nil; + } } id MetalSwapChain::acquireDepthTexture() { - if (depthTexture) { - // If the surface size has changed, we'll need to allocate a new depth texture. - if (depthTexture.width != getSurfaceWidth() || - depthTexture.height != getSurfaceHeight()) { - depthTexture = nil; + ensureDepthStencilTexture(); + assert_invariant(depthStencilTexture); + return depthStencilTexture; +} + +id MetalSwapChain::acquireStencilTexture() { + if (!isMetalFormatStencil(depthStencilFormat)) { + return nil; + } + ensureDepthStencilTexture(); + assert_invariant(depthStencilTexture); + return depthStencilTexture; +} + +void MetalSwapChain::ensureDepthStencilTexture() { + NSUInteger width = getSurfaceWidth(); + NSUInteger height = getSurfaceHeight(); + if (UTILS_LIKELY(depthStencilTexture)) { + // If the surface size has changed, we'll need to allocate a new depth/stencil texture. + if (UTILS_UNLIKELY( + depthStencilTexture.width != width || depthStencilTexture.height != height)) { + depthStencilTexture = nil; } else { - return depthTexture; + return; } } - - const MTLPixelFormat depthFormat = -#if defined(IOS) - MTLPixelFormatDepth32Float; -#else - context.device.depth24Stencil8PixelFormatSupported ? - MTLPixelFormatDepth24Unorm_Stencil8 : MTLPixelFormatDepth32Float; -#endif - - const NSUInteger width = getSurfaceWidth(); - const NSUInteger height = getSurfaceHeight(); MTLTextureDescriptor* descriptor = - [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:depthFormat + [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:depthStencilFormat width:width height:height mipmapped:NO]; descriptor.usage = MTLTextureUsageRenderTarget; descriptor.resourceOptions = MTLResourceStorageModePrivate; - - depthTexture = [context.device newTextureWithDescriptor:descriptor]; - - return depthTexture; + depthStencilTexture = [context.device newTextureWithDescriptor:descriptor]; } -void MetalSwapChain::setFrameScheduledCallback(FrameScheduledCallback callback, void* user) { - frameScheduledCallback = callback; - frameScheduledUserData = user; +void MetalSwapChain::setFrameScheduledCallback( + CallbackHandler* handler, FrameScheduledCallback&& callback, uint64_t flags) { + frameScheduled.handler = handler; + frameScheduled.callback = std::make_shared(std::move(callback)); + frameScheduled.flags = flags; } -void MetalSwapChain::setFrameCompletedCallback(FrameCompletedCallback callback, void* user) { - frameCompletedCallback = callback; - frameCompletedUserData = user; +void MetalSwapChain::setFrameCompletedCallback( + CallbackHandler* handler, utils::Invocable&& callback) { + frameCompleted.handler = handler; + frameCompleted.callback = std::make_shared>(std::move(callback)); } void MetalSwapChain::present() { - if (frameCompletedCallback) { + if (frameCompleted.callback) { scheduleFrameCompletedCallback(); } if (drawable) { - if (frameScheduledCallback) { + if (frameScheduled.callback) { scheduleFrameScheduledCallback(); } else { [getPendingCommandBuffer(&context) presentDrawable:drawable]; @@ -212,62 +254,128 @@ static inline MTLTextureUsage getMetalTextureUsage(TextureUsage usage) { } } -void presentDrawable(bool presentFrame, void* user) { - // CFBridgingRelease here is used to balance the CFBridgingRetain inside of acquireDrawable. - id drawable = (id) CFBridgingRelease(user); - if (presentFrame) { - [drawable present]; +class PresentDrawableData { +public: + PresentDrawableData() = delete; + PresentDrawableData(const PresentDrawableData&) = delete; + PresentDrawableData& operator=(const PresentDrawableData&) = delete; + + static PresentDrawableData* create(id drawable, + std::shared_ptr drawableMutex, MetalDriver* driver, uint64_t flags) { + assert_invariant(drawableMutex); + assert_invariant(driver); + return new PresentDrawableData(drawable, drawableMutex, driver, flags); } - // The drawable will be released here when the "drawable" variable goes out of scope. + + static void maybePresentAndDestroyAsync(PresentDrawableData* that, bool shouldPresent) { + if (shouldPresent) { + [that->mDrawable present]; + } + + if (that->mFlags & SwapChain::CALLBACK_DEFAULT_USE_METAL_COMPLETION_HANDLER) { + cleanupAndDestroy(that); + } else { + // mDrawable is acquired on the driver thread. Typically, we would release this object + // on the same thread, but after receiving consistent crash reports from within + // [CAMetalDrawable dealloc], we suspect this object requires releasing on the main + // thread. + dispatch_async(dispatch_get_main_queue(), ^{ + cleanupAndDestroy(that); + }); + } + } + +private: + PresentDrawableData(id drawable, std::shared_ptr drawableMutex, + MetalDriver* driver, uint64_t flags) + : mDrawable(drawable), mDrawableMutex(drawableMutex), mDriver(driver), mFlags(flags) {} + + static void cleanupAndDestroy(PresentDrawableData *that) { + if (that->mDrawable) { + std::lock_guard lock(*(that->mDrawableMutex)); + that->mDrawable = nil; + } + that->mDrawableMutex.reset(); + that->mDriver = nullptr; + delete that; + } + + id mDrawable; + std::shared_ptr mDrawableMutex; + MetalDriver* mDriver = nullptr; + uint64_t mFlags = 0; +}; + +void presentDrawable(bool presentFrame, void* user) { + auto* presentDrawableData = static_cast(user); + PresentDrawableData::maybePresentAndDestroyAsync(presentDrawableData, presentFrame); } void MetalSwapChain::scheduleFrameScheduledCallback() { - if (!frameScheduledCallback) { + if (!frameScheduled.callback) { return; } assert_invariant(drawable); - FrameScheduledCallback callback = frameScheduledCallback; - // This block strongly captures drawable to keep it alive until the handler executes. - // We cannot simply reference this->drawable inside the block because the block would then only - // capture the _this_ pointer (MetalSwapChain*) instead of the drawable. - id d = drawable; - void* userData = frameScheduledUserData; + + struct Callback { + Callback(std::shared_ptr callback, id drawable, + std::shared_ptr drawableMutex, MetalDriver* driver, uint64_t flags) + : f(callback), data(PresentDrawableData::create(drawable, drawableMutex, driver, flags)) {} + std::shared_ptr f; + // PresentDrawableData* is destroyed by maybePresentAndDestroyAsync() later. + std::unique_ptr data; + static void func(void* user) { + auto* const c = reinterpret_cast(user); + PresentDrawableData* presentDrawableData = c->data.release(); + PresentCallable presentCallable(presentDrawable, presentDrawableData); + c->f->operator()(presentCallable); + delete c; + } + }; + + // This callback pointer will be captured by the block. Even if the scheduled handler is never + // called, the unique_ptr will still ensure we don't leak memory. + uint64_t const flags = frameScheduled.flags; + __block auto callback = std::make_unique( + frameScheduled.callback, drawable, layerDrawableMutex, context.driver, flags); + + backend::CallbackHandler* handler = frameScheduled.handler; + MetalDriver* driver = context.driver; [getPendingCommandBuffer(&context) addScheduledHandler:^(id cb) { - // CFBridgingRetain is used here to give the drawable a +1 retain count before - // casting it to a void*. - PresentCallable callable(presentDrawable, (void*) CFBridgingRetain(d)); - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - callback(callable, userData); - }); + Callback* user = callback.release(); + if (flags & SwapChain::CALLBACK_DEFAULT_USE_METAL_COMPLETION_HANDLER) { + Callback::func(user); + } else { + driver->scheduleCallback(handler, user, &Callback::func); + } }]; } void MetalSwapChain::scheduleFrameCompletedCallback() { - if (!frameCompletedCallback) { + if (!frameCompleted.callback) { return; } - FrameCompletedCallback callback = frameCompletedCallback; - void* userData = frameCompletedUserData; + struct Callback { + Callback(std::shared_ptr> callback) : f(callback) {} + std::shared_ptr> f; + static void func(void* user) { + auto* const c = reinterpret_cast(user); + c->f->operator()(); + delete c; + } + }; + + // This callback pointer will be captured by the block. Even if the completed handler is never + // called, the unique_ptr will still ensure we don't leak memory. + __block auto callback = std::make_unique(frameCompleted.callback); + + CallbackHandler* handler = frameCompleted.handler; + MetalDriver* driver = context.driver; [getPendingCommandBuffer(&context) addCompletedHandler:^(id cb) { - struct CallbackData { - void* userData; - FrameCompletedCallback callback; - }; - CallbackData* data = new CallbackData(); - data->userData = userData; - data->callback = callback; - - // Instantiate a BufferDescriptor with a callback for the sole purpose of passing it to - // scheduleDestroy. This forces the BufferDescriptor callback (and thus the - // FrameCompletedCallback) to be called on the user thread. - BufferDescriptor b(nullptr, 0u, [](void* buffer, size_t size, void* user) { - CallbackData* data = (CallbackData*) user; - data->callback(data->userData); - free(data); - }, data); - context.driver->scheduleDestroy(std::move(b)); + Callback* user = callback.release(); + driver->scheduleCallback(handler, user, &Callback::func); }]; } @@ -275,158 +383,147 @@ BufferDescriptor b(nullptr, 0u, [](void* buffer, size_t size, void* user) { BufferUsage usage, uint32_t byteCount) : HwBufferObject(byteCount), buffer(context, bindingType, usage, byteCount) {} -void MetalBufferObject::updateBuffer(void* data, size_t size, uint32_t byteOffset) { - buffer.copyIntoBuffer(data, size, byteOffset); +void MetalBufferObject::updateBuffer( + void* data, size_t size, uint32_t byteOffset, TagResolver&& getHandleTag) { + buffer.copyIntoBuffer(data, size, byteOffset, std::move(getHandleTag)); } -void MetalBufferObject::updateBufferUnsynchronized(void* data, size_t size, uint32_t byteOffset) { - buffer.copyIntoBufferUnsynchronized(data, size, byteOffset); +void MetalBufferObject::updateBufferUnsynchronized( + void* data, size_t size, uint32_t byteOffset, TagResolver&& getHandleTag) { + buffer.copyIntoBufferUnsynchronized(data, size, byteOffset, std::move(getHandleTag)); } -MetalVertexBuffer::MetalVertexBuffer(MetalContext& context, uint8_t bufferCount, - uint8_t attributeCount, uint32_t vertexCount, AttributeArray const& attributes) - : HwVertexBuffer(bufferCount, attributeCount, vertexCount, attributes), buffers(bufferCount, nullptr) {} +MetalVertexBufferInfo::MetalVertexBufferInfo(MetalContext& context, uint8_t bufferCount, + uint8_t attributeCount, AttributeArray const& attributes) + : HwVertexBufferInfo(bufferCount, attributeCount), + bufferMapping(utils::FixedCapacityVector::with_capacity(MAX_VERTEX_BUFFER_COUNT)) { -MetalIndexBuffer::MetalIndexBuffer(MetalContext& context, BufferUsage usage, uint8_t elementSize, - uint32_t indexCount) : HwIndexBuffer(elementSize, indexCount), - buffer(context, BufferObjectBinding::VERTEX, usage, elementSize * indexCount, true) { } + const size_t maxAttributeCount = attributes.size(); -void MetalRenderPrimitive::setBuffers(MetalVertexBuffer* vertexBuffer, MetalIndexBuffer* - indexBuffer) { - this->vertexBuffer = vertexBuffer; - this->indexBuffer = indexBuffer; + auto& mapping = bufferMapping; + mapping.clear(); + vertexDescription = {}; - const size_t attributeCount = vertexBuffer->attributes.size(); + // Set the layout for the zero buffer, which unused attributes are mapped to. + vertexDescription.layouts[ZERO_VERTEX_BUFFER_LOGICAL_INDEX] = { + .step = MTLVertexStepFunctionConstant, .stride = 16 + }; - vertexDescription = {}; + // Here we map each source buffer to a Metal buffer argument. + // Each attribute has a source buffer, offset, and stride. + // Two source buffers with the same index and stride can share the same Metal buffer argument + // index. + // + // The source buffer is the buffer index that the Filament client sets. + // * source buffer + // .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT2, 0, 12) + // .attribute(VertexAttribute::UV, 0, VertexBuffer::AttributeType::HALF2, 8, 12) + // .attribute(VertexAttribute::COLOR, 1, VertexBuffer::AttributeType::UBYTE4, 0, 4) + + auto allocateOrGetBufferArgumentIndex = + [&mapping, currentBufferArgumentIndex = USER_VERTEX_BUFFER_BINDING_START, this]( + auto sourceBuffer, auto sourceBufferStride) mutable -> uint8_t { + auto match = [&](const auto& e) { + return e.sourceBufferIndex == sourceBuffer && e.stride == sourceBufferStride; + }; + if (auto it = std::find_if(mapping.begin(), mapping.end(), match); it != mapping.end()) { + return it->bufferArgumentIndex; + } else { + auto bufferArgumentIndex = currentBufferArgumentIndex++; + mapping.emplace_back(sourceBuffer, sourceBufferStride, bufferArgumentIndex); + vertexDescription.layouts[bufferArgumentIndex] = { + .step = MTLVertexStepFunctionPerVertex, .stride = sourceBufferStride + }; + return bufferArgumentIndex; + } + }; - // Each attribute gets its own vertex buffer, starting at logical buffer 1. - uint32_t bufferIndex = 1; - for (uint32_t attributeIndex = 0; attributeIndex < attributeCount; attributeIndex++) { - const auto& attribute = vertexBuffer->attributes[attributeIndex]; - if (attribute.buffer == Attribute::BUFFER_UNUSED) { - const uint8_t flags = attribute.flags; - const MTLVertexFormat format = (flags & Attribute::FLAG_INTEGER_TARGET) ? - MTLVertexFormatUInt4 : MTLVertexFormatFloat4; + for (uint32_t attributeIndex = 0; attributeIndex < maxAttributeCount; attributeIndex++) { + const auto& attribute = attributes[attributeIndex]; - // If the attribute is not enabled, bind it to the zero buffer. It's a Metal error for a - // shader to read from missing vertex attributes. + // If the attribute is unused, bind it to the zero buffer. It's a Metal error for a shader + // to read from missing vertex attributes. + if (attribute.buffer == Attribute::BUFFER_UNUSED) { + const MTLVertexFormat format = (attribute.flags & Attribute::FLAG_INTEGER_TARGET) + ? MTLVertexFormatUInt4 + : MTLVertexFormatFloat4; vertexDescription.attributes[attributeIndex] = { - .format = format, - .buffer = ZERO_VERTEX_BUFFER_LOGICAL_INDEX, - .offset = 0 - }; - vertexDescription.layouts[ZERO_VERTEX_BUFFER_LOGICAL_INDEX] = { - .step = MTLVertexStepFunctionConstant, - .stride = 16 + .format = format, .buffer = ZERO_VERTEX_BUFFER_LOGICAL_INDEX, .offset = 0 }; continue; } + // Map the source buffer and stride of this attribute to a Metal buffer argument. + auto bufferArgumentIndex = + allocateOrGetBufferArgumentIndex(attribute.buffer, attribute.stride); + vertexDescription.attributes[attributeIndex] = { - .format = getMetalFormat(attribute.type, - attribute.flags & Attribute::FLAG_NORMALIZED), - .buffer = bufferIndex, - .offset = 0 - }; - vertexDescription.layouts[bufferIndex] = { - .step = MTLVertexStepFunctionPerVertex, - .stride = attribute.stride + .format = getMetalFormat( + attribute.type, attribute.flags & Attribute::FLAG_NORMALIZED), + .buffer = uint32_t(bufferArgumentIndex), + .offset = attribute.offset }; + } +} - bufferIndex++; - }; +MetalVertexBuffer::MetalVertexBuffer(MetalContext& context, + uint32_t vertexCount, uint32_t bufferCount, Handle vbih) + : HwVertexBuffer(vertexCount), vbih(vbih), buffers(bufferCount, nullptr) { } -MetalProgram::MetalProgram(id device, const Program& program) noexcept - : HwProgram(program.getName()), vertexFunction(nil), fragmentFunction(nil), - computeFunction(nil), isValid(false) { +MetalIndexBuffer::MetalIndexBuffer(MetalContext& context, BufferUsage usage, uint8_t elementSize, + uint32_t indexCount) : HwIndexBuffer(elementSize, indexCount), + buffer(context, BufferObjectBinding::VERTEX, usage, elementSize * indexCount, true) { } - using MetalFunctionPtr = __strong id*; +MetalRenderPrimitive::MetalRenderPrimitive() { +} - static_assert(Program::SHADER_TYPE_COUNT == 3, "Only vertex, fragment, and/or compute shaders expected."); - MetalFunctionPtr shaderFunctions[3] = { &vertexFunction, &fragmentFunction, &computeFunction }; +void MetalRenderPrimitive::setBuffers(MetalVertexBufferInfo const* const vbi, + MetalVertexBuffer* vertexBuffer, MetalIndexBuffer* indexBuffer) { + this->vertexBuffer = vertexBuffer; + this->indexBuffer = indexBuffer; +} - const auto& sources = program.getShadersSource(); - for (size_t i = 0; i < Program::SHADER_TYPE_COUNT; i++) { - const auto& source = sources[i]; - // It's okay for some shaders to be empty, they shouldn't be used in any draw calls. - if (source.empty()) { - continue; - } +MetalProgram::MetalProgram(MetalContext& context, Program&& program) noexcept + : HwProgram(program.getName()), mContext(context) { + mToken = context.shaderCompiler->createProgram(program.getName(), std::move(program)); + assert_invariant(mToken); +} - assert_invariant( source[source.size() - 1] == '\0' ); - - // the shader string is null terminated and the length includes the null character - NSString* objcSource = [[NSString alloc] initWithBytes:source.data() - length:source.size() - 1 - encoding:NSUTF8StringEncoding]; - NSError* error = nil; - // When options is nil, Metal uses the most recent language version available. - id library = [device newLibraryWithSource:objcSource - options:nil - error:&error]; - if (library == nil) { - if (error) { - auto description = - [error.localizedDescription cStringUsingEncoding:NSUTF8StringEncoding]; - utils::slog.w << description << utils::io::endl; - } - PANIC_LOG("Failed to compile Metal program."); - return; - } +const MetalShaderCompiler::MetalFunctionBundle& MetalProgram::getFunctions() { + initialize(); + return mFunctionBundle; +} - MTLFunctionConstantValues* constants = [MTLFunctionConstantValues new]; - auto const& specializationConstants = program.getSpecializationConstants(); - for (auto const& sc : specializationConstants) { - const std::array types{ - MTLDataTypeInt, MTLDataTypeFloat, MTLDataTypeBool }; - std::visit([&sc, constants, type = types[sc.value.index()]](auto&& arg) { - [constants setConstantValue:&arg - type:type - atIndex:sc.id]; - }, sc.value); - } +const MetalShaderCompiler::MetalFunctionBundle& MetalProgram::getFunctionsIfPresent() const { + return mFunctionBundle; +} - id function = [library newFunctionWithName:@"main0" - constantValues:constants - error:&error]; - function.label = @(program.getName().c_str()); - assert_invariant(function); - *shaderFunctions[i] = function; +void MetalProgram::initialize() { + if (!mToken) { + return; } - - UTILS_UNUSED_IN_RELEASE const bool isRasterizationProgram = - vertexFunction != nil && fragmentFunction != nil; - UTILS_UNUSED_IN_RELEASE const bool isComputeProgram = computeFunction != nil; - // The program must be either a rasterization program XOR a compute program. - assert_invariant(isRasterizationProgram != isComputeProgram); - - // All stages of the program have compiled successfully, this is a valid program. - isValid = true; - - // Save this program's SamplerGroupInfo, it's used during draw calls to bind sampler groups to - // the appropriate stage(s). - samplerGroupInfo = program.getSamplerGroupInfo(); + mFunctionBundle = mContext.shaderCompiler->getProgram(mToken); + assert_invariant(!mToken); } MetalTexture::MetalTexture(MetalContext& context, SamplerType target, uint8_t levels, TextureFormat format, uint8_t samples, uint32_t width, uint32_t height, uint32_t depth, - TextureUsage usage, TextureSwizzle r, TextureSwizzle g, TextureSwizzle b, - TextureSwizzle a) noexcept - : HwTexture(target, levels, samples, width, height, depth, format, usage), context(context), - externalImage(context, r, g, b, a) { + TextureUsage usage) noexcept + : HwTexture(target, levels, samples, width, height, depth, format, usage), context(context) { + assert_invariant(target != SamplerType::SAMPLER_EXTERNAL); devicePixelFormat = decidePixelFormat(&context, format); - ASSERT_POSTCONDITION(devicePixelFormat != MTLPixelFormatInvalid, "Texture format not supported."); + FILAMENT_CHECK_POSTCONDITION(devicePixelFormat != MTLPixelFormatInvalid) + << "Texture format not supported."; const BOOL mipmapped = levels > 1; const BOOL multisampled = samples > 1; -#if defined(IOS) +#if defined(FILAMENT_IOS) const BOOL textureArray = target == SamplerType::SAMPLER_2D_ARRAY; - ASSERT_PRECONDITION(!textureArray || !multisampled, - "iOS does not support multisampled texture arrays."); + FILAMENT_CHECK_PRECONDITION(!textureArray || !multisampled) + << "iOS does not support multisampled texture arrays."; #endif const auto get2DTextureType = [](SamplerType target, bool isMultisampled) { @@ -436,7 +533,7 @@ BufferDescriptor b(nullptr, 0u, [](void* buffer, size_t size, void* user) { switch (target) { case SamplerType::SAMPLER_2D: return MTLTextureType2DMultisample; -#if !defined(IOS) +#if !defined(FILAMENT_IOS) case SamplerType::SAMPLER_2D_ARRAY: return MTLTextureType2DMultisampleArray; #endif @@ -461,12 +558,12 @@ BufferDescriptor b(nullptr, 0u, [](void* buffer, size_t size, void* user) { descriptor.usage = getMetalTextureUsage(usage); descriptor.storageMode = MTLStorageModePrivate; texture = [context.device newTextureWithDescriptor:descriptor]; - ASSERT_POSTCONDITION(texture != nil, "Could not create Metal texture. Out of memory?"); break; case SamplerType::SAMPLER_CUBEMAP: case SamplerType::SAMPLER_CUBEMAP_ARRAY: - ASSERT_POSTCONDITION(!multisampled, "Multisampled cubemap faces not supported."); - ASSERT_POSTCONDITION(width == height, "Cubemap faces must be square."); + FILAMENT_CHECK_POSTCONDITION(!multisampled) + << "Multisampled cubemap faces not supported."; + FILAMENT_CHECK_POSTCONDITION(width == height) << "Cubemap faces must be square."; descriptor = [MTLTextureDescriptor textureCubeDescriptorWithPixelFormat:devicePixelFormat size:width mipmapped:mipmapped]; @@ -475,7 +572,6 @@ BufferDescriptor b(nullptr, 0u, [](void* buffer, size_t size, void* user) { descriptor.usage = getMetalTextureUsage(usage); descriptor.storageMode = MTLStorageModePrivate; texture = [context.device newTextureWithDescriptor:descriptor]; - ASSERT_POSTCONDITION(texture != nil, "Could not create Metal texture. Out of memory?"); break; case SamplerType::SAMPLER_3D: descriptor = [MTLTextureDescriptor new]; @@ -488,7 +584,6 @@ BufferDescriptor b(nullptr, 0u, [](void* buffer, size_t size, void* user) { descriptor.usage = getMetalTextureUsage(usage); descriptor.storageMode = MTLStorageModePrivate; texture = [context.device newTextureWithDescriptor:descriptor]; - ASSERT_POSTCONDITION(texture != nil, "Could not create Metal texture. Out of memory?"); break; case SamplerType::SAMPLER_EXTERNAL: // If we're using external textures (CVPixelBufferRefs), we don't need to make any @@ -497,15 +592,33 @@ BufferDescriptor b(nullptr, 0u, [](void* buffer, size_t size, void* user) { break; } - // If swizzling is set, set up a swizzled texture view that we'll use when sampling this texture. - const bool isDefaultSwizzle = - r == TextureSwizzle::CHANNEL_0 && - g == TextureSwizzle::CHANNEL_1 && - b == TextureSwizzle::CHANNEL_2 && - a == TextureSwizzle::CHANNEL_3; - // If texture is nil, then it must be a SAMPLER_EXTERNAL texture. - // Swizzling for external textures is handled inside MetalExternalImage. - if (!isDefaultSwizzle && texture && context.supportsTextureSwizzling) { + FILAMENT_CHECK_POSTCONDITION(target == SamplerType::SAMPLER_EXTERNAL || texture != nil) + << "Could not create Metal texture (SamplerType = " << int(target) + << ", levels = " << int(levels) << ", MTLPixelFormat = " << int(devicePixelFormat) + << ", width = " << width << ", height = " << height << ", depth = " << depth + << "). Out of memory?"; +} + +MetalTexture::MetalTexture(MetalContext& context, MetalTexture const* src, uint8_t baseLevel, + uint8_t levelCount) noexcept + : HwTexture(src->target, src->levels, src->samples, src->width, src->height, src->depth, + src->format, src->usage), + context(context), + devicePixelFormat(src->devicePixelFormat), + externalImage(src->externalImage) { + texture = createTextureViewWithLodRange( + src->getMtlTextureForRead(), baseLevel, baseLevel + levelCount - 1); +} + +MetalTexture::MetalTexture(MetalContext& context, MetalTexture const* src, TextureSwizzle r, + TextureSwizzle g, TextureSwizzle b, TextureSwizzle a) noexcept + : HwTexture(src->target, src->levels, src->samples, src->width, src->height, src->depth, + src->format, src->usage), + context(context), + devicePixelFormat(src->devicePixelFormat), + externalImage(src->externalImage) { + texture = src->getMtlTextureForRead(); + if (context.supportsTextureSwizzling) { // Even though we've already checked context.supportsTextureSwizzling, we still need to // guard these calls with @availability, otherwise the API usage will generate compiler // warnings. @@ -519,35 +632,30 @@ BufferDescriptor b(nullptr, 0u, [](void* buffer, size_t size, void* user) { MetalTexture::MetalTexture(MetalContext& context, SamplerType target, uint8_t levels, TextureFormat format, uint8_t samples, uint32_t width, uint32_t height, uint32_t depth, TextureUsage usage, id metalTexture) noexcept - : HwTexture(target, levels, samples, width, height, depth, format, usage), context(context), - externalImage(context) { + : HwTexture(target, levels, samples, width, height, depth, format, usage), context(context) { texture = metalTexture; - updateLodRange(0, levels - 1); } -MetalTexture::~MetalTexture() { - externalImage.set(nullptr); +MetalTexture::MetalTexture(MetalContext& context, TextureFormat format, uint32_t width, + uint32_t height, TextureUsage usage, CVPixelBufferRef image) noexcept + : HwTexture(SamplerType::SAMPLER_EXTERNAL, 1, 1, width, height, 1, format, usage), + context(context), + externalImage(std::make_shared( + MetalExternalImage::createFromImage(context, image))) { + texture = externalImage->getMtlTexture(); } -id MetalTexture::getMtlTextureForRead() noexcept { - if (lodTextureView) { - return lodTextureView; - } - // The texture's swizzle remains constant throughout its lifetime, however its LOD range can - // change. We'll cache the LOD view, and set lodTextureView to nil if minLod or maxLod is - // updated. - id t = swizzledTextureView ? swizzledTextureView : texture; - if (!t) { - return nil; - } - if (UTILS_UNLIKELY(minLod > maxLod)) { - // If the texture does not have any available LODs, provide a view of only level 0. - // Filament should prevent this from ever occurring. - lodTextureView = createTextureViewWithLodRange(t, 0, 0); - return lodTextureView; - } - lodTextureView = createTextureViewWithLodRange(t, minLod, maxLod); - return lodTextureView; +MetalTexture::MetalTexture(MetalContext& context, TextureFormat format, uint32_t width, + uint32_t height, TextureUsage usage, CVPixelBufferRef image, uint32_t plane) noexcept + : HwTexture(SamplerType::SAMPLER_EXTERNAL, 1, 1, width, height, 1, format, usage), + context(context), + externalImage(std::make_shared( + MetalExternalImage::createFromImagePlane(context, image, plane))) { + texture = externalImage->getMtlTexture(); +} + +id MetalTexture::getMtlTextureForRead() const noexcept { + return swizzledTextureView ? swizzledTextureView : texture; } MTLPixelFormat MetalTexture::decidePixelFormat(MetalContext* context, TextureFormat format) { @@ -666,24 +774,21 @@ BufferDescriptor b(nullptr, 0u, [](void* buffer, size_t size, void* user) { assert_invariant(false); } } - - updateLodRange(level); } void MetalTexture::generateMipmaps() noexcept { id blitEncoder = [getPendingCommandBuffer(&context) blitCommandEncoder]; [blitEncoder generateMipmapsForTexture:texture]; [blitEncoder endEncoding]; - updateLodRange(0, texture.mipmapLevelCount - 1); } void MetalTexture::loadSlice(uint32_t level, MTLRegion region, uint32_t byteOffset, uint32_t slice, PixelBufferDescriptor const& data) noexcept { const PixelBufferShape shape = PixelBufferShape::compute(data, format, region.size, byteOffset); - ASSERT_PRECONDITION(data.size >= shape.totalBytes, - "Expected buffer size of at least %d but " - "received PixelBufferDescriptor with size %d.", shape.totalBytes, data.size); + FILAMENT_CHECK_PRECONDITION(data.size >= shape.totalBytes) + << "Expected buffer size of at least " << shape.totalBytes + << " but received PixelBufferDescriptor with size " << data.size << "."; // Earlier versions of iOS don't have the maxBufferLength query, but 256 MB is a safe bet. NSUInteger deviceMaxBufferLength = 256 * 1024 * 1024; // 256 MB @@ -716,13 +821,13 @@ BufferDescriptor b(nullptr, 0u, [](void* buffer, size_t size, void* user) { PixelBufferDescriptor const& data, const PixelBufferShape& shape) { const size_t stagingBufferSize = shape.totalBytes; auto entry = context.bufferPool->acquireBuffer(stagingBufferSize); - memcpy(entry->buffer.contents, + memcpy(entry->buffer.get().contents, static_cast(data.buffer) + shape.sourceOffset, stagingBufferSize); id blitCommandBuffer = getPendingCommandBuffer(&context); id blitCommandEncoder = [blitCommandBuffer blitCommandEncoder]; blitCommandEncoder.label = @"Texture upload buffer blit"; - [blitCommandEncoder copyFromBuffer:entry->buffer + [blitCommandEncoder copyFromBuffer:entry->buffer.get() sourceOffset:0 sourceBytesPerRow:shape.bytesPerRow sourceBytesPerImage:shape.bytesPerSlice @@ -751,13 +856,14 @@ BufferDescriptor b(nullptr, 0u, [](void* buffer, size_t size, void* user) { descriptor.height = region.size.height; descriptor.depth = region.size.depth; -#if defined(IOS) +#if defined(FILAMENT_IOS) descriptor.storageMode = MTLStorageModeShared; #else descriptor.storageMode = MTLStorageModeManaged; #endif id stagingTexture = [context.device newTextureWithDescriptor:descriptor]; + // FIXME? Why is this not just `MTLRegion sourceRegion = region;` ? MTLRegion sourceRegion = MTLRegionMake3D(0, 0, 0, region.size.width, region.size.height, region.size.depth); [stagingTexture replaceRegion:sourceRegion @@ -784,111 +890,19 @@ BufferDescriptor b(nullptr, 0u, [](void* buffer, size_t size, void* user) { slices:NSMakeRange(0, slices)]; } - MetalBlitter::BlitArgs args; + MetalBlitter::BlitArgs args{}; args.filter = SamplerMagFilter::NEAREST; args.source.level = 0; args.source.slice = 0; args.source.region = sourceRegion; + args.source.texture = stagingTexture; args.destination.level = level; args.destination.slice = slice; args.destination.region = region; - args.source.color = stagingTexture; - args.destination.color = destinationTexture; + args.destination.texture = destinationTexture; context.blitter->blit(getPendingCommandBuffer(&context), args, "Texture upload blit"); } -void MetalTexture::updateLodRange(uint32_t level) { - assert_invariant(!isInRenderPass(&context)); - minLod = std::min(minLod, level); - maxLod = std::max(maxLod, level); - lodTextureView = nil; -} - -void MetalTexture::updateLodRange(uint32_t min, uint32_t max) { - assert_invariant(!isInRenderPass(&context)); - assert_invariant(min <= max); - minLod = std::min(minLod, min); - maxLod = std::max(maxLod, max); - lodTextureView = nil; -} - -void MetalSamplerGroup::finalize() { - assert_invariant(encoder); - // TODO: we should be able to encode textures and samplers inside setFinalizedTexture and - // setFinalizedSampler as they become available, but Metal doesn't seem to like this; the arg - // buffer gets encoded incorrectly. This warrants more investigation. - - auto [buffer, offset] = argBuffer->getCurrentAllocation(); - [encoder setArgumentBuffer:buffer offset:offset]; - - // Encode all textures and samplers. - for (size_t s = 0; s < size; s++) { - [encoder setTexture:textures[s] atIndex:(s * 2 + 0)]; - [encoder setSamplerState:samplers[s] atIndex:(s * 2 + 1)]; - } - - finalized = true; -} - -void MetalSamplerGroup::reset(id cmdBuffer, id e, - id device) { - encoder = e; - - // The number of slots in the ring buffer we use to manage argument buffer allocations. - // This number was chosen to avoid running out of slots and having to allocate a "fallback" - // buffer when SamplerGroups are updated multiple times a frame. This value can reduced after - // auditing Filament's calls to updateSamplerGroup, which should be as few times as possible. - // For example, the bloom downsample pass should be refactored to maintain two separate - // MaterialInstances instead of "ping ponging" between two texture bindings, which causes a - // single SamplerGroup to be updated many times a frame. - static constexpr auto METAL_ARGUMENT_BUFFER_SLOTS = 32; - - MTLSizeAndAlign argBufferLayout; - argBufferLayout.size = encoder.encodedLength; - argBufferLayout.align = encoder.alignment; - // Chances are, even though the MTLArgumentEncoder might change, the required size and alignment - // probably won't. So we can re-use the previous ring buffer. - if (UTILS_UNLIKELY(!argBuffer || !argBuffer->canAccomodateLayout(argBufferLayout))) { - argBuffer = std::make_unique(device, MTLResourceStorageModeShared, - argBufferLayout, METAL_ARGUMENT_BUFFER_SLOTS); - } else { - argBuffer->createNewAllocation(cmdBuffer); - } - - // Clear all textures and samplers. - assert_invariant(textureHandles.size() == textures.size()); - assert_invariant(textures.size() == samplers.size()); - for (size_t s = 0; s < textureHandles.size(); s++) { - textureHandles[s] = {}; - textures[s] = nil; - samplers[s] = nil; - } - - finalized = false; -} - -void MetalSamplerGroup::mutate(id cmdBuffer) { - assert_invariant(finalized); // only makes sense to mutate if this sampler group is finalized - assert_invariant(argBuffer); - argBuffer->createNewAllocation(cmdBuffer); - finalized = false; -} - -void MetalSamplerGroup::useResources(id renderPassEncoder) { - assert_invariant(finalized); - if (@available(iOS 13, *)) { - // TODO: pass only the appropriate stages to useResources. - [renderPassEncoder useResources:textures.data() - count:textures.size() - usage:MTLResourceUsageRead | MTLResourceUsageSample - stages:MTLRenderStageFragment | MTLRenderStageVertex]; - } else { - [renderPassEncoder useResources:textures.data() - count:textures.size() - usage:MTLResourceUsageRead | MTLResourceUsageSample]; - } -} - MetalRenderTarget::MetalRenderTarget(MetalContext* context, uint32_t width, uint32_t height, uint8_t samples, Attachment colorAttachments[MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT], Attachment depthAttachment, Attachment stencilAttachment) : @@ -903,9 +917,9 @@ BufferDescriptor b(nullptr, 0u, [](void* buffer, size_t size, void* user) { } color[i] = colorAttachments[i]; - ASSERT_PRECONDITION(color[i].getSampleCount() <= samples, - "MetalRenderTarget was initialized with a MSAA COLOR%d texture, but sample count is %d.", - i, samples); + FILAMENT_CHECK_PRECONDITION(color[i].getSampleCount() <= samples) + << "MetalRenderTarget was initialized with a MSAA COLOR" << i + << " texture, but sample count is " << samples << "."; auto t = color[i].metalTexture; const auto twidth = std::max(1u, t->width >> color[i].level); @@ -928,9 +942,10 @@ BufferDescriptor b(nullptr, 0u, [](void* buffer, size_t size, void* user) { if (depthAttachment) { depth = depthAttachment; - ASSERT_PRECONDITION(depth.getSampleCount() <= samples, - "MetalRenderTarget was initialized with a MSAA DEPTH texture, but sample count is %d.", - samples); + FILAMENT_CHECK_PRECONDITION(depth.getSampleCount() <= samples) + << "MetalRenderTarget was initialized with a MSAA DEPTH texture, but sample count " + "is " + << samples << "."; auto t = depth.metalTexture; const auto twidth = std::max(1u, t->width >> depth.level); @@ -953,9 +968,10 @@ BufferDescriptor b(nullptr, 0u, [](void* buffer, size_t size, void* user) { if (stencilAttachment) { stencil = stencilAttachment; - ASSERT_PRECONDITION(stencil.getSampleCount() <= samples, - "MetalRenderTarget was initialized with a MSAA STENCIL texture, but sample count is %d.", - samples); + FILAMENT_CHECK_PRECONDITION(stencil.getSampleCount() <= samples) + << "MetalRenderTarget was initialized with a MSAA STENCIL texture, but sample " + "count is " + << samples << "."; auto t = stencil.metalTexture; const auto twidth = std::max(1u, t->width >> stencil.level); @@ -1132,7 +1148,7 @@ BufferDescriptor b(nullptr, 0u, [](void* buffer, size_t size, void* user) { MetalRenderTarget::Attachment MetalRenderTarget::getStencilAttachment() { Attachment result = stencil; if (defaultRenderTarget) { - // TODO: do we want the default SwapChain to have a default stencil buffer? + result.texture = context->currentDrawSwapChain->acquireStencilTexture(); } return result; } @@ -1232,5 +1248,195 @@ BufferDescriptor b(nullptr, 0u, [](void* buffer, size_t size, void* user) { return FenceStatus::ERROR; } +MetalDescriptorSetLayout::MetalDescriptorSetLayout(DescriptorSetLayout&& l) noexcept + : mLayout(std::move(l)) { + size_t dynamicBindings = 0; + for (const auto& binding : mLayout.bindings) { + if (any(binding.flags & DescriptorFlags::DYNAMIC_OFFSET)) { + dynamicBindings++; + } + } + mDynamicOffsetCount = dynamicBindings; +} + +id MetalDescriptorSetLayout::getArgumentEncoder(id device, ShaderStage stage, + utils::FixedCapacityVector const& textureTypes) { + auto const index = static_cast(stage); + assert_invariant(index < mCachedArgumentEncoder.size()); + if (mCachedArgumentEncoder[index] && + std::equal( + textureTypes.begin(), textureTypes.end(), mCachedTextureTypes[index].begin())) { + return mCachedArgumentEncoder[index]; + } + mCachedArgumentEncoder[index] = getArgumentEncoderSlow(device, stage, textureTypes); + mCachedTextureTypes[index] = textureTypes; + return mCachedArgumentEncoder[index]; +} + +id MetalDescriptorSetLayout::getArgumentEncoderSlow(id device, + ShaderStage stage, utils::FixedCapacityVector const& textureTypes) { + auto const& bindings = getBindings(); + NSMutableArray* arguments = [NSMutableArray new]; + // Important! The bindings must be sorted by binding number. This has already been done inside + // createDescriptorSetLayout. + size_t textureIndex = 0; + for (auto const& binding : bindings) { + if (!hasShaderType(binding.stageFlags, stage)) { + continue; + } + switch (binding.type) { + case DescriptorType::UNIFORM_BUFFER: + case DescriptorType::SHADER_STORAGE_BUFFER: { + MTLArgumentDescriptor* bufferArgument = [MTLArgumentDescriptor argumentDescriptor]; + bufferArgument.index = binding.binding * 2; + bufferArgument.dataType = MTLDataTypePointer; + bufferArgument.access = MTLArgumentAccessReadOnly; + [arguments addObject:bufferArgument]; + break; + } + case DescriptorType::SAMPLER: + case DescriptorType::SAMPLER_EXTERNAL: { + MTLArgumentDescriptor* textureArgument = [MTLArgumentDescriptor argumentDescriptor]; + textureArgument.index = binding.binding * 2; + textureArgument.dataType = MTLDataTypeTexture; + MTLTextureType textureType = MTLTextureType2D; + if (textureIndex < textureTypes.size()) { + textureType = textureTypes[textureIndex++]; + } + textureArgument.textureType = textureType; + textureArgument.access = MTLArgumentAccessReadOnly; + [arguments addObject:textureArgument]; + + MTLArgumentDescriptor* samplerArgument = [MTLArgumentDescriptor argumentDescriptor]; + samplerArgument.index = binding.binding * 2 + 1; + samplerArgument.dataType = MTLDataTypeSampler; + textureArgument.access = MTLArgumentAccessReadOnly; + [arguments addObject:samplerArgument]; + break; + } + case DescriptorType::INPUT_ATTACHMENT: + // TODO: support INPUT_ATTACHMENT + assert_invariant(false); + break; + } + } + return [device newArgumentEncoderWithArguments:arguments]; +} + +MetalDescriptorSet::MetalDescriptorSet(MetalDescriptorSetLayout* layout) noexcept + : layout(layout) {} + +void MetalDescriptorSet::finalize(MetalDriver* driver) { + [driver->mContext->currentRenderPassEncoder useResource:driver->mContext->emptyBuffer + usage:MTLResourceUsageRead]; + [driver->mContext->currentRenderPassEncoder + useResource:getOrCreateEmptyTexture(driver->mContext) + usage:MTLResourceUsageRead]; + + if (@available(iOS 13.0, *)) { + [driver->mContext->currentRenderPassEncoder useResources:vertexResources.data() + count:vertexResources.size() + usage:MTLResourceUsageRead + stages:MTLRenderStageVertex]; + [driver->mContext->currentRenderPassEncoder useResources:fragmentResources.data() + count:fragmentResources.size() + usage:MTLResourceUsageRead + stages:MTLRenderStageFragment]; + } else { + [driver->mContext->currentRenderPassEncoder useResources:vertexResources.data() + count:vertexResources.size() + usage:MTLResourceUsageRead]; + [driver->mContext->currentRenderPassEncoder useResources:fragmentResources.data() + count:fragmentResources.size() + usage:MTLResourceUsageRead]; + } +} + +id MetalDescriptorSet::finalizeAndGetBuffer(MetalDriver* driver, ShaderStage stage) { + auto const index = static_cast(stage); + assert_invariant(index < cachedBuffer.size()); + auto& buffer = cachedBuffer[index]; + + if (buffer) { + return buffer.get(); + } + + // Map all the texture bindings to their respective texture types. + auto const& bindings = layout->getBindings(); + auto textureTypes = utils::FixedCapacityVector::with_capacity(bindings.size()); + for (auto const& binding : bindings) { + if (!hasShaderType(binding.stageFlags, stage)) { + continue; + } + MTLTextureType textureType = MTLTextureType2D; + if (auto found = textures.find(binding.binding); found != textures.end()) { + auto const& textureBinding = textures[binding.binding]; + textureType = textureBinding.texture.textureType; + } + textureTypes.push_back(textureType); + } + + MetalContext const& context = *driver->mContext; + + id encoder = + layout->getArgumentEncoder(context.device, stage, textureTypes); + + { + ScopedAllocationTimer timer("descriptor_set"); + buffer = { [context.device newBufferWithLength:encoder.encodedLength + options:MTLResourceStorageModeShared], + TrackedMetalBuffer::Type::DESCRIPTOR_SET }; + } + [encoder setArgumentBuffer:buffer.get() offset:0]; + + for (auto const& binding : bindings) { + if (!hasShaderType(binding.stageFlags, stage)) { + continue; + } + switch (binding.type) { + case DescriptorType::UNIFORM_BUFFER: + case DescriptorType::SHADER_STORAGE_BUFFER: { + auto found = buffers.find(binding.binding); + if (found == buffers.end()) { + [encoder setBuffer:driver->mContext->emptyBuffer + offset:0 + atIndex:binding.binding * 2]; + continue; + } + + auto const& bufferBinding = buffers[binding.binding]; + [encoder setBuffer:bufferBinding.buffer + offset:bufferBinding.offset + atIndex:binding.binding * 2]; + break; + } + case DescriptorType::SAMPLER: + case DescriptorType::SAMPLER_EXTERNAL: { + auto found = textures.find(binding.binding); + if (found == textures.end()) { + [encoder setTexture:driver->mContext->emptyTexture atIndex:binding.binding * 2]; + id sampler = + driver->mContext->samplerStateCache.getOrCreateState({}); + [encoder setSamplerState:sampler atIndex:binding.binding * 2 + 1]; + continue; + } + + auto const& textureBinding = textures[binding.binding]; + [encoder setTexture:textureBinding.texture atIndex:binding.binding * 2]; + SamplerState samplerState { .samplerParams = textureBinding.sampler }; + id sampler = + driver->mContext->samplerStateCache.getOrCreateState(samplerState); + [encoder setSamplerState:sampler atIndex:binding.binding * 2 + 1]; + break; + } + case DescriptorType::INPUT_ATTACHMENT: + assert_invariant(false); + break; + } + } + + return buffer.get(); +} + } // namespace backend } // namespace filament diff --git a/filament/backend/src/metal/MetalPlatform.mm b/filament/backend/src/metal/MetalPlatform.mm index 31ce2a8070a..4979e602ba1 100644 --- a/filament/backend/src/metal/MetalPlatform.mm +++ b/filament/backend/src/metal/MetalPlatform.mm @@ -37,7 +37,7 @@ id MetalPlatform::createDevice() noexcept { id result; -#if !defined(IOS) +#if !defined(FILAMENT_IOS) const bool forceIntegrated = NSProcessInfo.processInfo.environment[@"FILAMENT_FORCE_INTEGRATED_GPU"] != nil; if (forceIntegrated) { diff --git a/filament/backend/src/metal/MetalShaderCompiler.h b/filament/backend/src/metal/MetalShaderCompiler.h new file mode 100644 index 00000000000..dfb29f47b08 --- /dev/null +++ b/filament/backend/src/metal/MetalShaderCompiler.h @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_METAL_METALSHADERCOMPILER_H +#define TNT_FILAMENT_BACKEND_METAL_METALSHADERCOMPILER_H + +#include "CompilerThreadPool.h" + +#include "CallbackManager.h" + +#include +#include + +#include + +#include + +#include +#include +#include +#include + +namespace filament::backend { + +class MetalDriver; + +class MetalShaderCompiler { + struct MetalProgramToken; + +public: + enum class Mode { + SYNCHRONOUS, // synchronous shader compilation + ASYNCHRONOUS // asynchronous shader compilation + }; + + class MetalFunctionBundle { + public: + using Raster = std::tuple, id>; + using Compute = id; + using Error = std::tuple; // error message, Program name + struct None {}; + + MetalFunctionBundle() : mPrograms{None{}} {} + + explicit operator bool() const { return isValid(); } + + bool isValid() const noexcept { + return std::holds_alternative(mPrograms) || + std::holds_alternative(mPrograms); + } + + /** + * Throws an NSException if this MetalFunctionBundle either contains an error or is empty. + * + * If this MetalFunctionBundle contains an error, will throw a MetalCompilationFailure + * NSException with the error string and program name passed to + * MetalFunctionBundle::error(NSString*, NSString*). + * + * If this MetalFunctionBundle is empty, will throw a MetalEmptyFunctionBundle NSException. + */ + void validate() const; + + Raster getRasterFunctions() const { + assert_invariant(std::holds_alternative(mPrograms)); + return std::get(mPrograms); + } + + Compute getComputeFunction() const { + assert_invariant(std::holds_alternative(mPrograms)); + return std::get(mPrograms); + } + + bool isRaster() const { return std::holds_alternative(mPrograms); } + + bool isCompute() const { return std::holds_alternative(mPrograms); } + + static MetalFunctionBundle none() { + return MetalFunctionBundle(None{}); + } + + static MetalFunctionBundle raster(id fragment, id vertex) { + assert_invariant(fragment && vertex); + assert_invariant(fragment.functionType == MTLFunctionTypeFragment); + assert_invariant(vertex.functionType == MTLFunctionTypeVertex); + return MetalFunctionBundle(Raster{fragment, vertex}); + } + + static MetalFunctionBundle compute(id compute) { + assert_invariant(compute); + assert_invariant(compute.functionType == MTLFunctionTypeKernel); + return MetalFunctionBundle(Compute{compute}); + } + + static MetalFunctionBundle error(NSString* errorMessage, NSString* programName) { + return MetalFunctionBundle(Error{errorMessage, programName}); + } + + private: + MetalFunctionBundle(None&& t) : mPrograms(std::move(t)) {} + MetalFunctionBundle(Raster&& t) : mPrograms(std::move(t)) {} + MetalFunctionBundle(Compute&& t) : mPrograms(std::move(t)) {} + MetalFunctionBundle(Error&& t) : mPrograms(std::move(t)) {} + + std::variant mPrograms; + }; + + using program_token_t = std::shared_ptr; + + explicit MetalShaderCompiler(id device, MetalDriver& driver, Mode mode); + + MetalShaderCompiler(MetalShaderCompiler const& rhs) = delete; + MetalShaderCompiler(MetalShaderCompiler&& rhs) = delete; + MetalShaderCompiler& operator=(MetalShaderCompiler const& rhs) = delete; + MetalShaderCompiler& operator=(MetalShaderCompiler&& rhs) = delete; + + void init() noexcept; + void terminate() noexcept; + + bool isParallelShaderCompileSupported() const noexcept; + + // Creates a program, either synchronously or asynchronously, depending on the Mode + // MetalShaderCompiler was constructed with. + program_token_t createProgram(utils::CString const& name, Program&& program); + + // Returns the functions, blocking if necessary. The Token is destroyed and becomes invalid. + MetalFunctionBundle getProgram(program_token_t& token); + + void notifyWhenAllProgramsAreReady( + CallbackHandler* handler, CallbackHandler::Callback callback, void* user); + +private: + static MetalFunctionBundle compileProgram(const Program& program, id device); + + CompilerThreadPool mCompilerThreadPool; + id mDevice; + CallbackManager mCallbackManager; + Mode mMode; +}; + +} // namespace filament::backend + +#endif // TNT_FILAMENT_BACKEND_METAL_METALSHADERCOMPILER_H diff --git a/filament/backend/src/metal/MetalShaderCompiler.mm b/filament/backend/src/metal/MetalShaderCompiler.mm new file mode 100644 index 00000000000..0a5f9e345cc --- /dev/null +++ b/filament/backend/src/metal/MetalShaderCompiler.mm @@ -0,0 +1,295 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MetalShaderCompiler.h" + +#include "MetalDriver.h" + +#include + +#include +#include + +#include + +namespace filament::backend { + +using namespace utils; + +struct MetalShaderCompiler::MetalProgramToken : ProgramToken { + + MetalProgramToken(MetalShaderCompiler& compiler) noexcept + : compiler(compiler) { + } + ~MetalProgramToken() override; + + void set(MetalFunctionBundle p) noexcept { + std::unique_lock const l(lock); + std::swap(program, p); + signaled = true; + cond.notify_one(); + } + + MetalFunctionBundle get() const noexcept { + std::unique_lock l(lock); + cond.wait(l, [this](){ return signaled; }); + return program; + } + + void wait() const noexcept { + std::unique_lock l(lock); + cond.wait(l, [this]() { return signaled; }); + } + + bool isReady() const noexcept { + std::unique_lock l(lock); + using namespace std::chrono_literals; + return cond.wait_for(l, 0s, [this]() { return signaled; }); + } + + MetalShaderCompiler& compiler; + CallbackManager::Handle handle{}; + MetalFunctionBundle program{}; + mutable utils::Mutex lock; + mutable utils::Condition cond; + bool signaled = false; +}; + +MetalShaderCompiler::MetalProgramToken::~MetalProgramToken() = default; + +MetalShaderCompiler::MetalShaderCompiler(id device, MetalDriver& driver, Mode mode) + : mDevice(device), + mCallbackManager(driver), + mMode(mode) { + +} + +void MetalShaderCompiler::init() noexcept { + const uint32_t poolSize = 1; + if (mMode == Mode::ASYNCHRONOUS) { + mCompilerThreadPool.init(poolSize, []() {}, []() {}); + } +} + +void MetalShaderCompiler::terminate() noexcept { + if (mMode == Mode::ASYNCHRONOUS) { + mCompilerThreadPool.terminate(); + } + mCallbackManager.terminate(); +} + +bool MetalShaderCompiler::isParallelShaderCompileSupported() const noexcept { + return mMode == Mode::ASYNCHRONOUS; +} + +/* static */ MetalShaderCompiler::MetalFunctionBundle MetalShaderCompiler::compileProgram( + const Program& program, id device) { + std::array, Program::SHADER_TYPE_COUNT> functions = { nil }; + const auto& sources = program.getShadersSource(); + for (size_t i = 0; i < Program::SHADER_TYPE_COUNT; i++) { + const auto& source = sources[i]; + // It's okay for some shaders to be empty, they shouldn't be used in any draw calls. + if (source.empty()) { + continue; + } + + NSError* error = nil; + id library = nil; + switch (program.getShaderLanguage()) { + case ShaderLanguage::MSL: { + // By default, Metal uses the most recent language version. + MTLCompileOptions* options = [MTLCompileOptions new]; + + // Disable Fast Math optimizations. + // This ensures that operations adhere to IEEE standards for floating-point + // arithmetic, which is crucial for half precision floats in scenarios where fast + // math optimizations lead to inaccuracies, such as in handling special values like + // NaN or Infinity. + options.fastMathEnabled = NO; + + assert_invariant(source[source.size() - 1] == '\0'); + // the shader string is null terminated and the length includes the null character + NSString* objcSource = [[NSString alloc] initWithBytes:source.data() + length:source.size() - 1 + encoding:NSUTF8StringEncoding]; + library = [device newLibraryWithSource:objcSource options:options error:&error]; + break; + } + case ShaderLanguage::METAL_LIBRARY: { + dispatch_data_t data = dispatch_data_create(source.data(), source.size(), + dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), + DISPATCH_DATA_DESTRUCTOR_DEFAULT); + library = [device newLibraryWithData:data error:&error]; + break; + } + case ShaderLanguage::ESSL1: + case ShaderLanguage::ESSL3: + case ShaderLanguage::SPIRV: + break; + } + + if (library == nil) { + NSString* errorMessage = @"unknown error"; + if (error) { + auto description = + [error.localizedDescription cStringUsingEncoding:NSUTF8StringEncoding]; + utils::slog.w << description << utils::io::endl; + errorMessage = error.localizedDescription; + } + PANIC_LOG("Failed to compile Metal program."); + NSString* programName = [NSString stringWithFormat:@"%s", program.getName().c_str_safe()]; + return MetalFunctionBundle::error(errorMessage, programName); + } + + MTLFunctionConstantValues* constants = [MTLFunctionConstantValues new]; + auto const& specializationConstants = program.getSpecializationConstants(); + for (auto const& sc : specializationConstants) { + const std::array types{ + MTLDataTypeInt, MTLDataTypeFloat, MTLDataTypeBool }; + std::visit([&sc, constants, type = types[sc.value.index()]](auto&& arg) { + [constants setConstantValue:&arg + type:type + atIndex:sc.id]; + }, sc.value); + } + + id function = [library newFunctionWithName:@"main0" + constantValues:constants + error:&error]; + if (function == nil) { + // If the library loads but functions within it fail to load, it usually means the + // GPU backend crashed. (This can happen if it's a Metallib shader that was compiled + // with a minimum iOS version that's newer than this device.) + NSString* errorMessage = @"unknown error"; + if (error) { + auto description = + [error.localizedDescription cStringUsingEncoding:NSUTF8StringEncoding]; + utils::slog.w << description << utils::io::endl; + errorMessage = error.localizedDescription; + } + PANIC_LOG("Failed to load main0 in Metal program."); + NSString* programName = + [NSString stringWithFormat:@"%s::main0", program.getName().c_str_safe()]; + return MetalFunctionBundle::error(errorMessage, programName); + } + + if (!program.getName().empty()) { + function.label = @(program.getName().c_str()); + } + assert_invariant(function); + functions[i] = function; + } + + static_assert(Program::SHADER_TYPE_COUNT == 3, + "Only vertex, fragment, and/or compute shaders expected."); + id vertexFunction = functions[0]; + id fragmentFunction = functions[1]; + id computeFunction = functions[2]; + const bool isRasterizationProgram = vertexFunction != nil && fragmentFunction != nil; + const bool isComputeProgram = computeFunction != nil; + // The program must be either a rasterization program XOR a compute program. + assert_invariant(isRasterizationProgram != isComputeProgram); + + if (isRasterizationProgram) { + return MetalFunctionBundle::raster(fragmentFunction, vertexFunction); + } + + if (isComputeProgram) { + return MetalFunctionBundle::compute(computeFunction); + } + + // Should never reach here. + return MetalFunctionBundle::none(); +} + +MetalShaderCompiler::program_token_t MetalShaderCompiler::createProgram( + CString const& name, Program&& program) { + auto token = std::make_shared(*this); + + token->handle = mCallbackManager.get(); + + switch (mMode) { + case Mode::ASYNCHRONOUS: { + CompilerPriorityQueue const priorityQueue = program.getPriorityQueue(); + mCompilerThreadPool.queue(priorityQueue, token, + [this, name, device = mDevice, program = std::move(program), token]() { + @autoreleasepool { + MetalFunctionBundle compiledProgram = compileProgram(program, device); + token->set(compiledProgram); + mCallbackManager.put(token->handle); + } + }); + + break; + } + + case Mode::SYNCHRONOUS: { + MetalFunctionBundle compiledProgram = compileProgram(program, mDevice); + token->set(compiledProgram); + mCallbackManager.put(token->handle); + break; + } + } + + return token; +} + +MetalShaderCompiler::MetalFunctionBundle MetalShaderCompiler::getProgram(program_token_t& token) { + assert_invariant(token); + + if (mMode == Mode::ASYNCHRONOUS) { + if (!token->isReady()) { + auto job = mCompilerThreadPool.dequeue(token); + if (job) { + job(); + } + } + } + + // The job isn't guaranteed to have finished yet. We may have failed to dequeue it above, + // which means it's currently running. In that case get() will block until it finishes. + + MetalShaderCompiler::MetalFunctionBundle program = token->get(); + token = nullptr; + return program; +} + +void MetalShaderCompiler::notifyWhenAllProgramsAreReady( + CallbackHandler* handler, CallbackHandler::Callback callback, void* user) { + mCallbackManager.setCallback(handler, callback, user); +} + +UTILS_NOINLINE +void MetalShaderCompiler::MetalFunctionBundle::validate() const { + if (UTILS_UNLIKELY(std::holds_alternative(mPrograms))) { + auto [errorMessage, programName] = std::get(mPrograms); + NSString* reason = + [NSString stringWithFormat: + @"Attempting to draw with an id that failed to compile.\n" + @"Program: %@\n" + @"%@", programName, errorMessage]; + [[NSException exceptionWithName:@"MetalCompilationFailure" + reason:reason + userInfo:nil] raise]; + } else if (UTILS_UNLIKELY(std::holds_alternative(mPrograms))) { + NSString* reason = @"Attempting to draw with an empty id."; + [[NSException exceptionWithName:@"MetalEmptyFunctionBundle" + reason:reason + userInfo:nil] raise]; + } +} + +} // namespace filament::backend diff --git a/filament/backend/src/metal/MetalState.h b/filament/backend/src/metal/MetalState.h index 6bef3bf33b5..a9e9e76fff4 100644 --- a/filament/backend/src/metal/MetalState.h +++ b/filament/backend/src/metal/MetalState.h @@ -28,35 +28,35 @@ #include #include + #include +#include namespace filament { namespace backend { -inline bool operator==(const SamplerParams& lhs, const SamplerParams& rhs) { - return lhs.u == rhs.u; -} - // Rasterization Bindings // ---------------------- // Bindings Buffer name Count // ------------------------------------------------------ // 0 Zero buffer (placeholder vertex buffer) 1 // 1-16 Filament vertex buffers 16 limited by MAX_VERTEX_BUFFER_COUNT -// 17-26 Uniform buffers 10 Program::UNIFORM_BINDING_COUNT -// 27-30 Sampler groups (argument buffers) 4 Program::SAMPLER_BINDING_COUNT +// 20 Push constants 1 +// 21-24 Descriptor sets (argument buffers) 4 limited by MAX_DESCRIPTOR_SET_COUNT +// 25 Dynamic offset buffer 1 // -// Total 31 +// Total 23 // Compute Bindings // ---------------------- // Bindings Buffer name Count // ------------------------------------------------------ // 0-3 SSBO buffers 4 MAX_SSBO_COUNT -// 17-26 Uniform buffers 10 Program::UNIFORM_BINDING_COUNT -// 27-30 Sampler groups (argument buffers) 4 Program::SAMPLER_BINDING_COUNT +// 20 Push constants 1 +// 21-24 Descriptor sets (argument buffers) 4 limited by MAX_DESCRIPTOR_SET_COUNT +// 25 Dynamic offset buffer 1 // -// Total 18 +// Total 10 // The total number of vertex buffer "slots" that the Metal backend can bind. // + 1 to account for the zero buffer, a placeholder buffer used internally by the Metal backend. @@ -69,10 +69,11 @@ static constexpr uint32_t ZERO_VERTEX_BUFFER_BINDING = 0u; static constexpr uint32_t USER_VERTEX_BUFFER_BINDING_START = 1u; + // These constants must match the equivalent in CodeGenerator.h. -static constexpr uint32_t UNIFORM_BUFFER_BINDING_START = 17u; -static constexpr uint32_t SSBO_BINDING_START = 0u; -static constexpr uint32_t SAMPLER_GROUP_BINDING_START = 27u; +static constexpr uint32_t PUSH_CONSTANT_BUFFER_INDEX = 20u; +static constexpr uint32_t DESCRIPTOR_SET_BINDING_START = 21u; +static constexpr uint32_t DYNAMIC_OFFSET_BINDING = 25u; // Forward declarations necessary here, definitions at end of file. inline bool operator==(const MTLViewport& lhs, const MTLViewport& rhs); @@ -161,6 +162,8 @@ template> class StateCache { + using MapType = tsl::robin_map; + public: StateCache() = default; @@ -170,6 +173,18 @@ class StateCache { void setDevice(id device) noexcept { mDevice = device; } + void removeIf(utils::Invocable fn) noexcept { + typename MapType::const_iterator it = mStateCache.begin(); + while (it != mStateCache.end()) { + const auto& [key, _] = *it; + if (UTILS_UNLIKELY(fn(key))) { + it = mStateCache.erase(it); + } else { + ++it; + } + } + } + MetalType getOrCreateState(const StateType& state) noexcept { assert_invariant(mDevice); @@ -197,7 +212,7 @@ class StateCache { StateCreator creator; id mDevice = nil; - tsl::robin_map mStateCache; + MapType mStateCache; }; @@ -205,9 +220,8 @@ class StateCache { // Different kinds of state, like pipeline state, uniform buffer state, etc., are passed to the // current Metal command encoder and persist throughout the lifetime of the encoder (a frame). // StateTracker is used to prevent calling redundant state change methods. -template +template > class StateTracker { - public: // Call to force the state to dirty at the beginning of each frame, as all state must be @@ -215,7 +229,7 @@ class StateTracker { void invalidate() noexcept { mStateDirty = true; } void updateState(const StateType& newState) noexcept { - if (mCurrentState != newState) { + if (!StateEqual()(mCurrentState, newState)) { mCurrentState = newState; mStateDirty = true; } @@ -236,7 +250,6 @@ class StateTracker { bool mStateDirty = true; StateType mCurrentState = {}; - }; // Pipeline state @@ -344,6 +357,16 @@ using DepthStencilStateTracker = StateTracker; using DepthStencilStateCache = StateCache, DepthStateCreator>; +struct MtlScissorRectEqual { + bool operator()(const MTLScissorRect& lhs, const MTLScissorRect& rhs) const { + return lhs.height == rhs.height && + lhs.width == rhs.width && + lhs.x == rhs.x && + lhs.y == rhs.y; + } +}; +using ScissorRectStateTracker = StateTracker; + // Uniform buffers class MetalBufferObject; @@ -380,18 +403,22 @@ using SamplerStateCache = StateCache, SamplerS using CullModeStateTracker = StateTracker; using WindingStateTracker = StateTracker; +using DepthClampStateTracker = StateTracker; // Argument encoder struct ArgumentEncoderState { + NSUInteger bufferCount; utils::FixedCapacityVector textureTypes; - explicit ArgumentEncoderState(utils::FixedCapacityVector&& types) - : textureTypes(std::move(types)) {} + explicit ArgumentEncoderState( + NSUInteger bufferCount, utils::FixedCapacityVector&& types) + : bufferCount(bufferCount), textureTypes(std::move(types)) {} bool operator==(const ArgumentEncoderState& rhs) const noexcept { return std::equal(textureTypes.begin(), textureTypes.end(), rhs.textureTypes.begin(), - rhs.textureTypes.end()); + rhs.textureTypes.end()) && + bufferCount == rhs.bufferCount; } bool operator!=(const ArgumentEncoderState& rhs) const noexcept { @@ -413,6 +440,30 @@ struct ArgumentEncoderCreator { using ArgumentEncoderCache = StateCache, ArgumentEncoderCreator, ArgumentEncoderHasher>; +template +class MetalBufferBindings { +public: + MetalBufferBindings() { invalidate(); } + + void invalidate() { + mDirtyBuffers.reset(); + mDirtyOffsets.reset(); + for (int i = 0; i < int(N); i++) { + mDirtyBuffers.set(i, true); + mDirtyOffsets.set(i, true); + } + } + void setBuffer(const id buffer, NSUInteger offset, NSUInteger index); + void bindBuffers(id encoder, NSUInteger startIndex); + +private: + static_assert(N <= 8); + std::array<__weak id, N> mBuffers = { nil }; + std::array mOffsets = { 0 }; + utils::bitset8 mDirtyBuffers; + utils::bitset8 mDirtyOffsets; +}; + } // namespace backend } // namespace filament diff --git a/filament/backend/src/metal/MetalState.mm b/filament/backend/src/metal/MetalState.mm index 2b8a02e7bf8..c790e03c304 100644 --- a/filament/backend/src/metal/MetalState.mm +++ b/filament/backend/src/metal/MetalState.mm @@ -18,6 +18,8 @@ #include "MetalEnums.h" +#include + namespace filament { namespace backend { @@ -88,11 +90,17 @@ NSError* error = nullptr; id pipeline = [device newRenderPipelineStateWithDescriptor:descriptor error:&error]; - if (error) { - auto description = [error.localizedDescription cStringUsingEncoding:NSUTF8StringEncoding]; + if (UTILS_UNLIKELY(pipeline == nil)) { + NSString *errorMessage = + [NSString stringWithFormat:@"Could not create Metal pipeline state: %@", + error ? error.localizedDescription : @"unknown error"]; + auto description = [errorMessage cStringUsingEncoding:NSUTF8StringEncoding]; utils::slog.e << description << utils::io::endl; + [[NSException exceptionWithName:@"MetalRenderPipelineFailure" + reason:errorMessage + userInfo:nil] raise]; } - ASSERT_POSTCONDITION(error == nil, "Could not create Metal pipeline state."); + FILAMENT_CHECK_POSTCONDITION(error == nil) << "Could not create Metal pipeline state."; return pipeline; } @@ -142,7 +150,7 @@ MTLCompareFunctionNever : getCompareFunction(params.compareFunc); samplerDescriptor.supportArgumentBuffers = YES; -#if defined(IOS) +#if defined(FILAMENT_IOS) // Older Apple devices (and the simulator) don't support setting a comparison function in // MTLSamplerDescriptor. // In practice, this means shadows are not supported when running in the simulator. @@ -158,28 +166,40 @@ id ArgumentEncoderCreator::operator()(id device, const ArgumentEncoderState &state) noexcept { const auto& textureTypes = state.textureTypes; - const auto& count = textureTypes.size(); - assert_invariant(count > 0); + const auto& textureCount = textureTypes.size(); + const auto& bufferCount = state.bufferCount; + assert_invariant(textureCount > 0); // Metal has separate data types for textures versus samplers, so the argument buffer layout // alternates between texture and sampler, i.e.: + // buffer0 + // buffer1 // textureA // samplerA // textureB // samplerB // etc NSMutableArray* arguments = - [NSMutableArray arrayWithCapacity:(count * 2)]; - for (size_t i = 0; i < count; i++) { + [NSMutableArray arrayWithCapacity:(bufferCount + textureCount * 2)]; + size_t i = 0; + for (size_t j = 0; j < bufferCount; j++) { + MTLArgumentDescriptor* bufferArgument = [MTLArgumentDescriptor argumentDescriptor]; + bufferArgument.index = i++; + bufferArgument.dataType = MTLDataTypePointer; + bufferArgument.access = MTLArgumentAccessReadOnly; + [arguments addObject:bufferArgument]; + } + + for (size_t j = 0; j < textureCount; j++) { MTLArgumentDescriptor* textureArgument = [MTLArgumentDescriptor argumentDescriptor]; - textureArgument.index = i * 2 + 0; + textureArgument.index = i++; textureArgument.dataType = MTLDataTypeTexture; textureArgument.textureType = textureTypes[i]; textureArgument.access = MTLArgumentAccessReadOnly; [arguments addObject:textureArgument]; MTLArgumentDescriptor* samplerArgument = [MTLArgumentDescriptor argumentDescriptor]; - samplerArgument.index = i * 2 + 1; + samplerArgument.index = i++; samplerArgument.dataType = MTLDataTypeSampler; textureArgument.access = MTLArgumentAccessReadOnly; [arguments addObject:samplerArgument]; @@ -188,5 +208,64 @@ return [device newArgumentEncoderWithArguments:arguments]; } +template +void MetalBufferBindings::setBuffer(const id buffer, NSUInteger offset, NSUInteger index) { + assert_invariant(offset + 1 <= N); + + if (mBuffers[index] != buffer) { + mBuffers[index] = buffer; + mDirtyBuffers.set(index); + } + + if (mOffsets[index] != offset) { + mOffsets[index] = offset; + mDirtyOffsets.set(index); + } +} + +template +void MetalBufferBindings::bindBuffers( + id encoder, NSUInteger startIndex) { + if (mDirtyBuffers.none() && mDirtyOffsets.none()) { + return; + } + + utils::bitset8 onlyOffsetDirty = mDirtyOffsets & ~mDirtyBuffers; + onlyOffsetDirty.forEachSetBit([&](size_t i) { + if constexpr (stage == ShaderStage::VERTEX) { + [(id)encoder setVertexBufferOffset:mOffsets[i] + atIndex:i + startIndex]; + } else if constexpr (stage == ShaderStage::FRAGMENT) { + [(id)encoder setFragmentBufferOffset:mOffsets[i] + atIndex:i + startIndex]; + } else if constexpr (stage == ShaderStage::COMPUTE) { + [(id)encoder setBufferOffset:mOffsets[i] + atIndex:i + startIndex]; + } + }); + mDirtyOffsets.reset(); + + mDirtyBuffers.forEachSetBit([&](size_t i) { + if constexpr (stage == ShaderStage::VERTEX) { + [(id)encoder setVertexBuffer:mBuffers[i] + offset:mOffsets[i] + atIndex:i + startIndex]; + } else if constexpr (stage == ShaderStage::FRAGMENT) { + [(id)encoder setFragmentBuffer:mBuffers[i] + offset:mOffsets[i] + atIndex:i + startIndex]; + } else if constexpr (stage == ShaderStage::COMPUTE) { + [(id)encoder setBuffer:mBuffers[i] + offset:mOffsets[i] + atIndex:i + startIndex]; + } + }); + mDirtyBuffers.reset(); +} + +template class MetalBufferBindings; +template class MetalBufferBindings; +template class MetalBufferBindings; + } // namespace backend } // namespace filament diff --git a/filament/backend/src/noop/NoopDriver.cpp b/filament/backend/src/noop/NoopDriver.cpp index a635963847f..af3ad70fbb6 100644 --- a/filament/backend/src/noop/NoopDriver.cpp +++ b/filament/backend/src/noop/NoopDriver.cpp @@ -32,7 +32,7 @@ Dispatcher NoopDriver::getDispatcher() const noexcept { } ShaderModel NoopDriver::getShaderModel() const noexcept { -#if defined(__ANDROID__) || defined(IOS) || defined(__EMSCRIPTEN__) +#if defined(__ANDROID__) || defined(FILAMENT_IOS) || defined(__EMSCRIPTEN__) return ShaderModel::MOBILE; #else return ShaderModel::DESKTOP; @@ -49,16 +49,17 @@ void NoopDriver::terminate() { void NoopDriver::tick(int) { } -void NoopDriver::beginFrame(int64_t monotonic_clock_ns, uint32_t frameId) { +void NoopDriver::beginFrame(int64_t monotonic_clock_ns, + int64_t refreshIntervalNs, uint32_t frameId) { } void NoopDriver::setFrameScheduledCallback(Handle sch, - FrameScheduledCallback callback, void* user) { + CallbackHandler* handler, FrameScheduledCallback&& callback, uint64_t flags) { } void NoopDriver::setFrameCompletedCallback(Handle sch, - FrameCompletedCallback callback, void* user) { + CallbackHandler* handler, utils::Invocable&& callback) { } @@ -77,6 +78,9 @@ void NoopDriver::finish(int) { void NoopDriver::destroyRenderPrimitive(Handle rph) { } +void NoopDriver::destroyVertexBufferInfo(Handle vbih) { +} + void NoopDriver::destroyVertexBuffer(Handle vbh) { } @@ -95,9 +99,6 @@ void NoopDriver::destroyProgram(Handle ph) { void NoopDriver::destroyRenderTarget(Handle rth) { } -void NoopDriver::destroySamplerGroup(Handle sbh) { -} - void NoopDriver::destroySwapChain(Handle sch) { } @@ -107,7 +108,10 @@ void NoopDriver::destroyStream(Handle sh) { void NoopDriver::destroyTimerQuery(Handle tqh) { } -void NoopDriver::destroySync(Handle fh) { +void NoopDriver::destroyDescriptorSetLayout(Handle tqh) { +} + +void NoopDriver::destroyDescriptorSet(Handle tqh) { } Handle NoopDriver::createStreamNative(void* nativeStream) { @@ -135,7 +139,7 @@ void NoopDriver::updateStreams(CommandStream* driver) { void NoopDriver::destroyFence(Handle fh) { } -FenceStatus NoopDriver::wait(Handle fh, uint64_t timeout) { +FenceStatus NoopDriver::getFenceStatus(Handle fh) { return FenceStatus::CONDITION_SATISFIED; } @@ -173,7 +177,39 @@ bool NoopDriver::isAutoDepthResolveSupported() { return true; } -bool NoopDriver::isWorkaroundNeeded(Workaround workaround) { +bool NoopDriver::isSRGBSwapChainSupported() { + return false; +} + +bool NoopDriver::isProtectedContentSupported() { + return false; +} + +bool NoopDriver::isStereoSupported() { + return false; +} + +bool NoopDriver::isParallelShaderCompileSupported() { + return false; +} + +bool NoopDriver::isDepthStencilResolveSupported() { + return true; +} + +bool NoopDriver::isDepthStencilBlitSupported(TextureFormat format) { + return true; +} + +bool NoopDriver::isProtectedTexturesSupported() { + return true; +} + +bool NoopDriver::isDepthClampSupported() { + return false; +} + +bool NoopDriver::isWorkaroundNeeded(Workaround) { return false; } @@ -189,6 +225,10 @@ uint8_t NoopDriver::getMaxDrawBuffers() { return MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT; } +size_t NoopDriver::getMaxUniformBufferSize() { + return 16384u; +} + void NoopDriver::updateIndexBuffer(Handle ibh, BufferDescriptor&& p, uint32_t byteOffset) { scheduleDestroy(std::move(p)); @@ -211,9 +251,6 @@ void NoopDriver::setVertexBufferObject(Handle vbh, uint32_t inde Handle boh) { } -void NoopDriver::setMinMaxLevels(Handle th, uint32_t minLevel, uint32_t maxLevel) { -} - void NoopDriver::update3DImage(Handle th, uint32_t level, uint32_t xoffset, uint32_t yoffset, uint32_t zoffset, uint32_t width, uint32_t height, uint32_t depth, @@ -224,18 +261,8 @@ void NoopDriver::update3DImage(Handle th, void NoopDriver::setupExternalImage(void* image) { } -bool NoopDriver::getTimerQueryValue(Handle tqh, uint64_t* elapsedTime) { - return false; -} - -SyncStatus NoopDriver::getSyncStatus(Handle sh) { - return SyncStatus::SIGNALED; -} - -void NoopDriver::setExternalImage(Handle th, void* image) { -} - -void NoopDriver::setExternalImagePlane(Handle th, void* image, uint32_t plane) { +TimerQueryResult NoopDriver::getTimerQueryValue(Handle tqh, uint64_t* elapsedTime) { + return TimerQueryResult::ERROR; } void NoopDriver::setExternalStream(Handle th, Handle sh) { @@ -243,13 +270,11 @@ void NoopDriver::setExternalStream(Handle th, Handle sh) { void NoopDriver::generateMipmaps(Handle th) { } -bool NoopDriver::canGenerateMipmaps() { - return true; -} - -void NoopDriver::updateSamplerGroup(Handle sbh, - BufferDescriptor&& data) { - scheduleDestroy(std::move(data)); +void NoopDriver::compilePrograms(CompilerPriorityQueue priority, + CallbackHandler* handler, CallbackHandler::Callback callback, void* user) { + if (callback) { + scheduleCallback(handler, user, callback); + } } void NoopDriver::beginRenderPass(Handle rth, const RenderPassParams& params) { @@ -267,23 +292,14 @@ void NoopDriver::makeCurrent(Handle drawSch, Handle re void NoopDriver::commit(Handle sch) { } -void NoopDriver::bindUniformBuffer(uint32_t index, Handle ubh) { +void NoopDriver::setPushConstant(backend::ShaderStage stage, uint8_t index, + backend::PushConstantVariant value) { } -void NoopDriver::bindBufferRange(BufferObjectBinding bindingType, uint32_t index, - Handle ubh, uint32_t offset, uint32_t size) { +void NoopDriver::insertEventMarker(char const* string) { } -void NoopDriver::unbindBuffer(BufferObjectBinding bindingType, uint32_t index) { -} - -void NoopDriver::bindSamplers(uint32_t index, Handle sbh) { -} - -void NoopDriver::insertEventMarker(char const* string, uint32_t len) { -} - -void NoopDriver::pushGroupMarker(char const* string, uint32_t len) { +void NoopDriver::pushGroupMarker(char const* string) { } void NoopDriver::popGroupMarker(int) { @@ -306,19 +322,43 @@ void NoopDriver::readBufferSubData(backend::BufferObjectHandle boh, scheduleDestroy(std::move(p)); } -void NoopDriver::blit(TargetBufferFlags buffers, +void NoopDriver::blitDEPRECATED(TargetBufferFlags buffers, Handle dst, Viewport dstRect, Handle src, Viewport srcRect, SamplerMagFilter filter) { } +void NoopDriver::resolve( + Handle dst, uint8_t srcLevel, uint8_t srcLayer, + Handle src, uint8_t dstLevel, uint8_t dstLayer) { +} + +void NoopDriver::blit( + Handle dst, uint8_t srcLevel, uint8_t srcLayer, math::uint2 dstOrigin, + Handle src, uint8_t dstLevel, uint8_t dstLayer, math::uint2 srcOrigin, + math::uint2 size) { +} + +void NoopDriver::bindPipeline(PipelineState const& pipelineState) { +} + +void NoopDriver::bindRenderPrimitive(Handle rph) { +} + +void NoopDriver::draw2(uint32_t indexOffset, uint32_t indexCount, uint32_t instanceCount) { +} + void NoopDriver::draw(PipelineState pipelineState, Handle rph, - uint32_t instanceCount) { + uint32_t indexOffset, uint32_t indexCount, uint32_t instanceCount) { } void NoopDriver::dispatchCompute(Handle program, math::uint3 workGroupCount) { } +void NoopDriver::scissor( + Viewport scissor) { +} + void NoopDriver::beginTimerQuery(Handle tqh) { } @@ -328,4 +368,28 @@ void NoopDriver::endTimerQuery(Handle tqh) { void NoopDriver::resetState(int) { } +void NoopDriver::updateDescriptorSetBuffer( + backend::DescriptorSetHandle dsh, + backend::descriptor_binding_t binding, + backend::BufferObjectHandle boh, + uint32_t offset, + uint32_t size) { +} + +void NoopDriver::updateDescriptorSetTexture( + backend::DescriptorSetHandle dsh, + backend::descriptor_binding_t binding, + backend::TextureHandle th, + SamplerParams params) { +} + +void NoopDriver::bindDescriptorSet( + backend::DescriptorSetHandle dsh, + backend::descriptor_set_t set, + backend::DescriptorSetOffsetArray&& offsets) { +} + +void NoopDriver::setDebugTag(HandleBase::HandleId handleId, utils::CString tag) { +} + } // namespace filament diff --git a/filament/backend/src/opengl/BindingMap.h b/filament/backend/src/opengl/BindingMap.h new file mode 100644 index 00000000000..6909de28683 --- /dev/null +++ b/filament/backend/src/opengl/BindingMap.h @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_OPENGL_BINDINGMAP_H +#define TNT_FILAMENT_BACKEND_OPENGL_BINDINGMAP_H + +#include + +#include "gl_headers.h" + +#include +#include + +#include + +#include +#include +#include + +namespace filament::backend { + +class BindingMap { + struct CompressedBinding { + // this is in fact a GLuint, but we only want 8-bits + uint8_t binding : 7; + uint8_t sampler : 1; + }; + + CompressedBinding (*mStorage)[MAX_DESCRIPTOR_COUNT]; + + utils::bitset64 mActiveDescriptors[MAX_DESCRIPTOR_SET_COUNT]; + +public: + BindingMap() noexcept + : mStorage(new (std::nothrow) CompressedBinding[MAX_DESCRIPTOR_SET_COUNT][MAX_DESCRIPTOR_COUNT]) { +#ifndef NDEBUG + memset(mStorage, 0xFF, sizeof(CompressedBinding[MAX_DESCRIPTOR_SET_COUNT][MAX_DESCRIPTOR_COUNT])); +#endif + } + + ~BindingMap() noexcept { + delete [] mStorage; + } + + BindingMap(BindingMap const&) noexcept = delete; + BindingMap(BindingMap&&) noexcept = delete; + BindingMap& operator=(BindingMap const&) noexcept = delete; + BindingMap& operator=(BindingMap&&) noexcept = delete; + + struct Binding { + GLuint binding; + DescriptorType type; + }; + + void insert(descriptor_set_t set, descriptor_binding_t binding, Binding entry) noexcept { + assert_invariant(set < MAX_DESCRIPTOR_SET_COUNT); + assert_invariant(binding < MAX_DESCRIPTOR_COUNT); + assert_invariant(entry.binding < 128); // we reserve 1 bit for the type right now + mStorage[set][binding] = { (uint8_t)entry.binding, + entry.type == DescriptorType::SAMPLER || + entry.type == DescriptorType::SAMPLER_EXTERNAL }; + mActiveDescriptors[set].set(binding); + } + + GLuint get(descriptor_set_t set, descriptor_binding_t binding) const noexcept { + assert_invariant(set < MAX_DESCRIPTOR_SET_COUNT); + assert_invariant(binding < MAX_DESCRIPTOR_COUNT); + return mStorage[set][binding].binding; + } + + utils::bitset64 getActiveDescriptors(descriptor_set_t set) const noexcept { + return mActiveDescriptors[set]; + } +}; + +} // namespace filament::backend + +#endif //TNT_FILAMENT_BACKEND_OPENGL_BINDINGMAP_H diff --git a/filament/backend/src/opengl/GLBufferObject.h b/filament/backend/src/opengl/GLBufferObject.h new file mode 100644 index 00000000000..e40e19bd355 --- /dev/null +++ b/filament/backend/src/opengl/GLBufferObject.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_OPENGL_GLBUFFEROBJECT_H +#define TNT_FILAMENT_BACKEND_OPENGL_GLBUFFEROBJECT_H + +#include "DriverBase.h" + +#include "gl_headers.h" + +#include + +#include + +namespace filament::backend { + +struct GLBufferObject : public HwBufferObject { + using HwBufferObject::HwBufferObject; + GLBufferObject(uint32_t size, + BufferObjectBinding bindingType, BufferUsage usage) noexcept + : HwBufferObject(size), usage(usage), bindingType(bindingType) { + } + + struct { + GLuint id; + union { + GLenum binding; + void* buffer; + }; + } gl; + BufferUsage usage; + BufferObjectBinding bindingType; + uint16_t age = 0; +}; + +} // namespace filament::backend + +#endif //TNT_FILAMENT_BACKEND_OPENGL_GLBUFFEROBJECT_H diff --git a/filament/backend/src/opengl/GLDescriptorSet.cpp b/filament/backend/src/opengl/GLDescriptorSet.cpp new file mode 100644 index 00000000000..79c65d9a125 --- /dev/null +++ b/filament/backend/src/opengl/GLDescriptorSet.cpp @@ -0,0 +1,365 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "GLDescriptorSet.h" + +#include "GLBufferObject.h" +#include "GLDescriptorSetLayout.h" +#include "GLTexture.h" +#include "GLUtils.h" +#include "OpenGLDriver.h" +#include "OpenGLContext.h" +#include "OpenGLProgram.h" + +#include "gl_headers.h" + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +namespace filament::backend { + +GLDescriptorSet::GLDescriptorSet(OpenGLContext& gl, DescriptorSetLayoutHandle dslh, + GLDescriptorSetLayout const* layout) noexcept + : descriptors(layout->maxDescriptorBinding + 1), + dslh(std::move(dslh)) { + + // We have allocated enough storage for all descriptors. Now allocate the empty descriptor + // themselves. + for (auto const& entry : layout->bindings) { + size_t const index = entry.binding; + + // now we'll initialize the alternative for each way we can handle this descriptor. + auto& desc = descriptors[index].desc; + switch (entry.type) { + case DescriptorType::UNIFORM_BUFFER: { + // A uniform buffer can have dynamic offsets or not and have special handling for + // ES2 (where we need to emulate it). That's four alternatives. + bool const dynamicOffset = any(entry.flags & DescriptorFlags::DYNAMIC_OFFSET); + dynamicBuffers.set(index, dynamicOffset); + if (UTILS_UNLIKELY(gl.isES2())) { + if (dynamicOffset) { + dynamicBufferCount++; + } + desc.emplace(dynamicOffset); + } else { + auto const type = GLUtils::getBufferBindingType(BufferObjectBinding::UNIFORM); + if (dynamicOffset) { + dynamicBufferCount++; + desc.emplace(type); + } else { + desc.emplace(type); + } + } + break; + } + case DescriptorType::SHADER_STORAGE_BUFFER: { + // shader storage buffers are not supported on ES2, So that's two alternatives. + bool const dynamicOffset = any(entry.flags & DescriptorFlags::DYNAMIC_OFFSET); + dynamicBuffers.set(index, dynamicOffset); + auto const type = GLUtils::getBufferBindingType(BufferObjectBinding::SHADER_STORAGE); + if (dynamicOffset) { + dynamicBufferCount++; + desc.emplace(type); + } else { + desc.emplace(type); + } + break; + } + case DescriptorType::SAMPLER: + case DescriptorType::SAMPLER_EXTERNAL: + if (UTILS_UNLIKELY(gl.isES2())) { + desc.emplace(); + } else { + const bool anisotropyWorkaround = + gl.ext.EXT_texture_filter_anisotropic && + gl.bugs.texture_filter_anisotropic_broken_on_sampler; + if (anisotropyWorkaround) { + desc.emplace(); + } else { + desc.emplace(); + } + } + break; + case DescriptorType::INPUT_ATTACHMENT: + break; + } + } +} + +void GLDescriptorSet::update(OpenGLContext&, + descriptor_binding_t binding, GLBufferObject* bo, size_t offset, size_t size) noexcept { + assert_invariant(binding < descriptors.size()); + std::visit([=](auto&& arg) { + using T = std::decay_t; + if constexpr (std::is_same_v || std::is_same_v) { + assert_invariant(arg.target != 0); + arg.id = bo ? bo->gl.id : 0; + arg.offset = uint32_t(offset); + arg.size = uint32_t(size); + assert_invariant(arg.id || (!arg.size && !offset)); + } else if constexpr (std::is_same_v) { + arg.bo = bo; + arg.offset = uint32_t(offset); + } else { + // API usage error. User asked to update the wrong type of descriptor. + PANIC_PRECONDITION("descriptor %d is not a buffer", +binding); + } + }, descriptors[binding].desc); +} + +void GLDescriptorSet::update(OpenGLContext& gl, + descriptor_binding_t binding, GLTexture* t, SamplerParams params) noexcept { + assert_invariant(binding < descriptors.size()); + std::visit([=, &gl](auto&& arg) mutable { + using T = std::decay_t; + if constexpr (std::is_same_v || + std::is_same_v || + std::is_same_v) { + if (UTILS_UNLIKELY(t && t->target == SamplerType::SAMPLER_EXTERNAL)) { + // From OES_EGL_image_external spec: + // "The default s and t wrap modes are CLAMP_TO_EDGE, and it is an INVALID_ENUM + // error to set the wrap mode to any other value." + params.wrapS = SamplerWrapMode::CLAMP_TO_EDGE; + params.wrapT = SamplerWrapMode::CLAMP_TO_EDGE; + params.wrapR = SamplerWrapMode::CLAMP_TO_EDGE; + } + // GLES3.x specification forbids depth textures to be filtered. + if (t && isDepthFormat(t->format) + && params.compareMode == SamplerCompareMode::NONE) { + params.filterMag = SamplerMagFilter::NEAREST; + switch (params.filterMin) { + case SamplerMinFilter::LINEAR: + params.filterMin = SamplerMinFilter::NEAREST; + break; + case SamplerMinFilter::LINEAR_MIPMAP_NEAREST: + case SamplerMinFilter::NEAREST_MIPMAP_LINEAR: + case SamplerMinFilter::LINEAR_MIPMAP_LINEAR: + params.filterMin = SamplerMinFilter::NEAREST_MIPMAP_NEAREST; + break; + default: + break; + } + } + + arg.target = t ? t->gl.target : 0; + arg.id = t ? t->gl.id : 0; + arg.external = t ? t->gl.external : false; + if constexpr (std::is_same_v || + std::is_same_v) { + if constexpr (std::is_same_v) { + arg.anisotropy = float(1u << params.anisotropyLog2); + } + if (t) { + arg.ref = t->ref; + arg.baseLevel = t->gl.baseLevel; + arg.maxLevel = t->gl.maxLevel; + arg.swizzle = t->gl.swizzle; + } +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + arg.sampler = gl.getSampler(params); +#else + (void)gl; +#endif + } else { + arg.params = params; + } + } else { + // API usage error. User asked to update the wrong type of descriptor. + PANIC_PRECONDITION("descriptor %d is not a texture", +binding); + } + }, descriptors[binding].desc); +} + +template +void GLDescriptorSet::updateTextureView(OpenGLContext& gl, + HandleAllocatorGL& handleAllocator, GLuint unit, T const& desc) noexcept { + // The common case is that we don't have a ref handle (we only have one if + // the texture ever had a View on it). + assert_invariant(desc.ref); + GLTextureRef* const ref = handleAllocator.handle_cast(desc.ref); + if (UTILS_UNLIKELY((desc.baseLevel != ref->baseLevel || desc.maxLevel != ref->maxLevel))) { + // If we have views, then it's still uncommon that we'll switch often + // handle the case where we reset to the original texture + GLint baseLevel = GLint(desc.baseLevel); // NOLINT(*-signed-char-misuse) + GLint maxLevel = GLint(desc.maxLevel); // NOLINT(*-signed-char-misuse) + if (baseLevel > maxLevel) { + baseLevel = 0; + maxLevel = 1000; // per OpenGL spec + } + // that is very unfortunate that we have to call activeTexture here + gl.activeTexture(unit); + glTexParameteri(desc.target, GL_TEXTURE_BASE_LEVEL, baseLevel); + glTexParameteri(desc.target, GL_TEXTURE_MAX_LEVEL, maxLevel); + ref->baseLevel = desc.baseLevel; + ref->maxLevel = desc.maxLevel; + } + if (UTILS_UNLIKELY(desc.swizzle != ref->swizzle)) { + using namespace GLUtils; + gl.activeTexture(unit); +#if !defined(__EMSCRIPTEN__) && !defined(FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2) + glTexParameteri(desc.target, GL_TEXTURE_SWIZZLE_R, (GLint)getSwizzleChannel(desc.swizzle[0])); + glTexParameteri(desc.target, GL_TEXTURE_SWIZZLE_G, (GLint)getSwizzleChannel(desc.swizzle[1])); + glTexParameteri(desc.target, GL_TEXTURE_SWIZZLE_B, (GLint)getSwizzleChannel(desc.swizzle[2])); + glTexParameteri(desc.target, GL_TEXTURE_SWIZZLE_A, (GLint)getSwizzleChannel(desc.swizzle[3])); +#endif + ref->swizzle = desc.swizzle; + } +} + +void GLDescriptorSet::bind( + OpenGLContext& gl, + HandleAllocatorGL& handleAllocator, + OpenGLProgram const& p, + descriptor_set_t set, uint32_t const* offsets, bool offsetsOnly) const noexcept { + // TODO: check that offsets is sized correctly + size_t dynamicOffsetIndex = 0; + + utils::bitset64 activeDescriptorBindings = p.getActiveDescriptors(set); + if (offsetsOnly) { + activeDescriptorBindings &= dynamicBuffers; + } + + // loop only over the active indices for this program + activeDescriptorBindings.forEachSetBit( + [this,&gl, &handleAllocator, &p, set, offsets, &dynamicOffsetIndex] + (size_t binding) { + + // This would fail here if we're trying to set a descriptor that doesn't exist in the + // program. In other words, a mismatch between the program's layout and this descriptor-set. + assert_invariant(binding < descriptors.size()); + + auto const& entry = descriptors[binding]; + std::visit( + [&gl, &handleAllocator, &p, &dynamicOffsetIndex, set, binding, offsets] + (auto&& arg) { + using T = std::decay_t; + if constexpr (std::is_same_v) { + GLuint const bindingPoint = p.getBufferBinding(set, binding); + GLintptr const offset = arg.offset; + assert_invariant(arg.id || (!arg.size && !offset)); + gl.bindBufferRange(arg.target, bindingPoint, arg.id, offset, arg.size); + } else if constexpr (std::is_same_v) { + GLuint const bindingPoint = p.getBufferBinding(set, binding); + GLintptr const offset = arg.offset + offsets[dynamicOffsetIndex++]; + assert_invariant(arg.id || (!arg.size && !offset)); + gl.bindBufferRange(arg.target, bindingPoint, arg.id, offset, arg.size); + } else if constexpr (std::is_same_v) { + GLuint const bindingPoint = p.getBufferBinding(set, binding); + GLintptr offset = arg.offset; + if (arg.dynamicOffset) { + offset += offsets[dynamicOffsetIndex++]; + } + if (arg.bo) { + auto buffer = static_cast(arg.bo->gl.buffer) + offset; + p.updateUniforms(bindingPoint, arg.bo->gl.id, buffer, arg.bo->age); + } + } else if constexpr (std::is_same_v) { + GLuint const unit = p.getTextureUnit(set, binding); + if (arg.target) { + gl.bindTexture(unit, arg.target, arg.id, arg.external); + gl.bindSampler(unit, arg.sampler); + if (UTILS_UNLIKELY(arg.ref)) { + updateTextureView(gl, handleAllocator, unit, arg); + } + } else { + gl.unbindTextureUnit(unit); + } + } else if constexpr (std::is_same_v) { + GLuint const unit = p.getTextureUnit(set, binding); + if (arg.target) { + gl.bindTexture(unit, arg.target, arg.id, arg.external); + gl.bindSampler(unit, arg.sampler); + if (UTILS_UNLIKELY(arg.ref)) { + updateTextureView(gl, handleAllocator, unit, arg); + } +#if defined(GL_EXT_texture_filter_anisotropic) + // Driver claims to support anisotropic filtering, but it fails when set on + // the sampler, we have to set it on the texture instead. + glTexParameterf(arg.target, GL_TEXTURE_MAX_ANISOTROPY_EXT, + std::min(gl.gets.max_anisotropy, float(arg.anisotropy))); +#endif + } else { + gl.unbindTextureUnit(unit); + } + } else if constexpr (std::is_same_v) { + // in ES2 the sampler parameters need to be set on the texture itself + GLuint const unit = p.getTextureUnit(set, binding); + if (arg.target) { + gl.bindTexture(unit, arg.target, arg.id, arg.external); + SamplerParams const params = arg.params; + glTexParameteri(arg.target, GL_TEXTURE_MIN_FILTER, + (GLint)GLUtils::getTextureFilter(params.filterMin)); + glTexParameteri(arg.target, GL_TEXTURE_MAG_FILTER, + (GLint)GLUtils::getTextureFilter(params.filterMag)); + glTexParameteri(arg.target, GL_TEXTURE_WRAP_S, + (GLint)GLUtils::getWrapMode(params.wrapS)); + glTexParameteri(arg.target, GL_TEXTURE_WRAP_T, + (GLint)GLUtils::getWrapMode(params.wrapT)); +#if defined(GL_EXT_texture_filter_anisotropic) + glTexParameterf(arg.target, GL_TEXTURE_MAX_ANISOTROPY_EXT, + std::min(gl.gets.max_anisotropy, arg.anisotropy)); +#endif + } else { + gl.unbindTextureUnit(unit); + } + } + }, entry.desc); + }); + CHECK_GL_ERROR(utils::slog.e) +} + +void GLDescriptorSet::validate(HandleAllocatorGL& allocator, + DescriptorSetLayoutHandle pipelineLayout) const { + + if (UTILS_UNLIKELY(dslh != pipelineLayout)) { + auto* const dsl = allocator.handle_cast < GLDescriptorSetLayout const * > (dslh); + auto* const cur = allocator.handle_cast < GLDescriptorSetLayout const * > (pipelineLayout); + + UTILS_UNUSED_IN_RELEASE + bool const pipelineLayoutMatchesDescriptorSetLayout = std::equal( + dsl->bindings.begin(), dsl->bindings.end(), + cur->bindings.begin(), + [](DescriptorSetLayoutBinding const& lhs, + DescriptorSetLayoutBinding const& rhs) { + return lhs.type == rhs.type && + lhs.stageFlags == rhs.stageFlags && + lhs.binding == rhs.binding && + lhs.flags == rhs.flags && + lhs.count == rhs.count; + }); + + assert_invariant(pipelineLayoutMatchesDescriptorSetLayout); + } +} + +} // namespace filament::backend diff --git a/filament/backend/src/opengl/GLDescriptorSet.h b/filament/backend/src/opengl/GLDescriptorSet.h new file mode 100644 index 00000000000..59b6b6ace57 --- /dev/null +++ b/filament/backend/src/opengl/GLDescriptorSet.h @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_OPENGL_GLDESCRIPTORSET_H +#define TNT_FILAMENT_BACKEND_OPENGL_GLDESCRIPTORSET_H + +#include "DriverBase.h" + +#include "gl_headers.h" + +#include + +#include +#include + +#include +#include + +#include + +#include +#include + +#include +#include + +namespace filament::backend { + +struct GLBufferObject; +struct GLTexture; +struct GLTextureRef; +struct GLDescriptorSetLayout; +class OpenGLProgram; +class OpenGLContext; +class OpenGLDriver; + +struct GLDescriptorSet : public HwDescriptorSet { + + using HwDescriptorSet::HwDescriptorSet; + + GLDescriptorSet(OpenGLContext& gl, DescriptorSetLayoutHandle dslh, + GLDescriptorSetLayout const* layout) noexcept; + + // update a buffer descriptor in the set + void update(OpenGLContext& gl, + descriptor_binding_t binding, GLBufferObject* bo, size_t offset, size_t size) noexcept; + + // update a sampler descriptor in the set + void update(OpenGLContext& gl, + descriptor_binding_t binding, GLTexture* t, SamplerParams params) noexcept; + + // conceptually bind the set to the command buffer + void bind( + OpenGLContext& gl, + HandleAllocatorGL& handleAllocator, + OpenGLProgram const& p, + descriptor_set_t set, uint32_t const* offsets, bool offsetsOnly) const noexcept; + + uint32_t getDynamicBufferCount() const noexcept { + return dynamicBufferCount; + } + + void validate(HandleAllocatorGL& allocator, DescriptorSetLayoutHandle pipelineLayout) const; + +private: + // a Buffer Descriptor such as SSBO or UBO with static offset + struct Buffer { + // Workaround: we cannot define the following as Buffer() = default because one of our + // clients has their compiler set up where such declaration (possibly coupled with explicit) + // will be considered a deleted constructor. + Buffer() {} + + explicit Buffer(GLenum target) noexcept : target(target) {} + GLenum target; // 4 + GLuint id = 0; // 4 + uint32_t offset = 0; // 4 + uint32_t size = 0; // 4 + }; + + // a Buffer Descriptor such as SSBO or UBO with dynamic offset + struct DynamicBuffer { + DynamicBuffer() = default; + explicit DynamicBuffer(GLenum target) noexcept : target(target) { } + GLenum target; // 4 + GLuint id = 0; // 4 + uint32_t offset = 0; // 4 + uint32_t size = 0; // 4 + }; + + // a UBO descriptor for ES2 + struct BufferGLES2 { + BufferGLES2() = default; + explicit BufferGLES2(bool dynamicOffset) noexcept : dynamicOffset(dynamicOffset) { } + GLBufferObject const* bo = nullptr; // 8 + uint32_t offset = 0; // 4 + bool dynamicOffset = false; // 4 + }; + + // A sampler descriptor + struct Sampler { + uint16_t target; // 2 (GLenum) + bool external = false; // 1 + bool reserved = false; // 1 + GLuint id = 0; // 4 + GLuint sampler = 0; // 4 + Handle ref; // 4 + int8_t baseLevel = 0x7f; // 1 + int8_t maxLevel = -1; // 1 + std::array swizzle{ // 4 + TextureSwizzle::CHANNEL_0, + TextureSwizzle::CHANNEL_1, + TextureSwizzle::CHANNEL_2, + TextureSwizzle::CHANNEL_3 + }; + }; + + struct SamplerWithAnisotropyWorkaround { + uint16_t target; // 2 (GLenum) + bool external = false; // 1 + bool reserved = false; // 1 + GLuint id = 0; // 4 + GLuint sampler = 0; // 4 + Handle ref; // 4 + math::half anisotropy = 1.0f; // 2 + int8_t baseLevel = 0x7f; // 1 + int8_t maxLevel = -1; // 1 + std::array swizzle{ // 4 + TextureSwizzle::CHANNEL_0, + TextureSwizzle::CHANNEL_1, + TextureSwizzle::CHANNEL_2, + TextureSwizzle::CHANNEL_3 + }; + }; + + // A sampler descriptor for ES2 + struct SamplerGLES2 { + uint16_t target; // 2 (GLenum) + bool external = false; // 1 + bool reserved = false; // 1 + GLuint id = 0; // 4 + SamplerParams params{}; // 4 + float anisotropy = 1.0f; // 4 + }; + struct Descriptor { + std::variant< + Buffer, + DynamicBuffer, + BufferGLES2, + Sampler, + SamplerWithAnisotropyWorkaround, + SamplerGLES2> desc; + }; + static_assert(sizeof(Descriptor) <= 32); + + template + static void updateTextureView(OpenGLContext& gl, + HandleAllocatorGL& handleAllocator, GLuint unit, T const& desc) noexcept; + + utils::FixedCapacityVector descriptors; // 16 + utils::bitset64 dynamicBuffers; // 8 + DescriptorSetLayoutHandle dslh; // 4 + uint8_t dynamicBufferCount = 0; // 1 +}; +static_assert(sizeof(GLDescriptorSet) <= 32); + +} // namespace filament::backend + +#endif //TNT_FILAMENT_BACKEND_OPENGL_GLDESCRIPTORSET_H diff --git a/filament/backend/src/opengl/GLDescriptorSetLayout.h b/filament/backend/src/opengl/GLDescriptorSetLayout.h new file mode 100644 index 00000000000..bce3519fceb --- /dev/null +++ b/filament/backend/src/opengl/GLDescriptorSetLayout.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_OPENGL_GLDESCRIPTORSETLAYOUT_H +#define TNT_FILAMENT_BACKEND_OPENGL_GLDESCRIPTORSETLAYOUT_H + +#include "DriverBase.h" + +#include + +#include +#include + +#include + +namespace filament::backend { + +struct GLDescriptorSetLayout : public HwDescriptorSetLayout, public DescriptorSetLayout { + using HwDescriptorSetLayout::HwDescriptorSetLayout; + explicit GLDescriptorSetLayout(DescriptorSetLayout&& layout) noexcept + : DescriptorSetLayout(std::move(layout)) { + + std::sort(bindings.begin(), bindings.end(), + [](auto&& lhs, auto&& rhs){ + return lhs.binding < rhs.binding; + }); + + auto p = std::max_element(bindings.cbegin(), bindings.cend(), + [](auto const& lhs, auto const& rhs) { + return lhs.binding < rhs.binding; + }); + maxDescriptorBinding = p->binding; + } + uint8_t maxDescriptorBinding = 0; +}; + +} // namespace filament::backend + +#endif //TNT_FILAMENT_BACKEND_OPENGL_GLDESCRIPTORSETLAYOUT_H diff --git a/filament/backend/src/opengl/GLTexture.h b/filament/backend/src/opengl/GLTexture.h new file mode 100644 index 00000000000..26784d15644 --- /dev/null +++ b/filament/backend/src/opengl/GLTexture.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_OPENGL_GLTEXTURE_H +#define TNT_FILAMENT_BACKEND_OPENGL_GLTEXTURE_H + +#include "DriverBase.h" + +#include "gl_headers.h" + +#include +#include +#include + +#include + +#include + +namespace filament::backend { + +struct GLTextureRef { + GLTextureRef() = default; + // view reference counter + uint16_t count = 1; + // Current per-view values of the texture (in GL we can only have a single View active at + // a time, and this tracks that state). It's used to avoid unnecessarily change state. + int8_t baseLevel = 127; + int8_t maxLevel = -1; + std::array swizzle{ + TextureSwizzle::CHANNEL_0, + TextureSwizzle::CHANNEL_1, + TextureSwizzle::CHANNEL_2, + TextureSwizzle::CHANNEL_3 + }; +}; + +struct GLTexture : public HwTexture { + using HwTexture::HwTexture; + struct GL { + GL() noexcept : imported(false), external(false), sidecarSamples(1), reserved1(0) {} + GLuint id = 0; // texture or renderbuffer id + GLenum target = 0; + GLenum internalFormat = 0; + GLuint sidecarRenderBufferMS = 0; // multi-sample sidecar renderbuffer + + // texture parameters go here too + GLfloat anisotropy = 1.0; + int8_t baseLevel = 127; + int8_t maxLevel = -1; + uint8_t reserved0 = 0; + bool imported : 1; + bool external : 1; + uint8_t sidecarSamples : 3; + uint8_t reserved1 : 3; + std::array swizzle{ + TextureSwizzle::CHANNEL_0, + TextureSwizzle::CHANNEL_1, + TextureSwizzle::CHANNEL_2, + TextureSwizzle::CHANNEL_3 + }; + } gl; + mutable Handle ref; + OpenGLPlatform::ExternalTexture* externalTexture = nullptr; +}; + + +} // namespace filament::backend + +#endif //TNT_FILAMENT_BACKEND_OPENGL_GLTEXTURE_H diff --git a/filament/backend/src/opengl/GLUtils.cpp b/filament/backend/src/opengl/GLUtils.cpp index 8e99f7666e8..0a545743e9a 100644 --- a/filament/backend/src/opengl/GLUtils.cpp +++ b/filament/backend/src/opengl/GLUtils.cpp @@ -81,9 +81,6 @@ const char* getFramebufferStatus(GLenum status) noexcept { case GL_FRAMEBUFFER_COMPLETE: string = "GL_FRAMEBUFFER_COMPLETE"; break; - case GL_FRAMEBUFFER_UNDEFINED: - string = "GL_FRAMEBUFFER_UNDEFINED"; - break; case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: string = "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"; break; @@ -93,9 +90,14 @@ const char* getFramebufferStatus(GLenum status) noexcept { case GL_FRAMEBUFFER_UNSUPPORTED: string = "GL_FRAMEBUFFER_UNSUPPORTED"; break; +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + case GL_FRAMEBUFFER_UNDEFINED: + string = "GL_FRAMEBUFFER_UNDEFINED"; + break; case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: string = "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE"; break; +#endif default: break; } diff --git a/filament/backend/src/opengl/GLUtils.h b/filament/backend/src/opengl/GLUtils.h index ffb640eb811..dc9df7871a7 100644 --- a/filament/backend/src/opengl/GLUtils.h +++ b/filament/backend/src/opengl/GLUtils.h @@ -118,9 +118,19 @@ constexpr inline GLenum getBufferBindingType(BufferObjectBinding bindingType) no case BufferObjectBinding::VERTEX: return GL_ARRAY_BUFFER; case BufferObjectBinding::UNIFORM: +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 return GL_UNIFORM_BUFFER; +#else + utils::panic(__func__, __FILE__, __LINE__, "UNIFORM not supported"); + return 0x8A11; +#endif case BufferObjectBinding::SHADER_STORAGE: +#ifdef BACKEND_OPENGL_LEVEL_GLES31 return GL_SHADER_STORAGE_BUFFER; +#else + utils::panic(__func__, __FILE__, __LINE__, "SHADER_STORAGE not supported"); + return 0x90D2; // just to return something +#endif } } @@ -164,7 +174,12 @@ constexpr inline GLenum getComponentType(ElementType type) noexcept { case ElementType::HALF2: case ElementType::HALF3: case ElementType::HALF4: + // on ES2 we should never end-up here +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 return GL_HALF_FLOAT; +#else + return GL_HALF_FLOAT_OES; +#endif } } @@ -233,13 +248,7 @@ constexpr inline GLenum getBlendFunctionMode(BlendFunction mode) noexcept { } } -constexpr inline GLenum getTextureCompareMode(SamplerCompareMode mode) noexcept { - return mode == SamplerCompareMode::NONE ? - GL_NONE : GL_COMPARE_REF_TO_TEXTURE; -} - -constexpr inline GLenum getTextureCompareFunc(SamplerCompareFunc func) noexcept { - using SamplerCompareFunc = SamplerCompareFunc; +constexpr inline GLenum getCompareFunc(SamplerCompareFunc func) noexcept { switch (func) { case SamplerCompareFunc::LE: return GL_LEQUAL; case SamplerCompareFunc::GE: return GL_GEQUAL; @@ -252,12 +261,23 @@ constexpr inline GLenum getTextureCompareFunc(SamplerCompareFunc func) noexcept } } +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 +constexpr inline GLenum getTextureCompareMode(SamplerCompareMode mode) noexcept { + return mode == SamplerCompareMode::NONE ? + GL_NONE : GL_COMPARE_REF_TO_TEXTURE; +} + +constexpr inline GLenum getTextureCompareFunc(SamplerCompareFunc func) noexcept { + return getCompareFunc(func); +} +#endif + constexpr inline GLenum getDepthFunc(SamplerCompareFunc func) noexcept { - return getTextureCompareFunc(func); + return getCompareFunc(func); } constexpr inline GLenum getStencilFunc(SamplerCompareFunc func) noexcept { - return getTextureCompareFunc(func); + return getCompareFunc(func); } constexpr inline GLenum getStencilOp(StencilOperation op) noexcept { @@ -276,18 +296,24 @@ constexpr inline GLenum getStencilOp(StencilOperation op) noexcept { constexpr inline GLenum getFormat(PixelDataFormat format) noexcept { using PixelDataFormat = PixelDataFormat; switch (format) { + case PixelDataFormat::RGB: return GL_RGB; + case PixelDataFormat::RGBA: return GL_RGBA; + case PixelDataFormat::UNUSED: return GL_RGBA; // should never happen (used to be rgbm) + case PixelDataFormat::DEPTH_COMPONENT: return GL_DEPTH_COMPONENT; + case PixelDataFormat::ALPHA: return GL_ALPHA; + case PixelDataFormat::DEPTH_STENCIL: return GL_DEPTH_STENCIL; +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + // when context is ES2 we should never end-up here case PixelDataFormat::R: return GL_RED; case PixelDataFormat::R_INTEGER: return GL_RED_INTEGER; case PixelDataFormat::RG: return GL_RG; case PixelDataFormat::RG_INTEGER: return GL_RG_INTEGER; - case PixelDataFormat::RGB: return GL_RGB; case PixelDataFormat::RGB_INTEGER: return GL_RGB_INTEGER; - case PixelDataFormat::RGBA: return GL_RGBA; case PixelDataFormat::RGBA_INTEGER: return GL_RGBA_INTEGER; - case PixelDataFormat::UNUSED: return GL_RGBA; // should never happen (used to be rgbm) - case PixelDataFormat::DEPTH_COMPONENT: return GL_DEPTH_COMPONENT; - case PixelDataFormat::DEPTH_STENCIL: return GL_DEPTH_STENCIL; - case PixelDataFormat::ALPHA: return GL_ALPHA; +#else + // silence compiler warning in ES2 headers mode + default: return GL_NONE; +#endif } } @@ -300,32 +326,34 @@ constexpr inline GLenum getType(PixelDataType type) noexcept { case PixelDataType::SHORT: return GL_SHORT; case PixelDataType::UINT: return GL_UNSIGNED_INT; case PixelDataType::INT: return GL_INT; - case PixelDataType::HALF: return GL_HALF_FLOAT; case PixelDataType::FLOAT: return GL_FLOAT; - case PixelDataType::UINT_10F_11F_11F_REV: return GL_UNSIGNED_INT_10F_11F_11F_REV; case PixelDataType::USHORT_565: return GL_UNSIGNED_SHORT_5_6_5; +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + // when context is ES2 we should never end-up here + case PixelDataType::HALF: return GL_HALF_FLOAT; + case PixelDataType::UINT_10F_11F_11F_REV: return GL_UNSIGNED_INT_10F_11F_11F_REV; case PixelDataType::UINT_2_10_10_10_REV: return GL_UNSIGNED_INT_2_10_10_10_REV; case PixelDataType::COMPRESSED: return 0; // should never happen +#else + // silence compiler warning in ES2 headers mode + default: return GL_NONE; +#endif } } +#if !defined(__EMSCRIPTEN__) && !defined(FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2) constexpr inline GLenum getSwizzleChannel(TextureSwizzle c) noexcept { using TextureSwizzle = TextureSwizzle; switch (c) { - case TextureSwizzle::SUBSTITUTE_ZERO: - return GL_ZERO; - case TextureSwizzle::SUBSTITUTE_ONE: - return GL_ONE; - case TextureSwizzle::CHANNEL_0: - return GL_RED; - case TextureSwizzle::CHANNEL_1: - return GL_GREEN; - case TextureSwizzle::CHANNEL_2: - return GL_BLUE; - case TextureSwizzle::CHANNEL_3: - return GL_ALPHA; + case TextureSwizzle::SUBSTITUTE_ZERO: return GL_ZERO; + case TextureSwizzle::SUBSTITUTE_ONE: return GL_ONE; + case TextureSwizzle::CHANNEL_0: return GL_RED; + case TextureSwizzle::CHANNEL_1: return GL_GREEN; + case TextureSwizzle::CHANNEL_2: return GL_BLUE; + case TextureSwizzle::CHANNEL_3: return GL_ALPHA; } } +#endif constexpr inline GLenum getCullingMode(CullingMode mode) noexcept { switch (mode) { @@ -341,18 +369,59 @@ constexpr inline GLenum getCullingMode(CullingMode mode) noexcept { } } -// clang looses it on this one, and generates a huge jump table when +// ES2 supported internal formats for texturing and how they map to a format/type +constexpr inline std::pair textureFormatToFormatAndType( + TextureFormat format) noexcept { + switch (format) { + case TextureFormat::R8: return { 0x1909 /*GL_LUMINANCE*/, GL_UNSIGNED_BYTE }; + case TextureFormat::RGB8: return { GL_RGB, GL_UNSIGNED_BYTE }; + case TextureFormat::SRGB8: return { GL_RGB, GL_UNSIGNED_BYTE }; + case TextureFormat::RGBA8: return { GL_RGBA, GL_UNSIGNED_BYTE }; + case TextureFormat::SRGB8_A8: return { GL_RGBA, GL_UNSIGNED_BYTE }; + case TextureFormat::RGB565: return { GL_RGB, GL_UNSIGNED_SHORT_5_6_5 }; + case TextureFormat::RGB5_A1: return { GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1 }; + case TextureFormat::RGBA4: return { GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4 }; + case TextureFormat::DEPTH16: return { GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT }; + case TextureFormat::DEPTH24: return { GL_DEPTH_COMPONENT, GL_UNSIGNED_INT }; + case TextureFormat::DEPTH24_STENCIL8: + return { GL_DEPTH24_STENCIL8, GL_UNSIGNED_INT_24_8 }; + default: return { GL_NONE, GL_NONE }; + } +} + +// clang loses it on this one, and generates a huge jump table when // inlined. So we don't mark it as inline (only constexpr) which solves the problem, // strangely, when not inlined, clang simply generates an array lookup. constexpr /* inline */ GLenum getInternalFormat(TextureFormat format) noexcept { - using TextureFormat = TextureFormat; switch (format) { + + /* Formats supported by our ES2 implementations */ + + // 8-bits per element + case TextureFormat::STENCIL8: return GL_STENCIL_INDEX8; + + // 16-bits per element + case TextureFormat::RGB565: return GL_RGB565; + case TextureFormat::RGB5_A1: return GL_RGB5_A1; + case TextureFormat::RGBA4: return GL_RGBA4; + case TextureFormat::DEPTH16: return GL_DEPTH_COMPONENT16; + + // 24-bits per element + case TextureFormat::RGB8: return GL_RGB8; + case TextureFormat::DEPTH24: return GL_DEPTH_COMPONENT24; + + // 32-bits per element + case TextureFormat::RGBA8: return GL_RGBA8; + case TextureFormat::DEPTH24_STENCIL8: return GL_DEPTH24_STENCIL8; + + /* Formats not supported by our ES2 implementations */ + +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 // 8-bits per element case TextureFormat::R8: return GL_R8; case TextureFormat::R8_SNORM: return GL_R8_SNORM; case TextureFormat::R8UI: return GL_R8UI; case TextureFormat::R8I: return GL_R8I; - case TextureFormat::STENCIL8: return GL_STENCIL_INDEX8; // 16-bits per element case TextureFormat::R16F: return GL_R16F; @@ -362,18 +431,12 @@ constexpr /* inline */ GLenum getInternalFormat(TextureFormat format) noexcept { case TextureFormat::RG8_SNORM: return GL_RG8_SNORM; case TextureFormat::RG8UI: return GL_RG8UI; case TextureFormat::RG8I: return GL_RG8I; - case TextureFormat::RGB565: return GL_RGB565; - case TextureFormat::RGB5_A1: return GL_RGB5_A1; - case TextureFormat::RGBA4: return GL_RGBA4; - case TextureFormat::DEPTH16: return GL_DEPTH_COMPONENT16; // 24-bits per element - case TextureFormat::RGB8: return GL_RGB8; case TextureFormat::SRGB8: return GL_SRGB8; case TextureFormat::RGB8_SNORM: return GL_RGB8_SNORM; case TextureFormat::RGB8UI: return GL_RGB8UI; case TextureFormat::RGB8I: return GL_RGB8I; - case TextureFormat::DEPTH24: return GL_DEPTH_COMPONENT24; // 32-bits per element case TextureFormat::R32F: return GL_R32F; @@ -384,14 +447,12 @@ constexpr /* inline */ GLenum getInternalFormat(TextureFormat format) noexcept { case TextureFormat::RG16I: return GL_RG16I; case TextureFormat::R11F_G11F_B10F: return GL_R11F_G11F_B10F; case TextureFormat::RGB9_E5: return GL_RGB9_E5; - case TextureFormat::RGBA8: return GL_RGBA8; case TextureFormat::SRGB8_A8: return GL_SRGB8_ALPHA8; case TextureFormat::RGBA8_SNORM: return GL_RGBA8_SNORM; case TextureFormat::RGB10_A2: return GL_RGB10_A2; case TextureFormat::RGBA8UI: return GL_RGBA8UI; case TextureFormat::RGBA8I: return GL_RGBA8I; case TextureFormat::DEPTH32F: return GL_DEPTH_COMPONENT32F; - case TextureFormat::DEPTH24_STENCIL8: return GL_DEPTH24_STENCIL8; case TextureFormat::DEPTH32F_STENCIL8: return GL_DEPTH32F_STENCIL8; // 48-bits per element @@ -416,9 +477,15 @@ constexpr /* inline */ GLenum getInternalFormat(TextureFormat format) noexcept { case TextureFormat::RGBA32F: return GL_RGBA32F; case TextureFormat::RGBA32UI: return GL_RGBA32UI; case TextureFormat::RGBA32I: return GL_RGBA32I; +#else + default: + // this is just to squash the IDE warning about not having all cases when in + // ES2 header mode. + return 0; +#endif // compressed formats -#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_4_3) || defined(GL_ARB_ES3_compatibility) +#if defined(GL_ES_VERSION_3_0) || defined(BACKEND_OPENGL_VERSION_GL) || defined(GL_ARB_ES3_compatibility) case TextureFormat::EAC_R11: return GL_COMPRESSED_R11_EAC; case TextureFormat::EAC_R11_SIGNED: return GL_COMPRESSED_SIGNED_R11_EAC; case TextureFormat::EAC_RG11: return GL_COMPRESSED_RG11_EAC; diff --git a/filament/backend/src/opengl/OpenGLBlobCache.cpp b/filament/backend/src/opengl/OpenGLBlobCache.cpp new file mode 100644 index 00000000000..f9e68384da5 --- /dev/null +++ b/filament/backend/src/opengl/OpenGLBlobCache.cpp @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "OpenGLBlobCache.h" + +#include "OpenGLContext.h" + +#include +#include + +#include + +namespace filament::backend { + +struct OpenGLBlobCache::Blob { + GLenum format; + char data[]; +}; + +OpenGLBlobCache::OpenGLBlobCache(OpenGLContext& gl) noexcept + : mCachingSupported(gl.gets.num_program_binary_formats >= 1) { +} + +GLuint OpenGLBlobCache::retrieve(BlobCacheKey* outKey, Platform& platform, + Program const& program) const noexcept { + SYSTRACE_CALL(); + if (!mCachingSupported || !platform.hasRetrieveBlobFunc()) { + // the key is never updated in that case + return 0; + } + + GLuint programId = 0; + +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + BlobCacheKey key{ program.getCacheId(), program.getSpecializationConstants() }; + + // FIXME: use a static buffer to avoid systematic allocation + // always attempt with 64 KiB + constexpr size_t DEFAULT_BLOB_SIZE = 65536; + std::unique_ptr blob{ (Blob*)malloc(DEFAULT_BLOB_SIZE), &::free }; + + size_t const blobSize = platform.retrieveBlob( + key.data(), key.size(), blob.get(), DEFAULT_BLOB_SIZE); + + if (blobSize > 0) { + if (blobSize > DEFAULT_BLOB_SIZE) { + // our buffer was too small, retry with the correct size + blob.reset((Blob*)malloc(blobSize)); + platform.retrieveBlob( + key.data(), key.size(), blob.get(), blobSize); + } + + GLsizei const programBinarySize = GLsizei(blobSize - sizeof(Blob)); + + programId = glCreateProgram(); + + { // scope for systrace + SYSTRACE_NAME("glProgramBinary"); + glProgramBinary(programId, blob->format, blob->data, programBinarySize); + } + + if (UTILS_UNLIKELY(glGetError() != GL_NO_ERROR)) { + // glProgramBinary can fail if for instance the driver has been updated + glDeleteProgram(programId); + programId = 0; + } + } + + if (UTILS_LIKELY(outKey)) { + using std::swap; + swap(*outKey, key); + } +#endif + + return programId; +} + +void OpenGLBlobCache::insert(Platform& platform, + BlobCacheKey const& key, GLuint program) noexcept { + SYSTRACE_CALL(); + if (!mCachingSupported || !platform.hasInsertBlobFunc()) { + // the key is never updated in that case + return; + } + +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + GLenum format; + GLint programBinarySize = 0; + { // scope for systrace + SYSTRACE_NAME("glGetProgramiv"); + glGetProgramiv(program, GL_PROGRAM_BINARY_LENGTH, &programBinarySize); + } + if (programBinarySize) { + size_t const size = sizeof(Blob) + programBinarySize; + std::unique_ptr blob{ (Blob*)malloc(size), &::free }; + if (UTILS_LIKELY(blob)) { + { // scope for systrace + SYSTRACE_NAME("glGetProgramBinary"); + glGetProgramBinary(program, programBinarySize, + &programBinarySize, &format, blob->data); + } + GLenum const error = glGetError(); + if (error == GL_NO_ERROR) { + blob->format = format; + platform.insertBlob(key.data(), key.size(), blob.get(), size); + } + } + } +#endif +} + +} // namespace filament::backend diff --git a/filament/backend/src/opengl/OpenGLBlobCache.h b/filament/backend/src/opengl/OpenGLBlobCache.h new file mode 100644 index 00000000000..fa98f0a4496 --- /dev/null +++ b/filament/backend/src/opengl/OpenGLBlobCache.h @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_OPENGLBLOBCACHE_H +#define TNT_FILAMENT_BACKEND_OPENGLBLOBCACHE_H + +#include "gl_headers.h" + +#include "BlobCacheKey.h" + +namespace filament::backend { + +class Platform; +class Program; +class OpenGLContext; + +class OpenGLBlobCache { +public: + explicit OpenGLBlobCache(OpenGLContext& gl) noexcept; + + GLuint retrieve(BlobCacheKey* key, Platform& platform, + Program const& program) const noexcept; + + void insert(Platform& platform, + BlobCacheKey const& key, GLuint program) noexcept; + +private: + struct Blob; + bool mCachingSupported = false; +}; + +} // namespace filament::backend + +#endif // TNT_FILAMENT_BACKEND_OPENGLBLOBCACHE_H diff --git a/filament/backend/src/opengl/OpenGLContext.cpp b/filament/backend/src/opengl/OpenGLContext.cpp index 10c6f541bdc..f652d926596 100644 --- a/filament/backend/src/opengl/OpenGLContext.cpp +++ b/filament/backend/src/opengl/OpenGLContext.cpp @@ -16,6 +16,25 @@ #include "OpenGLContext.h" +#include "GLUtils.h" +#include "OpenGLTimerQuery.h" + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + // change to true to display all GL extensions in the console on start-up #define DEBUG_PRINT_EXTENSIONS false @@ -24,20 +43,32 @@ using namespace utils; namespace filament::backend { bool OpenGLContext::queryOpenGLVersion(GLint* major, GLint* minor) noexcept { - if constexpr (BACKEND_OPENGL_VERSION == BACKEND_OPENGL_VERSION_GLES) { - char const* version = (char const*)glGetString(GL_VERSION); - // This works on all versions of GLES - int const n = version ? sscanf(version, "OpenGL ES %d.%d", major, minor) : 0; - return n == 2; - } else if constexpr (BACKEND_OPENGL_VERSION == BACKEND_OPENGL_VERSION_GL) { - // OpenGL version - glGetIntegerv(GL_MAJOR_VERSION, major); - glGetIntegerv(GL_MINOR_VERSION, minor); - return (glGetError() == GL_NO_ERROR); - } +#ifdef BACKEND_OPENGL_VERSION_GLES +# ifdef BACKEND_OPENGL_LEVEL_GLES30 + char const* version = (char const*)glGetString(GL_VERSION); + // This works on all versions of GLES + int const n = version ? sscanf(version, "OpenGL ES %d.%d", major, minor) : 0; + return n == 2; +# else + // when we compile with GLES2.0 only, we force the context version to 2.0 + *major = 2; + *minor = 0; + return true; +# endif +#else + // OpenGL version + glGetIntegerv(GL_MAJOR_VERSION, major); + glGetIntegerv(GL_MINOR_VERSION, minor); + return (glGetError() == GL_NO_ERROR); +#endif } -OpenGLContext::OpenGLContext() noexcept { +OpenGLContext::OpenGLContext(OpenGLPlatform& platform, + Platform::DriverConfig const& driverConfig) noexcept + : mPlatform(platform), + mSamplerMap(32), + mDriverConfig(driverConfig) { + state.vao.p = &mDefaultVAO; // These queries work with all GL/GLES versions! @@ -50,180 +81,85 @@ OpenGLContext::OpenGLContext() noexcept { "[" << state.version << "], [" << state.shader << "]" << io::endl; /* - * Figure out GL / GLES version and available features + * Figure out GL / GLES version, extensions and capabilities we need to + * determine the feature level */ queryOpenGLVersion(&state.major, &state.minor); - glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &gets.max_renderbuffer_size); - glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &gets.max_uniform_block_size); - glGetIntegerv(GL_MAX_SAMPLES, &gets.max_samples); - glGetIntegerv(GL_MAX_DRAW_BUFFERS, &gets.max_draw_buffers); - glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &gets.max_texture_image_units); - glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &gets.max_combined_texture_image_units); - glGetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &gets.max_transform_feedback_separate_attribs); - glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &gets.max_uniform_buffer_bindings); - glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &gets.uniform_buffer_offset_alignment); - - constexpr auto const caps3 = FEATURE_LEVEL_CAPS[+FeatureLevel::FEATURE_LEVEL_3]; - constexpr GLint MAX_VERTEX_SAMPLER_COUNT = caps3.MAX_VERTEX_SAMPLER_COUNT; - constexpr GLint MAX_FRAGMENT_SAMPLER_COUNT = caps3.MAX_FRAGMENT_SAMPLER_COUNT; - - if constexpr (BACKEND_OPENGL_VERSION == BACKEND_OPENGL_VERSION_GLES) { - initExtensionsGLES(); - if (state.major == 3) { - assert_invariant(gets.max_texture_image_units >= 16); - assert_invariant(gets.max_combined_texture_image_units >= 32); - if (state.minor >= 1) { - features.multisample_texture = true; - // figure out our feature level - if (ext.EXT_texture_cube_map_array) { - mFeatureLevel = FeatureLevel::FEATURE_LEVEL_2; - if (gets.max_texture_image_units >= MAX_FRAGMENT_SAMPLER_COUNT && - gets.max_combined_texture_image_units >= - (MAX_FRAGMENT_SAMPLER_COUNT + MAX_VERTEX_SAMPLER_COUNT)) { - mFeatureLevel = FeatureLevel::FEATURE_LEVEL_3; - } - } - } - } - } else if constexpr (BACKEND_OPENGL_VERSION == BACKEND_OPENGL_VERSION_GL) { - // OpenGL version - initExtensionsGL(); - if (state.major == 4) { - assert_invariant(state.minor >= 1); - mShaderModel = ShaderModel::DESKTOP; - if (state.minor >= 3) { - // cubemap arrays are available as of OpenGL 4.0 - mFeatureLevel = FeatureLevel::FEATURE_LEVEL_2; - // figure out our feature level - if (gets.max_texture_image_units >= MAX_FRAGMENT_SAMPLER_COUNT && - gets.max_combined_texture_image_units >= - (MAX_FRAGMENT_SAMPLER_COUNT + MAX_VERTEX_SAMPLER_COUNT)) { - mFeatureLevel = FeatureLevel::FEATURE_LEVEL_3; - } - } - features.multisample_texture = true; - } - // feedback loops are allowed on GL desktop as long as writes are disabled - bugs.allow_read_only_ancillary_feedback_loop = true; - assert_invariant(gets.max_texture_image_units >= 16); - assert_invariant(gets.max_combined_texture_image_units >= 32); + #if defined(BACKEND_OPENGL_VERSION_GLES) + if (UTILS_UNLIKELY(driverConfig.forceGLES2Context)) { + state.major = 2; + state.minor = 0; } -#ifdef GL_EXT_texture_filter_anisotropic - if (ext.EXT_texture_filter_anisotropic) { - glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gets.max_anisotropy); - } -#endif + #endif - /* - * Figure out which driver bugs we need to workaround - */ + OpenGLContext::initExtensions(&ext, state.major, state.minor); - const bool isAngle = strstr(state.renderer, "ANGLE"); - if (!isAngle) { - if (strstr(state.renderer, "Adreno")) { - // Qualcomm GPU - bugs.invalidate_end_only_if_invalidate_start = true; + OpenGLContext::initProcs(&procs, ext, state.major, state.minor); - // On Adreno (As of 3/20) timer query seem to return the CPU time, not the GPU time. - bugs.dont_use_timer_query = true; + OpenGLContext::initBugs(&bugs, ext, state.major, state.minor, + state.vendor, state.renderer, state.version, state.shader); - // Blits to texture arrays are failing - // This bug continues to reproduce, though at times we've seen it appear to "go away". - // The standalone sample app that was written to show this problem still reproduces. - // The working hypthesis is that some other state affects this behavior. - bugs.disable_sidecar_blit_into_texture_array = true; + glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &gets.max_renderbuffer_size); + glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &gets.max_texture_image_units); + glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &gets.max_combined_texture_image_units); - // early exit condition is flattened in EASU code - bugs.split_easu = true; + mFeatureLevel = OpenGLContext::resolveFeatureLevel(state.major, state.minor, ext, gets, bugs); - // initialize the non used uniform array for adreno drivers. - bugs.enable_initialize_non_used_uniform_array = true; +#ifdef BACKEND_OPENGL_VERSION_GLES + mShaderModel = ShaderModel::MOBILE; +#else + mShaderModel = ShaderModel::DESKTOP; +#endif - int maj, min, driverMajor, driverMinor; - int const c = sscanf(state.version, "OpenGL ES %d.%d V@%d.%d", // NOLINT(cert-err34-c) - &maj, &min, &driverMajor, &driverMinor); - if (c == 4) { - // Workarounds based on version here. - // notes: - // bugs.invalidate_end_only_if_invalidate_start - // - appeared at least in - // "OpenGL ES 3.2 V@0490.0 (GIT@85da404, I46ff5fc46f, 1606794520) (Date:11/30/20)" - // - wasn't present in - // "OpenGL ES 3.2 V@0490.0 (GIT@0905e9f, Ia11ce2d146, 1599072951) (Date:09/02/20)" - // - has been confirmed fixed in V@570.1 by Qualcomm - if (driverMajor < 490 || driverMajor > 570 || - (driverMajor == 570 && driverMinor >= 1)) { - bugs.invalidate_end_only_if_invalidate_start = false; - } - } +#ifdef BACKEND_OPENGL_VERSION_GLES + if (mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_2) { + features.multisample_texture = true; + } +#else + if (mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_1) { + features.multisample_texture = true; + } +#endif - // qualcomm seems to have no problem with this (which is good for us) - bugs.allow_read_only_ancillary_feedback_loop = true; - } else if (strstr(state.renderer, "Mali")) { - // ARM GPU - bugs.vao_doesnt_store_element_array_buffer_binding = true; - if (strstr(state.renderer, "Mali-T")) { - bugs.disable_glFlush = true; - bugs.disable_shared_context_draws = true; - bugs.texture_external_needs_rebind = true; - // We have not verified that timer queries work on Mali-T, so we disable to be safe. - bugs.dont_use_timer_query = true; - } - if (strstr(state.renderer, "Mali-G")) { - // assume we don't have working timer queries - bugs.dont_use_timer_query = true; - - int maj, min, driverVersion, driverRevision, driverPatch; - int const c = sscanf(state.version, "OpenGL ES %d.%d v%d.r%dp%d", // NOLINT(cert-err34-c) - &maj, &min, &driverVersion, &driverRevision, &driverPatch); - if (c == 5) { - // Workarounds based on version here. - // notes: - // bugs.dont_use_timer_query : on some Mali-Gxx drivers timer query seems - // to cause memory corruptions in some cases on some devices (see b/233754398). - // - appeared at least in - // "OpenGL ES 3.2 v1.r26p0-01eac0" - // - wasn't present in - // "OpenGL ES 3.2 v1.r32p1-00pxl1" - if (driverVersion >= 2 || (driverVersion == 1 && driverRevision >= 32)) { - bugs.dont_use_timer_query = false; - } - } - } - // Mali seems to have no problem with this (which is good for us) - bugs.allow_read_only_ancillary_feedback_loop = true; - } else if (strstr(state.renderer, "Intel")) { - // Intel GPU - bugs.vao_doesnt_store_element_array_buffer_binding = true; - } else if (strstr(state.renderer, "PowerVR")) { - // PowerVR GPU - } else if (strstr(state.renderer, "Apple")) { - // Apple GPU - } else if (strstr(state.renderer, "Tegra") || - strstr(state.renderer, "GeForce") || - strstr(state.renderer, "NV")) { - // NVIDIA GPU - } else if (strstr(state.renderer, "Vivante")) { - // Vivante GPU - } else if (strstr(state.renderer, "AMD") || - strstr(state.renderer, "ATI")) { - // AMD/ATI GPU - } else if (strstr(state.renderer, "Mozilla")) { - bugs.disable_invalidate_framebuffer = true; - } - } else { - // When running under ANGLE, it's a different set of workaround that we need. - if (strstr(state.renderer, "Adreno")) { - // Qualcomm GPU - // early exit condition is flattened in EASU code - // (that should be regardless of ANGLE, but we should double-check) - bugs.split_easu = true; + if (mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_1) { +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 +#ifdef GL_EXT_texture_filter_anisotropic + if (ext.EXT_texture_filter_anisotropic) { + glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gets.max_anisotropy); } - // TODO: see if we could use `bugs.allow_read_only_ancillary_feedback_loop = true` +#endif + glGetIntegerv(GL_MAX_DRAW_BUFFERS, + &gets.max_draw_buffers); + glGetIntegerv(GL_MAX_SAMPLES, + &gets.max_samples); + glGetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, + &gets.max_transform_feedback_separate_attribs); + glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, + &gets.max_uniform_block_size); + glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, + &gets.max_uniform_buffer_bindings); + glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, + &gets.num_program_binary_formats); + glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, + &gets.uniform_buffer_offset_alignment); +#endif } +#ifdef BACKEND_OPENGL_VERSION_GLES + else { + gets.max_anisotropy = 1; + gets.max_draw_buffers = 1; + gets.max_samples = 1; + gets.max_transform_feedback_separate_attribs = 0; + gets.max_uniform_block_size = 0; + gets.max_uniform_buffer_bindings = 0; + gets.num_program_binary_formats = 0; + gets.uniform_buffer_offset_alignment = 0; + } +#endif + slog.v << "Feature level: " << +mFeatureLevel << '\n'; slog.v << "Active workarounds: " << '\n'; UTILS_NOUNROLL @@ -234,25 +170,44 @@ OpenGLContext::OpenGLContext() noexcept { } flush(slog.v); - assert_invariant(gets.max_draw_buffers >= 4); // minspec - #ifndef NDEBUG // this is useful for development - slog.v << "GL_MAX_DRAW_BUFFERS = " << gets.max_draw_buffers << '\n' - << "GL_MAX_RENDERBUFFER_SIZE = " << gets.max_renderbuffer_size << '\n' - << "GL_MAX_SAMPLES = " << gets.max_samples << '\n' - << "GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = " << gets.max_anisotropy << '\n' - << "GL_MAX_UNIFORM_BLOCK_SIZE = " << gets.max_uniform_block_size << '\n' - << "GL_MAX_TEXTURE_IMAGE_UNITS = " << gets.max_texture_image_units << '\n' - << "GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT = " << gets.uniform_buffer_offset_alignment << '\n' + slog.v + << "GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = " + << gets.max_anisotropy << '\n' + << "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = " + << gets.max_combined_texture_image_units << '\n' + << "GL_MAX_DRAW_BUFFERS = " + << gets.max_draw_buffers << '\n' + << "GL_MAX_RENDERBUFFER_SIZE = " + << gets.max_renderbuffer_size << '\n' + << "GL_MAX_SAMPLES = " + << gets.max_samples << '\n' + << "GL_MAX_TEXTURE_IMAGE_UNITS = " + << gets.max_texture_image_units << '\n' + << "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = " + << gets.max_transform_feedback_separate_attribs << '\n' + << "GL_MAX_UNIFORM_BLOCK_SIZE = " + << gets.max_uniform_block_size << '\n' + << "GL_MAX_UNIFORM_BUFFER_BINDINGS = " + << gets.max_uniform_buffer_bindings << '\n' + << "GL_NUM_PROGRAM_BINARY_FORMATS = " + << gets.num_program_binary_formats << '\n' + << "GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT = " + << gets.uniform_buffer_offset_alignment << '\n' ; flush(slog.v); #endif +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + assert_invariant(mFeatureLevel == FeatureLevel::FEATURE_LEVEL_0 || gets.max_draw_buffers >= 4); // minspec +#endif + setDefaultState(); #ifdef GL_EXT_texture_filter_anisotropic - if (ext.EXT_texture_filter_anisotropic) { +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + if (mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_1 && ext.EXT_texture_filter_anisotropic) { // make sure we don't have any error flag while (glGetError() != GL_NO_ERROR) { } @@ -266,6 +221,7 @@ OpenGLContext::OpenGLContext() noexcept { } glDeleteSamplers(1, &s); } +#endif #endif // in practice KHR_Debug has never been useful, and actually is confusing. We keep this @@ -301,6 +257,63 @@ OpenGLContext::OpenGLContext() noexcept { glDebugMessageCallback(cb, nullptr); } #endif + + mTimerQueryFactory = TimerQueryFactory::init(platform, *this); +} + +OpenGLContext::~OpenGLContext() noexcept { + // note: this is called from the main thread. Can't do any GL calls. + delete mTimerQueryFactory; +} + +void OpenGLContext::terminate() noexcept { + // note: this is called from the backend thread +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + if (!isES2()) { + for (auto& item: mSamplerMap) { + unbindSampler(item.second); + glDeleteSamplers(1, &item.second); + } + mSamplerMap.clear(); + } +#endif +} + +void OpenGLContext::destroyWithContext( + size_t index, std::function const& closure) noexcept { + if (index == 0) { + // Note: we only need to delay the destruction of objects on the unprotected context + // (index 0) because the protected context is always immediately destroyed and all its + // active objects and bindings are then automatically destroyed. + // TODO: this is only guaranteed for EGLPlatform, but that's the only one we care about. + mDestroyWithNormalContext.push_back(closure); + } +} + +void OpenGLContext::unbindEverything() noexcept { + // TODO: we're supposed to unbind everything here so that resources don't get + // stuck in this context (contextIndex) when destroyed in the other context. + // However, because EGLPlatform always immediately destroys the protected context (1), + // the bindings will automatically be severed when we switch back to the default context. + // Since bindings now only exist in one context, we don't have a ref-counting issue to + // worry about. +} + +void OpenGLContext::synchronizeStateAndCache(size_t index) noexcept { + + // if we're just switching back to context 0, run all the pending destructors + if (index == 0) { + auto list = std::move(mDestroyWithNormalContext); + for (auto&& fn: list) { + fn(*this); + } + } + + // the default FBO could be invalid + mDefaultFbo[index].reset(); + + contextIndex = index; + resetState(); } void OpenGLContext::setDefaultState() noexcept { @@ -330,7 +343,7 @@ void OpenGLContext::setDefaultState() noexcept { // Point sprite size and seamless cubemap filtering are disabled by default in desktop GL. // In OpenGL ES, these flags do not exist because they are always on. -#if BACKEND_OPENGL_VERSION == BACKEND_OPENGL_VERSION_GL +#ifdef BACKEND_OPENGL_VERSION_GL glEnable(GL_PROGRAM_POINT_SIZE); enable(GL_PROGRAM_POINT_SIZE); #endif @@ -344,14 +357,312 @@ void OpenGLContext::setDefaultState() noexcept { glHint(GL_FRAGMENT_SHADER_DERIVATIVE_HINT, GL_NICEST); #endif -#if defined(GL_EXT_clip_control) || defined(GL_ARB_clip_control) || defined(GL_VERSION_4_5) +#if !defined(__EMSCRIPTEN__) if (ext.EXT_clip_control) { +#if defined(BACKEND_OPENGL_VERSION_GL) glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE); +#elif defined(GL_EXT_clip_control) + glClipControlEXT(GL_LOWER_LEFT_EXT, GL_ZERO_TO_ONE_EXT); +#endif + } +#endif + + if (ext.EXT_clip_cull_distance + && mDriverConfig.stereoscopicType == StereoscopicType::INSTANCED) { + glEnable(GL_CLIP_DISTANCE0); + glEnable(GL_CLIP_DISTANCE1); + } +} + + +void OpenGLContext::initProcs(Procs* procs, + Extensions const& ext, GLint major, GLint) noexcept { + (void)ext; + (void)major; + + // default procs that can be overridden based on runtime version +#ifdef BACKEND_OPENGL_LEVEL_GLES30 + procs->genVertexArrays = glGenVertexArrays; + procs->bindVertexArray = glBindVertexArray; + procs->deleteVertexArrays = glDeleteVertexArrays; + + // these are core in GL and GLES 3.x + procs->genQueries = glGenQueries; + procs->deleteQueries = glDeleteQueries; + procs->beginQuery = glBeginQuery; + procs->endQuery = glEndQuery; + procs->getQueryObjectuiv = glGetQueryObjectuiv; +# ifdef BACKEND_OPENGL_VERSION_GL + procs->getQueryObjectui64v = glGetQueryObjectui64v; // only core in GL +# elif defined(GL_EXT_disjoint_timer_query) +# ifndef __EMSCRIPTEN__ + procs->getQueryObjectui64v = glGetQueryObjectui64vEXT; +# endif +# endif // BACKEND_OPENGL_VERSION_GL + + // core in ES 3.0 and GL 4.3 + procs->invalidateFramebuffer = glInvalidateFramebuffer; +#endif // BACKEND_OPENGL_LEVEL_GLES30 + + // no-op if not supported + procs->maxShaderCompilerThreadsKHR = +[](GLuint) {}; + +#ifdef BACKEND_OPENGL_VERSION_GLES +# ifndef FILAMENT_IOS // FILAMENT_IOS is guaranteed to have ES3.x +# ifndef __EMSCRIPTEN__ + if (UTILS_UNLIKELY(major == 2)) { + // Runtime OpenGL version is ES 2.x + if (UTILS_LIKELY(ext.OES_vertex_array_object)) { + procs->genVertexArrays = glGenVertexArraysOES; + procs->bindVertexArray = glBindVertexArrayOES; + procs->deleteVertexArrays = glDeleteVertexArraysOES; + } else { + // if we don't have OES_vertex_array_object, just don't do anything with real VAOs, + // we'll just rebind everything each time. Most Mali-400 support this extension, but + // a few don't. + procs->genVertexArrays = +[](GLsizei, GLuint*) {}; + procs->bindVertexArray = +[](GLuint) {}; + procs->deleteVertexArrays = +[](GLsizei, GLuint const*) {}; + } + + // EXT_disjoint_timer_query is optional -- pointers will be null if not available + procs->genQueries = glGenQueriesEXT; + procs->deleteQueries = glDeleteQueriesEXT; + procs->beginQuery = glBeginQueryEXT; + procs->endQuery = glEndQueryEXT; + procs->getQueryObjectuiv = glGetQueryObjectuivEXT; + procs->getQueryObjectui64v = glGetQueryObjectui64vEXT; + + procs->invalidateFramebuffer = glDiscardFramebufferEXT; + + procs->maxShaderCompilerThreadsKHR = glMaxShaderCompilerThreadsKHR; } +# endif // __EMSCRIPTEN__ +# endif // FILAMENT_IOS +#else + procs->maxShaderCompilerThreadsKHR = glMaxShaderCompilerThreadsARB; #endif } -void OpenGLContext::initExtensionsGLES() noexcept { +void OpenGLContext::initBugs(Bugs* bugs, Extensions const& exts, + GLint major, GLint minor, + char const* vendor, + char const* renderer, + char const* version, + char const* shader) { + + (void)major; + (void)minor; + (void)vendor; + (void)renderer; + (void)version; + (void)shader; + + const bool isAngle = strstr(renderer, "ANGLE"); + if (!isAngle) { + if (strstr(renderer, "Adreno")) { + // Qualcomm GPU + bugs->invalidate_end_only_if_invalidate_start = true; + + // On Adreno (As of 3/20) timer query seem to return the CPU time, not the GPU time. + bugs->dont_use_timer_query = true; + + // Blits to texture arrays are failing + // This bug continues to reproduce, though at times we've seen it appear to "go away". + // The standalone sample app that was written to show this problem still reproduces. + // The working hypothesis is that some other state affects this behavior. + bugs->disable_blit_into_texture_array = true; + + // early exit condition is flattened in EASU code + bugs->split_easu = true; + + // initialize the non-used uniform array for Adreno drivers. + bugs->enable_initialize_non_used_uniform_array = true; + + int maj, min, driverMajor, driverMinor; + int const c = sscanf(version, "OpenGL ES %d.%d V@%d.%d", // NOLINT(cert-err34-c) + &maj, &min, &driverMajor, &driverMinor); + if (c == 4) { + // Workarounds based on version here. + // Notes: + // bugs.invalidate_end_only_if_invalidate_start + // - appeared at least in + // "OpenGL ES 3.2 V@0490.0 (GIT@85da404, I46ff5fc46f, 1606794520) (Date:11/30/20)" + // - wasn't present in + // "OpenGL ES 3.2 V@0490.0 (GIT@0905e9f, Ia11ce2d146, 1599072951) (Date:09/02/20)" + // - has been confirmed fixed in V@570.1 by Qualcomm + if (driverMajor < 490 || driverMajor > 570 || + (driverMajor == 570 && driverMinor >= 1)) { + bugs->invalidate_end_only_if_invalidate_start = false; + } + } + + // qualcomm seems to have no problem with this (which is good for us) + bugs->allow_read_only_ancillary_feedback_loop = true; + +#ifndef __EMSCRIPTEN__ + // Older Adreno devices that support ES3.0 only tend to be extremely buggy, so we + // fall back to ES2.0. + if (major == 3 && minor == 0) { + bugs->force_feature_level0 = true; + } +#endif + } else if (strstr(renderer, "Mali")) { + // ARM GPU + bugs->vao_doesnt_store_element_array_buffer_binding = true; + if (strstr(renderer, "Mali-T")) { + bugs->disable_glFlush = true; + bugs->disable_shared_context_draws = true; + // We have not verified that timer queries work on Mali-T, so we disable to be safe. + bugs->dont_use_timer_query = true; + } + if (strstr(renderer, "Mali-G")) { + // We have run into several problems with timer queries on Mali-Gxx: + // - timer queries seem to cause memory corruptions in some cases on some devices + // (see b/233754398) + // - appeared at least in: "OpenGL ES 3.2 v1.r26p0-01eac0" + // - wasn't present in: "OpenGL ES 3.2 v1.r32p1-00pxl1" + // - timer queries sometime crash with an NPE (see b/273759031) + bugs->dont_use_timer_query = true; + } + // Mali seems to have no problem with this (which is good for us) + bugs->allow_read_only_ancillary_feedback_loop = true; + } else if (strstr(renderer, "Intel")) { + // Intel GPU + bugs->vao_doesnt_store_element_array_buffer_binding = true; + } else if (strstr(renderer, "PowerVR")) { + // PowerVR GPU + // On PowerVR (Rogue GE8320) glFlush doesn't seem to do anything, in particular, + // it doesn't kick the GPU earlier, so don't issue these calls as they seem to slow + // things down. + bugs->disable_glFlush = true; + // On PowerVR (Rogue GE8320) using gl_InstanceID too early in the shader doesn't work. + bugs->powervr_shader_workarounds = true; + // On PowerVR (Rogue GE8320) destroying a fbo after glBlitFramebuffer is effectively + // equivalent to glFinish. + bugs->delay_fbo_destruction = true; + // PowerVR seems to have no problem with this (which is good for us) + bugs->allow_read_only_ancillary_feedback_loop = true; + } else if (strstr(renderer, "Apple")) { + // Apple GPU + } else if (strstr(renderer, "Tegra") || + strstr(renderer, "GeForce") || + strstr(renderer, "NV")) { + // NVIDIA GPU + } else if (strstr(renderer, "Vivante")) { + // Vivante GPU + } else if (strstr(renderer, "AMD") || + strstr(renderer, "ATI")) { + // AMD/ATI GPU + } else if (strstr(vendor, "Mesa")) { + // Seen on + // [Mesa], + // [llvmpipe (LLVM 17.0.6, 256 bits)], + // [4.5 (Core Profile) Mesa 24.0.6-1], + // [4.50] + // not known which version are affected + bugs->rebind_buffer_after_deletion = true; + } else if (strstr(renderer, "Mozilla")) { + bugs->disable_invalidate_framebuffer = true; + } + } else { + // When running under ANGLE, it's a different set of workaround that we need. + if (strstr(renderer, "Adreno")) { + // Qualcomm GPU + // early exit condition is flattened in EASU code + // (that should be regardless of ANGLE, but we should double-check) + bugs->split_easu = true; + } + } + +#ifdef BACKEND_OPENGL_VERSION_GLES +# ifndef FILAMENT_IOS // FILAMENT_IOS is guaranteed to have ES3.x + if (UTILS_UNLIKELY(major == 2)) { + if (UTILS_UNLIKELY(!exts.OES_vertex_array_object)) { + // we activate this workaround path, which does the reset of array buffer + bugs->vao_doesnt_store_element_array_buffer_binding = true; + } + } +# endif // FILAMENT_IOS +#else + // feedback loops are allowed on GL desktop as long as writes are disabled + bugs->allow_read_only_ancillary_feedback_loop = true; +#endif +} + +FeatureLevel OpenGLContext::resolveFeatureLevel(GLint major, GLint minor, + Extensions const& exts, + Gets const& gets, + Bugs const& bugs) noexcept { + + constexpr auto const caps3 = FEATURE_LEVEL_CAPS[+FeatureLevel::FEATURE_LEVEL_3]; + constexpr GLint MAX_VERTEX_SAMPLER_COUNT = caps3.MAX_VERTEX_SAMPLER_COUNT; + constexpr GLint MAX_FRAGMENT_SAMPLER_COUNT = caps3.MAX_FRAGMENT_SAMPLER_COUNT; + + (void)exts; + (void)gets; + (void)bugs; + + FeatureLevel featureLevel = FeatureLevel::FEATURE_LEVEL_1; + +#ifdef BACKEND_OPENGL_VERSION_GLES + if (major == 3) { + // Runtime OpenGL version is ES 3.x + assert_invariant(gets.max_texture_image_units >= 16); + assert_invariant(gets.max_combined_texture_image_units >= 32); + if (minor >= 1) { + // figure out our feature level + if (exts.EXT_texture_cube_map_array) { + featureLevel = FeatureLevel::FEATURE_LEVEL_2; + if (gets.max_texture_image_units >= MAX_FRAGMENT_SAMPLER_COUNT && + gets.max_combined_texture_image_units >= + (MAX_FRAGMENT_SAMPLER_COUNT + MAX_VERTEX_SAMPLER_COUNT)) { + featureLevel = FeatureLevel::FEATURE_LEVEL_3; + } + } + } + } +# ifndef FILAMENT_IOS // FILAMENT_IOS is guaranteed to have ES3.x + else if (UTILS_UNLIKELY(major == 2)) { + // Runtime OpenGL version is ES 2.x + // note: mandatory extensions (all supported by Mali-400 and Adreno 304) + // OES_depth_texture + // OES_depth24 + // OES_packed_depth_stencil + // OES_rgb8_rgba8 + // OES_standard_derivatives + // OES_texture_npot + featureLevel = FeatureLevel::FEATURE_LEVEL_0; + } +# endif // FILAMENT_IOS +#else + assert_invariant(gets.max_texture_image_units >= 16); + assert_invariant(gets.max_combined_texture_image_units >= 32); + if (major == 4) { + assert_invariant(minor >= 1); + if (minor >= 3) { + // cubemap arrays are available as of OpenGL 4.0 + featureLevel = FeatureLevel::FEATURE_LEVEL_2; + // figure out our feature level + if (gets.max_texture_image_units >= MAX_FRAGMENT_SAMPLER_COUNT && + gets.max_combined_texture_image_units >= + (MAX_FRAGMENT_SAMPLER_COUNT + MAX_VERTEX_SAMPLER_COUNT)) { + featureLevel = FeatureLevel::FEATURE_LEVEL_3; + } + } + } +#endif + + if (bugs.force_feature_level0) { + featureLevel = FeatureLevel::FEATURE_LEVEL_0; + } + + return featureLevel; +} + +#ifdef BACKEND_OPENGL_VERSION_GLES + +void OpenGLContext::initExtensionsGLES(Extensions* ext, GLint major, GLint minor) noexcept { const char * const extensions = (const char*)glGetString(GL_EXTENSIONS); GLUtils::unordered_string_set const exts = GLUtils::split(extensions); if constexpr (DEBUG_PRINT_EXTENSIONS) { @@ -363,39 +674,67 @@ void OpenGLContext::initExtensionsGLES() noexcept { // figure out and initialize the extensions we need using namespace std::literals; - ext.APPLE_color_buffer_packed_float = exts.has("GL_APPLE_color_buffer_packed_float"sv); - ext.EXT_clip_control = exts.has("GL_EXT_clip_control"sv); - ext.EXT_color_buffer_float = exts.has("GL_EXT_color_buffer_float"sv); - ext.EXT_color_buffer_half_float = exts.has("GL_EXT_color_buffer_half_float"sv); - ext.EXT_debug_marker = exts.has("GL_EXT_debug_marker"sv); - ext.EXT_disjoint_timer_query = exts.has("GL_EXT_disjoint_timer_query"sv); - ext.EXT_multisampled_render_to_texture = exts.has("GL_EXT_multisampled_render_to_texture"sv); - ext.EXT_multisampled_render_to_texture2 = exts.has("GL_EXT_multisampled_render_to_texture2"sv); - ext.EXT_shader_framebuffer_fetch = exts.has("GL_EXT_shader_framebuffer_fetch"sv); -#if !defined(__EMSCRIPTEN__) - ext.EXT_texture_compression_etc2 = true; -#endif - ext.EXT_texture_compression_s3tc = exts.has("GL_EXT_texture_compression_s3tc"sv); - ext.EXT_texture_compression_s3tc_srgb = exts.has("GL_EXT_texture_compression_s3tc_srgb"sv); - ext.EXT_texture_compression_rgtc = exts.has("GL_EXT_texture_compression_rgtc"sv); - ext.EXT_texture_compression_bptc = exts.has("GL_EXT_texture_compression_bptc"sv); - ext.EXT_texture_cube_map_array = exts.has("GL_EXT_texture_cube_map_array"sv) || exts.has("GL_OES_texture_cube_map_array"sv); - ext.GOOGLE_cpp_style_line_directive = exts.has("GL_GOOGLE_cpp_style_line_directive"sv); - ext.KHR_debug = exts.has("GL_KHR_debug"sv); - ext.KHR_texture_compression_astc_hdr = exts.has("GL_KHR_texture_compression_astc_hdr"sv); - ext.KHR_texture_compression_astc_ldr = exts.has("GL_KHR_texture_compression_astc_ldr"sv); - ext.OES_EGL_image_external_essl3 = exts.has("GL_OES_EGL_image_external_essl3"sv); - ext.QCOM_tiled_rendering = exts.has("GL_QCOM_tiled_rendering"sv); - ext.WEBGL_compressed_texture_etc = exts.has("WEBGL_compressed_texture_etc"sv); - ext.WEBGL_compressed_texture_s3tc = exts.has("WEBGL_compressed_texture_s3tc"sv); - ext.WEBGL_compressed_texture_s3tc_srgb = exts.has("WEBGL_compressed_texture_s3tc_srgb"sv); + ext->APPLE_color_buffer_packed_float = exts.has("GL_APPLE_color_buffer_packed_float"sv); +#ifndef __EMSCRIPTEN__ + ext->EXT_clip_control = exts.has("GL_EXT_clip_control"sv); +#endif + ext->EXT_clip_cull_distance = exts.has("GL_EXT_clip_cull_distance"sv); + ext->EXT_color_buffer_float = exts.has("GL_EXT_color_buffer_float"sv); + ext->EXT_color_buffer_half_float = exts.has("GL_EXT_color_buffer_half_float"sv); +#ifndef __EMSCRIPTEN__ + ext->EXT_debug_marker = exts.has("GL_EXT_debug_marker"sv); +#endif + ext->EXT_depth_clamp = exts.has("GL_EXT_depth_clamp"sv); + ext->EXT_discard_framebuffer = exts.has("GL_EXT_discard_framebuffer"sv); +#ifndef __EMSCRIPTEN__ + ext->EXT_disjoint_timer_query = exts.has("GL_EXT_disjoint_timer_query"sv); + ext->EXT_multisampled_render_to_texture = exts.has("GL_EXT_multisampled_render_to_texture"sv); + ext->EXT_multisampled_render_to_texture2 = exts.has("GL_EXT_multisampled_render_to_texture2"sv); + ext->EXT_protected_textures = exts.has("GL_EXT_protected_textures"sv); +#endif + ext->EXT_shader_framebuffer_fetch = exts.has("GL_EXT_shader_framebuffer_fetch"sv); +#ifndef __EMSCRIPTEN__ + ext->EXT_texture_compression_etc2 = true; +#endif + ext->EXT_texture_compression_s3tc = exts.has("GL_EXT_texture_compression_s3tc"sv); + ext->EXT_texture_compression_s3tc_srgb = exts.has("GL_EXT_texture_compression_s3tc_srgb"sv); + ext->EXT_texture_compression_rgtc = exts.has("GL_EXT_texture_compression_rgtc"sv); + ext->EXT_texture_compression_bptc = exts.has("GL_EXT_texture_compression_bptc"sv); + ext->EXT_texture_cube_map_array = exts.has("GL_EXT_texture_cube_map_array"sv) || exts.has("GL_OES_texture_cube_map_array"sv); + ext->GOOGLE_cpp_style_line_directive = exts.has("GL_GOOGLE_cpp_style_line_directive"sv); + ext->KHR_debug = exts.has("GL_KHR_debug"sv); + ext->KHR_parallel_shader_compile = exts.has("GL_KHR_parallel_shader_compile"sv); + ext->KHR_texture_compression_astc_hdr = exts.has("GL_KHR_texture_compression_astc_hdr"sv); + ext->KHR_texture_compression_astc_ldr = exts.has("GL_KHR_texture_compression_astc_ldr"sv); + ext->OES_depth_texture = exts.has("GL_OES_depth_texture"sv); + ext->OES_depth24 = exts.has("GL_OES_depth24"sv); + ext->OES_packed_depth_stencil = exts.has("GL_OES_packed_depth_stencil"sv); + ext->OES_EGL_image_external_essl3 = exts.has("GL_OES_EGL_image_external_essl3"sv); + ext->OES_rgb8_rgba8 = exts.has("GL_OES_rgb8_rgba8"sv); + ext->OES_standard_derivatives = exts.has("GL_OES_standard_derivatives"sv); + ext->OES_texture_npot = exts.has("GL_OES_texture_npot"sv); + ext->OES_vertex_array_object = exts.has("GL_OES_vertex_array_object"sv); + ext->OVR_multiview2 = exts.has("GL_OVR_multiview2"sv); + ext->WEBGL_compressed_texture_etc = exts.has("WEBGL_compressed_texture_etc"sv); + ext->WEBGL_compressed_texture_s3tc = exts.has("WEBGL_compressed_texture_s3tc"sv); + ext->WEBGL_compressed_texture_s3tc_srgb = exts.has("WEBGL_compressed_texture_s3tc_srgb"sv); + // ES 3.2 implies EXT_color_buffer_float - if (state.major >= 3 && state.minor >= 2) { - ext.EXT_color_buffer_float = true; + if (major > 3 || (major == 3 && minor >= 2)) { + ext->EXT_color_buffer_float = true; + } + // ES 3.x implies EXT_discard_framebuffer and OES_vertex_array_object + if (major >= 3) { + ext->EXT_discard_framebuffer = true; + ext->OES_vertex_array_object = true; } } -void OpenGLContext::initExtensionsGL() noexcept { +#endif // BACKEND_OPENGL_VERSION_GLES + +#ifdef BACKEND_OPENGL_VERSION_GL + +void OpenGLContext::initExtensionsGL(Extensions* ext, GLint major, GLint minor) noexcept { GLUtils::unordered_string_set exts; GLint n = 0; glGetIntegerv(GL_NUM_EXTENSIONS, &n); @@ -410,27 +749,102 @@ void OpenGLContext::initExtensionsGL() noexcept { } using namespace std::literals; - auto major = state.major; - auto minor = state.minor; - ext.APPLE_color_buffer_packed_float = true; // Assumes core profile. - ext.ARB_shading_language_packing = exts.has("GL_ARB_shading_language_packing"sv) || (major == 4 && minor >= 2); - ext.EXT_clip_control = exts.has("GL_ARB_clip_control"sv) || (major == 4 && minor >= 5); - ext.EXT_color_buffer_float = true; // Assumes core profile. - ext.EXT_color_buffer_half_float = true; // Assumes core profile. - ext.EXT_debug_marker = exts.has("GL_EXT_debug_marker"sv); - ext.EXT_shader_framebuffer_fetch = exts.has("GL_EXT_shader_framebuffer_fetch"sv); - ext.EXT_texture_compression_etc2 = exts.has("GL_ARB_ES3_compatibility"sv); - ext.EXT_texture_compression_s3tc = exts.has("GL_EXT_texture_compression_s3tc"sv); - ext.EXT_texture_compression_s3tc_srgb = exts.has("GL_EXT_texture_compression_s3tc_srgb"sv); - ext.EXT_texture_compression_rgtc = exts.has("GL_EXT_texture_compression_rgtc"sv); - ext.EXT_texture_compression_bptc = exts.has("GL_EXT_texture_compression_bptc"sv); - ext.EXT_texture_filter_anisotropic = exts.has("GL_EXT_texture_filter_anisotropic"sv); - ext.EXT_texture_sRGB = exts.has("GL_EXT_texture_sRGB"sv); - ext.GOOGLE_cpp_style_line_directive = exts.has("GL_GOOGLE_cpp_style_line_directive"sv); - ext.KHR_debug = major >= 4 && minor >= 3; - ext.KHR_texture_compression_astc_hdr = exts.has("GL_KHR_texture_compression_astc_hdr"sv); - ext.KHR_texture_compression_astc_ldr = exts.has("GL_KHR_texture_compression_astc_ldr"sv); - ext.OES_EGL_image_external_essl3 = exts.has("GL_OES_EGL_image_external_essl3"sv); + ext->APPLE_color_buffer_packed_float = true; // Assumes core profile. + ext->ARB_shading_language_packing = exts.has("GL_ARB_shading_language_packing"sv); + ext->EXT_color_buffer_float = true; // Assumes core profile. + ext->EXT_color_buffer_half_float = true; // Assumes core profile. + ext->EXT_clip_cull_distance = true; + ext->EXT_debug_marker = exts.has("GL_EXT_debug_marker"sv); + ext->EXT_depth_clamp = true; + ext->EXT_discard_framebuffer = false; + ext->EXT_disjoint_timer_query = true; + ext->EXT_multisampled_render_to_texture = false; + ext->EXT_multisampled_render_to_texture2 = false; + ext->EXT_shader_framebuffer_fetch = exts.has("GL_EXT_shader_framebuffer_fetch"sv); + ext->EXT_texture_compression_bptc = exts.has("GL_EXT_texture_compression_bptc"sv); + ext->EXT_texture_compression_etc2 = exts.has("GL_ARB_ES3_compatibility"sv); + ext->EXT_texture_compression_rgtc = exts.has("GL_EXT_texture_compression_rgtc"sv); + ext->EXT_texture_compression_s3tc = exts.has("GL_EXT_texture_compression_s3tc"sv); + ext->EXT_texture_compression_s3tc_srgb = exts.has("GL_EXT_texture_compression_s3tc_srgb"sv); + ext->EXT_texture_cube_map_array = true; + ext->EXT_texture_filter_anisotropic = exts.has("GL_EXT_texture_filter_anisotropic"sv); + ext->EXT_texture_sRGB = exts.has("GL_EXT_texture_sRGB"sv); + ext->GOOGLE_cpp_style_line_directive = exts.has("GL_GOOGLE_cpp_style_line_directive"sv); + ext->KHR_parallel_shader_compile = exts.has("GL_KHR_parallel_shader_compile"sv); + ext->KHR_texture_compression_astc_hdr = exts.has("GL_KHR_texture_compression_astc_hdr"sv); + ext->KHR_texture_compression_astc_ldr = exts.has("GL_KHR_texture_compression_astc_ldr"sv); + ext->OES_depth_texture = true; + ext->OES_depth24 = true; + ext->OES_EGL_image_external_essl3 = false; + ext->OES_rgb8_rgba8 = true; + ext->OES_standard_derivatives = true; + ext->OES_texture_npot = true; + ext->OES_vertex_array_object = true; + ext->OVR_multiview2 = exts.has("GL_OVR_multiview2"sv); + ext->WEBGL_compressed_texture_etc = false; + ext->WEBGL_compressed_texture_s3tc = false; + ext->WEBGL_compressed_texture_s3tc_srgb = false; + + // OpenGL 4.2 implies ARB_shading_language_packing + if (major > 4 || (major == 4 && minor >= 2)) { + ext->ARB_shading_language_packing = true; + } + // OpenGL 4.3 implies EXT_discard_framebuffer + if (major > 4 || (major == 4 && minor >= 3)) { + ext->EXT_discard_framebuffer = true; + ext->KHR_debug = true; + } + // OpenGL 4.5 implies EXT_clip_control + if (major > 4 || (major == 4 && minor >= 5)) { + ext->EXT_clip_control = true; + } +} + +#endif // BACKEND_OPENGL_VERSION_GL + + +GLuint OpenGLContext::bindFramebuffer(GLenum target, GLuint buffer) noexcept { + if (UTILS_UNLIKELY(buffer == 0)) { + // we're binding the default frame buffer, resolve its actual name + auto& defaultFboForThisContext = mDefaultFbo[contextIndex]; + if (UTILS_UNLIKELY(!defaultFboForThisContext.has_value())) { + defaultFboForThisContext = GLuint(mPlatform.getDefaultFramebufferObject()); + } + buffer = defaultFboForThisContext.value(); + } + bindFramebufferResolved(target, buffer); + return buffer; +} + +void OpenGLContext::unbindFramebuffer(GLenum target) noexcept { + bindFramebufferResolved(target, 0); +} + +void OpenGLContext::bindFramebufferResolved(GLenum target, GLuint buffer) noexcept { + switch (target) { + case GL_FRAMEBUFFER: + if (state.draw_fbo != buffer || state.read_fbo != buffer) { + state.draw_fbo = state.read_fbo = buffer; + glBindFramebuffer(target, buffer); + } + break; +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + case GL_DRAW_FRAMEBUFFER: + if (state.draw_fbo != buffer) { + state.draw_fbo = buffer; + glBindFramebuffer(target, buffer); + } + break; + case GL_READ_FRAMEBUFFER: + if (state.read_fbo != buffer) { + state.read_fbo = buffer; + glBindFramebuffer(target, buffer); + } + break; +#endif + default: + break; + } } void OpenGLContext::bindBuffer(GLenum target, GLuint buffer) noexcept { @@ -464,14 +878,18 @@ void OpenGLContext::pixelStore(GLenum pname, GLint param) noexcept { // that cannot be duplicated at the call site (e.g. glTexImage2D or glReadPixels) switch (pname) { - case GL_PACK_ALIGNMENT: pcur = &state.pack.alignment; break; - case GL_PACK_ROW_LENGTH: pcur = &state.pack.row_length; break; - case GL_PACK_SKIP_PIXELS: pcur = &state.pack.skip_pixels; break; // convenience - case GL_PACK_SKIP_ROWS: pcur = &state.pack.skip_row; break; // convenience - case GL_UNPACK_ALIGNMENT: pcur = &state.unpack.alignment; break; - case GL_UNPACK_ROW_LENGTH: pcur = &state.unpack.row_length; break; - case GL_UNPACK_SKIP_PIXELS: pcur = &state.unpack.skip_pixels; break; // convenience - case GL_UNPACK_SKIP_ROWS: pcur = &state.unpack.skip_row; break; // convenience + case GL_PACK_ALIGNMENT: + pcur = &state.pack.alignment; + break; + case GL_UNPACK_ALIGNMENT: + pcur = &state.unpack.alignment; + break; +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + case GL_UNPACK_ROW_LENGTH: + assert_invariant(state.major > 2); + pcur = &state.unpack.row_length; + break; +#endif default: goto default_case; } @@ -483,19 +901,32 @@ void OpenGLContext::pixelStore(GLenum pname, GLint param) noexcept { } } -void OpenGLContext::unbindTexture(GLenum target, GLuint texture_id) noexcept { +void OpenGLContext::unbindTexture( + UTILS_UNUSED_IN_RELEASE GLenum target, GLuint texture_id) noexcept { // unbind this texture from all the units it might be bound to // no need unbind the texture from FBOs because we're not tracking that state (and there is // no need to). - const size_t index = getIndexForTextureTarget(target); - UTILS_NOUNROLL - for (GLuint unit = 0; unit < MAX_TEXTURE_UNIT_COUNT; unit++) { - if (state.textures.units[unit].targets[index].texture_id == texture_id) { - bindTexture(unit, target, (GLuint)0, index); + // Never attempt to unbind texture 0. This could happen with external textures w/ streaming if + // never populated. + if (texture_id) { + UTILS_NOUNROLL + for (GLuint unit = 0; unit < MAX_TEXTURE_UNIT_COUNT; unit++) { + if (state.textures.units[unit].id == texture_id) { + // if this texture is bound, it should be at the same target + assert_invariant(state.textures.units[unit].target == target); + unbindTextureUnit(unit); + } } } } +void OpenGLContext::unbindTextureUnit(GLuint unit) noexcept { + update_state(state.textures.units[unit].id, 0u, [&]() { + activeTexture(unit); + glBindTexture(state.textures.units[unit].target, 0u); + }); +} + void OpenGLContext::unbindSampler(GLuint sampler) noexcept { // unbind this sampler from all the units it might be bound to UTILS_NOUNROLL // clang generates >800B of code!!! @@ -506,57 +937,105 @@ void OpenGLContext::unbindSampler(GLuint sampler) noexcept { } } -void OpenGLContext::deleteBuffers(GLsizei n, const GLuint* buffers, GLenum target) noexcept { - glDeleteBuffers(n, buffers); +void OpenGLContext::deleteBuffer(GLuint buffer, GLenum target) noexcept { + glDeleteBuffers(1, &buffer); + // bindings of bound buffers are reset to 0 - const size_t targetIndex = getIndexForBufferTarget(target); - auto& genericBuffer = state.buffers.genericBinding[targetIndex]; - UTILS_NOUNROLL - for (GLsizei i = 0; i < n; ++i) { - if (genericBuffer == buffers[i]) { - genericBuffer = 0; + size_t const targetIndex = getIndexForBufferTarget(target); + auto& genericBinding = state.buffers.genericBinding[targetIndex]; + if (genericBinding == buffer) { + genericBinding = 0; + } + + if (UTILS_UNLIKELY(bugs.rebind_buffer_after_deletion)) { + if (genericBinding) { + glBindBuffer(target, genericBinding); } } + +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + assert_invariant(mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_1 || + (target != GL_UNIFORM_BUFFER && target != GL_TRANSFORM_FEEDBACK_BUFFER)); + if (target == GL_UNIFORM_BUFFER || target == GL_TRANSFORM_FEEDBACK_BUFFER) { - auto& indexedBuffer = state.buffers.targets[targetIndex]; - UTILS_NOUNROLL // clang generates >1 KiB of code!! - for (GLsizei i = 0; i < n; ++i) { - UTILS_NOUNROLL - for (auto& buffer : indexedBuffer.buffers) { - if (buffer.name == buffers[i]) { - buffer.name = 0; - buffer.offset = 0; - buffer.size = 0; - } + auto& indexedBinding = state.buffers.targets[targetIndex]; + UTILS_NOUNROLL + for (auto& entry: indexedBinding.buffers) { + if (entry.name == buffer) { + entry.name = 0; + entry.offset = 0; + entry.size = 0; } } } +#endif } -void OpenGLContext::deleteVertexArrays(GLsizei n, const GLuint* arrays) noexcept { - glDeleteVertexArrays(1, arrays); - // binding of a bound VAO is reset to 0 - for (GLsizei i = 0; i < n; ++i) { - if (state.vao.p->vao == arrays[i]) { +void OpenGLContext::deleteVertexArray(GLuint vao) noexcept { + if (UTILS_LIKELY(vao)) { + procs.deleteVertexArrays(1, &vao); + // if the destroyed VAO is bound, clear the binding. + if (state.vao.p->vao[contextIndex] == vao) { bindVertexArray(nullptr); } } } +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 +GLuint OpenGLContext::getSamplerSlow(SamplerParams params) const noexcept { + assert_invariant(mSamplerMap.find(params) == mSamplerMap.end()); + + using namespace GLUtils; + + GLuint s; + glGenSamplers(1, &s); + glSamplerParameteri(s, GL_TEXTURE_MIN_FILTER, (GLint)getTextureFilter(params.filterMin)); + glSamplerParameteri(s, GL_TEXTURE_MAG_FILTER, (GLint)getTextureFilter(params.filterMag)); + glSamplerParameteri(s, GL_TEXTURE_WRAP_S, (GLint)getWrapMode(params.wrapS)); + glSamplerParameteri(s, GL_TEXTURE_WRAP_T, (GLint)getWrapMode(params.wrapT)); + glSamplerParameteri(s, GL_TEXTURE_WRAP_R, (GLint)getWrapMode(params.wrapR)); + glSamplerParameteri(s, GL_TEXTURE_COMPARE_MODE, (GLint)getTextureCompareMode(params.compareMode)); + glSamplerParameteri(s, GL_TEXTURE_COMPARE_FUNC, (GLint)getTextureCompareFunc(params.compareFunc)); + +#if defined(GL_EXT_texture_filter_anisotropic) + if (ext.EXT_texture_filter_anisotropic && + !bugs.texture_filter_anisotropic_broken_on_sampler) { + GLfloat const anisotropy = float(1u << params.anisotropyLog2); + glSamplerParameterf(s, GL_TEXTURE_MAX_ANISOTROPY_EXT, + std::min(gets.max_anisotropy, anisotropy)); + } +#endif + CHECK_GL_ERROR(utils::slog.e) + mSamplerMap[params] = s; + return s; +} +#endif + + void OpenGLContext::resetState() noexcept { // Force GL state to match the Filament state - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, state.draw_fbo); - glBindFramebuffer(GL_READ_FRAMEBUFFER, state.read_fbo); + + // increase the state version so other parts of the state know to reset + state.age++; + + if (state.major > 2) { +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, state.draw_fbo); + glBindFramebuffer(GL_READ_FRAMEBUFFER, state.read_fbo); +#endif + } else { + assert_invariant(state.read_fbo == state.draw_fbo); + glBindFramebuffer(GL_FRAMEBUFFER, state.draw_fbo); + state.read_fbo = state.draw_fbo; + } + // state.program glUseProgram(state.program.use); // state.vao - if (state.vao.p) { - glBindVertexArray(state.vao.p->vao); - } else { - bindVertexArray(nullptr); - } + state.vao.p = nullptr; + bindVertexArray(nullptr); // state.raster glFrontFace(state.raster.frontFace); @@ -615,69 +1094,88 @@ void OpenGLContext::resetState() noexcept { // Reset state.buffers to its default state to avoid the complexity and error-prone // nature of resetting the GL state to its existing state state.buffers = {}; - GLenum const bufferTargets[] = { - GL_UNIFORM_BUFFER, - GL_TRANSFORM_FEEDBACK_BUFFER, -#if !defined(__EMSCRIPTEN__) - GL_SHADER_STORAGE_BUFFER, -#endif - GL_ARRAY_BUFFER, - GL_COPY_READ_BUFFER, - GL_COPY_WRITE_BUFFER, - GL_ELEMENT_ARRAY_BUFFER, - GL_PIXEL_PACK_BUFFER, - GL_PIXEL_UNPACK_BUFFER, - }; - for (auto const target : bufferTargets) { - glBindBuffer(target, 0); - } - for (size_t bufferIndex = 0; bufferIndex < MAX_BUFFER_BINDINGS; ++bufferIndex) { - if (bufferIndex < (size_t)gets.max_uniform_buffer_bindings) { - glBindBufferBase(GL_UNIFORM_BUFFER, bufferIndex, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + + if (state.major > 2) { +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + for (auto const target: { + GL_UNIFORM_BUFFER, + GL_TRANSFORM_FEEDBACK_BUFFER, +#if defined(BACKEND_OPENGL_LEVEL_GLES31) + GL_SHADER_STORAGE_BUFFER, +#endif + GL_PIXEL_PACK_BUFFER, + GL_PIXEL_UNPACK_BUFFER, + }) { + glBindBuffer(target, 0); } - if (bufferIndex < (size_t)gets.max_transform_feedback_separate_attribs) { - glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, bufferIndex, 0); + for (size_t bufferIndex = 0; bufferIndex < MAX_BUFFER_BINDINGS; ++bufferIndex) { + if (bufferIndex < (size_t)gets.max_uniform_buffer_bindings) { + glBindBufferBase(GL_UNIFORM_BUFFER, bufferIndex, 0); + } + + if (bufferIndex < (size_t)gets.max_transform_feedback_separate_attribs) { + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, bufferIndex, 0); + } } +#endif } // state.textures // Reset state.textures to its default state to avoid the complexity and error-prone // nature of resetting the GL state to its existing state state.textures = {}; - const GLuint textureTargets[] = { - GL_TEXTURE_2D, - GL_TEXTURE_2D_ARRAY, - GL_TEXTURE_CUBE_MAP, - GL_TEXTURE_3D, + const std::pair textureTargets[] = { + { GL_TEXTURE_2D, true }, + { GL_TEXTURE_2D_ARRAY, true }, + { GL_TEXTURE_CUBE_MAP, true }, + { GL_TEXTURE_3D, true }, +#if defined(BACKEND_OPENGL_LEVEL_GLES31) + { GL_TEXTURE_2D_MULTISAMPLE, true }, +#endif #if !defined(__EMSCRIPTEN__) - GL_TEXTURE_2D_MULTISAMPLE, - GL_TEXTURE_EXTERNAL_OES, - GL_TEXTURE_CUBE_MAP_ARRAY, +#if defined(GL_OES_EGL_image_external) + { GL_TEXTURE_EXTERNAL_OES, ext.OES_EGL_image_external_essl3 }, +#endif +#if defined(BACKEND_OPENGL_VERSION_GL) || defined(GL_EXT_texture_cube_map_array) + { GL_TEXTURE_CUBE_MAP_ARRAY, ext.EXT_texture_cube_map_array }, +#endif #endif }; for (GLint unit = 0; unit < gets.max_combined_texture_image_units; ++unit) { glActiveTexture(GL_TEXTURE0 + unit); - glBindSampler(unit, 0); - - for (auto const target : textureTargets) { - glBindTexture(target, 0); + if (state.major > 2) { +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + glBindSampler(unit, 0); +#endif + } + for (auto [target, available] : textureTargets) { + if (available) { + glBindTexture(target, 0); + } } } glActiveTexture(GL_TEXTURE0 + state.textures.active); // state.unpack glPixelStorei(GL_UNPACK_ALIGNMENT, state.unpack.alignment); - glPixelStorei(GL_UNPACK_ROW_LENGTH, state.unpack.row_length); - glPixelStorei(GL_UNPACK_SKIP_PIXELS, state.unpack.skip_pixels); - glPixelStorei(GL_UNPACK_SKIP_ROWS, state.unpack.skip_row); + if (state.major > 2) { +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + glPixelStorei(GL_UNPACK_ROW_LENGTH, state.unpack.row_length); +#endif + } + // state.pack glPixelStorei(GL_PACK_ALIGNMENT, state.pack.alignment); - glPixelStorei(GL_PACK_ROW_LENGTH, state.pack.row_length); - glPixelStorei(GL_PACK_SKIP_PIXELS, state.pack.skip_pixels); - glPixelStorei(GL_PACK_SKIP_ROWS, state.pack.skip_row); + if (state.major > 2) { +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + glPixelStorei(GL_PACK_ROW_LENGTH, 0); // we rely on GL_PACK_ROW_LENGTH being zero +#endif + } // state.window glScissor( @@ -693,7 +1191,22 @@ void OpenGLContext::resetState() noexcept { state.window.viewport.w ); glDepthRangef(state.window.depthRange.x, state.window.depthRange.y); - +} + +void OpenGLContext::createTimerQuery(GLTimerQuery* query) { + mTimerQueryFactory->createTimerQuery(query); +} + +void OpenGLContext::destroyTimerQuery(GLTimerQuery* query) { + mTimerQueryFactory->destroyTimerQuery(query); +} + +void OpenGLContext::beginTimeElapsedQuery(GLTimerQuery* query) { + mTimerQueryFactory->beginTimeElapsedQuery(query); +} + +void OpenGLContext::endTimeElapsedQuery(OpenGLDriver& driver, GLTimerQuery* query) { + mTimerQueryFactory->endTimeElapsedQuery(driver, query); } } // namesapce filament diff --git a/filament/backend/src/opengl/OpenGLContext.h b/filament/backend/src/opengl/OpenGLContext.h index 85f3ce7fc23..72e3f8f2b12 100644 --- a/filament/backend/src/opengl/OpenGLContext.h +++ b/filament/backend/src/opengl/OpenGLContext.h @@ -17,26 +17,42 @@ #ifndef TNT_FILAMENT_BACKEND_OPENGLCONTEXT_H #define TNT_FILAMENT_BACKEND_OPENGLCONTEXT_H -#include -#include -#include +#include "OpenGLTimerQuery.h" + +#include +#include #include -#include "GLUtils.h" +#include "gl_headers.h" + +#include +#include +#include + +#include +#include + +#include #include -#include +#include +#include #include -#include +#include + +#include +#include namespace filament::backend { -class OpenGLContext { +class OpenGLPlatform; + +class OpenGLContext final : public TimerQueryFactoryInterface { public: static constexpr const size_t MAX_TEXTURE_UNIT_COUNT = MAX_SAMPLER_COUNT; - static constexpr const size_t DUMMY_TEXTURE_BINDING = 31; // highest binding less than 32 + static constexpr const size_t DUMMY_TEXTURE_BINDING = 7; // highest binding guaranteed to work with ES2 static constexpr const size_t MAX_BUFFER_BINDINGS = 32; typedef math::details::TVec4 vec4gli; typedef math::details::TVec2 vec2glf; @@ -44,30 +60,88 @@ class OpenGLContext { struct RenderPrimitive { static_assert(MAX_VERTEX_ATTRIBUTE_COUNT <= 16); - GLuint vao = 0; // 4 + GLuint vao[2] = {}; // 8 GLuint elementArray = 0; // 4 - utils::bitset vertexAttribArray; // 2 - - // If this version number does not match vertexBufferWithObjects->bufferObjectsVersion, - // then the VAO needs to be updated. - uint8_t vertexBufferVersion = 0; // 1 - uint8_t indicesSize = 0; // 1 + GLenum indicesType = 0; // 4 // The optional 32-bit handle to a GLVertexBuffer is necessary only if the referenced // VertexBuffer supports buffer objects. If this is zero, then the VBO handles array is // immutable. - Handle vertexBufferWithObjects = {}; // 4 + Handle vertexBufferWithObjects; // 4 + + mutable utils::bitset vertexAttribArray; // 2 + + uint8_t reserved[2] = {}; // 2 + + // if this differs from vertexBufferWithObjects->bufferObjectsVersion, this VAO needs to + // be updated (see OpenGLDriver::updateVertexArrayObject()) + uint8_t vertexBufferVersion = 0; // 1 + + // if this differs from OpenGLContext::state.age, this VAO needs to + // be updated (see OpenGLDriver::updateVertexArrayObject()) + uint8_t stateVersion = 0; // 1 + + // If this differs from OpenGLContext::state.age, this VAO's name needs to be updated. + // See OpenGLContext::bindVertexArray() + uint8_t nameVersion = 0; // 1 + + // Size in bytes of indices in the index buffer (1 or 2) + uint8_t indicesShift = 0; // 1 GLenum getIndicesType() const noexcept { - return indicesSize == 4 ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT; + return indicesType; } } gl; static bool queryOpenGLVersion(GLint* major, GLint* minor) noexcept; - OpenGLContext() noexcept; + explicit OpenGLContext(OpenGLPlatform& platform, + Platform::DriverConfig const& driverConfig) noexcept; + + ~OpenGLContext() noexcept final; + + void terminate() noexcept; + + // TimerQueryInterface ------------------------------------------------------------------------ + + // note: OpenGLContext being final ensures (clang) these are not called through the vtable + void createTimerQuery(GLTimerQuery* query) override; + void destroyTimerQuery(GLTimerQuery* query) override; + void beginTimeElapsedQuery(GLTimerQuery* query) override; + void endTimeElapsedQuery(OpenGLDriver& driver, GLTimerQuery* query) override; + + // -------------------------------------------------------------------------------------------- + + template + inline bool isAtLeastGL() const noexcept { +#ifdef BACKEND_OPENGL_VERSION_GL + return state.major > MAJOR || (state.major == MAJOR && state.minor >= MINOR); +#else + return false; +#endif + } + + template + inline bool isAtLeastGLES() const noexcept { +#ifdef BACKEND_OPENGL_VERSION_GLES + return state.major > MAJOR || (state.major == MAJOR && state.minor >= MINOR); +#else + return false; +#endif + } + + inline bool isES2() const noexcept { +#if defined(BACKEND_OPENGL_VERSION_GLES) && !defined(FILAMENT_IOS) +# ifndef BACKEND_OPENGL_LEVEL_GLES30 + return true; +# else + return mFeatureLevel == FeatureLevel::FEATURE_LEVEL_0; +# endif +#else + return false; +#endif + } - constexpr static inline size_t getIndexForTextureTarget(GLuint target) noexcept; constexpr inline size_t getIndexForCap(GLenum cap) noexcept; constexpr static inline size_t getIndexForBufferTarget(GLenum target) noexcept; @@ -79,10 +153,10 @@ class OpenGLContext { void pixelStore(GLenum, GLint) noexcept; inline void activeTexture(GLuint unit) noexcept; - inline void bindTexture(GLuint unit, GLuint target, GLuint texId, size_t targetIndex) noexcept; - inline void bindTexture(GLuint unit, GLuint target, GLuint texId) noexcept; + inline void bindTexture(GLuint unit, GLuint target, GLuint texId, bool external) noexcept; void unbindTexture(GLenum target, GLuint id) noexcept; + void unbindTextureUnit(GLuint unit) noexcept; inline void bindVertexArray(RenderPrimitive const* p) noexcept; inline void bindSampler(GLuint unit, GLuint sampler) noexcept; void unbindSampler(GLuint sampler) noexcept; @@ -91,10 +165,11 @@ class OpenGLContext { inline void bindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) noexcept; - inline void bindFramebuffer(GLenum target, GLuint buffer) noexcept; + GLuint bindFramebuffer(GLenum target, GLuint buffer) noexcept; + void unbindFramebuffer(GLenum target) noexcept; - inline void enableVertexAttribArray(GLuint index) noexcept; - inline void disableVertexAttribArray(GLuint index) noexcept; + inline void enableVertexAttribArray(RenderPrimitive const* rp, GLuint index) noexcept; + inline void disableVertexAttribArray(RenderPrimitive const* rp, GLuint index) noexcept; inline void enable(GLenum cap) noexcept; inline void disable(GLenum cap) noexcept; inline void frontFace(GLenum mode) noexcept; @@ -110,28 +185,28 @@ class OpenGLContext { GLenum sfailBack, GLenum dpfailBack, GLenum dppassBack) noexcept; inline void stencilMaskSeparate(GLuint maskFront, GLuint maskBack) noexcept; inline void polygonOffset(GLfloat factor, GLfloat units) noexcept; - inline void beginQuery(GLenum target, GLuint query) noexcept; - inline void endQuery(GLenum target) noexcept; - inline GLuint getQuery(GLenum target) const noexcept; inline void setScissor(GLint left, GLint bottom, GLsizei width, GLsizei height) noexcept; inline void viewport(GLint left, GLint bottom, GLsizei width, GLsizei height) noexcept; inline void depthRange(GLclampf near, GLclampf far) noexcept; - void deleteBuffers(GLsizei n, const GLuint* buffers, GLenum target) noexcept; - void deleteVertexArrays(GLsizei n, const GLuint* arrays) noexcept; + void deleteBuffer(GLuint buffer, GLenum target) noexcept; + void deleteVertexArray(GLuint vao) noexcept; + + void destroyWithContext(size_t index, std::function const& closure) noexcept; // glGet*() values - struct { + struct Gets { GLfloat max_anisotropy; + GLint max_combined_texture_image_units; GLint max_draw_buffers; GLint max_renderbuffer_size; GLint max_samples; - GLint max_uniform_block_size; GLint max_texture_image_units; - GLint max_combined_texture_image_units; GLint max_transform_feedback_separate_attribs; - GLint max_uniform_buffer_bindings; + GLint max_uniform_block_size; + GLint max_uniform_buffer_bindings; + GLint num_program_binary_formats; GLint uniform_buffer_offset_alignment; } gets = {}; @@ -141,37 +216,49 @@ class OpenGLContext { } features = {}; // supported extensions detected at runtime - struct { + struct Extensions { bool APPLE_color_buffer_packed_float; bool ARB_shading_language_packing; bool EXT_clip_control; + bool EXT_clip_cull_distance; bool EXT_color_buffer_float; bool EXT_color_buffer_half_float; bool EXT_debug_marker; + bool EXT_depth_clamp; + bool EXT_discard_framebuffer; bool EXT_disjoint_timer_query; - bool EXT_multisampled_render_to_texture; bool EXT_multisampled_render_to_texture2; + bool EXT_multisampled_render_to_texture; + bool EXT_protected_textures; bool EXT_shader_framebuffer_fetch; - bool KHR_texture_compression_astc_hdr; - bool KHR_texture_compression_astc_ldr; + bool EXT_texture_compression_bptc; bool EXT_texture_compression_etc2; + bool EXT_texture_compression_rgtc; bool EXT_texture_compression_s3tc; bool EXT_texture_compression_s3tc_srgb; - bool EXT_texture_compression_rgtc; - bool EXT_texture_compression_bptc; bool EXT_texture_cube_map_array; bool EXT_texture_filter_anisotropic; bool EXT_texture_sRGB; bool GOOGLE_cpp_style_line_directive; bool KHR_debug; + bool KHR_parallel_shader_compile; + bool KHR_texture_compression_astc_hdr; + bool KHR_texture_compression_astc_ldr; bool OES_EGL_image_external_essl3; - bool QCOM_tiled_rendering; + bool OES_depth24; + bool OES_depth_texture; + bool OES_packed_depth_stencil; + bool OES_rgb8_rgba8; + bool OES_standard_derivatives; + bool OES_texture_npot; + bool OES_vertex_array_object; + bool OVR_multiview2; bool WEBGL_compressed_texture_etc; bool WEBGL_compressed_texture_s3tc; bool WEBGL_compressed_texture_s3tc_srgb; } ext = {}; - struct { + struct Bugs { // Some drivers have issues with UBOs in the fragment shader when // glFlush() is called between draw calls. bool disable_glFlush; @@ -183,10 +270,6 @@ class OpenGLContext { // Some drivers have gl state issues when drawing from shared contexts bool disable_shared_context_draws; - // Some drivers require the GL_TEXTURE_EXTERNAL_OES target to be bound when - // the texture image changes, even if it's already bound to that texture - bool texture_external_needs_rebind; - // Some web browsers seem to immediately clear the default framebuffer when calling // glInvalidateFramebuffer with WebGL 2.0 bool disable_invalidate_framebuffer; @@ -205,7 +288,7 @@ class OpenGLContext { // Some drivers can't blit from a sidecar renderbuffer into a layer of a texture array. // This technique is used for VSM with MSAA turned on. - bool disable_sidecar_blit_into_texture_array; + bool disable_blit_into_texture_array; // Some drivers incorrectly flatten the early exit condition in the EASU code, in which // case we need an alternative algorithm @@ -223,6 +306,25 @@ class OpenGLContext { // Some Adreno drivers crash in glDrawXXX() when there's an uninitialized uniform block, // even when the shader doesn't access it. bool enable_initialize_non_used_uniform_array; + + // Workarounds specific to PowerVR GPUs affecting shaders (currently, we lump them all + // under one specialization constant). + // - gl_InstanceID is invalid when used first in the vertex shader + bool powervr_shader_workarounds; + + // On PowerVR destroying the destination of a glBlitFramebuffer operation is equivalent to + // a glFinish. So we must delay the destruction until we know the GPU is finished. + bool delay_fbo_destruction; + + // Mesa sometimes clears the generic buffer binding when *another* buffer is destroyed, + // if that other buffer is bound on an *indexed* buffer binding. + bool rebind_buffer_after_deletion; + + // Force feature level 0. Typically used for low end ES3 devices with significant driver + // bugs or performance issues. + bool force_feature_level0; + + } bugs = {}; // state getters -- as needed. @@ -230,15 +332,32 @@ class OpenGLContext { // function to handle state changes we don't control void updateTexImage(GLenum target, GLuint id) noexcept { - const size_t index = getIndexForTextureTarget(target); - state.textures.units[state.textures.active].targets[index].texture_id = id; + assert_invariant(target == GL_TEXTURE_EXTERNAL_OES); + // if another target is bound to this texture unit, unbind that texture + if (UTILS_UNLIKELY(state.textures.units[state.textures.active].target != target)) { + glBindTexture(state.textures.units[state.textures.active].target, 0); + state.textures.units[state.textures.active].target = GL_TEXTURE_EXTERNAL_OES; + } + // the texture is already bound to `target`, we just update our internal state + state.textures.units[state.textures.active].id = id; } void resetProgram() noexcept { state.program.use = 0; } FeatureLevel getFeatureLevel() const noexcept { return mFeatureLevel; } + // This is the index of the context in use. Must be 0 or 1. This is used to manange the + // OpenGL name of ContainerObjects within each context. + uint32_t contextIndex = 0; + // Try to keep the State structure sorted by data-access patterns struct State { + State() noexcept = default; + // make sure we don't copy this state by accident + State(State const& rhs) = delete; + State(State&& rhs) noexcept = delete; + State& operator=(State const& rhs) = delete; + State& operator=(State&& rhs) noexcept = delete; + GLint major = 0; GLint minor = 0; @@ -315,32 +434,26 @@ class OpenGLContext { GLintptr offset = 0; GLsizeiptr size = 0; } buffers[MAX_BUFFER_BINDINGS]; - } targets[2]; // there are only 2 indexed buffer target (uniform and transform feedback) - GLuint genericBinding[9] = { 0 }; + } targets[3]; // there are only 3 indexed buffer targets + GLuint genericBinding[7] = {}; } buffers; struct { GLuint active = 0; // zero-based struct { GLuint sampler = 0; - struct { - GLuint texture_id = 0; - } targets[7]; // this must match getIndexForTextureTarget() + GLuint target = 0; + GLuint id = 0; } units[MAX_TEXTURE_UNIT_COUNT]; } textures; struct { GLint row_length = 0; GLint alignment = 4; - GLint skip_pixels = 0; - GLint skip_row = 0; } unpack; struct { - GLint row_length = 0; GLint alignment = 4; - GLint skip_pixels = 0; - GLint skip_row = 0; } pack; struct { @@ -348,15 +461,60 @@ class OpenGLContext { vec4gli viewport { 0 }; vec2glf depthRange { 0.0f, 1.0f }; } window; - - struct { - GLuint timer = -1u; - } queries; + uint8_t age = 0; } state; + struct Procs { + void (* bindVertexArray)(GLuint array); + void (* deleteVertexArrays)(GLsizei n, const GLuint* arrays); + void (* genVertexArrays)(GLsizei n, GLuint* arrays); + + void (* genQueries)(GLsizei n, GLuint* ids); + void (* deleteQueries)(GLsizei n, const GLuint* ids); + void (* beginQuery)(GLenum target, GLuint id); + void (* endQuery)(GLenum target); + void (* getQueryObjectuiv)(GLuint id, GLenum pname, GLuint* params); + void (* getQueryObjectui64v)(GLuint id, GLenum pname, GLuint64* params); + + void (* invalidateFramebuffer)(GLenum target, GLsizei numAttachments, const GLenum *attachments); + + void (* maxShaderCompilerThreadsKHR)(GLuint count); + } procs{}; + + void unbindEverything() noexcept; + void synchronizeStateAndCache(size_t index) noexcept; + +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + GLuint getSamplerSlow(SamplerParams sp) const noexcept; + + inline GLuint getSampler(SamplerParams sp) const noexcept { + assert_invariant(!sp.padding0); + assert_invariant(!sp.padding1); + assert_invariant(!sp.padding2); + auto& samplerMap = mSamplerMap; + auto pos = samplerMap.find(sp); + if (UTILS_UNLIKELY(pos == samplerMap.end())) { + return getSamplerSlow(sp); + } + return pos->second; + } +#endif + + private: + OpenGLPlatform& mPlatform; ShaderModel mShaderModel = ShaderModel::MOBILE; FeatureLevel mFeatureLevel = FeatureLevel::FEATURE_LEVEL_1; + TimerQueryFactoryInterface* mTimerQueryFactory = nullptr; + std::vector> mDestroyWithNormalContext; + RenderPrimitive mDefaultVAO; + std::optional mDefaultFbo[2]; + mutable tsl::robin_map mSamplerMap; + + Platform::DriverConfig const mDriverConfig; + + void bindFramebufferResolved(GLenum target, GLuint buffer) noexcept; const std::array, sizeof(bugs)> mBugDatabase{{ { bugs.disable_glFlush, @@ -368,9 +526,6 @@ class OpenGLContext { { bugs.disable_shared_context_draws, "disable_shared_context_draws", ""}, - { bugs.texture_external_needs_rebind, - "texture_external_needs_rebind", - ""}, { bugs.disable_invalidate_framebuffer, "disable_invalidate_framebuffer", ""}, @@ -383,8 +538,8 @@ class OpenGLContext { { bugs.dont_use_timer_query, "dont_use_timer_query", ""}, - { bugs.disable_sidecar_blit_into_texture_array, - "disable_sidecar_blit_into_texture_array", + { bugs.disable_blit_into_texture_array, + "disable_blit_into_texture_array", ""}, { bugs.split_easu, "split_easu", @@ -398,13 +553,52 @@ class OpenGLContext { { bugs.enable_initialize_non_used_uniform_array, "enable_initialize_non_used_uniform_array", ""}, + { bugs.powervr_shader_workarounds, + "powervr_shader_workarounds", + ""}, + { bugs.delay_fbo_destruction, + "delay_fbo_destruction", + ""}, + { bugs.rebind_buffer_after_deletion, + "rebind_buffer_after_deletion", + ""}, + { bugs.force_feature_level0, + "force_feature_level0", + ""}, }}; - RenderPrimitive mDefaultVAO; - // this is chosen to minimize code size - void initExtensionsGLES() noexcept; - void initExtensionsGL() noexcept; +#if defined(BACKEND_OPENGL_VERSION_GLES) + static void initExtensionsGLES(Extensions* ext, GLint major, GLint minor) noexcept; +#endif +#if defined(BACKEND_OPENGL_VERSION_GL) + static void initExtensionsGL(Extensions* ext, GLint major, GLint minor) noexcept; +#endif + + static void initExtensions(Extensions* ext, GLint major, GLint minor) noexcept { +#if defined(BACKEND_OPENGL_VERSION_GLES) + initExtensionsGLES(ext, major, minor); +#endif +#if defined(BACKEND_OPENGL_VERSION_GL) + initExtensionsGL(ext, major, minor); +#endif + } + + static void initBugs(Bugs* bugs, Extensions const& exts, + GLint major, GLint minor, + char const* vendor, + char const* renderer, + char const* version, + char const* shader + ); + + static void initProcs(Procs* procs, + Extensions const& exts, GLint major, GLint minor) noexcept; + + static FeatureLevel resolveFeatureLevel(GLint major, GLint minor, + Extensions const& exts, + Gets const& gets, + Bugs const& bugs) noexcept; template static inline void update_state(T& state, T const& expected, F functor, bool force = false) noexcept { @@ -415,29 +609,10 @@ class OpenGLContext { } void setDefaultState() noexcept; - - static constexpr const size_t TEXTURE_TARGET_COUNT = - sizeof(state.textures.units[0].targets) / sizeof(state.textures.units[0].targets[0]); - }; // ------------------------------------------------------------------------------------------------ -constexpr size_t OpenGLContext::getIndexForTextureTarget(GLuint target) noexcept { - // this must match state.textures[].targets[] - switch (target) { - case GL_TEXTURE_2D: return 0; - case GL_TEXTURE_2D_ARRAY: return 1; - case GL_TEXTURE_CUBE_MAP: return 2; - case GL_TEXTURE_2D_MULTISAMPLE: return 3; - case GL_TEXTURE_EXTERNAL_OES: return 4; - case GL_TEXTURE_3D: return 5; - case GL_TEXTURE_CUBE_MAP_ARRAY: return 6; - default: - return 0; - } -} - constexpr size_t OpenGLContext::getIndexForCap(GLenum cap) noexcept { //NOLINT size_t index = 0; switch (cap) { @@ -450,17 +625,16 @@ constexpr size_t OpenGLContext::getIndexForCap(GLenum cap) noexcept { //NOLINT case GL_SAMPLE_ALPHA_TO_COVERAGE: index = 6; break; case GL_SAMPLE_COVERAGE: index = 7; break; case GL_POLYGON_OFFSET_FILL: index = 8; break; - case GL_PRIMITIVE_RESTART_FIXED_INDEX: index = 9; break; - case GL_RASTERIZER_DISCARD: index = 10; break; #ifdef GL_ARB_seamless_cube_map - case GL_TEXTURE_CUBE_MAP_SEAMLESS: index = 11; break; + case GL_TEXTURE_CUBE_MAP_SEAMLESS: index = 9; break; #endif -#if BACKEND_OPENGL_VERSION == BACKEND_OPENGL_VERSION_GL - case GL_PROGRAM_POINT_SIZE: index = 12; break; +#ifdef BACKEND_OPENGL_VERSION_GL + case GL_PROGRAM_POINT_SIZE: index = 10; break; #endif - default: index = 13; break; // should never happen + case GL_DEPTH_CLAMP: index = 11; break; + default: break; } - assert_invariant(index < 13 && index < state.enables.caps.size()); + assert_invariant(index < state.enables.caps.size()); return index; } @@ -468,17 +642,20 @@ constexpr size_t OpenGLContext::getIndexForBufferTarget(GLenum target) noexcept size_t index = 0; switch (target) { // The indexed buffers MUST be first in this list (those usable with bindBufferRange) +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 case GL_UNIFORM_BUFFER: index = 0; break; case GL_TRANSFORM_FEEDBACK_BUFFER: index = 1; break; +#if defined(BACKEND_OPENGL_LEVEL_GLES31) case GL_SHADER_STORAGE_BUFFER: index = 2; break; - +#endif +#endif case GL_ARRAY_BUFFER: index = 3; break; - case GL_COPY_READ_BUFFER: index = 4; break; - case GL_COPY_WRITE_BUFFER: index = 5; break; - case GL_ELEMENT_ARRAY_BUFFER: index = 6; break; - case GL_PIXEL_PACK_BUFFER: index = 7; break; - case GL_PIXEL_UNPACK_BUFFER: index = 8; break; - default: index = 9; break; // should never happen + case GL_ELEMENT_ARRAY_BUFFER: index = 4; break; +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + case GL_PIXEL_PACK_BUFFER: index = 5; break; + case GL_PIXEL_UNPACK_BUFFER: index = 6; break; +#endif + default: break; } assert_invariant(index < sizeof(state.buffers.genericBinding)/sizeof(state.buffers.genericBinding[0])); // NOLINT(misc-redundant-expression) return index; @@ -495,27 +672,30 @@ void OpenGLContext::activeTexture(GLuint unit) noexcept { void OpenGLContext::bindSampler(GLuint unit, GLuint sampler) noexcept { assert_invariant(unit < MAX_TEXTURE_UNIT_COUNT); + assert_invariant(mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_1); +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 update_state(state.textures.units[unit].sampler, sampler, [&]() { glBindSampler(unit, sampler); }); +#endif } void OpenGLContext::setScissor(GLint left, GLint bottom, GLsizei width, GLsizei height) noexcept { - vec4gli scissor(left, bottom, width, height); + vec4gli const scissor(left, bottom, width, height); update_state(state.window.scissor, scissor, [&]() { glScissor(left, bottom, width, height); }); } void OpenGLContext::viewport(GLint left, GLint bottom, GLsizei width, GLsizei height) noexcept { - vec4gli viewport(left, bottom, width, height); + vec4gli const viewport(left, bottom, width, height); update_state(state.window.viewport, viewport, [&]() { glViewport(left, bottom, width, height); }); } void OpenGLContext::depthRange(GLclampf near, GLclampf far) noexcept { - vec2glf depthRange(near, far); + vec2glf const depthRange(near, far); update_state(state.window.depthRange, depthRange, [&]() { glDepthRangef(near, far); }); @@ -524,11 +704,26 @@ void OpenGLContext::depthRange(GLclampf near, GLclampf far) noexcept { void OpenGLContext::bindVertexArray(RenderPrimitive const* p) noexcept { RenderPrimitive* vao = p ? const_cast(p) : &mDefaultVAO; update_state(state.vao.p, vao, [&]() { - glBindVertexArray(vao->vao); + + // See if we need to create a name for this VAO on the fly, this would happen if: + // - we're not the default VAO, because its name is always 0 + // - our name is 0, this could happen if this VAO was created in the "other" context + // - the nameVersion is out of date *and* we're on the protected context, in this case: + // - the name must be stale from a previous use of this context because we always + // destroy the protected context when we're done with it. + bool const recreateVaoName = p != &mDefaultVAO && + ((vao->vao[contextIndex] == 0) || + (vao->nameVersion != state.age && contextIndex == 1)); + if (UTILS_UNLIKELY(recreateVaoName)) { + vao->nameVersion = state.age; + procs.genVertexArrays(1, &vao->vao[contextIndex]); + } + + procs.bindVertexArray(vao->vao[contextIndex]); // update GL_ELEMENT_ARRAY_BUFFER, which is updated by glBindVertexArray - size_t targetIndex = getIndexForBufferTarget(GL_ELEMENT_ARRAY_BUFFER); + size_t const targetIndex = getIndexForBufferTarget(GL_ELEMENT_ARRAY_BUFFER); state.buffers.genericBinding[targetIndex] = vao->elementArray; - if (UTILS_UNLIKELY(bugs.vao_doesnt_store_element_array_buffer_binding)) { + if (UTILS_UNLIKELY(bugs.vao_doesnt_store_element_array_buffer_binding || recreateVaoName)) { // This shouldn't be needed, but it looks like some drivers don't do the implicit // glBindBuffer(). glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vao->elementArray); @@ -538,10 +733,22 @@ void OpenGLContext::bindVertexArray(RenderPrimitive const* p) noexcept { void OpenGLContext::bindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) noexcept { - size_t targetIndex = getIndexForBufferTarget(target); - assert_invariant(targetIndex <= 2); // validity check - + assert_invariant(mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_1); + +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 +# ifdef BACKEND_OPENGL_LEVEL_GLES31 + assert_invariant(false + || target == GL_UNIFORM_BUFFER + || target == GL_TRANSFORM_FEEDBACK_BUFFER + || target == GL_SHADER_STORAGE_BUFFER); +# else + assert_invariant(false + || target == GL_UNIFORM_BUFFER + || target == GL_TRANSFORM_FEEDBACK_BUFFER); +# endif + size_t const targetIndex = getIndexForBufferTarget(target); // this ALSO sets the generic binding + assert_invariant(targetIndex < sizeof(state.buffers.targets) / sizeof(*state.buffers.targets)); if ( state.buffers.targets[targetIndex].buffers[index].name != buffer || state.buffers.targets[targetIndex].buffers[index].offset != offset || state.buffers.targets[targetIndex].buffers[index].size != size) { @@ -551,44 +758,20 @@ void OpenGLContext::bindBufferRange(GLenum target, GLuint index, GLuint buffer, state.buffers.genericBinding[targetIndex] = buffer; glBindBufferRange(target, index, buffer, offset, size); } +#endif } -void OpenGLContext::bindFramebuffer(GLenum target, GLuint buffer) noexcept { - switch (target) { - case GL_FRAMEBUFFER: - if (state.draw_fbo != buffer || state.read_fbo != buffer) { - state.draw_fbo = state.read_fbo = buffer; - glBindFramebuffer(target, buffer); - } - break; - case GL_DRAW_FRAMEBUFFER: - if (state.draw_fbo != buffer) { - state.draw_fbo = buffer; - glBindFramebuffer(target, buffer); - } - break; - case GL_READ_FRAMEBUFFER: - if (state.read_fbo != buffer) { - state.read_fbo = buffer; - glBindFramebuffer(target, buffer); - } - break; - default: - break; - } -} - -void OpenGLContext::bindTexture(GLuint unit, GLuint target, GLuint texId, size_t targetIndex) noexcept { - assert_invariant(targetIndex == getIndexForTextureTarget(target)); - assert_invariant(targetIndex < TEXTURE_TARGET_COUNT); - update_state(state.textures.units[unit].targets[targetIndex].texture_id, texId, [&]() { +void OpenGLContext::bindTexture(GLuint unit, GLuint target, GLuint texId, bool external) noexcept { + // another texture is bound to the same unit with a different target, + // unbind the texture from the current target + update_state(state.textures.units[unit].target, target, [&]() { + activeTexture(unit); + glBindTexture(state.textures.units[unit].target, 0); + }); + update_state(state.textures.units[unit].id, texId, [&]() { activeTexture(unit); glBindTexture(target, texId); - }, (target == GL_TEXTURE_EXTERNAL_OES) && bugs.texture_external_needs_rebind); -} - -void OpenGLContext::bindTexture(GLuint unit, GLuint target, GLuint texId) noexcept { - bindTexture(unit, target, texId, getIndexForTextureTarget(target)); + }, external); } void OpenGLContext::useProgram(GLuint program) noexcept { @@ -597,26 +780,28 @@ void OpenGLContext::useProgram(GLuint program) noexcept { }); } -void OpenGLContext::enableVertexAttribArray(GLuint index) noexcept { - assert_invariant(state.vao.p); - assert_invariant(index < state.vao.p->vertexAttribArray.size()); - if (UTILS_UNLIKELY(!state.vao.p->vertexAttribArray[index])) { - state.vao.p->vertexAttribArray.set(index); +void OpenGLContext::enableVertexAttribArray(RenderPrimitive const* rp, GLuint index) noexcept { + assert_invariant(rp); + assert_invariant(index < rp->vertexAttribArray.size()); + bool const force = rp->stateVersion != state.age; + if (UTILS_UNLIKELY(force || !rp->vertexAttribArray[index])) { + rp->vertexAttribArray.set(index); glEnableVertexAttribArray(index); } } -void OpenGLContext::disableVertexAttribArray(GLuint index) noexcept { - assert_invariant(state.vao.p); - assert_invariant(index < state.vao.p->vertexAttribArray.size()); - if (UTILS_UNLIKELY(state.vao.p->vertexAttribArray[index])) { - state.vao.p->vertexAttribArray.unset(index); +void OpenGLContext::disableVertexAttribArray(RenderPrimitive const* rp, GLuint index) noexcept { + assert_invariant(rp); + assert_invariant(index < rp->vertexAttribArray.size()); + bool const force = rp->stateVersion != state.age; + if (UTILS_UNLIKELY(force || rp->vertexAttribArray[index])) { + rp->vertexAttribArray.unset(index); glDisableVertexAttribArray(index); } } void OpenGLContext::enable(GLenum cap) noexcept { - size_t index = getIndexForCap(cap); + size_t const index = getIndexForCap(cap); if (UTILS_UNLIKELY(!state.enables.caps[index])) { state.enables.caps.set(index); glEnable(cap); @@ -624,7 +809,7 @@ void OpenGLContext::enable(GLenum cap) noexcept { } void OpenGLContext::disable(GLenum cap) noexcept { - size_t index = getIndexForCap(cap); + size_t const index = getIndexForCap(cap); if (UTILS_UNLIKELY(state.enables.caps[index])) { state.enables.caps.unset(index); glDisable(cap); @@ -723,41 +908,6 @@ void OpenGLContext::polygonOffset(GLfloat factor, GLfloat units) noexcept { }); } -void OpenGLContext::beginQuery(GLenum target, GLuint query) noexcept { - switch (target) { - case GL_TIME_ELAPSED: - if (state.queries.timer != -1u) { - // this is an error - break; - } - state.queries.timer = query; - break; - default: - return; - } - glBeginQuery(target, query); -} - -void OpenGLContext::endQuery(GLenum target) noexcept { - switch (target) { - case GL_TIME_ELAPSED: - state.queries.timer = -1u; - break; - default: - return; - } - glEndQuery(target); -} - -GLuint OpenGLContext::getQuery(GLenum target) const noexcept { - switch (target) { - case GL_TIME_ELAPSED: - return state.queries.timer; - default: - return 0; - } -} - } // namespace filament #endif //TNT_FILAMENT_BACKEND_OPENGLCONTEXT_H diff --git a/filament/backend/src/opengl/OpenGLDriver.cpp b/filament/backend/src/opengl/OpenGLDriver.cpp index 2134459f42e..736fa0d6769 100644 --- a/filament/backend/src/opengl/OpenGLDriver.cpp +++ b/filament/backend/src/opengl/OpenGLDriver.cpp @@ -16,21 +16,60 @@ #include "OpenGLDriver.h" -#include "private/backend/DriverApi.h" - #include "CommandStreamDispatcher.h" +#include "GLTexture.h" +#include "GLUtils.h" #include "OpenGLContext.h" #include "OpenGLDriverFactory.h" #include "OpenGLProgram.h" #include "OpenGLTimerQuery.h" +#include "SystraceProfile.h" +#include "gl_headers.h" #include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "private/backend/Dispatcher.h" +#include "private/backend/DriverApi.h" + +#include +#include +#include +#include #include #include #include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include #if defined(__EMSCRIPTEN__) #include @@ -50,17 +89,50 @@ #define HAS_MAPBUFFERS 1 #endif -#define DEBUG_MARKER_NONE 0 -#define DEBUG_MARKER_OPENGL 1 +#define DEBUG_GROUP_MARKER_NONE 0x00 // no debug marker +#define DEBUG_GROUP_MARKER_OPENGL 0x01 // markers in the gl command queue (req. driver support) +#define DEBUG_GROUP_MARKER_BACKEND 0x02 // markers on the backend side (systrace) +#define DEBUG_GROUP_MARKER_ALL 0xFF // all markers + +#define DEBUG_MARKER_NONE 0x00 // no debug marker +#define DEBUG_MARKER_OPENGL 0x01 // markers in the gl command queue (req. driver support) +#define DEBUG_MARKER_BACKEND 0x02 // markers on the backend side (systrace) +#define DEBUG_MARKER_PROFILE 0x04 // profiling on the backend side (systrace) +#define DEBUG_MARKER_ALL (0xFF & ~DEBUG_MARKER_PROFILE) // all markers + +// set to the desired debug marker level (for user markers [default: All]) +#define DEBUG_GROUP_MARKER_LEVEL DEBUG_GROUP_MARKER_ALL -// set to the desired debug marker level -#define DEBUG_MARKER_LEVEL DEBUG_MARKER_NONE +// set to the desired debug level (for internal debugging [Default: None]) +#define DEBUG_MARKER_LEVEL DEBUG_MARKER_NONE -#if DEBUG_MARKER_LEVEL == DEBUG_MARKER_OPENGL -# define DEBUG_MARKER() \ - DebugMarker _debug_marker(*this, __func__); +// Override the debug markers if we are forcing profiling mode +#if defined(FILAMENT_FORCE_PROFILING_MODE) +# undef DEBUG_GROUP_MARKER_LEVEL +# undef DEBUG_MARKER_LEVEL + +# define DEBUG_GROUP_MARKER_LEVEL DEBUG_GROUP_MARKER_NONE +# define DEBUG_MARKER_LEVEL DEBUG_MARKER_PROFILE +#endif + +#if DEBUG_MARKER_LEVEL == DEBUG_MARKER_PROFILE +# define DEBUG_MARKER() +# define PROFILE_MARKER(marker) PROFILE_SCOPE(marker); +# if DEBUG_GROUP_MARKER_LEVEL != DEBUG_GROUP_MARKER_NONE +# error PROFILING is exclusive; group markers must be disabled. +# endif +# ifndef NDEBUG +# error PROFILING is meaningless in DEBUG mode. +# endif +#elif DEBUG_MARKER_LEVEL > DEBUG_MARKER_NONE +# define DEBUG_MARKER() DebugMarker _debug_marker(*this, __func__); +# define PROFILE_MARKER(marker) DEBUG_MARKER() +# if DEBUG_MARKER_LEVEL & DEBUG_MARKER_PROFILE +# error PROFILING is exclusive; all other debug features must be disabled. +# endif #else # define DEBUG_MARKER() +# define PROFILE_MARKER(marker) #endif using namespace filament::math; @@ -69,7 +141,9 @@ using namespace utils; namespace filament::backend { Driver* OpenGLDriverFactory::create( - OpenGLPlatform* const platform, void* const sharedGLContext, const Platform::DriverConfig& driverConfig) noexcept { + OpenGLPlatform* const platform, + void* const sharedGLContext, + const Platform::DriverConfig& driverConfig) noexcept { return OpenGLDriver::create(platform, sharedGLContext, driverConfig); } @@ -86,34 +160,34 @@ Driver* OpenGLDriver::create(OpenGLPlatform* const platform, #if 0 // this is useful for development, but too verbose even for debug builds // For reference on a 64-bits machine in Release mode: - // GLFence : 8 few // GLIndexBuffer : 8 moderate - // GLSamplerGroup : 8 few - // -- less than or equal 16 bytes - // GLBufferObject : 24 many - // GLSync : 24 few - // GLTimerQuery : 32 few - // OpenGLProgram : 32 moderate - // GLRenderPrimitive : 48 many - // -- less than or equal 64 bytes - // GLTexture : 72 moderate + // GLSwapChain : 16 few + // GLTimerQuery : 16 few + // GLFence : 24 few + // GLRenderPrimitive : 32 many + // GLBufferObject : 32 many + // -- less than or equal 32 bytes + // GLTexture : 64 moderate + // GLVertexBuffer : 76 moderate + // OpenGLProgram : 96 moderate + // -- less than or equal 96 bytes + // GLStream : 104 few // GLRenderTarget : 112 few - // GLStream : 184 few - // GLVertexBuffer : 200 moderate - // -- less than or equal to 208 bytes + // GLVertexBufferInfo : 132 moderate + // -- less than or equal to 136 bytes slog.d - << "HwFence: " << sizeof(HwFence) + << "\nGLSwapChain: " << sizeof(GLSwapChain) << "\nGLBufferObject: " << sizeof(GLBufferObject) << "\nGLVertexBuffer: " << sizeof(GLVertexBuffer) + << "\nGLVertexBufferInfo: " << sizeof(GLVertexBufferInfo) << "\nGLIndexBuffer: " << sizeof(GLIndexBuffer) - << "\nGLSamplerGroup: " << sizeof(GLSamplerGroup) << "\nGLRenderPrimitive: " << sizeof(GLRenderPrimitive) << "\nGLTexture: " << sizeof(GLTexture) << "\nGLTimerQuery: " << sizeof(GLTimerQuery) << "\nGLStream: " << sizeof(GLStream) << "\nGLRenderTarget: " << sizeof(GLRenderTarget) - << "\nGLSync: " << sizeof(GLSync) + << "\nGLFence: " << sizeof(GLFence) << "\nOpenGLProgram: " << sizeof(OpenGLProgram) << io::endl; #endif @@ -129,23 +203,27 @@ Driver* OpenGLDriver::create(OpenGLPlatform* const platform, return {}; } - if constexpr (BACKEND_OPENGL_VERSION == BACKEND_OPENGL_VERSION_GLES) { - if (UTILS_UNLIKELY(!(major >= 3 && minor >= 0))) { - PANIC_LOG("OpenGL ES 3.0 minimum needed (current %d.%d)", major, minor); - goto cleanup; - } - } else if constexpr (BACKEND_OPENGL_VERSION == BACKEND_OPENGL_VERSION_GL) { - // we require GL 4.1 headers and minimum version - if (UTILS_UNLIKELY(!((major == 4 && minor >= 1) || major > 4))) { - PANIC_LOG("OpenGL 4.1 minimum needed (current %d.%d)", major, minor); - goto cleanup; - } +#if defined(BACKEND_OPENGL_VERSION_GLES) + if (UTILS_UNLIKELY(!(major >= 2 && minor >= 0))) { + PANIC_LOG("OpenGL ES 2.0 minimum needed (current %d.%d)", major, minor); + goto cleanup; + } + if (UTILS_UNLIKELY(driverConfig.forceGLES2Context)) { + major = 2; + minor = 0; + } +#else + // we require GL 4.1 headers and minimum version + if (UTILS_UNLIKELY(!((major == 4 && minor >= 1) || major > 4))) { + PANIC_LOG("OpenGL 4.1 minimum needed (current %d.%d)", major, minor); + goto cleanup; } +#endif size_t const defaultSize = FILAMENT_OPENGL_HANDLE_ARENA_SIZE_IN_MB * 1024U * 1024U; - Platform::DriverConfig const validConfig { - .handleArenaSize = std::max(driverConfig.handleArenaSize, defaultSize) }; - OpenGLDriver* const driver = new OpenGLDriver(ec, validConfig); + Platform::DriverConfig validConfig{ driverConfig }; + validConfig.handleArenaSize = std::max(driverConfig.handleArenaSize, defaultSize); + OpenGLDriver* const driver = new(std::nothrow) OpenGLDriver(ec, validConfig); return driver; } @@ -153,21 +231,50 @@ Driver* OpenGLDriver::create(OpenGLPlatform* const platform, OpenGLDriver::DebugMarker::DebugMarker(OpenGLDriver& driver, const char* string) noexcept : driver(driver) { - driver.pushGroupMarker(string, strlen(string)); +#ifndef __EMSCRIPTEN__ +#ifdef GL_EXT_debug_marker +#if DEBUG_MARKER_LEVEL & DEBUG_MARKER_OPENGL + if (UTILS_LIKELY(driver.getContext().ext.EXT_debug_marker)) { + glPushGroupMarkerEXT(GLsizei(strlen(string)), string); + } +#endif +#endif + +#if DEBUG_MARKER_LEVEL & DEBUG_MARKER_BACKEND + SYSTRACE_CONTEXT(); + SYSTRACE_NAME_BEGIN(string); +#endif +#endif } OpenGLDriver::DebugMarker::~DebugMarker() noexcept { - driver.popGroupMarker(); +#ifndef __EMSCRIPTEN__ +#ifdef GL_EXT_debug_marker +#if DEBUG_MARKER_LEVEL & DEBUG_MARKER_OPENGL + if (UTILS_LIKELY(driver.getContext().ext.EXT_debug_marker)) { + glPopGroupMarkerEXT(); + } +#endif +#endif + +#if DEBUG_MARKER_LEVEL & DEBUG_MARKER_BACKEND + SYSTRACE_CONTEXT(); + SYSTRACE_NAME_END(); +#endif +#endif } // ------------------------------------------------------------------------------------------------ OpenGLDriver::OpenGLDriver(OpenGLPlatform* platform, const Platform::DriverConfig& driverConfig) noexcept - : mHandleAllocator("Handles", driverConfig.handleArenaSize), - mSamplerMap(32), - mPlatform(*platform) { - - std::fill(mSamplerBindings.begin(), mSamplerBindings.end(), nullptr); + : mPlatform(*platform), + mContext(mPlatform, driverConfig), + mShaderCompilerService(*this), + mHandleAllocator("Handles", + driverConfig.handleArenaSize, + driverConfig.disableHandleUseAfterFreeCheck), + mDriverConfig(driverConfig), + mCurrentPushConstants(new(std::nothrow) PushConstantBundle{}) { // set a reasonable default value for our stream array mTexturesWithStreamsAttached.reserve(8); @@ -177,32 +284,31 @@ OpenGLDriver::OpenGLDriver(OpenGLPlatform* platform, const Platform::DriverConfi slog.i << "OS version: " << mPlatform.getOSVersion() << io::endl; #endif - if (mContext.ext.EXT_disjoint_timer_query || - BACKEND_OPENGL_VERSION == BACKEND_OPENGL_VERSION_GL) { - // timer queries are available - if (mContext.bugs.dont_use_timer_query && mPlatform.canCreateFence()) { - // however, they don't work well, revert to using fences if we can. - mTimerQueryImpl = new OpenGLTimerQueryFence(mPlatform); - } else { - mTimerQueryImpl = new TimerQueryNative(mContext); - } - mFrameTimeSupported = true; - } else if (mPlatform.canCreateFence()) { - // no timer queries, but we can use fences - mTimerQueryImpl = new OpenGLTimerQueryFence(mPlatform); - mFrameTimeSupported = true; - } else { - // no queries, no fences -- that's a problem - mTimerQueryImpl = new TimerQueryFallback(); - mFrameTimeSupported = false; - } + // Timer queries are core in GL 3.3, otherwise we need EXT_disjoint_timer_query + // iOS headers don't define GL_EXT_disjoint_timer_query, so make absolutely sure + // we won't use it. + +#if defined(BACKEND_OPENGL_VERSION_GL) + assert_invariant(mContext.ext.EXT_disjoint_timer_query); +#endif + + mShaderCompilerService.init(); } OpenGLDriver::~OpenGLDriver() noexcept { // NOLINT(modernize-use-equals-default) + // this is called from the main thread. Can't call GL. } Dispatcher OpenGLDriver::getDispatcher() const noexcept { - return ConcreteDispatcher::make(); + auto dispatcher = ConcreteDispatcher::make(); + if (mContext.isES2()) { + dispatcher.draw2_ = +[](Driver& driver, CommandBase* base, intptr_t* next){ + using Cmd = COMMAND_TYPE(draw2); + OpenGLDriver& concreteDriver = static_cast(driver); + Cmd::execute(&OpenGLDriver::draw2GLES2, concreteDriver, base, next); + }; + } + return dispatcher; } // ------------------------------------------------------------------------------------------------ @@ -213,19 +319,28 @@ void OpenGLDriver::terminate() { // wait for the GPU to finish executing all commands glFinish(); + mShaderCompilerService.terminate(); + +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 // and make sure to execute all the GpuCommandCompleteOps callbacks executeGpuCommandsCompleteOps(); + // as well as the FrameCompleteOps callbacks + if (UTILS_UNLIKELY(!mFrameCompleteOps.empty())) { + for (auto&& op: mFrameCompleteOps) { + op(); + } + mFrameCompleteOps.clear(); + } + // because we called glFinish(), all callbacks should have been executed assert_invariant(mGpuCommandCompleteOps.empty()); +#endif - for (auto& item : mSamplerMap) { - mContext.unbindSampler(item.second); - glDeleteSamplers(1, &item.second); - } - mSamplerMap.clear(); + delete mCurrentPushConstants; + mCurrentPushConstants = nullptr; - delete mTimerQueryImpl; + mContext.terminate(); mPlatform.terminate(); } @@ -245,14 +360,76 @@ void OpenGLDriver::bindSampler(GLuint unit, GLuint sampler) noexcept { mContext.bindSampler(unit, sampler); } +void OpenGLDriver::setPushConstant(backend::ShaderStage stage, uint8_t index, + backend::PushConstantVariant value) { + assert_invariant(stage == ShaderStage::VERTEX || stage == ShaderStage::FRAGMENT); + +#if FILAMENT_ENABLE_MATDBG + if (UTILS_UNLIKELY(!mValidProgram)) { + return; + } +#endif + + utils::Slice> constants; + if (stage == ShaderStage::VERTEX) { + constants = mCurrentPushConstants->vertexConstants; + } else if (stage == ShaderStage::FRAGMENT) { + constants = mCurrentPushConstants->fragmentConstants; + } + + assert_invariant(index < constants.size()); + auto const& [location, type] = constants[index]; + + // This push constant wasn't found in the shader. It's ok to return without error-ing here. + if (location < 0) { + return; + } + + if (std::holds_alternative(value)) { + assert_invariant(type == ConstantType::BOOL); + bool const bval = std::get(value); + glUniform1i(location, bval ? 1 : 0); + } else if (std::holds_alternative(value)) { + assert_invariant(type == ConstantType::FLOAT); + float const fval = std::get(value); + glUniform1f(location, fval); + } else { + assert_invariant(type == ConstantType::INT); + int const ival = std::get(value); + glUniform1i(location, ival); + } +} + void OpenGLDriver::bindTexture(GLuint unit, GLTexture const* t) noexcept { assert_invariant(t != nullptr); - mContext.bindTexture(unit, t->gl.target, t->gl.id, t->gl.targetIndex); -} + mContext.bindTexture(unit, t->gl.target, t->gl.id, t->gl.external); +} + +bool OpenGLDriver::useProgram(OpenGLProgram* p) noexcept { + bool success = true; + if (mBoundProgram != p) { + // compile/link the program if needed and call glUseProgram + success = p->use(this, mContext); + assert_invariant(success == p->isValid()); + if (success) { + // TODO: we could even improve this if the program could tell us which of the descriptors + // bindings actually changed. In practice, it is likely that set 0 or 1 might not + // change often. + decltype(mInvalidDescriptorSetBindings) changed; + changed.setValue((1 << MAX_DESCRIPTOR_SET_COUNT) - 1); + mInvalidDescriptorSetBindings |= changed; + + mBoundProgram = p; + } + } + + if (UTILS_UNLIKELY(mContext.isES2() && success)) { + // Set the output colorspace for this program (linear or rec709). This is only relevant + // when mPlatform.isSRGBSwapChainSupported() is false (no need to check though). + p->setRec709ColorSpace(mRec709OutputColorspace); + } -void OpenGLDriver::useProgram(OpenGLProgram* p) noexcept { - // set-up textures and samplers in the proper TMUs (as specified in setSamplers) - p->use(this, mContext); + return success; } @@ -306,6 +483,14 @@ void OpenGLDriver::setRasterState(RasterState rs) noexcept { } else { gl.disable(GL_SAMPLE_ALPHA_TO_COVERAGE); } + + if (gl.ext.EXT_depth_clamp) { + if (rs.depthClamp) { + gl.enable(GL_DEPTH_CLAMP); + } else { + gl.disable(GL_DEPTH_CLAMP); + } + } } void OpenGLDriver::setStencilState(StencilState ss) noexcept { @@ -355,6 +540,10 @@ void OpenGLDriver::setStencilState(StencilState ss) noexcept { // Creating driver objects // ------------------------------------------------------------------------------------------------ +Handle OpenGLDriver::createVertexBufferInfoS() noexcept { + return initHandle(); +} + Handle OpenGLDriver::createVertexBufferS() noexcept { return initHandle(); } @@ -375,15 +564,23 @@ Handle OpenGLDriver::createProgramS() noexcept { return initHandle(); } -Handle OpenGLDriver::createSamplerGroupS() noexcept { - return initHandle(); +Handle OpenGLDriver::createTextureS() noexcept { + return initHandle(); } -Handle OpenGLDriver::createTextureS() noexcept { +Handle OpenGLDriver::createTextureViewS() noexcept { + return initHandle(); +} + +Handle OpenGLDriver::createTextureViewSwizzleS() noexcept { + return initHandle(); +} + +Handle OpenGLDriver::createTextureExternalImageS() noexcept { return initHandle(); } -Handle OpenGLDriver::createTextureSwizzledS() noexcept { +Handle OpenGLDriver::createTextureExternalImagePlaneS() noexcept { return initHandle(); } @@ -400,33 +597,44 @@ Handle OpenGLDriver::createRenderTargetS() noexcept { } Handle OpenGLDriver::createFenceS() noexcept { - return initHandle(); -} - -Handle OpenGLDriver::createSyncS() noexcept { - return initHandle(); + return initHandle(); } Handle OpenGLDriver::createSwapChainS() noexcept { - return initHandle(); + return initHandle(); } Handle OpenGLDriver::createSwapChainHeadlessS() noexcept { - return initHandle(); + return initHandle(); } Handle OpenGLDriver::createTimerQueryS() noexcept { return initHandle(); } -void OpenGLDriver::createVertexBufferR( - Handle vbh, +Handle OpenGLDriver::createDescriptorSetLayoutS() noexcept { + return initHandle(); +} + +Handle OpenGLDriver::createDescriptorSetS() noexcept { + return initHandle(); +} + +void OpenGLDriver::createVertexBufferInfoR( + Handle vbih, uint8_t bufferCount, uint8_t attributeCount, - uint32_t elementCount, AttributeArray attributes) { DEBUG_MARKER() - construct(vbh, bufferCount, attributeCount, elementCount, attributes); + construct(vbih, bufferCount, attributeCount, attributes); +} + +void OpenGLDriver::createVertexBufferR( + Handle vbh, + uint32_t vertexCount, + Handle vbih) { + DEBUG_MARKER() + construct(vbh, vertexCount, vbih); } void OpenGLDriver::createIndexBufferR( @@ -458,39 +666,50 @@ void OpenGLDriver::createBufferObjectR(Handle boh, } GLBufferObject* bo = construct(boh, byteCount, bindingType, usage); - glGenBuffers(1, &bo->gl.id); - gl.bindBuffer(bo->gl.binding, bo->gl.id); - glBufferData(bo->gl.binding, byteCount, nullptr, getBufferUsage(usage)); + if (UTILS_UNLIKELY(bindingType == BufferObjectBinding::UNIFORM && gl.isES2())) { + bo->gl.id = ++mLastAssignedEmulatedUboId; + bo->gl.buffer = malloc(byteCount); + memset(bo->gl.buffer, 0, byteCount); + } else { + bo->gl.binding = GLUtils::getBufferBindingType(bindingType); + glGenBuffers(1, &bo->gl.id); + gl.bindBuffer(bo->gl.binding, bo->gl.id); + glBufferData(bo->gl.binding, byteCount, nullptr, getBufferUsage(usage)); + } + CHECK_GL_ERROR(utils::slog.e) } void OpenGLDriver::createRenderPrimitiveR(Handle rph, Handle vbh, Handle ibh, - PrimitiveType pt, uint32_t offset, - uint32_t minIndex, uint32_t maxIndex, uint32_t count) { + PrimitiveType pt) { DEBUG_MARKER() auto& gl = mContext; - GLVertexBuffer const* const eb = handle_cast(vbh); GLIndexBuffer const* const ib = handle_cast(ibh); assert_invariant(ib->elementSize == 2 || ib->elementSize == 4); - GLRenderPrimitive* rp = handle_cast(rph); - rp->gl.indicesSize = (ib->elementSize == 4u) ? 4u : 2u; + GLVertexBuffer* const vb = handle_cast(vbh); + GLRenderPrimitive* const rp = handle_cast(rph); + rp->gl.indicesShift = (ib->elementSize == 4u) ? 2u : 1u; + rp->gl.indicesType = (ib->elementSize == 4u) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT; rp->gl.vertexBufferWithObjects = vbh; rp->type = pt; - rp->offset = offset * rp->gl.indicesSize; - rp->count = count; - rp->minIndex = minIndex; - rp->maxIndex = maxIndex > minIndex ? maxIndex : rp->maxVertexCount - 1; // sanitize max index + rp->vbih = vb->vbih; + + // create a name for this VAO in the current context + gl.procs.genVertexArrays(1, &rp->gl.vao[gl.contextIndex]); - glGenVertexArrays(1, &rp->gl.vao); + // this implies our name is up-to-date + rp->gl.nameVersion = gl.state.age; + // binding the VAO will actually create it gl.bindVertexArray(&rp->gl); - // update the VBO bindings in the VAO - updateVertexArrayObject(rp, eb); + // Note: we don't update the vertex buffer bindings in the VAO just yet, we will do that + // later in draw() or bindRenderPrimitive(). At this point, the HwVertexBuffer might not + // have all its buffers set. // this records the index buffer into the currently bound VAO gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, ib->gl.buffer); @@ -501,59 +720,123 @@ void OpenGLDriver::createRenderPrimitiveR(Handle rph, void OpenGLDriver::createProgramR(Handle ph, Program&& program) { DEBUG_MARKER() - construct(ph, *this, std::move(program)); - CHECK_GL_ERROR(utils::slog.e) -} -void OpenGLDriver::createSamplerGroupR(Handle sbh, uint32_t size) { - DEBUG_MARKER() + if (UTILS_UNLIKELY(mContext.isES2())) { + // Here we patch the specialization constants to enable or not the rec709 output + // color space emulation in this program. Obviously, the backend shouldn't know about + // specific spec-constants, so we need to handle failures gracefully. This cannot be + // done at Material creation time because only the backend has access to + // Platform.isSRGBSwapChainSupported(). + if (!mPlatform.isSRGBSwapChainSupported()) { + auto& specializationConstants = program.getSpecializationConstants(); + auto pos = std::find_if(specializationConstants.begin(), specializationConstants.end(), + [](auto&& sc) { + // This constant must match + // ReservedSpecializationConstants::CONFIG_SRGB_SWAPCHAIN_EMULATION + // which we can't use here because it's defined in EngineEnums.h. + // (we're breaking layering here, but it's for the good cause). + return sc.id == 3; + }); + if (pos != specializationConstants.end()) { + pos->value = true; + } + } + } - construct(sbh, size); + construct(ph, *this, std::move(program)); + CHECK_GL_ERROR(utils::slog.e) } UTILS_NOINLINE void OpenGLDriver::textureStorage(OpenGLDriver::GLTexture* t, - uint32_t width, uint32_t height, uint32_t depth) noexcept { + uint32_t width, uint32_t height, uint32_t depth, bool useProtectedMemory) noexcept { auto& gl = mContext; bindTexture(OpenGLContext::DUMMY_TEXTURE_BINDING, t); gl.activeTexture(OpenGLContext::DUMMY_TEXTURE_BINDING); +#ifdef GL_EXT_protected_textures +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + if (UTILS_UNLIKELY(useProtectedMemory)) { + assert_invariant(gl.ext.EXT_protected_textures); + glTexParameteri(t->gl.target, GL_TEXTURE_PROTECTED_EXT, 1); + } +#endif +#endif + switch (t->gl.target) { case GL_TEXTURE_2D: case GL_TEXTURE_CUBE_MAP: - glTexStorage2D(t->gl.target, GLsizei(t->levels), t->gl.internalFormat, - GLsizei(width), GLsizei(height)); + if (UTILS_LIKELY(!gl.isES2())) { +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + glTexStorage2D(t->gl.target, GLsizei(t->levels), t->gl.internalFormat, + GLsizei(width), GLsizei(height)); +#endif + } +#ifdef BACKEND_OPENGL_VERSION_GLES + else { + // FIXME: handle compressed texture format + auto [format, type] = textureFormatToFormatAndType(t->format); + assert_invariant(format != GL_NONE && type != GL_NONE); + for (GLint level = 0 ; level < t->levels ; level++ ) { + if (t->gl.target == GL_TEXTURE_CUBE_MAP) { + for (GLint face = 0 ; face < 6 ; face++) { + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, + level, GLint(t->gl.internalFormat), + GLsizei(width), GLsizei(height), 0, + format, type, nullptr); + } + } else { + glTexImage2D(t->gl.target, level, GLint(t->gl.internalFormat), + std::max(GLsizei(1), GLsizei(width >> level)), + std::max(GLsizei(1), GLsizei(height >> level)), + 0, format, type, nullptr); + } + } + } +#endif break; case GL_TEXTURE_3D: case GL_TEXTURE_2D_ARRAY: { + assert_invariant(!gl.isES2()); +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 glTexStorage3D(t->gl.target, GLsizei(t->levels), t->gl.internalFormat, GLsizei(width), GLsizei(height), GLsizei(depth)); +#endif break; } case GL_TEXTURE_CUBE_MAP_ARRAY: { + assert_invariant(!gl.isES2()); +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 glTexStorage3D(t->gl.target, GLsizei(t->levels), t->gl.internalFormat, GLsizei(width), GLsizei(height), GLsizei(depth) * 6); +#endif break; } +#ifdef BACKEND_OPENGL_LEVEL_GLES31 case GL_TEXTURE_2D_MULTISAMPLE: if constexpr (TEXTURE_2D_MULTISAMPLE_SUPPORTED) { // NOTE: if there is a mix of texture and renderbuffers, "fixed_sample_locations" must be true // NOTE: what's the benefit of setting "fixed_sample_locations" to false? -#if BACKEND_OPENGL_LEVEL >= BACKEND_OPENGL_LEVEL_GLES31 - // only supported from GL 4.3 and GLES 3.1 headers - glTexStorage2DMultisample(t->gl.target, t->samples, t->gl.internalFormat, - GLsizei(width), GLsizei(height), GL_TRUE); -#elif defined(GL_VERSION_4_1) - // only supported in GL (GL4.1 doesn't support glTexStorage2DMultisample) - glTexImage2DMultisample(t->gl.target, t->samples, t->gl.internalFormat, - GLsizei(width), GLsizei(height), GL_TRUE); + + if (mContext.isAtLeastGL<4, 3>() || mContext.isAtLeastGLES<3, 1>()) { + // only supported from GL 4.3 and GLES 3.1 headers + glTexStorage2DMultisample(t->gl.target, t->samples, t->gl.internalFormat, + GLsizei(width), GLsizei(height), GL_TRUE); + } +#ifdef BACKEND_OPENGL_VERSION_GL + else { + // only supported in GL (GL4.1 doesn't support glTexStorage2DMultisample) + glTexImage2DMultisample(t->gl.target, t->samples, t->gl.internalFormat, + GLsizei(width), GLsizei(height), GL_TRUE); + } #endif } else { PANIC_LOG("GL_TEXTURE_2D_MULTISAMPLE is not supported"); } break; +#endif // BACKEND_OPENGL_LEVEL_GLES31 default: // cannot happen break; } @@ -569,112 +852,251 @@ void OpenGLDriver::createTextureR(Handle th, SamplerType target, uint TextureUsage usage) { DEBUG_MARKER() + GLenum internalFormat = getInternalFormat(format); + assert_invariant(internalFormat); + + if (any(usage & TextureUsage::PROTECTED)) { + // renderbuffers don't have a protected mode, so we need to use a texture + // because protected textures are only supported on GLES 3.2, MSAA will be available. + usage |= TextureUsage::SAMPLEABLE; + } else if (any(usage & TextureUsage::UPLOADABLE)) { + // if we have the uploadable flag, we also need to use a texture + usage |= TextureUsage::SAMPLEABLE; + } else if (target != SamplerType::SAMPLER_2D) { + // renderbuffers can only be 2D + usage |= TextureUsage::SAMPLEABLE; + } else if (levels > 1) { + // renderbuffers can't have mip levels + usage |= TextureUsage::SAMPLEABLE; + } + auto& gl = mContext; samples = std::clamp(samples, uint8_t(1u), uint8_t(gl.gets.max_samples)); GLTexture* t = construct(th, target, levels, samples, w, h, depth, format, usage); if (UTILS_LIKELY(usage & TextureUsage::SAMPLEABLE)) { + + if (UTILS_UNLIKELY(gl.isES2())) { + // on ES2, format and internal format must match + // FIXME: handle compressed texture format + internalFormat = textureFormatToFormatAndType(format).first; + } + if (UTILS_UNLIKELY(t->target == SamplerType::SAMPLER_EXTERNAL)) { t->externalTexture = mPlatform.createExternalImageTexture(); if (t->externalTexture) { t->gl.target = t->externalTexture->target; t->gl.id = t->externalTexture->id; - t->gl.targetIndex = (uint8_t)OpenGLContext::getIndexForTextureTarget(t->gl.target); // internalFormat actually depends on the external image, but it doesn't matter // because it's not used anywhere for anything important. - t->gl.internalFormat = getInternalFormat(format); + t->gl.internalFormat = internalFormat; t->gl.baseLevel = 0; t->gl.maxLevel = 0; } } else { glGenTextures(1, &t->gl.id); - t->gl.internalFormat = getInternalFormat(format); - assert_invariant(t->gl.internalFormat); + t->gl.internalFormat = internalFormat; - // We DO NOT update targetIndex at function exit to take advantage of the fact that - // getIndexForTextureTarget() is constexpr -- so all of this disappears at compile time. switch (target) { case SamplerType::SAMPLER_EXTERNAL: // we can't be here -- doesn't matter what we do case SamplerType::SAMPLER_2D: t->gl.target = GL_TEXTURE_2D; - t->gl.targetIndex = (uint8_t)gl.getIndexForTextureTarget(GL_TEXTURE_2D); break; case SamplerType::SAMPLER_3D: t->gl.target = GL_TEXTURE_3D; - t->gl.targetIndex = (uint8_t)gl.getIndexForTextureTarget(GL_TEXTURE_3D); break; case SamplerType::SAMPLER_2D_ARRAY: t->gl.target = GL_TEXTURE_2D_ARRAY; - t->gl.targetIndex = (uint8_t)gl.getIndexForTextureTarget(GL_TEXTURE_2D_ARRAY); break; case SamplerType::SAMPLER_CUBEMAP: t->gl.target = GL_TEXTURE_CUBE_MAP; - t->gl.targetIndex = (uint8_t)gl.getIndexForTextureTarget(GL_TEXTURE_CUBE_MAP); break; case SamplerType::SAMPLER_CUBEMAP_ARRAY: t->gl.target = GL_TEXTURE_CUBE_MAP_ARRAY; - t->gl.targetIndex = (uint8_t)gl.getIndexForTextureTarget(GL_TEXTURE_CUBE_MAP_ARRAY); break; } if (t->samples > 1) { // Note: we can't be here in practice because filament's user API doesn't // allow the creation of multi-sampled textures. +#if defined(BACKEND_OPENGL_LEVEL_GLES31) if (gl.features.multisample_texture) { // multi-sample texture on GL 3.2 / GLES 3.1 and above t->gl.target = GL_TEXTURE_2D_MULTISAMPLE; - t->gl.targetIndex = (uint8_t) - gl.getIndexForTextureTarget(GL_TEXTURE_2D_MULTISAMPLE); } else { // Turn off multi-sampling for that texture. It's just not supported. } +#endif } - textureStorage(t, w, h, depth); + + textureStorage(t, w, h, depth, bool(usage & TextureUsage::PROTECTED)); } } else { - assert_invariant(any(usage & ( - TextureUsage::COLOR_ATTACHMENT | - TextureUsage::DEPTH_ATTACHMENT | - TextureUsage::STENCIL_ATTACHMENT))); - assert_invariant(levels == 1); - assert_invariant(target == SamplerType::SAMPLER_2D); - t->gl.internalFormat = getInternalFormat(format); + t->gl.internalFormat = internalFormat; t->gl.target = GL_RENDERBUFFER; glGenRenderbuffers(1, &t->gl.id); - renderBufferStorage(t->gl.id, t->gl.internalFormat, w, h, samples); + renderBufferStorage(t->gl.id, internalFormat, w, h, samples); } CHECK_GL_ERROR(utils::slog.e) } -void OpenGLDriver::createTextureSwizzledR(Handle th, - SamplerType target, uint8_t levels, TextureFormat format, uint8_t samples, - uint32_t w, uint32_t h, uint32_t depth, TextureUsage usage, - TextureSwizzle r, TextureSwizzle g, TextureSwizzle b, TextureSwizzle a) { +void OpenGLDriver::createTextureViewR(Handle th, + Handle srch, uint8_t baseLevel, uint8_t levelCount) { DEBUG_MARKER() + GLTexture const* const src = handle_cast(srch); - assert_invariant(uint8_t(usage) & uint8_t(TextureUsage::SAMPLEABLE)); + FILAMENT_CHECK_PRECONDITION(any(src->usage & TextureUsage::SAMPLEABLE)) + << "TextureView can only be created on a SAMPLEABLE texture"; - createTextureR(th, target, levels, format, samples, w, h, depth, usage); + FILAMENT_CHECK_PRECONDITION(!src->gl.imported) + << "TextureView can't be created on imported textures"; - // WebGL does not support swizzling. We assert for this in the Texture builder, - // so it is probably fine to silently ignore the swizzle state here. -#if !defined(__EMSCRIPTEN__) + if (!src->ref) { + // lazily create the ref handle, because most textures will never get a texture view + src->ref = initHandle(); + } - // the texture is still bound and active from createTextureR - GLTexture* t = handle_cast(th); + GLTexture* t = construct(th, + src->target, + src->levels, + src->samples, + src->width, src->height, src->depth, + src->format, + src->usage); - glTexParameteri(t->gl.target, GL_TEXTURE_SWIZZLE_R, (GLint)getSwizzleChannel(r)); - glTexParameteri(t->gl.target, GL_TEXTURE_SWIZZLE_G, (GLint)getSwizzleChannel(g)); - glTexParameteri(t->gl.target, GL_TEXTURE_SWIZZLE_B, (GLint)getSwizzleChannel(b)); - glTexParameteri(t->gl.target, GL_TEXTURE_SWIZZLE_A, (GLint)getSwizzleChannel(a)); + t->gl = src->gl; + t->gl.sidecarRenderBufferMS = 0; + t->gl.sidecarSamples = 1; -#endif + auto srcBaseLevel = src->gl.baseLevel; + auto srcMaxLevel = src->gl.maxLevel; + if (srcBaseLevel > srcMaxLevel) { + srcBaseLevel = 0; + srcMaxLevel = 127; + } + t->gl.baseLevel = (int8_t)std::min(127, srcBaseLevel + baseLevel); + t->gl.maxLevel = (int8_t)std::min(127, srcBaseLevel + baseLevel + levelCount - 1); + + // increase reference count to this texture handle + t->ref = src->ref; + GLTextureRef* ref = handle_cast(t->ref); + assert_invariant(ref); + ref->count++; + + CHECK_GL_ERROR(utils::slog.e) +} + +void OpenGLDriver::createTextureViewSwizzleR(Handle th, Handle srch, + backend::TextureSwizzle r, backend::TextureSwizzle g, backend::TextureSwizzle b, + backend::TextureSwizzle a) { + + DEBUG_MARKER() + GLTexture const* const src = handle_cast(srch); + + FILAMENT_CHECK_PRECONDITION(any(src->usage & TextureUsage::SAMPLEABLE)) + << "TextureView can only be created on a SAMPLEABLE texture"; + + FILAMENT_CHECK_PRECONDITION(!src->gl.imported) + << "TextureView can't be created on imported textures"; + + if (!src->ref) { + // lazily create the ref handle, because most textures will never get a texture view + src->ref = initHandle(); + } + + GLTexture* t = construct(th, + src->target, + src->levels, + src->samples, + src->width, src->height, src->depth, + src->format, + src->usage); + + t->gl = src->gl; + t->gl.baseLevel = src->gl.baseLevel; + t->gl.maxLevel = src->gl.maxLevel; + t->gl.sidecarRenderBufferMS = 0; + t->gl.sidecarSamples = 1; + + auto getChannel = [&swizzle = src->gl.swizzle](TextureSwizzle ch) { + switch (ch) { + case TextureSwizzle::SUBSTITUTE_ZERO: + case TextureSwizzle::SUBSTITUTE_ONE: + return ch; + case TextureSwizzle::CHANNEL_0: + return swizzle[0]; + case TextureSwizzle::CHANNEL_1: + return swizzle[1]; + case TextureSwizzle::CHANNEL_2: + return swizzle[2]; + case TextureSwizzle::CHANNEL_3: + return swizzle[3]; + } + }; + + t->gl.swizzle = { + getChannel(r), + getChannel(g), + getChannel(b), + getChannel(a), + }; + + // increase reference count to this texture handle + t->ref = src->ref; + GLTextureRef* ref = handle_cast(t->ref); + assert_invariant(ref); + ref->count++; CHECK_GL_ERROR(utils::slog.e) } +void OpenGLDriver::createTextureExternalImageR(Handle th, SamplerType target, + TextureFormat format, uint32_t width, uint32_t height, TextureUsage usage, void* image) { + DEBUG_MARKER() + + usage |= TextureUsage::SAMPLEABLE; + usage &= ~TextureUsage::UPLOADABLE; + + auto& gl = mContext; + GLenum internalFormat = getInternalFormat(format); + if (UTILS_UNLIKELY(gl.isES2())) { + // on ES2, format and internal format must match + // FIXME: handle compressed texture format + internalFormat = textureFormatToFormatAndType(format).first; + } + assert_invariant(internalFormat); + + GLTexture* const t = construct(th, target, 1, 1, width, height, 1, format, usage); + assert_invariant(t); + + t->externalTexture = mPlatform.createExternalImageTexture(); + if (t->externalTexture) { + t->gl.target = t->externalTexture->target; + t->gl.id = t->externalTexture->id; + // internalFormat actually depends on the external image, but it doesn't matter + // because it's not used anywhere for anything important. + t->gl.internalFormat = internalFormat; + t->gl.baseLevel = 0; + t->gl.maxLevel = 0; + t->gl.external = true; // forces bindTexture() call (they're never cached) + } + + bindTexture(OpenGLContext::DUMMY_TEXTURE_BINDING, t); + if (mPlatform.setExternalImage(image, t->externalTexture)) { + // the target and id can be reset each time + t->gl.target = t->externalTexture->target; + t->gl.id = t->externalTexture->id; + } +} + +void OpenGLDriver::createTextureExternalImagePlaneR(Handle th, + backend::TextureFormat format, uint32_t width, uint32_t height, backend::TextureUsage usage, + void* image, uint32_t plane) { + // not relevant for the OpenGL backend +} + void OpenGLDriver::importTextureR(Handle th, intptr_t id, SamplerType target, uint8_t levels, TextureFormat format, uint8_t samples, uint32_t w, uint32_t h, uint32_t depth, TextureUsage usage) { @@ -689,107 +1111,133 @@ void OpenGLDriver::importTextureR(Handle th, intptr_t id, t->gl.internalFormat = getInternalFormat(format); assert_invariant(t->gl.internalFormat); - // We DO NOT update targetIndex at function exit to take advantage of the fact that - // getIndexForTextureTarget() is constexpr -- so all of this disappears at compile time. switch (target) { case SamplerType::SAMPLER_EXTERNAL: t->gl.target = GL_TEXTURE_EXTERNAL_OES; - t->gl.targetIndex = (uint8_t)gl.getIndexForTextureTarget(GL_TEXTURE_EXTERNAL_OES); + t->gl.external = true; // forces bindTexture() call (they're never cached) break; case SamplerType::SAMPLER_2D: t->gl.target = GL_TEXTURE_2D; - t->gl.targetIndex = (uint8_t)gl.getIndexForTextureTarget(GL_TEXTURE_2D); break; case SamplerType::SAMPLER_3D: t->gl.target = GL_TEXTURE_3D; - t->gl.targetIndex = (uint8_t)gl.getIndexForTextureTarget(GL_TEXTURE_3D); break; case SamplerType::SAMPLER_2D_ARRAY: t->gl.target = GL_TEXTURE_2D_ARRAY; - t->gl.targetIndex = (uint8_t)gl.getIndexForTextureTarget(GL_TEXTURE_2D_ARRAY); break; case SamplerType::SAMPLER_CUBEMAP: t->gl.target = GL_TEXTURE_CUBE_MAP; - t->gl.targetIndex = (uint8_t)gl.getIndexForTextureTarget(GL_TEXTURE_CUBE_MAP); break; case SamplerType::SAMPLER_CUBEMAP_ARRAY: t->gl.target = GL_TEXTURE_CUBE_MAP_ARRAY; - t->gl.targetIndex = (uint8_t)gl.getIndexForTextureTarget(GL_TEXTURE_CUBE_MAP_ARRAY); break; } if (t->samples > 1) { // Note: we can't be here in practice because filament's user API doesn't // allow the creation of multi-sampled textures. +#if defined(BACKEND_OPENGL_LEVEL_GLES31) if (gl.features.multisample_texture) { // multi-sample texture on GL 3.2 / GLES 3.1 and above t->gl.target = GL_TEXTURE_2D_MULTISAMPLE; - t->gl.targetIndex = (uint8_t)gl.getIndexForTextureTarget(GL_TEXTURE_2D_MULTISAMPLE); } else { // Turn off multi-sampling for that texture. It's just not supported. } +#endif } CHECK_GL_ERROR(utils::slog.e) } void OpenGLDriver::updateVertexArrayObject(GLRenderPrimitive* rp, GLVertexBuffer const* vb) { + // NOTE: this is called often and must be as efficient as possible. auto& gl = mContext; - // NOTE: this is called from draw() and must be as efficient as possible. +#ifndef NDEBUG + if (UTILS_LIKELY(gl.ext.OES_vertex_array_object)) { + // The VAO for the given render primitive must already be bound. + GLint vaoBinding; + glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &vaoBinding); + assert_invariant(vaoBinding == (GLint)rp->gl.vao[gl.contextIndex]); + } +#endif + + if (UTILS_LIKELY(rp->gl.vertexBufferVersion == vb->bufferObjectsVersion && + rp->gl.stateVersion == gl.state.age)) { + return; + } - // The VAO for the given render primitive must already be bound. - #ifndef NDEBUG - GLint vaoBinding; - glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &vaoBinding); - assert_invariant(vaoBinding == (GLint) rp->gl.vao); - #endif + GLVertexBufferInfo const* const vbi = handle_cast(vb->vbih); - rp->gl.vertexBufferVersion = vb->bufferObjectsVersion; - rp->maxVertexCount = vb->vertexCount; - for (size_t i = 0, n = vb->attributes.size(); i < n; i++) { - const auto& attribute = vb->attributes[i]; + for (size_t i = 0, n = vbi->attributes.size(); i < n; i++) { + const auto& attribute = vbi->attributes[i]; const uint8_t bi = attribute.buffer; + if (bi != Attribute::BUFFER_UNUSED) { + // if a buffer is defined it must not be invalid. + assert_invariant(vb->gl.buffers[bi]); + + // if we're on ES2, the user shouldn't use FLAG_INTEGER_TARGET + assert_invariant(!(gl.isES2() && (attribute.flags & Attribute::FLAG_INTEGER_TARGET))); - // Invoking glVertexAttribPointer without a bound VBO is an invalid operation, so we must - // take care to avoid it. This can occur when VertexBuffer is only partially populated with - // BufferObject items. - if (bi != Attribute::BUFFER_UNUSED && UTILS_LIKELY(vb->gl.buffers[bi] != 0)) { gl.bindBuffer(GL_ARRAY_BUFFER, vb->gl.buffers[bi]); + GLuint const index = i; + GLint const size = (GLint)getComponentCount(attribute.type); + GLenum const type = getComponentType(attribute.type); + GLboolean const normalized = getNormalization(attribute.flags & Attribute::FLAG_NORMALIZED); + GLsizei const stride = attribute.stride; + void const* pointer = reinterpret_cast(attribute.offset); + +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 if (UTILS_UNLIKELY(attribute.flags & Attribute::FLAG_INTEGER_TARGET)) { - glVertexAttribIPointer(GLuint(i), - (GLint)getComponentCount(attribute.type), - getComponentType(attribute.type), - attribute.stride, - (void*) uintptr_t(attribute.offset)); - } else { - glVertexAttribPointer(GLuint(i), - (GLint)getComponentCount(attribute.type), - getComponentType(attribute.type), - getNormalization(attribute.flags & Attribute::FLAG_NORMALIZED), - attribute.stride, - (void*) uintptr_t(attribute.offset)); + // integer attributes can't be floats + assert_invariant(type == GL_BYTE || type == GL_UNSIGNED_BYTE || type == GL_SHORT || + type == GL_UNSIGNED_SHORT || type == GL_INT || type == GL_UNSIGNED_INT); + glVertexAttribIPointer(index, size, type, stride, pointer); + } else +#endif + { + glVertexAttribPointer(index, size, type, normalized, stride, pointer); } - gl.enableVertexAttribArray(GLuint(i)); + gl.enableVertexAttribArray(&rp->gl, GLuint(i)); } else { - // In some OpenGL implementations, we must supply a properly-typed placeholder for // every integer input that is declared in the vertex shader. + // Note that the corresponding doesn't have to be enabled and in fact won't be. If it + // was enabled, it would indicate a user-error (providing the wrong type of array). + // With a disabled array, the vertex shader gets the attribute from glVertexAttrib, + // and must have the proper intergerness. + // But at this point, we don't know what the shader requirements are, and so we must + // rely on the attribute. + +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 if (UTILS_UNLIKELY(attribute.flags & Attribute::FLAG_INTEGER_TARGET)) { - glVertexAttribI4ui(GLuint(i), 0, 0, 0, 0); - } else { + if (!gl.isES2()) { + // on ES2, we know the shader doesn't have integer attributes + glVertexAttribI4ui(GLuint(i), 0, 0, 0, 0); + } + } else +#endif + { glVertexAttrib4f(GLuint(i), 0, 0, 0, 0); } - gl.disableVertexAttribArray(GLuint(i)); + gl.disableVertexAttribArray(&rp->gl, GLuint(i)); } } + + rp->gl.stateVersion = gl.state.age; + if (UTILS_LIKELY(gl.ext.OES_vertex_array_object)) { + rp->gl.vertexBufferVersion = vb->bufferObjectsVersion; + } else { + // if we don't have OES_vertex_array_object, we never update the buffer version so + // that it's always reset in draw + } } void OpenGLDriver::framebufferTexture(TargetBufferInfo const& binfo, - GLRenderTarget const* rt, GLenum attachment) noexcept { + GLRenderTarget const* rt, GLenum attachment, uint8_t layerCount) noexcept { #if !defined(NDEBUG) // Only used by assert_invariant() checks below @@ -800,6 +1248,7 @@ void OpenGLDriver::framebufferTexture(TargetBufferInfo const& binfo, GLTexture* t = handle_cast(binfo.handle); + assert_invariant(t); assert_invariant(t->target != SamplerType::SAMPLER_EXTERNAL); assert_invariant(rt->width <= valueForLevel(binfo.level, t->width) && rt->height <= valueForLevel(binfo.level, t->height)); @@ -809,6 +1258,7 @@ void OpenGLDriver::framebufferTexture(TargetBufferInfo const& binfo, switch (attachment) { case GL_COLOR_ATTACHMENT0: +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 case GL_COLOR_ATTACHMENT1: case GL_COLOR_ATTACHMENT2: case GL_COLOR_ATTACHMENT3: @@ -816,7 +1266,12 @@ void OpenGLDriver::framebufferTexture(TargetBufferInfo const& binfo, case GL_COLOR_ATTACHMENT5: case GL_COLOR_ATTACHMENT6: case GL_COLOR_ATTACHMENT7: +#endif + assert_invariant((attachment != GL_COLOR_ATTACHMENT0 && !mContext.isES2()) + || attachment == GL_COLOR_ATTACHMENT0); + static_assert(MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT == 8); + resolveFlags = getTargetBufferFlagsAt(attachment - GL_COLOR_ATTACHMENT0); break; case GL_DEPTH_ATTACHMENT: @@ -825,22 +1280,34 @@ void OpenGLDriver::framebufferTexture(TargetBufferInfo const& binfo, case GL_STENCIL_ATTACHMENT: resolveFlags = TargetBufferFlags::STENCIL; break; +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 case GL_DEPTH_STENCIL_ATTACHMENT: + assert_invariant(!mContext.isES2()); resolveFlags = TargetBufferFlags::DEPTH; resolveFlags |= TargetBufferFlags::STENCIL; break; +#endif default: break; } - // depth/stencil attachment must match the rendertarget sample count - // this is because EXT_multisampled_render_to_texture doesn't guarantee depth/stencil - // is resolved. + // depth/stencil attachments must match the rendertarget sample count + // because EXT_multisampled_render_to_texture[2] doesn't resolve the depth/stencil + // buffers: + // for EXT_multisampled_render_to_texture + // "the contents of the multisample buffer become undefined" + // for EXT_multisampled_render_to_texture2 + // "the contents of the multisample buffer is discarded rather than resolved - + // equivalent to the application calling InvalidateFramebuffer for this attachment" UTILS_UNUSED bool attachmentTypeNotSupportedByMSRTT = false; switch (attachment) { +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + case GL_DEPTH_STENCIL_ATTACHMENT: + assert_invariant(!mContext.isES2()); + UTILS_FALLTHROUGH; +#endif case GL_DEPTH_ATTACHMENT: case GL_STENCIL_ATTACHMENT: - case GL_DEPTH_STENCIL_ATTACHMENT: attachmentTypeNotSupportedByMSRTT = rt->gl.samples != t->samples; break; default: @@ -853,6 +1320,7 @@ void OpenGLDriver::framebufferTexture(TargetBufferInfo const& binfo, if (any(t->usage & TextureUsage::SAMPLEABLE)) { switch (t->target) { case SamplerType::SAMPLER_2D: + case SamplerType::SAMPLER_3D: case SamplerType::SAMPLER_2D_ARRAY: case SamplerType::SAMPLER_CUBEMAP_ARRAY: // this could be GL_TEXTURE_2D_MULTISAMPLE or GL_TEXTURE_2D_ARRAY @@ -863,7 +1331,9 @@ void OpenGLDriver::framebufferTexture(TargetBufferInfo const& binfo, target = getCubemapTarget(binfo.layer); // note: cubemaps can't be multi-sampled break; - default: + case SamplerType::SAMPLER_EXTERNAL: + // This is an error. We have asserted in debug build. + target = t->gl.target; break; } } @@ -879,23 +1349,9 @@ void OpenGLDriver::framebufferTexture(TargetBufferInfo const& binfo, attachmentTypeNotSupportedByMSRTT = true; } - // There's a bug with certain drivers preventing us from emulating - // EXT_multisampled_render_to_texture when the texture is a TEXTURE_2D_ARRAY, so we'll simply - // fall back to non-MSAA rendering for now. Also, MSRTT is never available for TEXTURE_2D_ARRAY, - // and since we are a 2D array, we know we're sampleable and therefore that a resolve will - // be needed. - // Note that this affects VSM shadows in particular. - // TODO: a better workaround would be to do the resolve by hand in that case - const bool disableMultisampling = - gl.bugs.disable_sidecar_blit_into_texture_array && - rt->gl.samples > 1 && t->samples <= 1 && - (target == GL_TEXTURE_2D_ARRAY || - target == GL_TEXTURE_CUBE_MAP_ARRAY); // implies MSRTT is not available - if (rt->gl.samples <= 1 || - (rt->gl.samples > 1 && t->samples > 1 && gl.features.multisample_texture) || - disableMultisampling) { - // on GL3.2 / GLES3.1 and above multisample is handled when creating the texture. + (rt->gl.samples > 1 && t->samples > 1 && gl.features.multisample_texture)) { + // On GL3.2 / GLES3.1 and above multisample is handled when creating the texture. // If multisampled textures are not supported and we end-up here, things should // still work, albeit without MSAA. gl.bindFramebuffer(GL_FRAMEBUFFER, rt->gl.fbo); @@ -907,7 +1363,9 @@ void OpenGLDriver::framebufferTexture(TargetBufferInfo const& binfo, case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: case GL_TEXTURE_2D: +#if defined(BACKEND_OPENGL_LEVEL_GLES31) case GL_TEXTURE_2D_MULTISAMPLE: +#endif if (any(t->usage & TextureUsage::SAMPLEABLE)) { glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, target, t->gl.id, binfo.level); @@ -917,11 +1375,25 @@ void OpenGLDriver::framebufferTexture(TargetBufferInfo const& binfo, GL_RENDERBUFFER, t->gl.id); } break; + case GL_TEXTURE_3D: case GL_TEXTURE_2D_ARRAY: case GL_TEXTURE_CUBE_MAP_ARRAY: - // GL_TEXTURE_2D_MULTISAMPLE_ARRAY is not supported in GLES - glFramebufferTextureLayer(GL_FRAMEBUFFER, attachment, +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + + // TODO: support multiview for iOS and WebGL +#if !defined(__EMSCRIPTEN__) && !defined(FILAMENT_IOS) + if (layerCount > 1) { + // if layerCount > 1, it means we use the multiview extension. + glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, attachment, + t->gl.id, 0, binfo.layer, layerCount); + } else +#endif // !defined(__EMSCRIPTEN__) && !defined(FILAMENT_IOS) + { + // GL_TEXTURE_2D_MULTISAMPLE_ARRAY is not supported in GLES + glFramebufferTextureLayer(GL_FRAMEBUFFER, attachment, t->gl.id, binfo.level, binfo.layer); + } +#endif break; default: // we shouldn't be here @@ -929,6 +1401,7 @@ void OpenGLDriver::framebufferTexture(TargetBufferInfo const& binfo, } CHECK_GL_ERROR(utils::slog.e) } else +#ifndef __EMSCRIPTEN__ #ifdef GL_EXT_multisampled_render_to_texture // EXT_multisampled_render_to_texture only support GL_COLOR_ATTACHMENT0 if (!attachmentTypeNotSupportedByMSRTT && (t->depth <= 1) @@ -941,7 +1414,7 @@ void OpenGLDriver::framebufferTexture(TargetBufferInfo const& binfo, // This extension only exists on OpenGL ES. gl.bindFramebuffer(GL_FRAMEBUFFER, rt->gl.fbo); if (any(t->usage & TextureUsage::SAMPLEABLE)) { - glext::glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, + glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, attachment, target, t->gl.id, binfo.level, rt->gl.samples); } else { glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment, @@ -949,7 +1422,8 @@ void OpenGLDriver::framebufferTexture(TargetBufferInfo const& binfo, } CHECK_GL_ERROR(utils::slog.e) } else -#endif +#endif // GL_EXT_multisampled_render_to_texture +#endif // __EMSCRIPTEN__ if (!any(t->usage & TextureUsage::SAMPLEABLE) && t->samples > 1) { assert_invariant(rt->gl.samples > 1); assert_invariant(glIsRenderbuffer(t->gl.id)); @@ -1015,10 +1489,13 @@ void OpenGLDriver::framebufferTexture(TargetBufferInfo const& binfo, GL_RENDERBUFFER, t->gl.id); } break; + case GL_TEXTURE_3D: case GL_TEXTURE_2D_ARRAY: case GL_TEXTURE_CUBE_MAP_ARRAY: +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 glFramebufferTextureLayer(GL_FRAMEBUFFER, attachment, t->gl.id, binfo.level, binfo.layer); +#endif break; default: // we shouldn't be here @@ -1030,14 +1507,6 @@ void OpenGLDriver::framebufferTexture(TargetBufferInfo const& binfo, rt->gl.resolve |= resolveFlags; - if (any(t->usage & TextureUsage::SAMPLEABLE)) { - // In a sense, drawing to a texture level is similar to calling setTextureData on it; in - // both cases, we update the base/max LOD to give shaders access to levels as they become - // available. Note that this can only expand the LOD range (never shrink it), and that - // users can override this range by calling setMinMaxLevels(). - updateTextureLodRange(t, (int8_t)binfo.level); - } - CHECK_GL_ERROR(utils::slog.e) CHECK_GL_FRAMEBUFFER_STATUS(utils::slog.e, GL_FRAMEBUFFER) } @@ -1046,6 +1515,7 @@ void OpenGLDriver::renderBufferStorage(GLuint rbo, GLenum internalformat, uint32 uint32_t height, uint8_t samples) const noexcept { glBindRenderbuffer(GL_RENDERBUFFER, rbo); if (samples > 1) { +#ifndef __EMSCRIPTEN__ #ifdef GL_EXT_multisampled_render_to_texture auto& gl = mContext; if (gl.ext.EXT_multisampled_render_to_texture || @@ -1053,10 +1523,13 @@ void OpenGLDriver::renderBufferStorage(GLuint rbo, GLenum internalformat, uint32 glext::glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, samples, internalformat, width, height); } else -#endif +#endif // GL_EXT_multisampled_render_to_texture +#endif // __EMSCRIPTEN__ { +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, internalformat, (GLsizei)width, (GLsizei)height); +#endif } } else { glRenderbufferStorage(GL_RENDERBUFFER, internalformat, (GLsizei)width, (GLsizei)height); @@ -1073,10 +1546,9 @@ void OpenGLDriver::createDefaultRenderTargetR( construct(rth, 0, 0); // FIXME: we don't know the width/height - uint32_t framebuffer = mPlatform.createDefaultRenderTarget(); - GLRenderTarget* rt = handle_cast(rth); - rt->gl.fbo = framebuffer; + rt->gl.isDefault = true; + rt->gl.fbo = 0; // the actual id is resolved at binding time rt->gl.samples = 1; // FIXME: these flags should reflect the actual attachments present rt->targets = TargetBufferFlags::COLOR0 | TargetBufferFlags::DEPTH; @@ -1087,6 +1559,7 @@ void OpenGLDriver::createRenderTargetR(Handle rth, uint32_t width, uint32_t height, uint8_t samples, + uint8_t layerCount, MRT color, TargetBufferInfo depth, TargetBufferInfo stencil) { @@ -1135,61 +1608,65 @@ void OpenGLDriver::createRenderTargetR(Handle rth, rt->gl.samples = samples; rt->targets = targets; - UTILS_UNUSED_IN_RELEASE math::vec2 tmin = {std::numeric_limits::max()}; - UTILS_UNUSED_IN_RELEASE math::vec2 tmax = {0}; + UTILS_UNUSED_IN_RELEASE math::vec2 tmin = { std::numeric_limits::max() }; + UTILS_UNUSED_IN_RELEASE math::vec2 tmax = { 0 }; + auto checkDimensions = [&tmin, &tmax](GLTexture* t, uint8_t level) { + const auto twidth = std::max(1u, t->width >> level); + const auto theight = std::max(1u, t->height >> level); + tmin = { std::min(tmin.x, twidth), std::min(tmin.y, theight) }; + tmax = { std::max(tmax.x, twidth), std::max(tmax.y, theight) }; + }; + +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 if (any(targets & TargetBufferFlags::COLOR_ALL)) { GLenum bufs[MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT] = { GL_NONE }; const size_t maxDrawBuffers = getMaxDrawBuffers(); for (size_t i = 0; i < maxDrawBuffers; i++) { if (any(targets & getTargetBufferFlagsAt(i))) { - auto t = rt->gl.color[i] = handle_cast(color[i].handle); - const auto twidth = std::max(1u, t->width >> color[i].level); - const auto theight = std::max(1u, t->height >> color[i].level); - tmin = { std::min(tmin.x, twidth), std::min(tmin.y, theight) }; - tmax = { std::max(tmax.x, twidth), std::max(tmax.y, theight) }; - framebufferTexture(color[i], rt, GL_COLOR_ATTACHMENT0 + i); + assert_invariant(color[i].handle); + rt->gl.color[i] = handle_cast(color[i].handle); + framebufferTexture(color[i], rt, GL_COLOR_ATTACHMENT0 + i, layerCount); bufs[i] = GL_COLOR_ATTACHMENT0 + i; + checkDimensions(rt->gl.color[i], color[i].level); } } - glDrawBuffers((GLsizei)maxDrawBuffers, bufs); + if (UTILS_LIKELY(!getContext().isES2())) { + glDrawBuffers((GLsizei)maxDrawBuffers, bufs); + } CHECK_GL_ERROR(utils::slog.e) } +#endif // handle special cases first (where depth/stencil are packed) bool specialCased = false; - if ((targets & TargetBufferFlags::DEPTH_AND_STENCIL) == TargetBufferFlags::DEPTH_AND_STENCIL) { - assert_invariant(!stencil.handle || stencil.handle == depth.handle); - auto t = rt->gl.depth = handle_cast(depth.handle); - const auto twidth = std::max(1u, t->width >> depth.level); - const auto theight = std::max(1u, t->height >> depth.level); - tmin = { std::min(tmin.x, twidth), std::min(tmin.y, theight) }; - tmax = { std::max(tmax.x, twidth), std::max(tmax.y, theight) }; - if (any(rt->gl.depth->usage & TextureUsage::SAMPLEABLE) || - (!depth.handle && !stencil.handle)) { - // special case: depth & stencil requested, and both provided as the same texture - // special case: depth & stencil requested, but both not provided + +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + if (!getContext().isES2() && + (targets & TargetBufferFlags::DEPTH_AND_STENCIL) == TargetBufferFlags::DEPTH_AND_STENCIL) { + assert_invariant(depth.handle); + // either we supplied only the depth handle or both depth/stencil are identical and not null + if (depth.handle && (stencil.handle == depth.handle || !stencil.handle)) { + rt->gl.depth = handle_cast(depth.handle); + framebufferTexture(depth, rt, GL_DEPTH_STENCIL_ATTACHMENT, layerCount); specialCased = true; - framebufferTexture(depth, rt, GL_DEPTH_STENCIL_ATTACHMENT); + checkDimensions(rt->gl.depth, depth.level); } } +#endif if (!specialCased) { if (any(targets & TargetBufferFlags::DEPTH)) { - auto t = rt->gl.depth = handle_cast(depth.handle); - const auto twidth = std::max(1u, t->width >> depth.level); - const auto theight = std::max(1u, t->height >> depth.level); - tmin = { std::min(tmin.x, twidth), std::min(tmin.y, theight) }; - tmax = { std::max(tmax.x, twidth), std::max(tmax.y, theight) }; - framebufferTexture(depth, rt, GL_DEPTH_ATTACHMENT); + assert_invariant(depth.handle); + rt->gl.depth = handle_cast(depth.handle); + framebufferTexture(depth, rt, GL_DEPTH_ATTACHMENT, layerCount); + checkDimensions(rt->gl.depth, depth.level); } if (any(targets & TargetBufferFlags::STENCIL)) { - auto t = rt->gl.stencil = handle_cast(stencil.handle); - const auto twidth = std::max(1u, t->width >> stencil.level); - const auto theight = std::max(1u, t->height >> stencil.level); - tmin = { std::min(tmin.x, twidth), std::min(tmin.y, theight) }; - tmax = { std::max(tmax.x, twidth), std::max(tmax.y, theight) }; - framebufferTexture(stencil, rt, GL_STENCIL_ATTACHMENT); + assert_invariant(stencil.handle); + rt->gl.stencil = handle_cast(stencil.handle); + framebufferTexture(stencil, rt, GL_STENCIL_ATTACHMENT, layerCount); + checkDimensions(rt->gl.stencil, stencil.level); } } @@ -1203,57 +1680,98 @@ void OpenGLDriver::createRenderTargetR(Handle rth, void OpenGLDriver::createFenceR(Handle fh, int) { DEBUG_MARKER() - HwFence* f = handle_cast(fh); - f->fence = mPlatform.createFence(); -} - -void OpenGLDriver::createSyncR(Handle fh, int) { - DEBUG_MARKER() - - GLSync* f = handle_cast(fh); - f->gl.sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); - CHECK_GL_ERROR(utils::slog.e) - - // check the status of the sync once a frame, since we must do this from our thread - std::weak_ptr const weak = f->result; - runEveryNowAndThen([sync = f->gl.sync, weak]() -> bool { - auto result = weak.lock(); - if (result) { - GLenum const status = glClientWaitSync(sync, 0, 0u); - result->status.store(status, std::memory_order_relaxed); - return (status != GL_TIMEOUT_EXPIRED); - } - return true; // we're done - }); + GLFence* f = handle_cast(fh); + + if (mPlatform.canCreateFence() || mContext.isES2()) { + assert_invariant(mPlatform.canCreateFence()); + f->fence = mPlatform.createFence(); + } +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + else { + std::weak_ptr const weak = f->state; + whenGpuCommandsComplete([weak](){ + auto state = weak.lock(); + if (state) { + std::lock_guard const lock(state->lock); + state->status = FenceStatus::CONDITION_SATISFIED; + state->cond.notify_all(); + } + }); + } +#endif } void OpenGLDriver::createSwapChainR(Handle sch, void* nativeWindow, uint64_t flags) { DEBUG_MARKER() - HwSwapChain* sc = handle_cast(sch); + GLSwapChain* sc = handle_cast(sch); sc->swapChain = mPlatform.createSwapChain(nativeWindow, flags); + +#if !defined(__EMSCRIPTEN__) + // note: in practice this should never happen on Android + FILAMENT_CHECK_POSTCONDITION(sc->swapChain) << "createSwapChain(" << nativeWindow << ", " + << flags << ") failed. See logs for details."; +#endif + + // See if we need the emulated rec709 output conversion + if (UTILS_UNLIKELY(mContext.isES2())) { + sc->rec709 = ((flags & SWAP_CHAIN_CONFIG_SRGB_COLORSPACE) && + !mPlatform.isSRGBSwapChainSupported()); + } } void OpenGLDriver::createSwapChainHeadlessR(Handle sch, uint32_t width, uint32_t height, uint64_t flags) { DEBUG_MARKER() - HwSwapChain* sc = handle_cast(sch); + GLSwapChain* sc = handle_cast(sch); sc->swapChain = mPlatform.createSwapChain(width, height, flags); + +#if !defined(__EMSCRIPTEN__) + // note: in practice this should never happen on Android + FILAMENT_CHECK_POSTCONDITION(sc->swapChain) + << "createSwapChainHeadless(" << width << ", " << height << ", " << flags + << ") failed. See logs for details."; +#endif + + // See if we need the emulated rec709 output conversion + if (UTILS_UNLIKELY(mContext.isES2())) { + sc->rec709 = (flags & SWAP_CHAIN_CONFIG_SRGB_COLORSPACE && + !mPlatform.isSRGBSwapChainSupported()); + } } void OpenGLDriver::createTimerQueryR(Handle tqh, int) { DEBUG_MARKER() - GLTimerQuery* tq = handle_cast(tqh); - glGenQueries(1u, &tq->gl.query); - CHECK_GL_ERROR(utils::slog.e) + mContext.createTimerQuery(tq); +} + +void OpenGLDriver::createDescriptorSetLayoutR(Handle dslh, + DescriptorSetLayout&& info) { + DEBUG_MARKER() + construct(dslh, std::move(info)); +} + +void OpenGLDriver::createDescriptorSetR(Handle dsh, + Handle dslh) { + DEBUG_MARKER() + GLDescriptorSetLayout const* dsl = handle_cast(dslh); + construct(dsh, mContext, dslh, dsl); } // ------------------------------------------------------------------------------------------------ // Destroying driver objects // ------------------------------------------------------------------------------------------------ +void OpenGLDriver::destroyVertexBufferInfo(Handle vbih) { + DEBUG_MARKER() + if (vbih) { + GLVertexBufferInfo const* vbi = handle_cast(vbih); + destruct(vbih, vbi); + } +} + void OpenGLDriver::destroyVertexBuffer(Handle vbh) { DEBUG_MARKER() if (vbh) { @@ -1268,7 +1786,7 @@ void OpenGLDriver::destroyIndexBuffer(Handle ibh) { if (ibh) { auto& gl = mContext; GLIndexBuffer const* ib = handle_cast(ibh); - gl.deleteBuffers(1, &ib->gl.buffer, GL_ELEMENT_ARRAY_BUFFER); + gl.deleteBuffer(ib->gl.buffer, GL_ELEMENT_ARRAY_BUFFER); destruct(ibh, ib); } } @@ -1278,7 +1796,11 @@ void OpenGLDriver::destroyBufferObject(Handle boh) { if (boh) { auto& gl = mContext; GLBufferObject const* bo = handle_cast(boh); - gl.deleteBuffers(1, &bo->gl.id, bo->gl.binding); + if (UTILS_UNLIKELY(bo->bindingType == BufferObjectBinding::UNIFORM && gl.isES2())) { + free(bo->gl.buffer); + } else { + gl.deleteBuffer(bo->gl.id, bo->gl.binding); + } destruct(boh, bo); } } @@ -1289,7 +1811,20 @@ void OpenGLDriver::destroyRenderPrimitive(Handle rph) { if (rph) { auto& gl = mContext; GLRenderPrimitive const* rp = handle_cast(rph); - gl.deleteVertexArrays(1, &rp->gl.vao); + gl.deleteVertexArray(rp->gl.vao[gl.contextIndex]); + + // If we have a name in the "other" context, we need to schedule the destroy for + // later, because it can't be done here. VAOs are "container objects" and are not + // shared between contexts. + size_t const otherContextIndex = 1 - gl.contextIndex; + GLuint const nameInOtherContext = rp->gl.vao[otherContextIndex]; + if (UTILS_UNLIKELY(nameInOtherContext)) { + gl.destroyWithContext(otherContextIndex, + [name = nameInOtherContext](OpenGLContext& gl) { + gl.deleteVertexArray(name); + }); + } + destruct(rph, rp); } } @@ -1298,46 +1833,55 @@ void OpenGLDriver::destroyProgram(Handle ph) { DEBUG_MARKER() if (ph) { OpenGLProgram* p = handle_cast(ph); - cancelRunAtNextPassOp(p); destruct(ph, p); } } -void OpenGLDriver::destroySamplerGroup(Handle sbh) { - DEBUG_MARKER() - if (sbh) { - GLSamplerGroup* sb = handle_cast(sbh); - destruct(sbh, sb); - } -} - void OpenGLDriver::destroyTexture(Handle th) { DEBUG_MARKER() if (th) { + auto& gl = mContext; GLTexture* t = handle_cast(th); + if (UTILS_LIKELY(!t->gl.imported)) { - auto& gl = mContext; if (UTILS_LIKELY(t->usage & TextureUsage::SAMPLEABLE)) { - gl.unbindTexture(t->gl.target, t->gl.id); - if (UTILS_UNLIKELY(t->hwStream)) { - detachStream(t); + // drop a reference + uint16_t count = 0; + if (UTILS_UNLIKELY(t->ref)) { + // the common case is that we don't have a ref handle + GLTextureRef* const ref = handle_cast(t->ref); + count = --(ref->count); + if (count == 0) { + destruct(t->ref, ref); + } } - if (UTILS_UNLIKELY(t->target == SamplerType::SAMPLER_EXTERNAL)) { - mPlatform.destroyExternalImage(t->externalTexture); + if (count == 0) { + // if this was the last reference, we destroy the refcount as well as + // the GL texture name itself. + gl.unbindTexture(t->gl.target, t->gl.id); + if (UTILS_UNLIKELY(t->hwStream)) { + detachStream(t); + } + if (UTILS_UNLIKELY(t->target == SamplerType::SAMPLER_EXTERNAL)) { + mPlatform.destroyExternalImage(t->externalTexture); + } else { + glDeleteTextures(1, &t->gl.id); + } } else { - glDeleteTextures(1, &t->gl.id); + // The Handle is always destroyed. For extra precaution we also + // check that the GLTexture has a trivial destructor. + static_assert(std::is_trivially_destructible_v); } } else { assert_invariant(t->gl.target == GL_RENDERBUFFER); glDeleteRenderbuffers(1, &t->gl.id); } - if (t->gl.fence) { - glDeleteSync(t->gl.fence); - } if (t->gl.sidecarRenderBufferMS) { glDeleteRenderbuffers(1, &t->gl.sidecarRenderBufferMS); } + } else { + gl.unbindTexture(t->gl.target, t->gl.id); } destruct(th, t); } @@ -1351,13 +1895,34 @@ void OpenGLDriver::destroyRenderTarget(Handle rth) { GLRenderTarget* rt = handle_cast(rth); if (rt->gl.fbo) { // first unbind this framebuffer if needed - gl.bindFramebuffer(GL_FRAMEBUFFER, 0); - glDeleteFramebuffers(1, &rt->gl.fbo); + gl.unbindFramebuffer(GL_FRAMEBUFFER); } if (rt->gl.fbo_read) { // first unbind this framebuffer if needed - gl.bindFramebuffer(GL_FRAMEBUFFER, 0); - glDeleteFramebuffers(1, &rt->gl.fbo_read); + gl.unbindFramebuffer(GL_FRAMEBUFFER); + } + +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + if (UTILS_UNLIKELY(gl.bugs.delay_fbo_destruction)) { + if (rt->gl.fbo) { + whenFrameComplete([fbo = rt->gl.fbo]() { + glDeleteFramebuffers(1, &fbo); + }); + } + if (rt->gl.fbo_read) { + whenFrameComplete([fbo_read = rt->gl.fbo_read]() { + glDeleteFramebuffers(1, &fbo_read); + }); + } + } else +#endif + { + if (rt->gl.fbo) { + glDeleteFramebuffers(1, &rt->gl.fbo); + } + if (rt->gl.fbo_read) { + glDeleteFramebuffers(1, &rt->gl.fbo_read); + } } destruct(rth, rt); } @@ -1367,7 +1932,7 @@ void OpenGLDriver::destroySwapChain(Handle sch) { DEBUG_MARKER() if (sch) { - HwSwapChain* sc = handle_cast(sch); + GLSwapChain* sc = handle_cast(sch); mPlatform.destroySwapChain(sc->swapChain); destruct(sch, sc); } @@ -1406,18 +1971,30 @@ void OpenGLDriver::destroyTimerQuery(Handle tqh) { if (tqh) { GLTimerQuery* tq = handle_cast(tqh); - glDeleteQueries(1u, &tq->gl.query); + mContext.destroyTimerQuery(tq); destruct(tqh, tq); } } -void OpenGLDriver::destroySync(Handle sh) { +void OpenGLDriver::destroyDescriptorSetLayout(Handle dslh) { DEBUG_MARKER() + if (dslh) { + GLDescriptorSetLayout* dsl = handle_cast(dslh); + destruct(dslh, dsl); + } +} - if (sh) { - GLSync* s = handle_cast(sh); - glDeleteSync(s->gl.sync); - destruct(sh, s); +void OpenGLDriver::destroyDescriptorSet(Handle dsh) { + DEBUG_MARKER() + if (dsh) { + // unbind the descriptor-set, to avoid use-after-free + for (auto& bound : mBoundDescriptorSets) { + if (bound.dsh == dsh) { + bound = {}; + } + } + GLDescriptorSet* ds = handle_cast(dsh); + destruct(dsh, ds); } } @@ -1491,7 +2068,6 @@ void OpenGLDriver::updateStreams(DriverApi* driver) { // the target and id can be reset each time t->gl.target = t->externalTexture->target; t->gl.id = t->externalTexture->id; - t->gl.targetIndex = (uint8_t)OpenGLContext::getIndexForTextureTarget(t->gl.target); bindTexture(OpenGLContext::DUMMY_TEXTURE_BINDING, t); } } @@ -1523,24 +2099,39 @@ int64_t OpenGLDriver::getStreamTimestamp(Handle sh) { void OpenGLDriver::destroyFence(Handle fh) { if (fh) { - HwFence* f = handle_cast(fh); - mPlatform.destroyFence(f->fence); + GLFence* f = handle_cast(fh); + if (mPlatform.canCreateFence() || mContext.isES2()) { + mPlatform.destroyFence(f->fence); + } destruct(fh, f); } } -FenceStatus OpenGLDriver::wait(Handle fh, uint64_t timeout) { +FenceStatus OpenGLDriver::getFenceStatus(Handle fh) { if (fh) { - HwFence* f = handle_cast(fh); - if (f->fence == nullptr) { - // we can end-up here if: - // - the platform doesn't support h/w fences - // - wait() was called before the fence was asynchronously created. - // This case is not handled in OpenGLDriver but is handled by FFence. - // TODO: move FFence logic into the backend. - return FenceStatus::ERROR; + GLFence* f = handle_cast(fh); + if (mPlatform.canCreateFence() || mContext.isES2()) { + if (f->fence == nullptr) { + // we can end-up here if: + // - the platform doesn't support h/w fences + if (UTILS_UNLIKELY(!mPlatform.canCreateFence())) { + return FenceStatus::ERROR; + } + // - wait() was called before the fence was asynchronously created. + return FenceStatus::TIMEOUT_EXPIRED; + } + return mPlatform.waitFence(f->fence, 0); + } +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + else { + assert_invariant(f->state); + std::unique_lock lock(f->state->lock); + f->state->cond.wait_for(lock, std::chrono::nanoseconds(0), [&state = f->state]() { + return state->status != FenceStatus::TIMEOUT_EXPIRED; + }); + return f->state->status; } - return mPlatform.waitFence(f->fence, timeout); +#endif } return FenceStatus::ERROR; } @@ -1570,6 +2161,9 @@ bool OpenGLDriver::isTextureFormatSupported(TextureFormat format) { if (isASTCCompression(format)) { return ext.KHR_texture_compression_astc_hdr; } + if (mContext.isES2()) { + return textureFormatToFormatAndType(format).first != GL_NONE; + } return getInternalFormat(format) != 0; } @@ -1578,6 +2172,8 @@ bool OpenGLDriver::isTextureSwizzleSupported() { // WebGL2 doesn't support texture swizzle // see https://registry.khronos.org/webgl/specs/latest/2.0/#5.19 return false; +#elif defined(BACKEND_OPENGL_VERSION_GLES) + return !mContext.isES2(); #else return true; #endif @@ -1603,6 +2199,10 @@ bool OpenGLDriver::isRenderTargetFormatSupported(TextureFormat format) { // support more formats, but it requires querying GL_INTERNALFORMAT_SUPPORTED which is not // available in OpenGL ES. auto& gl = mContext; + if (UTILS_UNLIKELY(gl.isES2())) { + auto [es2format, type] = textureFormatToFormatAndType(format); + return es2format != GL_NONE && type != GL_NONE; + } switch (format) { // Core formats. case TextureFormat::R8: @@ -1640,7 +2240,7 @@ bool OpenGLDriver::isRenderTargetFormatSupported(TextureFormat format) { // Three-component SRGB is a color-renderable texture format in core OpenGL on desktop. case TextureFormat::SRGB8: - return BACKEND_OPENGL_VERSION == BACKEND_OPENGL_VERSION_GL; + return mContext.isAtLeastGL<4, 5>(); // Half-float formats, requires extension. case TextureFormat::R16F: @@ -1683,7 +2283,7 @@ bool OpenGLDriver::isFrameBufferFetchMultiSampleSupported() { } bool OpenGLDriver::isFrameTimeSupported() { - return mFrameTimeSupported; + return TimerQueryFactory::isGpuTimeSupported(); } bool OpenGLDriver::isAutoDepthResolveSupported() { @@ -1691,6 +2291,56 @@ bool OpenGLDriver::isAutoDepthResolveSupported() { return true; } +bool OpenGLDriver::isSRGBSwapChainSupported() { + if (UTILS_UNLIKELY(mContext.isES2())) { + // On ES2 backend (i.e. feature level 0), we always pretend to the client that sRGB + // SwapChain are available. If we actually have that feature, it'll be used, otherwise + // we emulate it in the shaders. + return true; + } + return mPlatform.isSRGBSwapChainSupported(); +} + +bool OpenGLDriver::isProtectedContentSupported() { + return mPlatform.isProtectedContextSupported(); +} + +bool OpenGLDriver::isStereoSupported() { + // Instanced-stereo requires instancing and EXT_clip_cull_distance. + // Multiview-stereo requires ES 3.0 and OVR_multiview2. + if (UTILS_UNLIKELY(mContext.isES2())) { + return false; + } + switch (mDriverConfig.stereoscopicType) { + case backend::StereoscopicType::INSTANCED: + return mContext.ext.EXT_clip_cull_distance; + case backend::StereoscopicType::MULTIVIEW: + return mContext.ext.OVR_multiview2; + case backend::StereoscopicType::NONE: + return false; + } +} + +bool OpenGLDriver::isParallelShaderCompileSupported() { + return mShaderCompilerService.isParallelShaderCompileSupported(); +} + +bool OpenGLDriver::isDepthStencilResolveSupported() { + return true; +} + +bool OpenGLDriver::isDepthStencilBlitSupported(TextureFormat format) { + return true; +} + +bool OpenGLDriver::isProtectedTexturesSupported() { + return getContext().ext.EXT_protected_textures; +} + +bool OpenGLDriver::isDepthClampSupported() { + return getContext().ext.EXT_depth_clamp; +} + bool OpenGLDriver::isWorkaroundNeeded(Workaround workaround) { switch (workaround) { case Workaround::SPLIT_EASU: @@ -1699,6 +2349,12 @@ bool OpenGLDriver::isWorkaroundNeeded(Workaround workaround) { return mContext.bugs.allow_read_only_ancillary_feedback_loop; case Workaround::ADRENO_UNIFORM_ARRAY_CRASH: return mContext.bugs.enable_initialize_non_used_uniform_array; + case Workaround::DISABLE_BLIT_INTO_TEXTURE_ARRAY: + return mContext.bugs.disable_blit_into_texture_array; + case Workaround::POWER_VR_SHADER_WORKAROUNDS: + return mContext.bugs.powervr_shader_workarounds; + default: + return false; } return false; } @@ -1719,6 +2375,10 @@ uint8_t OpenGLDriver::getMaxDrawBuffers() { return std::min(MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT, uint8_t(mContext.gets.max_draw_buffers)); } +size_t OpenGLDriver::getMaxUniformBufferSize() { + return mContext.gets.max_uniform_block_size; +} + // ------------------------------------------------------------------------------------------------ // Swap chains // ------------------------------------------------------------------------------------------------ @@ -1727,22 +2387,55 @@ uint8_t OpenGLDriver::getMaxDrawBuffers() { void OpenGLDriver::commit(Handle sch) { DEBUG_MARKER() - HwSwapChain* sc = handle_cast(sch); + GLSwapChain* sc = handle_cast(sch); mPlatform.commit(sc->swapChain); + +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + if (UTILS_UNLIKELY(!mFrameCompleteOps.empty())) { + whenGpuCommandsComplete([ops = std::move(mFrameCompleteOps)]() { + for (auto&& op: ops) { + op(); + } + }); + } +#endif } void OpenGLDriver::makeCurrent(Handle schDraw, Handle schRead) { DEBUG_MARKER() - HwSwapChain* scDraw = handle_cast(schDraw); - HwSwapChain* scRead = handle_cast(schRead); - mPlatform.makeCurrent(scDraw->swapChain, scRead->swapChain); + GLSwapChain* scDraw = handle_cast(schDraw); + GLSwapChain* scRead = handle_cast(schRead); + + mPlatform.makeCurrent(scDraw->swapChain, scRead->swapChain, + [this]() { + // OpenGL context is about to change, unbind everything + mContext.unbindEverything(); + }, + [this](size_t index) { + // OpenGL context has changed, resynchronize the state with the cache + mContext.synchronizeStateAndCache(index); + slog.d << "*** OpenGL context change : " << (index ? "protected" : "default") << io::endl; + }); + + mCurrentDrawSwapChain = scDraw; + + // From the GL spec for glViewport and glScissor: + // When a GL context is first attached to a window, width and height are set to the + // dimensions of that window. + // So basically, our viewport/scissor can be reset to "something" here. + mContext.state.window.viewport = {}; + mContext.state.window.scissor = {}; } // ------------------------------------------------------------------------------------------------ // Updating driver objects // ------------------------------------------------------------------------------------------------ +void OpenGLDriver::setDebugTag(HandleBase::HandleId handleId, utils::CString tag) { + mHandleAllocator.associateTagToHandle(handleId, std::move(tag)); +} + void OpenGLDriver::setVertexBufferObject(Handle vbh, uint32_t index, Handle boh) { DEBUG_MARKER() @@ -1795,14 +2488,22 @@ void OpenGLDriver::updateBufferObject( if (bo->gl.binding == GL_ARRAY_BUFFER) { gl.bindVertexArray(nullptr); } - gl.bindBuffer(bo->gl.binding, bo->gl.id); - if (byteOffset == 0 && bd.size == bo->byteCount) { - // it looks like it's generally faster (or not worse) to use glBufferData() - glBufferData(bo->gl.binding, (GLsizeiptr)bd.size, bd.buffer, getBufferUsage(bo->usage)); + + if (UTILS_UNLIKELY(bo->bindingType == BufferObjectBinding::UNIFORM && gl.isES2())) { + assert_invariant(bo->gl.buffer); + memcpy(static_cast(bo->gl.buffer) + byteOffset, bd.buffer, bd.size); + bo->age++; } else { - // glBufferSubData() could be catastrophically inefficient if several are - // issued during the same frame. Currently, we're not doing that though. - glBufferSubData(bo->gl.binding, byteOffset, (GLsizeiptr)bd.size, bd.buffer); + assert_invariant(bo->gl.id); + gl.bindBuffer(bo->gl.binding, bo->gl.id); + if (byteOffset == 0 && bd.size == bo->byteCount) { + // it looks like it's generally faster (or not worse) to use glBufferData() + glBufferData(bo->gl.binding, (GLsizeiptr)bd.size, bd.buffer, getBufferUsage(bo->usage)); + } else { + // glBufferSubData() could be catastrophically inefficient if several are + // issued during the same frame. Currently, we're not doing that though. + glBufferSubData(bo->gl.binding, byteOffset, (GLsizeiptr)bd.size, bd.buffer); + } } scheduleDestroy(std::move(bd)); @@ -1814,6 +2515,12 @@ void OpenGLDriver::updateBufferObjectUnsynchronized( Handle boh, BufferDescriptor&& bd, uint32_t byteOffset) { DEBUG_MARKER() + if (UTILS_UNLIKELY(mContext.isES2())) { + updateBufferObject(boh, std::move(bd), byteOffset); + return; + } + +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 if constexpr (!HAS_MAPBUFFERS) { updateBufferObject(boh, std::move(bd), byteOffset); } else { @@ -1849,6 +2556,7 @@ void OpenGLDriver::updateBufferObjectUnsynchronized( } } CHECK_GL_ERROR(utils::slog.e) +#endif } void OpenGLDriver::resetBufferObject(Handle boh) { @@ -1856,93 +2564,14 @@ void OpenGLDriver::resetBufferObject(Handle boh) { auto& gl = mContext; GLBufferObject* bo = handle_cast(boh); - assert_invariant(bo->gl.id); - - gl.bindBuffer(bo->gl.binding, bo->gl.id); - glBufferData(bo->gl.binding, bo->byteCount, nullptr, getBufferUsage(bo->usage)); -} -void OpenGLDriver::updateSamplerGroup(Handle sbh, - BufferDescriptor&& data) { - DEBUG_MARKER() - -#if defined(GL_EXT_texture_filter_anisotropic) - OpenGLContext const& context = getContext(); - const bool anisotropyWorkaround = - context.ext.EXT_texture_filter_anisotropic && - context.bugs.texture_filter_anisotropic_broken_on_sampler; -#endif - - GLSamplerGroup* const sb = handle_cast(sbh); - assert_invariant(sb->textureUnitEntries.size() == data.size / sizeof(SamplerDescriptor)); - - auto const* const pSamplers = (SamplerDescriptor const*)data.buffer; - for (size_t i = 0, c = sb->textureUnitEntries.size(); i < c; i++) { - GLuint samplerId = 0u; - const GLTexture* t = nullptr; - if (UTILS_LIKELY(pSamplers[i].t)) { - t = handle_cast(pSamplers[i].t); - assert_invariant(t); - - SamplerParams params = pSamplers[i].s; - if (UTILS_UNLIKELY(t->target == SamplerType::SAMPLER_EXTERNAL)) { - // From OES_EGL_image_external spec: - // "The default s and t wrap modes are CLAMP_TO_EDGE, and it is an INVALID_ENUM - // error to set the wrap mode to any other value." - params.wrapS = SamplerWrapMode::CLAMP_TO_EDGE; - params.wrapT = SamplerWrapMode::CLAMP_TO_EDGE; - params.wrapR = SamplerWrapMode::CLAMP_TO_EDGE; - } - // GLES3.x specification forbids depth textures to be filtered. - if (UTILS_UNLIKELY(isDepthFormat(t->format) - && params.compareMode == SamplerCompareMode::NONE - && params.filterMag != SamplerMagFilter::NEAREST - && params.filterMin != SamplerMinFilter::NEAREST - && params.filterMin != SamplerMinFilter::NEAREST_MIPMAP_NEAREST)) { - params.filterMag = SamplerMagFilter::NEAREST; - params.filterMin = SamplerMinFilter::NEAREST; -#ifndef NDEBUG - slog.w << "HwSamplerGroup specifies a filtered depth texture, which is not allowed." - << io::endl; -#endif - } -#if defined(GL_EXT_texture_filter_anisotropic) - if (UTILS_UNLIKELY(anisotropyWorkaround)) { - // Driver claims to support anisotropic filtering, but it fails when set on - // the sampler, we have to set it on the texture instead. - // The texture is already bound here. - GLfloat const anisotropy = float(1u << params.anisotropyLog2); - glTexParameterf(t->gl.target, GL_TEXTURE_MAX_ANISOTROPY_EXT, - std::min(context.gets.max_anisotropy, anisotropy)); - } -#endif - samplerId = getSampler(params); - } else { - // this happens if the program doesn't use all samplers of a sampler group, - // which is not an error. - } - - sb->textureUnitEntries[i] = { t, samplerId }; + if (UTILS_UNLIKELY(bo->bindingType == BufferObjectBinding::UNIFORM && gl.isES2())) { + // nothing to do here + } else { + assert_invariant(bo->gl.id); + gl.bindBuffer(bo->gl.binding, bo->gl.id); + glBufferData(bo->gl.binding, bo->byteCount, nullptr, getBufferUsage(bo->usage)); } - scheduleDestroy(std::move(data)); -} - -void OpenGLDriver::setMinMaxLevels(Handle th, uint32_t minLevel, uint32_t maxLevel) { - DEBUG_MARKER() - auto& gl = mContext; - - GLTexture* t = handle_cast(th); - bindTexture(OpenGLContext::DUMMY_TEXTURE_BINDING, t); - gl.activeTexture(OpenGLContext::DUMMY_TEXTURE_BINDING); - - // Must fit within int8_t. - assert_invariant(minLevel <= 0x7f && maxLevel <= 0x7f); - - t->gl.baseLevel = (int8_t)minLevel; - glTexParameteri(t->gl.target, GL_TEXTURE_BASE_LEVEL, t->gl.baseLevel); - - t->gl.maxLevel = (int8_t)maxLevel; // NOTE: according to the GL spec, the default value of this 1000 - glTexParameteri(t->gl.target, GL_TEXTURE_MAX_LEVEL, t->gl.maxLevel); } void OpenGLDriver::update3DImage(Handle th, @@ -1966,33 +2595,26 @@ void OpenGLDriver::generateMipmaps(Handle th) { auto& gl = mContext; GLTexture* t = handle_cast(th); +#if defined(BACKEND_OPENGL_LEVEL_GLES31) assert_invariant(t->gl.target != GL_TEXTURE_2D_MULTISAMPLE); +#endif // Note: glGenerateMimap can also fail if the internal format is not both // color-renderable and filterable (i.e.: doesn't work for depth) bindTexture(OpenGLContext::DUMMY_TEXTURE_BINDING, t); gl.activeTexture(OpenGLContext::DUMMY_TEXTURE_BINDING); - t->gl.baseLevel = 0; - t->gl.maxLevel = static_cast(t->levels - 1); - - glTexParameteri(t->gl.target, GL_TEXTURE_BASE_LEVEL, t->gl.baseLevel); - glTexParameteri(t->gl.target, GL_TEXTURE_MAX_LEVEL, t->gl.maxLevel); - glGenerateMipmap(t->gl.target); CHECK_GL_ERROR(utils::slog.e) } -bool OpenGLDriver::canGenerateMipmaps() { - return true; -} - void OpenGLDriver::setTextureData(GLTexture* t, uint32_t level, uint32_t xoffset, uint32_t yoffset, uint32_t zoffset, uint32_t width, uint32_t height, uint32_t depth, PixelBufferDescriptor&& p) { auto& gl = mContext; + assert_invariant(t != nullptr); assert_invariant(xoffset + width <= std::max(1u, t->width >> level)); assert_invariant(yoffset + height <= std::max(1u, t->height >> level)); assert_invariant(t->samples <= 1); @@ -2002,13 +2624,32 @@ void OpenGLDriver::setTextureData(GLTexture* t, uint32_t level, return; } - GLenum const glFormat = getFormat(p.format); - GLenum const glType = getType(p.type); + GLenum glFormat; + GLenum glType; + if (mContext.isES2()) { + auto formatAndType = textureFormatToFormatAndType(t->format); + glFormat = formatAndType.first; + glType = formatAndType.second; + } else { + glFormat = getFormat(p.format); + glType = getType(p.type); + } - gl.pixelStore(GL_UNPACK_ROW_LENGTH, GLint(p.stride)); +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + if (!gl.isES2()) { + gl.pixelStore(GL_UNPACK_ROW_LENGTH, GLint(p.stride)); + } +#endif gl.pixelStore(GL_UNPACK_ALIGNMENT, GLint(p.alignment)); - gl.pixelStore(GL_UNPACK_SKIP_PIXELS, GLint(p.left)); - gl.pixelStore(GL_UNPACK_SKIP_ROWS, GLint(p.top)); + + // This is equivalent to using GL_UNPACK_SKIP_PIXELS and GL_UNPACK_SKIP_ROWS + using PBD = PixelBufferDescriptor; + size_t const stride = p.stride ? p.stride : width; + size_t const bpp = PBD::computeDataSize(p.format, p.type, 1, 1, 1); + size_t const bpr = PBD::computeDataSize(p.format, p.type, stride, 1, p.alignment); + size_t const bpl = bpr * height; // TODO: PBD should have a "layer stride" + void const* const buffer = static_cast(p.buffer) + + bpp* p.left + bpr * p.top + bpl * 0; // TODO: PBD should have a p.depth switch (t->target) { case SamplerType::SAMPLER_EXTERNAL: @@ -2022,19 +2663,24 @@ void OpenGLDriver::setTextureData(GLTexture* t, uint32_t level, assert_invariant(t->gl.target == GL_TEXTURE_2D); glTexSubImage2D(t->gl.target, GLint(level), GLint(xoffset), GLint(yoffset), - GLsizei(width), GLsizei(height), glFormat, glType, p.buffer); + GLsizei(width), GLsizei(height), glFormat, glType, buffer); break; case SamplerType::SAMPLER_3D: + assert_invariant(!gl.isES2()); +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 assert_invariant(zoffset + depth <= std::max(1u, t->depth >> level)); bindTexture(OpenGLContext::DUMMY_TEXTURE_BINDING, t); gl.activeTexture(OpenGLContext::DUMMY_TEXTURE_BINDING); assert_invariant(t->gl.target == GL_TEXTURE_3D); glTexSubImage3D(t->gl.target, GLint(level), GLint(xoffset), GLint(yoffset), GLint(zoffset), - GLsizei(width), GLsizei(height), GLsizei(depth), glFormat, glType, p.buffer); + GLsizei(width), GLsizei(height), GLsizei(depth), glFormat, glType, buffer); +#endif break; case SamplerType::SAMPLER_2D_ARRAY: case SamplerType::SAMPLER_CUBEMAP_ARRAY: + assert_invariant(!gl.isES2()); +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 assert_invariant(zoffset + depth <= t->depth); // NOTE: GL_TEXTURE_2D_MULTISAMPLE is not allowed bindTexture(OpenGLContext::DUMMY_TEXTURE_BINDING, t); @@ -2043,7 +2689,8 @@ void OpenGLDriver::setTextureData(GLTexture* t, uint32_t level, t->gl.target == GL_TEXTURE_CUBE_MAP_ARRAY); glTexSubImage3D(t->gl.target, GLint(level), GLint(xoffset), GLint(yoffset), GLint(zoffset), - GLsizei(width), GLsizei(height), GLsizei(depth), glFormat, glType, p.buffer); + GLsizei(width), GLsizei(height), GLsizei(depth), glFormat, glType, buffer); +#endif break; case SamplerType::SAMPLER_CUBEMAP: { assert_invariant(t->gl.target == GL_TEXTURE_CUBE_MAP); @@ -2059,24 +2706,12 @@ void OpenGLDriver::setTextureData(GLTexture* t, uint32_t level, GLenum const target = getCubemapTarget(zoffset + face); glTexSubImage2D(target, GLint(level), GLint(xoffset), GLint(yoffset), GLsizei(width), GLsizei(height), glFormat, glType, - static_cast(p.buffer) + faceSize * face); + static_cast(buffer) + faceSize * face); } break; } } - // update the base/max LOD, so we don't access undefined LOD. this allows the app to - // specify levels as they become available. - - if (int8_t(level) < t->gl.baseLevel) { - t->gl.baseLevel = int8_t(level); - glTexParameteri(t->gl.target, GL_TEXTURE_BASE_LEVEL, t->gl.baseLevel); - } - if (int8_t(level) > t->gl.maxLevel) { - t->gl.maxLevel = int8_t(level); - glTexParameteri(t->gl.target, GL_TEXTURE_MAX_LEVEL, t->gl.maxLevel); - } - scheduleDestroy(std::move(p)); CHECK_GL_ERROR(utils::slog.e) @@ -2120,6 +2755,8 @@ void OpenGLDriver::setCompressedTextureData(GLTexture* t, uint32_t level, t->gl.internalFormat, imageSize, p.buffer); break; case SamplerType::SAMPLER_3D: + assert_invariant(!gl.isES2()); +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 bindTexture(OpenGLContext::DUMMY_TEXTURE_BINDING, t); gl.activeTexture(OpenGLContext::DUMMY_TEXTURE_BINDING); assert_invariant(t->gl.target == GL_TEXTURE_3D); @@ -2127,15 +2764,19 @@ void OpenGLDriver::setCompressedTextureData(GLTexture* t, uint32_t level, GLint(xoffset), GLint(yoffset), GLint(zoffset), GLsizei(width), GLsizei(height), GLsizei(depth), t->gl.internalFormat, imageSize, p.buffer); +#endif break; case SamplerType::SAMPLER_2D_ARRAY: case SamplerType::SAMPLER_CUBEMAP_ARRAY: + assert_invariant(!gl.isES2()); +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 assert_invariant(t->gl.target == GL_TEXTURE_2D_ARRAY || t->gl.target == GL_TEXTURE_CUBE_MAP_ARRAY); glCompressedTexSubImage3D(t->gl.target, GLint(level), GLint(xoffset), GLint(yoffset), GLint(zoffset), GLsizei(width), GLsizei(height), GLsizei(depth), t->gl.internalFormat, imageSize, p.buffer); +#endif break; case SamplerType::SAMPLER_CUBEMAP: { assert_invariant(t->gl.target == GL_TEXTURE_CUBE_MAP); @@ -2157,18 +2798,6 @@ void OpenGLDriver::setCompressedTextureData(GLTexture* t, uint32_t level, } } - // update the base/max LOD, so we don't access undefined LOD. this allows the app to - // specify levels as they become available. - - if (uint8_t(level) < t->gl.baseLevel) { - t->gl.baseLevel = int8_t(level); - glTexParameteri(t->gl.target, GL_TEXTURE_BASE_LEVEL, t->gl.baseLevel); - } - if (uint8_t(level) > t->gl.maxLevel) { - t->gl.maxLevel = int8_t(level); - glTexParameteri(t->gl.target, GL_TEXTURE_MAX_LEVEL, t->gl.maxLevel); - } - scheduleDestroy(std::move(p)); CHECK_GL_ERROR(utils::slog.e) @@ -2178,26 +2807,6 @@ void OpenGLDriver::setupExternalImage(void* image) { mPlatform.retainExternalImage(image); } -void OpenGLDriver::setExternalImage(Handle th, void* image) { - DEBUG_MARKER() - GLTexture* t = handle_cast(th); - assert_invariant(t); - assert_invariant(t->target == SamplerType::SAMPLER_EXTERNAL); - - bindTexture(OpenGLContext::DUMMY_TEXTURE_BINDING, t); - if (mPlatform.setExternalImage(image, t->externalTexture)) { - // the target and id can be reset each time - t->gl.target = t->externalTexture->target; - t->gl.id = t->externalTexture->id; - t->gl.targetIndex = (uint8_t)OpenGLContext::getIndexForTextureTarget(t->gl.target); - bindTexture(OpenGLContext::DUMMY_TEXTURE_BINDING, t); - } -} - -void OpenGLDriver::setExternalImagePlane(Handle th, void* image, uint32_t plane) { - DEBUG_MARKER() -} - void OpenGLDriver::setExternalStream(Handle th, Handle sh) { auto& gl = mContext; if (gl.ext.OES_EGL_image_external_essl3) { @@ -2295,53 +2904,24 @@ void OpenGLDriver::replaceStream(GLTexture* texture, GLStream* newStream) noexce void OpenGLDriver::beginTimerQuery(Handle tqh) { DEBUG_MARKER() GLTimerQuery* tq = handle_cast(tqh); - // reset the state of the result availability - tq->elapsed.store(0, std::memory_order_relaxed); - mTimerQueryImpl->beginTimeElapsedQuery(tq); + mContext.beginTimeElapsedQuery(tq); } void OpenGLDriver::endTimerQuery(Handle tqh) { DEBUG_MARKER() GLTimerQuery* tq = handle_cast(tqh); - mTimerQueryImpl->endTimeElapsedQuery(tq); - - runEveryNowAndThen([this, tq]() -> bool { - if (!mTimerQueryImpl->queryResultAvailable(tq)) { - // we need to try this one again later - return false; - } - tq->elapsed.store(mTimerQueryImpl->queryResult(tq), std::memory_order_relaxed); - return true; - }); + mContext.endTimeElapsedQuery(*this, tq); } -bool OpenGLDriver::getTimerQueryValue(Handle tqh, uint64_t* elapsedTime) { +TimerQueryResult OpenGLDriver::getTimerQueryValue(Handle tqh, uint64_t* elapsedTime) { GLTimerQuery* tq = handle_cast(tqh); - uint64_t const d = tq->elapsed.load(std::memory_order_relaxed); - if (!d) { - return false; - } - if (elapsedTime) { - *elapsedTime = d; - } - return true; + return TimerQueryFactoryInterface::getTimerQueryValue(tq, elapsedTime); } -SyncStatus OpenGLDriver::getSyncStatus(Handle sh) { - GLSync* s = handle_cast(sh); - if (!s->result) { - return SyncStatus::NOT_SIGNALED; - } - auto status = s->result->status.load(std::memory_order_relaxed); - switch (status) { - case GL_CONDITION_SATISFIED: - case GL_ALREADY_SIGNALED: - return SyncStatus::SIGNALED; - case GL_TIMEOUT_EXPIRED: - return SyncStatus::NOT_SIGNALED; - case GL_WAIT_FAILED: - default: - return SyncStatus::ERROR; +void OpenGLDriver::compilePrograms(CompilerPriorityQueue, + CallbackHandler* handler, CallbackHandler::Callback callback, void* user) { + if (callback) { + getShaderCompilerService().notifyWhenAllProgramsAreReady(handler, callback, user); } } @@ -2349,7 +2929,7 @@ void OpenGLDriver::beginRenderPass(Handle rth, const RenderPassParams& params) { DEBUG_MARKER() - executeRenderPassOps(); + getShaderCompilerService().tick(); auto& gl = mContext; @@ -2358,30 +2938,32 @@ void OpenGLDriver::beginRenderPass(Handle rth, GLRenderTarget* rt = handle_cast(rth); + // If we're rendering into the default render target (i.e. into the current SwapChain), + // get the value of the output colorspace from there, otherwise it's always linear. + assert_invariant(!rt->gl.isDefault || mCurrentDrawSwapChain); + mRec709OutputColorspace = rt->gl.isDefault ? mCurrentDrawSwapChain->rec709 : false; + const TargetBufferFlags clearFlags = params.flags.clear & rt->targets; TargetBufferFlags discardFlags = params.flags.discardStart & rt->targets; - gl.bindFramebuffer(GL_FRAMEBUFFER, rt->gl.fbo); + GLuint const fbo = gl.bindFramebuffer(GL_FRAMEBUFFER, rt->gl.fbo); CHECK_GL_FRAMEBUFFER_STATUS(utils::slog.e, GL_FRAMEBUFFER) - // glInvalidateFramebuffer appeared on GLES 3.0 and GL4.3, for simplicity we just - // ignore it on GL (rather than having to do a runtime check). - if (BACKEND_OPENGL_VERSION == BACKEND_OPENGL_VERSION_GLES && - BACKEND_OPENGL_LEVEL >= BACKEND_OPENGL_LEVEL_GLES30) { - if (!gl.bugs.disable_invalidate_framebuffer) { - AttachmentArray attachments; // NOLINT - GLsizei const attachmentCount = getAttachments(attachments, rt, discardFlags); - if (attachmentCount) { - glInvalidateFramebuffer(GL_FRAMEBUFFER, attachmentCount, attachments.data()); - } - CHECK_GL_ERROR(utils::slog.e) + // each render-pass starts with a disabled scissor + gl.disable(GL_SCISSOR_TEST); + + if (gl.ext.EXT_discard_framebuffer + && !gl.bugs.disable_invalidate_framebuffer) { + AttachmentArray attachments; // NOLINT + GLsizei const attachmentCount = getAttachments(attachments, discardFlags, !fbo); + if (attachmentCount) { + gl.procs.invalidateFramebuffer(GL_FRAMEBUFFER, attachmentCount, attachments.data()); } + CHECK_GL_ERROR(utils::slog.e) } else { - // on GL desktop we assume we don't have glInvalidateFramebuffer, but even if the GPU is - // not a tiler, it's important to clear the framebuffer before drawing, as it resets + // It's important to clear the framebuffer before drawing, as it resets // the fb to a known state (resets fb compression and possibly other things). // So we use glClear instead of glInvalidateFramebuffer - gl.disable(GL_SCISSOR_TEST); clearWithRasterPipe(discardFlags & ~clearFlags, { 0.0f }, 0.0f, 0); } @@ -2397,7 +2979,6 @@ void OpenGLDriver::beginRenderPass(Handle rth, } if (any(clearFlags)) { - gl.disable(GL_SCISSOR_TEST); clearWithRasterPipe(clearFlags, params.clearColor, (GLfloat)params.clearDepth, (GLint)params.clearStencil); } @@ -2416,7 +2997,6 @@ void OpenGLDriver::beginRenderPass(Handle rth, #ifndef NDEBUG // clear the discarded (but not the cleared ones) buffers in debug builds - gl.disable(GL_SCISSOR_TEST); clearWithRasterPipe(discardFlags & ~clearFlags, { 1, 0, 0, 1 }, 1.0, 0); #endif @@ -2448,21 +3028,23 @@ void OpenGLDriver::endRenderPass(int) { discardFlags &= ~TargetBufferFlags::STENCIL; } - // glInvalidateFramebuffer appeared on GLES 3.0 and GL4.3, for simplicity we just - // ignore it on GL (rather than having to do a runtime check). - if (BACKEND_OPENGL_VERSION == BACKEND_OPENGL_VERSION_GLES && - BACKEND_OPENGL_LEVEL >= BACKEND_OPENGL_LEVEL_GLES30) { + if (rt->gl.isDefault) { + assert_invariant(mCurrentDrawSwapChain); + discardFlags &= ~mPlatform.getPreservedFlags(mCurrentDrawSwapChain->swapChain); + } + + if (gl.ext.EXT_discard_framebuffer) { auto effectiveDiscardFlags = discardFlags; if (gl.bugs.invalidate_end_only_if_invalidate_start) { effectiveDiscardFlags &= mRenderPassParams.flags.discardStart; } if (!gl.bugs.disable_invalidate_framebuffer) { // we wouldn't have to bind the framebuffer if we had glInvalidateNamedFramebuffer() - gl.bindFramebuffer(GL_FRAMEBUFFER, rt->gl.fbo); + GLuint const fbo = gl.bindFramebuffer(GL_FRAMEBUFFER, rt->gl.fbo); AttachmentArray attachments; // NOLINT - GLsizei const attachmentCount = getAttachments(attachments, rt, effectiveDiscardFlags); + GLsizei const attachmentCount = getAttachments(attachments, effectiveDiscardFlags, !fbo); if (attachmentCount) { - glInvalidateFramebuffer(GL_FRAMEBUFFER, attachmentCount, attachments.data()); + gl.procs.invalidateFramebuffer(GL_FRAMEBUFFER, attachmentCount, attachments.data()); } CHECK_GL_ERROR(utils::slog.e) } @@ -2485,6 +3067,13 @@ void OpenGLDriver::nextSubpass(int) {} void OpenGLDriver::resolvePass(ResolveAction action, GLRenderTarget const* rt, TargetBufferFlags discardFlags) noexcept { + + if (UTILS_UNLIKELY(getContext().isES2())) { + // ES2 doesn't have manual resolve capabilities + return; + } + +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 assert_invariant(rt->gl.fbo_read); auto& gl = mContext; const TargetBufferFlags resolve = rt->gl.resolve & ~discardFlags; @@ -2511,51 +3100,52 @@ void OpenGLDriver::resolvePass(ResolveAction action, GLRenderTarget const* rt, 0, 0, (GLint)rt->width, (GLint)rt->height, mask, GL_NEAREST); CHECK_GL_ERROR(utils::slog.e) } +#endif } GLsizei OpenGLDriver::getAttachments(AttachmentArray& attachments, - GLRenderTarget const* rt, TargetBufferFlags buffers) noexcept { - assert_invariant(buffers <= rt->targets); - + TargetBufferFlags buffers, bool isDefaultFramebuffer) noexcept { GLsizei attachmentCount = 0; // the default framebuffer uses different constants!!! - const bool defaultFramebuffer = (rt->gl.fbo == 0); + if (any(buffers & TargetBufferFlags::COLOR0)) { - attachments[attachmentCount++] = defaultFramebuffer ? GL_COLOR : GL_COLOR_ATTACHMENT0; + attachments[attachmentCount++] = isDefaultFramebuffer ? GL_COLOR : GL_COLOR_ATTACHMENT0; } +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 if (any(buffers & TargetBufferFlags::COLOR1)) { - assert_invariant(!defaultFramebuffer); + assert_invariant(!isDefaultFramebuffer); attachments[attachmentCount++] = GL_COLOR_ATTACHMENT1; } if (any(buffers & TargetBufferFlags::COLOR2)) { - assert_invariant(!defaultFramebuffer); + assert_invariant(!isDefaultFramebuffer); attachments[attachmentCount++] = GL_COLOR_ATTACHMENT2; } if (any(buffers & TargetBufferFlags::COLOR3)) { - assert_invariant(!defaultFramebuffer); + assert_invariant(!isDefaultFramebuffer); attachments[attachmentCount++] = GL_COLOR_ATTACHMENT3; } if (any(buffers & TargetBufferFlags::COLOR4)) { - assert_invariant(!defaultFramebuffer); + assert_invariant(!isDefaultFramebuffer); attachments[attachmentCount++] = GL_COLOR_ATTACHMENT4; } if (any(buffers & TargetBufferFlags::COLOR5)) { - assert_invariant(!defaultFramebuffer); + assert_invariant(!isDefaultFramebuffer); attachments[attachmentCount++] = GL_COLOR_ATTACHMENT5; } if (any(buffers & TargetBufferFlags::COLOR6)) { - assert_invariant(!defaultFramebuffer); + assert_invariant(!isDefaultFramebuffer); attachments[attachmentCount++] = GL_COLOR_ATTACHMENT6; } if (any(buffers & TargetBufferFlags::COLOR7)) { - assert_invariant(!defaultFramebuffer); + assert_invariant(!isDefaultFramebuffer); attachments[attachmentCount++] = GL_COLOR_ATTACHMENT7; } +#endif if (any(buffers & TargetBufferFlags::DEPTH)) { - attachments[attachmentCount++] = defaultFramebuffer ? GL_DEPTH : GL_DEPTH_ATTACHMENT; + attachments[attachmentCount++] = isDefaultFramebuffer ? GL_DEPTH : GL_DEPTH_ATTACHMENT; } if (any(buffers & TargetBufferFlags::STENCIL)) { - attachments[attachmentCount++] = defaultFramebuffer ? GL_STENCIL : GL_STENCIL_ATTACHMENT; + attachments[attachmentCount++] = isDefaultFramebuffer ? GL_STENCIL : GL_STENCIL_ATTACHMENT; } return attachmentCount; } @@ -2583,112 +3173,49 @@ void OpenGLDriver::setScissor(Viewport const& scissor) noexcept { // Setting rendering state // ------------------------------------------------------------------------------------------------ -void OpenGLDriver::bindUniformBuffer(uint32_t index, Handle ubh) { - DEBUG_MARKER() - auto& gl = mContext; - GLBufferObject* ub = handle_cast(ubh); - assert_invariant(ub->gl.binding == GL_UNIFORM_BUFFER); - gl.bindBufferRange(ub->gl.binding, GLuint(index), ub->gl.id, 0, ub->byteCount); - CHECK_GL_ERROR(utils::slog.e) -} - -void OpenGLDriver::bindBufferRange(BufferObjectBinding bindingType, uint32_t index, - Handle ubh, uint32_t offset, uint32_t size) { - DEBUG_MARKER() - auto& gl = mContext; - - assert_invariant(bindingType == BufferObjectBinding::SHADER_STORAGE || - bindingType == BufferObjectBinding::UNIFORM); - - GLBufferObject* ub = handle_cast(ubh); - - GLenum const target = GLUtils::getBufferBindingType(bindingType); - - assert_invariant(bindingType == BufferObjectBinding::SHADER_STORAGE || - ub->gl.binding == target); - - assert_invariant(offset + size <= ub->byteCount); - gl.bindBufferRange(target, GLuint(index), ub->gl.id, offset, size); - CHECK_GL_ERROR(utils::slog.e) -} - -void OpenGLDriver::unbindBuffer(BufferObjectBinding bindingType, uint32_t index) { - DEBUG_MARKER() - auto& gl = mContext; - GLenum const target = GLUtils::getBufferBindingType(bindingType); - gl.bindBufferRange(target, GLuint(index), 0, 0, 0); - CHECK_GL_ERROR(utils::slog.e) -} - -void OpenGLDriver::bindSamplers(uint32_t index, Handle sbh) { - DEBUG_MARKER() - assert_invariant(index < Program::SAMPLER_BINDING_COUNT); - GLSamplerGroup* sb = handle_cast(sbh); - mSamplerBindings[index] = sb; - CHECK_GL_ERROR(utils::slog.e) -} - - -GLuint OpenGLDriver::getSamplerSlow(SamplerParams params) const noexcept { - assert_invariant(mSamplerMap.find(params.u) == mSamplerMap.end()); - - GLuint s; - glGenSamplers(1, &s); - glSamplerParameteri(s, GL_TEXTURE_MIN_FILTER, (GLint)getTextureFilter(params.filterMin)); - glSamplerParameteri(s, GL_TEXTURE_MAG_FILTER, (GLint)getTextureFilter(params.filterMag)); - glSamplerParameteri(s, GL_TEXTURE_WRAP_S, (GLint)getWrapMode(params.wrapS)); - glSamplerParameteri(s, GL_TEXTURE_WRAP_T, (GLint)getWrapMode(params.wrapT)); - glSamplerParameteri(s, GL_TEXTURE_WRAP_R, (GLint)getWrapMode(params.wrapR)); - glSamplerParameteri(s, GL_TEXTURE_COMPARE_MODE, (GLint)getTextureCompareMode(params.compareMode)); - glSamplerParameteri(s, GL_TEXTURE_COMPARE_FUNC, (GLint)getTextureCompareFunc(params.compareFunc)); - -#if defined(GL_EXT_texture_filter_anisotropic) +void OpenGLDriver::insertEventMarker(char const* string) { +#ifndef __EMSCRIPTEN__ +#ifdef GL_EXT_debug_marker auto& gl = mContext; - if (gl.ext.EXT_texture_filter_anisotropic && - !gl.bugs.texture_filter_anisotropic_broken_on_sampler) { - GLfloat const anisotropy = float(1u << params.anisotropyLog2); - glSamplerParameterf(s, GL_TEXTURE_MAX_ANISOTROPY_EXT, - std::min(gl.gets.max_anisotropy, anisotropy)); + if (gl.ext.EXT_debug_marker) { + glInsertEventMarkerEXT(GLsizei(strlen(string)), string); } #endif - CHECK_GL_ERROR(utils::slog.e) - mSamplerMap[params.u] = s; - return s; +#endif } -void OpenGLDriver::insertEventMarker(char const* string, uint32_t len) { +void OpenGLDriver::pushGroupMarker(char const* string) { +#ifndef __EMSCRIPTEN__ #ifdef GL_EXT_debug_marker - auto& gl = mContext; - if (gl.ext.EXT_debug_marker) { - glInsertEventMarkerEXT(GLsizei(len ? len : strlen(string)), string); +#if DEBUG_GROUP_MARKER_LEVEL & DEBUG_GROUP_MARKER_OPENGL + if (UTILS_LIKELY(mContext.ext.EXT_debug_marker)) { + glPushGroupMarkerEXT(GLsizei(strlen(string)), string); } #endif -} +#endif -void OpenGLDriver::pushGroupMarker(char const* string, uint32_t len) { -#ifdef GL_EXT_debug_marker - auto& gl = mContext; - if (UTILS_LIKELY(gl.ext.EXT_debug_marker)) { - glPushGroupMarkerEXT(GLsizei(len ? len : strlen(string)), string); - } else +#if DEBUG_GROUP_MARKER_LEVEL & DEBUG_GROUP_MARKER_BACKEND + SYSTRACE_CONTEXT(); + SYSTRACE_NAME_BEGIN(string); +#endif #endif - { - SYSTRACE_CONTEXT(); - SYSTRACE_NAME_BEGIN(string); - } } void OpenGLDriver::popGroupMarker(int) { +#ifndef __EMSCRIPTEN__ #ifdef GL_EXT_debug_marker - auto& gl = mContext; - if (UTILS_LIKELY(gl.ext.EXT_debug_marker)) { +#if DEBUG_GROUP_MARKER_LEVEL & DEBUG_GROUP_MARKER_OPENGL + if (UTILS_LIKELY(mContext.ext.EXT_debug_marker)) { glPopGroupMarkerEXT(); - } else -#endif - { - SYSTRACE_CONTEXT(); - SYSTRACE_NAME_END(); } +#endif +#endif + +#if DEBUG_GROUP_MARKER_LEVEL & DEBUG_GROUP_MARKER_BACKEND + SYSTRACE_CONTEXT(); + SYSTRACE_NAME_END(); +#endif +#endif } void OpenGLDriver::startCapture(int) { @@ -2710,10 +3237,7 @@ void OpenGLDriver::readPixels(Handle src, GLenum const glFormat = getFormat(p.format); GLenum const glType = getType(p.type); - gl.pixelStore(GL_PACK_ROW_LENGTH, (GLint)p.stride); - gl.pixelStore(GL_PACK_ALIGNMENT, (GLint)p.alignment); - gl.pixelStore(GL_PACK_SKIP_PIXELS, (GLint)p.left); - gl.pixelStore(GL_PACK_SKIP_ROWS, (GLint)p.top); + gl.pixelStore(GL_PACK_ALIGNMENT, (GLint)p.alignment); /* * glReadPixel() operation... @@ -2741,44 +3265,81 @@ void OpenGLDriver::readPixels(Handle src, */ GLRenderTarget const* s = handle_cast(src); - gl.bindFramebuffer(GL_READ_FRAMEBUFFER, s->gl.fbo); + + using PBD = PixelBufferDescriptor; + + // The PBO only needs to accommodate the area we're reading, with alignment. + auto const pboSize = (GLsizeiptr)PBD::computeDataSize( + p.format, p.type, width, height, p.alignment); + + if (UTILS_UNLIKELY(gl.isES2())) { + void* buffer = malloc(pboSize); + if (buffer) { + gl.bindFramebuffer(GL_FRAMEBUFFER, s->gl.fbo_read ? s->gl.fbo_read : s->gl.fbo); + glReadPixels(GLint(x), GLint(y), GLint(width), GLint(height), glFormat, glType, buffer); + CHECK_GL_ERROR(utils::slog.e) + + // now we need to flip the buffer vertically to match our API + size_t const stride = p.stride ? p.stride : width; + size_t const bpp = PBD::computeDataSize(p.format, p.type, 1, 1, 1); + size_t const dstBpr = PBD::computeDataSize(p.format, p.type, stride, 1, p.alignment); + char* pDst = (char*)p.buffer + p.left * bpp + dstBpr * (p.top + height - 1); + + size_t const srcBpr = PBD::computeDataSize(p.format, p.type, width, 1, p.alignment); + char const* pSrc = (char const*)buffer; + for (size_t i = 0; i < height; ++i) { + memcpy(pDst, pSrc, bpp * width); + pSrc += srcBpr; + pDst -= dstBpr; + } + } + free(buffer); + scheduleDestroy(std::move(p)); + return; + } + +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + // glReadPixel doesn't resolve automatically, but it does with the auto-resolve extension, + // which we're always emulating. So if we have a resolved fbo (fbo_read), use that instead. + gl.bindFramebuffer(GL_READ_FRAMEBUFFER, s->gl.fbo_read ? s->gl.fbo_read : s->gl.fbo); GLuint pbo; glGenBuffers(1, &pbo); gl.bindBuffer(GL_PIXEL_PACK_BUFFER, pbo); - glBufferData(GL_PIXEL_PACK_BUFFER, (GLsizeiptr)p.size, nullptr, GL_STATIC_DRAW); + glBufferData(GL_PIXEL_PACK_BUFFER, pboSize, nullptr, GL_STATIC_DRAW); glReadPixels(GLint(x), GLint(y), GLint(width), GLint(height), glFormat, glType, nullptr); gl.bindBuffer(GL_PIXEL_PACK_BUFFER, 0); CHECK_GL_ERROR(utils::slog.e) // we're forced to make a copy on the heap because otherwise it deletes std::function<> copy // constructor. - auto* pUserBuffer = new PixelBufferDescriptor(std::move(p)); - whenGpuCommandsComplete([this, width, height, pbo, pUserBuffer]() mutable { + auto* const pUserBuffer = new PixelBufferDescriptor(std::move(p)); + whenGpuCommandsComplete([this, width, height, pbo, pboSize, pUserBuffer]() mutable { PixelBufferDescriptor& p = *pUserBuffer; auto& gl = mContext; gl.bindBuffer(GL_PIXEL_PACK_BUFFER, pbo); void* vaddr = nullptr; #if defined(__EMSCRIPTEN__) - std::unique_ptr clientBuffer = std::make_unique(p.size); - glGetBufferSubData(GL_PIXEL_PACK_BUFFER, 0, p.size, clientBuffer.get()); + std::unique_ptr clientBuffer = std::make_unique(pboSize); + glGetBufferSubData(GL_PIXEL_PACK_BUFFER, 0, pboSize, clientBuffer.get()); vaddr = clientBuffer.get(); #else - vaddr = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, (GLsizeiptr)p.size, GL_MAP_READ_BIT); + vaddr = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, pboSize, GL_MAP_READ_BIT); #endif if (vaddr) { // now we need to flip the buffer vertically to match our API size_t const stride = p.stride ? p.stride : width; - size_t const bpp = PixelBufferDescriptor::computeDataSize( - p.format, p.type, 1, 1, 1); - size_t const bpr = PixelBufferDescriptor::computeDataSize( - p.format, p.type, stride, 1, p.alignment); - char const* head = (char const*)vaddr + p.left * bpp + bpr * p.top; - char* tail = (char*)p.buffer + p.left * bpp + bpr * (p.top + height - 1); + size_t const bpp = PBD::computeDataSize(p.format, p.type, 1, 1, 1); + size_t const dstBpr = PBD::computeDataSize(p.format, p.type, stride, 1, p.alignment); + char* pDst = (char*)p.buffer + p.left * bpp + dstBpr * (p.top + height - 1); + + size_t const srcBpr = PBD::computeDataSize(p.format, p.type, width, 1, p.alignment); + char const* pSrc = (char const*)vaddr; + for (size_t i = 0; i < height; ++i) { - memcpy(tail, head, bpp * width); - head += bpr; - tail -= bpr; + memcpy(pDst, pSrc, bpp * width); + pSrc += srcBpr; + pDst -= dstBpr; } #if !defined(__EMSCRIPTEN__) glUnmapBuffer(GL_PIXEL_PACK_BUFFER); @@ -2790,12 +3351,15 @@ void OpenGLDriver::readPixels(Handle src, delete pUserBuffer; CHECK_GL_ERROR(utils::slog.e) }); +#endif } void OpenGLDriver::readBufferSubData(backend::BufferObjectHandle boh, uint32_t offset, uint32_t size, backend::BufferDescriptor&& p) { - auto& gl = mContext; + UTILS_UNUSED_IN_RELEASE auto& gl = mContext; + assert_invariant(!gl.isES2()); +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 GLBufferObject const* bo = handle_cast(boh); // TODO: measure the two solutions @@ -2842,38 +3406,14 @@ void OpenGLDriver::readBufferSubData(backend::BufferObjectHandle boh, scheduleDestroy(std::move(p)); CHECK_GL_ERROR(utils::slog.e) } +#endif } -void OpenGLDriver::whenGpuCommandsComplete(std::function fn) noexcept { - GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); - mGpuCommandCompleteOps.emplace_back(sync, std::move(fn)); - CHECK_GL_ERROR(utils::slog.e) -} void OpenGLDriver::runEveryNowAndThen(std::function fn) noexcept { mEveryNowAndThenOps.push_back(std::move(fn)); } -void OpenGLDriver::executeGpuCommandsCompleteOps() noexcept { - auto& v = mGpuCommandCompleteOps; - auto it = v.begin(); - while (it != v.end()) { - GLenum const status = glClientWaitSync(it->first, 0, 0); - if (status == GL_ALREADY_SIGNALED || status == GL_CONDITION_SATISFIED) { - it->second(); - glDeleteSync(it->first); - it = v.erase(it); - } else if (UTILS_UNLIKELY(status == GL_WAIT_FAILED)) { - // This should never happen, but is very problematic if it does, as we might leak - // some data depending on what the callback does. However, we clean up our own state. - glDeleteSync(it->first); - it = v.erase(it); - } else { - ++it; - } - } -} - void OpenGLDriver::executeEveryNowAndThenOps() noexcept { auto& v = mEveryNowAndThenOps; auto it = v.begin(); @@ -2886,24 +3426,45 @@ void OpenGLDriver::executeEveryNowAndThenOps() noexcept { } } -void OpenGLDriver::runAtNextRenderPass(void* token, std::function fn) noexcept { - assert_invariant(mRunAtNextRenderPassOps.find(token) == mRunAtNextRenderPassOps.end()); - mRunAtNextRenderPassOps[token] = std::move(fn); +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 +void OpenGLDriver::whenFrameComplete(const std::function& fn) noexcept { + mFrameCompleteOps.push_back(fn); } -void OpenGLDriver::cancelRunAtNextPassOp(void* token) noexcept { - mRunAtNextRenderPassOps.erase(token); +void OpenGLDriver::whenGpuCommandsComplete(const std::function& fn) noexcept { + GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + mGpuCommandCompleteOps.emplace_back(sync, fn); + CHECK_GL_ERROR(utils::slog.e) } -void OpenGLDriver::executeRenderPassOps() noexcept { - auto& ops = mRunAtNextRenderPassOps; - if (!ops.empty()) { - for (auto& item: ops) { - item.second(); +void OpenGLDriver::executeGpuCommandsCompleteOps() noexcept { + auto& v = mGpuCommandCompleteOps; + auto it = v.begin(); + while (it != v.end()) { + auto const& [sync, fn] = *it; + GLenum const syncStatus = glClientWaitSync(sync, 0, 0u); + switch (syncStatus) { + case GL_TIMEOUT_EXPIRED: + // not ready + ++it; + break; + case GL_ALREADY_SIGNALED: + case GL_CONDITION_SATISFIED: + // ready + it->second(); + glDeleteSync(sync); + it = v.erase(it); + break; + default: + // This should never happen, but is very problematic if it does, as we might leak + // some data depending on what the callback does. However, we clean up our own state. + glDeleteSync(sync); + it = v.erase(it); + break; } - ops.clear(); } } +#endif // ------------------------------------------------------------------------------------------------ // Rendering ops @@ -2911,16 +3472,21 @@ void OpenGLDriver::executeRenderPassOps() noexcept { void OpenGLDriver::tick(int) { DEBUG_MARKER() +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 executeGpuCommandsCompleteOps(); +#endif executeEveryNowAndThenOps(); + getShaderCompilerService().tick(); } void OpenGLDriver::beginFrame( UTILS_UNUSED int64_t monotonic_clock_ns, + UTILS_UNUSED int64_t refreshIntervalNs, UTILS_UNUSED uint32_t frameId) { - DEBUG_MARKER() + PROFILE_MARKER(PROFILE_NAME_BEGINFRAME) auto& gl = mContext; insertEventMarker("beginFrame"); + mPlatform.beginFrame(monotonic_clock_ns, refreshIntervalNs, frameId); if (UTILS_UNLIKELY(!mTexturesWithStreamsAttached.empty())) { OpenGLPlatform& platform = mPlatform; for (GLTexture const* t : mTexturesWithStreamsAttached) { @@ -2929,20 +3495,20 @@ void OpenGLDriver::beginFrame( assert_invariant(t->hwStream->stream); platform.updateTexImage(t->hwStream->stream, &static_cast(t->hwStream)->user_thread.timestamp); // NOLINT(cppcoreguidelines-pro-type-static-cast-downcast) - // NOTE: We assume that updateTexImage() binds the texture on our behalf + // NOTE: We assume that OpenGLPlatform::updateTexImage() binds the texture on our behalf gl.updateTexImage(GL_TEXTURE_EXTERNAL_OES, t->gl.id); } } } } -void OpenGLDriver::setFrameScheduledCallback(Handle sch, - FrameScheduledCallback callback, void* user) { +void OpenGLDriver::setFrameScheduledCallback(Handle sch, CallbackHandler* handler, + FrameScheduledCallback&& callback, uint64_t flags) { DEBUG_MARKER() } void OpenGLDriver::setFrameCompletedCallback(Handle sch, - FrameCompletedCallback callback, void* user) { + CallbackHandler* handler, utils::Invocable&& callback) { DEBUG_MARKER() } @@ -2952,7 +3518,7 @@ void OpenGLDriver::setPresentationTime(int64_t monotonic_clock_ns) { } void OpenGLDriver::endFrame(UTILS_UNUSED uint32_t frameId) { - DEBUG_MARKER() + PROFILE_MARKER(PROFILE_NAME_ENDFRAME) #if defined(__EMSCRIPTEN__) // WebGL builds are single-threaded so users might manipulate various GL state after we're // done with the frame. We do NOT officially support using Filament in this way, but we can @@ -2960,7 +3526,7 @@ void OpenGLDriver::endFrame(UTILS_UNUSED uint32_t frameId) { auto& gl = mContext; gl.bindVertexArray(nullptr); for (int unit = OpenGLContext::DUMMY_TEXTURE_BINDING; unit >= 0; unit--) { - gl.bindTexture(unit, GL_TEXTURE_2D, 0); + gl.bindTexture(unit, GL_TEXTURE_2D, 0, false); } gl.disable(GL_CULL_FACE); gl.depthFunc(GL_LESS); @@ -2968,28 +3534,49 @@ void OpenGLDriver::endFrame(UTILS_UNUSED uint32_t frameId) { #endif //SYSTRACE_NAME("glFinish"); //glFinish(); + mPlatform.endFrame(frameId); insertEventMarker("endFrame"); } +void OpenGLDriver::updateDescriptorSetBuffer( + backend::DescriptorSetHandle dsh, + backend::descriptor_binding_t binding, + backend::BufferObjectHandle boh, + uint32_t offset, uint32_t size) { + GLDescriptorSet* ds = handle_cast(dsh); + GLBufferObject* bo = boh ? handle_cast(boh) : nullptr; + ds->update(mContext, binding, bo, offset, size); +} + +void OpenGLDriver::updateDescriptorSetTexture( + backend::DescriptorSetHandle dsh, + backend::descriptor_binding_t binding, + backend::TextureHandle th, + SamplerParams params) { + GLDescriptorSet* ds = handle_cast(dsh); + GLTexture* t = th ? handle_cast(th) : nullptr; + ds->update(mContext, binding, t, params); +} + void OpenGLDriver::flush(int) { DEBUG_MARKER() auto& gl = mContext; if (!gl.bugs.disable_glFlush) { glFlush(); } - mTimerQueryImpl->flush(); } void OpenGLDriver::finish(int) { DEBUG_MARKER() glFinish(); - mTimerQueryImpl->flush(); +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 executeGpuCommandsCompleteOps(); + assert_invariant(mGpuCommandCompleteOps.empty()); +#endif executeEveryNowAndThenOps(); // Note: since we executed a glFinish(), all pending tasks should be done - assert_invariant(mGpuCommandCompleteOps.empty()); - // however, some tasks rely on a separated thread to publish their result (e.g. + // However, some tasks rely on a separated thread to publish their result (e.g. // endTimerQuery), so the result could very well not be ready, and the task will // linger a bit longer, this is only true for mEveryNowAndThenOps tasks. // The fallout of this is that we can't assert that mEveryNowAndThenOps is empty. @@ -3009,201 +3596,478 @@ void OpenGLDriver::clearWithRasterPipe(TargetBufferFlags clearFlags, mContext.stencilMaskSeparate(0xFF, mContext.state.stencil.back.stencilMask); } - if (any(clearFlags & TargetBufferFlags::COLOR0)) { - glClearBufferfv(GL_COLOR, 0, linearColor.v); - } - if (any(clearFlags & TargetBufferFlags::COLOR1)) { - glClearBufferfv(GL_COLOR, 1, linearColor.v); - } - if (any(clearFlags & TargetBufferFlags::COLOR2)) { - glClearBufferfv(GL_COLOR, 2, linearColor.v); - } - if (any(clearFlags & TargetBufferFlags::COLOR3)) { - glClearBufferfv(GL_COLOR, 3, linearColor.v); - } - if (any(clearFlags & TargetBufferFlags::COLOR4)) { - glClearBufferfv(GL_COLOR, 4, linearColor.v); - } - if (any(clearFlags & TargetBufferFlags::COLOR5)) { - glClearBufferfv(GL_COLOR, 5, linearColor.v); - } - if (any(clearFlags & TargetBufferFlags::COLOR6)) { - glClearBufferfv(GL_COLOR, 6, linearColor.v); - } - if (any(clearFlags & TargetBufferFlags::COLOR7)) { - glClearBufferfv(GL_COLOR, 7, linearColor.v); - } - - if ((clearFlags & TargetBufferFlags::DEPTH_AND_STENCIL) == TargetBufferFlags::DEPTH_AND_STENCIL) { - glClearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil); - } else { +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + if (UTILS_LIKELY(!mContext.isES2())) { + if (any(clearFlags & TargetBufferFlags::COLOR0)) { + glClearBufferfv(GL_COLOR, 0, linearColor.v); + } + if (any(clearFlags & TargetBufferFlags::COLOR1)) { + glClearBufferfv(GL_COLOR, 1, linearColor.v); + } + if (any(clearFlags & TargetBufferFlags::COLOR2)) { + glClearBufferfv(GL_COLOR, 2, linearColor.v); + } + if (any(clearFlags & TargetBufferFlags::COLOR3)) { + glClearBufferfv(GL_COLOR, 3, linearColor.v); + } + if (any(clearFlags & TargetBufferFlags::COLOR4)) { + glClearBufferfv(GL_COLOR, 4, linearColor.v); + } + if (any(clearFlags & TargetBufferFlags::COLOR5)) { + glClearBufferfv(GL_COLOR, 5, linearColor.v); + } + if (any(clearFlags & TargetBufferFlags::COLOR6)) { + glClearBufferfv(GL_COLOR, 6, linearColor.v); + } + if (any(clearFlags & TargetBufferFlags::COLOR7)) { + glClearBufferfv(GL_COLOR, 7, linearColor.v); + } + if ((clearFlags & TargetBufferFlags::DEPTH_AND_STENCIL) == TargetBufferFlags::DEPTH_AND_STENCIL) { + glClearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil); + } else { + if (any(clearFlags & TargetBufferFlags::DEPTH)) { + glClearBufferfv(GL_DEPTH, 0, &depth); + } + if (any(clearFlags & TargetBufferFlags::STENCIL)) { + glClearBufferiv(GL_STENCIL, 0, &stencil); + } + } + } else +#endif + { + GLbitfield mask = 0; + if (any(clearFlags & TargetBufferFlags::COLOR0)) { + glClearColor(linearColor.r, linearColor.g, linearColor.b, linearColor.a); + mask |= GL_COLOR_BUFFER_BIT; + } if (any(clearFlags & TargetBufferFlags::DEPTH)) { - glClearBufferfv(GL_DEPTH, 0, &depth); + glClearDepthf(depth); + mask |= GL_DEPTH_BUFFER_BIT; } if (any(clearFlags & TargetBufferFlags::STENCIL)) { - glClearBufferiv(GL_STENCIL, 0, &stencil); + glClearStencil(stencil); + mask |= GL_STENCIL_BUFFER_BIT; + } + if (mask) { + glClear(mask); } } + CHECK_GL_ERROR(utils::slog.e) } -void OpenGLDriver::blit(TargetBufferFlags buffers, - Handle dst, Viewport dstRect, - Handle src, Viewport srcRect, - SamplerMagFilter filter) { +void OpenGLDriver::resolve( + Handle dst, uint8_t srcLevel, uint8_t srcLayer, + Handle src, uint8_t dstLevel, uint8_t dstLayer) { DEBUG_MARKER() - auto& gl = mContext; + GLTexture const* const s = handle_cast(src); + GLTexture const* const d = handle_cast(dst); + assert_invariant(s); + assert_invariant(d); - GLbitfield const mask = getAttachmentBitfield(buffers); - if (mask) { - GLenum glFilterMode = (filter == SamplerMagFilter::NEAREST) ? GL_NEAREST : GL_LINEAR; - if (mask & (GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) { - // GL_INVALID_OPERATION is generated if mask contains any of the GL_DEPTH_BUFFER_BIT or - // GL_STENCIL_BUFFER_BIT and filter is not GL_NEAREST. - glFilterMode = GL_NEAREST; - } + FILAMENT_CHECK_PRECONDITION(d->width == s->width && d->height == s->height) + << "invalid resolve: src and dst sizes don't match"; - // note: for msaa RenderTargets with non-msaa attachments, we copy from the msaa sidecar - // buffer -- this should produce the same output that if we copied from the resolved - // texture. EXT_multisampled_render_to_texture seems to allow both behaviours, and this - // is an emulation of that. We cannot use the resolved texture easily because it's not - // actually attached to the RenderTarget. Another implementation would be to do a - // reverse-resolve, but that wouldn't buy us anything. - GLRenderTarget const* s = handle_cast(src); - GLRenderTarget const* d = handle_cast(dst); + FILAMENT_CHECK_PRECONDITION(s->samples > 1 && d->samples == 1) + << "invalid resolve: src.samples=" << +s->samples << ", dst.samples=" << +d->samples; - // blit operations are only supported from RenderTargets that have only COLOR0 (or - // no color buffer at all) - assert_invariant( - !(s->targets & (TargetBufferFlags::COLOR_ALL & ~TargetBufferFlags::COLOR0))); + blit( dst, dstLevel, dstLayer, {}, + src, srcLevel, srcLayer, {}, + { d->width, d->height }); +} - assert_invariant( - !(d->targets & (TargetBufferFlags::COLOR_ALL & ~TargetBufferFlags::COLOR0))); +void OpenGLDriver::blit( + Handle dst, uint8_t srcLevel, uint8_t srcLayer, uint2 dstOrigin, + Handle src, uint8_t dstLevel, uint8_t dstLayer, uint2 srcOrigin, + uint2 size) { + DEBUG_MARKER() + UTILS_UNUSED_IN_RELEASE auto& gl = mContext; + assert_invariant(!gl.isES2()); - // With GLES 3.x, GL_INVALID_OPERATION is generated if the value of GL_SAMPLE_BUFFERS - // for the draw buffer is greater than zero. This works with OpenGL, so we want to - // make sure to catch this scenario. - assert_invariant(d->gl.samples <= 1); +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 - // GL_INVALID_OPERATION is generated if GL_SAMPLE_BUFFERS for the read buffer is greater - // than zero and the formats of draw and read buffers are not identical. - // However, it's not well-defined in the spec what "format" means. So it's difficult - // to have an assert here -- especially when dealing with the default framebuffer + GLTexture* d = handle_cast(dst); + GLTexture* s = handle_cast(src); + assert_invariant(d); + assert_invariant(s); - // GL_INVALID_OPERATION is generated if GL_SAMPLE_BUFFERS for the read buffer is greater - // than zero and (...) the source and destination rectangles are not defined with the - // same (X0, Y0) and (X1, Y1) bounds. + ASSERT_PRECONDITION_NON_FATAL(any(d->usage & TextureUsage::BLIT_DST), + "texture doesn't have BLIT_DST"); - // Additionally, the EXT_multisampled_render_to_texture extension doesn't specify what - // happens when blitting from an "implicit" resolve render target (does it work?), so - // to ere on the safe side, we don't allow it. - if (s->gl.samples > 1) { - assert_invariant(!memcmp(&dstRect, &srcRect, sizeof(srcRect))); - } + ASSERT_PRECONDITION_NON_FATAL(any(s->usage & TextureUsage::BLIT_SRC), + "texture doesn't have BLIT_SRC"); - gl.bindFramebuffer(GL_READ_FRAMEBUFFER, s->gl.fbo); - gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, d->gl.fbo); + ASSERT_PRECONDITION_NON_FATAL(s->format == d->format, + "src and dst texture format don't match"); - CHECK_GL_FRAMEBUFFER_STATUS(utils::slog.e, GL_READ_FRAMEBUFFER) - CHECK_GL_FRAMEBUFFER_STATUS(utils::slog.e, GL_DRAW_FRAMEBUFFER) + enum class AttachmentType : GLenum { + COLOR = GL_COLOR_ATTACHMENT0, + DEPTH = GL_DEPTH_ATTACHMENT, + STENCIL = GL_STENCIL_ATTACHMENT, + DEPTH_STENCIL = GL_DEPTH_STENCIL_ATTACHMENT, + }; - gl.disable(GL_SCISSOR_TEST); - glBlitFramebuffer( - srcRect.left, srcRect.bottom, srcRect.right(), srcRect.top(), - dstRect.left, dstRect.bottom, dstRect.right(), dstRect.top(), - mask, glFilterMode); - CHECK_GL_ERROR(utils::slog.e) - } -} + auto getFormatType = [](TextureFormat format) -> AttachmentType { + bool const depth = isDepthFormat(format); + bool const stencil = isStencilFormat(format); + if (depth && stencil) return AttachmentType::DEPTH_STENCIL; + if (depth) return AttachmentType::DEPTH; + if (stencil) return AttachmentType::STENCIL; + return AttachmentType::COLOR; + }; -void OpenGLDriver::updateTextureLodRange(GLTexture* texture, int8_t targetLevel) noexcept { - auto& gl = mContext; - if (texture && any(texture->usage & TextureUsage::SAMPLEABLE)) { - if (targetLevel < texture->gl.baseLevel || targetLevel > texture->gl.maxLevel) { - bindTexture(OpenGLContext::DUMMY_TEXTURE_BINDING, texture); - gl.activeTexture(OpenGLContext::DUMMY_TEXTURE_BINDING); - if (targetLevel < texture->gl.baseLevel) { - texture->gl.baseLevel = targetLevel; - glTexParameteri(texture->gl.target, GL_TEXTURE_BASE_LEVEL, targetLevel); + AttachmentType const type = getFormatType(d->format); + assert_invariant(type == getFormatType(s->format)); + + // GL_INVALID_OPERATION is generated if mask contains any of the GL_DEPTH_BUFFER_BIT or + // GL_STENCIL_BUFFER_BIT and filter is not GL_NEAREST. + GLbitfield mask = {}; + switch (type) { + case AttachmentType::COLOR: + mask = GL_COLOR_BUFFER_BIT; + break; + case AttachmentType::DEPTH: + mask = GL_DEPTH_BUFFER_BIT; + break; + case AttachmentType::STENCIL: + mask = GL_STENCIL_BUFFER_BIT; + break; + case AttachmentType::DEPTH_STENCIL: + mask = GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT; + break; + }; + + GLuint fbo[2] = {}; + glGenFramebuffers(2, fbo); + + gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo[0]); + switch (d->target) { + case SamplerType::SAMPLER_2D: + if (any(d->usage & TextureUsage::SAMPLEABLE)) { + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GLenum(type), + GL_TEXTURE_2D, d->gl.id, dstLevel); + } else { + glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GLenum(type), + GL_RENDERBUFFER, d->gl.id); } - if (targetLevel > texture->gl.maxLevel) { - texture->gl.maxLevel = targetLevel; - glTexParameteri(texture->gl.target, GL_TEXTURE_MAX_LEVEL, targetLevel); + break; + case SamplerType::SAMPLER_CUBEMAP: + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GLenum(type), + GL_TEXTURE_CUBE_MAP_POSITIVE_X + dstLayer, d->gl.id, dstLevel); + break; + case SamplerType::SAMPLER_2D_ARRAY: + case SamplerType::SAMPLER_CUBEMAP_ARRAY: + case SamplerType::SAMPLER_3D: + glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, GLenum(type), + d->gl.id, dstLevel, dstLayer); + break; + case SamplerType::SAMPLER_EXTERNAL: + break; + } + CHECK_GL_FRAMEBUFFER_STATUS(utils::slog.e, GL_DRAW_FRAMEBUFFER) + + gl.bindFramebuffer(GL_READ_FRAMEBUFFER, fbo[1]); + switch (s->target) { + case SamplerType::SAMPLER_2D: + if (any(s->usage & TextureUsage::SAMPLEABLE)) { + glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GLenum(type), + GL_TEXTURE_2D, s->gl.id, srcLevel); + } else { + glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GLenum(type), + GL_RENDERBUFFER, s->gl.id); } - } - CHECK_GL_ERROR(utils::slog.e) + break; + case SamplerType::SAMPLER_CUBEMAP: + glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GLenum(type), + GL_TEXTURE_CUBE_MAP_POSITIVE_X + srcLayer, s->gl.id, srcLevel); + break; + case SamplerType::SAMPLER_2D_ARRAY: + case SamplerType::SAMPLER_CUBEMAP_ARRAY: + case SamplerType::SAMPLER_3D: + glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GLenum(type), + s->gl.id, srcLevel, srcLayer); + break; + case SamplerType::SAMPLER_EXTERNAL: + break; } + CHECK_GL_FRAMEBUFFER_STATUS(utils::slog.e, GL_READ_FRAMEBUFFER) + + gl.disable(GL_SCISSOR_TEST); + glBlitFramebuffer( + srcOrigin.x, srcOrigin.y, srcOrigin.x + size.x, srcOrigin.y + size.y, + dstOrigin.x, dstOrigin.y, dstOrigin.x + size.x, dstOrigin.y + size.y, + mask, GL_NEAREST); + CHECK_GL_ERROR(utils::slog.e) + + gl.unbindFramebuffer(GL_DRAW_FRAMEBUFFER); + gl.unbindFramebuffer(GL_READ_FRAMEBUFFER); + glDeleteFramebuffers(2, fbo); +#endif } -void OpenGLDriver::draw(PipelineState state, Handle rph, uint32_t instanceCount) { +void OpenGLDriver::blitDEPRECATED(TargetBufferFlags buffers, + Handle dst, Viewport dstRect, + Handle src, Viewport srcRect, + SamplerMagFilter filter) { + + // Note: blitDEPRECATED is only used by Renderer::copyFrame + DEBUG_MARKER() - auto& gl = mContext; + UTILS_UNUSED_IN_RELEASE auto& gl = mContext; + assert_invariant(!gl.isES2()); - OpenGLProgram* p = handle_cast(state.program); + FILAMENT_CHECK_PRECONDITION(buffers == TargetBufferFlags::COLOR0) + << "blitDEPRECATED only supports COLOR0"; - // If the material debugger is enabled, avoid fatal (or cascading) errors and that can occur - // during the draw call when the program is invalid. The shader compile error has already been - // dumped to the console at this point, so it's fine to simply return early. - if (FILAMENT_ENABLE_MATDBG && UTILS_UNLIKELY(!p->isValid())) { - return; + FILAMENT_CHECK_PRECONDITION( + srcRect.left >= 0 && srcRect.bottom >= 0 && dstRect.left >= 0 && dstRect.bottom >= 0) + << "Source and destination rects must be positive."; + +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + + GLenum const glFilterMode = (filter == SamplerMagFilter::NEAREST) ? GL_NEAREST : GL_LINEAR; + + // note: for msaa RenderTargets with non-msaa attachments, we copy from the msaa sidecar + // buffer -- this should produce the same output that if we copied from the resolved + // texture. EXT_multisampled_render_to_texture seems to allow both behaviours, and this + // is an emulation of that. We cannot use the resolved texture easily because it's not + // actually attached to the RenderTarget. Another implementation would be to do a + // reverse-resolve, but that wouldn't buy us anything. + GLRenderTarget const* s = handle_cast(src); + GLRenderTarget const* d = handle_cast(dst); + + // With GLES 3.x, GL_INVALID_OPERATION is generated if the value of GL_SAMPLE_BUFFERS + // for the draw buffer is greater than zero. This works with OpenGL, so we want to + // make sure to catch this scenario. + assert_invariant(d->gl.samples <= 1); + + // GL_INVALID_OPERATION is generated if GL_SAMPLE_BUFFERS for the read buffer is greater + // than zero and the formats of draw and read buffers are not identical. + // However, it's not well-defined in the spec what "format" means. So it's difficult + // to have an assert here -- especially when dealing with the default framebuffer + + // GL_INVALID_OPERATION is generated if GL_SAMPLE_BUFFERS for the read buffer is greater + // than zero and (...) the source and destination rectangles are not defined with the + // same (X0, Y0) and (X1, Y1) bounds. + + // Additionally, the EXT_multisampled_render_to_texture extension doesn't specify what + // happens when blitting from an "implicit" resolve render target (does it work?), so + // to ere on the safe side, we don't allow it. + if (s->gl.samples > 1) { + assert_invariant(!memcmp(&dstRect, &srcRect, sizeof(srcRect))); } - useProgram(p); + gl.bindFramebuffer(GL_READ_FRAMEBUFFER, s->gl.fbo); + gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, d->gl.fbo); + + CHECK_GL_FRAMEBUFFER_STATUS(utils::slog.e, GL_READ_FRAMEBUFFER) + CHECK_GL_FRAMEBUFFER_STATUS(utils::slog.e, GL_DRAW_FRAMEBUFFER) - GLRenderPrimitive* rp = handle_cast(rph); + gl.disable(GL_SCISSOR_TEST); + glBlitFramebuffer( + srcRect.left, srcRect.bottom, srcRect.right(), srcRect.top(), + dstRect.left, dstRect.bottom, dstRect.right(), dstRect.top(), + GL_COLOR_BUFFER_BIT, glFilterMode); + CHECK_GL_ERROR(utils::slog.e) +#endif +} + +void OpenGLDriver::bindPipeline(PipelineState const& state) { + DEBUG_MARKER() + auto& gl = mContext; + setRasterState(state.rasterState); + setStencilState(state.stencilState); + gl.polygonOffset(state.polygonOffset.slope, state.polygonOffset.constant); + OpenGLProgram* const p = handle_cast(state.program); + mValidProgram = useProgram(p); + (*mCurrentPushConstants) = p->getPushConstants(); + mCurrentSetLayout = state.pipelineLayout.setLayout; + // TODO: we should validate that the pipeline layout matches the program's +} + +void OpenGLDriver::bindRenderPrimitive(Handle rph) { + DEBUG_MARKER() + auto& gl = mContext; + + GLRenderPrimitive* const rp = handle_cast(rph); // Gracefully do nothing if the render primitive has not been set up. VertexBufferHandle vb = rp->gl.vertexBufferWithObjects; if (UTILS_UNLIKELY(!vb)) { + mBoundRenderPrimitive = nullptr; return; } + // If necessary, mutate the bindings in the VAO. gl.bindVertexArray(&rp->gl); + GLVertexBuffer const* const glvb = handle_cast(vb); + updateVertexArrayObject(rp, glvb); - // If necessary, mutate the bindings in the VAO. - const GLVertexBuffer* glvb = handle_cast(vb); - if (UTILS_UNLIKELY(rp->gl.vertexBufferVersion != glvb->bufferObjectsVersion)) { - updateVertexArrayObject(rp, glvb); + mBoundRenderPrimitive = rp; +} + +void OpenGLDriver::bindDescriptorSet( + backend::DescriptorSetHandle dsh, + backend::descriptor_set_t set, + backend::DescriptorSetOffsetArray&& offsets) { + + if (UTILS_UNLIKELY(!dsh)) { + mBoundDescriptorSets[set].dsh = dsh; + mInvalidDescriptorSetBindings.set(set, true); + mInvalidDescriptorSetBindingOffsets.set(set, true); + return; } - setRasterState(state.rasterState); - setStencilState(state.stencilState); + // handle_cast<> here also serves to validate the handle (it actually cannot return nullptr) + GLDescriptorSet const* const ds = handle_cast(dsh); + if (ds) { + assert_invariant(set < MAX_DESCRIPTOR_SET_COUNT); + if (mBoundDescriptorSets[set].dsh != dsh) { + // if the descriptor itself changed, we mark this descriptor binding + // invalid -- it will be re-bound at the next draw. + mInvalidDescriptorSetBindings.set(set, true); + } else if (!offsets.empty()) { + // if we reset offsets, we mark the offsets invalid so these descriptors only can + // be re-bound at the next draw. + mInvalidDescriptorSetBindingOffsets.set(set, true); + } - gl.polygonOffset(state.polygonOffset.slope, state.polygonOffset.constant); + // `offsets` data's lifetime will end when this function returns. We have to make a copy. + // (the data is allocated inside the CommandStream) + mBoundDescriptorSets[set].dsh = dsh; + assert_invariant(offsets.data() != nullptr || ds->getDynamicBufferCount() == 0); + std::copy_n(offsets.data(), ds->getDynamicBufferCount(), + mBoundDescriptorSets[set].offsets.data()); + } +} + +void OpenGLDriver::updateDescriptors(utils::bitset8 invalidDescriptorSets) noexcept { + assert_invariant(mBoundProgram); + auto const offsetOnly = mInvalidDescriptorSetBindingOffsets & ~mInvalidDescriptorSetBindings; + invalidDescriptorSets.forEachSetBit([this, offsetOnly, + &boundDescriptorSets = mBoundDescriptorSets, + &context = mContext, + &boundProgram = *mBoundProgram](size_t set) { + assert_invariant(set < MAX_DESCRIPTOR_SET_COUNT); + auto const& entry = boundDescriptorSets[set]; + if (entry.dsh) { + GLDescriptorSet* const ds = handle_cast(entry.dsh); +#ifndef NDEBUG + if (UTILS_UNLIKELY(!offsetOnly[set])) { + // validate that this descriptor-set layout matches the layout set in the pipeline + // we don't need to do the check if only the offset is changing + ds->validate(mHandleAllocator, mCurrentSetLayout[set]); + } +#endif + ds->bind(context, mHandleAllocator, boundProgram, + set, entry.offsets.data(), offsetOnly[set]); + } + }); + mInvalidDescriptorSetBindings.clear(); + mInvalidDescriptorSetBindingOffsets.clear(); +} - setScissor(state.scissor); +void OpenGLDriver::draw2(uint32_t indexOffset, uint32_t indexCount, uint32_t instanceCount) { + DEBUG_MARKER() + assert_invariant(!mContext.isES2()); + assert_invariant(mBoundRenderPrimitive); +#if FILAMENT_ENABLE_MATDBG + if (UTILS_UNLIKELY(!mValidProgram)) { + return; + } +#endif + assert_invariant(mBoundProgram); + assert_invariant(mValidProgram); + + // When the program changes, we might have to rebind all or some descriptors + auto const invalidDescriptorSets = + mInvalidDescriptorSetBindings | mInvalidDescriptorSetBindingOffsets; + if (UTILS_UNLIKELY(invalidDescriptorSets.any())) { + updateDescriptors(invalidDescriptorSets); + } + +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + GLRenderPrimitive const* const rp = mBoundRenderPrimitive; + glDrawElementsInstanced(GLenum(rp->type), (GLsizei)indexCount, + rp->gl.getIndicesType(), + reinterpret_cast(indexOffset << rp->gl.indicesShift), + (GLsizei)instanceCount); +#endif - if (UTILS_LIKELY(instanceCount <= 1)) { - glDrawRangeElements(GLenum(rp->type), rp->minIndex, rp->maxIndex, (GLsizei)rp->count, - rp->gl.getIndicesType(), reinterpret_cast(rp->offset)); - } else { - glDrawElementsInstanced(GLenum(rp->type), (GLsizei)rp->count, - rp->gl.getIndicesType(), reinterpret_cast(rp->offset), - (GLsizei)instanceCount); +#if FILAMENT_ENABLE_MATDBG + CHECK_GL_ERROR_NON_FATAL(utils::slog.e) +#else + CHECK_GL_ERROR(utils::slog.e) +#endif +} + +// This is the ES2 version of draw2(). +void OpenGLDriver::draw2GLES2(uint32_t indexOffset, uint32_t indexCount, uint32_t instanceCount) { + DEBUG_MARKER() + assert_invariant(mContext.isES2()); + assert_invariant(mBoundRenderPrimitive); +#if FILAMENT_ENABLE_MATDBG + if (UTILS_UNLIKELY(!mValidProgram)) { + return; + } +#endif + assert_invariant(mBoundProgram); + assert_invariant(mValidProgram); + + // When the program changes, we might have to rebind all or some descriptors + auto const invalidDescriptorSets = + mInvalidDescriptorSetBindings | mInvalidDescriptorSetBindingOffsets; + if (UTILS_UNLIKELY(invalidDescriptorSets.any())) { + updateDescriptors(invalidDescriptorSets); } -#ifdef FILAMENT_ENABLE_MATDBG + GLRenderPrimitive const* const rp = mBoundRenderPrimitive; + assert_invariant(instanceCount == 1); + glDrawElements(GLenum(rp->type), (GLsizei)indexCount, rp->gl.getIndicesType(), + reinterpret_cast(indexOffset << rp->gl.indicesShift)); + +#if FILAMENT_ENABLE_MATDBG CHECK_GL_ERROR_NON_FATAL(utils::slog.e) #else CHECK_GL_ERROR(utils::slog.e) #endif } +void OpenGLDriver::scissor(Viewport scissor) { + DEBUG_MARKER() + setScissor(scissor); +} + +void OpenGLDriver::draw(PipelineState state, Handle rph, + uint32_t const indexOffset, uint32_t const indexCount, uint32_t const instanceCount) { + DEBUG_MARKER() + GLRenderPrimitive* const rp = handle_cast(rph); + state.primitiveType = rp->type; + state.vertexBufferInfo = rp->vbih; + bindPipeline(state); + bindRenderPrimitive(rph); + if (UTILS_UNLIKELY(mContext.isES2())) { + draw2GLES2(indexOffset, indexCount, instanceCount); + } else { + draw2(indexOffset, indexCount, instanceCount); + } +} + void OpenGLDriver::dispatchCompute(Handle program, math::uint3 workGroupCount) { - executeRenderPassOps(); + DEBUG_MARKER() + getShaderCompilerService().tick(); - OpenGLProgram* p = handle_cast(program); + OpenGLProgram* const p = handle_cast(program); - // If the material debugger is enabled, avoid fatal (or cascading) errors and that can occur - // during the draw call when the program is invalid. The shader compile error has already been - // dumped to the console at this point, so it's fine to simply return early. - if (FILAMENT_ENABLE_MATDBG && UTILS_UNLIKELY(!p->isValid())) { + bool const success = useProgram(p); + if (UTILS_UNLIKELY(!success)) { + // Avoid fatal (or cascading) errors that can occur during the draw call when the program + // is invalid. The shader compile error has already been dumped to the console at this + // point, so it's fine to simply return early. return; } - useProgram(p); - -#if defined(GL_ES_VERSION_3_1) || defined(GL_VERSION_4_3) +#if defined(BACKEND_OPENGL_LEVEL_GLES31) #if defined(__ANDROID__) // on Android, GLES3.1 and above entry-points are defined in glext @@ -3212,9 +4076,9 @@ void OpenGLDriver::dispatchCompute(Handle program, math::uint3 workGr #endif glDispatchCompute(workGroupCount.x, workGroupCount.y, workGroupCount.z); -#endif +#endif // BACKEND_OPENGL_LEVEL_GLES31 -#ifdef FILAMENT_ENABLE_MATDBG +#if FILAMENT_ENABLE_MATDBG CHECK_GL_ERROR_NON_FATAL(utils::slog.e) #else CHECK_GL_ERROR(utils::slog.e) diff --git a/filament/backend/src/opengl/OpenGLDriver.h b/filament/backend/src/opengl/OpenGLDriver.h index d9c8b9ccff0..29ea32c776d 100644 --- a/filament/backend/src/opengl/OpenGLDriver.h +++ b/filament/backend/src/opengl/OpenGLDriver.h @@ -18,26 +18,48 @@ #define TNT_FILAMENT_BACKEND_OPENGL_OPENGLDRIVER_H #include "DriverBase.h" -#include "GLUtils.h" #include "OpenGLContext.h" - -#include "private/backend/Driver.h" -#include "private/backend/HandleAllocator.h" +#include "OpenGLTimerQuery.h" +#include "GLBufferObject.h" +#include "GLDescriptorSet.h" +#include "GLDescriptorSetLayout.h" +#include "GLTexture.h" +#include "ShaderCompilerService.h" #include #include +#include +#include +#include #include #include +#include "private/backend/Driver.h" +#include "private/backend/HandleAllocator.h" + +#include +#include #include -#include +#include #include #include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include #ifndef FILAMENT_OPENGL_HANDLE_ARENA_SIZE_IN_MB # define FILAMENT_OPENGL_HANDLE_ARENA_SIZE_IN_MB 4 @@ -48,20 +70,22 @@ namespace filament::backend { class OpenGLPlatform; class PixelBufferDescriptor; struct TargetBufferInfo; - class OpenGLProgram; -class OpenGLTimerQueryInterface; +class TimerQueryFactoryInterface; +struct PushConstantBundle; class OpenGLDriver final : public DriverBase { - inline explicit OpenGLDriver(OpenGLPlatform* platform, const Platform::DriverConfig& driverConfig) noexcept; + inline explicit OpenGLDriver(OpenGLPlatform* platform, + const Platform::DriverConfig& driverConfig) noexcept; ~OpenGLDriver() noexcept final; Dispatcher getDispatcher() const noexcept final; public: - static Driver* create(OpenGLPlatform* platform, void* sharedGLContext, const Platform::DriverConfig& driverConfig) noexcept; + static Driver* create(OpenGLPlatform* platform, void* sharedGLContext, + const Platform::DriverConfig& driverConfig) noexcept; class DebugMarker { - OpenGLDriver& driver; + UTILS_UNUSED OpenGLDriver& driver; public: DebugMarker(OpenGLDriver& driver, const char* string) noexcept; ~DebugMarker() noexcept; @@ -69,22 +93,27 @@ class OpenGLDriver final : public DriverBase { // OpenGLDriver specific fields - struct GLBufferObject : public HwBufferObject { - using HwBufferObject::HwBufferObject; - GLBufferObject(uint32_t size, - BufferObjectBinding bindingType, BufferUsage usage) noexcept - : HwBufferObject(size), usage(usage) { - gl.binding = GLUtils::getBufferBindingType(bindingType); + struct GLSwapChain : public HwSwapChain { + using HwSwapChain::HwSwapChain; + bool rec709 = false; + }; + + struct GLVertexBufferInfo : public HwVertexBufferInfo { + GLVertexBufferInfo() noexcept = default; + GLVertexBufferInfo(uint8_t bufferCount, uint8_t attributeCount, + AttributeArray const& attributes) + : HwVertexBufferInfo(bufferCount, attributeCount), + attributes(attributes) { } - struct { - GLuint id = 0; - GLenum binding = 0; - } gl; - BufferUsage usage = {}; + AttributeArray attributes; }; struct GLVertexBuffer : public HwVertexBuffer { - using HwVertexBuffer::HwVertexBuffer; + GLVertexBuffer() noexcept = default; + GLVertexBuffer(uint32_t vertexCount, Handle vbih) + : HwVertexBuffer(vertexCount), vbih(vbih) { + } + Handle vbih; struct { // 4 * MAX_VERTEX_ATTRIBUTE_COUNT bytes std::array buffers{}; @@ -98,57 +127,21 @@ class OpenGLDriver final : public DriverBase { } gl; }; - struct GLTexture; - struct GLSamplerGroup : public HwSamplerGroup { - using HwSamplerGroup::HwSamplerGroup; - struct Entry { - GLTexture const* texture = nullptr; - GLuint sampler = 0u; - }; - utils::FixedCapacityVector textureUnitEntries; - explicit GLSamplerGroup(size_t size) noexcept : textureUnitEntries(size) { } - }; - struct GLRenderPrimitive : public HwRenderPrimitive { using HwRenderPrimitive::HwRenderPrimitive; OpenGLContext::RenderPrimitive gl; + Handle vbih; }; - struct GLTexture : public HwTexture { - using HwTexture::HwTexture; - struct GL { - GL() noexcept : imported(false), sidecarSamples(1), reserved(0) {} - GLuint id = 0; // texture or renderbuffer id - GLenum target = 0; - GLenum internalFormat = 0; - GLuint sidecarRenderBufferMS = 0; // multi-sample sidecar renderbuffer - mutable GLsync fence = {}; - - // texture parameters go here too - GLfloat anisotropy = 1.0; - int8_t baseLevel = 127; - int8_t maxLevel = -1; - uint8_t targetIndex = 0; // optimization: index corresponding to target - bool imported : 1; - uint8_t sidecarSamples : 4; - uint8_t reserved : 3; - } gl; + using GLBufferObject = filament::backend::GLBufferObject; - OpenGLPlatform::ExternalTexture* externalTexture = nullptr; - }; + using GLTexture = filament::backend::GLTexture; - struct GLTimerQuery : public HwTimerQuery { - struct State { - std::atomic elapsed{}; - std::atomic_bool available{}; - }; - struct { - GLuint query = 0; - std::shared_ptr emulation; - } gl; - // 0 means not available, otherwise query result in ns. - std::atomic elapsed{}; - }; + using GLTimerQuery = filament::backend::GLTimerQuery; + + using GLDescriptorSetLayout = filament::backend::GLDescriptorSetLayout; + + using GLDescriptorSet = filament::backend::GLDescriptorSet; struct GLStream : public HwStream { using HwStream::HwStream; @@ -179,29 +172,37 @@ class OpenGLDriver final : public DriverBase { mutable GLuint fbo_read = 0; mutable TargetBufferFlags resolve = TargetBufferFlags::NONE; // attachments in fbo_draw to resolve uint8_t samples = 1; + bool isDefault = false; } gl; TargetBufferFlags targets = {}; }; - struct GLSync : public HwSync { - using HwSync::HwSync; + struct GLFence : public HwFence { + using HwFence::HwFence; struct State { - std::atomic status{ GL_TIMEOUT_EXPIRED }; + std::mutex lock; + std::condition_variable cond; + FenceStatus status{ FenceStatus::TIMEOUT_EXPIRED }; }; - struct { - GLsync sync; - } gl; - std::shared_ptr result{ std::make_shared() }; + std::shared_ptr state{ std::make_shared() }; }; OpenGLDriver(OpenGLDriver const&) = delete; OpenGLDriver& operator=(OpenGLDriver const&) = delete; private: + OpenGLPlatform& mPlatform; OpenGLContext mContext; + ShaderCompilerService mShaderCompilerService; + friend class TimerQueryFactory; + friend class TimerQueryNativeFactory; OpenGLContext& getContext() noexcept { return mContext; } + ShaderCompilerService& getShaderCompilerService() noexcept { + return mShaderCompilerService; + } + ShaderModel getShaderModel() const noexcept final; /* @@ -229,13 +230,13 @@ class OpenGLDriver final : public DriverBase { HandleAllocatorGL mHandleAllocator; template - Handle initHandle(ARGS&& ... args) noexcept { + Handle initHandle(ARGS&& ... args) { return mHandleAllocator.allocateAndConstruct(std::forward(args) ...); } template typename std::enable_if::value, D>::type* - construct(Handle const& handle, ARGS&& ... args) noexcept { + construct(Handle const& handle, ARGS&& ... args) { return mHandleAllocator.destroyAndConstruct(handle, std::forward(args) ...); } @@ -249,19 +250,25 @@ class OpenGLDriver final : public DriverBase { typename std::enable_if_t< std::is_pointer_v && std::is_base_of_v>, Dp> - handle_cast(Handle& handle) noexcept { + handle_cast(Handle& handle) { return mHandleAllocator.handle_cast(handle); } + template + bool is_valid(Handle& handle) { + return mHandleAllocator.is_valid(handle); + } + template inline typename std::enable_if_t< std::is_pointer_v && std::is_base_of_v>, Dp> - handle_cast(Handle const& handle) noexcept { + handle_cast(Handle const& handle) { return mHandleAllocator.handle_cast(handle); } friend class OpenGLProgram; + friend class ShaderCompilerService; /* Extension management... */ @@ -274,7 +281,7 @@ class OpenGLDriver final : public DriverBase { void updateVertexArrayObject(GLRenderPrimitive* rp, GLVertexBuffer const* vb); void framebufferTexture(TargetBufferInfo const& binfo, - GLRenderTarget const* rt, GLenum attachment) noexcept; + GLRenderTarget const* rt, GLenum attachment, uint8_t layerCount) noexcept; void setRasterState(RasterState rs) noexcept; @@ -295,40 +302,22 @@ class OpenGLDriver final : public DriverBase { void renderBufferStorage(GLuint rbo, GLenum internalformat, uint32_t width, uint32_t height, uint8_t samples) const noexcept; - void textureStorage(GLTexture* t, - uint32_t width, uint32_t height, uint32_t depth) noexcept; + void textureStorage(OpenGLDriver::GLTexture* t, uint32_t width, uint32_t height, + uint32_t depth, bool useProtectedMemory) noexcept; /* State tracking GL wrappers... */ void bindTexture(GLuint unit, GLTexture const* t) noexcept; void bindSampler(GLuint unit, GLuint sampler) noexcept; - inline void useProgram(OpenGLProgram* p) noexcept; + inline bool useProgram(OpenGLProgram* p) noexcept; enum class ResolveAction { LOAD, STORE }; void resolvePass(ResolveAction action, GLRenderTarget const* rt, TargetBufferFlags discardFlags) noexcept; - GLuint getSamplerSlow(SamplerParams sp) const noexcept; - - inline GLuint getSampler(SamplerParams sp) const noexcept { - assert_invariant(!sp.padding0); - assert_invariant(!sp.padding1); - assert_invariant(!sp.padding2); - auto& samplerMap = mSamplerMap; - auto pos = samplerMap.find(sp.u); - if (UTILS_UNLIKELY(pos == samplerMap.end())) { - return getSamplerSlow(sp); - } - return pos->second; - } - - const std::array& getSamplerBindings() const { - return mSamplerBindings; - } - using AttachmentArray = std::array; - static GLsizei getAttachments(AttachmentArray& attachments, - GLRenderTarget const* rt, TargetBufferFlags buffers) noexcept; + static GLsizei getAttachments(AttachmentArray& attachments, TargetBufferFlags buffers, + bool isDefaultFramebuffer) noexcept; // state required to represent the current render pass Handle mRenderPassTarget; @@ -337,15 +326,27 @@ class OpenGLDriver final : public DriverBase { GLboolean mRenderPassDepthWrite{}; GLboolean mRenderPassStencilWrite{}; + GLRenderPrimitive const* mBoundRenderPrimitive = nullptr; + OpenGLProgram* mBoundProgram = nullptr; + bool mValidProgram = false; + utils::bitset8 mInvalidDescriptorSetBindings; + utils::bitset8 mInvalidDescriptorSetBindingOffsets; + void updateDescriptors(utils::bitset8 invalidDescriptorSets) noexcept; + + struct { + backend::DescriptorSetHandle dsh; + std::array offsets; + } mBoundDescriptorSets[MAX_DESCRIPTOR_SET_COUNT]; + void clearWithRasterPipe(TargetBufferFlags clearFlags, math::float4 const& linearColor, GLfloat depth, GLint stencil) noexcept; void setScissor(Viewport const& scissor) noexcept; - // sampler buffer binding points (nullptr if not used) - std::array mSamplerBindings = {}; // 4 pointers + void draw2GLES2(uint32_t indexOffset, uint32_t indexCount, uint32_t instanceCount); - mutable tsl::robin_map mSamplerMap; + // ES2 only. Uniform buffer emulation binding points + GLuint mLastAssignedEmulatedUboId = 0; // this must be accessed from the driver thread only std::vector mTexturesWithStreamsAttached; @@ -357,28 +358,30 @@ class OpenGLDriver final : public DriverBase { void detachStream(GLTexture* t) noexcept; void replaceStream(GLTexture* t, GLStream* stream) noexcept; - OpenGLPlatform& mPlatform; - - void updateTextureLodRange(GLTexture* texture, int8_t targetLevel) noexcept; - +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 // tasks executed on the main thread after the fence signaled - void whenGpuCommandsComplete(std::function fn) noexcept; + void whenGpuCommandsComplete(const std::function& fn) noexcept; void executeGpuCommandsCompleteOps() noexcept; std::vector>> mGpuCommandCompleteOps; + void whenFrameComplete(const std::function& fn) noexcept; + std::vector> mFrameCompleteOps; +#endif + // tasks regularly executed on the main thread at until they return true void runEveryNowAndThen(std::function fn) noexcept; void executeEveryNowAndThenOps() noexcept; std::vector> mEveryNowAndThenOps; - void runAtNextRenderPass(void* token, std::function fn) noexcept; - void executeRenderPassOps() noexcept; - void cancelRunAtNextPassOp(void* token) noexcept; - tsl::robin_map> mRunAtNextRenderPassOps; + const Platform::DriverConfig mDriverConfig; + Platform::DriverConfig const& getDriverConfig() const noexcept { return mDriverConfig; } + + // for ES2 sRGB support + GLSwapChain* mCurrentDrawSwapChain = nullptr; + bool mRec709OutputColorspace = false; - // timer query implementation - OpenGLTimerQueryInterface* mTimerQueryImpl = nullptr; - bool mFrameTimeSupported = false; + PushConstantBundle* mCurrentPushConstants = nullptr; + PipelineLayout::SetLayout mCurrentSetLayout; }; // ------------------------------------------------------------------------------------------------ diff --git a/filament/backend/src/opengl/OpenGLPlatform.cpp b/filament/backend/src/opengl/OpenGLPlatform.cpp index 5a2645b2eab..94c3b991126 100644 --- a/filament/backend/src/opengl/OpenGLPlatform.cpp +++ b/filament/backend/src/opengl/OpenGLPlatform.cpp @@ -18,6 +18,17 @@ #include "OpenGLDriverFactory.h" +#include +#include +#include + +#include + +#include +#include +#include +#include + namespace filament::backend { Driver* OpenGLPlatform::createDefaultDriver(OpenGLPlatform* platform, @@ -27,10 +38,37 @@ Driver* OpenGLPlatform::createDefaultDriver(OpenGLPlatform* platform, OpenGLPlatform::~OpenGLPlatform() noexcept = default; -uint32_t OpenGLPlatform::createDefaultRenderTarget() noexcept { +void OpenGLPlatform::makeCurrent(SwapChain* drawSwapChain, SwapChain* readSwapChain, + utils::Invocable, utils::Invocable) noexcept { + makeCurrent(getCurrentContextType(), drawSwapChain, readSwapChain); +} + +bool OpenGLPlatform::isProtectedContextSupported() const noexcept { + return false; +} + +bool OpenGLPlatform::isSRGBSwapChainSupported() const noexcept { + return false; +} + +uint32_t OpenGLPlatform::getDefaultFramebufferObject() noexcept { return 0; } +void OpenGLPlatform::beginFrame(int64_t monotonic_clock_ns, int64_t refreshIntervalNs, + uint32_t frameId) noexcept { +} + +void OpenGLPlatform::endFrame(uint32_t frameId) noexcept { +} + +void OpenGLPlatform::preCommit() noexcept { +} + +OpenGLPlatform::ContextType OpenGLPlatform::getCurrentContextType() const noexcept { + return ContextType::UNPROTECTED; +} + void OpenGLPlatform::setPresentationTime( UTILS_UNUSED int64_t presentationTimeInNanosecond) noexcept { } @@ -101,5 +139,22 @@ AcquiredImage OpenGLPlatform::transformAcquiredImage(AcquiredImage source) noexc return source; } +TargetBufferFlags OpenGLPlatform::getPreservedFlags(UTILS_UNUSED SwapChain*) noexcept { + return TargetBufferFlags::NONE; +} + +bool OpenGLPlatform::isSwapChainProtected(UTILS_UNUSED SwapChain*) noexcept { + return false; +} + +bool OpenGLPlatform::isExtraContextSupported() const noexcept { + return false; +} + +void OpenGLPlatform::createContext(bool) { +} + +void OpenGLPlatform::releaseContext() noexcept { +} } // namespace filament::backend diff --git a/filament/backend/src/opengl/OpenGLProgram.cpp b/filament/backend/src/opengl/OpenGLProgram.cpp index 274c052f5ec..b4552d5c21c 100644 --- a/filament/backend/src/opengl/OpenGLProgram.cpp +++ b/filament/backend/src/opengl/OpenGLProgram.cpp @@ -16,16 +16,31 @@ #include "OpenGLProgram.h" +#include "GLUtils.h" +#include "GLTexture.h" #include "OpenGLDriver.h" +#include "ShaderCompilerService.h" -#include +#include +#include +#include + +#include #include -#include #include +#include +#include +#include -#include +#include +#include +#include +#include +#include +#include -#include +#include +#include namespace filament::backend { @@ -33,450 +48,274 @@ using namespace filament::math; using namespace utils; using namespace backend; -static void logCompilationError(utils::io::ostream& out, - ShaderStage shaderType, const char* name, - GLuint shaderId, CString const& sourceCode) noexcept; +struct OpenGLProgram::LazyInitializationData { + Program::DescriptorSetInfo descriptorBindings; + Program::BindingUniformsInfo bindingUniformInfo; + utils::FixedCapacityVector vertexPushConstants; + utils::FixedCapacityVector fragmentPushConstants; +}; -static void logProgramLinkError(utils::io::ostream& out, - const char* name, GLuint program) noexcept; -OpenGLProgram::OpenGLProgram() noexcept - : mInitialized(false), mValid(true), mLazyInitializationData(nullptr) { -} +OpenGLProgram::OpenGLProgram() noexcept = default; + +OpenGLProgram::OpenGLProgram(OpenGLDriver& gld, Program&& program) noexcept + : HwProgram(std::move(program.getName())), mRec709Location(-1) { + auto* const lazyInitializationData = new(std::nothrow) LazyInitializationData(); + if (UTILS_UNLIKELY(gld.getContext().isES2())) { + lazyInitializationData->bindingUniformInfo = std::move(program.getBindingUniformInfo()); + } + lazyInitializationData->vertexPushConstants = std::move(program.getPushConstants(ShaderStage::VERTEX)); + lazyInitializationData->fragmentPushConstants = std::move(program.getPushConstants(ShaderStage::FRAGMENT)); + lazyInitializationData->descriptorBindings = std::move(program.getDescriptorBindings()); -OpenGLProgram::OpenGLProgram(OpenGLDriver& gld, Program&& programBuilder) noexcept - : HwProgram(std::move(programBuilder.getName())), - mInitialized(false), mValid(true), - mLazyInitializationData{ new(LazyInitializationData) } { - - OpenGLContext& context = gld.getContext(); - - mLazyInitializationData->uniformBlockInfo = std::move(programBuilder.getUniformBlockBindings()); - mLazyInitializationData->samplerGroupInfo = std::move(programBuilder.getSamplerGroupInfo()); - - // this cannot fail because we check compilation status after linking the program - // shaders[] is filled with id of shader stages present. - OpenGLProgram::compileShaders(context, - std::move(programBuilder.getShadersSource()), - programBuilder.getSpecializationConstants(), - gl.shaders, - mLazyInitializationData->shaderSourceCode); - - gld.runAtNextRenderPass(this, [this]() { - // by this point we must not have a GL program - assert_invariant(!gl.program); - // we also can't be in the initialized state - assert_invariant(!mInitialized); - // we must have our lazy initialization data - assert_invariant(mLazyInitializationData); - // link the program, this also cannot fail because status is checked later. - gl.program = OpenGLProgram::linkProgram(gl.shaders); - }); + ShaderCompilerService& compiler = gld.getShaderCompilerService(); + mToken = compiler.createProgram(name, std::move(program)); + + ShaderCompilerService::setUserData(mToken, lazyInitializationData); } OpenGLProgram::~OpenGLProgram() noexcept { - if (!mInitialized) { - // mLazyInitializationData is aliased with mIndicesRuns - delete mLazyInitializationData; + if (mToken) { + // if the token is non-nullptr it means the program has not been used, and + // we need to clean-up. + assert_invariant(gl.program == 0); + + LazyInitializationData* const lazyInitializationData = + (LazyInitializationData *)ShaderCompilerService::getUserData(mToken); + delete lazyInitializationData; + + ShaderCompilerService::terminate(mToken); } + + delete [] mUniformsRecords; const GLuint program = gl.program; - UTILS_NOUNROLL - for (GLuint const shader: gl.shaders) { - if (shader) { - if (program) { - glDetachShader(program, shader); - } - glDeleteShader(shader); - } - } if (program) { glDeleteProgram(program); } } -/* - * Compile shaders in the ShaderSource. This cannot fail because compilation failures are not - * checked until after the program is linked. - * This always returns the GL shader IDs or zero a shader stage is not present. - */ -void OpenGLProgram::compileShaders(OpenGLContext& context, - Program::ShaderSource shadersSource, - utils::FixedCapacityVector const& specializationConstants, - GLuint shaderIds[Program::SHADER_TYPE_COUNT], - UTILS_UNUSED_IN_RELEASE std::array& outShaderSourceCode) noexcept { - - std::string specializationConstantString; - for (auto const& sc : specializationConstants) { - specializationConstantString += "#define SPIRV_CROSS_CONSTANT_ID_" + std::to_string(sc.id) + ' '; - specializationConstantString += std::visit([](auto&& arg) { - return std::to_string(arg); - }, sc.value); - specializationConstantString += '\n'; - } - if (!specializationConstantString.empty()) { - specializationConstantString += '\n'; - } - - // build all shaders - UTILS_NOUNROLL - for (size_t i = 0; i < Program::SHADER_TYPE_COUNT; i++) { - const ShaderStage stage = static_cast(i); - GLenum glShaderType; - switch (stage) { - case ShaderStage::VERTEX: glShaderType = GL_VERTEX_SHADER; break; - case ShaderStage::FRAGMENT: glShaderType = GL_FRAGMENT_SHADER; break; - case ShaderStage::COMPUTE: glShaderType = GL_COMPUTE_SHADER; break; - } - - if (UTILS_LIKELY(!shadersSource[i].empty())) { - Program::ShaderBlob& shader = shadersSource[i]; - - // remove GOOGLE_cpp_style_line_directive - std::string_view const source = process_GOOGLE_cpp_style_line_directive(context, - reinterpret_cast(shader.data()), shader.size()); - - // add support for ARB_shading_language_packing if needed - auto const packingFunctions = process_ARB_shading_language_packing(context); - - // split shader source, so we can insert the specification constants and the packing functions - auto const [prolog, body] = splitShaderSource(source); - - const std::array sources = { - prolog.data(), - specializationConstantString.c_str(), - packingFunctions.data(), - body.data() - }; - - const std::array lengths = { - (GLint)prolog.length(), - (GLint)specializationConstantString.length(), - (GLint)packingFunctions.length(), - (GLint)body.length() - 1 // null terminated - }; - - GLuint const shaderId = glCreateShader(glShaderType); - glShaderSource(shaderId, sources.size(), sources.data(), lengths.data()); - glCompileShader(shaderId); - -#ifndef NDEBUG - // for debugging we return the original shader source (without the modifications we - // made here), otherwise the line numbers wouldn't match. - outShaderSourceCode[i] = { source.data(), source.length() }; -#endif - - shaderIds[i] = shaderId; - } - } -} - -// If usages of the Google-style line directive are present, remove them, as some -// drivers don't allow the quotation marks. This happens in-place. -std::string_view OpenGLProgram::process_GOOGLE_cpp_style_line_directive(OpenGLContext& context, - char* source, size_t len) noexcept { - if (!context.ext.GOOGLE_cpp_style_line_directive) { - if (UTILS_UNLIKELY(requestsGoogleLineDirectivesExtension({ source, len }))) { - removeGoogleLineDirectives(source, len); // length is unaffected - } - } - return { source, len }; -} +void OpenGLProgram::initialize(OpenGLDriver& gld) { -// Tragically, OpenGL 4.1 doesn't support unpackHalf2x16 and -// macOS doesn't support GL_ARB_shading_language_packing -std::string_view OpenGLProgram::process_ARB_shading_language_packing(OpenGLContext& context) noexcept { - using namespace std::literals; - if constexpr (BACKEND_OPENGL_VERSION == BACKEND_OPENGL_VERSION_GL) { - if (context.state.major == 4 && context.state.minor == 1 && - !context.ext.ARB_shading_language_packing) { - return R"( - -// these don't handle denormals, NaNs or inf -float u16tofp32(highp uint v) { - v <<= 16u; - highp uint s = v & 0x80000000u; - highp uint n = v & 0x7FFFFFFFu; - highp uint nz = n == 0u ? 0u : 0xFFFFFFFF; - return uintBitsToFloat(s | ((((n >> 3u) + (0x70u << 23))) & nz)); -} -vec2 unpackHalf2x16(highp uint v) { - return vec2(u16tofp32(v&0xFFFFu), u16tofp32(v>>16u)); -} -uint fp32tou16(float val) { - uint f32 = floatBitsToUint(val); - uint f16 = 0u; - uint sign = (f32 >> 16) & 0x8000u; - int exponent = int((f32 >> 23) & 0xFFu) - 127; - uint mantissa = f32 & 0x007FFFFFu; - if (exponent > 15) { - f16 = sign | (0x1Fu << 10); - } else if (exponent > -15) { - exponent += 15; - mantissa >>= 13; - f16 = sign | uint(exponent << 10) | mantissa; - } else { - f16 = sign; - } - return f16; -} -highp uint packHalf2x16(vec2 v) { - highp uint x = fp32tou16(v.x); - highp uint y = fp32tou16(v.y); - return (y << 16) | x; -} -)"sv; - } - } - return ""sv; -} + SYSTRACE_CALL(); -// split shader source code in two, the first section goes from the start to the line after the -// last #extension, and the 2nd part goes from there to the end. -std::array OpenGLProgram::splitShaderSource(std::string_view source) noexcept { - auto start = source.find("#version"); - assert_invariant(start != std::string_view::npos); - - auto pos = source.rfind("\n#extension"); - if (pos == std::string_view::npos) { - pos = start; - } else { - ++pos; - } + assert_invariant(gl.program == 0); + assert_invariant(mToken); - auto eol = source.find('\n', pos) + 1; - assert_invariant(eol != std::string_view::npos); + LazyInitializationData* const lazyInitializationData = + (LazyInitializationData *)ShaderCompilerService::getUserData(mToken); - std::string_view const version = source.substr(start, eol - start); - std::string_view const body = source.substr(version.length(), source.length() - version.length()); - return { version, body }; -} + ShaderCompilerService& compiler = gld.getShaderCompilerService(); + gl.program = compiler.getProgram(mToken); -/* - * Create a program from the given shader IDs and links it. This cannot fail because errors - * are checked later. This always returns a valid GL program ID (which doesn't mean the - * program itself is valid). - */ -GLuint OpenGLProgram::linkProgram(const GLuint shaderIds[Program::SHADER_TYPE_COUNT]) noexcept { - GLuint const program = glCreateProgram(); - for (size_t i = 0; i < Program::SHADER_TYPE_COUNT; i++) { - if (shaderIds[i]) { - glAttachShader(program, shaderIds[i]); - } + assert_invariant(mToken == nullptr); + if (gl.program) { + assert_invariant(lazyInitializationData); + initializeProgramState(gld.getContext(), gl.program, *lazyInitializationData); + delete lazyInitializationData; } - glLinkProgram(program); - return program; } /* - * Checks a program link status and logs errors and frees resources on failure. - * Returns true on success. + * Initializes our internal state from a valid program. This must only be called after + * checkProgramStatus() has been successfully called. */ -bool OpenGLProgram::checkProgramStatus(const char* name, - GLuint& program, GLuint shaderIds[Program::SHADER_TYPE_COUNT], - std::array const& shaderSourceCode) noexcept { - - GLint status; - glGetProgramiv(program, GL_LINK_STATUS, &status); - if (UTILS_LIKELY(status == GL_TRUE)) { - return true; - } - - // only if the link fails, we check the compilation status - UTILS_NOUNROLL - for (size_t i = 0; i < Program::SHADER_TYPE_COUNT; i++) { - const ShaderStage type = static_cast(i); - const GLuint shader = shaderIds[i]; - if (shader) { - glGetShaderiv(shader, GL_COMPILE_STATUS, &status); - if (status != GL_TRUE) { - logCompilationError(slog.e, type, name, shader, shaderSourceCode[i]); - } - glDetachShader(program, shader); - glDeleteShader(shader); - shaderIds[i] = 0; - } - } - // log the link error as well - logProgramLinkError(slog.e, name, program); - glDeleteProgram(program); - program = 0; - return false; -} - -void OpenGLProgram::initialize(OpenGLContext& context) { - // by this point we must have a GL program - assert_invariant(gl.program); - // we also can't be in the initialized state - assert_invariant(!mInitialized); - // we must have our lazy initialization data - assert_invariant(mLazyInitializationData); +void OpenGLProgram::initializeProgramState(OpenGLContext& context, GLuint program, + LazyInitializationData& lazyInitializationData) noexcept { - // we must copy mLazyInitializationData locally because it is aliased with mIndicesRuns - auto* const initializationData = mLazyInitializationData; + SYSTRACE_CALL(); - // check status of program linking and shader compilation, logs error and free all resources - // in case of error. - mValid = OpenGLProgram::checkProgramStatus(name.c_str_safe(), - gl.program, gl.shaders, initializationData->shaderSourceCode); + // from the pipeline layout we compute a mapping from {set, binding} to {binding} + // for both buffers and textures - if (UTILS_LIKELY(mValid)) { - initializeProgramState(context, gl.program, *initializationData); + for (auto&& entry: lazyInitializationData.descriptorBindings) { + std::sort(entry.begin(), entry.end(), + [](Program::Descriptor const& lhs, Program::Descriptor const& rhs) { + return lhs.binding < rhs.binding; + }); } - // and destroy all temporary init data - delete initializationData; - // mInitialized means mLazyInitializationData is no more valid - mInitialized = true; -} + GLuint tmu = 0; + GLuint binding = 0; -/* - * Initializes our internal state from a valid program. This must only be called after - * checkProgramStatus() has been successfully called. - */ -void OpenGLProgram::initializeProgramState(OpenGLContext& context, GLuint program, - LazyInitializationData const& lazyInitializationData) noexcept { + // needed for samplers + context.useProgram(program); - // Note: This is only needed, because the layout(binding=) syntax is not permitted in glsl - // (ES3.0 and GL4.1). The backend needs a way to associate a uniform block to a binding point. UTILS_NOUNROLL - for (GLuint binding = 0, n = lazyInitializationData.uniformBlockInfo.size(); binding < n; binding++) { - auto const& name = lazyInitializationData.uniformBlockInfo[binding]; - if (!name.empty()) { - GLuint const index = glGetUniformBlockIndex(program, name.c_str()); - if (index != GL_INVALID_INDEX) { - glUniformBlockBinding(program, index, binding); + for (backend::descriptor_set_t set = 0; set < MAX_DESCRIPTOR_SET_COUNT; set++) { + for (Program::Descriptor const& entry: lazyInitializationData.descriptorBindings[set]) { + switch (entry.type) { + case DescriptorType::UNIFORM_BUFFER: + case DescriptorType::SHADER_STORAGE_BUFFER: { + if (!entry.name.empty()) { +#ifndef FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + if (UTILS_LIKELY(!context.isES2())) { + GLuint const index = glGetUniformBlockIndex(program, + entry.name.c_str()); + if (index != GL_INVALID_INDEX) { + // this can fail if the program doesn't use this descriptor + glUniformBlockBinding(program, index, binding); + mBindingMap.insert(set, entry.binding, + { binding, entry.type }); + ++binding; + } + } else +#endif + { + auto pos = std::find_if(lazyInitializationData.bindingUniformInfo.begin(), + lazyInitializationData.bindingUniformInfo.end(), + [&name = entry.name](const auto& item) { + return std::get<1>(item) == name; + }); + if (pos != lazyInitializationData.bindingUniformInfo.end()) { + binding = std::get<0>(*pos); + mBindingMap.insert(set, entry.binding, { binding, entry.type }); + } + } + } + break; + } + case DescriptorType::SAMPLER: + case DescriptorType::SAMPLER_EXTERNAL: { + if (!entry.name.empty()) { + GLint const loc = glGetUniformLocation(program, entry.name.c_str()); + if (loc >= 0) { + // this can fail if the program doesn't use this descriptor + mBindingMap.insert(set, entry.binding, { tmu, entry.type }); + glUniform1i(loc, GLint(tmu)); + ++tmu; + } + } + break; + } + case DescriptorType::INPUT_ATTACHMENT: + break; } CHECK_GL_ERROR(utils::slog.e) } } - uint8_t usedBindingCount = 0; - uint8_t tmu = 0; - - UTILS_NOUNROLL - for (size_t i = 0, c = lazyInitializationData.samplerGroupInfo.size(); i < c; i++) { - auto const& samplers = lazyInitializationData.samplerGroupInfo[i].samplers; - if (samplers.empty()) { - // this binding point doesn't have any samplers, skip it. - continue; - } - - // keep this in the loop, so we skip it in the rare case a program doesn't have - // sampler. The context cache will prevent repeated calls to GL. - context.useProgram(program); - - bool atLeastOneSamplerUsed = false; + if (context.isES2()) { + // ES2 initialization of (fake) UBOs + UniformsRecord* const uniformsRecords = new(std::nothrow) UniformsRecord[Program::UNIFORM_BINDING_COUNT]; UTILS_NOUNROLL - for (const Program::Sampler& sampler: samplers) { - // find its location and associate a TMU to it - GLint const loc = glGetUniformLocation(program, sampler.name.c_str()); - if (loc >= 0) { - // this can fail if the program doesn't use this sampler - glUniform1i(loc, tmu); - atLeastOneSamplerUsed = true; + for (auto&& [index, name, uniforms] : lazyInitializationData.bindingUniformInfo) { + uniformsRecords[index].locations.reserve(uniforms.size()); + uniformsRecords[index].locations.resize(uniforms.size()); + for (size_t j = 0, c = uniforms.size(); j < c; j++) { + GLint const loc = glGetUniformLocation(program, uniforms[j].name.c_str()); + uniformsRecords[index].locations[j] = loc; + if (UTILS_UNLIKELY(index == 0)) { + // This is a bit of a gross hack here, we stash the location of + // "frameUniforms.rec709", which obviously the backend shouldn't know about, + // which is used for emulating the "rec709" colorspace in the shader. + // The backend also shouldn't know that binding 0 is where frameUniform is. + std::string_view const uniformName{ + uniforms[j].name.data(), uniforms[j].name.size() }; + if (uniformName == "frameUniforms.rec709") { + mRec709Location = loc; + } + } } - tmu++; - } - - // if this program doesn't use any sampler from this HwSamplerGroup, just cancel the - // whole group. - if (atLeastOneSamplerUsed) { - // Cache the sampler uniform locations for each interface block - mUsedSamplerBindingPoints[usedBindingCount] = i; - usedBindingCount++; - } else { - tmu -= samplers.size(); + uniformsRecords[index].uniforms = std::move(uniforms); } + mUniformsRecords = uniformsRecords; } - mUsedBindingsCount = usedBindingCount; -} -void OpenGLProgram::updateSamplers(OpenGLDriver* gld) const noexcept { - using GLTexture = OpenGLDriver::GLTexture; - - // cache a few member variable locally, outside the loop - auto const& UTILS_RESTRICT samplerBindings = gld->getSamplerBindings(); - auto const& UTILS_RESTRICT usedBindingPoints = mUsedSamplerBindingPoints; - - for (uint8_t i = 0, tmu = 0, n = mUsedBindingsCount; i < n; i++) { - auto const binding = usedBindingPoints[i]; - auto const * const sb = samplerBindings[binding]; - assert_invariant(sb); - for (uint8_t j = 0, m = sb->textureUnitEntries.size(); j < m; ++j, ++tmu) { // "<=" on purpose here - const GLTexture* const t = sb->textureUnitEntries[j].texture; - GLuint const s = sb->textureUnitEntries[j].sampler; - if (t) { // program may not use all samplers of sampler group - if (UTILS_UNLIKELY(t->gl.fence)) { - glWaitSync(t->gl.fence, 0, GL_TIMEOUT_IGNORED); - glDeleteSync(t->gl.fence); - t->gl.fence = nullptr; - } - gld->bindTexture(tmu, t); - gld->bindSampler(tmu, s); - } - } + auto& vertexConstants = lazyInitializationData.vertexPushConstants; + auto& fragmentConstants = lazyInitializationData.fragmentPushConstants; + + size_t const totalConstantCount = vertexConstants.size() + fragmentConstants.size(); + if (totalConstantCount > 0) { + mPushConstants.reserve(totalConstantCount); + mPushConstantFragmentStageOffset = vertexConstants.size(); + auto const transformAndAdd = [&](Program::PushConstant const& constant) { + GLint const loc = glGetUniformLocation(program, constant.name.c_str()); + mPushConstants.push_back({loc, constant.type}); + }; + std::for_each(vertexConstants.cbegin(), vertexConstants.cend(), transformAndAdd); + std::for_each(fragmentConstants.cbegin(), fragmentConstants.cend(), transformAndAdd); } - CHECK_GL_ERROR(utils::slog.e) } -UTILS_NOINLINE -void logCompilationError(io::ostream& out, ShaderStage shaderType, - const char* name, GLuint shaderId, - UTILS_UNUSED_IN_RELEASE CString const& sourceCode) noexcept { +void OpenGLProgram::updateUniforms( + uint32_t index, GLuint id, void const* buffer, uint16_t age) const noexcept { + assert_invariant(mUniformsRecords); + assert_invariant(buffer); - auto to_string = [](ShaderStage type) -> const char* { - switch (type) { - case ShaderStage::VERTEX: return "vertex"; - case ShaderStage::FRAGMENT: return "fragment"; - case ShaderStage::COMPUTE: return "compute"; - } - }; - - { // scope for the temporary string storage - GLint length = 0; - glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &length); - - CString infoLog(length); - glGetShaderInfoLog(shaderId, length, nullptr, infoLog.data()); - - out << "Compilation error in " << to_string(shaderType) << " shader \"" << name << "\":\n" - << "\"" << infoLog.c_str() << "\"" - << io::endl; + // only update the uniforms if the UBO has changed since last time we updated + UniformsRecord const& records = mUniformsRecords[index]; + if (records.id == id && records.age == age) { + return; } + records.id = id; + records.age = age; + + assert_invariant(records.uniforms.size() == records.locations.size()); -#ifndef NDEBUG - std::string_view shader{ sourceCode.data(), sourceCode.size() }; - size_t lc = 1; - size_t start = 0; - std::string line; - while (true) { - size_t end = shader.find('\n', start); - if (end == std::string::npos) { - line = shader.substr(start); - } else { - line = shader.substr(start, end - start); + for (size_t i = 0, c = records.uniforms.size(); i < c; i++) { + Program::Uniform const& u = records.uniforms[i]; + GLint const loc = records.locations[i]; + // mRec709Location is special, it is handled by setRec709ColorSpace() and the corresponding + // entry in `buffer` is typically not initialized, so we skip it. + if (loc < 0 || loc == mRec709Location) { + continue; } - out << lc++ << ": " << line.c_str() << '\n'; - if (end == std::string::npos) { - break; + // u.offset is in 'uint32_t' units + GLfloat const* const bf = reinterpret_cast(buffer) + u.offset; + GLint const* const bi = reinterpret_cast(buffer) + u.offset; + + switch(u.type) { + case UniformType::FLOAT: + glUniform1fv(loc, u.size, bf); + break; + case UniformType::FLOAT2: + glUniform2fv(loc, u.size, bf); + break; + case UniformType::FLOAT3: + glUniform3fv(loc, u.size, bf); + break; + case UniformType::FLOAT4: + glUniform4fv(loc, u.size, bf); + break; + + case UniformType::BOOL: + case UniformType::INT: + case UniformType::UINT: + glUniform1iv(loc, u.size, bi); + break; + case UniformType::BOOL2: + case UniformType::INT2: + case UniformType::UINT2: + glUniform2iv(loc, u.size, bi); + break; + case UniformType::BOOL3: + case UniformType::INT3: + case UniformType::UINT3: + glUniform3iv(loc, u.size, bi); + break; + case UniformType::BOOL4: + case UniformType::INT4: + case UniformType::UINT4: + glUniform4iv(loc, u.size, bi); + break; + + case UniformType::MAT3: + glUniformMatrix3fv(loc, u.size, GL_FALSE, bf); + break; + case UniformType::MAT4: + glUniformMatrix4fv(loc, u.size, GL_FALSE, bf); + break; + + case UniformType::STRUCT: + // not supported + break; } - start = end + 1; } - out << io::endl; -#endif } -UTILS_NOINLINE -void logProgramLinkError(io::ostream& out, char const* name, GLuint program) noexcept { - GLint length = 0; - glGetProgramiv(program, GL_INFO_LOG_LENGTH, &length); - - CString infoLog(length); - glGetProgramInfoLog(program, length, nullptr, infoLog.data()); - - out << "Link error in \"" << name << "\":\n" - << "\"" << infoLog.c_str() << "\"" - << io::endl; +void OpenGLProgram::setRec709ColorSpace(bool rec709) const noexcept { + glUniform1i(mRec709Location, rec709); } + } // namespace filament::backend diff --git a/filament/backend/src/opengl/OpenGLProgram.h b/filament/backend/src/opengl/OpenGLProgram.h index 90095590270..a5d35122e9b 100644 --- a/filament/backend/src/opengl/OpenGLProgram.h +++ b/filament/backend/src/opengl/OpenGLProgram.h @@ -18,113 +18,126 @@ #define TNT_FILAMENT_BACKEND_OPENGL_OPENGLPROGRAM_H #include "DriverBase.h" -#include "OpenGLDriver.h" -#include "private/backend/Driver.h" -#include "backend/Program.h" +#include "BindingMap.h" +#include "OpenGLContext.h" +#include "ShaderCompilerService.h" +#include + +#include +#include + +#include #include -#include +#include +#include -#include +#include #include #include - namespace filament::backend { +class OpenGLDriver; + +struct PushConstantBundle { + utils::Slice> vertexConstants; + utils::Slice> fragmentConstants; +}; + class OpenGLProgram : public HwProgram { public: OpenGLProgram() noexcept; - OpenGLProgram(OpenGLDriver& gld, Program&& builder) noexcept; + OpenGLProgram(OpenGLDriver& gld, Program&& program) noexcept; ~OpenGLProgram() noexcept; - bool isValid() const noexcept { return mValid; } + bool isValid() const noexcept { return mToken || gl.program != 0; } + + bool use(OpenGLDriver* const gld, OpenGLContext& context) noexcept { + // both non-null is impossible by construction + assert_invariant(!mToken || !gl.program); - void use(OpenGLDriver* const gld, OpenGLContext& context) noexcept { - if (UTILS_UNLIKELY(!mInitialized)) { - initialize(context); + if (UTILS_UNLIKELY(mToken && !gl.program)) { + // first time a program is used + initialize(*gld); + } + + if (UTILS_UNLIKELY(!gl.program)) { + // compilation failed (token should be null) + assert_invariant(!mToken); + return false; } context.useProgram(gl.program); - if (UTILS_UNLIKELY(mUsedBindingsCount)) { - // We rely on GL state tracking to avoid unnecessary glBindTexture / glBindSampler - // calls. + return true; + } - // we need to do this if: - // - the content of mSamplerBindings has changed - // - the content of any bound sampler buffer has changed - // ... since last time we used this program + GLuint getBufferBinding(descriptor_set_t set, descriptor_binding_t binding) const noexcept { + return mBindingMap.get(set, binding); + } - // turns out the former might be relatively cheap to check, the later requires - // a bit less. Compared to what updateSamplers() actually does, which is - // pretty little, I'm not sure if we'll get ahead. + GLuint getTextureUnit(descriptor_set_t set, descriptor_binding_t binding) const noexcept { + return mBindingMap.get(set, binding); + } - updateSamplers(gld); - } + utils::bitset64 getActiveDescriptors(descriptor_set_t set) const noexcept { + return mBindingMap.getActiveDescriptors(set); } - struct { - GLuint shaders[Program::SHADER_TYPE_COUNT] = {}; - GLuint program = 0; - } gl; // 12 bytes + // For ES2 only + void updateUniforms(uint32_t index, GLuint id, void const* buffer, uint16_t age) const noexcept; + void setRec709ColorSpace(bool rec709) const noexcept; + + PushConstantBundle getPushConstants() { + auto fragBegin = mPushConstants.begin() + mPushConstantFragmentStageOffset; + return { + .vertexConstants = utils::Slice(mPushConstants.begin(), fragBegin), + .fragmentConstants = utils::Slice(fragBegin, mPushConstants.end()), + }; + } private: // keep these away from of other class attributes - struct LazyInitializationData { - Program::UniformBlockInfo uniformBlockInfo; - Program::SamplerGroupInfo samplerGroupInfo; - std::array shaderSourceCode; - }; + struct LazyInitializationData; - static void compileShaders(OpenGLContext& context, - Program::ShaderSource shadersSource, - utils::FixedCapacityVector const& specializationConstants, - GLuint shaderIds[Program::SHADER_TYPE_COUNT], - std::array& outShaderSourceCode) noexcept; + void initialize(OpenGLDriver& gld); - static std::string_view process_GOOGLE_cpp_style_line_directive(OpenGLContext& context, - char* source, size_t len) noexcept; + void initializeProgramState(OpenGLContext& context, GLuint program, + LazyInitializationData& lazyInitializationData) noexcept; - static std::string_view process_ARB_shading_language_packing(OpenGLContext& context) noexcept; + BindingMap mBindingMap; // 8 bytes + out-of-line 256 bytes - static std::array splitShaderSource(std::string_view source) noexcept; + ShaderCompilerService::program_token_t mToken{}; // 16 bytes - static GLuint linkProgram(const GLuint shaderIds[Program::SHADER_TYPE_COUNT]) noexcept; + // Note that this can be replaced with a raw pointer and an uint8_t (for size) to reduce the + // size of the container to 9 bytes if there is a need in the future. + utils::FixedCapacityVector> mPushConstants;// 16 bytes - static bool checkProgramStatus(const char* name, - GLuint& program, GLuint shaderIds[Program::SHADER_TYPE_COUNT], - std::array const& shaderSourceCode) noexcept; + // only needed for ES2 + using LocationInfo = utils::FixedCapacityVector; + struct UniformsRecord { + Program::UniformInfo uniforms; + LocationInfo locations; + mutable GLuint id = 0; + mutable uint16_t age = std::numeric_limits::max(); + }; + UniformsRecord const* mUniformsRecords = nullptr; + GLint mRec709Location : 24; // 4 bytes - void initialize(OpenGLContext& context); + // Push constant array offset for fragment stage constants. + GLint mPushConstantFragmentStageOffset : 8; // 1 byte - void initializeProgramState(OpenGLContext& context, GLuint program, - LazyInitializationData const& lazyInitializationData) noexcept; - - void updateSamplers(OpenGLDriver* gld) const noexcept; - - // number of bindings actually used by this program - uint8_t mUsedBindingsCount = 0u; - // whether lazy initialization has been performed - bool mInitialized : 1; - // whether lazy initialization was successful - bool mValid : 1; - UTILS_UNUSED uint8_t padding[2] = {}; - - union { - // when mInitialized == true: - // information about each USED sampler buffer per binding (no gaps) - std::array mUsedSamplerBindingPoints; // 4 bytes - // when mInitialized == false: - // lazy initialization data pointer - LazyInitializationData* mLazyInitializationData; - }; +public: + struct { + GLuint program = 0; + } gl; // 4 bytes }; -// if OpenGLProgram is larger tha 64 bytes, it'll fall in a larger Handle bucket. -static_assert(sizeof(OpenGLProgram) <= 64); +// if OpenGLProgram is larger than 96 bytes, it'll fall in a larger Handle bucket. +static_assert(sizeof(OpenGLProgram) <= 96); // currently 96 bytes } // namespace filament::backend diff --git a/filament/backend/src/opengl/OpenGLTimerQuery.cpp b/filament/backend/src/opengl/OpenGLTimerQuery.cpp index 4c585749896..3815a1f0d8e 100644 --- a/filament/backend/src/opengl/OpenGLTimerQuery.cpp +++ b/filament/backend/src/opengl/OpenGLTimerQuery.cpp @@ -16,66 +16,166 @@ #include "OpenGLTimerQuery.h" +#include "GLUtils.h" +#include "OpenGLDriver.h" + +#include #include +#include #include +#include +#include #include +#include #include -#include + +#include +#include +#include +#include +#include + +#include namespace filament::backend { using namespace backend; using namespace GLUtils; +class OpenGLDriver; + // ------------------------------------------------------------------------------------------------ -OpenGLTimerQueryInterface::~OpenGLTimerQueryInterface() = default; +bool TimerQueryFactory::mGpuTimeSupported = false; + +TimerQueryFactoryInterface* TimerQueryFactory::init( + OpenGLPlatform& platform, OpenGLContext& context) noexcept { + (void)context; + + TimerQueryFactoryInterface* impl = nullptr; + +#if defined(BACKEND_OPENGL_VERSION_GL) || defined(GL_EXT_disjoint_timer_query) + if (context.ext.EXT_disjoint_timer_query) { + // timer queries are available + if (context.bugs.dont_use_timer_query && platform.canCreateFence()) { + // however, they don't work well, revert to using fences if we can. + impl = new(std::nothrow) TimerQueryFenceFactory(platform); + } else { + impl = new(std::nothrow) TimerQueryNativeFactory(context); + } + mGpuTimeSupported = true; + } else +#endif + if (platform.canCreateFence()) { + // no timer queries, but we can use fences + impl = new(std::nothrow) TimerQueryFenceFactory(platform); + mGpuTimeSupported = true; + } else { + // no queries, no fences -- that's a problem + impl = new(std::nothrow) TimerQueryFallbackFactory(); + mGpuTimeSupported = false; + } + assert_invariant(impl); + return impl; +} // ------------------------------------------------------------------------------------------------ -TimerQueryNative::TimerQueryNative(OpenGLContext& context) - : gl(context) { +TimerQueryFactoryInterface::~TimerQueryFactoryInterface() = default; + +// This is a backend synchronous call +TimerQueryResult TimerQueryFactoryInterface::getTimerQueryValue( + GLTimerQuery* tq, uint64_t* elapsedTime) noexcept { + if (UTILS_LIKELY(tq->state)) { + int64_t const elapsed = tq->state->elapsed.load(std::memory_order_relaxed); + if (elapsed > 0) { + *elapsedTime = elapsed; + return TimerQueryResult::AVAILABLE; + } + return TimerQueryResult(elapsed); + } + return TimerQueryResult::ERROR; } -TimerQueryNative::~TimerQueryNative() = default; +// ------------------------------------------------------------------------------------------------ -void TimerQueryNative::flush() { +#if defined(BACKEND_OPENGL_VERSION_GL) || defined(GL_EXT_disjoint_timer_query) + +TimerQueryNativeFactory::TimerQueryNativeFactory(OpenGLContext& context) + : mContext(context) { } -void TimerQueryNative::beginTimeElapsedQuery(GLTimerQuery* query) { - gl.beginQuery(GL_TIME_ELAPSED, query->gl.query); +TimerQueryNativeFactory::~TimerQueryNativeFactory() = default; + +void TimerQueryNativeFactory::createTimerQuery(GLTimerQuery* tq) { + assert_invariant(!tq->state); + + tq->state = std::make_shared(); + mContext.procs.genQueries(1u, &tq->state->gl.query); CHECK_GL_ERROR(utils::slog.e) } -void TimerQueryNative::endTimeElapsedQuery(GLTimerQuery*) { - gl.endQuery(GL_TIME_ELAPSED); +void TimerQueryNativeFactory::destroyTimerQuery(GLTimerQuery* tq) { + assert_invariant(tq->state); + + mContext.procs.deleteQueries(1u, &tq->state->gl.query); CHECK_GL_ERROR(utils::slog.e) + + tq->state.reset(); } -bool TimerQueryNative::queryResultAvailable(GLTimerQuery* query) { - GLuint available = 0; - glGetQueryObjectuiv(query->gl.query, GL_QUERY_RESULT_AVAILABLE, &available); +void TimerQueryNativeFactory::beginTimeElapsedQuery(GLTimerQuery* tq) { + assert_invariant(tq->state); + + tq->state->elapsed.store(int64_t(TimerQueryResult::NOT_READY), std::memory_order_relaxed); + mContext.procs.beginQuery(GL_TIME_ELAPSED, tq->state->gl.query); CHECK_GL_ERROR(utils::slog.e) - return available != 0; } -uint64_t TimerQueryNative::queryResult(GLTimerQuery* query) { - GLuint64 elapsedTime = 0; - // IOS doesn't have glGetQueryObjectui64v, we'll never end-up here on ios anyways -#ifndef IOS - glGetQueryObjectui64v(query->gl.query, GL_QUERY_RESULT, &elapsedTime); -#endif +void TimerQueryNativeFactory::endTimeElapsedQuery(OpenGLDriver& driver, GLTimerQuery* tq) { + assert_invariant(tq->state); + + mContext.procs.endQuery(GL_TIME_ELAPSED); CHECK_GL_ERROR(utils::slog.e) - return elapsedTime; + + std::weak_ptr const weak = tq->state; + + driver.runEveryNowAndThen([&context = mContext, weak]() -> bool { + auto state = weak.lock(); + if (!state) { + // The timer query state has been destroyed on the way, very likely due to the IBL + // prefilter context destruction. We still return true to get this element removed from + // the query list. + return true; + } + + GLuint available = 0; + context.procs.getQueryObjectuiv(state->gl.query, GL_QUERY_RESULT_AVAILABLE, &available); + CHECK_GL_ERROR(utils::slog.e) + if (!available) { + // we need to try this one again later + return false; + } + GLuint64 elapsedTime = 0; + // we won't end-up here if we're on ES and don't have GL_EXT_disjoint_timer_query + context.procs.getQueryObjectui64v(state->gl.query, GL_QUERY_RESULT, &elapsedTime); + state->elapsed.store((int64_t)elapsedTime, std::memory_order_relaxed); + + return true; + }); } +#endif + // ------------------------------------------------------------------------------------------------ -OpenGLTimerQueryFence::OpenGLTimerQueryFence(OpenGLPlatform& platform) +TimerQueryFenceFactory::TimerQueryFenceFactory(OpenGLPlatform& platform) : mPlatform(platform) { mQueue.reserve(2); mThread = std::thread([this]() { + utils::JobSystem::setThreadName("OpenGLTimerQueryFence"); + utils::JobSystem::setThreadPriority(utils::JobSystem::Priority::URGENT_DISPLAY); auto& queue = mQueue; bool exitRequested; do { @@ -85,7 +185,7 @@ OpenGLTimerQueryFence::OpenGLTimerQueryFence(OpenGLPlatform& platform) }); exitRequested = mExitRequested; if (!queue.empty()) { - Job job(queue.front()); + Job const job(queue.front()); queue.erase(queue.begin()); lock.unlock(); job(); @@ -94,107 +194,104 @@ OpenGLTimerQueryFence::OpenGLTimerQueryFence(OpenGLPlatform& platform) }); } -OpenGLTimerQueryFence::~OpenGLTimerQueryFence() { +TimerQueryFenceFactory::~TimerQueryFenceFactory() { + assert_invariant(mQueue.empty()); if (mThread.joinable()) { std::unique_lock lock(mLock); mExitRequested = true; mCondition.notify_one(); lock.unlock(); - mThread.join(); + if (mThread.joinable()) { + mThread.join(); + } } } -void OpenGLTimerQueryFence::enqueue(OpenGLTimerQueryFence::Job&& job) { - std::unique_lock lock(mLock); - mQueue.push_back(std::forward(job)); +void TimerQueryFenceFactory::push(TimerQueryFenceFactory::Job&& job) { + std::unique_lock const lock(mLock); + mQueue.push_back(std::move(job)); mCondition.notify_one(); } -void OpenGLTimerQueryFence::flush() { - // Use calls to flush() as a proxy for when the GPU work started. - GLTimerQuery* query = mActiveQuery; - if (query) { - uint64_t elapsed = query->gl.emulation->elapsed.load(std::memory_order_relaxed); - if (!elapsed) { - uint64_t now = clock::now().time_since_epoch().count(); - query->gl.emulation->elapsed.store(now, std::memory_order_relaxed); - //SYSTRACE_CONTEXT(); - //SYSTRACE_ASYNC_BEGIN("gpu", query->gl.query); - } - } +void TimerQueryFenceFactory::createTimerQuery(GLTimerQuery* tq) { + assert_invariant(!tq->state); + tq->state = std::make_shared(); } -void OpenGLTimerQueryFence::beginTimeElapsedQuery(GLTimerQuery* query) { - assert_invariant(!mActiveQuery); - // We can't use a fence to figure out when a GPU operation starts (only when it finishes) - // so instead, we use when glFlush() was issued as a proxy. - if (UTILS_UNLIKELY(!query->gl.emulation)) { - query->gl.emulation = std::make_shared(); - } - query->gl.emulation->elapsed.store(0, std::memory_order_relaxed); - query->gl.emulation->available.store(false); - mActiveQuery = query; -} - -void OpenGLTimerQueryFence::endTimeElapsedQuery(GLTimerQuery* query) { - assert_invariant(mActiveQuery); - Platform::Fence* fence = mPlatform.createFence(); - std::weak_ptr weak = query->gl.emulation; - mActiveQuery = nullptr; - //uint32_t cookie = cookie = query->gl.query; - push([&platform = mPlatform, fence, weak]() { - auto emulation = weak.lock(); - if (emulation) { +void TimerQueryFenceFactory::destroyTimerQuery(GLTimerQuery* tq) { + assert_invariant(tq->state); + tq->state.reset(); +} + +void TimerQueryFenceFactory::beginTimeElapsedQuery(GLTimerQuery* tq) { + assert_invariant(tq->state); + tq->state->elapsed.store(int64_t(TimerQueryResult::NOT_READY), std::memory_order_relaxed); + + std::weak_ptr const weak = tq->state; + + // FIXME: this implementation of beginTimeElapsedQuery is usually wrong; it ends up + // measuring the current CPU time because the fence signals immediately (usually there is + // no work on the GPU at this point). We could workaround this by sending a small glClear + // on a dummy target for instance, or somehow latch the begin time at the next renderpass + // start. + + push([&platform = mPlatform, fence = mPlatform.createFence(), weak]() { + auto state = weak.lock(); + if (state) { platform.waitFence(fence, FENCE_WAIT_FOR_EVER); - auto now = clock::now().time_since_epoch().count(); - auto then = emulation->elapsed.load(std::memory_order_relaxed); - emulation->elapsed.store(now - then, std::memory_order_relaxed); - emulation->available.store(true); - //SYSTRACE_CONTEXT(); - //SYSTRACE_ASYNC_END("gpu", cookie); + state->then = clock::now().time_since_epoch().count(); + SYSTRACE_CONTEXT(); + SYSTRACE_ASYNC_BEGIN("OpenGLTimerQueryFence", intptr_t(state.get())); } platform.destroyFence(fence); }); } -bool OpenGLTimerQueryFence::queryResultAvailable(GLTimerQuery* query) { - return query->gl.emulation->available.load(); -} +void TimerQueryFenceFactory::endTimeElapsedQuery(OpenGLDriver&, GLTimerQuery* tq) { + assert_invariant(tq->state); + std::weak_ptr const weak = tq->state; -uint64_t OpenGLTimerQueryFence::queryResult(GLTimerQuery* query) { - return query->gl.emulation->elapsed; + push([&platform = mPlatform, fence = mPlatform.createFence(), weak]() { + auto state = weak.lock(); + if (state) { + platform.waitFence(fence, FENCE_WAIT_FOR_EVER); + int64_t const now = clock::now().time_since_epoch().count(); + state->elapsed.store(now - state->then, std::memory_order_relaxed); + SYSTRACE_CONTEXT(); + SYSTRACE_ASYNC_END("OpenGLTimerQueryFence", intptr_t(state.get())); + } + platform.destroyFence(fence); + }); } // ------------------------------------------------------------------------------------------------ -TimerQueryFallback::TimerQueryFallback() = default; +TimerQueryFallbackFactory::TimerQueryFallbackFactory() = default; -TimerQueryFallback::~TimerQueryFallback() = default; +TimerQueryFallbackFactory::~TimerQueryFallbackFactory() = default; -void TimerQueryFallback::flush() { -} - -void TimerQueryFallback::beginTimeElapsedQuery(OpenGLTimerQueryInterface::GLTimerQuery* query) { - if (!query->gl.emulation) { - query->gl.emulation = std::make_shared(); - } - // this implementation clearly doesn't work at all, but we have no h/w support - query->gl.emulation->available.store(false, std::memory_order_relaxed); - query->gl.emulation->elapsed = clock::now().time_since_epoch().count(); +void TimerQueryFallbackFactory::createTimerQuery(GLTimerQuery* tq) { + assert_invariant(!tq->state); + tq->state = std::make_shared(); } -void TimerQueryFallback::endTimeElapsedQuery(OpenGLTimerQueryInterface::GLTimerQuery* query) { - // this implementation clearly doesn't work at all, but we have no h/w support - query->gl.emulation->elapsed = clock::now().time_since_epoch().count() - query->gl.emulation->elapsed; - query->gl.emulation->available.store(true, std::memory_order_relaxed); +void TimerQueryFallbackFactory::destroyTimerQuery(GLTimerQuery* tq) { + assert_invariant(tq->state); + tq->state.reset(); } -bool TimerQueryFallback::queryResultAvailable(OpenGLTimerQueryInterface::GLTimerQuery* query) { - return query->gl.emulation->available.load(std::memory_order_relaxed); +void TimerQueryFallbackFactory::beginTimeElapsedQuery(GLTimerQuery* tq) { + assert_invariant(tq->state); + // this implementation measures the CPU time, but we have no h/w support + tq->state->then = clock::now().time_since_epoch().count(); + tq->state->elapsed.store(int64_t(TimerQueryResult::NOT_READY), std::memory_order_relaxed); } -uint64_t TimerQueryFallback::queryResult(OpenGLTimerQueryInterface::GLTimerQuery* query) { - return query->gl.emulation->elapsed; +void TimerQueryFallbackFactory::endTimeElapsedQuery(OpenGLDriver&, GLTimerQuery* tq) { + assert_invariant(tq->state); + // this implementation measures the CPU time, but we have no h/w support + int64_t const now = clock::now().time_since_epoch().count(); + tq->state->elapsed.store(now - tq->state->then, std::memory_order_relaxed); } } // namespace filament::backend diff --git a/filament/backend/src/opengl/OpenGLTimerQuery.h b/filament/backend/src/opengl/OpenGLTimerQuery.h index 69cb0849071..5941c87d2b6 100644 --- a/filament/backend/src/opengl/OpenGLTimerQuery.h +++ b/filament/backend/src/opengl/OpenGLTimerQuery.h @@ -17,87 +17,124 @@ #ifndef TNT_FILAMENT_BACKEND_OPENGL_TIMERQUERY_H #define TNT_FILAMENT_BACKEND_OPENGL_TIMERQUERY_H -#include "OpenGLDriver.h" +#include + +#include "DriverBase.h" #include +#include + +#include "gl_headers.h" +#include +#include +#include +#include #include #include +#include + namespace filament::backend { +class OpenGLPlatform; +class OpenGLContext; +class OpenGLDriver; +class TimerQueryFactoryInterface; + +struct GLTimerQuery : public HwTimerQuery { + struct State { + struct { + GLuint query; + } gl; + int64_t then{}; + std::atomic elapsed{}; + }; + std::shared_ptr state; +}; + /* - * we need two implementation of timer queries (only elapsed time), because + * We need two implementation of timer queries (only elapsed time), because * on some gpu disjoint_timer_query/arb_timer_query is much less accurate than * using fences. * * These classes implement the various strategies... */ -class OpenGLTimerQueryInterface { +class TimerQueryFactory { + static bool mGpuTimeSupported; +public: + static TimerQueryFactoryInterface* init( + OpenGLPlatform& platform, OpenGLContext& context) noexcept; + + static bool isGpuTimeSupported() noexcept { + return mGpuTimeSupported; + } +}; + +class TimerQueryFactoryInterface { protected: - using GLTimerQuery = OpenGLDriver::GLTimerQuery; + using GLTimerQuery = filament::backend::GLTimerQuery; using clock = std::chrono::steady_clock; public: - virtual ~OpenGLTimerQueryInterface(); - virtual void flush() = 0; + virtual ~TimerQueryFactoryInterface(); + virtual void createTimerQuery(GLTimerQuery* query) = 0; + virtual void destroyTimerQuery(GLTimerQuery* query) = 0; virtual void beginTimeElapsedQuery(GLTimerQuery* query) = 0; - virtual void endTimeElapsedQuery(GLTimerQuery* query) = 0; - virtual bool queryResultAvailable(GLTimerQuery* query) = 0; - virtual uint64_t queryResult(GLTimerQuery* query) = 0; + virtual void endTimeElapsedQuery(OpenGLDriver& driver, GLTimerQuery* query) = 0; + + static TimerQueryResult getTimerQueryValue(GLTimerQuery* tq, uint64_t* elapsedTime) noexcept; }; -class TimerQueryNative : public OpenGLTimerQueryInterface { +#if defined(BACKEND_OPENGL_VERSION_GL) || defined(GL_EXT_disjoint_timer_query) + +class TimerQueryNativeFactory final : public TimerQueryFactoryInterface { public: - explicit TimerQueryNative(OpenGLContext& context); - ~TimerQueryNative() override; + explicit TimerQueryNativeFactory(OpenGLContext& context); + ~TimerQueryNativeFactory() override; private: - void flush() override; + void createTimerQuery(GLTimerQuery* query) override; + void destroyTimerQuery(GLTimerQuery* query) override; void beginTimeElapsedQuery(GLTimerQuery* query) override; - void endTimeElapsedQuery(GLTimerQuery* query) override; - bool queryResultAvailable(GLTimerQuery* query) override; - uint64_t queryResult(GLTimerQuery* query) override; - OpenGLContext& gl; + void endTimeElapsedQuery(OpenGLDriver& driver, GLTimerQuery* query) override; + OpenGLContext& mContext; }; -class OpenGLTimerQueryFence : public OpenGLTimerQueryInterface { +#endif + +class TimerQueryFenceFactory final : public TimerQueryFactoryInterface { public: - explicit OpenGLTimerQueryFence(OpenGLPlatform& platform); - ~OpenGLTimerQueryFence() override; + explicit TimerQueryFenceFactory(OpenGLPlatform& platform); + ~TimerQueryFenceFactory() override; private: using Job = std::function; - void flush() override; - void beginTimeElapsedQuery(GLTimerQuery* query) override; - void endTimeElapsedQuery(GLTimerQuery* query) override; - bool queryResultAvailable(GLTimerQuery* query) override; - uint64_t queryResult(GLTimerQuery* query) override; - void enqueue(Job&& job); - - template - void push(CALLABLE&& func, ARGS&& ... args) { - enqueue(Job(std::bind(std::forward(func), std::forward(args)...))); - } + using Container = std::vector; + + void createTimerQuery(GLTimerQuery* query) override; + void destroyTimerQuery(GLTimerQuery* query) override; + void beginTimeElapsedQuery(GLTimerQuery* tq) override; + void endTimeElapsedQuery(OpenGLDriver& driver, GLTimerQuery* tq) override; + + void push(Job&& job); OpenGLPlatform& mPlatform; std::thread mThread; mutable utils::Mutex mLock; mutable utils::Condition mCondition; - std::vector mQueue; + Container mQueue; bool mExitRequested = false; - GLTimerQuery* mActiveQuery = nullptr; }; -class TimerQueryFallback : public OpenGLTimerQueryInterface { +class TimerQueryFallbackFactory final : public TimerQueryFactoryInterface { public: - explicit TimerQueryFallback(); - ~TimerQueryFallback() override; + explicit TimerQueryFallbackFactory(); + ~TimerQueryFallbackFactory() override; private: - void flush() override; + void createTimerQuery(GLTimerQuery* query) override; + void destroyTimerQuery(GLTimerQuery* query) override; void beginTimeElapsedQuery(GLTimerQuery* query) override; - void endTimeElapsedQuery(GLTimerQuery* query) override; - bool queryResultAvailable(GLTimerQuery* query) override; - uint64_t queryResult(GLTimerQuery* query) override; + void endTimeElapsedQuery(OpenGLDriver& driver, GLTimerQuery* query) override; }; } // namespace filament::backend diff --git a/filament/backend/src/opengl/ShaderCompilerService.cpp b/filament/backend/src/opengl/ShaderCompilerService.cpp new file mode 100644 index 00000000000..eb6876859be --- /dev/null +++ b/filament/backend/src/opengl/ShaderCompilerService.cpp @@ -0,0 +1,1012 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ShaderCompilerService.h" + +#include "BlobCacheKey.h" +#include "OpenGLBlobCache.h" +#include "OpenGLDriver.h" + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace filament::backend { + +using namespace utils; + +// ------------------------------------------------------------------------------------------------ + +static void logCompilationError(utils::io::ostream& out, + ShaderStage shaderType, const char* name, + GLuint shaderId, CString const& sourceCode) noexcept; + +static void logProgramLinkError(utils::io::ostream& out, + const char* name, GLuint program) noexcept; + +static inline std::string to_string(bool b) noexcept { + return b ? "true" : "false"; +} + +static inline std::string to_string(int i) noexcept { + return std::to_string(i); +} + +static inline std::string to_string(float f) noexcept { + return "float(" + std::to_string(f) + ")"; +} + +// ------------------------------------------------------------------------------------------------ + +struct ShaderCompilerService::OpenGLProgramToken : ProgramToken { + struct ProgramData { + GLuint program{}; + std::array shaders{}; + }; + + ~OpenGLProgramToken() override; + + OpenGLProgramToken(ShaderCompilerService& compiler, utils::CString const& name) noexcept + : compiler(compiler), name(name) { + } + + ShaderCompilerService& compiler; + utils::CString const& name; + utils::FixedCapacityVector> attributes; + std::array shaderSourceCode; + void* user = nullptr; + struct { + std::array shaders{}; + GLuint program = 0; + } gl; // 12 bytes + + + // Sets the programData, typically from the compiler thread, and signal the main thread. + // This is similar to std::promise::set_value. + void set(ProgramData const& data) noexcept { + std::unique_lock const l(lock); + programData = data; + signaled = true; + cond.notify_one(); + } + + // Get the programBinary, wait if necessary. + // This is similar to std::future::get + ProgramData const& get() const noexcept { + std::unique_lock l(lock); + cond.wait(l, [this](){ return signaled; }); + return programData; + } + + void wait() const noexcept { + std::unique_lock l(lock); + cond.wait(l, [this](){ return signaled; }); + } + + // Checks if the programBinary is ready. + // This is similar to std::future::wait_for(0s) + bool isReady() const noexcept { + std::unique_lock l(lock); + using namespace std::chrono_literals; + return cond.wait_for(l, 0s, [this](){ return signaled; }); + } + + CallbackManager::Handle handle{}; + BlobCacheKey key; + mutable utils::Mutex lock; + mutable utils::Condition cond; + ProgramData programData; + bool signaled = false; + + bool canceled = false; // not part of the signaling +}; + +ShaderCompilerService::OpenGLProgramToken::~OpenGLProgramToken() = default; + +void ShaderCompilerService::setUserData(const program_token_t& token, void* user) noexcept { + token->user = user; +} + +void* ShaderCompilerService::getUserData(const program_token_t& token) noexcept { + return token->user; +} + +// ------------------------------------------------------------------------------------------------ + +ShaderCompilerService::ShaderCompilerService(OpenGLDriver& driver) + : mDriver(driver), + mBlobCache(driver.getContext()), + mCallbackManager(driver) { +} + +ShaderCompilerService::~ShaderCompilerService() noexcept = default; + +bool ShaderCompilerService::isParallelShaderCompileSupported() const noexcept { + assert_invariant(mMode != Mode::UNDEFINED); + return mMode != Mode::SYNCHRONOUS; +} + +void ShaderCompilerService::init() noexcept { + if (UTILS_UNLIKELY(mDriver.getDriverConfig().disableParallelShaderCompile)) { + // user disabled parallel shader compile + mMode = Mode::SYNCHRONOUS; + return; + } + + // Here we decide which mode we'll be using. We always prefer our own thread-pool if + // that mode is available because, we have no control on how the compilation queues are + // handled if done by the driver (so at the very least we'd need to decode this per-driver). + // In theory, using Mode::ASYNCHRONOUS (a.k.a. KHR_parallel_shader_compile) could be more + // efficient, since it doesn't require shared contexts. + // In practice, we already know that with ANGLE, Mode::ASYNCHRONOUS can cause very long + // pauses at glDraw() time in the situation where glLinkProgram() has been emitted, but has + // other programs ahead of it in ANGLE's queue. + if (mDriver.mPlatform.isExtraContextSupported()) { + // our thread-pool if possible + mMode = Mode::THREAD_POOL; + } else if (mDriver.getContext().ext.KHR_parallel_shader_compile) { + // if not, async shader compilation and link if the driver supports it + mMode = Mode::ASYNCHRONOUS; + } else { + // fallback to synchronous shader compilation + mMode = Mode::SYNCHRONOUS; + } + + if (mMode == Mode::THREAD_POOL) { + // - on Adreno there is a single compiler object. We can't use a pool > 1 + // also glProgramBinary blocks if other threads are compiling. + // - on Mali shader compilation can be multi-threaded, but program linking happens on + // a single service thread, so we don't bother using more than one thread either. + // - on PowerVR shader compilation and linking can be multi-threaded. + // How many threads should we use? + // - on macOS (M1 MacBook Pro/Ventura) there is global lock around all GL APIs when using + // a shared context, so parallel shader compilation yields no benefit. + // - on windows/linux we could use more threads, tbd. + + // By default, we use one thread at the same priority as the gl thread. This is the + // safest choice that avoids priority inversions. + uint32_t poolSize = 1; + JobSystem::Priority priority = JobSystem::Priority::DISPLAY; + + auto const& renderer = mDriver.getContext().state.renderer; + // Some drivers support parallel shader compilation well, so we use N + // threads, we can use lower priority threads here because urgent compilations + // will most likely happen on the main gl thread. Using too many thread can + // increase memory pressure significantly. + if (UTILS_UNLIKELY(strstr(renderer, "PowerVR"))) { + // For PowerVR, it's unclear what the cost of extra shared contexts is, so we only + // use 2 to be safe. + poolSize = 2; + priority = JobSystem::Priority::BACKGROUND; + } else if (UTILS_UNLIKELY(strstr(renderer, "ANGLE"))) { + // Angle shared contexts are not expensive once we have two. + poolSize = (std::thread::hardware_concurrency() + 1) / 2; + priority = JobSystem::Priority::BACKGROUND; + } + + mShaderCompilerThreadCount = poolSize; + mCompilerThreadPool.init(mShaderCompilerThreadCount, + [&platform = mDriver.mPlatform, priority]() { + // give the thread a name + JobSystem::setThreadName("CompilerThreadPool"); + // run at a slightly lower priority than other filament threads + JobSystem::setThreadPriority(priority); + // create a gl context current to this thread + platform.createContext(true); + }, + [&platform = mDriver.mPlatform]() { + // release context and thread state + platform.releaseContext(); + }); + } +} + +void ShaderCompilerService::terminate() noexcept { + // Finally stop the thread pool immediately. Pending jobs will be discarded. We guarantee by + // construction that nobody is waiting on a token (because waiting is only done on the main + // backend thread, and if we're here, we're on the backend main thread). + mCompilerThreadPool.terminate(); + + mRunAtNextTickOps.clear(); + + // We could have some pending callbacks here, we need to execute them. + // This is equivalent to calling cancelTickOp() on all active tokens. + mCallbackManager.terminate(); +} + +ShaderCompilerService::program_token_t ShaderCompilerService::createProgram( + utils::CString const& name, Program&& program) { + auto& gl = mDriver.getContext(); + + auto token = std::make_shared(*this, name); + if (UTILS_UNLIKELY(gl.isES2())) { + token->attributes = std::move(program.getAttributes()); + } + + token->gl.program = mBlobCache.retrieve(&token->key, mDriver.mPlatform, program); + if (token->gl.program) { + return token; + } + + token->handle = mCallbackManager.get(); + + CompilerPriorityQueue const priorityQueue = program.getPriorityQueue(); + if (mMode == Mode::THREAD_POOL) { + // queue a compile job + mCompilerThreadPool.queue(priorityQueue, token, + [this, &gl, program = std::move(program), token]() mutable { + // compile the shaders + std::array shaders{}; + compileShaders(gl, + std::move(program.getShadersSource()), + program.getSpecializationConstants(), + program.isMultiview(), + shaders, + token->shaderSourceCode); + + // link the program + GLuint const glProgram = linkProgram(gl, shaders, token->attributes); + + OpenGLProgramToken::ProgramData programData; + programData.shaders = shaders; + + // We need to query the link status here to guarantee that the + // program is compiled and linked now (we don't want this to be + // deferred to later). We don't care about the result at this point. + GLint status = GL_FALSE; + glGetProgramiv(glProgram, GL_LINK_STATUS, &status); + programData.program = glProgram; + + // we don't need to check for success here, it'll be done on the + // main thread side. + token->set(programData); + + mCallbackManager.put(token->handle); + + // caching must be the last thing we do + if (token->key && status == GL_TRUE) { + // Attempt to cache. This calls glGetProgramBinary. + mBlobCache.insert(mDriver.mPlatform, token->key, glProgram); + } + }); + + } else { + // this cannot fail because we check compilation status after linking the program + // shaders[] is filled with id of shader stages present. + compileShaders(gl, + std::move(program.getShadersSource()), + program.getSpecializationConstants(), + program.isMultiview(), + token->gl.shaders, + token->shaderSourceCode); + + runAtNextTick(priorityQueue, token, [this, token](Job const&) { + assert_invariant(mMode != Mode::THREAD_POOL); + if (mMode == Mode::ASYNCHRONOUS) { + // don't attempt to link this program if all shaders are not done compiling + GLint status; + if (token->gl.program) { + glGetProgramiv(token->gl.program, GL_COMPLETION_STATUS, &status); + if (status == GL_FALSE) { + return false; + } + } else { + for (auto shader: token->gl.shaders) { + if (shader) { + glGetShaderiv(shader, GL_COMPLETION_STATUS, &status); + if (status == GL_FALSE) { + return false; + } + } + } + } + } + + if (!token->gl.program) { + // link the program, this also cannot fail because status is checked later. + token->gl.program = linkProgram(mDriver.getContext(), + token->gl.shaders, token->attributes); + if (mMode == Mode::ASYNCHRONOUS) { + // wait until the link finishes... + return false; + } + } + + assert_invariant(token->gl.program); + + mCallbackManager.put(token->handle); + + if (token->key) { + // TODO: technically we don't have to cache right now. Is it advantageous to + // do this later, maybe depending on CPU usage? + // attempt to cache if we don't have a thread pool (otherwise it's done + // by the pool). + mBlobCache.insert(mDriver.mPlatform, token->key, token->gl.program); + } + + return true; + }); + } + + return token; +} + +GLuint ShaderCompilerService::getProgram(ShaderCompilerService::program_token_t& token) { + GLuint const program = initialize(token); + assert_invariant(token == nullptr); +#if !FILAMENT_ENABLE_MATDBG + assert_invariant(program); +#endif + return program; +} + +void ShaderCompilerService::terminate(program_token_t& token) { + assert_invariant(token); + + token->canceled = true; + + bool const canceled = token->compiler.cancelTickOp(token); + + if (token->compiler.mMode == Mode::THREAD_POOL) { + auto job = token->compiler.mCompilerThreadPool.dequeue(token); + if (!job) { + // The job is being executed right now. We need to wait for it to finish to avoid a + // race. + token->wait(); + } else { + // The job has not been executed, but we still need to inform the callback manager in + // order for future callbacks to be successfully called. + token->compiler.mCallbackManager.put(token->handle); + } + } else if (canceled) { + // Since the tick op was canceled, we need to .put the token here. + token->compiler.mCallbackManager.put(token->handle); + } + + for (GLuint& shader: token->gl.shaders) { + if (shader) { + if (token->gl.program) { + glDetachShader(token->gl.program, shader); + } + glDeleteShader(shader); + shader = 0; + } + } + if (token->gl.program) { + glDeleteProgram(token->gl.program); + } + + token.reset(); +} + +void ShaderCompilerService::tick() { + // we don't need to run executeTickOps() if we're using the thread-pool + if (UTILS_UNLIKELY(mMode != Mode::THREAD_POOL)) { + executeTickOps(); + } +} + +void ShaderCompilerService::notifyWhenAllProgramsAreReady( + CallbackHandler* handler, CallbackHandler::Callback callback, void* user) { + if (callback) { + mCallbackManager.setCallback(handler, callback, user); + } +} + +// ------------------------------------------------------------------------------------------------ + +void ShaderCompilerService::getProgramFromCompilerPool(program_token_t& token) noexcept { + OpenGLProgramToken::ProgramData const& programData{ token->get() }; + if (!token->canceled) { + token->gl.shaders = programData.shaders; + token->gl.program = programData.program; + } +} + +GLuint ShaderCompilerService::initialize(program_token_t& token) noexcept { + SYSTRACE_CALL(); + if (!token->gl.program) { + if (mMode == Mode::THREAD_POOL) { + // we need this program right now, remove it from the queue + auto job = mCompilerThreadPool.dequeue(token); + if (job) { + // if we were able to remove it, we execute the job now, otherwise it means + // it's being executed right now. + job(); + } + + if (!token->canceled) { + token->compiler.cancelTickOp(token); + } + + // Block until we get the program from the pool. Generally this wouldn't block + // because we just compiled the program above, when executing job. + ShaderCompilerService::getProgramFromCompilerPool(token); + } else if (mMode == Mode::ASYNCHRONOUS) { + // we force the program link -- which might stall, either here or below in + // checkProgramStatus(), but we don't have a choice, we need to use the program now. + token->compiler.cancelTickOp(token); + + token->gl.program = linkProgram(mDriver.getContext(), + token->gl.shaders, token->attributes); + + assert_invariant(token->gl.program); + + mCallbackManager.put(token->handle); + + if (token->key) { + mBlobCache.insert(mDriver.mPlatform, token->key, token->gl.program); + } + } else { + // if we don't have a program yet, block until we get it. + tick(); + } + } + + // by this point we must have a GL program + assert_invariant(token->gl.program); + + GLuint program = 0; + + // check status of program linking and shader compilation, logs error and free all resources + // in case of error. + bool const success = checkProgramStatus(token); + + // Unless we have matdbg, we panic if a program is invalid. Otherwise, we'd get a UB. + // The compilation error has been logged to log.e by this point. + FILAMENT_CHECK_POSTCONDITION(FILAMENT_ENABLE_MATDBG || success) + << "OpenGL program " << token->name.c_str_safe() << " failed to link or compile"; + + if (UTILS_LIKELY(success)) { + program = token->gl.program; + // no need to keep the shaders around + UTILS_NOUNROLL + for (GLuint& shader: token->gl.shaders) { + if (shader) { + glDetachShader(program, shader); + glDeleteShader(shader); + shader = 0; + } + } + } + + // and destroy all temporary init data + token = nullptr; + + return program; +} + + +/* + * Compile shaders in the ShaderSource. This cannot fail because compilation failures are not + * checked until after the program is linked. + * This always returns the GL shader IDs or zero a shader stage is not present. + */ +void ShaderCompilerService::compileShaders(OpenGLContext& context, + Program::ShaderSource shadersSource, + utils::FixedCapacityVector const& specializationConstants, + bool multiview, + std::array& outShaders, + UTILS_UNUSED_IN_RELEASE std::array& outShaderSourceCode) noexcept { + + SYSTRACE_CALL(); + + auto appendSpecConstantString = +[](std::string& s, Program::SpecializationConstant const& sc) { + s += "#define SPIRV_CROSS_CONSTANT_ID_" + std::to_string(sc.id) + ' '; + s += std::visit([](auto&& arg) { return to_string(arg); }, sc.value); + s += '\n'; + return s; + }; + + std::string specializationConstantString; + int32_t numViews = 2; + for (auto const& sc : specializationConstants) { + appendSpecConstantString(specializationConstantString, sc); + if (sc.id == 8) { + // This constant must match + // ReservedSpecializationConstants::CONFIG_STEREO_EYE_COUNT + // which we can't use here because it's defined in EngineEnums.h. + // (we're breaking layering here, but it's for the good cause). + numViews = std::get(sc.value); + } + } + if (!specializationConstantString.empty()) { + specializationConstantString += '\n'; + } + + // build all shaders + UTILS_NOUNROLL + for (size_t i = 0; i < Program::SHADER_TYPE_COUNT; i++) { + const ShaderStage stage = static_cast(i); + GLenum glShaderType{}; + switch (stage) { + case ShaderStage::VERTEX: + glShaderType = GL_VERTEX_SHADER; + break; + case ShaderStage::FRAGMENT: + glShaderType = GL_FRAGMENT_SHADER; + break; + case ShaderStage::COMPUTE: +#if defined(BACKEND_OPENGL_LEVEL_GLES31) + glShaderType = GL_COMPUTE_SHADER; +#else + continue; +#endif + break; + } + + if (UTILS_LIKELY(!shadersSource[i].empty())) { + Program::ShaderBlob& shader = shadersSource[i]; + char* shader_src = reinterpret_cast(shader.data()); + size_t shader_len = shader.size(); + + // remove GOOGLE_cpp_style_line_directive + process_GOOGLE_cpp_style_line_directive(context, shader_src, shader_len); + + // replace the value of layout(num_views = X) for multiview extension + if (multiview && stage == ShaderStage::VERTEX) { + process_OVR_multiview2(context, numViews, shader_src, shader_len); + } + + // add support for ARB_shading_language_packing if needed + auto const packingFunctions = process_ARB_shading_language_packing(context); + + // split shader source, so we can insert the specialization constants and the packing + // functions + auto [version, prolog, body] = splitShaderSource({ shader_src, shader_len }); + + // enable ESSL 3.10 if available + if (context.isAtLeastGLES<3, 1>()) { + version = "#version 310 es\n"; + } + + std::array sources = { + version, + prolog, + specializationConstantString, + packingFunctions, + { body.data(), body.size() - 1 } // null-terminated + }; + + // Some of the sources may be zero-length. Remove them as to avoid passing lengths of + // zero to glShaderSource(). glShaderSource should work with lengths of zero, but some + // drivers instead interpret zero as a sentinel for a null-terminated string. + auto partitionPoint = std::stable_partition( + sources.begin(), sources.end(), [](std::string_view s) { return !s.empty(); }); + size_t count = std::distance(sources.begin(), partitionPoint); + + std::array shaderStrings; + std::array lengths; + for (size_t i = 0; i < count; i++) { + shaderStrings[i] = sources[i].data(); + lengths[i] = sources[i].size(); + } + + GLuint const shaderId = glCreateShader(glShaderType); + glShaderSource(shaderId, count, shaderStrings.data(), lengths.data()); + + glCompileShader(shaderId); + +#ifndef NDEBUG + // for debugging we return the original shader source (without the modifications we + // made here), otherwise the line numbers wouldn't match. + outShaderSourceCode[i] = { shader_src, shader_len }; +#endif + + outShaders[i] = shaderId; + } + } +} + +// If usages of the Google-style line directive are present, remove them, as some +// drivers don't allow the quotation marks. This source modification happens in-place. +void ShaderCompilerService::process_GOOGLE_cpp_style_line_directive(OpenGLContext& context, + char* source, size_t len) noexcept { + if (!context.ext.GOOGLE_cpp_style_line_directive) { + if (UTILS_UNLIKELY(requestsGoogleLineDirectivesExtension({ source, len }))) { + removeGoogleLineDirectives(source, len); // length is unaffected + } + } +} + +// Look up the `source` to replace the number of eyes for multiview with the given number. This is +// necessary for OpenGL because OpenGL relies on the number specified in shader files to determine +// the number of views, which is assumed as a single digit, for multiview. +// This source modification happens in-place. +void ShaderCompilerService::process_OVR_multiview2(OpenGLContext& context, + int32_t eyeCount, char* source, size_t len) noexcept { + // We don't use regular expression in favor of performance. + if (context.ext.OVR_multiview2) { + const std::string_view shader{ source, len }; + const std::string_view layout = "layout"; + const std::string_view num_views = "num_views"; + size_t found = 0; + while (true) { + found = shader.find(layout, found); + if (found == std::string_view::npos) { + break; + } + found = shader.find_first_not_of(' ', found + layout.size()); + if (found == std::string_view::npos || shader[found] != '(') { + continue; + } + found = shader.find_first_not_of(' ', found + 1); + if (found == std::string_view::npos) { + continue; + } + if (shader.compare(found, num_views.size(), num_views) != 0) { + continue; + } + found = shader.find_first_not_of(' ', found + num_views.size()); + if (found == std::string_view::npos || shader[found] != '=') { + continue; + } + found = shader.find_first_not_of(' ', found + 1); + if (found == std::string_view::npos) { + continue; + } + // We assume the value should be one-digit number. + assert_invariant(eyeCount < 10); + assert_invariant(!::isdigit(source[found + 1])); + source[found] = '0' + eyeCount; + break; + } + } +} + +// Tragically, OpenGL 4.1 doesn't support unpackHalf2x16 (appeared in 4.2) and +// macOS doesn't support GL_ARB_shading_language_packing +// Also GLES3.0 didn't have the full set of packing/unpacking functions +std::string_view ShaderCompilerService::process_ARB_shading_language_packing(OpenGLContext& context) noexcept { + using namespace std::literals; +#ifdef BACKEND_OPENGL_VERSION_GL + if (!context.isAtLeastGL<4, 2>() && !context.ext.ARB_shading_language_packing) { + return R"( + +// these don't handle denormals, NaNs or inf +float u16tofp32(highp uint v) { + v <<= 16u; + highp uint s = v & 0x80000000u; + highp uint n = v & 0x7FFFFFFFu; + highp uint nz = (n == 0u) ? 0u : 0xFFFFFFFFu; + return uintBitsToFloat(s | ((((n >> 3u) + (0x70u << 23u))) & nz)); +} +vec2 unpackHalf2x16(highp uint v) { + return vec2(u16tofp32(v&0xFFFFu), u16tofp32(v>>16u)); +} +uint fp32tou16(float val) { + uint f32 = floatBitsToUint(val); + uint f16 = 0u; + uint sign = (f32 >> 16u) & 0x8000u; + int exponent = int((f32 >> 23u) & 0xFFu) - 127; + uint mantissa = f32 & 0x007FFFFFu; + if (exponent > 15) { + f16 = sign | (0x1Fu << 10u); + } else if (exponent > -15) { + exponent += 15; + mantissa >>= 13; + f16 = sign | uint(exponent << 10) | mantissa; + } else { + f16 = sign; + } + return f16; +} +highp uint packHalf2x16(vec2 v) { + highp uint x = fp32tou16(v.x); + highp uint y = fp32tou16(v.y); + return (y << 16u) | x; +} +highp uint packUnorm4x8(mediump vec4 v) { + v = round(clamp(v, 0.0, 1.0) * 255.0); + highp uint a = uint(v.x); + highp uint b = uint(v.y) << 8; + highp uint c = uint(v.z) << 16; + highp uint d = uint(v.w) << 24; + return (a|b|c|d); +} +highp uint packSnorm4x8(mediump vec4 v) { + v = round(clamp(v, -1.0, 1.0) * 127.0); + highp uint a = uint((int(v.x) & 0xff)); + highp uint b = uint((int(v.y) & 0xff)) << 8; + highp uint c = uint((int(v.z) & 0xff)) << 16; + highp uint d = uint((int(v.w) & 0xff)) << 24; + return (a|b|c|d); +} +mediump vec4 unpackUnorm4x8(highp uint v) { + return vec4(float((v & 0x000000ffu) ), + float((v & 0x0000ff00u) >> 8), + float((v & 0x00ff0000u) >> 16), + float((v & 0xff000000u) >> 24)) / 255.0; +} +mediump vec4 unpackSnorm4x8(highp uint v) { + int a = int(((v ) & 0xffu) << 24u) >> 24 ; + int b = int(((v >> 8u) & 0xffu) << 24u) >> 24 ; + int c = int(((v >> 16u) & 0xffu) << 24u) >> 24 ; + int d = int(((v >> 24u) & 0xffu) << 24u) >> 24 ; + return clamp(vec4(float(a), float(b), float(c), float(d)) / 127.0, -1.0, 1.0); +} +)"sv; + } +#endif // BACKEND_OPENGL_VERSION_GL + +#ifdef BACKEND_OPENGL_VERSION_GLES + if (!context.isES2() && !context.isAtLeastGLES<3, 1>()) { + return R"( + +highp uint packUnorm4x8(mediump vec4 v) { + v = round(clamp(v, 0.0, 1.0) * 255.0); + highp uint a = uint(v.x); + highp uint b = uint(v.y) << 8; + highp uint c = uint(v.z) << 16; + highp uint d = uint(v.w) << 24; + return (a|b|c|d); +} +highp uint packSnorm4x8(mediump vec4 v) { + v = round(clamp(v, -1.0, 1.0) * 127.0); + highp uint a = uint((int(v.x) & 0xff)); + highp uint b = uint((int(v.y) & 0xff)) << 8; + highp uint c = uint((int(v.z) & 0xff)) << 16; + highp uint d = uint((int(v.w) & 0xff)) << 24; + return (a|b|c|d); +} +mediump vec4 unpackUnorm4x8(highp uint v) { + return vec4(float((v & 0x000000ffu) ), + float((v & 0x0000ff00u) >> 8), + float((v & 0x00ff0000u) >> 16), + float((v & 0xff000000u) >> 24)) / 255.0; +} +mediump vec4 unpackSnorm4x8(highp uint v) { + int a = int(((v ) & 0xffu) << 24u) >> 24 ; + int b = int(((v >> 8u) & 0xffu) << 24u) >> 24 ; + int c = int(((v >> 16u) & 0xffu) << 24u) >> 24 ; + int d = int(((v >> 24u) & 0xffu) << 24u) >> 24 ; + return clamp(vec4(float(a), float(b), float(c), float(d)) / 127.0, -1.0, 1.0); +} +)"sv; + } +#endif // BACKEND_OPENGL_VERSION_GLES + return ""sv; +} + +// split shader source code in three: +// - the version line +// - extensions +// - everything else +std::array ShaderCompilerService::splitShaderSource(std::string_view source) noexcept { + auto version_start = source.find("#version"); + assert_invariant(version_start != std::string_view::npos); + + auto version_eol = source.find('\n', version_start) + 1; + assert_invariant(version_eol != std::string_view::npos); + + auto prolog_start = version_eol; + auto prolog_eol = source.rfind("\n#extension"); // last #extension line + if (prolog_eol == std::string_view::npos) { + prolog_eol = prolog_start; + } else { + prolog_eol = source.find('\n', prolog_eol + 1) + 1; + } + auto body_start = prolog_eol; + + std::string_view const version = source.substr(version_start, version_eol - version_start); + std::string_view const prolog = source.substr(prolog_start, prolog_eol - prolog_start); + std::string_view const body = source.substr(body_start, source.length() - body_start); + return { version, prolog, body }; +} + +/* + * Create a program from the given shader IDs and links it. This cannot fail because errors + * are checked later. This always returns a valid GL program ID (which doesn't mean the + * program itself is valid). + */ +GLuint ShaderCompilerService::linkProgram(OpenGLContext& context, + std::array shaders, + utils::FixedCapacityVector> const& attributes) noexcept { + + SYSTRACE_CALL(); + + GLuint const program = glCreateProgram(); + for (auto shader : shaders) { + if (shader) { + glAttachShader(program, shader); + } + } + + if (UTILS_UNLIKELY(context.isES2())) { + for (auto const& [ name, loc ] : attributes) { + glBindAttribLocation(program, loc, name.c_str()); + } + } + + glLinkProgram(program); + + return program; +} + +// ------------------------------------------------------------------------------------------------ + +void ShaderCompilerService::runAtNextTick(CompilerPriorityQueue priority, + const program_token_t& token, Job job) noexcept { + // insert items in order of priority and at the end of the range + auto& ops = mRunAtNextTickOps; + auto const pos = std::lower_bound(ops.begin(), ops.end(), priority, + [](ContainerType const& lhs, CompilerPriorityQueue priorityQueue) { + return std::get<0>(lhs) < priorityQueue; + }); + ops.emplace(pos, priority, token, std::move(job)); + + SYSTRACE_CONTEXT(); + SYSTRACE_VALUE32("ShaderCompilerService Jobs", mRunAtNextTickOps.size()); +} + +bool ShaderCompilerService::cancelTickOp(program_token_t token) noexcept { + // We do a linear search here, but this is rare, and we know the list is pretty small. + auto& ops = mRunAtNextTickOps; + auto pos = std::find_if(ops.begin(), ops.end(), [&](const auto& item) { + return std::get<1>(item) == token; + }); + if (pos != ops.end()) { + ops.erase(pos); + return true; + } + SYSTRACE_CONTEXT(); + SYSTRACE_VALUE32("ShaderCompilerService Jobs", ops.size()); + return false; +} + +void ShaderCompilerService::executeTickOps() noexcept { + auto& ops = mRunAtNextTickOps; + auto it = ops.begin(); + while (it != ops.end()) { + Job const& job = std::get<2>(*it); + bool const remove = job.fn(job); + if (remove) { + it = ops.erase(it); + } else { + ++it; + } + } + SYSTRACE_CONTEXT(); + SYSTRACE_VALUE32("ShaderCompilerService Jobs", ops.size()); +} + +// ------------------------------------------------------------------------------------------------ + +/* + * Checks a program link status and logs errors and frees resources on failure. + * Returns true on success. + */ +bool ShaderCompilerService::checkProgramStatus(program_token_t const& token) noexcept { + + SYSTRACE_CALL(); + + assert_invariant(token->gl.program); + + GLint status; + glGetProgramiv(token->gl.program, GL_LINK_STATUS, &status); + if (UTILS_LIKELY(status == GL_TRUE)) { + return true; + } + + // only if the link fails, we check the compilation status + UTILS_NOUNROLL + for (size_t i = 0; i < Program::SHADER_TYPE_COUNT; i++) { + const ShaderStage type = static_cast(i); + const GLuint shader = token->gl.shaders[i]; + if (shader) { + glGetShaderiv(shader, GL_COMPILE_STATUS, &status); + if (status != GL_TRUE) { + logCompilationError(slog.e, type, + token->name.c_str_safe(), shader, token->shaderSourceCode[i]); + } + glDetachShader(token->gl.program, shader); + glDeleteShader(shader); + token->gl.shaders[i] = 0; + } + } + // log the link error as well + logProgramLinkError(slog.e, token->name.c_str_safe(), token->gl.program); + glDeleteProgram(token->gl.program); + token->gl.program = 0; + return false; +} + +UTILS_NOINLINE +void logCompilationError(io::ostream& out, ShaderStage shaderType, + const char* name, GLuint shaderId, + UTILS_UNUSED_IN_RELEASE CString const& sourceCode) noexcept { + + auto to_string = [](ShaderStage type) -> const char* { + switch (type) { + case ShaderStage::VERTEX: return "vertex"; + case ShaderStage::FRAGMENT: return "fragment"; + case ShaderStage::COMPUTE: return "compute"; + } + }; + + { // scope for the temporary string storage + GLint length = 0; + glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &length); + + CString infoLog(length); + glGetShaderInfoLog(shaderId, length, nullptr, infoLog.data()); + + out << "Compilation error in " << to_string(shaderType) << " shader \"" << name << "\":\n" + << "\"" << infoLog.c_str() << "\"" + << io::endl; + } + +#ifndef NDEBUG + std::string_view const shader{ sourceCode.data(), sourceCode.size() }; + size_t lc = 1; + size_t start = 0; + std::string line; + while (true) { + size_t const end = shader.find('\n', start); + if (end == std::string::npos) { + line = shader.substr(start); + } else { + line = shader.substr(start, end - start); + } + out << lc++ << ": " << line.c_str() << '\n'; + if (end == std::string::npos) { + break; + } + start = end + 1; + } + out << io::endl; +#endif +} + +UTILS_NOINLINE +void logProgramLinkError(io::ostream& out, char const* name, GLuint program) noexcept { + GLint length = 0; + glGetProgramiv(program, GL_INFO_LOG_LENGTH, &length); + + CString infoLog(length); + glGetProgramInfoLog(program, length, nullptr, infoLog.data()); + + out << "Link error in \"" << name << "\":\n" + << "\"" << infoLog.c_str() << "\"" + << io::endl; +} + + +} // namespace filament::backend diff --git a/filament/backend/src/opengl/ShaderCompilerService.h b/filament/backend/src/opengl/ShaderCompilerService.h new file mode 100644 index 00000000000..ef4059fc0bc --- /dev/null +++ b/filament/backend/src/opengl/ShaderCompilerService.h @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_OPENGL_SHADERCOMPILERSERVICE_H +#define TNT_FILAMENT_BACKEND_OPENGL_SHADERCOMPILERSERVICE_H + +#include "gl_headers.h" + +#include "CallbackManager.h" +#include "CompilerThreadPool.h" +#include "OpenGLBlobCache.h" + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace filament::backend { + +class OpenGLDriver; +class OpenGLContext; +class OpenGLPlatform; +class Program; +class CallbackHandler; + +/* + * A class handling shader compilation that supports asynchronous compilation. + */ +class ShaderCompilerService { + struct OpenGLProgramToken; + +public: + using program_token_t = std::shared_ptr; + + explicit ShaderCompilerService(OpenGLDriver& driver); + + ShaderCompilerService(ShaderCompilerService const& rhs) = delete; + ShaderCompilerService(ShaderCompilerService&& rhs) = delete; + ShaderCompilerService& operator=(ShaderCompilerService const& rhs) = delete; + ShaderCompilerService& operator=(ShaderCompilerService&& rhs) = delete; + + ~ShaderCompilerService() noexcept; + + bool isParallelShaderCompileSupported() const noexcept; + + void init() noexcept; + void terminate() noexcept; + + // creates a program (compile + link) asynchronously if supported + program_token_t createProgram(utils::CString const& name, Program&& program); + + // Return the GL program, blocks if necessary. The Token is destroyed and becomes invalid. + GLuint getProgram(program_token_t& token); + + // Must be called at least once per frame. + void tick(); + + // Destroys a valid token and all associated resources. Used to "cancel" a program compilation. + static void terminate(program_token_t& token); + + // stores a user data pointer in the token + static void setUserData(const program_token_t& token, void* user) noexcept; + + // retrieves the user data pointer stored in the token + static void* getUserData(const program_token_t& token) noexcept; + + // call the callback when all active programs are ready + void notifyWhenAllProgramsAreReady( + CallbackHandler* handler, CallbackHandler::Callback callback, void* user); + +private: + struct Job { + template + Job(FUNC&& fn) : fn(std::forward(fn)) {} + Job(std::function fn, + CallbackHandler* handler, void* user, CallbackHandler::Callback callback) + : fn(std::move(fn)), handler(handler), user(user), callback(callback) { + } + std::function fn; + CallbackHandler* handler = nullptr; + void* user = nullptr; + CallbackHandler::Callback callback{}; + }; + + enum class Mode { + UNDEFINED, // init() has not been called yet. + SYNCHRONOUS, // synchronous shader compilation + THREAD_POOL, // asynchronous shader compilation using a thread-pool (most common) + ASYNCHRONOUS // asynchronous shader compilation using KHR_parallel_shader_compile + }; + + OpenGLDriver& mDriver; + OpenGLBlobCache mBlobCache; + CallbackManager mCallbackManager; + CompilerThreadPool mCompilerThreadPool; + + uint32_t mShaderCompilerThreadCount = 0u; + Mode mMode = Mode::UNDEFINED; // valid after init() is called + + using ContainerType = std::tuple; + std::vector mRunAtNextTickOps; + + GLuint initialize(ShaderCompilerService::program_token_t& token) noexcept; + + static void getProgramFromCompilerPool(program_token_t& token) noexcept; + + static void compileShaders( + OpenGLContext& context, + Program::ShaderSource shadersSource, + utils::FixedCapacityVector const& specializationConstants, + bool multiview, + std::array& outShaders, + std::array& outShaderSourceCode) noexcept; + + static void process_GOOGLE_cpp_style_line_directive(OpenGLContext& context, + char* source, size_t len) noexcept; + + static void process_OVR_multiview2(OpenGLContext& context, int32_t eyeCount, + char* source, size_t len) noexcept; + + static std::string_view process_ARB_shading_language_packing(OpenGLContext& context) noexcept; + + static std::array splitShaderSource(std::string_view source) noexcept; + + static GLuint linkProgram(OpenGLContext& context, + std::array shaders, + utils::FixedCapacityVector> const& attributes) noexcept; + + static bool checkProgramStatus(program_token_t const& token) noexcept; + + void runAtNextTick(CompilerPriorityQueue priority, + const program_token_t& token, Job job) noexcept; + void executeTickOps() noexcept; + bool cancelTickOp(program_token_t token) noexcept; + // order of insertion is important +}; + +} // namespace filament::backend + +#endif // TNT_FILAMENT_BACKEND_OPENGL_SHADERCOMPILERSERVICE_H diff --git a/filament/backend/src/opengl/gl_headers.cpp b/filament/backend/src/opengl/gl_headers.cpp index fa1b1414f7b..cb1f022d517 100644 --- a/filament/backend/src/opengl/gl_headers.cpp +++ b/filament/backend/src/opengl/gl_headers.cpp @@ -16,16 +16,19 @@ #include "gl_headers.h" -#if defined(__ANDROID__) || defined(FILAMENT_USE_EXTERNAL_GLES3) || defined(__EMSCRIPTEN__) +#if defined(FILAMENT_IMPORT_ENTRY_POINTS) #include #include +// for non EGL platforms, we'd need to implement this differently. Currently, it's not a problem. +template +static void getProcAddress(T& pfn, const char* name) noexcept { + pfn = (T)eglGetProcAddress(name); +} + namespace glext { -#ifdef GL_QCOM_tiled_rendering -PFNGLSTARTTILINGQCOMPROC glStartTilingQCOM; -PFNGLENDTILINGQCOMPROC glEndTilingQCOM; -#endif +#ifndef __EMSCRIPTEN__ #ifdef GL_OES_EGL_image PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES; #endif @@ -43,86 +46,90 @@ PFNGLDEBUGMESSAGECALLBACKKHRPROC glDebugMessageCallbackKHR; PFNGLGETDEBUGMESSAGELOGKHRPROC glGetDebugMessageLogKHR; #endif #ifdef GL_EXT_disjoint_timer_query -PFNGLGETQUERYOBJECTUI64VEXTPROC glGetQueryObjectui64v; +PFNGLGENQUERIESEXTPROC glGenQueriesEXT; +PFNGLDELETEQUERIESEXTPROC glDeleteQueriesEXT; +PFNGLBEGINQUERYEXTPROC glBeginQueryEXT; +PFNGLENDQUERYEXTPROC glEndQueryEXT; +PFNGLGETQUERYOBJECTUIVEXTPROC glGetQueryObjectuivEXT; +PFNGLGETQUERYOBJECTUI64VEXTPROC glGetQueryObjectui64vEXT; +#endif +#ifdef GL_OES_vertex_array_object +PFNGLBINDVERTEXARRAYOESPROC glBindVertexArrayOES; +PFNGLDELETEVERTEXARRAYSOESPROC glDeleteVertexArraysOES; +PFNGLGENVERTEXARRAYSOESPROC glGenVertexArraysOES; #endif #ifdef GL_EXT_clip_control -PFNGLCLIPCONTROLEXTPROC glClipControl; +PFNGLCLIPCONTROLEXTPROC glClipControlEXT; +#endif +#ifdef GL_EXT_discard_framebuffer +PFNGLDISCARDFRAMEBUFFEREXTPROC glDiscardFramebufferEXT; +#endif +#ifdef GL_KHR_parallel_shader_compile +PFNGLMAXSHADERCOMPILERTHREADSKHRPROC glMaxShaderCompilerThreadsKHR; +#endif +#ifdef GL_OVR_multiview +PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC glFramebufferTextureMultiviewOVR; #endif -#if defined(__ANDROID__) +#if defined(__ANDROID__) && !defined(FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2) // On Android, If we want to support a build system less than ANDROID_API 21, we need to // use getProcAddress for ES3.1 and above entry points. PFNGLDISPATCHCOMPUTEPROC glDispatchCompute; #endif - static std::once_flag sGlExtInitialized; +#endif // __EMSCRIPTEN__ void importGLESExtensionsEntryPoints() { - std::call_once(sGlExtInitialized, []() { -#ifdef GL_QCOM_tiled_rendering - glStartTilingQCOM = - (PFNGLSTARTTILINGQCOMPROC)eglGetProcAddress( - "glStartTilingQCOM"); - - glEndTilingQCOM = - (PFNGLENDTILINGQCOMPROC)eglGetProcAddress( - "glEndTilingQCOM"); -#endif - +#ifndef __EMSCRIPTEN__ + std::call_once(sGlExtInitialized, +[]() { #ifdef GL_OES_EGL_image - glEGLImageTargetTexture2DOES = - (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)eglGetProcAddress( - "glEGLImageTargetTexture2DOES"); + getProcAddress(glEGLImageTargetTexture2DOES, "glEGLImageTargetTexture2DOES"); #endif - #if GL_EXT_debug_marker - glInsertEventMarkerEXT = - (PFNGLINSERTEVENTMARKEREXTPROC)eglGetProcAddress( - "glInsertEventMarkerEXT"); - - glPushGroupMarkerEXT = - (PFNGLPUSHGROUPMARKEREXTPROC)eglGetProcAddress( - "glPushGroupMarkerEXT"); - - glPopGroupMarkerEXT = - (PFNGLPOPGROUPMARKEREXTPROC)eglGetProcAddress( - "glPopGroupMarkerEXT"); + getProcAddress(glInsertEventMarkerEXT, "glInsertEventMarkerEXT"); + getProcAddress(glPushGroupMarkerEXT, "glPushGroupMarkerEXT"); + getProcAddress(glPopGroupMarkerEXT, "glPopGroupMarkerEXT"); #endif #if GL_EXT_multisampled_render_to_texture - glFramebufferTexture2DMultisampleEXT = - (PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC)eglGetProcAddress( - "glFramebufferTexture2DMultisampleEXT"); - glRenderbufferStorageMultisampleEXT = - (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)eglGetProcAddress( - "glRenderbufferStorageMultisampleEXT"); + getProcAddress(glFramebufferTexture2DMultisampleEXT, "glFramebufferTexture2DMultisampleEXT"); + getProcAddress(glRenderbufferStorageMultisampleEXT, "glRenderbufferStorageMultisampleEXT"); #endif #ifdef GL_KHR_debug - glDebugMessageCallbackKHR = - (PFNGLDEBUGMESSAGECALLBACKKHRPROC)eglGetProcAddress( - "glDebugMessageCallbackKHR"); - glGetDebugMessageLogKHR = - (PFNGLGETDEBUGMESSAGELOGKHRPROC)eglGetProcAddress( - "glGetDebugMessageLogKHR"); + getProcAddress(glDebugMessageCallbackKHR, "glDebugMessageCallbackKHR"); + getProcAddress(glGetDebugMessageLogKHR, "glGetDebugMessageLogKHR"); #endif #ifdef GL_EXT_disjoint_timer_query - glGetQueryObjectui64v = - (PFNGLGETQUERYOBJECTUI64VEXTPROC)eglGetProcAddress( - "glGetQueryObjectui64vEXT"); + getProcAddress(glGenQueriesEXT, "glGenQueriesEXT"); + getProcAddress(glDeleteQueriesEXT, "glDeleteQueriesEXT"); + getProcAddress(glBeginQueryEXT, "glBeginQueryEXT"); + getProcAddress(glEndQueryEXT, "glEndQueryEXT"); + getProcAddress(glGetQueryObjectuivEXT, "glGetQueryObjectuivEXT"); + getProcAddress(glGetQueryObjectui64vEXT, "glGetQueryObjectui64vEXT"); +#endif +#if defined(GL_OES_vertex_array_object) + getProcAddress(glBindVertexArrayOES, "glBindVertexArrayOES"); + getProcAddress(glDeleteVertexArraysOES, "glDeleteVertexArraysOES"); + getProcAddress(glGenVertexArraysOES, "glGenVertexArraysOES"); #endif - }); #ifdef GL_EXT_clip_control - glClipControl = - (PFNGLCLIPCONTROLEXTPROC)eglGetProcAddress( - "glClipControlEXT"); + getProcAddress(glClipControlEXT, "glClipControlEXT"); #endif - -#if defined(__ANDROID__) - glDispatchCompute = - (PFNGLDISPATCHCOMPUTEPROC)eglGetProcAddress( - "glDispatchCompute"); +#ifdef GL_EXT_discard_framebuffer + getProcAddress(glDiscardFramebufferEXT, "glDiscardFramebufferEXT"); #endif +#ifdef GL_KHR_parallel_shader_compile + getProcAddress(glMaxShaderCompilerThreadsKHR, "glMaxShaderCompilerThreadsKHR"); +#endif +#ifdef GL_OVR_multiview + getProcAddress(glFramebufferTextureMultiviewOVR, "glFramebufferTextureMultiviewOVR"); +#endif +#if defined(__ANDROID__) && !defined(FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2) + getProcAddress(glDispatchCompute, "glDispatchCompute"); +#endif + }); +#endif // __EMSCRIPTEN__ } } // namespace glext -#endif +#endif // defined(FILAMENT_IMPORT_ENTRY_POINTS) diff --git a/filament/backend/src/opengl/gl_headers.h b/filament/backend/src/opengl/gl_headers.h index 68fc3849103..636bdb48241 100644 --- a/filament/backend/src/opengl/gl_headers.h +++ b/filament/backend/src/opengl/gl_headers.h @@ -17,55 +17,46 @@ #ifndef TNT_FILAMENT_BACKEND_OPENGL_GL_HEADERS_H #define TNT_FILAMENT_BACKEND_OPENGL_GL_HEADERS_H +/* + * Configuration we aim to support: + * + * GL 4.5 headers + * - GL 4.1 runtime (for macOS) + * - GL 4.5 runtime + * + * GLES 2.0 headers + * - GLES 2.0 runtime Android only + * + * GLES 3.0 headers + * - GLES 3.0 runtime iOS and WebGL2 only + * + * GLES 3.1 headers + * - GLES 2.0 runtime + * - GLES 3.0 runtime + * - GLES 3.1 runtime + */ + + #if defined(__ANDROID__) || defined(FILAMENT_USE_EXTERNAL_GLES3) || defined(__EMSCRIPTEN__) #if defined(__EMSCRIPTEN__) # include #else +// # include # include #endif #include - /* The Android NDK doesn't expose extensions, fake it with eglGetProcAddress */ - namespace glext { - // importGLESExtensionsEntryPoints is thread-safe and can be called multiple times. - // it is currently called from PlatformEGL. - void importGLESExtensionsEntryPoints(); - -#ifdef GL_QCOM_tiled_rendering - extern PFNGLSTARTTILINGQCOMPROC glStartTilingQCOM; - extern PFNGLENDTILINGQCOMPROC glEndTilingQCOM; -#endif -#ifdef GL_OES_EGL_image - extern PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES; -#endif -#ifdef GL_EXT_debug_marker - extern PFNGLINSERTEVENTMARKEREXTPROC glInsertEventMarkerEXT; - extern PFNGLPUSHGROUPMARKEREXTPROC glPushGroupMarkerEXT; - extern PFNGLPOPGROUPMARKEREXTPROC glPopGroupMarkerEXT; -#endif -#ifdef GL_EXT_multisampled_render_to_texture - extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT; - extern PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC glFramebufferTexture2DMultisampleEXT; -#endif -#ifdef GL_KHR_debug - extern PFNGLDEBUGMESSAGECALLBACKKHRPROC glDebugMessageCallbackKHR; - extern PFNGLGETDEBUGMESSAGELOGKHRPROC glGetDebugMessageLogKHR; -#endif -#ifdef GL_EXT_disjoint_timer_query - extern PFNGLGETQUERYOBJECTUI64VEXTPROC glGetQueryObjectui64v; -#endif -#ifdef GL_EXT_clip_control - extern PFNGLCLIPCONTROLEXTPROC glClipControl; -#endif -#if defined(__ANDROID__) - extern PFNGLDISPATCHCOMPUTEPROC glDispatchCompute; -#endif - } - - using namespace glext; + // For development and debugging purpose only, we want to support compiling this backend + // with ES2 only headers, in this case (i.e. we have VERSION_2 but not VERSION_3+), + // we define FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 with the purpose of compiling out + // code that cannot be compiled with ES2 headers. In production, this code is compiled in but + // is never executed thanks to runtime checks or asserts. + #if defined(GL_ES_VERSION_2_0) && !defined(GL_ES_VERSION_3_0) + # define FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2 + #endif -#elif defined(IOS) +#elif defined(FILAMENT_IOS) #define GLES_SILENCE_DEPRECATION @@ -85,110 +76,192 @@ #endif -#if (!defined(GL_ES_VERSION_2_0) && !defined(GL_VERSION_4_1)) -#error "Minimum header version must be OpenGL ES 2.0 or OpenGL 4.1" -#endif +/* Validate the header configurations we aim to support */ +#if defined(GL_VERSION_4_5) +#elif defined(GL_ES_VERSION_3_1) +#elif defined(GL_ES_VERSION_3_0) +# if !defined(FILAMENT_IOS) && !defined(__EMSCRIPTEN__) +# error "GLES 3.0 headers only supported on iOS and WebGL2" +# endif +#elif defined(GL_ES_VERSION_2_0) +# if !defined(__ANDROID__) +# error "GLES 2.0 headers only supported on Android" +# endif +#else +# error "Minimum header version must be OpenGL ES 2.0 or OpenGL 4.5" +#endif /* - * Since we need ES3.1 headers and iOS only has ES3.0, we also define the constants we - * need to avoid many #ifdef in the actual code. + * GLES extensions */ -#if defined(GL_ES_VERSION_2_0) +#if defined(GL_ES_VERSION_2_0) // this basically means all versions of GLES -#ifdef GL_EXT_disjoint_timer_query -# ifndef GL_TIME_ELAPSED -# define GL_TIME_ELAPSED GL_TIME_ELAPSED_EXT -# endif -#endif +#if defined(FILAMENT_IOS) + +// iOS headers only provide prototypes, nothing to do. + +#else + +#define FILAMENT_IMPORT_ENTRY_POINTS + +/* The Android NDK doesn't expose extensions, fake it with eglGetProcAddress */ +namespace glext { +// importGLESExtensionsEntryPoints is thread-safe and can be called multiple times. +// it is currently called from PlatformEGL. +void importGLESExtensionsEntryPoints(); +#ifndef __EMSCRIPTEN__ +#ifdef GL_OES_EGL_image +extern PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES; +#endif +#ifdef GL_EXT_debug_marker +extern PFNGLINSERTEVENTMARKEREXTPROC glInsertEventMarkerEXT; +extern PFNGLPUSHGROUPMARKEREXTPROC glPushGroupMarkerEXT; +extern PFNGLPOPGROUPMARKEREXTPROC glPopGroupMarkerEXT; +#endif +#ifdef GL_EXT_multisampled_render_to_texture +extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT; +extern PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC glFramebufferTexture2DMultisampleEXT; +#endif +#ifdef GL_KHR_debug +extern PFNGLDEBUGMESSAGECALLBACKKHRPROC glDebugMessageCallbackKHR; +extern PFNGLGETDEBUGMESSAGELOGKHRPROC glGetDebugMessageLogKHR; +#endif #ifdef GL_EXT_clip_control -# ifndef GL_LOWER_LEFT -# define GL_LOWER_LEFT GL_LOWER_LEFT_EXT -# endif -# ifndef GL_ZERO_TO_ONE -# define GL_ZERO_TO_ONE GL_ZERO_TO_ONE_EXT -# endif +extern PFNGLCLIPCONTROLEXTPROC glClipControlEXT; +#endif +#ifdef GL_EXT_disjoint_timer_query +extern PFNGLGENQUERIESEXTPROC glGenQueriesEXT; +extern PFNGLDELETEQUERIESEXTPROC glDeleteQueriesEXT; +extern PFNGLBEGINQUERYEXTPROC glBeginQueryEXT; +extern PFNGLENDQUERYEXTPROC glEndQueryEXT; +extern PFNGLGETQUERYOBJECTUIVEXTPROC glGetQueryObjectuivEXT; +extern PFNGLGETQUERYOBJECTUI64VEXTPROC glGetQueryObjectui64vEXT; +#endif +#ifdef GL_OES_vertex_array_object +extern PFNGLBINDVERTEXARRAYOESPROC glBindVertexArrayOES; +extern PFNGLDELETEVERTEXARRAYSOESPROC glDeleteVertexArraysOES; +extern PFNGLGENVERTEXARRAYSOESPROC glGenVertexArraysOES; #endif +#ifdef GL_EXT_discard_framebuffer +extern PFNGLDISCARDFRAMEBUFFEREXTPROC glDiscardFramebufferEXT; +#endif +#ifdef GL_KHR_parallel_shader_compile +extern PFNGLMAXSHADERCOMPILERTHREADSKHRPROC glMaxShaderCompilerThreadsKHR; +#endif +#ifdef GL_OVR_multiview +extern PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC glFramebufferTextureMultiviewOVR; +#endif +#if defined(__ANDROID__) && !defined(FILAMENT_SILENCE_NOT_SUPPORTED_BY_ES2) +extern PFNGLDISPATCHCOMPUTEPROC glDispatchCompute; +#endif +#endif // __EMSCRIPTEN__ +} // namespace glext + +using namespace glext; -#ifndef GL_TEXTURE_CUBE_MAP_ARRAY -# define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 #endif // Prevent lots of #ifdef's between desktop and mobile -#if defined(GL_KHR_debug) -# ifndef GL_DEBUG_OUTPUT -# define GL_DEBUG_OUTPUT GL_DEBUG_OUTPUT_KHR -# endif -# ifndef GL_DEBUG_OUTPUT_SYNCHRONOUS -# define GL_DEBUG_OUTPUT_SYNCHRONOUS GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR +#ifdef GL_EXT_disjoint_timer_query +# define GL_TIME_ELAPSED GL_TIME_ELAPSED_EXT +# ifndef GL_ES_VERSION_3_0 +# define GL_QUERY_RESULT_AVAILABLE GL_QUERY_RESULT_AVAILABLE_EXT +# define GL_QUERY_RESULT GL_QUERY_RESULT_EXT # endif +#endif -# ifndef GL_DEBUG_SEVERITY_HIGH -# define GL_DEBUG_SEVERITY_HIGH GL_DEBUG_SEVERITY_HIGH_KHR -# endif -# ifndef GL_DEBUG_SEVERITY_MEDIUM -# define GL_DEBUG_SEVERITY_MEDIUM GL_DEBUG_SEVERITY_MEDIUM_KHR -# endif -# ifndef GL_DEBUG_SEVERITY_LOW -# define GL_DEBUG_SEVERITY_LOW GL_DEBUG_SEVERITY_LOW_KHR -# endif -# ifndef GL_DEBUG_SEVERITY_NOTIFICATION -# define GL_DEBUG_SEVERITY_NOTIFICATION GL_DEBUG_SEVERITY_NOTIFICATION_KHR -# endif +#ifdef GL_EXT_clip_control +# define GL_LOWER_LEFT GL_LOWER_LEFT_EXT +# define GL_ZERO_TO_ONE GL_ZERO_TO_ONE_EXT +#endif -# ifndef GL_DEBUG_TYPE_MARKER -# define GL_DEBUG_TYPE_MARKER GL_DEBUG_TYPE_MARKER_KHR -# endif -# ifndef GL_DEBUG_TYPE_ERROR -# define GL_DEBUG_TYPE_ERROR GL_DEBUG_TYPE_ERROR_KHR -# endif -# ifndef GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR -# define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR +#ifdef GL_KHR_parallel_shader_compile +# define GL_COMPLETION_STATUS GL_COMPLETION_STATUS_KHR +#else +# define GL_COMPLETION_STATUS 0x91B1 +#endif + +// we need GL_TEXTURE_CUBE_MAP_ARRAY defined, but we won't use it if the extension/feature +// is not available. +#if defined(GL_EXT_texture_cube_map_array) +# define GL_TEXTURE_CUBE_MAP_ARRAY GL_TEXTURE_CUBE_MAP_ARRAY_EXT +#else +# define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#endif + +#if defined(GL_EXT_clip_cull_distance) +# define GL_CLIP_DISTANCE0 GL_CLIP_DISTANCE0_EXT +# define GL_CLIP_DISTANCE1 GL_CLIP_DISTANCE1_EXT +#else +# define GL_CLIP_DISTANCE0 0x3000 +# define GL_CLIP_DISTANCE1 0x3001 +#endif + +#if defined(GL_EXT_depth_clamp) +# define GL_DEPTH_CLAMP GL_DEPTH_CLAMP_EXT +#else +# define GL_DEPTH_CLAMP 0x864F +#endif + +#if defined(GL_KHR_debug) +# define GL_DEBUG_OUTPUT GL_DEBUG_OUTPUT_KHR +# define GL_DEBUG_OUTPUT_SYNCHRONOUS GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR +# define GL_DEBUG_SEVERITY_HIGH GL_DEBUG_SEVERITY_HIGH_KHR +# define GL_DEBUG_SEVERITY_MEDIUM GL_DEBUG_SEVERITY_MEDIUM_KHR +# define GL_DEBUG_SEVERITY_LOW GL_DEBUG_SEVERITY_LOW_KHR +# define GL_DEBUG_SEVERITY_NOTIFICATION GL_DEBUG_SEVERITY_NOTIFICATION_KHR +# define GL_DEBUG_TYPE_MARKER GL_DEBUG_TYPE_MARKER_KHR +# define GL_DEBUG_TYPE_ERROR GL_DEBUG_TYPE_ERROR_KHR +# define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR +# define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR +# define GL_DEBUG_TYPE_PORTABILITY GL_DEBUG_TYPE_PORTABILITY_KHR +# define GL_DEBUG_TYPE_PERFORMANCE GL_DEBUG_TYPE_PERFORMANCE_KHR +# define GL_DEBUG_TYPE_OTHER GL_DEBUG_TYPE_OTHER_KHR +# define glDebugMessageCallback glDebugMessageCallbackKHR +#endif + +// token that exist in ES3 core but are extensions (mandatory or not) in ES2 +#ifndef GL_ES_VERSION_3_0 +# ifdef GL_OES_vertex_array_object +# define GL_VERTEX_ARRAY_BINDING GL_VERTEX_ARRAY_BINDING_OES # endif -# ifndef GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR -# define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR +# ifdef GL_OES_rgb8_rgba8 +# define GL_RGB8 0x8051 +# define GL_RGBA8 0x8058 # endif -# ifndef GL_DEBUG_TYPE_PORTABILITY -# define GL_DEBUG_TYPE_PORTABILITY GL_DEBUG_TYPE_PORTABILITY_KHR +# ifdef GL_OES_depth24 +# define GL_DEPTH_COMPONENT24 GL_DEPTH_COMPONENT24_OES # endif -# ifndef GL_DEBUG_TYPE_PERFORMANCE -# define GL_DEBUG_TYPE_PERFORMANCE GL_DEBUG_TYPE_PERFORMANCE_KHR +# ifdef GL_EXT_discard_framebuffer +# define GL_COLOR GL_COLOR_EXT +# define GL_DEPTH GL_DEPTH_EXT +# define GL_STENCIL GL_STENCIL_EXT # endif -# ifndef GL_DEBUG_TYPE_OTHER -# define GL_DEBUG_TYPE_OTHER GL_DEBUG_TYPE_OTHER_KHR +# ifdef GL_OES_packed_depth_stencil +# define GL_DEPTH_STENCIL GL_DEPTH_STENCIL_OES +# define GL_UNSIGNED_INT_24_8 GL_UNSIGNED_INT_24_8_OES +# define GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_OES # endif - -# define glDebugMessageCallback glDebugMessageCallbackKHR #endif -/* The iOS SDK only provides OpenGL ES headers up to 3.0. Filament works with OpenGL 3.0, but - * requires ES3.1 headers */ -#if !defined(GL_ES_VERSION_3_1) - #define GL_SHADER_STORAGE_BUFFER 0x90D2 - #define GL_COMPUTE_SHADER 0x91B9 +#else // All version OpenGL below - #define GL_TEXTURE_2D_MULTISAMPLE 0x9100 - -// FIXME: The GL_TIME_ELAPSED define is used unconditionally in Filament, but -// requires extension support. -#ifndef GL_TIME_ELAPSED - #define GL_TIME_ELAPSED 0x88BF +#ifdef GL_ARB_parallel_shader_compile +# define GL_COMPLETION_STATUS GL_COMPLETION_STATUS_ARB +#else +# define GL_COMPLETION_STATUS 0x91B1 #endif - #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 +#endif // GL_ES_VERSION_2_0 +// This is just to simplify the implementation (i.e. so we don't have to have #ifdefs everywhere) +#ifndef GL_OES_EGL_image_external +#define GL_TEXTURE_EXTERNAL_OES 0x8D65 #endif -#endif // GL_ES_VERSION_2_0 // This is an odd duck function that exists in WebGL 2.0 but not in OpenGL ES. #if defined(__EMSCRIPTEN__) @@ -197,34 +270,39 @@ void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *d } #endif +#ifdef GL_ES_VERSION_2_0 +# ifndef FILAMENT_IOS +# ifndef GL_OES_vertex_array_object +# error "Headers with GL_OES_vertex_array_object are mandatory unless on iOS" +# endif +# ifndef GL_EXT_disjoint_timer_query +# error "Headers with GL_EXT_disjoint_timer_query are mandatory unless on iOS" +# endif +# ifndef GL_OES_rgb8_rgba8 +# error "Headers with GL_OES_rgb8_rgba8 are mandatory unless on iOS" +# endif +# endif +#endif -#define BACKEND_OPENGL_VERSION_GLES 0 -#define BACKEND_OPENGL_VERSION_GL 1 #if defined(GL_ES_VERSION_2_0) -# define BACKEND_OPENGL_VERSION BACKEND_OPENGL_VERSION_GLES -#elif defined(GL_VERSION_4_1) -# define BACKEND_OPENGL_VERSION BACKEND_OPENGL_VERSION_GL +# define BACKEND_OPENGL_VERSION_GLES +#elif defined(GL_VERSION_4_5) +# define BACKEND_OPENGL_VERSION_GL +#else +# error "Unsupported header version" #endif -#define BACKEND_OPENGL_LEVEL_GLES20 0 -#define BACKEND_OPENGL_LEVEL_GLES30 1 -#define BACKEND_OPENGL_LEVEL_GLES31 2 - -#if defined(GL_VERSION_4_1) -# define BACKEND_OPENGL_LEVEL BACKEND_OPENGL_LEVEL_GLES30 +#if defined(GL_VERSION_4_5) || defined(GL_ES_VERSION_3_1) +# define BACKEND_OPENGL_LEVEL_GLES31 +# ifdef __EMSCRIPTEN__ +# error "__EMSCRIPTEN__ shouldn't be defined with GLES 3.1 headers" +# endif #endif - -#if defined(GL_ES_VERSION_3_1) -# define BACKEND_OPENGL_LEVEL BACKEND_OPENGL_LEVEL_GLES31 -#elif defined(GL_ES_VERSION_3_0) -# define BACKEND_OPENGL_LEVEL BACKEND_OPENGL_LEVEL_GLES30 -#elif defined(GL_ES_VERSION_2_0) -# define BACKEND_OPENGL_LEVEL BACKEND_OPENGL_LEVEL_GLES20 +#if defined(GL_VERSION_4_5) || defined(GL_ES_VERSION_3_0) +# define BACKEND_OPENGL_LEVEL_GLES30 #endif - -// This is just to simplify the implementation (i.e. so we don't have to have #ifdefs everywhere) -#ifndef GL_OES_EGL_image_external -#define GL_TEXTURE_EXTERNAL_OES 0x8D65 +#if defined(GL_VERSION_4_5) || defined(GL_ES_VERSION_2_0) +# define BACKEND_OPENGL_LEVEL_GLES20 #endif #include "NullGLES.h" diff --git a/filament/backend/src/opengl/platforms/CocoaExternalImage.h b/filament/backend/src/opengl/platforms/CocoaExternalImage.h new file mode 100644 index 00000000000..38c3a9d1ff2 --- /dev/null +++ b/filament/backend/src/opengl/platforms/CocoaExternalImage.h @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FILAMENT_DRIVER_OPENGL_COCOA_EXTERNAL_IMAGE +#define FILAMENT_DRIVER_OPENGL_COCOA_EXTERNAL_IMAGE + +#include +#include + +#include "../gl_headers.h" + +namespace filament::backend { + +class CocoaExternalImage final : public OpenGLPlatform::ExternalTexture { +public: + /** + * GL objects that can be shared across multiple instances of CocoaExternalImage. + */ + class SharedGl { + public: + SharedGl() noexcept; + ~SharedGl() noexcept; + + SharedGl(const SharedGl&) = delete; + SharedGl& operator=(const SharedGl&) = delete; + + GLuint program = 0; + GLuint sampler = 0; + GLuint fragmentShader = 0; + GLuint vertexShader = 0; + }; + + CocoaExternalImage(const CVOpenGLTextureCacheRef textureCache, + const SharedGl& sharedGl) noexcept; + ~CocoaExternalImage() noexcept; + + /** + * Set this external image to the passed-in CVPixelBuffer. + * Afterwards, calling glGetTexture returns the GL texture name backed by the CVPixelBuffer. + */ + bool set(CVPixelBufferRef p) noexcept; + + GLuint getGlTexture() const noexcept; + GLuint getInternalFormat() const noexcept; + GLuint getTarget() const noexcept; + +private: + void release() noexcept; + CVOpenGLTextureRef createTextureFromImage(CVPixelBufferRef image) noexcept; + GLuint encodeCopyRectangleToTexture2D(GLuint rectangle, size_t width, size_t height) noexcept; + + class State { + public: + void save() noexcept; + void restore() noexcept; + + private: + GLint activeTexture = 0; + GLint textureBinding = { 0 }; + GLint samplerBinding = { 0 }; + GLint framebuffer = 0; + GLint viewport[4] = { 0 }; + GLint vertexAttrib = 0; + } mState; + + GLuint mFBO = 0; + const SharedGl& mSharedGl; + GLuint mRgbaTexture = 0; + + const CVOpenGLTextureCacheRef mTextureCache; + CVPixelBufferRef mImage = nullptr; + CVOpenGLTextureRef mTexture = nullptr; +}; + +} // namespace filament::backend + +#endif diff --git a/filament/backend/src/opengl/platforms/CocoaExternalImage.mm b/filament/backend/src/opengl/platforms/CocoaExternalImage.mm new file mode 100644 index 00000000000..913dc29e66d --- /dev/null +++ b/filament/backend/src/opengl/platforms/CocoaExternalImage.mm @@ -0,0 +1,235 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define COREVIDEO_SILENCE_GL_DEPRECATION + +#include "CocoaExternalImage.h" +#include +#include "../GLUtils.h" + +namespace filament::backend { + +static const char *s_vertex = R"SHADER(#version 410 core +void main() { + float x = -1.0 + float(((gl_VertexID & 1) <<2)); + float y = -1.0 + float(((gl_VertexID & 2) <<1)); + gl_Position=vec4(x, y, 0.0, 1.0); +} +)SHADER"; + +static const char *s_fragment = R"SHADER(#version 410 core +precision mediump float; + +uniform sampler2DRect rectangle; +layout(location = 0) out vec4 fragColor; + +void main() { + fragColor = texture(rectangle, gl_FragCoord.xy); +} +)SHADER"; + +CocoaExternalImage::SharedGl::SharedGl() noexcept { + glGenSamplers(1, &sampler); + glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glSamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glSamplerParameteri(sampler, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + + GLint status; + + vertexShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertexShader, 1, &s_vertex, nullptr); + glCompileShader(vertexShader); + glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status); + assert_invariant(status == GL_TRUE); + + fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragmentShader, 1, &s_fragment, nullptr); + glCompileShader(fragmentShader); + glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &status); + assert_invariant(status == GL_TRUE); + + program = glCreateProgram(); + glAttachShader(program, vertexShader); + glAttachShader(program, fragmentShader); + glLinkProgram(program); + glGetProgramiv(program, GL_LINK_STATUS, &status); + assert_invariant(status == GL_TRUE); + + // Save current program state. + GLint currentProgram; + glGetIntegerv(GL_CURRENT_PROGRAM, ¤tProgram); + + glUseProgram(program); + GLint samplerLoc = glGetUniformLocation(program, "rectangle"); + glUniform1i(samplerLoc, 0); + + // Restore state. + glUseProgram(currentProgram); +} + +CocoaExternalImage::SharedGl::~SharedGl() noexcept { + glDeleteSamplers(1, &sampler); + glDetachShader(program, vertexShader); + glDetachShader(program, fragmentShader); + glDeleteShader(vertexShader); + glDeleteShader(fragmentShader); + glDeleteProgram(program); +} + +CocoaExternalImage::CocoaExternalImage(const CVOpenGLTextureCacheRef textureCache, + const SharedGl &sharedGl) noexcept : mSharedGl(sharedGl), mTextureCache(textureCache) { + glGenFramebuffers(1, &mFBO); + CHECK_GL_ERROR(utils::slog.e) +} + +CocoaExternalImage::~CocoaExternalImage() noexcept { + glDeleteFramebuffers(1, &mFBO); + release(); +} + +bool CocoaExternalImage::set(CVPixelBufferRef image) noexcept { + // Release references to a previous external image, if we're holding any. + release(); + + if (!image) { + return false; + } + + OSType formatType = CVPixelBufferGetPixelFormatType(image); + FILAMENT_CHECK_POSTCONDITION(formatType == kCVPixelFormatType_32BGRA) + << "macOS external images must be 32BGRA format."; + + // The pixel buffer must be locked whenever we do rendering with it. We'll unlock it before + // releasing. + UTILS_UNUSED_IN_RELEASE CVReturn lockStatus = CVPixelBufferLockBaseAddress(image, 0); + assert_invariant(lockStatus == kCVReturnSuccess); + + mImage = image; + mTexture = createTextureFromImage(image); + mRgbaTexture = encodeCopyRectangleToTexture2D(CVOpenGLTextureGetName(mTexture), + CVPixelBufferGetWidth(image), CVPixelBufferGetHeight(image)); + CHECK_GL_ERROR(utils::slog.e) + + return true; +} + +GLuint CocoaExternalImage::getGlTexture() const noexcept { + return mRgbaTexture; +} + +GLuint CocoaExternalImage::getInternalFormat() const noexcept { + if (mRgbaTexture) { + return GL_RGBA8; + } + return 0; +} + +GLuint CocoaExternalImage::getTarget() const noexcept { + if (mRgbaTexture) { + return GL_TEXTURE_2D; + } + return 0; +} + +void CocoaExternalImage::release() noexcept { + if (mImage) { + CVPixelBufferUnlockBaseAddress(mImage, 0); + CVPixelBufferRelease(mImage); + } + if (mTexture) { + CFRelease(mTexture); + } + if (mRgbaTexture) { + glDeleteTextures(1, &mRgbaTexture); + mRgbaTexture = 0; + } +} + +CVOpenGLTextureRef CocoaExternalImage::createTextureFromImage(CVPixelBufferRef image) noexcept { + CVOpenGLTextureRef texture = nullptr; + UTILS_UNUSED_IN_RELEASE CVReturn success = + CVOpenGLTextureCacheCreateTextureFromImage(kCFAllocatorDefault, + mTextureCache, image, nil, &texture); + assert_invariant(success == kCVReturnSuccess); + + return texture; +} + +GLuint CocoaExternalImage::encodeCopyRectangleToTexture2D(GLuint rectangle, + size_t width, size_t height) noexcept { + GLuint texture; + glGenTextures(1, &texture); + + mState.save(); + + // Create a texture to hold the result of the blit image. + glBindTexture(GL_TEXTURE_2D, texture); + glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, width, height); + CHECK_GL_ERROR(utils::slog.e) + + // source textures + glBindSampler(0, mSharedGl.sampler); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_RECTANGLE, rectangle); + CHECK_GL_ERROR(utils::slog.e) + + // destination texture + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); + CHECK_GL_ERROR(utils::slog.e) + + CHECK_GL_FRAMEBUFFER_STATUS(utils::slog.e, GL_FRAMEBUFFER) + CHECK_GL_ERROR(utils::slog.e) + + // draw + glViewport(0, 0, width, height); + CHECK_GL_ERROR(utils::slog.e) + glUseProgram(mSharedGl.program); + CHECK_GL_ERROR(utils::slog.e) + glDisableVertexAttribArray(0); + glDrawArrays(GL_TRIANGLES, 0, 3); + CHECK_GL_ERROR(utils::slog.e) + + mState.restore(); + CHECK_GL_ERROR(utils::slog.e) + + return texture; +} + +void CocoaExternalImage::State::save() noexcept { + glGetIntegerv(GL_ACTIVE_TEXTURE, &activeTexture); + glGetIntegerv(GL_TEXTURE_BINDING_2D, &textureBinding); + glGetIntegerv(GL_SAMPLER_BINDING, &samplerBinding); + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &framebuffer); + glGetIntegerv(GL_VIEWPORT, viewport); + glGetVertexAttribiv(0, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &vertexAttrib); +} + +void CocoaExternalImage::State::restore() noexcept { + glActiveTexture(activeTexture); + glBindTexture(GL_TEXTURE_2D, textureBinding); + glBindSampler(0, samplerBinding); + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); + + if (vertexAttrib) { + glEnableVertexAttribArray(0); + } +} + +} // namespace filament::backend diff --git a/filament/backend/src/opengl/platforms/CocoaTouchExternalImage.mm b/filament/backend/src/opengl/platforms/CocoaTouchExternalImage.mm index 64b0478360c..23ee69e4646 100644 --- a/filament/backend/src/opengl/platforms/CocoaTouchExternalImage.mm +++ b/filament/backend/src/opengl/platforms/CocoaTouchExternalImage.mm @@ -135,13 +135,14 @@ void main() { } OSType formatType = CVPixelBufferGetPixelFormatType(image); - ASSERT_POSTCONDITION(formatType == kCVPixelFormatType_32BGRA || - formatType == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, - "iOS external images must be in either 32BGRA or 420f format."); + FILAMENT_CHECK_POSTCONDITION(formatType == kCVPixelFormatType_32BGRA || + formatType == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) + << "iOS external images must be in either 32BGRA or 420f format."; size_t planeCount = CVPixelBufferGetPlaneCount(image); - ASSERT_POSTCONDITION(planeCount == 0 || planeCount == 2, - "The OpenGL backend does not support images with plane counts of %d.", planeCount); + FILAMENT_CHECK_POSTCONDITION(planeCount == 0 || planeCount == 2) + << "The OpenGL backend does not support images with plane counts of " << planeCount + << "."; // The pixel buffer must be locked whenever we do rendering with it. We'll unlock it before // releasing. diff --git a/filament/backend/src/opengl/platforms/PlatformCocoaGL.mm b/filament/backend/src/opengl/platforms/PlatformCocoaGL.mm index e57f273284b..b62783c1dc0 100644 --- a/filament/backend/src/opengl/platforms/PlatformCocoaGL.mm +++ b/filament/backend/src/opengl/platforms/PlatformCocoaGL.mm @@ -28,6 +28,7 @@ #include #include +#include "CocoaExternalImage.h" namespace filament::backend { @@ -49,6 +50,9 @@ NSOpenGLContext* mGLContext = nullptr; CocoaGLSwapChain* mCurrentSwapChain = nullptr; std::vector mHeadlessSwapChains; + std::vector mAdditionalContexts; + CVOpenGLTextureCacheRef mTextureCache = nullptr; + std::unique_ptr mExternalImageSharedGl; void updateOpenGLContext(NSView *nsView, bool resetView, bool clearView); }; @@ -158,22 +162,51 @@ pImpl->mGLContext = nsOpenGLContext; int result = bluegl::bind(); - ASSERT_POSTCONDITION(!result, "Unable to load OpenGL entry points."); + FILAMENT_CHECK_POSTCONDITION(!result) << "Unable to load OpenGL entry points."; + + UTILS_UNUSED_IN_RELEASE CVReturn success = CVOpenGLTextureCacheCreate(kCFAllocatorDefault, nullptr, + [pImpl->mGLContext CGLContextObj], [pImpl->mGLContext.pixelFormat CGLPixelFormatObj], nullptr, + &pImpl->mTextureCache); + assert_invariant(success == kCVReturnSuccess); + return OpenGLPlatform::createDefaultDriver(this, sharedContext, driverConfig); } +bool PlatformCocoaGL::isExtraContextSupported() const noexcept { + // macOS supports shared contexts however, it looks like the implementation uses a global + // lock around all GL APIs. It's a problem for API calls that take a long time to execute, + // one such call is e.g.: glCompileProgram. + return true; +} + +void PlatformCocoaGL::createContext(bool shared) { + NSOpenGLPixelFormatAttribute pixelFormatAttributes[] = { + NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core, + NSOpenGLPFAAccelerated, (NSOpenGLPixelFormatAttribute) true, + 0, 0, + }; + NSOpenGLContext* const sharedContext = shared ? pImpl->mGLContext : nil; + NSOpenGLPixelFormat* const pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:pixelFormatAttributes]; + NSOpenGLContext* const nsOpenGLContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:sharedContext]; + [nsOpenGLContext makeCurrentContext]; + pImpl->mAdditionalContexts.push_back(nsOpenGLContext); +} + int PlatformCocoaGL::getOSVersion() const noexcept { return 0; } void PlatformCocoaGL::terminate() noexcept { + CFRelease(pImpl->mTextureCache); + pImpl->mExternalImageSharedGl.reset(); pImpl->mGLContext = nil; + for (auto& context : pImpl->mAdditionalContexts) { + context = nil; + } bluegl::unbind(); } -Platform::SwapChain* PlatformCocoaGL::createSwapChain(void* nativewindow, uint64_t& flags) noexcept { - // Transparent SwapChain is not supported - flags &= ~SWAP_CHAIN_CONFIG_TRANSPARENT; +Platform::SwapChain* PlatformCocoaGL::createSwapChain(void* nativewindow, uint64_t flags) noexcept { NSView* nsView = (__bridge NSView*)nativewindow; CocoaGLSwapChain* swapChain = new CocoaGLSwapChain( nsView ); @@ -188,7 +221,7 @@ return swapChain; } -Platform::SwapChain* PlatformCocoaGL::createSwapChain(uint32_t width, uint32_t height, uint64_t& flags) noexcept { +Platform::SwapChain* PlatformCocoaGL::createSwapChain(uint32_t width, uint32_t height, uint64_t flags) noexcept { NSView* nsView = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, width, height)]; // adding the pointer to the array retains the NSView @@ -214,8 +247,8 @@ delete cocoaSwapChain; } -void PlatformCocoaGL::makeCurrent(Platform::SwapChain* drawSwapChain, - Platform::SwapChain* readSwapChain) noexcept { +bool PlatformCocoaGL::makeCurrent(ContextType type, SwapChain* drawSwapChain, + SwapChain* readSwapChain) noexcept { ASSERT_PRECONDITION_NON_FATAL(drawSwapChain == readSwapChain, "ContextManagerCocoa does not support using distinct draw/read swap chains."); CocoaGLSwapChain* swapChain = (CocoaGLSwapChain*)drawSwapChain; @@ -254,10 +287,14 @@ swapChain->previousBounds = currentBounds; swapChain->previousWindowFrame = currentWindowFrame; + return true; } void PlatformCocoaGL::commit(Platform::SwapChain* swapChain) noexcept { [pImpl->mGLContext flushBuffer]; + + // This needs to be done periodically. + CVOpenGLTextureCacheFlush(pImpl->mTextureCache, 0); } bool PlatformCocoaGL::pumpEvents() noexcept { @@ -268,6 +305,45 @@ return true; } +OpenGLPlatform::ExternalTexture* PlatformCocoaGL::createExternalImageTexture() noexcept { + if (!pImpl->mExternalImageSharedGl) { + pImpl->mExternalImageSharedGl = std::make_unique(); + } + + ExternalTexture* outTexture = new CocoaExternalImage(pImpl->mTextureCache, + *pImpl->mExternalImageSharedGl); + + // the actual id/target will be set in setExternalImage. + outTexture->id = 0; + outTexture->target = GL_TEXTURE_2D; + return outTexture; +} + +void PlatformCocoaGL::destroyExternalImage(ExternalTexture* texture) noexcept { + auto* p = static_cast(texture); + delete p; +} + +void PlatformCocoaGL::retainExternalImage(void* externalImage) noexcept { + // Take ownership of the passed in buffer. It will be released the next time + // setExternalImage is called, or when the texture is destroyed. + CVPixelBufferRef pixelBuffer = (CVPixelBufferRef) externalImage; + CVPixelBufferRetain(pixelBuffer); +} + +bool PlatformCocoaGL::setExternalImage(void* externalImage, ExternalTexture* texture) noexcept { + CVPixelBufferRef cvPixelBuffer = (CVPixelBufferRef) externalImage; + CocoaExternalImage* cocoaExternalImage = static_cast(texture); + if (!cocoaExternalImage->set(cvPixelBuffer)) { + return false; + } + texture->target = cocoaExternalImage->getTarget(); + texture->id = cocoaExternalImage->getGlTexture(); + // we used to set the internalFormat, but it's not used anywhere on the gl backend side + // cocoaExternalImage->getInternalFormat(); + return true; +} + void PlatformCocoaGLImpl::updateOpenGLContext(NSView *nsView, bool resetView, bool clearView) { NSOpenGLContext* glContext = mGLContext; diff --git a/filament/backend/src/opengl/platforms/PlatformCocoaTouchGL.mm b/filament/backend/src/opengl/platforms/PlatformCocoaTouchGL.mm index cdec87d83fd..326f55f06d2 100644 --- a/filament/backend/src/opengl/platforms/PlatformCocoaTouchGL.mm +++ b/filament/backend/src/opengl/platforms/PlatformCocoaTouchGL.mm @@ -40,6 +40,7 @@ EAGLContext* mGLContext = nullptr; CAEAGLLayer* mCurrentGlLayer = nullptr; std::vector mHeadlessGlLayers; + std::vector mAdditionalContexts; CGRect mCurrentGlLayerRect; GLuint mDefaultFramebuffer = 0; GLuint mDefaultColorbuffer = 0; @@ -60,7 +61,7 @@ EAGLSharegroup* sharegroup = (__bridge EAGLSharegroup*) sharedGLContext; EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3 sharegroup:sharegroup]; - ASSERT_POSTCONDITION(context, "Unable to create OpenGL ES context."); + FILAMENT_CHECK_POSTCONDITION(context) << "Unable to create OpenGL ES context."; [EAGLContext setCurrentContext:context]; @@ -84,8 +85,8 @@ pImpl->mDefaultColorbuffer = renderbuffer[0]; pImpl->mDefaultDepthbuffer = renderbuffer[1]; - CVReturn success = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, nullptr, - pImpl->mGLContext, nullptr, &pImpl->mTextureCache); + UTILS_UNUSED_IN_RELEASE CVReturn success = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, + nullptr, pImpl->mGLContext, nullptr, &pImpl->mTextureCache); assert_invariant(success == kCVReturnSuccess); pImpl->mExternalImageSharedGl = new CocoaTouchExternalImage::SharedGl(); @@ -93,19 +94,31 @@ return OpenGLPlatform::createDefaultDriver(this, sharedGLContext, driverConfig); } +bool PlatformCocoaTouchGL::isExtraContextSupported() const noexcept { + return true; +} + +void PlatformCocoaTouchGL::createContext(bool shared) { + EAGLSharegroup* const sharegroup = shared ? pImpl->mGLContext.sharegroup : nil; + EAGLContext* const context = [[EAGLContext alloc] + initWithAPI:kEAGLRenderingAPIOpenGLES3 + sharegroup:sharegroup]; + FILAMENT_CHECK_POSTCONDITION(context) << "Unable to create extra OpenGL ES context."; + [EAGLContext setCurrentContext:context]; + pImpl->mAdditionalContexts.push_back(context); +} + void PlatformCocoaTouchGL::terminate() noexcept { CFRelease(pImpl->mTextureCache); pImpl->mGLContext = nil; delete pImpl->mExternalImageSharedGl; } -Platform::SwapChain* PlatformCocoaTouchGL::createSwapChain(void* nativewindow, uint64_t& flags) noexcept { - // Transparent swap chain is not supported - flags &= ~SWAP_CHAIN_CONFIG_TRANSPARENT; +Platform::SwapChain* PlatformCocoaTouchGL::createSwapChain(void* nativewindow, uint64_t flags) noexcept { return (SwapChain*) nativewindow; } -Platform::SwapChain* PlatformCocoaTouchGL::createSwapChain(uint32_t width, uint32_t height, uint64_t& flags) noexcept { +Platform::SwapChain* PlatformCocoaTouchGL::createSwapChain(uint32_t width, uint32_t height, uint64_t flags) noexcept { CAEAGLLayer* glLayer = [CAEAGLLayer layer]; glLayer.frame = CGRectMake(0, 0, width, height); @@ -130,14 +143,15 @@ } } -uint32_t PlatformCocoaTouchGL::createDefaultRenderTarget() noexcept { +uint32_t PlatformCocoaTouchGL::getDefaultFramebufferObject() noexcept { return pImpl->mDefaultFramebuffer; } -void PlatformCocoaTouchGL::makeCurrent(SwapChain* drawSwapChain, SwapChain* readSwapChain) noexcept { +bool PlatformCocoaTouchGL::makeCurrent(ContextType type, SwapChain* drawSwapChain, + SwapChain* readSwapChain) noexcept { ASSERT_PRECONDITION_NON_FATAL(drawSwapChain == readSwapChain, - "PlatformCocoaTouchGL does not support using distinct draw/read swap chains."); - CAEAGLLayer* glLayer = (__bridge CAEAGLLayer*) drawSwapChain; + "PlatformCocoaTouchGL does not support using distinct draw/read swap chains."); + CAEAGLLayer* const glLayer = (__bridge CAEAGLLayer*) drawSwapChain; [EAGLContext setCurrentContext:pImpl->mGLContext]; @@ -146,24 +160,31 @@ pImpl->mCurrentGlLayer = glLayer; pImpl->mCurrentGlLayerRect = glLayer.bounds; - glBindFramebuffer(GL_FRAMEBUFFER, pImpl->mDefaultFramebuffer); - + // associate our default color renderbuffer with the swapchain + // this renderbuffer is an attachment of the default FBO glBindRenderbuffer(GL_RENDERBUFFER, pImpl->mDefaultColorbuffer); [pImpl->mGLContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:glLayer]; // Retrieve width and height of color buffer. - GLint width; - GLint height; + GLint width, height; glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width); glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height); + // resize the depth buffer accordingly glBindRenderbuffer(GL_RENDERBUFFER, pImpl->mDefaultDepthbuffer); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height); // Test the framebuffer for completeness. - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - ASSERT_POSTCONDITION(status == GL_FRAMEBUFFER_COMPLETE, "Incomplete framebuffer."); + // We must save/restore the framebuffer binding because filament is tracking the state + GLint oldFramebuffer; + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, pImpl->mDefaultFramebuffer); + GLenum const status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + FILAMENT_CHECK_POSTCONDITION(status == GL_FRAMEBUFFER_COMPLETE) + << "Incomplete framebuffer."; + glBindFramebuffer(GL_FRAMEBUFFER, oldFramebuffer); } + return true; } void PlatformCocoaTouchGL::commit(Platform::SwapChain* swapChain) noexcept { diff --git a/filament/backend/src/opengl/platforms/PlatformEGL.cpp b/filament/backend/src/opengl/platforms/PlatformEGL.cpp index 215b6d19140..9e6b628f02b 100644 --- a/filament/backend/src/opengl/platforms/PlatformEGL.cpp +++ b/filament/backend/src/opengl/platforms/PlatformEGL.cpp @@ -18,11 +18,37 @@ #include "opengl/GLUtils.h" +#include + +#include +#include + #include #include +#include +#if defined(__ANDROID__) +#include +#endif #include + +#include +#include #include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#ifndef EGL_CONTEXT_OPENGL_BACKWARDS_COMPATIBLE_ANGLE +# define EGL_CONTEXT_OPENGL_BACKWARDS_COMPATIBLE_ANGLE 0x3483 +#endif using namespace utils; @@ -39,31 +65,36 @@ UTILS_PRIVATE PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR = {}; } using namespace glext; - // --------------------------------------------------------------------------------------------- // Utilities // --------------------------------------------------------------------------------------------- void PlatformEGL::logEglError(const char* name) noexcept { - const char* err; - switch (eglGetError()) { - case EGL_NOT_INITIALIZED: err = "EGL_NOT_INITIALIZED"; break; - case EGL_BAD_ACCESS: err = "EGL_BAD_ACCESS"; break; - case EGL_BAD_ALLOC: err = "EGL_BAD_ALLOC"; break; - case EGL_BAD_ATTRIBUTE: err = "EGL_BAD_ATTRIBUTE"; break; - case EGL_BAD_CONTEXT: err = "EGL_BAD_CONTEXT"; break; - case EGL_BAD_CONFIG: err = "EGL_BAD_CONFIG"; break; - case EGL_BAD_CURRENT_SURFACE: err = "EGL_BAD_CURRENT_SURFACE";break; - case EGL_BAD_DISPLAY: err = "EGL_BAD_DISPLAY"; break; - case EGL_BAD_SURFACE: err = "EGL_BAD_SURFACE"; break; - case EGL_BAD_MATCH: err = "EGL_BAD_MATCH"; break; - case EGL_BAD_PARAMETER: err = "EGL_BAD_PARAMETER"; break; - case EGL_BAD_NATIVE_PIXMAP: err = "EGL_BAD_NATIVE_PIXMAP"; break; - case EGL_BAD_NATIVE_WINDOW: err = "EGL_BAD_NATIVE_WINDOW"; break; - case EGL_CONTEXT_LOST: err = "EGL_CONTEXT_LOST"; break; - default: err = "unknown"; break; - } - slog.e << name << " failed with " << err << io::endl; + logEglError(name, eglGetError()); +} + +void PlatformEGL::logEglError(const char* name, EGLint error) noexcept { + slog.e << name << " failed with " << getEglErrorName(error) << io::endl; +} + +const char* PlatformEGL::getEglErrorName(EGLint error) noexcept { + switch (error) { + case EGL_NOT_INITIALIZED: return "EGL_NOT_INITIALIZED"; + case EGL_BAD_ACCESS: return "EGL_BAD_ACCESS"; + case EGL_BAD_ALLOC: return "EGL_BAD_ALLOC"; + case EGL_BAD_ATTRIBUTE: return "EGL_BAD_ATTRIBUTE"; + case EGL_BAD_CONTEXT: return "EGL_BAD_CONTEXT"; + case EGL_BAD_CONFIG: return "EGL_BAD_CONFIG"; + case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE"; + case EGL_BAD_DISPLAY: return "EGL_BAD_DISPLAY"; + case EGL_BAD_SURFACE: return "EGL_BAD_SURFACE"; + case EGL_BAD_MATCH: return "EGL_BAD_MATCH"; + case EGL_BAD_PARAMETER: return "EGL_BAD_PARAMETER"; + case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP"; + case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW"; + case EGL_CONTEXT_LOST: return "EGL_CONTEXT_LOST"; + default: return "unknown"; + } } void PlatformEGL::clearGlError() noexcept { @@ -82,25 +113,48 @@ int PlatformEGL::getOSVersion() const noexcept { return 0; } +bool PlatformEGL::isOpenGL() const noexcept { + return false; +} Driver* PlatformEGL::createDriver(void* sharedContext, const Platform::DriverConfig& driverConfig) noexcept { mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); assert_invariant(mEGLDisplay != EGL_NO_DISPLAY); EGLint major, minor; - EGLBoolean const initialized = eglInitialize(mEGLDisplay, &major, &minor); + EGLBoolean initialized = eglInitialize(mEGLDisplay, &major, &minor); + + if (!initialized) { + EGLDeviceEXT eglDevice; + EGLint numDevices; + PFNEGLQUERYDEVICESEXTPROC eglQueryDevicesEXT = + (PFNEGLQUERYDEVICESEXTPROC)eglGetProcAddress("eglQueryDevicesEXT"); + if (eglQueryDevicesEXT != nullptr) { + eglQueryDevicesEXT(1, &eglDevice, &numDevices); + if(auto* getPlatformDisplay = reinterpret_cast( + eglGetProcAddress("eglGetPlatformDisplay"))) { + mEGLDisplay = getPlatformDisplay(EGL_PLATFORM_DEVICE_EXT, eglDevice, 0); + initialized = eglInitialize(mEGLDisplay, &major, &minor); + } + } + } + if (UTILS_UNLIKELY(!initialized)) { slog.e << "eglInitialize failed" << io::endl; return nullptr; } -#if defined(__ANDROID__) || defined(FILAMENT_USE_EXTERNAL_GLES3) || defined(__EMSCRIPTEN__) - // PlatofrmEGL is used with and without GLES, but this function is only - // meaningful when GLES is used. +#if defined(FILAMENT_IMPORT_ENTRY_POINTS) importGLESExtensionsEntryPoints(); #endif auto extensions = GLUtils::split(eglQueryString(mEGLDisplay, EGL_EXTENSIONS)); + ext.egl.ANDROID_recordable = extensions.has("EGL_ANDROID_recordable"); + ext.egl.KHR_gl_colorspace = extensions.has("EGL_KHR_gl_colorspace"); + ext.egl.KHR_create_context = extensions.has("EGL_KHR_create_context"); + ext.egl.KHR_no_config_context = extensions.has("EGL_KHR_no_config_context"); + ext.egl.KHR_surfaceless_context = extensions.has("EGL_KHR_surfaceless_context"); + ext.egl.EXT_protected_content = extensions.has("EGL_EXT_protected_content"); eglCreateSyncKHR = (PFNEGLCREATESYNCKHRPROC) eglGetProcAddress("eglCreateSyncKHR"); eglDestroySyncKHR = (PFNEGLDESTROYSYNCKHRPROC) eglGetProcAddress("eglDestroySyncKHR"); @@ -109,117 +163,132 @@ Driver* PlatformEGL::createDriver(void* sharedContext, const Platform::DriverCon eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC) eglGetProcAddress("eglCreateImageKHR"); eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC) eglGetProcAddress("eglDestroyImageKHR"); - EGLint configsCount; - EGLint configAttribs[] = { - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR, // 0 - EGL_RED_SIZE, 8, // 2 - EGL_GREEN_SIZE, 8, // 4 - EGL_BLUE_SIZE, 8, // 6 - EGL_ALPHA_SIZE, 0, // 8 : reserved to set ALPHA_SIZE below - EGL_DEPTH_SIZE, 24, // 10 - EGL_RECORDABLE_ANDROID, 1, // 12 - EGL_NONE // 14 - }; - - EGLint contextAttribs[] = { - EGL_CONTEXT_CLIENT_VERSION, 3, - EGL_NONE, EGL_NONE, // reserved for EGL_CONTEXT_OPENGL_NO_ERROR_KHR below - EGL_NONE - }; - - EGLint pbufferAttribs[] = { + EGLint const pbufferAttribs[] = { EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE }; -#ifdef NDEBUG - // When we don't have a shared context, and we're in release mode, we always activate the - // EGL_KHR_create_context_no_error extension. - if (!sharedContext && extensions.has("EGL_KHR_create_context_no_error")) { - contextAttribs[2] = EGL_CONTEXT_OPENGL_NO_ERROR_KHR; - contextAttribs[3] = EGL_TRUE; +#ifdef __ANDROID__ + bool requestES2Context = driverConfig.forceGLES2Context; + char property[PROP_VALUE_MAX]; + int const length = __system_property_get("debug.filament.es2", property); + if (length > 0) { + requestES2Context = bool(atoi(property)); } +#else + constexpr bool requestES2Context = false; #endif - EGLConfig eglConfig = nullptr; + Config contextAttribs; - // find an opaque config - if (!eglChooseConfig(mEGLDisplay, configAttribs, &mEGLConfig, 1, &configsCount)) { - logEglError("eglChooseConfig"); - goto error; + if (isOpenGL()) { + // Request a OpenGL 4.1 context + contextAttribs[EGL_CONTEXT_MAJOR_VERSION] = 4; + contextAttribs[EGL_CONTEXT_MINOR_VERSION] = 1; + } else { + // Request a ES2 context, devices that support ES3 will return an ES3 context + contextAttribs[EGL_CONTEXT_CLIENT_VERSION] = 2; } - if (configsCount == 0) { - // warn and retry without EGL_RECORDABLE_ANDROID - logEglError("eglChooseConfig(..., EGL_RECORDABLE_ANDROID) failed. Continuing without it."); - configAttribs[12] = EGL_RECORDABLE_ANDROID; - configAttribs[13] = EGL_DONT_CARE; - if (!eglChooseConfig(mEGLDisplay, configAttribs, &mEGLConfig, 1, &configsCount) || - configsCount == 0) { - logEglError("eglChooseConfig"); - goto error; - } + // FOR TESTING ONLY, enforce the ES version we're asking for. + // FIXME: we should check EGL_ANGLE_create_context_backwards_compatible, however, at least + // some versions of ANGLE don't advertise this extension but do support it. + if (requestES2Context) { + // TODO: is there a way to request the ANGLE driver if available? + contextAttribs[EGL_CONTEXT_OPENGL_BACKWARDS_COMPATIBLE_ANGLE] = EGL_FALSE; } - // find a transparent config - configAttribs[8] = EGL_ALPHA_SIZE; - configAttribs[9] = 8; - if (!eglChooseConfig(mEGLDisplay, configAttribs, &mEGLTransparentConfig, 1, &configsCount) || - (configAttribs[13] == EGL_DONT_CARE && configsCount == 0)) { - logEglError("eglChooseConfig"); - goto error; +#ifdef NDEBUG + // When we don't have a shared context, and we're in release mode, we always activate the + // EGL_KHR_create_context_no_error extension. + if (!sharedContext && extensions.has("EGL_KHR_create_context_no_error")) { + contextAttribs[EGL_CONTEXT_OPENGL_NO_ERROR_KHR] = EGL_TRUE; } +#endif - if (configsCount == 0) { - // warn and retry without EGL_RECORDABLE_ANDROID - logEglError("eglChooseConfig(..., EGL_RECORDABLE_ANDROID) failed. Continuing without it."); - // this is not fatal - configAttribs[12] = EGL_RECORDABLE_ANDROID; - configAttribs[13] = EGL_DONT_CARE; - if (!eglChooseConfig(mEGLDisplay, configAttribs, &mEGLTransparentConfig, 1, &configsCount) || - configsCount == 0) { - logEglError("eglChooseConfig"); - goto error; - } - } + // config use for creating the context + EGLConfig eglConfig = EGL_NO_CONFIG_KHR; - if (!extensions.has("EGL_KHR_no_config_context")) { - // if we have the EGL_KHR_no_config_context, we don't need to worry about the config - // when creating the context, otherwise, we must always pick a transparent config. - eglConfig = mEGLConfig = mEGLTransparentConfig; - } - // the pbuffer dummy surface is always created with a transparent surface because - // either we have EGL_KHR_no_config_context and it doesn't matter, or we don't and - // we must use a transparent surface - mEGLDummySurface = eglCreatePbufferSurface(mEGLDisplay, mEGLTransparentConfig, pbufferAttribs); - if (mEGLDummySurface == EGL_NO_SURFACE) { - logEglError("eglCreatePbufferSurface"); - goto error; + if (UTILS_UNLIKELY(!ext.egl.KHR_no_config_context)) { + // find a config we can use if we don't have "EGL_KHR_no_config_context" and that we can use + // for the dummy pbuffer surface. + mEGLConfig = findSwapChainConfig( + SWAP_CHAIN_CONFIG_TRANSPARENT | + SWAP_CHAIN_HAS_STENCIL_BUFFER, + true, true); + if (UTILS_UNLIKELY(mEGLConfig == EGL_NO_CONFIG_KHR)) { + goto error; // error already logged + } + // if we don't have the EGL_KHR_no_config_context the context must be created with + // the same config as the swapchain, so we have no choice but to create a + // transparent config. + eglConfig = mEGLConfig; } - mEGLContext = eglCreateContext(mEGLDisplay, eglConfig, (EGLContext)sharedContext, contextAttribs); - if (mEGLContext == EGL_NO_CONTEXT && sharedContext && - extensions.has("EGL_KHR_create_context_no_error")) { - // context creation could fail because of EGL_CONTEXT_OPENGL_NO_ERROR_KHR - // not matching the sharedContext. Try with it. - contextAttribs[2] = EGL_CONTEXT_OPENGL_NO_ERROR_KHR; - contextAttribs[3] = EGL_TRUE; - mEGLContext = eglCreateContext(mEGLDisplay, eglConfig, (EGLContext)sharedContext, contextAttribs); + for (size_t tries = 0; tries < 3; tries++) { + mEGLContext = eglCreateContext(mEGLDisplay, eglConfig, + (EGLContext)sharedContext, contextAttribs.data()); + if (UTILS_LIKELY(mEGLContext != EGL_NO_CONTEXT)) { + break; + } + + GLint const error = eglGetError(); + if (error == EGL_BAD_ATTRIBUTE) { + // ANGLE doesn't always advertise this extension, so we have to try + contextAttribs.erase(EGL_CONTEXT_OPENGL_BACKWARDS_COMPATIBLE_ANGLE); + continue; + } +#ifdef NDEBUG + else if (error == EGL_BAD_MATCH && + sharedContext && extensions.has("EGL_KHR_create_context_no_error")) { + // context creation could fail because of EGL_CONTEXT_OPENGL_NO_ERROR_KHR + // not matching the sharedContext. Try with it. + contextAttribs[EGL_CONTEXT_OPENGL_NO_ERROR_KHR] = EGL_TRUE; + continue; + } +#endif + (void)error; + break; } + if (UTILS_UNLIKELY(mEGLContext == EGL_NO_CONTEXT)) { // eglCreateContext failed logEglError("eglCreateContext"); goto error; } - if (!makeCurrent(mEGLDummySurface, mEGLDummySurface)) { + if (ext.egl.KHR_surfaceless_context) { + // Adreno 306 driver advertises KHR_create_context but doesn't support passing + // EGL_NO_SURFACE to eglMakeCurrent with a 3.0 context. + if (UTILS_UNLIKELY(!eglMakeCurrent(mEGLDisplay, + EGL_NO_SURFACE, EGL_NO_SURFACE, mEGLContext))) { + if (eglGetError() == EGL_BAD_MATCH) { + ext.egl.KHR_surfaceless_context = false; + } + } + } + + if (UTILS_UNLIKELY(!ext.egl.KHR_surfaceless_context)) { + // create the dummy surface, just for being able to make the context current. + mEGLDummySurface = eglCreatePbufferSurface(mEGLDisplay, mEGLConfig, pbufferAttribs); + if (UTILS_UNLIKELY(mEGLDummySurface == EGL_NO_SURFACE)) { + logEglError("eglCreatePbufferSurface"); + goto error; + } + } + + if (UTILS_UNLIKELY( + egl.makeCurrent(mEGLContext, mEGLDummySurface, mEGLDummySurface) == EGL_FALSE)) { // eglMakeCurrent failed logEglError("eglMakeCurrent"); goto error; } + mCurrentContextType = ContextType::UNPROTECTED; + mContextAttribs = std::move(contextAttribs); + initializeGlExtensions(); // this is needed with older emulators/API levels on Android @@ -236,9 +305,13 @@ Driver* PlatformEGL::createDriver(void* sharedContext, const Platform::DriverCon if (mEGLContext) { eglDestroyContext(mEGLDisplay, mEGLContext); } + if (mEGLContextProtected) { + eglDestroyContext(mEGLDisplay, mEGLContextProtected); + } mEGLDummySurface = EGL_NO_SURFACE; mEGLContext = EGL_NO_CONTEXT; + mEGLContextProtected = EGL_NO_CONTEXT; eglTerminate(mEGLDisplay); eglReleaseThread(); @@ -246,85 +319,343 @@ Driver* PlatformEGL::createDriver(void* sharedContext, const Platform::DriverCon return nullptr; } -EGLBoolean PlatformEGL::makeCurrent(EGLSurface drawSurface, EGLSurface readSurface) noexcept { - if (UTILS_UNLIKELY((drawSurface != mCurrentDrawSurface || readSurface != mCurrentReadSurface))) { - mCurrentDrawSurface = drawSurface; - mCurrentReadSurface = readSurface; - return eglMakeCurrent(mEGLDisplay, drawSurface, readSurface, mEGLContext); +bool PlatformEGL::isExtraContextSupported() const noexcept { + return ext.egl.KHR_surfaceless_context; +} + +bool PlatformEGL::isProtectedContextSupported() const noexcept { + return ext.egl.EXT_protected_content; +} + +void PlatformEGL::createContext(bool shared) { + EGLConfig config = ext.egl.KHR_no_config_context ? EGL_NO_CONFIG_KHR : mEGLConfig; + + EGLContext context = eglCreateContext(mEGLDisplay, config, + shared ? mEGLContext : EGL_NO_CONTEXT, mContextAttribs.data()); + + if (UTILS_UNLIKELY(context == EGL_NO_CONTEXT)) { + // eglCreateContext failed + logEglError("eglCreateContext"); } - return EGL_TRUE; + + assert_invariant(context != EGL_NO_CONTEXT); + + eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context); + + mAdditionalContexts.push_back(context); +} + +void PlatformEGL::releaseContext() noexcept { + EGLContext context = eglGetCurrentContext(); + eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + if (context != EGL_NO_CONTEXT) { + eglDestroyContext(mEGLDisplay, context); + } + + mAdditionalContexts.erase( + std::remove_if(mAdditionalContexts.begin(), mAdditionalContexts.end(), + [context](EGLContext c) { + return c == context; + }), mAdditionalContexts.end()); + + eglReleaseThread(); } void PlatformEGL::terminate() noexcept { + // it's always allowed to use EGL_NO_SURFACE, EGL_NO_CONTEXT eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); - eglDestroySurface(mEGLDisplay, mEGLDummySurface); + if (mEGLDummySurface) { + eglDestroySurface(mEGLDisplay, mEGLDummySurface); + } eglDestroyContext(mEGLDisplay, mEGLContext); + if (mEGLContextProtected != EGL_NO_CONTEXT) { + eglDestroyContext(mEGLDisplay, mEGLContextProtected); + } + for (auto context : mAdditionalContexts) { + eglDestroyContext(mEGLDisplay, context); + } eglTerminate(mEGLDisplay); eglReleaseThread(); } +EGLConfig PlatformEGL::findSwapChainConfig(uint64_t flags, bool window, bool pbuffer) const { + // Find config that support ES3. + EGLConfig config = EGL_NO_CONFIG_KHR; + EGLint configsCount; + Config configAttribs = { + { EGL_RED_SIZE, 8 }, + { EGL_GREEN_SIZE, 8 }, + { EGL_BLUE_SIZE, 8 }, + { EGL_ALPHA_SIZE, (flags & SWAP_CHAIN_CONFIG_TRANSPARENT) ? 8 : 0 }, + { EGL_DEPTH_SIZE, 24 }, + { EGL_STENCIL_SIZE, (flags & SWAP_CHAIN_HAS_STENCIL_BUFFER) ? 8 : 0 } + }; + + if (!ext.egl.KHR_no_config_context) { + if (isOpenGL()) { + configAttribs[EGL_RENDERABLE_TYPE] = EGL_OPENGL_BIT; + } else { + configAttribs[EGL_RENDERABLE_TYPE] = EGL_OPENGL_ES2_BIT; + if (ext.egl.KHR_create_context) { + configAttribs[EGL_RENDERABLE_TYPE] |= EGL_OPENGL_ES3_BIT_KHR; + } + } + } + + if (window) { + configAttribs[EGL_SURFACE_TYPE] |= EGL_WINDOW_BIT; + } + + if (pbuffer) { + configAttribs[EGL_SURFACE_TYPE] |= EGL_PBUFFER_BIT; + } + + if (ext.egl.ANDROID_recordable) { + configAttribs[EGL_RECORDABLE_ANDROID] = EGL_TRUE; + } + + if (UTILS_UNLIKELY( + !eglChooseConfig(mEGLDisplay, configAttribs.data(), &config, 1, &configsCount))) { + logEglError("eglChooseConfig"); + return EGL_NO_CONFIG_KHR; + } + + if (UTILS_UNLIKELY(configsCount == 0)) { + if (ext.egl.ANDROID_recordable) { + // warn and retry without EGL_RECORDABLE_ANDROID + logEglError( + "eglChooseConfig(..., EGL_RECORDABLE_ANDROID) failed. Continuing without it."); + configAttribs[EGL_RECORDABLE_ANDROID] = EGL_DONT_CARE; + if (UTILS_UNLIKELY( + !eglChooseConfig(mEGLDisplay, configAttribs.data(), &config, 1, &configsCount) + || configsCount == 0)) { + logEglError("eglChooseConfig"); + return EGL_NO_CONFIG_KHR; + } + } else { + // we found zero config matching our request! + logEglError("eglChooseConfig() didn't find any matching config!"); + return EGL_NO_CONFIG_KHR; + } + } + return config; +} + +// ----------------------------------------------------------------------------------------------- + +bool PlatformEGL::isSRGBSwapChainSupported() const noexcept { + return ext.egl.KHR_gl_colorspace; +} + Platform::SwapChain* PlatformEGL::createSwapChain( - void* nativeWindow, uint64_t& flags) noexcept { - EGLSurface sur = eglCreateWindowSurface(mEGLDisplay, - (flags & SWAP_CHAIN_CONFIG_TRANSPARENT) ? - mEGLTransparentConfig : mEGLConfig, - (EGLNativeWindowType)nativeWindow, nullptr); - - if (UTILS_UNLIKELY(sur == EGL_NO_SURFACE)) { - logEglError("eglCreateWindowSurface"); - return nullptr; + void* nativeWindow, uint64_t flags) noexcept { + + Config attribs; + if (ext.egl.KHR_gl_colorspace) { + if (flags & SWAP_CHAIN_CONFIG_SRGB_COLORSPACE) { + attribs[EGL_GL_COLORSPACE_KHR] = EGL_GL_COLORSPACE_SRGB_KHR; + } + } else { + flags &= ~SWAP_CHAIN_CONFIG_SRGB_COLORSPACE; } - if (!eglSurfaceAttrib(mEGLDisplay, sur, EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED)) { - logEglError("eglSurfaceAttrib(..., EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED)"); - // this is not fatal + + if (ext.egl.EXT_protected_content) { + if (flags & SWAP_CHAIN_CONFIG_PROTECTED_CONTENT) { + attribs[EGL_PROTECTED_CONTENT_EXT] = EGL_TRUE; + } + } else { + flags &= ~SWAP_CHAIN_CONFIG_PROTECTED_CONTENT; } - return (SwapChain*)sur; + + EGLConfig config = EGL_NO_CONFIG_KHR; + if (UTILS_LIKELY(ext.egl.KHR_no_config_context)) { + config = findSwapChainConfig(flags, true, false); + } else { + config = mEGLConfig; + } + + EGLSurface sur = EGL_NO_SURFACE; + if (UTILS_LIKELY(config != EGL_NO_CONFIG_KHR)) { + sur = eglCreateWindowSurface(mEGLDisplay, config, + (EGLNativeWindowType)nativeWindow, attribs.data()); + + if (UTILS_LIKELY(sur != EGL_NO_SURFACE)) { + // this is not fatal + eglSurfaceAttrib(mEGLDisplay, sur, EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED); + } else { + logEglError("PlatformEGL::createSwapChain: eglCreateWindowSurface"); + } + } else { + // error already logged + } + + SwapChainEGL* const sc = new(std::nothrow) SwapChainEGL({ + .sur = sur, + .attribs = std::move(attribs), + .nativeWindow = (EGLNativeWindowType)nativeWindow, + .config = config, + .flags = flags + }); + return sc; } Platform::SwapChain* PlatformEGL::createSwapChain( - uint32_t width, uint32_t height, uint64_t& flags) noexcept { + uint32_t width, uint32_t height, uint64_t flags) noexcept { - EGLint attribs[] = { - EGL_WIDTH, EGLint(width), - EGL_HEIGHT, EGLint(height), - EGL_NONE + Config attribs = { + { EGL_WIDTH, EGLint(width) }, + { EGL_HEIGHT, EGLint(height) }, }; - EGLSurface sur = eglCreatePbufferSurface(mEGLDisplay, - (flags & SWAP_CHAIN_CONFIG_TRANSPARENT) ? - mEGLTransparentConfig : mEGLConfig, attribs); + if (ext.egl.KHR_gl_colorspace) { + if (flags & SWAP_CHAIN_CONFIG_SRGB_COLORSPACE) { + attribs[EGL_GL_COLORSPACE_KHR] = EGL_GL_COLORSPACE_SRGB_KHR; + } + } else { + flags &= ~SWAP_CHAIN_CONFIG_SRGB_COLORSPACE; + } + + if (ext.egl.EXT_protected_content) { + if (flags & SWAP_CHAIN_CONFIG_PROTECTED_CONTENT) { + attribs[EGL_PROTECTED_CONTENT_EXT] = EGL_TRUE; + } + } else { + flags &= ~SWAP_CHAIN_CONFIG_PROTECTED_CONTENT; + } - if (UTILS_UNLIKELY(sur == EGL_NO_SURFACE)) { - logEglError("eglCreatePbufferSurface"); - return nullptr; + EGLConfig config = EGL_NO_CONFIG_KHR; + if (UTILS_LIKELY(ext.egl.KHR_no_config_context)) { + config = findSwapChainConfig(flags, true, false); + } else { + config = mEGLConfig; } - return (SwapChain*)sur; + + EGLSurface sur = EGL_NO_SURFACE; + if (UTILS_LIKELY(config != EGL_NO_CONFIG_KHR)) { + sur = eglCreatePbufferSurface(mEGLDisplay, config, attribs.data()); + if (UTILS_UNLIKELY(sur == EGL_NO_SURFACE)) { + logEglError("PlatformEGL::createSwapChain: eglCreatePbufferSurface"); + } + } else { + // error already logged + } + + SwapChainEGL* const sc = new(std::nothrow) SwapChainEGL({ + .sur = sur, + .attribs = std::move(attribs), + .config = config, + .flags = flags + }); + return sc; } void PlatformEGL::destroySwapChain(Platform::SwapChain* swapChain) noexcept { - EGLSurface sur = (EGLSurface) swapChain; - if (sur != EGL_NO_SURFACE) { - makeCurrent(mEGLDummySurface, mEGLDummySurface); - eglDestroySurface(mEGLDisplay, sur); + if (swapChain) { + SwapChainEGL const* const sc = static_cast(swapChain); + if (sc->sur != EGL_NO_SURFACE) { + // - if EGL_KHR_surfaceless_context is supported, mEGLDummySurface is EGL_NO_SURFACE. + // - this is actually a bit too aggressive, but it is a rare operation. + egl.makeCurrent(mEGLDummySurface, mEGLDummySurface); + eglDestroySurface(mEGLDisplay, sc->sur); + delete sc; + } + } +} + +bool PlatformEGL::isSwapChainProtected(Platform::SwapChain* swapChain) noexcept { + if (swapChain) { + SwapChainEGL const* const sc = static_cast(swapChain); + return bool(sc->flags & SWAP_CHAIN_CONFIG_PROTECTED_CONTENT); } + return false; +} + +OpenGLPlatform::ContextType PlatformEGL::getCurrentContextType() const noexcept { + return mCurrentContextType; +} + +bool PlatformEGL::makeCurrent(ContextType type, + SwapChain* drawSwapChain, SwapChain* readSwapChain) noexcept { + SwapChainEGL const* const dsc = static_cast(drawSwapChain); + SwapChainEGL const* const rsc = static_cast(readSwapChain); + EGLContext context = getContextForType(type); + EGLBoolean const success = egl.makeCurrent(context, dsc->sur, rsc->sur); + return success == EGL_TRUE ? true : false; } void PlatformEGL::makeCurrent(Platform::SwapChain* drawSwapChain, - Platform::SwapChain* readSwapChain) noexcept { - EGLSurface drawSur = (EGLSurface) drawSwapChain; - EGLSurface readSur = (EGLSurface) readSwapChain; - if (drawSur != EGL_NO_SURFACE || readSur != EGL_NO_SURFACE) { - makeCurrent(drawSur, readSur); + Platform::SwapChain* readSwapChain, + utils::Invocable preContextChange, + utils::Invocable postContextChange) noexcept { + + assert_invariant(drawSwapChain); + assert_invariant(readSwapChain); + + ContextType type = ContextType::UNPROTECTED; + if (ext.egl.EXT_protected_content) { + bool const swapChainProtected = isSwapChainProtected(drawSwapChain); + if (UTILS_UNLIKELY(swapChainProtected)) { + // we need a protected context + if (UTILS_UNLIKELY(mEGLContextProtected == EGL_NO_CONTEXT)) { + // we don't have one, create it! + EGLConfig config = ext.egl.KHR_no_config_context ? EGL_NO_CONFIG_KHR : mEGLConfig; + Config protectedContextAttribs{ mContextAttribs }; + protectedContextAttribs[EGL_PROTECTED_CONTENT_EXT] = EGL_TRUE; + mEGLContextProtected = eglCreateContext(mEGLDisplay, config, mEGLContext, + protectedContextAttribs.data()); + if (UTILS_UNLIKELY(mEGLContextProtected == EGL_NO_CONTEXT)) { + // couldn't create the protected context + logEglError("eglCreateContext[EGL_PROTECTED_CONTENT_EXT]"); + ext.egl.EXT_protected_content = false; + goto error; + } + } + type = ContextType::PROTECTED; + error: ; + } + + bool const contextChange = type != mCurrentContextType; + mCurrentContextType = type; + + if (UTILS_UNLIKELY(contextChange)) { + preContextChange(); + bool const success = makeCurrent(mCurrentContextType, drawSwapChain, readSwapChain); + if (UTILS_UNLIKELY(!success)) { + logEglError("PlatformEGL::makeCurrent"); + if (mEGLContextProtected != EGL_NO_CONTEXT) { + eglDestroyContext(mEGLDisplay, mEGLContextProtected); + mEGLContextProtected = EGL_NO_CONTEXT; + } + mCurrentContextType = ContextType::UNPROTECTED; + } + if (UTILS_LIKELY(!swapChainProtected && mEGLContextProtected != EGL_NO_CONTEXT)) { + // We don't need the protected context anymore, unbind and destroy right away. + eglDestroyContext(mEGLDisplay, mEGLContextProtected); + mEGLContextProtected = EGL_NO_CONTEXT; + } + size_t const contextIndex = (mCurrentContextType == ContextType::PROTECTED) ? 1 : 0; + postContextChange(contextIndex); + return; + } + } + + bool const success = makeCurrent(mCurrentContextType, drawSwapChain, readSwapChain); + if (UTILS_UNLIKELY(!success)) { + logEglError("PlatformEGL::makeCurrent"); } } void PlatformEGL::commit(Platform::SwapChain* swapChain) noexcept { - EGLSurface sur = (EGLSurface) swapChain; - if (sur != EGL_NO_SURFACE) { - eglSwapBuffers(mEGLDisplay, sur); + if (swapChain) { + SwapChainEGL const* const sc = static_cast(swapChain); + if (sc->sur != EGL_NO_SURFACE) { + eglSwapBuffers(mEGLDisplay, sc->sur); + } } } +// ----------------------------------------------------------------------------------------------- + bool PlatformEGL::canCreateFence() noexcept { return true; } @@ -351,7 +682,7 @@ FenceStatus PlatformEGL::waitFence( #ifdef EGL_KHR_reusable_sync EGLSyncKHR sync = (EGLSyncKHR) fence; if (sync != EGL_NO_SYNC_KHR) { - EGLint status = eglClientWaitSyncKHR(mEGLDisplay, sync, 0, (EGLTimeKHR)timeout); + EGLint const status = eglClientWaitSyncKHR(mEGLDisplay, sync, 0, (EGLTimeKHR)timeout); if (status == EGL_CONDITION_SATISFIED_KHR) { return FenceStatus::CONDITION_SATISFIED; } @@ -363,10 +694,12 @@ FenceStatus PlatformEGL::waitFence( return FenceStatus::ERROR; } +// ----------------------------------------------------------------------------------------------- + OpenGLPlatform::ExternalTexture* PlatformEGL::createExternalImageTexture() noexcept { - ExternalTexture* outTexture = new ExternalTexture{}; + ExternalTexture* outTexture = new(std::nothrow) ExternalTexture{}; glGenTextures(1, &outTexture->id); - if (UTILS_LIKELY(ext.OES_EGL_image_external_essl3)) { + if (UTILS_LIKELY(ext.gl.OES_EGL_image_external_essl3)) { outTexture->target = GL_TEXTURE_EXTERNAL_OES; } else { // if texture external is not supported, revert to texture 2d @@ -382,28 +715,93 @@ void PlatformEGL::destroyExternalImage(ExternalTexture* texture) noexcept { bool PlatformEGL::setExternalImage(void* externalImage, UTILS_UNUSED_IN_RELEASE ExternalTexture* texture) noexcept { - if (UTILS_LIKELY(ext.OES_EGL_image_external_essl3)) { - assert_invariant(texture->target == GL_TEXTURE_EXTERNAL_OES); + + // OES_EGL_image_external_essl3 must be present if the target is TEXTURE_EXTERNAL_OES + // GL_OES_EGL_image must be present if TEXTURE_2D is used + +#if defined(GL_OES_EGL_image) || defined(GL_OES_EGL_image_external_essl3) // the texture is guaranteed to be bound here. -#ifdef GL_OES_EGL_image - glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, + glEGLImageTargetTexture2DOES(texture->target, static_cast(externalImage)); #endif - } + return true; } +// ----------------------------------------------------------------------------------------------- + void PlatformEGL::initializeGlExtensions() noexcept { + // We're guaranteed to be on an ES platform, since we're using EGL GLUtils::unordered_string_set glExtensions; - GLint n; - glGetIntegerv(GL_NUM_EXTENSIONS, &n); - for (GLint i = 0; i < n; ++i) { - const char * const extension = (const char*) glGetStringi(GL_EXTENSIONS, (GLuint)i); - glExtensions.insert(extension); - } - ext.OES_EGL_image_external_essl3 = glExtensions.has("GL_OES_EGL_image_external_essl3"); + const char* const extensions = (const char*)glGetString(GL_EXTENSIONS); + glExtensions = GLUtils::split(extensions); + ext.gl.OES_EGL_image_external_essl3 = glExtensions.has("GL_OES_EGL_image_external_essl3"); } -} // namespace filament::backend +EGLContext PlatformEGL::getContextForType(OpenGLPlatform::ContextType type) const noexcept { + switch (type) { + case ContextType::NONE: + return EGL_NO_CONTEXT; + case ContextType::UNPROTECTED: + return mEGLContext; + case ContextType::PROTECTED: + return mEGLContextProtected; + } +} // --------------------------------------------------------------------------------------------- + +PlatformEGL::Config::Config() = default; + +PlatformEGL::Config::Config(std::initializer_list> list) + : mConfig(list) { + mConfig.emplace_back(EGL_NONE, EGL_NONE); +} + +EGLint& PlatformEGL::Config::operator[](EGLint name) { + auto pos = std::find_if(mConfig.begin(), mConfig.end(), + [name](auto&& v) { return v.first == name; }); + if (pos == mConfig.end()) { + mConfig.insert(pos - 1, { name, 0 }); + pos = mConfig.end() - 2; + } + return pos->second; +} + +EGLint PlatformEGL::Config::operator[](EGLint name) const { + auto pos = std::find_if(mConfig.begin(), mConfig.end(), + [name](auto&& v) { return v.first == name; }); + assert_invariant(pos != mConfig.end()); + return pos->second; +} + +void PlatformEGL::Config::erase(EGLint name) noexcept { + if (name != EGL_NONE) { + auto pos = std::find_if(mConfig.begin(), mConfig.end(), + [name](auto&& v) { return v.first == name; }); + if (pos != mConfig.end()) { + mConfig.erase(pos); + } + } +} + +// ------------------------------------------------------------------------------------------------ + +EGLBoolean PlatformEGL::EGL::makeCurrent(EGLContext context, EGLSurface drawSurface, + EGLSurface readSurface) noexcept { + if (UTILS_UNLIKELY(( + mCurrentContext != context || + drawSurface != mCurrentDrawSurface || readSurface != mCurrentReadSurface))) { + EGLBoolean const success = eglMakeCurrent( + mEGLDisplay, drawSurface, readSurface, context); + if (success) { + mCurrentDrawSurface = drawSurface; + mCurrentReadSurface = readSurface; + mCurrentContext = context; + } + return success; + } + return EGL_TRUE; +} + +} // namespace filament::backend diff --git a/filament/backend/src/opengl/platforms/PlatformEGLAndroid.cpp b/filament/backend/src/opengl/platforms/PlatformEGLAndroid.cpp index c273b66d624..07e4b10d36d 100644 --- a/filament/backend/src/opengl/platforms/PlatformEGLAndroid.cpp +++ b/filament/backend/src/opengl/platforms/PlatformEGLAndroid.cpp @@ -14,21 +14,45 @@ * limitations under the License. */ +#include +#include +#include #include +#include + #include "opengl/GLUtils.h" #include "ExternalStreamManagerAndroid.h" #include +#include +#include -#include -#include +#include #include +#include +#include #include +#include +#include + #include +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include + // We require filament to be built with an API 19 toolchain, before that, OpenGLES 3.0 didn't exist // Actually, OpenGL ES 3.0 was added to API 18, but API 19 is the better target and // the minimum for Jetpack at the time of this comment. @@ -60,47 +84,124 @@ UTILS_PRIVATE PFNEGLGETFRAMETIMESTAMPSANDROIDPROC eglGetFrameTimestampsANDROID = } using namespace glext; -using EGLStream = Platform::Stream; +// --------------------------------------------------------------------------------------------- + +PlatformEGLAndroid::InitializeJvmForPerformanceManagerIfNeeded::InitializeJvmForPerformanceManagerIfNeeded() { + // PerformanceHintManager() needs the calling thread to be a Java thread; so we need + // to attach this thread to the JVM before we initialize PerformanceHintManager. + // This should be done in PerformanceHintManager(), but libutils doesn't have access to + // VirtualMachineEnv. + if (PerformanceHintManager::isSupported()) { + (void)VirtualMachineEnv::get().getEnvironment(); + } +} // --------------------------------------------------------------------------------------------- PlatformEGLAndroid::PlatformEGLAndroid() noexcept : PlatformEGL(), - mExternalStreamManager(ExternalStreamManagerAndroid::create()) { - - char scratch[PROP_VALUE_MAX + 1]; - int length = __system_property_get("ro.build.version.release", scratch); - int const androidVersion = length >= 0 ? atoi(scratch) : 1; - if (!androidVersion) { - mOSVersion = 1000; // if androidVersion is 0, it means "future" - } else { - length = __system_property_get("ro.build.version.sdk", scratch); - mOSVersion = length >= 0 ? atoi(scratch) : 1; + mExternalStreamManager(ExternalStreamManagerAndroid::create()), + mInitializeJvmForPerformanceManagerIfNeeded(), + mPerformanceHintManager() { + mOSVersion = android_get_device_api_level(); + if (mOSVersion < 0) { + mOSVersion = __ANDROID_API_FUTURE__; } - // This disables an ANGLE optimization on ARM, which turns out to be more costly for us - // see b/229017581 - // We need to do this before we create the GL context. - // An alternative solution is use a system property: - // __system_property_set( - // "debug.angle.feature_overrides_disabled", - // "preferSubmitAtFBOBoundary"); - // but that would outlive this process, so the environment variable is better. - // We also make sure to not update the variable if it already exists. - // There is no harm setting this if we're not on ANGLE or ARM. - setenv("ANGLE_FEATURE_OVERRIDES_DISABLED", "preferSubmitAtFBOBoundary", false); + mNativeWindowLib = dlopen("libnativewindow.so", RTLD_LOCAL | RTLD_NOW); + if (mNativeWindowLib) { + ANativeWindow_getBuffersDefaultDataSpace = + (int32_t(*)(ANativeWindow*))dlsym(mNativeWindowLib, + "ANativeWindow_getBuffersDefaultDataSpace"); + } } -PlatformEGLAndroid::~PlatformEGLAndroid() noexcept = default; - +PlatformEGLAndroid::~PlatformEGLAndroid() noexcept { + if (mNativeWindowLib) { + dlclose(mNativeWindowLib); + } +} void PlatformEGLAndroid::terminate() noexcept { ExternalStreamManagerAndroid::destroy(&mExternalStreamManager); PlatformEGL::terminate(); } +static constexpr const std::string_view kNativeWindowInvalidMsg = + "ANativeWindow is invalid. It probably has been destroyed. EGL surface = "; + +bool PlatformEGLAndroid::makeCurrent(ContextType type, + SwapChain* drawSwapChain, + SwapChain* readSwapChain) noexcept { + + // fast & safe path + if (UTILS_LIKELY(!mAssertNativeWindowIsValid)) { + return PlatformEGL::makeCurrent(type, drawSwapChain, readSwapChain); + } + + SwapChainEGL const* const dsc = static_cast(drawSwapChain); + if (ANativeWindow_getBuffersDefaultDataSpace) { + // anw can be nullptr if we're using a pbuffer surface + if (UTILS_LIKELY(dsc->nativeWindow)) { + // this a proxy of is_valid() + auto result = ANativeWindow_getBuffersDefaultDataSpace(dsc->nativeWindow); + FILAMENT_CHECK_POSTCONDITION(result >= 0) << kNativeWindowInvalidMsg << dsc->sur; + } + } else { + // If we don't have ANativeWindow_getBuffersDefaultDataSpace, we revert to using the + // private query() call. + // Shadow version if the real ANativeWindow, so we can access the query() hook. Query + // has existed since forever, probably Android 1.0. + struct NativeWindow { + // is valid query enum value + enum { IS_VALID = 17 }; + uint64_t pad[18]; + int (* query)(ANativeWindow const*, int, int*); + } const* pWindow = reinterpret_cast(dsc->nativeWindow); + int isValid = 0; + if (UTILS_LIKELY(pWindow->query)) { // just in case it's nullptr + int const err = pWindow->query(dsc->nativeWindow, NativeWindow::IS_VALID, &isValid); + if (UTILS_LIKELY(err >= 0)) { // in case the IS_VALID enum is not recognized + // query call succeeded + FILAMENT_CHECK_POSTCONDITION(isValid) << kNativeWindowInvalidMsg << dsc->sur; + } + } + } + return PlatformEGL::makeCurrent(type, drawSwapChain, readSwapChain); +} + +void PlatformEGLAndroid::beginFrame( + int64_t monotonic_clock_ns, + int64_t refreshIntervalNs, + uint32_t frameId) noexcept { + if (mPerformanceHintSession.isValid()) { + if (refreshIntervalNs <= 0) { + // we're not provided with a target time, assume 16.67ms + refreshIntervalNs = 16'666'667; + } + mStartTimeOfActualWork = clock::time_point(std::chrono::nanoseconds(monotonic_clock_ns)); + mPerformanceHintSession.updateTargetWorkDuration(refreshIntervalNs); + } + PlatformEGL::beginFrame(monotonic_clock_ns, refreshIntervalNs, frameId); +} + +void backend::PlatformEGLAndroid::preCommit() noexcept { + if (mPerformanceHintSession.isValid()) { + auto const actualWorkDuration = std::chrono::duration_cast( + clock::now() - mStartTimeOfActualWork); + mPerformanceHintSession.reportActualWorkDuration(actualWorkDuration.count()); + } + PlatformEGL::preCommit(); +} + Driver* PlatformEGLAndroid::createDriver(void* sharedContext, const Platform::DriverConfig& driverConfig) noexcept { + + // the refresh rate default value doesn't matter, we change it later + int32_t const tid = gettid(); + mPerformanceHintSession = PerformanceHintManager::Session{ + mPerformanceHintManager, &tid, 1, 16'666'667 }; + Driver* driver = PlatformEGL::createDriver(sharedContext, driverConfig); auto extensions = GLUtils::split(eglQueryString(mEGLDisplay, EGL_EXTENSIONS)); @@ -125,15 +226,18 @@ Driver* PlatformEGLAndroid::createDriver(void* sharedContext, "eglGetFrameTimestampsANDROID"); } + mAssertNativeWindowIsValid = driverConfig.assertNativeWindowIsValid; + return driver; } void PlatformEGLAndroid::setPresentationTime(int64_t presentationTimeInNanosecond) noexcept { - if (mCurrentDrawSurface != EGL_NO_SURFACE) { + EGLSurface currentDrawSurface = eglGetCurrentSurface(EGL_DRAW); + if (currentDrawSurface != EGL_NO_SURFACE) { if (eglPresentationTimeANDROID) { eglPresentationTimeANDROID( mEGLDisplay, - mCurrentDrawSurface, + currentDrawSurface, presentationTimeInNanosecond); } } @@ -165,14 +269,28 @@ int PlatformEGLAndroid::getOSVersion() const noexcept { AcquiredImage PlatformEGLAndroid::transformAcquiredImage(AcquiredImage source) noexcept { // Convert the AHardwareBuffer to EGLImage. - EGLClientBuffer clientBuffer = eglGetNativeClientBufferANDROID((const AHardwareBuffer*)source.image); + AHardwareBuffer const* const pHardwareBuffer = (const AHardwareBuffer*)source.image; + + EGLClientBuffer clientBuffer = eglGetNativeClientBufferANDROID(pHardwareBuffer); if (!clientBuffer) { slog.e << "Unable to get EGLClientBuffer from AHardwareBuffer." << io::endl; return {}; } - // Note that this cannot be used to stream protected video (for now) because we do not set EGL_PROTECTED_CONTENT_EXT. - EGLint attrs[] = { EGL_NONE, EGL_NONE }; - EGLImageKHR eglImage = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, clientBuffer, attrs); + + PlatformEGL::Config attributes; + + if (__builtin_available(android 26, *)) { + AHardwareBuffer_Desc desc; + AHardwareBuffer_describe(pHardwareBuffer, &desc); + bool const isProtectedContent = + desc.usage & AHardwareBuffer_UsageFlags::AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT; + if (isProtectedContent) { + attributes[EGL_PROTECTED_CONTENT_EXT] = EGL_TRUE; + } + } + + EGLImageKHR eglImage = eglCreateImageKHR(mEGLDisplay, + EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, clientBuffer, attributes.data()); if (eglImage == EGL_NO_IMAGE_KHR) { slog.e << "eglCreateImageKHR returned no image." << io::endl; return {}; @@ -185,7 +303,7 @@ AcquiredImage PlatformEGLAndroid::transformAcquiredImage(AcquiredImage source) n AcquiredImage acquiredImage; EGLDisplay display; }; - Closure* closure = new Closure(source, mEGLDisplay); + Closure* closure = new(std::nothrow) Closure(source, mEGLDisplay); auto patchedCallback = [](void* image, void* userdata) { Closure* closure = (Closure*)userdata; if (eglDestroyImageKHR(closure->display, (EGLImageKHR) image) == EGL_FALSE) { diff --git a/filament/backend/src/opengl/platforms/PlatformEGLHeadless.cpp b/filament/backend/src/opengl/platforms/PlatformEGLHeadless.cpp index befebaa62da..b3c53716bd4 100644 --- a/filament/backend/src/opengl/platforms/PlatformEGLHeadless.cpp +++ b/filament/backend/src/opengl/platforms/PlatformEGLHeadless.cpp @@ -30,21 +30,14 @@ using namespace utils; namespace filament { using namespace backend; -namespace glext { -UTILS_PRIVATE PFNEGLCREATESYNCKHRPROC eglCreateSyncKHR = {}; -UTILS_PRIVATE PFNEGLDESTROYSYNCKHRPROC eglDestroySyncKHR = {}; -UTILS_PRIVATE PFNEGLCLIENTWAITSYNCKHRPROC eglClientWaitSyncKHR = {}; -UTILS_PRIVATE PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR = {}; -UTILS_PRIVATE PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR = {}; -} -using namespace glext; - -// --------------------------------------------------------------------------------------------- - PlatformEGLHeadless::PlatformEGLHeadless() noexcept : PlatformEGL() { } +bool PlatformEGLHeadless::isOpenGL() const noexcept { + return true; +} + backend::Driver* PlatformEGLHeadless::createDriver(void* sharedContext, const Platform::DriverConfig& driverConfig) noexcept { EGLBoolean bindAPI = eglBindAPI(EGL_OPENGL_API); @@ -58,166 +51,7 @@ backend::Driver* PlatformEGLHeadless::createDriver(void* sharedContext, return nullptr; } - // Copied from the base class and modified slightly. Should be cleaned up/improved later. - mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); - assert_invariant(mEGLDisplay != EGL_NO_DISPLAY); - - EGLint major, minor; - EGLBoolean initialized = eglInitialize(mEGLDisplay, &major, &minor); - - if (!initialized) { - EGLDeviceEXT eglDevice; - EGLint numDevices; - - PFNEGLQUERYDEVICESEXTPROC eglQueryDevicesEXT = - (PFNEGLQUERYDEVICESEXTPROC)eglGetProcAddress("eglQueryDevicesEXT"); - if (eglQueryDevicesEXT != NULL) { - eglQueryDevicesEXT(1, &eglDevice, &numDevices); - if(auto* getPlatformDisplay = reinterpret_cast( - eglGetProcAddress("eglGetPlatformDisplay"))) { - mEGLDisplay = getPlatformDisplay(EGL_PLATFORM_DEVICE_EXT, eglDevice, 0); - initialized = eglInitialize(mEGLDisplay, &major, &minor); - } - } - } - - if (UTILS_UNLIKELY(!initialized)) { - slog.e << "eglInitialize failed" << io::endl; - return nullptr; - } - - auto extensions = GLUtils::split(eglQueryString(mEGLDisplay, EGL_EXTENSIONS)); - - eglCreateSyncKHR = (PFNEGLCREATESYNCKHRPROC) eglGetProcAddress("eglCreateSyncKHR"); - eglDestroySyncKHR = (PFNEGLDESTROYSYNCKHRPROC) eglGetProcAddress("eglDestroySyncKHR"); - eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC) eglGetProcAddress("eglClientWaitSyncKHR"); - - eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC) eglGetProcAddress("eglCreateImageKHR"); - eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC) eglGetProcAddress("eglDestroyImageKHR"); - - EGLint configsCount; - - EGLint configAttribs[] = { - EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, - EGL_RED_SIZE, 8, - EGL_GREEN_SIZE, 8, - EGL_BLUE_SIZE, 8, - EGL_ALPHA_SIZE, 0, - EGL_DEPTH_SIZE, 32, - EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, - EGL_NONE - }; - - EGLint contextAttribs[] = { - EGL_CONTEXT_CLIENT_VERSION, 3, - EGL_NONE, EGL_NONE, // reserved for EGL_CONTEXT_OPENGL_NO_ERROR_KHR below - EGL_NONE - }; - - EGLint pbufferAttribs[] = { - EGL_WIDTH, 1, - EGL_HEIGHT, 1, - EGL_NONE - }; - -#ifdef NDEBUG - // When we don't have a shared context and we're in release mode, we always activate the - // EGL_KHR_create_context_no_error extension. - if (!sharedContext && extensions.has("EGL_KHR_create_context_no_error")) { - contextAttribs[2] = EGL_CONTEXT_OPENGL_NO_ERROR_KHR; - contextAttribs[3] = EGL_TRUE; - } -#endif - - EGLConfig eglConfig = nullptr; - - // find an opaque config - if (!eglChooseConfig(mEGLDisplay, configAttribs, &mEGLConfig, 1, &configsCount)) { - logEglError("eglChooseConfig"); - goto error; - } - - // fallback to a 24-bit depth buffer - if (configsCount == 0) { - configAttribs[10] = EGL_DEPTH_SIZE; - configAttribs[11] = 24; - - if (!eglChooseConfig(mEGLDisplay, configAttribs, &mEGLConfig, 1, &configsCount)) { - logEglError("eglChooseConfig"); - goto error; - } - } - - // find a transparent config - configAttribs[8] = EGL_ALPHA_SIZE; - configAttribs[9] = 8; - if (!eglChooseConfig(mEGLDisplay, configAttribs, &mEGLTransparentConfig, 1, &configsCount) || - (configAttribs[13] == EGL_DONT_CARE && configsCount == 0)) { - logEglError("eglChooseConfig"); - goto error; - } - - if (!extensions.has("EGL_KHR_no_config_context")) { - // if we have the EGL_KHR_no_config_context, we don't need to worry about the config - // when creating the context, otherwise, we must always pick a transparent config. - eglConfig = mEGLConfig = mEGLTransparentConfig; - } - - // the pbuffer dummy surface is always created with a transparent surface because - // either we have EGL_KHR_no_config_context and it doesn't matter, or we don't and - // we must use a transparent surface - mEGLDummySurface = eglCreatePbufferSurface(mEGLDisplay, mEGLTransparentConfig, pbufferAttribs); - if (mEGLDummySurface == EGL_NO_SURFACE) { - logEglError("eglCreatePbufferSurface"); - goto error; - } - - mEGLContext = eglCreateContext(mEGLDisplay, eglConfig, (EGLContext)sharedContext, contextAttribs); - if (mEGLContext == EGL_NO_CONTEXT && sharedContext && - extensions.has("EGL_KHR_create_context_no_error")) { - // context creation could fail because of EGL_CONTEXT_OPENGL_NO_ERROR_KHR - // not matching the sharedContext. Try with it. - contextAttribs[2] = EGL_CONTEXT_OPENGL_NO_ERROR_KHR; - contextAttribs[3] = EGL_TRUE; - mEGLContext = eglCreateContext(mEGLDisplay, eglConfig, (EGLContext)sharedContext, contextAttribs); - } - if (UTILS_UNLIKELY(mEGLContext == EGL_NO_CONTEXT)) { - // eglCreateContext failed - logEglError("eglCreateContext"); - goto error; - } - - if (!makeCurrent(mEGLDummySurface, mEGLDummySurface)) { - // eglMakeCurrent failed - logEglError("eglMakeCurrent"); - goto error; - } - - initializeGlExtensions(); - - clearGlError(); - - // success!! - return OpenGLPlatform::createDefaultDriver(this, sharedContext, driverConfig); - -error: - // if we're here, we've failed - if (mEGLDummySurface) { - eglDestroySurface(mEGLDisplay, mEGLDummySurface); - } - if (mEGLContext) { - eglDestroyContext(mEGLDisplay, mEGLContext); - } - - mEGLDummySurface = EGL_NO_SURFACE; - mEGLContext = EGL_NO_CONTEXT; - - eglTerminate(mEGLDisplay); - eglReleaseThread(); - - return nullptr; + return PlatformEGL::createDriver(sharedContext, driverConfig); } } // namespace filament - -// --------------------------------------------------------------------------------------------- diff --git a/filament/backend/src/opengl/platforms/PlatformGLX.cpp b/filament/backend/src/opengl/platforms/PlatformGLX.cpp index 46f7d610088..f7a64bda622 100644 --- a/filament/backend/src/opengl/platforms/PlatformGLX.cpp +++ b/filament/backend/src/opengl/platforms/PlatformGLX.cpp @@ -226,7 +226,7 @@ Driver* PlatformGLX::createDriver(void* const sharedGLContext, g_glx.setCurrentContext(mGLXDisplay, mDummySurface, mDummySurface, mGLXContext); int result = bluegl::bind(); - ASSERT_POSTCONDITION(!result, "Unable to load OpenGL entry points."); + FILAMENT_CHECK_POSTCONDITION(!result) << "Unable to load OpenGL entry points."; return OpenGLPlatform::createDefaultDriver(this, sharedGLContext, driverConfig); } @@ -239,16 +239,12 @@ void PlatformGLX::terminate() noexcept { bluegl::unbind(); } -Platform::SwapChain* PlatformGLX::createSwapChain(void* nativeWindow, uint64_t& flags) noexcept { - // Transparent swap chain is not supported - flags &= ~SWAP_CHAIN_CONFIG_TRANSPARENT; +Platform::SwapChain* PlatformGLX::createSwapChain(void* nativeWindow, uint64_t flags) noexcept { return (SwapChain*)nativeWindow; } Platform::SwapChain* PlatformGLX::createSwapChain( - uint32_t width, uint32_t height, uint64_t& flags) noexcept { - // Transparent swap chain is not supported - flags &= ~SWAP_CHAIN_CONFIG_TRANSPARENT; + uint32_t width, uint32_t height, uint64_t flags) noexcept { int pbufferAttribs[] = { GLX_PBUFFER_WIDTH, int(width), GLX_PBUFFER_HEIGHT, int(height), @@ -269,10 +265,11 @@ void PlatformGLX::destroySwapChain(Platform::SwapChain* swapChain) noexcept { } } -void PlatformGLX::makeCurrent( - Platform::SwapChain* drawSwapChain, Platform::SwapChain* readSwapChain) noexcept { +bool PlatformGLX::makeCurrent(ContextType type, SwapChain* drawSwapChain, + SwapChain* readSwapChain) noexcept { g_glx.setCurrentContext(mGLXDisplay, (GLXDrawable)drawSwapChain, (GLXDrawable)readSwapChain, mGLXContext); + return true; } void PlatformGLX::commit(Platform::SwapChain* swapChain) noexcept { diff --git a/filament/backend/src/opengl/platforms/PlatformOSMesa.cpp b/filament/backend/src/opengl/platforms/PlatformOSMesa.cpp new file mode 100644 index 00000000000..db104caf3f4 --- /dev/null +++ b/filament/backend/src/opengl/platforms/PlatformOSMesa.cpp @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include +#include + +#include +#include + +namespace filament::backend { + +using namespace backend; + +namespace { + +using BackingType = GLfloat; +#define BACKING_GL_TYPE GL_FLOAT + +struct OSMesaSwapchain { + OSMesaSwapchain(uint32_t width, uint32_t height) + : width(width), + height(height), + buffer(new uint8_t[width * height * 4 * sizeof(BackingType)]) {} + + uint32_t width = 0; + uint32_t height = 0; + std::unique_ptr buffer; +}; + +struct OSMesaAPI { +private: + using CreateContextFunc = OSMesaContext (*)(GLenum format, OSMesaContext); + using DestroyContextFunc = GLboolean (*)(OSMesaContext); + using MakeCurrentFunc = GLboolean (*)(OSMesaContext ctx, void* buffer, GLenum type, + GLsizei width, GLsizei height); + using GetProcAddressFunc = OSMESAproc (*)(const char* funcName); + +public: + CreateContextFunc OSMesaCreateContext; + DestroyContextFunc OSMesaDestroyContext; + MakeCurrentFunc OSMesaMakeCurrent; + GetProcAddressFunc OSMesaGetProcAddress; + + OSMesaAPI() { + constexpr char const* libraryNames[] = {"libOSMesa.so", "libosmesa.so"}; + for (char const* libName: libraryNames) { + mLib = dlopen(libName, RTLD_GLOBAL | RTLD_NOW); + if (mLib) { + break; + } + } + if (mLib) { + OSMesaGetProcAddress = (GetProcAddressFunc) dlsym(mLib, "OSMesaGetProcAddress"); + } else { + OSMesaGetProcAddress = (GetProcAddressFunc) dlsym(RTLD_LOCAL, "OSMesaGetProcAddress"); + } + + FILAMENT_CHECK_PRECONDITION(OSMesaGetProcAddress) + << "Unable to against libOSMesa to create a software GL context"; + + OSMesaCreateContext = (CreateContextFunc) OSMesaGetProcAddress("OSMesaCreateContext"); + OSMesaDestroyContext = + (DestroyContextFunc) OSMesaGetProcAddress("OSMesaDestroyContext"); + OSMesaMakeCurrent = (MakeCurrentFunc) OSMesaGetProcAddress("OSMesaMakeCurrent"); + } + + ~OSMesaAPI() { + if (mLib) { + dlclose(mLib); + } + } +private: + void* mLib = nullptr; +}; + +}// anonymous namespace + +Driver* PlatformOSMesa::createDriver(void* const sharedGLContext, + const DriverConfig& driverConfig) noexcept { + OSMesaAPI* api = new OSMesaAPI(); + mOsMesaApi = api; + + FILAMENT_CHECK_PRECONDITION(sharedGLContext == nullptr) + << "shared GL context is not supported with PlatformOSMesa"; + mContext = api->OSMesaCreateContext(GL_RGBA, NULL); + + // We need to do a no-op makecurrent here so that the context will be in a correct state before + // any GL calls. + auto chain = createSwapChain(1, 1, 0); + makeCurrent(ContextType::UNPROTECTED, chain, nullptr); + destroySwapChain(chain); + + int result = bluegl::bind(); + FILAMENT_CHECK_POSTCONDITION(!result) << "Unable to load OpenGL entry points."; + + return OpenGLPlatform::createDefaultDriver(this, sharedGLContext, driverConfig); +} + +void PlatformOSMesa::terminate() noexcept { + OSMesaAPI* api = (OSMesaAPI*) mOsMesaApi; + api->OSMesaDestroyContext(mContext); + delete api; + mOsMesaApi = nullptr; + + bluegl::unbind(); +} + +Platform::SwapChain* PlatformOSMesa::createSwapChain(void* nativeWindow, uint64_t flags) noexcept { + FILAMENT_CHECK_POSTCONDITION(false) << "Cannot create non-headless swapchain"; + return (SwapChain*) nativeWindow; +} + +Platform::SwapChain* PlatformOSMesa::createSwapChain(uint32_t width, uint32_t height, + uint64_t flags) noexcept { + OSMesaSwapchain* swapchain = new OSMesaSwapchain(width, height); + return (SwapChain*) swapchain; +} + +void PlatformOSMesa::destroySwapChain(Platform::SwapChain* swapChain) noexcept { + OSMesaSwapchain* impl = (OSMesaSwapchain*) swapChain; + delete impl; +} + +bool PlatformOSMesa::makeCurrent(ContextType type, SwapChain* drawSwapChain, + SwapChain* readSwapChain) noexcept { + OSMesaAPI* api = (OSMesaAPI*) mOsMesaApi; + OSMesaSwapchain* impl = (OSMesaSwapchain*) drawSwapChain; + + auto result = api->OSMesaMakeCurrent(mContext, (BackingType*) impl->buffer.get(), + BACKING_GL_TYPE, impl->width, impl->height); + FILAMENT_CHECK_POSTCONDITION(result == GL_TRUE) << "OSMesaMakeCurrent failed!"; + + return true; +} + +void PlatformOSMesa::commit(Platform::SwapChain* swapChain) noexcept { + // No-op since we are not scanning out to a display. +} + +} // namespace filament::backend diff --git a/filament/backend/src/opengl/platforms/PlatformWGL.cpp b/filament/backend/src/opengl/platforms/PlatformWGL.cpp index 4341265b6c3..57c3e4668d3 100644 --- a/filament/backend/src/opengl/platforms/PlatformWGL.cpp +++ b/filament/backend/src/opengl/platforms/PlatformWGL.cpp @@ -19,8 +19,8 @@ #include #ifdef _MSC_VER - // this variable is checked in BlueGL.h (included from "gl_headers.h" right after this), - // and prevents duplicate definition of OpenGL apis when building this file. + // this variable is checked in BlueGL.h (included from "gl_headers.h" right after this), + // and prevents duplicate definition of OpenGL apis when building this file. // However, GL_GLEXT_PROTOTYPES need to be defined in BlueGL.h when included from other files. #define FILAMENT_PLATFORM_WGL #endif @@ -37,9 +37,8 @@ namespace { -void reportLastWindowsError() { +void reportWindowsError(DWORD dwError) { LPSTR lpMessageBuffer = nullptr; - DWORD dwError = GetLastError(); if (dwError == 0) { return; @@ -74,11 +73,13 @@ struct WGLSwapChain { bool isHeadless = false; }; +static PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribs = nullptr; + Driver* PlatformWGL::createDriver(void* const sharedGLContext, const Platform::DriverConfig& driverConfig) noexcept { int result = 0; - PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribs = nullptr; int pixelFormat = 0; + DWORD dwError = 0; mPfd = { sizeof(PIXELFORMATDESCRIPTOR), @@ -99,17 +100,12 @@ Driver* PlatformWGL::createDriver(void* const sharedGLContext, 0, 0, 0 }; - int attribs[] = { - WGL_CONTEXT_MAJOR_VERSION_ARB, 4, - WGL_CONTEXT_MINOR_VERSION_ARB, 1, - 0 - }; - HGLRC tempContext = NULL; mHWnd = CreateWindowA("STATIC", "dummy", 0, 0, 0, 1, 1, NULL, NULL, NULL, NULL); HDC whdc = mWhdc = GetDC(mHWnd); if (whdc == NULL) { + dwError = GetLastError(); utils::slog.e << "CreateWindowA() failed" << utils::io::endl; goto error; } @@ -120,6 +116,7 @@ Driver* PlatformWGL::createDriver(void* const sharedGLContext, // We need a tmp context to retrieve and call wglCreateContextAttribsARB. tempContext = wglCreateContext(whdc); if (!wglMakeCurrent(whdc, tempContext)) { + dwError = GetLastError(); utils::slog.e << "wglMakeCurrent() failed, whdc=" << whdc << ", tempContext=" << tempContext << utils::io::endl; goto error; @@ -127,7 +124,23 @@ Driver* PlatformWGL::createDriver(void* const sharedGLContext, wglCreateContextAttribs = (PFNWGLCREATECONTEXTATTRIBSARBPROC) wglGetProcAddress("wglCreateContextAttribsARB"); - mContext = wglCreateContextAttribs(whdc, (HGLRC) sharedGLContext, attribs); + + // try all versions down, from GL 4.5 to 4.1 + + + for (int minor = 5; minor >= 1; minor--) { + mAttribs = { + WGL_CONTEXT_MAJOR_VERSION_ARB, 4, + WGL_CONTEXT_MINOR_VERSION_ARB, minor, + 0 + }; + mContext = wglCreateContextAttribs(whdc, (HGLRC)sharedGLContext, mAttribs.data()); + if (mContext) { + break; + } + dwError = GetLastError(); + } + if (!mContext) { utils::slog.e << "wglCreateContextAttribs() failed, whdc=" << whdc << utils::io::endl; goto error; @@ -138,13 +151,14 @@ Driver* PlatformWGL::createDriver(void* const sharedGLContext, tempContext = NULL; if (!wglMakeCurrent(whdc, mContext)) { + dwError = GetLastError(); utils::slog.e << "wglMakeCurrent() failed, whdc=" << whdc << ", mContext=" << mContext << utils::io::endl; goto error; } result = bluegl::bind(); - ASSERT_POSTCONDITION(!result, "Unable to load OpenGL entry points."); + FILAMENT_CHECK_POSTCONDITION(!result) << "Unable to load OpenGL entry points."; return OpenGLPlatform::createDefaultDriver(this, sharedGLContext, driverConfig); @@ -152,17 +166,30 @@ Driver* PlatformWGL::createDriver(void* const sharedGLContext, if (tempContext) { wglDeleteContext(tempContext); } - reportLastWindowsError(); + reportWindowsError(dwError); terminate(); return NULL; } +bool PlatformWGL::isExtraContextSupported() const noexcept { + return false; +} + +void PlatformWGL::createContext(bool shared) { + HGLRC context = wglCreateContextAttribs(mWhdc, shared ? mContext : nullptr, mAttribs.data()); + wglMakeCurrent(mWhdc, context); + mAdditionalContexts.push_back(context); +} + void PlatformWGL::terminate() noexcept { wglMakeCurrent(NULL, NULL); if (mContext) { wglDeleteContext(mContext); mContext = NULL; } + for (auto& context : mAdditionalContexts) { + wglDeleteContext(mContext); + } if (mHWnd && mWhdc) { ReleaseDC(mHWnd, mWhdc); DestroyWindow(mHWnd); @@ -175,16 +202,18 @@ void PlatformWGL::terminate() noexcept { bluegl::unbind(); } -Platform::SwapChain* PlatformWGL::createSwapChain(void* nativeWindow, uint64_t& flags) noexcept { +Platform::SwapChain* PlatformWGL::createSwapChain(void* nativeWindow, uint64_t flags) noexcept { auto* swapChain = new WGLSwapChain(); swapChain->isHeadless = false; // on Windows, the nativeWindow maps to a HWND swapChain->hWnd = (HWND) nativeWindow; swapChain->hDc = GetDC(swapChain->hWnd); - if (!ASSERT_POSTCONDITION_NON_FATAL(swapChain->hDc, - "Unable to create the SwapChain (nativeWindow = %p)", nativeWindow)) { - reportLastWindowsError(); + if (!swapChain->hDc) { + DWORD dwError = GetLastError(); + ASSERT_POSTCONDITION_NON_FATAL(swapChain->hDc, + "Unable to create the SwapChain (nativeWindow = %p)", nativeWindow); + reportWindowsError(dwError); } // We have to match pixel formats across the HDC and HGLRC (mContext) @@ -194,7 +223,7 @@ Platform::SwapChain* PlatformWGL::createSwapChain(void* nativeWindow, uint64_t& return (Platform::SwapChain*) swapChain; } -Platform::SwapChain* PlatformWGL::createSwapChain(uint32_t width, uint32_t height, uint64_t& flags) noexcept { +Platform::SwapChain* PlatformWGL::createSwapChain(uint32_t width, uint32_t height, uint64_t flags) noexcept { auto* swapChain = new WGLSwapChain(); swapChain->isHeadless = true; @@ -232,8 +261,8 @@ void PlatformWGL::destroySwapChain(Platform::SwapChain* swapChain) noexcept { wglMakeCurrent(mWhdc, mContext); } -void PlatformWGL::makeCurrent(Platform::SwapChain* drawSwapChain, - Platform::SwapChain* readSwapChain) noexcept { +bool PlatformWGL::makeCurrent(ContextType type, SwapChain* drawSwapChain, + SwapChain* readSwapChain) noexcept { ASSERT_PRECONDITION_NON_FATAL(drawSwapChain == readSwapChain, "PlatformWGL does not support distinct draw/read swap chains."); @@ -241,11 +270,14 @@ void PlatformWGL::makeCurrent(Platform::SwapChain* drawSwapChain, HDC hdc = wglSwapChain->hDc; if (hdc != NULL) { BOOL success = wglMakeCurrent(hdc, mContext); - if (!ASSERT_POSTCONDITION_NON_FATAL(success, "wglMakeCurrent() failed. hdc = %p", hdc)) { - reportLastWindowsError(); + if (!success) { + DWORD dwError = GetLastError(); + ASSERT_POSTCONDITION_NON_FATAL(success, "wglMakeCurrent() failed. hdc = %p", hdc); + reportWindowsError(dwError); wglMakeCurrent(0, NULL); } } + return true; } void PlatformWGL::commit(Platform::SwapChain* swapChain) noexcept { diff --git a/filament/backend/src/opengl/platforms/PlatformWebGL.cpp b/filament/backend/src/opengl/platforms/PlatformWebGL.cpp index a87711bbc8e..a6d4c5c5a20 100644 --- a/filament/backend/src/opengl/platforms/PlatformWebGL.cpp +++ b/filament/backend/src/opengl/platforms/PlatformWebGL.cpp @@ -33,12 +33,12 @@ void PlatformWebGL::terminate() noexcept { } Platform::SwapChain* PlatformWebGL::createSwapChain( - void* nativeWindow, uint64_t& flags) noexcept { + void* nativeWindow, uint64_t flags) noexcept { return (SwapChain*)nativeWindow; } Platform::SwapChain* PlatformWebGL::createSwapChain( - uint32_t width, uint32_t height, uint64_t& flags) noexcept { + uint32_t width, uint32_t height, uint64_t flags) noexcept { // TODO: implement headless SwapChain return nullptr; } @@ -46,8 +46,9 @@ Platform::SwapChain* PlatformWebGL::createSwapChain( void PlatformWebGL::destroySwapChain(Platform::SwapChain* swapChain) noexcept { } -void PlatformWebGL::makeCurrent(Platform::SwapChain* drawSwapChain, - Platform::SwapChain* readSwapChain) noexcept { +bool PlatformWebGL::makeCurrent(ContextType type, SwapChain* drawSwapChain, + SwapChain* readSwapChain) noexcept { + return true; } void PlatformWebGL::commit(Platform::SwapChain* swapChain) noexcept { diff --git a/filament/backend/src/ostream.cpp b/filament/backend/src/ostream.cpp index c3f97dc8fdd..a7c8d0dafeb 100644 --- a/filament/backend/src/ostream.cpp +++ b/filament/backend/src/ostream.cpp @@ -15,6 +15,7 @@ */ #include +#include #include #include #include @@ -22,6 +23,8 @@ #include +#include + using namespace filament; using namespace backend; using namespace utils; @@ -293,20 +296,6 @@ io::ostream& operator<<(io::ostream& out, TextureFormat format) { return out; } -io::ostream& operator<<(io::ostream& out, TextureUsage usage) { - switch (usage) { - CASE(TextureUsage, NONE) - CASE(TextureUsage, DEFAULT) - CASE(TextureUsage, COLOR_ATTACHMENT) - CASE(TextureUsage, DEPTH_ATTACHMENT) - CASE(TextureUsage, STENCIL_ATTACHMENT) - CASE(TextureUsage, UPLOADABLE) - CASE(TextureUsage, SAMPLEABLE) - CASE(TextureUsage, SUBPASS_INPUT) - } - return out; -} - io::ostream& operator<<(io::ostream& out, TextureCubemapFace face) { switch (face) { CASE(TextureCubemapFace, NEGATIVE_X) @@ -469,7 +458,7 @@ io::ostream& operator<<(io::ostream& out, filament::backend::Viewport const& vie io::ostream& operator<<(io::ostream& out, TargetBufferFlags flags) { // TODO: implement decoding of enum - out << uint8_t(flags); + out << uint32_t(flags); return out; } @@ -489,11 +478,53 @@ io::ostream& operator<<(io::ostream& out, RenderPassParams const& params) { } io::ostream& operator<<(io::ostream& out, MRT const& mrt) { - // TODO: implement decoding of enum + // TODO: implement decoding of MRT out << "MRT{...}"; return out; } +io::ostream& operator<<(io::ostream& out, ShaderStage shaderStage) { + switch (shaderStage) { + CASE(ShaderStage, VERTEX) + CASE(ShaderStage, FRAGMENT) + CASE(ShaderStage, COMPUTE) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, CompilerPriorityQueue compilerPriorityQueue) { + switch (compilerPriorityQueue) { + CASE(CompilerPriorityQueue, HIGH) + CASE(CompilerPriorityQueue, LOW) + } + return out; +} + +io::ostream& operator<<(io::ostream& out, TextureUsage usage) { + // TODO: implement decoding of TextureUsage bitfield + out << uint32_t(usage); + return out; +} + +io::ostream& operator<<(io::ostream& out, PushConstantVariant pushConstantVariant) { + std::visit([&](auto&& arg) { + out << arg; + }, pushConstantVariant); + return out; +} + +io::ostream& operator<<(io::ostream& out, DescriptorSetLayout const& dsl) { + // TODO: implement decoding of DescriptorSetLayout + out << "DescriptorSetLayout{...}"; + return out; +} + +io::ostream& operator<<(io::ostream& out, DescriptorSetOffsetArray const& dsa) { + // TODO: implement decoding of DescriptorSetOffsetArray + out << "DescriptorSetOffsetArray{...}"; + return out; +} + io::ostream& operator<<(io::ostream& stream, ShaderStageFlags stageFlags) { const char* str = nullptr; switch (stageFlags) { diff --git a/filament/backend/src/vulkan/PlatformVkAndroid.cpp b/filament/backend/src/vulkan/PlatformVkAndroid.cpp deleted file mode 100644 index cbeb4b921b0..00000000000 --- a/filament/backend/src/vulkan/PlatformVkAndroid.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "vulkan/PlatformVkAndroid.h" - -#include "VulkanConstants.h" -#include "VulkanDriverFactory.h" - -#include - -#include - -#include - -using namespace bluevk; - -namespace filament::backend { - -Driver* PlatformVkAndroid::createDriver(void* const sharedContext, const Platform::DriverConfig& driverConfig) noexcept { - ASSERT_PRECONDITION(sharedContext == nullptr, "Vulkan does not support shared contexts."); - static const char* requiredInstanceExtensions[] = { "VK_KHR_android_surface" }; - return VulkanDriverFactory::create(this, requiredInstanceExtensions, 1, driverConfig); -} - -void* PlatformVkAndroid::createVkSurfaceKHR(void* nativeWindow, void* vkinstance, uint64_t flags) noexcept { - const VkInstance instance = (VkInstance) vkinstance; - ANativeWindow* aNativeWindow = (ANativeWindow*) nativeWindow; - VkAndroidSurfaceCreateInfoKHR createInfo { - .sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR, - .window = aNativeWindow - }; - VkSurfaceKHR surface = VK_NULL_HANDLE; - VkResult result = vkCreateAndroidSurfaceKHR(instance, &createInfo, VKALLOC, &surface); - ASSERT_POSTCONDITION(result == VK_SUCCESS, "vkCreateAndroidSurfaceKHR error."); - return (void*) surface; -} - -} // namespace filament::backend diff --git a/filament/backend/src/vulkan/PlatformVkAndroid.h b/filament/backend/src/vulkan/PlatformVkAndroid.h deleted file mode 100644 index 6d90df311b2..00000000000 --- a/filament/backend/src/vulkan/PlatformVkAndroid.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_ANDROID_H -#define TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_ANDROID_H - -#include - -#include -#include - -namespace filament::backend { - -class PlatformVkAndroid final : public VulkanPlatform { -public: - - Driver* createDriver(void* const sharedContext, const Platform::DriverConfig& driverConfig) noexcept override; - - void* createVkSurfaceKHR(void* nativeWindow, void* instance, uint64_t flags) noexcept override; - - int getOSVersion() const noexcept override { return 0; } -}; - -} // namespace filament::backend - -#endif // TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_ANDROID_H diff --git a/filament/backend/src/vulkan/PlatformVkCocoa.h b/filament/backend/src/vulkan/PlatformVkCocoa.h deleted file mode 100644 index 9d41152049b..00000000000 --- a/filament/backend/src/vulkan/PlatformVkCocoa.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_COCOA_H -#define TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_COCOA_H - -#include - -#include -#include - -namespace filament::backend { - -class PlatformVkCocoa final : public VulkanPlatform { -public: - Driver* createDriver(void* sharedContext, const Platform::DriverConfig& driverConfig) noexcept override; - void* createVkSurfaceKHR(void* nativeWindow, void* instance, uint64_t flags) noexcept override; - int getOSVersion() const noexcept override { return 0; } -}; - -} // namespace filament::backend - -#endif // TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_COCOA_H diff --git a/filament/backend/src/vulkan/PlatformVkCocoa.mm b/filament/backend/src/vulkan/PlatformVkCocoa.mm deleted file mode 100644 index 247b7039012..00000000000 --- a/filament/backend/src/vulkan/PlatformVkCocoa.mm +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "vulkan/PlatformVkCocoa.h" - -#include "VulkanConstants.h" -#include "VulkanDriverFactory.h" - -#include -#import -#import - -#include -#include - -#ifndef VK_MVK_macos_surface -#error VK_MVK_macos_surface is not defined -#endif - -using namespace bluevk; - -namespace filament::backend { - -Driver* PlatformVkCocoa::createDriver(void* sharedContext, const Platform::DriverConfig& driverConfig) noexcept { - ASSERT_PRECONDITION(sharedContext == nullptr, "Vulkan does not support shared contexts."); - static const char* requiredInstanceExtensions[] = { - "VK_MVK_macos_surface", // TODO: replace with VK_EXT_metal_surface - }; - return VulkanDriverFactory::create(this, requiredInstanceExtensions, 1, driverConfig); -} - -void* PlatformVkCocoa::createVkSurfaceKHR(void* nativeWindow, void* instance, uint64_t flags) noexcept { - // Obtain the CAMetalLayer-backed view. - NSView* nsview = (__bridge NSView*) nativeWindow; - ASSERT_POSTCONDITION(nsview, "Unable to obtain Metal-backed NSView."); - - // Create the VkSurface. - ASSERT_POSTCONDITION(vkCreateMacOSSurfaceMVK, "Unable to load vkCreateMacOSSurfaceMVK."); - VkSurfaceKHR surface = nullptr; - VkMacOSSurfaceCreateInfoMVK createInfo = {}; - createInfo.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK; - createInfo.pView = (__bridge void*) nsview; - VkResult result = vkCreateMacOSSurfaceMVK((VkInstance) instance, &createInfo, VKALLOC, &surface); - ASSERT_POSTCONDITION(result == VK_SUCCESS, "vkCreateMacOSSurfaceMVK error."); - - return surface; -} - -} // namespace filament::backend diff --git a/filament/backend/src/vulkan/PlatformVkCocoaTouch.h b/filament/backend/src/vulkan/PlatformVkCocoaTouch.h deleted file mode 100644 index 98710af9a08..00000000000 --- a/filament/backend/src/vulkan/PlatformVkCocoaTouch.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_COCOA_TOUCH_H -#define TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_COCOA_TOUCH_H - -#include - -#include -#include - -namespace filament::backend { - -class PlatformVkCocoaTouch final : public VulkanPlatform { -public: - Driver* createDriver(void* const sharedContext, const Platform::DriverConfig& driverConfig) noexcept override; - void* createVkSurfaceKHR(void* nativeWindow, void* instance, uint64_t flags) noexcept override; - int getOSVersion() const noexcept override { return 0; } -}; - -} // namespace filament::backend - -#endif // TNT_FILAMENT_BACKEND_VULKAN_CONTEXTMANAGERVKCOCOATOUCH_H diff --git a/filament/backend/src/vulkan/PlatformVkCocoaTouch.mm b/filament/backend/src/vulkan/PlatformVkCocoaTouch.mm deleted file mode 100644 index 5c7a2e375da..00000000000 --- a/filament/backend/src/vulkan/PlatformVkCocoaTouch.mm +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "vulkan/PlatformVkCocoaTouch.h" - -#include "VulkanDriverFactory.h" - -// Metal is not available when building for the iOS simulator on Desktop. -#define METAL_AVAILABLE __has_include() - -#if METAL_AVAILABLE -#import -#import -#endif - -#include -#include - -#ifndef VK_MVK_ios_surface -#error VK_MVK_ios_surface is not defined -#endif - -#define METALVIEW_TAG 255 - -using namespace bluevk; - -namespace filament::backend { - -Driver* PlatformVkCocoaTouch::createDriver(void* const sharedContext, const Platform::DriverConfig& driverConfig) noexcept { - ASSERT_PRECONDITION(sharedContext == nullptr, "Vulkan does not support shared contexts."); - static const char* requestedExtensions[] = {"VK_MVK_ios_surface"}; - return VulkanDriverFactory::create(this, requestedExtensions, 1, driverConfig); -} - -void* PlatformVkCocoaTouch::createVkSurfaceKHR(void* nativeWindow, void* instance, uint64_t flags) noexcept { -#if METAL_AVAILABLE - CAMetalLayer* metalLayer = (CAMetalLayer*) nativeWindow; - - // Create the VkSurface. - ASSERT_POSTCONDITION(vkCreateIOSSurfaceMVK, "Unable to load vkCreateIOSSurfaceMVK function."); - VkSurfaceKHR surface = nullptr; - VkIOSSurfaceCreateInfoMVK createInfo = {}; - createInfo.sType = VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK; - createInfo.pNext = NULL; - createInfo.flags = 0; - createInfo.pView = metalLayer; - VkResult result = vkCreateIOSSurfaceMVK((VkInstance) instance, &createInfo, VKALLOC, &surface); - ASSERT_POSTCONDITION(result == VK_SUCCESS, "vkCreateIOSSurfaceMVK error."); - - return surface; -#else - return nullptr; -#endif -} - -} // namespace filament::backend diff --git a/filament/backend/src/vulkan/PlatformVkLinuxGGP.cpp b/filament/backend/src/vulkan/PlatformVkLinuxGGP.cpp deleted file mode 100644 index 07739e43aac..00000000000 --- a/filament/backend/src/vulkan/PlatformVkLinuxGGP.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "vulkan/PlatformVkLinuxGGP.h" - -#include -#if defined(FILAMENT_SUPPORTS_GGP) -#include -#endif -#include - -#include "VulkanDriverFactory.h" - -using namespace bluevk; - -namespace filament::backend { - -Driver* PlatformVkLinuxGGP::createDriver( - void* const sharedContext, - const Platform::DriverConfig& driverConfig) noexcept { -#if defined(FILAMENT_SUPPORTS_GGP) - ASSERT_PRECONDITION(sharedContext == nullptr, - "Vulkan does not support shared contexts."); - const char* requiredInstanceExtensions[] = { - VK_GGP_STREAM_DESCRIPTOR_SURFACE_EXTENSION_NAME}; - return VulkanDriverFactory::create(this, requiredInstanceExtensions, - sizeof(requiredInstanceExtensions) / - sizeof(requiredInstanceExtensions[0]), - driverConfig); -#else - PANIC_PRECONDITION("Filament does not support GGP."); - return nullptr; -#endif -} - -void* PlatformVkLinuxGGP::createVkSurfaceKHR(void* nativeWindow, void* instance, - uint64_t flags) noexcept { -#if defined(FILAMENT_SUPPORTS_GGP) - VkStreamDescriptorSurfaceCreateInfoGGP surface_create_info = { - VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP}; - surface_create_info.streamDescriptor = kGgpPrimaryStreamDescriptor; - PFN_vkCreateStreamDescriptorSurfaceGGP fpCreateStreamDescriptorSurfaceGGP = - reinterpret_cast( - vkGetInstanceProcAddr(static_cast(instance), - "vkCreateStreamDescriptorSurfaceGGP")); - ASSERT_PRECONDITION(fpCreateStreamDescriptorSurfaceGGP != nullptr, - "Error getting VkInstance " - "function vkCreateStreamDescriptorSurfaceGGP"); - VkSurfaceKHR surface = nullptr; - VkResult res = fpCreateStreamDescriptorSurfaceGGP( - static_cast(instance), &surface_create_info, nullptr, - &surface); - ASSERT_PRECONDITION(res == VK_SUCCESS, "Error in vulkan: %d", res); - return surface; -#else - PANIC_PRECONDITION("Filament does not support GGP."); - return nullptr; -#endif -} - -} // namespace filament::backend diff --git a/filament/backend/src/vulkan/PlatformVkLinuxGGP.h b/filament/backend/src/vulkan/PlatformVkLinuxGGP.h deleted file mode 100644 index fad61750754..00000000000 --- a/filament/backend/src/vulkan/PlatformVkLinuxGGP.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_LINUX_GGP_H -#define TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_LINUX_GGP_H - -#include -#include - -#include - -namespace filament::backend { - -class PlatformVkLinuxGGP final : public VulkanPlatform { - public: - Driver* createDriver( - void* const sharedContext, - const Platform::DriverConfig& driverConfig) noexcept override; - - void* createVkSurfaceKHR(void* nativeWindow, void* instance, - uint64_t flags) noexcept override; - - int getOSVersion() const noexcept override { return 0; } -}; - -} // namespace filament::backend - -#endif // TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_LINUX_GGP_H diff --git a/filament/backend/src/vulkan/PlatformVkLinuxWayland.cpp b/filament/backend/src/vulkan/PlatformVkLinuxWayland.cpp deleted file mode 100644 index 858b0847e07..00000000000 --- a/filament/backend/src/vulkan/PlatformVkLinuxWayland.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "vulkan/PlatformVkLinuxWayland.h" - -#include "VulkanConstants.h" -#include "VulkanDriverFactory.h" - -#include - -#include - -#include - -using namespace bluevk; - -namespace filament::backend { - -Driver* PlatformVkLinuxWayland::createDriver(void* const sharedContext, const Platform::DriverConfig& driverConfig) noexcept { - ASSERT_PRECONDITION(sharedContext == nullptr, "Vulkan does not support shared contexts."); - const char* requiredInstanceExtensions[] = { - "VK_KHR_wayland_surface", - }; - return VulkanDriverFactory::create(this, requiredInstanceExtensions, - sizeof(requiredInstanceExtensions) / sizeof(requiredInstanceExtensions[0]), driverConfig); -} - -void* PlatformVkLinuxWayland::createVkSurfaceKHR(void* nativeWindow, void* instance, uint64_t flags) noexcept { - - typedef struct _wl { - struct wl_display *display; - struct wl_surface *surface; - } wl; - - VkSurfaceKHR surface = nullptr; - - wl* ptrval = reinterpret_cast(nativeWindow); - - VkWaylandSurfaceCreateInfoKHR createInfo = { - .sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR, - .pNext = NULL, - .flags = 0, - .display = ptrval->display, - .surface = ptrval->surface - }; - - VkResult result = vkCreateWaylandSurfaceKHR((VkInstance) instance, &createInfo, VKALLOC, &surface); - ASSERT_POSTCONDITION(result == VK_SUCCESS, "vkCreateWaylandSurfaceKHR error."); - - return surface; -} - -} // namespace filament::backend diff --git a/filament/backend/src/vulkan/PlatformVkLinuxWayland.h b/filament/backend/src/vulkan/PlatformVkLinuxWayland.h deleted file mode 100644 index 8d87617d777..00000000000 --- a/filament/backend/src/vulkan/PlatformVkLinuxWayland.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_LINUX_WAYLAND_H -#define TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_LINUX_WAYLAND_H - -#include - -#include -#include -#include - -namespace filament::backend { - -class PlatformVkLinuxWayland final : public VulkanPlatform { -public: - - Driver* createDriver(void* const sharedContext, const Platform::DriverConfig& driverConfig) noexcept override; - - void* createVkSurfaceKHR(void* nativeWindow, void* instance, uint64_t flags) noexcept override; - - int getOSVersion() const noexcept override { return 0; } -}; - -} // namespace filament::backend - -#endif // TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_LINUX_WAYLAND_H diff --git a/filament/backend/src/vulkan/PlatformVkLinuxX11.cpp b/filament/backend/src/vulkan/PlatformVkLinuxX11.cpp deleted file mode 100644 index 12be10fb1de..00000000000 --- a/filament/backend/src/vulkan/PlatformVkLinuxX11.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "vulkan/PlatformVkLinuxX11.h" - -#include "VulkanConstants.h" -#include "VulkanDriverFactory.h" - -#include - -#include - -#include - -using namespace bluevk; - -namespace filament::backend { - -static constexpr const char* LIBRARY_X11 = "libX11.so.6"; - -#ifdef FILAMENT_SUPPORTS_XCB -typedef xcb_connection_t* (*XCB_CONNECT)(const char *displayname, int *screenp); -#endif - -#ifdef FILAMENT_SUPPORTS_XLIB -typedef Display* (*X11_OPEN_DISPLAY)(const char*); -#endif - -struct X11Functions { -#ifdef FILAMENT_SUPPORTS_XCB - XCB_CONNECT xcbConnect; -#endif - -#ifdef FILAMENT_SUPPORTS_XLIB - X11_OPEN_DISPLAY openDisplay; -#endif - void* library = nullptr; -} g_x11; - -Driver* PlatformVkLinuxX11::createDriver(void* const sharedContext, const Platform::DriverConfig& driverConfig) noexcept { - ASSERT_PRECONDITION(sharedContext == nullptr, "Vulkan does not support shared contexts."); - const char* requiredInstanceExtensions[] = { -#ifdef FILAMENT_SUPPORTS_XCB - "VK_KHR_xcb_surface", -#endif -#ifdef FILAMENT_SUPPORTS_XLIB - "VK_KHR_xlib_surface", -#endif - }; - return VulkanDriverFactory::create(this, requiredInstanceExtensions, - sizeof(requiredInstanceExtensions) / sizeof(requiredInstanceExtensions[0]), driverConfig); -} - -void* PlatformVkLinuxX11::createVkSurfaceKHR(void* nativeWindow, void* instance, uint64_t flags) noexcept { - if (g_x11.library == nullptr) { - g_x11.library = dlopen(LIBRARY_X11, RTLD_LOCAL | RTLD_NOW); - ASSERT_PRECONDITION(g_x11.library, "Unable to open X11 library."); - -#ifdef FILAMENT_SUPPORTS_XCB - g_x11.xcbConnect = (XCB_CONNECT) dlsym(g_x11.library, "xcb_connect"); - int screen; - mConnection = g_x11.xcbConnect(nullptr, &screen); - ASSERT_POSTCONDITION(vkCreateXcbSurfaceKHR, "Unable to load vkCreateXcbSurfaceKHR function."); -#endif - -#ifdef FILAMENT_SUPPORTS_XLIB - g_x11.openDisplay = (X11_OPEN_DISPLAY) dlsym(g_x11.library, "XOpenDisplay"); - mDisplay = g_x11.openDisplay(NULL); - ASSERT_PRECONDITION(mDisplay, "Unable to open X11 display."); - ASSERT_POSTCONDITION(vkCreateXlibSurfaceKHR, "Unable to load vkCreateXlibSurfaceKHR function."); -#endif - - } - - VkSurfaceKHR surface = nullptr; - -#ifdef FILAMENT_SUPPORTS_XCB -#ifdef FILAMENT_SUPPORTS_XLIB -const bool windowIsXCB = flags & SWAP_CHAIN_CONFIG_ENABLE_XCB; -#else -const bool windowIsXCB = true; -#endif - - if (windowIsXCB) { - const uint64_t ptrval = reinterpret_cast(nativeWindow); - VkXcbSurfaceCreateInfoKHR createInfo = { - .sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR, - .connection = mConnection, - .window = (xcb_window_t) ptrval, - }; - vkCreateXcbSurfaceKHR((VkInstance) instance, &createInfo, VKALLOC, &surface); - return surface; - } -#endif - -#ifdef FILAMENT_SUPPORTS_XLIB - VkXlibSurfaceCreateInfoKHR createInfo = { - .sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR, - .dpy = mDisplay, - .window = (Window) nativeWindow, - }; - vkCreateXlibSurfaceKHR((VkInstance) instance, &createInfo, VKALLOC, &surface); -#endif - - return surface; -} - -} // namespace filament::backend diff --git a/filament/backend/src/vulkan/PlatformVkLinuxX11.h b/filament/backend/src/vulkan/PlatformVkLinuxX11.h deleted file mode 100644 index 7b65ebec220..00000000000 --- a/filament/backend/src/vulkan/PlatformVkLinuxX11.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_LINUX_X11_H -#define TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_LINUX_X11_H - -#include - -#include -#include - -#ifdef FILAMENT_SUPPORTS_XCB -#include -#endif - -#ifdef FILAMENT_SUPPORTS_XLIB -#include -#endif - -namespace filament::backend { - -class PlatformVkLinuxX11 final : public VulkanPlatform { -public: - - Driver* createDriver(void* const sharedContext, const Platform::DriverConfig& driverConfig) noexcept override; - - void* createVkSurfaceKHR(void* nativeWindow, void* instance, uint64_t flags) noexcept override; - - int getOSVersion() const noexcept override { return 0; } - -private: -#ifdef FILAMENT_SUPPORTS_XCB - xcb_connection_t* mConnection; -#endif -#ifdef FILAMENT_SUPPORTS_XLIB - Display* mDisplay; -#endif -}; - -} // namespace filament::backend - -#endif // TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_LINUX_X11_H diff --git a/filament/backend/src/vulkan/PlatformVkWindows.cpp b/filament/backend/src/vulkan/PlatformVkWindows.cpp deleted file mode 100644 index 07e5daf0637..00000000000 --- a/filament/backend/src/vulkan/PlatformVkWindows.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "vulkan/PlatformVkWindows.h" - -#include "VulkanConstants.h" -#include "VulkanDriverFactory.h" - -#include - -#include - -using namespace bluevk; - -namespace filament::backend { - -Driver* PlatformVkWindows::createDriver(void* const sharedContext, const Platform::DriverConfig& driverConfig) noexcept { - ASSERT_PRECONDITION(sharedContext == nullptr, "Vulkan does not support shared contexts."); - const char* requiredInstanceExtensions[] = { "VK_KHR_win32_surface" }; - return VulkanDriverFactory::create(this, requiredInstanceExtensions, 1, driverConfig); -} - -void* PlatformVkWindows::createVkSurfaceKHR(void* nativeWindow, void* instance, uint64_t flags) noexcept { - VkSurfaceKHR surface = nullptr; - - HWND window = (HWND) nativeWindow; - - VkWin32SurfaceCreateInfoKHR createInfo = {}; - createInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; - createInfo.hwnd = window; - createInfo.hinstance = GetModuleHandle(nullptr); - - VkResult result = vkCreateWin32SurfaceKHR((VkInstance) instance, &createInfo, nullptr, &surface); - ASSERT_POSTCONDITION(result == VK_SUCCESS, "vkCreateWin32SurfaceKHR error."); - - return surface; -} - -} // namespace filament::backend diff --git a/filament/backend/src/vulkan/PlatformVkWindows.h b/filament/backend/src/vulkan/PlatformVkWindows.h deleted file mode 100644 index d34663f6cb6..00000000000 --- a/filament/backend/src/vulkan/PlatformVkWindows.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_WINDOWS_H -#define TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_WINDOWS_H - -#include - -#include -#include - -namespace filament::backend { - -class PlatformVkWindows final : public VulkanPlatform { -public: - - Driver* createDriver(void* const sharedContext, const Platform::DriverConfig& driverConfig) noexcept override; - - void* createVkSurfaceKHR(void* nativeWindow, void* instance, uint64_t flags) noexcept override; - - int getOSVersion() const noexcept override { return 0; } - -private: - -}; - -} // namespace filament::backend - -#endif // TNT_FILAMENT_BACKEND_VULKAN_PLATFORM_VK_WINDOWS_H diff --git a/filament/backend/src/vulkan/VulkanAsyncHandles.cpp b/filament/backend/src/vulkan/VulkanAsyncHandles.cpp new file mode 100644 index 00000000000..82963b05c4d --- /dev/null +++ b/filament/backend/src/vulkan/VulkanAsyncHandles.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "VulkanAsyncHandles.h" + +namespace filament::backend { + +VulkanTimerQuery::VulkanTimerQuery(std::tuple indices) + : mStartingQueryIndex(std::get<0>(indices)), + mStoppingQueryIndex(std::get<1>(indices)) {} + +void VulkanTimerQuery::setFence(std::shared_ptr fence) noexcept { + std::unique_lock lock(mFenceMutex); + mFence = fence; +} + +bool VulkanTimerQuery::isCompleted() noexcept { + std::unique_lock lock(mFenceMutex); + // QueryValue is a synchronous call and might occur before beginTimerQuery has written anything + // into the command buffer, which is an error according to the validation layer that ships in + // the Android NDK. Even when AVAILABILITY_BIT is set, validation seems to require that the + // timestamp has at least been written into a processed command buffer. + + // This fence indicates that the corresponding buffer has been completed. + return mFence && mFence->getStatus() == VK_SUCCESS; +} + +VulkanTimerQuery::~VulkanTimerQuery() = default; + +} // namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanAsyncHandles.h b/filament/backend/src/vulkan/VulkanAsyncHandles.h new file mode 100644 index 00000000000..eb626871ae3 --- /dev/null +++ b/filament/backend/src/vulkan/VulkanAsyncHandles.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_VULKANASYNCHANDLES_H +#define TNT_FILAMENT_BACKEND_VULKANASYNCHANDLES_H + +#include + +#include "DriverBase.h" + +#include "vulkan/memory/Resource.h" + +#include +#include + +namespace filament::backend { + +// Wrapper to enable use of shared_ptr for implementing shared ownership of low-level Vulkan fences. +struct VulkanCmdFence { + VulkanCmdFence(VkResult initialStatus) { + // Internally we use the VK_INCOMPLETE status to mean "not yet submitted". When this fence + // gets submitted, its status changes to VK_NOT_READY. Finally, when the GPU actually + // finishes executing the command buffer, the status changes to VK_SUCCESS. + status.store(initialStatus); + } + + ~VulkanCmdFence() = default; + + void setStatus(VkResult value) { status.store(value); } + + VkResult getStatus() { return status.load(std::memory_order_acquire); } + +private: + std::atomic status; +}; + +struct VulkanFence : public HwFence, fvkmemory::ThreadSafeResource { + VulkanFence() {} + std::shared_ptr fence; +}; + +struct VulkanTimerQuery : public HwTimerQuery, fvkmemory::ThreadSafeResource { + explicit VulkanTimerQuery(std::tuple indices); + ~VulkanTimerQuery(); + + void setFence(std::shared_ptr fence) noexcept; + + bool isCompleted() noexcept; + + uint32_t getStartingQueryIndex() const { + return mStartingQueryIndex; + } + + uint32_t getStoppingQueryIndex() const { + return mStoppingQueryIndex; + } + +private: + uint32_t mStartingQueryIndex; + uint32_t mStoppingQueryIndex; + + std::shared_ptr mFence; + utils::Mutex mFenceMutex; +}; + +} // namespace filament::backend + +#endif // TNT_FILAMENT_BACKEND_VULKANHASYNCANDLES_H diff --git a/filament/backend/src/vulkan/VulkanBlitter.cpp b/filament/backend/src/vulkan/VulkanBlitter.cpp index a273445c642..bcb786e63ae 100644 --- a/filament/backend/src/vulkan/VulkanBlitter.cpp +++ b/filament/backend/src/vulkan/VulkanBlitter.cpp @@ -15,408 +15,175 @@ */ #include "VulkanBlitter.h" +#include "VulkanCommands.h" #include "VulkanContext.h" +#include "VulkanFboCache.h" #include "VulkanHandles.h" +#include "VulkanSamplerCache.h" +#include "VulkanTexture.h" #include #include #include -#include "generated/vkshaders/vkshaders.h" - -#define FILAMENT_VULKAN_CHECK_BLIT_FORMAT 0 - using namespace bluevk; using namespace utils; namespace filament::backend { -struct BlitterUniforms { - int sampleCount; - float inverseSampleCount; -}; - -void VulkanBlitter::blitColor(BlitArgs args) { - const VulkanAttachment src = args.srcTarget->getColor(args.targetIndex); - const VulkanAttachment dst = args.dstTarget->getColor(0); - const VkImageAspectFlags aspect = VK_IMAGE_ASPECT_COLOR_BIT; - -#if FILAMENT_VULKAN_CHECK_BLIT_FORMAT - const VkPhysicalDevice gpu = mContext.physicalDevice; - VkFormatProperties info; - vkGetPhysicalDeviceFormatProperties(gpu, src.getFormat(), &info); - if (!ASSERT_POSTCONDITION_NON_FATAL(info.optimalTilingFeatures & VK_FORMAT_FEATURE_BLIT_SRC_BIT, - "Source format is not blittable")) { - return; - } - vkGetPhysicalDeviceFormatProperties(gpu, dst.getFormat(), &info); - if (!ASSERT_POSTCONDITION_NON_FATAL(info.optimalTilingFeatures & VK_FORMAT_FEATURE_BLIT_DST_BIT, - "Destination format is not blittable")) { - return; - } -#endif - - blitFast(aspect, args.filter, args.srcTarget->getExtent(), src, dst, - args.srcRectPair, args.dstRectPair); -} +namespace { -void VulkanBlitter::blitDepth(BlitArgs args) { - const VulkanAttachment src = args.srcTarget->getDepth(); - const VulkanAttachment dst = args.dstTarget->getDepth(); - const VkImageAspectFlags aspect = VK_IMAGE_ASPECT_DEPTH_BIT; - -#if FILAMENT_VULKAN_CHECK_BLIT_FORMAT - const VkPhysicalDevice gpu = mContext.physicalDevice; - VkFormatProperties info; - vkGetPhysicalDeviceFormatProperties(gpu, src.getFormat(), &info); - if (!ASSERT_POSTCONDITION_NON_FATAL(info.optimalTilingFeatures & VK_FORMAT_FEATURE_BLIT_SRC_BIT, - "Depth format is not blittable")) { - return; - } - vkGetPhysicalDeviceFormatProperties(gpu, dst.getFormat(), &info); - if (!ASSERT_POSTCONDITION_NON_FATAL(info.optimalTilingFeatures & VK_FORMAT_FEATURE_BLIT_DST_BIT, - "Depth format is not blittable")) { - return; +inline void blitFast(VulkanCommandBuffer* commands, VkImageAspectFlags aspect, VkFilter filter, + VulkanAttachment src, VulkanAttachment dst, + const VkOffset3D srcRect[2], const VkOffset3D dstRect[2]) { + VkCommandBuffer const cmdbuf = commands->buffer(); + if constexpr (FVK_ENABLED(FVK_DEBUG_BLITTER)) { + FVK_LOGD << "Fast blit from=" << src.texture->getVkImage() << ",level=" << (int) src.level + << " layout=" << src.getLayout() + << " to=" << dst.texture->getVkImage() << ",level=" << (int) dst.level + << " layout=" << dst.getLayout() << utils::io::endl; } -#endif - assert_invariant(src.texture && dst.texture); + VkImageSubresourceRange const srcRange = src.getSubresourceRange(); + VkImageSubresourceRange const dstRange = dst.getSubresourceRange(); - if (src.texture->samples > 1 && dst.texture->samples == 1) { - blitSlowDepth(aspect, args.filter, args.srcTarget->getExtent(), src, dst, args.srcRectPair, - args.dstRectPair); - return; - } + VulkanLayout oldSrcLayout = src.getLayout(); + VulkanLayout oldDstLayout = dst.getLayout(); - blitFast(aspect, args.filter, args.srcTarget->getExtent(), src, dst, args.srcRectPair, - args.dstRectPair); -} + src.texture->transitionLayout(commands, srcRange, VulkanLayout::TRANSFER_SRC); + dst.texture->transitionLayout(commands, dstRange, VulkanLayout::TRANSFER_DST); -void VulkanBlitter::blitFast(VkImageAspectFlags aspect, VkFilter filter, - const VkExtent2D srcExtent, VulkanAttachment src, VulkanAttachment dst, - const VkOffset3D srcRect[2], const VkOffset3D dstRect[2]) { const VkImageBlit blitRegions[1] = {{ - .srcSubresource = { aspect, src.level, src.layer, 1 }, - .srcOffsets = { srcRect[0], srcRect[1] }, - .dstSubresource = { aspect, dst.level, dst.layer, 1 }, - .dstOffsets = { dstRect[0], dstRect[1] } - }}; - - const VkImageResolve resolveRegions[1] = {{ - .srcSubresource = { aspect, src.level, src.layer, 1 }, - .srcOffset = srcRect[0], - .dstSubresource = { aspect, dst.level, dst.layer, 1 }, - .dstOffset = dstRect[0], - .extent = { srcExtent.width, srcExtent.height, 1 } + .srcSubresource = { aspect, src.level, src.layer, 1 }, + .srcOffsets = { srcRect[0], srcRect[1] }, + .dstSubresource = { aspect, dst.level, dst.layer, 1 }, + .dstOffsets = { dstRect[0], dstRect[1] }, }}; + vkCmdBlitImage(cmdbuf, + src.getImage(), imgutil::getVkLayout(VulkanLayout::TRANSFER_SRC), + dst.getImage(), imgutil::getVkLayout(VulkanLayout::TRANSFER_DST), + 1, blitRegions, filter); - const VkImageSubresourceRange srcRange = { - .aspectMask = aspect, - .baseMipLevel = src.level, - .levelCount = 1, - .baseArrayLayer = src.layer, - .layerCount = 1, - }; - - const VkImageSubresourceRange dstRange = { - .aspectMask = aspect, - .baseMipLevel = dst.level, - .levelCount = 1, - .baseArrayLayer = dst.layer, - .layerCount = 1, - }; - - const VkCommandBuffer cmdbuffer = mContext.commands->get().cmdbuffer; - - const VkImageLayout srcLayout = getDefaultImageLayout(src.texture->usage); - - transitionImageLayout(cmdbuffer, { - src.getImage(), - srcLayout, - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - srcRange, - VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, - VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_READ_BIT - }); - - transitionImageLayout(cmdbuffer, { - dst.getImage(), - VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - dstRange, - VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, - VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, - }); - - if (src.texture->samples > 1 && dst.texture->samples == 1) { - assert_invariant(aspect != VK_IMAGE_ASPECT_DEPTH_BIT && "Resolve with depth is not yet supported."); - vkCmdResolveImage(cmdbuffer, src.getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dst.getImage(), - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, resolveRegions); - } else { - vkCmdBlitImage(cmdbuffer, src.getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dst.getImage(), - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, blitRegions, filter); + if (oldSrcLayout == VulkanLayout::UNDEFINED) { + oldSrcLayout = src.texture->getDefaultLayout(); } - - transitionImageLayout(cmdbuffer, blitterTransitionHelper({ - .image = src.getImage(), - .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - .newLayout = srcLayout, - .subresources = srcRange - })); - - transitionImageLayout(cmdbuffer, blitterTransitionHelper({ - .image = dst.getImage(), - .oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - .newLayout = getDefaultImageLayout(dst.texture->usage), - .subresources = dstRange, - })); -} - -void VulkanBlitter::shutdown() noexcept { - if (mContext.device) { - delete mDepthResolveProgram; - mDepthResolveProgram = nullptr; - - if (mTriangleBuffer) { - mTriangleBuffer->terminate(mContext); - delete mTriangleBuffer; - mTriangleBuffer = nullptr; - } - - if (mParamsBuffer) { - mParamsBuffer->terminate(mContext); - delete mParamsBuffer; - mParamsBuffer = nullptr; - } + if (oldDstLayout == VulkanLayout::UNDEFINED) { + oldDstLayout = dst.texture->getDefaultLayout(); } + src.texture->transitionLayout(commands, srcRange, oldSrcLayout); + dst.texture->transitionLayout(commands, dstRange, oldDstLayout); } -// If we created these shader modules in the constructor, the device might not be ready yet. -// It is easier to do lazy initialization, which can also improve load time. -void VulkanBlitter::lazyInit() noexcept { - if (mDepthResolveProgram != nullptr) { - return; +inline void resolveFast(VulkanCommandBuffer* commands, VkImageAspectFlags aspect, + VulkanAttachment src, VulkanAttachment dst) { + VkCommandBuffer const cmdbuffer = commands->buffer(); + if constexpr (FVK_ENABLED(FVK_DEBUG_BLITTER)) { + FVK_LOGD << "Fast blit from=" << src.texture->getVkImage() << ",level=" << (int) src.level + << " layout=" << src.getLayout() + << " to=" << dst.texture->getVkImage() << ",level=" << (int) dst.level + << " layout=" << dst.getLayout() << utils::io::endl; } - assert_invariant(mContext.device); - - auto decode = [device = mContext.device](const uint8_t* compressed, int compressedSize) { - const size_t spirvSize = smolv::GetDecodedBufferSize(compressed, compressedSize); - FixedCapacityVector spirv(spirvSize); - smolv::Decode(compressed, compressedSize, spirv.data(), spirvSize); - - VkShaderModuleCreateInfo moduleInfo = {}; - moduleInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - moduleInfo.codeSize = spirvSize; - moduleInfo.pCode = (uint32_t*) spirv.data(); - VkShaderModule result = VK_NULL_HANDLE; - vkCreateShaderModule(device, &moduleInfo, VKALLOC, &result); - assert_invariant(result); + VkImageSubresourceRange const srcRange = src.getSubresourceRange(); + VkImageSubresourceRange const dstRange = dst.getSubresourceRange(); - return result; - }; + VulkanLayout oldSrcLayout = src.getLayout(); + VulkanLayout oldDstLayout = dst.getLayout(); - VkShaderModule vertexShader = decode(VKSHADERS_BLITDEPTHVS_DATA, VKSHADERS_BLITDEPTHVS_SIZE); - VkShaderModule fragmentShader = decode(VKSHADERS_BLITDEPTHFS_DATA, VKSHADERS_BLITDEPTHFS_SIZE); - mDepthResolveProgram = new VulkanProgram(mContext, vertexShader, fragmentShader); + src.texture->transitionLayout(commands, srcRange, VulkanLayout::TRANSFER_SRC); + dst.texture->transitionLayout(commands, dstRange, VulkanLayout::TRANSFER_DST); - // Allocate one anonymous sampler at slot 0. - mDepthResolveProgram->samplerGroupInfo[0].samplers.reserve(1); - mDepthResolveProgram->samplerGroupInfo[0].samplers.resize(1); + assert_invariant( + aspect != VK_IMAGE_ASPECT_DEPTH_BIT && "Resolve with depth is not yet supported."); + const VkImageResolve resolveRegions[1] = {{ + .srcSubresource = { aspect, src.level, src.layer, 1 }, + .srcOffset = { 0, 0 }, + .dstSubresource = { aspect, dst.level, dst.layer, 1 }, + .dstOffset = { 0, 0 }, + .extent = { src.getExtent2D().width, src.getExtent2D().height, 1 }, + }}; + vkCmdResolveImage(cmdbuffer, + src.getImage(), imgutil::getVkLayout(VulkanLayout::TRANSFER_SRC), + dst.getImage(), imgutil::getVkLayout(VulkanLayout::TRANSFER_DST), + 1, resolveRegions); - if constexpr (FILAMENT_VULKAN_VERBOSE) { - utils::slog.d << "Created Shader Module for VulkanBlitter " - << "shaders = (" << vertexShader << ", " << fragmentShader << ")" - << utils::io::endl; + if (oldSrcLayout == VulkanLayout::UNDEFINED) { + oldSrcLayout = src.texture->getDefaultLayout(); } - - static const float kTriangleVertices[] = { - -1.0f, -1.0f, - +1.0f, -1.0f, - -1.0f, +1.0f, - +1.0f, +1.0f, - }; - - mTriangleBuffer = new VulkanBuffer(mContext, mStagePool, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, - sizeof(kTriangleVertices)); - - mTriangleBuffer->loadFromCpu(mContext, mStagePool, - kTriangleVertices, 0, sizeof(kTriangleVertices)); - - mParamsBuffer = new VulkanBuffer(mContext, mStagePool, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - sizeof(BlitterUniforms)); + if (oldDstLayout == VulkanLayout::UNDEFINED) { + oldDstLayout = dst.texture->getDefaultLayout(); + } + src.texture->transitionLayout(commands, srcRange, oldSrcLayout); + dst.texture->transitionLayout(commands, dstRange, oldDstLayout); } -// At a high level, the procedure for resolving depth looks like this: -// 1. Load uniforms -// 2. Begin render pass -// 3. Draw a big triangle -// 4. End render pass. -void VulkanBlitter::blitSlowDepth(VkImageAspectFlags aspect, VkFilter filter, - const VkExtent2D srcExtent, VulkanAttachment src, VulkanAttachment dst, - const VkOffset3D srcRect[2], const VkOffset3D dstRect[2]) { - lazyInit(); - - const BlitterUniforms uniforms = { - .sampleCount = src.texture->samples, - .inverseSampleCount = 1.0f / float(src.texture->samples), - }; - mParamsBuffer->loadFromCpu(mContext, mStagePool, &uniforms, 0, sizeof(uniforms)); - - // BEGIN RENDER PASS - // ----------------- - - const VulkanDepthLayout layout = - fromVkImageLayout(getDefaultImageLayout(TextureUsage::DEPTH_ATTACHMENT)); - - const VulkanFboCache::RenderPassKey rpkey = { - .initialColorLayoutMask = 0, - .initialDepthLayout = VulkanDepthLayout::UNDEFINED, - .renderPassDepthLayout = layout, - .finalDepthLayout = layout, - .depthFormat = dst.getFormat(), - .clear = {}, - .discardStart = TargetBufferFlags::DEPTH, - .samples = 1, - }; - - const VkRenderPass renderPass = mFramebufferCache.getRenderPass(rpkey); - mPipelineCache.bindRenderPass(renderPass, 0); - - const VulkanFboCache::FboKey fbkey { - .renderPass = renderPass, - .width = (uint16_t) (dst.texture->width >> dst.level), - .height = (uint16_t) (dst.texture->height >> dst.level), - .layers = 1, - .samples = rpkey.samples, - .color = {}, - .resolve = {}, - .depth = dst.getImageView(VK_IMAGE_ASPECT_DEPTH_BIT), - }; - const VkFramebuffer vkfb = mFramebufferCache.getFramebuffer(fbkey); - - VkRenderPassBeginInfo renderPassInfo { - .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, - .renderPass = renderPass, - .framebuffer = vkfb, - }; - renderPassInfo.renderArea.offset.x = dstRect[0].x; - renderPassInfo.renderArea.offset.y = dstRect[0].y; - renderPassInfo.renderArea.extent.width = dstRect[1].x - dstRect[0].x; - renderPassInfo.renderArea.extent.height = dstRect[1].y - dstRect[0].y; - - // Even though we don't clear anything, we have to provide a clear value. - VkClearValue clearValues[1] = {}; - renderPassInfo.clearValueCount = 1; - renderPassInfo.pClearValues = clearValues; - - const VkCommandBuffer cmdbuffer = mContext.commands->get().cmdbuffer; - vkCmdBeginRenderPass(cmdbuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE); - - VkViewport viewport = mContext.viewport = { - .x = (float) dstRect[0].x, - .y = (float) dstRect[0].y, - .width = (float) renderPassInfo.renderArea.extent.width, - .height = (float) renderPassInfo.renderArea.extent.height, - .minDepth = 0.0f, - .maxDepth = 1.0f - }; - - vkCmdSetViewport(cmdbuffer, 0, 1, &viewport); +struct BlitterUniforms { + int sampleCount; + float inverseSampleCount; +}; - // DRAW THE TRIANGLE - // ----------------- +}// anonymous namespace - mPipelineCache.bindProgram(*mDepthResolveProgram); - mPipelineCache.bindPrimitiveTopology(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP); +VulkanBlitter::VulkanBlitter(VkPhysicalDevice physicalDevice, VulkanCommands* commands) noexcept + : mPhysicalDevice(physicalDevice), mCommands(commands) {} - auto& vkraster = mContext.rasterState; - vkraster.depthWriteEnable = true; - vkraster.depthCompareOp = SamplerCompareFunc::A; - vkraster.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT, - vkraster.alphaToCoverageEnable = false, - vkraster.blendEnable = VK_FALSE, - vkraster.srcColorBlendFactor = VK_BLEND_FACTOR_ONE, - vkraster.dstColorBlendFactor = VK_BLEND_FACTOR_ZERO, - vkraster.colorBlendOp = BlendEquation::ADD, - vkraster.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE, - vkraster.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO, - vkraster.alphaBlendOp = BlendEquation::ADD, - vkraster.colorWriteMask = (VkColorComponentFlags) 0, - vkraster.cullMode = VK_CULL_MODE_NONE; - vkraster.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; - vkraster.depthBiasEnable = VK_FALSE; - vkraster.colorTargetCount = 0; - mPipelineCache.bindRasterState(vkraster); +void VulkanBlitter::resolve(VulkanAttachment dst, VulkanAttachment src) { - VulkanPipelineCache::VertexArray varray = {}; - VkBuffer buffers[1] = {}; - VkDeviceSize offsets[1] = {}; - buffers[0] = mTriangleBuffer->getGpuBuffer(); - varray.attributes[0] = { .location = 0, .binding = 0, .format = VK_FORMAT_R32G32_SFLOAT }; - varray.buffers[0] = { .binding = 0, .stride = sizeof(float) * 2 }; - mPipelineCache.bindVertexArray(varray); + // src and dst should have the same aspect here + VkImageAspectFlags const aspect = src.texture->getImageAspect(); - // Select nearest filtering and clamp_to_edge. - VkSampler vksampler = mSamplerCache.getSampler({}); + assert_invariant(!(aspect & VK_IMAGE_ASPECT_DEPTH_BIT)); - VkDescriptorImageInfo samplers[VulkanPipelineCache::SAMPLER_BINDING_COUNT]; - for (auto& sampler : samplers) { - sampler = { - .sampler = vksampler, - .imageView = mContext.emptyTexture->getPrimaryImageView(), - .imageLayout = VK_IMAGE_LAYOUT_GENERAL - }; +#if FVK_ENABLED(FVK_DEBUG_BLIT_FORMAT) + VkPhysicalDevice const gpu = mPhysicalDevice; + VkFormatProperties info; + vkGetPhysicalDeviceFormatProperties(gpu, src.getFormat(), &info); + if (!ASSERT_POSTCONDITION_NON_FATAL(info.optimalTilingFeatures & VK_FORMAT_FEATURE_BLIT_SRC_BIT, + "Depth src format is not blittable %d", src.getFormat())) { + return; } - - samplers[0] = { - .sampler = vksampler, - .imageView = src.getImageView(VK_IMAGE_ASPECT_DEPTH_BIT), - .imageLayout = getDefaultImageLayout(TextureUsage::DEPTH_ATTACHMENT) - }; - - mPipelineCache.bindSamplers(samplers, - VulkanPipelineCache::getUsageFlags(0, ShaderStageFlags::FRAGMENT)); - - auto previousUbo = mPipelineCache.getUniformBufferBinding(0); - mPipelineCache.bindUniformBuffer(0, mParamsBuffer->getGpuBuffer()); - - if (!mPipelineCache.bindDescriptors(cmdbuffer)) { - assert_invariant(false); + vkGetPhysicalDeviceFormatProperties(gpu, dst.getFormat(), &info); + if (!ASSERT_POSTCONDITION_NON_FATAL(info.optimalTilingFeatures & VK_FORMAT_FEATURE_BLIT_DST_BIT, + "Depth dst format is not blittable %d", dst.getFormat())) { + return; } +#endif - const VkRect2D scissor = { - .offset = renderPassInfo.renderArea.offset, - .extent = renderPassInfo.renderArea.extent, - }; - - mPipelineCache.bindScissor(cmdbuffer, scissor); + VulkanCommandBuffer& commands = dst.texture->getIsProtected() ? + mCommands->getProtected() : mCommands->get(); + commands.acquire(src.texture); + commands.acquire(dst.texture); + resolveFast(&commands, aspect, src, dst); +} - if (!mPipelineCache.bindPipeline(cmdbuffer)) { - assert_invariant(false); +void VulkanBlitter::blit(VkFilter filter, + VulkanAttachment dst, const VkOffset3D* dstRectPair, + VulkanAttachment src, const VkOffset3D* srcRectPair) { +#if FVK_ENABLED(FVK_DEBUG_BLIT_FORMAT) + VkPhysicalDevice const gpu = mPhysicalDevice; + VkFormatProperties info; + vkGetPhysicalDeviceFormatProperties(gpu, src.getFormat(), &info); + if (!ASSERT_POSTCONDITION_NON_FATAL(info.optimalTilingFeatures & VK_FORMAT_FEATURE_BLIT_SRC_BIT, + "Depth src format is not blittable %d", src.getFormat())) { + return; } + vkGetPhysicalDeviceFormatProperties(gpu, dst.getFormat(), &info); + if (!ASSERT_POSTCONDITION_NON_FATAL(info.optimalTilingFeatures & VK_FORMAT_FEATURE_BLIT_DST_BIT, + "Depth dst format is not blittable %d", dst.getFormat())) { + return; + } +#endif + // src and dst should have the same aspect here + VkImageAspectFlags const aspect = src.texture->getImageAspect(); + VulkanCommandBuffer& commands = dst.texture->getIsProtected() ? + mCommands->getProtected() : mCommands->get(); + commands.acquire(src.texture); + commands.acquire(dst.texture); + blitFast(&commands, aspect, filter, src, dst, srcRectPair, dstRectPair); +} - vkCmdBindVertexBuffers(cmdbuffer, 0, 1, buffers, offsets); - vkCmdDraw(cmdbuffer, 4, 1, 0, 0); - - // END RENDER PASS - // --------------- - - vkCmdEndRenderPass(cmdbuffer); - - VkMemoryBarrier barrier { - .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, - .srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, - .dstAccessMask = VK_ACCESS_SHADER_READ_BIT, - }; - VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; - vkCmdPipelineBarrier(cmdbuffer, srcStageMask, - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT | // <== For Mali - VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - 0, 1, &barrier, 0, nullptr, 0, nullptr); - - mPipelineCache.bindUniformBuffer(0, previousUbo.buffer, previousUbo.offset, previousUbo.size); +void VulkanBlitter::terminate() noexcept { } } // namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanBlitter.h b/filament/backend/src/vulkan/VulkanBlitter.h index f95b53bb36e..41f2516f1dd 100644 --- a/filament/backend/src/vulkan/VulkanBlitter.h +++ b/filament/backend/src/vulkan/VulkanBlitter.h @@ -17,8 +17,11 @@ #ifndef TNT_FILAMENT_BACKEND_VULKANBLITTER_H #define TNT_FILAMENT_BACKEND_VULKANBLITTER_H +#include "VulkanCommands.h" #include "VulkanContext.h" +#include + namespace filament::backend { class VulkanBuffer; @@ -30,46 +33,19 @@ struct VulkanProgram; class VulkanBlitter { public: - VulkanBlitter(VulkanContext& context, VulkanStagePool& stagePool, - VulkanPipelineCache& pipelineCache, VulkanFboCache& fboCache, - VulkanSamplerCache& samplerCache) : - mContext(context), mStagePool(stagePool), mPipelineCache(pipelineCache), - mFramebufferCache(fboCache), mSamplerCache(samplerCache) {} + VulkanBlitter(VkPhysicalDevice physicalDevice, VulkanCommands* commands) noexcept; - struct BlitArgs { - const VulkanRenderTarget* dstTarget; - const VkOffset3D* dstRectPair; - const VulkanRenderTarget* srcTarget; - const VkOffset3D* srcRectPair; - VkFilter filter = VK_FILTER_NEAREST; - int targetIndex = 0; - }; + void blit(VkFilter filter, + VulkanAttachment dst, const VkOffset3D* dstRectPair, + VulkanAttachment src, const VkOffset3D* srcRectPair); - void blitColor(BlitArgs args); - void blitDepth(BlitArgs args); + void resolve(VulkanAttachment dst, VulkanAttachment src); - void shutdown() noexcept; + void terminate() noexcept; private: - void lazyInit() noexcept; - - void blitFast(VkImageAspectFlags aspect, VkFilter filter, const VkExtent2D srcExtent, - VulkanAttachment src, VulkanAttachment dst, const VkOffset3D srcRect[2], - const VkOffset3D dstRect[2]); - - void blitSlowDepth(VkImageAspectFlags aspect, VkFilter filter, - const VkExtent2D srcExtent, VulkanAttachment src, VulkanAttachment dst, - const VkOffset3D srcRect[2], const VkOffset3D dstRect[2]); - - VulkanBuffer* mTriangleBuffer = nullptr; - VulkanBuffer* mParamsBuffer = nullptr; - VulkanProgram* mDepthResolveProgram = nullptr; - - VulkanContext& mContext; - VulkanStagePool& mStagePool; - VulkanPipelineCache& mPipelineCache; - VulkanFboCache& mFramebufferCache; - VulkanSamplerCache& mSamplerCache; + UTILS_UNUSED VkPhysicalDevice mPhysicalDevice; + VulkanCommands* mCommands; }; } // namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanBuffer.cpp b/filament/backend/src/vulkan/VulkanBuffer.cpp index 835af73b98a..af42625a890 100644 --- a/filament/backend/src/vulkan/VulkanBuffer.cpp +++ b/filament/backend/src/vulkan/VulkanBuffer.cpp @@ -23,9 +23,13 @@ using namespace bluevk; namespace filament::backend { -VulkanBuffer::VulkanBuffer(VulkanContext& context, VulkanStagePool& stagePool, - VkBufferUsageFlags usage, uint32_t numBytes) : mUsage(usage) { - +VulkanBuffer::VulkanBuffer(VmaAllocator allocator, VulkanStagePool& stagePool, + VkBufferUsageFlags usage, uint32_t numBytes) + : mAllocator(allocator), + mStagePool(stagePool), + mUsage(usage), + mUpdatedOffset(0), + mUpdatedBytes(0) { // for now make sure that only 1 bit is set in usage // (because loadFromCpu() assumes that somewhat) assert_invariant(usage && !(usage & (usage - 1))); @@ -38,83 +42,95 @@ VulkanBuffer::VulkanBuffer(VulkanContext& context, VulkanStagePool& stagePool, }; VmaAllocationCreateInfo allocInfo { .usage = VMA_MEMORY_USAGE_GPU_ONLY }; - vmaCreateBuffer(context.allocator, &bufferInfo, &allocInfo, &mGpuBuffer, &mGpuMemory, nullptr); + vmaCreateBuffer(mAllocator, &bufferInfo, &allocInfo, &mGpuBuffer, &mGpuMemory, nullptr); } VulkanBuffer::~VulkanBuffer() { - assert_invariant(mGpuMemory == VK_NULL_HANDLE); - assert_invariant(mGpuBuffer == VK_NULL_HANDLE); -} - -void VulkanBuffer::terminate(VulkanContext& context) { - vmaDestroyBuffer(context.allocator, mGpuBuffer, mGpuMemory); - mGpuMemory = VK_NULL_HANDLE; - mGpuBuffer = VK_NULL_HANDLE; + vmaDestroyBuffer(mAllocator, mGpuBuffer, mGpuMemory); } -void VulkanBuffer::loadFromCpu(VulkanContext& context, VulkanStagePool& stagePool, - const void* cpuData, uint32_t byteOffset, uint32_t numBytes) const { - assert_invariant(byteOffset == 0); - VulkanStage const* stage = stagePool.acquireStage(numBytes); +void VulkanBuffer::loadFromCpu(VkCommandBuffer cmdbuf, const void* cpuData, uint32_t byteOffset, + uint32_t numBytes) { + VulkanStage const* stage = mStagePool.acquireStage(numBytes); void* mapped; - vmaMapMemory(context.allocator, stage->memory, &mapped); + vmaMapMemory(mAllocator, stage->memory, &mapped); memcpy(mapped, cpuData, numBytes); - vmaUnmapMemory(context.allocator, stage->memory); - vmaFlushAllocation(context.allocator, stage->memory, byteOffset, numBytes); - - const VkCommandBuffer cmdbuffer = context.commands->get().cmdbuffer; - - VkBufferCopy region{ .size = numBytes }; - vkCmdCopyBuffer(cmdbuffer, stage->buffer, mGpuBuffer, 1, ®ion); - - // Firstly, ensure that the copy finishes before the next draw call. - // Secondly, in case the user decides to upload another chunk (without ever using the first one) - // we need to ensure that this upload completes first. - - if (mUsage & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) { + vmaUnmapMemory(mAllocator, stage->memory); + vmaFlushAllocation(mAllocator, stage->memory, byteOffset, numBytes); + + // If there was a previous update, then we need to make sure the following write is properly + // synced with the previous read. + if (mUpdatedBytes > 0) { + VkAccessFlags srcAccess = 0; + VkPipelineStageFlags srcStage = 0; + if (mUsage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) { + srcAccess = VK_ACCESS_SHADER_READ_BIT; + srcStage = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + } else if (mUsage & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) { + srcAccess = VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT; + srcStage = VK_PIPELINE_STAGE_VERTEX_INPUT_BIT; + } else if (mUsage & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) { + srcAccess = VK_ACCESS_INDEX_READ_BIT; + srcStage = VK_PIPELINE_STAGE_VERTEX_INPUT_BIT; + } VkBufferMemoryBarrier barrier{ - .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, - .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, - .dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | - VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT | VK_ACCESS_INDEX_READ_BIT, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .buffer = mGpuBuffer, - .size = VK_WHOLE_SIZE + .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, + .srcAccessMask = srcAccess, + .dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .buffer = mGpuBuffer, + .offset = mUpdatedOffset, + .size = mUpdatedBytes, }; - - vkCmdPipelineBarrier(cmdbuffer, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, - 0, 0, nullptr, 1, &barrier, 0, nullptr); - + vkCmdPipelineBarrier(cmdbuf, srcStage, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 1, + &barrier, 0, nullptr); } - if (mUsage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) { - // NOTE: ideally dstStageMask would include VERTEX_SHADER_BIT | FRAGMENT_SHADER_BIT, but this - // seems to be insufficient on Mali devices. To work around this we are using a more - // aggressive ALL_GRAPHICS_BIT barrier. + VkBufferCopy region { + .srcOffset = 0, + .dstOffset = byteOffset, + .size = numBytes, + }; + vkCmdCopyBuffer(cmdbuf, stage->buffer, mGpuBuffer, 1, ®ion); - VkBufferMemoryBarrier barrier{ - .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, - .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, - .dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_UNIFORM_READ_BIT, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .buffer = mGpuBuffer, - .size = VK_WHOLE_SIZE - }; + mUpdatedOffset = byteOffset; + mUpdatedBytes = numBytes; - vkCmdPipelineBarrier(cmdbuffer, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, - 0, 0, nullptr, 1, &barrier, 0, nullptr); - } + // Firstly, ensure that the copy finishes before the next draw call. + // Secondly, in case the user decides to upload another chunk (without ever using the first one) + // we need to ensure that this upload completes first (hence + // dstStageMask=VK_PIPELINE_STAGE_TRANSFER_BIT). + VkAccessFlags dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT; - if (mUsage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) { + if (mUsage & VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) { + dstAccessMask |= VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT; + dstStageMask |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT; + } else if (mUsage & VK_BUFFER_USAGE_INDEX_BUFFER_BIT) { + dstAccessMask |= VK_ACCESS_INDEX_READ_BIT; + dstStageMask |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT; + } else if (mUsage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) { + dstAccessMask |= VK_ACCESS_UNIFORM_READ_BIT; + dstStageMask |= + (VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); + } else if (mUsage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) { // TODO: implement me } + + VkBufferMemoryBarrier barrier{ + .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, + .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, + .dstAccessMask = dstAccessMask, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .buffer = mGpuBuffer, + .size = VK_WHOLE_SIZE, + }; + + vkCmdPipelineBarrier(cmdbuf, VK_PIPELINE_STAGE_TRANSFER_BIT, dstStageMask, 0, 0, nullptr, 1, + &barrier, 0, nullptr); } } // namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanBuffer.h b/filament/backend/src/vulkan/VulkanBuffer.h index 1c3e71aa96b..65edd82e5c4 100644 --- a/filament/backend/src/vulkan/VulkanBuffer.h +++ b/filament/backend/src/vulkan/VulkanBuffer.h @@ -19,23 +19,31 @@ #include "VulkanContext.h" #include "VulkanStagePool.h" +#include "VulkanMemory.h" namespace filament::backend { // Encapsulates a Vulkan buffer, its attached DeviceMemory and a staging area. class VulkanBuffer { public: - VulkanBuffer(VulkanContext& context, VulkanStagePool& stagePool, VkBufferUsageFlags usage, + VulkanBuffer(VmaAllocator allocator, VulkanStagePool& stagePool, VkBufferUsageFlags usage, uint32_t numBytes); ~VulkanBuffer(); - void terminate(VulkanContext& context); - void loadFromCpu(VulkanContext& context, VulkanStagePool& stagePool, - const void* cpuData, uint32_t byteOffset, uint32_t numBytes) const; - VkBuffer getGpuBuffer() const { return mGpuBuffer; } + void loadFromCpu(VkCommandBuffer cmdbuf, const void* cpuData, uint32_t byteOffset, + uint32_t numBytes); + VkBuffer getGpuBuffer() const { + return mGpuBuffer; + } + private: + VmaAllocator mAllocator; + VulkanStagePool& mStagePool; + VmaAllocation mGpuMemory = VK_NULL_HANDLE; VkBuffer mGpuBuffer = VK_NULL_HANDLE; VkBufferUsageFlags mUsage = {}; + uint32_t mUpdatedOffset = 0; + uint32_t mUpdatedBytes = 0; }; } // namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanCommands.cpp b/filament/backend/src/vulkan/VulkanCommands.cpp index bb10985a8e0..e531f3433f6 100644 --- a/filament/backend/src/vulkan/VulkanCommands.cpp +++ b/filament/backend/src/vulkan/VulkanCommands.cpp @@ -22,6 +22,7 @@ #include "VulkanCommands.h" #include "VulkanConstants.h" +#include "VulkanContext.h" #include #include @@ -32,244 +33,495 @@ using namespace utils; namespace filament::backend { -VulkanCmdFence::VulkanCmdFence(VkDevice device, bool signaled) : device(device) { - VkFenceCreateInfo fenceCreateInfo { .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO }; - if (signaled) { - fenceCreateInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT; +namespace { + +#if FVK_ENABLED(FVK_DEBUG_GROUP_MARKERS) +using Timestamp = VulkanGroupMarkers::Timestamp; +#endif + +VkCommandBuffer createCommandBuffer(VkDevice device, VkCommandPool pool) { + VkCommandBuffer cmdbuffer; + // Create the low-level command buffer. + VkCommandBufferAllocateInfo const allocateInfo{ + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, + .commandPool = pool, + .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, + .commandBufferCount = 1, + }; + // The buffer allocated here will be implicitly reset when vkBeginCommandBuffer is called. + // We don't need to deallocate since destroying the pool will free all of the buffers. + vkAllocateCommandBuffers(device, &allocateInfo, &cmdbuffer); + return cmdbuffer; +} + +} // anonymous namespace + +#if FVK_ENABLED(FVK_DEBUG_GROUP_MARKERS) +void VulkanGroupMarkers::push(std::string const& marker, Timestamp start) noexcept { + mMarkers.push_back({marker, + start.time_since_epoch().count() > 0.0 + ? start + : std::chrono::high_resolution_clock::now()}); +} + +std::pair VulkanGroupMarkers::pop() noexcept { + auto ret = mMarkers.back(); + mMarkers.pop_back(); + return ret; +} + +std::pair VulkanGroupMarkers::pop_bottom() noexcept { + auto ret = mMarkers.front(); + mMarkers.pop_front(); + return ret; +} + +std::pair const& VulkanGroupMarkers::top() const { + assert_invariant(!empty()); + return mMarkers.back(); +} + +bool VulkanGroupMarkers::empty() const noexcept { + return mMarkers.empty(); +} +#endif // FVK_DEBUG_GROUP_MARKERS + +VulkanCommandBuffer::VulkanCommandBuffer(VulkanContext* context, VkDevice device, VkQueue queue, + VkCommandPool pool, bool isProtected) + : mContext(context), + mMarkerCount(0), + isProtected(isProtected), + mDevice(device), + mQueue(queue), + mBuffer(createCommandBuffer(device, pool)), + mFenceStatus(std::make_shared(VK_INCOMPLETE)) { + VkSemaphoreCreateInfo sci{.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO}; + vkCreateSemaphore(mDevice, &sci, VKALLOC, &mSubmission); + + VkFenceCreateInfo fenceCreateInfo{.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO}; + vkCreateFence(device, &fenceCreateInfo, VKALLOC, &mFence); +} + +VulkanCommandBuffer::~VulkanCommandBuffer() { + vkDestroySemaphore(mDevice, mSubmission, VKALLOC); + vkDestroyFence(mDevice, mFence, VKALLOC); +} + +void VulkanCommandBuffer::reset() noexcept { + mMarkerCount = 0; + mResources.clear(); + mWaitSemaphores.clear(); + + // Internally we use the VK_INCOMPLETE status to mean "not yet submitted". When this fence + // gets, gets submitted, its status changes to VK_NOT_READY. Finally, when the GPU actually + // finishes executing the command buffer, the status changes to VK_SUCCESS. + mFenceStatus = std::make_shared(VK_INCOMPLETE); + vkResetFences(mDevice, 1, &mFence); +} + +void VulkanCommandBuffer::pushMarker(char const* marker) noexcept { + if (mContext->isDebugUtilsSupported()) { + VkDebugUtilsLabelEXT labelInfo = { + .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT, + .pLabelName = marker, + .color = {0, 1, 0, 1}, + }; + vkCmdBeginDebugUtilsLabelEXT(mBuffer, &labelInfo); + } else if (mContext->isDebugMarkersSupported()) { + VkDebugMarkerMarkerInfoEXT markerInfo = { + .sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT, + .pMarkerName = marker, + .color = {0.0f, 1.0f, 0.0f, 1.0f}, + }; + vkCmdDebugMarkerBeginEXT(mBuffer, &markerInfo); } - vkCreateFence(device, &fenceCreateInfo, VKALLOC, &fence); + mMarkerCount++; +} - // Internally we use the VK_INCOMPLETE status to mean "not yet submitted". When this fence gets - // submitted, its status changes to VK_NOT_READY. Finally, when the GPU actually finishes - // executing the command buffer, the status changes to VK_SUCCESS. - status.store(VK_INCOMPLETE); +void VulkanCommandBuffer::popMarker() noexcept{ + assert_invariant(mMarkerCount > 0); + if (mContext->isDebugUtilsSupported()) { + vkCmdEndDebugUtilsLabelEXT(mBuffer); + } else if (mContext->isDebugMarkersSupported()) { + vkCmdDebugMarkerEndEXT(mBuffer); + } + mMarkerCount--; } -VulkanCmdFence::~VulkanCmdFence() { - vkDestroyFence(device, fence, VKALLOC); +void VulkanCommandBuffer::insertEvent(char const* marker) noexcept { + if (mContext->isDebugUtilsSupported()) { + VkDebugUtilsLabelEXT labelInfo = { + .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT, + .pLabelName = marker, + .color = {1, 1, 0, 1}, + }; + vkCmdInsertDebugUtilsLabelEXT(mBuffer, &labelInfo); + } else if (mContext->isDebugMarkersSupported()) { + VkDebugMarkerMarkerInfoEXT markerInfo = { + .sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT, + .pMarkerName = marker, + .color = {0.0f, 1.0f, 0.0f, 1.0f}, + }; + vkCmdDebugMarkerInsertEXT(mBuffer, &markerInfo); + } } -CommandBufferObserver::~CommandBufferObserver() {} +void VulkanCommandBuffer::begin() noexcept { + // Begin writing into the command buffer. + VkCommandBufferBeginInfo const binfo{ + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, + .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, + }; + vkBeginCommandBuffer(mBuffer, &binfo); +} -static VkQueue getQueue(VkDevice device, uint32_t queueFamilyIndex) { - VkQueue queue; - vkGetDeviceQueue(device, queueFamilyIndex, 0, &queue); - return queue; +VkSemaphore VulkanCommandBuffer::submit() { + while (mMarkerCount > 0) { + popMarker(); + } + + vkEndCommandBuffer(mBuffer); + + VkPipelineStageFlags const waitDestStageMasks[2] = { + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + }; + + VkSubmitInfo submitInfo{ + .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, + .waitSemaphoreCount = mWaitSemaphores.size(), + .pWaitSemaphores = mWaitSemaphores.data(), + .pWaitDstStageMask = waitDestStageMasks, + .commandBufferCount = 1u, + .pCommandBuffers = &mBuffer, + .signalSemaphoreCount = 1u, + .pSignalSemaphores = &mSubmission, + }; + // add submit protection if needed + VkProtectedSubmitInfo protectedSubmitInfo{ + .sType = VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO, + .protectedSubmit = VK_TRUE, + }; + + if (isProtected) { + submitInfo.pNext = &protectedSubmitInfo; + } + +#if FVK_ENABLED(FVK_DEBUG_COMMAND_BUFFER) + FVK_LOGI << "Submitting cmdbuffer=" << mBuffer + << " wait=("; + for (size_t s = 0, count = mWaitSemaphores.size(); s < count; ++s) { + FVK_LOGI << mWaitSemaphores[s] << " "; + } + FVK_LOGI << ") " + << " signal=" << mSubmission + << " fence=" << mFence << utils::io::endl; +#endif + + mFenceStatus->setStatus(VK_NOT_READY); + UTILS_UNUSED_IN_RELEASE VkResult result = + vkQueueSubmit(mQueue, 1, &submitInfo, mFence); + +#if FVK_ENABLED(FVK_DEBUG_COMMAND_BUFFER) + if (result != VK_SUCCESS) { + FVK_LOGD << "Failed command buffer submission result: " << result << utils::io::endl; + } +#endif + assert_invariant(result == VK_SUCCESS); + mWaitSemaphores.clear(); + return mSubmission; } -static VkCommandPool createPool(VkDevice device, uint32_t queueFamilyIndex) { +CommandBufferPool::CommandBufferPool(VulkanContext* context, VkDevice device, VkQueue queue, + uint8_t queueFamilyIndex, bool isProtected) + : mDevice(device), + mRecording(INVALID) { VkCommandPoolCreateInfo createInfo = { .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, - .flags = - VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, + .flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | + VK_COMMAND_POOL_CREATE_TRANSIENT_BIT | + (isProtected ? VK_COMMAND_POOL_CREATE_PROTECTED_BIT : 0u), .queueFamilyIndex = queueFamilyIndex, }; - VkCommandPool pool; - vkCreateCommandPool(device, &createInfo, VKALLOC, &pool); - return pool; + vkCreateCommandPool(device, &createInfo, VKALLOC, &mPool); -} - -VulkanCommands::VulkanCommands(VkDevice device, uint32_t queueFamilyIndex) : mDevice(device), - mQueue(getQueue(device, queueFamilyIndex)), mPool(createPool(mDevice, queueFamilyIndex)) { - VkSemaphoreCreateInfo sci { .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO }; - for (auto& semaphore : mSubmissionSignals) { - vkCreateSemaphore(mDevice, &sci, nullptr, &semaphore); + for (size_t i = 0; i < CAPACITY; ++i) { + mBuffers.emplace_back( + std::make_unique(context, device, queue, mPool, isProtected)); } } -VulkanCommands::~VulkanCommands() { +CommandBufferPool::~CommandBufferPool() { wait(); gc(); vkDestroyCommandPool(mDevice, mPool, VKALLOC); - for (VkSemaphore sema : mSubmissionSignals) { - vkDestroySemaphore(mDevice, sema, VKALLOC); - } } -VulkanCommandBuffer const& VulkanCommands::get() { - if (mCurrent) { - return *mCurrent; +VulkanCommandBuffer& CommandBufferPool::getRecording() { + if (isRecording()) { + return *mBuffers[mRecording]; } - // If we ran out of available command buffers, stall until one finishes. This is very rare. - // It occurs only when Filament invokes commit() or endFrame() a large number of times without - // presenting the swap chain or waiting on a fence. - while (mAvailableCount == 0) { -#if VK_REPORT_STALLS - slog.i << "VulkanCommands has stalled. " - << "If this occurs frequently, consider increasing VK_MAX_COMMAND_BUFFERS." - << io::endl; -#endif + auto const findNext = [this]() { + for (int8_t i = 0; i < CAPACITY; ++i) { + if (!mSubmitted[i]) { + return i; + } + } + return INVALID; + }; + + while ((mRecording = findNext()) == INVALID) { wait(); gc(); } - // Find an available slot. - for (VulkanCommandBuffer& wrapper : mStorage) { - if (wrapper.cmdbuffer == VK_NULL_HANDLE) { - mCurrent = &wrapper; - break; + auto& recording = *mBuffers[mRecording]; + recording.begin(); + +#if FVK_ENABLED(FVK_DEBUG_GROUP_MARKERS) + if (mGroupMarkers) { + std::unique_ptr markers = std::make_unique(); + while (!mGroupMarkers->empty()) { + auto [marker, timestamp] = mGroupMarkers->pop_bottom(); + recording.pushMarker(marker.c_str()); + markers->push(marker, timestamp); } + std::swap(mGroupMarkers, markers); } +#endif - assert_invariant(mCurrent); - --mAvailableCount; + return recording; +} - // Create the low-level command buffer. - const VkCommandBufferAllocateInfo allocateInfo { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, - .commandPool = mPool, - .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, - .commandBufferCount = 1 - }; - vkAllocateCommandBuffers(mDevice, &allocateInfo, &mCurrent->cmdbuffer); +void CommandBufferPool::gc() { + ActiveBuffers reclaimed; + mSubmitted.forEachSetBit([this,&reclaimed] (size_t index) { + auto& buffer = mBuffers[index]; + if (buffer->getStatus() == VK_SUCCESS) { + reclaimed.set(index, true); + buffer->reset(); + } + }); + mSubmitted &= ~reclaimed; +} - // Note that the fence wrapper uses shared_ptr because a DriverAPI fence can also have ownership - // over it. The destruction of the low-level fence occurs either in VulkanCommands::gc(), or in - // VulkanDriver::destroyFence(), both of which are safe spots. - mCurrent->fence = std::make_shared(mDevice); +void CommandBufferPool::update() { + mSubmitted.forEachSetBit([this] (size_t index) { + auto& buffer = mBuffers[index]; + VkResult status = vkGetFenceStatus(mDevice, buffer->getVkFence()); + if (status == VK_SUCCESS) { + buffer->setComplete(); + } + }); +} - // Begin writing into the command buffer. - const VkCommandBufferBeginInfo binfo { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, - .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, - }; - vkBeginCommandBuffer(mCurrent->cmdbuffer, &binfo); +VkSemaphore CommandBufferPool::flush() { + // We're not recording right now. + if (!isRecording()) { + return VK_NULL_HANDLE; + } + auto submitSemaphore = mBuffers[mRecording]->submit(); + mSubmitted.set(mRecording, true); + mRecording = INVALID; + return submitSemaphore; +} - // Notify the observer that a new command buffer has been activated. - if (mObserver) { - mObserver->onCommandBuffer(*mCurrent); +void CommandBufferPool::wait() { + uint8_t count = 0; + VkFence fences[CAPACITY]; + mSubmitted.forEachSetBit([this, &count, &fences] (size_t index) { + fences[count++] = mBuffers[index]->getVkFence(); + }); + vkWaitForFences(mDevice, count, fences, VK_TRUE, UINT64_MAX); + update(); +} + +void CommandBufferPool::waitFor(VkSemaphore previousAction) { + if (!isRecording()) { + return; } + auto& recording = mBuffers[mRecording]; + recording->insertWait(previousAction); +} - return *mCurrent; +#if FVK_ENABLED(FVK_DEBUG_GROUP_MARKERS) +std::string CommandBufferPool::topMarker() const { + if (!mGroupMarkers || mGroupMarkers->empty()) { + return ""; + } + return std::get<0>(mGroupMarkers->top()); } -bool VulkanCommands::flush() { - // It's perfectly fine to call flush when no commands have been written. - if (mCurrent == nullptr) { - return false; +void CommandBufferPool::pushMarker(char const* marker, VulkanGroupMarkers::Timestamp timestamp) { + if (!mGroupMarkers) { + mGroupMarkers = std::make_unique(); } + mGroupMarkers->push(marker, timestamp); + getRecording().pushMarker(marker); +} - const int64_t index = mCurrent - &mStorage[0]; - VkSemaphore renderingFinished = mSubmissionSignals[index]; +std::pair CommandBufferPool::popMarker() { + assert_invariant(mGroupMarkers && !mGroupMarkers->empty()); + auto ret = mGroupMarkers->pop(); - vkEndCommandBuffer(mCurrent->cmdbuffer); + // Note that if we're popping a marker while not recording, we would just pop the conceptual + // stack of marker (i.e. mGroupMarkers) and not carry out the pop on the command buffer. + if (isRecording()) { + getRecording().popMarker(); + } + return ret; +} - // If the injected semaphore is an "image available" semaphore that has not yet been signaled, - // it is sometimes fine to start executing commands anyway, as along as we stall the GPU at the - // VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT stage. However we need to assume the worst - // here and use VK_PIPELINE_STAGE_ALL_COMMANDS_BIT. This is a more aggressive stall, but it is - // the only safe option because the previously submitted command buffer might have set up some - // state that the new command buffer depends on. - VkPipelineStageFlags waitDestStageMasks[2] = { - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, - }; +void CommandBufferPool::insertEvent(char const* marker) { + getRecording().insertEvent(marker); +} +#endif // FVK_DEBUG_GROUP_MARKERS + +VulkanCommands::VulkanCommands(VkDevice device, VkQueue queue, uint32_t queueFamilyIndex, + VkQueue protectedQueue, uint32_t protectedQueueFamilyIndex, VulkanContext* context) + : mDevice(device), + mProtectedQueue(protectedQueue), + mProtectedQueueFamilyIndex(protectedQueueFamilyIndex), + mContext(context), + mPool(std::make_unique(context, device, queue, queueFamilyIndex, false)) {} + +void VulkanCommands::terminate() { + mPool.reset(); + mProtectedPool.reset(); +} - VkSemaphore signals[2] = { - VK_NULL_HANDLE, - VK_NULL_HANDLE, - }; +VulkanCommandBuffer& VulkanCommands::get() { + auto& ret = mPool->getRecording(); + return ret; +} - VkSubmitInfo submitInfo { - .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, - .waitSemaphoreCount = 0, - .pWaitSemaphores = signals, - .pWaitDstStageMask = waitDestStageMasks, - .commandBufferCount = 1, - .pCommandBuffers = &mCurrent->cmdbuffer, - .signalSemaphoreCount = 1u, - .pSignalSemaphores = &renderingFinished, - }; +VulkanCommandBuffer& VulkanCommands::getProtected() { + assert_invariant(mProtectedQueue != VK_NULL_HANDLE); - if (mSubmissionSignal) { - signals[submitInfo.waitSemaphoreCount++] = mSubmissionSignal; + if (!mProtectedPool) { + mProtectedPool = std::make_unique(mContext, mDevice, mProtectedQueue, + mProtectedQueueFamilyIndex, true); } + auto& ret = mProtectedPool->getRecording(); + return ret; +} - if (mInjectedSignal) { - signals[submitInfo.waitSemaphoreCount++] = mInjectedSignal; +bool VulkanCommands::flush() { + // It's possible to call flush and wait at "terminate", in which case, we'll just return. + if (!mPool && !mProtectedPool) { + return false; } - if (FILAMENT_VULKAN_VERBOSE) { - slog.i << "Submitting cmdbuffer=" << mCurrent->cmdbuffer - << " wait=(" << signals[0] << ", " << signals[1] << ") " - << " signal=" << renderingFinished - << io::endl; - } + VkSemaphore dependency = mInjectedDependency; + VkSemaphore lastSubmit = mLastSubmit; + bool hasFlushed = false; - auto& cmdfence = mCurrent->fence; - std::unique_lock lock(cmdfence->mutex); - cmdfence->status.store(VK_NOT_READY); - UTILS_UNUSED_IN_RELEASE VkResult result = vkQueueSubmit(mQueue, 1, &submitInfo, cmdfence->fence); - cmdfence->condition.notify_all(); - lock.unlock(); + // Note that we've ordered it so that the non-protected commands are followed by the protected + // commands. This assumes that the protected commands will be that one doing the rendering into + // the protected memory (i.e. protected render target). + for (auto pool: {mPool.get(), mProtectedPool.get()}) { + if (!pool || !pool->isRecording()) { + continue; + } + if (dependency != VK_NULL_HANDLE) { + pool->waitFor(dependency); + } + if (lastSubmit != VK_NULL_HANDLE) { + pool->waitFor(lastSubmit); + lastSubmit = VK_NULL_HANDLE; + } + dependency = pool->flush(); + hasFlushed = true; + } - assert_invariant(result == VK_SUCCESS); + if (hasFlushed) { + mInjectedDependency = VK_NULL_HANDLE; + mLastSubmit = dependency; + } - mSubmissionSignal = renderingFinished; - mInjectedSignal = VK_NULL_HANDLE; - mCurrent = nullptr; return true; } -VkSemaphore VulkanCommands::acquireFinishedSignal() { - VkSemaphore semaphore = mSubmissionSignal; - mSubmissionSignal = VK_NULL_HANDLE; - if (FILAMENT_VULKAN_VERBOSE) { - slog.i << "Acquiring " << semaphore << " (e.g. for vkQueuePresentKHR)" << io::endl; +void VulkanCommands::wait() { + // It's possible to call flush and wait at "terminate", in which case, we'll just return. + if (!mPool && !mProtectedPool) { + return; + } + + FVK_SYSTRACE_CONTEXT(); + FVK_SYSTRACE_START("commands::wait"); + + mPool->wait(); + if (mProtectedPool) { + mProtectedPool->wait(); + } + FVK_SYSTRACE_END(); +} + +void VulkanCommands::gc() { + FVK_SYSTRACE_CONTEXT(); + FVK_SYSTRACE_START("commands::gc"); + + mPool->gc(); + if (mProtectedPool) { + mProtectedPool->gc(); } - return semaphore; + FVK_SYSTRACE_END(); } -void VulkanCommands::injectDependency(VkSemaphore next) { - assert_invariant(mInjectedSignal == VK_NULL_HANDLE); - mInjectedSignal = next; - if (FILAMENT_VULKAN_VERBOSE) { - slog.i << "Injecting " << next << " (e.g. due to vkAcquireNextImageKHR)" << io::endl; +void VulkanCommands::updateFences() { + mPool->update(); + if (mProtectedPool) { + mProtectedPool->update(); } } -void VulkanCommands::wait() { - VkFence fences[CAPACITY]; - uint32_t count = 0; - for (auto& wrapper : mStorage) { - if (wrapper.cmdbuffer != VK_NULL_HANDLE && mCurrent != &wrapper) { - fences[count++] = wrapper.fence->fence; - } +#if FVK_ENABLED(FVK_DEBUG_GROUP_MARKERS) + +void VulkanCommands::pushGroupMarker(char const* str, VulkanGroupMarkers::Timestamp timestamp) { + mPool->pushMarker(str, timestamp); + if (mProtectedPool) { + mProtectedPool->pushMarker(str, timestamp); } - if (count > 0) { - vkWaitForFences(mDevice, count, fences, VK_TRUE, UINT64_MAX); +#if FVK_ENABLED(FVK_DEBUG_PRINT_GROUP_MARKERS) + FVK_LOGD << "----> " << str << utils::io::endl; +#endif +} + +void VulkanCommands::popGroupMarker() { + +#if FVK_ENABLED(FVK_DEBUG_PRINT_GROUP_MARKERS) + auto ret = mPool->popMarker(); + auto const& marker = ret.first; + auto const& startTime = ret.second; + auto const endTime = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = endTime - startTime; + FVK_LOGD << "<---- " << marker << " elapsed: " << (diff.count() * 1000) << " ms" + << utils::io::endl; +#else + mPool->popMarker(); +#endif // FVK_DEBUG_PRINT_GROUP_MARKERS + + if (mProtectedPool) { + mProtectedPool->popMarker(); } } -void VulkanCommands::gc() { - for (auto& wrapper : mStorage) { - if (wrapper.cmdbuffer != VK_NULL_HANDLE) { - VkResult result = vkWaitForFences(mDevice, 1, &wrapper.fence->fence, VK_TRUE, 0); - if (result == VK_SUCCESS) { - vkFreeCommandBuffers(mDevice, mPool, 1, &wrapper.cmdbuffer); - wrapper.cmdbuffer = VK_NULL_HANDLE; - wrapper.fence->status.store(VK_SUCCESS); - wrapper.fence.reset(); - ++mAvailableCount; - } - } +void VulkanCommands::insertEventMarker(char const* str, uint32_t len) { + mPool->insertEvent(str); + if (mProtectedPool) { + mProtectedPool->insertEvent(str); } } -void VulkanCommands::updateFences() { - for (auto& wrapper : mStorage) { - if (wrapper.cmdbuffer != VK_NULL_HANDLE) { - VulkanCmdFence* fence = wrapper.fence.get(); - if (fence) { - VkResult status = vkGetFenceStatus(mDevice, fence->fence); - // This is either VK_SUCCESS, VK_NOT_READY, or VK_ERROR_DEVICE_LOST. - fence->status.store(status, std::memory_order_relaxed); - } - } +std::string VulkanCommands::getTopGroupMarker() const { + if (mProtectedPool) { + return mProtectedPool->topMarker(); } + return mPool->topMarker(); } +#endif // FVK_DEBUG_GROUP_MARKERS } // namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanCommands.h b/filament/backend/src/vulkan/VulkanCommands.h index 0e360eb64c5..2e331dfa4ad 100644 --- a/filament/backend/src/vulkan/VulkanCommands.h +++ b/filament/backend/src/vulkan/VulkanCommands.h @@ -19,40 +19,154 @@ #include +#include "DriverBase.h" + +#include "VulkanAsyncHandles.h" #include "VulkanConstants.h" +#include "VulkanUtility.h" +#include "vulkan/memory/ResourcePointer.h" #include +#include #include +#include + +#include +#include +#include +#include + namespace filament::backend { -// Wrapper to enable use of shared_ptr for implementing shared ownership of low-level Vulkan fences. -struct VulkanCmdFence { - VulkanCmdFence(VkDevice device, bool signaled = false); - ~VulkanCmdFence(); - const VkDevice device; - VkFence fence; - utils::Condition condition; - utils::Mutex mutex; - std::atomic status; +using namespace fvkmemory; + +struct VulkanContext; + +#if FVK_ENABLED(FVK_DEBUG_GROUP_MARKERS) +class VulkanGroupMarkers { +public: + using Timestamp = std::chrono::time_point; + + void push(std::string const& marker, Timestamp start = {}) noexcept; + std::pair pop() noexcept; + std::pair pop_bottom() noexcept; + std::pair const& top() const; + bool empty() const noexcept; + +private: + std::list> mMarkers; }; +#endif // FVK_DEBUG_GROUP_MARKERS + // The submission fence has shared ownership semantics because it is potentially wrapped by a // DriverApi fence object and should not be destroyed until both the DriverApi object is freed and // we're done waiting on the most recent submission of the given command buffer. struct VulkanCommandBuffer { - VulkanCommandBuffer() {} + VulkanCommandBuffer(VulkanContext* mContext, + VkDevice device, VkQueue queue, VkCommandPool pool, bool isProtected); + VulkanCommandBuffer(VulkanCommandBuffer const&) = delete; VulkanCommandBuffer& operator=(VulkanCommandBuffer const&) = delete; - VkCommandBuffer cmdbuffer = VK_NULL_HANDLE; - std::shared_ptr fence; + + ~VulkanCommandBuffer(); + + inline void acquire(fvkmemory::resource_ptr resource) { + mResources.push_back(resource); + } + + void reset() noexcept; + + inline void insertWait(VkSemaphore sem) { + mWaitSemaphores.insert(sem); + } + + void pushMarker(char const* marker) noexcept; + void popMarker() noexcept; + void insertEvent(char const* marker) noexcept; + + void begin() noexcept; + VkSemaphore submit(); + + inline void setComplete() { + mFenceStatus->setStatus(VK_SUCCESS); + } + + VkResult getStatus() { + return mFenceStatus->getStatus(); + } + + std::shared_ptr getFenceStatus() const { + return mFenceStatus; + } + + VkFence getVkFence() const { + return mFence; + } + + VkCommandBuffer buffer() const { + return mBuffer; + } + +private: + VulkanContext* mContext; + uint8_t mMarkerCount; + bool const isProtected; + VkDevice mDevice; + VkQueue mQueue; + CappedArray mWaitSemaphores; + VkCommandBuffer mBuffer; + VkSemaphore mSubmission; + VkFence mFence; + std::shared_ptr mFenceStatus; + std::vector> mResources; }; -// Allows classes to be notified after a new command buffer has been activated. -class CommandBufferObserver { -public: - virtual void onCommandBuffer(const VulkanCommandBuffer& cmdbuffer) = 0; - virtual ~CommandBufferObserver(); +struct CommandBufferPool { + using ActiveBuffers = utils::bitset64; + static constexpr int8_t INVALID = -1; + + CommandBufferPool(VulkanContext* context, VkDevice device, VkQueue queue, + uint8_t queueFamilyIndex, bool isProtected); + ~CommandBufferPool(); + + VulkanCommandBuffer& getRecording(); + + void gc(); + void update(); + VkSemaphore flush(); + void wait(); + void waitFor(VkSemaphore previousAction); + +#if FVK_ENABLED(FVK_DEBUG_GROUP_MARKERS) + std::string topMarker() const; + void pushMarker(char const* marker, VulkanGroupMarkers::Timestamp timestamp); + std::pair popMarker(); + void insertEvent(char const* marker); +#endif + + inline bool isRecording() const { return mRecording != INVALID; } + +private: + static constexpr int CAPACITY = FVK_MAX_COMMAND_BUFFERS; + // int8 only goes up to 127, therefore capacity must be less than that. + static_assert(CAPACITY < 128); + + // The number of bits in ActiveBuffers describe the usage of the buffers in the pool, so must be + // larger than the size of the pool. + static_assert(sizeof(ActiveBuffers) * 8 >= CAPACITY); + + using BufferList = utils::FixedCapacityVector>; + VkDevice mDevice; + VkCommandPool mPool; + ActiveBuffers mSubmitted; + std::vector> mBuffers; + int8_t mRecording; + +#if FVK_ENABLED(FVK_DEBUG_GROUP_MARKERS) + std::unique_ptr mGroupMarkers; +#endif }; // Manages a set of command buffers and semaphores, exposing an API that is significantly simpler @@ -66,9 +180,6 @@ class CommandBufferObserver { // - This creates a guarantee of in-order execution. // - Semaphores are recycled to prevent create / destroy churn. // -// - Notifies listeners when recording begins in a new VkCommandBuffer. -// - Used by PipelineCache so that it knows when to clear out its shadow state. -// // - Allows 1 user to inject a "dependency" semaphore that stalls the next flush. // - This is used for asynchronous acquisition of a swap chain image, since the GPU // might require a valid swap chain image when it starts executing the command buffer. @@ -82,51 +193,66 @@ class CommandBufferObserver { // - We do this because vkGetFenceStatus must be called from the rendering thread. // class VulkanCommands { - public: - VulkanCommands(VkDevice device, uint32_t queueFamilyIndex); - ~VulkanCommands(); - - // Creates a "current" command buffer if none exists, otherwise returns the current one. - VulkanCommandBuffer const& get(); - - // Submits the current command buffer if it exists, then sets "current" to null. - // If there are no outstanding commands then nothing happens and this returns false. - bool flush(); - - // Returns the "rendering finished" semaphore for the most recent flush and removes - // it from the existing dependency chain. This is especially useful for setting up - // vkQueuePresentKHR. - VkSemaphore acquireFinishedSignal(); - - // Takes a semaphore that signals when the next flush can occur. Only one injected - // semaphore is allowed per flush. Useful after calling vkAcquireNextImageKHR. - void injectDependency(VkSemaphore next); - - // Destroys all command buffers that are no longer in use. - void gc(); - - // Waits for all outstanding command buffers to finish. - void wait(); - - // Updates the atomic "status" variable in every extant fence. - void updateFences(); - - // Sets an observer who is notified every time a new command buffer has been made "current". - // The observer's event handler can only be called during get(). - void setObserver(CommandBufferObserver* observer) { mObserver = observer; } - - private: - static constexpr int CAPACITY = VK_MAX_COMMAND_BUFFERS; - const VkDevice mDevice; - const VkQueue mQueue; - const VkCommandPool mPool; - VulkanCommandBuffer* mCurrent = nullptr; - VkSemaphore mSubmissionSignal = {}; - VkSemaphore mInjectedSignal = {}; - VulkanCommandBuffer mStorage[CAPACITY] = {}; - VkSemaphore mSubmissionSignals[CAPACITY] = {}; - size_t mAvailableCount = CAPACITY; - CommandBufferObserver* mObserver = nullptr; +public: + VulkanCommands(VkDevice device, VkQueue queue, uint32_t queueFamilyIndex, + VkQueue protectedQueue, uint32_t protectedQueueFamilyIndex, VulkanContext* context); + + void terminate(); + + // Creates a "current" command buffer if none exists, otherwise returns the current one. + VulkanCommandBuffer& get(); + + // Creates a "current" protected capable command buffer if none exists, otherwise + // returns the current one. + VulkanCommandBuffer& getProtected(); + + // Submits the current command buffer if it exists, then sets "current" to null. + // If there are no outstanding commands then nothing happens and this returns false. + bool flush(); + + // Returns the "rendering finished" semaphore for the most recent flush and removes + // it from the existing dependency chain. This is especially useful for setting up + // vkQueuePresentKHR. + VkSemaphore acquireFinishedSignal() { + VkSemaphore ret= mLastSubmit; + mLastSubmit = VK_NULL_HANDLE; + return ret; + } + + // Takes a semaphore that signals when the next flush can occur. Only one injected + // semaphore is allowed per flush. Useful after calling vkAcquireNextImageKHR. + void injectDependency(VkSemaphore next) { + mInjectedDependency = next; + } + + // Destroys all command buffers that are no longer in use. + void gc(); + + // Waits for all outstanding command buffers to finish. + void wait(); + + // Updates the atomic "status" variable in every extant fence. + void updateFences(); + +#if FVK_ENABLED(FVK_DEBUG_GROUP_MARKERS) + void pushGroupMarker(char const* str, VulkanGroupMarkers::Timestamp timestamp = {}); + void popGroupMarker(); + void insertEventMarker(char const* string, uint32_t len); + std::string getTopGroupMarker() const; +#endif + +private: + VkDevice const mDevice; + VkQueue const mProtectedQueue; + // For defered initialization if/when we need protected content + uint32_t const mProtectedQueueFamilyIndex; + VulkanContext* mContext; + + std::unique_ptr mPool; + std::unique_ptr mProtectedPool; + + VkSemaphore mInjectedDependency = VK_NULL_HANDLE; + VkSemaphore mLastSubmit = VK_NULL_HANDLE; }; } // namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanConstants.h b/filament/backend/src/vulkan/VulkanConstants.h index 55e62e3841a..1a454d70696 100644 --- a/filament/backend/src/vulkan/VulkanConstants.h +++ b/filament/backend/src/vulkan/VulkanConstants.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2021 The Android Open Source Project * -* Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * @@ -17,14 +17,9 @@ #ifndef TNT_FILAMENT_BACKEND_VULKANCONSTANTS_H #define TNT_FILAMENT_BACKEND_VULKANCONSTANTS_H -#include - -#define FILAMENT_VULKAN_VERBOSE 0 -#define FILAMENT_VULKAN_DUMP_API 0 +#include -#ifndef FILAMENT_VULKAN_HANDLE_ARENA_SIZE_IN_MB -#define FILAMENT_VULKAN_HANDLE_ARENA_SIZE_IN_MB 8 -#endif +#include // In debug builds, we enable validation layers and set up a debug callback. // @@ -43,21 +38,157 @@ // ndkVersion "23.1.7779620" // // Also consider changing the root `gradle.properties` to point to a debug build, although this is -// not required for validation if you change the definition of VK_ENABLE_VALIDATION below. -#if defined(NDEBUG) -#define VK_ENABLE_VALIDATION 0 +// not required for validation. + +// FVK is short for Filament Vulkan + +// Enables Android systrace +#define FVK_DEBUG_SYSTRACE 0x00000001 + +// Group markers are used to denote collections of GPU commands. It is typically at the +// granualarity of a renderpass. You can enable this along with FVK_DEBUG_DEBUG_UTILS to take +// advantage of vkCmdBegin/EndDebugUtilsLabelEXT. You can also just enable this with +// FVK_DEBUG_PRINT_GROUP_MARKERS to print the current marker to stdout. +#define FVK_DEBUG_GROUP_MARKERS 0x00000002 + +#define FVK_DEBUG_TEXTURE 0x00000004 +#define FVK_DEBUG_LAYOUT_TRANSITION 0x00000008 +#define FVK_DEBUG_COMMAND_BUFFER 0x00000010 +#define FVK_DEBUG_DUMP_API 0x00000020 +#define FVK_DEBUG_VALIDATION 0x00000040 +#define FVK_DEBUG_PRINT_GROUP_MARKERS 0x00000080 +#define FVK_DEBUG_BLIT_FORMAT 0x00000100 +#define FVK_DEBUG_BLITTER 0x00000200 +#define FVK_DEBUG_FBO_CACHE 0x00000400 +#define FVK_DEBUG_SHADER_MODULE 0x00000800 +#define FVK_DEBUG_READ_PIXELS 0x00001000 +#define FVK_DEBUG_PIPELINE_CACHE 0x00002000 +#define FVK_DEBUG_STAGING_ALLOCATION 0x00004000 + +// Enable the debug utils extension if it is available. +#define FVK_DEBUG_DEBUG_UTILS 0x00008000 + +// Use this to debug potential Handle/Resource leakage. It will print out reference counts for all +// the currently active resources. +#define FVK_DEBUG_RESOURCE_LEAK 0x00010000 + +// Set this to enable logging "only" to one output stream. This is useful in the case where we want +// to debug with print statements and want ordered logging (e.g slog.i and slog.e will not appear in +// order of calls). +#define FVK_DEBUG_FORCE_LOG_TO_I 0x00020000 + +// Enable a minimal set of traces to assess the performance of the backend. +// All other debug features must be disabled. +#define FVK_DEBUG_PROFILING 0x00040000 + +// Useful default combinations +#define FVK_DEBUG_EVERYTHING (0xFFFFFFFF & ~FVK_DEBUG_PROFILING) +#define FVK_DEBUG_PERFORMANCE \ + FVK_DEBUG_SYSTRACE + +#if defined(FILAMENT_BACKEND_DEBUG_FLAG) +#define FVK_DEBUG_FORWARDED_FLAG (FILAMENT_BACKEND_DEBUG_FLAG & FVK_DEBUG_EVERYTHING) +#else +#define FVK_DEBUG_FORWARDED_FLAG 0 +#endif + +#ifndef NDEBUG +#define FVK_DEBUG_FLAGS (FVK_DEBUG_PERFORMANCE | FVK_DEBUG_FORWARDED_FLAG) +#else +#define FVK_DEBUG_FLAGS 0 +#endif + +// Override the debug flags if we are forcing profiling mode +#if defined(FILAMENT_FORCE_PROFILING_MODE) +#undef FVK_DEBUG_FLAGS +#define FVK_DEBUG_FLAGS (FVK_DEBUG_PROFILING) +#endif + +#define FVK_ENABLED(flags) (((FVK_DEBUG_FLAGS) & (flags)) == (flags)) + +// Group marker only works only if validation or debug utils is enabled since it uses +// vkCmd(Begin/End)DebugUtilsLabelEXT or vkCmdDebugMarker(Begin/End)EXT +#if FVK_ENABLED(FVK_DEBUG_PRINT_GROUP_MARKERS) +static_assert(FVK_ENABLED(FVK_DEBUG_DEBUG_UTILS) || FVK_ENABLED(FVK_DEBUG_VALIDATION)); +#endif + +// Ensure dependencies are met between debug options +#if FVK_ENABLED(FVK_DEBUG_PRINT_GROUP_MARKERS) +static_assert(FVK_ENABLED(FVK_DEBUG_GROUP_MARKERS)); +#endif + +// Only enable debug utils if validation is enabled. +#if FVK_ENABLED(FVK_DEBUG_DEBUG_UTILS) +static_assert(FVK_ENABLED(FVK_DEBUG_VALIDATION)); +#endif + +#if FVK_ENABLED(FVK_DEBUG_PROFILING) && FVK_DEBUG_FLAGS != FVK_DEBUG_PROFILING +#error PROFILING is exclusive; all other debug features must be disabled. +#endif + +// end dependcy checks + +// Shorthand for combination of enabled debug flags +#if FVK_ENABLED(FVK_DEBUG_DEBUG_UTILS) && FVK_ENABLED(FVK_DEBUG_TEXTURE) +#define FVK_ENABLED_DEBUG_SAMPLER_NAME 1 #else -#define VK_ENABLE_VALIDATION 1 +#define FVK_ENABLED_DEBUG_SAMPLER_NAME 0 #endif -#define VK_REPORT_STALLS 0 +// end shorthands + +#if FVK_DEBUG_FLAGS == FVK_DEBUG_PROFILING + + #ifndef NDEBUG + #error PROFILING is meaningless in DEBUG mode. + #endif + + #define FVK_SYSTRACE_CONTEXT() + #define FVK_SYSTRACE_START(marker) + #define FVK_SYSTRACE_END() + #define FVK_SYSTRACE_SCOPE() + #define FVK_PROFILE_MARKER(marker) PROFILE_SCOPE(marker) + +#elif FVK_ENABLED(FVK_DEBUG_SYSTRACE) + + #include + + #define FVK_SYSTRACE_CONTEXT() SYSTRACE_CONTEXT() + #define FVK_SYSTRACE_START(marker) SYSTRACE_NAME_BEGIN(marker) + #define FVK_SYSTRACE_END() SYSTRACE_NAME_END() + #define FVK_SYSTRACE_SCOPE() SYSTRACE_NAME(__func__) + #define FVK_PROFILE_MARKER(marker) FVK_SYSTRACE_SCOPE() + +#else + #define FVK_SYSTRACE_CONTEXT() + #define FVK_SYSTRACE_START(marker) + #define FVK_SYSTRACE_END() + #define FVK_SYSTRACE_SCOPE() + #define FVK_PROFILE_MARKER(marker) +#endif + +#ifndef FVK_HANDLE_ARENA_SIZE_IN_MB +#define FVK_HANDLE_ARENA_SIZE_IN_MB 8 +#endif + +#if FVK_ENABLED(FVK_DEBUG_FORCE_LOG_TO_I) + #define FVK_LOGI (utils::slog.i) + #define FVK_LOGD FVK_LOGI + #define FVK_LOGE FVK_LOGI + #define FVK_LOGW FVK_LOGI +#else + #define FVK_LOGE (utils::slog.e) + #define FVK_LOGW (utils::slog.w) + #define FVK_LOGD (utils::slog.d) + #define FVK_LOGI (utils::slog.i) +#endif // All vkCreate* functions take an optional allocator. For now we select the default allocator by // passing in a null pointer, and we highlight the argument by using the VKALLOC constant. constexpr struct VkAllocationCallbacks* VKALLOC = nullptr; -constexpr static const int VK_REQUIRED_VERSION_MAJOR = 1; -constexpr static const int VK_REQUIRED_VERSION_MINOR = 0; +constexpr static const int FVK_REQUIRED_VERSION_MAJOR = 1; +constexpr static const int FVK_REQUIRED_VERSION_MINOR = 1; // Maximum number of VkCommandBuffer handles managed simultaneously by VulkanCommands. // @@ -65,18 +196,20 @@ constexpr static const int VK_REQUIRED_VERSION_MINOR = 0; // buffers that have been submitted but have not yet finished rendering. Note that Filament can // issue multiple commit calls in a single frame, and that we use a triple buffered swap chain on // some platforms. -constexpr static const int VK_MAX_COMMAND_BUFFERS = 10; +// +// Heuristic: Triple Buffering (3) multiplied by maximum number of renderpasses (15). +constexpr static const int FVK_MAX_COMMAND_BUFFERS = 3 * 15; // Number of command buffer submissions that should occur before an unused pipeline is removed // from the cache. // // If this number is low, VkPipeline construction will occur frequently, which can // be extremely slow. If this number is high, the memory footprint will be large. -constexpr static const int VK_MAX_PIPELINE_AGE = 10; +constexpr static const int FVK_MAX_PIPELINE_AGE = FVK_MAX_COMMAND_BUFFERS; // VulkanPipelineCache does not track which command buffers contain references to which pipelines, -// instead it simply waits for at least VK_MAX_COMMAND_BUFFERS submissions to occur before +// instead it simply waits for at least FVK_MAX_COMMAND_BUFFERS submissions to occur before // destroying any unused pipeline object. -static_assert(VK_MAX_PIPELINE_AGE >= VK_MAX_COMMAND_BUFFERS); +static_assert(FVK_MAX_PIPELINE_AGE >= FVK_MAX_COMMAND_BUFFERS); #endif diff --git a/filament/backend/src/vulkan/VulkanContext.cpp b/filament/backend/src/vulkan/VulkanContext.cpp index 4367082d2f9..95d860d618d 100644 --- a/filament/backend/src/vulkan/VulkanContext.cpp +++ b/filament/backend/src/vulkan/VulkanContext.cpp @@ -15,6 +15,8 @@ */ #include "VulkanContext.h" + +#include "VulkanCommands.h" #include "VulkanHandles.h" #include "VulkanMemory.h" #include "VulkanTexture.h" @@ -23,478 +25,13 @@ #include #include -#include #include // for std::max using namespace bluevk; -using utils::FixedCapacityVector; - - namespace { -#if VK_ENABLE_VALIDATION -VKAPI_ATTR VkBool32 VKAPI_CALL debugReportCallback(VkDebugReportFlagsEXT flags, - VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, - int32_t messageCode, const char* pLayerPrefix, const char* pMessage, void* pUserData) { - if (flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { - utils::slog.e << "VULKAN ERROR: (" << pLayerPrefix << ") " << pMessage << utils::io::endl; - } else { - utils::slog.w << "VULKAN WARNING: (" << pLayerPrefix << ") " - << pMessage << utils::io::endl; - } - utils::slog.e << utils::io::endl; - return VK_FALSE; -} - -VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsCallback(VkDebugUtilsMessageSeverityFlagBitsEXT severity, - VkDebugUtilsMessageTypeFlagsEXT types, const VkDebugUtilsMessengerCallbackDataEXT* cbdata, - void* pUserData) { - if (severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) { - utils::slog.e << "VULKAN ERROR: (" << cbdata->pMessageIdName << ") " - << cbdata->pMessage << utils::io::endl; - } else { - // TODO: emit best practices warnings about aggressive pipeline barriers. - if (strstr(cbdata->pMessage, "ALL_GRAPHICS_BIT") || strstr(cbdata->pMessage, "ALL_COMMANDS_BIT")) { - return VK_FALSE; - } - utils::slog.w << "VULKAN WARNING: (" << cbdata->pMessageIdName << ") " - << cbdata->pMessage << utils::io::endl; - } - utils::slog.e << utils::io::endl; - return VK_FALSE; -} - -// These strings need to be allocated outside a function stack -const std::string_view DESIRED_LAYERS[] = { - "VK_LAYER_KHRONOS_validation", -#if FILAMENT_VULKAN_DUMP_API - "VK_LAYER_LUNARG_api_dump", -#endif -#if defined(ENABLE_RENDERDOC) - "VK_LAYER_RENDERDOC_Capture", -#endif -}; - -FixedCapacityVector getEnabledLayers() { - constexpr size_t kMaxEnabledLayersCount = sizeof(DESIRED_LAYERS) / sizeof(DESIRED_LAYERS[0]); - - const FixedCapacityVector availableLayers = filament::backend::enumerate( - vkEnumerateInstanceLayerProperties); - - auto enabledLayers = FixedCapacityVector::with_capacity(kMaxEnabledLayersCount); - for (const auto& desired : DESIRED_LAYERS) { - for (const VkLayerProperties& layer : availableLayers) { - const std::string_view availableLayer(layer.layerName); - if (availableLayer == desired) { - enabledLayers.push_back(desired.data()); - break; - } - } - } - return enabledLayers; -} - -#endif // VK_ENABLE_VALIDATION - -void printDeviceInfo(VkInstance instance, VkPhysicalDevice device) { - // Print some driver or MoltenVK information if it is available. - if (vkGetPhysicalDeviceProperties2KHR) { - VkPhysicalDeviceDriverProperties driverProperties = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES, - }; - VkPhysicalDeviceProperties2 physicalDeviceProperties2 = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, - .pNext = &driverProperties, - }; - vkGetPhysicalDeviceProperties2KHR(device, &physicalDeviceProperties2); - utils::slog.i << "Vulkan device driver: " - << driverProperties.driverName << " " - << driverProperties.driverInfo << utils::io::endl; - } - - VkPhysicalDeviceProperties deviceProperties; - vkGetPhysicalDeviceProperties(device, &deviceProperties); - - // Print out some properties of the GPU for diagnostic purposes. - // - // Ideally, the vendors register their vendor ID's with Khronos so that apps can make an - // id => string mapping. However, in practice this hasn't happened. At the time of this - // writing the gpuinfo database has the following ID's: - // - // 0x1002 - AMD - // 0x1010 - ImgTec - // 0x10DE - NVIDIA - // 0x13B5 - ARM - // 0x106B - APPLE - // 0x5143 - Qualcomm - // 0x8086 - INTEL - // - // Since we don't have any vendor-specific workarounds yet, there's no need to make this - // mapping in code. The "deviceName" string informally reveals the marketing name for the - // GPU. (e.g., Quadro) - const uint32_t driverVersion = deviceProperties.driverVersion; - const uint32_t vendorID = deviceProperties.vendorID; - const uint32_t deviceID = deviceProperties.deviceID; - const int major = VK_VERSION_MAJOR(deviceProperties.apiVersion); - const int minor = VK_VERSION_MINOR(deviceProperties.apiVersion); - - const FixedCapacityVector physicalDevices = filament::backend::enumerate( - vkEnumeratePhysicalDevices, instance); - - utils::slog.i << "Selected physical device '" - << deviceProperties.deviceName - << "' from " << physicalDevices.size() << " physical devices. " - << "(vendor " << utils::io::hex << vendorID << ", " - << "device " << deviceID << ", " - << "driver " << driverVersion << ", " - << utils::io::dec << "api " << major << "." << minor << ")" - << utils::io::endl; -} - -void printDepthFormats(VkPhysicalDevice device) { - // For diagnostic purposes, print useful information about available depth formats. - // Note that Vulkan is more constrained than OpenGL ES 3.1 in this area. - if constexpr (VK_ENABLE_VALIDATION && FILAMENT_VULKAN_VERBOSE) { - const VkFormatFeatureFlags required = VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | - VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT; - utils::slog.i << "Sampleable depth formats: "; - for (VkFormat format = (VkFormat) 1;;) { - VkFormatProperties props; - vkGetPhysicalDeviceFormatProperties(device, format, &props); - if ((props.optimalTilingFeatures & required) == required) { - utils::slog.i << format << " "; - } - if (format == VK_FORMAT_ASTC_12x12_SRGB_BLOCK) { - utils::slog.i << utils::io::endl; - break; - } - format = (VkFormat) (1 + (int) format); - } - } -} - -struct InstanceExtensions { - bool debugUtilsSupported = false; - bool portabilityEnumerationSupported = false; -}; - -struct DeviceExtensions { - bool debugMarkersSupported = false; - bool portabilitySubsetSupported = false; - bool maintenanceSupported[3] = {}; -}; - -InstanceExtensions getInstanceExtensions() { - InstanceExtensions exts; - // Determine if the VK_EXT_debug_utils instance extension is available. - const FixedCapacityVector availableExts = filament::backend::enumerate( - vkEnumerateInstanceExtensionProperties, - static_cast(nullptr) /* pLayerName */); - for (const auto& extProps : availableExts) { - if (!strcmp(extProps.extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)) { - exts.debugUtilsSupported = true; - } else if (!strcmp(extProps.extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)) { - exts.portabilityEnumerationSupported = true; - } - } - return exts; -} - -DeviceExtensions getDeviceExtensions(VkPhysicalDevice device) { - DeviceExtensions exts; - - // Identify supported physical device extensions - const FixedCapacityVector extensions = filament::backend::enumerate( - vkEnumerateDeviceExtensionProperties, device, - static_cast(nullptr) /* pLayerName */); - for (const auto& extension : extensions) { - if (!strcmp(extension.extensionName, VK_EXT_DEBUG_MARKER_EXTENSION_NAME)) { - exts.debugMarkersSupported = true; - } else if (!strcmp(extension.extensionName, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME)) { - exts.portabilitySubsetSupported = true; - } else if (!strcmp(extension.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) { - exts.maintenanceSupported[0] = true; - } else if (!strcmp(extension.extensionName, VK_KHR_MAINTENANCE2_EXTENSION_NAME)) { - exts.maintenanceSupported[1] = true; - } else if (!strcmp(extension.extensionName, VK_KHR_MAINTENANCE3_EXTENSION_NAME)) { - exts.maintenanceSupported[2] = true; - } - } - return exts; -} - -VkInstance createInstance(const char* const* ppRequiredExtensions, uint32_t requiredExtensionCount, - const InstanceExtensions& instExtensions) { - VkInstance instance; - VkInstanceCreateInfo instanceCreateInfo = {}; - bool validationFeaturesSupported = false; - -#if VK_ENABLE_VALIDATION - const auto enabledLayers = getEnabledLayers(); - if (!enabledLayers.empty()) { - // If layers are supported, Check if VK_EXT_validation_features is supported. - const FixedCapacityVector availableExts = - filament::backend::enumerate(vkEnumerateInstanceExtensionProperties, - "VK_LAYER_KHRONOS_validation"); - for (const auto& extProps : availableExts) { - if (!strcmp(extProps.extensionName, VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME)) { - validationFeaturesSupported = true; - break; - } - } - instanceCreateInfo.enabledLayerCount = (uint32_t) enabledLayers.size(); - instanceCreateInfo.ppEnabledLayerNames = enabledLayers.data(); - } else { -#if defined(__ANDROID__) - utils::slog.d << "Validation layers are not available; did you set jniLibs in your " - << "gradle file?" << utils::io::endl; -#else - utils::slog.d << "Validation layer not available; did you install the Vulkan SDK?\n" - << "Please ensure that VK_LAYER_PATH is set correctly." << utils::io::endl; -#endif - } -#endif // VK_ENABLE_VALIDATION - - // The Platform class can require 1 or 2 instance extensions, plus we'll request at most 5 - // instance extensions here in the common code. So that's a max of 7. - static constexpr uint32_t MAX_INSTANCE_EXTENSION_COUNT = 7; - const char* ppEnabledExtensions[MAX_INSTANCE_EXTENSION_COUNT]; - uint32_t enabledExtensionCount = 0; - - // Request all cross-platform extensions. - ppEnabledExtensions[enabledExtensionCount++] = VK_KHR_SURFACE_EXTENSION_NAME; - ppEnabledExtensions[enabledExtensionCount++] = VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME; -#if VK_ENABLE_VALIDATION && defined(__ANDROID__) - ppEnabledExtensions[enabledExtensionCount++] = VK_EXT_DEBUG_REPORT_EXTENSION_NAME; -#endif - if (validationFeaturesSupported) { - ppEnabledExtensions[enabledExtensionCount++] = VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME; - } - if (instExtensions.debugUtilsSupported) { - ppEnabledExtensions[enabledExtensionCount++] = VK_EXT_DEBUG_UTILS_EXTENSION_NAME; - } - if (instExtensions.portabilityEnumerationSupported) { - ppEnabledExtensions[enabledExtensionCount++] = VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME; - } - - // Request platform-specific extensions. - for (uint32_t i = 0; i < requiredExtensionCount; ++i) { - assert_invariant(enabledExtensionCount < MAX_INSTANCE_EXTENSION_COUNT); - ppEnabledExtensions[enabledExtensionCount++] = ppRequiredExtensions[i]; - } - - // Create the Vulkan instance. - VkApplicationInfo appInfo = {}; - appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; - appInfo.apiVersion = VK_MAKE_API_VERSION(0, - VK_REQUIRED_VERSION_MAJOR, VK_REQUIRED_VERSION_MINOR, 0); - instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; - instanceCreateInfo.pApplicationInfo = &appInfo; - instanceCreateInfo.enabledExtensionCount = enabledExtensionCount; - instanceCreateInfo.ppEnabledExtensionNames = ppEnabledExtensions; - if (instExtensions.portabilityEnumerationSupported) { - instanceCreateInfo.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; - } - - VkValidationFeaturesEXT features = {}; - VkValidationFeatureEnableEXT enables[] = { - VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT, - // TODO: Enable synchronization validation. - // VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT, - }; - if (validationFeaturesSupported) { - features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT; - features.enabledValidationFeatureCount = sizeof(enables) / sizeof(enables[0]); - features.pEnabledValidationFeatures = enables; - instanceCreateInfo.pNext = &features; - } - - VkResult result = vkCreateInstance(&instanceCreateInfo, VKALLOC, &instance); -#ifndef NDEBUG - if (result != VK_SUCCESS) { - utils::slog.e << "Unable to create instance: " << result << utils::io::endl; - } -#endif - ASSERT_POSTCONDITION(result == VK_SUCCESS, "Unable to create Vulkan instance."); - return instance; -} - -VkDevice createLogicalDevice(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceFeatures& features, - uint32_t graphicsQueueFamilyIndex, const DeviceExtensions& deviceExtensions) { - VkDevice device; - VkDeviceQueueCreateInfo deviceQueueCreateInfo[1] = {}; - const float queuePriority[] = {1.0f}; - VkDeviceCreateInfo deviceCreateInfo = {}; - FixedCapacityVector deviceExtensionNames; - deviceExtensionNames.reserve(6); - deviceExtensionNames.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME); - if (deviceExtensions.debugMarkersSupported) { - deviceExtensionNames.push_back(VK_EXT_DEBUG_MARKER_EXTENSION_NAME); - } - if (deviceExtensions.portabilitySubsetSupported) { - deviceExtensionNames.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME); - } - if (deviceExtensions.maintenanceSupported[0]) { - deviceExtensionNames.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME); - } - if (deviceExtensions.maintenanceSupported[1]) { - deviceExtensionNames.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME); - } - if (deviceExtensions.maintenanceSupported[2]) { - deviceExtensionNames.push_back(VK_KHR_MAINTENANCE3_EXTENSION_NAME); - } - deviceQueueCreateInfo->sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; - deviceQueueCreateInfo->queueFamilyIndex = graphicsQueueFamilyIndex; - deviceQueueCreateInfo->queueCount = 1; - deviceQueueCreateInfo->pQueuePriorities = &queuePriority[0]; - deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; - deviceCreateInfo.queueCreateInfoCount = 1; - deviceCreateInfo.pQueueCreateInfos = deviceQueueCreateInfo; - - // We could simply enable all supported features, but since that may have performance - // consequences let's just enable the features we need. - VkPhysicalDeviceFeatures enabledFeatures { - .samplerAnisotropy = features.samplerAnisotropy, - .textureCompressionETC2 = features.textureCompressionETC2, - .textureCompressionBC = features.textureCompressionBC, - }; - - deviceCreateInfo.pEnabledFeatures = &enabledFeatures; - deviceCreateInfo.enabledExtensionCount = (uint32_t)deviceExtensionNames.size(); - deviceCreateInfo.ppEnabledExtensionNames = deviceExtensionNames.data(); - - VkPhysicalDevicePortabilitySubsetFeaturesKHR portability = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR, - .pNext = nullptr, - .imageViewFormatSwizzle = VK_TRUE, - .mutableComparisonSamplers = VK_TRUE, - }; - if (deviceExtensions.portabilitySubsetSupported) { - deviceCreateInfo.pNext = &portability; - } - - VkResult result = vkCreateDevice(physicalDevice, &deviceCreateInfo, VKALLOC, &device); - ASSERT_POSTCONDITION(result == VK_SUCCESS, "vkCreateDevice error."); - - return device; -} - -// This method is used to enable/disable extensions based on external factors (i.e. -// driver/device workarounds). -void pruneExtensions(VkPhysicalDevice device, InstanceExtensions* instExtensions, - DeviceExtensions* deviceExtensions) { - if (vkGetPhysicalDeviceProperties2KHR) { - char* driverInfo = nullptr; - VkPhysicalDeviceDriverProperties driverProperties = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES, - }; - VkPhysicalDeviceProperties2 physicalDeviceProperties2 = { - .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, - .pNext = &driverProperties, - }; - vkGetPhysicalDeviceProperties2KHR(device, &physicalDeviceProperties2); - driverInfo = driverProperties.driverInfo; - - if (instExtensions->debugUtilsSupported) { - // Workaround for Mesa drivers. See issue #6192 - if (driverInfo && strstr(driverInfo, "Mesa")) { - instExtensions->debugUtilsSupported = false; - } - } - } - - // debugUtils and debugMarkers extensions are used mutually exclusively. - if (instExtensions->debugUtilsSupported && deviceExtensions->debugMarkersSupported) { - deviceExtensions->debugMarkersSupported = false; - } -} - -FixedCapacityVector getPhysicalDeviceQueueFamilyPropertiesHelper( - VkPhysicalDevice device) { - uint32_t queueFamiliesCount; - vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamiliesCount, nullptr); - FixedCapacityVector queueFamiliesProperties(queueFamiliesCount); - if (queueFamiliesCount > 0) { - vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamiliesCount, - queueFamiliesProperties.data()); - } - return queueFamiliesProperties; -} - -VkPhysicalDevice selectPhysicalDevice(VkInstance instance) { - const FixedCapacityVector physicalDevices = filament::backend::enumerate( - vkEnumeratePhysicalDevices, instance); - for (const auto& candidateDevice : physicalDevices) { - VkPhysicalDeviceProperties targetDeviceProperties; - vkGetPhysicalDeviceProperties(candidateDevice, &targetDeviceProperties); - - const int major = VK_VERSION_MAJOR(targetDeviceProperties.apiVersion); - const int minor = VK_VERSION_MINOR(targetDeviceProperties.apiVersion); - - // Does the device support the required Vulkan level? - if (major < VK_REQUIRED_VERSION_MAJOR) { - continue; - } - if (major == VK_REQUIRED_VERSION_MAJOR && minor < VK_REQUIRED_VERSION_MINOR) { - continue; - } - - // Does the device have any command queues that support graphics? - // In theory, we should also ensure that the device supports presentation of our - // particular VkSurface, but we don't have a VkSurface yet, so we'll skip this requirement. - const FixedCapacityVector queueFamiliesProperties = - getPhysicalDeviceQueueFamilyPropertiesHelper(candidateDevice); - bool foundGraphicsQueue = false; - for (const auto& props : queueFamiliesProperties) { - if (props.queueCount != 0 && props.queueFlags & VK_QUEUE_GRAPHICS_BIT) { - foundGraphicsQueue = true; - break; - } - } - if (!foundGraphicsQueue) { - continue; - } - - // Does the device support the VK_KHR_swapchain extension? - const FixedCapacityVector extensions = filament::backend::enumerate( - vkEnumerateDeviceExtensionProperties, candidateDevice, - static_cast(nullptr) /* pLayerName */); - bool supportsSwapchain = false; - for (const auto& extension : extensions) { - if (!strcmp(extension.extensionName, VK_KHR_SWAPCHAIN_EXTENSION_NAME)) { - supportsSwapchain = true; - break; - } - } - if (!supportsSwapchain) { - continue; - } - - return candidateDevice; - } - - PANIC_POSTCONDITION("Unable to find suitable device."); - return VK_NULL_HANDLE; -} - -VkFormat findSupportedFormat(VkPhysicalDevice device, utils::Slice candidates, - VkImageTiling tiling, VkFormatFeatureFlags features) { - for (VkFormat format : candidates) { - VkFormatProperties props; - vkGetPhysicalDeviceFormatProperties(device, format, &props); - if (tiling == VK_IMAGE_TILING_LINEAR && - (props.linearTilingFeatures & features) == features) { - return format; - } else if (tiling == VK_IMAGE_TILING_OPTIMAL && - (props.optimalTilingFeatures & features) == features) { - return format; - } - } - return VK_FORMAT_UNDEFINED; -} - } // end anonymous namespace namespace filament::backend { @@ -507,8 +44,8 @@ VkFormat VulkanAttachment::getFormat() const { return texture ? texture->getVkFormat() : VK_FORMAT_UNDEFINED; } -VkImageLayout VulkanAttachment::getLayout() const { - return texture ? texture->getVkLayout(layer, level) : VK_IMAGE_LAYOUT_UNDEFINED; +VulkanLayout VulkanAttachment::getLayout() const { + return texture ? texture->getLayout(layer, level) : VulkanLayout::UNDEFINED; } VkExtent2D VulkanAttachment::getExtent2D() const { @@ -516,182 +53,99 @@ VkExtent2D VulkanAttachment::getExtent2D() const { return { std::max(1u, texture->width >> level), std::max(1u, texture->height >> level) }; } -VkImageView VulkanAttachment::getImageView(VkImageAspectFlags aspect) const { +VkImageView VulkanAttachment::getImageView() { assert_invariant(texture); - return texture->getAttachmentView(level, layer, aspect); -} - -void VulkanContext::initialize(const char* const* ppRequiredExtensions, - uint32_t requiredExtensionCount) { - InstanceExtensions instExtensions = getInstanceExtensions(); - instance = createInstance(ppRequiredExtensions, requiredExtensionCount, instExtensions); - bluevk::bindInstance(instance); - - physicalDevice = selectPhysicalDevice(instance); - // Initialize the following fields: physicalDeviceProperties, memoryProperties, - // physicalDeviceFeatures, graphicsQueueFamilyIndex. - afterSelectPhysicalDevice(); - printDeviceInfo(instance, physicalDevice); - - DeviceExtensions deviceExtensions = getDeviceExtensions(physicalDevice); - pruneExtensions(physicalDevice, &instExtensions, &deviceExtensions); - - device = createLogicalDevice(physicalDevice, physicalDeviceFeatures, graphicsQueueFamilyIndex, - deviceExtensions); - // Initialize graphicsQueue, commandPool, timestamps, allocator, - // and command buffer manager (commands). - afterCreateLogicalDevice(); - - // Store the extension support in the context - debugUtilsSupported = instExtensions.debugUtilsSupported; - portabilityEnumerationSupported = instExtensions.portabilityEnumerationSupported; - debugMarkersSupported = deviceExtensions.debugMarkersSupported; - portabilitySubsetSupported = deviceExtensions.portabilitySubsetSupported; - for (int j = 0; j < 3; ++j) { - maintenanceSupported[j] = deviceExtensions.maintenanceSupported[j]; + VkImageSubresourceRange range = getSubresourceRange(); + if (range.layerCount > 1) { + return texture->getMultiviewAttachmentView(range); } + return texture->getAttachmentView(range); +} - // Initialize finalDepthFormat, debugCallback, and debugMessenger - afterCreateInstance(); +bool VulkanAttachment::isDepth() const { + return texture->getImageAspect() & VK_IMAGE_ASPECT_DEPTH_BIT; +} - printDepthFormats(physicalDevice); +VkImageSubresourceRange VulkanAttachment::getSubresourceRange() const { + assert_invariant(texture); + return { + .aspectMask = texture->getImageAspect(), + .baseMipLevel = uint32_t(level), + .levelCount = 1, + .baseArrayLayer = uint32_t(layer), + .layerCount = layerCount, + }; } -void VulkanContext::afterSelectPhysicalDevice() { - vkGetPhysicalDeviceProperties(physicalDevice, &physicalDeviceProperties); +VulkanTimestamps::VulkanTimestamps(VkDevice device) : mDevice(device) { + // Create a timestamp pool large enough to hold a pair of queries for each timer. + VkQueryPoolCreateInfo tqpCreateInfo = { + .sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, + .queryType = VK_QUERY_TYPE_TIMESTAMP, + }; + std::unique_lock lock(mMutex); + tqpCreateInfo.queryCount = mUsed.size() * 2; + VkResult result = vkCreateQueryPool(mDevice, &tqpCreateInfo, VKALLOC, &mPool); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) << "vkCreateQueryPool failed." + << " error=" << static_cast(result); + mUsed.reset(); +} - const FixedCapacityVector queueFamiliesProperties = - getPhysicalDeviceQueueFamilyPropertiesHelper(physicalDevice); - graphicsQueueFamilyIndex = 0xffff; - for (uint32_t j = 0; j < queueFamiliesProperties.size(); ++j) { - VkQueueFamilyProperties props = queueFamiliesProperties[j]; - if (props.queueCount != 0 && props.queueFlags & VK_QUEUE_GRAPHICS_BIT) { - graphicsQueueFamilyIndex = j; +std::tuple VulkanTimestamps::getNextQuery() { + std::unique_lock lock(mMutex); + size_t const maxTimers = mUsed.size(); + assert_invariant(mUsed.count() < maxTimers); + for (size_t timerIndex = 0; timerIndex < maxTimers; ++timerIndex) { + if (!mUsed.test(timerIndex)) { + mUsed.set(timerIndex); + return std::make_tuple(timerIndex * 2, timerIndex * 2 + 1); } } - - vkGetPhysicalDeviceFeatures(physicalDevice, &physicalDeviceFeatures); - vkGetPhysicalDeviceMemoryProperties(physicalDevice, &memoryProperties); + FVK_LOGE << "More than " << maxTimers << " timers are not supported." << utils::io::endl; + return std::make_tuple(0, 1); } -void VulkanContext::afterCreateLogicalDevice() { - vkGetDeviceQueue(device, graphicsQueueFamilyIndex, 0, - &graphicsQueue); - - VkCommandPoolCreateInfo createInfo = {}; - createInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; - createInfo.flags = - VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT; - createInfo.queueFamilyIndex = graphicsQueueFamilyIndex; - VkResult result = vkCreateCommandPool(device, &createInfo, VKALLOC, &commandPool); - ASSERT_POSTCONDITION(result == VK_SUCCESS, "vkCreateCommandPool error."); +void VulkanTimestamps::clearQuery(uint32_t queryIndex) { + mUsed.unset(queryIndex / 2); +} - // Create a timestamp pool large enough to hold a pair of queries for each timer. - VkQueryPoolCreateInfo tqpCreateInfo = {}; - tqpCreateInfo.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO; - tqpCreateInfo.queryType = VK_QUERY_TYPE_TIMESTAMP; +void VulkanTimestamps::beginQuery(VulkanCommandBuffer const* commands, + fvkmemory::resource_ptr query) { + uint32_t const index = query->getStartingQueryIndex(); - std::unique_lock timestamps_lock(timestamps.mutex); - tqpCreateInfo.queryCount = timestamps.used.size() * 2; - result = vkCreateQueryPool(device, &tqpCreateInfo, VKALLOC, ×tamps.pool); - ASSERT_POSTCONDITION(result == VK_SUCCESS, "vkCreateQueryPool error."); - timestamps.used.reset(); - timestamps_lock.unlock(); + auto const cmdbuffer = commands->buffer(); + vkCmdResetQueryPool(cmdbuffer, mPool, index, 2); + vkCmdWriteTimestamp(cmdbuffer, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, mPool, index); - const VmaVulkanFunctions funcs { -#if VMA_DYNAMIC_VULKAN_FUNCTIONS - .vkGetInstanceProcAddr = vkGetInstanceProcAddr, - .vkGetDeviceProcAddr = vkGetDeviceProcAddr, -#else - .vkGetPhysicalDeviceProperties = vkGetPhysicalDeviceProperties, - .vkGetPhysicalDeviceMemoryProperties = vkGetPhysicalDeviceMemoryProperties, - .vkAllocateMemory = vkAllocateMemory, - .vkFreeMemory = vkFreeMemory, - .vkMapMemory = vkMapMemory, - .vkUnmapMemory = vkUnmapMemory, - .vkFlushMappedMemoryRanges = vkFlushMappedMemoryRanges, - .vkInvalidateMappedMemoryRanges = vkInvalidateMappedMemoryRanges, - .vkBindBufferMemory = vkBindBufferMemory, - .vkBindImageMemory = vkBindImageMemory, - .vkGetBufferMemoryRequirements = vkGetBufferMemoryRequirements, - .vkGetImageMemoryRequirements = vkGetImageMemoryRequirements, - .vkCreateBuffer = vkCreateBuffer, - .vkDestroyBuffer = vkDestroyBuffer, - .vkCreateImage = vkCreateImage, - .vkDestroyImage = vkDestroyImage, - .vkCmdCopyBuffer = vkCmdCopyBuffer, - .vkGetBufferMemoryRequirements2KHR = vkGetBufferMemoryRequirements2KHR, - .vkGetImageMemoryRequirements2KHR = vkGetImageMemoryRequirements2KHR -#endif - }; - const VmaAllocatorCreateInfo allocatorInfo { - .physicalDevice = physicalDevice, - .device = device, - .pVulkanFunctions = &funcs, - .instance = instance - }; - vmaCreateAllocator(&allocatorInfo, &allocator); - commands = new VulkanCommands(device, graphicsQueueFamilyIndex); + // We stash this because getResult might come before the query is actually processed. + query->setFence(commands->getFenceStatus()); } -void VulkanContext::afterCreateInstance() { -#if VK_ENABLE_VALIDATION - UTILS_UNUSED const PFN_vkCreateDebugReportCallbackEXT createDebugReportCallback = - vkCreateDebugReportCallbackEXT; - VkResult result; - if (debugUtilsSupported) { - VkDebugUtilsMessengerCreateInfoEXT createInfo = { - .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, - .pNext = nullptr, - .flags = 0, - .messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, - .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, - .pfnUserCallback = debugUtilsCallback - }; - result = vkCreateDebugUtilsMessengerEXT(instance, &createInfo, VKALLOC, &debugMessenger); - ASSERT_POSTCONDITION(result == VK_SUCCESS, "Unable to create Vulkan debug messenger."); - } else if (createDebugReportCallback) { - const VkDebugReportCallbackCreateInfoEXT cbinfo = { - VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT, - nullptr, - VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, - debugReportCallback, - nullptr - }; - result = createDebugReportCallback(instance, &cbinfo, VKALLOC, &debugCallback); - ASSERT_POSTCONDITION(result == VK_SUCCESS, "Unable to create Vulkan debug callback."); - } -#endif - - // Choose a depth format that meets our requirements. Take care not to include stencil formats - // just yet, since that would require a corollary change to the "aspect" flags for the VkImage. - const VkFormat formats[] = { VK_FORMAT_D32_SFLOAT, VK_FORMAT_X8_D24_UNORM_PACK32 }; - finalDepthFormat = findSupportedFormat( - physicalDevice, utils::Slice(formats, formats + 2), VK_IMAGE_TILING_OPTIMAL, - VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT); +void VulkanTimestamps::endQuery(VulkanCommandBuffer const* commands, + fvkmemory::resource_ptr query) { + uint32_t const index = query->getStoppingQueryIndex(); + vkCmdWriteTimestamp(commands->buffer(), VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, mPool, index); } -uint32_t VulkanContext::selectMemoryType(uint32_t flags, VkFlags reqs) { - for (uint32_t i = 0; i < VK_MAX_MEMORY_TYPES; i++) { - if (flags & 1) { - if ((memoryProperties.memoryTypes[i].propertyFlags & reqs) == reqs) { - return i; - } - } - flags >>= 1; +VulkanTimestamps::QueryResult VulkanTimestamps::getResult( + fvkmemory::resource_ptr query) { + uint32_t const index = query->getStartingQueryIndex(); + QueryResult result; + size_t const dataSize = result.size() * sizeof(uint64_t); + VkDeviceSize const stride = sizeof(uint64_t) * 2; + VkResult vkresult = + vkGetQueryPoolResults(mDevice, mPool, index, 2, dataSize, (void*) result.data(), stride, + VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT); + FILAMENT_CHECK_POSTCONDITION(vkresult == VK_SUCCESS || vkresult == VK_NOT_READY) + << "vkGetQueryPoolResults error=" << static_cast(vkresult); + if (vkresult == VK_NOT_READY) { + return {0, 0, 0, 0}; } - ASSERT_POSTCONDITION(false, "Unable to find a memory type that meets requirements."); - return (uint32_t) ~0ul; + return result; } -void VulkanContext::createEmptyTexture(VulkanStagePool& stagePool) { - emptyTexture = new VulkanTexture(*this, SamplerType::SAMPLER_2D, 1, - TextureFormat::RGBA8, 1, 1, 1, 1, - TextureUsage::DEFAULT | TextureUsage::COLOR_ATTACHMENT | - TextureUsage::SUBPASS_INPUT, stagePool); - uint32_t black = 0; - PixelBufferDescriptor pbd(&black, 4, PixelDataFormat::RGBA, PixelDataType::UBYTE); - emptyTexture->updateImage(pbd, 1, 1, 1, 0, 0, 0, 0); +VulkanTimestamps::~VulkanTimestamps() { + vkDestroyQueryPool(mDevice, mPool, VKALLOC); } } // namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanContext.h b/filament/backend/src/vulkan/VulkanContext.h index 586000c6e47..67c4e52a9b7 100644 --- a/filament/backend/src/vulkan/VulkanContext.h +++ b/filament/backend/src/vulkan/VulkanContext.h @@ -17,13 +17,18 @@ #ifndef TNT_FILAMENT_BACKEND_VULKANCONTEXT_H #define TNT_FILAMENT_BACKEND_VULKANCONTEXT_H -#include "VulkanPipelineCache.h" -#include "VulkanCommands.h" #include "VulkanConstants.h" +#include "VulkanImageUtility.h" +#include "VulkanUtility.h" + +#include "vulkan/memory/ResourcePointer.h" #include -#include +#include #include +#include + +#include VK_DEFINE_HANDLE(VmaAllocator) VK_DEFINE_HANDLE(VmaPool) @@ -34,75 +39,149 @@ struct VulkanRenderTarget; struct VulkanSwapChain; struct VulkanTexture; class VulkanStagePool; +struct VulkanTimerQuery; +struct VulkanCommandBuffer; struct VulkanAttachment { - VulkanTexture* texture = nullptr; + fvkmemory::resource_ptr texture; uint8_t level = 0; - uint16_t layer = 0; + uint8_t layerCount = 1; + uint8_t layer = 0; + + bool isDepth() const; VkImage getImage() const; VkFormat getFormat() const; - VkImageLayout getLayout() const; + VulkanLayout getLayout() const; VkExtent2D getExtent2D() const; - VkImageView getImageView(VkImageAspectFlags aspect) const; + VkImageView getImageView(); + // TODO: maybe embed aspect into the attachment or texture itself. + VkImageSubresourceRange getSubresourceRange() const; }; -struct VulkanTimestamps { - VkQueryPool pool; - utils::bitset32 used; - utils::Mutex mutex; +class VulkanTimestamps { +public: + using QueryResult = std::array; + + VulkanTimestamps(VkDevice device); + ~VulkanTimestamps(); + + // Not copy-able. + VulkanTimestamps(VulkanTimestamps const&) = delete; + VulkanTimestamps& operator=(VulkanTimestamps const&) = delete; + + std::tuple getNextQuery(); + void clearQuery(uint32_t queryIndex); + + void beginQuery(VulkanCommandBuffer const* commands, + fvkmemory::resource_ptr query); + void endQuery(VulkanCommandBuffer const* commands, + fvkmemory::resource_ptr query); + QueryResult getResult(fvkmemory::resource_ptr query); + +private: + VkDevice mDevice; + VkQueryPool mPool; + utils::bitset32 mUsed; + utils::Mutex mMutex; }; struct VulkanRenderPass { - VulkanRenderTarget* renderTarget; + // Between the begin and end command render pass we cache the command buffer + VulkanCommandBuffer* commandBuffer; + fvkmemory::resource_ptr renderTarget; VkRenderPass renderPass; RenderPassParams params; int currentSubpass; }; -// For now we only support a single-device, single-instance scenario. Our concept of "context" is a -// bundle of state containing the Device, the Instance, and various globally-useful Vulkan objects. +// This is a collection of immutable data about the vulkan context. This actual handles to the +// context are stored in VulkanPlatform. struct VulkanContext { public: - void initialize(const char* const* ppRequiredExtensions, uint32_t requiredExtensionCount); - void createEmptyTexture(VulkanStagePool& stagePool); - uint32_t selectMemoryType(uint32_t flags, VkFlags reqs); + inline uint32_t selectMemoryType(uint32_t flags, VkFlags reqs) const { + if ((reqs & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0) { + assert_invariant(isProtectedMemorySupported() == true); + } + for (uint32_t i = 0; i < VK_MAX_MEMORY_TYPES; i++) { + if (flags & 1) { + if ((mMemoryProperties.memoryTypes[i].propertyFlags & reqs) == reqs) { + return i; + } + } + flags >>= 1; + } + return (uint32_t) VK_MAX_MEMORY_TYPES; + } + + inline VkFormatList const& getAttachmentDepthStencilFormats() const { + return mDepthStencilFormats; + } + + inline VkFormatList const& getBlittableDepthStencilFormats() const { + return mBlittableDepthStencilFormats; + } + + inline VkPhysicalDeviceLimits const& getPhysicalDeviceLimits() const noexcept { + return mPhysicalDeviceProperties.properties.limits; + } + + inline uint32_t getPhysicalDeviceVendorId() const noexcept { + return mPhysicalDeviceProperties.properties.vendorID; + } + + inline bool isImageCubeArraySupported() const noexcept { + return mPhysicalDeviceFeatures.features.imageCubeArray == VK_TRUE; + } + + inline bool isDepthClampSupported() const noexcept { + return mPhysicalDeviceFeatures.features.depthClamp == VK_TRUE; + } + + inline bool isDebugMarkersSupported() const noexcept { + return mDebugMarkersSupported; + } + + inline bool isDebugUtilsSupported() const noexcept { + return mDebugUtilsSupported; + } + + inline bool isMultiviewEnabled() const noexcept { + return mMultiviewEnabled; + } + + inline bool isClipDistanceSupported() const noexcept { + return mPhysicalDeviceFeatures.features.shaderClipDistance == VK_TRUE; + } + + inline bool isLazilyAllocatedMemorySupported() const noexcept { + return mLazilyAllocatedMemorySupported; + } + + inline bool isProtectedMemorySupported() const noexcept { + return mProtectedMemorySupported; + } private: - void afterSelectPhysicalDevice(); - void afterCreateLogicalDevice(); - void afterCreateInstance(); + VkPhysicalDeviceMemoryProperties mMemoryProperties = {}; + VkPhysicalDeviceProperties2 mPhysicalDeviceProperties = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2 + }; + VkPhysicalDeviceFeatures2 mPhysicalDeviceFeatures = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2 + }; + bool mDebugMarkersSupported = false; + bool mDebugUtilsSupported = false; + bool mMultiviewEnabled = false; + bool mLazilyAllocatedMemorySupported = false; + bool mProtectedMemorySupported = false; -public: - VkInstance instance; - VkPhysicalDevice physicalDevice; - VkPhysicalDeviceProperties physicalDeviceProperties; - VkPhysicalDeviceFeatures physicalDeviceFeatures; - VkPhysicalDeviceMemoryProperties memoryProperties; - VkDevice device; - VkCommandPool commandPool; - VulkanTimestamps timestamps; - uint32_t graphicsQueueFamilyIndex; - VkQueue graphicsQueue; - bool debugMarkersSupported = false; - bool debugUtilsSupported = false; - bool portabilitySubsetSupported = false; - bool portabilityEnumerationSupported = false; - bool maintenanceSupported[3] = {}; - VulkanPipelineCache::RasterState rasterState; - VulkanSwapChain* currentSwapChain; - VulkanRenderTarget* defaultRenderTarget; - VulkanRenderPass currentRenderPass; - VkViewport viewport; - VkFormat finalDepthFormat; - VmaAllocator allocator; - VulkanTexture* emptyTexture = nullptr; - VulkanCommands* commands = nullptr; - VkDebugReportCallbackEXT debugCallback = VK_NULL_HANDLE; - VkDebugUtilsMessengerEXT debugMessenger = VK_NULL_HANDLE; - - std::string currentDebugMarker; + VkFormatList mDepthStencilFormats; + VkFormatList mBlittableDepthStencilFormats; + + // For convenience so that VulkanPlatform can initialize the private fields. + friend class VulkanPlatform; }; -} // namespace filament::backend +}// namespace filament::backend -#endif // TNT_FILAMENT_BACKEND_VULKANCONTEXT_H +#endif// TNT_FILAMENT_BACKEND_VULKANCONTEXT_H diff --git a/filament/backend/src/vulkan/VulkanDisposer.cpp b/filament/backend/src/vulkan/VulkanDisposer.cpp deleted file mode 100644 index 12774cc23ca..00000000000 --- a/filament/backend/src/vulkan/VulkanDisposer.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "VulkanDisposer.h" -#include "VulkanConstants.h" - -#include -#include - -namespace filament::backend { - -// Always wait at least 3 frames after a DriverAPI-level resource has been destroyed for safe -// destruction, due to potential usage by outstanding command buffers and triple buffering. -static constexpr uint32_t FRAMES_BEFORE_EVICTION = VK_MAX_COMMAND_BUFFERS; - -void VulkanDisposer::createDisposable(Key resource, std::function destructor) noexcept { - mDisposables[resource].destructor = destructor; -} - -void VulkanDisposer::removeReference(Key resource) noexcept { - // Null can be passed in as a no-op, this is not an error. - if (resource == nullptr) { - return; - } - assert_invariant(mDisposables[resource].refcount > 0); - --mDisposables[resource].refcount; -} - -void VulkanDisposer::acquire(Key resource) noexcept { - // It's fine to "acquire" a non-managed resource, it's just a no-op. - if (resource == nullptr) { - return; - } - auto iter = mDisposables.find(resource); - if (iter == mDisposables.end()) { - return; - } - Disposable& disposable = iter.value(); - assert_invariant(disposable.refcount > 0 && disposable.refcount < 65535); - - // If an auto-decrement is already in place, do not increase the ref count. - if (disposable.remainingFrames == 0) { - ++disposable.refcount; - } - - disposable.remainingFrames = FRAMES_BEFORE_EVICTION; -} - -void VulkanDisposer::gc() noexcept { - // First decrement the frame count of all resources that were held by a command buffer. - // If any of these reaches zero, decrement its reference count. - for (auto iter = mDisposables.begin(); iter != mDisposables.end(); ++iter) { - Disposable& disposable = iter.value(); - if (disposable.refcount > 0 && disposable.remainingFrames > 0) { - if (--disposable.remainingFrames == 0) { - removeReference(iter.key()); - } - } - } - - // Next, destroy all resources with a zero refcount. - decltype(mDisposables) disposables; - for (auto iter : mDisposables) { - Disposable& disposable = iter.second; - if (disposable.refcount == 0) { - disposable.destructor(); - } else { - disposables.insert({iter.first, disposable}); - } - } - disposables.swap(mDisposables); -} - -void VulkanDisposer::reset() noexcept { -#ifndef NDEBUG - utils::slog.i << mDisposables.size() << " disposables are outstanding." << utils::io::endl; -#endif - for (auto iter : mDisposables) { - iter.second.destructor(); - } - mDisposables.clear(); -} - -} // namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanDisposer.h b/filament/backend/src/vulkan/VulkanDisposer.h deleted file mode 100644 index a8ac5b1968d..00000000000 --- a/filament/backend/src/vulkan/VulkanDisposer.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef TNT_FILAMENT_BACKEND_VULKANDISPOSER_H -#define TNT_FILAMENT_BACKEND_VULKANDISPOSER_H - -#include - -#include - -namespace filament::backend { - -// VulkanDisposer tracks resources (such as textures or vertex buffers) that need deferred -// destruction due to potential use by a Vulkan command buffer. Resources are represented with void* -// to allow callers to use any type of handle. -class VulkanDisposer { -public: - using Key = const void*; - - // Adds the given resource to the disposer and sets its reference count to 1. - void createDisposable(Key resource, std::function destructor) noexcept; - - // Decrements the reference count. - void removeReference(Key resource) noexcept; - - // Increments the reference count and auto-decrements it after FRAMES_BEFORE_EVICTION frames. - // This is used to indicate that the current command buffer has a reference to the resource. - void acquire(Key resource) noexcept; - - // Invokes the destructor function for each disposable with a 0 refcount. - void gc() noexcept; - - // Invokes the destructor function for all disposables, regardless of reference count. - void reset() noexcept; - -private: - struct Disposable { - uint16_t refcount = 1; - uint16_t remainingFrames = 0; - std::function destructor = []() {}; - }; - tsl::robin_map mDisposables; -}; - -} // namespace filament::backend - -#endif // TNT_FILAMENT_BACKEND_VULKANDISPOSER_H diff --git a/filament/backend/src/vulkan/VulkanDriver.cpp b/filament/backend/src/vulkan/VulkanDriver.cpp index a50abb0017e..3d3ad700381 100644 --- a/filament/backend/src/vulkan/VulkanDriver.cpp +++ b/filament/backend/src/vulkan/VulkanDriver.cpp @@ -14,15 +14,20 @@ * limitations under the License. */ -#include "vulkan/VulkanDriver.h" +#include "VulkanDriver.h" #include "CommandStreamDispatcher.h" #include "DataReshaper.h" +#include "SystraceProfile.h" +#include "VulkanAsyncHandles.h" #include "VulkanBuffer.h" #include "VulkanCommands.h" #include "VulkanDriverFactory.h" #include "VulkanHandles.h" #include "VulkanMemory.h" +#include "VulkanTexture.h" +#include "memory/ResourceManager.h" +#include "memory/ResourcePointer.h" #include @@ -31,7 +36,7 @@ #include #ifndef NDEBUG -#include +#include // For VulkanDriver::debugCommandBegin #endif using namespace bluevk; @@ -46,51 +51,244 @@ using utils::FixedCapacityVector; namespace filament::backend { -Driver* VulkanDriverFactory::create(VulkanPlatform* const platform, - const char* const* ppRequiredExtensions, uint32_t requiredExtensionCount, const Platform::DriverConfig& driverConfig) noexcept { - return VulkanDriver::create(platform, ppRequiredExtensions, requiredExtensionCount, driverConfig); +namespace { + +VmaAllocator createAllocator(VkInstance instance, VkPhysicalDevice physicalDevice, + VkDevice device) { + VmaAllocator allocator; + VmaVulkanFunctions const funcs { +#if VMA_DYNAMIC_VULKAN_FUNCTIONS + .vkGetInstanceProcAddr = vkGetInstanceProcAddr, + .vkGetDeviceProcAddr = vkGetDeviceProcAddr, +#else + .vkGetPhysicalDeviceProperties = vkGetPhysicalDeviceProperties, + .vkGetPhysicalDeviceMemoryProperties = vkGetPhysicalDeviceMemoryProperties, + .vkAllocateMemory = vkAllocateMemory, + .vkFreeMemory = vkFreeMemory, + .vkMapMemory = vkMapMemory, + .vkUnmapMemory = vkUnmapMemory, + .vkFlushMappedMemoryRanges = vkFlushMappedMemoryRanges, + .vkInvalidateMappedMemoryRanges = vkInvalidateMappedMemoryRanges, + .vkBindBufferMemory = vkBindBufferMemory, + .vkBindImageMemory = vkBindImageMemory, + .vkGetBufferMemoryRequirements = vkGetBufferMemoryRequirements, + .vkGetImageMemoryRequirements = vkGetImageMemoryRequirements, + .vkCreateBuffer = vkCreateBuffer, + .vkDestroyBuffer = vkDestroyBuffer, + .vkCreateImage = vkCreateImage, + .vkDestroyImage = vkDestroyImage, + .vkCmdCopyBuffer = vkCmdCopyBuffer, + .vkGetBufferMemoryRequirements2KHR = vkGetBufferMemoryRequirements2KHR, + .vkGetImageMemoryRequirements2KHR = vkGetImageMemoryRequirements2KHR +#endif + }; + VmaAllocatorCreateInfo const allocatorInfo { + .physicalDevice = physicalDevice, + .device = device, + .pVulkanFunctions = &funcs, + .instance = instance, + }; + vmaCreateAllocator(&allocatorInfo, &allocator); + return allocator; +} + +#if FVK_ENABLED(FVK_DEBUG_VALIDATION) +VKAPI_ATTR VkBool32 VKAPI_CALL debugReportCallback(VkDebugReportFlagsEXT flags, + VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, + int32_t messageCode, const char* pLayerPrefix, const char* pMessage, void* pUserData) { + if (flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { + FVK_LOGE << "VULKAN ERROR: (" << pLayerPrefix << ") " << pMessage << utils::io::endl; + } else { + // TODO: emit best practices warnings about aggressive pipeline barriers. + if (strstr(pMessage, "ALL_GRAPHICS_BIT") || strstr(pMessage, "ALL_COMMANDS_BIT")) { + return VK_FALSE; + } + FVK_LOGW << "VULKAN WARNING: (" << pLayerPrefix << ") " << pMessage << utils::io::endl; + } + FVK_LOGE << utils::io::endl; + return VK_FALSE; +} +#endif // FVK_ENABLED(FVK_DEBUG_VALIDATION) + +#if FVK_ENABLED(FVK_DEBUG_DEBUG_UTILS) +VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsCallback(VkDebugUtilsMessageSeverityFlagBitsEXT severity, + VkDebugUtilsMessageTypeFlagsEXT types, const VkDebugUtilsMessengerCallbackDataEXT* cbdata, + void* pUserData) { + if (severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) { + FVK_LOGE << "VULKAN ERROR: (" << cbdata->pMessageIdName << ") " << cbdata->pMessage + << utils::io::endl; + } else { + // TODO: emit best practices warnings about aggressive pipeline barriers. + if (strstr(cbdata->pMessage, "ALL_GRAPHICS_BIT") + || strstr(cbdata->pMessage, "ALL_COMMANDS_BIT")) { + return VK_FALSE; + } + FVK_LOGW << "VULKAN WARNING: (" << cbdata->pMessageIdName << ") " << cbdata->pMessage + << utils::io::endl; + } + FVK_LOGE << utils::io::endl; + return VK_FALSE; +} +#endif // FVK_ENABLED(FVK_DEBUG_DEBUG_UTILS) + + +}// anonymous namespace + +#if FVK_ENABLED(FVK_DEBUG_DEBUG_UTILS) +using DebugUtils = VulkanDriver::DebugUtils; +DebugUtils* DebugUtils::mSingleton = nullptr; + +DebugUtils::DebugUtils(VkInstance instance, VkDevice device, VulkanContext const* context) + : mInstance(instance), mDevice(device), mEnabled(context->isDebugUtilsSupported()) { + +#if FVK_ENABLED(FVK_DEBUG_VALIDATION) + // Also initialize debug utils messenger here + if (mEnabled) { + VkDebugUtilsMessengerCreateInfoEXT const createInfo = { + .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, + .pNext = nullptr, + .flags = 0, + .messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT + | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, + .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT + | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, + .pfnUserCallback = debugUtilsCallback, + }; + VkResult result = vkCreateDebugUtilsMessengerEXT(instance, &createInfo, + VKALLOC, &mDebugMessenger); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) + << "Unable to create Vulkan debug messenger. error=" + << static_cast(result); + } +#endif // FVK_ENABLED(FVK_DEBUG_VALIDATION) +} + +DebugUtils* DebugUtils::get() { + assert_invariant(DebugUtils::mSingleton); + return DebugUtils::mSingleton; +} + +DebugUtils::~DebugUtils() { + if (mDebugMessenger) { + vkDestroyDebugUtilsMessengerEXT(mInstance, mDebugMessenger, VKALLOC); + } +} + +void DebugUtils::setName(VkObjectType type, uint64_t handle, char const* name) { + auto impl = DebugUtils::get(); + if (!impl->mEnabled) { + return; + } + VkDebugUtilsObjectNameInfoEXT const info = { + .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, + .pNext = nullptr, + .objectType = type, + .objectHandle = handle, + .pObjectName = name, + }; + vkSetDebugUtilsObjectNameEXT(impl->mDevice, &info); } +#endif // FVK_ENABLED(FVK_DEBUG_DEBUG_UTILS) Dispatcher VulkanDriver::getDispatcher() const noexcept { return ConcreteDispatcher::make(); } -VulkanDriver::VulkanDriver(VulkanPlatform* platform, - const char* const* ppRequiredExtensions, uint32_t requiredExtensionCount, - const Platform::DriverConfig& driverConfig) noexcept : - mHandleAllocator("Handles", driverConfig.handleArenaSize), - mContextManager(*platform), - mStagePool(mContext), - mFramebufferCache(mContext), - mSamplerCache(mContext), - mBlitter(mContext, mStagePool, mPipelineCache, mFramebufferCache, mSamplerCache) { - mContext.rasterState = mPipelineCache.getDefaultRasterState(); - - // Load Vulkan entry points. - ASSERT_POSTCONDITION(bluevk::initialize(), "BlueVK is unable to load entry points."); +VulkanDriver::VulkanDriver(VulkanPlatform* platform, VulkanContext const& context, + Platform::DriverConfig const& driverConfig) noexcept + : mPlatform(platform), + mResourceManager(driverConfig.handleArenaSize, driverConfig.disableHandleUseAfterFreeCheck), + mAllocator(createAllocator(mPlatform->getInstance(), mPlatform->getPhysicalDevice(), + mPlatform->getDevice())), + mContext(context), + mCommands(mPlatform->getDevice(), mPlatform->getGraphicsQueue(), + mPlatform->getGraphicsQueueFamilyIndex(), mPlatform->getProtectedGraphicsQueue(), + mPlatform->getProtectedGraphicsQueueFamilyIndex(), &mContext), + mPipelineLayoutCache(mPlatform->getDevice()), + mPipelineCache(mPlatform->getDevice(), mAllocator), + mStagePool(mAllocator, &mCommands), + mFramebufferCache(mPlatform->getDevice()), + mSamplerCache(mPlatform->getDevice()), + mBlitter(mPlatform->getPhysicalDevice(), &mCommands), + mReadPixels(mPlatform->getDevice()), + mDescriptorSetManager(mPlatform->getDevice(), &mResourceManager), + mIsSRGBSwapChainSupported(mPlatform->getCustomization().isSRGBSwapChainSupported), + mStereoscopicType(driverConfig.stereoscopicType) { + +#if FVK_ENABLED(FVK_DEBUG_DEBUG_UTILS) + DebugUtils::mSingleton = + new DebugUtils(mPlatform->getInstance(), mPlatform->getDevice(), &context); +#endif - mContext.initialize(ppRequiredExtensions, requiredExtensionCount); - mContext.createEmptyTexture(mStagePool); +#if FVK_ENABLED(FVK_DEBUG_VALIDATION) + UTILS_UNUSED const PFN_vkCreateDebugReportCallbackEXT createDebugReportCallback + = vkCreateDebugReportCallbackEXT; + if (!context.isDebugUtilsSupported() && createDebugReportCallback) { + VkDebugReportCallbackCreateInfoEXT const cbinfo = { + .sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT, + .flags = VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, + .pfnCallback = debugReportCallback, + }; + VkResult result = createDebugReportCallback(mPlatform->getInstance(), &cbinfo, VKALLOC, + &mDebugCallback); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) + << "Unable to create Vulkan debug callback." + << " error=" << static_cast(result); + } +#endif - mContext.commands->setObserver(&mPipelineCache); - mPipelineCache.setDevice(mContext.device, mContext.allocator); - mPipelineCache.setDummyTexture(mContext.emptyTexture->getPrimaryImageView()); + mTimestamps = std::make_unique(mPlatform->getDevice()); } VulkanDriver::~VulkanDriver() noexcept = default; UTILS_NOINLINE -Driver* VulkanDriver::create(VulkanPlatform* const platform, - const char* const* ppEnabledExtensions, uint32_t enabledExtensionCount, - const Platform::DriverConfig& driverConfig) noexcept { +Driver* VulkanDriver::create(VulkanPlatform* platform, VulkanContext const& context, + Platform::DriverConfig const& driverConfig) noexcept { +#if 0 + // this is useful for development, but too verbose even for debug builds + // For reference on a 64-bits machine in Release mode: + // HwStream : 24 few + // VulkanFence : 32 few + // VulkanProgram : 32 moderate + // VulkanIndexBuffer : 64 moderate + // VulkanBufferObject : 64 many + // -- less than or equal 64 bytes + // VulkanRenderPrimitive : 72 many + // VulkanVertexBufferInfo : 96 moderate + // VulkanSwapChain : 104 few + // VulkanTimerQuery : 160 few + // -- less than or equal 160 bytes + // VulkanVertexBuffer : 192 moderate + // VulkanTexture : 224 moderate + // VulkanRenderTarget : 312 few + // -- less than or equal to 312 bytes + + FVK_LOGD + << "\nVulkanSwapChain: " << sizeof(VulkanSwapChain) + << "\nVulkanBufferObject: " << sizeof(VulkanBufferObject) + << "\nVulkanVertexBuffer: " << sizeof(VulkanVertexBuffer) + << "\nVulkanVertexBufferInfo: " << sizeof(VulkanVertexBufferInfo) + << "\nVulkanIndexBuffer: " << sizeof(VulkanIndexBuffer) + << "\nVulkanRenderPrimitive: " << sizeof(VulkanRenderPrimitive) + << "\nVulkanTexture: " << sizeof(VulkanTexture) + << "\nVulkanTimerQuery: " << sizeof(VulkanTimerQuery) + << "\nHwStream: " << sizeof(HwStream) + << "\nVulkanRenderTarget: " << sizeof(VulkanRenderTarget) + << "\nVulkanFence: " << sizeof(VulkanFence) + << "\nVulkanProgram: " << sizeof(VulkanProgram) + << utils::io::endl; +#endif + assert_invariant(platform); - size_t defaultSize = FILAMENT_VULKAN_HANDLE_ARENA_SIZE_IN_MB * 1024U * 1024U; - Platform::DriverConfig validConfig{ .handleArenaSize = std::max(driverConfig.handleArenaSize, defaultSize) }; - return new VulkanDriver(platform, ppEnabledExtensions, enabledExtensionCount, validConfig); + size_t defaultSize = FVK_HANDLE_ARENA_SIZE_IN_MB * 1024U * 1024U; + Platform::DriverConfig validConfig {driverConfig}; + validConfig.handleArenaSize = std::max(driverConfig.handleArenaSize, defaultSize); + return new VulkanDriver(platform, context, validConfig); } ShaderModel VulkanDriver::getShaderModel() const noexcept { -#if defined(__ANDROID__) || defined(IOS) +#if defined(__ANDROID__) || defined(FILAMENT_IOS) return ShaderModel::MOBILE; #else return ShaderModel::DESKTOP; @@ -98,42 +296,54 @@ ShaderModel VulkanDriver::getShaderModel() const noexcept { } void VulkanDriver::terminate() { - if (!mContext.instance) { - return; - } + // Flush and wait here to make sure all queued commands are executed and resources that are tied + // to those commands are no longer referenced. + finish(0); - delete mContext.commands; - delete mContext.emptyTexture; + mCurrentSwapChain = {}; + mDefaultRenderTarget = {}; + mBoundPipeline = {}; - mBlitter.shutdown(); + mTimestamps.reset(); - // Allow the stage pool and disposer to clean up. + mBlitter.terminate(); + mReadPixels.terminate(); + + // Allow the stage pool to clean up. mStagePool.gc(); - mDisposer.reset(); - mStagePool.reset(); - mPipelineCache.destroyCache(); + mCommands.terminate(); + + mStagePool.terminate(); + mPipelineCache.terminate(); mFramebufferCache.reset(); - mSamplerCache.reset(); + mSamplerCache.terminate(); + mDescriptorSetManager.terminate(); + mPipelineLayoutCache.terminate(); - vmaDestroyAllocator(mContext.allocator); + // Before terminating ResourceManager, we must make sure all of the resource_ptrs have been unset. + mResourceManager.terminate(); - vkDestroyQueryPool(mContext.device, mContext.timestamps.pool, VKALLOC); - vkDestroyCommandPool(mContext.device, mContext.commandPool, VKALLOC); - vkDestroyDevice(mContext.device, VKALLOC); - if (mContext.debugCallback) { - vkDestroyDebugReportCallbackEXT(mContext.instance, mContext.debugCallback, VKALLOC); - } - if (mContext.debugMessenger) { - vkDestroyDebugUtilsMessengerEXT(mContext.instance, mContext.debugMessenger, VKALLOC); +#if FVK_ENABLED(FVK_DEBUG_RESOURCE_LEAK) + mResourceManager.print(); +#endif + + vmaDestroyAllocator(mAllocator); + + if (mDebugCallback) { + vkDestroyDebugReportCallbackEXT(mPlatform->getInstance(), mDebugCallback, VKALLOC); } - vkDestroyInstance(mContext.instance, VKALLOC); - mContext.device = nullptr; - mContext.instance = nullptr; + +#if FVK_ENABLED(FVK_DEBUG_DEBUG_UTILS) + assert_invariant(DebugUtils::mSingleton); + delete DebugUtils::mSingleton; +#endif + + mPlatform->terminate(); } void VulkanDriver::tick(int) { - mContext.commands->updateFences(); + mCommands.updateFences(); } // Garbage collection should not occur too frequently, only about once per frame. Internally, the @@ -141,139 +351,224 @@ void VulkanDriver::tick(int) { // rather than the wall clock, because we must wait 3 frames after a DriverAPI-level resource has // been destroyed for safe destruction, due to outstanding command buffers and triple buffering. void VulkanDriver::collectGarbage() { + FVK_SYSTRACE_SCOPE(); + // Command buffers need to be submitted and completed before other resources can be gc'd. + mCommands.gc(); + mDescriptorSetManager.clearHistory(); mStagePool.gc(); mFramebufferCache.gc(); - mDisposer.gc(); - mContext.commands->gc(); -} + mPipelineCache.gc(); + + mResourceManager.gc(); -void VulkanDriver::beginFrame(int64_t monotonic_clock_ns, uint32_t frameId) { +#if FVK_ENABLED(FVK_DEBUG_RESOURCE_LEAK) + mResourceManager.print(); +#endif +} +void VulkanDriver::beginFrame(int64_t monotonic_clock_ns, + int64_t refreshIntervalNs, uint32_t frameId) { + FVK_PROFILE_MARKER(PROFILE_NAME_BEGINFRAME); // Do nothing. } -void VulkanDriver::setFrameScheduledCallback(Handle sch, - FrameScheduledCallback callback, void* user) { - +void VulkanDriver::setFrameScheduledCallback(Handle sch, CallbackHandler* handler, + FrameScheduledCallback&& callback, uint64_t flags) { } void VulkanDriver::setFrameCompletedCallback(Handle sch, - FrameCompletedCallback callback, void* user) { - + CallbackHandler* handler, utils::Invocable&& callback) { } void VulkanDriver::setPresentationTime(int64_t monotonic_clock_ns) { } void VulkanDriver::endFrame(uint32_t frameId) { - if (mContext.commands->flush()) { - collectGarbage(); - } + FVK_PROFILE_MARKER(PROFILE_NAME_ENDFRAME); + mCommands.flush(); + collectGarbage(); +} + +void VulkanDriver::updateDescriptorSetBuffer( + backend::DescriptorSetHandle dsh, + backend::descriptor_binding_t binding, + backend::BufferObjectHandle boh, + uint32_t offset, + uint32_t size) { + FVK_SYSTRACE_SCOPE(); + auto set = resource_ptr::cast(&mResourceManager, dsh); + auto buffer = resource_ptr::cast(&mResourceManager, boh); + mDescriptorSetManager.updateBuffer(set, binding, buffer, offset, size); +} + +void VulkanDriver::updateDescriptorSetTexture( + backend::DescriptorSetHandle dsh, + backend::descriptor_binding_t binding, + backend::TextureHandle th, + SamplerParams params) { + FVK_SYSTRACE_SCOPE(); + auto set = resource_ptr::cast(&mResourceManager, dsh); + auto texture = resource_ptr::cast(&mResourceManager, th); + + VkSampler const vksampler = mSamplerCache.getSampler(params); + mDescriptorSetManager.updateSampler(set, binding, texture, vksampler); } void VulkanDriver::flush(int) { - mContext.commands->flush(); + FVK_SYSTRACE_SCOPE(); + mCommands.flush(); } void VulkanDriver::finish(int dummy) { - mContext.commands->flush(); -} + FVK_SYSTRACE_SCOPE(); + + mCommands.flush(); + mCommands.wait(); -void VulkanDriver::createSamplerGroupR(Handle sbh, uint32_t count) { - construct(sbh, count); + mReadPixels.runUntilComplete(); } void VulkanDriver::createRenderPrimitiveR(Handle rph, Handle vbh, Handle ibh, - PrimitiveType pt, uint32_t offset, - uint32_t minIndex, uint32_t maxIndex, uint32_t count) { - construct(rph); - VulkanDriver::setRenderPrimitiveBuffer(rph, vbh, ibh); - VulkanDriver::setRenderPrimitiveRange(rph, pt, offset, minIndex, maxIndex, count); + PrimitiveType pt) { + auto vb = resource_ptr::cast(&mResourceManager, vbh); + auto ib = resource_ptr::cast(&mResourceManager, ibh); + auto ptr = resource_ptr::make(&mResourceManager, rph, pt, vb, ib); + ptr.inc(); } void VulkanDriver::destroyRenderPrimitive(Handle rph) { - if (rph) { - destruct(rph); + if (!rph) { + return; + } + auto ptr = resource_ptr::cast(&mResourceManager, rph); + ptr.dec(); +} + +void VulkanDriver::createVertexBufferInfoR(Handle vbih, uint8_t bufferCount, + uint8_t attributeCount, AttributeArray attributes) { + auto vbi = resource_ptr::make(&mResourceManager, vbih, bufferCount, + attributeCount, attributes); + vbi.inc(); +} + +void VulkanDriver::destroyVertexBufferInfo(Handle vbih) { + if (!vbih) { + return; } + auto vbi = resource_ptr::cast(&mResourceManager, vbih); + vbi.dec(); } -void VulkanDriver::createVertexBufferR(Handle vbh, uint8_t bufferCount, - uint8_t attributeCount, uint32_t elementCount, AttributeArray attributes) { - auto vertexBuffer = construct(vbh, mContext, mStagePool, - bufferCount, attributeCount, elementCount, attributes); - mDisposer.createDisposable(vertexBuffer, [this, vbh] () { - destruct(vbh); - }); +void VulkanDriver::createVertexBufferR(Handle vbh, uint32_t vertexCount, + Handle vbih) { + auto vbi = resource_ptr::cast(&mResourceManager, vbih); + auto vb = resource_ptr::make(&mResourceManager, vbh, mContext, mStagePool, + vertexCount, vbi); + vb.inc(); } void VulkanDriver::destroyVertexBuffer(Handle vbh) { - if (vbh) { - auto vertexBuffer = handle_cast(vbh); - mDisposer.removeReference(vertexBuffer); + if (!vbh) { + return; } + auto vb = resource_ptr::cast(&mResourceManager, vbh); + vb.dec(); } -void VulkanDriver::createIndexBufferR(Handle ibh, - ElementType elementType, uint32_t indexCount, BufferUsage usage) { +void VulkanDriver::createIndexBufferR(Handle ibh, ElementType elementType, + uint32_t indexCount, BufferUsage usage) { auto elementSize = (uint8_t) getElementTypeSize(elementType); - auto indexBuffer = construct(ibh, mContext, mStagePool, + auto ib = resource_ptr::make(&mResourceManager, ibh, mAllocator, mStagePool, elementSize, indexCount); - mDisposer.createDisposable(indexBuffer, [this, ibh] () { - destruct(mContext, ibh); - }); + ib.inc(); } void VulkanDriver::destroyIndexBuffer(Handle ibh) { - if (ibh) { - auto indexBuffer = handle_cast(ibh); - mDisposer.removeReference(indexBuffer); + if (!ibh) { + return; } + auto ib = resource_ptr::cast(&mResourceManager, ibh); + ib.dec(); } -void VulkanDriver::createBufferObjectR(Handle boh, - uint32_t byteCount, BufferObjectBinding bindingType, BufferUsage usage) { - auto bufferObject = construct(boh, mContext, mStagePool, byteCount, - bindingType, usage); - mDisposer.createDisposable(bufferObject, [this, boh] () { - destruct(mContext, boh); - }); +void VulkanDriver::createBufferObjectR(Handle boh, uint32_t byteCount, + BufferObjectBinding bindingType, BufferUsage usage) { + auto bo = resource_ptr::make(&mResourceManager, boh, mAllocator, mStagePool, + byteCount, bindingType); + bo.inc(); } void VulkanDriver::destroyBufferObject(Handle boh) { - if (boh) { - auto bufferObject = handle_cast(boh); - if (bufferObject->bindingType == BufferObjectBinding::UNIFORM) { - mPipelineCache.unbindUniformBuffer(bufferObject->buffer.getGpuBuffer()); - // Decrement the refcount of the uniform buffer, but schedule it for destruction a few - // frames in the future. To be safe, we need to assume that the current command buffer is - // still using it somewhere. - mDisposer.acquire(bufferObject); - } - mDisposer.removeReference(bufferObject); + if (!boh) { + return; } + auto bo = resource_ptr::cast(&mResourceManager, boh); + bo.dec(); } void VulkanDriver::createTextureR(Handle th, SamplerType target, uint8_t levels, TextureFormat format, uint8_t samples, uint32_t w, uint32_t h, uint32_t depth, TextureUsage usage) { - auto vktexture = construct(th, mContext, target, levels, - format, samples, w, h, depth, usage, mStagePool); - mDisposer.createDisposable(vktexture, [this, th] () { - destruct(th); - }); + FVK_SYSTRACE_SCOPE(); + auto texture = resource_ptr::make(&mResourceManager, th, mPlatform->getDevice(), + mPlatform->getPhysicalDevice(), mContext, mAllocator, &mResourceManager, &mCommands, + target, levels, format, samples, w, h, depth, usage, mStagePool); + + // Do transition to default layout. + VulkanCommandBuffer& commandsBuf = mCommands.get(); + auto const& primaryViewRange = texture->getPrimaryViewRange(); + auto const defaultLayout = texture->getDefaultLayout(); + texture->transitionLayout(&commandsBuf, primaryViewRange, defaultLayout); + + texture.inc(); } -void VulkanDriver::createTextureSwizzledR(Handle th, SamplerType target, uint8_t levels, - TextureFormat format, uint8_t samples, uint32_t w, uint32_t h, uint32_t depth, - TextureUsage usage, - TextureSwizzle r, TextureSwizzle g, TextureSwizzle b, TextureSwizzle a) { - TextureSwizzle swizzleArray[] = {r, g, b, a}; - const VkComponentMapping swizzleMap = getSwizzleMap(swizzleArray); - auto vktexture = construct(th, mContext, target, levels, - format, samples, w, h, depth, usage, mStagePool, swizzleMap); - mDisposer.createDisposable(vktexture, [this, th] () { - destruct(th); - }); +void VulkanDriver::createTextureViewR(Handle th, Handle srch, + uint8_t baseLevel, uint8_t levelCount) { + auto src = resource_ptr::cast(&mResourceManager, srch); + auto texture = resource_ptr::make(&mResourceManager, th, mPlatform->getDevice(), + mPlatform->getPhysicalDevice(), mContext, mAllocator, &mCommands, src, baseLevel, + levelCount); + texture.inc(); +} + +void VulkanDriver::createTextureViewSwizzleR(Handle th, Handle srch, + backend::TextureSwizzle r, backend::TextureSwizzle g, backend::TextureSwizzle b, + backend::TextureSwizzle a) { + TextureSwizzle const swizzleArray[] = {r, g, b, a}; + VkComponentMapping const swizzle = getSwizzleMap(swizzleArray); + auto src = resource_ptr::cast(&mResourceManager, srch); + auto texture = resource_ptr::make(&mResourceManager, th, mPlatform->getDevice(), + mPlatform->getPhysicalDevice(), mContext, mAllocator, &mCommands, src, swizzle); + texture.inc(); +} + +void VulkanDriver::createTextureExternalImageR(Handle th, + backend::SamplerType target, backend::TextureFormat format, + uint32_t width, uint32_t height, backend::TextureUsage usage, void* externalImage) { + FVK_SYSTRACE_SCOPE(); + + const auto& metadata = mPlatform->getExternalImageMetadata(externalImage); + if (metadata.isProtected) { + usage |= backend::TextureUsage::PROTECTED; + } + + assert_invariant(width == metadata.width); + assert_invariant(height == metadata.height); + assert_invariant(getVkFormat(format) == metadata.format); + + const auto& data = mPlatform->createExternalImage(externalImage, metadata); + + auto texture = resource_ptr::make(&mResourceManager, th, mPlatform->getDevice(), + mAllocator, &mResourceManager, &mCommands, data.first, data.second, metadata.format, + 1, metadata.width, metadata.height, usage, mStagePool); + + texture.inc(); +} + +void VulkanDriver::createTextureExternalImagePlaneR(Handle th, + backend::TextureFormat format, uint32_t width, uint32_t height, backend::TextureUsage usage, + void* image, uint32_t plane) { } void VulkanDriver::importTextureR(Handle th, intptr_t id, @@ -284,38 +579,40 @@ void VulkanDriver::importTextureR(Handle th, intptr_t id, } void VulkanDriver::destroyTexture(Handle th) { - if (th) { - auto texture = handle_cast(th); - mPipelineCache.unbindImageView(texture->getPrimaryImageView()); - mDisposer.removeReference(texture); + if (!th) { + return; } + auto texture = resource_ptr::cast(&mResourceManager, th); + texture.dec(); } void VulkanDriver::createProgramR(Handle ph, Program&& program) { - auto vkprogram = construct(ph, mContext, program); - mDisposer.createDisposable(vkprogram, [this, ph] () { - destruct(ph); - }); + FVK_SYSTRACE_SCOPE(); + auto vprogram = resource_ptr::make(&mResourceManager, ph, mPlatform->getDevice(), + program); + vprogram.inc(); } void VulkanDriver::destroyProgram(Handle ph) { - if (ph) { - mDisposer.removeReference(handle_cast(ph)); + if (!ph) { + return; } + auto vprogram = resource_ptr::cast(&mResourceManager, ph); + vprogram.dec(); } void VulkanDriver::createDefaultRenderTargetR(Handle rth, int) { - assert_invariant(mContext.defaultRenderTarget == nullptr); - VulkanRenderTarget* renderTarget = construct(rth); - mContext.defaultRenderTarget = renderTarget; - mDisposer.createDisposable(renderTarget, [this, rth] () { - destruct(rth); - }); + assert_invariant(!mDefaultRenderTarget); + auto renderTarget = resource_ptr::make(&mResourceManager, rth); + mDefaultRenderTarget = renderTarget; } void VulkanDriver::createRenderTargetR(Handle rth, TargetBufferFlags targets, uint32_t width, uint32_t height, uint8_t samples, - MRT color, TargetBufferInfo depth, TargetBufferInfo stencil) { + uint8_t layerCount, MRT color, TargetBufferInfo depth, TargetBufferInfo stencil) { + + FVK_SYSTRACE_SCOPE(); + UTILS_UNUSED_IN_RELEASE math::vec2 tmin = {std::numeric_limits::max()}; UTILS_UNUSED_IN_RELEASE math::vec2 tmax = {0}; UTILS_UNUSED_IN_RELEASE size_t attachmentCount = 0; @@ -324,9 +621,10 @@ void VulkanDriver::createRenderTargetR(Handle rth, for (int i = 0; i < MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT; i++) { if (color[i].handle) { colorTargets[i] = { - .texture = handle_cast(color[i].handle), + .texture = resource_ptr::cast(&mResourceManager, color[i].handle), .level = color[i].level, - .layer = color[i].layer, + .layerCount = layerCount, + .layer = (uint8_t) color[i].layer, }; UTILS_UNUSED_IN_RELEASE VkExtent2D extent = colorTargets[i].getExtent2D(); tmin = { std::min(tmin.x, extent.width), std::min(tmin.y, extent.height) }; @@ -338,9 +636,10 @@ void VulkanDriver::createRenderTargetR(Handle rth, VulkanAttachment depthStencil[2] = {}; if (depth.handle) { depthStencil[0] = { - .texture = handle_cast(depth.handle), + .texture = resource_ptr::cast(&mResourceManager, depth.handle), .level = depth.level, - .layer = depth.layer, + .layerCount = layerCount, + .layer = (uint8_t) depth.layer, }; UTILS_UNUSED_IN_RELEASE VkExtent2D extent = depthStencil[0].getExtent2D(); tmin = { std::min(tmin.x, extent.width), std::min(tmin.y, extent.height) }; @@ -350,9 +649,10 @@ void VulkanDriver::createRenderTargetR(Handle rth, if (stencil.handle) { depthStencil[1] = { - .texture = handle_cast(stencil.handle), + .texture = resource_ptr::cast(&mResourceManager, stencil.handle), .level = stencil.level, - .layer = stencil.layer, + .layerCount = layerCount, + .layer = (uint8_t) stencil.layer, }; UTILS_UNUSED_IN_RELEASE VkExtent2D extent = depthStencil[1].getExtent2D(); tmin = { std::min(tmin.x, extent.width), std::min(tmin.y, extent.height) }; @@ -366,166 +666,209 @@ void VulkanDriver::createRenderTargetR(Handle rth, assert_invariant(tmin == tmax); assert_invariant(tmin.x >= width && tmin.y >= height); - auto renderTarget = construct(rth, mContext, - width, height, samples, colorTargets, depthStencil, mStagePool); - mDisposer.createDisposable(renderTarget, [this, rth] () { - destruct(rth); - }); + auto rt = resource_ptr::make(&mResourceManager, rth, mPlatform->getDevice(), + mPlatform->getPhysicalDevice(), mContext, &mResourceManager, mAllocator, &mCommands, + width, height, samples, colorTargets, depthStencil, mStagePool, layerCount); + rt.inc(); } void VulkanDriver::destroyRenderTarget(Handle rth) { - if (rth) { - VulkanRenderTarget* rt = handle_cast(rth); - if (UTILS_UNLIKELY(rt == mContext.defaultRenderTarget)) { - mContext.defaultRenderTarget = nullptr; - } - mDisposer.removeReference(rt); + if (!rth) { + return; } -} -void VulkanDriver::createFenceR(Handle fh, int) { - VulkanCommandBuffer const& commandBuffer = mContext.commands->get(); - construct(fh, commandBuffer); + auto rt = resource_ptr::cast(&mResourceManager, rth); + if (UTILS_UNLIKELY(rt == mDefaultRenderTarget)) { + mDefaultRenderTarget = {}; + } else { + rt.dec(); + } } -void VulkanDriver::createSyncR(Handle sh, int) { - VulkanCommandBuffer const& commandBuffer = mContext.commands->get(); - construct(sh, commandBuffer); +void VulkanDriver::createFenceR(Handle fh, int) { + VulkanCommandBuffer* cmdbuf; + if (mCurrentRenderPass.commandBuffer) { + cmdbuf = mCurrentRenderPass.commandBuffer; + } else { + cmdbuf = &mCommands.get(); + } + // Note at this point, the fence has already been constructed via createFenceS, so we just tag + // it with appropriate VulkanCmdFence, which is associated with the current, recording command + // buffer. + auto fence = resource_ptr::cast(&mResourceManager, fh); + fence->fence = cmdbuf->getFenceStatus(); } void VulkanDriver::createSwapChainR(Handle sch, void* nativeWindow, uint64_t flags) { - const VkInstance instance = mContext.instance; - auto vksurface = (VkSurfaceKHR) mContextManager.createVkSurfaceKHR(nativeWindow, instance, - flags); - construct(sch, mContext, mStagePool, vksurface); + if ((flags & backend::SWAP_CHAIN_CONFIG_SRGB_COLORSPACE) != 0 && !isSRGBSwapChainSupported()) { + FVK_LOGW << "sRGB swapchain requested, but Platform does not support it" + << utils::io::endl; + flags = flags | ~(backend::SWAP_CHAIN_CONFIG_SRGB_COLORSPACE); + } + if (flags & backend::SWAP_CHAIN_CONFIG_PROTECTED_CONTENT) { + if (!isProtectedContentSupported()) { + FVK_LOGW << "protected swapchain requested, but Platform does not support it" + << utils::io::endl; + } + } + auto swapChain = resource_ptr::make(&mResourceManager, sch, mPlatform, + mContext, &mResourceManager, mAllocator, &mCommands, mStagePool, nativeWindow, flags); + swapChain.inc(); } -void VulkanDriver::createSwapChainHeadlessR(Handle sch, - uint32_t width, uint32_t height, uint64_t flags) { +void VulkanDriver::createSwapChainHeadlessR(Handle sch, uint32_t width, + uint32_t height, uint64_t flags) { + if ((flags & backend::SWAP_CHAIN_CONFIG_SRGB_COLORSPACE) != 0 && !isSRGBSwapChainSupported()) { + FVK_LOGW << "sRGB swapchain requested, but Platform does not support it" + << utils::io::endl; + flags = flags | ~(backend::SWAP_CHAIN_CONFIG_SRGB_COLORSPACE); + } assert_invariant(width > 0 && height > 0 && "Vulkan requires non-zero swap chain dimensions."); - construct(sch, mContext, mStagePool, width, height); + auto swapChain = resource_ptr::make(&mResourceManager, sch, mPlatform, + mContext, &mResourceManager, mAllocator, &mCommands, mStagePool, nullptr, flags, + VkExtent2D{width, height}); + swapChain.inc(); } void VulkanDriver::createTimerQueryR(Handle tqh, int) { // nothing to do, timer query was constructed in createTimerQueryS } +void VulkanDriver::createDescriptorSetLayoutR(Handle dslh, + backend::DescriptorSetLayout&& info) { + auto layout = resource_ptr::make(&mResourceManager, dslh, info); + mDescriptorSetManager.initVkLayout(layout); + layout.inc(); +} + +void VulkanDriver::createDescriptorSetR(Handle dsh, + Handle dslh) { + FVK_SYSTRACE_SCOPE(); + fvkmemory::resource_ptr layout = + fvkmemory::resource_ptr::cast(&mResourceManager, dslh); + auto set = mDescriptorSetManager.createSet(dsh, layout); + set.inc(); +} + +Handle VulkanDriver::createVertexBufferInfoS() noexcept { + return mResourceManager.allocHandle(); +} + Handle VulkanDriver::createVertexBufferS() noexcept { - return allocHandle(); + return mResourceManager.allocHandle(); } Handle VulkanDriver::createIndexBufferS() noexcept { - return allocHandle(); + return mResourceManager.allocHandle(); } Handle VulkanDriver::createBufferObjectS() noexcept { - return allocHandle(); + return mResourceManager.allocHandle(); } Handle VulkanDriver::createTextureS() noexcept { - return allocHandle(); + return mResourceManager.allocHandle(); } -Handle VulkanDriver::createTextureSwizzledS() noexcept { - return allocHandle(); +Handle VulkanDriver::createTextureViewS() noexcept { + return mResourceManager.allocHandle(); } -Handle VulkanDriver::importTextureS() noexcept { - return allocHandle(); +Handle VulkanDriver::createTextureViewSwizzleS() noexcept { + return mResourceManager.allocHandle(); } -Handle VulkanDriver::createSamplerGroupS() noexcept { - return allocHandle(); +Handle VulkanDriver::createTextureExternalImageS() noexcept { + return mResourceManager.allocHandle(); +} + +Handle VulkanDriver::createTextureExternalImagePlaneS() noexcept { + return mResourceManager.allocHandle(); +} + +Handle VulkanDriver::importTextureS() noexcept { + return mResourceManager.allocHandle(); } Handle VulkanDriver::createRenderPrimitiveS() noexcept { - return allocHandle(); + return mResourceManager.allocHandle(); } Handle VulkanDriver::createProgramS() noexcept { - return allocHandle(); + return mResourceManager.allocHandle(); } Handle VulkanDriver::createDefaultRenderTargetS() noexcept { - return allocHandle(); + return mResourceManager.allocHandle(); } Handle VulkanDriver::createRenderTargetS() noexcept { - return allocHandle(); + return mResourceManager.allocHandle(); } Handle VulkanDriver::createFenceS() noexcept { - return allocHandle(); -} - -Handle VulkanDriver::createSyncS() noexcept { - Handle sh = allocHandle(); - construct(sh); - return sh; + auto handle = mResourceManager.allocHandle(); + auto fence = resource_ptr::make(&mResourceManager, handle); + fence.inc(); + return handle; } Handle VulkanDriver::createSwapChainS() noexcept { - return allocHandle(); + return mResourceManager.allocHandle(); } Handle VulkanDriver::createSwapChainHeadlessS() noexcept { - return allocHandle(); + return mResourceManager.allocHandle(); } Handle VulkanDriver::createTimerQueryS() noexcept { // The handle must be constructed here, as a synchronous call to getTimerQueryValue might happen // before createTimerQueryR is executed. - Handle tqh = initHandle(mContext); - auto query = handle_cast(tqh); - mDisposer.createDisposable(query, [this, tqh] () { - destruct(tqh); - }); - return tqh; -} - -void VulkanDriver::destroySamplerGroup(Handle sbh) { - if (sbh) { - // Unlike most of the other "Hw" handles, the sampler buffer is an abstract concept and does - // not map to any Vulkan objects. To handle destruction, the only thing we need to do is - // ensure that the next draw call doesn't try to access a zombie sampler buffer. Therefore, - // simply replace all weak references with null. - auto* hwsb = handle_cast(sbh); - for (auto& binding : mSamplerBindings) { - if (binding == hwsb) { - binding = nullptr; - } - } - destruct(sbh); - } + auto query = resource_ptr::construct(&mResourceManager, + mTimestamps->getNextQuery()); + query.inc(); + return Handle(query.id()); } -void VulkanDriver::destroySwapChain(Handle sch) { - if (sch) { - VulkanSwapChain& swapChain = *handle_cast(sch); - swapChain.destroy(); +Handle VulkanDriver::createDescriptorSetLayoutS() noexcept { + return mResourceManager.allocHandle(); +} - vkDestroySurfaceKHR(mContext.instance, swapChain.surface, VKALLOC); - if (mContext.currentSwapChain == &swapChain) { - mContext.currentSwapChain = nullptr; - } +Handle VulkanDriver::createDescriptorSetS() noexcept { + return mResourceManager.allocHandle(); +} - destruct(sch); +void VulkanDriver::destroySwapChain(Handle sch) { + if (!sch) { + return; + } + auto swapChain = resource_ptr::cast(&mResourceManager, sch); + if (mCurrentSwapChain == swapChain) { + mCurrentSwapChain = {}; } + swapChain.dec(); } void VulkanDriver::destroyStream(Handle sh) { } void VulkanDriver::destroyTimerQuery(Handle tqh) { - if (tqh) { - mDisposer.removeReference(handle_cast(tqh)); + if (!tqh) { + return; } + auto vtq = resource_ptr::cast(&mResourceManager, tqh); + vtq.dec(); } -void VulkanDriver::destroySync(Handle sh) { - destruct(sh); +void VulkanDriver::destroyDescriptorSetLayout(Handle dslh) { + auto layout = resource_ptr::cast(&mResourceManager, dslh); + layout.dec(); } +void VulkanDriver::destroyDescriptorSet(Handle dsh) { + auto set = resource_ptr::cast(&mResourceManager, dsh); + set.dec(); +} Handle VulkanDriver::createStreamNative(void* nativeStream) { return {}; @@ -550,40 +893,44 @@ void VulkanDriver::updateStreams(CommandStream* driver) { } void VulkanDriver::destroyFence(Handle fh) { - destruct(fh); + auto fence = resource_ptr::cast(&mResourceManager, fh); + fence.dec(); } -FenceStatus VulkanDriver::wait(Handle fh, uint64_t timeout) { - auto& cmdfence = handle_cast(fh)->fence; +FenceStatus VulkanDriver::getFenceStatus(Handle fh) { + auto fence = resource_ptr::cast(&mResourceManager, fh); + + auto& cmdfence = fence->fence; + if (!cmdfence) { + // If wait is called before a fence actually exists, we return timeout. This matches the + // current behavior in OpenGLDriver, but we should eventually reconsider a different error + // code. + return FenceStatus::TIMEOUT_EXPIRED; + } // Internally we use the VK_INCOMPLETE status to mean "not yet submitted". // When this fence gets submitted, its status changes to VK_NOT_READY. - std::unique_lock lock(cmdfence->mutex); - if (cmdfence->status.load() == VK_INCOMPLETE) { - // This will obviously timeout if Filament creates a fence and immediately waits on it - // without calling endFrame() or commit(). - cmdfence->condition.wait(lock); - } else { - lock.unlock(); + if (cmdfence->getStatus() == VK_SUCCESS) { + return FenceStatus::CONDITION_SATISFIED; } - VkResult result = vkWaitForFences(mContext.device, 1, &cmdfence->fence, VK_TRUE, timeout); - return result == VK_SUCCESS ? FenceStatus::CONDITION_SATISFIED : FenceStatus::TIMEOUT_EXPIRED; + + + // Two other states are possible: + // - VK_INCOMPLETE: the corresponding buffer has not yet been submitted. + // - VK_NOT_READY: the buffer has been submitted but not yet signaled. + // In either case, we return TIMEOUT_EXPIRED to indicate the fence has not been signaled. + return FenceStatus::TIMEOUT_EXPIRED; } // We create all textures using VK_IMAGE_TILING_OPTIMAL, so our definition of "supported" is that // the GPU supports the given texture format with non-zero optimal tiling features. bool VulkanDriver::isTextureFormatSupported(TextureFormat format) { - assert_invariant(mContext.physicalDevice); VkFormat vkformat = getVkFormat(format); - // We automatically use an alternative format when the client requests DEPTH24. - if (format == TextureFormat::DEPTH24) { - vkformat = mContext.finalDepthFormat; - } if (vkformat == VK_FORMAT_UNDEFINED) { return false; } VkFormatProperties info; - vkGetPhysicalDeviceFormatProperties(mContext.physicalDevice, vkformat, &info); + vkGetPhysicalDeviceFormatProperties(mPlatform->getPhysicalDevice(), vkformat, &info); return info.optimalTilingFeatures != 0; } @@ -605,22 +952,19 @@ bool VulkanDriver::isTextureFormatMipmappable(TextureFormat format) { } bool VulkanDriver::isRenderTargetFormatSupported(TextureFormat format) { - assert_invariant(mContext.physicalDevice); VkFormat vkformat = getVkFormat(format); - // We automatically use an alternative format when the client requests DEPTH24. - if (format == TextureFormat::DEPTH24) { - vkformat = mContext.finalDepthFormat; - } if (vkformat == VK_FORMAT_UNDEFINED) { return false; } VkFormatProperties info; - vkGetPhysicalDeviceFormatProperties(mContext.physicalDevice, vkformat, &info); + vkGetPhysicalDeviceFormatProperties(mPlatform->getPhysicalDevice(), vkformat, &info); return (info.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) != 0; } bool VulkanDriver::isFrameBufferFetchSupported() { - return true; + // TODO: we must fix this before landing descriptor set change. Otherwise, the scuba tests will fail. + //return true; + return false; } bool VulkanDriver::isFrameBufferFetchMultiSampleSupported() { @@ -632,42 +976,108 @@ bool VulkanDriver::isFrameTimeSupported() { } bool VulkanDriver::isAutoDepthResolveSupported() { + // TODO: this could be supported with vk 1.2 or VK_KHR_depth_stencil_resolve return false; } +bool VulkanDriver::isSRGBSwapChainSupported() { + return mIsSRGBSwapChainSupported; +} + +bool VulkanDriver::isProtectedContentSupported() { + return mContext.isProtectedMemorySupported(); +} + +bool VulkanDriver::isStereoSupported() { + switch (mStereoscopicType) { + case backend::StereoscopicType::INSTANCED: + return mContext.isClipDistanceSupported(); + case backend::StereoscopicType::MULTIVIEW: + return mContext.isMultiviewEnabled(); + case backend::StereoscopicType::NONE: + return false; + } +} + +bool VulkanDriver::isParallelShaderCompileSupported() { + return false; +} + +bool VulkanDriver::isDepthStencilResolveSupported() { + // TODO: apparently it could be supported in core 1.2 and/or with VK_KHR_depth_stencil_resolve + return false; +} + +bool VulkanDriver::isDepthStencilBlitSupported(TextureFormat format) { + auto const& formats = mContext.getBlittableDepthStencilFormats(); + return std::find(formats.begin(), formats.end(), getVkFormat(format)) != formats.end(); +} + +bool VulkanDriver::isProtectedTexturesSupported() { + return false; +} + +bool VulkanDriver::isDepthClampSupported() { + return mContext.isDepthClampSupported(); +} + bool VulkanDriver::isWorkaroundNeeded(Workaround workaround) { - VkPhysicalDeviceProperties const& deviceProperties = mContext.physicalDeviceProperties; switch (workaround) { - case Workaround::SPLIT_EASU: + case Workaround::SPLIT_EASU: { + auto const vendorId = mContext.getPhysicalDeviceVendorId(); // early exit condition is flattened in EASU code - return deviceProperties.vendorID == 0x5143; // Qualcomm + return vendorId == 0x5143; // Qualcomm + } case Workaround::ALLOW_READ_ONLY_ANCILLARY_FEEDBACK_LOOP: - return true; + // Supporting depth attachment as both sampler and attachment is only possible if we set + // the depth attachment as read-only (e.g. during SSAO pass), however note that the + // store-ops for attachments wrt VkRenderPass only has VK_ATTACHMENT_STORE_OP_DONT_CARE + // and VK_ATTACHMENT_STORE_OP_STORE for versions below 1.3. Only at 1.3 and above do we + // have a true read-only choice VK_ATTACHMENT_STORE_OP_NONE. That means for < 1.3, we + // will trigger a validation sync error if we use the depth attachment also as a + // sampler. See full error below: + // + // SYNC-HAZARD-WRITE-AFTER-READ(ERROR / SPEC): msgNum: 929810911 - Validation Error: + // [ SYNC-HAZARD-WRITE-AFTER-READ ] Object 0: handle = 0x6160000c3680, + // type = VK_OBJECT_TYPE_RENDER_PASS; | MessageID = 0x376bc9df | vkCmdEndRenderPass: + // Hazard WRITE_AFTER_READ in subpass 0 for attachment 1 depth aspect during store with + // storeOp VK_ATTACHMENT_STORE_OP_STORE. Access info (usage: + // SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE, prior_usage: + // SYNC_FRAGMENT_SHADER_SHADER_STORAGE_READ, read_barriers: VK_PIPELINE_STAGE_2_NONE, + // command: vkCmdDrawIndexed, seq_no: 177, reset_no: 1) + // + // Therefore we apply the existing workaround of an extra blit until a better + // resolution. + return false; case Workaround::ADRENO_UNIFORM_ARRAY_CRASH: return false; + case Workaround::DISABLE_BLIT_INTO_TEXTURE_ARRAY: + return false; + default: + return false; } return false; } FeatureLevel VulkanDriver::getFeatureLevel() { - const VkPhysicalDeviceLimits& limits = mContext.physicalDeviceProperties.limits; + VkPhysicalDeviceLimits const& limits = mContext.getPhysicalDeviceLimits(); // If cubemap arrays are not supported, then this is an FL1 device. - if (!mContext.physicalDeviceFeatures.imageCubeArray) { + if (!mContext.isImageCubeArraySupported()) { return FeatureLevel::FEATURE_LEVEL_1; } // If the max sampler counts do not meet FL2 standards, then this is an FL1 device. const auto& fl2 = FEATURE_LEVEL_CAPS[+FeatureLevel::FEATURE_LEVEL_2]; - if (fl2.MAX_VERTEX_SAMPLER_COUNT < limits.maxPerStageDescriptorSamplers || - fl2.MAX_FRAGMENT_SAMPLER_COUNT < limits.maxPerStageDescriptorSamplers) { + if (limits.maxPerStageDescriptorSamplers < fl2.MAX_VERTEX_SAMPLER_COUNT || + limits.maxPerStageDescriptorSamplers < fl2.MAX_FRAGMENT_SAMPLER_COUNT) { return FeatureLevel::FEATURE_LEVEL_1; } // If the max sampler counts do not meet FL3 standards, then this is an FL2 device. const auto& fl3 = FEATURE_LEVEL_CAPS[+FeatureLevel::FEATURE_LEVEL_3]; - if (fl3.MAX_VERTEX_SAMPLER_COUNT < limits.maxPerStageDescriptorSamplers || - fl3.MAX_FRAGMENT_SAMPLER_COUNT < limits.maxPerStageDescriptorSamplers) { + if (limits.maxPerStageDescriptorSamplers < fl3.MAX_VERTEX_SAMPLER_COUNT|| + limits.maxPerStageDescriptorSamplers < fl3.MAX_FRAGMENT_SAMPLER_COUNT) { return FeatureLevel::FEATURE_LEVEL_2; } @@ -685,36 +1095,49 @@ uint8_t VulkanDriver::getMaxDrawBuffers() { return MRT::MIN_SUPPORTED_RENDER_TARGET_COUNT; // TODO: query real value } +size_t VulkanDriver::getMaxUniformBufferSize() { + // TODO: return the actual size instead of hardcoded value + // TODO: devices that return less than 32768 should be rejected. This represents only 3% + // of android devices. + return 32768; +} + void VulkanDriver::setVertexBufferObject(Handle vbh, uint32_t index, Handle boh) { - auto& vb = *handle_cast(vbh); - auto& bo = *handle_cast(boh); - assert_invariant(bo.bindingType == BufferObjectBinding::VERTEX); - vb.buffers[index] = &bo.buffer; + auto vb = resource_ptr::cast(&mResourceManager, vbh); + auto bo = resource_ptr::cast(&mResourceManager, boh); + assert_invariant(bo->bindingType == BufferObjectBinding::VERTEX); + vb->setBuffer(bo, index); } void VulkanDriver::updateIndexBuffer(Handle ibh, BufferDescriptor&& p, uint32_t byteOffset) { - auto ib = handle_cast(ibh); - ib->buffer.loadFromCpu(mContext, mStagePool, p.buffer, byteOffset, p.size); - mDisposer.acquire(ib); + VulkanCommandBuffer& commands = mCommands.get(); + auto ib = resource_ptr::cast(&mResourceManager, ibh); + commands.acquire(ib); + ib->buffer.loadFromCpu(commands.buffer(), p.buffer, byteOffset, p.size); + scheduleDestroy(std::move(p)); } void VulkanDriver::updateBufferObject(Handle boh, BufferDescriptor&& bd, uint32_t byteOffset) { - auto bo = handle_cast(boh); - bo->buffer.loadFromCpu(mContext, mStagePool, bd.buffer, byteOffset, bd.size); - mDisposer.acquire(bo); + VulkanCommandBuffer& commands = mCommands.get(); + + auto bo = resource_ptr::cast(&mResourceManager, boh); + commands.acquire(bo); + bo->buffer.loadFromCpu(commands.buffer(), bd.buffer, byteOffset, bd.size); + scheduleDestroy(std::move(bd)); } void VulkanDriver::updateBufferObjectUnsynchronized(Handle boh, BufferDescriptor&& bd, uint32_t byteOffset) { - auto bo = handle_cast(boh); + VulkanCommandBuffer& commands = mCommands.get(); + auto bo = resource_ptr::cast(&mResourceManager, boh); + commands.acquire(bo); // TODO: implement unsynchronized version - bo->buffer.loadFromCpu(mContext, mStagePool, bd.buffer, byteOffset, bd.size); - mDisposer.acquire(bo); + bo->buffer.loadFromCpu(commands.buffer(), bd.buffer, byteOffset, bd.size); scheduleDestroy(std::move(bd)); } @@ -727,266 +1150,187 @@ void VulkanDriver::resetBufferObject(Handle boh) { // This is only useful if updateBufferObjectUnsynchronized() is implemented unsynchronizedly. } -void VulkanDriver::setMinMaxLevels(Handle th, uint32_t minLevel, uint32_t maxLevel) { - handle_cast(th)->setPrimaryRange(minLevel, maxLevel); -} - -void VulkanDriver::update3DImage( - Handle th, - uint32_t level, uint32_t xoffset, uint32_t yoffset, uint32_t zoffset, - uint32_t width, uint32_t height, uint32_t depth, +void VulkanDriver::update3DImage(Handle th, uint32_t level, uint32_t xoffset, + uint32_t yoffset, uint32_t zoffset, uint32_t width, uint32_t height, uint32_t depth, PixelBufferDescriptor&& data) { - handle_cast(th)->updateImage(data, width, height, depth, - xoffset, yoffset, zoffset, level); + auto texture = resource_ptr::cast(&mResourceManager, th); + texture->updateImage(data, width, height, depth, xoffset, yoffset, zoffset, level); scheduleDestroy(std::move(data)); } void VulkanDriver::setupExternalImage(void* image) { } -bool VulkanDriver::getTimerQueryValue(Handle tqh, uint64_t* elapsedTime) { - VulkanTimerQuery* vtq = handle_cast(tqh); - - // This is a synchronous call and might occur before beginTimerQuery has written anything into - // the command buffer, which is an error according to the validation layer that ships in the - // Android NDK. Even when AVAILABILITY_BIT is set, validation seems to require that the - // timestamp has at least been written into a processed command buffer. - VulkanCommandBuffer const* cmdbuf = vtq->cmdbuffer.load(); - if (!cmdbuf || !cmdbuf->fence) { - return false; +TimerQueryResult VulkanDriver::getTimerQueryValue(Handle tqh, uint64_t* elapsedTime) { + auto vtq = resource_ptr::cast(&mResourceManager, tqh); + if (!vtq->isCompleted()) { + return TimerQueryResult::NOT_READY; } - VkResult status = cmdbuf->fence->status.load(std::memory_order_relaxed); - if (status != VK_SUCCESS) { - return false; - } - - uint64_t results[4] = {}; - size_t dataSize = sizeof(results); - VkDeviceSize stride = sizeof(uint64_t) * 2; - - VkResult result = vkGetQueryPoolResults(mContext.device, mContext.timestamps.pool, - vtq->startingQueryIndex, 2, dataSize, (void*) results, stride, - VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT); + auto results = mTimestamps->getResult(vtq); uint64_t timestamp0 = results[0]; uint64_t available0 = results[1]; uint64_t timestamp1 = results[2]; uint64_t available1 = results[3]; - if (result == VK_NOT_READY || available0 == 0 || available1 == 0) { - return false; + if (available0 == 0 || available1 == 0) { + return TimerQueryResult::NOT_READY; } - ASSERT_POSTCONDITION(result == VK_SUCCESS, "vkGetQueryPoolResults error."); - ASSERT_POSTCONDITION(timestamp1 >= timestamp0, "Timestamps are not monotonically increasing."); + FILAMENT_CHECK_POSTCONDITION(timestamp1 >= timestamp0) + << "Timestamps are not monotonically increasing."; // NOTE: MoltenVK currently writes system time so the following delta will always be zero. // However there are plans for implementing this properly. See the following GitHub ticket. // https://github.com/KhronosGroup/MoltenVK/issues/773 - float period = mContext.physicalDeviceProperties.limits.timestampPeriod; + float const period = mContext.getPhysicalDeviceLimits().timestampPeriod; uint64_t delta = uint64_t(float(timestamp1 - timestamp0) * period); *elapsedTime = delta; - return true; + return TimerQueryResult::AVAILABLE; } -SyncStatus VulkanDriver::getSyncStatus(Handle sh) { - VulkanSync* sync = handle_cast(sh); - if (sync->fence == nullptr) { - return SyncStatus::NOT_SIGNALED; - } - VkResult status = sync->fence->status.load(std::memory_order_relaxed); - switch (status) { - case VK_SUCCESS: return SyncStatus::SIGNALED; - case VK_INCOMPLETE: return SyncStatus::NOT_SIGNALED; - case VK_NOT_READY: return SyncStatus::NOT_SIGNALED; - case VK_ERROR_DEVICE_LOST: return SyncStatus::ERROR; - default: - // NOTE: In theory, the fence status must be one of the above values. - return SyncStatus::ERROR; - } +void VulkanDriver::setExternalStream(Handle th, Handle sh) { } -void VulkanDriver::setExternalImage(Handle th, void* image) { -} +void VulkanDriver::generateMipmaps(Handle th) { + auto t = resource_ptr::cast(&mResourceManager, th); + assert_invariant(t); -void VulkanDriver::setExternalImagePlane(Handle th, void* image, uint32_t plane) { -} - -void VulkanDriver::setExternalStream(Handle th, Handle sh) { -} + int32_t layerCount = int32_t(t->depth); + if (t->target == SamplerType::SAMPLER_CUBEMAP_ARRAY || + t->target == SamplerType::SAMPLER_CUBEMAP) { + layerCount *= 6; + } -void VulkanDriver::generateMipmaps(Handle th) { } + assert_invariant(layerCount < 1 << (sizeof(VulkanAttachment::layerCount) * 8)); -bool VulkanDriver::canGenerateMipmaps() { - return false; -} + // FIXME: the loop below can perform many layout transitions and back. We should be + // able to optimize that. + uint8_t level = 0; + int32_t srcw = int32_t(t->width); + int32_t srch = int32_t(t->height); + do { + int32_t const dstw = std::max(srcw >> 1, 1); + int32_t const dsth = std::max(srch >> 1, 1); + const VkOffset3D srcOffsets[2] = {{ 0, 0, 0 }, { srcw, srch, 1 }}; + const VkOffset3D dstOffsets[2] = {{ 0, 0, 0 }, { dstw, dsth, 1 }}; -void VulkanDriver::updateSamplerGroup(Handle sbh, - BufferDescriptor&& data) { - auto* sb = handle_cast(sbh); + // TODO: there should be a way to do this using layerCount in vkBlitImage + // TODO: vkBlitImage should be able to handle 3D textures too + for (uint8_t layer = 0; layer < layerCount; layer++) { + VulkanAttachment dst { + .level = uint8_t(level + 1), + .layer = layer, + }; + dst.texture = t; + VulkanAttachment src { + .level = uint8_t(level), + .layer = layer, + }; + src.texture = t; + mBlitter.blit(VK_FILTER_LINEAR, dst, dstOffsets, src, srcOffsets); + } - // FIXME: we shouldn't be using SamplerGroup here, instead the backend should create - // a descriptor or any internal data-structure that represents the textures/samplers. - // It's preferable to do as much work as possible here. - // Here, we emulate the older backend API by re-creating a SamplerGroup from the - // passed data. - SamplerGroup samplerGroup(data.size / sizeof(SamplerDescriptor)); - memcpy(samplerGroup.data(), data.buffer, data.size); - *sb->sb = std::move(samplerGroup); + level++; + srcw = dstw; + srch = dsth; + } while ((srcw > 1 || srch > 1) && level < t->levels); +} - scheduleDestroy(std::move(data)); +void VulkanDriver::compilePrograms(CompilerPriorityQueue priority, + CallbackHandler* handler, CallbackHandler::Callback callback, void* user) { + if (callback) { + scheduleCallback(handler, user, callback); + } } void VulkanDriver::beginRenderPass(Handle rth, const RenderPassParams& params) { - VulkanRenderTarget* const rt = handle_cast(rth); + FVK_SYSTRACE_SCOPE(); + + auto rt = resource_ptr::cast(&mResourceManager, rth); + VkExtent2D const extent = rt->getExtent(); + + assert_invariant(rt == mDefaultRenderTarget || extent.width > 0 && extent.height > 0); - const VkExtent2D extent = rt->getExtent(); - assert_invariant(extent.width > 0 && extent.height > 0); + VulkanCommandBuffer* commandBuffer = rt->isProtected() ? + &mCommands.getProtected() : &mCommands.get(); // Filament has the expectation that the contents of the swap chain are not preserved on the // first render pass. Note however that its contents are often preserved on subsequent render // passes, due to multiple views. TargetBufferFlags discardStart = params.flags.discardStart; if (rt->isSwapChain()) { - VulkanSwapChain* const sc = mContext.currentSwapChain; + fvkmemory::resource_ptr sc = mCurrentSwapChain; assert_invariant(sc); - if (sc->firstRenderPass) { + if (sc->isFirstRenderPass()) { discardStart |= TargetBufferFlags::COLOR; - sc->firstRenderPass = false; + sc->markFirstRenderPass(); } } - const VkCommandBuffer cmdbuffer = mContext.commands->get().cmdbuffer; - VulkanAttachment depth = rt->getSamples() == 1 ? rt->getDepth() : rt->getMsaaDepth(); - - VulkanDepthLayout initialDepthLayout = fromVkImageLayout(depth.getLayout()); - VulkanDepthLayout renderPassDepthLayout = - fromVkImageLayout(getDefaultImageLayout(TextureUsage::DEPTH_ATTACHMENT)); - VulkanDepthLayout finalDepthLayout = renderPassDepthLayout; - - // Sometimes we need to permit the shader to sample the depth attachment by transitioning the - // layout of all its subresources to a read-only layout. This is especially crucial for SSAO. - // - // We cannot perform this transition using the render pass because the shaders in this render - // pass might sample from multiple miplevels. - // - // We do not use GENERAL here due to the following validation message: - // - // The Vulkan spec states: Image subresources used as attachments in the current render pass - // must not be accessed in any way other than as an attachment by this command, except for - // cases involving read-only access to depth/stencil attachments as described in the Render - // Pass chapter. - // - // https://vulkan.lunarg.com/doc/view/1.2.182.0/mac/1.2-extensions/vkspec.html#VUID-vkCmdDrawIndexed-None-04584) - // - if (params.readOnlyDepthStencil & RenderPassParams::READONLY_DEPTH) { - VkImageSubresourceRange range = { - .aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT, - .baseMipLevel = 0, - .levelCount = depth.texture->levels, - .baseArrayLayer = 0, - .layerCount = depth.texture->depth, - }; - depth.texture->transitionLayout(cmdbuffer, range, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL); - initialDepthLayout = renderPassDepthLayout = finalDepthLayout = VulkanDepthLayout::READ_ONLY; +#if FVK_ENABLED(FVK_DEBUG_TEXTURE) + if (rt->hasDepth()) { + auto depth = rt->getDepth(); + depth.texture->print(); } +#endif - if (depth.texture) { - depth.texture->trackLayout(depth.level, depth.layer, toVkImageLayout(renderPassDepthLayout)); + // We need to determine whether the same depth texture is both sampled and set as an attachment. + // If that's the case, we need to change the layout of the texture to DEPTH_SAMPLER, which is a + // more general layout. Otherwise, we prefer the DEPTH_ATTACHMENT layout, which is optimal for + // the non-sampling case. + VkCommandBuffer const cmdbuffer = commandBuffer->buffer(); + + // Scissor is reset with each render pass + // This also takes care of VUID-vkCmdDrawIndexed-None-07832. + VkRect2D const scissor{ .offset = { 0, 0 }, .extent = extent }; + vkCmdSetScissor(cmdbuffer, 0, 1, &scissor); + + VulkanLayout currentDepthLayout = VulkanLayout::UNDEFINED; + TargetBufferFlags clearVal = params.flags.clear; + TargetBufferFlags discardEndVal = params.flags.discardEnd; + if (rt->hasDepth()) { + if (params.readOnlyDepthStencil & RenderPassParams::READONLY_DEPTH) { + discardEndVal &= ~TargetBufferFlags::DEPTH; + clearVal &= ~TargetBufferFlags::DEPTH; + } + currentDepthLayout = VulkanLayout::DEPTH_ATTACHMENT; } + // Create the VkRenderPass or fetch it from cache. - VulkanFboCache::RenderPassKey rpkey = { - .initialColorLayoutMask = 0, - .initialDepthLayout = initialDepthLayout, - .renderPassDepthLayout = renderPassDepthLayout, - .finalDepthLayout = finalDepthLayout, - .depthFormat = depth.getFormat(), - .clear = params.flags.clear, - .discardStart = discardStart, - .discardEnd = params.flags.discardEnd, - .samples = rt->getSamples(), - .subpassMask = uint8_t(params.subpassMask), - }; - for (int i = 0; i < MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT; i++) { - const VulkanAttachment& info = rt->getColor(i); - if (info.texture) { - rpkey.initialColorLayoutMask |= 1 << i; - info.texture->trackLayout(info.level, info.layer, - getDefaultImageLayout(TextureUsage::COLOR_ATTACHMENT)); - rpkey.colorFormat[i] = info.getFormat(); - if (rpkey.samples > 1 && info.texture->samples == 1) { - rpkey.needsResolveMask |= (1 << i); - } - } else { - rpkey.colorFormat[i] = VK_FORMAT_UNDEFINED; - } - } + + VulkanFboCache::RenderPassKey rpkey = rt->getRenderPassKey(); + rpkey.clear = clearVal; + rpkey.discardStart = discardStart; + rpkey.discardEnd = discardEndVal; + rpkey.initialDepthLayout = currentDepthLayout; + rpkey.subpassMask = uint8_t(params.subpassMask); VkRenderPass renderPass = mFramebufferCache.getRenderPass(rpkey); mPipelineCache.bindRenderPass(renderPass, 0); // Create the VkFramebuffer or fetch it from cache. - VulkanFboCache::FboKey fbkey { - .renderPass = renderPass, - .width = (uint16_t) extent.width, - .height = (uint16_t) extent.height, - .layers = 1, - .samples = rpkey.samples, - }; - for (int i = 0; i < MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT; i++) { - if (!rt->getColor(i).texture) { - fbkey.color[i] = VK_NULL_HANDLE; - fbkey.resolve[i] = VK_NULL_HANDLE; - } else if (fbkey.samples == 1) { - fbkey.color[i] = rt->getColor(i).getImageView(VK_IMAGE_ASPECT_COLOR_BIT); - fbkey.resolve[i] = VK_NULL_HANDLE; - assert_invariant(fbkey.color[i]); - } else { - fbkey.color[i] = rt->getMsaaColor(i).getImageView(VK_IMAGE_ASPECT_COLOR_BIT); - VulkanTexture* texture = rt->getColor(i).texture; - if (texture->samples == 1) { - fbkey.resolve[i] = rt->getColor(i).getImageView(VK_IMAGE_ASPECT_COLOR_BIT); - assert_invariant(fbkey.resolve[i]); - } - assert_invariant(fbkey.color[i]); - } - } - if (depth.texture) { - fbkey.depth = depth.getImageView(VK_IMAGE_ASPECT_DEPTH_BIT); - assert_invariant(fbkey.depth); - - // Vulkan 1.1 does not support multisampled depth resolve, so let's check here - // and assert if this is requested. (c.f. isAutoDepthResolveSupported) - // Reminder: Filament's backend API works like this: - // - If the RT is SS then all attachments must be SS. - // - If the RT is MS then all SS attachments are auto resolved if not discarded. - assert_invariant(!(rt->getSamples() > 1 && - rt->getDepth().texture->samples == 1 && - !any(rpkey.discardEnd & TargetBufferFlags::DEPTH))); - } + VulkanFboCache::FboKey fbkey = rt->getFboKey(); + fbkey.renderPass = renderPass; + fbkey.layers = 1; + + rt->emitBarriersBeginRenderPass(*commandBuffer); + VkFramebuffer vkfb = mFramebufferCache.getFramebuffer(fbkey); - // Assign a label to the framebuffer for debugging purposes. - if (UTILS_UNLIKELY(mContext.debugUtilsSupported) && !mContext.currentDebugMarker.empty()) { - const VkDebugUtilsObjectNameInfoEXT info = { - VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, - nullptr, - VK_OBJECT_TYPE_FRAMEBUFFER, - reinterpret_cast(vkfb), - mContext.currentDebugMarker.c_str(), - }; - vkSetDebugUtilsObjectNameEXT(mContext.device, &info); +// Assign a label to the framebuffer for debugging purposes. +#if FVK_ENABLED(FVK_DEBUG_GROUP_MARKERS | FVK_DEBUG_DEBUG_UTILS) + auto const topMarker = mCommands.getTopGroupMarker(); + if (!topMarker.empty()) { + DebugUtils::setName(VK_OBJECT_TYPE_FRAMEBUFFER, reinterpret_cast(vkfb), + topMarker.c_str()); } +#endif - // The current command buffer now owns a reference to the render target and its attachments. - // Note that we must acquire parent textures, not sidecars. - mDisposer.acquire(rt); - mDisposer.acquire(rt->getDepth().texture); - for (int i = 0; i < MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT; i++) { - mDisposer.acquire(rt->getColor(i).texture); - } + // The current command buffer now has references to the render target and its attachments. + commandBuffer->acquire(rt); // Populate the structures required for vkCmdBeginRenderPass. VkRenderPassBeginInfo renderPassInfo { @@ -1001,35 +1345,38 @@ void VulkanDriver::beginRenderPass(Handle rth, const RenderPassP rt->transformClientRectToPlatform(&renderPassInfo.renderArea); - VkClearValue clearValues[MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT + MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT + 1] = {}; - - // NOTE: clearValues must be populated in the same order as the attachments array in - // VulkanFboCache::getFramebuffer. Values must be provided regardless of whether Vulkan is - // actually clearing that particular target. - for (int i = 0; i < MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT; i++) { - if (fbkey.color[i]) { - VkClearValue& clearValue = clearValues[renderPassInfo.clearValueCount++]; - clearValue.color.float32[0] = params.clearColor.r; - clearValue.color.float32[1] = params.clearColor.g; - clearValue.color.float32[2] = params.clearColor.b; - clearValue.color.float32[3] = params.clearColor.a; + VkClearValue clearValues[ + MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT + MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT + + 1] = {}; + if (clearVal != TargetBufferFlags::NONE) { + // NOTE: clearValues must be populated in the same order as the attachments array in + // VulkanFboCache::getFramebuffer. Values must be provided regardless of whether Vulkan is + // actually clearing that particular target. + for (int i = 0; i < MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT; i++) { + if (fbkey.color[i]) { + VkClearValue &clearValue = clearValues[renderPassInfo.clearValueCount++]; + clearValue.color.float32[0] = params.clearColor.r; + clearValue.color.float32[1] = params.clearColor.g; + clearValue.color.float32[2] = params.clearColor.b; + clearValue.color.float32[3] = params.clearColor.a; + } } - } - // Resolve attachments are not cleared but still have entries in the list, so skip over them. - for (int i = 0; i < MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT; i++) { - if (rpkey.needsResolveMask & (1u << i)) { - renderPassInfo.clearValueCount++; + // Resolve attachments are not cleared but still have entries in the list, so skip over them. + for (int i = 0; i < MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT; i++) { + if (rpkey.needsResolveMask & (1u << i)) { + renderPassInfo.clearValueCount++; + } } + if (fbkey.depth) { + VkClearValue &clearValue = clearValues[renderPassInfo.clearValueCount++]; + clearValue.depthStencil = {(float) params.clearDepth, 0}; + } + renderPassInfo.pClearValues = &clearValues[0]; } - if (fbkey.depth) { - VkClearValue& clearValue = clearValues[renderPassInfo.clearValueCount++]; - clearValue.depthStencil = {(float) params.clearDepth, 0}; - } - renderPassInfo.pClearValues = &clearValues[0]; vkCmdBeginRenderPass(cmdbuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE); - VkViewport viewport = mContext.viewport = { + VkViewport viewport = { .x = (float) params.viewport.left, .y = (float) params.viewport.bottom, .width = (float) params.viewport.width, @@ -1038,10 +1385,11 @@ void VulkanDriver::beginRenderPass(Handle rth, const RenderPassP .maxDepth = params.depthRange.far }; - rt->transformClientRectToPlatform(&viewport); + rt->transformViewportToPlatform(&viewport); vkCmdSetViewport(cmdbuffer, 0, 1, &viewport); - mContext.currentRenderPass = { + mCurrentRenderPass = { + .commandBuffer = commandBuffer, .renderTarget = rt, .renderPass = renderPassInfo.renderPass, .params = params, @@ -1050,625 +1398,409 @@ void VulkanDriver::beginRenderPass(Handle rth, const RenderPassP } void VulkanDriver::endRenderPass(int) { - VkCommandBuffer cmdbuffer = mContext.commands->get().cmdbuffer; + FVK_SYSTRACE_SCOPE(); + + VkCommandBuffer cmdbuffer = mCurrentRenderPass.commandBuffer->buffer(); vkCmdEndRenderPass(cmdbuffer); - VulkanRenderTarget* rt = mContext.currentRenderPass.renderTarget; + auto rt = mCurrentRenderPass.renderTarget; assert_invariant(rt); - // In some cases, depth needs to be transitioned from DEPTH_STENCIL_READ_ONLY_OPTIMAL back to - // GENERAL. We did not do this using the render pass because we need to change multiple mips. - if (mContext.currentRenderPass.params.readOnlyDepthStencil & RenderPassParams::READONLY_DEPTH) { - const VulkanAttachment& depth = rt->getDepth(); - VkImageSubresourceRange range = { - .aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT, - .baseMipLevel = 0, - .levelCount = depth.texture->levels, - .baseArrayLayer = 0, - .layerCount = depth.texture->depth, - }; - depth.texture->transitionLayout(cmdbuffer, range, - getDefaultImageLayout(TextureUsage::DEPTH_ATTACHMENT)); - } - // Since we might soon be sampling from the render target that we just wrote to, we need a - // pipeline barrier between framebuffer writes and shader reads. This is a memory barrier rather - // than an image barrier. If we were to use image barriers here, we would potentially need to - // issue several of them when considering MRT. This would be very complex to set up and would - // require more state tracking, so we've chosen to use a memory barrier for simplicity and - // correctness. - - // NOTE: ideally dstStageMask would merely be VERTEX_SHADER_BIT | FRAGMENT_SHADER_BIT, but this - // seems to be insufficient on Mali devices. To work around this we are adding a more aggressive - // TOP_OF_PIPE barrier. - - if (!rt->isSwapChain()) { - VkMemoryBarrier barrier { - .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, - .srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, - .dstAccessMask = VK_ACCESS_SHADER_READ_BIT, - }; - VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - if (rt->hasDepth()) { - barrier.srcAccessMask |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; - srcStageMask |= VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; - } - vkCmdPipelineBarrier(cmdbuffer, srcStageMask, - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT | // <== For Mali - VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - 0, 1, &barrier, 0, nullptr, 0, nullptr); - } + // pipeline barrier between framebuffer writes and shader reads. + rt->emitBarriersEndRenderPass(*mCurrentRenderPass.commandBuffer); - if (mContext.currentRenderPass.currentSubpass > 0) { - for (uint32_t i = 0; i < VulkanPipelineCache::TARGET_BINDING_COUNT; i++) { - mPipelineCache.bindInputAttachment(i, {}); - } - mContext.currentRenderPass.currentSubpass = 0; - } - mContext.currentRenderPass.renderTarget = nullptr; - mContext.currentRenderPass.renderPass = VK_NULL_HANDLE; + mRenderPassFboInfo = {}; + mCurrentRenderPass.renderTarget = {}; + mCurrentRenderPass.renderPass = VK_NULL_HANDLE; + + mCurrentRenderPass.commandBuffer = nullptr; } void VulkanDriver::nextSubpass(int) { - ASSERT_PRECONDITION(mContext.currentRenderPass.currentSubpass == 0, - "Only two subpasses are currently supported."); + FILAMENT_CHECK_PRECONDITION(mCurrentRenderPass.currentSubpass == 0) + << "Only two subpasses are currently supported."; - VulkanRenderTarget* renderTarget = mContext.currentRenderPass.renderTarget; + auto renderTarget = mCurrentRenderPass.renderTarget; assert_invariant(renderTarget); - assert_invariant(mContext.currentRenderPass.params.subpassMask); + assert_invariant(mCurrentRenderPass.params.subpassMask); - vkCmdNextSubpass(mContext.commands->get().cmdbuffer, VK_SUBPASS_CONTENTS_INLINE); + vkCmdNextSubpass(mCurrentRenderPass.commandBuffer->buffer(), + VK_SUBPASS_CONTENTS_INLINE); - mPipelineCache.bindRenderPass(mContext.currentRenderPass.renderPass, - ++mContext.currentRenderPass.currentSubpass); + mPipelineCache.bindRenderPass(mCurrentRenderPass.renderPass, + ++mCurrentRenderPass.currentSubpass); - for (uint32_t i = 0; i < VulkanPipelineCache::TARGET_BINDING_COUNT; i++) { - if ((1 << i) & mContext.currentRenderPass.params.subpassMask) { - VulkanAttachment subpassInput = renderTarget->getColor(i); - VkDescriptorImageInfo info = { - .imageView = subpassInput.getImageView(VK_IMAGE_ASPECT_COLOR_BIT), - .imageLayout = subpassInput.getLayout(), - }; - mPipelineCache.bindInputAttachment(i, info); - } + if (mCurrentRenderPass.params.subpassMask & 0x1) { + VulkanAttachment& subpassInput = renderTarget->getColor0(); + mDescriptorSetManager.updateInputAttachment({}, subpassInput); } } -void VulkanDriver::setRenderPrimitiveBuffer(Handle rph, - Handle vbh, Handle ibh) { - auto primitive = handle_cast(rph); - primitive->setBuffers(handle_cast(vbh), - handle_cast(ibh)); -} - -void VulkanDriver::setRenderPrimitiveRange(Handle rph, - PrimitiveType pt, uint32_t offset, - uint32_t minIndex, uint32_t maxIndex, uint32_t count) { - auto& primitive = *handle_cast(rph); - primitive.setPrimitiveType(pt); - primitive.offset = offset * primitive.indexBuffer->elementSize; - primitive.count = count; - primitive.minIndex = minIndex; - primitive.maxIndex = maxIndex > minIndex ? maxIndex : primitive.maxVertexCount - 1; -} - void VulkanDriver::makeCurrent(Handle drawSch, Handle readSch) { + FVK_SYSTRACE_SCOPE(); + ASSERT_PRECONDITION_NON_FATAL(drawSch == readSch, - "Vulkan driver does not support distinct draw/read swap chains."); - VulkanSwapChain& swapChain = *handle_cast(drawSch); - mContext.currentSwapChain = &swapChain; - - // Leave early if the swap chain image has already been acquired but not yet presented. - if (swapChain.acquired) { - if (UTILS_LIKELY(mContext.defaultRenderTarget)) { - mContext.defaultRenderTarget->bindToSwapChain(swapChain); - } - return; - } + "Vulkan driver does not support distinct draw/read swap chains."); - // Query the surface caps to see if it has been resized. This handles not just resized windows, - // but also screen rotation on Android and dragging between low DPI and high DPI monitors. - if (swapChain.hasResized()) { - refreshSwapChain(); - } + resource_ptr swapChain = + resource_ptr::cast(&mResourceManager, drawSch); + mCurrentSwapChain = swapChain; - // Call vkAcquireNextImageKHR and insert its signal semaphore into the command manager's - // dependency chain. - swapChain.acquire(); + bool resized = false; + swapChain->acquire(resized); - if (UTILS_LIKELY(mContext.defaultRenderTarget)) { - mContext.defaultRenderTarget->bindToSwapChain(swapChain); + if (resized) { + mFramebufferCache.reset(); } -} - -void VulkanDriver::commit(Handle sch) { - VulkanSwapChain& swapChain = *handle_cast(sch); - - // Before swapping, transition the current swap chain image to the PRESENT layout. This cannot - // be done as part of the render pass because it does not know if it is last pass in the frame. - swapChain.makePresentable(); - if (mContext.commands->flush()) { - collectGarbage(); + if (UTILS_LIKELY(mDefaultRenderTarget)) { + mDefaultRenderTarget->bindToSwapChain(swapChain); } +} - swapChain.firstRenderPass = true; - - if (swapChain.headlessQueue) { - return; - } +void VulkanDriver::commit(Handle sch) { + FVK_SYSTRACE_SCOPE(); - swapChain.acquired = false; + auto swapChain = resource_ptr::cast(&mResourceManager, sch); // Present the backbuffer after the most recent command buffer submission has finished. - VkSemaphore renderingFinished = mContext.commands->acquireFinishedSignal(); - uint32_t currentSwapIndex = swapChain.getSwapIndex(); - VkPresentInfoKHR presentInfo { - .sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, - .waitSemaphoreCount = 1, - .pWaitSemaphores = &renderingFinished, - .swapchainCount = 1, - .pSwapchains = &swapChain.swapchain, - .pImageIndices = ¤tSwapIndex, - }; - VkResult result = vkQueuePresentKHR(swapChain.presentQueue, &presentInfo); - - // On Android Q and above, a suboptimal surface is always reported after screen rotation: - // https://android-developers.googleblog.com/2020/02/handling-device-orientation-efficiently.html - if (result == VK_SUBOPTIMAL_KHR && !swapChain.suboptimal) { - utils::slog.w << "Vulkan Driver: Suboptimal swap chain." << utils::io::endl; - swapChain.suboptimal = true; - } - - // The surface can be "out of date" when it has been resized, which is not an error. - assert_invariant(result == VK_SUCCESS || result == VK_SUBOPTIMAL_KHR || - result == VK_ERROR_OUT_OF_DATE_KHR); + swapChain->present(); } -void VulkanDriver::bindUniformBuffer(uint32_t index, Handle boh) { - auto* bo = handle_cast(boh); - const VkDeviceSize offset = 0; - const VkDeviceSize size = VK_WHOLE_SIZE; - mPipelineCache.bindUniformBuffer((uint32_t) index, bo->buffer.getGpuBuffer(), offset, size); +void VulkanDriver::setPushConstant(backend::ShaderStage stage, uint8_t index, + backend::PushConstantVariant value) { + assert_invariant(mBoundPipeline.program && "Expect a program when writing to push constants"); + assert_invariant(mCurrentRenderPass.commandBuffer && "Should be called within a renderpass"); + mBoundPipeline.program->writePushConstant(mCurrentRenderPass.commandBuffer->buffer(), + mBoundPipeline.pipelineLayout, stage, index, value); } -void VulkanDriver::bindBufferRange(BufferObjectBinding bindingType, uint32_t index, - Handle boh, uint32_t offset, uint32_t size) { - - assert_invariant(bindingType == BufferObjectBinding::SHADER_STORAGE || - bindingType == BufferObjectBinding::UNIFORM); - - // TODO: implement BufferObjectBinding::SHADER_STORAGE case - - auto* bo = handle_cast(boh); - mPipelineCache.bindUniformBuffer((uint32_t)index, bo->buffer.getGpuBuffer(), offset, size); +void VulkanDriver::insertEventMarker(char const* string) { +#if FVK_ENABLED(FVK_DEBUG_GROUP_MARKERS) + mCommands.insertEventMarker(string, strlen(string)); +#endif } -void VulkanDriver::unbindBuffer(BufferObjectBinding bindingType, uint32_t index) { - // TODO: implement unbindBuffer() +void VulkanDriver::pushGroupMarker(char const* string) { + // Turns out all the markers are 0-terminated, so we can just pass it without len. +#if FVK_ENABLED(FVK_DEBUG_GROUP_MARKERS) + mCommands.pushGroupMarker(string); +#endif + FVK_SYSTRACE_CONTEXT(); + FVK_SYSTRACE_START(string); } -void VulkanDriver::bindSamplers(uint32_t index, Handle sbh) { - auto* hwsb = handle_cast(sbh); - mSamplerBindings[index] = hwsb; +void VulkanDriver::popGroupMarker(int) { +#if FVK_ENABLED(FVK_DEBUG_GROUP_MARKERS) + mCommands.popGroupMarker(); +#endif + FVK_SYSTRACE_CONTEXT(); + FVK_SYSTRACE_END(); } -void VulkanDriver::insertEventMarker(char const* string, uint32_t len) { - constexpr float MARKER_COLOR[] = { 0.0f, 1.0f, 0.0f, 1.0f }; - const VkCommandBuffer cmdbuffer = mContext.commands->get().cmdbuffer; - if (mContext.debugUtilsSupported) { - VkDebugUtilsLabelEXT labelInfo = { - .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT, - .pLabelName = string, - .color = {1, 1, 0, 1}, - }; - vkCmdInsertDebugUtilsLabelEXT(cmdbuffer, &labelInfo); - } else if (mContext.debugMarkersSupported) { - VkDebugMarkerMarkerInfoEXT markerInfo = {}; - markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT; - memcpy(markerInfo.color, &MARKER_COLOR[0], sizeof(MARKER_COLOR)); - markerInfo.pMarkerName = string; - vkCmdDebugMarkerInsertEXT(cmdbuffer, &markerInfo); - } -} +void VulkanDriver::startCapture(int) {} -void VulkanDriver::pushGroupMarker(char const* string, uint32_t len) { - // TODO: Add group marker color to the Driver API - constexpr float MARKER_COLOR[] = { 0.0f, 1.0f, 0.0f, 1.0f }; - const VkCommandBuffer cmdbuffer = mContext.commands->get().cmdbuffer; - if (mContext.debugUtilsSupported) { - VkDebugUtilsLabelEXT labelInfo = { - .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT, - .pLabelName = string, - .color = {0, 1, 0, 1}, - }; - vkCmdBeginDebugUtilsLabelEXT(cmdbuffer, &labelInfo); - mContext.currentDebugMarker = string; - } else if (mContext.debugMarkersSupported) { - VkDebugMarkerMarkerInfoEXT markerInfo = {}; - markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT; - memcpy(markerInfo.color, &MARKER_COLOR[0], sizeof(MARKER_COLOR)); - markerInfo.pMarkerName = string; - vkCmdDebugMarkerBeginEXT(cmdbuffer, &markerInfo); - } -} +void VulkanDriver::stopCapture(int) {} -void VulkanDriver::popGroupMarker(int) { - const VkCommandBuffer cmdbuffer = mContext.commands->get().cmdbuffer; - if (mContext.debugUtilsSupported) { - vkCmdEndDebugUtilsLabelEXT(cmdbuffer); - mContext.currentDebugMarker.clear(); - } else if (mContext.debugMarkersSupported) { - vkCmdDebugMarkerEndEXT(cmdbuffer); - } +void VulkanDriver::readPixels(Handle src, uint32_t x, uint32_t y, uint32_t width, + uint32_t height, PixelBufferDescriptor&& pbd) { + auto srcTarget = resource_ptr::cast(&mResourceManager, src); + mCommands.flush(); + mReadPixels.run( + srcTarget, x, y, width, height, mPlatform->getGraphicsQueueFamilyIndex(), + std::move(pbd), + [&context = mContext](uint32_t reqs, VkFlags flags) { + return context.selectMemoryType(reqs, flags); + }, + [this](PixelBufferDescriptor&& pbd) { + scheduleDestroy(std::move(pbd)); + }); } -void VulkanDriver::startCapture(int) { - +void VulkanDriver::readBufferSubData(backend::BufferObjectHandle boh, + uint32_t offset, uint32_t size, backend::BufferDescriptor&& p) { + // TODO: implement readBufferSubData + scheduleDestroy(std::move(p)); } -void VulkanDriver::stopCapture(int) { +void VulkanDriver::resolve( + Handle dst, uint8_t srcLevel, uint8_t srcLayer, + Handle src, uint8_t dstLevel, uint8_t dstLayer) { + FVK_SYSTRACE_SCOPE(); -} + FILAMENT_CHECK_PRECONDITION(mCurrentRenderPass.renderPass == VK_NULL_HANDLE) + << "resolve() cannot be invoked inside a render pass."; -void VulkanDriver::readPixels(Handle src, uint32_t x, uint32_t y, - uint32_t width, uint32_t height, PixelBufferDescriptor&& pbd) { - const VkDevice device = mContext.device; - VulkanRenderTarget* srcTarget = handle_cast(src); - VulkanTexture* srcTexture = srcTarget->getColor(0).texture; - assert_invariant(srcTexture); - const VkFormat srcFormat = srcTexture->getVkFormat(); - const bool swizzle = srcFormat == VK_FORMAT_B8G8R8A8_UNORM; - - // Create a host visible, linearly tiled image as a staging area. - - VkImageCreateInfo imageInfo { - .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, - .imageType = VK_IMAGE_TYPE_2D, - .format = srcFormat, - .extent = { width, height, 1 }, - .mipLevels = 1, - .arrayLayers = 1, - .samples = VK_SAMPLE_COUNT_1_BIT, - .tiling = VK_IMAGE_TILING_LINEAR, - .usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT, - .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, - }; + auto srcTexture = resource_ptr::cast(&mResourceManager, src); + auto dstTexture = resource_ptr::cast(&mResourceManager, dst); - VkImage stagingImage; - vkCreateImage(device, &imageInfo, VKALLOC, &stagingImage); - - VkMemoryRequirements memReqs; - VkDeviceMemory stagingMemory; - vkGetImageMemoryRequirements(device, stagingImage, &memReqs); - VkMemoryAllocateInfo allocInfo = { - .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, - .allocationSize = memReqs.size, - .memoryTypeIndex = mContext.selectMemoryType(memReqs.memoryTypeBits, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | - VK_MEMORY_PROPERTY_HOST_CACHED_BIT) - }; + assert_invariant(srcTexture); + assert_invariant(dstTexture); - vkAllocateMemory(device, &allocInfo, nullptr, &stagingMemory); - vkBindImageMemory(device, stagingImage, stagingMemory, 0); - - // TODO: don't flush/wait here, this should be asynchronous - - mContext.commands->flush(); - mContext.commands->wait(); - - // Transition the staging image layout. - - const VkCommandBuffer cmdbuffer = mContext.commands->get().cmdbuffer; - - transitionImageLayout(cmdbuffer, { - .image = stagingImage, - .oldLayout = VK_IMAGE_LAYOUT_UNDEFINED, - .newLayout = VK_IMAGE_LAYOUT_GENERAL, - .subresources = { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .baseMipLevel = 0, - .levelCount = 1, - .baseArrayLayer = 0, - .layerCount = 1, - }, - .srcStage = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, - .srcAccessMask = 0, - .dstStage = VK_PIPELINE_STAGE_TRANSFER_BIT, - .dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, - }); - - const VulkanAttachment srcAttachment = srcTarget->getColor(0); - - VkImageCopy imageCopyRegion = { - .srcSubresource = { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .mipLevel = srcAttachment.level, - .baseArrayLayer = srcAttachment.layer, - .layerCount = 1, - }, - .srcOffset = { - .x = (int32_t) x, - .y = (int32_t) (srcTarget->getExtent().height - (height + y)), - }, - .dstSubresource = { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .layerCount = 1, - }, - .extent = { - .width = width, - .height = height, - .depth = 1, - }, - }; + FILAMENT_CHECK_PRECONDITION( + dstTexture->width == srcTexture->width && dstTexture->height == srcTexture->height) + << "invalid resolve: src and dst sizes don't match"; - // Transition the source image layout (which might be the swap chain) + FILAMENT_CHECK_PRECONDITION(srcTexture->samples > 1 && dstTexture->samples == 1) + << "invalid resolve: src.samples=" << +srcTexture->samples + << ", dst.samples=" << +dstTexture->samples; - const VkImageSubresourceRange srcRange = { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .baseMipLevel = srcAttachment.level, - .levelCount = 1, - .baseArrayLayer = srcAttachment.layer, - .layerCount = 1, - }; + FILAMENT_CHECK_PRECONDITION(srcTexture->format == dstTexture->format) + << "src and dst texture format don't match"; - srcTexture->transitionLayout(cmdbuffer, srcRange, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); + FILAMENT_CHECK_PRECONDITION(!isDepthFormat(srcTexture->format)) + << "can't resolve depth formats"; - // Perform the copy into the staging area. At this point we know that the src layout is - // TRANSFER_SRC_OPTIMAL and the staging area is GENERAL. + FILAMENT_CHECK_PRECONDITION(!isStencilFormat(srcTexture->format)) + << "can't resolve stencil formats"; - UTILS_UNUSED_IN_RELEASE VkExtent2D srcExtent = srcAttachment.getExtent2D(); - assert_invariant(imageCopyRegion.srcOffset.x + imageCopyRegion.extent.width <= srcExtent.width); - assert_invariant(imageCopyRegion.srcOffset.y + imageCopyRegion.extent.height <= srcExtent.height); + FILAMENT_CHECK_PRECONDITION(any(dstTexture->usage & TextureUsage::BLIT_DST)) + << "texture doesn't have BLIT_DST"; - vkCmdCopyImage(cmdbuffer, srcAttachment.getImage(), - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, stagingImage, VK_IMAGE_LAYOUT_GENERAL, - 1, &imageCopyRegion); + FILAMENT_CHECK_PRECONDITION(any(srcTexture->usage & TextureUsage::BLIT_SRC)) + << "texture doesn't have BLIT_SRC"; - // Restore the source image layout. Between driver API calls, color images are always kept in - // UNDEFINED layout or in their "usage default" layout (see comment for getDefaultImageLayout). + mBlitter.resolve( + { .texture = dstTexture, .level = dstLevel, .layer = dstLayer }, + { .texture = srcTexture, .level = srcLevel, .layer = srcLayer }); +} - srcTexture->transitionLayout(cmdbuffer, srcRange, - getDefaultImageLayout(TextureUsage::COLOR_ATTACHMENT)); +void VulkanDriver::blit( + Handle dst, uint8_t srcLevel, uint8_t srcLayer, math::uint2 dstOrigin, + Handle src, uint8_t dstLevel, uint8_t dstLayer, math::uint2 srcOrigin, + math::uint2 size) { + FVK_SYSTRACE_SCOPE(); - // TODO: don't flush/wait here -- we should do this asynchronously + FILAMENT_CHECK_PRECONDITION(mCurrentRenderPass.renderPass == VK_NULL_HANDLE) + << "blit() cannot be invoked inside a render pass."; - // Flush and wait. - mContext.commands->flush(); - mContext.commands->wait(); + auto srcTexture = resource_ptr::cast(&mResourceManager, src); + auto dstTexture = resource_ptr::cast(&mResourceManager, dst); - VkImageSubresource subResource { .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT }; - VkSubresourceLayout subResourceLayout; - vkGetImageSubresourceLayout(device, stagingImage, &subResource, &subResourceLayout); + FILAMENT_CHECK_PRECONDITION(any(dstTexture->usage & TextureUsage::BLIT_DST)) + << "texture doesn't have BLIT_DST"; - // Map image memory so we can start copying from it. + FILAMENT_CHECK_PRECONDITION(any(srcTexture->usage & TextureUsage::BLIT_SRC)) + << "texture doesn't have BLIT_SRC"; - const uint8_t* srcPixels; - vkMapMemory(device, stagingMemory, 0, VK_WHOLE_SIZE, 0, (void**) &srcPixels); - srcPixels += subResourceLayout.offset; + FILAMENT_CHECK_PRECONDITION(srcTexture->format == dstTexture->format) + << "src and dst texture format don't match"; - if (!DataReshaper::reshapeImage(&pbd, getComponentType(srcFormat), getComponentCount(srcFormat), - srcPixels, subResourceLayout.rowPitch, width, height, swizzle)) { - utils::slog.e << "Unsupported PixelDataFormat or PixelDataType" << utils::io::endl; - } + // The Y inversion below makes it so that Vk matches GL and Metal. - vkUnmapMemory(device, stagingMemory); - vkDestroyImage(device, stagingImage, nullptr); - vkFreeMemory(device, stagingMemory, nullptr); + auto const srcLeft = int32_t(srcOrigin.x); + auto const dstLeft = int32_t(dstOrigin.x); + auto const srcTop = int32_t(srcTexture->height - (srcOrigin.y + size.y)); + auto const dstTop = int32_t(dstTexture->height - (dstOrigin.y + size.y)); + auto const srcRight = int32_t(srcOrigin.x + size.x); + auto const dstRight = int32_t(dstOrigin.x + size.x); + auto const srcBottom = int32_t(srcTop + size.y); + auto const dstBottom = int32_t(dstTop + size.y); + VkOffset3D const srcOffsets[2] = { { srcLeft, srcTop, 0 }, { srcRight, srcBottom, 1 }}; + VkOffset3D const dstOffsets[2] = { { dstLeft, dstTop, 0 }, { dstRight, dstBottom, 1 }}; - scheduleDestroy(std::move(pbd)); + // no scaling guaranteed + mBlitter.blit(VK_FILTER_NEAREST, + { .texture = dstTexture, .level = dstLevel, .layer = dstLayer }, dstOffsets, + { .texture = srcTexture, .level = srcLevel, .layer = srcLayer }, srcOffsets); } -void VulkanDriver::readBufferSubData(backend::BufferObjectHandle boh, - uint32_t offset, uint32_t size, backend::BufferDescriptor&& p) { - // TODO: implement readBufferSubData - scheduleDestroy(std::move(p)); -} +void VulkanDriver::blitDEPRECATED(TargetBufferFlags buffers, + Handle dst, Viewport dstRect, + Handle src, Viewport srcRect, + SamplerMagFilter filter) { + FVK_SYSTRACE_SCOPE(); -void VulkanDriver::blit(TargetBufferFlags buffers, Handle dst, Viewport dstRect, - Handle src, Viewport srcRect, SamplerMagFilter filter) { - assert_invariant(mContext.currentRenderPass.renderPass == VK_NULL_HANDLE); + // Note: blitDEPRECATED is only used for Renderer::copyFrame() - // blit operation only support COLOR0 color buffer - assert_invariant( - !(buffers & (TargetBufferFlags::COLOR_ALL & ~TargetBufferFlags::COLOR0))); + FILAMENT_CHECK_PRECONDITION(mCurrentRenderPass.renderPass == VK_NULL_HANDLE) + << "blitDEPRECATED() cannot be invoked inside a render pass."; - if (UTILS_UNLIKELY(mContext.currentRenderPass.renderPass)) { - utils::slog.e << "Blits cannot be invoked inside a render pass." << utils::io::endl; - return; - } + FILAMENT_CHECK_PRECONDITION(buffers == TargetBufferFlags::COLOR0) + << "blitDEPRECATED only supports COLOR0"; + + FILAMENT_CHECK_PRECONDITION( + srcRect.left >= 0 && srcRect.bottom >= 0 && dstRect.left >= 0 && dstRect.bottom >= 0) + << "Source and destination rects must be positive."; - VulkanRenderTarget* dstTarget = handle_cast(dst); - VulkanRenderTarget* srcTarget = handle_cast(src); + auto dstTarget = resource_ptr::cast(&mResourceManager, dst); + auto srcTarget = resource_ptr::cast(&mResourceManager, src); - VkFilter vkfilter = filter == SamplerMagFilter::NEAREST ? VK_FILTER_NEAREST : VK_FILTER_LINEAR; + VkFilter const vkfilter = (filter == SamplerMagFilter::NEAREST) ? + VK_FILTER_NEAREST : VK_FILTER_LINEAR; // The Y inversion below makes it so that Vk matches GL and Metal. - const VkExtent2D srcExtent = srcTarget->getExtent(); - const int32_t srcLeft = srcRect.left; - const int32_t srcTop = srcExtent.height - srcRect.bottom - srcRect.height; - const int32_t srcRight = srcRect.left + srcRect.width; - const int32_t srcBottom = srcTop + srcRect.height; - const VkOffset3D srcOffsets[2] = { { srcLeft, srcTop, 0 }, { srcRight, srcBottom, 1 }}; - - const VkExtent2D dstExtent = dstTarget->getExtent(); - const int32_t dstLeft = dstRect.left; - const int32_t dstTop = dstExtent.height - dstRect.bottom - dstRect.height; - const int32_t dstRight = dstRect.left + dstRect.width; - const int32_t dstBottom = dstTop + dstRect.height; - const VkOffset3D dstOffsets[2] = { { dstLeft, dstTop, 0 }, { dstRight, dstBottom, 1 }}; - - if (any(buffers & TargetBufferFlags::DEPTH) && srcTarget->hasDepth() && dstTarget->hasDepth()) { - mBlitter.blitDepth({dstTarget, dstOffsets, srcTarget, srcOffsets}); - } + VkExtent2D const srcExtent = srcTarget->getExtent(); + VkExtent2D const dstExtent = dstTarget->getExtent(); - if (any(buffers & TargetBufferFlags::COLOR0)) { - mBlitter.blitColor({ dstTarget, dstOffsets, srcTarget, srcOffsets, vkfilter, int(0) }); - } + auto const dstLeft = int32_t(dstRect.left); + auto const srcLeft = int32_t(srcRect.left); + auto const dstTop = int32_t(dstExtent.height - (dstRect.bottom + dstRect.height)); + auto const srcTop = int32_t(srcExtent.height - (srcRect.bottom + srcRect.height)); + auto const dstRight = int32_t(dstRect.left + dstRect.width); + auto const srcRight = int32_t(srcRect.left + srcRect.width); + auto const dstBottom = int32_t(dstTop + dstRect.height); + auto const srcBottom = int32_t(srcTop + srcRect.height); + VkOffset3D const srcOffsets[2] = { { srcLeft, srcTop, 0 }, { srcRight, srcBottom, 1 }}; + VkOffset3D const dstOffsets[2] = { { dstLeft, dstTop, 0 }, { dstRight, dstBottom, 1 }}; + + mBlitter.blit(vkfilter, + dstTarget->getColor0(), dstOffsets, + srcTarget->getColor0(), srcOffsets); } -void VulkanDriver::draw(PipelineState pipelineState, Handle rph, - const uint32_t instanceCount) { - VulkanCommandBuffer const* commands = &mContext.commands->get(); - VkCommandBuffer cmdbuffer = commands->cmdbuffer; - const VulkanRenderPrimitive& prim = *handle_cast(rph); +void VulkanDriver::bindPipeline(PipelineState const& pipelineState) { + FVK_SYSTRACE_SCOPE(); + auto commands = mCurrentRenderPass.commandBuffer; + auto vbi = resource_ptr::cast(&mResourceManager, + pipelineState.vertexBufferInfo); Handle programHandle = pipelineState.program; - RasterState rasterState = pipelineState.rasterState; - PolygonOffset depthOffset = pipelineState.polygonOffset; - const Viewport& scissorBox = pipelineState.scissor; - - auto* program = handle_cast(programHandle); - mDisposer.acquire(program); - mDisposer.acquire(prim.indexBuffer); - mDisposer.acquire(prim.vertexBuffer); - - // If this is a debug build, validate the current shader. -#if !defined(NDEBUG) - if (program->bundle.vertex == VK_NULL_HANDLE || program->bundle.fragment == VK_NULL_HANDLE) { - utils::slog.e << "Binding missing shader: " << program->name.c_str() << utils::io::endl; - } -#endif + RasterState const& rasterState = pipelineState.rasterState; + PolygonOffset const& depthOffset = pipelineState.polygonOffset; + + auto program = resource_ptr::cast(&mResourceManager, programHandle); + commands->acquire(program); // Update the VK raster state. + auto rt = mCurrentRenderPass.renderTarget; + + VulkanPipelineCache::RasterState const vulkanRasterState{ + .cullMode = getCullMode(rasterState.culling), + .frontFace = getFrontFace(rasterState.inverseFrontFaces), + .depthBiasEnable = (depthOffset.constant || depthOffset.slope) ? true : false, + .blendEnable = rasterState.hasBlending(), + .depthWriteEnable = rasterState.depthWrite, + .alphaToCoverageEnable = rasterState.alphaToCoverage, + .srcColorBlendFactor = getBlendFactor(rasterState.blendFunctionSrcRGB), + .dstColorBlendFactor = getBlendFactor(rasterState.blendFunctionDstRGB), + .srcAlphaBlendFactor = getBlendFactor(rasterState.blendFunctionSrcAlpha), + .dstAlphaBlendFactor = getBlendFactor(rasterState.blendFunctionDstAlpha), + .colorWriteMask = (VkColorComponentFlags) (rasterState.colorWrite ? 0xf : 0x0), + .rasterizationSamples = rt->getSamples(), + .depthClamp = rasterState.depthClamp, + .colorTargetCount = rt->getColorTargetCount(mCurrentRenderPass), + .colorBlendOp = rasterState.blendEquationRGB, + .alphaBlendOp = rasterState.blendEquationAlpha, + .depthCompareOp = rasterState.depthFunc, + .depthBiasConstantFactor = depthOffset.constant, + .depthBiasSlopeFactor = depthOffset.slope + }; - const VulkanRenderTarget* rt = mContext.currentRenderPass.renderTarget; - - auto& vkraster = mContext.rasterState; - vkraster.cullMode = getCullMode(rasterState.culling); - vkraster.frontFace = getFrontFace(rasterState.inverseFrontFaces); - vkraster.depthBiasEnable = (depthOffset.constant || depthOffset.slope) ? true : false; - vkraster.depthBiasConstantFactor = depthOffset.constant; - vkraster.depthBiasSlopeFactor = depthOffset.slope; - vkraster.blendEnable = rasterState.hasBlending(); - vkraster.srcColorBlendFactor = getBlendFactor(rasterState.blendFunctionSrcRGB); - vkraster.dstColorBlendFactor = getBlendFactor(rasterState.blendFunctionDstRGB); - vkraster.colorBlendOp = rasterState.blendEquationRGB; - vkraster.srcAlphaBlendFactor = getBlendFactor(rasterState.blendFunctionSrcAlpha); - vkraster.dstAlphaBlendFactor = getBlendFactor(rasterState.blendFunctionDstAlpha); - vkraster.alphaBlendOp = rasterState.blendEquationAlpha; - vkraster.colorWriteMask = (VkColorComponentFlags) (rasterState.colorWrite ? 0xf : 0x0); - vkraster.depthWriteEnable = rasterState.depthWrite; - vkraster.depthCompareOp = rasterState.depthFunc; - vkraster.rasterizationSamples = rt->getSamples(); - vkraster.alphaToCoverageEnable = rasterState.alphaToCoverage; - vkraster.colorTargetCount = rt->getColorTargetCount(mContext.currentRenderPass); + // unfortunately in Vulkan the topology is per pipeline + VkPrimitiveTopology const topology = + VulkanPipelineCache::getPrimitiveTopology(pipelineState.primitiveType); // Declare fixed-size arrays that get passed to the pipeCache and to vkCmdBindVertexBuffers. - VulkanPipelineCache::VertexArray varray = {}; - VkBuffer buffers[MAX_VERTEX_ATTRIBUTE_COUNT] = {}; - VkDeviceSize offsets[MAX_VERTEX_ATTRIBUTE_COUNT] = {}; - - // For each attribute, append to each of the above lists. - const uint32_t bufferCount = prim.vertexBuffer->attributes.size(); - for (uint32_t attribIndex = 0; attribIndex < bufferCount; attribIndex++) { - Attribute attrib = prim.vertexBuffer->attributes[attribIndex]; - - const bool isInteger = attrib.flags & Attribute::FLAG_INTEGER_TARGET; - const bool isNormalized = attrib.flags & Attribute::FLAG_NORMALIZED; - - VkFormat vkformat = getVkFormat(attrib.type, isNormalized, isInteger); - - // HACK: Re-use the positions buffer as a dummy buffer for disabled attributes. Filament's - // vertex shaders declare all attributes as either vec4 or uvec4 (the latter for bone - // indices), and positions are always at least 32 bits per element. Therefore we can assign - // a dummy type of either R8G8B8A8_UINT or R8G8B8A8_SNORM, depending on whether the shader - // expects to receive floats or ints. - if (attrib.buffer == Attribute::BUFFER_UNUSED) { - vkformat = isInteger ? VK_FORMAT_R8G8B8A8_UINT : VK_FORMAT_R8G8B8A8_SNORM; - attrib = prim.vertexBuffer->attributes[0]; - } + VkVertexInputAttributeDescription const* attribDesc = vbi->getAttribDescriptions(); + VkVertexInputBindingDescription const* bufferDesc = vbi->getBufferDescriptions(); - const VulkanBuffer* buffer = prim.vertexBuffer->buffers[attrib.buffer]; + // Push state changes to the VulkanPipelineCache instance. This is fast and does not make VK calls. + mPipelineCache.bindProgram(program); + mPipelineCache.bindRasterState(vulkanRasterState); + mPipelineCache.bindPrimitiveTopology(topology); + mPipelineCache.bindVertexArray(attribDesc, bufferDesc, vbi->getAttributeCount()); + + auto& setLayouts = pipelineState.pipelineLayout.setLayout; + VulkanDescriptorSetLayout::DescriptorSetLayoutArray layoutList; + uint8_t layoutCount = 0; + std::transform(setLayouts.begin(), setLayouts.end(), layoutList.begin(), + [&](Handle handle) -> VkDescriptorSetLayout { + if (!handle) { + return VK_NULL_HANDLE; + } + auto layout = + resource_ptr::cast(&mResourceManager, handle); + layoutCount++; + return layout->getVkLayout(); + }); + auto pipelineLayout = mPipelineLayoutCache.getLayout(layoutList, program); + + constexpr uint8_t descriptorSetMaskTable[4] = {0x1, 0x3, 0x7, 0xF}; + + mBoundPipeline = { + .program = program, + .pipelineLayout = pipelineLayout, + .descriptorSetMask = DescriptorSetMask(descriptorSetMaskTable[layoutCount]), + }; - // If the vertex buffer is missing a constituent buffer object, skip the draw call. - // There is no need to emit an error message because this is not explicitly forbidden. - if (buffer == nullptr) { - return; - } + mPipelineCache.bindLayout(pipelineLayout); + mPipelineCache.bindPipeline(mCurrentRenderPass.commandBuffer); +} - buffers[attribIndex] = buffer->getGpuBuffer(); - offsets[attribIndex] = attrib.offset; - varray.attributes[attribIndex] = { - .location = attribIndex, // matches the GLSL layout specifier - .binding = attribIndex, // matches the position within vkCmdBindVertexBuffers - .format = vkformat, - }; - varray.buffers[attribIndex] = { - .binding = attribIndex, - .stride = attrib.stride, - }; - } +void VulkanDriver::bindRenderPrimitive(Handle rph) { + FVK_SYSTRACE_SCOPE(); - // Push state changes to the VulkanPipelineCache instance. This is fast and does not make VK calls. - mPipelineCache.bindProgram(*program); - mPipelineCache.bindRasterState(mContext.rasterState); - mPipelineCache.bindPrimitiveTopology(prim.primitiveTopology); - mPipelineCache.bindVertexArray(varray); - - // Query the program for the mapping from (SamplerGroupBinding,Offset) to (SamplerBinding), - // where "SamplerBinding" is the integer in the GLSL, and SamplerGroupBinding is the abstract - // Filament concept used to form groups of samplers. - - VkDescriptorImageInfo samplerInfo[VulkanPipelineCache::SAMPLER_BINDING_COUNT] = {}; - VulkanPipelineCache::UsageFlags usage; - - for (uint8_t samplerGroupIdx = 0; samplerGroupIdx < Program::SAMPLER_BINDING_COUNT; samplerGroupIdx++) { - const auto& samplerGroup = program->samplerGroupInfo[samplerGroupIdx]; - const auto& samplers = samplerGroup.samplers; - if (samplers.empty()) { - continue; - } - VulkanSamplerGroup* vksb = mSamplerBindings[samplerGroupIdx]; - if (!vksb) { - continue; - } - SamplerGroup* sb = vksb->sb.get(); - assert_invariant(sb->getSize() == samplers.size()); - size_t samplerIdx = 0; - for (auto& sampler : samplers) { - const SamplerDescriptor* boundSampler = sb->data() + samplerIdx; - samplerIdx++; - - if (UTILS_LIKELY(boundSampler->t)) { - VulkanTexture* texture = handle_cast(boundSampler->t); - mDisposer.acquire(texture); - - // TODO: can this uninitialized check be checked in a higher layer? - // This fallback path is very flaky because the dummy texture might not have - // matching characteristics. (e.g. if the missing texture is a 3D texture) - if (UTILS_UNLIKELY(texture->getPrimaryImageLayout() == VK_IMAGE_LAYOUT_UNDEFINED)) { -#ifndef NDEBUG - utils::slog.w << "Uninitialized texture bound to '" << sampler.name.c_str() << "'"; - utils::slog.w << " in material '" << program->name.c_str() << "'"; - utils::slog.w << " at binding point " << +sampler.binding << utils::io::endl; -#endif - texture = mContext.emptyTexture; - } + VulkanCommandBuffer* commands = mCurrentRenderPass.commandBuffer; + VkCommandBuffer cmdbuffer = commands->buffer(); + auto prim = resource_ptr::cast(&mResourceManager, rph); + commands->acquire(prim); - const SamplerParams& samplerParams = boundSampler->s; - VkSampler vksampler = mSamplerCache.getSampler(samplerParams); + // This *must* match the VulkanVertexBufferInfo that was bound in bindPipeline(). But we want + // to allow to call this before bindPipeline(), so the validation can only happen in draw() + auto vbi = prim->vertexBuffer->vbi; - usage = VulkanPipelineCache::getUsageFlags(sampler.binding, samplerGroup.stageFlags, usage); + uint32_t const bufferCount = vbi->getAttributeCount(); + VkDeviceSize const* offsets = vbi->getOffsets(); + VkBuffer const* buffers = prim->vertexBuffer->getVkBuffers(); - samplerInfo[sampler.binding] = { - .sampler = vksampler, - .imageView = texture->getPrimaryImageView(), - .imageLayout = texture->getPrimaryImageLayout() - }; - } - } + // Next bind the vertex buffers and index buffer. One potential performance improvement is to + // avoid rebinding these if they are already bound, but since we do not (yet) support subranges + // it would be rare for a client to make consecutive draw calls with the same render primitive. + vkCmdBindVertexBuffers(cmdbuffer, 0, bufferCount, buffers, offsets); + vkCmdBindIndexBuffer(cmdbuffer, prim->indexBuffer->buffer.getGpuBuffer(), 0, + prim->indexBuffer->indexType); +} + +void VulkanDriver::bindDescriptorSet( + backend::DescriptorSetHandle dsh, + backend::descriptor_set_t setIndex, + backend::DescriptorSetOffsetArray&& offsets) { + if (dsh) { + auto set = resource_ptr::cast(&mResourceManager, dsh); + mDescriptorSetManager.bind(setIndex, set, std::move(offsets)); + } else { + mDescriptorSetManager.unbind(setIndex); } +} - mPipelineCache.bindSamplers(samplerInfo, usage); +void VulkanDriver::draw2(uint32_t indexOffset, uint32_t indexCount, uint32_t instanceCount) { + FVK_SYSTRACE_SCOPE(); + VkCommandBuffer cmdbuffer = mCurrentRenderPass.commandBuffer->buffer(); - // Bind new descriptor sets if they need to change. - // If descriptor set allocation failed, skip the draw call and bail. No need to emit an error - // message since the validation layers already do so. - if (!mPipelineCache.bindDescriptors(cmdbuffer)) { - return; - } + mDescriptorSetManager.commit(mCurrentRenderPass.commandBuffer, + mBoundPipeline.pipelineLayout, + mBoundPipeline.descriptorSetMask); + + // Finally, make the actual draw call. TODO: support subranges + const uint32_t firstIndex = indexOffset; + const int32_t vertexOffset = 0; + const uint32_t firstInstId = 0; + + vkCmdDrawIndexed(cmdbuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstId); +} + +void VulkanDriver::draw(PipelineState state, Handle rph, + uint32_t const indexOffset, uint32_t const indexCount, uint32_t const instanceCount) { + auto rp = resource_ptr::cast(&mResourceManager, rph); + state.primitiveType = rp->type; + state.vertexBufferInfo = Handle(rp->vertexBuffer->vbi.id()); + bindPipeline(state); + bindRenderPrimitive(rph); + draw2(indexOffset, indexCount, instanceCount); +} + +void VulkanDriver::dispatchCompute(Handle program, math::uint3 workGroupCount) { + // FIXME: implement me +} + +void VulkanDriver::scissor(Viewport scissorBox) { + VkCommandBuffer cmdbuffer = mCurrentRenderPass.commandBuffer->buffer(); + + // TODO: it's a common case that scissor() is called with (0, 0, maxint, maxint) + // we should maybe have a fast path for this and avoid vkCmdSetScissor() if possible // Set scissoring. // clamp left-bottom to 0,0 and avoid overflows @@ -1688,62 +1820,19 @@ void VulkanDriver::draw(PipelineState pipelineState, Handle r .extent = { uint32_t(r - l), uint32_t(t - b) } }; + auto rt = mCurrentRenderPass.renderTarget; rt->transformClientRectToPlatform(&scissor); - mPipelineCache.bindScissor(cmdbuffer, scissor); - - // Bind a new pipeline if the pipeline state changed. - // If allocation failed, skip the draw call and bail. We do not emit an error since the - // validation layer will already do so. - if (!mPipelineCache.bindPipeline(cmdbuffer)) { - return; - } - - // Next bind the vertex buffers and index buffer. One potential performance improvement is to - // avoid rebinding these if they are already bound, but since we do not (yet) support subranges - // it would be rare for a client to make consecutive draw calls with the same render primitive. - vkCmdBindVertexBuffers(cmdbuffer, 0, bufferCount, buffers, offsets); - vkCmdBindIndexBuffer(cmdbuffer, prim.indexBuffer->buffer.getGpuBuffer(), 0, - prim.indexBuffer->indexType); - - // Finally, make the actual draw call. TODO: support subranges - const uint32_t indexCount = prim.count; - const uint32_t firstIndex = prim.offset / prim.indexBuffer->elementSize; - const int32_t vertexOffset = 0; - const uint32_t firstInstId = 0; - vkCmdDrawIndexed(cmdbuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstId); -} - -void VulkanDriver::dispatchCompute(Handle program, math::uint3 workGroupCount) { - // FIXME: implement me + vkCmdSetScissor(cmdbuffer, 0, 1, &scissor); } void VulkanDriver::beginTimerQuery(Handle tqh) { - VulkanCommandBuffer const* commands = &mContext.commands->get(); - VulkanTimerQuery* vtq = handle_cast(tqh); - const uint32_t index = vtq->startingQueryIndex; - const VkPipelineStageFlagBits stage = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; - - vkCmdResetQueryPool(commands->cmdbuffer, mContext.timestamps.pool, index, 2); - vkCmdWriteTimestamp(commands->cmdbuffer, stage, mContext.timestamps.pool, index); - vtq->cmdbuffer.store(commands); + auto vtq = resource_ptr::cast(&mResourceManager, tqh); + mTimestamps->beginQuery(&(mCommands.get()), vtq); } void VulkanDriver::endTimerQuery(Handle tqh) { - VulkanCommandBuffer const* commands = &mContext.commands->get(); - VulkanTimerQuery* vtq = handle_cast(tqh); - const uint32_t index = vtq->stoppingQueryIndex; - const VkPipelineStageFlagBits stage = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; - vkCmdWriteTimestamp(commands->cmdbuffer, stage, mContext.timestamps.pool, index); -} - -void VulkanDriver::refreshSwapChain() { - VulkanSwapChain& swapChain = *mContext.currentSwapChain; - - assert_invariant(!swapChain.headlessQueue && "Resizing headless swap chains is not supported."); - swapChain.destroy(); - swapChain.create(mStagePool); - - mFramebufferCache.reset(); + auto vtq = resource_ptr::cast(&mResourceManager, tqh); + mTimestamps->endQuery(&(mCommands.get()), vtq); } void VulkanDriver::debugCommandBegin(CommandStream* cmds, bool synchronous, const char* methodName) noexcept { @@ -1766,7 +1855,7 @@ void VulkanDriver::debugCommandBegin(CommandStream* cmds, bool synchronous, cons assert_invariant(inRenderPass); inRenderPass = false; } else if (inRenderPass && OUTSIDE_COMMANDS.find(command) != OUTSIDE_COMMANDS.end()) { - utils::slog.e << command.data() << " issued inside a render pass." << utils::io::endl; + FVK_LOGE << command.data() << " issued inside a render pass." << utils::io::endl; } #endif } @@ -1774,6 +1863,10 @@ void VulkanDriver::debugCommandBegin(CommandStream* cmds, bool synchronous, cons void VulkanDriver::resetState(int) { } +void VulkanDriver::setDebugTag(HandleBase::HandleId handleId, utils::CString tag) { + mResourceManager.associateHandle(handleId, std::move(tag)); +} + // explicit instantiation of the Dispatcher template class ConcreteDispatcher; diff --git a/filament/backend/src/vulkan/VulkanDriver.h b/filament/backend/src/vulkan/VulkanDriver.h index e403d0926fe..83215a2ce50 100644 --- a/filament/backend/src/vulkan/VulkanDriver.h +++ b/filament/backend/src/vulkan/VulkanDriver.h @@ -17,40 +17,76 @@ #ifndef TNT_FILAMENT_BACKEND_VULKANDRIVER_H #define TNT_FILAMENT_BACKEND_VULKANDRIVER_H -#include "VulkanPipelineCache.h" #include "VulkanBlitter.h" -#include "VulkanDisposer.h" #include "VulkanConstants.h" #include "VulkanContext.h" #include "VulkanFboCache.h" +#include "VulkanHandles.h" +#include "VulkanPipelineCache.h" +#include "VulkanReadPixels.h" #include "VulkanSamplerCache.h" #include "VulkanStagePool.h" #include "VulkanUtility.h" +#include "backend/DriverEnums.h" +#include "caching/VulkanDescriptorSetManager.h" +#include "caching/VulkanPipelineLayoutCache.h" +#include "memory/ResourceManager.h" +#include "memory/ResourcePointer.h" -#include "private/backend/Driver.h" -#include "private/backend/HandleAllocator.h" #include "DriverBase.h" +#include "private/backend/Driver.h" -#include #include +#include namespace filament::backend { class VulkanPlatform; -struct VulkanSamplerGroup; + +// The maximum number of attachments for any renderpass (color + resolve + depth) +constexpr uint8_t MAX_RENDERTARGET_ATTACHMENT_TEXTURES = + MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT * 2 + 1; class VulkanDriver final : public DriverBase { public: - static Driver* create(VulkanPlatform* platform, - const char* const* ppEnabledExtensions, uint32_t enabledExtensionCount, const Platform::DriverConfig& driverConfig) noexcept; + static Driver* create(VulkanPlatform* platform, VulkanContext const& context, + Platform::DriverConfig const& driverConfig) noexcept; + +#if FVK_ENABLED(FVK_DEBUG_DEBUG_UTILS) + // Encapsulates the VK_EXT_debug_utils extension. In particular, we use + // vkSetDebugUtilsObjectNameEXT and vkCreateDebugUtilsMessengerEXT + class DebugUtils { + public: + static void setName(VkObjectType type, uint64_t handle, char const* name); + + private: + static DebugUtils* get(); + + DebugUtils(VkInstance instance, VkDevice device, VulkanContext const* context); + ~DebugUtils(); + + VkInstance const mInstance; + VkDevice const mDevice; + bool const mEnabled; + VkDebugUtilsMessengerEXT mDebugMessenger = VK_NULL_HANDLE; + + static DebugUtils* mSingleton; + + friend class VulkanDriver; + }; +#endif // FVK_ENABLED(FVK_DEBUG_DEBUG_UTILS) private: + template + using resource_ptr = fvkmemory::resource_ptr; - void debugCommandBegin(CommandStream* cmds, bool synchronous, const char* methodName) noexcept override; + static constexpr uint8_t MAX_SAMPLER_BINDING_COUNT = Program::SAMPLER_BINDING_COUNT; - inline VulkanDriver(VulkanPlatform* platform, - const char* const* ppEnabledExtensions, uint32_t enabledExtensionCount, - const Platform::DriverConfig& driverConfig) noexcept; + void debugCommandBegin(CommandStream* cmds, bool synchronous, + const char* methodName) noexcept override; + + inline VulkanDriver(VulkanPlatform* platform, VulkanContext const& context, + Platform::DriverConfig const& driverConfig) noexcept; ~VulkanDriver() noexcept override; @@ -61,96 +97,62 @@ class VulkanDriver final : public DriverBase { template friend class ConcreteDispatcher; -#define DECL_DRIVER_API(methodName, paramsDecl, params) \ +#define DECL_DRIVER_API(methodName, paramsDecl, params) \ UTILS_ALWAYS_INLINE inline void methodName(paramsDecl); -#define DECL_DRIVER_API_SYNCHRONOUS(RetType, methodName, paramsDecl, params) \ +#define DECL_DRIVER_API_SYNCHRONOUS(RetType, methodName, paramsDecl, params) \ RetType methodName(paramsDecl) override; -#define DECL_DRIVER_API_RETURN(RetType, methodName, paramsDecl, params) \ - RetType methodName##S() noexcept override; \ +#define DECL_DRIVER_API_RETURN(RetType, methodName, paramsDecl, params) \ + RetType methodName##S() noexcept override; \ UTILS_ALWAYS_INLINE inline void methodName##R(RetType, paramsDecl); #include "private/backend/DriverAPI.inc" VulkanDriver(VulkanDriver const&) = delete; - VulkanDriver& operator = (VulkanDriver const&) = delete; + VulkanDriver& operator=(VulkanDriver const&) = delete; private: + void collectGarbage(); - HandleAllocatorVK mHandleAllocator; - - VulkanPlatform& mContextManager; + VulkanPlatform* mPlatform = nullptr; + fvkmemory::ResourceManager mResourceManager; + std::unique_ptr mTimestamps; - template - Handle initHandle(ARGS&& ... args) noexcept { - return mHandleAllocator.allocateAndConstruct(std::forward(args) ...); - } - - template - Handle allocHandle() noexcept { - return mHandleAllocator.allocate(); - } - - template - typename std::enable_if::value, D>::type* - construct(Handle const& handle, ARGS&& ... args) noexcept { - return mHandleAllocator.construct(handle, std::forward(args) ...); - } - - template::value, D>::type> - void destruct(Handle handle, D const* p) noexcept { - return mHandleAllocator.deallocate(handle, p); - } - - template - typename std::enable_if_t< - std::is_pointer_v && - std::is_base_of_v>, Dp> - handle_cast(Handle& handle) noexcept { - return mHandleAllocator.handle_cast(handle); - } - - template - inline typename std::enable_if_t< - std::is_pointer_v && - std::is_base_of_v>, Dp> - handle_cast(Handle const& handle) noexcept { - return mHandleAllocator.handle_cast(handle); - } - - template - void destruct(Handle handle) noexcept { - destruct(handle, handle_cast(handle)); - } - - // This version of destruct takes a VulkanContext and calls a terminate(VulkanContext&) - // on the handle before calling the dtor - template - void destruct(VulkanContext& context, Handle handle) noexcept { - auto ptr = handle_cast(handle); - ptr->terminate(context); - mHandleAllocator.deallocate(handle, ptr); - } - - inline void setRenderPrimitiveBuffer(Handle rph, - Handle vbh, Handle ibh); - - inline void setRenderPrimitiveRange(Handle rph, PrimitiveType pt, - uint32_t offset, uint32_t minIndex, uint32_t maxIndex, uint32_t count); - - void refreshSwapChain(); - void collectGarbage(); + resource_ptr mCurrentSwapChain; + resource_ptr mDefaultRenderTarget; + VulkanRenderPass mCurrentRenderPass = {}; + VmaAllocator mAllocator = VK_NULL_HANDLE; + VkDebugReportCallbackEXT mDebugCallback = VK_NULL_HANDLE; VulkanContext mContext = {}; + + VulkanCommands mCommands; + VulkanPipelineLayoutCache mPipelineLayoutCache; VulkanPipelineCache mPipelineCache; - VulkanDisposer mDisposer; VulkanStagePool mStagePool; VulkanFboCache mFramebufferCache; VulkanSamplerCache mSamplerCache; VulkanBlitter mBlitter; - VulkanSamplerGroup* mSamplerBindings[VulkanPipelineCache::SAMPLER_BINDING_COUNT] = {}; + VulkanReadPixels mReadPixels; + VulkanDescriptorSetManager mDescriptorSetManager; + + // This is necessary for us to write to push constants after binding a pipeline. + struct { + resource_ptr program; + VkPipelineLayout pipelineLayout; + DescriptorSetMask descriptorSetMask; + } mBoundPipeline = {}; + + // We need to store information about a render pass to enable better barriers at the end of a + // renderpass. + struct { + using AttachmentArray = CappedArray; + AttachmentArray attachments; + } mRenderPassFboInfo = {}; + + bool const mIsSRGBSwapChainSupported; + backend::StereoscopicType const mStereoscopicType; }; } // namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanFboCache.cpp b/filament/backend/src/vulkan/VulkanFboCache.cpp index 24222b09f6b..3d76424e368 100644 --- a/filament/backend/src/vulkan/VulkanFboCache.cpp +++ b/filament/backend/src/vulkan/VulkanFboCache.cpp @@ -23,7 +23,7 @@ // If any VkRenderPass or VkFramebuffer is unused for more than TIME_BEFORE_EVICTION frames, it // is evicted from the cache. -static constexpr uint32_t TIME_BEFORE_EVICTION = VK_MAX_COMMAND_BUFFERS; +static constexpr uint32_t TIME_BEFORE_EVICTION = FVK_MAX_COMMAND_BUFFERS; using namespace bluevk; @@ -31,10 +31,7 @@ namespace filament::backend { bool VulkanFboCache::RenderPassEq::operator()(const RenderPassKey& k1, const RenderPassKey& k2) const { - if (k1.initialColorLayoutMask != k2.initialColorLayoutMask) return false; if (k1.initialDepthLayout != k2.initialDepthLayout) return false; - if (k1.renderPassDepthLayout != k2.renderPassDepthLayout) return false; - if (k1.finalDepthLayout != k2.finalDepthLayout) return false; for (int i = 0; i < MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT; i++) { if (k1.colorFormat[i] != k2.colorFormat[i]) return false; } @@ -44,7 +41,9 @@ bool VulkanFboCache::RenderPassEq::operator()(const RenderPassKey& k1, if (k1.discardEnd != k2.discardEnd) return false; if (k1.samples != k2.samples) return false; if (k1.needsResolveMask != k2.needsResolveMask) return false; + if (k1.usesLazilyAllocatedMemory != k2.usesLazilyAllocatedMemory) return false; if (k1.subpassMask != k2.subpassMask) return false; + if (k1.viewCount != k2.viewCount) return false; return true; } @@ -62,15 +61,16 @@ bool VulkanFboCache::FboKeyEqualFn::operator()(const FboKey& k1, const FboKey& k return true; } -VulkanFboCache::VulkanFboCache(VulkanContext& context) : mContext(context) {} +VulkanFboCache::VulkanFboCache(VkDevice device) + : mDevice(device) {} VulkanFboCache::~VulkanFboCache() { - ASSERT_POSTCONDITION(mFramebufferCache.empty() && mRenderPassCache.empty(), - "Please explicitly call reset() while the VkDevice is still alive."); + FILAMENT_CHECK_POSTCONDITION(mFramebufferCache.empty() && mRenderPassCache.empty()) + << "Please explicitly call terminate() while the VkDevice is still alive."; } -VkFramebuffer VulkanFboCache::getFramebuffer(FboKey config) noexcept { - auto iter = mFramebufferCache.find(config); +VkFramebuffer VulkanFboCache::getFramebuffer(FboKey const& config) noexcept { + FboMap::iterator iter = mFramebufferCache.find(config); if (UTILS_LIKELY(iter != mFramebufferCache.end() && iter->second.handle != VK_NULL_HANDLE)) { iter.value().timestamp = mCurrentTime; return iter->second.handle; @@ -95,8 +95,8 @@ VkFramebuffer VulkanFboCache::getFramebuffer(FboKey config) noexcept { attachments[attachmentCount++] = config.depth; } - #if FILAMENT_VULKAN_VERBOSE - utils::slog.d << "Creating framebuffer " << config.width << "x" << config.height << " " + #if FVK_ENABLED(FVK_DEBUG_FBO_CACHE) + FVK_LOGD << "Creating framebuffer " << config.width << "x" << config.height << " " << "for render pass " << config.renderPass << ", " << "samples = " << int(config.samples) << ", " << "depth = " << (config.depth ? 1 : 0) << ", " @@ -115,13 +115,14 @@ VkFramebuffer VulkanFboCache::getFramebuffer(FboKey config) noexcept { }; mRenderPassRefCount[info.renderPass]++; VkFramebuffer framebuffer; - VkResult error = vkCreateFramebuffer(mContext.device, &info, VKALLOC, &framebuffer); - ASSERT_POSTCONDITION(!error, "Unable to create framebuffer."); + VkResult error = vkCreateFramebuffer(mDevice, &info, VKALLOC, &framebuffer); + FILAMENT_CHECK_POSTCONDITION(error == VK_SUCCESS) << "Unable to create framebuffer." + << " error=" << static_cast(error); mFramebufferCache[config] = {framebuffer, mCurrentTime}; return framebuffer; } -VkRenderPass VulkanFboCache::getRenderPass(RenderPassKey config) noexcept { +VkRenderPass VulkanFboCache::getRenderPass(RenderPassKey const& config) noexcept { auto iter = mRenderPassCache.find(config); if (UTILS_LIKELY(iter != mRenderPassCache.end() && iter->second.handle != VK_NULL_HANDLE)) { iter.value().timestamp = mCurrentTime; @@ -187,6 +188,25 @@ VkRenderPass VulkanFboCache::getRenderPass(RenderPassKey config) noexcept { .pDependencies = dependencies }; + VkRenderPassMultiviewCreateInfo multiviewCreateInfo = {}; + uint32_t const subpassViewMask = (1 << config.viewCount) - 1; + // Prepare a view mask array for the maximum number of subpasses. All subpasses have all views + // activated. + uint32_t const viewMasks[2] = {subpassViewMask, subpassViewMask}; + if (config.viewCount > 1) { + // Fill the multiview create info. + multiviewCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO; + multiviewCreateInfo.pNext = nullptr; + multiviewCreateInfo.subpassCount = hasSubpasses ? 2u : 1u; + multiviewCreateInfo.pViewMasks = viewMasks; + multiviewCreateInfo.dependencyCount = 0; + multiviewCreateInfo.pViewOffsets = nullptr; + multiviewCreateInfo.correlationMaskCount = 1; + multiviewCreateInfo.pCorrelationMasks = &subpassViewMask; + + renderPassInfo.pNext = &multiviewCreateInfo; + } + int attachmentIndex = 0; // Populate the Color Attachments. @@ -194,7 +214,7 @@ VkRenderPass VulkanFboCache::getRenderPass(RenderPassKey config) noexcept { if (config.colorFormat[i] == VK_FORMAT_UNDEFINED) { continue; } - const VkImageLayout subpassLayout = getDefaultImageLayout(TextureUsage::COLOR_ATTACHMENT); + const VkImageLayout subpassLayout = imgutil::getVkLayout(VulkanLayout::COLOR_ATTACHMENT); uint32_t index; if (!hasSubpasses) { @@ -236,12 +256,11 @@ VkRenderPass VulkanFboCache::getRenderPass(RenderPassKey config) noexcept { .format = config.colorFormat[i], .samples = (VkSampleCountFlagBits) config.samples, .loadOp = clear ? kClear : (discard ? kDontCare : kKeep), - .storeOp = config.samples == 1 ? kEnableStore : kDisableStore, + .storeOp = (config.usesLazilyAllocatedMemory & (1 << i)) ? kDisableStore : kEnableStore, .stencilLoadOp = kDontCare, .stencilStoreOp = kDisableStore, - .initialLayout = (!discard && config.initialColorLayoutMask & (1 << i)) ? - VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_UNDEFINED, - .finalLayout = getDefaultImageLayout(TextureUsage::COLOR_ATTACHMENT) + .initialLayout = imgutil::getVkLayout(VulkanLayout::COLOR_ATTACHMENT), + .finalLayout = imgutil::getVkLayout(FINAL_COLOR_ATTACHMENT_LAYOUT), }; } @@ -267,7 +286,8 @@ VkRenderPass VulkanFboCache::getRenderPass(RenderPassKey config) noexcept { } pResolveAttachment->attachment = attachmentIndex; - pResolveAttachment->layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + pResolveAttachment->layout + = imgutil::getVkLayout(VulkanLayout::COLOR_ATTACHMENT_RESOLVE); ++pResolveAttachment; attachments[attachmentIndex++] = { @@ -277,8 +297,8 @@ VkRenderPass VulkanFboCache::getRenderPass(RenderPassKey config) noexcept { .storeOp = kEnableStore, .stencilLoadOp = kDontCare, .stencilStoreOp = kDisableStore, - .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, - .finalLayout = getDefaultImageLayout(TextureUsage::COLOR_ATTACHMENT) + .initialLayout = imgutil::getVkLayout(VulkanLayout::COLOR_ATTACHMENT), + .finalLayout = imgutil::getVkLayout(FINAL_COLOR_ATTACHMENT_LAYOUT), }; } @@ -287,7 +307,7 @@ VkRenderPass VulkanFboCache::getRenderPass(RenderPassKey config) noexcept { const bool clear = any(config.clear & TargetBufferFlags::DEPTH); const bool discardStart = any(config.discardStart & TargetBufferFlags::DEPTH); const bool discardEnd = any(config.discardEnd & TargetBufferFlags::DEPTH); - depthAttachmentRef.layout = toVkImageLayout(config.renderPassDepthLayout); + depthAttachmentRef.layout = imgutil::getVkLayout(VulkanLayout::DEPTH_ATTACHMENT); depthAttachmentRef.attachment = attachmentIndex; attachments[attachmentIndex++] = { .format = config.depthFormat, @@ -296,20 +316,21 @@ VkRenderPass VulkanFboCache::getRenderPass(RenderPassKey config) noexcept { .storeOp = discardEnd ? kDisableStore : kEnableStore, .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, - .initialLayout = toVkImageLayout(config.initialDepthLayout), - .finalLayout = toVkImageLayout(config.finalDepthLayout), + .initialLayout = imgutil::getVkLayout(config.initialDepthLayout), + .finalLayout = imgutil::getVkLayout(FINAL_DEPTH_ATTACHMENT_LAYOUT), }; } renderPassInfo.attachmentCount = attachmentIndex; // Finally, create the VkRenderPass. VkRenderPass renderPass; - VkResult error = vkCreateRenderPass(mContext.device, &renderPassInfo, VKALLOC, &renderPass); - ASSERT_POSTCONDITION(!error, "Unable to create render pass."); + VkResult error = vkCreateRenderPass(mDevice, &renderPassInfo, VKALLOC, &renderPass); + FILAMENT_CHECK_POSTCONDITION(error == VK_SUCCESS) << "Unable to create render pass." + << " error=" << error; mRenderPassCache[config] = {renderPass, mCurrentTime}; - #if FILAMENT_VULKAN_VERBOSE - utils::slog.d << "Created render pass " << renderPass << " with " +#if FVK_ENABLED(FVK_DEBUG_FBO_CACHE) + FVK_LOGD << "Created render pass " << renderPass << " with " << "samples = " << int(config.samples) << ", " << "depth = " << (hasDepth ? 1 : 0) << ", " << "colorAttachmentCount[0] = " << subpasses[0].colorAttachmentCount @@ -322,11 +343,11 @@ VkRenderPass VulkanFboCache::getRenderPass(RenderPassKey config) noexcept { void VulkanFboCache::reset() noexcept { for (auto pair : mFramebufferCache) { mRenderPassRefCount[pair.first.renderPass]--; - vkDestroyFramebuffer(mContext.device, pair.second.handle, VKALLOC); + vkDestroyFramebuffer(mDevice, pair.second.handle, VKALLOC); } mFramebufferCache.clear(); for (auto pair : mRenderPassCache) { - vkDestroyRenderPass(mContext.device, pair.second.handle, VKALLOC); + vkDestroyRenderPass(mDevice, pair.second.handle, VKALLOC); } mRenderPassCache.clear(); } @@ -334,27 +355,31 @@ void VulkanFboCache::reset() noexcept { // Frees up old framebuffers and render passes, then nulls out their key. Doesn't bother removing // the actual map entry since it is fairly small. void VulkanFboCache::gc() noexcept { + FVK_SYSTRACE_CONTEXT(); + FVK_SYSTRACE_START("fbocache::gc"); + // If this is one of the first few frames, return early to avoid wrapping unsigned integers. if (++mCurrentTime <= TIME_BEFORE_EVICTION) { return; } const uint32_t evictTime = mCurrentTime - TIME_BEFORE_EVICTION; - for (auto iter = mFramebufferCache.begin(); iter != mFramebufferCache.end(); ++iter) { + for (FboMap::iterator iter = mFramebufferCache.begin(); iter != mFramebufferCache.end(); ++iter) { const FboVal fbo = iter->second; if (fbo.timestamp < evictTime && fbo.handle) { mRenderPassRefCount[iter->first.renderPass]--; - vkDestroyFramebuffer(mContext.device, fbo.handle, VKALLOC); + vkDestroyFramebuffer(mDevice, fbo.handle, VKALLOC); iter.value().handle = VK_NULL_HANDLE; } } for (auto iter = mRenderPassCache.begin(); iter != mRenderPassCache.end(); ++iter) { const VkRenderPass handle = iter->second.handle; if (iter->second.timestamp < evictTime && handle && mRenderPassRefCount[handle] == 0) { - vkDestroyRenderPass(mContext.device, handle, VKALLOC); + vkDestroyRenderPass(mDevice, handle, VKALLOC); iter.value().handle = VK_NULL_HANDLE; } } + FVK_SYSTRACE_END(); } } // namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanFboCache.h b/filament/backend/src/vulkan/VulkanFboCache.h index b8904bddb11..3e8209dea12 100644 --- a/filament/backend/src/vulkan/VulkanFboCache.h +++ b/filament/backend/src/vulkan/VulkanFboCache.h @@ -27,13 +27,6 @@ namespace filament::backend { -// Avoid using VkImageLayout since it requires 4 bytes. -enum class VulkanDepthLayout : uint8_t { - UNDEFINED, // VK_IMAGE_LAYOUT_UNDEFINED - GENERAL, // VK_IMAGE_LAYOUT_GENERAL - READ_ONLY, // VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL. -}; - // Simple manager for VkFramebuffer and VkRenderPass objects. // // Note that a VkFramebuffer is just a binding between a render pass and a set of image views. So, @@ -42,40 +35,32 @@ enum class VulkanDepthLayout : uint8_t { // class VulkanFboCache { public: + constexpr static VulkanLayout FINAL_COLOR_ATTACHMENT_LAYOUT = VulkanLayout::COLOR_ATTACHMENT; + constexpr static VulkanLayout FINAL_RESOLVE_ATTACHMENT_LAYOUT = VulkanLayout::COLOR_ATTACHMENT; + constexpr static VulkanLayout FINAL_DEPTH_ATTACHMENT_LAYOUT = VulkanLayout::DEPTH_ATTACHMENT; + // RenderPassKey is a small POD representing the immutable state that is used to construct // a VkRenderPass. It is hashed and used as a lookup key. - // TODO: This struct can be reduced in size by using a subset of formats instead of VkFormat - // and removing the "finalDepthLayout" field. struct alignas(8) RenderPassKey { - // For each target, we need to know three image layouts: the layout BEFORE the pass, the - // layout DURING the pass, and the layout AFTER the pass. Here are the rules: - // - For depth, we explicitly specify all three layouts. - // - Color targets have their initial image layout specified with a bitmask. - // - For each color target, the pre-existing layout is either UNDEFINED (0) or GENERAL (1). - // - The render pass and final images layout for color buffers is always GENERAL. - uint8_t initialColorLayoutMask; - VulkanDepthLayout initialDepthLayout : 2; - VulkanDepthLayout renderPassDepthLayout : 2; - VulkanDepthLayout finalDepthLayout : 2; // for now this is always GENERAL - uint8_t padding0 : 2; - uint8_t padding1[2]; - VkFormat colorFormat[MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT]; // 32 bytes VkFormat depthFormat; // 4 bytes TargetBufferFlags clear; // 4 bytes TargetBufferFlags discardStart; // 4 bytes TargetBufferFlags discardEnd; // 4 bytes + + VulkanLayout initialDepthLayout; // 1 byte uint8_t samples; // 1 byte uint8_t needsResolveMask; // 1 byte + uint8_t usesLazilyAllocatedMemory; // 1 byte uint8_t subpassMask; // 1 byte - bool padding2; // 1 byte + uint8_t viewCount; // 1 byte + uint8_t padding[2]; }; struct RenderPassVal { VkRenderPass handle; uint32_t timestamp; }; static_assert(0 == MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT % 8); - static_assert(sizeof(RenderPassKey::initialColorLayoutMask) == MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT / 8); static_assert(sizeof(TargetBufferFlags) == 4, "TargetBufferFlags has unexpected size."); static_assert(sizeof(VkFormat) == 4, "VkFormat has unexpected size."); static_assert(sizeof(RenderPassKey) == 56, "RenderPassKey has unexpected size."); @@ -109,14 +94,14 @@ class VulkanFboCache { bool operator()(const FboKey& k1, const FboKey& k2) const; }; - explicit VulkanFboCache(VulkanContext&); + explicit VulkanFboCache(VkDevice device); ~VulkanFboCache(); // Retrieves or creates a VkFramebuffer handle. - VkFramebuffer getFramebuffer(FboKey config) noexcept; + VkFramebuffer getFramebuffer(FboKey const& config) noexcept; // Retrieves or creates a VkRenderPass handle. - VkRenderPass getRenderPass(RenderPassKey config) noexcept; + VkRenderPass getRenderPass(RenderPassKey const& config) noexcept; // Evicts old unused Vulkan objects. Call this once per frame. void gc() noexcept; @@ -125,29 +110,15 @@ class VulkanFboCache { void reset() noexcept; private: - VulkanContext& mContext; - tsl::robin_map mFramebufferCache; + VkDevice mDevice; + using FboMap = tsl::robin_map; + FboMap mFramebufferCache; + tsl::robin_map mRenderPassCache; tsl::robin_map mRenderPassRefCount; uint32_t mCurrentTime = 0; }; -inline VulkanDepthLayout fromVkImageLayout(VkImageLayout layout) { - switch (layout) { - case VK_IMAGE_LAYOUT_GENERAL: return VulkanDepthLayout::GENERAL; - case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL: return VulkanDepthLayout::READ_ONLY; - default: return VulkanDepthLayout::UNDEFINED; - } -} - -inline VkImageLayout toVkImageLayout(VulkanDepthLayout layout) { - switch (layout) { - case VulkanDepthLayout::GENERAL: return VK_IMAGE_LAYOUT_GENERAL; - case VulkanDepthLayout::READ_ONLY: return VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL; - default: return VK_IMAGE_LAYOUT_UNDEFINED; - } -} - } // namespace filament::backend #endif // TNT_FILAMENT_BACKEND_VULKANFBOCACHE_H diff --git a/filament/backend/src/vulkan/VulkanHandles.cpp b/filament/backend/src/vulkan/VulkanHandles.cpp index 5a0a0ab4bbd..29c33a82b19 100644 --- a/filament/backend/src/vulkan/VulkanHandles.cpp +++ b/filament/backend/src/vulkan/VulkanHandles.cpp @@ -17,25 +17,31 @@ #include "VulkanHandles.h" #include "VulkanConstants.h" + +// TODO: remove this by moving DebugUtils out of VulkanDriver +#include "VulkanDriver.h" + #include "VulkanMemory.h" +#include "VulkanUtility.h" +#include "vulkan/memory/ResourcePointer.h" +#include "spirv/VulkanSpirvUtils.h" #include -#include +#include // ASSERT_POSTCONDITION using namespace bluevk; namespace filament::backend { -static void flipVertically(VkRect2D* rect, uint32_t framebufferHeight) { - rect->offset.y = framebufferHeight - rect->offset.y - rect->extent.height; -} +namespace { -static void flipVertically(VkViewport* rect, uint32_t framebufferHeight) { +void flipVertically(VkViewport* rect, uint32_t framebufferHeight) { rect->y = framebufferHeight - rect->y - rect->height; } -static void clampToFramebuffer(VkRect2D* rect, uint32_t fbWidth, uint32_t fbHeight) { +void clampToFramebuffer(VkRect2D* rect, uint32_t fbWidth, uint32_t fbHeight) { + rect->offset.y = fbHeight - rect->offset.y - rect->extent.height; int32_t x = std::max(rect->offset.x, 0); int32_t y = std::max(rect->offset.y, 0); int32_t right = std::min(rect->offset.x + (int32_t) rect->extent.width, (int32_t) fbWidth); @@ -46,269 +52,509 @@ static void clampToFramebuffer(VkRect2D* rect, uint32_t fbWidth, uint32_t fbHeig rect->extent.height = std::max(top - y, 0); } -VulkanProgram::VulkanProgram(VulkanContext& context, const Program& builder) noexcept : - HwProgram(builder.getName()), context(context) { - auto const& blobs = builder.getShadersSource(); - VkShaderModule* modules[2] = { &bundle.vertex, &bundle.fragment }; - // TODO: handle compute shaders. - for (size_t i = 0; i < 2; i++) { - const auto& blob = blobs[i]; - VkShaderModule* module = modules[i]; - VkShaderModuleCreateInfo moduleInfo = {}; - moduleInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - moduleInfo.codeSize = blob.size(); - moduleInfo.pCode = (uint32_t*) blob.data(); - VkResult result = vkCreateShaderModule(context.device, &moduleInfo, VKALLOC, module); - ASSERT_POSTCONDITION(result == VK_SUCCESS, "Unable to create shader module."); +template +inline void fromStageFlags(backend::ShaderStageFlags stage, descriptor_binding_t binding, + Bitmask& mask) { + if ((bool) (stage & ShaderStageFlags::VERTEX)) { + mask.set(binding + getVertexStageShift()); + } + if ((bool) (stage & ShaderStageFlags::FRAGMENT)) { + mask.set(binding + getFragmentStageShift()); } +} - // populate the specialization constants requirements right now - auto const& specializationConstants = builder.getSpecializationConstants(); - if (!specializationConstants.empty()) { - // Allocate a single heap block to store all the specialization constants structures - // our supported types are int32, float and bool, so we use 4 bytes per data. bool will - // just use the first byte. - char* pStorage = (char*)malloc( - sizeof(VkSpecializationInfo) + - specializationConstants.size() * sizeof(VkSpecializationMapEntry) + - specializationConstants.size() * 4); - - VkSpecializationInfo* const pInfo = (VkSpecializationInfo*)pStorage; - VkSpecializationMapEntry* const pEntries = - (VkSpecializationMapEntry*)(pStorage + sizeof(VkSpecializationInfo)); - void* pData = pStorage + sizeof(VkSpecializationInfo) + - specializationConstants.size() * sizeof(VkSpecializationMapEntry); - - *pInfo = { - .mapEntryCount = specializationConstants.size(), - .pMapEntries = pEntries, - .dataSize = specializationConstants.size() * 4, - .pData = pData, - }; +inline VkShaderStageFlags getVkStage(backend::ShaderStage stage) { + switch(stage) { + case backend::ShaderStage::VERTEX: + return VK_SHADER_STAGE_VERTEX_BIT; + case backend::ShaderStage::FRAGMENT: + return VK_SHADER_STAGE_FRAGMENT_BIT; + case backend::ShaderStage::COMPUTE: + PANIC_POSTCONDITION("Unsupported stage"); + } +} - for (size_t i = 0; i < specializationConstants.size(); i++) { - const uint32_t offset = uint32_t(i) * 4; - std::visit([&](auto&& arg) { - using T = std::decay_t; - pEntries[i] = { - .constantID = specializationConstants[i].id, - .offset = offset, - .size = sizeof(arg) - }; - T* const addr = (T*)((char*)pData + offset); - *addr = arg; - }, specializationConstants[i].value); +using BitmaskGroup = VulkanDescriptorSetLayout::Bitmask; +BitmaskGroup fromBackendLayout(DescriptorSetLayout const& layout) { + BitmaskGroup mask; + for (auto const& binding: layout.bindings) { + switch (binding.type) { + case DescriptorType::UNIFORM_BUFFER: { + if ((binding.flags & DescriptorFlags::DYNAMIC_OFFSET) != DescriptorFlags::NONE) { + fromStageFlags(binding.stageFlags, binding.binding, mask.dynamicUbo); + } else { + fromStageFlags(binding.stageFlags, binding.binding, mask.ubo); + } + break; + } + // TODO: properly handle external sampler + case DescriptorType::SAMPLER_EXTERNAL: + case DescriptorType::SAMPLER: { + fromStageFlags(binding.stageFlags, binding.binding, mask.sampler); + break; + } + case DescriptorType::INPUT_ATTACHMENT: { + fromStageFlags(binding.stageFlags, binding.binding, mask.inputAttachment); + break; + } + case DescriptorType::SHADER_STORAGE_BUFFER: + PANIC_POSTCONDITION("Shader storage is not supported"); + break; + } + } + return mask; +} + +fvkmemory::resource_ptr initMsaaTexture( + fvkmemory::resource_ptr texture, VkDevice device, + VkPhysicalDevice physicalDevice, VulkanContext const& context, VmaAllocator allocator, + VulkanCommands* commands, fvkmemory::ResourceManager* resManager, uint8_t levels, + uint8_t samples, VulkanStagePool& stagePool) { + assert_invariant(texture); + auto msTexture = texture->getSidecar(); + if (UTILS_UNLIKELY(!msTexture)) { + // Clear all usage flags that are not related to attachments, so that we can + // use the transient usage flag. + const TextureUsage usage = texture->usage & TextureUsage::ALL_ATTACHMENTS; + assert_invariant(static_cast(usage) != 0U); + + msTexture = resource_ptr::construct(resManager, device, physicalDevice, + context, allocator, resManager, commands, texture->target, levels, texture->format, + samples, texture->width, texture->height, texture->depth, usage, stagePool); + texture->setSidecar(msTexture); + } + return msTexture; +} + +} // anonymous namespace + +void VulkanDescriptorSet::acquire(fvkmemory::resource_ptr texture) { + mResources.push_back(texture); +} + +void VulkanDescriptorSet::acquire(fvkmemory::resource_ptr obj) { + mResources.push_back(obj); +} + +VulkanDescriptorSetLayout::VulkanDescriptorSetLayout(DescriptorSetLayout const& layout) + : bitmask(fromBackendLayout(layout)), + count(Count::fromLayoutBitmask(bitmask)) {} + +PushConstantDescription::PushConstantDescription(backend::Program const& program) noexcept { + mRangeCount = 0; + for (auto stage : { ShaderStage::VERTEX, ShaderStage::FRAGMENT, ShaderStage::COMPUTE }) { + auto const& constants = program.getPushConstants(stage); + if (constants.empty()) { + continue; } - bundle.specializationInfos = pInfo; + // We store the type of the constant for type-checking when writing. + auto& types = mTypes[(uint8_t) stage]; + types.reserve(constants.size()); + std::for_each(constants.cbegin(), constants.cend(), [&types] (Program::PushConstant t) { + types.push_back(t.type); + }); + + mRanges[mRangeCount++] = { + .stageFlags = getVkStage(stage), + .offset = 0, + .size = (uint32_t) constants.size() * ENTRY_SIZE, + }; } +} - // Make a copy of the binding map - samplerGroupInfo = builder.getSamplerGroupInfo(); - if constexpr (FILAMENT_VULKAN_VERBOSE) { - utils::slog.d << "Created VulkanProgram " << builder - << ", shaders = (" << bundle.vertex << ", " << bundle.fragment << ")" - << utils::io::endl; +void PushConstantDescription::write(VkCommandBuffer cmdbuf, VkPipelineLayout layout, + backend::ShaderStage stage, uint8_t index, backend::PushConstantVariant const& value) { + + uint32_t binaryValue = 0; + UTILS_UNUSED_IN_RELEASE auto const& types = mTypes[(uint8_t) stage]; + if (std::holds_alternative(value)) { + assert_invariant(types[index] == ConstantType::BOOL); + bool const bval = std::get(value); + binaryValue = static_cast(bval ? VK_TRUE : VK_FALSE); + } else if (std::holds_alternative(value)) { + assert_invariant(types[index] == ConstantType::FLOAT); + float const fval = std::get(value); + binaryValue = *reinterpret_cast(&fval); + } else { + assert_invariant(types[index] == ConstantType::INT); + int const ival = std::get(value); + binaryValue = *reinterpret_cast(&ival); } + vkCmdPushConstants(cmdbuf, layout, getVkStage(stage), index * ENTRY_SIZE, ENTRY_SIZE, + &binaryValue); } -VulkanProgram::VulkanProgram(VulkanContext& context, VkShaderModule vs, VkShaderModule fs) noexcept : - context(context) { - bundle.vertex = vs; - bundle.fragment = fs; +VulkanProgram::VulkanProgram(VkDevice device, Program const& builder) noexcept + : HwProgram(builder.getName()), + mInfo(new(std::nothrow) PipelineInfo(builder)), + mDevice(device) { + + Program::ShaderSource const& blobs = builder.getShadersSource(); + auto& modules = mInfo->shaders; + auto const& specializationConstants = builder.getSpecializationConstants(); + std::vector shader; + + static_assert(static_cast(0) == ShaderStage::VERTEX && + static_cast(1) == ShaderStage::FRAGMENT && + MAX_SHADER_MODULES == 2); + + for (size_t i = 0; i < MAX_SHADER_MODULES; i++) { + Program::ShaderBlob const& blob = blobs[i]; + + uint32_t* data = (uint32_t*) blob.data(); + size_t dataSize = blob.size(); + + if (!specializationConstants.empty()) { + workaroundSpecConstant(blob, specializationConstants, shader); + data = (uint32_t*) shader.data(); + dataSize = shader.size() * 4; + } + + VkShaderModule& module = modules[i]; + VkShaderModuleCreateInfo moduleInfo = { + .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, + .codeSize = dataSize, + .pCode = data, + }; + VkResult result = vkCreateShaderModule(mDevice, &moduleInfo, VKALLOC, &module); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) + << "Unable to create shader module." + << " error=" << static_cast(result); + +#if FVK_ENABLED(FVK_DEBUG_DEBUG_UTILS) + std::string name{ builder.getName().c_str(), builder.getName().size() }; + switch (static_cast(i)) { + case ShaderStage::VERTEX: + name += "_vs"; + break; + case ShaderStage::FRAGMENT: + name += "_fs"; + break; + default: + PANIC_POSTCONDITION("Unexpected stage"); + break; + } + VulkanDriver::DebugUtils::setName(VK_OBJECT_TYPE_SHADER_MODULE, + reinterpret_cast(module), name.c_str()); +#endif + } + +#if FVK_ENABLED(FVK_DEBUG_SHADER_MODULE) + FVK_LOGD << "Created VulkanProgram " << builder << ", shaders = (" << modules[0] + << ", " << modules[1] << ")" << utils::io::endl; +#endif } VulkanProgram::~VulkanProgram() { - vkDestroyShaderModule(context.device, bundle.vertex, VKALLOC); - vkDestroyShaderModule(context.device, bundle.fragment, VKALLOC); - free(bundle.specializationInfos); + for (auto shader: mInfo->shaders) { + vkDestroyShaderModule(mDevice, shader, VKALLOC); + } + delete mInfo; } // Creates a special "default" render target (i.e. associated with the swap chain) -VulkanRenderTarget::VulkanRenderTarget() : HwRenderTarget(0, 0), mOffscreen(false), mSamples(1) {} +VulkanRenderTarget::VulkanRenderTarget() + : HwRenderTarget(0, 0), + mOffscreen(false), + mProtected(false), + mInfo(std::make_unique()) { + mInfo->rpkey.samples = mInfo->fbkey.samples = 1; +} -void VulkanRenderTarget::bindToSwapChain(VulkanSwapChain& swapChain) { +VulkanRenderTarget::~VulkanRenderTarget() = default; + +void VulkanRenderTarget::bindToSwapChain(fvkmemory::resource_ptr swapchain) { assert_invariant(!mOffscreen); - mColor[0] = { .texture = &swapChain.getColorTexture() }; - mDepth = { .texture = &swapChain.getDepthTexture() }; - width = swapChain.clientSize.width; - height = swapChain.clientSize.height; -} -VulkanRenderTarget::VulkanRenderTarget(VulkanContext& context, uint32_t width, uint32_t height, - uint8_t samples, VulkanAttachment color[MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT], - VulkanAttachment depthStencil[2], VulkanStagePool& stagePool) : - HwRenderTarget(width, height), mOffscreen(true), mSamples(samples) { - for (int index = 0; index < MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT; index++) { - mColor[index] = color[index]; + VkExtent2D const extent = swapchain->getExtent(); + width = extent.width; + height = extent.height; + mProtected = swapchain->isProtected(); + + VulkanAttachment color = {}; + color.texture = swapchain->getCurrentColor(); + mInfo->attachments = {color}; + + auto& fbkey = mInfo->fbkey; + auto& rpkey = mInfo->rpkey; + + rpkey.colorFormat[0] = color.getFormat(); + fbkey.width = width; + fbkey.height = height; + fbkey.color[0] = color.getImageView(); + fbkey.resolve[0] = VK_NULL_HANDLE; + + if (swapchain->getDepth()) { + VulkanAttachment depth = {}; + depth.texture = swapchain->getDepth(); + mInfo->attachments.push_back(depth); + mInfo->depthIndex = 1; + + rpkey.depthFormat = depth.getFormat(); + fbkey.depth = depth.getImageView(); + } else { + rpkey.depthFormat = VK_FORMAT_UNDEFINED; + fbkey.depth = VK_NULL_HANDLE; } - mDepth = depthStencil[0]; - VulkanTexture* depthTexture = mDepth.texture; + mInfo->colors.set(0); +} - if (samples == 1) { - return; - } +VulkanRenderTarget::VulkanRenderTarget(VkDevice device, VkPhysicalDevice physicalDevice, + VulkanContext const& context, fvkmemory::ResourceManager* resourceManager, + VmaAllocator allocator, VulkanCommands* commands, uint32_t width, uint32_t height, + uint8_t samples, VulkanAttachment color[MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT], + VulkanAttachment depthStencil[2], VulkanStagePool& stagePool, uint8_t layerCount) + : HwRenderTarget(width, height), + mOffscreen(true), + mProtected(false), + mInfo(std::make_unique()) { + auto& depth = depthStencil[0]; // Constrain the sample count according to both kinds of sample count masks obtained from // VkPhysicalDeviceProperties. This is consistent with the VulkanTexture constructor. - const auto& limits = context.physicalDeviceProperties.limits; - mSamples = samples = reduceSampleCount(samples, limits.framebufferDepthSampleCounts & + auto const& limits = context.getPhysicalDeviceLimits(); + samples = reduceSampleCount(samples, limits.framebufferDepthSampleCounts & limits.framebufferColorSampleCounts); - // Create sidecar MSAA textures for color attachments if they don't already exist. + auto& rpkey = mInfo->rpkey; + rpkey.samples = samples; + rpkey.depthFormat = depth.getFormat(); + rpkey.viewCount = layerCount; + + auto& fbkey = mInfo->fbkey; + fbkey.width = width; + fbkey.height = height; + fbkey.samples = samples; + + std::vector& attachments = mInfo->attachments; + std::vector msaa; + for (int index = 0; index < MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT; index++) { - const VulkanAttachment& spec = color[index]; - VulkanTexture* texture = spec.texture; - if (texture && texture->samples == 1) { - VulkanTexture* msTexture = texture->getSidecar(); - if (UTILS_UNLIKELY(msTexture == nullptr)) { - msTexture = new VulkanTexture(context, texture->target, texture->levels, - texture->format, samples, texture->width, texture->height, texture->depth, - texture->usage, stagePool); - texture->setSidecar(msTexture); - } - mMsaaAttachments[index] = { .texture = msTexture }; - } - if (texture && texture->samples > 1) { - mMsaaAttachments[index] = mColor[index]; + VulkanAttachment& attachment = color[index]; + auto texture = attachment.texture; + if (!texture) { + rpkey.colorFormat[index] = VK_FORMAT_UNDEFINED; + continue; } - } - if (depthTexture == nullptr) { - return; - } + mProtected |= texture->getIsProtected(); + + attachments.push_back(attachment); + mInfo->colors.set(index); + + rpkey.colorFormat[index] = attachment.getFormat(); + fbkey.color[index] = attachment.getImageView(); + fbkey.resolve[index] = VK_NULL_HANDLE; + + if (samples > 1) { + VulkanAttachment msaaAttachment = {}; + if (texture->samples == 1) { + auto msaaTexture = initMsaaTexture(texture, device, physicalDevice, context, + allocator, commands, resourceManager, texture->levels, samples, stagePool); + if (msaaTexture && msaaTexture->isTransientAttachment()) { + rpkey.usesLazilyAllocatedMemory |= (1 << index); + } + if (attachment.texture->samples == 1) { + rpkey.needsResolveMask |= (1 << index); + } + msaaAttachment = { + .texture = msaaTexture, + .layerCount = layerCount, + }; - // There is no need for sidecar depth if the depth texture is already MSAA. - if (depthTexture->samples > 1) { - mMsaaDepthAttachment = mDepth; - return; + fbkey.resolve[index] = attachment.getImageView(); + } else { + msaaAttachment = { + .texture = texture, + .layerCount = layerCount, + }; + } + fbkey.color[index] = msaaAttachment.getImageView(); + msaa.push_back(msaaAttachment); + } } - // Create sidecar MSAA texture for the depth attachment if it does not already exist. - VulkanTexture* msTexture = depthTexture->getSidecar(); - if (UTILS_UNLIKELY(msTexture == nullptr)) { - msTexture = new VulkanTexture(context, depthTexture->target, depthTexture->levels, - depthTexture->format, samples, depthTexture->width, depthTexture->height, - depthTexture->depth, depthTexture->usage, stagePool); - depthTexture->setSidecar(msTexture); + if (attachments.size() > 0 && samples > 1 && msaa.size() > 0) { + mInfo->msaaIndex = (uint8_t) attachments.size(); + attachments.insert(attachments.end(), msaa.begin(), msaa.end()); } - mMsaaDepthAttachment = { - .texture = msTexture, - .level = mDepth.level, - .layer = mDepth.layer, - }; + if (depth.texture) { + auto depthTexture = depth.texture; + mInfo->depthIndex = (uint8_t) attachments.size(); + attachments.push_back(depth); + fbkey.depth = depth.getImageView(); + if (samples > 1) { + mInfo->msaaDepthIndex = mInfo->depthIndex; + if (depthTexture->samples == 1) { + // MSAA depth texture must have the mipmap count of 1 + uint8_t const msLevel = 1; + // Create sidecar MSAA texture for the depth attachment if it does not already + // exist. + auto msaa = initMsaaTexture(depthTexture, device, physicalDevice, context, + allocator, commands, resourceManager, msLevel, samples, stagePool); + mInfo->msaaDepthIndex = (uint8_t) attachments.size(); + attachments.push_back({ .texture = msaa, .layerCount = layerCount }); + } + } + } } void VulkanRenderTarget::transformClientRectToPlatform(VkRect2D* bounds) const { - const auto& extent = getExtent(); - flipVertically(bounds, extent.height); + auto const& extent = getExtent(); clampToFramebuffer(bounds, extent.width, extent.height); } -void VulkanRenderTarget::transformClientRectToPlatform(VkViewport* bounds) const { +void VulkanRenderTarget::transformViewportToPlatform(VkViewport* bounds) const { flipVertically(bounds, getExtent().height); } -VkExtent2D VulkanRenderTarget::getExtent() const { - return {width, height}; -} - -VulkanAttachment VulkanRenderTarget::getColor(int target) const { - return mColor[target]; -} - -VulkanAttachment VulkanRenderTarget::getMsaaColor(int target) const { - return mMsaaAttachments[target]; -} - -VulkanAttachment VulkanRenderTarget::getDepth() const { - return mDepth; -} - -VulkanAttachment VulkanRenderTarget::getMsaaDepth() const { - return mMsaaDepthAttachment; -} - uint8_t VulkanRenderTarget::getColorTargetCount(const VulkanRenderPass& pass) const { if (!mOffscreen) { return 1; } + if (pass.currentSubpass == 1) { + return mInfo->colors.count(); + } uint8_t count = 0; - for (uint8_t i = 0; i < MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT; i++) { - if (!mColor[i].texture) { - continue; - } - // NOTE: This must be consistent with VkRenderPass construction (see VulkanFboCache). - if (!(pass.params.subpassMask & (1 << i)) || pass.currentSubpass == 1) { + mInfo->colors.forEachSetBit([&count, &pass](size_t index) { + if (!(pass.params.subpassMask & (1 << index))) { count++; } - } + }); return count; } -VulkanVertexBuffer::VulkanVertexBuffer(VulkanContext& context, VulkanStagePool& stagePool, - uint8_t bufferCount, uint8_t attributeCount, - uint32_t elementCount, AttributeArray const& attribs) : - HwVertexBuffer(bufferCount, attributeCount, elementCount, attribs), - buffers(bufferCount, nullptr) {} +void VulkanRenderTarget::emitBarriersBeginRenderPass(VulkanCommandBuffer& commands) { + auto& attachments = mInfo->attachments; + auto samples = mInfo->fbkey.samples; + auto barrier = [&commands](VulkanAttachment& attachment, VulkanLayout const layout) { + auto tex = attachment.texture; + auto const& range = attachment.getSubresourceRange(); + if (tex->getLayout(range.baseMipLevel, range.baseArrayLayer) != layout && + !tex->transitionLayout(&commands, range, layout)) { + // If the layout transition did not emit a barrier, we do it manually here. + tex->samplerToAttachmentBarrier(&commands, range); + } + }; + for (size_t i = 0, count = mInfo->colors.count(); i < count; ++i) { + auto& attachment = attachments[i]; + auto tex = attachment.texture; + if (samples == 1 || tex->samples == 1) { + barrier(attachment, VulkanLayout::COLOR_ATTACHMENT); + } + } + if (mInfo->msaaIndex != Auxiliary::UNDEFINED_INDEX) { + for (size_t i = mInfo->msaaIndex, count = mInfo->msaaIndex + mInfo->colors.count(); + i < count; ++i) { + barrier(attachments[i], VulkanLayout::COLOR_ATTACHMENT); + } + } + if (mInfo->depthIndex != Auxiliary::UNDEFINED_INDEX) { + barrier(attachments[mInfo->depthIndex], VulkanLayout::DEPTH_ATTACHMENT); + } + if (mInfo->msaaDepthIndex != Auxiliary::UNDEFINED_INDEX) { + barrier(attachments[mInfo->msaaDepthIndex], VulkanLayout::DEPTH_ATTACHMENT); + } +} -VulkanBufferObject::VulkanBufferObject(VulkanContext& context, VulkanStagePool& stagePool, - uint32_t byteCount, BufferObjectBinding bindingType, BufferUsage usage) - : HwBufferObject(byteCount), - buffer(context, stagePool, getBufferObjectUsage(bindingType), byteCount), - bindingType(bindingType) { +void VulkanRenderTarget::emitBarriersEndRenderPass(VulkanCommandBuffer& commands) { + if (isSwapChain()) { + return; + } + + for (auto& attachment: mInfo->attachments) { + auto const& range = attachment.getSubresourceRange(); + bool const isDepth = attachment.isDepth(); + auto texture = attachment.texture; + if (isDepth) { + texture->setLayout(range, VulkanFboCache::FINAL_DEPTH_ATTACHMENT_LAYOUT); + if (!texture->transitionLayout(&commands, range, VulkanLayout::DEPTH_SAMPLER)) { + texture->attachmentToSamplerBarrier(&commands, range); + } + } else { + texture->setLayout(range, VulkanFboCache::FINAL_COLOR_ATTACHMENT_LAYOUT); + if (!texture->transitionLayout(&commands, range, VulkanLayout::READ_WRITE)) { + texture->attachmentToSamplerBarrier(&commands, range); + } + } + } } -void VulkanRenderPrimitive::setPrimitiveType(PrimitiveType pt) { - this->type = pt; - switch (pt) { - case PrimitiveType::POINTS: - primitiveTopology = VK_PRIMITIVE_TOPOLOGY_POINT_LIST; - break; - case PrimitiveType::LINES: - primitiveTopology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST; - break; - case PrimitiveType::LINE_STRIP: - primitiveTopology = VK_PRIMITIVE_TOPOLOGY_LINE_STRIP; - break; - case PrimitiveType::TRIANGLES: - primitiveTopology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; - break; - case PrimitiveType::TRIANGLE_STRIP: - primitiveTopology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; - break; +VulkanVertexBufferInfo::VulkanVertexBufferInfo( + uint8_t bufferCount, uint8_t attributeCount, AttributeArray const& attributes) + : HwVertexBufferInfo(bufferCount, attributeCount), + mInfo(attributes.size()) { + auto attribDesc = mInfo.mSoa.data(); + auto bufferDesc = mInfo.mSoa.data(); + auto offsets = mInfo.mSoa.data(); + auto attribToBufferIndex = mInfo.mSoa.data(); + std::fill(mInfo.mSoa.begin(), + mInfo.mSoa.end(), -1); + + for (uint32_t attribIndex = 0; attribIndex < attributes.size(); attribIndex++) { + Attribute attrib = attributes[attribIndex]; + bool const isInteger = attrib.flags & Attribute::FLAG_INTEGER_TARGET; + bool const isNormalized = attrib.flags & Attribute::FLAG_NORMALIZED; + VkFormat vkformat = getVkFormat(attrib.type, isNormalized, isInteger); + + // HACK: Re-use the positions buffer as a dummy buffer for disabled attributes. Filament's + // vertex shaders declare all attributes as either vec4 or uvec4 (the latter for bone + // indices), and positions are always at least 32 bits per element. Therefore we can assign + // a dummy type of either R8G8B8A8_UINT or R8G8B8A8_SNORM, depending on whether the shader + // expects to receive floats or ints. + if (attrib.buffer == Attribute::BUFFER_UNUSED) { + vkformat = isInteger ? VK_FORMAT_R8G8B8A8_UINT : VK_FORMAT_R8G8B8A8_SNORM; + attrib = attributes[0]; + } + offsets[attribIndex] = attrib.offset; + attribDesc[attribIndex] = { + .location = attribIndex,// matches the GLSL layout specifier + .binding = attribIndex, // matches the position within vkCmdBindVertexBuffers + .format = vkformat, + }; + bufferDesc[attribIndex] = { + .binding = attribIndex, + .stride = attrib.stride, + }; + attribToBufferIndex[attribIndex] = attrib.buffer; } } -void VulkanRenderPrimitive::setBuffers(VulkanVertexBuffer* vertexBuffer, - VulkanIndexBuffer* indexBuffer) { - this->vertexBuffer = vertexBuffer; - this->indexBuffer = indexBuffer; +VulkanVertexBuffer::VulkanVertexBuffer(VulkanContext& context, VulkanStagePool& stagePool, + uint32_t vertexCount, fvkmemory::resource_ptr vbi) + : HwVertexBuffer(vertexCount), + vbi(vbi), + // TODO: Seems a bit wasteful. can we do better here? + mBuffers(MAX_VERTEX_BUFFER_COUNT) { } -VulkanTimerQuery::VulkanTimerQuery(VulkanContext& context) : mContext(context) { - std::unique_lock lock(context.timestamps.mutex); - utils::bitset32& bitset = context.timestamps.used; - const size_t maxTimers = bitset.size(); - assert_invariant(bitset.count() < maxTimers); - for (size_t timerIndex = 0; timerIndex < maxTimers; ++timerIndex) { - if (!bitset.test(timerIndex)) { - bitset.set(timerIndex); - startingQueryIndex = timerIndex * 2; - stoppingQueryIndex = timerIndex * 2 + 1; - return; +void VulkanVertexBuffer::setBuffer(fvkmemory::resource_ptr bufferObject, + uint32_t index) { + size_t const count = vbi->getAttributeCount(); + VkBuffer* const vkbuffers = getVkBuffers(); + int8_t const* const attribToBuffer = vbi->getAttributeToBuffer(); + for (uint8_t attribIndex = 0; attribIndex < count; attribIndex++) { + if (attribToBuffer[attribIndex] == static_cast(index)) { + vkbuffers[attribIndex] = bufferObject->buffer.getGpuBuffer(); } } - utils::slog.e << "More than " << maxTimers << " timers are not supported." << utils::io::endl; - startingQueryIndex = 0; - stoppingQueryIndex = 1; + mResources.push_back(bufferObject); } -VulkanTimerQuery::~VulkanTimerQuery() { - std::unique_lock lock(mContext.timestamps.mutex); - mContext.timestamps.used.unset(startingQueryIndex / 2); -} +VulkanBufferObject::VulkanBufferObject(VmaAllocator allocator, VulkanStagePool& stagePool, + uint32_t byteCount, BufferObjectBinding bindingType) + : HwBufferObject(byteCount), + buffer(allocator, stagePool, getBufferObjectUsage(bindingType), byteCount), + bindingType(bindingType) {} + +VulkanRenderPrimitive::VulkanRenderPrimitive(PrimitiveType pt, + fvkmemory::resource_ptr vb, + fvkmemory::resource_ptr ib) + : HwRenderPrimitive{.type = pt}, + vertexBuffer(vb), + indexBuffer(ib) {} } // namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanHandles.h b/filament/backend/src/vulkan/VulkanHandles.h index 34756015d56..32509852283 100644 --- a/filament/backend/src/vulkan/VulkanHandles.h +++ b/filament/backend/src/vulkan/VulkanHandles.h @@ -14,27 +14,231 @@ * limitations under the License. */ - #ifndef TNT_FILAMENT_BACKEND_VULKANHANDLES_H - #define TNT_FILAMENT_BACKEND_VULKANHANDLES_H +#ifndef TNT_FILAMENT_BACKEND_VULKANHANDLES_H +#define TNT_FILAMENT_BACKEND_VULKANHANDLES_H -#include "VulkanDriver.h" -#include "VulkanPipelineCache.h" +// This needs to be at the top +#include "DriverBase.h" + +#include "VulkanAsyncHandles.h" #include "VulkanBuffer.h" +#include "VulkanFboCache.h" #include "VulkanSwapChain.h" #include "VulkanTexture.h" #include "VulkanUtility.h" +#include "vulkan/memory/Resource.h" + +#include -#include "private/backend/SamplerGroup.h" +#include +#include +#include +#include + +#include namespace filament::backend { -struct VulkanProgram : public HwProgram { - VulkanProgram(VulkanContext& context, const Program& builder) noexcept; - VulkanProgram(VulkanContext& context, VkShaderModule vs, VkShaderModule fs) noexcept; +namespace { +// Counts the total number of descriptors for both vertex and fragment stages. +template +inline uint8_t collapsedCount(Bitmask const& mask) { + static_assert(sizeof(mask) <= 64); + constexpr uint64_t VERTEX_MASK = (1ULL << getFragmentStageShift()) - 1ULL; + constexpr uint64_t FRAGMENT_MASK = (VERTEX_MASK << getFragmentStageShift()); + uint64_t val = mask.getValue(); + val = ((val & VERTEX_MASK) >> getVertexStageShift()) | + ((val & FRAGMENT_MASK) >> getFragmentStageShift()); + return (uint8_t) Bitmask(val).count(); +} + +} // anonymous namespace + +class VulkanTimestamps; +struct VulkanBufferObject; + +struct VulkanDescriptorSetLayout : public HwDescriptorSetLayout, fvkmemory::Resource { + static constexpr uint8_t UNIQUE_DESCRIPTOR_SET_COUNT = 4; + static constexpr uint8_t MAX_BINDINGS = 25; + + using DescriptorSetLayoutArray = std::array; + + // The bitmask representation of a set layout. + struct Bitmask { + // TODO: better utiltize the space below and use bitset instead. + UniformBufferBitmask ubo; // 8 bytes + UniformBufferBitmask dynamicUbo; // 8 bytes + SamplerBitmask sampler; // 8 bytes + InputAttachmentBitmask inputAttachment; // 8 bytes + + bool operator==(Bitmask const& right) const { + return ubo == right.ubo && dynamicUbo == right.dynamicUbo && sampler == right.sampler && + inputAttachment == right.inputAttachment; + } + }; + static_assert(sizeof(Bitmask) == 32); + + // This is a convenience struct to quickly check layout compatibility in terms of descriptor set + // pools. + struct Count { + uint32_t ubo = 0; + uint32_t dynamicUbo = 0; + uint32_t sampler = 0; + uint32_t inputAttachment = 0; + + inline uint32_t total() const { + return ubo + dynamicUbo + sampler + inputAttachment; + } + + bool operator==(Count const& right) const noexcept { + return ubo == right.ubo && dynamicUbo == right.dynamicUbo && sampler == right.sampler && + inputAttachment == right.inputAttachment; + } + + static inline Count fromLayoutBitmask(Bitmask const& mask) { + return { + .ubo = collapsedCount(mask.ubo), + .dynamicUbo = collapsedCount(mask.dynamicUbo), + .sampler = collapsedCount(mask.sampler), + .inputAttachment = collapsedCount(mask.inputAttachment), + }; + } + + Count operator*(uint16_t mult) const noexcept { + // TODO: check for overflow. + + Count ret; + ret.ubo = ubo * mult; + ret.dynamicUbo = dynamicUbo * mult; + ret.sampler = sampler * mult; + ret.inputAttachment = inputAttachment * mult; + return ret; + } + }; + + VulkanDescriptorSetLayout(DescriptorSetLayout const& layout); + + ~VulkanDescriptorSetLayout() = default; + + VkDescriptorSetLayout getVkLayout() const { return mVkLayout; } + void setVkLayout(VkDescriptorSetLayout vklayout) { mVkLayout = vklayout; } + + Bitmask const bitmask; + Count const count; + +private: + VkDescriptorSetLayout mVkLayout = VK_NULL_HANDLE; +}; + +struct VulkanDescriptorSet : public HwDescriptorSet, fvkmemory::Resource { +public: + // Because we need to recycle descriptor sets not used, we allow for a callback that the "Pool" + // can use to repackage the vk handle. + using OnRecycle = std::function; + + VulkanDescriptorSet(VkDescriptorSet rawSet, + UniformBufferBitmask const& dynamicUboMask, + uint8_t uniqueDynamicUboCount, + OnRecycle&& onRecycleFn) + : vkSet(rawSet), + dynamicUboMask(dynamicUboMask), + uniqueDynamicUboCount(uniqueDynamicUboCount), + mOnRecycleFn(std::move(onRecycleFn)) {} + + ~VulkanDescriptorSet() { + if (mOnRecycleFn) { + mOnRecycleFn(this); + } + } + + void setOffsets(backend::DescriptorSetOffsetArray&& offsets) noexcept { + mOffsets = std::move(offsets); + } + + backend::DescriptorSetOffsetArray const* getOffsets() { + return &mOffsets; + } + + void acquire(fvkmemory::resource_ptr texture); + void acquire(fvkmemory::resource_ptr buffer); + + VkDescriptorSet const vkSet; + UniformBufferBitmask const dynamicUboMask; + uint8_t const uniqueDynamicUboCount; + +private: + backend::DescriptorSetOffsetArray mOffsets; + std::vector> mResources; + OnRecycle mOnRecycleFn; +}; + +using PushConstantNameArray = utils::FixedCapacityVector; +using PushConstantNameByStage = std::array; + +struct PushConstantDescription { + explicit PushConstantDescription(backend::Program const& program) noexcept; + + VkPushConstantRange const* getVkRanges() const noexcept { return mRanges; } + uint32_t getVkRangeCount() const noexcept { return mRangeCount; } + void write(VkCommandBuffer cmdbuf, VkPipelineLayout layout, backend::ShaderStage stage, + uint8_t index, backend::PushConstantVariant const& value); + +private: + static constexpr uint32_t ENTRY_SIZE = sizeof(uint32_t); + + utils::FixedCapacityVector mTypes[Program::SHADER_TYPE_COUNT]; + VkPushConstantRange mRanges[Program::SHADER_TYPE_COUNT]; + uint32_t mRangeCount; +}; + +struct VulkanProgram : public HwProgram, fvkmemory::Resource { + using BindingList = CappedArray; + + VulkanProgram(VkDevice device, Program const& builder) noexcept; ~VulkanProgram(); - VulkanContext& context; - VulkanPipelineCache::ProgramBundle bundle; - Program::SamplerGroupInfo samplerGroupInfo; + + inline VkShaderModule getVertexShader() const { + return mInfo->shaders[0]; + } + + inline VkShaderModule getFragmentShader() const { return mInfo->shaders[1]; } + + inline uint32_t getPushConstantRangeCount() const { + return mInfo->pushConstantDescription.getVkRangeCount(); + } + + inline VkPushConstantRange const* getPushConstantRanges() const { + return mInfo->pushConstantDescription.getVkRanges(); + } + + inline void writePushConstant(VkCommandBuffer cmdbuf, VkPipelineLayout layout, + backend::ShaderStage stage, uint8_t index, backend::PushConstantVariant const& value) { + mInfo->pushConstantDescription.write(cmdbuf, layout, stage, index, value); + } + +#if FVK_ENABLED_DEBUG_SAMPLER_NAME + inline utils::FixedCapacityVector const& getBindingToName() const { + return mInfo->bindingToName; + } +#endif + + // TODO: handle compute shaders. + // The expected order of shaders - from frontend to backend - is vertex, fragment, compute. + static constexpr uint8_t const MAX_SHADER_MODULES = 2; + +private: + struct PipelineInfo { + explicit PipelineInfo(backend::Program const& program) noexcept + : pushConstantDescription(program) + {} + + VkShaderModule shaders[MAX_SHADER_MODULES] = { VK_NULL_HANDLE }; + PushConstantDescription pushConstantDescription; + }; + + PipelineInfo* mInfo; + VkDevice mDevice = VK_NULL_HANDLE; }; // The render target bundles together a set of attachments, each of which can have one of the @@ -45,95 +249,174 @@ struct VulkanProgram : public HwProgram { // // We use private inheritance to shield clients from the width / height fields in HwRenderTarget, // which are not representative when this is the default render target. -struct VulkanRenderTarget : private HwRenderTarget { +struct VulkanRenderTarget : private HwRenderTarget, fvkmemory::Resource { // Creates an offscreen render target. - VulkanRenderTarget(VulkanContext& context, uint32_t width, uint32_t height, uint8_t samples, - VulkanAttachment color[MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT], VulkanAttachment depthStencil[2], - VulkanStagePool& stagePool); + VulkanRenderTarget(VkDevice device, VkPhysicalDevice physicalDevice, + VulkanContext const& context, fvkmemory::ResourceManager* resourceManager, + VmaAllocator allocator, VulkanCommands* commands, uint32_t width, uint32_t height, + uint8_t samples, VulkanAttachment color[MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT], + VulkanAttachment depthStencil[2], VulkanStagePool& stagePool, uint8_t layerCount); + + ~VulkanRenderTarget(); // Creates a special "default" render target (i.e. associated with the swap chain) explicit VulkanRenderTarget(); void transformClientRectToPlatform(VkRect2D* bounds) const; - void transformClientRectToPlatform(VkViewport* bounds) const; - VkExtent2D getExtent() const; - VulkanAttachment getColor(int target) const; - VulkanAttachment getMsaaColor(int target) const; - VulkanAttachment getDepth() const; - VulkanAttachment getMsaaDepth() const; - uint8_t getColorTargetCount(const VulkanRenderPass& pass) const; - uint8_t getSamples() const { return mSamples; } - bool hasDepth() const { return mDepth.texture; } - bool isSwapChain() const { return !mOffscreen; } - void bindToSwapChain(VulkanSwapChain& surf); + + void transformViewportToPlatform(VkViewport* bounds) const; + + inline VkExtent2D getExtent() const { + return {width, height}; + } + + inline VulkanAttachment& getColor0() const { + assert_invariant(mInfo->colors[0]); + return mInfo->attachments[0]; + } + + inline VulkanAttachment& getDepth() const { + assert_invariant(hasDepth()); + if (mInfo->fbkey.samples == 1) { + return mInfo->attachments[mInfo->depthIndex]; + } + return mInfo->attachments[mInfo->msaaDepthIndex]; + } + + inline VulkanFboCache::RenderPassKey const& getRenderPassKey() const { + return mInfo->rpkey; + } + + inline VulkanFboCache::FboKey const& getFboKey() const { + return mInfo->fbkey; + } + + inline uint8_t getSamples() const { + return mInfo->fbkey.samples; + } + + uint8_t getColorTargetCount(VulkanRenderPass const& pass) const; + + inline bool hasDepth() const { return mInfo->depthIndex != Auxiliary::UNDEFINED_INDEX; } + + inline bool isSwapChain() const { return !mOffscreen; } + inline bool isProtected() const { return mProtected; } + + void bindToSwapChain(fvkmemory::resource_ptr swapchain); + + void emitBarriersBeginRenderPass(VulkanCommandBuffer& commands); + + void emitBarriersEndRenderPass(VulkanCommandBuffer& commands); private: - VulkanAttachment mColor[MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT] = {}; - VulkanAttachment mDepth = {}; - VulkanAttachment mMsaaAttachments[MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT] = {}; - VulkanAttachment mMsaaDepthAttachment = {}; - const bool mOffscreen : 1; - uint8_t mSamples : 7; + struct Auxiliary { + static constexpr int8_t UNDEFINED_INDEX = -1; + + explicit Auxiliary() noexcept = default; + + VulkanFboCache::RenderPassKey rpkey = {}; + VulkanFboCache::FboKey fbkey = {}; + std::vector attachments; + utils::bitset32 colors; + int8_t depthIndex = UNDEFINED_INDEX; + int8_t msaaDepthIndex = UNDEFINED_INDEX; + int8_t msaaIndex = UNDEFINED_INDEX; + }; + bool const mOffscreen; + bool mProtected; + + std::unique_ptr mInfo; }; -struct VulkanVertexBuffer : public HwVertexBuffer { - VulkanVertexBuffer(VulkanContext& context, VulkanStagePool& stagePool, - uint8_t bufferCount, uint8_t attributeCount, uint32_t elementCount, +struct VulkanBufferObject; + +struct VulkanVertexBufferInfo : public HwVertexBufferInfo, fvkmemory::Resource { + VulkanVertexBufferInfo(uint8_t bufferCount, uint8_t attributeCount, AttributeArray const& attributes); - utils::FixedCapacityVector buffers; -}; -struct VulkanIndexBuffer : public HwIndexBuffer { - VulkanIndexBuffer(VulkanContext& context, VulkanStagePool& stagePool, - uint8_t elementSize, uint32_t indexCount) : HwIndexBuffer(elementSize, indexCount), - buffer(context, stagePool, - VK_BUFFER_USAGE_INDEX_BUFFER_BIT, elementSize * indexCount), - indexType(elementSize == 2 ? VK_INDEX_TYPE_UINT16 : VK_INDEX_TYPE_UINT32) {} - void terminate(VulkanContext& context) { buffer.terminate(context); } - VulkanBuffer buffer; - const VkIndexType indexType; -}; + inline VkVertexInputAttributeDescription const* getAttribDescriptions() const { + return mInfo.mSoa.data(); + } -struct VulkanBufferObject : public HwBufferObject { - VulkanBufferObject(VulkanContext& context, VulkanStagePool& stagePool, - uint32_t byteCount, BufferObjectBinding bindingType, BufferUsage usage); - void terminate(VulkanContext& context) { buffer.terminate(context); } - VulkanBuffer buffer; - const BufferObjectBinding bindingType; -}; + inline VkVertexInputBindingDescription const* getBufferDescriptions() const { + return mInfo.mSoa.data(); + } + + inline int8_t const* getAttributeToBuffer() const { + return mInfo.mSoa.data(); + } + + inline VkDeviceSize const* getOffsets() const { + return mInfo.mSoa.data(); + } + + size_t getAttributeCount() const noexcept { + return mInfo.mSoa.size(); + } -struct VulkanSamplerGroup : public HwSamplerGroup { - // NOTE: we have to use out-of-line allocation here because the size of a Handle<> is limited - std::unique_ptr sb; // FIXME: this shouldn't depend on filament::SamplerGroup - explicit VulkanSamplerGroup(size_t size) noexcept : sb(new SamplerGroup(size)) { } +private: + struct PipelineInfo { + PipelineInfo(size_t size) : mSoa(size /* capacity */) { + mSoa.resize(size); + } + + // These correspond to the index of the element in the SoA + static constexpr uint8_t ATTRIBUTE_DESCRIPTION = 0; + static constexpr uint8_t BUFFER_DESCRIPTION = 1; + static constexpr uint8_t OFFSETS = 2; + static constexpr uint8_t ATTRIBUTE_TO_BUFFER_INDEX = 3; + + utils::StructureOfArrays< + VkVertexInputAttributeDescription, + VkVertexInputBindingDescription, + VkDeviceSize, + int8_t + > mSoa; + }; + + PipelineInfo mInfo; }; -struct VulkanRenderPrimitive : public HwRenderPrimitive { - void setPrimitiveType(PrimitiveType pt); - void setBuffers(VulkanVertexBuffer* vertexBuffer, VulkanIndexBuffer* indexBuffer); - VulkanVertexBuffer* vertexBuffer = nullptr; - VulkanIndexBuffer* indexBuffer = nullptr; - VkPrimitiveTopology primitiveTopology; +struct VulkanVertexBuffer : public HwVertexBuffer, fvkmemory::Resource { + VulkanVertexBuffer(VulkanContext& context, VulkanStagePool& stagePool, uint32_t vertexCount, + fvkmemory::resource_ptr vbi); + void setBuffer(fvkmemory::resource_ptr bufferObject, uint32_t index); + + inline VkBuffer const* getVkBuffers() const { return mBuffers.data(); } + inline VkBuffer* getVkBuffers() { return mBuffers.data(); } + fvkmemory::resource_ptr vbi; + +private: + utils::FixedCapacityVector mBuffers; + std::vector> mResources; }; -struct VulkanFence : public HwFence { - explicit VulkanFence(const VulkanCommandBuffer& commands) : fence(commands.fence) {} - std::shared_ptr fence; +struct VulkanIndexBuffer : public HwIndexBuffer, fvkmemory::Resource { + VulkanIndexBuffer(VmaAllocator allocator, VulkanStagePool& stagePool, uint8_t elementSize, + uint32_t indexCount) + : HwIndexBuffer(elementSize, indexCount), + buffer(allocator, stagePool, VK_BUFFER_USAGE_INDEX_BUFFER_BIT, elementSize * indexCount), + indexType(elementSize == 2 ? VK_INDEX_TYPE_UINT16 : VK_INDEX_TYPE_UINT32) {} + + VulkanBuffer buffer; + const VkIndexType indexType; }; -struct VulkanSync : public HwSync { - VulkanSync() = default; - explicit VulkanSync(const VulkanCommandBuffer& commands) : fence(commands.fence) {} - std::shared_ptr fence; +struct VulkanBufferObject : public HwBufferObject, fvkmemory::Resource { + VulkanBufferObject(VmaAllocator allocator, VulkanStagePool& stagePool, uint32_t byteCount, + BufferObjectBinding bindingType); + + VulkanBuffer buffer; + const BufferObjectBinding bindingType; }; -struct VulkanTimerQuery : public HwTimerQuery { - explicit VulkanTimerQuery(VulkanContext& context); - ~VulkanTimerQuery(); - uint32_t startingQueryIndex; - uint32_t stoppingQueryIndex; - VulkanContext& mContext; - std::atomic cmdbuffer = nullptr; +struct VulkanRenderPrimitive : public HwRenderPrimitive, fvkmemory::Resource { + VulkanRenderPrimitive(PrimitiveType pt, fvkmemory::resource_ptr vb, + fvkmemory::resource_ptr ib); + ~VulkanRenderPrimitive() = default; + + fvkmemory::resource_ptr vertexBuffer; + fvkmemory::resource_ptr indexBuffer; }; inline constexpr VkBufferUsageFlagBits getBufferObjectUsage( diff --git a/filament/backend/src/vulkan/VulkanImageUtility.cpp b/filament/backend/src/vulkan/VulkanImageUtility.cpp new file mode 100644 index 00000000000..415eb305cab --- /dev/null +++ b/filament/backend/src/vulkan/VulkanImageUtility.cpp @@ -0,0 +1,206 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "VulkanImageUtility.h" + +#include "VulkanTexture.h" + +#include +#include +#include + +#include + +using namespace bluevk; + +namespace filament::backend::imgutil { + +namespace { + +inline std::tuple +getVkTransition(const VulkanLayoutTransition& transition) { + VkAccessFlags srcAccessMask, dstAccessMask; + VkPipelineStageFlags srcStage, dstStage; + + switch (transition.oldLayout) { + case VulkanLayout::UNDEFINED: + srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; + srcStage = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT; + break; + case VulkanLayout::COLOR_ATTACHMENT: + srcAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | + VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + srcStage = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + break; + case VulkanLayout::READ_WRITE: + srcAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT; + srcStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + break; + case VulkanLayout::READ_ONLY: + srcAccessMask = VK_ACCESS_SHADER_READ_BIT; + srcStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + break; + case VulkanLayout::TRANSFER_SRC: + srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + srcStage = VK_PIPELINE_STAGE_TRANSFER_BIT; + break; + case VulkanLayout::TRANSFER_DST: + srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + srcStage = VK_PIPELINE_STAGE_TRANSFER_BIT; + break; + case VulkanLayout::DEPTH_ATTACHMENT: + srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + srcStage = VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + break; + case VulkanLayout::DEPTH_SAMPLER: + srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; + srcStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + break; + case VulkanLayout::COLOR_ATTACHMENT_RESOLVE: + srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + srcStage = VK_PIPELINE_STAGE_TRANSFER_BIT; + break; + case VulkanLayout::PRESENT: + srcAccessMask = VK_ACCESS_NONE; + srcStage = VK_PIPELINE_STAGE_TRANSFER_BIT; + break; + } + + switch (transition.newLayout) { + case VulkanLayout::COLOR_ATTACHMENT: + dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT + | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT + | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + dstStage = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT + | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + break; + case VulkanLayout::READ_WRITE: + dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT; + dstStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + break; + case VulkanLayout::READ_ONLY: + dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + dstStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT; + break; + case VulkanLayout::TRANSFER_SRC: + dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + dstStage = VK_PIPELINE_STAGE_TRANSFER_BIT; + break; + case VulkanLayout::TRANSFER_DST: + dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + dstStage = VK_PIPELINE_STAGE_TRANSFER_BIT; + break; + case VulkanLayout::DEPTH_ATTACHMENT: + dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT + | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + dstStage = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT; + break; + case VulkanLayout::DEPTH_SAMPLER: + dstAccessMask = + VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + dstStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT; + break; + case VulkanLayout::PRESENT: + case VulkanLayout::COLOR_ATTACHMENT_RESOLVE: + case VulkanLayout::UNDEFINED: + dstAccessMask = 0; + dstStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; + break; + } + + return std::make_tuple(srcAccessMask, dstAccessMask, srcStage, dstStage, + getVkLayout(transition.oldLayout), getVkLayout(transition.newLayout)); +} + +}// anonymous namespace + +bool transitionLayout(VkCommandBuffer cmdbuffer, + VulkanLayoutTransition transition) { + if (transition.oldLayout == transition.newLayout) { + return false; + } + auto [srcAccessMask, dstAccessMask, srcStage, dstStage, oldLayout, newLayout] + = getVkTransition(transition); + + if (oldLayout == newLayout) { + return false; + } + + assert_invariant(transition.image != VK_NULL_HANDLE && "No image for transition"); + VkImageMemoryBarrier barrier = { + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, + .srcAccessMask = srcAccessMask, + .dstAccessMask = dstAccessMask, + .oldLayout = oldLayout, + .newLayout = newLayout, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .image = transition.image, + .subresourceRange = transition.subresources, + }; + vkCmdPipelineBarrier(cmdbuffer, srcStage, dstStage, 0, 0, nullptr, 0, nullptr, 1, &barrier); + return true; +} + +}// namespace filament::backend + +bool operator<(const VkImageSubresourceRange& a, const VkImageSubresourceRange& b) { + if (a.aspectMask < b.aspectMask) return true; + if (a.aspectMask > b.aspectMask) return false; + if (a.baseMipLevel < b.baseMipLevel) return true; + if (a.baseMipLevel > b.baseMipLevel) return false; + if (a.levelCount < b.levelCount) return true; + if (a.levelCount > b.levelCount) return false; + if (a.baseArrayLayer < b.baseArrayLayer) return true; + if (a.baseArrayLayer > b.baseArrayLayer) return false; + if (a.layerCount < b.layerCount) return true; + if (a.layerCount > b.layerCount) return false; + return false; +} + +#if FVK_ENABLED(FVK_DEBUG_LAYOUT_TRANSITION) || FVK_ENABLED(FVK_DEBUG_TEXTURE) +#define CASE(VALUE) \ + case filament::backend::VulkanLayout::VALUE: { \ + out << #VALUE; \ + out << " [" \ + << filament::backend::imgutil::getVkLayout( \ + filament::backend::VulkanLayout::VALUE) \ + << "]"; \ + break; \ + } + +utils::io::ostream& operator<<(utils::io::ostream& out, + const filament::backend::VulkanLayout& layout) { + switch (layout) { + CASE(UNDEFINED) + CASE(READ_ONLY) + CASE(READ_WRITE) + CASE(TRANSFER_SRC) + CASE(TRANSFER_DST) + CASE(DEPTH_ATTACHMENT) + CASE(DEPTH_SAMPLER) + CASE(PRESENT) + CASE(COLOR_ATTACHMENT) + CASE(COLOR_ATTACHMENT_RESOLVE) + } + return out; +} +#undef CASE +#endif diff --git a/filament/backend/src/vulkan/VulkanImageUtility.h b/filament/backend/src/vulkan/VulkanImageUtility.h new file mode 100644 index 00000000000..f8027d96975 --- /dev/null +++ b/filament/backend/src/vulkan/VulkanImageUtility.h @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * +* Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_VULKANIMAGEUTILITY_H +#define TNT_FILAMENT_BACKEND_VULKANIMAGEUTILITY_H + +#include + +#include + +#include + +namespace filament::backend { + +struct VulkanTexture; + +enum class VulkanLayout : uint8_t { + // The initial layout after the creation of the VkImage. We use this to denote the state before + // any transition. + UNDEFINED, + // Fragment/vertex shader accessible layout for reading and writing. + READ_WRITE, + // Fragment/vertex shader accessible layout for reading only. + READ_ONLY, + // For the source of a copy operation. + TRANSFER_SRC, + // For the destination of a copy operation. + TRANSFER_DST, + // For using a depth texture as an attachment. + DEPTH_ATTACHMENT, + // For using a depth texture both as an attachment and as a sampler. + DEPTH_SAMPLER, + // For swapchain images that will be presented. + PRESENT, + // For color attachments, but also used when the image is a sampler. + // TODO: explore separate layout policies for attachment+sampling and just attachment. + COLOR_ATTACHMENT, + // For color attachment MSAA resolves. + COLOR_ATTACHMENT_RESOLVE, +}; + +struct VulkanLayoutTransition { + VkImage image; + VulkanLayout oldLayout; + VulkanLayout newLayout; + VkImageSubresourceRange subresources; +}; + +namespace imgutil { + +inline VkImageViewType getViewType(SamplerType target) { + switch (target) { + case SamplerType::SAMPLER_CUBEMAP: + return VK_IMAGE_VIEW_TYPE_CUBE; + case SamplerType::SAMPLER_2D_ARRAY: + return VK_IMAGE_VIEW_TYPE_2D_ARRAY; + case SamplerType::SAMPLER_CUBEMAP_ARRAY: + return VK_IMAGE_VIEW_TYPE_CUBE_ARRAY; + case SamplerType::SAMPLER_3D: + return VK_IMAGE_VIEW_TYPE_3D; + default: + return VK_IMAGE_VIEW_TYPE_2D; + } +} + +constexpr inline VkImageLayout getVkLayout(VulkanLayout layout) { + switch (layout) { + case VulkanLayout::UNDEFINED: + return VK_IMAGE_LAYOUT_UNDEFINED; + case VulkanLayout::READ_WRITE: + return VK_IMAGE_LAYOUT_GENERAL; + case VulkanLayout::READ_ONLY: + return VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + case VulkanLayout::TRANSFER_SRC: + return VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; + case VulkanLayout::TRANSFER_DST: + return VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + case VulkanLayout::DEPTH_ATTACHMENT: + return VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + case VulkanLayout::DEPTH_SAMPLER: + return VK_IMAGE_LAYOUT_GENERAL; + case VulkanLayout::PRESENT: + return VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; + // Filament sometimes samples from one miplevel while writing to another level in the + // same texture (e.g. bloom does this). Moreover we'd like to avoid lots of expensive + // layout transitions. So, keep it simple and use GENERAL for all color-attachable + // textures. + case VulkanLayout::COLOR_ATTACHMENT: + return VK_IMAGE_LAYOUT_GENERAL; + case VulkanLayout::COLOR_ATTACHMENT_RESOLVE: + return VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + } +} + +// Returns true if a transition has been added to the command buffer, false otherwis (where there is +// no transition necessary). +bool transitionLayout(VkCommandBuffer cmdbuffer, VulkanLayoutTransition transition); + +} // namespace imgutil + +} // namespace filament::backend + +bool operator<(const VkImageSubresourceRange& a, const VkImageSubresourceRange& b); + +utils::io::ostream& operator<<(utils::io::ostream& out, const filament::backend::VulkanLayout& layout); + + +#endif // TNT_FILAMENT_BACKEND_VULKANIMAGEUTILITY_H diff --git a/filament/backend/src/vulkan/VulkanMemory.cpp b/filament/backend/src/vulkan/VulkanMemory.cpp index d2dafe1bed8..16f94346a7c 100644 --- a/filament/backend/src/vulkan/VulkanMemory.cpp +++ b/filament/backend/src/vulkan/VulkanMemory.cpp @@ -17,6 +17,10 @@ #include // must be included before vk_mem_alloc #pragma clang diagnostic push + +// Needed because not all clang versions have the warning -Wdeprecated-copy. +#pragma clang diagnostic ignored "-Wunknown-warning-option" + #pragma clang diagnostic ignored "-Wdeprecated-copy" #pragma clang diagnostic ignored "-Wimplicit-fallthrough" #pragma clang diagnostic ignored "-Wmissing-field-initializers" @@ -27,6 +31,7 @@ #pragma clang diagnostic ignored "-Wnullability-completeness" #pragma clang diagnostic ignored "-Wextra-semi" #pragma clang diagnostic ignored "-Wc++98-compat-extra-semi" +#pragma clang diagnostic ignored "-Wthread-safety-analysis" static const PFN_vkGetInstanceProcAddr& vkGetInstanceProcAddr = bluevk::vkGetInstanceProcAddr; static const PFN_vkGetDeviceProcAddr& vkGetDeviceProcAddr = bluevk::vkGetDeviceProcAddr; diff --git a/filament/backend/src/vulkan/VulkanMemory.h b/filament/backend/src/vulkan/VulkanMemory.h index 13c09a6bfc8..a5ab2953192 100644 --- a/filament/backend/src/vulkan/VulkanMemory.h +++ b/filament/backend/src/vulkan/VulkanMemory.h @@ -31,4 +31,8 @@ #include "vk_mem_alloc.h" +VK_DEFINE_HANDLE(VmaAllocator) +VK_DEFINE_HANDLE(VmaAllocation) +VK_DEFINE_HANDLE(VmaPool) + #endif // TNT_FILAMENT_BACKEND_VULKANMEMORY_H diff --git a/filament/backend/src/vulkan/VulkanPipelineCache.cpp b/filament/backend/src/vulkan/VulkanPipelineCache.cpp index a573a1cd89f..4cf98cef15a 100644 --- a/filament/backend/src/vulkan/VulkanPipelineCache.cpp +++ b/filament/backend/src/vulkan/VulkanPipelineCache.cpp @@ -14,14 +14,16 @@ * limitations under the License. */ -#include "vulkan/VulkanMemory.h" -#include "vulkan/VulkanPipelineCache.h" +#include "VulkanPipelineCache.h" +#include "VulkanMemory.h" +#include "caching/VulkanDescriptorSetManager.h" #include #include #include "VulkanConstants.h" #include "VulkanHandles.h" +#include "VulkanTexture.h" #include "VulkanUtility.h" // Vulkan functions often immediately dereference pointers, so it's fine to pass in a pointer @@ -33,289 +35,48 @@ using namespace bluevk; namespace filament::backend { -static VulkanPipelineCache::RasterState createDefaultRasterState(); - -static VkShaderStageFlags getShaderStageFlags(VulkanPipelineCache::UsageFlags key, uint16_t binding) { - // NOTE: if you modify this function, you also need to modify getUsageFlags. - assert_invariant(binding < MAX_SAMPLER_COUNT); - VkShaderStageFlags flags = 0; - if (key.test(binding)) { - flags |= VK_SHADER_STAGE_VERTEX_BIT; - } - if (key.test(MAX_SAMPLER_COUNT + binding)) { - flags |= VK_SHADER_STAGE_FRAGMENT_BIT; - } - return flags; -} - -VulkanPipelineCache::UsageFlags -VulkanPipelineCache::getUsageFlags(uint16_t binding, ShaderStageFlags flags, UsageFlags src) { - // NOTE: if you modify this function, you also need to modify getShaderStageFlags. - assert_invariant(binding < MAX_SAMPLER_COUNT); - if (any(flags & ShaderStageFlags::VERTEX)) { - src.set(binding); - } - if (any(flags & ShaderStageFlags::FRAGMENT)) { - src.set(MAX_SAMPLER_COUNT + binding); - } - // TODO: add support for compute by extending SHADER_MODULE_COUNT and ensuring UsageFlags - // has 186 bits (MAX_SAMPLER_COUNT * 3) - // assert_invariant(!any(flags & ~(ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT))); - return src; -} - -VulkanPipelineCache::VulkanPipelineCache() : mDefaultRasterState(createDefaultRasterState()) { - mDummyBufferWriteInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - mDummyBufferWriteInfo.pNext = nullptr; - mDummyBufferWriteInfo.dstArrayElement = 0; - mDummyBufferWriteInfo.descriptorCount = 1; - mDummyBufferWriteInfo.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - mDummyBufferWriteInfo.pImageInfo = nullptr; - mDummyBufferWriteInfo.pBufferInfo = &mDummyBufferInfo; - mDummyBufferWriteInfo.pTexelBufferView = nullptr; - - mDummyTargetInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - mDummyTargetWriteInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - mDummyTargetWriteInfo.pNext = nullptr; - mDummyTargetWriteInfo.dstArrayElement = 0; - mDummyTargetWriteInfo.descriptorCount = 1; - mDummyTargetWriteInfo.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT; - mDummyTargetWriteInfo.pImageInfo = &mDummyTargetInfo; - mDummyTargetWriteInfo.pBufferInfo = nullptr; - mDummyTargetWriteInfo.pTexelBufferView = nullptr; +VulkanPipelineCache::VulkanPipelineCache(VkDevice device, VmaAllocator allocator) + : mDevice(device), + mAllocator(allocator) { } VulkanPipelineCache::~VulkanPipelineCache() { - // This does nothing because VulkanDriver::terminate() calls destroyCache() in order to + // This does nothing because VulkanDriver::terminate() calls terminate() in order to // be explicit about teardown order of various components. } -void VulkanPipelineCache::setDevice(VkDevice device, VmaAllocator allocator) { - assert_invariant(mDevice == VK_NULL_HANDLE); - mDevice = device; - mAllocator = allocator; - mDescriptorPool = createDescriptorPool(mDescriptorPoolSize); - - // Formulate some dummy objects and dummy descriptor info used only for clearing out unused - // bindings. This is especially crucial after a texture has been destroyed. Since core Vulkan - // does not allow specifying VK_NULL_HANDLE without the robustness2 extension, we would need to - // change the pipeline layout more frequently if we wanted to get rid of these dummy objects. - - VkBufferCreateInfo bufferInfo { - .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, - .size = 16, - .usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - }; - VmaAllocationCreateInfo allocInfo { .usage = VMA_MEMORY_USAGE_GPU_ONLY }; - vmaCreateBuffer(mAllocator, &bufferInfo, &allocInfo, &mDummyBuffer, &mDummyMemory, nullptr); - - mDummyBufferInfo.buffer = mDummyBuffer; - mDummyBufferInfo.range = bufferInfo.size; +void VulkanPipelineCache::bindLayout(VkPipelineLayout layout) noexcept { + mPipelineRequirements.layout = layout; } -bool VulkanPipelineCache::bindDescriptors(VkCommandBuffer cmdbuffer) noexcept { - DescriptorMap::iterator descriptorIter = mDescriptorSets.find(mDescriptorRequirements); - - // Check if the required descriptors are already bound. If so, there's no need to do anything. - if (DescEqual equals; UTILS_LIKELY(equals(mBoundDescriptor, mDescriptorRequirements))) { - - // If the pipeline state during an app's first draw call happens to match the default state - // vector of the cache, then the cache is uninitialized and we should not return early. - if (UTILS_LIKELY(!mDescriptorSets.empty())) { - - // Since the descriptors are already bound, they should be found in the cache. - assert_invariant(descriptorIter != mDescriptorSets.end()); - - // Update the LRU "time stamp" (really a count of cmd buf submissions) before returning. - descriptorIter.value().lastUsed = mCurrentTime; - return true; - } - } - +VulkanPipelineCache::PipelineCacheEntry* VulkanPipelineCache::getOrCreatePipeline() noexcept { // If a cached object exists, re-use it, otherwise create a new one. - DescriptorCacheEntry* cacheEntry = UTILS_LIKELY(descriptorIter != mDescriptorSets.end()) ? - &descriptorIter.value() : createDescriptorSets(); - - // If a descriptor set overflow occurred, allow higher levels to handle it gracefully. - assert_invariant(cacheEntry != nullptr); - if (UTILS_UNLIKELY(cacheEntry == nullptr)) { - return false; + if (PipelineMap::iterator pipelineIter = mPipelines.find(mPipelineRequirements); + pipelineIter != mPipelines.end()) { + auto& pipeline = pipelineIter.value(); + pipeline.lastUsed = mCurrentTime; + return &pipeline; } - - cacheEntry->lastUsed = mCurrentTime; - mBoundDescriptor = mDescriptorRequirements; - - vkCmdBindDescriptorSets(cmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, - getOrCreatePipelineLayout()->handle, 0, VulkanPipelineCache::DESCRIPTOR_TYPE_COUNT, - cacheEntry->handles.data(), 0, nullptr); - - return true; + auto ret = createPipeline(); + ret->lastUsed = mCurrentTime; + return ret; } -bool VulkanPipelineCache::bindPipeline(VkCommandBuffer cmdbuffer) noexcept { - PipelineMap::iterator pipelineIter = mPipelines.find(mPipelineRequirements); +void VulkanPipelineCache::bindPipeline(VulkanCommandBuffer* commands) { + VkCommandBuffer const cmdbuffer = commands->buffer(); - // Check if the required pipeline is already bound. - if (PipelineEqual equals; UTILS_LIKELY(equals(mBoundPipeline, mPipelineRequirements))) { - assert_invariant(pipelineIter != mPipelines.end()); - pipelineIter.value().lastUsed = mCurrentTime; - return true; - } - - // If a cached object exists, re-use it, otherwise create a new one. - PipelineCacheEntry* cacheEntry = UTILS_LIKELY(pipelineIter != mPipelines.end()) ? - &pipelineIter.value() : createPipeline(); + PipelineCacheEntry* cacheEntry = getOrCreatePipeline(); // If an error occurred, allow higher levels to handle it gracefully. - assert_invariant(cacheEntry != nullptr); - if (UTILS_UNLIKELY(cacheEntry == nullptr)) { - return false; - } - - cacheEntry->lastUsed = mCurrentTime; - getOrCreatePipelineLayout()->lastUsed = mCurrentTime; + assert_invariant(cacheEntry != nullptr && "Failed to create/find pipeline"); mBoundPipeline = mPipelineRequirements; - vkCmdBindPipeline(cmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, cacheEntry->handle); - return true; -} - -void VulkanPipelineCache::bindScissor(VkCommandBuffer cmdbuffer, VkRect2D scissor) noexcept { - if (UTILS_UNLIKELY(!equivalent(mCurrentScissor, scissor))) { - mCurrentScissor = scissor; - vkCmdSetScissor(cmdbuffer, 0, 1, &scissor); - } -} - -VulkanPipelineCache::DescriptorCacheEntry* VulkanPipelineCache::createDescriptorSets() noexcept { - PipelineLayoutCacheEntry* layoutCacheEntry = getOrCreatePipelineLayout(); - - DescriptorCacheEntry descriptorCacheEntry = { .pipelineLayout = mPipelineRequirements.layout }; - - // Each of the arenas for this particular layout are guaranteed to have the same size. Check - // the first arena to see if any descriptor sets are available that can be re-claimed. If not, - // create brand new ones (one for each type). They will be added to the arena later, after they - // are no longer used. This occurs during the cleanup phase during command buffer submission. - auto& descriptorSetArenas = layoutCacheEntry->descriptorSetArenas; - if (descriptorSetArenas[0].empty()) { - - // If allocating a new descriptor set from the pool would cause it to overflow, then - // recreate the pool. The number of descriptor sets that have already been allocated from - // the pool is the sum of the "active" descriptor sets (mDescriptorSets) and the "dormant" - // descriptor sets (mDescriptorArenasCount). - // - // NOTE: technically both sides of the inequality below should be multiplied by - // DESCRIPTOR_TYPE_COUNT to get the true number of descriptor sets. - if (mDescriptorSets.size() + mDescriptorArenasCount + 1 > mDescriptorPoolSize) { - growDescriptorPool(); - } - - VkDescriptorSetAllocateInfo allocInfo = {}; - allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - allocInfo.descriptorPool = mDescriptorPool; - allocInfo.descriptorSetCount = DESCRIPTOR_TYPE_COUNT; - allocInfo.pSetLayouts = layoutCacheEntry->descriptorSetLayouts.data(); - VkResult error = vkAllocateDescriptorSets(mDevice, &allocInfo, - descriptorCacheEntry.handles.data()); - assert_invariant(error == VK_SUCCESS); - if (error != VK_SUCCESS) { - return nullptr; - } - } else { - for (uint32_t i = 0; i < DESCRIPTOR_TYPE_COUNT; ++i) { - descriptorCacheEntry.handles[i] = descriptorSetArenas[i].back(); - descriptorSetArenas[i].pop_back(); - } - assert_invariant(mDescriptorArenasCount > 0); - mDescriptorArenasCount--; - } - - // Rewrite every binding in the new descriptor sets. - VkDescriptorBufferInfo descriptorBuffers[UBUFFER_BINDING_COUNT]; - VkDescriptorImageInfo descriptorSamplers[SAMPLER_BINDING_COUNT]; - VkDescriptorImageInfo descriptorInputAttachments[TARGET_BINDING_COUNT]; - VkWriteDescriptorSet descriptorWrites[UBUFFER_BINDING_COUNT + SAMPLER_BINDING_COUNT + - TARGET_BINDING_COUNT]; - uint32_t nwrites = 0; - VkWriteDescriptorSet* writes = descriptorWrites; - nwrites = 0; - for (uint32_t binding = 0; binding < UBUFFER_BINDING_COUNT; binding++) { - VkWriteDescriptorSet& writeInfo = writes[nwrites++]; - if (mDescriptorRequirements.uniformBuffers[binding]) { - VkDescriptorBufferInfo& bufferInfo = descriptorBuffers[binding]; - bufferInfo.buffer = mDescriptorRequirements.uniformBuffers[binding]; - bufferInfo.offset = mDescriptorRequirements.uniformBufferOffsets[binding]; - bufferInfo.range = mDescriptorRequirements.uniformBufferSizes[binding]; - - // We store size with 32 bits, so our "WHOLE" sentinel is different from Vk. - if (bufferInfo.range == WHOLE_SIZE) { - bufferInfo.range = VK_WHOLE_SIZE; - } - - writeInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - writeInfo.pNext = nullptr; - writeInfo.dstArrayElement = 0; - writeInfo.descriptorCount = 1; - writeInfo.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - writeInfo.pImageInfo = nullptr; - writeInfo.pBufferInfo = &bufferInfo; - writeInfo.pTexelBufferView = nullptr; - } else { - writeInfo = mDummyBufferWriteInfo; - assert_invariant(mDummyBufferWriteInfo.pBufferInfo->buffer); - } - assert_invariant(writeInfo.pBufferInfo->buffer); - writeInfo.dstSet = descriptorCacheEntry.handles[0]; - writeInfo.dstBinding = binding; - } - for (uint32_t binding = 0; binding < SAMPLER_BINDING_COUNT; binding++) { - if (mDescriptorRequirements.samplers[binding].sampler) { - VkWriteDescriptorSet& writeInfo = writes[nwrites++]; - VkDescriptorImageInfo& imageInfo = descriptorSamplers[binding]; - imageInfo = mDescriptorRequirements.samplers[binding]; - writeInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - writeInfo.pNext = nullptr; - writeInfo.dstArrayElement = 0; - writeInfo.descriptorCount = 1; - writeInfo.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - writeInfo.pImageInfo = &imageInfo; - writeInfo.pBufferInfo = nullptr; - writeInfo.pTexelBufferView = nullptr; - writeInfo.dstSet = descriptorCacheEntry.handles[1]; - writeInfo.dstBinding = binding; - } - } - for (uint32_t binding = 0; binding < TARGET_BINDING_COUNT; binding++) { - VkWriteDescriptorSet& writeInfo = writes[nwrites++]; - if (mDescriptorRequirements.inputAttachments[binding].imageView) { - VkDescriptorImageInfo& imageInfo = descriptorInputAttachments[binding]; - imageInfo = mDescriptorRequirements.inputAttachments[binding]; - writeInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - writeInfo.pNext = nullptr; - writeInfo.dstArrayElement = 0; - writeInfo.descriptorCount = 1; - writeInfo.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT; - writeInfo.pImageInfo = &imageInfo; - writeInfo.pBufferInfo = nullptr; - writeInfo.pTexelBufferView = nullptr; - } else { - writeInfo = mDummyTargetWriteInfo; - assert_invariant(mDummyTargetInfo.imageView); - } - writeInfo.dstSet = descriptorCacheEntry.handles[2]; - writeInfo.dstBinding = binding; - } - vkUpdateDescriptorSets(mDevice, nwrites, writes, 0, nullptr); - - return &mDescriptorSets.emplace(mDescriptorRequirements, descriptorCacheEntry).first.value(); } VulkanPipelineCache::PipelineCacheEntry* VulkanPipelineCache::createPipeline() noexcept { assert_invariant(mPipelineRequirements.shaders[0] && "Vertex shader is not bound."); - - PipelineLayoutCacheEntry* layout = getOrCreatePipelineLayout(); - assert_invariant(layout); + assert_invariant(mPipelineRequirements.layout && "No pipeline layout specified"); VkPipelineShaderStageCreateInfo shaderStages[SHADER_MODULE_COUNT]; shaderStages[0] = VkPipelineShaderStageCreateInfo{}; @@ -332,14 +93,12 @@ VulkanPipelineCache::PipelineCacheEntry* VulkanPipelineCache::createPipeline() n VkPipelineColorBlendStateCreateInfo colorBlendState; colorBlendState = VkPipelineColorBlendStateCreateInfo{}; colorBlendState.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; - colorBlendState.attachmentCount = 1; + colorBlendState.attachmentCount = mPipelineRequirements.rasterState.colorTargetCount; colorBlendState.pAttachments = colorBlendAttachments; // If we reach this point, we need to create and stash a brand new pipeline object. shaderStages[0].module = mPipelineRequirements.shaders[0]; - shaderStages[0].pSpecializationInfo = mSpecializationRequirements; shaderStages[1].module = mPipelineRequirements.shaders[1]; - shaderStages[1].pSpecializationInfo = mSpecializationRequirements; // Expand our size-optimized structs into the proper Vk structs. uint32_t numVertexAttribs = 0; @@ -386,7 +145,7 @@ VulkanPipelineCache::PipelineCacheEntry* VulkanPipelineCache::createPipeline() n VkGraphicsPipelineCreateInfo pipelineCreateInfo = {}; pipelineCreateInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; - pipelineCreateInfo.layout = layout->handle; + pipelineCreateInfo.layout = mPipelineRequirements.layout; pipelineCreateInfo.renderPass = mPipelineRequirements.renderPass; pipelineCreateInfo.subpass = mPipelineRequirements.subpassIndex; pipelineCreateInfo.stageCount = hasFragmentShader ? SHADER_MODULE_COUNT : 1; @@ -420,6 +179,7 @@ VulkanPipelineCache::PipelineCacheEntry* VulkanPipelineCache::createPipeline() n vkRaster.polygonMode = VK_POLYGON_MODE_FILL; vkRaster.cullMode = raster.cullMode; vkRaster.frontFace = raster.frontFace; + vkRaster.depthClampEnable = raster.depthClamp; vkRaster.depthBiasEnable = raster.depthBiasEnable; vkRaster.depthBiasConstantFactor = raster.depthBiasConstantFactor; vkRaster.depthBiasClamp = 0.0f; @@ -445,8 +205,8 @@ VulkanPipelineCache::PipelineCacheEntry* VulkanPipelineCache::createPipeline() n pipelineCreateInfo.pDynamicState = &dynamicState; // Filament assumes consistent blend state across all color attachments. - colorBlendState.attachmentCount = mPipelineRequirements.rasterState.colorTargetCount; - for (auto& target : colorBlendAttachments) { + for (uint8_t i = 0; i < colorBlendState.attachmentCount; ++i) { + auto& target = colorBlendAttachments[i]; target.blendEnable = mPipelineRequirements.rasterState.blendEnable; target.srcColorBlendFactor = mPipelineRequirements.rasterState.srcColorBlendFactor; target.dstColorBlendFactor = mPipelineRequirements.rasterState.dstColorBlendFactor; @@ -465,89 +225,33 @@ VulkanPipelineCache::PipelineCacheEntry* VulkanPipelineCache::createPipeline() n PipelineCacheEntry cacheEntry = {}; - if constexpr (FILAMENT_VULKAN_VERBOSE) { - utils::slog.d << "vkCreateGraphicsPipelines with shaders = (" - << shaderStages[0].module << ", " << shaderStages[1].module << ")" << utils::io::endl; - } + #if FVK_ENABLED(FVK_DEBUG_SHADER_MODULE) + FVK_LOGD << "vkCreateGraphicsPipelines with shaders = (" + << shaderStages[0].module << ", " << shaderStages[1].module << ")" + << utils::io::endl; + #endif VkResult error = vkCreateGraphicsPipelines(mDevice, VK_NULL_HANDLE, 1, &pipelineCreateInfo, VKALLOC, &cacheEntry.handle); assert_invariant(error == VK_SUCCESS); if (error != VK_SUCCESS) { - utils::slog.e << "vkCreateGraphicsPipelines error " << error << utils::io::endl; + FVK_LOGE << "vkCreateGraphicsPipelines error " << error << utils::io::endl; return nullptr; } return &mPipelines.emplace(mPipelineRequirements, cacheEntry).first.value(); } -VulkanPipelineCache::PipelineLayoutCacheEntry* VulkanPipelineCache::getOrCreatePipelineLayout() noexcept { - auto iter = mPipelineLayouts.find(mPipelineRequirements.layout); - if (UTILS_LIKELY(iter != mPipelineLayouts.end())) { - return &iter.value(); - } - - PipelineLayoutCacheEntry cacheEntry = {}; - - VkDescriptorSetLayoutBinding binding = {}; - binding.descriptorCount = 1; // NOTE: We never use arrays-of-blocks. - binding.stageFlags = VK_SHADER_STAGE_ALL_GRAPHICS; // NOTE: This is potentially non-optimal. +void VulkanPipelineCache::bindProgram(fvkmemory::resource_ptr program) noexcept { + mPipelineRequirements.shaders[0] = program->getVertexShader(); + mPipelineRequirements.shaders[1] = program->getFragmentShader(); - // First create the descriptor set layout for UBO's. - VkDescriptorSetLayoutBinding ubindings[UBUFFER_BINDING_COUNT]; - binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - for (uint32_t i = 0; i < UBUFFER_BINDING_COUNT; i++) { - binding.binding = i; - ubindings[i] = binding; + // If this is a debug build, validate the current shader. +#if FVK_ENABLED(FVK_DEBUG_SHADER_MODULE) + if (mPipelineRequirements.shaders[0] == VK_NULL_HANDLE || + mPipelineRequirements.shaders[1] == VK_NULL_HANDLE) { + FVK_LOGE << "Binding missing shader: " << program->name.c_str() << utils::io::endl; } - VkDescriptorSetLayoutCreateInfo dlinfo = {}; - dlinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - dlinfo.bindingCount = UBUFFER_BINDING_COUNT; - dlinfo.pBindings = ubindings; - vkCreateDescriptorSetLayout(mDevice, &dlinfo, VKALLOC, &cacheEntry.descriptorSetLayouts[0]); - - // Next create the descriptor set layout for samplers. - VkDescriptorSetLayoutBinding sbindings[SAMPLER_BINDING_COUNT]; - binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - for (uint32_t i = 0; i < SAMPLER_BINDING_COUNT; i++) { - binding.stageFlags = getShaderStageFlags(mPipelineRequirements.layout, i); - binding.binding = i; - sbindings[i] = binding; - } - dlinfo.bindingCount = SAMPLER_BINDING_COUNT; - dlinfo.pBindings = sbindings; - vkCreateDescriptorSetLayout(mDevice, &dlinfo, VKALLOC, &cacheEntry.descriptorSetLayouts[1]); - - // Next create the descriptor set layout for input attachments. - VkDescriptorSetLayoutBinding tbindings[TARGET_BINDING_COUNT]; - binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT; - binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; - for (uint32_t i = 0; i < TARGET_BINDING_COUNT; i++) { - binding.binding = i; - tbindings[i] = binding; - } - dlinfo.bindingCount = TARGET_BINDING_COUNT; - dlinfo.pBindings = tbindings; - vkCreateDescriptorSetLayout(mDevice, &dlinfo, VKALLOC, &cacheEntry.descriptorSetLayouts[2]); - - // Create VkPipelineLayout based on how to resources are bounded. - VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo = {}; - pPipelineLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; - pPipelineLayoutCreateInfo.setLayoutCount = cacheEntry.descriptorSetLayouts.size(); - pPipelineLayoutCreateInfo.pSetLayouts = cacheEntry.descriptorSetLayouts.data(); - VkResult result = vkCreatePipelineLayout(mDevice, &pPipelineLayoutCreateInfo, VKALLOC, - &cacheEntry.handle); - if (UTILS_UNLIKELY(result != VK_SUCCESS)) { - return nullptr; - } - return &mPipelineLayouts.emplace(mPipelineRequirements.layout, cacheEntry).first.value(); -} - -void VulkanPipelineCache::bindProgram(const VulkanProgram& program) noexcept { - const VkShaderModule shaders[2] = { program.bundle.vertex, program.bundle.fragment }; - for (uint32_t ssi = 0; ssi < SHADER_MODULE_COUNT; ssi++) { - mPipelineRequirements.shaders[ssi] = shaders[ssi]; - } - mSpecializationRequirements = program.bundle.specializationInfos; +#endif } void VulkanPipelineCache::bindRasterState(const RasterState& rasterState) noexcept { @@ -564,283 +268,52 @@ void VulkanPipelineCache::bindPrimitiveTopology(VkPrimitiveTopology topology) no mPipelineRequirements.topology = topology; } -void VulkanPipelineCache::bindVertexArray(const VertexArray& varray) noexcept { +void VulkanPipelineCache::bindVertexArray(VkVertexInputAttributeDescription const* attribDesc, + VkVertexInputBindingDescription const* bufferDesc, uint8_t count) { for (size_t i = 0; i < VERTEX_ATTRIBUTE_COUNT; i++) { - mPipelineRequirements.vertexAttributes[i] = varray.attributes[i]; - mPipelineRequirements.vertexBuffers[i] = varray.buffers[i]; - } -} - -VulkanPipelineCache::UniformBufferBinding VulkanPipelineCache::getUniformBufferBinding(uint32_t bindingIndex) const noexcept { - auto& key = mDescriptorRequirements; - return { - key.uniformBuffers[bindingIndex], - key.uniformBufferOffsets[bindingIndex], - key.uniformBufferSizes[bindingIndex], - }; -} - -void VulkanPipelineCache::unbindUniformBuffer(VkBuffer uniformBuffer) noexcept { - auto& key = mDescriptorRequirements; - for (uint32_t bindingIndex = 0u; bindingIndex < UBUFFER_BINDING_COUNT; ++bindingIndex) { - if (key.uniformBuffers[bindingIndex] == uniformBuffer) { - key.uniformBuffers[bindingIndex] = {}; - key.uniformBufferSizes[bindingIndex] = {}; - key.uniformBufferOffsets[bindingIndex] = {}; - } - } -} - -void VulkanPipelineCache::unbindImageView(VkImageView imageView) noexcept { - for (auto& sampler : mDescriptorRequirements.samplers) { - if (sampler.imageView == imageView) { - sampler = {}; - } - } - for (auto& target : mDescriptorRequirements.inputAttachments) { - if (target.imageView == imageView) { - target = {}; + if (i < count) { + mPipelineRequirements.vertexAttributes[i] = attribDesc[i]; + mPipelineRequirements.vertexBuffers[i] = bufferDesc[i]; + } else { + mPipelineRequirements.vertexAttributes[i] = {}; + mPipelineRequirements.vertexBuffers[i] = {}; } } } -void VulkanPipelineCache::bindUniformBuffer(uint32_t bindingIndex, VkBuffer uniformBuffer, - VkDeviceSize offset, VkDeviceSize size) noexcept { - ASSERT_POSTCONDITION(bindingIndex < UBUFFER_BINDING_COUNT, - "Uniform bindings overflow: index = %d, capacity = %d.", - bindingIndex, UBUFFER_BINDING_COUNT); - auto& key = mDescriptorRequirements; - key.uniformBuffers[bindingIndex] = uniformBuffer; - - if (size == VK_WHOLE_SIZE) { - size = WHOLE_SIZE; - } - - assert_invariant(offset <= 0xffffffffu); - assert_invariant(size <= 0xffffffffu); - - key.uniformBufferOffsets[bindingIndex] = offset; - key.uniformBufferSizes[bindingIndex] = size; -} - -void VulkanPipelineCache::bindSamplers(VkDescriptorImageInfo samplers[SAMPLER_BINDING_COUNT], - UsageFlags flags) noexcept { - for (uint32_t bindingIndex = 0; bindingIndex < SAMPLER_BINDING_COUNT; bindingIndex++) { - mDescriptorRequirements.samplers[bindingIndex] = samplers[bindingIndex]; - } - mPipelineRequirements.layout = flags; -} - -void VulkanPipelineCache::bindInputAttachment(uint32_t bindingIndex, - VkDescriptorImageInfo targetInfo) noexcept { - ASSERT_POSTCONDITION(bindingIndex < TARGET_BINDING_COUNT, - "Input attachment bindings overflow: index = %d, capacity = %d.", - bindingIndex, TARGET_BINDING_COUNT); - mDescriptorRequirements.inputAttachments[bindingIndex] = targetInfo; -} - -void VulkanPipelineCache::destroyCache() noexcept { - // Symmetric to createLayoutsAndDescriptors. - destroyLayoutsAndDescriptors(); +void VulkanPipelineCache::terminate() noexcept { for (auto& iter : mPipelines) { vkDestroyPipeline(mDevice, iter.second.handle, VKALLOC); } mPipelines.clear(); mBoundPipeline = {}; - vmaDestroyBuffer(mAllocator, mDummyBuffer, mDummyMemory); - mDummyBuffer = VK_NULL_HANDLE; - mDummyMemory = VK_NULL_HANDLE; } -void VulkanPipelineCache::onCommandBuffer(const VulkanCommandBuffer& cmdbuffer) { +void VulkanPipelineCache::gc() noexcept { // The timestamp associated with a given cache entry represents "time" as a count of flush // events since the cache was constructed. If any cache entry was most recently used over - // VK_MAX_PIPELINE_AGE flush events in the past, then we can be sure that it is no longer + // FVK_MAX_PIPELINE_AGE flush events in the past, then we can be sure that it is no longer // being used by the GPU, and is therefore safe to destroy or reclaim. ++mCurrentTime; // The Vulkan spec says: "When a command buffer begins recording, all state in that command // buffer is undefined." Therefore, we need to clear all bindings at this time. mBoundPipeline = {}; - mBoundDescriptor = {}; - mCurrentScissor = {}; // NOTE: Due to robin_map restrictions, we cannot use auto or range-based loops. - // Check if any bundles in the cache are no longer in use by any command buffer. Descriptors - // from unused bundles are moved back to their respective arenas. - using ConstDescIterator = decltype(mDescriptorSets)::const_iterator; - for (ConstDescIterator iter = mDescriptorSets.begin(); iter != mDescriptorSets.end();) { - const DescriptorCacheEntry& cacheEntry = iter.value(); - if (cacheEntry.lastUsed + VK_MAX_PIPELINE_AGE < mCurrentTime) { - auto& arenas = mPipelineLayouts[cacheEntry.pipelineLayout].descriptorSetArenas; - for (uint32_t i = 0; i < DESCRIPTOR_TYPE_COUNT; ++i) { - arenas[i].push_back(cacheEntry.handles[i]); - } - ++mDescriptorArenasCount; - iter = mDescriptorSets.erase(iter); - } else { - ++iter; - } - } - // Evict any pipelines that have not been used in a while. - // Any pipeline older than VK_MAX_COMMAND_BUFFERS can be safely destroyed. - using ConstPipeIterator = decltype(mPipelines)::const_iterator; - for (ConstPipeIterator iter = mPipelines.begin(); iter != mPipelines.end();) { - const PipelineCacheEntry& cacheEntry = iter.value(); - if (cacheEntry.lastUsed + VK_MAX_PIPELINE_AGE < mCurrentTime) { - vkDestroyPipeline(mDevice, iter->second.handle, VKALLOC); - iter = mPipelines.erase(iter); - } else { - ++iter; - } - } - - // Evict any layouts that have not been used in a while. - using ConstLayoutIterator = decltype(mPipelineLayouts)::const_iterator; - for (ConstLayoutIterator iter = mPipelineLayouts.begin(); iter != mPipelineLayouts.end();) { - const PipelineLayoutCacheEntry& cacheEntry = iter.value(); - if (cacheEntry.lastUsed + VK_MAX_PIPELINE_AGE < mCurrentTime) { - vkDestroyPipelineLayout(mDevice, iter->second.handle, VKALLOC); - for (auto setLayout : iter->second.descriptorSetLayouts) { -#ifndef NDEBUG - PipelineLayoutKey key = iter.key(); - for (auto& pair : mDescriptorSets) { - assert_invariant(pair.second.pipelineLayout != key); - } -#endif - vkDestroyDescriptorSetLayout(mDevice, setLayout, VKALLOC); - } - auto& arenas = iter->second.descriptorSetArenas; - assert_invariant(mDescriptorArenasCount >= arenas[0].size()); - mDescriptorArenasCount -= arenas[0].size(); - for (auto& arena : arenas) { - vkFreeDescriptorSets(mDevice, mDescriptorPool, arena.size(), arena.data()); - } - iter = mPipelineLayouts.erase(iter); - } else { - ++iter; - } - } - - // If there are no descriptors from any extinct pool that are still in use, we can safely - // destroy the extinct pools, which implicitly frees their associated descriptor sets. - bool canPurgeExtinctPools = true; - for (auto& bundle : mExtinctDescriptorBundles) { - if (bundle.lastUsed + VK_MAX_PIPELINE_AGE >= mCurrentTime) { - canPurgeExtinctPools = false; - break; - } - } - if (canPurgeExtinctPools) { - for (VkDescriptorPool pool : mExtinctDescriptorPools) { - vkDestroyDescriptorPool(mDevice, pool, VKALLOC); - } - mExtinctDescriptorPools.clear(); - mExtinctDescriptorBundles.clear(); - } -} - -VkDescriptorPool VulkanPipelineCache::createDescriptorPool(uint32_t size) const { - VkDescriptorPoolSize poolSizes[DESCRIPTOR_TYPE_COUNT] = {}; - VkDescriptorPoolCreateInfo poolInfo { - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, - .pNext = nullptr, - .flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, - .maxSets = size * DESCRIPTOR_TYPE_COUNT, - .poolSizeCount = DESCRIPTOR_TYPE_COUNT, - .pPoolSizes = poolSizes - }; - poolSizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - poolSizes[0].descriptorCount = poolInfo.maxSets * UBUFFER_BINDING_COUNT; - poolSizes[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - poolSizes[1].descriptorCount = poolInfo.maxSets * SAMPLER_BINDING_COUNT; - poolSizes[2].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT; - poolSizes[2].descriptorCount = poolInfo.maxSets * TARGET_BINDING_COUNT; - - VkDescriptorPool pool; - const UTILS_UNUSED VkResult result = vkCreateDescriptorPool(mDevice, &poolInfo, VKALLOC, &pool); - assert_invariant(result == VK_SUCCESS); - return pool; -} - -void VulkanPipelineCache::destroyLayoutsAndDescriptors() noexcept { - // Our current descriptor set strategy can cause the # of descriptor sets to explode in certain - // situations, so it's interesting to report the number that get stuffed into the cache. - #ifndef NDEBUG - utils::slog.d << "Destroying " << mDescriptorSets.size() << " bundles of descriptor sets." - << utils::io::endl; - #endif - - mDescriptorSets.clear(); - - // Our current layout bundle strategy can cause the # of layout bundles to explode in certain - // situations, so it's interesting to report the number that get stuffed into the cache. - #ifndef NDEBUG - utils::slog.d << "Destroying " << mPipelineLayouts.size() << " pipeline layouts." - << utils::io::endl; - #endif - - for (auto& iter : mPipelineLayouts) { - vkDestroyPipelineLayout(mDevice, iter.second.handle, VKALLOC); - for (auto setLayout : iter.second.descriptorSetLayouts) { - vkDestroyDescriptorSetLayout(mDevice, setLayout, VKALLOC); - } - // There is no need to free descriptor sets individually since destroying the VkDescriptorPool - // implicitly frees them. - } - mPipelineLayouts.clear(); - vkDestroyDescriptorPool(mDevice, mDescriptorPool, VKALLOC); - mDescriptorPool = VK_NULL_HANDLE; - - for (VkDescriptorPool pool : mExtinctDescriptorPools) { - vkDestroyDescriptorPool(mDevice, pool, VKALLOC); - } - mExtinctDescriptorPools.clear(); - mExtinctDescriptorBundles.clear(); - - mBoundDescriptor = {}; -} - -void VulkanPipelineCache::growDescriptorPool() noexcept { - // We need to destroy the old VkDescriptorPool, but we can't do so immediately because many - // of its descriptors are still in use. So, stash it in an "extinct" list. - mExtinctDescriptorPools.push_back(mDescriptorPool); - - // Create the new VkDescriptorPool, twice as big as the old one. - mDescriptorPoolSize *= 2; - mDescriptorPool = createDescriptorPool(mDescriptorPoolSize); - - // Clear out all unused descriptor sets in the arena so they don't get reclaimed. There is no - // need to free them individually since the old VkDescriptorPool will be destroyed. - for (auto iter = mPipelineLayouts.begin(); iter != mPipelineLayouts.end(); ++iter) { - for (auto& arena : iter.value().descriptorSetArenas) { - arena.clear(); - } - } - mDescriptorArenasCount = 0; - - // Move all in-use descriptors from the primary cache into an "extinct" list, so that they will - // later be destroyed rather than reclaimed. - using DescIterator = decltype(mDescriptorSets)::iterator; - for (DescIterator iter = mDescriptorSets.begin(); iter != mDescriptorSets.end(); ++iter) { - mExtinctDescriptorBundles.push_back(iter.value()); - } - mDescriptorSets.clear(); -} - -size_t VulkanPipelineCache::PipelineLayoutKeyHashFn::operator()( - const PipelineLayoutKey& key) const { - std::hash hasher; - auto h0 = hasher(key.getBitsAt(0)); - auto h1 = hasher(key.getBitsAt(1)); - return h0 ^ (h1 << 1); -} - -bool VulkanPipelineCache::PipelineLayoutKeyEqual::operator()(const PipelineLayoutKey& k1, - const PipelineLayoutKey& k2) const { - return k1 == k2; + // Any pipeline older than FVK_MAX_COMMAND_BUFFERS can be safely destroyed. + using ConstPipeIterator = decltype(mPipelines)::const_iterator; + for (ConstPipeIterator iter = mPipelines.begin(); iter != mPipelines.end();) { + const PipelineCacheEntry& cacheEntry = iter.value(); + if (cacheEntry.lastUsed + FVK_MAX_PIPELINE_AGE < mCurrentTime) { + vkDestroyPipeline(mDevice, iter->second.handle, VKALLOC); + iter = mPipelines.erase(iter); + } else { + ++iter; + } + } } bool VulkanPipelineCache::PipelineEqual::operator()(const PipelineKey& k1, @@ -848,48 +321,6 @@ bool VulkanPipelineCache::PipelineEqual::operator()(const PipelineKey& k1, return 0 == memcmp((const void*) &k1, (const void*) &k2, sizeof(k1)); } -bool VulkanPipelineCache::DescEqual::operator()(const DescriptorKey& k1, - const DescriptorKey& k2) const { - for (uint32_t i = 0; i < UBUFFER_BINDING_COUNT; i++) { - if (k1.uniformBuffers[i] != k2.uniformBuffers[i] || - k1.uniformBufferOffsets[i] != k2.uniformBufferOffsets[i] || - k1.uniformBufferSizes[i] != k2.uniformBufferSizes[i]) { - return false; - } - } - for (uint32_t i = 0; i < SAMPLER_BINDING_COUNT; i++) { - if (k1.samplers[i].sampler != k2.samplers[i].sampler || - k1.samplers[i].imageView != k2.samplers[i].imageView || - k1.samplers[i].imageLayout != k2.samplers[i].imageLayout) { - return false; - } - } - for (uint32_t i = 0; i < TARGET_BINDING_COUNT; i++) { - if (k1.inputAttachments[i].imageView != k2.inputAttachments[i].imageView || - k1.inputAttachments[i].imageLayout != k2.inputAttachments[i].imageLayout) { - return false; - } - } - return true; -} - -static VulkanPipelineCache::RasterState createDefaultRasterState() { - return VulkanPipelineCache::RasterState { - .cullMode = VK_CULL_MODE_NONE, - .frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE, - .depthBiasEnable = VK_FALSE, - .blendEnable = VK_FALSE, - .depthWriteEnable = VK_TRUE, - .alphaToCoverageEnable = true, - .colorWriteMask = 0xf, - .rasterizationSamples = VK_SAMPLE_COUNT_1_BIT, - .colorTargetCount = 1, - .depthCompareOp = SamplerCompareFunc::LE, - .depthBiasConstantFactor = 0.0f, - .depthBiasSlopeFactor = 0.0f, - }; -} - } // namespace filament::backend #pragma clang diagnostic pop diff --git a/filament/backend/src/vulkan/VulkanPipelineCache.h b/filament/backend/src/vulkan/VulkanPipelineCache.h index 607c07302c1..c0500fbb8be 100644 --- a/filament/backend/src/vulkan/VulkanPipelineCache.h +++ b/filament/backend/src/vulkan/VulkanPipelineCache.h @@ -17,6 +17,10 @@ #ifndef TNT_FILAMENT_BACKEND_VULKANPIPELINECACHE_H #define TNT_FILAMENT_BACKEND_VULKANPIPELINECACHE_H +#include "VulkanCommands.h" +#include "VulkanMemory.h" +#include "VulkanUtility.h" + #include #include @@ -28,19 +32,17 @@ #include #include +#include #include #include #include - -#include "VulkanCommands.h" - -VK_DEFINE_HANDLE(VmaAllocator) -VK_DEFINE_HANDLE(VmaAllocation) -VK_DEFINE_HANDLE(VmaPool) +#include namespace filament::backend { struct VulkanProgram; +struct VulkanBufferObject; +struct VulkanTexture; // VulkanPipelineCache manages a cache of descriptor sets and pipelines. // @@ -51,30 +53,14 @@ struct VulkanProgram; // - Assumes that viewport and scissor should be dynamic. (not baked into VkPipeline) // - Assumes that uniform buffers should be visible across all shader stages. // -class VulkanPipelineCache : public CommandBufferObserver { +class VulkanPipelineCache { public: VulkanPipelineCache(VulkanPipelineCache const&) = delete; VulkanPipelineCache& operator=(VulkanPipelineCache const&) = delete; - static constexpr uint32_t UBUFFER_BINDING_COUNT = Program::UNIFORM_BINDING_COUNT; - static constexpr uint32_t SAMPLER_BINDING_COUNT = MAX_SAMPLER_COUNT; - static constexpr uint32_t TARGET_BINDING_COUNT = MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT; static constexpr uint32_t SHADER_MODULE_COUNT = 2; static constexpr uint32_t VERTEX_ATTRIBUTE_COUNT = MAX_VERTEX_ATTRIBUTE_COUNT; - // Three descriptor set layouts: uniforms, combined image samplers, and input attachments. - static constexpr uint32_t DESCRIPTOR_TYPE_COUNT = 3; - static constexpr uint32_t INITIAL_DESCRIPTOR_SET_POOL_SIZE = 512; - - // The VertexArray POD is an array of buffer targets and an array of attributes that refer to - // those targets. It does not include any references to actual buffers, so you can think of it - // as a vertex assembler configuration. For simplicity it contains fixed-size arrays and does - // not store sizes; all unused entries are simply zeroed out. - struct VertexArray { - VkVertexInputAttributeDescription attributes[VERTEX_ATTRIBUTE_COUNT]; - VkVertexInputBindingDescription buffers[VERTEX_ATTRIBUTE_COUNT]; - }; - // The ProgramBundle contains weak references to the compiled vertex and fragment shaders. struct ProgramBundle { VkShaderModule vertex; @@ -82,9 +68,6 @@ class VulkanPipelineCache : public CommandBufferObserver { VkSpecializationInfo* specializationInfos = nullptr; }; - using UsageFlags = utils::bitset128; - static UsageFlags getUsageFlags(uint16_t binding, ShaderStageFlags stages, UsageFlags src = {}); - #pragma clang diagnostic push #pragma clang diagnostic warning "-Wpadded" @@ -105,7 +88,8 @@ class VulkanPipelineCache : public CommandBufferObserver { VkBlendFactor srcAlphaBlendFactor : 5; VkBlendFactor dstAlphaBlendFactor : 5; VkColorComponentFlags colorWriteMask : 4; - uint8_t rasterizationSamples; // offset = 4 bytes + uint8_t rasterizationSamples : 4;// offset = 4 bytes + uint8_t depthClamp : 4; uint8_t colorTargetCount; // offset = 5 bytes BlendEquation colorBlendOp : 4; // offset = 6 bytes BlendEquation alphaBlendOp : 4; @@ -127,81 +111,44 @@ class VulkanPipelineCache : public CommandBufferObserver { // Upon construction, the pipeCache initializes some internal state but does not make any Vulkan // calls. On destruction it will free any cached Vulkan objects that haven't already been freed. - VulkanPipelineCache(); + VulkanPipelineCache(VkDevice device, VmaAllocator allocator); ~VulkanPipelineCache(); - void setDevice(VkDevice device, VmaAllocator allocator); - - // Clients should initialize their copy of the raster state using this method. They can then - // mutate their copy and pass it back through bindRasterState(). - const RasterState& getDefaultRasterState() const { return mDefaultRasterState; } - // Creates new descriptor sets if necessary and binds them using vkCmdBindDescriptorSets. - // Returns false if descriptor set allocation fails. - bool bindDescriptors(VkCommandBuffer cmdbuffer) noexcept; + void bindLayout(VkPipelineLayout layout) noexcept; // Creates a new pipeline if necessary and binds it using vkCmdBindPipeline. - // Returns false if an error occurred. - bool bindPipeline(VkCommandBuffer cmdbuffer) noexcept; - - // Sets up a new scissor rectangle if it has been dirtied. - void bindScissor(VkCommandBuffer cmdbuffer, VkRect2D scissor) noexcept; + void bindPipeline(VulkanCommandBuffer* commands); // Each of the following methods are fast and do not make Vulkan calls. - void bindProgram(const VulkanProgram& program) noexcept; + void bindProgram(fvkmemory::resource_ptr program) noexcept; void bindRasterState(const RasterState& rasterState) noexcept; void bindRenderPass(VkRenderPass renderPass, int subpassIndex) noexcept; void bindPrimitiveTopology(VkPrimitiveTopology topology) noexcept; - void bindUniformBuffer(uint32_t bindingIndex, VkBuffer uniformBuffer, - VkDeviceSize offset = 0, VkDeviceSize size = VK_WHOLE_SIZE) noexcept; - void bindSamplers(VkDescriptorImageInfo samplers[SAMPLER_BINDING_COUNT], UsageFlags flags) noexcept; - void bindInputAttachment(uint32_t bindingIndex, VkDescriptorImageInfo imageInfo) noexcept; - void bindVertexArray(const VertexArray& varray) noexcept; - - // Gets the current UBO at the given slot, useful for push / pop. - UniformBufferBinding getUniformBufferBinding(uint32_t bindingIndex) const noexcept; - - // Checks if the given uniform is bound to any slot, and if so binds "null" to that slot. - // Also invalidates all cached descriptors that refer to the given buffer. - // This is only necessary when the client knows that the UBO is about to be destroyed. - void unbindUniformBuffer(VkBuffer uniformBuffer) noexcept; - // Checks if an image view is bound to any sampler, and if so resets that particular slot. - // Also invalidates all cached descriptors that refer to the given image view. - // This is only necessary when the client knows that a texture is about to be destroyed. - void unbindImageView(VkImageView imageView) noexcept; - - // NOTE: In theory we should proffer "unbindSampler" but in practice we never destroy samplers. + void bindVertexArray(VkVertexInputAttributeDescription const* attribDesc, + VkVertexInputBindingDescription const* bufferDesc, uint8_t count); // Destroys all managed Vulkan objects. This should be called before changing the VkDevice. - void destroyCache() noexcept; - - // vkCmdBindPipeline and vkCmdBindDescriptorSets establish bindings to a specific command - // buffer; they are not global to the device. Therefore we need to be notified when a - // new command buffer becomes active. - void onCommandBuffer(const VulkanCommandBuffer& cmdbuffer) override; - - // Injects a dummy texture that can be used to clear out old descriptor sets. - void setDummyTexture(VkImageView imageView) { - mDummyTargetInfo.imageView = imageView; + void terminate() noexcept; + + static VkPrimitiveTopology getPrimitiveTopology(PrimitiveType pt) noexcept { + switch (pt) { + case PrimitiveType::POINTS: + return VK_PRIMITIVE_TOPOLOGY_POINT_LIST; + case PrimitiveType::LINES: + return VK_PRIMITIVE_TOPOLOGY_LINE_LIST; + case PrimitiveType::LINE_STRIP: + return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP; + case PrimitiveType::TRIANGLES: + return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + case PrimitiveType::TRIANGLE_STRIP: + return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; + } } -private: - - // PIPELINE LAYOUT CACHE KEY - // ------------------------- - - using PipelineLayoutKey = utils::bitset128; - - static_assert(PipelineLayoutKey::BIT_COUNT >= 2 * MAX_SAMPLER_COUNT); - - struct PipelineLayoutKeyHashFn { - size_t operator()(const PipelineLayoutKey& key) const; - }; - - struct PipelineLayoutKeyEqual { - bool operator()(const PipelineLayoutKey& k1, const PipelineLayoutKey& k2) const; - }; + void gc() noexcept; +private: // PIPELINE CACHE KEY // ------------------ @@ -254,10 +201,10 @@ class VulkanPipelineCache : public CommandBufferObserver { VertexInputBindingDescription vertexBuffers[VERTEX_ATTRIBUTE_COUNT]; // 128 : 156 RasterState rasterState; // 16 : 284 uint32_t padding; // 4 : 300 - PipelineLayoutKey layout; // 16 : 304 + VkPipelineLayout layout; // 8 : 304 }; - static_assert(sizeof(PipelineKey) == 320, "PipelineKey must not have implicit padding."); + static_assert(sizeof(PipelineKey) == 312, "PipelineKey must not have implicit padding."); using PipelineHashFn = utils::hash::MurmurHashFn; @@ -265,52 +212,6 @@ class VulkanPipelineCache : public CommandBufferObserver { bool operator()(const PipelineKey& k1, const PipelineKey& k2) const; }; - // DESCRIPTOR SET CACHE KEY - // ------------------------ - - // Equivalent to VkDescriptorImageInfo but with explicit padding. - struct DescriptorImageInfo { - DescriptorImageInfo& operator=(const VkDescriptorImageInfo& that) { - sampler = that.sampler; - imageView = that.imageView; - imageLayout = that.imageLayout; - padding = 0; - return *this; - } - operator VkDescriptorImageInfo() const { return { sampler, imageView, imageLayout }; } - - // TODO: replace the 64-bit sampler handle with `uint32_t samplerParams` and remove the - // padding field. This is possible if we have access to the VulkanSamplerCache. - VkSampler sampler; - - VkImageView imageView; - VkImageLayout imageLayout; - uint32_t padding; - }; - - // We store size with 32 bits, so our "WHOLE" sentinel is different from Vk. - static const uint32_t WHOLE_SIZE = 0xffffffffu; - - // Represents all the Vulkan state that comprises a bound descriptor set. - struct DescriptorKey { - VkBuffer uniformBuffers[UBUFFER_BINDING_COUNT]; // 80 0 - DescriptorImageInfo samplers[SAMPLER_BINDING_COUNT]; // 1488 80 - DescriptorImageInfo inputAttachments[TARGET_BINDING_COUNT]; // 192 1568 - uint32_t uniformBufferOffsets[UBUFFER_BINDING_COUNT]; // 40 1760 - uint32_t uniformBufferSizes[UBUFFER_BINDING_COUNT]; // 40 1080 - }; - static_assert(offsetof(DescriptorKey, samplers) == 80); - static_assert(offsetof(DescriptorKey, inputAttachments) == 1568); - static_assert(offsetof(DescriptorKey, uniformBufferOffsets) == 1760); - static_assert(offsetof(DescriptorKey, uniformBufferSizes) == 1800); - static_assert(sizeof(DescriptorKey) == 1840, "DescriptorKey must not have implicit padding."); - - using DescHashFn = utils::hash::MurmurHashFn; - - struct DescEqual { - bool operator()(const DescriptorKey& k1, const DescriptorKey& k2) const; - }; - #pragma clang diagnostic pop // CACHE ENTRY STRUCTS @@ -318,18 +219,11 @@ class VulkanPipelineCache : public CommandBufferObserver { // The timestamp associated with a given cache entry represents time as a count of flush // events since the cache was constructed. If any cache entry was most recently used over - // VK_MAX_PIPELINE_AGE flushes in the past, then we can be sure that it is no longer + // FVK_MAX_PIPELINE_AGE flushes in the past, then we can be sure that it is no longer // being used by the GPU, and is therefore safe to destroy or reclaim. using Timestamp = uint64_t; Timestamp mCurrentTime = 0; - // The descriptor set cache entry is a group of descriptor sets that are bound simultaneously. - struct DescriptorCacheEntry { - std::array handles; - Timestamp lastUsed; - PipelineLayoutKey pipelineLayout; - }; - struct PipelineCacheEntry { VkPipeline handle; Timestamp lastUsed; @@ -338,94 +232,33 @@ class VulkanPipelineCache : public CommandBufferObserver { struct PipelineLayoutCacheEntry { VkPipelineLayout handle; Timestamp lastUsed; - - std::array descriptorSetLayouts; - - // Each pipeline layout has 3 arenas of unused descriptors (one for each binding type). - // - // The difference between the "arenas" and the "pool" are as follows. - // - // - The "pool" is a single, centralized factory for all descriptors (VkDescriptorPool). - // - // - Each "arena" is a set of unused (but alive) descriptors that can only be used with a - // specific pipeline layout and a specific binding type. We manually manage each arena. - // The arenas are created in an empty state, and they are gradually populated as new - // descriptors are reclaimed over time. This is quite different from the pool, which is - // given a fixed size when it is constructed. - // - std::array, DESCRIPTOR_TYPE_COUNT> descriptorSetArenas; }; // CACHE CONTAINERS // ---------------- - using PipelineLayoutMap = tsl::robin_map; using PipelineMap = tsl::robin_map; - using DescriptorMap = tsl::robin_map; - PipelineLayoutMap mPipelineLayouts; +private: + + PipelineCacheEntry* getOrCreatePipeline() noexcept; + PipelineMap mPipelines; - DescriptorMap mDescriptorSets; // These helpers all return unstable pointers that should not be stored. - DescriptorCacheEntry* createDescriptorSets() noexcept; PipelineCacheEntry* createPipeline() noexcept; PipelineLayoutCacheEntry* getOrCreatePipelineLayout() noexcept; - // Misc helper methods. - void destroyLayoutsAndDescriptors() noexcept; - VkDescriptorPool createDescriptorPool(uint32_t size) const; - void growDescriptorPool() noexcept; - // Immutable state. VkDevice mDevice = VK_NULL_HANDLE; VmaAllocator mAllocator = VK_NULL_HANDLE; - const RasterState mDefaultRasterState; // Current requirements for the pipeline layout, pipeline, and descriptor sets. PipelineKey mPipelineRequirements = {}; - DescriptorKey mDescriptorRequirements = {}; - VkSpecializationInfo* mSpecializationRequirements = {}; // Current bindings for the pipeline and descriptor sets. PipelineKey mBoundPipeline = {}; - DescriptorKey mBoundDescriptor = {}; - - // Current state for scissoring. - VkRect2D mCurrentScissor = {}; - - // The descriptor set pool starts out with a decent number of descriptor sets. The cache can - // grow the pool by re-creating it with a larger size. See growDescriptorPool(). - VkDescriptorPool mDescriptorPool; - - // This describes the number of descriptor sets in mDescriptorPool. Note that this needs to be - // multiplied by DESCRIPTOR_TYPE_COUNT to get the actual number of descriptor sets. Also note - // that the number of low-level "descriptors" (not descriptor *sets*) is actually much more than - // this size. It can be computed only by factoring in UBUFFER_BINDING_COUNT etc. - uint32_t mDescriptorPoolSize = INITIAL_DESCRIPTOR_SET_POOL_SIZE; - - // To get the actual number of descriptor sets that have been allocated from the pool, - // take the sum of mDescriptorArenasCount (these are inactive descriptor sets) and the - // number of entries in the mDescriptorPool map (active descriptor sets). Multiply the result by - // DESCRIPTOR_TYPE_COUNT. - uint32_t mDescriptorArenasCount = 0; - - // After a growth event (i.e. when the VkDescriptorPool is replaced with a bigger version), all - // currently used descriptors are moved into the "extinct" sets so that they can be safely - // destroyed a few frames later. - std::vector mExtinctDescriptorPools; - std::vector mExtinctDescriptorBundles; - - VkDescriptorBufferInfo mDummyBufferInfo = {}; - VkWriteDescriptorSet mDummyBufferWriteInfo = {}; - VkDescriptorImageInfo mDummyTargetInfo = {}; - VkWriteDescriptorSet mDummyTargetWriteInfo = {}; - - VkBuffer mDummyBuffer; - VmaAllocation mDummyMemory; }; } // namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanPlatform.cpp b/filament/backend/src/vulkan/VulkanPlatform.cpp deleted file mode 100644 index eb031f1ef04..00000000000 --- a/filament/backend/src/vulkan/VulkanPlatform.cpp +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -namespace filament::backend { - -VulkanPlatform::~VulkanPlatform() = default; - -} // namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanReadPixels.cpp b/filament/backend/src/vulkan/VulkanReadPixels.cpp new file mode 100644 index 00000000000..48df6c72227 --- /dev/null +++ b/filament/backend/src/vulkan/VulkanReadPixels.cpp @@ -0,0 +1,344 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "VulkanReadPixels.h" + +#include "DataReshaper.h" +#include "VulkanCommands.h" +#include "VulkanHandles.h" +#include "VulkanImageUtility.h" +#include "VulkanTexture.h" + +#include + +using namespace bluevk; + +namespace filament::backend { + +using TaskHandler = VulkanReadPixels::TaskHandler; +using WorkloadFunc = TaskHandler::WorkloadFunc; +using OnCompleteFunc = TaskHandler::OnCompleteFunc; + +TaskHandler::TaskHandler() + : mShouldStop(false), + mThread(&TaskHandler::loop, this) {} + +void TaskHandler::post(WorkloadFunc&& workload, OnCompleteFunc&& oncomplete) { + assert_invariant(!mShouldStop); + { + std::unique_lock lock(mTaskQueueMutex); + mTaskQueue.push(std::make_pair(std::move(workload), std::move(oncomplete))); + } + mHasTaskCondition.notify_one(); +} + +void TaskHandler::drain() { + assert_invariant(!mShouldStop); + + std::mutex syncPointMutex; + std::condition_variable syncCondition; + bool done = false; + post([] {}, + [&syncPointMutex, &syncCondition, &done] { + { + std::unique_lock lock(syncPointMutex); + done = true; + syncCondition.notify_one(); + } + }); + + std::unique_lock lock(syncPointMutex); + syncCondition.wait(lock, [&done] { return done; }); +} + +void TaskHandler::shutdown() { + { + std::unique_lock lock(mTaskQueueMutex); + mShouldStop = true; + } + mHasTaskCondition.notify_one(); + mThread.join(); + FILAMENT_CHECK_POSTCONDITION(mTaskQueue.empty()) + << "ReadPixels handler has tasks in the queue after shutdown"; +} + +void TaskHandler::loop() { + while (true) { + std::unique_lock lock(mTaskQueueMutex); + mHasTaskCondition.wait(lock, [this] { return !mTaskQueue.empty() || mShouldStop; }); + if (mShouldStop) { + break; + } + auto [workload, oncomplete] = mTaskQueue.front(); + mTaskQueue.pop(); + lock.unlock(); + workload(); + oncomplete(); + } + + // Clean-up: we still need to call oncomplete for clients to do clean-up. + while (true) { + std::unique_lock lock(mTaskQueueMutex); + if (mTaskQueue.empty()) { + break; + } + auto [workload, oncomplete] = mTaskQueue.front(); + mTaskQueue.pop(); + lock.unlock(); + oncomplete(); + } +} + +void VulkanReadPixels::terminate() noexcept { + assert_invariant(mDevice != VK_NULL_HANDLE); + if (mCommandPool == VK_NULL_HANDLE) { + return; + } + vkDestroyCommandPool(mDevice, mCommandPool, VKALLOC); + mDevice = VK_NULL_HANDLE; + + mTaskHandler->shutdown(); + mTaskHandler.reset(); +} + +VulkanReadPixels::VulkanReadPixels(VkDevice device) + : mDevice(device) {} + +void VulkanReadPixels::run(fvkmemory::resource_ptr srcTarget, uint32_t const x, + uint32_t const y, uint32_t const width, uint32_t const height, + uint32_t const graphicsQueueFamilyIndex, PixelBufferDescriptor&& pbd, + SelecteMemoryFunction const& selectMemoryFunc, + OnReadCompleteFunction const& readCompleteFunc) { + assert_invariant(mDevice != VK_NULL_HANDLE); + + VkDevice& device = mDevice; + + if (mCommandPool == VK_NULL_HANDLE) { + // Create a command pool if one has not been created. + VkCommandPoolCreateInfo createInfo = { + .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, + .flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT + | VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, + .queueFamilyIndex = graphicsQueueFamilyIndex, + }; + vkCreateCommandPool(device, &createInfo, VKALLOC, &mCommandPool); + } + + // We don't create a task handler (start a thread) unless readPixels is called. + if (!mTaskHandler) { + mTaskHandler = std::make_unique(); + } + + VkCommandPool& cmdpool = mCommandPool; + + fvkmemory::resource_ptr srcTexture = srcTarget->getColor0().texture; + assert_invariant(srcTexture); + VkFormat const srcFormat = srcTexture->getVkFormat(); + bool const swizzle + = srcFormat == VK_FORMAT_B8G8R8A8_UNORM || srcFormat == VK_FORMAT_B8G8R8A8_SRGB; + + // Create a host visible, linearly tiled image as a staging area. + VkImageCreateInfo const imageInfo{ + .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, + .imageType = VK_IMAGE_TYPE_2D, + .format = srcFormat, + .extent = {width, height, 1}, + .mipLevels = 1, + .arrayLayers = 1, + .samples = VK_SAMPLE_COUNT_1_BIT, + .tiling = VK_IMAGE_TILING_LINEAR, + .usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT, + .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, + }; + + VkImage stagingImage; + vkCreateImage(device, &imageInfo, VKALLOC, &stagingImage); + +#if FVK_ENABLED(FVK_DEBUG_READ_PIXELS) + FVK_LOGD << "readPixels created image=" << stagingImage + << " to copy from image=" << srcTexture->getVkImage() + << " src-layout=" << srcTexture->getLayout(0, 0) << utils::io::endl; +#endif + + VkMemoryRequirements memReqs; + VkDeviceMemory stagingMemory; + vkGetImageMemoryRequirements(device, stagingImage, &memReqs); + + uint32_t memoryTypeIndex = selectMemoryFunc(memReqs.memoryTypeBits, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT + | VK_MEMORY_PROPERTY_HOST_CACHED_BIT); + + // If VK_MEMORY_PROPERTY_HOST_CACHED_BIT is not supported, we try only + // HOST_VISIBLE+HOST_COHERENT. HOST_CACHED helps a lot with readpixels performance. + if (memoryTypeIndex >= VK_MAX_MEMORY_TYPES) { + memoryTypeIndex = selectMemoryFunc(memReqs.memoryTypeBits, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + FVK_LOGW + << "readPixels is slow because VK_MEMORY_PROPERTY_HOST_CACHED_BIT is not available" + << utils::io::endl; + } + + FILAMENT_CHECK_POSTCONDITION(memoryTypeIndex < VK_MAX_MEMORY_TYPES) + << "VulkanReadPixels: unable to find a memory type that meets requirements."; + + VkMemoryAllocateInfo const allocInfo = { + .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, + .allocationSize = memReqs.size, + .memoryTypeIndex = memoryTypeIndex, + }; + + vkAllocateMemory(device, &allocInfo, VKALLOC, &stagingMemory); + vkBindImageMemory(device, stagingImage, stagingMemory, 0); + + VkCommandBuffer cmdbuffer; + VkCommandBufferAllocateInfo const allocateInfo{ + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, + .commandPool = cmdpool, + .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, + .commandBufferCount = 1, + }; + vkAllocateCommandBuffers(device, &allocateInfo, &cmdbuffer); + + VkCommandBufferBeginInfo const binfo{ + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, + .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, + }; + vkBeginCommandBuffer(cmdbuffer, &binfo); + + imgutil::transitionLayout(cmdbuffer, { + .image = stagingImage, + .oldLayout = VulkanLayout::UNDEFINED, + .newLayout = VulkanLayout::TRANSFER_DST, + .subresources = { + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + .baseMipLevel = 0, + .levelCount = 1, + .baseArrayLayer = 0, + .layerCount = 1, + }, + }); + + VulkanAttachment const srcAttachment = srcTarget->getColor0(); + VkImageSubresourceRange const srcRange = srcAttachment.getSubresourceRange(); + srcTexture->transitionLayout(cmdbuffer, srcRange, VulkanLayout::TRANSFER_SRC); + + VkImageCopy const imageCopyRegion = { + .srcSubresource = { + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + .mipLevel = srcAttachment.level, + .baseArrayLayer = srcAttachment.layer, + .layerCount = 1, + }, + .srcOffset = { + .x = (int32_t)x, + .y = (int32_t)(srcTarget->getExtent().height - (height + y)), + }, + .dstSubresource = { + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + .layerCount = 1, + }, + .extent = { + .width = width, + .height = height, + .depth = 1, + }, + }; + + // Perform the copy into the staging area. At this point we know that the src + // layout is TRANSFER_SRC_OPTIMAL and the staging area is GENERAL. + UTILS_UNUSED_IN_RELEASE VkExtent2D srcExtent = srcAttachment.getExtent2D(); + assert_invariant(imageCopyRegion.srcOffset.x + imageCopyRegion.extent.width <= srcExtent.width); + assert_invariant( + imageCopyRegion.srcOffset.y + imageCopyRegion.extent.height <= srcExtent.height); + + vkCmdCopyImage(cmdbuffer, srcAttachment.getImage(), + imgutil::getVkLayout(VulkanLayout::TRANSFER_SRC), stagingImage, + imgutil::getVkLayout(VulkanLayout::TRANSFER_DST), 1, &imageCopyRegion); + + // Restore the source image layout. + srcTexture->transitionLayout(cmdbuffer, srcRange, srcTexture->getDefaultLayout()); + + vkEndCommandBuffer(cmdbuffer); + + VkQueue queue; + vkGetDeviceQueue(device, graphicsQueueFamilyIndex, 0, &queue); + VkFence readCompleteFence; + VkFenceCreateInfo const fenceCreateInfo{ + .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, + }; + vkCreateFence(device, &fenceCreateInfo, VKALLOC, &readCompleteFence); + VkSubmitInfo const submitInfo{ + .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, + .waitSemaphoreCount = 0, + .pWaitSemaphores = VK_NULL_HANDLE, + .pWaitDstStageMask = VK_NULL_HANDLE, + .commandBufferCount = 1, + .pCommandBuffers = &cmdbuffer, + .signalSemaphoreCount = 0, + .pSignalSemaphores = VK_NULL_HANDLE, + }; + vkQueueSubmit(queue, 1, &submitInfo, readCompleteFence); + + auto* const pUserBuffer = new PixelBufferDescriptor(std::move(pbd)); + auto cleanPbdFunc = [pUserBuffer, readCompleteFunc]() { + PixelBufferDescriptor& p = *pUserBuffer; + readCompleteFunc(std::move(p)); + delete pUserBuffer; + }; + auto waitFenceFunc = [device, width, height, swizzle, srcFormat, stagingImage, stagingMemory, + cmdpool, cmdbuffer, pUserBuffer, + fence = readCompleteFence]() mutable { + VkResult status = vkWaitForFences(device, 1, &fence, VK_TRUE, UINT64_MAX); + // Fence hasn't been reached. Try waiting again. + if (status != VK_SUCCESS) { + FVK_LOGE << "Failed to wait for readPixels fence" << utils::io::endl; + return; + } + + PixelBufferDescriptor& p = *pUserBuffer; + VkImageSubresource subResource{.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT}; + VkSubresourceLayout subResourceLayout; + vkGetImageSubresourceLayout(device, stagingImage, &subResource, &subResourceLayout); + + // Map image memory so that we can start copying from it. + uint8_t const* srcPixels; + vkMapMemory(device, stagingMemory, 0, VK_WHOLE_SIZE, 0, (void**) &srcPixels); + srcPixels += subResourceLayout.offset; + + if (!DataReshaper::reshapeImage(&p, getComponentType(srcFormat), + getComponentCount(srcFormat), srcPixels, + static_cast(subResourceLayout.rowPitch), static_cast(width), + static_cast(height), swizzle)) { + FVK_LOGE << "Unsupported PixelDataFormat or PixelDataType" << utils::io::endl; + } + + vkUnmapMemory(device, stagingMemory); + vkDestroyImage(device, stagingImage, VKALLOC); + vkFreeMemory(device, stagingMemory, VKALLOC); + vkDestroyFence(device, fence, VKALLOC); + vkFreeCommandBuffers(device, cmdpool, 1, &cmdbuffer); + }; + mTaskHandler->post(std::move(waitFenceFunc), std::move(cleanPbdFunc)); +} + +void VulkanReadPixels::runUntilComplete() noexcept { + if (!mTaskHandler) { + return; + } + mTaskHandler->drain(); +} + +}// namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanReadPixels.h b/filament/backend/src/vulkan/VulkanReadPixels.h new file mode 100644 index 00000000000..23699537d31 --- /dev/null +++ b/filament/backend/src/vulkan/VulkanReadPixels.h @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_VULKANREADPIXELS_H +#define TNT_FILAMENT_BACKEND_VULKANREADPIXELS_H + +#include "vulkan/memory/ResourcePointer.h" +#include "private/backend/Driver.h" + +#include +#include + +#include +#include +#include +#include +#include + +namespace filament::backend { + +struct VulkanRenderTarget; + +class VulkanReadPixels { +public: + // A helper class that runs tasks on a separate thread. + class TaskHandler { + public: + using WorkloadFunc = std::function; + using OnCompleteFunc = std::function; + using Task = std::pair; + + TaskHandler(); + + // In addition to the workload that the handler will call, client must also provide an + // oncomplete function that the handler will call either when the workload completes or when + // the handler is shutdown (so that we can clean-up even when the task was not carried out). + void post(WorkloadFunc&& workload, OnCompleteFunc&& oncomplete); + + // This will block until all of the tasks are done. + void drain(); + + // This will quit without running the workloads, but oncomplete callbacks will still be + // called. + void shutdown(); + + private: + void loop(); + + bool mShouldStop; + std::condition_variable mHasTaskCondition; + std::mutex mTaskQueueMutex; + std::queue mTaskQueue; + std::thread mThread; + }; + + using OnReadCompleteFunction = std::function; + using SelecteMemoryFunction = std::function; + + explicit VulkanReadPixels(VkDevice device); + + void terminate() noexcept; + + void run(fvkmemory::resource_ptr srcTarget, uint32_t x, uint32_t y, + uint32_t width, uint32_t height, uint32_t graphicsQueueFamilyIndex, + PixelBufferDescriptor&& pbd, SelecteMemoryFunction const& selectMemoryFunc, + OnReadCompleteFunction const& readCompleteFunc); + + // This method will block until all of the in-flight requests are complete. + void runUntilComplete() noexcept; + +private: + VkDevice mDevice = VK_NULL_HANDLE; + VkCommandPool mCommandPool = VK_NULL_HANDLE; + std::unique_ptr mTaskHandler; +}; + +}// namespace filament::backend + +#endif// TNT_FILAMENT_BACKEND_VULKANREADPIXELS_H diff --git a/filament/backend/src/vulkan/VulkanSamplerCache.cpp b/filament/backend/src/vulkan/VulkanSamplerCache.cpp index b895e195bd0..75a2578e75e 100644 --- a/filament/backend/src/vulkan/VulkanSamplerCache.cpp +++ b/filament/backend/src/vulkan/VulkanSamplerCache.cpp @@ -87,8 +87,7 @@ constexpr inline float getMaxLod(SamplerMinFilter filter) noexcept { case SamplerMinFilter::LINEAR_MIPMAP_NEAREST: case SamplerMinFilter::NEAREST_MIPMAP_LINEAR: case SamplerMinFilter::LINEAR_MIPMAP_LINEAR: - // Assuming our maximum texture size is 4k, we'll never need more than 12 miplevels. - return 12.0f; + return VK_LOD_CLAMP_NONE; } } @@ -96,10 +95,11 @@ constexpr inline VkBool32 getCompareEnable(SamplerCompareMode mode) noexcept { return mode == SamplerCompareMode::NONE ? VK_FALSE : VK_TRUE; } -VulkanSamplerCache::VulkanSamplerCache(VulkanContext& context) : mContext(context) {} +VulkanSamplerCache::VulkanSamplerCache(VkDevice device) + : mDevice(device) {} VkSampler VulkanSamplerCache::getSampler(SamplerParams params) noexcept { - auto iter = mCache.find(params.u); + auto iter = mCache.find(params); if (UTILS_LIKELY(iter != mCache.end())) { return iter->second; } @@ -121,15 +121,16 @@ VkSampler VulkanSamplerCache::getSampler(SamplerParams params) noexcept { .unnormalizedCoordinates = VK_FALSE }; VkSampler sampler; - VkResult error = vkCreateSampler(mContext.device, &samplerInfo, VKALLOC, &sampler); - ASSERT_POSTCONDITION(!error, "Unable to create sampler."); - mCache.insert({params.u, sampler}); + VkResult result = vkCreateSampler(mDevice, &samplerInfo, VKALLOC, &sampler); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) << "Unable to create sampler." + << " error=" << static_cast(result); + mCache.insert({params, sampler}); return sampler; } -void VulkanSamplerCache::reset() noexcept { +void VulkanSamplerCache::terminate() noexcept { for (auto pair : mCache) { - vkDestroySampler(mContext.device, pair.second, VKALLOC); + vkDestroySampler(mDevice, pair.second, VKALLOC); } mCache.clear(); } diff --git a/filament/backend/src/vulkan/VulkanSamplerCache.h b/filament/backend/src/vulkan/VulkanSamplerCache.h index ee44425f9dd..cb5fe43ce4c 100644 --- a/filament/backend/src/vulkan/VulkanSamplerCache.h +++ b/filament/backend/src/vulkan/VulkanSamplerCache.h @@ -27,12 +27,12 @@ namespace filament::backend { // Simple manager for VkSampler objects. class VulkanSamplerCache { public: - explicit VulkanSamplerCache(VulkanContext&); + explicit VulkanSamplerCache(VkDevice device); VkSampler getSampler(SamplerParams params) noexcept; - void reset() noexcept; + void terminate() noexcept; private: - VulkanContext& mContext; - tsl::robin_map mCache; + VkDevice mDevice; + tsl::robin_map mCache; }; } // namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanStagePool.cpp b/filament/backend/src/vulkan/VulkanStagePool.cpp index cb4f8b641d8..cae1e85d257 100644 --- a/filament/backend/src/vulkan/VulkanStagePool.cpp +++ b/filament/backend/src/vulkan/VulkanStagePool.cpp @@ -16,22 +16,29 @@ #include "VulkanStagePool.h" +#include "VulkanCommands.h" #include "VulkanConstants.h" +#include "VulkanImageUtility.h" #include "VulkanMemory.h" #include "VulkanUtility.h" #include -static constexpr uint32_t TIME_BEFORE_EVICTION = VK_MAX_COMMAND_BUFFERS; +static constexpr uint32_t TIME_BEFORE_EVICTION = FVK_MAX_COMMAND_BUFFERS; namespace filament::backend { +VulkanStagePool::VulkanStagePool(VmaAllocator allocator, VulkanCommands* commands) + : mAllocator(allocator), + mCommands(commands) {} + VulkanStage const* VulkanStagePool::acquireStage(uint32_t numBytes) { // First check if a stage exists whose capacity is greater than or equal to the requested size. auto iter = mFreeStages.lower_bound(numBytes); if (iter != mFreeStages.end()) { auto stage = iter->second; mFreeStages.erase(iter); + stage->lastAccessed = mCurrentFrame; mUsedStages.insert(stage); return stage; } @@ -51,12 +58,12 @@ VulkanStage const* VulkanStagePool::acquireStage(uint32_t numBytes) { .usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT, }; VmaAllocationCreateInfo allocInfo { .usage = VMA_MEMORY_USAGE_CPU_ONLY }; - UTILS_UNUSED_IN_RELEASE VkResult result = vmaCreateBuffer(mContext.allocator, &bufferInfo, + UTILS_UNUSED_IN_RELEASE VkResult result = vmaCreateBuffer(mAllocator, &bufferInfo, &allocInfo, &stage->buffer, &stage->memory, nullptr); -#ifndef NDEBUG +#if FVK_ENABLED(FVK_DEBUG_STAGING_ALLOCATION) if (result != VK_SUCCESS) { - utils::slog.e << "Allocation error: " << result << utils::io::endl; + FVK_LOGE << "Allocation error: " << result << utils::io::endl; } #endif @@ -69,6 +76,7 @@ VulkanStageImage const* VulkanStagePool::acquireImage(PixelDataFormat format, Pi for (auto image : mFreeImages) { if (image->format == vkformat && image->width == width && image->height == height) { mFreeImages.erase(image); + image->lastAccessed = mCurrentFrame; mUsedImages.insert(image); return image; } @@ -100,15 +108,13 @@ VulkanStageImage const* VulkanStagePool::acquireImage(PixelDataFormat format, Pi .usage = VMA_MEMORY_USAGE_CPU_TO_GPU }; - const UTILS_UNUSED VkResult result = vmaCreateImage(mContext.allocator, &imageInfo, &allocInfo, + const UTILS_UNUSED VkResult result = vmaCreateImage(mAllocator, &imageInfo, &allocInfo, &image->image, &image->memory, nullptr); assert_invariant(result == VK_SUCCESS); - VkImageAspectFlags aspectFlags = isDepthFormat(vkformat) ? VK_IMAGE_ASPECT_DEPTH_BIT - : VK_IMAGE_ASPECT_COLOR_BIT; - - const VkCommandBuffer cmdbuffer = mContext.commands->get().cmdbuffer; + VkImageAspectFlags const aspectFlags = getImageAspect(vkformat); + VkCommandBuffer const cmdbuffer = mCommands->get().buffer(); // We use VK_IMAGE_LAYOUT_GENERAL here because the spec says: // "Host access to image memory is only well-defined for linear images and for image @@ -116,17 +122,19 @@ VulkanStageImage const* VulkanStagePool::acquireImage(PixelDataFormat format, Pi // VK_IMAGE_LAYOUT_PREINITIALIZED or VK_IMAGE_LAYOUT_GENERAL layout. Calling // vkGetImageSubresourceLayout for a linear image returns a subresource layout mapping that is // valid for either of those image layouts." - transitionImageLayout(cmdbuffer, blitterTransitionHelper({ + imgutil::transitionLayout(cmdbuffer, { .image = image->image, - .oldLayout = VK_IMAGE_LAYOUT_UNDEFINED, - .newLayout = VK_IMAGE_LAYOUT_GENERAL, - .subresources = { aspectFlags, 0, 1, 0, 1 } - })); - + .oldLayout = VulkanLayout::UNDEFINED, + .newLayout = VulkanLayout::READ_WRITE, // (= VK_IMAGE_LAYOUT_GENERAL) + .subresources = { aspectFlags, 0, 1, 0, 1 }, + }); return image; } void VulkanStagePool::gc() noexcept { + FVK_SYSTRACE_CONTEXT(); + FVK_SYSTRACE_START("stagepool::gc"); + // If this is one of the first few frames, return early to avoid wrapping unsigned integers. if (++mCurrentFrame <= TIME_BEFORE_EVICTION) { return; @@ -138,7 +146,7 @@ void VulkanStagePool::gc() noexcept { freeStages.swap(mFreeStages); for (auto pair : freeStages) { if (pair.second->lastAccessed < evictionTime) { - vmaDestroyBuffer(mContext.allocator, pair.second->buffer, pair.second->memory); + vmaDestroyBuffer(mAllocator, pair.second->buffer, pair.second->memory); delete pair.second; } else { mFreeStages.insert(pair); @@ -162,7 +170,7 @@ void VulkanStagePool::gc() noexcept { freeImages.swap(mFreeImages); for (auto image : freeImages) { if (image->lastAccessed < evictionTime) { - vmaDestroyImage(mContext.allocator, image->image, image->memory); + vmaDestroyImage(mAllocator, image->image, image->memory); delete image; } else { mFreeImages.insert(image); @@ -180,29 +188,30 @@ void VulkanStagePool::gc() noexcept { mUsedImages.insert(image); } } + FVK_SYSTRACE_END(); } -void VulkanStagePool::reset() noexcept { +void VulkanStagePool::terminate() noexcept { for (auto stage : mUsedStages) { - vmaDestroyBuffer(mContext.allocator, stage->buffer, stage->memory); + vmaDestroyBuffer(mAllocator, stage->buffer, stage->memory); delete stage; } mUsedStages.clear(); for (auto pair : mFreeStages) { - vmaDestroyBuffer(mContext.allocator, pair.second->buffer, pair.second->memory); + vmaDestroyBuffer(mAllocator, pair.second->buffer, pair.second->memory); delete pair.second; } mFreeStages.clear(); for (auto image : mUsedImages) { - vmaDestroyImage(mContext.allocator, image->image, image->memory); + vmaDestroyImage(mAllocator, image->image, image->memory); delete image; } mUsedStages.clear(); for (auto image : mFreeImages) { - vmaDestroyImage(mContext.allocator, image->image, image->memory); + vmaDestroyImage(mAllocator, image->image, image->memory); delete image; } mFreeStages.clear(); diff --git a/filament/backend/src/vulkan/VulkanStagePool.h b/filament/backend/src/vulkan/VulkanStagePool.h index e8a1a5955be..6c8e307ff3f 100644 --- a/filament/backend/src/vulkan/VulkanStagePool.h +++ b/filament/backend/src/vulkan/VulkanStagePool.h @@ -17,13 +17,16 @@ #ifndef TNT_FILAMENT_BACKEND_VULKANSTAGEPOOL_H #define TNT_FILAMENT_BACKEND_VULKANSTAGEPOOL_H -#include "VulkanContext.h" +#include "backend/DriverEnums.h" +#include "VulkanMemory.h" #include #include namespace filament::backend { +class VulkanCommands; + // Immutable POD representing a shared CPU-GPU staging area. struct VulkanStage { VmaAllocation memory; @@ -45,7 +48,7 @@ struct VulkanStageImage { // This class manages two types of host-mappable staging areas: buffer stages and image stages. class VulkanStagePool { public: - explicit VulkanStagePool(VulkanContext& context) noexcept : mContext(context) {} + VulkanStagePool(VmaAllocator allocator, VulkanCommands* commands); // Finds or creates a stage whose capacity is at least the given number of bytes. // The stage is automatically released back to the pool after TIME_BEFORE_EVICTION frames. @@ -60,10 +63,11 @@ class VulkanStagePool { // Destroys all unused stages and asserts that there are no stages currently in use. // This should be called while the context's VkDevice is still alive. - void reset() noexcept; + void terminate() noexcept; private: - VulkanContext& mContext; + VmaAllocator mAllocator; + VulkanCommands* mCommands; // Use an ordered multimap for quick (capacity => stage) lookups using lower_bound(). std::multimap mFreeStages; diff --git a/filament/backend/src/vulkan/VulkanSwapChain.cpp b/filament/backend/src/vulkan/VulkanSwapChain.cpp index aa8ff76f307..a0505f75834 100644 --- a/filament/backend/src/vulkan/VulkanSwapChain.cpp +++ b/filament/backend/src/vulkan/VulkanSwapChain.cpp @@ -15,6 +15,8 @@ */ #include "VulkanSwapChain.h" + +#include "VulkanCommands.h" #include "VulkanTexture.h" #include @@ -25,333 +27,128 @@ using namespace utils; namespace filament::backend { -bool VulkanSwapChain::acquire() { - if (headlessQueue) { - mCurrentSwapIndex = (mCurrentSwapIndex + 1) % mColor.size(); - - UTILS_UNUSED_IN_RELEASE const VkImageLayout layout = getColorTexture().getVkLayout(0, 0); - - // Next we perform a quick sanity check on layout for headless swap chains. It's easier to - // catch errors here than with validation. If this is the first time a particular image has - // been acquired, it should be in an UNDEFINED state. If this is not the first time, then it - // should be in the normal layout that we use for color attachments. - assert_invariant(layout == VK_IMAGE_LAYOUT_UNDEFINED || - layout == getDefaultImageLayout(TextureUsage::COLOR_ATTACHMENT)); - - return true; - } - - // This immediately retrieves the index of the next available presentable image, and - // asynchronously requests the GPU to trigger the "imageAvailable" semaphore. - VkResult result = vkAcquireNextImageKHR(mContext.device, swapchain, - UINT64_MAX, imageAvailable, VK_NULL_HANDLE, &mCurrentSwapIndex); - - // Users should be notified of a suboptimal surface, but it should not cause a cascade of - // log messages or a loop of re-creations. - if (result == VK_SUBOPTIMAL_KHR && !suboptimal) { - slog.w << "Vulkan Driver: Suboptimal swap chain." << io::endl; - suboptimal = true; - } - - UTILS_UNUSED_IN_RELEASE const VkImageLayout layout = getColorTexture().getVkLayout(0, 0); - - // Next perform a quick sanity check on the image layout. Similar to attachable textures, we - // immediately transition the swap chain image layout during the first render pass of the frame. - assert_invariant(layout == VK_IMAGE_LAYOUT_UNDEFINED || - layout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); - - // To ensure that the next command buffer submission does not write into the image before - // it has been acquired, push the image available semaphore into the command buffer manager. - mContext.commands->injectDependency(imageAvailable); - acquired = true; - - assert_invariant(result == VK_SUCCESS || result == VK_SUBOPTIMAL_KHR); - return true; +VulkanSwapChain::VulkanSwapChain(VulkanPlatform* platform, VulkanContext const& context, + fvkmemory::ResourceManager* resourceManager, VmaAllocator allocator, + VulkanCommands* commands, VulkanStagePool& stagePool, void* nativeWindow, uint64_t flags, + VkExtent2D extent) + : mPlatform(platform), + mResourceManager(resourceManager), + mCommands(commands), + mAllocator(allocator), + mStagePool(stagePool), + mHeadless(extent.width != 0 && extent.height != 0 && !nativeWindow), + mFlushAndWaitOnResize(platform->getCustomization().flushAndWaitOnWindowResize), + mTransitionSwapChainImageLayoutForPresent( + platform->getCustomization().transitionSwapChainImageLayoutForPresent), + mAcquired(false), + mIsFirstRenderPass(true) { + swapChain = mPlatform->createSwapChain(nativeWindow, flags, extent); + FILAMENT_CHECK_POSTCONDITION(swapChain) << "Unable to create swapchain"; + + update(); } -void VulkanSwapChain::create(VulkanStagePool& stagePool) { - VkSurfaceCapabilitiesKHR caps; - vkGetPhysicalDeviceSurfaceCapabilitiesKHR(mContext.physicalDevice, surface, &caps); - - // The general advice is to require one more than the minimum swap chain length, since the - // absolute minimum could easily require waiting for a driver or presentation layer to release - // the previous frame's buffer. The only situation in which we'd ask for the minimum length is - // when using a MAILBOX presentation strategy for low-latency situations where tearing is - // acceptable. - const uint32_t maxImageCount = caps.maxImageCount; - const uint32_t minImageCount = caps.minImageCount; - uint32_t desiredImageCount = minImageCount + 1; +VulkanSwapChain::~VulkanSwapChain() { + // Must wait for the inflight command buffers to finish since they might contain the images + // we're about to destroy. + mCommands->flush(); + mCommands->wait(); - // According to section 30.5 of VK 1.1, maxImageCount of zero means "that there is no limit on - // the number of images, though there may be limits related to the total amount of memory used - // by presentable images." - if (maxImageCount != 0 && desiredImageCount > maxImageCount) { - slog.e << "Swap chain does not support " << desiredImageCount << " images." << io::endl; - desiredImageCount = caps.minImageCount; - } + mColors = {}; + mDepth = {}; - // Find a suitable surface format. - if (surfaceFormat.format == VK_FORMAT_UNDEFINED) { + mPlatform->destroy(swapChain); +} - uint32_t surfaceFormatsCount; - vkGetPhysicalDeviceSurfaceFormatsKHR(mContext.physicalDevice, surface, - &surfaceFormatsCount, nullptr); +void VulkanSwapChain::update() { + mColors.clear(); - FixedCapacityVector surfaceFormats(surfaceFormatsCount); - vkGetPhysicalDeviceSurfaceFormatsKHR(mContext.physicalDevice, surface, - &surfaceFormatsCount, surfaceFormats.data()); + auto const bundle = mPlatform->getSwapChainBundle(swapChain); + mColors.reserve(bundle.colors.size()); + VkDevice const device = mPlatform->getDevice(); - surfaceFormat = surfaceFormats[0]; - for (const VkSurfaceFormatKHR& format : surfaceFormats) { - if (format.format == VK_FORMAT_R8G8B8A8_UNORM) { - surfaceFormat = format; - } - } + TextureUsage depthUsage = TextureUsage::DEPTH_ATTACHMENT; + TextureUsage colorUsage = TextureUsage::COLOR_ATTACHMENT; + if (bundle.isProtected) { + depthUsage |= TextureUsage::PROTECTED; + colorUsage |= TextureUsage::PROTECTED; } - - // Verify that our chosen present mode is supported. In practice all devices support the FIFO mode, but we - // check for it anyway for completeness. (and to avoid validation warnings) - - const VkPresentModeKHR desiredPresentMode = VK_PRESENT_MODE_FIFO_KHR; - uint32_t presentModeCount = 0; - vkGetPhysicalDeviceSurfacePresentModesKHR(mContext.physicalDevice, surface, &presentModeCount, nullptr); - FixedCapacityVector presentModes(presentModeCount); - vkGetPhysicalDeviceSurfacePresentModesKHR(mContext.physicalDevice, surface, &presentModeCount, presentModes.data()); - bool foundSuitablePresentMode = false; - for (VkPresentModeKHR mode : presentModes) { - if (mode == desiredPresentMode) { - foundSuitablePresentMode = true; - break; - } + for (auto const color: bundle.colors) { + auto colorTexture = fvkmemory::resource_ptr::construct(mResourceManager, + device, mAllocator, mResourceManager, mCommands, color, VK_NULL_HANDLE, + bundle.colorFormat, 1, bundle.extent.width, bundle.extent.height, colorUsage, + mStagePool); + mColors.push_back(colorTexture); } - ASSERT_POSTCONDITION(foundSuitablePresentMode, "Desired present mode is not supported by this device."); - - // Create the low-level swap chain. - - clientSize = caps.currentExtent; - const VkCompositeAlphaFlagBitsKHR compositeAlpha = (caps.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR) ? - VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR : VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; + mDepth = fvkmemory::resource_ptr::construct(mResourceManager, device, + mAllocator, mResourceManager, mCommands, bundle.depth, VK_NULL_HANDLE, + bundle.depthFormat, 1, bundle.extent.width, bundle.extent.height, depthUsage, + mStagePool); - VkSwapchainCreateInfoKHR createInfo { - .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, - .surface = surface, - .minImageCount = desiredImageCount, - .imageFormat = surfaceFormat.format, - .imageColorSpace = surfaceFormat.colorSpace, - .imageExtent = clientSize, - .imageArrayLayers = 1, - .imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | - VK_IMAGE_USAGE_TRANSFER_DST_BIT | // Allows use as a blit destination. - VK_IMAGE_USAGE_TRANSFER_SRC_BIT, // Allows use as a blit source (for readPixels) - - // TODO: Setting the preTransform to IDENTITY means we are letting the Android Compositor - // handle the rotation. In some situations it might be more efficient to handle this - // ourselves by setting this field to be equal to the currentTransform mask in the caps, but - // this would involve adjusting the MVP, derivatives in GLSL, and possibly more. - // https://android-developers.googleblog.com/2020/02/handling-device-orientation-efficiently.html - .preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, - - .compositeAlpha = compositeAlpha, - .presentMode = desiredPresentMode, - .clipped = VK_TRUE, - - // TODO: Setting the oldSwapchain parameter would avoid exiting and re-entering - // exclusive mode, which could result in a smoother orientation change. - .oldSwapchain = VK_NULL_HANDLE - }; - VkResult result = vkCreateSwapchainKHR(mContext.device, &createInfo, VKALLOC, &swapchain); - ASSERT_POSTCONDITION(result == VK_SUCCESS, "vkGetPhysicalDeviceSurfaceFormatsKHR error."); + mExtent = bundle.extent; +} - // Extract the VkImage handles from the swap chain. - uint32_t imageCount; - result = vkGetSwapchainImagesKHR(mContext.device, swapchain, &imageCount, nullptr); - ASSERT_POSTCONDITION(result == VK_SUCCESS, "vkGetSwapchainImagesKHR count error."); - mColor.reserve(imageCount); - mColor.resize(imageCount); - FixedCapacityVector images(imageCount); - result = vkGetSwapchainImagesKHR(mContext.device, swapchain, &imageCount, images.data()); - ASSERT_POSTCONDITION(result == VK_SUCCESS, "vkGetSwapchainImagesKHR error."); - for (size_t i = 0; i < images.size(); ++i) { - mColor[i].reset(new VulkanTexture(mContext, images[i], surfaceFormat.format, 1, - clientSize.width, clientSize.height, TextureUsage::COLOR_ATTACHMENT, stagePool)); +void VulkanSwapChain::present() { + if (!mHeadless && mTransitionSwapChainImageLayoutForPresent) { + VulkanCommandBuffer& commands = mCommands->get(); + VkImageSubresourceRange const subresources{ + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + .baseMipLevel = 0, + .levelCount = 1, + .baseArrayLayer = 0, + .layerCount = 1, + }; + mColors[mCurrentSwapIndex]->transitionLayout(&commands, subresources, VulkanLayout::PRESENT); } - slog.i - << "vkCreateSwapchain" - << ": " << clientSize.width << "x" << clientSize.height - << ", " << surfaceFormat.format - << ", " << surfaceFormat.colorSpace - << ", " << imageCount - << ", " << caps.currentTransform - << io::endl << io::endl; - - createSemaphore(mContext.device, &imageAvailable); - acquired = false; - - // HACK: force usage of the "fallback" depth format, since we know that's a safe depth format. - auto depthFormat = TextureFormat::DEPTH24; - mDepth.reset(new VulkanTexture(mContext, SamplerType::SAMPLER_2D, 1, - depthFormat, 1, clientSize.width, clientSize.height, 1, TextureUsage::DEPTH_ATTACHMENT, - stagePool)); -} + mCommands->flush(); -void VulkanSwapChain::destroy() { - mContext.commands->flush(); - mContext.commands->wait(); - const VkDevice device = mContext.device; - mDepth.reset(); - for (auto& texture : mColor) { - texture.reset(); + // call the image ready wait function + if (mExplicitImageReadyWait != nullptr) { + mExplicitImageReadyWait(swapChain); } - vkDestroySwapchainKHR(device, swapchain, VKALLOC); - vkDestroySemaphore(device, imageAvailable, VKALLOC); -} -// Near the end of the frame, we transition the swap chain to VK_IMAGE_LAYOUT_PRESENT_SRC_KHR using -// an image barrier rather than a render pass because each render pass does not know whether or not -// it is the last pass in the frame. (This seems to be an atypical way of achieving the transition, -// but I see nothing wrong with it.) -void VulkanSwapChain::makePresentable() { - if (headlessQueue) { - return; + // We only present if it is not headless. No-op for headless. + if (!mHeadless) { + VkSemaphore const finishedDrawing = mCommands->acquireFinishedSignal(); + VkResult const result = mPlatform->present(swapChain, mCurrentSwapIndex, finishedDrawing); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS || result == VK_SUBOPTIMAL_KHR || + result == VK_ERROR_OUT_OF_DATE_KHR) + << "Cannot present in swapchain. error=" << static_cast(result); } - VulkanTexture& texture = getColorTexture(); - VkImageMemoryBarrier barrier { - .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, - .srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, - .dstAccessMask = 0, - .oldLayout = texture.getVkLayout(0, 0), - .newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, - .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, - .image = texture.getVkImage(), - .subresourceRange = { - .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, - .levelCount = 1, - .layerCount = 1, - }, - }; - vkCmdPipelineBarrier(mContext.commands->get().cmdbuffer, - VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, 1, &barrier); - texture.trackLayout(0, 0, barrier.newLayout); + // We presented the last acquired buffer. + mAcquired = false; + mIsFirstRenderPass = true; } -static void getHeadlessQueue(VulkanContext& mContext, VulkanSwapChain& sc) { - vkGetDeviceQueue(mContext.device, mContext.graphicsQueueFamilyIndex, 0, &sc.headlessQueue); - ASSERT_POSTCONDITION(sc.headlessQueue, "Unable to obtain graphics queue."); - sc.presentQueue = VK_NULL_HANDLE; -} - -static void getPresentationQueue(VulkanContext& mContext, VulkanSwapChain& sc) { - uint32_t queueFamiliesCount; - vkGetPhysicalDeviceQueueFamilyProperties(mContext.physicalDevice, &queueFamiliesCount, nullptr); - FixedCapacityVector queueFamiliesProperties(queueFamiliesCount); - vkGetPhysicalDeviceQueueFamilyProperties(mContext.physicalDevice, &queueFamiliesCount, - queueFamiliesProperties.data()); - uint32_t presentQueueFamilyIndex = 0xffff; - - // We prefer the graphics and presentation queues to be the same, so first check if that works. - // On most platforms they must be the same anyway, and this avoids issues with MoltenVK. - VkBool32 supported = VK_FALSE; - vkGetPhysicalDeviceSurfaceSupportKHR(mContext.physicalDevice, mContext.graphicsQueueFamilyIndex, - sc.surface, &supported); - if (supported) { - presentQueueFamilyIndex = mContext.graphicsQueueFamilyIndex; +void VulkanSwapChain::acquire(bool& resized) { + // It's ok to call acquire multiple times due to it being linked to Driver::makeCurrent(). + if (mAcquired) { + return; } - // Otherwise fall back to separate graphics and presentation queues. - if (presentQueueFamilyIndex == 0xffff) { - for (uint32_t j = 0; j < queueFamiliesCount; ++j) { - vkGetPhysicalDeviceSurfaceSupportKHR(mContext.physicalDevice, j, sc.surface, &supported); - if (supported) { - presentQueueFamilyIndex = j; - break; - } + // Check if the swapchain should be resized. + if ((resized = mPlatform->hasResized(swapChain))) { + if (mFlushAndWaitOnResize) { + mCommands->flush(); + mCommands->wait(); } + mPlatform->recreate(swapChain); + update(); } - ASSERT_POSTCONDITION(presentQueueFamilyIndex != 0xffff, - "This physical device does not support the presentation queue."); - if (mContext.graphicsQueueFamilyIndex != presentQueueFamilyIndex) { - // TODO: Strictly speaking, this code path is incorrect. However it is not triggered on any - // Android devices that we've tested with, nor with MoltenVK. - // - // This is incorrect because we created the logical device early on, before we had a handle - // to the rendering surface. Therefore the device was not created with the presentation - // queue family index included in VkDeviceQueueCreateInfo. - // - // This is non-trivial to fix because the driver API allows clients to do certain things - // (e.g. upload a vertex buffer) before the swap chain is created. - // - // https://github.com/google/filament/issues/1532 - vkGetDeviceQueue(mContext.device, presentQueueFamilyIndex, 0, &sc.presentQueue); - - } else { - sc.presentQueue = mContext.graphicsQueue; + VulkanPlatform::ImageSyncData imageSyncData; + VkResult const result = mPlatform->acquire(swapChain, &imageSyncData); + mCurrentSwapIndex = imageSyncData.imageIndex; + mExplicitImageReadyWait = imageSyncData.explicitImageReadyWait; + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS || result == VK_SUBOPTIMAL_KHR) + << "Cannot acquire in swapchain. error=" << static_cast(result); + if (imageSyncData.imageReadySemaphore != VK_NULL_HANDLE) { + mCommands->injectDependency(imageSyncData.imageReadySemaphore); } - ASSERT_POSTCONDITION(sc.presentQueue, "Unable to obtain presentation queue."); - sc.headlessQueue = VK_NULL_HANDLE; -} - -// Primary SwapChain constructor. (not headless) -VulkanSwapChain::VulkanSwapChain(VulkanContext& context, VulkanStagePool& stagePool, VkSurfaceKHR vksurface) : - mContext(context) { - suboptimal = false; - surface = vksurface; - firstRenderPass = true; - getPresentationQueue(context, *this); - create(stagePool); -} - -// Headless SwapChain constructor. (does not create a VkSwapChainKHR) -VulkanSwapChain::VulkanSwapChain(VulkanContext& context, VulkanStagePool& stagePool, uint32_t width, uint32_t height) : - mContext(context) { - surface = VK_NULL_HANDLE; - getHeadlessQueue(context, *this); - - surfaceFormat.format = VK_FORMAT_R8G8B8A8_UNORM; - swapchain = VK_NULL_HANDLE; - - // Somewhat arbitrarily, headless rendering is double-buffered. - mColor.reserve(2); - mColor.resize(2); - - for (size_t i = 0; i < mColor.size(); ++i) { - mColor[i].reset(new VulkanTexture(mContext, SamplerType::SAMPLER_2D, 1, TextureFormat::RGBA8, - 1, width, height, 1, TextureUsage::COLOR_ATTACHMENT, stagePool)); - } - - clientSize.width = width; - clientSize.height = height; - - imageAvailable = VK_NULL_HANDLE; - - // HACK: force usage of the "fallback" depth format, since we know that's a safe depth format. - auto depthFormat = TextureFormat::DEPTH24; - - mDepth.reset(new VulkanTexture(context, SamplerType::SAMPLER_2D, 1, - depthFormat, 1, clientSize.width, clientSize.height, 1, TextureUsage::DEPTH_ATTACHMENT, - stagePool)); -} - -bool VulkanSwapChain::hasResized() const { - if (surface == VK_NULL_HANDLE) { - return false; - } - VkSurfaceCapabilitiesKHR surfaceCapabilities; - vkGetPhysicalDeviceSurfaceCapabilitiesKHR(mContext.physicalDevice, surface, &surfaceCapabilities); - return !equivalent(clientSize, surfaceCapabilities.currentExtent); -} - -VulkanTexture& VulkanSwapChain::getColorTexture() { - return *mColor[mCurrentSwapIndex]; -} - -VulkanTexture& VulkanSwapChain::getDepthTexture() { - return *mDepth; + mAcquired = true; } -} // namespace filament::backend +}// namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanSwapChain.h b/filament/backend/src/vulkan/VulkanSwapChain.h index c1b880adcc9..bf1c26945bb 100644 --- a/filament/backend/src/vulkan/VulkanSwapChain.h +++ b/filament/backend/src/vulkan/VulkanSwapChain.h @@ -14,62 +14,95 @@ * limitations under the License. */ - #ifndef TNT_FILAMENT_BACKEND_VULKANSWAPCHAIN_H - #define TNT_FILAMENT_BACKEND_VULKANSWAPCHAIN_H +#ifndef TNT_FILAMENT_BACKEND_VULKANSWAPCHAIN_H +#define TNT_FILAMENT_BACKEND_VULKANSWAPCHAIN_H + +#include "DriverBase.h" #include "VulkanContext.h" -#include "VulkanDriver.h" +#include "VulkanTexture.h" +#include "vulkan/memory/Resource.h" -#include +#include +#include #include +#include + +using namespace bluevk; + namespace filament::backend { +struct VulkanHeadlessSwapChain; +struct VulkanSurfaceSwapChain; +class VulkanCommands; -struct VulkanSwapChain : public HwSwapChain { - VulkanSwapChain(VulkanContext& context, VulkanStagePool& stagePool, VkSurfaceKHR vksurface); +// A wrapper around the platform implementation of swapchain. +struct VulkanSwapChain : public HwSwapChain, fvkmemory::Resource { + VulkanSwapChain(VulkanPlatform* platform, VulkanContext const& context, + fvkmemory::ResourceManager* resourceManager, VmaAllocator allocator, + VulkanCommands* commands, VulkanStagePool& stagePool, void* nativeWindow, + uint64_t flags, VkExtent2D extent = {0, 0}); - // Headless constructor. - VulkanSwapChain(VulkanContext& context, VulkanStagePool& stagePool, uint32_t width, uint32_t height); + ~VulkanSwapChain(); - bool acquire(); - void create(VulkanStagePool& stagePool); - void destroy(); - void makePresentable(); - bool hasResized() const; + void present(); - VulkanTexture& getColorTexture(); - VulkanTexture& getDepthTexture(); - uint32_t getSwapIndex() const { return mCurrentSwapIndex; } + void acquire(bool& reized); - VkSurfaceKHR surface = {}; - VkSwapchainKHR swapchain = {}; - VkSurfaceFormatKHR surfaceFormat = {}; - VkExtent2D clientSize = {}; - VkQueue presentQueue = {}; - VkQueue headlessQueue = {}; + fvkmemory::resource_ptr getCurrentColor() const noexcept { + uint32_t const imageIndex = mCurrentSwapIndex; + FILAMENT_CHECK_PRECONDITION( + imageIndex != VulkanPlatform::ImageSyncData::INVALID_IMAGE_INDEX); + return mColors[imageIndex]; + } - // This is signaled when vkAcquireNextImageKHR succeeds, and is waited on by the first - // submission. - VkSemaphore imageAvailable = VK_NULL_HANDLE; + inline fvkmemory::resource_ptr getDepth() const noexcept { + return mDepth; + } - // This is true after the swap chain image has been acquired, but before it has been presented. - bool acquired = false; + inline bool isFirstRenderPass() const noexcept { + return mIsFirstRenderPass; + } - bool suboptimal = false; - bool firstRenderPass = false; + inline void markFirstRenderPass() noexcept { + mIsFirstRenderPass = false; + } -private: - VulkanContext& mContext; - uint32_t mCurrentSwapIndex = 0u; + inline VkExtent2D getExtent() noexcept { + return mExtent; + } - // Color attachments are swapped, but depth is not. Typically there are 2 or 3 color attachments - // in a swap chain. - utils::FixedCapacityVector> mColor; - std::unique_ptr mDepth; + inline bool isProtected() noexcept { + return mPlatform->isProtected(swapChain); + } +private: + static constexpr int IMAGE_READY_SEMAPHORE_COUNT = FVK_MAX_COMMAND_BUFFERS; + + void update(); + + VulkanPlatform* mPlatform; + fvkmemory::ResourceManager* mResourceManager; + VulkanCommands* mCommands; + VmaAllocator mAllocator; + VulkanStagePool& mStagePool; + bool const mHeadless; + bool const mFlushAndWaitOnResize; + bool const mTransitionSwapChainImageLayoutForPresent; + + // We create VulkanTextures based on VkImages. VulkanTexture has facilities for doing layout + // transitions, which are useful here. + utils::FixedCapacityVector> mColors; + fvkmemory::resource_ptr mDepth; + VkExtent2D mExtent; + uint32_t mCurrentSwapIndex; + std::function mExplicitImageReadyWait = nullptr; + bool mAcquired; + bool mIsFirstRenderPass; }; -} // namespace filament::backend -#endif // TNT_FILAMENT_BACKEND_VULKANSWAPCHAIN_H +}// namespace filament::backend + +#endif// TNT_FILAMENT_BACKEND_VULKANSWAPCHAIN_H diff --git a/filament/backend/src/vulkan/VulkanTexture.cpp b/filament/backend/src/vulkan/VulkanTexture.cpp index 67a6619f32e..2180c04fbda 100644 --- a/filament/backend/src/vulkan/VulkanTexture.cpp +++ b/filament/backend/src/vulkan/VulkanTexture.cpp @@ -14,53 +14,189 @@ * limitations under the License. */ +#include "VulkanCommands.h" #include "VulkanMemory.h" #include "VulkanTexture.h" #include "VulkanUtility.h" +#include "vulkan/memory/ResourcePointer.h" +#include +#include #include -#include "DataReshaper.h" - #include using namespace bluevk; namespace filament::backend { -VulkanTexture::VulkanTexture(VulkanContext& context, VkImage image, VkFormat format, uint8_t samples, - uint32_t width, uint32_t height, TextureUsage tusage, VulkanStagePool& stagePool) : - HwTexture(SamplerType::SAMPLER_2D, 1, samples, width, height, 1, TextureFormat::UNUSED, tusage), - mVkFormat(format), - mViewType(getImageViewType(target)), - mSwizzle({}), - mTextureImage(image), - mContext(context), - mStagePool(stagePool) {} +namespace { + +inline uint8_t getLayerCount(SamplerType const target, uint32_t const depth) { + switch (target) { + case SamplerType::SAMPLER_2D: + case SamplerType::SAMPLER_3D: + case SamplerType::SAMPLER_EXTERNAL: + return 1; + case SamplerType::SAMPLER_CUBEMAP: + return 6; + case SamplerType::SAMPLER_CUBEMAP_ARRAY: + return depth * 6; + case SamplerType::SAMPLER_2D_ARRAY: + return depth; + } +} + +VkComponentMapping composeSwizzle(VkComponentMapping const& prev, VkComponentMapping const& next) { + static constexpr VkComponentSwizzle IDENTITY[] = { + VK_COMPONENT_SWIZZLE_R, + VK_COMPONENT_SWIZZLE_G, + VK_COMPONENT_SWIZZLE_B, + VK_COMPONENT_SWIZZLE_A, + }; + + auto const compose = [](VkComponentSwizzle out, VkComponentMapping const& prev, + uint8_t channelIndex) { + // We need to first change all identities to its equivalent channel. + if (out == VK_COMPONENT_SWIZZLE_IDENTITY) { + out = IDENTITY[channelIndex]; + } + switch (out) { + case VK_COMPONENT_SWIZZLE_R: + out = prev.r; + break; + case VK_COMPONENT_SWIZZLE_G: + out = prev.g; + break; + case VK_COMPONENT_SWIZZLE_B: + out = prev.b; + break; + case VK_COMPONENT_SWIZZLE_A: + out = prev.a; + break; + case VK_COMPONENT_SWIZZLE_IDENTITY: + case VK_COMPONENT_SWIZZLE_ZERO: + case VK_COMPONENT_SWIZZLE_ONE: + return out; + // Below is not exposed in Vulkan's API, but needs to be there for compilation. + case VK_COMPONENT_SWIZZLE_MAX_ENUM: + break; + } + // If the result correctly corresponds to the identity, just return identity. + if (IDENTITY[channelIndex] == out) { + return VK_COMPONENT_SWIZZLE_IDENTITY; + } + return out; + }; + + auto const identityToChannel = [](VkComponentSwizzle val, uint8_t channelIndex) { + if (val != VK_COMPONENT_SWIZZLE_IDENTITY) { + return val; + } + return IDENTITY[channelIndex]; + }; -VulkanTexture::VulkanTexture(VulkanContext& context, SamplerType target, uint8_t levels, - TextureFormat tformat, uint8_t samples, uint32_t w, uint32_t h, uint32_t depth, - TextureUsage tusage, VulkanStagePool& stagePool, VkComponentMapping swizzle) : - HwTexture(target, levels, samples, w, h, depth, tformat, tusage), + // We make sure all all identities are mapped into respective channels so that actual channel + // mapping will be passed onto the output. + VkComponentMapping const prevExplicit = { + identityToChannel(prev.r, 0), + identityToChannel(prev.g, 1), + identityToChannel(prev.b, 2), + identityToChannel(prev.a, 3), + }; - // Vulkan does not support 24-bit depth, use the official fallback format. - mVkFormat(tformat == TextureFormat::DEPTH24 ? context.finalDepthFormat : - backend::getVkFormat(tformat)), + // Note that the channel index corresponds to the VkComponentMapping struct layout. + return { + compose(next.r, prevExplicit, 0), + compose(next.g, prevExplicit, 1), + compose(next.b, prevExplicit, 2), + compose(next.a, prevExplicit, 3), + }; +} - mViewType(getImageViewType(target)), +inline VulkanLayout getDefaultLayoutImpl(TextureUsage usage) { + if (any(usage & TextureUsage::DEPTH_ATTACHMENT)) { + if (any(usage & TextureUsage::SAMPLEABLE)) { + return VulkanLayout::DEPTH_SAMPLER; + } else { + return VulkanLayout::DEPTH_ATTACHMENT; + } + } - mSwizzle(swizzle), mContext(context), mStagePool(stagePool) { + if (any(usage & TextureUsage::COLOR_ATTACHMENT)) { + return VulkanLayout::COLOR_ATTACHMENT; + } + // Finally, the layout for an immutable texture is optimal read-only. + return VulkanLayout::READ_ONLY; +} +inline VulkanLayout getDefaultLayoutImpl(VkImageUsageFlags vkusage) { + TextureUsage usage{}; + if (vkusage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { + usage = usage | TextureUsage::DEPTH_ATTACHMENT; + } + if (vkusage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) { + usage = usage | TextureUsage::COLOR_ATTACHMENT; + } + if (vkusage & VK_IMAGE_USAGE_SAMPLED_BIT) { + usage = usage | TextureUsage::SAMPLEABLE; + } + return getDefaultLayoutImpl(usage); +} + +} // anonymous namespace + +VulkanTextureState::VulkanTextureState(VkDevice device, VmaAllocator allocator, + VulkanCommands* commands, VulkanStagePool& stagePool, VkFormat format, + VkImageViewType viewType, uint8_t levels, uint8_t layerCount, VulkanLayout defaultLayout, + bool isProtected) + : mVkFormat(format), + mViewType(viewType), + mFullViewRange{filament::backend::getImageAspect(format), 0, levels, 0, layerCount}, + mDefaultLayout(defaultLayout), + mIsProtected(isProtected), + mStagePool(stagePool), + mDevice(device), + mAllocator(allocator), + mCommands(commands), + mIsTransientAttachment(false) {} + +// Constructor for internally passed VkImage +VulkanTexture::VulkanTexture(VkDevice device, VmaAllocator allocator, + fvkmemory::ResourceManager* resourceManager, VulkanCommands* commands, VkImage image, + VkDeviceMemory memory, VkFormat format, uint8_t samples, uint32_t width, + uint32_t height, TextureUsage tusage, VulkanStagePool& stagePool) + : HwTexture(SamplerType::SAMPLER_2D, 1, samples, width, height, 1, TextureFormat::UNUSED, + tusage), + mState(fvkmemory::resource_ptr::construct(resourceManager, device, + allocator, commands, stagePool, format, imgutil::getViewType(SamplerType::SAMPLER_2D), + 1, 1, getDefaultLayoutImpl(tusage), any(usage & TextureUsage::PROTECTED))) { + mState->mTextureImage = image; + mState->mTextureImageMemory = memory; + mPrimaryViewRange = mState->mFullViewRange; +} + +// Constructor for user facing texture +VulkanTexture::VulkanTexture(VkDevice device, VkPhysicalDevice physicalDevice, + VulkanContext const& context, VmaAllocator allocator, + fvkmemory::ResourceManager* resourceManager, VulkanCommands* commands, SamplerType target, + uint8_t levels, TextureFormat tformat, uint8_t samples, uint32_t w, uint32_t h, + uint32_t depth, TextureUsage tusage, VulkanStagePool& stagePool) + : HwTexture(target, levels, samples, w, h, depth, tformat, tusage), + mState(fvkmemory::resource_ptr::construct(resourceManager, device, + allocator, commands, stagePool, backend::getVkFormat(tformat), + imgutil::getViewType(target), levels, getLayerCount(target, depth), + VulkanLayout::UNDEFINED, any(usage & TextureUsage::PROTECTED))) { // Create an appropriately-sized device-only VkImage, but do not fill it yet. - VkImageCreateInfo imageInfo { + VkImageCreateInfo imageInfo{ .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, .imageType = target == SamplerType::SAMPLER_3D ? VK_IMAGE_TYPE_3D : VK_IMAGE_TYPE_2D, - .format = mVkFormat, - .extent = { w, h, depth }, + .format = mState->mVkFormat, + .extent = {w, h, depth}, .mipLevels = levels, .arrayLayers = 1, .tiling = VK_IMAGE_TILING_OPTIMAL, - .usage = 0 + .usage = 0, }; if (target == SamplerType::SAMPLER_CUBEMAP) { imageInfo.arrayLayers = 6; @@ -81,20 +217,38 @@ VulkanTexture::VulkanTexture(VulkanContext& context, SamplerType target, uint8_t imageInfo.arrayLayers = depth * 6; imageInfo.extent.depth = 1; } + if (any(usage & TextureUsage::PROTECTED)) { + imageInfo.flags |= VK_IMAGE_CREATE_PROTECTED_BIT; + } - // Filament expects blit() to work with any texture, so we almost always set these usage flags. - // TODO: investigate performance implications of setting these flags. - const VkImageUsageFlags blittable = VK_IMAGE_USAGE_TRANSFER_DST_BIT | - VK_IMAGE_USAGE_TRANSFER_SRC_BIT; + if (any(usage & TextureUsage::BLIT_SRC)) { + imageInfo.usage |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; + } + if (any(usage & TextureUsage::BLIT_DST)) { + imageInfo.usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; + } + + // Determine if we can use the transient usage flag combined with lazily allocated memory. + const bool useTransientAttachment = + // Lazily allocated memory is available. + context.isLazilyAllocatedMemorySupported() && + // Usage consists of attachment flags only. + none(tusage & ~TextureUsage::ALL_ATTACHMENTS) && + // Usage contains at least one attachment flag. + any(tusage & TextureUsage::ALL_ATTACHMENTS); + mState->mIsTransientAttachment = useTransientAttachment; + + const VkImageUsageFlags transientFlag = + useTransientAttachment ? VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT : 0U; if (any(usage & TextureUsage::SAMPLEABLE)) { -#if VK_ENABLE_VALIDATION +#if FVK_ENABLED(FVK_DEBUG_TEXTURE) // Validate that the format is actually sampleable. VkFormatProperties props; - vkGetPhysicalDeviceFormatProperties(context.physicalDevice, mVkFormat, &props); + vkGetPhysicalDeviceFormatProperties(physicalDevice, state->mVkFormat, &props); if (!(props.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) { - utils::slog.w << "Texture usage is SAMPLEABLE but format " << mVkFormat << " is not " + FVK_LOGW << "Texture usage is SAMPLEABLE but format " << state->mVkFormat << " is not " "sampleable with optimal tiling." << utils::io::endl; } #endif @@ -102,20 +256,19 @@ VulkanTexture::VulkanTexture(VulkanContext& context, SamplerType target, uint8_t imageInfo.usage |= VK_IMAGE_USAGE_SAMPLED_BIT; } if (any(usage & TextureUsage::COLOR_ATTACHMENT)) { - imageInfo.usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | blittable; + imageInfo.usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | transientFlag; if (any(usage & TextureUsage::SUBPASS_INPUT)) { imageInfo.usage |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; } } if (any(usage & TextureUsage::STENCIL_ATTACHMENT)) { - imageInfo.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; + imageInfo.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | transientFlag; } if (any(usage & TextureUsage::UPLOADABLE)) { - imageInfo.usage |= blittable; + imageInfo.usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; } if (any(usage & TextureUsage::DEPTH_ATTACHMENT)) { - imageInfo.usage |= blittable; - imageInfo.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; + imageInfo.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | transientFlag; // Depth resolves uses a custom shader and therefore needs to be sampleable. if (samples > 1) { @@ -126,86 +279,108 @@ VulkanTexture::VulkanTexture(VulkanContext& context, SamplerType target, uint8_t // Constrain the sample count according to the sample count masks in VkPhysicalDeviceProperties. // Note that VulkanRenderTarget holds a single MSAA count, so we play it safe if this is used as // any kind of attachment (color or depth). - const auto& limits = context.physicalDeviceProperties.limits; + const auto& limits = context.getPhysicalDeviceLimits(); if (imageInfo.usage & VK_IMAGE_USAGE_SAMPLED_BIT) { - samples = reduceSampleCount(samples, isDepthFormat(mVkFormat) ? - limits.sampledImageDepthSampleCounts : limits.sampledImageColorSampleCounts); + samples = reduceSampleCount(samples, isVkDepthFormat(mState->mVkFormat) + ? limits.sampledImageDepthSampleCounts + : limits.sampledImageColorSampleCounts); + } + if (imageInfo.usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) { + samples = reduceSampleCount(samples, limits.framebufferColorSampleCounts); } - if (imageInfo.usage & (VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | - VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)) { - samples = reduceSampleCount(samples, limits.framebufferDepthSampleCounts & - limits.framebufferColorSampleCounts); + + if (imageInfo.usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { + samples = reduceSampleCount(samples, limits.sampledImageDepthSampleCounts); } this->samples = samples; imageInfo.samples = (VkSampleCountFlagBits) samples; - VkResult error = vkCreateImage(context.device, &imageInfo, VKALLOC, &mTextureImage); - if (error || FILAMENT_VULKAN_VERBOSE) { - utils::slog.d << "vkCreateImage: " - << "result = " << error << ", " - << "handle = " << utils::io::hex << mTextureImage << utils::io::dec << ", " + VkResult result = vkCreateImage(mState->mDevice, &imageInfo, VKALLOC, &mState->mTextureImage); + if (result == VK_SUCCESS || FVK_ENABLED(FVK_DEBUG_TEXTURE)) { + FVK_LOGD << "vkCreateImage: " + << "image = " << mState->mTextureImage << ", " + << "result = " << result << ", " + << "handle = " << utils::io::hex << mState->mTextureImage << utils::io::dec << ", " << "extent = " << w << "x" << h << "x"<< depth << ", " << "mipLevels = " << int(levels) << ", " + << "TextureUsage = " << static_cast(usage) << ", " << "usage = " << imageInfo.usage << ", " << "samples = " << imageInfo.samples << ", " - << "format = " << mVkFormat << utils::io::endl; + << "type = " << imageInfo.imageType << ", " + << "flags = " << imageInfo.flags << ", " + << "target = " << static_cast(target) <<", " + << "format = " << mState->mVkFormat << utils::io::endl; } - ASSERT_POSTCONDITION(!error, "Unable to create image."); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) << "Unable to create image." + << " error=" << static_cast(result); // Allocate memory for the VkImage and bind it. VkMemoryRequirements memReqs = {}; - vkGetImageMemoryRequirements(context.device, mTextureImage, &memReqs); + vkGetImageMemoryRequirements(mState->mDevice, mState->mTextureImage, &memReqs); + + const VkFlags requiredMemoryFlags = + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | + (useTransientAttachment ? VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT : 0U) | + (mState->mIsProtected ? VK_MEMORY_PROPERTY_PROTECTED_BIT : 0U); + uint32_t memoryTypeIndex + = context.selectMemoryType(memReqs.memoryTypeBits, requiredMemoryFlags); + + FILAMENT_CHECK_POSTCONDITION(memoryTypeIndex < VK_MAX_MEMORY_TYPES) + << "VulkanTexture: unable to find a memory type that meets requirements."; + VkMemoryAllocateInfo allocInfo = { .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, .allocationSize = memReqs.size, - .memoryTypeIndex = context.selectMemoryType(memReqs.memoryTypeBits, - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) + .memoryTypeIndex = memoryTypeIndex, }; - error = vkAllocateMemory(context.device, &allocInfo, nullptr, &mTextureImageMemory); - ASSERT_POSTCONDITION(!error, "Unable to allocate image memory."); - error = vkBindImageMemory(context.device, mTextureImage, mTextureImageMemory, 0); - ASSERT_POSTCONDITION(!error, "Unable to bind image."); + result = vkAllocateMemory(mState->mDevice, &allocInfo, nullptr, &mState->mTextureImageMemory); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) << "Unable to allocate image memory." + << " error=" << static_cast(result); + result = vkBindImageMemory(mState->mDevice, mState->mTextureImage, mState->mTextureImageMemory, + 0); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) << "Unable to bind image." + << " error=" << static_cast(result); // Spec out the "primary" VkImageView that shaders use to sample from the image. - mPrimaryViewRange.aspectMask = getImageAspect(); - mPrimaryViewRange.baseMipLevel = 0; - mPrimaryViewRange.levelCount = levels; - mPrimaryViewRange.baseArrayLayer = 0; - if (target == SamplerType::SAMPLER_CUBEMAP) { - mPrimaryViewRange.layerCount = 6; - } else if (target == SamplerType::SAMPLER_CUBEMAP_ARRAY) { - mPrimaryViewRange.layerCount = depth * 6; - } else if (target == SamplerType::SAMPLER_2D_ARRAY) { - mPrimaryViewRange.layerCount = depth; - } else if (target == SamplerType::SAMPLER_3D) { - mPrimaryViewRange.layerCount = 1; - } else { - mPrimaryViewRange.layerCount = 1; - } + mPrimaryViewRange = mState->mFullViewRange; - // Go ahead and create the primary image view, no need to do it lazily. - getImageView(mPrimaryViewRange); + // Go ahead and create the primary image view. + getImageView(mPrimaryViewRange, mState->mViewType, mSwizzle); - // Transition the layout of each image slice that might be used as a render target. - // We do not transition images that are merely SAMPLEABLE, this is deferred until upload time - // because we do not know how many layers and levels will actually be used. - if (any(usage & (TextureUsage::COLOR_ATTACHMENT | TextureUsage::DEPTH_ATTACHMENT))) { - const uint32_t layers = mPrimaryViewRange.layerCount; - VkImageSubresourceRange range = { getImageAspect(), 0, levels, 0, layers }; - VkImageLayout layout = getDefaultImageLayout(usage); - VkCommandBuffer commands = mContext.commands->get().cmdbuffer; - transitionLayout(commands, range, layout); - } + mState->mDefaultLayout = getDefaultLayoutImpl(imageInfo.usage); +} + +// Constructor for creating a texture view +VulkanTexture::VulkanTexture(VkDevice device, VkPhysicalDevice physicalDevice, + VulkanContext const& context, VmaAllocator allocator, VulkanCommands* commands, + fvkmemory::resource_ptr src, uint8_t baseLevel, + uint8_t levelCount) + : HwTexture(src->target, src->levels, src->samples, src->width, src->height, src->depth, + src->format, src->usage) { + mState = src->mState; + mPrimaryViewRange = src->mPrimaryViewRange; + mPrimaryViewRange.baseMipLevel = src->mPrimaryViewRange.baseMipLevel + baseLevel; + mPrimaryViewRange.levelCount = levelCount; +} + +// Constructor for creating a texture view with swizzle +VulkanTexture::VulkanTexture(VkDevice device, VkPhysicalDevice physicalDevice, + VulkanContext const& context, VmaAllocator allocator, VulkanCommands* commands, + fvkmemory::resource_ptr src, VkComponentMapping swizzle) + : HwTexture(src->target, src->levels, src->samples, src->width, src->height, src->depth, + src->format, src->usage) { + mState = src->mState; + mPrimaryViewRange = src->mPrimaryViewRange; + mSwizzle = composeSwizzle(src->mSwizzle, swizzle); } -VulkanTexture::~VulkanTexture() { - delete mSidecarMSAA; +VulkanTextureState::~VulkanTextureState() { if (mTextureImageMemory != VK_NULL_HANDLE) { - vkDestroyImage(mContext.device, mTextureImage, VKALLOC); - vkFreeMemory(mContext.device, mTextureImageMemory, VKALLOC); + vkDestroyImage(mDevice, mTextureImage, VKALLOC); + vkFreeMemory(mDevice, mTextureImageMemory, VKALLOC); } - for (auto entry : mCachedImageViews) { - vkDestroyImageView(mContext.device, entry.second, VKALLOC); + for (auto entry: mCachedImageViews) { + vkDestroyImageView(mDevice, entry.second, VKALLOC); } } @@ -214,7 +389,7 @@ void VulkanTexture::updateImage(const PixelBufferDescriptor& data, uint32_t widt assert_invariant(width <= this->width && height <= this->height); assert_invariant(depth <= this->depth * ((target == SamplerType::SAMPLER_CUBEMAP || target == SamplerType::SAMPLER_CUBEMAP_ARRAY) ? 6 : 1)); - + assert_invariant(!mState->mIsProtected); const PixelBufferDescriptor* hostData = &data; PixelBufferDescriptor reshapedData; @@ -227,7 +402,7 @@ void VulkanTexture::updateImage(const PixelBufferDescriptor& data, uint32_t widt // If format conversion is both required and supported, use vkCmdBlitImage. const VkFormat hostFormat = backend::getVkFormat(hostData->format, hostData->type); - const VkFormat deviceFormat = getVkFormatLinear(mVkFormat); + const VkFormat deviceFormat = getVkFormatLinear(mState->mVkFormat); if (hostFormat != deviceFormat && hostFormat != VK_FORMAT_UNDEFINED) { assert_invariant(xoffset == 0 && yoffset == 0 && zoffset == 0 && "Offsets not yet supported when format conversion is required."); @@ -235,16 +410,20 @@ void VulkanTexture::updateImage(const PixelBufferDescriptor& data, uint32_t widt return; } + assert_invariant(hostData->size > 0 && "Data is empty"); + // Otherwise, use vkCmdCopyBufferToImage. void* mapped = nullptr; - VulkanStage const* stage = mStagePool.acquireStage(hostData->size); + VulkanStage const* stage = mState->mStagePool.acquireStage(hostData->size); assert_invariant(stage->memory); - vmaMapMemory(mContext.allocator, stage->memory, &mapped); + vmaMapMemory(mState->mAllocator, stage->memory, &mapped); memcpy(mapped, hostData->buffer, hostData->size); - vmaUnmapMemory(mContext.allocator, stage->memory); - vmaFlushAllocation(mContext.allocator, stage->memory, 0, hostData->size); + vmaUnmapMemory(mState->mAllocator, stage->memory); + vmaFlushAllocation(mState->mAllocator, stage->memory, 0, hostData->size); - const VkCommandBuffer cmdbuffer = mContext.commands->get().cmdbuffer; + VulkanCommandBuffer& commands = mState->mCommands->get(); + VkCommandBuffer const cmdbuf = commands.buffer(); + commands.acquire(fvkmemory::resource_ptr::cast(this)); VkBufferImageCopy copyRegion = { .bufferOffset = {}, @@ -280,25 +459,34 @@ void VulkanTexture::updateImage(const PixelBufferDescriptor& data, uint32_t widt transitionRange.layerCount = depth; } - transitionLayout(cmdbuffer, transitionRange, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + VulkanLayout const newLayout = VulkanLayout::TRANSFER_DST; + VulkanLayout nextLayout = getLayout(transitionRange.baseArrayLayer, miplevel); + VkImageLayout const newVkLayout = imgutil::getVkLayout(newLayout); + + if (nextLayout == VulkanLayout::UNDEFINED) { + nextLayout = getDefaultLayout(); + } + + transitionLayout(&commands, transitionRange, newLayout); - vkCmdCopyBufferToImage(cmdbuffer, stage->buffer, mTextureImage, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©Region); + vkCmdCopyBufferToImage(cmdbuf, stage->buffer, mState->mTextureImage, newVkLayout, 1, ©Region); - transitionLayout(cmdbuffer, transitionRange, getDefaultImageLayout(usage)); + transitionLayout(&commands, transitionRange, nextLayout); } void VulkanTexture::updateImageWithBlit(const PixelBufferDescriptor& hostData, uint32_t width, uint32_t height, uint32_t depth, uint32_t miplevel) { void* mapped = nullptr; - VulkanStageImage const* stage = mStagePool.acquireImage( - hostData.format, hostData.type, width, height); - vmaMapMemory(mContext.allocator, stage->memory, &mapped); + VulkanStageImage const* stage + = mState->mStagePool.acquireImage(hostData.format, hostData.type, width, height); + vmaMapMemory(mState->mAllocator, stage->memory, &mapped); memcpy(mapped, hostData.buffer, hostData.size); - vmaUnmapMemory(mContext.allocator, stage->memory); - vmaFlushAllocation(mContext.allocator, stage->memory, 0, hostData.size); + vmaUnmapMemory(mState->mAllocator, stage->memory); + vmaFlushAllocation(mState->mAllocator, stage->memory, 0, hostData.size); - const VkCommandBuffer cmdbuffer = mContext.commands->get().cmdbuffer; + VulkanCommandBuffer& commands = mState->mCommands->get(); + VkCommandBuffer const cmdbuf = commands.buffer(); + commands.acquire(fvkmemory::resource_ptr::cast(this)); // TODO: support blit-based format conversion for 3D images and cubemaps. const int layer = 0; @@ -314,143 +502,256 @@ void VulkanTexture::updateImageWithBlit(const PixelBufferDescriptor& hostData, u .dstOffsets = { rect[0], rect[1] } }}; - const VkImageSubresourceRange range = { aspect, miplevel, 1, 0, 1 }; + const VkImageSubresourceRange range = { aspect, miplevel, 1, layer, 1 }; - transitionLayout(cmdbuffer, range, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + VulkanLayout const newLayout = VulkanLayout::TRANSFER_DST; + VulkanLayout const oldLayout = getLayout(layer, miplevel); + transitionLayout(&commands, range, newLayout); - vkCmdBlitImage(cmdbuffer, stage->image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, mTextureImage, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, blitRegions, VK_FILTER_NEAREST); + vkCmdBlitImage(cmdbuf, stage->image, imgutil::getVkLayout(VulkanLayout::TRANSFER_SRC), + mState->mTextureImage, imgutil::getVkLayout(newLayout), 1, blitRegions, VK_FILTER_NEAREST); - transitionLayout(cmdbuffer, range, getDefaultImageLayout(usage)); + transitionLayout(&commands, range, oldLayout); } -void VulkanTexture::setPrimaryRange(uint32_t minMiplevel, uint32_t maxMiplevel) { - maxMiplevel = filament::math::min(int(maxMiplevel), int(this->levels - 1)); - mPrimaryViewRange.baseMipLevel = minMiplevel; - mPrimaryViewRange.levelCount = maxMiplevel - minMiplevel + 1; - getImageView(mPrimaryViewRange); +VulkanLayout VulkanTexture::getDefaultLayout() const { + return mState->mDefaultLayout; } -VkImageView VulkanTexture::getAttachmentView(int singleLevel, int singleLayer, - VkImageAspectFlags aspect) { - VkImageSubresourceRange range = { - .aspectMask = aspect, - .baseMipLevel = uint32_t(singleLevel), - .levelCount = uint32_t(1), - .baseArrayLayer = uint32_t(singleLayer), - .layerCount = uint32_t(1), - }; - auto iter = mCachedImageViews.find(range); - if (iter != mCachedImageViews.end()) { - return iter->second; - } - VkImageViewCreateInfo viewInfo = { - .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, - .pNext = nullptr, - .flags = 0, - .image = mTextureImage, - .viewType = VK_IMAGE_VIEW_TYPE_2D, - .format = mVkFormat, - .components = VkComponentMapping{}, - .subresourceRange = range - }; - VkImageView imageView; - vkCreateImageView(mContext.device, &viewInfo, VKALLOC, &imageView); - mCachedImageViews.emplace(range, imageView); - return imageView; +VkImageView VulkanTexture::getAttachmentView(VkImageSubresourceRange range) { + range.levelCount = 1; + range.layerCount = 1; + return getImageView(range, VK_IMAGE_VIEW_TYPE_2D, {}); +} + +VkImageView VulkanTexture::getMultiviewAttachmentView(VkImageSubresourceRange range) { + return getImageView(range, VK_IMAGE_VIEW_TYPE_2D_ARRAY, {}); +} + +VkImageView VulkanTexture::getViewForType(VkImageSubresourceRange const& range, VkImageViewType type) { + return getImageView(range, type, mSwizzle); } -VkImageView VulkanTexture::getImageView(VkImageSubresourceRange range) { - auto iter = mCachedImageViews.find(range); - if (iter != mCachedImageViews.end()) { +VkImageView VulkanTexture::getImageView(VkImageSubresourceRange range, VkImageViewType viewType, + VkComponentMapping swizzle) { + VulkanTextureState::ImageViewKey const key{ range, viewType, swizzle }; + auto iter = mState->mCachedImageViews.find(key); + if (iter != mState->mCachedImageViews.end()) { return iter->second; } VkImageViewCreateInfo viewInfo = { .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, .pNext = nullptr, .flags = 0, - .image = mTextureImage, - .viewType = mViewType, - .format = mVkFormat, - .components = mSwizzle, - .subresourceRange = range + .image = mState->mTextureImage, + .viewType = viewType, + .format = mState->mVkFormat, + .components = swizzle, + .subresourceRange = range, }; VkImageView imageView; - vkCreateImageView(mContext.device, &viewInfo, VKALLOC, &imageView); - mCachedImageViews.emplace(range, imageView); + vkCreateImageView(mState->mDevice, &viewInfo, VKALLOC, &imageView); + mState->mCachedImageViews.emplace(key, imageView); return imageView; } VkImageAspectFlags VulkanTexture::getImageAspect() const { - return isDepthFormat(mVkFormat) ? VK_IMAGE_ASPECT_DEPTH_BIT : - VK_IMAGE_ASPECT_COLOR_BIT; + // Helper function in VulkanUtility + return filament::backend::getImageAspect(mState->mVkFormat); +} + +bool VulkanTexture::transitionLayout(VulkanCommandBuffer* commands, + VkImageSubresourceRange const& range, VulkanLayout newLayout) { + if (transitionLayout(commands->buffer(), range, newLayout)) { + commands->acquire(fvkmemory::resource_ptr::cast(this)); + return true; + } + return false; } -void VulkanTexture::transitionLayout(VkCommandBuffer commands, const VkImageSubresourceRange& range, - VkImageLayout newLayout) { - // In debug builds, ensure that all subresources in the given range have the same layout. - // It's easier to catch a mistake here than with validation, which waits until submission time. - VkImageLayout oldLayout = getVkLayout(range.baseArrayLayer, range.baseMipLevel); -#ifndef NDEBUG - if (oldLayout != VK_IMAGE_LAYOUT_UNDEFINED) { - for (uint32_t layer = 0; layer < range.layerCount; ++layer) { - for (uint32_t level = 0; level < range.levelCount; ++level) { - assert_invariant(getVkLayout(layer + range.baseArrayLayer, - level + range.baseMipLevel) == oldLayout); +bool VulkanTexture::transitionLayout(VkCommandBuffer cmdbuf, VkImageSubresourceRange const& range, + VulkanLayout newLayout) { + VulkanLayout const oldLayout = getLayout(range.baseArrayLayer, range.baseMipLevel); + + uint32_t const firstLayer = range.baseArrayLayer; + uint32_t const lastLayer = firstLayer + range.layerCount; + uint32_t const firstLevel = range.baseMipLevel; + uint32_t const lastLevel = firstLevel + range.levelCount; + + // If we are transitioning more than one layer/level (slice), we need to know whether they are + // all of the same layer. If not, we need to transition slice-by-slice. Otherwise it would + // trigger the validation layer saying that the `oldLayout` provided is incorrect. + // TODO: transition by multiple slices with more sophisticated range finding. + bool transitionSliceBySlice = false; + for (uint32_t i = firstLayer; i < lastLayer; ++i) { + for (uint32_t j = firstLevel; j < lastLevel; ++j) { + if (oldLayout != getLayout(i, j)) { + transitionSliceBySlice = true; + break; } } } -#endif - transitionImageLayout(commands, textureTransitionHelper({ - .image = mTextureImage, + bool hasTransitions = false; + if (transitionSliceBySlice) { + for (uint32_t i = firstLayer; i < lastLayer; ++i) { + for (uint32_t j = firstLevel; j < lastLevel; ++j) { + VulkanLayout const layout = getLayout(i, j); + if (layout == newLayout) { + continue; + } + hasTransitions = hasTransitions || imgutil::transitionLayout(cmdbuf, { + .image = mState->mTextureImage, + .oldLayout = layout, + .newLayout = newLayout, + .subresources = { + .aspectMask = range.aspectMask, + .baseMipLevel = j, + .levelCount = 1, + .baseArrayLayer = i, + .layerCount = 1, + }, + }); + } + } + } else if (newLayout != oldLayout) { + hasTransitions = imgutil::transitionLayout(cmdbuf, { + .image = mState->mTextureImage, .oldLayout = oldLayout, .newLayout = newLayout, .subresources = range, - })); + }); + } + + // Even if we didn't carry out the transition, we should assume that the new layout is defined + // through this call. + setLayout(range, newLayout); + + if (hasTransitions) { +#if FVK_ENABLED(FVK_DEBUG_LAYOUT_TRANSITION) + FVK_LOGD << "transition texture=" << state->mTextureImage << " (" << range.baseArrayLayer + << "," << range.baseMipLevel << ")" << " count=(" << range.layerCount << "," + << range.levelCount << ")" << " from=" << oldLayout << " to=" << newLayout + << " format=" << state->mVkFormat << " depth=" << isVkDepthFormat(state->mVkFormat) + << " slice-by-slice=" << transitionSliceBySlice << utils::io::endl; +#endif + } else { +#if FVK_ENABLED(FVK_DEBUG_LAYOUT_TRANSITION) + FVK_LOGD << "transition texture=" << state->mTextureImage << " (" << range.baseArrayLayer + << "," << range.baseMipLevel << ")" << " count=(" << range.layerCount << "," + << range.levelCount << ")" << " to=" << newLayout + << " is skipped because of no change in layout" << utils::io::endl; +#endif + } + return hasTransitions; +} - const uint32_t first_layer = range.baseArrayLayer; - const uint32_t last_layer = first_layer + range.layerCount; - const uint32_t first_level = range.baseMipLevel; - const uint32_t last_level = first_level + range.levelCount; +void VulkanTexture::samplerToAttachmentBarrier(VulkanCommandBuffer* commands, + VkImageSubresourceRange const& range) { + VkCommandBuffer const cmdbuf = commands->buffer(); + VkImageLayout const layout = + imgutil::getVkLayout(getLayout(range.baseArrayLayer, range.baseMipLevel)); + VkImageMemoryBarrier barrier = { + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, + .srcAccessMask = VK_ACCESS_SHADER_READ_BIT, + .dstAccessMask = + VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + .oldLayout = layout, + .newLayout = layout, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .image = mState->mTextureImage, + .subresourceRange = range, + }; + vkCmdPipelineBarrier(cmdbuf, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + 0, 0, nullptr, 0, nullptr, 1, &barrier); +} - assert_invariant(first_level <= 0xffff && last_level <= 0xffff); - assert_invariant(first_layer <= 0xffff && last_layer <= 0xffff); +void VulkanTexture::attachmentToSamplerBarrier(VulkanCommandBuffer* commands, + VkImageSubresourceRange const& range) { + VkCommandBuffer const cmdbuf = commands->buffer(); + VkImageLayout const layout + = imgutil::getVkLayout(getLayout(range.baseArrayLayer, range.baseMipLevel)); + VkImageMemoryBarrier barrier = { + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, + .srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + .dstAccessMask = VK_ACCESS_SHADER_READ_BIT, + .oldLayout = layout, + .newLayout = layout, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .image = mState->mTextureImage, + .subresourceRange = range, + }; + vkCmdPipelineBarrier(cmdbuf, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &barrier); +} - if (newLayout == VK_IMAGE_LAYOUT_UNDEFINED) { - for (uint32_t layer = first_layer; layer < last_layer; ++layer) { - const uint32_t first = (layer << 16) | first_level; - const uint32_t last = (layer << 16) | last_level; - mSubresourceLayouts.clear(first, last); +void VulkanTexture::setLayout(VkImageSubresourceRange const& range, VulkanLayout newLayout) { + uint32_t const firstLayer = range.baseArrayLayer; + uint32_t const lastLayer = firstLayer + range.layerCount; + uint32_t const firstLevel = range.baseMipLevel; + uint32_t const lastLevel = firstLevel + range.levelCount; + + assert_invariant(firstLevel <= 0xffff && lastLevel <= 0xffff); + assert_invariant(firstLayer <= 0xffff && lastLayer <= 0xffff); + + if (newLayout == VulkanLayout::UNDEFINED) { + for (uint32_t layer = firstLayer; layer < lastLayer; ++layer) { + uint32_t const first = (layer << 16) | firstLevel; + uint32_t const last = (layer << 16) | lastLevel; + mState->mSubresourceLayouts.clear(first, last); } } else { - for (uint32_t layer = first_layer; layer < last_layer; ++layer) { - const uint32_t first = (layer << 16) | first_level; - const uint32_t last = (layer << 16) | last_level; - mSubresourceLayouts.add(first, last, newLayout); + for (uint32_t layer = firstLayer; layer < lastLayer; ++layer) { + uint32_t const first = (layer << 16) | firstLevel; + uint32_t const last = (layer << 16) | lastLevel; + mState->mSubresourceLayouts.add(first, last, newLayout); } } } -// Notifies the texture that a particular subresource's layout has changed. -void VulkanTexture::trackLayout(uint32_t miplevel, uint32_t layer, VkImageLayout layout) { - assert_invariant((miplevel + 1) <= 0xffff && layer <= 0xffff); - const uint32_t first = (layer << 16) | miplevel; - const uint32_t last = (layer << 16) | (miplevel + 1); - if (UTILS_UNLIKELY(layout == VK_IMAGE_LAYOUT_UNDEFINED)) { - mSubresourceLayouts.clear(first, last); - } else { - mSubresourceLayouts.add(first, last, layout); +VulkanLayout VulkanTexture::getLayout(uint32_t layer, uint32_t level) const { + assert_invariant(level <= 0xffff && layer <= 0xffff); + const uint32_t key = (layer << 16) | level; + if (!mState->mSubresourceLayouts.has(key)) { + return VulkanLayout::UNDEFINED; } + return mState->mSubresourceLayouts.get(key); } -VkImageLayout VulkanTexture::getVkLayout(uint32_t layer, uint32_t level) const { - assert_invariant(level <= 0xffff && layer <= 0xffff); - const uint32_t key = (layer << 16) | level; - if (!mSubresourceLayouts.has(key)) { - return VK_IMAGE_LAYOUT_UNDEFINED; +#if FVK_ENABLED(FVK_DEBUG_TEXTURE) +void VulkanTexture::print() const { + uint32_t const firstLayer = 0; + uint32_t const lastLayer = firstLayer + mState->mFullViewRange.layerCount; + uint32_t const firstLevel = 0; + uint32_t const lastLevel = firstLevel + mState->mFullViewRange.levelCount; + + for (uint32_t layer = firstLayer; layer < lastLayer; ++layer) { + for (uint32_t level = firstLevel; level < lastLevel; ++level) { + bool primary = + layer >= mPrimaryViewRange.baseArrayLayer && + layer < (mPrimaryViewRange.baseArrayLayer + mPrimaryViewRange.layerCount) && + level >= mPrimaryViewRange.baseMipLevel && + level < (mPrimaryViewRange.baseMipLevel + mPrimaryViewRange.levelCount); + FVK_LOGD << "[" << mState->mTextureImage << "]: (" << layer << "," << level + << ")=" << getLayout(layer, level) + << " primary=" << primary + << utils::io::endl; + } + } + + for (auto view: mState->mCachedImageViews) { + auto& range = view.first.range; + FVK_LOGD << "[" << mState->mTextureImage << ", imageView=" << view.second << "]=>" + << " (" << range.baseArrayLayer << "," << range.baseMipLevel << ")" + << " count=(" << range.layerCount << "," << range.levelCount << ")" + << " aspect=" << range.aspectMask << " viewType=" << view.first.type + << utils::io::endl; } - return mSubresourceLayouts.get(key); } +#endif } // namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanTexture.h b/filament/backend/src/vulkan/VulkanTexture.h index e947beb0b75..1889adf1212 100644 --- a/filament/backend/src/vulkan/VulkanTexture.h +++ b/filament/backend/src/vulkan/VulkanTexture.h @@ -17,91 +17,201 @@ #ifndef TNT_FILAMENT_BACKEND_VULKANTEXTURE_H #define TNT_FILAMENT_BACKEND_VULKANTEXTURE_H -#include "VulkanDriver.h" +#include "DriverBase.h" + #include "VulkanBuffer.h" -#include "VulkanUtility.h" +#include "VulkanImageUtility.h" +#include "vulkan/memory/Resource.h" +#include "vulkan/memory/ResourcePointer.h" +#include #include +#include + namespace filament::backend { -struct VulkanTexture : public HwTexture { +struct VulkanTextureState : public fvkmemory::Resource { + VulkanTextureState(VkDevice device, VmaAllocator allocator, VulkanCommands* commands, + VulkanStagePool& stagePool, VkFormat format, VkImageViewType viewType, uint8_t levels, + uint8_t layerCount, VulkanLayout defaultLayout, bool isProtected); + + ~VulkanTextureState(); + + struct ImageViewKey { + VkImageSubresourceRange range; // 4 * 5 bytes + VkImageViewType type; // 4 bytes + VkComponentMapping swizzle; // 4 * 4 bytes + + bool operator==(ImageViewKey const& k2) const { + auto const& k1 = *this; + return k1.range.aspectMask == k2.range.aspectMask + && k1.range.baseMipLevel == k2.range.baseMipLevel + && k1.range.levelCount == k2.range.levelCount + && k1.range.baseArrayLayer == k2.range.baseArrayLayer + && k1.range.layerCount == k2.range.layerCount && k1.type == k2.type + && k1.swizzle.r == k2.swizzle.r && k1.swizzle.g == k2.swizzle.g + && k1.swizzle.b == k2.swizzle.b && k1.swizzle.a == k2.swizzle.a; + } + }; + // No implicit padding allowed due to it being a hash key. + static_assert(sizeof(ImageViewKey) == 40); + + using ImageViewHash = utils::hash::MurmurHashFn; + + // The texture with the sidecar owns the sidecar. + fvkmemory::resource_ptr mSidecarMSAA; + VkDeviceMemory mTextureImageMemory = VK_NULL_HANDLE; + + VkFormat const mVkFormat; + VkImageViewType const mViewType; + VkImageSubresourceRange const mFullViewRange; + VkImage mTextureImage = VK_NULL_HANDLE; + VulkanLayout mDefaultLayout; + + bool mIsProtected = false; + + // Track the image layout of each subresource using a sparse range map. + utils::RangeMap mSubresourceLayouts; + std::unordered_map mCachedImageViews; + VulkanStagePool& mStagePool; + VkDevice mDevice; + VmaAllocator mAllocator; + VulkanCommands* mCommands; + bool mIsTransientAttachment; +}; + +struct VulkanTexture : public HwTexture, fvkmemory::Resource { // Standard constructor for user-facing textures. - VulkanTexture(VulkanContext& context, SamplerType target, uint8_t levels, - TextureFormat format, uint8_t samples, uint32_t w, uint32_t h, uint32_t depth, - TextureUsage usage, VulkanStagePool& stagePool, VkComponentMapping swizzle = {}); + VulkanTexture(VkDevice device, VkPhysicalDevice physicalDevice, VulkanContext const& context, + VmaAllocator allocator, fvkmemory::ResourceManager* resourceManager, + VulkanCommands* commands, SamplerType target, uint8_t levels, TextureFormat tformat, + uint8_t samples, uint32_t w, uint32_t h, uint32_t depth, TextureUsage tusage, + VulkanStagePool& stagePool); // Specialized constructor for internally created textures (e.g. from a swap chain) // The texture will never destroy the given VkImage, but it does manages its subresources. - VulkanTexture(VulkanContext& context, VkImage image, VkFormat format, uint8_t samples, - uint32_t w, uint32_t h, TextureUsage usage, VulkanStagePool& stagePool); + VulkanTexture(VkDevice device, VmaAllocator allocator, + fvkmemory::ResourceManager* resourceManager, VulkanCommands* commands, VkImage image, + VkDeviceMemory memory, VkFormat format, uint8_t samples, uint32_t width, uint32_t height, + TextureUsage tusage, VulkanStagePool& stagePool); + + // Constructor for creating a texture view for wrt specific mip range + VulkanTexture(VkDevice device, VkPhysicalDevice physicalDevice, VulkanContext const& context, + VmaAllocator allocator, VulkanCommands* commands, + fvkmemory::resource_ptr src, uint8_t baseLevel, uint8_t levelCount); + + // Constructor for creating a texture view for swizzle. + VulkanTexture(VkDevice device, VkPhysicalDevice physicalDevice, VulkanContext const& context, + VmaAllocator allocator, VulkanCommands* commands, + fvkmemory::resource_ptr src, VkComponentMapping swizzle); - ~VulkanTexture(); + ~VulkanTexture() = default; // Uploads data into a subregion of a 2D or 3D texture. void updateImage(const PixelBufferDescriptor& data, uint32_t width, uint32_t height, uint32_t depth, uint32_t xoffset, uint32_t yoffset, uint32_t zoffset, uint32_t miplevel); // Returns the primary image view, which is used for shader sampling. - VkImageView getPrimaryImageView() const { return mCachedImageViews.at(mPrimaryViewRange); } + VkImageView getPrimaryImageView() { + return getImageView(mPrimaryViewRange, mState->mViewType, mSwizzle); + } - // Sets the min/max range of miplevels in the primary image view. - void setPrimaryRange(uint32_t minMiplevel, uint32_t maxMiplevel); + VkImageViewType getViewType() const { + return mState->mViewType; + } - VkImageSubresourceRange getPrimaryRange() const { return mPrimaryViewRange; } + VkImageSubresourceRange const& getPrimaryViewRange() const { return mPrimaryViewRange; } - VkImageLayout getPrimaryImageLayout() const { - return getVkLayout(mPrimaryViewRange.baseArrayLayer, mPrimaryViewRange.baseMipLevel); + VulkanLayout getPrimaryImageLayout() const { + return getLayout(mPrimaryViewRange.baseArrayLayer, mPrimaryViewRange.baseMipLevel); } + // Returns the layout for the intended use of this texture (and not the expected layout at the + // time of the call. + VulkanLayout getDefaultLayout() const; + // Gets or creates a cached VkImageView for a single subresource that can be used as a render // target attachment. Unlike the primary image view, this always has type VK_IMAGE_VIEW_TYPE_2D // and the identity swizzle. - VkImageView getAttachmentView(int singleLevel, int singleLayer, VkImageAspectFlags aspect); + VkImageView getAttachmentView(VkImageSubresourceRange range); - VkFormat getVkFormat() const { return mVkFormat; } - VkImage getVkImage() const { return mTextureImage; } - VkImageLayout getVkLayout(uint32_t layer, uint32_t level) const; + // Gets or creates a cached VkImageView for a single subresource that can be used as a render + // target attachment when rendering with multiview. + VkImageView getMultiviewAttachmentView(VkImageSubresourceRange range); - void setSidecar(VulkanTexture* sidecar) { mSidecarMSAA = sidecar; } - VulkanTexture* getSidecar() const { return mSidecarMSAA; } + // This is a workaround for the first few frames where we're waiting for the texture to actually + // be uploaded. In that case, we bind the sampler to an empty texture, but the corresponding + // imageView needs to be of the right type. Hence, we provide an option to indicate the + // view type. Swizzle option does not matter in this case. + VkImageView getViewForType(VkImageSubresourceRange const& range, VkImageViewType type); - void transitionLayout(VkCommandBuffer commands, const VkImageSubresourceRange& range, - VkImageLayout newLayout); + VkFormat getVkFormat() const { + return mState->mVkFormat; + } + VkImage getVkImage() const { + return mState->mTextureImage; + } - // Notifies the texture that a particular subresource's layout has changed. - void trackLayout(uint32_t miplevel, uint32_t layer, VkImageLayout layout); + VulkanLayout getLayout(uint32_t layer, uint32_t level) const; - // Gets or creates a cached VkImageView for a range of miplevels and array layers. - VkImageView getImageView(VkImageSubresourceRange range); + void setSidecar(fvkmemory::resource_ptr sidecar) { + mState->mSidecarMSAA = sidecar; + } + + fvkmemory::resource_ptr getSidecar() const { + return mState->mSidecarMSAA; + } + + bool isTransientAttachment() const { + return mState->mIsTransientAttachment; + } + + bool getIsProtected() const { + return mState->mIsProtected; + } + + bool transitionLayout(VulkanCommandBuffer* commands, VkImageSubresourceRange const& range, + VulkanLayout newLayout); + + bool transitionLayout(VkCommandBuffer cmdbuf, VkImageSubresourceRange const& range, + VulkanLayout newLayout); + + void attachmentToSamplerBarrier(VulkanCommandBuffer* commands, + VkImageSubresourceRange const& range); + + void samplerToAttachmentBarrier(VulkanCommandBuffer* commands, + VkImageSubresourceRange const& range); // Returns the preferred data plane of interest for all image views. // For now this always returns either DEPTH or COLOR. VkImageAspectFlags getImageAspect() const; -private: + // For implicit transition like the end of a render pass, we need to be able to set the layout + // manually (outside of calls to transitionLayout). + void setLayout(VkImageSubresourceRange const& range, VulkanLayout newLayout); - void updateImageWithBlit(const PixelBufferDescriptor& hostData, uint32_t width, - uint32_t height, uint32_t depth, uint32_t miplevel); +#if FVK_ENABLED(FVK_DEBUG_TEXTURE) + void print() const; +#endif - VulkanTexture* mSidecarMSAA = nullptr; - const VkFormat mVkFormat; - const VkImageViewType mViewType; - const VkComponentMapping mSwizzle; - VkImage mTextureImage = VK_NULL_HANDLE; - VkDeviceMemory mTextureImageMemory = VK_NULL_HANDLE; +private: + // Gets or creates a cached VkImageView for a range of miplevels, array layers, viewType, and + // swizzle (or not). + VkImageView getImageView(VkImageSubresourceRange range, VkImageViewType viewType, + VkComponentMapping swizzle); - // Track the image layout of each subresource using a sparse range map. - utils::RangeMap mSubresourceLayouts; + void updateImageWithBlit(const PixelBufferDescriptor& hostData, uint32_t width, uint32_t height, + uint32_t depth, uint32_t miplevel); + + fvkmemory::resource_ptr mState; // Track the range of subresources that define the "primary" image view, which is the special // image view that gets bound to an actual texture sampler. VkImageSubresourceRange mPrimaryViewRange; - std::map mCachedImageViews; - VulkanContext& mContext; - VulkanStagePool& mStagePool; + VkComponentMapping mSwizzle {}; }; } // namespace filament::backend diff --git a/filament/backend/src/vulkan/VulkanUtility.cpp b/filament/backend/src/vulkan/VulkanUtility.cpp index 02ba0f0e6c0..889e2bdd2f3 100644 --- a/filament/backend/src/vulkan/VulkanUtility.cpp +++ b/filament/backend/src/vulkan/VulkanUtility.cpp @@ -26,13 +26,6 @@ using namespace bluevk; namespace filament::backend { -void createSemaphore(VkDevice device, VkSemaphore *semaphore) { - VkSemaphoreCreateInfo createInfo = {}; - createInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; - VkResult result = vkCreateSemaphore(device, &createInfo, nullptr, semaphore); - ASSERT_POSTCONDITION(result == VK_SUCCESS, "vkCreateSemaphore error."); -} - VkFormat getVkFormat(ElementType type, bool normalized, bool integer) { using ElementType = ElementType; if (normalized) { @@ -58,7 +51,7 @@ VkFormat getVkFormat(ElementType type, bool normalized, bool integer) { case ElementType::SHORT4: return VK_FORMAT_R16G16B16A16_SNORM; case ElementType::USHORT4: return VK_FORMAT_R16G16B16A16_UNORM; default: - ASSERT_POSTCONDITION(false, "Normalized format does not exist."); + FILAMENT_CHECK_POSTCONDITION(false) << "Normalized format does not exist."; return VK_FORMAT_UNDEFINED; } } @@ -128,8 +121,8 @@ VkFormat getVkFormat(TextureFormat format) { case TextureFormat::RGB8UI: return VK_FORMAT_R8G8B8A8_UINT; case TextureFormat::RGB8I: return VK_FORMAT_R8G8B8A8_SINT; - case TextureFormat::DEPTH24: - return VK_FORMAT_UNDEFINED; + // A 32-bit format but 8 bits are unused. + case TextureFormat::DEPTH24: return VK_FORMAT_X8_D24_UNORM_PACK32; // 32 bits per element. case TextureFormat::R32F: return VK_FORMAT_R32_SFLOAT; @@ -584,7 +577,7 @@ uint32_t getComponentCount(VkFormat format) { return {}; } -VkComponentMapping getSwizzleMap(TextureSwizzle swizzle[4]) { +VkComponentMapping getSwizzleMap(TextureSwizzle const swizzle[4]) { VkComponentMapping map; VkComponentSwizzle* dst = &map.r; for (int i = 0; i < 4; ++i, ++dst) { @@ -611,45 +604,6 @@ VkComponentMapping getSwizzleMap(TextureSwizzle swizzle[4]) { return map; } -VkImageViewType getImageViewType(SamplerType target) { - switch (target) { - case SamplerType::SAMPLER_CUBEMAP: - return VK_IMAGE_VIEW_TYPE_CUBE; - case SamplerType::SAMPLER_2D_ARRAY: - return VK_IMAGE_VIEW_TYPE_2D_ARRAY; - case SamplerType::SAMPLER_CUBEMAP_ARRAY: - return VK_IMAGE_VIEW_TYPE_CUBE_ARRAY; - case SamplerType::SAMPLER_3D: - return VK_IMAGE_VIEW_TYPE_3D; - default: - return VK_IMAGE_VIEW_TYPE_2D; - } -} - -// Between Driver API calls, non-presentable texture images are generally kept either in the -// UNDEFINED layout, or in the usage-specific layout specified by this function. This simple -// convention allows the use of a bitfield to represent layout in RenderPassKey. However there are -// exceptions for depth and for transient use of specialized layouts, which is why VulkanTexture -// tracks actual layout at the subresource level. -VkImageLayout getDefaultImageLayout(TextureUsage usage) { - // Filament sometimes samples from depth while it is bound to the current render target, (e.g. - // SSAO does this while depth writes are disabled) so let's keep it simple and use GENERAL for - // all depth textures. - if (any(usage & TextureUsage::DEPTH_ATTACHMENT)) { - return VK_IMAGE_LAYOUT_GENERAL; - } - - // Filament sometimes samples from one miplevel while writing to another level in the same - // texture (e.g. bloom does this). Moreover we'd like to avoid lots of expensive layout - // transitions. So, keep it simple and use GENERAL for all color-attachable textures. - if (any(usage & TextureUsage::COLOR_ATTACHMENT)) { - return VK_IMAGE_LAYOUT_GENERAL; - } - - // Finally, the layout for an immutable texture is optimal read-only. - return VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; -} - VkShaderStageFlags getShaderStageFlags(ShaderStageFlags stageFlags) { VkShaderStageFlags flags = 0x0; if (any(stageFlags & ShaderStageFlags::VERTEX)) flags |= VK_SHADER_STAGE_VERTEX_BIT; @@ -657,87 +611,6 @@ VkShaderStageFlags getShaderStageFlags(ShaderStageFlags stageFlags) { return flags; } -void transitionImageLayout(VkCommandBuffer cmdbuffer, VulkanLayoutTransition transition) { - if (transition.oldLayout == transition.newLayout) { - return; - } - assert_invariant(transition.image != VK_NULL_HANDLE && "Please call bindToSwapChain."); - VkImageMemoryBarrier barrier = {}; - barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - barrier.oldLayout = transition.oldLayout; - barrier.newLayout = transition.newLayout; - barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.image = transition.image; - barrier.subresourceRange = transition.subresources; - barrier.srcAccessMask = transition.srcAccessMask; - barrier.dstAccessMask = transition.dstAccessMask; - vkCmdPipelineBarrier(cmdbuffer, transition.srcStage, transition.dstStage, 0, 0, nullptr, 0, - nullptr, 1, &barrier); -} - -VulkanLayoutTransition blitterTransitionHelper(VulkanLayoutTransition transition) { - switch (transition.newLayout) { - case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: - case VK_IMAGE_LAYOUT_GENERAL: - transition.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - transition.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - transition.srcStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - transition.dstStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - break; - - case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: - case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR: - default: - transition.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - transition.dstAccessMask = 0; - transition.srcStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - transition.dstStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; - break; - } - return transition; -} - -VulkanLayoutTransition textureTransitionHelper(VulkanLayoutTransition transition) { - switch (transition.newLayout) { - case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: - transition.srcAccessMask = 0; - transition.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - transition.srcStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; - transition.dstStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - break; - case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: - transition.srcAccessMask = 0; - transition.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - transition.srcStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; - transition.dstStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - break; - case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: - case VK_IMAGE_LAYOUT_GENERAL: - case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL: - transition.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - transition.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - transition.srcStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - transition.dstStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - break; - - // We support PRESENT as a target layout to allow blitting from the swap chain. - // See also SwapChain::makePresentable(). - case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: - case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR: - transition.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - transition.dstAccessMask = 0; - transition.srcStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - transition.dstStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; - break; - - default: - PANIC_POSTCONDITION("Unsupported layout transition."); - } - return transition; -} - - bool equivalent(const VkRect2D& a, const VkRect2D& b) { // These are all integers so there's no need for an epsilon. return a.extent.width == b.extent.width && a.extent.height == b.extent.height && @@ -748,24 +621,34 @@ bool equivalent(const VkExtent2D& a, const VkExtent2D& b) { return a.height == b.height && a.width == b.width; } -bool isDepthFormat(VkFormat format) { +VkImageAspectFlags getImageAspect(VkFormat format) { switch (format) { - case VK_FORMAT_D16_UNORM: - case VK_FORMAT_X8_D24_UNORM_PACK32: case VK_FORMAT_D16_UNORM_S8_UINT: case VK_FORMAT_D24_UNORM_S8_UINT: - case VK_FORMAT_D32_SFLOAT: case VK_FORMAT_D32_SFLOAT_S8_UINT: - return true; + return VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; + case VK_FORMAT_D16_UNORM: + case VK_FORMAT_X8_D24_UNORM_PACK32: + case VK_FORMAT_D32_SFLOAT: + return VK_IMAGE_ASPECT_DEPTH_BIT; + case VK_FORMAT_S8_UINT: + return VK_IMAGE_ASPECT_STENCIL_BIT; default: - return false; + return VK_IMAGE_ASPECT_COLOR_BIT; } } +bool isVkDepthFormat(VkFormat format) { + return (getImageAspect(format) & VK_IMAGE_ASPECT_DEPTH_BIT) != 0; +} + +bool isVkStencilFormat(VkFormat format) { + return (getImageAspect(format) & VK_IMAGE_ASPECT_STENCIL_BIT) != 0; +} + static uint32_t mostSignificantBit(uint32_t x) { return 1ul << (31ul - utils::clz(x)); } uint8_t reduceSampleCount(uint8_t sampleCount, VkSampleCountFlags mask) { - assert_invariant(utils::popcount(sampleCount) == 1); if (sampleCount & mask) { return sampleCount; } @@ -773,17 +656,3 @@ uint8_t reduceSampleCount(uint8_t sampleCount, VkSampleCountFlags mask) { } } // namespace filament::backend - -bool operator<(const VkImageSubresourceRange& a, const VkImageSubresourceRange& b) { - if (a.aspectMask < b.aspectMask) return true; - if (a.aspectMask > b.aspectMask) return false; - if (a.baseMipLevel < b.baseMipLevel) return true; - if (a.baseMipLevel > b.baseMipLevel) return false; - if (a.levelCount < b.levelCount) return true; - if (a.levelCount > b.levelCount) return false; - if (a.baseArrayLayer < b.baseArrayLayer) return true; - if (a.baseArrayLayer > b.baseArrayLayer) return false; - if (a.layerCount < b.layerCount) return true; - if (a.layerCount > b.layerCount) return false; - return false; -} diff --git a/filament/backend/src/vulkan/VulkanUtility.h b/filament/backend/src/vulkan/VulkanUtility.h index 9caa9d256b4..33be80d3fa8 100644 --- a/filament/backend/src/vulkan/VulkanUtility.h +++ b/filament/backend/src/vulkan/VulkanUtility.h @@ -19,24 +19,15 @@ #include +#include #include #include -namespace filament::backend { +#include -struct VulkanLayoutTransition { - VkImage image; - VkImageLayout oldLayout; - VkImageLayout newLayout; - VkImageSubresourceRange subresources; - VkPipelineStageFlags srcStage; - VkAccessFlags srcAccessMask; - VkPipelineStageFlags dstStage; - VkAccessFlags dstAccessMask; -}; +namespace filament::backend { -void createSemaphore(VkDevice device, VkSemaphore* semaphore); VkFormat getVkFormat(ElementType type, bool normalized, bool integer); VkFormat getVkFormat(TextureFormat format); VkFormat getVkFormat(PixelDataFormat format, PixelDataType type); @@ -48,26 +39,16 @@ VkCullModeFlags getCullMode(CullingMode mode); VkFrontFace getFrontFace(bool inverseFrontFaces); PixelDataType getComponentType(VkFormat format); uint32_t getComponentCount(VkFormat format); -VkComponentMapping getSwizzleMap(TextureSwizzle swizzle[4]); -VkImageViewType getImageViewType(SamplerType target); -VkImageLayout getDefaultImageLayout(TextureUsage usage); +VkComponentMapping getSwizzleMap(TextureSwizzle const swizzle[4]); VkShaderStageFlags getShaderStageFlags(ShaderStageFlags stageFlags); -void transitionImageLayout(VkCommandBuffer cmdbuffer, VulkanLayoutTransition transition); - -// Helper function for populating barrier fields based on the desired image layout. -// This logic is specific to blitting. -VulkanLayoutTransition blitterTransitionHelper(VulkanLayoutTransition transition); - -// Helper function for populating barrier fields based on the desired image layout. -// This logic is specific to texturing. -VulkanLayoutTransition textureTransitionHelper(VulkanLayoutTransition transition); - bool equivalent(const VkRect2D& a, const VkRect2D& b); bool equivalent(const VkExtent2D& a, const VkExtent2D& b); -bool isDepthFormat(VkFormat format); -uint8_t reduceSampleCount(uint8_t sampleCount, VkSampleCountFlags mask); +bool isVkDepthFormat(VkFormat format); +bool isVkStencilFormat(VkFormat format); +VkImageAspectFlags getImageAspect(VkFormat format); +uint8_t reduceSampleCount(uint8_t sampleCount, VkSampleCountFlags mask); // Helper function for the vkEnumerateX methods. These methods have the format of // VkResult vkEnumerateX(InputType1 arg1, InputTyp2 arg2, ..., uint32_t* size, @@ -76,13 +57,13 @@ uint8_t reduceSampleCount(uint8_t sampleCount, VkSampleCountFlags mask); // considered, but because the "variadic" part of the vk methods (i.e. the inputs) are before the // non-variadic parts, this breaks the template type matching logic. Hence, we use a macro approach // here. -#define EXPAND_ENUM(...)\ - uint32_t size = 0;\ - VkResult result = func(__VA_ARGS__, nullptr);\ - ASSERT_POSTCONDITION(result == VK_SUCCESS, "enumerate size error");\ - utils::FixedCapacityVector ret(size);\ - result = func(__VA_ARGS__, ret.data());\ - ASSERT_POSTCONDITION(result == VK_SUCCESS, "enumerate error");\ +#define EXPAND_ENUM(...) \ + uint32_t size = 0; \ + VkResult result = func(__VA_ARGS__, nullptr); \ + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) << "enumerate size error"; \ + utils::FixedCapacityVector ret(size); \ + result = func(__VA_ARGS__, ret.data()); \ + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) << "enumerate error"; \ return std::move(ret); #define EXPAND_ENUM_NO_ARGS() EXPAND_ENUM(&size) @@ -110,8 +91,466 @@ utils::FixedCapacityVector enumerate( #undef EXPAND_ENUM_NO_ARGS #undef EXPAND_ENUM_ARGS -} // namespace filament::backend +// Useful shorthands +using VkFormatList = utils::FixedCapacityVector; + +// Copied from +// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkFormat.html +constexpr VkFormat ALL_VK_FORMATS[] = { + VK_FORMAT_UNDEFINED, + VK_FORMAT_R4G4_UNORM_PACK8, + VK_FORMAT_R4G4B4A4_UNORM_PACK16, + VK_FORMAT_B4G4R4A4_UNORM_PACK16, + VK_FORMAT_R5G6B5_UNORM_PACK16, + VK_FORMAT_B5G6R5_UNORM_PACK16, + VK_FORMAT_R5G5B5A1_UNORM_PACK16, + VK_FORMAT_B5G5R5A1_UNORM_PACK16, + VK_FORMAT_A1R5G5B5_UNORM_PACK16, + VK_FORMAT_R8_UNORM, + VK_FORMAT_R8_SNORM, + VK_FORMAT_R8_USCALED, + VK_FORMAT_R8_SSCALED, + VK_FORMAT_R8_UINT, + VK_FORMAT_R8_SINT, + VK_FORMAT_R8_SRGB, + VK_FORMAT_R8G8_UNORM, + VK_FORMAT_R8G8_SNORM, + VK_FORMAT_R8G8_USCALED, + VK_FORMAT_R8G8_SSCALED, + VK_FORMAT_R8G8_UINT, + VK_FORMAT_R8G8_SINT, + VK_FORMAT_R8G8_SRGB, + VK_FORMAT_R8G8B8_UNORM, + VK_FORMAT_R8G8B8_SNORM, + VK_FORMAT_R8G8B8_USCALED, + VK_FORMAT_R8G8B8_SSCALED, + VK_FORMAT_R8G8B8_UINT, + VK_FORMAT_R8G8B8_SINT, + VK_FORMAT_R8G8B8_SRGB, + VK_FORMAT_B8G8R8_UNORM, + VK_FORMAT_B8G8R8_SNORM, + VK_FORMAT_B8G8R8_USCALED, + VK_FORMAT_B8G8R8_SSCALED, + VK_FORMAT_B8G8R8_UINT, + VK_FORMAT_B8G8R8_SINT, + VK_FORMAT_B8G8R8_SRGB, + VK_FORMAT_R8G8B8A8_UNORM, + VK_FORMAT_R8G8B8A8_SNORM, + VK_FORMAT_R8G8B8A8_USCALED, + VK_FORMAT_R8G8B8A8_SSCALED, + VK_FORMAT_R8G8B8A8_UINT, + VK_FORMAT_R8G8B8A8_SINT, + VK_FORMAT_R8G8B8A8_SRGB, + VK_FORMAT_B8G8R8A8_UNORM, + VK_FORMAT_B8G8R8A8_SNORM, + VK_FORMAT_B8G8R8A8_USCALED, + VK_FORMAT_B8G8R8A8_SSCALED, + VK_FORMAT_B8G8R8A8_UINT, + VK_FORMAT_B8G8R8A8_SINT, + VK_FORMAT_B8G8R8A8_SRGB, + VK_FORMAT_A8B8G8R8_UNORM_PACK32, + VK_FORMAT_A8B8G8R8_SNORM_PACK32, + VK_FORMAT_A8B8G8R8_USCALED_PACK32, + VK_FORMAT_A8B8G8R8_SSCALED_PACK32, + VK_FORMAT_A8B8G8R8_UINT_PACK32, + VK_FORMAT_A8B8G8R8_SINT_PACK32, + VK_FORMAT_A8B8G8R8_SRGB_PACK32, + VK_FORMAT_A2R10G10B10_UNORM_PACK32, + VK_FORMAT_A2R10G10B10_SNORM_PACK32, + VK_FORMAT_A2R10G10B10_USCALED_PACK32, + VK_FORMAT_A2R10G10B10_SSCALED_PACK32, + VK_FORMAT_A2R10G10B10_UINT_PACK32, + VK_FORMAT_A2R10G10B10_SINT_PACK32, + VK_FORMAT_A2B10G10R10_UNORM_PACK32, + VK_FORMAT_A2B10G10R10_SNORM_PACK32, + VK_FORMAT_A2B10G10R10_USCALED_PACK32, + VK_FORMAT_A2B10G10R10_SSCALED_PACK32, + VK_FORMAT_A2B10G10R10_UINT_PACK32, + VK_FORMAT_A2B10G10R10_SINT_PACK32, + VK_FORMAT_R16_UNORM, + VK_FORMAT_R16_SNORM, + VK_FORMAT_R16_USCALED, + VK_FORMAT_R16_SSCALED, + VK_FORMAT_R16_UINT, + VK_FORMAT_R16_SINT, + VK_FORMAT_R16_SFLOAT, + VK_FORMAT_R16G16_UNORM, + VK_FORMAT_R16G16_SNORM, + VK_FORMAT_R16G16_USCALED, + VK_FORMAT_R16G16_SSCALED, + VK_FORMAT_R16G16_UINT, + VK_FORMAT_R16G16_SINT, + VK_FORMAT_R16G16_SFLOAT, + VK_FORMAT_R16G16B16_UNORM, + VK_FORMAT_R16G16B16_SNORM, + VK_FORMAT_R16G16B16_USCALED, + VK_FORMAT_R16G16B16_SSCALED, + VK_FORMAT_R16G16B16_UINT, + VK_FORMAT_R16G16B16_SINT, + VK_FORMAT_R16G16B16_SFLOAT, + VK_FORMAT_R16G16B16A16_UNORM, + VK_FORMAT_R16G16B16A16_SNORM, + VK_FORMAT_R16G16B16A16_USCALED, + VK_FORMAT_R16G16B16A16_SSCALED, + VK_FORMAT_R16G16B16A16_UINT, + VK_FORMAT_R16G16B16A16_SINT, + VK_FORMAT_R16G16B16A16_SFLOAT, + VK_FORMAT_R32_UINT, + VK_FORMAT_R32_SINT, + VK_FORMAT_R32_SFLOAT, + VK_FORMAT_R32G32_UINT, + VK_FORMAT_R32G32_SINT, + VK_FORMAT_R32G32_SFLOAT, + VK_FORMAT_R32G32B32_UINT, + VK_FORMAT_R32G32B32_SINT, + VK_FORMAT_R32G32B32_SFLOAT, + VK_FORMAT_R32G32B32A32_UINT, + VK_FORMAT_R32G32B32A32_SINT, + VK_FORMAT_R32G32B32A32_SFLOAT, + VK_FORMAT_R64_UINT, + VK_FORMAT_R64_SINT, + VK_FORMAT_R64_SFLOAT, + VK_FORMAT_R64G64_UINT, + VK_FORMAT_R64G64_SINT, + VK_FORMAT_R64G64_SFLOAT, + VK_FORMAT_R64G64B64_UINT, + VK_FORMAT_R64G64B64_SINT, + VK_FORMAT_R64G64B64_SFLOAT, + VK_FORMAT_R64G64B64A64_UINT, + VK_FORMAT_R64G64B64A64_SINT, + VK_FORMAT_R64G64B64A64_SFLOAT, + VK_FORMAT_B10G11R11_UFLOAT_PACK32, + VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, + VK_FORMAT_D16_UNORM, + VK_FORMAT_X8_D24_UNORM_PACK32, + VK_FORMAT_D32_SFLOAT, + VK_FORMAT_S8_UINT, + VK_FORMAT_D16_UNORM_S8_UINT, + VK_FORMAT_D24_UNORM_S8_UINT, + VK_FORMAT_D32_SFLOAT_S8_UINT, + VK_FORMAT_BC1_RGB_UNORM_BLOCK, + VK_FORMAT_BC1_RGB_SRGB_BLOCK, + VK_FORMAT_BC1_RGBA_UNORM_BLOCK, + VK_FORMAT_BC1_RGBA_SRGB_BLOCK, + VK_FORMAT_BC2_UNORM_BLOCK, + VK_FORMAT_BC2_SRGB_BLOCK, + VK_FORMAT_BC3_UNORM_BLOCK, + VK_FORMAT_BC3_SRGB_BLOCK, + VK_FORMAT_BC4_UNORM_BLOCK, + VK_FORMAT_BC4_SNORM_BLOCK, + VK_FORMAT_BC5_UNORM_BLOCK, + VK_FORMAT_BC5_SNORM_BLOCK, + VK_FORMAT_BC6H_UFLOAT_BLOCK, + VK_FORMAT_BC6H_SFLOAT_BLOCK, + VK_FORMAT_BC7_UNORM_BLOCK, + VK_FORMAT_BC7_SRGB_BLOCK, + VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, + VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK, + VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, + VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK, + VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, + VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, + VK_FORMAT_EAC_R11_UNORM_BLOCK, + VK_FORMAT_EAC_R11_SNORM_BLOCK, + VK_FORMAT_EAC_R11G11_UNORM_BLOCK, + VK_FORMAT_EAC_R11G11_SNORM_BLOCK, + VK_FORMAT_ASTC_4x4_UNORM_BLOCK, + VK_FORMAT_ASTC_4x4_SRGB_BLOCK, + VK_FORMAT_ASTC_5x4_UNORM_BLOCK, + VK_FORMAT_ASTC_5x4_SRGB_BLOCK, + VK_FORMAT_ASTC_5x5_UNORM_BLOCK, + VK_FORMAT_ASTC_5x5_SRGB_BLOCK, + VK_FORMAT_ASTC_6x5_UNORM_BLOCK, + VK_FORMAT_ASTC_6x5_SRGB_BLOCK, + VK_FORMAT_ASTC_6x6_UNORM_BLOCK, + VK_FORMAT_ASTC_6x6_SRGB_BLOCK, + VK_FORMAT_ASTC_8x5_UNORM_BLOCK, + VK_FORMAT_ASTC_8x5_SRGB_BLOCK, + VK_FORMAT_ASTC_8x6_UNORM_BLOCK, + VK_FORMAT_ASTC_8x6_SRGB_BLOCK, + VK_FORMAT_ASTC_8x8_UNORM_BLOCK, + VK_FORMAT_ASTC_8x8_SRGB_BLOCK, + VK_FORMAT_ASTC_10x5_UNORM_BLOCK, + VK_FORMAT_ASTC_10x5_SRGB_BLOCK, + VK_FORMAT_ASTC_10x6_UNORM_BLOCK, + VK_FORMAT_ASTC_10x6_SRGB_BLOCK, + VK_FORMAT_ASTC_10x8_UNORM_BLOCK, + VK_FORMAT_ASTC_10x8_SRGB_BLOCK, + VK_FORMAT_ASTC_10x10_UNORM_BLOCK, + VK_FORMAT_ASTC_10x10_SRGB_BLOCK, + VK_FORMAT_ASTC_12x10_UNORM_BLOCK, + VK_FORMAT_ASTC_12x10_SRGB_BLOCK, + VK_FORMAT_ASTC_12x12_UNORM_BLOCK, + VK_FORMAT_ASTC_12x12_SRGB_BLOCK, + VK_FORMAT_G8B8G8R8_422_UNORM, + VK_FORMAT_B8G8R8G8_422_UNORM, + VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, + VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, + VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM, + VK_FORMAT_G8_B8R8_2PLANE_422_UNORM, + VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM, + VK_FORMAT_R10X6_UNORM_PACK16, + VK_FORMAT_R10X6G10X6_UNORM_2PACK16, + VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16, + VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16, + VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16, + VK_FORMAT_R12X4_UNORM_PACK16, + VK_FORMAT_R12X4G12X4_UNORM_2PACK16, + VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16, + VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16, + VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16, + VK_FORMAT_G16B16G16R16_422_UNORM, + VK_FORMAT_B16G16R16G16_422_UNORM, + VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM, + VK_FORMAT_G16_B16R16_2PLANE_420_UNORM, + VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM, + VK_FORMAT_G16_B16R16_2PLANE_422_UNORM, + VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM, + VK_FORMAT_G8_B8R8_2PLANE_444_UNORM, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16, + VK_FORMAT_G16_B16R16_2PLANE_444_UNORM, + VK_FORMAT_A4R4G4B4_UNORM_PACK16, + VK_FORMAT_A4B4G4R4_UNORM_PACK16, + VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK, + VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK, + VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK, + VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK, + VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK, + VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK, + VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK, + VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK, + VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK, + VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK, + VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK, + VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK, + VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK, + VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK, + VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG, + VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG, + VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG, + VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG, + VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG, + VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG, + VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG, + VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG, +// Not supported (yet) by bluevk +// VK_FORMAT_R16G16_SFIXED5_NV, +// VK_FORMAT_A1B5G5R5_UNORM_PACK16_KHR, +// VK_FORMAT_A8_UNORM_KHR, +// VK_FORMAT_A8_UNORM, + VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT, + VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT, + VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT, + VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT, + VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT, + VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT, + VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT, + VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT, + VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT, + VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT, + VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT, + VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT, + VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT, + VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT, + VK_FORMAT_G8B8G8R8_422_UNORM_KHR, + VK_FORMAT_B8G8R8G8_422_UNORM_KHR, + VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR, + VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR, + VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR, + VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR, + VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR, + VK_FORMAT_R10X6_UNORM_PACK16_KHR, + VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR, + VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR, + VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR, + VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR, + VK_FORMAT_R12X4_UNORM_PACK16_KHR, + VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR, + VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR, + VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR, + VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR, + VK_FORMAT_G16B16G16R16_422_UNORM_KHR, + VK_FORMAT_B16G16R16G16_422_UNORM_KHR, + VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR, + VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR, + VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR, + VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR, + VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR, + VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT, + VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT, + VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT, + VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT, + VK_FORMAT_R16G16_S10_5_NV, +}; + +// An Array that will be statically fixed in capacity, but the "size" (as in user added elements) is +// variable. Note that this class is movable. +template +class CappedArray { +private: + using FixedSizeArray = std::array; + +public: + using const_iterator = typename FixedSizeArray::const_iterator; + using iterator = typename FixedSizeArray::iterator; + + CappedArray() = default; + + // Delete copy constructor/assignment. + CappedArray(CappedArray const& rhs) = delete; + CappedArray& operator=(CappedArray& rhs) = delete; + + CappedArray(CappedArray&& rhs) noexcept { + this->swap(rhs); + } + + CappedArray& operator=(CappedArray&& rhs) noexcept { + this->swap(rhs); + return *this; + } + + inline ~CappedArray() { + clear(); + } + + inline const_iterator begin() const { + if (mInd == 0) { + return mArray.cend(); + } + return mArray.cbegin(); + } + + inline const_iterator end() const { + if (mInd > 0 && mInd < CAPACITY) { + return mArray.begin() + mInd; + } + return mArray.cend(); + } + + inline iterator begin() { + if (mInd == 0) { + return mArray.end(); + } + return mArray.begin(); + } + + inline iterator end() { + if (mInd > 0 && mInd < CAPACITY) { + return mArray.begin() + mInd; + } + return mArray.end(); + } + + inline T back() { + assert_invariant(mInd > 0); + return *(mArray.begin() + mInd); + } -bool operator<(const VkImageSubresourceRange& a, const VkImageSubresourceRange& b); + inline void pop_back() { + assert_invariant(mInd > 0); + mInd--; + } + + inline const_iterator find(T item) { + return std::find(begin(), end(), item); + } + + inline void insert(T item) { + assert_invariant(mInd < CAPACITY); + mArray[mInd++] = item; + } + + inline void erase(T item) { + PANIC_PRECONDITION("CappedArray::erase should not be called"); + } + + inline void clear() { + if (mInd == 0) { + return; + } + mInd = 0; + } + + inline T& operator[](uint16_t ind) { + return mArray[ind]; + } + + inline T const& operator[](uint16_t ind) const { + return mArray[ind]; + } + + inline uint32_t size() const { + return mInd; + } + + T* data() { + return mArray.data(); + } + + T const* data() const { + return mArray.data(); + } + + bool operator==(CappedArray const& b) const { + return this->mArray == b.mArray; + } + +private: + void swap(CappedArray& rhs) { + std::swap(mArray, rhs.mArray); + std::swap(mInd, rhs.mInd); + } + + FixedSizeArray mArray; + uint32_t mInd = 0; +}; + +using UniformBufferBitmask = utils::bitset64; +using SamplerBitmask = utils::bitset64; + +// We only have at most one input attachment, so this bitmask exists only to make the code more +// general. +using InputAttachmentBitmask = utils::bitset64; + +template +static constexpr uint8_t getVertexStageShift() noexcept { + // We assume the bottom half of bits are for vertex stages. + return 0; +} + +template +static constexpr uint8_t getFragmentStageShift() noexcept { + // We assume the top half of bits are for fragment stages. + return sizeof(Bitmask) * 4; +} + +// We have at most 4 descriptor sets. This is to indicate which ones are active. +using DescriptorSetMask = utils::bitset8; + + +} // namespace filament::backend #endif // TNT_FILAMENT_BACKEND_VULKANUTILITY_H diff --git a/filament/backend/src/vulkan/caching/VulkanDescriptorSetManager.cpp b/filament/backend/src/vulkan/caching/VulkanDescriptorSetManager.cpp new file mode 100644 index 00000000000..19aa989b8c0 --- /dev/null +++ b/filament/backend/src/vulkan/caching/VulkanDescriptorSetManager.cpp @@ -0,0 +1,506 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "VulkanDescriptorSetManager.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +namespace filament::backend { + +namespace { + +using BitmaskGroup = VulkanDescriptorSetLayout::Bitmask; +using DescriptorCount = VulkanDescriptorSetLayout::Count; +using DescriptorSetLayoutArray = VulkanDescriptorSetManager::DescriptorSetLayoutArray; +using BitmaskGroupHashFn = utils::hash::MurmurHashFn; +struct BitmaskGroupEqual { + bool operator()(BitmaskGroup const& k1, BitmaskGroup const& k2) const { + return k1 == k2; + } +}; + +// We create a pool for each layout as defined by the number of descriptors of each type. For +// example, a layout of +// 'A' => +// layout(binding = 0, set = 1) uniform {}; +// layout(binding = 1, set = 1) sampler1; +// layout(binding = 2, set = 1) sampler2; +// +// would be equivalent to +// 'B' => +// layout(binding = 1, set = 2) uniform {}; +// layout(binding = 2, set = 2) sampler2; +// layout(binding = 3, set = 2) sampler3; +// +// TODO: we might do better if we understand the types of unique layouts and can combine them in a +// single pool without too much waste. +class DescriptorPool { +public: + DescriptorPool(VkDevice device, DescriptorCount const& count, uint16_t capacity) + : mDevice(device), + mCount(count), + mCapacity(capacity), + mSize(0), + mUnusedCount(0) { + DescriptorCount const actual = mCount * capacity; + VkDescriptorPoolSize sizes[4]; + uint8_t npools = 0; + if (actual.ubo) { + sizes[npools++] = { + .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + .descriptorCount = actual.ubo, + }; + } + if (actual.dynamicUbo) { + sizes[npools++] = { + .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, + .descriptorCount = actual.dynamicUbo, + }; + } + if (actual.sampler) { + sizes[npools++] = { + .type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + .descriptorCount = actual.sampler, + }; + } + if (actual.inputAttachment) { + sizes[npools++] = { + .type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, + .descriptorCount = actual.inputAttachment, + }; + } + VkDescriptorPoolCreateInfo info{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .maxSets = capacity, + .poolSizeCount = npools, + .pPoolSizes = sizes, + }; + vkCreateDescriptorPool(mDevice, &info, VKALLOC, &mPool); + } + + DescriptorPool(DescriptorPool const&) = delete; + DescriptorPool& operator=(DescriptorPool const&) = delete; + + ~DescriptorPool() { + vkDestroyDescriptorPool(mDevice, mPool, VKALLOC); + } + + uint16_t const& capacity() { + return mCapacity; + } + + // A convenience method for checking if this pool can allocate sets for a given layout. + inline bool canAllocate(DescriptorCount const& count) { + return count == mCount; + } + + VkDescriptorSet obtainSet(VkDescriptorSetLayout vklayout) { + auto itr = findSets(vklayout); + if (itr != mUnused.end()) { + // If we don't have any unused, then just return an empty handle. + if (itr->second.empty()) { + return VK_NULL_HANDLE; + } + std::vector& sets = itr->second; + auto set = sets.back(); + sets.pop_back(); + mUnusedCount--; + return set; + } + if (mSize + 1 > mCapacity) { + return VK_NULL_HANDLE; + } + // Creating a new set + VkDescriptorSetLayout layouts[1] = {vklayout}; + VkDescriptorSetAllocateInfo allocInfo = { + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, + .pNext = nullptr, + .descriptorPool = mPool, + .descriptorSetCount = 1, + .pSetLayouts = layouts, + }; + VkDescriptorSet vkSet; + UTILS_UNUSED VkResult result = vkAllocateDescriptorSets(mDevice, &allocInfo, &vkSet); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) + << "Failed to allocate descriptor set code=" << result << " size=" << mSize + << " capacity=" << mCapacity << " count=" << mUnusedCount; + mSize++; + return vkSet; + } + + void recycle(VkDescriptorSetLayout vklayout, VkDescriptorSet vkSet) { + // We are recycling - release the set back into the pool. Note that the + // vk handle has not changed, but we need to change the backend handle to allow + // for proper refcounting of resources referenced in this set. + auto itr = findSets(vklayout); + if (itr != mUnused.end()) { + itr->second.push_back(vkSet); + } else { + mUnused.push_back(std::make_pair(vklayout, std::vector {vkSet})); + } + mUnusedCount++; + } + +private: + using UnusedSets = std::pair>; + using UnusedSetMap = std::vector; + + inline UnusedSetMap::iterator findSets(VkDescriptorSetLayout vklayout) { + return std::find_if(mUnused.begin(), mUnused.end(), [vklayout](auto const& value) { + return value.first == vklayout; + }); + } + + VkDevice mDevice; + VkDescriptorPool mPool; + DescriptorCount const mCount; + uint16_t const mCapacity; + + // Tracks the number of allocated descriptor sets. + uint16_t mSize; + // Tracks the number of in-use descriptor sets. + uint16_t mUnusedCount; + + // This maps a layout to a list of descriptor sets allocated for that layout. + UnusedSetMap mUnused; +}; + +template +struct Equal { + bool operator()(Key const& k1, Key const& k2) const { + return 0 == memcmp((const void*) &k1, (const void*) &k2, sizeof(Key)); + } +}; + +template +uint32_t createBindings(VkDescriptorSetLayoutBinding* toBind, uint32_t count, VkDescriptorType type, + Bitmask const& mask) { + Bitmask alreadySeen; + mask.forEachSetBit([&](size_t index) { + VkShaderStageFlags stages = 0; + uint32_t binding = 0; + if (index < getFragmentStageShift()) { + binding = (uint32_t) index; + stages |= VK_SHADER_STAGE_VERTEX_BIT; + auto fragIndex = index + getFragmentStageShift(); + if (mask.test(fragIndex)) { + stages |= VK_SHADER_STAGE_FRAGMENT_BIT; + alreadySeen.set(fragIndex); + } + } else if (!alreadySeen.test(index)) { + // We are in fragment stage bits + binding = (uint32_t) (index - getFragmentStageShift()); + stages |= VK_SHADER_STAGE_FRAGMENT_BIT; + } + + if (stages) { + toBind[count++] = { + .binding = binding, + .descriptorType = type, + .descriptorCount = 1, + .stageFlags = stages, + }; + } + }); + return count; +} + +inline VkDescriptorSetLayout createLayout(VkDevice device, BitmaskGroup const& bitmaskGroup) { + // Note that the following *needs* to be static so that VkDescriptorSetLayoutCreateInfo will not + // refer to stack memory. + VkDescriptorSetLayoutBinding toBind[VulkanDescriptorSetLayout::MAX_BINDINGS]; + uint32_t count = 0; + + count = createBindings(toBind, count, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, + bitmaskGroup.dynamicUbo); + count = createBindings(toBind, count, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, bitmaskGroup.ubo); + count = createBindings(toBind, count, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + bitmaskGroup.sampler); + count = createBindings(toBind, count, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, + bitmaskGroup.inputAttachment); + + assert_invariant(count != 0 && "Need at least one binding for descriptor set layout."); + VkDescriptorSetLayoutCreateInfo dlinfo = { + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, + .pNext = nullptr, + .bindingCount = count, + .pBindings = toBind, + }; + + VkDescriptorSetLayout layout; + vkCreateDescriptorSetLayout(device, &dlinfo, VKALLOC, &layout); + return layout; +} + +} // anonymous namespace + +// This is an ever-expanding pool of sets where it +// 1. Keeps a list of smaller pools of different layout-dimensions. +// 2. Will add a pool if existing pool are not compatible with the requested layout o runs out. +class VulkanDescriptorSetManager::DescriptorInfinitePool { +private: + static constexpr uint16_t EXPECTED_SET_COUNT = 10; + static constexpr float SET_COUNT_GROWTH_FACTOR = 1.5; + +public: + DescriptorInfinitePool(VkDevice device) + : mDevice(device) {} + + VkDescriptorSet obtainSet(fvkmemory::resource_ptr layout) { + auto const vklayout = layout->getVkLayout(); + DescriptorPool* sameTypePool = nullptr; + for (auto& pool: mPools) { + if (!pool->canAllocate(layout->count)) { + continue; + } + if (auto set = pool->obtainSet(vklayout); set != VK_NULL_HANDLE) { + return set; + } + if (!sameTypePool || sameTypePool->capacity() < pool->capacity()) { + sameTypePool = pool.get(); + } + } + + uint16_t capacity = EXPECTED_SET_COUNT; + if (sameTypePool) { + // Exponentially increase the size of the pool to ensure we don't hit this too often. + capacity = std::ceil(sameTypePool->capacity() * SET_COUNT_GROWTH_FACTOR); + } + + // We need to increase the set of pools by one. + mPools.push_back(std::make_unique(mDevice, + DescriptorCount::fromLayoutBitmask(layout->bitmask), capacity)); + auto& pool = mPools.back(); + auto ret = pool->obtainSet(vklayout); + assert_invariant(ret != VK_NULL_HANDLE && "failed to obtain a set?"); + return ret; + } + + void recycle(DescriptorCount const& count, VkDescriptorSetLayout vklayout, + VkDescriptorSet vkSet) { + for (auto& pool: mPools) { + if (!pool->canAllocate(count)) { + continue; + } + pool->recycle(vklayout, vkSet); + break; + } + } + +private: + VkDevice mDevice; + std::vector> mPools; +}; + +class VulkanDescriptorSetManager::DescriptorSetLayoutManager { +public: + DescriptorSetLayoutManager(VkDevice device) + : mDevice(device) {} + + VkDescriptorSetLayout getVkLayout(VulkanDescriptorSetLayout::Bitmask const& bitmasks) { + if (auto itr = mVkLayouts.find(bitmasks); itr != mVkLayouts.end()) { + return itr->second; + } + auto vklayout = createLayout(mDevice, bitmasks); + mVkLayouts[bitmasks] = vklayout; + return vklayout; + } + + ~DescriptorSetLayoutManager() { + for (auto& itr: mVkLayouts) { + vkDestroyDescriptorSetLayout(mDevice, itr.second, VKALLOC); + } + } + +private: + VkDevice mDevice; + tsl::robin_map + mVkLayouts; +}; + + +VulkanDescriptorSetManager::VulkanDescriptorSetManager(VkDevice device, + fvkmemory::ResourceManager* resourceManager) + : mDevice(device), + mResourceManager(resourceManager), + mLayoutManager(std::make_unique(device)), + mDescriptorPool(std::make_unique(device)) {} + +VulkanDescriptorSetManager::~VulkanDescriptorSetManager() = default; + +void VulkanDescriptorSetManager::terminate() noexcept{ + mLayoutManager.reset(); + mDescriptorPool.reset(); + clearHistory(); +} + +// bind() is not really binding the set but just stashing until we have all the info +// (pipelinelayout). +void VulkanDescriptorSetManager::bind(uint8_t setIndex, + fvkmemory::resource_ptr set, + backend::DescriptorSetOffsetArray&& offsets) { + set->setOffsets(std::move(offsets)); + mStashedSets[setIndex] = set; +} + +void VulkanDescriptorSetManager::unbind(uint8_t setIndex) { + mStashedSets[setIndex] = {}; +} + +void VulkanDescriptorSetManager::commit(VulkanCommandBuffer* commands, + VkPipelineLayout pipelineLayout, DescriptorSetMask const& setMask) { + // setMask indicates the set of descriptor sets the driver wants to bind, curMask is the + // actual set of sets that *needs* to be bound. + DescriptorSetMask curMask = setMask; + + auto& updateSets = mStashedSets; + auto& lastBoundSets = mLastBoundInfo.boundSets; + + setMask.forEachSetBit([&](size_t index) { + if (!updateSets[index] || updateSets[index] == lastBoundSets[index]) { + curMask.unset(index); + } + }); + + if (curMask.none() && + (mLastBoundInfo.pipelineLayout == pipelineLayout && mLastBoundInfo.setMask == setMask && + mLastBoundInfo.boundSets == updateSets)) { + return; + } + + curMask.forEachSetBit([&updateSets, commands, pipelineLayout](size_t index) { + // This code actually binds the descriptor sets. + auto set = updateSets[index]; + VkCommandBuffer const cmdbuffer = commands->buffer(); + vkCmdBindDescriptorSets(cmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, index, + 1, &set->vkSet, set->uniqueDynamicUboCount, set->getOffsets()->data()); + commands->acquire(set); + }); + + mStashedSets = {}; + + mLastBoundInfo = { + pipelineLayout, + setMask, + updateSets, + }; +} + +void VulkanDescriptorSetManager::updateBuffer(fvkmemory::resource_ptr set, + uint8_t binding, fvkmemory::resource_ptr bufferObject, + VkDeviceSize offset, VkDeviceSize size) noexcept { + VkDescriptorBufferInfo const info = { + .buffer = bufferObject->buffer.getGpuBuffer(), + .offset = offset, + .range = size, + }; + VkDescriptorType type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + + if (set->dynamicUboMask.test(binding)) { + type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC; + } + VkWriteDescriptorSet const descriptorWrite = { + .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + .pNext = nullptr, + .dstSet = set->vkSet, + .dstBinding = binding, + .descriptorCount = 1, + .descriptorType = type, + .pBufferInfo = &info, + }; + vkUpdateDescriptorSets(mDevice, 1, &descriptorWrite, 0, nullptr); + set->acquire(bufferObject); +} + +void VulkanDescriptorSetManager::updateSampler(fvkmemory::resource_ptr set, + uint8_t binding, fvkmemory::resource_ptr texture, + VkSampler sampler) noexcept { + VkDescriptorImageInfo info{ + .sampler = sampler, + }; + VkImageSubresourceRange const range = texture->getPrimaryViewRange(); + VkImageViewType const expectedType = texture->getViewType(); + if (any(texture->usage & TextureUsage::DEPTH_ATTACHMENT) && + expectedType == VK_IMAGE_VIEW_TYPE_2D) { + // If the sampler is part of a mipmapped depth texture, where one of the level *can* be + // an attachment, then the sampler for this texture has the same view properties as a + // view for an attachment. Therefore, we can use getAttachmentView to get a + // corresponding VkImageView. + info.imageView = texture->getAttachmentView(range); + } else { + info.imageView = texture->getViewForType(range, expectedType); + } + info.imageLayout = imgutil::getVkLayout(texture->getDefaultLayout()); + VkWriteDescriptorSet const descriptorWrite = { + .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + .pNext = nullptr, + .dstSet = set->vkSet, + .dstBinding = binding, + .descriptorCount = 1, + .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + .pImageInfo = &info, + }; + vkUpdateDescriptorSets(mDevice, 1, &descriptorWrite, 0, nullptr); + set->acquire(texture); +} + +void VulkanDescriptorSetManager::updateInputAttachment( + fvkmemory::resource_ptr set, + VulkanAttachment const& attachment) noexcept { + // TOOD: fill-in this region +} + +fvkmemory::resource_ptr VulkanDescriptorSetManager::createSet( + Handle handle, fvkmemory::resource_ptr layout) { + auto const vkSet = mDescriptorPool->obtainSet(layout); + auto const& count = layout->count; + auto const vklayout = layout->getVkLayout(); + return fvkmemory::resource_ptr::make(mResourceManager, handle, vkSet, + layout->bitmask.dynamicUbo, layout->count.dynamicUbo, + [vkSet, count, vklayout, this](VulkanDescriptorSet*) { + // Note that mDescriptorPool could be gone due to terminate (when the backend shuts + // down). + if (mDescriptorPool) { + mDescriptorPool->recycle(count, vklayout, vkSet); + } + }); +} + +void VulkanDescriptorSetManager::initVkLayout( + fvkmemory::resource_ptr layout) { + layout->setVkLayout(mLayoutManager->getVkLayout(layout->bitmask)); +} + +void VulkanDescriptorSetManager::clearHistory() { + mStashedSets = {}; +} + +} // namespace filament::backend diff --git a/filament/backend/src/vulkan/caching/VulkanDescriptorSetManager.h b/filament/backend/src/vulkan/caching/VulkanDescriptorSetManager.h new file mode 100644 index 00000000000..faeeb144205 --- /dev/null +++ b/filament/backend/src/vulkan/caching/VulkanDescriptorSetManager.h @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_CACHING_VULKANDESCRIPTORSETMANAGER_H +#define TNT_FILAMENT_BACKEND_CACHING_VULKANDESCRIPTORSETMANAGER_H + +#include "vulkan/VulkanHandles.h" +#include "vulkan/VulkanTexture.h" +#include "vulkan/VulkanUtility.h" +#include "vulkan/memory/ResourcePointer.h" + +#include +#include +#include + +#include + +#include +#include + +#include + +namespace filament::backend { + +// [GDSR]: Great-Descriptor-Set-Refactor: As of 03/20/24, the Filament frontend is planning to +// introduce descriptor set. This PR will arrive before that change is complete. As such, some of +// the methods introduced here will be obsolete, and certain logic will be generalized. + +// Abstraction over the pool and the layout cache. +class VulkanDescriptorSetManager { +public: + static constexpr uint8_t UNIQUE_DESCRIPTOR_SET_COUNT = + VulkanDescriptorSetLayout::UNIQUE_DESCRIPTOR_SET_COUNT; + + using DescriptorSetLayoutArray = VulkanDescriptorSetLayout::DescriptorSetLayoutArray; + + VulkanDescriptorSetManager(VkDevice device, fvkmemory::ResourceManager* resourceManager); + ~VulkanDescriptorSetManager(); + + void terminate() noexcept; + + void updateBuffer(fvkmemory::resource_ptr set, uint8_t binding, + fvkmemory::resource_ptr bufferObject, VkDeviceSize offset, + VkDeviceSize size) noexcept; + + void updateSampler(fvkmemory::resource_ptr set, uint8_t binding, + fvkmemory::resource_ptr texture, VkSampler sampler) noexcept; + + void updateInputAttachment(fvkmemory::resource_ptr set, + VulkanAttachment const& attachment) noexcept; + + void bind(uint8_t setIndex, fvkmemory::resource_ptr set, + backend::DescriptorSetOffsetArray&& offsets); + + void unbind(uint8_t setIndex); + + void commit(VulkanCommandBuffer* commands, VkPipelineLayout pipelineLayout, + DescriptorSetMask const& setMask); + + fvkmemory::resource_ptr createSet(Handle handle, + fvkmemory::resource_ptr layout); + + void initVkLayout(fvkmemory::resource_ptr layout); + + void clearHistory(); + +private: + class DescriptorSetLayoutManager; + class DescriptorInfinitePool; + + using DescriptorSetArray = + std::array, UNIQUE_DESCRIPTOR_SET_COUNT>; + + VkDevice mDevice; + fvkmemory::ResourceManager* mResourceManager; + std::unique_ptr mLayoutManager; + std::unique_ptr mDescriptorPool; + std::pair mInputAttachment; + DescriptorSetArray mStashedSets = {}; + + struct { + VkPipelineLayout pipelineLayout = VK_NULL_HANDLE; + DescriptorSetMask setMask; + DescriptorSetArray boundSets = {}; + } mLastBoundInfo; +}; + +}// namespace filament::backend + +#endif// TNT_FILAMENT_BACKEND_CACHING_VULKANDESCRIPTORSETMANAGER_H diff --git a/filament/backend/src/vulkan/caching/VulkanPipelineLayoutCache.cpp b/filament/backend/src/vulkan/caching/VulkanPipelineLayoutCache.cpp new file mode 100644 index 00000000000..256a616aa2e --- /dev/null +++ b/filament/backend/src/vulkan/caching/VulkanPipelineLayoutCache.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "VulkanPipelineLayoutCache.h" + +namespace filament::backend { + +VkPipelineLayout VulkanPipelineLayoutCache::getLayout( + DescriptorSetLayoutArray const& descriptorSetLayouts, + fvkmemory::resource_ptr program) { + PipelineLayoutKey key = {}; + uint8_t descSetLayoutCount = 0; + key.descSetLayouts = descriptorSetLayouts; + for (auto layoutHandle: descriptorSetLayouts) { + if (layoutHandle == VK_NULL_HANDLE) { + break; + } + descSetLayoutCount++; + } + + // build the push constant layout key + uint32_t const pushConstantRangeCount = program->getPushConstantRangeCount(); + auto const& pushConstantRanges = program->getPushConstantRanges(); + if (pushConstantRangeCount > 0) { + assert_invariant(pushConstantRangeCount <= Program::SHADER_TYPE_COUNT); + for (uint8_t i = 0; i < pushConstantRangeCount; ++i) { + auto const& range = pushConstantRanges[i]; + auto& pushConstant = key.pushConstant[i]; + if (range.stageFlags & VK_SHADER_STAGE_VERTEX_BIT) { + pushConstant.stage = static_cast(ShaderStage::VERTEX); + } + if (range.stageFlags & VK_SHADER_STAGE_FRAGMENT_BIT) { + pushConstant.stage = static_cast(ShaderStage::FRAGMENT); + } + if (range.stageFlags & VK_SHADER_STAGE_COMPUTE_BIT) { + pushConstant.stage = static_cast(ShaderStage::COMPUTE); + } + pushConstant.size = range.size; + } + } + + if (auto iter = mPipelineLayouts.find(key); iter != mPipelineLayouts.end()) { + PipelineLayoutCacheEntry& entry = iter->second; + entry.lastUsed = mTimestamp++; + return entry.handle; + } + + VkPipelineLayoutCreateInfo info{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, + .pNext = nullptr, + .setLayoutCount = (uint32_t) descSetLayoutCount, + .pSetLayouts = key.descSetLayouts.data(), + .pushConstantRangeCount = pushConstantRangeCount, + .pPushConstantRanges = pushConstantRanges, + }; + + VkPipelineLayout layout; + vkCreatePipelineLayout(mDevice, &info, VKALLOC, &layout); + + mPipelineLayouts[key] = { + .handle = layout, + .lastUsed = mTimestamp++, + }; + return layout; +} + +void VulkanPipelineLayoutCache::terminate() noexcept { + for (auto const& [key, entry]: mPipelineLayouts) { + vkDestroyPipelineLayout(mDevice, entry.handle, VKALLOC); + } +} + +}// namespace filament::backend diff --git a/filament/backend/src/vulkan/caching/VulkanPipelineLayoutCache.h b/filament/backend/src/vulkan/caching/VulkanPipelineLayoutCache.h new file mode 100644 index 00000000000..212ad60b0cf --- /dev/null +++ b/filament/backend/src/vulkan/caching/VulkanPipelineLayoutCache.h @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_VULKANPIPELINELAYOUTCACHE_H +#define TNT_FILAMENT_BACKEND_VULKANPIPELINELAYOUTCACHE_H + +#include +#include + +#include + +#include + +namespace filament::backend { + +class VulkanPipelineLayoutCache { +public: + using DescriptorSetLayoutArray = VulkanDescriptorSetLayout::DescriptorSetLayoutArray; + + VulkanPipelineLayoutCache(VkDevice device) + : mDevice(device), + mTimestamp(0) {} + + void terminate() noexcept; + + struct PushConstantKey { + uint8_t stage = 0;// We have one set of push constant per shader stage (fragment, vertex, etc). + uint8_t size = 0; + // Note that there is also an offset parameter for push constants, but + // we always assume our update range will have the offset 0. + }; + + struct PipelineLayoutKey { + DescriptorSetLayoutArray descSetLayouts = {}; // 8 * 4 + PushConstantKey pushConstant[Program::SHADER_TYPE_COUNT] = {}; // 2 * 3 + uint16_t padding = 0; + }; + static_assert(sizeof(PipelineLayoutKey) == 40); + + VulkanPipelineLayoutCache(VulkanPipelineLayoutCache const&) = delete; + VulkanPipelineLayoutCache& operator=(VulkanPipelineLayoutCache const&) = delete; + + // A pipeline layout depends on the descriptor set layout and the push constant ranges, which + // are described in the program. + VkPipelineLayout getLayout(DescriptorSetLayoutArray const& descriptorSetLayouts, + fvkmemory::resource_ptr program); + +private: + using Timestamp = uint64_t; + struct PipelineLayoutCacheEntry { + VkPipelineLayout handle; + Timestamp lastUsed; + }; + + using PipelineLayoutKeyHashFn = utils::hash::MurmurHashFn; + struct PipelineLayoutKeyEqual { + bool operator()(PipelineLayoutKey const& k1, PipelineLayoutKey const& k2) const { + return 0 == memcmp((const void*) &k1, (const void*) &k2, sizeof(PipelineLayoutKey)); + } + }; + + using PipelineLayoutMap = std::unordered_map; + + VkDevice mDevice; + Timestamp mTimestamp; + PipelineLayoutMap mPipelineLayouts; +}; + +} // filament::backend + +#endif // TNT_FILAMENT_BACKEND_VULKANPIPELINECACHE_H diff --git a/filament/backend/src/vulkan/memory/Resource.cpp b/filament/backend/src/vulkan/memory/Resource.cpp new file mode 100644 index 00000000000..9a464d1eae5 --- /dev/null +++ b/filament/backend/src/vulkan/memory/Resource.cpp @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "vulkan/memory/Resource.h" +#include "vulkan/memory/ResourceManager.h" + +#include "vulkan/VulkanHandles.h" + +namespace filament::backend::fvkmemory { + +template ResourceType getTypeEnum() noexcept; +template ResourceType getTypeEnum() noexcept; +template ResourceType getTypeEnum() noexcept; +template ResourceType getTypeEnum() noexcept; +template ResourceType getTypeEnum() noexcept; +template ResourceType getTypeEnum() noexcept; +template ResourceType getTypeEnum() noexcept; +template ResourceType getTypeEnum() noexcept; +template ResourceType getTypeEnum() noexcept; +template ResourceType getTypeEnum() noexcept; +template ResourceType getTypeEnum() noexcept; +template ResourceType getTypeEnum() noexcept; +template ResourceType getTypeEnum() noexcept; +template ResourceType getTypeEnum() noexcept; + +template +ResourceType getTypeEnum() noexcept { + if constexpr (std::is_same_v) { + return ResourceType::BUFFER_OBJECT; + } + if constexpr (std::is_same_v) { + return ResourceType::INDEX_BUFFER; + } + if constexpr (std::is_same_v) { + return ResourceType::PROGRAM; + } + if constexpr (std::is_same_v) { + return ResourceType::RENDER_TARGET; + } + if constexpr (std::is_same_v) { + return ResourceType::SWAP_CHAIN; + } + if constexpr (std::is_same_v) { + return ResourceType::RENDER_PRIMITIVE; + } + if constexpr (std::is_same_v) { + return ResourceType::TEXTURE; + } + if constexpr (std::is_same_v) { + return ResourceType::TEXTURE_STATE; + } + if constexpr (std::is_same_v) { + return ResourceType::TIMER_QUERY; + } + if constexpr (std::is_same_v) { + return ResourceType::VERTEX_BUFFER; + } + if constexpr (std::is_same_v) { + return ResourceType::VERTEX_BUFFER_INFO; + } + if constexpr (std::is_same_v) { + return ResourceType::DESCRIPTOR_SET_LAYOUT; + } + if constexpr (std::is_same_v) { + return ResourceType::DESCRIPTOR_SET; + } + if constexpr (std::is_same_v) { + return ResourceType::FENCE; + } + return ResourceType::UNDEFINED_TYPE; +} + +std::string getTypeStr(ResourceType type) { + switch (type) { + case ResourceType::BUFFER_OBJECT: + return "BufferObject"; + case ResourceType::INDEX_BUFFER: + return "IndexBuffer"; + case ResourceType::PROGRAM: + return "Program"; + case ResourceType::RENDER_TARGET: + return "RenderTarget"; + case ResourceType::SWAP_CHAIN: + return "SwapChain"; + case ResourceType::RENDER_PRIMITIVE: + return "RenderPrimitive"; + case ResourceType::TEXTURE: + return "Texture"; + case ResourceType::TEXTURE_STATE: + return "TextureState"; + case ResourceType::TIMER_QUERY: + return "TimerQuery"; + case ResourceType::VERTEX_BUFFER: + return "VertexBuffer"; + case ResourceType::VERTEX_BUFFER_INFO: + return "VertexBufferInfo"; + case ResourceType::DESCRIPTOR_SET_LAYOUT: + return "DescriptorSetLayout"; + case ResourceType::DESCRIPTOR_SET: + return "DescriptorSet"; + case ResourceType::FENCE: + return "Fence"; + case ResourceType::UNDEFINED_TYPE: + return ""; + } +} + +void Resource::destroy(ResourceType type, HandleId id) { + resManager->destructLaterWithType(type, id); + +} +void ThreadSafeResource::destroy(ResourceType type, HandleId id) { + resManager->destructLaterWithType(type, id); +} + +} // namespace filament::backend::fvkmemory diff --git a/filament/backend/src/vulkan/memory/Resource.h b/filament/backend/src/vulkan/memory/Resource.h new file mode 100644 index 00000000000..c856e62879e --- /dev/null +++ b/filament/backend/src/vulkan/memory/Resource.h @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_VULKAN_MEMORY_RESOURCE_H +#define TNT_FILAMENT_BACKEND_VULKAN_MEMORY_RESOURCE_H + +#include +#include + +#include +#include + +namespace filament::backend::fvkmemory { + +using CounterIndex = int32_t; +using HandleId = HandleBase::HandleId; + +class ResourceManager; + +template +struct resource_ptr; + +// Subclasses of VulkanResource must provide this enum in their construction. +enum class ResourceType : uint8_t { + BUFFER_OBJECT = 0, + INDEX_BUFFER = 1, + PROGRAM = 2, + RENDER_TARGET = 3, + SWAP_CHAIN = 4, + RENDER_PRIMITIVE = 5, + TEXTURE = 6, + TEXTURE_STATE = 7, + TIMER_QUERY = 8, + VERTEX_BUFFER = 9, + VERTEX_BUFFER_INFO = 10, + DESCRIPTOR_SET_LAYOUT = 11, + DESCRIPTOR_SET = 12, + FENCE = 13, + UNDEFINED_TYPE = 14, // Must be the last enum because we use it for iterating over the enums. +}; + +template +ResourceType getTypeEnum() noexcept; + +std::string getTypeStr(ResourceType type); + +inline bool isThreadSafeType(ResourceType type) { + return type == ResourceType::FENCE || type == ResourceType::TIMER_QUERY; +} + +struct Resource { + Resource() + : resManager(nullptr), + id(HandleBase::nullid), + mCount(0), + restype(ResourceType::UNDEFINED_TYPE), + mHandleConsideredDestroyed(false) {} + +private: + inline void inc() noexcept { + mCount++; + } + + inline void dec() noexcept { + assert_invariant(mCount > 0); + if (--mCount == 0) { + destroy(restype, id); + } + } + + // To be able to detect use-after-free, we need a bit to signify if the handle should be + // consider destroyed (from Filament's perspective). + inline void setHandleConsiderDestroyed() noexcept { + mHandleConsideredDestroyed = true; + } + + inline bool isHandleConsideredDestroyed() const { + return mHandleConsideredDestroyed; + } + + template + inline void init(HandleId id, ResourceManager* resManager) { + this->id = id; + this->resManager = resManager; + this->restype = getTypeEnum(); + } + + void destroy(ResourceType type, HandleId id); + + ResourceManager* resManager; // 8 + HandleId id; // 4 + uint32_t mCount : 24; + ResourceType restype : 7; + bool mHandleConsideredDestroyed : 1; // restype + mCount + mHandleConsideredDestroyed + // is 4 bytes. + + friend class ResourceManager; + + template + friend struct resource_ptr; +}; + +struct ThreadSafeResource { + ThreadSafeResource() + : resManager(nullptr), + id(HandleBase::nullid), + mCount(0), + restype(ResourceType::UNDEFINED_TYPE), + mHandleConsideredDestroyed(false) {} + +private: + inline void inc() noexcept { + mCount.fetch_add(1, std::memory_order_relaxed); + } + + inline void dec() noexcept { + if (mCount.fetch_sub(1, std::memory_order_acq_rel) == 1) { + destroy(restype, id); + } + } + + // To be able to detect use-after-free, we need a bit to signify if the handle should be + // consider destroyed (from Filament's perspective). + inline void setHandleConsiderDestroyed() noexcept { + mHandleConsideredDestroyed = true; + } + + inline bool isHandleConsideredDestroyed() const { + return mHandleConsideredDestroyed; + } + + template + inline void init(HandleId id, ResourceManager* resManager) { + this->id = id; + this->resManager = resManager; + this->restype = getTypeEnum(); + } + + void destroy(ResourceType type, HandleId id); + + ResourceManager* resManager; // 8 + HandleId id; // 4 + std::atomic mCount; // 4 + ResourceType restype : 7; + bool mHandleConsideredDestroyed : 1; // restype + mHandleConsideredDestroyed is 1 byte + + friend class ResourceManager; + + template + friend struct resource_ptr; +}; + +} // namespace filament::backend::fvkmemory + +#endif // TNT_FILAMENT_BACKEND_VULKAN_MEMORY_RESOURCE_H diff --git a/filament/backend/src/vulkan/memory/ResourceManager.cpp b/filament/backend/src/vulkan/memory/ResourceManager.cpp new file mode 100644 index 00000000000..0a64fd2562a --- /dev/null +++ b/filament/backend/src/vulkan/memory/ResourceManager.cpp @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "vulkan/memory/ResourceManager.h" +#include "vulkan/VulkanHandles.h" + +#include + +namespace filament::backend::fvkmemory { + +namespace { +#if FVK_ENABLED(FVK_DEBUG_RESOURCE_LEAK) +uint32_t COUNTER[(size_t) ResourceType::UNDEFINED_TYPE] = {}; +#endif +} + +ResourceManager::ResourceManager(size_t arenaSize, bool disableUseAfterFreeCheck) + : mHandleAllocatorImpl("Handles", arenaSize, disableUseAfterFreeCheck) {} + +void ResourceManager::gc() noexcept { + auto destroyAll = [this](GcList& list) { + for (auto const& [type, id]: list) { + destroyWithType(type, id); + } + list.clear(); + }; + + { + // Note that we're not copying mThreadSafeGcList because the objects here do not have + // resource_ptrs to other handle objects, so their desctruction would not add more elements + // to mThreadSafeGcList. + std::unique_lock lock(mThreadSafeGcListMutex); + destroyAll(mThreadSafeGcList); + } + + GcList gcs; + std::swap(gcs, mGcList); + destroyAll(gcs); +} + +void ResourceManager::terminate() noexcept { + while (!mThreadSafeGcList.empty() || !mGcList.empty()) { + gc(); + } +} + +void ResourceManager::destroyWithType(ResourceType type, HandleId id) { + switch (type) { + case ResourceType::BUFFER_OBJECT: + destruct(Handle(id)); + break; + case ResourceType::INDEX_BUFFER: + destruct(Handle(id)); + break; + case ResourceType::PROGRAM: + destruct(Handle(id)); + break; + case ResourceType::RENDER_TARGET: + destruct(Handle(id)); + break; + case ResourceType::SWAP_CHAIN: + destruct(Handle(id)); + break; + case ResourceType::RENDER_PRIMITIVE: + destruct(Handle(id)); + break; + case ResourceType::TEXTURE: + destruct(Handle(id)); + break; + case ResourceType::TEXTURE_STATE: + destruct(Handle(id)); + break; + case ResourceType::TIMER_QUERY: + destruct(Handle(id)); + break; + case ResourceType::VERTEX_BUFFER: + destruct(Handle(id)); + break; + case ResourceType::VERTEX_BUFFER_INFO: + destruct(Handle(id)); + break; + case ResourceType::DESCRIPTOR_SET_LAYOUT: + destruct(Handle(id)); + break; + case ResourceType::DESCRIPTOR_SET: + destruct(Handle(id)); + break; + case ResourceType::FENCE: + destruct(Handle(id)); + break; + case ResourceType::UNDEFINED_TYPE: + break; + } +#if FVK_ENABLED(FVK_DEBUG_RESOURCE_LEAK) + COUNTER[(size_t) type]--; +#endif +} + +void ResourceManager::traceConstruction(ResourceType type, HandleId id) { +#if FVK_ENABLED(FVK_DEBUG_RESOURCE_LEAK) + assert_invariant(type != ResourceType::UNDEFINED_TYPE); + COUNTER[(size_t) type]++; +#endif +} + +void ResourceManager::print() const noexcept { +#if FVK_ENABLED(FVK_DEBUG_RESOURCE_LEAK) + utils::slog.e << "-------------------" << utils::io::endl; + for (size_t i = 0; i < (size_t) ResourceType::UNDEFINED_TYPE; ++i) { + utils::slog.e <<" " << getTypeStr((ResourceType) i) << "=" << COUNTER[i] << utils::io::endl; + } + utils::slog.e << "+++++++++++++++++++" << utils::io::endl; +#endif +} + +} diff --git a/filament/backend/src/vulkan/memory/ResourceManager.h b/filament/backend/src/vulkan/memory/ResourceManager.h new file mode 100644 index 00000000000..fd2fef054bb --- /dev/null +++ b/filament/backend/src/vulkan/memory/ResourceManager.h @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_VULKAN_MEMORY_RESOURCEMANAGER_H +#define TNT_FILAMENT_BACKEND_VULKAN_MEMORY_RESOURCEMANAGER_H + +#include "vulkan/memory/Resource.h" + +#include "vulkan/VulkanAsyncHandles.h" + +#include + +#include + +namespace filament::backend::fvkmemory { + +class ResourceManager { +public: + ResourceManager(size_t arenaSize, bool disableUseAfterFreeCheck); + + template + inline Handle allocHandle() noexcept { + return mHandleAllocatorImpl.allocate(); + } + + inline void associateHandle(HandleBase::HandleId id, utils::CString&& tag) noexcept { + mHandleAllocatorImpl.associateTagToHandle(id, std::move(tag)); + } + + void gc() noexcept; + void print() const noexcept; + void terminate() noexcept; + +private: + using AllocatorImpl = HandleAllocatorVK; + + template + using requires_thread_safety = typename std::disjunction, + std::is_same>; + + template + inline D* construct(Handle const& handle, ARGS&&... args) noexcept { + constexpr bool THREAD_SAFETY = requires_thread_safety::value; + D* obj = mHandleAllocatorImpl.construct(handle, std::forward(args)...); + if constexpr (THREAD_SAFETY) { + ((ThreadSafeResource*) obj)->template init(handle.getId(), this); + } else { + ((Resource*) obj)->template init(handle.getId(), this); + } + traceConstruction(getTypeEnum(), handle.getId()); + return obj; + } + + template + inline typename std::enable_if_t< + std::is_pointer_v && std::is_base_of_v>, Dp> + handle_cast(Handle const& handle) noexcept { + return mHandleAllocatorImpl.handle_cast(handle); + } + + template + inline void destruct(Handle handle) noexcept { + D* obj = handle_cast(handle); + mHandleAllocatorImpl.deallocate(handle, obj); + } + + // This will post the destruction to a list that will be processed when gc is called from the + // backend thread. + inline void destructLaterWithType(ResourceType type, HandleId id) { + if (isThreadSafeType(type)) { + std::unique_lock lock(mThreadSafeGcListMutex); + mThreadSafeGcList.push_back({type, id}); + } else { + mGcList.push_back({type, id}); + } + } + + void destroyWithType(ResourceType type, HandleId id); + + void traceConstruction(ResourceType type, HandleId id); + + AllocatorImpl mHandleAllocatorImpl; + + using GcList = std::vector>; + utils::Mutex mThreadSafeGcListMutex; + GcList mThreadSafeGcList; + GcList mGcList; + + template + friend struct resource_ptr; + + friend struct Resource; + friend struct ThreadSafeResource; +}; + +} // namespace filament::backend::fvkmemory + +#endif // TNT_FILAMENT_BACKEND_VULKAN_MEMORY_RESOURCEMANAGER_H diff --git a/filament/backend/src/vulkan/memory/ResourcePointer.h b/filament/backend/src/vulkan/memory/ResourcePointer.h new file mode 100644 index 00000000000..25b9737bf71 --- /dev/null +++ b/filament/backend/src/vulkan/memory/ResourcePointer.h @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_VULKAN_MEMORY_RESOURCEPOINTER_H +#define TNT_FILAMENT_BACKEND_VULKAN_MEMORY_RESOURCEPOINTER_H + +#include "vulkan/memory/Resource.h" +#include "vulkan/memory/ResourceManager.h" + +#include +#include + +#include + +namespace filament::backend { +class VulkanDriver; + +namespace fvkmemory { + +// This is a ref-counting, reference holder class (similar to std::shared_ptr) that serves as the +// primary interface between the vk backend (VulkanDriver) and the handle allocator. All objects +// that are allocated from the handle allocator are expected to be contained within a +template +struct resource_ptr { + +private: + template + using enabled_resource_ptr = + resource_ptr::value, D>::type>; +public: + template + static enabled_resource_ptr make(ResourceManager* resManager, Handle const& handle, + ARGS&&... args) noexcept { + D* ptr = resManager->construct(handle, std::forward(args)...); + return {ptr}; + } + + // This will alloc a handle and then construct the object. + template + static resource_ptr construct(ResourceManager* resManager, ARGS&&... args) noexcept { + auto handle = resManager->allocHandle(); + D* ptr = resManager->construct(handle, std::forward(args)...); + return {ptr}; + } + + template + static enabled_resource_ptr cast(ResourceManager* resManager, + Handle const& handle) noexcept { + D* ptr = resManager->handle_cast(handle); + FILAMENT_CHECK_PRECONDITION(!ptr->isHandleConsideredDestroyed()) + << "Handle id=" << ptr->id << " (" << getTypeStr(ptr->restype) + << ") is being used after it has been freed"; + + return {ptr}; + } + + template + static enabled_resource_ptr cast(B* ptr) noexcept { + return {ptr}; + } + + ~resource_ptr() { + if (mRef) { + mRef->dec(); + } + } + + inline resource_ptr() = default; + + // move constructor operator + inline resource_ptr(resource_ptr&& rhs) { + (*this) = std::move(rhs); + } + + inline resource_ptr(resource_ptr const& rhs) { + (*this) = rhs; + } + + template + using is_supported_t = + typename std::enable_if::value>::type; + template> + inline resource_ptr(resource_ptr const& rhs) { + (*this) = rhs; + } + + // move operator + inline resource_ptr& operator=(resource_ptr && rhs) { + std::swap(mRef, rhs.mRef); + return *this; + } + + inline resource_ptr& operator=(resource_ptr const& rhs) { + if (mRef == rhs.mRef) { + return *this; + } + if (mRef) { + mRef->dec(); + } + mRef = rhs.mRef; + mRef->inc(); + return *this; + } + + template> + inline resource_ptr& operator=(resource_ptr const& rhs) { + if (mRef == rhs.mRef) { + return *this; + } + if (mRef) { + mRef->dec(); + } + mRef = rhs.mRef; + mRef->inc(); + return *this; + } + + inline bool operator==(resource_ptr const& other) const { + return id() == other.id() && type() == other.type(); + } + + inline explicit operator bool() const { + return bool(mRef); + } + + inline D* operator->() { + return get(); + } + + inline D const* operator->() const { + return get(); + } + + inline HandleId id() const { + if (mRef) { + return mRef->id; + } + return HandleBase::nullid; + } + + inline D* get() const { + assert_invariant(mRef); + return mRef; + } + +private: + // inc() and dec() For tracking ref-count with respect to create/destroy backend APIs. They can + // only be used from VulkanDriver. + inline void dec() { + assert_invariant(mRef); + assert_invariant(!mRef->isHandleConsideredDestroyed()); + mRef->setHandleConsiderDestroyed(); + mRef->dec(); + } + + inline void inc() { + assert_invariant(mRef); + mRef->inc(); + } + + inline ResourceType type() const { + if (mRef) { + return mRef->restype; + } + return ResourceType::UNDEFINED_TYPE; + } + + resource_ptr(D* ref) + : mRef(ref) { + mRef->inc(); + } + + D* mRef = nullptr; + + // Allow generic structures to hold resources of different types. For example, + // std::vector resources; + friend struct resource_ptr; + friend struct resource_ptr; + + // This enables access to resource_ptr's private inc() and dec() methods. + friend class filament::backend::VulkanDriver; +}; + +} // namespace fvkmemory + +} // namespace filament::backend + +#endif // TNT_FILAMENT_BACKEND_VULKAN_MEMORY_RESOURCEPOINTER_H diff --git a/filament/backend/src/vulkan/platform/VulkanPlatform.cpp b/filament/backend/src/vulkan/platform/VulkanPlatform.cpp new file mode 100644 index 00000000000..e20ae0270cd --- /dev/null +++ b/filament/backend/src/vulkan/platform/VulkanPlatform.cpp @@ -0,0 +1,970 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "backend/platforms/VulkanPlatform.h" + +#include + +#include "vulkan/platform/VulkanPlatformSwapChainImpl.h" +#include "vulkan/VulkanConstants.h" +#include "vulkan/VulkanDriver.h" +#include "vulkan/VulkanUtility.h" + +#include +#include +#include + +#define SWAPCHAIN_RET_FUNC(func, handle, ...) \ + if (mImpl->mSurfaceSwapChains.find(handle) != mImpl->mSurfaceSwapChains.end()) { \ + return static_cast(handle)->func(__VA_ARGS__); \ + } else if (mImpl->mHeadlessSwapChains.find(handle) != mImpl->mHeadlessSwapChains.end()) { \ + return static_cast(handle)->func(__VA_ARGS__); \ + } else { \ + PANIC_PRECONDITION("Bad handle for swapchain"); \ + return {}; \ + } + +using namespace utils; +using namespace bluevk; + +namespace filament::backend { + +namespace { + +constexpr uint32_t const INVALID_VK_INDEX = 0xFFFFFFFF; + +using ExtensionSet = VulkanPlatform::ExtensionSet; + +inline bool setContains(ExtensionSet const& set, utils::CString const& extension) { + return set.find(extension) != set.end(); +}; + +#if FVK_ENABLED(FVK_DEBUG_VALIDATION) +// These strings need to be allocated outside a function stack +const std::string_view DESIRED_LAYERS[] = { + "VK_LAYER_KHRONOS_validation", +#if FVK_ENABLED(FVK_DEBUG_DUMP_API) + "VK_LAYER_LUNARG_api_dump", +#endif +#if defined(ENABLE_RENDERDOC) + "VK_LAYER_RENDERDOC_Capture", +#endif +}; + +FixedCapacityVector getEnabledLayers() { + constexpr size_t kMaxEnabledLayersCount = sizeof(DESIRED_LAYERS) / sizeof(DESIRED_LAYERS[0]); + + const FixedCapacityVector availableLayers + = filament::backend::enumerate(vkEnumerateInstanceLayerProperties); + + auto enabledLayers = FixedCapacityVector::with_capacity(kMaxEnabledLayersCount); + for (auto const& desired: DESIRED_LAYERS) { + for (const VkLayerProperties& layer: availableLayers) { + const std::string_view availableLayer(layer.layerName); + if (availableLayer == desired) { + enabledLayers.push_back(desired.data()); + break; + } + } + } + return enabledLayers; +} +#endif // FVK_EANBLED(FVK_DEBUG_VALIDATION) + +void printDeviceInfo(VkInstance instance, VkPhysicalDevice device) { + // Print some driver or MoltenVK information if it is available. + if (vkGetPhysicalDeviceProperties2) { + VkPhysicalDeviceDriverProperties driverProperties = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES, + }; + VkPhysicalDeviceProperties2 physicalDeviceProperties2 = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, + .pNext = &driverProperties, + }; + vkGetPhysicalDeviceProperties2(device, &physicalDeviceProperties2); + FVK_LOGI << "Vulkan device driver: " << driverProperties.driverName << " " + << driverProperties.driverInfo << utils::io::endl; + } + + VkPhysicalDeviceProperties deviceProperties; + vkGetPhysicalDeviceProperties(device, &deviceProperties); + + // Print out some properties of the GPU for diagnostic purposes. + // + // Ideally, the vendors register their vendor ID's with Khronos so that apps can make an + // id => string mapping. However, in practice this hasn't happened. At the time of this + // writing the gpuinfo database has the following ID's: + // + // 0x1002 - AMD + // 0x1010 - ImgTec + // 0x10DE - NVIDIA + // 0x13B5 - ARM + // 0x106B - APPLE + // 0x5143 - Qualcomm + // 0x8086 - INTEL + // + // Since we don't have any vendor-specific workarounds yet, there's no need to make this + // mapping in code. The "deviceName" string informally reveals the marketing name for the + // GPU. (e.g., Quadro) + const uint32_t driverVersion = deviceProperties.driverVersion; + const uint32_t vendorID = deviceProperties.vendorID; + const uint32_t deviceID = deviceProperties.deviceID; + const int major = VK_VERSION_MAJOR(deviceProperties.apiVersion); + const int minor = VK_VERSION_MINOR(deviceProperties.apiVersion); + + const FixedCapacityVector physicalDevices + = filament::backend::enumerate(vkEnumeratePhysicalDevices, instance); + + FVK_LOGI << "Selected physical device '" << deviceProperties.deviceName << "' from " + << physicalDevices.size() << " physical devices. " + << "(vendor " << utils::io::hex << vendorID << ", " + << "device " << deviceID << ", " + << "driver " << driverVersion << ", " << utils::io::dec << "api " << major << "." + << minor << ")" << utils::io::endl; +} + +#if FVK_ENABLED(FVK_DEBUG_VALIDATION) +void printDepthFormats(VkPhysicalDevice device) { + // For diagnostic purposes, print useful information about available depth formats. + // Note that Vulkan is more constrained than OpenGL ES 3.1 in this area. + const VkFormatFeatureFlags required = VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT + | VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT; + FVK_LOGI << "Sampleable depth formats: "; + for (VkFormat format : ALL_VK_FORMATS) { + VkFormatProperties props; + vkGetPhysicalDeviceFormatProperties(device, format, &props); + if ((props.optimalTilingFeatures & required) == required) { + FVK_LOGI << format << " "; + } + } + FVK_LOGI << utils::io::endl; +} +#endif + +ExtensionSet getInstanceExtensions(ExtensionSet const& externallyRequiredExts = {}) { + ExtensionSet const TARGET_EXTS = { + // Request all cross-platform extensions. + VK_KHR_SURFACE_EXTENSION_NAME, + VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, + + // Request these if available. +#if FVK_ENABLED(FVK_DEBUG_DEBUG_UTILS) + VK_EXT_DEBUG_UTILS_EXTENSION_NAME, +#endif + VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME, + +#if FVK_ENABLED(FVK_DEBUG_VALIDATION) + VK_EXT_DEBUG_REPORT_EXTENSION_NAME, +#endif + }; + ExtensionSet exts; + FixedCapacityVector const availableExts = + filament::backend::enumerate(vkEnumerateInstanceExtensionProperties, + static_cast(nullptr) /* pLayerName */); + for (auto const& extProps: availableExts) { + utils::CString name { extProps.extensionName }; + + // To workaround an Adreno bug where the extension name could be of 0 length. + if (name.size() == 0) { + continue; + } + + if (setContains(TARGET_EXTS, name) || setContains(externallyRequiredExts, name)) { + exts.insert(name); + } + } + return exts; +} + +ExtensionSet getDeviceExtensions(VkPhysicalDevice device) { + ExtensionSet const TARGET_EXTS = { +#if FVK_ENABLED(FVK_DEBUG_DEBUG_UTILS) + VK_EXT_DEBUG_MARKER_EXTENSION_NAME, +#endif + // We only support external image for Android for now, but nothing bars us from + // supporting other platforms. +#if defined(__ANDROID__) + VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, + VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME, + VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME, + VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME, + #endif + + VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME, + VK_KHR_MAINTENANCE1_EXTENSION_NAME, + VK_KHR_MAINTENANCE2_EXTENSION_NAME, + VK_KHR_MAINTENANCE3_EXTENSION_NAME, + VK_KHR_MULTIVIEW_EXTENSION_NAME, + }; + ExtensionSet exts; + // Identify supported physical device extensions + FixedCapacityVector const extensions + = filament::backend::enumerate(vkEnumerateDeviceExtensionProperties, device, + static_cast(nullptr) /* pLayerName */); + for (auto const& extension: extensions) { + utils::CString name { extension.extensionName }; + + // To workaround an Adreno bug where the extension name could be of 0 length. + if (name.size() == 0) { + continue; + } + + if (setContains(TARGET_EXTS, name)) { + exts.insert(name); + } + } + return exts; +} + +VkInstance createInstance(ExtensionSet const& requiredExts) { + VkInstance instance; + VkInstanceCreateInfo instanceCreateInfo = {}; + bool validationFeaturesSupported = false; + +#if FVK_ENABLED(FVK_DEBUG_VALIDATION) + auto const enabledLayers = getEnabledLayers(); + if (!enabledLayers.empty()) { + // If layers are supported, Check if VK_EXT_validation_features is supported. + FixedCapacityVector const availableValidationExts + = filament::backend::enumerate(vkEnumerateInstanceExtensionProperties, + "VK_LAYER_KHRONOS_validation"); + for (auto const& extProps: availableValidationExts) { + if (!strcmp(extProps.extensionName, VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME)) { + validationFeaturesSupported = true; + break; + } + } + instanceCreateInfo.enabledLayerCount = (uint32_t) enabledLayers.size(); + instanceCreateInfo.ppEnabledLayerNames = enabledLayers.data(); + } else { +#if defined(__ANDROID__) + FVK_LOGD << "Validation layers are not available; did you set jniLibs in your " + << "gradle file?" << utils::io::endl; +#else + FVK_LOGD << "Validation layer not available; did you install the Vulkan SDK?\n" + << "Please ensure that VK_LAYER_PATH is set correctly." << utils::io::endl; +#endif // __ANDROID__ + + } +#endif // FVK_ENABLED(FVK_DEBUG_VALIDATION) + + // The Platform class can require 1 or 2 instance extensions, plus we'll request at most 5 + // instance extensions here in the common code. So that's a max of 7. + static constexpr uint32_t MAX_INSTANCE_EXTENSION_COUNT = 8; + const char* ppEnabledExtensions[MAX_INSTANCE_EXTENSION_COUNT]; + uint32_t enabledExtensionCount = 0; + + if (validationFeaturesSupported) { + ppEnabledExtensions[enabledExtensionCount++] = VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME; + } + // Request platform-specific extensions. + for (auto const& requiredExt: requiredExts) { + assert_invariant(enabledExtensionCount < MAX_INSTANCE_EXTENSION_COUNT); + ppEnabledExtensions[enabledExtensionCount++] = requiredExt.data(); + } + + // Create the Vulkan instance. + VkApplicationInfo appInfo = {}; + appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; + appInfo.pEngineName = "Filament"; + appInfo.apiVersion + = VK_MAKE_API_VERSION(0, FVK_REQUIRED_VERSION_MAJOR, FVK_REQUIRED_VERSION_MINOR, 0); + instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + instanceCreateInfo.pApplicationInfo = &appInfo; + instanceCreateInfo.enabledExtensionCount = enabledExtensionCount; + instanceCreateInfo.ppEnabledExtensionNames = ppEnabledExtensions; + if (setContains(requiredExts, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)) { + instanceCreateInfo.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; + } + + VkValidationFeaturesEXT features = {}; + VkValidationFeatureEnableEXT enables[] = { + VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT, + VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT, + }; + if (validationFeaturesSupported) { + features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT; + features.enabledValidationFeatureCount = sizeof(enables) / sizeof(enables[0]); + features.pEnabledValidationFeatures = enables; + instanceCreateInfo.pNext = &features; + } + + VkResult result = vkCreateInstance(&instanceCreateInfo, VKALLOC, &instance); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) + << "Unable to create Vulkan instance. error=" << static_cast(result); + return instance; +} + +VkDevice createLogicalDevice(VkPhysicalDevice physicalDevice, + VkPhysicalDeviceFeatures2 const& features, uint32_t graphicsQueueFamilyIndex, + uint32_t protectedGraphicsQueueFamilyIndex, ExtensionSet const& deviceExtensions) { + VkDevice device; + VkDeviceQueueCreateInfo deviceQueueCreateInfo[2] = {}; + const float queuePriority[] = {1.0f}; + VkDeviceCreateInfo deviceCreateInfo = {}; + FixedCapacityVector requestExtensions; + requestExtensions.reserve(deviceExtensions.size() + 1); + + // TODO: We don't really need this if we only ever expect headless swapchains. + requestExtensions.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME); + for (auto const& ext: deviceExtensions) { + requestExtensions.push_back(ext.data()); + } + deviceQueueCreateInfo[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + deviceQueueCreateInfo[0].queueFamilyIndex = graphicsQueueFamilyIndex; + deviceQueueCreateInfo[0].queueCount = 1; + deviceQueueCreateInfo[0].pQueuePriorities = &queuePriority[0]; + // Protected queue + deviceQueueCreateInfo[1].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + deviceQueueCreateInfo[1].flags = VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT; + deviceQueueCreateInfo[1].queueFamilyIndex = protectedGraphicsQueueFamilyIndex; + deviceQueueCreateInfo[1].queueCount = 1; + deviceQueueCreateInfo[1].pQueuePriorities = &queuePriority[0]; + + deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; + bool const hasProtectedQueue = protectedGraphicsQueueFamilyIndex != INVALID_VK_INDEX; + deviceCreateInfo.queueCreateInfoCount = hasProtectedQueue ? 2 : 1; + deviceCreateInfo.pQueueCreateInfos = deviceQueueCreateInfo; + + // We could simply enable all supported features, but since that may have performance + // consequences let's just enable the features we need. + VkPhysicalDeviceFeatures enabledFeatures{ + .depthClamp = features.features.depthClamp, + .samplerAnisotropy = features.features.samplerAnisotropy, + .textureCompressionETC2 = features.features.textureCompressionETC2, + .textureCompressionBC = features.features.textureCompressionBC, + .shaderClipDistance = features.features.shaderClipDistance, + }; + + deviceCreateInfo.pEnabledFeatures = &enabledFeatures; + deviceCreateInfo.enabledExtensionCount = (uint32_t) requestExtensions.size(); + deviceCreateInfo.ppEnabledExtensionNames = requestExtensions.data(); + + void* pNext = nullptr; + VkPhysicalDevicePortabilitySubsetFeaturesKHR portability = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR, + .pNext = nullptr, + .imageViewFormatSwizzle = VK_TRUE, + .mutableComparisonSamplers = VK_TRUE, + }; + if (setContains(deviceExtensions, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME)) { + portability.pNext = pNext; + pNext = &portability; + } + + VkPhysicalDeviceMultiviewFeaturesKHR multiview = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR, + .pNext = nullptr, + .multiview = VK_TRUE, + .multiviewGeometryShader = VK_FALSE, + .multiviewTessellationShader = VK_FALSE + }; + if (setContains(deviceExtensions, VK_KHR_MULTIVIEW_EXTENSION_NAME)) { + multiview.pNext = pNext; + pNext = &multiview; + } + + VkPhysicalDeviceProtectedMemoryFeatures protectedMemory = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, + }; + if (hasProtectedQueue) { + // Enable protected memory, if requested. + protectedMemory.protectedMemory = VK_TRUE; + protectedMemory.pNext = pNext; + pNext = &protectedMemory; + } + + deviceCreateInfo.pNext = pNext; + + VkResult result = vkCreateDevice(physicalDevice, &deviceCreateInfo, VKALLOC, &device); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) + << "vkCreateDevice error=" << static_cast(result); + + return device; +} + +// This method is used to enable/disable extensions based on external factors (i.e. +// driver/device workarounds). +std::tuple pruneExtensions(VkPhysicalDevice device, + ExtensionSet const& instExts, ExtensionSet const& deviceExts) { + ExtensionSet newInstExts = instExts; + ExtensionSet newDeviceExts = deviceExts; + +#if FVK_ENABLED(FVK_DEBUG_DEBUG_UTILS) + // debugUtils and debugMarkers extensions are used mutually exclusively. + if (setContains(newInstExts, VK_EXT_DEBUG_UTILS_EXTENSION_NAME) && + setContains(newInstExts, VK_EXT_DEBUG_MARKER_EXTENSION_NAME)) { + newDeviceExts.erase(VK_EXT_DEBUG_MARKER_EXTENSION_NAME); + } +#endif + +#if FVK_ENABLED(FVK_DEBUG_VALIDATION) + // debugMarker must also request debugReport the instance extension. So check if that's present. + if (setContains(newInstExts, VK_EXT_DEBUG_MARKER_EXTENSION_NAME) && + !setContains(newInstExts, VK_EXT_DEBUG_MARKER_EXTENSION_NAME)) { + newDeviceExts.erase(VK_EXT_DEBUG_MARKER_EXTENSION_NAME); + } +#endif + + return std::tuple(newInstExts, newDeviceExts); +} + +FixedCapacityVector getPhysicalDeviceQueueFamilyPropertiesHelper( + VkPhysicalDevice device) { + uint32_t queueFamiliesCount; + vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamiliesCount, nullptr); + FixedCapacityVector queueFamiliesProperties(queueFamiliesCount); + if (queueFamiliesCount > 0) { + vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamiliesCount, + queueFamiliesProperties.data()); + } + return queueFamiliesProperties; +} + +uint32_t identifyGraphicsQueueFamilyIndex(VkPhysicalDevice physicalDevice, VkQueueFlags flags) { + const FixedCapacityVector queueFamiliesProperties + = getPhysicalDeviceQueueFamilyPropertiesHelper(physicalDevice); + uint32_t graphicsQueueFamilyIndex = INVALID_VK_INDEX; + for (uint32_t j = 0; j < queueFamiliesProperties.size(); ++j) { + VkQueueFamilyProperties props = queueFamiliesProperties[j]; + if (props.queueCount != 0 && props.queueFlags & flags) { + graphicsQueueFamilyIndex = j; + break; + } + } + return graphicsQueueFamilyIndex; +} + +// Provide a preference ordering of device types. +// Enum based on: +// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkPhysicalDeviceType.html +inline int deviceTypeOrder(VkPhysicalDeviceType deviceType) { + switch (deviceType) { + case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU: + return 5; + case VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU: + return 4; + case VK_PHYSICAL_DEVICE_TYPE_CPU: + return 3; + case VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU: + return 2; + case VK_PHYSICAL_DEVICE_TYPE_OTHER: + return 1; + default: + FVK_LOGW << "deviceTypeOrder: Unexpected deviceType: " << deviceType + << utils::io::endl; + return -1; + } +} + +VkPhysicalDevice selectPhysicalDevice(VkInstance instance, + VulkanPlatform::Customization::GPUPreference const& gpuPreference) { + FixedCapacityVector const physicalDevices = + filament::backend::enumerate(vkEnumeratePhysicalDevices, instance); + struct DeviceInfo { + VkPhysicalDevice device = VK_NULL_HANDLE; + VkPhysicalDeviceType deviceType = VK_PHYSICAL_DEVICE_TYPE_OTHER; + int8_t index = -1; + std::string_view name; + }; + FixedCapacityVector deviceList(physicalDevices.size()); + + for (size_t deviceInd = 0; deviceInd < physicalDevices.size(); ++deviceInd) { + auto const candidateDevice = physicalDevices[deviceInd]; + VkPhysicalDeviceProperties targetDeviceProperties; + vkGetPhysicalDeviceProperties(candidateDevice, &targetDeviceProperties); + + int const major = VK_VERSION_MAJOR(targetDeviceProperties.apiVersion); + int const minor = VK_VERSION_MINOR(targetDeviceProperties.apiVersion); + + // Does the device support the required Vulkan level? + if (major < FVK_REQUIRED_VERSION_MAJOR) { + continue; + } + if (major == FVK_REQUIRED_VERSION_MAJOR && minor < FVK_REQUIRED_VERSION_MINOR) { + continue; + } + + // Does the device have any command queues that support graphics? + // In theory, we should also ensure that the device supports presentation of our + // particular VkSurface, but we don't have a VkSurface yet, so we'll skip this requirement. + if (identifyGraphicsQueueFamilyIndex(candidateDevice, VK_QUEUE_GRAPHICS_BIT) + == INVALID_VK_INDEX) { + continue; + } + + // Does the device support the VK_KHR_swapchain extension? + FixedCapacityVector const extensions + = filament::backend::enumerate(vkEnumerateDeviceExtensionProperties, + candidateDevice, static_cast(nullptr) /* pLayerName */); + bool supportsSwapchain = false; + for (auto const& extension: extensions) { + if (!strcmp(extension.extensionName, VK_KHR_SWAPCHAIN_EXTENSION_NAME)) { + supportsSwapchain = true; + break; + } + } + if (!supportsSwapchain) { + continue; + } + deviceList[deviceInd].device = candidateDevice; + deviceList[deviceInd].deviceType = targetDeviceProperties.deviceType; + deviceList[deviceInd].index = deviceInd; + deviceList[deviceInd].name = targetDeviceProperties.deviceName; + } + + FILAMENT_CHECK_PRECONDITION(gpuPreference.index < static_cast(deviceList.size())) + << "Provided GPU index=" << gpuPreference.index + << " >= the number of GPUs=" << static_cast(deviceList.size()); + + // Sort the found devices + std::sort(deviceList.begin(), deviceList.end(), + [pref = gpuPreference](DeviceInfo const& a, DeviceInfo const& b) { + if (b.device == VK_NULL_HANDLE) { + return false; + } + if (a.device == VK_NULL_HANDLE) { + return true; + } + if (!pref.deviceName.empty()) { + if (a.name.find(pref.deviceName.c_str()) != a.name.npos) { + return false; + } + if (b.name.find(pref.deviceName.c_str()) != b.name.npos) { + return true; + } + } + if (pref.index == a.index) { + return false; + } + if (pref.index == b.index) { + return true; + } + return deviceTypeOrder(a.deviceType) < deviceTypeOrder(b.deviceType); + }); + auto device = deviceList.back().device; + FILAMENT_CHECK_POSTCONDITION(device != VK_NULL_HANDLE) << "Unable to find suitable device."; + return device; +} + +VkFormatList findAttachmentDepthStencilFormats(VkPhysicalDevice device) { + VkFormatFeatureFlags const features = VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT; + + // The ordering here indicates the preference of choosing depth+stencil format. + VkFormat const formats[] = { + VK_FORMAT_D32_SFLOAT, + VK_FORMAT_X8_D24_UNORM_PACK32, + + VK_FORMAT_D32_SFLOAT_S8_UINT, + VK_FORMAT_D24_UNORM_S8_UINT, + }; + std::vector selectedFormats; + for (VkFormat format: formats) { + VkFormatProperties props; + vkGetPhysicalDeviceFormatProperties(device, format, &props); + if ((props.optimalTilingFeatures & features) == features) { + selectedFormats.push_back(format); + } + } + VkFormatList ret(selectedFormats.size()); + std::copy(selectedFormats.begin(), selectedFormats.end(), ret.begin()); + return ret; +} + +VkFormatList findBlittableDepthStencilFormats(VkPhysicalDevice device) { + std::vector selectedFormats; + VkFormatFeatureFlags const required = VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | + VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT; + for (VkFormat format : ALL_VK_FORMATS) { + if (isVkDepthFormat(format)) { + VkFormatProperties props; + vkGetPhysicalDeviceFormatProperties(device, format, &props); + if ((props.optimalTilingFeatures & required) == required) { + selectedFormats.push_back(format); + } + } + } + VkFormatList ret(selectedFormats.size()); + std::copy(selectedFormats.begin(), selectedFormats.end(), ret.begin()); + return ret; +} + +}// anonymous namespace + +using SwapChainPtr = VulkanPlatform::SwapChainPtr; + +struct VulkanPlatformPrivate { + VkInstance mInstance = VK_NULL_HANDLE; + VkPhysicalDevice mPhysicalDevice = VK_NULL_HANDLE; + VkDevice mDevice = VK_NULL_HANDLE; + uint32_t mGraphicsQueueFamilyIndex = INVALID_VK_INDEX; + uint32_t mGraphicsQueueIndex = INVALID_VK_INDEX; + VkQueue mGraphicsQueue = VK_NULL_HANDLE; + uint32_t mProtectedGraphicsQueueFamilyIndex = INVALID_VK_INDEX; + uint32_t mProtectedGraphicsQueueIndex = INVALID_VK_INDEX; + VkQueue mProtectedGraphicsQueue = VK_NULL_HANDLE; + VulkanContext mContext = {}; + + // We use a map to both map a handle (i.e. SwapChainPtr) to the concrete type and also to + // store the actual swapchain struct, which is either backed-by-surface or headless. + std::unordered_set mSurfaceSwapChains; + std::unordered_set mHeadlessSwapChains; + + bool mSharedContext = false; + bool mForceXCBSwapchain = false; +}; + +void VulkanPlatform::terminate() { + for (auto swapchain: mImpl->mHeadlessSwapChains) { + delete static_cast(swapchain); + } + mImpl->mHeadlessSwapChains.clear(); + + for (auto swapchain: mImpl->mSurfaceSwapChains) { + delete static_cast(swapchain); + } + mImpl->mSurfaceSwapChains.clear(); + + if (!mImpl->mSharedContext) { + vkDestroyDevice(mImpl->mDevice, VKALLOC); + vkDestroyInstance(mImpl->mInstance, VKALLOC); + } +} + +// This is the main entry point for context creation. +Driver* VulkanPlatform::createDriver(void* sharedContext, + const Platform::DriverConfig& driverConfig) noexcept { + // Load Vulkan entry points. + FILAMENT_CHECK_POSTCONDITION(bluevk::initialize()) << "BlueVK is unable to load entry points."; + + if (sharedContext) { + VulkanSharedContext const* scontext = (VulkanSharedContext const*) sharedContext; + // All fields of VulkanSharedContext should be present. + FILAMENT_CHECK_PRECONDITION(scontext->instance != VK_NULL_HANDLE) + << "Client needs to provide VkInstance"; + FILAMENT_CHECK_PRECONDITION(scontext->physicalDevice != VK_NULL_HANDLE) + << "Client needs to provide VkPhysicalDevice"; + FILAMENT_CHECK_PRECONDITION(scontext->logicalDevice != VK_NULL_HANDLE) + << "Client needs to provide VkDevice"; + FILAMENT_CHECK_PRECONDITION(scontext->graphicsQueueFamilyIndex != INVALID_VK_INDEX) + << "Client needs to provide graphics queue family index"; + FILAMENT_CHECK_PRECONDITION(scontext->graphicsQueueIndex != INVALID_VK_INDEX) + << "Client needs to provide graphics queue index"; + + mImpl->mInstance = scontext->instance; + mImpl->mPhysicalDevice = scontext->physicalDevice; + mImpl->mDevice = scontext->logicalDevice; + mImpl->mGraphicsQueueFamilyIndex = scontext->graphicsQueueFamilyIndex; + mImpl->mGraphicsQueueIndex = scontext->graphicsQueueIndex; + + mImpl->mSharedContext = true; + } + + VulkanContext context; + + ExtensionSet instExts; + // If using a shared context, we do not assume any extensions. + if (!mImpl->mSharedContext) { + // This constains instance extensions that are required for the platform, which includes + // swapchain surface extensions. + auto const& swapchainExts = getSwapchainInstanceExtensions(); + instExts = getInstanceExtensions(swapchainExts); + +#if defined(FILAMENT_SUPPORTS_XCB) && defined(FILAMENT_SUPPORTS_XLIB) + // For the special case where we're on linux and both xcb and xlib are "required", then we + // check if the set of supported extensions contain both of them. If only xcb is supported, + // we force XCB surface creation. This workaround is needed for the default swiftshader + // build where only XCB is available. + if (setContains(swapchainExts, VK_KHR_XCB_SURFACE_EXTENSION_NAME) && + setContains(swapchainExts, VK_KHR_XLIB_SURFACE_EXTENSION_NAME)) { + // Assume only XCB is left, then we force the XCB path in the swapchain creation. + mImpl->mForceXCBSwapchain = !setContains(instExts, VK_KHR_XLIB_SURFACE_EXTENSION_NAME); + assert_invariant(!mImpl->mForceXCBSwapchain || + setContains(instExts, VK_KHR_XCB_SURFACE_EXTENSION_NAME)); + } +#endif + + instExts.merge(getRequiredInstanceExtensions()); + } + + mImpl->mInstance + = mImpl->mInstance == VK_NULL_HANDLE ? createInstance(instExts) : mImpl->mInstance; + assert_invariant(mImpl->mInstance != VK_NULL_HANDLE); + + bluevk::bindInstance(mImpl->mInstance); + + VulkanPlatform::Customization::GPUPreference const pref = getCustomization().gpu; + bool const hasGPUPreference = pref.index >= 0 || !pref.deviceName.empty(); + FILAMENT_CHECK_PRECONDITION(!(hasGPUPreference && sharedContext)) + << "Cannot both share context and indicate GPU preference"; + + mImpl->mPhysicalDevice = mImpl->mPhysicalDevice == VK_NULL_HANDLE + ? selectPhysicalDevice(mImpl->mInstance, pref) + : mImpl->mPhysicalDevice; + assert_invariant(mImpl->mPhysicalDevice != VK_NULL_HANDLE); + + printDeviceInfo(mImpl->mInstance, mImpl->mPhysicalDevice); + + VkPhysicalDeviceProtectedMemoryFeatures queryProtectedMemoryFeatures = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, + }; + // Chain to the pNext linked list + queryProtectedMemoryFeatures.pNext = context.mPhysicalDeviceFeatures.pNext; + context.mPhysicalDeviceFeatures.pNext = &queryProtectedMemoryFeatures; + VkPhysicalDeviceProtectedMemoryProperties protectedMemoryProperties = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES, + }; + protectedMemoryProperties.pNext = context.mPhysicalDeviceProperties.pNext; + context.mPhysicalDeviceProperties.pNext = &protectedMemoryProperties; + + // Initialize the following fields: physicalDeviceProperties, memoryProperties, + // physicalDeviceFeatures, graphicsQueueFamilyIndex. + vkGetPhysicalDeviceProperties2(mImpl->mPhysicalDevice, &context.mPhysicalDeviceProperties); + vkGetPhysicalDeviceFeatures2(mImpl->mPhysicalDevice, &context.mPhysicalDeviceFeatures); + vkGetPhysicalDeviceMemoryProperties(mImpl->mPhysicalDevice, &context.mMemoryProperties); + + mImpl->mGraphicsQueueFamilyIndex + = mImpl->mGraphicsQueueFamilyIndex == INVALID_VK_INDEX + ? identifyGraphicsQueueFamilyIndex(mImpl->mPhysicalDevice, + VK_QUEUE_GRAPHICS_BIT) + : mImpl->mGraphicsQueueFamilyIndex; + assert_invariant(mImpl->mGraphicsQueueFamilyIndex != INVALID_VK_INDEX); + + // We know we need to allocate the protected version of the VK objects + context.mProtectedMemorySupported = + static_cast(queryProtectedMemoryFeatures.protectedMemory); + if (context.mProtectedMemorySupported) { + mImpl->mProtectedGraphicsQueueFamilyIndex + = identifyGraphicsQueueFamilyIndex(mImpl->mPhysicalDevice, + (VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_PROTECTED_BIT)); + assert_invariant(mImpl->mProtectedGraphicsQueueFamilyIndex != INVALID_VK_INDEX); + } + + // Only enable shaderClipDistance if we are doing instanced stereoscopic rendering. + if (context.mPhysicalDeviceFeatures.features.shaderClipDistance == VK_TRUE + && driverConfig.stereoscopicType != StereoscopicType::INSTANCED) { + context.mPhysicalDeviceFeatures.features.shaderClipDistance = VK_FALSE; + } + + // At this point, we should have a family index that points to a family that has > 0 queues for + // graphics. In which case, we will allocate one queue for all of Filament (and assumes at least + // one has been allocated by the client if context was shared). If the index of the target queue + // within the family hasn't been provided by the client, we assume it to be 0. + mImpl->mGraphicsQueueIndex + = mImpl->mGraphicsQueueIndex == INVALID_VK_INDEX ? 0 : mImpl->mGraphicsQueueIndex; + + // Applying the same logic to the protected queue index (Not sure about shared context and protection) + mImpl->mProtectedGraphicsQueueIndex + = mImpl->mProtectedGraphicsQueueIndex == INVALID_VK_INDEX ? 0 : + mImpl->mProtectedGraphicsQueueIndex; + + ExtensionSet deviceExts; + // If using a shared context, we do not assume any extensions. + if (!mImpl->mSharedContext) { + deviceExts = getDeviceExtensions(mImpl->mPhysicalDevice); + auto [prunedInstExts, prunedDeviceExts] + = pruneExtensions(mImpl->mPhysicalDevice, instExts, deviceExts); + instExts = prunedInstExts; + deviceExts = prunedDeviceExts; + + if (driverConfig.stereoscopicType != StereoscopicType::MULTIVIEW) { + deviceExts.erase(VK_KHR_MULTIVIEW_EXTENSION_NAME); + } + } + + mImpl->mDevice + = mImpl->mDevice == VK_NULL_HANDLE ? createLogicalDevice(mImpl->mPhysicalDevice, + context.mPhysicalDeviceFeatures, mImpl->mGraphicsQueueFamilyIndex, + mImpl->mProtectedGraphicsQueueFamilyIndex, deviceExts) + : mImpl->mDevice; + assert_invariant(mImpl->mDevice != VK_NULL_HANDLE); + + vkGetDeviceQueue(mImpl->mDevice, mImpl->mGraphicsQueueFamilyIndex, mImpl->mGraphicsQueueIndex, + &mImpl->mGraphicsQueue); + assert_invariant(mImpl->mGraphicsQueue != VK_NULL_HANDLE); + + if (context.mProtectedMemorySupported) { + VkDeviceQueueInfo2 info = {}; + info.queueFamilyIndex = mImpl->mProtectedGraphicsQueueFamilyIndex; + info.queueIndex = mImpl->mProtectedGraphicsQueueIndex; + info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2; + info.flags = VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT; + vkGetDeviceQueue2(mImpl->mDevice, &info, &mImpl->mProtectedGraphicsQueue); + } + + // Store the extension support in the context + context.mDebugUtilsSupported = setContains(instExts, VK_EXT_DEBUG_UTILS_EXTENSION_NAME); + context.mDebugMarkersSupported = setContains(deviceExts, VK_EXT_DEBUG_MARKER_EXTENSION_NAME); + context.mMultiviewEnabled = setContains(deviceExts, VK_KHR_MULTIVIEW_EXTENSION_NAME); + + // Check the availability of lazily allocated memory + { + context.mLazilyAllocatedMemorySupported = false; + const uint32_t typeCount = context.mMemoryProperties.memoryTypeCount; + for(uint32_t i = 0; i < typeCount; ++i) { + const VkMemoryType type = context.mMemoryProperties.memoryTypes[i]; + if (type.propertyFlags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) { + context.mLazilyAllocatedMemorySupported = true; + assert_invariant(type.propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + break; + } + } + } + +#ifdef NDEBUG + // If we are in release build, we should not have turned on debug extensions + FILAMENT_CHECK_POSTCONDITION(!context.mDebugUtilsSupported && !context.mDebugMarkersSupported) + << "Debug utils should not be enabled in release build."; +#endif + + context.mDepthStencilFormats = findAttachmentDepthStencilFormats(mImpl->mPhysicalDevice); + context.mBlittableDepthStencilFormats = + findBlittableDepthStencilFormats(mImpl->mPhysicalDevice); + + assert_invariant(context.mDepthStencilFormats.size() > 0); + +#if FVK_ENABLED(FVK_DEBUG_VALIDATION) + printDepthFormats(mImpl->mPhysicalDevice); +#endif + + // Keep a copy of context for swapchains. + mImpl->mContext = context; + + return VulkanDriver::create(this, context, driverConfig); +} + +// This needs to be explictly written for +// utils::PrivateImplementation::PrivateImplementation() to be properly +// defined. +VulkanPlatform::VulkanPlatform() = default; + +VulkanPlatform::~VulkanPlatform() = default; + +VulkanPlatform::SwapChainBundle VulkanPlatform::getSwapChainBundle(SwapChainPtr handle) { + SWAPCHAIN_RET_FUNC(getSwapChainBundle, handle, ) +} + +VkResult VulkanPlatform::acquire(SwapChainPtr handle, ImageSyncData* outImageSyncData) { + SWAPCHAIN_RET_FUNC(acquire, handle, outImageSyncData) +} + +VkResult VulkanPlatform::present(SwapChainPtr handle, uint32_t index, + VkSemaphore finishedDrawing) { + SWAPCHAIN_RET_FUNC(present, handle, index, finishedDrawing) +} + +bool VulkanPlatform::hasResized(SwapChainPtr handle) { + SWAPCHAIN_RET_FUNC(hasResized, handle, ) +} + +bool VulkanPlatform::isProtected(SwapChainPtr handle) { + SWAPCHAIN_RET_FUNC(isProtected, handle, ) +} + +VkResult VulkanPlatform::recreate(SwapChainPtr handle) { + SWAPCHAIN_RET_FUNC(recreate, handle, ) +} + +void VulkanPlatform::destroy(SwapChainPtr handle) { + if (mImpl->mSurfaceSwapChains.erase(handle)) { + delete static_cast(handle); + } else if (mImpl->mHeadlessSwapChains.erase(handle)) { + delete static_cast(handle); + } else { + PANIC_PRECONDITION("Bad handle for swapchain"); + } +} + +SwapChainPtr VulkanPlatform::createSwapChain(void* nativeWindow, uint64_t flags, + VkExtent2D extent) { + assert_invariant(nativeWindow || (extent.width != 0 && extent.height != 0)); + bool const headless = extent.width != 0 && extent.height != 0; + if (headless) { + VulkanPlatformHeadlessSwapChain* swapchain = new VulkanPlatformHeadlessSwapChain( + mImpl->mContext, mImpl->mDevice, mImpl->mGraphicsQueue, extent, flags); + mImpl->mHeadlessSwapChains.insert(swapchain); + return swapchain; + } + + if (mImpl->mForceXCBSwapchain) { + flags |= SWAP_CHAIN_CONFIG_ENABLE_XCB; + } + + if (flags & backend::SWAP_CHAIN_CONFIG_PROTECTED_CONTENT) { + if (!mImpl->mContext.mProtectedMemorySupported) { + utils::slog.w << "protected swapchain requested, but VulkanPlatform does not support it" + << utils::io::endl; + } + } + + auto [surface, fallbackExtent] = createVkSurfaceKHR(nativeWindow, mImpl->mInstance, flags); + // The VulkanPlatformSurfaceSwapChain now `owns` the surface. + VulkanPlatformSurfaceSwapChain* swapchain = new VulkanPlatformSurfaceSwapChain(mImpl->mContext, + mImpl->mPhysicalDevice, mImpl->mDevice, mImpl->mGraphicsQueue, mImpl->mInstance, + surface, fallbackExtent, flags); + mImpl->mSurfaceSwapChains.insert(swapchain); + return swapchain; +} + +VkInstance VulkanPlatform::getInstance() const noexcept { + return mImpl->mInstance; +} + +VkDevice VulkanPlatform::getDevice() const noexcept { + return mImpl->mDevice; +} + +VkPhysicalDevice VulkanPlatform::getPhysicalDevice() const noexcept { + return mImpl->mPhysicalDevice; +} + +uint32_t VulkanPlatform::getGraphicsQueueFamilyIndex() const noexcept { + return mImpl->mGraphicsQueueFamilyIndex; +} + +uint32_t VulkanPlatform::getGraphicsQueueIndex() const noexcept { + return mImpl->mGraphicsQueueIndex; +} + +VkQueue VulkanPlatform::getGraphicsQueue() const noexcept { + return mImpl->mGraphicsQueue; +} + +uint32_t VulkanPlatform::getProtectedGraphicsQueueFamilyIndex() const noexcept { + return mImpl->mProtectedGraphicsQueueFamilyIndex; +} + +uint32_t VulkanPlatform::getProtectedGraphicsQueueIndex() const noexcept { + return mImpl->mProtectedGraphicsQueueIndex; +} + +VkQueue VulkanPlatform::getProtectedGraphicsQueue() const noexcept { + return mImpl->mProtectedGraphicsQueue; +} + +VulkanPlatform::ExternalImageMetadata VulkanPlatform::getExternalImageMetadata( + void* externalImage) { + return getExternalImageMetadataImpl(externalImage, mImpl->mDevice); +} + +VulkanPlatform::ImageData VulkanPlatform::createExternalImage(void* externalImage, + const ExternalImageMetadata& metadata) { + return createExternalImageImpl(externalImage, mImpl->mDevice, nullptr, metadata); +} + +#undef SWAPCHAIN_RET_FUNC + +}// namespace filament::backend diff --git a/filament/backend/src/vulkan/platform/VulkanPlatformAndroid.cpp b/filament/backend/src/vulkan/platform/VulkanPlatformAndroid.cpp new file mode 100644 index 00000000000..0ea9df5fa46 --- /dev/null +++ b/filament/backend/src/vulkan/platform/VulkanPlatformAndroid.cpp @@ -0,0 +1,242 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include + +#include "vulkan/VulkanConstants.h" + +#include + +#include + +#include +#include + +using namespace bluevk; + +namespace filament::backend { + +namespace { +void getVKFormatAndUsage(const AHardwareBuffer_Desc& desc, VkFormat& format, + VkImageUsageFlags& usage, bool& isProtected) { + // Refer to "11.2.17. External Memory Handle Types" in the spec, and + // Tables 13/14 for how the following derivation works. + bool isDepthFormat = false; + isProtected = false; + switch (desc.format) { + case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM: + format = VK_FORMAT_R8G8B8A8_UNORM; + break; + case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM: + format = VK_FORMAT_R8G8B8A8_UNORM; + break; + case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM: + format = VK_FORMAT_R8G8B8_UNORM; + break; + case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM: + format = VK_FORMAT_R5G6B5_UNORM_PACK16; + break; + case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT: + format = VK_FORMAT_R16G16B16A16_SFLOAT; + break; + case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM: + format = VK_FORMAT_A2B10G10R10_UNORM_PACK32; + break; + case AHARDWAREBUFFER_FORMAT_D16_UNORM: + isDepthFormat = true; + format = VK_FORMAT_D16_UNORM; + break; + case AHARDWAREBUFFER_FORMAT_D24_UNORM: + isDepthFormat = true; + format = VK_FORMAT_X8_D24_UNORM_PACK32; + break; + case AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT: + isDepthFormat = true; + format = VK_FORMAT_D24_UNORM_S8_UINT; + break; + case AHARDWAREBUFFER_FORMAT_D32_FLOAT: + isDepthFormat = true; + format = VK_FORMAT_D32_SFLOAT; + break; + case AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT: + isDepthFormat = true; + format = VK_FORMAT_D32_SFLOAT_S8_UINT; + break; + case AHARDWAREBUFFER_FORMAT_S8_UINT: + isDepthFormat = true; + format = VK_FORMAT_S8_UINT; + break; + default: + format = VK_FORMAT_UNDEFINED; + } + + // The following only concern usage flags derived from Table 14. + usage = 0; + if (desc.usage & AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE) { + usage |= VK_IMAGE_USAGE_SAMPLED_BIT; + usage |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; + } + if (desc.usage & AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER) { + if (isDepthFormat) { + usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; + } else { + usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; + } + } + if (desc.usage & AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER) { + usage = VK_IMAGE_USAGE_STORAGE_BIT; + } + if (desc.usage & AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT) { + isProtected = true; + } +} + +VulkanPlatform::ImageData allocateExternalImage(void* externalBuffer, + VkDevice device, const VkAllocationCallbacks* allocator, + VulkanPlatform::ExternalImageMetadata const& metadata) { + VulkanPlatform::ImageData data; + AHardwareBuffer* buffer = static_cast(externalBuffer); + + // if external format we need to specifiy it in the allocation + const bool useExternalFormat = metadata.format == VK_FORMAT_UNDEFINED; + + const VkExternalFormatANDROID externalFormat = { + .sType = VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID, + .pNext = nullptr, + .externalFormat = metadata + .externalFormat,// pass down the format (external means we don't have it VK defined) + }; + const VkExternalMemoryImageCreateInfo externalCreateInfo = { + .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO, + .pNext = useExternalFormat ? &externalFormat : nullptr, + .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, + }; + + VkImageCreateInfo imageInfo{.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO}; + imageInfo.pNext = &externalCreateInfo; + imageInfo.format = metadata.format; + imageInfo.imageType = VK_IMAGE_TYPE_2D; + imageInfo.extent = { + metadata.width, + metadata.height, + 1u, + }; + imageInfo.mipLevels = 1; + imageInfo.arrayLayers = metadata.layers; + imageInfo.usage = metadata.usage; + // In the unprotected case add R/W capabilities + if (metadata.isProtected == false) + imageInfo.usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; + + VkResult result = vkCreateImage(device, &imageInfo, allocator, &data.first); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) + << "vkCreateImage failed with error=" << static_cast(result); + + // Allocate the memory + VkImportAndroidHardwareBufferInfoANDROID androidHardwareBufferInfo = { + .sType = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID, + .pNext = nullptr, + .buffer = buffer, + }; + VkMemoryDedicatedAllocateInfo memoryDedicatedAllocateInfo = { + .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO, + .pNext = &androidHardwareBufferInfo, + .image = data.first, + .buffer = VK_NULL_HANDLE, + }; + VkMemoryAllocateInfo allocInfo = {.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, + .pNext = &memoryDedicatedAllocateInfo, + .allocationSize = metadata.allocationSize, + .memoryTypeIndex = metadata.memoryTypeBits}; + result = vkAllocateMemory(device, &allocInfo, allocator, &data.second); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) + << "vkAllocateMemory failed with error=" << static_cast(result); + + return data; +} + +}// namespace + +VulkanPlatform::ExternalImageMetadata VulkanPlatform::getExternalImageMetadataImpl(void* externalImage, + VkDevice device) { + ExternalImageMetadata metadata; + AHardwareBuffer* buffer = static_cast(externalImage); + if (__builtin_available(android 26, *)) { + AHardwareBuffer_Desc bufferDesc; + AHardwareBuffer_describe(buffer, &bufferDesc); + metadata.width = bufferDesc.width; + metadata.height = bufferDesc.height; + metadata.layers = bufferDesc.layers; + + getVKFormatAndUsage(bufferDesc, metadata.format, metadata.usage, metadata.isProtected); + } + // In the unprotected case add R/W capabilities + if (metadata.isProtected == false) { + metadata.usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; + } + + VkAndroidHardwareBufferFormatPropertiesANDROID formatInfo = { + .sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID, + .pNext = nullptr, + }; + VkAndroidHardwareBufferPropertiesANDROID properties = { + .sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID, + .pNext = &formatInfo, + }; + VkResult result = vkGetAndroidHardwareBufferPropertiesANDROID(device, buffer, &properties); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) + << "vkGetAndroidHardwareBufferProperties failed with error=" + << static_cast(result); + + FILAMENT_CHECK_POSTCONDITION(metadata.format == formatInfo.format) + << "mismatched image format for external image (AHB)"; + metadata.externalFormat = formatInfo.externalFormat; + metadata.allocationSize = properties.allocationSize; + metadata.memoryTypeBits = properties.memoryTypeBits; + return metadata; +} + +VulkanPlatform::ImageData VulkanPlatform::createExternalImageImpl(void* externalImage, + VkDevice device, const VkAllocationCallbacks* allocator, + const ExternalImageMetadata& metadata) { + ImageData data = allocateExternalImage(externalImage, device, allocator, metadata); + VkResult result = vkBindImageMemory(device, data.first, data.second, 0); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) + << "vkBindImageMemory error=" << static_cast(result); + return data; +} + +VulkanPlatform::ExtensionSet VulkanPlatform::getSwapchainInstanceExtensions() { + return { + VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, + }; +} + +VulkanPlatform::SurfaceBundle VulkanPlatform::createVkSurfaceKHR(void* nativeWindow, + VkInstance instance, uint64_t flags) noexcept { + VkSurfaceKHR surface; + VkExtent2D extent; + + VkAndroidSurfaceCreateInfoKHR const createInfo{ + .sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR, + .window = (ANativeWindow*) nativeWindow, + }; + VkResult const result = + vkCreateAndroidSurfaceKHR(instance, &createInfo, VKALLOC, (VkSurfaceKHR*) &surface); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) + << "vkCreateAndroidSurfaceKHR with error=" << static_cast(result); + return {surface, extent}; +} +} diff --git a/filament/backend/src/vulkan/platform/VulkanPlatformApple.mm b/filament/backend/src/vulkan/platform/VulkanPlatformApple.mm new file mode 100644 index 00000000000..578bde3b117 --- /dev/null +++ b/filament/backend/src/vulkan/platform/VulkanPlatformApple.mm @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "vulkan/VulkanConstants.h" +#include "vulkan/VulkanDriverFactory.h" + +#include + +#include + +// Platform specific includes and defines +#if defined(__APPLE__) + #include + #import + #import + + #ifndef VK_MVK_macos_surface + #error VK_MVK_macos_surface is not defined + #endif +#elif defined(FILAMENT_IOS) + // Metal is not available when building for the iOS simulator on Desktop. + #define METAL_AVAILABLE __has_include() + #if METAL_AVAILABLE + #import + #import + #endif + + #ifndef VK_MVK_ios_surface + #error VK_MVK_ios_surface is not defined + #endif + #define METALVIEW_TAG 255 +#else + #error Not a supported Apple + Vulkan platform +#endif + +using namespace bluevk; + +namespace filament::backend { + +VulkanPlatform::ExtensionSet VulkanPlatform::getSwapchainInstanceExtensions() { + ExtensionSet const ret = { + #if defined(__APPLE__) + VK_MVK_MACOS_SURFACE_EXTENSION_NAME, // TODO: replace with VK_EXT_metal_surface + #elif defined(FILAMENT_IOS) && defined(METAL_AVAILABLE) + VK_MVK_IOS_SURFACE_EXTENSION_NAME, + #endif + }; + return ret; +} + +VulkanPlatform::ExternalImageMetadata VulkanPlatform::getExternalImageMetadataImpl( + void* externalImage, VkDevice device) { + return {}; +} + +VulkanPlatform::ImageData VulkanPlatform::createExternalImageImpl(void* externalImage, + VkDevice device, const VkAllocationCallbacks* allocator, + const ExternalImageMetadata& metadata) { + return {}; +} + +VulkanPlatform::SurfaceBundle VulkanPlatform::createVkSurfaceKHR(void* nativeWindow, + VkInstance instance, uint64_t flags) noexcept { + VkSurfaceKHR surface; + #if defined(__APPLE__) + NSView* nsview = (__bridge NSView*) nativeWindow; + FILAMENT_CHECK_POSTCONDITION(nsview) << "Unable to obtain Metal-backed NSView."; + + // Create the VkSurface. + FILAMENT_CHECK_POSTCONDITION(vkCreateMacOSSurfaceMVK) + << "Unable to load vkCreateMacOSSurfaceMVK."; + VkMacOSSurfaceCreateInfoMVK createInfo = {}; + createInfo.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK; + createInfo.pView = (__bridge void*) nsview; + VkResult result = vkCreateMacOSSurfaceMVK((VkInstance) instance, &createInfo, VKALLOC, + (VkSurfaceKHR*) &surface); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) + << "vkCreateMacOSSurfaceMVK. error=" << static_cast(result); +#elif defined(FILAMENT_IOS) && defined(METAL_AVAILABLE) + CAMetalLayer* metalLayer = (CAMetalLayer*) nativeWindow; + // Create the VkSurface. + FILAMENT_CHECK_POSTCONDITION(vkCreateIOSSurfaceMVK) + << "Unable to load vkCreateIOSSurfaceMVK function."; + VkIOSSurfaceCreateInfoMVK createInfo = {}; + createInfo.sType = VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK; + createInfo.pNext = NULL; + createInfo.flags = 0; + createInfo.pView = metalLayer; + VkResult result = vkCreateIOSSurfaceMVK((VkInstance) instance, &createInfo, VKALLOC, + (VkSurfaceKHR*) &surface); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) + << "vkCreateIOSSurfaceMVK failed. error=" << static_cast(result); +#endif + return std::make_tuple(surface, VkExtent2D{}); +} + +} // namespace filament::backend diff --git a/filament/backend/src/vulkan/platform/VulkanPlatformLinuxWindows.cpp b/filament/backend/src/vulkan/platform/VulkanPlatformLinuxWindows.cpp new file mode 100644 index 00000000000..d7ae009724f --- /dev/null +++ b/filament/backend/src/vulkan/platform/VulkanPlatformLinuxWindows.cpp @@ -0,0 +1,222 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include "vulkan/VulkanConstants.h" +#include "vulkan/VulkanDriverFactory.h" + +#include + +#include + +#include + +#include +#include + +#if defined(__linux__) || defined(__FreeBSD__) +#define LINUX_OR_FREEBSD 1 +#endif + +// Platform specific includes and defines +#if defined(__linux__) && defined(FILAMENT_SUPPORTS_WAYLAND) + #include + namespace { + typedef struct _wl { + struct wl_display* display; + struct wl_surface* surface; + uint32_t width; + uint32_t height; + } wl; + }// anonymous namespace +#elif defined(LINUX_OR_FREEBSD) && defined(FILAMENT_SUPPORTS_X11) + // TODO: we should allow for headless on Linux explicitly. Right now this is the headless path + // (with no FILAMENT_SUPPORTS_XCB or FILAMENT_SUPPORTS_XLIB). + #include + #if defined(FILAMENT_SUPPORTS_XCB) + #include + namespace { + typedef xcb_connection_t* (*XCB_CONNECT)(const char* displayname, int* screenp); + } + #endif + #if defined(FILAMENT_SUPPORTS_XLIB) + #include + namespace { + typedef Display* (*X11_OPEN_DISPLAY)(const char*); + } + #endif + static constexpr const char* LIBRARY_X11 = "libX11.so.6"; + namespace { + struct XEnv { + #if defined(FILAMENT_SUPPORTS_XCB) + XCB_CONNECT xcbConnect; + xcb_connection_t* connection; + #endif + #if defined(FILAMENT_SUPPORTS_XLIB) + X11_OPEN_DISPLAY openDisplay; + Display* display; + #endif + void* library = nullptr; + } g_x11_vk; + }// anonymous namespace +#elif defined(WIN32) + // No platform specific includes +#else + // Not a supported Vulkan platform +#endif + +using namespace bluevk; + +namespace filament::backend { + +VulkanPlatform::ExternalImageMetadata VulkanPlatform::getExternalImageMetadataImpl( + void* externalImage, VkDevice device) { + return {}; +} + +VulkanPlatform::ImageData VulkanPlatform::createExternalImageImpl(void* externalImage, + VkDevice device, const VkAllocationCallbacks* allocator, + const ExternalImageMetadata& metadata) { + return {}; +} + +VulkanPlatform::ExtensionSet VulkanPlatform::getSwapchainInstanceExtensions() { + VulkanPlatform::ExtensionSet const ret = { +#if defined(__linux__) && defined(FILAMENT_SUPPORTS_WAYLAND) + VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME, +#elif defined(LINUX_OR_FREEBSD) && defined(FILAMENT_SUPPORTS_X11) + #if defined(FILAMENT_SUPPORTS_XCB) + VK_KHR_XCB_SURFACE_EXTENSION_NAME, + #endif + #if defined(FILAMENT_SUPPORTS_XLIB) + VK_KHR_XLIB_SURFACE_EXTENSION_NAME, + #endif +#elif defined(WIN32) + VK_KHR_WIN32_SURFACE_EXTENSION_NAME, +#endif + }; + return ret; +} + +VulkanPlatform::SurfaceBundle VulkanPlatform::createVkSurfaceKHR(void* nativeWindow, + VkInstance instance, uint64_t flags) noexcept { + VkSurfaceKHR surface; + + // On certain platforms, the extent of the surface cannot be queried from Vulkan. In those + // situations, we allow the frontend to pass in the extent to use in creating the swap + // chains. Platform implementation should set extent to 0 if they do not expect to set the + // swap chain extent. + VkExtent2D extent; + + #if defined(__linux__) && defined(FILAMENT_SUPPORTS_WAYLAND) + wl* ptrval = reinterpret_cast(nativeWindow); + extent.width = ptrval->width; + extent.height = ptrval->height; + + VkWaylandSurfaceCreateInfoKHR const createInfo = { + .sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR, + .pNext = NULL, + .flags = 0, + .display = ptrval->display, + .surface = ptrval->surface, + }; + VkResult const result = vkCreateWaylandSurfaceKHR(instance, &createInfo, VKALLOC, + (VkSurfaceKHR*) &surface); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) << "vkCreateWaylandSurfaceKHR error."; + #elif defined(LINUX_OR_FREEBSD) && defined(FILAMENT_SUPPORTS_X11) + if (g_x11_vk.library == nullptr) { + g_x11_vk.library = dlopen(LIBRARY_X11, RTLD_LOCAL | RTLD_NOW); + FILAMENT_CHECK_PRECONDITION(g_x11_vk.library) << "Unable to open X11 library."; + #if defined(FILAMENT_SUPPORTS_XCB) + g_x11_vk.xcbConnect = (XCB_CONNECT) dlsym(g_x11_vk.library, "xcb_connect"); + int screen; + g_x11_vk.connection = g_x11_vk.xcbConnect(nullptr, &screen); + #endif + #if defined(FILAMENT_SUPPORTS_XLIB) + g_x11_vk.openDisplay = (X11_OPEN_DISPLAY) dlsym(g_x11_vk.library, "XOpenDisplay"); + g_x11_vk.display = g_x11_vk.openDisplay(NULL); + FILAMENT_CHECK_PRECONDITION(g_x11_vk.display) << "Unable to open X11 display."; + #endif + } + #if defined(FILAMENT_SUPPORTS_XCB) || defined(FILAMENT_SUPPORTS_XLIB) + bool useXcb = false; + #endif + #if defined(FILAMENT_SUPPORTS_XCB) + #if defined(FILAMENT_SUPPORTS_XLIB) + useXcb = (flags & SWAP_CHAIN_CONFIG_ENABLE_XCB) != 0; + #else + useXcb = true; + #endif + if (useXcb) { + FILAMENT_CHECK_POSTCONDITION(vkCreateXcbSurfaceKHR) + << "Unable to load vkCreateXcbSurfaceKHR function."; + + VkXcbSurfaceCreateInfoKHR const createInfo = { + .sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR, + .connection = g_x11_vk.connection, + .window = (xcb_window_t) reinterpret_cast(nativeWindow), + }; + VkResult const result = vkCreateXcbSurfaceKHR(instance, &createInfo, VKALLOC, + (VkSurfaceKHR*) &surface); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) + << "vkCreateXcbSurfaceKHR error=" << static_cast(result); + } + #endif + #if defined(FILAMENT_SUPPORTS_XLIB) + if (!useXcb) { + FILAMENT_CHECK_POSTCONDITION(vkCreateXlibSurfaceKHR) + << "Unable to load vkCreateXlibSurfaceKHR function."; + + VkXlibSurfaceCreateInfoKHR const createInfo = { + .sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR, + .dpy = g_x11_vk.display, + .window = (Window) nativeWindow, + }; + VkResult const result = vkCreateXlibSurfaceKHR(instance, &createInfo, VKALLOC, + (VkSurfaceKHR*) &surface); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) + << "vkCreateXlibSurfaceKHR error=" << static_cast(result); + } + #endif + #elif defined(WIN32) + // On (at least) NVIDIA drivers, the Vulkan implementation (specifically the call to + // vkGetPhysicalDeviceSurfaceCapabilitiesKHR()) does not correctly handle the fact that + // each native window has its own DPI_AWARENESS_CONTEXT, and erroneously uses the context + // of the calling thread. As a workaround, we set the current thread's DPI_AWARENESS_CONTEXT + // to that of the native window we've been given. This isn't a perfect solution, because an + // application could create swap chains on multiple native windows with varying DPI-awareness, + // but even then, at least one of the windows would be guaranteed to work correctly. + SetThreadDpiAwarenessContext(GetWindowDpiAwarenessContext((HWND) nativeWindow)); + + VkWin32SurfaceCreateInfoKHR const createInfo = { + .sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR, + .hinstance = GetModuleHandle(nullptr), + .hwnd = (HWND) nativeWindow, + }; + VkResult const result = vkCreateWin32SurfaceKHR(instance, &createInfo, nullptr, + (VkSurfaceKHR*) &surface); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) + << "vkCreateWin32SurfaceKHR failed." + << " error=" << static_cast(result); +#endif + return std::make_tuple(surface, extent); +} + +} // namespace filament::backend + +#undef LINUX_OR_FREEBSD diff --git a/filament/backend/src/vulkan/platform/VulkanPlatformSwapChainImpl.cpp b/filament/backend/src/vulkan/platform/VulkanPlatformSwapChainImpl.cpp new file mode 100644 index 00000000000..cb80e489850 --- /dev/null +++ b/filament/backend/src/vulkan/platform/VulkanPlatformSwapChainImpl.cpp @@ -0,0 +1,426 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "VulkanPlatformSwapChainImpl.h" + +#include "vulkan/VulkanConstants.h" +#include "vulkan/VulkanUtility.h" + +#include + +using namespace bluevk; +using namespace utils; + +namespace filament::backend { + +namespace { + +std::tuple createImageAndMemory(VulkanContext const& context, + VkDevice device, VkExtent2D extent, VkFormat format, + bool isProtected) { + bool const isDepth = isVkDepthFormat(format); + // Filament expects blit() to work with any texture, so we almost always set these usage flags + // (see copyFrame() and readPixels()). + VkImageUsageFlags const blittable = + VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; + + VkImageCreateInfo imageInfo { + .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, + .flags = isProtected ? VK_IMAGE_CREATE_PROTECTED_BIT : VkImageCreateFlags(0), + .imageType = VK_IMAGE_TYPE_2D, + .format = format, + .extent = {extent.width, extent.height, 1}, + .mipLevels = 1, + .arrayLayers = 1, + .samples = VK_SAMPLE_COUNT_1_BIT, + .tiling = VK_IMAGE_TILING_OPTIMAL, + .usage = blittable | (isDepth ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT + : VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT), + }; + VkImage image; + VkResult result = vkCreateImage(device, &imageInfo, VKALLOC, &image); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) + << "Unable to create image: " << static_cast(result); + + // Allocate memory for the VkImage and bind it. + VkDeviceMemory imageMemory; + VkMemoryRequirements memReqs; + vkGetImageMemoryRequirements(device, image, &memReqs); + + const VkFlags requiredMemoryFlags = + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | + (isProtected ? VK_MEMORY_PROPERTY_PROTECTED_BIT : 0U); + uint32_t memoryTypeIndex + = context.selectMemoryType(memReqs.memoryTypeBits, requiredMemoryFlags); + + FILAMENT_CHECK_POSTCONDITION(memoryTypeIndex < VK_MAX_MEMORY_TYPES) + << "VulkanPlatformSwapChainImpl: unable to find a memory type that meets requirements."; + + VkMemoryAllocateInfo allocInfo = { + .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, + .allocationSize = memReqs.size, + .memoryTypeIndex = memoryTypeIndex, + }; + result = vkAllocateMemory(device, &allocInfo, nullptr, &imageMemory); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) << "Unable to allocate image memory." + << " error=" << static_cast(result); + result = vkBindImageMemory(device, image, imageMemory, 0); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) << "Unable to bind image." + << " error=" << static_cast(result); + return std::tuple(image, imageMemory); +} + +VkFormat selectDepthFormat(VkFormatList const& depthFormats, bool hasStencil) { + auto const formatItr = std::find_if(depthFormats.begin(), depthFormats.end(), + hasStencil ? isVkStencilFormat : isVkDepthFormat); + assert_invariant( + formatItr != depthFormats.end() && "Cannot find suitable swapchain depth format"); + return *formatItr; +} + +}// anonymous namespace + +VulkanPlatformSwapChainImpl::VulkanPlatformSwapChainImpl(VulkanContext const& context, + VkDevice device, VkQueue queue) + : mContext(context), + mDevice(device), + mQueue(queue) {} + +VulkanPlatformSwapChainImpl::~VulkanPlatformSwapChainImpl() { + destroy(); +} + +void VulkanPlatformSwapChainImpl::destroy() { + if (mSwapChainBundle.depth) { + vkDestroyImage(mDevice, mSwapChainBundle.depth, VKALLOC); + if (mMemory.find(mSwapChainBundle.depth) != mMemory.end()) { + vkFreeMemory(mDevice, mMemory.at(mSwapChainBundle.depth), VKALLOC); + mMemory.erase(mSwapChainBundle.depth); + } + } + mSwapChainBundle.depth = VK_NULL_HANDLE; + + // Note: Hardware-backed swapchain images are not owned by us and should not be destroyed. + mSwapChainBundle.colors.clear(); +} + +VkImage VulkanPlatformSwapChainImpl::createImage(VkExtent2D extent, VkFormat format, + bool isProtected) { + auto [image, memory] = createImageAndMemory(mContext, mDevice, extent, format, isProtected); + mMemory.insert({image, memory}); + return image; +} + +VulkanPlatformSurfaceSwapChain::VulkanPlatformSurfaceSwapChain(VulkanContext const& context, + VkPhysicalDevice physicalDevice, VkDevice device, VkQueue queue, VkInstance instance, + VkSurfaceKHR surface, VkExtent2D fallbackExtent, uint64_t flags) + : VulkanPlatformSwapChainImpl(context, device, queue), + mInstance(instance), + mPhysicalDevice(physicalDevice), + mSurface(surface), + mFallbackExtent(fallbackExtent), + mUsesRGB((flags & backend::SWAP_CHAIN_CONFIG_SRGB_COLORSPACE) != 0), + mHasStencil((flags & backend::SWAP_CHAIN_HAS_STENCIL_BUFFER) != 0), + mIsProtected((flags & backend::SWAP_CHAIN_CONFIG_PROTECTED_CONTENT) != 0) { + assert_invariant(surface); + create(); +} + +VulkanPlatformSurfaceSwapChain::~VulkanPlatformSurfaceSwapChain() { + destroy(); + vkDestroySurfaceKHR(mInstance, mSurface, VKALLOC); +} + +VkResult VulkanPlatformSurfaceSwapChain::create() { + VkSurfaceFormatKHR surfaceFormat = {}; + VkSurfaceCapabilitiesKHR caps; + vkGetPhysicalDeviceSurfaceCapabilitiesKHR(mPhysicalDevice, mSurface, &caps); + + // The general advice is to require one more than the minimum swap chain length, since the + // absolute minimum could easily require waiting for a driver or presentation layer to release + // the previous frame's buffer. The only situation in which we'd ask for the minimum length is + // when using a MAILBOX presentation strategy for low-latency situations where tearing is + // acceptable. + uint32_t const maxImageCount = caps.maxImageCount; + uint32_t const minImageCount = caps.minImageCount; + uint32_t desiredImageCount = minImageCount + 1; + + // According to section 30.5 of VK 1.1, maxImageCount of zero means "that there is no limit on + // the number of images, though there may be limits related to the total amount of memory used + // by presentable images." + if (maxImageCount != 0 && desiredImageCount > maxImageCount) { + FVK_LOGE << "Swap chain does not support " << desiredImageCount << " images." + << utils::io::endl; + desiredImageCount = caps.minImageCount; + } + + // Find a suitable surface format. + FixedCapacityVector const surfaceFormats + = enumerate(vkGetPhysicalDeviceSurfaceFormatsKHR, mPhysicalDevice, mSurface); + std::array expectedFormats = { + VK_FORMAT_R8G8B8A8_UNORM, + VK_FORMAT_B8G8R8A8_UNORM, + }; + if (mUsesRGB) { + expectedFormats = { + VK_FORMAT_R8G8B8A8_SRGB, + VK_FORMAT_B8G8R8A8_SRGB, + }; + } + for (VkSurfaceFormatKHR const& format: surfaceFormats) { + if (std::any_of(expectedFormats.begin(), expectedFormats.end(), + [&format](VkFormat f) { return f == format.format; })) { + surfaceFormat = format; + break; + } + } + FILAMENT_CHECK_POSTCONDITION(surfaceFormat.format != VK_FORMAT_UNDEFINED) + << "Cannot find suitable swapchain format"; + + // Verify that our chosen present mode is supported. In practice all devices support the FIFO + // mode, but we check for it anyway for completeness. (and to avoid validation warnings) + VkPresentModeKHR const desiredPresentMode = VK_PRESENT_MODE_FIFO_KHR; + FixedCapacityVector presentModes + = enumerate(vkGetPhysicalDeviceSurfacePresentModesKHR, mPhysicalDevice, mSurface); + bool foundSuitablePresentMode = false; + for (VkPresentModeKHR mode: presentModes) { + if (mode == desiredPresentMode) { + foundSuitablePresentMode = true; + break; + } + } + FILAMENT_CHECK_POSTCONDITION(foundSuitablePresentMode) + << "Desired present mode is not supported by this device."; + + // Create the low-level swap chain. + if (caps.currentExtent.width == VULKAN_UNDEFINED_EXTENT + || caps.currentExtent.height == VULKAN_UNDEFINED_EXTENT) { + mSwapChainBundle.extent = mFallbackExtent; + } else { + mSwapChainBundle.extent = caps.currentExtent; + } + + VkCompositeAlphaFlagBitsKHR const compositeAlpha + = (caps.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR) + ? VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR + : VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; + + VkSwapchainCreateInfoKHR const createInfo{ + .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, + .flags = mIsProtected ? VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR : + VkSwapchainCreateFlagsKHR(0), + .surface = mSurface, + .minImageCount = desiredImageCount, + .imageFormat = surfaceFormat.format, + .imageColorSpace = surfaceFormat.colorSpace, + .imageExtent = mSwapChainBundle.extent, + .imageArrayLayers = 1, + .imageUsage + = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT + | VK_IMAGE_USAGE_TRANSFER_DST_BIT // Allows use as a blit destination (for copyFrame) + | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,// Allows use as a blit source (for readPixels) + + // TODO: Setting the preTransform to IDENTITY means we are letting the Android + // Compositor handle the rotation. In some situations it might be more efficient to + // handle this ourselves by setting this field to be equal to the currentTransform mask + // in the caps, but this would involve adjusting the MVP, derivatives in GLSL, and + // possibly more. + // https://android-developers.googleblog.com/2020/02/handling-device-orientation-efficiently.html + .preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, + + .compositeAlpha = compositeAlpha, + .presentMode = desiredPresentMode, + .clipped = VK_TRUE, + + .oldSwapchain = mSwapchain, + }; + VkResult result = vkCreateSwapchainKHR(mDevice, &createInfo, VKALLOC, &mSwapchain); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) << "vkCreateSwapchainKHR failed." + << " error=" << static_cast(result); + + mSwapChainBundle.colors = enumerate(vkGetSwapchainImagesKHR, mDevice, mSwapchain); + mSwapChainBundle.colorFormat = surfaceFormat.format; + mSwapChainBundle.depthFormat = + selectDepthFormat(mContext.getAttachmentDepthStencilFormats(), mHasStencil); + mSwapChainBundle.depth = createImage(mSwapChainBundle.extent, + mSwapChainBundle.depthFormat, mIsProtected); + mSwapChainBundle.isProtected = mIsProtected; + + FVK_LOGI << "vkCreateSwapchain" + << ": " << mSwapChainBundle.extent.width << "x" << mSwapChainBundle.extent.height << ", " + << surfaceFormat.format << ", " << surfaceFormat.colorSpace << ", " + << "swapchain-size=" << mSwapChainBundle.colors.size() << ", " + << "identity-transform=" << (caps.currentTransform == 1) << ", " + << "depth=" << mSwapChainBundle.depthFormat << ", " + << "protected=" << mSwapChainBundle.isProtected + << io::endl; + + VkSemaphoreCreateInfo const semaphoreCreateInfo = { + .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, + }; + + for (uint32_t i = 0; i < IMAGE_READY_SEMAPHORE_COUNT; ++i) { + VkResult result = vkCreateSemaphore(mDevice, &semaphoreCreateInfo, nullptr, + mImageReady + i); + FILAMENT_CHECK_POSTCONDITION(result == VK_SUCCESS) + << "Failed to create semaphore." + << " error=" << static_cast(result); + } + + return result; +} + +VkResult VulkanPlatformSurfaceSwapChain::acquire(VulkanPlatform::ImageSyncData* outImageSyncData) { + mCurrentImageReadyIndex = (mCurrentImageReadyIndex + 1) % IMAGE_READY_SEMAPHORE_COUNT; + outImageSyncData->imageReadySemaphore = mImageReady[mCurrentImageReadyIndex]; + VkResult result = vkAcquireNextImageKHR(mDevice, mSwapchain, UINT64_MAX, + outImageSyncData->imageReadySemaphore, VK_NULL_HANDLE, &outImageSyncData->imageIndex); + + // Users should be notified of a suboptimal surface, but it should not cause a cascade of + // log messages or a loop of re-creations. + if (result == VK_SUBOPTIMAL_KHR && !mSuboptimal) { + FVK_LOGW << "Vulkan Driver: Suboptimal swap chain." << io::endl; + mSuboptimal = true; + } + return result; +} + +VkResult VulkanPlatformSurfaceSwapChain::present(uint32_t index, VkSemaphore finished) { + uint32_t currentIndex = index; + VkSemaphore finishedDrawing = finished; + VkPresentInfoKHR presentInfo{ + .sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, + .waitSemaphoreCount = 1, + .pWaitSemaphores = &finishedDrawing, + .swapchainCount = 1, + .pSwapchains = &mSwapchain, + .pImageIndices = ¤tIndex, + }; + VkResult result = vkQueuePresentKHR(mQueue, &presentInfo); + + // On Android Q and above, a suboptimal surface is always reported after screen rotation: + // https://android-developers.googleblog.com/2020/02/handling-device-orientation-efficiently.html + if (result == VK_SUBOPTIMAL_KHR && !mSuboptimal) { + FVK_LOGW << "Vulkan Driver: Suboptimal swap chain." << utils::io::endl; + mSuboptimal = true; + } + return result; +} + +bool VulkanPlatformSurfaceSwapChain::hasResized() { + VkSurfaceCapabilitiesKHR caps; + vkGetPhysicalDeviceSurfaceCapabilitiesKHR(mPhysicalDevice, mSurface, &caps); + VkExtent2D perceivedExtent = caps.currentExtent; + // Create the low-level swap chain. + if (perceivedExtent.width == VULKAN_UNDEFINED_EXTENT + || perceivedExtent.height == VULKAN_UNDEFINED_EXTENT) { + perceivedExtent = mFallbackExtent; + } + return !equivalent(mSwapChainBundle.extent, perceivedExtent); +} + +bool VulkanPlatformSurfaceSwapChain::isProtected() { + return mIsProtected; +} + +// Non-virtual override +VkResult VulkanPlatformSurfaceSwapChain::recreate() { + destroy(); + return create(); +} + +void VulkanPlatformSurfaceSwapChain::destroy() { + // The next part is not ideal. We don't have a good signal on when it's ok to destroy + // a swapchain. This is a spec oversight and mentioned as much: + // https://github.com/KhronosGroup/Vulkan-Docs/issues/1678 + // + // One workaround [1] is: + // https://docs.vulkan.org/samples/latest/samples/api/swapchain_recreation/README.html + // + // The proper fix is to use VK_EXT_swapchain_maintenance1, but availability of this extension is + // unknown (not yet ratified). + // + // Instead of adding too much mechanics, we're taking a hacksaw to the problem - just wait for + // the queue to be idle. The hope is that this only happens on resize, where performance + // degradation is less obvious (until, of course, people complain about lag when rotating their + // phone). If necessary, we can revisit and implement the workaround [1]. + vkQueueWaitIdle(mQueue); + + VulkanPlatformSwapChainImpl::destroy(); + + for (uint32_t i = 0; i < IMAGE_READY_SEMAPHORE_COUNT; ++i) { + if (mImageReady[i] != VK_NULL_HANDLE) { + vkDestroySemaphore(mDevice, mImageReady[i], VKALLOC); + mImageReady[i] = VK_NULL_HANDLE; + } + } + if (mSwapchain) { + vkDestroySwapchainKHR(mDevice, mSwapchain, VKALLOC); + mSwapchain = VK_NULL_HANDLE; + } +} + +VulkanPlatformHeadlessSwapChain::VulkanPlatformHeadlessSwapChain(VulkanContext const& context, + VkDevice device, VkQueue queue, VkExtent2D extent, uint64_t flags) + : VulkanPlatformSwapChainImpl(context, device, queue), + mCurrentIndex(0) { + mSwapChainBundle.extent = extent; + mSwapChainBundle.colorFormat = (flags & backend::SWAP_CHAIN_CONFIG_SRGB_COLORSPACE) != 0 + ? VK_FORMAT_R8G8B8A8_SRGB + : VK_FORMAT_R8G8B8A8_UNORM; + + auto& images = mSwapChainBundle.colors; + images.reserve(HEADLESS_SWAPCHAIN_SIZE); + images.resize(HEADLESS_SWAPCHAIN_SIZE); + for (size_t i = 0; i < HEADLESS_SWAPCHAIN_SIZE; ++i) { + images[i] = createImage(extent, mSwapChainBundle.colorFormat, false); + } + + bool const hasStencil = (flags & backend::SWAP_CHAIN_HAS_STENCIL_BUFFER) != 0; + mSwapChainBundle.depthFormat = + selectDepthFormat(mContext.getAttachmentDepthStencilFormats(), hasStencil); + mSwapChainBundle.depth = createImage(extent, mSwapChainBundle.depthFormat, false); +} + +VulkanPlatformHeadlessSwapChain::~VulkanPlatformHeadlessSwapChain() { + destroy(); +} + +VkResult VulkanPlatformHeadlessSwapChain::present(uint32_t index, VkSemaphore finished) { + // No-op for headless swapchain. + return VK_SUCCESS; +} + +VkResult VulkanPlatformHeadlessSwapChain::acquire(VulkanPlatform::ImageSyncData* outImageSyncData) { + outImageSyncData->imageIndex = mCurrentIndex; + mCurrentIndex = (mCurrentIndex + 1) % HEADLESS_SWAPCHAIN_SIZE; + return VK_SUCCESS; +} + +void VulkanPlatformHeadlessSwapChain::destroy() { + // This is only ever called from the destructor since headless does not recreate. + for (auto image: mSwapChainBundle.colors) { + vkDestroyImage(mDevice, image, VKALLOC); + if (mMemory.find(image) != mMemory.end()) { + vkFreeMemory(mDevice, mMemory.at(image), VKALLOC); + mMemory.erase(image); + } + } + mSwapChainBundle.colors.clear(); + // No need to manually call through to the super because the super's destructor will be called +} + +}// namespace filament::backend diff --git a/filament/backend/src/vulkan/platform/VulkanPlatformSwapChainImpl.h b/filament/backend/src/vulkan/platform/VulkanPlatformSwapChainImpl.h new file mode 100644 index 00000000000..ff1179d4ec3 --- /dev/null +++ b/filament/backend/src/vulkan/platform/VulkanPlatformSwapChainImpl.h @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_VULKANSWAPCHAIN_IMPL_H +#define TNT_FILAMENT_BACKEND_VULKANSWAPCHAIN_IMPL_H + +#include "vulkan/VulkanContext.h" + +#include + +#include + +#include +#include + +using namespace bluevk; + +namespace filament::backend { + +static constexpr uint32_t const VULKAN_UNDEFINED_EXTENT = 0xFFFFFFFF; + +struct VulkanPlatformSwapChainImpl : public Platform::SwapChain { + VulkanPlatformSwapChainImpl(VulkanContext const& context, VkDevice device, VkQueue queue); + + inline VulkanPlatform::SwapChainBundle getSwapChainBundle() const { + return mSwapChainBundle; + } + + ~VulkanPlatformSwapChainImpl(); + + // Non-virtual override-able method + VkResult acquire(VulkanPlatform::ImageSyncData* outImageSyncData) { + PANIC_PRECONDITION("Should not be called"); + return VK_ERROR_UNKNOWN; + } + + // Non-virtual override-able method + VkResult present(uint32_t index, VkSemaphore finished) { + PANIC_PRECONDITION("Should not be called"); + return VK_ERROR_UNKNOWN; + } + + // Non-virtual override-able method + VkResult recreate() { + PANIC_PRECONDITION("Should not be called"); + return VK_ERROR_UNKNOWN; + } + + // Non-virtual override-able method + bool hasResized() { + return false; + } + + // Non-virtual override-able method + bool isProtected() { + return false; + } + +protected: + // Non-virtual override-able method + void destroy(); + + VkImage createImage(VkExtent2D extent, VkFormat format, bool isProtected); + + VulkanContext const& mContext; + VkDevice mDevice; + VkQueue mQueue; + + VulkanPlatform::SwapChainBundle mSwapChainBundle; + std::unordered_map mMemory; +}; + +struct VulkanPlatformSurfaceSwapChain : public VulkanPlatformSwapChainImpl { + VulkanPlatformSurfaceSwapChain(VulkanContext const& context, VkPhysicalDevice physicalDevice, + VkDevice device, VkQueue queue, VkInstance instance, VkSurfaceKHR surface, + VkExtent2D fallbackExtent, uint64_t flags); + + ~VulkanPlatformSurfaceSwapChain(); + + // Non-virtual override + VkResult acquire(VulkanPlatform::ImageSyncData* outImageSyncData); + + // Non-virtual override + VkResult present(uint32_t index, VkSemaphore finished); + + // Non-virtual override-able method + VkResult recreate(); + + // Non-virtual override-able method + bool hasResized(); + + // Non-virtual override-able method + bool isProtected(); + +protected: + // Non-virtual override-able method + void destroy(); + +private: + static constexpr int IMAGE_READY_SEMAPHORE_COUNT = FVK_MAX_COMMAND_BUFFERS; + + VkResult create(); + + VkInstance mInstance; + VkPhysicalDevice mPhysicalDevice; + // This class takes ownership of the surface. + VkSurfaceKHR mSurface; + VkSwapchainKHR mSwapchain = VK_NULL_HANDLE; + VkExtent2D const mFallbackExtent; + VkSemaphore mImageReady[IMAGE_READY_SEMAPHORE_COUNT]; + uint32_t mCurrentImageReadyIndex; + + bool mUsesRGB = false; + bool mHasStencil = false; + bool mIsProtected = false; + bool mSuboptimal; +}; + +struct VulkanPlatformHeadlessSwapChain : public VulkanPlatformSwapChainImpl { + static constexpr size_t const HEADLESS_SWAPCHAIN_SIZE = 2; + + VulkanPlatformHeadlessSwapChain(VulkanContext const& context, VkDevice device, VkQueue queue, + VkExtent2D extent, uint64_t flags); + + ~VulkanPlatformHeadlessSwapChain(); + + // Non-virtual override + VkResult acquire(VulkanPlatform::ImageSyncData* outImageSyncData); + + // Non-virtual override + VkResult present(uint32_t index, VkSemaphore finished); + +protected: + // Non-virtual override-able method + void destroy(); + +private: + uint32_t mCurrentIndex; +}; + +}// namespace filament::backend + +#endif// TNT_FILAMENT_BACKEND_VULKANSWAPCHAIN_IMPL_H diff --git a/filament/backend/src/vulkan/spirv/VulkanSpirvUtils.cpp b/filament/backend/src/vulkan/spirv/VulkanSpirvUtils.cpp new file mode 100644 index 00000000000..209745facd9 --- /dev/null +++ b/filament/backend/src/vulkan/spirv/VulkanSpirvUtils.cpp @@ -0,0 +1,207 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "VulkanSpirvUtils.h" + +#include // UTILS_UNUSED_IN_RELEASE, UTILS_FALLTHROUGH +#include // assert_invariant +#include + +#include + +#include +#include +#include +#include + +namespace filament::backend { + +namespace { + +// This function transforms an OpSpecConstant instruction into just a OpConstant instruction. +// Additionally, it will adjust the value of the constant as given by the program. +void getTransformedConstantInst(SpecConstantValue* value, uint32_t* inst) { + + // The first word is the size of the instruction and the instruction type. + // The second word is the type of the instruction. + // The third word is the "result id" (i.e. the variable to store into). + // The fourth word (only for floats and ints) is the literal representing the value. + // We only want to change the first and fourth words. + constexpr size_t const OP = 0; + constexpr size_t const VALUE = 3; + + if (!value) { + // If a specialization wasn't provided, just switch the opcode. + uint32_t const op = inst[OP] & 0x0000FFFF; + if (op == spv::Op::OpSpecConstantFalse) { + inst[OP] = (3 << 16) | spv::Op::OpConstantFalse; + } else if (op == spv::Op::OpSpecConstantTrue) { + inst[OP] = (3 << 16) | spv::Op::OpConstantTrue; + } else if (op == spv::Op::OpSpecConstant) { + inst[OP] = (4 << 16) | spv::Op::OpConstant; + } + } else if (std::holds_alternative(*value)) { + inst[OP] = (3 << 16) + | (std::get(*value) ? spv::Op::OpConstantTrue : spv::Op::OpConstantFalse); + } else if (std::holds_alternative(*value)) { + float const fval = std::get(*value); + inst[OP] = (4 << 16) | spv::Op::OpConstant; + inst[VALUE] = *reinterpret_cast(&fval); + } else { + int const ival = std::get(*value); + inst[OP] = (4 << 16) | spv::Op::OpConstant; + inst[VALUE] = *reinterpret_cast(&ival); + } +} + +} // anonymous namespace + +void workaroundSpecConstant(Program::ShaderBlob const& blob, + utils::FixedCapacityVector const& specConstants, + std::vector& output) { + using WordMap = std::unordered_map; + using SpecValueMap = std::unordered_map; + constexpr size_t HEADER_SIZE = 5; + + WordMap varToIdMap; + SpecValueMap idToValue; + + for (auto spec: specConstants) { + idToValue[spec.id] = spec.value; + } + + // The follow loop will iterate through all the instructions and look for instructions of the + // form: + // + // OpDecorate %1 SpecId 0 + // %1 = OpSpecConstantFalse %bool + // + // We want to track the mapping between the variable id %1 and the specId 0. And when seeing a + // %1 as the result, we want to change that instruction to just an OpConsant where the constant + // value is adjusted by the spec values provided in the program. + // Additionally, we will turn the SpecId decorations to no-ops. + size_t const dataSize = blob.size() / 4; + + output.resize(dataSize); + uint32_t const* data = (uint32_t*) blob.data(); + uint32_t* outputData = output.data(); + + std::memcpy(&outputData[0], &data[0], HEADER_SIZE * 4); + size_t outputCursor = HEADER_SIZE; + + for (uint32_t cursor = HEADER_SIZE, cursorEnd = dataSize; cursor < cursorEnd;) { + uint32_t const firstWord = data[cursor]; + uint32_t const wordCount = firstWord >> 16; + uint32_t const op = firstWord & 0x0000FFFF; + + switch(op) { + case spv::Op::OpSpecConstant: + case spv::Op::OpSpecConstantTrue: + case spv::Op::OpSpecConstantFalse: { + uint32_t const targetVar = data[cursor + 2]; + + UTILS_UNUSED_IN_RELEASE WordMap::const_iterator idItr = varToIdMap.find(targetVar); + assert_invariant(idItr != varToIdMap.end() && + "Cannot find variable previously decorated with SpecId"); + + auto valItr = idToValue.find(idItr->second); + + SpecConstantValue* val = (valItr != idToValue.end()) ? &valItr->second : nullptr; + std::memcpy(&outputData[outputCursor], &data[cursor], wordCount * 4); + getTransformedConstantInst(val, &outputData[outputCursor]); + outputCursor += wordCount; + break; + } + case spv::Op::OpDecorate: { + if (data[cursor + 2] == spv::Decoration::DecorationSpecId) { + uint32_t const targetVar = data[cursor + 1]; + uint32_t const specId = data[cursor + 3]; + varToIdMap[targetVar] = specId; + + // Note these decorations do not need to be written to the output. + break; + } + // else fallthrough and copy like all other instructions + UTILS_FALLTHROUGH; + } + default: + std::memcpy(&outputData[outputCursor], &data[cursor], wordCount * 4); + outputCursor += wordCount; + break; + } + cursor += wordCount; + } + output.resize(outputCursor); +} + +std::tuple getProgramBindings(Program::ShaderBlob const& blob) { + std::unordered_map targetToSet, targetToBinding; + + constexpr size_t HEADER_SIZE = 5; + + size_t const dataSize = blob.size() / 4; + uint32_t const* data = (uint32_t*) blob.data(); + + for (uint32_t cursor = HEADER_SIZE, cursorEnd = dataSize; cursor < cursorEnd;) { + uint32_t const firstWord = data[cursor]; + uint32_t const wordCount = firstWord >> 16; + uint32_t const op = firstWord & 0x0000FFFF; + + switch(op) { + case spv::Op::OpDecorate: { + if (data[cursor + 2] == spv::Decoration::DecorationDescriptorSet) { + uint32_t const targetVar = data[cursor + 1]; + uint32_t const setId = data[cursor + 3]; + targetToSet[targetVar] = setId; + } else if (data[cursor + 2] == spv::Decoration::DecorationBinding) { + uint32_t const targetVar = data[cursor + 1]; + uint32_t const binding = data[cursor + 3]; + targetToBinding[targetVar] = binding; + } + break; + } + default: + break; + } + cursor += wordCount; + } + + constexpr uint32_t UBO = 0; + constexpr uint32_t SAMPLER = 1; + constexpr uint32_t IATTACHMENT = 2; + uint32_t ubo = 0, sampler = 0, inputAttachment = 0; + + for (auto const& [target, setId]: targetToSet) { + uint32_t const binding = targetToBinding[target]; + assert_invariant(binding < 32); + switch(setId) { + case UBO: + ubo |= (1 << binding); + break; + case SAMPLER: + sampler |= (1 << binding); + break; + case IATTACHMENT: + inputAttachment |= (1 << binding); + break; + default: + PANIC_POSTCONDITION("unexpected %d", (int) setId); + } + } + return {ubo, sampler, inputAttachment}; +} + +} // namespace filament::backend diff --git a/filament/backend/src/vulkan/spirv/VulkanSpirvUtils.h b/filament/backend/src/vulkan/spirv/VulkanSpirvUtils.h new file mode 100644 index 00000000000..2a9f79a6118 --- /dev/null +++ b/filament/backend/src/vulkan/spirv/VulkanSpirvUtils.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BACKEND_VULKANSPIRVUTILS_H +#define TNT_FILAMENT_BACKEND_VULKANSPIRVUTILS_H + +#include + +#include + +#include +#include + +namespace filament::backend { + +using SpecConstantValue = Program::SpecializationConstant::Type; + +// For certain drivers, using spec constant can lead to compile errors [1] or undesirable behaviors +// [2]. In those instances, we simply change the spirv and set them to constants. +// +// (Implemenation note: we cannot write to the blob because spirv-validator does not properly handle +// the Nop (no-op) instruction, and swiftshader validates the shader before compilation. So we need +// to skip those instructions instead). +// +// [1]: QC driver cannot use spec constant to size fields +// (https://github.com/google/filament/issues/6444). +// [2]: An internal driver does not DCE a block guarded by a spec-const boolean set to false +// (b/310603393). +void workaroundSpecConstant(Program::ShaderBlob const& blob, + utils::FixedCapacityVector const& specConstants, + std::vector& output); + +// bindings for UBO, samplers, input attachment +std::tuple getProgramBindings(Program::ShaderBlob const& blob); + +} // namespace filament::backend + +#endif // TNT_FILAMENT_BACKEND_VULKANSPIRVUTILS_H diff --git a/filament/backend/test/BackendTest.cpp b/filament/backend/test/BackendTest.cpp index 4e8309ca36c..ff4e8bb1cab 100644 --- a/filament/backend/test/BackendTest.cpp +++ b/filament/backend/test/BackendTest.cpp @@ -33,7 +33,7 @@ static constexpr size_t CONFIG_COMMAND_BUFFERS_SIZE = 3 * CONFIG_MIN_COMMAND using namespace filament; using namespace filament::backend; -#ifndef IOS +#ifndef FILAMENT_IOS #include #include @@ -51,7 +51,7 @@ void BackendTest::init(Backend backend, bool isMobilePlatform) { } BackendTest::BackendTest() : commandBufferQueue(CONFIG_MIN_COMMAND_BUFFERS_SIZE, - CONFIG_COMMAND_BUFFERS_SIZE) { + CONFIG_COMMAND_BUFFERS_SIZE, /*mPaused=*/false) { initializeDriver(); } @@ -85,17 +85,17 @@ void BackendTest::executeCommands() { } } -void BackendTest::flushAndWait(uint64_t timeout) { - auto& api = getDriverApi(); - auto fence = api.createFence(); - api.finish(); +void BackendTest::flushAndWait() { + getDriverApi().finish(); executeCommands(); - api.wait(fence, timeout); - api.destroyFence(fence); + getDriver().purge(); } Handle BackendTest::createSwapChain() { const NativeView& view = getNativeView(); + if (!view.ptr) { + return getDriverApi().createSwapChainHeadless(view.width, view.height, 0); + } return getDriverApi().createSwapChain(view.ptr, 0); } @@ -112,9 +112,10 @@ void BackendTest::fullViewport(Viewport& viewport) { } void BackendTest::renderTriangle( - filament::backend::Handle renderTarget, - filament::backend::Handle swapChain, - filament::backend::Handle program) { + PipelineLayout const& pipelineLayout, + Handle renderTarget, + Handle swapChain, + Handle program) { RenderPassParams params = {}; fullViewport(params); params.flags.clear = TargetBufferFlags::COLOR; @@ -123,11 +124,15 @@ void BackendTest::renderTriangle( params.flags.discardEnd = TargetBufferFlags::NONE; params.viewport.height = 512; params.viewport.width = 512; - renderTriangle(renderTarget, swapChain, program, params); + renderTriangle(pipelineLayout, renderTarget, swapChain, program, params); } -void BackendTest::renderTriangle(Handle renderTarget, - Handle swapChain, Handle program, const RenderPassParams& params) { +void BackendTest::renderTriangle( + PipelineLayout const& pipelineLayout, + Handle renderTarget, + Handle swapChain, + Handle program, + const RenderPassParams& params) { auto& api = getDriverApi(); TrianglePrimitive triangle(api); @@ -138,12 +143,13 @@ void BackendTest::renderTriangle(Handle renderTarget, PipelineState state; state.program = program; + state.pipelineLayout = pipelineLayout; state.rasterState.colorWrite = true; state.rasterState.depthWrite = false; state.rasterState.depthFunc = RasterState::DepthFunc::A; state.rasterState.culling = CullingMode::NONE; - api.draw(state, triangle.getRenderPrimitive(), 1); + api.draw(state, triangle.getRenderPrimitive(), 0, 3, 1); api.endRenderPass(); } @@ -171,7 +177,7 @@ void BackendTest::readPixelsAndAssertHash(const char* testName, size_t width, si // Export a screenshot, if requested. if (c->exportScreenshot) { -#ifndef IOS +#ifndef FILAMENT_IOS LinearImage image(c->width, c->height, 4); image = toLinearWithAlpha(c->width, c->height, c->width * 4, (uint8_t*) buffer); @@ -214,66 +220,4 @@ int runTests() { return RUN_ALL_TESTS(); } -void getPixelInfo(PixelDataFormat format, PixelDataType type, size_t& outComponents, int& outBpp) { - assert_invariant(type != PixelDataType::COMPRESSED); - switch (format) { - case PixelDataFormat::UNUSED: - case PixelDataFormat::R: - case PixelDataFormat::R_INTEGER: - case PixelDataFormat::DEPTH_COMPONENT: - case PixelDataFormat::ALPHA: - outComponents = 1; - break; - case PixelDataFormat::RG: - case PixelDataFormat::RG_INTEGER: - case PixelDataFormat::DEPTH_STENCIL: - outComponents = 2; - break; - case PixelDataFormat::RGB: - case PixelDataFormat::RGB_INTEGER: - outComponents = 3; - break; - case PixelDataFormat::RGBA: - case PixelDataFormat::RGBA_INTEGER: - outComponents = 4; - break; - } - - outBpp = outComponents; - switch (type) { - case PixelDataType::COMPRESSED: // Impossible -- to squash the IDE warnings - case PixelDataType::UBYTE: - case PixelDataType::BYTE: - // nothing to do - break; - case PixelDataType::USHORT: - case PixelDataType::SHORT: - case PixelDataType::HALF: - outBpp *= 2; - break; - case PixelDataType::UINT: - case PixelDataType::INT: - case PixelDataType::FLOAT: - outBpp *= 4; - break; - case PixelDataType::UINT_10F_11F_11F_REV: - // Special case, format must be RGB and uses 4 bytes - assert_invariant(format == PixelDataFormat::RGB); - outBpp = 4; - break; - case PixelDataType::UINT_2_10_10_10_REV: - // Special case, format must be RGBA and uses 4 bytes - assert_invariant(format == PixelDataFormat::RGBA); - outBpp = 4; - break; - case PixelDataType::USHORT_565: - // Special case, format must be RGB and uses 2 bytes - assert_invariant(format == PixelDataFormat::RGB); - outBpp = 2; - break; - } -} - - } // namespace test - diff --git a/filament/backend/test/BackendTest.h b/filament/backend/test/BackendTest.h index d538301fd84..981b0eaa074 100644 --- a/filament/backend/test/BackendTest.h +++ b/filament/backend/test/BackendTest.h @@ -43,7 +43,7 @@ class BackendTest : public ::testing::Test { void initializeDriver(); void executeCommands(); - void flushAndWait(uint64_t timeout = 1000); + void flushAndWait(); filament::backend::Handle createSwapChain(); @@ -51,10 +51,15 @@ class BackendTest : public ::testing::Test { static void fullViewport(filament::backend::RenderPassParams& params); static void fullViewport(filament::backend::Viewport& viewport); - void renderTriangle(filament::backend::Handle renderTarget, + void renderTriangle( + filament::backend::PipelineLayout const& pipelineLayout, + filament::backend::Handle renderTarget, filament::backend::Handle swapChain, filament::backend::Handle program); - void renderTriangle(filament::backend::Handle renderTarget, + + void renderTriangle( + filament::backend::PipelineLayout const& pipelineLayout, + filament::backend::Handle renderTarget, filament::backend::Handle swapChain, filament::backend::Handle program, const filament::backend::RenderPassParams& params); @@ -75,12 +80,6 @@ class BackendTest : public ::testing::Test { filament::backend::Handle uniform; }; - -// Utilities - -void getPixelInfo(filament::backend::PixelDataFormat format, filament::backend::PixelDataType type, - size_t& outComponents, int& outBpp); - } // namespace test #endif diff --git a/filament/backend/test/BackendTestUtils.h b/filament/backend/test/BackendTestUtils.h new file mode 100644 index 00000000000..209ea4abd46 --- /dev/null +++ b/filament/backend/test/BackendTestUtils.h @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef TNT_BACKENDTESTUTILS_H +#define TNT_BACKENDTESTUTILS_H + +#include + +#include + +using namespace filament; +using namespace filament::backend; + +inline void getPixelInfo(PixelDataFormat format, PixelDataType type, size_t& outComponents, int& outBpp) { + assert_invariant(type != PixelDataType::COMPRESSED); + switch (format) { + case PixelDataFormat::UNUSED: + case PixelDataFormat::R: + case PixelDataFormat::R_INTEGER: + case PixelDataFormat::DEPTH_COMPONENT: + case PixelDataFormat::ALPHA: + outComponents = 1; + break; + case PixelDataFormat::RG: + case PixelDataFormat::RG_INTEGER: + case PixelDataFormat::DEPTH_STENCIL: + outComponents = 2; + break; + case PixelDataFormat::RGB: + case PixelDataFormat::RGB_INTEGER: + outComponents = 3; + break; + case PixelDataFormat::RGBA: + case PixelDataFormat::RGBA_INTEGER: + outComponents = 4; + break; + } + + outBpp = outComponents; + switch (type) { + case PixelDataType::COMPRESSED: // Impossible -- to squash the IDE warnings + case PixelDataType::UBYTE: + case PixelDataType::BYTE: + // nothing to do + break; + case PixelDataType::USHORT: + case PixelDataType::SHORT: + case PixelDataType::HALF: + outBpp *= 2; + break; + case PixelDataType::UINT: + case PixelDataType::INT: + case PixelDataType::FLOAT: + outBpp *= 4; + break; + case PixelDataType::UINT_10F_11F_11F_REV: + // Special case, format must be RGB and uses 4 bytes + assert_invariant(format == PixelDataFormat::RGB); + outBpp = 4; + break; + case PixelDataType::UINT_2_10_10_10_REV: + // Special case, format must be RGBA and uses 4 bytes + assert_invariant(format == PixelDataFormat::RGBA); + outBpp = 4; + break; + case PixelDataType::USHORT_565: + // Special case, format must be RGB and uses 2 bytes + assert_invariant(format == PixelDataFormat::RGB); + outBpp = 2; + break; + } +} + +template +static void fillCheckerboard(void* buffer, size_t size, size_t stride, size_t components, + ComponentType value) { + ComponentType* row = (ComponentType*)buffer; + int p = 0; + for (int r = 0; r < size; r++) { + ComponentType* pixel = row; + for (int col = 0; col < size; col++) { + // Generate a checkerboard pattern. + if ((p & 0x0010) ^ ((p / size) & 0x0010)) { + // Turn on the first component (red). + pixel[0] = value; + } + pixel += components; + p++; + } + row += stride * components; + } +} + +static PixelBufferDescriptor checkerboardPixelBuffer(PixelDataFormat format, PixelDataType type, + size_t size, size_t bufferPadding = 0) { + size_t components; int bpp; + getPixelInfo(format, type, components, bpp); + + size_t bufferSize = size + bufferPadding * 2; + uint8_t* buffer = (uint8_t*) calloc(1, bufferSize * bufferSize * bpp); + + uint8_t* ptr = buffer + (bufferSize * bufferPadding * bpp) + (bufferPadding * bpp); + + switch (type) { + case PixelDataType::BYTE: + fillCheckerboard(ptr, size, bufferSize, components, 1); + break; + + case PixelDataType::UBYTE: + fillCheckerboard(ptr, size, bufferSize, components, 0xFF); + break; + + case PixelDataType::SHORT: + fillCheckerboard(ptr, size, bufferSize, components, 1); + break; + + case PixelDataType::USHORT: + fillCheckerboard(ptr, size, bufferSize, components, 1u); + break; + + case PixelDataType::UINT: + fillCheckerboard(ptr, size, bufferSize, components, 1u); + break; + + case PixelDataType::INT: + fillCheckerboard(ptr, size, bufferSize, components, 1); + break; + + case PixelDataType::FLOAT: + fillCheckerboard(ptr, size, bufferSize, components, 1.0f); + break; + + case PixelDataType::HALF: + fillCheckerboard(ptr, size, bufferSize, components, math::half(1.0f)); + break; + + case PixelDataType::UINT_2_10_10_10_REV: + fillCheckerboard(ptr, size, bufferSize, 1, 0xC00003FF /* red */); + break; + + case PixelDataType::USHORT_565: + fillCheckerboard(ptr, size, bufferSize, 1, 0xF800 /* red */); + break; + + case PixelDataType::UINT_10F_11F_11F_REV: + fillCheckerboard(ptr, size, bufferSize, 1, 0x000003C0 /* red */); + break; + + case PixelDataType::COMPRESSED: + break; + } + + PixelBufferDescriptor descriptor(buffer, bufferSize * bufferSize * bpp, format, type, + 1, bufferPadding, bufferPadding, bufferSize, [](void* buffer, size_t size, void* user) { + free(buffer); + }, nullptr); + return descriptor; +} + +#endif // TNT_BACKENDTESTUTILS_H diff --git a/filament/backend/test/ComputeTest.cpp b/filament/backend/test/ComputeTest.cpp index 604bcecb50d..5808c3b1825 100644 --- a/filament/backend/test/ComputeTest.cpp +++ b/filament/backend/test/ComputeTest.cpp @@ -46,7 +46,8 @@ void ComputeTest::init(Backend backend) { } ComputeTest::ComputeTest() - : commandBufferQueue(CONFIG_MIN_COMMAND_BUFFERS_SIZE, CONFIG_COMMAND_BUFFERS_SIZE) { + : commandBufferQueue(CONFIG_MIN_COMMAND_BUFFERS_SIZE, CONFIG_COMMAND_BUFFERS_SIZE, + /*paused=*/false) { } ComputeTest::~ComputeTest() = default; @@ -87,11 +88,8 @@ void ComputeTest::executeCommands() { } } -void ComputeTest::flushAndWait(uint64_t timeout) { +void ComputeTest::flushAndWait() { auto& api = getDriverApi(); - auto fence = api.createFence(); api.finish(); executeCommands(); - api.wait(fence, timeout); - api.destroyFence(fence); } diff --git a/filament/backend/test/ComputeTest.h b/filament/backend/test/ComputeTest.h index 3eb48748367..83d14261135 100644 --- a/filament/backend/test/ComputeTest.h +++ b/filament/backend/test/ComputeTest.h @@ -34,7 +34,7 @@ class ComputeTest : public ::testing::Test { void TearDown() override; void executeCommands(); - void flushAndWait(uint64_t timeout = 1000); + void flushAndWait(); filament::backend::DriverApi& getDriverApi() { return *commandStream; } filament::backend::Driver& getDriver() { return *driver; } diff --git a/filament/backend/test/MetalTest.mm b/filament/backend/test/MetalTest.mm new file mode 100644 index 00000000000..1fda63f0c12 --- /dev/null +++ b/filament/backend/test/MetalTest.mm @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "../src/metal/MetalContext.h" + +namespace test { + +TEST(MetalDynamicOffsets, none) { + filament::backend::MetalDynamicOffsets dynamicOffsets; + const auto [count, offsets] = dynamicOffsets.getOffsets(); + EXPECT_EQ(count, 0u); +} + +TEST(MetalDynamicOffsets, basic) { + filament::backend::MetalDynamicOffsets dynamicOffsets; + { + const auto [count, offsets] = dynamicOffsets.getOffsets(); + EXPECT_EQ(count, 0u); + } + + { + uint32_t o[2] = { 1, 2 }; + dynamicOffsets.setOffsets(0, o, 2); + const auto [count, offsets] = dynamicOffsets.getOffsets(); + EXPECT_EQ(count, 2); + EXPECT_EQ(offsets[0], 1); + EXPECT_EQ(offsets[1], 2); + } + + { + uint32_t o[3] = { 3, 4, 5 }; + dynamicOffsets.setOffsets(1, o, 3); + const auto [count, offsets] = dynamicOffsets.getOffsets(); + EXPECT_EQ(count, 5); + EXPECT_EQ(offsets[0], 1); + EXPECT_EQ(offsets[1], 2); + EXPECT_EQ(offsets[2], 3); + EXPECT_EQ(offsets[3], 4); + EXPECT_EQ(offsets[4], 5); + } + + // skip descriptor set index 2 + + { + uint32_t o[1] = { 6 }; + dynamicOffsets.setOffsets(3, o, 1); + const auto [count, offsets] = dynamicOffsets.getOffsets(); + EXPECT_EQ(count, 6); + EXPECT_EQ(offsets[0], 1); + EXPECT_EQ(offsets[1], 2); + EXPECT_EQ(offsets[2], 3); + EXPECT_EQ(offsets[3], 4); + EXPECT_EQ(offsets[4], 5); + EXPECT_EQ(offsets[5], 6); + } +} + +TEST(MetalDynamicOffsets, outOfOrder) { + filament::backend::MetalDynamicOffsets dynamicOffsets; + uint32_t o1[2] = { 2, 3 }; + dynamicOffsets.setOffsets(1, o1, 2); + uint32_t o2[2] = { 0, 1 }; + dynamicOffsets.setOffsets(0, o2, 2); + uint32_t o3[2] = { 4, 5 }; + dynamicOffsets.setOffsets(2, o3, 2); + + const auto [count, offsets] = dynamicOffsets.getOffsets(); + EXPECT_EQ(count, 6); + EXPECT_EQ(offsets[0], 0); + EXPECT_EQ(offsets[1], 1); + EXPECT_EQ(offsets[2], 2); + EXPECT_EQ(offsets[3], 3); + EXPECT_EQ(offsets[4], 4); + EXPECT_EQ(offsets[5], 5); +}; + +TEST(MetalDynamicOffsets, removal) { + filament::backend::MetalDynamicOffsets dynamicOffsets; + uint32_t o1[2] = { 2, 3 }; + dynamicOffsets.setOffsets(1, o1, 2); + uint32_t o2[2] = { 0, 1 }; + dynamicOffsets.setOffsets(0, o2, 2); + uint32_t o3[2] = { 4, 5 }; + dynamicOffsets.setOffsets(2, o3, 2); + dynamicOffsets.setOffsets(1, nullptr, 0); + + const auto [count, offsets] = dynamicOffsets.getOffsets(); + EXPECT_EQ(count, 4); + EXPECT_EQ(offsets[0], 0); + EXPECT_EQ(offsets[1], 1); + EXPECT_EQ(offsets[2], 4); + EXPECT_EQ(offsets[3], 5); +}; + +TEST(MetalDynamicOffsets, resize) { + filament::backend::MetalDynamicOffsets dynamicOffsets; + uint32_t o1[2] = { 2, 3 }; + dynamicOffsets.setOffsets(1, o1, 2); + uint32_t o2[2] = { 0, 1 }; + dynamicOffsets.setOffsets(0, o2, 2); + uint32_t o3[2] = { 6, 7 }; + dynamicOffsets.setOffsets(2, o3, 2); + uint32_t o4[4] = { 2, 3, 4, 5 }; + dynamicOffsets.setOffsets(1, o4, 4); + + const auto [count, offsets] = dynamicOffsets.getOffsets(); + EXPECT_EQ(count, 8); + EXPECT_EQ(offsets[0], 0); + EXPECT_EQ(offsets[1], 1); + EXPECT_EQ(offsets[2], 2); + EXPECT_EQ(offsets[3], 3); + EXPECT_EQ(offsets[4], 4); + EXPECT_EQ(offsets[5], 5); + EXPECT_EQ(offsets[6], 6); + EXPECT_EQ(offsets[7], 7); +}; + +TEST(MetalDynamicOffsets, dirty) { + filament::backend::MetalDynamicOffsets dynamicOffsets; + EXPECT_FALSE(dynamicOffsets.isDirty()); + + uint32_t o1[2] = { 2, 3 }; + dynamicOffsets.setOffsets(1, o1, 2); + EXPECT_TRUE(dynamicOffsets.isDirty()); + + dynamicOffsets.setDirty(false); + EXPECT_FALSE(dynamicOffsets.isDirty()); + + // Setting the same offsets should not mark the offsets as dirty + dynamicOffsets.setOffsets(1, o1, 2); + EXPECT_FALSE(dynamicOffsets.isDirty()); + + // Resizing the offsets should mark the offsets as dirty + uint32_t o2[3] = { 4, 5, 6 }; + dynamicOffsets.setOffsets(1, o2, 3); + EXPECT_TRUE(dynamicOffsets.isDirty()); +}; + +}; + +int main(int argc, char **argv) { + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/filament/backend/test/PlatformRunner.h b/filament/backend/test/PlatformRunner.h index 7c4204b6d1d..0e0d30075ce 100644 --- a/filament/backend/test/PlatformRunner.h +++ b/filament/backend/test/PlatformRunner.h @@ -22,6 +22,9 @@ namespace test { +constexpr uint32_t const WINDOW_WIDTH = 512; +constexpr uint32_t const WINDOW_HEIGHT = 512; + // To avoid a dependency on filabridge, the Backend enum is replicated here. enum class Backend : uint8_t { OPENGL = 1, diff --git a/filament/backend/test/ShaderGenerator.cpp b/filament/backend/test/ShaderGenerator.cpp index 8e329489dde..545a6f97089 100644 --- a/filament/backend/test/ShaderGenerator.cpp +++ b/filament/backend/test/ShaderGenerator.cpp @@ -73,17 +73,31 @@ void ShaderGenerator::shutdown() { FinalizeProcess(); } -ShaderGenerator::ShaderGenerator(std::string vertex, std::string fragment, - Backend backend, bool isMobile, const filament::SamplerInterfaceBlock* sib) noexcept - : mBackend(backend), - mVertexBlob(transpileShader(ShaderStage::VERTEX, std::move(vertex), backend, isMobile, sib)), - mFragmentBlob(transpileShader(ShaderStage::FRAGMENT, std::move(fragment), backend, - isMobile, sib)) { +ShaderGenerator::ShaderGenerator(std::string vertex, std::string fragment, Backend backend, + bool isMobile, filamat::DescriptorSets&& descriptorSets) noexcept + : mBackend(backend), + mVertexBlob(transpileShader( + ShaderStage::VERTEX, std::move(vertex), backend, isMobile, descriptorSets)), + mFragmentBlob(transpileShader( + ShaderStage::FRAGMENT, std::move(fragment), backend, isMobile, descriptorSets)) { + switch (backend) { + case Backend::OPENGL: + mShaderLanguage = filament::backend::ShaderLanguage::ESSL3; + break; + case Backend::VULKAN: + mShaderLanguage = filament::backend::ShaderLanguage::SPIRV; + break; + case Backend::METAL: + mShaderLanguage = filament::backend::ShaderLanguage::MSL; + break; + case Backend::NOOP: + mShaderLanguage = filament::backend::ShaderLanguage::ESSL3; + break; + } } -ShaderGenerator::Blob ShaderGenerator::transpileShader( - ShaderStage stage, std::string shader, Backend backend, bool isMobile, - const filament::SamplerInterfaceBlock* sib) noexcept { +ShaderGenerator::Blob ShaderGenerator::transpileShader(ShaderStage stage, std::string shader, + Backend backend, bool isMobile, const filamat::DescriptorSets& descriptorSets) noexcept { TProgram program; const EShLanguage language = stage == ShaderStage::VERTEX ? EShLangVertex : EShLangFragment; TShader tShader(language); @@ -147,9 +161,8 @@ ShaderGenerator::Blob ShaderGenerator::transpileShader( return { result.c_str(), result.c_str() + result.length() + 1 }; } else if (backend == Backend::METAL) { const auto sm = isMobile ? ShaderModel::MOBILE : ShaderModel::DESKTOP; - filamat::SibVector sibs = filamat::SibVector::with_capacity(1); - if (sib) { sibs.emplace_back(0, sib); } - filamat::GLSLPostProcessor::spirvToMsl(&spirv, &result, sm, false, sibs, nullptr); + filamat::GLSLPostProcessor::spirvToMsl( + &spirv, &result, stage, sm, false, descriptorSets, nullptr); return { result.c_str(), result.c_str() + result.length() + 1 }; } else if (backend == Backend::VULKAN) { return { (uint8_t*)spirv.data(), (uint8_t*)(spirv.data() + spirv.size()) }; @@ -160,6 +173,7 @@ ShaderGenerator::Blob ShaderGenerator::transpileShader( Program ShaderGenerator::getProgram(filament::backend::DriverApi&) noexcept { Program program; + program.shaderLanguage(mShaderLanguage); program.shader(ShaderStage::VERTEX, mVertexBlob.data(), mVertexBlob.size()); program.shader(ShaderStage::FRAGMENT, mFragmentBlob.data(), mFragmentBlob.size()); return program; diff --git a/filament/backend/test/ShaderGenerator.h b/filament/backend/test/ShaderGenerator.h index 19629986598..9ce6d76b3d2 100644 --- a/filament/backend/test/ShaderGenerator.h +++ b/filament/backend/test/ShaderGenerator.h @@ -22,6 +22,7 @@ #include "private/filament/SamplerInterfaceBlock.h" #include "private/backend/DriverApi.h" #include "backend/Program.h" +#include "../src/GLSLPostProcessor.h" #include @@ -40,7 +41,7 @@ class ShaderGenerator { * @param fragment The fragment shader, written in GLSL 450 core. */ ShaderGenerator(std::string vertex, std::string fragment, Backend backend, bool isMobile, - const filament::SamplerInterfaceBlock* sib = nullptr) noexcept; + filamat::DescriptorSets&& descriptorSets = {}) noexcept; ShaderGenerator(const ShaderGenerator& rhs) = delete; ShaderGenerator& operator=(const ShaderGenerator& rhs) = delete; @@ -52,7 +53,7 @@ class ShaderGenerator { using Blob = std::vector; static Blob transpileShader(ShaderStage stage, std::string shader, Backend backend, - bool isMobile, const filament::SamplerInterfaceBlock* sib = nullptr) noexcept; + bool isMobile, const filamat::DescriptorSets& descriptorSets) noexcept; Backend mBackend; @@ -60,6 +61,7 @@ class ShaderGenerator { Blob mFragmentBlob; std::string mCompiledVertexShader; std::string mCompiledFragmentShader; + filament::backend::ShaderLanguage mShaderLanguage; }; diff --git a/filament/backend/test/TrianglePrimitive.cpp b/filament/backend/test/TrianglePrimitive.cpp index a65ec208ee9..d4028057c33 100644 --- a/filament/backend/test/TrianglePrimitive.cpp +++ b/filament/backend/test/TrianglePrimitive.cpp @@ -48,7 +48,9 @@ TrianglePrimitive::TrianglePrimitive(filament::backend::DriverApi& driverApi, const size_t size = sizeof(math::float2) * 3; mBufferObject = mDriverApi.createBufferObject(size, BufferObjectBinding::VERTEX, BufferUsage::STATIC); - mVertexBuffer = mDriverApi.createVertexBuffer(1, 1, mVertexCount, attributes); + mVertexBufferInfo = mDriverApi.createVertexBufferInfo(1, 1, attributes); + mVertexBuffer = mDriverApi.createVertexBuffer(mVertexCount, mVertexBufferInfo); + mDriverApi.setVertexBufferObject(mVertexBuffer, 0, mBufferObject); BufferDescriptor vertexBufferDesc(gVertices, size); mDriverApi.updateBufferObject(mBufferObject, std::move(vertexBufferDesc), 0); @@ -60,7 +62,7 @@ TrianglePrimitive::TrianglePrimitive(filament::backend::DriverApi& driverApi, mDriverApi.updateIndexBuffer(mIndexBuffer, std::move(indexBufferDesc), 0); mRenderPrimitive = mDriverApi.createRenderPrimitive( - mVertexBuffer, mIndexBuffer, PrimitiveType::TRIANGLES, 0, 0, 2, 3); + mVertexBuffer, mIndexBuffer, PrimitiveType::TRIANGLES); } void TrianglePrimitive::updateVertices(const filament::math::float2 vertices[3]) noexcept { @@ -102,6 +104,7 @@ void TrianglePrimitive::updateIndices(const index_type* indices, int count, int TrianglePrimitive::~TrianglePrimitive() { mDriverApi.destroyBufferObject(mBufferObject); mDriverApi.destroyVertexBuffer(mVertexBuffer); + mDriverApi.destroyVertexBufferInfo(mVertexBufferInfo); mDriverApi.destroyIndexBuffer(mIndexBuffer); mDriverApi.destroyRenderPrimitive(mRenderPrimitive); } diff --git a/filament/backend/test/TrianglePrimitive.h b/filament/backend/test/TrianglePrimitive.h index aa1f6c41de0..0ea272c935d 100644 --- a/filament/backend/test/TrianglePrimitive.h +++ b/filament/backend/test/TrianglePrimitive.h @@ -40,6 +40,7 @@ class TrianglePrimitive { using PrimitiveHandle = filament::backend::Handle; using BufferObjectHandle = filament::backend::Handle; + using VertexInfoHandle = filament::backend::Handle; using VertexHandle = filament::backend::Handle; using IndexHandle = filament::backend::Handle; @@ -63,6 +64,7 @@ class TrianglePrimitive { PrimitiveHandle mRenderPrimitive; BufferObjectHandle mBufferObject; + VertexInfoHandle mVertexBufferInfo; VertexHandle mVertexBuffer; IndexHandle mIndexBuffer; diff --git a/filament/backend/test/linux_runner.cpp b/filament/backend/test/linux_runner.cpp new file mode 100644 index 00000000000..f93715ef38f --- /dev/null +++ b/filament/backend/test/linux_runner.cpp @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "BackendTest.h" +#include "PlatformRunner.h" + +#include +#include + +namespace test { + +test::NativeView getNativeView() { + return { + .ptr = nullptr, + .width = WINDOW_WIDTH, + .height = WINDOW_HEIGHT, + }; +} + +}// namespace test + +namespace { + +std::array const VALID_BACKENDS{ + test::Backend::OPENGL, + test::Backend::VULKAN, +}; + +}// namespace + +int main(int argc, char* argv[]) { + auto backend = test::parseArgumentsForBackend(argc, argv); + + if (!std::any_of(VALID_BACKENDS.begin(), VALID_BACKENDS.end(), + [backend](test::Backend validBackend) { return backend == validBackend; })) { + std::cerr << "Specified an invalid backend. Only GL and Vulkan are available" << std::endl; + return 1; + } + + test::initTests(backend, false, argc, argv); + return test::runTests(); +} diff --git a/filament/backend/test/mac_runner.mm b/filament/backend/test/mac_runner.mm index 003eb853579..1aab059fb11 100644 --- a/filament/backend/test/mac_runner.mm +++ b/filament/backend/test/mac_runner.mm @@ -53,12 +53,11 @@ - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { nativeView.width = static_cast(drawableSize.width); nativeView.height = static_cast(drawableSize.height); - test::runTests(); - // exit(runTests()); + exit(test::runTests()); } - (NSView*)createView { - NSRect frame = NSMakeRect(0, 0, 512, 512); + NSRect frame = NSMakeRect(0, 0, test::WINDOW_WIDTH, test::WINDOW_HEIGHT); NSWindow* window = [[NSWindow alloc] initWithContentRect:frame styleMask:NSWindowStyleMaskBorderless backing:NSBackingStoreBuffered diff --git a/filament/backend/test/test_Blit.cpp b/filament/backend/test/test_Blit.cpp index de4f5a66b34..b664c864d28 100644 --- a/filament/backend/test/test_Blit.cpp +++ b/filament/backend/test/test_Blit.cpp @@ -24,7 +24,7 @@ #include -#ifndef IOS +#ifndef FILAMENT_IOS #include #include #endif @@ -38,7 +38,7 @@ using namespace utils; static const char* const triangleVs = R"(#version 450 core layout(location = 0) in vec4 mesh_position; -uniform Params { highp vec4 color; highp vec4 scale; } params; +layout(binding = 0, set = 1) uniform Params { highp vec4 color; highp vec4 scale; } params; void main() { gl_Position = vec4((mesh_position.xy + 0.5) * params.scale.xy, params.scale.z, 1.0); #if defined(TARGET_VULKAN_ENVIRONMENT) @@ -50,7 +50,7 @@ void main() { static const char* const triangleFs = R"(#version 450 core precision mediump int; precision highp float; layout(location = 0) out vec4 fragColor; -uniform Params { highp vec4 color; highp vec4 scale; } params; +layout(binding = 0, set = 1) uniform Params { highp vec4 color; highp vec4 scale; } params; void main() { fragColor = params.color; })"; @@ -67,7 +67,7 @@ struct ScreenshotParams { uint32_t pixelHashResult; }; -#ifdef IOS +#ifdef FILAMENT_IOS static void dumpScreenshot(DriverApi& dapi, Handle rt, ScreenshotParams* params) {} #else static void dumpScreenshot(DriverApi& dapi, Handle rt, ScreenshotParams* params) { @@ -193,60 +193,6 @@ static void createFaces(DriverApi& dapi, Handle texture, int baseWidt dapi.update3DImage(texture, level, 0, 0, 0, width, height, 6, std::move(pb)); } -TEST_F(BackendTest, CubemapMinify) { - auto& api = getDriverApi(); - - Handle texture = api.createTexture( - SamplerType::SAMPLER_CUBEMAP, 4, TextureFormat::RGBA8, 1, 256, 256, 1, - TextureUsage::SAMPLEABLE | TextureUsage::UPLOADABLE | TextureUsage::COLOR_ATTACHMENT); - - createFaces(api, texture, 256, 256, 0, float3(0.5, 0, 0)); - - const int srcLevel = 0; - const int dstLevel = 1; - - const TextureCubemapFace srcFace = TextureCubemapFace::NEGATIVE_Y; - const TextureCubemapFace dstFace = TextureCubemapFace::NEGATIVE_Y; - - const TargetBufferInfo srcInfo = { texture, srcLevel, +srcFace }; - const TargetBufferInfo dstInfo = { texture, dstLevel, +dstFace }; - - Handle srcRenderTarget; - srcRenderTarget = api.createRenderTarget( TargetBufferFlags::COLOR, - 256 >> srcLevel, 256 >> srcLevel, 1, { srcInfo }, {}, {}); - - Handle dstRenderTarget; - dstRenderTarget = api.createRenderTarget( TargetBufferFlags::COLOR, - 256 >> dstLevel, 256 >> dstLevel, 1, { dstInfo }, {}, {}); - - api.blit(TargetBufferFlags::COLOR0, dstRenderTarget, - {0, 0, 256 >> dstLevel, 256 >> dstLevel}, srcRenderTarget, - {0, 0, 256 >> srcLevel, 256 >> srcLevel}, SamplerMagFilter::LINEAR); - - // Push through an empty frame. Note that this test does not do - // makeCurrent / commit and is therefore similar to renderStandaloneView. - api.beginFrame(0, 0); - api.endFrame(0); - - // Grab a screenshot. - ScreenshotParams params { 256 >> dstLevel, 256 >> dstLevel, "CubemapMinify.png" }; - api.beginFrame(0, 0); - dumpScreenshot(api, dstRenderTarget, ¶ms); - api.endFrame(0); - - // Wait for the ReadPixels result to come back. - api.finish(); - executeCommands(); - getDriver().purge(); - - // Cleanup. - api.destroyTexture(texture); - api.destroyRenderTarget(srcRenderTarget); - api.destroyRenderTarget(dstRenderTarget); - executeCommands(); -} - - TEST_F(BackendTest, ColorMagnify) { auto& api = getDriverApi(); @@ -263,7 +209,7 @@ TEST_F(BackendTest, ColorMagnify) { api.makeCurrent(swapChain, swapChain); // Create a source texture. - Handle srcTexture = api.createTexture( + Handle const srcTexture = api.createTexture( SamplerType::SAMPLER_2D, kNumLevels, kSrcTexFormat, 1, kSrcTexWidth, kSrcTexHeight, 1, TextureUsage::SAMPLEABLE | TextureUsage::UPLOADABLE | TextureUsage::COLOR_ATTACHMENT); const bool flipY = sBackend == Backend::OPENGL; @@ -271,7 +217,7 @@ TEST_F(BackendTest, ColorMagnify) { createBitmap(api, srcTexture, kSrcTexWidth, kSrcTexHeight, 1, float3(0, 0, 0.5), flipY); // Create a destination texture. - Handle dstTexture = api.createTexture( + Handle const dstTexture = api.createTexture( SamplerType::SAMPLER_2D, kNumLevels, kDstTexFormat, 1, kDstTexWidth, kDstTexHeight, 1, TextureUsage::SAMPLEABLE | TextureUsage::COLOR_ATTACHMENT); @@ -280,25 +226,25 @@ TEST_F(BackendTest, ColorMagnify) { Handle dstRenderTargets[kNumLevels]; for (uint8_t level = 0; level < kNumLevels; level++) { srcRenderTargets[level] = api.createRenderTarget( TargetBufferFlags::COLOR, - kSrcTexWidth >> level, kSrcTexHeight >> level, 1, { srcTexture, level, 0 }, {}, {}); + kSrcTexWidth >> level, kSrcTexHeight >> level, 1, 0, { srcTexture, level, 0 }, {}, {}); dstRenderTargets[level] = api.createRenderTarget( TargetBufferFlags::COLOR, - kDstTexWidth >> level, kDstTexHeight >> level, 1, { dstTexture, level, 0 }, {}, {}); + kDstTexWidth >> level, kDstTexHeight >> level, 1, 0, { dstTexture, level, 0 }, {}, {}); } // Do a "magnify" blit from level 1 of the source RT to the level 0 of the destination RT. const int srcLevel = 1; - api.blit(TargetBufferFlags::COLOR0, dstRenderTargets[0], + api.blitDEPRECATED(TargetBufferFlags::COLOR0, dstRenderTargets[0], {0, 0, kDstTexWidth, kDstTexHeight}, srcRenderTargets[srcLevel], {0, 0, kSrcTexWidth >> srcLevel, kSrcTexHeight >> srcLevel}, SamplerMagFilter::LINEAR); // Push through an empty frame to allow the texture to upload and the blit to execute. - api.beginFrame(0, 0); + api.beginFrame(0, 0, 0); api.commit(swapChain); api.endFrame(0); // Grab a screenshot. ScreenshotParams params { kDstTexWidth, kDstTexHeight, "ColorMagnify.png" }; - api.beginFrame(0, 0); + api.beginFrame(0, 0, 0); dumpScreenshot(api, dstRenderTargets[0], ¶ms); api.commit(swapChain); api.endFrame(0); @@ -338,7 +284,7 @@ TEST_F(BackendTest, ColorMinify) { api.makeCurrent(swapChain, swapChain); // Create a source texture. - Handle srcTexture = api.createTexture( + Handle const srcTexture = api.createTexture( SamplerType::SAMPLER_2D, kNumLevels, kSrcTexFormat, 1, kSrcTexWidth, kSrcTexHeight, 1, TextureUsage::SAMPLEABLE | TextureUsage::UPLOADABLE | TextureUsage::COLOR_ATTACHMENT); const bool flipY = sBackend == Backend::OPENGL; @@ -346,7 +292,7 @@ TEST_F(BackendTest, ColorMinify) { createBitmap(api, srcTexture, kSrcTexWidth, kSrcTexHeight, 1, float3(0, 0, 0.5), flipY); // Create a destination texture. - Handle dstTexture = api.createTexture( + Handle const dstTexture = api.createTexture( SamplerType::SAMPLER_2D, kNumLevels, kDstTexFormat, 1, kDstTexWidth, kDstTexHeight, 1, TextureUsage::SAMPLEABLE | TextureUsage::COLOR_ATTACHMENT); @@ -355,36 +301,28 @@ TEST_F(BackendTest, ColorMinify) { Handle dstRenderTargets[kNumLevels]; for (uint8_t level = 0; level < kNumLevels; level++) { srcRenderTargets[level] = api.createRenderTarget( TargetBufferFlags::COLOR, - kSrcTexWidth >> level, kSrcTexHeight >> level, 1, { srcTexture, level, 0 }, {}, {}); + kSrcTexWidth >> level, kSrcTexHeight >> level, 1, 0, { srcTexture, level, 0 }, {}, {}); dstRenderTargets[level] = api.createRenderTarget( TargetBufferFlags::COLOR, - kDstTexWidth >> level, kDstTexHeight >> level, 1, { dstTexture, level, 0 }, {}, {}); + kDstTexWidth >> level, kDstTexHeight >> level, 1, 0, { dstTexture, level, 0 }, {}, {}); } // Do a "minify" blit from level 1 of the source RT to the level 0 of the destination RT. const int srcLevel = 1; - api.blit(TargetBufferFlags::COLOR0, dstRenderTargets[0], - {0, 0, kDstTexWidth, kDstTexHeight}, srcRenderTargets[srcLevel], - {0, 0, kSrcTexWidth >> srcLevel, kSrcTexHeight >> srcLevel}, SamplerMagFilter::LINEAR); - // Push through an empty frame to allow the texture to upload and the blit to execute. - api.beginFrame(0, 0); - api.commit(swapChain); - api.endFrame(0); + api.blitDEPRECATED(TargetBufferFlags::COLOR0, + dstRenderTargets[0], {0, 0, kDstTexWidth, kDstTexHeight}, + srcRenderTargets[srcLevel], {0, 0, kSrcTexWidth >> srcLevel, kSrcTexHeight >> srcLevel}, + SamplerMagFilter::LINEAR); // Grab a screenshot. ScreenshotParams params { kDstTexWidth, kDstTexHeight, "ColorMinify.png" }; - api.beginFrame(0, 0); dumpScreenshot(api, dstRenderTargets[0], ¶ms); - api.commit(swapChain); - api.endFrame(0); // Wait for the ReadPixels result to come back. - api.finish(); - executeCommands(); - getDriver().purge(); + flushAndWait(); // Check if the image matches perfectly to our golden run. - const uint32_t expected = 0x7739bef5; + const uint32_t expected = 0xf3d9c53f; printf("Computed hash is 0x%8.8x, Expected 0x%8.8x\n", params.pixelHashResult, expected); EXPECT_TRUE(params.pixelHashResult == expected); @@ -397,149 +335,6 @@ TEST_F(BackendTest, ColorMinify) { executeCommands(); } -TEST_F(BackendTest, DepthMinify) { - auto& api = getDriverApi(); - - constexpr int kSrcTexWidth = 1024; - constexpr int kSrcTexHeight = 1024; - constexpr int kDstTexWidth = 256; - constexpr int kDstTexHeight = 256; - constexpr auto kColorTexFormat = TextureFormat::RGBA8; - constexpr auto kDepthTexFormat = TextureFormat::DEPTH24; - constexpr int kNumLevels = 3; - - // Create a SwapChain and make it current. We don't really use it so the res doesn't matter. - auto swapChain = api.createSwapChainHeadless(256, 256, 0); - api.makeCurrent(swapChain, swapChain); - - // Create a program. - ProgramHandle program; - { - ShaderGenerator shaderGen(triangleVs, triangleFs, sBackend, sIsMobilePlatform); - Program prog = shaderGen.getProgram(api); - Program::Sampler psamplers[] = { utils::CString("tex"), 0 }; - prog.setSamplerGroup(0, ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, psamplers, sizeof(psamplers) / sizeof(psamplers[0])); - prog.uniformBlockBindings({{"params", 1}}); - program = api.createProgram(std::move(prog)); - } - - // Create a VertexBuffer, IndexBuffer, and RenderPrimitive. - TrianglePrimitive* triangle = new TrianglePrimitive(api); - - // Create textures for the first rendering pass. - Handle srcColorTexture = api.createTexture( - SamplerType::SAMPLER_2D, kNumLevels, kColorTexFormat, 1, kSrcTexWidth, kSrcTexHeight, 1, - TextureUsage::SAMPLEABLE | TextureUsage::COLOR_ATTACHMENT); - - Handle srcDepthTexture = api.createTexture( - SamplerType::SAMPLER_2D, 1, kDepthTexFormat, 1, kSrcTexWidth, kSrcTexHeight, - 1, TextureUsage::DEPTH_ATTACHMENT); - - // Create textures for the second rendering pass. - Handle dstColorTexture = api.createTexture( - SamplerType::SAMPLER_2D, kNumLevels, kColorTexFormat, 1, kDstTexWidth, kDstTexHeight, 1, - TextureUsage::SAMPLEABLE | TextureUsage::COLOR_ATTACHMENT); - - Handle dstDepthTexture = api.createTexture( - SamplerType::SAMPLER_2D, 1, kDepthTexFormat, 1, kDstTexWidth, kDstTexHeight, - 1, TextureUsage::DEPTH_ATTACHMENT); - - // Create render targets. - const int level = 0; - - Handle srcRenderTarget = api.createRenderTarget( - TargetBufferFlags::COLOR | TargetBufferFlags::DEPTH, - kSrcTexWidth >> level, kSrcTexHeight >> level, 1, - {{ srcColorTexture, level }}, - { srcDepthTexture, level }, {}); - - Handle dstRenderTarget = api.createRenderTarget( - TargetBufferFlags::COLOR | TargetBufferFlags::DEPTH, - kDstTexWidth >> level, kDstTexHeight >> level, 1, - {{ dstColorTexture, level }}, - { dstDepthTexture, level }, {}); - - // Prep for rendering. - RenderPassParams params = {}; - params.flags.clear = TargetBufferFlags::COLOR | TargetBufferFlags::DEPTH; - params.clearColor = float4(1, 1, 0, 1); - params.clearDepth = 1.0; - params.viewport.width = kSrcTexWidth; - params.viewport.height = kSrcTexHeight; - - PipelineState state = {}; - state.rasterState.colorWrite = true; - state.rasterState.depthWrite = true; - state.rasterState.depthFunc = RasterState::DepthFunc::L; - state.rasterState.culling = RasterState::CullingMode::NONE; - state.program = program; - auto ubuffer = api.createBufferObject(sizeof(MaterialParams), - BufferObjectBinding::UNIFORM, BufferUsage::STATIC); - api.makeCurrent(swapChain, swapChain); - api.beginFrame(0, 0); - api.bindUniformBuffer(0, ubuffer); - - // Draw red triangle into srcRenderTarget. - uploadUniforms(api, ubuffer, { - .color = float4(1, 0, 0, 1), - .scale = float4(1, 1, 0.5, 0), - }); - api.beginRenderPass(srcRenderTarget, params); - api.draw(state, triangle->getRenderPrimitive(), 1); - api.endRenderPass(); - api.endFrame(0); - - // Copy over the color buffer and the depth buffer. - api.blit(TargetBufferFlags::COLOR | TargetBufferFlags::DEPTH, dstRenderTarget, - {0, 0, kDstTexWidth, kDstTexHeight}, srcRenderTarget, - {0, 0, kSrcTexWidth, kSrcTexHeight}, SamplerMagFilter::LINEAR); - - // Draw a larger blue triangle into dstRenderTarget. We carefully place it below the red - // triangle in order to exercise depth testing. - api.beginFrame(0, 0); - params.viewport.width = kDstTexWidth; - params.viewport.height = kDstTexHeight; - params.flags.clear = TargetBufferFlags::NONE; - uploadUniforms(api, ubuffer, { - .color = float4(0, 0, 1, 1), - .scale = float4(1.2, 1.2, 0.75, 0), - }); - api.beginRenderPass(dstRenderTarget, params); - api.draw(state, triangle->getRenderPrimitive(), 1); - api.endRenderPass(); - api.endFrame(0); - - // Grab a screenshot. - ScreenshotParams sparams { kDstTexWidth, kDstTexHeight, "DepthMinify.png" }; - api.beginFrame(0, 0); - dumpScreenshot(api, dstRenderTarget, &sparams); - api.commit(swapChain); - api.endFrame(0); - - // Wait for the ReadPixels result to come back. - api.finish(); - executeCommands(); - getDriver().purge(); - - // Check if the image matches perfectly to our golden run. - const uint32_t expected = 0x92b6f5c1; - printf("Computed hash is 0x%8.8x, Expected 0x%8.8x\n", sparams.pixelHashResult, expected); - EXPECT_TRUE(sparams.pixelHashResult == expected); - - // Cleanup. - api.destroyBufferObject(ubuffer); - api.destroyProgram(program); - api.destroyTexture(srcColorTexture); - api.destroyTexture(dstColorTexture); - api.destroyTexture(srcDepthTexture); - api.destroyTexture(dstDepthTexture); - api.destroySwapChain(swapChain); - api.destroyRenderTarget(srcRenderTarget); - api.destroyRenderTarget(dstRenderTarget); - delete triangle; - executeCommands(); -} - TEST_F(BackendTest, ColorResolve) { auto& api = getDriverApi(); @@ -550,239 +345,115 @@ TEST_F(BackendTest, ColorResolve) { constexpr auto kColorTexFormat = TextureFormat::RGBA8; constexpr int kSampleCount = 4; - // Create a SwapChain and make it current. We don't really use it so the res doesn't matter. - auto swapChain = api.createSwapChainHeadless(256, 256, 0); - api.makeCurrent(swapChain, swapChain); - // Create a program. ProgramHandle program; { - ShaderGenerator shaderGen(triangleVs, triangleFs, sBackend, sIsMobilePlatform); + filamat::DescriptorSets descriptors; + descriptors[1] = { { "Params", + { DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, 0 }, + {} } }; + ShaderGenerator shaderGen( + triangleVs, triangleFs, sBackend, sIsMobilePlatform, std::move(descriptors)); Program prog = shaderGen.getProgram(api); - Program::Sampler psamplers[] = { utils::CString("tex"), 0 }; - prog.setSamplerGroup(0, ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, psamplers, sizeof(psamplers) / sizeof(psamplers[0])); - prog.uniformBlockBindings({{"params", 1}}); + prog.descriptorBindings(1, {{ "Params", DescriptorType::UNIFORM_BUFFER, 0 }}); program = api.createProgram(std::move(prog)); } + DescriptorSetLayoutHandle descriptorSetLayout = api.createDescriptorSetLayout({ + {{ + DescriptorType::UNIFORM_BUFFER, + ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, 0, + DescriptorFlags::NONE, 0 + }}}); + + DescriptorSetHandle descriptorSet = api.createDescriptorSet(descriptorSetLayout); + // Create a VertexBuffer, IndexBuffer, and RenderPrimitive. - TrianglePrimitive* triangle = new TrianglePrimitive(api); + TrianglePrimitive const triangle(api); // Create 4-sample texture. - Handle srcColorTexture = api.createTexture( + Handle const srcColorTexture = api.createTexture( SamplerType::SAMPLER_2D, 1, kColorTexFormat, kSampleCount, kSrcTexWidth, kSrcTexHeight, 1, TextureUsage::COLOR_ATTACHMENT); // Create 1-sample texture. - Handle dstColorTexture = api.createTexture( + Handle const dstColorTexture = api.createTexture( SamplerType::SAMPLER_2D, 1, kColorTexFormat, 1, kDstTexWidth, kDstTexHeight, 1, TextureUsage::SAMPLEABLE | TextureUsage::COLOR_ATTACHMENT); // Create a 4-sample render target with the 4-sample texture. - Handle srcRenderTarget = api.createRenderTarget( - TargetBufferFlags::COLOR, kSrcTexWidth, kSrcTexHeight, kSampleCount,{{ srcColorTexture }}, {}, {}); + Handle const srcRenderTarget = api.createRenderTarget( + TargetBufferFlags::COLOR, kSrcTexWidth, kSrcTexHeight, kSampleCount, 0, + {{ srcColorTexture }}, {}, {}); // Create a 1-sample render target with the 1-sample texture. - Handle dstRenderTarget = api.createRenderTarget( - TargetBufferFlags::COLOR, kDstTexWidth, kDstTexHeight, 1, {{ dstColorTexture }}, {}, {}); + Handle const dstRenderTarget = api.createRenderTarget( + TargetBufferFlags::COLOR, kDstTexWidth, kDstTexHeight, 1, 0, + {{ dstColorTexture }}, {}, {}); // Prep for rendering. RenderPassParams params = {}; params.flags.clear = TargetBufferFlags::COLOR; + params.flags.discardStart = TargetBufferFlags::ALL; + params.flags.discardEnd = TargetBufferFlags::NONE; params.clearColor = float4(1, 1, 0, 1); params.viewport.width = kSrcTexWidth; params.viewport.height = kSrcTexHeight; PipelineState state = {}; - state.rasterState.colorWrite = true; - state.rasterState.culling = RasterState::CullingMode::NONE; state.program = program; + state.pipelineLayout.setLayout[1] = { descriptorSetLayout }; + state.rasterState.colorWrite = true; + state.rasterState.depthWrite = false; + state.rasterState.depthFunc = RasterState::DepthFunc::A; + state.rasterState.culling = CullingMode::NONE; + auto ubuffer = api.createBufferObject(sizeof(MaterialParams), BufferObjectBinding::UNIFORM, BufferUsage::STATIC); - api.makeCurrent(swapChain, swapChain); - api.beginFrame(0, 0); - api.bindUniformBuffer(0, ubuffer); - // Draw red triangle into srcRenderTarget. uploadUniforms(api, ubuffer, { .color = float4(1, 0, 0, 1), .scale = float4(1, 1, 0.5, 0), }); - api.beginRenderPass(srcRenderTarget, params); - api.draw(state, triangle->getRenderPrimitive(), 1); - api.endRenderPass(); - api.endFrame(0); - // Resolve the MSAA render target into the single-sample render target. - api.blit(TargetBufferFlags::COLOR, dstRenderTarget, - {0, 0, kDstTexWidth, kDstTexHeight}, srcRenderTarget, - {0, 0, kSrcTexWidth, kSrcTexHeight}, SamplerMagFilter::LINEAR); + api.updateDescriptorSetBuffer(descriptorSet, 0, ubuffer, 0, sizeof(MaterialParams)); + api.bindDescriptorSet(descriptorSet, 1, {}); - // Grab a screenshot. - ScreenshotParams sparams { kDstTexWidth, kDstTexHeight, "ColorResolve.png" }; - api.beginFrame(0, 0); - dumpScreenshot(api, dstRenderTarget, &sparams); - api.commit(swapChain); + // FIXME: on Metal this triangle is not drawn. Can't understand why. + api.beginFrame(0, 0, 0); + api.beginRenderPass(srcRenderTarget, params); + api.draw(state, triangle.getRenderPrimitive(), 0, 3, 1); + api.endRenderPass(); api.endFrame(0); - // Wait for the ReadPixels result to come back. - api.finish(); - executeCommands(); - getDriver().purge(); - - // Check if the image matches perfectly to our golden run. - const uint32_t expected = 0xebfac2ef; - printf("Computed hash is 0x%8.8x, Expected 0x%8.8x\n", sparams.pixelHashResult, expected); - EXPECT_TRUE(sparams.pixelHashResult == expected); - - // Cleanup. - api.destroyBufferObject(ubuffer); - api.destroyProgram(program); - api.destroyTexture(srcColorTexture); - api.destroyTexture(dstColorTexture); - api.destroySwapChain(swapChain); - api.destroyRenderTarget(srcRenderTarget); - api.destroyRenderTarget(dstRenderTarget); - delete triangle; - executeCommands(); -} - -TEST_F(BackendTest, DepthResolve) { - auto& api = getDriverApi(); - - constexpr int kSrcTexWidth = 256; - constexpr int kSrcTexHeight = 256; - constexpr int kDstTexWidth = 256; - constexpr int kDstTexHeight = 256; - constexpr auto kColorTexFormat = TextureFormat::RGBA8; - constexpr auto kDepthTexFormat = TextureFormat::DEPTH24; - constexpr int kSampleCount = 4; - - // Create a SwapChain and make it current. We don't really use it so the res doesn't matter. - auto swapChain = api.createSwapChainHeadless(256, 256, 0); - api.makeCurrent(swapChain, swapChain); - - // Create a program. - ProgramHandle program; - { - ShaderGenerator shaderGen(triangleVs, triangleFs, sBackend, sIsMobilePlatform); - Program prog = shaderGen.getProgram(api); - Program::Sampler psamplers[] = { utils::CString("tex"), 0 }; - prog.setSamplerGroup(0, ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, psamplers, sizeof(psamplers) / sizeof(psamplers[0])); - prog.uniformBlockBindings({{"params", 1}}); - program = api.createProgram(std::move(prog)); - } - - // Create a VertexBuffer, IndexBuffer, and RenderPrimitive. - TrianglePrimitive* triangle = new TrianglePrimitive(api); - - // Create 4-sample textures. - Handle srcColorTexture = api.createTexture( - SamplerType::SAMPLER_2D, 1, kColorTexFormat, kSampleCount, kSrcTexWidth, kSrcTexHeight, 1, - TextureUsage::COLOR_ATTACHMENT); - - Handle srcDepthTexture = api.createTexture( - SamplerType::SAMPLER_2D, 1, kDepthTexFormat, kSampleCount, kSrcTexWidth, kSrcTexHeight, 1, - TextureUsage::DEPTH_ATTACHMENT); - - // Create 1-sample textures. - Handle dstColorTexture = api.createTexture( - SamplerType::SAMPLER_2D, 1, kColorTexFormat, 1, kDstTexWidth, kDstTexHeight, 1, - TextureUsage::SAMPLEABLE | TextureUsage::COLOR_ATTACHMENT); - - Handle dstDepthTexture = api.createTexture( - SamplerType::SAMPLER_2D, 1, kDepthTexFormat, 1, kDstTexWidth, kDstTexHeight, 1, - TextureUsage::DEPTH_ATTACHMENT); - - // Create a 4-sample render target with 4-sample textures. - Handle srcRenderTarget = api.createRenderTarget( - TargetBufferFlags::COLOR | TargetBufferFlags::DEPTH, kSrcTexWidth, kSrcTexHeight, - kSampleCount, {{ srcColorTexture }}, { srcDepthTexture }, {}); - - // Create a 1-sample render target with 1-sample textures. - Handle dstRenderTarget = api.createRenderTarget( - TargetBufferFlags::COLOR | TargetBufferFlags::DEPTH, kDstTexWidth, kDstTexHeight, - 1, {{ dstColorTexture }}, { dstDepthTexture }, {}); - - // Prep for rendering. - RenderPassParams params = {}; - params.flags.clear = TargetBufferFlags::COLOR | TargetBufferFlags::DEPTH; - params.clearColor = float4(1, 1, 0, 1); - params.clearDepth = 1.0; - params.flags.discardEnd = TargetBufferFlags::NONE; - params.viewport.width = kSrcTexWidth; - params.viewport.height = kSrcTexHeight; - - PipelineState state = {}; - state.rasterState.colorWrite = true; - state.rasterState.depthWrite = true; - state.rasterState.depthFunc = RasterState::DepthFunc::L; - state.rasterState.culling = RasterState::CullingMode::NONE; - state.program = program; - auto ubuffer = api.createBufferObject(sizeof(MaterialParams), - BufferObjectBinding::UNIFORM, BufferUsage::STATIC); - api.makeCurrent(swapChain, swapChain); - api.beginFrame(0, 0); - api.bindUniformBuffer(0, ubuffer); - - // Draw red triangle into srcRenderTarget. - uploadUniforms(api, ubuffer, { - .color = float4(1, 0, 0, 1), - .scale = float4(1, 1, 0.5, 0), - }); - api.beginRenderPass(srcRenderTarget, params); - api.draw(state, triangle->getRenderPrimitive(), 1); - api.endRenderPass(); - api.endFrame(0); - - // Resolve the MSAA color and depth buffers into the single-sample render target. - api.blit(TargetBufferFlags::COLOR | TargetBufferFlags::DEPTH, dstRenderTarget, - {0, 0, kDstTexWidth, kDstTexHeight}, srcRenderTarget, - {0, 0, kSrcTexWidth, kSrcTexHeight}, SamplerMagFilter::LINEAR); - - // Draw a larger blue triangle into dstRenderTarget. We carefully place it below the red - // triangle in order to exercise depth testing. - api.beginFrame(0, 0); - params.viewport.width = kDstTexWidth; - params.viewport.height = kDstTexHeight; - params.flags.clear = TargetBufferFlags::NONE; - uploadUniforms(api, ubuffer, { - .color = float4(0, 0, 1, 1), - .scale = float4(1.2, 1.2, 0.75, 0), - }); - api.beginRenderPass(dstRenderTarget, params); - api.draw(state, triangle->getRenderPrimitive(), 1); - api.endRenderPass(); + // Resolve the MSAA render target into the single-sample render target. + api.blitDEPRECATED(TargetBufferFlags::COLOR, + dstRenderTarget, {0, 0, kDstTexWidth, kDstTexHeight}, + srcRenderTarget, {0, 0, kSrcTexWidth, kSrcTexHeight}, + SamplerMagFilter::NEAREST); // Grab a screenshot. - ScreenshotParams sparams { kDstTexWidth, kDstTexHeight, "DepthResolve.png" }; - api.beginFrame(0, 0); + ScreenshotParams sparams{ kDstTexWidth, kDstTexHeight, "ColorResolve.png" }; dumpScreenshot(api, dstRenderTarget, &sparams); - api.commit(swapChain); - api.endFrame(0); // Wait for the ReadPixels result to come back. - api.finish(); - executeCommands(); - getDriver().purge(); + flushAndWait(); // Check if the image matches perfectly to our golden run. - const uint32_t expected = 0x5a38e6ba; + const uint32_t expected = 0xebfac2ef; printf("Computed hash is 0x%8.8x, Expected 0x%8.8x\n", sparams.pixelHashResult, expected); EXPECT_TRUE(sparams.pixelHashResult == expected); // Cleanup. + api.destroyDescriptorSet(descriptorSet); + api.destroyDescriptorSetLayout(descriptorSetLayout); api.destroyBufferObject(ubuffer); api.destroyProgram(program); api.destroyTexture(srcColorTexture); api.destroyTexture(dstColorTexture); - api.destroyTexture(srcDepthTexture); - api.destroyTexture(dstDepthTexture); - api.destroySwapChain(swapChain); api.destroyRenderTarget(srcRenderTarget); api.destroyRenderTarget(dstRenderTarget); - delete triangle; - executeCommands(); + flushAndWait(); } TEST_F(BackendTest, Blit2DTextureArray) { @@ -821,24 +492,24 @@ TEST_F(BackendTest, Blit2DTextureArray) { // Create two RenderTargets. const int level = 0; Handle srcRenderTarget = api.createRenderTarget( TargetBufferFlags::COLOR, - kSrcTexWidth >> level, kSrcTexHeight >> level, 1, { srcTexture, level, kSrcTexLayer }, {}, {}); + kSrcTexWidth >> level, kSrcTexHeight >> level, 1, 0, { srcTexture, level, kSrcTexLayer }, {}, {}); Handle dstRenderTarget = api.createRenderTarget( TargetBufferFlags::COLOR, - kDstTexWidth >> level, kDstTexHeight >> level, 1, { dstTexture, level, kDstTexLayer }, {}, {}); + kDstTexWidth >> level, kDstTexHeight >> level, 1, 0, { dstTexture, level, kDstTexLayer }, {}, {}); // Do a blit from kSrcTexLayer of the source RT to kDstTexLayer of the destination RT. const int srcLevel = 0; - api.blit(TargetBufferFlags::COLOR0, dstRenderTarget, + api.blitDEPRECATED(TargetBufferFlags::COLOR0, dstRenderTarget, {0, 0, kDstTexWidth, kDstTexHeight}, srcRenderTarget, {0, 0, kSrcTexWidth >> srcLevel, kSrcTexHeight >> srcLevel}, SamplerMagFilter::LINEAR); // Push through an empty frame to allow the texture to upload and the blit to execute. - api.beginFrame(0, 0); + api.beginFrame(0, 0, 0); api.commit(swapChain); api.endFrame(0); // Grab a screenshot. ScreenshotParams params { kDstTexWidth, kDstTexHeight, "Blit2DTextureArray.png" }; - api.beginFrame(0, 0); + api.beginFrame(0, 0, 0); dumpScreenshot(api, dstRenderTarget, ¶ms); api.commit(swapChain); api.endFrame(0); @@ -913,22 +584,22 @@ TEST_F(BackendTest, BlitRegion) { // that this case is handled correctly. Handle srcRenderTarget = api.createRenderTarget(TargetBufferFlags::COLOR, srcRect.width, - srcRect.height, 1, {srcTexture, kSrcLevel, 0}, {}, {}); + srcRect.height, 1, 0, {srcTexture, kSrcLevel, 0}, {}, {}); Handle dstRenderTarget = api.createRenderTarget(TargetBufferFlags::COLOR, kDstTexWidth >> kDstLevel, - kDstTexHeight >> kDstLevel, 1, {dstTexture, kDstLevel, 0}, {}, {}); + kDstTexHeight >> kDstLevel, 1, 0, {dstTexture, kDstLevel, 0}, {}, {}); - api.blit(TargetBufferFlags::COLOR0, dstRenderTarget, dstRect, srcRenderTarget, srcRect, + api.blitDEPRECATED(TargetBufferFlags::COLOR0, dstRenderTarget, dstRect, srcRenderTarget, srcRect, SamplerMagFilter::LINEAR); // Push through an empty frame to allow the texture to upload and the blit to execute. - api.beginFrame(0, 0); + api.beginFrame(0, 0, 0); api.commit(swapChain); api.endFrame(0); // Grab a screenshot. ScreenshotParams params { kDstTexWidth, kDstTexHeight, "BlitRegion.png" }; - api.beginFrame(0, 0); + api.beginFrame(0, 0, 0); dumpScreenshot(api, dstRenderTarget, ¶ms); api.commit(swapChain); api.endFrame(0); @@ -985,7 +656,7 @@ TEST_F(BackendTest, BlitRegionToSwapChain) { Handle srcRenderTargets[kNumLevels]; for (uint8_t level = 0; level < kNumLevels; level++) { srcRenderTargets[level] = api.createRenderTarget( TargetBufferFlags::COLOR, - kSrcTexWidth >> level, kSrcTexHeight >> level, 1, { srcTexture, level, 0 }, {}, {}); + kSrcTexWidth >> level, kSrcTexHeight >> level, 1, 0, { srcTexture, level, 0 }, {}, {}); } // Blit one-quarter of src level 1 to dst level 0. @@ -1003,9 +674,9 @@ TEST_F(BackendTest, BlitRegionToSwapChain) { .height = kDstTexHeight - 10, }; - api.beginFrame(0, 0); + api.beginFrame(0, 0, 0); - api.blit(TargetBufferFlags::COLOR0, dstRenderTarget, + api.blitDEPRECATED(TargetBufferFlags::COLOR0, dstRenderTarget, dstRect, srcRenderTargets[srcLevel], srcRect, SamplerMagFilter::LINEAR); diff --git a/filament/backend/test/test_BufferUpdates.cpp b/filament/backend/test/test_BufferUpdates.cpp index 27287612bfd..bcaa2fc21a4 100644 --- a/filament/backend/test/test_BufferUpdates.cpp +++ b/filament/backend/test/test_BufferUpdates.cpp @@ -31,7 +31,7 @@ layout(location = 0) in vec4 mesh_position; layout(location = 0) out uvec4 indices; -uniform Params { +layout(binding = 0, set = 1) uniform Params { highp vec4 padding[4]; // offset of 64 bytes highp vec4 color; @@ -51,7 +51,7 @@ std::string fragment (R"(#version 450 core layout(location = 0) out vec4 fragColor; -uniform Params { +layout(binding = 0, set = 1) uniform Params { highp vec4 padding[4]; // offset of 64 bytes highp vec4 color; @@ -89,20 +89,36 @@ TEST_F(BackendTest, VertexBufferUpdate) { // The test is executed within this block scope to force destructors to run before // executeCommands(). { + auto& api = getDriverApi(); + // Create a platform-specific SwapChain and make it current. auto swapChain = createSwapChain(); - getDriverApi().makeCurrent(swapChain, swapChain); + api.makeCurrent(swapChain, swapChain); // Create a program. - ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform); - Program p = shaderGen.getProgram(getDriverApi()); - auto program = getDriverApi().createProgram(std::move(p)); - - auto defaultRenderTarget = getDriverApi().createDefaultRenderTarget(0); + filamat::DescriptorSets descriptors; + descriptors[1] = { { "Params", + { DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::FRAGMENT, 0 }, {} } }; + ShaderGenerator shaderGen( + vertex, fragment, sBackend, sIsMobilePlatform, std::move(descriptors)); + Program p = shaderGen.getProgram(api); + p.descriptorBindings(1, {{ "Params", DescriptorType::UNIFORM_BUFFER, 0 }}); + auto program = api.createProgram(std::move(p)); + + DescriptorSetLayoutHandle descriptorSetLayout = api.createDescriptorSetLayout({ + {{ + DescriptorType::UNIFORM_BUFFER, + ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, 0, + DescriptorFlags::NONE, 0 + }}}); + + DescriptorSetHandle descriptorSet = api.createDescriptorSet(descriptorSetLayout); + + auto defaultRenderTarget = api.createDefaultRenderTarget(0); // To test large buffers (which exercise a different code path) create an extra large // buffer. Only the first 3 vertices will be used. - TrianglePrimitive triangle(getDriverApi(), largeBuffers); + TrianglePrimitive triangle(api, largeBuffers); RenderPassParams params = {}; fullViewport(params); @@ -113,6 +129,7 @@ TEST_F(BackendTest, VertexBufferUpdate) { PipelineState state; state.program = program; + state.pipelineLayout.setLayout[1] = { descriptorSetLayout }; state.rasterState.colorWrite = true; state.rasterState.depthWrite = false; state.rasterState.depthFunc = RasterState::DepthFunc::A; @@ -121,11 +138,13 @@ TEST_F(BackendTest, VertexBufferUpdate) { // Create a uniform buffer. // We use STATIC here, even though the buffer is updated, to force the Metal backend to use a // GPU buffer, which is more interesting to test. - auto ubuffer = getDriverApi().createBufferObject(sizeof(MaterialParams) + 64, + auto ubuffer = api.createBufferObject(sizeof(MaterialParams) + 64, BufferObjectBinding::UNIFORM, BufferUsage::STATIC); - getDriverApi().bindUniformBuffer(0, ubuffer); - getDriverApi().startCapture(0); + api.updateDescriptorSetBuffer(descriptorSet, 0, ubuffer, 0, sizeof(MaterialParams) + 64); + api.bindDescriptorSet(descriptorSet, 1, {}); + + api.startCapture(0); // Upload uniforms. { @@ -139,11 +158,11 @@ TEST_F(BackendTest, VertexBufferUpdate) { delete sp; }; BufferDescriptor bd(tmp, sizeof(MaterialParams), cb); - getDriverApi().updateBufferObject(ubuffer, std::move(bd), 64); + api.updateBufferObject(ubuffer, std::move(bd), 64); } - getDriverApi().makeCurrent(swapChain, swapChain); - getDriverApi().beginFrame(0, 0); + api.makeCurrent(swapChain, swapChain); + api.beginFrame(0, 0, 0); // Draw 10 triangles, updating the vertex buffer / index buffer each time. size_t triangleIndex = 0; @@ -171,22 +190,25 @@ TEST_F(BackendTest, VertexBufferUpdate) { params.flags.discardStart = TargetBufferFlags::NONE; } - getDriverApi().beginRenderPass(defaultRenderTarget, params); - getDriverApi().draw(state, triangle.getRenderPrimitive(), 1); - getDriverApi().endRenderPass(); + api.beginRenderPass(defaultRenderTarget, params); + api.draw(state, triangle.getRenderPrimitive(), 0, 3, 1); + api.endRenderPass(); triangleIndex++; } - getDriverApi().flush(); - getDriverApi().commit(swapChain); - getDriverApi().endFrame(0); + api.flush(); + api.commit(swapChain); + api.endFrame(0); - getDriverApi().stopCapture(0); + api.stopCapture(0); - getDriverApi().destroyProgram(program); - getDriverApi().destroySwapChain(swapChain); - getDriverApi().destroyRenderTarget(defaultRenderTarget); + api.destroyProgram(program); + api.destroySwapChain(swapChain); + api.destroyDescriptorSet(descriptorSet); + api.destroyDescriptorSetLayout(descriptorSetLayout); + api.destroyBufferObject(ubuffer); + api.destroyRenderTarget(defaultRenderTarget); } executeCommands(); @@ -195,28 +217,46 @@ TEST_F(BackendTest, VertexBufferUpdate) { // This test renders two triangles in two separate draw calls. Between the draw calls, a uniform // buffer object is partially updated. TEST_F(BackendTest, BufferObjectUpdateWithOffset) { + auto& api = getDriverApi(); + // Create a platform-specific SwapChain and make it current. auto swapChain = createSwapChain(); - getDriverApi().makeCurrent(swapChain, swapChain); + api.makeCurrent(swapChain, swapChain); // Create a program. - ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform); - Program p = shaderGen.getProgram(getDriverApi()); - p.uniformBlockBindings({{"params", 1}}); - auto program = getDriverApi().createProgram(std::move(p)); + filamat::DescriptorSets descriptors; + descriptors[1] = { { "Params", + { DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::FRAGMENT, 0 }, {} } }; + ShaderGenerator shaderGen( + vertex, fragment, sBackend, sIsMobilePlatform, std::move(descriptors)); + Program p = shaderGen.getProgram(api); + p.descriptorBindings(1, {{ "Params", DescriptorType::UNIFORM_BUFFER, 0 }}); + auto program = api.createProgram(std::move(p)); + + DescriptorSetLayoutHandle descriptorSetLayout = api.createDescriptorSetLayout({ + {{ + DescriptorType::UNIFORM_BUFFER, + ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, 0, + DescriptorFlags::NONE, 0 + }}}); + + DescriptorSetHandle descriptorSet = api.createDescriptorSet(descriptorSetLayout); + // Create a uniform buffer. // We use STATIC here, even though the buffer is updated, to force the Metal backend to use a // GPU buffer, which is more interesting to test. - auto ubuffer = getDriverApi().createBufferObject(sizeof(MaterialParams) + 64, + auto ubuffer = api.createBufferObject(sizeof(MaterialParams) + 64, BufferObjectBinding::UNIFORM, BufferUsage::STATIC); - getDriverApi().bindUniformBuffer(0, ubuffer); + + api.updateDescriptorSetBuffer(descriptorSet, 0, ubuffer, 0, sizeof(MaterialParams) + 64); + api.bindDescriptorSet(descriptorSet, 1, {}); // Create a render target. - auto colorTexture = getDriverApi().createTexture(SamplerType::SAMPLER_2D, 1, + auto colorTexture = api.createTexture(SamplerType::SAMPLER_2D, 1, TextureFormat::RGBA8, 1, 512, 512, 1, TextureUsage::COLOR_ATTACHMENT); - auto renderTarget = getDriverApi().createRenderTarget( - TargetBufferFlags::COLOR0, 512, 512, 1, {{colorTexture}}, {}, {}); + auto renderTarget = api.createRenderTarget( + TargetBufferFlags::COLOR0, 512, 512, 1, 0, {{colorTexture}}, {}, {}); // Upload uniforms for the first triangle. { @@ -230,7 +270,7 @@ TEST_F(BackendTest, BufferObjectUpdateWithOffset) { delete sp; }; BufferDescriptor bd(tmp, sizeof(MaterialParams), cb); - getDriverApi().updateBufferObject(ubuffer, std::move(bd), 64); + api.updateBufferObject(ubuffer, std::move(bd), 64); } RenderPassParams params = {}; @@ -240,7 +280,8 @@ TEST_F(BackendTest, BufferObjectUpdateWithOffset) { params.flags.discardEnd = TargetBufferFlags::NONE; params.viewport.height = 512; params.viewport.width = 512; - renderTriangle(renderTarget, swapChain, program, params); + renderTriangle({{ DescriptorSetLayoutHandle{}, descriptorSetLayout }}, + renderTarget, swapChain, program, params); // Upload uniforms for the second triangle. To test partial buffer updates, we'll only update // color.b, color.a, offset.x, and offset.y. @@ -255,29 +296,32 @@ TEST_F(BackendTest, BufferObjectUpdateWithOffset) { delete sp; }; BufferDescriptor bd((char*)tmp + offsetof(MaterialParams, color.b), sizeof(float) * 4, cb); - getDriverApi().updateBufferObject(ubuffer, std::move(bd), 64 + offsetof(MaterialParams, color.b)); + api.updateBufferObject(ubuffer, std::move(bd), 64 + offsetof(MaterialParams, color.b)); } params.flags.clear = TargetBufferFlags::NONE; params.flags.discardStart = TargetBufferFlags::NONE; - renderTriangle(renderTarget, swapChain, program, params); + renderTriangle({{ DescriptorSetLayoutHandle{}, descriptorSetLayout }}, + renderTarget, swapChain, program, params); static const uint32_t expectedHash = 91322442; readPixelsAndAssertHash( "BufferObjectUpdateWithOffset", 512, 512, renderTarget, expectedHash, true); - getDriverApi().flush(); - getDriverApi().commit(swapChain); - getDriverApi().endFrame(0); + api.flush(); + api.commit(swapChain); + api.endFrame(0); - getDriverApi().destroyProgram(program); - getDriverApi().destroySwapChain(swapChain); - getDriverApi().destroyBufferObject(ubuffer); - getDriverApi().destroyRenderTarget(renderTarget); - getDriverApi().destroyTexture(colorTexture); + api.destroyProgram(program); + api.destroySwapChain(swapChain); + api.destroyDescriptorSet(descriptorSet); + api.destroyDescriptorSetLayout(descriptorSetLayout); + api.destroyBufferObject(ubuffer); + api.destroyRenderTarget(renderTarget); + api.destroyTexture(colorTexture); // This ensures all driver commands have finished before exiting the test. - getDriverApi().finish(); + api.finish(); executeCommands(); diff --git a/filament/backend/test/test_Callbacks.cpp b/filament/backend/test/test_Callbacks.cpp new file mode 100644 index 00000000000..78f6fedf033 --- /dev/null +++ b/filament/backend/test/test_Callbacks.cpp @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "BackendTest.h" + +using namespace filament; +using namespace filament::backend; + +namespace test { + +TEST_F(BackendTest, FrameScheduledCallback) { + auto& api = getDriverApi(); + + // Create a SwapChain. + // In order for the frameScheduledCallback to be called, this must be a real SwapChain (not + // headless) so we obtain a drawable. + auto swapChain = createSwapChain(); + + Handle renderTarget = api.createDefaultRenderTarget(); + + int callbackCountA = 0; + api.setFrameScheduledCallback(swapChain, nullptr, [&callbackCountA](PresentCallable callable) { + callable(); + callbackCountA++; + }, 0); + + // Render the first frame. + api.makeCurrent(swapChain, swapChain); + api.beginFrame(0, 0, 0); + api.beginRenderPass(renderTarget, {}); + api.endRenderPass(0); + api.commit(swapChain); + api.endFrame(0); + + // Render the next frame. The same callback should be called. + api.makeCurrent(swapChain, swapChain); + api.beginFrame(0, 0, 0); + api.beginRenderPass(renderTarget, {}); + api.endRenderPass(0); + api.commit(swapChain); + api.endFrame(0); + + // Now switch out the callback. + int callbackCountB = 0; + api.setFrameScheduledCallback(swapChain, nullptr, [&callbackCountB](PresentCallable callable) { + callable(); + callbackCountB++; + }, 0); + + // Render one final frame. + api.makeCurrent(swapChain, swapChain); + api.beginFrame(0, 0, 0); + api.beginRenderPass(renderTarget, {}); + api.endRenderPass(0); + api.commit(swapChain); + api.endFrame(0); + + api.finish(); + + executeCommands(); + getDriver().purge(); + + EXPECT_EQ(callbackCountA, 2); + EXPECT_EQ(callbackCountB, 1); +} + +TEST_F(BackendTest, FrameCompletedCallback) { + auto& api = getDriverApi(); + + // Create a SwapChain. + auto swapChain = api.createSwapChainHeadless(256, 256, 0); + + int callbackCountA = 0; + api.setFrameCompletedCallback(swapChain, nullptr, + [&callbackCountA]() { callbackCountA++; }); + + // Render the first frame. + api.makeCurrent(swapChain, swapChain); + api.beginFrame(0, 0, 0); + api.commit(swapChain); + api.endFrame(0); + + // Render the next frame. The same callback should be called. + api.makeCurrent(swapChain, swapChain); + api.beginFrame(0, 0, 0); + api.commit(swapChain); + api.endFrame(0); + + // Now switch out the callback. + int callbackCountB = 0; + api.setFrameCompletedCallback(swapChain, nullptr, + [&callbackCountB]() { callbackCountB++; }); + + // Render one final frame. + api.makeCurrent(swapChain, swapChain); + api.beginFrame(0, 0, 0); + api.commit(swapChain); + api.endFrame(0); + + api.finish(); + + executeCommands(); + getDriver().purge(); + + EXPECT_EQ(callbackCountA, 2); + EXPECT_EQ(callbackCountB, 1); +} + +} // namespace test diff --git a/filament/backend/test/test_ComputeBasic.cpp b/filament/backend/test/test_ComputeBasic.cpp index c0475908dfd..0e5febfa564 100644 --- a/filament/backend/test/test_ComputeBasic.cpp +++ b/filament/backend/test/test_ComputeBasic.cpp @@ -58,6 +58,7 @@ kernel void main0() {} } Program program; + program.shaderLanguage(ShaderLanguage::ESSL3); program.shader(ShaderStage::COMPUTE, shader.data(), shader.size() + 1); Handle ph = driver.createProgram(std::move(program)); @@ -144,6 +145,7 @@ kernel void main0(device Output_data& output_data [[buffer(0)]], driver.updateBufferObject(input_data, { data.data(), size }, 0); Program program; + program.shaderLanguage(ShaderLanguage::ESSL3); program.shader(ShaderStage::COMPUTE, shader.data(), shader.size() + 1); Handle ph = driver.createProgram(std::move(program)); @@ -153,8 +155,9 @@ kernel void main0(device Output_data& output_data [[buffer(0)]], driver.dispatchCompute(ph, { groupCount, 1, 1 }); - driver.unbindBuffer(BufferObjectBinding::SHADER_STORAGE, 0); - driver.unbindBuffer(BufferObjectBinding::SHADER_STORAGE, 1); +// FIXME: we need a way to unbind the buffer in order to read from them +// driver.unbindBuffer(BufferObjectBinding::SHADER_STORAGE, 0); +// driver.unbindBuffer(BufferObjectBinding::SHADER_STORAGE, 1); float* const user = (float*)malloc(size); driver.readBufferSubData(output_data, 0, size, { user, size }); diff --git a/filament/backend/test/test_FeedbackLoops.cpp b/filament/backend/test/test_FeedbackLoops.cpp index 605328f100f..df1aaf5471b 100644 --- a/filament/backend/test/test_FeedbackLoops.cpp +++ b/filament/backend/test/test_FeedbackLoops.cpp @@ -19,14 +19,19 @@ #include "ShaderGenerator.h" #include "TrianglePrimitive.h" -#include "private/backend/SamplerGroup.h" +#include +#include #include #include #include +#include -#ifndef IOS +#include +#include + +#ifndef FILAMENT_IOS #include #include @@ -37,31 +42,32 @@ using namespace image; // Shaders //////////////////////////////////////////////////////////////////////////////////////////////////// -static std::string fullscreenVs = R"(#version 450 core +static std::string const fullscreenVs = R"(#version 450 core layout(location = 0) in vec4 mesh_position; void main() { // Hack: move and scale triangle so that it covers entire viewport. gl_Position = vec4((mesh_position.xy + 0.5) * 5.0, 0.0, 1.0); })"; -static std::string fullscreenFs = R"(#version 450 core +static std::string const fullscreenFs = R"(#version 450 core precision mediump int; precision highp float; layout(location = 0) out vec4 fragColor; // Filament's Vulkan backend requires a descriptor set index of 1 for all samplers. // This parameter is ignored for other backends. -layout(location = 0, set = 1) uniform sampler2D tex; +layout(binding = 0, set = 1) uniform sampler2D test_tex; -uniform Params { +layout(binding = 1, set = 1) uniform Params { highp float fbWidth; highp float fbHeight; highp float sourceLevel; highp float unused; } params; + void main() { vec2 fbsize = vec2(params.fbWidth, params.fbHeight); vec2 uv = (gl_FragCoord.xy + 0.5) / fbsize; - fragColor = textureLod(tex, uv, params.sourceLevel); + fragColor = textureLod(test_tex, uv, params.sourceLevel); })"; static uint32_t sPixelHashResult = 0; @@ -106,12 +112,13 @@ static void dumpScreenshot(DriverApi& dapi, Handle rt) { int w = kTexWidth, h = kTexHeight; const uint32_t* texels = (uint32_t*) buffer; sPixelHashResult = utils::hash::murmur3(texels, size / 4, 0); - #ifndef IOS +#ifndef FILAMENT_IOS LinearImage image(w, h, 4); image = toLinearWithAlpha(w, h, w * 4, (uint8_t*) buffer); std::ofstream pngstrm("feedback.png", std::ios::binary | std::ios::trunc); ImageEncoder::encode(pngstrm, ImageEncoder::Format::PNG, image, "", "feedback.png"); - #endif +#endif + free(buffer); }; PixelBufferDescriptor pb(buffer, size, PixelDataFormat::RGBA, PixelDataType::UBYTE, cb); dapi.readPixels(rt, 0, 0, kTexWidth, kTexHeight, std::move(pb)); @@ -133,33 +140,55 @@ TEST_F(BackendTest, FeedbackLoops) { // Create a program. ProgramHandle program; { - SamplerInterfaceBlock sib = filament::SamplerInterfaceBlock::Builder() - .name("backend_test_sib") - .stageFlags(backend::ShaderStageFlags::ALL_SHADER_STAGE_FLAGS) - .add( {{"tex", SamplerType::SAMPLER_2D, SamplerFormat::FLOAT, Precision::HIGH }} ) - .build(); - ShaderGenerator shaderGen(fullscreenVs, fullscreenFs, sBackend, sIsMobilePlatform, &sib); + filament::SamplerInterfaceBlock::SamplerInfo samplerInfo { "test", "tex", 0, + SamplerType::SAMPLER_2D, SamplerFormat::FLOAT, Precision::HIGH, false }; + filamat::DescriptorSets descriptors; + descriptors[1] = { + { "test_tex", { DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, 0 }, + samplerInfo }, + { "Params", { DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::FRAGMENT, 1 }, {} } + }; + ShaderGenerator shaderGen(fullscreenVs, fullscreenFs, sBackend, sIsMobilePlatform, + std::move(descriptors)); Program prog = shaderGen.getProgram(api); - Program::Sampler psamplers[] = { utils::CString("tex"), 0 }; - prog.setSamplerGroup(0, ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, psamplers, sizeof(psamplers) / sizeof(psamplers[0])); - prog.uniformBlockBindings({{"params", 1}}); + prog.descriptorBindings(1, { + { "test_tex", DescriptorType::SAMPLER, 0 }, + { "Params", DescriptorType::UNIFORM_BUFFER, 1 } + }); program = api.createProgram(std::move(prog)); } - TrianglePrimitive triangle(getDriverApi()); + DescriptorSetLayoutHandle descriptorSetLayout = api.createDescriptorSetLayout({ + {{ + DescriptorType::SAMPLER, + ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, 0, + DescriptorFlags::NONE, 0 + }, + { + DescriptorType::UNIFORM_BUFFER, + ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, 1, + DescriptorFlags::NONE, 0 + }}}); + + + TrianglePrimitive const triangle(getDriverApi()); // Create a texture. auto usage = TextureUsage::COLOR_ATTACHMENT | TextureUsage::SAMPLEABLE; - Handle texture = api.createTexture( + Handle const texture = api.createTexture( SamplerType::SAMPLER_2D, kNumLevels, kTexFormat, 1, kTexWidth, kTexHeight, 1, usage); + // Create ubo + auto ubuffer = api.createBufferObject(sizeof(MaterialParams), + BufferObjectBinding::UNIFORM, BufferUsage::STATIC); + // Create a RenderTarget for each miplevel. Handle renderTargets[kNumLevels]; for (uint8_t level = 0; level < kNumLevels; level++) { slog.i << "Level " << int(level) << ": " << (kTexWidth >> level) << "x" << (kTexHeight >> level) << io::endl; renderTargets[level] = api.createRenderTarget( TargetBufferFlags::COLOR, - kTexWidth >> level, kTexHeight >> level, 1, { texture, level, 0 }, {}, {}); + kTexWidth >> level, kTexHeight >> level, 1, 0, { texture, level, 0 }, {}, {}); } // Fill the base level of the texture with interesting colors. @@ -188,19 +217,10 @@ TEST_F(BackendTest, FeedbackLoops) { state.rasterState.depthWrite = false; state.rasterState.depthFunc = RasterState::DepthFunc::A; state.program = program; - SamplerGroup samplers(1); - SamplerParams sparams = {}; - sparams.filterMag = SamplerMagFilter::LINEAR; - sparams.filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST; - samplers.setSampler(0, { texture, sparams }); - auto sgroup = api.createSamplerGroup(samplers.getSize()); - api.updateSamplerGroup(sgroup, samplers.toBufferDescriptor(api)); - auto ubuffer = api.createBufferObject(sizeof(MaterialParams), - BufferObjectBinding::UNIFORM, BufferUsage::STATIC); + state.pipelineLayout.setLayout[1] = { descriptorSetLayout }; + api.makeCurrent(swapChain, swapChain); - api.beginFrame(0, 0); - api.bindSamplers(0, sgroup); - api.bindUniformBuffer(0, ubuffer); + api.beginFrame(0, 0, 0); // Downsample passes params.flags.discardStart = TargetBufferFlags::ALL; @@ -209,15 +229,26 @@ TEST_F(BackendTest, FeedbackLoops) { const uint32_t sourceLevel = targetLevel - 1; params.viewport.width = kTexWidth >> targetLevel; params.viewport.height = kTexHeight >> targetLevel; - getDriverApi().setMinMaxLevels(texture, sourceLevel, sourceLevel); + + auto textureView = api.createTextureView(texture, sourceLevel, 1); + DescriptorSetHandle descriptorSet = api.createDescriptorSet(descriptorSetLayout); + api.updateDescriptorSetTexture(descriptorSet, 0, textureView, { + .filterMag = SamplerMagFilter::LINEAR, + .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST + }); + api.updateDescriptorSetBuffer(descriptorSet, 1, ubuffer, 0, sizeof(MaterialParams)); + api.bindDescriptorSet(descriptorSet, 1, {}); + uploadUniforms(getDriverApi(), ubuffer, { .fbWidth = float(params.viewport.width), .fbHeight = float(params.viewport.height), .sourceLevel = float(sourceLevel), }); api.beginRenderPass(renderTargets[targetLevel], params); - api.draw(state, triangle.getRenderPrimitive(), 1); + api.draw(state, triangle.getRenderPrimitive(), 0, 3, 1); api.endRenderPass(); + api.destroyTexture(textureView); + api.destroyDescriptorSet(descriptorSet); } // Upsample passes @@ -228,19 +259,28 @@ TEST_F(BackendTest, FeedbackLoops) { const uint32_t sourceLevel = targetLevel + 1; params.viewport.width = kTexWidth >> targetLevel; params.viewport.height = kTexHeight >> targetLevel; - getDriverApi().setMinMaxLevels(texture, sourceLevel, sourceLevel); + + auto textureView = api.createTextureView(texture, sourceLevel, 1); + DescriptorSetHandle descriptorSet = api.createDescriptorSet(descriptorSetLayout); + api.updateDescriptorSetTexture(descriptorSet, 0, textureView, { + .filterMag = SamplerMagFilter::LINEAR, + .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST + }); + api.updateDescriptorSetBuffer(descriptorSet, 1, ubuffer, 0, sizeof(MaterialParams)); + api.bindDescriptorSet(descriptorSet, 1, {}); + uploadUniforms(getDriverApi(), ubuffer, { .fbWidth = float(params.viewport.width), .fbHeight = float(params.viewport.height), .sourceLevel = float(sourceLevel), }); api.beginRenderPass(renderTargets[targetLevel], params); - api.draw(state, triangle.getRenderPrimitive(), 1); + api.draw(state, triangle.getRenderPrimitive(), 0, 3, 1); api.endRenderPass(); + api.destroyTexture(textureView); + api.destroyDescriptorSet(descriptorSet); } - getDriverApi().setMinMaxLevels(texture, 0, 0x7f); - // Read back the render target corresponding to the base level. // // NOTE: Calling glReadPixels on any miplevel other than the base level @@ -257,13 +297,17 @@ TEST_F(BackendTest, FeedbackLoops) { getDriver().purge(); } + api.destroyDescriptorSetLayout(descriptorSetLayout); api.destroyProgram(program); api.destroySwapChain(swapChain); api.destroyTexture(texture); - for (auto rt : renderTargets) api.destroyRenderTarget(rt); + api.destroyBufferObject(ubuffer); + for (auto rt : renderTargets) { + api.destroyRenderTarget(rt); + } } - const uint32_t expected = 0xe93a4a07; + const uint32_t expected = 0x70695aa1; printf("Computed hash is 0x%8.8x, Expected 0x%8.8x\n", sPixelHashResult, expected); EXPECT_TRUE(sPixelHashResult == expected); } diff --git a/filament/backend/test/test_Handles.cpp b/filament/backend/test/test_Handles.cpp new file mode 100644 index 00000000000..22390b7acb7 --- /dev/null +++ b/filament/backend/test/test_Handles.cpp @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include +#include +#include +#include "utils/Panic.h" + +using namespace filament::backend; + +// FIXME: consider making this constant non-private so we can use it in tests. +static constexpr uint32_t HANDLE_HEAP_FLAG = 0x80000000u; +static constexpr size_t POOL_SIZE_BYTES = 8 * 1024U * 1024U; +// NOTE: actual count may be lower due to alignment requirements +constexpr size_t const POOL_HANDLE_COUNT = POOL_SIZE_BYTES / (32 + 96 + 136); // 31775 + +// This must match HandleAllocatorGL, so its implementation is present on all platforms. +#define HandleAllocatorTest HandleAllocator<32, 96, 136> // ~4520 / pool / MiB + +struct MyHandle { +}; + +struct Concrete : public MyHandle { + uint8_t data[32]; +}; + +#if GTEST_HAS_EXCEPTIONS +#define EXPECT_THROW_IF_ENABLED EXPECT_THROW +#else +#define EXPECT_THROW_IF_ENABLED(args...) +#endif + +TEST(HandlesTest, useAfterFreePool) { + HandleAllocatorTest allocator("Test Handles", POOL_SIZE_BYTES, false); + + Handle handleA = allocator.allocate(); + allocator.deallocate(handleA); + + Handle handleB = allocator.allocate(); + + EXPECT_THROW_IF_ENABLED({ + Concrete* actualHandleA = allocator.handle_cast(handleA); + }, utils::PostconditionPanic); +} + +TEST(HandlesTest, useAfterFreeHeap) { + HandleAllocatorTest allocator("Test Handles", POOL_SIZE_BYTES, false); + + // Use up all the non-heap handles. + for (int i = 0; i < POOL_HANDLE_COUNT; i++) { + Handle handle = allocator.allocate(); + } + + // This one is guaranteed to be a heap handle. + Handle handleA = allocator.allocate(); + EXPECT_TRUE(handleA.getId() & HANDLE_HEAP_FLAG); + allocator.deallocate(handleA); + + Handle handleB = allocator.allocate(); + + // This should assert: + EXPECT_THROW_IF_ENABLED({ + Concrete* actualHandleA = allocator.handle_cast(handleA); + }, utils::PostconditionPanic); + + // simulate a "corrupted" handle + Handle corruptedHandle { HANDLE_HEAP_FLAG | 0x123456 }; + + EXPECT_THROW_IF_ENABLED({ + Concrete* actualHandleA = allocator.handle_cast(corruptedHandle); + }, utils::PostconditionPanic); +} + +TEST(HandlesTest, isValid) { + HandleAllocatorTest allocator("Test Handles", POOL_SIZE_BYTES, false); + Handle poolHandle = allocator.allocate(); + EXPECT_TRUE((poolHandle.getId() & HANDLE_HEAP_FLAG) == 0u); + + // Use up all the non-heap handles. + for (int i = 0; i < POOL_HANDLE_COUNT; i++) { + Handle handle = allocator.allocate(); + } + + // This one is guaranteed to be a heap handle. + Handle heapHandle = allocator.allocate(); + EXPECT_TRUE(heapHandle.getId() & HANDLE_HEAP_FLAG); + + EXPECT_TRUE(allocator.is_valid(poolHandle)); + EXPECT_TRUE(allocator.is_valid(heapHandle)); + + { + // null handles are invalid + Handle handle; + EXPECT_FALSE(allocator.is_valid(handle)); + } + { + Handle handle { HANDLE_HEAP_FLAG | 0x123456 }; + EXPECT_FALSE(allocator.is_valid(handle)); + } +} diff --git a/filament/backend/test/test_LoadImage.cpp b/filament/backend/test/test_LoadImage.cpp index f4797f7aae0..c5946cd2293 100644 --- a/filament/backend/test/test_LoadImage.cpp +++ b/filament/backend/test/test_LoadImage.cpp @@ -18,15 +18,20 @@ #include "ShaderGenerator.h" #include "TrianglePrimitive.h" +#include "BackendTestUtils.h" + +#include +#include #include "private/filament/SamplerInterfaceBlock.h" -#include "private/backend/SamplerGroup.h" #include -#include #include +#include +#include + using namespace filament; using namespace filament::backend; @@ -113,91 +118,7 @@ namespace test { template inline componentType getMaxValue(); -template -static void fillCheckerboard(void* buffer, size_t size, size_t stride, size_t components, - ComponentType value) { - ComponentType* row = (ComponentType*)buffer; - int p = 0; - for (int r = 0; r < size; r++) { - ComponentType* pixel = row; - for (int col = 0; col < size; col++) { - // Generate a checkerboard pattern. - if ((p & 0x0010) ^ ((p / size) & 0x0010)) { - // Turn on the first component (red). - pixel[0] = value; - } - pixel += components; - p++; - } - row += stride * components; - } -} - -static PixelBufferDescriptor checkerboardPixelBuffer(PixelDataFormat format, PixelDataType type, - size_t size, size_t bufferPadding = 0) { - size_t components; int bpp; - getPixelInfo(format, type, components, bpp); - - size_t bufferSize = size + bufferPadding * 2; - uint8_t* buffer = (uint8_t*) calloc(1, bufferSize * bufferSize * bpp); - - uint8_t* ptr = buffer + (bufferSize * bufferPadding * bpp) + (bufferPadding * bpp); - - switch (type) { - case PixelDataType::BYTE: - fillCheckerboard(ptr, size, bufferSize, components, 1); - break; - - case PixelDataType::UBYTE: - fillCheckerboard(ptr, size, bufferSize, components, 0xFF); - break; - - case PixelDataType::SHORT: - fillCheckerboard(ptr, size, bufferSize, components, 1); - break; - - case PixelDataType::USHORT: - fillCheckerboard(ptr, size, bufferSize, components, 1u); - break; - - case PixelDataType::UINT: - fillCheckerboard(ptr, size, bufferSize, components, 1u); - break; - - case PixelDataType::INT: - fillCheckerboard(ptr, size, bufferSize, components, 1); - break; - - case PixelDataType::FLOAT: - fillCheckerboard(ptr, size, bufferSize, components, 1.0f); - break; - - case PixelDataType::HALF: - fillCheckerboard(ptr, size, bufferSize, components, math::half(1.0f)); - break; - - case PixelDataType::UINT_2_10_10_10_REV: - fillCheckerboard(ptr, size, bufferSize, 1, 0xC00003FF /* red */); - break; - - case PixelDataType::USHORT_565: - fillCheckerboard(ptr, size, bufferSize, 1, 0xF800 /* red */); - break; - case PixelDataType::UINT_10F_11F_11F_REV: - fillCheckerboard(ptr, size, bufferSize, 1, 0x000003C0 /* red */); - break; - - case PixelDataType::COMPRESSED: - break; - } - - PixelBufferDescriptor descriptor(buffer, bufferSize * bufferSize * bpp, format, type, - 1, bufferPadding, bufferPadding, bufferSize, [](void* buffer, size_t size, void* user) { - free(buffer); - }, nullptr); - return descriptor; -} inline std::string stringReplace(const std::string& find, const std::string& replace, std::string source) { @@ -257,6 +178,41 @@ static const char* getSamplerTypeName(TextureFormat textureFormat) { default: return "sampler2D"; } + +} +static SamplerFormat getSamplerFormat(TextureFormat textureFormat) { + switch (textureFormat) { + case TextureFormat::R8UI: + case TextureFormat::R16UI: + case TextureFormat::RG8UI: + case TextureFormat::RGB8UI: + case TextureFormat::R32UI: + case TextureFormat::RG16UI: + case TextureFormat::RGBA8UI: + case TextureFormat::RGB16UI: + case TextureFormat::RG32UI: + case TextureFormat::RGBA16UI: + case TextureFormat::RGB32UI: + case TextureFormat::RGBA32UI: + return SamplerFormat::UINT; + + case TextureFormat::R8I: + case TextureFormat::R16I: + case TextureFormat::RG8I: + case TextureFormat::RGB8I: + case TextureFormat::R32I: + case TextureFormat::RG16I: + case TextureFormat::RGBA8I: + case TextureFormat::RGB16I: + case TextureFormat::RG32I: + case TextureFormat::RGBA16I: + case TextureFormat::RGB32I: + case TextureFormat::RGBA32I: + return SamplerFormat::INT; + + default: + return SamplerFormat::FLOAT; + } } TEST_F(BackendTest, UpdateImage2D) { @@ -314,9 +270,10 @@ TEST_F(BackendTest, UpdateImage2D) { // Test integer format uploads. // TODO: These cases fail on OpenGL and Vulkan. - testCases.emplace_back("RGB_INTEGER, UBYTE -> RGB8UI", PixelDataFormat::RGB_INTEGER, PixelDataType::UBYTE, TextureFormat::RGB8UI); - testCases.emplace_back("RGB_INTEGER, USHORT -> RGB16UI", PixelDataFormat::RGB_INTEGER, PixelDataType::USHORT, TextureFormat::RGB16UI); - testCases.emplace_back("RGB_INTEGER, INT -> RGB32I", PixelDataFormat::RGB_INTEGER, PixelDataType::INT, TextureFormat::RGB32I); + // TODO: These cases now also fail on Metal, but at some point previously worked. + testCases.emplace_back("RGB_INTEGER, UBYTE -> RGB8UI", PixelDataFormat::RGB_INTEGER, PixelDataType::UBYTE, TextureFormat::RGB8UI); + testCases.emplace_back("RGB_INTEGER, USHORT -> RGB16UI", PixelDataFormat::RGB_INTEGER, PixelDataType::USHORT, TextureFormat::RGB16UI); + testCases.emplace_back("RGB_INTEGER, INT -> RGB32I", PixelDataFormat::RGB_INTEGER, PixelDataType::INT, TextureFormat::RGB32I); // Test uploads with buffer padding. // TODO: Vulkan crashes with "Assertion failed: (offset + size <= allocationSize)" @@ -344,84 +301,86 @@ TEST_F(BackendTest, UpdateImage2D) { auto defaultRenderTarget = api.createDefaultRenderTarget(0); // Create a program. - SamplerInterfaceBlock sib = filament::SamplerInterfaceBlock::Builder() - .name("Test") - .stageFlags(backend::ShaderStageFlags::ALL_SHADER_STAGE_FLAGS) - .add( {{"tex", SamplerType::SAMPLER_2D, SamplerFormat::FLOAT, Precision::HIGH }} ) - .build(); - ProgramHandle program; - std::string fragment = stringReplace("{samplerType}", + filament::SamplerInterfaceBlock::SamplerInfo samplerInfo { "test", "tex", 0, + SamplerType::SAMPLER_2D, getSamplerFormat(t.textureFormat), Precision::HIGH, false }; + filamat::DescriptorSets descriptors; + descriptors[1] = { { "test_tex", { DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, 0 }, + samplerInfo } }; + + std::string const fragment = stringReplace("{samplerType}", getSamplerTypeName(t.textureFormat), fragmentTemplate); - ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform, &sib); + ShaderGenerator shaderGen( + vertex, fragment, sBackend, sIsMobilePlatform, std::move(descriptors)); + Program prog = shaderGen.getProgram(api); - Program::Sampler psamplers[] = { utils::CString("tex"), 0 }; - prog.setSamplerGroup(0, ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, psamplers, sizeof(psamplers) / sizeof(psamplers[0])); - program = api.createProgram(std::move(prog)); + prog.descriptorBindings(1, {{"test_tex", DescriptorType::SAMPLER, 0}}); + + ProgramHandle const program = api.createProgram(std::move(prog)); + + DescriptorSetLayoutHandle descriptorSetLayout = api.createDescriptorSetLayout({ + {{ + DescriptorType::SAMPLER, + ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, 0, + DescriptorFlags::NONE, 0 + }}}); + + DescriptorSetHandle descriptorSet = api.createDescriptorSet(descriptorSetLayout); // Create a Texture. - auto usage = TextureUsage::SAMPLEABLE; - Handle texture = api.createTexture(SamplerType::SAMPLER_2D, 1, + auto usage = TextureUsage::SAMPLEABLE | TextureUsage::UPLOADABLE; + Handle const texture = api.createTexture(SamplerType::SAMPLER_2D, 1, t.textureFormat, 1, 512, 512, 1u, usage); // Upload some pixel data. if (t.uploadSubregions) { - const auto& pf = t.pixelFormat; - const auto& pt = t.pixelType; - PixelBufferDescriptor subregion1 = checkerboardPixelBuffer(pf, pt, 256, t.bufferPadding); - PixelBufferDescriptor subregion2 = checkerboardPixelBuffer(pf, pt, 256, t.bufferPadding); - PixelBufferDescriptor subregion3 = checkerboardPixelBuffer(pf, pt, 256, t.bufferPadding); - PixelBufferDescriptor subregion4 = checkerboardPixelBuffer(pf, pt, 256, t.bufferPadding); - api.update3DImage(texture, 0, 0, 0, 0, 256, 256, 1, std::move(subregion1)); - api.update3DImage(texture, 0, 256, 0, 0, 256, 256, 1, std::move(subregion2)); - api.update3DImage(texture, 0, 0, 256, 0, 256, 256, 1, std::move(subregion3)); - api.update3DImage(texture, 0, 256, 256, 0, 256, 256, 1, std::move(subregion4)); + api.update3DImage(texture, 0, 0, 0, 0, 256, 256, 1, + checkerboardPixelBuffer(t.pixelFormat, t.pixelType, 256, t.bufferPadding)); + api.update3DImage(texture, 0, 256, 0, 0, 256, 256, 1, + checkerboardPixelBuffer(t.pixelFormat, t.pixelType, 256, t.bufferPadding)); + api.update3DImage(texture, 0, 0, 256, 0, 256, 256, 1, + checkerboardPixelBuffer(t.pixelFormat, t.pixelType, 256, t.bufferPadding)); + api.update3DImage(texture, 0, 256, 256, 0, 256, 256, 1, + checkerboardPixelBuffer(t.pixelFormat, t.pixelType, 256, t.bufferPadding)); } else { - PixelBufferDescriptor descriptor - = checkerboardPixelBuffer(t.pixelFormat, t.pixelType, 512, t.bufferPadding); - api.update3DImage(texture, 0, 0, 0, 0, 512, 512, 1, std::move(descriptor)); + api.update3DImage(texture, 0, 0, 0, 0, 512, 512, 1, + checkerboardPixelBuffer(t.pixelFormat, t.pixelType, 512, t.bufferPadding)); } - SamplerGroup samplers(1); - SamplerParams sparams = {}; - sparams.filterMag = SamplerMagFilter::LINEAR; - sparams.filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST; - samplers.setSampler(0, { texture, sparams }); - auto sgroup = api.createSamplerGroup(samplers.getSize()); - api.updateSamplerGroup(sgroup, samplers.toBufferDescriptor(api)); + api.updateDescriptorSetTexture(descriptorSet, 0, texture, { + .filterMag = SamplerMagFilter::NEAREST, + .filterMin = SamplerMinFilter::NEAREST_MIPMAP_NEAREST }); - api.bindSamplers(0, sgroup); + api.bindDescriptorSet(descriptorSet, 1, {}); - renderTriangle(defaultRenderTarget, swapChain, program); + renderTriangle({{ DescriptorSetLayoutHandle{}, descriptorSetLayout }}, + defaultRenderTarget, swapChain, program); readPixelsAndAssertHash(t.name, 512, 512, defaultRenderTarget, expectedHash); - api.flush(); api.commit(swapChain); api.endFrame(0); + api.destroyDescriptorSet(descriptorSet); + api.destroyDescriptorSetLayout(descriptorSetLayout); api.destroyProgram(program); api.destroySwapChain(swapChain); api.destroyRenderTarget(defaultRenderTarget); api.destroyTexture(texture); - - // This ensures all driver commands have finished before exiting the test. - api.finish(); } + api.finish(); api.stopCapture(); - executeCommands(); - - getDriver().purge(); + flushAndWait(); } TEST_F(BackendTest, UpdateImageSRGB) { auto& api = getDriverApi(); api.startCapture(); - PixelDataFormat pixelFormat = PixelDataFormat::RGB; - PixelDataType pixelType = PixelDataType::UBYTE; - TextureFormat textureFormat = TextureFormat::SRGB8_A8; + PixelDataFormat const pixelFormat = PixelDataFormat::RGBA; + PixelDataType const pixelType = PixelDataType::UBYTE; + TextureFormat const textureFormat = TextureFormat::SRGB8_A8; // Create a platform-specific SwapChain and make it current. auto swapChain = createSwapChain(); @@ -429,22 +388,31 @@ TEST_F(BackendTest, UpdateImageSRGB) { auto defaultRenderTarget = api.createDefaultRenderTarget(0); // Create a program. - SamplerInterfaceBlock sib = filament::SamplerInterfaceBlock::Builder() - .name("Test") - .stageFlags(backend::ShaderStageFlags::ALL_SHADER_STAGE_FLAGS) - .add( {{"tex", SamplerType::SAMPLER_2D, SamplerFormat::FLOAT, Precision::HIGH }} ) - .build(); - std::string fragment = stringReplace("{samplerType}", + filament::SamplerInterfaceBlock::SamplerInfo samplerInfo { "test", "tex", 0, + SamplerType::SAMPLER_2D, getSamplerFormat(textureFormat), Precision::HIGH, false }; + filamat::DescriptorSets descriptors; + descriptors[1] = { { "test_tex", { DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, 0 }, + samplerInfo } }; + + std::string const fragment = stringReplace("{samplerType}", getSamplerTypeName(textureFormat), fragmentTemplate); - ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform, &sib); + ShaderGenerator shaderGen( + vertex, fragment, sBackend, sIsMobilePlatform, std::move(descriptors)); Program prog = shaderGen.getProgram(api); - Program::Sampler psamplers[] = { utils::CString("tex"), 0 }; - prog.setSamplerGroup(0, ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, psamplers, sizeof(psamplers) / sizeof(psamplers[0])); - ProgramHandle program = api.createProgram(std::move(prog)); + prog.descriptorBindings(1, {{"test_tex", DescriptorType::SAMPLER, 0}}); + ProgramHandle const program = api.createProgram(std::move(prog)); + DescriptorSetLayoutHandle descriptorSetLayout = api.createDescriptorSetLayout({ + {{ + DescriptorType::SAMPLER, + ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, 0, + DescriptorFlags::NONE, 0 + }}}); + + DescriptorSetHandle descriptorSet = api.createDescriptorSet(descriptorSetLayout); // Create a texture. - Handle texture = api.createTexture(SamplerType::SAMPLER_2D, 1, - textureFormat, 1, 512, 512, 1, TextureUsage::SAMPLEABLE); + Handle const texture = api.createTexture(SamplerType::SAMPLER_2D, 1, + textureFormat, 1, 512, 512, 1, TextureUsage::SAMPLEABLE | TextureUsage::UPLOADABLE); // Create image data. size_t components; int bpp; @@ -469,41 +437,37 @@ TEST_F(BackendTest, UpdateImageSRGB) { api.update3DImage(texture, 0, 0, 0, 0, 512, 512, 1, std::move(descriptor)); - api.beginFrame(0, 0); + api.beginFrame(0, 0, 0); // Update samplers. - SamplerGroup samplers(1); - SamplerParams sparams = {}; - sparams.filterMag = SamplerMagFilter::LINEAR; - sparams.filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST; - samplers.setSampler(0, { texture, sparams }); - auto sgroup = api.createSamplerGroup(samplers.getSize()); - api.updateSamplerGroup(sgroup, samplers.toBufferDescriptor(api)); + api.updateDescriptorSetTexture(descriptorSet, 0, texture, { + .filterMag = SamplerMagFilter::LINEAR, + .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST + }); - api.bindSamplers(0, sgroup); + api.bindDescriptorSet(descriptorSet, 1, {}); - renderTriangle(defaultRenderTarget, swapChain, program); + renderTriangle({{ DescriptorSetLayoutHandle{}, descriptorSetLayout }}, + defaultRenderTarget, swapChain, program); - static const uint32_t expectedHash = 519370995; + static const uint32_t expectedHash = 359858623; readPixelsAndAssertHash("UpdateImageSRGB", 512, 512, defaultRenderTarget, expectedHash); api.flush(); api.commit(swapChain); api.endFrame(0); - api.destroySamplerGroup(sgroup); + api.destroyDescriptorSet(descriptorSet); + api.destroyDescriptorSetLayout(descriptorSetLayout); api.destroyProgram(program); api.destroySwapChain(swapChain); api.destroyRenderTarget(defaultRenderTarget); // This ensures all driver commands have finished before exiting the test. api.finish(); - api.stopCapture(); - executeCommands(); - - getDriver().purge(); + flushAndWait(); } TEST_F(BackendTest, UpdateImageMipLevel) { @@ -520,44 +484,50 @@ TEST_F(BackendTest, UpdateImageMipLevel) { auto defaultRenderTarget = api.createDefaultRenderTarget(0); // Create a program. - SamplerInterfaceBlock sib = filament::SamplerInterfaceBlock::Builder() - .name("Test") - .stageFlags(backend::ShaderStageFlags::ALL_SHADER_STAGE_FLAGS) - .add( {{"tex", SamplerType::SAMPLER_3D, SamplerFormat::FLOAT, Precision::HIGH }} ) - .build(); - std::string fragment = stringReplace("{samplerType}", + filament::SamplerInterfaceBlock::SamplerInfo samplerInfo { "test", "tex", 0, + SamplerType::SAMPLER_2D, getSamplerFormat(textureFormat), Precision::HIGH, false }; + filamat::DescriptorSets descriptors; + descriptors[1] = { { "test_tex", { DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, 0 }, + samplerInfo } }; + std::string const fragment = stringReplace("{samplerType}", getSamplerTypeName(textureFormat), fragmentUpdateImageMip); - ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform, &sib); + ShaderGenerator shaderGen( + vertex, fragment, sBackend, sIsMobilePlatform, std::move(descriptors)); Program prog = shaderGen.getProgram(api); - Program::Sampler psamplers[] = { utils::CString("tex"), 0 }; - prog.setSamplerGroup(0, ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, psamplers, sizeof(psamplers) / sizeof(psamplers[0])); - ProgramHandle program = api.createProgram(std::move(prog)); + prog.descriptorBindings(1, {{"test_tex", DescriptorType::SAMPLER, 0}}); + ProgramHandle const program = api.createProgram(std::move(prog)); + DescriptorSetLayoutHandle descriptorSetLayout = api.createDescriptorSetLayout({ + {{ + DescriptorType::SAMPLER, + ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, 0, + DescriptorFlags::NONE, 0 + }}}); + + DescriptorSetHandle descriptorSet = api.createDescriptorSet(descriptorSetLayout); // Create a texture with 3 mip levels. // Base level: 1024 // Level 1: 512 <-- upload data and sample from this level // Level 2: 256 Handle texture = api.createTexture(SamplerType::SAMPLER_2D, 3, - textureFormat, 1, 1024, 1024, 1, TextureUsage::SAMPLEABLE); + textureFormat, 1, 1024, 1024, 1, TextureUsage::SAMPLEABLE | TextureUsage::UPLOADABLE); // Create image data. PixelBufferDescriptor descriptor = checkerboardPixelBuffer(pixelFormat, pixelType, 512); - api.update3DImage(texture, 1, 0, 0, 0, 512, 512, 1, std::move(descriptor)); + api.update3DImage(texture, /* level*/ 1, 0, 0, 0, 512, 512, 1, std::move(descriptor)); - api.beginFrame(0, 0); + api.beginFrame(0, 0, 0); // Update samplers. - SamplerGroup samplers(1); - SamplerParams sparams = {}; - sparams.filterMag = SamplerMagFilter::LINEAR; - sparams.filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST; - samplers.setSampler(0, { texture, sparams }); - auto sgroup = api.createSamplerGroup(samplers.getSize()); - api.updateSamplerGroup(sgroup, samplers.toBufferDescriptor(api)); + api.updateDescriptorSetTexture(descriptorSet, 0, texture, { + .filterMag = SamplerMagFilter::LINEAR, + .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST + }); - api.bindSamplers(0, sgroup); + api.bindDescriptorSet(descriptorSet, 1, {}); - renderTriangle(defaultRenderTarget, swapChain, program); + renderTriangle({{ DescriptorSetLayoutHandle{}, descriptorSetLayout }}, + defaultRenderTarget, swapChain, program); static const uint32_t expectedHash = 3644679986; readPixelsAndAssertHash("UpdateImageMipLevel", 512, 512, defaultRenderTarget, expectedHash); @@ -566,19 +536,17 @@ TEST_F(BackendTest, UpdateImageMipLevel) { api.commit(swapChain); api.endFrame(0); - api.destroySamplerGroup(sgroup); + api.destroyDescriptorSet(descriptorSet); + api.destroyDescriptorSetLayout(descriptorSetLayout); api.destroyProgram(program); api.destroySwapChain(swapChain); api.destroyRenderTarget(defaultRenderTarget); // This ensures all driver commands have finished before exiting the test. api.finish(); - api.stopCapture(); - executeCommands(); - - getDriver().purge(); + flushAndWait(); } TEST_F(BackendTest, UpdateImage3D) { @@ -589,7 +557,7 @@ TEST_F(BackendTest, UpdateImage3D) { PixelDataType pixelType = PixelDataType::FLOAT; TextureFormat textureFormat = TextureFormat::RGBA16F; SamplerType samplerType = SamplerType::SAMPLER_2D_ARRAY; - TextureUsage usage = TextureUsage::SAMPLEABLE; + TextureUsage usage = TextureUsage::SAMPLEABLE | TextureUsage::UPLOADABLE; // Create a platform-specific SwapChain and make it current. auto swapChain = createSwapChain(); @@ -597,18 +565,26 @@ TEST_F(BackendTest, UpdateImage3D) { auto defaultRenderTarget = api.createDefaultRenderTarget(0); // Create a program. - SamplerInterfaceBlock sib = filament::SamplerInterfaceBlock::Builder() - .name("Test") - .stageFlags(backend::ShaderStageFlags::ALL_SHADER_STAGE_FLAGS) - .add( {{"tex", SamplerType::SAMPLER_3D, SamplerFormat::FLOAT, Precision::HIGH }} ) - .build(); + filament::SamplerInterfaceBlock::SamplerInfo samplerInfo { "test", "tex", 0, + SamplerType::SAMPLER_2D_ARRAY, getSamplerFormat(textureFormat), Precision::HIGH, false }; + filamat::DescriptorSets descriptors; + descriptors[1] = { { "test_tex", { DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, 0 }, + samplerInfo } }; std::string fragment = stringReplace("{samplerType}", getSamplerTypeName(samplerType), fragmentUpdateImage3DTemplate); - ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform, &sib); + ShaderGenerator shaderGen( + vertex, fragment, sBackend, sIsMobilePlatform, std::move(descriptors)); Program prog = shaderGen.getProgram(api); - Program::Sampler psamplers[] = { utils::CString("tex"), 0 }; - prog.setSamplerGroup(0, ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, psamplers, sizeof(psamplers) / sizeof(psamplers[0])); - ProgramHandle program = api.createProgram(std::move(prog)); + prog.descriptorBindings(1, {{ "test_tex", DescriptorType::SAMPLER, 0 }}); + ProgramHandle const program = api.createProgram(std::move(prog)); + DescriptorSetLayoutHandle descriptorSetLayout = api.createDescriptorSetLayout({ + {{ + DescriptorType::SAMPLER, + ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, 0, + DescriptorFlags::NONE, 0 + }}}); + + DescriptorSetHandle descriptorSet = api.createDescriptorSet(descriptorSetLayout); // Create a texture. Handle texture = api.createTexture(samplerType, 1, @@ -631,20 +607,18 @@ TEST_F(BackendTest, UpdateImage3D) { api.update3DImage(texture, 0, 0, 0, 0, 512, 512, 4, std::move(descriptor)); - api.beginFrame(0, 0); + api.beginFrame(0, 0, 0); // Update samplers. - SamplerGroup samplers(1); - SamplerParams sparams = {}; - sparams.filterMag = SamplerMagFilter::LINEAR; - sparams.filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST; - samplers.setSampler(0, { texture, sparams}); - auto sgroup = api.createSamplerGroup(samplers.getSize()); - api.updateSamplerGroup(sgroup, samplers.toBufferDescriptor(api)); + api.updateDescriptorSetTexture(descriptorSet, 0, texture, { + .filterMag = SamplerMagFilter::LINEAR, + .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST + }); - api.bindSamplers(0, sgroup); + api.bindDescriptorSet(descriptorSet, 1, {}); - renderTriangle(defaultRenderTarget, swapChain, program); + renderTriangle({{ DescriptorSetLayoutHandle{}, descriptorSetLayout }}, + defaultRenderTarget, swapChain, program); static const uint32_t expectedHash = 3644679986; readPixelsAndAssertHash("UpdateImage3D", 512, 512, defaultRenderTarget, expectedHash); @@ -653,19 +627,17 @@ TEST_F(BackendTest, UpdateImage3D) { api.commit(swapChain); api.endFrame(0); - api.destroySamplerGroup(sgroup); + api.destroyDescriptorSet(descriptorSet); + api.destroyDescriptorSetLayout(descriptorSetLayout); api.destroyProgram(program); api.destroySwapChain(swapChain); api.destroyRenderTarget(defaultRenderTarget); // This ensures all driver commands have finished before exiting the test. api.finish(); - api.stopCapture(); - executeCommands(); - - getDriver().purge(); + flushAndWait(); } } // namespace test diff --git a/filament/backend/test/test_MRT.cpp b/filament/backend/test/test_MRT.cpp index 3e6e08f361f..21a30f7104a 100644 --- a/filament/backend/test/test_MRT.cpp +++ b/filament/backend/test/test_MRT.cpp @@ -105,7 +105,8 @@ TEST_F(BackendTest, MRT) { 512, // width 512, // height 1, // samples - {{textureA },{textureB }}, // color + 0, // layerCount + {{textureA },{textureB }}, // color {}, // depth {}); // stencil @@ -126,11 +127,11 @@ TEST_F(BackendTest, MRT) { getDriverApi().startCapture(0); getDriverApi().makeCurrent(swapChain, swapChain); - getDriverApi().beginFrame(0, 0); + getDriverApi().beginFrame(0, 0, 0); // Draw a triangle. getDriverApi().beginRenderPass(renderTarget, params); - getDriverApi().draw(state, triangle.getRenderPrimitive(), 1); + getDriverApi().draw(state, triangle.getRenderPrimitive(), 0, 3, 1); getDriverApi().endRenderPass(); getDriverApi().flush(); diff --git a/filament/backend/test/test_MipLevels.cpp b/filament/backend/test/test_MipLevels.cpp new file mode 100644 index 00000000000..8d070969d54 --- /dev/null +++ b/filament/backend/test/test_MipLevels.cpp @@ -0,0 +1,267 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "BackendTest.h" + +#include "ShaderGenerator.h" +#include "TrianglePrimitive.h" +#include "BackendTestUtils.h" + +#include +#include + +#include +#include + +namespace { + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// Shaders +//////////////////////////////////////////////////////////////////////////////////////////////////// + +std::string vertex (R"(#version 450 core + +layout(location = 0) in vec4 mesh_position; +layout(location = 0) out vec2 uv; + +void main() { + gl_Position = vec4(mesh_position.xy, 0.0, 1.0); + uv = (mesh_position.xy * 0.5 + 0.5); +} +)"); + +std::string fragment (R"(#version 450 core + +layout(location = 0) out vec4 fragColor; +layout(location = 0) in vec2 uv; + +layout(location = 0, set = 1) uniform sampler2D backend_test_sib_tex; + +void main() { + fragColor = textureLod(backend_test_sib_tex, uv, 1); +} +)"); + +std::string whiteFragment (R"(#version 450 core + +layout(location = 0) out vec4 fragColor; +layout(location = 0) in vec2 uv; + +layout(location = 0, set = 1) uniform sampler2D backend_test_sib_tex; + +void main() { + fragColor = vec4(1.0); +} +)"); + +} + +namespace test { + +using namespace filament; +using namespace filament::backend; + +TEST_F(BackendTest, TextureViewLod) { + auto& api = getDriverApi(); + api.startCapture(0); + + // The test is executed within this block scope to force destructors to run before + // executeCommands(). + { + // Create a SwapChain and make it current. + auto swapChain = createSwapChain(); + api.makeCurrent(swapChain, swapChain); + + // Create a program that draws only white. + Handle whiteProgram; + { + ShaderGenerator shaderGen(vertex, whiteFragment, sBackend, sIsMobilePlatform); + Program p = shaderGen.getProgram(api); + p.descriptorBindings(0, {{"backend_test_sib_tex", DescriptorType::SAMPLER, 0}}); + whiteProgram = api.createProgram(std::move(p)); + } + + // Create a program that samples a texture. + Handle textureProgram; + { + filament::SamplerInterfaceBlock::SamplerInfo samplerInfo { "backend_test", "sib_tex", 0, + SamplerType::SAMPLER_2D, SamplerFormat::FLOAT, Precision::HIGH, false }; + filamat::DescriptorSets descriptors; + descriptors[1] = { { "backend_test_sib_tex", + { DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, 0 }, samplerInfo } }; + ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform, std::move(descriptors)); + Program p = shaderGen.getProgram(api); + p.descriptorBindings(0, {{"backend_test_sib_tex", DescriptorType::SAMPLER, 0}}); + textureProgram = api.createProgram(std::move(p)); + } + + DescriptorSetLayoutHandle descriptorSetLayout = api.createDescriptorSetLayout({ + {{ + DescriptorType::SAMPLER, + ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, 0, + DescriptorFlags::NONE, 0 + }}}); + + DescriptorSetHandle descriptorSet[2]; + descriptorSet[0] = api.createDescriptorSet(descriptorSetLayout); + descriptorSet[1] = api.createDescriptorSet(descriptorSetLayout); + + // Create a texture that has 4 mip levels. Each level is a different color. + // Level 0: 128x128 (red) + // Level 1: 64x64 (green) + // Level 2: 32x32 (blue) + // Level 3: 16x16 (yellow) + const size_t kTextureSize = 128; + const size_t kMipLevels = 4; + Handle texture = api.createTexture(SamplerType::SAMPLER_2D, kMipLevels, + TextureFormat::RGBA8, 1, kTextureSize, kTextureSize, 1, + TextureUsage::SAMPLEABLE | TextureUsage::COLOR_ATTACHMENT | TextureUsage::UPLOADABLE); + + // Create image data. + auto pixelFormat = PixelDataFormat::RGBA; + auto pixelType = PixelDataType::UBYTE; + size_t components; int bpp; + getPixelInfo(pixelFormat, pixelType, components, bpp); + uint32_t colors[] = { + 0xFF0000FF, /* red */ + 0xFF00FF00, /* green */ + 0xFFFF0000, /* blue */ + 0xFF00FFFF, /* yellow */ + }; + for (int l = 0; l < kMipLevels; l++) { + size_t mipSize = kTextureSize >> l; + auto* buffer = (uint8_t*)calloc(1, mipSize * mipSize * bpp); + fillCheckerboard(buffer, mipSize, mipSize, 1, colors[l]); + PixelBufferDescriptor descriptor( + buffer, mipSize * mipSize * bpp, pixelFormat, pixelType, 1, 0, 0, + mipSize, [](void* buffer, size_t size, void* user) { free(buffer); }, + nullptr); + api.update3DImage( + texture, l, 0, 0, 0, mipSize, mipSize, 1, std::move(descriptor)); + } + + TrianglePrimitive triangle(api); + + api.beginFrame(0, 0, 0); + + // We set the base mip to 1, and the max mip to 3 + // Level 0: 128x128 (red) + // Level 1: 64x64 (green) <-- base + // Level 2: 32x32 (blue) <--- white triangle rendered + // Level 3: 16x16 (yellow) <-- max + auto texture13 = api.createTextureView(texture, 1, 3); + + // Render a white triangle into level 2. + // We specify mip level 2, because minMaxLevels has no effect when rendering into a texture. + Handle renderTarget = api.createRenderTarget( + TargetBufferFlags::COLOR, 32, 32, 1, 0, + {texture, 2 /* level */, 0 /* layer */}, {}, {}); + { + RenderPassParams params = {}; + fullViewport(params); + params.flags.clear = TargetBufferFlags::NONE; + params.flags.discardStart = TargetBufferFlags::NONE; + params.flags.discardEnd = TargetBufferFlags::NONE; + PipelineState ps = {}; + ps.program = whiteProgram; + ps.rasterState.colorWrite = true; + ps.rasterState.depthWrite = false; + api.beginRenderPass(renderTarget, params); + api.draw(ps, triangle.getRenderPrimitive(), 0, 3, 1); + api.endRenderPass(); + } + + backend::Handle defaultRenderTarget = api.createDefaultRenderTarget(0); + + RenderPassParams params = {}; + fullViewport(params); + params.flags.clear = TargetBufferFlags::COLOR; + params.clearColor = {0.f, 0.f, 0.5f, 1.f}; + params.flags.discardStart = TargetBufferFlags::ALL; + params.flags.discardEnd = TargetBufferFlags::NONE; + + PipelineState state; + state.program = textureProgram; + state.pipelineLayout.setLayout = { descriptorSetLayout }; + state.rasterState.colorWrite = true; + state.rasterState.depthWrite = false; + state.rasterState.depthFunc = SamplerCompareFunc::A; + state.rasterState.culling = CullingMode::NONE; + + api.updateDescriptorSetTexture(descriptorSet[0], 0, texture13, { + .filterMag = SamplerMagFilter::NEAREST, + .filterMin = SamplerMinFilter::NEAREST_MIPMAP_NEAREST }); + + api.bindDescriptorSet(descriptorSet[0], 0, {}); + + // Render a triangle to the screen, sampling from mip level 1. + // Because the min level is 1, the result color should be the white triangle drawn in the + // previous pass. + api.beginRenderPass(defaultRenderTarget, params); + api.scissor(params.viewport); + api.draw(state, triangle.getRenderPrimitive(), 0, 3, 1); + api.endRenderPass(); + + // Adjust the base mip to 2. + auto texture22 = api.createTextureView(texture, 2, 2); + + api.updateDescriptorSetTexture(descriptorSet[1], 0, texture22, { + .filterMag = SamplerMagFilter::NEAREST, + .filterMin = SamplerMinFilter::NEAREST_MIPMAP_NEAREST }); + + api.bindDescriptorSet(descriptorSet[1], 0, {}); + + // Render a second, smaller, triangle, again sampling from mip level 1. + // This triangle should be yellow striped. + static filament::math::float2 vertices[3] = { + { -0.5, -0.5 }, + { 0.5, -0.5 }, + { -0.5, 0.5 } + }; + triangle.updateVertices(vertices); + params.flags.clear = TargetBufferFlags::NONE; + params.flags.discardStart = TargetBufferFlags::NONE; + api.beginRenderPass(defaultRenderTarget, params); + api.scissor(params.viewport); + api.draw(state, triangle.getRenderPrimitive(), 0, 3, 1); + api.endRenderPass(); + + api.commit(swapChain); + api.endFrame(0); + + api.stopCapture(0); + + // Cleanup. + api.destroySwapChain(swapChain); + api.destroyRenderTarget(renderTarget); + api.destroyDescriptorSet(descriptorSet[0]); + api.destroyDescriptorSet(descriptorSet[1]); + api.destroyDescriptorSetLayout(descriptorSetLayout); + api.destroyTexture(texture); + api.destroyTexture(texture13); + api.destroyTexture(texture22); + api.destroyProgram(whiteProgram); + api.destroyProgram(textureProgram); + } + + api.finish(); + + executeCommands(); + getDriver().purge(); +} + +} // namespace test diff --git a/filament/backend/test/test_MissingRequiredAttributes.cpp b/filament/backend/test/test_MissingRequiredAttributes.cpp index ed1399f2a48..453b1bbcb4b 100644 --- a/filament/backend/test/test_MissingRequiredAttributes.cpp +++ b/filament/backend/test/test_MissingRequiredAttributes.cpp @@ -100,11 +100,11 @@ TEST_F(BackendTest, MissingRequiredAttributes) { getDriverApi().startCapture(0); getDriverApi().makeCurrent(swapChain, swapChain); - getDriverApi().beginFrame(0, 0); + getDriverApi().beginFrame(0, 0, 0); // Render a triangle. getDriverApi().beginRenderPass(defaultRenderTarget, params); - getDriverApi().draw(state, triangle.getRenderPrimitive(), 1); + getDriverApi().draw(state, triangle.getRenderPrimitive(), 0, 3, 1); getDriverApi().endRenderPass(); getDriverApi().flush(); diff --git a/filament/backend/test/test_PushConstants.cpp b/filament/backend/test/test_PushConstants.cpp new file mode 100644 index 00000000000..80253fdf07e --- /dev/null +++ b/filament/backend/test/test_PushConstants.cpp @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "BackendTest.h" + +#include "ShaderGenerator.h" +#include "TrianglePrimitive.h" + +#include + +namespace test { + +using namespace filament; +using namespace filament::backend; + +static constexpr struct { + size_t TRIANGLE_HIDE = 0; + size_t TRIANGLE_SCALE = 1; + size_t TRIANGLE_OFFSET_X = 2; + size_t TRIANGLE_OFFSET_Y = 3; + + size_t RED = 0; + size_t GREEN = 2; + size_t BLUE = 3; +} pushConstantIndex; + +static const char* const triangleVs = R"(#version 450 core + +layout(push_constant) uniform Constants { + bool hideTriangle; + float triangleScale; + float triangleOffsetX; + float triangleOffsetY; +} pushConstants; + +layout(location = 0) in vec4 mesh_position; +void main() { + if (pushConstants.hideTriangle) { + // Test that bools are written correctly. All bits must be 0 if the bool is false. + gl_Position = vec4(0.0); + return; + } + gl_Position = vec4(mesh_position.xy * pushConstants.triangleScale + + vec2(pushConstants.triangleOffsetX, pushConstants.triangleOffsetY), 0.0, 1.0); +#if defined(TARGET_VULKAN_ENVIRONMENT) + // In Vulkan, clip space is Y-down. In OpenGL and Metal, clip space is Y-up. + gl_Position.y = -gl_Position.y; +#endif +})"; + +static const char* const triangleFs = R"(#version 450 core + +layout(push_constant) uniform Constants { + float red; + bool padding; // test correct bool padding + float green; + float blue; +} pushConstants; + +precision mediump int; precision highp float; +layout(location = 0) out vec4 fragColor; +void main() { + fragColor = vec4(pushConstants.red, pushConstants.green, pushConstants.blue, 1.0); +})"; + +TEST_F(BackendTest, PushConstants) { + auto& api = getDriverApi(); + + api.startCapture(0); + + // The test is executed within this block scope to force destructors to run before + // executeCommands(). + { + // Create a SwapChain and make it current. + auto swapChain = createSwapChain(); + api.makeCurrent(swapChain, swapChain); + + // Create a program. + ShaderGenerator shaderGen(triangleVs, triangleFs, sBackend, sIsMobilePlatform); + Program p = shaderGen.getProgram(api); + ProgramHandle program = api.createProgram(std::move(p)); + + Handle renderTarget = api.createDefaultRenderTarget(); + + TrianglePrimitive triangle(api); + + RenderPassParams params = {}; + params.flags.clear = TargetBufferFlags::COLOR0; + params.viewport = { 0, 0, 512, 512 }; + params.clearColor = math::float4(0.0f, 0.0f, 1.0f, 1.0f); + params.flags.discardStart = TargetBufferFlags::ALL; + params.flags.discardEnd = TargetBufferFlags::NONE; + + PipelineState ps = {}; + ps.program = program; + ps.rasterState.colorWrite = true; + ps.rasterState.depthWrite = false; + + api.makeCurrent(swapChain, swapChain); + api.beginFrame(0, 0, 0); + + api.beginRenderPass(renderTarget, params); + + // Set the push constants to scale the triangle in half + api.setPushConstant(ShaderStage::VERTEX, pushConstantIndex.TRIANGLE_HIDE, false); + api.setPushConstant(ShaderStage::VERTEX, pushConstantIndex.TRIANGLE_SCALE, 0.5f); + api.setPushConstant(ShaderStage::VERTEX, pushConstantIndex.TRIANGLE_OFFSET_X, 0.0f); + api.setPushConstant(ShaderStage::VERTEX, pushConstantIndex.TRIANGLE_OFFSET_Y, 0.0f); + api.setPushConstant(ShaderStage::FRAGMENT, pushConstantIndex.RED, 0.25f); + api.setPushConstant(ShaderStage::FRAGMENT, pushConstantIndex.GREEN, 0.5f); + api.setPushConstant(ShaderStage::FRAGMENT, pushConstantIndex.BLUE, 1.0f); + api.draw(ps, triangle.getRenderPrimitive(), 0, 3, 1); + + // Draw another triangle, transposed to the upper-right. + api.setPushConstant(ShaderStage::VERTEX, pushConstantIndex.TRIANGLE_OFFSET_X, 0.5f); + api.setPushConstant(ShaderStage::VERTEX, pushConstantIndex.TRIANGLE_OFFSET_Y, 0.5f); + + api.setPushConstant(ShaderStage::FRAGMENT, pushConstantIndex.RED, 1.00f); + api.setPushConstant(ShaderStage::FRAGMENT, pushConstantIndex.GREEN, 0.5f); + api.setPushConstant(ShaderStage::FRAGMENT, pushConstantIndex.BLUE, 0.25f); + + api.draw(ps, triangle.getRenderPrimitive(), 0, 3, 1); + + // Draw a final triangle, transposed to the lower-left. + api.setPushConstant(ShaderStage::VERTEX, pushConstantIndex.TRIANGLE_OFFSET_X, -0.5f); + api.setPushConstant(ShaderStage::VERTEX, pushConstantIndex.TRIANGLE_OFFSET_Y, -0.5f); + + api.setPushConstant(ShaderStage::FRAGMENT, pushConstantIndex.RED, 0.5f); + api.setPushConstant(ShaderStage::FRAGMENT, pushConstantIndex.GREEN, 0.25f); + api.setPushConstant(ShaderStage::FRAGMENT, pushConstantIndex.BLUE, 1.00f); + + api.draw(ps, triangle.getRenderPrimitive(), 0, 3, 1); + + api.endRenderPass(); + + readPixelsAndAssertHash("pushConstants", 512, 512, renderTarget, 1957275826, true); + + api.commit(swapChain); + api.endFrame(0); + + // Cleanup. + api.destroySwapChain(swapChain); + api.destroyRenderTarget(renderTarget); + } + + api.stopCapture(0); + + // Wait for the ReadPixels result to come back. + api.finish(); + + executeCommands(); + getDriver().purge(); +} + +} // namespace test diff --git a/filament/backend/test/test_ReadPixels.cpp b/filament/backend/test/test_ReadPixels.cpp index e824792602d..873c3443881 100644 --- a/filament/backend/test/test_ReadPixels.cpp +++ b/filament/backend/test/test_ReadPixels.cpp @@ -18,15 +18,17 @@ #include "ShaderGenerator.h" #include "TrianglePrimitive.h" +#include "BackendTestUtils.h" #include #include +#include using namespace filament; using namespace filament::backend; -#ifndef IOS +#ifndef FILAMENT_IOS #include #include @@ -106,7 +108,7 @@ TEST_F(ReadPixelsTest, ReadPixels) { // The size of the actual render target, taking mip level into account; size_t getRenderTargetSize () const { - return renderTargetBaseSize >> mipLevel; + return std::max(size_t(1), renderTargetBaseSize >> mipLevel); } // The rect that read pixels will read from. @@ -135,7 +137,7 @@ TEST_F(ReadPixelsTest, ReadPixels) { } void exportScreenshot(void* pixelData) const { - #ifndef IOS + #ifndef FILAMENT_IOS const size_t width = readRect.width, height = readRect.height; LinearImage image(width, height, 4); if (format == PixelDataFormat::RGBA && type == PixelDataType::UBYTE) { @@ -168,7 +170,7 @@ TEST_F(ReadPixelsTest, ReadPixels) { // The normative read pixels test case. Render a white triangle over a blue background and read // the full viewport into a pixel buffer. - TestCase t; + TestCase const t0; // Check that a subregion of the render target can be read into a pixel buffer. TestCase t2; @@ -232,7 +234,7 @@ TEST_F(ReadPixelsTest, ReadPixels) { t8.testName = "readPixels_swapchain"; t8.useDefaultRT = true; - TestCase testCases[] = { t, t2, t3, t4, t5, t6, t7, t8 }; + TestCase const testCases[] = { t0, t2, t3, t4, t5, t6, t7, t8 }; // Create programs. Handle programFloat, programUint; @@ -263,7 +265,7 @@ TEST_F(ReadPixelsTest, ReadPixels) { // Create a Texture and RenderTarget to render into. auto usage = TextureUsage::COLOR_ATTACHMENT | TextureUsage::SAMPLEABLE; - Handle texture = getDriverApi().createTexture(SamplerType::SAMPLER_2D, + Handle const texture = getDriverApi().createTexture(SamplerType::SAMPLER_2D, t.mipLevels, t.textureFormat, 1, renderTargetBaseSize, renderTargetBaseSize, 1, usage); @@ -277,11 +279,11 @@ TEST_F(ReadPixelsTest, ReadPixels) { // level (at least for OpenGL). renderTarget = getDriverApi().createRenderTarget( TargetBufferFlags::COLOR, t.getRenderTargetSize(), - t.getRenderTargetSize(), t.samples, {{ texture, uint8_t(t.mipLevel) }}, {}, + t.getRenderTargetSize(), t.samples, 0, {{ texture, uint8_t(t.mipLevel) }}, {}, {}); } - TrianglePrimitive triangle(getDriverApi()); + TrianglePrimitive const triangle(getDriverApi()); RenderPassParams params = {}; fullViewport(params); @@ -293,7 +295,7 @@ TEST_F(ReadPixelsTest, ReadPixels) { params.viewport.width = t.getRenderTargetSize(); getDriverApi().makeCurrent(swapChain, swapChain); - getDriverApi().beginFrame(0, 0); + getDriverApi().beginFrame(0, 0, 0); // Render a white triangle over blue. getDriverApi().beginRenderPass(renderTarget, params); @@ -307,7 +309,7 @@ TEST_F(ReadPixelsTest, ReadPixels) { state.rasterState.depthWrite = false; state.rasterState.depthFunc = RasterState::DepthFunc::A; state.rasterState.culling = CullingMode::NONE; - getDriverApi().draw(state, triangle.getRenderPrimitive(), 1); + getDriverApi().draw(state, triangle.getRenderPrimitive(), 0, 3, 1); getDriverApi().endRenderPass(); @@ -316,9 +318,8 @@ TEST_F(ReadPixelsTest, ReadPixels) { // correct mip. RenderPassParams p = params; Handle mipLevelOneRT = getDriverApi().createRenderTarget( - TargetBufferFlags::COLOR, renderTargetBaseSize, renderTargetBaseSize, 1, - {{ texture }}, {}, - {}); + TargetBufferFlags::COLOR, renderTargetBaseSize, renderTargetBaseSize, 1, 0, + {{ texture }}, {}, {}); p.clearColor = {1.f, 0.f, 0.f, 1.f}; getDriverApi().beginRenderPass(mipLevelOneRT, p); getDriverApi().endRenderPass(); @@ -355,7 +356,6 @@ TEST_F(ReadPixelsTest, ReadPixels) { getDriverApi().beginRenderPass(renderTarget, params); getDriverApi().endRenderPass(); - getDriverApi().flush(); getDriverApi().commit(swapChain); getDriverApi().endFrame(0); @@ -368,11 +368,7 @@ TEST_F(ReadPixelsTest, ReadPixels) { getDriverApi().destroyProgram(programUint); // This ensures all driver commands have finished before exiting the test. - getDriverApi().finish(); - - executeCommands(); - - getDriver().purge(); + flushAndWait(); } TEST_F(ReadPixelsTest, ReadPixelsPerformance) { @@ -405,6 +401,7 @@ TEST_F(ReadPixelsTest, ReadPixelsPerformance) { renderTargetSize, // width renderTargetSize, // height 1, // samples + 0, // layerCount {{ texture }}, // color {}, // depth {}); // stencil @@ -437,11 +434,11 @@ TEST_F(ReadPixelsTest, ReadPixelsPerformance) { } getDriverApi().makeCurrent(swapChain, swapChain); - getDriverApi().beginFrame(0, 0); + getDriverApi().beginFrame(0, 0, 0); // Render some content, just so we don't read back uninitialized data. getDriverApi().beginRenderPass(renderTarget, params); - getDriverApi().draw(state, triangle.getRenderPrimitive(), 1); + getDriverApi().draw(state, triangle.getRenderPrimitive(), 0, 3, 1); getDriverApi().endRenderPass(); PixelBufferDescriptor descriptor(buffer, renderTargetSize * renderTargetSize * 4, diff --git a/filament/backend/test/test_RenderExternalImage.cpp b/filament/backend/test/test_RenderExternalImage.cpp index 8101dd1467c..643545a2bec 100644 --- a/filament/backend/test/test_RenderExternalImage.cpp +++ b/filament/backend/test/test_RenderExternalImage.cpp @@ -19,10 +19,14 @@ #include "ShaderGenerator.h" #include "TrianglePrimitive.h" -#include "private/backend/SamplerGroup.h" +#include +#include #include +#include +#include + namespace { //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -45,10 +49,10 @@ std::string fragment (R"(#version 450 core layout(location = 0) out vec4 fragColor; layout(location = 0) in vec2 uv; -layout(location = 0, set = 1) uniform sampler2D tex; +layout(location = 0, set = 1) uniform sampler2D test_tex; void main() { - fragColor = texture(tex, uv); + fragColor = texture(test_tex, uv); } )"); @@ -61,29 +65,39 @@ using namespace filament::backend; // Rendering an external image without setting any data should not crash. TEST_F(BackendTest, RenderExternalImageWithoutSet) { - TrianglePrimitive triangle(getDriverApi()); + auto& api = getDriverApi(); + + TrianglePrimitive triangle(api); auto swapChain = createSwapChain(); - SamplerInterfaceBlock sib = filament::SamplerInterfaceBlock::Builder() - .name("backend_test_sib") - .stageFlags(backend::ShaderStageFlags::ALL_SHADER_STAGE_FLAGS) - .add( {{"tex", SamplerType::SAMPLER_EXTERNAL, SamplerFormat::FLOAT, Precision::HIGH }} ) - .build(); - ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform, &sib); + filament::SamplerInterfaceBlock::SamplerInfo samplerInfo { "test", "tex", 0, + SamplerType::SAMPLER_EXTERNAL, SamplerFormat::FLOAT, Precision::HIGH, false }; + filamat::DescriptorSets descriptors; + descriptors[1] = { { "test_tex", { DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, 0 }, + samplerInfo } }; + ShaderGenerator shaderGen( + vertex, fragment, sBackend, sIsMobilePlatform, std::move(descriptors)); // Create a program that samples a texture. - Program p = shaderGen.getProgram(getDriverApi()); - Program::Sampler sampler { utils::CString("tex"), 0 }; - p.setSamplerGroup(0, ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, &sampler, 1); - backend::Handle program = getDriverApi().createProgram(std::move(p)); + Program p = shaderGen.getProgram(api); + p.descriptorBindings(1, {{"test_tex", DescriptorType::SAMPLER, 0}}); + backend::Handle program = api.createProgram(std::move(p)); + DescriptorSetLayoutHandle descriptorSetLayout = api.createDescriptorSetLayout({ + {{ + DescriptorType::SAMPLER, + ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, 0, + DescriptorFlags::NONE, 0 + }}}); + + DescriptorSetHandle descriptorSet = api.createDescriptorSet(descriptorSetLayout); - backend::Handle defaultRenderTarget = getDriverApi().createDefaultRenderTarget(0); + backend::Handle defaultRenderTarget = api.createDefaultRenderTarget(0); // Create a texture that will be backed by an external image. auto usage = TextureUsage::COLOR_ATTACHMENT | TextureUsage::SAMPLEABLE; const NativeView& view = getNativeView(); - backend::Handle texture = getDriverApi().createTexture( + backend::Handle texture = api.createTexture( SamplerType::SAMPLER_EXTERNAL, // target 1, // levels TextureFormat::RGBA8, // format @@ -102,62 +116,74 @@ TEST_F(BackendTest, RenderExternalImageWithoutSet) { PipelineState state; state.program = program; + state.pipelineLayout.setLayout[1] = { descriptorSetLayout }; state.rasterState.colorWrite = true; state.rasterState.depthWrite = false; state.rasterState.depthFunc = RasterState::DepthFunc::A; state.rasterState.culling = CullingMode::NONE; - getDriverApi().startCapture(0); - getDriverApi().makeCurrent(swapChain, swapChain); - getDriverApi().beginFrame(0, 0); + api.startCapture(0); + api.makeCurrent(swapChain, swapChain); + api.beginFrame(0, 0, 0); - SamplerGroup samplers(1); - samplers.setSampler(0, { texture, {} }); - backend::Handle samplerGroup = getDriverApi().createSamplerGroup(1); - getDriverApi().updateSamplerGroup(samplerGroup, samplers.toBufferDescriptor(getDriverApi())); - getDriverApi().bindSamplers(0, samplerGroup); + api.updateDescriptorSetTexture(descriptorSet, 0, texture, {}); + api.bindDescriptorSet(descriptorSet, 1, {}); // Render a triangle. - getDriverApi().beginRenderPass(defaultRenderTarget, params); - getDriverApi().draw(state, triangle.getRenderPrimitive(), 1); - getDriverApi().endRenderPass(); + api.beginRenderPass(defaultRenderTarget, params); + api.draw(state, triangle.getRenderPrimitive(), 0, 3, 1); + api.endRenderPass(); - getDriverApi().flush(); - getDriverApi().commit(swapChain); - getDriverApi().endFrame(0); + api.flush(); + api.commit(swapChain); + api.endFrame(0); - getDriverApi().stopCapture(0); + api.stopCapture(0); // Delete our resources. - getDriverApi().destroyTexture(texture); - getDriverApi().destroySamplerGroup(samplerGroup); + api.destroyDescriptorSet(descriptorSet); + api.destroyDescriptorSetLayout(descriptorSetLayout); + api.destroyTexture(texture); // Destroy frame resources. - getDriverApi().destroyProgram(program); - getDriverApi().destroyRenderTarget(defaultRenderTarget); + api.destroyProgram(program); + api.destroyRenderTarget(defaultRenderTarget); + + api.finish(); executeCommands(); } TEST_F(BackendTest, RenderExternalImage) { - TrianglePrimitive triangle(getDriverApi()); + auto& api = getDriverApi(); + + TrianglePrimitive triangle(api); auto swapChain = createSwapChain(); - SamplerInterfaceBlock sib = filament::SamplerInterfaceBlock::Builder() - .name("backend_test_sib") - .stageFlags(backend::ShaderStageFlags::ALL_SHADER_STAGE_FLAGS) - .add( {{"tex", SamplerType::SAMPLER_EXTERNAL, SamplerFormat::FLOAT, Precision::HIGH }} ) - .build(); - ShaderGenerator shaderGen(vertex, fragment, sBackend, sIsMobilePlatform, &sib); + filament::SamplerInterfaceBlock::SamplerInfo samplerInfo { "test", "tex", 0, + SamplerType::SAMPLER_EXTERNAL, SamplerFormat::FLOAT, Precision::HIGH, false }; + filamat::DescriptorSets descriptors; + descriptors[1] = { { "test_tex", { DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, 0 }, + samplerInfo } }; + ShaderGenerator shaderGen( + vertex, fragment, sBackend, sIsMobilePlatform, std::move(descriptors)); // Create a program that samples a texture. - Program p = shaderGen.getProgram(getDriverApi()); - Program::Sampler sampler { utils::CString("tex"), 0 }; - p.setSamplerGroup(0, ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, &sampler, 1); - auto program = getDriverApi().createProgram(std::move(p)); + Program p = shaderGen.getProgram(api); + p.descriptorBindings(1, {{"test_tex", DescriptorType::SAMPLER, 0}}); + auto program = api.createProgram(std::move(p)); - backend::Handle defaultRenderTarget = getDriverApi().createDefaultRenderTarget(0); + DescriptorSetLayoutHandle descriptorSetLayout = api.createDescriptorSetLayout({ + {{ + DescriptorType::SAMPLER, + ShaderStageFlags::ALL_SHADER_STAGE_FLAGS, 0, + DescriptorFlags::NONE, 0 + }}}); + + DescriptorSetHandle descriptorSet = api.createDescriptorSet(descriptorSetLayout); + + backend::Handle defaultRenderTarget = api.createDefaultRenderTarget(0); // require users to create two Filament textures and have two material parameters // add a "plane" parameter to setExternalImage @@ -165,15 +191,6 @@ TEST_F(BackendTest, RenderExternalImage) { // Create a texture that will be backed by an external image. auto usage = TextureUsage::COLOR_ATTACHMENT | TextureUsage::SAMPLEABLE; const NativeView& view = getNativeView(); - backend::Handle texture = getDriverApi().createTexture( - SamplerType::SAMPLER_EXTERNAL, // target - 1, // levels - TextureFormat::RGBA8, // format - 1, // samples - view.width, // width - view.height, // height - 1, // depth - usage); // usage // Create an external image. CFStringRef keys[4]; @@ -208,8 +225,10 @@ TEST_F(BackendTest, RenderExternalImage) { } } - getDriverApi().setupExternalImage(pixBuffer); - getDriverApi().setExternalImage(texture, pixBuffer); + api.setupExternalImage(pixBuffer); + backend::Handle texture = + api.createTextureExternalImage(SamplerType::SAMPLER_EXTERNAL, + TextureFormat::RGBA8, 1024, 1024, usage, pixBuffer); // We're now free to release the buffer. CVBufferRelease(pixBuffer); @@ -223,39 +242,43 @@ TEST_F(BackendTest, RenderExternalImage) { PipelineState state; state.program = program; + state.pipelineLayout.setLayout[1] = { descriptorSetLayout }; state.rasterState.colorWrite = true; state.rasterState.depthWrite = false; state.rasterState.depthFunc = RasterState::DepthFunc::A; state.rasterState.culling = CullingMode::NONE; - getDriverApi().startCapture(0); - getDriverApi().makeCurrent(swapChain, swapChain); - getDriverApi().beginFrame(0, 0); + api.startCapture(0); + api.makeCurrent(swapChain, swapChain); + api.beginFrame(0, 0, 0); + + api.updateDescriptorSetTexture(descriptorSet, 0, texture, {}); - SamplerGroup samplers(1); - samplers.setSampler(0, { texture, {} }); - backend::Handle samplerGroup = getDriverApi().createSamplerGroup(1); - getDriverApi().updateSamplerGroup(samplerGroup, samplers.toBufferDescriptor(getDriverApi())); - getDriverApi().bindSamplers(0, samplerGroup); + api.bindDescriptorSet(descriptorSet, 1, {}); // Render a triangle. - getDriverApi().beginRenderPass(defaultRenderTarget, params); - getDriverApi().draw(state, triangle.getRenderPrimitive(), 1); - getDriverApi().endRenderPass(); + api.beginRenderPass(defaultRenderTarget, params); + api.draw(state, triangle.getRenderPrimitive(), 0, 3, 1); + api.endRenderPass(); - getDriverApi().flush(); - getDriverApi().commit(swapChain); - getDriverApi().endFrame(0); + readPixelsAndAssertHash("RenderExternalImage", 512, 512, defaultRenderTarget, 267229901, true); - getDriverApi().stopCapture(0); + api.flush(); + api.commit(swapChain); + api.endFrame(0); + + api.stopCapture(0); // Delete our resources. - getDriverApi().destroyTexture(texture); - getDriverApi().destroySamplerGroup(samplerGroup); + api.destroyDescriptorSet(descriptorSet); + api.destroyDescriptorSetLayout(descriptorSetLayout); + api.destroyTexture(texture); // Destroy frame resources. - getDriverApi().destroyProgram(program); - getDriverApi().destroyRenderTarget(defaultRenderTarget); + api.destroyProgram(program); + api.destroyRenderTarget(defaultRenderTarget); + + api.finish(); executeCommands(); } diff --git a/filament/backend/test/test_Scissor.cpp b/filament/backend/test/test_Scissor.cpp index a7fea104bdd..42f2fe750b0 100644 --- a/filament/backend/test/test_Scissor.cpp +++ b/filament/backend/test/test_Scissor.cpp @@ -113,11 +113,11 @@ TEST_F(BackendTest, ScissorViewportRegion) { // We purposely set the render target width and height to smaller than the texture, to check // that this case is handled correctly. Handle srcRenderTarget = api.createRenderTarget( - TargetBufferFlags::COLOR | TargetBufferFlags::DEPTH, kSrcRtHeight, kSrcRtHeight, 1, + TargetBufferFlags::COLOR | TargetBufferFlags::DEPTH, kSrcRtHeight, kSrcRtHeight, 1, 0, {srcTexture, kSrcLevel, 0}, {depthTexture, 0, 0}, {}); Handle fullRenderTarget = api.createRenderTarget(TargetBufferFlags::COLOR, - kSrcTexHeight >> kSrcLevel, kSrcTexWidth >> kSrcLevel, 1, + kSrcTexHeight >> kSrcLevel, kSrcTexWidth >> kSrcLevel, 1, 0, {srcTexture, kSrcLevel, 0}, {}, {}); TrianglePrimitive triangle(api); @@ -134,13 +134,13 @@ TEST_F(BackendTest, ScissorViewportRegion) { ps.program = program; ps.rasterState.colorWrite = true; ps.rasterState.depthWrite = false; - ps.scissor = scissor; api.makeCurrent(swapChain, swapChain); - api.beginFrame(0, 0); + api.beginFrame(0, 0, 0); api.beginRenderPass(srcRenderTarget, params); - api.draw(ps, triangle.getRenderPrimitive(), 1); + api.scissor(scissor); + api.draw(ps, triangle.getRenderPrimitive(), 0, 3, 1); api.endRenderPass(); readPixelsAndAssertHash("scissor", kSrcTexWidth >> 1, kSrcTexHeight >> 1, fullRenderTarget, @@ -208,7 +208,7 @@ TEST_F(BackendTest, ScissorViewportEdgeCases) { (uint32_t)std::numeric_limits::max()}; Handle renderTarget = api.createRenderTarget( - TargetBufferFlags::COLOR, 512, 512, 1, + TargetBufferFlags::COLOR, 512, 512, 1, 0, {srcTexture, 0, 0}, {}, {}); TrianglePrimitive triangle(api); @@ -225,20 +225,21 @@ TEST_F(BackendTest, ScissorViewportEdgeCases) { ps.program = program; ps.rasterState.colorWrite = true; ps.rasterState.depthWrite = false; - ps.scissor = scissor; api.makeCurrent(swapChain, swapChain); - api.beginFrame(0, 0); + api.beginFrame(0, 0, 0); api.beginRenderPass(renderTarget, params); - api.draw(ps, triangle.getRenderPrimitive(), 1); + api.scissor(scissor); + api.draw(ps, triangle.getRenderPrimitive(), 0, 3, 1); api.endRenderPass(); params.viewport = topLeftViewport; params.flags.clear = TargetBufferFlags::NONE; params.flags.discardStart = TargetBufferFlags::NONE; api.beginRenderPass(renderTarget, params); - api.draw(ps, triangle.getRenderPrimitive(), 1); + api.scissor(scissor); + api.draw(ps, triangle.getRenderPrimitive(), 0, 3, 1); api.endRenderPass(); readPixelsAndAssertHash( diff --git a/filament/backend/test/test_StencilBuffer.cpp b/filament/backend/test/test_StencilBuffer.cpp index caa23862563..4e9d2183294 100644 --- a/filament/backend/test/test_StencilBuffer.cpp +++ b/filament/backend/test/test_StencilBuffer.cpp @@ -110,10 +110,10 @@ class BasicStencilBufferTest : public BackendTest { ps.stencilState.front.stencilOpDepthStencilPass = StencilOperation::INCR; api.makeCurrent(swapChain, swapChain); - api.beginFrame(0, 0); + api.beginFrame(0, 0, 0); api.beginRenderPass(renderTarget, params); - api.draw(ps, smallTriangle.getRenderPrimitive(), 1); + api.draw(ps, smallTriangle.getRenderPrimitive(), 0, 3, 1); api.endRenderPass(); // Step 2: Render a larger triangle with the stencil test enabled. @@ -126,7 +126,7 @@ class BasicStencilBufferTest : public BackendTest { ps.stencilState.front.ref = 0u; api.beginRenderPass(renderTarget, params); - api.draw(ps, triangle.getRenderPrimitive(), 1); + api.draw(ps, triangle.getRenderPrimitive(), 0, 3, 1); api.endRenderPass(); api.commit(swapChain); @@ -150,7 +150,7 @@ TEST_F(BasicStencilBufferTest, StencilBuffer) { auto stencilTexture = api.createTexture(SamplerType::SAMPLER_2D, 1, TextureFormat::STENCIL8, 1, 512, 512, 1, TextureUsage::STENCIL_ATTACHMENT); auto renderTarget = getDriverApi().createRenderTarget( - TargetBufferFlags::COLOR0 | TargetBufferFlags::STENCIL, 512, 512, 1, + TargetBufferFlags::COLOR0 | TargetBufferFlags::STENCIL, 512, 512, 1, 0, {{colorTexture}}, {}, {{stencilTexture}}); RunTest(renderTarget); @@ -174,7 +174,7 @@ TEST_F(BasicStencilBufferTest, DepthAndStencilBuffer) { auto depthStencilTexture = api.createTexture(SamplerType::SAMPLER_2D, 1, TextureFormat::DEPTH24_STENCIL8, 1, 512, 512, 1, TextureUsage::STENCIL_ATTACHMENT | TextureUsage::DEPTH_ATTACHMENT); auto renderTarget = getDriverApi().createRenderTarget( - TargetBufferFlags::COLOR0 | TargetBufferFlags::STENCIL, 512, 512, 1, + TargetBufferFlags::COLOR0 | TargetBufferFlags::STENCIL, 512, 512, 1, 0, {{colorTexture}}, {depthStencilTexture}, {{depthStencilTexture}}); RunTest(renderTarget); @@ -202,10 +202,10 @@ TEST_F(BasicStencilBufferTest, StencilBufferMSAA) { auto depthStencilTextureMSAA = api.createTexture(SamplerType::SAMPLER_2D, 1, TextureFormat::DEPTH24_STENCIL8, 4, 512, 512, 1, TextureUsage::STENCIL_ATTACHMENT | TextureUsage::DEPTH_ATTACHMENT); auto renderTarget0 = getDriverApi().createRenderTarget( - TargetBufferFlags::DEPTH_AND_STENCIL, 512, 512, 4, + TargetBufferFlags::DEPTH_AND_STENCIL, 512, 512, 4, 0, {{}}, {depthStencilTextureMSAA}, {depthStencilTextureMSAA}); auto renderTarget1 = getDriverApi().createRenderTarget( - TargetBufferFlags::COLOR0 | TargetBufferFlags::DEPTH_AND_STENCIL, 512, 512, 4, + TargetBufferFlags::COLOR0 | TargetBufferFlags::DEPTH_AND_STENCIL, 512, 512, 4, 0, {{colorTexture}}, {depthStencilTextureMSAA}, {depthStencilTextureMSAA}); api.startCapture(0); @@ -237,10 +237,10 @@ TEST_F(BasicStencilBufferTest, StencilBufferMSAA) { ps.stencilState.front.stencilOpDepthStencilPass = StencilOperation::INCR; api.makeCurrent(swapChain, swapChain); - api.beginFrame(0, 0); + api.beginFrame(0, 0, 0); api.beginRenderPass(renderTarget0, params); - api.draw(ps, smallTriangle.getRenderPrimitive(), 1); + api.draw(ps, smallTriangle.getRenderPrimitive(), 0, 3, 1); api.endRenderPass(); // Step 2: Render a larger triangle with the stencil test enabled. @@ -255,14 +255,14 @@ TEST_F(BasicStencilBufferTest, StencilBufferMSAA) { ps.stencilState.front.ref = 0u; api.beginRenderPass(renderTarget1, params); - api.draw(ps, triangle.getRenderPrimitive(), 1); + api.draw(ps, triangle.getRenderPrimitive(), 0, 3, 1); api.endRenderPass(); api.commit(swapChain); api.stopCapture(0); api.endFrame(0); - readPixelsAndAssertHash("StencilBufferAutoResolve", 512, 512, renderTarget1, 0xC7E34C43, true); + readPixelsAndAssertHash("StencilBufferAutoResolve", 512, 512, renderTarget1, 0x6CEFAC8F, true); flushAndWait(); getDriver().purge(); @@ -273,4 +273,4 @@ TEST_F(BasicStencilBufferTest, StencilBufferMSAA) { api.destroyRenderTarget(renderTarget1); } -} // namespace test \ No newline at end of file +} // namespace test diff --git a/filament/benchmark/CMakeLists.txt b/filament/benchmark/CMakeLists.txt index a14f15b76da..9c236121d68 100644 --- a/filament/benchmark/CMakeLists.txt +++ b/filament/benchmark/CMakeLists.txt @@ -10,6 +10,6 @@ set(BENCHMARK_SRCS add_executable(benchmark_filament ${BENCHMARK_SRCS}) -target_link_libraries(benchmark_filament PRIVATE benchmark_main utils math filament) +target_link_libraries(benchmark_filament PRIVATE benchmark_main filament) set_target_properties(benchmark_filament PROPERTIES FOLDER Benchmarks) diff --git a/filament/benchmark/README.md b/filament/benchmark/README.md index 7caab6eb030..01b62599558 100644 --- a/filament/benchmark/README.md +++ b/filament/benchmark/README.md @@ -6,18 +6,36 @@ ## Running the benchmark -`adb shell /data/local/tmp/benchmark_filament` +`adb shell /data/local/tmp/benchmark_filament --benchmark_counters_tabular=true` ## Benchmark results +### Macbook Pro M1 Pro +``` +-------------------------------------------------------------------------------------- +Benchmark Time CPU Iterations items_per_second +-------------------------------------------------------------------------------------- +FilamentCullingFixture/boxCulling 702 ns 702 ns 819874 729.274M/s +FilamentCullingFixture/sphereCulling 485 ns 485 ns 1430396 1054.82M/s +``` + +### Pixel 8 Pro +``` +---------------------------------------------------------------------------------------------------------------------------------- +Benchmark Time CPU Iterations BPU C CPI I items_per_second +---------------------------------------------------------------------------------------------------------------------------------- +FilamentCullingFixture/boxCulling 1212 ns 1208 ns 578797 0 6.87234 0.328354 20.9297 423.884M/s +FilamentCullingFixture/sphereCulling 748 ns 745 ns 938377 0 4.24185 0.39125 10.8418 686.839M/s +``` + ### Galaxy S20+ ``` ---------------------------------------------------------------------------------------------------------------------------------- Benchmark Time CPU Iterations BPU C CPI I items_per_second ---------------------------------------------------------------------------------------------------------------------------------- -FilamentFixture/boxCulling 1695 ns 1688 ns 414849 0 9.35888 0.422963 22.127 303.397M/s -FilamentFixture/sphereCulling 1160 ns 1147 ns 610602 0 6.35746 0.526617 12.0723 446.543M/s +FilamentCullingFixture/boxCulling 1695 ns 1688 ns 414849 0 9.35888 0.422963 22.127 303.397M/s +FilamentCullingFixture/sphereCulling 1160 ns 1147 ns 610602 0 6.35746 0.526617 12.0723 446.543M/s ``` ### Pixel 4 @@ -25,6 +43,7 @@ FilamentFixture/sphereCulling 1160 ns 1147 ns 610602 0 ---------------------------------------------------------------------------------------------------------------------------------- Benchmark Time CPU Iterations BPU C CPI I items_per_second ---------------------------------------------------------------------------------------------------------------------------------- -FilamentFixture/boxCulling 2114 ns 2106 ns 332395 0 9.93665 0.449074 22.127 243.169M/s -FilamentFixture/sphereCulling 1407 ns 1402 ns 497755 0 6.61423 0.547886 12.0723 365.3M/s +FilamentCullingFixture/boxCulling 2114 ns 2106 ns 332395 0 9.93665 0.449074 22.127 243.169M/s +FilamentCullingFixture/sphereCulling 1407 ns 1402 ns 497755 0 6.61423 0.547886 12.0723 365.3M/s ``` + diff --git a/filament/benchmark/benchmark_filament.cpp b/filament/benchmark/benchmark_filament.cpp index 3a2e6031a10..d323beed00e 100644 --- a/filament/benchmark/benchmark_filament.cpp +++ b/filament/benchmark/benchmark_filament.cpp @@ -33,7 +33,7 @@ using namespace filament::math; using namespace utils; -class FilamentFixture : public benchmark::Fixture { +class FilamentCullingFixture : public benchmark::Fixture { protected: static constexpr size_t BATCH_SIZE = 512; @@ -45,7 +45,7 @@ class FilamentFixture : public benchmark::Fixture { public: - FilamentFixture() { + FilamentCullingFixture() { std::default_random_engine gen; // NOLINT std::uniform_real_distribution rand(-100.0f, 100.0f); @@ -75,12 +75,12 @@ class FilamentFixture : public benchmark::Fixture { visibles = (Culler::result_type*)utils::aligned_alloc(batch * sizeof(*visibles), 32); } - ~FilamentFixture() override { + ~FilamentCullingFixture() override { utils::aligned_free(visibles); } }; -BENCHMARK_F(FilamentFixture, boxCulling)(benchmark::State& state) { +BENCHMARK_F(FilamentCullingFixture, boxCulling)(benchmark::State& state) { { PerformanceCounters pc(state); for (auto _ : state) { @@ -92,7 +92,7 @@ BENCHMARK_F(FilamentFixture, boxCulling)(benchmark::State& state) { } } -BENCHMARK_F(FilamentFixture, sphereCulling)(benchmark::State& state) { +BENCHMARK_F(FilamentCullingFixture, sphereCulling)(benchmark::State& state) { { PerformanceCounters pc(state); for (auto _ : state) { diff --git a/filament/docs/Debugging.md b/filament/docs/Debugging.md deleted file mode 100644 index a29f175874f..00000000000 --- a/filament/docs/Debugging.md +++ /dev/null @@ -1,79 +0,0 @@ -# Filament Debugging - -## Debugging Vulkan on Linux - -### Enable Validation Logs - -Simply install the LunarG SDK (it's fast and easy), then make sure you've got the following -environment variables set up in your **bashrc** file. For example: - -``` -export VULKAN_SDK='/path_to_home/VulkanSDK/1.3.216.0/x86_64' -export VK_LAYER_PATH="$VULKAN_SDK/etc/explicit_layer.d" -export PATH="$VULKAN_SDK/bin:$PATH" -``` - -As long as you're running a debug build of Filament, you should now see extra debugging spew in your -console if there are any errors or performance issues being caught by validation. - -### Frame Capture in RenderDoc - -The following instructions assume you've already installed the LunarG SDK and therefore have the -`VK_LAYER_PATH` environment variable. - -1. Modify `VulkanDriver.cpp` by defining `ENABLE_RENDERDOC` -1. Download the RenderDoc tarball for Linux and unzip it somewhere. -1. Find `renderdoc_capture.json` in the unzipped folders and copy it to `VK_LAYER_PATH`. For -example: -``` -cp ~/Downloads/renderdoc_1.0/etc/vulkan/implicit_layer.d/renderdoc_capture.json ${VK_LAYER_PATH} -``` -1. Edit `${VK_LAYER_PATH}/renderdoc_capture.json` and update the `library_path` attribute. -1. Launch RenderDoc by running `renderdoc_1.0/bin/qrenderdoc`. -1. Go to the **Launch Application** tab and click the ellipses next to **Environment Variables**. -1. Add VK_LAYER_PATH so that it matches whatever you've got set in your **bashrc**. -1. Save yourself some time in the future by clicking **Save Settings** after setting up the working -directory, executable path, etc. -1. Click **Launch** in RenderDoc, then press **F12** in your app. You should see a new capture show up in -RenderDoc. - -## Enable Metal Validation - -To enable the Metal validation layers when running a sample through the command-line, set the -following environment variable: - -``` -export METAL_DEVICE_WRAPPER_TYPE=1 -``` - -You should then see the following output when running a sample with the Metal backend: - -``` -2020-10-13 18:01:44.101 gltf_viewer[73303:4946828] Metal API Validation Enabled -``` - -## Metal Frame Capture from gltf_viewer - -To capture Metal frames from within gltf_viewer: - -### 1. Create an Info.plist file - -Create an `Info.plist` file in the same directory as `gltf_viewer` (`cmake/samples`). Set its -contents to: - -``` - - - - - MetalCaptureEnabled - - - -``` - -### 2. Capture a frame - -Run gltf_viewer as normal, and hit the "Capture frame" button under the Debug menu. The captured -frame will be saved to `filament.gputrace` in the current working directory. This file can then be -opened with Xcode for inspection. diff --git a/filament/docs/SpirvDebugging.md b/filament/docs/SpirvDebugging.md deleted file mode 100644 index 42aad3aa9b6..00000000000 --- a/filament/docs/SpirvDebugging.md +++ /dev/null @@ -1,198 +0,0 @@ -# Investigating SPIRV-Cross / SPIRV-Tools issues - -There are 4 repositories at play here: -- [KhronosGroup/glslang](https://github.com/KhronosGroup/glslang) -- [KhronosGroup/spirv-tools](https://github.com/KhronosGroup/SPIRV-Tools) -- [KhronosGroup/spirv-cross](https://github.com/KhronosGroup/SPIRV-Cross) -- [KhronosGroup/SPIRV-Headers](https://github.com/KhronosGroup/SPIRV-Headers) - -Typically, the bug is present either in spirv-tools or spirv-cross. - -## Build and install command-line tools on PATH - -The goal is to replicate the bug outside of Filament, so we're going to use command-line versions of -the SPIRV tools. - -### Clone and build each repo - -Note: Filament checks-out versions of these repositories inside `third_party/`; however, I've found -it easiser to check out fresh copies separately so I can simply `git pull` to get the latest -versions. Furthermore, Filament has modified some of these repositories locally for its own use -case. Checking them out separately "proves" that the issue isn't Filament-specific. - -``` -git clone git@github.com:KhronosGroup/SPIRV-Tools.git -git clone git@github.com:KhronosGroup/SPIRV-Cross.git -git clone git@github.com:KhronosGroup/glslang.git -git clone git@github.com:KhronosGroup/SPIRV-Headers.git SPIRV-Tools/external/SPIRV-Headers - -cd SPIRV-Tools/ -mkdir build && cmake . -G Ninja -B build -ninja -C build -cd .. - -cd SPIRV-Cross/ -mkdir build && cmake . -G Ninja -B build -ninja -C build -cd .. - -cd glslang/ -mkdir build && cmake . -G Ninja -B build -ninja -C build -cd .. -``` - -### Add directories to PATH - -``` -export PATH=`pwd`/SPIRV-Tools/build/tools:$PATH -export PATH=`pwd`/glslang/build/StandAlone:$PATH -export PATH=`pwd`/spirv-cross/build:$PATH -``` - -Ensure the following tools now exist on your PATH: - -1. `glslangValidator` -2. `spiv-opt` -3. `spirv-val` -4. `spirv-cross` - -## Isolate the problematic GLSL shader - -First determine the Filament material and variant that causes the problem. - -What we want is the "raw" GLSL version of the shader, before any optimizations / cross-compilation -happens. - -The easiest way I've found to do this is by adding a `std::cout` statement inside `MaterialBuilder`, -right after `sg.createFragmentProgram` or `sg.createVertexProgram` is called. For example, - -``` -if (v.variant.key == 8u) { std::cout << shader << std::endl; } -``` - -Then, I invoke `matc` and redirect stdout to a .frag or .vert file. - -Note that gltfio material "templates" first go through a build step. After building gltfio, the -gltfio Filament materials are output to: - -``` -out/cmake-release/libs/gltfio/*.mat -``` - -One of these materials can be compiled with the following command: - -``` -matc \ - -TCUSTOM_PARAMS="// no custom params" \ - -TCUSTOM_VERTEX="// no custom vertex" \ - -TCUSTOM_FRAGMENT="// no custom fragment" \ - -TDOUBLESIDED=false \ - -TTRANSPARENCY=default \ - -TSHADINGMODEL=unlit \ - -TBLENDING=opaque \ - --platform mobile --api metal -o temp.filamat \ - unlit_opaque.mat -``` - -## Reproduce the compilation error - -The goal is to generate a .spv file that doesn't pass validation (through the spirv-val tool). - -Reproducing the error usually involves a few steps: - -1. Compile the raw GLSL shader into SPIR-V. - -``` -glslangValidator -V -o unoptimized.spv in.frag -``` - -2. Optimize for performance. - -``` -spirv-opt -Oconfig=optimizations.cfg unoptimized.spv -o optimized.spv -``` - -See [optimizations.cfg](optimizations.cfg) for a template. This file should contain the same list of optimizations that -Filament employs. This should match the same optimizations specified in `GLSLPostProcessor`, for -example, `GLSLPostProcessor::registerPerformancePasses` or `GLSLPostProcessor::registerSizePasses`. - -3. For shaders targeting Metal, convert relaxed ops to half. - -``` -spirv-opt \ - --convert-relaxed-to-half \ - --simplify-instructions \ - --redundancy-elimination \ - --eliminate-dead-code-aggressive \ - optimized.spv \ - -o half.spv -``` - -4. Finally, validate the final SPIR-V. - -``` -spirv-val half.spv -``` - -5. Sometimes validation will still pass, but still generate invalid shaders after cross-compiling. - In these cases, you'll need to cross compile to the target language and manually pick out errors - in the generated shader. - -``` -# for OpenGL -spirv-cross optimized.spv > optimized.frag - -# for OpenGL ES -spirv-cross --es optimized.spv > optimized.frag - -# for MSL -spirv-cross --msl optimized.spv > optimized.metal -``` - -To invoke Apple's compiler to compile MSL, you can run: - -``` -xcrun -sdk macosx metal -c optimized.metal -o /dev/null -``` - -## Clean up the shader for a bug report - -These commands will run the preprocessor only on `in.frag`, and remove any empty lines. - -``` -glslangValidator -E in.frag > preprocessed.frag -sed '/^$/d' preprocessed.frag > preprocessed_small.frag -``` - -You can also run `clang-format` on the preprocessed shader to make it easier to read: - -``` -clang-format -i preprocessed_small.frag -``` - -I always try to "whittle down" the shader to a smaller version that still reproduces the error. This -might make it a bit easier on the Khronos team to diagnose the issue. I typically follow these steps -in a loop until I'm satisfied: - -1. Delete an unnecessary part of the shader -2. Run the steps to reproduce the error -3. If the error still reproduces, repeat -4. Otherwise, undo the change and make a smaller change - -There's also a [Reducer](https://github.com/KhronosGroup/SPIRV-Tools#reducer) tool that's part of -SPIRV-Tools which can be used to automate these steps. I haven't experimented much with this, but it -seems promising. - -## Submit an Issue with the relevant Khronos repository - -See some example issues that have been filed in the past: - -- https://github.com/KhronosGroup/SPIRV-Cross/issues/1935 -- https://github.com/KhronosGroup/SPIRV-Cross/issues/1088 -- https://github.com/KhronosGroup/SPIRV-Cross/issues/1026 -- https://github.com/KhronosGroup/SPIRV-Tools/issues/4452 -- https://github.com/KhronosGroup/SPIRV-Tools/issues/3406 -- https://github.com/KhronosGroup/SPIRV-Tools/issues/3099 -- https://github.com/KhronosGroup/SPIRV-Tools/issues/5044 - diff --git a/filament/docs/Vulkan.md.html b/filament/docs/Vulkan.md.html deleted file mode 100644 index 80db49db33e..00000000000 --- a/filament/docs/Vulkan.md.html +++ /dev/null @@ -1,279 +0,0 @@ - - - - -**Vulkan Backend** - *Last updated: 26 October 2022* - -![](../../docs/images/filament_logo.png) - ------ - -This document is a high-level "state of the union" for Filament's Vulkan backend. Some of the -details may be out of date by the time you read it, but we hope to keep it reasonably well -maintained, which is why it lives as a markdown document in our source tree. - -# Architecture - -At a high level, the Vulkan backend is composed of the **driver**, a set of **helpers**, and -a set of **handle types**. - -The driver is responsible for implementing all `DriverAPI` entry points, as well as managing a -single `VkDevice` and `VkInstance`. - -************************************************************************************************ -* * -* .---------------------------------------. * -* | Client Application | * -* '------------------+--------------------' * -* | * -* v * -* .----------------------------------------. .--------------------------------------. * -* | Filament Rendering Engine | | filament::SwapChain | * -* '------------------+---------------------' '------------------+-------------------' * -* | | * -* v v * -* .----------------------------------------. .---------------------------------------. * -* | | | | * -* | VulkanDriver : DriverBase | | VulkanSwapChain : HwSwapChain | * -* | | | | * -* |------------------------------------------| |-----------------------------------------| * -* | | | | * -* | Helpers VulkanContext | | VulkanTexture VulkanTexture | * -* | .--------------. .---------------. | | .----------------+----------------. | * -* | | PipelineCache| | VkDevice | | | | VkImage | VkImage | | * -* | +--------------+ | VkInstance | | | | VkImageView | VkImageView | | * -* | | Disposer | | VulkanCommands | | | | | | | * -* | +--------------+ '---------------' | | '----------------+----------------' | * -* | | FboCache | | | | * -* | +--------------+ | | | * -* | | SamplerCache | | | | * -* | +--------------+ | | | * -* | | StagePool | | '---------------------------------------' * -* | '--------------' | * -* | | * -* | | * -* | | * -* '----------------------------------------' * -* * -************************************************************************************************ - -# Overview - -## VulkanDriver and VulkanContext - -The `VulkanDriver` class is the bridge between the backend and the Filament engine, and is kept as -minimal as possible. Most of the actual logic is contained in methods in `VulkanContext` and in the -handle types rather than directly in `VulkanDriver`. - -In a self-imposed design constraint, we have decided that every method in `VulkanDriver` must be an -override; it should have no private methods other than the handle allocators. This reins in -complexity because it must implement every method in `DriverAPI` while dealing with Vulkan itself, -which has an extremely low-level API. - -## Command buffers - -The `VulkanCommands` class creates command buffers on the fly and maintains a chain of semaphores -to ensure that submitted command buffers are executed serially. - -## Handle types - -This sole purpose of `VulkanHandles.h` is to declare structs that descend from the hardware handles -that are defined in `DriverBase.h`. - -Most of the handle types do not contain much logic, but they often do more than mere wrapping of -Vk objects. Notably, `VulkanRenderTarget` does not have a straightforward mapping to any one Vk -object. See its class comment for details. Also, `VulkanTexture` and `VulkanSwapChain` have their -own cpps file because of complexity around layouts and subresources. - -VulkanProgram -: Descends from `HwProgram`, owns a pair of `VkShaderModule`. - -VulkanRenderTarget -: Descends from `HwRenderTarget`, contains references to `VulkanTexture` objects. - -VulkanSwapChain -: Descends from `HwSwapChain`, has a reference to `VkSurfaceKHR` and `VkSwapchainKHR`. - -VulkanVertexBuffer -: Descends from `HwVertexBuffer`, owns a set of `VkBuffer`. - -VulkanIndexBuffer -: Descends from `HwIndexBuffer`, owns a `VkBuffer`. - -VulkanSamplerGroup -: Descends from `HwSamplerGroup`, does not own Vk objects. - -VulkanTexture -: Descends from `HwTexture`, owns a `VkImage` and a set of `VkImageLayout`. - -VulkanRenderPrimitive -: Descends from `HwRenderPrimitive`, does not own Vk objects. - -One special case is `VulkanBuffer`, which is not a handle class. It encapulates functionality shared -between `VulkanIndexBuffer` and `VulkanVertexBuffer`. - -## Helpers - -`VulkanDriver` owns one instance of each helper. They are not part of a class hierarchy but -they do follow a common set of conventions. For example, most of them implement a `gc()` method -that is called once per frame to free unused objects. - -VulkanPipelineCache -: Cache of VkDescriptorSet, VkPipeline, and VkPipelineLayout. - -VulkanDisposer -: Holds reference counts to Vulkan objects in order to defer their destruction. - -VulkanFboCache -: Cache of VkRenderPass and VkFramebuffer. Contains weak references to VkImage handles, but does not - own any pixel data. The cache key for render passes is quite complex because it needs to include - image layout information in a compact way. For details see the comments in the `RenderPassKey` - declaration. - -VulkanStagePool -: Pool of VkBuffer objects that can be memory mapped (shared between host and device). - -VulkanSamplerCache -: This is our simplest cache object because Vulkan samplers are fairly lightweight and re-usable. - -## Folder layout and namespacing - -With the exception of BlueVK, all Vulkan-specific code lives in `backend/src/vulkan`, which has -no subfolders. All backend-specific types and functions live directly in the `filament::backend` -namespace, and we simply prefix our names with "Vulkan" when necessary to avoid ambiguation with -OpenGL. - -# Image Layout Strategy - -Adhering to a coherent strategy for image layout transitions is crucial. Without this, validation -errors (and actual black screens with some GPU vendors) occur far too easily and can feel like -whack-a-mole. - -Vulkan provides several mechanisms for transitioning layout (render passes, barriers) so the -strategy outlined below specifies which mechanism should be used in various scenarios. - -The current image layouts are tracked at the subresource level in `VulkanTexture` using a -specialized STL-ish container that we designed for this purpose: -[RangeMap](https://github.com/google/filament/blob/main/libs/utils/include/utils/RangeMap.h). - -In the past we tried to avoid tracking since it theoritically duplicates state that exists in the -GPU vendor's driver. However in practice this was impossible to manage, because complex logic was -required to deduce the current layout. Also, tracking lets us use `assert_invariant` in many places -to ensure that the behavior described in this document is implemented properly. It is much easier -to catch errors with asserts than with validation. - -As of this writing, the current rules are: - -(1) **Read-Only Color Textures** - -These should be created in an UNDEFINED state and stay that way until data gets uploaded into them, -at which point the appropriate subresources are transitioned to TRANSFER_DST_OPTIMAL for the upload, -then to SHADER_READ_ONLY_OPTIMAL, both times using a barrier. Note that a subresource might be -updated several times; each time it undergoes these two transitions. - -If a shader samples from a texture whose mipmaps are only partially loaded, we might see validation -warnings about how some subresources are in an UNDEFINED layout. However if we are properly using -the `setMinMaxLevels` driver API, then the Vulkan backend will not bind those particular -subresources, so validation should not complain. - -(2) **Writeable Color Textures** - -During construction of the HwTexture, these are transitioned to GENERAL using a barrier. - -GENERAL layout is not recommended by AMD best practices but in our case we wish to avoid thrashing -the layout between COLOR_ATTACHMENT_OPTIMAL and SHADER_READ_ONLY_OPTIMAL for post-processing -effects. Moreover we do not have a priori knowledge about blitting and read pixels usage. - -(3) **Depth Textures** - -During construction of the HwTexture, these are transitioned to GENERAL using a barrier. - -Note that some post-processing passes (e.g. SSAO) sample from the depth buffer while also enabling -depth testing. Using GENERAL makes this legal. - -(4) **Swap Chain Textures** - -During construction, these are transitioned to GENERAL using a barrier. They are then transitioned -to PRESENT at the end of the frame using a barrier, and transitioned back to GENERAL using the first -render pass of the frame. - -Note that we transition to PRESENT using a barrier, but with some GPU vendors it might be preferable -to transition them using the last render pass. However we have no way of knowing ahead of time which -pass is last. - -Note that Filament allows swap chains to be used as blit targets and blit sources (e.g. for -ReadPixels). Using GENERAL makes this easier to manage. - -(5) **Headless Swap Chain Textures** - -These follow the same rules as writeable color texture and depth textures. - -# VulkanPipelineCache - -Uniforms, samplers, and shaders are not directly bindable in Vulkan; instead they are bound through -indirection layers called *pipelines* and *descriptor sets*. The `VulkanPipelineCache` class allows -the driver to call methods that are conceptually simple like `bindUniformBuffer`, even though no -such function exists in the low-level Vulkan API. - -Although it is actually just another cache manager, `VulkanPipelineCache` has a fairly rich set of -public methods. See its header file for details. - -The pipeline cache also manages the *layout objects*, which constrain the number of uniform buffers -and samplers that can be bound simultaneously (see `VkDescriptorSetLayout` and `VkPipelineLayout`). - -# Memory Allocation - -Some architectures (e.g. Adreno) only allow a small number of `VkDeviceMemory` objects to exist at -once, so we consolidate these using a simple third-party library -([vk_mem_alloc](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator)). This library is -used each time the backend needs to create a `VkBuffer` or `VkImage`. See `VulkanStagePool` for a -usage example. - -# BlueVK - -BlueVK loads in functions for all Vulkan entry points and supported extensions. On Android, this -is not absolutely necessary since core functionality is available through static linking. However, -we found that in practice it is simpler to use BlueVK across all platforms because of its ability -to load extensions. - -The BlueVK C++ source is generated from a Python script that consumes `vk.xml`. This XML file is an -API specification maintained by Khronos on GitHub. - -None of the source files in the Vulkan backend include `vulkan.h` directly, instead they include -the BlueVK header, which in turn includes the Vulkan headers. - -!!! Note - Each time we update BlueVK by feeding it the latest `vk.xml`, we should also update the - Vulkan headers that are checked in to `libs/bluevk/include/vulkan`. If BlueVK and the Vulkan - headers are not updated concurrently, this will cause build errors. - -# Top Issues - -Here we list some of the most significant issues and to-be-done items for the Vulkan backend. - -- Improve the UBO strategy - - Currently we use staging buffers and perform lots of copies (host-to-host, then host-to-device) - - Consider an approach similar to MetalDriver, which effectively implements double-buffering - using a pool of shared mem buffers -- Consider using subpasses for the depth prepass -- We lazily create pipeline objects - 1. This is notoriously slow in Vulkan - 2. We do lots of state hashing for this - 3. Vulkan has special pipeline cache objects that we aren't using yet, but... - 4. It might be better to enhance our driver API to allow a priori construction -- We need more automated testing -- We don't *quite* have feature parity with the OpenGL backend - - No support for streaming camera texture yet - - This is possible, even in Android O, just haven't gotten around to it yet - - - diff --git a/filament/include/filament/Box.h b/filament/include/filament/Box.h index f4cdb5fab6e..5faa5b2151b 100644 --- a/filament/include/filament/Box.h +++ b/filament/include/filament/Box.h @@ -21,10 +21,14 @@ #include -#include - +#include #include #include +#include + +#include + +#include namespace filament { @@ -70,7 +74,7 @@ class UTILS_PUBLIC Box { * @return This bounding box */ Box& set(const math::float3& min, const math::float3& max) noexcept { - // float3 ctor needed for visual studio + // float3 ctor needed for Visual Studio center = (max + min) * math::float3(0.5f); halfExtent = (max - min) * math::float3(0.5f); return *this; @@ -104,22 +108,24 @@ class UTILS_PUBLIC Box { } /** - * Computes the bounding box of a box transformed by a rigid transform + * Transform a Box by a linear transform and a translation. + * + * @param m a 3x3 matrix, the linear transform + * @param t a float3, the translation * @param box the box to transform - * @param m a 4x4 matrix that must be a rigid transform - * @return the bounding box of the transformed box. - * Result is undefined if \p m is not a rigid transform + * @return the bounding box of the transformed box */ - friend Box rigidTransform(Box const& box, const math::mat4f& m) noexcept; + static Box transform(const math::mat3f& m, math::float3 const& t, const Box& box) noexcept { + return { m * box.center + t, abs(m) * box.halfExtent }; + } /** - * Computes the bounding box of a box transformed by a rigid transform - * @param box the box to transform - * @param m a 3x3 matrix that must be a rigid transform - * @return the bounding box of the transformed box. - * Result is undefined if \p m is not a rigid transform + * @deprecated Use transform() instead + * @see transform() */ - friend Box rigidTransform(Box const& box, const math::mat3f& m) noexcept; + friend Box rigidTransform(Box const& box, const math::mat4f& m) noexcept { + return transform(m.upperLeft(), m[3].xyz, box); + } }; /** @@ -128,17 +134,17 @@ class UTILS_PUBLIC Box { struct UTILS_PUBLIC Aabb { /** min coordinates */ - math::float3 min = std::numeric_limits::max(); + math::float3 min = FLT_MAX; /** max coordinates */ - math::float3 max = std::numeric_limits::lowest(); + math::float3 max = -FLT_MAX; /** * Computes the center of the box. * @return (max + min)/2 */ math::float3 center() const noexcept { - // float3 ctor needed for visual studio + // float3 ctor needed for Visual Studio return (max + min) * math::float3(0.5f); } @@ -147,7 +153,7 @@ struct UTILS_PUBLIC Aabb { * @return (max - min)/2 */ math::float3 extent() const noexcept { - // float3 ctor needed for visual studio + // float3 ctor needed for Visual Studio return (max - min) * math::float3(0.5f); } @@ -168,13 +174,26 @@ struct UTILS_PUBLIC Aabb { value_type const* data() const { return vertices; } value_type * data() { return vertices; } size_t size() const { return 8; } + value_type const& operator[](size_t i) const noexcept { return vertices[i]; } + value_type& operator[](size_t i) noexcept { return vertices[i]; } value_type vertices[8]; }; /** * Returns the 8 corner vertices of the AABB. */ - Corners getCorners() const; + Corners getCorners() const { + return Corners{ .vertices = { + { min.x, min.y, min.z }, + { max.x, min.y, min.z }, + { min.x, max.y, min.z }, + { max.x, max.y, min.z }, + { min.x, min.y, max.z }, + { max.x, min.y, max.z }, + { min.x, max.y, max.z }, + { max.x, max.y, max.z }, + }}; + } /** * Returns whether the box contains a given point. @@ -182,15 +201,46 @@ struct UTILS_PUBLIC Aabb { * @param p the point to test * @return the maximum signed distance to the box. Negative if p is in the box */ - float contains(math::float3 p) const noexcept; + float contains(math::float3 p) const noexcept { + // we don't use std::max to avoid a dependency on + auto const maximum = [](auto a, auto b) { return a > b ? a : b; }; + float d = min.x - p.x; + d = maximum(d, min.y - p.y); + d = maximum(d, min.z - p.z); + d = maximum(d, p.x - max.x); + d = maximum(d, p.y - max.y); + d = maximum(d, p.z - max.z); + return d; + } /** * Applies an affine transformation to the AABB. * - * @param m the 4x4 transformation to apply + * @param m the 3x3 transformation to apply + * @param t the translation * @return the transformed box */ - Aabb transform(const math::mat4f& m) const noexcept; + static Aabb transform(const math::mat3f& m, math::float3 const& t, const Aabb& box) noexcept { + // Fast AABB transformation per Jim Arvo in Graphics Gems (1990). + Aabb result{ t, t }; + for (size_t col = 0; col < 3; ++col) { + for (size_t row = 0; row < 3; ++row) { + const float a = m[col][row] * box.min[col]; + const float b = m[col][row] * box.max[col]; + result.min[row] += a < b ? a : b; + result.max[row] += a < b ? b : a; + } + } + return result; + } + + /** + * @deprecated Use transform() instead + * @see transform() + */ + Aabb transform(const math::mat4f& m) const noexcept { + return transform(m.upperLeft(), m[3].xyz, *this); + } }; } // namespace filament diff --git a/filament/include/filament/BufferObject.h b/filament/include/filament/BufferObject.h index 1ede31b8cb0..b946449afbc 100644 --- a/filament/include/filament/BufferObject.h +++ b/filament/include/filament/BufferObject.h @@ -22,11 +22,13 @@ #include #include - #include #include +#include +#include + namespace filament { class FBufferObject; @@ -52,7 +54,7 @@ class UTILS_PUBLIC BufferObject : public FilamentAPI { using BufferDescriptor = backend::BufferDescriptor; using BindingType = backend::BufferObjectBinding; - class Builder : public BuilderBase { + class Builder : public BuilderBase, public BuilderNameMixin { friend struct BuilderDetails; public: Builder() noexcept; @@ -71,19 +73,33 @@ class UTILS_PUBLIC BufferObject : public FilamentAPI { /** * The binding type for this buffer object. (defaults to VERTEX) - * @param BindingType Distinguishes between SSBO, VBO, etc. For now this must be VERTEX. + * @param bindingType Distinguishes between SSBO, VBO, etc. For now this must be VERTEX. * @return A reference to this Builder for chaining calls. */ Builder& bindingType(BindingType bindingType) noexcept; + /** + * Associate an optional name with this BufferObject for debugging purposes. + * + * name will show in error messages and should be kept as short as possible. The name is + * truncated to a maximum of 128 characters. + * + * The name string is copied during this method so clients may free its memory after + * the function returns. + * + * @param name A string to identify this BufferObject + * @param len Length of name, should be less than or equal to 128 + * @return This Builder, for chaining calls. + */ + Builder& name(const char* UTILS_NONNULL name, size_t len) noexcept; + /** * Creates the BufferObject and returns a pointer to it. After creation, the buffer * object is uninitialized. Use BufferObject::setBuffer() to initialize it. * * @param engine Reference to the filament::Engine to associate this BufferObject with. * - * @return pointer to the newly created object or nullptr if exceptions are disabled and - * an error occurred. + * @return pointer to the newly created object * * @exception utils::PostConditionPanic if a runtime error occurred, such as running out of * memory or other resources. @@ -91,7 +107,7 @@ class UTILS_PUBLIC BufferObject : public FilamentAPI { * * @see IndexBuffer::setBuffer */ - BufferObject* build(Engine& engine); + BufferObject* UTILS_NONNULL build(Engine& engine); private: friend class FBufferObject; }; @@ -110,6 +126,10 @@ class UTILS_PUBLIC BufferObject : public FilamentAPI { * @return The maximum capacity of the BufferObject. */ size_t getByteCount() const noexcept; + +protected: + // prevent heap allocation + ~BufferObject() = default; }; } // namespace filament diff --git a/filament/include/filament/Camera.h b/filament/include/filament/Camera.h index 4b54a8e9131..10fe041b7ca 100644 --- a/filament/include/filament/Camera.h +++ b/filament/include/filament/Camera.h @@ -26,6 +26,12 @@ #include #include #include +#include + +#include + +#include +#include namespace utils { class Entity; @@ -34,10 +40,13 @@ class Entity; namespace filament { /** - * Camera represents the eye through which the scene is viewed. + * Camera represents the eye(s) through which the scene is viewed. * * A Camera has a position and orientation and controls the projection and exposure parameters. * + * For stereoscopic rendering, a Camera maintains two separate "eyes": Eye 0 and Eye 1. These are + * arbitrary and don't necessarily need to correspond to "left" and "right". + * * Creation and destruction * ======================== * @@ -52,7 +61,7 @@ namespace filament { * filament::Camera* myCamera = engine->createCamera(myCameraEntity); * myCamera->setProjection(45, 16.0/9.0, 0.1, 1.0); * myCamera->lookAt({0, 1.60, 1}, {0, 0, 0}); - * engine->destroyCameraComponent(myCamera); + * engine->destroyCameraComponent(myCameraEntity); * ~~~~~~~~~~~ * * @@ -140,6 +149,18 @@ namespace filament { * intensity and the Camera exposure interact to produce the final scene's brightness. * * + * Stereoscopic rendering + * ====================== + * + * The Camera's transform (as set by setModelMatrix or via TransformManager) defines a "head" space, + * which typically corresponds to the location of the viewer's head. Each eye's transform is set + * relative to this head space by setEyeModelMatrix. + * + * Each eye also maintains its own projection matrix. These can be set with setCustomEyeProjection. + * Care must be taken to correctly set the projectionForCulling matrix, as well as its corresponding + * near and far values. The projectionForCulling matrix must define a frustum (in head space) that + * bounds the frustums of both eyes. Alternatively, culling may be disabled with + * View::setFrustumCullingEnabled. * * \see Frustum, View */ @@ -157,6 +178,30 @@ class UTILS_PUBLIC Camera : public FilamentAPI { HORIZONTAL //!< the field-of-view angle is defined on the horizontal axis }; + /** Returns the projection matrix from the field-of-view. + * + * @param fovInDegrees full field-of-view in degrees. 0 < \p fov < 180. + * @param aspect aspect ratio \f$ \frac{width}{height} \f$. \p aspect > 0. + * @param near distance in world units from the camera to the near plane. \p near > 0. + * @param far distance in world units from the camera to the far plane. \p far > \p near. + * @param direction direction of the \p fovInDegrees parameter. + * + * @see Fov. + */ + static math::mat4 projection(Fov direction, double fovInDegrees, + double aspect, double near, double far = INFINITY); + + /** Returns the projection matrix from the focal length. + * + * @param focalLengthInMillimeters lens's focal length in millimeters. \p focalLength > 0. + * @param aspect aspect ratio \f$ \frac{width}{height} \f$. \p aspect > 0. + * @param near distance in world units from the camera to the near plane. \p near > 0. + * @param far distance in world units from the camera to the far plane. \p far > \p near. + */ + static math::mat4 projection(double focalLengthInMillimeters, + double aspect, double near, double far = INFINITY); + + /** Sets the projection matrix from a frustum defined by six planes. * * @param projection type of #Projection to use. @@ -194,7 +239,8 @@ class UTILS_PUBLIC Camera : public FilamentAPI { double bottom, double top, double near, double far); - /** Sets the projection matrix from the field-of-view. + + /** Utility to set the projection matrix from the field-of-view. * * @param fovInDegrees full field-of-view in degrees. 0 < \p fov < 180. * @param aspect aspect ratio \f$ \frac{width}{height} \f$. \p aspect > 0. @@ -207,7 +253,7 @@ class UTILS_PUBLIC Camera : public FilamentAPI { void setProjection(double fovInDegrees, double aspect, double near, double far, Fov direction = Fov::VERTICAL); - /** Sets the projection matrix from the focal length. + /** Utility to set the projection matrix from the focal length. * * @param focalLengthInMillimeters lens's focal length in millimeters. \p focalLength > 0. * @param aspect aspect ratio \f$ \frac{width}{height} \f$. \p aspect > 0. @@ -217,13 +263,8 @@ class UTILS_PUBLIC Camera : public FilamentAPI { void setLensProjection(double focalLengthInMillimeters, double aspect, double near, double far); + /** Sets a custom projection matrix. - * - * The projection matrix must be of one of the following form: - * a 0 tx 0 a 0 0 tx - * 0 b ty 0 0 b 0 ty - * 0 0 tz c 0 0 c tz - * 0 0 -1 0 0 0 0 1 * * The projection matrix must define an NDC system that must match the OpenGL convention, * that is all 3 axis are mapped to [-1, 1]. @@ -235,12 +276,6 @@ class UTILS_PUBLIC Camera : public FilamentAPI { void setCustomProjection(math::mat4 const& projection, double near, double far) noexcept; /** Sets the projection matrix. - * - * The projection matrices must be of one of the following form: - * a 0 tx 0 a 0 0 tx - * 0 b ty 0 0 b 0 ty - * 0 0 tz c 0 0 c tz - * 0 0 -1 0 0 0 0 1 * * The projection matrices must define an NDC system that must match the OpenGL convention, * that is all 3 axis are mapped to [-1, 1]. @@ -253,6 +288,27 @@ class UTILS_PUBLIC Camera : public FilamentAPI { void setCustomProjection(math::mat4 const& projection, math::mat4 const& projectionForCulling, double near, double far) noexcept; + /** Sets a custom projection matrix for each eye. + * + * The projectionForCulling, near, and far parameters establish a "culling frustum" which must + * encompass anything any eye can see. All projection matrices must be set simultaneously. The + * number of stereoscopic eyes is controlled by the stereoscopicEyeCount setting inside of + * Engine::Config. + * + * @param projection an array of projection matrices, only the first config.stereoscopicEyeCount + * are read + * @param count size of the projection matrix array to set, must be + * >= config.stereoscopicEyeCount + * @param projectionForCulling custom projection matrix for culling, must encompass both eyes + * @param near distance in world units from the camera to the culling near plane. \p near > 0. + * @param far distance in world units from the camera to the culling far plane. \p far > \p + * near. + * @see setCustomProjection + * @see Engine::Config::stereoscopicEyeCount + */ + void setCustomEyeProjection(math::mat4 const* UTILS_NONNULL projection, size_t count, + math::mat4 const& projectionForCulling, double near, double far); + /** Sets an additional matrix that scales the projection matrix. * * This is useful to adjust the aspect ratio of the camera independent from its projection. @@ -309,11 +365,14 @@ class UTILS_PUBLIC Camera : public FilamentAPI { * The projection matrix used for rendering always has its far plane set to infinity. This * is why it may differ from the matrix set through setProjection() or setLensProjection(). * + * @param eyeId the index of the eye to return the projection matrix for, must be + * < config.stereoscopicEyeCount * @return The projection matrix used for rendering * - * @see setProjection, setLensProjection, setCustomProjection, getCullingProjectionMatrix + * @see setProjection, setLensProjection, setCustomProjection, getCullingProjectionMatrix, + * setCustomEyeProjection */ - math::mat4 getProjectionMatrix() const noexcept; + math::mat4 getProjectionMatrix(uint8_t eyeId = 0) const; /** Returns the projection matrix used for culling (far plane is finite). @@ -341,14 +400,34 @@ class UTILS_PUBLIC Camera : public FilamentAPI { * engine.getTransformManager().getInstance(camera->getEntity()), model); * ~~~~~~~~~~~ * - * @param model The camera position and orientation provided as a rigid transform matrix. + * @param modelMatrix The camera position and orientation provided as a rigid transform matrix. * * @note The Camera "looks" towards its -z axis * * @warning \p model must be a rigid transform */ - void setModelMatrix(const math::mat4& model) noexcept; - void setModelMatrix(const math::mat4f& model) noexcept; //!< @overload + void setModelMatrix(const math::mat4& modelMatrix) noexcept; + void setModelMatrix(const math::mat4f& modelMatrix) noexcept; //!< @overload + + /** Set the position of an eye relative to this Camera (head). + * + * By default, both eyes' model matrices are identity matrices. + * + * For example, to position Eye 0 3cm leftwards and Eye 1 3cm rightwards: + * ~~~~~~~~~~~{.cpp} + * const mat4 leftEye = mat4::translation(double3{-0.03, 0.0, 0.0}); + * const mat4 rightEye = mat4::translation(double3{ 0.03, 0.0, 0.0}); + * camera.setEyeModelMatrix(0, leftEye); + * camera.setEyeModelMatrix(1, rightEye); + * ~~~~~~~~~~~ + * + * This method is not intended to be called every frame. Instead, to update the position of the + * head, use Camera::setModelMatrix. + * + * @param eyeId the index of the eye to set, must be < config.stereoscopicEyeCount + * @param model the model matrix for an individual eye + */ + void setEyeModelMatrix(uint8_t eyeId, math::mat4 const& model); /** Sets the camera's model matrix * @@ -448,7 +527,9 @@ class UTILS_PUBLIC Camera : public FilamentAPI { //! returns this camera's sensitivity in ISO float getSensitivity() const noexcept; - //! returns the focal length in meters [m] for a 35mm camera + /** Returns the focal length in meters [m] for a 35mm camera. + * Eye 0's projection matrix is used to compute the focal length. + */ double getFocalLength() const noexcept; /** @@ -466,33 +547,6 @@ class UTILS_PUBLIC Camera : public FilamentAPI { * * \param p the projection matrix to inverse * \returns the inverse of the projection matrix \p p - * - * \warning the projection matrix to invert must have one of the form below: - * - perspective projection - * - * \f$ - * \left( - * \begin{array}{cccc} - * a & 0 & tx & 0 \\ - * 0 & b & ty & 0 \\ - * 0 & 0 & tz & c \\ - * 0 & 0 & -1 & 0 \\ - * \end{array} - * \right) - * \f$ - * - * - orthographic projection - * - * \f$ - * \left( - * \begin{array}{cccc} - * a & 0 & 0 & tx \\ - * 0 & b & 0 & ty \\ - * 0 & 0 & c & tz \\ - * 0 & 0 & 0 & 1 \\ - * \end{array} - * \right) - * \f$ */ static math::mat4 inverseProjection(const math::mat4& p) noexcept; @@ -519,6 +573,10 @@ class UTILS_PUBLIC Camera : public FilamentAPI { * @return effective full field of view in degrees */ static double computeEffectiveFov(double fovInDegrees, double focusDistance) noexcept; + +protected: + // prevent heap allocation + ~Camera() = default; }; } // namespace filament diff --git a/filament/include/filament/Color.h b/filament/include/filament/Color.h index fa03b1e24c7..3793982015b 100644 --- a/filament/include/filament/Color.h +++ b/filament/include/filament/Color.h @@ -24,6 +24,9 @@ #include #include +#include +#include + namespace filament { //! RGB color in linear space @@ -191,7 +194,7 @@ inline sRGBColorA Color::toSRGB(LinearColorA const& color) { } inline LinearColor Color::toLinear(RgbType type, math::float3 color) { - return (type == RgbType::LINEAR) ? color : Color::toLinear(color); + return (type == RgbType::LINEAR) ? color : toLinear(color); } // converts an RGBA color to linear space @@ -199,11 +202,11 @@ inline LinearColor Color::toLinear(RgbType type, math::float3 color) { inline LinearColorA Color::toLinear(RgbaType type, math::float4 color) { switch (type) { case RgbaType::sRGB: - return Color::toLinear(color) * math::float4{color.a, color.a, color.a, 1.0f}; + return toLinear(color) * math::float4{color.a, color.a, color.a, 1.0f}; case RgbaType::LINEAR: return color * math::float4{color.a, color.a, color.a, 1.0f}; case RgbaType::PREMULTIPLIED_sRGB: - return Color::toLinear(color); + return toLinear(color); case RgbaType::PREMULTIPLIED_LINEAR: return color; } diff --git a/filament/include/filament/ColorGrading.h b/filament/include/filament/ColorGrading.h index db709600ef3..e5c8f3cae3f 100644 --- a/filament/include/filament/ColorGrading.h +++ b/filament/include/filament/ColorGrading.h @@ -26,6 +26,9 @@ #include +#include +#include + namespace filament { class Engine; @@ -200,7 +203,7 @@ class UTILS_PUBLIC ColorGrading : public FilamentAPI { * * @return This Builder, for chaining calls */ - Builder& toneMapper(const ToneMapper* toneMapper) noexcept; + Builder& toneMapper(ToneMapper const* UTILS_NULLABLE toneMapper) noexcept; /** * Selects the tone mapping operator to apply to the HDR color buffer as the last @@ -470,14 +473,17 @@ class UTILS_PUBLIC ColorGrading : public FilamentAPI { * * @param engine Reference to the filament::Engine to associate this ColorGrading with. * - * @return pointer to the newly created object or nullptr if exceptions are disabled and - * an error occurred. + * @return pointer to the newly created object. */ - ColorGrading* build(Engine& engine); + ColorGrading* UTILS_NONNULL build(Engine& engine); private: friend class FColorGrading; }; + +protected: + // prevent heap allocation + ~ColorGrading() = default; }; } // namespace filament diff --git a/filament/include/filament/ColorSpace.h b/filament/include/filament/ColorSpace.h index 931771ac6b4..d8890955053 100644 --- a/filament/include/filament/ColorSpace.h +++ b/filament/include/filament/ColorSpace.h @@ -18,10 +18,8 @@ #define TNT_FILAMENT_COLOR_SPACE_H #include -#include -namespace filament { -namespace color { +namespace filament::color { using namespace math; @@ -35,7 +33,7 @@ struct Primaries { float2 b; bool operator==(const Primaries& rhs) const noexcept { - return r == rhs.r && b == rhs.b && g == rhs.b; + return r == rhs.r && b == rhs.b && g == rhs.g; } }; @@ -192,13 +190,13 @@ class ColorSpace { * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * // Declares a "linear sRGB" color space. - * ColorSpace myColorSpace = Rec709-Linear-sRGB; + * ColorSpace myColorSpace = Rec709-Linear-D65; * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ class PartialColorSpace { public: - constexpr ColorSpace operator-(const WhitePoint whitePoint) const { - return ColorSpace(mPrimaries, mTransferFunction, whitePoint); + constexpr ColorSpace operator-(const WhitePoint& whitePoint) const { + return { mPrimaries, mTransferFunction, whitePoint }; } private: @@ -222,14 +220,14 @@ class PartialColorSpace { */ class Gamut { public: - constexpr Gamut(const Primaries primaries) : mPrimaries(primaries) { + constexpr explicit Gamut(const Primaries primaries) : mPrimaries(primaries) { } - constexpr Gamut(float2 r, float2 g, float2 b) : Gamut(Primaries{r, g, b}) { + constexpr Gamut(float2 r, float2 g, float2 b) : Gamut(Primaries{ r, g, b }) { } - constexpr PartialColorSpace operator-(const TransferFunction transferFunction) const { - return PartialColorSpace(mPrimaries, transferFunction); + constexpr PartialColorSpace operator-(const TransferFunction& transferFunction) const { + return { mPrimaries, transferFunction }; } constexpr const Primaries& getPrimaries() const { return mPrimaries; } @@ -239,18 +237,19 @@ class Gamut { }; //! Rec.709 color gamut, used in the sRGB and DisplayP3 color spaces. -constexpr Gamut Rec709 = Gamut({0.640f, 0.330f}, {0.300f, 0.600f}, {0.150f, 0.060f}); +constexpr Gamut Rec709 = {{ 0.640f, 0.330f }, + { 0.300f, 0.600f }, + { 0.150f, 0.060f }}; //! Linear transfer function. -constexpr TransferFunction Linear = TransferFunction(1.0, 0.0, 0.0, 0.0, 1.0); +constexpr TransferFunction Linear = { 1.0, 0.0, 0.0, 0.0, 1.0 }; + //! sRGB transfer function. -constexpr TransferFunction sRGB = - TransferFunction(1.0 / 1.055, 0.055 / 1.055, 1.0 / 12.92, 0.04045, 2.4); +constexpr TransferFunction sRGB = { 1.0 / 1.055, 0.055 / 1.055, 1.0 / 12.92, 0.04045, 2.4 }; //! Standard CIE 1931 2° illuminant D65. This illuminant has a color temperature of 6504K. -constexpr WhitePoint D65 = WhitePoint({0.31271f, 0.32902f}); +constexpr WhitePoint D65 = { 0.31271f, 0.32902f }; -} // namespace color -} // namespace filament +} // namespace filament::color #endif // TNT_FILAMENT_COLOR_SPACE_H diff --git a/filament/include/filament/DebugRegistry.h b/filament/include/filament/DebugRegistry.h index b5fb8f21365..d5e1d8e983b 100644 --- a/filament/include/filament/DebugRegistry.h +++ b/filament/include/filament/DebugRegistry.h @@ -25,7 +25,7 @@ #include -#include +#include namespace filament { @@ -39,27 +39,12 @@ namespace filament { class UTILS_PUBLIC DebugRegistry : public FilamentAPI { public: - /** - * Type of a property - */ - enum Type { - BOOL, INT, FLOAT, FLOAT2, FLOAT3, FLOAT4 - }; - - /** - * Information about a property - */ - struct Property { - const char* name; //!< property name - Type type; //!< property type - }; - /** * Queries whether a property exists * @param name The name of the property to query * @return true if the property exists, false otherwise */ - bool hasProperty(const char* name) const noexcept; + bool hasProperty(const char* UTILS_NONNULL name) const noexcept; /** * Queries the address of a property's data from its name @@ -67,15 +52,30 @@ class UTILS_PUBLIC DebugRegistry : public FilamentAPI { * @return Address of the data of the \p name property * @{ */ - void* getPropertyAddress(const char* name) noexcept; + void* UTILS_NULLABLE getPropertyAddress(const char* UTILS_NONNULL name); + + void const* UTILS_NULLABLE getPropertyAddress(const char* UTILS_NONNULL name) const noexcept; template - inline T* getPropertyAddress(const char* name) noexcept { + inline T* UTILS_NULLABLE getPropertyAddress(const char* UTILS_NONNULL name) { return static_cast(getPropertyAddress(name)); } template - inline bool getPropertyAddress(const char* name, T** p) noexcept { + inline T const* UTILS_NULLABLE getPropertyAddress(const char* UTILS_NONNULL name) const noexcept { + return static_cast(getPropertyAddress(name)); + } + + template + inline bool getPropertyAddress(const char* UTILS_NONNULL name, + T* UTILS_NULLABLE* UTILS_NONNULL p) { + *p = getPropertyAddress(name); + return *p != nullptr; + } + + template + inline bool getPropertyAddress(const char* UTILS_NONNULL name, + T* const UTILS_NULLABLE* UTILS_NONNULL p) const noexcept { *p = getPropertyAddress(name); return *p != nullptr; } @@ -88,12 +88,12 @@ class UTILS_PUBLIC DebugRegistry : public FilamentAPI { * @return true if the operation was successful, false otherwise. * @{ */ - bool setProperty(const char* name, bool v) noexcept; - bool setProperty(const char* name, int v) noexcept; - bool setProperty(const char* name, float v) noexcept; - bool setProperty(const char* name, math::float2 v) noexcept; - bool setProperty(const char* name, math::float3 v) noexcept; - bool setProperty(const char* name, math::float4 v) noexcept; + bool setProperty(const char* UTILS_NONNULL name, bool v) noexcept; + bool setProperty(const char* UTILS_NONNULL name, int v) noexcept; + bool setProperty(const char* UTILS_NONNULL name, float v) noexcept; + bool setProperty(const char* UTILS_NONNULL name, math::float2 v) noexcept; + bool setProperty(const char* UTILS_NONNULL name, math::float3 v) noexcept; + bool setProperty(const char* UTILS_NONNULL name, math::float4 v) noexcept; /** @}*/ /** @@ -103,20 +103,20 @@ class UTILS_PUBLIC DebugRegistry : public FilamentAPI { * @return true if the call was successful and \p v was updated * @{ */ - bool getProperty(const char* name, bool* v) const noexcept; - bool getProperty(const char* name, int* v) const noexcept; - bool getProperty(const char* name, float* v) const noexcept; - bool getProperty(const char* name, math::float2* v) const noexcept; - bool getProperty(const char* name, math::float3* v) const noexcept; - bool getProperty(const char* name, math::float4* v) const noexcept; + bool getProperty(const char* UTILS_NONNULL name, bool* UTILS_NONNULL v) const noexcept; + bool getProperty(const char* UTILS_NONNULL name, int* UTILS_NONNULL v) const noexcept; + bool getProperty(const char* UTILS_NONNULL name, float* UTILS_NONNULL v) const noexcept; + bool getProperty(const char* UTILS_NONNULL name, math::float2* UTILS_NONNULL v) const noexcept; + bool getProperty(const char* UTILS_NONNULL name, math::float3* UTILS_NONNULL v) const noexcept; + bool getProperty(const char* UTILS_NONNULL name, math::float4* UTILS_NONNULL v) const noexcept; /** @}*/ struct DataSource { - void const* data; + void const* UTILS_NULLABLE data; size_t count; }; - DataSource getDataSource(const char* name) const noexcept; + DataSource getDataSource(const char* UTILS_NONNULL name) const noexcept; struct FrameHistory { using duration_ms = float; @@ -129,6 +129,10 @@ class UTILS_PUBLIC DebugRegistry : public FilamentAPI { float pid_i = 0.0f; float pid_d = 0.0f; }; + +protected: + // prevent heap allocation + ~DebugRegistry() = default; }; diff --git a/filament/include/filament/Engine.h b/filament/include/filament/Engine.h index 450e780ef84..8fb44af5dc3 100644 --- a/filament/include/filament/Engine.h +++ b/filament/include/filament/Engine.h @@ -17,9 +17,20 @@ #ifndef TNT_FILAMENT_ENGINE_H #define TNT_FILAMENT_ENGINE_H +#include + +#include #include #include +#include +#include + +#include +#include + +#include +#include namespace utils { class Entity; @@ -49,6 +60,7 @@ class SwapChain; class Texture; class VertexBuffer; class View; +class InstanceBuffer; class LightManager; class RenderableManager; @@ -164,14 +176,17 @@ class TransformManager; * @see Renderer */ class UTILS_PUBLIC Engine { + struct BuilderDetails; public: using Platform = backend::Platform; using Backend = backend::Backend; using DriverConfig = backend::Platform::DriverConfig; + using FeatureLevel = backend::FeatureLevel; + using StereoscopicType = backend::StereoscopicType; /** * Config is used to define the memory footprint used by the engine, such as the - * command buffer size. Config can be used to customize engine requirements based + * command buffer size. Config can be used to customize engine requirements based * on the applications needs. * * .perRenderPassArenaSizeMB (default: 3 MiB) @@ -263,98 +278,294 @@ class UTILS_PUBLIC Engine { * This value does not affect the application's memory usage. */ uint32_t perFrameCommandsSizeMB = FILAMENT_PER_FRAME_COMMANDS_SIZE_IN_MB; + + /** + * Number of threads to use in Engine's JobSystem. + * + * Engine uses a utils::JobSystem to carry out paralleization of Engine workloads. This + * value sets the number of threads allocated for JobSystem. Configuring this value can be + * helpful in CPU-constrained environments where too many threads can cause contention of + * CPU and reduce performance. + * + * The default value is 0, which implies that the Engine will use a heuristic to determine + * the number of threads to use. + */ + uint32_t jobSystemThreadCount = 0; + + /** + * When uploading vertex or index data, the Filament Metal backend copies data + * into a shared staging area before transferring it to the GPU. This setting controls + * the total size of the buffer used to perform these allocations. + * + * Higher values can improve performance when performing many uploads across a small + * number of frames. + * + * This buffer remains alive throughout the lifetime of the Engine, so this size adds to the + * memory footprint of the app and should be set as conservative as possible. + * + * A value of 0 disables the shared staging buffer entirely; uploads will acquire an + * individual buffer from a pool of shared buffers. + * + * Only respected by the Metal backend. + */ + size_t metalUploadBufferSizeBytes = 512 * 1024; + + /** + * Set to `true` to forcibly disable parallel shader compilation in the backend. + * Currently only honored by the GL and Metal backends. + * @deprecated use "backend.disable_parallel_shader_compile" feature flag instead + */ + bool disableParallelShaderCompile = false; + + /* + * The type of technique for stereoscopic rendering. + * + * This setting determines the algorithm used when stereoscopic rendering is enabled. This + * decision applies to the entire Engine for the lifetime of the Engine. E.g., multiple + * Views created from the Engine must use the same stereoscopic type. + * + * Each view can enable stereoscopic rendering via the StereoscopicOptions::enable flag. + * + * @see View::setStereoscopicOptions + */ + StereoscopicType stereoscopicType = StereoscopicType::NONE; + + /* + * The number of eyes to render when stereoscopic rendering is enabled. Supported values are + * between 1 and Engine::getMaxStereoscopicEyes() (inclusive). + * + * @see View::setStereoscopicOptions + * @see Engine::getMaxStereoscopicEyes + */ + uint8_t stereoscopicEyeCount = 2; + + /* + * @deprecated This value is no longer used. + */ + uint32_t resourceAllocatorCacheSizeMB = 64; + + /* + * This value determines how many frames texture entries are kept for in the cache. This + * is a soft limit, meaning some texture older than this are allowed to stay in the cache. + * Typically only one texture is evicted per frame. + * The default is 1. + */ + uint32_t resourceAllocatorCacheMaxAge = 1; + + /* + * Disable backend handles use-after-free checks. + * @deprecated use "backend.disable_handle_use_after_free_check" feature flag instead + */ + bool disableHandleUseAfterFreeCheck = false; + + /* + * Sets a preferred shader language for Filament to use. + * + * The Metal backend supports two shader languages: MSL (Metal Shading Language) and + * METAL_LIBRARY (precompiled .metallib). This option controls which shader language is + * used when materials contain both. + * + * By default, when preferredShaderLanguage is unset, Filament will prefer METAL_LIBRARY + * shaders if present within a material, falling back to MSL. Setting + * preferredShaderLanguage to ShaderLanguage::MSL will instead instruct Filament to check + * for the presence of MSL in a material first, falling back to METAL_LIBRARY if MSL is not + * present. + * + * When using a non-Metal backend, setting this has no effect. + */ + enum class ShaderLanguage { + DEFAULT = 0, + MSL = 1, + METAL_LIBRARY = 2, + }; + ShaderLanguage preferredShaderLanguage = ShaderLanguage::DEFAULT; + + /* + * When the OpenGL ES backend is used, setting this value to true will force a GLES2.0 + * context if supported by the Platform, or if not, will have the backend pretend + * it's a GLES2 context. Ignored on other backends. + */ + bool forceGLES2Context = false; + + /** + * Assert the native window associated to a SwapChain is valid when calling makeCurrent(). + * This is only supported for: + * - PlatformEGLAndroid + * @deprecated use "backend.opengl.assert_native_window_is_valid" feature flag instead + */ + bool assertNativeWindowIsValid = false; }; + /** - * Creates an instance of Engine - * - * @param backend Which driver backend to use. - * - * @param platform A pointer to an object that implements Platform. If this is - * provided, then this object is used to create the hardware context - * and expose platform features to it. - * - * If not provided (or nullptr is used), an appropriate Platform - * is created automatically. - * - * All methods of this interface are called from filament's - * render thread, which is different from the main thread. - * - * The lifetime of \p platform must exceed the lifetime of - * the Engine object. - * - * @param sharedGLContext A platform-dependant OpenGL context used as a shared context - * when creating filament's internal context. - * Setting this parameter will force filament to use the OpenGL - * implementation (instead of Vulkan for instance). - * - * @param config A pointer to optional parameters to specify memory size - * configuration options. If nullptr, then defaults used. - * - * @return A pointer to the newly created Engine, or nullptr if the Engine couldn't be created. - * - * nullptr if the GPU driver couldn't be initialized, for instance if it doesn't - * support the right version of OpenGL or OpenGL ES. - * - * @exception utils::PostConditionPanic can be thrown if there isn't enough memory to - * allocate the command buffer. If exceptions are disabled, this condition if fatal and - * this function will abort. - * - * \remark - * This method is thread-safe. + * Feature flags can be enabled or disabled when the Engine is built. Some Feature flags can + * also be toggled at any time. Feature flags should alawys use their default value unless + * the feature enabled by the flag is faulty. Feature flags provide a last resort way to + * disable problematic features. + * Feature flags are intended to have a short life-time and are regularly removed as features + * mature. + */ + struct FeatureFlag { + char const* UTILS_NONNULL name; //!< name of the feature flag + char const* UTILS_NONNULL description; //!< short description + bool const* UTILS_NONNULL value; //!< pointer to the value of the flag + bool constant; //!< whether the flag is constant after construction + }; + + /** + * Returns the list of available feature flags */ - static Engine* create(Backend backend = Backend::DEFAULT, - Platform* platform = nullptr, void* sharedGLContext = nullptr, - const Config* config = nullptr); + utils::Slice getFeatureFlags() const noexcept; #if UTILS_HAS_THREADING + using CreateCallback = void(void* UTILS_NULLABLE user, void* UTILS_NONNULL token); +#endif + /** - * A callback used with Engine::createAsync() called once the engine is initialized and it is - * safe to call Engine::getEngine(token). This callback is invoked from an arbitrary worker - * thread. Engine::getEngine() CANNOT be called from that thread, instead it must be called - * from the same thread than Engine::createAsync() was called from. - * - * @param user User provided parameter given in createAsync(). - * - * @param token An opaque token used to call Engine::getEngine(). + * Engine::Builder is used to create a new filament Engine. + */ + class Builder : public BuilderBase { + friend struct BuilderDetails; + friend class FEngine; + public: + Builder() noexcept; + Builder(Builder const& rhs) noexcept; + Builder(Builder&& rhs) noexcept; + ~Builder() noexcept; + Builder& operator=(Builder const& rhs) noexcept; + Builder& operator=(Builder&& rhs) noexcept; + + /** + * @param backend Which driver backend to use + * @return A reference to this Builder for chaining calls. + */ + Builder& backend(Backend backend) noexcept; + + /** + * @param platform A pointer to an object that implements Platform. If this is + * provided, then this object is used to create the hardware context + * and expose platform features to it. + * + * If not provided (or nullptr is used), an appropriate Platform + * is created automatically. + * + * All methods of this interface are called from filament's + * render thread, which is different from the main thread. + * + * The lifetime of \p platform must exceed the lifetime of + * the Engine object. + * + * @return A reference to this Builder for chaining calls. + */ + Builder& platform(Platform* UTILS_NULLABLE platform) noexcept; + + /** + * @param config A pointer to optional parameters to specify memory size + * configuration options. If nullptr, then defaults used. + * + * @return A reference to this Builder for chaining calls. + */ + Builder& config(const Config* UTILS_NULLABLE config) noexcept; + + /** + * @param sharedContext A platform-dependant context used as a shared context + * when creating filament's internal context. + * + * @return A reference to this Builder for chaining calls. + */ + Builder& sharedContext(void* UTILS_NULLABLE sharedContext) noexcept; + + /** + * @param featureLevel The feature level at which initialize Filament. + * @return A reference to this Builder for chaining calls. + */ + Builder& featureLevel(FeatureLevel featureLevel) noexcept; + + /** + * Warning: This is an experimental API. See Engine::setPaused(bool) for caveats. + * + * @param paused Whether to start the rendering thread paused. + * @return A reference to this Builder for chaining calls. + */ + Builder& paused(bool paused) noexcept; + + /** + * Set a feature flag value. This is the only way to set constant feature flags. + * @param name feature name + * @param value true to enable, false to disable + * @return A reference to this Builder for chaining calls. + */ + Builder& feature(char const* UTILS_NONNULL name, bool value) noexcept; + + /** + * Enables a list of features. + * @param list list of feature names to enable. + * @return A reference to this Builder for chaining calls. + */ + Builder& features(std::initializer_list list) noexcept; + +#if UTILS_HAS_THREADING + /** + * Creates the filament Engine asynchronously. + * + * @param callback Callback called once the engine is initialized and it is safe to + * call Engine::getEngine(). + */ + void build(utils::Invocable&& callback) const; +#endif + + /** + * Creates an instance of Engine. + * + * @return A pointer to the newly created Engine, or nullptr if the Engine couldn't be + * created. + * nullptr if the GPU driver couldn't be initialized, for instance if it doesn't + * support the right version of OpenGL or OpenGL ES. + * + * @exception utils::PostConditionPanic can be thrown if there isn't enough memory to + * allocate the command buffer. If exceptions are disabled, this condition if + * fatal and this function will abort. + */ + Engine* UTILS_NULLABLE build() const; + }; + + /** + * Backward compatibility helper to create an Engine. + * @see Builder */ - using CreateCallback = void(void* user, void* token); + static inline Engine* UTILS_NULLABLE create(Backend backend = Backend::DEFAULT, + Platform* UTILS_NULLABLE platform = nullptr, + void* UTILS_NULLABLE sharedContext = nullptr, + const Config* UTILS_NULLABLE config = nullptr) { + return Builder() + .backend(backend) + .platform(platform) + .sharedContext(sharedContext) + .config(config) + .build(); + } + +#if UTILS_HAS_THREADING /** - * Creates an instance of Engine asynchronously - * - * @param callback Callback called once the engine is initialized and it is safe to - * call Engine::getEngine. - * - * @param user A user provided pointer that is given back to callback unmodified. - * - * @param backend Which driver backend to use. - * - * @param platform A pointer to an object that implements Platform. If this is - * provided, then this object is used to create the hardware context - * and expose platform features to it. - * - * If not provided (or nullptr is used), an appropriate Platform - * is created automatically. - * - * All methods of this interface are called from filament's - * render thread, which is different from the main thread. - * - * The lifetime of \p platform must exceed the lifetime of - * the Engine object. - * - * @param sharedGLContext A platform-dependant OpenGL context used as a shared context - * when creating filament's internal context. - * Setting this parameter will force filament to use the OpenGL - * implementation (instead of Vulkan for instance). - * - * @param config A pointer to optional parameters to specify memory size - * configuration options + * Backward compatibility helper to create an Engine asynchronously. + * @see Builder */ - static void createAsync(CreateCallback callback, void* user, + static inline void createAsync(CreateCallback callback, + void* UTILS_NULLABLE user, Backend backend = Backend::DEFAULT, - Platform* platform = nullptr, void* sharedGLContext = nullptr, - const Config* config = nullptr); + Platform* UTILS_NULLABLE platform = nullptr, + void* UTILS_NULLABLE sharedContext = nullptr, + const Config* UTILS_NULLABLE config = nullptr) { + Builder() + .backend(backend) + .platform(platform) + .sharedContext(sharedContext) + .config(config) + .build([callback, user](void* UTILS_NONNULL token) { + callback(user, token); + }); + } /** * Retrieve an Engine* from createAsync(). This must be called from the same thread than @@ -368,9 +579,10 @@ class UTILS_PUBLIC Engine { * allocate the command buffer. If exceptions are disabled, this condition if fatal and * this function will abort. */ - static Engine* getEngine(void* token); + static Engine* UTILS_NULLABLE getEngine(void* UTILS_NONNULL token); #endif + /** * Destroy the Engine instance and all associated resources. * @@ -397,7 +609,7 @@ class UTILS_PUBLIC Engine { * \remark * This method is thread-safe. */ - static void destroy(Engine** engine); + static void destroy(Engine* UTILS_NULLABLE* UTILS_NULLABLE engine); /** * Destroy the Engine instance and all associated resources. @@ -424,10 +636,7 @@ class UTILS_PUBLIC Engine { * \remark * This method is thread-safe. */ - static void destroy(Engine* engine); - - using FeatureLevel = backend::FeatureLevel; - + static void destroy(Engine* UTILS_NULLABLE engine); /** * Query the feature level supported by the selected backend. @@ -440,17 +649,23 @@ class UTILS_PUBLIC Engine { FeatureLevel getSupportedFeatureLevel() const noexcept; /** - * Activate all features of a given feature level. By default FeatureLevel::FEATURE_LEVEL_1 is - * active. The selected feature level must not be higher than the value returned by - * getActiveFeatureLevel() and it's not possible lower the active feature level. + * Activate all features of a given feature level. If an explicit feature level is not specified + * at Engine initialization time via Builder::featureLevel, the default feature level is + * FeatureLevel::FEATURE_LEVEL_0 on devices not compatible with GLES 3.0; otherwise, the default + * is FeatureLevel::FEATURE_LEVEL_1. The selected feature level must not be higher than the + * value returned by getActiveFeatureLevel() and it's not possible lower the active feature + * level. Additionally, it is not possible to modify the feature level at all if the Engine was + * initialized at FeatureLevel::FEATURE_LEVEL_0. * * @param featureLevel the feature level to activate. If featureLevel is lower than - * getActiveFeatureLevel(), the current (higher) feature level is kept. - * If featureLevel is higher than getSupportedFeatureLevel(), an exception - * is thrown, or the program is terminated if exceptions are disabled. + * getActiveFeatureLevel(), the current (higher) feature level is kept. If + * featureLevel is higher than getSupportedFeatureLevel(), or if the engine + * was initialized at feature level 0, an exception is thrown, or the + * program is terminated if exceptions are disabled. * * @return the active feature level. * + * @see Builder::featureLevel * @see getSupportedFeatureLevel * @see getActiveFeatureLevel */ @@ -464,6 +679,52 @@ class UTILS_PUBLIC Engine { */ FeatureLevel getActiveFeatureLevel() const noexcept; + /** + * Queries the maximum number of GPU instances that Filament creates when automatic instancing + * is enabled. This value is also the limit for the number of transforms that can be stored in + * an InstanceBuffer. This value may depend on the device and platform, but will remain constant + * during the lifetime of this Engine. + * + * This value does not apply when using the instances(size_t) method on + * RenderableManager::Builder. + * + * @return the number of max automatic instances + * @see setAutomaticInstancingEnabled + * @see RenderableManager::Builder::instances(size_t) + * @see RenderableManager::Builder::instances(size_t, InstanceBuffer*) + */ + size_t getMaxAutomaticInstances() const noexcept; + + /** + * Queries the device and platform for support of the given stereoscopic type. + * + * @return true if the given stereo rendering is supported, false otherwise + * @see View::setStereoscopicOptions + */ + bool isStereoSupported(StereoscopicType stereoscopicType) const noexcept; + + /** + * Retrieves the configuration settings of this Engine. + * + * This method returns the configuration object that was supplied to the Engine's + * Builder::config method during the creation of this Engine. If the Builder::config method was + * not explicitly called (or called with nullptr), this method returns the default configuration + * settings. + * + * @return a Config object with this Engine's configuration + * @see Builder::config + */ + const Config& getConfig() const noexcept; + + /** + * Returns the maximum number of stereoscopic eyes supported by Filament. The actual number of + * eyes rendered is set at Engine creation time with the Engine::Config::stereoscopicEyeCount + * setting. + * + * @return the max number of stereoscopic eyes supported + * @see Engine::Config::stereoscopicEyeCount + */ + static size_t getMaxStereoscopicEyes() noexcept; /** * @return EntityManager used by filament @@ -523,11 +784,11 @@ class UTILS_PUBLIC Engine { * `ANativeWindow*`. * @param flags One or more configuration flags as defined in `SwapChain`. * - * @return A pointer to the newly created SwapChain or nullptr if it couldn't be created. + * @return A pointer to the newly created SwapChain. * * @see Renderer.beginFrame() */ - SwapChain* createSwapChain(void* nativeWindow, uint64_t flags = 0) noexcept; + SwapChain* UTILS_NONNULL createSwapChain(void* UTILS_NULLABLE nativeWindow, uint64_t flags = 0) noexcept; /** @@ -537,42 +798,42 @@ class UTILS_PUBLIC Engine { * @param height Height of the drawing buffer in pixels. * @param flags One or more configuration flags as defined in `SwapChain`. * - * @return A pointer to the newly created SwapChain or nullptr if it couldn't be created. + * @return A pointer to the newly created SwapChain. * * @see Renderer.beginFrame() */ - SwapChain* createSwapChain(uint32_t width, uint32_t height, uint64_t flags = 0) noexcept; + SwapChain* UTILS_NONNULL createSwapChain(uint32_t width, uint32_t height, uint64_t flags = 0) noexcept; /** * Creates a renderer associated to this engine. * * A Renderer is intended to map to a *window* on screen. * - * @return A pointer to the newly created Renderer or nullptr if it couldn't be created. + * @return A pointer to the newly created Renderer. */ - Renderer* createRenderer() noexcept; + Renderer* UTILS_NONNULL createRenderer() noexcept; /** * Creates a View. * - * @return A pointer to the newly created View or nullptr if it couldn't be created. + * @return A pointer to the newly created View. */ - View* createView() noexcept; + View* UTILS_NONNULL createView() noexcept; /** * Creates a Scene. * - * @return A pointer to the newly created Scene or nullptr if it couldn't be created. + * @return A pointer to the newly created Scene. */ - Scene* createScene() noexcept; + Scene* UTILS_NONNULL createScene() noexcept; /** * Creates a Camera component. * * @param entity Entity to add the camera component to. - * @return A pointer to the newly created Camera or nullptr if it couldn't be created. + * @return A pointer to the newly created Camera. */ - Camera* createCamera(utils::Entity entity) noexcept; + Camera* UTILS_NONNULL createCamera(utils::Entity entity) noexcept; /** * Returns the Camera component of the given entity. @@ -582,7 +843,7 @@ class UTILS_PUBLIC Engine { * have a Camera component. The pointer is valid until destroyCameraComponent() * is called or the entity itself is destroyed. */ - Camera* getCameraComponent(utils::Entity entity) noexcept; + Camera* UTILS_NULLABLE getCameraComponent(utils::Entity entity) noexcept; /** * Destroys the Camera component associated with the given entity. @@ -594,17 +855,17 @@ class UTILS_PUBLIC Engine { /** * Creates a Fence. * - * @return A pointer to the newly created Fence or nullptr if it couldn't be created. + * @return A pointer to the newly created Fence. */ - Fence* createFence() noexcept; + Fence* UTILS_NONNULL createFence() noexcept; - bool destroy(const BufferObject* p); //!< Destroys a BufferObject object. - bool destroy(const VertexBuffer* p); //!< Destroys an VertexBuffer object. - bool destroy(const Fence* p); //!< Destroys a Fence object. - bool destroy(const IndexBuffer* p); //!< Destroys an IndexBuffer object. - bool destroy(const SkinningBuffer* p); //!< Destroys a SkinningBuffer object. - bool destroy(const MorphTargetBuffer* p); //!< Destroys a MorphTargetBuffer object. - bool destroy(const IndirectLight* p); //!< Destroys an IndirectLight object. + bool destroy(const BufferObject* UTILS_NULLABLE p); //!< Destroys a BufferObject object. + bool destroy(const VertexBuffer* UTILS_NULLABLE p); //!< Destroys an VertexBuffer object. + bool destroy(const Fence* UTILS_NULLABLE p); //!< Destroys a Fence object. + bool destroy(const IndexBuffer* UTILS_NULLABLE p); //!< Destroys an IndexBuffer object. + bool destroy(const SkinningBuffer* UTILS_NULLABLE p); //!< Destroys a SkinningBuffer object. + bool destroy(const MorphTargetBuffer* UTILS_NULLABLE p); //!< Destroys a MorphTargetBuffer object. + bool destroy(const IndirectLight* UTILS_NULLABLE p); //!< Destroys an IndirectLight object. /** * Destroys a Material object @@ -614,18 +875,88 @@ class UTILS_PUBLIC Engine { * @exception utils::PreConditionPanic is thrown if some MaterialInstances remain. * no-op if exceptions are disabled and some MaterialInstances remain. */ - bool destroy(const Material* p); - bool destroy(const MaterialInstance* p); //!< Destroys a MaterialInstance object. - bool destroy(const Renderer* p); //!< Destroys a Renderer object. - bool destroy(const Scene* p); //!< Destroys a Scene object. - bool destroy(const Skybox* p); //!< Destroys a SkyBox object. - bool destroy(const ColorGrading* p); //!< Destroys a ColorGrading object. - bool destroy(const SwapChain* p); //!< Destroys a SwapChain object. - bool destroy(const Stream* p); //!< Destroys a Stream object. - bool destroy(const Texture* p); //!< Destroys a Texture object. - bool destroy(const RenderTarget* p); //!< Destroys a RenderTarget object. - bool destroy(const View* p); //!< Destroys a View object. - void destroy(utils::Entity e); //!< Destroys all filament-known components from this entity + bool destroy(const Material* UTILS_NULLABLE p); + bool destroy(const MaterialInstance* UTILS_NULLABLE p); //!< Destroys a MaterialInstance object. + bool destroy(const Renderer* UTILS_NULLABLE p); //!< Destroys a Renderer object. + bool destroy(const Scene* UTILS_NULLABLE p); //!< Destroys a Scene object. + bool destroy(const Skybox* UTILS_NULLABLE p); //!< Destroys a SkyBox object. + bool destroy(const ColorGrading* UTILS_NULLABLE p); //!< Destroys a ColorGrading object. + bool destroy(const SwapChain* UTILS_NULLABLE p); //!< Destroys a SwapChain object. + bool destroy(const Stream* UTILS_NULLABLE p); //!< Destroys a Stream object. + bool destroy(const Texture* UTILS_NULLABLE p); //!< Destroys a Texture object. + bool destroy(const RenderTarget* UTILS_NULLABLE p); //!< Destroys a RenderTarget object. + bool destroy(const View* UTILS_NULLABLE p); //!< Destroys a View object. + bool destroy(const InstanceBuffer* UTILS_NULLABLE p); //!< Destroys an InstanceBuffer object. + void destroy(utils::Entity e); //!< Destroys all filament-known components from this entity + + /** Tells whether a BufferObject object is valid */ + bool isValid(const BufferObject* UTILS_NULLABLE p) const; + /** Tells whether an VertexBuffer object is valid */ + bool isValid(const VertexBuffer* UTILS_NULLABLE p) const; + /** Tells whether a Fence object is valid */ + bool isValid(const Fence* UTILS_NULLABLE p) const; + /** Tells whether an IndexBuffer object is valid */ + bool isValid(const IndexBuffer* UTILS_NULLABLE p) const; + /** Tells whether a SkinningBuffer object is valid */ + bool isValid(const SkinningBuffer* UTILS_NULLABLE p) const; + /** Tells whether a MorphTargetBuffer object is valid */ + bool isValid(const MorphTargetBuffer* UTILS_NULLABLE p) const; + /** Tells whether an IndirectLight object is valid */ + bool isValid(const IndirectLight* UTILS_NULLABLE p) const; + /** Tells whether an Material object is valid */ + bool isValid(const Material* UTILS_NULLABLE p) const; + /** Tells whether an MaterialInstance object is valid. Use this if you already know + * which Material this MaterialInstance belongs to. DO NOT USE getMaterial(), this would + * defeat the purpose of validating the MaterialInstance. + */ + bool isValid(const Material* UTILS_NONNULL m, const MaterialInstance* UTILS_NULLABLE p) const; + /** Tells whether an MaterialInstance object is valid. Use this if the Material the + * MaterialInstance belongs to is not known. This method can be expensive. + */ + bool isValidExpensive(const MaterialInstance* UTILS_NULLABLE p) const; + /** Tells whether a Renderer object is valid */ + bool isValid(const Renderer* UTILS_NULLABLE p) const; + /** Tells whether a Scene object is valid */ + bool isValid(const Scene* UTILS_NULLABLE p) const; + /** Tells whether a SkyBox object is valid */ + bool isValid(const Skybox* UTILS_NULLABLE p) const; + /** Tells whether a ColorGrading object is valid */ + bool isValid(const ColorGrading* UTILS_NULLABLE p) const; + /** Tells whether a SwapChain object is valid */ + bool isValid(const SwapChain* UTILS_NULLABLE p) const; + /** Tells whether a Stream object is valid */ + bool isValid(const Stream* UTILS_NULLABLE p) const; + /** Tells whether a Texture object is valid */ + bool isValid(const Texture* UTILS_NULLABLE p) const; + /** Tells whether a RenderTarget object is valid */ + bool isValid(const RenderTarget* UTILS_NULLABLE p) const; + /** Tells whether a View object is valid */ + bool isValid(const View* UTILS_NULLABLE p) const; + /** Tells whether an InstanceBuffer object is valid */ + bool isValid(const InstanceBuffer* UTILS_NULLABLE p) const; + + /** + * Retrieve the count of each resource tracked by Engine. + * This is intended for debugging. + * @{ + */ + size_t getBufferObjectCount() const noexcept; + size_t getViewCount() const noexcept; + size_t getSceneCount() const noexcept; + size_t getSwapChainCount() const noexcept; + size_t getStreamCount() const noexcept; + size_t getIndexBufferCount() const noexcept; + size_t getSkinningBufferCount() const noexcept; + size_t getMorphTargetBufferCount() const noexcept; + size_t getInstanceBufferCount() const noexcept; + size_t getVertexBufferCount() const noexcept; + size_t getIndirectLightCount() const noexcept; + size_t getMaterialCount() const noexcept; + size_t getTextureCount() const noexcept; + size_t getSkyboxeCount() const noexcept; + size_t getColorGradingCount() const noexcept; + size_t getRenderTargetCount() const noexcept; + /** @} */ /** * Kicks the hardware thread (e.g. the OpenGL, Vulkan or Metal thread) and blocks until @@ -648,6 +979,30 @@ class UTILS_PUBLIC Engine { */ void flush(); + /** + * Get paused state of rendering thread. + * + *

    Warning: This is an experimental API. + * + * @see setPaused + */ + bool isPaused() const noexcept; + + /** + * Pause or resume rendering thread. + * + *

    Warning: This is an experimental API. In particular, note the following caveats. + * + *

    • + * Buffer callbacks will never be called as long as the rendering thread is paused. + * Do not rely on a buffer callback to unpause the thread. + *
    • + * While the rendering thread is paused, rendering commands will continue to be queued until the + * buffer limit is reached. When the limit is reached, the program will abort. + *
    + */ + void setPaused(bool paused); + /** * Drains the user callback message queue and immediately execute all pending callbacks. * @@ -658,6 +1013,14 @@ class UTILS_PUBLIC Engine { */ void pumpMessageQueues(); + /** + * Switch the command queue to unprotected mode. Protected mode can be activated via + * Renderer::beginFrame() using a protected SwapChain. + * @see Renderer + * @see SwapChain + */ + void unprotected() noexcept; + /** * Returns the default Material. * @@ -665,7 +1028,7 @@ class UTILS_PUBLIC Engine { * * @return A pointer to the default Material instance (a singleton). */ - const Material* getDefaultMaterial() const noexcept; + Material const* UTILS_NONNULL getDefaultMaterial() const noexcept; /** * Returns the resolved backend. @@ -696,7 +1059,7 @@ class UTILS_PUBLIC Engine { * @return A pointer to the Platform object that was provided to Engine::create, or the * Filament-created one. */ - Platform* getPlatform() const noexcept; + Platform* UTILS_NULLABLE getPlatform() const noexcept; /** * Allocate a small amount of memory directly in the command stream. The allocated memory is @@ -709,7 +1072,7 @@ class UTILS_PUBLIC Engine { * @note there is no need to destroy this buffer, it will be freed automatically when * the current command buffer is executed. */ - void* streamAlloc(size_t size, size_t alignment = alignof(double)) noexcept; + void* UTILS_NULLABLE streamAlloc(size_t size, size_t alignment = alignof(double)) noexcept; /** * Invokes one iteration of the render loop, used only on single-threaded platforms. @@ -728,21 +1091,67 @@ class UTILS_PUBLIC Engine { #if defined(__EMSCRIPTEN__) /** * WebGL only: Tells the driver to reset any internal state tracking if necessary. - * - * This is only useful when integrating an external renderer into Filament on platforms + * + * This is only useful when integrating an external renderer into Filament on platforms * like WebGL, where share contexts do not exist. Filament keeps track of the GL * state it has set (like which texture is bound), and does not re-set that state if * it does not think it needs to. However, if an external renderer has set different * state in the mean time, Filament will use that new state unknowingly. - * - * If you are in this situation, call this function - ideally only once per frame, + * + * If you are in this situation, call this function - ideally only once per frame, * immediately after calling Engine::execute(). */ void resetBackendState() noexcept; #endif + /** + * Get the current time. This is a convenience function that simply returns the + * time in nanosecond since epoch of std::chrono::steady_clock. + * A possible implementation is: + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * return std::chrono::steady_clock::now().time_since_epoch().count(); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * + * @return current time in nanosecond since epoch of std::chrono::steady_clock. + * @see Renderer::beginFrame() + */ + static uint64_t getSteadyClockTimeNano() noexcept; + + DebugRegistry& getDebugRegistry() noexcept; + /** + * Check if a feature flag exists + * @param name name of the feature flag to check + * @return true if the feature flag exists, false otherwise + */ + inline bool hasFeatureFlag(char const* UTILS_NONNULL name) noexcept { + return getFeatureFlag(name).has_value(); + } + + /** + * Set the value of a non-constant feature flag. + * @param name name of the feature flag to set + * @param value value to set + * @return true if the value was set, false if the feature flag is constant or doesn't exist. + */ + bool setFeatureFlag(char const* UTILS_NONNULL name, bool value) noexcept; + + /** + * Retrieves the value of any feature flag. + * @param name name of the feature flag + * @return the value of the flag if it exists + */ + std::optional getFeatureFlag(char const* UTILS_NONNULL name) const noexcept; + + /** + * Returns a pointer to a non-constant feature flag value. + * @param name name of the feature flag + * @return a pointer to the feature flag value, or nullptr if the feature flag is constant or doesn't exist + */ + bool* UTILS_NULLABLE getFeatureFlagPtr(char const* UTILS_NONNULL name) const noexcept; + protected: //! \privatesection Engine() noexcept = default; diff --git a/filament/include/filament/Fence.h b/filament/include/filament/Fence.h index f54db8737c5..673d12cdb92 100644 --- a/filament/include/filament/Fence.h +++ b/filament/include/filament/Fence.h @@ -25,14 +25,12 @@ #include +#include + namespace filament { /** - * Fence is used to synchronize rendering operations together, with the CPU or with compute. - * - * \note - * Currently Fence only provide client-side synchronization. - * + * Fence is used to synchronize the application main thread with filament's rendering thread. */ class UTILS_PUBLIC Fence : public FilamentAPI { public: @@ -78,7 +76,11 @@ class UTILS_PUBLIC Fence : public FilamentAPI { * @return FenceStatus::CONDITION_SATISFIED on success, * FenceStatus::ERROR otherwise. */ - static FenceStatus waitAndDestroy(Fence* fence, Mode mode = Mode::FLUSH); + static FenceStatus waitAndDestroy(Fence* UTILS_NONNULL fence, Mode mode = Mode::FLUSH); + +protected: + // prevent heap allocation + ~Fence() = default; }; } // namespace filament diff --git a/filament/include/filament/FilamentAPI.h b/filament/include/filament/FilamentAPI.h index 2925aca4a5c..7fa19433847 100644 --- a/filament/include/filament/FilamentAPI.h +++ b/filament/include/filament/FilamentAPI.h @@ -19,6 +19,7 @@ #include #include +#include #include @@ -49,13 +50,28 @@ class UTILS_PUBLIC FilamentAPI { // prevent heap allocation static void *operator new (size_t) = delete; static void *operator new[] (size_t) = delete; - static void operator delete (void*) = delete; - static void operator delete[](void*) = delete; }; template using BuilderBase = utils::PrivateImplementation; +// This needs to be public because it is used in the following template. +UTILS_PUBLIC void builderMakeName(utils::CString& outName, const char* name, size_t len) noexcept; + +template +class UTILS_PUBLIC BuilderNameMixin { +public: + Builder& name(const char* name, size_t len) noexcept { + builderMakeName(mName, name, len); + return static_cast(*this); + } + + utils::CString const& getName() const noexcept { return mName; } + +private: + utils::CString mName; +}; + } // namespace filament #endif // TNT_FILAMENT_FILAMENTAPI_H diff --git a/filament/include/filament/Frustum.h b/filament/include/filament/Frustum.h index bfd01b04362..ceec55eb823 100644 --- a/filament/include/filament/Frustum.h +++ b/filament/include/filament/Frustum.h @@ -23,9 +23,12 @@ #include #include +#include #include // Because we define NEAR and FAR in the Plane enum. +#include + namespace filament { class Box; @@ -76,14 +79,14 @@ class UTILS_PUBLIC Frustum { * @param planes six plane equations encoded as in getNormalizedPlane() in * left, right, bottom, top, far, near order */ - void getNormalizedPlanes(math::float4 planes[6]) const noexcept; + void getNormalizedPlanes(math::float4 planes[UTILS_NONNULL 6]) const noexcept; /** * Returns all six frustum planes in left, right, bottom, top, far, near order * @return six plane equations encoded as in getNormalizedPlane() in * left, right, bottom, top, far, near order */ - math::float4 const* getNormalizedPlanes() const noexcept { return mPlanes; } + math::float4 const* UTILS_NONNULL getNormalizedPlanes() const noexcept { return mPlanes; } /** * Returns whether a box intersects the frustum (i.e. is visible) diff --git a/filament/include/filament/IndexBuffer.h b/filament/include/filament/IndexBuffer.h index 09b479296d5..57c95921d7c 100644 --- a/filament/include/filament/IndexBuffer.h +++ b/filament/include/filament/IndexBuffer.h @@ -27,6 +27,7 @@ #include +#include #include namespace filament { @@ -58,7 +59,7 @@ class UTILS_PUBLIC IndexBuffer : public FilamentAPI { UINT = uint8_t(backend::ElementType::UINT), //!< 32-bit indices }; - class Builder : public BuilderBase { + class Builder : public BuilderBase, public BuilderNameMixin { friend struct BuilderDetails; public: Builder() noexcept; @@ -82,14 +83,28 @@ class UTILS_PUBLIC IndexBuffer : public FilamentAPI { */ Builder& bufferType(IndexType indexType) noexcept; + /** + * Associate an optional name with this IndexBuffer for debugging purposes. + * + * name will show in error messages and should be kept as short as possible. The name is + * truncated to a maximum of 128 characters. + * + * The name string is copied during this method so clients may free its memory after + * the function returns. + * + * @param name A string to identify this IndexBuffer + * @param len Length of name, should be less than or equal to 128 + * @return This Builder, for chaining calls. + */ + Builder& name(const char* UTILS_NONNULL name, size_t len) noexcept; + /** * Creates the IndexBuffer object and returns a pointer to it. After creation, the index * buffer is uninitialized. Use IndexBuffer::setBuffer() to initialize the IndexBuffer. * * @param engine Reference to the filament::Engine to associate this IndexBuffer with. * - * @return pointer to the newly created object or nullptr if exceptions are disabled and - * an error occurred. + * @return pointer to the newly created object. * * @exception utils::PostConditionPanic if a runtime error occurred, such as running out of * memory or other resources. @@ -97,7 +112,7 @@ class UTILS_PUBLIC IndexBuffer : public FilamentAPI { * * @see IndexBuffer::setBuffer */ - IndexBuffer* build(Engine& engine); + IndexBuffer* UTILS_NONNULL build(Engine& engine); private: friend class FIndexBuffer; }; @@ -118,6 +133,10 @@ class UTILS_PUBLIC IndexBuffer : public FilamentAPI { * @return The number of indices the IndexBuffer holds. */ size_t getIndexCount() const noexcept; + +protected: + // prevent heap allocation + ~IndexBuffer() = default; }; } // namespace filament diff --git a/filament/include/filament/IndirectLight.h b/filament/include/filament/IndirectLight.h index 70448523b77..c4cc62ecd79 100644 --- a/filament/include/filament/IndirectLight.h +++ b/filament/include/filament/IndirectLight.h @@ -25,6 +25,8 @@ #include +#include + namespace filament { class Engine; @@ -114,7 +116,7 @@ class UTILS_PUBLIC IndirectLight : public FilamentAPI { * @return This Builder, for chaining calls. * */ - Builder& reflections(Texture const* cubemap) noexcept; + Builder& reflections(Texture const* UTILS_NULLABLE cubemap) noexcept; /** * Sets the irradiance as Spherical Harmonics. @@ -156,11 +158,13 @@ class UTILS_PUBLIC IndirectLight : public FilamentAPI { * * @return This Builder, for chaining calls. * + * @see Material::Builder::sphericalHarmonicsBandCount() + * * @note * Because the coefficients are pre-scaled, `sh[0]` is the environment's * average irradiance. */ - Builder& irradiance(uint8_t bands, math::float3 const* sh) noexcept; + Builder& irradiance(uint8_t bands, math::float3 const* UTILS_NONNULL sh) noexcept; /** * Sets the irradiance from the radiance expressed as Spherical Harmonics. @@ -192,7 +196,7 @@ class UTILS_PUBLIC IndirectLight : public FilamentAPI { * * @return This Builder, for chaining calls. */ - Builder& radiance(uint8_t bands, math::float3 const* sh) noexcept; + Builder& radiance(uint8_t bands, math::float3 const* UTILS_NONNULL sh) noexcept; /** * Sets the irradiance as a cubemap. @@ -211,7 +215,7 @@ class UTILS_PUBLIC IndirectLight : public FilamentAPI { * * @see irradiance(uint8_t bands, math::float3 const* sh) */ - Builder& irradiance(Texture const* cubemap) noexcept; + Builder& irradiance(Texture const* UTILS_NULLABLE cubemap) noexcept; /** * (optional) Environment intensity. @@ -247,7 +251,7 @@ class UTILS_PUBLIC IndirectLight : public FilamentAPI { * memory or other resources. * @exception utils::PreConditionPanic if a parameter to a builder function was invalid. */ - IndirectLight* build(Engine& engine); + IndirectLight* UTILS_NONNULL build(Engine& engine); private: friend class FIndirectLight; @@ -284,12 +288,12 @@ class UTILS_PUBLIC IndirectLight : public FilamentAPI { /** * Returns the associated reflection map, or null if it does not exist. */ - Texture const* getReflectionsTexture() const noexcept; + Texture const* UTILS_NULLABLE getReflectionsTexture() const noexcept; /** * Returns the associated irradiance map, or null if it does not exist. */ - Texture const* getIrradianceTexture() const noexcept; + Texture const* UTILS_NULLABLE getIrradianceTexture() const noexcept; /** * Helper to estimate the direction of the dominant light in the environment represented by @@ -312,7 +316,7 @@ class UTILS_PUBLIC IndirectLight : public FilamentAPI { * @see LightManager::Builder::direction() * @see getColorEstimate() */ - static math::float3 getDirectionEstimate(const math::float3 sh[9]) noexcept; + static math::float3 getDirectionEstimate(const math::float3 sh[UTILS_NONNULL 9]) noexcept; /** * Helper to estimate the color and relative intensity of the environment represented by @@ -332,7 +336,8 @@ class UTILS_PUBLIC IndirectLight : public FilamentAPI { * @see LightManager::Builder::intensity() * @see getDirectionEstimate, getIntensity, setIntensity */ - static math::float4 getColorEstimate(const math::float3 sh[9], math::float3 direction) noexcept; + static math::float4 getColorEstimate(const math::float3 sh[UTILS_NONNULL 9], + math::float3 direction) noexcept; /** @deprecated use static versions instead */ @@ -342,6 +347,10 @@ class UTILS_PUBLIC IndirectLight : public FilamentAPI { /** @deprecated use static versions instead */ UTILS_DEPRECATED math::float4 getColorEstimate(math::float3 direction) const noexcept; + +protected: + // prevent heap allocation + ~IndirectLight() = default; }; } // namespace filament diff --git a/filament/include/filament/InstanceBuffer.h b/filament/include/filament/InstanceBuffer.h new file mode 100644 index 00000000000..b744e32c7be --- /dev/null +++ b/filament/include/filament/InstanceBuffer.h @@ -0,0 +1,121 @@ +/* +* Copyright (C) 2023 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#ifndef TNT_FILAMENT_INSTANCEBUFFER_H +#define TNT_FILAMENT_INSTANCEBUFFER_H + +#include +#include + +#include + +#include + +#include + +namespace filament { + +/** + * InstanceBuffer holds draw (GPU) instance transforms. These can be provided to a renderable to + * "offset" each draw instance. + * + * @see RenderableManager::Builder::instances(size_t, InstanceBuffer*) + */ +class UTILS_PUBLIC InstanceBuffer : public FilamentAPI { + struct BuilderDetails; + +public: + class Builder : public BuilderBase, public BuilderNameMixin { + friend struct BuilderDetails; + + public: + + /** + * @param instanceCount the number of instances this InstanceBuffer will support, must be + * >= 1 and <= \c Engine::getMaxAutomaticInstances() + * @see Engine::getMaxAutomaticInstances + */ + explicit Builder(size_t instanceCount) noexcept; + + Builder(Builder const& rhs) noexcept; + Builder(Builder&& rhs) noexcept; + ~Builder() noexcept; + Builder& operator=(Builder const& rhs) noexcept; + Builder& operator=(Builder&& rhs) noexcept; + + /** + * Provide an initial local transform for each instance. Each local transform is relative to + * the transform of the associated renderable. This forms a parent-child relationship + * between the renderable and its instances, so adjusting the renderable's transform will +- * affect all instances. + * + * The array of math::mat4f must have length instanceCount, provided when constructing this + * Builder. + * + * @param localTransforms an array of math::mat4f with length instanceCount, must remain + * valid until after build() is called + */ + Builder& localTransforms(math::mat4f const* UTILS_NULLABLE localTransforms) noexcept; + + /** + * Associate an optional name with this InstanceBuffer for debugging purposes. + * + * name will show in error messages and should be kept as short as possible. The name is + * truncated to a maximum of 128 characters. + * + * The name string is copied during this method so clients may free its memory after + * the function returns. + * + * @param name A string to identify this InstanceBuffer + * @param len Length of name, should be less than or equal to 128 + * @return This Builder, for chaining calls. + */ + Builder& name(const char* UTILS_NONNULL name, size_t len) noexcept; + + /** + * Creates the InstanceBuffer object and returns a pointer to it. + */ + InstanceBuffer* UTILS_NONNULL build(Engine& engine); + + private: + friend class FInstanceBuffer; + }; + + /** + * Returns the instance count specified when building this InstanceBuffer. + */ + size_t getInstanceCount() const noexcept; + + /** + * Sets the local transform for each instance. Each local transform is relative to the transform + * of the associated renderable. This forms a parent-child relationship between the renderable + * and its instances, so adjusting the renderable's transform will affect all instances. + * + * @param localTransforms an array of math::mat4f with length count, need not outlive this call + * @param count the number of local transforms + * @param offset index of the first instance to set local transforms + */ + void setLocalTransforms(math::mat4f const* UTILS_NONNULL localTransforms, + size_t count, size_t offset = 0); + +protected: + // prevent heap allocation + ~InstanceBuffer() = default; +}; + +} // namespace filament + +#endif //TNT_FILAMENT_INSTANCEBUFFER_H diff --git a/filament/include/filament/LightManager.h b/filament/include/filament/LightManager.h index b764fb6bb26..22d663f2ea4 100644 --- a/filament/include/filament/LightManager.h +++ b/filament/include/filament/LightManager.h @@ -25,6 +25,10 @@ #include #include +#include + +#include +#include namespace utils { class Entity; @@ -142,20 +146,13 @@ class UTILS_PUBLIC LightManager : public FilamentAPI { using Instance = utils::EntityInstance; /** - * Returns the number of component in the LightManager, not that component are not + * Returns the number of component in the LightManager, note that component are not * guaranteed to be active. Use the EntityManager::isAlive() before use if needed. * * @return number of component in the LightManager */ size_t getComponentCount() const noexcept; - /** - * Returns the list of Entity for all components. Use getComponentCount() to know the size - * of the list. - * @return a pointer to Entity - */ - utils::Entity const* getEntities() const noexcept; - /** * Returns whether a particular Entity is associated with a component of this LightManager * @param e An Entity. @@ -163,6 +160,24 @@ class UTILS_PUBLIC LightManager : public FilamentAPI { */ bool hasComponent(utils::Entity e) const noexcept; + /** + * @return true if the this manager has no components + */ + bool empty() const noexcept; + + /** + * Retrieve the `Entity` of the component from its `Instance`. + * @param i Instance of the component obtained from getInstance() + * @return + */ + utils::Entity getEntity(Instance i) const noexcept; + + /** + * Retrieve the Entities of all the components of this manager. + * @return A list, in no particular order, of all the entities managed by this manager. + */ + utils::Entity const* UTILS_NONNULL getEntities() const noexcept; + /** * Gets an Instance representing the Light component associated with the given Entity. * @param e An Entity. @@ -244,6 +259,7 @@ class UTILS_PUBLIC LightManager : public FilamentAPI { * shadows that are too far and wouldn't contribute to the scene much, improving * performance and quality. This value is always positive. * Use 0.0f to use the camera far distance. + * This only affect directional lights. */ float shadowFar = 0.0f; @@ -360,6 +376,13 @@ class UTILS_PUBLIC LightManager : public FilamentAPI { * enabled. (2cm by default). */ float shadowBulbRadius = 0.02f; + + /** + * Transforms the shadow direction. Must be a unit quaternion. + * The default is identity. + * Ignored if the light type isn't directional. For artistic use. Use with caution. + */ + math::quatf transform{ 1.0f }; }; struct ShadowCascades { @@ -371,7 +394,7 @@ class UTILS_PUBLIC LightManager : public FilamentAPI { * positions into * @param cascades the number of shadow cascades, at most 4 */ - static void computeUniformSplits(float* splitPositions, uint8_t cascades); + static void computeUniformSplits(float* UTILS_NONNULL splitPositions, uint8_t cascades); /** * Utility method to compute ShadowOptions::cascadeSplitPositions according to a logarithmic @@ -383,7 +406,7 @@ class UTILS_PUBLIC LightManager : public FilamentAPI { * @param near the camera near plane * @param far the camera far plane */ - static void computeLogSplits(float* splitPositions, uint8_t cascades, + static void computeLogSplits(float* UTILS_NONNULL splitPositions, uint8_t cascades, float near, float far); /** @@ -403,7 +426,7 @@ class UTILS_PUBLIC LightManager : public FilamentAPI { * @param lambda a float in the range [0, 1] that interpolates between log and * uniform split schemes */ - static void computePracticalSplits(float* splitPositions, uint8_t cascades, + static void computePracticalSplits(float* UTILS_NONNULL splitPositions, uint8_t cascades, float near, float far, float lambda); }; @@ -671,7 +694,7 @@ class UTILS_PUBLIC LightManager : public FilamentAPI { * @return true is this light is a type of directional light */ inline bool isDirectional(Instance i) const noexcept { - Type type = getType(i); + Type const type = getType(i); return type == Type::DIRECTIONAL || type == Type::SUN; } @@ -692,7 +715,7 @@ class UTILS_PUBLIC LightManager : public FilamentAPI { * @return true is this light is a type of spot light */ inline bool isSpotLight(Instance i) const noexcept { - Type type = getType(i); + Type const type = getType(i); return type == Type::SPOT || type == Type::FOCUSED_SPOT; } @@ -944,19 +967,9 @@ class UTILS_PUBLIC LightManager : public FilamentAPI { */ bool isShadowCaster(Instance i) const noexcept; - /** - * Helper to process all components with a given function - * @tparam F a void(Entity entity, Instance instance) - * @param func a function of type F - */ - template - void forEachComponent(F func) noexcept { - utils::Entity const* const pEntity = getEntities(); - for (size_t i = 0, c = getComponentCount(); i < c; i++) { - // Instance 0 is the invalid instance - func(pEntity[i], Instance(i + 1)); - } - } +protected: + // prevent heap allocation + ~LightManager() = default; }; } // namespace filament diff --git a/filament/include/filament/Material.h b/filament/include/filament/Material.h index 572de844547..b7333f2937c 100644 --- a/filament/include/filament/Material.h +++ b/filament/include/filament/Material.h @@ -22,13 +22,20 @@ #include #include +#include #include #include +#include #include +#include +#include + +#include #include +#include namespace utils { class CString; @@ -48,11 +55,11 @@ class UTILS_PUBLIC Material : public FilamentAPI { struct BuilderDetails; public: - using BlendingMode = BlendingMode; - using Shading = Shading; - using Interpolation = Interpolation; - using VertexDomain = VertexDomain; - using TransparencyMode = TransparencyMode; + using BlendingMode = filament::BlendingMode; + using Shading = filament::Shading; + using Interpolation = filament::Interpolation; + using VertexDomain = filament::VertexDomain; + using TransparencyMode = filament::TransparencyMode; using ParameterType = backend::UniformType; using Precision = backend::Precision; @@ -67,7 +74,7 @@ class UTILS_PUBLIC Material : public FilamentAPI { */ struct ParameterInfo { //! Name of the parameter. - const char* name; + const char* UTILS_NONNULL name; //! Whether the parameter is a sampler (texture). bool isSampler; //! Whether the parameter is a subpass type. @@ -96,6 +103,11 @@ class UTILS_PUBLIC Material : public FilamentAPI { Builder& operator=(Builder const& rhs) noexcept; Builder& operator=(Builder&& rhs) noexcept; + enum class ShadowSamplingQuality : uint8_t { + HARD, // 2x2 PCF + LOW // 3x3 gaussian filter + }; + /** * Specifies the material data. The material data is a binary blob produced by * libfilamat or by matc. @@ -103,7 +115,55 @@ class UTILS_PUBLIC Material : public FilamentAPI { * @param payload Pointer to the material data, must stay valid until build() is called. * @param size Size of the material data pointed to by "payload" in bytes. */ - Builder& package(const void* payload, size_t size); + Builder& package(const void* UTILS_NONNULL payload, size_t size); + + template + using is_supported_constant_parameter_t = std::enable_if_t< + std::is_same_v || + std::is_same_v || + std::is_same_v>; + + /** + * Specialize a constant parameter specified in the material definition with a concrete + * value for this material. Once build() is called, this constant cannot be changed. + * Will throw an exception if the name does not match a constant specified in the + * material definition or if the type provided does not match. + * + * @tparam T The type of constant parameter, either int32_t, float, or bool. + * @param name The name of the constant parameter specified in the material definition, such + * as "myConstant". + * @param nameLength Length in `char` of the name parameter. + * @param value The value to use for the constant parameter, must match the type specified + * in the material definition. + */ + template> + Builder& constant(const char* UTILS_NONNULL name, size_t nameLength, T value); + + /** inline helper to provide the constant name as a null-terminated C string */ + template> + inline Builder& constant(const char* UTILS_NONNULL name, T value) { + return constant(name, strlen(name), value); + } + + /** + * Sets the quality of the indirect lights computations. This is only taken into account + * if this material is lit and in the surface domain. This setting will affect the + * IndirectLight computation if one is specified on the Scene and Spherical Harmonics + * are used for the irradiance. + * + * @param shBandCount Number of spherical harmonic bands. Must be 1, 2 or 3 (default). + * @return Reference to this Builder for chaining calls. + * @see IndirectLight + */ + Builder& sphericalHarmonicsBandCount(size_t shBandCount) noexcept; + + /** + * Set the quality of shadow sampling. This is only taken into account + * if this material is lit and in the surface domain. + * @param quality + * @return + */ + Builder& shadowSamplingQuality(ShadowSamplingQuality quality) noexcept; /** * Creates the Material object and returns a pointer to it. @@ -117,11 +177,70 @@ class UTILS_PUBLIC Material : public FilamentAPI { * memory or other resources. * @exception utils::PreConditionPanic if a parameter to a builder function was invalid. */ - Material* build(Engine& engine); + Material* UTILS_NULLABLE build(Engine& engine) const; private: friend class FMaterial; }; + using CompilerPriorityQueue = backend:: CompilerPriorityQueue; + + /** + * Asynchronously ensures that a subset of this Material's variants are compiled. After issuing + * several Material::compile() calls in a row, it is recommended to call Engine::flush() + * such that the backend can start the compilation work as soon as possible. + * The provided callback is guaranteed to be called on the main thread after all specified + * variants of the material are compiled. This can take hundreds of milliseconds. + * + * If all the material's variants are already compiled, the callback will be scheduled as + * soon as possible, but this might take a few dozen millisecond, corresponding to how + * many previous frames are enqueued in the backend. This also varies by backend. Therefore, + * it is recommended to only call this method once per material shortly after creation. + * + * If the same variant is scheduled for compilation multiple times, the first scheduling + * takes precedence; later scheduling are ignored. + * + * caveat: A consequence is that if a variant is scheduled on the low priority queue and later + * scheduled again on the high priority queue, the later scheduling is ignored. + * Therefore, the second callback could be called before the variant is compiled. + * However, the first callback, if specified, will trigger as expected. + * + * The callback is guaranteed to be called. If the engine is destroyed while some material + * variants are still compiling or in the queue, these will be discarded and the corresponding + * callback will be called. In that case however the Material pointer passed to the callback + * is guaranteed to be invalid (either because it's been destroyed by the user already, or, + * because it's been cleaned-up by the Engine). + * + * UserVariantFilterMask::ALL should be used with caution. Only variants that an application + * needs should be included in the variants argument. For example, the STE variant is only used + * for stereoscopic rendering. If an application is not planning to render in stereo, this bit + * should be turned off to avoid unnecessary material compilations. + * + * @param priority Which priority queue to use, LOW or HIGH. + * @param variants Variants to include to the compile command. + * @param handler Handler to dispatch the callback or nullptr for the default handler + * @param callback callback called on the main thread when the compilation is done on + * by backend. + */ + void compile(CompilerPriorityQueue priority, + UserVariantFilterMask variants, + backend::CallbackHandler* UTILS_NULLABLE handler = nullptr, + utils::Invocable&& callback = {}) noexcept; + + inline void compile(CompilerPriorityQueue priority, + UserVariantFilterBit variants, + backend::CallbackHandler* UTILS_NULLABLE handler = nullptr, + utils::Invocable&& callback = {}) noexcept { + compile(priority, UserVariantFilterMask(variants), handler, + std::forward>(callback)); + } + + inline void compile(CompilerPriorityQueue priority, + backend::CallbackHandler* UTILS_NULLABLE handler = nullptr, + utils::Invocable&& callback = {}) noexcept { + compile(priority, UserVariantFilterBit::ALL, handler, + std::forward>(callback)); + } + /** * Creates a new instance of this material. Material instances should be freed using * Engine::destroy(const MaterialInstance*). @@ -131,13 +250,13 @@ class UTILS_PUBLIC Material : public FilamentAPI { * * @return A pointer to the new instance. */ - MaterialInstance* createInstance(const char* name = nullptr) const noexcept; + MaterialInstance* UTILS_NONNULL createInstance(const char* UTILS_NULLABLE name = nullptr) const noexcept; //! Returns the name of this material as a null-terminated string. - const char* getName() const noexcept; + const char* UTILS_NONNULL getName() const noexcept; //! Returns the shading model of this material. - Shading getShading() const noexcept; + Shading getShading() const noexcept; //! Returns the interpolation mode of this material. This affects how variables are interpolated. Interpolation getInterpolation() const noexcept; @@ -148,6 +267,9 @@ class UTILS_PUBLIC Material : public FilamentAPI { //! Returns the vertex domain of this material. VertexDomain getVertexDomain() const noexcept; + //! Returns the material's supported variants + UserVariantFilterMask getSupportedVariants() const noexcept; + //! Returns the material domain of this material. //! The material domain determines how the material is used. MaterialDomain getMaterialDomain() const noexcept; @@ -171,6 +293,9 @@ class UTILS_PUBLIC Material : public FilamentAPI { //! Indicates whether this material is double-sided. bool isDoubleSided() const noexcept; + //! Indicates whether this material uses alpha to coverage. + bool isAlphaToCoverageEnabled() const noexcept; + //! Returns the alpha mask threshold used when the blending mode is set to masked. float getMaskThreshold() const noexcept; @@ -199,6 +324,9 @@ class UTILS_PUBLIC Material : public FilamentAPI { //! Returns the reflection mode used by this material. ReflectionMode getReflectionMode() const noexcept; + //! Returns the minimum required feature level for this material. + backend::FeatureLevel getFeatureLevel() const noexcept; + /** * Returns the number of parameters declared by this material. * The returned value can be 0. @@ -214,13 +342,13 @@ class UTILS_PUBLIC Material : public FilamentAPI { * * @return The number of parameters written to the parameters pointer. */ - size_t getParameters(ParameterInfo* parameters, size_t count) const noexcept; + size_t getParameters(ParameterInfo* UTILS_NONNULL parameters, size_t count) const noexcept; //! Indicates whether a parameter of the given name exists on this material. - bool hasParameter(const char* name) const noexcept; + bool hasParameter(const char* UTILS_NONNULL name) const noexcept; //! Indicates whether an existing parameter is a sampler or not. - bool isSampler(const char* name) const noexcept; + bool isSampler(const char* UTILS_NONNULL name) const noexcept; /** * Sets the value of the given parameter on this material's default instance. @@ -231,7 +359,7 @@ class UTILS_PUBLIC Material : public FilamentAPI { * @see getDefaultInstance() */ template - void setDefaultParameter(const char* name, T value) noexcept { + void setDefaultParameter(const char* UTILS_NONNULL name, T value) noexcept { getDefaultInstance()->setParameter(name, value); } @@ -244,8 +372,8 @@ class UTILS_PUBLIC Material : public FilamentAPI { * * @see getDefaultInstance() */ - void setDefaultParameter(const char* name, Texture const* texture, - TextureSampler const& sampler) noexcept { + void setDefaultParameter(const char* UTILS_NONNULL name, + Texture const* UTILS_NULLABLE texture, TextureSampler const& sampler) noexcept { getDefaultInstance()->setParameter(name, texture, sampler); } @@ -258,7 +386,7 @@ class UTILS_PUBLIC Material : public FilamentAPI { * * @see getDefaultInstance() */ - void setDefaultParameter(const char* name, RgbType type, math::float3 color) noexcept { + void setDefaultParameter(const char* UTILS_NONNULL name, RgbType type, math::float3 color) noexcept { getDefaultInstance()->setParameter(name, type, color); } @@ -271,15 +399,19 @@ class UTILS_PUBLIC Material : public FilamentAPI { * * @see getDefaultInstance() */ - void setDefaultParameter(const char* name, RgbaType type, math::float4 color) noexcept { + void setDefaultParameter(const char* UTILS_NONNULL name, RgbaType type, math::float4 color) noexcept { getDefaultInstance()->setParameter(name, type, color); } //! Returns this material's default instance. - MaterialInstance* getDefaultInstance() noexcept; + MaterialInstance* UTILS_NONNULL getDefaultInstance() noexcept; //! Returns this material's default instance. - MaterialInstance const* getDefaultInstance() const noexcept; + MaterialInstance const* UTILS_NONNULL getDefaultInstance() const noexcept; + +protected: + // prevent heap allocation + ~Material() = default; }; } // namespace filament diff --git a/filament/include/filament/MaterialInstance.h b/filament/include/filament/MaterialInstance.h index c2095e1c477..72989075f3b 100644 --- a/filament/include/filament/MaterialInstance.h +++ b/filament/include/filament/MaterialInstance.h @@ -28,6 +28,12 @@ #include +#include + +#include +#include +#include + namespace filament { class Material; @@ -41,7 +47,7 @@ class UTILS_PUBLIC MaterialInstance : public FilamentAPI { using StringLiteralHelper = const char[N]; struct StringLiteral { - const char* data; + const char* UTILS_NONNULL data; size_t size; template StringLiteral(StringLiteralHelper const& s) noexcept // NOLINT(google-explicit-constructor) @@ -50,34 +56,35 @@ class UTILS_PUBLIC MaterialInstance : public FilamentAPI { }; public: - using CullingMode = filament::backend::CullingMode; - using TransparencyMode = filament::TransparencyMode; - using StencilCompareFunc = filament::backend::SamplerCompareFunc; - using StencilOperation = filament::backend::StencilOperation; - using StencilFace = filament::backend::StencilFace; + using CullingMode = backend::CullingMode; + using TransparencyMode = TransparencyMode; + using DepthFunc = backend::SamplerCompareFunc; + using StencilCompareFunc = backend::SamplerCompareFunc; + using StencilOperation = backend::StencilOperation; + using StencilFace = backend::StencilFace; template - using is_supported_parameter_t = typename std::enable_if< - std::is_same::value || - std::is_same::value || - std::is_same::value || - std::is_same::value || - std::is_same::value || - std::is_same::value || - std::is_same::value || - std::is_same::value || - std::is_same::value || - std::is_same::value || - std::is_same::value || - std::is_same::value || - std::is_same::value || + using is_supported_parameter_t = std::enable_if_t< + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || // these types are slower as they need a layout conversion - std::is_same::value || - std::is_same::value || - std::is_same::value || - std::is_same::value || - std::is_same::value - >::type; + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v + >; /** * Creates a new MaterialInstance using another MaterialInstance as a template for initialization. @@ -88,17 +95,18 @@ class UTILS_PUBLIC MaterialInstance : public FilamentAPI { * @param name A name for the new MaterialInstance or nullptr to use the template's name * @return A new MaterialInstance */ - static MaterialInstance* duplicate(MaterialInstance const* other, const char* name = nullptr) noexcept; + static MaterialInstance* UTILS_NONNULL duplicate(MaterialInstance const* UTILS_NONNULL other, + const char* UTILS_NULLABLE name = nullptr) noexcept; /** * @return the Material associated with this instance */ - Material const* getMaterial() const noexcept; + Material const* UTILS_NONNULL getMaterial() const noexcept; /** * @return the name associated with this instance */ - const char* getName() const noexcept; + const char* UTILS_NONNULL getName() const noexcept; /** * Set a uniform by name @@ -109,17 +117,17 @@ class UTILS_PUBLIC MaterialInstance : public FilamentAPI { * @throws utils::PreConditionPanic if name doesn't exist or no-op if exceptions are disabled. */ template> - void setParameter(const char* name, size_t nameLength, T const& value); + void setParameter(const char* UTILS_NONNULL name, size_t nameLength, T const& value); /** inline helper to provide the name as a null-terminated string literal */ template> - inline void setParameter(StringLiteral name, T const& value) { + void setParameter(StringLiteral name, T const& value) { setParameter(name.data, name.size, value); } /** inline helper to provide the name as a null-terminated C string */ template> - inline void setParameter(const char* name, T const& value) { + void setParameter(const char* UTILS_NONNULL name, T const& value) { setParameter(name, strlen(name), value); } @@ -132,19 +140,22 @@ class UTILS_PUBLIC MaterialInstance : public FilamentAPI { * @param values Array of values to set to the named parameter array. * @param count Size of the array to set. * @throws utils::PreConditionPanic if name doesn't exist or no-op if exceptions are disabled. + * @see Material::hasParameter */ template> - void setParameter(const char* name, size_t nameLength, const T* values, size_t count); + void setParameter(const char* UTILS_NONNULL name, size_t nameLength, + const T* UTILS_NONNULL values, size_t count); /** inline helper to provide the name as a null-terminated string literal */ template> - inline void setParameter(StringLiteral name, const T* values, size_t count) { + void setParameter(StringLiteral name, const T* UTILS_NONNULL values, size_t count) { setParameter(name.data, name.size, values, count); } /** inline helper to provide the name as a null-terminated C string */ template> - inline void setParameter(const char* name, const T* values, size_t count) { + void setParameter(const char* UTILS_NONNULL name, + const T* UTILS_NONNULL values, size_t count) { setParameter(name, strlen(name), values, count); } @@ -161,18 +172,18 @@ class UTILS_PUBLIC MaterialInstance : public FilamentAPI { * @param sampler Sampler parameters. * @throws utils::PreConditionPanic if name doesn't exist or no-op if exceptions are disabled. */ - void setParameter(const char* name, size_t nameLength, - Texture const* texture, TextureSampler const& sampler); + void setParameter(const char* UTILS_NONNULL name, size_t nameLength, + Texture const* UTILS_NULLABLE texture, TextureSampler const& sampler); /** inline helper to provide the name as a null-terminated string literal */ - inline void setParameter(StringLiteral name, - Texture const* texture, TextureSampler const& sampler) { + void setParameter(StringLiteral name, + Texture const* UTILS_NULLABLE texture, TextureSampler const& sampler) { setParameter(name.data, name.size, texture, sampler); } /** inline helper to provide the name as a null-terminated C string */ - inline void setParameter(const char* name, - Texture const* texture, TextureSampler const& sampler) { + void setParameter(const char* UTILS_NONNULL name, + Texture const* UTILS_NULLABLE texture, TextureSampler const& sampler) { setParameter(name, strlen(name), texture, sampler); } @@ -187,15 +198,16 @@ class UTILS_PUBLIC MaterialInstance : public FilamentAPI { * @param color Array of read, green, blue channels values. * @throws utils::PreConditionPanic if name doesn't exist or no-op if exceptions are disabled. */ - void setParameter(const char* name, size_t nameLength, RgbType type, math::float3 color); + void setParameter(const char* UTILS_NONNULL name, size_t nameLength, + RgbType type, math::float3 color); /** inline helper to provide the name as a null-terminated string literal */ - inline void setParameter(StringLiteral name, RgbType type, math::float3 color) { + void setParameter(StringLiteral name, RgbType type, math::float3 color) { setParameter(name.data, name.size, type, color); } /** inline helper to provide the name as a null-terminated C string */ - inline void setParameter(const char* name, RgbType type, math::float3 color) { + void setParameter(const char* UTILS_NONNULL name, RgbType type, math::float3 color) { setParameter(name, strlen(name), type, color); } @@ -210,18 +222,45 @@ class UTILS_PUBLIC MaterialInstance : public FilamentAPI { * @param color Array of read, green, blue and alpha channels values. * @throws utils::PreConditionPanic if name doesn't exist or no-op if exceptions are disabled. */ - void setParameter(const char* name, size_t nameLength, RgbaType type, math::float4 color); + void setParameter(const char* UTILS_NONNULL name, size_t nameLength, + RgbaType type, math::float4 color); /** inline helper to provide the name as a null-terminated string literal */ - inline void setParameter(StringLiteral name, RgbaType type, math::float4 color) { + void setParameter(StringLiteral name, RgbaType type, math::float4 color) { setParameter(name.data, name.size, type, color); } /** inline helper to provide the name as a null-terminated C string */ - inline void setParameter(const char* name, RgbaType type, math::float4 color) { + void setParameter(const char* UTILS_NONNULL name, RgbaType type, math::float4 color) { setParameter(name, strlen(name), type, color); } + /** + * Gets the value of a parameter by name. + * + * Note: Only supports non-texture parameters such as numeric and math types. + * + * @param name Name of the parameter as defined by Material. Cannot be nullptr. + * @param nameLength Length in `char` of the name parameter. + * @throws utils::PreConditionPanic if name doesn't exist or no-op if exceptions are disabled. + * + * @see Material::hasParameter + */ + template + T getParameter(const char* UTILS_NONNULL name, size_t nameLength) const; + + /** inline helper to provide the name as a null-terminated C string */ + template> + T getParameter(StringLiteral name) const { + return getParameter(name.data, name.size); + } + + /** inline helper to provide the name as a null-terminated C string */ + template> + T getParameter(const char* UTILS_NONNULL name) const { + return getParameter(name, strlen(name)); + } + /** * Set-up a custom scissor rectangle; by default it is disabled. * @@ -367,6 +406,16 @@ class UTILS_PUBLIC MaterialInstance : public FilamentAPI { */ void setDepthCulling(bool enable) noexcept; + /** + * Overrides the default depth function state that was set on the material. + */ + void setDepthFunc(DepthFunc depthFunc) noexcept; + + /** + * Returns the depth function state. + */ + DepthFunc getDepthFunc() const noexcept; + /** * Returns whether depth culling is enabled. */ @@ -468,6 +517,10 @@ class UTILS_PUBLIC MaterialInstance : public FilamentAPI { */ void setStencilWriteMask(uint8_t writeMask, StencilFace face = StencilFace::FRONT_AND_BACK) noexcept; + +protected: + // prevent heap allocation + ~MaterialInstance() = default; }; } // namespace filament diff --git a/filament/include/filament/MorphTargetBuffer.h b/filament/include/filament/MorphTargetBuffer.h index d080d0da674..79c2710670b 100644 --- a/filament/include/filament/MorphTargetBuffer.h +++ b/filament/include/filament/MorphTargetBuffer.h @@ -21,8 +21,11 @@ #include +#include + #include +#include namespace filament { @@ -36,7 +39,7 @@ class UTILS_PUBLIC MorphTargetBuffer : public FilamentAPI { struct BuilderDetails; public: - class Builder : public BuilderBase { + class Builder : public BuilderBase, public BuilderNameMixin { friend struct BuilderDetails; public: Builder() noexcept; @@ -60,19 +63,33 @@ class UTILS_PUBLIC MorphTargetBuffer : public FilamentAPI { */ Builder& count(size_t count) noexcept; + /** + * Associate an optional name with this MorphTargetBuffer for debugging purposes. + * + * name will show in error messages and should be kept as short as possible. The name is + * truncated to a maximum of 128 characters. + * + * The name string is copied during this method so clients may free its memory after + * the function returns. + * + * @param name A string to identify this MorphTargetBuffer + * @param len Length of name, should be less than or equal to 128 + * @return This Builder, for chaining calls. + */ + Builder& name(const char* UTILS_NONNULL name, size_t len) noexcept; + /** * Creates the MorphTargetBuffer object and returns a pointer to it. * * @param engine Reference to the filament::Engine to associate this MorphTargetBuffer with. * - * @return pointer to the newly created object or nullptr if exceptions are disabled and - * an error occurred. + * @return pointer to the newly created object. * * @exception utils::PostConditionPanic if a runtime error occurred, such as running out of * memory or other resources. * @exception utils::PreConditionPanic if a parameter to a builder function was invalid. */ - MorphTargetBuffer* build(Engine& engine); + MorphTargetBuffer* UTILS_NONNULL build(Engine& engine); private: friend class FMorphTargetBuffer; }; @@ -92,7 +109,7 @@ class UTILS_PUBLIC MorphTargetBuffer : public FilamentAPI { * @see setTangentsAt */ void setPositionsAt(Engine& engine, size_t targetIndex, - math::float3 const* positions, size_t count, size_t offset = 0); + math::float3 const* UTILS_NONNULL positions, size_t count, size_t offset = 0); /** * Updates positions for the given morph target. @@ -107,7 +124,7 @@ class UTILS_PUBLIC MorphTargetBuffer : public FilamentAPI { * @see setTangentsAt */ void setPositionsAt(Engine& engine, size_t targetIndex, - math::float4 const* positions, size_t count, size_t offset = 0); + math::float4 const* UTILS_NONNULL positions, size_t count, size_t offset = 0); /** * Updates tangents for the given morph target. @@ -123,7 +140,7 @@ class UTILS_PUBLIC MorphTargetBuffer : public FilamentAPI { * @see setPositionsAt */ void setTangentsAt(Engine& engine, size_t targetIndex, - math::short4 const* tangents, size_t count, size_t offset = 0); + math::short4 const* UTILS_NONNULL tangents, size_t count, size_t offset = 0); /** * Returns the vertex count of this MorphTargetBuffer. @@ -136,6 +153,10 @@ class UTILS_PUBLIC MorphTargetBuffer : public FilamentAPI { * @return The number of targets the MorphTargetBuffer holds. */ size_t getCount() const noexcept; + +protected: + // prevent heap allocation + ~MorphTargetBuffer() = default; }; } // namespace filament diff --git a/filament/include/filament/Options.h b/filament/include/filament/Options.h index 224f4dfb6bb..93bba80cd8e 100644 --- a/filament/include/filament/Options.h +++ b/filament/include/filament/Options.h @@ -19,6 +19,11 @@ #include +#include +#include + +#include + #include namespace filament { @@ -112,8 +117,6 @@ struct DynamicResolutionOptions { * blendMode: Whether the bloom effect is purely additive (false) or mixed with the original * image (true). * - * anamorphism: Bloom's aspect ratio (x/y), for artistic purposes. - * * threshold: When enabled, a threshold at 1.0 is applied on the source image, this is * useful for artistic reasons and is usually needed when a dirt texture is used. * @@ -131,14 +134,24 @@ struct BloomOptions { Texture* dirt = nullptr; //!< user provided dirt texture %codegen_skip_json% %codegen_skip_javascript% float dirtStrength = 0.2f; //!< strength of the dirt texture %codegen_skip_json% %codegen_skip_javascript% float strength = 0.10f; //!< bloom's strength between 0.0 and 1.0 - uint32_t resolution = 360; //!< resolution of vertical axis (2^levels to 2048) - float anamorphism = 1.0f; //!< bloom x/y aspect-ratio (1/32 to 32) - uint8_t levels = 6; //!< number of blur levels (3 to 11) + uint32_t resolution = 384; //!< resolution of vertical axis (2^levels to 2048) + uint8_t levels = 6; //!< number of blur levels (1 to 11) BlendMode blendMode = BlendMode::ADD; //!< how the bloom effect is applied bool threshold = true; //!< whether to threshold the source bool enabled = false; //!< enable or disable bloom float highlight = 1000.0f; //!< limit highlights to this value before bloom [10, +inf] + /** + * Bloom quality level. + * LOW (default): use a more optimized down-sampling filter, however there can be artifacts + * with dynamic resolution, this can be alleviated by using the homogenous mode. + * MEDIUM: Good balance between quality and performance. + * HIGH: In this mode the bloom resolution is automatically increased to avoid artifacts. + * This mode can be significantly slower on mobile, especially at high resolution. + * This mode greatly improves the anamorphic bloom. + */ + QualityLevel quality = QualityLevel::LOW; + bool lensFlare = false; //!< enable screen-space lens flare bool starburst = true; //!< enable starburst effect on lens flare float chromaticAberration = 0.005f; //!< amount of chromatic aberration @@ -151,19 +164,120 @@ struct BloomOptions { }; /** - * Options to control fog in the scene + * Options to control large-scale fog in the scene */ struct FogOptions { - float distance = 0.0f; //!< distance in world units from the camera where the fog starts ( >= 0.0 ) - float maximumOpacity = 1.0f; //!< fog's maximum opacity between 0 and 1 - float height = 0.0f; //!< fog's floor in world units - float heightFalloff = 1.0f; //!< how fast fog dissipates with altitude - LinearColor color = {0.5f, 0.5f, 0.5f};//!< fog's color (linear), see fogColorFromIbl - float density = 0.1f; //!< fog's density at altitude given by 'height' - float inScatteringStart = 0.0f; //!< distance in world units from the camera where in-scattering starts - float inScatteringSize = -1.0f; //!< size of in-scattering (>0 to activate). Good values are >> 1 (e.g. ~10 - 100). - bool fogColorFromIbl = false; //!< Fog color will be modulated by the IBL color in the view direction. - bool enabled = false; //!< enable or disable fog + /** + * Distance in world units [m] from the camera to where the fog starts ( >= 0.0 ) + */ + float distance = 0.0f; + + /** + * Distance in world units [m] after which the fog calculation is disabled. + * This can be used to exclude the skybox, which is desirable if it already contains clouds or + * fog. The default value is +infinity which applies the fog to everything. + * + * Note: The SkyBox is typically at a distance of 1e19 in world space (depending on the near + * plane distance and projection used though). + */ + float cutOffDistance = INFINITY; + + /** + * fog's maximum opacity between 0 and 1 + */ + float maximumOpacity = 1.0f; + + /** + * Fog's floor in world units [m]. This sets the "sea level". + */ + float height = 0.0f; + + /** + * How fast the fog dissipates with altitude. heightFalloff has a unit of [1/m]. + * It can be expressed as 1/H, where H is the altitude change in world units [m] that causes a + * factor 2.78 (e) change in fog density. + * + * A falloff of 0 means the fog density is constant everywhere and may result is slightly + * faster computations. + */ + float heightFalloff = 1.0f; + + /** + * Fog's color is used for ambient light in-scattering, a good value is + * to use the average of the ambient light, possibly tinted towards blue + * for outdoors environments. Color component's values should be between 0 and 1, values + * above one are allowed but could create a non energy-conservative fog (this is dependant + * on the IBL's intensity as well). + * + * We assume that our fog has no absorption and therefore all the light it scatters out + * becomes ambient light in-scattering and has lost all directionality, i.e.: scattering is + * isotropic. This somewhat simulates Rayleigh scattering. + * + * This value is used as a tint instead, when fogColorFromIbl is enabled. + * + * @see fogColorFromIbl + */ + LinearColor color = { 1.0f, 1.0f, 1.0f }; + + /** + * Extinction factor in [1/m] at altitude 'height'. The extinction factor controls how much + * light is absorbed and out-scattered per unit of distance. Each unit of extinction reduces + * the incoming light to 37% of its original value. + * + * Note: The extinction factor is related to the fog density, it's usually some constant K times + * the density at sea level (more specifically at fog height). The constant K depends on + * the composition of the fog/atmosphere. + * + * For historical reason this parameter is called `density`. + */ + float density = 0.1f; + + /** + * Distance in world units [m] from the camera where the Sun in-scattering starts. + */ + float inScatteringStart = 0.0f; + + /** + * Very inaccurately simulates the Sun's in-scattering. That is, the light from the sun that + * is scattered (by the fog) towards the camera. + * Size of the Sun in-scattering (>0 to activate). Good values are >> 1 (e.g. ~10 - 100). + * Smaller values result is a larger scattering size. + */ + float inScatteringSize = -1.0f; + + /** + * The fog color will be sampled from the IBL in the view direction and tinted by `color`. + * Depending on the scene this can produce very convincing results. + * + * This simulates a more anisotropic phase-function. + * + * `fogColorFromIbl` is ignored when skyTexture is specified. + * + * @see skyColor + */ + bool fogColorFromIbl = false; + + /** + * skyTexture must be a mipmapped cubemap. When provided, the fog color will be sampled from + * this texture, higher resolution mip levels will be used for objects at the far clip plane, + * and lower resolution mip levels for objects closer to the camera. The skyTexture should + * typically be heavily blurred; a typical way to produce this texture is to blur the base + * level with a strong gaussian filter or even an irradiance filter and then generate mip + * levels as usual. How blurred the base level is somewhat of an artistic decision. + * + * This simulates a more anisotropic phase-function. + * + * `fogColorFromIbl` is ignored when skyTexture is specified. + * + * @see Texture + * @see fogColorFromIbl + */ + Texture* skyColor = nullptr; //!< %codegen_skip_json% %codegen_skip_javascript% + + /** + * Enable or disable large-scale fog + */ + bool enabled = false; }; /** @@ -182,6 +296,7 @@ struct DepthOfFieldOptions { MEDIAN }; float cocScale = 1.0f; //!< circle of confusion scale factor (amount of blur) + float cocAspectRatio = 1.0f; //!< width/height aspect ratio of the circle of confusion (simulate anamorphic lenses) float maxApertureDiameter = 0.01f; //!< maximum aperture diameter in meters (zero to disable rotation) bool enabled = false; //!< enable or disable depth of field effect Filter filter = Filter::MEDIAN; //!< filter to use for filling gaps in the kernel @@ -290,7 +405,7 @@ struct AmbientOcclusionOptions { }; /** - * Options for Temporal Multi-Sample Anti-aliasing (MSAA) + * Options for Multi-Sample Anti-aliasing (MSAA) * @see setMultiSampleAntiAliasingOptions() */ struct MultiSampleAntiAliasingOptions { @@ -313,12 +428,53 @@ struct MultiSampleAntiAliasingOptions { /** * Options for Temporal Anti-aliasing (TAA) + * Most TAA parameters are extremely costly to change, as they will trigger the TAA post-process + * shaders to be recompiled. These options should be changed or set during initialization. + * `filterWidth`, `feedback` and `jitterPattern`, however, can be changed at any time. + * + * `feedback` of 0.1 effectively accumulates a maximum of 19 samples in steady state. + * see "A Survey of Temporal Antialiasing Techniques" by Lei Yang and all for more information. + * * @see setTemporalAntiAliasingOptions() */ struct TemporalAntiAliasingOptions { - float filterWidth = 1.0f; //!< reconstruction filter width typically between 0 (sharper, aliased) and 1 (smoother) - float feedback = 0.04f; //!< history feedback, between 0 (maximum temporal AA) and 1 (no temporal AA). + float filterWidth = 1.0f; //!< reconstruction filter width typically between 1 (sharper) and 2 (smoother) + float feedback = 0.12f; //!< history feedback, between 0 (maximum temporal AA) and 1 (no temporal AA). + float lodBias = -1.0f; //!< texturing lod bias (typically -1 or -2) + float sharpness = 0.0f; //!< post-TAA sharpen, especially useful when upscaling is true. bool enabled = false; //!< enables or disables temporal anti-aliasing + bool upscaling = false; //!< 4x TAA upscaling. Disables Dynamic Resolution. [BETA] + + enum class BoxType : uint8_t { + AABB, //!< use an AABB neighborhood + VARIANCE, //!< use the variance of the neighborhood (not recommended) + AABB_VARIANCE //!< use both AABB and variance + }; + + enum class BoxClipping : uint8_t { + ACCURATE, //!< Accurate box clipping + CLAMP, //!< clamping + NONE //!< no rejections (use for debugging) + }; + + enum class JitterPattern : uint8_t { + RGSS_X4, //! 4-samples, rotated grid sampling + UNIFORM_HELIX_X4, //! 4-samples, uniform grid in helix sequence + HALTON_23_X8, //! 8-samples of halton 2,3 + HALTON_23_X16, //! 16-samples of halton 2,3 + HALTON_23_X32 //! 32-samples of halton 2,3 + }; + + bool filterHistory = true; //!< whether to filter the history buffer + bool filterInput = true; //!< whether to apply the reconstruction filter to the input + bool useYCoCg = false; //!< whether to use the YcoCg color-space for history rejection + BoxType boxType = BoxType::AABB; //!< type of color gamut box + BoxClipping boxClipping = BoxClipping::ACCURATE; //!< clipping algorithm + JitterPattern jitterPattern = JitterPattern::HALTON_23_X16; //! Jitter Pattern + float varianceGamma = 1.0f; //! High values increases ghosting artefact, lower values increases jittering, range [0.75, 1.25] + + bool preventFlickering = false; //!< adjust the feedback dynamically to reduce flickering + bool historyReprojection = true; //!< whether to apply history reprojection (debug option) }; /** @@ -368,7 +524,8 @@ enum class ShadowType : uint8_t { PCF, //!< percentage-closer filtered shadows (default) VSM, //!< variance shadows DPCF, //!< PCF with contact hardening simulation - PCSS //!< PCF with soft shadows and contact hardening + PCSS, //!< PCF with soft shadows and contact hardening + PCFd, // for debugging only, don't use. }; /** @@ -438,6 +595,13 @@ struct SoftShadowOptions { float penumbraRatioScale = 1.0f; }; +/** + * Options for stereoscopic (multi-eye) rendering. + */ +struct StereoscopicOptions { + bool enabled = false; +}; + } // namespace filament #endif //TNT_FILAMENT_OPTIONS_H diff --git a/filament/include/filament/RenderTarget.h b/filament/include/filament/RenderTarget.h index 950bbb8dbac..d432f63ed77 100644 --- a/filament/include/filament/RenderTarget.h +++ b/filament/include/filament/RenderTarget.h @@ -24,7 +24,10 @@ #include #include +#include + #include +#include namespace filament { @@ -91,8 +94,6 @@ class UTILS_PUBLIC RenderTarget : public FilamentAPI { /** * Sets a texture to a given attachment point. * - * All RenderTargets must have a non-null COLOR attachment. - * * When using a DEPTH attachment, it is important to always disable post-processing * in the View. Failing to do so will cause the DEPTH attachment to be ignored in most * cases. @@ -105,7 +106,7 @@ class UTILS_PUBLIC RenderTarget : public FilamentAPI { * @param texture The associated texture object. * @return A reference to this Builder for chaining calls. */ - Builder& texture(AttachmentPoint attachment, Texture* texture) noexcept; + Builder& texture(AttachmentPoint attachment, Texture* UTILS_NULLABLE texture) noexcept; /** * Sets the mipmap level for a given attachment point. @@ -117,7 +118,7 @@ class UTILS_PUBLIC RenderTarget : public FilamentAPI { Builder& mipLevel(AttachmentPoint attachment, uint8_t level) noexcept; /** - * Sets the cubemap face for a given attachment point. + * Sets the face for cubemap textures at the given attachment point. * * @param attachment The attachment point. * @param face The associated cubemap face. @@ -126,7 +127,12 @@ class UTILS_PUBLIC RenderTarget : public FilamentAPI { Builder& face(AttachmentPoint attachment, CubemapFace face) noexcept; /** - * Sets the layer for a given attachment point (for 3D textures). + * Sets an index of a single layer for 2d array, cubemap array, and 3d textures at the given + * attachment point. + * + * For cubemap array textures, layer is translated into an array index and face according to + * - index: layer / 6 + * - face: layer % 6 * * @param attachment The attachment point. * @param layer The associated cubemap layer. @@ -134,13 +140,25 @@ class UTILS_PUBLIC RenderTarget : public FilamentAPI { */ Builder& layer(AttachmentPoint attachment, uint32_t layer) noexcept; + /** + * Sets the starting index of the 2d array textures for multiview at the given attachment + * point. + * + * This requires COLOR and DEPTH attachments (if set) to be of 2D array textures. + * + * @param attachment The attachment point. + * @param layerCount The number of layers used for multiview, starting from baseLayer. + * @param baseLayer The starting index of the 2d array texture. + * @return A reference to this Builder for chaining calls. + */ + Builder& multiview(AttachmentPoint attachment, uint8_t layerCount, uint8_t baseLayer = 0) noexcept; + /** * Creates the RenderTarget object and returns a pointer to it. * - * @return pointer to the newly created object or nullptr if exceptions are disabled and - * an error occurred. + * @return pointer to the newly created object. */ - RenderTarget* build(Engine& engine); + RenderTarget* UTILS_NONNULL build(Engine& engine); private: friend class FRenderTarget; @@ -151,7 +169,7 @@ class UTILS_PUBLIC RenderTarget : public FilamentAPI { * @param attachment Attachment point * @return A Texture object or nullptr if no texture is set for this attachment point */ - Texture* getTexture(AttachmentPoint attachment) const noexcept; + Texture* UTILS_NULLABLE getTexture(AttachmentPoint attachment) const noexcept; /** * Returns the mipmap level set on the given attachment point @@ -182,6 +200,10 @@ class UTILS_PUBLIC RenderTarget : public FilamentAPI { * @return Number of color attachments usable in a render target. */ uint8_t getSupportedColorAttachmentsCount() const noexcept; + +protected: + // prevent heap allocation + ~RenderTarget() = default; }; } // namespace filament diff --git a/filament/include/filament/RenderableManager.h b/filament/include/filament/RenderableManager.h index 737b8b4703a..b0cc14baa81 100644 --- a/filament/include/filament/RenderableManager.h +++ b/filament/include/filament/RenderableManager.h @@ -26,11 +26,18 @@ #include #include +#include #include +#include +#include #include +#include +#include +#include + namespace utils { class Entity; } // namespace utils @@ -45,6 +52,7 @@ class Renderer; class SkinningBuffer; class VertexBuffer; class Texture; +class InstanceBuffer; class FEngine; class FRenderPrimitive; @@ -100,6 +108,29 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { */ Instance getInstance(utils::Entity e) const noexcept; + /** + * @return the number of Components + */ + size_t getComponentCount() const noexcept; + + /** + * @return true if the this manager has no components + */ + bool empty() const noexcept; + + /** + * Retrieve the `Entity` of the component from its `Instance`. + * @param i Instance of the component obtained from getInstance() + * @return + */ + utils::Entity getEntity(Instance i) const noexcept; + + /** + * Retrieve the Entities of all the components of this manager. + * @return A list, in no particular order, of all the entities managed by this manager. + */ + utils::Entity const* UTILS_NONNULL getEntities() const noexcept; + /** * The transformation associated with a skinning joint. * @@ -119,6 +150,21 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { public: enum Result { Error = -1, Success = 0 }; + /** + * Default render channel + * @see Builder::channel() + */ + static constexpr uint8_t DEFAULT_CHANNEL = 2u; + + /** + * Type of geometry for a Renderable + */ + enum class GeometryType : uint8_t { + DYNAMIC, //!< dynamic gemoetry has no restriction + STATIC_BOUNDS, //!< bounds and world space transform are immutable + STATIC //!< skinning/morphing not allowed and Vertex/IndexBuffer immutables + }; + /** * Creates a builder for renderable components. * @@ -153,9 +199,30 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { * @param maxIndex specifies the maximum index contained in the index buffer * @param count number of indices to read (for triangles, this should be a multiple of 3) */ - Builder& geometry(size_t index, PrimitiveType type, VertexBuffer* vertices, IndexBuffer* indices, size_t offset, size_t minIndex, size_t maxIndex, size_t count) noexcept; - Builder& geometry(size_t index, PrimitiveType type, VertexBuffer* vertices, IndexBuffer* indices, size_t offset, size_t count) noexcept; //!< \overload - Builder& geometry(size_t index, PrimitiveType type, VertexBuffer* vertices, IndexBuffer* indices) noexcept; //!< \overload + Builder& geometry(size_t index, PrimitiveType type, + VertexBuffer* UTILS_NONNULL vertices, + IndexBuffer* UTILS_NONNULL indices, + size_t offset, size_t minIndex, size_t maxIndex, size_t count) noexcept; + + Builder& geometry(size_t index, PrimitiveType type, + VertexBuffer* UTILS_NONNULL vertices, + IndexBuffer* UTILS_NONNULL indices, + size_t offset, size_t count) noexcept; //!< \overload + + Builder& geometry(size_t index, PrimitiveType type, + VertexBuffer* UTILS_NONNULL vertices, + IndexBuffer* UTILS_NONNULL indices) noexcept; //!< \overload + + + /** + * Specify the type of geometry for this renderable. DYNAMIC geometry has no restriction, + * STATIC_BOUNDS geometry means that both the bounds and the world-space transform of the + * the renderable are immutable. + * STATIC geometry has the same restrictions as STATIC_BOUNDS, but in addition disallows + * skinning, morphing and changing the VertexBuffer or IndexBuffer in any way. + * @param type type of geometry. + */ + Builder& geometryType(GeometryType type) noexcept; /** * Binds a material instance to the specified primitive. @@ -172,7 +239,8 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { * * @see Engine::setActiveFeatureLevel */ - Builder& material(size_t index, MaterialInstance const* materialInstance) noexcept; + Builder& material(size_t index, + MaterialInstance const* UTILS_NONNULL materialInstance) noexcept; /** * The axis-aligned bounding box of the renderable. @@ -206,20 +274,47 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { * * In general Filament reserves the right to re-order renderables to allow for efficient * rendering. However clients can control ordering at a coarse level using \em priority. + * The priority is applied separately for opaque and translucent objects, that is, opaque + * objects are always drawn before translucent objects regardless of the priority. * - * For example, this could be used to draw a semitransparent HUD, if a client wishes to - * avoid using a separate View for the HUD. Note that priority is completely orthogonal to + * For example, this could be used to draw a semitransparent HUD on top of everything, + * without using a separate View. Note that priority is completely orthogonal to * Builder::layerMask, which merely controls visibility. * + * The Skybox always using the lowest priority, so it's drawn last, which may improve + * performance. + * * @param priority clamped to the range [0..7], defaults to 4; 7 is lowest priority * (rendered last). * * @return Builder reference for chaining calls. * - * @see Builder::blendOrder(), RenderableManager::setBlendOrderAt() + * @see Builder::blendOrder() + * @see Builder::channel() + * @see RenderableManager::setPriority() + * @see RenderableManager::setBlendOrderAt() */ Builder& priority(uint8_t priority) noexcept; + /** + * Set the channel this renderable is associated to. There can be 4 channels. + * All renderables in a given channel are rendered together, regardless of anything else. + * They are sorted as usual within a channel. + * Channels work similarly to priorities, except that they enforce the strongest ordering. + * + * Channels 0 and 1 may not have render primitives using a material with `refractionType` + * set to `screenspace`. + * + * @param channel clamped to the range [0..3], defaults to 2. + * + * @return Builder reference for chaining calls. + * + * @see Builder::blendOrder() + * @see Builder::priority() + * @see RenderableManager::setBlendOrderAt() + */ + Builder& channel(uint8_t channel) noexcept; + /** * Controls frustum culling, true by default. * @@ -269,6 +364,14 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { */ Builder& enableSkinningBuffers(bool enabled = true) noexcept; + /** + * Controls if this renderable is affected by the large-scale fog. + * @param enabled If true, enables large-scale fog on this object. Disables it otherwise. + * True by default. + * @return A reference to this Builder for chaining calls. + */ + Builder& fog(bool enabled = true) noexcept; + /** * Enables GPU vertex skinning for up to 255 bones, 0 by default. * @@ -285,7 +388,8 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { * @param count 0 to disable, otherwise the number of bone transforms (up to 255) * @param offset offset in the SkinningBuffer */ - Builder& skinning(SkinningBuffer* skinningBuffer, size_t count, size_t offset) noexcept; + Builder& skinning(SkinningBuffer* UTILS_NONNULL skinningBuffer, + size_t count, size_t offset) noexcept; /** @@ -303,19 +407,67 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { * @param boneCount 0 to disable, otherwise the number of bone transforms (up to 255) * @param transforms the initial set of transforms (one for each bone) */ - Builder& skinning(size_t boneCount, math::mat4f const* transforms) noexcept; - Builder& skinning(size_t boneCount, Bone const* bones) noexcept; //!< \overload + Builder& skinning(size_t boneCount, math::mat4f const* UTILS_NONNULL transforms) noexcept; + Builder& skinning(size_t boneCount, Bone const* UTILS_NONNULL bones) noexcept; //!< \overload Builder& skinning(size_t boneCount) noexcept; //!< \overload /** - * Controls if the renderable has vertex morphing targets, zero by default. This is - * required to enable GPU morphing. + * Define bone indices and weights "pairs" for vertex skinning as a float2. + * The unsigned int(pair.x) defines index of the bone and pair.y is the bone weight. + * The pairs substitute \c BONE_INDICES and the \c BONE_WEIGHTS defined in the VertexBuffer. + * Both ways of indices and weights definition must not be combined in one primitive. + * Number of pairs per vertex bonesPerVertex is not limited to 4 bones. + * Vertex buffer used for \c primitiveIndex must be set for advance skinning. + * All bone weights of one vertex should sum to one. Otherwise they will be normalized. + * Data must be rectangular and number of bone pairs must be same for all vertices of this + * primitive. + * The data is arranged sequentially, all bone pairs for the first vertex, then for the + * second vertex, and so on. + * + * @param primitiveIndex zero-based index of the primitive, must be less than the primitive + * count passed to Builder constructor + * @param indicesAndWeights pairs of bone index and bone weight for all vertices + * sequentially + * @param count number of all pairs, must be a multiple of vertexCount of the primitive + * count = vertexCount * bonesPerVertex + * @param bonesPerVertex number of bone pairs, same for all vertices of the primitive * - * Filament supports two morphing modes: standard (default) and legacy. + * @return Builder reference for chaining calls. + * + * @see VertexBuffer:Builder:advancedSkinning + */ + Builder& boneIndicesAndWeights(size_t primitiveIndex, + math::float2 const* UTILS_NONNULL indicesAndWeights, + size_t count, size_t bonesPerVertex) noexcept; + + /** + * Define bone indices and weights "pairs" for vertex skinning as a float2. + * The unsigned int(pair.x) defines index of the bone and pair.y is the bone weight. + * The pairs substitute \c BONE_INDICES and the \c BONE_WEIGHTS defined in the VertexBuffer. + * Both ways of indices and weights definition must not be combined in one primitive. + * Number of pairs is not limited to 4 bones per vertex. + * Vertex buffer used for \c primitiveIndex must be set for advance skinning. + * All bone weights of one vertex should sum to one. Otherwise they will be normalized. + * Data doesn't have to be rectangular and number of pairs per vertices of primitive can be + * variable. + * The vector of the vertices contains the vectors of the pairs + * + * @param primitiveIndex zero-based index of the primitive, must be less than the primitive + * count passed to Builder constructor + * @param indicesAndWeightsVector pairs of bone index and bone weight for all vertices of + * the primitive sequentially * - * For standard morphing, A MorphTargetBuffer must be created and provided via - * RenderableManager::setMorphTargetBufferAt(). Standard morphing supports up to - * \c CONFIG_MAX_MORPH_TARGET_COUNT morph targets. + * @return Builder reference for chaining calls. + * + * @see VertexBuffer:Builder:advancedSkinning + */ + Builder& boneIndicesAndWeights(size_t primitiveIndex, + utils::FixedCapacityVector< + utils::FixedCapacityVector> indicesAndWeightsVector) noexcept; + + /** + * Controls if the renderable has legacy vertex morphing targets, zero by default. This is + * required to enable GPU morphing. * * For legacy morphing, the attached VertexBuffer must provide data in the * appropriate VertexAttribute slots (\c MORPH_POSITION_0 etc). Legacy morphing only @@ -329,25 +481,29 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { Builder& morphing(size_t targetCount) noexcept; /** - * Specifies the morph target buffer for a primitive. + * Controls if the renderable has vertex morphing targets, zero by default. This is + * required to enable GPU morphing. * - * The morph target buffer must have an associated renderable and geometry. Two conditions - * must be met: - * 1. The number of morph targets in the buffer must equal the renderable's morph target - * count. - * 2. The vertex count of each morph target must equal the geometry's vertex count. + * Filament supports two morphing modes: standard (default) and legacy. + * + * For standard morphing, A MorphTargetBuffer must be provided. + * Standard morphing supports up to \c CONFIG_MAX_MORPH_TARGET_COUNT morph targets. + * + * See also RenderableManager::setMorphWeights(), which can be called on a per-frame basis + * to advance the animation. + */ + Builder& morphing(MorphTargetBuffer* UTILS_NONNULL morphTargetBuffer) noexcept; + + /** + * Specifies the the range of the MorphTargetBuffer to use with this primitive. * * @param level the level of detail (lod), only 0 can be specified * @param primitiveIndex zero-based index of the primitive, must be less than the count passed to Builder constructor - * @param morphTargetBuffer specifies the morph target buffer * @param offset specifies where in the morph target buffer to start reading (expressed as a number of vertices) - * @param count number of vertices in the morph target buffer to read, must equal the geometry's count (for triangles, this should be a multiple of 3) */ - Builder& morphing(uint8_t level, size_t primitiveIndex, - MorphTargetBuffer* morphTargetBuffer, size_t offset, size_t count) noexcept; + Builder& morphing(uint8_t level, + size_t primitiveIndex, size_t offset) noexcept; - inline Builder& morphing(uint8_t level, size_t primitiveIndex, - MorphTargetBuffer* morphTargetBuffer) noexcept; /** * Sets the drawing order for blended primitives. The drawing order is either global or @@ -375,20 +531,48 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { */ Builder& globalBlendOrderEnabled(size_t primitiveIndex, bool enabled) noexcept; - /** - * Specifies the number of draw instance of this renderable. The default is 1 instance and - * the maximum number of instances allowed is 65535. 0 is invalid. + * Specifies the number of draw instances of this renderable. The default is 1 instance and + * the maximum number of instances allowed is 32767. 0 is invalid. + * * All instances are culled using the same bounding box, so care must be taken to make * sure all instances render inside the specified bounding box. + * * The material must set its `instanced` parameter to `true` in order to use * getInstanceIndex() in the vertex or fragment shader to get the instance index and * possibly adjust the position or transform. * - * @param instanceCount the number of instances silently clamped between 1 and 65535. + * @param instanceCount the number of instances silently clamped between 1 and 32767. */ Builder& instances(size_t instanceCount) noexcept; + /** + * Specifies the number of draw instances of this renderable and an \c InstanceBuffer + * containing their local transforms. The default is 1 instance and the maximum number of + * instances allowed when supplying transforms is given by + * \c Engine::getMaxAutomaticInstances (64 on most platforms). 0 is invalid. The + * \c InstanceBuffer must not be destroyed before this renderable. + * + * All instances are culled using the same bounding box, so care must be taken to make + * sure all instances render inside the specified bounding box. + * + * The material must set its `instanced` parameter to `true` in order to use + * \c getInstanceIndex() in the vertex or fragment shader to get the instance index. + * + * Only the \c VERTEX_DOMAIN_OBJECT vertex domain is supported. + * + * The local transforms of each instance can be updated with + * \c InstanceBuffer::setLocalTransforms. + * + * \see InstanceBuffer + * \see instances(size_t, * math::mat4f const*) + * @param instanceCount the number of instances, silently clamped between 1 and + * the result of Engine::getMaxAutomaticInstances(). + * @param instanceBuffer an InstanceBuffer containing at least instanceCount transforms + */ + Builder& instances(size_t instanceCount, + InstanceBuffer* UTILS_NONNULL instanceBuffer) noexcept; + /** * Adds the Renderable component to an entity. * @@ -413,23 +597,6 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { friend class FEngine; friend class FRenderPrimitive; friend class FRenderableManager; - struct Entry { - VertexBuffer* vertices = nullptr; - IndexBuffer* indices = nullptr; - size_t offset = 0; - size_t minIndex = 0; - size_t maxIndex = 0; - size_t count = 0; - MaterialInstance const* materialInstance = nullptr; - PrimitiveType type = PrimitiveType::TRIANGLES; - uint16_t blendOrder = 0; - bool globalBlendOrderEnabled = false; - struct { - MorphTargetBuffer* buffer = nullptr; - size_t offset = 0; - size_t count = 0; - } morphing; - }; }; /** @@ -439,11 +606,12 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { /** * Changes the bounding box used for frustum culling. + * The renderable must not have staticGeometry enabled. * * \see Builder::boundingBox() * \see RenderableManager::getAxisAlignedBoundingBox() */ - void setAxisAlignedBoundingBox(Instance instance, const Box& aabb) noexcept; + void setAxisAlignedBoundingBox(Instance instance, const Box& aabb); /** * Changes the visibility bits. @@ -461,6 +629,13 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { */ void setPriority(Instance instance, uint8_t priority) noexcept; + /** + * Changes the channel a renderable is associated to. + * + * \see Builder::channel(). + */ + void setChannel(Instance instance, uint8_t channel) noexcept; + /** * Changes whether or not frustum culling is on. * @@ -468,6 +643,19 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { */ void setCulling(Instance instance, bool enable) noexcept; + /** + * Changes whether or not the large-scale fog is applied to this renderable + * @see Builder::fog() + */ + void setFogEnabled(Instance instance, bool enable) noexcept; + + /** + * Returns whether large-scale fog is enabled for this renderable. + * @return True if fog is enabled for this renderable. + * @see Builder::fog() + */ + bool getFogEnabled(Instance instance) const noexcept; + /** * Enables or disables a light channel. * Light channel 0 is enabled by default. @@ -523,8 +711,11 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { * Updates the bone transforms in the range [offset, offset + boneCount). * The bones must be pre-allocated using Builder::skinning(). */ - void setBones(Instance instance, Bone const* transforms, size_t boneCount = 1, size_t offset = 0); - void setBones(Instance instance, math::mat4f const* transforms, size_t boneCount = 1, size_t offset = 0); //!< \overload + void setBones(Instance instance, Bone const* UTILS_NONNULL transforms, + size_t boneCount = 1, size_t offset = 0); + + void setBones(Instance instance, math::mat4f const* UTILS_NONNULL transforms, + size_t boneCount = 1, size_t offset = 0); //!< \overload /** * Associates a region of a SkinningBuffer to a renderable instance @@ -537,7 +728,7 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { * @param count Size of the region in bones, must be smaller or equal to 256. * @param offset Start offset of the region in bones */ - void setSkinningBuffer(Instance instance, SkinningBuffer* skinningBuffer, + void setSkinningBuffer(Instance instance, SkinningBuffer* UTILS_NONNULL skinningBuffer, size_t count, size_t offset); /** @@ -552,24 +743,18 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { * @param offset Index of the first morph target weight to set at instance. */ void setMorphWeights(Instance instance, - float const* weights, size_t count, size_t offset = 0); + float const* UTILS_NONNULL weights, size_t count, size_t offset = 0); /** * Associates a MorphTargetBuffer to the given primitive. */ - void setMorphTargetBufferAt(Instance instance, uint8_t level, size_t primitiveIndex, - MorphTargetBuffer* morphTargetBuffer, size_t offset, size_t count); - - /** - * Utility method to change a MorphTargetBuffer to the given primitive - */ - inline void setMorphTargetBufferAt(Instance instance, uint8_t level, size_t primitiveIndex, - MorphTargetBuffer* morphTargetBuffer); + void setMorphTargetBufferOffsetAt(Instance instance, uint8_t level, size_t primitiveIndex, + size_t offset); /** - * Get a MorphTargetBuffer to the given primitive or null if it doesn't exist. + * Get a MorphTargetBuffer to the given renderable or null if it doesn't exist. */ - MorphTargetBuffer* getMorphTargetBufferAt(Instance instance, uint8_t level, size_t primitiveIndex) const noexcept; + MorphTargetBuffer* UTILS_NULLABLE getMorphTargetBuffer(Instance instance) const noexcept; /** * Gets the number of morphing in the given entity. @@ -611,20 +796,29 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { * @see Engine::setActiveFeatureLevel */ void setMaterialInstanceAt(Instance instance, - size_t primitiveIndex, MaterialInstance const* materialInstance); + size_t primitiveIndex, MaterialInstance const* UTILS_NONNULL materialInstance); + + /** + * Clear the MaterialInstance for the given primitive. + * @param instance Renderable's instance + * @param primitiveIndex Primitive index + */ + void clearMaterialInstanceAt(Instance instance, size_t primitiveIndex); /** * Retrieves the material instance that is bound to the given primitive. */ - MaterialInstance* getMaterialInstanceAt(Instance instance, size_t primitiveIndex) const noexcept; + MaterialInstance* UTILS_NULLABLE getMaterialInstanceAt( + Instance instance, size_t primitiveIndex) const noexcept; /** * Changes the geometry for the given primitive. * * \see Builder::geometry() */ - void setGeometryAt(Instance instance, size_t primitiveIndex, - PrimitiveType type, VertexBuffer* vertices, IndexBuffer* indices, + void setGeometryAt(Instance instance, size_t primitiveIndex, PrimitiveType type, + VertexBuffer* UTILS_NONNULL vertices, + IndexBuffer* UTILS_NONNULL indices, size_t offset, size_t count) noexcept; /** @@ -658,20 +852,20 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { /*! \cond PRIVATE */ template struct is_supported_vector_type { - using type = typename std::enable_if< - std::is_same::value || - std::is_same::value || - std::is_same::value || - std::is_same::value - >::type; + using type = std::enable_if_t< + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v + >; }; template struct is_supported_index_type { - using type = typename std::enable_if< - std::is_same::value || - std::is_same::value - >::type; + using type = std::enable_if_t< + std::is_same_v || + std::is_same_v + >; }; /*! \endcond */ @@ -685,27 +879,23 @@ class UTILS_PUBLIC RenderableManager : public FilamentAPI { template::type, typename = typename is_supported_index_type::type> - static Box computeAABB(VECTOR const* vertices, INDEX const* indices, size_t count, + static Box computeAABB( + VECTOR const* UTILS_NONNULL vertices, + INDEX const* UTILS_NONNULL indices, size_t count, size_t stride = sizeof(VECTOR)) noexcept; -}; - -RenderableManager::Builder& RenderableManager::Builder::morphing(uint8_t level, size_t primitiveIndex, - MorphTargetBuffer* morphTargetBuffer) noexcept { - return morphing(level, primitiveIndex, morphTargetBuffer, 0, - morphTargetBuffer->getVertexCount()); -} -void RenderableManager::setMorphTargetBufferAt(Instance instance, uint8_t level, size_t primitiveIndex, - MorphTargetBuffer* morphTargetBuffer) { - setMorphTargetBufferAt(instance, level, primitiveIndex, morphTargetBuffer, 0, - morphTargetBuffer->getVertexCount()); -} +protected: + // prevent heap allocation + ~RenderableManager() = default; +}; template -Box RenderableManager::computeAABB(VECTOR const* vertices, INDEX const* indices, size_t count, - size_t stride) noexcept { - math::float3 bmin(std::numeric_limits::max()); - math::float3 bmax(std::numeric_limits::lowest()); +Box RenderableManager::computeAABB( + VECTOR const* UTILS_NONNULL vertices, + INDEX const* UTILS_NONNULL indices, + size_t count, size_t stride) noexcept { + math::float3 bmin(FLT_MAX); + math::float3 bmax(-FLT_MAX); for (size_t i = 0; i < count; ++i) { VECTOR const* p = reinterpret_cast( (char const*)vertices + indices[i] * stride); diff --git a/filament/include/filament/Renderer.h b/filament/include/filament/Renderer.h index 111026bbcf2..c6033a3db8b 100644 --- a/filament/include/filament/Renderer.h +++ b/filament/include/filament/Renderer.h @@ -22,12 +22,11 @@ #include #include - -#include -#include +#include #include +#include #include namespace filament { @@ -84,6 +83,37 @@ class UTILS_PUBLIC Renderer : public FilamentAPI { UTILS_DEPRECATED uint64_t vsyncOffsetNanos = 0; }; + /** + * Timing information about a frame + * @see getFrameInfoHistory() + */ + struct FrameInfo { + using time_point_ns = int64_t; + using duration_ns = int64_t; + uint32_t frameId; //!< monotonically increasing frame identifier + duration_ns frameTime; //!< frame duration on the GPU in nanosecond [ns] + duration_ns denoisedFrameTime; //!< denoised frame duration on the GPU in [ns] + time_point_ns beginFrame; //!< Renderer::beginFrame() time since epoch [ns] + time_point_ns endFrame; //!< Renderer::endFrame() time since epoch [ns] + time_point_ns backendBeginFrame; //!< Backend thread time of frame start since epoch [ns] + time_point_ns backendEndFrame; //!< Backend thread time of frame end since epoch [ns] + }; + + /** + * Retrieve an historic of frame timing information. The maximum frame history size is + * given by getMaxFrameHistorySize(). + * @param historySize requested history size. The returned vector could be smaller. + * @return A vector of FrameInfo. + */ + utils::FixedCapacityVector getFrameInfoHistory( + size_t historySize = 1) const noexcept; + + /** + * @return the maximum supported frame history size. + * @see getFrameInfoHistory() + */ + size_t getMaxFrameHistorySize() const noexcept; + /** * Use FrameRateOptions to set the desired frame rate and control how quickly the system * reacts to GPU load changes. @@ -173,19 +203,25 @@ class UTILS_PUBLIC Renderer : public FilamentAPI { */ void setClearOptions(const ClearOptions& options); + /** + * Returns the ClearOptions currently set. + * @return A reference to a ClearOptions structure. + */ + ClearOptions const& getClearOptions() const noexcept; + /** * Get the Engine that created this Renderer. * * @return A pointer to the Engine instance this Renderer is associated to. */ - Engine* getEngine() noexcept; + Engine* UTILS_NONNULL getEngine() noexcept; /** * Get the Engine that created this Renderer. * * @return A constant pointer to the Engine instance this Renderer is associated to. */ - inline Engine const* getEngine() const noexcept { + inline Engine const* UTILS_NONNULL getEngine() const noexcept { return const_cast(this)->getEngine(); } @@ -224,6 +260,25 @@ class UTILS_PUBLIC Renderer : public FilamentAPI { static constexpr CopyFrameFlag CLEAR = 0x4; + /** + * The use of this method is optional. It sets the VSYNC time expressed as the duration in + * nanosecond since epoch of std::chrono::steady_clock. + * If called, passing 0 to vsyncSteadyClockTimeNano in Renderer::BeginFrame will use this + * time instead. + * @param steadyClockTimeNano duration in nanosecond since epoch of std::chrono::steady_clock + * @see Engine::getSteadyClockTimeNano() + * @see Renderer::BeginFrame() + */ + void setVsyncTime(uint64_t steadyClockTimeNano) noexcept; + + /** + * Call skipFrame when momentarily skipping frames, for instance if the content of the + * scene doesn't change. + * + * @param vsyncSteadyClockTimeNano + */ + void skipFrame(uint64_t vsyncSteadyClockTimeNano = 0u); + /** * Set-up a frame for this Renderer. * @@ -261,7 +316,7 @@ class UTILS_PUBLIC Renderer : public FilamentAPI { * @see * endFrame() */ - bool beginFrame(SwapChain* swapChain, + bool beginFrame(SwapChain* UTILS_NONNULL swapChain, uint64_t vsyncSteadyClockTimeNano = 0u); /** @@ -332,7 +387,7 @@ class UTILS_PUBLIC Renderer : public FilamentAPI { * beginFrame(), endFrame(), View * */ - void render(View const* view); + void render(View const* UTILS_NONNULL view); /** * Copy the currently rendered view to the indicated swap chain, using the @@ -347,7 +402,7 @@ class UTILS_PUBLIC Renderer : public FilamentAPI { * copyFrame() should be called after a frame is rendered using render() * but before endFrame() is called. */ - void copyFrame(SwapChain* dstSwapChain, Viewport const& dstViewport, + void copyFrame(SwapChain* UTILS_NONNULL dstSwapChain, Viewport const& dstViewport, Viewport const& srcViewport, uint32_t flags = 0); /** @@ -453,7 +508,7 @@ class UTILS_PUBLIC Renderer : public FilamentAPI { * * Framebuffer as seen on User buffer (PixelBufferDescriptor&) * screen - * + * * +--------------------+ * | | .stride .alignment * | | ----------------------->--> @@ -483,11 +538,14 @@ class UTILS_PUBLIC Renderer : public FilamentAPI { * uploaded to it via setImage, the data returned from readPixels will be y-flipped with respect * to the setImage call. * + * Note: the texture that backs the COLOR attachment for `renderTarget` must have + * TextureUsage::BLIT_SRC as part of its usage. + * * @remark * readPixels() is intended for debugging and testing. It will impact performance significantly. * */ - void readPixels(RenderTarget* renderTarget, + void readPixels(RenderTarget* UTILS_NONNULL renderTarget, uint32_t xoffset, uint32_t yoffset, uint32_t width, uint32_t height, backend::PixelBufferDescriptor&& buffer); @@ -514,7 +572,7 @@ class UTILS_PUBLIC Renderer : public FilamentAPI { * However, internally, renderStandaloneView() is highly multi-threaded to both improve * performance in mitigate the call's latency. */ - void renderStandaloneView(View const* view); + void renderStandaloneView(View const* UTILS_NONNULL view); /** @@ -573,6 +631,10 @@ class UTILS_PUBLIC Renderer : public FilamentAPI { * getUserTime() */ void resetUserTime(); + +protected: + // prevent heap allocation + ~Renderer() = default; }; } // namespace filament diff --git a/filament/include/filament/Scene.h b/filament/include/filament/Scene.h index 3e6a63c4b3f..9df6285c4aa 100644 --- a/filament/include/filament/Scene.h +++ b/filament/include/filament/Scene.h @@ -24,6 +24,8 @@ #include #include +#include + namespace utils { class Entity; } // namespace utils @@ -73,14 +75,14 @@ class UTILS_PUBLIC Scene : public FilamentAPI { * * @param skybox The Skybox to use to fill untouched pixels, or nullptr to unset the Skybox. */ - void setSkybox(Skybox* skybox) noexcept; + void setSkybox(Skybox* UTILS_NULLABLE skybox) noexcept; /** * Returns the Skybox associated with the Scene. * * @return The associated Skybox, or nullptr if there is none. */ - Skybox* getSkybox() const noexcept; + Skybox* UTILS_NULLABLE getSkybox() const noexcept; /** * Set the IndirectLight to use when rendering the Scene. @@ -91,7 +93,7 @@ class UTILS_PUBLIC Scene : public FilamentAPI { * @param ibl The IndirectLight to use when rendering the Scene or nullptr to unset. * @see getIndirectLight */ - void setIndirectLight(IndirectLight* ibl) noexcept; + void setIndirectLight(IndirectLight* UTILS_NULLABLE ibl) noexcept; /** * Get the IndirectLight or nullptr if none is set. @@ -99,7 +101,7 @@ class UTILS_PUBLIC Scene : public FilamentAPI { * @return the the IndirectLight or nullptr if none is set * @see setIndirectLight */ - IndirectLight* getIndirectLight() const noexcept; + IndirectLight* UTILS_NULLABLE getIndirectLight() const noexcept; /** * Adds an Entity to the Scene. @@ -118,7 +120,7 @@ class UTILS_PUBLIC Scene : public FilamentAPI { * @param entities Array containing entities to add to the scene. * @param count Size of the entity array. */ - void addEntities(const utils::Entity* entities, size_t count); + void addEntities(const utils::Entity* UTILS_NONNULL entities, size_t count); /** * Removes the Renderable from the Scene. @@ -137,19 +139,25 @@ class UTILS_PUBLIC Scene : public FilamentAPI { * @param entities Array containing entities to remove from the scene. * @param count Size of the entity array. */ - void removeEntities(const utils::Entity* entities, size_t count); + void removeEntities(const utils::Entity* UTILS_NONNULL entities, size_t count); /** - * Returns the number of Renderable objects in the Scene. + * Returns the total number of Entities in the Scene, whether alive or not. + * @return Total number of Entities in the Scene. + */ + size_t getEntityCount() const noexcept; + + /** + * Returns the number of active (alive) Renderable objects in the Scene. * - * @return number of Renderable objects in the Scene. + * @return The number of active (alive) Renderable objects in the Scene. */ size_t getRenderableCount() const noexcept; /** - * Returns the total number of Light objects in the Scene. + * Returns the number of active (alive) Light objects in the Scene. * - * @return The total number of Light objects in the Scene. + * @return The number of active (alive) Light objects in the Scene. */ size_t getLightCount() const noexcept; @@ -168,6 +176,10 @@ class UTILS_PUBLIC Scene : public FilamentAPI { * @param functor User provided functor called for each entity in the scene */ void forEach(utils::Invocable&& functor) const noexcept; + +protected: + // prevent heap allocation + ~Scene() = default; }; } // namespace filament diff --git a/filament/include/filament/SkinningBuffer.h b/filament/include/filament/SkinningBuffer.h index 007feb85085..ac440425cbc 100644 --- a/filament/include/filament/SkinningBuffer.h +++ b/filament/include/filament/SkinningBuffer.h @@ -26,7 +26,7 @@ #include #include - +#include namespace filament { @@ -39,7 +39,7 @@ class UTILS_PUBLIC SkinningBuffer : public FilamentAPI { struct BuilderDetails; public: - class Builder : public BuilderBase { + class Builder : public BuilderBase, public BuilderNameMixin { friend struct BuilderDetails; public: Builder() noexcept; @@ -69,13 +69,27 @@ class UTILS_PUBLIC SkinningBuffer : public FilamentAPI { */ Builder& initialize(bool initialize = true) noexcept; + /** + * Associate an optional name with this SkinningBuffer for debugging purposes. + * + * name will show in error messages and should be kept as short as possible. The name is + * truncated to a maximum of 128 characters. + * + * The name string is copied during this method so clients may free its memory after + * the function returns. + * + * @param name A string to identify this SkinningBuffer + * @param len Length of name, should be less than or equal to 128 + * @return This Builder, for chaining calls. + */ + Builder& name(const char* UTILS_NONNULL name, size_t len) noexcept; + /** * Creates the SkinningBuffer object and returns a pointer to it. * * @param engine Reference to the filament::Engine to associate this SkinningBuffer with. * - * @return pointer to the newly created object or nullptr if exceptions are disabled and - * an error occurred. + * @return pointer to the newly created object. * * @exception utils::PostConditionPanic if a runtime error occurred, such as running out of * memory or other resources. @@ -83,7 +97,7 @@ class UTILS_PUBLIC SkinningBuffer : public FilamentAPI { * * @see SkinningBuffer::setBones */ - SkinningBuffer* build(Engine& engine); + SkinningBuffer* UTILS_NONNULL build(Engine& engine); private: friend class FSkinningBuffer; }; @@ -96,7 +110,7 @@ class UTILS_PUBLIC SkinningBuffer : public FilamentAPI { * @param offset offset in elements (not bytes) in the SkinningBuffer (not in transforms) * @see RenderableManager::setSkinningBuffer */ - void setBones(Engine& engine, RenderableManager::Bone const* transforms, + void setBones(Engine& engine, RenderableManager::Bone const* UTILS_NONNULL transforms, size_t count, size_t offset = 0); /** @@ -107,7 +121,7 @@ class UTILS_PUBLIC SkinningBuffer : public FilamentAPI { * @param offset offset in elements (not bytes) in the SkinningBuffer (not in transforms) * @see RenderableManager::setSkinningBuffer */ - void setBones(Engine& engine, math::mat4f const* transforms, + void setBones(Engine& engine, math::mat4f const* UTILS_NONNULL transforms, size_t count, size_t offset = 0); /** @@ -115,6 +129,10 @@ class UTILS_PUBLIC SkinningBuffer : public FilamentAPI { * @return The number of bones the SkinningBuffer holds. */ size_t getBoneCount() const noexcept; + +protected: + // prevent heap allocation + ~SkinningBuffer() = default; }; } // namespace filament diff --git a/filament/include/filament/Skybox.h b/filament/include/filament/Skybox.h index 5e9f2c60636..ce203aae6a1 100644 --- a/filament/include/filament/Skybox.h +++ b/filament/include/filament/Skybox.h @@ -23,9 +23,10 @@ #include -#include #include +#include + namespace filament { class FSkybox; @@ -91,7 +92,7 @@ class UTILS_PUBLIC Skybox : public FilamentAPI { * * @see Texture */ - Builder& environment(Texture* cubemap) noexcept; + Builder& environment(Texture* UTILS_NONNULL cubemap) noexcept; /** * Indicates whether the sun should be rendered. The sun can only be @@ -135,9 +136,9 @@ class UTILS_PUBLIC Skybox : public FilamentAPI { * * @param engine Reference to the filament::Engine to associate this Skybox with. * - * @return pointer to the newly created object, or nullptr if the light couldn't be created. + * @return pointer to the newly created object. */ - Skybox* build(Engine& engine); + Skybox* UTILS_NONNULL build(Engine& engine); private: friend class FSkybox; @@ -171,9 +172,13 @@ class UTILS_PUBLIC Skybox : public FilamentAPI { float getIntensity() const noexcept; /** - * @return the associated texture, or null if it does not exist + * @return the associated texture */ - Texture const* getTexture() const noexcept; + Texture const* UTILS_NONNULL getTexture() const noexcept; + +protected: + // prevent heap allocation + ~Skybox() = default; }; } // namespace filament diff --git a/filament/include/filament/Stream.h b/filament/include/filament/Stream.h index 7fccecfe3ee..f9e5a60e8ee 100644 --- a/filament/include/filament/Stream.h +++ b/filament/include/filament/Stream.h @@ -20,12 +20,12 @@ #include #include - -#include #include #include +#include + namespace filament { class FStream; @@ -94,7 +94,7 @@ class UTILS_PUBLIC Stream : public FilamentAPI { * * To create a NATIVE stream, call the
    stream
    method on the builder. */ - class Builder : public BuilderBase { + class Builder : public BuilderBase, public BuilderNameMixin { friend struct BuilderDetails; public: Builder() noexcept; @@ -114,7 +114,7 @@ class UTILS_PUBLIC Stream : public FilamentAPI { * * @return This Builder, for chaining calls. */ - Builder& stream(void* stream) noexcept; + Builder& stream(void* UTILS_NULLABLE stream) noexcept; /** * @@ -136,14 +136,29 @@ class UTILS_PUBLIC Stream : public FilamentAPI { */ Builder& height(uint32_t height) noexcept; + /** + * Associate an optional name with this Stream for debugging purposes. + * + * name will show in error messages and should be kept as short as possible. The name is + * truncated to a maximum of 128 characters. + * + * The name string is copied during this method so clients may free its memory after + * the function returns. + * + * @param name A string to identify this Stream + * @param len Length of name, should be less than or equal to 128 + * @return This Builder, for chaining calls. + */ + Builder& name(const char* UTILS_NONNULL name, size_t len) noexcept; + /** * Creates the Stream object and returns a pointer to it. * * @param engine Reference to the filament::Engine to associate this Stream with. * - * @return pointer to the newly created object, or nullptr if the stream couldn't be created. + * @return pointer to the newly created object. */ - Stream* build(Engine& engine); + Stream* UTILS_NONNULL build(Engine& engine); private: friend class FStream; @@ -171,11 +186,12 @@ class UTILS_PUBLIC Stream : public FilamentAPI { * * @param image Pointer to AHardwareBuffer, casted to void* since this is a public header. * @param callback This is triggered by Filament when it wishes to release the image. - * It callback tales two arguments: the AHardwareBuffer and the userdata. + * The callback tales two arguments: the AHardwareBuffer and the userdata. * @param userdata Optional closure data. Filament will pass this into the callback when it * releases the image. */ - void setAcquiredImage(void* image, Callback callback, void* userdata) noexcept; + void setAcquiredImage(void* UTILS_NONNULL image, + Callback UTILS_NONNULL callback, void* UTILS_NULLABLE userdata) noexcept; /** * @see setAcquiredImage(void*, Callback, void*) @@ -187,7 +203,9 @@ class UTILS_PUBLIC Stream : public FilamentAPI { * @param userdata Optional closure data. Filament will pass this into the callback when it * releases the image. */ - void setAcquiredImage(void* image, backend::CallbackHandler* handler, Callback callback, void* userdata) noexcept; + void setAcquiredImage(void* UTILS_NONNULL image, + backend::CallbackHandler* UTILS_NULLABLE handler, + Callback UTILS_NONNULL callback, void* UTILS_NULLABLE userdata) noexcept; /** * Updates the size of the incoming stream. Whether this value is used is @@ -207,6 +225,10 @@ class UTILS_PUBLIC Stream : public FilamentAPI { * @return timestamp in nanosecond. */ int64_t getTimestamp() const noexcept; + +protected: + // prevent heap allocation + ~Stream() = default; }; } // namespace filament diff --git a/filament/include/filament/SwapChain.h b/filament/include/filament/SwapChain.h index 24847607509..9b7e9cfa18c 100644 --- a/filament/include/filament/SwapChain.h +++ b/filament/include/filament/SwapChain.h @@ -18,13 +18,20 @@ #define TNT_FILAMENT_SWAPCHAIN_H #include + +#include #include #include #include +#include + +#include namespace filament { +class Engine; + /** * A swap chain represents an Operating System's *native* renderable surface. * @@ -109,7 +116,7 @@ namespace filament { * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * SDL_SysWMinfo wmi; * SDL_VERSION(&wmi.version); - * ASSERT_POSTCONDITION(SDL_GetWindowWMInfo(sdlWindow, &wmi), "SDL version unsupported!"); + * FILAMENT_CHECK_POSTCONDITION(SDL_GetWindowWMInfo(sdlWindow, &wmi)) << "SDL version unsupported!"; * HDC nativeWindow = (HDC) wmi.info.win.hdc; * * using namespace filament; @@ -146,9 +153,13 @@ namespace filament { class UTILS_PUBLIC SwapChain : public FilamentAPI { public: using FrameScheduledCallback = backend::FrameScheduledCallback; - using FrameCompletedCallback = backend::FrameCompletedCallback; + using FrameCompletedCallback = utils::Invocable; + /** + * Requests a SwapChain with an alpha channel. + */ static const uint64_t CONFIG_TRANSPARENT = backend::SWAP_CHAIN_CONFIG_TRANSPARENT; + /** * This flag indicates that the swap chain may be used as a source surface * for reading back render results. This config must be set when creating @@ -178,7 +189,83 @@ class UTILS_PUBLIC SwapChain : public FilamentAPI { static const uint64_t CONFIG_APPLE_CVPIXELBUFFER = backend::SWAP_CHAIN_CONFIG_APPLE_CVPIXELBUFFER; - void* getNativeWindow() const noexcept; + /** + * Indicates that the SwapChain must automatically perform linear to sRGB encoding. + * + * This flag is ignored if isSRGBSwapChainSupported() is false. + * + * When using this flag, the output colorspace in ColorGrading should be set to + * Rec709-Linear-D65, or post-processing should be disabled. + * + * @see isSRGBSwapChainSupported() + * @see ColorGrading.outputColorSpace() + * @see View.setPostProcessingEnabled() + */ + static constexpr uint64_t CONFIG_SRGB_COLORSPACE = backend::SWAP_CHAIN_CONFIG_SRGB_COLORSPACE; + + /** + * Indicates that this SwapChain should allocate a stencil buffer in addition to a depth buffer. + * + * This flag is necessary when using View::setStencilBufferEnabled and rendering directly into + * the SwapChain (when post-processing is disabled). + * + * The specific format of the stencil buffer depends on platform support. The following pixel + * formats are tried, in order of preference: + * + * Depth only (without CONFIG_HAS_STENCIL_BUFFER): + * - DEPTH32F + * - DEPTH24 + * + * Depth + stencil (with CONFIG_HAS_STENCIL_BUFFER): + * - DEPTH32F_STENCIL8 + * - DEPTH24F_STENCIL8 + * + * Note that enabling the stencil buffer may hinder depth precision and should only be used if + * necessary. + * + * @see View.setStencilBufferEnabled + * @see View.setPostProcessingEnabled + */ + static constexpr uint64_t CONFIG_HAS_STENCIL_BUFFER = backend::SWAP_CHAIN_CONFIG_HAS_STENCIL_BUFFER; + + /** + * The SwapChain contains protected content. Only supported when isProtectedContentSupported() + * is true. + */ + static constexpr uint64_t CONFIG_PROTECTED_CONTENT = backend::SWAP_CHAIN_CONFIG_PROTECTED_CONTENT; + + /** + * Return whether createSwapChain supports the CONFIG_PROTECTED_CONTENT flag. + * The default implementation returns false. + * + * @param engine A pointer to the filament Engine + * @return true if CONFIG_PROTECTED_CONTENT is supported, false otherwise. + */ + static bool isProtectedContentSupported(Engine& engine) noexcept; + + /** + * Return whether createSwapChain supports the CONFIG_SRGB_COLORSPACE flag. + * The default implementation returns false. + * + * @param engine A pointer to the filament Engine + * @return true if CONFIG_SRGB_COLORSPACE is supported, false otherwise. + */ + static bool isSRGBSwapChainSupported(Engine& engine) noexcept; + + void* UTILS_NULLABLE getNativeWindow() const noexcept; + + /** + * If this flag is passed to setFrameScheduledCallback, then the behavior of the default + * CallbackHandler (when nullptr is passed as the handler argument) is altered to call the + * callback on the Metal completion handler thread (as opposed to the main Filament thread). + * This flag also instructs the Metal backend to release the associated CAMetalDrawable on the + * completion handler thread. + * + * This flag has no effect if a custom CallbackHandler is passed. + * + * @see setFrameScheduledCallback + */ + static constexpr uint64_t CALLBACK_DEFAULT_USE_METAL_COMPLETION_HANDLER = 1; /** * FrameScheduledCallback is a callback function that notifies an application when Filament has @@ -191,38 +278,76 @@ class UTILS_PUBLIC SwapChain : public FilamentAPI { * backend. * * A FrameScheduledCallback can be set on an individual SwapChain through - * SwapChain::setFrameScheduledCallback. If the callback is set, then the SwapChain will *not* - * automatically schedule itself for presentation. Instead, the application must call the - * PresentCallable passed to the FrameScheduledCallback. + * SwapChain::setFrameScheduledCallback. If the callback is set for a given frame, then the + * SwapChain will *not* automatically schedule itself for presentation. Instead, the application + * must call the PresentCallable passed to the FrameScheduledCallback. + * + * Each SwapChain can have only one FrameScheduledCallback set per frame. If + * setFrameScheduledCallback is called multiple times on the same SwapChain before + * Renderer::endFrame(), the most recent call effectively overwrites any previously set + * callback. This allows the callback to be updated as needed before the frame has finished + * encoding. + * + * The "last" callback set by setFrameScheduledCallback gets "latched" when Renderer::endFrame() + * is executed. At this point, the state of the callback is fixed and is the one used for the + * frame that was just encoded. Subsequent changes to the callback using + * setFrameScheduledCallback after endFrame() apply to the next frame. * - * @param callback A callback, or nullptr to unset. - * @param user An optional pointer to user data passed to the callback function. + * Use \c setFrameScheduledCallback() (with default arguments) to unset the callback. + * + * If your application delays the call to the PresentCallable by, for example, calling it on a + * separate thread, you must ensure all PresentCallables have been called before shutting down + * the Filament Engine. You can do this by issuing an Engine::flushAndWait before calling + * Engine::shutdown. This is necessary to ensure the Filament Engine has had a chance to clean + * up all memory related to frame presentation. + * + * @param handler Handler to dispatch the callback or nullptr for the default handler. + * @param callback Callback called when the frame is scheduled. * * @remark Only Filament's Metal backend supports PresentCallables and frame callbacks. Other * backends ignore the callback (which will never be called) and proceed normally. * - * @remark The SwapChain::FrameScheduledCallback is called on an arbitrary thread. - * + * @see CallbackHandler * @see PresentCallable */ - void setFrameScheduledCallback(FrameScheduledCallback callback, void* user = nullptr); + void setFrameScheduledCallback(backend::CallbackHandler* UTILS_NULLABLE handler = nullptr, + FrameScheduledCallback&& callback = {}, uint64_t flags = 0); + + /** + * Returns whether or not this SwapChain currently has a FrameScheduledCallback set. + * + * @return true, if the last call to setFrameScheduledCallback set a callback + * + * @see SwapChain::setFrameCompletedCallback + */ + bool isFrameScheduledCallbackSet() const noexcept; /** * FrameCompletedCallback is a callback function that notifies an application when a frame's * contents have completed rendering on the GPU. * * Use SwapChain::setFrameCompletedCallback to set a callback on an individual SwapChain. Each - * time a frame completes GPU rendering, the callback will be called with optional user data. + * time a frame completes GPU rendering, the callback will be called. + * + * If handler is nullptr, the callback is guaranteed to be called on the main Filament thread. * - * The FrameCompletedCallback is guaranteed to be called on the main Filament thread. + * Use \c setFrameCompletedCallback() (with default arguments) to unset the callback. * - * @param callback A callback, or nullptr to unset. - * @param user An optional pointer to user data passed to the callback function. + * @param handler Handler to dispatch the callback or nullptr for the default handler. + * @param callback Callback called when each frame completes. * * @remark Only Filament's Metal backend supports frame callbacks. Other backends ignore the * callback (which will never be called) and proceed normally. + * + * @see CallbackHandler */ - void setFrameCompletedCallback(FrameCompletedCallback callback, void* user = nullptr); + void setFrameCompletedCallback(backend::CallbackHandler* UTILS_NULLABLE handler = nullptr, + FrameCompletedCallback&& callback = {}) noexcept; + + +protected: + // prevent heap allocation + ~SwapChain() = default; }; } // namespace filament diff --git a/filament/include/filament/Texture.h b/filament/include/filament/Texture.h index c005c2b165e..12b28358a96 100644 --- a/filament/include/filament/Texture.h +++ b/filament/include/filament/Texture.h @@ -20,12 +20,16 @@ #define TNT_FILAMENT_TEXTURE_H #include + #include #include #include +#include + #include +#include namespace filament { @@ -84,10 +88,13 @@ class UTILS_PUBLIC Texture : public FilamentAPI { /** @return whether a backend supports a particular format. */ static bool isTextureFormatSupported(Engine& engine, InternalFormat format) noexcept; + /** @return whether this backend supports protected textures. */ + static bool isProtectedTexturesSupported(Engine& engine) noexcept; + /** @return whether a backend supports texture swizzling. */ static bool isTextureSwizzleSupported(Engine& engine) noexcept; - static size_t computeTextureDataSize(Texture::Format format, Texture::Type type, + static size_t computeTextureDataSize(Format format, Type type, size_t stride, size_t height, size_t alignment) noexcept; @@ -105,7 +112,7 @@ class UTILS_PUBLIC Texture : public FilamentAPI { //! Use Builder to construct a Texture object instance - class Builder : public BuilderBase { + class Builder : public BuilderBase, public BuilderNameMixin { friend struct BuilderDetails; public: Builder() noexcept; @@ -195,19 +202,33 @@ class UTILS_PUBLIC Texture : public FilamentAPI { */ Builder& swizzle(Swizzle r, Swizzle g, Swizzle b, Swizzle a) noexcept; + /** + * Associate an optional name with this Texture for debugging purposes. + * + * name will show in error messages and should be kept as short as possible. The name is + * truncated to a maximum of 128 characters. + * + * The name string is copied during this method so clients may free its memory after + * the function returns. + * + * @param name A string to identify this Texture + * @param len Length of name, should be less than or equal to 128 + * @return This Builder, for chaining calls. + */ + Builder& name(const char* UTILS_NONNULL name, size_t len) noexcept; + /** * Creates the Texture object and returns a pointer to it. * * @param engine Reference to the filament::Engine to associate this Texture with. * - * @return pointer to the newly created object or nullptr if exceptions are disabled and - * an error occurred. + * @return pointer to the newly created object. * * @exception utils::PostConditionPanic if a runtime error occurred, such as running out of * memory or other resources. * @exception utils::PreConditionPanic if a parameter to a builder function was invalid. */ - Texture* build(Engine& engine); + Texture* UTILS_NONNULL build(Engine& engine); /* no user serviceable parts below */ @@ -240,6 +261,18 @@ class UTILS_PUBLIC Texture : public FilamentAPI { */ Builder& import(intptr_t id) noexcept; + /** + * Creates an external texture. The content must be set using setExternalImage(). + * The sampler can be SAMPLER_EXTERNAL or SAMPLER_2D depending on the format. Generally + * YUV formats must use SAMPLER_EXTERNAL. This depends on the backend features and is not + * validated. + * + * If the Sampler is set to SAMPLER_EXTERNAL, external() is implied. + * + * @return + */ + Builder& external() noexcept; + private: friend class FTexture; }; @@ -374,7 +407,7 @@ class UTILS_PUBLIC Texture : public FilamentAPI { /** - * Specify the external image to associate with this Texture. Typically the external + * Specify the external image to associate with this Texture. Typically, the external * image is OS specific, and can be a video or camera frame. * There are many restrictions when using an external image as a texture, such as: * - only the level of detail (lod) 0 can be specified @@ -396,10 +429,10 @@ class UTILS_PUBLIC Texture : public FilamentAPI { * @see Builder::sampler() * */ - void setExternalImage(Engine& engine, void* image) noexcept; + void setExternalImage(Engine& engine, void* UTILS_NONNULL image) noexcept; /** - * Specify the external image and plane to associate with this Texture. Typically the external + * Specify the external image and plane to associate with this Texture. Typically, the external * image is OS specific, and can be a video or camera frame. When using this method, the * external image must be a planar type (such as a YUV camera frame). The plane parameter * selects which image plane is bound to this texture. @@ -427,7 +460,7 @@ class UTILS_PUBLIC Texture : public FilamentAPI { * kCVPixelFormatType_420YpCbCr8BiPlanarFullRange images. On platforms * other than iOS, this method is a no-op. */ - void setExternalImage(Engine& engine, void* image, size_t plane) noexcept; + void setExternalImage(Engine& engine, void* UTILS_NONNULL image, size_t plane) noexcept; /** * Specify the external stream to associate with this Texture. Typically the external @@ -446,16 +479,17 @@ class UTILS_PUBLIC Texture : public FilamentAPI { * @see Builder::sampler(), Stream * */ - void setExternalStream(Engine& engine, Stream* stream) noexcept; + void setExternalStream(Engine& engine, Stream* UTILS_NULLABLE stream) noexcept; /** * Generates all the mipmap levels automatically. This requires the texture to have a - * color-renderable format. + * color-renderable format and usage set to BLIT_SRC | BLIT_DST. If unspecified, + * usage bits are set automatically. * * @param engine Engine this texture is associated to. * * @attention \p engine must be the instance passed to Builder::build() - * @attention This Texture instance must NOT use Sampler::SAMPLER_CUBEMAP or it has no effect + * @attention This Texture instance must NOT use SamplerType::SAMPLER_3D or it has no effect */ void generateMipmaps(Engine& engine) const noexcept; @@ -495,7 +529,7 @@ class UTILS_PUBLIC Texture : public FilamentAPI { */ void generatePrefilterMipmap(Engine& engine, PixelBufferDescriptor&& buffer, const FaceOffsets& faceOffsets, - PrefilterOptions const* options = nullptr); + PrefilterOptions const* UTILS_NULLABLE options = nullptr); /** @deprecated */ @@ -541,6 +575,10 @@ class UTILS_PUBLIC Texture : public FilamentAPI { return *this; } }; + +protected: + // prevent heap allocation + ~Texture() = default; }; } // namespace filament diff --git a/filament/include/filament/TextureSampler.h b/filament/include/filament/TextureSampler.h index 4a4cb9cb856..ba5e5534857 100644 --- a/filament/include/filament/TextureSampler.h +++ b/filament/include/filament/TextureSampler.h @@ -25,6 +25,8 @@ #include +#include + namespace filament { /** @@ -52,6 +54,8 @@ class UTILS_PUBLIC TextureSampler { */ TextureSampler() noexcept = default; + explicit TextureSampler(backend::SamplerParams params) noexcept : mSamplerParams(params) { } + TextureSampler(const TextureSampler& rhs) noexcept = default; TextureSampler& operator=(const TextureSampler& rhs) noexcept = default; diff --git a/filament/include/filament/ToneMapper.h b/filament/include/filament/ToneMapper.h index 8d19c59756b..e89e702c99d 100644 --- a/filament/include/filament/ToneMapper.h +++ b/filament/include/filament/ToneMapper.h @@ -21,6 +21,8 @@ #include +#include + namespace filament { /** @@ -37,10 +39,12 @@ namespace filament { * * - Configurable tone mapping operators * - GenericToneMapper + * - AgXToneMapper * - Fixed-aesthetic tone mapping operators * - ACESToneMapper * - ACESLegacyToneMapper * - FilmicToneMapper + * - PBRNeutralToneMapper * - Debug/validation tone mapping operators * - LinearToneMapper * - DisplayRangeToneMapper @@ -115,6 +119,41 @@ struct UTILS_PUBLIC FilmicToneMapper final : public ToneMapper { math::float3 operator()(math::float3 x) const noexcept override; }; +/** + * Khronos PBR Neutral tone mapping operator. This tone mapper was designed + * to preserve the appearance of materials across lighting conditions while + * avoiding artifacts in the highlights in high dynamic range conditions. + */ +struct UTILS_PUBLIC PBRNeutralToneMapper final : public ToneMapper { + PBRNeutralToneMapper() noexcept; + ~PBRNeutralToneMapper() noexcept final; + + math::float3 operator()(math::float3 x) const noexcept override; +}; + +/** + * AgX tone mapping operator. + */ +struct UTILS_PUBLIC AgxToneMapper final : public ToneMapper { + enum class AgxLook : uint8_t { + NONE = 0, //!< Base contrast with no look applied + PUNCHY, //!< A punchy and more chroma laden look for sRGB displays + GOLDEN //!< A golden tinted, slightly washed look for BT.1886 displays + }; + + /** + * Builds a new AgX tone mapper. + * + * @param look an optional creative adjustment to contrast and saturation + */ + explicit AgxToneMapper(AgxLook look = AgxLook::NONE) noexcept; + ~AgxToneMapper() noexcept final; + + math::float3 operator()(math::float3 x) const noexcept override; + + AgxLook look; +}; + /** * Generic tone mapping operator that gives control over the tone mapping * curve. This operator can be used to control the aesthetics of the final @@ -159,9 +198,6 @@ struct UTILS_PUBLIC GenericToneMapper final : public ToneMapper { /** Returns the contrast of the curve as a strictly positive value. */ float getContrast() const noexcept; - /** Returns how fast scene referred values map to output white as a value between 0.0 and 1.0. */ - float getShoulder() const noexcept; - /** Returns the middle gray point for input values as a value between 0.0 and 1.0. */ float getMidGrayIn() const noexcept; diff --git a/filament/include/filament/TransformManager.h b/filament/include/filament/TransformManager.h index 9afa6897128..5d612a1634c 100644 --- a/filament/include/filament/TransformManager.h +++ b/filament/include/filament/TransformManager.h @@ -26,6 +26,7 @@ #include +#include namespace utils { class Entity; @@ -118,6 +119,29 @@ class UTILS_PUBLIC TransformManager : public FilamentAPI { */ Instance getInstance(utils::Entity e) const noexcept; + /** + * @return the number of Components + */ + size_t getComponentCount() const noexcept; + + /** + * @return true if the this manager has no components + */ + bool empty() const noexcept; + + /** + * Retrieve the `Entity` of the component from its `Instance`. + * @param i Instance of the component obtained from getInstance() + * @return + */ + utils::Entity getEntity(Instance i) const noexcept; + + /** + * Retrieve the Entities of all the components of this manager. + * @return A list, in no particular order, of all the entities managed by this manager. + */ + utils::Entity const* UTILS_NONNULL getEntities() const noexcept; + /** * Enables or disable the accurate translation mode. Disabled by default. * @@ -200,7 +224,7 @@ class UTILS_PUBLIC TransformManager : public FilamentAPI { * @param count The maximum number of children to retrieve. * @return The number of children written to the pointer. */ - size_t getChildren(Instance i, utils::Entity* children, size_t count) const noexcept; + size_t getChildren(Instance i, utils::Entity* UTILS_NONNULL children, size_t count) const noexcept; /** * Returns an iterator to the Instance of the first child of the given parent. @@ -261,7 +285,7 @@ class UTILS_PUBLIC TransformManager : public FilamentAPI { * returns the value set by setTransform(). * @see setTransform() */ - const math::mat4 getTransformAccurate(Instance ci) const noexcept; + math::mat4 getTransformAccurate(Instance ci) const noexcept; /** * Return the world transform of a transform component. @@ -279,7 +303,7 @@ class UTILS_PUBLIC TransformManager : public FilamentAPI { * composition of this component's local transform with its parent's world transform. * @see setTransform() */ - const math::mat4 getWorldTransformAccurate(Instance ci) const noexcept; + math::mat4 getWorldTransformAccurate(Instance ci) const noexcept; /** * Opens a local transform transaction. During a transaction, getWorldTransform() can @@ -308,6 +332,10 @@ class UTILS_PUBLIC TransformManager : public FilamentAPI { * @see openLocalTransformTransaction(), setTransform() */ void commitLocalTransformTransaction() noexcept; + +protected: + // prevent heap allocation + ~TransformManager() = default; }; } // namespace filament diff --git a/filament/include/filament/VertexBuffer.h b/filament/include/filament/VertexBuffer.h index 9557a541bc0..b850aab71a4 100644 --- a/filament/include/filament/VertexBuffer.h +++ b/filament/include/filament/VertexBuffer.h @@ -27,6 +27,9 @@ #include +#include +#include + namespace filament { class FVertexBuffer; @@ -58,7 +61,7 @@ class UTILS_PUBLIC VertexBuffer : public FilamentAPI { using AttributeType = backend::ElementType; using BufferDescriptor = backend::BufferDescriptor; - class Builder : public BuilderBase { + class Builder : public BuilderBase, public BuilderNameMixin { friend struct BuilderDetails; public: Builder() noexcept; @@ -142,19 +145,46 @@ class UTILS_PUBLIC VertexBuffer : public FilamentAPI { */ Builder& normalized(VertexAttribute attribute, bool normalize = true) noexcept; + /** + * Sets advanced skinning mode. Bone data, indices and weights will be + * set in RenderableManager:Builder:boneIndicesAndWeights methods. + * Works with or without buffer objects. + * + * @param enabled If true, enables advanced skinning mode. False by default. + * + * @return A reference to this Builder for chaining calls. + * + * @see RenderableManager:Builder:boneIndicesAndWeights + */ + Builder& advancedSkinning(bool enabled) noexcept; + + /** + * Associate an optional name with this VertexBuffer for debugging purposes. + * + * name will show in error messages and should be kept as short as possible. The name is + * truncated to a maximum of 128 characters. + * + * The name string is copied during this method so clients may free its memory after + * the function returns. + * + * @param name A string to identify this VertexBuffer + * @param len Length of name, should be less than or equal to 128 + * @return This Builder, for chaining calls. + */ + Builder& name(const char* UTILS_NONNULL name, size_t len) noexcept; + /** * Creates the VertexBuffer object and returns a pointer to it. * * @param engine Reference to the filament::Engine to associate this VertexBuffer with. * - * @return pointer to the newly created object or nullptr if exceptions are disabled and - * an error occurred. + * @return pointer to the newly created object. * * @exception utils::PostConditionPanic if a runtime error occurred, such as running out of * memory or other resources. * @exception utils::PreConditionPanic if a parameter to a builder function was invalid. */ - VertexBuffer* build(Engine& engine); + VertexBuffer* UTILS_NONNULL build(Engine& engine); private: friend class FVertexBuffer; @@ -193,7 +223,12 @@ class UTILS_PUBLIC VertexBuffer : public FilamentAPI { * and Builder::bufferCount() - 1. * @param bufferObject The handle to the GPU data that will be used in this buffer slot. */ - void setBufferObjectAt(Engine& engine, uint8_t bufferIndex, BufferObject const* bufferObject); + void setBufferObjectAt(Engine& engine, uint8_t bufferIndex, + BufferObject const* UTILS_NONNULL bufferObject); + +protected: + // prevent heap allocation + ~VertexBuffer() = default; }; } // namespace filament diff --git a/filament/include/filament/View.h b/filament/include/filament/View.h index 5153b868f49..5c258e5107c 100644 --- a/filament/include/filament/View.h +++ b/filament/include/filament/View.h @@ -19,17 +19,20 @@ #ifndef TNT_FILAMENT_VIEW_H #define TNT_FILAMENT_VIEW_H -#include #include #include -#include - #include #include +#include #include +#include + +#include +#include + namespace filament { namespace backend { @@ -38,6 +41,7 @@ class CallbackHandler; class Camera; class ColorGrading; +class Engine; class MaterialInstance; class RenderTarget; class Scene; @@ -66,31 +70,32 @@ class Viewport; */ class UTILS_PUBLIC View : public FilamentAPI { public: - using QualityLevel = QualityLevel; - using BlendMode = BlendMode; - using AntiAliasing = AntiAliasing; - using Dithering = Dithering; - using ShadowType = ShadowType; - - using DynamicResolutionOptions = DynamicResolutionOptions; - using BloomOptions = BloomOptions; - using FogOptions = FogOptions; - using DepthOfFieldOptions = DepthOfFieldOptions; - using VignetteOptions = VignetteOptions; - using RenderQuality = RenderQuality; - using AmbientOcclusionOptions = AmbientOcclusionOptions; - using TemporalAntiAliasingOptions = TemporalAntiAliasingOptions; - using MultiSampleAntiAliasingOptions = MultiSampleAntiAliasingOptions; - using VsmShadowOptions = VsmShadowOptions; - using SoftShadowOptions = SoftShadowOptions; - using ScreenSpaceReflectionsOptions = ScreenSpaceReflectionsOptions; - using GuardBandOptions = GuardBandOptions; + using QualityLevel = filament::QualityLevel; + using BlendMode = filament::BlendMode; + using AntiAliasing = filament::AntiAliasing; + using Dithering = filament::Dithering; + using ShadowType = filament::ShadowType; + + using DynamicResolutionOptions = filament::DynamicResolutionOptions; + using BloomOptions = filament::BloomOptions; + using FogOptions = filament::FogOptions; + using DepthOfFieldOptions = filament::DepthOfFieldOptions; + using VignetteOptions = filament::VignetteOptions; + using RenderQuality = filament::RenderQuality; + using AmbientOcclusionOptions = filament::AmbientOcclusionOptions; + using TemporalAntiAliasingOptions = filament::TemporalAntiAliasingOptions; + using MultiSampleAntiAliasingOptions = filament::MultiSampleAntiAliasingOptions; + using VsmShadowOptions = filament::VsmShadowOptions; + using SoftShadowOptions = filament::SoftShadowOptions; + using ScreenSpaceReflectionsOptions = filament::ScreenSpaceReflectionsOptions; + using GuardBandOptions = filament::GuardBandOptions; + using StereoscopicOptions = filament::StereoscopicOptions; /** * Sets the View's name. Only useful for debugging. * @param name Pointer to the View's name. The string is copied. */ - void setName(const char* name) noexcept; + void setName(const char* UTILS_NONNULL name) noexcept; /** * Returns the View's name @@ -99,7 +104,7 @@ class UTILS_PUBLIC View : public FilamentAPI { * * @attention Do *not* free the pointer or modify its content. */ - const char* getName() const noexcept; + const char* UTILS_NULLABLE getName() const noexcept; /** * Set this View instance's Scene. @@ -115,19 +120,19 @@ class UTILS_PUBLIC View : public FilamentAPI { * There is no reference-counting. * Make sure to dissociate a Scene from all Views before destroying it. */ - void setScene(Scene* scene); + void setScene(Scene* UTILS_NULLABLE scene); /** * Returns the Scene currently associated with this View. * @return A pointer to the Scene associated to this View. nullptr if no Scene is set. */ - Scene* getScene() noexcept; + Scene* UTILS_NULLABLE getScene() noexcept; /** * Returns the Scene currently associated with this View. * @return A pointer to the Scene associated to this View. nullptr if no Scene is set. */ - Scene const* getScene() const noexcept { + Scene const* UTILS_NULLABLE getScene() const noexcept { return const_cast(this)->getScene(); } @@ -142,7 +147,7 @@ class UTILS_PUBLIC View : public FilamentAPI { * * @param renderTarget Render target associated with view, or nullptr for the swap chain. */ - void setRenderTarget(RenderTarget* renderTarget) noexcept; + void setRenderTarget(RenderTarget* UTILS_NULLABLE renderTarget) noexcept; /** * Gets the offscreen render target associated with this view. @@ -151,7 +156,7 @@ class UTILS_PUBLIC View : public FilamentAPI { * * @see setRenderTarget */ - RenderTarget* getRenderTarget() const noexcept; + RenderTarget* UTILS_NULLABLE getRenderTarget() const noexcept; /** * Sets the rectangular region to render to. @@ -184,7 +189,14 @@ class UTILS_PUBLIC View : public FilamentAPI { * There is no reference-counting. * Make sure to dissociate a Camera from all Views before destroying it. */ - void setCamera(Camera* camera) noexcept; + void setCamera(Camera* UTILS_NONNULL camera) noexcept; + + /** + * Returns whether a Camera is set. + * @return true if a camera is set. + * @see setCamera() + */ + bool hasCamera() const noexcept; /** * Returns the Camera currently associated with this View. @@ -401,13 +413,13 @@ class UTILS_PUBLIC View : public FilamentAPI { * There is no reference-counting. * Make sure to dissociate a ColorGrading from all Views before destroying it. */ - void setColorGrading(ColorGrading* colorGrading) noexcept; + void setColorGrading(ColorGrading* UTILS_NULLABLE colorGrading) noexcept; /** * Returns the color grading transforms currently associated to this view. * @return A pointer to the ColorGrading associated to this View. */ - const ColorGrading* getColorGrading() const noexcept; + const ColorGrading* UTILS_NULLABLE getColorGrading() const noexcept; /** * Sets ambient occlusion options. @@ -558,6 +570,13 @@ class UTILS_PUBLIC View : public FilamentAPI { */ void setShadowType(ShadowType shadow) noexcept; + /** + * Returns the shadow mapping technique used by this View. + * + * @return value set by setShadowType(). + */ + ShadowType getShadowType() const noexcept; + /** * Sets VSM shadowing options that apply across the entire View. * @@ -649,6 +668,26 @@ class UTILS_PUBLIC View : public FilamentAPI { */ bool isFrontFaceWindingInverted() const noexcept; + /** + * Enables or disables transparent picking. Disabled by default. + * + * When transparent picking is enabled, View::pick() will pick from both + * transparent and opaque renderables. When disabled, View::pick() will only + * pick from opaque renderables. + * + * @param enabled true enables transparent picking, false disables it. + * + * @note Transparent picking will create an extra pass for rendering depth + * from both transparent and opaque renderables. + */ + void setTransparentPickingEnabled(bool enabled) noexcept; + + /** + * Returns true if transparent picking is enabled. + * See setTransparentPickingEnabled() for more information. + */ + bool isTransparentPickingEnabled() const noexcept; + /** * Enables use of the stencil buffer. * @@ -661,7 +700,8 @@ class UTILS_PUBLIC View : public FilamentAPI { * Material's stencil comparison function and reference value. Fragments that don't pass the * stencil test are then discarded. * - * Post-processing must be enabled in order to use the stencil buffer. + * If post-processing is disabled, then the SwapChain must have the CONFIG_HAS_STENCIL_BUFFER + * flag set in order to use the stencil buffer. * * A renderable's priority (see RenderableManager::setPriority) is useful to control the order * in which primitives are drawn. @@ -676,6 +716,33 @@ class UTILS_PUBLIC View : public FilamentAPI { */ bool isStencilBufferEnabled() const noexcept; + /** + * Sets the stereoscopic rendering options for this view. + * + * Currently, only one type of stereoscopic rendering is supported: side-by-side. + * Side-by-side stereo rendering splits the viewport into two halves: a left and right half. + * Eye 0 will render to the left half, while Eye 1 will render into the right half. + * + * Currently, the following features are not supported with stereoscopic rendering: + * - post-processing + * - shadowing + * - punctual lights + * + * Stereo rendering depends on device and platform support. To check if stereo rendering is + * supported, use Engine::isStereoSupported(). If stereo rendering is not supported, then the + * stereoscopic options have no effect. + * + * @param options The stereoscopic options to use on this view + */ + void setStereoscopicOptions(StereoscopicOptions const& options) noexcept; + + /** + * Returns the stereoscopic options associated with this View. + * + * @return value set by setStereoscopicOptions(). + */ + StereoscopicOptions const& getStereoscopicOptions() const noexcept; + // for debugging... //! debugging: allows to entirely disable frustum culling. (culling enabled by default). @@ -685,10 +752,10 @@ class UTILS_PUBLIC View : public FilamentAPI { bool isFrustumCullingEnabled() const noexcept; //! debugging: sets the Camera used for rendering. It may be different from the culling camera. - void setDebugCamera(Camera* camera) noexcept; + void setDebugCamera(Camera* UTILS_NULLABLE camera) noexcept; //! debugging: returns a Camera from the point of view of *the* dominant directional light used for shadowing. - Camera const* getDirectionalLightCamera() const noexcept; + utils::FixedCapacityVector getDirectionalShadowCameras() const noexcept; /** Result of a picking query */ @@ -707,6 +774,9 @@ class UTILS_PUBLIC View : public FilamentAPI { * The viewport, projection and model matrices can be obtained from Camera. Because * pick() has some latency, it might be more accurate to obtain these values at the * time the View::pick() call is made. + * + * Note: if the Engine is running at FEATURE_LEVEL_0, the precision or `depth` and + * `fragCoords.z` is only 8-bits. */ math::float3 fragCoords; //! screen space coordinates in GL convention }; @@ -714,11 +784,12 @@ class UTILS_PUBLIC View : public FilamentAPI { /** User data for PickingQueryResultCallback */ struct PickingQuery { // note: this is enough to store a std::function<> -- just saying... - void* storage[4]; + void* UTILS_NULLABLE storage[4]; }; /** callback type used for picking queries. */ - using PickingQueryResultCallback = void(*)(PickingQueryResult const& result, PickingQuery* pq); + using PickingQueryResultCallback = + void(*)(PickingQueryResult const& result, PickingQuery* UTILS_NONNULL pq); /** * Helper for creating a picking query from Foo::method, by pointer. @@ -732,10 +803,10 @@ class UTILS_PUBLIC View : public FilamentAPI { * @param handler Handler to dispatch the callback or nullptr for the default handler. */ template - void pick(uint32_t x, uint32_t y, T* instance, backend::CallbackHandler* handler = nullptr) noexcept { + void pick(uint32_t x, uint32_t y, T* UTILS_NONNULL instance, + backend::CallbackHandler* UTILS_NULLABLE handler = nullptr) noexcept { PickingQuery& query = pick(x, y, [](PickingQueryResult const& result, PickingQuery* pq) { - void* user = pq->storage; - (*static_cast(user)->*method)(result); + (static_cast(pq->storage[0])->*method)(result); }, handler); query.storage[0] = instance; } @@ -752,11 +823,11 @@ class UTILS_PUBLIC View : public FilamentAPI { * @param handler Handler to dispatch the callback or nullptr for the default handler. */ template - void pick(uint32_t x, uint32_t y, T instance, backend::CallbackHandler* handler = nullptr) noexcept { + void pick(uint32_t x, uint32_t y, T instance, + backend::CallbackHandler* UTILS_NULLABLE handler = nullptr) noexcept { static_assert(sizeof(instance) <= sizeof(PickingQuery::storage), "user data too large"); PickingQuery& query = pick(x, y, [](PickingQueryResult const& result, PickingQuery* pq) { - void* user = pq->storage; - T* that = static_cast(user); + T* const that = static_cast(reinterpret_cast(pq->storage)); (that->*method)(result); that->~T(); }, handler); @@ -773,15 +844,15 @@ class UTILS_PUBLIC View : public FilamentAPI { * @param handler Handler to dispatch the callback or nullptr for the default handler. */ template - void pick(uint32_t x, uint32_t y, T functor, backend::CallbackHandler* handler = nullptr) noexcept { + void pick(uint32_t x, uint32_t y, T functor, + backend::CallbackHandler* UTILS_NULLABLE handler = nullptr) noexcept { static_assert(sizeof(functor) <= sizeof(PickingQuery::storage), "functor too large"); PickingQuery& query = pick(x, y, handler, (PickingQueryResultCallback)[](PickingQueryResult const& result, PickingQuery* pq) { - void* user = pq->storage; - T& that = *static_cast(user); - that(result); - that.~T(); - }); + T* const that = static_cast(reinterpret_cast(pq->storage)); + that->operator()(result); + that->~T(); + }); new(query.storage) T(std::move(functor)); } @@ -800,9 +871,52 @@ class UTILS_PUBLIC View : public FilamentAPI { * 8*sizeof(void*) bytes of user data. This user data is later accessible * in the PickingQueryResultCallback callback 3rd parameter. */ - PickingQuery& pick(uint32_t x, uint32_t y, backend::CallbackHandler* handler, - PickingQueryResultCallback callback) noexcept; + PickingQuery& pick(uint32_t x, uint32_t y, + backend::CallbackHandler* UTILS_NULLABLE handler, + PickingQueryResultCallback UTILS_NONNULL callback) noexcept; + + /** + * Set the value of material global variables. There are up-to four such variable each of + * type float4. These variables can be read in a user Material with + * `getMaterialGlobal{0|1|2|3}()`. All variable start with a default value of { 0, 0, 0, 1 } + * + * @param index index of the variable to set between 0 and 3. + * @param value new value for the variable. + * @see getMaterialGlobal + */ + void setMaterialGlobal(uint32_t index, math::float4 const& value); + + /** + * Get the value of the material global variables. + * All variable start with a default value of { 0, 0, 0, 1 } + * + * @param index index of the variable to set between 0 and 3. + * @return current value of the variable. + * @see setMaterialGlobal + */ + math::float4 getMaterialGlobal(uint32_t index) const; + + /** + * Get an Entity representing the large scale fog object. + * This entity is always inherited by the View's Scene. + * + * It is for example possible to create a TransformManager component with this + * Entity and apply a transformation globally on the fog. + * + * @return an Entity representing the large scale fog object. + */ + utils::Entity getFogEntity() const noexcept; + + /** + * When certain temporal features are used (e.g.: TAA or Screen-space reflections), the view + * keeps a history of previous frame renders associated with the Renderer the view was last + * used with. When switching Renderer, it may be necessary to clear that history by calling + * this method. Similarly, if the whole content of the screen change, like when a cut-scene + * starts, clearing the history might be needed to avoid artifacts due to the previous frame + * being very different. + */ + void clearFrameHistory(Engine& engine) noexcept; /** * List of available ambient occlusion techniques @@ -832,6 +946,10 @@ class UTILS_PUBLIC View : public FilamentAPI { */ UTILS_DEPRECATED AmbientOcclusion getAmbientOcclusion() const noexcept; + +protected: + // prevent heap allocation + ~View() = default; }; } // namespace filament diff --git a/filament/include/filament/Viewport.h b/filament/include/filament/Viewport.h index a641e7ab568..29916f704e8 100644 --- a/filament/include/filament/Viewport.h +++ b/filament/include/filament/Viewport.h @@ -23,9 +23,6 @@ #include -#include -#include - #include #include diff --git a/filament/src/Allocators.h b/filament/src/Allocators.h index eb354b8d329..84962e30c0e 100644 --- a/filament/src/Allocators.h +++ b/filament/src/Allocators.h @@ -54,7 +54,7 @@ using LinearAllocatorArena = utils::Arena< #endif -using ArenaScope = utils::ArenaScope; +using RootArenaScope = utils::ArenaScope; } // namespace filament diff --git a/filament/src/AtlasAllocator.cpp b/filament/src/AtlasAllocator.cpp index 4e541565a0d..cb122977377 100644 --- a/filament/src/AtlasAllocator.cpp +++ b/filament/src/AtlasAllocator.cpp @@ -22,7 +22,7 @@ namespace filament { using namespace utils; -static inline constexpr std::pair unmorton(uint16_t m) noexcept { +static inline constexpr std::pair unmorton(uint16_t const m) noexcept { uint32_t r = (m | (uint32_t(m) << 15u)) & 0x55555555u; r = (r | (r >> 1u)) & 0x33333333u; r = (r | (r >> 2u)) & 0x0f0f0f0fu; @@ -30,14 +30,14 @@ static inline constexpr std::pair unmorton(uint16_t m) noexcep return { uint8_t(r), uint8_t(r >> 16u) }; } -AtlasAllocator::AtlasAllocator(size_t maxTextureSize) noexcept { +AtlasAllocator::AtlasAllocator(size_t const maxTextureSize) noexcept { // round to power-of-two immediately inferior or equal to the size specified. - mMaxTextureSizePot = (sizeof(maxTextureSize) * 8 - 1u) - utils::clz(maxTextureSize); + mMaxTextureSizePot = (sizeof(maxTextureSize) * 8 - 1u) - clz(maxTextureSize); } -AtlasAllocator::Allocation AtlasAllocator::allocate(size_t textureSize) noexcept { +AtlasAllocator::Allocation AtlasAllocator::allocate(size_t const textureSize) noexcept { Allocation result{}; - const size_t powerOfTwo = (sizeof(textureSize) * 8 - 1u) - utils::clz(textureSize); + const size_t powerOfTwo = (sizeof(textureSize) * 8 - 1u) - clz(textureSize); // asked for a texture size too large if (UTILS_UNLIKELY(powerOfTwo > mMaxTextureSizePot)) { @@ -67,12 +67,12 @@ AtlasAllocator::Allocation AtlasAllocator::allocate(size_t textureSize) noexcept return result; } -void AtlasAllocator::clear(size_t maxTextureSize) noexcept { +void AtlasAllocator::clear(size_t const maxTextureSize) noexcept { std::fill(mQuadTree.begin(), mQuadTree.end(), Node{}); - mMaxTextureSizePot = (sizeof(maxTextureSize) * 8 - 1u) - utils::clz(maxTextureSize); + mMaxTextureSizePot = (sizeof(maxTextureSize) * 8 - 1u) - clz(maxTextureSize); } -AtlasAllocator::NodeId AtlasAllocator::allocateInLayer(size_t maxHeight) noexcept { +AtlasAllocator::NodeId AtlasAllocator::allocateInLayer(size_t const maxHeight) noexcept { using namespace QuadTreeUtils; NodeId candidate{ -1, 0 }; @@ -143,7 +143,7 @@ AtlasAllocator::NodeId AtlasAllocator::allocateInLayer(size_t maxHeight) noexcep while (ppp.l > 0) { const size_t pi = QuadTreeUtils::parent(ppp.l, ppp.code); ppp = NodeId{ int8_t(ppp.l - 1), uint8_t(ppp.code >> 2) }; - Node& node = mQuadTree[pi]; + Node const& node = mQuadTree[pi]; assert_invariant(!node.isAllocated()); assert_invariant(node.hasChildren()); } @@ -151,10 +151,21 @@ AtlasAllocator::NodeId AtlasAllocator::allocateInLayer(size_t maxHeight) noexcep } } else if (candidate.l < int8_t(QuadTree::height())) { // we need to create the hierarchy down to the level we need + + if (candidate.l > 0) { + // first thing to do is to update our parent's children count (the first node + // doesn't have a parent). + size_t const pi = parent(candidate.l, candidate.code); + Node& parentNode = mQuadTree[pi]; + assert_invariant(!parentNode.isAllocated()); + assert_invariant(!parentNode.hasAllChildren()); + parentNode.children++; + } + NodeId found{ -1, 0 }; QuadTree::traverse(candidate.l, candidate.code, [this, n, &found](NodeId const& curr) -> QuadTree::TraversalResult { - size_t i = index(curr.l, curr.code); + size_t const i = index(curr.l, curr.code); Node& node = mQuadTree[i]; if (curr.l == n) { found = curr; diff --git a/filament/src/AtlasAllocator.h b/filament/src/AtlasAllocator.h index 3cddd3fa24f..ac4c80b26ae 100644 --- a/filament/src/AtlasAllocator.h +++ b/filament/src/AtlasAllocator.h @@ -23,6 +23,9 @@ #include +#include +#include + class AtlasAllocator_AllocateFirstLevel_Test; class AtlasAllocator_AllocateSecondLevel_Test; class AtlasAllocator_AllocateMixed0_Test; @@ -45,11 +48,11 @@ class AtlasAllocator { * track which children though. */ struct Node { - // whether this node is allocated. Implies no children. + // Whether this node is allocated. Implies no children. constexpr bool isAllocated() const noexcept { return allocated; } - // whether this node has children. Implies it's not allocated. + // Whether this node has children. Implies it's not allocated. constexpr bool hasChildren() const noexcept { return children != 0; } - // whether this node has all four children. Implies hasChildren(). + // Whether this node has all four children. Implies hasChildren(). constexpr bool hasAllChildren() const noexcept { return children == 4; } bool allocated : 1; // true / false uint8_t children : 3; // 0, 1, 2, 3, 4 diff --git a/filament/src/Bimap.h b/filament/src/Bimap.h new file mode 100644 index 00000000000..1f730df9a2f --- /dev/null +++ b/filament/src/Bimap.h @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_BIMAP_H +#define TNT_FILAMENT_BIMAP_H + +#include + +#include + +#include +#include +#include + +#include + +namespace filament { + +/* + * A semi-generic custom bimap. This bimap stores a key/value pair and can retrieve + * the value from the key and the key from the value. + * It is optimized for large keys and small values. The keys are stored out-of-line and are + * never moved. + */ +template, + typename ValueHash = std::hash, + typename Allocator = std::allocator> +class Bimap { + + struct KeyDelegate { + Key const* pKey = nullptr; + bool operator==(KeyDelegate const& rhs) const noexcept { + return *pKey == *rhs.pKey; + } + }; + + // KeyWrapperHash delegates the hash computation to KeyHash + struct KeyHasherDelegate { + size_t operator()(KeyDelegate const& p) const noexcept { + KeyHash const h; + return h(*p.pKey); + } + }; + + using ForwardMap = tsl::robin_map< + KeyDelegate, Value, + KeyHasherDelegate, + std::equal_to, + std::allocator>, + true>; + using BackwardMap = tsl::robin_map; + + Allocator mAllocator; + ForwardMap mForwardMap; + BackwardMap mBackwardMap; + +public: + Bimap() = default; + explicit Bimap(Allocator&& allocator) + : mAllocator(std::forward(allocator)) { + } + + void reserve(size_t capacity) { + mForwardMap.reserve(capacity); + mBackwardMap.reserve(capacity); + } + + bool empty() const noexcept { + return mForwardMap.empty() && mBackwardMap.empty(); + } + + // insert a new key/value pair + void insert(Key const& key, Value const& value) noexcept { + Key* pKey = mAllocator.allocate(1); // allocate storage for the key + new((void*)pKey) Key{ key }; // copy-construct the key + mForwardMap.insert({{ pKey }, value }); + mBackwardMap.insert({ value, { pKey }}); + } + + typename ForwardMap::iterator end() { return mForwardMap.end(); } + + // Find the value iterator from the key in O(1) + typename ForwardMap::const_iterator find(Key const& key) const { + return mForwardMap.find(KeyDelegate{ .pKey = &key }); + } + typename ForwardMap::iterator find(Key const& key) { + return mForwardMap.find(KeyDelegate{ .pKey = &key }); + } + + // Find the key iterator from the value in O(1). precondition, the value must exist. + typename BackwardMap::const_iterator find(Value const& value) const { + auto pos = mBackwardMap.find(value); + assert_invariant( pos != mBackwardMap.end() ); + return pos; + } + typename BackwardMap::iterator find(Value& value) const { + return mBackwardMap.find(value); + } + + // erase a key/value pair using an iterator to the value + void erase(typename BackwardMap::const_iterator it) { + // find the key + Key const& key = *(it->second.pKey); + // and its iterator + auto pos = find(key); + // destroy the key + it->second.pKey->~Key(); + // free its memory + mAllocator.deallocate(const_cast(it->second.pKey), 1); + // remove the entries from both maps + mForwardMap.erase(pos); + mBackwardMap.erase(it); + } +}; + +} // namespace filament + + +#endif // TNT_FILAMENT_BIMAP_H diff --git a/filament/src/Box.cpp b/filament/src/Box.cpp deleted file mode 100644 index a19cf3d79fd..00000000000 --- a/filament/src/Box.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -using namespace filament::math; - -namespace filament { - -Box rigidTransform(Box const& UTILS_RESTRICT box, const mat4f& UTILS_RESTRICT m) noexcept { - const mat3f u(m.upperLeft()); - return { u * box.center + m[3].xyz, abs(u) * box.halfExtent }; -} - -Box rigidTransform(Box const& UTILS_RESTRICT box, const mat3f& UTILS_RESTRICT u) noexcept { - return { u * box.center, abs(u) * box.halfExtent }; -} - -Aabb::Corners Aabb::getCorners() const { - return Aabb::Corners{ .vertices = { - { min.x, min.y, min.z }, - { max.x, min.y, min.z }, - { min.x, max.y, min.z }, - { max.x, max.y, min.z }, - { min.x, min.y, max.z }, - { max.x, min.y, max.z }, - { min.x, max.y, max.z }, - { max.x, max.y, max.z }, - }}; -} - -float Aabb::contains(float3 p) const noexcept { - float d = min.x - p.x; - d = std::max(d, min.y - p.y); - d = std::max(d, min.z - p.z); - d = std::max(d, p.x - max.x); - d = std::max(d, p.y - max.y); - d = std::max(d, p.z - max.z); - return d; -} - -// Fast AABB transformation per Jim Arvo in Graphics Gems (1990). -Aabb Aabb::transform(const mat4f& mat) const noexcept { - const float3 translation = mat[3].xyz; - const mat3f upperLeft = mat.upperLeft(); - Aabb result = { translation, translation }; - for (size_t col = 0; col < upperLeft.getColumnCount(); ++col) { - for (size_t row = 0; row < upperLeft.getRowCount(); ++row) { - const float a = upperLeft[col][row] * min[col]; - const float b = upperLeft[col][row] * max[col]; - result.min[row] += a < b ? a : b; - result.max[row] += a < b ? b : a; - } - } - return result; -} - -} // namespace filament diff --git a/filament/src/BufferObject.cpp b/filament/src/BufferObject.cpp index 461f6c2968d..e37173f250f 100644 --- a/filament/src/BufferObject.cpp +++ b/filament/src/BufferObject.cpp @@ -23,7 +23,7 @@ namespace filament { void BufferObject::setBuffer(Engine& engine, - BufferObject::BufferDescriptor&& buffer, uint32_t byteOffset) { + BufferDescriptor&& buffer, uint32_t const byteOffset) { downcast(this)->setBuffer(downcast(engine), std::move(buffer), byteOffset); } diff --git a/filament/src/BufferPoolAllocator.h b/filament/src/BufferPoolAllocator.h index 11f584df87f..a7de04b2e8e 100644 --- a/filament/src/BufferPoolAllocator.h +++ b/filament/src/BufferPoolAllocator.h @@ -103,7 +103,7 @@ void BufferPoolAllocator:: } template -void* BufferPoolAllocator::get(size_type size) noexcept { +void* BufferPoolAllocator::get(size_type const size) noexcept { std::lock_guard guard(mLock); // if the requested size is larger that our buffers in the pool, we just empty the pool diff --git a/filament/src/Camera.cpp b/filament/src/Camera.cpp index fde5ae96b55..7ae393ebc79 100644 --- a/filament/src/Camera.cpp +++ b/filament/src/Camera.cpp @@ -22,85 +22,63 @@ namespace filament { using namespace math; -template -details::TMat44 inverseProjection(const details::TMat44& p) noexcept { - details::TMat44 r; - const T A = 1 / p[0][0]; - const T B = 1 / p[1][1]; - if (p[2][3] != T(0)) { - // perspective projection - // a 0 tx 0 - // 0 b ty 0 - // 0 0 tz c - // 0 0 -1 0 - const T C = 1 / p[3][2]; - r[0][0] = A; - r[1][1] = B; - r[2][2] = 0; - r[2][3] = C; - r[3][0] = p[2][0] * A; // not needed if symmetric - r[3][1] = p[2][1] * B; // not needed if symmetric - r[3][2] = -1; - r[3][3] = p[2][2] * C; - } else { - // orthographic projection - // a 0 0 tx - // 0 b 0 ty - // 0 0 c tz - // 0 0 0 1 - const T C = 1 / p[2][2]; - r[0][0] = A; - r[1][1] = B; - r[2][2] = C; - r[3][3] = 1; - r[3][0] = -p[3][0] * A; - r[3][1] = -p[3][1] * B; - r[3][2] = -p[3][2] * C; - } - return r; +void Camera::setProjection(double const fovInDegrees, double const aspect, double const near, double const far, + Fov const direction) { + setCustomProjection( + projection(direction, fovInDegrees, aspect, near), + projection(direction, fovInDegrees, aspect, near, far), + near, far); +} + +void Camera::setLensProjection(double const focalLengthInMillimeters, + double const aspect, double const near, double const far) { + setCustomProjection( + projection(focalLengthInMillimeters, aspect, near), + projection(focalLengthInMillimeters, aspect, near, far), + near, far); } mat4f Camera::inverseProjection(const mat4f& p) noexcept { - return filament::inverseProjection(p); + return inverse(p); } -mat4 Camera::inverseProjection(const mat4 & p) noexcept { - return filament::inverseProjection(p); + +mat4 Camera::inverseProjection(const mat4& p) noexcept { + return inverse(p); } -void Camera::setProjection(Camera::Projection projection, double left, double right, double bottom, - double top, double near, double far) { - downcast(this)->setProjection(projection, left, right, bottom, top, near, far); +void Camera::setEyeModelMatrix(uint8_t const eyeId, mat4 const& model) { + downcast(this)->setEyeModelMatrix(eyeId, model); } -void Camera::setProjection(double fovInDegrees, double aspect, double near, double far, - Camera::Fov direction) { - downcast(this)->setProjection(fovInDegrees, aspect, near, far, direction); +void Camera::setCustomEyeProjection(mat4 const* projection, size_t const count, + mat4 const& projectionForCulling, double const near, double const far) { + downcast(this)->setCustomEyeProjection(projection, count, projectionForCulling, near, far); } -void Camera::setLensProjection(double focalLengthInMillimeters, - double aspect, double near, double far) { - downcast(this)->setLensProjection(focalLengthInMillimeters, aspect, near, far); +void Camera::setProjection(Projection const projection, double const left, double const right, double const bottom, + double const top, double const near, double const far) { + downcast(this)->setProjection(projection, left, right, bottom, top, near, far); } -void Camera::setCustomProjection(mat4 const& projection, double near, double far) noexcept { +void Camera::setCustomProjection(mat4 const& projection, double const near, double const far) noexcept { downcast(this)->setCustomProjection(projection, near, far); } void Camera::setCustomProjection(mat4 const& projection, mat4 const& projectionForCulling, - double near, double far) noexcept { + double const near, double const far) noexcept { downcast(this)->setCustomProjection(projection, projectionForCulling, near, far); } -void Camera::setScaling(double2 scaling) noexcept { +void Camera::setScaling(double2 const scaling) noexcept { downcast(this)->setScaling(scaling); } -void Camera::setShift(double2 shift) noexcept { +void Camera::setShift(double2 const shift) noexcept { downcast(this)->setShift(shift); } -mat4 Camera::getProjectionMatrix() const noexcept { - return downcast(this)->getUserProjectionMatrix(); +mat4 Camera::getProjectionMatrix(uint8_t const eyeId) const { + return downcast(this)->getUserProjectionMatrix(eyeId); } mat4 Camera::getCullingProjectionMatrix() const noexcept { @@ -159,7 +137,7 @@ float3 Camera::getForwardVector() const noexcept { return downcast(this)->getForwardVector(); } -float Camera::getFieldOfViewInDegrees(Camera::Fov direction) const noexcept { +float Camera::getFieldOfViewInDegrees(Fov const direction) const noexcept { return downcast(this)->getFieldOfViewInDegrees(direction); } @@ -171,7 +149,7 @@ utils::Entity Camera::getEntity() const noexcept { return downcast(this)->getEntity(); } -void Camera::setExposure(float aperture, float shutterSpeed, float ISO) noexcept { +void Camera::setExposure(float const aperture, float const shutterSpeed, float const ISO) noexcept { downcast(this)->setExposure(aperture, shutterSpeed, ISO); } @@ -187,7 +165,7 @@ float Camera::getSensitivity() const noexcept { return downcast(this)->getSensitivity(); } -void Camera::setFocusDistance(float distance) noexcept { +void Camera::setFocusDistance(float const distance) noexcept { downcast(this)->setFocusDistance(distance); } @@ -199,12 +177,22 @@ double Camera::getFocalLength() const noexcept { return downcast(this)->getFocalLength(); } -double Camera::computeEffectiveFocalLength(double focalLength, double focusDistance) noexcept { +double Camera::computeEffectiveFocalLength(double const focalLength, double const focusDistance) noexcept { return FCamera::computeEffectiveFocalLength(focalLength, focusDistance); } -double Camera::computeEffectiveFov(double fovInDegrees, double focusDistance) noexcept { +double Camera::computeEffectiveFov(double const fovInDegrees, double const focusDistance) noexcept { return FCamera::computeEffectiveFov(fovInDegrees, focusDistance); } +mat4 Camera::projection(Fov const direction, double const fovInDegrees, + double const aspect, double const near, double const far) { + return FCamera::projection(direction, fovInDegrees, aspect, near, far); +} + +mat4 Camera::projection(double const focalLengthInMillimeters, + double const aspect, double const near, double const far) { + return FCamera::projection(focalLengthInMillimeters, aspect, near, far); +} + } // namespace filament diff --git a/filament/src/Color.cpp b/filament/src/Color.cpp index b8d9f9886a3..79adbd63d65 100644 --- a/filament/src/Color.cpp +++ b/filament/src/Color.cpp @@ -25,43 +25,43 @@ namespace filament { using namespace math; -float3 Color::sRGBToLinear(float3 color) noexcept { +float3 Color::sRGBToLinear(float3 const color) noexcept { return EOTF_sRGB(color); } -float3 Color::linearToSRGB(float3 color) noexcept { +float3 Color::linearToSRGB(float3 const color) noexcept { return OETF_sRGB(color); } -LinearColor Color::cct(float K) { +LinearColor Color::cct(float const K) { // temperature to CIE 1960 - float K2 = K * K; - float u = (0.860117757f + 1.54118254e-4f * K + 1.28641212e-7f * K2) / + float const K2 = K * K; + float const u = (0.860117757f + 1.54118254e-4f * K + 1.28641212e-7f * K2) / (1.0f + 8.42420235e-4f * K + 7.08145163e-7f * K2); - float v = (0.317398726f + 4.22806245e-5f * K + 4.20481691e-8f * K2) / + float const v = (0.317398726f + 4.22806245e-5f * K + 4.20481691e-8f * K2) / (1.0f - 2.89741816e-5f * K + 1.61456053e-7f * K2); - float d = 1.0f / (2.0f * u - 8.0f * v + 4.0f); - float3 linear = XYZ_to_sRGB * xyY_to_XYZ({3.0f * u * d, 2.0f * v * d, 1.0f}); + float const d = 1.0f / (2.0f * u - 8.0f * v + 4.0f); + float3 const linear = XYZ_to_sRGB * xyY_to_XYZ({3.0f * u * d, 2.0f * v * d, 1.0f}); // normalize and saturate return saturate(linear / max(1e-5f, max(linear))); } -LinearColor Color::illuminantD(float K) { +LinearColor Color::illuminantD(float const K) { // temperature to xyY const float iK = 1.0f / K; - float iK2 = iK * iK; - float x = K <= 7000.0f ? + float const iK2 = iK * iK; + float const x = K <= 7000.0f ? 0.244063f + 0.09911e3f * iK + 2.9678e6f * iK2 - 4.6070e9f * iK2 * iK : 0.237040f + 0.24748e3f * iK + 1.9018e6f * iK2 - 2.0064e9f * iK2 * iK; - float y = -3.0f * x * x + 2.87f * x - 0.275f; + float const y = -3.0f * x * x + 2.87f * x - 0.275f; - float3 linear = XYZ_to_sRGB * xyY_to_XYZ({x, y, 1.0f}); + float3 const linear = XYZ_to_sRGB * xyY_to_XYZ({x, y, 1.0f}); // normalize and saturate return saturate(linear / max(1e-5f, max(linear))); } -LinearColor Color::absorptionAtDistance(LinearColor const& color, float distance) { +LinearColor Color::absorptionAtDistance(LinearColor const& color, float const distance) { return -log(clamp(color, 1e-5f, 1.0f)) / max(1e-5f, distance); } diff --git a/filament/src/ColorSpaceUtils.cpp b/filament/src/ColorSpaceUtils.cpp index b4896ff3262..415c8c2ac02 100644 --- a/filament/src/ColorSpaceUtils.cpp +++ b/filament/src/ColorSpaceUtils.cpp @@ -52,7 +52,7 @@ using namespace math; // Finds the maximum saturation possible for a given hue that fits in sRGB // Saturation here is defined as S = C/L // a and b must be normalized so a^2 + b^2 == 1 -static float compute_max_saturation(float a, float b) noexcept { +static float compute_max_saturation(float const a, float const b) noexcept { // Max saturation will be when one of r, g or b goes below zero. // Select different coefficients depending on which component goes below zero first @@ -98,30 +98,30 @@ static float compute_max_saturation(float a, float b) noexcept { // is close to infinite // this should be sufficient for most applications, otherwise do two/three steps - float k_l = +0.3963377774f * a + 0.2158037573f * b; - float k_m = -0.1055613458f * a - 0.0638541728f * b; - float k_s = -0.0894841775f * a - 1.2914855480f * b; + float const k_l = +0.3963377774f * a + 0.2158037573f * b; + float const k_m = -0.1055613458f * a - 0.0638541728f * b; + float const k_s = -0.0894841775f * a - 1.2914855480f * b; { - float l_ = 1.f + S * k_l; - float m_ = 1.f + S * k_m; - float s_ = 1.f + S * k_s; + float const l_ = 1.f + S * k_l; + float const m_ = 1.f + S * k_m; + float const s_ = 1.f + S * k_s; - float l = l_ * l_ * l_; - float m = m_ * m_ * m_; - float s = s_ * s_ * s_; + float const l = l_ * l_ * l_; + float const m = m_ * m_ * m_; + float const s = s_ * s_ * s_; - float l_dS = 3.f * k_l * l_ * l_; - float m_dS = 3.f * k_m * m_ * m_; - float s_dS = 3.f * k_s * s_ * s_; + float const l_dS = 3.f * k_l * l_ * l_; + float const m_dS = 3.f * k_m * m_ * m_; + float const s_dS = 3.f * k_s * s_ * s_; - float l_dS2 = 6.f * k_l * k_l * l_; - float m_dS2 = 6.f * k_m * k_m * m_; - float s_dS2 = 6.f * k_s * k_s * s_; + float const l_dS2 = 6.f * k_l * k_l * l_; + float const m_dS2 = 6.f * k_m * k_m * m_; + float const s_dS2 = 6.f * k_s * k_s * s_; - float f = wl * l + wm * m + ws * s; - float f1 = wl * l_dS + wm * m_dS + ws * s_dS; - float f2 = wl * l_dS2 + wm * m_dS2 + ws * s_dS2; + float const f = wl * l + wm * m + ws * s; + float const f1 = wl * l_dS + wm * m_dS + ws * s_dS; + float const f2 = wl * l_dS2 + wm * m_dS2 + ws * s_dS2; S = S - f * f1 / (f1 * f1 - 0.5f * f * f2); } @@ -131,25 +131,25 @@ static float compute_max_saturation(float a, float b) noexcept { // finds L_cusp and C_cusp for a given hue // a and b must be normalized so a^2 + b^2 == 1 -static float2 find_cusp(float a, float b) noexcept { +static float2 find_cusp(float const a, float const b) noexcept { // First, find the maximum saturation (saturation S = C/L) - float S_cusp = compute_max_saturation(a, b); + float const S_cusp = compute_max_saturation(a, b); // Convert to linear sRGB to find the first point where at least one of r,g or b >= 1: - float3 rgb_at_max = OkLab_to_sRGB({1.0f, S_cusp * a, S_cusp * b}); - float L_cusp = std::cbrt(1.0f / max(rgb_at_max)); - float C_cusp = L_cusp * S_cusp; + float3 const rgb_at_max = OkLab_to_sRGB({1.0f, S_cusp * a, S_cusp * b}); + float const L_cusp = std::cbrt(1.0f / max(rgb_at_max)); + float const C_cusp = L_cusp * S_cusp; - return {L_cusp, C_cusp}; + return { L_cusp, C_cusp }; } // Finds intersection of the line defined by // L = L0 * (1 - t) + t * L1; // C = t * C1; // a and b must be normalized so a^2 + b^2 == 1 -static float find_gamut_intersection(float a, float b, float L1, float C1, float L0) noexcept { +static float find_gamut_intersection(float const a, float const b, float const L1, float const C1, float const L0) noexcept { // Find the cusp of the gamut triangle - float2 cusp = find_cusp(a, b); + float2 const cusp = find_cusp(a, b); // Find the intersection for upper and lower half separately float t; @@ -164,59 +164,59 @@ static float find_gamut_intersection(float a, float b, float L1, float C1, float // Then one step Halley's method { - float dL = L1 - L0; - float dC = C1; + float const dL = L1 - L0; + float const dC = C1; - float k_l = +0.3963377774f * a + 0.2158037573f * b; - float k_m = -0.1055613458f * a - 0.0638541728f * b; - float k_s = -0.0894841775f * a - 1.2914855480f * b; + float const k_l = +0.3963377774f * a + 0.2158037573f * b; + float const k_m = -0.1055613458f * a - 0.0638541728f * b; + float const k_s = -0.0894841775f * a - 1.2914855480f * b; - float l_dt = dL + dC * k_l; - float m_dt = dL + dC * k_m; - float s_dt = dL + dC * k_s; + float const l_dt = dL + dC * k_l; + float const m_dt = dL + dC * k_m; + float const s_dt = dL + dC * k_s; // If higher accuracy is required, 2 or 3 iterations of the // following block can be used: { - float L = L0 * (1.f - t) + t * L1; - float C = t * C1; + float const L = L0 * (1.f - t) + t * L1; + float const C = t * C1; - float l_ = L + C * k_l; - float m_ = L + C * k_m; - float s_ = L + C * k_s; + float const l_ = L + C * k_l; + float const m_ = L + C * k_m; + float const s_ = L + C * k_s; - float l = l_ * l_ * l_; - float m = m_ * m_ * m_; - float s = s_ * s_ * s_; + float const l = l_ * l_ * l_; + float const m = m_ * m_ * m_; + float const s = s_ * s_ * s_; - float ldt = 3 * l_dt * l_ * l_; - float mdt = 3 * m_dt * m_ * m_; - float sdt = 3 * s_dt * s_ * s_; + float const ldt = 3 * l_dt * l_ * l_; + float const mdt = 3 * m_dt * m_ * m_; + float const sdt = 3 * s_dt * s_ * s_; - float ldt2 = 6 * l_dt * l_dt * l_; - float mdt2 = 6 * m_dt * m_dt * m_; - float sdt2 = 6 * s_dt * s_dt * s_; + float const ldt2 = 6 * l_dt * l_dt * l_; + float const mdt2 = 6 * m_dt * m_dt * m_; + float const sdt2 = 6 * s_dt * s_dt * s_; - float r = 4.0767416621f * l - 3.3077115913f * m + 0.2309699292f * s - 1; - float r1 = 4.0767416621f * ldt - 3.3077115913f * mdt + 0.2309699292f * sdt; - float r2 = 4.0767416621f * ldt2 - 3.3077115913f * mdt2 + 0.2309699292f * sdt2; + float const r = 4.0767416621f * l - 3.3077115913f * m + 0.2309699292f * s - 1; + float const r1 = 4.0767416621f * ldt - 3.3077115913f * mdt + 0.2309699292f * sdt; + float const r2 = 4.0767416621f * ldt2 - 3.3077115913f * mdt2 + 0.2309699292f * sdt2; - float u_r = r1 / (r1 * r1 - 0.5f * r * r2); + float const u_r = r1 / (r1 * r1 - 0.5f * r * r2); float t_r = -r * u_r; - float g = -1.2681437731f * l + 2.6097574011f * m - 0.3413193965f * s - 1; - float g1 = -1.2681437731f * ldt + 2.6097574011f * mdt - 0.3413193965f * sdt; - float g2 = -1.2681437731f * ldt2 + 2.6097574011f * mdt2 - 0.3413193965f * sdt2; + float const g = -1.2681437731f * l + 2.6097574011f * m - 0.3413193965f * s - 1; + float const g1 = -1.2681437731f * ldt + 2.6097574011f * mdt - 0.3413193965f * sdt; + float const g2 = -1.2681437731f * ldt2 + 2.6097574011f * mdt2 - 0.3413193965f * sdt2; - float u_g = g1 / (g1 * g1 - 0.5f * g * g2); + float const u_g = g1 / (g1 * g1 - 0.5f * g * g2); float t_g = -g * u_g; - float b0 = -0.0041960863f * l - 0.7034186147f * m + 1.7076147010f * s - 1; - float b1 = -0.0041960863f * ldt - 0.7034186147f * mdt + 1.7076147010f * sdt; - float b2 = -0.0041960863f * ldt2 - 0.7034186147f * mdt2 + 1.7076147010f * sdt2; + float const b0 = -0.0041960863f * l - 0.7034186147f * m + 1.7076147010f * s - 1; + float const b1 = -0.0041960863f * ldt - 0.7034186147f * mdt + 1.7076147010f * sdt; + float const b2 = -0.0041960863f * ldt2 - 0.7034186147f * mdt2 + 1.7076147010f * sdt2; - float u_b = b1 / (b1 * b1 - 0.5f * b0 * b2); + float const u_b = b1 / (b1 * b1 - 0.5f * b0 * b2); float t_b = -b0 * u_b; t_r = u_r >= 0.f ? t_r : std::numeric_limits::max(); @@ -231,7 +231,7 @@ static float find_gamut_intersection(float a, float b, float L1, float C1, float return t; } -constexpr float sgn(float x) noexcept { +constexpr float sgn(float const x) noexcept { return (float) (0.f < x) - (float) (x < 0.f); } @@ -247,26 +247,26 @@ inline float3 gamut_clip_adaptive_L0_0_5(float3 rgb, return rgb; } - float3 lab = sRGB_to_OkLab(rgb); + float3 const lab = sRGB_to_OkLab(rgb); - float L = lab.x; - float eps = 0.00001f; - float C = max(eps, std::sqrt(lab.y * lab.y + lab.z * lab.z)); - float a_ = lab.y / C; - float b_ = lab.z / C; + float const L = lab.x; + float const eps = 0.00001f; + float const C = max(eps, std::sqrt(lab.y * lab.y + lab.z * lab.z)); + float const a_ = lab.y / C; + float const b_ = lab.z / C; - float Ld = L - 0.5f; - float e1 = 0.5f + std::abs(Ld) + alpha * C; - float L0 = 0.5f * (1.0f + sgn(Ld) * (e1 - std::sqrt(e1 * e1 - 2.0f * std::abs(Ld)))); + float const Ld = L - 0.5f; + float const e1 = 0.5f + std::abs(Ld) + alpha * C; + float const L0 = 0.5f * (1.0f + sgn(Ld) * (e1 - std::sqrt(e1 * e1 - 2.0f * std::abs(Ld)))); - float t = find_gamut_intersection(a_, b_, L, C, L0); - float L_clipped = L0 * (1.f - t) + t * L; - float C_clipped = t * C; + float const t = find_gamut_intersection(a_, b_, L, C, L0); + float const L_clipped = L0 * (1.f - t) + t * L; + float const C_clipped = t * C; return OkLab_to_sRGB({L_clipped, C_clipped * a_, C_clipped * b_}); } -float3 gamutMapping_sRGB(float3 rgb) noexcept { +float3 gamutMapping_sRGB(float3 const rgb) noexcept { return gamut_clip_adaptive_L0_0_5(rgb); } diff --git a/filament/src/ColorSpaceUtils.h b/filament/src/ColorSpaceUtils.h index 490e79ea9ea..3c10888921d 100644 --- a/filament/src/ColorSpaceUtils.h +++ b/filament/src/ColorSpaceUtils.h @@ -213,7 +213,7 @@ constexpr float MIDDLE_GRAY_ACEScct = 0.4135884f; // Returns the y chromaticity coordinate in xyY for an illuminant series D, // given its x chromaticity coordinate. -inline constexpr float chromaticityCoordinateIlluminantD(float x) noexcept { +inline constexpr float chromaticityCoordinateIlluminantD(float const x) noexcept { // See http://en.wikipedia.org/wiki/Standard_illuminant#Illuminant_series_D return 2.87f * x - 3.0f * x * x - 0.275f; } @@ -222,7 +222,7 @@ inline constexpr float chromaticityCoordinateIlluminantD(float x) noexcept { // Color space conversions //------------------------------------------------------------------------------ -inline constexpr XYZ xyY_to_XYZ(xyY v) noexcept { +inline constexpr XYZ xyY_to_XYZ(xyY const v) noexcept { const float a = v.z / max(v.y, 1e-5f); return XYZ{v.x * a, v.z, (1.0f - v.x - v.y) * a}; } @@ -231,23 +231,23 @@ inline constexpr xyY XYZ_to_xyY(XYZ v) noexcept { return {v.xy / max(v.x + v.y + v.z, 1e-5f), v.y}; } -inline constexpr float3 pow3(float3 x) noexcept { +inline constexpr float3 pow3(float3 const x) noexcept { return x * x * x; } -inline float3 sRGB_to_OkLab(float3 x) noexcept { +inline float3 sRGB_to_OkLab(float3 const x) noexcept { return OkLab_LMS_to_OkLab * cbrt(sRGB_to_OkLab_LMS * x); } -inline float3 Rec2020_to_OkLab(float3 x) noexcept { +inline float3 Rec2020_to_OkLab(float3 const x) noexcept { return OkLab_LMS_to_OkLab * cbrt(Rec2020_to_OkLab_LMS * x); } -inline float3 OkLab_to_sRGB(float3 x) noexcept { +inline float3 OkLab_to_sRGB(float3 const x) noexcept { return OkLab_LMS_to_sRGB * pow3(OkLab_to_OkLab_LMS * x); } -inline float3 OkLab_to_Rec2020(float3 x) noexcept { +inline float3 OkLab_to_Rec2020(float3 const x) noexcept { return OkLab_LMS_to_Rec2020 * pow3(OkLab_to_OkLab_LMS * x); } @@ -256,7 +256,7 @@ inline float3 OkLab_to_Rec2020(float3 x) noexcept { //------------------------------------------------------------------------------ // Decodes a linear value from LogC using the Alexa LogC EI 1000 curve -inline float3 LogC_to_linear(float3 x) noexcept { +inline float3 LogC_to_linear(float3 const x) noexcept { const float ia = 1.0f / 5.555556f; const float b = 0.047996f; const float ic = 1.0f / 0.244161f; @@ -265,7 +265,7 @@ inline float3 LogC_to_linear(float3 x) noexcept { } // Encodes a linear value in LogC using the Alexa LogC EI 1000 curve -inline float3 linear_to_LogC(float3 x) noexcept { +inline float3 linear_to_LogC(float3 const x) noexcept { const float a = 5.555556f; const float b = 0.047996f; const float c = 0.244161f; @@ -296,7 +296,7 @@ inline float3 linearAP1_to_ACEScct(float3 x) noexcept { return x; } -inline float3 OETF_Linear(float3 x) noexcept { +inline float3 OETF_Linear(float3 const x) noexcept { return x; } diff --git a/filament/src/Culler.cpp b/filament/src/Culler.cpp index bae62063dc6..85e8bf03ac4 100644 --- a/filament/src/Culler.cpp +++ b/filament/src/Culler.cpp @@ -64,7 +64,7 @@ void Culler::intersects( Frustum const& UTILS_RESTRICT frustum, float3 const* UTILS_RESTRICT center, float3 const* UTILS_RESTRICT extent, - size_t count, size_t bit) noexcept { + size_t count, size_t const bit) noexcept { float4 const * UTILS_RESTRICT const planes = frustum.mPlanes; @@ -101,10 +101,10 @@ bool Culler::intersects(Frustum const& frustum, Box const& box) noexcept { // The main intersection routine assumes multiples of 8 items float3 centers[MODULO]; float3 extents[MODULO]; - Culler::result_type results[MODULO]; + result_type results[MODULO]; centers[0] = box.center; extents[0] = box.halfExtent; - Culler::intersects(results, frustum, centers, extents, MODULO, 0); + intersects(results, frustum, centers, extents, MODULO, 0); return bool(results[0] & 1); } @@ -114,9 +114,9 @@ bool Culler::intersects(Frustum const& frustum, Box const& box) noexcept { bool Culler::intersects(Frustum const& frustum, float4 const& sphere) noexcept { // The main intersection routine assumes multiples of 8 items float4 spheres[MODULO]; - Culler::result_type results[MODULO]; + result_type results[MODULO]; spheres[0] = sphere; - Culler::intersects(results, frustum, spheres, MODULO); + intersects(results, frustum, spheres, MODULO); return bool(results[0] & 1); } @@ -127,14 +127,14 @@ void Culler::Test::intersects( Frustum const& UTILS_RESTRICT frustum, float3 const* UTILS_RESTRICT c, float3 const* UTILS_RESTRICT e, - size_t count) noexcept { + size_t const count) noexcept { Culler::intersects(results, frustum, c, e, count, 0); } void Culler::Test::intersects( result_type* UTILS_RESTRICT results, Frustum const& UTILS_RESTRICT frustum, - float4 const* UTILS_RESTRICT b, size_t count) noexcept { + float4 const* UTILS_RESTRICT b, size_t const count) noexcept { Culler::intersects(results, frustum, b, count); } diff --git a/filament/src/Culler.h b/filament/src/Culler.h index ad5fd4f3c87..643d69086ab 100644 --- a/filament/src/Culler.h +++ b/filament/src/Culler.h @@ -37,12 +37,12 @@ namespace filament { class Culler { public: // Culler can only process buffers with a size multiple of MODULO - static constexpr size_t MODULO = 4u; - static inline size_t round(size_t count) noexcept { + static constexpr size_t MODULO = 8u; + static inline size_t round(size_t const count) noexcept { return (count + (MODULO - 1)) & ~(MODULO - 1); } - using result_type = uint16_t; + using result_type = uint8_t; /* * returns whether each AABB in an array intersects with the frustum diff --git a/filament/src/DebugRegistry.cpp b/filament/src/DebugRegistry.cpp index 5a90de2adcb..27182dcc518 100644 --- a/filament/src/DebugRegistry.cpp +++ b/filament/src/DebugRegistry.cpp @@ -28,27 +28,27 @@ bool DebugRegistry::hasProperty(const char* name) const noexcept { return downcast(this)->hasProperty(name); } -bool DebugRegistry::setProperty(const char* name, bool v) noexcept { +bool DebugRegistry::setProperty(const char* name, bool const v) noexcept { return downcast(this)->setProperty(name, v); } -bool DebugRegistry::setProperty(const char* name, int v) noexcept { +bool DebugRegistry::setProperty(const char* name, int const v) noexcept { return downcast(this)->setProperty(name, v); } -bool DebugRegistry::setProperty(const char* name, float v) noexcept { +bool DebugRegistry::setProperty(const char* name, float const v) noexcept { return downcast(this)->setProperty(name, v); } -bool DebugRegistry::setProperty(const char* name, float2 v) noexcept { +bool DebugRegistry::setProperty(const char* name, float2 const v) noexcept { return downcast(this)->setProperty(name, v); } -bool DebugRegistry::setProperty(const char* name, float3 v) noexcept { +bool DebugRegistry::setProperty(const char* name, float3 const v) noexcept { return downcast(this)->setProperty(name, v); } -bool DebugRegistry::setProperty(const char* name, float4 v) noexcept { +bool DebugRegistry::setProperty(const char* name, float4 const v) noexcept { return downcast(this)->setProperty(name, v); } @@ -77,7 +77,11 @@ bool DebugRegistry::getProperty(const char* name, float4* v) const noexcept { return downcast(this)->getProperty(name, v); } -void *DebugRegistry::getPropertyAddress(const char *name) noexcept { +void *DebugRegistry::getPropertyAddress(const char *name) { + return downcast(this)->getPropertyAddress(name); +} + +void const *DebugRegistry::getPropertyAddress(const char *name) const noexcept { return downcast(this)->getPropertyAddress(name); } diff --git a/filament/src/Engine.cpp b/filament/src/Engine.cpp index d12d668674d..5f1af80aaf5 100644 --- a/filament/src/Engine.cpp +++ b/filament/src/Engine.cpp @@ -16,6 +16,8 @@ #include "details/Engine.h" +#include "ResourceAllocator.h" + #include "details/BufferObject.h" #include "details/Camera.h" #include "details/Fence.h" @@ -31,35 +33,36 @@ #include "details/Texture.h" #include "details/VertexBuffer.h" #include "details/View.h" -#include "filament/Engine.h" +#include #include #include #include +#include + +#include + +#include +#include using namespace utils; namespace filament { +namespace backend { +class Platform; +} + using namespace math; using namespace backend; -Engine* Engine::create(Backend backend, Platform* platform, void* sharedGLContext, const Config* config) { - return FEngine::create(backend, platform, sharedGLContext, config); -} - void Engine::destroy(Engine* engine) { FEngine::destroy(downcast(engine)); } #if UTILS_HAS_THREADING -void Engine::createAsync(Engine::CreateCallback callback, void* user, Backend backend, - Platform* platform, void* sharedGLContext, const Config* config) { - FEngine::createAsync(callback, user, backend, platform, sharedGLContext, config); -} - Engine* Engine::getEngine(void* token) { return FEngine::getEngine(token); } @@ -101,27 +104,27 @@ Scene* Engine::createScene() noexcept { return downcast(this)->createScene(); } -Camera* Engine::createCamera(Entity entity) noexcept { +Camera* Engine::createCamera(Entity const entity) noexcept { return downcast(this)->createCamera(entity); } -Camera* Engine::getCameraComponent(utils::Entity entity) noexcept { +Camera* Engine::getCameraComponent(Entity const entity) noexcept { return downcast(this)->getCameraComponent(entity); } -void Engine::destroyCameraComponent(utils::Entity entity) noexcept { +void Engine::destroyCameraComponent(Entity const entity) noexcept { downcast(this)->destroyCameraComponent(entity); } Fence* Engine::createFence() noexcept { - return downcast(this)->createFence(FFence::Type::SOFT); + return downcast(this)->createFence(); } -SwapChain* Engine::createSwapChain(void* nativeWindow, uint64_t flags) noexcept { +SwapChain* Engine::createSwapChain(void* nativeWindow, uint64_t const flags) noexcept { return downcast(this)->createSwapChain(nativeWindow, flags); } -SwapChain* Engine::createSwapChain(uint32_t width, uint32_t height, uint64_t flags) noexcept { +SwapChain* Engine::createSwapChain(uint32_t const width, uint32_t const height, uint64_t const flags) noexcept { return downcast(this)->createSwapChain(width, height, flags); } @@ -197,10 +200,140 @@ bool Engine::destroy(const SwapChain* p) { return downcast(this)->destroy(downcast(p)); } -void Engine::destroy(Entity e) { +bool Engine::destroy(const InstanceBuffer* p) { + return downcast(this)->destroy(downcast(p)); +} + +void Engine::destroy(Entity const e) { downcast(this)->destroy(e); } +bool Engine::isValid(const BufferObject* p) const { + return downcast(this)->isValid(downcast(p)); +} +bool Engine::isValid(const VertexBuffer* p) const { + return downcast(this)->isValid(downcast(p)); +} +bool Engine::isValid(const Fence* p) const { + return downcast(this)->isValid(downcast(p)); +} +bool Engine::isValid(const IndexBuffer* p) const { + return downcast(this)->isValid(downcast(p)); +} +bool Engine::isValid(const SkinningBuffer* p) const { + return downcast(this)->isValid(downcast(p)); +} +bool Engine::isValid(const MorphTargetBuffer* p) const { + return downcast(this)->isValid(downcast(p)); +} +bool Engine::isValid(const IndirectLight* p) const { + return downcast(this)->isValid(downcast(p)); +} +bool Engine::isValid(const Material* p) const { + return downcast(this)->isValid(downcast(p)); +} +bool Engine::isValid(const Material* m, const MaterialInstance* p) const { + return downcast(this)->isValid(downcast(m), downcast(p)); +} +bool Engine::isValidExpensive(const MaterialInstance* p) const { + return downcast(this)->isValidExpensive(downcast(p)); +} +bool Engine::isValid(const Renderer* p) const { + return downcast(this)->isValid(downcast(p)); +} +bool Engine::isValid(const Scene* p) const { + return downcast(this)->isValid(downcast(p)); +} +bool Engine::isValid(const Skybox* p) const { + return downcast(this)->isValid(downcast(p)); +} +bool Engine::isValid(const ColorGrading* p) const { + return downcast(this)->isValid(downcast(p)); +} +bool Engine::isValid(const SwapChain* p) const { + return downcast(this)->isValid(downcast(p)); +} +bool Engine::isValid(const Stream* p) const { + return downcast(this)->isValid(downcast(p)); +} +bool Engine::isValid(const Texture* p) const { + return downcast(this)->isValid(downcast(p)); +} +bool Engine::isValid(const RenderTarget* p) const { + return downcast(this)->isValid(downcast(p)); +} +bool Engine::isValid(const View* p) const { + return downcast(this)->isValid(downcast(p)); +} +bool Engine::isValid(const InstanceBuffer* p) const { + return downcast(this)->isValid(downcast(p)); +} + +size_t Engine::getBufferObjectCount() const noexcept { + return downcast(this)->getBufferObjectCount(); +} + +size_t Engine::getViewCount() const noexcept { + return downcast(this)->getViewCount(); +} + +size_t Engine::getSceneCount() const noexcept { + return downcast(this)->getSceneCount(); +} + +size_t Engine::getSwapChainCount() const noexcept { + return downcast(this)->getSwapChainCount(); +} + +size_t Engine::getStreamCount() const noexcept { + return downcast(this)->getStreamCount(); +} + +size_t Engine::getIndexBufferCount() const noexcept { + return downcast(this)->getIndexBufferCount(); +} + +size_t Engine::getSkinningBufferCount() const noexcept { + return downcast(this)->getSkinningBufferCount(); +} + +size_t Engine::getMorphTargetBufferCount() const noexcept { + return downcast(this)->getMorphTargetBufferCount(); +} + +size_t Engine::getInstanceBufferCount() const noexcept { + return downcast(this)->getInstanceBufferCount(); +} + +size_t Engine::getVertexBufferCount() const noexcept { + return downcast(this)->getVertexBufferCount(); +} + +size_t Engine::getIndirectLightCount() const noexcept { + return downcast(this)->getIndirectLightCount(); +} + +size_t Engine::getMaterialCount() const noexcept { + return downcast(this)->getMaterialCount(); +} + +size_t Engine::getTextureCount() const noexcept { + return downcast(this)->getTextureCount(); +} + +size_t Engine::getSkyboxeCount() const noexcept { + return downcast(this)->getSkyboxeCount(); +} + +size_t Engine::getColorGradingCount() const noexcept { + return downcast(this)->getColorGradingCount(); +} + +size_t Engine::getRenderTargetCount() const noexcept { + return downcast(this)->getRenderTargetCount(); +} + + void Engine::flushAndWait() { downcast(this)->flushAndWait(); } @@ -209,7 +342,7 @@ void Engine::flush() { downcast(this)->flush(); } -utils::EntityManager& Engine::getEntityManager() noexcept { +EntityManager& Engine::getEntityManager() noexcept { return downcast(this)->getEntityManager(); } @@ -229,22 +362,35 @@ void Engine::enableAccurateTranslations() noexcept { getTransformManager().setAccurateTranslationsEnabled(true); } -void* Engine::streamAlloc(size_t size, size_t alignment) noexcept { +void* Engine::streamAlloc(size_t const size, size_t const alignment) noexcept { return downcast(this)->streamAlloc(size, alignment); } // The external-facing execute does a flush, and is meant only for single-threaded environments. // It also discards the boolean return value, which would otherwise indicate a thread exit. void Engine::execute() { - ASSERT_PRECONDITION(!UTILS_HAS_THREADING, "Execute is meant for single-threaded platforms."); + FILAMENT_CHECK_PRECONDITION(!UTILS_HAS_THREADING) + << "Execute is meant for single-threaded platforms."; downcast(this)->flush(); downcast(this)->execute(); } -utils::JobSystem& Engine::getJobSystem() noexcept { +JobSystem& Engine::getJobSystem() noexcept { return downcast(this)->getJobSystem(); } +bool Engine::isPaused() const noexcept { + FILAMENT_CHECK_PRECONDITION(UTILS_HAS_THREADING) + << "Pause is meant for multi-threaded platforms."; + return downcast(this)->isPaused(); +} + +void Engine::setPaused(bool const paused) { + FILAMENT_CHECK_PRECONDITION(UTILS_HAS_THREADING) + << "Pause is meant for multi-threaded platforms."; + downcast(this)->setPaused(paused); +} + DebugRegistry& Engine::getDebugRegistry() noexcept { return downcast(this)->getDebugRegistry(); } @@ -253,7 +399,11 @@ void Engine::pumpMessageQueues() { downcast(this)->pumpMessageQueues(); } -void Engine::setAutomaticInstancingEnabled(bool enable) noexcept { +void Engine::unprotected() noexcept { + downcast(this)->unprotected(); +} + +void Engine::setAutomaticInstancingEnabled(bool const enable) noexcept { downcast(this)->setAutomaticInstancingEnabled(enable); } @@ -265,7 +415,7 @@ FeatureLevel Engine::getSupportedFeatureLevel() const noexcept { return downcast(this)->getSupportedFeatureLevel(); } -FeatureLevel Engine::setActiveFeatureLevel(FeatureLevel featureLevel) { +FeatureLevel Engine::setActiveFeatureLevel(FeatureLevel const featureLevel) { return downcast(this)->setActiveFeatureLevel(featureLevel); } @@ -273,6 +423,42 @@ FeatureLevel Engine::getActiveFeatureLevel() const noexcept { return downcast(this)->getActiveFeatureLevel(); } +size_t Engine::getMaxAutomaticInstances() const noexcept { + return downcast(this)->getMaxAutomaticInstances(); +} + +const Engine::Config& Engine::getConfig() const noexcept { + return downcast(this)->getConfig(); +} + +bool Engine::isStereoSupported(StereoscopicType) const noexcept { + return downcast(this)->isStereoSupported(); +} + +size_t Engine::getMaxStereoscopicEyes() noexcept { + return FEngine::getMaxStereoscopicEyes(); +} + +uint64_t Engine::getSteadyClockTimeNano() noexcept { + return std::chrono::steady_clock::now().time_since_epoch().count(); +} + +Slice Engine::getFeatureFlags() const noexcept { + return downcast(this)->getFeatureFlags(); +} + +bool Engine::setFeatureFlag(char const* name, bool const value) noexcept { + return downcast(this)->setFeatureFlag(name, value); +} + +std::optional Engine::getFeatureFlag(char const* name) const noexcept { + return downcast(this)->getFeatureFlag(name); +} + +bool* Engine::getFeatureFlagPtr(char const* UTILS_NONNULL name) const noexcept { + return downcast(this)->getFeatureFlagPtr(name); +} + #if defined(__EMSCRIPTEN__) void Engine::resetBackendState() noexcept { downcast(this)->resetBackendState(); diff --git a/filament/src/Exposure.cpp b/filament/src/Exposure.cpp index b2a88a7ce13..9029b59646d 100644 --- a/filament/src/Exposure.cpp +++ b/filament/src/Exposure.cpp @@ -28,7 +28,7 @@ float ev100(const Camera& c) noexcept { return ev100(camera.getAperture(), camera.getShutterSpeed(), camera.getSensitivity()); } -float ev100(float aperture, float shutterSpeed, float sensitivity) noexcept { +float ev100(float const aperture, float const shutterSpeed, float const sensitivity) noexcept { // With N = aperture, t = shutter speed and S = sensitivity, // we can compute EV100 knowing that: // @@ -46,7 +46,7 @@ float ev100(float aperture, float shutterSpeed, float sensitivity) noexcept { return std::log2((aperture * aperture) / shutterSpeed * 100.0f / sensitivity); } -float ev100FromLuminance(float luminance) noexcept { +float ev100FromLuminance(float const luminance) noexcept { // With L the average scene luminance, S the sensitivity and K the // reflected-light meter calibration constant: // @@ -61,7 +61,7 @@ float ev100FromLuminance(float luminance) noexcept { return std::log2(luminance * (100.0f / 12.5f)); } -float ev100FromIlluminance(float illuminance) noexcept { +float ev100FromIlluminance(float const illuminance) noexcept { // With E the illuminance, S the sensitivity and C the incident-light meter // calibration constant, the exposure value can be computed as such: // @@ -83,14 +83,14 @@ float exposure(const Camera& c) noexcept { return exposure(camera.getAperture(), camera.getShutterSpeed(), camera.getSensitivity()); } -float exposure(float aperture, float shutterSpeed, float sensitivity) noexcept { +float exposure(float const aperture, float const shutterSpeed, float const sensitivity) noexcept { // This is equivalent to calling exposure(ev100(N, t, S)) // By merging the two calls we can remove extra pow()/log2() calls const float e = (aperture * aperture) / shutterSpeed * 100.0f / sensitivity; return 1.0f / (1.2f * e); } -float exposure(float ev100) noexcept { +float exposure(float const ev100) noexcept { // The photometric exposure H is defined by: // // H = (q * t / (N^2)) * L @@ -140,14 +140,14 @@ float luminance(const Camera& c) noexcept { return luminance(camera.getAperture(), camera.getShutterSpeed(), camera.getSensitivity()); } -float luminance(float aperture, float shutterSpeed, float sensitivity) noexcept { +float luminance(float const aperture, float const shutterSpeed, float const sensitivity) noexcept { // This is equivalent to calling luminance(ev100(N, t, S)) // By merging the two calls we can remove extra pow()/log2() calls const float e = (aperture * aperture) / shutterSpeed * 100.0f / sensitivity; return e * 0.125f; } -float luminance(float ev100) noexcept { +float luminance(float const ev100) noexcept { // With L the average scene luminance, S the sensitivity and K the // reflected-light meter calibration constant: // @@ -172,14 +172,14 @@ float illuminance(const Camera& c) noexcept { return illuminance(camera.getAperture(), camera.getShutterSpeed(), camera.getSensitivity()); } -float illuminance(float aperture, float shutterSpeed, float sensitivity) noexcept { +float illuminance(float const aperture, float const shutterSpeed, float const sensitivity) noexcept { // This is equivalent to calling illuminance(ev100(N, t, S)) // By merging the two calls we can remove extra pow()/log2() calls const float e = (aperture * aperture) / shutterSpeed * 100.0f / sensitivity; return 2.5f * e; } -float illuminance(float ev100) noexcept { +float illuminance(float const ev100) noexcept { // With E the illuminance, S the sensitivity and C the incident-light meter // calibration constant, the exposure value can be computed as such: // diff --git a/filament/src/Fence.cpp b/filament/src/Fence.cpp index 699326b1958..12199a0f00a 100644 --- a/filament/src/Fence.cpp +++ b/filament/src/Fence.cpp @@ -20,11 +20,11 @@ namespace filament { using namespace backend; -FenceStatus Fence::waitAndDestroy(Fence* fence, Mode mode) { +FenceStatus Fence::waitAndDestroy(Fence* fence, Mode const mode) { return FFence::waitAndDestroy(downcast(fence), mode); } -FenceStatus Fence::wait(Mode mode, uint64_t timeout) { +FenceStatus Fence::wait(Mode const mode, uint64_t const timeout) { return downcast(this)->wait(mode, timeout); } diff --git a/filament/src/FilamentBuilder.cpp b/filament/src/FilamentBuilder.cpp new file mode 100644 index 00000000000..67631eb4c9e --- /dev/null +++ b/filament/src/FilamentBuilder.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include + +namespace filament { + +void builderMakeName(utils::CString& outName, const char* name, size_t const len) noexcept { + if (!name) { + return; + } + size_t const length = std::min(len, size_t { 128u }); + outName = utils::CString(name, length); +} + +} // namespace filament diff --git a/filament/src/FrameHistory.h b/filament/src/FrameHistory.h index bbefe835e43..c016ec1bc29 100644 --- a/filament/src/FrameHistory.h +++ b/filament/src/FrameHistory.h @@ -21,6 +21,9 @@ #include #include +#include + +#include namespace filament { @@ -31,14 +34,14 @@ struct FrameHistoryEntry { struct TemporalAA{ FrameGraphTexture color; FrameGraphTexture::Descriptor desc; - math::mat4f projection; // world space to clip space + math::mat4 projection; // world space to clip space math::float2 jitter{}; uint32_t frameId = 0; // used for halton sequence } taa; struct { FrameGraphTexture color; FrameGraphTexture::Descriptor desc; - math::mat4f projection; + math::mat4 projection; } ssr; }; diff --git a/filament/src/FrameInfo.cpp b/filament/src/FrameInfo.cpp index d6f9653ae28..49a4e2b0d90 100644 --- a/filament/src/FrameInfo.cpp +++ b/filament/src/FrameInfo.cpp @@ -16,30 +16,34 @@ #include "FrameInfo.h" +#include + +#include + +#include +#include +#include #include +#include #include -#include +#include +#include +#include +#include +#include -#include +#include +#include namespace filament { using namespace utils; using namespace backend; -// this is to avoid a call to memmove -template -static inline -void move_backward(InputIterator first, InputIterator last, OutputIterator result) { - while (first != last) { - *--result = *--last; - } -} - FrameInfoManager::FrameInfoManager(DriverApi& driver) noexcept { for (auto& query : mQueries) { - query = driver.createTimerQuery(); + query.handle = driver.createTimerQuery(); } } @@ -47,54 +51,155 @@ FrameInfoManager::~FrameInfoManager() noexcept = default; void FrameInfoManager::terminate(DriverApi& driver) noexcept { for (auto& query : mQueries) { - driver.destroyTimerQuery(query); + driver.destroyTimerQuery(query.handle); } } -void FrameInfoManager::beginFrame(DriverApi& driver,Config const& config, uint32_t frameId) noexcept { - driver.beginTimerQuery(mQueries[mIndex]); - uint64_t elapsed = 0; - if (driver.getTimerQueryValue(mQueries[mLast], &elapsed)) { - mLast = (mLast + 1) % POOL_COUNT; - // conversion to our duration happens here - mFrameTime = std::chrono::duration(elapsed); +void FrameInfoManager::beginFrame(DriverApi& driver, Config const& config, uint32_t frameId) noexcept { + auto& history = mFrameTimeHistory; + // don't exceed the capacity, drop the oldest entry + if (UTILS_LIKELY(history.size() == history.capacity())) { + history.pop_back(); + } + + // create a new entry + auto& front = history.emplace_front(frameId); + + // store the current time + front.beginFrame = std::chrono::steady_clock::now(); + + // references are not invalidated by CircularQueue<>, so we can associate a reference to + // the slot we created to the timer query used to find the frame time. + mQueries[mIndex].pInfo = std::addressof(front); + // issue the timer query + driver.beginTimerQuery(mQueries[mIndex].handle); + // issue the custom backend command to get the backend time + driver.queueCommand([&front](){ + front.backendBeginFrame = std::chrono::steady_clock::now(); + }); + + // now is a good time to check the oldest active query + while (mLast != mIndex) { + uint64_t elapsed = 0; + TimerQueryResult const result = driver.getTimerQueryValue(mQueries[mLast].handle, &elapsed); + switch (result) { + case TimerQueryResult::NOT_READY: + // nothing to do + break; + case TimerQueryResult::ERROR: + mLast = (mLast + 1) % POOL_COUNT; + break; + case TimerQueryResult::AVAILABLE: { + SYSTRACE_CONTEXT(); + SYSTRACE_VALUE32("FrameInfo::elapsed", uint32_t(elapsed)); + // conversion to our duration happens here + pFront = mQueries[mLast].pInfo; + pFront->frameTime = std::chrono::duration(elapsed); + mLast = (mLast + 1) % POOL_COUNT; + denoiseFrameTime(history, config); + break; + } + } + if (result != TimerQueryResult::AVAILABLE) { + break; + } + // read the pending timer queries until we find one that's not ready + } + + // keep this just for debugging + if constexpr (false) { + using namespace utils; + auto h = getFrameInfoHistory(1); + if (!h.empty()) { + slog.d << frameId << ": " + << h[0].frameId << " (" << frameId - h[0].frameId << ")" + << ", Dm=" << h[0].endFrame - h[0].beginFrame + << ", L =" << h[0].backendBeginFrame - h[0].beginFrame + << ", Db=" << h[0].backendEndFrame - h[0].backendBeginFrame + << ", T =" << h[0].frameTime + << io::endl; + } } - update(config, mFrameTime); } void FrameInfoManager::endFrame(DriverApi& driver) noexcept { - driver.endTimerQuery(mQueries[mIndex]); + auto& front = mFrameTimeHistory.front(); + // close the timer query + driver.endTimerQuery(mQueries[mIndex].handle); + // queue custom backend command to query the current time + driver.queueCommand([&front](){ + // backend frame end-time + front.backendEndFrame = std::chrono::steady_clock::now(); + // signal that the data is available + front.ready.store(true, std::memory_order_release); + }); + // and finally acquire the time on the main thread + front.endFrame = std::chrono::steady_clock::now(); mIndex = (mIndex + 1) % POOL_COUNT; } -void FrameInfoManager::update(Config const& config, FrameInfoManager::duration lastFrameTime) noexcept { - // keep an history of frame times - auto& history = mFrameTimeHistory; - - // this is like doing { pop_back(); push_front(); } - filament::move_backward(history.begin(), history.end() - 1, history.end()); - history[0].frameTime = lastFrameTime; +void FrameInfoManager::denoiseFrameTime(FrameHistoryQueue& history, Config const& config) noexcept { + assert_invariant(!history.empty()); - mFrameTimeHistorySize = std::min(++mFrameTimeHistorySize, uint32_t(MAX_FRAMETIME_HISTORY)); - if (UTILS_UNLIKELY(mFrameTimeHistorySize < 3)) { - // not enough history to do anything useful - history[0].valid = false; - return; + // find the first slot that has a valid frame duration + size_t first = history.size(); + for (size_t i = 0, c = history.size(); i < c; ++i) { + if (history[i].frameTime != duration(0)) { + first = i; + break; + } } + assert_invariant(first != history.size()); + + // we need at least 3 valid frame time to calculate the median + if (history.size() >= first + 3) { + // apply a median filter to get a good representation of the frame time of the last + // N frames. + std::array median; // NOLINT -- it's initialized below + size_t const size = std::min({ + history.size() - first, + median.size(), + size_t(config.historySize) }); + + for (size_t i = 0; i < size; ++i) { + median[i] = history[first + i].frameTime; + } + std::sort(median.begin(), median.begin() + size); + duration const denoisedFrameTime = median[size / 2]; + + history[first].denoisedFrameTime = denoisedFrameTime; + history[first].valid = true; + } +} - // apply a median filter to get a good representation of the frame time of the last - // N frames. - std::array median; // NOLINT -- it's initialized below - size_t size = std::min(mFrameTimeHistorySize, std::min(config.historySize, (uint32_t)median.size())); - for (size_t i = 0; i < size; ++i) { - median[i] = history[i].frameTime; +FixedCapacityVector FrameInfoManager::getFrameInfoHistory( + size_t historySize) const noexcept { + auto result = FixedCapacityVector::with_capacity(MAX_FRAMETIME_HISTORY); + auto const& history = mFrameTimeHistory; + size_t i = 0; + size_t const c = history.size(); + for (; i < c; ++i) { + auto const& entry = history[i]; + if (entry.ready.load(std::memory_order_acquire) && entry.valid) { + // once we found an entry ready, + // we know by construction that all following ones are too + break; + } } - std::sort(median.begin(), median.begin() + size); - duration denoisedFrameTime = median[size / 2]; - - history[0].denoisedFrameTime = denoisedFrameTime; - history[0].valid = true; + for (; i < c && historySize; ++i, --historySize) { + auto const& entry = history[i]; + using namespace std::chrono; + result.push_back({ + entry.frameId, + duration_cast(entry.frameTime).count(), + duration_cast(entry.denoisedFrameTime).count(), + duration_cast(entry.beginFrame.time_since_epoch()).count(), + duration_cast(entry.endFrame.time_since_epoch()).count(), + duration_cast(entry.backendBeginFrame.time_since_epoch()).count(), + duration_cast(entry.backendEndFrame.time_since_epoch()).count() + }); + } + return result; } - } // namespace filament diff --git a/filament/src/FrameInfo.h b/filament/src/FrameInfo.h index fff5850dc50..668d8a23fe5 100644 --- a/filament/src/FrameInfo.h +++ b/filament/src/FrameInfo.h @@ -17,30 +17,136 @@ #ifndef TNT_FILAMENT_FRAMEINFO_H #define TNT_FILAMENT_FRAMEINFO_H -#include "backend/Handle.h" +#include + +#include + #include +#include +#include +#include + #include +#include #include +#include +#include #include +#include namespace filament { class FEngine; +namespace details { struct FrameInfo { using duration = std::chrono::duration; duration frameTime{}; // frame period duration denoisedFrameTime{}; // frame period (median filter) - bool valid = false; + bool valid = false; // true if the data of the structure is valid +}; +} // namespace details + +struct FrameInfoImpl : public details::FrameInfo { + using clock = std::chrono::steady_clock; + using time_point = clock::time_point; + uint32_t const frameId; + time_point beginFrame; // main thread beginFrame time + time_point endFrame; // main thread endFrame time + time_point backendBeginFrame; // backend thread beginFrame time (makeCurrent time) + time_point backendEndFrame; // backend thread endFrame time (present time) + std::atomic_bool ready{}; // true once backend thread has populated its data + explicit FrameInfoImpl(uint32_t const frameId) noexcept + : frameId(frameId) { + } +}; + +template +class CircularQueue { +public: + using value_type = T; + using reference = value_type&; + using const_reference = value_type const&; + + size_t capacity() const { + return CAPACITY; + } + + size_t size() const { + return mSize; + } + + bool empty() const noexcept { + return !size(); + } + + void pop_back() noexcept { + assert_invariant(!empty()); + --mSize; + std::destroy_at(&mStorage[(mFront - mSize) % CAPACITY]); + } + + void push_front(T const& v) noexcept { + assert_invariant(size() < CAPACITY); + mFront = advance(mFront); + new(&mStorage[mFront]) T(v); + ++mSize; + } + + void push_front(T&& v) noexcept { + assert_invariant(size() < CAPACITY); + mFront = advance(mFront); + new(&mStorage[mFront]) T(std::move(v)); + ++mSize; + } + + template + T& emplace_front(Args&&... args) noexcept { + assert_invariant(size() < CAPACITY); + mFront = advance(mFront); + new(&mStorage[mFront]) T(std::forward(args)...); + ++mSize; + return front(); + } + + T& operator[](size_t const pos) noexcept { + assert_invariant(pos < size()); + size_t const index = (mFront + CAPACITY - pos) % CAPACITY; + return *std::launder(reinterpret_cast(&mStorage[index])); + } + + T const& operator[](size_t pos) const noexcept { + return const_cast(*this)[pos]; + } + + T const& front() const noexcept { + assert_invariant(!empty()); + return operator[](0); + } + + T& front() noexcept { + assert_invariant(!empty()); + return operator[](0); + } + +private: + using Storage = std::aligned_storage_t; + Storage mStorage[CAPACITY]; + uint32_t mFront = 0; // always index 0 + uint32_t mSize = 0; + [[nodiscard]] inline uint32_t advance(uint32_t const v) noexcept { + return (v + 1) % CAPACITY; + } }; class FrameInfoManager { static constexpr size_t POOL_COUNT = 4; - static constexpr size_t MAX_FRAMETIME_HISTORY = 31u; + static constexpr size_t MAX_FRAMETIME_HISTORY = 16u; public: - using duration = FrameInfo::duration; + using duration = FrameInfoImpl::duration; + using clock = FrameInfoImpl::clock; struct Config { uint32_t historySize; @@ -57,23 +163,25 @@ class FrameInfoManager { // call this immediately before "swap buffers" void endFrame(backend::DriverApi& driver) noexcept; - FrameInfo const& getLastFrameInfo() const noexcept { - return mFrameTimeHistory[0]; + details::FrameInfo getLastFrameInfo() const noexcept { + // if pFront is not set yet, return FrameInfo(). But the `valid` field will be false in this case. + return pFront ? *pFront : details::FrameInfo{}; } - duration getLastFrameTime() const noexcept { - return getLastFrameInfo().frameTime; - } + utils::FixedCapacityVector getFrameInfoHistory(size_t historySize) const noexcept; private: - void update(Config const& config, duration lastFrameTime) noexcept; - backend::Handle mQueries[POOL_COUNT]; - duration mFrameTime{}; - uint32_t mIndex = 0; - uint32_t mLast = 0; - - std::array mFrameTimeHistory; - uint32_t mFrameTimeHistorySize = 0; + using FrameHistoryQueue = CircularQueue; + static void denoiseFrameTime(FrameHistoryQueue& history, Config const& config) noexcept; + struct Query { + backend::Handle handle{}; + FrameInfoImpl* pInfo = nullptr; + }; + std::array mQueries; + uint32_t mIndex = 0; // index of current query + uint32_t mLast = 0; // index of oldest query still active + FrameInfoImpl* pFront = nullptr; // the most recent slot with a valid frame time + FrameHistoryQueue mFrameTimeHistory; }; diff --git a/filament/src/FrameSkipper.cpp b/filament/src/FrameSkipper.cpp index ff0a185f27a..c58f9869532 100644 --- a/filament/src/FrameSkipper.cpp +++ b/filament/src/FrameSkipper.cpp @@ -16,57 +16,62 @@ #include "FrameSkipper.h" -#include "details/Engine.h" +#include -#include +#include #include +#include + +#include + namespace filament { using namespace utils; using namespace backend; -FrameSkipper::FrameSkipper(size_t latency) noexcept - : mLast(latency) { - assert_invariant(latency <= MAX_FRAME_LATENCY); +FrameSkipper::FrameSkipper(size_t const latency) noexcept + : mLast(std::clamp(latency, size_t(1), MAX_FRAME_LATENCY) - 1) { } FrameSkipper::~FrameSkipper() noexcept = default; void FrameSkipper::terminate(DriverApi& driver) noexcept { - for (auto sync : mDelayedSyncs) { - if (sync) { - driver.destroySync(sync); + for (auto fence : mDelayedFences) { + if (fence) { + driver.destroyFence(fence); } } } bool FrameSkipper::beginFrame(DriverApi& driver) noexcept { - auto& syncs = mDelayedSyncs; - auto sync = syncs.front(); - if (sync) { - auto status = driver.getSyncStatus(sync); - if (status == SyncStatus::NOT_SIGNALED) { - // Sync not ready, skip frame + auto& fences = mDelayedFences; + if (fences.front()) { + // Do we have a latency old fence? + auto status = driver.getFenceStatus(fences.front()); + if (UTILS_UNLIKELY(status == FenceStatus::TIMEOUT_EXPIRED)) { + // The fence hasn't signaled yet, skip this frame return false; } - driver.destroySync(sync); + assert_invariant(status == FenceStatus::CONDITION_SATISFIED); } - // shift all fences down by 1 - std::move(syncs.begin() + 1, syncs.end(), syncs.begin()); - syncs.back() = {}; return true; } void FrameSkipper::endFrame(DriverApi& driver) noexcept { - // if the user produced a new frame despite the fact that the previous one wasn't finished - // (i.e. FrameSkipper::beginFrame() returned false), we need to make sure to replace - // a fence that might be here already) - auto& sync = mDelayedSyncs[mLast]; - if (sync) { - driver.destroySync(sync); + auto& fences = mDelayedFences; + size_t const last = mLast; + + // pop the oldest fence and advance the other ones + if (fences.front()) { + driver.destroyFence(fences.front()); } - sync = driver.createSync(); + std::move(fences.begin() + 1, fences.end(), fences.begin()); + + // add a new fence to the end + assert_invariant(!fences[last]); + + fences[last] = driver.createFence(); } } // namespace filament diff --git a/filament/src/FrameSkipper.h b/filament/src/FrameSkipper.h index 434c61f6e26..814299341a2 100644 --- a/filament/src/FrameSkipper.h +++ b/filament/src/FrameSkipper.h @@ -22,27 +22,59 @@ #include +#include +#include + namespace filament { +/* + * FrameSkipper is used to determine if the current frame needs to be skipped so that we don't + * outrun the GPU. + */ class FrameSkipper { - static constexpr size_t MAX_FRAME_LATENCY = 4; + /* + * The maximum frame latency acceptable on ANDROID is 2 because higher latencies will be + * throttled anyway in BufferQueueProducer::dequeueBuffer(), because ANDROID is generally + * triple-buffered no more; that case is actually pretty bad because the GL thread can block + * anywhere (usually inside the first draw command that touches the swapchain). + * + * A frame latency of 1 has the benefit of reducing render latency, + * but the drawback of preventing CPU / GPU overlap. + * + * Generally a frame latency of 2 is the best compromise. + */ + static constexpr size_t MAX_FRAME_LATENCY = 2; public: + /* + * The latency parameter defines how many unfinished frames we want to accept before we start + * dropping frames. This affects frame latency. + * + * A latency of 1 means that the GPU must be finished with the previous frame so that + * we don't drop the current frame. While this provides the best latency this doesn't allow + * much overlap between the main thread, the back thread and the GPU. + * + * A latency of 2 (default) allows full overlap between the CPU And GPU, but the main and driver + * thread can't fully overlap. + * + * A latency 3 allows the main thread, driver thread and GPU to overlap, each being able to + * use up to 16ms (or whatever the refresh rate is). + */ explicit FrameSkipper(size_t latency = 2) noexcept; ~FrameSkipper() noexcept; void terminate(backend::DriverApi& driver) noexcept; - // returns false if we need to skip this frame, because the gpu is running behind the cpu. - // in that case, don't call endFrame(). - // returns true if rendering can proceed. Always call endFrame() when done. + // Returns false if we need to skip this frame, because the GPU is running behind the CPU; + // In that case, don't call render endFrame() + // Returns true if rendering can proceed. Always call endFrame() when done. bool beginFrame(backend::DriverApi& driver) noexcept; void endFrame(backend::DriverApi& driver) noexcept; private: - using Container = std::array, MAX_FRAME_LATENCY>; - mutable Container mDelayedSyncs{}; - size_t mLast; + using Container = std::array, MAX_FRAME_LATENCY>; + mutable Container mDelayedFences{}; + uint8_t const mLast; }; } // namespace filament diff --git a/filament/src/Froxelizer.cpp b/filament/src/Froxelizer.cpp index ddbe6f7d448..fe8975276ec 100644 --- a/filament/src/Froxelizer.cpp +++ b/filament/src/Froxelizer.cpp @@ -16,26 +16,47 @@ #include "Froxelizer.h" +#include "Allocators.h" #include "Intersections.h" #include "details/Engine.h" #include "details/Scene.h" -#include "private/backend/DriverApi.h" +#include +#include +#include #include +#include + #include +#include +#include +#include #include +#include #include -#include #include +#include +#include #include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include #include +#include +#include using namespace filament::math; using namespace utils; @@ -49,32 +70,13 @@ static constexpr size_t FROXEL_SLICE_COUNT = 16; static constexpr float FROXEL_FIRST_SLICE_DEPTH = 5; static constexpr float FROXEL_LAST_SLICE_DISTANCE = 100; -// Max number of froxels limited by: -// - max texture size [min 2048] -// - chosen texture width [64] -// -// Also, increasing the number of froxels adds more pressure on the "record buffer" which stores -// the light indices per froxel. The record buffer is limited to min(16K[ubo], 64K[uint16]) entries, -// so with 8192 froxels, we can store 2 lights per froxels assuming they're all used. In practice, some -// froxels are not used, so we can store more. -constexpr size_t FROXEL_BUFFER_ENTRY_COUNT = 8192; - // The record buffer is limited by both the UBO size and our use of 16-bits indices. constexpr size_t RECORD_BUFFER_ENTRY_COUNT = CONFIG_MINSPEC_UBO_SIZE; // 16 KiB UBO minspec -// The Froxel buffer is set to FROXEL_BUFFER_WIDTH x n -// With n limited by the supported texture dimension, which is guaranteed to be at least 2048 -// in all version of GLES. -// Make sure this matches the same constants in shading_lit.fs -constexpr size_t FROXEL_BUFFER_WIDTH_SHIFT = 6u; -constexpr size_t FROXEL_BUFFER_WIDTH = 1u << FROXEL_BUFFER_WIDTH_SHIFT; -constexpr size_t FROXEL_BUFFER_WIDTH_MASK = FROXEL_BUFFER_WIDTH - 1u; -constexpr size_t FROXEL_BUFFER_HEIGHT = (FROXEL_BUFFER_ENTRY_COUNT + FROXEL_BUFFER_WIDTH_MASK) / FROXEL_BUFFER_WIDTH; - // Buffer needed for Froxelizer internal data structures (~256 KiB) constexpr size_t PER_FROXELDATA_ARENA_SIZE = sizeof(float4) * - (FROXEL_BUFFER_ENTRY_COUNT + - FROXEL_BUFFER_ENTRY_COUNT + 3 + + (FROXEL_BUFFER_MAX_ENTRY_COUNT + + FROXEL_BUFFER_MAX_ENTRY_COUNT + 3 + FROXEL_SLICE_COUNT / 4 + 1); // number of lights processed by one group (e.g. 32) @@ -97,26 +99,47 @@ static_assert(RECORD_BUFFER_ENTRY_COUNT <= CONFIG_MINSPEC_UBO_SIZE, "RecordBuffer cannot be larger than the UBO minspec (16KiB)"); struct Froxelizer::FroxelThreadData : - public std::array { + public std::array { }; + +// Returns false if the two matrices are different. May return false if they're the +// same, with some elements only differing by +0 or -0. Behaviour is undefined with NaNs. +static bool fuzzyEqual(mat4f const& UTILS_RESTRICT l, mat4f const& UTILS_RESTRICT r) noexcept { + auto const li = reinterpret_cast( reinterpret_cast(&l) ); + auto const ri = reinterpret_cast( reinterpret_cast(&r) ); + uint32_t result = 0; + for (size_t i = 0; i < sizeof(mat4f) / sizeof(uint32_t); i++) { + // clang fully vectorizes this + result |= li[i] ^ ri[i]; + } + return result == 0; +} + + Froxelizer::Froxelizer(FEngine& engine) : mArena("froxel", PER_FROXELDATA_ARENA_SIZE), mZLightNear(FROXEL_FIRST_SLICE_DEPTH), mZLightFar(FROXEL_LAST_SLICE_DISTANCE) { - DriverApi& driverApi = engine.getDriverApi(); - static_assert(std::is_same_v, "Record Buffer must use bytes"); + DriverApi& driverApi = engine.getDriverApi(); + + if (UTILS_UNLIKELY(driverApi.getFeatureLevel() == FeatureLevel::FEATURE_LEVEL_0)) { + return; + } + + mFroxelBufferEntryCount = std::min( + FROXEL_BUFFER_MAX_ENTRY_COUNT, + engine.getDriverApi().getMaxUniformBufferSize() / 16u); + mRecordsBuffer = driverApi.createBufferObject(RECORD_BUFFER_ENTRY_COUNT, BufferObjectBinding::UNIFORM, BufferUsage::DYNAMIC); - mFroxelTexture = driverApi.createTexture(SamplerType::SAMPLER_2D, 1, - backend::TextureFormat::RG16UI, 1, - FROXEL_BUFFER_WIDTH, FROXEL_BUFFER_HEIGHT, 1, - TextureUsage::SAMPLEABLE | TextureUsage::UPLOADABLE); + mFroxelsBuffer = driverApi.createBufferObject(getFroxelBufferEntryCount() * 16u, + BufferObjectBinding::UNIFORM, BufferUsage::DYNAMIC); } Froxelizer::~Froxelizer() { @@ -132,11 +155,15 @@ void Froxelizer::terminate(DriverApi& driverApi) noexcept { mPlanesX = nullptr; mDistancesZ = nullptr; - driverApi.destroyBufferObject(mRecordsBuffer); - driverApi.destroyTexture(mFroxelTexture); + if (mRecordsBuffer) { + driverApi.destroyBufferObject(mRecordsBuffer); + } + if (mFroxelsBuffer) { + driverApi.destroyBufferObject(mFroxelsBuffer); + } } -void Froxelizer::setOptions(float zLightNear, float zLightFar) noexcept { +void Froxelizer::setOptions(float const zLightNear, float const zLightFar) noexcept { if (UTILS_UNLIKELY(mZLightNear != zLightNear || mZLightFar != zLightFar)) { mZLightNear = zLightNear; mZLightFar = zLightFar; @@ -153,9 +180,8 @@ void Froxelizer::setViewport(filament::Viewport const& viewport) noexcept { } void Froxelizer::setProjection(const mat4f& projection, - float near, - UTILS_UNUSED float far) noexcept { - if (UTILS_UNLIKELY(mat4f::fuzzyEqual(mProjection, projection))) { + float const near, UTILS_UNUSED float far) noexcept { + if (UTILS_UNLIKELY(!fuzzyEqual(mProjection, projection))) { mProjection = projection; mNear = near; mDirtyFlags |= PROJECTION_CHANGED; @@ -163,8 +189,9 @@ void Froxelizer::setProjection(const mat4f& projection, } bool Froxelizer::prepare( - FEngine::DriverApi& driverApi, ArenaScope& arena, filament::Viewport const& viewport, - const mat4f& projection, float projectionNear, float projectionFar) noexcept { + FEngine::DriverApi& driverApi, RootArenaScope& rootArenaScope, + filament::Viewport const& viewport, + const mat4f& projection, float const projectionNear, float const projectionFar) noexcept { setViewport(viewport); setProjection(projection, projectionNear, projectionFar); @@ -180,8 +207,8 @@ bool Froxelizer::prepare( // froxel buffer (~32 KiB) mFroxelBufferUser = { - driverApi.allocatePod(FROXEL_BUFFER_ENTRY_COUNT), - FROXEL_BUFFER_ENTRY_COUNT }; + driverApi.allocatePod(getFroxelBufferEntryCount()), + getFroxelBufferEntryCount() }; // record buffer (~16 KiB) mRecordBufferUser = { @@ -194,12 +221,12 @@ bool Froxelizer::prepare( // light records per froxel (~256 KiB) mLightRecords = { - arena.allocate(FROXEL_BUFFER_ENTRY_COUNT, CACHELINE_SIZE), - FROXEL_BUFFER_ENTRY_COUNT }; + rootArenaScope.allocate(getFroxelBufferEntryCount(), CACHELINE_SIZE), + getFroxelBufferEntryCount() }; // froxel thread data (~256 KiB) mFroxelShardedData = { - arena.allocate(GROUP_COUNT, CACHELINE_SIZE), + rootArenaScope.allocate(GROUP_COUNT, CACHELINE_SIZE), uint32_t(GROUP_COUNT) }; @@ -216,9 +243,9 @@ bool Froxelizer::prepare( void Froxelizer::computeFroxelLayout( uint2* dim, uint16_t* countX, uint16_t* countY, uint16_t* countZ, - filament::Viewport const& viewport) noexcept { + size_t const froxelBufferEntryCount, filament::Viewport const& viewport) noexcept { - auto roundTo8 = [](uint32_t v) { return (v + 7u) & ~7u; }; + auto roundTo8 = [](uint32_t const v) { return (v + 7u) & ~7u; }; const uint32_t width = std::max(16u, viewport.width); const uint32_t height = std::max(16u, viewport.height); @@ -226,7 +253,7 @@ void Froxelizer::computeFroxelLayout( // calculate froxel dimension from FROXEL_BUFFER_ENTRY_COUNT_MAX and viewport // - Start from the maximum number of froxels we can use in the x-y plane size_t const froxelSliceCount = FROXEL_SLICE_COUNT; - size_t const froxelPlaneCount = FROXEL_BUFFER_ENTRY_COUNT / froxelSliceCount; + size_t const froxelPlaneCount = froxelBufferEntryCount / froxelSliceCount; // - compute the number of square froxels we need in width and height, rounded down // solving: | froxelCountX * froxelCountY == froxelPlaneCount // | froxelCountX / froxelCountY == width / height @@ -257,10 +284,10 @@ void Froxelizer::computeFroxelLayout( UTILS_NOINLINE void Froxelizer::updateBoundingSpheres( - math::float4* const UTILS_RESTRICT boundingSpheres, + float4* const UTILS_RESTRICT boundingSpheres, size_t froxelCountX, size_t froxelCountY, size_t froxelCountZ, - math::float4 const* UTILS_RESTRICT planesX, - math::float4 const* UTILS_RESTRICT planesY, + float4 const* UTILS_RESTRICT planesX, + float4 const* UTILS_RESTRICT planesY, float const* UTILS_RESTRICT planesZ) noexcept { SYSTRACE_CALL(); @@ -323,7 +350,8 @@ bool Froxelizer::update() noexcept { uint2 froxelDimension; uint16_t froxelCountX, froxelCountY, froxelCountZ; - computeFroxelLayout(&froxelDimension, &froxelCountX, &froxelCountY, &froxelCountZ, viewport); + computeFroxelLayout(&froxelDimension, &froxelCountX, &froxelCountY, &froxelCountZ, + getFroxelBufferEntryCount(), viewport); mFroxelDimension = froxelDimension; mClipToFroxelX = (0.5f * float(viewport.width)) / float(froxelDimension.x); @@ -336,7 +364,7 @@ bool Froxelizer::update() noexcept { << froxelDimension.x << "x" << froxelDimension.y << io::endl << "Froxel: " << froxelCountX << "x" << froxelCountY << "x" << froxelCountZ << " = " << (froxelCountX * froxelCountY * froxelCountZ) - << " (" << FROXEL_BUFFER_ENTRY_COUNT - froxelCountX * froxelCountY * froxelCountZ << " lost)" + << " (" << getFroxelBufferEntryCount() - froxelCountX * froxelCountY * froxelCountZ << " lost)" << io::endl; #endif @@ -450,7 +478,7 @@ bool Froxelizer::update() noexcept { return uniformsNeedUpdating; } -Froxel Froxelizer::getFroxelAt(size_t x, size_t y, size_t z) const noexcept { +Froxel Froxelizer::getFroxelAt(size_t const x, size_t const y, size_t const z) const noexcept { assert_invariant(x < mFroxelCountX); assert_invariant(y < mFroxelCountY); assert_invariant(z < mFroxelCountZ); @@ -465,7 +493,7 @@ Froxel Froxelizer::getFroxelAt(size_t x, size_t y, size_t z) const noexcept { } UTILS_NOINLINE -size_t Froxelizer::findSliceZ(float z) const noexcept { +size_t Froxelizer::findSliceZ(float const z) const noexcept { // The vastly common case is that z<0, so we always do the math for this case // and we "undo" it below otherwise. This works because we're using fast::log2 which // doesn't care if given a negative number (we'd have to use abs() otherwise). @@ -494,13 +522,10 @@ std::pair Froxelizer::clipToIndices(float2 const& clip) const no } -void Froxelizer::commit(backend::DriverApi& driverApi) { +void Froxelizer::commit(DriverApi& driverApi) { // send data to GPU - driverApi.update3DImage(mFroxelTexture, 0, 0, 0, 0, - FROXEL_BUFFER_WIDTH, FROXEL_BUFFER_HEIGHT, 1, { - mFroxelBufferUser.begin(), mFroxelBufferUser.sizeInBytes(), - PixelBufferDescriptor::PixelDataFormat::RG_INTEGER, - PixelBufferDescriptor::PixelDataType::USHORT }); + driverApi.updateBufferObject(mFroxelsBuffer, + { mFroxelBufferUser.data(), getFroxelBufferEntryCount() * 16u }, 0); driverApi.updateBufferObject(mRecordsBuffer, { mRecordBufferUser.data(), RECORD_BUFFER_ENTRY_COUNT }, 0); @@ -528,11 +553,11 @@ void Froxelizer::froxelizeLights(FEngine& engine, mFroxelCountX * mFroxelCountY * mFroxelCountZ); for (auto const& entry : gpuFroxelEntries) { // go through every light for that froxel - for (size_t i = 0; i < entry.count; i++) { + for (size_t i = 0; i < entry.count(); i++) { // get the light index - assert_invariant(entry.offset + i < RECORD_BUFFER_ENTRY_COUNT); + assert_invariant(entry.offset() + i < RECORD_BUFFER_ENTRY_COUNT); - size_t const lightIndex = recordBufferUser[entry.offset + i]; + size_t const lightIndex = recordBufferUser[entry.offset() + i]; assert_invariant(lightIndex <= CONFIG_MAX_LIGHT_INDEX); // make sure it corresponds to an existing light @@ -558,7 +583,9 @@ void Froxelizer::froxelizeLoop(FEngine& engine, auto process = [ this, &froxelThreadData, spheres, directions, instances, &viewMatrix, &lcm ] - (size_t count, size_t offset, size_t stride) { + (size_t const count, size_t const offset, size_t const stride) { + + SYSTRACE_NAME("FroxelizeLoop Job"); const mat4f& projection = mProjection; const mat3f& vn = viewMatrix.upperLeft(); @@ -596,7 +623,7 @@ void Froxelizer::froxelizeLoop(FEngine& engine, JobSystem& js = engine.getJobSystem(); constexpr bool SINGLE_THREADED = false; - if (!SINGLE_THREADED) { + if constexpr (!SINGLE_THREADED) { auto *parent = js.createJob(); for (size_t i = 0; i < GROUP_COUNT; i++) { js.run(jobs::createJob(js, parent, std::cref(process), @@ -614,7 +641,7 @@ void Froxelizer::froxelizeAssignRecordsCompress() noexcept { SYSTRACE_CALL(); - Slice froxelThreadData = mFroxelShardedData; + Slice const froxelThreadData = mFroxelShardedData; // convert froxel data from N groups of M bits to LightRecord::bitset, so we can // easily compare adjacent froxels, for compaction. The conversion loops below get @@ -622,8 +649,8 @@ void Froxelizer::froxelizeAssignRecordsCompress() noexcept { // this gets very well vectorized... - utils::Slice records(mLightRecords); - for (size_t j = 0, jc = FROXEL_BUFFER_ENTRY_COUNT; j < jc; j++) { + Slice records(mLightRecords); + for (size_t j = 0, jc = getFroxelBufferEntryCount(); j < jc; j++) { for (size_t i = 0; i < LightRecord::bitset::WORLD_COUNT; i++) { using container_type = LightRecord::bitset::container_type; constexpr size_t r = sizeof(container_type) / sizeof(LightGroupType); @@ -636,7 +663,7 @@ void Froxelizer::froxelizeAssignRecordsCompress() noexcept { } LightRecord::bitset allLights{}; - for (size_t j = 0, jc = FROXEL_BUFFER_ENTRY_COUNT; j < jc; j++) { + for (size_t j = 0, jc = getFroxelBufferEntryCount(); j < jc; j++) { allLights |= records[j].lights; } @@ -673,11 +700,8 @@ void Froxelizer::froxelizeAssignRecordsCompress() noexcept { // We have a limitation of 255 spot + 255 point lights per froxel. // note: initializer list for union cannot have more than one element - FroxelEntry entry{ - .offset = offset, - .count = (uint8_t)std::min(size_t(255), b.lights.count()), - }; - const size_t lightCount = entry.count; + FroxelEntry entry{ offset, uint8_t(std::min(size_t(255), b.lights.count())) }; + const size_t lightCount = entry.count(); if (UTILS_UNLIKELY(offset + lightCount >= RECORD_BUFFER_ENTRY_COUNT)) { #ifndef NDEBUG @@ -686,7 +710,7 @@ void Froxelizer::froxelizeAssignRecordsCompress() noexcept { // note: instead of dropping froxels we could look for similar records we've already // filed up. do { - froxels[i] = { .offset = 0, .count = allLightsCount }; + froxels[i] = { 0u, allLightsCount }; if (records[i].lights.none()) { froxels[i].u32 = 0; } @@ -733,7 +757,7 @@ void Froxelizer::froxelizeAssignRecordsCompress() noexcept { ; } -static inline float2 project(mat4f const& p, float3 const& v) noexcept { +static float2 project(mat4f const& p, float3 const& v) noexcept { const float vx = v[0]; const float vy = v[1]; const float vz = v[2]; @@ -746,7 +770,7 @@ static inline float2 project(mat4f const& p, float3 const& v) noexcept { void Froxelizer::froxelizePointAndSpotLight( FroxelThreadData& froxelThread, size_t bit, mat4f const& UTILS_RESTRICT p, - const Froxelizer::LightParams& UTILS_RESTRICT light) const noexcept { + const LightParams& UTILS_RESTRICT light) const noexcept { if (UTILS_UNLIKELY(light.position.z + light.radius < -mZLightFar)) { // z values are negative // This light is fully behind LightFar, it doesn't light anything @@ -898,7 +922,7 @@ void Froxelizer::froxelizePointAndSpotLight( */ void Froxelizer::computeLightTree( LightTreeNode* lightTree, - utils::Slice const& lightList, + Slice const& lightList, const FScene::LightSoa& lightData, size_t lightRecordsOffset) noexcept { @@ -906,7 +930,7 @@ void Froxelizer::computeLightTree( const size_t count = lightList.size(); // the width of the tree is the next power-of-two (if not already a power of two) - const size_t w = 1u << (log2i(count) + (utils::popcount(count) == 1 ? 0 : 1)); + const size_t w = 1u << (log2i(count) + (popcount(count) == 1 ? 0 : 1)); // height of the tree const size_t h = log2i(w) + 1u; @@ -914,7 +938,7 @@ void Froxelizer::computeLightTree( auto const* UTILS_RESTRICT zrange = lightData.data() + 1; BinaryTreeArray::traverse(h, [lightTree, lightRecordsOffset, zrange, indices = lightList.data(), count] - (size_t index, size_t col, size_t next) { + (size_t const index, size_t const col, size_t const next) { // indices[] cannot be accessed past 'col' const float min = (col < count) ? zrange[indices[col]].x : 1.0f; const float max = (col < count) ? zrange[indices[col]].y : 0.0f; @@ -928,7 +952,7 @@ void Froxelizer::computeLightTree( .reserved = 0, }; }, - [lightTree](size_t index, size_t l, size_t r, size_t next) { + [lightTree](size_t const index, size_t const l, size_t const r, size_t const next) { lightTree[index] = { .min = std::min(lightTree[l].min, lightTree[r].min), .max = std::max(lightTree[l].max, lightTree[r].max), diff --git a/filament/src/Froxelizer.h b/filament/src/Froxelizer.h index 2a0636bd65b..d052b7241b4 100644 --- a/filament/src/Froxelizer.h +++ b/filament/src/Froxelizer.h @@ -35,6 +35,15 @@ namespace filament { +// Max number of froxels limited by: +// - max ubo size [min 16KiB] +// +// Also, increasing the number of froxels adds more pressure on the "record buffer" which stores +// the light indices per froxel. The record buffer is limited to min(16K[ubo], 64K[uint16]) entries, +// so with 8192 froxels, we can store 2 lights per froxels assuming they're all used. In practice, +// some froxels are not used, so we can store more. +constexpr size_t FROXEL_BUFFER_MAX_ENTRY_COUNT = 8192; + class FEngine; class FCamera; class FTexture; @@ -83,7 +92,9 @@ class Froxelizer { } // gpu buffer containing froxels. valid after construction. - backend::Handle getFroxelTexture() const noexcept { return mFroxelTexture; } + backend::Handle getFroxelBuffer() const noexcept { + return mFroxelsBuffer; + } void setOptions(float zLightNear, float zLightFar) noexcept; @@ -99,7 +110,7 @@ class Froxelizer { * * return true if updateUniforms() needs to be called */ - bool prepare(backend::DriverApi& driverApi, ArenaScope& arena, Viewport const& viewport, + bool prepare(backend::DriverApi& driverApi, RootArenaScope& rootArenaScope, Viewport const& viewport, const math::mat4f& projection, float projectionNear, float projectionFar) noexcept; Froxel getFroxelAt(size_t x, size_t y, size_t z) const noexcept; @@ -129,14 +140,11 @@ class Froxelizer { */ struct FroxelEntry { - union { - uint32_t u32 = 0; - struct { - uint16_t offset; - uint8_t count; - uint8_t reserved; - }; - }; + inline FroxelEntry(uint16_t const offset, uint8_t const count) noexcept + : u32((offset << 16) | count) { } + inline uint8_t count() const noexcept { return u32 & 0xFFu; } + inline uint16_t offset() const noexcept { return u32 >> 16u; } + uint32_t u32 = 0; }; // we can't change this easily because the shader expects 16 indices per uint4 @@ -150,6 +158,10 @@ class Froxelizer { using LightGroupType = uint32_t; private: + size_t getFroxelBufferEntryCount() const noexcept { + return mFroxelBufferEntryCount; + } + struct LightRecord { using bitset = utils::bitset; bitset lights; @@ -202,12 +214,12 @@ class Froxelizer { math::float4 const* UTILS_RESTRICT planesY, float const* UTILS_RESTRICT planesZ) noexcept; - static size_t getFroxelIndex(size_t ix, size_t iy, size_t iz, - size_t froxelCountX, size_t froxelCountY) noexcept { + static size_t getFroxelIndex(size_t const ix, size_t const iy, size_t const iz, + size_t const froxelCountX, size_t const froxelCountY) noexcept { return ix + (iy * froxelCountX) + (iz * froxelCountX * froxelCountY); } - size_t getFroxelIndex(size_t ix, size_t iy, size_t iz) const noexcept { + size_t getFroxelIndex(size_t const ix, size_t const iy, size_t const iz) const noexcept { return getFroxelIndex(ix, iy, iz, mFroxelCountX, mFroxelCountY); } @@ -217,11 +229,14 @@ class Froxelizer { static void computeFroxelLayout( math::uint2* dim, uint16_t* countX, uint16_t* countY, uint16_t* countZ, - Viewport const& viewport) noexcept; + size_t froxelBufferEntryCount, Viewport const& viewport) noexcept; // internal state dependent on the viewport and needed for froxelizing LinearAllocatorArena mArena; // ~256 KiB + // 4096 froxels fits in a 16KiB buffer, the minimum guaranteed in GLES 3.x and Vulkan 1.1 + size_t mFroxelBufferEntryCount = 4096; + // allocations in the private froxel arena float* mDistancesZ = nullptr; math::float4* mPlanesX = nullptr; @@ -247,7 +262,7 @@ class Froxelizer { float mClipToFroxelX = 0.0f; float mClipToFroxelY = 0.0f; backend::BufferObjectHandle mRecordsBuffer; - backend::Handle mFroxelTexture; + backend::BufferObjectHandle mFroxelsBuffer; // needed for update() Viewport mViewport; diff --git a/filament/src/Frustum.cpp b/filament/src/Frustum.cpp index 30f5b970fef..b11f3799e4a 100644 --- a/filament/src/Frustum.cpp +++ b/filament/src/Frustum.cpp @@ -19,14 +19,20 @@ #include "Culler.h" #include -#include +#include + +#include +#include +#include + +#include using namespace filament::math; namespace filament { Frustum::Frustum(const mat4f& pv) { - Frustum::setProjection(pv); + setProjection(pv); } // NOTE: if we don't specify noinline here, LLVM inlines this huge function into @@ -68,7 +74,7 @@ void Frustum::setProjection(const mat4f& pv) { mPlanes[5] = n; } -float4 Frustum::getNormalizedPlane(Frustum::Plane plane) const noexcept { +float4 Frustum::getNormalizedPlane(Plane plane) const noexcept { return mPlanes[size_t(plane)]; } @@ -89,7 +95,7 @@ bool Frustum::intersects(const float4& sphere) const noexcept { return Culler::intersects(*this, sphere); } -float Frustum::contains(float3 p) const noexcept { +float Frustum::contains(float3 const p) const noexcept { float const l = dot(mPlanes[0].xyz, p) + mPlanes[0].w; float const b = dot(mPlanes[1].xyz, p) + mPlanes[1].w; float const r = dot(mPlanes[2].xyz, p) + mPlanes[2].w; diff --git a/filament/src/HwDescriptorSetLayoutFactory.cpp b/filament/src/HwDescriptorSetLayoutFactory.cpp new file mode 100644 index 00000000000..1e2f6301d70 --- /dev/null +++ b/filament/src/HwDescriptorSetLayoutFactory.cpp @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "HwDescriptorSetLayoutFactory.h" + +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include + +namespace filament { + +using namespace utils; +using namespace backend; + +size_t HwDescriptorSetLayoutFactory::Parameters::hash() const noexcept { + return hash::murmurSlow( + reinterpret_cast(dsl.bindings.data()), + dsl.bindings.size() * sizeof(DescriptorSetLayoutBinding), + 42); +} + +bool operator==(HwDescriptorSetLayoutFactory::Parameters const& lhs, + HwDescriptorSetLayoutFactory::Parameters const& rhs) noexcept { + return (lhs.dsl.bindings.size() == rhs.dsl.bindings.size()) && + std::equal( + lhs.dsl.bindings.begin(), lhs.dsl.bindings.end(), + rhs.dsl.bindings.begin()); +} + +// ------------------------------------------------------------------------------------------------ + +HwDescriptorSetLayoutFactory::HwDescriptorSetLayoutFactory() + : mArena("HwDescriptorSetLayoutFactory::mArena", SET_ARENA_SIZE), + mBimap(mArena) { + mBimap.reserve(256); +} + +HwDescriptorSetLayoutFactory::~HwDescriptorSetLayoutFactory() noexcept = default; + +void HwDescriptorSetLayoutFactory::terminate(DriverApi&) noexcept { + assert_invariant(mBimap.empty()); +} + +auto HwDescriptorSetLayoutFactory::create(DriverApi& driver, + DescriptorSetLayout dsl) noexcept -> Handle { + + std::sort(dsl.bindings.begin(), dsl.bindings.end(), + [](auto&& lhs, auto&& rhs) { + return lhs.binding < rhs.binding; + }); + + // see if we already have seen this RenderPrimitive + Key const key({ dsl }); + auto pos = mBimap.find(key); + + // the common case is that we've never seen it (i.e.: no reuse) + if (UTILS_LIKELY(pos == mBimap.end())) { + auto handle = driver.createDescriptorSetLayout(std::move(dsl)); + mBimap.insert(key, { handle }); + return handle; + } + + ++(pos->first.pKey->refs); + + return pos->second.handle; +} + +void HwDescriptorSetLayoutFactory::destroy(DriverApi& driver, Handle handle) noexcept { + // look for this handle in our map + auto pos = mBimap.find(Value{ handle }); + if (--pos->second.pKey->refs == 0) { + mBimap.erase(pos); + driver.destroyDescriptorSetLayout(handle); + } +} + +} // namespace filament diff --git a/filament/src/HwDescriptorSetLayoutFactory.h b/filament/src/HwDescriptorSetLayoutFactory.h new file mode 100644 index 00000000000..155f55a1c68 --- /dev/null +++ b/filament/src/HwDescriptorSetLayoutFactory.h @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_HWDESCRIPTORSETLAYOUTFACTORY_H +#define TNT_FILAMENT_HWDESCRIPTORSETLAYOUTFACTORY_H + +#include "Bimap.h" + +#include +#include +#include + +#include + +#include + +#include +#include + +namespace filament { + +class FEngine; + +class HwDescriptorSetLayoutFactory { +public: + using Handle = backend::DescriptorSetLayoutHandle; + + HwDescriptorSetLayoutFactory(); + ~HwDescriptorSetLayoutFactory() noexcept; + + HwDescriptorSetLayoutFactory(HwDescriptorSetLayoutFactory const& rhs) = delete; + HwDescriptorSetLayoutFactory(HwDescriptorSetLayoutFactory&& rhs) noexcept = delete; + HwDescriptorSetLayoutFactory& operator=(HwDescriptorSetLayoutFactory const& rhs) = delete; + HwDescriptorSetLayoutFactory& operator=(HwDescriptorSetLayoutFactory&& rhs) noexcept = delete; + + void terminate(backend::DriverApi& driver) noexcept; + + struct Parameters { // 16 bytes + heap allocations + backend::DescriptorSetLayout dsl; + size_t hash() const noexcept; + }; + + friend bool operator==(Parameters const& lhs, Parameters const& rhs) noexcept; + + Handle create(backend::DriverApi& driver, backend::DescriptorSetLayout dsl) noexcept; + + void destroy(backend::DriverApi& driver, Handle handle) noexcept; + +private: + struct Key { // 24 bytes + // The key should not be copyable, unfortunately due to how the Bimap works we have + // to copy-construct it once. + Key(Key const&) = default; + Key& operator=(Key const&) = delete; + Key& operator=(Key&&) noexcept = delete; + explicit Key(Parameters const& params) : params(params), refs(1) { } + Parameters params; + mutable uint32_t refs; // 4 bytes + bool operator==(Key const& rhs) const noexcept { + return params == rhs.params; + } + }; + + struct KeyHasher { + size_t operator()(Key const& p) const noexcept { + return p.params.hash(); + } + }; + + struct Value { // 4 bytes + Handle handle; + }; + + struct ValueHasher { + size_t operator()(Value const v) const noexcept { + return std::hash()(v.handle.getId()); + } + }; + + friend bool operator==(Value const lhs, Value const rhs) noexcept { + return lhs.handle == rhs.handle; + } + + // Size of the arena used for the "set" part of the bimap + // about ~1K entries before fall back to heap + static constexpr size_t SET_ARENA_SIZE = 24 * 1024; + + // Arena for the set<>, using a pool allocator inside a heap area. + using PoolAllocatorArena = utils::Arena< + utils::PoolAllocatorWithFallback, + utils::LockingPolicy::NoLock, + utils::TrackingPolicy::Untracked, + utils::AreaPolicy::HeapArea>; + + + // Arena where the set memory is allocated + PoolAllocatorArena mArena; + + // The special Bimap + Bimap> mBimap; +}; + +} // namespace filament + +#endif // TNT_FILAMENT_HWDESCRIPTORSETLAYOUTFACTORY_H diff --git a/filament/src/HwRenderPrimitiveFactory.cpp b/filament/src/HwRenderPrimitiveFactory.cpp index 2e996e25951..ae959b5db42 100644 --- a/filament/src/HwRenderPrimitiveFactory.cpp +++ b/filament/src/HwRenderPrimitiveFactory.cpp @@ -16,6 +16,16 @@ #include "HwRenderPrimitiveFactory.h" +#include +#include +#include + +#include + +#include +#include +#include + #include namespace filament { @@ -23,96 +33,59 @@ namespace filament { using namespace utils; using namespace backend; -bool operator<(HwRenderPrimitiveFactory::Key const& lhs, - HwRenderPrimitiveFactory::Key const& rhs) noexcept { - if (lhs.vbh == rhs.vbh) { - if (lhs.ibh == rhs.ibh) { - if (lhs.offset == rhs.offset) { - if (lhs.count == rhs.count) { - return lhs.type < rhs.type; - } else { - return lhs.count < rhs.count; - } - } else { - return lhs.offset < rhs.offset; - } - } else { - return lhs.ibh < rhs.ibh; - } - } else { - return lhs.vbh < rhs.vbh; - } -} - -inline bool operator<(HwRenderPrimitiveFactory::Entry const& lhs, - HwRenderPrimitiveFactory::Entry const& rhs) noexcept { - return lhs.key < rhs.key; +size_t HwRenderPrimitiveFactory::Parameters::hash() const noexcept { + return hash::combine(vbh.getId(), + hash::combine(ibh.getId(), + (size_t)type)); } -inline bool operator<(HwRenderPrimitiveFactory::Key const& lhs, - HwRenderPrimitiveFactory::Entry const& rhs) noexcept { - return lhs < rhs.key; -} - -inline bool operator<(HwRenderPrimitiveFactory::Entry const& lhs, - HwRenderPrimitiveFactory::Key const& rhs) noexcept { - return lhs.key < rhs; +bool operator==(HwRenderPrimitiveFactory::Parameters const& lhs, + HwRenderPrimitiveFactory::Parameters const& rhs) noexcept { + return lhs.vbh == rhs.vbh && + lhs.ibh == rhs.ibh && + lhs.type == rhs.type; } // ------------------------------------------------------------------------------------------------ HwRenderPrimitiveFactory::HwRenderPrimitiveFactory() : mArena("HwRenderPrimitiveFactory::mArena", SET_ARENA_SIZE), - mSet(mArena) { - mMap.reserve(256); + mBimap(mArena) { + mBimap.reserve(256); } HwRenderPrimitiveFactory::~HwRenderPrimitiveFactory() noexcept = default; -void HwRenderPrimitiveFactory::terminate(DriverApi& driver) noexcept { - assert_invariant(mMap.empty()); - assert_invariant(mSet.empty()); +void HwRenderPrimitiveFactory::terminate(DriverApi&) noexcept { + assert_invariant(mBimap.empty()); } -RenderPrimitiveHandle HwRenderPrimitiveFactory::create(DriverApi& driver, - VertexBufferHandle vbh, IndexBufferHandle ibh, - PrimitiveType type, uint32_t offset, uint32_t minIndex, uint32_t maxIndex, - uint32_t count) noexcept { - - const Key key = { vbh, ibh, offset, count, type }; +auto HwRenderPrimitiveFactory::create(DriverApi& driver, + VertexBufferHandle vbh, + IndexBufferHandle ibh, + PrimitiveType const type) noexcept -> Handle { // see if we already have seen this RenderPrimitive - auto pos = mSet.find(key); + Key const key({ vbh, ibh, type }); + auto pos = mBimap.find(key); // the common case is that we've never seen it (i.e.: no reuse) - if (UTILS_LIKELY(pos == mSet.end())) { - // create the backend object - auto handle = driver.createRenderPrimitive(vbh, ibh, - type, offset, minIndex, maxIndex, count); - // insert key/handle in our set with a refcount of 1 - // IMPORTANT: std::set<> doesn't invalidate iterators in insert/erase - auto [ipos, _] = mSet.insert({ key, handle, 1 }); - // map the handle back to the key/payload - mMap.insert({ handle.getId(), ipos }); + if (UTILS_LIKELY(pos == mBimap.end())) { + auto handle = driver.createRenderPrimitive(vbh, ibh, type); + mBimap.insert(key, { handle }); return handle; } - pos->refs++; - return pos->handle; + + ++(pos->first.pKey->refs); + return pos->second.handle; } -void HwRenderPrimitiveFactory::destroy(DriverApi& driver, RenderPrimitiveHandle rph) noexcept { +void HwRenderPrimitiveFactory::destroy(DriverApi& driver, Handle handle) noexcept { // look for this handle in our map - auto pos = mMap.find(rph.getId()); - - // it must be there - assert_invariant(pos != mMap.end()); - - // check the refcount and destroy if needed - auto ipos = pos->second; - if (--ipos->refs == 0) { - mSet.erase(ipos); - mMap.erase(pos); - driver.destroyRenderPrimitive(rph); + auto pos = mBimap.find(Value{ handle }); + if (--pos->second.pKey->refs == 0) { + mBimap.erase(pos); + driver.destroyRenderPrimitive(handle); } } diff --git a/filament/src/HwRenderPrimitiveFactory.h b/filament/src/HwRenderPrimitiveFactory.h index 30583ed1715..021e0d0ec91 100644 --- a/filament/src/HwRenderPrimitiveFactory.h +++ b/filament/src/HwRenderPrimitiveFactory.h @@ -17,17 +17,17 @@ #ifndef TNT_FILAMENT_HWRENDERPRIMITIVEFACTORY_H #define TNT_FILAMENT_HWRENDERPRIMITIVEFACTORY_H +#include "Bimap.h" + +#include #include #include -#include - #include -#include - -#include +#include +#include #include namespace filament { @@ -36,6 +36,7 @@ class FEngine; class HwRenderPrimitiveFactory { public: + using Handle = backend::RenderPrimitiveHandle; HwRenderPrimitiveFactory(); ~HwRenderPrimitiveFactory() noexcept; @@ -47,70 +48,75 @@ class HwRenderPrimitiveFactory { void terminate(backend::DriverApi& driver) noexcept; - backend::RenderPrimitiveHandle create(backend::DriverApi& driver, + struct Parameters { // 12 bytes + backend::VertexBufferHandle vbh; // 4 + backend::IndexBufferHandle ibh; // 4 + backend::PrimitiveType type; // 4 + size_t hash() const noexcept; + }; + + friend bool operator==(Parameters const& lhs, Parameters const& rhs) noexcept; + + Handle create(backend::DriverApi& driver, backend::VertexBufferHandle vbh, backend::IndexBufferHandle ibh, - backend::PrimitiveType type, - uint32_t offset, - uint32_t minIndex, - uint32_t maxIndex, - uint32_t count) noexcept; + backend::PrimitiveType type) noexcept; - void destroy(backend::DriverApi& driver, - backend::RenderPrimitiveHandle rph) noexcept; + void destroy(backend::DriverApi& driver, Handle handle) noexcept; private: - struct Key { // 20 bytes - backend::VertexBufferHandle vbh; // 4 - backend::IndexBufferHandle ibh; // 4 - uint32_t offset; // 4 - uint32_t count; // 4 - backend::PrimitiveType type; // 4 + struct Key { // 16 bytes + // The key should not be copyable, unfortunately due to how the Bimap works we have + // to copy-construct it once. + Key(Key const&) = default; + Key& operator=(Key const&) = delete; + Key& operator=(Key&&) noexcept = delete; + explicit Key(Parameters const& params) : params(params), refs(1) { } + Parameters params; + mutable uint32_t refs; // 4 bytes + bool operator==(Key const& rhs) const noexcept { + return params == rhs.params; + } }; - struct Entry { // 28 bytes - Key key; // 20 - backend::RenderPrimitiveHandle handle; // 4 - mutable uint32_t refs; // 4 + struct KeyHasher { + size_t operator()(Key const& p) const noexcept { + return p.params.hash(); + } }; + struct Value { // 4 bytes + Handle handle; + }; + + struct ValueHasher { + size_t operator()(Value const v) const noexcept { + return std::hash()(v.handle.getId()); + } + }; + + friend bool operator==(Value const lhs, Value const rhs) noexcept { + return lhs.handle == rhs.handle; + } // Size of the arena used for the "set" part of the bimap - static constexpr size_t SET_ARENA_SIZE = 4 * 1024 * 1024; + // about ~65K entry before fall back to heap + static constexpr size_t SET_ARENA_SIZE = 1 * 1024 * 1024; // Arena for the set<>, using a pool allocator inside a heap area. - using Arena = utils::Arena< - utils::PoolAllocator<64>, // this seems to work with clang and msvc + using PoolAllocatorArena = utils::Arena< + utils::PoolAllocatorWithFallback, utils::LockingPolicy::NoLock, -#ifndef NDEBUG - utils::TrackingPolicy::HighWatermark, -#else utils::TrackingPolicy::Untracked, -#endif utils::AreaPolicy::HeapArea>; - using Set = std::set< - Entry, - std::less<>, - utils::STLAllocator>; - - using Map = tsl::robin_map< - backend::RenderPrimitiveHandle::HandleId, - Set::const_iterator>; // Arena where the set memory is allocated - Arena mArena; - - // set of HwRenderPrimitive data - Set mSet; - - // map of RenderPrimitiveHandle to Set Entry - Map mMap; + PoolAllocatorArena mArena; - friend bool operator<(Key const& lhs, Key const& rhs) noexcept; - friend bool operator<(Key const& lhs, Entry const& rhs) noexcept; - friend bool operator<(Entry const& lhs, Key const& rhs) noexcept; - friend bool operator<(Entry const& lhs, Entry const& rhs) noexcept; + // The special Bimap + Bimap> mBimap; }; } // namespace filament diff --git a/filament/src/HwVertexBufferInfoFactory.cpp b/filament/src/HwVertexBufferInfoFactory.cpp new file mode 100644 index 00000000000..c5e4f7fc41a --- /dev/null +++ b/filament/src/HwVertexBufferInfoFactory.cpp @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "HwVertexBufferInfoFactory.h" + +#include +#include +#include + +#include + +#include +#include +#include + +#include +#include +#include + +namespace filament { + +using namespace utils; +using namespace backend; + +size_t HwVertexBufferInfoFactory::Parameters::hash() const noexcept { + static_assert((sizeof(*this) % sizeof(uint32_t)) == 0); + return hash::murmur3( + reinterpret_cast(this), sizeof(Parameters) / sizeof(uint32_t), 0); +} + +bool operator==(HwVertexBufferInfoFactory::Parameters const& lhs, + HwVertexBufferInfoFactory::Parameters const& rhs) noexcept { + return !memcmp(&lhs, &rhs, sizeof(HwVertexBufferInfoFactory::Parameters)); +} + +// ------------------------------------------------------------------------------------------------ + +HwVertexBufferInfoFactory::HwVertexBufferInfoFactory() + : mArena("HwVertexBufferInfoFactory::mArena", SET_ARENA_SIZE), + mBimap(mArena) { + mBimap.reserve(256); +} + +HwVertexBufferInfoFactory::~HwVertexBufferInfoFactory() noexcept = default; + +void HwVertexBufferInfoFactory::terminate(DriverApi&) noexcept { + assert_invariant(mBimap.empty()); +} + +auto HwVertexBufferInfoFactory::create(DriverApi& driver, + uint8_t const bufferCount, + uint8_t const attributeCount, + AttributeArray attributes) noexcept -> Handle { + + Key const key({ bufferCount, attributeCount, {}, attributes }); + auto pos = mBimap.find(key); + + // the common case is that we've never seen it (i.e.: no reuse) + if (UTILS_LIKELY(pos == mBimap.end())) { + auto handle = driver.createVertexBufferInfo( + bufferCount, attributeCount, + attributes); + mBimap.insert(key, { handle }); + return handle; + } + + ++(pos->first.pKey->refs); + return pos->second.handle; +} + +void HwVertexBufferInfoFactory::destroy(DriverApi& driver, Handle handle) noexcept { + // look for this handle in our map + auto pos = mBimap.find(Value{ handle }); + if (--(pos->second.pKey->refs) == 0) { + mBimap.erase(pos); + driver.destroyVertexBufferInfo(handle); + } +} + +} // namespace filament diff --git a/filament/src/HwVertexBufferInfoFactory.h b/filament/src/HwVertexBufferInfoFactory.h new file mode 100644 index 00000000000..75a89b9e09c --- /dev/null +++ b/filament/src/HwVertexBufferInfoFactory.h @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_HWVERTEXBUFFERINFOFACTORY_H +#define TNT_FILAMENT_HWVERTEXBUFFERINFOFACTORY_H + +#include "Bimap.h" + +#include +#include +#include + +#include + +#include + +#include +#include + +namespace filament { + +class FEngine; + +class HwVertexBufferInfoFactory { +public: + using Handle = backend::VertexBufferInfoHandle; + + HwVertexBufferInfoFactory(); + ~HwVertexBufferInfoFactory() noexcept; + + HwVertexBufferInfoFactory(HwVertexBufferInfoFactory const& rhs) = delete; + HwVertexBufferInfoFactory(HwVertexBufferInfoFactory&& rhs) noexcept = delete; + HwVertexBufferInfoFactory& operator=(HwVertexBufferInfoFactory const& rhs) = delete; + HwVertexBufferInfoFactory& operator=(HwVertexBufferInfoFactory&& rhs) noexcept = delete; + + void terminate(backend::DriverApi& driver) noexcept; + + struct Parameters { // 132 bytes + uint8_t bufferCount; + uint8_t attributeCount; + uint8_t padding[2] = {}; + backend::AttributeArray attributes; + size_t hash() const noexcept; + }; + + friend bool operator==(Parameters const& lhs, Parameters const& rhs) noexcept; + + Handle create(backend::DriverApi& driver, + uint8_t bufferCount, + uint8_t attributeCount, + backend::AttributeArray attributes) noexcept; + + void destroy(backend::DriverApi& driver, Handle handle) noexcept; + +private: + struct Key { // 136 bytes + // The key should not be copyable, unfortunately due to how the Bimap works we have + // to copy-construct it once. + Key(Key const&) = default; + Key& operator=(Key const&) = delete; + Key& operator=(Key&&) noexcept = delete; + explicit Key(Parameters const& params) : params(params), refs(1) { } + Parameters params; + mutable uint32_t refs; // 4 bytes + bool operator==(Key const& rhs) const noexcept { + return params == rhs.params; + } + }; + + struct KeyHasher { + size_t operator()(Key const& p) const noexcept { + return p.params.hash(); + } + }; + + struct Value { + Handle handle; + }; + + struct ValueHasher { + size_t operator()(Value const v) const noexcept { + return std::hash()(v.handle.getId()); + } + }; + + friend bool operator==(Value const lhs, Value const rhs) noexcept { + return lhs.handle == rhs.handle; + } + + // Size of the arena used for the "set" part of the bimap + // about ~15K entry before fall back to heap + static constexpr size_t SET_ARENA_SIZE = 2 * 1024 * 1024; + + // Arena for the set<>, using a pool allocator inside a heap area. + using PoolAllocatorArena = utils::Arena< + utils::PoolAllocatorWithFallback, + utils::LockingPolicy::NoLock, + utils::TrackingPolicy::Untracked, + utils::AreaPolicy::HeapArea>; + + + // Arena where the set memory is allocated + PoolAllocatorArena mArena; + + // The special Bimap + Bimap> mBimap; +}; + +} // namespace filament + +#endif // TNT_FILAMENT_HWVERTEXBUFFERINFOFACTORY_H diff --git a/filament/src/IndexBuffer.cpp b/filament/src/IndexBuffer.cpp index 129f7b3356e..402983b4952 100644 --- a/filament/src/IndexBuffer.cpp +++ b/filament/src/IndexBuffer.cpp @@ -21,7 +21,7 @@ namespace filament { void IndexBuffer::setBuffer(Engine& engine, - IndexBuffer::BufferDescriptor&& buffer, uint32_t byteOffset) { + BufferDescriptor&& buffer, uint32_t const byteOffset) { downcast(this)->setBuffer(downcast(engine), std::move(buffer), byteOffset); } diff --git a/filament/src/IndirectLight.cpp b/filament/src/IndirectLight.cpp index 4683c9117c9..6e852203557 100644 --- a/filament/src/IndirectLight.cpp +++ b/filament/src/IndirectLight.cpp @@ -22,7 +22,7 @@ namespace filament { using namespace math; -void IndirectLight::setIntensity(float intensity) noexcept { +void IndirectLight::setIntensity(float const intensity) noexcept { downcast(this)->setIntensity(intensity); } @@ -50,7 +50,7 @@ float3 IndirectLight::getDirectionEstimate() const noexcept { return downcast(this)->getDirectionEstimate(); } -float4 IndirectLight::getColorEstimate(float3 direction) const noexcept { +float4 IndirectLight::getColorEstimate(float3 const direction) const noexcept { return downcast(this)->getColorEstimate(direction); } @@ -58,7 +58,7 @@ float3 IndirectLight::getDirectionEstimate(const float3* sh) noexcept { return FIndirectLight::getDirectionEstimate(sh); } -float4 IndirectLight::getColorEstimate(const float3* sh, float3 direction) noexcept { +float4 IndirectLight::getColorEstimate(const float3* sh, float3 const direction) noexcept { return FIndirectLight::getColorEstimate(sh, direction); } diff --git a/filament/src/InstanceBuffer.cpp b/filament/src/InstanceBuffer.cpp new file mode 100644 index 00000000000..93d151e911d --- /dev/null +++ b/filament/src/InstanceBuffer.cpp @@ -0,0 +1,30 @@ +/* +* Copyright (C) 2023 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include "details/InstanceBuffer.h" + +namespace filament { + +size_t InstanceBuffer::getInstanceCount() const noexcept { + return downcast(this)->getInstanceCount(); +} + +void InstanceBuffer::setLocalTransforms( + math::mat4f const* localTransforms, size_t const count, size_t const offset) { + downcast(this)->setLocalTransforms(localTransforms, count, offset); +} + +} // namespace filament diff --git a/filament/src/Intersections.h b/filament/src/Intersections.h index 32417bf679c..908471fb065 100644 --- a/filament/src/Intersections.h +++ b/filament/src/Intersections.h @@ -40,7 +40,7 @@ inline constexpr math::float4 spherePlaneIntersection(math::float4 s, math::floa // sphere radius must be squared // plane equation must be normalized and have the form {0,0,1,w}, sphere radius must be squared // return float4.w <= 0 if no intersection -inline constexpr math::float4 spherePlaneIntersection(math::float4 s, float pw) noexcept { +inline constexpr math::float4 spherePlaneIntersection(math::float4 const s, float pw) noexcept { return spherePlaneIntersection(s, { 0.f, 0.f, 1.f, pw }); } @@ -65,8 +65,8 @@ inline constexpr bool sphereConeIntersection( math::float4 const& sphere, math::float3 const& conePosition, math::float3 const& coneAxis, - float coneSinInverse, - float coneCosSquared) noexcept { + float const coneSinInverse, + float const coneCosSquared) noexcept { if (sphereConeIntersectionFast(sphere, conePosition, coneAxis, coneSinInverse, coneCosSquared)) { math::float3 const d = sphere.xyz - conePosition; diff --git a/filament/src/LightManager.cpp b/filament/src/LightManager.cpp index be0252c1230..5644f24bc67 100644 --- a/filament/src/LightManager.cpp +++ b/filament/src/LightManager.cpp @@ -22,132 +22,140 @@ namespace filament { using namespace math; +bool LightManager::hasComponent(Entity const e) const noexcept { + return downcast(this)->hasComponent(e); +} + size_t LightManager::getComponentCount() const noexcept { return downcast(this)->getComponentCount(); } -utils::Entity const* LightManager::getEntities() const noexcept { - return downcast(this)->getEntities(); +bool LightManager::empty() const noexcept { + return downcast(this)->empty(); } -bool LightManager::hasComponent(Entity e) const noexcept { - return downcast(this)->hasComponent(e); +Entity LightManager::getEntity(Instance const i) const noexcept { + return downcast(this)->getEntity(i); +} + +Entity const* LightManager::getEntities() const noexcept { + return downcast(this)->getEntities(); } -LightManager::Instance LightManager::getInstance(Entity e) const noexcept { +LightManager::Instance LightManager::getInstance(Entity const e) const noexcept { return downcast(this)->getInstance(e); } -void LightManager::destroy(Entity e) noexcept { +void LightManager::destroy(Entity const e) noexcept { return downcast(this)->destroy(e); } -void LightManager::setLightChannel(Instance i, unsigned int channel, bool enable) noexcept { +void LightManager::setLightChannel(Instance const i, unsigned int const channel, bool const enable) noexcept { downcast(this)->setLightChannel(i, channel, enable); } -bool LightManager::getLightChannel(LightManager::Instance i, unsigned int channel) const noexcept { +bool LightManager::getLightChannel(Instance const i, unsigned int const channel) const noexcept { return downcast(this)->getLightChannel(i, channel); } -void LightManager::setPosition(Instance i, const float3& position) noexcept { +void LightManager::setPosition(Instance const i, const float3& position) noexcept { downcast(this)->setLocalPosition(i, position); } -const float3& LightManager::getPosition(Instance i) const noexcept { +const float3& LightManager::getPosition(Instance const i) const noexcept { return downcast(this)->getLocalPosition(i); } -void LightManager::setDirection(Instance i, const float3& direction) noexcept { +void LightManager::setDirection(Instance const i, const float3& direction) noexcept { downcast(this)->setLocalDirection(i, direction); } -const float3& LightManager::getDirection(Instance i) const noexcept { +const float3& LightManager::getDirection(Instance const i) const noexcept { return downcast(this)->getLocalDirection(i); } -void LightManager::setColor(Instance i, const LinearColor& color) noexcept { +void LightManager::setColor(Instance const i, const LinearColor& color) noexcept { downcast(this)->setColor(i, color); } -const float3& LightManager::getColor(Instance i) const noexcept { +const float3& LightManager::getColor(Instance const i) const noexcept { return downcast(this)->getColor(i); } -void LightManager::setIntensity(Instance i, float intensity) noexcept { +void LightManager::setIntensity(Instance const i, float const intensity) noexcept { downcast(this)->setIntensity(i, intensity, FLightManager::IntensityUnit::LUMEN_LUX); } -void LightManager::setIntensityCandela(Instance i, float intensity) noexcept { +void LightManager::setIntensityCandela(Instance const i, float const intensity) noexcept { downcast(this)->setIntensity(i, intensity, FLightManager::IntensityUnit::CANDELA); } -float LightManager::getIntensity(Instance i) const noexcept { +float LightManager::getIntensity(Instance const i) const noexcept { return downcast(this)->getIntensity(i); } -void LightManager::setFalloff(Instance i, float radius) noexcept { +void LightManager::setFalloff(Instance const i, float const radius) noexcept { downcast(this)->setFalloff(i, radius); } -float LightManager::getFalloff(Instance i) const noexcept { +float LightManager::getFalloff(Instance const i) const noexcept { return downcast(this)->getFalloff(i); } -void LightManager::setSpotLightCone(Instance i, float inner, float outer) noexcept { +void LightManager::setSpotLightCone(Instance const i, float const inner, float const outer) noexcept { downcast(this)->setSpotLightCone(i, inner, outer); } -float LightManager::getSpotLightOuterCone(Instance i) const noexcept { +float LightManager::getSpotLightOuterCone(Instance const i) const noexcept { return downcast(this)->getSpotParams(i).outerClamped; } -float LightManager::getSpotLightInnerCone(Instance i) const noexcept { +float LightManager::getSpotLightInnerCone(Instance const i) const noexcept { return downcast(this)->getSpotLightInnerCone(i); } -void LightManager::setSunAngularRadius(Instance i, float angularRadius) noexcept { +void LightManager::setSunAngularRadius(Instance const i, float const angularRadius) noexcept { downcast(this)->setSunAngularRadius(i, angularRadius); } -float LightManager::getSunAngularRadius(Instance i) const noexcept { +float LightManager::getSunAngularRadius(Instance const i) const noexcept { float radius = downcast(this)->getSunAngularRadius(i); return radius * f::RAD_TO_DEG; } -void LightManager::setSunHaloSize(Instance i, float haloSize) noexcept { +void LightManager::setSunHaloSize(Instance const i, float const haloSize) noexcept { downcast(this)->setSunHaloSize(i, haloSize); } -float LightManager::getSunHaloSize(Instance i) const noexcept { +float LightManager::getSunHaloSize(Instance const i) const noexcept { return downcast(this)->getSunHaloSize(i); } -void LightManager::setSunHaloFalloff(Instance i, float haloFalloff) noexcept { +void LightManager::setSunHaloFalloff(Instance const i, float const haloFalloff) noexcept { downcast(this)->setSunHaloFalloff(i, haloFalloff); } -float LightManager::getSunHaloFalloff(Instance i) const noexcept { +float LightManager::getSunHaloFalloff(Instance const i) const noexcept { return downcast(this)->getSunHaloFalloff(i); } -LightManager::Type LightManager::getType(LightManager::Instance i) const noexcept { +LightManager::Type LightManager::getType(Instance const i) const noexcept { return downcast(this)->getType(i); } -const LightManager::ShadowOptions& LightManager::getShadowOptions(Instance i) const noexcept { +const LightManager::ShadowOptions& LightManager::getShadowOptions(Instance const i) const noexcept { return downcast(this)->getShadowOptions(i); } -void LightManager::setShadowOptions(Instance i, ShadowOptions const& options) noexcept { +void LightManager::setShadowOptions(Instance const i, ShadowOptions const& options) noexcept { downcast(this)->setShadowOptions(i, options); } -bool LightManager::isShadowCaster(Instance i) const noexcept { +bool LightManager::isShadowCaster(Instance const i) const noexcept { return downcast(this)->isShadowCaster(i); } -void LightManager::setShadowCaster(Instance i, bool castShadows) noexcept { +void LightManager::setShadowCaster(Instance const i, bool const castShadows) noexcept { downcast(this)->setShadowCaster(i, castShadows); } diff --git a/filament/src/Material.cpp b/filament/src/Material.cpp index bb2bc69a38f..1663de2794f 100644 --- a/filament/src/Material.cpp +++ b/filament/src/Material.cpp @@ -16,8 +16,22 @@ #include "details/Material.h" +#include +#include + +#include +#include + +#include + +#include + +#include + namespace filament { +class MaterialInstance; + using namespace backend; MaterialInstance* Material::createInstance(const char* name) const noexcept { @@ -25,7 +39,7 @@ MaterialInstance* Material::createInstance(const char* name) const noexcept { } const char* Material::getName() const noexcept { - return downcast(this)->getName().c_str(); + return downcast(this)->getName().c_str_safe(); } Shading Material::getShading() const noexcept { @@ -72,6 +86,10 @@ bool Material::isDoubleSided() const noexcept { return downcast(this)->isDoubleSided(); } +bool Material::isAlphaToCoverageEnabled() const noexcept { + return downcast(this)->isAlphaToCoverageEnabled(); +} + float Material::getMaskThreshold() const noexcept { return downcast(this)->getMaskThreshold(); } @@ -96,7 +114,7 @@ size_t Material::getParameterCount() const noexcept { return downcast(this)->getParameterCount(); } -size_t Material::getParameters(ParameterInfo* parameters, size_t count) const noexcept { +size_t Material::getParameters(ParameterInfo* parameters, size_t const count) const noexcept { return downcast(this)->getParameters(parameters, count); } @@ -116,6 +134,10 @@ ReflectionMode Material::getReflectionMode() const noexcept { return downcast(this)->getReflectionMode(); } +FeatureLevel Material::getFeatureLevel() const noexcept { + return downcast(this)->getFeatureLevel(); +} + bool Material::hasParameter(const char* name) const noexcept { return downcast(this)->hasParameter(name); } @@ -132,4 +154,14 @@ MaterialInstance const* Material::getDefaultInstance() const noexcept { return downcast(this)->getDefaultInstance(); } +void Material::compile(CompilerPriorityQueue const priority, UserVariantFilterMask const variants, + CallbackHandler* handler, utils::Invocable&& callback) noexcept { + downcast(this)->compile(priority, variants, handler, std::move(callback)); +} + +UserVariantFilterMask Material::getSupportedVariants() const noexcept { + return downcast(this)->getSupportedVariants(); +} + + } // namespace filament diff --git a/filament/src/MaterialInstance.cpp b/filament/src/MaterialInstance.cpp index ec3e3ea931c..e141a62aeb2 100644 --- a/filament/src/MaterialInstance.cpp +++ b/filament/src/MaterialInstance.cpp @@ -29,7 +29,7 @@ using namespace backend; // vec4. This must not be inlined (this is the whole point). template UTILS_NOINLINE -void FMaterialInstance::setParameterUntypedImpl(std::string_view name, const void* value) { +void FMaterialInstance::setParameterUntypedImpl(std::string_view const name, const void* value) { ssize_t offset = mMaterial->getUniformInterfaceBlock().getFieldOffset(name, 0); if (UTILS_LIKELY(offset >= 0)) { mUniforms.setUniformUntyped(size_t(offset), value); // handles specialization for mat3f @@ -41,14 +41,14 @@ void FMaterialInstance::setParameterUntypedImpl(std::string_view name, const voi // this converts typed calls into the untyped-sized call. template UTILS_ALWAYS_INLINE -inline void FMaterialInstance::setParameterImpl(std::string_view name, T const& value) { - static_assert(!std::is_same_v); +inline void FMaterialInstance::setParameterImpl(std::string_view const name, T const& value) { + static_assert(!std::is_same_v); setParameterUntypedImpl(name, &value); } // specialization for mat3f template<> -inline void FMaterialInstance::setParameterImpl(std::string_view name, mat3f const& value) { +inline void FMaterialInstance::setParameterImpl(std::string_view const name, mat3f const& value) { ssize_t offset = mMaterial->getUniformInterfaceBlock().getFieldOffset(name, 0); if (UTILS_LIKELY(offset >= 0)) { mUniforms.setUniform(size_t(offset), value); @@ -59,8 +59,8 @@ inline void FMaterialInstance::setParameterImpl(std::string_view name, mat3f con template UTILS_NOINLINE -void FMaterialInstance::setParameterUntypedImpl(std::string_view name, - const void* value, size_t count) { +void FMaterialInstance::setParameterUntypedImpl(std::string_view const name, + const void* value, size_t const count) { ssize_t offset = mMaterial->getUniformInterfaceBlock().getFieldOffset(name, 0); if (UTILS_LIKELY(offset >= 0)) { mUniforms.setUniformArrayUntyped(size_t(offset), value, count); @@ -69,9 +69,9 @@ void FMaterialInstance::setParameterUntypedImpl(std::string_view name, template UTILS_ALWAYS_INLINE -inline void FMaterialInstance::setParameterImpl(std::string_view name, - const T* value, size_t count) { - static_assert(!std::is_same_v); +inline void FMaterialInstance::setParameterImpl(std::string_view const name, + const T* value, size_t const count) { + static_assert(!std::is_same_v); setParameterUntypedImpl(name, value, count); } @@ -83,27 +83,27 @@ void MaterialInstance::setParameter(const char* name, size_t nameLength, T const } template<> -UTILS_PUBLIC void MaterialInstance::setParameter(const char* name, size_t nameLength, bool const& v) { +UTILS_PUBLIC void MaterialInstance::setParameter(const char* name, size_t const nameLength, bool const& v) { // this kills tail-call optimization - MaterialInstance::setParameter(name, nameLength, (uint32_t)v); + setParameter(name, nameLength, (uint32_t)v); } template<> -UTILS_PUBLIC void MaterialInstance::setParameter(const char* name, size_t nameLength, bool2 const& v) { +UTILS_PUBLIC void MaterialInstance::setParameter(const char* name, size_t const nameLength, bool2 const& v) { // this kills tail-call optimization - MaterialInstance::setParameter(name, nameLength, uint2(v)); + setParameter(name, nameLength, uint2(v)); } template<> -UTILS_PUBLIC void MaterialInstance::setParameter(const char* name, size_t nameLength, bool3 const& v) { +UTILS_PUBLIC void MaterialInstance::setParameter(const char* name, size_t const nameLength, bool3 const& v) { // this kills tail-call optimization - MaterialInstance::setParameter(name, nameLength, uint3(v)); + setParameter(name, nameLength, uint3(v)); } template<> -UTILS_PUBLIC void MaterialInstance::setParameter(const char* name, size_t nameLength, bool4 const& v) { +UTILS_PUBLIC void MaterialInstance::setParameter(const char* name, size_t const nameLength, bool4 const& v) { // this kills tail-call optimization - MaterialInstance::setParameter(name, nameLength, uint4(v)); + setParameter(name, nameLength, uint4(v)); } // explicit template instantiation of our supported types @@ -130,41 +130,41 @@ void MaterialInstance::setParameter(const char* name, size_t nameLength, const T } template<> -UTILS_PUBLIC void MaterialInstance::setParameter(const char* name, size_t nameLength, const bool* v, size_t c) { +UTILS_PUBLIC void MaterialInstance::setParameter(const char* name, size_t const nameLength, const bool* v, size_t const c) { auto* p = new uint32_t[c]; std::copy_n(v, c, p); - MaterialInstance::setParameter(name, nameLength, p, c); + setParameter(name, nameLength, p, c); delete [] p; } template<> -UTILS_PUBLIC void MaterialInstance::setParameter(const char* name, size_t nameLength, const bool2* v, size_t c) { +UTILS_PUBLIC void MaterialInstance::setParameter(const char* name, size_t const nameLength, const bool2* v, size_t const c) { auto* p = new uint2[c]; std::copy_n(v, c, p); - MaterialInstance::setParameter(name, nameLength, p, c); + setParameter(name, nameLength, p, c); delete [] p; } template<> -UTILS_PUBLIC void MaterialInstance::setParameter(const char* name, size_t nameLength, const bool3* v, size_t c) { +UTILS_PUBLIC void MaterialInstance::setParameter(const char* name, size_t const nameLength, const bool3* v, size_t const c) { auto* p = new uint3[c]; std::copy_n(v, c, p); - MaterialInstance::setParameter(name, nameLength, p, c); + setParameter(name, nameLength, p, c); delete [] p; } template<> -UTILS_PUBLIC void MaterialInstance::setParameter(const char* name, size_t nameLength, const bool4* v, size_t c) { +UTILS_PUBLIC void MaterialInstance::setParameter(const char* name, size_t const nameLength, const bool4* v, size_t const c) { auto* p = new uint4[c]; std::copy_n(v, c, p); - MaterialInstance::setParameter(name, nameLength, p, c); + setParameter(name, nameLength, p, c); delete [] p; } template<> -UTILS_PUBLIC void MaterialInstance::setParameter(const char* name, size_t nameLength, const mat3f* v, size_t c) { +UTILS_PUBLIC void MaterialInstance::setParameter(const char* name, size_t const nameLength, const mat3f* v, size_t const c) { // pretend each mat3 is an array of 3 float3 - MaterialInstance::setParameter(name, nameLength, reinterpret_cast(v), c * 3); + setParameter(name, nameLength, reinterpret_cast(v), c * 3); } template UTILS_PUBLIC void MaterialInstance::setParameter (const char* name, size_t nameLength, const float *v, size_t c); @@ -183,6 +183,35 @@ template UTILS_PUBLIC void MaterialInstance::setParameter (const char* // ------------------------------------------------------------------------------------------------ +template +T FMaterialInstance::getParameterImpl(std::string_view const name) const { + ssize_t offset = mMaterial->getUniformInterfaceBlock().getFieldOffset(name, 0); + assert_invariant(offset>=0); + return downcast(this)->getUniformBuffer().getUniform(offset); +} + +template +T MaterialInstance::getParameter(const char* name, size_t nameLength) const { + return downcast(this)->getParameterImpl({ name, nameLength }); +} + +// explicit template instantiation of our supported types +template UTILS_PUBLIC float MaterialInstance::getParameter (const char* name, size_t nameLength) const; +template UTILS_PUBLIC int32_t MaterialInstance::getParameter (const char* name, size_t nameLength) const; +template UTILS_PUBLIC uint32_t MaterialInstance::getParameter(const char* name, size_t nameLength) const; +template UTILS_PUBLIC int2 MaterialInstance::getParameter (const char* name, size_t nameLength) const; +template UTILS_PUBLIC int3 MaterialInstance::getParameter (const char* name, size_t nameLength) const; +template UTILS_PUBLIC int4 MaterialInstance::getParameter (const char* name, size_t nameLength) const; +template UTILS_PUBLIC uint2 MaterialInstance::getParameter (const char* name, size_t nameLength) const; +template UTILS_PUBLIC uint3 MaterialInstance::getParameter (const char* name, size_t nameLength) const; +template UTILS_PUBLIC uint4 MaterialInstance::getParameter (const char* name, size_t nameLength) const; +template UTILS_PUBLIC float2 MaterialInstance::getParameter (const char* name, size_t nameLength) const; +template UTILS_PUBLIC float3 MaterialInstance::getParameter (const char* name, size_t nameLength) const; +template UTILS_PUBLIC float4 MaterialInstance::getParameter (const char* name, size_t nameLength) const; +template UTILS_PUBLIC mat3f MaterialInstance::getParameter (const char* name, size_t nameLength) const; + +// ------------------------------------------------------------------------------------------------ + Material const* MaterialInstance::getMaterial() const noexcept { return downcast(this)->getMaterial(); } @@ -197,17 +226,17 @@ void MaterialInstance::setParameter(const char* name, size_t nameLength, Texture } void MaterialInstance::setParameter( - const char* name, size_t nameLength, RgbType type, float3 color) { + const char* name, size_t nameLength, RgbType const type, float3 const color) { downcast(this)->setParameterImpl({ name, nameLength }, Color::toLinear(type, color)); } void MaterialInstance::setParameter( - const char* name, size_t nameLength, RgbaType type, float4 color) { + const char* name, size_t nameLength, RgbaType const type, float4 const color) { downcast(this)->setParameterImpl({ name, nameLength }, Color::toLinear(type, color)); } void MaterialInstance::setScissor( - uint32_t left, uint32_t bottom, uint32_t width, uint32_t height) noexcept { + uint32_t const left, uint32_t const bottom, uint32_t const width, uint32_t const height) noexcept { downcast(this)->setScissor(left, bottom, width, height); } @@ -215,75 +244,83 @@ void MaterialInstance::unsetScissor() noexcept { downcast(this)->unsetScissor(); } -void MaterialInstance::setPolygonOffset(float scale, float constant) noexcept { +void MaterialInstance::setPolygonOffset(float const scale, float const constant) noexcept { downcast(this)->setPolygonOffset(scale, constant); } -void MaterialInstance::setMaskThreshold(float threshold) noexcept { +void MaterialInstance::setMaskThreshold(float const threshold) noexcept { downcast(this)->setMaskThreshold(threshold); } -void MaterialInstance::setSpecularAntiAliasingVariance(float variance) noexcept { +void MaterialInstance::setSpecularAntiAliasingVariance(float const variance) noexcept { downcast(this)->setSpecularAntiAliasingVariance(variance); } -void MaterialInstance::setSpecularAntiAliasingThreshold(float threshold) noexcept { +void MaterialInstance::setSpecularAntiAliasingThreshold(float const threshold) noexcept { downcast(this)->setSpecularAntiAliasingThreshold(threshold); } -void MaterialInstance::setDoubleSided(bool doubleSided) noexcept { +void MaterialInstance::setDoubleSided(bool const doubleSided) noexcept { downcast(this)->setDoubleSided(doubleSided); } -void MaterialInstance::setTransparencyMode(TransparencyMode mode) noexcept { +void MaterialInstance::setTransparencyMode(TransparencyMode const mode) noexcept { downcast(this)->setTransparencyMode(mode); } -void MaterialInstance::setCullingMode(CullingMode culling) noexcept { +void MaterialInstance::setCullingMode(CullingMode const culling) noexcept { downcast(this)->setCullingMode(culling); } -void MaterialInstance::setColorWrite(bool enable) noexcept { +void MaterialInstance::setColorWrite(bool const enable) noexcept { downcast(this)->setColorWrite(enable); } -void MaterialInstance::setDepthWrite(bool enable) noexcept { +void MaterialInstance::setDepthWrite(bool const enable) noexcept { downcast(this)->setDepthWrite(enable); } -void MaterialInstance::setDepthCulling(bool enable) noexcept { +void MaterialInstance::setDepthCulling(bool const enable) noexcept { downcast(this)->setDepthCulling(enable); } -void MaterialInstance::setStencilWrite(bool enable) noexcept { +void MaterialInstance::setDepthFunc(DepthFunc const depthFunc) noexcept { + downcast(this)->setDepthFunc(depthFunc); +} + +MaterialInstance::DepthFunc MaterialInstance::getDepthFunc() const noexcept { + return downcast(this)->getDepthFunc(); +} + +void MaterialInstance::setStencilWrite(bool const enable) noexcept { downcast(this)->setStencilWrite(enable); } -void MaterialInstance::setStencilCompareFunction(StencilCompareFunc func, StencilFace face) noexcept { +void MaterialInstance::setStencilCompareFunction(StencilCompareFunc const func, StencilFace const face) noexcept { downcast(this)->setStencilCompareFunction(func, face); } -void MaterialInstance::setStencilOpStencilFail(StencilOperation op, StencilFace face) noexcept { +void MaterialInstance::setStencilOpStencilFail(StencilOperation const op, StencilFace const face) noexcept { downcast(this)->setStencilOpStencilFail(op, face); } -void MaterialInstance::setStencilOpDepthFail(StencilOperation op, StencilFace face) noexcept { +void MaterialInstance::setStencilOpDepthFail(StencilOperation const op, StencilFace const face) noexcept { downcast(this)->setStencilOpDepthFail(op, face); } -void MaterialInstance::setStencilOpDepthStencilPass(StencilOperation op, StencilFace face) noexcept { +void MaterialInstance::setStencilOpDepthStencilPass(StencilOperation const op, StencilFace const face) noexcept { downcast(this)->setStencilOpDepthStencilPass(op, face); } -void MaterialInstance::setStencilReferenceValue(uint8_t value, StencilFace face) noexcept { +void MaterialInstance::setStencilReferenceValue(uint8_t const value, StencilFace const face) noexcept { downcast(this)->setStencilReferenceValue(value, face); } -void MaterialInstance::setStencilReadMask(uint8_t readMask, StencilFace face) noexcept { +void MaterialInstance::setStencilReadMask(uint8_t const readMask, StencilFace const face) noexcept { downcast(this)->setStencilReadMask(readMask, face); } -void MaterialInstance::setStencilWriteMask(uint8_t writeMask, StencilFace face) noexcept { +void MaterialInstance::setStencilWriteMask(uint8_t const writeMask, StencilFace const face) noexcept { downcast(this)->setStencilWriteMask(writeMask, face); } diff --git a/filament/src/MaterialParser.cpp b/filament/src/MaterialParser.cpp index d5df62932dc..5c5873726c1 100644 --- a/filament/src/MaterialParser.cpp +++ b/filament/src/MaterialParser.cpp @@ -24,15 +24,28 @@ #include -#include #include #include #include #include +#include +#include +#include +#include +#include + +#include #include +#include + +#include +#include +#include +#include #include +#include using namespace utils; using namespace filament::backend; @@ -41,50 +54,67 @@ using namespace filamat; namespace filament { +constexpr std::pair shaderLanguageToTags(ShaderLanguage const language) { + switch (language) { + case ShaderLanguage::ESSL3: + return { MaterialGlsl, DictionaryText }; + case ShaderLanguage::ESSL1: + return { MaterialEssl1, DictionaryText }; + case ShaderLanguage::MSL: + return { MaterialMetal, DictionaryText }; + case ShaderLanguage::SPIRV: + return { MaterialSpirv, DictionarySpirv }; + case ShaderLanguage::METAL_LIBRARY: + return { MaterialMetalLibrary, DictionaryMetalLibrary }; + } +} + // ------------------------------------------------------------------------------------------------ -MaterialParser::MaterialParserDetails::MaterialParserDetails(Backend backend, const void* data, size_t size) - : mManagedBuffer(data, size), - mChunkContainer(mManagedBuffer.data(), mManagedBuffer.size()), - mMaterialChunk(mChunkContainer) { - switch (backend) { - case Backend::OPENGL: - mMaterialTag = ChunkType::MaterialGlsl; - mDictionaryTag = ChunkType::DictionaryText; - break; - case Backend::METAL: - mMaterialTag = ChunkType::MaterialMetal; - mDictionaryTag = ChunkType::DictionaryText; - break; - case Backend::VULKAN: - mMaterialTag = ChunkType::MaterialSpirv; - mDictionaryTag = ChunkType::DictionarySpirv; - break; - default: - // this is for testing purpose -- for e.g.: with the NoopDriver - mMaterialTag = ChunkType::MaterialGlsl; - mDictionaryTag = ChunkType::DictionaryText; - break; - } +MaterialParser::MaterialParserDetails::MaterialParserDetails( + FixedCapacityVector preferredLanguages, const void* data, + size_t const size) + : mManagedBuffer(data, size), + mChunkContainer(mManagedBuffer.data(), mManagedBuffer.size()), + mPreferredLanguages(std::move(preferredLanguages)), + mMaterialChunk(mChunkContainer) { } template UTILS_NOINLINE bool MaterialParser::MaterialParserDetails::getFromSimpleChunk( - filamat::ChunkType type, T* value) const noexcept { + ChunkType const type, T* value) const noexcept { ChunkContainer const& chunkContainer = mChunkContainer; - ChunkContainer::ChunkDesc const* pChunkDesc; - if (chunkContainer.hasChunk(type, &pChunkDesc)) { - Unflattener unflattener(pChunkDesc->start, pChunkDesc->start + pChunkDesc->size); + ChunkContainer::ChunkDesc chunkDesc; + if (chunkContainer.hasChunk(type, &chunkDesc)) { + Unflattener unflattener(chunkDesc.start, chunkDesc.start + chunkDesc.size); return unflattener.read(value); } return false; } +MaterialParser::MaterialParserDetails::ManagedBuffer::ManagedBuffer(const void* start, size_t const size) + : mStart(malloc(size)), mSize(size) { + memcpy(mStart, start, size); +} + +MaterialParser::MaterialParserDetails::ManagedBuffer::~ManagedBuffer() noexcept { + free(mStart); +} + // ------------------------------------------------------------------------------------------------ -MaterialParser::MaterialParser(Backend backend, const void* data, size_t size) - : mImpl(backend, data, size) { +template +bool MaterialParser::get(typename T::Container* container) const noexcept { + auto [start, end] = mImpl.mChunkContainer.getChunkRange(T::tag); + if (start == end) return false; + Unflattener unflattener{ start, end }; + return T::unflatten(unflattener, container); +} + +MaterialParser::MaterialParser(FixedCapacityVector preferredLanguages, + const void* data, size_t const size) + : mImpl(std::move(preferredLanguages), data, size) { } ChunkContainer& MaterialParser::getChunkContainer() noexcept { @@ -100,134 +130,169 @@ MaterialParser::ParseResult MaterialParser::parse() noexcept { if (UTILS_UNLIKELY(!cc.parse())) { return ParseResult::ERROR_OTHER; } - const ChunkType matTag = mImpl.mMaterialTag; - const ChunkType dictTag = mImpl.mDictionaryTag; - if (UTILS_UNLIKELY(!cc.hasChunk(matTag) || !cc.hasChunk(dictTag))) { + + using MaybeShaderLanguageAndChunks = + std::optional>; + auto chooseLanguage = [this, &cc]() -> MaybeShaderLanguageAndChunks { + for (auto language : mImpl.mPreferredLanguages) { + const auto [matTag, dictTag] = shaderLanguageToTags(language); + if (cc.hasChunk(matTag) && cc.hasChunk(dictTag)) { + return std::make_tuple(language, matTag, dictTag); + } + } + return {}; + }; + const auto result = chooseLanguage(); + + if (!result.has_value()) { return ParseResult::ERROR_MISSING_BACKEND; } + + const auto [chosenLanguage, matTag, dictTag] = result.value(); if (UTILS_UNLIKELY(!DictionaryReader::unflatten(cc, dictTag, mImpl.mBlobDictionary))) { return ParseResult::ERROR_OTHER; } if (UTILS_UNLIKELY(!mImpl.mMaterialChunk.initialize(matTag))) { return ParseResult::ERROR_OTHER; } + + mImpl.mChosenLanguage = chosenLanguage; return ParseResult::SUCCESS; } +ShaderLanguage MaterialParser::getShaderLanguage() const noexcept { + return mImpl.mChosenLanguage; +} + // Accessors bool MaterialParser::getMaterialVersion(uint32_t* value) const noexcept { - return mImpl.getFromSimpleChunk(ChunkType::MaterialVersion, value); + return mImpl.getFromSimpleChunk(MaterialVersion, value); } bool MaterialParser::getFeatureLevel(uint8_t* value) const noexcept { - return mImpl.getFromSimpleChunk(ChunkType::MaterialFeatureLevel, value); + return mImpl.getFromSimpleChunk(MaterialFeatureLevel, value); } -bool MaterialParser::getName(utils::CString* cstring) const noexcept { +bool MaterialParser::getName(CString* cstring) const noexcept { auto [start, end] = mImpl.mChunkContainer.getChunkRange(MaterialName); if (start == end) return false; Unflattener unflattener(start, end); return unflattener.read(cstring); } -bool MaterialParser::getUIB(BufferInterfaceBlock* uib) const noexcept { - auto [start, end] = mImpl.mChunkContainer.getChunkRange(MaterialUib); +bool MaterialParser::getCacheId(uint64_t* cacheId) const noexcept { + auto [start, end] = mImpl.mChunkContainer.getChunkRange(MaterialCacheId); if (start == end) return false; - Unflattener unflattener(start, end); - return ChunkUniformInterfaceBlock::unflatten(unflattener, uib); + Unflattener unflattener(start, end); + return unflattener.read(cacheId); } -bool MaterialParser::getSIB(SamplerInterfaceBlock* sib) const noexcept { - auto [start, end] = mImpl.mChunkContainer.getChunkRange(MaterialSib); - if (start == end) return false; - Unflattener unflattener(start, end); - return ChunkSamplerInterfaceBlock::unflatten(unflattener, sib); +bool MaterialParser::getUIB(BufferInterfaceBlock* container) const noexcept { + return get(container); } -bool MaterialParser::getSubpasses(SubpassInfo* subpass) const noexcept { - auto [start, end] = mImpl.mChunkContainer.getChunkRange(MaterialSubpass); - if (start == end) return false; - Unflattener unflattener(start, end); - return ChunkSubpassInterfaceBlock::unflatten(unflattener, subpass); +bool MaterialParser::getSIB(SamplerInterfaceBlock* container) const noexcept { + return get(container); +} + +bool MaterialParser::getSubpasses(SubpassInfo* container) const noexcept { + return get(container); } bool MaterialParser::getShaderModels(uint32_t* value) const noexcept { - return mImpl.getFromSimpleChunk(ChunkType::MaterialShaderModels, value); + return mImpl.getFromSimpleChunk(MaterialShaderModels, value); } bool MaterialParser::getMaterialProperties(uint64_t* value) const noexcept { - return mImpl.getFromSimpleChunk(ChunkType::MaterialProperties, value); + return mImpl.getFromSimpleChunk(MaterialProperties, value); } -bool MaterialParser::getUniformBlockBindings( - utils::FixedCapacityVector>* value) const noexcept { - auto [start, end] = mImpl.mChunkContainer.getChunkRange(MaterialUniformBindings); - if (start == end) return false; - Unflattener unflattener(start, end); - return ChunkUniformBlockBindings::unflatten(unflattener, value); +bool MaterialParser::getBindingUniformInfo(BindingUniformInfoContainer* container) const noexcept { + return get(container); +} + +bool MaterialParser::getAttributeInfo(AttributeInfoContainer* container) const noexcept { + return get(container); +} + +bool MaterialParser::getDescriptorBindings(DescriptorBindingsContainer* container) const noexcept { + return get(container); } -bool MaterialParser::getSamplerBlockBindings( - SamplerGroupBindingInfoList* pSamplerGroupInfoList, - SamplerBindingToNameMap* pSamplerBindingToNameMap) const noexcept { - auto [start, end] = mImpl.mChunkContainer.getChunkRange(MaterialSamplerBindings); +bool MaterialParser::getDescriptorSetLayout(DescriptorSetLayoutContainer* container) const noexcept { + return get(container); +} + +bool MaterialParser::getConstants(FixedCapacityVector* container) const noexcept { + return get(container); +} + +bool MaterialParser::getPushConstants(CString* structVarName, + FixedCapacityVector* value) const noexcept { + auto [start, end] = mImpl.mChunkContainer.getChunkRange(MaterialPushConstants); if (start == end) return false; Unflattener unflattener(start, end); - return ChunkSamplerBlockBindings::unflatten(unflattener, - pSamplerGroupInfoList, pSamplerBindingToNameMap); + return ChunkMaterialPushConstants::unflatten(unflattener, structVarName, value); } bool MaterialParser::getDepthWriteSet(bool* value) const noexcept { - return mImpl.getFromSimpleChunk(ChunkType::MaterialDepthWriteSet, value); + return mImpl.getFromSimpleChunk(MaterialDepthWriteSet, value); } bool MaterialParser::getDepthWrite(bool* value) const noexcept { - return mImpl.getFromSimpleChunk(ChunkType::MaterialDepthWrite, value); + return mImpl.getFromSimpleChunk(MaterialDepthWrite, value); } bool MaterialParser::getDoubleSidedSet(bool* value) const noexcept { - return mImpl.getFromSimpleChunk(ChunkType::MaterialDoubleSidedSet, value); + return mImpl.getFromSimpleChunk(MaterialDoubleSidedSet, value); } bool MaterialParser::getDoubleSided(bool* value) const noexcept { - return mImpl.getFromSimpleChunk(ChunkType::MaterialDoubleSided, value); + return mImpl.getFromSimpleChunk(MaterialDoubleSided, value); } bool MaterialParser::getColorWrite(bool* value) const noexcept { - return mImpl.getFromSimpleChunk(ChunkType::MaterialColorWrite, value); + return mImpl.getFromSimpleChunk(MaterialColorWrite, value); } bool MaterialParser::getDepthTest(bool* value) const noexcept { - return mImpl.getFromSimpleChunk(ChunkType::MaterialDepthTest, value); + return mImpl.getFromSimpleChunk(MaterialDepthTest, value); } bool MaterialParser::getInstanced(bool* value) const noexcept { - return mImpl.getFromSimpleChunk(ChunkType::MaterialInstanced, value); + return mImpl.getFromSimpleChunk(MaterialInstanced, value); } bool MaterialParser::getCullingMode(CullingMode* value) const noexcept { static_assert(sizeof(CullingMode) == sizeof(uint8_t), "CullingMode expected size is wrong"); - return mImpl.getFromSimpleChunk(ChunkType::MaterialCullingMode, reinterpret_cast(value)); + return mImpl.getFromSimpleChunk(MaterialCullingMode, reinterpret_cast(value)); } bool MaterialParser::getTransparencyMode(TransparencyMode* value) const noexcept { static_assert(sizeof(TransparencyMode) == sizeof(uint8_t), "TransparencyMode expected size is wrong"); - return mImpl.getFromSimpleChunk(ChunkType::MaterialTransparencyMode, + return mImpl.getFromSimpleChunk(MaterialTransparencyMode, reinterpret_cast(value)); } bool MaterialParser::getInterpolation(Interpolation* value) const noexcept { static_assert(sizeof(Interpolation) == sizeof(uint8_t), "Interpolation expected size is wrong"); - return mImpl.getFromSimpleChunk(ChunkType::MaterialInterpolation, reinterpret_cast(value)); + return mImpl.getFromSimpleChunk(MaterialInterpolation, reinterpret_cast(value)); } bool MaterialParser::getVertexDomain(VertexDomain* value) const noexcept { static_assert(sizeof(VertexDomain) == sizeof(uint8_t), "VertexDomain expected size is wrong"); - return mImpl.getFromSimpleChunk(ChunkType::MaterialVertexDomain, reinterpret_cast(value)); + return mImpl.getFromSimpleChunk(MaterialVertexDomain, reinterpret_cast(value)); +} + +bool MaterialParser::getMaterialVariantFilterMask(UserVariantFilterMask* value) const noexcept { + static_assert(sizeof(UserVariantFilterMask) == sizeof(uint32_t), + "UserVariantFilterMask expected size is wrong"); + return mImpl.getFromSimpleChunk(MaterialVariantFilterMask, + reinterpret_cast(value)); } bool MaterialParser::getMaterialDomain(MaterialDomain* value) const noexcept { @@ -239,42 +304,66 @@ bool MaterialParser::getMaterialDomain(MaterialDomain* value) const noexcept { bool MaterialParser::getBlendingMode(BlendingMode* value) const noexcept { static_assert(sizeof(BlendingMode) == sizeof(uint8_t), "BlendingMode expected size is wrong"); - return mImpl.getFromSimpleChunk(ChunkType::MaterialBlendingMode, reinterpret_cast(value)); + return mImpl.getFromSimpleChunk(MaterialBlendingMode, reinterpret_cast(value)); +} + +bool MaterialParser::getCustomBlendFunction(std::array* value) const noexcept { + uint32_t blendFunctions = 0; + bool const result = mImpl.getFromSimpleChunk(MaterialBlendFunction, &blendFunctions); + (*value)[0] = BlendFunction((blendFunctions >> 24) & 0xFF); + (*value)[1] = BlendFunction((blendFunctions >> 16) & 0xFF); + (*value)[2] = BlendFunction((blendFunctions >> 8) & 0xFF); + (*value)[3] = BlendFunction((blendFunctions >> 0) & 0xFF); + return result; } bool MaterialParser::getMaskThreshold(float* value) const noexcept { - return mImpl.getFromSimpleChunk(ChunkType::MaterialMaskThreshold, value); + return mImpl.getFromSimpleChunk(MaterialMaskThreshold, value); +} + +bool MaterialParser::getAlphaToCoverageSet(bool* value) const noexcept { + return mImpl.getFromSimpleChunk(MaterialAlphaToCoverageSet, value); +} + +bool MaterialParser::getAlphaToCoverage(bool* value) const noexcept { + return mImpl.getFromSimpleChunk(MaterialAlphaToCoverage, value); } bool MaterialParser::hasShadowMultiplier(bool* value) const noexcept { - return mImpl.getFromSimpleChunk(ChunkType::MaterialShadowMultiplier, value); + return mImpl.getFromSimpleChunk(MaterialShadowMultiplier, value); } bool MaterialParser::getShading(Shading* value) const noexcept { static_assert(sizeof(Shading) == sizeof(uint8_t), "Shading expected size is wrong"); - return mImpl.getFromSimpleChunk(ChunkType::MaterialShading, reinterpret_cast(value)); + return mImpl.getFromSimpleChunk(MaterialShading, reinterpret_cast(value)); } bool MaterialParser::hasCustomDepthShader(bool* value) const noexcept { - return mImpl.getFromSimpleChunk(ChunkType::MaterialHasCustomDepthShader, value); + return mImpl.getFromSimpleChunk(MaterialHasCustomDepthShader, value); } bool MaterialParser::hasSpecularAntiAliasing(bool* value) const noexcept { - return mImpl.getFromSimpleChunk(ChunkType::MaterialSpecularAntiAliasing, value); + return mImpl.getFromSimpleChunk(MaterialSpecularAntiAliasing, value); } bool MaterialParser::getSpecularAntiAliasingVariance(float* value) const noexcept { - return mImpl.getFromSimpleChunk(ChunkType::MaterialSpecularAntiAliasingVariance, value); + return mImpl.getFromSimpleChunk(MaterialSpecularAntiAliasingVariance, value); } bool MaterialParser::getSpecularAntiAliasingThreshold(float* value) const noexcept { - return mImpl.getFromSimpleChunk(ChunkType::MaterialSpecularAntiAliasingThreshold, value); + return mImpl.getFromSimpleChunk(MaterialSpecularAntiAliasingThreshold, value); +} + +bool MaterialParser::getStereoscopicType(StereoscopicType* value) const noexcept { + static_assert(sizeof(StereoscopicType) == sizeof(uint8_t), + "StereoscopicType expected size is wrong"); + return mImpl.getFromSimpleChunk(MaterialStereoscopicType, reinterpret_cast(value)); } bool MaterialParser::getRequiredAttributes(AttributeBitset* value) const noexcept { uint32_t rawAttributes = 0; - if (!mImpl.getFromSimpleChunk(ChunkType::MaterialRequiredAttributes, &rawAttributes)) { + if (!mImpl.getFromSimpleChunk(MaterialRequiredAttributes, &rawAttributes)) { return false; } *value = AttributeBitset(); @@ -285,32 +374,32 @@ bool MaterialParser::getRequiredAttributes(AttributeBitset* value) const noexcep bool MaterialParser::getRefractionMode(RefractionMode* value) const noexcept { static_assert(sizeof(RefractionMode) == sizeof(uint8_t), "Refraction expected size is wrong"); - return mImpl.getFromSimpleChunk(ChunkType::MaterialRefraction, (uint8_t*)value); + return mImpl.getFromSimpleChunk(MaterialRefraction, (uint8_t*)value); } bool MaterialParser::getRefractionType(RefractionType* value) const noexcept { static_assert(sizeof(RefractionType) == sizeof(uint8_t), "RefractionType expected size is wrong"); - return mImpl.getFromSimpleChunk(ChunkType::MaterialRefractionType, (uint8_t*)value); + return mImpl.getFromSimpleChunk(MaterialRefractionType, (uint8_t*)value); } bool MaterialParser::getReflectionMode(ReflectionMode* value) const noexcept { static_assert(sizeof(ReflectionMode) == sizeof(uint8_t), "ReflectionMode expected size is wrong"); - return mImpl.getFromSimpleChunk(ChunkType::MaterialReflectionMode, (uint8_t*)value); + return mImpl.getFromSimpleChunk(MaterialReflectionMode, (uint8_t*)value); } bool MaterialParser::getShader(ShaderContent& shader, - ShaderModel shaderModel, Variant variant, ShaderStage stage) noexcept { + ShaderModel const shaderModel, Variant const variant, ShaderStage const stage) noexcept { return mImpl.mMaterialChunk.getShader(shader, - mImpl.mBlobDictionary, uint8_t(shaderModel), variant, uint8_t(stage)); + mImpl.mBlobDictionary, shaderModel, variant, stage); } // ------------------------------------------------------------------------------------------------ bool ChunkUniformInterfaceBlock::unflatten(Unflattener& unflattener, - filament::BufferInterfaceBlock* uib) { + BufferInterfaceBlock* uib) { BufferInterfaceBlock::Builder builder = BufferInterfaceBlock::Builder(); @@ -361,7 +450,7 @@ bool ChunkUniformInterfaceBlock::unflatten(Unflattener& unflattener, } bool ChunkSamplerInterfaceBlock::unflatten(Unflattener& unflattener, - filament::SamplerInterfaceBlock* sib) { + SamplerInterfaceBlock* sib) { SamplerInterfaceBlock::Builder builder = SamplerInterfaceBlock::Builder(); @@ -378,7 +467,9 @@ bool ChunkSamplerInterfaceBlock::unflatten(Unflattener& unflattener, } for (uint64_t i = 0; i < numFields; i++) { + static_assert(sizeof(descriptor_binding_t) == sizeof(uint8_t)); CString fieldName; + uint8_t fieldBinding = 0; uint8_t fieldType = 0; uint8_t fieldFormat = 0; uint8_t fieldPrecision = 0; @@ -388,6 +479,10 @@ bool ChunkSamplerInterfaceBlock::unflatten(Unflattener& unflattener, return false; } + if (!unflattener.read(&fieldBinding)) { + return false; + } + if (!unflattener.read(&fieldType)) { return false; } @@ -404,7 +499,9 @@ bool ChunkSamplerInterfaceBlock::unflatten(Unflattener& unflattener, return false; } - builder.add({ fieldName.data(), fieldName.size() }, SamplerInterfaceBlock::Type(fieldType), + builder.add({ fieldName.data(), fieldName.size() }, + SamplerInterfaceBlock::Binding(fieldBinding), + SamplerInterfaceBlock::Type(fieldType), SamplerInterfaceBlock::Format(fieldFormat), SamplerInterfaceBlock::Precision(fieldPrecision), fieldMultisample); @@ -415,7 +512,7 @@ bool ChunkSamplerInterfaceBlock::unflatten(Unflattener& unflattener, } bool ChunkSubpassInterfaceBlock::unflatten(Unflattener& unflattener, - filament::SubpassInfo* subpass) { + SubpassInfo* subpass) { CString block; if (!unflattener.read(&block)) { @@ -469,72 +566,236 @@ bool ChunkSubpassInterfaceBlock::unflatten(Unflattener& unflattener, return true; } -bool ChunkUniformBlockBindings::unflatten(filaflat::Unflattener& unflattener, - utils::FixedCapacityVector>* uniformBlockBindings) { - uint8_t count; - if (!unflattener.read(&count)) { +bool ChunkBindingUniformInfo::unflatten(Unflattener& unflattener, + MaterialParser::BindingUniformInfoContainer* bindingUniformInfo) { + uint8_t bindingPointCount; + if (!unflattener.read(&bindingPointCount)) { return false; } - uniformBlockBindings->reserve(count); + bindingUniformInfo->reserve(bindingPointCount); + for (size_t i = 0; i < bindingPointCount; i++) { + uint8_t index; + if (!unflattener.read(&index)) { + return false; + } + CString uboName; + if (!unflattener.read(&uboName)) { + return false; + } + uint8_t uniformCount; + if (!unflattener.read(&uniformCount)) { + return false; + } + + Program::UniformInfo uniforms = Program::UniformInfo::with_capacity(uniformCount); + for (size_t j = 0; j < uniformCount; j++) { + CString name; + if (!unflattener.read(&name)) { + return false; + } + uint16_t offset; + if (!unflattener.read(&offset)) { + return false; + } + uint8_t size; + if (!unflattener.read(&size)) { + return false; + } + uint8_t type; + if (!unflattener.read(&type)) { + return false; + } + uniforms.push_back({ name, offset, size, UniformType(type) }); + } + bindingUniformInfo->emplace_back(index, std::move(uboName), std::move(uniforms)); + } + return true; +} + +bool ChunkAttributeInfo::unflatten(Unflattener& unflattener, + MaterialParser::AttributeInfoContainer* attributeInfoContainer) { - for (uint8_t i = 0; i < count; i++) { + uint8_t attributeCount; + if (!unflattener.read(&attributeCount)) { + return false; + } + + attributeInfoContainer->reserve(attributeCount); + + for (size_t j = 0; j < attributeCount; j++) { CString name; - uint8_t binding; if (!unflattener.read(&name)) { return false; } - if (!unflattener.read(&binding)) { + uint8_t location; + if (!unflattener.read(&location)) { return false; } - uniformBlockBindings->emplace_back(std::move(name), binding); + attributeInfoContainer->emplace_back(name, location); } + return true; } +bool ChunkDescriptorBindingsInfo::unflatten(Unflattener& unflattener, + MaterialParser::DescriptorBindingsContainer* container) { -bool ChunkSamplerBlockBindings::unflatten(Unflattener& unflattener, - SamplerGroupBindingInfoList* pSamplerGroupBindingInfoList, - SamplerBindingToNameMap* pSamplerBindingToNameMap) { - assert_invariant(pSamplerGroupBindingInfoList && pSamplerBindingToNameMap); - SamplerGroupBindingInfoList& samplerGroupBindingInfoList = *pSamplerGroupBindingInfoList; - SamplerBindingToNameMap& samplerBindingToNameMap = *pSamplerBindingToNameMap; - - uint8_t count; - if (!unflattener.read(&count)) { + uint8_t setCount; + if (!unflattener.read(&setCount)) { return false; } - assert_invariant(count == utils::Enum::count()); - UTILS_NOUNROLL - for (size_t i = 0; i < count; i++) { - if (!unflattener.read(&samplerGroupBindingInfoList[i].bindingOffset)) { + for (size_t j = 0; j < setCount; j++) { + static_assert(sizeof(DescriptorSetBindingPoints) == sizeof(uint8_t)); + + DescriptorSetBindingPoints set; + if (!unflattener.read(reinterpret_cast(&set))) { return false; } - if (!unflattener.read((uint8_t *)&samplerGroupBindingInfoList[i].shaderStageFlags)) { + + uint8_t descriptorCount; + if (!unflattener.read(&descriptorCount)) { return false; } - if (!unflattener.read(&samplerGroupBindingInfoList[i].count)) { + + auto& descriptors = (*container)[+set]; + descriptors.reserve(descriptorCount); + for (size_t i = 0; i < descriptorCount; i++) { + CString name; + if (!unflattener.read(&name)) { + return false; + } + uint8_t type; + if (!unflattener.read(&type)) { + return false; + } + uint8_t binding; + if (!unflattener.read(&binding)) { + return false; + } + descriptors.push_back({ + std::move(name), + DescriptorType(type), + descriptor_binding_t(binding)}); + } + } + + return true; +} + +bool ChunkDescriptorSetLayoutInfo::unflatten(Unflattener& unflattener, + MaterialParser::DescriptorSetLayoutContainer* container) { + for (size_t j = 0; j < 2; j++) { + uint8_t descriptorCount; + if (!unflattener.read(&descriptorCount)) { return false; } + auto& descriptors = (*container)[j].bindings; + descriptors.reserve(descriptorCount); + for (size_t i = 0; i < descriptorCount; i++) { + uint8_t type; + if (!unflattener.read(&type)) { + return false; + } + uint8_t stageFlags; + if (!unflattener.read(&stageFlags)) { + return false; + } + uint8_t binding; + if (!unflattener.read(&binding)) { + return false; + } + uint8_t flags; + if (!unflattener.read(&flags)) { + return false; + } + uint16_t count; + if (!unflattener.read(&count)) { + return false; + } + descriptors.push_back({ + DescriptorType(type), + ShaderStageFlags(stageFlags), + descriptor_binding_t(binding), + DescriptorFlags(flags), + count, + }); + } } + return true; +} - if (!unflattener.read(&count)) { +bool ChunkMaterialConstants::unflatten(Unflattener& unflattener, + FixedCapacityVector* materialConstants) { + assert_invariant(materialConstants); + + // Read number of constants. + uint64_t numConstants = 0; + if (!unflattener.read(&numConstants)) { return false; } - samplerBindingToNameMap.reserve(count); - samplerBindingToNameMap.resize(count); - for (size_t i = 0; i < count; i++) { - uint8_t binding; - if (!unflattener.read(&binding)) { + materialConstants->reserve(numConstants); + materialConstants->resize(numConstants); + + for (uint64_t i = 0; i < numConstants; i++) { + CString constantName; + uint8_t constantType = 0; + + if (!unflattener.read(&constantName)) { return false; } - assert_invariant(binding < backend::MAX_SAMPLER_COUNT); - if (!unflattener.read(&samplerBindingToNameMap[binding])) { + + if (!unflattener.read(&constantType)) { return false; } + + (*materialConstants)[i].name = constantName; + (*materialConstants)[i].type = static_cast(constantType); + } + + return true; +} + +bool ChunkMaterialPushConstants::unflatten(Unflattener& unflattener, + CString* structVarName, + FixedCapacityVector* materialPushConstants) { + assert_invariant(materialPushConstants); + + if (!unflattener.read(structVarName)) { + return false; } + // Read number of constants. + uint64_t numConstants = 0; + if (!unflattener.read(&numConstants)) { + return false; + } + + materialPushConstants->reserve(numConstants); + materialPushConstants->resize(numConstants); + + for (uint64_t i = 0; i < numConstants; i++) { + CString constantName; + uint8_t constantType = 0; + uint8_t shaderStage = 0; + + if (!unflattener.read(&constantName)) { + return false; + } + + if (!unflattener.read(&constantType)) { + return false; + } + + if (!unflattener.read(&shaderStage)) { + return false; + } + + (*materialPushConstants)[i].name = constantName; + (*materialPushConstants)[i].type = static_cast(constantType); + (*materialPushConstants)[i].stage = static_cast(shaderStage); + } return true; } diff --git a/filament/src/MaterialParser.h b/filament/src/MaterialParser.h index eff0addc23f..761698d526b 100644 --- a/filament/src/MaterialParser.h +++ b/filament/src/MaterialParser.h @@ -23,15 +23,20 @@ #include #include -#include "../../libs/filamat/src/SamplerBindingMap.h" #include #include +#include -#include #include +#include -#include +#include +#include +#include + +#include +#include namespace filaflat { class ChunkContainer; @@ -43,10 +48,13 @@ namespace filament { class BufferInterfaceBlock; class SamplerInterfaceBlock; struct SubpassInfo; +struct MaterialConstant; +struct MaterialPushConstant; class MaterialParser { public: - MaterialParser(backend::Backend backend, const void* data, size_t size); + MaterialParser(utils::FixedCapacityVector preferredLanguages, + const void* data, size_t size); MaterialParser(MaterialParser const& rhs) noexcept = delete; MaterialParser& operator=(MaterialParser const& rhs) noexcept = delete; @@ -58,19 +66,35 @@ class MaterialParser { }; ParseResult parse() noexcept; + backend::ShaderLanguage getShaderLanguage() const noexcept; // Accessors bool getMaterialVersion(uint32_t* value) const noexcept; bool getFeatureLevel(uint8_t* value) const noexcept; bool getName(utils::CString*) const noexcept; + bool getCacheId(uint64_t* cacheId) const noexcept; bool getUIB(BufferInterfaceBlock* uib) const noexcept; bool getSIB(SamplerInterfaceBlock* sib) const noexcept; bool getSubpasses(SubpassInfo* subpass) const noexcept; bool getShaderModels(uint32_t* value) const noexcept; bool getMaterialProperties(uint64_t* value) const noexcept; - bool getUniformBlockBindings(utils::FixedCapacityVector>* value) const noexcept; - bool getSamplerBlockBindings(SamplerGroupBindingInfoList* pSamplerGroupInfoList, - SamplerBindingToNameMap* pSamplerBindingToNameMap) const noexcept; + bool getConstants(utils::FixedCapacityVector* value) const noexcept; + bool getPushConstants(utils::CString* structVarName, + utils::FixedCapacityVector* value) const noexcept; + + using BindingUniformInfoContainer = utils::FixedCapacityVector>; + bool getBindingUniformInfo(BindingUniformInfoContainer* container) const noexcept; + + using AttributeInfoContainer = utils::FixedCapacityVector< + std::pair>; + bool getAttributeInfo(AttributeInfoContainer* container) const noexcept; + + using DescriptorBindingsContainer = backend::Program::DescriptorSetInfo; + bool getDescriptorBindings(DescriptorBindingsContainer* container) const noexcept; + + using DescriptorSetLayoutContainer = std::array; + bool getDescriptorSetLayout(DescriptorSetLayoutContainer* container) const noexcept; bool getDepthWriteSet(bool* value) const noexcept; bool getDepthWrite(bool* value) const noexcept; @@ -84,10 +108,14 @@ class MaterialParser { bool getInterpolation(Interpolation* value) const noexcept; bool getVertexDomain(VertexDomain* value) const noexcept; bool getMaterialDomain(MaterialDomain* domain) const noexcept; + bool getMaterialVariantFilterMask(UserVariantFilterMask* userVariantFilterMask) const noexcept; bool getShading(Shading*) const noexcept; bool getBlendingMode(BlendingMode*) const noexcept; + bool getCustomBlendFunction(std::array*) const noexcept; bool getMaskThreshold(float*) const noexcept; + bool getAlphaToCoverageSet(bool*) const noexcept; + bool getAlphaToCoverage(bool*) const noexcept; bool hasShadowMultiplier(bool*) const noexcept; bool getRequiredAttributes(AttributeBitset*) const noexcept; bool getRefractionMode(RefractionMode* value) const noexcept; @@ -97,13 +125,29 @@ class MaterialParser { bool hasSpecularAntiAliasing(bool* value) const noexcept; bool getSpecularAntiAliasingVariance(float* value) const noexcept; bool getSpecularAntiAliasingThreshold(float* value) const noexcept; + bool getStereoscopicType(backend::StereoscopicType*) const noexcept; bool getShader(filaflat::ShaderContent& shader, backend::ShaderModel shaderModel, Variant variant, backend::ShaderStage stage) noexcept; + bool hasShader(backend::ShaderModel const model, + Variant const variant, backend::ShaderStage const stage) const noexcept { + return getMaterialChunk().hasShader(model, variant, stage); + } + + filaflat::MaterialChunk const& getMaterialChunk() const noexcept { + return mImpl.mMaterialChunk; + } + private: + + template + bool get(typename T::Container* container) const noexcept; + struct MaterialParserDetails { - MaterialParserDetails(backend::Backend backend, const void* data, size_t size); + MaterialParserDetails( + utils::FixedCapacityVector preferredLanguages, + const void* data, size_t size); template bool getFromSimpleChunk(filamat::ChunkType type, T* value) const noexcept; @@ -115,11 +159,8 @@ class MaterialParser { void* mStart = nullptr; size_t mSize = 0; public: - explicit ManagedBuffer(const void* start, size_t size) - : mStart(malloc(size)), mSize(size) { - memcpy(mStart, start, size); - } - ~ManagedBuffer() noexcept { free(mStart); } + explicit ManagedBuffer(const void* start, size_t size); + ~ManagedBuffer() noexcept; ManagedBuffer(ManagedBuffer const& rhs) = delete; ManagedBuffer& operator=(ManagedBuffer const& rhs) = delete; void* data() const noexcept { return mStart; } @@ -130,12 +171,12 @@ class MaterialParser { ManagedBuffer mManagedBuffer; filaflat::ChunkContainer mChunkContainer; + utils::FixedCapacityVector mPreferredLanguages; + backend::ShaderLanguage mChosenLanguage; // Keep MaterialChunk alive between calls to getShader to avoid reload the shader index. filaflat::MaterialChunk mMaterialChunk; filaflat::BlobDictionary mBlobDictionary; - filamat::ChunkType mMaterialTag = filamat::ChunkType::Unknown; - filamat::ChunkType mDictionaryTag = filamat::ChunkType::Unknown; }; filaflat::ChunkContainer& getChunkContainer() noexcept; @@ -145,25 +186,60 @@ class MaterialParser { struct ChunkUniformInterfaceBlock { static bool unflatten(filaflat::Unflattener& unflattener, BufferInterfaceBlock* uib); + using Container = BufferInterfaceBlock; + static filamat::ChunkType const tag = filamat::MaterialUib; }; struct ChunkSamplerInterfaceBlock { static bool unflatten(filaflat::Unflattener& unflattener, SamplerInterfaceBlock* sib); + using Container = SamplerInterfaceBlock; + static filamat::ChunkType const tag = filamat::MaterialSib; }; struct ChunkSubpassInterfaceBlock { static bool unflatten(filaflat::Unflattener& unflattener, SubpassInfo* sib); + using Container = SubpassInfo; + static filamat::ChunkType const tag = filamat::MaterialSubpass; +}; + +struct ChunkBindingUniformInfo { + static bool unflatten(filaflat::Unflattener& unflattener, + MaterialParser::BindingUniformInfoContainer* bindingUniformInfo); + using Container = MaterialParser::BindingUniformInfoContainer; + static filamat::ChunkType const tag = filamat::MaterialBindingUniformInfo; +}; + +struct ChunkAttributeInfo { + static bool unflatten(filaflat::Unflattener& unflattener, + MaterialParser::AttributeInfoContainer* attributeInfoContainer); + using Container = MaterialParser::AttributeInfoContainer; + static filamat::ChunkType const tag = filamat::MaterialAttributeInfo; }; -struct ChunkUniformBlockBindings { +struct ChunkDescriptorBindingsInfo { static bool unflatten(filaflat::Unflattener& unflattener, - utils::FixedCapacityVector>* uniformBlockBindings); + MaterialParser::DescriptorBindingsContainer* container); + using Container = MaterialParser::DescriptorBindingsContainer; + static filamat::ChunkType const tag = filamat::MaterialDescriptorBindingsInfo; }; -struct ChunkSamplerBlockBindings { +struct ChunkDescriptorSetLayoutInfo { static bool unflatten(filaflat::Unflattener& unflattener, - SamplerGroupBindingInfoList* pSamplerGroupBindingInfoList, - SamplerBindingToNameMap* pSamplerBindingToNameMap); + MaterialParser::DescriptorSetLayoutContainer* container); + using Container = MaterialParser::DescriptorSetLayoutContainer; + static filamat::ChunkType const tag = filamat::MaterialDescriptorSetLayoutInfo; +}; + +struct ChunkMaterialConstants { + static bool unflatten(filaflat::Unflattener& unflattener, + utils::FixedCapacityVector* materialConstants); + using Container = utils::FixedCapacityVector; + static filamat::ChunkType const tag = filamat::MaterialConstants; +}; + +struct ChunkMaterialPushConstants { + static bool unflatten(filaflat::Unflattener& unflattener, utils::CString* structVarName, + utils::FixedCapacityVector* materialPushConstants); }; } // namespace filament diff --git a/filament/src/MorphTargetBuffer.cpp b/filament/src/MorphTargetBuffer.cpp index 227755a5640..4a4f0de490b 100644 --- a/filament/src/MorphTargetBuffer.cpp +++ b/filament/src/MorphTargetBuffer.cpp @@ -20,18 +20,18 @@ namespace filament { -void MorphTargetBuffer::setPositionsAt(Engine& engine, size_t targetIndex, - math::float3 const* positions, size_t count, size_t offset) { +void MorphTargetBuffer::setPositionsAt(Engine& engine, size_t const targetIndex, + math::float3 const* positions, size_t const count, size_t const offset) { downcast(this)->setPositionsAt(downcast(engine), targetIndex, positions, count, offset); } -void MorphTargetBuffer::setPositionsAt(Engine& engine, size_t targetIndex, - math::float4 const* positions, size_t count, size_t offset) { +void MorphTargetBuffer::setPositionsAt(Engine& engine, size_t const targetIndex, + math::float4 const* positions, size_t const count, size_t const offset) { downcast(this)->setPositionsAt(downcast(engine), targetIndex, positions, count, offset); } -void MorphTargetBuffer::setTangentsAt(Engine& engine, size_t targetIndex, - math::short4 const* tangents, size_t count, size_t offset) { +void MorphTargetBuffer::setTangentsAt(Engine& engine, size_t const targetIndex, + math::short4 const* tangents, size_t const count, size_t const offset) { downcast(this)->setTangentsAt(downcast(engine), targetIndex, tangents, count, offset); } diff --git a/filament/src/PIDController.h b/filament/src/PIDController.h index db22bb67cdc..791a9cecc49 100644 --- a/filament/src/PIDController.h +++ b/filament/src/PIDController.h @@ -27,43 +27,43 @@ class PIDController { public: PIDController() noexcept = default; - void setStandardGains(float Kp, float Ti, float Td) noexcept { + void setStandardGains(float const Kp, float const Ti, float const Td) noexcept { mKp = Kp; mKi = Kp / Ti; mKd = Kp * Td; } - void setParallelGains(float Kp, float Ki, float Kd) noexcept { + void setParallelGains(float const Kp, float const Ki, float const Kd) noexcept { mKp = Kp; mKi = Ki; mKd = Kd; } // output is kept steady in the dead band - void setOutputDeadBand(float low, float high) noexcept { + void setOutputDeadBand(float const low, float const high) noexcept { mDeadBandLow = low; mDeadBandHigh = high; } // integral bounds to prevent windup - void setIntegralLimits(float low, float high) noexcept { + void setIntegralLimits(float const low, float const high) noexcept { mIntegralLimitLow = low; mIntegralLimitHigh = high; } // output bounds - void setOutputLimits(float low, float high) noexcept { + void setOutputLimits(float const low, float const high) noexcept { mOutputLimitLow = low; mOutputLimitHigh = high; } // disable integral term to prevent windup - void setIntegralInhibitionEnabled(bool enabled) noexcept { + void setIntegralInhibitionEnabled(bool const enabled) noexcept { mIntegralInhibition = enabled ? 0.0f : 1.0f; } // update PID output - float update(float measure, float target, float dt) const noexcept { + float update(float const measure, float const target, float const dt) const noexcept { // compute error const float error = target - measure; diff --git a/filament/src/PerShadowMapUniforms.cpp b/filament/src/PerShadowMapUniforms.cpp deleted file mode 100644 index d31053f3f46..00000000000 --- a/filament/src/PerShadowMapUniforms.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "PerShadowMapUniforms.h" - -#include "ShadowMapManager.h" - -#include "details/Camera.h" -#include "details/Engine.h" - -#include - -namespace filament { - -using namespace backend; -using namespace math; - -PerShadowMapUniforms::PerShadowMapUniforms(FEngine& engine) noexcept { - DriverApi& driver = engine.getDriverApi(); - mUniformBufferHandle = driver.createBufferObject(sizeof(PerViewUib), - BufferObjectBinding::UNIFORM, BufferUsage::DYNAMIC); -} - -void PerShadowMapUniforms::terminate(DriverApi& driver) { - driver.destroyBufferObject(mUniformBufferHandle); -} - -PerViewUib& PerShadowMapUniforms::edit(Transaction const& transaction) noexcept { - assert_invariant(transaction.uniforms); - return *transaction.uniforms; -} - -void PerShadowMapUniforms::prepareCamera(Transaction const& transaction, - FEngine& engine, const CameraInfo& camera) noexcept { - mat4f const& viewFromWorld = camera.view; - mat4f const& worldFromView = camera.model; - mat4f const& clipFromView = camera.projection; - - const mat4f viewFromClip{ inverse((mat4)camera.projection) }; - const mat4f clipFromWorld{ highPrecisionMultiply(clipFromView, viewFromWorld) }; - const mat4f worldFromClip{ highPrecisionMultiply(worldFromView, viewFromClip) }; - - auto& s = edit(transaction); - s.viewFromWorldMatrix = viewFromWorld; // view - s.worldFromViewMatrix = worldFromView; // model - s.clipFromViewMatrix = clipFromView; // projection - s.viewFromClipMatrix = viewFromClip; // 1/projection - s.clipFromWorldMatrix = clipFromWorld; // projection * view - s.worldFromClipMatrix = worldFromClip; // 1/(projection * view) - s.clipTransform = camera.clipTransfrom; - s.cameraPosition = float3{ camera.getPosition() }; - s.worldOffset = camera.getWorldOffset(); - s.cameraFar = camera.zf; - s.oneOverFarMinusNear = 1.0f / (camera.zf - camera.zn); - s.nearOverFarMinusNear = camera.zn / (camera.zf - camera.zn); - - // with a clip-space of [-w, w] ==> z' = -z - // with a clip-space of [0, w] ==> z' = (w - z)/2 - s.clipControl = engine.getDriverApi().getClipSpaceParams(); -} - -void PerShadowMapUniforms::prepareLodBias(Transaction const& transaction, - float bias) noexcept { - auto& s = edit(transaction); - s.lodBias = bias; -} - -void PerShadowMapUniforms::prepareViewport(Transaction const& transaction, - backend::Viewport const& viewport) noexcept { - float2 const dimensions{ viewport.width, viewport.height }; - auto& s = edit(transaction); - s.resolution = { dimensions, 1.0f / dimensions }; - s.logicalViewportScale = 1.0f; - s.logicalViewportOffset = 0.0f; -} - -void PerShadowMapUniforms::prepareTime(Transaction const& transaction, - FEngine& engine, math::float4 const& userTime) noexcept { - auto& s = edit(transaction); - const uint64_t oneSecondRemainder = engine.getEngineTime().count() % 1000000000; - const float fraction = float(double(oneSecondRemainder) / 1000000000.0); - s.time = fraction; - s.userTime = userTime; -} - -void PerShadowMapUniforms::prepareShadowMapping(Transaction const& transaction, - bool highPrecision) noexcept { - auto& s = edit(transaction); - constexpr float low = 5.54f; // ~ std::log(std::numeric_limits::max()) * 0.5f; - constexpr float high = 42.0f; // ~ std::log(std::numeric_limits::max()) * 0.5f; - s.vsmExponent = highPrecision ? high : low; -} - - -PerShadowMapUniforms::Transaction PerShadowMapUniforms::open(backend::DriverApi& driver) noexcept { - Transaction transaction; - // TODO: use out-of-line buffer if too large - transaction.uniforms = (PerViewUib *)driver.allocate(sizeof(PerViewUib)); - assert_invariant(transaction.uniforms); - return transaction; -} - -void PerShadowMapUniforms::commit(Transaction& transaction, - backend::DriverApi& driver) noexcept { - driver.updateBufferObject(mUniformBufferHandle, { - transaction.uniforms, sizeof(PerViewUib) }, 0); - transaction.uniforms = nullptr; -} - -void PerShadowMapUniforms::bind(backend::DriverApi& driver) noexcept { - driver.bindUniformBuffer(+UniformBindingPoints::PER_VIEW, mUniformBufferHandle); -} - -} // namespace filament - diff --git a/filament/src/PerShadowMapUniforms.h b/filament/src/PerShadowMapUniforms.h deleted file mode 100644 index 42ca2eb1593..00000000000 --- a/filament/src/PerShadowMapUniforms.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef TNT_FILAMENT_PERSHADOWMAPUNIFORMS_H -#define TNT_FILAMENT_PERSHADOWMAPUNIFORMS_H - -#include - -#include -#include - -#include "TypedUniformBuffer.h" - -#include - -#include - -#include - -namespace filament { - -struct CameraInfo; - -class FEngine; -class LightManager; - -/* - * PerShadowMapUniforms manages the UBO needed to generate our shadow maps. Internally it just - * holds onto a `PerViewUniform` UBO handle, but doesn't keep any shadow copy of it, instead it - * writes the data directly into the commandstream, for this reason partial update of the data - * is not possible. - */ -class PerShadowMapUniforms { - - using LightManagerInstance = utils::EntityInstance; - -public: - class Transaction { - friend PerShadowMapUniforms; - PerViewUib* uniforms = nullptr; - Transaction() = default; // disallow creation by the caller - }; - - explicit PerShadowMapUniforms(FEngine& engine) noexcept; - - void terminate(backend::DriverApi& driver); - - static void prepareCamera(Transaction const& transaction, - FEngine& engine, const CameraInfo& camera) noexcept; - - static void prepareLodBias(Transaction const& transaction, - float bias) noexcept; - - static void prepareViewport(Transaction const& transaction, - backend::Viewport const& viewport) noexcept; - - static void prepareTime(Transaction const& transaction, - FEngine& engine, math::float4 const& userTime) noexcept; - - static void prepareShadowMapping(Transaction const& transaction, - bool highPrecision) noexcept; - - static Transaction open(backend::DriverApi& driver) noexcept; - - // update local data into GPU UBO - void commit(Transaction& transaction, backend::DriverApi& driver) noexcept; - - // bind this UBO - void bind(backend::DriverApi& driver) noexcept; - -private: - static PerViewUib& edit(Transaction const& transaction) noexcept; - backend::Handle mUniformBufferHandle; -}; - -} // namespace filament - -#endif //TNT_FILAMENT_PERSHADOWMAPUNIFORMS_H diff --git a/filament/src/PerViewUniforms.cpp b/filament/src/PerViewUniforms.cpp deleted file mode 100644 index 98dcc0ac0d2..00000000000 --- a/filament/src/PerViewUniforms.cpp +++ /dev/null @@ -1,382 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "PerViewUniforms.h" - -#include "DFG.h" -#include "Froxelizer.h" -#include "ShadowMapManager.h" - -#include "details/Camera.h" -#include "details/Engine.h" -#include "details/IndirectLight.h" -#include "details/Texture.h" - -#include -#include -#include - -#include -#include - -#include - -namespace filament { - -using namespace backend; -using namespace math; - -PerViewUniforms::PerViewUniforms(FEngine& engine) noexcept - : mSamplers(PerViewSib::SAMPLER_COUNT) { - DriverApi& driver = engine.getDriverApi(); - - mSamplerGroupHandle = driver.createSamplerGroup(mSamplers.getSize()); - - mUniformBufferHandle = driver.createBufferObject(mUniforms.getSize(), - BufferObjectBinding::UNIFORM, BufferUsage::DYNAMIC); - - if (engine.getDFG().isValid()) { - TextureSampler sampler(TextureSampler::MagFilter::LINEAR); - mSamplers.setSampler(PerViewSib::IBL_DFG_LUT, - { engine.getDFG().getTexture(), sampler.getSamplerParams() }); - } -} - -void PerViewUniforms::terminate(DriverApi& driver) { - driver.destroyBufferObject(mUniformBufferHandle); - driver.destroySamplerGroup(mSamplerGroupHandle); -} - -void PerViewUniforms::prepareCamera(FEngine& engine, const CameraInfo& camera) noexcept { - mat4f const& viewFromWorld = camera.view; - mat4f const& worldFromView = camera.model; - mat4f const& clipFromView = camera.projection; - - const mat4f viewFromClip{ inverse((mat4)camera.projection) }; - const mat4f clipFromWorld{ highPrecisionMultiply(clipFromView, viewFromWorld) }; - const mat4f worldFromClip{ highPrecisionMultiply(worldFromView, viewFromClip) }; - - auto& s = mUniforms.edit(); - s.viewFromWorldMatrix = viewFromWorld; // view - s.worldFromViewMatrix = worldFromView; // model - s.clipFromViewMatrix = clipFromView; // projection - s.viewFromClipMatrix = viewFromClip; // 1/projection - s.clipFromWorldMatrix = clipFromWorld; // projection * view - s.worldFromClipMatrix = worldFromClip; // 1/(projection * view) - s.clipTransform = camera.clipTransfrom; - s.cameraPosition = float3{ camera.getPosition() }; - s.worldOffset = camera.getWorldOffset(); - s.cameraFar = camera.zf; - s.oneOverFarMinusNear = 1.0f / (camera.zf - camera.zn); - s.nearOverFarMinusNear = camera.zn / (camera.zf - camera.zn); - - // with a clip-space of [-w, w] ==> z' = -z - // with a clip-space of [0, w] ==> z' = (w - z)/2 - s.clipControl = engine.getDriverApi().getClipSpaceParams(); -} - -void PerViewUniforms::prepareLodBias(float bias) noexcept { - auto& s = mUniforms.edit(); - s.lodBias = bias; -} - -void PerViewUniforms::prepareExposure(float ev100) noexcept { - const float exposure = Exposure::exposure(ev100); - auto& s = mUniforms.edit(); - s.exposure = exposure; - s.ev100 = ev100; -} - -void PerViewUniforms::prepareViewport( - const filament::Viewport& physicalViewport, - const filament::Viewport& logicalViewport) noexcept { - float4 const physical{ physicalViewport.left, physicalViewport.bottom, - physicalViewport.width, physicalViewport.height }; - float4 const logical{ logicalViewport.left, logicalViewport.bottom, - logicalViewport.width, logicalViewport.height }; - auto& s = mUniforms.edit(); - s.resolution = { physical.zw, 1.0f / physical.zw }; - s.logicalViewportScale = physical.zw / logical.zw; - s.logicalViewportOffset = -logical.xy / logical.zw; -} - -void PerViewUniforms::prepareTime(FEngine& engine, math::float4 const& userTime) noexcept { - auto& s = mUniforms.edit(); - const uint64_t oneSecondRemainder = engine.getEngineTime().count() % 1000000000; - const float fraction = float(double(oneSecondRemainder) / 1000000000.0); - s.time = fraction; - s.userTime = userTime; -} - -void PerViewUniforms::prepareTemporalNoise(FEngine& engine, - TemporalAntiAliasingOptions const& options) noexcept { - std::uniform_real_distribution uniformDistribution{ 0.0f, 1.0f }; - auto& s = mUniforms.edit(); - const float temporalNoise = uniformDistribution(engine.getRandomEngine()); - s.temporalNoise = options.enabled ? temporalNoise : 0.0f; -} - -void PerViewUniforms::prepareFog(float3 const& cameraPosition, FogOptions const& options) noexcept { - // this can't be too high because we need density / heightFalloff to produce something - // close to fogOptions.density in the fragment shader which use 16-bits floats. - constexpr float epsilon = 0.001f; - const float heightFalloff = std::max(epsilon, options.heightFalloff); - - // precalculate the constant part of density integral and correct for exp2() in the shader - const float density = ((options.density / heightFalloff) * - std::exp(-heightFalloff * (cameraPosition.y - options.height))) - * float(1.0f / F_LN2); - - auto& s = mUniforms.edit(); - s.fogStart = options.distance; - s.fogMaxOpacity = options.maximumOpacity; - s.fogHeight = options.height; - s.fogHeightFalloff = heightFalloff; - s.fogColor = options.color; - s.fogDensity = density; - s.fogInscatteringStart = options.inScatteringStart; - s.fogInscatteringSize = options.inScatteringSize; - s.fogColorFromIbl = options.fogColorFromIbl ? 1.0f : 0.0f; -} - -void PerViewUniforms::prepareSSAO(Handle ssao, - AmbientOcclusionOptions const& options) noexcept { - // High quality sampling is enabled only if AO itself is enabled and upsampling quality is at - // least set to high and of course only if upsampling is needed. - const bool highQualitySampling = options.upsampling >= QualityLevel::HIGH - && options.resolution < 1.0f; - - // LINEAR filtering is only needed when AO is enabled and low-quality upsampling is used. - mSamplers.setSampler(PerViewSib::SSAO, { ssao, { - .filterMag = options.enabled && !highQualitySampling ? - SamplerMagFilter::LINEAR : SamplerMagFilter::NEAREST - }}); - - const float edgeDistance = 1.0f / options.bilateralThreshold; - auto& s = mUniforms.edit(); - s.aoSamplingQualityAndEdgeDistance = - options.enabled ? (highQualitySampling ? edgeDistance : 0.0f) : -1.0f; - s.aoBentNormals = options.enabled && options.bentNormals ? 1.0f : 0.0f; -} - -void PerViewUniforms::prepareBlending(bool needsAlphaChannel) noexcept { - mUniforms.edit().needsAlphaChannel = needsAlphaChannel ? 1.0f : 0.0f; -} - -void PerViewUniforms::prepareSSR(Handle ssr, - float refractionLodOffset, - ScreenSpaceReflectionsOptions const& ssrOptions) noexcept { - - mSamplers.setSampler(PerViewSib::SSR, { ssr, { - .filterMag = SamplerMagFilter::LINEAR, - .filterMin = SamplerMinFilter::LINEAR_MIPMAP_LINEAR - }}); - - auto& s = mUniforms.edit(); - s.refractionLodOffset = refractionLodOffset; - s.ssrDistance = ssrOptions.enabled ? ssrOptions.maxDistance : 0.0f; -} - -void PerViewUniforms::prepareHistorySSR(Handle ssr, - math::mat4f const& historyProjection, - math::mat4f const& uvFromViewMatrix, - ScreenSpaceReflectionsOptions const& ssrOptions) noexcept { - - mSamplers.setSampler(PerViewSib::SSR, { ssr, { - .filterMag = SamplerMagFilter::LINEAR, - .filterMin = SamplerMinFilter::LINEAR - }}); - - auto& s = mUniforms.edit(); - s.ssrReprojection = historyProjection; - s.ssrUvFromViewMatrix = uvFromViewMatrix; - s.ssrThickness = ssrOptions.thickness; - s.ssrBias = ssrOptions.bias; - s.ssrDistance = ssrOptions.enabled ? ssrOptions.maxDistance : 0.0f; - s.ssrStride = ssrOptions.stride; -} - -void PerViewUniforms::prepareStructure(Handle structure) noexcept { - // sampler must be NEAREST - mSamplers.setSampler(PerViewSib::STRUCTURE, { structure, {}}); -} - -void PerViewUniforms::prepareDirectionalLight(FEngine& engine, - float exposure, - float3 const& sceneSpaceDirection, - PerViewUniforms::LightManagerInstance directionalLight) noexcept { - FLightManager& lcm = engine.getLightManager(); - auto& s = mUniforms.edit(); - - const float3 l = -sceneSpaceDirection; // guaranteed normalized - - if (directionalLight.isValid()) { - const float4 colorIntensity = { - lcm.getColor(directionalLight), lcm.getIntensity(directionalLight) * exposure }; - - s.lightDirection = l; - s.lightColorIntensity = colorIntensity; - s.lightChannels = lcm.getLightChannels(directionalLight); - - const bool isSun = lcm.isSunLight(directionalLight); - // The last parameter must be < 0.0f for regular directional lights - float4 sun{ 0.0f, 0.0f, 0.0f, -1.0f }; - if (UTILS_UNLIKELY(isSun && colorIntensity.w > 0.0f)) { - // currently we have only a single directional light, so it's probably likely that it's - // also the Sun. However, conceptually, most directional lights won't be sun lights. - float radius = lcm.getSunAngularRadius(directionalLight); - float haloSize = lcm.getSunHaloSize(directionalLight); - float haloFalloff = lcm.getSunHaloFalloff(directionalLight); - sun.x = std::cos(radius); - sun.y = std::sin(radius); - sun.z = 1.0f / (std::cos(radius * haloSize) - sun.x); - sun.w = haloFalloff; - } - s.sun = sun; - } else { - // Disable the sun if there's no directional light - s.sun = float4{ 0.0f, 0.0f, 0.0f, -1.0f }; - } -} - -void PerViewUniforms::prepareAmbientLight(FEngine& engine, FIndirectLight const& ibl, - float intensity, float exposure) noexcept { - auto& s = mUniforms.edit(); - - // Set up uniforms and sampler for the IBL, guaranteed to be non-null at this point. - float iblRoughnessOneLevel = ibl.getLevelCount() - 1.0f; - s.iblRoughnessOneLevel = iblRoughnessOneLevel; - s.iblLuminance = intensity * exposure; - std::transform(ibl.getSH(), ibl.getSH() + 9, s.iblSH, [](float3 v) { - return float4(v, 0.0f); - }); - - // We always sample from the reflection texture, so provide a dummy texture if necessary. - Handle reflection = ibl.getReflectionHwHandle(); - if (!reflection) { - reflection = engine.getDummyCubemap()->getHwHandle(); - } - mSamplers.setSampler(PerViewSib::IBL_SPECULAR, { - reflection, { - .filterMag = SamplerMagFilter::LINEAR, - .filterMin = SamplerMinFilter::LINEAR_MIPMAP_LINEAR - }}); -} - -void PerViewUniforms::prepareDynamicLights(Froxelizer& froxelizer) noexcept { - auto& s = mUniforms.edit(); - froxelizer.updateUniforms(s); - float f = froxelizer.getLightFar(); - mSamplers.setSampler(PerViewSib::FROXELS, { froxelizer.getFroxelTexture() }); - s.lightFarAttenuationParams = 0.5f * float2{ 10.0f, 10.0f / (f * f) }; -} - -void PerViewUniforms::prepareShadowMapping(bool highPrecision) noexcept { - auto& s = mUniforms.edit(); - constexpr float low = 5.54f; // ~ std::log(std::numeric_limits::max()) * 0.5f; - constexpr float high = 42.0f; // ~ std::log(std::numeric_limits::max()) * 0.5f; - s.vsmExponent = highPrecision ? high : low; -} - -void PerViewUniforms::prepareShadowSampling(PerViewUib& uniforms, - ShadowMappingUniforms const& shadowMappingUniforms) noexcept { - uniforms.cascadeSplits = shadowMappingUniforms.cascadeSplits; - uniforms.ssContactShadowDistance = shadowMappingUniforms.ssContactShadowDistance; - uniforms.directionalShadows = shadowMappingUniforms.directionalShadows; - uniforms.cascades = shadowMappingUniforms.cascades; -} - -void PerViewUniforms::prepareShadowVSM(Handle texture, - ShadowMappingUniforms const& shadowMappingUniforms, - VsmShadowOptions const& options) noexcept { - constexpr float low = 5.54f; // ~ std::log(std::numeric_limits::max()) * 0.5f; - constexpr float high = 42.0f; // ~ std::log(std::numeric_limits::max()) * 0.5f; - SamplerMinFilter filterMin = SamplerMinFilter::LINEAR; - if (options.anisotropy > 0 || options.mipmapping) { - filterMin = SamplerMinFilter::LINEAR_MIPMAP_LINEAR; - } - mSamplers.setSampler(PerViewSib::SHADOW_MAP, { - texture, { - .filterMag = SamplerMagFilter::LINEAR, - .filterMin = filterMin, - .anisotropyLog2 = options.anisotropy, - }}); - auto& s = mUniforms.edit(); - s.shadowSamplingType = SHADOW_SAMPLING_RUNTIME_EVSM; - s.vsmExponent = options.highPrecision ? high : low; - s.vsmDepthScale = options.minVarianceScale * 0.01f * s.vsmExponent; - s.vsmLightBleedReduction = options.lightBleedReduction; - PerViewUniforms::prepareShadowSampling(s, shadowMappingUniforms); -} - -void PerViewUniforms::prepareShadowPCF(Handle texture, - ShadowMappingUniforms const& shadowMappingUniforms) noexcept { - mSamplers.setSampler(PerViewSib::SHADOW_MAP, { - texture, { - .filterMag = SamplerMagFilter::LINEAR, - .filterMin = SamplerMinFilter::LINEAR, - .compareMode = SamplerCompareMode::COMPARE_TO_TEXTURE, - .compareFunc = SamplerCompareFunc::GE - }}); - auto& s = mUniforms.edit(); - s.shadowSamplingType = SHADOW_SAMPLING_RUNTIME_PCF; - PerViewUniforms::prepareShadowSampling(s, shadowMappingUniforms); -} - -void PerViewUniforms::prepareShadowDPCF(Handle texture, - ShadowMappingUniforms const& shadowMappingUniforms, - SoftShadowOptions const& options) noexcept { - mSamplers.setSampler(PerViewSib::SHADOW_MAP, { texture, {}}); - auto& s = mUniforms.edit(); - s.shadowSamplingType = SHADOW_SAMPLING_RUNTIME_DPCF; - s.shadowPenumbraRatioScale = options.penumbraRatioScale; - PerViewUniforms::prepareShadowSampling(s, shadowMappingUniforms); -} - -void PerViewUniforms::prepareShadowPCSS(Handle texture, - ShadowMappingUniforms const& shadowMappingUniforms, - SoftShadowOptions const& options) noexcept { - mSamplers.setSampler(PerViewSib::SHADOW_MAP, { texture, {}}); - auto& s = mUniforms.edit(); - s.shadowSamplingType = SHADOW_SAMPLING_RUNTIME_PCSS; - s.shadowPenumbraRatioScale = options.penumbraRatioScale; - PerViewUniforms::prepareShadowSampling(s, shadowMappingUniforms); -} - -void PerViewUniforms::commit(backend::DriverApi& driver) noexcept { - if (mUniforms.isDirty()) { - driver.updateBufferObject(mUniformBufferHandle, mUniforms.toBufferDescriptor(driver), 0); - } - if (mSamplers.isDirty()) { - driver.updateSamplerGroup(mSamplerGroupHandle, mSamplers.toBufferDescriptor(driver)); - } -} - -void PerViewUniforms::bind(backend::DriverApi& driver) noexcept { - driver.bindUniformBuffer(+UniformBindingPoints::PER_VIEW, mUniformBufferHandle); - driver.bindSamplers(+SamplerBindingPoints::PER_VIEW, mSamplerGroupHandle); -} - -void PerViewUniforms::unbindSamplers() noexcept { - auto& samplerGroup = mSamplers; - samplerGroup.clearSampler(PerViewSib::SSAO); - samplerGroup.clearSampler(PerViewSib::SSR); - samplerGroup.clearSampler(PerViewSib::STRUCTURE); - samplerGroup.clearSampler(PerViewSib::SHADOW_MAP); -} - -} // namespace filament - diff --git a/filament/src/PerViewUniforms.h b/filament/src/PerViewUniforms.h deleted file mode 100644 index ba33e788a40..00000000000 --- a/filament/src/PerViewUniforms.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef TNT_FILAMENT_PERVIEWUNIFORMS_H -#define TNT_FILAMENT_PERVIEWUNIFORMS_H - -#include - -#include -#include - -#include "TypedUniformBuffer.h" - -#include - -#include - -#include - -namespace filament { - -struct AmbientOcclusionOptions; -struct DynamicResolutionOptions; -struct FogOptions; -struct ScreenSpaceReflectionsOptions; -struct SoftShadowOptions; -struct TemporalAntiAliasingOptions; -struct VsmShadowOptions; - -struct CameraInfo; -struct ShadowMappingUniforms; - -class FEngine; -class FIndirectLight; -class Froxelizer; -class LightManager; - -/* - * PerViewUniforms manages the UBO and samplers needed to render the color passes. Internally it - * holds onto handles for the PER_VIEW UBO and SamplerGroup. This class maintains a shadow copy - * of the UBO/sampler data, so it is possible to partially update it between commits. - */ -class PerViewUniforms { - - using LightManagerInstance = utils::EntityInstance; - using TextureHandle = backend::Handle; - - static constexpr uint32_t const SHADOW_SAMPLING_RUNTIME_PCF = 0u; - static constexpr uint32_t const SHADOW_SAMPLING_RUNTIME_EVSM = 1u; - static constexpr uint32_t const SHADOW_SAMPLING_RUNTIME_DPCF = 2u; - static constexpr uint32_t const SHADOW_SAMPLING_RUNTIME_PCSS = 3u; - -public: - explicit PerViewUniforms(FEngine& engine) noexcept; - - void terminate(backend::DriverApi& driver); - - void prepareCamera(FEngine& engine, const CameraInfo& camera) noexcept; - void prepareLodBias(float bias) noexcept; - - /* - * @param viewport viewport (should be same as RenderPassParams::viewport) - * @param xoffset horizontal rendering offset *within* the viewport. - * Non-zero when we have guard bands. - * @param yoffset vertical rendering offset *within* the viewport. - * Non-zero when we have guard bands. - */ - void prepareViewport( - const filament::Viewport& physicalViewport, - const filament::Viewport& logicalViewport) noexcept; - - void prepareTime(FEngine& engine, math::float4 const& userTime) noexcept; - void prepareTemporalNoise(FEngine& engine, TemporalAntiAliasingOptions const& options) noexcept; - void prepareExposure(float ev100) noexcept; - void prepareFog(math::float3 const& cameraPosition, FogOptions const& options) noexcept; - void prepareStructure(TextureHandle structure) noexcept; - void prepareSSAO(TextureHandle ssao, AmbientOcclusionOptions const& options) noexcept; - void prepareBlending(bool needsAlphaChannel) noexcept; - - // screen-space reflection and/or refraction (SSR) - void prepareSSR(TextureHandle ssr, - float refractionLodOffset, - ScreenSpaceReflectionsOptions const& ssrOptions) noexcept; - - void prepareHistorySSR(TextureHandle ssr, - math::mat4f const& historyProjection, - math::mat4f const& uvFromViewMatrix, - ScreenSpaceReflectionsOptions const& ssrOptions) noexcept; - - void prepareShadowMapping(bool highPrecision) noexcept; - - void prepareDirectionalLight(FEngine& engine, float exposure, - math::float3 const& sceneSpaceDirection, LightManagerInstance instance) noexcept; - - void prepareAmbientLight(FEngine& engine, - FIndirectLight const& ibl, float intensity, float exposure) noexcept; - - void prepareDynamicLights(Froxelizer& froxelizer) noexcept; - - void prepareShadowVSM(TextureHandle texture, - ShadowMappingUniforms const& shadowMappingUniforms, - VsmShadowOptions const& options) noexcept; - - void prepareShadowPCF(TextureHandle texture, - ShadowMappingUniforms const& shadowMappingUniforms) noexcept; - - void prepareShadowDPCF(TextureHandle texture, - ShadowMappingUniforms const& shadowMappingUniforms, - SoftShadowOptions const& options) noexcept; - - void prepareShadowPCSS(TextureHandle texture, - ShadowMappingUniforms const& shadowMappingUniforms, - SoftShadowOptions const& options) noexcept; - - // update local data into GPU UBO - void commit(backend::DriverApi& driver) noexcept; - - // bind this UBO - void bind(backend::DriverApi& driver) noexcept; - - void unbindSamplers() noexcept; - -private: - TypedUniformBuffer mUniforms; - backend::SamplerGroup mSamplers; - backend::Handle mUniformBufferHandle; - backend::Handle mSamplerGroupHandle; - static void prepareShadowSampling(PerViewUib& uniforms, - ShadowMappingUniforms const& shadowMappingUniforms) noexcept; -}; - -} // namespace filament - -#endif //TNT_FILAMENT_PERVIEWUNIFORMS_H diff --git a/filament/src/PostProcessManager.cpp b/filament/src/PostProcessManager.cpp index 4eb0ef802bf..b7a51aae0bc 100644 --- a/filament/src/PostProcessManager.cpp +++ b/filament/src/PostProcessManager.cpp @@ -26,11 +26,16 @@ #include "details/Engine.h" +#include "ds/SsrPassDescriptorSet.h" +#include "ds/TypedUniformBuffer.h" + #include "fg/FrameGraph.h" +#include "fg/FrameGraphId.h" #include "fg/FrameGraphResources.h" +#include "fg/FrameGraphTexture.h" #include "fsr.h" -#include "PerViewUniforms.h" +#include "FrameHistory.h" #include "RenderPass.h" #include "details/Camera.h" @@ -38,16 +43,53 @@ #include "details/Material.h" #include "details/MaterialInstance.h" #include "details/Texture.h" +#include "details/VertexBuffer.h" #include "generated/resources/materials.h" +#include #include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include #include #include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include #include +#include +#include +#include #include +#include +#include +#include +#include + +#include +#include namespace filament { @@ -58,7 +100,7 @@ using namespace backend; static constexpr uint8_t kMaxBloomLevels = 12u; static_assert(kMaxBloomLevels >= 3, "We require at least 3 bloom levels"); -constexpr static float halton(unsigned int i, unsigned int b) noexcept { +constexpr static float halton(unsigned int i, unsigned int const b) noexcept { // skipping a bunch of entries makes the average of the sequence closer to 0.5 i += 409; float f = 1.0f; @@ -73,52 +115,39 @@ constexpr static float halton(unsigned int i, unsigned int b) noexcept { // ------------------------------------------------------------------------------------------------ -PostProcessManager::PostProcessMaterial::PostProcessMaterial() noexcept { - mMaterial = nullptr; // aliased to mData - mData = nullptr; -} - -PostProcessManager::PostProcessMaterial::PostProcessMaterial(FEngine& engine, - uint8_t const* data, int size) noexcept - : PostProcessMaterial() { - mData = data; // aliased to mMaterial - mSize = size; +PostProcessManager::PostProcessMaterial::PostProcessMaterial(StaticMaterialInfo const& info) noexcept + : mConstants(info.constants.begin(), info.constants.size()) { + mData = info.data; // aliased to mMaterial + mSize = info.size; } PostProcessManager::PostProcessMaterial::PostProcessMaterial( - PostProcessManager::PostProcessMaterial&& rhs) noexcept - : PostProcessMaterial() { + PostProcessMaterial&& rhs) noexcept + : mData(nullptr), mSize(0), mConstants(rhs.mConstants) { using namespace std; swap(mData, rhs.mData); // aliased to mMaterial swap(mSize, rhs.mSize); - swap(mHasMaterial, rhs.mHasMaterial); } PostProcessManager::PostProcessMaterial& PostProcessManager::PostProcessMaterial::operator=( - PostProcessManager::PostProcessMaterial&& rhs) noexcept { + PostProcessMaterial&& rhs) noexcept { if (this != &rhs) { using namespace std; swap(mData, rhs.mData); // aliased to mMaterial swap(mSize, rhs.mSize); - swap(mHasMaterial, rhs.mHasMaterial); + swap(mConstants, rhs.mConstants); } return *this; } -PostProcessManager::PostProcessMaterial::~PostProcessMaterial() { - assert_invariant(!mHasMaterial || mMaterial == nullptr); +PostProcessManager::PostProcessMaterial::~PostProcessMaterial() noexcept { + assert_invariant((!mSize && !mMaterial) || (mSize && mData)); } void PostProcessManager::PostProcessMaterial::terminate(FEngine& engine) noexcept { - if (mHasMaterial) { + if (!mSize) { engine.destroy(mMaterial); -// this is only needed for validation in the dtor in debug builds -#ifndef NDEBUG mMaterial = nullptr; - mHasMaterial = false; - } else { - mData = nullptr; -#endif } } @@ -126,89 +155,122 @@ UTILS_NOINLINE void PostProcessManager::PostProcessMaterial::loadMaterial(FEngine& engine) const noexcept { // TODO: After all materials using this class have been converted to the post-process material // domain, load both OPAQUE and TRANSPARENT variants here. - mHasMaterial = true; - mMaterial = downcast(Material::Builder().package(mData, mSize).build(engine)); + auto builder = Material::Builder(); + builder.package(mData, mSize); + for (auto const& constant: mConstants) { + std::visit([&](auto&& arg) { + builder.constant(constant.name.data(), constant.name.size(), arg); + }, constant.value); + } + mMaterial = downcast(builder.build(engine)); + mSize = 0; // material loaded } UTILS_NOINLINE -FMaterial* PostProcessManager::PostProcessMaterial::getMaterial(FEngine& engine) const noexcept { - if (UTILS_UNLIKELY(!mHasMaterial)) { +FMaterial* PostProcessManager::PostProcessMaterial::getMaterial(FEngine& engine, + PostProcessVariant variant) const noexcept { + if (UTILS_UNLIKELY(mSize)) { loadMaterial(engine); } + mMaterial->prepareProgram(Variant{ Variant::type_t(variant) }); return mMaterial; } UTILS_NOINLINE -PipelineState PostProcessManager::PostProcessMaterial::getPipelineState( - FEngine& engine, Variant::type_t variantKey) const noexcept { - FMaterial* const material = getMaterial(engine); - material->prepareProgram(Variant{ variantKey }); - return { - .program = material->getProgram(Variant{variantKey}), - .rasterState = material->getRasterState(), - .scissor = material->getDefaultInstance()->getScissor() - }; +FMaterialInstance* PostProcessManager::PostProcessMaterial::getMaterialInstance( + FMaterial const* const ma) noexcept { + // TODO: we need to move away from the default instance + return const_cast(ma)->getDefaultInstance(); } UTILS_NOINLINE -FMaterialInstance* PostProcessManager::PostProcessMaterial::getMaterialInstance(FEngine& engine) const noexcept { - FMaterial* const material = getMaterial(engine); - return material->getDefaultInstance(); +FMaterialInstance* PostProcessManager::PostProcessMaterial::getMaterialInstance(FEngine& engine, + PostProcessMaterial const& material, PostProcessVariant const variant) noexcept { + FMaterial const* ma = material.getMaterial(engine, variant); + return getMaterialInstance(ma); } // ------------------------------------------------------------------------------------------------ -const math::float2 PostProcessManager::sHaltonSamples[16] = { - { filament::halton( 0, 2), filament::halton( 0, 3) }, - { filament::halton( 1, 2), filament::halton( 1, 3) }, - { filament::halton( 2, 2), filament::halton( 2, 3) }, - { filament::halton( 3, 2), filament::halton( 3, 3) }, - { filament::halton( 4, 2), filament::halton( 4, 3) }, - { filament::halton( 5, 2), filament::halton( 5, 3) }, - { filament::halton( 6, 2), filament::halton( 6, 3) }, - { filament::halton( 7, 2), filament::halton( 7, 3) }, - { filament::halton( 8, 2), filament::halton( 8, 3) }, - { filament::halton( 9, 2), filament::halton( 9, 3) }, - { filament::halton(10, 2), filament::halton(10, 3) }, - { filament::halton(11, 2), filament::halton(11, 3) }, - { filament::halton(12, 2), filament::halton(12, 3) }, - { filament::halton(13, 2), filament::halton(13, 3) }, - { filament::halton(14, 2), filament::halton(14, 3) }, - { filament::halton(15, 2), filament::halton(15, 3) } -}; +const PostProcessManager::JitterSequence<4> PostProcessManager::sRGSS4 = {{{ + { 0.625f, 0.125f }, + { 0.125f, 0.375f }, + { 0.875f, 0.625f }, + { 0.375f, 0.875f } +}}}; + +const PostProcessManager::JitterSequence<4> PostProcessManager::sUniformHelix4 = {{{ + { 0.25f, 0.25f }, + { 0.75f, 0.75f }, + { 0.25f, 0.75f }, + { 0.75f, 0.25f }, +}}}; + +template +static constexpr auto halton() { + std::array h; + for (size_t i = 0; i < COUNT; i++) { + h[i] = { + halton(i, 2), + halton(i, 3) }; + } + return h; +} + +const PostProcessManager::JitterSequence<32> + PostProcessManager::sHaltonSamples = { halton<32>() }; PostProcessManager::PostProcessManager(FEngine& engine) noexcept : mEngine(engine), - mWorkaroundSplitEasu(false), - mWorkaroundAllowReadOnlyAncillaryFeedbackLoop(false) { + mWorkaroundSplitEasu(false), + mWorkaroundAllowReadOnlyAncillaryFeedbackLoop(false) { + // don't use Engine here, it's not fully initialized yet } PostProcessManager::~PostProcessManager() noexcept = default; +void PostProcessManager::setFrameUniforms(DriverApi& driver, + TypedUniformBuffer& uniforms) noexcept { + mPostProcessDescriptorSet.setFrameUniforms(driver, uniforms); + mSsrPassDescriptorSet.setFrameUniforms(uniforms); +} + +void PostProcessManager::bindPostProcessDescriptorSet(DriverApi& driver) const noexcept { + mPostProcessDescriptorSet.bind(driver); +} + UTILS_NOINLINE -void PostProcessManager::registerPostProcessMaterial(std::string_view name, uint8_t const* data, int size) { - mMaterialRegistry.try_emplace(name, mEngine, data, size); +void PostProcessManager::registerPostProcessMaterial(std::string_view const name, + StaticMaterialInfo const& info) { + mMaterialRegistry.try_emplace(name, info); } UTILS_NOINLINE -PostProcessManager::PostProcessMaterial& PostProcessManager::getPostProcessMaterial(std::string_view name) noexcept { - assert_invariant(mMaterialRegistry.find(name) != mMaterialRegistry.end()); - return mMaterialRegistry[name]; +PostProcessManager::PostProcessMaterial& PostProcessManager::getPostProcessMaterial( + std::string_view const name) noexcept { + auto pos = mMaterialRegistry.find(name); + assert_invariant(pos != mMaterialRegistry.end()); + return pos.value(); } -#define MATERIAL(n) MATERIALS_ ## n ## _DATA, MATERIALS_ ## n ## _SIZE +// StaticMaterialInfo::ConstantInfo destructor is called during shut-down, to avoid side-effect +// we ensure it's trivially destructible +static_assert(std::is_trivially_destructible_v); -struct MaterialInfo { - std::string_view name; - uint8_t const* data; - int size; +#define MATERIAL(n) MATERIALS_ ## n ## _DATA, size_t(MATERIALS_ ## n ## _SIZE) + +static const PostProcessManager::StaticMaterialInfo sMaterialListFeatureLevel0[] = { + { "blitLow", MATERIAL(BLITLOW) }, }; -static const MaterialInfo sMaterialList[] = { +static const PostProcessManager::StaticMaterialInfo sMaterialList[] = { { "bilateralBlur", MATERIAL(BILATERALBLUR) }, { "bilateralBlurBentNormals", MATERIAL(BILATERALBLURBENTNORMALS) }, - { "blitLow", MATERIAL(BLITLOW) }, + { "blitArray", MATERIAL(BLITARRAY) }, + { "blitDepth", MATERIAL(BLITDEPTH) }, { "bloomDownsample", MATERIAL(BLOOMDOWNSAMPLE) }, + { "bloomDownsample2x", MATERIAL(BLOOMDOWNSAMPLE2X) }, + { "bloomDownsample9", MATERIAL(BLOOMDOWNSAMPLE9) }, { "bloomUpsample", MATERIAL(BLOOMUPSAMPLE) }, { "colorGrading", MATERIAL(COLORGRADING) }, { "colorGradingAsSubpass", MATERIAL(COLORGRADINGASSUBPASS) }, @@ -227,20 +289,31 @@ static const MaterialInfo sMaterialList[] = { { "mipmapDepth", MATERIAL(MIPMAPDEPTH) }, { "sao", MATERIAL(SAO) }, { "saoBentNormals", MATERIAL(SAOBENTNORMALS) }, - { "separableGaussianBlur1", MATERIAL(SEPARABLEGAUSSIANBLUR1) }, - { "separableGaussianBlur2", MATERIAL(SEPARABLEGAUSSIANBLUR2) }, - { "separableGaussianBlur3", MATERIAL(SEPARABLEGAUSSIANBLUR3) }, - { "separableGaussianBlur4", MATERIAL(SEPARABLEGAUSSIANBLUR4) }, - { "separableGaussianBlur1L", MATERIAL(SEPARABLEGAUSSIANBLUR1L) }, - { "separableGaussianBlur2L", MATERIAL(SEPARABLEGAUSSIANBLUR2L) }, - { "separableGaussianBlur3L", MATERIAL(SEPARABLEGAUSSIANBLUR3L) }, - { "separableGaussianBlur4L", MATERIAL(SEPARABLEGAUSSIANBLUR4L) }, + { "separableGaussianBlur1", MATERIAL(SEPARABLEGAUSSIANBLUR), + { {"arraySampler", false}, {"componentCount", 1} } }, + { "separableGaussianBlur1L", MATERIAL(SEPARABLEGAUSSIANBLUR), + { {"arraySampler", true }, {"componentCount", 1} } }, + { "separableGaussianBlur2", MATERIAL(SEPARABLEGAUSSIANBLUR), + { {"arraySampler", false}, {"componentCount", 2} } }, + { "separableGaussianBlur2L", MATERIAL(SEPARABLEGAUSSIANBLUR), + { {"arraySampler", true }, {"componentCount", 2} } }, + { "separableGaussianBlur3", MATERIAL(SEPARABLEGAUSSIANBLUR), + { {"arraySampler", false}, {"componentCount", 3} } }, + { "separableGaussianBlur3L", MATERIAL(SEPARABLEGAUSSIANBLUR), + { {"arraySampler", true }, {"componentCount", 3} } }, + { "separableGaussianBlur4", MATERIAL(SEPARABLEGAUSSIANBLUR), + { {"arraySampler", false}, {"componentCount", 4} } }, + { "separableGaussianBlur4L", MATERIAL(SEPARABLEGAUSSIANBLUR), + { {"arraySampler", true }, {"componentCount", 4} } }, { "taa", MATERIAL(TAA) }, { "vsmMipmap", MATERIAL(VSMMIPMAP) }, { "fsr_easu", MATERIAL(FSR_EASU) }, { "fsr_easu_mobile", MATERIAL(FSR_EASU_MOBILE) }, { "fsr_easu_mobileF", MATERIAL(FSR_EASU_MOBILEF) }, { "fsr_rcas", MATERIAL(FSR_RCAS) }, + { "debugShadowCascades", MATERIAL(DEBUGSHADOWCASCADES) }, + { "resolveDepth", MATERIAL(RESOLVEDEPTH) }, + { "shadowmap", MATERIAL(SHADOWMAP) }, }; void PostProcessManager::init() noexcept { @@ -253,94 +326,148 @@ void PostProcessManager::init() noexcept { //debugRegistry.registerProperty("d.ssao.kernelSize", &engine.debug.ssao.kernelSize); //debugRegistry.registerProperty("d.ssao.stddev", &engine.debug.ssao.stddev); + mFullScreenQuadRph = engine.getFullScreenRenderPrimitive(); + mFullScreenQuadVbih = engine.getFullScreenVertexBuffer()->getVertexBufferInfoHandle(); + mPerRenderableDslh = engine.getPerRenderableDescriptorSetLayout().getHandle(); + + mSsrPassDescriptorSet.init(engine); + mPostProcessDescriptorSet.init(engine); + mWorkaroundSplitEasu = driver.isWorkaroundNeeded(Workaround::SPLIT_EASU); mWorkaroundAllowReadOnlyAncillaryFeedbackLoop = driver.isWorkaroundNeeded(Workaround::ALLOW_READ_ONLY_ANCILLARY_FEEDBACK_LOOP); - #pragma nounroll - for (auto const& info : sMaterialList) { - registerPostProcessMaterial(info.name, info.data, info.size); + UTILS_NOUNROLL + for (auto const& info: sMaterialListFeatureLevel0) { + registerPostProcessMaterial(info.name, info); } - mStarburstTexture = driver.createTexture(SamplerType::SAMPLER_2D, 1, - TextureFormat::R8, 1, 256, 1, 1, TextureUsage::DEFAULT); + if (mEngine.getActiveFeatureLevel() >= FeatureLevel::FEATURE_LEVEL_1) { + UTILS_NOUNROLL + for (auto const& info: sMaterialList) { + registerPostProcessMaterial(info.name, info); + } + } - PixelBufferDescriptor dataStarburst(driver.allocate(256), 256, PixelDataFormat::R, PixelDataType::UBYTE); - std::generate_n((uint8_t*)dataStarburst.buffer, 256, - [&dist = mUniformDistribution, &gen = mEngine.getRandomEngine()]() { - float r = 0.5f + 0.5f * dist(gen); - return uint8_t(r * 255.0f); - }); + if (engine.hasFeatureLevel(FeatureLevel::FEATURE_LEVEL_1)) { + mStarburstTexture = driver.createTexture(SamplerType::SAMPLER_2D, 1, + TextureFormat::R8, 1, 256, 1, 1, TextureUsage::DEFAULT); + + PixelBufferDescriptor dataStarburst(driver.allocate(256), 256, + PixelDataFormat::R, PixelDataType::UBYTE); + std::generate_n((uint8_t*)dataStarburst.buffer, 256, + [&dist = mUniformDistribution, &gen = mEngine.getRandomEngine()]() { + float const r = 0.5f + 0.5f * dist(gen); + return uint8_t(r * 255.0f); + }); - driver.update3DImage(mStarburstTexture, - 0, 0, 0, 0, 256, 1, 1, - std::move(dataStarburst)); + driver.update3DImage(mStarburstTexture, + 0, 0, 0, 0, 256, 1, 1, + std::move(dataStarburst)); + } } void PostProcessManager::terminate(DriverApi& driver) noexcept { FEngine& engine = mEngine; driver.destroyTexture(mStarburstTexture); + auto first = mMaterialRegistry.begin(); - auto last = mMaterialRegistry.end(); + auto const last = mMaterialRegistry.end(); while (first != last) { first.value().terminate(engine); ++first; } + + mPostProcessDescriptorSet.terminate(engine.getDescriptorSetLayoutFactory(), driver); + mSsrPassDescriptorSet.terminate(driver); } -backend::Handle PostProcessManager::getOneTexture() const { +Handle PostProcessManager::getOneTexture() const { return mEngine.getOneTexture(); } -backend::Handle PostProcessManager::getZeroTexture() const { +Handle PostProcessManager::getZeroTexture() const { return mEngine.getZeroTexture(); } -backend::Handle PostProcessManager::getOneTextureArray() const { +Handle PostProcessManager::getOneTextureArray() const { return mEngine.getOneTextureArray(); } -backend::Handle PostProcessManager::getZeroTextureArray() const { +Handle PostProcessManager::getZeroTextureArray() const { return mEngine.getZeroTextureArray(); } UTILS_NOINLINE -void PostProcessManager::render(FrameGraphResources::RenderPassInfo const& out, - backend::PipelineState const& pipeline, - DriverApi& driver) const noexcept { +PipelineState PostProcessManager::getPipelineState( + FMaterial const* const ma, PostProcessVariant variant) const noexcept { + return { + .program = ma->getProgram(Variant{ Variant::type_t(variant) }), + .vertexBufferInfo = mFullScreenQuadVbih, + .pipelineLayout = { + .setLayout = { + ma->getPerViewDescriptorSetLayout().getHandle(), + mPerRenderableDslh, + ma->getDescriptorSetLayout().getHandle() + }}, + .rasterState = ma->getRasterState() + }; +} +UTILS_NOINLINE +void PostProcessManager::renderFullScreenQuad( + FrameGraphResources::RenderPassInfo const& out, + PipelineState const& pipeline, + DriverApi& driver) const noexcept { assert_invariant( ((out.params.readOnlyDepthStencil & RenderPassParams::READONLY_DEPTH) - && !pipeline.rasterState.depthWrite) + && !pipeline.rasterState.depthWrite) || !(out.params.readOnlyDepthStencil & RenderPassParams::READONLY_DEPTH)); + driver.beginRenderPass(out.target, out.params); + driver.draw(pipeline, mFullScreenQuadRph, 0, 3, 1); + driver.endRenderPass(); +} - FEngine& engine = mEngine; - Handle fullScreenRenderPrimitive = engine.getFullScreenRenderPrimitive(); +UTILS_NOINLINE +void PostProcessManager::renderFullScreenQuadWithScissor( + FrameGraphResources::RenderPassInfo const& out, + PipelineState const& pipeline, + backend::Viewport const scissor, + DriverApi& driver) const noexcept { + assert_invariant( + ((out.params.readOnlyDepthStencil & RenderPassParams::READONLY_DEPTH) + && !pipeline.rasterState.depthWrite) + || !(out.params.readOnlyDepthStencil & RenderPassParams::READONLY_DEPTH)); driver.beginRenderPass(out.target, out.params); - driver.draw(pipeline, fullScreenRenderPrimitive, 1); + driver.scissor(scissor); + driver.draw(pipeline, mFullScreenQuadRph, 0, 3, 1); driver.endRenderPass(); } UTILS_NOINLINE -void PostProcessManager::commitAndRender(FrameGraphResources::RenderPassInfo const& out, - PostProcessMaterial const& material, uint8_t variant, DriverApi& driver) const noexcept { - FMaterialInstance* const mi = material.getMaterialInstance(mEngine); +void PostProcessManager::commitAndRenderFullScreenQuad(DriverApi& driver, + FrameGraphResources::RenderPassInfo const& out, FMaterialInstance const* mi, + PostProcessVariant const variant) const noexcept { mi->commit(driver); mi->use(driver); - render(out, material.getPipelineState(mEngine, variant), driver); -} + FMaterial const* const ma = mi->getMaterial(); + PipelineState const pipeline = getPipelineState(ma, variant); + + assert_invariant( + ((out.params.readOnlyDepthStencil & RenderPassParams::READONLY_DEPTH) + && !pipeline.rasterState.depthWrite) + || !(out.params.readOnlyDepthStencil & RenderPassParams::READONLY_DEPTH)); -UTILS_ALWAYS_INLINE -void PostProcessManager::commitAndRender(FrameGraphResources::RenderPassInfo const& out, - PostProcessMaterial const& material, DriverApi& driver) const noexcept { - commitAndRender(out, material, 0, driver); + driver.beginRenderPass(out.target, out.params); + driver.draw(pipeline, mFullScreenQuadRph, 0, 3, 1); + driver.endRenderPass(); } // ------------------------------------------------------------------------------------------------ PostProcessManager::StructurePassOutput PostProcessManager::structure(FrameGraph& fg, - RenderPass const& pass, uint8_t structureRenderFlags, + RenderPassBuilder const& passBuilder, uint8_t const structureRenderFlags, uint32_t width, uint32_t height, StructurePassConfig const& config) noexcept { @@ -356,31 +483,29 @@ PostProcessManager::StructurePassOutput PostProcessManager::structure(FrameGraph }; // sanitize a bit the user provided scaling factor - width = std::max(32u, (uint32_t)std::ceil(width * scale)); - height = std::max(32u, (uint32_t)std::ceil(height * scale)); + width = std::max(32u, uint32_t(std::ceil(float(width) * scale))); + height = std::max(32u, uint32_t(std::ceil(float(height) * scale))); // We limit the lowest lod size to 32 pixels (which is where the -5 comes from) const size_t levelCount = std::min(8, FTexture::maxLevelCount(width, height) - 5); assert_invariant(levelCount >= 1); // generate depth pass at the requested resolution - auto& structurePass = fg.addPass("Structure Pass", + auto const& structurePass = fg.addPass("Structure Pass", [&](FrameGraph::Builder& builder, auto& data) { + bool const isES2 = mEngine.getDriverApi().getFeatureLevel() == FeatureLevel::FEATURE_LEVEL_0; data.depth = builder.createTexture("Structure Buffer", { .width = width, .height = height, .levels = uint8_t(levelCount), - .format = TextureFormat::DEPTH32F }); + .format = isES2 ? TextureFormat::DEPTH24 : TextureFormat::DEPTH32F }); - // workaround: since we have levels, this implies SAMPLEABLE (because of the gl - // backend, which implements non-sampleables with renderbuffers, which don't have levels). - // (should the gl driver revert to textures, in that case?) data.depth = builder.write(data.depth, - FrameGraphTexture::Usage::DEPTH_ATTACHMENT | FrameGraphTexture::Usage::SAMPLEABLE); + FrameGraphTexture::Usage::DEPTH_ATTACHMENT); if (config.picking) { data.picking = builder.createTexture("Picking Buffer", { .width = width, .height = height, - .format = TextureFormat::RG32UI }); + .format = isES2 ? TextureFormat::RGBA8 : TextureFormat::RG32F }); data.picking = builder.write(data.picking, FrameGraphTexture::Usage::COLOR_ATTACHMENT); @@ -391,20 +516,25 @@ PostProcessManager::StructurePassOutput PostProcessManager::structure(FrameGraph .clearFlags = TargetBufferFlags::COLOR0 | TargetBufferFlags::DEPTH }); }, - [=, renderPass = pass](FrameGraphResources const& resources, - auto const& data, DriverApi& driver) mutable { + [=, passBuilder = passBuilder](FrameGraphResources const& resources, + auto const&, DriverApi& driver) mutable { Variant structureVariant(Variant::DEPTH_VARIANT); structureVariant.setPicking(config.picking); - auto out = resources.getRenderPassInfo(); - renderPass.setRenderFlags(structureRenderFlags); - renderPass.setVariant(structureVariant); - renderPass.appendCommands(mEngine, RenderPass::CommandTypeFlags::SSAO); - renderPass.sortCommands(mEngine); - renderPass.execute(mEngine, resources.getPassName(), out.target, out.params); + bindPostProcessDescriptorSet(driver); + + passBuilder.renderFlags(structureRenderFlags); + passBuilder.variant(structureVariant); + passBuilder.commandTypeFlags(RenderPass::CommandTypeFlags::SSAO); + + RenderPass const pass{ passBuilder.build(mEngine, driver) }; + auto const out = resources.getRenderPassInfo(); + driver.beginRenderPass(out.target, out.params); + pass.getExecutor().execute(mEngine, driver); + driver.endRenderPass(); }); - auto depth = structurePass->depth; + auto const depth = structurePass->depth; /* * create depth mipmap chain @@ -412,7 +542,6 @@ PostProcessManager::StructurePassOutput PostProcessManager::structure(FrameGraph struct StructureMipmapData { FrameGraphId depth; - uint32_t rt[8]; }; fg.addPass("StructureMipmap", @@ -423,24 +552,33 @@ PostProcessManager::StructurePassOutput PostProcessManager::structure(FrameGraph .level = uint8_t(i) }); out = builder.write(out, FrameGraphTexture::Usage::DEPTH_ATTACHMENT); - data.rt[i - 1] = builder.declareRenderPass("Structure mip target", { + builder.declareRenderPass("Structure mip target", { .attachments = { .depth = out } }); } }, [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); + auto in = resources.getTexture(data.depth); auto& material = getPostProcessMaterial("mipmapDepth"); - FMaterialInstance* const mi = material.getMaterialInstance(mEngine); - mi->setParameter("depth", in, { .filterMin = SamplerMinFilter::NEAREST_MIPMAP_NEAREST }); + FMaterial const* const ma = material.getMaterial(mEngine); + auto pipeline = getPipelineState(ma); + + FMaterialInstance* const mi = PostProcessMaterial::getMaterialInstance(ma); + // The first mip already exists, so we process n-1 lods for (size_t level = 0; level < levelCount - 1; level++) { auto out = resources.getRenderPassInfo(level); - driver.setMinMaxLevels(in, level, level); - mi->setParameter("level", uint32_t(level)); - commitAndRender(out, material, driver); + + auto th = driver.createTextureView(in, level, 1); + mi->setParameter("depth", th, { + .filterMin = SamplerMinFilter::NEAREST_MIPMAP_NEAREST }); + mi->commit(driver); + mi->use(driver); + renderFullScreenQuad(out, pipeline, driver); + driver.destroyTexture(th); } - driver.setMinMaxLevels(in, 0, levelCount - 1); }); return { depth, structurePass->picking }; @@ -449,11 +587,10 @@ PostProcessManager::StructurePassOutput PostProcessManager::structure(FrameGraph // ------------------------------------------------------------------------------------------------ FrameGraphId PostProcessManager::ssr(FrameGraph& fg, - RenderPass const& pass, + RenderPassBuilder const& passBuilder, FrameHistory const& frameHistory, CameraInfo const& cameraInfo, - PerViewUniforms& uniforms, - FrameGraphId structure, + FrameGraphId const structure, ScreenSpaceReflectionsOptions const& options, FrameGraphTexture::Descriptor const& desc) noexcept { @@ -468,23 +605,20 @@ FrameGraphId PostProcessManager::ssr(FrameGraph& fg, FrameGraphId history; }; - mat4f historyProjection; - FrameGraphId history; - - FrameHistoryEntry const& entry = frameHistory[0]; - if (entry.ssr.color.handle) { - // the first time around we may not have a history buffer - history = fg.import("SSR history", entry.ssr.desc, - FrameGraphTexture::Usage::SAMPLEABLE, entry.ssr.color); - historyProjection = entry.ssr.projection; + auto const& previous = frameHistory.getPrevious().ssr; + if (!previous.color.handle) { + return {}; } + FrameGraphId const history = fg.import("SSR history", previous.desc, + FrameGraphTexture::Usage::SAMPLEABLE, previous.color); + mat4 const& historyProjection = previous.projection; auto const& uvFromClipMatrix = mEngine.getUvFromClipMatrix(); - auto& ssrPass = fg.addPass("SSR Pass", + auto const& ssrPass = fg.addPass("SSR Pass", [&](FrameGraph::Builder& builder, auto& data) { - // create our reflection buffer. We need an alpha channel, so we have to use RGBA16F + // Create our reflection buffer. We need an alpha channel, so we have to use RGBA16F data.reflections = builder.createTexture("Reflections Texture", { .width = desc.width, .height = desc.height, .format = TextureFormat::RGBA16F }); @@ -515,46 +649,50 @@ FrameGraphId PostProcessManager::ssr(FrameGraph& fg, }, [this, projection = cameraInfo.projection, userViewMatrix = cameraInfo.getUserViewMatrix(), uvFromClipMatrix, historyProjection, - options, &uniforms, renderPass = pass] + options, passBuilder = passBuilder] (FrameGraphResources const& resources, auto const& data, DriverApi& driver) mutable { // set structure sampler - uniforms.prepareStructure(data.structure ? + mSsrPassDescriptorSet.prepareStructure(data.structure ? resources.getTexture(data.structure) : getOneTexture()); // set screen-space reflections and screen-space refractions - mat4f uvFromViewMatrix = uvFromClipMatrix * projection; - mat4f reprojection = mat4f{ uvFromClipMatrix * historyProjection - * inverse(userViewMatrix) }; + mat4f const uvFromViewMatrix = uvFromClipMatrix * projection; + mat4f const reprojection = uvFromClipMatrix * + mat4f{ historyProjection * inverse(userViewMatrix) }; // the history sampler is a regular texture2D - TextureHandle history = data.history ? + TextureHandle const history = data.history ? resources.getTexture(data.history) : getZeroTexture(); - uniforms.prepareHistorySSR(history, reprojection, uvFromViewMatrix, options); + mSsrPassDescriptorSet.prepareHistorySSR(history, reprojection, uvFromViewMatrix, options); - uniforms.commit(driver); + mSsrPassDescriptorSet.commit(mEngine); - auto out = resources.getRenderPassInfo(); + mSsrPassDescriptorSet.bind(driver); + + auto const out = resources.getRenderPassInfo(); // Remove the HAS_SHADOWING RenderFlags, since it's irrelevant when rendering reflections - RenderPass::RenderFlags flags = renderPass.getRenderFlags(); - flags &= ~RenderPass::HAS_SHADOWING; - renderPass.setRenderFlags(flags); + passBuilder.renderFlags(RenderPass::HAS_SHADOWING, 0); // use our special SSR variant, it can only be applied to object that have // the SCREEN_SPACE ReflectionMode. - renderPass.setVariant(Variant{Variant::SPECIAL_SSR}); + passBuilder.variant(Variant{ Variant::SPECIAL_SSR }); + // generate all our drawing commands, except blended objects. - renderPass.appendCommands(mEngine, RenderPass::CommandTypeFlags::SCREEN_SPACE_REFLECTIONS); - renderPass.sortCommands(mEngine); - renderPass.execute(mEngine, resources.getPassName(), out.target, out.params); + passBuilder.commandTypeFlags(RenderPass::CommandTypeFlags::SCREEN_SPACE_REFLECTIONS); + + RenderPass const pass{ passBuilder.build(mEngine, driver) }; + driver.beginRenderPass(out.target, out.params); + pass.getExecutor().execute(mEngine, driver); + driver.endRenderPass(); }); return ssrPass->reflections; } FrameGraphId PostProcessManager::screenSpaceAmbientOcclusion(FrameGraph& fg, - filament::Viewport const& svp, const CameraInfo& cameraInfo, - FrameGraphId depth, + filament::Viewport const&, const CameraInfo& cameraInfo, + FrameGraphId const depth, AmbientOcclusionOptions const& options) noexcept { assert_invariant(depth); @@ -646,44 +784,16 @@ FrameGraphId PostProcessManager::screenSpaceAmbientOcclusion( * attachment, even if writes are not enabled. This restriction is lifted on desktop GL and * Vulkan. The Metal situation is unclear. * In this case, we need to duplicate the depth texture to use it as an attachment. - * The pass below that does this is automatically culled if not needed, which is decided by - * each backend. + * + * This is also needed in Vulkan for a similar reason. */ + FrameGraphId duplicateDepthOutput = {}; + if (!mWorkaroundAllowReadOnlyAncillaryFeedbackLoop) { + duplicateDepthOutput = blitDepth(fg, depth); + } - struct DuplicateDepthPassData { - FrameGraphId input; - FrameGraphId output; - }; - - auto& duplicateDepthPass = fg.addPass("Duplicate Depth Pass", - [&](FrameGraph::Builder& builder, auto& data) { - // read the depth as an attachment - data.input = builder.read(depth, - FrameGraphTexture::Usage::DEPTH_ATTACHMENT); - auto desc = builder.getDescriptor(data.input); - desc.levels = 1; // only copy the base level - // create a new buffer for the copy - data.output = builder.createTexture("Depth Texture Copy", desc); - data.output = builder.write(data.output, - FrameGraphTexture::Usage::DEPTH_ATTACHMENT); - builder.declareRenderPass("Depth Copy RenderTarget", {{ .depth = data.output }}); - }, - [=](FrameGraphResources const& resources, - auto const& data, DriverApi& driver) { - auto const& desc = resources.getDescriptor(data.input); - auto out = resources.getRenderPassInfo(); - // create a temporary render target for source, needed for the blit. - auto inTarget = driver.createRenderTarget(TargetBufferFlags::DEPTH, - desc.width, desc.height, desc.samples, {}, - { resources.getTexture(data.input) }, {}); - driver.blit(TargetBufferFlags::DEPTH, - out.target, out.params.viewport, - inTarget, out.params.viewport, - SamplerMagFilter::NEAREST); - driver.destroyRenderTarget(inTarget); - }); - - auto& SSAOPass = fg.addPass("SSAO Pass", + auto const& SSAOPass = fg.addPass( + "SSAO Pass", [&](FrameGraph::Builder& builder, auto& data) { auto const& desc = builder.getDescriptor(depth); @@ -712,10 +822,7 @@ FrameGraphId PostProcessManager::screenSpaceAmbientOcclusion( // reading into it even though they were not written in the depth buffer. // The bilateral filter in the blur pass will ignore pixels at infinity. - auto depthAttachment = data.depth; - if (!mWorkaroundAllowReadOnlyAncillaryFeedbackLoop) { - depthAttachment = duplicateDepthPass->output; - } + auto depthAttachment = duplicateDepthOutput ? duplicateDepthOutput : data.depth; depthAttachment = builder.read(depthAttachment, FrameGraphTexture::Usage::DEPTH_ATTACHMENT); @@ -725,13 +832,14 @@ FrameGraphId PostProcessManager::screenSpaceAmbientOcclusion( .clearFlags = TargetBufferFlags::COLOR0 | TargetBufferFlags::COLOR1 }); }, - [=](FrameGraphResources const& resources, - auto const& data, DriverApi& driver) { + [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); + auto depth = resources.getTexture(data.depth); auto ssao = resources.getRenderPassInfo(); auto const& desc = resources.getDescriptor(data.depth); - // estimate of the size in pixel of a 1m tall/wide object viewed from 1m away (i.e. at z=-1) + // Estimate of the size in pixel units of a 1m tall/wide object viewed from 1m away (i.e. at z=-1) const float projectionScale = std::min( 0.5f * cameraInfo.projection[0].x * desc.width, 0.5f * cameraInfo.projection[1].y * desc.height); @@ -755,8 +863,8 @@ FrameGraphId PostProcessManager::screenSpaceAmbientOcclusion( auto& material = computeBentNormals ? getPostProcessMaterial("saoBentNormals") : getPostProcessMaterial("sao"); - - FMaterialInstance* const mi = material.getMaterialInstance(mEngine); + FMaterial const* const ma = material.getMaterial(mEngine); + FMaterialInstance* const mi = PostProcessMaterial::getMaterialInstance(ma); mi->setParameter("depth", depth, { .filterMin = SamplerMinFilter::NEAREST_MIPMAP_NEAREST }); mi->setParameter("screenFromViewMatrix", @@ -798,15 +906,15 @@ FrameGraphId PostProcessManager::screenSpaceAmbientOcclusion( float2{ options.ssct.depthBias, options.ssct.depthSlopeBias }); mi->setParameter("ssctSampleCount", uint32_t(options.ssct.sampleCount)); mi->setParameter("ssctRayCount", - float2{ options.ssct.rayCount, 1.0f / options.ssct.rayCount }); + float2{ options.ssct.rayCount, 1.0f / float(options.ssct.rayCount) }); mi->commit(driver); mi->use(driver); - PipelineState pipeline(material.getPipelineState(mEngine)); + auto pipeline = getPipelineState(ma); pipeline.rasterState.depthFunc = RasterState::DepthFunc::L; assert_invariant(ssao.params.readOnlyDepthStencil & RenderPassParams::READONLY_DEPTH); - render(ssao, pipeline, driver); + renderFullScreenQuad(ssao, pipeline, driver); }); FrameGraphId ssao = SSAOPass->ssao; @@ -832,9 +940,9 @@ FrameGraphId PostProcessManager::screenSpaceAmbientOcclusion( } FrameGraphId PostProcessManager::bilateralBlurPass(FrameGraph& fg, - FrameGraphId input, + FrameGraphId const input, FrameGraphId depth, - math::int2 axis, float zf, TextureFormat format, + int2 const axis, float const zf, TextureFormat const format, BilateralPassConfig const& config) noexcept { assert_invariant(depth); @@ -845,7 +953,7 @@ FrameGraphId PostProcessManager::bilateralBlurPass(FrameGraph FrameGraphId bn; }; - auto& blurPass = fg.addPass("Separable Blur Pass", + auto const& blurPass = fg.addPass("Separable Blur Pass", [&](FrameGraph::Builder& builder, auto& data) { auto const& desc = builder.getDescriptor(input); @@ -883,32 +991,35 @@ FrameGraphId PostProcessManager::bilateralBlurPass(FrameGraph }, [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); + auto ssao = resources.getTexture(data.input); auto blurred = resources.getRenderPassInfo(); auto const& desc = resources.getDescriptor(data.blurred); // unnormalized gaussian half-kernel of a given standard deviation - // returns number of samples stored in array (max 16) + // returns number of samples stored in the array (max 16) constexpr size_t kernelArraySize = 16; // limited by bilateralBlur.mat auto gaussianKernel = - [kernelArraySize](float* outKernel, size_t gaussianWidth, float stdDev) -> uint32_t { + [kernelArraySize](float* outKernel, size_t const gaussianWidth, float const stdDev) -> uint32_t { const size_t gaussianSampleCount = std::min(kernelArraySize, (gaussianWidth + 1u) / 2u); for (size_t i = 0; i < gaussianSampleCount; i++) { - float x = i; - float g = std::exp(-(x * x) / (2.0f * stdDev * stdDev)); + float const x = float(i); + float const g = std::exp(-(x * x) / (2.0f * stdDev * stdDev)); outKernel[i] = g; } return uint32_t(gaussianSampleCount); }; float kGaussianSamples[kernelArraySize]; - uint32_t kGaussianCount = gaussianKernel(kGaussianSamples, + uint32_t const kGaussianCount = gaussianKernel(kGaussianSamples, config.kernelSize, config.standardDeviation); auto& material = config.bentNormals ? getPostProcessMaterial("bilateralBlurBentNormals") : getPostProcessMaterial("bilateralBlur"); - FMaterialInstance* const mi = material.getMaterialInstance(mEngine); + FMaterial const* const ma = material.getMaterial(mEngine); + FMaterialInstance* const mi = PostProcessMaterial::getMaterialInstance(ma); mi->setParameter("ssao", ssao, { /* only reads level 0 */ }); mi->setParameter("axis", axis / float2{desc.width, desc.height}); mi->setParameter("kernel", kGaussianSamples, kGaussianCount); @@ -918,26 +1029,26 @@ FrameGraphId PostProcessManager::bilateralBlurPass(FrameGraph mi->commit(driver); mi->use(driver); - PipelineState pipeline(material.getPipelineState(mEngine)); + auto pipeline = getPipelineState(ma); pipeline.rasterState.depthFunc = RasterState::DepthFunc::L; - render(blurred, pipeline, driver); + renderFullScreenQuad(blurred, pipeline, driver); }); return blurPass->blurred; } FrameGraphId PostProcessManager::generateGaussianMipmap(FrameGraph& fg, - const FrameGraphId input, size_t levels, - bool reinhard, size_t kernelWidth, float sigma) noexcept { + const FrameGraphId input, size_t const levels, + bool reinhard, size_t const kernelWidth, float const sigma) noexcept { auto const subResourceDesc = fg.getSubResourceDescriptor(input); - // create one subresource per level to be generated from the input. These will be our + // Create one subresource per level to be generated from the input. These will be our // destinations. struct MipmapPassData { FixedCapacityVector> out; }; - auto& mipmapPass = fg.addPass("Mipmap Pass", + auto const& mipmapPass = fg.addPass("Mipmap Pass", [&](FrameGraph::Builder& builder, auto& data) { data.out.reserve(levels - 1); for (size_t i = 1; i < levels; i++) { @@ -952,7 +1063,7 @@ FrameGraphId PostProcessManager::generateGaussianMipmap(Frame // Then generate a blur pass for each level, using the previous level as source auto from = input; for (size_t i = 0; i < levels - 1; i++) { - auto output = mipmapPass->out[i]; + auto const output = mipmapPass->out[i]; from = gaussianBlurPass(fg, from, output, reinhard, kernelWidth, sigma); reinhard = false; // only do the reinhard filtering on the first level } @@ -962,12 +1073,12 @@ FrameGraphId PostProcessManager::generateGaussianMipmap(Frame } FrameGraphId PostProcessManager::gaussianBlurPass(FrameGraph& fg, - FrameGraphId input, + FrameGraphId const input, FrameGraphId output, - bool reinhard, size_t kernelWidth, const float sigma) noexcept { + bool const reinhard, size_t kernelWidth, const float sigma) noexcept { auto computeGaussianCoefficients = - [kernelWidth, sigma](float2* kernel, size_t size) -> size_t { + [kernelWidth, sigma](float2* kernel, size_t const size) -> size_t { const float alpha = 1.0f / (2.0f * sigma * sigma); // number of positive-side samples needed, using linear sampling @@ -986,10 +1097,10 @@ FrameGraphId PostProcessManager::gaussianBlurPass(FrameGraph& float totalWeight = kernel[0].x; for (size_t i = 1; i < m; i++) { - float x0 = float(i * 2 - 1); - float x1 = float(i * 2); - float k0 = std::exp(-alpha * x0 * x0); - float k1 = std::exp(-alpha * x1 * x1); + float const x0 = float(i * 2 - 1); + float const x1 = float(i * 2); + float const k0 = std::exp(-alpha * x0 * x0); + float const k1 = std::exp(-alpha * x1 * x1); // k * textureLod(..., o) with bilinear sampling is equivalent to: // k * (s[0] * (1 - o) + s[1] * o) @@ -997,8 +1108,8 @@ FrameGraphId PostProcessManager::gaussianBlurPass(FrameGraph& // k0 = k * (1 - o) // k1 = k * o - float k = k0 + k1; - float o = k1 / k; + float const k = k0 + k1; + float const o = k1 / k; kernel[i].x = k; kernel[i].y = o; totalWeight += (k0 + k1) * 2.0f; @@ -1021,15 +1132,15 @@ FrameGraphId PostProcessManager::gaussianBlurPass(FrameGraph& // and because it's a separable filter, the effective 2D filter kernel size is 17*17 // The total number of samples needed over the two passes is 18. - auto& blurPass = fg.addPass("Gaussian Blur Pass (separable)", + auto const& blurPass = fg.addPass("Gaussian Blur Pass (separable)", [&](FrameGraph::Builder& builder, auto& data) { - auto inDesc = builder.getDescriptor(input); + auto const inDesc = builder.getDescriptor(input); if (!output) { output = builder.createTexture("Blurred texture", inDesc); } - auto outDesc = builder.getDescriptor(output); + auto const outDesc = builder.getDescriptor(output); auto tempDesc = inDesc; tempDesc.width = outDesc.width; // width of the destination level (b/c we're blurring horizontally) tempDesc.levels = 1; @@ -1045,6 +1156,7 @@ FrameGraphId PostProcessManager::gaussianBlurPass(FrameGraph& }, [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); // don't use auto for those, b/c the ide can't resolve them using FGTD = FrameGraphTexture::Descriptor; @@ -1062,7 +1174,7 @@ FrameGraphId PostProcessManager::gaussianBlurPass(FrameGraph& using namespace std::literals; std::string_view materialName; const bool is2dArray = inDesc.type == SamplerType::SAMPLER_2D_ARRAY; - switch (backend::getFormatComponentCount(outDesc.format)) { + switch (getFormatComponentCount(outDesc.format)) { case 1: materialName = is2dArray ? "separableGaussianBlur1L"sv : "separableGaussianBlur1"sv; break; case 2: materialName = is2dArray ? @@ -1072,18 +1184,32 @@ FrameGraphId PostProcessManager::gaussianBlurPass(FrameGraph& default: materialName = is2dArray ? "separableGaussianBlur4L"sv : "separableGaussianBlur4"sv; break; } - auto const& separableGaussianBlur = getPostProcessMaterial(materialName); - FMaterialInstance* const mi = separableGaussianBlur.getMaterialInstance(mEngine); + FMaterialInstance* const mi = PostProcessMaterial::getMaterialInstance( + mEngine, separableGaussianBlur); + const size_t kernelStorageSize = mi->getMaterial()->reflect("kernel")->size; + + // Initialize the samplers with dummy textures because vulkan requires a sampler to + // be bound to a texture even if sampler might be unused. + mi->setParameter("sourceArray"sv, getZeroTextureArray(), { + .filterMag = SamplerMagFilter::LINEAR, + .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST + }); + mi->setParameter("source"sv, getZeroTexture(), { + .filterMag = SamplerMagFilter::LINEAR, + .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST + }); + + float2 kernel[64]; - size_t m = computeGaussianCoefficients(kernel, - std::min(sizeof(kernel) / sizeof(*kernel), kernelStorageSize)); + size_t const m = computeGaussianCoefficients(kernel, + std::min(std::size(kernel), kernelStorageSize)); + std::string_view const sourceParameterName = is2dArray ? "sourceArray"sv : "source"sv; // horizontal pass - - mi->setParameter("source", hwIn, { + mi->setParameter(sourceParameterName, hwIn, { .filterMag = SamplerMagFilter::LINEAR, .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST }); @@ -1091,13 +1217,13 @@ FrameGraphId PostProcessManager::gaussianBlurPass(FrameGraph& mi->setParameter("layer", float(inSubDesc.layer)); mi->setParameter("reinhard", reinhard ? uint32_t(1) : uint32_t(0)); mi->setParameter("axis",float2{ 1.0f / inDesc.width, 0 }); - mi->setParameter("count", (int32_t)m); + mi->setParameter("count", int32_t(m)); mi->setParameter("kernel", kernel, m); // The framegraph only computes discard flags at FrameGraphPass boundaries hwTempRT.params.flags.discardEnd = TargetBufferFlags::NONE; - commitAndRender(hwTempRT, separableGaussianBlur, driver); + commitAndRenderFullScreenQuad(driver, hwTempRT, mi); // vertical pass UTILS_UNUSED_IN_RELEASE auto width = outDesc.width; @@ -1105,29 +1231,27 @@ FrameGraphId PostProcessManager::gaussianBlurPass(FrameGraph& assert_invariant(width == hwOutRT.params.viewport.width); assert_invariant(height == hwOutRT.params.viewport.height); - mi->setParameter("source", hwTemp, { + mi->setParameter(sourceParameterName, hwTemp, { .filterMag = SamplerMagFilter::LINEAR, .filterMin = SamplerMinFilter::LINEAR /* level is always 0 */ }); mi->setParameter("level", 0.0f); mi->setParameter("layer", 0.0f); mi->setParameter("axis", float2{ 0, 1.0f / tempDesc.height }); - mi->commit(driver); - // we don't need to call use() here, since it's the same material - render(hwOutRT, separableGaussianBlur.getPipelineState(mEngine), driver); + commitAndRenderFullScreenQuad(driver, hwOutRT, mi); }); return blurPass->out; } PostProcessManager::ScreenSpaceRefConfig PostProcessManager::prepareMipmapSSR(FrameGraph& fg, - uint32_t width, uint32_t height, backend::TextureFormat format, - float verticalFieldOfView, float2 scale) noexcept { + uint32_t const width, uint32_t const height, TextureFormat const format, + float const verticalFieldOfView, float2 const scale) noexcept { // The kernel-size was determined empirically so that we don't get too many artifacts // due to the down-sampling with a box filter (which happens implicitly). - // requires only 6 stored coefficients and 11 tap/pass + // Requires only 6 stored coefficients and 11 tap/pass // e.g.: size of 13 (4 stored coefficients) // +-------+-------+-------*===*-------+-------+-------+ // ... | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | ... @@ -1264,7 +1388,7 @@ PostProcessManager::ScreenSpaceRefConfig PostProcessManager::prepareMipmapSSR(Fr FrameGraphId refraction; FrameGraphId reflection; }; - auto& pass = fg.addPass("Prepare MipmapSSR Pass", + auto const& pass = fg.addPass("Prepare MipmapSSR Pass", [&](FrameGraph::Builder& builder, auto& data){ // create the SSR 2D array data.ssr = builder.createTexture("ssr", outDesc); @@ -1289,12 +1413,12 @@ FrameGraphId PostProcessManager::generateMipmapSSR( PostProcessManager& ppm, FrameGraph& fg, FrameGraphId input, FrameGraphId output, - bool needInputDuplication, ScreenSpaceRefConfig const& config) noexcept { + bool const needInputDuplication, ScreenSpaceRefConfig const& config) noexcept { - // descriptor of our actual input image (e.g. reflection buffer or refraction framebuffer) + // Descriptor of our actual input image (e.g. reflection buffer or refraction framebuffer) auto const& desc = fg.getDescriptor(input); - // descriptor of the destination. output is a subresource (i.e. a layer of a 2D array) + // Descriptor of the destination. `output` is a subresource (i.e. a layer of a 2D array) auto const& outDesc = fg.getDescriptor(output); /* @@ -1310,14 +1434,18 @@ FrameGraphId PostProcessManager::generateMipmapSSR( if (desc.samples > 1 && outDesc.width == desc.width && outDesc.height == desc.height && desc.format == outDesc.format) { - // resolve directly into the destination - input = ppm.resolveBaseLevelNoCheck(fg, "ssr", input, outDesc); + // Resolve directly into the destination. This guarantees a blit/resolve will be + // performed (i.e.: the source is copied) and we also guarantee that format/scaling + // is the same after the forwardResource call below. + input = ppm.resolve(fg, "ssr", input, outDesc); } else { - // first resolve (if needed) - input = ppm.resolveBaseLevel(fg, "ssr", input); - // then blit into an appropriate texture - // this handles scaling, format conversion and mipmaping - input = ppm.opaqueBlit(fg, input, { 0, 0, desc.width, desc.height }, outDesc); + // First resolve (if needed), may be a no-op. Guarantees that format/size is unchanged + // by construction. + input = ppm.resolve(fg, "ssr", input, { .levels = 1 }); + // Then blit into an appropriate texture, this handles scaling and format conversion. + // The input/output sizes may differ when non-homogenous DSR is enabled. + input = ppm.blit(fg, false, input, { 0, 0, desc.width, desc.height }, outDesc, + SamplerMagFilter::LINEAR, SamplerMinFilter::LINEAR); } } @@ -1335,22 +1463,22 @@ FrameGraphId PostProcessManager::generateMipmapSSR( } FrameGraphId PostProcessManager::dof(FrameGraph& fg, - FrameGraphId input, - FrameGraphId depth, + FrameGraphId const input, + FrameGraphId const depth, const CameraInfo& cameraInfo, - bool translucent, - float bokehAspectRatio, + bool const translucent, + float2 bokehScale, const DepthOfFieldOptions& dofOptions) noexcept { assert_invariant(depth); - const uint8_t variant = uint8_t( - translucent ? PostProcessVariant::TRANSLUCENT : PostProcessVariant::OPAQUE); + PostProcessVariant const variant = + translucent ? PostProcessVariant::TRANSLUCENT : PostProcessVariant::OPAQUE; const TextureFormat format = translucent ? TextureFormat::RGBA16F : TextureFormat::R11F_G11F_B10F; - // rotate the bokeh based on the aperture diameter (i.e. angle of the blades) + // Rotate the bokeh based on the aperture diameter (i.e. angle of the blades) float bokehAngle = f::PI / 6.0f; if (dofOptions.maxApertureDiameter > 0.0f) { bokehAngle += f::PI_2 * saturate(cameraInfo.A / dofOptions.maxApertureDiameter); @@ -1431,7 +1559,7 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, const float focusDistance = cameraInfo.d; auto const& desc = fg.getDescriptor(input); const float Kc = (cameraInfo.A * cameraInfo.f) / (focusDistance - cameraInfo.f); - const float Ks = ((float)desc.height) / FCamera::SENSOR_SIZE; + const float Ks = float(desc.height) / FCamera::SENSOR_SIZE; const float K = dofOptions.cocScale * Ks * Kc; auto const& p = cameraInfo.projection; @@ -1451,7 +1579,7 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, const uint32_t height = colorDesc.height / dofResolution; // at full resolution, 4 "safe" levels are guaranteed - constexpr const uint32_t maxMipLevels = 4u; + constexpr uint32_t maxMipLevels = 4u; // compute numbers of "safe" levels (should be 4, but can be 3 at half res) const uint8_t mipmapCount = std::min(maxMipLevels, ctz(width | height)); @@ -1471,7 +1599,7 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, FrameGraphId outCoc; }; - auto& ppDoFDownsample = fg.addPass("DoF Downsample", + auto const& ppDoFDownsample = fg.addPass("DoF Downsample", [&](FrameGraph::Builder& builder, auto& data) { data.color = builder.sample(input); data.depth = builder.sample(depth); @@ -1484,8 +1612,8 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, .format = TextureFormat::R16F, .swizzle = { // the next stage expects min/max CoC in the red/green channel - .r = backend::TextureSwizzle::CHANNEL_0, - .g = backend::TextureSwizzle::CHANNEL_0 }, + .r = TextureSwizzle::CHANNEL_0, + .g = TextureSwizzle::CHANNEL_0 }, }); data.outColor = builder.write(data.outColor, FrameGraphTexture::Usage::COLOR_ATTACHMENT); data.outCoc = builder.write(data.outCoc, FrameGraphTexture::Usage::COLOR_ATTACHMENT); @@ -1495,21 +1623,26 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, }); }, [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); auto const& out = resources.getRenderPassInfo(); auto color = resources.getTexture(data.color); auto depth = resources.getTexture(data.depth); auto const& material = (dofResolution == 1) ? getPostProcessMaterial("dofCoc") : getPostProcessMaterial("dofDownsample"); - FMaterialInstance* const mi = material.getMaterialInstance(mEngine); + FMaterialInstance* const mi = PostProcessMaterial::getMaterialInstance( + mEngine, material); + mi->setParameter("color", color, { .filterMin = SamplerMinFilter::NEAREST }); mi->setParameter("depth", depth, { .filterMin = SamplerMinFilter::NEAREST }); mi->setParameter("cocParams", cocParams); mi->setParameter("cocClamp", float2{ -(dofOptions.maxForegroundCOC ? dofOptions.maxForegroundCOC : DOF_DEFAULT_MAX_COC), dofOptions.maxBackgroundCOC ? dofOptions.maxBackgroundCOC : DOF_DEFAULT_MAX_COC}); - mi->setParameter("texelSize", float2{ 1.0f / colorDesc.width, 1.0f / colorDesc.height }); - commitAndRender(out, material, driver); + mi->setParameter("texelSize", float2{ + 1.0f / float(colorDesc.width), + 1.0f / float(colorDesc.height) }); + commitAndRenderFullScreenQuad(driver, out, mi); }); /* @@ -1525,7 +1658,7 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, assert_invariant(mipmapCount - 1 <= sizeof(PostProcessDofMipmap::rp) / sizeof(uint32_t)); - auto& ppDoFMipmap = fg.addPass("DoF Mipmap", + auto const& ppDoFMipmap = fg.addPass("DoF Mipmap", [&](FrameGraph::Builder& builder, auto& data) { data.inOutColor = builder.sample(ppDoFDownsample->outColor); data.inOutCoc = builder.sample(ppDoFDownsample->outCoc); @@ -1549,34 +1682,36 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, }, [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); auto desc = resources.getDescriptor(data.inOutColor); auto inOutColor = resources.getTexture(data.inOutColor); auto inOutCoc = resources.getTexture(data.inOutCoc); auto const& material = getPostProcessMaterial("dofMipmap"); - FMaterialInstance* const mi = material.getMaterialInstance(mEngine); - mi->setParameter("color", inOutColor, { .filterMin = SamplerMinFilter::NEAREST_MIPMAP_NEAREST }); - mi->setParameter("coc", inOutCoc, { .filterMin = SamplerMinFilter::NEAREST_MIPMAP_NEAREST }); - mi->use(driver); + FMaterial const* const ma = material.getMaterial(mEngine); + FMaterialInstance* const mi = PostProcessMaterial::getMaterialInstance(ma); - const PipelineState pipeline(material.getPipelineState(mEngine, variant)); + auto const pipeline = getPipelineState(ma, variant); for (size_t level = 0 ; level < mipmapCount - 1u ; level++) { const float w = FTexture::valueForLevel(level, desc.width); const float h = FTexture::valueForLevel(level, desc.height); - auto const& out = resources.getRenderPassInfo(data.rp[level]); - driver.setMinMaxLevels(inOutColor, level, level); - driver.setMinMaxLevels(inOutCoc, level, level); - mi->setParameter("mip", uint32_t(level)); - mi->setParameter("weightScale", 0.5f / float(1u<setParameter("color", inColor, { .filterMin = SamplerMinFilter::NEAREST_MIPMAP_NEAREST }); + mi->setParameter("coc", inCoc, { .filterMin = SamplerMinFilter::NEAREST_MIPMAP_NEAREST }); + mi->setParameter("weightScale", 0.5f / float(1u << level)); // FIXME: halfres? mi->setParameter("texelSize", float2{ 1.0f / w, 1.0f / h }); mi->commit(driver); - render(out, pipeline, driver); + mi->use(driver); + + renderFullScreenQuad(out, pipeline, driver); + + driver.destroyTexture(inColor); + driver.destroyTexture(inCoc); } - driver.setMinMaxLevels(inOutColor, 0, mipmapCount - 1u); - driver.setMinMaxLevels(inOutCoc, 0, mipmapCount - 1u); }); /* @@ -1589,12 +1724,12 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, // TODO: Should the tile size be in real pixels? i.e. always 16px instead of being dependant on // the DoF effect resolution? // Size of a tile in full-resolution pixels -- must match TILE_SIZE in dofDilate.mat - const size_t tileSize = 16; + constexpr size_t tileSize = 16; // we assume the width/height is already multiple of 16 assert_invariant(!(colorDesc.width & 0xF) && !(colorDesc.height & 0xF)); - const uint32_t tileBufferWidth = colorDesc.width / dofResolution; - const uint32_t tileBufferHeight = colorDesc.height / dofResolution; + const uint32_t tileBufferWidth = width; + const uint32_t tileBufferHeight = height; const size_t tileReductionCount = ctz(tileSize / dofResolution); struct PostProcessDofTiling1 { @@ -1604,7 +1739,7 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, const bool textureSwizzleSupported = Texture::isTextureSwizzleSupported(mEngine); for (size_t i = 0; i < tileReductionCount; i++) { - auto& ppDoFTiling = fg.addPass("DoF Tiling", + auto const& ppDoFTiling = fg.addPass("DoF Tiling", [&](FrameGraph::Builder& builder, auto& data) { // this must be true by construction @@ -1621,16 +1756,18 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, }, [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); auto const& inputDesc = resources.getDescriptor(data.inCocMinMax); auto const& out = resources.getRenderPassInfo(); auto inCocMinMax = resources.getTexture(data.inCocMinMax); auto const& material = (!textureSwizzleSupported && (i == 0)) ? getPostProcessMaterial("dofTilesSwizzle") : getPostProcessMaterial("dofTiles"); - FMaterialInstance* const mi = material.getMaterialInstance(mEngine); + FMaterialInstance* const mi = + PostProcessMaterial::getMaterialInstance(mEngine, material); mi->setParameter("cocMinMax", inCocMinMax, { .filterMin = SamplerMinFilter::NEAREST }); mi->setParameter("texelSize", float2{ 1.0f / inputDesc.width, 1.0f / inputDesc.height }); - commitAndRender(out, material, driver); + commitAndRenderFullScreenQuad(driver, out, mi); }); inTilesCocMinMax = ppDoFTiling->outTilesCocMinMax; } @@ -1640,14 +1777,14 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, */ // This is a small helper that does one round of dilate - auto dilate = [&](FrameGraphId input) -> FrameGraphId { + auto dilate = [&](FrameGraphId const input) -> FrameGraphId { struct PostProcessDofDilate { FrameGraphId inTilesCocMinMax; FrameGraphId outTilesCocMinMax; }; - auto& ppDoFDilate = fg.addPass("DoF Dilate", + auto const& ppDoFDilate = fg.addPass("DoF Dilate", [&](FrameGraph::Builder& builder, auto& data) { auto const& inputDesc = fg.getDescriptor(input); data.inTilesCocMinMax = builder.sample(input); @@ -1656,12 +1793,14 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, }, [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); auto const& out = resources.getRenderPassInfo(); auto inTilesCocMinMax = resources.getTexture(data.inTilesCocMinMax); auto const& material = getPostProcessMaterial("dofDilate"); - FMaterialInstance* const mi = material.getMaterialInstance(mEngine); + FMaterialInstance* const mi = + PostProcessMaterial::getMaterialInstance(mEngine, material); mi->setParameter("tiles", inTilesCocMinMax, { .filterMin = SamplerMinFilter::NEAREST }); - commitAndRender(out, material, driver); + commitAndRenderFullScreenQuad(driver, out, mi); }); return ppDoFDilate->outTilesCocMinMax; }; @@ -1684,7 +1823,7 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, FrameGraphId outAlpha; }; - auto& ppDoF = fg.addPass("DoF", + auto const& ppDoF = fg.addPass("DoF", [&](FrameGraph::Builder& builder, auto& data) { data.color = builder.sample(ppDoFMipmap->inOutColor); @@ -1708,6 +1847,7 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, }); }, [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); auto const& out = resources.getRenderPassInfo(); auto color = resources.getTexture(data.color); @@ -1717,7 +1857,8 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, auto const& inputDesc = resources.getDescriptor(data.coc); auto const& material = getPostProcessMaterial("dof"); - FMaterialInstance* const mi = material.getMaterialInstance(mEngine); + FMaterialInstance* const mi = + PostProcessMaterial::getMaterialInstance(mEngine, material); // it's not safe to use bilinear filtering in the general case (causes artifacts around edges) mi->setParameter("color", color, { .filterMin = SamplerMinFilter::NEAREST_MIPMAP_NEAREST }); @@ -1728,10 +1869,10 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, mi->setParameter("tiles", tilesCocMinMax, { .filterMin = SamplerMinFilter::NEAREST }); mi->setParameter("cocToTexelScale", float2{ - bokehAspectRatio / (inputDesc.width * dofResolution), - 1.0 / (inputDesc.height * dofResolution) + bokehScale.x / (inputDesc.width * dofResolution), + bokehScale.y / (inputDesc.height * dofResolution) }); - mi->setParameter("cocToPixelScale", (1.0f / dofResolution)); + mi->setParameter("cocToPixelScale", (1.0f / float(dofResolution))); mi->setParameter("ringCounts", float4{ dofOptions.foregroundRingCount ? dofOptions.foregroundRingCount : DOF_DEFAULT_RING_COUNT, dofOptions.backgroundRingCount ? dofOptions.backgroundRingCount : DOF_DEFAULT_RING_COUNT, @@ -1739,7 +1880,7 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, 0.0 // unused for now }); mi->setParameter("bokehAngle", bokehAngle); - commitAndRender(out, material, driver); + commitAndRenderFullScreenQuad(driver, out, mi); }); /* @@ -1754,7 +1895,7 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, FrameGraphId outAlpha; }; - auto& ppDoFMedian = fg.addPass("DoF Median", + auto const& ppDoFMedian = fg.addPass("DoF Median", [&](FrameGraph::Builder& builder, auto& data) { data.inColor = builder.sample(ppDoF->outColor); @@ -1770,6 +1911,7 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, }); }, [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); auto const& out = resources.getRenderPassInfo(); auto inColor = resources.getTexture(data.inColor); @@ -1777,11 +1919,12 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, auto tilesCocMinMax = resources.getTexture(data.tilesCocMinMax); auto const& material = getPostProcessMaterial("dofMedian"); - FMaterialInstance* const mi = material.getMaterialInstance(mEngine); + FMaterialInstance* const mi = + PostProcessMaterial::getMaterialInstance(mEngine, material); mi->setParameter("dof", inColor, { .filterMin = SamplerMinFilter::NEAREST_MIPMAP_NEAREST }); mi->setParameter("alpha", inAlpha, { .filterMin = SamplerMinFilter::NEAREST_MIPMAP_NEAREST }); mi->setParameter("tiles", tilesCocMinMax, { .filterMin = SamplerMinFilter::NEAREST }); - commitAndRender(out, material, driver); + commitAndRenderFullScreenQuad(driver, out, mi); }); @@ -1804,7 +1947,7 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, FrameGraphId output; }; - auto& ppDoFCombine = fg.addPass("DoF combine", + auto const& ppDoFCombine = fg.addPass("DoF combine", [&](FrameGraph::Builder& builder, auto& data) { data.color = builder.sample(input); data.dof = builder.sample(outColor); @@ -1816,6 +1959,7 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, }, [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); auto const& out = resources.getRenderPassInfo(); auto color = resources.getTexture(data.color); @@ -1824,80 +1968,148 @@ FrameGraphId PostProcessManager::dof(FrameGraph& fg, auto tilesCocMinMax = resources.getTexture(data.tilesCocMinMax); auto const& material = getPostProcessMaterial("dofCombine"); - FMaterialInstance* const mi = material.getMaterialInstance(mEngine); + FMaterialInstance* const mi = + PostProcessMaterial::getMaterialInstance(mEngine, material); mi->setParameter("color", color, { .filterMin = SamplerMinFilter::NEAREST }); mi->setParameter("dof", dof, { .filterMag = SamplerMagFilter::NEAREST }); mi->setParameter("alpha", alpha, { .filterMag = SamplerMagFilter::NEAREST }); mi->setParameter("tiles", tilesCocMinMax, { .filterMin = SamplerMinFilter::NEAREST }); - commitAndRender(out, material, driver); + commitAndRenderFullScreenQuad(driver, out, mi); }); return ppDoFCombine->output; } +FrameGraphId PostProcessManager::downscalePass(FrameGraph& fg, + FrameGraphId const input, + FrameGraphTexture::Descriptor const& outDesc, + bool const threshold, float const highlight, bool const fireflies) noexcept { + struct DownsampleData { + FrameGraphId input; + FrameGraphId output; + }; + auto const& downsamplePass = fg.addPass("Downsample", + [&](FrameGraph::Builder& builder, auto& data) { + data.input = builder.sample(input); + data.output = builder.createTexture("Downsample-output", outDesc); + builder.declareRenderPass(data.output); + }, + [=](FrameGraphResources const& resources, + auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); + auto const& out = resources.getRenderPassInfo(); + auto const& material = getPostProcessMaterial("bloomDownsample2x"); + FMaterialInstance* const mi = + PostProcessMaterial::getMaterialInstance(mEngine, material); + mi->setParameter("source", resources.getTexture(data.input), { + .filterMag = SamplerMagFilter::LINEAR, + .filterMin = SamplerMinFilter::LINEAR + }); + mi->setParameter("level", 0); + mi->setParameter("threshold", threshold ? 1.0f : 0.0f); + mi->setParameter("fireflies", fireflies ? 1.0f : 0.0f); + mi->setParameter("invHighlight", std::isinf(highlight) ? 0.0f : 1.0f / highlight); + commitAndRenderFullScreenQuad(driver, out, mi); + + }); + return downsamplePass->output; +} + PostProcessManager::BloomPassOutput PostProcessManager::bloom(FrameGraph& fg, - FrameGraphId input, + FrameGraphId input, TextureFormat const outFormat, BloomOptions& inoutBloomOptions, - backend::TextureFormat outFormat, - math::float2 scale) noexcept { - return bloomPass(fg, input, outFormat, inoutBloomOptions, scale); -} + TemporalAntiAliasingOptions const& taaOptions, + float2 const scale) noexcept { -PostProcessManager::BloomPassOutput PostProcessManager::bloomPass(FrameGraph& fg, - FrameGraphId input, TextureFormat outFormat, - BloomOptions& inoutBloomOptions, float2 scale) noexcept { - // Figure out a good size for the bloom buffer. - auto const& desc = fg.getDescriptor(input); + // Figure out a good size for the bloom buffer. We must use a fixed bloom buffer size so + // that the size/strength of the bloom doesn't vary much with the resolution, otherwise + // dynamic resolution would affect the bloom effect too much. + auto desc = fg.getDescriptor(input); // width and height after dynamic resolution upscaling const float aspect = (float(desc.width) * scale.y) / (float(desc.height) * scale.x); + // FIXME: don't allow inoutBloomOptions.resolution to be larger than input's resolution + // (avoid upscale) but how does this affect dynamic resolution + // FIXME: check what happens on WebGL and intel's processors + // compute the desired bloom buffer size float bloomHeight = float(inoutBloomOptions.resolution); float bloomWidth = bloomHeight * aspect; - // Anamorphic bloom by always scaling down one of the dimension -- we do this (as opposed - // to scaling up) so that the amount of blooming doesn't decrease. However, the resolution - // decreases, meaning that the user might need to adjust the BloomOptions::resolution and - // BloomOptions::levels. - if (inoutBloomOptions.anamorphism >= 1.0f) { - bloomWidth *= 1.0f / inoutBloomOptions.anamorphism; - } else { - bloomHeight *= inoutBloomOptions.anamorphism; - } - - // convert back to integer width/height - const uint32_t width = std::max(1u, uint32_t(std::floor(bloomWidth))); - const uint32_t height = std::max(1u, uint32_t(std::floor(bloomHeight))); - // we might need to adjust the max # of levels const uint32_t major = uint32_t(std::max(bloomWidth, bloomHeight)); const uint8_t maxLevels = FTexture::maxLevelCount(major); inoutBloomOptions.levels = std::min(inoutBloomOptions.levels, maxLevels); inoutBloomOptions.levels = std::min(inoutBloomOptions.levels, kMaxBloomLevels); - if (2 * width < desc.width || 2 * height < desc.height) { - // if we're scaling down by more than 2x, prescale the image with a blit to improve - // performance. This is important on mobile/tilers. - input = opaqueBlit(fg, input, { 0, 0, desc.width, desc.height }, { - .width = std::max(1u, desc.width / 2), - .height = std::max(1u, desc.height / 2), - .format = outFormat - }); + if (inoutBloomOptions.quality == QualityLevel::LOW) { + // In low quality mode, we adjust the bloom buffer size so that both dimensions + // have enough exact mip levels. This can slightly affect the aspect ratio causing + // some artifacts: + // - add some anamorphism (experimentally not visible) + // - visible bloom size changes with dynamic resolution in non-homogenous mode + // This allows us to use the 9 sample downsampling filter (instead of 13) + // for at least 4 levels. + uint32_t width = std::max(16u, uint32_t(std::floor(bloomWidth))); + uint32_t height = std::max(16u, uint32_t(std::floor(bloomHeight))); + width &= ~((1 << 4) - 1); // at least 4 levels + height &= ~((1 << 4) - 1); + bloomWidth = float(width); + bloomHeight = float(height); } + bool threshold = inoutBloomOptions.threshold; + + // we don't need to do the fireflies reduction if we have TAA (it already does it) + bool fireflies = threshold && !taaOptions.enabled; + + assert_invariant(bloomWidth && bloomHeight); + + while (2 * bloomWidth < float(desc.width) || 2 * bloomHeight < float(desc.height)) { + if (inoutBloomOptions.quality == QualityLevel::LOW || + inoutBloomOptions.quality == QualityLevel::MEDIUM) { + input = downscalePass(fg, input, { + .width = (desc.width = std::max(1u, desc.width / 2)), + .height = (desc.height = std::max(1u, desc.height / 2)), + .format = outFormat + }, + threshold, inoutBloomOptions.highlight, fireflies); + threshold = false; // we do the thresholding only once during down sampling + fireflies = false; // we do the fireflies reduction only once during down sampling + } else if (inoutBloomOptions.quality == QualityLevel::HIGH || + inoutBloomOptions.quality == QualityLevel::ULTRA) { + // In high quality mode, we increase the size of the bloom buffer such that the + // first scaling is less than 2x, and we increase the number of levels accordingly. + if (bloomWidth * 2.0f > 2048.0f || bloomHeight * 2.0f > 2048.0f) { + // but we can't scale above the h/w guaranteed minspec + break; + } + bloomWidth *= 2.0f; + bloomHeight *= 2.0f; + inoutBloomOptions.levels++; + } + } + + // convert back to integer width/height + uint32_t const width = std::max(1u, uint32_t(std::floor(bloomWidth))); + uint32_t const height = std::max(1u, uint32_t(std::floor(bloomHeight))); + + input = downscalePass(fg, input, + { .width = width, .height = height, .format = outFormat }, + threshold, inoutBloomOptions.highlight, fireflies); + struct BloomPassData { - FrameGraphId in; FrameGraphId out; - FrameGraphId stage; uint32_t outRT[kMaxBloomLevels]; - uint32_t stageRT[kMaxBloomLevels]; }; - // downsample phase - auto& bloomDownsamplePass = fg.addPass("Bloom Downsample", + // Creating a mip-chain poses a "feedback" loop problem on some GPU. We will disable + // Bloom on these. + // See: https://github.com/google/filament/issues/2338 + + auto const& bloomDownsamplePass = fg.addPass("Bloom Downsample", [&](FrameGraph::Builder& builder, auto& data) { - data.in = builder.sample(input); data.out = builder.createTexture("Bloom Out Texture", { .width = width, .height = height, @@ -1906,164 +2118,97 @@ PostProcessManager::BloomPassOutput PostProcessManager::bloomPass(FrameGraph& fg }); data.out = builder.sample(data.out); - data.stage = builder.createTexture("Bloom Stage Texture", { - .width = width, - .height = height, - .levels = inoutBloomOptions.levels, - .format = outFormat - }); - data.stage = builder.sample(data.stage); - for (size_t i = 0; i < inoutBloomOptions.levels; i++) { auto out = builder.createSubresource(data.out, "Bloom Out Texture mip", { .level = uint8_t(i) }); - auto stage = builder.createSubresource(data.stage, - "Bloom Stage Texture mip", { .level = uint8_t(i) }); + if (i == 0) { + // this causes the last blit above to render into this mip + fg.forwardResource(out, input); + } builder.declareRenderPass(out, &data.outRT[i]); - builder.declareRenderPass(stage, &data.stageRT[i]); } }, [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); - auto hwIn = resources.getTexture(data.in); - auto hwOut = resources.getTexture(data.out); - auto hwStage = resources.getTexture(data.stage); - - auto const& material = getPostProcessMaterial("bloomDownsample"); - auto const* ma = material.getMaterial(mEngine); - - FMaterialInstance* mis[] = { - ma->createInstance("bloomDownsample-ping"), - ma->createInstance("bloomDownsample-pong"), - ma->createInstance("bloomDownsample-first"), - }; - - mis[0]->setParameter("source", hwOut, { - .filterMag = SamplerMagFilter::LINEAR, - .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST - }); + // TODO: if downsampling is not exactly a multiple of two, use the 13 samples + // filter. This is generally the accepted solution, however, the 13 samples + // filter is not correct either when we don't sample at integer coordinates, + // but it seems ot create less artifacts. + // A better solution might be to use the filter described in + // Castaño, 2013, "Shadow Mapping Summary Part 1", which is 5x5 filter with + // 9 samples, but works at all coordinates. - mis[1]->setParameter("source", hwStage, { - .filterMag = SamplerMagFilter::LINEAR, - .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST - }); - mis[2]->setParameter("source", hwIn, { - .filterMag = SamplerMagFilter::LINEAR, - .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST - }); + auto hwOut = resources.getTexture(data.out); - for (auto* mi : mis) { - mi->setParameter("level", 0.0f); - mi->setParameter("threshold", inoutBloomOptions.threshold ? 1.0f : 0.0f); - mi->setParameter("invHighlight", std::isinf(inoutBloomOptions.highlight) - ? 0.0f : 1.0f / inoutBloomOptions.highlight); - mi->commit(driver); - } + auto const& material9 = getPostProcessMaterial("bloomDownsample9"); + auto* mi9 = PostProcessMaterial::getMaterialInstance(mEngine, material9); - const PipelineState pipeline(material.getPipelineState(mEngine)); - - { // first iteration - auto hwDstRT = resources.getRenderPassInfo(data.outRT[0]); - hwDstRT.params.flags.discardStart = TargetBufferFlags::COLOR; - hwDstRT.params.flags.discardEnd = TargetBufferFlags::NONE; - mis[2]->use(driver); - render(hwDstRT, pipeline, driver); - } + auto const& material13 = getPostProcessMaterial("bloomDownsample"); + auto* mi13 = PostProcessMaterial::getMaterialInstance(mEngine, material13); for (size_t i = 1; i < inoutBloomOptions.levels; i++) { - const size_t parity = 1u - (i & 0x1u); - auto hwDstRT = resources.getRenderPassInfo(parity ? data.outRT[i] : data.stageRT[i]); + auto hwDstRT = resources.getRenderPassInfo(data.outRT[i]); hwDstRT.params.flags.discardStart = TargetBufferFlags::COLOR; hwDstRT.params.flags.discardEnd = TargetBufferFlags::NONE; - mis[parity]->setParameter("level", float(i - 1)); - mis[parity]->commit(driver); - mis[parity]->use(driver); - render(hwDstRT, pipeline, driver); - } - for (auto& mi : mis) { - mEngine.destroy(mi); + // if downsampling is a multiple of 2 in each dimension we can use the + // 9 samples filter. + auto vp = resources.getRenderPassInfo(data.outRT[i-1]).params.viewport; + auto* const mi = (vp.width & 1 || vp.height & 1) ? mi13 : mi9; + auto hwOutView = driver.createTextureView(hwOut, i - 1, 1); + mi->setParameter("source", hwOutView, { + .filterMag = SamplerMagFilter::LINEAR, + .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST }); + commitAndRenderFullScreenQuad(driver, hwDstRT, mi); + driver.destroyTexture(hwOutView); } }); - FrameGraphId output = bloomDownsamplePass->out; - FrameGraphId stage = bloomDownsamplePass->stage; + // output of bloom downsample pass becomes input of next (flare) pass + input = bloomDownsamplePass->out; // flare pass - auto flare = flarePass(fg, bloomDownsamplePass->out, width, height, outFormat, inoutBloomOptions); + auto const flare = flarePass(fg, input, width, height, outFormat, inoutBloomOptions); - // upsample phase - auto& bloomUpsamplePass = fg.addPass("Bloom Upsample", + auto const& bloomUpsamplePass = fg.addPass("Bloom Upsample", [&](FrameGraph::Builder& builder, auto& data) { - data.out = builder.sample(output); - data.stage = builder.sample(stage); + data.out = builder.sample(input); for (size_t i = 0; i < inoutBloomOptions.levels; i++) { auto out = builder.createSubresource(data.out, "Bloom Out Texture mip", { .level = uint8_t(i) }); - auto stage = builder.createSubresource(data.stage, - "Bloom Stage Texture mip", { .level = uint8_t(i) }); builder.declareRenderPass(out, &data.outRT[i]); - builder.declareRenderPass(stage, &data.stageRT[i]); } }, [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { - + bindPostProcessDescriptorSet(driver); auto hwOut = resources.getTexture(data.out); - auto hwStage = resources.getTexture(data.stage); auto const& outDesc = resources.getDescriptor(data.out); auto const& material = getPostProcessMaterial("bloomUpsample"); - auto const* ma = material.getMaterial(mEngine); - - FMaterialInstance* mis[] = { - ma->createInstance("bloomUpsample-ping"), - ma->createInstance("bloomUpsample-pong"), - }; - - mis[0]->setParameter("source", hwOut, { - .filterMag = SamplerMagFilter::LINEAR, - .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST - }); - - mis[1]->setParameter("source", hwStage, { - .filterMag = SamplerMagFilter::LINEAR, - .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST - }); + FMaterial const* const ma = material.getMaterial(mEngine); + FMaterialInstance* mi = PostProcessMaterial::getMaterialInstance(ma); - PipelineState pipeline(material.getPipelineState(mEngine)); + auto pipeline = getPipelineState(ma); pipeline.rasterState.blendFunctionSrcRGB = BlendFunction::ONE; pipeline.rasterState.blendFunctionDstRGB = BlendFunction::ONE; for (size_t j = inoutBloomOptions.levels, i = j - 1; i >= 1; i--, j++) { - const size_t parity = 1u - (j % 2u); - - auto hwDstRT = resources.getRenderPassInfo( - parity ? data.outRT[i - 1] : data.stageRT[i - 1]); + auto hwDstRT = resources.getRenderPassInfo(data.outRT[i - 1]); hwDstRT.params.flags.discardStart = TargetBufferFlags::NONE; // b/c we'll blend hwDstRT.params.flags.discardEnd = TargetBufferFlags::NONE; - auto w = FTexture::valueForLevel(i - 1, outDesc.width); auto h = FTexture::valueForLevel(i - 1, outDesc.height); - mis[parity]->setParameter("resolution", float4{ w, h, 1.0f / w, 1.0f / h }); - mis[parity]->setParameter("level", float(i)); - mis[parity]->commit(driver); - mis[parity]->use(driver); - render(hwDstRT, pipeline, driver); - } - - for (auto& mi : mis) { - mEngine.destroy(mi); - } - - // Every other level is missing from the out texture, so we need to do - // blits to complete the chain. - const SamplerMagFilter filter = SamplerMagFilter::NEAREST; - for (size_t i = 1; i < inoutBloomOptions.levels; i += 2) { - auto in = resources.getRenderPassInfo(data.stageRT[i]); - auto out = resources.getRenderPassInfo(data.outRT[i]); - driver.blit(TargetBufferFlags::COLOR, out.target, out.params.viewport, - in.target, in.params.viewport, filter); + auto hwOutView = driver.createTextureView(hwOut, i, 1); + mi->setParameter("resolution", float4{ w, h, 1.0f / w, 1.0f / h }); + mi->setParameter("source", hwOutView, { + .filterMag = SamplerMagFilter::LINEAR, + .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST}); + mi->commit(driver); + mi->use(driver); + renderFullScreenQuad(hwDstRT, pipeline, driver); + driver.destroyTexture(hwOutView); } }); @@ -2072,16 +2217,16 @@ PostProcessManager::BloomPassOutput PostProcessManager::bloomPass(FrameGraph& fg UTILS_NOINLINE FrameGraphId PostProcessManager::flarePass(FrameGraph& fg, - FrameGraphId input, - uint32_t width, uint32_t height, - backend::TextureFormat outFormat, + FrameGraphId const input, + uint32_t const width, uint32_t const height, + TextureFormat const outFormat, BloomOptions const& bloomOptions) noexcept { struct FlarePassData { FrameGraphId in; FrameGraphId out; }; - auto& flarePass = fg.addPass("Flare", + auto const& flarePass = fg.addPass("Flare", [&](FrameGraph::Builder& builder, auto& data) { data.in = builder.sample(input); data.out = builder.createTexture("Flare Texture", { @@ -2093,59 +2238,61 @@ FrameGraphId PostProcessManager::flarePass(FrameGraph& fg, }, [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); auto in = resources.getTexture(data.in); - auto out = resources.getRenderPassInfo(0); - const float aspectRatio = float(width) / height; + auto const out = resources.getRenderPassInfo(0); + const float aspectRatio = float(width) / float(height); auto const& material = getPostProcessMaterial("flare"); - FMaterialInstance* mi = material.getMaterialInstance(mEngine); + FMaterialInstance* const mi = + PostProcessMaterial::getMaterialInstance(mEngine, material); mi->setParameter("color", in, { .filterMag = SamplerMagFilter::LINEAR, .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST }); - mi->setParameter("level", 1.0f); // adjust with resolution + mi->setParameter("level", 0.0f); // adjust with resolution mi->setParameter("aspectRatio", float2{ aspectRatio, 1.0f / aspectRatio }); mi->setParameter("threshold", float2{ bloomOptions.ghostThreshold, bloomOptions.haloThreshold }); mi->setParameter("chromaticAberration", bloomOptions.chromaticAberration); - mi->setParameter("ghostCount", (float)bloomOptions.ghostCount); + mi->setParameter("ghostCount", float(bloomOptions.ghostCount)); mi->setParameter("ghostSpacing", bloomOptions.ghostSpacing); mi->setParameter("haloRadius", bloomOptions.haloRadius); mi->setParameter("haloThickness", bloomOptions.haloThickness); - commitAndRender(out, material, driver); + commitAndRenderFullScreenQuad(driver, out, mi); }); constexpr float kernelWidth = 9; constexpr float sigma = (kernelWidth + 1.0f) / 6.0f; - auto flare = gaussianBlurPass(fg, flarePass->out, {}, false, kernelWidth, sigma); + auto const flare = gaussianBlurPass(fg, flarePass->out, {}, false, kernelWidth, sigma); return flare; } UTILS_NOINLINE static float4 getVignetteParameters(VignetteOptions const& options, - uint32_t width, uint32_t height) noexcept { + uint32_t const width, uint32_t const height) noexcept { if (options.enabled) { // Vignette params // From 0.0 to 0.5 the vignette is a rounded rect that turns into an oval // From 0.5 to 1.0 the vignette turns from oval to circle - float oval = min(options.roundness, 0.5f) * 2.0f; - float circle = (max(options.roundness, 0.5f) - 0.5f) * 2.0f; - float roundness = (1.0f - oval) * 6.0f + oval; + float const oval = min(options.roundness, 0.5f) * 2.0f; + float const circle = (max(options.roundness, 0.5f) - 0.5f) * 2.0f; + float const roundness = (1.0f - oval) * 6.0f + oval; // Mid point varies during the oval/rounded section of roundness // We also modify it to emphasize feathering - float midPoint = (1.0f - options.midPoint) * mix(2.2f, 3.0f, oval) + float const midPoint = (1.0f - options.midPoint) * mix(2.2f, 3.0f, oval) * (1.0f - 0.1f * options.feather); // Radius of the rounded corners as a param to pow() - float radius = roundness * + float const radius = roundness * mix(1.0f + 4.0f * (1.0f - options.feather), 1.0f, std::sqrt(oval)); // Factor to transform oval into circle - float aspect = mix(1.0f, float(width) / float(height), circle); + float const aspect = mix(1.0f, float(width) / float(height), circle); return float4{ midPoint, radius, aspect, options.feather }; } @@ -2156,12 +2303,12 @@ static float4 getVignetteParameters(VignetteOptions const& options, void PostProcessManager::colorGradingPrepareSubpass(DriverApi& driver, const FColorGrading* colorGrading, ColorGradingConfig const& colorGradingConfig, - VignetteOptions const& vignetteOptions, uint32_t width, uint32_t height) noexcept { + VignetteOptions const& vignetteOptions, uint32_t const width, uint32_t const height) noexcept { - float4 vignetteParameters = getVignetteParameters(vignetteOptions, width, height); + float4 const vignetteParameters = getVignetteParameters(vignetteOptions, width, height); auto const& material = getPostProcessMaterial("colorGradingAsSubpass"); - FMaterialInstance* mi = material.getMaterialInstance(mEngine); + FMaterialInstance* const mi = PostProcessMaterial::getMaterialInstance(mEngine, material); mi->setParameter("lut", colorGrading->getHwHandle(), { .filterMag = SamplerMagFilter::LINEAR, @@ -2186,51 +2333,57 @@ void PostProcessManager::colorGradingPrepareSubpass(DriverApi& driver, mi->commit(driver); // load both variants - material.getMaterial(mEngine)->prepareProgram(Variant{Variant::type_t(PostProcessVariant::TRANSLUCENT)}); - material.getMaterial(mEngine)->prepareProgram(Variant{Variant::type_t(PostProcessVariant::OPAQUE)}); + material.getMaterial(mEngine, PostProcessVariant::OPAQUE); + material.getMaterial(mEngine, PostProcessVariant::TRANSLUCENT); } void PostProcessManager::colorGradingSubpass(DriverApi& driver, ColorGradingConfig const& colorGradingConfig) noexcept { - FEngine& engine = mEngine; - Handle const& fullScreenRenderPrimitive = engine.getFullScreenRenderPrimitive(); + + bindPostProcessDescriptorSet(driver); + + PostProcessVariant const variant = colorGradingConfig.translucent ? + PostProcessVariant::TRANSLUCENT : PostProcessVariant::OPAQUE; auto const& material = getPostProcessMaterial("colorGradingAsSubpass"); + FMaterial const* const ma = material.getMaterial(mEngine, variant); // the UBO has been set and committed in colorGradingPrepareSubpass() - FMaterialInstance* mi = material.getMaterialInstance(mEngine); + FMaterialInstance const* mi = PostProcessMaterial::getMaterialInstance(ma); mi->use(driver); - const Variant::type_t variant = Variant::type_t(colorGradingConfig.translucent ? - PostProcessVariant::TRANSLUCENT : PostProcessVariant::OPAQUE); - + auto const pipeline = getPipelineState(ma, variant); driver.nextSubpass(); - driver.draw(material.getPipelineState(mEngine, variant), fullScreenRenderPrimitive, 1); + driver.scissor(mi->getScissor()); + driver.draw(pipeline, mFullScreenQuadRph, 0, 3, 1); } -void PostProcessManager::customResolvePrepareSubpass(DriverApi& driver, CustomResolveOp op) noexcept { +void PostProcessManager::customResolvePrepareSubpass(DriverApi& driver, CustomResolveOp const op) noexcept { auto const& material = getPostProcessMaterial("customResolveAsSubpass"); - FMaterialInstance* mi = material.getMaterialInstance(mEngine); + FMaterialInstance* const mi = PostProcessMaterial::getMaterialInstance(mEngine, material); mi->setParameter("direction", op == CustomResolveOp::COMPRESS ? 1.0f : -1.0f), mi->commit(driver); - material.getMaterial(mEngine)->prepareProgram(Variant{}); + material.getMaterial(mEngine); } void PostProcessManager::customResolveSubpass(DriverApi& driver) noexcept { - FEngine& engine = mEngine; + FEngine const& engine = mEngine; Handle const& fullScreenRenderPrimitive = engine.getFullScreenRenderPrimitive(); auto const& material = getPostProcessMaterial("customResolveAsSubpass"); + FMaterial const* const ma = material.getMaterial(mEngine); // the UBO has been set and committed in colorGradingPrepareSubpass() - FMaterialInstance* mi = material.getMaterialInstance(mEngine); + FMaterialInstance const* mi = PostProcessMaterial::getMaterialInstance(ma); mi->use(driver); + auto const pipeline = getPipelineState(ma); driver.nextSubpass(); - driver.draw(material.getPipelineState(mEngine), fullScreenRenderPrimitive, 1); + driver.scissor(mi->getScissor()); + driver.draw(pipeline, fullScreenRenderPrimitive, 0, 3, 1); } FrameGraphId PostProcessManager::customResolveUncompressPass(FrameGraph& fg, - FrameGraphId inout) noexcept { + FrameGraphId const inout) noexcept { struct UncompressData { FrameGraphId inout; }; - auto& detonemapPass = fg.addPass("Uncompress Pass", + auto const& detonemapPass = fg.addPass("Uncompress Pass", [&](FrameGraph::Builder& builder, auto& data) { data.inout = builder.read(inout, FrameGraphTexture::Usage::SUBPASS_INPUT); data.inout = builder.write(data.inout, FrameGraphTexture::Usage::COLOR_ATTACHMENT); @@ -2238,10 +2391,11 @@ FrameGraphId PostProcessManager::customResolveUncompressPass( .attachments = { .color = { data.inout }} }); }, - [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + [=](FrameGraphResources const& resources, auto const&, DriverApi& driver) { customResolvePrepareSubpass(driver, CustomResolveOp::UNCOMPRESS); auto out = resources.getRenderPassInfo(); out.params.subpassMask = 1; + bindPostProcessDescriptorSet(driver); driver.beginRenderPass(out.target, out.params); customResolveSubpass(driver); driver.endRenderPass(); @@ -2250,9 +2404,9 @@ FrameGraphId PostProcessManager::customResolveUncompressPass( } FrameGraphId PostProcessManager::colorGrading(FrameGraph& fg, - FrameGraphId input, filament::Viewport const& vp, - FrameGraphId bloom, - FrameGraphId flare, + FrameGraphId const input, filament::Viewport const& vp, + FrameGraphId const bloom, + FrameGraphId const flare, FColorGrading const* colorGrading, ColorGradingConfig const& colorGradingConfig, BloomOptions const& bloomOptions, @@ -2265,8 +2419,8 @@ FrameGraphId PostProcessManager::colorGrading(FrameGraph& fg, if (bloomOptions.enabled) { bloomStrength = clamp(bloomOptions.strength, 0.0f, 1.0f); if (bloomOptions.dirt) { - FTexture* fdirt = downcast(bloomOptions.dirt); - FrameGraphTexture frameGraphTexture{ .handle = fdirt->getHwHandle() }; + FTexture const* fdirt = downcast(bloomOptions.dirt); + FrameGraphTexture const frameGraphTexture{ .handle = fdirt->getHwHandleForSampling() }; bloomDirt = fg.import("dirt", { .width = (uint32_t)fdirt->getWidth(0u), .height = (uint32_t)fdirt->getHeight(0u), @@ -2291,7 +2445,7 @@ FrameGraphId PostProcessManager::colorGrading(FrameGraph& fg, FrameGraphId starburst; }; - auto& ppColorGrading = fg.addPass("colorGrading", + auto const& ppColorGrading = fg.addPass("colorGrading", [&](FrameGraph::Builder& builder, auto& data) { data.input = builder.sample(input); data.output = builder.createTexture("colorGrading output", { @@ -2315,24 +2469,30 @@ FrameGraphId PostProcessManager::colorGrading(FrameGraph& fg, } }, [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { - Handle colorTexture = resources.getTexture(data.input); + bindPostProcessDescriptorSet(driver); + auto colorTexture = resources.getTexture(data.input); - Handle bloomTexture = + auto bloomTexture = data.bloom ? resources.getTexture(data.bloom) : getZeroTexture(); - Handle flareTexture = + auto flareTexture = data.flare ? resources.getTexture(data.flare) : getZeroTexture(); - Handle dirtTexture = + auto dirtTexture = data.dirt ? resources.getTexture(data.dirt) : getOneTexture(); - Handle starburstTexture = + auto starburstTexture = data.starburst ? resources.getTexture(data.starburst) : getOneTexture(); auto const& out = resources.getRenderPassInfo(); auto const& material = getPostProcessMaterial("colorGrading"); - FMaterialInstance* mi = material.getMaterialInstance(mEngine); + + PostProcessVariant const variant = colorGradingConfig.translucent ? + PostProcessVariant::TRANSLUCENT : PostProcessVariant::OPAQUE; + + FMaterialInstance* const mi = + PostProcessMaterial::getMaterialInstance(mEngine, material, variant); mi->setParameter("lut", colorGrading->getHwHandle(), { .filterMag = SamplerMagFilter::LINEAR, @@ -2375,7 +2535,7 @@ FrameGraphId PostProcessManager::colorGrading(FrameGraph& fg, auto const& input = resources.getDescriptor(data.input); auto const& output = resources.getDescriptor(data.output); - float4 vignetteParameters = getVignetteParameters( + float4 const vignetteParameters = getVignetteParameters( vignetteOptions, output.width, output.height); const float temporalNoise = mUniformDistribution(mEngine.getRandomEngine()); @@ -2387,16 +2547,13 @@ FrameGraphId PostProcessManager::colorGrading(FrameGraph& fg, mi->setParameter("fxaa", colorGradingConfig.fxaa); mi->setParameter("temporalNoise", temporalNoise); mi->setParameter("viewport", float4{ - (float)vp.left / input.width, - (float)vp.bottom / input.height, - (float)vp.width / input.width, - (float)vp.height / input.height + float(vp.left) / input.width, + float(vp.bottom) / input.height, + float(vp.width) / input.width, + float(vp.height) / input.height }); - const uint8_t variant = uint8_t(colorGradingConfig.translucent ? - PostProcessVariant::TRANSLUCENT : PostProcessVariant::OPAQUE); - - commitAndRender(out, material, variant, driver); + commitAndRenderFullScreenQuad(driver, out, mi, variant); } ); @@ -2404,15 +2561,15 @@ FrameGraphId PostProcessManager::colorGrading(FrameGraph& fg, } FrameGraphId PostProcessManager::fxaa(FrameGraph& fg, - FrameGraphId input, filament::Viewport const& vp, - TextureFormat outFormat, bool translucent) noexcept { + FrameGraphId const input, filament::Viewport const& vp, + TextureFormat const outFormat, bool const translucent) noexcept { struct PostProcessFXAA { FrameGraphId input; FrameGraphId output; }; - auto& ppFXAA = fg.addPass("fxaa", + auto const& ppFXAA = fg.addPass("fxaa", [&](FrameGraph::Builder& builder, auto& data) { data.input = builder.sample(input); data.output = builder.createTexture("fxaa output", { @@ -2423,67 +2580,125 @@ FrameGraphId PostProcessManager::fxaa(FrameGraph& fg, data.output = builder.declareRenderPass(data.output); }, [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); auto const& inDesc = resources.getDescriptor(data.input); auto const& texture = resources.getTexture(data.input); auto const& out = resources.getRenderPassInfo(); auto const& material = getPostProcessMaterial("fxaa"); - FMaterialInstance* mi = material.getMaterialInstance(mEngine); + + PostProcessVariant const variant = translucent ? + PostProcessVariant::TRANSLUCENT : PostProcessVariant::OPAQUE; + + FMaterialInstance* const mi = + PostProcessMaterial::getMaterialInstance(mEngine, material, variant); + mi->setParameter("colorBuffer", texture, { .filterMag = SamplerMagFilter::LINEAR, .filterMin = SamplerMinFilter::LINEAR }); mi->setParameter("viewport", float4{ - (float)vp.left / inDesc.width, - (float)vp.bottom / inDesc.height, - (float)vp.width / inDesc.width, - (float)vp.height / inDesc.height + float(vp.left) / inDesc.width, + float(vp.bottom) / inDesc.height, + float(vp.width) / inDesc.width, + float(vp.height) / inDesc.height }); mi->setParameter("texelSize", 1.0f / float2{ inDesc.width, inDesc.height }); - const uint8_t variant = uint8_t(translucent ? - PostProcessVariant::TRANSLUCENT : PostProcessVariant::OPAQUE); - - commitAndRender(out, material, variant, driver); + commitAndRenderFullScreenQuad(driver, out, mi, variant); }); return ppFXAA->output; } -void PostProcessManager::prepareTaa(FrameGraph& fg, filament::Viewport const& svp, +void PostProcessManager::TaaJitterCamera( + filament::Viewport const& svp, + TemporalAntiAliasingOptions const& taaOptions, FrameHistory& frameHistory, FrameHistoryEntry::TemporalAA FrameHistoryEntry::*pTaa, - CameraInfo* inoutCameraInfo, - PerViewUniforms& uniforms) const noexcept { + CameraInfo* inoutCameraInfo) const noexcept { auto const& previous = frameHistory.getPrevious().*pTaa; auto& current = frameHistory.getCurrent().*pTaa; // compute projection - current.projection = mat4f{ inoutCameraInfo->projection * inoutCameraInfo->getUserViewMatrix() }; + current.projection = inoutCameraInfo->projection * inoutCameraInfo->getUserViewMatrix(); current.frameId = previous.frameId + 1; + auto jitterPosition = [pattern = taaOptions.jitterPattern](size_t const frameIndex) -> float2 { + using JitterPattern = TemporalAntiAliasingOptions::JitterPattern; + switch (pattern) { + case JitterPattern::RGSS_X4: + return sRGSS4(frameIndex); + case JitterPattern::UNIFORM_HELIX_X4: + return sUniformHelix4(frameIndex); + case JitterPattern::HALTON_23_X8: + return sHaltonSamples(frameIndex % 8); + case JitterPattern::HALTON_23_X16: + return sHaltonSamples(frameIndex % 16); + case JitterPattern::HALTON_23_X32: + return sHaltonSamples(frameIndex); + } + return { 0.0f, 0.0f }; + }; + // sample position within a pixel [-0.5, 0.5] - const float2 jitter = halton(previous.frameId) - 0.5f; - current.jitter = jitter; + // for metal/vulkan we need to reverse the y-offset + current.jitter = jitterPosition(previous.frameId); + float2 jitter = current.jitter; + switch (mEngine.getBackend()) { + case Backend::VULKAN: + case Backend::METAL: + jitter.y = -jitter.y; + UTILS_FALLTHROUGH; + case Backend::OPENGL: + default: + break; + } - float2 jitterInClipSpace = jitter * (2.0f / float2{ svp.width, svp.height }); + float2 const jitterInClipSpace = jitter * (2.0f / float2{ svp.width, svp.height }); // update projection matrix inoutCameraInfo->projection[2].xy -= jitterInClipSpace; // VERTEX_DOMAIN_DEVICE doesn't apply the projection, but it still needs this // clip transform, so we apply it separately (see main.vs) - inoutCameraInfo->clipTransfrom.zw -= jitterInClipSpace; + inoutCameraInfo->clipTransform.zw -= jitterInClipSpace; +} - fg.addTrivialSideEffectPass("Jitter Camera", - [=, &uniforms] (DriverApi& driver) { - uniforms.prepareCamera(mEngine, *inoutCameraInfo); - uniforms.commit(driver); - }); +void PostProcessManager::configureTemporalAntiAliasingMaterial( + TemporalAntiAliasingOptions const& taaOptions) noexcept { + + FMaterial* const ma = getPostProcessMaterial("taa").getMaterial(mEngine); + bool dirty = false; + + auto setConstantParameter = + [&dirty](FMaterial* const material, std::string_view const name, auto value) noexcept { + auto id = material->getSpecializationConstantId(name); + if (id.has_value()) { + if (material->setConstant(id.value(), value)) { + dirty = true; + } + } + }; + + setConstantParameter(ma, "upscaling", taaOptions.upscaling); + setConstantParameter(ma, "historyReprojection", taaOptions.historyReprojection); + setConstantParameter(ma, "filterHistory", taaOptions.filterHistory); + setConstantParameter(ma, "filterInput", taaOptions.filterInput); + setConstantParameter(ma, "useYCoCg", taaOptions.useYCoCg); + setConstantParameter(ma, "preventFlickering", taaOptions.preventFlickering); + setConstantParameter(ma, "boxType", int32_t(taaOptions.boxType)); + setConstantParameter(ma, "boxClipping", int32_t(taaOptions.boxClipping)); + setConstantParameter(ma, "varianceGamma", taaOptions.varianceGamma); + if (dirty) { + ma->invalidate(); + // TODO: call Material::compile(), we can't si that now because it works only + // with surface materials + } } FrameGraphId PostProcessManager::taa(FrameGraph& fg, FrameGraphId input, - FrameGraphId depth, + FrameGraphId const depth, FrameHistory& frameHistory, FrameHistoryEntry::TemporalAA FrameHistoryEntry::*pTaa, TemporalAntiAliasingOptions const& taaOptions, @@ -2493,18 +2708,16 @@ FrameGraphId PostProcessManager::taa(FrameGraph& fg, auto const& previous = frameHistory.getPrevious().*pTaa; auto& current = frameHistory.getCurrent().*pTaa; - FrameGraphId colorHistory; - mat4f historyProjection; - if (UTILS_UNLIKELY(!previous.color.handle)) { - // if we don't have a history yet, just use the current color buffer as history - colorHistory = input; - historyProjection = current.projection; - } else { + // if we don't have a history yet, just use the current color buffer as history + FrameGraphId colorHistory = input; + if (UTILS_LIKELY(previous.color.handle)) { colorHistory = fg.import("TAA history", previous.desc, FrameGraphTexture::Usage::SAMPLEABLE, previous.color); - historyProjection = previous.projection; } + mat4 const& historyProjection = previous.color.handle ? + previous.projection : current.projection; + struct TAAData { FrameGraphId color; FrameGraphId depth; @@ -2512,9 +2725,13 @@ FrameGraphId PostProcessManager::taa(FrameGraph& fg, FrameGraphId output; FrameGraphId tonemappedOutput; }; - auto& taaPass = fg.addPass("TAA", + auto const& taaPass = fg.addPass("TAA", [&](FrameGraph::Builder& builder, auto& data) { auto desc = fg.getDescriptor(input); + if (taaOptions.upscaling) { + desc.width *= 2; + desc.height *= 2; + } data.color = builder.sample(input); data.depth = builder.sample(depth); data.history = builder.sample(colorHistory); @@ -2535,6 +2752,7 @@ FrameGraphId PostProcessManager::taa(FrameGraph& fg, }); }, [=, ¤t](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); constexpr mat4f normalizedToClip{mat4f::row_major_init{ 2, 0, 0, -1, @@ -2544,23 +2762,44 @@ FrameGraphId PostProcessManager::taa(FrameGraph& fg, }}; constexpr float2 sampleOffsets[9] = { - { -1.0f, -1.0f }, { 0.0f, -1.0f }, { 1.0f, -1.0f }, - { -1.0f, 0.0f }, { 0.0f, 0.0f }, { 1.0f, 0.0f }, - { -1.0f, 1.0f }, { 0.0f, 1.0f }, { 1.0f, 1.0f }, + { -1.0f, -1.0f }, { 0.0f, -1.0f }, { 1.0f, -1.0f }, { -1.0f, 0.0f }, + { 0.0f, 0.0f }, + { 1.0f, 0.0f }, { -1.0f, 1.0f }, { 0.0f, 1.0f }, { 1.0f, 1.0f }, }; - float sum = 0.0; - float weights[9]; + constexpr float2 subSampleOffsets[4] = { + { -0.25f, 0.25f }, + { 0.25f, 0.25f }, + { 0.25f, -0.25f }, + { -0.25f, -0.25f } + }; + + UTILS_UNUSED + auto const lanczos = [](float const x, float const a) -> float { + if (x <= std::numeric_limits::epsilon()) { + return 1.0f; + } + if (std::abs(x) <= a) { + return (a * std::sin(f::PI * x) * std::sin(f::PI * x / a)) + / ((f::PI * f::PI) * (x * x)); + } + return 0.0f; + }; + + float const filterWidth = std::clamp(taaOptions.filterWidth, 1.0f, 2.0f); + float4 sum = 0.0; + float4 weights[9]; // this doesn't get vectorized (probably because of exp()), so don't bother // unrolling it. - #pragma nounroll + UTILS_NOUNROLL for (size_t i = 0; i < 9; i++) { - float2 d = sampleOffsets[i] - current.jitter; - d *= 1.0f / taaOptions.filterWidth; - // this is a gaussian fit of a 3.3 Blackman Harris window - // see: "High Quality Temporal Supersampling" by Brian Karis - weights[i] = std::exp2(-3.3f * (d.x * d.x + d.y * d.y)); + float2 const o = sampleOffsets[i]; + for (size_t j = 0; j < 4; j++) { + float2 const subPixelOffset = taaOptions.upscaling ? subSampleOffsets[j] : float2{ 0 }; + float2 const d = (o - (current.jitter - subPixelOffset)) / filterWidth; + weights[i][j] = lanczos(length(d), filterWidth); + } sum += weights[i]; } for (auto& w : weights) { @@ -2571,9 +2810,14 @@ FrameGraphId PostProcessManager::taa(FrameGraph& fg, auto color = resources.getTexture(data.color); auto depth = resources.getTexture(data.depth); auto history = resources.getTexture(data.history); - auto const& material = getPostProcessMaterial("taa"); - FMaterialInstance* mi = material.getMaterialInstance(mEngine); + + PostProcessVariant const variant = colorGradingConfig.translucent ? + PostProcessVariant::TRANSLUCENT : PostProcessVariant::OPAQUE; + + FMaterial const* const ma = material.getMaterial(mEngine, variant); + + FMaterialInstance* mi = PostProcessMaterial::getMaterialInstance(ma); mi->setParameter("color", color, {}); // nearest mi->setParameter("depth", depth, {}); // nearest mi->setParameter("alpha", taaOptions.feedback); @@ -2582,23 +2826,21 @@ FrameGraphId PostProcessManager::taa(FrameGraph& fg, .filterMin = SamplerMinFilter::LINEAR }); mi->setParameter("filterWeights", weights, 9); + mi->setParameter("jitter", current.jitter); mi->setParameter("reprojection", - historyProjection * - inverse(current.projection) * + mat4f{ historyProjection * inverse(current.projection) } * normalizedToClip); mi->commit(driver); mi->use(driver); - const uint8_t variant = uint8_t(colorGradingConfig.translucent ? - PostProcessVariant::TRANSLUCENT : PostProcessVariant::OPAQUE); - if (colorGradingConfig.asSubpass) { out.params.subpassMask = 1; } - PipelineState pipeline(material.getPipelineState(mEngine, variant)); + auto const pipeline = getPipelineState(ma, variant); + driver.beginRenderPass(out.target, out.params); - driver.draw(pipeline, mEngine.getFullScreenRenderPrimitive(), 1); + driver.draw(pipeline, mFullScreenQuadRph, 0, 3, 1); if (colorGradingConfig.asSubpass) { colorGradingSubpass(driver, colorGradingConfig); } @@ -2606,79 +2848,81 @@ FrameGraphId PostProcessManager::taa(FrameGraph& fg, }); input = colorGradingConfig.asSubpass ? taaPass->tonemappedOutput : taaPass->output; + auto const history = input; + + // optional sharpen pass from FSR1 + if (taaOptions.sharpness > 0.0f) { + input = rcas(fg, taaOptions.sharpness, + input, fg.getDescriptor(input), colorGradingConfig.translucent); + } struct ExportColorHistoryData { FrameGraphId color; }; - auto& exportHistoryPass = fg.addPass("Export TAA history", + fg.addPass("Export TAA history", [&](FrameGraph::Builder& builder, auto& data) { // We need to use sideEffect here to ensure this pass won't be culled. // The "output" of this pass is going to be used during the next frame as // an "import". builder.sideEffect(); - data.color = builder.sample(input); // FIXME: an access must be declared for detach(), why? - }, [¤t](FrameGraphResources const& resources, auto const& data, - backend::DriverApi&) { - resources.detach(data.color, - ¤t.color, ¤t.desc); + data.color = builder.sample(history); // FIXME: an access must be declared for detach(), why? + }, [¤t](FrameGraphResources const& resources, auto const& data, auto&) { + resources.detach(data.color, ¤t.color, ¤t.desc); }); - return exportHistoryPass->color; + return input; } -FrameGraphId PostProcessManager::opaqueBlit(FrameGraph& fg, - FrameGraphId input, filament::Viewport const& vp, +FrameGraphId PostProcessManager::rcas( + FrameGraph& fg, + float const sharpness, + FrameGraphId const input, FrameGraphTexture::Descriptor const& outDesc, - SamplerMagFilter filter) noexcept { + bool const translucent) { - struct PostProcessScaling { + struct QuadBlitData { FrameGraphId input; FrameGraphId output; }; - auto& ppBlit = fg.addPass("opaque blit", + auto const& ppFsrRcas = fg.addPass("FidelityFX FSR1 Rcas", [&](FrameGraph::Builder& builder, auto& data) { - - // we currently have no use for this case, so we just assert. This is better for now to trap - // cases that we might not intend. - assert_invariant(fg.getDescriptor(input).samples <= 1); - - data.output = builder.declareRenderPass( - builder.createTexture("opaque blit output", outDesc)); - - data.input = builder.read(input); - - // We use a RenderPass for the source here, instead of just creating a render - // target from data.input in the execute closure, because data.input may refer to - // an imported render target and in this case data.input won't resolve to an actual - // HwTexture handle. Using a RenderPass works because data.input will resolve - // to the actual imported render target and will have the correct viewport. - builder.declareRenderPass("opaque blit input", { - .attachments = { .color = { data.input }}, - .viewport = vp - }); + data.input = builder.sample(input); + data.output = builder.createTexture("FFX FSR1 Rcas output", outDesc); + data.output = builder.declareRenderPass(data.output); }, - [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { - auto out = resources.getRenderPassInfo(0); - auto in = resources.getRenderPassInfo(1); - driver.blit(TargetBufferFlags::COLOR, - out.target, out.params.viewport, - in.target, in.params.viewport, - filter); + [=](FrameGraphResources const& resources, + auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); + + auto const input = resources.getTexture(data.input); + auto const out = resources.getRenderPassInfo(); + auto const& outputDesc = resources.getDescriptor(data.input); + + PostProcessVariant const variant = translucent ? + PostProcessVariant::TRANSLUCENT : PostProcessVariant::OPAQUE; + + auto const& material = getPostProcessMaterial("fsr_rcas"); + FMaterialInstance* const mi = + PostProcessMaterial::getMaterialInstance(mEngine, material, variant); + + FSRUniforms uniforms; + FSR_SharpeningSetup(&uniforms, { .sharpness = 2.0f - 2.0f * sharpness }); + mi->setParameter("RcasCon", uniforms.RcasCon); + mi->setParameter("color", input, {}); // uses texelFetch + mi->setParameter("resolution", float4{ + outputDesc.width, outputDesc.height, + 1.0f / outputDesc.width, 1.0f / outputDesc.height }); + commitAndRenderFullScreenQuad(driver, out, mi, variant); }); - // we rely on automatic culling of unused render passes - return ppBlit->output; + return ppFsrRcas->output; } FrameGraphId PostProcessManager::upscale(FrameGraph& fg, bool translucent, - DynamicResolutionOptions dsrOptions, FrameGraphId input, + DynamicResolutionOptions dsrOptions, FrameGraphId const input, filament::Viewport const& vp, FrameGraphTexture::Descriptor const& outDesc, - backend::SamplerMagFilter filter) noexcept { - - if (UTILS_LIKELY(!translucent && dsrOptions.quality == QualityLevel::LOW)) { - return opaqueBlit(fg, input, vp, outDesc, filter); - } + SamplerMagFilter filter) noexcept { // The code below cannot handle sub-resources assert_invariant(fg.getSubResourceDescriptor(input).layer == 0); @@ -2700,7 +2944,7 @@ FrameGraphId PostProcessManager::upscale(FrameGraph& fg, bool FrameGraphId depth; }; - auto& ppQuadBlit = fg.addPass(dsrOptions.enabled ? "upscaling" : "compositing", + auto const& ppQuadBlit = fg.addPass(dsrOptions.enabled ? "upscaling" : "compositing", [&](FrameGraph::Builder& builder, auto& data) { data.input = builder.sample(input); data.output = builder.createTexture("upscaled output", outDesc); @@ -2722,6 +2966,7 @@ FrameGraphId PostProcessManager::upscale(FrameGraph& fg, bool }, [this, twoPassesEASU, dsrOptions, vp, translucent, filter](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); // helper to set the EASU uniforms auto setEasuUniforms = [vp, backend = mEngine.getBackend()](FMaterialInstance* mi, @@ -2764,7 +3009,8 @@ FrameGraphId PostProcessManager::upscale(FrameGraph& fg, bool if (twoPassesEASU) { splitEasuMaterial = &getPostProcessMaterial("fsr_easu_mobileF"); - auto* mi = splitEasuMaterial->getMaterialInstance(mEngine); + FMaterialInstance* const mi = + PostProcessMaterial::getMaterialInstance(mEngine, *splitEasuMaterial); setEasuUniforms(mi, inputDesc, outputDesc); mi->setParameter("color", color, { .filterMag = SamplerMagFilter::LINEAR @@ -2779,9 +3025,10 @@ FrameGraphId PostProcessManager::upscale(FrameGraph& fg, bool { // just a scope to not leak local variables const std::string_view blitterNames[4] = { "blitLow", "fsr_easu_mobile", "fsr_easu_mobile", "fsr_easu" }; - unsigned index = std::min(3u, (unsigned)dsrOptions.quality); + unsigned const index = std::min(3u, unsigned(dsrOptions.quality)); easuMaterial = &getPostProcessMaterial(blitterNames[index]); - auto* mi = easuMaterial->getMaterialInstance(mEngine); + FMaterialInstance* const mi = + PostProcessMaterial::getMaterialInstance(mEngine, *easuMaterial); if (dsrOptions.quality != QualityLevel::LOW) { setEasuUniforms(mi, inputDesc, outputDesc); } @@ -2789,14 +3036,22 @@ FrameGraphId PostProcessManager::upscale(FrameGraph& fg, bool .filterMag = (dsrOptions.quality == QualityLevel::LOW) ? filter : SamplerMagFilter::LINEAR }); - mi->setParameter("resolution", - float4{ outputDesc.width, outputDesc.height, - 1.0f / outputDesc.width, 1.0f / outputDesc.height }); + + if (blitterNames[index] != "blitLow") { + mi->setParameter("resolution", + float4{outputDesc.width, outputDesc.height, 1.0f / outputDesc.width, + 1.0f / outputDesc.height}); + } + + if (blitterNames[index] == "blitLow") { + mi->setParameter("levelOfDetail", 0.0f); + } + mi->setParameter("viewport", float4{ - (float)vp.left / inputDesc.width, - (float)vp.bottom / inputDesc.height, - (float)vp.width / inputDesc.width, - (float)vp.height / inputDesc.height + float(vp.left) / inputDesc.width, + float(vp.bottom) / inputDesc.height, + float(vp.width) / inputDesc.width, + float(vp.height) / inputDesc.height }); mi->commit(driver); mi->use(driver); @@ -2805,169 +3060,302 @@ FrameGraphId PostProcessManager::upscale(FrameGraph& fg, bool // -------------------------------------------------------------------------------- // render pass with draw calls - auto fullScreenRenderPrimitive = mEngine.getFullScreenRenderPrimitive(); - auto out = resources.getRenderPassInfo(); if (UTILS_UNLIKELY(twoPassesEASU)) { - PipelineState pipeline0(splitEasuMaterial->getPipelineState(mEngine)); - PipelineState pipeline1(easuMaterial->getPipelineState(mEngine)); - pipeline1.rasterState.depthFunc = backend::SamplerCompareFunc::NE; + auto pipeline0 = getPipelineState(splitEasuMaterial->getMaterial(mEngine)); + auto pipeline1 = getPipelineState(easuMaterial->getMaterial(mEngine)); + pipeline1.rasterState.depthFunc = SamplerCompareFunc::NE; if (translucent) { enableTranslucentBlending(pipeline0); enableTranslucentBlending(pipeline1); } driver.beginRenderPass(out.target, out.params); - driver.draw(pipeline0, fullScreenRenderPrimitive, 1); - driver.draw(pipeline1, fullScreenRenderPrimitive, 1); + driver.draw(pipeline0, mFullScreenQuadRph, 0, 3, 1); + driver.draw(pipeline1, mFullScreenQuadRph, 0, 3, 1); driver.endRenderPass(); } else { - PipelineState pipeline(easuMaterial->getPipelineState(mEngine)); + auto pipeline = getPipelineState(easuMaterial->getMaterial(mEngine)); if (translucent) { enableTranslucentBlending(pipeline); } - driver.beginRenderPass(out.target, out.params); - driver.draw(pipeline, fullScreenRenderPrimitive, 1); - driver.endRenderPass(); + renderFullScreenQuad(out, pipeline, driver); } }); auto output = ppQuadBlit->output; // if we had to take the low quality fallback, we still do the "sharpen pass" - if (dsrOptions.sharpness > 0.0f && (dsrOptions.quality != QualityLevel::LOW || lowQualityFallback)) { - auto& ppFsrRcas = fg.addPass("FidelityFX FSR1 Rcas", - [&](FrameGraph::Builder& builder, auto& data) { - data.input = builder.sample(output); - data.output = builder.createTexture("FFX FSR1 Rcas output", outDesc); - data.output = builder.declareRenderPass(data.output); - }, - [=](FrameGraphResources const& resources, - auto const& data, DriverApi& driver) { + if (dsrOptions.sharpness > 0.0f && + (dsrOptions.quality != QualityLevel::LOW || lowQualityFallback)) { + output = rcas(fg, dsrOptions.sharpness, output, outDesc, translucent); + } - auto color = resources.getTexture(data.input); - auto out = resources.getRenderPassInfo(); - auto const& outputDesc = resources.getDescriptor(data.output); + // we rely on automatic culling of unused render passes + return output; +} - auto& material = getPostProcessMaterial("fsr_rcas"); - FMaterialInstance* const mi = material.getMaterialInstance(mEngine); +FrameGraphId PostProcessManager::blit(FrameGraph& fg, bool const translucent, + FrameGraphId const input, + filament::Viewport const& vp, FrameGraphTexture::Descriptor const& outDesc, + SamplerMagFilter filterMag, + SamplerMinFilter filterMin) noexcept { - FSRUniforms uniforms; - FSR_SharpeningSetup(&uniforms, { .sharpness = 2.0f - 2.0f * dsrOptions.sharpness }); - mi->setParameter("RcasCon", uniforms.RcasCon); - mi->setParameter("color", color, { }); // uses texelFetch - mi->setParameter("resolution", float4{ - outputDesc.width, outputDesc.height, - 1.0f / outputDesc.width, 1.0f / outputDesc.height }); - mi->commit(driver); - mi->use(driver); + uint32_t const layer = fg.getSubResourceDescriptor(input).layer; + float const levelOfDetail = fg.getSubResourceDescriptor(input).level; + + struct QuadBlitData { + FrameGraphId input; + FrameGraphId output; + }; - const uint8_t variant = uint8_t(translucent ? - PostProcessVariant::TRANSLUCENT : PostProcessVariant::OPAQUE); + auto const& ppQuadBlit = fg.addPass("blitting", + [&](FrameGraph::Builder& builder, auto& data) { + data.input = builder.sample(input); + data.output = builder.createTexture("blit output", outDesc); + data.output = builder.write(data.output, + FrameGraphTexture::Usage::COLOR_ATTACHMENT); + builder.declareRenderPass(builder.getName(data.output), { + .attachments = { .color = { data.output }}, + .clearFlags = TargetBufferFlags::DEPTH }); + }, + [=](FrameGraphResources const& resources, + auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); + auto color = resources.getTexture(data.input); + auto const& inputDesc = resources.getDescriptor(data.input); + auto out = resources.getRenderPassInfo(); + + // -------------------------------------------------------------------------------- + // set uniforms - PipelineState pipeline(material.getPipelineState(mEngine, variant)); - render(out, pipeline, driver); + PostProcessMaterial const& material = + getPostProcessMaterial(layer ? "blitArray" : "blitLow"); + FMaterial const* const ma = material.getMaterial(mEngine); + auto* mi = PostProcessMaterial::getMaterialInstance(ma); + mi->setParameter("color", color, { + .filterMag = filterMag, + .filterMin = filterMin + }); + mi->setParameter("viewport", float4{ + float(vp.left) / inputDesc.width, + float(vp.bottom) / inputDesc.height, + float(vp.width) / inputDesc.width, + float(vp.height) / inputDesc.height }); + mi->setParameter("levelOfDetail", levelOfDetail); + if (layer) { + mi->setParameter("layerIndex", layer); + } + mi->commit(driver); + mi->use(driver); - output = ppFsrRcas->output; - } + auto pipeline = getPipelineState(ma); + if (translucent) { + pipeline.rasterState.blendFunctionSrcRGB = BlendFunction::ONE; + pipeline.rasterState.blendFunctionSrcAlpha = BlendFunction::ONE; + pipeline.rasterState.blendFunctionDstRGB = BlendFunction::ONE_MINUS_SRC_ALPHA; + pipeline.rasterState.blendFunctionDstAlpha = BlendFunction::ONE_MINUS_SRC_ALPHA; + } + renderFullScreenQuad(out, pipeline, driver); + }); - // we rely on automatic culling of unused render passes - return output; + return ppQuadBlit->output; } -FrameGraphId PostProcessManager::blit(FrameGraph& fg, bool translucent, - FrameGraphId input, filament::Viewport const& vp, - FrameGraphTexture::Descriptor const& outDesc, - backend::SamplerMagFilter filter) noexcept { - // for now, we implement this by calling upscale() with the low-quality setting. - return upscale(fg, translucent, { .quality = QualityLevel::LOW }, input, vp, outDesc, filter); +FrameGraphId PostProcessManager::blitDepth(FrameGraph& fg, + FrameGraphId const input) noexcept { + auto const& inputDesc = fg.getDescriptor(input); + filament::Viewport const vp = {0, 0, inputDesc.width, inputDesc.height}; + bool const hardwareBlitSupported = + mEngine.getDriverApi().isDepthStencilBlitSupported(inputDesc.format); + + struct BlitData { + FrameGraphId input; + FrameGraphId output; + }; + + if (hardwareBlitSupported) { + auto const& depthPass = fg.addPass( + "Depth Blit", + [&](FrameGraph::Builder& builder, auto& data) { + data.input = builder.read(input, FrameGraphTexture::Usage::BLIT_SRC); + + auto desc = builder.getDescriptor(data.input); + desc.levels = 1;// only copy the base level + + // create a new buffer for the copy + data.output = builder.createTexture("depth blit output", desc); + + // output is an attachment + data.output = builder.write(data.output, FrameGraphTexture::Usage::BLIT_DST); + }, + [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + auto const& src = resources.getTexture(data.input); + auto const& dst = resources.getTexture(data.output); + auto const& srcSubDesc = resources.getSubResourceDescriptor(data.input); + auto const& dstSubDesc = resources.getSubResourceDescriptor(data.output); + auto const& desc = resources.getDescriptor(data.output); + assert_invariant(desc.samples == resources.getDescriptor(data.input).samples); + // here we can guarantee that src and dst format and size match, by + // construction. + driver.blit( + dst, dstSubDesc.level, dstSubDesc.layer, { 0, 0 }, + src, srcSubDesc.level, srcSubDesc.layer, { 0, 0 }, + { desc.width, desc.height }); + }); + return depthPass->output; + } + // Otherwise, we would do a shader-based blit. + + auto const& ppQuadBlit = fg.addPass( + "Depth Blit (Shader)", + [&](FrameGraph::Builder& builder, auto& data) { + data.input = builder.sample(input); + // Note that this is a same size/format blit. + auto const& outputDesc = inputDesc; + data.output = builder.createTexture("depth blit output", outputDesc); + data.output = + builder.write(data.output, FrameGraphTexture::Usage::DEPTH_ATTACHMENT); + builder.declareRenderPass(builder.getName(data.output), + {.attachments = {.depth = {data.output}}}); + }, + [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); + auto depth = resources.getTexture(data.input); + auto const& inputDesc = resources.getDescriptor(data.input); + auto const out = resources.getRenderPassInfo(); + + // -------------------------------------------------------------------------------- + // set uniforms + PostProcessMaterial const& material = getPostProcessMaterial("blitDepth"); + FMaterialInstance* const mi = + PostProcessMaterial::getMaterialInstance(mEngine, material); + mi->setParameter("depth", depth, + { + .filterMag = SamplerMagFilter::NEAREST, + .filterMin = SamplerMinFilter::NEAREST, + }); + mi->setParameter("viewport", + float4{float(vp.left) / inputDesc.width, + float(vp.bottom) / inputDesc.height, float(vp.width) / inputDesc.width, + float(vp.height) / inputDesc.height}); + commitAndRenderFullScreenQuad(driver, out, mi); + }); + + return ppQuadBlit->output; } -FrameGraphId PostProcessManager::resolveBaseLevel(FrameGraph& fg, - const char* outputBufferName, FrameGraphId input) noexcept { +FrameGraphId PostProcessManager::resolve(FrameGraph& fg, + const char* outputBufferName, FrameGraphId const input, + FrameGraphTexture::Descriptor outDesc) noexcept { + // Don't do anything if we're not a MSAA buffer - auto desc = fg.getDescriptor(input); - if (desc.samples <= 1) { + auto const& inDesc = fg.getDescriptor(input); + if (inDesc.samples <= 1) { return input; } - desc.samples = 0; - desc.levels = 1; - return resolveBaseLevelNoCheck(fg, outputBufferName, input, desc); -} -FrameGraphId PostProcessManager::resolveBaseLevelNoCheck(FrameGraph& fg, - const char* outputBufferName, FrameGraphId input, - FrameGraphTexture::Descriptor const& desc) noexcept { + // we currently don't support stencil resolve + assert_invariant(!isStencilFormat(inDesc.format)); + + // The Metal / Vulkan backends currently don't support depth/stencil resolve. + if (isDepthFormat(inDesc.format) && (!mEngine.getDriverApi().isDepthStencilResolveSupported())) { + return resolveDepth(fg, outputBufferName, input, outDesc); + } + + outDesc.width = inDesc.width; + outDesc.height = inDesc.height; + outDesc.format = inDesc.format; + outDesc.samples = 0; struct ResolveData { FrameGraphId input; FrameGraphId output; - backend::TargetBufferFlags inFlags; - FrameGraphTexture::Usage usage; }; - auto& ppResolve = fg.addPass("resolve", + auto const& ppResolve = fg.addPass("resolve", [&](FrameGraph::Builder& builder, auto& data) { - FrameGraphRenderPass::Descriptor rpDesc; - - auto& rpDescAttachment = isDepthFormat(desc.format) ? - rpDesc.attachments.depth : - rpDesc.attachments.color[0]; - - data.usage = isDepthFormat(desc.format) ? - FrameGraphTexture::Usage::DEPTH_ATTACHMENT : - FrameGraphTexture::Usage::COLOR_ATTACHMENT; + data.input = builder.read(input, FrameGraphTexture::Usage::BLIT_SRC); + data.output = builder.createTexture(outputBufferName, outDesc); + data.output = builder.write(data.output, FrameGraphTexture::Usage::BLIT_DST); + }, + [](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + auto const& src = resources.getTexture(data.input); + auto const& dst = resources.getTexture(data.output); + auto const& srcSubDesc = resources.getSubResourceDescriptor(data.input); + auto const& dstSubDesc = resources.getSubResourceDescriptor(data.output); + UTILS_UNUSED_IN_RELEASE auto const& srcDesc = resources.getDescriptor(data.input); + UTILS_UNUSED_IN_RELEASE auto const& dstDesc = resources.getDescriptor(data.output); + assert_invariant(src); + assert_invariant(dst); + assert_invariant(srcDesc.format == dstDesc.format); + assert_invariant(srcDesc.width == dstDesc.width && srcDesc.height == dstDesc.height); + assert_invariant(srcDesc.samples > 1 && dstDesc.samples <= 1); + driver.resolve( + dst, dstSubDesc.level, dstSubDesc.layer, + src, srcSubDesc.level, srcSubDesc.layer); + }); - data.inFlags = isDepthFormat(desc.format) ? - backend::TargetBufferFlags::DEPTH : - backend::TargetBufferFlags::COLOR0; + return ppResolve->output; +} - data.input = builder.read(input, data.usage); +FrameGraphId PostProcessManager::resolveDepth(FrameGraph& fg, + const char* outputBufferName, FrameGraphId const input, + FrameGraphTexture::Descriptor outDesc) noexcept { - rpDescAttachment = builder.createTexture(outputBufferName, desc); - rpDescAttachment = builder.write(rpDescAttachment, data.usage); - data.output = rpDescAttachment; - builder.declareRenderPass("Resolve Pass", rpDesc); - }, - [](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { - auto inDesc = resources.getDescriptor(data.input); - auto in = resources.getTexture(data.input); - auto out = resources.getRenderPassInfo(); + // Don't do anything if we're not a MSAA buffer + auto const& inDesc = fg.getDescriptor(input); + if (inDesc.samples <= 1) { + return input; + } - assert_invariant(in); + UTILS_UNUSED_IN_RELEASE auto const& inSubDesc = fg.getSubResourceDescriptor(input); + assert_invariant(isDepthFormat(inDesc.format)); + assert_invariant(inSubDesc.layer == 0); + assert_invariant(inSubDesc.level == 0); - Handle inRt; - if (data.usage == FrameGraphTexture::Usage::COLOR_ATTACHMENT) { - inRt = driver.createRenderTarget(data.inFlags, - out.params.viewport.width, out.params.viewport.height, - inDesc.samples, {{ in }}, {}, {}); - } - if (data.usage == FrameGraphTexture::Usage::DEPTH_ATTACHMENT) { - inRt = driver.createRenderTarget(data.inFlags, - out.params.viewport.width, out.params.viewport.height, - inDesc.samples, {}, { in }, {}); - } + outDesc.width = inDesc.width; + outDesc.height = inDesc.height; + outDesc.format = inDesc.format; + outDesc.samples = 0; - driver.blit(data.inFlags, - out.target, out.params.viewport, inRt, out.params.viewport, - SamplerMagFilter::NEAREST); + struct ResolveData { + FrameGraphId input; + FrameGraphId output; + }; - driver.destroyRenderTarget(inRt); + auto const& ppResolve = fg.addPass("resolveDepth", + [&](FrameGraph::Builder& builder, auto& data) { + data.input = builder.sample(input); + data.output = builder.createTexture(outputBufferName, outDesc); + data.output = builder.write(data.output, FrameGraphTexture::Usage::DEPTH_ATTACHMENT); + builder.declareRenderPass(builder.getName(data.output), { + .attachments = { .depth = { data.output }}, + .clearFlags = TargetBufferFlags::DEPTH }); + }, + [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); + auto const& input = resources.getTexture(data.input); + auto const& material = getPostProcessMaterial("resolveDepth"); + FMaterialInstance* const mi = + PostProcessMaterial::getMaterialInstance(mEngine, material); + mi->setParameter("depth", input, {}); // NEAREST + commitAndRenderFullScreenQuad(driver, resources.getRenderPassInfo(), mi); }); return ppResolve->output; } FrameGraphId PostProcessManager::vsmMipmapPass(FrameGraph& fg, - FrameGraphId input, uint8_t layer, size_t level, - math::float4 clearColor, bool finalize) noexcept { + FrameGraphId const input, uint8_t layer, size_t const level, + float4 clearColor) noexcept { struct VsmMipData { FrameGraphId in; }; - auto& depthMipmapPass = fg.addPass("VSM Generate Mipmap Pass", + auto const& depthMipmapPass = fg.addPass("VSM Generate Mipmap Pass", [&](FrameGraph::Builder& builder, auto& data) { const char* name = builder.getName(input); data.in = builder.sample(input); @@ -2984,42 +3372,202 @@ FrameGraphId PostProcessManager::vsmMipmapPass(FrameGraph& fg }, [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); - auto in = resources.getTexture(data.in); + auto in = driver.createTextureView(resources.getTexture(data.in), level, 1); auto out = resources.getRenderPassInfo(); auto const& inDesc = resources.getDescriptor(data.in); auto width = inDesc.width; assert_invariant(width == inDesc.height); - int dim = width >> (level + 1); - - driver.setMinMaxLevels(in, level, level); + int const dim = width >> (level + 1); auto& material = getPostProcessMaterial("vsmMipmap"); + FMaterial const* const ma = material.getMaterial(mEngine); // When generating shadow map mip levels, we want to preserve the 1 texel border. - // (note clearing never respects the scissor in filament) - PipelineState pipeline(material.getPipelineState(mEngine)); - pipeline.scissor = { 1u, 1u, dim - 2u, dim - 2u }; + // (note clearing never respects the scissor in Filament) + auto const pipeline = getPipelineState(ma); + backend::Viewport const scissor = { 1u, 1u, dim - 2u, dim - 2u }; - FMaterialInstance* const mi = material.getMaterialInstance(mEngine); + FMaterialInstance* const mi = PostProcessMaterial::getMaterialInstance(ma); mi->setParameter("color", in, { .filterMag = SamplerMagFilter::LINEAR, .filterMin = SamplerMinFilter::LINEAR_MIPMAP_NEAREST }); - mi->setParameter("level", uint32_t(level)); mi->setParameter("layer", uint32_t(layer)); - mi->setParameter("uvscale", 1.0f / dim); + mi->setParameter("uvscale", 1.0f / float(dim)); mi->commit(driver); mi->use(driver); - render(out, pipeline, driver); - if (finalize) { - driver.setMinMaxLevels(in, 0, level); - } + renderFullScreenQuadWithScissor(out, pipeline, scissor, driver); + + driver.destroyTexture(in); // `in` is just a view on `data.in` }); return depthMipmapPass->in; } +FrameGraphId PostProcessManager::debugShadowCascades(FrameGraph& fg, + FrameGraphId const input, + FrameGraphId const depth) noexcept { + + // new pass for showing the cascades + struct DebugShadowCascadesData { + FrameGraphId color; + FrameGraphId depth; + FrameGraphId output; + }; + auto const& debugShadowCascadePass = fg.addPass("ShadowCascades", + [&](FrameGraph::Builder& builder, auto& data) { + auto const desc = builder.getDescriptor(input); + data.color = builder.sample(input); + data.depth = builder.sample(depth); + data.output = builder.createTexture("Shadow Cascade Debug", desc); + builder.declareRenderPass(data.output); + }, + [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); + auto color = resources.getTexture(data.color); + auto depth = resources.getTexture(data.depth); + auto const out = resources.getRenderPassInfo(); + auto const& material = getPostProcessMaterial("debugShadowCascades"); + FMaterialInstance* const mi = + PostProcessMaterial::getMaterialInstance(mEngine, material); + mi->setParameter("color", color, {}); // nearest + mi->setParameter("depth", depth, {}); // nearest + commitAndRenderFullScreenQuad(driver, out, mi); + }); + + return debugShadowCascadePass->output; +} + +FrameGraphId PostProcessManager::debugCombineArrayTexture(FrameGraph& fg, + bool const translucent, FrameGraphId const input, + filament::Viewport const& vp, FrameGraphTexture::Descriptor const& outDesc, + SamplerMagFilter filterMag, + SamplerMinFilter filterMin) noexcept { + + auto& inputTextureDesc = fg.getDescriptor(input); + assert_invariant(inputTextureDesc.depth > 1); + assert_invariant(inputTextureDesc.type == SamplerType::SAMPLER_2D_ARRAY); + + // TODO: add support for sub-resources + assert_invariant(fg.getSubResourceDescriptor(input).layer == 0); + assert_invariant(fg.getSubResourceDescriptor(input).level == 0); + + struct QuadBlitData { + FrameGraphId input; + FrameGraphId output; + }; + + auto const& ppQuadBlit = fg.addPass("combining array tex", + [&](FrameGraph::Builder& builder, auto& data) { + data.input = builder.sample(input); + data.output = builder.createTexture("upscaled output", outDesc); + data.output = builder.write(data.output, + FrameGraphTexture::Usage::COLOR_ATTACHMENT); + builder.declareRenderPass(builder.getName(data.output), { + .attachments = {.color = { data.output }}, + .clearFlags = TargetBufferFlags::DEPTH }); + }, + [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); + auto color = resources.getTexture(data.input); + auto const& inputDesc = resources.getDescriptor(data.input); + auto out = resources.getRenderPassInfo(); + + // -------------------------------------------------------------------------------- + // set uniforms + + PostProcessMaterial const& material = getPostProcessMaterial("blitArray"); + FMaterial const* const ma = material.getMaterial(mEngine); + auto* mi = PostProcessMaterial::getMaterialInstance(ma); + mi->setParameter("color", color, { + .filterMag = filterMag, + .filterMin = filterMin + }); + mi->setParameter("viewport", float4{ + float(vp.left) / inputDesc.width, + float(vp.bottom) / inputDesc.height, + float(vp.width) / inputDesc.width, + float(vp.height) / inputDesc.height + }); + mi->commit(driver); + mi->use(driver); + + auto pipeline = getPipelineState(ma); + if (translucent) { + pipeline.rasterState.blendFunctionSrcRGB = BlendFunction::ONE; + pipeline.rasterState.blendFunctionSrcAlpha = BlendFunction::ONE; + pipeline.rasterState.blendFunctionDstRGB = BlendFunction::ONE_MINUS_SRC_ALPHA; + pipeline.rasterState.blendFunctionDstAlpha = BlendFunction::ONE_MINUS_SRC_ALPHA; + } + + // The width of each view takes up 1/depth of the screen width. + out.params.viewport.width /= inputTextureDesc.depth; + + // Render all layers of the texture to the screen side-by-side. + for (uint32_t i = 0; i < inputTextureDesc.depth; ++i) { + mi->setParameter("layerIndex", i); + mi->commit(driver); + renderFullScreenQuad(out, pipeline, driver); + // From the second draw, don't clear the targetbuffer. + out.params.flags.clear = TargetBufferFlags::NONE; + out.params.flags.discardStart = TargetBufferFlags::NONE; + out.params.viewport.left += out.params.viewport.width; + } + }); + + return ppQuadBlit->output; +} + +FrameGraphId PostProcessManager::debugDisplayShadowTexture( + FrameGraph& fg, + FrameGraphId input, + FrameGraphId const shadowmap, float const scale, + uint8_t const layer, uint8_t const level, uint8_t const channel, float const power) noexcept { + if (shadowmap) { + struct ShadowMapData { + FrameGraphId color; + FrameGraphId depth; + }; + + auto const& desc = fg.getDescriptor(input); + float const ratio = float(desc.height) / float(desc.width); + float const screenScale = float(fg.getDescriptor(shadowmap).height) / float(desc.height); + float2 const s = { screenScale * scale * ratio, screenScale * scale }; + + auto const& shadomapDebugPass = fg.addPass("shadowmap debug pass", + [&](FrameGraph::Builder& builder, auto& data) { + data.color = builder.read(input, + FrameGraphTexture::Usage::COLOR_ATTACHMENT); + data.color = builder.write(data.color, + FrameGraphTexture::Usage::COLOR_ATTACHMENT); + data.depth = builder.sample(shadowmap); + builder.declareRenderPass("color target", { + .attachments = { .color = { data.color }} + }); + }, + [=](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + bindPostProcessDescriptorSet(driver); + auto const out = resources.getRenderPassInfo(); + auto in = resources.getTexture(data.depth); + auto const& material = getPostProcessMaterial("shadowmap"); + FMaterialInstance* const mi = + PostProcessMaterial::getMaterialInstance(mEngine, material); + mi->setParameter("shadowmap", in, { + .filterMin = SamplerMinFilter::NEAREST_MIPMAP_NEAREST }); + mi->setParameter("scale", s); + mi->setParameter("layer", (uint32_t)layer); + mi->setParameter("level", (uint32_t)level); + mi->setParameter("channel", (uint32_t)channel); + mi->setParameter("power", power); + commitAndRenderFullScreenQuad(driver, out, mi); + }); + input = shadomapDebugPass->color; + } + return input; +} + } // namespace filament diff --git a/filament/src/PostProcessManager.h b/filament/src/PostProcessManager.h index 7ac387f5e90..c435cdccd98 100644 --- a/filament/src/PostProcessManager.h +++ b/filament/src/PostProcessManager.h @@ -21,21 +21,40 @@ #include "FrameHistory.h" +#include "ds/PostProcessDescriptorSet.h" +#include "ds/SsrPassDescriptorSet.h" +#include "ds/TypedUniformBuffer.h" + +#include + #include #include +#include #include +#include + +#include #include +#include #include -#include +#include +#include -#include +#include #include +#include +#include #include +#include +#include + +#include +#include namespace filament { @@ -44,12 +63,28 @@ class FEngine; class FMaterial; class FMaterialInstance; class FrameGraph; -class PerViewUniforms; class RenderPass; +class RenderPassBuilder; struct CameraInfo; class PostProcessManager { public: + + + // This is intended to be used only to hold the static material data + struct StaticMaterialInfo { + struct ConstantInfo { + std::string_view name; + std::variant value; + }; + std::string_view name; + uint8_t const* data; + size_t size; + // the life-time of objects pointed to by this initializer_list<> is extended to the + // life-time of the initializer_list + std::initializer_list constants; + }; + struct ColorGradingConfig { bool asSubpass{}; bool customResolve{}; @@ -70,6 +105,9 @@ class PostProcessManager { void init() noexcept; void terminate(backend::DriverApi& driver) noexcept; + void configureTemporalAntiAliasingMaterial( + TemporalAntiAliasingOptions const& taaOptions) noexcept; + // methods below are ordered relative to their position in the pipeline (as much as possible) // structure (depth) pass @@ -78,23 +116,22 @@ class PostProcessManager { FrameGraphId picking; }; StructurePassOutput structure(FrameGraph& fg, - RenderPass const& pass, uint8_t structureRenderFlags, + RenderPassBuilder const& passBuilder, uint8_t structureRenderFlags, uint32_t width, uint32_t height, StructurePassConfig const& config) noexcept; // reflections pass FrameGraphId ssr(FrameGraph& fg, - RenderPass const& pass, + RenderPassBuilder const& passBuilder, FrameHistory const& frameHistory, CameraInfo const& cameraInfo, - PerViewUniforms& uniforms, FrameGraphId structure, ScreenSpaceReflectionsOptions const& options, FrameGraphTexture::Descriptor const& desc) noexcept; // SSAO FrameGraphId screenSpaceAmbientOcclusion(FrameGraph& fg, - filament::Viewport const& svp, const CameraInfo& cameraInfo, - FrameGraphId structure, + Viewport const& svp, const CameraInfo& cameraInfo, + FrameGraphId depth, AmbientOcclusionOptions const& options) noexcept; // Gaussian mipmap @@ -142,7 +179,7 @@ class PostProcessManager { FrameGraphId depth, const CameraInfo& cameraInfo, bool translucent, - float bokehAspectRatio, + math::float2 bokehScale, const DepthOfFieldOptions& dofOptions) noexcept; // Bloom @@ -151,7 +188,9 @@ class PostProcessManager { FrameGraphId flare; }; BloomPassOutput bloom(FrameGraph& fg, FrameGraphId input, - BloomOptions& inoutBloomOptions, backend::TextureFormat outFormat, + backend::TextureFormat outFormat, + BloomOptions& inoutBloomOptions, + TemporalAntiAliasingOptions const& taaOptions, math::float2 scale) noexcept; FrameGraphId flarePass(FrameGraph& fg, @@ -162,7 +201,7 @@ class PostProcessManager { // Color grading, tone mapping, dithering and bloom FrameGraphId colorGrading(FrameGraph& fg, - FrameGraphId input, filament::Viewport const& vp, + FrameGraphId input, Viewport const& vp, FrameGraphId bloom, FrameGraphId flare, const FColorGrading* colorGrading, @@ -187,15 +226,16 @@ class PostProcessManager { // Anti-aliasing FrameGraphId fxaa(FrameGraph& fg, - FrameGraphId input, filament::Viewport const& vp, + FrameGraphId input, Viewport const& vp, backend::TextureFormat outFormat, bool translucent) noexcept; // Temporal Anti-aliasing - void prepareTaa(FrameGraph& fg, filament::Viewport const& svp, + void TaaJitterCamera( + Viewport const& svp, + TemporalAntiAliasingOptions const& taaOptions, FrameHistory& frameHistory, FrameHistoryEntry::TemporalAA FrameHistoryEntry::*pTaa, - CameraInfo* inoutCameraInfo, - PerViewUniforms& uniforms) const noexcept; + CameraInfo* inoutCameraInfo) const noexcept; FrameGraphId taa(FrameGraph& fg, FrameGraphId input, @@ -205,89 +245,84 @@ class PostProcessManager { TemporalAntiAliasingOptions const& taaOptions, ColorGradingConfig const& colorGradingConfig) noexcept; - // Blit/rescaling/resolves - FrameGraphId opaqueBlit(FrameGraph& fg, - FrameGraphId input, filament::Viewport const& vp, - FrameGraphTexture::Descriptor const& outDesc, - backend::SamplerMagFilter filter = backend::SamplerMagFilter::LINEAR) noexcept; + /* + * Blit/rescaling/resolves + */ + // high quality upscaler + // - when translucent, reverts to LINEAR + // - doens't handle sub-resouces FrameGraphId upscale(FrameGraph& fg, bool translucent, DynamicResolutionOptions dsrOptions, FrameGraphId input, - filament::Viewport const& vp, FrameGraphTexture::Descriptor const& outDesc, - backend::SamplerMagFilter filter = backend::SamplerMagFilter::LINEAR) noexcept; + Viewport const& vp, FrameGraphTexture::Descriptor const& outDesc, + backend::SamplerMagFilter filter) noexcept; - FrameGraphId blit(FrameGraph& fg, bool translucent, - FrameGraphId input, filament::Viewport const& vp, + FrameGraphId rcas( + FrameGraph& fg, + float sharpness, + FrameGraphId input, FrameGraphTexture::Descriptor const& outDesc, - backend::SamplerMagFilter filter = backend::SamplerMagFilter::LINEAR) noexcept; + bool translucent); + + // color blitter using shaders + FrameGraphId blit(FrameGraph& fg, bool translucent, + FrameGraphId input, + Viewport const& vp, FrameGraphTexture::Descriptor const& outDesc, + backend::SamplerMagFilter filterMag, + backend::SamplerMinFilter filterMin) noexcept; + + // depth blitter using shaders + FrameGraphId blitDepth(FrameGraph& fg, + FrameGraphId input) noexcept; - // resolve base level of input and outputs a 1-level texture - FrameGraphId resolveBaseLevel(FrameGraph& fg, - const char* outputBufferName, FrameGraphId input) noexcept; + // Resolves base level of input and outputs a texture from outDesc. + // outDesc with, height, format and samples will be overridden. + FrameGraphId resolve(FrameGraph& fg, + const char* outputBufferName, FrameGraphId input, + FrameGraphTexture::Descriptor outDesc) noexcept; - // resolves base level of input and outputs a texture from outDesc. outDesc must - // have the same dimensions and format as input, or this will fail. - // outDesc can have mipmaps. - FrameGraphId resolveBaseLevelNoCheck(FrameGraph& fg, + // Resolves base level of input and outputs a texture from outDesc. + // outDesc with, height, format and samples will be overridden. + FrameGraphId resolveDepth(FrameGraph& fg, const char* outputBufferName, FrameGraphId input, - FrameGraphTexture::Descriptor const& outDesc) noexcept; + FrameGraphTexture::Descriptor outDesc) noexcept; // VSM shadow mipmap pass FrameGraphId vsmMipmapPass(FrameGraph& fg, FrameGraphId input, uint8_t layer, size_t level, - math::float4 clearColor, bool finalize) noexcept; + math::float4 clearColor) noexcept; FrameGraphId gaussianBlurPass(FrameGraph& fg, FrameGraphId input, FrameGraphId output, bool reinhard, size_t kernelWidth, float sigma) noexcept; + FrameGraphId debugShadowCascades(FrameGraph& fg, + FrameGraphId input, + FrameGraphId depth) noexcept; + + FrameGraphId debugDisplayShadowTexture(FrameGraph& fg, + FrameGraphId input, + FrameGraphId shadowmap, float scale, + uint8_t layer, uint8_t level, uint8_t channel, float power) noexcept; + + // Combine an array texture pointed to by `input` into a single image, then return it. + // This is only useful to check the multiview rendered scene as a debugging purpose, thus this + // is not expected to be used in normal cases. + FrameGraphId debugCombineArrayTexture(FrameGraph& fg, bool translucent, + FrameGraphId input, + Viewport const& vp, FrameGraphTexture::Descriptor const& outDesc, + backend::SamplerMagFilter filterMag, + backend::SamplerMinFilter filterMin) noexcept; + backend::Handle getOneTexture() const; backend::Handle getZeroTexture() const; backend::Handle getOneTextureArray() const; backend::Handle getZeroTextureArray() const; - math::float2 halton(size_t index) const noexcept { - return mHaltonSamples[index & 0xFu]; - } - -private: - FEngine& mEngine; - class PostProcessMaterial; - - struct BilateralPassConfig { - uint8_t kernelSize = 11; - bool bentNormals = false; - float standardDeviation = 1.0f; - float bilateralThreshold = 0.0625f; - float scale = 1.0f; - }; - - FrameGraphId bilateralBlurPass(FrameGraph& fg, - FrameGraphId input, FrameGraphId depth, - math::int2 axis, float zf, backend::TextureFormat format, - BilateralPassConfig const& config) noexcept; - - BloomPassOutput bloomPass(FrameGraph& fg, - FrameGraphId input, backend::TextureFormat outFormat, - BloomOptions& inoutBloomOptions, math::float2 scale) noexcept; - - void commitAndRender(FrameGraphResources::RenderPassInfo const& out, - PostProcessMaterial const& material, uint8_t variant, - backend::DriverApi& driver) const noexcept; - - void commitAndRender(FrameGraphResources::RenderPassInfo const& out, - PostProcessMaterial const& material, - backend::DriverApi& driver) const noexcept; - - void render(FrameGraphResources::RenderPassInfo const& out, - backend::PipelineState const& pipeline, - backend::DriverApi& driver) const noexcept; - class PostProcessMaterial { public: - PostProcessMaterial() noexcept; - PostProcessMaterial(FEngine& engine, uint8_t const* data, int size) noexcept; + explicit PostProcessMaterial(StaticMaterialInfo const& info) noexcept; PostProcessMaterial(PostProcessMaterial const& rhs) = delete; PostProcessMaterial& operator=(PostProcessMaterial const& rhs) = delete; @@ -295,15 +330,21 @@ class PostProcessManager { PostProcessMaterial(PostProcessMaterial&& rhs) noexcept; PostProcessMaterial& operator=(PostProcessMaterial&& rhs) noexcept; - ~PostProcessMaterial(); + ~PostProcessMaterial() noexcept; void terminate(FEngine& engine) noexcept; - FMaterial* getMaterial(FEngine& engine) const noexcept; - FMaterialInstance* getMaterialInstance(FEngine& engine) const noexcept; + FMaterial* getMaterial(FEngine& engine, + PostProcessVariant variant = PostProcessVariant::OPAQUE) const noexcept; + + // Helper to get a MaterialInstance from a FMaterial + // This currently just call FMaterial::getDefaultInstance(). + static FMaterialInstance* getMaterialInstance(FMaterial const* ma) noexcept; - backend::PipelineState getPipelineState(FEngine& engine, - Variant::type_t variantKey = 0u) const noexcept; + // Helper to get a MaterialInstance from a PostProcessMaterial. + static FMaterialInstance* getMaterialInstance(FEngine& engine, + PostProcessMaterial const& material, + PostProcessVariant variant = PostProcessVariant::OPAQUE) noexcept; private: void loadMaterial(FEngine& engine) const noexcept; @@ -312,25 +353,88 @@ class PostProcessManager { mutable FMaterial* mMaterial; uint8_t const* mData; }; - uint32_t mSize{}; - mutable bool mHasMaterial{}; + // mSize == 0 if mMaterial is valid, otherwise mSize > 0 + mutable uint32_t mSize{}; + // the objects' must outlive the Slice<> + utils::Slice mConstants{}; }; + void registerPostProcessMaterial(std::string_view name, StaticMaterialInfo const& info); + + PostProcessMaterial& getPostProcessMaterial(std::string_view name) noexcept; + + void setFrameUniforms(backend::DriverApi& driver, + TypedUniformBuffer& uniforms) noexcept; + + void bindPostProcessDescriptorSet(backend::DriverApi& driver) const noexcept; + + backend::PipelineState getPipelineState( + FMaterial const* ma, + PostProcessVariant variant = PostProcessVariant::OPAQUE) const noexcept; + + void renderFullScreenQuad(FrameGraphResources::RenderPassInfo const& out, + backend::PipelineState const& pipeline, + backend::DriverApi& driver) const noexcept; + + void renderFullScreenQuadWithScissor(FrameGraphResources::RenderPassInfo const& out, + backend::PipelineState const& pipeline, + backend::Viewport scissor, + backend::DriverApi& driver) const noexcept; + + // Helper for a common case. Don't use in a loop because retrieving the PipelineState + // from FMaterialInstance is not trivial. + void commitAndRenderFullScreenQuad(backend::DriverApi& driver, + FrameGraphResources::RenderPassInfo const& out, + FMaterialInstance const* mi, + PostProcessVariant variant = PostProcessVariant::OPAQUE) const noexcept; + +private: + backend::RenderPrimitiveHandle mFullScreenQuadRph; + backend::VertexBufferInfoHandle mFullScreenQuadVbih; + backend::DescriptorSetLayoutHandle mPerRenderableDslh; + + FEngine& mEngine; + + mutable SsrPassDescriptorSet mSsrPassDescriptorSet; + mutable PostProcessDescriptorSet mPostProcessDescriptorSet; + + struct BilateralPassConfig { + uint8_t kernelSize = 11; + bool bentNormals = false; + float standardDeviation = 1.0f; + float bilateralThreshold = 0.0625f; + float scale = 1.0f; + }; + + FrameGraphId bilateralBlurPass(FrameGraph& fg, + FrameGraphId input, FrameGraphId depth, + math::int2 axis, float zf, backend::TextureFormat format, + BilateralPassConfig const& config) noexcept; + + FrameGraphId downscalePass(FrameGraph& fg, + FrameGraphId input, + FrameGraphTexture::Descriptor const& outDesc, + bool threshold, float highlight, bool fireflies) noexcept; + using MaterialRegistryMap = tsl::robin_map< std::string_view, PostProcessMaterial>; MaterialRegistryMap mMaterialRegistry; - void registerPostProcessMaterial(std::string_view name, uint8_t const* data, int size); - PostProcessMaterial& getPostProcessMaterial(std::string_view name) noexcept; - backend::Handle mStarburstTexture; std::uniform_real_distribution mUniformDistribution{0.0f, 1.0f}; - static const math::float2 sHaltonSamples[16]; - math::float2 const* mHaltonSamples = sHaltonSamples; + template + struct JitterSequence { + math::float2 operator()(size_t const i) const noexcept { return positions[i % SIZE] - 0.5f; } + const std::array positions; + }; + + static const JitterSequence<4> sRGSS4; + static const JitterSequence<4> sUniformHelix4; + static const JitterSequence<32> sHaltonSamples; bool mWorkaroundSplitEasu : 1; bool mWorkaroundAllowReadOnlyAncillaryFeedbackLoop : 1; diff --git a/filament/src/RenderPass.cpp b/filament/src/RenderPass.cpp index 791f9d49e57..58d417466b6 100644 --- a/filament/src/RenderPass.cpp +++ b/filament/src/RenderPass.cpp @@ -18,18 +18,46 @@ #include "RenderPrimitive.h" #include "ShadowMap.h" +#include "SharedHandle.h" #include "details/Material.h" #include "details/MaterialInstance.h" #include "details/View.h" +#include "components/RenderableManager.h" + +#include #include +#include + +#include + +#include +#include +#include +#include +#include "private/backend/CircularBuffer.h" +#include "private/backend/CommandStream.h" + +#include +#include #include +#include +#include #include +#include +#include +#include +#include #include +#include +#include +#include +#include + using namespace utils; using namespace filament::math; @@ -37,104 +65,178 @@ namespace filament { using namespace backend; -RenderPass::RenderPass(FEngine& engine, - RenderPass::Arena& arena) noexcept - : mCommandArena(arena), - mCustomCommands(engine.getPerRenderPassAllocator()) { +RenderPassBuilder& RenderPassBuilder::customCommand( + uint8_t channel, + RenderPass::Pass pass, + RenderPass::CustomCommand custom, + uint32_t order, + RenderPass::Executor::CustomCommandFn const& command) { + if (!mCustomCommands.has_value()) { + // construct the vector the first time + mCustomCommands.emplace(); + } + mCustomCommands->emplace_back(channel, pass, custom, order, command); + return *this; } -RenderPass::RenderPass(RenderPass const& rhs) = default; +RenderPass RenderPassBuilder::build(FEngine const& engine, DriverApi& driver) const { + assert_invariant(mRenderableSoa); + assert_invariant(mScissorViewport.width <= std::numeric_limits::max()); + assert_invariant(mScissorViewport.height <= std::numeric_limits::max()); + return RenderPass{ engine, driver, *this }; +} -// this destructor is actually heavy because it inlines ~vector<> -RenderPass::~RenderPass() noexcept = default; +// ------------------------------------------------------------------------------------------------ -RenderPass::Command* RenderPass::append(size_t count) noexcept { - // this is like an "in-place" realloc(). Works only with LinearAllocator. - Command* const curr = mCommandArena.alloc(count); - assert_invariant(curr); - assert_invariant(mCommandBegin == nullptr || curr == mCommandEnd); - if (mCommandBegin == nullptr) { - mCommandBegin = mCommandEnd = curr; +void RenderPass::BufferObjectHandleDeleter::operator()(BufferObjectHandle handle) noexcept { + if (handle) { // this is common case + driver.get().destroyBufferObject(handle); } - mCommandEnd += count; - return curr; } -void RenderPass::resize(size_t count) noexcept { - if (mCommandBegin) { - mCommandEnd = mCommandBegin + count; - mCommandArena.rewind(mCommandEnd); +void RenderPass::DescriptorSetHandleDeleter::operator()( + DescriptorSetHandle handle) noexcept { + if (handle) { // this is common case + driver.get().destroyDescriptorSet(handle); } } -void RenderPass::setGeometry(FScene::RenderableSoa const& soa, Range vr, - backend::Handle uboHandle) noexcept { - mRenderableSoa = &soa; - mVisibleRenderables = vr; - mUboHandle = uboHandle; -} +// ------------------------------------------------------------------------------------------------ + +RenderPass::RenderPass(FEngine const& engine, DriverApi& driver, + RenderPassBuilder const& builder) noexcept + : mRenderableSoa(*builder.mRenderableSoa), + mColorPassDescriptorSet(builder.mColorPassDescriptorSet), + mScissorViewport(builder.mScissorViewport) { + + // compute the number of commands we need + updateSummedPrimitiveCounts( + const_cast(mRenderableSoa), builder.mVisibleRenderables); + + uint32_t commandCount = + FScene::getPrimitiveCount(mRenderableSoa, builder.mVisibleRenderables.last); + const bool colorPass = bool(builder.mCommandTypeFlags & CommandTypeFlags::COLOR); + const bool depthPass = bool(builder.mCommandTypeFlags & CommandTypeFlags::DEPTH); + commandCount *= uint32_t(colorPass * 2 + depthPass); + commandCount += 1; // for the sentinel -void RenderPass::setCamera(const CameraInfo& camera) noexcept { - mCameraPosition = camera.getPosition(); - mCameraForwardVector = camera.getForwardVector(); + uint32_t const customCommandCount = + builder.mCustomCommands.has_value() ? builder.mCustomCommands->size() : 0; + + // FIXME: builder.mArena must be thread safe eventually + Command* const commandBegin = builder.mArena.alloc(commandCount + customCommandCount); + Command* commandEnd = commandBegin + (commandCount + customCommandCount); + assert_invariant(commandBegin); + + // FIXME: builder.mArena must be thread safe eventually + if (UTILS_UNLIKELY(builder.mArena.getAllocator().isHeapAllocation(commandBegin))) { + static bool sLogOnce = true; + if (UTILS_UNLIKELY(sLogOnce)) { + sLogOnce = false; + PANIC_LOG("RenderPass arena is full, using slower system heap. Please increase " + "the appropriate constant (e.g. FILAMENT_PER_RENDER_PASS_ARENA_SIZE_IN_MB)."); + } + } + + appendCommands(engine, { commandBegin, commandCount }, + builder.mVisibleRenderables, + builder.mCommandTypeFlags, + builder.mFlags, + builder.mVisibilityMask, + builder.mVariant, + builder.mCameraPosition, + builder.mCameraForwardVector); + + if (builder.mCustomCommands.has_value()) { + mCustomCommands.reserve(customCommandCount); + Command* p = commandBegin + commandCount; + for (auto const& [channel, passId, command, order, fn]: builder.mCustomCommands.value()) { + appendCustomCommand(p++, channel, passId, command, order, fn); + } + } + + // sort commands once we're done adding commands + commandEnd = resize(builder.mArena, + sortCommands(commandBegin, commandEnd)); + + if (engine.isAutomaticInstancingEnabled()) { + int32_t stereoscopicEyeCount = 1; + if (builder.mFlags & IS_INSTANCED_STEREOSCOPIC) { + stereoscopicEyeCount *= engine.getConfig().stereoscopicEyeCount; + } + commandEnd = resize(builder.mArena, + instanceify(driver, + engine.getPerRenderableDescriptorSetLayout().getHandle(), + commandBegin, commandEnd, stereoscopicEyeCount)); + } + + // these are `const` from this point on... + mCommandBegin = commandBegin; + mCommandEnd = commandEnd; } -void RenderPass::setScissorViewport(backend::Viewport viewport) noexcept { - assert_invariant(viewport.width <= std::numeric_limits::max()); - assert_invariant(viewport.height <= std::numeric_limits::max()); - mScissorViewport = viewport; +// this destructor is actually heavy because it inlines ~vector<> +RenderPass::~RenderPass() noexcept = default; + +RenderPass::Command* RenderPass::resize(Arena& arena, Command* const last) noexcept { + arena.rewind(last); + return last; } -void RenderPass::appendCommands(FEngine& engine, CommandTypeFlags const commandTypeFlags) noexcept { +void RenderPass::appendCommands(FEngine const& engine, + Slice commands, + Range const visibleRenderables, + CommandTypeFlags const commandTypeFlags, + RenderFlags const renderFlags, + FScene::VisibleMaskType const visibilityMask, + Variant const variant, + float3 const cameraPosition, + float3 const cameraForwardVector) const noexcept { + SYSTRACE_CALL(); SYSTRACE_CONTEXT(); - assert_invariant(mRenderableSoa); - - utils::Range vr = mVisibleRenderables; // trace the number of visible renderables - SYSTRACE_VALUE32("visibleRenderables", vr.size()); - if (UTILS_UNLIKELY(vr.empty())) { + SYSTRACE_VALUE32("visibleRenderables", visibleRenderables.size()); + if (UTILS_UNLIKELY(visibleRenderables.empty())) { + // no renderables, we still need the sentinel and the command buffer size should be + // exactly 1. + assert_invariant(commands.size() == 1); + Command* curr = commands.data(); + curr->key = uint64_t(Pass::SENTINEL); return; } JobSystem& js = engine.getJobSystem(); - const RenderFlags renderFlags = mFlags; - const Variant variant = mVariant; - const FScene::VisibleMaskType visibilityMask = mVisibilityMask; // up-to-date summed primitive counts needed for generateCommands() - FScene::RenderableSoa const& soa = *mRenderableSoa; - updateSummedPrimitiveCounts(const_cast(soa), vr); + FScene::RenderableSoa const& soa = mRenderableSoa; - // compute how much maximum storage we need for this pass - uint32_t commandCount = FScene::getPrimitiveCount(soa, vr.last); - // double the color pass for transparent objects that need to render twice - const bool colorPass = bool(commandTypeFlags & CommandTypeFlags::COLOR); - const bool depthPass = bool(commandTypeFlags & CommandTypeFlags::DEPTH); - commandCount *= uint32_t(colorPass * 2 + depthPass); - commandCount += 1; // for the sentinel - Command* const curr = append(commandCount); - - const float3 cameraPosition(mCameraPosition); - const float3 cameraForwardVector(mCameraForwardVector); - auto work = [commandTypeFlags, curr, &soa, variant, renderFlags, visibilityMask, cameraPosition, - cameraForwardVector] - (uint32_t startIndex, uint32_t indexCount) { - RenderPass::generateCommands(commandTypeFlags, curr, - soa, { startIndex, startIndex + indexCount }, variant, renderFlags, visibilityMask, - cameraPosition, cameraForwardVector); + Command* curr = commands.data(); + size_t const commandCount = commands.size(); + + auto stereoscopicEyeCount = engine.getConfig().stereoscopicEyeCount; + + auto work = [commandTypeFlags, curr, &soa, + variant, renderFlags, visibilityMask, + cameraPosition, cameraForwardVector, stereoscopicEyeCount] + (uint32_t const startIndex, uint32_t const indexCount) { + generateCommands(commandTypeFlags, curr, + soa, { startIndex, startIndex + indexCount }, + variant, renderFlags, visibilityMask, + cameraPosition, cameraForwardVector, stereoscopicEyeCount); }; - if (vr.size() <= JOBS_PARALLEL_FOR_COMMANDS_COUNT) { - work(vr.first, vr.size()); + if (visibleRenderables.size() <= JOBS_PARALLEL_FOR_COMMANDS_COUNT) { + work(visibleRenderables.first, visibleRenderables.size()); } else { - auto* jobCommandsParallel = jobs::parallel_for(js, nullptr, vr.first, (uint32_t)vr.size(), - std::cref(work), jobs::CountSplitter()); + auto* jobCommandsParallel = parallel_for(js, nullptr, + visibleRenderables.first, uint32_t(visibleRenderables.size()), + std::cref(work), jobs::CountSplitter()); js.runAndWait(jobCommandsParallel); } - // always add an "eof" command - // "eof" command. these commands are guaranteed to be sorted last in the + // Always add an "eof" command + // "eof" command. These commands are guaranteed to be sorted last in the // command buffer. curr[commandCount - 1].key = uint64_t(Pass::SENTINEL); @@ -142,64 +244,51 @@ void RenderPass::appendCommands(FEngine& engine, CommandTypeFlags const commandT // This must be done from the main thread. for (Command const* first = curr, *last = curr + commandCount ; first != last ; ++first) { if (UTILS_LIKELY((first->key & CUSTOM_MASK) == uint64_t(CustomCommand::PASS))) { - auto ma = first->primitive.mi->getMaterial(); - ma->prepareProgram(first->primitive.materialVariant); + auto ma = first->info.mi->getMaterial(); + ma->prepareProgram(first->info.materialVariant); } } } -void RenderPass::appendCustomCommand(Pass pass, CustomCommand custom, uint32_t order, +void RenderPass::appendCustomCommand(Command* commands, + uint8_t channel, Pass pass, CustomCommand custom, uint32_t const order, Executor::CustomCommandFn command) { - assert((uint64_t(order) << CUSTOM_ORDER_SHIFT) <= CUSTOM_ORDER_MASK); + assert_invariant((uint64_t(order) << CUSTOM_ORDER_SHIFT) <= CUSTOM_ORDER_MASK); + + channel = std::min(channel, uint8_t(0x3)); - uint32_t index = mCustomCommands.size(); + uint32_t const index = mCustomCommands.size(); mCustomCommands.push_back(std::move(command)); uint64_t cmd = uint64_t(pass); + cmd |= uint64_t(channel) << CHANNEL_SHIFT; cmd |= uint64_t(custom); cmd |= uint64_t(order) << CUSTOM_ORDER_SHIFT; cmd |= uint64_t(index); - Command* const curr = append(1); - curr->key = cmd; + commands->key = cmd; } -void RenderPass::sortCommands(FEngine& engine) noexcept { - SYSTRACE_NAME("sort and trim commands"); +RenderPass::Command* RenderPass::sortCommands( + Command* const begin, Command* const end) noexcept { + SYSTRACE_NAME("sort commands"); - std::sort(mCommandBegin, mCommandEnd); + std::sort(begin, end); // find the last command - Command const* const last = std::partition_point(mCommandBegin, mCommandEnd, + Command* const last = std::partition_point(begin, end, [](Command const& c) { return c.key != uint64_t(Pass::SENTINEL); }); - resize(uint32_t(last - mCommandBegin)); - - if (engine.isAutomaticInstancingEnabled()) { - instanceify(engine); - } + return last; } -void RenderPass::execute(FEngine& engine, const char* name, - backend::Handle renderTarget, - backend::RenderPassParams params) const noexcept { - - DriverApi& driver = engine.getDriverApi(); - - // this is a good time to flush the CommandStream, because we're about to potentially - // output a lot of commands. This guarantees here that we have at least - // FILAMENT_MIN_COMMAND_BUFFERS_SIZE_IN_MB bytes (1MiB by default). - engine.flush(); - - driver.beginRenderPass(renderTarget, params); - getExecutor().execute(engine, name); - driver.endRenderPass(); -} - -void RenderPass::instanceify(FEngine& engine) noexcept { +RenderPass::Command* RenderPass::instanceify(DriverApi& driver, + DescriptorSetLayoutHandle perRenderableDescriptorSetLayoutHandle, + Command* curr, Command* const last, + int32_t const eyeCount) const noexcept { SYSTRACE_NAME("instanceify"); // instanceify works by scanning the **sorted** command stream, looking for repeat draw @@ -212,33 +301,42 @@ void RenderPass::instanceify(FEngine& engine) noexcept { UTILS_UNUSED uint32_t drawCallsSavedCount = 0; - Command* curr = mCommandBegin; - Command* const last = mCommandEnd; - Command* firstSentinel = nullptr; PerRenderableData const* uboData = nullptr; PerRenderableData* stagingBuffer = nullptr; uint32_t stagingBufferSize = 0; uint32_t instancedPrimitiveOffset = 0; + size_t const count = last - curr; // TODO: for the case of instancing we could actually use 128 instead of 64 instances constexpr size_t maxInstanceCount = CONFIG_MAX_INSTANCES; while (curr != last) { - - // we can't have nice things! No more than maxInstanceCount due to UBO size limits - Command const* const e = std::find_if_not(curr, std::min(last, curr + maxInstanceCount), - [lhs = *curr](Command const& rhs) { - // primitives must be identical to be instanced. Currently, instancing doesn't support - // skinning/morphing. - return lhs.primitive.mi == rhs.primitive.mi && - lhs.primitive.primitiveHandle == rhs.primitive.primitiveHandle && - lhs.primitive.rasterState == rhs.primitive.rasterState && - lhs.primitive.skinningHandle == rhs.primitive.skinningHandle && - lhs.primitive.skinningOffset == rhs.primitive.skinningOffset && - lhs.primitive.morphWeightBuffer == rhs.primitive.morphWeightBuffer && - lhs.primitive.morphTargetBuffer == rhs.primitive.morphTargetBuffer; - }); + // Currently, if we have skinning or morphing, we can't use auto instancing. This is + // because the morphing/skinning data for comparison is not easily accessible; and also + // because we're assuming that the per-renderable descriptor-set only has the + // OBJECT_UNIFORMS descriptor active (i.e. the skinning/morphing descriptors are unused). + // We also can't use auto-instancing if manual- or hybrid- instancing is used. + // TODO: support auto-instancing for skinning/morphing + Command const* e = curr + 1; + if (UTILS_LIKELY( + !curr->info.hasSkinning && !curr->info.hasMorphing && + curr->info.instanceCount <= 1)) + { + assert_invariant(!curr->info.hasHybridInstancing); + // we can't have nice things! No more than maxInstanceCount due to UBO size limits + e = std::find_if_not(curr, std::min(last, curr + maxInstanceCount), + [lhs = *curr](Command const& rhs) { + // primitives must be identical to be instanced + // Currently, instancing doesn't support skinning/morphing. + return lhs.info.mi == rhs.info.mi && + lhs.info.rph == rhs.info.rph && + lhs.info.vbih == rhs.info.vbih && + lhs.info.indexOffset == rhs.info.indexOffset && + lhs.info.indexCount == rhs.info.indexCount && + lhs.info.rasterState == rhs.info.rasterState; + }); + } uint32_t const instanceCount = e - curr; assert_invariant(instanceCount > 0); @@ -249,24 +347,52 @@ void RenderPass::instanceify(FEngine& engine) noexcept { // allocate our staging buffer only if needed if (UTILS_UNLIKELY(!stagingBuffer)) { + // Create a temporary UBO for holding the per-renderable data of each primitive, + // The `curr->info.index` is updated so that this (now instanced) command can + // bind the UBO in the right place (where the per-instance data is). + // The lifetime of this object is the longest of this RenderPass and all its + // executors. + + // create a temporary UBO for instancing + mInstancedUboHandle = BufferObjectSharedHandle{ + driver.createBufferObject( + count * sizeof(PerRenderableData) + sizeof(PerRenderableUib), + BufferObjectBinding::UNIFORM, BufferUsage::STATIC), driver }; + // TODO: use stream inline buffer for small sizes // TODO: use a pool for larger heap buffers // buffer large enough for all instances data - stagingBufferSize = sizeof(PerRenderableData) * (last - curr); - stagingBuffer = (PerRenderableData*)::malloc(stagingBufferSize); - uboData = mRenderableSoa->data(); + stagingBufferSize = count * sizeof(PerRenderableData); + stagingBuffer = static_cast(malloc(stagingBufferSize)); + uboData = mRenderableSoa.data(); + assert_invariant(uboData); + + // We also need a descriptor-set to hold the custom UBO. This works because + // we currently assume the descriptor-set only needs to hold this UBO in the + // instancing case (it wouldn't be true if we supported skinning/morphing, and + // in this case we would need to preserve the default descriptor-set content). + // This has the same lifetime as the UBO (see above). + mInstancedDescriptorSetHandle = DescriptorSetSharedHandle{ + driver.createDescriptorSet(perRenderableDescriptorSetLayoutHandle), + driver + }; + driver.updateDescriptorSetBuffer(mInstancedDescriptorSetHandle, + +PerRenderableBindingPoints::OBJECT_UNIFORMS, + mInstancedUboHandle, 0, sizeof(PerRenderableUib)); } // copy the ubo data to a staging buffer assert_invariant(instancedPrimitiveOffset + instanceCount <= stagingBufferSize / sizeof(PerRenderableData)); for (uint32_t i = 0; i < instanceCount; i++) { - stagingBuffer[instancedPrimitiveOffset + i] = uboData[curr[i].primitive.index]; + stagingBuffer[instancedPrimitiveOffset + i] = uboData[curr[i].info.index]; } // make the first command instanced - curr[0].primitive.instanceCount = instanceCount; - curr[0].primitive.index = instancedPrimitiveOffset; + curr[0].info.instanceCount = instanceCount * eyeCount; + curr[0].info.index = instancedPrimitiveOffset; + curr[0].info.dsh = mInstancedDescriptorSetHandle; + instancedPrimitiveOffset += instanceCount; // cancel commands that are now instances @@ -281,44 +407,37 @@ void RenderPass::instanceify(FEngine& engine) noexcept { if (UTILS_UNLIKELY(firstSentinel)) { //slog.d << "auto-instancing, saving " << drawCallsSavedCount << " draw calls, out of " - // << mCommandEnd - mCommandBegin << io::endl; - + // << count << io::endl; // we have instanced primitives - DriverApi& driver = engine.getDriverApi(); - - // TODO: maybe use a pool? so we can reuse the buffer. - // create a ubo to hold the instanced primitive data - mInstancedUboHandle = driver.createBufferObject( - sizeof(PerRenderableData) * instancedPrimitiveOffset + sizeof(PerRenderableUib), - BufferObjectBinding::UNIFORM, backend::BufferUsage::STATIC); - // copy our instanced ubo data driver.updateBufferObjectUnsynchronized(mInstancedUboHandle, { stagingBuffer, sizeof(PerRenderableData) * instancedPrimitiveOffset, +[](void* buffer, size_t, void*) { - ::free(buffer); + free(buffer); } }, 0); stagingBuffer = nullptr; // remove all the canceled commands - auto lastCommand = std::remove_if(firstSentinel, mCommandEnd, [](auto const& command) { + auto const lastCommand = std::remove_if(firstSentinel, last, [](auto const& command) { return command.key == uint64_t(Pass::SENTINEL); }); - resize(uint32_t(lastCommand - mCommandBegin)); + return lastCommand; } assert_invariant(stagingBuffer == nullptr); + return last; } /* static */ -UTILS_ALWAYS_INLINE // this function exists only to make the code more readable. we want it inlined. +UTILS_ALWAYS_INLINE // This function exists only to make the code more readable. we want it inlined. inline // and we don't need it in the compilation unit void RenderPass::setupColorCommand(Command& cmdDraw, Variant variant, - FMaterialInstance const* const UTILS_RESTRICT mi, bool inverseFrontFaces) noexcept { + FMaterialInstance const* const UTILS_RESTRICT mi, + bool const inverseFrontFaces, bool const hasDepthClamp) noexcept { FMaterial const * const UTILS_RESTRICT ma = mi->getMaterial(); variant = Variant::filterVariant(variant, ma->isVariantLit()); @@ -330,9 +449,9 @@ void RenderPass::setupColorCommand(Command& cmdDraw, Variant variant, keyBlending |= uint64_t(Pass::BLENDED); keyBlending |= uint64_t(CustomCommand::PASS); - BlendingMode blendingMode = ma->getBlendingMode(); - bool hasScreenSpaceRefraction = ma->getRefractionMode() == RefractionMode::SCREEN_SPACE; - bool isBlendingCommand = !hasScreenSpaceRefraction && + BlendingMode const blendingMode = ma->getBlendingMode(); + bool const hasScreenSpaceRefraction = ma->getRefractionMode() == RefractionMode::SCREEN_SPACE; + bool const isBlendingCommand = !hasScreenSpaceRefraction && (blendingMode != BlendingMode::OPAQUE && blendingMode != BlendingMode::MASKED); uint64_t keyDraw = cmdDraw.key; @@ -344,33 +463,36 @@ void RenderPass::setupColorCommand(Command& cmdDraw, Variant variant, keyDraw |= makeField(ma->getRasterState().alphaToCoverage, BLENDING_MASK, BLENDING_SHIFT); cmdDraw.key = isBlendingCommand ? keyBlending : keyDraw; - cmdDraw.primitive.rasterState = ma->getRasterState(); + cmdDraw.info.rasterState = ma->getRasterState(); // for SSR pass, the blending mode of opaques (including MASKED) must be off // see Material.cpp. const bool blendingMustBeOff = !isBlendingCommand && Variant::isSSRVariant(variant); - cmdDraw.primitive.rasterState.blendFunctionSrcAlpha = blendingMustBeOff ? - BlendFunction::ONE : cmdDraw.primitive.rasterState.blendFunctionSrcAlpha; - cmdDraw.primitive.rasterState.blendFunctionDstAlpha = blendingMustBeOff ? - BlendFunction::ZERO : cmdDraw.primitive.rasterState.blendFunctionDstAlpha; - - cmdDraw.primitive.rasterState.inverseFrontFaces = inverseFrontFaces; - cmdDraw.primitive.rasterState.culling = mi->getCullingMode(); - cmdDraw.primitive.rasterState.colorWrite = mi->isColorWriteEnabled(); - cmdDraw.primitive.rasterState.depthWrite = mi->isDepthWriteEnabled(); - cmdDraw.primitive.rasterState.depthFunc = mi->getDepthFunc(); - cmdDraw.primitive.mi = mi; - cmdDraw.primitive.materialVariant = variant; + cmdDraw.info.rasterState.blendFunctionSrcAlpha = blendingMustBeOff ? + BlendFunction::ONE : cmdDraw.info.rasterState.blendFunctionSrcAlpha; + cmdDraw.info.rasterState.blendFunctionDstAlpha = blendingMustBeOff ? + BlendFunction::ZERO : cmdDraw.info.rasterState.blendFunctionDstAlpha; + + cmdDraw.info.rasterState.inverseFrontFaces = inverseFrontFaces; + cmdDraw.info.rasterState.culling = mi->getCullingMode(); + cmdDraw.info.rasterState.colorWrite = mi->isColorWriteEnabled(); + cmdDraw.info.rasterState.depthWrite = mi->isDepthWriteEnabled(); + cmdDraw.info.rasterState.depthFunc = mi->getDepthFunc(); + cmdDraw.info.rasterState.depthClamp = hasDepthClamp; + cmdDraw.info.materialVariant = variant; // we keep "RasterState::colorWrite" to the value set by material (could be disabled) } /* static */ UTILS_NOINLINE -void RenderPass::generateCommands(uint32_t commandTypeFlags, Command* const commands, - FScene::RenderableSoa const& soa, Range range, - Variant variant, RenderFlags renderFlags, - FScene::VisibleMaskType visibilityMask, - float3 cameraPosition, float3 cameraForward) noexcept { +void RenderPass::generateCommands(CommandTypeFlags commandTypeFlags, Command* const commands, + FScene::RenderableSoa const& soa, Range const range, + Variant const variant, RenderFlags const renderFlags, + FScene::VisibleMaskType const visibilityMask, + float3 const cameraPosition, float3 const cameraForward, + uint8_t instancedStereoEyeCount) noexcept { + + SYSTRACE_CALL(); // generateCommands() writes both the draw and depth commands simultaneously such that // we go throw the list of renderables just once. @@ -399,11 +521,15 @@ void RenderPass::generateCommands(uint32_t commandTypeFlags, Command* const comm switch (commandTypeFlags & (CommandTypeFlags::COLOR | CommandTypeFlags::DEPTH)) { case CommandTypeFlags::COLOR: curr = generateCommandsImpl(commandTypeFlags, curr, - soa, range, variant, renderFlags, visibilityMask, cameraPosition, cameraForward); + soa, range, + variant, renderFlags, visibilityMask, cameraPosition, cameraForward, + instancedStereoEyeCount); break; case CommandTypeFlags::DEPTH: curr = generateCommandsImpl(commandTypeFlags, curr, - soa, range, variant, renderFlags, visibilityMask, cameraPosition, cameraForward); + soa, range, + variant, renderFlags, visibilityMask, cameraPosition, cameraForward, + instancedStereoEyeCount); break; default: // we should never end-up here @@ -420,27 +546,40 @@ void RenderPass::generateCommands(uint32_t commandTypeFlags, Command* const comm } /* static */ -template +template UTILS_NOINLINE -RenderPass::Command* RenderPass::generateCommandsImpl(uint32_t extraFlags, +RenderPass::Command* RenderPass::generateCommandsImpl(CommandTypeFlags extraFlags, Command* UTILS_RESTRICT curr, FScene::RenderableSoa const& UTILS_RESTRICT soa, Range range, - Variant variant, RenderFlags renderFlags, FScene::VisibleMaskType visibilityMask, - float3 cameraPosition, float3 cameraForward) noexcept { - - // generateCommands() writes both the draw and depth commands simultaneously such that - // we go throw the list of renderables just once. - // (in principle, we could have split this method into two, at the cost of going through - // the list twice) + Variant const variant, RenderFlags renderFlags, FScene::VisibleMaskType visibilityMask, + float3 cameraPosition, float3 cameraForward, uint8_t instancedStereoEyeCount) noexcept { constexpr bool isColorPass = bool(commandTypeFlags & CommandTypeFlags::COLOR); constexpr bool isDepthPass = bool(commandTypeFlags & CommandTypeFlags::DEPTH); - static_assert(isColorPass != isDepthPass, "only color or depth pass supported"); - const bool depthContainsShadowCasters = bool(extraFlags & CommandTypeFlags::DEPTH_CONTAINS_SHADOW_CASTERS); - const bool depthFilterAlphaMaskedObjects = bool(extraFlags & CommandTypeFlags::DEPTH_FILTER_ALPHA_MASKED_OBJECTS); - const bool filterTranslucentObjects = bool(extraFlags & CommandTypeFlags::FILTER_TRANSLUCENT_OBJECTS); + bool const depthContainsShadowCasters = + bool(extraFlags & CommandTypeFlags::DEPTH_CONTAINS_SHADOW_CASTERS); + + bool const depthFilterAlphaMaskedObjects = + bool(extraFlags & CommandTypeFlags::DEPTH_FILTER_ALPHA_MASKED_OBJECTS); + + bool const filterTranslucentObjects = + bool(extraFlags & CommandTypeFlags::FILTER_TRANSLUCENT_OBJECTS); + + bool const hasShadowing = + renderFlags & HAS_SHADOWING; + + bool const viewInverseFrontFaces = + renderFlags & HAS_INVERSE_FRONT_FACES; + + bool const hasInstancedStereo = + renderFlags & IS_INSTANCED_STEREOSCOPIC; + + bool const hasDepthClamp = + renderFlags & HAS_DEPTH_CLAMP; + + float const cameraPositionDotCameraForward = dot(cameraPosition, cameraForward); auto const* const UTILS_RESTRICT soaWorldAABBCenter = soa.data(); auto const* const UTILS_RESTRICT soaVisibility = soa.data(); @@ -448,25 +587,21 @@ RenderPass::Command* RenderPass::generateCommandsImpl(uint32_t extraFlags, auto const* const UTILS_RESTRICT soaSkinning = soa.data(); auto const* const UTILS_RESTRICT soaMorphing = soa.data(); auto const* const UTILS_RESTRICT soaVisibilityMask = soa.data(); - auto const* const UTILS_RESTRICT soaInstanceCount = soa.data(); + auto const* const UTILS_RESTRICT soaInstanceInfo = soa.data(); + auto const* const UTILS_RESTRICT soaDescriptorSet = soa.data(); - const bool hasShadowing = renderFlags & HAS_SHADOWING; - const bool viewInverseFrontFaces = renderFlags & HAS_INVERSE_FRONT_FACES; + Command cmd; - Command cmdColor; - - Command cmdDepth; if constexpr (isDepthPass) { - cmdDepth.primitive.materialVariant = variant; - cmdDepth.primitive.rasterState = {}; - cmdDepth.primitive.rasterState.colorWrite = Variant::isPickingVariant(variant) || Variant::isVSMVariant(variant); - cmdDepth.primitive.rasterState.depthWrite = true; - cmdDepth.primitive.rasterState.depthFunc = RasterState::DepthFunc::GE; - cmdDepth.primitive.rasterState.alphaToCoverage = false; + cmd.info.materialVariant = variant; + cmd.info.rasterState = {}; + cmd.info.rasterState.colorWrite = Variant::isPickingVariant(variant) || Variant::isVSMVariant(variant); + cmd.info.rasterState.depthWrite = true; + cmd.info.rasterState.depthFunc = RasterState::DepthFunc::GE; + cmd.info.rasterState.alphaToCoverage = false; + cmd.info.rasterState.depthClamp = hasDepthClamp; } - const float cameraPositionDotCameraForward = dot(cameraPosition, cameraForward); - for (uint32_t i = range.first; i < range.last; ++i) { // Check if this renderable passes the visibilityMask. if (UTILS_UNLIKELY(!(soaVisibilityMask[i] & visibilityMask))) { @@ -487,7 +622,6 @@ RenderPass::Command* RenderPass::generateCommandsImpl(uint32_t extraFlags, // float3 d = soaWorldAABBCenter[i] - cameraPosition; // float distance = dot(d, cameraForward); // but saves a couple of instruction, because part of the math is done outside the loop. - float distance = dot(soaWorldAABBCenter[i], cameraForward) - cameraPositionDotCameraForward; // We negate the distance to the camera in order to create a bit pattern that will // be sorted properly, this works because: @@ -499,63 +633,106 @@ RenderPass::Command* RenderPass::generateCommandsImpl(uint32_t extraFlags, // Here, objects close to the camera (but behind) will be drawn first. // An alternative that keeps the mathematical ordering is given here: // distanceBits ^= ((int32_t(distanceBits) >> 31) | 0x80000000u); - distance = -distance; - const uint32_t distanceBits = reinterpret_cast(distance); + float const distance = -(dot(soaWorldAABBCenter[i], cameraForward) - cameraPositionDotCameraForward); + uint32_t const distanceBits = reinterpret_cast(distance); // calculate the per-primitive face winding order inversion - const bool inverseFrontFaces = viewInverseFrontFaces ^ soaVisibility[i].reversedWindingOrder; - const bool hasMorphing = soaVisibility[i].morphing; - const bool hasSkinningOrMorphing = soaVisibility[i].skinning || hasMorphing; + bool const inverseFrontFaces = viewInverseFrontFaces ^ soaVisibility[i].reversedWindingOrder; + bool const hasMorphing = soaVisibility[i].morphing; + bool const hasSkinning = soaVisibility[i].skinning; + bool const hasSkinningOrMorphing = hasSkinning || hasMorphing; - cmdColor.key = makeField(soaVisibility[i].priority, PRIORITY_MASK, PRIORITY_SHIFT); - cmdColor.primitive.index = (uint16_t)i; - cmdColor.primitive.instanceCount = soaInstanceCount[i]; - - // if we are already an SSR variant, the SRE bit is already set, - // there is no harm setting it again + // if we are already an SSR variant, the SRE bit is already set static_assert(Variant::SPECIAL_SSR & Variant::SRE); - variant.setShadowReceiver( - Variant::isSSRVariant(variant) || (soaVisibility[i].receiveShadows & hasShadowing)); - variant.setSkinning(hasSkinningOrMorphing); - - if constexpr (isDepthPass) { - cmdDepth.key = uint64_t(Pass::DEPTH); - cmdDepth.key |= uint64_t(CustomCommand::PASS); - cmdDepth.key |= makeField(soaVisibility[i].priority, PRIORITY_MASK, PRIORITY_SHIFT); - cmdDepth.key |= makeField(distanceBits >> 22u, Z_BUCKET_MASK, Z_BUCKET_SHIFT); - cmdDepth.primitive.index = (uint16_t)i; - cmdDepth.primitive.instanceCount = soaInstanceCount[i]; - cmdDepth.primitive.materialVariant.setSkinning(hasSkinningOrMorphing); - cmdDepth.primitive.rasterState.inverseFrontFaces = inverseFrontFaces; + Variant renderableVariant{ variant }; + + // we can't have SSR and shadowing together by construction + bool const isSsrVariant = Variant::isSSRVariant(variant); + assert_invariant((isSsrVariant && !hasShadowing) || !isSsrVariant); + if (!isSsrVariant) { + // set the SRE variant, unless we're in SSR mode + renderableVariant.setShadowReceiver(soaVisibility[i].receiveShadows && hasShadowing); + } + + renderableVariant.setSkinning(hasSkinningOrMorphing); + + FRenderableManager::SkinningBindingInfo const& skinning = soaSkinning[i]; + FRenderableManager::MorphingBindingInfo const& morphing = soaMorphing[i]; + + if constexpr (isColorPass) { + renderableVariant.setFog(soaVisibility[i].fog && Variant::isFogVariant(variant)); + cmd.key = uint64_t(Pass::COLOR); + } else if constexpr (isDepthPass) { + cmd.key = uint64_t(Pass::DEPTH); + cmd.key |= uint64_t(CustomCommand::PASS); + cmd.key |= makeField(distanceBits >> 22u, Z_BUCKET_MASK, Z_BUCKET_SHIFT); + cmd.info.materialVariant.setSkinning(hasSkinningOrMorphing); + cmd.info.rasterState.inverseFrontFaces = inverseFrontFaces; } + cmd.key |= makeField(soaVisibility[i].priority, PRIORITY_MASK, PRIORITY_SHIFT); + cmd.key |= makeField(soaVisibility[i].channel, CHANNEL_MASK, CHANNEL_SHIFT); + cmd.info.index = i; + cmd.info.hasHybridInstancing = bool(soaInstanceInfo[i].handle); + cmd.info.instanceCount = soaInstanceInfo[i].count; + cmd.info.hasMorphing = bool(morphing.handle); + cmd.info.hasSkinning = bool(skinning.handle); + + // soaInstanceInfo[i].count is the number of instances the user has requested, either for + // manual or hybrid instancing. Instanced stereo multiplies the number of instances by the + // eye count. + if (hasInstancedStereo) { + cmd.info.instanceCount *= instancedStereoEyeCount; + } + + // soaDescriptorSet[i] is either populated with a common descriptor-set or truly with + // a per-renderable one, depending on for e.g. skinning/morphing/instancing. + cmd.info.dsh = soaDescriptorSet[i]; + + // always set the skinningOffset, even when skinning is off, this doesn't cost anything. + cmd.info.skinningOffset = soaSkinning[i].offset * sizeof(PerRenderableBoneUib::BoneData); + const bool shadowCaster = soaVisibility[i].castShadows & hasShadowing; const bool writeDepthForShadowCasters = depthContainsShadowCasters & shadowCaster; const Slice& primitives = soaPrimitives[i]; - const FRenderableManager::SkinningBindingInfo& skinning = soaSkinning[i]; - const FRenderableManager::MorphingBindingInfo& morphing = soaMorphing[i]; - /* * This is our hot loop. It's written to avoid branches. * When modifying this code, always ensure it stays efficient. */ - for (size_t pi = 0, c = primitives.size(); pi < c; ++pi) { - auto const& primitive = primitives[pi]; - auto const& morphTargets = morphing.targets[pi]; + for (auto const& primitive: primitives) { FMaterialInstance const* const mi = primitive.getMaterialInstance(); - FMaterial const* const ma = mi->getMaterial(); + if (UTILS_UNLIKELY(!mi)) { + // This can happen because RenderPrimitives can be initialized with + // a null MaterialInstance. In this case, skip the primitive. + if constexpr (isColorPass) { + curr->key = uint64_t(Pass::SENTINEL); + ++curr; + } + curr->key = uint64_t(Pass::SENTINEL); + ++curr; + continue; + } - if constexpr (isColorPass) { - cmdColor.primitive.primitiveHandle = primitive.getHwHandle(); - RenderPass::setupColorCommand(cmdColor, variant, mi, inverseFrontFaces); + // TODO: we should disable the SKN variant if this primitive doesn't have either + // skinning or morphing. - cmdColor.primitive.skinningHandle = skinning.handle; - cmdColor.primitive.skinningOffset = skinning.offset; - cmdColor.primitive.morphWeightBuffer = morphing.handle; - cmdColor.primitive.morphTargetBuffer = morphTargets.buffer->getHwHandle(); + FMaterial const* const ma = mi->getMaterial(); + cmd.info.mi = mi; + cmd.info.rph = primitive.getHwHandle(); + cmd.info.vbih = primitive.getVertexBufferInfoHandle(); + cmd.info.indexOffset = primitive.getIndexOffset(); + cmd.info.indexCount = primitive.getIndexCount(); + cmd.info.type = primitive.getPrimitiveType(); + cmd.info.morphingOffset = primitive.getMorphingBufferOffset(); +// FIXME: morphtarget buffer +// cmd.info.morphTargetBuffer = morphing.morphTargetBuffer ? +// morphing.morphTargetBuffer->getHwHandle() : SamplerGroupHandle{}; - const bool blendPass = Pass(cmdColor.key & PASS_MASK) == Pass::BLENDED; + if constexpr (isColorPass) { + setupColorCommand(cmd, renderableVariant, mi, + inverseFrontFaces, hasDepthClamp); + const bool blendPass = Pass(cmd.key & PASS_MASK) == Pass::BLENDED; if (blendPass) { // TODO: at least for transparent objects, AABB should be per primitive // but that would break the "local" blend-order, which relies on @@ -563,16 +740,16 @@ RenderPass::Command* RenderPass::generateCommandsImpl(uint32_t extraFlags, // blend pass: // This will sort back-to-front for blended, and honor explicit ordering // for a given Z value, or globally. - cmdColor.key &= ~BLEND_ORDER_MASK; - cmdColor.key &= ~BLEND_DISTANCE_MASK; + cmd.key &= ~BLEND_ORDER_MASK; + cmd.key &= ~BLEND_DISTANCE_MASK; // write the distance - cmdColor.key |= makeField(~distanceBits, + cmd.key |= makeField(~distanceBits, BLEND_DISTANCE_MASK, BLEND_DISTANCE_SHIFT); // clear the distance if global ordering is enabled - cmdColor.key &= ~select(primitive.isGlobalBlendOrderEnabled(), + cmd.key &= ~select(primitive.isGlobalBlendOrderEnabled(), BLEND_DISTANCE_MASK); // write blend order - cmdColor.key |= makeField(primitive.getBlendOrder(), + cmd.key |= makeField(primitive.getBlendOrder(), BLEND_ORDER_MASK, BLEND_ORDER_SHIFT); @@ -589,11 +766,11 @@ RenderPass::Command* RenderPass::generateCommandsImpl(uint32_t extraFlags, // In this mode, we override the user's culling mode. // TWO_PASSES_TWO_SIDES: this command will be issued 2nd, draw front faces - cmdColor.primitive.rasterState.culling = + cmd.info.rasterState.culling = (mode == TransparencyMode::TWO_PASSES_TWO_SIDES) ? - CullingMode::BACK : cmdColor.primitive.rasterState.culling; + CullingMode::BACK : cmd.info.rasterState.culling; - uint64_t key = cmdColor.key; + uint64_t key = cmd.key; // draw this command AFTER THE NEXT ONE key |= makeField(1, BLEND_TWO_PASS_MASK, BLEND_TWO_PASS_SHIFT); @@ -607,72 +784,53 @@ RenderPass::Command* RenderPass::generateCommandsImpl(uint32_t extraFlags, // cancel command if both front and back faces are culled key |= select(mi->getCullingMode() == CullingMode::FRONT_AND_BACK); - *curr = cmdColor; + *curr = cmd; curr->key = key; ++curr; // TWO_PASSES_TWO_SIDES: this command will be issued first, draw back sides (i.e. cull front) - cmdColor.primitive.rasterState.culling = + cmd.info.rasterState.culling = (mode == TransparencyMode::TWO_PASSES_TWO_SIDES) ? - CullingMode::FRONT : cmdColor.primitive.rasterState.culling; + CullingMode::FRONT : cmd.info.rasterState.culling; // TWO_PASSES_ONE_SIDE: this command will be issued first, draw (back side) in depth buffer only - cmdColor.primitive.rasterState.depthWrite |= select(mode == TransparencyMode::TWO_PASSES_ONE_SIDE); - cmdColor.primitive.rasterState.colorWrite &= ~select(mode == TransparencyMode::TWO_PASSES_ONE_SIDE); - cmdColor.primitive.rasterState.depthFunc = + cmd.info.rasterState.depthWrite |= select(mode == TransparencyMode::TWO_PASSES_ONE_SIDE); + cmd.info.rasterState.colorWrite &= ~select(mode == TransparencyMode::TWO_PASSES_ONE_SIDE); + cmd.info.rasterState.depthFunc = (mode == TransparencyMode::TWO_PASSES_ONE_SIDE) ? - SamplerCompareFunc::GE : cmdColor.primitive.rasterState.depthFunc; - + SamplerCompareFunc::GE : cmd.info.rasterState.depthFunc; } else { // color pass: // This will bucket objects by Z, front-to-back and then sort by material // in each buckets. We use the top 10 bits of the distance, which // bucketizes the depth by its log2 and in 4 linear chunks in each bucket. - cmdColor.key &= ~Z_BUCKET_MASK; - cmdColor.key |= makeField(distanceBits >> 22u, Z_BUCKET_MASK, Z_BUCKET_SHIFT); + cmd.key &= ~Z_BUCKET_MASK; + cmd.key |= makeField(distanceBits >> 22u, Z_BUCKET_MASK, Z_BUCKET_SHIFT); } - - *curr = cmdColor; - - // cancel command if both front and back faces are culled - curr->key |= select(mi->getCullingMode() == CullingMode::FRONT_AND_BACK); - - ++curr; - } - - if constexpr (isDepthPass) { + } else if constexpr (isDepthPass) { const RasterState rs = ma->getRasterState(); const TransparencyMode mode = mi->getTransparencyMode(); const BlendingMode blendingMode = ma->getBlendingMode(); const bool translucent = (blendingMode != BlendingMode::OPAQUE && blendingMode != BlendingMode::MASKED); + const bool isPickingVariant = Variant::isPickingVariant(variant); - cmdDepth.key |= mi->getSortingKey(); // already all set-up for direct or'ing - - // unconditionally write the command - cmdDepth.primitive.primitiveHandle = primitive.getHwHandle(); - cmdDepth.primitive.mi = mi; - cmdDepth.primitive.rasterState.culling = mi->getCullingMode(); - - cmdDepth.primitive.skinningHandle = skinning.handle; - cmdDepth.primitive.skinningOffset = skinning.offset; - cmdDepth.primitive.morphWeightBuffer = morphing.handle; - cmdDepth.primitive.morphTargetBuffer = morphTargets.buffer->getHwHandle(); + cmd.key |= mi->getSortingKey(); // already all set-up for direct or'ing + cmd.info.rasterState.culling = mi->getCullingMode(); // FIXME: should writeDepthForShadowCasters take precedence over mi->getDepthWrite()? - cmdDepth.primitive.rasterState.depthWrite = (1 // only keep bit 0 - & (mi->isDepthWriteEnabled() | (mode == TransparencyMode::TWO_PASSES_ONE_SIDE)) - & !(filterTranslucentObjects & translucent) - & !(depthFilterAlphaMaskedObjects & rs.alphaToCoverage)) - | writeDepthForShadowCasters; - - *curr = cmdDepth; - - // cancel command if both front and back faces are culled - curr->key |= select(mi->getCullingMode() == CullingMode::FRONT_AND_BACK); - - ++curr; + cmd.info.rasterState.depthWrite = (1 // only keep bit 0 + & (mi->isDepthWriteEnabled() | (mode == TransparencyMode::TWO_PASSES_ONE_SIDE) + | isPickingVariant) + & !(filterTranslucentObjects & translucent) + & !(depthFilterAlphaMaskedObjects & rs.alphaToCoverage)) + | writeDepthForShadowCasters; } + + *curr = cmd; + // cancel command if both front and back faces are culled + curr->key |= select(mi->getCullingMode() == CullingMode::FRONT_AND_BACK); + ++curr; } } return curr; @@ -683,7 +841,7 @@ void RenderPass::updateSummedPrimitiveCounts( auto const* const UTILS_RESTRICT primitives = renderableData.data(); uint32_t* const UTILS_RESTRICT summedPrimitiveCount = renderableData.data(); uint32_t count = 0; - for (uint32_t i : vr) { + for (uint32_t const i : vr) { summedPrimitiveCount[i] = count; count += primitives[i].size(); } @@ -693,168 +851,299 @@ void RenderPass::updateSummedPrimitiveCounts( // ------------------------------------------------------------------------------------------------ -void RenderPass::Executor::overridePolygonOffset(backend::PolygonOffset const* polygonOffset) noexcept { - if ((mPolygonOffsetOverride = (polygonOffset != nullptr))) { +void RenderPass::Executor::overridePolygonOffset(PolygonOffset const* polygonOffset) noexcept { + if ((mPolygonOffsetOverride = (polygonOffset != nullptr))) { // NOLINT(*-assignment-in-if-condition) mPolygonOffset = *polygonOffset; } } -void RenderPass::Executor::overrideScissor(backend::Viewport const* scissor) noexcept { - if ((mScissorOverride = (scissor != nullptr))) { - mScissor = *scissor; - } -} - void RenderPass::Executor::overrideScissor(backend::Viewport const& scissor) noexcept { mScissorOverride = true; mScissor = scissor; } -void RenderPass::Executor::execute(FEngine& engine, const char* name) const noexcept { - execute(engine.getDriverApi(), mCommands.begin(), mCommands.end()); +void RenderPass::Executor::execute(FEngine const& engine, DriverApi& driver) const noexcept { + execute(engine, driver, mCommands.begin(), mCommands.end()); +} + +UTILS_NOINLINE // no need to be inlined +backend::Viewport RenderPass::Executor::applyScissorViewport( + backend::Viewport const& scissorViewport, backend::Viewport const& scissor) noexcept { + // scissor is set, we need to apply the offset/clip + // clang vectorizes this! + constexpr int64_t maxvali = std::numeric_limits::max(); + + // we do all the offsetting/clipping math in 64 bits below to avoid overflows + struct { + int64_t l; + int64_t b; + int64_t r; + int64_t t; + } svp, s; + + // convert scissorViewport to {left,bottom,right,top} format + svp.l = scissorViewport.left; + svp.b = scissorViewport.bottom; + svp.r = svp.l + scissorViewport.width; + svp.t = svp.b + scissorViewport.height; + + // convert scissor to {left,bottom,right,top} format and offset by scissorViewport's left,bottom + s.l = svp.l + scissor.left; + s.b = svp.b + scissor.bottom; + s.r = s.l + scissor.width; + s.t = s.b + scissor.height; + + // clip to the scissorViewport + s.l = std::max(s.l, svp.l); + s.b = std::max(s.b, svp.b); + s.r = std::min(s.r, svp.r); + s.t = std::min(s.t, svp.t); + + // clip to positive int32_t + s.l = std::max(s.l, int64_t(0)); + s.b = std::max(s.b, int64_t(0)); + s.r = std::min(s.r, maxvali); + s.t = std::min(s.t, maxvali); + + assert_invariant(s.r >= s.l && s.t >= s.b); + + // convert back to Viewport format + return { int32_t(s.l), int32_t(s.b), uint32_t(s.r - s.l), uint32_t(s.t - s.b) }; } UTILS_NOINLINE // no need to be inlined -void RenderPass::Executor::execute(backend::DriverApi& driver, - const Command* first, const Command* last) const noexcept { +void RenderPass::Executor::execute(FEngine const& engine, DriverApi& driver, + Command const* first, Command const* last) const noexcept { + SYSTRACE_CALL(); + SYSTRACE_CONTEXT(); + + size_t const capacity = engine.getMinCommandBufferSize(); + CircularBuffer const& circularBuffer = driver.getCircularBuffer(); if (first != last) { SYSTRACE_VALUE32("commandCount", last - first); + // The scissor rectangle is associated to a render pass, so the tracking can be local. + backend::Viewport currentScissor{ 0, 0, INT32_MAX, INT32_MAX }; + bool const hasScissorOverride = mScissorOverride; + bool const hasScissorViewport = mHasScissorViewport; + if (UTILS_UNLIKELY(hasScissorViewport || hasScissorOverride)) { + // we should never have both an override and scissor-viewport + assert_invariant(!hasScissorViewport || !hasScissorOverride); + currentScissor = mScissor; + driver.scissor(mScissor); + } + + bool const polygonOffsetOverride = mPolygonOffsetOverride; PipelineState pipeline{ + // initialize with polygon offset override .polygonOffset = mPolygonOffset, - .scissor = mScissor - }, dummyPipeline; + }; - auto* const pPipelinePolygonOffset = - mPolygonOffsetOverride ? &dummyPipeline.polygonOffset : &pipeline.polygonOffset; + pipeline.pipelineLayout.setLayout[+DescriptorSetBindingPoints::PER_RENDERABLE] = + engine.getPerRenderableDescriptorSetLayout().getHandle(); - auto* const pScissor = - mScissorOverride ? &dummyPipeline.scissor : &pipeline.scissor; + PipelineState currentPipeline{}; + Handle currentPrimitiveHandle{}; - Handle uboHandle = mUboHandle; FMaterialInstance const* UTILS_RESTRICT mi = nullptr; FMaterial const* UTILS_RESTRICT ma = nullptr; auto const* UTILS_RESTRICT pCustomCommands = mCustomCommands.data(); - first--; - while (++first != last) { - assert_invariant(first->key != uint64_t(Pass::SENTINEL)); + // Maximum space occupied in the CircularBuffer by a single `Command`. This must be + // reevaluated when the inner loop below adds DriverApi commands or when we change the + // CommandStream protocol. Currently, the maximum is 248 bytes. + // The batch size is calculated by adding the size of all commands that can possibly be + // emitted per draw call: + constexpr size_t maxCommandSizeInBytes = + sizeof(COMMAND_TYPE(scissor)) + + sizeof(COMMAND_TYPE(bindDescriptorSet)) + + sizeof(COMMAND_TYPE(bindDescriptorSet)) + + sizeof(COMMAND_TYPE(bindPipeline)) + + sizeof(COMMAND_TYPE(bindRenderPrimitive)) + + sizeof(COMMAND_TYPE(bindDescriptorSet)) + backend::CustomCommand::align(sizeof(NoopCommand) + 8) + + sizeof(COMMAND_TYPE(setPushConstant)) + + sizeof(COMMAND_TYPE(draw2)); + + + // Number of Commands that can be issued and guaranteed to fit in the current + // CircularBuffer allocation. In practice, we'll have tons of headroom especially if + // skinning and morphing aren't used. With a 2 MiB buffer (the default) a batch is + // 6553 commands (i.e. draw calls). + size_t const batchCommandCount = capacity / maxCommandSizeInBytes; + while(first != last) { + Command const* const batchLast = std::min(first + batchCommandCount, last); + + // actual number of commands we need to write (can be smaller than batchCommandCount) + size_t const commandCount = batchLast - first; + size_t const commandSizeInBytes = commandCount * maxCommandSizeInBytes; + + // check we have enough capacity to write these commandCount commands, if not, + // request a new CircularBuffer allocation of `capacity` bytes. + if (UTILS_UNLIKELY(circularBuffer.getUsed() > capacity - commandSizeInBytes)) { + // FIXME: eventually we can't flush here because this will be a secondary + // command buffer. We will need another solution for overflows. + const_cast(engine).flush(); + } - /* - * Be careful when changing code below, this is the hot inner-loop - */ + first--; + while (++first != batchLast) { + assert_invariant(first->key != uint64_t(Pass::SENTINEL)); - if (UTILS_UNLIKELY((first->key & CUSTOM_MASK) != uint64_t(CustomCommand::PASS))) { - uint32_t index = (first->key & CUSTOM_INDEX_MASK) >> CUSTOM_INDEX_SHIFT; - assert_invariant(index < mCustomCommands.size()); - pCustomCommands[index](); - continue; - } + /* + * Be careful when changing code below, this is the hot inner-loop + */ - // primitiveHandle may be invalid if no geometry was set on the renderable. - if (UTILS_UNLIKELY(!first->primitive.primitiveHandle)) { - continue; - } + if (UTILS_UNLIKELY((first->key & CUSTOM_MASK) != uint64_t(CustomCommand::PASS))) { + mi = nullptr; // custom command could change the currently bound MaterialInstance + uint32_t const index = (first->key & CUSTOM_INDEX_MASK) >> CUSTOM_INDEX_SHIFT; + assert_invariant(index < mCustomCommands.size()); + pCustomCommands[index](); + continue; + } - // per-renderable uniform - const PrimitiveInfo info = first->primitive; - pipeline.rasterState = info.rasterState; - - if (UTILS_UNLIKELY(mi != info.mi)) { - // this is always taken the first time - mi = info.mi; - ma = mi->getMaterial(); - - auto const& scissor = mi->getScissor(); - if (UTILS_UNLIKELY(mi->hasScissor())) { - // scissor is set, we need to apply the offset/clip - // clang vectorizes this! - constexpr int32_t maxvali = std::numeric_limits::max(); - const backend::Viewport scissorViewport = mScissorViewport; - // compute new left/bottom, assume no overflow - int32_t l = scissor.left + scissorViewport.left; - int32_t b = scissor.bottom + scissorViewport.bottom; - // compute right/top without overflowing, scissor.width/height guaranteed - // to convert to int32 - int32_t r = (l > maxvali - int32_t(scissor.width)) ? - maxvali : l + int32_t(scissor.width); - int32_t t = (b > maxvali - int32_t(scissor.height)) ? - maxvali : b + int32_t(scissor.height); - // clip to the viewport - l = std::max(l, scissorViewport.left); - b = std::max(b, scissorViewport.bottom); - r = std::min(r, scissorViewport.left + int32_t(scissorViewport.width)); - t = std::min(t, scissorViewport.bottom + int32_t(scissorViewport.height)); - assert_invariant(r >= l && t >= b); - *pScissor = { l, b, uint32_t(r - l), uint32_t(t - b) }; - } else { - // no scissor set (common case), 'scissor' has its default value, use that. - *pScissor = scissor; + // primitiveHandle may be invalid if no geometry was set on the renderable. + if (UTILS_UNLIKELY(!first->info.rph)) { + continue; } - *pPipelinePolygonOffset = mi->getPolygonOffset(); - pipeline.stencilState = mi->getStencilState(); - mi->use(driver); - } + // per-renderable uniform + PrimitiveInfo const info = first->info; + pipeline.rasterState = info.rasterState; + pipeline.vertexBufferInfo = info.vbih; + pipeline.primitiveType = info.type; + assert_invariant(pipeline.vertexBufferInfo); + + if (UTILS_UNLIKELY(mi != info.mi)) { + // this is always taken the first time + assert_invariant(info.mi); + + mi = info.mi; + ma = mi->getMaterial(); + + // if we have the scissor override, the material instance and scissor-viewport + // are ignored (typically used for shadow maps). + if (!hasScissorOverride) { + // apply the MaterialInstance scissor + backend::Viewport scissor = mi->getScissor(); + if (hasScissorViewport) { + // apply the scissor viewport if any + scissor = applyScissorViewport(mScissor, scissor); + } + if (scissor != currentScissor) { + currentScissor = scissor; + driver.scissor(scissor); + } + } + + if (UTILS_LIKELY(!polygonOffsetOverride)) { + pipeline.polygonOffset = mi->getPolygonOffset(); + } + pipeline.stencilState = mi->getStencilState(); + + // Each material has its own version of the per-view descriptor-set layout, + // because it depends on the material features (e.g. lit/unlit) + pipeline.pipelineLayout.setLayout[+DescriptorSetBindingPoints::PER_VIEW] = + ma->getPerViewDescriptorSetLayout(info.materialVariant).getHandle(); + + // Each material has a per-material descriptor-set layout which encodes the + // material's parameters (ubo and samplers) + pipeline.pipelineLayout.setLayout[+DescriptorSetBindingPoints::PER_MATERIAL] = + ma->getDescriptorSetLayout().getHandle(); + + if (UTILS_UNLIKELY(ma->getMaterialDomain() == MaterialDomain::POST_PROCESS)) { + // It is possible to get a post-process material here (even though it's + // not technically a public API yet, it is used by the IBLPrefilterLibrary. + // Ideally we would have a more formal compute API). In this case, we need + // to set the post-process descriptor-set. + engine.getPostProcessManager().bindPostProcessDescriptorSet(driver); + } else { + // If we have a ColorPassDescriptorSet we use it to bind the per-view + // descriptor-set (ideally only if it changed). If we don't, it means + // the descriptor-set is already bound and the layout we got from the + // material above should match. This is the case for situations where we + // have a known per-view descriptor-set layout, e.g.: shadow-maps, ssr and + // structure passes. + if (mColorPassDescriptorSet) { + // We have a ColorPassDescriptorSet, we need to go through it for binding + // the per-view descriptor-set because its layout can change based on the + // material. + mColorPassDescriptorSet->bind(driver, ma->getPerViewLayoutIndex()); + } + } + + // Each MaterialInstance has its own descriptor set. This binds it. + mi->use(driver); + } - pipeline.program = ma->getProgram(info.materialVariant); - - // bind per-renderable uniform block. there is no need to attempt to skip this command - // because the backends already do this. - driver.bindBufferRange(BufferObjectBinding::UNIFORM, - +UniformBindingPoints::PER_RENDERABLE, - (info.instanceCount > 1) ? mInstancedUboHandle : uboHandle, - info.index * sizeof(PerRenderableData), - sizeof(PerRenderableUib)); - - if (UTILS_UNLIKELY(info.skinningHandle)) { - // note: we can't bind less than sizeof(PerRenderableBoneUib) due to glsl limitations - driver.bindBufferRange(BufferObjectBinding::UNIFORM, - +UniformBindingPoints::PER_RENDERABLE_BONES, - info.skinningHandle, - info.skinningOffset * sizeof(PerRenderableBoneUib::BoneData), - sizeof(PerRenderableBoneUib)); - // note: even if only skinning is enabled, binding morphTargetBuffer is needed. - driver.bindSamplers(+SamplerBindingPoints::PER_RENDERABLE_MORPHING, - info.morphTargetBuffer); - } + assert_invariant(ma); + pipeline.program = ma->getProgram(info.materialVariant); - if (UTILS_UNLIKELY(info.morphWeightBuffer)) { - // Instead of using a UBO per primitive, we could also have a single UBO for all - // primitives and use bindUniformBufferRange which might be more efficient. - driver.bindUniformBuffer(+UniformBindingPoints::PER_RENDERABLE_MORPHING, - info.morphWeightBuffer); - driver.bindSamplers(+SamplerBindingPoints::PER_RENDERABLE_MORPHING, - info.morphTargetBuffer); - } + if (UTILS_UNLIKELY(memcmp(&pipeline, ¤tPipeline, sizeof(PipelineState)) != 0)) { + currentPipeline = pipeline; + driver.bindPipeline(pipeline); + } + + if (UTILS_UNLIKELY(info.rph != currentPrimitiveHandle)) { + currentPrimitiveHandle = info.rph; + driver.bindRenderPrimitive(info.rph); + } + + // Bind per-renderable uniform block. There is no need to attempt to skip this command + // because the backends already do this. + uint32_t const offset = info.hasHybridInstancing ? + 0 : info.index * sizeof(PerRenderableData); + + assert_invariant(info.dsh); + driver.bindDescriptorSet(info.dsh, + +DescriptorSetBindingPoints::PER_RENDERABLE, + {{ offset, info.skinningOffset }, driver}); - driver.draw(pipeline, info.primitiveHandle, info.instanceCount); + if (UTILS_UNLIKELY(info.hasMorphing)) { + driver.setPushConstant(ShaderStage::VERTEX, + +PushConstantIds::MORPHING_BUFFER_OFFSET, int32_t(info.morphingOffset)); + } + + driver.draw2(info.indexOffset, info.indexCount, info.instanceCount); + } } - } - if (mInstancedUboHandle) { - driver.destroyBufferObject(mInstancedUboHandle); + // If the remaining space is less than half the capacity, we flush right away to + // allow some headroom for commands that might come later. + if (UTILS_UNLIKELY(circularBuffer.getUsed() > capacity / 2)) { + // FIXME: eventually we can't flush here because this will be a secondary + // command buffer. + const_cast(engine).flush(); + } } - } // ------------------------------------------------------------------------------------------------ -RenderPass::Executor::Executor(RenderPass const* pass, Command const* b, Command const* e) noexcept +RenderPass::Executor::Executor(RenderPass const& pass, Command const* b, Command const* e) noexcept : mCommands(b, e), - mCustomCommands(pass->mCustomCommands.data(), pass->mCustomCommands.size()), - mUboHandle(pass->mUboHandle), - mInstancedUboHandle(pass->mInstancedUboHandle), - mScissorViewport(pass->mScissorViewport), + mCustomCommands(pass.mCustomCommands.data(), pass.mCustomCommands.size()), + mInstancedUboHandle(pass.mInstancedUboHandle), + mInstancedDescriptorSetHandle(pass.mInstancedDescriptorSetHandle), + mColorPassDescriptorSet(pass.mColorPassDescriptorSet), + mScissor(pass.mScissorViewport), mPolygonOffsetOverride(false), mScissorOverride(false) { - assert_invariant(b >= pass->begin()); - assert_invariant(e <= pass->end()); + mHasScissorViewport = mScissor != backend::Viewport{ 0, 0, INT32_MAX, INT32_MAX }; + assert_invariant(b >= pass.begin()); + assert_invariant(e <= pass.end()); +} + +RenderPass::Executor::Executor() noexcept + : mPolygonOffsetOverride(false), + mScissorOverride(false), + mHasScissorViewport(false) { } -RenderPass::Executor::Executor(Executor const& rhs) = default; +RenderPass::Executor::Executor(Executor&& rhs) noexcept = default; + +RenderPass::Executor& RenderPass::Executor::operator=(Executor&& rhs) noexcept = default; // this destructor is actually heavy because it inlines ~vector<> RenderPass::Executor::~Executor() noexcept = default; diff --git a/filament/src/RenderPass.h b/filament/src/RenderPass.h index d3f48ea34e8..de536fcb198 100644 --- a/filament/src/RenderPass.h +++ b/filament/src/RenderPass.h @@ -19,29 +19,47 @@ #include "Allocators.h" +#include "SharedHandle.h" + #include "details/Camera.h" #include "details/Scene.h" -#include "backend/DriverApiForward.h" - -#include +#include "private/filament/Variant.h" +#include #include #include #include +#include +#include #include +#include #include -#include #include +#include + #include #include +#include +#include +#include #include +#include +#include + namespace filament { +namespace backend { +class CommandBufferQueue; +} + class FMaterialInstance; +class FRenderPrimitive; +class RenderPassBuilder; +class ColorPassDescriptorSet; class RenderPass { public: @@ -49,6 +67,8 @@ class RenderPass { * Command key encoding * -------------------- * + * CC = Channel + * PP = Pass * a = alpha masking * ppp = priority * t = two-pass transparency ordering @@ -58,45 +78,45 @@ class RenderPass { * TODO: we need to add a "primitive id" in the low-bits of material-id, so that * auto-instancing can work better * - * DEPTH command - * | 6 | 2| 2|1| 3 | 2| 6 | 10 | 32 | - * +------+--+--+-+---+--+------+----------+--------------------------------+ - * |000000|01|00|0|ppp|00|000000| Z-bucket | material-id | - * +------+--+--+-+---+--+------+----------+--------------------------------+ - * | correctness | optimizations (truncation allowed) | + * DEPTH command (b00) + * | | | 2| 2| 2|1| 3 | 2| 6 | 10 | 32 | + * +--+--+--+--+--+-+---+--+------+----------+--------------------------------+ + * |CC|00|00|01|00|0|ppp|00|000000| Z-bucket | material-id | + * +--+--+--+--+--+-+---+--+------+----------+--------------------------------+ + * | correctness | optimizations (truncation allowed) | * * - * COLOR command - * | 6 | 2| 2|1| 3 | 2| 6 | 10 | 32 | - * +------+--+--+-+---+--+------+----------+--------------------------------+ - * |000001|01|00|a|ppp|00|000000| Z-bucket | material-id | - * |000010|01|00|a|ppp|00|000000| Z-bucket | material-id | refraction - * +------+--+--+-+---+--+------+----------+--------------------------------+ - * | correctness | optimizations (truncation allowed) | + * COLOR (b01) and REFRACT (b10) commands + * | | 2| 2| 2| 2|1| 3 | 2| 6 | 10 | 32 | + * +--+--+--+--+--+-+---+--+------+----------+--------------------------------+ + * |CC|00|01|01|00|a|ppp|00|000000| Z-bucket | material-id | + * |CC|00|10|01|00|a|ppp|00|000000| Z-bucket | material-id | refraction + * +--+--+--+--+--+-+---+--+------+----------+--------------------------------+ + * | correctness | optimizations (truncation allowed) | * * - * BLENDED command - * | 6 | 2| 2|1| 3 | 2| 32 | 15 |1| - * +------+--+--+-+---+--+--------------------------------+---------------+-+ - * |000011|01|00|0|ppp|00| ~distanceBits | blendOrder |t| - * +------+--+--+-+---+--+--------------------------------+---------------+-+ - * | correctness | + * BLENDED command (b11) + * | 2| 2| 2| 2| 2|1| 3 | 2| 32 | 15 |1| + * +--+--+--+--+--+-+---+--+--------------------------------+---------------+-+ + * |CC|00|11|01|00|0|ppp|00| ~distanceBits | blendOrder |t| + * +--+--+--+--+--+-+---+--+--------------------------------+---------------+-+ + * | correctness | * * * pre-CUSTOM command - * | 6 | 2| 2| 22 | 32 | - * +------+--+--+----------------------+--------------------------------+ - * | pass |00|00| order | custom command index | - * +------+--+--+----------------------+--------------------------------+ - * | correctness | + * | 2| 2| 2| 2| 2| 22 | 32 | + * +--+--+--+--+--+----------------------+--------------------------------+ + * |CC|00|PP|00|00| order | custom command index | + * +--+--+--+--+--+----------------------+--------------------------------+ + * | correctness | * * * post-CUSTOM command - * | 6 | 2| 2| 22 | 32 | - * +------+--+--+----------------------+--------------------------------+ - * | pass |11|00| order | custom command index | - * +------+--+--+----------------------+--------------------------------+ - * | correctness | + * | 2| 2| 2| 2| 2| 22 | 32 | + * +--+--+--+--+--+----------------------+--------------------------------+ + * |CC|00|PP|11|00| order | custom command index | + * +--+--+--+--+--+----------------------+--------------------------------+ + * | correctness | * * * SENTINEL command @@ -137,12 +157,15 @@ class RenderPass { static constexpr uint64_t BLENDING_MASK = 0x0020000000000000llu; static constexpr unsigned BLENDING_SHIFT = 53; - static constexpr uint64_t PASS_MASK = 0xFC00000000000000llu; - static constexpr unsigned PASS_SHIFT = 58; - static constexpr uint64_t CUSTOM_MASK = 0x0300000000000000llu; static constexpr unsigned CUSTOM_SHIFT = 56; + static constexpr uint64_t PASS_MASK = 0x0C00000000000000llu; + static constexpr unsigned PASS_SHIFT = 58; + + static constexpr uint64_t CHANNEL_MASK = 0xC000000000000000llu; + static constexpr unsigned CHANNEL_SHIFT = 62; + static constexpr uint64_t CUSTOM_ORDER_MASK = 0x003FFFFF00000000llu; static constexpr unsigned CUSTOM_ORDER_SHIFT = 32; @@ -166,7 +189,7 @@ class RenderPass { EPILOG = uint64_t(0x2) << CUSTOM_SHIFT }; - enum CommandTypeFlags : uint8_t { + enum class CommandTypeFlags : uint32_t { COLOR = 0x1, // generate the color pass only DEPTH = 0x2, // generate the depth pass only ( e.g. shadowmap) @@ -186,7 +209,6 @@ class RenderPass { SCREEN_SPACE_REFLECTIONS = COLOR | FILTER_TRANSLUCENT_OBJECTS }; - /* * The sorting material key is 32 bits and encoded as: * @@ -197,14 +219,14 @@ class RenderPass { * * The variant is inserted while building the commands, because we don't know it before that */ - static CommandKey makeMaterialSortingKey(uint32_t materialId, uint32_t instanceId) noexcept { - CommandKey key = ((materialId << MATERIAL_ID_SHIFT) & MATERIAL_ID_MASK) | + static CommandKey makeMaterialSortingKey(uint32_t const materialId, uint32_t const instanceId) noexcept { + CommandKey const key = ((materialId << MATERIAL_ID_SHIFT) & MATERIAL_ID_MASK) | ((instanceId << MATERIAL_INSTANCE_ID_SHIFT) & MATERIAL_INSTANCE_ID_MASK); return (key << MATERIAL_SHIFT) & MATERIAL_MASK; } template - static CommandKey makeField(T value, uint64_t mask, unsigned shift) noexcept { + static CommandKey makeField(T value, uint64_t const mask, unsigned const shift) noexcept { assert_invariant(!((uint64_t(value) << shift) & ~mask)); return uint64_t(value) << shift; } @@ -219,31 +241,39 @@ class RenderPass { return boolish ? value : uint64_t(0); } - struct PrimitiveInfo { // 40 bytes + struct PrimitiveInfo { // 56 bytes union { FMaterialInstance const* mi; - uint64_t padding = {}; // ensures mi is 8 bytes on all archs - }; // 8 bytes - backend::RasterState rasterState; // 4 bytes - backend::Handle primitiveHandle; // 4 bytes - backend::Handle skinningHandle; // 4 bytes - backend::Handle morphWeightBuffer; // 4 bytes - backend::Handle morphTargetBuffer; // 4 bytes - uint32_t index = 0; // 4 bytes - uint32_t skinningOffset = 0; // 4 bytes - uint16_t instanceCount; // 2 bytes - Variant materialVariant; // 1 byte - uint8_t reserved[1] = {}; // 1 byte + uint64_t padding; // make this field 64 bits on all platforms + }; + backend::RenderPrimitiveHandle rph; // 4 bytes + backend::VertexBufferInfoHandle vbih; // 4 bytes + backend::DescriptorSetHandle dsh; // 4 bytes + uint32_t indexOffset; // 4 bytes + uint32_t indexCount; // 4 bytes + uint32_t index = 0; // 4 bytes + uint32_t skinningOffset = 0; // 4 bytes + uint32_t morphingOffset = 0; // 4 bytes + + backend::RasterState rasterState; // 4 bytes + + uint16_t instanceCount; // 2 bytes [MSb: user] + Variant materialVariant; // 1 byte + backend::PrimitiveType type : 3; // 1 byte 3 bits + bool hasSkinning : 1; // 1 bit + bool hasMorphing : 1; // 1 bit + bool hasHybridInstancing : 1; // 1 bit + + uint32_t rfu[2]; // 16 bytes }; - static_assert(sizeof(PrimitiveInfo) == 40); + static_assert(sizeof(PrimitiveInfo) == 56); struct alignas(8) Command { // 64 bytes CommandKey key = 0; // 8 bytes - PrimitiveInfo primitive; // 40 bytes - uint64_t reserved[2] = {}; // 16 bytes + PrimitiveInfo info; // 56 bytes bool operator < (Command const& rhs) const noexcept { return key < rhs.key; } // placement new declared as "throw" to avoid the compiler's null-check - inline void* operator new (std::size_t, void* ptr) { + void* operator new (size_t, void* ptr) { assert_invariant(ptr); return ptr; } @@ -253,66 +283,52 @@ class RenderPass { "Command isn't trivially destructible"); using RenderFlags = uint8_t; - static constexpr RenderFlags HAS_SHADOWING = 0x01; - static constexpr RenderFlags HAS_INVERSE_FRONT_FACES = 0x02; + static constexpr RenderFlags HAS_SHADOWING = 0x01; + static constexpr RenderFlags HAS_INVERSE_FRONT_FACES = 0x02; + static constexpr RenderFlags IS_INSTANCED_STEREOSCOPIC = 0x04; + static constexpr RenderFlags HAS_DEPTH_CLAMP = 0x08; // Arena used for commands using Arena = utils::Arena< - utils::LinearAllocator, // note: can't change this allocator + utils::LinearAllocatorWithFallback, utils::LockingPolicy::NoLock, utils::TrackingPolicy::HighWatermark, utils::AreaPolicy::StaticArea>; - /* - * Create a RenderPass. - * The Arena is used to allocate commands which are then owned by the Arena. - */ - RenderPass(FEngine& engine, Arena& arena) noexcept; + // RenderPass can only be moved + RenderPass(RenderPass&& rhs) = default; + RenderPass& operator=(RenderPass&& rhs) = delete; // could be supported if needed - // Copy the RenderPass as is. This can be used to create a RenderPass from a "template" - // by copying from an "empty" RenderPass. - RenderPass(RenderPass const& rhs); + // RenderPass can't be copied + RenderPass(RenderPass const& rhs) = delete; + RenderPass& operator=(RenderPass const& rhs) = delete; // allocated commands ARE NOT freed, they're owned by the Arena ~RenderPass() noexcept; - // a box that both offsets the viewport and clips it - void setScissorViewport(backend::Viewport viewport) noexcept; - - // specifies the geometry to generate commands for - void setGeometry(FScene::RenderableSoa const& soa, utils::Range vr, - backend::Handle uboHandle) noexcept; - - // specifies camera information (e.g. used for sorting commands) - void setCamera(const CameraInfo& camera) noexcept; - - // flags controlling how commands are generated - void setRenderFlags(RenderFlags flags) noexcept { mFlags = flags; } - RenderFlags getRenderFlags() const noexcept { return mFlags; } - - // variant to use - void setVariant(Variant variant) noexcept { mVariant = variant; } - - // Sets the visibility mask, which is AND-ed against each Renderable's VISIBLE_MASK to determine - // if the renderable is visible for this pass. - // Defaults to all 1's, which means all renderables in this render pass will be rendered. - void setVisibilityMask(FScene::VisibleMaskType mask) noexcept { mVisibilityMask = mask; } - Command const* begin() const noexcept { return mCommandBegin; } Command const* end() const noexcept { return mCommandEnd; } bool empty() const noexcept { return begin() == end(); } - // This is the main function of this class, this appends commands to the pass using - // the current camera, geometry and flags set. This can be called multiple times if needed. - void appendCommands(FEngine& engine, CommandTypeFlags commandTypeFlags) noexcept; + class BufferObjectHandleDeleter { + std::reference_wrapper driver; + public: + explicit BufferObjectHandleDeleter(backend::DriverApi& driver) noexcept : driver(driver) { } + void operator()(backend::BufferObjectHandle handle) noexcept; + }; - // sorts and instanceify commands then trims sentinels - void sortCommands(FEngine& engine) noexcept; + class DescriptorSetHandleDeleter { + std::reference_wrapper driver; + public: + explicit DescriptorSetHandleDeleter(backend::DriverApi& driver) noexcept : driver(driver) { } + void operator()(backend::DescriptorSetHandle handle) noexcept; + }; + + using BufferObjectSharedHandle = SharedHandle< + backend::HwBufferObject, BufferObjectHandleDeleter>; - // Helper to execute all the commands generated by this RenderPass - void execute(FEngine& engine, const char* name, - backend::Handle renderTarget, - backend::RenderPassParams params) const noexcept; + using DescriptorSetSharedHandle = SharedHandle< + backend::HwDescriptorSet, DescriptorSetHandleDeleter>; /* * Executor holds the range of commands to execute for a given pass @@ -320,141 +336,248 @@ class RenderPass { class Executor { using CustomCommandFn = std::function; friend class RenderPass; + friend class RenderPassBuilder; // these fields are constant after creation utils::Slice mCommands; utils::Slice mCustomCommands; - backend::Handle mUboHandle; - backend::Handle mInstancedUboHandle; - backend::Viewport mScissorViewport; + BufferObjectSharedHandle mInstancedUboHandle; + DescriptorSetSharedHandle mInstancedDescriptorSetHandle; + ColorPassDescriptorSet const* mColorPassDescriptorSet = nullptr; + // this stores either the scissor-viewport or the scissor override + backend::Viewport mScissor{ 0, 0, INT32_MAX, INT32_MAX }; + + // value of the polygon offset override + backend::PolygonOffset mPolygonOffset{}; + // whether to override the polygon offset from the MaterialInstance + bool mPolygonOffsetOverride : 1; + // whether to override the scissor rectangle from the MaterialInstance + bool mScissorOverride : 1; + // whether the scissor-viewport is set + bool mHasScissorViewport : 1; + + Executor(RenderPass const& pass, Command const* b, Command const* e) noexcept; + + void execute(FEngine const& engine, backend::DriverApi& driver, + Command const* first, Command const* last) const noexcept; + + static backend::Viewport applyScissorViewport( + backend::Viewport const& scissorViewport, + backend::Viewport const& scissor) noexcept; - backend::Viewport mScissor{}; // value of scissor override - backend::PolygonOffset mPolygonOffset{}; // value of the override - bool mPolygonOffsetOverride : 1; // whether to override the polygon offset setting - bool mScissorOverride : 1; // whether to override the polygon offset setting + public: + // fixme: needed in ShadowMapManager + Executor() noexcept; - Executor(RenderPass const* pass, Command const* b, Command const* e) noexcept; + // can't be copied + Executor(Executor const& rhs) noexcept = delete; + Executor& operator=(Executor const& rhs) noexcept = delete; - void execute(backend::DriverApi& driver, - const Command* first, const Command* last) const noexcept; + // can be moved + Executor(Executor&& rhs) noexcept; + Executor& operator=(Executor&& rhs) noexcept; - public: - Executor() = default; - Executor(Executor const& rhs); - Executor& operator=(Executor const& rhs) = default; ~Executor() noexcept; // if non-null, overrides the material's polygon offset void overridePolygonOffset(backend::PolygonOffset const* polygonOffset) noexcept; - // if non-null, overrides the material's scissor - void overrideScissor(backend::Viewport const* scissor) noexcept; void overrideScissor(backend::Viewport const& scissor) noexcept; - void execute(FEngine& engine, const char* name) const noexcept; + void execute(FEngine const& engine, backend::DriverApi& driver) const noexcept; }; // returns a new executor for this pass - Executor getExecutor() { - return { this, mCommandBegin, mCommandEnd }; - } - Executor getExecutor() const { - return { this, mCommandBegin, mCommandEnd }; - } - - // returns a new executor for this pass with a custom range - Executor getExecutor(Command const* b, Command const* e) { - return { this, b, e }; + return getExecutor(mCommandBegin, mCommandEnd); } Executor getExecutor(Command const* b, Command const* e) const { - return { this, b, e }; + return { *this, b, e }; } +private: + friend class FRenderer; + friend class RenderPassBuilder; + RenderPass(FEngine const& engine, backend::DriverApi& driver, + RenderPassBuilder const& builder) noexcept; + + // This is the main function of this class, this appends commands to the pass using + // the current camera, geometry and flags set. This can be called multiple times if needed. + void appendCommands(FEngine const& engine, + utils::Slice commands, + utils::Range visibleRenderables, + CommandTypeFlags commandTypeFlags, + RenderFlags renderFlags, + FScene::VisibleMaskType visibilityMask, + Variant variant, + math::float3 cameraPosition, + math::float3 cameraForwardVector) const noexcept; + // Appends a custom command. - void appendCustomCommand(Pass pass, CustomCommand custom, uint32_t order, + void appendCustomCommand(Command* commands, + uint8_t channel, Pass pass, CustomCommand custom, uint32_t order, Executor::CustomCommandFn command); + static Command* resize(Arena& arena, Command* last) noexcept; -private: - friend class FRenderer; + // sorts commands then trims sentinels + static Command* sortCommands( + Command* begin, Command* end) noexcept; - Command* append(size_t count) noexcept; - void resize(size_t count) noexcept; - void instanceify(FEngine& engine) noexcept; + // instanceify commands then trims sentinels + Command* instanceify(backend::DriverApi& driver, + backend::DescriptorSetLayoutHandle perRenderableDescriptorSetLayoutHandle, + Command* begin, Command* end, + int32_t eyeCount) const noexcept; - // on 64-bits systems, we process batches of 256 (64 bytes) cache-lines, or 512 (32 bytes) commands - // on 32-bits systems, we process batches of 512 (32 bytes) cache-lines, or 512 (32 bytes) commands - static constexpr size_t JOBS_PARALLEL_FOR_COMMANDS_COUNT = 512; + // We choose the command count per job to minimize JobSystem overhead. + static constexpr size_t JOBS_PARALLEL_FOR_COMMANDS_COUNT = 128; static constexpr size_t JOBS_PARALLEL_FOR_COMMANDS_SIZE = sizeof(Command) * JOBS_PARALLEL_FOR_COMMANDS_COUNT; static_assert(JOBS_PARALLEL_FOR_COMMANDS_SIZE % utils::CACHELINE_SIZE == 0, "Size of Commands jobs must be multiple of a cache-line size"); - static inline void generateCommands(uint32_t commandTypeFlags, Command* commands, + static inline void generateCommands(CommandTypeFlags commandTypeFlags, Command* commands, FScene::RenderableSoa const& soa, utils::Range range, Variant variant, RenderFlags renderFlags, FScene::VisibleMaskType visibilityMask, - math::float3 cameraPosition, math::float3 cameraForward) noexcept; + math::float3 cameraPosition, math::float3 cameraForward, + uint8_t instancedStereoEyeCount) noexcept; - template - static inline Command* generateCommandsImpl(uint32_t extraFlags, Command* curr, - FScene::RenderableSoa const& soa, utils::Range range, + template + static Command* generateCommandsImpl(CommandTypeFlags extraFlags, + Command* curr, FScene::RenderableSoa const& soa, utils::Range range, Variant variant, RenderFlags renderFlags, FScene::VisibleMaskType visibilityMask, - math::float3 cameraPosition, math::float3 cameraForward) noexcept; + math::float3 cameraPosition, math::float3 cameraForward, + uint8_t instancedStereoEyeCount) noexcept; static void setupColorCommand(Command& cmdDraw, Variant variant, - FMaterialInstance const* mi, bool inverseFrontFaces) noexcept; + FMaterialInstance const* mi, bool inverseFrontFaces, bool hasDepthClamp) noexcept; static void updateSummedPrimitiveCounts( FScene::RenderableSoa& renderableData, utils::Range vr) noexcept; - // a reference to the Engine, mostly to get to things like JobSystem + FScene::RenderableSoa const& mRenderableSoa; + ColorPassDescriptorSet const* const mColorPassDescriptorSet; + backend::Viewport const mScissorViewport{ 0, 0, INT32_MAX, INT32_MAX }; + Command const* /* const */ mCommandBegin = nullptr; // Pointer to the first command + Command const* /* const */ mCommandEnd = nullptr; // Pointer to one past the last command + mutable BufferObjectSharedHandle mInstancedUboHandle; // ubo for instanced primitives + mutable DescriptorSetSharedHandle mInstancedDescriptorSetHandle; // a descriptor-set to hold the ubo + // a vector for our custom commands + using CustomCommandVector = utils::FixedCapacityVector; + mutable CustomCommandVector mCustomCommands; +}; - // Arena where all Commands are allocated. The Arena owns the commands. - Arena& mCommandArena; +class RenderPassBuilder { + friend class RenderPass; - // Pointer to the first command - Command* mCommandBegin = nullptr; + RenderPass::Arena& mArena; + RenderPass::CommandTypeFlags mCommandTypeFlags{}; + backend::Viewport mScissorViewport{ 0, 0, INT32_MAX, INT32_MAX }; + FScene::RenderableSoa const* mRenderableSoa = nullptr; + utils::Range mVisibleRenderables{}; + math::float3 mCameraPosition{}; + math::float3 mCameraForwardVector{}; + RenderPass::RenderFlags mFlags{}; + Variant mVariant{}; + ColorPassDescriptorSet const* mColorPassDescriptorSet = nullptr; + FScene::VisibleMaskType mVisibilityMask = std::numeric_limits::max(); - // Pointer to one past the last command - Command* mCommandEnd = nullptr; + using CustomCommandRecord = std::tuple< + uint8_t, + RenderPass::Pass, + RenderPass::CustomCommand, + uint32_t, + RenderPass::Executor::CustomCommandFn>; - // the SOA containing the renderables we're interested in - FScene::RenderableSoa const* mRenderableSoa = nullptr; + using CustomCommandContainer = std::vector; - // The range of visible renderables in the SOA above - utils::Range mVisibleRenderables{}; + // we make this optional because it's not used often, and we don't want to have + // to construct it by default. For the same reason we use a std::vector<> + std::optional mCustomCommands; - // the UBO containing the data for the renderables - backend::Handle mUboHandle; - backend::Handle mInstancedUboHandle; +public: + explicit RenderPassBuilder(RenderPass::Arena& arena) : mArena(arena) { } - // info about the camera - math::float3 mCameraPosition{}; - math::float3 mCameraForwardVector{}; + RenderPassBuilder& commandTypeFlags(RenderPass::CommandTypeFlags const commandTypeFlags) noexcept { + mCommandTypeFlags = commandTypeFlags; + return *this; + } - // info about the scene features (e.g.: has shadows, lighting, etc...) - RenderFlags mFlags{}; + // Specifies the viewport for the scissor rectangle, that is, the final scissor rect is + // offset by the viewport's left-top and clipped to the viewport's width/height. + RenderPassBuilder& scissorViewport(backend::Viewport const viewport) noexcept { + mScissorViewport = viewport; + return *this; + } - // Variant to use - Variant mVariant{}; + // specifies the geometry to generate commands for + RenderPassBuilder& geometry( + FScene::RenderableSoa const& soa, utils::Range const vr) noexcept { + mRenderableSoa = &soa; + mVisibleRenderables = vr; + return *this; + } - // Additional visibility mask - FScene::VisibleMaskType mVisibilityMask = std::numeric_limits::max(); + // Specifies camera information (e.g. used for sorting commands) + RenderPassBuilder& camera(const CameraInfo& camera) noexcept { + mCameraPosition = camera.getPosition(); + mCameraForwardVector = camera.getForwardVector(); + return *this; + } - backend::Viewport mScissorViewport{ 0, 0, - std::numeric_limits::max(), - std::numeric_limits::max() }; + // flags controlling how commands are generated + RenderPassBuilder& renderFlags(RenderPass::RenderFlags const flags) noexcept { + mFlags = flags; + return *this; + } - // a vector for our custom commands - using CustomCommandVector = std::vector>; - mutable CustomCommandVector mCustomCommands; + // like above but allows to set specific flags + RenderPassBuilder& renderFlags( + RenderPass::RenderFlags const mask, RenderPass::RenderFlags value) noexcept { + value &= mask; + mFlags &= ~mask; + mFlags |= value; + return *this; + } + + // variant to use + RenderPassBuilder& variant(Variant const variant) noexcept { + mVariant = variant; + return *this; + } + + // variant to use + RenderPassBuilder& colorPassDescriptorSet(ColorPassDescriptorSet const* colorPassDescriptorSet) noexcept { + mColorPassDescriptorSet = colorPassDescriptorSet; + return *this; + } + + // Sets the visibility mask, which is AND-ed against each Renderable's VISIBLE_MASK to + // determine if the renderable is visible for this pass. + // Defaults to all 1's, which means all renderables in this render pass will be rendered. + RenderPassBuilder& visibilityMask(FScene::VisibleMaskType const mask) noexcept { + mVisibilityMask = mask; + return *this; + } + + RenderPassBuilder& customCommand( + uint8_t channel, + RenderPass::Pass pass, + RenderPass::CustomCommand custom, + uint32_t order, + const RenderPass::Executor::CustomCommandFn& command); + + RenderPass build(FEngine const& engine, backend::DriverApi& driver) const; }; + } // namespace filament +template<> struct utils::EnableBitMaskOperators + : public std::true_type {}; + #endif // TNT_FILAMENT_RENDERPASS_H diff --git a/filament/src/RenderPrimitive.cpp b/filament/src/RenderPrimitive.cpp index 88d95380b22..1ffb53d660a 100644 --- a/filament/src/RenderPrimitive.cpp +++ b/filament/src/RenderPrimitive.cpp @@ -16,17 +16,24 @@ #include "RenderPrimitive.h" -#include "details/Engine.h" +#include +#include + #include "details/IndexBuffer.h" -#include "details/Material.h" +#include "details/MaterialInstance.h" #include "details/VertexBuffer.h" +#include +#include + #include +#include + namespace filament { void FRenderPrimitive::init(HwRenderPrimitiveFactory& factory, backend::DriverApi& driver, - const RenderableManager::Builder::Entry& entry) noexcept { + FRenderableManager::Entry const& entry) noexcept { assert_invariant(entry.materialInstance); @@ -34,19 +41,9 @@ void FRenderPrimitive::init(HwRenderPrimitiveFactory& factory, backend::DriverAp mBlendOrder = entry.blendOrder; if (entry.indices && entry.vertices) { - FVertexBuffer* vertexBuffer = downcast(entry.vertices); - FIndexBuffer* indexBuffer = downcast(entry.indices); - - AttributeBitset enabledAttributes = vertexBuffer->getDeclaredAttributes(); - - auto const& ebh = vertexBuffer->getHwHandle(); - auto const& ibh = indexBuffer->getHwHandle(); - - mHandle = factory.create(driver, ebh, ibh, entry.type, (uint32_t)entry.offset, - (uint32_t)entry.minIndex, (uint32_t)entry.maxIndex, (uint32_t)entry.count); - - mPrimitiveType = entry.type; - mEnabledAttributes = enabledAttributes; + FVertexBuffer const* vertexBuffer = downcast(entry.vertices); + FIndexBuffer const* indexBuffer = downcast(entry.indices); + set(factory, driver, entry.type, vertexBuffer, indexBuffer, entry.offset, entry.count); } } @@ -57,23 +54,24 @@ void FRenderPrimitive::terminate(HwRenderPrimitiveFactory& factory, backend::Dri } void FRenderPrimitive::set(HwRenderPrimitiveFactory& factory, backend::DriverApi& driver, - RenderableManager::PrimitiveType type, - FVertexBuffer* vertices, FIndexBuffer* indices, size_t offset, - size_t minIndex, size_t maxIndex, size_t count) noexcept { - - AttributeBitset enabledAttributes = vertices->getDeclaredAttributes(); - - auto const& ebh = vertices->getHwHandle(); - auto const& ibh = indices->getHwHandle(); - + RenderableManager::PrimitiveType const type, + FVertexBuffer const* vertexBuffer, FIndexBuffer const* indexBuffer, + size_t const offset, size_t const count) noexcept { if (mHandle) { factory.destroy(driver, mHandle); } - mHandle = factory.create(driver, ebh, ibh, type, - (uint32_t)offset, (uint32_t)minIndex, (uint32_t)maxIndex, (uint32_t)count); + AttributeBitset const enabledAttributes = vertexBuffer->getDeclaredAttributes(); + + auto const& ebh = vertexBuffer->getHwHandle(); + auto const& ibh = indexBuffer->getHwHandle(); + + mHandle = factory.create(driver, ebh, ibh, type); + mVertexBufferInfoHandle = vertexBuffer->getVertexBufferInfoHandle(); mPrimitiveType = type; + mIndexOffset = offset; + mIndexCount = count; mEnabledAttributes = enabledAttributes; } diff --git a/filament/src/RenderPrimitive.h b/filament/src/RenderPrimitive.h index 7e77c13cb15..5c6eb5fef94 100644 --- a/filament/src/RenderPrimitive.h +++ b/filament/src/RenderPrimitive.h @@ -17,13 +17,16 @@ #ifndef TNT_FILAMENT_DETAILS_RENDERPRIMITIVE_H #define TNT_FILAMENT_DETAILS_RENDERPRIMITIVE_H +#include + #include "components/RenderableManager.h" #include "details/MaterialInstance.h" +#include #include -#include +#include namespace filament { @@ -38,18 +41,23 @@ class FRenderPrimitive { FRenderPrimitive() noexcept = default; void init(HwRenderPrimitiveFactory& factory, backend::DriverApi& driver, - const RenderableManager::Builder::Entry& entry) noexcept; + FRenderableManager::Entry const& entry) noexcept; void set(HwRenderPrimitiveFactory& factory, backend::DriverApi& driver, RenderableManager::PrimitiveType type, - FVertexBuffer* vertices, FIndexBuffer* indices, size_t offset, - size_t minIndex, size_t maxIndex, size_t count) noexcept; + FVertexBuffer const* vertexBuffer, FIndexBuffer const* indexBuffer, size_t offset, + size_t count) noexcept; // frees driver resources, object becomes invalid void terminate(HwRenderPrimitiveFactory& factory, backend::DriverApi& driver); const FMaterialInstance* getMaterialInstance() const noexcept { return mMaterialInstance; } - backend::Handle getHwHandle() const noexcept { return mHandle; } + backend::RenderPrimitiveHandle getHwHandle() const noexcept { return mHandle; } + backend::VertexBufferInfoHandle getVertexBufferInfoHandle() const { return mVertexBufferInfoHandle; } + uint32_t getIndexOffset() const noexcept { return mIndexOffset; } + uint32_t getIndexCount() const noexcept { return mIndexCount; } + uint32_t getMorphingBufferOffset() const noexcept { return mMorphingBufferOffset; } + backend::PrimitiveType getPrimitiveType() const noexcept { return mPrimitiveType; } AttributeBitset getEnabledAttributes() const noexcept { return mEnabledAttributes; } uint16_t getBlendOrder() const noexcept { return mBlendOrder; } @@ -57,22 +65,33 @@ class FRenderPrimitive { void setMaterialInstance(FMaterialInstance const* mi) noexcept { mMaterialInstance = mi; } - void setBlendOrder(uint16_t order) noexcept { + void setBlendOrder(uint16_t const order) noexcept { mBlendOrder = static_cast(order & 0x7FFF); } - void setGlobalBlendOrderEnabled(bool enabled) noexcept { + void setGlobalBlendOrderEnabled(bool const enabled) noexcept { mGlobalBlendOrderEnabled = enabled; } + void setMorphingBufferOffset(uint32_t const offset) noexcept { + mMorphingBufferOffset = offset; + } + private: - FMaterialInstance const* mMaterialInstance = nullptr; - backend::Handle mHandle = {}; + // These first fields are dereferences from PrimitiveInfo, keep them together + struct { + FMaterialInstance const* mMaterialInstance = nullptr; + backend::Handle mHandle = {}; + backend::Handle mVertexBufferInfoHandle = {}; + uint32_t mIndexOffset = 0; + uint32_t mIndexCount = 0; + uint32_t mMorphingBufferOffset = 0; + }; + AttributeBitset mEnabledAttributes = {}; uint16_t mBlendOrder = 0; bool mGlobalBlendOrderEnabled = false; backend::PrimitiveType mPrimitiveType = backend::PrimitiveType::TRIANGLES; - UTILS_UNUSED uint8_t reserved[4] = {}; }; } // namespace filament diff --git a/filament/src/RenderTarget.cpp b/filament/src/RenderTarget.cpp index a17818bcbab..50d67824c09 100644 --- a/filament/src/RenderTarget.cpp +++ b/filament/src/RenderTarget.cpp @@ -22,19 +22,19 @@ namespace filament { using namespace backend; -Texture* RenderTarget::getTexture(AttachmentPoint attachment) const noexcept { +Texture* RenderTarget::getTexture(AttachmentPoint const attachment) const noexcept { return downcast(this)->getAttachment(attachment).texture; } -uint8_t RenderTarget::getMipLevel(AttachmentPoint attachment) const noexcept { +uint8_t RenderTarget::getMipLevel(AttachmentPoint const attachment) const noexcept { return downcast(this)->getAttachment(attachment).mipLevel; } -RenderTarget::CubemapFace RenderTarget::getFace(AttachmentPoint attachment) const noexcept { +RenderTarget::CubemapFace RenderTarget::getFace(AttachmentPoint const attachment) const noexcept { return downcast(this)->getAttachment(attachment).face; } -uint32_t RenderTarget::getLayer(AttachmentPoint attachment) const noexcept { +uint32_t RenderTarget::getLayer(AttachmentPoint const attachment) const noexcept { return downcast(this)->getAttachment(attachment).layer; } diff --git a/filament/src/RenderableManager.cpp b/filament/src/RenderableManager.cpp index 6b6e9637adc..8a8f10f6d6d 100644 --- a/filament/src/RenderableManager.cpp +++ b/filament/src/RenderableManager.cpp @@ -27,138 +27,169 @@ namespace filament { using namespace backend; using namespace math; -bool RenderableManager::hasComponent(utils::Entity e) const noexcept { +bool RenderableManager::hasComponent(Entity const e) const noexcept { return downcast(this)->hasComponent(e); } +size_t RenderableManager::getComponentCount() const noexcept { + return downcast(this)->getComponentCount(); +} + +bool RenderableManager::empty() const noexcept { + return downcast(this)->empty(); +} + +Entity RenderableManager::getEntity(Instance const i) const noexcept { + return downcast(this)->getEntity(i); +} + +Entity const* RenderableManager::getEntities() const noexcept { + return downcast(this)->getEntities(); +} + RenderableManager::Instance -RenderableManager::getInstance(utils::Entity e) const noexcept { +RenderableManager::getInstance(Entity const e) const noexcept { return downcast(this)->getInstance(e); } -void RenderableManager::destroy(utils::Entity e) noexcept { +void RenderableManager::destroy(Entity const e) noexcept { return downcast(this)->destroy(e); } -void RenderableManager::setAxisAlignedBoundingBox(Instance instance, const Box& aabb) noexcept { +void RenderableManager::setAxisAlignedBoundingBox(Instance const instance, const Box& aabb) { downcast(this)->setAxisAlignedBoundingBox(instance, aabb); } -void RenderableManager::setLayerMask(Instance instance, uint8_t select, uint8_t values) noexcept { +void RenderableManager::setLayerMask(Instance const instance, uint8_t const select, uint8_t const values) noexcept { downcast(this)->setLayerMask(instance, select, values); } -void RenderableManager::setPriority(Instance instance, uint8_t priority) noexcept { +void RenderableManager::setPriority(Instance const instance, uint8_t const priority) noexcept { downcast(this)->setPriority(instance, priority); } -void RenderableManager::setCulling(Instance instance, bool enable) noexcept { +void RenderableManager::setChannel(Instance const instance, uint8_t const channel) noexcept{ + downcast(this)->setChannel(instance, channel); +} + +void RenderableManager::setCulling(Instance const instance, bool const enable) noexcept { downcast(this)->setCulling(instance, enable); } -void RenderableManager::setCastShadows(Instance instance, bool enable) noexcept { +void RenderableManager::setCastShadows(Instance const instance, bool const enable) noexcept { downcast(this)->setCastShadows(instance, enable); } -void RenderableManager::setReceiveShadows(Instance instance, bool enable) noexcept { +void RenderableManager::setReceiveShadows(Instance const instance, bool const enable) noexcept { downcast(this)->setReceiveShadows(instance, enable); } -void RenderableManager::setScreenSpaceContactShadows(Instance instance, bool enable) noexcept { +void RenderableManager::setScreenSpaceContactShadows(Instance const instance, bool const enable) noexcept { downcast(this)->setScreenSpaceContactShadows(instance, enable); } -bool RenderableManager::isShadowCaster(Instance instance) const noexcept { +bool RenderableManager::isShadowCaster(Instance const instance) const noexcept { return downcast(this)->isShadowCaster(instance); } -bool RenderableManager::isShadowReceiver(Instance instance) const noexcept { +bool RenderableManager::isShadowReceiver(Instance const instance) const noexcept { return downcast(this)->isShadowReceiver(instance); } -const Box& RenderableManager::getAxisAlignedBoundingBox(Instance instance) const noexcept { +const Box& RenderableManager::getAxisAlignedBoundingBox(Instance const instance) const noexcept { return downcast(this)->getAxisAlignedBoundingBox(instance); } -uint8_t RenderableManager::getLayerMask(Instance instance) const noexcept { +uint8_t RenderableManager::getLayerMask(Instance const instance) const noexcept { return downcast(this)->getLayerMask(instance); } -size_t RenderableManager::getPrimitiveCount(Instance instance) const noexcept { +size_t RenderableManager::getPrimitiveCount(Instance const instance) const noexcept { return downcast(this)->getPrimitiveCount(instance, 0); } -void RenderableManager::setMaterialInstanceAt(Instance instance, - size_t primitiveIndex, MaterialInstance const* materialInstance) { +void RenderableManager::setMaterialInstanceAt(Instance const instance, + size_t const primitiveIndex, MaterialInstance const* materialInstance) { downcast(this)->setMaterialInstanceAt(instance, 0, primitiveIndex, downcast(materialInstance)); } +void RenderableManager::clearMaterialInstanceAt(Instance instance, size_t primitiveIndex) { + downcast(this)->clearMaterialInstanceAt(instance, 0, primitiveIndex); +} + MaterialInstance* RenderableManager::getMaterialInstanceAt( - Instance instance, size_t primitiveIndex) const noexcept { + Instance const instance, size_t const primitiveIndex) const noexcept { return downcast(this)->getMaterialInstanceAt(instance, 0, primitiveIndex); } -void RenderableManager::setBlendOrderAt(Instance instance, size_t primitiveIndex, uint16_t order) noexcept { +void RenderableManager::setBlendOrderAt(Instance const instance, size_t const primitiveIndex, uint16_t const order) noexcept { downcast(this)->setBlendOrderAt(instance, 0, primitiveIndex, order); } -void RenderableManager::setGlobalBlendOrderEnabledAt(RenderableManager::Instance instance, - size_t primitiveIndex, bool enabled) noexcept { +void RenderableManager::setGlobalBlendOrderEnabledAt(Instance const instance, + size_t const primitiveIndex, bool const enabled) noexcept { downcast(this)->setGlobalBlendOrderEnabledAt(instance, 0, primitiveIndex, enabled); } -AttributeBitset RenderableManager::getEnabledAttributesAt(Instance instance, size_t primitiveIndex) const noexcept { +AttributeBitset RenderableManager::getEnabledAttributesAt(Instance const instance, size_t const primitiveIndex) const noexcept { return downcast(this)->getEnabledAttributesAt(instance, 0, primitiveIndex); } -void RenderableManager::setGeometryAt(Instance instance, size_t primitiveIndex, - PrimitiveType type, VertexBuffer* vertices, IndexBuffer* indices, - size_t offset, size_t count) noexcept { +void RenderableManager::setGeometryAt(Instance const instance, size_t const primitiveIndex, + PrimitiveType const type, VertexBuffer* vertices, IndexBuffer* indices, + size_t const offset, size_t const count) noexcept { downcast(this)->setGeometryAt(instance, 0, primitiveIndex, type, downcast(vertices), downcast(indices), offset, count); } -void RenderableManager::setBones(Instance instance, - RenderableManager::Bone const* transforms, size_t boneCount, size_t offset) { +void RenderableManager::setBones(Instance const instance, + Bone const* transforms, size_t const boneCount, size_t const offset) { downcast(this)->setBones(instance, transforms, boneCount, offset); } -void RenderableManager::setBones(Instance instance, - mat4f const* transforms, size_t boneCount, size_t offset) { +void RenderableManager::setBones(Instance const instance, + mat4f const* transforms, size_t const boneCount, size_t const offset) { downcast(this)->setBones(instance, transforms, boneCount, offset); } -void RenderableManager::setSkinningBuffer(Instance instance, - SkinningBuffer* skinningBuffer, size_t count, size_t offset) { +void RenderableManager::setSkinningBuffer(Instance const instance, + SkinningBuffer* skinningBuffer, size_t const count, size_t const offset) { downcast(this)->setSkinningBuffer(instance, downcast(skinningBuffer), count, offset); } -void RenderableManager::setMorphWeights(Instance instance, float const* weights, - size_t count, size_t offset) { +void RenderableManager::setMorphWeights(Instance const instance, float const* weights, + size_t const count, size_t const offset) { downcast(this)->setMorphWeights(instance, weights, count, offset); } -void RenderableManager::setMorphTargetBufferAt(Instance instance, uint8_t level, size_t primitiveIndex, - MorphTargetBuffer* morphTargetBuffer, size_t offset, size_t count) { - downcast(this)->setMorphTargetBufferAt(instance, level, primitiveIndex, - downcast(morphTargetBuffer), offset, count); +void RenderableManager::setMorphTargetBufferOffsetAt(Instance const instance, uint8_t const level, + size_t const primitiveIndex, + size_t const offset) { + downcast(this)->setMorphTargetBufferOffsetAt(instance, level, primitiveIndex, offset); } -MorphTargetBuffer* RenderableManager::getMorphTargetBufferAt(Instance instance, uint8_t level, - size_t primitiveIndex) const noexcept { - return downcast(this)->getMorphTargetBufferAt(instance, level, primitiveIndex); +MorphTargetBuffer* RenderableManager::getMorphTargetBuffer(Instance const instance) const noexcept { + return downcast(this)->getMorphTargetBuffer(instance); } -size_t RenderableManager::getMorphTargetCount(Instance instance) const noexcept { +size_t RenderableManager::getMorphTargetCount(Instance const instance) const noexcept { return downcast(this)->getMorphTargetCount(instance); } -void RenderableManager::setLightChannel(Instance instance, unsigned int channel, bool enable) noexcept { +void RenderableManager::setLightChannel(Instance const instance, unsigned int const channel, bool const enable) noexcept { downcast(this)->setLightChannel(instance, channel, enable); } -bool RenderableManager::getLightChannel(Instance instance, unsigned int channel) const noexcept { +bool RenderableManager::getLightChannel(Instance const instance, unsigned int const channel) const noexcept { return downcast(this)->getLightChannel(instance, channel); } +void RenderableManager::setFogEnabled(Instance const instance, bool const enable) noexcept { + downcast(this)->setFogEnabled(instance, enable); +} + +bool RenderableManager::getFogEnabled(Instance const instance) const noexcept { + return downcast(this)->getFogEnabled(instance); +} + } // namespace filament diff --git a/filament/src/Renderer.cpp b/filament/src/Renderer.cpp index 8df2351dcde..836e4255beb 100644 --- a/filament/src/Renderer.cpp +++ b/filament/src/Renderer.cpp @@ -14,11 +14,21 @@ * limitations under the License. */ -#include "details/Renderer.h" +#include + +#include "ResourceAllocator.h" #include "details/Engine.h" +#include "details/Renderer.h" #include "details/View.h" +#include + +#include + +#include +#include + namespace filament { using namespace math; @@ -32,26 +42,30 @@ void Renderer::render(View const* view) { downcast(this)->render(downcast(view)); } -void Renderer::setPresentationTime(int64_t monotonic_clock_ns) { +void Renderer::setPresentationTime(int64_t const monotonic_clock_ns) { downcast(this)->setPresentationTime(monotonic_clock_ns); } -bool Renderer::beginFrame(SwapChain* swapChain, uint64_t vsyncSteadyClockTimeNano) { +void Renderer::skipFrame(uint64_t const vsyncSteadyClockTimeNano) { + downcast(this)->skipFrame(vsyncSteadyClockTimeNano); +} + +bool Renderer::beginFrame(SwapChain* swapChain, uint64_t const vsyncSteadyClockTimeNano) { return downcast(this)->beginFrame(downcast(swapChain), vsyncSteadyClockTimeNano); } void Renderer::copyFrame(SwapChain* dstSwapChain, filament::Viewport const& dstViewport, - filament::Viewport const& srcViewport, CopyFrameFlag flags) { + filament::Viewport const& srcViewport, CopyFrameFlag const flags) { downcast(this)->copyFrame(downcast(dstSwapChain), dstViewport, srcViewport, flags); } -void Renderer::readPixels(uint32_t xoffset, uint32_t yoffset, uint32_t width, uint32_t height, +void Renderer::readPixels(uint32_t const xoffset, uint32_t const yoffset, uint32_t const width, uint32_t const height, PixelBufferDescriptor&& buffer) { downcast(this)->readPixels(xoffset, yoffset, width, height, std::move(buffer)); } void Renderer::readPixels(RenderTarget* renderTarget, - uint32_t xoffset, uint32_t yoffset, uint32_t width, uint32_t height, + uint32_t const xoffset, uint32_t const yoffset, uint32_t const width, uint32_t const height, PixelBufferDescriptor&& buffer) { downcast(this)->readPixels(downcast(renderTarget), xoffset, yoffset, width, height, std::move(buffer)); @@ -81,8 +95,24 @@ void Renderer::setClearOptions(const ClearOptions& options) { downcast(this)->setClearOptions(options); } +Renderer::ClearOptions const& Renderer::getClearOptions() const noexcept { + return downcast(this)->getClearOptions(); +} + void Renderer::renderStandaloneView(View const* view) { downcast(this)->renderStandaloneView(downcast(view)); } +void Renderer::setVsyncTime(uint64_t const steadyClockTimeNano) noexcept { + downcast(this)->setVsyncTime(steadyClockTimeNano); +} + +utils::FixedCapacityVector Renderer::getFrameInfoHistory(size_t const historySize) const noexcept { + return downcast(this)->getFrameInfoHistory(historySize); +} + +size_t Renderer::getMaxFrameHistorySize() const noexcept { + return downcast(this)->getMaxFrameHistorySize(); +} + } // namespace filament diff --git a/filament/src/RendererUtils.cpp b/filament/src/RendererUtils.cpp index 8771376672e..4d6b6b6898d 100644 --- a/filament/src/RendererUtils.cpp +++ b/filament/src/RendererUtils.cpp @@ -16,27 +16,47 @@ #include "RendererUtils.h" +#include "PostProcessManager.h" + #include "details/Engine.h" #include "details/View.h" #include "fg/FrameGraph.h" #include "fg/FrameGraphId.h" #include "fg/FrameGraphResources.h" +#include "fg/FrameGraphTexture.h" + +#include +#include +#include + +#include +#include +#include +#include #include #include #include +#include +#include +#include + +#include +#include + namespace filament { using namespace backend; using namespace math; -FrameGraphId RendererUtils::colorPass( +RendererUtils::ColorPassOutput RendererUtils::colorPass( FrameGraph& fg, const char* name, FEngine& engine, FView const& view, + ColorPassInput const& colorPassInput, FrameGraphTexture::Descriptor const& colorBufferDesc, - ColorPassConfig const& config, PostProcessManager::ColorGradingConfig colorGradingConfig, - RenderPass::Executor const& passExecutor) noexcept { + ColorPassConfig const& config, PostProcessManager::ColorGradingConfig const colorGradingConfig, + RenderPass::Executor passExecutor) noexcept { struct ColorPassData { FrameGraphId shadows; @@ -49,8 +69,6 @@ FrameGraphId RendererUtils::colorPass( FrameGraphId structure; }; - Blackboard& blackboard = fg.getBlackboard(); - auto& colorPass = fg.addPass(name, [&](FrameGraph::Builder& builder, ColorPassData& data) { @@ -58,21 +76,21 @@ FrameGraphId RendererUtils::colorPass( TargetBufferFlags clearDepthFlags = config.clearFlags & TargetBufferFlags::DEPTH; TargetBufferFlags clearStencilFlags = config.clearFlags & TargetBufferFlags::STENCIL; - data.shadows = blackboard.get("shadows"); - data.ssao = blackboard.get("ssao"); - data.color = blackboard.get("color"); - data.depth = blackboard.get("depth"); + data.color = colorPassInput.linearColor; + data.depth = colorPassInput.depth; + data.shadows = colorPassInput.shadows; + data.ssao = colorPassInput.ssao; // Screen-space reflection or refractions if (config.hasScreenSpaceReflectionsOrRefractions) { - data.ssr = blackboard.get("ssr"); + data.ssr = colorPassInput.ssr; if (data.ssr) { data.ssr = builder.sample(data.ssr); } } if (config.hasContactShadows) { - data.structure = blackboard.get("structure"); + data.structure = colorPassInput.structure; assert_invariant(data.structure); data.structure = builder.sample(data.structure); } @@ -89,7 +107,7 @@ FrameGraphId RendererUtils::colorPass( data.color = builder.createTexture("Color Buffer", colorBufferDesc); } - const bool canResolveDepth = engine.getDriverApi().isAutoDepthResolveSupported(); + const bool canAutoResolveDepth = engine.getDriverApi().isAutoDepthResolveSupported(); if (!data.depth) { // clear newly allocated depth/stencil buffers, regardless of given clear flags @@ -98,18 +116,35 @@ FrameGraphId RendererUtils::colorPass( TargetBufferFlags::STENCIL : TargetBufferFlags::NONE; const char* const name = config.enabledStencilBuffer ? "Depth/Stencil Buffer" : "Depth Buffer"; + + bool const isES2 = + engine.getDriverApi().getFeatureLevel() == FeatureLevel::FEATURE_LEVEL_0; + + TextureFormat const stencilFormat = isES2 ? + TextureFormat::DEPTH24_STENCIL8 : TextureFormat::DEPTH32F_STENCIL8; + + TextureFormat const depthOnlyFormat = isES2 ? + TextureFormat::DEPTH24 : TextureFormat::DEPTH32F; + TextureFormat const format = config.enabledStencilBuffer ? - TextureFormat::DEPTH32F_STENCIL8 : TextureFormat::DEPTH32F; + stencilFormat : depthOnlyFormat; + data.depth = builder.createTexture(name, { .width = colorBufferDesc.width, .height = colorBufferDesc.height, - // If the color attachment requested MS, we assume this means the MS buffer - // must be kept, and for that reason we allocate the depth buffer with MS - // as well. On the other hand, if the color attachment was allocated without - // MS, no need to allocate the depth buffer with MS, if the RT is MS, - // the tile depth buffer will be MS, but it'll be resolved to single - // sample automatically -- which is what we want. - .samples = canResolveDepth ? colorBufferDesc.samples : uint8_t(config.msaa), + // If the color attachment requested MS, we assume this means the MS + // buffer must be kept, and for that reason we allocate the depth + // buffer with MS as well. + // On the other hand, if the color attachment was allocated without + // MS, no need to allocate the depth buffer with MS; Either it's not + // multi-sampled or it is auto-resolved. + // One complication above is that some backends don't support + // depth auto-resolve, in which case we must allocate the depth + // buffer with MS and manually resolve it (see "Resolved Depth Buffer" + // pass). + .depth = colorBufferDesc.depth, + .samples = canAutoResolveDepth ? colorBufferDesc.samples : uint8_t(config.msaa), + .type = colorBufferDesc.type, .format = format, }); if (config.enabledStencilBuffer) { @@ -118,6 +153,8 @@ FrameGraphId RendererUtils::colorPass( } if (colorGradingConfig.asSubpass) { + assert_invariant(config.msaa <= 1); + assert_invariant(colorBufferDesc.samples <= 1); data.output = builder.createTexture("Tonemapped Buffer", { .width = colorBufferDesc.width, .height = colorBufferDesc.height, @@ -157,10 +194,10 @@ FrameGraphId RendererUtils::colorPass( .stencil = data.stencil }, .clearColor = config.clearColor, .samples = config.msaa, - .clearFlags = clearColorFlags | clearDepthFlags | clearStencilFlags }); - blackboard["depth"] = data.depth; + .layerCount = static_cast(colorBufferDesc.depth), + .clearFlags = clearColorFlags | clearDepthFlags | clearStencilFlags}); }, - [=, &view, &engine](FrameGraphResources const& resources, + [=, passExecutor = std::move(passExecutor), &view, &engine](FrameGraphResources const& resources, ColorPassData const& data, DriverApi& driver) { auto out = resources.getRenderPassInfo(); @@ -182,8 +219,8 @@ FrameGraphId RendererUtils::colorPass( TextureHandle const ssr = data.ssr ? resources.getTexture(data.ssr) : engine.getOneTextureArray(); - view.prepareSSR(ssr, config.ssrLodOffset, - view.getScreenSpaceReflectionsOptions()); + view.prepareSSR(ssr, config.screenSpaceReflectionHistoryNotReady, + config.ssrLodOffset, view.getScreenSpaceReflectionsOptions()); // Note: here we can't use data.color's descriptor for the viewport because // the actual viewport might be offset when the target is the swapchain. @@ -196,7 +233,7 @@ FrameGraphId RendererUtils::colorPass( view.prepareViewport(static_cast(out.params.viewport), config.logicalViewport); - view.commitUniforms(driver); + view.commitUniformsAndSamplers(driver); // TODO: this should be a parameter of FrameGraphRenderPass::Descriptor out.params.clearStencil = config.clearStencil; @@ -213,12 +250,8 @@ FrameGraphId RendererUtils::colorPass( out.params.subpassMask = 1; } - // this is a good time to flush the CommandStream, because we're about to potentially - // output a lot of commands. This guarantees here that we have at least - // FILAMENT_MIN_COMMAND_BUFFERS_SIZE_IN_MB bytes (1MiB by default). - engine.flush(); driver.beginRenderPass(out.target, out.params); - passExecutor.execute(engine, resources.getPassName()); + passExecutor.execute(engine, driver); driver.endRenderPass(); // color pass is typically heavy, and we don't have much CPU work left after @@ -228,28 +261,28 @@ FrameGraphId RendererUtils::colorPass( } ); - // when color grading is done as a subpass, the output of the color-pass is the ldr buffer - auto output = colorGradingConfig.asSubpass ? colorPass->output : colorPass->color; - - blackboard["color"] = output; - return output; + return { + .linearColor = colorPass->color, + .tonemappedColor = colorPass->output, // can be null + .depth = colorPass->depth + }; } -std::pair, bool> RendererUtils::refractionPass( +std::optional RendererUtils::refractionPass( FrameGraph& fg, FEngine& engine, FView const& view, + ColorPassInput colorPassInput, ColorPassConfig config, PostProcessManager::ScreenSpaceRefConfig const& ssrConfig, - PostProcessManager::ColorGradingConfig colorGradingConfig, + PostProcessManager::ColorGradingConfig const colorGradingConfig, RenderPass const& pass) noexcept { - auto& blackboard = fg.getBlackboard(); - auto input = blackboard.get("color"); - FrameGraphId output; - - // find the first refractive object + // find the first refractive object in channel 2 RenderPass::Command const* const refraction = std::partition_point(pass.begin(), pass.end(), [](auto const& command) { - return (command.key & RenderPass::PASS_MASK) < uint64_t(RenderPass::Pass::REFRACT); + constexpr uint64_t mask = RenderPass::CHANNEL_MASK | RenderPass::PASS_MASK; + constexpr uint64_t channel = uint64_t(RenderableManager::Builder::DEFAULT_CHANNEL) << RenderPass::CHANNEL_SHIFT; + constexpr uint64_t value = channel | uint64_t(RenderPass::Pass::REFRACT); + return (command.key & mask) < value; }); const bool hasScreenSpaceRefraction = @@ -257,34 +290,39 @@ std::pair, bool> RendererUtils::refractionPass( // if there wasn't any refractive object, just skip everything below. if (UTILS_UNLIKELY(hasScreenSpaceRefraction)) { - PostProcessManager& ppm = engine.getPostProcessManager(); - - // clear the color/depth buffers, which will orphan (and cull) the color pass - input.clear(); - blackboard.remove("color"); - blackboard.remove("depth"); - + assert_invariant(!colorPassInput.linearColor); + assert_invariant(!colorPassInput.depth); config.hasScreenSpaceReflectionsOrRefractions = true; - input = RendererUtils::colorPass(fg, "Color Pass (opaque)", engine, view, { + PostProcessManager& ppm = engine.getPostProcessManager(); + auto const opaquePassOutput = colorPass(fg, + "Color Pass (opaque)", engine, view, colorPassInput, { // When rendering the opaques, we need to conserve the sample buffer, - // so create config that specifies the sample count. + // so create a config that specifies the sample count. .width = config.physicalViewport.width, .height = config.physicalViewport.height, .samples = config.msaa, .format = config.hdrFormat - }, config, { .asSubpass = false }, + }, + config, { .asSubpass = false, .customResolve = false }, pass.getExecutor(pass.begin(), refraction)); - // generate the mipmap chain + + // Generate the mipmap chain + // Note: we can run some post-processing effects while the "color pass" descriptor set + // in bound because only the descriptor 0 (frame uniforms) matters, and it's + // present in both. PostProcessManager::generateMipmapSSR(ppm, fg, - input, ssrConfig.refraction, true, ssrConfig); + opaquePassOutput.linearColor, + ssrConfig.refraction, + true, ssrConfig); // Now we're doing the refraction pass proper. - // This uses the same framebuffer (color and depth) used by the opaque pass. This happens - // automatically because these are set in the Blackboard (they were set by the opaque - // pass). For this reason, `desc` below is only used in colorPass() for the width and - // height. + // This uses the same framebuffer (color and depth) used by the opaque pass. + // For this reason, the `colorBufferDesc` parameter of colorPass() below is only used for + // the width and height. + colorPassInput.linearColor = opaquePassOutput.linearColor; + colorPassInput.depth = opaquePassOutput.depth; // Since we're reusing the existing target we don't want to clear any of its buffer. // Important: if this target ended up being an imported target, then the clearFlags @@ -292,36 +330,37 @@ std::pair, bool> RendererUtils::refractionPass( // and we'd end up clearing the opaque pass. This scenario never happens because it is // prevented in Renderer.cpp's final blit. config.clearFlags = TargetBufferFlags::NONE; - output = RendererUtils::colorPass(fg, "Color Pass (transparent)", engine, view, { + auto transparentPassOutput = colorPass(fg, "Color Pass (transparent)", + engine, view, colorPassInput, { .width = config.physicalViewport.width, .height = config.physicalViewport.height }, - config, colorGradingConfig, pass.getExecutor(refraction, pass.end())); + config, colorGradingConfig, + pass.getExecutor(refraction, pass.end())); if (config.msaa > 1 && !colorGradingConfig.asSubpass) { - // We need to do a resolve here because later passes (such as color grading or DoF) will need - // to sample from 'output'. However, because we have MSAA, we know we're not sampleable. - // And this is because in the SSR case, we had to use a renderbuffer to conserve the - // multi-sample buffer. - output = ppm.resolveBaseLevel(fg, "Resolved Color Buffer", output); + // We need to do a resolve here because later passes (such as color grading or DoF) will + // need to sample from 'output'. However, because we have MSAA, we know we're not + // sampleable. And this is because in the SSR case, we had to use a renderbuffer to + // conserve the multi-sample buffer. + transparentPassOutput.linearColor = ppm.resolve(fg, "Resolved Color Buffer", + transparentPassOutput.linearColor, { .levels = 1 }); } - } else { - output = input; + return transparentPassOutput; } - return { output, hasScreenSpaceRefraction }; + + return std::nullopt; } UTILS_NOINLINE -void RendererUtils::readPixels(backend::DriverApi& driver, Handle renderTargetHandle, - uint32_t xoffset, uint32_t yoffset, uint32_t width, uint32_t height, - backend::PixelBufferDescriptor&& buffer) { - ASSERT_PRECONDITION( - buffer.type != PixelDataType::COMPRESSED, - "buffer.format cannot be COMPRESSED"); - - ASSERT_PRECONDITION( - buffer.alignment > 0 && buffer.alignment <= 8 && - !(buffer.alignment & (buffer.alignment - 1u)), - "buffer.alignment must be 1, 2, 4 or 8"); +void RendererUtils::readPixels(DriverApi& driver, Handle renderTargetHandle, + uint32_t const xoffset, uint32_t const yoffset, uint32_t const width, uint32_t const height, + PixelBufferDescriptor&& buffer) { + FILAMENT_CHECK_PRECONDITION(buffer.type != PixelDataType::COMPRESSED) + << "buffer.format cannot be COMPRESSED"; + + FILAMENT_CHECK_PRECONDITION(buffer.alignment > 0 && buffer.alignment <= 8 && + !(buffer.alignment & (buffer.alignment - 1u))) + << "buffer.alignment must be 1, 2, 4 or 8"; // It's not really possible to know here which formats will be supported because // it can vary depending on the RenderTarget, in GL the following are ALWAYS supported though: @@ -334,8 +373,9 @@ void RendererUtils::readPixels(backend::DriverApi& driver, Handle= sizeNeeded, - "Pixel buffer too small: has %u bytes, needs %u bytes", buffer.size, sizeNeeded); + FILAMENT_CHECK_PRECONDITION(buffer.size >= sizeNeeded) + << "Pixel buffer too small: has " << buffer.size << " bytes, needs " << sizeNeeded + << " bytes"; driver.readPixels(renderTargetHandle, xoffset, yoffset, width, height, std::move(buffer)); } diff --git a/filament/src/RendererUtils.h b/filament/src/RendererUtils.h index fa2efbbd9b1..cd13721fd19 100644 --- a/filament/src/RendererUtils.h +++ b/filament/src/RendererUtils.h @@ -21,14 +21,19 @@ #include "RenderPass.h" #include "fg/FrameGraphId.h" +#include "fg/FrameGraphTexture.h" + +#include #include #include +#include #include #include +#include #include namespace filament { @@ -67,17 +72,36 @@ class RendererUtils { bool hasScreenSpaceReflectionsOrRefractions; // Use a depth format with a stencil component. bool enabledStencilBuffer; + // whether the screenspace reflections history buffer is initialized + bool screenSpaceReflectionHistoryNotReady; + }; + + struct ColorPassInput { + FrameGraphId linearColor; + FrameGraphId tonemappedColor; + FrameGraphId depth; + FrameGraphId shadows; + FrameGraphId ssao; + FrameGraphId ssr; + FrameGraphId structure; + }; + struct ColorPassOutput { + FrameGraphId linearColor; + FrameGraphId tonemappedColor; + FrameGraphId depth; }; - static FrameGraphId colorPass( + static ColorPassOutput colorPass( FrameGraph& fg, const char* name, FEngine& engine, FView const& view, + ColorPassInput const& colorPassInput, FrameGraphTexture::Descriptor const& colorBufferDesc, ColorPassConfig const& config, PostProcessManager::ColorGradingConfig colorGradingConfig, - RenderPass::Executor const& passExecutor) noexcept; + RenderPass::Executor passExecutor) noexcept; - static std::pair, bool> refractionPass( + static std::optional refractionPass( FrameGraph& fg, FEngine& engine, FView const& view, + ColorPassInput colorPassInput, ColorPassConfig config, PostProcessManager::ScreenSpaceRefConfig const& ssrConfig, PostProcessManager::ColorGradingConfig colorGradingConfig, diff --git a/filament/src/ResourceAllocator.cpp b/filament/src/ResourceAllocator.cpp index 06d21a3de3c..6abefdb347e 100644 --- a/filament/src/ResourceAllocator.cpp +++ b/filament/src/ResourceAllocator.cpp @@ -16,15 +16,33 @@ #include "ResourceAllocator.h" -#include "private/backend/DriverApi.h" +#include #include "details/Texture.h" -#include -#include +#include +#include +#include +#include + +#include "private/backend/DriverApi.h" + +#include +#include +#include #include +#include +#include +#include +#include #include +#include +#include +#include + +#include +#include using namespace utils; @@ -42,8 +60,7 @@ ResourceAllocator::AssociativeContainer::AssociativeContainer() { template UTILS_NOINLINE -ResourceAllocator::AssociativeContainer::~AssociativeContainer() noexcept { -} +ResourceAllocator::AssociativeContainer::~AssociativeContainer() noexcept = default; template UTILS_NOINLINE @@ -75,12 +92,19 @@ void ResourceAllocator::AssociativeContainer::emplace(ARGS&& ... args) } // ------------------------------------------------------------------------------------------------ + ResourceAllocatorInterface::~ResourceAllocatorInterface() = default; +// ------------------------------------------------------------------------------------------------ + +ResourceAllocatorDisposerInterface::~ResourceAllocatorDisposerInterface() = default; + +// ------------------------------------------------------------------------------------------------ + size_t ResourceAllocator::TextureKey::getSize() const noexcept { - size_t pixelCount = width * height * depth; + size_t const pixelCount = width * height * depth; size_t size = pixelCount * FTexture::getFormatSize(format); - size_t s = std::max(uint8_t(1), samples); + size_t const s = std::max(uint8_t(1), samples); if (s > 1) { // if we have MSAA, we assume N times the storage size *= s; @@ -94,17 +118,24 @@ size_t ResourceAllocator::TextureKey::getSize() const noexcept { return size; } -ResourceAllocator::ResourceAllocator(DriverApi& driverApi) noexcept - : mBackend(driverApi) { +ResourceAllocator::ResourceAllocator(Engine::Config const& config, DriverApi& driverApi) noexcept + : mCacheMaxAge(config.resourceAllocatorCacheMaxAge), + mBackend(driverApi), + mDisposer(std::make_shared(driverApi)) { +} + +ResourceAllocator::ResourceAllocator(std::shared_ptr disposer, + Engine::Config const& config, DriverApi& driverApi) noexcept + : mCacheMaxAge(config.resourceAllocatorCacheMaxAge), + mBackend(driverApi), + mDisposer(std::move(disposer)) { } ResourceAllocator::~ResourceAllocator() noexcept { - assert_invariant(!mTextureCache.size()); - assert_invariant(!mInUseTextures.size()); + assert_invariant(mTextureCache.empty()); } void ResourceAllocator::terminate() noexcept { - assert_invariant(!mInUseTextures.size()); auto& textureCache = mTextureCache; for (auto it = textureCache.begin(); it != textureCache.end();) { mBackend.destroyTexture(it->second.handle); @@ -113,35 +144,37 @@ void ResourceAllocator::terminate() noexcept { } RenderTargetHandle ResourceAllocator::createRenderTarget(const char* name, - TargetBufferFlags targetBufferFlags, uint32_t width, uint32_t height, - uint8_t samples, MRT color, TargetBufferInfo depth, - TargetBufferInfo stencil) noexcept { - return mBackend.createRenderTarget(targetBufferFlags, - width, height, samples ? samples : 1u, color, depth, stencil); + TargetBufferFlags const targetBufferFlags, uint32_t const width, uint32_t const height, + uint8_t const samples, uint8_t const layerCount, MRT const color, TargetBufferInfo const depth, + TargetBufferInfo const stencil) noexcept { + auto handle = mBackend.createRenderTarget(targetBufferFlags, + width, height, samples ? samples : 1u, layerCount, color, depth, stencil); + mBackend.setDebugTag(handle.getId(), CString{ name }); + return handle; } -void ResourceAllocator::destroyRenderTarget(RenderTargetHandle h) noexcept { +void ResourceAllocator::destroyRenderTarget(RenderTargetHandle const h) noexcept { mBackend.destroyRenderTarget(h); } -backend::TextureHandle ResourceAllocator::createTexture(const char* name, - backend::SamplerType target, uint8_t levels, backend::TextureFormat format, uint8_t samples, - uint32_t width, uint32_t height, uint32_t depth, - std::array swizzle, - backend::TextureUsage usage) noexcept { +TextureHandle ResourceAllocator::createTexture(const char* name, + SamplerType const target, uint8_t const levels, TextureFormat const format, uint8_t samples, + uint32_t const width, uint32_t const height, uint32_t const depth, + std::array const swizzle, + TextureUsage const usage) noexcept { // The frame graph descriptor uses "0" to mean "auto" but the sample count that is passed to the // backend should always be 1 or greater. samples = samples ? samples : uint8_t(1); - using TS = backend::TextureSwizzle; - constexpr const auto defaultSwizzle = std::array{ + using TS = TextureSwizzle; + constexpr const auto defaultSwizzle = std::array{ TS::CHANNEL_0, TS::CHANNEL_1, TS::CHANNEL_2, TS::CHANNEL_3}; // do we have a suitable texture in the cache? TextureHandle handle; + TextureKey const key{ name, target, levels, format, samples, width, height, depth, usage, swizzle }; if constexpr (mEnabled) { auto& textureCache = mTextureCache; - const TextureKey key{ name, target, levels, format, samples, width, height, depth, usage, swizzle }; auto it = textureCache.find(key); if (UTILS_LIKELY(it != textureCache.end())) { // we do, move the entry to the in-use list, and remove from the cache @@ -150,126 +183,178 @@ backend::TextureHandle ResourceAllocator::createTexture(const char* name, textureCache.erase(it); } else { // we don't, allocate a new texture and populate the in-use list - if (swizzle == defaultSwizzle) { - handle = mBackend.createTexture( - target, levels, format, samples, width, height, depth, usage); - } else { - handle = mBackend.createTextureSwizzled( - target, levels, format, samples, width, height, depth, usage, - swizzle[0], swizzle[1], swizzle[2], swizzle[3]); + handle = mBackend.createTexture( + target, levels, format, samples, width, height, depth, usage); + if (swizzle != defaultSwizzle) { + TextureHandle swizzledHandle = mBackend.createTextureViewSwizzle( + handle, swizzle[0], swizzle[1], swizzle[2], swizzle[3]); + mBackend.destroyTexture(handle); + handle = swizzledHandle; } } - mInUseTextures.emplace(handle, key); } else { - if (swizzle == defaultSwizzle) { - handle = mBackend.createTexture( - target, levels, format, samples, width, height, depth, usage); - } else { - handle = mBackend.createTextureSwizzled( - target, levels, format, samples, width, height, depth, usage, - swizzle[0], swizzle[1], swizzle[2], swizzle[3]); + handle = mBackend.createTexture( + target, levels, format, samples, width, height, depth, usage); + if (swizzle != defaultSwizzle) { + TextureHandle swizzledHandle = mBackend.createTextureViewSwizzle( + handle, swizzle[0], swizzle[1], swizzle[2], swizzle[3]); + mBackend.destroyTexture(handle); + handle = swizzledHandle; } } + mDisposer->checkout(handle, key); + mBackend.setDebugTag(handle.getId(), CString{ name }); return handle; } -void ResourceAllocator::destroyTexture(TextureHandle h) noexcept { +void ResourceAllocator::destroyTexture(TextureHandle const h) noexcept { + auto const key = mDisposer->checkin(h); if constexpr (mEnabled) { - // find the texture in the in-use list (it must be there!) - auto it = mInUseTextures.find(h); - assert_invariant(it != mInUseTextures.end()); - - // move it to the cache - const TextureKey key = it->second; - uint32_t size = key.getSize(); - - mTextureCache.emplace(key, TextureCachePayload{ h, mAge, size }); - mCacheSize += size; - - // remove it from the in-use list - mInUseTextures.erase(it); + if (UTILS_LIKELY(key.has_value())) { + uint32_t const size = key.value().getSize(); + mTextureCache.emplace(key.value(), TextureCachePayload{ h, mAge, size }); + mCacheSize += size; + mCacheSizeHiWaterMark = std::max(mCacheSizeHiWaterMark, mCacheSize); + } } else { mBackend.destroyTexture(h); } } -void ResourceAllocator::gc() noexcept { - // this is called regularly -- usually once per frame of each Renderer +ResourceAllocatorDisposerInterface& ResourceAllocator::getDisposer() noexcept { + return *mDisposer; +} - // increase our age - const size_t age = mAge++; +void ResourceAllocator::gc(bool const skippedFrame) noexcept { + // this is called regularly -- usually once per frame + + // increase our age at each (non-skipped) frame + const size_t age = mAge; + if (!skippedFrame) { + mAge++; + } // Purging strategy: - // - remove entries that are older than a certain age - // - remove only one entry per gc(), - // - unless we're at capacity - // - remove LRU entries until we're below capacity + // - remove all entries older than MAX_AGE_SKIPPED_FRAME when skipping a frame + // - remove entries older than mCacheMaxAgeSoft + // - remove only MAX_EVICTION_COUNT entry per gc(), + // - look for the number of unique resource ages present in the cache (this basically gives + // us how many buckets of resources we have corresponding to previous frames. + // - remove all resources that have an age older than the MAX_UNIQUE_AGE_COUNT'th bucket auto& textureCache = mTextureCache; + + // when skipping a frame, the maximum age to keep in the cache + constexpr size_t MAX_AGE_SKIPPED_FRAME = 1; + + // maximum entry count to evict per GC, under the mCacheMaxAgeSoft limit + constexpr size_t MAX_EVICTION_COUNT = 1; + + // maximum number of unique ages in the cache + constexpr size_t MAX_UNIQUE_AGE_COUNT = 3; + + bitset32 ages; + uint32_t evictedCount = 0; for (auto it = textureCache.begin(); it != textureCache.end();) { - const size_t ageDiff = age - it->second.age; - if (ageDiff >= CACHE_MAX_AGE) { + size_t const ageDiff = age - it->second.age; + if ((ageDiff >= MAX_AGE_SKIPPED_FRAME && skippedFrame) || + (ageDiff >= mCacheMaxAge && evictedCount < MAX_EVICTION_COUNT)) { + evictedCount++; it = purge(it); - if (mCacheSize < CACHE_CAPACITY) { - // if we're not at capacity, only purge a single entry per gc, trying to - // avoid a burst of work. - break; - } } else { + // build the set of ages present in the cache after eviction + ages.set(std::min(size_t(31), ageDiff)); ++it; } } - if (UTILS_UNLIKELY(mCacheSize >= CACHE_CAPACITY)) { - // make a copy of our CacheContainer to a vector - using Vector = FixedCapacityVector>; - auto cache = Vector::with_capacity(textureCache.size()); - std::copy(textureCache.begin(), textureCache.end(), std::back_insert_iterator(cache)); - - // sort by least recently used - std::sort(cache.begin(), cache.end(), [](auto const& lhs, auto const& rhs) { - return lhs.second.age < rhs.second.age; - }); - - // now remove entries until we're at capacity - auto curr = cache.begin(); - while (mCacheSize >= CACHE_CAPACITY) { - // by construction this entry must exist - purge(textureCache.find(curr->first)); - ++curr; + // if we have MAX_UNIQUE_AGE_COUNT ages or more, we evict all the resources that + // are older than the MAX_UNIQUE_AGE_COUNT'th age. + if (!skippedFrame && ages.count() >= MAX_UNIQUE_AGE_COUNT) { + uint32_t bits = ages.getValue(); + // remove from the set the ages we keep + for (size_t i = 0; i < MAX_UNIQUE_AGE_COUNT - 1; i++) { + bits &= ~(1 << ctz(bits)); } - - // Since we're sorted already, reset the oldestAge of the whole system - size_t oldestAge = cache.front().second.age; - for (auto& it : textureCache) { - it.second.age -= oldestAge; + size_t const maxAge = ctz(bits); + for (auto it = textureCache.begin(); it != textureCache.end();) { + const size_t ageDiff = age - it->second.age; + if (ageDiff >= maxAge) { + it = purge(it); + } else { + ++it; + } } - mAge -= oldestAge; } - //if (mAge % 60 == 0) dump(); } UTILS_NOINLINE -void ResourceAllocator::dump(bool brief) const noexcept { - slog.d << "# entries=" << mTextureCache.size() << ", sz=" << mCacheSize / float(1u << 20u) - << " MiB" << io::endl; +void ResourceAllocator::dump(bool const brief) const noexcept { + constexpr float MiB = 1.0f / float(1u << 20u); + slog.d << "# entries=" << mTextureCache.size() + << ", sz=" << (float)mCacheSize * MiB << " MiB" + << ", max=" << (float)mCacheSizeHiWaterMark * MiB << " MiB" + << io::endl; if (!brief) { for (auto const& it : mTextureCache) { auto w = it.first.width; auto h = it.first.height; auto f = FTexture::getFormatSize(it.first.format); slog.d << it.first.name << ": w=" << w << ", h=" << h << ", f=" << f << ", sz=" - << it.second.size / float(1u << 20u) << io::endl; + << (float)it.second.size * MiB << io::endl; } } } -ResourceAllocator::CacheContainer::iterator ResourceAllocator::purge( - ResourceAllocator::CacheContainer::iterator const& pos) { +ResourceAllocator::CacheContainer::iterator +ResourceAllocator::purge( + CacheContainer::iterator const& pos) { //slog.d << "purging " << pos->second.handle.getId() << ", age=" << pos->second.age << io::endl; mBackend.destroyTexture(pos->second.handle); mCacheSize -= pos->second.size; return mTextureCache.erase(pos); } +// ------------------------------------------------------------------------------------------------ + +ResourceAllocatorDisposer::ResourceAllocatorDisposer(DriverApi& driverApi) noexcept + : mBackend(driverApi) { +} + +ResourceAllocatorDisposer::~ResourceAllocatorDisposer() noexcept { + assert_invariant(mInUseTextures.empty()); +} + +void ResourceAllocatorDisposer::terminate() noexcept { + assert_invariant(mInUseTextures.empty()); +} + +void ResourceAllocatorDisposer::destroy(TextureHandle const handle) noexcept { + if (handle) { + auto r = checkin(handle); + if (r.has_value()) { + mBackend.destroyTexture(handle); + } + } +} + +void ResourceAllocatorDisposer::checkout(TextureHandle handle, + ResourceAllocator::TextureKey key) { + mInUseTextures.emplace(handle, key); +} + +std::optional ResourceAllocatorDisposer::checkin( + TextureHandle handle) { + // find the texture in the in-use list (it must be there!) + auto it = mInUseTextures.find(handle); + assert_invariant(it != mInUseTextures.end()); + if (it == mInUseTextures.end()) { + return std::nullopt; + } + TextureKey const key = it->second; + // remove it from the in-use list + mInUseTextures.erase(it); + return key; +} + } // namespace filament diff --git a/filament/src/ResourceAllocator.h b/filament/src/ResourceAllocator.h index d16a046c6c1..69eca3aa718 100644 --- a/filament/src/ResourceAllocator.h +++ b/filament/src/ResourceAllocator.h @@ -17,6 +17,8 @@ #ifndef TNT_FILAMENT_RESOURCEALLOCATOR_H #define TNT_FILAMENT_RESOURCEALLOCATOR_H +#include + #include #include #include @@ -26,14 +28,29 @@ #include #include +#include +#include +#include #include +#include +#include #include namespace filament { +class ResourceAllocatorDisposer; + // The only reason we use an interface here is for unit-tests, so we can mock this allocator. // This is not too time-critical, so that's okay. + +class ResourceAllocatorDisposerInterface { +public: + virtual void destroy(backend::TextureHandle handle) noexcept = 0; +protected: + virtual ~ResourceAllocatorDisposerInterface(); +}; + class ResourceAllocatorInterface { public: virtual backend::RenderTargetHandle createRenderTarget(const char* name, @@ -41,6 +58,7 @@ class ResourceAllocatorInterface { uint32_t width, uint32_t height, uint8_t samples, + uint8_t layerCount, backend::MRT color, backend::TargetBufferInfo depth, backend::TargetBufferInfo stencil) noexcept = 0; @@ -55,14 +73,20 @@ class ResourceAllocatorInterface { virtual void destroyTexture(backend::TextureHandle h) noexcept = 0; + virtual ResourceAllocatorDisposerInterface& getDisposer() noexcept = 0; + protected: virtual ~ResourceAllocatorInterface(); }; - class ResourceAllocator final : public ResourceAllocatorInterface { public: - explicit ResourceAllocator(backend::DriverApi& driverApi) noexcept; + explicit ResourceAllocator(std::shared_ptr disposer, + Engine::Config const& config, backend::DriverApi& driverApi) noexcept; + + explicit ResourceAllocator( + Engine::Config const& config, backend::DriverApi& driverApi) noexcept; + ~ResourceAllocator() noexcept override; void terminate() noexcept; @@ -72,6 +96,7 @@ class ResourceAllocator final : public ResourceAllocatorInterface { uint32_t width, uint32_t height, uint8_t samples, + uint8_t layerCount, backend::MRT color, backend::TargetBufferInfo depth, backend::TargetBufferInfo stencil) noexcept override; @@ -86,12 +111,12 @@ class ResourceAllocator final : public ResourceAllocatorInterface { void destroyTexture(backend::TextureHandle h) noexcept override; - void gc() noexcept; + ResourceAllocatorDisposerInterface& getDisposer() noexcept override; + + void gc(bool skippedFrame = false) noexcept; private: - // TODO: these should be settings of the engine - static constexpr size_t CACHE_CAPACITY = 64u << 20u; // 64 MiB - static constexpr size_t CACHE_MAX_AGE = 30u; + size_t const mCacheMaxAge; struct TextureKey { const char* name; // doesn't participate in the hash @@ -176,6 +201,7 @@ class ResourceAllocator final : public ResourceAllocatorInterface { using value_type = typename Container::value_type::second_type; size_t size() const { return mContainer.size(); } + bool empty() const { return size() == 0; } iterator begin() { return mContainer.begin(); } const_iterator begin() const { return mContainer.begin(); } iterator end() { return mContainer.end(); } @@ -188,16 +214,37 @@ class ResourceAllocator final : public ResourceAllocatorInterface { }; using CacheContainer = AssociativeContainer; - using InUseContainer = AssociativeContainer; - CacheContainer::iterator purge(CacheContainer::iterator const& pos); + CacheContainer::iterator + purge(CacheContainer::iterator const& pos); backend::DriverApi& mBackend; + std::shared_ptr mDisposer; CacheContainer mTextureCache; - InUseContainer mInUseTextures; size_t mAge = 0; uint32_t mCacheSize = 0; + uint32_t mCacheSizeHiWaterMark = 0; static constexpr bool mEnabled = true; + + friend class ResourceAllocatorDisposer; +}; + +class ResourceAllocatorDisposer final : public ResourceAllocatorDisposerInterface { + using TextureKey = ResourceAllocator::TextureKey; +public: + explicit ResourceAllocatorDisposer(backend::DriverApi& driverApi) noexcept; + ~ResourceAllocatorDisposer() noexcept override; + void terminate() noexcept; + void destroy(backend::TextureHandle handle) noexcept override; + +private: + friend class ResourceAllocator; + void checkout(backend::TextureHandle handle, TextureKey key); + std::optional checkin(backend::TextureHandle handle); + + using InUseContainer = ResourceAllocator::AssociativeContainer; + backend::DriverApi& mBackend; + InUseContainer mInUseTextures; }; } // namespace filament diff --git a/filament/src/ResourceList.cpp b/filament/src/ResourceList.cpp index b8e8c8f6618..4579ed8a320 100644 --- a/filament/src/ResourceList.cpp +++ b/filament/src/ResourceList.cpp @@ -45,12 +45,15 @@ bool ResourceListBase::remove(void const* item) { return mList.erase(const_cast(item)) > 0; } +auto ResourceListBase::find(void const* item) -> iterator { + return mList.find(const_cast(item)); +} void ResourceListBase::clear() noexcept { mList.clear(); } -// this is not inlined so we don't pay the code-size cost of iterating the list +// this is not inlined, so we don't pay the code-size cost of iterating the list void ResourceListBase::forEach(void (* f)(void*, void*), void* user) const noexcept { std::for_each(mList.begin(), mList.end(), [=](void* p) { f(user, p); diff --git a/filament/src/ResourceList.h b/filament/src/ResourceList.h index 188a5925fe4..4b6137ccee2 100644 --- a/filament/src/ResourceList.h +++ b/filament/src/ResourceList.h @@ -28,6 +28,7 @@ namespace filament { class ResourceListBase { public: using iterator = typename tsl::robin_set::iterator; + using const_iterator = typename tsl::robin_set::const_iterator; explicit ResourceListBase(const char* typeName); ResourceListBase(ResourceListBase&& rhs) noexcept = default; @@ -38,6 +39,8 @@ class ResourceListBase { bool remove(void const* item); + iterator find(void const* item); + void clear() noexcept; bool empty() const noexcept { @@ -56,6 +59,14 @@ class ResourceListBase { return mList.end(); } + const_iterator begin() const noexcept { + return mList.begin(); + } + + const_iterator end() const noexcept { + return mList.end(); + } + protected: void forEach(void(*f)(void* user, void *p), void* user) const noexcept; tsl::robin_set mList; @@ -76,9 +87,12 @@ class ResourceList : private ResourceListBase { using ResourceListBase::forEach; using ResourceListBase::insert; using ResourceListBase::remove; + using ResourceListBase::find; using ResourceListBase::empty; using ResourceListBase::size; using ResourceListBase::clear; + using ResourceListBase::begin; + using ResourceListBase::end; explicit ResourceList(const char* name) noexcept: ResourceListBase(name) {} diff --git a/filament/src/Scene.cpp b/filament/src/Scene.cpp index e686824ed91..93cd014cdd8 100644 --- a/filament/src/Scene.cpp +++ b/filament/src/Scene.cpp @@ -39,22 +39,26 @@ IndirectLight* Scene::getIndirectLight() const noexcept { return downcast(this)->getIndirectLight(); } -void Scene::addEntity(Entity entity) { +void Scene::addEntity(Entity const entity) { downcast(this)->addEntity(entity); } -void Scene::addEntities(const Entity* entities, size_t count) { +void Scene::addEntities(const Entity* entities, size_t const count) { downcast(this)->addEntities(entities, count); } -void Scene::remove(Entity entity) { +void Scene::remove(Entity const entity) { downcast(this)->remove(entity); } -void Scene::removeEntities(const Entity* entities, size_t count) { +void Scene::removeEntities(const Entity* entities, size_t const count) { downcast(this)->removeEntities(entities, count); } +size_t Scene::getEntityCount() const noexcept { + return downcast(this)->getEntityCount(); +} + size_t Scene::getRenderableCount() const noexcept { return downcast(this)->getRenderableCount(); } @@ -63,11 +67,11 @@ size_t Scene::getLightCount() const noexcept { return downcast(this)->getLightCount(); } -bool Scene::hasEntity(Entity entity) const noexcept { +bool Scene::hasEntity(Entity const entity) const noexcept { return downcast(this)->hasEntity(entity); } -void Scene::forEach(Invocable&& functor) const noexcept { +void Scene::forEach(Invocable&& functor) const noexcept { downcast(this)->forEach(std::move(functor)); } diff --git a/filament/src/ShadowMap.cpp b/filament/src/ShadowMap.cpp index 2038dfba80a..b71345458d6 100644 --- a/filament/src/ShadowMap.cpp +++ b/filament/src/ShadowMap.cpp @@ -16,19 +16,39 @@ #include "ShadowMap.h" -#include "RenderPass.h" +#include +#include +#include #include "components/LightManager.h" +#include "details/DebugRegistry.h" #include "details/Engine.h" #include "details/Scene.h" +#include #include +#include #include +#include +#include #include +#include +#include +#include +#include +#include + +#include +#include +#include #include +#include + +#include +#include using namespace utils; @@ -37,9 +57,6 @@ namespace filament { using namespace math; using namespace backend; -// do this only if depth-clamp is available -static constexpr bool USE_DEPTH_CLAMP = false; - ShadowMap::ShadowMap(FEngine& engine) noexcept : mPerShadowMapUniforms(engine), mShadowType(ShadowType::DIRECTIONAL), @@ -58,7 +75,7 @@ ShadowMap::ShadowMap(FEngine& engine) noexcept void ShadowMap::terminate(FEngine& engine) { Entity entities[] = { mCamera->getEntity(), mDebugCamera->getEntity() }; - for (Entity e : entities) { + for (Entity const e : entities) { engine.destroyCameraComponent(e); } engine.getEntityManager().destroy(sizeof(entities) / sizeof(Entity), entities); @@ -67,8 +84,8 @@ void ShadowMap::terminate(FEngine& engine) { ShadowMap::~ShadowMap() = default; -void ShadowMap::initialize(size_t lightIndex, ShadowType shadowType, - uint16_t shadowIndex, uint8_t face, +void ShadowMap::initialize(size_t const lightIndex, ShadowType const shadowType, + uint16_t const shadowIndex, uint8_t const face, LightManager::ShadowOptions const* options) { mLightIndex = lightIndex; mShadowIndex = shadowIndex; @@ -77,25 +94,18 @@ void ShadowMap::initialize(size_t lightIndex, ShadowType shadowType, mFace = face; } -mat4f ShadowMap::getDirectionalLightViewMatrix(float3 direction, float3 position) noexcept { - auto z_axis = direction; - auto norm_up = float3{ 0, 1, 0 }; - if (UTILS_UNLIKELY(std::abs(dot(z_axis, norm_up)) > 0.999f)) { - // Fix up vector if we're degenerate (looking straight up, basically) - norm_up = { norm_up.z, norm_up.x, norm_up.y }; - } - auto x_axis = normalize(cross(z_axis, norm_up)); - auto y_axis = cross(x_axis, z_axis); - const mat4f Mm{ - float4{ x_axis, 0 }, - float4{ y_axis, 0 }, - float4{ -z_axis, 0 }, - float4{ position, 1 }}; +mat4f ShadowMap::getDirectionalLightViewMatrix(float3 direction, float3 up, + float3 position) noexcept { + // 1. we use the x-axis as the "up" reference so that the math is stable when the light + // is pointing down, which is a common case for lights. + // 2. we do the math in double to avoid some precision issues when the light is almost + // straight (i.e. parallel to the x-axis) + mat4f const Mm = mat4f{ mat4::lookTo(direction, position, up) }; return FCamera::rigidTransformInverse(Mm); } -math::mat4f ShadowMap::getPointLightViewMatrix(backend::TextureCubemapFace face, - math::float3 position) noexcept { +mat4f ShadowMap::getPointLightViewMatrix(TextureCubemapFace face, + float3 position) noexcept { float3 direction; switch (TextureCubemapFace(face)) { case TextureCubemapFace::POSITIVE_X: direction = { 1, 0, 0 }; break; @@ -105,169 +115,40 @@ math::mat4f ShadowMap::getPointLightViewMatrix(backend::TextureCubemapFace face, case TextureCubemapFace::POSITIVE_Z: direction = { 0, 0, 1 }; break; case TextureCubemapFace::NEGATIVE_Z: direction = { 0, 0, -1 }; break; } - const mat4f Mv = getDirectionalLightViewMatrix(direction, position); + const mat4f Mv = getDirectionalLightViewMatrix(direction, { 0, 1, 0 }, position); return Mv; } ShadowMap::ShaderParameters ShadowMap::updateDirectional(FEngine& engine, - const FScene::LightSoa& lightData, size_t index, - filament::CameraInfo const& camera, - ShadowMapInfo const& shadowMapInfo, FScene const& scene, - SceneInfo& sceneInfo) noexcept { - - // Note: we keep the polygon offset even with VSM as it seems to help. - auto& lcm = engine.getLightManager(); - FLightManager::Instance li = lightData.elementAt(index); - FLightManager::ShadowParams params = lcm.getShadowParams(li); - -#ifndef NDEBUG - // LISPSM debugging for directional light (works because we only have one) - const float dz = camera.zf - camera.zn; - float& dzn = engine.debug.shadowmap.dzn; - float& dzf = engine.debug.shadowmap.dzf; - if (dzn < 0) dzn = std::max(0.0f, params.options.shadowNearHint - camera.zn) / dz; - else params.options.shadowNearHint = dzn * dz - camera.zn; - if (dzf > 0) dzf =-std::max(0.0f, camera.zf - params.options.shadowFarHint) / dz; - else params.options.shadowFarHint = dzf * dz + camera.zf; -#endif - - // Adjust the camera's projection for the light's shadowFar - const mat4f cullingProjection{ [&](auto p) { - if (params.options.shadowFar > 0.0f) { - float n = camera.zn; - float f = params.options.shadowFar; - // orthographic projection - assert_invariant(std::abs(p[2].w) <= std::numeric_limits::epsilon()); - p[2].z = 2.0f / (n - f); - p[3].z = (f + n) / (n - f); - } - return p; - }(camera.cullingProjection) }; + FScene::LightSoa const& lightData, size_t index, + CameraInfo const& camera, + ShadowMapInfo const& shadowMapInfo, + SceneInfo const& sceneInfo, + bool useDepthClamp) noexcept { - const auto direction = lightData.elementAt(index); + // reset the visible shadow status + mHasVisibleShadows = false; - /* - * Compute the light's model matrix - */ + FLightManager const& lcm = engine.getLightManager(); + FLightManager::Instance const li = lightData.elementAt(index); + FLightManager::ShadowParams const params = lcm.getShadowParams(li); - // We compute the directional light's model matrix using the origin's as the light position. - // The choice of the light's origin initially doesn't matter for a directional light. - // This will be adjusted later because of how we compute the depth metric for VSM. - const mat4f MvAtOrigin = getDirectionalLightViewMatrix(direction); + const auto direction = lightData.elementAt(index); - // Compute scene-dependent values shared across all cascades - ShadowMap::updateSceneInfoDirectional(MvAtOrigin, scene, sceneInfo); + auto const [Mv, znear, zfar, lsClippedShadowVolume, vertexCount, visibleShadows] = + computeDirectionalShadowBounds(engine, direction, params, camera, sceneInfo, + useDepthClamp); - const Aabb wsShadowCastersVolume = sceneInfo.wsShadowCastersVolume; - const Aabb wsShadowReceiversVolume = sceneInfo.wsShadowReceiversVolume; - if (wsShadowCastersVolume.isEmpty() || wsShadowReceiversVolume.isEmpty()) { - mHasVisibleShadows = false; + if (UTILS_UNLIKELY(!visibleShadows)) { return {}; } - // view frustum vertices in world-space - float3 wsViewFrustumVertices[8]; - const mat4f worldToClipMatrix = cullingProjection * camera.view; - const Frustum wsFrustum(worldToClipMatrix); - computeFrustumCorners(wsViewFrustumVertices, inverse(worldToClipMatrix), sceneInfo.csNearFar); - - // we use aligned_storage<> here to avoid the default initialization of std::array<> - std::aligned_storage::type localStorage; // NOLINT(cppcoreguidelines-pro-type-member-init) - FrustumBoxIntersection& wsClippedShadowReceiverVolume{ reinterpret_cast(localStorage) }; - - // compute the intersection of the shadow receivers' volume with the view volume - // in world space. This returns a set of points on the convex-hull of the intersection. - size_t vertexCount = intersectFrustumWithBox(wsClippedShadowReceiverVolume, - wsFrustum, wsViewFrustumVertices, wsShadowReceiversVolume); - - if (UTILS_UNLIKELY(vertexCount < 4)) { - mHasVisibleShadows = false; + // if the 2D bounds of the intersection is empty seen from the light, we have no shadow + Aabb const bounds = compute2DBounds(Mv, lsClippedShadowVolume.data(), vertexCount); + if (UTILS_UNLIKELY(!(bounds.min.x < bounds.max.x && bounds.min.y < bounds.max.y))) { return {}; } - /* - * compute scene zmax (i.e. Near plane) and zmin (i.e. Far plane) in light space. - * (near/far correspond to max/min because the light looks down the -z axis). - * - The Near plane is set to the shadow casters max z (i.e. closest to the light) - * - The Far plane is set to the closest of the farthest shadow casters and receivers - * i.e.: shadow casters behind the last receivers can't cast any shadows - * - * If "depth clamp" is supported, we can further tighten the near plane to the - * shadow receiver. - * - * Note: L has no influence here, since we're only interested in z values - * (L is a rotation around z) - */ - - Aabb lsLightFrustumBounds; - if constexpr (!USE_DEPTH_CLAMP) { - // near plane from shadow caster volume - lsLightFrustumBounds.max.z = sceneInfo.lsNearFar[0]; - } - for (size_t i = 0; i < vertexCount; ++i) { - // far: figure out the farthest shadow receivers - float3 v = mat4f::project(MvAtOrigin, wsClippedShadowReceiverVolume[i]); - lsLightFrustumBounds.min.z = std::min(lsLightFrustumBounds.min.z, v.z); - if constexpr (USE_DEPTH_CLAMP) { - // tighten the shadow receiver volume further - lsLightFrustumBounds.max.z = std::max(lsLightFrustumBounds.max.z, v.z); - } - } - if (engine.debug.shadowmap.far_uses_shadowcasters) { - // far: closest of the farthest shadow casters and receivers - lsLightFrustumBounds.min.z = std::max(lsLightFrustumBounds.min.z, sceneInfo.lsNearFar[1]); - } - - // Now that we know the znear (-lsLightFrustumBounds.max.z), adjust the light's position such - // that znear = 0, this is only need for VSM, but doesn't hurt PCF. - const mat4f Mv = getDirectionalLightViewMatrix(direction, direction * -lsLightFrustumBounds.max.z); - - // near / far planes are specified relative to the direction the eye is looking at - // i.e. the -z axis (see: ortho) - const float znear = 0.0f; - const float zfar = lsLightFrustumBounds.max.z - lsLightFrustumBounds.min.z; - - // if znear >= zfar, it means we don't have any shadow caster in front of a shadow receiver - if (UTILS_UNLIKELY(znear >= zfar)) { - mHasVisibleShadows = false; - return {}; - } - - float4 viewVolumeBoundingSphere = {}; - if (UTILS_UNLIKELY(params.options.stable)) { - // In stable mode, the light frustum size must be fixed, so we can choose either the - // whole view frustum, or the whole scene bounding volume. We simply pick whichever - // is smaller. - - // in stable mode we simply take the shadow receivers volume - const float4 shadowReceiverVolumeBoundingSphere = computeBoundingSphere( - wsShadowReceiversVolume.getCorners().data(), 8); - - // in stable mode we simply take the view volume, bounding sphere - viewVolumeBoundingSphere = computeBoundingSphere(wsViewFrustumVertices, 8); - - if (shadowReceiverVolumeBoundingSphere.w < viewVolumeBoundingSphere.w) { - - // When using the shadowReceiver volume, we don't have to use its enclosing sphere - // because (we assume) the scene volume doesn't change. Seen from the light it only - // changes when the light moves or rotates, and it is acceptable in that case to have - // non "stable" shadows (the shadow will never be stable when the light moves). - // - // On the other hand, when using the view volume, we must use a sphere because otherwise - // its projection's bounds in light space change with the camera, leading to unstable - // shadows with camera movement. - - viewVolumeBoundingSphere.w = 0; - std::copy_n(wsShadowReceiversVolume.getCorners().data(), 8, - wsClippedShadowReceiverVolume.data()); - } - } - - mHasVisibleShadows = true; - - // We can't use LISPSM in stable mode - const bool useLispsm = params.options.lispsm && !params.options.stable; - /* * Compute the light's projection matrix * (directional/point lights, i.e. projection to use, including znear/zfar clip planes) @@ -275,127 +156,83 @@ ShadowMap::ShaderParameters ShadowMap::updateDirectional(FEngine& engine, // The light's projection, ortho for directional lights, perspective otherwise const mat4f Mp = directionalLightFrustum(znear, zfar); - - const mat4f MpMv(Mp * Mv); + mat4f LMp = Mp; + mat4f LMpMv = Mp * Mv; /* * Compute warping (optional, improve quality) */ - mat4f LMpMv = MpMv; + mat4f W, Wp, L; + // We can't use LISPSM in stable mode + const bool useLispsm = params.options.lispsm && !params.options.stable; - // Compute the LiSPSM warping - mat4f W, Wp; - mat4f L; // Rotation matrix in light space - if (useLispsm) { + if (useLispsm || + (!params.options.stable && !engine.debug.shadowmap.disable_light_frustum_align)) { // Orient the shadow map in the direction of the view vector by constructing a - // rotation matrix in light space around the z-axis, that aligns the y-axis with the camera's - // forward vector (V) -- this gives the wrap direction, vp, for LiSPSM. - const float3 wsCameraFwd = camera.getForwardVector(); - const float3 lsCameraFwd = Mv.upperLeft() * wsCameraFwd; - // If the light and view vector are parallel, this rotation becomes - // meaningless. Just use identity. - // (LdotV == (Mv*V).z, because L = {0,0,1} in light-space) - if (UTILS_LIKELY(std::abs(lsCameraFwd.z) < 0.9997f)) { // this is |dot(L, V)| - const float3 vp{ normalize(lsCameraFwd.xy), 0 }; // wrap direction in light-space - L[0].xyz = cross(vp, float3{ 0, 0, 1 }); - L[1].xyz = vp; - L[2].xyz = { 0, 0, 1 }; - L = transpose(L); - } - - LMpMv = L * MpMv; + const float3 lsCameraFwd = Mv.upperLeft() * camera.getForwardVector(); + L = computeLightRotation(lsCameraFwd); + LMp = L * Mp; + LMpMv = LMp * Mv; + } - W = applyLISPSM(Wp, camera, params, LMpMv, - wsClippedShadowReceiverVolume, vertexCount, direction); + if (useLispsm) { + W = applyLISPSM(Wp, camera, params, + LMp, Mv, LMpMv, lsClippedShadowVolume, vertexCount, direction); } /* * Compute focusing matrix (optional, greatly improves quality) */ - // construct the warped light-space - const mat4f WLMpMv = W * LMpMv; + const mat4f WLMp = W * LMp; // 2) Now we find the x-y bounds of our convex-hull (view volume & shadow receivers) // in light space, so we can "focus" the shadow map to the interesting area. // This is the most important step to increase the quality of the shadow map. // // In LiPSM mode, we're using the warped space here. - - Aabb bounds; - if (params.options.stable && viewVolumeBoundingSphere.w > 0) { - bounds = compute2DBounds(Mv, viewVolumeBoundingSphere); - } else { - bounds = compute2DBounds(WLMpMv, wsClippedShadowReceiverVolume.data(), vertexCount); - } - lsLightFrustumBounds.min.xy = bounds.min.xy; - lsLightFrustumBounds.max.xy = bounds.max.xy; + float4 f = computeFocusParams(LMpMv, WLMp, + lsClippedShadowVolume, vertexCount, + camera, params.options.shadowFar, params.options.stable); if (params.options.stable) { - // in stable mode we can't do anything that can change the scaling of the texture - } else { - // For directional lights, we further constraint the light frustum to the - // intersection of the shadow casters & shadow receivers in light-space. - // ** This relies on the 1-texel shadow map border ** - if (engine.debug.shadowmap.focus_shadowcasters) { - intersectWithShadowCasters(lsLightFrustumBounds, WLMpMv, wsShadowCastersVolume); - } - } - - if (UTILS_UNLIKELY((lsLightFrustumBounds.min.x >= lsLightFrustumBounds.max.x) || - (lsLightFrustumBounds.min.y >= lsLightFrustumBounds.max.y))) { - // this could happen if the only thing visible is a perfectly horizontal or - // vertical thin line - mHasVisibleShadows = false; - return {}; - } - - assert_invariant(lsLightFrustumBounds.min.x < lsLightFrustumBounds.max.x); - assert_invariant(lsLightFrustumBounds.min.y < lsLightFrustumBounds.max.y); - - // compute focus scale and offset - float2 s = 2.0f / float2(lsLightFrustumBounds.max.xy - lsLightFrustumBounds.min.xy); - float2 o = -s * float2(lsLightFrustumBounds.max.xy + lsLightFrustumBounds.min.xy) * 0.5f; - - if (params.options.stable) { - // Use the world origin as reference point, fixed w.r.t. the camera - snapLightFrustum(s, o, Mv, -camera.getWorldOffset(), - 1.0f / float(shadowMapInfo.shadowDimension)); + const auto lsRef = lightData.elementAt(index); + snapLightFrustum(f.xy, f.zw, lsRef, shadowMapInfo.shadowDimension); } const mat4f F(mat4f::row_major_init { - s.x, 0.0f, 0.0f, o.x, - 0.0f, s.y, 0.0f, o.y, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f, + f.x, 0.0f, 0.0f, f.z, + 0.0f, f.y, 0.0f, f.w, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f, }); /* * Final shadow map transform */ - // Final shadow transform - const mat4f S = F * WLMpMv; + // Final shadow transform (focused warped light-space) + const mat4f S = F * (W * LMpMv); // Computes St the transform to use in the shader to access the shadow map texture // i.e. it transforms a world-space vertex to a texture coordinate in the shadowmap - const backend::Viewport viewport = getViewport(); - const auto [Mt, Mn] = ShadowMap::getTextureCoordsMapping(shadowMapInfo, viewport); - const mat4f St = math::highPrecisionMultiply(Mt, S); + const auto [Mt, Mn] = getTextureCoordsMapping(shadowMapInfo, getViewport()); + const mat4f St = highPrecisionMultiply(Mt, S); - ShadowMap::ShaderParameters shaderParameters; + ShaderParameters shaderParameters; + shaderParameters.scissorNormalized = getClampToEdgeCoords(shadowMapInfo); // note: in texelSizeWorldSpace() below, we can use Mb * Mt * F * W because // L * Mp * Mv is a rigid transform for directional lights, and doesn't matter. // if Wp[3][1] is 0, then LISPSM was cancelled. if (useLispsm && Wp[3][1] != 0.0f) { - shaderParameters.texelSizeAtOneMeterWs = texelSizeWorldSpace(Wp, mat4f(Mt * F), - shadowMapInfo.shadowDimension); + shaderParameters.texelSizeAtOneMeterWs = + texelSizeWorldSpace(Wp, mat4f(Mt * F), shadowMapInfo.shadowDimension); } else { // We know we're using an ortho projection - shaderParameters.texelSizeAtOneMeterWs = texelSizeWorldSpace(St.upperLeft(), - shadowMapInfo.shadowDimension); + shaderParameters.texelSizeAtOneMeterWs = + texelSizeWorldSpace(St.upperLeft(), shadowMapInfo.shadowDimension); } if (!shadowMapInfo.vsm) { shaderParameters.lightSpace = St; @@ -403,8 +240,6 @@ ShadowMap::ShaderParameters ShadowMap::updateDirectional(FEngine& engine, shaderParameters.lightSpace = computeVsmLightSpaceMatrix(St, Mv, znear, zfar); } - shaderParameters.scissorNormalized = getViewportNormalized(shadowMapInfo); - // We apply the constant bias in world space (as opposed to light-space) to account // for perspective and lispsm shadow maps. This also allows us to do this at zero-cost // by baking it in the shadow-map itself. @@ -419,27 +254,29 @@ ShadowMap::ShaderParameters ShadowMap::updateDirectional(FEngine& engine, // The model matrix below is in fact inverted to get the view matrix and passed to the // shader as 'viewFromWorldMatrix', and is used in the VSM case to compute the depth metric. // (see depth_main.fs). Note that in the case of VSM, 'b' below is identity. - mCamera->setModelMatrix(FCamera::rigidTransformInverse(math::highPrecisionMultiplyd(Mv, b))); - mCamera->setCustomProjection(mat4(Mn * F * W * L * Mp), znear, zfar); + mCamera->setModelMatrix(FCamera::rigidTransformInverse(highPrecisionMultiplyd(Mv, b))); + mCamera->setCustomProjection(mat4(Mn * F * WLMp), znear, zfar); // for the debug camera, we need to undo the world origin - mDebugCamera->setCustomProjection(mat4(S * b * camera.worldOrigin), znear, zfar); + mDebugCamera->setCustomProjection(mat4(S * b * camera.worldTransform), znear, zfar); + + mHasVisibleShadows = true; return shaderParameters; } ShadowMap::ShaderParameters ShadowMap::updatePunctual( - mat4f const& Mv, float outerConeAngle, float nearPlane, float farPlane, + mat4f const& Mv, float const outerConeAngle, float const nearPlane, float const farPlane, const ShadowMapInfo& shadowMapInfo, const FLightManager::ShadowParams& params) noexcept { - const mat4f Mp = mat4f::perspective(outerConeAngle * f::RAD_TO_DEG * 2.0f, 1.0f, nearPlane, farPlane); + const mat4f Mp = mat4f::perspective( + outerConeAngle * f::RAD_TO_DEG * 2.0f, 1.0f, nearPlane, farPlane); assert_invariant(shadowMapInfo.textureDimension == mOptions->mapSize); // Final shadow transform - const backend::Viewport viewport = getViewport(); - const mat4f S = math::highPrecisionMultiply(Mp, Mv); - const auto [Mt, Mn] = ShadowMap::getTextureCoordsMapping(shadowMapInfo, viewport); - const mat4f St = math::highPrecisionMultiply(Mt, S); + const mat4f S = highPrecisionMultiply(Mp, Mv); + const auto [Mt, Mn] = getTextureCoordsMapping(shadowMapInfo, getViewport()); + const mat4f St = highPrecisionMultiply(Mt, S); // TODO: focus projection // 1) focus on the casters @@ -465,7 +302,7 @@ ShadowMap::ShaderParameters ShadowMap::updatePunctual( shaderParameters.lightSpace = computeVsmLightSpaceMatrix(St, Mv, nearPlane, farPlane); } - shaderParameters.scissorNormalized = getViewportNormalized(shadowMapInfo); + shaderParameters.scissorNormalized = getClampToEdgeCoords(shadowMapInfo); const float3 direction = -transpose(Mv)[2].xyz; const float constantBias = shadowMapInfo.vsm ? 0.0f : params.options.constantBias; @@ -479,15 +316,15 @@ ShadowMap::ShaderParameters ShadowMap::updatePunctual( // The model matrix below is in fact inverted to get the view matrix and passed to the // shader as 'viewFromWorldMatrix', and is used in the VSM case to compute the depth metric. // (see depth_main.fs). Note that in the case of VSM, 'b' below is identity. - mCamera->setModelMatrix(FCamera::rigidTransformInverse(math::highPrecisionMultiplyd(Mv, b))); - mCamera->setCustomProjection(math::highPrecisionMultiplyd(Mn, Mp), nearPlane, farPlane); + mCamera->setModelMatrix(FCamera::rigidTransformInverse(highPrecisionMultiplyd(Mv, b))); + mCamera->setCustomProjection(highPrecisionMultiplyd(Mn, Mp), nearPlane, farPlane); return shaderParameters; } ShadowMap::ShaderParameters ShadowMap::updateSpot(FEngine& engine, const FScene::LightSoa& lightData, size_t index, - filament::CameraInfo const& camera, + CameraInfo const&, const ShadowMapInfo& shadowMapInfo, FScene const& scene, SceneInfo sceneInfo) noexcept { @@ -497,34 +334,43 @@ ShadowMap::ShaderParameters ShadowMap::updateSpot(FEngine& engine, auto radius = lightData.elementAt(index).w; auto li = lightData.elementAt(index); const FLightManager::ShadowParams& params = lcm.getShadowParams(li); - const mat4f Mv = getDirectionalLightViewMatrix(direction, position); - - // find decent near/far - ShadowMap::updateSceneInfoSpot(Mv, scene, sceneInfo); + const mat4f Mv = getDirectionalLightViewMatrix(direction, { 0, 1, 0 }, position); + + // We only keep this for reference. updateSceneInfoSpot() is quite expensive on large scenes + // currently, and only needed to find a near/far. Instead, we just use a small near and the + // radius as far. + // TODO: Another potential solution would be to visit only the part of the scene that's visible + // by the light -- which should be much smaller. + if constexpr (false) { + // find decent near/far + updateSceneInfoSpot(Mv, scene, sceneInfo); + } else { + sceneInfo.lsCastersNearFar = { -0.01f, -radius }; + } // if the scene was empty, near > far - mHasVisibleShadows = -sceneInfo.lsNearFar[0] < -sceneInfo.lsNearFar[1]; + mHasVisibleShadows = -sceneInfo.lsCastersNearFar[0] < -sceneInfo.lsCastersNearFar[1]; if (!mHasVisibleShadows) { return {}; } // FIXME: we need a configuration for minimum near plane (for now hardcoded to 1cm) - float nearPlane = std::max(0.01f, -sceneInfo.lsNearFar[0]); - float farPlane = std::min(radius, -sceneInfo.lsNearFar[1]); + float const nearPlane = std::max(0.01f, -sceneInfo.lsCastersNearFar[0]); + float const farPlane = std::min(radius, -sceneInfo.lsCastersNearFar[1]); + auto outerConeAngle = lcm.getSpotLightOuterCone(li); return updatePunctual(Mv, outerConeAngle, nearPlane, farPlane, shadowMapInfo, params); } ShadowMap::ShaderParameters ShadowMap::updatePoint(FEngine& engine, - const FScene::LightSoa& lightData, size_t index, - filament::CameraInfo const& camera, const ShadowMapInfo& shadowMapInfo, FScene const& scene, - SceneInfo, uint8_t face) noexcept { + const FScene::LightSoa& lightData, size_t const index, CameraInfo const&, + const ShadowMapInfo& shadowMapInfo, FScene const& scene, uint8_t face) noexcept { // check if this shadow map has anything to render mHasVisibleShadows = false; FScene::RenderableSoa const& UTILS_RESTRICT soa = scene.getRenderableData(); auto const* const UTILS_RESTRICT visibleMasks = soa.data(); - size_t c = soa.size(); + size_t const c = soa.size(); for (size_t i = 0; i < c; i++) { if (visibleMasks[i] & VISIBLE_DYN_SHADOW_RENDERABLE) { mHasVisibleShadows = true; @@ -544,10 +390,151 @@ ShadowMap::ShaderParameters ShadowMap::updatePoint(FEngine& engine, return updatePunctual(Mv, 45.0f * f::DEG_TO_RAD, 0.01f, radius, shadowMapInfo, params); } +ShadowMap::DirectionalShadowBounds ShadowMap::computeDirectionalShadowBounds( + FEngine& engine, + float3 const direction, + FLightManager::ShadowParams params, + CameraInfo const& camera, + SceneInfo const& sceneInfo, + bool useDepthClamp) noexcept { + + // we use aligned_storage<> here to avoid the default initialization of std::array<> + using Storage = std::aligned_storage::type; + Storage localStorage; // NOLINT(cppcoreguidelines-pro-type-member-init) + FrustumBoxIntersection& lsClippedShadowVolume = + reinterpret_cast(localStorage); + + if (sceneInfo.lsReceiversNearFar[0] <= sceneInfo.lsReceiversNearFar[1]) { + // no visible receivers + return {}; + } + + if (sceneInfo.lsCastersNearFar[0] <= sceneInfo.lsCastersNearFar[1]) { + // no casters + return {}; + } + + // early exit if we don't have shadow receivers or casters + Aabb const& wsShadowCastersVolume = sceneInfo.wsShadowCastersVolume; + Aabb const& wsShadowReceiversVolume = sceneInfo.wsShadowReceiversVolume; + if (wsShadowCastersVolume.isEmpty() || wsShadowReceiversVolume.isEmpty()) { + return {}; + } + +#ifndef NDEBUG + // LISPSM debugging for directional light (works because we only have one) + const float dz = camera.zf - camera.zn; + float& dzn = engine.debug.shadowmap.dzn; + float& dzf = engine.debug.shadowmap.dzf; + if (dzn < 0) dzn = std::max(0.0f, params.options.shadowNearHint - camera.zn) / dz; + else params.options.shadowNearHint = dzn * dz - camera.zn; + if (dzf > 0) dzf =-std::max(0.0f, camera.zf - params.options.shadowFarHint) / dz; + else params.options.shadowFarHint = dzf * dz + camera.zf; +#endif + + /* + * Compute the light's model matrix + */ + + // We compute the directional light's model matrix using the origin's as the light position. + // The choice of the light's origin initially doesn't matter for a directional light. + // This will be adjusted later because of how we compute the depth metric for VSM. + mat4f const MvAtOrigin = getDirectionalLightViewMatrix(direction, + normalize(camera.worldTransform[0].xyz)); + + + Aabb lsLightFrustumBounds = computeLightFrustumBounds( + MvAtOrigin, wsShadowReceiversVolume, wsShadowCastersVolume, + sceneInfo, + params.options.stable, + engine.debug.shadowmap.focus_shadowcasters, + engine.debug.shadowmap.far_uses_shadowcasters); + + // handles NaNs + if (UTILS_UNLIKELY(!((lsLightFrustumBounds.min.x < lsLightFrustumBounds.max.x) && + (lsLightFrustumBounds.min.y < lsLightFrustumBounds.max.y)))) { + return {}; + } + + // Compute the intersection of the view volume with the intersection of receivers and casters + // in light space. This returns a set of points on the convex-hull of the intersection. + mat4f const projection = camera.cullingProjection * + (camera.view * FCamera::rigidTransformInverse(MvAtOrigin)); + size_t const vertexCount = intersectFrustumWithBox(lsClippedShadowVolume, + projection, lsLightFrustumBounds); + + if (UTILS_UNLIKELY(vertexCount < 4)) { + return {}; + } + + /* + * Adjust the scene's zmax (i.e. Near plane) and zmin (i.e. Far plane) in light space. + * (near/far correspond to max/min because the light looks down the -z axis). + * + * - For the Far plane, the light frustum is already set to the closest of receivers and + * casters (i.e.: shadow casters behind the last receivers can't cast any shadows). + * But it can be moved closer up to the farthest point in the camera frustum & light + * frustum intersection. + * + * - The Near plane is already set to the shadow casters max z (i.e. closest to the light) + * + * If "depth clamp" is supported, we can further tighten the near plane to the + * shadow receiver (i.e. to the closest point of camera frustum & light frustum intersection). + * + * Note: L has no influence here, since we're only interested in z values + * (L is a rotation around z) + */ + + float lsClippedShadowVolumeFarthest = std::numeric_limits::max(); + float lsClippedShadowVolumeNearest = std::numeric_limits::lowest(); + for (size_t i = 0; i < vertexCount; ++i) { + float3 const v = lsClippedShadowVolume[i]; + lsClippedShadowVolumeFarthest = std::min(lsClippedShadowVolumeFarthest, v.z); + lsClippedShadowVolumeNearest = std::max(lsClippedShadowVolumeNearest, v.z); + } + + lsLightFrustumBounds.min.z = + std::max(lsLightFrustumBounds.min.z, lsClippedShadowVolumeFarthest); + + if (useDepthClamp) { + lsLightFrustumBounds.max.z = + std::min(lsLightFrustumBounds.max.z, lsClippedShadowVolumeNearest); + } + + if (engine.debug.shadowmap.far_uses_shadowcasters) { + // far: closest of the farthest shadow casters and receivers + lsLightFrustumBounds.min.z = + std::max(lsLightFrustumBounds.min.z, sceneInfo.lsCastersNearFar[1]); + } + + // near / far planes are specified relative to the direction the eye is looking at + // i.e. the -z axis (see: ortho) + const float znear = 0.0f; + const float zfar = lsLightFrustumBounds.max.z - lsLightFrustumBounds.min.z; + // if znear >= zfar, it means we don't have any shadow caster in front of a shadow receiver + if (UTILS_UNLIKELY(!(znear < zfar))) { // handles NaNs + return {}; + } + + // update lsLightFrustum from MvAtOrigin to Mv + for (auto& v : lsClippedShadowVolume) { + v.z -= lsLightFrustumBounds.max.z; + } + + // Now that we know the znear (-lsLightFrustumBounds.max.z), adjust the light's position such + // that znear = 0, this is only needed for VSM, but doesn't hurt PCF. + const mat4f Mv = getDirectionalLightViewMatrix(direction, normalize(camera.worldTransform[0].xyz), + direction * -lsLightFrustumBounds.max.z); + + return { Mv, znear, zfar, lsClippedShadowVolume, vertexCount, true }; +} + mat4f ShadowMap::applyLISPSM(mat4f& Wp, - filament::CameraInfo const& camera, FLightManager::ShadowParams const& params, + CameraInfo const& camera, FLightManager::ShadowParams const& params, + mat4f const& LMp, + mat4f const& Mv, mat4f const& LMpMv, - FrustumBoxIntersection const& wsShadowReceiversVolume, size_t vertexCount, + FrustumBoxIntersection const& lsShadowVolume, size_t vertexCount, float3 const& dir) { const float LoV = dot(camera.getForwardVector(), dir); @@ -560,16 +547,20 @@ mat4f ShadowMap::applyLISPSM(mat4f& Wp, const float dzf = std::max(0.0f, camera.zf - params.options.shadowFarHint); // near/far plane's distance from the eye in view space of the shadow receiver volume. - float2 znf = -computeNearFar(camera.view, wsShadowReceiversVolume.data(), vertexCount); + + float2 const znf = -computeNearFar( + camera.view * FCamera::rigidTransformInverse(Mv), + lsShadowVolume.data(), vertexCount); + const float zn = std::max(camera.zn, znf[0]); // near plane distance from the eye const float zf = std::min(camera.zf, znf[1]); // far plane distance from the eye - // compute n and f, the near and far planes coordinates of Wp (warp space). + // Compute n and f, the near and far planes coordinates of Wp (warp space). // It's found by looking down the Y axis in light space (i.e. -Z axis of Wp, // i.e. the axis orthogonal to the light direction) and taking the min/max // of the shadow receivers' volume. // Note: znear/zfar encoded in Mp has no influence here (b/c we're interested only by the y-axis) - const float2 nf = computeNearFarOfWarpSpace(LMpMv, wsShadowReceiversVolume.data(), vertexCount); + const float2 nf = computeNearFarOfWarpSpace(LMp, lsShadowVolume.data(), vertexCount); const float n = nf[0]; // near plane coordinate of Mp (light space) const float f = nf[1]; // far plane coordinate of Mp (light space) const float d = std::abs(f - n); // Wp's depth-range d (abs necessary because we're dealing with z-coordinates, not distances) @@ -582,7 +573,7 @@ mat4f ShadowMap::applyLISPSM(mat4f& Wp, // see nopt1 below for an explanation about this test // sinLV is positive since it comes from a square-root constexpr float epsilon = 0.02f; // very roughly 1 degree - if (sinLV > epsilon && 3.0f * (dzn / (zf - zn)) < 2.0f) { + if (f > n && sinLV > epsilon && 3.0f * (dzn / (zf - zn)) < 2.0f) { // nopt is the optimal near plane distance of Wp (i.e. distance from P). // virtual near and far planes @@ -592,7 +583,7 @@ mat4f ShadowMap::applyLISPSM(mat4f& Wp, // in the general case, nopt is computed as: const float nopt0 = (1.0f / sinLV) * (z0 + std::sqrt(vz0 * vz1)); - // however, if dzn becomes too large, the max error doesn't happen in the depth range, + // However, if dzn becomes too large, the max error doesn't happen in the depth range, // and the equation below should be used instead. If dzn reaches 2/3 of the depth range // zf-zn, nopt becomes infinite, and we must revert to an ortho projection. const float nopt1 = dzn / (2.0f - 3.0f * (dzn / (zf - zn))); @@ -606,7 +597,7 @@ mat4f ShadowMap::applyLISPSM(mat4f& Wp, // x-axis. Doesn't seem to make a big difference in the end. lsCameraPosition.x, n - nopt, - // note: various papers suggest using the shadow receiver's center z coordinate in light + // Note: various papers suggest using the shadow receiver's center z coordinate in light // space, i.e. to center "vertically" on the shadow receiver volume. // e.g. (LMpMv * wsShadowReceiversVolume.center()).z // However, simply using 0, guarantees to be centered on the light frustum, which itself @@ -621,6 +612,65 @@ mat4f ShadowMap::applyLISPSM(mat4f& Wp, return W; } +mat4f ShadowMap::computeLightRotation(float3 const& lsDirection) noexcept { + mat4f L; + // Orient the shadow map in the direction of the view vector by constructing a + // rotation matrix in light space around the z-axis, that aligns the y-axis with the camera's + // forward vector (V) -- this gives the wrap direction, vp, for LiSPSM. + // If the light and view vector are parallel, this rotation becomes + // meaningless. Just use identity. + // (LdotV == (Mv*V).z, because L = {0,0,1} in light-space) + if (UTILS_LIKELY(std::abs(lsDirection.z) < 0.9997f)) { // this is |dot(L, V)| + const float3 vp{ normalize(lsDirection.xy), 0 }; // wrap direction in light-space + L[0].xyz = cross(vp, float3{ 0, 0, 1 }); + L[1].xyz = vp; + L[2].xyz = { 0, 0, 1 }; + L = transpose(L); + } + return L; +} + +float4 ShadowMap::computeFocusParams( + mat4f const& LMpMv, + mat4f const& WLMp, + FrustumBoxIntersection const& lsShadowVolume, size_t vertexCount, + CameraInfo const& camera, + float shadowFar, bool stable) noexcept { + float2 s, o; + if (stable) { + // In stable mode, the light frustum size must be fixed, so we choose the + // whole view frustum. + // We simply take the view volume bounding sphere, but we calculate it + // in view space, so that it's perfectly stable. + + auto getViewVolumeBoundingSphere = [&]() { + if (shadowFar > 0) { + float4 const wsViewVolumeBoundingSphere = { camera.getPosition(), shadowFar }; + return wsViewVolumeBoundingSphere; + } else { + mat4f const viewFromClip = inverse(camera.cullingProjection); + Corners const wsFrustumVertices = computeFrustumCorners(viewFromClip); + float4 const wsViewVolumeBoundingSphere = + computeBoundingSphere(wsFrustumVertices.vertices, 8); + return wsViewVolumeBoundingSphere; + } + }; + + float4 const wsViewVolumeBoundingSphere = getViewVolumeBoundingSphere(); + s = 1.0f / wsViewVolumeBoundingSphere.w; + o = mat4f::project(LMpMv * camera.model, wsViewVolumeBoundingSphere.xyz).xy; + o = -s * o; + } else { + Aabb const bounds = compute2DBounds(WLMp, lsShadowVolume.data(), vertexCount); + assert_invariant(bounds.min.x < bounds.max.x); + assert_invariant(bounds.min.y < bounds.max.y); + + s = 2.0f / float2(bounds.max.xy - bounds.min.xy); + o = float2(bounds.max.xy + bounds.min.xy) * 0.5f; + o = -s * o; + } + return { s, o }; +} // Apply these remapping in double to maintain a high precision for the depth axis ShadowMap::TextureCoordsMapping ShadowMap::getTextureCoordsMapping(ShadowMapInfo const& info, @@ -635,6 +685,8 @@ ShadowMap::TextureCoordsMapping ShadowMap::getTextureCoordsMapping(ShadowMapInfo 0.0f, 0.0f, 0.0f, 1.0f }}; + constexpr mat4f MtInverse = inverse(Mt); + // apply the viewport transform const float2 o = float2{ viewport.left, viewport.bottom } / float(info.atlasDimension); const float2 s = float2{ viewport.width, viewport.height } / float(info.atlasDimension); @@ -656,11 +708,11 @@ ShadowMap::TextureCoordsMapping ShadowMap::getTextureCoordsMapping(ShadowMapInfo }} : mat4f{}; // Compute shadow-map texture access and viewport transform - return { Mf * (Mv * Mt), inverse(Mt) * (Mv * Mt) }; + return { Mf * (Mv * Mt), MtInverse * (Mv * Mt) }; } mat4f ShadowMap::computeVsmLightSpaceMatrix(const mat4f& lightSpacePcf, - const mat4f& Mv, float znear, float zfar) noexcept { + const mat4f& Mv, float const znear, float const zfar) noexcept { // The lightSpacePcf matrix transforms coordinates from world space into (u, v, z) coordinates, // where (u, v) are used to access the shadow map, and z is the (non-linear) PCF comparison // value [0, 1]. @@ -680,7 +732,7 @@ mat4f ShadowMap::computeVsmLightSpaceMatrix(const mat4f& lightSpacePcf, // This construct a frustum (similar to glFrustum or frustum), except // it looks towards the +y axis, and assumes -1,1 for the left/right and bottom/top planes. -mat4f ShadowMap::warpFrustum(float n, float f) noexcept { +mat4f ShadowMap::warpFrustum(float const n, float const f) noexcept { assert_invariant(f > n); const float d = 1 / (f - n); const float A = (f + n) * d; @@ -694,7 +746,7 @@ mat4f ShadowMap::warpFrustum(float n, float f) noexcept { return Wp; } -mat4f ShadowMap::directionalLightFrustum(float near, float far) noexcept { +mat4f ShadowMap::directionalLightFrustum(float const near, float const far) noexcept { const float d = far - near; mat4f m; m[2][2] = -2 / d; @@ -703,17 +755,11 @@ mat4f ShadowMap::directionalLightFrustum(float near, float far) noexcept { } float2 ShadowMap::computeNearFar(const mat4f& view, - Aabb const& wsShadowCastersVolume) noexcept { - const Aabb::Corners wsSceneCastersCorners = wsShadowCastersVolume.getCorners(); - return computeNearFar(view, wsSceneCastersCorners.data(), wsSceneCastersCorners.size()); -} - -float2 ShadowMap::computeNearFar(const mat4f& view, - float3 const* wsVertices, size_t count) noexcept { + float3 const* wsVertices, size_t const count) noexcept { float2 nearFar = { std::numeric_limits::lowest(), std::numeric_limits::max() }; for (size_t i = 0; i < count; i++) { // we're on the z axis in light space (looking down to -z) - float c = mat4f::project(view, wsVertices[i]).z; + float const c = mat4f::project(view, wsVertices[i]).z; nearFar.x = std::max(nearFar.x, c); // near nearFar.y = std::min(nearFar.y, c); // far } @@ -721,12 +767,12 @@ float2 ShadowMap::computeNearFar(const mat4f& view, } float2 ShadowMap::computeNearFarOfWarpSpace(mat4f const& lightView, - float3 const* wsVertices, size_t count) noexcept { + float3 const* wsVertices, size_t const count) noexcept { float2 nearFar = { std::numeric_limits::max(), std::numeric_limits::lowest() }; #pragma nounroll for (size_t i = 0; i < count; i++) { // we're on the y-axis in light space (looking down to +y) - float c = mat4f::project(lightView, wsVertices[i]).y; + float const c = mat4f::project(lightView, wsVertices[i]).y; nearFar.x = std::min(nearFar.x, c); nearFar.y = std::max(nearFar.y, c); } @@ -738,7 +784,7 @@ float4 ShadowMap::computeBoundingSphere(float3 const* vertices, size_t count) no for (size_t i = 0; i < count; i++) { s.xyz += vertices[i]; } - s.xyz *= 1.0f / count; + s.xyz *= 1.0f / float(count); for (size_t i = 0; i < count; i++) { s.w = std::max(s.w, length2(vertices[i] - s.xyz)); } @@ -747,107 +793,136 @@ float4 ShadowMap::computeBoundingSphere(float3 const* vertices, size_t count) no } Aabb ShadowMap::compute2DBounds(const mat4f& lightView, - float3 const* wsVertices, size_t count) noexcept { + float3 const* wsVertices, size_t const count) noexcept { Aabb bounds{}; - // disable vectorization here because vertexCount is <= 64, not worth the increased code size. - #pragma clang loop vectorize(disable) - for (size_t i = 0; i < count; ++i) { - const float3 v = mat4f::project(lightView, wsVertices[i]); + Slice const vertices{ wsVertices, count }; + for (auto const& vertice : vertices) { + const float3 v = mat4f::project(lightView, vertice); bounds.min.xy = min(bounds.min.xy, v.xy); bounds.max.xy = max(bounds.max.xy, v.xy); } return bounds; } -Aabb ShadowMap::compute2DBounds(const mat4f& lightView, float4 const& sphere) noexcept { - // this assumes a rigid body transform - float4 s; - s.xyz = (lightView * float4{sphere.xyz, 1.0f}).xyz; - s.w = sphere.w; - return Aabb{s.xyz - s.w, s.xyz + s.w}; +Aabb ShadowMap::compute2DBounds(const mat4f& lightView, + Aabb const& volume) noexcept { + Aabb bounds{}; + auto const& corners = volume.getCorners(); + for (auto const& corner : corners) { + const float3 v = mat4f::project(lightView, corner); + bounds.min = min(bounds.min, v); + bounds.max = max(bounds.max, v); + } + return bounds; } -void ShadowMap::intersectWithShadowCasters(Aabb& UTILS_RESTRICT lightFrustum, - mat4f const& lightView, Aabb const& wsShadowCastersVolume) noexcept { +ShadowMap::Corners ShadowMap::computeFrustumCorners( + mat4f const& projectionInverse) noexcept { - // construct the Focus transform (scale + offset) - const float2 s = 2.0f / float2(lightFrustum.max.xy - lightFrustum.min.xy); - const float2 o = -s * float2(lightFrustum.max.xy + lightFrustum.min.xy) * 0.5f; - const mat4f F(mat4f::row_major_init { - s.x, 0.0f, 0.0f, o.x, - 0.0f, s.y, 0.0f, o.y, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f, - }); - float3 wsLightFrustumCorners[8]; - const mat4f projection = F * lightView; - const Frustum wsLightFrustum(projection); - computeFrustumCorners(wsLightFrustumCorners, inverse(projection)); - - // Intersect shadow-caster AABB with current light frustum in world-space: - // - // This (obviously) guarantees that the resulting volume is inside the light frustum; - // when using LiSPSM (or projection lights, i.e. when lightView is a projection), we must - // first intersect wsShadowCastersVolume with the light's frustum, otherwise we end-up - // transforming vertices that are "outside" the frustum, and that's forbidden. - FrustumBoxIntersection wsClippedShadowCasterVolumeVertices; - size_t vertexCount = intersectFrustumWithBox(wsClippedShadowCasterVolumeVertices, - wsLightFrustum, wsLightFrustumCorners, wsShadowCastersVolume); - - // compute shadow-caster bounds in light space - Aabb box = compute2DBounds(lightView, wsClippedShadowCasterVolumeVertices.data(), vertexCount); - - // intersect shadow-caster and current light frustum bounds - lightFrustum.min.xy = max(box.min.xy, lightFrustum.min.xy); - lightFrustum.max.xy = min(box.max.xy, lightFrustum.max.xy); -} - -void ShadowMap::computeFrustumCorners(float3* UTILS_RESTRICT out, - const mat4f& UTILS_RESTRICT projectionViewInverse, float2 csNearFar) noexcept { + Corners out; // compute view frustum in world space (from its NDC) // matrix to convert: ndc -> camera -> world - float near = csNearFar.x; - float far = csNearFar.y; - float3 csViewFrustumCorners[8] = { - { -1, -1, far }, - { 1, -1, far }, - { -1, 1, far }, - { 1, 1, far }, - { -1, -1, near }, - { 1, -1, near }, - { -1, 1, near }, - { 1, 1, near }, + float const near = -1.0f; + float const far = 1.0f; + + Corners const csViewFrustumCorners = { + .vertices = { + { -1, -1, far }, + { 1, -1, far }, + { -1, 1, far }, + { 1, 1, far }, + { -1, -1, near }, + { 1, -1, near }, + { -1, 1, near }, + { 1, 1, near }, + } }; - for (float3 c : csViewFrustumCorners) { - *out++ = mat4f::project(projectionViewInverse, c); + + for (size_t i = 0; i < csViewFrustumCorners.size(); i++) { + out[i] = mat4f::project(projectionInverse, csViewFrustumCorners[i]); + } + + return out; +} + +Aabb ShadowMap::computeLightFrustumBounds(mat4f const& lightView, + Aabb const& wsShadowReceiversVolume, Aabb const& wsShadowCastersVolume, + SceneInfo const& sceneInfo, + bool const stable, bool const focusShadowCasters, bool const farUsesShadowCasters) noexcept { + Aabb lsLightFrustumBounds{}; + + float const receiversFar = sceneInfo.lsReceiversNearFar[1]; + float const castersNear = sceneInfo.lsCastersNearFar[0]; + float const castersFar = sceneInfo.lsCastersNearFar[1]; + + Aabb const lsReceiversBounds = compute2DBounds(lightView, wsShadowReceiversVolume); + // far plane from receivers + lsLightFrustumBounds.min = { lsReceiversBounds.min.xy, receiversFar }; + // near plane from casters + lsLightFrustumBounds.max = { lsReceiversBounds.max.xy, castersNear }; + + if (UTILS_LIKELY(!stable && focusShadowCasters)) { + // For directional lights, we further constraint the light frustum to the + // intersection of the shadow casters & shadow receivers in light-space. + // ** This relies on the 1-texel shadow map border ** + Aabb const lsCastersBounds = compute2DBounds(lightView, wsShadowCastersVolume); + // intersection of in light space of casters and receiver + lsLightFrustumBounds.min.xy = max(lsLightFrustumBounds.min.xy, lsCastersBounds.min.xy); + lsLightFrustumBounds.max.xy = min(lsLightFrustumBounds.max.xy, lsCastersBounds.max.xy); } + + if (farUsesShadowCasters) { + // far: closest of the farthest shadow casters and receivers + lsLightFrustumBounds.min.z = max(lsLightFrustumBounds.min.z, castersFar); + } + return lsLightFrustumBounds; } void ShadowMap::snapLightFrustum(float2& s, float2& o, - mat4f const& Mv, float3 worldOrigin, float2 shadowMapResolution) noexcept { + double2 const lsRef, int2 const resolution) noexcept { + + auto proj2 = [](mat4 m, double2 const v) -> double2 { + double2 p; + p.x = dot(double2{ m[0].x, m[1].x }, v) + m[3].x; + p.y = dot(double2{ m[0].y, m[1].y }, v) + m[3].y; + return p; + }; - auto fmod = [](float2 x, float2 y) -> float2 { - auto mod = [](float x, float y) -> float { return std::fmod(x, y); }; - return float2{ mod(x[0], y[0]), mod(x[1], y[1]) }; + auto fract = [](auto v) { + using namespace std; + using T = decltype(v); + return fmod(v, T{1}); }; - // This snaps the shadow map bounds to texels. - // The 2.0 comes from Mv having a NDC in the range -1,1 (so a range of 2). - const float2 r = 2.0f * shadowMapResolution; - o -= fmod(o, r); + const mat4 F(mat4::row_major_init { + s.x, 0.0, 0.0, o.x, + 0.0, s.y, 0.0, o.y, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0, + }); + + // The (resolution * 0.5) comes from Mv having a NDC in the range -1,1 (so a range of 2). + // Another (resolution * 0.5) is there to snap on even texels, which helps with debugging // This offsets the texture coordinates, so it has a fixed offset w.r.t the world - const float2 lsOrigin = mat4f::project(Mv, worldOrigin).xy * s; - o -= fmod(lsOrigin, r); + // F * Mv * ref + + double2 const lsFocusedOrigin = proj2(F, lsRef); + double2 const d = fract(lsFocusedOrigin * (resolution * 0.25)) / (resolution * 0.25); + + // adjust offset + o -= d; } size_t ShadowMap::intersectFrustumWithBox( FrustumBoxIntersection& UTILS_RESTRICT outVertices, - Frustum const& UTILS_RESTRICT wsFrustum, - float3 const* UTILS_RESTRICT wsFrustumCorners, - Aabb const& UTILS_RESTRICT wsBox) + mat4f const& UTILS_RESTRICT projection, + Aabb const& UTILS_RESTRICT box) { + Frustum const frustum{ projection }; + Corners const frustumVertices{ computeFrustumCorners(inverse(projection)) }; + constexpr const float EPSILON = 1.0f / 8192.0f; // ~0.012 mm size_t vertexCount = 0; @@ -864,16 +939,16 @@ size_t ShadowMap::intersectFrustumWithBox( */ // world-space scene volume - const Aabb::Corners wsSceneReceiversCorners = wsBox.getCorners(); + const Aabb::Corners boxCorners = box.getCorners(); // a) Keep the frustum's vertices that are known to be inside the scene's box UTILS_NOUNROLL for (size_t i = 0; i < 8; i++) { - float3 p = wsFrustumCorners[i]; + float3 const p = frustumVertices[i]; outVertices[vertexCount] = p; - if ((p.x >= wsBox.min.x && p.x <= wsBox.max.x) && - (p.y >= wsBox.min.y && p.y <= wsBox.max.y) && - (p.z >= wsBox.min.z && p.z <= wsBox.max.z)) { + if ((p.x >= box.min.x && p.x <= box.max.x) && + (p.y >= box.min.y && p.y <= box.max.y) && + (p.z >= box.min.z && p.z <= box.max.z)) { vertexCount++; } } @@ -881,7 +956,7 @@ size_t ShadowMap::intersectFrustumWithBox( // at this point if we have 8 vertices, we can skip the rest if (vertexCount < 8) { const size_t frustumVerticesInsideBoxCount = vertexCount; - float4 const* wsFrustumPlanes = wsFrustum.getNormalizedPlanes(); + float4 const* frustumPlanes = frustum.getNormalizedPlanes(); // b) add the scene's vertices that are known to be inside the view frustum // @@ -889,14 +964,14 @@ size_t ShadowMap::intersectFrustumWithBox( // the frustum. This actually often happens due to fitting light-space // We fudge the distance to the plane by a small amount. #pragma nounroll - for (float3 p : wsSceneReceiversCorners) { + for (float3 const p : boxCorners) { outVertices[vertexCount] = p; - float l = dot(wsFrustumPlanes[0].xyz, p) + wsFrustumPlanes[0].w; - float b = dot(wsFrustumPlanes[1].xyz, p) + wsFrustumPlanes[1].w; - float r = dot(wsFrustumPlanes[2].xyz, p) + wsFrustumPlanes[2].w; - float t = dot(wsFrustumPlanes[3].xyz, p) + wsFrustumPlanes[3].w; - float f = dot(wsFrustumPlanes[4].xyz, p) + wsFrustumPlanes[4].w; - float n = dot(wsFrustumPlanes[5].xyz, p) + wsFrustumPlanes[5].w; + float const l = dot(frustumPlanes[0].xyz, p) + frustumPlanes[0].w; + float const b = dot(frustumPlanes[1].xyz, p) + frustumPlanes[1].w; + float const r = dot(frustumPlanes[2].xyz, p) + frustumPlanes[2].w; + float const t = dot(frustumPlanes[3].xyz, p) + frustumPlanes[3].w; + float const f = dot(frustumPlanes[4].xyz, p) + frustumPlanes[4].w; + float const n = dot(frustumPlanes[5].xyz, p) + frustumPlanes[5].w; if ((l <= EPSILON) && (b <= EPSILON) && (r <= EPSILON) && (t <= EPSILON) && (f <= EPSILON) && (n <= EPSILON)) { @@ -949,11 +1024,11 @@ size_t ShadowMap::intersectFrustumWithBox( if (boxVerticesInsideFrustumCount < 8) { // c) intersect scene's volume edges with frustum planes vertexCount = intersectFrustum(outVertices.data(), vertexCount, - wsSceneReceiversCorners.vertices, wsFrustumCorners); + boxCorners.vertices, frustumVertices.vertices); // d) intersect frustum edges with the scene's volume planes vertexCount = intersectFrustum(outVertices.data(), vertexCount, - wsFrustumCorners, wsSceneReceiversCorners.vertices); + frustumVertices.vertices, boxCorners.vertices); } else { // by construction vertexCount should be 8 here, but it can be more because // step (b) above can classify a point as inside the frustum that isn't quite inside. @@ -981,7 +1056,7 @@ size_t ShadowMap::intersectFrustum( const float3 s0{ segmentsVertices[segment.v0] }; const float3 s1{ segmentsVertices[segment.v1] }; // each segment should only intersect with 2 quads at most - size_t maxVertexCount = vertexCount + 2; + size_t const maxVertexCount = vertexCount + 2; for (size_t j = 0; j < 6 && vertexCount < maxVertexCount; ++j) { const Quad quad = sBoxQuads[j]; const float3 t0{ quadsVertices[quad.v0] }; @@ -1036,13 +1111,13 @@ inline bool ShadowMap::intersectSegmentWithTriangle(float3& UTILS_RESTRICT p, bool ShadowMap::intersectSegmentWithPlanarQuad(float3& UTILS_RESTRICT p, float3 s0, float3 s1, float3 t0, float3 t1, float3 t2, float3 t3) noexcept { - bool hit = intersectSegmentWithTriangle(p, s0, s1, t0, t1, t2) || - intersectSegmentWithTriangle(p, s0, s1, t0, t2, t3); + bool const hit = intersectSegmentWithTriangle(p, s0, s1, t0, t1, t2) || + intersectSegmentWithTriangle(p, s0, s1, t0, t2, t3); return hit; } float ShadowMap::texelSizeWorldSpace(const mat3f& worldToShadowTexture, - uint16_t shadowDimension) const noexcept { + uint16_t shadowDimension) noexcept { // The Jacobian of the transformation from texture-to-world is the matrix itself for // orthographic projections. We just need to inverse worldToShadowTexture, // which is guaranteed to be orthographic. @@ -1057,7 +1132,7 @@ float ShadowMap::texelSizeWorldSpace(const mat3f& worldToShadowTexture, } float ShadowMap::texelSizeWorldSpace(const mat4f& Wp, const mat4f& MbMtF, - uint16_t shadowDimension) const noexcept { + uint16_t shadowDimension) noexcept { // Here we compute the Jacobian of inverse(MbMtF * Wp). // The expression below has been computed with Mathematica. However, it's not very hard, // albeit error-prone, to do it by hand because MbMtF is a linear transform. @@ -1070,7 +1145,7 @@ float ShadowMap::texelSizeWorldSpace(const mat4f& Wp, const mat4f& MbMtF, // The Jacobian is not constant, so we evaluate it in the center of the shadow-map texture. // It might be better to do this computation in the vertex shader. - float3 p = {0.5, 0.5, 0.0}; + float3 const p = { 0.5f, 0.5f, 0.0f }; const float ures = 1.0f / float(shadowDimension); const float vres = 1.0f / float(shadowDimension); @@ -1078,7 +1153,7 @@ float ShadowMap::texelSizeWorldSpace(const mat4f& Wp, const mat4f& MbMtF, constexpr bool JACOBIAN_ESTIMATE = false; if constexpr (JACOBIAN_ESTIMATE) { - // this estimates the Jacobian -- this is a lot heavier. This is mostly for reference + // This estimates the Jacobian -- this is a lot heavier. This is mostly for reference // and testing. const mat4f Si(inverse(MbMtF * Wp)); const float3 p0 = mat4f::project(Si, p); @@ -1115,26 +1190,26 @@ float ShadowMap::texelSizeWorldSpace(const mat4f& Wp, const mat4f& MbMtF, 0.0f, j * Z * sx, j * dz * sx }); - float3 Jx = J[0] * ures; - float3 Jy = J[1] * vres; - UTILS_UNUSED float3 Jz = J[2] * dres; + float3 const Jx = J[0] * ures; + float3 const Jy = J[1] * vres; + UTILS_UNUSED float3 const Jz = J[2] * dres; const float s = std::max(length(Jx), length(Jy)); return s; } template -void ShadowMap::visitScene(const FScene& scene, uint32_t visibleLayers, +void ShadowMap::visitScene(const FScene& scene, uint32_t const visibleLayers, Casters casters, Receivers receivers) noexcept { SYSTRACE_CALL(); using State = FRenderableManager::Visibility; - FScene::RenderableSoa const& UTILS_RESTRICT soa = scene.getRenderableData(); - float3 const* const UTILS_RESTRICT worldAABBCenter = soa.data(); - float3 const* const UTILS_RESTRICT worldAABBExtent = soa.data(); - uint8_t const* const UTILS_RESTRICT layers = soa.data(); - State const* const UTILS_RESTRICT visibility = soa.data(); - auto const* const UTILS_RESTRICT visibleMasks = soa.data(); - size_t c = soa.size(); + FScene::RenderableSoa const& soa = scene.getRenderableData(); + float3 const* const worldAABBCenter = soa.data(); + float3 const* const worldAABBExtent = soa.data(); + uint8_t const* const layers = soa.data(); + State const* const visibility = soa.data(); + auto const* const visibleMasks = soa.data(); + size_t const c = soa.size(); for (size_t i = 0; i < c; i++) { if (layers[i] & visibleLayers) { const Aabb aabb{ worldAABBCenter[i] - worldAABBExtent[i], @@ -1149,97 +1224,136 @@ void ShadowMap::visitScene(const FScene& scene, uint32_t visibleLayers, } } -void ShadowMap::initSceneInfo(ShadowMap::SceneInfo& sceneInfo, - uint8_t visibleLayers, FScene const& scene, mat4f const& viewMatrix) { - sceneInfo.csNearFar = { -1.0f, 1.0f }; - sceneInfo.lsNearFar = {}; - sceneInfo.visibleLayers = visibleLayers; - sceneInfo.vsNearFar = { std::numeric_limits::lowest(), std::numeric_limits::max() }; +ShadowMap::SceneInfo::SceneInfo( + FScene const& scene, uint8_t const visibleLayers) noexcept + : visibleLayers(visibleLayers) { + + // the code below only works with affine transforms + // Filament's API requires viewMatrix to be rigid (and thus affine). // We assume the light is at the origin to compute the SceneInfo. This is consumed later by // computeShadowCameraDirectional() which takes this into account. // Compute scene bounds in world space, as well as the light-space and view-space near/far planes - sceneInfo.wsShadowCastersVolume = {}; - sceneInfo.wsShadowReceiversVolume = {}; - visitScene(scene, sceneInfo.visibleLayers, + wsShadowCastersVolume = {}; + wsShadowReceiversVolume = {}; + visitScene(scene, visibleLayers, [&](Aabb caster, Culler::result_type) { - sceneInfo.wsShadowCastersVolume.min = - min(sceneInfo.wsShadowCastersVolume.min, caster.min); - sceneInfo.wsShadowCastersVolume.max = - max(sceneInfo.wsShadowCastersVolume.max, caster.max); + wsShadowCastersVolume.min = min(wsShadowCastersVolume.min, caster.min); + wsShadowCastersVolume.max = max(wsShadowCastersVolume.max, caster.max); }, [&](Aabb receiver, Culler::result_type) { - sceneInfo.wsShadowReceiversVolume.min = - min(sceneInfo.wsShadowReceiversVolume.min, receiver.min); - sceneInfo.wsShadowReceiversVolume.max = - max(sceneInfo.wsShadowReceiversVolume.max, receiver.max); - float2 nf = ShadowMap::computeNearFar(viewMatrix, receiver); - sceneInfo.vsNearFar.x = std::max(sceneInfo.vsNearFar.x, nf.x); - sceneInfo.vsNearFar.y = std::min(sceneInfo.vsNearFar.y, nf.y); + wsShadowReceiversVolume.min = min(wsShadowReceiversVolume.min, receiver.min); + wsShadowReceiversVolume.max = max(wsShadowReceiversVolume.max, receiver.max); } ); } void ShadowMap::updateSceneInfoDirectional(mat4f const& Mv, FScene const& scene, SceneInfo& sceneInfo) { - sceneInfo.lsNearFar = { std::numeric_limits::lowest(), std::numeric_limits::max() }; + + // the code below only works with affine transforms + assert_invariant(transpose(Mv)[3] == float4(0, 0, 0, 1)); + + sceneInfo.lsCastersNearFar = { std::numeric_limits::lowest(), std::numeric_limits::max() }; + sceneInfo.lsReceiversNearFar = { std::numeric_limits::lowest(), std::numeric_limits::max() }; visitScene(scene, sceneInfo.visibleLayers, [&](Aabb caster, Culler::result_type) { - float2 nf = ShadowMap::computeNearFar(Mv, caster); - sceneInfo.lsNearFar.x = std::max(sceneInfo.lsNearFar.x, nf.x); // near - sceneInfo.lsNearFar.y = std::min(sceneInfo.lsNearFar.y, nf.y); // far + auto r = Aabb::transform(Mv.upperLeft(), Mv[3].xyz, caster); + sceneInfo.lsCastersNearFar.x = max(sceneInfo.lsCastersNearFar.x, r.max.z); + sceneInfo.lsCastersNearFar.y = min(sceneInfo.lsCastersNearFar.y, r.min.z); }, - [&](Aabb receiver, Culler::result_type) { + [&](Aabb receiver, Culler::result_type const vis) { + // account only for objects that are visible by the camera + auto mask = 1u << VISIBLE_RENDERABLE_BIT; + if ((vis & mask) == mask) { + auto r = Aabb::transform(Mv.upperLeft(), Mv[3].xyz, receiver); + sceneInfo.lsReceiversNearFar.x = max(sceneInfo.lsReceiversNearFar.x, r.max.z); + sceneInfo.lsReceiversNearFar.y = min(sceneInfo.lsReceiversNearFar.y, r.min.z); + } } ); } void ShadowMap::updateSceneInfoSpot(mat4f const& Mv, FScene const& scene, SceneInfo& sceneInfo) { - sceneInfo.lsNearFar = { std::numeric_limits::lowest(), std::numeric_limits::max() }; - sceneInfo.vsNearFar = { std::numeric_limits::lowest(), std::numeric_limits::max() }; + + // the code below only works with affine transforms + assert_invariant(transpose(Mv)[3] == float4(0, 0, 0, 1)); + + sceneInfo.lsCastersNearFar = { std::numeric_limits::lowest(), std::numeric_limits::max() }; + // account only for objects that are visible by both the camera and the light visitScene(scene, sceneInfo.visibleLayers, - [&](Aabb caster, Culler::result_type mask) { - if (mask & VISIBLE_DYN_SHADOW_RENDERABLE) { - float2 nf = ShadowMap::computeNearFar(Mv, caster); - sceneInfo.lsNearFar.x = std::max(sceneInfo.lsNearFar.x, nf.x); // near - sceneInfo.lsNearFar.y = std::min(sceneInfo.lsNearFar.y, nf.y); // far + [&](Aabb caster, Culler::result_type const vis) { + auto mask = VISIBLE_DYN_SHADOW_RENDERABLE; + if ((vis & mask) == mask) { + auto r = Aabb::transform(Mv.upperLeft(), Mv[3].xyz, caster); + sceneInfo.lsCastersNearFar.x = std::max(sceneInfo.lsCastersNearFar.x, r.max.z); // near + sceneInfo.lsCastersNearFar.y = std::min(sceneInfo.lsCastersNearFar.y, r.min.z); // far } }, [&](Aabb receiver, Culler::result_type) { } ); } +void ShadowMap::setAllocation(uint8_t const layer, backend::Viewport viewport) noexcept { + mLayer = layer; + mOffset = { viewport.left, viewport.bottom }; +} backend::Viewport ShadowMap::getViewport() const noexcept { - // We set a viewport with a 1-texel border for when we index outside the - // texture. This can only happen for the directional light when "focus shadow casters is used". + // We set a viewport with a 1-texel border for when we index outside the texture. + // This happens only for directional lights when "focus shadow casters" is used, + // or when shadowFar is smaller than the camera far. + // For spot- and point-lights we also use a 1-texel border, so that bilinear filtering + // can work properly if the shadowmap is in an atlas (and we can't rely on h/w clamp). const uint32_t dim = mOptions->mapSize; const uint16_t border = 1u; - return { border, border, dim - 2u * border, dim - 2u * border }; + return { mOffset.x + border, mOffset.y + border, dim - 2u * border, dim - 2u * border }; } backend::Viewport ShadowMap::getScissor() const noexcept { - // We set a viewport with a 1-texel border for when we index outside the - // texture. This can only happen for the directional light when "focus shadow casters is used". + // We set a viewport with a 1-texel border for when we index outside the texture. + // This happens only for directional lights when "focus shadow casters" is used, + // or when shadowFar is smaller than the camera far. + // For spot- and point-lights we also use a 1-texel border, so that bilinear filtering + // can work properly if the shadowmap is in an atlas (and we can't rely on h/w clamp), so we + // don't scissor the border, so it gets filled with correct neighboring texels. const uint32_t dim = mOptions->mapSize; const uint16_t border = 1u; - switch (mShadowType) { case ShadowType::DIRECTIONAL: - return { border, border, dim - 2u * border, dim - 2u * border }; + return { mOffset.x + border, mOffset.y + border, dim - 2u * border, dim - 2u * border }; case ShadowType::SPOT: case ShadowType::POINT: - default: - return { 0, 0, dim, dim }; + return { mOffset.x, mOffset.y, dim, dim }; } } -math::float4 ShadowMap::getViewportNormalized(ShadowMapInfo const& shadowMapInfo) const noexcept { - const auto [l, b, w, h] = getViewport(); - const float texel = 1.0f / float(shadowMapInfo.atlasDimension); - const float4 v = float4{ l, b, l + w, b + h } * texel; +float4 ShadowMap::getClampToEdgeCoords(ShadowMapInfo const& shadowMapInfo) const noexcept { + float border; // shadowmap border in texels + switch (mShadowType) { + case ShadowType::DIRECTIONAL: + // For directional lights, we need to allow the sampling to reach the border, it + // happens when "focus shadow casters" is used for instance. + border = 0.5f; + break; + case ShadowType::SPOT: + case ShadowType::POINT: + // For spot and point light, this is equal to the viewport. i.e. the valid + // texels are inside the viewport (w/ 1-texel border), the border will be used + // for bilinear filtering. + border = 1.0f; + break; + } + + float const texel = 1.0f / float(shadowMapInfo.atlasDimension); + float const dim = float(mOptions->mapSize); + float const l = float(mOffset.x) + border; + float const b = float(mOffset.y) + border; + float const w = dim - 2.0f * border; + float const h = dim - 2.0f * border; + float4 const v = float4{ l, b, l + w, b + h } * texel; if (shadowMapInfo.textureSpaceFlipped) { // this is equivalent to calling uvToRenderTargetUV() in the shader *after* clamping // texture coordinates to this normalized viewport. @@ -1251,36 +1365,36 @@ math::float4 ShadowMap::getViewportNormalized(ShadowMapInfo const& shadowMapInfo // ------------------------------------------------------------------------------------------------ void ShadowMap::prepareCamera(Transaction const& transaction, - FEngine& engine, const CameraInfo& cameraInfo) noexcept { - PerShadowMapUniforms::prepareCamera(transaction, engine, cameraInfo); - PerShadowMapUniforms::prepareLodBias(transaction, 0.0f); + DriverApi& driver, const CameraInfo& cameraInfo) noexcept { + ShadowMapDescriptorSet::prepareCamera(transaction, driver, cameraInfo); + ShadowMapDescriptorSet::prepareLodBias(transaction, 0.0f); } void ShadowMap::prepareViewport(Transaction const& transaction, backend::Viewport const& viewport) noexcept { - PerShadowMapUniforms::prepareViewport(transaction, viewport); + ShadowMapDescriptorSet::prepareViewport(transaction, viewport); } void ShadowMap::prepareTime(Transaction const& transaction, - FEngine& engine, math::float4 const& userTime) noexcept { - PerShadowMapUniforms::prepareTime(transaction, engine, userTime); + FEngine const& engine, float4 const& userTime) noexcept { + ShadowMapDescriptorSet::prepareTime(transaction, engine, userTime); } void ShadowMap::prepareShadowMapping(Transaction const& transaction, - bool highPrecision) noexcept { - PerShadowMapUniforms::prepareShadowMapping(transaction, highPrecision); + bool const highPrecision) noexcept { + ShadowMapDescriptorSet::prepareShadowMapping(transaction, highPrecision); } -PerShadowMapUniforms::Transaction ShadowMap::open(DriverApi& driver) noexcept { - return PerShadowMapUniforms::open(driver); +ShadowMapDescriptorSet::Transaction ShadowMap::open(DriverApi& driver) noexcept { + return ShadowMapDescriptorSet::open(driver); } void ShadowMap::commit(Transaction& transaction, - backend::DriverApi& driver) const noexcept { - mPerShadowMapUniforms.commit(transaction, driver); + FEngine& engine, DriverApi& driver) const noexcept { + mPerShadowMapUniforms.commit(transaction, engine, driver); } -void ShadowMap::bind(backend::DriverApi& driver) const noexcept { +void ShadowMap::bind(DriverApi& driver) const noexcept { mPerShadowMapUniforms.bind(driver); } diff --git a/filament/src/ShadowMap.h b/filament/src/ShadowMap.h index 214ed4a31dc..764f02553bb 100644 --- a/filament/src/ShadowMap.h +++ b/filament/src/ShadowMap.h @@ -17,19 +17,30 @@ #ifndef TNT_FILAMENT_DETAILS_SHADOWMAP_H #define TNT_FILAMENT_DETAILS_SHADOWMAP_H -#include "components/LightManager.h" +#include -#include "PerShadowMapUniforms.h" +#include "Culler.h" +#include "ds/ShadowMapDescriptorSet.h" #include "details/Camera.h" #include "details/Scene.h" +#include "components/LightManager.h" + #include +#include -#include +#include -#include +#include +#include #include +#include + +#include + +#include +#include namespace filament { @@ -38,12 +49,12 @@ class RenderPass; // The value of the 'VISIBLE_MASK' after culling. Each bit represents visibility in a frustum // (either camera or light). // -// 1 -// bits 5 ... 7 6 5 4 3 2 1 0 -// +------------------------------------------------------+ -// VISIBLE_RENDERABLE X -// VISIBLE_DIR_SHADOW_RENDERABLE X -// VISIBLE_DYN_SHADOW_RENDERABLE X +// +// bits 7 6 5 4 3 2 1 0 +// +---------------------------------------------+ +// VISIBLE_RENDERABLE X +// VISIBLE_DIR_SHADOW_RENDERABLE X +// VISIBLE_DYN_SHADOW_RENDERABLE X // A "shadow renderable" is a renderable rendered to the shadow map during a shadow pass: // PCF shadows: only shadow casters @@ -53,6 +64,7 @@ static constexpr size_t VISIBLE_RENDERABLE_BIT = 0u; static constexpr size_t VISIBLE_DIR_SHADOW_RENDERABLE_BIT = 1u; static constexpr size_t VISIBLE_DYN_SHADOW_RENDERABLE_BIT = 2u; +static constexpr Culler::result_type VISIBLE_RENDERABLE = 1u << VISIBLE_RENDERABLE_BIT; static constexpr Culler::result_type VISIBLE_DIR_SHADOW_RENDERABLE = 1u << VISIBLE_DIR_SHADOW_RENDERABLE_BIT; static constexpr Culler::result_type VISIBLE_DYN_SHADOW_RENDERABLE = 1u << VISIBLE_DYN_SHADOW_RENDERABLE_BIT; @@ -95,16 +107,14 @@ class ShadowMap { }; struct SceneInfo { - // scratch data: The near and far planes, in clip space, to use for this shadow map - math::float2 csNearFar = { -1.0f, 1.0f }; + + SceneInfo() noexcept = default; + SceneInfo(FScene const& scene, uint8_t visibleLayers) noexcept; // scratch data: light's near/far expressed in light-space, calculated from the scene's // content assuming the light is at the origin. - math::float2 lsNearFar{}; - - // scratch data: Viewing camera's near/far expressed in view-space, calculated from the - // scene's content. - math::float2 vsNearFar{}; + math::float2 lsCastersNearFar; + math::float2 lsReceiversNearFar; // World-space shadow-casters volume Aabb wsShadowCastersVolume; @@ -115,8 +125,8 @@ class ShadowMap { uint8_t visibleLayers; }; - static math::mat4f getDirectionalLightViewMatrix( - math::float3 direction, math::float3 position = {}) noexcept; + static math::mat4f getDirectionalLightViewMatrix(math::float3 direction, math::float3 up, + math::float3 position = {}) noexcept; static math::mat4f getPointLightViewMatrix(backend::TextureCubemapFace face, math::float3 position) noexcept; @@ -135,21 +145,20 @@ class ShadowMap { // This computes the light's camera. ShaderParameters updateDirectional(FEngine& engine, const FScene::LightSoa& lightData, size_t index, - filament::CameraInfo const& camera, - ShadowMapInfo const& shadowMapInfo, FScene const& scene, - SceneInfo& sceneInfo) noexcept; + CameraInfo const& camera, + ShadowMapInfo const& shadowMapInfo, + SceneInfo const& sceneInfo, + bool useDepthClamp) noexcept; ShaderParameters updateSpot(FEngine& engine, const FScene::LightSoa& lightData, size_t index, - filament::CameraInfo const& camera, + CameraInfo const& camera, const ShadowMapInfo& shadowMapInfo, FScene const& scene, SceneInfo sceneInfo) noexcept; ShaderParameters updatePoint(FEngine& engine, - const FScene::LightSoa& lightData, size_t index, - filament::CameraInfo const& camera, const ShadowMapInfo& shadowMapInfo, - FScene const& scene, - SceneInfo sceneInfo, uint8_t face) noexcept; + const FScene::LightSoa& lightData, size_t index, CameraInfo const& camera, + const ShadowMapInfo& shadowMapInfo, FScene const& scene, uint8_t face) noexcept; // Do we have visible shadows. Valid after calling update(). bool hasVisibleShadows() const noexcept { return mHasVisibleShadows; } @@ -158,12 +167,7 @@ class ShadowMap { FCamera const& getCamera() const noexcept { return *mCamera; } // use only for debugging - FCamera const& getDebugCamera() const noexcept { return *mDebugCamera; } - - // Call once per frame to populate the SceneInfo struct, then pass to update(). - // This computes values constant across all shadow maps. - static void initSceneInfo(ShadowMap::SceneInfo& sceneInfo, uint8_t visibleLayers, - FScene const& scene, math::mat4f const& viewMatrix); + FCamera const* getDebugCamera() const noexcept { return mDebugCamera; } // Update SceneInfo struct for a given light static void updateSceneInfoDirectional(const math::mat4f& Mv, FScene const& scene, @@ -175,7 +179,8 @@ class ShadowMap { LightManager::ShadowOptions const* getShadowOptions() const noexcept { return mOptions; } size_t getLightIndex() const { return mLightIndex; } uint16_t getShadowIndex() const { return mShadowIndex; } - void setLayer(uint8_t layer) noexcept { mLayer = layer; } + void setAllocation(uint8_t layer, backend::Viewport viewport) noexcept; + uint8_t getLayer() const noexcept { return mLayer; } backend::Viewport getViewport() const noexcept; backend::Viewport getScissor() const noexcept; @@ -186,19 +191,18 @@ class ShadowMap { ShadowType getShadowType() const noexcept { return mShadowType; } uint8_t getFace() const noexcept { return mFace; } - using Transaction = PerShadowMapUniforms::Transaction; + using Transaction = ShadowMapDescriptorSet::Transaction; static void prepareCamera(Transaction const& transaction, - FEngine& engine, const CameraInfo& cameraInfo) noexcept; + backend::DriverApi& driver, const CameraInfo& cameraInfo) noexcept; static void prepareViewport(Transaction const& transaction, backend::Viewport const& viewport) noexcept; static void prepareTime(Transaction const& transaction, - FEngine& engine, math::float4 const& userTime) noexcept; + FEngine const& engine, math::float4 const& userTime) noexcept; static void prepareShadowMapping(Transaction const& transaction, bool highPrecision) noexcept; - static PerShadowMapUniforms::Transaction open(backend::DriverApi& driver) noexcept; - void commit(Transaction& transaction, - backend::DriverApi& driver) const noexcept; + static ShadowMapDescriptorSet::Transaction open(backend::DriverApi& driver) noexcept; + void commit(Transaction& transaction, FEngine& engine, backend::DriverApi& driver) const noexcept; void bind(backend::DriverApi& driver) const noexcept; private: @@ -210,6 +214,8 @@ class ShadowMap { uint8_t v0, v1, v2, v3; }; + using Corners = Aabb::Corners; + // 8 corners, 12 segments w/ 2 intersection max -- all of this twice (8 + 12 * 2) * 2 (768 bytes) using FrustumBoxIntersection = std::array; @@ -218,20 +224,49 @@ class ShadowMap { const ShadowMapInfo& shadowMapInfo, const FLightManager::ShadowParams& params) noexcept; + struct DirectionalShadowBounds { + math::mat4f Mv; + float zNear; + float zFar; + FrustumBoxIntersection lsClippedShadowVolume; + size_t vertexCount; + bool visibleShadows = false; + }; + + static DirectionalShadowBounds computeDirectionalShadowBounds( + FEngine& engine, + math::float3 direction, + FLightManager::ShadowParams params, + CameraInfo const& camera, + SceneInfo const& sceneInfo, + bool useDepthClamp) noexcept; + static math::mat4f applyLISPSM(math::mat4f& Wp, - filament::CameraInfo const& camera, FLightManager::ShadowParams const& params, + CameraInfo const& camera, FLightManager::ShadowParams const& params, + const math::mat4f& LMp, + const math::mat4f& Mv, const math::mat4f& LMpMv, - FrustumBoxIntersection const& wsShadowReceiverVolume, size_t vertexCount, + FrustumBoxIntersection const& lsShadowVolume, size_t vertexCount, const math::float3& dir); + static inline math::mat4f computeLightRotation(math::float3 const& lsDirection) noexcept; + + static inline math::float4 computeFocusParams( + math::mat4f const& LMpMv, + math::mat4f const& WLMp, + FrustumBoxIntersection const& lsShadowVolume, size_t vertexCount, + CameraInfo const& camera, + float shadowFar, bool stable) noexcept; + static inline void snapLightFrustum(math::float2& s, math::float2& o, - math::mat4f const& Mv, math::float3 worldOrigin, math::float2 shadowMapResolution) noexcept; + math::double2 lsRef, math::int2 resolution) noexcept; - static inline void computeFrustumCorners(math::float3* out, - const math::mat4f& projectionViewInverse, math::float2 csNearFar = { -1.0f, 1.0f }) noexcept; + static inline Aabb computeLightFrustumBounds(const math::mat4f& lightView, + Aabb const& wsShadowReceiversVolume, Aabb const& wsShadowCastersVolume, + SceneInfo const& sceneInfo, + bool stable, bool focusShadowCasters, bool farUsesShadowCasters) noexcept; - static inline math::float2 computeNearFar(math::mat4f const& view, - Aabb const& wsShadowCastersVolume) noexcept; + static Corners computeFrustumCorners(const math::mat4f& projectionInverse) noexcept; static inline math::float2 computeNearFar(math::mat4f const& view, math::float3 const* wsVertices, size_t count) noexcept; @@ -247,10 +282,7 @@ class ShadowMap { math::float3 const* wsVertices, size_t count) noexcept; static inline Aabb compute2DBounds(const math::mat4f& lightView, - math::float4 const& sphere) noexcept; - - static inline void intersectWithShadowCasters(Aabb& lightFrustum, const math::mat4f& lightView, - Aabb const& wsShadowCastersVolume) noexcept; + Aabb const& volume) noexcept; static inline math::float2 computeNearFarOfWarpSpace(math::mat4f const& lightView, math::float3 const* wsVertices, size_t count) noexcept; @@ -269,9 +301,8 @@ class ShadowMap { static size_t intersectFrustumWithBox( FrustumBoxIntersection& outVertices, - Frustum const& wsFrustum, - math::float3 const* wsFrustumCorners, - Aabb const& wsBox); + math::mat4f const& projection, + Aabb const& box); static math::mat4f warpFrustum(float n, float f) noexcept; @@ -287,13 +318,13 @@ class ShadowMap { static math::mat4f computeVsmLightSpaceMatrix(const math::mat4f& lightSpacePcf, const math::mat4f& Mv, float znear, float zfar) noexcept; - math::float4 getViewportNormalized(ShadowMapInfo const& shadowMapInfo) const noexcept; + math::float4 getClampToEdgeCoords(ShadowMapInfo const& shadowMapInfo) const noexcept; - float texelSizeWorldSpace(const math::mat3f& worldToShadowTexture, - uint16_t shadowDimension) const noexcept; + static float texelSizeWorldSpace(const math::mat3f& worldToShadowTexture, + uint16_t shadowDimension) noexcept; - float texelSizeWorldSpace(const math::mat4f& W, const math::mat4f& MbMtF, - uint16_t shadowDimension) const noexcept; + static float texelSizeWorldSpace(const math::mat4f& W, const math::mat4f& MbMtF, + uint16_t shadowDimension) noexcept; static constexpr const Segment sBoxSegments[12] = { { 0, 1 }, { 1, 3 }, { 3, 2 }, { 2, 0 }, @@ -309,7 +340,7 @@ class ShadowMap { { 2, 6, 7, 3 }, // top }; - mutable PerShadowMapUniforms mPerShadowMapUniforms; // 4 + mutable ShadowMapDescriptorSet mPerShadowMapUniforms; // 48 FCamera* mCamera = nullptr; // 8 FCamera* mDebugCamera = nullptr; // 8 @@ -321,8 +352,10 @@ class ShadowMap { uint16_t mShadowIndex = 0; // our index in the shadowMap vector // 2 uint8_t mLayer = 0; // our layer in the shadowMap texture // 1 ShadowType mShadowType : 2; // :2 - bool mHasVisibleShadows : 2; // :2 + bool mHasVisibleShadows : 1; // :1 uint8_t mFace : 3; // :3 + math::ushort2 mOffset{}; // 4 + UTILS_UNUSED uint8_t reserved[4]; // 4 }; } // namespace filament diff --git a/filament/src/ShadowMapManager.cpp b/filament/src/ShadowMapManager.cpp index b6a11cea814..ac8c70d8d94 100644 --- a/filament/src/ShadowMapManager.cpp +++ b/filament/src/ShadowMapManager.cpp @@ -15,17 +15,54 @@ */ #include "ShadowMapManager.h" - +#include "AtlasAllocator.h" #include "RenderPass.h" #include "ShadowMap.h" +#include +#include +#include + +#include +#include + +#include "components/RenderableManager.h" + +#include "details/Camera.h" +#include "details/DebugRegistry.h" #include "details/Texture.h" #include "details/View.h" -#include +#include "fg/FrameGraph.h" +#include "fg/FrameGraphId.h" +#include "fg/FrameGraphRenderPass.h" +#include "fg/FrameGraphTexture.h" + +#include +#include +#include #include #include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include namespace filament { @@ -33,102 +70,159 @@ using namespace backend; using namespace math; ShadowMapManager::ShadowMapManager(FEngine& engine) - : mEngine(engine) { - // initialize our ShadowMap array in-place - UTILS_NOUNROLL - for (auto& entry : mShadowMapCache) { - new (&entry) ShadowMap(engine); - } - - mShadowUbh = engine.getDriverApi().createBufferObject(mShadowUb.getSize(), - BufferObjectBinding::UNIFORM, BufferUsage::DYNAMIC); - + : mIsDepthClampSupported(engine.getDriverApi().isDepthClampSupported()) { FDebugRegistry& debugRegistry = engine.getDebugRegistry(); debugRegistry.registerProperty("d.shadowmap.visualize_cascades", &engine.debug.shadowmap.visualize_cascades); - debugRegistry.registerProperty("d.shadowmap.tightly_bound_scene", - &engine.debug.shadowmap.tightly_bound_scene); + debugRegistry.registerProperty("d.shadowmap.disable_light_frustum_align", + &engine.debug.shadowmap.disable_light_frustum_align); + debugRegistry.registerProperty("d.shadowmap.depth_clamp", + &engine.debug.shadowmap.depth_clamp); + + mFeatureShadowAllocator = engine.features.engine.shadows.use_shadow_atlas; } ShadowMapManager::~ShadowMapManager() { // destroy the ShadowMap array in-place - UTILS_NOUNROLL - for (auto& entry : mShadowMapCache) { - std::destroy_at(std::launder(reinterpret_cast(&entry))); + if (UTILS_UNLIKELY(mInitialized)) { + UTILS_NOUNROLL + for (auto& entry: mShadowMapCache) { + std::destroy_at(std::launder(reinterpret_cast(&entry))); + } } } -void ShadowMapManager::terminate(FEngine& engine) { - DriverApi& driver = engine.getDriverApi(); - driver.destroyBufferObject(mShadowUbh); - UTILS_NOUNROLL - for (auto& entry : mShadowMapCache) { - std::launder(reinterpret_cast(&entry))->terminate(engine); +void ShadowMapManager::createIfNeeded(FEngine& engine, + std::unique_ptr& inOutShadowMapManager) { + if (UTILS_UNLIKELY(!inOutShadowMapManager)) { + inOutShadowMapManager.reset(new ShadowMapManager(engine)); + } +} + +void ShadowMapManager::terminate(FEngine& engine, + std::unique_ptr& shadowMapManager) { + if (shadowMapManager) { + shadowMapManager->terminate(engine); } } +size_t ShadowMapManager::getMaxShadowMapCount() const noexcept { + return mFeatureShadowAllocator ? CONFIG_MAX_SHADOWMAPS : CONFIG_MAX_SHADOW_LAYERS; +} + +void ShadowMapManager::terminate(FEngine& engine) { + if (UTILS_UNLIKELY(mInitialized)) { + DriverApi& driver = engine.getDriverApi(); + driver.destroyBufferObject(mShadowUbh); + UTILS_NOUNROLL + for (auto& entry: mShadowMapCache) { + std::launder(reinterpret_cast(&entry))->terminate(engine); + } + } +} -ShadowMapManager::ShadowTechnique ShadowMapManager::update(FEngine& engine, FView& view, +ShadowMapManager::ShadowTechnique ShadowMapManager::update( + Builder const& builder, + FEngine& engine, FView& view, CameraInfo const& cameraInfo, - FScene::RenderableSoa& renderableData, FScene::LightSoa& lightData) noexcept { + FScene::RenderableSoa& renderableData, FScene::LightSoa const& lightData) noexcept { + + if (!builder.mDirectionalShadowMapCount && !builder.mSpotShadowMapCount) { + // no shadows were recorder + return ShadowTechnique::NONE; + } + + // initialize the shadowmap array the first time + if (UTILS_UNLIKELY(!mInitialized)) { + mInitialized = true; + // initialize our ShadowMap array in-place + mShadowUbh = engine.getDriverApi().createBufferObject(mShadowUb.getSize(), + BufferObjectBinding::UNIFORM, BufferUsage::DYNAMIC); + UTILS_NOUNROLL + for (auto& entry: mShadowMapCache) { + new(&entry) ShadowMap(engine); + } + } + + mDirectionalShadowMapCount = builder.mDirectionalShadowMapCount; + mSpotShadowMapCount = builder.mSpotShadowMapCount; + + for (auto const& entry : builder.mShadowMaps) { + auto& shadowMap = getShadowMap(entry.shadowIndex); + shadowMap.initialize( + entry.lightIndex, + entry.shadowType, + entry.shadowIndex, + entry.face, + entry.options); + } + ShadowTechnique shadowTechnique = {}; calculateTextureRequirements(engine, view, lightData); // Compute scene-dependent values shared across all shadow maps - ShadowMap::initSceneInfo(mSceneInfo, - view.getVisibleLayers(), *view.getScene(), cameraInfo.view); + ShadowMap::SceneInfo const info{ *view.getScene(), view.getVisibleLayers() }; shadowTechnique |= updateCascadeShadowMaps( - engine, view, cameraInfo, renderableData, lightData, mSceneInfo); + engine, view, cameraInfo, renderableData, lightData, info); shadowTechnique |= updateSpotShadowMaps( engine, lightData); - return shadowTechnique; -} + mSceneInfo = info; -void ShadowMapManager::reset() noexcept { - mCascadeShadowMaps.clear(); - mSpotShadowMaps.clear(); + return shadowTechnique; } -void ShadowMapManager::setDirectionalShadowMap(size_t lightIndex, +ShadowMapManager::Builder& ShadowMapManager::Builder::directionalShadowMap(size_t const lightIndex, LightManager::ShadowOptions const* options) noexcept { assert_invariant(options->shadowCascades <= CONFIG_MAX_SHADOW_CASCADES); + // this updates getCascadedShadowMap() + mDirectionalShadowMapCount = options->shadowCascades; for (size_t c = 0; c < options->shadowCascades; c++) { - const size_t i = c; - assert_invariant(i < CONFIG_MAX_SHADOW_CASCADES); - auto* pShadowMap = getShadowMap(i); - pShadowMap->initialize(lightIndex, ShadowType::DIRECTIONAL, i, 0, options); - mCascadeShadowMaps.push_back(pShadowMap); + mShadowMaps.push_back({ + .lightIndex = lightIndex, + .shadowType = ShadowType::DIRECTIONAL, + .shadowIndex = uint8_t(c), + .face = 0, + .options = options }); } + return *this; } -void ShadowMapManager::addShadowMap(size_t lightIndex, bool spotlight, +ShadowMapManager::Builder& ShadowMapManager::Builder::shadowMap(size_t const lightIndex, bool const spotlight, LightManager::ShadowOptions const* options) noexcept { if (spotlight) { - const size_t c = mSpotShadowMaps.size(); + const size_t c = mSpotShadowMapCount++; const size_t i = c + CONFIG_MAX_SHADOW_CASCADES; assert_invariant(i < CONFIG_MAX_SHADOWMAPS); - auto* pShadowMap = getShadowMap(i); - pShadowMap->initialize(lightIndex, ShadowType::SPOT, i, 0, options); - mSpotShadowMaps.push_back(pShadowMap); + mShadowMaps.push_back({ + .lightIndex = lightIndex, + .shadowType = ShadowType::SPOT, + .shadowIndex = uint8_t(i), + .face = 0, + .options = options }); } else { // point-light, generate 6 independent shadowmaps for (size_t face = 0; face < 6; face++) { - const size_t c = mSpotShadowMaps.size(); + const size_t c = mSpotShadowMapCount++; const size_t i = c + CONFIG_MAX_SHADOW_CASCADES; assert_invariant(i < CONFIG_MAX_SHADOWMAPS); - auto* pShadowMap = getShadowMap(i); - pShadowMap->initialize(lightIndex, ShadowType::POINT, i, face, options); - mSpotShadowMaps.push_back(pShadowMap); + mShadowMaps.push_back({ + .lightIndex = lightIndex, + .shadowType = ShadowType::POINT, + .shadowIndex = uint8_t(i), + .face = uint8_t(face), + .options = options }); } } + return *this; } FrameGraphId ShadowMapManager::render(FEngine& engine, FrameGraph& fg, - RenderPass const& pass, FView& view, CameraInfo const& mainCameraInfo, + RenderPassBuilder const& passBuilder, + FView& view, CameraInfo const& mainCameraInfo, float4 const& userTime) noexcept { const float moment2 = std::numeric_limits::max(); @@ -147,7 +241,7 @@ FrameGraphId ShadowMapManager::render(FEngine& engine, FrameG // ------------------------------------------------------------------------------------------- struct PrepareShadowPassData { - struct ShadowPass { + struct ShadowPass { // 112 bytes mutable RenderPass::Executor executor; ShadowMap* shadowMap; utils::Range range; @@ -163,7 +257,7 @@ FrameGraphId ShadowMapManager::render(FEngine& engine, FrameG auto& prepareShadowPass = fg.addPass("Prepare Shadow Pass", [&](FrameGraph::Builder& builder, auto& data) { - data.passList.reserve(CONFIG_MAX_SHADOWMAPS); + data.passList.reserve(getMaxShadowMapCount()); data.shadows = builder.createTexture("Shadowmap", { .width = textureRequirements.size, .height = textureRequirements.size, .depth = textureRequirements.layers, @@ -176,38 +270,74 @@ FrameGraphId ShadowMapManager::render(FEngine& engine, FrameG auto& passList = data.passList; // Directional, cascaded shadow maps - auto const directionalShadowCastersRange = view.getVisibleDirectionalShadowCasters(); - if (!directionalShadowCastersRange.empty()) { - for (auto* pShadowMap : mCascadeShadowMaps) { - // for the directional light, we already know if it has visible shadows. - if (pShadowMap->hasVisibleShadows()) { + // if the view has shadowing enabled, the SRE variant could be used, so we must + // generate the shadow maps + if (view.needsDirectionalShadowMaps()) { + auto const directionalShadowCastersRange = view.getVisibleDirectionalShadowCasters(); + for (auto& shadowMap : getCascadedShadowMap()) { + // For the directional light, we already know if it has visible shadows. + // if hasVisibleShadows() is false, we're guaranteed the shader won't + // sample this shadow map (see PerViewUib::cascades and + // ShadowMapManager::updateCascadeShadowMaps) + if (shadowMap.hasVisibleShadows()) { passList.push_back({ - {}, pShadowMap, directionalShadowCastersRange, + {}, &shadowMap, directionalShadowCastersRange, VISIBLE_DIR_SHADOW_RENDERABLE }); } } } // Point lights and Spotlight shadow maps - auto const spotShadowCastersRange = view.getVisibleSpotShadowCasters(); - if (!spotShadowCastersRange.empty()) { - for (auto* pShadowMap : mSpotShadowMaps) { - assert_invariant(!pShadowMap->isDirectionalShadow()); + // if the view has shadowing enabled, the SRE variant could be used, so we must + // generate the shadow maps + if (view.needsPointShadowMaps()) { + auto const spotShadowCastersRange = view.getVisibleSpotShadowCasters(); + for (auto& shadowMap : getSpotShadowMaps()) { + assert_invariant(!shadowMap.isDirectionalShadow()); + + switch (shadowMap.getShadowType()) { + case ShadowType::DIRECTIONAL: + // we should never be here + break; + case ShadowType::SPOT: + prepareSpotShadowMap(shadowMap, engine, view, mainCameraInfo, + scene->getLightData(), mSceneInfo); + break; + case ShadowType::POINT: + preparePointShadowMap(shadowMap, engine, view, mainCameraInfo, + scene->getLightData()); + break; + } + + // For spot/point lights, shadowMap.hasVisibleShadows() doesn't guarantee + // the shader won't access the shadow map, so we must generate it. passList.push_back({ - {}, pShadowMap, spotShadowCastersRange, + {}, &shadowMap, spotShadowCastersRange, VISIBLE_DYN_SHADOW_RENDERABLE }); } } - assert_invariant(passList.size() <= textureRequirements.layers); + assert_invariant(mFeatureShadowAllocator || + passList.size() <= textureRequirements.layers); + + if (mFeatureShadowAllocator) { + // sort shadow passes by layer so that we can update all the shadow maps of + // a layer in one render pass. + std::sort(passList.begin(), passList.end(), []( + PrepareShadowPassData::ShadowPass const& lhs, + PrepareShadowPassData::ShadowPass const& rhs) { + return lhs.shadowMap->getLayer() < rhs.shadowMap->getLayer(); + }); + } // This pass must be declared as having a side effect because it never gets a // "read" from one of its resource (only writes), so the FrameGraph culls it. builder.sideEffect(); }, - [this, &engine, &view, vsmShadowOptions, - scene, mainCameraInfo, userTime, passTemplate = pass]( - FrameGraphResources const& resources, auto const& data, DriverApi& driver) { + [=, passBuilder = passBuilder, + &engine = const_cast(engine), // FIXME: we want this const + &view = const_cast(view)] + (FrameGraphResources const&, auto const& data, DriverApi& driver) mutable { // Note: we could almost parallel_for the loop below, the problem currently is // that updatePrimitivesLod() updates temporary global state. @@ -217,69 +347,86 @@ FrameGraphId ShadowMapManager::render(FEngine& engine, FrameG // Generate a RenderPass for each shadow map for (auto const& entry : data.passList) { - ShadowMap& shadowMap = *entry.shadowMap; + ShadowMap const& shadowMap = *entry.shadowMap; + + // Note: this loop can generate a lot of commands that come out of the + // "per frame command arena". The allocation persists until the + // end of the frame. + // One way to possibly mitigate this, would be to always use the + // same command buffer for all shadow map, but then we'd generate + // a lot of unneeded draw calls. + // To do this efficiently, we'd need a way to cull draw calls already + // recorded in the command buffer, per shadow map. Maybe this could + // be done with indirect draw calls. + + // Note: the output of culling below is stored in scene->getRenderableData() - // for spot shadow map, we need to do the culling switch (shadowMap.getShadowType()) { case ShadowType::DIRECTIONAL: + // we should never be here break; case ShadowType::SPOT: - prepareSpotShadowMap(shadowMap, engine, view, mainCameraInfo, - scene->getRenderableData(), entry.range, - scene->getLightData(), mSceneInfo); + if (shadowMap.hasVisibleShadows()) { + ShadowMapManager::cullSpotShadowMap(shadowMap, engine, view, + scene->getRenderableData(), entry.range, + scene->getLightData()); + } break; case ShadowType::POINT: - preparePointShadowMap(shadowMap, engine, view, mainCameraInfo, - scene->getRenderableData(), entry.range, - scene->getLightData(), mSceneInfo); + if (shadowMap.hasVisibleShadows()) { + ShadowMapManager::cullPointShadowMap(shadowMap, view, + scene->getRenderableData(), entry.range, + scene->getLightData()); + } break; } - if (shadowMap.hasVisibleShadows()) { - // Note: this loop can generate a lot of commands that come out of the - // "per frame command arena". The allocation persists until the - // end of the frame. - // One way to possibly mitigate this, would be to always use the - // same command buffer for all shadow map, but then we'd generate - // a lot of unneeded draw calls. - // To do this efficiently, we'd need a way to cull draw calls already - // recorded in the command buffer, per shadow map. - - - // cameraInfo only valid after calling update - const CameraInfo cameraInfo{ shadowMap.getCamera() }; - - auto transaction = ShadowMap::open(driver); - ShadowMap::prepareCamera(transaction, engine, cameraInfo); - ShadowMap::prepareViewport(transaction, shadowMap.getViewport()); - ShadowMap::prepareTime(transaction, engine, userTime); - ShadowMap::prepareShadowMapping(transaction, - vsmShadowOptions.highPrecision); - shadowMap.commit(transaction, driver); - - // updatePrimitivesLod must be run before RenderPass::appendCommands. - view.updatePrimitivesLod(engine, - cameraInfo, scene->getRenderableData(), entry.range); - - // generate and sort the commands for rendering the shadow map - RenderPass pass(passTemplate); - pass.setCamera(cameraInfo); - pass.setVisibilityMask(entry.visibilityMask); - pass.setGeometry(scene->getRenderableData(), - entry.range, scene->getRenderableUBO()); - pass.appendCommands(engine, RenderPass::SHADOW); - pass.sortCommands(engine); - - entry.executor = pass.getExecutor(); - - if (!view.hasVSM()) { - auto const* options = shadowMap.getShadowOptions(); - const PolygonOffset polygonOffset = { // handle reversed Z - .slope = -options->polygonOffsetSlope, - .constant = -options->polygonOffsetConstant - }; - entry.executor.overridePolygonOffset(&polygonOffset); - } + // cameraInfo only valid after calling update + const CameraInfo cameraInfo{ shadowMap.getCamera(), mainCameraInfo }; + + auto transaction = ShadowMap::open(driver); + ShadowMap::prepareCamera(transaction, driver, cameraInfo); + ShadowMap::prepareViewport(transaction, shadowMap.getViewport()); + ShadowMap::prepareTime(transaction, engine, userTime); + ShadowMap::prepareShadowMapping(transaction, + vsmShadowOptions.highPrecision); + shadowMap.commit(transaction, engine, driver); + + // updatePrimitivesLod must be run before RenderPass::appendCommands. + FView::updatePrimitivesLod(scene->getRenderableData(), + engine, cameraInfo, entry.range); + + // generate and sort the commands for rendering the shadow map + + RenderPass::RenderFlags renderPassFlags{}; + + bool const canUseDepthClamp = + shadowMap.getShadowType() == ShadowType::DIRECTIONAL && + !view.hasVSM() && + mIsDepthClampSupported && + engine.debug.shadowmap.depth_clamp; + + if (canUseDepthClamp) { + renderPassFlags |= RenderPass::HAS_DEPTH_CLAMP; + } + + RenderPass const pass = passBuilder + .renderFlags(RenderPass::HAS_DEPTH_CLAMP, renderPassFlags) + .camera(cameraInfo) + .visibilityMask(entry.visibilityMask) + .geometry(scene->getRenderableData(), entry.range) + .commandTypeFlags(RenderPass::CommandTypeFlags::SHADOW) + .build(engine, driver); + + entry.executor = pass.getExecutor(); + + if (!view.hasVSM()) { + auto const* options = shadowMap.getShadowOptions(); + PolygonOffset const polygonOffset = { // handle reversed Z + .slope = -options->polygonOffsetSlope, + .constant = -options->polygonOffsetConstant + }; + entry.executor.overridePolygonOffset(&polygonOffset); } } @@ -294,6 +441,8 @@ FrameGraphId ShadowMapManager::render(FEngine& engine, FrameG // Shadow Passes // ------------------------------------------------------------------------------------------- + fg.getBlackboard()["shadowmap"] = prepareShadowPass->shadows; + struct ShadowPassData { FrameGraphId tempBlurSrc{}; // temporary shadowmap when blurring FrameGraphId output; @@ -301,25 +450,35 @@ FrameGraphId ShadowMapManager::render(FEngine& engine, FrameG }; auto const& passList = prepareShadowPass.getData().passList; - for (auto const& entry: passList) { - if (!entry.shadowMap->hasVisibleShadows()) { - continue; - } - + auto first = passList.begin(); + while (first != passList.end()) { + auto const& entry = *first; + const uint8_t layer = entry.shadowMap->getLayer(); const auto* options = entry.shadowMap->getShadowOptions(); const auto msaaSamples = textureRequirements.msaaSamples; + const bool blur = entry.shadowMap->hasVisibleShadows() && + view.hasVSM() && options->vsm.blurWidth > 0.0f; + + auto last = first; + // loop over each shadow pass to find its layer range + while (last != passList.end() && last->shadowMap->getLayer() == layer) { + ++last; + } + assert_invariant(mFeatureShadowAllocator || + std::distance(first, last) == 1); + + // And render all shadow pass of a given layer as a single render pass auto& shadowPass = fg.addPass("Shadow Pass", [&](FrameGraph::Builder& builder, auto& data) { - const bool blur = view.hasVSM() && options->vsm.blurWidth > 0.0f; FrameGraphRenderPass::Descriptor renderTargetDesc{}; data.output = builder.createSubresource(prepareShadowPass->shadows, "Shadowmap Layer", { .layer = layer }); - if (view.hasVSM()) { + if (UTILS_UNLIKELY(view.hasVSM())) { // Each shadow pass has its own sample count, but textures are created with // a default count of 1 because we're using "magic resolve" (sample count is // set on the render target). @@ -331,13 +490,6 @@ FrameGraphId ShadowMapManager::render(FEngine& engine, FrameG .format = TextureFormat::DEPTH16, }); - // Temporary (resolved) texture used to render the shadowmap when blurring - // is needed -- it'll be used as the source of the blur. - data.tempBlurSrc = builder.createTexture("Temporary Shadowmap", { - .width = textureRequirements.size, .height = textureRequirements.size, - .format = textureRequirements.format - }); - depth = builder.write(depth, FrameGraphTexture::Usage::DEPTH_ATTACHMENT); @@ -352,7 +504,15 @@ FrameGraphId ShadowMapManager::render(FEngine& engine, FrameG renderTargetDesc.clearColor = vsmClearColor; renderTargetDesc.samples = msaaSamples; - if (blur) { + if (UTILS_UNLIKELY(blur)) { + // Temporary (resolved) texture used to render the shadowmap when blurring + // is needed -- it'll be used as the source of the blur. + data.tempBlurSrc = builder.createTexture("Temporary Shadowmap", { + .width = textureRequirements.size, + .height = textureRequirements.size, + .format = textureRequirements.format + }); + data.tempBlurSrc = builder.write(data.tempBlurSrc, FrameGraphTexture::Usage::COLOR_ATTACHMENT); @@ -381,7 +541,7 @@ FrameGraphId ShadowMapManager::render(FEngine& engine, FrameG // blurring. data.rt = blur ? data.rt : rt; }, - [=, &engine, &entry](FrameGraphResources const& resources, + [=, &engine](FrameGraphResources const& resources, auto const& data, DriverApi& driver) { // Note: we capture entry by reference here. That's actually okay because @@ -393,19 +553,32 @@ FrameGraphId ShadowMapManager::render(FEngine& engine, FrameG auto rt = resources.getRenderPassInfo(data.rt); - engine.flush(); driver.beginRenderPass(rt.target, rt.params); - entry.shadowMap->bind(driver); - entry.executor.overrideScissor(entry.shadowMap->getScissor()); - entry.executor.execute(engine, "Shadow Pass"); + + for (auto curr = first; curr != last; curr++) { + // if we know there are no visible shadows, we can skip rendering, but + // we need the render-pass to clear/initialize the shadow-map + // Note: this is always true for directional/cascade shadows. + if (curr->shadowMap->hasVisibleShadows()) { + curr->shadowMap->bind(driver); + curr->executor.overrideScissor(curr->shadowMap->getScissor()); + curr->executor.execute(engine, driver); + } + } + driver.endRenderPass(); }); + first = last; // now emit the blurring passes if needed - if (view.hasVSM()) { + if (UTILS_UNLIKELY(blur)) { auto& ppm = engine.getPostProcessManager(); + // FIXME: this `options` is for the first shadowmap in the list, but it applies to + // the whole layer. Blurring should happen per shadowmap, not for the whole + // layer. + const float blurWidth = options->vsm.blurWidth; if (blurWidth > 0.0f) { const float sigma = (blurWidth + 1.0f) / 6.0f; @@ -417,14 +590,15 @@ FrameGraphId ShadowMapManager::render(FEngine& engine, FrameG false, kernelWidth, sigma); } + // FIXME: mipmapping here is broken because it'll access texels from adjacent + // shadow maps. + // If the shadow texture has more than one level, mipmapping was requested, either directly // or indirectly via anisotropic filtering. // So generate the mipmaps for each layer if (textureRequirements.levels > 1) { for (size_t level = 0; level < textureRequirements.levels - 1; level++) { - const bool finalize = level == textureRequirements.levels - 2; - ppm.vsmMipmapPass(fg, prepareShadowPass->shadows, layer, level, - vsmClearColor, finalize); + ppm.vsmMipmapPass(fg, prepareShadowPass->shadows, layer, level, vsmClearColor); } } } @@ -434,15 +608,22 @@ FrameGraphId ShadowMapManager::render(FEngine& engine, FrameG } ShadowMapManager::ShadowTechnique ShadowMapManager::updateCascadeShadowMaps(FEngine& engine, - FView& view, CameraInfo const& cameraInfo, FScene::RenderableSoa& renderableData, - FScene::LightSoa& lightData, ShadowMap::SceneInfo& sceneInfo) noexcept { + FView& view, CameraInfo cameraInfo, FScene::RenderableSoa& renderableData, + FScene::LightSoa const& lightData, ShadowMap::SceneInfo sceneInfo) noexcept { + FScene* scene = view.getScene(); auto& lcm = engine.getLightManager(); - FLightManager::Instance directionalLight = lightData.elementAt(0); + FLightManager::Instance const directionalLight = lightData.elementAt(0); FLightManager::ShadowOptions const& options = lcm.getShadowOptions(directionalLight); FLightManager::ShadowParams const& params = lcm.getShadowParams(directionalLight); + // Adjust the camera's projection for the light's shadowFar + if (UTILS_UNLIKELY(params.options.shadowFar > 0.0f)) { + cameraInfo.zf = params.options.shadowFar; + updateNearFarPlanes(&cameraInfo.cullingProjection, cameraInfo.zn, cameraInfo.zf); + } + const ShadowMap::ShadowMapInfo shadowMapInfo{ .atlasDimension = mTextureAtlasRequirements.size, .textureDimension = uint16_t(options.mapSize), @@ -453,13 +634,27 @@ ShadowMapManager::ShadowTechnique ShadowMapManager::updateCascadeShadowMaps(FEng }; bool hasVisibleShadows = false; - if (!mCascadeShadowMaps.empty()) { + utils::Slice cascadedShadowMaps = getCascadedShadowMap(); + if (!cascadedShadowMaps.empty()) { // Even if we have more than one cascade, we cull directional shadow casters against the // entire camera frustum, as if we only had a single cascade. - ShadowMap& shadowMap = *mCascadeShadowMaps[0]; + ShadowMap& shadowMap = cascadedShadowMaps[0]; - shadowMap.updateDirectional(mEngine, - lightData, 0, cameraInfo, shadowMapInfo, *scene, sceneInfo); + const auto direction = lightData.elementAt(0); + + // We compute the directional light's model matrix using the origin's as the light position. + // The choice of the light's origin initially doesn't matter for a directional light. + // This will be adjusted later because of how we compute the depth metric for VSM. + const mat4f MvAtOrigin = ShadowMap::getDirectionalLightViewMatrix(direction, + normalize(cameraInfo.worldTransform[0].xyz)); + + // Compute scene-dependent values shared across all cascades + ShadowMap::updateSceneInfoDirectional(MvAtOrigin, *scene, sceneInfo); + + // we always do culling without depth clamp, because objects behind the camera + // must be rendered regardless + shadowMap.updateDirectional(engine, + lightData, 0, cameraInfo, shadowMapInfo, sceneInfo, false); hasVisibleShadows = shadowMap.hasVisibleShadows(); @@ -475,15 +670,7 @@ ShadowMapManager::ShadowTechnique ShadowMapManager::updateCascadeShadowMaps(FEng uint32_t cascadeHasVisibleShadows = 0; if (hasVisibleShadows) { - // Adjust the near and far planes to tightly bound the scene. - float vsNear = -cameraInfo.zn; - float vsFar = -cameraInfo.zf; - if (engine.debug.shadowmap.tightly_bound_scene && !params.options.stable) { - vsNear = std::min(vsNear, sceneInfo.vsNearFar.x); - vsFar = std::max(vsFar, sceneInfo.vsNearFar.y); - } - - const size_t cascadeCount = mCascadeShadowMaps.size(); + uint32_t const cascadeCount = cascadedShadowMaps.size(); // We divide the camera frustum into N cascades. This gives us N + 1 split positions. // The first split position is the near plane; the last split position is the far plane. @@ -493,47 +680,45 @@ ShadowMapManager::ShadowTechnique ShadowMapManager::updateCascadeShadowMaps(FEng splitPercentages[i] = options.cascadeSplitPositions[i - 1]; } - const CascadeSplits::Params p{ - .proj = cameraInfo.cullingProjection, - .near = vsNear, - .far = vsFar, + const CascadeSplits splits({ + .near = -cameraInfo.zn, + .far = -cameraInfo.zf, .cascadeCount = cascadeCount, .splitPositions = splitPercentages - }; - if (p != mCascadeSplitParams) { - mCascadeSplits = CascadeSplits{ p }; - mCascadeSplitParams = p; - } - - const CascadeSplits& splits = mCascadeSplits; + }); // The split positions uniform is a float4. To save space, we chop off the first split position // (which is the near plane, and doesn't need to be communicated to the shaders). static_assert(CONFIG_MAX_SHADOW_CASCADES <= 5, "At most, a float4 can fit 4 split positions for 5 shadow cascades"); float4 wsSplitPositionUniform{ -std::numeric_limits::infinity() }; - std::copy(splits.beginWs() + 1, splits.endWs(), &wsSplitPositionUniform[0]); - - float csSplitPosition[CONFIG_MAX_SHADOW_CASCADES + 1]; - std::copy(splits.beginCs(), splits.endCs(), csSplitPosition); + std::copy(splits.begin() + 1, splits.end(), &wsSplitPositionUniform[0]); mShadowMappingUniforms.cascadeSplits = wsSplitPositionUniform; - // when computing the required bias we need a half-texel size, so we multiply by 0.5 here. + // When computing the required bias we need a half-texel size, so we multiply by 0.5 here. // note: normalBias is set to zero for VSM const float normalBias = shadowMapInfo.vsm ? 0.0f : 0.5f * lcm.getShadowNormalBias(0); - for (size_t i = 0, c = mCascadeShadowMaps.size(); i < c; i++) { - assert_invariant(mCascadeShadowMaps[i]); - + for (size_t i = 0, c = cascadedShadowMaps.size(); i < c; i++) { // Compute the frustum for the directional light. - ShadowMap& shadowMap = *mCascadeShadowMaps[i]; + ShadowMap& shadowMap = cascadedShadowMaps[i]; assert_invariant(shadowMap.getLightIndex() == 0); - sceneInfo.csNearFar = { csSplitPosition[i], csSplitPosition[i + 1] }; + // update cameraInfo culling projection for the cascade + float const* nearFarPlanes = splits.begin(); + cameraInfo.zn = -nearFarPlanes[i]; + cameraInfo.zf = -nearFarPlanes[i + 1]; + updateNearFarPlanes(&cameraInfo.cullingProjection, cameraInfo.zn, cameraInfo.zf); + + bool const canUseDepthClamp = + !view.hasVSM() && + mIsDepthClampSupported && + engine.debug.shadowmap.depth_clamp; - auto shaderParameters = shadowMap.updateDirectional(mEngine, - lightData, 0, cameraInfo, shadowMapInfo, *scene, sceneInfo); + auto shaderParameters = shadowMap.updateDirectional(engine, + lightData, 0, cameraInfo, shadowMapInfo, sceneInfo, + canUseDepthClamp); if (shadowMap.hasVisibleShadows()) { const size_t shadowIndex = shadowMap.getShadowIndex(); @@ -560,7 +745,7 @@ ShadowMapManager::ShadowTechnique ShadowMapManager::updateCascadeShadowMaps(FEng } // screen-space contact shadows for the directional light - float screenSpaceShadowDistance = options.maxShadowDistance; + float const screenSpaceShadowDistance = options.maxShadowDistance; if (options.screenSpaceContactShadows) { shadowTechnique |= ShadowTechnique::SCREEN_SPACE; } @@ -574,10 +759,7 @@ ShadowMapManager::ShadowTechnique ShadowMapManager::updateCascadeShadowMaps(FEng } uint32_t cascades = 0; - if (engine.debug.shadowmap.visualize_cascades) { - cascades |= 0x10u; - } - cascades |= uint32_t(mCascadeShadowMaps.size()); + cascades |= uint32_t(cascadedShadowMaps.size()); cascades |= cascadeHasVisibleShadows << 8u; mShadowMappingUniforms.directionalShadows = directionalShadowsMask; @@ -588,7 +770,7 @@ ShadowMapManager::ShadowTechnique ShadowMapManager::updateCascadeShadowMaps(FEng } void ShadowMapManager::updateSpotVisibilityMasks( - uint8_t visibleLayers, + uint8_t const visibleLayers, uint8_t const* UTILS_RESTRICT layers, FRenderableManager::Visibility const* UTILS_RESTRICT visibility, Culler::result_type* UTILS_RESTRICT visibleMask, size_t count) { @@ -611,52 +793,13 @@ void ShadowMapManager::updateSpotVisibilityMasks( } } -void ShadowMapManager::prepareSpotShadowMap(ShadowMap& shadowMap, - FEngine& engine, FView& view, CameraInfo const& mainCameraInfo, - FScene::RenderableSoa& renderableData, utils::Range range, - FScene::LightSoa& lightData, ShadowMap::SceneInfo const& sceneInfo) noexcept { - auto& lcm = engine.getLightManager(); +void ShadowMapManager::prepareSpotShadowMap(ShadowMap& shadowMap, FEngine& engine, FView& view, + CameraInfo const& mainCameraInfo, + FScene::LightSoa const& lightData, ShadowMap::SceneInfo const& sceneInfo) noexcept { const size_t lightIndex = shadowMap.getLightIndex(); - const FLightManager::Instance li = lightData.elementAt(lightIndex); FLightManager::ShadowOptions const* const options = shadowMap.getShadowOptions(); - // compute the frustum for this light - // for spotlights, we cull shadow casters first because we already know the frustum, - // this will help us find better near/far plane later - const auto position = lightData.elementAt(lightIndex).xyz; - const auto direction = lightData.elementAt(lightIndex); - const auto radius = lightData.elementAt(lightIndex).w; - const auto outerConeAngle = lcm.getSpotLightOuterCone(li); - - // compute shadow map frustum for culling - const mat4f Mv = ShadowMap::getDirectionalLightViewMatrix(direction, position); - const mat4f Mp = mat4f::perspective(outerConeAngle * f::RAD_TO_DEG * 2.0f, 1.0f, 0.01f, radius); - const mat4f MpMv = math::highPrecisionMultiply(Mp, Mv); - const Frustum frustum(MpMv); - - // Cull shadow casters - float3 const* worldAABBCenter = renderableData.data(); - float3 const* worldAABBExtent = renderableData.data(); - FScene::VisibleMaskType* visibleArray = renderableData.data(); - Culler::intersects( - visibleArray + range.first, - frustum, - worldAABBCenter + range.first, - worldAABBExtent + range.first, - range.size(), - VISIBLE_DYN_SHADOW_RENDERABLE_BIT); - - // update their visibility mask - uint8_t const* layers = renderableData.data(); - auto const* visibility = renderableData.data(); - updateSpotVisibilityMasks( - view.getVisibleLayers(), - layers + range.first, - visibility + range.first, - visibleArray + range.first, - range.size()); - // update the shadow map frustum/camera const ShadowMap::ShadowMapInfo shadowMapInfo{ .atlasDimension = mTextureAtlasRequirements.size, @@ -667,7 +810,7 @@ void ShadowMapManager::prepareSpotShadowMap(ShadowMap& shadowMap, .vsm = view.hasVSM() }; - auto shaderParameters = shadowMap.updateSpot(mEngine, + auto shaderParameters = shadowMap.updateSpot(engine, lightData, lightIndex, mainCameraInfo, shadowMapInfo, *view.getScene(), sceneInfo); // and if we need to generate it, update all the UBO data @@ -695,26 +838,28 @@ void ShadowMapManager::prepareSpotShadowMap(ShadowMap& shadowMap, } } -void ShadowMapManager::preparePointShadowMap(ShadowMap& shadowMap, - FEngine& engine, FView& view, CameraInfo const& mainCameraInfo, +void ShadowMapManager::cullSpotShadowMap(ShadowMap const& shadowMap, + FEngine const& engine, FView const& view, FScene::RenderableSoa& renderableData, utils::Range range, - FScene::LightSoa& lightData, - ShadowMap::SceneInfo const& sceneInfo) noexcept { + FScene::LightSoa const& lightData) noexcept { + auto& lcm = engine.getLightManager(); - const uint8_t face = shadowMap.getFace(); const size_t lightIndex = shadowMap.getLightIndex(); - FLightManager::ShadowOptions const* const options = shadowMap.getShadowOptions(); + const FLightManager::Instance li = lightData.elementAt(lightIndex); // compute the frustum for this light // for spotlights, we cull shadow casters first because we already know the frustum, // this will help us find better near/far plane later const auto position = lightData.elementAt(lightIndex).xyz; + const auto direction = lightData.elementAt(lightIndex); const auto radius = lightData.elementAt(lightIndex).w; + const auto outerConeAngle = lcm.getSpotLightOuterCone(li); // compute shadow map frustum for culling - const mat4f Mv = ShadowMap::getPointLightViewMatrix(TextureCubemapFace(face), position); - const mat4f Mp = mat4f::perspective(90.0f, 1.0f, 0.01f, radius); - const Frustum frustum{ math::highPrecisionMultiply(Mp, Mv) }; + const mat4f Mv = ShadowMap::getDirectionalLightViewMatrix(direction, { 0, 1, 0 }, position); + const mat4f Mp = mat4f::perspective(outerConeAngle * f::RAD_TO_DEG * 2.0f, 1.0f, 0.01f, radius); + const mat4f MpMv = highPrecisionMultiply(Mp, Mv); + const Frustum frustum(MpMv); // Cull shadow casters float3 const* worldAABBCenter = renderableData.data(); @@ -737,6 +882,15 @@ void ShadowMapManager::preparePointShadowMap(ShadowMap& shadowMap, visibility + range.first, visibleArray + range.first, range.size()); +} + +void ShadowMapManager::preparePointShadowMap(ShadowMap& shadowMap, + FEngine& engine, FView& view, CameraInfo const& mainCameraInfo, + FScene::LightSoa const& lightData) const noexcept { + + const uint8_t face = shadowMap.getFace(); + const size_t lightIndex = shadowMap.getLightIndex(); + FLightManager::ShadowOptions const* const options = shadowMap.getShadowOptions(); // update the shadow map frustum/camera const ShadowMap::ShadowMapInfo shadowMapInfo{ @@ -748,9 +902,8 @@ void ShadowMapManager::preparePointShadowMap(ShadowMap& shadowMap, .vsm = view.hasVSM() }; - auto shaderParameters = shadowMap.updatePoint(mEngine, lightData, lightIndex, - mainCameraInfo, shadowMapInfo, *view.getScene(), sceneInfo, face); - + auto shaderParameters = shadowMap.updatePoint(engine, lightData, lightIndex, + mainCameraInfo, shadowMapInfo, *view.getScene(), face); // and if we need to generate it, update all the UBO data if (shadowMap.hasVisibleShadows()) { @@ -776,22 +929,68 @@ void ShadowMapManager::preparePointShadowMap(ShadowMap& shadowMap, } } +void ShadowMapManager::cullPointShadowMap(ShadowMap const& shadowMap, FView const& view, + FScene::RenderableSoa& renderableData, utils::Range const range, + FScene::LightSoa const& lightData) noexcept { + + uint8_t const face = shadowMap.getFace(); + size_t const lightIndex = shadowMap.getLightIndex(); + + // compute the frustum for this light + // for spotlights, we cull shadow casters first because we already know the frustum, + // this will help us find better near/far plane later + auto const position = lightData.elementAt(lightIndex).xyz; + auto const radius = lightData.elementAt(lightIndex).w; + + // compute shadow map frustum for culling + mat4f const Mv = ShadowMap::getPointLightViewMatrix(TextureCubemapFace(face), position); + mat4f const Mp = mat4f::perspective(90.0f, 1.0f, 0.01f, radius); + Frustum const frustum{ highPrecisionMultiply(Mp, Mv) }; + + // Cull shadow casters + float3 const* worldAABBCenter = renderableData.data(); + float3 const* worldAABBExtent = renderableData.data(); + FScene::VisibleMaskType* visibleArray = renderableData.data(); + Culler::intersects( + visibleArray + range.first, + frustum, + worldAABBCenter + range.first, + worldAABBExtent + range.first, + range.size(), + VISIBLE_DYN_SHADOW_RENDERABLE_BIT); + + // update their visibility mask + uint8_t const* layers = renderableData.data(); + auto const* visibility = renderableData.data(); + updateSpotVisibilityMasks( + view.getVisibleLayers(), + layers + range.first, + visibility + range.first, + visibleArray + range.first, + range.size()); +} + ShadowMapManager::ShadowTechnique ShadowMapManager::updateSpotShadowMaps(FEngine& engine, - FScene::LightSoa& lightData) noexcept { + FScene::LightSoa const& lightData) const noexcept { - FScene::ShadowInfo* const shadowInfo = lightData.data(); + // The const_cast here is a little ugly, but conceptually lightData should be const, + // it's just that we're using it to store some temporary data. With SoA we can't have + // a `mutable` element, so that's a workaround. + FScene::ShadowInfo* const shadowInfo = const_cast( + lightData.data()); ShadowTechnique shadowTechnique{}; - if (!mSpotShadowMaps.empty()) { + utils::Slice const spotShadowMaps = getSpotShadowMaps(); + if (!spotShadowMaps.empty()) { shadowTechnique |= ShadowTechnique::SHADOW_MAP; - for (auto const* pShadowMap : mSpotShadowMaps) { - const size_t lightIndex = pShadowMap->getLightIndex(); - // gather the per-light (not per shadow map) information. For point lights we will + for (ShadowMap const& shadowMap : spotShadowMaps) { + const size_t lightIndex = shadowMap.getLightIndex(); + // Gather the per-light (not per shadow map) information. For point lights we will // "see" 6 shadowmaps (one per face), we must use the first face one, the shader // knows how to find the entry for other faces (they're guaranteed to be sequential). - if (pShadowMap->getFace() == 0) { + if (shadowMap.getFace() == 0) { shadowInfo[lightIndex].castsShadows = true; // FIXME: is that set correctly? - shadowInfo[lightIndex].index = pShadowMap->getShadowIndex(); + shadowInfo[lightIndex].index = shadowMap.getShadowIndex(); } } } @@ -813,51 +1012,73 @@ ShadowMapManager::ShadowTechnique ShadowMapManager::updateSpotShadowMaps(FEngine } void ShadowMapManager::calculateTextureRequirements(FEngine& engine, FView& view, - FScene::LightSoa& lightData) noexcept { + FScene::LightSoa const&) noexcept { - // Lay out the shadow maps. For now, we take the largest requested dimension and allocate a - // texture of that size. Each cascade / shadow map gets its own layer in the array texture. - // The directional shadow cascades start on layer 0, followed by spotlights. - uint8_t layer = 0; uint32_t maxDimension = 0; bool elvsm = false; - for (auto* pShadowMap : mCascadeShadowMaps) { + + for (ShadowMap const& shadowMap : getCascadedShadowMap()) { // Shadow map size should be the same for all cascades. - auto const& options = pShadowMap->getShadowOptions(); + auto const& options = shadowMap.getShadowOptions(); maxDimension = std::max(maxDimension, options->mapSize); elvsm = elvsm || options->vsm.elvsm; - pShadowMap->setLayer(layer++); } - for (auto& pShadowMap : mSpotShadowMaps) { - auto const& options = pShadowMap->getShadowOptions(); + + for (ShadowMap const& shadowMap : getSpotShadowMaps()) { + auto const& options = shadowMap.getShadowOptions(); maxDimension = std::max(maxDimension, options->mapSize); elvsm = elvsm || options->vsm.elvsm; - pShadowMap->setLayer(layer++); } - const uint8_t layersNeeded = layer; + uint8_t layersNeeded = 0; + + std::function const allocateFromAtlas = + [&layersNeeded, allocator = AtlasAllocator{ maxDimension }]( + ShadowMap* pShadowMap) mutable { + // Allocate shadowmap from our Atlas Allocator + auto const& options = pShadowMap->getShadowOptions(); + auto [layer, pos] = allocator.allocate(options->mapSize); + assert_invariant(layer >= 0); + assert_invariant(!pos.empty()); + pShadowMap->setAllocation(layer, pos); + layersNeeded = std::max(uint8_t(layer + 1), layersNeeded); + }; + + std::function const allocateFromTextureArray = + [&layersNeeded, layer = 0](ShadowMap* pShadowMap) mutable { + // Layout the shadow maps. For now, we take the largest requested dimension and allocate a + // texture of that size. Each cascade / shadow map gets its own layer in the array texture. + // The directional shadow cascades start on layer 0, followed by spotlights. + pShadowMap->setAllocation(layer, {}); + layersNeeded = ++layer; + }; + + auto& allocateShadowmapTexture = mFeatureShadowAllocator ? + allocateFromAtlas : allocateFromTextureArray; + + for (ShadowMap& shadowMap : getCascadedShadowMap()) { + allocateShadowmapTexture(&shadowMap); + } + for (ShadowMap& shadowMap : getSpotShadowMaps()) { + allocateShadowmapTexture(&shadowMap); + } // Generate mipmaps for VSM when anisotropy is enabled or when requested auto const& vsmShadowOptions = view.getVsmShadowOptions(); const bool useMipmapping = view.hasVSM() && - ((vsmShadowOptions.anisotropy > 0) || vsmShadowOptions.mipmapping); + ((vsmShadowOptions.anisotropy > 0) || vsmShadowOptions.mipmapping); - const uint8_t msaaSamples = vsmShadowOptions.msaaSamples; + uint8_t msaaSamples = vsmShadowOptions.msaaSamples; + if (engine.getDriverApi().isWorkaroundNeeded(Workaround::DISABLE_BLIT_INTO_TEXTURE_ARRAY)) { + msaaSamples = 1; + } TextureFormat format = TextureFormat::DEPTH16; if (view.hasVSM()) { if (vsmShadowOptions.highPrecision) { - if (elvsm) { - format = TextureFormat::RGBA32F; - } else { - format = TextureFormat::RG32F; - } + format = elvsm ? TextureFormat::RGBA32F : TextureFormat::RG32F; } else { - if (elvsm) { - format = TextureFormat::RGBA16F; - } else { - format = TextureFormat::RG16F; - } + format = elvsm ? TextureFormat::RGBA16F : TextureFormat::RG16F; } } @@ -867,10 +1088,14 @@ void ShadowMapManager::calculateTextureRequirements(FEngine& engine, FView& view if (useMipmapping) { // Limit the lowest mipmap level to 256x256. // This avoids artifacts on high derivative tangent surfaces. - int lowMipmapLevel = 7; // log2(256) - 1 + constexpr int lowMipmapLevel = 7; // log2(256) - 1 mipLevels = std::max(1, FTexture::maxLevelCount(maxDimension) - lowMipmapLevel); } + // publish the debugging data + engine.debug.shadowmap.display_shadow_texture_layer_count = layersNeeded; + engine.debug.shadowmap.display_shadow_texture_level_count = mipLevels; + mTextureAtlasRequirements = { (uint16_t)maxDimension, layersNeeded, @@ -884,8 +1109,78 @@ ShadowMapManager::CascadeSplits::CascadeSplits(Params const& params) noexcept : mSplitCount(params.cascadeCount + 1) { for (size_t s = 0; s < mSplitCount; s++) { mSplitsWs[s] = params.near + (params.far - params.near) * params.splitPositions[s]; - mSplitsCs[s] = mat4f::project(params.proj, float3(0.0f, 0.0f, mSplitsWs[s])).z; } } +void ShadowMapManager::updateNearFarPlanes(mat4f* projection, + float nearDistance, float farDistance) noexcept { + float const n = nearDistance; + float const f = farDistance; + + /* + * Updating a projection matrix near and far planes: + * + * We assume that the near and far plane equations are of the form: + * N = { 0, 0, 1, n } + * F = { 0, 0, -1, -f } + * + * We also assume that the lower-left 2x2 of the projection is all 0: + * P = A 0 C 0 + * 0 B D 0 + * 0 0 E F + * 0 0 G H + * + * It result that we need to calculate E and F while leaving all other parameter unchanged. + * + * We know that: + * with N, F the near/far normalized plane equation parameters + * sn, sf arbitrary scale factors (they don't affect the planes) + * m is the transpose of projection (see Frustum.cpp) + * + * sn * N == -m[3] - m[2] + * sf * F == -m[3] + m[2] + * + * sn * N + sf * F == -2 * m[3] + * sn * N - sf * F == -2 * m[2] + * + * sn * N.z + sf * F.z == -2 * m[3].z + * sn * N.w + sf * F.w == -2 * m[3].w + * sn * N.z - sf * F.z == -2 * m[2].z + * sn * N.w - sf * F.w == -2 * m[2].w + * + * sn * N.z + sf * F.z == -2 * p[2].w + * sn * N.w + sf * F.w == -2 * p[3].w + * sn * N.z - sf * F.z == -2 * p[2].z + * sn * N.w - sf * F.w == -2 * p[3].z + * + * We now need to solve for { p[2].z, p[3].z, sn, sf } : + * + * sn == -2 * (p[2].w * F.w - p[3].w * F.z) / (N.z * F.w - N.w * F.z) + * sf == -2 * (p[2].w * N.w - p[3].w * N.z) / (F.z * N.w - F.w * N.z) + * p[2].z == (sf * F.z - sn * N.z) / 2 + * p[3].z == (sf * F.w - sn * N.w) / 2 + */ + auto& p = *projection; + float4 const N = { 0, 0, 1, n }; // near plane equation + float4 const F = { 0, 0, -1, -f }; // far plane equation + // near plane equation scale factor + float const sn = -2.0f * (p[2].w * F.w - p[3].w * F.z) / (N.z * F.w - N.w * F.z); + // far plane equation scale factor + float const sf = -2.0f * (p[2].w * N.w - p[3].w * N.z) / (F.z * N.w - F.w * N.z); + // New values for the projection + p[2].z = (sf * F.z - sn * N.z) * 0.5f; + p[3].z = (sf * F.w - sn * N.w) * 0.5f; +} + +utils::FixedCapacityVector +ShadowMapManager::getDirectionalShadowCameras() const noexcept { + if (!mInitialized) return {}; + auto const csm = getCascadedShadowMap(); + auto result = utils::FixedCapacityVector::with_capacity(csm.size()); + for (ShadowMap const& sm : csm) { + result.push_back(sm.hasVisibleShadows() ? sm.getDebugCamera() : nullptr); + } + return result; +} + } // namespace filament diff --git a/filament/src/ShadowMapManager.h b/filament/src/ShadowMapManager.h index 39d106d9af2..a6dc21cab30 100644 --- a/filament/src/ShadowMapManager.h +++ b/filament/src/ShadowMapManager.h @@ -17,32 +17,55 @@ #ifndef TNT_FILAMENT_DETAILS_SHADOWMAPMANAGER_H #define TNT_FILAMENT_DETAILS_SHADOWMAPMANAGER_H +#include "AtlasAllocator.h" +#include "ShadowMap.h" +#include "ds/TypedBuffer.h" + +#include +#include #include -#include "ShadowMap.h" -#include "TypedUniformBuffer.h" +#include +#include + +#include "components/RenderableManager.h" #include "details/Engine.h" #include "details/Scene.h" -#include +#include "fg/FrameGraphId.h" +#include "fg/FrameGraphTexture.h" -#include #include #include +#include +#include #include +#include +#include +#include -#include +#include +#include #include #include +#include +#include +#include + +#include +#include namespace filament { +class Camera; +class FCamera; class FView; class FrameGraph; class RenderPass; +class RenderPassBuilder; struct ShadowMappingUniforms { math::float4 cascadeSplits; @@ -64,40 +87,52 @@ class ShadowMapManager { SCREEN_SPACE = 0x2u, }; + class Builder { + friend class ShadowMapManager; + uint32_t mDirectionalShadowMapCount = 0; + uint32_t mSpotShadowMapCount = 0; + struct ShadowMap { + size_t lightIndex; + ShadowType shadowType; + uint16_t shadowIndex; + uint8_t face; + LightManager::ShadowOptions const* options; + }; + std::vector mShadowMaps; + public: + Builder& directionalShadowMap(size_t lightIndex, + LightManager::ShadowOptions const* options) noexcept; - explicit ShadowMapManager(FEngine& engine); - ~ShadowMapManager(); + Builder& shadowMap(size_t lightIndex, bool spotlight, + LightManager::ShadowOptions const* options) noexcept; - void terminate(FEngine& engine); + bool hasShadowMaps() const noexcept { + return mDirectionalShadowMapCount || mSpotShadowMapCount; + } + }; + + ~ShadowMapManager(); - // Reset shadow map layout. - void reset() noexcept; + static void createIfNeeded(FEngine& engine, + std::unique_ptr& inOutShadowMapManager); - void setDirectionalShadowMap(size_t lightIndex, - LightManager::ShadowOptions const* options) noexcept; + static void terminate(FEngine& engine, + std::unique_ptr& shadowMapManager); - void addShadowMap(size_t lightIndex, bool spotlight, - LightManager::ShadowOptions const* options) noexcept; + size_t getMaxShadowMapCount() const noexcept; // Updates all the shadow maps and performs culling. // Returns true if any of the shadow maps have visible shadows. - ShadowMapManager::ShadowTechnique update(FEngine& engine, FView& view, + ShadowTechnique update(Builder const& builder, + FEngine& engine, FView& view, CameraInfo const& cameraInfo, - FScene::RenderableSoa& renderableData, FScene::LightSoa& lightData) noexcept; + FScene::RenderableSoa& renderableData, FScene::LightSoa const& lightData) noexcept; // Renders all the shadow maps. - FrameGraphId render(FEngine& engine, FrameGraph& fg, RenderPass const& pass, + FrameGraphId render(FEngine& engine, FrameGraph& fg, + RenderPassBuilder const& passBuilder, FView& view, CameraInfo const& mainCameraInfo, math::float4 const& userTime) noexcept; - ShadowMap* getShadowMap(size_t index) noexcept { - assert_invariant(index < CONFIG_MAX_SHADOWMAPS); - return std::launder(reinterpret_cast(&mShadowMapCache[index])); - } - - ShadowMap const* getShadowMap(size_t index) const noexcept { - return const_cast(this)->getShadowMap(index); - } - // valid after calling update() above ShadowMappingUniforms getShadowMappingUniforms() const noexcept { return mShadowMappingUniforms; @@ -105,29 +140,45 @@ class ShadowMapManager { auto& getShadowUniformsHandle() const { return mShadowUbh; } - bool hasSpotShadows() const { return !mSpotShadowMaps.empty(); } + bool hasSpotShadows() const { return mSpotShadowMapCount > 0; } + + // for debugging only + utils::FixedCapacityVector getDirectionalShadowCameras() const noexcept; private: - ShadowMapManager::ShadowTechnique updateCascadeShadowMaps(FEngine& engine, - FView& view, CameraInfo const& cameraInfo, FScene::RenderableSoa& renderableData, - FScene::LightSoa& lightData, ShadowMap::SceneInfo& sceneInfo) noexcept; + explicit ShadowMapManager(FEngine& engine); + + void terminate(FEngine& engine); + + static void updateNearFarPlanes(math::mat4f* projection, + float nearDistance, float farDistance) noexcept; - ShadowMapManager::ShadowTechnique updateSpotShadowMaps(FEngine& engine, - FScene::LightSoa& lightData) noexcept; + ShadowTechnique updateCascadeShadowMaps(FEngine& engine, + FView& view, CameraInfo cameraInfo, FScene::RenderableSoa& renderableData, + FScene::LightSoa const& lightData, ShadowMap::SceneInfo sceneInfo) noexcept; - void calculateTextureRequirements(FEngine& engine, FView& view, - FScene::LightSoa& lightData) noexcept; + ShadowTechnique updateSpotShadowMaps(FEngine& engine, + FScene::LightSoa const& lightData) const noexcept; + + void calculateTextureRequirements(FEngine&, FView& view, + FScene::LightSoa const&) noexcept; void prepareSpotShadowMap(ShadowMap& shadowMap, FEngine& engine, FView& view, CameraInfo const& mainCameraInfo, + FScene::LightSoa const& lightData, ShadowMap::SceneInfo const& sceneInfo) noexcept; + + static void cullSpotShadowMap(ShadowMap const& map, + FEngine const& engine, FView const& view, FScene::RenderableSoa& renderableData, utils::Range range, - FScene::LightSoa& lightData, ShadowMap::SceneInfo const& sceneInfo) noexcept; + FScene::LightSoa const& lightData) noexcept; void preparePointShadowMap(ShadowMap& map, FEngine& engine, FView& view, CameraInfo const& mainCameraInfo, + FScene::LightSoa const& lightData) const noexcept; + + static void cullPointShadowMap(ShadowMap const& shadowMap, FView const& view, FScene::RenderableSoa& renderableData, utils::Range range, - FScene::LightSoa& lightData, - ShadowMap::SceneInfo const& sceneInfo) noexcept; + FScene::LightSoa const& lightData) noexcept; static void updateSpotVisibilityMasks( uint8_t visibleLayers, @@ -140,40 +191,23 @@ class ShadowMapManager { constexpr static size_t SPLIT_COUNT = CONFIG_MAX_SHADOW_CASCADES + 1; struct Params { - math::mat4f proj; float near = 0.0f; float far = 0.0f; - size_t cascadeCount = 1; + uint32_t cascadeCount = 1; std::array splitPositions = { 0.0f }; - - bool operator!=(const Params& rhs) const { - return proj != rhs.proj || - near != rhs.near || - far != rhs.far || - cascadeCount != rhs.cascadeCount || - splitPositions != rhs.splitPositions; - } }; - CascadeSplits() noexcept : CascadeSplits(Params{}) {} explicit CascadeSplits(Params const& params) noexcept; // Split positions in world-space. - const float* beginWs() const { return mSplitsWs; } - const float* endWs() const { return mSplitsWs + mSplitCount; } - - // Split positions in clip-space. - const float* beginCs() const { return mSplitsCs; } - const float* endCs() const { return mSplitsCs + mSplitCount; } + const float* begin() const { return mSplitsWs; } + const float* end() const { return mSplitsWs + mSplitCount; } private: float mSplitsWs[SPLIT_COUNT]; - float mSplitsCs[SPLIT_COUNT]; - size_t mSplitCount; + uint32_t mSplitCount; }; - FEngine& mEngine; - // Atlas requirements, updated in ShadowMapManager::update(), // consumed in ShadowMapManager::render() struct TextureAtlasRequirements { @@ -186,29 +220,47 @@ class ShadowMapManager { SoftShadowOptions mSoftShadowOptions; - CascadeSplits::Params mCascadeSplitParams; - CascadeSplits mCascadeSplits; - - mutable TypedUniformBuffer mShadowUb; + mutable TypedBuffer mShadowUb; backend::Handle mShadowUbh; ShadowMappingUniforms mShadowMappingUniforms = {}; ShadowMap::SceneInfo mSceneInfo; - utils::FixedCapacityVector mCascadeShadowMaps{ - utils::FixedCapacityVector::with_capacity( - CONFIG_MAX_SHADOW_CASCADES) }; + // Inline storage for all our ShadowMap objects, we can't easily use a std::array<> directly. + // Because ShadowMap doesn't have a default ctor, and we avoid out-of-line allocations. + // Each ShadowMap is currently 88 bytes (total of ~12KB for 128 shadow maps) + using ShadowMapStorage = std::aligned_storage::type; + using ShadowMapCacheContainer = std::array; + ShadowMapCacheContainer mShadowMapCache; + uint32_t mDirectionalShadowMapCount = 0; + uint32_t mSpotShadowMapCount = 0; + bool const mIsDepthClampSupported; + bool mInitialized = false; + bool mFeatureShadowAllocator = false; + + ShadowMap& getShadowMap(size_t const index) noexcept { + assert_invariant(index < mShadowMapCache.size()); + return *std::launder(reinterpret_cast(&mShadowMapCache[index])); + } + + ShadowMap const& getShadowMap(size_t const index) const noexcept { + return const_cast(this)->getShadowMap(index); + } + + utils::Slice getCascadedShadowMap() noexcept { + ShadowMap const* const p = &getShadowMap(0); + return { p, mDirectionalShadowMapCount }; + } - utils::FixedCapacityVector mSpotShadowMaps{ - utils::FixedCapacityVector::with_capacity( - CONFIG_MAX_SHADOWMAPS - CONFIG_MAX_SHADOW_CASCADES) }; + utils::Slice getCascadedShadowMap() const noexcept { + return const_cast(this)->getCascadedShadowMap(); + } - // inline storage for all our ShadowMap objects, we can't easily use a std::array<> directly. - // because ShadowMap doesn't have a default ctor, and we avoid out-of-line allocations. - // Each ShadowMap is currently 40 bytes (total of 2.5KB for 64 shadow maps) - using ShadowMapStorage = std::aligned_storage::type; - std::array mShadowMapCache; + utils::Slice getSpotShadowMaps() const noexcept { + ShadowMap const* const p = &getShadowMap(CONFIG_MAX_SHADOW_CASCADES); + return { p, mSpotShadowMapCount }; + } }; } // namespace filament diff --git a/filament/src/SharedHandle.h b/filament/src/SharedHandle.h new file mode 100644 index 00000000000..8d793f31e43 --- /dev/null +++ b/filament/src/SharedHandle.h @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_SHARED_HANDLE_H +#define TNT_FILAMENT_SHARED_HANDLE_H + +#include + +#include + +namespace filament { + +/* + * SharedHandle is a bit like shared_ptr<> but for Handle<>, the destruction is + * performed by a Deleter functor that needs to be provided. We only support strong + * references for now. + * + * caveat: The current implementation is not thread-safe. + */ +template +struct SharedHandle { + SharedHandle() noexcept = default; + + ~SharedHandle() noexcept { + dec(mControlBlockPtr); + } + + SharedHandle(SharedHandle const& rhs) noexcept + : mControlBlockPtr(inc(rhs.mControlBlockPtr)) { + } + + SharedHandle(SharedHandle&& rhs) noexcept { + std::swap(mControlBlockPtr, rhs.mControlBlockPtr); + } + + SharedHandle& operator=(SharedHandle const& rhs) noexcept { + if (this != &rhs) { + inc(rhs.mControlBlockPtr); // add a reference to other control block + dec(mControlBlockPtr); // drop a reference from ours (possibly destroying it) + mControlBlockPtr = rhs.mControlBlockPtr; // adopt the new control block + } + return *this; + } + + SharedHandle& operator=(SharedHandle&& rhs) noexcept { + if (this != &rhs) { + std::swap(mControlBlockPtr, rhs.mControlBlockPtr); + } + return *this; + } + + // initialize the SharedHandle and provide a Deleter + template + explicit SharedHandle(backend::Handle const& rhs, ARGS&& ... args) noexcept + : mControlBlockPtr(new ControlBlock(rhs, std::forward(args)...)) { + } + + // initialize the SharedHandle and provide a Deleter + template + explicit SharedHandle(backend::Handle&& rhs, ARGS&& ... args) noexcept + : mControlBlockPtr(new ControlBlock(rhs, std::forward(args)...)) { + } + + // automatically converts to Handle + operator backend::Handle() const noexcept { // NOLINT(*-explicit-constructor) + return mControlBlockPtr ? mControlBlockPtr->handle : backend::Handle{}; + } + + explicit operator bool() const noexcept { + return mControlBlockPtr ? (bool)mControlBlockPtr->handle : false; + } + + void clear() noexcept { dec(mControlBlockPtr); } + +private: + struct ControlBlock { + template + explicit ControlBlock(backend::Handle handle, ARGS&& ... args) noexcept + : deleter(std::forward(args)...), handle(std::move(handle)) { + } + void inc() noexcept { + ++count; + } + void dec() noexcept { + if (--count == 0) { + deleter(handle); + delete this; + } + } + Deleter deleter; + int32_t count = 1; + backend::Handle handle; + }; + + ControlBlock* inc(ControlBlock* const ctrlBlk) noexcept { + if (ctrlBlk) { + ctrlBlk->inc(); + } + return ctrlBlk; + } + + void dec(ControlBlock* const ctrlBlk) noexcept { + if (ctrlBlk) { + ctrlBlk->dec(); + } + } + + ControlBlock* mControlBlockPtr = nullptr; +}; + +} // namespace filament + +#endif // TNT_FILAMENT_SHARED_HANDLE_H diff --git a/filament/src/SkinningBuffer.cpp b/filament/src/SkinningBuffer.cpp index df40f8ce2f0..ec196f9a14c 100644 --- a/filament/src/SkinningBuffer.cpp +++ b/filament/src/SkinningBuffer.cpp @@ -24,12 +24,12 @@ using namespace backend; using namespace math; void SkinningBuffer::setBones(Engine& engine, - RenderableManager::Bone const* transforms, size_t count, size_t offset) { + RenderableManager::Bone const* transforms, size_t const count, size_t const offset) { downcast(this)->setBones(downcast(engine), transforms, count, offset); } void SkinningBuffer::setBones(Engine& engine, - math::mat4f const* transforms, size_t count, size_t offset) { + mat4f const* transforms, size_t const count, size_t const offset) { downcast(this)->setBones(downcast(engine), transforms, count, offset); } diff --git a/filament/src/Skybox.cpp b/filament/src/Skybox.cpp index b9eee10e8f4..f9488f6017d 100644 --- a/filament/src/Skybox.cpp +++ b/filament/src/Skybox.cpp @@ -20,7 +20,7 @@ namespace filament { -void Skybox::setLayerMask(uint8_t select, uint8_t values) noexcept { +void Skybox::setLayerMask(uint8_t const select, uint8_t const values) noexcept { downcast(this)->setLayerMask(select, values); } @@ -32,7 +32,7 @@ float Skybox::getIntensity() const noexcept { return downcast(this)->getIntensity(); } -void Skybox::setColor(math::float4 color) noexcept { +void Skybox::setColor(math::float4 const color) noexcept { downcast(this)->setColor(color); } diff --git a/filament/src/Stream.cpp b/filament/src/Stream.cpp index c895248e371..bcd9c1777bb 100644 --- a/filament/src/Stream.cpp +++ b/filament/src/Stream.cpp @@ -24,15 +24,16 @@ StreamType Stream::getStreamType() const noexcept { return downcast(this)->getStreamType(); } -void Stream::setAcquiredImage(void* image, Callback callback, void* userdata) noexcept { +void Stream::setAcquiredImage(void* image, Callback const callback, void* userdata) noexcept { downcast(this)->setAcquiredImage(image, callback, userdata); } -void Stream::setAcquiredImage(void* image, backend::CallbackHandler* handler, Callback callback, void* userdata) noexcept { +void Stream::setAcquiredImage(void* image, + CallbackHandler* handler, Callback const callback, void* userdata) noexcept { downcast(this)->setAcquiredImage(image, handler, callback, userdata); } -void Stream::setDimensions(uint32_t width, uint32_t height) noexcept { +void Stream::setDimensions(uint32_t const width, uint32_t const height) noexcept { downcast(this)->setDimensions(width, height); } diff --git a/filament/src/SwapChain.cpp b/filament/src/SwapChain.cpp index 25242d25e56..8bac3e4dbac 100644 --- a/filament/src/SwapChain.cpp +++ b/filament/src/SwapChain.cpp @@ -16,18 +16,38 @@ #include "details/SwapChain.h" +#include "details/Engine.h" + +#include + +#include + namespace filament { void* SwapChain::getNativeWindow() const noexcept { return downcast(this)->getNativeWindow(); } -void SwapChain::setFrameScheduledCallback(FrameScheduledCallback callback, void* user) { - return downcast(this)->setFrameScheduledCallback(callback, user); +void SwapChain::setFrameScheduledCallback( + backend::CallbackHandler* handler, FrameScheduledCallback&& callback, uint64_t const flags) { + downcast(this)->setFrameScheduledCallback(handler, std::move(callback), flags); +} + +bool SwapChain::isFrameScheduledCallbackSet() const noexcept { + return downcast(this)->isFrameScheduledCallbackSet(); +} + +void SwapChain::setFrameCompletedCallback(backend::CallbackHandler* handler, + utils::Invocable&& callback) noexcept { + return downcast(this)->setFrameCompletedCallback(handler, std::move(callback)); +} + +bool SwapChain::isSRGBSwapChainSupported(Engine& engine) noexcept { + return FSwapChain::isSRGBSwapChainSupported(downcast(engine)); } -void SwapChain::setFrameCompletedCallback(FrameCompletedCallback callback, void* user) { - return downcast(this)->setFrameCompletedCallback(callback, user); +bool SwapChain::isProtectedContentSupported(Engine& engine) noexcept { + return FSwapChain::isProtectedContentSupported(downcast(engine)); } } // namespace filament diff --git a/filament/src/Texture.cpp b/filament/src/Texture.cpp index 3ed5687b47b..eb67f5b43cf 100644 --- a/filament/src/Texture.cpp +++ b/filament/src/Texture.cpp @@ -21,15 +21,15 @@ namespace filament { -size_t Texture::getWidth(size_t level) const noexcept { +size_t Texture::getWidth(size_t const level) const noexcept { return downcast(this)->getWidth(level); } -size_t Texture::getHeight(size_t level) const noexcept { +size_t Texture::getHeight(size_t const level) const noexcept { return downcast(this)->getHeight(level); } -size_t Texture::getDepth(size_t level) const noexcept { +size_t Texture::getDepth(size_t const level) const noexcept { return downcast(this)->getDepth(level); } @@ -45,16 +45,16 @@ Texture::InternalFormat Texture::getFormat() const noexcept { return downcast(this)->getFormat(); } -void Texture::setImage(Engine& engine, size_t level, - uint32_t xoffset, uint32_t yoffset, uint32_t zoffset, - uint32_t width, uint32_t height, uint32_t depth, +void Texture::setImage(Engine& engine, size_t const level, + uint32_t const xoffset, uint32_t const yoffset, uint32_t const zoffset, + uint32_t const width, uint32_t const height, uint32_t const depth, PixelBufferDescriptor&& buffer) const { downcast(this)->setImage(downcast(engine), level, xoffset, yoffset, zoffset, width, height, depth, std::move(buffer)); } -void Texture::setImage(Engine& engine, size_t level, - Texture::PixelBufferDescriptor&& buffer, const FaceOffsets& faceOffsets) const { +void Texture::setImage(Engine& engine, size_t const level, + PixelBufferDescriptor&& buffer, const FaceOffsets& faceOffsets) const { downcast(this)->setImage(downcast(engine), level, std::move(buffer), faceOffsets); } @@ -62,7 +62,7 @@ void Texture::setExternalImage(Engine& engine, void* image) noexcept { downcast(this)->setExternalImage(downcast(engine), image); } -void Texture::setExternalImage(Engine& engine, void* image, size_t plane) noexcept { +void Texture::setExternalImage(Engine& engine, void* image, size_t const plane) noexcept { downcast(this)->setExternalImage(downcast(engine), image, plane); } @@ -74,21 +74,25 @@ void Texture::generateMipmaps(Engine& engine) const noexcept { downcast(this)->generateMipmaps(downcast(engine)); } -bool Texture::isTextureFormatSupported(Engine& engine, InternalFormat format) noexcept { +bool Texture::isTextureFormatSupported(Engine& engine, InternalFormat const format) noexcept { return FTexture::isTextureFormatSupported(downcast(engine), format); } +bool Texture::isProtectedTexturesSupported(Engine& engine) noexcept { + return FTexture::isProtectedTexturesSupported(downcast(engine)); +} + bool Texture::isTextureSwizzleSupported(Engine& engine) noexcept { return FTexture::isTextureSwizzleSupported(downcast(engine)); } -size_t Texture::computeTextureDataSize(Texture::Format format, Texture::Type type, size_t stride, - size_t height, size_t alignment) noexcept { +size_t Texture::computeTextureDataSize(Format const format, Type const type, size_t const stride, + size_t const height, size_t const alignment) noexcept { return FTexture::computeTextureDataSize(format, type, stride, height, alignment); } -void Texture::generatePrefilterMipmap(Engine& engine, Texture::PixelBufferDescriptor&& buffer, - const Texture::FaceOffsets& faceOffsets, PrefilterOptions const* options) { +void Texture::generatePrefilterMipmap(Engine& engine, PixelBufferDescriptor&& buffer, + const FaceOffsets& faceOffsets, PrefilterOptions const* options) { downcast(this)->generatePrefilterMipmap(downcast(engine), std::move(buffer), faceOffsets, options); } diff --git a/filament/src/ToneMapper.cpp b/filament/src/ToneMapper.cpp index d3dcdd698af..e6f9fc8c145 100644 --- a/filament/src/ToneMapper.cpp +++ b/filament/src/ToneMapper.cpp @@ -27,7 +27,7 @@ using namespace math; namespace aces { -inline float rgb_2_saturation(float3 rgb) { +inline float rgb_2_saturation(float3 const rgb) { // Input: ACES // Output: OCES constexpr float TINY = 1e-5f; @@ -36,7 +36,7 @@ inline float rgb_2_saturation(float3 rgb) { return (max(ma, TINY) - max(mi, TINY)) / max(ma, 1e-2f); } -inline float rgb_2_yc(float3 rgb) { +inline float rgb_2_yc(float3 const rgb) { constexpr float ycRadiusWeight = 1.75f; // Converts RGB to a luminance proxy, here called YC @@ -61,14 +61,14 @@ inline float rgb_2_yc(float3 rgb) { return (b + g + r + ycRadiusWeight * chroma) / 3.0f; } -inline float sigmoid_shaper(float x) { +inline float sigmoid_shaper(float const x) { // Sigmoid function in the range 0 to 1 spanning -2 to +2. float t = max(1.0f - std::abs(x / 2.0f), 0.0f); float y = 1.0f + sign(x) * (1.0f - t * t); return y / 2.0f; } -inline float glow_fwd(float ycIn, float glowGainIn, float glowMid) { +inline float glow_fwd(float const ycIn, float const glowGainIn, float const glowMid) { float glowGainOut; if (ycIn <= 2.0f / 3.0f * glowMid) { @@ -82,7 +82,7 @@ inline float glow_fwd(float ycIn, float glowGainIn, float glowMid) { return glowGainOut; } -inline float rgb_2_hue(float3 rgb) { +inline float rgb_2_hue(float3 const rgb) { // Returns a geometric hue angle in degrees (0-360) based on RGB values. // For neutral colors, hue is undefined and the function will return a quiet NaN value. float hue = 0.0f; @@ -95,7 +95,7 @@ inline float rgb_2_hue(float3 rgb) { return (hue < 0.0f) ? hue + 360.0f : hue; } -inline float center_hue(float hue, float centerH) { +inline float center_hue(float const hue, float const centerH) { float hueCentered = hue - centerH; if (hueCentered < -180.0f) { hueCentered = hueCentered + 360.0f; @@ -198,7 +198,7 @@ DEFAULT_CONSTRUCTORS(ToneMapper) DEFAULT_CONSTRUCTORS(LinearToneMapper) -float3 LinearToneMapper::operator()(float3 v) const noexcept { +float3 LinearToneMapper::operator()(float3 const v) const noexcept { return saturate(v); } @@ -208,19 +208,19 @@ float3 LinearToneMapper::operator()(float3 v) const noexcept { DEFAULT_CONSTRUCTORS(ACESToneMapper) -float3 ACESToneMapper::operator()(math::float3 c) const noexcept { +float3 ACESToneMapper::operator()(float3 const c) const noexcept { return aces::ACES(c, 1.0f); } DEFAULT_CONSTRUCTORS(ACESLegacyToneMapper) -float3 ACESLegacyToneMapper::operator()(math::float3 c) const noexcept { +float3 ACESLegacyToneMapper::operator()(float3 const c) const noexcept { return aces::ACES(c, 1.0f / 0.6f); } DEFAULT_CONSTRUCTORS(FilmicToneMapper) -float3 FilmicToneMapper::operator()(math::float3 x) const noexcept { +float3 FilmicToneMapper::operator()(float3 const x) const noexcept { // Narkowicz 2015, "ACES Filmic Tone Mapping Curve" constexpr float a = 2.51f; constexpr float b = 0.03f; @@ -230,13 +230,139 @@ float3 FilmicToneMapper::operator()(math::float3 x) const noexcept { return (x * (a * x + b)) / (x * (c * x + d) + e); } +//------------------------------------------------------------------------------ +// PBR Neutral tone mapper +//------------------------------------------------------------------------------ + +DEFAULT_CONSTRUCTORS(PBRNeutralToneMapper) + +float3 PBRNeutralToneMapper::operator()(float3 color) const noexcept { + // PBR Tone Mapping, https://modelviewer.dev/examples/tone-mapping.html + constexpr float startCompression = 0.8f - 0.04f; + constexpr float desaturation = 0.15f; + + float x = min(color.r, min(color.g, color.b)); + float offset = x < 0.08f ? x - 6.25f * x * x : 0.04f; + color -= offset; + + float peak = max(color.r, max(color.g, color.b)); + if (peak < startCompression) return color; + + float d = 1.0f - startCompression; + float newPeak = 1.0f - d * d / (peak + d - startCompression); + color *= newPeak / peak; + + float g = 1.0f - 1.0f / (desaturation * (peak - newPeak) + 1.0f); + return mix(color, float3(newPeak), g); +} + +//------------------------------------------------------------------------------ +// AgX tone mapper +//------------------------------------------------------------------------------ + +AgxToneMapper::AgxToneMapper(AgxLook const look) noexcept : look(look) {} +AgxToneMapper::~AgxToneMapper() noexcept = default; + +// These matrices taken from Blender's implementation of AgX, which works with Rec.2020 primaries. +// https://github.com/EaryChow/AgX_LUT_Gen/blob/main/AgXBaseRec2020.py +constexpr mat3f AgXInsetMatrix { + 0.856627153315983, 0.137318972929847, 0.11189821299995, + 0.0951212405381588, 0.761241990602591, 0.0767994186031903, + 0.0482516061458583, 0.101439036467562, 0.811302368396859 +}; +constexpr mat3f AgXOutsetMatrixInv { + 0.899796955911611, 0.11142098895748, 0.11142098895748, + 0.0871996192028351, 0.875575586156966, 0.0871996192028349, + 0.013003424885555, 0.0130034248855548, 0.801379391839686 +}; +constexpr mat3f AgXOutsetMatrix { inverse(AgXOutsetMatrixInv) }; + +// LOG2_MIN = -10.0 +// LOG2_MAX = +6.5 +// MIDDLE_GRAY = 0.18 +const float AgxMinEv = -12.47393f; // log2(pow(2, LOG2_MIN) * MIDDLE_GRAY) +const float AgxMaxEv = 4.026069f; // log2(pow(2, LOG2_MAX) * MIDDLE_GRAY) + +// Adapted from https://iolite-engine.com/blog_posts/minimal_agx_implementation +float3 agxDefaultContrastApprox(float3 x) { + float3 x2 = x * x; + float3 x4 = x2 * x2; + float3 x6 = x4 * x2; + return - 17.86f * x6 * x + + 78.01f * x6 + - 126.7f * x4 * x + + 92.06f * x4 + - 28.72f * x2 * x + + 4.361f * x2 + - 0.1718f * x + + 0.002857f; +} + +// Adapted from https://iolite-engine.com/blog_posts/minimal_agx_implementation +float3 agxLook(float3 val, AgxToneMapper::AgxLook look) { + if (look == AgxToneMapper::AgxLook::NONE) { + return val; + } + + const float3 lw = float3(0.2126f, 0.7152f, 0.0722f); + float luma = dot(val, lw); + + // Default + float3 offset = float3(0.0f); + float3 slope = float3(1.0f); + float3 power = float3(1.0f); + float sat = 1.0f; + + if (look == AgxToneMapper::AgxLook::GOLDEN) { + slope = float3(1.0f, 0.9f, 0.5f); + power = float3(0.8f); + sat = 1.3; + } + if (look == AgxToneMapper::AgxLook::PUNCHY) { + slope = float3(1.0f); + power = float3(1.35f, 1.35f, 1.35f); + sat = 1.4; + } + + // ASC CDL + val = pow(val * slope + offset, power); + return luma + sat * (val - luma); +} + +float3 AgxToneMapper::operator()(float3 v) const noexcept { + // Ensure no negative values + v = max(float3(0.0f), v); + + v = AgXInsetMatrix * v; + + // Log2 encoding + v = max(v, 1E-10f); // avoid 0 or negative numbers for log2 + v = log2(v); + v = (v - AgxMinEv) / (AgxMaxEv - AgxMinEv); + + v = clamp(v, 0.0f, 1.0f); + + // Apply sigmoid + v = agxDefaultContrastApprox(v); + + // Apply AgX look + v = agxLook(v, look); + + v = AgXOutsetMatrix * v; + + // Linearize + v = pow(max(float3(0.0f), v), 2.2f); + + return v; +} + //------------------------------------------------------------------------------ // Display range tone mapper //------------------------------------------------------------------------------ DEFAULT_CONSTRUCTORS(DisplayRangeToneMapper) -float3 DisplayRangeToneMapper::operator()(math::float3 c) const noexcept { +float3 DisplayRangeToneMapper::operator()(float3 const c) const noexcept { // 16 debug colors + 1 duplicated at the end for easy indexing constexpr float3 debugColors[17] = { {0.0, 0.0, 0.0}, // black @@ -311,10 +437,10 @@ struct GenericToneMapper::Options { }; GenericToneMapper::GenericToneMapper( - float contrast, - float midGrayIn, - float midGrayOut, - float hdrMax + float const contrast, + float const midGrayIn, + float const midGrayOut, + float const hdrMax ) noexcept { mOptions = new Options(); mOptions->setParameters(contrast, midGrayIn, midGrayOut, hdrMax); @@ -334,7 +460,7 @@ GenericToneMapper& GenericToneMapper::operator=(GenericToneMapper&& rhs) noexcep return *this; } -float3 GenericToneMapper::operator()(math::float3 x) const noexcept { +float3 GenericToneMapper::operator()(float3 x) const noexcept { x = pow(x, mOptions->contrast); return mOptions->outputScale * x / (x + mOptions->inputScale); } @@ -344,7 +470,7 @@ float GenericToneMapper::getMidGrayIn() const noexcept { return mOptions->midGr float GenericToneMapper::getMidGrayOut() const noexcept { return mOptions->midGrayOut; } float GenericToneMapper::getHdrMax() const noexcept { return mOptions->hdrMax; } -void GenericToneMapper::setContrast(float contrast) noexcept { +void GenericToneMapper::setContrast(float const contrast) noexcept { mOptions->setParameters( contrast, mOptions->midGrayIn, @@ -352,7 +478,7 @@ void GenericToneMapper::setContrast(float contrast) noexcept { mOptions->hdrMax ); } -void GenericToneMapper::setMidGrayIn(float midGrayIn) noexcept { +void GenericToneMapper::setMidGrayIn(float const midGrayIn) noexcept { mOptions->setParameters( mOptions->contrast, midGrayIn, @@ -361,7 +487,7 @@ void GenericToneMapper::setMidGrayIn(float midGrayIn) noexcept { ); } -void GenericToneMapper::setMidGrayOut(float midGrayOut) noexcept { +void GenericToneMapper::setMidGrayOut(float const midGrayOut) noexcept { mOptions->setParameters( mOptions->contrast, mOptions->midGrayIn, @@ -370,7 +496,7 @@ void GenericToneMapper::setMidGrayOut(float midGrayOut) noexcept { ); } -void GenericToneMapper::setHdrMax(float hdrMax) noexcept { +void GenericToneMapper::setHdrMax(float const hdrMax) noexcept { mOptions->setParameters( mOptions->contrast, mOptions->midGrayIn, diff --git a/filament/src/TransformManager.cpp b/filament/src/TransformManager.cpp index 4a6b672fe75..c9af857785a 100644 --- a/filament/src/TransformManager.cpp +++ b/filament/src/TransformManager.cpp @@ -22,68 +22,84 @@ namespace filament { using namespace math; -void TransformManager::create(Entity entity, Instance parent, const mat4f& worldTransform) { - downcast(this)->create(entity, parent, worldTransform); +bool TransformManager::hasComponent(Entity const e) const noexcept { + return downcast(this)->hasComponent(e); } -void TransformManager::create(Entity entity, Instance parent, const mat4& worldTransform) { - downcast(this)->create(entity, parent, worldTransform); +size_t TransformManager::getComponentCount() const noexcept { + return downcast(this)->getComponentCount(); } -void TransformManager::create(Entity entity, Instance parent) { - downcast(this)->create(entity, parent, mat4f{}); +bool TransformManager::empty() const noexcept { + return downcast(this)->empty(); } -void TransformManager::destroy(Entity e) noexcept { - downcast(this)->destroy(e); +Entity TransformManager::getEntity(Instance const i) const noexcept { + return downcast(this)->getEntity(i); } -bool TransformManager::hasComponent(Entity e) const noexcept { - return downcast(this)->hasComponent(e); +Entity const* TransformManager::getEntities() const noexcept { + return downcast(this)->getEntities(); } -TransformManager::Instance TransformManager::getInstance(Entity e) const noexcept { +TransformManager::Instance TransformManager::getInstance(Entity const e) const noexcept { return downcast(this)->getInstance(e); } -void TransformManager::setTransform(Instance ci, const mat4f& model) noexcept { +void TransformManager::create(Entity const entity, Instance const parent, const mat4f& worldTransform) { + downcast(this)->create(entity, parent, worldTransform); +} + +void TransformManager::create(Entity const entity, Instance const parent, const mat4& worldTransform) { + downcast(this)->create(entity, parent, worldTransform); +} + +void TransformManager::create(Entity const entity, Instance const parent) { + downcast(this)->create(entity, parent, mat4f{}); +} + +void TransformManager::destroy(Entity const e) noexcept { + downcast(this)->destroy(e); +} + +void TransformManager::setTransform(Instance const ci, const mat4f& model) noexcept { downcast(this)->setTransform(ci, model); } -void TransformManager::setTransform(Instance ci, const mat4& model) noexcept { +void TransformManager::setTransform(Instance const ci, const mat4& model) noexcept { downcast(this)->setTransform(ci, model); } -const mat4f& TransformManager::getTransform(Instance ci) const noexcept { +const mat4f& TransformManager::getTransform(Instance const ci) const noexcept { return downcast(this)->getTransform(ci); } -const mat4 TransformManager::getTransformAccurate(Instance ci) const noexcept { +mat4 TransformManager::getTransformAccurate(Instance const ci) const noexcept { return downcast(this)->getTransformAccurate(ci); } -const mat4f& TransformManager::getWorldTransform(Instance ci) const noexcept { +const mat4f& TransformManager::getWorldTransform(Instance const ci) const noexcept { return downcast(this)->getWorldTransform(ci); } -const mat4 TransformManager::getWorldTransformAccurate(Instance ci) const noexcept { +mat4 TransformManager::getWorldTransformAccurate(Instance const ci) const noexcept { return downcast(this)->getWorldTransformAccurate(ci); } -void TransformManager::setParent(Instance i, Instance newParent) noexcept { +void TransformManager::setParent(Instance const i, Instance const newParent) noexcept { downcast(this)->setParent(i, newParent); } -utils::Entity TransformManager::getParent(Instance i) const noexcept { +Entity TransformManager::getParent(Instance const i) const noexcept { return downcast(this)->getParent(i); } -size_t TransformManager::getChildCount(Instance i) const noexcept { +size_t TransformManager::getChildCount(Instance const i) const noexcept { return downcast(this)->getChildCount(i); } -size_t TransformManager::getChildren(Instance i, utils::Entity* children, - size_t count) const noexcept { +size_t TransformManager::getChildren(Instance const i, Entity* children, + size_t const count) const noexcept { return downcast(this)->getChildren(i, children, count); } @@ -96,21 +112,21 @@ void TransformManager::commitLocalTransformTransaction() noexcept { } TransformManager::children_iterator TransformManager::getChildrenBegin( - TransformManager::Instance parent) const noexcept { + Instance const parent) const noexcept { return downcast(this)->getChildrenBegin(parent); } TransformManager::children_iterator TransformManager::getChildrenEnd( - TransformManager::Instance parent) const noexcept { + Instance const parent) const noexcept { return downcast(this)->getChildrenEnd(parent); } -void TransformManager::setAccurateTranslationsEnabled(bool enable) noexcept { +void TransformManager::setAccurateTranslationsEnabled(bool const enable) noexcept { downcast(this)->setAccurateTranslationsEnabled(enable); } bool TransformManager::isAccurateTranslationsEnabled() const noexcept { - return downcast(this)->isAccurateTranslationsEnabled();; + return downcast(this)->isAccurateTranslationsEnabled(); } } // namespace filament diff --git a/filament/src/TypedUniformBuffer.h b/filament/src/TypedUniformBuffer.h index 264784dbf68..ea55b7c43d2 100644 --- a/filament/src/TypedUniformBuffer.h +++ b/filament/src/TypedUniformBuffer.h @@ -14,21 +14,20 @@ * limitations under the License. */ -#ifndef TNT_FILAMENT_TYPEDUNIFORMBUFFER_H -#define TNT_FILAMENT_TYPEDUNIFORMBUFFER_H +#ifndef TNT_FILAMENT_TYPEDBUFFER_H +#define TNT_FILAMENT_TYPEDBUFFER_H -#include "private/backend/DriverApi.h" - -#include +#include #include #include +#include namespace filament { template -class TypedUniformBuffer { // NOLINT(cppcoreguidelines-pro-type-member-init) +class TypedBuffer { // NOLINT(cppcoreguidelines-pro-type-member-init) public: T& itemAt(size_t i) noexcept { @@ -73,4 +72,4 @@ class TypedUniformBuffer { // NOLINT(cppcoreguidelines-pro-type-member-init) } // namespace filament -#endif // TNT_FILAMENT_TYPEDUNIFORMBUFFER_H +#endif // TNT_FILAMENT_TYPEDBUFFER_H diff --git a/filament/src/UniformBuffer.cpp b/filament/src/UniformBuffer.cpp index acbce78bf09..e61ddc4f9d6 100644 --- a/filament/src/UniformBuffer.cpp +++ b/filament/src/UniformBuffer.cpp @@ -23,12 +23,12 @@ using namespace filament::math; namespace filament { -UniformBuffer::UniformBuffer(size_t size) noexcept +UniformBuffer::UniformBuffer(size_t const size) noexcept : mBuffer(mStorage), mSize(uint32_t(size)), mSomethingDirty(true) { if (UTILS_LIKELY(size > sizeof(mStorage))) { - mBuffer = UniformBuffer::alloc(size); + mBuffer = alloc(size); } memset(mBuffer, 0, size); } @@ -65,13 +65,13 @@ UniformBuffer& UniformBuffer::setUniforms(const UniformBuffer& rhs) noexcept { if (UTILS_UNLIKELY(mSize != rhs.mSize)) { // first free our storage if any if (mBuffer && !isLocalStorage()) { - UniformBuffer::free(mBuffer, mSize); + free(mBuffer, mSize); } // and allocate new storage mBuffer = mStorage; mSize = rhs.mSize; if (mSize > sizeof(mStorage)) { - mBuffer = UniformBuffer::alloc(mSize); + mBuffer = alloc(mSize); } } memcpy(mBuffer, rhs.mBuffer, rhs.mSize); @@ -81,9 +81,9 @@ UniformBuffer& UniformBuffer::setUniforms(const UniformBuffer& rhs) noexcept { return *this; } -void* UniformBuffer::alloc(size_t size) noexcept { +void* UniformBuffer::alloc(size_t const size) noexcept { // these allocations have a long life span - return ::malloc(size); + return malloc(size); } void UniformBuffer::free(void* addr, size_t) noexcept { @@ -93,7 +93,7 @@ void UniformBuffer::free(void* addr, size_t) noexcept { // ------------------------------------------------------------------------------------------------ template -void UniformBuffer::setUniformUntyped(size_t offset, void const* UTILS_RESTRICT v) noexcept{ +void UniformBuffer::setUniformUntyped(size_t const offset, void const* UTILS_RESTRICT v) noexcept{ setUniformUntyped(invalidateUniforms(offset, Size), 0ul, v); } @@ -109,7 +109,7 @@ template void UniformBuffer::setUniformUntyped<64ul>(size_t offset, void const* UTILS_RESTRICT v) noexcept; template -void UniformBuffer::setUniformArrayUntyped(size_t offset, void const* UTILS_RESTRICT begin, size_t count) noexcept { +void UniformBuffer::setUniformArrayUntyped(size_t const offset, void const* UTILS_RESTRICT begin, size_t const count) noexcept { constexpr size_t stride = (Size + 0xFu) & ~0xFu; size_t arraySize = stride * count - stride + Size; void* UTILS_RESTRICT p = invalidateUniforms(offset, arraySize); @@ -133,7 +133,7 @@ void UniformBuffer::setUniformArrayUntyped<64ul>(size_t offset, void const* UTIL // specialization for mat3f (which has a different alignment, see std140 layout rules) template<> UTILS_NOINLINE -void UniformBuffer::setUniform(void* addr, size_t offset, const math::mat3f& v) noexcept { +void UniformBuffer::setUniform(void* addr, size_t const offset, const mat3f& v) noexcept { struct mat43 { float v[3][4]; }; @@ -157,7 +157,7 @@ void UniformBuffer::setUniform(void* addr, size_t offset, const math::mat3f& v) } template<> -void UniformBuffer::setUniform(size_t offset, const math::mat3f& v) noexcept { +void UniformBuffer::setUniform(size_t const offset, const mat3f& v) noexcept { setUniform(invalidateUniforms(offset, sizeof(v)), 0, v); } diff --git a/filament/src/UniformBuffer.h b/filament/src/UniformBuffer.h index 090ee76eecb..0499479ff67 100644 --- a/filament/src/UniformBuffer.h +++ b/filament/src/UniformBuffer.h @@ -60,14 +60,14 @@ class UniformBuffer { // NOLINT(cppcoreguidelines-pro-type-member-init) // immediately jump into libc's free() if (mBuffer && !isLocalStorage()) { // test not necessary but avoids a call to libc (and this is a common enough case) - UniformBuffer::free(mBuffer, mSize); + free(mBuffer, mSize); } } UniformBuffer& setUniforms(const UniformBuffer& rhs) noexcept; // invalidate a range of uniforms and return a pointer to it. offset and size given in bytes - void* invalidateUniforms(size_t offset, size_t size) { + void* invalidateUniforms(size_t const offset, size_t const size) { assert_invariant(offset + size <= mSize); mSomethingDirty = true; return static_cast(mBuffer) + offset; @@ -133,7 +133,7 @@ class UniformBuffer { // NOLINT(cppcoreguidelines-pro-type-member-init) // The "x" symbols represent dummy words. template::type> UTILS_ALWAYS_INLINE - void setUniformArray(size_t offset, T const* UTILS_RESTRICT begin, size_t count) noexcept { + void setUniformArray(size_t const offset, T const* UTILS_RESTRICT begin, size_t const count) noexcept { static_assert(!std::is_same_v); setUniformArrayUntyped(offset, begin, count); } @@ -141,21 +141,21 @@ class UniformBuffer { // NOLINT(cppcoreguidelines-pro-type-member-init) // (see specialization for mat3f below) template::type> UTILS_ALWAYS_INLINE - static inline void setUniform(void* addr, size_t offset, const T& v) noexcept { + static inline void setUniform(void* addr, size_t const offset, const T& v) noexcept { static_assert(!std::is_same_v); setUniformUntyped(addr, offset, &v); } template::type> UTILS_ALWAYS_INLINE - inline void setUniform(size_t offset, const T& v) noexcept { + inline void setUniform(size_t const offset, const T& v) noexcept { static_assert(!std::is_same_v); setUniformUntyped(offset, &v); } // get uniform of known types from the proper offset (e.g.: use offsetof()) template::type> - T getUniform(size_t offset) const noexcept { + T getUniform(size_t const offset) const noexcept { static_assert(!std::is_same_v); return *reinterpret_cast(static_cast(mBuffer) + offset); } @@ -168,7 +168,7 @@ class UniformBuffer { // NOLINT(cppcoreguidelines-pro-type-member-init) // copy the UBO data and cleans the dirty bits backend::BufferDescriptor toBufferDescriptor( - backend::DriverApi& driver, size_t offset, size_t size) const noexcept { + backend::DriverApi& driver, size_t const offset, size_t const size) const noexcept { backend::BufferDescriptor p; p.size = size; p.buffer = driver.allocate(p.size); // TODO: use out-of-line buffer if too large @@ -194,7 +194,7 @@ class UniformBuffer { // NOLINT(cppcoreguidelines-pro-type-member-init) template = true> UTILS_ALWAYS_INLINE - static void setUniformUntyped(void* addr, size_t offset, void const* v) noexcept { + static void setUniformUntyped(void* addr, size_t const offset, void const* v) noexcept { memcpy(static_cast(addr) + offset, v, Size); // inlined } @@ -215,13 +215,13 @@ void UniformBuffer::setUniform(size_t offset, const math::mat3f& v) noexcept; template<> inline void UniformBuffer::setUniformArray( - size_t offset, math::mat3f const* UTILS_RESTRICT begin, size_t count) noexcept { + size_t const offset, math::mat3f const* UTILS_RESTRICT begin, size_t const count) noexcept { // pretend each mat3 is an array of 3 float3 setUniformArray(offset, reinterpret_cast(begin), count * 3); } template<> -inline math::mat3f UniformBuffer::getUniform(size_t offset) const noexcept { +inline math::mat3f UniformBuffer::getUniform(size_t const offset) const noexcept { math::float4 const* p = reinterpret_cast( static_cast(mBuffer) + offset); return { p[0].xyz, p[1].xyz, p[2].xyz }; diff --git a/filament/src/VertexBuffer.cpp b/filament/src/VertexBuffer.cpp index 37e8f63f811..6c6243be734 100644 --- a/filament/src/VertexBuffer.cpp +++ b/filament/src/VertexBuffer.cpp @@ -24,12 +24,12 @@ size_t VertexBuffer::getVertexCount() const noexcept { return downcast(this)->getVertexCount(); } -void VertexBuffer::setBufferAt(Engine& engine, uint8_t bufferIndex, - backend::BufferDescriptor&& buffer, uint32_t byteOffset) { +void VertexBuffer::setBufferAt(Engine& engine, uint8_t const bufferIndex, + backend::BufferDescriptor&& buffer, uint32_t const byteOffset) { downcast(this)->setBufferAt(downcast(engine), bufferIndex, std::move(buffer), byteOffset); } -void VertexBuffer::setBufferObjectAt(Engine& engine, uint8_t bufferIndex, +void VertexBuffer::setBufferObjectAt(Engine& engine, uint8_t const bufferIndex, BufferObject const* bufferObject) { downcast(this)->setBufferObjectAt(downcast(engine), bufferIndex, downcast(bufferObject)); } diff --git a/filament/src/View.cpp b/filament/src/View.cpp index 19ed5b859e5..4bf4e53348b 100644 --- a/filament/src/View.cpp +++ b/filament/src/View.cpp @@ -15,6 +15,8 @@ */ #include "details/View.h" +#include "filament/View.h" + namespace filament { @@ -31,19 +33,23 @@ void View::setCamera(Camera* camera) noexcept { downcast(this)->setCameraUser(downcast(camera)); } +bool View::hasCamera() const noexcept { + return downcast(this)->hasCamera(); +} + Camera& View::getCamera() noexcept { return downcast(this)->getCameraUser(); } -void View::setViewport(filament::Viewport const& viewport) noexcept { +void View::setViewport(Viewport const& viewport) noexcept { downcast(this)->setViewport(viewport); } -filament::Viewport const& View::getViewport() const noexcept { +Viewport const& View::getViewport() const noexcept { return downcast(this)->getViewport(); } -void View::setFrustumCullingEnabled(bool culling) noexcept { +void View::setFrustumCullingEnabled(bool const culling) noexcept { downcast(this)->setFrustumCullingEnabled(culling); } @@ -55,7 +61,7 @@ void View::setDebugCamera(Camera* camera) noexcept { downcast(this)->setViewingCamera(downcast(camera)); } -void View::setVisibleLayers(uint8_t select, uint8_t values) noexcept { +void View::setVisibleLayers(uint8_t const select, uint8_t const values) noexcept { downcast(this)->setVisibleLayers(select, values); } @@ -67,11 +73,11 @@ const char* View::getName() const noexcept { return downcast(this)->getName(); } -Camera const* View::getDirectionalLightCamera() const noexcept { - return downcast(this)->getDirectionalLightCamera(); +utils::FixedCapacityVector View::getDirectionalShadowCameras() const noexcept { + return downcast(this)->getDirectionalShadowCameras(); } -void View::setShadowingEnabled(bool enabled) noexcept { +void View::setShadowingEnabled(bool const enabled) noexcept { downcast(this)->setShadowingEnabled(enabled); } @@ -83,7 +89,7 @@ RenderTarget* View::getRenderTarget() const noexcept { return downcast(this)->getRenderTarget(); } -void View::setSampleCount(uint8_t count) noexcept { +void View::setSampleCount(uint8_t const count) noexcept { downcast(this)->setSampleCount(count); } @@ -91,7 +97,7 @@ uint8_t View::getSampleCount() const noexcept { return downcast(this)->getSampleCount(); } -void View::setAntiAliasing(AntiAliasing type) noexcept { +void View::setAntiAliasing(AntiAliasing const type) noexcept { downcast(this)->setAntiAliasing(type); } @@ -107,7 +113,7 @@ const View::TemporalAntiAliasingOptions& View::getTemporalAntiAliasingOptions() return downcast(this)->getTemporalAntiAliasingOptions(); } -void View::setMultiSampleAntiAliasingOptions(MultiSampleAntiAliasingOptions options) noexcept { +void View::setMultiSampleAntiAliasingOptions(MultiSampleAntiAliasingOptions const options) noexcept { downcast(this)->setMultiSampleAntiAliasingOptions(options); } @@ -123,7 +129,7 @@ const View::ScreenSpaceReflectionsOptions& View::getScreenSpaceReflectionsOption return downcast(this)->getScreenSpaceReflectionsOptions(); } -void View::setGuardBandOptions(GuardBandOptions options) noexcept { +void View::setGuardBandOptions(GuardBandOptions const options) noexcept { downcast(this)->setGuardBandOptions(options); } @@ -139,7 +145,7 @@ const ColorGrading* View::getColorGrading() const noexcept { return downcast(this)->getColorGrading(); } -void View::setDithering(Dithering dithering) noexcept { +void View::setDithering(Dithering const dithering) noexcept { downcast(this)->setDithering(dithering); } @@ -163,7 +169,7 @@ View::RenderQuality View::getRenderQuality() const noexcept { return downcast(this)->getRenderQuality(); } -void View::setPostProcessingEnabled(bool enabled) noexcept { +void View::setPostProcessingEnabled(bool const enabled) noexcept { downcast(this)->setPostProcessingEnabled(enabled); } @@ -171,7 +177,7 @@ bool View::isPostProcessingEnabled() const noexcept { return downcast(this)->hasPostProcessPass(); } -void View::setFrontFaceWindingInverted(bool inverted) noexcept { +void View::setFrontFaceWindingInverted(bool const inverted) noexcept { downcast(this)->setFrontFaceWindingInverted(inverted); } @@ -179,14 +185,26 @@ bool View::isFrontFaceWindingInverted() const noexcept { return downcast(this)->isFrontFaceWindingInverted(); } -void View::setDynamicLightingOptions(float zLightNear, float zLightFar) noexcept { +void View::setTransparentPickingEnabled(bool const enabled) noexcept { + downcast(this)->setTransparentPickingEnabled(enabled); +} + +bool View::isTransparentPickingEnabled() const noexcept { + return downcast(this)->isTransparentPickingEnabled(); +} + +void View::setDynamicLightingOptions(float const zLightNear, float const zLightFar) noexcept { downcast(this)->setDynamicLightingOptions(zLightNear, zLightFar); } -void View::setShadowType(View::ShadowType shadow) noexcept { +void View::setShadowType(ShadowType const shadow) noexcept { downcast(this)->setShadowType(shadow); } +View::ShadowType View::getShadowType() const noexcept { + return downcast(this)->getShadowType(); +} + void View::setVsmShadowOptions(VsmShadowOptions const& options) noexcept { downcast(this)->setVsmShadowOptions(options); } @@ -203,7 +221,7 @@ SoftShadowOptions View::getSoftShadowOptions() const noexcept { return downcast(this)->getSoftShadowOptions(); } -void View::setAmbientOcclusion(View::AmbientOcclusion ambientOcclusion) noexcept { +void View::setAmbientOcclusion(AmbientOcclusion const ambientOcclusion) noexcept { downcast(this)->setAmbientOcclusion(ambientOcclusion); } @@ -211,7 +229,7 @@ View::AmbientOcclusion View::getAmbientOcclusion() const noexcept { return downcast(this)->getAmbientOcclusion(); } -void View::setAmbientOcclusionOptions(View::AmbientOcclusionOptions const& options) noexcept { +void View::setAmbientOcclusionOptions(AmbientOcclusionOptions const& options) noexcept { downcast(this)->setAmbientOcclusionOptions(options); } @@ -219,7 +237,7 @@ View::AmbientOcclusionOptions const& View::getAmbientOcclusionOptions() const no return downcast(this)->getAmbientOcclusionOptions(); } -void View::setBloomOptions(View::BloomOptions options) noexcept { +void View::setBloomOptions(BloomOptions options) noexcept { downcast(this)->setBloomOptions(options); } @@ -227,7 +245,7 @@ View::BloomOptions View::getBloomOptions() const noexcept { return downcast(this)->getBloomOptions(); } -void View::setFogOptions(View::FogOptions options) noexcept { +void View::setFogOptions(FogOptions options) noexcept { downcast(this)->setFogOptions(options); } @@ -243,7 +261,7 @@ View::DepthOfFieldOptions View::getDepthOfFieldOptions() const noexcept { return downcast(this)->getDepthOfFieldOptions(); } -void View::setVignetteOptions(View::VignetteOptions options) noexcept { +void View::setVignetteOptions(VignetteOptions options) noexcept { downcast(this)->setVignetteOptions(options); } @@ -251,7 +269,7 @@ View::VignetteOptions View::getVignetteOptions() const noexcept { return downcast(this)->getVignetteOptions(); } -void View::setBlendMode(BlendMode blendMode) noexcept { +void View::setBlendMode(BlendMode const blendMode) noexcept { downcast(this)->setBlendMode(blendMode); } @@ -267,7 +285,7 @@ bool View::isShadowingEnabled() const noexcept { return downcast(this)->isShadowingEnabled(); } -void View::setScreenSpaceRefractionEnabled(bool enabled) noexcept { +void View::setScreenSpaceRefractionEnabled(bool const enabled) noexcept { downcast(this)->setScreenSpaceRefractionEnabled(enabled); } @@ -275,7 +293,7 @@ bool View::isScreenSpaceRefractionEnabled() const noexcept { return downcast(this)->isScreenSpaceRefractionEnabled(); } -void View::setStencilBufferEnabled(bool enabled) noexcept { +void View::setStencilBufferEnabled(bool const enabled) noexcept { downcast(this)->setStencilBufferEnabled(enabled); } @@ -283,9 +301,33 @@ bool View::isStencilBufferEnabled() const noexcept { return downcast(this)->isStencilBufferEnabled(); } -View::PickingQuery& View::pick(uint32_t x, uint32_t y, backend::CallbackHandler* handler, - View::PickingQueryResultCallback callback) noexcept { +void View::setStereoscopicOptions(const StereoscopicOptions& options) noexcept { + return downcast(this)->setStereoscopicOptions(options); +} + +const View::StereoscopicOptions& View::getStereoscopicOptions() const noexcept { + return downcast(this)->getStereoscopicOptions(); +} + +View::PickingQuery& View::pick(uint32_t const x, uint32_t const y, backend::CallbackHandler* handler, + PickingQueryResultCallback const callback) noexcept { return downcast(this)->pick(x, y, handler, callback); } +void View::setMaterialGlobal(uint32_t const index, math::float4 const& value) { + downcast(this)->setMaterialGlobal(index, value); +} + +math::float4 View::getMaterialGlobal(uint32_t const index) const { + return downcast(this)->getMaterialGlobal(index); +} + +utils::Entity View::getFogEntity() const noexcept { + return downcast(this)->getFogEntity(); +} + +void View::clearFrameHistory(Engine& engine) noexcept { + downcast(this)->clearFrameHistory(downcast(engine)); +} + } // namespace filament diff --git a/filament/src/components/CameraManager.cpp b/filament/src/components/CameraManager.cpp index 33bdc1bae8e..8e9b41dd144 100644 --- a/filament/src/components/CameraManager.cpp +++ b/filament/src/components/CameraManager.cpp @@ -23,70 +23,82 @@ #include #include -#include - using namespace utils; using namespace filament::math; namespace filament { -FCameraManager::FCameraManager(FEngine& engine) noexcept - : mEngine(engine) { +FCameraManager::FCameraManager(FEngine&) noexcept { } -FCameraManager::~FCameraManager() noexcept { -} +FCameraManager::~FCameraManager() noexcept = default; -void FCameraManager::terminate() noexcept { +void FCameraManager::terminate(FEngine& engine) noexcept { auto& manager = mManager; if (!manager.empty()) { #ifndef NDEBUG slog.d << "cleaning up " << manager.getComponentCount() << " leaked Camera components" << io::endl; #endif - while (!manager.empty()) { - Instance ci = manager.end() - 1; - destroy(manager.getEntity(ci)); + Slice const entities{ manager.getEntities(), manager.getComponentCount() }; + for (Entity const e : entities) { + destroy(engine, e); } } } -void FCameraManager::gc(utils::EntityManager& em) noexcept { +void FCameraManager::gc(FEngine& engine, EntityManager& em) noexcept { auto& manager = mManager; - manager.gc(em, 4, [this](Entity e) { - destroy(e); + manager.gc(em, [this, &engine](Entity const e) { + destroy(engine, e); }); } -FCamera* FCameraManager::create(Entity entity) { - FEngine& engine = mEngine; +FCamera* FCameraManager::create(FEngine& engine, Entity entity) { auto& manager = mManager; + // if this entity already has Camera component, destroy it. if (UTILS_UNLIKELY(manager.hasComponent(entity))) { - destroy(entity); + destroy(engine, entity); } - Instance i = manager.addComponent(entity); - FCamera* camera = engine.getHeapAllocator().make(engine, entity); + // add the Camera component to the entity + Instance const i = manager.addComponent(entity); + + // For historical reasons, FCamera must not move. So the CameraManager stores a pointer. + FCamera* const camera = engine.getHeapAllocator().make(engine, entity); manager.elementAt(i) = camera; + manager.elementAt(i) = false; // Make sure we have a transform component - FTransformManager& transformManager = engine.getTransformManager(); - if (!transformManager.hasComponent(entity)) { - transformManager.create(entity); + FTransformManager& tcm = engine.getTransformManager(); + if (!tcm.hasComponent(entity)) { + tcm.create(entity); + manager.elementAt(i) = true; } return camera; } -void FCameraManager::destroy(Entity e) noexcept { +void FCameraManager::destroy(FEngine& engine, Entity const e) noexcept { auto& manager = mManager; - Instance i = manager.getInstance(e); - if (i) { - FCamera* camera = manager.elementAt(i); - assert_invariant(camera); - camera->terminate(mEngine); - mEngine.getHeapAllocator().destroy(camera); - manager.removeComponent(e); + if (Instance const i = manager.getInstance(e) ; i) { + // destroy the FCamera object + bool const ownsTransformComponent = manager.elementAt(i); + + { // scope for camera -- it's invalid after this scope. + FCamera* const camera = manager.elementAt(i); + assert_invariant(camera); + camera->terminate(engine); + engine.getHeapAllocator().destroy(camera); + + // Remove the camera component + manager.removeComponent(e); + } + + // if we added the transform component, remove it. + if (ownsTransformComponent) { + engine.getTransformManager().destroy(e); + } } } diff --git a/filament/src/components/CameraManager.h b/filament/src/components/CameraManager.h index c6753f95539..a3d23f6995b 100644 --- a/filament/src/components/CameraManager.h +++ b/filament/src/components/CameraManager.h @@ -37,52 +37,67 @@ class FCamera; class UTILS_PRIVATE FCameraManager : public CameraManager { public: - using Instance = CameraManager::Instance; + using Instance = Instance; explicit FCameraManager(FEngine& engine) noexcept; ~FCameraManager() noexcept; // free-up all resources - void terminate() noexcept; + void terminate(FEngine& engine) noexcept; - void gc(utils::EntityManager& em) noexcept; + void gc(FEngine& engine, utils::EntityManager& em) noexcept; /* * Component Manager APIs */ - bool hasComponent(utils::Entity e) const noexcept { + bool hasComponent(utils::Entity const e) const noexcept { return mManager.hasComponent(e); } - Instance getInstance(utils::Entity e) const noexcept { - return Instance(mManager.getInstance(e)); + Instance getInstance(utils::Entity const e) const noexcept { + return { mManager.getInstance(e) }; } - FCamera* getCamera(Instance i) noexcept { + size_t getComponentCount() const noexcept { + return mManager.getComponentCount(); + } + + bool empty() const noexcept { + return mManager.empty(); + } + + utils::Entity getEntity(Instance const i) const noexcept { + return mManager.getEntity(i); + } + + utils::Entity const* getEntities() const noexcept { + return mManager.getEntities(); + } + + FCamera* getCamera(Instance const i) noexcept { return mManager.elementAt(i); } - FCamera* create(utils::Entity entity); + FCamera* create(FEngine& engine, utils::Entity entity); - void destroy(utils::Entity e) noexcept; + void destroy(FEngine& engine, utils::Entity e) noexcept; private: enum { - CAMERA + CAMERA, + OWNS_TRANSFORM_COMPONENT }; - using Base = utils::SingleInstanceComponentManager; + using Base = utils::SingleInstanceComponentManager; struct CameraManagerImpl : public Base { using Base::gc; using Base::swap; using Base::hasComponent; } mManager; - - FEngine& mEngine; }; } // namespace filament diff --git a/filament/src/components/LightManager.cpp b/filament/src/components/LightManager.cpp index 8e084554b1c..4b677bc7545 100644 --- a/filament/src/components/LightManager.cpp +++ b/filament/src/components/LightManager.cpp @@ -19,13 +19,26 @@ #include "components/LightManager.h" #include "details/Engine.h" +#include "utils/ostream.h" + +#include + +#include +#include +#include +#include #include #include +#include +#include -#include -#include +#include +#include +#include +#include +#include using namespace filament::math; using namespace utils; @@ -51,20 +64,20 @@ struct LightManager::BuilderDetails { float mSunHaloFalloff = 80.0f; ShadowOptions mShadowOptions; - explicit BuilderDetails(Type type) noexcept : mType(type) { } + explicit BuilderDetails(Type const type) noexcept : mType(type) { } // this is only needed for the explicit instantiation below BuilderDetails() = default; }; using BuilderType = LightManager; -BuilderType::Builder::Builder(Type type) noexcept: BuilderBase(type) {} +BuilderType::Builder::Builder(Type type) noexcept: BuilderBase(type) {} BuilderType::Builder::~Builder() noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder&& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder&& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder const& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder&& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder const& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder&& rhs) noexcept = default; -LightManager::Builder& LightManager::Builder::castShadows(bool enable) noexcept { +LightManager::Builder& LightManager::Builder::castShadows(bool const enable) noexcept { mImpl->mCastShadows = enable; return *this; } @@ -74,7 +87,7 @@ LightManager::Builder& LightManager::Builder::shadowOptions(const ShadowOptions& return *this; } -LightManager::Builder& LightManager::Builder::castLight(bool enable) noexcept { +LightManager::Builder& LightManager::Builder::castLight(bool const enable) noexcept { mImpl->mCastLight = enable; return *this; } @@ -94,25 +107,25 @@ LightManager::Builder& LightManager::Builder::color(const LinearColor& color) no return *this; } -LightManager::Builder& LightManager::Builder::intensity(float intensity) noexcept { +LightManager::Builder& LightManager::Builder::intensity(float const intensity) noexcept { mImpl->mIntensity = intensity; mImpl->mIntensityUnit = FLightManager::IntensityUnit::LUMEN_LUX; return *this; } -LightManager::Builder& LightManager::Builder::intensityCandela(float intensity) noexcept { +LightManager::Builder& LightManager::Builder::intensityCandela(float const intensity) noexcept { mImpl->mIntensity = intensity; mImpl->mIntensityUnit = FLightManager::IntensityUnit::CANDELA; return *this; } -LightManager::Builder& LightManager::Builder::intensity(float watts, float efficiency) noexcept { +LightManager::Builder& LightManager::Builder::intensity(float const watts, float const efficiency) noexcept { mImpl->mIntensity = efficiency * 683.0f * watts; mImpl->mIntensityUnit = FLightManager::IntensityUnit::LUMEN_LUX; return *this; } -LightManager::Builder& LightManager::Builder::falloff(float radius) noexcept { +LightManager::Builder& LightManager::Builder::falloff(float const radius) noexcept { mImpl->mFalloff = radius; return *this; } @@ -122,22 +135,22 @@ LightManager::Builder& LightManager::Builder::spotLightCone(float inner, float o return *this; } -LightManager::Builder& LightManager::Builder::sunAngularRadius(float sunAngle) noexcept { +LightManager::Builder& LightManager::Builder::sunAngularRadius(float const sunAngle) noexcept { mImpl->mSunAngle = sunAngle; return *this; } -LightManager::Builder& LightManager::Builder::sunHaloSize(float haloSize) noexcept { +LightManager::Builder& LightManager::Builder::sunHaloSize(float const haloSize) noexcept { mImpl->mSunHaloSize = haloSize; return *this; } -LightManager::Builder& LightManager::Builder::sunHaloFalloff(float haloFalloff) noexcept { +LightManager::Builder& LightManager::Builder::sunHaloFalloff(float const haloFalloff) noexcept { mImpl->mSunHaloFalloff = haloFalloff; return *this; } -LightManager::Builder& LightManager::Builder::lightChannel(unsigned int channel, bool enable) noexcept { +LightManager::Builder& LightManager::Builder::lightChannel(unsigned int const channel, bool const enable) noexcept { if (channel < 8) { const uint8_t mask = 1u << channel; mImpl->mChannels &= ~mask; @@ -146,7 +159,7 @@ LightManager::Builder& LightManager::Builder::lightChannel(unsigned int channel, return *this; } -LightManager::Builder::Result LightManager::Builder::build(Engine& engine, Entity entity) { +LightManager::Builder::Result LightManager::Builder::build(Engine& engine, Entity const entity) { downcast(engine).createLight(*this, entity); return Success; } @@ -163,16 +176,16 @@ FLightManager::~FLightManager() { assert_invariant(mManager.getComponentCount() == 0); } -void FLightManager::init(FEngine& engine) noexcept { +void FLightManager::init(FEngine&) noexcept { } -void FLightManager::create(const FLightManager::Builder& builder, utils::Entity entity) { +void FLightManager::create(const Builder& builder, Entity const entity) { auto& manager = mManager; if (UTILS_UNLIKELY(manager.hasComponent(entity))) { destroy(entity); } - Instance i = manager.addComponent(entity); + Instance const i = manager.addComponent(entity); assert_invariant(i); if (i) { @@ -202,11 +215,11 @@ void FLightManager::create(const FLightManager::Builder& builder, utils::Entity } } -void FLightManager::prepare(backend::DriverApi& driver) const noexcept { +void FLightManager::prepare(backend::DriverApi&) const noexcept { } -void FLightManager::destroy(utils::Entity e) noexcept { - Instance i = getInstance(e); +void FLightManager::destroy(Entity const e) noexcept { + Instance const i = getInstance(e); if (i) { auto& manager = mManager; manager.removeComponent(e); @@ -221,16 +234,18 @@ void FLightManager::terminate() noexcept { << " leaked Light components" << io::endl; #endif while (!manager.empty()) { - Instance ci = manager.end() - 1; + Instance const ci = manager.end() - 1; manager.removeComponent(manager.getEntity(ci)); } } } -void FLightManager::gc(utils::EntityManager& em) noexcept { - mManager.gc(em); +void FLightManager::gc(EntityManager& em) noexcept { + mManager.gc(em, [this](Entity const e) { + destroy(e); + }); } -void FLightManager::setShadowOptions(Instance i, ShadowOptions const& options) noexcept { +void FLightManager::setShadowOptions(Instance const i, ShadowOptions const& options) noexcept { ShadowParams& params = mManager[i].shadowParams; params.options = options; params.options.mapSize = clamp(options.mapSize, 8u, 2048u); @@ -243,7 +258,7 @@ void FLightManager::setShadowOptions(Instance i, ShadowOptions const& options) n params.options.vsm.blurWidth = std::max(0.0f, options.vsm.blurWidth); } -void FLightManager::setLightChannel(Instance i, unsigned int channel, bool enable) noexcept { +void FLightManager::setLightChannel(Instance const i, unsigned int const channel, bool const enable) noexcept { if (i) { if (channel < 8) { auto& manager = mManager; @@ -254,7 +269,7 @@ void FLightManager::setLightChannel(Instance i, unsigned int channel, bool enabl } } -bool FLightManager::getLightChannel(Instance i, unsigned int channel) const noexcept { +bool FLightManager::getLightChannel(Instance const i, unsigned int const channel) const noexcept { if (i) { if (channel < 8) { auto& manager = mManager; @@ -265,33 +280,33 @@ bool FLightManager::getLightChannel(Instance i, unsigned int channel) const noex return false; } -void FLightManager::setLocalPosition(Instance i, const float3& position) noexcept { +void FLightManager::setLocalPosition(Instance const i, const float3& position) noexcept { if (i) { auto& manager = mManager; manager[i].position = position; } } -void FLightManager::setLocalDirection(Instance i, float3 direction) noexcept { +void FLightManager::setLocalDirection(Instance const i, float3 const direction) noexcept { if (i) { auto& manager = mManager; manager[i].direction = direction; } } -void FLightManager::setColor(Instance i, const LinearColor& color) noexcept { +void FLightManager::setColor(Instance const i, const LinearColor& color) noexcept { if (i) { auto& manager = mManager; manager[i].color = color; } } -void FLightManager::setIntensity(Instance i, float intensity, IntensityUnit unit) noexcept { +void FLightManager::setIntensity(Instance const i, float const intensity, IntensityUnit const unit) noexcept { auto& manager = mManager; if (i) { - Type type = getLightType(i).type; + Type const type = getLightType(i).type; float luminousPower = intensity; - float luminousIntensity; + float luminousIntensity = 0.0f; switch (type) { case Type::SUN: case Type::DIRECTIONAL: @@ -312,7 +327,7 @@ void FLightManager::setIntensity(Instance i, float intensity, IntensityUnit unit case Type::FOCUSED_SPOT: { SpotParams& spotParams = manager[i].spotParams; - float cosOuter = std::sqrt(spotParams.cosOuterSquared); + float const cosOuter = std::sqrt(spotParams.cosOuterSquared); if (unit == IntensityUnit::LUMEN_LUX) { // li = lp / (2 * pi * (1 - cos(cone_outer / 2))) luminousIntensity = luminousPower / (f::TAU * (1.0f - cosOuter)); @@ -332,7 +347,7 @@ void FLightManager::setIntensity(Instance i, float intensity, IntensityUnit unit luminousIntensity = luminousPower * f::ONE_OVER_PI; } else { assert_invariant(unit == IntensityUnit::CANDELA); - // intensity specified directly in candela, no conversion needed + // intensity specified directly in Candela, no conversion needed luminousIntensity = luminousPower; } break; @@ -341,31 +356,31 @@ void FLightManager::setIntensity(Instance i, float intensity, IntensityUnit unit } } -void FLightManager::setFalloff(Instance i, float falloff) noexcept { +void FLightManager::setFalloff(Instance const i, float const falloff) noexcept { auto& manager = mManager; if (i && !isDirectionalLight(i)) { - float sqFalloff = falloff * falloff; + float const sqFalloff = falloff * falloff; SpotParams& spotParams = manager[i].spotParams; manager[i].squaredFallOffInv = sqFalloff > 0.0f ? (1 / sqFalloff) : 0; spotParams.radius = falloff; } } -void FLightManager::setSpotLightCone(Instance i, float inner, float outer) noexcept { +void FLightManager::setSpotLightCone(Instance const i, float const inner, float const outer) noexcept { auto& manager = mManager; if (i && isSpotLight(i)) { // clamp the inner/outer angles to [0.5 degrees, 90 degrees] float innerClamped = std::clamp(std::abs(inner), 0.5f * f::DEG_TO_RAD, f::PI_2); - float outerClamped = std::clamp(std::abs(outer), 0.5f * f::DEG_TO_RAD, f::PI_2); + float const outerClamped = std::clamp(std::abs(outer), 0.5f * f::DEG_TO_RAD, f::PI_2); // inner must always be smaller than outer innerClamped = std::min(innerClamped, outerClamped); - float cosOuter = fast::cos(outerClamped); - float cosInner = fast::cos(innerClamped); - float cosOuterSquared = cosOuter * cosOuter; - float scale = 1.0f / std::max(1.0f / 1024.0f, cosInner - cosOuter); - float offset = -cosOuter * scale; + float const cosOuter = fast::cos(outerClamped); + float const cosInner = fast::cos(innerClamped); + float const cosOuterSquared = cosOuter * cosOuter; + float const scale = 1.0f / std::max(1.0f / 1024.0f, cosInner - cosOuter); + float const offset = -cosOuter * scale; SpotParams& spotParams = manager[i].spotParams; spotParams.outerClamped = outerClamped; @@ -374,47 +389,47 @@ void FLightManager::setSpotLightCone(Instance i, float inner, float outer) noexc spotParams.scaleOffset = { scale, offset }; // we need to recompute the luminous intensity - Type type = getLightType(i).type; + Type const type = getLightType(i).type; if (type == Type::FOCUSED_SPOT) { // li = lp / (2 * pi * (1 - cos(cone_outer / 2))) - float luminousPower = spotParams.luminousPower; - float luminousIntensity = luminousPower / (f::TAU * (1.0f - cosOuter)); + float const luminousPower = spotParams.luminousPower; + float const luminousIntensity = luminousPower / (f::TAU * (1.0f - cosOuter)); manager[i].intensity = luminousIntensity; } } } -void FLightManager::setSunAngularRadius(Instance i, float angularRadius) noexcept { +void FLightManager::setSunAngularRadius(Instance const i, float angularRadius) noexcept { if (i && isSunLight(i)) { angularRadius = clamp(angularRadius, 0.25f, 20.0f); mManager[i].sunAngularRadius = angularRadius * f::DEG_TO_RAD; } } -void FLightManager::setSunHaloSize(Instance i, float haloSize) noexcept { +void FLightManager::setSunHaloSize(Instance const i, float const haloSize) noexcept { if (i && isSunLight(i)) { mManager[i].sunHaloSize = haloSize; } } -void FLightManager::setSunHaloFalloff(Instance i, float haloFalloff) noexcept { +void FLightManager::setSunHaloFalloff(Instance const i, float const haloFalloff) noexcept { if (i && isSunLight(i)) { mManager[i].sunHaloFalloff = haloFalloff; } } -void FLightManager::setShadowCaster(Instance i, bool shadowCaster) noexcept { +void FLightManager::setShadowCaster(Instance const i, bool const shadowCaster) noexcept { if (i) { LightType& lightType = mManager[i].lightType; lightType.shadowCaster = shadowCaster; } } -float FLightManager::getSpotLightInnerCone(Instance i) const noexcept { +float FLightManager::getSpotLightInnerCone(Instance const i) const noexcept { const auto& spotParams = getSpotParams(i); - float cosOuter = std::cos(spotParams.outerClamped); - float scale = spotParams.scaleOffset.x; - float inner = std::acos((1.0f / scale) + cosOuter); + float const cosOuter = std::cos(spotParams.outerClamped); + float const scale = spotParams.scaleOffset.x; + float const inner = std::acos((1.0f / scale) + cosOuter); return inner; } @@ -424,27 +439,27 @@ float FLightManager::getSpotLightInnerCone(Instance i) const noexcept { void LightManager::ShadowCascades::computeUniformSplits(float splitPositions[3], uint8_t cascades) { size_t s = 0; - cascades = max(cascades, (uint8_t) 4u); + cascades = min(cascades, (uint8_t) 4u); for (size_t c = 1; c < cascades; c++) { - splitPositions[s++] = (float) c / cascades; + splitPositions[s++] = float(c) / float(cascades); } } void LightManager::ShadowCascades::computeLogSplits(float splitPositions[3], uint8_t cascades, - float near, float far) { + float const near, float const far) { size_t s = 0; - cascades = max(cascades, (uint8_t) 4u); + cascades = min(cascades, (uint8_t) 4u); for (size_t c = 1; c < cascades; c++) { splitPositions[s++] = - (near * std::pow(far / near, (float) c / cascades) - near) / (far - near); + (near * std::pow(far / near, float(c) / float(cascades)) - near) / (far - near); } } void LightManager::ShadowCascades::computePracticalSplits(float splitPositions[3], uint8_t cascades, - float near, float far, float lambda) { + float const near, float const far, float const lambda) { float uniformSplits[3]; float logSplits[3]; - cascades = max(cascades, (uint8_t) 4u); + cascades = min(cascades, (uint8_t) 4u); computeUniformSplits(uniformSplits, cascades); computeLogSplits(logSplits, cascades, near, far); size_t s = 0; diff --git a/filament/src/components/LightManager.h b/filament/src/components/LightManager.h index 2a8a51ff39f..19826e54ac6 100644 --- a/filament/src/components/LightManager.h +++ b/filament/src/components/LightManager.h @@ -35,7 +35,7 @@ class FScene; class FLightManager : public LightManager { public: - using Instance = LightManager::Instance; + using Instance = Instance; explicit FLightManager(FEngine& engine) noexcept; ~FLightManager(); @@ -46,23 +46,35 @@ class FLightManager : public LightManager { void gc(utils::EntityManager& em) noexcept; + /* + * Component Manager APIs + */ + + bool hasComponent(utils::Entity const e) const noexcept { + return mManager.hasComponent(e); + } + + Instance getInstance(utils::Entity const e) const noexcept { + return { mManager.getInstance(e) }; + } + size_t getComponentCount() const noexcept { return mManager.getComponentCount(); } - utils::Entity const* getEntities() const noexcept { - return mManager.getEntities(); + bool empty() const noexcept { + return mManager.empty(); } - bool hasComponent(utils::Entity e) const noexcept { - return mManager.hasComponent(e); + utils::Entity getEntity(Instance const i) const noexcept { + return mManager.getEntity(i); } - Instance getInstance(utils::Entity e) const noexcept { - return mManager.getInstance(e); + utils::Entity const* getEntities() const noexcept { + return mManager.getEntities(); } - void create(const FLightManager::Builder& builder, utils::Entity entity); + void create(const Builder& builder, utils::Entity entity); void destroy(utils::Entity e) noexcept; @@ -89,7 +101,7 @@ class FLightManager : public LightManager { }; struct ShadowParams { // TODO: get rid of this struct - LightManager::ShadowOptions options; + ShadowOptions options; }; UTILS_NOINLINE void setLocalPosition(Instance i, const math::float3& position) noexcept; @@ -106,33 +118,33 @@ class FLightManager : public LightManager { UTILS_NOINLINE bool getLightChannel(Instance i, unsigned int channel) const noexcept; - LightType const& getLightType(Instance i) const noexcept { + LightType const& getLightType(Instance const i) const noexcept { return mManager[i].lightType; } - Type getType(Instance i) const noexcept { + Type getType(Instance const i) const noexcept { return getLightType(i).type; } - bool isShadowCaster(Instance i) const noexcept { + bool isShadowCaster(Instance const i) const noexcept { return getLightType(i).shadowCaster; } - bool isLightCaster(Instance i) const noexcept { + bool isLightCaster(Instance const i) const noexcept { return getLightType(i).lightCaster; } - bool isPointLight(Instance i) const noexcept { + bool isPointLight(Instance const i) const noexcept { return getType(i) == Type::POINT; } - bool isSpotLight(Instance i) const noexcept { - Type type = getType(i); + bool isSpotLight(Instance const i) const noexcept { + Type const type = getType(i); return type == Type::FOCUSED_SPOT || type == Type::SPOT; } - bool isDirectionalLight(Instance i) const noexcept { - Type type = getType(i); + bool isDirectionalLight(Instance const i) const noexcept { + Type const type = getType(i); return type == Type::DIRECTIONAL || type == Type::SUN; } @@ -140,89 +152,89 @@ class FLightManager : public LightManager { return false; // TODO: change this when we support IES lights } - bool isSunLight(Instance i) const noexcept { + bool isSunLight(Instance const i) const noexcept { return getType(i) == Type::SUN; } - uint32_t getShadowMapSize(Instance i) const noexcept { + uint32_t getShadowMapSize(Instance const i) const noexcept { return getShadowParams(i).options.mapSize; } - ShadowParams const& getShadowParams(Instance i) const noexcept { + ShadowParams const& getShadowParams(Instance const i) const noexcept { return mManager[i].shadowParams; } - float getShadowConstantBias(Instance i) const noexcept { + float getShadowConstantBias(Instance const i) const noexcept { return getShadowParams(i).options.constantBias; } - float getShadowNormalBias(Instance i) const noexcept { + float getShadowNormalBias(Instance const i) const noexcept { return getShadowParams(i).options.normalBias; } - float getShadowFar(Instance i) const noexcept { + float getShadowFar(Instance const i) const noexcept { return getShadowParams(i).options.shadowFar; } - const math::float3& getColor(Instance i) const noexcept { + const math::float3& getColor(Instance const i) const noexcept { return mManager[i].color; } - float getIntensity(Instance i) const noexcept { + float getIntensity(Instance const i) const noexcept { return mManager[i].intensity; } - float getSunAngularRadius(Instance i) const noexcept { + float getSunAngularRadius(Instance const i) const noexcept { return mManager[i].sunAngularRadius; } - float getSunHaloSize(Instance i) const noexcept { + float getSunHaloSize(Instance const i) const noexcept { return mManager[i].sunHaloSize; } - float getSunHaloFalloff(Instance i) const noexcept { + float getSunHaloFalloff(Instance const i) const noexcept { return mManager[i].sunHaloFalloff; } - float getSquaredFalloffInv(Instance i) const noexcept { + float getSquaredFalloffInv(Instance const i) const noexcept { return mManager[i].squaredFallOffInv; } - float getFalloff(Instance i) const noexcept { + float getFalloff(Instance const i) const noexcept { return getRadius(i); } - SpotParams const& getSpotParams(Instance i) const noexcept { + SpotParams const& getSpotParams(Instance const i) const noexcept { return mManager[i].spotParams; } float getSpotLightInnerCone(Instance i) const noexcept; - float getCosOuterSquared(Instance i) const noexcept { + float getCosOuterSquared(Instance const i) const noexcept { return getSpotParams(i).cosOuterSquared; } - float getSinInverse(Instance i) const noexcept { + float getSinInverse(Instance const i) const noexcept { return getSpotParams(i).sinInverse; } - float getRadius(Instance i) const noexcept { + float getRadius(Instance const i) const noexcept { return getSpotParams(i).radius; } - uint8_t getLightChannels(Instance i) const noexcept { + uint8_t getLightChannels(Instance const i) const noexcept { return mManager[i].channels; } - const math::float3& getLocalPosition(Instance i) const noexcept { + const math::float3& getLocalPosition(Instance const i) const noexcept { return mManager[i].position; } - const math::float3& getLocalDirection(Instance i) const noexcept { + const math::float3& getLocalDirection(Instance const i) const noexcept { return mManager[i].direction; } - const ShadowOptions& getShadowOptions(Instance i) const noexcept { + const ShadowOptions& getShadowOptions(Instance const i) const noexcept { return getShadowParams(i).options; } diff --git a/filament/src/components/RenderableManager.cpp b/filament/src/components/RenderableManager.cpp index ae3b47f2cfb..41381667d03 100644 --- a/filament/src/components/RenderableManager.cpp +++ b/filament/src/components/RenderableManager.cpp @@ -20,23 +20,48 @@ #include "components/RenderableManager.h" +#include "ds/DescriptorSet.h" + #include "details/Engine.h" #include "details/VertexBuffer.h" #include "details/IndexBuffer.h" -#include "details/Texture.h" +#include "details/InstanceBuffer.h" #include "details/Material.h" -#include - -#include "filament/RenderableManager.h" +#include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include #include +#include #include -#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include using namespace filament::math; using namespace utils; @@ -46,73 +71,93 @@ namespace filament { using namespace backend; struct RenderableManager::BuilderDetails { - using Entry = RenderableManager::Builder::Entry; + using Entry = FRenderableManager::Entry; std::vector mEntries; Box mAABB; uint8_t mLayerMask = 0x1; uint8_t mPriority = 0x4; - uint8_t mChannels = 1; + uint8_t mCommandChannel = Builder::DEFAULT_CHANNEL; + uint8_t mLightChannels = 1; uint16_t mInstanceCount = 1; bool mCulling : 1; bool mCastShadows : 1; bool mReceiveShadows : 1; bool mScreenSpaceContactShadows : 1; bool mSkinningBufferMode : 1; + bool mFogEnabled : 1; + Builder::GeometryType mGeometryType : 2; size_t mSkinningBoneCount = 0; size_t mMorphTargetCount = 0; + FMorphTargetBuffer* mMorphTargetBuffer = nullptr; Bone const* mUserBones = nullptr; mat4f const* mUserBoneMatrices = nullptr; FSkinningBuffer* mSkinningBuffer = nullptr; + FInstanceBuffer* mInstanceBuffer = nullptr; uint32_t mSkinningBufferOffset = 0; - - explicit BuilderDetails(size_t count) - : mEntries(count), mCulling(true), mCastShadows(false), mReceiveShadows(true), - mScreenSpaceContactShadows(false), mSkinningBufferMode(false) { + FixedCapacityVector mBoneIndicesAndWeights; + size_t mBoneIndicesAndWeightsCount = 0; + + // bone indices and weights defined for primitive index + std::unordered_map>> mBonePairs; + + explicit BuilderDetails(size_t const count) + : mEntries(count), mCulling(true), mCastShadows(false), + mReceiveShadows(true), mScreenSpaceContactShadows(false), + mSkinningBufferMode(false), mFogEnabled(true), + mGeometryType(Builder::GeometryType::DYNAMIC), + mBonePairs() { } // this is only needed for the explicit instantiation below BuilderDetails() = default; + + void processBoneIndicesAndWights(Engine& engine, Entity entity); + }; using BuilderType = RenderableManager; BuilderType::Builder::Builder(size_t count) noexcept - : BuilderBase(count) { + : BuilderBase(count) { assert_invariant(mImpl->mEntries.size() == count); } BuilderType::Builder::~Builder() noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder&& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder&& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder&& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder&& rhs) noexcept = default; -RenderableManager::Builder& RenderableManager::Builder::geometry(size_t index, - PrimitiveType type, VertexBuffer* vertices, IndexBuffer* indices) noexcept { +RenderableManager::Builder& RenderableManager::Builder::geometry(size_t const index, + PrimitiveType const type, VertexBuffer* vertices, IndexBuffer* indices) noexcept { return geometry(index, type, vertices, indices, 0, 0, vertices->getVertexCount() - 1, indices->getIndexCount()); } -RenderableManager::Builder& RenderableManager::Builder::geometry(size_t index, - PrimitiveType type, VertexBuffer* vertices, IndexBuffer* indices, - size_t offset, size_t count) noexcept { +RenderableManager::Builder& RenderableManager::Builder::geometry(size_t const index, + PrimitiveType const type, VertexBuffer* vertices, IndexBuffer* indices, + size_t const offset, size_t const count) noexcept { return geometry(index, type, vertices, indices, offset, 0, vertices->getVertexCount() - 1, count); } -RenderableManager::Builder& RenderableManager::Builder::geometry(size_t index, - PrimitiveType type, VertexBuffer* vertices, IndexBuffer* indices, - size_t offset, size_t minIndex, size_t maxIndex, size_t count) noexcept { - std::vector& entries = mImpl->mEntries; +RenderableManager::Builder& RenderableManager::Builder::geometry(size_t const index, + PrimitiveType const type, VertexBuffer* vertices, IndexBuffer* indices, + size_t const offset, UTILS_UNUSED size_t minIndex, UTILS_UNUSED size_t maxIndex, size_t const count) noexcept { + std::vector& entries = mImpl->mEntries; if (index < entries.size()) { entries[index].vertices = vertices; entries[index].indices = indices; entries[index].offset = offset; - entries[index].minIndex = minIndex; - entries[index].maxIndex = maxIndex; entries[index].count = count; entries[index].type = type; } return *this; } -RenderableManager::Builder& RenderableManager::Builder::material(size_t index, +RenderableManager::Builder& RenderableManager::Builder::geometryType(GeometryType const type) noexcept { + mImpl->mGeometryType = type; + return *this; +} + +RenderableManager::Builder& RenderableManager::Builder::material(size_t const index, MaterialInstance const* materialInstance) noexcept { if (index < mImpl->mEntries.size()) { mImpl->mEntries[index].materialInstance = materialInstance; @@ -125,96 +170,132 @@ RenderableManager::Builder& RenderableManager::Builder::boundingBox(const Box& a return *this; } -RenderableManager::Builder& RenderableManager::Builder::layerMask(uint8_t select, uint8_t values) noexcept { +RenderableManager::Builder& RenderableManager::Builder::layerMask(uint8_t const select, uint8_t const values) noexcept { mImpl->mLayerMask = (mImpl->mLayerMask & ~select) | (values & select); return *this; } -RenderableManager::Builder& RenderableManager::Builder::priority(uint8_t priority) noexcept { +RenderableManager::Builder& RenderableManager::Builder::priority(uint8_t const priority) noexcept { mImpl->mPriority = std::min(priority, uint8_t(0x7)); return *this; } -RenderableManager::Builder& RenderableManager::Builder::culling(bool enable) noexcept { +RenderableManager::Builder& RenderableManager::Builder::channel(uint8_t const channel) noexcept { + mImpl->mCommandChannel = std::min(channel, uint8_t(0x3)); + return *this; +} + +RenderableManager::Builder& RenderableManager::Builder::culling(bool const enable) noexcept { mImpl->mCulling = enable; return *this; } -RenderableManager::Builder& RenderableManager::Builder::lightChannel(unsigned int channel, bool enable) noexcept { +RenderableManager::Builder& RenderableManager::Builder::lightChannel(unsigned int const channel, bool const enable) noexcept { if (channel < 8) { const uint8_t mask = 1u << channel; - mImpl->mChannels &= ~mask; - mImpl->mChannels |= enable ? mask : 0u; + mImpl->mLightChannels &= ~mask; + mImpl->mLightChannels |= enable ? mask : 0u; } return *this; } -RenderableManager::Builder& RenderableManager::Builder::castShadows(bool enable) noexcept { +RenderableManager::Builder& RenderableManager::Builder::castShadows(bool const enable) noexcept { mImpl->mCastShadows = enable; return *this; } -RenderableManager::Builder& RenderableManager::Builder::receiveShadows(bool enable) noexcept { +RenderableManager::Builder& RenderableManager::Builder::receiveShadows(bool const enable) noexcept { mImpl->mReceiveShadows = enable; return *this; } -RenderableManager::Builder& RenderableManager::Builder::screenSpaceContactShadows(bool enable) noexcept { +RenderableManager::Builder& RenderableManager::Builder::screenSpaceContactShadows(bool const enable) noexcept { mImpl->mScreenSpaceContactShadows = enable; return *this; } -RenderableManager::Builder& RenderableManager::Builder::skinning(size_t boneCount) noexcept { +RenderableManager::Builder& RenderableManager::Builder::skinning(size_t const boneCount) noexcept { mImpl->mSkinningBoneCount = boneCount; return *this; } RenderableManager::Builder& RenderableManager::Builder::skinning( - size_t boneCount, Bone const* bones) noexcept { + size_t const boneCount, Bone const* bones) noexcept { mImpl->mSkinningBoneCount = boneCount; mImpl->mUserBones = bones; return *this; } RenderableManager::Builder& RenderableManager::Builder::skinning( - size_t boneCount, mat4f const* transforms) noexcept { + size_t const boneCount, mat4f const* transforms) noexcept { mImpl->mSkinningBoneCount = boneCount; mImpl->mUserBoneMatrices = transforms; return *this; } RenderableManager::Builder& RenderableManager::Builder::skinning( - SkinningBuffer* skinningBuffer, size_t count, size_t offset) noexcept { + SkinningBuffer* skinningBuffer, size_t const count, size_t const offset) noexcept { mImpl->mSkinningBuffer = downcast(skinningBuffer); mImpl->mSkinningBoneCount = count; mImpl->mSkinningBufferOffset = offset; return *this; } -RenderableManager::Builder& RenderableManager::Builder::enableSkinningBuffers(bool enabled) noexcept { +RenderableManager::Builder& RenderableManager::Builder::enableSkinningBuffers(bool const enabled) noexcept { mImpl->mSkinningBufferMode = enabled; return *this; } -RenderableManager::Builder& RenderableManager::Builder::morphing(size_t targetCount) noexcept { +RenderableManager::Builder& RenderableManager::Builder::boneIndicesAndWeights(size_t const primitiveIndex, + float2 const* indicesAndWeights, size_t const count, size_t const bonesPerVertex) noexcept { + size_t const vertexCount = count / bonesPerVertex; + FixedCapacityVector> bonePairs(vertexCount); + for (size_t iVertex = 0; iVertex < vertexCount; iVertex++) { + FixedCapacityVector vertexData(bonesPerVertex); + std::copy_n(indicesAndWeights + iVertex * bonesPerVertex, + bonesPerVertex, vertexData.data()); + bonePairs[iVertex] = std::move(vertexData); + } + return boneIndicesAndWeights(primitiveIndex, bonePairs); +} + +RenderableManager::Builder& RenderableManager::Builder::boneIndicesAndWeights(size_t const primitiveIndex, + FixedCapacityVector< + FixedCapacityVector> indicesAndWeightsVector) noexcept { + mImpl->mBonePairs[primitiveIndex] = std::move(indicesAndWeightsVector); + return *this; +} + +RenderableManager::Builder& RenderableManager::Builder::fog(bool const enabled) noexcept { + mImpl->mFogEnabled = enabled; + return *this; +} + +RenderableManager::Builder& RenderableManager::Builder::morphing(size_t const targetCount) noexcept { mImpl->mMorphTargetCount = targetCount; return *this; } -RenderableManager::Builder& RenderableManager::Builder::morphing(uint8_t level, size_t primitiveIndex, - MorphTargetBuffer* morphTargetBuffer, size_t offset, size_t count) noexcept { - std::vector& entries = mImpl->mEntries; +RenderableManager::Builder& RenderableManager::Builder::morphing( + MorphTargetBuffer* UTILS_NONNULL morphTargetBuffer) noexcept { + mImpl->mMorphTargetBuffer = downcast(morphTargetBuffer); + mImpl->mMorphTargetCount = morphTargetBuffer->getCount(); + return *this; +} + +RenderableManager::Builder& RenderableManager::Builder::morphing(uint8_t level, + size_t const primitiveIndex, size_t const offset) noexcept { + // the last parameter "count" is unused, because it must be equal to the primitive's vertex count + std::vector& entries = mImpl->mEntries; if (primitiveIndex < entries.size()) { auto& morphing = entries[primitiveIndex].morphing; - morphing.buffer = morphTargetBuffer; - morphing.offset = offset; - morphing.count = count; + morphing.offset = uint32_t(offset); } return *this; } RenderableManager::Builder& RenderableManager::Builder::blendOrder( - size_t index, uint16_t blendOrder) noexcept { + size_t const index, uint16_t const blendOrder) noexcept { if (index < mImpl->mEntries.size()) { mImpl->mEntries[index].blendOrder = blendOrder; } @@ -222,24 +303,172 @@ RenderableManager::Builder& RenderableManager::Builder::blendOrder( } RenderableManager::Builder& RenderableManager::Builder::globalBlendOrderEnabled( - size_t index, bool enabled) noexcept { + size_t const index, bool const enabled) noexcept { if (index < mImpl->mEntries.size()) { mImpl->mEntries[index].globalBlendOrderEnabled = enabled; } return *this; } -RenderableManager::Builder::Result RenderableManager::Builder::build(Engine& engine, Entity entity) { +UTILS_NOINLINE +void RenderableManager::BuilderDetails::processBoneIndicesAndWights(Engine& engine, Entity const entity) { + size_t maxPairsCount = 0; //size of texture, number of bone pairs + size_t maxPairsCountPerVertex = 0; //maximum of number of bone per vertex + + for (auto& bonePair: mBonePairs) { + auto primitiveIndex = bonePair.first; + auto entries = mEntries; + FILAMENT_CHECK_PRECONDITION(primitiveIndex < entries.size() && primitiveIndex >= 0) + << "[primitive @ " << primitiveIndex << "] primitiveindex is out of size (" + << entries.size() << ")"; + auto entry = mEntries[primitiveIndex]; + auto bonePairsForPrimitive = bonePair.second; + auto vertexCount = entry.vertices->getVertexCount(); + FILAMENT_CHECK_PRECONDITION(bonePairsForPrimitive.size() == vertexCount) + << "[primitive @ " << primitiveIndex << "] bone indices and weights pairs count (" + << bonePairsForPrimitive.size() << ") must be equal to vertex count (" + << vertexCount << ")"; + auto const& declaredAttributes = downcast(entry.vertices)->getDeclaredAttributes(); + FILAMENT_CHECK_PRECONDITION(declaredAttributes[VertexAttribute::BONE_INDICES] || + declaredAttributes[VertexAttribute::BONE_WEIGHTS]) + << "[entity=" << entity.getId() << ", primitive @ " << primitiveIndex + << "] for advanced skinning set VertexBuffer::Builder::advancedSkinning()"; + for (size_t iVertex = 0; iVertex < vertexCount; iVertex++) { + size_t const bonesPerVertex = bonePairsForPrimitive[iVertex].size(); + maxPairsCount += bonesPerVertex; + maxPairsCountPerVertex = std::max(bonesPerVertex, maxPairsCountPerVertex); + } + } + + size_t pairsCount = 0; // counting of number of pairs stored in texture + if (maxPairsCount) { // at least one primitive has bone indices and weights + // final texture data, indices and weights + mBoneIndicesAndWeights = utils::FixedCapacityVector(maxPairsCount); + // temporary indices and weights for one vertex + auto const tempPairs = std::make_unique(maxPairsCountPerVertex); + for (auto& bonePair: mBonePairs) { + auto primitiveIndex = bonePair.first; + auto bonePairsForPrimitive = bonePair.second; + if (bonePairsForPrimitive.empty()) { + continue; + } + size_t const vertexCount = mEntries[primitiveIndex].vertices->getVertexCount(); + // temporary indices for one vertex + auto skinJoints = std::make_unique(4 * vertexCount); + // temporary weights for one vertex + auto skinWeights = std::make_unique(4 * vertexCount); + for (size_t iVertex = 0; iVertex < vertexCount; iVertex++) { + size_t tempPairCount = 0; + double boneWeightsSum = 0; + for (size_t k = 0; k < bonePairsForPrimitive[iVertex].size(); k++) { + auto boneWeight = bonePairsForPrimitive[iVertex][k][1]; + auto boneIndex = bonePairsForPrimitive[iVertex][k][0]; + FILAMENT_CHECK_PRECONDITION(boneWeight >= 0) + << "[entity=" << entity.getId() << ", primitive @ " << primitiveIndex + << "] bone weight (" << boneWeight << ") of vertex=" << iVertex + << " is negative"; + if (boneWeight > 0.0f) { + FILAMENT_CHECK_PRECONDITION(boneIndex >= 0) + << "[entity=" << entity.getId() << ", primitive @ " + << primitiveIndex << "] bone index (" << (int)boneIndex + << ") of vertex=" << iVertex << " is negative"; + FILAMENT_CHECK_PRECONDITION(boneIndex < mSkinningBoneCount) + << "[entity=" << entity.getId() << ", primitive @ " + << primitiveIndex << "] bone index (" << (int)boneIndex + << ") of vertex=" << iVertex << " is bigger then bone count (" + << mSkinningBoneCount << ")"; + boneWeightsSum += boneWeight; + tempPairs[tempPairCount][0] = boneIndex; + tempPairs[tempPairCount][1] = boneWeight; + tempPairCount++; + } + } + + FILAMENT_CHECK_PRECONDITION(boneWeightsSum > 0) + << "[entity=" << entity.getId() << ", primitive @ " << primitiveIndex + << "] sum of bone weights of vertex=" << iVertex << " is " << boneWeightsSum + << ", it should be positive."; + + // see https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#skinned-mesh-attributes + double const epsilon = 2e-7 * double(tempPairCount); + if (abs(boneWeightsSum - 1.0) <= epsilon) { + boneWeightsSum = 1.0; + } +#ifndef NDEBUG + else { + slog.w << "Warning of skinning: [entity=%" << entity.getId() + << ", primitive @ %" << primitiveIndex + << "] sum of bone weights of vertex=" << iVertex << " is " << boneWeightsSum + << ", it should be one. Weights will be normalized." << io::endl; + } +#endif + + // prepare data for vertex attributes + auto offset = iVertex * 4; + // set attributes, indices and weights, for <= 4 pairs + for (size_t j = 0, c = std::min((int)tempPairCount, 4); j < c; j++) { + skinJoints[j + offset] = uint16_t(tempPairs[j][0]); + skinWeights[j + offset] = tempPairs[j][1] / float(boneWeightsSum); + } + // prepare data for texture + if (tempPairCount > 4) { // set attributes, indices and weights, for > 4 pairs + // number pairs per vertex in texture + skinJoints[3 + offset] = (uint16_t)tempPairCount; + // negative offset to texture 0..-1, 1..-2 + skinWeights[3 + offset] = -float(pairsCount + 1); + for (size_t j = 3; j < tempPairCount; j++) { + mBoneIndicesAndWeights[pairsCount][0] = tempPairs[j][0]; + mBoneIndicesAndWeights[pairsCount][1] = tempPairs[j][1] / float(boneWeightsSum); + pairsCount++; + } + } + } // for all vertices per primitive + downcast(mEntries[primitiveIndex].vertices) + ->updateBoneIndicesAndWeights(downcast(engine), + std::move(skinJoints), + std::move(skinWeights)); + } // for all primitives + } + mBoneIndicesAndWeightsCount = pairsCount; // only part of mBoneIndicesAndWeights is used for real data +} + +RenderableManager::Builder::Result RenderableManager::Builder::build(Engine& engine, Entity const entity) { bool isEmpty = true; - ASSERT_PRECONDITION(mImpl->mSkinningBoneCount <= CONFIG_MAX_BONE_COUNT, - "bone count > %u", CONFIG_MAX_BONE_COUNT); + FILAMENT_CHECK_PRECONDITION(mImpl->mSkinningBoneCount <= CONFIG_MAX_BONE_COUNT) + << "bone count > " << CONFIG_MAX_BONE_COUNT; + + FILAMENT_CHECK_PRECONDITION( + mImpl->mInstanceCount <= CONFIG_MAX_INSTANCES || !mImpl->mInstanceBuffer) + << "instance count is " << mImpl->mInstanceCount + << ", but instance count is limited to CONFIG_MAX_INSTANCES (" << CONFIG_MAX_INSTANCES + << ") instances when supplying transforms via an InstanceBuffer."; + + if (mImpl->mGeometryType == GeometryType::STATIC) { + FILAMENT_CHECK_PRECONDITION(mImpl->mSkinningBoneCount == 0) + << "Skinning can't be used with STATIC geometry"; + + FILAMENT_CHECK_PRECONDITION(mImpl->mMorphTargetCount == 0) + << "Morphing can't be used with STATIC geometry"; + } + + if (mImpl->mInstanceBuffer) { + size_t const bufferInstanceCount = mImpl->mInstanceBuffer->mInstanceCount; + FILAMENT_CHECK_PRECONDITION(mImpl->mInstanceCount <= bufferInstanceCount) + << "instance count (" << mImpl->mInstanceCount + << ") must be less than or equal to the InstanceBuffer's instance " + "count (" << bufferInstanceCount << ")."; + } + + if (UTILS_LIKELY(mImpl->mSkinningBoneCount || mImpl->mSkinningBufferMode)) { + mImpl->processBoneIndicesAndWights(engine, entity); + } for (size_t i = 0, c = mImpl->mEntries.size(); i < c; i++) { auto& entry = mImpl->mEntries[i]; // entry.materialInstance must be set to something even if indices/vertices are null - FMaterial const* material = nullptr; + FMaterial const* material; if (!entry.materialInstance) { material = downcast(engine.getDefaultMaterial()); entry.materialInstance = material->getDefaultInstance(); @@ -253,26 +482,21 @@ RenderableManager::Builder::Result RenderableManager::Builder::build(Engine& eng } // we want a feature level violation to be a hard error (exception if enabled, or crash) - ASSERT_PRECONDITION(downcast(engine).hasFeatureLevel(material->getFeatureLevel()), - "Material \"%s\" has feature level %u which is not supported by this Engine", - material->getName().c_str_safe(), (uint8_t)material->getFeatureLevel()); + FILAMENT_CHECK_PRECONDITION(downcast(engine).hasFeatureLevel(material->getFeatureLevel())) + << "Material \"" << material->getName().c_str_safe() << "\" has feature level " + << (uint8_t)material->getFeatureLevel() << " which is not supported by this Engine"; // reject invalid geometry parameters - ASSERT_PRECONDITION(entry.offset + entry.count <= entry.indices->getIndexCount(), - "[entity=%u, primitive @ %u] offset (%u) + count (%u) > indexCount (%u)", - i, entity.getId(), - entry.offset, entry.count, entry.indices->getIndexCount()); - - ASSERT_PRECONDITION(entry.minIndex <= entry.maxIndex, - "[entity=%u, primitive @ %u] minIndex (%u) > maxIndex (%u)", - i, entity.getId(), - entry.minIndex, entry.maxIndex); + FILAMENT_CHECK_PRECONDITION(entry.offset + entry.count <= entry.indices->getIndexCount()) + << "[entity=" << entity.getId() << ", primitive @ " << i << "] offset (" + << entry.offset << ") + count (" << entry.count << ") > indexCount (" + << entry.indices->getIndexCount() << ")"; // this can't be an error because (1) those values are not immutable, so the caller // could fix later, and (2) the material's shader will work (i.e. compile), and // use the default values for this attribute, which maybe be acceptable. - AttributeBitset declared = downcast(entry.vertices)->getDeclaredAttributes(); - AttributeBitset required = material->getRequiredAttributes(); + AttributeBitset const declared = downcast(entry.vertices)->getDeclaredAttributes(); + AttributeBitset const required = material->getRequiredAttributes(); if ((declared & required) != required) { slog.w << "[entity=" << entity.getId() << ", primitive @ " << i << "] missing required attributes (" @@ -283,19 +507,25 @@ RenderableManager::Builder::Result RenderableManager::Builder::build(Engine& eng isEmpty = false; } - ASSERT_PRECONDITION( - !mImpl->mAABB.isEmpty() || - (!mImpl->mCulling && (!(mImpl->mReceiveShadows || mImpl->mCastShadows)) || - isEmpty), - "[entity=%u] AABB can't be empty, unless culling is disabled and " - "the object is not a shadow caster/receiver", entity.getId()); + FILAMENT_CHECK_PRECONDITION(!mImpl->mAABB.isEmpty() || + (!mImpl->mCulling && (!(mImpl->mReceiveShadows || mImpl->mCastShadows)) || isEmpty)) + << "[entity=" << entity.getId() + << "] AABB can't be empty, unless culling is disabled and " + "the object is not a shadow caster/receiver"; downcast(engine).createRenderable(*this, entity); return Success; } -RenderableManager::Builder& RenderableManager::Builder::instances(size_t instanceCount) noexcept { - mImpl->mInstanceCount = clamp((unsigned int)instanceCount, 1u, 65535u); +RenderableManager::Builder& RenderableManager::Builder::instances(size_t const instanceCount) noexcept { + mImpl->mInstanceCount = clamp((unsigned int)instanceCount, 1u, 32767u); + return *this; +} + +RenderableManager::Builder& RenderableManager::Builder::instances( + size_t const instanceCount, InstanceBuffer* instanceBuffer) noexcept { + mImpl->mInstanceCount = clamp(instanceCount, (size_t)1, CONFIG_MAX_INSTANCES); + mImpl->mInstanceBuffer = downcast(instanceBuffer); return *this; } @@ -312,7 +542,7 @@ FRenderableManager::~FRenderableManager() { } void FRenderableManager::create( - const RenderableManager::Builder& UTILS_RESTRICT builder, Entity entity) { + const Builder& UTILS_RESTRICT builder, Entity const entity) { FEngine& engine = mEngine; auto& manager = mManager; FEngine::DriverApi& driver = engine.getDriverApi(); @@ -320,13 +550,13 @@ void FRenderableManager::create( if (UTILS_UNLIKELY(manager.hasComponent(entity))) { destroy(entity); } - Instance ci = manager.addComponent(entity); + Instance const ci = manager.addComponent(entity); assert_invariant(ci); if (ci) { // create and initialize all needed RenderPrimitives using size_type = Slice::size_type; - Builder::Entry const * const entries = builder->mEntries.data(); + auto const * const entries = builder->mEntries.data(); const size_t entryCount = builder->mEntries.size(); FRenderPrimitive* rp = new FRenderPrimitive[entryCount]; auto& factory = mHwRenderPrimitiveFactory; @@ -338,14 +568,32 @@ void FRenderableManager::create( setAxisAlignedBoundingBox(ci, builder->mAABB); setLayerMask(ci, builder->mLayerMask); setPriority(ci, builder->mPriority); + setChannel(ci, builder->mCommandChannel); setCastShadows(ci, builder->mCastShadows); setReceiveShadows(ci, builder->mReceiveShadows); setScreenSpaceContactShadows(ci, builder->mScreenSpaceContactShadows); setCulling(ci, builder->mCulling); setSkinning(ci, false); setMorphing(ci, builder->mMorphTargetCount); - mManager[ci].channels = builder->mChannels; - mManager[ci].instanceCount = builder->mInstanceCount; + setFogEnabled(ci, builder->mFogEnabled); + // do this after calling setAxisAlignedBoundingBox + static_cast(mManager[ci].visibility).geometryType = builder->mGeometryType; + mManager[ci].channels = builder->mLightChannels; + + InstancesInfo& instances = manager[ci].instances; + instances.count = builder->mInstanceCount; + instances.buffer = builder->mInstanceBuffer; + if (instances.buffer) { + // Allocate our instance buffer for this Renderable. We always allocate a size to match + // PerRenderableUib, regardless of the number of instances. This is because the buffer + // will get bound to the PER_RENDERABLE UBO, and we can't bind a buffer smaller than the + // full size of the UBO. + instances.handle = driver.createBufferObject(sizeof(PerRenderableUib), + BufferObjectBinding::UNIFORM, BufferUsage::DYNAMIC); + if (auto name = instances.buffer->getName(); !name.empty()) { + driver.setDebugTag(instances.handle.getId(), std::move(name)); + } + } const uint32_t boneCount = builder->mSkinningBoneCount; const uint32_t targetCount = builder->mMorphTargetCount; @@ -379,7 +627,7 @@ void FRenderableManager::create( .handle = driver.createBufferObject( sizeof(PerRenderableBoneUib), BufferObjectBinding::UNIFORM, - backend::BufferUsage::DYNAMIC), + BufferUsage::DYNAMIC), .count = (uint16_t)boneCount, .offset = 0, .skinningBufferMode = false }; @@ -400,8 +648,10 @@ void FRenderableManager::create( } } else { - // When boneCount is 0, do an initialization for the bones uniform array to avoid crash on adreno gpu. - if (UTILS_UNLIKELY(driver.isWorkaroundNeeded(Workaround::ADRENO_UNIFORM_ARRAY_CRASH))) { + // When boneCount is 0, do an initialization for the bones uniform array to + // avoid crash on adreno gpu. + if (UTILS_UNLIKELY(driver.isWorkaroundNeeded( + Workaround::ADRENO_UNIFORM_ARRAY_CRASH))) { auto *initBones = driver.allocatePod(1); std::uninitialized_fill_n(initBones, 1, FSkinningBuffer::makeBone({})); driver.updateBufferObject(bones.handle, { @@ -411,17 +661,27 @@ void FRenderableManager::create( } } - // Create and initialize all needed MorphTargets. It's required to avoid branches in hot loops. - MorphTargets* morphTargets = new MorphTargets[entryCount]; - for (size_t i = 0; i < entryCount; ++i) { - morphTargets[i] = { mEngine.getDummyMorphTargetBuffer(), 0, 0 }; + // Create and initialize all needed MorphTargets. + // It's required to avoid branches in hot loops. + FMorphTargetBuffer* morphTargetBuffer = builder->mMorphTargetBuffer; + if (morphTargetBuffer == nullptr) { + morphTargetBuffer = mEngine.getDummyMorphTargetBuffer(); } - mManager[ci].morphTargets = { morphTargets, size_type(entryCount) }; - // Even morphing isn't enabled, we should create morphig resources. - // Because morphing shader code is generated when skinning is enabled. - // You can see more detail at Variant::SKINNING_OR_MORPHING. + // Always create skinning and morphing resources if one of them is enabled because + // the shader always handles both. See Variant::SKINNING_OR_MORPHING. if (UTILS_UNLIKELY(boneCount > 0 || targetCount > 0)) { + + Bones& bones = manager[ci].bones; + bones.handleTexture = FSkinningBuffer::createIndicesAndWeightsHandle( + engine, builder->mBoneIndicesAndWeightsCount); + if (builder->mBoneIndicesAndWeightsCount > 0) { + FSkinningBuffer::setIndicesAndWeightsData(engine, + bones.handleTexture, + builder->mBoneIndicesAndWeights, + builder->mBoneIndicesAndWeightsCount); + } + // Instead of using a UBO per primitive, we could also have a single UBO for all primitives // and use bindUniformBufferRange which might be more efficient. MorphWeights& morphWeights = manager[ci].morphWeights; @@ -429,21 +689,23 @@ void FRenderableManager::create( .handle = driver.createBufferObject( sizeof(PerRenderableMorphingUib), BufferObjectBinding::UNIFORM, - backend::BufferUsage::DYNAMIC), + BufferUsage::DYNAMIC), .count = targetCount }; - for (size_t i = 0; i < entryCount; ++i) { - const auto& morphing = builder->mEntries[i].morphing; - if (!morphing.buffer) { - continue; + Slice& primitives = mManager[ci].primitives; + mManager[ci].morphTargetBuffer = morphTargetBuffer; + if (builder->mMorphTargetBuffer) { + for (size_t i = 0; i < entryCount; ++i) { + const auto& morphing = builder->mEntries[i].morphing; + primitives[i].setMorphingBufferOffset(morphing.offset); } - morphTargets[i] = { downcast(morphing.buffer), (uint32_t)morphing.offset, - (uint32_t)morphing.count }; } - // When targetCount equal 0, boneCount>0 in this case, do an initialization for the morphWeights uniform array to avoid crash on adreno gpu. - if (UTILS_UNLIKELY(targetCount == 0 && driver.isWorkaroundNeeded(Workaround::ADRENO_UNIFORM_ARRAY_CRASH))) { - float initWeights[1] = {0}; + // When targetCount equal 0, boneCount>0 in this case, do an initialization for the + // morphWeights uniform array to avoid crash on adreno gpu. + if (UTILS_UNLIKELY(targetCount == 0 && + driver.isWorkaroundNeeded(Workaround::ADRENO_UNIFORM_ARRAY_CRASH))) { + float initWeights[1] = { 0 }; setMorphWeights(ci, initWeights, 1, 0); } } @@ -452,8 +714,8 @@ void FRenderableManager::create( } // this destroys a single component from an entity -void FRenderableManager::destroy(utils::Entity e) noexcept { - Instance ci = getInstance(e); +void FRenderableManager::destroy(Entity const e) noexcept { + Instance const ci = getInstance(e); if (ci) { destroyComponent(ci); mManager.removeComponent(e); @@ -469,7 +731,7 @@ void FRenderableManager::terminate() noexcept { << " leaked Renderable components" << io::endl; #endif while (!manager.empty()) { - Instance ci = manager.end() - 1; + Instance const ci = manager.end() - 1; destroyComponent(ci); manager.removeComponent(manager.getEntity(ci)); } @@ -477,12 +739,14 @@ void FRenderableManager::terminate() noexcept { mHwRenderPrimitiveFactory.terminate(mEngine.getDriverApi()); } -void FRenderableManager::gc(utils::EntityManager& em) noexcept { - mManager.gc(em); +void FRenderableManager::gc(EntityManager& em) noexcept { + mManager.gc(em, [this](Entity const e) { + destroy(e); + }); } // This is basically a Renderable's destructor. -void FRenderableManager::destroyComponent(Instance ci) noexcept { +void FRenderableManager::destroyComponent(Instance const ci) noexcept { auto& manager = mManager; FEngine& engine = mEngine; @@ -490,23 +754,35 @@ void FRenderableManager::destroyComponent(Instance ci) noexcept { // See create(RenderableManager::Builder&, Entity) destroyComponentPrimitives(mHwRenderPrimitiveFactory, driver, manager[ci].primitives); - destroyComponentMorphTargets(engine, manager[ci].morphTargets); + + // destroy the per-renderable descriptor set if we have one + DescriptorSet& descriptorSet = manager[ci].descriptorSet; + descriptorSet.terminate(driver); // destroy the bones structures if any Bones const& bones = manager[ci].bones; if (bones.handle && !bones.skinningBufferMode) { + // when not in skinningBufferMode, we now the handle, so we destroy it driver.destroyBufferObject(bones.handle); } + if (bones.handleTexture) { + driver.destroyTexture(bones.handleTexture); + } // destroy the weights structures if any MorphWeights const& morphWeights = manager[ci].morphWeights; if (morphWeights.handle) { driver.destroyBufferObject(morphWeights.handle); } + + InstancesInfo const& instances = manager[ci].instances; + if (instances.handle) { + driver.destroyBufferObject(instances.handle); + } } void FRenderableManager::destroyComponentPrimitives( - HwRenderPrimitiveFactory& factory, backend::DriverApi& driver, + HwRenderPrimitiveFactory& factory, DriverApi& driver, Slice& primitives) noexcept { for (auto& primitive : primitives) { primitive.terminate(factory, driver); @@ -514,28 +790,27 @@ void FRenderableManager::destroyComponentPrimitives( delete[] primitives.data(); } -void FRenderableManager::destroyComponentMorphTargets(FEngine& engine, - utils::Slice& morphTargets) noexcept { - delete[] morphTargets.data(); -} - -void FRenderableManager::setMaterialInstanceAt(Instance instance, uint8_t level, - size_t primitiveIndex, FMaterialInstance const* mi) { +void FRenderableManager::setMaterialInstanceAt(Instance const instance, uint8_t const level, + size_t const primitiveIndex, FMaterialInstance const* mi) { + assert_invariant(mi); if (instance) { Slice& primitives = getRenderPrimitives(instance, level); - if (primitiveIndex < primitives.size()) { - assert_invariant(mi); + if (primitiveIndex < primitives.size() && mi) { FMaterial const* material = mi->getMaterial(); // we want a feature level violation to be a hard error (exception if enabled, or crash) - ASSERT_PRECONDITION(mEngine.hasFeatureLevel(material->getFeatureLevel()), - "Material \"%s\" has feature level %u which is not supported by this Engine", - material->getName().c_str_safe(), (uint8_t)material->getFeatureLevel()); + FILAMENT_CHECK_PRECONDITION(mEngine.hasFeatureLevel(material->getFeatureLevel())) + << "Material \"" << material->getName().c_str_safe() << "\" has feature level " + << (uint8_t)material->getFeatureLevel() + << " which is not supported by this Engine"; primitives[primitiveIndex].setMaterialInstance(mi); - AttributeBitset required = material->getRequiredAttributes(); - AttributeBitset declared = primitives[primitiveIndex].getEnabledAttributes(); - if (UTILS_UNLIKELY((declared & required) != required)) { + AttributeBitset const required = material->getRequiredAttributes(); + AttributeBitset const declared = primitives[primitiveIndex].getEnabledAttributes(); + // Print the warning only when the handle is available. Otherwise this may end up + // emitting many invalid warnings as the `declared` bitset is not populated yet. + bool const isPrimitiveInitialized = !!primitives[primitiveIndex].getHwHandle(); + if (UTILS_UNLIKELY(isPrimitiveInitialized && (declared & required) != required)) { slog.w << "[instance=" << instance.asValue() << ", primitive @ " << primitiveIndex << "] missing required attributes (" << required << "), declared=" << declared << io::endl; @@ -544,8 +819,18 @@ void FRenderableManager::setMaterialInstanceAt(Instance instance, uint8_t level, } } +void FRenderableManager::clearMaterialInstanceAt(Instance instance, uint8_t level, + size_t primitiveIndex) { + if (instance) { + Slice& primitives = getRenderPrimitives(instance, level); + if (primitiveIndex < primitives.size()) { + primitives[primitiveIndex].setMaterialInstance(nullptr); + } + } +} + MaterialInstance* FRenderableManager::getMaterialInstanceAt( - Instance instance, uint8_t level, size_t primitiveIndex) const noexcept { + Instance const instance, uint8_t const level, size_t const primitiveIndex) const noexcept { if (instance) { const Slice& primitives = getRenderPrimitives(instance, level); if (primitiveIndex < primitives.size()) { @@ -557,8 +842,8 @@ MaterialInstance* FRenderableManager::getMaterialInstanceAt( return nullptr; } -void FRenderableManager::setBlendOrderAt(Instance instance, uint8_t level, - size_t primitiveIndex, uint16_t order) noexcept { +void FRenderableManager::setBlendOrderAt(Instance const instance, uint8_t const level, + size_t const primitiveIndex, uint16_t const order) noexcept { if (instance) { Slice& primitives = getRenderPrimitives(instance, level); if (primitiveIndex < primitives.size()) { @@ -567,8 +852,8 @@ void FRenderableManager::setBlendOrderAt(Instance instance, uint8_t level, } } -void FRenderableManager::setGlobalBlendOrderEnabledAt(Instance instance, uint8_t level, - size_t primitiveIndex, bool enabled) noexcept { +void FRenderableManager::setGlobalBlendOrderEnabledAt(Instance const instance, uint8_t const level, + size_t const primitiveIndex, bool const enabled) noexcept { if (instance) { Slice& primitives = getRenderPrimitives(instance, level); if (primitiveIndex < primitives.size()) { @@ -578,7 +863,7 @@ void FRenderableManager::setGlobalBlendOrderEnabledAt(Instance instance, uint8_t } AttributeBitset FRenderableManager::getEnabledAttributesAt( - Instance instance, uint8_t level, size_t primitiveIndex) const noexcept { + Instance const instance, uint8_t const level, size_t const primitiveIndex) const noexcept { if (instance) { Slice const& primitives = getRenderPrimitives(instance, level); if (primitiveIndex < primitives.size()) { @@ -588,25 +873,25 @@ AttributeBitset FRenderableManager::getEnabledAttributesAt( return AttributeBitset{}; } -void FRenderableManager::setGeometryAt(Instance instance, uint8_t level, size_t primitiveIndex, - PrimitiveType type, FVertexBuffer* vertices, FIndexBuffer* indices, - size_t offset, size_t count) noexcept { +void FRenderableManager::setGeometryAt(Instance const instance, uint8_t const level, size_t const primitiveIndex, + PrimitiveType const type, FVertexBuffer* vertices, FIndexBuffer* indices, + size_t const offset, size_t const count) noexcept { if (instance) { Slice& primitives = getRenderPrimitives(instance, level); if (primitiveIndex < primitives.size()) { primitives[primitiveIndex].set(mHwRenderPrimitiveFactory, mEngine.getDriverApi(), - type, vertices, indices, offset, 0, vertices->getVertexCount() - 1, count); + type, vertices, indices, offset, count); } } } -void FRenderableManager::setBones(Instance ci, - Bone const* UTILS_RESTRICT transforms, size_t boneCount, size_t offset) { +void FRenderableManager::setBones(Instance const ci, + Bone const* UTILS_RESTRICT transforms, size_t boneCount, size_t const offset) { if (ci) { - Bones& bones = mManager[ci].bones; + Bones const& bones = mManager[ci].bones; - ASSERT_PRECONDITION(!bones.skinningBufferMode, - "Disable skinning buffer mode to use this API"); + FILAMENT_CHECK_PRECONDITION(!bones.skinningBufferMode) + << "Disable skinning buffer mode to use this API"; assert_invariant(bones.handle && offset + boneCount <= bones.count); if (bones.handle) { @@ -616,13 +901,13 @@ void FRenderableManager::setBones(Instance ci, } } -void FRenderableManager::setBones(Instance ci, - mat4f const* UTILS_RESTRICT transforms, size_t boneCount, size_t offset) { +void FRenderableManager::setBones(Instance const ci, + mat4f const* UTILS_RESTRICT transforms, size_t boneCount, size_t const offset) { if (ci) { - Bones& bones = mManager[ci].bones; + Bones const& bones = mManager[ci].bones; - ASSERT_PRECONDITION(!bones.skinningBufferMode, - "Disable skinning buffer mode to use this API"); + FILAMENT_CHECK_PRECONDITION(!bones.skinningBufferMode) + << "Disable skinning buffer mode to use this API"; assert_invariant(bones.handle && offset + boneCount <= bones.count); if (bones.handle) { @@ -632,17 +917,16 @@ void FRenderableManager::setBones(Instance ci, } } -void FRenderableManager::setSkinningBuffer(FRenderableManager::Instance ci, - FSkinningBuffer* skinningBuffer, size_t count, size_t offset) { +void FRenderableManager::setSkinningBuffer(Instance const ci, + FSkinningBuffer* skinningBuffer, size_t count, size_t const offset) { Bones& bones = mManager[ci].bones; - ASSERT_PRECONDITION(bones.skinningBufferMode, - "Enable skinning buffer mode to use this API"); + FILAMENT_CHECK_PRECONDITION(bones.skinningBufferMode) + << "Enable skinning buffer mode to use this API"; - ASSERT_PRECONDITION( - count <= CONFIG_MAX_BONE_COUNT, - "SkinningBuffer larger than 256 (count=%u)", count); + FILAMENT_CHECK_PRECONDITION(count <= CONFIG_MAX_BONE_COUNT) + << "SkinningBuffer larger than 256 (count=" << count << ")"; // According to the OpenGL ES 3.2 specification in 7.6.3 Uniform // Buffer Object Bindings: @@ -654,72 +938,59 @@ void FRenderableManager::setSkinningBuffer(FRenderableManager::Instance ci, count = CONFIG_MAX_BONE_COUNT; - ASSERT_PRECONDITION( - count + offset <= skinningBuffer->getBoneCount(), - "SkinningBuffer overflow (size=%u, count=%u, offset=%u)", - skinningBuffer->getBoneCount(), count, offset); + FILAMENT_CHECK_PRECONDITION(count + offset <= skinningBuffer->getBoneCount()) + << "SkinningBuffer overflow (size=" << skinningBuffer->getBoneCount() + << ", count=" << count << ", offset=" << offset << ")"; bones.handle = skinningBuffer->getHwHandle(); bones.count = uint16_t(count); bones.offset = uint16_t(offset); } -static void updateMorphWeights(FEngine& engine, backend::Handle handle, - float const* weights, size_t count, size_t offset) noexcept { +static void updateMorphWeights(FEngine& engine, Handle handle, + float const* weights, size_t const count, size_t const offset) noexcept { auto& driver = engine.getDriverApi(); auto size = sizeof(float4) * count; auto* UTILS_RESTRICT out = (float4*)driver.allocate(size); std::transform(weights, weights + count, out, - [](float value) { return float4(value, 0, 0, 0); }); + [](float const value) { return float4(value, 0, 0, 0); }); driver.updateBufferObject(handle, { out, size }, sizeof(float4) * offset); } -void FRenderableManager::setMorphWeights(Instance instance, float const* weights, - size_t count, size_t offset) { +void FRenderableManager::setMorphWeights(Instance const instance, float const* weights, + size_t const count, size_t const offset) { if (instance) { - ASSERT_PRECONDITION(count + offset <= CONFIG_MAX_MORPH_TARGET_COUNT, - "Only %d morph targets are supported (count=%d, offset=%d)", - CONFIG_MAX_MORPH_TARGET_COUNT, count, offset); + FILAMENT_CHECK_PRECONDITION(count + offset <= CONFIG_MAX_MORPH_TARGET_COUNT) + << "Only " << CONFIG_MAX_MORPH_TARGET_COUNT + << " morph targets are supported (count=" << count << ", offset=" << offset << ")"; - MorphWeights& morphWeights = mManager[instance].morphWeights; + MorphWeights const& morphWeights = mManager[instance].morphWeights; if (morphWeights.handle) { updateMorphWeights(mEngine, morphWeights.handle, weights, count, offset); } } } -void FRenderableManager::setMorphTargetBufferAt(Instance instance, uint8_t level, - size_t primitiveIndex, FMorphTargetBuffer* morphTargetBuffer, size_t offset, size_t count) { - assert_invariant(offset == 0 && "Offset not yet supported."); - assert_invariant(count == morphTargetBuffer->getVertexCount() && "Count not yet supported."); +void FRenderableManager::setMorphTargetBufferOffsetAt(Instance const instance, uint8_t level, + size_t const primitiveIndex, + size_t const offset) { if (instance) { - assert_invariant(morphTargetBuffer); - - MorphWeights& morphWeights = mManager[instance].morphWeights; - ASSERT_PRECONDITION(morphWeights.count == morphTargetBuffer->getCount(), - "Only %d morph targets can be set (count=%d)", - morphWeights.count, morphTargetBuffer->getCount()); - - Slice& morphTargets = getMorphTargets(instance, level); - if (primitiveIndex < morphTargets.size()) { - morphTargets[primitiveIndex] = { morphTargetBuffer, (uint32_t)offset, - (uint32_t)count }; + assert_invariant(mManager[instance].morphTargetBuffer); + Slice& primitives = mManager[instance].primitives; + if (primitiveIndex < primitives.size()) { + primitives[primitiveIndex].setMorphingBufferOffset(offset); } } } -MorphTargetBuffer* FRenderableManager::getMorphTargetBufferAt(Instance instance, uint8_t level, - size_t primitiveIndex) const noexcept { +MorphTargetBuffer* FRenderableManager::getMorphTargetBuffer(Instance const instance) const noexcept { if (instance) { - const Slice& morphTargets = getMorphTargets(instance, level); - if (primitiveIndex < morphTargets.size()) { - return morphTargets[primitiveIndex].buffer; - } + return mManager[instance].morphTargetBuffer; } return nullptr; } -size_t FRenderableManager::getMorphTargetCount(Instance instance) const noexcept { +size_t FRenderableManager::getMorphTargetCount(Instance const instance) const noexcept { if (instance) { const MorphWeights& morphWeights = mManager[instance].morphWeights; return morphWeights.count; @@ -727,7 +998,7 @@ size_t FRenderableManager::getMorphTargetCount(Instance instance) const noexcept return 0; } -void FRenderableManager::setLightChannel(Instance ci, unsigned int channel, bool enable) noexcept { +void FRenderableManager::setLightChannel(Instance const ci, unsigned int const channel, bool const enable) noexcept { if (ci) { if (channel < 8) { const uint8_t mask = 1u << channel; @@ -737,7 +1008,7 @@ void FRenderableManager::setLightChannel(Instance ci, unsigned int channel, bool } } -bool FRenderableManager::getLightChannel(Instance ci, unsigned int channel) const noexcept { +bool FRenderableManager::getLightChannel(Instance const ci, unsigned int const channel) const noexcept { if (ci) { if (channel < 8) { const uint8_t mask = 1u << channel; @@ -747,7 +1018,7 @@ bool FRenderableManager::getLightChannel(Instance ci, unsigned int channel) cons return false; } -size_t FRenderableManager::getPrimitiveCount(Instance instance, uint8_t level) const noexcept { +size_t FRenderableManager::getPrimitiveCount(Instance const instance, uint8_t const level) const noexcept { return getRenderPrimitives(instance, level).size(); } diff --git a/filament/src/components/RenderableManager.h b/filament/src/components/RenderableManager.h index 11a817ca4f7..45846bba772 100644 --- a/filament/src/components/RenderableManager.h +++ b/filament/src/components/RenderableManager.h @@ -20,21 +20,31 @@ #include "downcast.h" #include "HwRenderPrimitiveFactory.h" -#include "UniformBuffer.h" -#include "backend/DriverApiForward.h" +#include "ds/DescriptorSet.h" -#include +#include
    #include +#include #include -#include +#include +#include +#include #include +#include +#include #include #include -#include + +#include + +#include + +#include +#include namespace filament { @@ -47,30 +57,31 @@ class FSkinningBuffer; class FVertexBuffer; class FTexture; +class MorphTargetBuffer; + class FRenderableManager : public RenderableManager { public: - using Instance = RenderableManager::Instance; + using Instance = Instance; + using GeometryType = Builder::GeometryType; // TODO: consider renaming, this pertains to material variants, not strictly visibility. struct Visibility { uint8_t priority : 3; + uint8_t channel : 2; bool castShadows : 1; bool receiveShadows : 1; bool culling : 1; + bool skinning : 1; bool morphing : 1; bool screenSpaceContactShadows : 1; bool reversedWindingOrder : 1; + bool fog : 1; + GeometryType geometryType : 2; }; static_assert(sizeof(Visibility) == sizeof(uint16_t), "Visibility should be 16 bits"); - struct MorphTargets { - FMorphTargetBuffer* buffer = nullptr; - uint32_t offset = 0; - uint32_t count = 0; - }; - explicit FRenderableManager(FEngine& engine) noexcept; ~FRenderableManager(); @@ -83,45 +94,66 @@ class FRenderableManager : public RenderableManager { * Component Manager APIs */ - bool hasComponent(utils::Entity e) const noexcept { + bool hasComponent(utils::Entity const e) const noexcept { return mManager.hasComponent(e); } - Instance getInstance(utils::Entity e) const noexcept { - return mManager.getInstance(e); + Instance getInstance(utils::Entity const e) const noexcept { + return { mManager.getInstance(e) }; } - void create(const RenderableManager::Builder& builder, utils::Entity entity); + size_t getComponentCount() const noexcept { + return mManager.getComponentCount(); + } + + bool empty() const noexcept { + return mManager.empty(); + } + + utils::Entity getEntity(Instance const i) const noexcept { + return mManager.getEntity(i); + } + + utils::Entity const* getEntities() const noexcept { + return mManager.getEntities(); + } + + void create(const Builder& builder, utils::Entity entity); void destroy(utils::Entity e) noexcept; - inline void setAxisAlignedBoundingBox(Instance instance, const Box& aabb) noexcept; + inline void setAxisAlignedBoundingBox(Instance instance, const Box& aabb); inline void setLayerMask(Instance instance, uint8_t select, uint8_t values) noexcept; // The priority is clamped to the range [0..7] inline void setPriority(Instance instance, uint8_t priority) noexcept; + // The channel is clamped to the range [0..3] + inline void setChannel(Instance instance, uint8_t channel) noexcept; + inline void setCastShadows(Instance instance, bool enable) noexcept; inline void setLayerMask(Instance instance, uint8_t layerMask) noexcept; inline void setReceiveShadows(Instance instance, bool enable) noexcept; inline void setScreenSpaceContactShadows(Instance instance, bool enable) noexcept; inline void setCulling(Instance instance, bool enable) noexcept; + inline void setFogEnabled(Instance instance, bool enable) noexcept; + inline bool getFogEnabled(Instance instance) const noexcept; inline void setPrimitives(Instance instance, utils::Slice const& primitives) noexcept; - inline void setSkinning(Instance instance, bool enable) noexcept; + inline void setSkinning(Instance instance, bool enable); void setBones(Instance instance, Bone const* transforms, size_t boneCount, size_t offset = 0); void setBones(Instance instance, math::mat4f const* transforms, size_t boneCount, size_t offset = 0); void setSkinningBuffer(Instance instance, FSkinningBuffer* skinningBuffer, size_t count, size_t offset); - inline void setMorphing(Instance instance, bool enable) noexcept; + inline void setMorphing(Instance instance, bool enable); void setMorphWeights(Instance instance, float const* weights, size_t count, size_t offset); - void setMorphTargetBufferAt(Instance instance, uint8_t level, size_t primitiveIndex, - FMorphTargetBuffer* morphTargetBuffer, size_t offset, size_t count); - MorphTargetBuffer* getMorphTargetBufferAt(Instance instance, uint8_t level, size_t primitiveIndex) const noexcept; + void setMorphTargetBufferOffsetAt(Instance instance, uint8_t level, size_t primitiveIndex, + size_t offset); + MorphTargetBuffer* getMorphTargetBuffer(Instance instance) const noexcept; size_t getMorphTargetCount(Instance instance) const noexcept; void setLightChannel(Instance instance, unsigned int channel, bool enable) noexcept; @@ -133,16 +165,17 @@ class FRenderableManager : public RenderableManager { inline Box const& getAABB(Instance instance) const noexcept; - inline Box const& getAxisAlignedBoundingBox(Instance instance) const noexcept { return getAABB(instance); } + inline Box const& getAxisAlignedBoundingBox(Instance const instance) const noexcept { return getAABB(instance); } inline Visibility getVisibility(Instance instance) const noexcept; inline uint8_t getLayerMask(Instance instance) const noexcept; inline uint8_t getPriority(Instance instance) const noexcept; inline uint8_t getChannels(Instance instance) const noexcept; - inline uint16_t getInstanceCount(Instance instance) const noexcept; + inline DescriptorSet& getDescriptorSet(Instance instance) noexcept; struct SkinningBindingInfo { backend::Handle handle; uint32_t offset; + backend::Handle boneIndicesAndWeightHandle; }; inline SkinningBindingInfo getSkinningBufferInfo(Instance instance) const noexcept; @@ -151,18 +184,27 @@ class FRenderableManager : public RenderableManager { struct MorphingBindingInfo { backend::Handle handle; uint32_t count; - MorphTargets const* targets; // Pointer to Slice at a renderable. + FMorphTargetBuffer const* morphTargetBuffer; }; inline MorphingBindingInfo getMorphingBufferInfo(Instance instance) const noexcept; - utils::Entity getEntity(Instance instance) const noexcept { - return mManager.getEntity(instance); - } + struct InstancesInfo { + union { + FInstanceBuffer* buffer; + uint64_t padding; // ensures the pointer is 64 bits on all archs + }; + backend::Handle handle; + uint16_t count; + char padding0[2]; + }; + static_assert(sizeof(InstancesInfo) == 16); + inline InstancesInfo getInstancesInfo(Instance instance) const noexcept; - inline size_t getLevelCount(Instance) const noexcept { return 1; } + inline size_t getLevelCount(Instance) const noexcept { return 1u; } size_t getPrimitiveCount(Instance instance, uint8_t level) const noexcept; void setMaterialInstanceAt(Instance instance, uint8_t level, size_t primitiveIndex, FMaterialInstance const* materialInstance); + void clearMaterialInstanceAt(Instance instance, uint8_t level, size_t primitiveIndex); MaterialInstance* getMaterialInstanceAt(Instance instance, uint8_t level, size_t primitiveIndex) const noexcept; void setGeometryAt(Instance instance, uint8_t level, size_t primitiveIndex, PrimitiveType type, FVertexBuffer* vertices, FIndexBuffer* indices, @@ -172,24 +214,35 @@ class FRenderableManager : public RenderableManager { AttributeBitset getEnabledAttributesAt(Instance instance, uint8_t level, size_t primitiveIndex) const noexcept; inline utils::Slice const& getRenderPrimitives(Instance instance, uint8_t level) const noexcept; inline utils::Slice& getRenderPrimitives(Instance instance, uint8_t level) noexcept; - inline utils::Slice const& getMorphTargets(Instance instance, uint8_t level) const noexcept; - inline utils::Slice& getMorphTargets(Instance instance, uint8_t level) noexcept; + + struct Entry { + VertexBuffer* vertices = nullptr; + IndexBuffer* indices = nullptr; + uint32_t offset = 0; + uint32_t count = 0; + MaterialInstance const* materialInstance = nullptr; + PrimitiveType type = PrimitiveType::TRIANGLES; + uint16_t blendOrder = 0; + bool globalBlendOrderEnabled = false; + struct { + uint32_t offset = 0; + } morphing; + }; private: void destroyComponent(Instance ci) noexcept; static void destroyComponentPrimitives( HwRenderPrimitiveFactory& factory, backend::DriverApi& driver, utils::Slice& primitives) noexcept; - static void destroyComponentMorphTargets(FEngine& engine, - utils::Slice& morphTargets) noexcept; struct Bones { backend::Handle handle; + backend::Handle handleTexture; uint16_t count = 0; uint16_t offset = 0; - bool skinningBufferMode = false; + bool skinningBufferMode = false; // whether we own (false) handle or not (true) }; - static_assert(sizeof(Bones) == 12); + static_assert(sizeof(Bones) == 16); struct MorphWeights { backend::Handle handle; @@ -198,15 +251,16 @@ class FRenderableManager : public RenderableManager { static_assert(sizeof(MorphWeights) == 8); enum { - AABB, // user data - LAYERS, // user data - MORPH_WEIGHTS, // filament data, UBO storing a pointer to the morph weights information - CHANNELS, // user data - INSTANCE_COUNT, // user data - VISIBILITY, // user data - PRIMITIVES, // user data - BONES, // filament data, UBO storing a pointer to the bones information - MORPH_TARGETS + AABB, // user data + LAYERS, // user data + MORPH_WEIGHTS, // filament data, UBO storing a pointer to the morph weights information + CHANNELS, // user data + INSTANCES, // user data + VISIBILITY, // user data + PRIMITIVES, // user data + BONES, // filament data, UBO storing a pointer to the bones information + MORPHTARGET_BUFFER, // morphtarget buffer for the component + DESCRIPTOR_SET // per-renderable descriptor set }; using Base = utils::SingleInstanceComponentManager< @@ -214,11 +268,12 @@ class FRenderableManager : public RenderableManager { uint8_t, // LAYERS MorphWeights, // MORPH_WEIGHTS uint8_t, // CHANNELS - uint16_t, // INSTANCE_COUNT + InstancesInfo, // INSTANCES Visibility, // VISIBILITY utils::Slice, // PRIMITIVES Bones, // BONES - utils::Slice // MORPH_TARGETS + FMorphTargetBuffer*, // MORPHTARGET_BUFFER + DescriptorSet // DESCRIPTOR_SET >; struct Sim : public Base { @@ -233,15 +288,16 @@ class FRenderableManager : public RenderableManager { union { // this specific usage of union is permitted. All fields are identical - Field aabb; - Field layers; - Field morphWeights; - Field channels; - Field instanceCount; - Field visibility; - Field primitives; - Field bones; - Field morphTargets; + Field aabb; + Field layers; + Field morphWeights; + Field channels; + Field instances; + Field visibility; + Field primitives; + Field bones; + Field morphTargetBuffer; + Field descriptorSet; }; }; @@ -260,76 +316,106 @@ class FRenderableManager : public RenderableManager { FILAMENT_DOWNCAST(RenderableManager) -void FRenderableManager::setAxisAlignedBoundingBox(Instance instance, const Box& aabb) noexcept { +void FRenderableManager::setAxisAlignedBoundingBox(Instance const instance, const Box& aabb) { if (instance) { + FILAMENT_CHECK_PRECONDITION( + static_cast(mManager[instance].visibility).geometryType == + GeometryType::DYNAMIC) + << "This renderable has staticBounds enabled; its AABB cannot change."; mManager[instance].aabb = aabb; } } -void FRenderableManager::setLayerMask(Instance instance, - uint8_t select, uint8_t values) noexcept { +void FRenderableManager::setLayerMask(Instance const instance, + uint8_t const select, uint8_t const values) noexcept { if (instance) { uint8_t& layers = mManager[instance].layers; layers = (layers & ~select) | (values & select); } } -void FRenderableManager::setLayerMask(Instance instance, uint8_t layerMask) noexcept { +void FRenderableManager::setLayerMask(Instance const instance, uint8_t const layerMask) noexcept { if (instance) { mManager[instance].layers = layerMask; } } -void FRenderableManager::setPriority(Instance instance, uint8_t priority) noexcept { +void FRenderableManager::setPriority(Instance const instance, uint8_t const priority) noexcept { if (instance) { Visibility& visibility = mManager[instance].visibility; - visibility.priority = priority; + visibility.priority = std::min(priority, uint8_t(0x7)); } } -void FRenderableManager::setCastShadows(Instance instance, bool enable) noexcept { +void FRenderableManager::setChannel(Instance const instance, uint8_t const channel) noexcept { + if (instance) { + Visibility& visibility = mManager[instance].visibility; + visibility.channel = std::min(channel, uint8_t(0x3)); + } +} + +void FRenderableManager::setCastShadows(Instance const instance, bool const enable) noexcept { if (instance) { Visibility& visibility = mManager[instance].visibility; visibility.castShadows = enable; } } -void FRenderableManager::setReceiveShadows(Instance instance, bool enable) noexcept { +void FRenderableManager::setReceiveShadows(Instance const instance, bool const enable) noexcept { if (instance) { Visibility& visibility = mManager[instance].visibility; visibility.receiveShadows = enable; } } -void FRenderableManager::setScreenSpaceContactShadows(Instance instance, bool enable) noexcept { +void FRenderableManager::setScreenSpaceContactShadows(Instance const instance, bool const enable) noexcept { if (instance) { Visibility& visibility = mManager[instance].visibility; visibility.screenSpaceContactShadows = enable; } } -void FRenderableManager::setCulling(Instance instance, bool enable) noexcept { +void FRenderableManager::setCulling(Instance const instance, bool const enable) noexcept { if (instance) { Visibility& visibility = mManager[instance].visibility; visibility.culling = enable; } } -void FRenderableManager::setSkinning(Instance instance, bool enable) noexcept { +void FRenderableManager::setFogEnabled(Instance const instance, bool const enable) noexcept { if (instance) { Visibility& visibility = mManager[instance].visibility; + visibility.fog = enable; + } +} + +bool FRenderableManager::getFogEnabled(RenderableManager::Instance const instance) const noexcept { + return getVisibility(instance).fog; +} + +void FRenderableManager::setSkinning(Instance const instance, bool const enable) { + if (instance) { + Visibility& visibility = mManager[instance].visibility; + + FILAMENT_CHECK_PRECONDITION(visibility.geometryType != GeometryType::STATIC || !enable) + << "Skinning can't be used with STATIC geometry"; + visibility.skinning = enable; } } -void FRenderableManager::setMorphing(Instance instance, bool enable) noexcept { +void FRenderableManager::setMorphing(Instance const instance, bool const enable) { if (instance) { Visibility& visibility = mManager[instance].visibility; + + FILAMENT_CHECK_PRECONDITION(visibility.geometryType != GeometryType::STATIC || !enable) + << "Morphing can't be used with STATIC geometry"; + visibility.morphing = enable; } } -void FRenderableManager::setPrimitives(Instance instance, +void FRenderableManager::setPrimitives(Instance const instance, utils::Slice const& primitives) noexcept { if (instance) { mManager[instance].primitives = primitives; @@ -337,78 +423,73 @@ void FRenderableManager::setPrimitives(Instance instance, } FRenderableManager::Visibility -FRenderableManager::getVisibility(Instance instance) const noexcept { +FRenderableManager::getVisibility(Instance const instance) const noexcept { return mManager[instance].visibility; } -bool FRenderableManager::isShadowCaster(Instance instance) const noexcept { +bool FRenderableManager::isShadowCaster(Instance const instance) const noexcept { return getVisibility(instance).castShadows; } -bool FRenderableManager::isShadowReceiver(Instance instance) const noexcept { +bool FRenderableManager::isShadowReceiver(Instance const instance) const noexcept { return getVisibility(instance).receiveShadows; } -bool FRenderableManager::isCullingEnabled(Instance instance) const noexcept { +bool FRenderableManager::isCullingEnabled(Instance const instance) const noexcept { return getVisibility(instance).culling; } -uint8_t FRenderableManager::getLayerMask(Instance instance) const noexcept { +uint8_t FRenderableManager::getLayerMask(Instance const instance) const noexcept { return mManager[instance].layers; } -uint8_t FRenderableManager::getPriority(Instance instance) const noexcept { +uint8_t FRenderableManager::getPriority(Instance const instance) const noexcept { return getVisibility(instance).priority; } -uint8_t FRenderableManager::getChannels(Instance instance) const noexcept { +uint8_t FRenderableManager::getChannels(Instance const instance) const noexcept { return mManager[instance].channels; } -uint16_t FRenderableManager::getInstanceCount(Instance instance) const noexcept { - return mManager[instance].instanceCount; -} - -Box const& FRenderableManager::getAABB(Instance instance) const noexcept { +Box const& FRenderableManager::getAABB(Instance const instance) const noexcept { return mManager[instance].aabb; } FRenderableManager::SkinningBindingInfo -FRenderableManager::getSkinningBufferInfo(Instance instance) const noexcept { +FRenderableManager::getSkinningBufferInfo(Instance const instance) const noexcept { Bones const& bones = mManager[instance].bones; - return { bones.handle, bones.offset }; + return { bones.handle, bones.offset, bones.handleTexture }; } -inline uint32_t FRenderableManager::getBoneCount(Instance instance) const noexcept { +inline uint32_t FRenderableManager::getBoneCount(Instance const instance) const noexcept { Bones const& bones = mManager[instance].bones; return bones.count; } FRenderableManager::MorphingBindingInfo -FRenderableManager::getMorphingBufferInfo(Instance instance) const noexcept { +FRenderableManager::getMorphingBufferInfo(Instance const instance) const noexcept { MorphWeights const& morphWeights = mManager[instance].morphWeights; - utils::Slice const& morphTargets = getMorphTargets(instance, 0); - return { morphWeights.handle, morphWeights.count, morphTargets.data() }; + FMorphTargetBuffer const* const buffer = mManager[instance].morphTargetBuffer; + return { morphWeights.handle, morphWeights.count, buffer }; +} + +FRenderableManager::InstancesInfo +FRenderableManager::getInstancesInfo(Instance const instance) const noexcept { + return mManager[instance].instances; } utils::Slice const& FRenderableManager::getRenderPrimitives( - Instance instance, uint8_t level) const noexcept { + Instance const instance, UTILS_UNUSED uint8_t level) const noexcept { return mManager[instance].primitives; } utils::Slice& FRenderableManager::getRenderPrimitives( - Instance instance, uint8_t level) noexcept { + Instance const instance, UTILS_UNUSED uint8_t level) noexcept { return mManager[instance].primitives; } -utils::Slice const& FRenderableManager::getMorphTargets( - Instance instance, uint8_t level) const noexcept { - return mManager[instance].morphTargets; -} - -utils::Slice& FRenderableManager::getMorphTargets( - Instance instance, uint8_t level) noexcept { - return mManager[instance].morphTargets; +DescriptorSet& FRenderableManager::getDescriptorSet(Instance const instance) noexcept { + return mManager[instance].descriptorSet; } } // namespace filament diff --git a/filament/src/components/TransformManager.cpp b/filament/src/components/TransformManager.cpp index 9324d5ac6ed..6a90c19599c 100644 --- a/filament/src/components/TransformManager.cpp +++ b/filament/src/components/TransformManager.cpp @@ -34,7 +34,7 @@ FTransformManager::~FTransformManager() noexcept = default; void FTransformManager::terminate() noexcept { } -void FTransformManager::setAccurateTranslationsEnabled(bool enable) noexcept { +void FTransformManager::setAccurateTranslationsEnabled(bool const enable) noexcept { if (enable != mAccurateTranslations) { mAccurateTranslations = enable; // when enabling accurate translations, we have to recompute all world transforms @@ -44,11 +44,11 @@ void FTransformManager::setAccurateTranslationsEnabled(bool enable) noexcept { } } -void FTransformManager::create(Entity entity) { +void FTransformManager::create(Entity const entity) { create(entity, 0, mat4f{}); } -void FTransformManager::create(Entity entity, Instance parent, const mat4f& localTransform) { +void FTransformManager::create(Entity const entity, Instance const parent, const mat4f& localTransform) { // this always adds at the end, so all existing instances stay valid auto& manager = mManager; @@ -70,7 +70,7 @@ void FTransformManager::create(Entity entity, Instance parent, const mat4f& loca } } -void FTransformManager::create(Entity entity, Instance parent, const mat4& localTransform) { +void FTransformManager::create(Entity const entity, Instance const parent, const mat4& localTransform) { // this always adds at the end, so all existing instances stay valid auto& manager = mManager; @@ -92,7 +92,7 @@ void FTransformManager::create(Entity entity, Instance parent, const mat4& local } } -void FTransformManager::setParent(Instance i, Instance parent) noexcept { +void FTransformManager::setParent(Instance const i, Instance const parent) noexcept { validateNode(i); if (i) { auto& manager = mManager; @@ -115,14 +115,14 @@ Entity FTransformManager::getParent(Instance i) const noexcept { return i ? mManager.getEntity(i) : Entity(); } -size_t FTransformManager::getChildCount(Instance i) const noexcept { +size_t FTransformManager::getChildCount(Instance const i) const noexcept { size_t count = 0; for (Instance ci = mManager[i].firstChild; ci; ci = mManager[ci].next, ++count); return count; } -size_t FTransformManager::getChildren(Instance i, utils::Entity* children, - size_t count) const noexcept { +size_t FTransformManager::getChildren(Instance const i, Entity* children, + size_t const count) const noexcept { Instance ci = mManager[i].firstChild; size_t numWritten = 0; while (ci && numWritten < count) { @@ -133,7 +133,7 @@ size_t FTransformManager::getChildren(Instance i, utils::Entity* children, } TransformManager::children_iterator FTransformManager::getChildrenBegin( - Instance parent) const noexcept { + Instance const parent) const noexcept { return { *this, mManager[parent].firstChild }; } @@ -141,7 +141,7 @@ TransformManager::children_iterator FTransformManager::getChildrenEnd(Instance) return { *this, 0 }; } -void FTransformManager::destroy(Entity e) noexcept { +void FTransformManager::destroy(Entity const e) noexcept { // update the reference of the element we're removing auto& manager = mManager; Instance const i = manager.getInstance(e); @@ -167,7 +167,7 @@ void FTransformManager::destroy(Entity e) noexcept { } } -void FTransformManager::setTransform(Instance ci, const mat4f& model) noexcept { +void FTransformManager::setTransform(Instance const ci, const mat4f& model) noexcept { validateNode(ci); if (ci) { auto& manager = mManager; @@ -178,7 +178,7 @@ void FTransformManager::setTransform(Instance ci, const mat4f& model) noexcept { } } -void FTransformManager::setTransform(Instance ci, const mat4& model) noexcept { +void FTransformManager::setTransform(Instance const ci, const mat4& model) noexcept { validateNode(ci); if (ci) { auto& manager = mManager; @@ -189,7 +189,7 @@ void FTransformManager::setTransform(Instance ci, const mat4& model) noexcept { } } -void FTransformManager::updateNodeTransform(Instance i) noexcept { +void FTransformManager::updateNodeTransform(Instance const i) noexcept { if (UTILS_UNLIKELY(mLocalTransformTransactionOpen)) { return; } @@ -201,7 +201,7 @@ void FTransformManager::updateNodeTransform(Instance i) noexcept { // find our parent's world transform, if any // note: by using the raw_array() we don't need to check that parent is valid. Instance const parent = manager[i].parent; - FTransformManager::computeWorldTransform( + computeWorldTransform( manager[i].world, manager[i].worldTranslationLo, manager[parent].world, manager[i].local, manager[parent].worldTranslationLo, manager[i].localTranslationLo, @@ -241,7 +241,7 @@ void FTransformManager::computeAllWorldTransforms() noexcept { Instance const parent = manager[i].parent; assert_invariant(parent < i); - FTransformManager::computeWorldTransform( + computeWorldTransform( manager[i].world, manager[i].worldTranslationLo, manager[parent].world, manager[i].local, manager[parent].worldTranslationLo, manager[i].localTranslationLo, @@ -250,7 +250,7 @@ void FTransformManager::computeAllWorldTransforms() noexcept { } // Inserts a parentless node in the hierarchy -void FTransformManager::insertNode(Instance i, Instance parent) noexcept { +void FTransformManager::insertNode(Instance const i, Instance const parent) noexcept { auto& manager = mManager; assert_invariant(manager[i].parent == Instance{}); @@ -274,7 +274,7 @@ void FTransformManager::insertNode(Instance i, Instance parent) noexcept { validateNode(parent); } -void FTransformManager::swapNode(Instance i, Instance j) noexcept { +void FTransformManager::swapNode(Instance const i, Instance const j) noexcept { validateNode(i); validateNode(j); @@ -316,7 +316,7 @@ void FTransformManager::swapNode(Instance i, Instance j) noexcept { // removes a node from the graph, but doesn't remove it or its children from the array // (making everybody orphaned). -void FTransformManager::removeNode(Instance i) noexcept { +void FTransformManager::removeNode(Instance const i) noexcept { auto& manager = mManager; Instance const parent = manager[i].parent; Instance const prev = manager[i].prev; @@ -342,7 +342,7 @@ void FTransformManager::removeNode(Instance i) noexcept { } // update references to this node after it has been moved in the array -void FTransformManager::updateNode(Instance i) noexcept { +void FTransformManager::updateNode(Instance const i) noexcept { auto& manager = mManager; // update our preview sibling's next reference (to ourselves) Instance const parent = manager[i].parent; @@ -376,7 +376,7 @@ void FTransformManager::transformChildren(Sim& manager, Instance i) noexcept { while (i) { // update child's world transform Instance const parent = manager[i].parent; - FTransformManager::computeWorldTransform( + computeWorldTransform( manager[i].world, manager[i].worldTranslationLo, manager[parent].world, manager[i].local, manager[parent].worldTranslationLo, manager[i].localTranslationLo, @@ -400,7 +400,7 @@ void FTransformManager::computeWorldTransform( mat4f const& UTILS_RESTRICT local, float3 const& UTILS_RESTRICT ptTranslationLo, // reference to avoid unneeded access float3 const& UTILS_RESTRICT localTranslationLo, // reference to avoid unneeded access - bool accurate) { + bool const accurate) { outWorld[0] = pt * local[0]; outWorld[1] = pt * local[1]; @@ -428,7 +428,7 @@ void FTransformManager::computeWorldTransform( } -void FTransformManager::validateNode(UTILS_UNUSED_IN_RELEASE Instance i) noexcept { +void FTransformManager::validateNode(UTILS_UNUSED_IN_RELEASE Instance const i) noexcept { #ifndef NDEBUG auto& manager = mManager; if (i) { @@ -470,9 +470,8 @@ void FTransformManager::validateNode(UTILS_UNUSED_IN_RELEASE Instance i) noexcep #endif } -void FTransformManager::gc(utils::EntityManager& em) noexcept { - auto& manager = mManager; - manager.gc(em, 4, [this](Entity e) { +void FTransformManager::gc(EntityManager& em) noexcept { + mManager.gc(em, [this](Entity const e) { destroy(e); }); } diff --git a/filament/src/components/TransformManager.h b/filament/src/components/TransformManager.h index e7a674c8b0e..b985d471f84 100644 --- a/filament/src/components/TransformManager.h +++ b/filament/src/components/TransformManager.h @@ -32,7 +32,7 @@ namespace filament { class UTILS_PRIVATE FTransformManager : public TransformManager { public: - using Instance = TransformManager::Instance; + using Instance = Instance; FTransformManager() noexcept; ~FTransformManager() noexcept; @@ -45,12 +45,28 @@ class UTILS_PRIVATE FTransformManager : public TransformManager { * Component Manager APIs */ - bool hasComponent(utils::Entity e) const noexcept { + bool hasComponent(utils::Entity const e) const noexcept { return mManager.hasComponent(e); } - Instance getInstance(utils::Entity e) const noexcept { - return Instance(mManager.getInstance(e)); + Instance getInstance(utils::Entity const e) const noexcept { + return { mManager.getInstance(e) }; + } + + size_t getComponentCount() const noexcept { + return mManager.getComponentCount(); + } + + bool empty() const noexcept { + return mManager.empty(); + } + + utils::Entity getEntity(Instance const i) const noexcept { + return mManager.getEntity(i); + } + + utils::Entity const* getEntities() const noexcept { + return mManager.getEntities(); } void setAccurateTranslationsEnabled(bool enable) noexcept; @@ -93,25 +109,25 @@ class UTILS_PRIVATE FTransformManager : public TransformManager { void setTransform(Instance ci, const math::mat4& model) noexcept; - const math::mat4f& getTransform(Instance ci) const noexcept { + const math::mat4f& getTransform(Instance const ci) const noexcept { return mManager[ci].local; } - const math::mat4f& getWorldTransform(Instance ci) const noexcept { + const math::mat4f& getWorldTransform(Instance const ci) const noexcept { return mManager[ci].world; } - math::mat4 getTransformAccurate(Instance ci) const noexcept { + math::mat4 getTransformAccurate(Instance const ci) const noexcept { math::mat4f const& local = mManager[ci].local; - math::float3 localTranslationLo = mManager[ci].localTranslationLo; + math::float3 const localTranslationLo = mManager[ci].localTranslationLo; math::mat4 r(local); r[3].xyz += localTranslationLo; return r; } - math::mat4 getWorldTransformAccurate(Instance ci) const noexcept { + math::mat4 getWorldTransformAccurate(Instance const ci) const noexcept { math::mat4f const& world = mManager[ci].world; - math::float3 worldTranslationLo = mManager[ci].worldTranslationLo; + math::float3 const worldTranslationLo = mManager[ci].worldTranslationLo; math::mat4 r(world); r[3].xyz += worldTranslationLo; return r; @@ -135,7 +151,7 @@ class UTILS_PRIVATE FTransformManager : public TransformManager { math::float3 const& ptTranslationLo, math::float3 const& localTranslationLo, bool accurate); - friend class TransformManager::children_iterator; + friend class children_iterator; enum { LOCAL, // local transform (relative to parent), world if no parent @@ -163,7 +179,7 @@ class UTILS_PRIVATE FTransformManager : public TransformManager { using Base::gc; using Base::swap; - typename Base::SoA& getSoA() { return mData; } + SoA& getSoA() { return mData; } struct Proxy { // all of these gets inlined diff --git a/filament/src/details/BufferObject.cpp b/filament/src/details/BufferObject.cpp index 04a68223ba2..a41725295b3 100644 --- a/filament/src/details/BufferObject.cpp +++ b/filament/src/details/BufferObject.cpp @@ -20,6 +20,8 @@ #include "FilamentAPI-impl.h" +#include + namespace filament { struct BufferObject::BuilderDetails { @@ -30,32 +32,39 @@ struct BufferObject::BuilderDetails { using BuilderType = BufferObject; BuilderType::Builder::Builder() noexcept = default; BuilderType::Builder::~Builder() noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder&& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder&& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder const& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder&& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder const& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder&& rhs) noexcept = default; -BufferObject::Builder& BufferObject::Builder::size(uint32_t byteCount) noexcept { +BufferObject::Builder& BufferObject::Builder::size(uint32_t const byteCount) noexcept { mImpl->mByteCount = byteCount; return *this; } -BufferObject::Builder& BufferObject::Builder::bindingType(BindingType bindingType) noexcept { +BufferObject::Builder& BufferObject::Builder::bindingType(BindingType const bindingType) noexcept { mImpl->mBindingType = bindingType; return *this; } +BufferObject::Builder& BufferObject::Builder::name(const char* name, size_t const len) noexcept { + return BuilderNameMixin::name(name, len); +} + BufferObject* BufferObject::Builder::build(Engine& engine) { return downcast(engine).createBufferObject(*this); } // ------------------------------------------------------------------------------------------------ -FBufferObject::FBufferObject(FEngine& engine, const BufferObject::Builder& builder) +FBufferObject::FBufferObject(FEngine& engine, const Builder& builder) : mByteCount(builder->mByteCount), mBindingType(builder->mBindingType) { FEngine::DriverApi& driver = engine.getDriverApi(); mHandle = driver.createBufferObject(builder->mByteCount, builder->mBindingType, backend::BufferUsage::STATIC); + if (auto name = builder.getName(); !name.empty()) { + driver.setDebugTag(mHandle.getId(), std::move(name)); + } } void FBufferObject::terminate(FEngine& engine) { @@ -63,7 +72,7 @@ void FBufferObject::terminate(FEngine& engine) { driver.destroyBufferObject(mHandle); } -void FBufferObject::setBuffer(FEngine& engine, BufferDescriptor&& buffer, uint32_t byteOffset) { +void FBufferObject::setBuffer(FEngine& engine, BufferDescriptor&& buffer, uint32_t const byteOffset) { engine.getDriverApi().updateBufferObject(mHandle, std::move(buffer), byteOffset); } diff --git a/filament/src/details/Camera.cpp b/filament/src/details/Camera.cpp index 4be063db7f8..775e3f175e1 100644 --- a/filament/src/details/Camera.cpp +++ b/filament/src/details/Camera.cpp @@ -42,16 +42,16 @@ static constexpr const float MAX_SHUTTER_SPEED = 60.0f; static constexpr const float MIN_SENSITIVITY = 10.0f; static constexpr const float MAX_SENSITIVITY = 204800.0f; -FCamera::FCamera(FEngine& engine, Entity e) +FCamera::FCamera(FEngine& engine, Entity const e) : mEngine(engine), mEntity(e) { } -void UTILS_NOINLINE FCamera::setProjection(double fovInDegrees, double aspect, double near, double far, - Camera::Fov direction) { +mat4 FCamera::projection(Fov const direction, double const fovInDegrees, + double const aspect, double const near, double const far) { double w; double h; - double s = std::tan(fovInDegrees * math::d::DEG_TO_RAD / 2.0) * near; + double const s = std::tan(fovInDegrees * d::DEG_TO_RAD / 2.0) * near; if (direction == Fov::VERTICAL) { w = s * aspect; h = s; @@ -59,46 +59,68 @@ void UTILS_NOINLINE FCamera::setProjection(double fovInDegrees, double aspect, d w = s; h = s / aspect; } - FCamera::setProjection(Projection::PERSPECTIVE, -w, w, -h, h, near, far); + mat4 p = mat4::frustum(-w, w, -h, h, near, far); + if (far == std::numeric_limits::infinity()) { + p[2][2] = -1.0f; // lim(far->inf) = -1 + p[3][2] = -2.0f * near; // lim(far->inf) = -2*near + } + return p; } -void FCamera::setLensProjection(double focalLengthInMillimeters, - double aspect, double near, double far) { +mat4 FCamera::projection(double const focalLengthInMillimeters, + double const aspect, double const near, double const far) { // a 35mm camera has a 36x24mm wide frame size - double h = (0.5 * near) * ((SENSOR_SIZE * 1000.0) / focalLengthInMillimeters); - double w = h * aspect; - FCamera::setProjection(Projection::PERSPECTIVE, -w, w, -h, h, near, far); + double const h = (0.5 * near) * ((SENSOR_SIZE * 1000.0) / focalLengthInMillimeters); + double const w = h * aspect; + mat4 p = mat4::frustum(-w, w, -h, h, near, far); + if (far == std::numeric_limits::infinity()) { + p[2][2] = -1.0f; // lim(far->inf) = -1 + p[3][2] = -2.0f * near; // lim(far->inf) = -2*near + } + return p; } /* * All methods for setting the projection funnel through here */ -void UTILS_NOINLINE FCamera::setCustomProjection(mat4 const& p, double near, double far) noexcept { - setCustomProjection(p, p, near, far); -} - void UTILS_NOINLINE FCamera::setCustomProjection(mat4 const& p, - mat4 const& c, double near, double far) noexcept { - mProjection = p; + mat4 const& c, double const near, double const far) noexcept { + for (auto& eyeProjection: mEyeProjection) { + eyeProjection = p; + } mProjectionForCulling = c; mNear = near; mFar = far; } -void UTILS_NOINLINE FCamera::setProjection(Camera::Projection projection, - double left, double right, - double bottom, double top, - double near, double far) { +void UTILS_NOINLINE FCamera::setCustomEyeProjection(mat4 const* projection, size_t const count, + mat4 const& projectionForCulling, double const near, double const far) { + const Engine::Config& config = mEngine.getConfig(); + FILAMENT_CHECK_PRECONDITION(count >= config.stereoscopicEyeCount) + << "All eye projections must be supplied together, count must be >= " + "config.stereoscopicEyeCount (" + << config.stereoscopicEyeCount << ")"; + for (int i = 0; i < config.stereoscopicEyeCount; i++) { + mEyeProjection[i] = projection[i]; + } + mProjectionForCulling = projectionForCulling; + mNear = near; + mFar = far; +} + +void UTILS_NOINLINE FCamera::setProjection(Projection const projection, + double const left, double const right, + double const bottom, double const top, + double const near, double const far) { - ASSERT_PRECONDITION(!( - left == right || - bottom == top || + FILAMENT_CHECK_PRECONDITION(!(left == right || bottom == top || (projection == Projection::PERSPECTIVE && (near <= 0 || far <= near)) || - (projection == Projection::ORTHO && (near == far))), - "Camera preconditions not met in setProjection(%s, %f, %f, %f, %f, %f, %f)", - projection == Camera::Projection::PERSPECTIVE ? "PERSPECTIVE" : "ORTHO", - left, right, bottom, top, near, far); + (projection == Projection::ORTHO && (near == far)))) + << "Camera preconditions not met in setProjection(" + << (projection == Projection::PERSPECTIVE ? "PERSPECTIVE" : "ORTHO") << ", " + << left << ", " << right << ", " << bottom << ", " << top << ", " << near << ", " << far + << ")"; mat4 c, p; switch (projection) { @@ -139,10 +161,12 @@ void UTILS_NOINLINE FCamera::setProjection(Camera::Projection projection, p = c; break; } - FCamera::setCustomProjection(p, c, near, far); + setCustomProjection(p, c, near, far); } -math::mat4 FCamera::getProjectionMatrix() const noexcept { +mat4 FCamera::getProjectionMatrix(uint8_t const eye) const noexcept { + UTILS_UNUSED_IN_RELEASE const Engine::Config& config = mEngine.getConfig(); + assert_invariant(eye < config.stereoscopicEyeCount); // This is where we transform the user clip-space (GL convention) to our virtual clip-space // (inverted DX convention) // Note that this math ends up setting the projection matrix' p33 to 0, which is where we're @@ -153,10 +177,10 @@ math::mat4 FCamera::getProjectionMatrix() const noexcept { 0.0, 0.0, -0.5, 0.5, // GL to inverted DX convention 0.0, 0.0, 0.0, 1.0 }}; - return m * mProjection; + return m * mEyeProjection[eye]; } -math::mat4 FCamera::getCullingProjectionMatrix() const noexcept { +mat4 FCamera::getCullingProjectionMatrix() const noexcept { // The culling projection matrix stays in the GL convention const mat4 m{ mat4::row_major_init{ mScalingCS.x, 0.0, 0.0, mShiftCS.x, @@ -167,6 +191,14 @@ math::mat4 FCamera::getCullingProjectionMatrix() const noexcept { return m * mProjectionForCulling; } +const mat4& FCamera::getUserProjectionMatrix(uint8_t const eyeId) const { + const Engine::Config& config = mEngine.getConfig(); + FILAMENT_CHECK_PRECONDITION(eyeId < config.stereoscopicEyeCount) + << "eyeId must be < config.stereoscopicEyeCount (" << config.stereoscopicEyeCount + << ")"; + return mEyeProjection[eyeId]; +} + void UTILS_NOINLINE FCamera::setModelMatrix(const mat4f& modelMatrix) noexcept { FTransformManager& transformManager = mEngine.getTransformManager(); transformManager.setTransform(transformManager.getInstance(mEntity), modelMatrix); @@ -177,6 +209,14 @@ void UTILS_NOINLINE FCamera::setModelMatrix(const mat4& modelMatrix) noexcept { transformManager.setTransform(transformManager.getInstance(mEntity), modelMatrix); } +void UTILS_NOINLINE FCamera::setEyeModelMatrix(uint8_t const eyeId, mat4 const& model) { + const Engine::Config& config = mEngine.getConfig(); + FILAMENT_CHECK_PRECONDITION(eyeId < config.stereoscopicEyeCount) + << "eyeId must be < config.stereoscopicEyeCount (" << config.stereoscopicEyeCount + << ")"; + mEyeFromView[eyeId] = inverse(model); +} + void FCamera::lookAt(double3 const& eye, double3 const& center, double3 const& up) noexcept { FTransformManager& transformManager = mEngine.getTransformManager(); transformManager.setTransform(transformManager.getInstance(mEntity), @@ -197,88 +237,59 @@ Frustum FCamera::getCullingFrustum() const noexcept { return Frustum(mat4f{ getCullingProjectionMatrix() * getViewMatrix() }); } -void FCamera::setExposure(float aperture, float shutterSpeed, float sensitivity) noexcept { +void FCamera::setExposure(float const aperture, float const shutterSpeed, float const sensitivity) noexcept { mAperture = clamp(aperture, MIN_APERTURE, MAX_APERTURE); mShutterSpeed = clamp(shutterSpeed, MIN_SHUTTER_SPEED, MAX_SHUTTER_SPEED); mSensitivity = clamp(sensitivity, MIN_SENSITIVITY, MAX_SENSITIVITY); } double FCamera::getFocalLength() const noexcept { - return (FCamera::SENSOR_SIZE * mProjection[1][1]) * 0.5; + auto const& monoscopicEyeProjection = mEyeProjection[0]; + return (SENSOR_SIZE * monoscopicEyeProjection[1][1]) * 0.5; } -double FCamera::computeEffectiveFocalLength(double focalLength, double focusDistance) noexcept { +double FCamera::computeEffectiveFocalLength(double const focalLength, double focusDistance) noexcept { focusDistance = std::max(focalLength, focusDistance); return (focusDistance * focalLength) / (focusDistance - focalLength); } -double FCamera::computeEffectiveFov(double fovInDegrees, double focusDistance) noexcept { - double f = 0.5 * FCamera::SENSOR_SIZE / std::tan(fovInDegrees * math::d::DEG_TO_RAD * 0.5); +double FCamera::computeEffectiveFov(double const fovInDegrees, double focusDistance) noexcept { + double const f = 0.5 * SENSOR_SIZE / std::tan(fovInDegrees * d::DEG_TO_RAD * 0.5); focusDistance = std::max(f, focusDistance); - double fov = 2.0 * std::atan(FCamera::SENSOR_SIZE * (focusDistance - f) / (2.0 * focusDistance * f)); - return fov * math::d::RAD_TO_DEG; + double const fov = 2.0 * std::atan(SENSOR_SIZE * (focusDistance - f) / (2.0 * focusDistance * f)); + return fov * d::RAD_TO_DEG; } -template -math::details::TMat44 inverseProjection(const math::details::TMat44& p) noexcept { - math::details::TMat44 r; - const T A = 1 / p[0][0]; - const T B = 1 / p[1][1]; - if (p[2][3] != T(0)) { - // perspective projection - // a 0 tx 0 - // 0 b ty 0 - // 0 0 tz c - // 0 0 -1 0 - const T C = 1 / p[3][2]; - r[0][0] = A; - r[1][1] = B; - r[2][2] = 0; - r[2][3] = C; - r[3][0] = p[2][0] * A; // not needed if symmetric - r[3][1] = p[2][1] * B; // not needed if symmetric - r[3][2] = -1; - r[3][3] = p[2][2] * C; - } else { - // orthographic projection - // a 0 0 tx - // 0 b 0 ty - // 0 0 c tz - // 0 0 0 1 - const T C = 1 / p[2][2]; - r[0][0] = A; - r[1][1] = B; - r[2][2] = C; - r[3][3] = 1; - r[3][0] = -p[3][0] * A; - r[3][1] = -p[3][1] * B; - r[3][2] = -p[3][2] * C; - } - return r; +uint8_t FCamera::getStereoscopicEyeCount() const noexcept { + const Engine::Config& config = mEngine.getConfig(); + return config.stereoscopicEyeCount; } // ------------------------------------------------------------------------------------------------ -CameraInfo::CameraInfo(FCamera const& camera) noexcept { - projection = mat4f{ camera.getProjectionMatrix() }; - cullingProjection = mat4f{ camera.getCullingProjectionMatrix() }; - model = mat4f{ camera.getModelMatrix() }; - view = mat4f{ camera.getViewMatrix() }; - zn = (float)camera.getNear(); - zf = (float)camera.getCullingFar(); - ev100 = Exposure::ev100(camera); - f = (float)camera.getFocalLength(); - A = f / camera.getAperture(); - d = std::max(zn, camera.getFocusDistance()); +CameraInfo::CameraInfo(FCamera const& camera) noexcept + : CameraInfo(camera, {}, camera.getModelMatrix()) { +} + +CameraInfo::CameraInfo(FCamera const& camera, mat4 const& inWorldTransform) noexcept + : CameraInfo(camera, inWorldTransform, inWorldTransform * camera.getModelMatrix()) { } -CameraInfo::CameraInfo(FCamera const& camera, const math::mat4& worldOriginCamera) noexcept { - const mat4 modelMatrix{ worldOriginCamera * camera.getModelMatrix() }; - projection = mat4f{ camera.getProjectionMatrix() }; +CameraInfo::CameraInfo(FCamera const& camera, CameraInfo const& mainCameraInfo) noexcept + : CameraInfo(camera, mainCameraInfo.worldTransform, camera.getModelMatrix()) { +} + +CameraInfo::CameraInfo(FCamera const& camera, + mat4 const& inWorldTransform, + mat4 const& modelMatrix) noexcept { + for (size_t i = 0; i < camera.getStereoscopicEyeCount(); i++) { + eyeProjection[i] = mat4f{ camera.getProjectionMatrix(i) }; + eyeFromView[i] = mat4f{ camera.getEyeFromViewMatrix(i) }; + } cullingProjection = mat4f{ camera.getCullingProjectionMatrix() }; model = mat4f{ modelMatrix }; view = mat4f{ inverse(modelMatrix) }; - worldOrigin = worldOriginCamera; + worldTransform = inWorldTransform; zn = (float)camera.getNear(); zf = (float)camera.getCullingFar(); ev100 = Exposure::ev100(camera); diff --git a/filament/src/details/Camera.h b/filament/src/details/Camera.h index ebebb29eca2..34c986d615c 100644 --- a/filament/src/details/Camera.h +++ b/filament/src/details/Camera.h @@ -23,8 +23,11 @@ #include +#include + #include #include +#include #include #include @@ -43,43 +46,46 @@ class FCamera : public Camera { FCamera(FEngine& engine, utils::Entity e); - void terminate(FEngine& engine) noexcept { } + void terminate(FEngine&) noexcept { } + - // sets the projection matrix + // Sets the projection matrices (viewing and culling). The viewing matrice has infinite far. void setProjection(Projection projection, double left, double right, double bottom, double top, double near, double far); - // sets the projection matrix - void setProjection(double fovInDegrees, double aspect, double near, double far, - Fov direction = Fov::VERTICAL); - - // sets the projection matrix - void setLensProjection(double focalLengthInMillimeters, - double aspect, double near, double far); - - // Sets a custom projection matrix (sets both the viewing and culling projections). - void setCustomProjection(math::mat4 const& projection, double near, double far) noexcept; + // Sets custom projection matrices (sets both the viewing and culling projections). void setCustomProjection(math::mat4 const& projection, math::mat4 const& projectionForCulling, double near, double far) noexcept; - void setScaling(math::double2 scaling) noexcept { mScalingCS = scaling; } + inline void setCustomProjection(math::mat4 const& projection, + double const near, double const far) noexcept { + setCustomProjection(projection, projection, near, far); + } + + void setCustomEyeProjection(math::mat4 const* projection, size_t count, + math::mat4 const& projectionForCulling, double near, double far); + + + void setScaling(math::double2 const scaling) noexcept { mScalingCS = scaling; } math::double4 getScaling() const noexcept { return math::double4{ mScalingCS, 1.0, 1.0 }; } - void setShift(math::double2 shift) noexcept { mShiftCS = shift * 2.0; } + void setShift(math::double2 const shift) noexcept { mShiftCS = shift * 2.0; } math::double2 getShift() const noexcept { return mShiftCS * 0.5; } // viewing the projection matrix to be used for rendering, contains scaling/shift and possibly // other transforms needed by the shaders - math::mat4 getProjectionMatrix() const noexcept; + math::mat4 getProjectionMatrix(uint8_t eye = 0) const noexcept; // culling the projection matrix to be used for culling, contains scaling/shift math::mat4 getCullingProjectionMatrix() const noexcept; + math::mat4 getEyeFromViewMatrix(uint8_t const eye) const noexcept { return mEyeFromView[eye]; } + // viewing projection matrix set by the user - math::mat4 getUserProjectionMatrix() const noexcept { return mProjection; } + const math::mat4& getUserProjectionMatrix(uint8_t eyeId) const; // culling projection matrix set by the user math::mat4 getUserCullingProjectionMatrix() const noexcept { return mProjectionForCulling; } @@ -91,6 +97,7 @@ class FCamera : public Camera { // sets the camera's model matrix (must be a rigid transform) void setModelMatrix(const math::mat4& modelMatrix) noexcept; void setModelMatrix(const math::mat4f& modelMatrix) noexcept; + void setEyeModelMatrix(uint8_t eyeId, math::mat4 const& model); // sets the camera's model matrix void lookAt(math::double3 const& eye, math::double3 const& center, math::double3 const& up) noexcept; @@ -128,7 +135,7 @@ class FCamera : public Camera { return normalize(-getModelMatrix()[2].xyz); } - float getFieldOfView(Camera::Fov direction) const noexcept { + float getFieldOfView(Fov const direction) const noexcept { // note: this is meaningless for an orthographic projection auto const& p = getProjectionMatrix(); switch (direction) { @@ -139,7 +146,7 @@ class FCamera : public Camera { } } - float getFieldOfViewInDegrees(Camera::Fov direction) const noexcept { + float getFieldOfViewInDegrees(Fov const direction) const noexcept { return getFieldOfView(direction) * math::f::RAD_TO_DEG; } @@ -164,7 +171,7 @@ class FCamera : public Camera { return mSensitivity; } - void setFocusDistance(float distance) noexcept { + void setFocusDistance(float const distance) noexcept { mFocusDistance = distance; } @@ -178,18 +185,29 @@ class FCamera : public Camera { static double computeEffectiveFov(double fovInDegrees, double focusDistance) noexcept; + uint8_t getStereoscopicEyeCount() const noexcept; + utils::Entity getEntity() const noexcept { return mEntity; } + static math::mat4 projection(Fov direction, double fovInDegrees, + double aspect, double near, double far); + + static math::mat4 projection(double focalLengthInMillimeters, + double aspect, double near, double far); + private: FEngine& mEngine; utils::Entity mEntity; - math::mat4 mProjection; // projection matrix (infinite far) - math::mat4 mProjectionForCulling; // projection matrix (with far plane) - math::double2 mScalingCS = { 1.0 }; // additional scaling applied to projection - math::double2 mShiftCS = { 0.0 }; // additional translation applied to projection + // For monoscopic cameras, mEyeProjection[0] == mEyeProjection[1]. + math::mat4 mEyeProjection[CONFIG_MAX_STEREOSCOPIC_EYES]; // projection matrix per eye (infinite far) + math::mat4 mProjectionForCulling; // projection matrix (with far plane) + math::mat4 mEyeFromView[CONFIG_MAX_STEREOSCOPIC_EYES]; // transforms from the main view (head) + // space to each eye's unique view space + math::double2 mScalingCS = {1.0}; // additional scaling applied to projection + math::double2 mShiftCS = {0.0}; // additional translation applied to projection double mNear{}; double mFar{}; @@ -201,26 +219,51 @@ class FCamera : public Camera { }; struct CameraInfo { - CameraInfo() noexcept = default; + CameraInfo() noexcept {} + + // Creates a CameraInfo relative to inWorldTransform (i.e. it's model matrix is + // transformed by inWorldTransform and inWorldTransform is recorded). + // This is typically used for the color pass camera. + CameraInfo(FCamera const& camera, math::mat4 const& inWorldTransform) noexcept; + + // Creates a CameraInfo from a camera that is relative to mainCameraInfo. + // This is typically used for the shadow pass cameras. + CameraInfo(FCamera const& camera, CameraInfo const& mainCameraInfo) noexcept; + + // Creates a CameraInfo from the FCamera explicit CameraInfo(FCamera const& camera) noexcept; - CameraInfo(FCamera const& camera, const math::mat4& worldOriginCamera) noexcept; - - math::mat4f projection; // projection matrix for drawing (infinite zfar) - math::mat4f cullingProjection; // projection matrix for culling - math::mat4f model; // camera model matrix - math::mat4f view; // camera view matrix (inverse(model)) - math::mat4 worldOrigin; // world origin transform (already applied to model and view) - math::float4 clipTransfrom{1,1,0,0}; // clip-space transform, only for VERTEX_DOMAIN_DEVICE - float zn{}; // distance (positive) to the near plane - float zf{}; // distance (positive) to the far plane - float ev100{}; // exposure - float f{}; // focal length [m] - float A{}; // f-number or f / aperture diameter [m] - float d{}; // focus distance [m] + + union { + // projection matrix for drawing (infinite zfar) + // for monoscopic rendering + // equivalent to eyeProjection[0], but aliased here for convenience + math::mat4f projection; + + // for stereo rendering, one matrix per eye + math::mat4f eyeProjection[CONFIG_MAX_STEREOSCOPIC_EYES] = {}; + }; + + math::mat4f cullingProjection; // projection matrix for culling + math::mat4f model; // camera model matrix + math::mat4f view; // camera view matrix (inverse(model)) + math::mat4f eyeFromView[CONFIG_MAX_STEREOSCOPIC_EYES]; // eye view matrix (only for stereoscopic) + math::mat4 worldTransform; // world transform (already applied + // to model and view) + math::float4 clipTransform{1, 1, 0, 0}; // clip-space transform, only for VERTEX_DOMAIN_DEVICE + float zn{}; // distance (positive) to the near plane + float zf{}; // distance (positive) to the far plane + float ev100{}; // exposure + float f{}; // focal length [m] + float A{}; // f-number or f / aperture diameter [m] + float d{}; // focus distance [m] math::float3 const& getPosition() const noexcept { return model[3].xyz; } math::float3 getForwardVector() const noexcept { return normalize(-model[2].xyz); } - math::float3 getWorldOffset() const noexcept { return -worldOrigin[3].xyz; } - math::mat4 getUserViewMatrix() const noexcept { return view * worldOrigin; } + math::mat4 getUserViewMatrix() const noexcept { return view * worldTransform; } + +private: + CameraInfo(FCamera const& camera, + math::mat4 const& inWorldTransform, + math::mat4 const& modelMatrix) noexcept; }; FILAMENT_DOWNCAST(Camera) diff --git a/filament/src/details/ColorGrading.cpp b/filament/src/details/ColorGrading.cpp index cac9c6962ac..b3c577c2d66 100644 --- a/filament/src/details/ColorGrading.cpp +++ b/filament/src/details/ColorGrading.cpp @@ -30,11 +30,13 @@ #include #include -#include +#include #include #include #include +#include +#include namespace filament { @@ -131,26 +133,26 @@ struct ColorGrading::BuilderDetails { using BuilderType = ColorGrading; BuilderType::Builder::Builder() noexcept = default; BuilderType::Builder::~Builder() noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder&& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder&& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder const& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder&& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder const& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder&& rhs) noexcept = default; -ColorGrading::Builder& ColorGrading::Builder::quality(ColorGrading::QualityLevel qualityLevel) noexcept { +ColorGrading::Builder& ColorGrading::Builder::quality(QualityLevel const qualityLevel) noexcept { switch (qualityLevel) { - case ColorGrading::QualityLevel::LOW: + case QualityLevel::LOW: mImpl->format = LutFormat::INTEGER; mImpl->dimension = 16; break; - case ColorGrading::QualityLevel::MEDIUM: + case QualityLevel::MEDIUM: mImpl->format = LutFormat::INTEGER; mImpl->dimension = 32; break; - case ColorGrading::QualityLevel::HIGH: + case QualityLevel::HIGH: mImpl->format = LutFormat::FLOAT; mImpl->dimension = 32; break; - case ColorGrading::QualityLevel::ULTRA: + case QualityLevel::ULTRA: mImpl->format = LutFormat::FLOAT; mImpl->dimension = 64; break; @@ -158,13 +160,13 @@ ColorGrading::Builder& ColorGrading::Builder::quality(ColorGrading::QualityLevel return *this; } -ColorGrading::Builder& ColorGrading::Builder::format(LutFormat format) noexcept { +ColorGrading::Builder& ColorGrading::Builder::format(LutFormat const format) noexcept { mImpl->format = format; return *this; } -ColorGrading::Builder& ColorGrading::Builder::dimensions(uint8_t dim) noexcept { - mImpl->dimension = math::clamp(+dim, 16, 64); +ColorGrading::Builder& ColorGrading::Builder::dimensions(uint8_t const dim) noexcept { + mImpl->dimension = clamp(+dim, 16, 64); return *this; } @@ -173,32 +175,32 @@ ColorGrading::Builder& ColorGrading::Builder::toneMapper(const ToneMapper* toneM return *this; } -ColorGrading::Builder& ColorGrading::Builder::toneMapping(ToneMapping toneMapping) noexcept { +ColorGrading::Builder& ColorGrading::Builder::toneMapping(ToneMapping const toneMapping) noexcept { mImpl->toneMapping = toneMapping; return *this; } -ColorGrading::Builder& ColorGrading::Builder::luminanceScaling(bool luminanceScaling) noexcept { +ColorGrading::Builder& ColorGrading::Builder::luminanceScaling(bool const luminanceScaling) noexcept { mImpl->luminanceScaling = luminanceScaling; return *this; } -ColorGrading::Builder& ColorGrading::Builder::gamutMapping(bool gamutMapping) noexcept { +ColorGrading::Builder& ColorGrading::Builder::gamutMapping(bool const gamutMapping) noexcept { mImpl->gamutMapping = gamutMapping; return *this; } -ColorGrading::Builder& ColorGrading::Builder::exposure(float exposure) noexcept { +ColorGrading::Builder& ColorGrading::Builder::exposure(float const exposure) noexcept { mImpl->exposure = exposure; return *this; } -ColorGrading::Builder& ColorGrading::Builder::nightAdaptation(float adaptation) noexcept { +ColorGrading::Builder& ColorGrading::Builder::nightAdaptation(float const adaptation) noexcept { mImpl->nightAdaptation = saturate(adaptation); return *this; } -ColorGrading::Builder& ColorGrading::Builder::whiteBalance(float temperature, float tint) noexcept { +ColorGrading::Builder& ColorGrading::Builder::whiteBalance(float const temperature, float const tint) noexcept { mImpl->whiteBalance = float2{ clamp(temperature, -1.0f, 1.0f), clamp(tint, -1.0f, 1.0f) @@ -237,17 +239,17 @@ ColorGrading::Builder& ColorGrading::Builder::slopeOffsetPower( return *this; } -ColorGrading::Builder& ColorGrading::Builder::contrast(float contrast) noexcept { +ColorGrading::Builder& ColorGrading::Builder::contrast(float const contrast) noexcept { mImpl->contrast = clamp(contrast, 0.0f, 2.0f); return *this; } -ColorGrading::Builder& ColorGrading::Builder::vibrance(float vibrance) noexcept { +ColorGrading::Builder& ColorGrading::Builder::vibrance(float const vibrance) noexcept { mImpl->vibrance = clamp(vibrance, 0.0f, 2.0f); return *this; } -ColorGrading::Builder& ColorGrading::Builder::saturation(float saturation) noexcept { +ColorGrading::Builder& ColorGrading::Builder::saturation(float const saturation) noexcept { mImpl->saturation = clamp(saturation, 0.0f, 2.0f); return *this; } @@ -314,7 +316,7 @@ ColorGrading* ColorGrading::Builder::build(Engine& engine) { //------------------------------------------------------------------------------ UTILS_ALWAYS_INLINE -inline float3 adjustExposure(float3 v, float exposure) { +inline float3 adjustExposure(float3 const v, float const exposure) { return v * std::exp2(exposure); } @@ -435,7 +437,7 @@ float3 scotopicAdaptation(float3 v, float nightAdaptation) noexcept { // the von Kries method, using the CIECAT16 transform. // See https://en.wikipedia.org/wiki/Chromatic_adaptation // See https://en.wikipedia.org/wiki/CIECAM02#Chromatic_adaptation -constexpr mat3f adaptationTransform(float2 whiteBalance) noexcept { +constexpr mat3f adaptationTransform(float2 const whiteBalance) noexcept { // See Mathematica notebook in docs/math/White Balance.nb float k = whiteBalance.x; // temperature float t = whiteBalance.y; // tint @@ -448,7 +450,7 @@ constexpr mat3f adaptationTransform(float2 whiteBalance) noexcept { } UTILS_ALWAYS_INLINE -inline float3 chromaticAdaptation(float3 v, mat3f adaptationTransform) { +inline float3 chromaticAdaptation(float3 const v, mat3f adaptationTransform) { return adaptationTransform * v; } @@ -497,7 +499,7 @@ inline float3 colorDecisionList(float3 v, float3 slope, float3 offset, float3 po } UTILS_ALWAYS_INLINE -inline constexpr float3 contrast(float3 v, float contrast) { +inline constexpr float3 contrast(float3 const v, float const contrast) { // Matches contrast as applied in DaVinci Resolve return MIDDLE_GRAY_ACEScct + contrast * (v - MIDDLE_GRAY_ACEScct); } @@ -571,21 +573,15 @@ static float3 luminanceScaling(float3 x, // Quality //------------------------------------------------------------------------------ -static void selectLutTextureParams(ColorGrading::LutFormat lutFormat, - TextureFormat& internalFormat, PixelDataFormat& format, PixelDataType& type) noexcept { +static std::tuple + selectLutTextureParams(ColorGrading::LutFormat const lutFormat) noexcept { // We use RGBA16F for high quality modes instead of RGB16F because RGB16F // is not supported everywhere switch (lutFormat) { case ColorGrading::LutFormat::INTEGER: - internalFormat = TextureFormat::RGB10_A2; - format = PixelDataFormat::RGBA; - type = PixelDataType::UINT_2_10_10_10_REV; - break; + return { TextureFormat::RGB10_A2, PixelDataFormat::RGBA, PixelDataType::UINT_2_10_10_10_REV }; case ColorGrading::LutFormat::FLOAT: - internalFormat = TextureFormat::RGBA16F; - format = PixelDataFormat::RGBA; - type = PixelDataType::HALF; - break; + return { TextureFormat::RGBA16F, PixelDataFormat::RGBA, PixelDataType::HALF }; } } @@ -596,21 +592,21 @@ static void selectLutTextureParams(ColorGrading::LutFormat lutFormat, // forces post-processing to be performed in sRGB to guarantee that the inverse tone // mapping function in the shaders will match the forward tone mapping step exactly. -static mat3f selectColorGradingTransformIn(ColorGrading::ToneMapping toneMapping) noexcept { +static mat3f selectColorGradingTransformIn(ColorGrading::ToneMapping const toneMapping) noexcept { if (toneMapping == ColorGrading::ToneMapping::FILMIC) { return mat3f{}; } return sRGB_to_Rec2020; } -static mat3f selectColorGradingTransformOut(ColorGrading::ToneMapping toneMapping) noexcept { +static mat3f selectColorGradingTransformOut(ColorGrading::ToneMapping const toneMapping) noexcept { if (toneMapping == ColorGrading::ToneMapping::FILMIC) { return mat3f{}; } return Rec2020_to_sRGB; } -static float3 selectColorGradingLuminance(ColorGrading::ToneMapping toneMapping) noexcept { +static float3 selectColorGradingLuminance(ColorGrading::ToneMapping const toneMapping) noexcept { if (toneMapping == ColorGrading::ToneMapping::FILMIC) { return LUMINANCE_Rec709; } @@ -653,9 +649,9 @@ FColorGrading::FColorGrading(FEngine& engine, const Builder& builder) { Config c; // This lock protects the data inside Config, which is written to by the Filament thread, // and read from multiple Job threads. - utils::SpinLock configLock; + Mutex configLock; { - std::lock_guard lock(configLock); + std::lock_guard const lock(configLock); c.lutDimension = builder->dimension; c.adaptationTransform = adaptationTransform(builder->whiteBalance); c.colorGradingIn = selectColorGradingTransformIn(builder->toneMapping); @@ -670,10 +666,8 @@ FColorGrading::FColorGrading(FEngine& engine, const Builder& builder) { size_t elementSize = sizeof(half4); void* data = malloc(lutElementCount * elementSize); - TextureFormat textureFormat; - PixelDataFormat format; - PixelDataType type; - selectLutTextureParams(builder->format, textureFormat, format, type); + auto [textureFormat, format, type] = selectLutTextureParams(builder->format); + assert_invariant(FTexture::isTextureFormatSupported(engine, textureFormat)); assert_invariant(FTexture::validatePixelFormatAndType(textureFormat, format, type)); void* converted = nullptr; @@ -694,7 +688,7 @@ FColorGrading::FColorGrading(FEngine& engine, const Builder& builder) { [data, converted, b, &c, &configLock, builder](JobSystem&, JobSystem::Job*) { Config config; { - std::lock_guard lock(configLock); + std::lock_guard lock(configLock); config = c; } half4* UTILS_RESTRICT p = (half4*) data + b * config.lutDimension * config.lutDimension; diff --git a/filament/src/details/DebugRegistry.cpp b/filament/src/details/DebugRegistry.cpp index 58363dac250..9bd24f83866 100644 --- a/filament/src/details/DebugRegistry.cpp +++ b/filament/src/details/DebugRegistry.cpp @@ -16,15 +16,17 @@ #include "details/DebugRegistry.h" +#include +#include +#include + #include #include #include -#ifndef NDEBUG -# define DEBUG_PROPERTIES_WRITABLE true -#else -# define DEBUG_PROPERTIES_WRITABLE false -#endif +#include +#include +#include using namespace filament::math; using namespace utils; @@ -33,35 +35,53 @@ namespace filament { FDebugRegistry::FDebugRegistry() noexcept = default; -UTILS_NOINLINE -void* FDebugRegistry::getPropertyAddress(const char* name) noexcept { - std::string_view key{ name }; +auto FDebugRegistry::getPropertyInfo(const char* name) noexcept -> PropertyInfo { + std::string_view const key{ name }; auto& propertyMap = mPropertyMap; if (propertyMap.find(key) == propertyMap.end()) { - return nullptr; + return { nullptr, {} }; } return propertyMap[key]; } -void FDebugRegistry::registerProperty(std::string_view name, void* p, Type type) noexcept { +UTILS_NOINLINE +void* FDebugRegistry::getPropertyAddress(const char* name) { + auto info = getPropertyInfo(name); + ASSERT_PRECONDITION_NON_FATAL(!info.second, + "don't use DebugRegistry::getPropertyAddress() when a callback is set. " + "Use setProperty() instead."); + return info.first; +} + +UTILS_NOINLINE +void const* FDebugRegistry::getPropertyAddress(const char* name) const noexcept { + auto info = const_cast(this)->getPropertyInfo(name); + return info.first; +} + +void FDebugRegistry::registerProperty(std::string_view const name, void* p, Type, + std::function fn) noexcept { auto& propertyMap = mPropertyMap; if (propertyMap.find(name) == propertyMap.end()) { - propertyMap[name] = p; + propertyMap[name] = { p, std::move(fn) }; } } bool FDebugRegistry::hasProperty(const char* name) const noexcept { - return const_cast(this)->getPropertyAddress(name) != nullptr; + return getPropertyAddress(name) != nullptr; } template bool FDebugRegistry::setProperty(const char* name, T v) noexcept { - if constexpr (DEBUG_PROPERTIES_WRITABLE) { - T* const addr = static_cast(getPropertyAddress(name)); - if (addr) { - *addr = v; - return true; + auto info = getPropertyInfo(name); + T* const addr = static_cast(info.first); + if (addr) { + auto old = *addr; + *addr = v; + if (info.second && old != v) { + info.second(); } + return true; } return false; } @@ -75,8 +95,7 @@ template bool FDebugRegistry::setProperty(const char* name, float4 v) no template bool FDebugRegistry::getProperty(const char* name, T* p) const noexcept { - FDebugRegistry* const pRegistry = const_cast(this); - T const* const addr = static_cast(pRegistry->getPropertyAddress(name)); + T const* const addr = static_cast(getPropertyAddress(name)); if (addr) { *p = *addr; return true; @@ -91,20 +110,46 @@ template bool FDebugRegistry::getProperty(const char* name, float2* v) c template bool FDebugRegistry::getProperty(const char* name, float3* v) const noexcept; template bool FDebugRegistry::getProperty(const char* name, float4* v) const noexcept; -void FDebugRegistry::registerDataSource(std::string_view name, - void const* data, size_t count) noexcept { +bool FDebugRegistry::registerDataSource(std::string_view const name, + void const* data, size_t const count) noexcept { auto& dataSourceMap = mDataSourceMap; - if (dataSourceMap.find(name) == dataSourceMap.end()) { + bool const found = dataSourceMap.find(name) == dataSourceMap.end(); + if (found) { dataSourceMap[name] = { data, count }; } + return found; +} + +bool FDebugRegistry::registerDataSource(std::string_view const name, + Invocable&& creator) noexcept { + auto& dataSourceCreatorMap = mDataSourceCreatorMap; + bool const found = dataSourceCreatorMap.find(name) == dataSourceCreatorMap.end(); + if (found) { + dataSourceCreatorMap[name] = std::move(creator); + } + return found; } +void FDebugRegistry::unregisterDataSource(std::string_view const name) noexcept { + mDataSourceCreatorMap.erase(name); + mDataSourceMap.erase(name); +} + + DebugRegistry::DataSource FDebugRegistry::getDataSource(const char* name) const noexcept { - std::string_view key{ name }; + std::string_view const key{ name }; auto& dataSourceMap = mDataSourceMap; auto const& it = dataSourceMap.find(key); - if (it == dataSourceMap.end()) { - return { nullptr, 0u }; + if (UTILS_UNLIKELY(it == dataSourceMap.end())) { + auto& dataSourceCreatorMap = mDataSourceCreatorMap; + auto const& pos = dataSourceCreatorMap.find(key); + if (pos == dataSourceCreatorMap.end()) { + return { nullptr, 0u }; + } + DataSource dataSource{ pos->second() }; + dataSourceMap[key] = dataSource; + dataSourceCreatorMap.erase(pos); + return dataSource; } return it->second; } diff --git a/filament/src/details/DebugRegistry.h b/filament/src/details/DebugRegistry.h index d2d1fd2195d..53d04255cec 100644 --- a/filament/src/details/DebugRegistry.h +++ b/filament/src/details/DebugRegistry.h @@ -22,9 +22,16 @@ #include #include +#include +#include + +#include #include #include +#include + +#include namespace filament { @@ -32,33 +39,75 @@ class FEngine; class FDebugRegistry : public DebugRegistry { public: + enum Type { + BOOL, INT, FLOAT, FLOAT2, FLOAT3, FLOAT4 + }; + FDebugRegistry() noexcept; - void registerProperty(std::string_view name, bool* p) noexcept { + void registerProperty(std::string_view const name, bool* p) noexcept { registerProperty(name, p, BOOL); } - void registerProperty(std::string_view name, int* p) noexcept { + void registerProperty(std::string_view const name, int* p) noexcept { registerProperty(name, p, INT); } - void registerProperty(std::string_view name, float* p) noexcept { + void registerProperty(std::string_view const name, float* p) noexcept { registerProperty(name, p, FLOAT); } - void registerProperty(std::string_view name, math::float2* p) noexcept { + void registerProperty(std::string_view const name, math::float2* p) noexcept { registerProperty(name, p, FLOAT2); } - void registerProperty(std::string_view name, math::float3* p) noexcept { + void registerProperty(std::string_view const name, math::float3* p) noexcept { registerProperty(name, p, FLOAT3); } - void registerProperty(std::string_view name, math::float4* p) noexcept { + void registerProperty(std::string_view const name, math::float4* p) noexcept { registerProperty(name, p, FLOAT4); } - void registerDataSource(std::string_view name, void const* data, size_t count) noexcept; + + void registerProperty(std::string_view const name, bool* p, + std::function fn) noexcept { + registerProperty(name, p, BOOL, std::move(fn)); + } + + void registerProperty(std::string_view const name, int* p, + std::function fn) noexcept { + registerProperty(name, p, INT, std::move(fn)); + } + + void registerProperty(std::string_view const name, float* p, + std::function fn) noexcept { + registerProperty(name, p, FLOAT, std::move(fn)); + } + + void registerProperty(std::string_view const name, math::float2* p, + std::function fn) noexcept { + registerProperty(name, p, FLOAT2, std::move(fn)); + } + + void registerProperty(std::string_view const name, math::float3* p, + std::function fn) noexcept { + registerProperty(name, p, FLOAT3, std::move(fn)); + } + + void registerProperty(std::string_view const name, math::float4* p, + std::function fn) noexcept { + registerProperty(name, p, FLOAT4, std::move(fn)); + } + + // registers a DataSource directly + bool registerDataSource(std::string_view name, void const* data, size_t count) noexcept; + + // registers a DataSource lazily + bool registerDataSource(std::string_view name, + utils::Invocable&& creator) noexcept; + + void unregisterDataSource(std::string_view name) noexcept; #if !defined(_MSC_VER) private: @@ -67,13 +116,17 @@ class FDebugRegistry : public DebugRegistry { template bool setProperty(const char* name, T v) noexcept; private: + using PropertyInfo = std::pair>; friend class DebugRegistry; - void registerProperty(std::string_view name, void* p, Type type) noexcept; + void registerProperty(std::string_view name, void* p, Type type, std::function fn = {}) noexcept; bool hasProperty(const char* name) const noexcept; - void* getPropertyAddress(const char* name) noexcept; + PropertyInfo getPropertyInfo(const char* name) noexcept; + void* getPropertyAddress(const char* name); + void const* getPropertyAddress(const char* name) const noexcept; DataSource getDataSource(const char* name) const noexcept; - std::unordered_map mPropertyMap; - std::unordered_map mDataSourceMap; + std::unordered_map mPropertyMap; + mutable std::unordered_map mDataSourceMap; + mutable std::unordered_map> mDataSourceCreatorMap; }; FILAMENT_DOWNCAST(DebugRegistry) diff --git a/filament/src/details/Engine.cpp b/filament/src/details/Engine.cpp index fa5009d1474..1cc9a951be1 100644 --- a/filament/src/details/Engine.cpp +++ b/filament/src/details/Engine.cpp @@ -36,23 +36,37 @@ #include "details/VertexBuffer.h" #include "details/View.h" -#include - +#include #include +#include +#include + #include #include #include #include +#include #include #include +#include #include #include #include +#include #include +#include +#include +#include +#include +#include + +#include +#include +#include #include "generated/resources/materials.h" @@ -64,13 +78,23 @@ namespace filament { using namespace backend; using namespace filaflat; -FEngine* FEngine::create(Backend backend, Platform* platform, - void* sharedGLContext, const Config *pConfig) { +struct Engine::BuilderDetails { + Backend mBackend = Backend::DEFAULT; + Platform* mPlatform = nullptr; + Config mConfig; + FeatureLevel mFeatureLevel = FeatureLevel::FEATURE_LEVEL_1; + void* mSharedContext = nullptr; + bool mPaused = false; + std::unordered_map mFeatureFlags; + + static Config validateConfig(Config config) noexcept; +}; + +Engine* FEngine::create(Builder const& builder) { SYSTRACE_ENABLE(); SYSTRACE_CALL(); - const Config config{ validateConfig(pConfig) }; - FEngine* instance = new FEngine(backend, platform, config, sharedGLContext); + FEngine* instance = new FEngine(builder); // initialize all fields that need an instance of FEngine // (this cannot be done safely in the ctor) @@ -78,6 +102,9 @@ FEngine* FEngine::create(Backend backend, Platform* platform, // Normally we launch a thread and create the context and Driver from there (see FEngine::loop). // In the single-threaded case, we do so in the here and now. if (!UTILS_HAS_THREADING) { + Platform* platform = builder->mPlatform; + void* const sharedContext = builder->mSharedContext; + if (platform == nullptr) { platform = PlatformFactory::create(&instance->mBackend); instance->mPlatform = platform; @@ -88,8 +115,16 @@ FEngine* FEngine::create(Backend backend, Platform* platform, delete instance; return nullptr; } - DriverConfig driverConfig{ .handleArenaSize = instance->getRequestedDriverHandleArenaSize() }; - instance->mDriver = platform->createDriver(sharedGLContext, driverConfig); + DriverConfig const driverConfig{ + .handleArenaSize = instance->getRequestedDriverHandleArenaSize(), + .metalUploadBufferSizeBytes = instance->getConfig().metalUploadBufferSizeBytes, + .disableParallelShaderCompile = instance->features.backend.disable_parallel_shader_compile, + .disableHandleUseAfterFreeCheck = instance->features.backend.disable_handle_use_after_free_check, + .forceGLES2Context = instance->getConfig().forceGLES2Context, + .stereoscopicType = instance->getConfig().stereoscopicType, + .assertNativeWindowIsValid = instance->features.backend.opengl.assert_native_window_is_valid, + }; + instance->mDriver = platform->createDriver(sharedContext, driverConfig); } else { // start the driver thread @@ -118,20 +153,19 @@ FEngine* FEngine::create(Backend backend, Platform* platform, #if UTILS_HAS_THREADING -void FEngine::createAsync(CreateCallback callback, void* user, - Backend backend, Platform* platform, void* sharedGLContext, const Config* config) { +void FEngine::create(Builder const& builder, Invocable&& callback) { SYSTRACE_ENABLE(); SYSTRACE_CALL(); - Config validConfig = validateConfig(config); - FEngine* instance = new FEngine(backend, platform, validConfig, sharedGLContext); + + FEngine* instance = new FEngine(builder); // start the driver thread instance->mDriverThread = std::thread(&FEngine::loop, instance); // launch a thread to call the callback -- so it can't do any damage. - std::thread callbackThread = std::thread([instance, callback, user]() { + std::thread callbackThread = std::thread([instance, callback = std::move(callback)]() { instance->mDriverBarrier.await(); - callback(user, instance); + callback(instance); }); // let the callback thread die on its own @@ -142,11 +176,10 @@ FEngine* FEngine::getEngine(void* token) { FEngine* instance = static_cast(token); - ASSERT_PRECONDITION(ThreadUtils::isThisThread(instance->mMainThreadId), - "Engine::createAsync() and Engine::getEngine() must be called on the same thread."); + FILAMENT_CHECK_PRECONDITION(ThreadUtils::isThisThread(instance->mMainThreadId)) + << "Engine::createAsync() and Engine::getEngine() must be called on the same thread."; - // we use mResourceAllocator as a proxy for "am I already initialized" - if (!instance->mResourceAllocator) { + if (!instance->mInitialized) { if (UTILS_UNLIKELY(!instance->mDriver)) { // something went horribly wrong during driver initialization instance->mDriverThread.join(); @@ -163,48 +196,6 @@ FEngine* FEngine::getEngine(void* token) { #endif -Engine::Config FEngine::validateConfig(const Config* const pConfig) noexcept -{ - // Rule of thumb: perRenderPassArenaMB must be roughly 1 MB larger than perFrameCommandsMB - constexpr uint32_t COMMAND_ARENA_OVERHEAD = 1; - constexpr uint32_t CONCURRENT_FRAME_COUNT = 3; - - Config config; - if (!pConfig) { - return config; - } - - // make sure to copy all the fields - config = *pConfig; - - // Use at least the defaults set by the build system - config.minCommandBufferSizeMB = std::max( - config.minCommandBufferSizeMB, - (uint32_t)FILAMENT_MIN_COMMAND_BUFFERS_SIZE_IN_MB); - - config.perFrameCommandsSizeMB = std::max( - config.perFrameCommandsSizeMB, - (uint32_t)FILAMENT_PER_FRAME_COMMANDS_SIZE_IN_MB); - - config.perRenderPassArenaSizeMB = std::max( - config.perRenderPassArenaSizeMB, - (uint32_t)FILAMENT_PER_RENDER_PASS_ARENA_SIZE_IN_MB); - - config.commandBufferSizeMB = std::max( - config.commandBufferSizeMB, - config.minCommandBufferSizeMB * CONCURRENT_FRAME_COUNT); - - // Enforce pre-render-pass arena rule-of-thumb - config.perRenderPassArenaSizeMB = std::max( - config.perRenderPassArenaSizeMB, - config.perFrameCommandsSizeMB + COMMAND_ARENA_OVERHEAD); - - // This value gets validated during driver creation, so pass it through - config.driverHandleArenaSizeMB = config.driverHandleArenaSizeMB; - - return config; -} - // these must be static because only a pointer is copied to the render stream // Note that these coordinates are specified in OpenGL clip space. Other backends can transform // these in the vertex shader as needed. @@ -217,26 +208,59 @@ static constexpr float4 sFullScreenTriangleVertices[3] = { // these must be static because only a pointer is copied to the render stream static const uint16_t sFullScreenTriangleIndices[3] = { 0, 1, 2 }; -FEngine::FEngine(Backend backend, Platform* platform, const Config& config, void* sharedGLContext) : - mBackend(backend), - mPlatform(platform), - mSharedGLContext(sharedGLContext), +FEngine::FEngine(Builder const& builder) : + mBackend(builder->mBackend), + mActiveFeatureLevel(builder->mFeatureLevel), + mPlatform(builder->mPlatform), + mSharedGLContext(builder->mSharedContext), mPostProcessManager(*this), mEntityManager(EntityManager::get()), mRenderableManager(*this), mTransformManager(), mLightManager(*this), mCameraManager(*this), - mCommandBufferQueue(config.minCommandBufferSizeMB * MiB, config.commandBufferSizeMB * MiB), - mPerRenderPassAllocator("FEngine::mPerRenderPassAllocator", config.perRenderPassArenaSizeMB * MiB), + mCommandBufferQueue( + builder->mConfig.minCommandBufferSizeMB * MiB, + builder->mConfig.commandBufferSizeMB * MiB, + builder->mPaused), + mPerRenderPassArena( + "FEngine::mPerRenderPassAllocator", + builder->mConfig.perRenderPassArenaSizeMB * MiB), mHeapAllocator("FEngine::mHeapAllocator", AreaPolicy::NullArea{}), - mJobSystem(getJobSystemThreadPoolSize()), + mJobSystem(getJobSystemThreadPoolSize(builder->mConfig)), mEngineEpoch(std::chrono::steady_clock::now()), mDriverBarrier(1), mMainThreadId(ThreadUtils::getThreadId()), - mConfig(config) + mConfig(builder->mConfig) { - // we're assuming we're on the main thread here. + // update a feature flag from Engine::Config if the flag is not specified in the Builder + auto const featureFlagsBackwardCompatibility = + [this, &builder](std::string_view const name, bool const value) { + if (builder->mFeatureFlags.find(name) == builder->mFeatureFlags.end()) { + auto* const p = getFeatureFlagPtr(name, true); + if (p) { + *p = value; + } + } + }; + + // update all the features flags specified in the builder + for (auto const& feature : builder->mFeatureFlags) { + auto* const p = getFeatureFlagPtr(feature.first, true); + if (p) { + *p = feature.second; + } + } + + // update "old" feature flags that were specified in Engine::Config + featureFlagsBackwardCompatibility("backend.disable_parallel_shader_compile", + mConfig.disableParallelShaderCompile); + featureFlagsBackwardCompatibility("backend.disable_handle_use_after_free_check", + mConfig.disableHandleUseAfterFreeCheck); + featureFlagsBackwardCompatibility("backend.opengl.assert_native_window_is_valid", + mConfig.assertNativeWindowIsValid); + + // We're assuming we're on the main thread here. // (it may not be the case) mJobSystem.adopt(); @@ -244,7 +268,11 @@ FEngine::FEngine(Backend backend, Platform* platform, const Config& config, void << "(threading is " << (UTILS_HAS_THREADING ? "enabled)" : "disabled)") << io::endl; } -uint32_t FEngine::getJobSystemThreadPoolSize() noexcept { +uint32_t FEngine::getJobSystemThreadPoolSize(Config const& config) noexcept { + if (config.jobSystemThreadCount > 0) { + return config.jobSystemThreadCount; + } + // 1 thread for the user, 1 thread for the backend int threadCount = (int)std::thread::hardware_concurrency() - 2; // make sure we have at least 1 thread though @@ -266,14 +294,22 @@ void FEngine::init() { DriverApi& driverApi = getDriverApi(); - slog.i << "FEngine feature level: " << int(driverApi.getFeatureLevel()) << io::endl; + mActiveFeatureLevel = std::min(mActiveFeatureLevel, driverApi.getFeatureLevel()); + +#ifndef FILAMENT_ENABLE_FEATURE_LEVEL_0 + assert_invariant(mActiveFeatureLevel > FeatureLevel::FEATURE_LEVEL_0); +#endif + + slog.i << "Backend feature level: " << int(driverApi.getFeatureLevel()) << io::endl; + slog.i << "FEngine feature level: " << int(mActiveFeatureLevel) << io::endl; + - mResourceAllocator = new ResourceAllocator(driverApi); + mResourceAllocatorDisposer = std::make_shared(driverApi); mFullScreenTriangleVb = downcast(VertexBuffer::Builder() .vertexCount(3) .bufferCount(1) - .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT4, 0) + .attribute(POSITION, 0, VertexBuffer::AttributeType::FLOAT4, 0) .build(*this)); mFullScreenTriangleVb->setBufferAt(*this, 0, @@ -289,7 +325,7 @@ void FEngine::init() { mFullScreenTriangleRph = driverApi.createRenderPrimitive( mFullScreenTriangleVb->getHwHandle(), mFullScreenTriangleIb->getHwHandle(), - PrimitiveType::TRIANGLES, 0, 0, 2, (uint32_t)mFullScreenTriangleIb->getIndexCount()); + PrimitiveType::TRIANGLES); // Compute a clip-space [-1 to 1] to texture space [0 to 1] matrix, taking into account // backend differences. @@ -310,79 +346,150 @@ void FEngine::init() { }); } + // initialize the dummy textures so that their contents are not undefined + static const uint32_t zeroes[6] = {0}; + static const uint32_t ones = 0xffffffff; + mDefaultIblTexture = downcast(Texture::Builder() .width(1).height(1).levels(1) .format(Texture::InternalFormat::RGBA8) .sampler(Texture::Sampler::SAMPLER_CUBEMAP) .build(*this)); + driverApi.update3DImage(mDefaultIblTexture->getHwHandle(), 0, 0, 0, 0, 1, 1, 6, + { zeroes, sizeof(zeroes), Texture::Format::RGBA, Texture::Type::UBYTE }); + // 3 bands = 9 float3 const float sh[9 * 3] = { 0.0f }; mDefaultIbl = downcast(IndirectLight::Builder() .irradiance(3, reinterpret_cast(sh)) .build(*this)); - mDefaultColorGrading = downcast(ColorGrading::Builder().build(*this)); - - // Always initialize the default material, most materials' depth shaders fallback on it. - mDefaultMaterial = downcast( - FMaterial::DefaultMaterialBuilder() - .package(MATERIALS_DEFAULTMATERIAL_DATA, MATERIALS_DEFAULTMATERIAL_SIZE) - .build(*const_cast(this))); - - // Create a dummy morph target buffer. - mDummyMorphTargetBuffer = createMorphTargetBuffer(FMorphTargetBuffer::EmptyMorphTargetBuilder()); + mDefaultRenderTarget = driverApi.createDefaultRenderTarget(); - float3 dummyPositions[1] = {}; - short4 dummyTangents[1] = {}; - mDummyMorphTargetBuffer->setPositionsAt(*this, 0, dummyPositions, 1, 0); - mDummyMorphTargetBuffer->setTangentsAt(*this, 0, dummyTangents, 1, 0); + // Create a dummy morph target buffer, without using the builder + mDummyMorphTargetBuffer = createMorphTargetBuffer( + FMorphTargetBuffer::EmptyMorphTargetBuilder()); // create dummy textures we need throughout the engine - mDummyOneTexture = driverApi.createTexture(SamplerType::SAMPLER_2D, 1, TextureFormat::RGBA8, 1, 1, 1, 1, TextureUsage::DEFAULT); - mDummyOneTextureArray = driverApi.createTexture(SamplerType::SAMPLER_2D_ARRAY, 1, - TextureFormat::RGBA8, 1, 1, 1, 1, TextureUsage::DEFAULT); - - mDummyZeroTextureArray = driverApi.createTexture(SamplerType::SAMPLER_2D_ARRAY, 1, - TextureFormat::RGBA8, 1, 1, 1, 1, TextureUsage::DEFAULT); - mDummyZeroTexture = driverApi.createTexture(SamplerType::SAMPLER_2D, 1, TextureFormat::RGBA8, 1, 1, 1, 1, TextureUsage::DEFAULT); + driverApi.update3DImage(mDummyOneTexture, 0, 0, 0, 0, 1, 1, 1, + { &ones, 4, Texture::Format::RGBA, Texture::Type::UBYTE }); - // initialize the dummy textures so that their contents are not undefined + driverApi.update3DImage(mDummyZeroTexture, 0, 0, 0, 0, 1, 1, 1, + { zeroes, 4, Texture::Format::RGBA, Texture::Type::UBYTE }); - static const uint32_t zeroes[6] = {0}; - static const uint32_t ones = 0xffffffff; - driverApi.update3DImage(mDefaultIblTexture->getHwHandle(), 0, 0, 0, 0, 1, 1, 6, - { zeroes, sizeof(zeroes), Texture::Format::RGBA, Texture::Type::UBYTE }); + mPerViewDescriptorSetLayoutSsrVariant = { + mHwDescriptorSetLayoutFactory, + driverApi, + descriptor_sets::getSsrVariantLayout() }; + + mPerViewDescriptorSetLayoutDepthVariant = { + mHwDescriptorSetLayoutFactory, + driverApi, + descriptor_sets::getDepthVariantLayout() }; + + mPerRenderableDescriptorSetLayout = { + mHwDescriptorSetLayoutFactory, + driverApi, + descriptor_sets::getPerRenderableLayout() }; + +#ifdef FILAMENT_ENABLE_FEATURE_LEVEL_0 + if (UTILS_UNLIKELY(mActiveFeatureLevel == FeatureLevel::FEATURE_LEVEL_0)) { + FMaterial::DefaultMaterialBuilder defaultMaterialBuilder; + defaultMaterialBuilder.package( + MATERIALS_DEFAULTMATERIAL_FL0_DATA, MATERIALS_DEFAULTMATERIAL_FL0_SIZE); + mDefaultMaterial = downcast(defaultMaterialBuilder.build(*const_cast(this))); + } else +#endif + { + mDefaultColorGrading = downcast(ColorGrading::Builder().build(*this)); + + FMaterial::DefaultMaterialBuilder defaultMaterialBuilder; + switch (mConfig.stereoscopicType) { + case StereoscopicType::NONE: + case StereoscopicType::INSTANCED: + defaultMaterialBuilder.package( + MATERIALS_DEFAULTMATERIAL_DATA, MATERIALS_DEFAULTMATERIAL_SIZE); + break; + case StereoscopicType::MULTIVIEW: +#ifdef FILAMENT_ENABLE_MULTIVIEW + defaultMaterialBuilder.package( + MATERIALS_DEFAULTMATERIAL_MULTIVIEW_DATA, MATERIALS_DEFAULTMATERIAL_MULTIVIEW_SIZE); +#else + assert_invariant(false); +#endif + break; + } + mDefaultMaterial = downcast(defaultMaterialBuilder.build(*const_cast(this))); - driverApi.update3DImage(mDummyOneTexture, 0, 0, 0, 0, 1, 1, 1, - { &ones, 4, Texture::Format::RGBA, Texture::Type::UBYTE }); + float3 dummyPositions[1] = {}; + short4 dummyTangents[1] = {}; + mDummyMorphTargetBuffer->setPositionsAt(*this, 0, dummyPositions, 1, 0); + mDummyMorphTargetBuffer->setTangentsAt(*this, 0, dummyTangents, 1, 0); - driverApi.update3DImage(mDummyOneTextureArray, 0, 0, 0, 0, 1, 1, 1, - { &ones, 4, Texture::Format::RGBA, Texture::Type::UBYTE }); + mDummyOneTextureArray = driverApi.createTexture(SamplerType::SAMPLER_2D_ARRAY, 1, + TextureFormat::RGBA8, 1, 1, 1, 1, TextureUsage::DEFAULT); - driverApi.update3DImage(mDummyZeroTexture, 0, 0, 0, 0, 1, 1, 1, - { zeroes, 4, Texture::Format::RGBA, Texture::Type::UBYTE }); + mDummyZeroTextureArray = driverApi.createTexture(SamplerType::SAMPLER_2D_ARRAY, 1, + TextureFormat::RGBA8, 1, 1, 1, 1, TextureUsage::DEFAULT); - driverApi.update3DImage(mDummyZeroTextureArray, 0, 0, 0, 0, 1, 1, 1, - { zeroes, 4, Texture::Format::RGBA, Texture::Type::UBYTE }); + driverApi.update3DImage(mDummyOneTextureArray, 0, 0, 0, 0, 1, 1, 1, + { &ones, 4, Texture::Format::RGBA, Texture::Type::UBYTE }); - mDefaultRenderTarget = driverApi.createDefaultRenderTarget(); + driverApi.update3DImage(mDummyZeroTextureArray, 0, 0, 0, 0, 1, 1, 1, + { zeroes, 4, Texture::Format::RGBA, Texture::Type::UBYTE }); + + mLightManager.init(*this); + mDFG.init(*this); + } mPostProcessManager.init(); - mLightManager.init(*this); - mDFG.init(*this); + + mDebugRegistry.registerProperty("d.shadowmap.debug_directional_shadowmap", + &debug.shadowmap.debug_directional_shadowmap, [this]() { + mMaterials.forEach([this](FMaterial* material) { + if (material->getMaterialDomain() == MaterialDomain::SURFACE) { + + material->setConstant( + +ReservedSpecializationConstants::CONFIG_DEBUG_DIRECTIONAL_SHADOWMAP, + debug.shadowmap.debug_directional_shadowmap); + + material->invalidate( + Variant::DIR | Variant::SRE | Variant::DEP, + Variant::DIR | Variant::SRE); + } + }); + }); + + mDebugRegistry.registerProperty("d.lighting.debug_froxel_visualization", + &debug.lighting.debug_froxel_visualization, [this]() { + mMaterials.forEach([this](FMaterial* material) { + if (material->getMaterialDomain() == MaterialDomain::SURFACE) { + + material->setConstant( + +ReservedSpecializationConstants::CONFIG_DEBUG_FROXEL_VISUALIZATION, + debug.lighting.debug_froxel_visualization); + + material->invalidate( + Variant::DYN | Variant::DEP, + Variant::DYN); + } + }); + }); + + mInitialized = true; } FEngine::~FEngine() noexcept { SYSTRACE_CALL(); - delete mResourceAllocator; + assert_invariant(!mResourceAllocatorDisposer); delete mDriver; if (mOwnPlatform) { PlatformFactory::destroy(&mPlatform); @@ -393,15 +500,15 @@ void FEngine::shutdown() { SYSTRACE_CALL(); // by construction this should never be nullptr - assert_invariant(mResourceAllocator); + assert_invariant(mResourceAllocatorDisposer); - ASSERT_PRECONDITION(ThreadUtils::isThisThread(mMainThreadId), - "Engine::shutdown() called from the wrong thread!"); + FILAMENT_CHECK_PRECONDITION(ThreadUtils::isThisThread(mMainThreadId)) + << "Engine::shutdown() called from the wrong thread!"; #ifndef NDEBUG // print out some statistics about this run - size_t wm = mCommandBufferQueue.getHighWatermark(); - size_t wmpct = wm / (getCommandBufferSize() / 100); + size_t const wm = mCommandBufferQueue.getHighWatermark(); + size_t const wmpct = wm / (getCommandBufferSize() / 100); slog.d << "CircularBuffer: High watermark " << wm / 1024 << " KiB (" << wmpct << "%)" << io::endl; #endif @@ -413,22 +520,42 @@ void FEngine::shutdown() { */ mPostProcessManager.terminate(driver); // free-up post-process manager resources - mResourceAllocator->terminate(); + mResourceAllocatorDisposer->terminate(); + mResourceAllocatorDisposer.reset(); mDFG.terminate(*this); // free-up the DFG mRenderableManager.terminate(); // free-up all renderables mLightManager.terminate(); // free-up all lights - mCameraManager.terminate(); // free-up all cameras + mCameraManager.terminate(*this); // free-up all cameras + + mPerViewDescriptorSetLayoutDepthVariant.terminate(mHwDescriptorSetLayoutFactory, driver); + mPerViewDescriptorSetLayoutSsrVariant.terminate(mHwDescriptorSetLayoutFactory, driver); + mPerRenderableDescriptorSetLayout.terminate(mHwDescriptorSetLayoutFactory, driver); + + driver.destroyRenderPrimitive(std::move(mFullScreenTriangleRph)); - driver.destroyRenderPrimitive(mFullScreenTriangleRph); destroy(mFullScreenTriangleIb); + mFullScreenTriangleIb = nullptr; + destroy(mFullScreenTriangleVb); + mFullScreenTriangleVb = nullptr; + destroy(mDummyMorphTargetBuffer); + mDummyMorphTargetBuffer = nullptr; + destroy(mDefaultIblTexture); + mDefaultIblTexture = nullptr; + destroy(mDefaultIbl); + mDefaultIbl = nullptr; destroy(mDefaultColorGrading); + mDefaultColorGrading = nullptr; destroy(mDefaultMaterial); + mDefaultMaterial = nullptr; + + destroy(mUnprotectedDummySwapchain); + mUnprotectedDummySwapchain = nullptr; /* * clean-up after the user -- we call terminate on each "leaked" object and clear each list. @@ -445,6 +572,7 @@ void FEngine::shutdown() { // this must be done after Skyboxes and before materials destroy(mSkyboxMaterial); + mSkyboxMaterial = nullptr; cleanupResourceList(std::move(mBufferObjects)); cleanupResourceList(std::move(mIndexBuffers)); @@ -454,18 +582,19 @@ void FEngine::shutdown() { cleanupResourceList(std::move(mTextures)); cleanupResourceList(std::move(mRenderTargets)); cleanupResourceList(std::move(mMaterials)); + cleanupResourceList(std::move(mInstanceBuffers)); for (auto& item : mMaterialInstances) { cleanupResourceList(std::move(item.second)); } cleanupResourceListLocked(mFenceListLock, std::move(mFences)); - driver.destroyTexture(mDummyOneTexture); - driver.destroyTexture(mDummyOneTextureArray); - driver.destroyTexture(mDummyZeroTexture); - driver.destroyTexture(mDummyZeroTextureArray); + driver.destroyTexture(std::move(mDummyOneTexture)); + driver.destroyTexture(std::move(mDummyOneTextureArray)); + driver.destroyTexture(std::move(mDummyZeroTexture)); + driver.destroyTexture(std::move(mDummyZeroTextureArray)); - driver.destroyRenderTarget(mDefaultRenderTarget); + driver.destroyRenderTarget(std::move(mDefaultRenderTarget)); /* * Shutdown the backend... @@ -483,7 +612,7 @@ void FEngine::shutdown() { getDriverApi().terminate(); } else { mDriverThread.join(); - + // Driver::terminate() has been called here. } // Finally, call user callbacks that might have been scheduled. @@ -505,8 +634,8 @@ void FEngine::prepare() { SYSTRACE_CALL(); // prepare() is called once per Renderer frame. Ideally we would upload the content of // UBOs that are visible only. It's not such a big issue because the actual upload() is - // skipped is the UBO hasn't changed. Still we could have a lot of these. - FEngine::DriverApi& driver = getDriverApi(); + // skipped if the UBO hasn't changed. Still we could have a lot of these. + DriverApi& driver = getDriverApi(); for (auto& materialInstanceList: mMaterialInstances) { materialInstanceList.second.forEach([&driver](FMaterialInstance* item) { @@ -514,12 +643,10 @@ void FEngine::prepare() { }); } - // Commit default material instances. - mMaterials.forEach([&driver](FMaterial* material) { + mMaterials.forEach([](FMaterial* material) { #if FILAMENT_ENABLE_MATDBG material->checkProgramEdits(); #endif - material->getDefaultInstance()->commit(driver); }); } @@ -529,7 +656,7 @@ void FEngine::gc() { mRenderableManager.gc(em); mLightManager.gc(em); mTransformManager.gc(em); - mCameraManager.gc(em); + mCameraManager.gc(*this, em); } void FEngine::flush() { @@ -538,12 +665,14 @@ void FEngine::flush() { } void FEngine::flushAndWait() { + FILAMENT_CHECK_PRECONDITION(!mCommandBufferQueue.isPaused()) + << "Cannot call flushAndWait() when rendering thread is paused!"; #if defined(__ANDROID__) // first make sure we've not terminated filament - ASSERT_PRECONDITION(!mCommandBufferQueue.isExitRequested(), - "calling Engine::flushAndWait() after Engine::shutdown()!"); + FILAMENT_CHECK_PRECONDITION(!mCommandBufferQueue.isExitRequested()) + << "calling Engine::flushAndWait() after Engine::shutdown()!"; #endif @@ -554,17 +683,17 @@ void FEngine::flushAndWait() { // then create a fence that will trigger when we're past the finish() above size_t tryCount = 8; - FFence* fence = FEngine::createFence(FFence::Type::SOFT); + FFence* fence = FEngine::createFence(); UTILS_NOUNROLL do { FenceStatus status = fence->wait(FFence::Mode::FLUSH,250000000u); // if the fence didn't trigger after 250ms, check that the command queue thread is still // running (otherwise indicating a precondition violation). if (UTILS_UNLIKELY(status == FenceStatus::TIMEOUT_EXPIRED)) { - ASSERT_PRECONDITION(!mCommandBufferQueue.isExitRequested(), - "called Engine::shutdown() WHILE in Engine::flushAndWait()!"); + FILAMENT_CHECK_PRECONDITION(!mCommandBufferQueue.isExitRequested()) + << "called Engine::shutdown() WHILE in Engine::flushAndWait()!"; tryCount--; - ASSERT_POSTCONDITION(tryCount, "flushAndWait() failed inexplicably after 2s"); + FILAMENT_CHECK_POSTCONDITION(tryCount) << "flushAndWait() failed inexplicably after 2s"; // if the thread is still running, maybe we just need to give it more time continue; } @@ -574,8 +703,7 @@ void FEngine::flushAndWait() { #else - FFence::waitAndDestroy( - FEngine::createFence(FFence::Type::SOFT), FFence::Mode::FLUSH); + FFence::waitAndDestroy(createFence(), FFence::Mode::FLUSH); #endif @@ -625,7 +753,15 @@ int FEngine::loop() { JobSystem::setThreadName("FEngine::loop"); JobSystem::setThreadPriority(JobSystem::Priority::DISPLAY); - DriverConfig driverConfig { .handleArenaSize = getRequestedDriverHandleArenaSize() }; + DriverConfig const driverConfig { + .handleArenaSize = getRequestedDriverHandleArenaSize(), + .metalUploadBufferSizeBytes = mConfig.metalUploadBufferSizeBytes, + .disableParallelShaderCompile = features.backend.disable_parallel_shader_compile, + .disableHandleUseAfterFreeCheck = features.backend.disable_handle_use_after_free_check, + .forceGLES2Context = mConfig.forceGLES2Context, + .stereoscopicType = mConfig.stereoscopicType, + .assertNativeWindowIsValid = features.backend.opengl.assert_native_window_is_valid, + }; mDriver = mPlatform->createDriver(mSharedGLContext, driverConfig); mDriverBarrier.latch(); @@ -635,15 +771,7 @@ int FEngine::loop() { return 0; } - // We use the highest affinity bit, assuming this is a Big core in a big.little - // configuration. This is also a core not used by the JobSystem. - // Either way the main reason to do this is to avoid this thread jumping from core to core - // and lose its caches in the process. - uint32_t id = std::thread::hardware_concurrency() - 1; - while (true) { - // looks like thread affinity needs to be reset regularly (on Android) - JobSystem::setThreadAffinityById(id); if (!execute()) { break; } @@ -676,10 +804,13 @@ const FMaterial* FEngine::getSkyboxMaterial() const noexcept { * Object created from a Builder */ -template -inline T* FEngine::create(ResourceList& list, typename T::Builder const& builder) noexcept { - T* p = mHeapAllocator.make(*this, builder); - list.insert(p); +template +inline T* FEngine::create(ResourceList& list, + typename T::Builder const& builder, ARGS&& ... args) noexcept { + T* p = mHeapAllocator.make(*this, builder, std::forward(args)...); + if (UTILS_LIKELY(p)) { + list.insert(p); + } return p; } @@ -703,6 +834,10 @@ FMorphTargetBuffer* FEngine::createMorphTargetBuffer(const MorphTargetBuffer::Bu return create(mMorphTargetBuffers, builder); } +FInstanceBuffer* FEngine::createInstanceBuffer(const InstanceBuffer::Builder& builder) noexcept { + return create(mInstanceBuffers, builder); +} + FTexture* FEngine::createTexture(const Texture::Builder& builder) noexcept { return create(mTextures, builder); } @@ -711,8 +846,9 @@ FIndirectLight* FEngine::createIndirectLight(const IndirectLight::Builder& build return create(mIndirectLights, builder); } -FMaterial* FEngine::createMaterial(const Material::Builder& builder) noexcept { - return create(mMaterials, builder); +FMaterial* FEngine::createMaterial(const Material::Builder& builder, + std::unique_ptr materialParser) noexcept { + return create(mMaterials, builder, std::move(materialParser)); } FSkybox* FEngine::createSkybox(const Skybox::Builder& builder) noexcept { @@ -737,7 +873,7 @@ FRenderTarget* FEngine::createRenderTarget(const RenderTarget::Builder& builder) FRenderer* FEngine::createRenderer() noexcept { FRenderer* p = mHeapAllocator.make(*this); - if (p) { + if (UTILS_LIKELY(p)) { mRenderers.insert(p); } return p; @@ -746,7 +882,17 @@ FRenderer* FEngine::createRenderer() noexcept { FMaterialInstance* FEngine::createMaterialInstance(const FMaterial* material, const FMaterialInstance* other, const char* name) noexcept { FMaterialInstance* p = mHeapAllocator.make(*this, other, name); - if (p) { + if (UTILS_LIKELY(p)) { + auto pos = mMaterialInstances.emplace(material, "MaterialInstance"); + pos.first->second.insert(p); + } + return p; +} + +FMaterialInstance* FEngine::createMaterialInstance(const FMaterial* material, + const char* name) noexcept { + FMaterialInstance* p = mHeapAllocator.make(*this, material, name); + if (UTILS_LIKELY(p)) { auto pos = mMaterialInstances.emplace(material, "MaterialInstance"); pos.first->second.insert(p); } @@ -759,7 +905,7 @@ FMaterialInstance* FEngine::createMaterialInstance(const FMaterial* material, FScene* FEngine::createScene() noexcept { FScene* p = mHeapAllocator.make(*this); - if (p) { + if (UTILS_LIKELY(p)) { mScenes.insert(p); } return p; @@ -767,16 +913,16 @@ FScene* FEngine::createScene() noexcept { FView* FEngine::createView() noexcept { FView* p = mHeapAllocator.make(*this); - if (p) { + if (UTILS_LIKELY(p)) { mViews.insert(p); } return p; } -FFence* FEngine::createFence(FFence::Type type) noexcept { - FFence* p = mHeapAllocator.make(*this, type); - if (p) { - std::lock_guard guard(mFenceListLock); +FFence* FEngine::createFence() noexcept { + FFence* p = mHeapAllocator.make(*this); + if (UTILS_LIKELY(p)) { + std::lock_guard const guard(mFenceListLock); mFences.insert(p); } return p; @@ -791,7 +937,7 @@ FSwapChain* FEngine::createSwapChain(void* nativeWindow, uint64_t flags) noexcep getDriverApi().setupExternalImage(nativeWindow); } FSwapChain* p = mHeapAllocator.make(*this, nativeWindow, flags); - if (p) { + if (UTILS_LIKELY(p)) { mSwapChains.insert(p); } return p; @@ -799,7 +945,7 @@ FSwapChain* FEngine::createSwapChain(void* nativeWindow, uint64_t flags) noexcep FSwapChain* FEngine::createSwapChain(uint32_t width, uint32_t height, uint64_t flags) noexcept { FSwapChain* p = mHeapAllocator.make(*this, width, height, flags); - if (p) { + if (UTILS_LIKELY(p)) { mSwapChains.insert(p); } return p; @@ -810,21 +956,21 @@ FSwapChain* FEngine::createSwapChain(uint32_t width, uint32_t height, uint64_t f */ -FCamera* FEngine::createCamera(Entity entity) noexcept { - return mCameraManager.create(entity); +FCamera* FEngine::createCamera(Entity const entity) noexcept { + return mCameraManager.create(*this, entity); } -FCamera* FEngine::getCameraComponent(Entity entity) noexcept { +FCamera* FEngine::getCameraComponent(Entity const entity) noexcept { auto ci = mCameraManager.getInstance(entity); return ci ? mCameraManager.getCamera(ci) : nullptr; } -void FEngine::destroyCameraComponent(utils::Entity entity) noexcept { - mCameraManager.destroy(entity); +void FEngine::destroyCameraComponent(Entity const entity) noexcept { + mCameraManager.destroy(*this, entity); } -void FEngine::createRenderable(const RenderableManager::Builder& builder, Entity entity) { +void FEngine::createRenderable(const RenderableManager::Builder& builder, Entity const entity) { mRenderableManager.create(builder, entity); auto& tcm = mTransformManager; // if this entity doesn't have a transform component, add one. @@ -833,7 +979,7 @@ void FEngine::createRenderable(const RenderableManager::Builder& builder, Entity } } -void FEngine::createLight(const LightManager::Builder& builder, Entity entity) { +void FEngine::createLight(const LightManager::Builder& builder, Entity const entity) { mLightManager.create(builder, entity); } @@ -866,11 +1012,18 @@ void FEngine::cleanupResourceListLocked(Lock& lock, ResourceList&& list) { // ----------------------------------------------------------------------------------------------- +template +UTILS_ALWAYS_INLINE +inline bool FEngine::isValid(const T* ptr, ResourceList const& list) const { + auto& l = const_cast&>(list); + return l.find(ptr) != l.end(); +} + template UTILS_ALWAYS_INLINE inline bool FEngine::terminateAndDestroy(const T* ptr, ResourceList& list) { if (ptr == nullptr) return true; - bool success = list.remove(ptr); + bool const success = list.remove(ptr); #if UTILS_HAS_RTTI auto typeName = CallStack::typeName(); @@ -892,7 +1045,7 @@ UTILS_ALWAYS_INLINE inline bool FEngine::terminateAndDestroyLocked(Lock& lock, const T* ptr, ResourceList& list) { if (ptr == nullptr) return true; lock.lock(); - bool success = list.remove(ptr); + bool const success = list.remove(ptr); lock.unlock(); #if UTILS_HAS_RTTI @@ -992,44 +1145,197 @@ bool FEngine::destroy(const FStream* p) { return terminateAndDestroy(p, mStreams); } +UTILS_NOINLINE +bool FEngine::destroy(const FInstanceBuffer* p){ + return terminateAndDestroy(p, mInstanceBuffers); +} UTILS_NOINLINE bool FEngine::destroy(const FMaterial* ptr) { if (ptr == nullptr) return true; - auto pos = mMaterialInstances.find(ptr); - if (pos != mMaterialInstances.cend()) { - // ensure we've destroyed all instances before destroying the material - if (!ASSERT_PRECONDITION_NON_FATAL(pos->second.empty(), - "destroying material \"%s\" but %u instances still alive", - ptr->getName().c_str(), (*pos).second.size())) { - return false; + bool const success = terminateAndDestroy(ptr, mMaterials); + if (UTILS_LIKELY(success)) { + auto pos = mMaterialInstances.find(ptr); + if (UTILS_LIKELY(pos != mMaterialInstances.cend())) { + mMaterialInstances.erase(pos); } } - return terminateAndDestroy(ptr, mMaterials); + return success; } UTILS_NOINLINE bool FEngine::destroy(const FMaterialInstance* ptr) { if (ptr == nullptr) return true; + + // Check that the material instance we're destroying is not in use in the RenderableManager + // To do this, we currently need to inspect all render primitives in the RenderableManager + EntityManager const& em = mEntityManager; + FRenderableManager const& rcm = mRenderableManager; + Entity const* entities = rcm.getEntities(); + size_t const count = rcm.getComponentCount(); + for (size_t i = 0; i < count; i++) { + Entity const entity = entities[i]; + if (em.isAlive(entity)) { + RenderableManager::Instance const ri = rcm.getInstance(entity); + size_t const primitiveCount = rcm.getPrimitiveCount(ri, 0); + for (size_t j = 0; j < primitiveCount; j++) { + auto const* const mi = rcm.getMaterialInstanceAt(ri, 0, j); + if (features.engine.debug.assert_material_instance_in_use) { + FILAMENT_CHECK_PRECONDITION(mi != ptr) + << "destroying MaterialInstance \"" + << mi->getName() << "\" which is still in use by Renderable (entity=" + << entity.getId() << ", instance=" + << ri.asValue() << ", index=" << j << ")"; + } else { + if (UTILS_UNLIKELY(mi == ptr)) { + slog.e << "destroying MaterialInstance \"" + << mi->getName() << "\" which is still in use by Renderable (entity=" + << entity.getId() << ", instance=" + << ri.asValue() << ", index=" << j << ")" + << io::endl; + } + } + } + } + } + + if (ptr->isDefaultInstance()) return false; auto pos = mMaterialInstances.find(ptr->getMaterial()); assert_invariant(pos != mMaterialInstances.cend()); if (pos != mMaterialInstances.cend()) { return terminateAndDestroy(ptr, pos->second); } - // if we don't find this instance's material it might be because it's the default instance - // in which case it fine to ignore. - return true; + // this shouldn't happen, this would be double-free + return false; } UTILS_NOINLINE -void FEngine::destroy(Entity e) { +void FEngine::destroy(Entity const e) { mRenderableManager.destroy(e); mLightManager.destroy(e); mTransformManager.destroy(e); - mCameraManager.destroy(e); + mCameraManager.destroy(*this, e); +} + +bool FEngine::isValid(const FBufferObject* p) const { + return isValid(p, mBufferObjects); +} + +bool FEngine::isValid(const FVertexBuffer* p) const { + return isValid(p, mVertexBuffers); +} + +bool FEngine::isValid(const FFence* p) const { + return isValid(p, mFences); +} + +bool FEngine::isValid(const FIndexBuffer* p) const { + return isValid(p, mIndexBuffers); +} + +bool FEngine::isValid(const FSkinningBuffer* p) const { + return isValid(p, mSkinningBuffers); +} + +bool FEngine::isValid(const FMorphTargetBuffer* p) const { + return isValid(p, mMorphTargetBuffers); +} + +bool FEngine::isValid(const FIndirectLight* p) const { + return isValid(p, mIndirectLights); +} + +bool FEngine::isValid(const FMaterial* p) const { + return isValid(p, mMaterials); +} + +bool FEngine::isValid(const FMaterial* m, const FMaterialInstance* p) const { + // first make sure the material we're given is valid. + if (!isValid(m)) { + return false; + } + + // then find the material instance list for that material + auto it = mMaterialInstances.find(m); + if (it == mMaterialInstances.end()) { + // this could happen if this material has no material instances at all + return false; + } + + // finally validate the material instance + return isValid(p, it->second); +} + +bool FEngine::isValidExpensive(const FMaterialInstance* p) const { + return std::any_of(mMaterialInstances.cbegin(), mMaterialInstances.cend(), + [this, p](auto&& entry) { + return isValid(p, entry.second); + }); +} + +bool FEngine::isValid(const FRenderer* p) const { + return isValid(p, mRenderers); } -void* FEngine::streamAlloc(size_t size, size_t alignment) noexcept { +bool FEngine::isValid(const FScene* p) const { + return isValid(p, mScenes); +} + +bool FEngine::isValid(const FSkybox* p) const { + return isValid(p, mSkyboxes); +} + +bool FEngine::isValid(const FColorGrading* p) const { + return isValid(p, mColorGradings); +} + +bool FEngine::isValid(const FSwapChain* p) const { + return isValid(p, mSwapChains); +} + +bool FEngine::isValid(const FStream* p) const { + return isValid(p, mStreams); +} + +bool FEngine::isValid(const FTexture* p) const { + return isValid(p, mTextures); +} + +bool FEngine::isValid(const FRenderTarget* p) const { + return isValid(p, mRenderTargets); +} + +bool FEngine::isValid(const FView* p) const { + return isValid(p, mViews); +} + +bool FEngine::isValid(const FInstanceBuffer* p) const { + return isValid(p, mInstanceBuffers); +} + +size_t FEngine::getBufferObjectCount() const noexcept { return mBufferObjects.size(); } +size_t FEngine::getViewCount() const noexcept { return mViews.size(); } +size_t FEngine::getSceneCount() const noexcept { return mScenes.size(); } +size_t FEngine::getSwapChainCount() const noexcept { return mSwapChains.size(); } +size_t FEngine::getStreamCount() const noexcept { return mStreams.size(); } +size_t FEngine::getIndexBufferCount() const noexcept { return mIndexBuffers.size(); } +size_t FEngine::getSkinningBufferCount() const noexcept { return mSkinningBuffers.size(); } +size_t FEngine::getMorphTargetBufferCount() const noexcept { return mMorphTargetBuffers.size(); } +size_t FEngine::getInstanceBufferCount() const noexcept { return mInstanceBuffers.size(); } +size_t FEngine::getVertexBufferCount() const noexcept { return mVertexBuffers.size(); } +size_t FEngine::getIndirectLightCount() const noexcept { return mIndirectLights.size(); } +size_t FEngine::getMaterialCount() const noexcept { return mMaterials.size(); } +size_t FEngine::getTextureCount() const noexcept { return mTextures.size(); } +size_t FEngine::getSkyboxeCount() const noexcept { return mSkyboxes.size(); } +size_t FEngine::getColorGradingCount() const noexcept { return mColorGradings.size(); } +size_t FEngine::getRenderTargetCount() const noexcept { return mRenderTargets.size(); } + +size_t FEngine::getMaxShadowMapCount() const noexcept { + return features.engine.shadows.use_shadow_atlas ? + CONFIG_MAX_SHADOWMAPS : CONFIG_MAX_SHADOW_LAYERS; +} + +void* FEngine::streamAlloc(size_t const size, size_t const alignment) noexcept { // we allow this only for small allocations if (size > 65536) { return nullptr; @@ -1038,7 +1344,6 @@ void* FEngine::streamAlloc(size_t size, size_t alignment) noexcept { } bool FEngine::execute() { - // wait until we get command buffers to be executed (or thread exit requested) auto buffers = mCommandBufferQueue.waitForCommands(); if (UTILS_UNLIKELY(buffers.empty())) { @@ -1046,9 +1351,10 @@ bool FEngine::execute() { } // execute all command buffers + auto& driver = getDriverApi(); for (auto& item : buffers) { if (UTILS_LIKELY(item.begin)) { - getDriverApi().execute(item.begin); + driver.execute(item.begin); mCommandBufferQueue.releaseBuffer(item); } } @@ -1063,14 +1369,24 @@ void FEngine::destroy(FEngine* engine) { } } +bool FEngine::isPaused() const noexcept { + return mCommandBufferQueue.isPaused(); +} + +void FEngine::setPaused(bool const paused) { + mCommandBufferQueue.setPaused(paused); +} + Engine::FeatureLevel FEngine::getSupportedFeatureLevel() const noexcept { - FEngine::DriverApi& driver = const_cast(this)->getDriverApi(); + DriverApi& driver = const_cast(this)->getDriverApi(); return driver.getFeatureLevel(); } Engine::FeatureLevel FEngine::setActiveFeatureLevel(FeatureLevel featureLevel) { - ASSERT_PRECONDITION(featureLevel <= getSupportedFeatureLevel(), - "Feature level %u not supported", (unsigned)featureLevel); + FILAMENT_CHECK_PRECONDITION(featureLevel <= getSupportedFeatureLevel()) + << "Feature level " << (unsigned)featureLevel << " not supported"; + FILAMENT_CHECK_PRECONDITION(mActiveFeatureLevel >= FeatureLevel::FEATURE_LEVEL_1) + << "Cannot adjust feature level beyond 0 at runtime"; return (mActiveFeatureLevel = std::max(mActiveFeatureLevel, featureLevel)); } @@ -1080,4 +1396,139 @@ void FEngine::resetBackendState() noexcept { } #endif +void FEngine::unprotected() noexcept { + if (UTILS_UNLIKELY(!mUnprotectedDummySwapchain)) { + mUnprotectedDummySwapchain = createSwapChain(1, 1, 0); + } + mUnprotectedDummySwapchain->makeCurrent(getDriverApi()); +} + +bool FEngine::setFeatureFlag(char const* name, bool const value) noexcept { + auto* const p = getFeatureFlagPtr(name); + if (p) { + *p = value; + } + return p != nullptr; +} + +std::optional FEngine::getFeatureFlag(char const* name) const noexcept { + auto* const p = getFeatureFlagPtr(name, true); + if (p) { + return *p; + } + return std::nullopt; +} + +bool* FEngine::getFeatureFlagPtr(std::string_view name, bool const allowConstant) const noexcept { + auto pos = std::find_if(mFeatures.begin(), mFeatures.end(), + [name](FeatureFlag const& entry) { + return name == entry.name; + }); + + return (pos != mFeatures.end() && (!pos->constant || allowConstant)) ? + const_cast(pos->value) : nullptr; +} + +// ------------------------------------------------------------------------------------------------ + +Engine::Builder::Builder() noexcept = default; +Engine::Builder::~Builder() noexcept = default; +Engine::Builder::Builder(Builder const& rhs) noexcept = default; +Engine::Builder::Builder(Builder&& rhs) noexcept = default; +Engine::Builder& Engine::Builder::operator=(Builder const& rhs) noexcept = default; +Engine::Builder& Engine::Builder::operator=(Builder&& rhs) noexcept = default; + +Engine::Builder& Engine::Builder::backend(Backend const backend) noexcept { + mImpl->mBackend = backend; + return *this; +} + +Engine::Builder& Engine::Builder::platform(Platform* platform) noexcept { + mImpl->mPlatform = platform; + return *this; +} + +Engine::Builder& Engine::Builder::config(Config const* config) noexcept { + mImpl->mConfig = config ? *config : Config{}; + return *this; +} + +Engine::Builder& Engine::Builder::featureLevel(FeatureLevel const featureLevel) noexcept { + mImpl->mFeatureLevel = featureLevel; + return *this; +} + +Engine::Builder& Engine::Builder::sharedContext(void* sharedContext) noexcept { + mImpl->mSharedContext = sharedContext; + return *this; +} + +Engine::Builder& Engine::Builder::paused(bool const paused) noexcept { + mImpl->mPaused = paused; + return *this; +} + +Engine::Builder& Engine::Builder::feature(char const* name, bool const value) noexcept { + mImpl->mFeatureFlags[name] = value; + return *this; +} + +Engine::Builder& Engine::Builder::features(std::initializer_list const list) noexcept { + for (auto name : list) { + if (name) { + feature(name, true); + } + } + return *this; +} + +#if UTILS_HAS_THREADING + +void Engine::Builder::build(Invocable&& callback) const { + FEngine::create(*this, std::move(callback)); +} + +#endif + +Engine* Engine::Builder::build() const { + mImpl->mConfig = BuilderDetails::validateConfig(mImpl->mConfig); + return FEngine::create(*this); +} + +Engine::Config Engine::BuilderDetails::validateConfig(Config config) noexcept { + // Rule of thumb: perRenderPassArenaMB must be roughly 1 MB larger than perFrameCommandsMB + constexpr uint32_t COMMAND_ARENA_OVERHEAD = 1; + constexpr uint32_t CONCURRENT_FRAME_COUNT = 3; + + // Use at least the defaults set by the build system + config.minCommandBufferSizeMB = std::max( + config.minCommandBufferSizeMB, + (uint32_t)FILAMENT_MIN_COMMAND_BUFFERS_SIZE_IN_MB); + + config.perFrameCommandsSizeMB = std::max( + config.perFrameCommandsSizeMB, + (uint32_t)FILAMENT_PER_FRAME_COMMANDS_SIZE_IN_MB); + + config.perRenderPassArenaSizeMB = std::max( + config.perRenderPassArenaSizeMB, + (uint32_t)FILAMENT_PER_RENDER_PASS_ARENA_SIZE_IN_MB); + + config.commandBufferSizeMB = std::max( + config.commandBufferSizeMB, + config.minCommandBufferSizeMB * CONCURRENT_FRAME_COUNT); + + // Enforce pre-render-pass arena rule-of-thumb + config.perRenderPassArenaSizeMB = std::max( + config.perRenderPassArenaSizeMB, + config.perFrameCommandsSizeMB + COMMAND_ARENA_OVERHEAD); + + // This value gets validated during driver creation, so pass it through + config.driverHandleArenaSizeMB = config.driverHandleArenaSizeMB; + + config.stereoscopicEyeCount = + std::clamp(config.stereoscopicEyeCount, uint8_t(1), CONFIG_MAX_STEREOSCOPIC_EYES); + + return config; +} + } // namespace filament diff --git a/filament/src/details/Engine.h b/filament/src/details/Engine.h index 9104c9363f7..da83a726a60 100644 --- a/filament/src/details/Engine.h +++ b/filament/src/details/Engine.h @@ -23,18 +23,23 @@ #include "DFG.h" #include "PostProcessManager.h" #include "ResourceList.h" +#include "HwDescriptorSetLayoutFactory.h" +#include "HwVertexBufferInfoFactory.h" #include "components/CameraManager.h" #include "components/LightManager.h" #include "components/TransformManager.h" #include "components/RenderableManager.h" +#include "ds/DescriptorSetLayout.h" + #include "details/BufferObject.h" #include "details/Camera.h" #include "details/ColorGrading.h" #include "details/DebugRegistry.h" #include "details/Fence.h" #include "details/IndexBuffer.h" +#include "details/InstanceBuffer.h" #include "details/RenderTarget.h" #include "details/SkinningBuffer.h" #include "details/MorphTargetBuffer.h" @@ -51,38 +56,43 @@ #include #include #include -#include #include #include #include #include -#if FILAMENT_ENABLE_MATDBG -#include -#else -namespace filament { -namespace matdbg { -class DebugServer; -using MaterialKey = uint32_t; -} // namespace matdbg -} // namespace filament -#endif - -#include #include -#include +#include #include +#include +#include +#include +#include #include #include #include +#include +#include #include +#include +#include #include +#if FILAMENT_ENABLE_MATDBG +#include +#else +namespace filament::matdbg { +class DebugServer; +using MaterialKey = uint32_t; +} // namespace filament::matdbg +#endif + namespace filament { class Renderer; class MaterialParser; +class ResourceAllocatorDisposer; namespace backend { class Driver; @@ -105,7 +115,7 @@ class ResourceAllocator; class FEngine : public Engine { public: - inline void* operator new(std::size_t size) noexcept { + inline void* operator new(std::size_t const size) noexcept { return utils::aligned_alloc(size, alignof(FEngine)); } @@ -119,16 +129,10 @@ class FEngine : public Engine { using duration = clock::duration; public: - static FEngine* create(Backend backend = Backend::DEFAULT, - Platform* platform = nullptr, void* sharedGLContext = nullptr, - const Config* pConfig = nullptr); + static Engine* create(Builder const& builder); #if UTILS_HAS_THREADING - static void createAsync(CreateCallback callback, void* user, - Backend backend = Backend::DEFAULT, - Platform* platform = nullptr, void* sharedGLContext = nullptr, - const Config* config = nullptr); - + static void create(Builder const& builder, utils::Invocable&& callback); static FEngine* getEngine(void* token); #endif @@ -147,7 +151,7 @@ class FEngine : public Engine { // the per-frame Area is used by all Renderer, so they must run in sequence and // have freed all allocated memory when done. If this needs to change in the future, // we'll simply have to use separate Areas (for instance). - LinearAllocatorArena& getPerRenderPassAllocator() noexcept { return mPerRenderPassAllocator; } + LinearAllocatorArena& getPerRenderPassArena() noexcept { return mPerRenderPassArena; } // Material IDs... uint32_t getMaterialId() const noexcept { return mMaterialId++; } @@ -183,6 +187,18 @@ class FEngine : public Engine { return mActiveFeatureLevel; } + size_t getMaxAutomaticInstances() const noexcept { + return CONFIG_MAX_INSTANCES; + } + + bool isStereoSupported() const noexcept { + return getDriver().isStereoSupported(); + } + + static size_t getMaxStereoscopicEyes() noexcept { + return CONFIG_MAX_STEREOSCOPIC_EYES; + } + PostProcessManager const& getPostProcessManager() const noexcept { return mPostProcessManager; } @@ -195,10 +211,18 @@ class FEngine : public Engine { return mRenderableManager; } + FRenderableManager const& getRenderableManager() const noexcept { + return mRenderableManager; + } + FLightManager& getLightManager() noexcept { return mLightManager; } + FLightManager const& getLightManager() const noexcept { + return mLightManager; + } + FCameraManager& getCameraManager() noexcept { return mCameraManager; } @@ -223,9 +247,37 @@ class FEngine : public Engine { return mPlatform; } - ResourceAllocator& getResourceAllocator() noexcept { - assert_invariant(mResourceAllocator); - return *mResourceAllocator; + size_t getMaxShadowMapCount() const noexcept; + + // Return a vector of shader languages, in order of preference. + utils::FixedCapacityVector getShaderLanguage() const noexcept { + switch (mBackend) { + case Backend::DEFAULT: + case Backend::NOOP: + default: + return { backend::ShaderLanguage::ESSL3 }; + case Backend::OPENGL: + return { getDriver().getFeatureLevel() == FeatureLevel::FEATURE_LEVEL_0 + ? backend::ShaderLanguage::ESSL1 + : backend::ShaderLanguage::ESSL3 }; + case Backend::VULKAN: + return { backend::ShaderLanguage::SPIRV }; + case Backend::METAL: + const auto& lang = mConfig.preferredShaderLanguage; + if (lang == Config::ShaderLanguage::MSL) { + return { backend::ShaderLanguage::MSL, backend::ShaderLanguage::METAL_LIBRARY }; + } + return { backend::ShaderLanguage::METAL_LIBRARY, backend::ShaderLanguage::MSL }; + } + } + + ResourceAllocatorDisposer& getResourceAllocatorDisposer() noexcept { + assert_invariant(mResourceAllocatorDisposer); + return *mResourceAllocatorDisposer; + } + + std::shared_ptr const& getSharedResourceAllocatorDisposer() noexcept { + return mResourceAllocatorDisposer; } void* streamAlloc(size_t size, size_t alignment) noexcept; @@ -239,16 +291,17 @@ class FEngine : public Engine { return mDefaultRenderTarget; } - template - T* create(ResourceList& list, typename T::Builder const& builder) noexcept; + template + T* create(ResourceList& list, typename T::Builder const& builder, ARGS&& ... args) noexcept; FBufferObject* createBufferObject(const BufferObject::Builder& builder) noexcept; FVertexBuffer* createVertexBuffer(const VertexBuffer::Builder& builder) noexcept; FIndexBuffer* createIndexBuffer(const IndexBuffer::Builder& builder) noexcept; FSkinningBuffer* createSkinningBuffer(const SkinningBuffer::Builder& builder) noexcept; FMorphTargetBuffer* createMorphTargetBuffer(const MorphTargetBuffer::Builder& builder) noexcept; + FInstanceBuffer* createInstanceBuffer(const InstanceBuffer::Builder& builder) noexcept; FIndirectLight* createIndirectLight(const IndirectLight::Builder& builder) noexcept; - FMaterial* createMaterial(const Material::Builder& builder) noexcept; + FMaterial* createMaterial(const Material::Builder& builder, std::unique_ptr materialParser) noexcept; FTexture* createTexture(const Texture::Builder& builder) noexcept; FSkybox* createSkybox(const Skybox::Builder& builder) noexcept; FColorGrading* createColorGrading(const ColorGrading::Builder& builder) noexcept; @@ -259,12 +312,16 @@ class FEngine : public Engine { void createLight(const LightManager::Builder& builder, utils::Entity entity); FRenderer* createRenderer() noexcept; + FMaterialInstance* createMaterialInstance(const FMaterial* material, const FMaterialInstance* other, const char* name) noexcept; + FMaterialInstance* createMaterialInstance(const FMaterial* material, + const char* name) noexcept; + FScene* createScene() noexcept; FView* createView() noexcept; - FFence* createFence(FFence::Type type) noexcept; + FFence* createFence() noexcept; FSwapChain* createSwapChain(void* nativeWindow, uint64_t flags) noexcept; FSwapChain* createSwapChain(uint32_t width, uint32_t height, uint64_t flags) noexcept; @@ -291,9 +348,51 @@ class FEngine : public Engine { bool destroy(const FRenderTarget* p); bool destroy(const FSwapChain* p); bool destroy(const FView* p); + bool destroy(const FInstanceBuffer* p); + + bool isValid(const FBufferObject* p) const; + bool isValid(const FVertexBuffer* p) const; + bool isValid(const FFence* p) const; + bool isValid(const FIndexBuffer* p) const; + bool isValid(const FSkinningBuffer* p) const; + bool isValid(const FMorphTargetBuffer* p) const; + bool isValid(const FIndirectLight* p) const; + bool isValid(const FMaterial* p) const; + bool isValid(const FMaterial* m, const FMaterialInstance* p) const; + bool isValidExpensive(const FMaterialInstance* p) const; + bool isValid(const FRenderer* p) const; + bool isValid(const FScene* p) const; + bool isValid(const FSkybox* p) const; + bool isValid(const FColorGrading* p) const; + bool isValid(const FSwapChain* p) const; + bool isValid(const FStream* p) const; + bool isValid(const FTexture* p) const; + bool isValid(const FRenderTarget* p) const; + bool isValid(const FView* p) const; + bool isValid(const FInstanceBuffer* p) const; + + size_t getBufferObjectCount() const noexcept; + size_t getViewCount() const noexcept; + size_t getSceneCount() const noexcept; + size_t getSwapChainCount() const noexcept; + size_t getStreamCount() const noexcept; + size_t getIndexBufferCount() const noexcept; + size_t getSkinningBufferCount() const noexcept; + size_t getMorphTargetBufferCount() const noexcept; + size_t getInstanceBufferCount() const noexcept; + size_t getVertexBufferCount() const noexcept; + size_t getIndirectLightCount() const noexcept; + size_t getMaterialCount() const noexcept; + size_t getTextureCount() const noexcept; + size_t getSkyboxeCount() const noexcept; + size_t getColorGradingCount() const noexcept; + size_t getRenderTargetCount() const noexcept; void destroy(utils::Entity e); + bool isPaused() const noexcept; + void setPaused(bool paused); + void flushAndWait(); // flush the current buffer @@ -337,8 +436,11 @@ class FEngine : public Engine { bool execute(); - utils::JobSystem& getJobSystem() noexcept { - return mJobSystem; + utils::JobSystem& getJobSystem() const noexcept { + // JobSystem is thread-safe, and it's always okay to return a non-const one, + // it's conceptually the same as if we were holding a non-const reference, as opposed + // to by-value class attribute. + return const_cast(mJobSystem); } std::default_random_engine& getRandomEngine() { @@ -349,14 +451,39 @@ class FEngine : public Engine { getDriver().purge(); } - void setAutomaticInstancingEnabled(bool enable) noexcept { - mAutomaticInstancingEnabled = enable; + void unprotected() noexcept; + + void setAutomaticInstancingEnabled(bool const enable) noexcept { + // instancing is not allowed at feature level 0 + if (hasFeatureLevel(FeatureLevel::FEATURE_LEVEL_1)) { + mAutomaticInstancingEnabled = enable; + } } bool isAutomaticInstancingEnabled() const noexcept { return mAutomaticInstancingEnabled; } + HwVertexBufferInfoFactory& getVertexBufferInfoFactory() noexcept { + return mHwVertexBufferInfoFactory; + } + + HwDescriptorSetLayoutFactory& getDescriptorSetLayoutFactory() noexcept { + return mHwDescriptorSetLayoutFactory; + } + + DescriptorSetLayout const& getPerViewDescriptorSetLayoutDepthVariant() const noexcept { + return mPerViewDescriptorSetLayoutDepthVariant; + } + + DescriptorSetLayout const& getPerViewDescriptorSetLayoutSsrVariant() const noexcept { + return mPerViewDescriptorSetLayoutSsrVariant; + } + + DescriptorSetLayout const& getPerRenderableDescriptorSetLayout() const noexcept { + return mPerRenderableDescriptorSetLayout; + } + backend::Handle getOneTexture() const { return mDummyOneTexture; } backend::Handle getZeroTexture() const { return mDummyZeroTexture; } backend::Handle getOneTextureArray() const { return mDummyOneTextureArray; } @@ -370,8 +497,12 @@ class FEngine : public Engine { size_t getRequestedDriverHandleArenaSize() const noexcept { return mConfig.driverHandleArenaSizeMB * MiB; } Config const& getConfig() const noexcept { return mConfig; } - bool hasFeatureLevel(backend::FeatureLevel neededFeatureLevel) const noexcept { - return FEngine::getActiveFeatureLevel() >= neededFeatureLevel; + bool hasFeatureLevel(backend::FeatureLevel const neededFeatureLevel) const noexcept { + return getActiveFeatureLevel() >= neededFeatureLevel; + } + + auto const& getMaterialInstanceResourceList() const noexcept { + return mMaterialInstances; } #if defined(__EMSCRIPTEN__) @@ -379,9 +510,7 @@ class FEngine : public Engine { #endif private: - static Config validateConfig(const Config* pConfig) noexcept; - - FEngine(Backend backend, Platform* platform, const Config& config, void* sharedGLContext); + explicit FEngine(Builder const& builder); void init(); void shutdown(); @@ -390,6 +519,9 @@ class FEngine : public Engine { backend::Driver& getDriver() const noexcept { return *mDriver; } + template + bool isValid(const T* ptr, ResourceList const& list) const; + template bool terminateAndDestroy(const T* p, ResourceList& list); @@ -423,7 +555,12 @@ class FEngine : public Engine { FTransformManager mTransformManager; FLightManager mLightManager; FCameraManager mCameraManager; - ResourceAllocator* mResourceAllocator = nullptr; + std::shared_ptr mResourceAllocatorDisposer; + HwVertexBufferInfoFactory mHwVertexBufferInfoFactory; + HwDescriptorSetLayoutFactory mHwDescriptorSetLayoutFactory; + DescriptorSetLayout mPerViewDescriptorSetLayoutDepthVariant; + DescriptorSetLayout mPerViewDescriptorSetLayoutSsrVariant; + DescriptorSetLayout mPerRenderableDescriptorSetLayout; ResourceList mBufferObjects{ "BufferObject" }; ResourceList mRenderers{ "Renderer" }; @@ -434,6 +571,7 @@ class FEngine : public Engine { ResourceList mIndexBuffers{ "IndexBuffer" }; ResourceList mSkinningBuffers{ "SkinningBuffer" }; ResourceList mMorphTargetBuffers{ "MorphTargetBuffer" }; + ResourceList mInstanceBuffers{ "InstanceBuffer" }; ResourceList mVertexBuffers{ "VertexBuffer" }; ResourceList mIndirectLights{ "IndirectLight" }; ResourceList mMaterials{ "Material" }; @@ -443,7 +581,7 @@ class FEngine : public Engine { ResourceList mRenderTargets{ "RenderTarget" }; // the fence list is accessed from multiple threads - utils::SpinLock mFenceListLock; + utils::Mutex mFenceListLock; ResourceList mFences{"Fence"}; mutable uint32_t mMaterialId = 0; @@ -460,11 +598,11 @@ class FEngine : public Engine { uint32_t mFlushCounter = 0; - LinearAllocatorArena mPerRenderPassAllocator; + RootArenaScope::Arena mPerRenderPassArena; HeapAllocatorArena mHeapAllocator; utils::JobSystem mJobSystem; - static uint32_t getJobSystemThreadPoolSize() noexcept; + static uint32_t getJobSystemThreadPoolSize(Config const& config) noexcept; std::default_random_engine mRandomEngine; @@ -472,6 +610,7 @@ class FEngine : public Engine { mutable FMaterial const* mDefaultMaterial = nullptr; mutable FMaterial const* mSkyboxMaterial = nullptr; + mutable FSwapChain* mUnprotectedDummySwapchain = nullptr; mutable FTexture* mDefaultIblTexture = nullptr; mutable FIndirectLight* mDefaultIbl = nullptr; @@ -492,19 +631,32 @@ class FEngine : public Engine { std::thread::id mMainThreadId{}; + bool mInitialized = false; + // Creation parameters Config mConfig; public: - // these are the debug properties used by FDebug. They're accessed directly by modules who need them. + // These are the debug properties used by FDebug. + // They're accessed directly by modules who need them. struct { struct { + bool debug_directional_shadowmap = false; + bool display_shadow_texture = false; bool far_uses_shadowcasters = true; bool focus_shadowcasters = true; bool visualize_cascades = false; - bool tightly_bound_scene = true; + bool disable_light_frustum_align = false; + bool depth_clamp = true; float dzn = -1.0f; float dzf = 1.0f; + float display_shadow_texture_scale = 0.25f; + int display_shadow_texture_layer = 0; + int display_shadow_texture_level = 0; + int display_shadow_texture_channel = 0; + int display_shadow_texture_layer_count = 0; + int display_shadow_texture_level_count = 0; + float display_shadow_texture_power = 1; } shadowmap; struct { bool camera_at_origin = true; @@ -519,9 +671,64 @@ class FEngine : public Engine { // capture to file. At the moment, only supported by the Metal backend. bool doFrameCapture = false; bool disable_buffer_padding = false; + bool disable_subpasses = false; } renderer; + struct { + bool debug_froxel_visualization = false; + } lighting; + struct { + bool combine_multiview_images = false; + } stereo; matdbg::DebugServer* server = nullptr; } debug; + + struct { + struct { + struct { + bool use_shadow_atlas = false; + } shadows; + struct { +#ifndef NDEBUG + bool assert_material_instance_in_use = true; +#else + bool assert_material_instance_in_use = false; +#endif + } debug; + } engine; + struct { + struct { + bool assert_native_window_is_valid = false; + } opengl; + bool disable_parallel_shader_compile = false; + bool disable_handle_use_after_free_check = false; + } backend; + } features; + + std::array const mFeatures{{ + { "backend.disable_parallel_shader_compile", + "Disable parallel shader compilation in GL and Metal backends.", + &features.backend.disable_parallel_shader_compile, true }, + { "backend.disable_handle_use_after_free_check", + "Disable Handle<> use-after-free checks.", + &features.backend.disable_handle_use_after_free_check, true }, + { "backend.opengl.assert_native_window_is_valid", + "Asserts that the ANativeWindow is valid when rendering starts.", + &features.backend.opengl.assert_native_window_is_valid, true }, + { "engine.shadows.use_shadow_atlas", + "Uses an array of atlases to store shadow maps.", + &features.engine.shadows.use_shadow_atlas, true }, + { "features.engine.debug.assert_material_instance_in_use", + "Assert when a MaterialInstance is destroyed while it is in use by RenderableManager.", + &features.engine.debug.assert_material_instance_in_use, false } + }}; + + utils::Slice getFeatureFlags() const noexcept { + return { mFeatures.data(), mFeatures.size() }; + } + + bool setFeatureFlag(char const* name, bool value) noexcept; + std::optional getFeatureFlag(char const* name) const noexcept; + bool* getFeatureFlagPtr(std::string_view name, bool allowConstant = false) const noexcept; }; FILAMENT_DOWNCAST(Engine) diff --git a/filament/src/details/Fence.cpp b/filament/src/details/Fence.cpp index 4b373a96297..8c7a2c81a4d 100644 --- a/filament/src/details/Fence.cpp +++ b/filament/src/details/Fence.cpp @@ -35,12 +35,9 @@ static const constexpr uint64_t PUMP_INTERVAL_MILLISECONDS = 1; using ms = std::chrono::milliseconds; using ns = std::chrono::nanoseconds; -FFence::FFence(FEngine& engine, Type type) - : mEngine(engine), mFenceSignal(std::make_shared(type)) { +FFence::FFence(FEngine& engine) + : mEngine(engine), mFenceSignal(std::make_shared()) { DriverApi& driverApi = engine.getDriverApi(); - if (type == Type::HARD) { - mFenceHandle = driverApi.createFence(); - } // we have to first wait for the fence to be signaled by the command stream auto& fs = mFenceSignal; @@ -49,29 +46,23 @@ FFence::FFence(FEngine& engine, Type type) }); } -void FFence::terminate(FEngine& engine) noexcept { +void FFence::terminate(FEngine&) noexcept { FenceSignal * const fs = mFenceSignal.get(); fs->signal(FenceSignal::DESTROYED); - if (fs->mType == Type::HARD) { - if (mFenceHandle) { - FEngine::DriverApi& driver = engine.getDriverApi(); - driver.destroyFence(mFenceHandle); - mFenceHandle.clear(); - } - } } UTILS_NOINLINE -FenceStatus FFence::waitAndDestroy(FFence* fence, Mode mode) noexcept { +FenceStatus FFence::waitAndDestroy(FFence* fence, Mode const mode) noexcept { assert_invariant(fence); - FenceStatus status = fence->wait(mode, FENCE_WAIT_FOR_EVER); + FenceStatus const status = fence->wait(mode, FENCE_WAIT_FOR_EVER); fence->mEngine.destroy(fence); return status; } UTILS_NOINLINE -FenceStatus FFence::wait(Mode mode, uint64_t timeout) noexcept { - ASSERT_PRECONDITION(UTILS_HAS_THREADING || timeout == 0, "Non-zero timeout requires threads."); +FenceStatus FFence::wait(Mode const mode, uint64_t const timeout) noexcept { + FILAMENT_CHECK_PRECONDITION(UTILS_HAS_THREADING || timeout == 0) + << "Non-zero timeout requires threads."; FEngine& engine = mEngine; @@ -107,29 +98,25 @@ FenceStatus FFence::wait(Mode mode, uint64_t timeout) noexcept { return status; } - if (fs->mType == Type::HARD) { - // note: even if the driver doesn't support h/w fences, mFenceHandle will be valid - status = engine.getDriverApi().wait(mFenceHandle, timeout); - } return status; } UTILS_NOINLINE -void FFence::FenceSignal::signal(State s) noexcept { - std::lock_guard lock(FFence::sLock); +void FFence::FenceSignal::signal(State const s) noexcept { + std::lock_guard const lock(sLock); mState = s; - FFence::sCondition.notify_all(); + sCondition.notify_all(); } UTILS_NOINLINE -Fence::FenceStatus FFence::FenceSignal::wait(uint64_t timeout) noexcept { - std::unique_lock lock(FFence::sLock); +Fence::FenceStatus FFence::FenceSignal::wait(uint64_t const timeout) noexcept { + std::unique_lock lock(sLock); while (mState == UNSIGNALED) { if (mState == DESTROYED) { return FenceStatus::ERROR; } if (timeout == FENCE_WAIT_FOR_EVER) { - FFence::sCondition.wait(lock); + sCondition.wait(lock); } else { if (timeout == 0 || sCondition.wait_for(lock, ns(timeout)) == std::cv_status::timeout) { diff --git a/filament/src/details/Fence.h b/filament/src/details/Fence.h index 23b52fa2b66..a8a3fc68a27 100644 --- a/filament/src/details/Fence.h +++ b/filament/src/details/Fence.h @@ -33,13 +33,7 @@ class FEngine; class FFence : public Fence { public: - // Type of the Fence being created - enum class Type : uint8_t { - SOFT, - HARD - }; - - FFence(FEngine& engine, Type type); + FFence(FEngine& engine); void terminate(FEngine& engine) noexcept; @@ -54,18 +48,14 @@ class FFence : public Fence { static utils::Condition sCondition; struct FenceSignal { - explicit FenceSignal(Type type) noexcept : mType(type) { } + explicit FenceSignal() noexcept = default; enum State : uint8_t { UNSIGNALED, SIGNALED, DESTROYED }; - // we store mType here instead of in FFence, because it allows sizeof(FFence) to be - // much smaller (since it needs to be multiple of 8 on 64 bits architectures) - const Type mType; State mState = UNSIGNALED; void signal(State s = SIGNALED) noexcept; FenceStatus wait(uint64_t timeout) noexcept; }; FEngine& mEngine; - backend::Handle mFenceHandle; // TODO: use custom allocator for these small objects std::shared_ptr mFenceSignal; }; diff --git a/filament/src/details/IndexBuffer.cpp b/filament/src/details/IndexBuffer.cpp index 66fc5d2f58c..27775bde493 100644 --- a/filament/src/details/IndexBuffer.cpp +++ b/filament/src/details/IndexBuffer.cpp @@ -20,6 +20,8 @@ #include "FilamentAPI-impl.h" +#include + namespace filament { struct IndexBuffer::BuilderDetails { @@ -30,34 +32,46 @@ struct IndexBuffer::BuilderDetails { using BuilderType = IndexBuffer; BuilderType::Builder::Builder() noexcept = default; BuilderType::Builder::~Builder() noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder&& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder&& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder const& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder&& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder const& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder&& rhs) noexcept = default; -IndexBuffer::Builder& IndexBuffer::Builder::indexCount(uint32_t indexCount) noexcept { +IndexBuffer::Builder& IndexBuffer::Builder::indexCount(uint32_t const indexCount) noexcept { mImpl->mIndexCount = indexCount; return *this; } -IndexBuffer::Builder& IndexBuffer::Builder::bufferType(IndexType indexType) noexcept { +IndexBuffer::Builder& IndexBuffer::Builder::bufferType(IndexType const indexType) noexcept { mImpl->mIndexType = indexType; return *this; } +IndexBuffer::Builder& IndexBuffer::Builder::name(const char* name, size_t const len) noexcept { + return BuilderNameMixin::name(name, len); +} + IndexBuffer* IndexBuffer::Builder::build(Engine& engine) { return downcast(engine).createIndexBuffer(*this); } // ------------------------------------------------------------------------------------------------ -FIndexBuffer::FIndexBuffer(FEngine& engine, const IndexBuffer::Builder& builder) +FIndexBuffer::FIndexBuffer(FEngine& engine, const Builder& builder) : mIndexCount(builder->mIndexCount) { + auto& name = builder.getName(); + const char* const tag = name.empty() ? "(no tag)" : name.c_str_safe(); + FILAMENT_CHECK_PRECONDITION( + builder->mIndexType == IndexType::UINT || builder->mIndexType == IndexType::USHORT) + << "Invalid index type " << static_cast(builder->mIndexType) << ", tag=" << tag; FEngine::DriverApi& driver = engine.getDriverApi(); mHandle = driver.createIndexBuffer( (backend::ElementType)builder->mIndexType, uint32_t(builder->mIndexCount), backend::BufferUsage::STATIC); + if (auto name = builder.getName(); !name.empty()) { + driver.setDebugTag(mHandle.getId(), std::move(name)); + } } void FIndexBuffer::terminate(FEngine& engine) { @@ -65,7 +79,7 @@ void FIndexBuffer::terminate(FEngine& engine) { driver.destroyIndexBuffer(mHandle); } -void FIndexBuffer::setBuffer(FEngine& engine, BufferDescriptor&& buffer, uint32_t byteOffset) { +void FIndexBuffer::setBuffer(FEngine& engine, BufferDescriptor&& buffer, uint32_t const byteOffset) { engine.getDriverApi().updateIndexBuffer(mHandle, std::move(buffer), byteOffset); } diff --git a/filament/src/details/IndirectLight.cpp b/filament/src/details/IndirectLight.cpp index b3eb1c4ce55..371c66f478f 100644 --- a/filament/src/details/IndirectLight.cpp +++ b/filament/src/details/IndirectLight.cpp @@ -52,10 +52,10 @@ struct IndirectLight::BuilderDetails { using BuilderType = IndirectLight; BuilderType::Builder::Builder() noexcept = default; BuilderType::Builder::~Builder() noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder&& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder&& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder const& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder&& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder const& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder&& rhs) noexcept = default; IndirectLight::Builder& IndirectLight::Builder::reflections(Texture const* cubemap) noexcept { mImpl->mReflectionsMap = cubemap; @@ -110,7 +110,7 @@ IndirectLight::Builder& IndirectLight::Builder::radiance(uint8_t bands, float3 c // this is a way to "document" the actual value of these coefficients and at the same // time make sure the expression and values are always in sync. struct Debug { - static constexpr bool almost(float a, float b) { + static constexpr bool almost(float const a, float const b) { constexpr float e = 1e-6f; return (a > b - e) && (a < b + e); } @@ -138,7 +138,7 @@ IndirectLight::Builder& IndirectLight::Builder::irradiance(Texture const* cubema return *this; } -IndirectLight::Builder& IndirectLight::Builder::intensity(float envIntensity) noexcept { +IndirectLight::Builder& IndirectLight::Builder::intensity(float const envIntensity) noexcept { mImpl->mIntensity = envIntensity; return *this; } @@ -150,9 +150,9 @@ IndirectLight::Builder& IndirectLight::Builder::rotation(mat3f const& rotation) IndirectLight* IndirectLight::Builder::build(Engine& engine) { if (mImpl->mReflectionsMap) { - ASSERT_PRECONDITION( - mImpl->mReflectionsMap->getTarget() == Texture::Sampler::SAMPLER_CUBEMAP, - "reflection map must a cubemap"); + FILAMENT_CHECK_PRECONDITION( + mImpl->mReflectionsMap->getTarget() == Texture::Sampler::SAMPLER_CUBEMAP) + << "reflection map must a cubemap"; if constexpr (IBL_INTEGRATION == IBL_INTEGRATION_IMPORTANCE_SAMPLING) { mImpl->mReflectionsMap->generateMipmaps(engine); @@ -160,9 +160,9 @@ IndirectLight* IndirectLight::Builder::build(Engine& engine) { } if (mImpl->mIrradianceMap) { - ASSERT_PRECONDITION( - mImpl->mIrradianceMap->getTarget() == Texture::Sampler::SAMPLER_CUBEMAP, - "irradiance map must a cubemap"); + FILAMENT_CHECK_PRECONDITION( + mImpl->mIrradianceMap->getTarget() == Texture::Sampler::SAMPLER_CUBEMAP) + << "irradiance map must a cubemap"; } return downcast(engine).createIndirectLight(*this); @@ -200,14 +200,16 @@ void FIndirectLight::terminate(FEngine& engine) { } backend::Handle FIndirectLight::getReflectionHwHandle() const noexcept { - return mReflectionsTexture ? mReflectionsTexture->getHwHandle() : backend::Handle {}; + return mReflectionsTexture ? mReflectionsTexture->getHwHandleForSampling() + : backend::Handle{}; } backend::Handle FIndirectLight::getIrradianceHwHandle() const noexcept { - return mIrradianceTexture ? mIrradianceTexture->getHwHandle() : backend::Handle {}; + return mIrradianceTexture ? mIrradianceTexture->getHwHandleForSampling() + : backend::Handle{}; } -math::float3 FIndirectLight::getDirectionEstimate(math::float3 const* f) noexcept { +float3 FIndirectLight::getDirectionEstimate(float3 const* f) noexcept { // The linear direction is found as normalize(-sh[3], -sh[1], sh[2]), but the coefficients // we store are already pre-normalized, so the negative sign disappears. // Note: we normalize the directions only after blending, this matches code used elsewhere -- @@ -219,7 +221,7 @@ math::float3 FIndirectLight::getDirectionEstimate(math::float3 const* f) noexcep return -normalize(r * 0.2126f + g * 0.7152f + b * 0.0722f); } -math::float4 FIndirectLight::getColorEstimate(math::float3 const* Le, math::float3 direction) noexcept { +float4 FIndirectLight::getColorEstimate(float3 const* Le, float3 direction) noexcept { // See: https://www.gamasutra.com/view/news/129689/Indepth_Extracting_dominant_light_from_Spherical_Harmonics.php // note Le is our pre-convolved, pre-scaled SH coefficients for the environment @@ -259,11 +261,11 @@ math::float4 FIndirectLight::getColorEstimate(math::float3 const* Le, math::floa return { LdDotLe / intensity, intensity }; } -math::float3 FIndirectLight::getDirectionEstimate() const noexcept { +float3 FIndirectLight::getDirectionEstimate() const noexcept { return getDirectionEstimate(mIrradianceCoefs.data()); } -float4 FIndirectLight::getColorEstimate(float3 direction) const noexcept { +float4 FIndirectLight::getColorEstimate(float3 const direction) const noexcept { return getColorEstimate(mIrradianceCoefs.data(), direction); } diff --git a/filament/src/details/IndirectLight.h b/filament/src/details/IndirectLight.h index db30c517ec7..04c757b04b0 100644 --- a/filament/src/details/IndirectLight.h +++ b/filament/src/details/IndirectLight.h @@ -46,7 +46,7 @@ class FIndirectLight : public IndirectLight { backend::Handle getIrradianceHwHandle() const noexcept; math::float3 const* getSH() const noexcept{ return mIrradianceCoefs.data(); } float getIntensity() const noexcept { return mIntensity; } - void setIntensity(float intensity) noexcept { mIntensity = intensity; } + void setIntensity(float const intensity) noexcept { mIntensity = intensity; } void setRotation(math::mat3f const& rotation) noexcept { mRotation = rotation; } const math::mat3f& getRotation() const noexcept { return mRotation; } FTexture const* getReflectionsTexture() const noexcept { return mReflectionsTexture; } diff --git a/filament/src/details/InstanceBuffer.cpp b/filament/src/details/InstanceBuffer.cpp new file mode 100644 index 00000000000..955711ab757 --- /dev/null +++ b/filament/src/details/InstanceBuffer.cpp @@ -0,0 +1,118 @@ +/* +* Copyright (C) 2023 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include "details/InstanceBuffer.h" + +#include
    +#include + +#include "FilamentAPI-impl.h" + +#include +#include + +namespace filament { + +using namespace backend; + +struct InstanceBuffer::BuilderDetails { + size_t mInstanceCount = 0; + math::mat4f const* mLocalTransforms = nullptr; +}; + +using BuilderType = InstanceBuffer; +BuilderType::Builder::Builder(size_t const instanceCount) noexcept { + mImpl->mInstanceCount = instanceCount; +} + +BuilderType::Builder::~Builder() noexcept = default; +BuilderType::Builder::Builder(Builder const& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder&& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder const& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder&& rhs) noexcept = default; + +InstanceBuffer::Builder& InstanceBuffer::Builder::localTransforms( + math::mat4f const* localTransforms) noexcept { + mImpl->mLocalTransforms = localTransforms; + return *this; +} + +InstanceBuffer::Builder& InstanceBuffer::Builder::name(const char* name, size_t const len) noexcept { + return BuilderNameMixin::name(name, len); +} + +InstanceBuffer* InstanceBuffer::Builder::build(Engine& engine) { + FILAMENT_CHECK_PRECONDITION(mImpl->mInstanceCount >= 1) << "instanceCount must be >= 1."; + FILAMENT_CHECK_PRECONDITION(mImpl->mInstanceCount <= engine.getMaxAutomaticInstances()) + << "instanceCount is " << mImpl->mInstanceCount + << ", but instance count is limited to Engine::getMaxAutomaticInstances() (" + << engine.getMaxAutomaticInstances() << ") instances when supplying transforms."; + return downcast(engine).createInstanceBuffer(*this); +} + +// ------------------------------------------------------------------------------------------------ + +FInstanceBuffer::FInstanceBuffer(FEngine& engine, const Builder& builder) + : mName(builder.getName()) { + mInstanceCount = builder->mInstanceCount; + + mLocalTransforms.reserve(mInstanceCount); + mLocalTransforms.resize(mInstanceCount); // this will initialize all transforms to identity + + if (builder->mLocalTransforms) { + memcpy(mLocalTransforms.data(), builder->mLocalTransforms, + sizeof(math::mat4f) * mInstanceCount); + } +} + +void FInstanceBuffer::setLocalTransforms( + math::mat4f const* localTransforms, size_t const count, size_t const offset) { + FILAMENT_CHECK_PRECONDITION(offset + count <= mInstanceCount) + << "setLocalTransforms overflow. InstanceBuffer has only " << mInstanceCount + << " instances, but trying to set " << count + << " transforms at offset " << offset << "."; + memcpy(mLocalTransforms.data() + offset, localTransforms, sizeof(math::mat4f) * count); +} + +void FInstanceBuffer::prepare(FEngine& engine, math::mat4f rootTransform, + const PerRenderableData& ubo, Handle handle) { + DriverApi& driver = engine.getDriverApi(); + + // TODO: allocate this staging buffer from a pool. + uint32_t stagingBufferSize = sizeof(PerRenderableUib); + PerRenderableData* stagingBuffer = (PerRenderableData*)malloc(stagingBufferSize); + // TODO: consider using JobSystem to parallelize this. + for (size_t i = 0, c = mInstanceCount; i < c; i++) { + stagingBuffer[i] = ubo; + math::mat4f model = rootTransform * mLocalTransforms[i]; + stagingBuffer[i].worldFromModelMatrix = model; + + math::mat3f m = math::mat3f::getTransformForNormals(model.upperLeft()); + stagingBuffer[i].worldFromModelNormalMatrix = math::prescaleForNormals(m); + } + driver.updateBufferObject(handle, { + stagingBuffer, stagingBufferSize, + +[](void* buffer, size_t, void*) { + free(buffer); + } + }, 0); +} + +void FInstanceBuffer::terminate(FEngine& engine) { +} + +} // namespace filament + diff --git a/filament/src/details/InstanceBuffer.h b/filament/src/details/InstanceBuffer.h new file mode 100644 index 00000000000..56bac500c2b --- /dev/null +++ b/filament/src/details/InstanceBuffer.h @@ -0,0 +1,64 @@ +/* +* Copyright (C) 2023 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#ifndef TNT_FILAMENT_DETAILS_INSTANCEBUFFER_H +#define TNT_FILAMENT_DETAILS_INSTANCEBUFFER_H + +#include "downcast.h" + +#include + +#include + +#include + +#include +#include + +namespace filament { + +class FEngine; + +struct PerRenderableData; + +class FInstanceBuffer : public InstanceBuffer { +public: + FInstanceBuffer(FEngine& engine, const Builder& builder); + + void terminate(FEngine& engine); + + inline size_t getInstanceCount() const noexcept { return mInstanceCount; } + + void setLocalTransforms(math::mat4f const* localTransforms, size_t count, size_t offset); + + void prepare(FEngine& engine, math::mat4f rootTransform, const PerRenderableData& ubo, + backend::Handle handle); + + utils::CString const& getName() const noexcept { return mName; } + +private: + friend class RenderableManager; + + utils::FixedCapacityVector mLocalTransforms; + utils::CString mName; + size_t mInstanceCount; +}; + +FILAMENT_DOWNCAST(InstanceBuffer) + +} // namespace filament + +#endif //TNT_FILAMENT_DETAILS_INSTANCEBUFFER_H diff --git a/filament/src/details/Material.cpp b/filament/src/details/Material.cpp index 9b9a6ad3334..ed5c8459810 100644 --- a/filament/src/details/Material.cpp +++ b/filament/src/details/Material.cpp @@ -15,24 +15,62 @@ */ #include "details/Material.h" +#include "details/Engine.h" +#include "Froxelizer.h" #include "MaterialParser.h" -#include "details/Engine.h" +#include "ds/ColorPassDescriptorSet.h" #include "FilamentAPI-impl.h" -#include - #include +#include #include #include +#include +#include + +#include +#include + +#if FILAMENT_ENABLE_MATDBG +#include +#endif + +#include +#include #include +#include #include +#include #include +#include +#include +#include +#include #include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include namespace filament { @@ -40,71 +78,112 @@ using namespace backend; using namespace filaflat; using namespace utils; -static MaterialParser* createParser(Backend backend, const void* data, size_t size) { +static std::unique_ptr createParser(Backend const backend, + FixedCapacityVector languages, const void* data, size_t size) { // unique_ptr so we don't leak MaterialParser on failures below - auto materialParser = std::make_unique(backend, data, size); + auto materialParser = std::make_unique(languages, data, size); - MaterialParser::ParseResult materialResult = materialParser->parse(); + MaterialParser::ParseResult const materialResult = materialParser->parse(); - if (backend == Backend::NOOP) { - return materialParser.release(); + if (UTILS_UNLIKELY(materialResult == MaterialParser::ParseResult::ERROR_MISSING_BACKEND)) { + std::string languageNames; + for (auto it = languages.begin(); it != languages.end(); ++it) { + languageNames.append(shaderLanguageToString(*it)); + if (std::next(it) != languages.end()) { + languageNames.append(", "); + } + } + + FILAMENT_CHECK_PRECONDITION( + materialResult != MaterialParser::ParseResult::ERROR_MISSING_BACKEND) + << "the material was not built for any of the " << backendToString(backend) + << " backend's supported shader languages (" << languageNames.c_str() << ")\n"; } - ASSERT_PRECONDITION(materialResult != MaterialParser::ParseResult::ERROR_MISSING_BACKEND, - "the material was not built for the %s backend\n", backendToString(backend)); + if (backend == Backend::NOOP) { + return materialParser; + } - ASSERT_PRECONDITION(materialResult == MaterialParser::ParseResult::SUCCESS, - "could not parse the material package"); + FILAMENT_CHECK_PRECONDITION(materialResult == MaterialParser::ParseResult::SUCCESS) + << "could not parse the material package"; uint32_t version = 0; materialParser->getMaterialVersion(&version); - ASSERT_PRECONDITION(version == MATERIAL_VERSION, - "Material version mismatch. Expected %d but received %d.", MATERIAL_VERSION, version); + FILAMENT_CHECK_PRECONDITION(version == MATERIAL_VERSION) + << "Material version mismatch. Expected " << MATERIAL_VERSION << " but received " + << version << "."; assert_invariant(backend != Backend::DEFAULT && "Default backend has not been resolved."); - return materialParser.release(); + return materialParser; } struct Material::BuilderDetails { const void* mPayload = nullptr; size_t mSize = 0; - MaterialParser* mMaterialParser = nullptr; bool mDefaultMaterial = false; + int32_t mShBandsCount = 3; + Builder::ShadowSamplingQuality mShadowSamplingQuality = Builder::ShadowSamplingQuality::LOW; + std::unordered_map< + CString, + std::variant, + CString::Hasher> mConstantSpecializations; }; -FMaterial::DefaultMaterialBuilder::DefaultMaterialBuilder() : Material::Builder() { +FMaterial::DefaultMaterialBuilder::DefaultMaterialBuilder() { mImpl->mDefaultMaterial = true; } using BuilderType = Material; BuilderType::Builder::Builder() noexcept = default; BuilderType::Builder::~Builder() noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder&& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder&& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder const& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder&& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder const& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder&& rhs) noexcept = default; -Material::Builder& Material::Builder::package(const void* payload, size_t size) { +Material::Builder& Material::Builder::package(const void* payload, size_t const size) { mImpl->mPayload = payload; mImpl->mSize = size; return *this; } -Material* Material::Builder::build(Engine& engine) { - std::unique_ptr materialParser{ createParser( - downcast(engine).getBackend(), mImpl->mPayload, mImpl->mSize) }; +Material::Builder& Material::Builder::sphericalHarmonicsBandCount(size_t const shBandCount) noexcept { + mImpl->mShBandsCount = math::clamp(shBandCount, size_t(1), size_t(3)); + return *this; +} + +Material::Builder& Material::Builder::shadowSamplingQuality(ShadowSamplingQuality const quality) noexcept { + mImpl->mShadowSamplingQuality = quality; + return *this; +} + +template +Material::Builder& Material::Builder::constant(const char* name, size_t nameLength, T value) { + FILAMENT_CHECK_PRECONDITION(name != nullptr) << "name cannot be null"; + mImpl->mConstantSpecializations[{name, nameLength}] = value; + return *this; +} + +template Material::Builder& Material::Builder::constant(const char*, size_t, int32_t); +template Material::Builder& Material::Builder::constant(const char*, size_t, float); +template Material::Builder& Material::Builder::constant(const char*, size_t, bool); - if (materialParser == nullptr) { +Material* Material::Builder::build(Engine& engine) const { + std::unique_ptr materialParser = createParser( + downcast(engine).getBackend(), downcast(engine).getShaderLanguage(), + mImpl->mPayload, mImpl->mSize); + + if (!materialParser) { return nullptr; } uint32_t v = 0; materialParser->getShaderModels(&v); - utils::bitset32 shaderModels; + bitset32 shaderModels; shaderModels.setValue(v); - ShaderModel shaderModel = downcast(engine).getShaderModel(); + ShaderModel const shaderModel = downcast(engine).getShaderModel(); if (!shaderModels.test(static_cast(shaderModel))) { CString name; materialParser->getName(&name); @@ -122,58 +201,79 @@ Material* Material::Builder::build(Engine& engine) { return nullptr; } - mImpl->mMaterialParser = materialParser.release(); + // Print a warning if the material's stereo type doesn't align with the engine's setting. + MaterialDomain materialDomain; + UserVariantFilterMask variantFilterMask; + materialParser->getMaterialDomain(&materialDomain); + materialParser->getMaterialVariantFilterMask(&variantFilterMask); + bool const hasStereoVariants = !(variantFilterMask & UserVariantFilterMask(UserVariantFilterBit::STE)); + if (materialDomain == MaterialDomain::SURFACE && hasStereoVariants) { + StereoscopicType const engineStereoscopicType = engine.getConfig().stereoscopicType; + // Default materials are always compiled with either 'instanced' or 'multiview'. + // So, we only verify compatibility if the engine is set up for stereo. + if (engineStereoscopicType != StereoscopicType::NONE) { + StereoscopicType materialStereoscopicType = StereoscopicType::NONE; + materialParser->getStereoscopicType(&materialStereoscopicType); + if (materialStereoscopicType != engineStereoscopicType) { + CString name; + materialParser->getName(&name); + slog.w << "The stereoscopic type in the compiled material '" << name.c_str_safe() + << "' is " << (int)materialStereoscopicType + << ", which is not compatiable with the engine's setting " + << (int)engineStereoscopicType << "." << io::endl; + } + } + } - return downcast(engine).createMaterial(*this); + return downcast(engine).createMaterial(*this, std::move(materialParser)); } -FMaterial::FMaterial(FEngine& engine, const Material::Builder& builder) - : mEngine(engine), - mMaterialId(engine.getMaterialId()) -{ - MaterialParser* parser = builder->mMaterialParser; - mMaterialParser = parser; +FMaterial::FMaterial(FEngine& engine, const Builder& builder, + std::unique_ptr materialParser) + : mIsDefaultMaterial(builder->mDefaultMaterial), + mEngine(engine), + mMaterialId(engine.getMaterialId()), + mMaterialParser(std::move(materialParser)) { + MaterialParser* const parser = mMaterialParser.get(); - UTILS_UNUSED_IN_RELEASE bool nameOk = parser->getName(&mName); + UTILS_UNUSED_IN_RELEASE bool const nameOk = parser->getName(&mName); assert_invariant(nameOk); - uint8_t featureLevel = 1; - parser->getFeatureLevel(&featureLevel); - assert_invariant(featureLevel <= 3); - mFeatureLevel = [featureLevel]() -> FeatureLevel { - switch (featureLevel) { - default: - case 1: return FeatureLevel::FEATURE_LEVEL_1; - case 2: return FeatureLevel::FEATURE_LEVEL_2; - case 3: return FeatureLevel::FEATURE_LEVEL_3; + mFeatureLevel = [parser]() -> FeatureLevel { + // code written this way so the IDE will complain when/if we add a FeatureLevel + uint8_t level = 1; + parser->getFeatureLevel(&level); + assert_invariant(level <= 3); + FeatureLevel featureLevel = FeatureLevel::FEATURE_LEVEL_1; + switch (FeatureLevel(level)) { + case FeatureLevel::FEATURE_LEVEL_0: + case FeatureLevel::FEATURE_LEVEL_1: + case FeatureLevel::FEATURE_LEVEL_2: + case FeatureLevel::FEATURE_LEVEL_3: + featureLevel = FeatureLevel(level); + break; } + return featureLevel; }(); UTILS_UNUSED_IN_RELEASE bool success; + success = parser->getCacheId(&mCacheId); + assert_invariant(success); + success = parser->getSIB(&mSamplerInterfaceBlock); assert_invariant(success); success = parser->getUIB(&mUniformInterfaceBlock); assert_invariant(success); - // read the uniform binding list - utils::FixedCapacityVector> uniformBlockBindings; - success = parser->getUniformBlockBindings(&mUniformBlockBindings); - assert_invariant(success || mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_2); + if (UTILS_UNLIKELY(parser->getShaderLanguage() == ShaderLanguage::ESSL1)) { + success = parser->getAttributeInfo(&mAttributeInfo); + assert_invariant(success); - success = parser->getSamplerBlockBindings( - &mSamplerGroupBindingInfoList, &mSamplerBindingToNameMap); - assert_invariant(success); - -#if FILAMENT_ENABLE_MATDBG - // Register the material with matdbg. - matdbg::DebugServer* server = downcast(engine).debug.server; - if (UTILS_UNLIKELY(server)) { - auto details = builder.mImpl; - mDebuggerId = server->addMaterial(mName, details->mPayload, details->mSize, this); + success = parser->getBindingUniformInfo(&mBindingUniformInfo); + assert_invariant(success); } -#endif // Older materials will not have a subpass chunk; this should not be an error. if (!parser->getSubpasses(&mSubpassInfo)) { @@ -182,26 +282,17 @@ FMaterial::FMaterial(FEngine& engine, const Material::Builder& builder) parser->getShading(&mShading); parser->getMaterialProperties(&mMaterialProperties); - parser->getBlendingMode(&mBlendingMode); parser->getInterpolation(&mInterpolation); parser->getVertexDomain(&mVertexDomain); parser->getMaterialDomain(&mMaterialDomain); + parser->getMaterialVariantFilterMask(&mVariantFilterMask); parser->getRequiredAttributes(&mRequiredAttributes); parser->getRefractionMode(&mRefractionMode); parser->getRefractionType(&mRefractionType); parser->getReflectionMode(&mReflectionMode); - - if (mBlendingMode == BlendingMode::MASKED) { - parser->getMaskThreshold(&mMaskThreshold); - } - - // The fade blending mode only affects shading. For proper sorting we need to - // treat this blending mode as a regular transparent blending operation. - if (UTILS_UNLIKELY(mBlendingMode == BlendingMode::FADE)) { - mRenderBlendingMode = BlendingMode::TRANSPARENT; - } else { - mRenderBlendingMode = mBlendingMode; - } + parser->getTransparencyMode(&mTransparencyMode); + parser->getDoubleSided(&mDoubleSided); + parser->getCullingMode(&mCullingMode); if (mShading == Shading::UNLIT) { parser->hasShadowMultiplier(&mHasShadowMultiplier); @@ -209,68 +300,19 @@ FMaterial::FMaterial(FEngine& engine, const Material::Builder& builder) mIsVariantLit = mShading != Shading::UNLIT || mHasShadowMultiplier; - // create raster state - using BlendFunction = RasterState::BlendFunction; - using DepthFunc = RasterState::DepthFunc; - switch (mBlendingMode) { - // Do not change the MASKED behavior without checking for regressions with - // AlphaBlendModeTest and TextureLinearInterpolationTest, with and without - // View::BlendMode::TRANSLUCENT. - case BlendingMode::MASKED: - case BlendingMode::OPAQUE: - mRasterState.blendFunctionSrcRGB = BlendFunction::ONE; - mRasterState.blendFunctionSrcAlpha = BlendFunction::ONE; - mRasterState.blendFunctionDstRGB = BlendFunction::ZERO; - mRasterState.blendFunctionDstAlpha = BlendFunction::ZERO; - mRasterState.depthWrite = true; - break; - case BlendingMode::TRANSPARENT: - case BlendingMode::FADE: - mRasterState.blendFunctionSrcRGB = BlendFunction::ONE; - mRasterState.blendFunctionSrcAlpha = BlendFunction::ONE; - mRasterState.blendFunctionDstRGB = BlendFunction::ONE_MINUS_SRC_ALPHA; - mRasterState.blendFunctionDstAlpha = BlendFunction::ONE_MINUS_SRC_ALPHA; - mRasterState.depthWrite = false; - break; - case BlendingMode::ADD: - mRasterState.blendFunctionSrcRGB = BlendFunction::ONE; - mRasterState.blendFunctionSrcAlpha = BlendFunction::ONE; - mRasterState.blendFunctionDstRGB = BlendFunction::ONE; - mRasterState.blendFunctionDstAlpha = BlendFunction::ONE; - mRasterState.depthWrite = false; - break; - case BlendingMode::MULTIPLY: - mRasterState.blendFunctionSrcRGB = BlendFunction::ZERO; - mRasterState.blendFunctionSrcAlpha = BlendFunction::ZERO; - mRasterState.blendFunctionDstRGB = BlendFunction::SRC_COLOR; - mRasterState.blendFunctionDstAlpha = BlendFunction::SRC_COLOR; - mRasterState.depthWrite = false; - break; - case BlendingMode::SCREEN: - mRasterState.blendFunctionSrcRGB = BlendFunction::ONE; - mRasterState.blendFunctionSrcAlpha = BlendFunction::ONE; - mRasterState.blendFunctionDstRGB = BlendFunction::ONE_MINUS_SRC_COLOR; - mRasterState.blendFunctionDstAlpha = BlendFunction::ONE_MINUS_SRC_COLOR; - mRasterState.depthWrite = false; - break; - } + // color write + bool colorWrite = false; + parser->getColorWrite(&colorWrite); + mRasterState.colorWrite = colorWrite; - bool depthWriteSet = false; - parser->getDepthWriteSet(&depthWriteSet); - if (depthWriteSet) { - bool depthWrite = false; - parser->getDepthWrite(&depthWrite); - mRasterState.depthWrite = depthWrite; - } + // depth test + bool depthTest = false; + parser->getDepthTest(&depthTest); + mRasterState.depthFunc = depthTest ? RasterState::DepthFunc::GE : RasterState::DepthFunc::A; // if doubleSided() was called we override culling() bool doubleSideSet = false; parser->getDoubleSidedSet(&doubleSideSet); - parser->getDoubleSided(&mDoubleSided); - parser->getCullingMode(&mCullingMode); - bool depthTest = false; - parser->getDepthTest(&depthTest); - if (doubleSideSet) { mDoubleSidedCapability = true; mRasterState.culling = mDoubleSided ? CullingMode::NONE : mCullingMode; @@ -278,65 +320,154 @@ FMaterial::FMaterial(FEngine& engine, const Material::Builder& builder) mRasterState.culling = mCullingMode; } - parser->getTransparencyMode(&mTransparencyMode); - parser->hasCustomDepthShader(&mHasCustomDepthShader); - mIsDefaultMaterial = builder->mDefaultMaterial; - - // pre-cache the shared variants -- these variants are shared with the default material. - if (UTILS_UNLIKELY(!mIsDefaultMaterial && !mHasCustomDepthShader)) { - auto& cachedPrograms = mCachedPrograms; - for (Variant::type_t k = 0, n = VARIANT_COUNT; k < n; ++k) { - const Variant variant(k); - if (Variant::isValidDepthVariant(variant)) { - FMaterial const* const pMaterial = engine.getDefaultMaterial(); - pMaterial->prepareProgram(variant); - cachedPrograms[k] = pMaterial->getProgram(variant); - } - } - } - - bool colorWrite = false; - parser->getColorWrite(&colorWrite); - mRasterState.colorWrite = colorWrite; - mRasterState.depthFunc = depthTest ? DepthFunc::GE : DepthFunc::A; - mRasterState.alphaToCoverage = mBlendingMode == BlendingMode::MASKED; - + // specular anti-aliasing parser->hasSpecularAntiAliasing(&mSpecularAntiAliasing); if (mSpecularAntiAliasing) { parser->getSpecularAntiAliasingVariance(&mSpecularAntiAliasingVariance); parser->getSpecularAntiAliasingThreshold(&mSpecularAntiAliasingThreshold); } - // we can only initialize the default instance once we're initialized ourselves - mDefaultInstance.initDefaultInstance(engine, this); + parser->hasCustomDepthShader(&mHasCustomDepthShader); + + mPerViewLayoutIndex = ColorPassDescriptorSet::getIndex( + mIsVariantLit, + mReflectionMode == ReflectionMode::SCREEN_SPACE || + mRefractionMode == RefractionMode::SCREEN_SPACE, + !(mVariantFilterMask & +UserVariantFilterBit::FOG)); + + processBlendingMode(parser); + processSpecializationConstants(engine, builder, parser); + processPushConstants(engine, parser); + processDescriptorSets(engine, parser); + precacheDepthVariants(engine); + +#if FILAMENT_ENABLE_MATDBG + // Register the material with matdbg. + matdbg::DebugServer* server = downcast(engine).debug.server; + if (UTILS_UNLIKELY(server)) { + auto const details = builder.mImpl; + mDebuggerId = server->addMaterial(mName, details->mPayload, details->mSize, this); + } +#endif } -FMaterial::~FMaterial() noexcept { - delete mMaterialParser; +FMaterial::~FMaterial() noexcept = default; + +void FMaterial::invalidate(Variant::type_t variantMask, Variant::type_t variantValue) noexcept { + // Note: This API is not public at the moment, so it's okay to have some debugging logs + // and extra checks. + if (mMaterialDomain == MaterialDomain::SURFACE && + !mIsDefaultMaterial && + !mHasCustomDepthShader) { + // it would be unsafe to invalidate any of the cached depth variant + if (UTILS_UNLIKELY(!((variantMask & Variant::DEP) && !(variantValue & Variant::DEP)))) { + slog.w << io::hex << "FMaterial::invalidate(" + << +variantMask << ", " << +variantValue + << ") would corrupt the depth variant cache" << io::endl; + } + variantMask |= Variant::DEP; + variantValue &= ~Variant::DEP; + } + destroyPrograms(mEngine, variantMask, variantValue); } void FMaterial::terminate(FEngine& engine) { + if (mDefaultMaterialInstance) { + mDefaultMaterialInstance->setDefaultInstance(false); + engine.destroy(mDefaultMaterialInstance); + mDefaultMaterialInstance = nullptr; + } + + // ensure we've destroyed all instances before destroying the material + auto const& materialInstanceResourceList = engine.getMaterialInstanceResourceList(); + auto pos = materialInstanceResourceList.find(this); + if (UTILS_LIKELY(pos != materialInstanceResourceList.cend())) { + FILAMENT_CHECK_PRECONDITION(pos->second.empty()) + << "destroying material \"" << this->getName().c_str_safe() << "\" but " + << pos->second.size() << " instances still alive."; + } + + #if FILAMENT_ENABLE_MATDBG // Unregister the material with matdbg. - matdbg::DebugServer* server = downcast(mEngine).debug.server; + matdbg::DebugServer* server = engine.debug.server; if (UTILS_UNLIKELY(server)) { server->removeMaterial(mDebuggerId); } #endif destroyPrograms(engine); - mDefaultInstance.terminate(engine); + + DriverApi& driver = engine.getDriverApi(); + mPerViewDescriptorSetLayout.terminate(engine.getDescriptorSetLayoutFactory(), driver); + mDescriptorSetLayout.terminate(engine.getDescriptorSetLayoutFactory(), driver); +} + +void FMaterial::compile(CompilerPriorityQueue const priority, + UserVariantFilterMask variantSpec, + CallbackHandler* handler, + Invocable&& callback) noexcept { + + // Turn off the STE variant if stereo is not supported. + if (!mEngine.getDriverApi().isStereoSupported()) { + variantSpec &= ~UserVariantFilterMask(UserVariantFilterBit::STE); + } + + UserVariantFilterMask const variantFilter = + ~variantSpec & UserVariantFilterMask(UserVariantFilterBit::ALL); + + if (UTILS_LIKELY(mEngine.getDriverApi().isParallelShaderCompileSupported())) { + auto const& variants = isVariantLit() ? + VariantUtils::getLitVariants() : VariantUtils::getUnlitVariants(); + for (auto const variant: variants) { + if (!variantFilter || variant == Variant::filterUserVariant(variant, variantFilter)) { + if (hasVariant(variant)) { + prepareProgram(variant, priority); + } + } + } + } + + if (callback) { + struct Callback { + Invocable f; + Material* m; + static void func(void* user) { + auto* const c = static_cast(user); + c->f(c->m); + delete c; + } + }; + auto* const user = new(std::nothrow) Callback{ std::move(callback), this }; + mEngine.getDriverApi().compilePrograms(priority, handler, &Callback::func, static_cast(user)); + } else { + mEngine.getDriverApi().compilePrograms(priority, nullptr, nullptr, nullptr); + } } FMaterialInstance* FMaterial::createInstance(const char* name) const noexcept { - return FMaterialInstance::duplicate(&mDefaultInstance, name); + if (mDefaultMaterialInstance) { + // if we have a default instance, use it to create a new one + return FMaterialInstance::duplicate(mDefaultMaterialInstance, name); + } else { + // but if we don't, just create an instance with all the default parameters + return mEngine.createMaterialInstance(this, name); + } +} + +FMaterialInstance* FMaterial::getDefaultInstance() noexcept { + if (UTILS_UNLIKELY(!mDefaultMaterialInstance)) { + mDefaultMaterialInstance = mEngine.createMaterialInstance(this, mName.c_str()); + mDefaultMaterialInstance->setDefaultInstance(true); + } + return mDefaultMaterialInstance; } bool FMaterial::hasParameter(const char* name) const noexcept { return mUniformInterfaceBlock.hasField(name) || mSamplerInterfaceBlock.hasSampler(name) || - mSubpassInfo.name == utils::CString(name); + mSubpassInfo.name == CString(name); } bool FMaterial::isSampler(const char* name) const noexcept { @@ -344,18 +475,43 @@ bool FMaterial::isSampler(const char* name) const noexcept { } BufferInterfaceBlock::FieldInfo const* FMaterial::reflect( - std::string_view name) const noexcept { + std::string_view const name) const noexcept { return mUniformInterfaceBlock.getFieldInfo(name); } -void FMaterial::prepareProgramSlow(Variant variant) const noexcept { +bool FMaterial::hasVariant(Variant const variant) const noexcept { + Variant vertexVariant, fragmentVariant; + switch (getMaterialDomain()) { + case MaterialDomain::SURFACE: + vertexVariant = Variant::filterVariantVertex(variant); + fragmentVariant = Variant::filterVariantFragment(variant); + break; + case MaterialDomain::POST_PROCESS: + vertexVariant = fragmentVariant = variant; + break; + case MaterialDomain::COMPUTE: + // TODO: implement MaterialDomain::COMPUTE + return false; + } + const ShaderModel sm = mEngine.getShaderModel(); + if (!mMaterialParser->hasShader(sm, vertexVariant, ShaderStage::VERTEX)) { + return false; + } + if (!mMaterialParser->hasShader(sm, fragmentVariant, ShaderStage::FRAGMENT)) { + return false; + } + return true; +} + +void FMaterial::prepareProgramSlow(Variant const variant, + backend::CompilerPriorityQueue const priorityQueue) const noexcept { assert_invariant(mEngine.hasFeatureLevel(mFeatureLevel)); switch (getMaterialDomain()) { case MaterialDomain::SURFACE: - getSurfaceProgramSlow(variant); + getSurfaceProgramSlow(variant, priorityQueue); break; case MaterialDomain::POST_PROCESS: - getPostProcessProgramSlow(variant); + getPostProcessProgramSlow(variant, priorityQueue); break; case MaterialDomain::COMPUTE: // TODO: implement MaterialDomain::COMPUTE @@ -363,97 +519,137 @@ void FMaterial::prepareProgramSlow(Variant variant) const noexcept { } } -void FMaterial::getSurfaceProgramSlow(Variant variant) const noexcept { +void FMaterial::getSurfaceProgramSlow(Variant const variant, + CompilerPriorityQueue const priorityQueue) const noexcept { // filterVariant() has already been applied in generateCommands(), shouldn't be needed here // if we're unlit, we don't have any bits that correspond to lit materials assert_invariant(variant == Variant::filterVariant(variant, isVariantLit()) ); assert_invariant(!Variant::isReserved(variant)); - Variant vertexVariant = Variant::filterVariantVertex(variant); - Variant fragmentVariant = Variant::filterVariantFragment(variant); + Variant const vertexVariant = Variant::filterVariantVertex(variant); + Variant const fragmentVariant = Variant::filterVariantFragment(variant); - Program pb{ getProgramBuilderWithVariants(variant, vertexVariant, fragmentVariant) }; + Program pb{ getProgramWithVariants(variant, vertexVariant, fragmentVariant) }; + pb.priorityQueue(priorityQueue); + pb.multiview( + mEngine.getConfig().stereoscopicType == StereoscopicType::MULTIVIEW && + Variant::isStereoVariant(variant)); createAndCacheProgram(std::move(pb), variant); } -void FMaterial::getPostProcessProgramSlow(Variant variant) const noexcept { - Program pb{ getProgramBuilderWithVariants(variant, variant, variant) }; +void FMaterial::getPostProcessProgramSlow(Variant const variant, + CompilerPriorityQueue const priorityQueue) const noexcept { + Program pb{ getProgramWithVariants(variant, variant, variant) }; + pb.priorityQueue(priorityQueue); createAndCacheProgram(std::move(pb), variant); } -Program FMaterial::getProgramBuilderWithVariants( +Program FMaterial::getProgramWithVariants( Variant variant, Variant vertexVariant, Variant fragmentVariant) const noexcept { - const ShaderModel sm = mEngine.getShaderModel(); - const bool isNoop = mEngine.getBackend() == Backend::NOOP; - + FEngine const& engine = mEngine; + const ShaderModel sm = engine.getShaderModel(); + const bool isNoop = engine.getBackend() == Backend::NOOP; /* * Vertex shader */ - ShaderContent& vsBuilder = mEngine.getVertexShaderContent(); + ShaderContent& vsBuilder = engine.getVertexShaderContent(); - UTILS_UNUSED_IN_RELEASE bool vsOK = mMaterialParser->getShader(vsBuilder, sm, + UTILS_UNUSED_IN_RELEASE bool const vsOK = mMaterialParser->getShader(vsBuilder, sm, vertexVariant, ShaderStage::VERTEX); - ASSERT_POSTCONDITION(isNoop || (vsOK && !vsBuilder.empty()), - "The material '%s' has not been compiled to include the required " - "GLSL or SPIR-V chunks for the vertex shader (variant=0x%x, filtered=0x%x).", - mName.c_str(), variant.key, vertexVariant.key); + FILAMENT_CHECK_POSTCONDITION(isNoop || (vsOK && !vsBuilder.empty())) + << "The material '" << mName.c_str() + << "' has not been compiled to include the required GLSL or SPIR-V chunks for the " + "vertex shader (variant=" + << +variant.key << ", filtered=" << +vertexVariant.key << ")."; /* * Fragment shader */ - ShaderContent& fsBuilder = mEngine.getFragmentShaderContent(); + ShaderContent& fsBuilder = engine.getFragmentShaderContent(); - UTILS_UNUSED_IN_RELEASE bool fsOK = mMaterialParser->getShader(fsBuilder, sm, + UTILS_UNUSED_IN_RELEASE bool const fsOK = mMaterialParser->getShader(fsBuilder, sm, fragmentVariant, ShaderStage::FRAGMENT); - ASSERT_POSTCONDITION(isNoop || (fsOK && !fsBuilder.empty()), - "The material '%s' has not been compiled to include the required " - "GLSL or SPIR-V chunks for the fragment shader (variant=0x%x, filtered=0x%x).", - mName.c_str(), variant.key, fragmentVariant.key); + FILAMENT_CHECK_POSTCONDITION(isNoop || (fsOK && !fsBuilder.empty())) + << "The material '" << mName.c_str() + << "' has not been compiled to include the required GLSL or SPIR-V chunks for the " + "fragment shader (variant=" + << +variant.key << ", filtered=" << +fragmentVariant.key << ")."; Program program; program.shader(ShaderStage::VERTEX, vsBuilder.data(), vsBuilder.size()) - .shader(ShaderStage::FRAGMENT, fsBuilder.data(), fsBuilder.size()) - .uniformBlockBindings(mUniformBlockBindings) - .diagnostics(mName, - [this, variant](io::ostream& out) -> io::ostream& { - return out << mName.c_str_safe() - << ", variant=(" << io::hex << variant.key << io::dec << ")"; + .shader(ShaderStage::FRAGMENT, fsBuilder.data(), fsBuilder.size()) + .shaderLanguage(mMaterialParser->getShaderLanguage()) + .diagnostics(mName, + [this, variant, vertexVariant, fragmentVariant]( + io::ostream& out) -> io::ostream& { + return out << mName.c_str_safe() << ", variant=(" << io::hex + << +variant.key << io::dec << "), vertexVariant=(" << io::hex + << +vertexVariant.key << io::dec << "), fragmentVariant=(" + << io::hex << +fragmentVariant.key << io::dec << ")"; }); - UTILS_NOUNROLL - for (size_t i = 0; i < Enum::count(); i++) { - SamplerBindingPoints bindingPoint = (SamplerBindingPoints)i; - auto const& info = mSamplerGroupBindingInfoList[i]; - if (info.count) { - std::array samplers{}; - for (size_t j = 0, c = info.count; j < c; ++j) { - uint8_t binding = info.bindingOffset + j; - samplers[j] = { mSamplerBindingToNameMap[binding], binding }; - } - program.setSamplerGroup(+bindingPoint, info.shaderStageFlags, - samplers.data(), info.count); + if (UTILS_UNLIKELY(mMaterialParser->getShaderLanguage() == ShaderLanguage::ESSL1)) { + assert_invariant(!mBindingUniformInfo.empty()); + for (auto const& [index, name, uniforms] : mBindingUniformInfo) { + program.uniforms(uint32_t(index), name, uniforms); } + program.attributes(mAttributeInfo); } - program.specializationConstants({ - { 0, (int)mEngine.getSupportedFeatureLevel() }, - { 1, (int)CONFIG_MAX_INSTANCES } - }); + program.descriptorBindings(0, mProgramDescriptorBindings[0]); + program.descriptorBindings(1, mProgramDescriptorBindings[1]); + program.descriptorBindings(2, mProgramDescriptorBindings[2]); + program.specializationConstants(mSpecializationConstants); + + program.pushConstants(ShaderStage::VERTEX, mPushConstants[uint8_t(ShaderStage::VERTEX)]); + program.pushConstants(ShaderStage::FRAGMENT, mPushConstants[uint8_t(ShaderStage::FRAGMENT)]); + + program.cacheId(hash::combine(size_t(mCacheId), variant.key)); return program; } -void FMaterial::createAndCacheProgram(Program&& p, Variant variant) const noexcept { - auto program = mEngine.getDriverApi().createProgram(std::move(p)); +void FMaterial::createAndCacheProgram(Program&& p, Variant const variant) const noexcept { + FEngine const& engine = mEngine; + DriverApi& driverApi = mEngine.getDriverApi(); + + bool const isShared = isSharedVariant(variant); + + // Check if the default material has this program cached + if (isShared) { + FMaterial const* const pDefaultMaterial = engine.getDefaultMaterial(); + if (pDefaultMaterial) { + auto const program = pDefaultMaterial->mCachedPrograms[variant.key]; + if (program) { + mCachedPrograms[variant.key] = program; + return; + } + } + } + + auto const program = driverApi.createProgram(std::move(p)); + driverApi.setDebugTag(program.getId(), mName); assert_invariant(program); mCachedPrograms[variant.key] = program; + + // If the default material doesn't already have this program cached, and all caching conditions + // are met (Surface Domain and no custom depth shader), cache it now. + // New Materials will inherit these program automatically. + if (isShared) { + FMaterial const* const pDefaultMaterial = engine.getDefaultMaterial(); + if (pDefaultMaterial && !pDefaultMaterial->mCachedPrograms[variant.key]) { + // set the tag to the default material name + driverApi.setDebugTag(program.getId(), mName); + pDefaultMaterial->mCachedPrograms[variant.key] = program; + } + } } size_t FMaterial::getParameters(ParameterInfo* parameters, size_t count) const noexcept { @@ -461,7 +657,7 @@ size_t FMaterial::getParameters(ParameterInfo* parameters, size_t count) const n const auto& uniforms = mUniformInterfaceBlock.getFieldInfoList(); size_t i = 0; - size_t uniformCount = std::min(count, size_t(uniforms.size())); + size_t const uniformCount = std::min(count, size_t(uniforms.size())); for ( ; i < uniformCount; i++) { ParameterInfo& info = parameters[i]; const auto& uniformInfo = uniforms[i]; @@ -474,7 +670,7 @@ size_t FMaterial::getParameters(ParameterInfo* parameters, size_t count) const n } const auto& samplers = mSamplerInterfaceBlock.getSamplerInfoList(); - size_t samplerCount = samplers.size(); + size_t const samplerCount = samplers.size(); for (size_t j = 0; i < count && j < samplerCount; i++, j++) { ParameterInfo& info = parameters[i]; const auto& samplerInfo = samplers[j]; @@ -494,12 +690,13 @@ size_t FMaterial::getParameters(ParameterInfo* parameters, size_t count) const n info.subpassType = mSubpassInfo.type; info.count = 1; info.precision = mSubpassInfo.precision; - i++; } return count; } +#if FILAMENT_ENABLE_MATDBG + // Swaps in an edited version of the original package that was used to create the material. The // edited package was stashed in response to a debugger event. This is invoked only when the // Material Debugger is attached. The only editable features of a material package are the shader @@ -507,13 +704,23 @@ size_t FMaterial::getParameters(ParameterInfo* parameters, size_t count) const n void FMaterial::applyPendingEdits() noexcept { const char* name = mName.c_str(); slog.d << "Applying edits to " << (name ? name : "(untitled)") << io::endl; - destroyPrograms(mEngine); - for (auto& program : mCachedPrograms) { - program.clear(); - } - delete mMaterialParser; - mMaterialParser = mPendingEdits; - mPendingEdits = nullptr; + destroyPrograms(mEngine); // FIXME: this will not destroy the shared variants + latchPendingEdits(); +} + +void FMaterial::setPendingEdits(std::unique_ptr pendingEdits) noexcept { + std::lock_guard const lock(mPendingEditsLock); + std::swap(pendingEdits, mPendingEdits); +} + +bool FMaterial::hasPendingEdits() const noexcept { + std::lock_guard const lock(mPendingEditsLock); + return bool(mPendingEdits); +} + +void FMaterial::latchPendingEdits() noexcept { + std::lock_guard const lock(mPendingEditsLock); + mMaterialParser = std::move(mPendingEdits); } /** @@ -523,45 +730,424 @@ void FMaterial::applyPendingEdits() noexcept { * @{ */ -#if FILAMENT_ENABLE_MATDBG - -void FMaterial::onEditCallback(void* userdata, const utils::CString& name, const void* packageData, - size_t packageSize) { - FMaterial* material = downcast((Material*) userdata); - FEngine& engine = material->mEngine; +void FMaterial::onEditCallback(void* userdata, const CString&, const void* packageData, + size_t const packageSize) { + FMaterial* material = downcast(static_cast(userdata)); + FEngine const& engine = material->mEngine; // This is called on a web server thread, so we defer clearing the program cache // and swapping out the MaterialParser until the next getProgram call. - material->mPendingEdits = createParser(engine.getBackend(), packageData, packageSize); + std::unique_ptr pending = createParser( + engine.getBackend(), engine.getShaderLanguage(), packageData, packageSize); + material->setPendingEdits(std::move(pending)); } -void FMaterial::onQueryCallback(void* userdata, VariantList* pVariants) { - FMaterial* material = downcast((Material*) userdata); - std::lock_guard lock(material->mActiveProgramsLock); - *pVariants = material->mActivePrograms; +void FMaterial::onQueryCallback(void* userdata, VariantList* pActiveVariants) { + FMaterial const* material = downcast(static_cast(userdata)); + std::lock_guard const lock(material->mActiveProgramsLock); + *pActiveVariants = material->mActivePrograms; material->mActivePrograms.reset(); } -#endif - /** @}*/ -void FMaterial::destroyPrograms(FEngine& engine) { +#endif // FILAMENT_ENABLE_MATDBG + + +void FMaterial::destroyPrograms(FEngine& engine, + Variant::type_t const variantMask, Variant::type_t const variantValue) { + DriverApi& driverApi = engine.getDriverApi(); auto& cachedPrograms = mCachedPrograms; - for (Variant::type_t k = 0, n = VARIANT_COUNT; k < n; ++k) { - const Variant variant(k); - if (!mIsDefaultMaterial) { - // The depth variants may be shared with the default material, in which case - // we should not free it now. - bool isSharedVariant = Variant::isValidDepthVariant(variant) && !mHasCustomDepthShader; - if (isSharedVariant) { - // we don't own this variant, skip. - continue; + + switch (mMaterialDomain) { + case MaterialDomain::SURFACE: { + if (mIsDefaultMaterial || mHasCustomDepthShader) { + // default material, or we have custom depth shaders, we destroy all variants + for (size_t k = 0, n = VARIANT_COUNT; k < n; ++k) { + if ((k & variantMask) == variantValue) { + // Only destroy if the handle is valid. Not strictly needed, but we have a lot + // of variants, and this generates traffic in the command queue. + if (cachedPrograms[k]) { + driverApi.destroyProgram(std::move(cachedPrograms[k])); + } + } + } + } else { + // The depth variants may be shared with the default material, in which case + // we should not free them now. + + // During Engine::shutdown(), auto-cleanup destroys the default material first, + // so this can be null, but this is only used for debugging. + UTILS_UNUSED_IN_RELEASE + auto const UTILS_NULLABLE pDefaultMaterial = engine.getDefaultMaterial(); + + for (size_t k = 0, n = VARIANT_COUNT; k < n; ++k) { + if ((k & variantMask) == variantValue) { + // Only destroy if the handle is valid. Not strictly needed, but we have a lot + // of variant, and this generates traffic in the command queue. + if (cachedPrograms[k]) { + if (Variant::isValidDepthVariant(Variant(k))) { + // By construction this should always be true, because this + // field is populated only when a material creates the program + // for this variant. + // During Engine::shutdown, auto-cleanup destroys the + // default material first + assert_invariant(!pDefaultMaterial || + pDefaultMaterial->mCachedPrograms[k]); + // we don't own this variant, skip, but clear the entry. + cachedPrograms[k].clear(); + continue; + } + + driverApi.destroyProgram(std::move(cachedPrograms[k])); + } + } + } + } + break; + } + case MaterialDomain::POST_PROCESS: { + for (size_t k = 0, n = POST_PROCESS_VARIANT_COUNT; k < n; ++k) { + if ((k & variantMask) == variantValue) { + // Only destroy if the handle is valid. Not strictly needed, but we have a lot + // of variant, and this generates traffic in the command queue. + if (cachedPrograms[k]) { + driverApi.destroyProgram(std::move(cachedPrograms[k])); + } + } + } + break; + } + case MaterialDomain::COMPUTE: { + // Compute programs don't have variants + driverApi.destroyProgram(std::move(cachedPrograms[0])); + break; + } + } +} + +std::optional FMaterial::getSpecializationConstantId(std::string_view const name) const noexcept { + auto const pos = mSpecializationConstantsNameToIndex.find(name); + if (pos != mSpecializationConstantsNameToIndex.end()) { + return pos->second + CONFIG_MAX_RESERVED_SPEC_CONSTANTS; + } + return std::nullopt; +} + +template +bool FMaterial::setConstant(uint32_t id, T value) noexcept { + size_t const maxId = mMaterialConstants.size() + CONFIG_MAX_RESERVED_SPEC_CONSTANTS; + if (UTILS_LIKELY(id < maxId)) { + if (id >= CONFIG_MAX_RESERVED_SPEC_CONSTANTS) { + // Constant from the material itself (as opposed to the reserved ones) + auto const& constant = mMaterialConstants[id - CONFIG_MAX_RESERVED_SPEC_CONSTANTS]; + using ConstantType = ConstantType; + switch (constant.type) { + case ConstantType::INT: + if (!std::is_same_v) return false; + break; + case ConstantType::FLOAT: + if (!std::is_same_v) return false; + break; + case ConstantType::BOOL: + if (!std::is_same_v) return false; + break; + } + } + + auto pos = std::find_if( + mSpecializationConstants.begin(), mSpecializationConstants.end(), + [id](Program::SpecializationConstant const& specializationConstant) { + return specializationConstant.id == id; + }); + if (pos != mSpecializationConstants.end()) { + if (std::get(pos->value) != value) { + pos->value = value; + return true; } + } else { + mSpecializationConstants.push_back({ id, value }); + return true; } - driverApi.destroyProgram(cachedPrograms[k]); } + return false; } +void FMaterial::processBlendingMode(MaterialParser const* const parser) { + parser->getBlendingMode(&mBlendingMode); + + if (mBlendingMode == BlendingMode::MASKED) { + parser->getMaskThreshold(&mMaskThreshold); + } + + if (mBlendingMode == BlendingMode::CUSTOM) { + parser->getCustomBlendFunction(&mCustomBlendFunctions); + } + + // blending mode + switch (mBlendingMode) { + // Do not change the MASKED behavior without checking for regressions with + // AlphaBlendModeTest and TextureLinearInterpolationTest, with and without + // View::BlendMode::TRANSLUCENT. + case BlendingMode::MASKED: + case BlendingMode::OPAQUE: + mRasterState.blendFunctionSrcRGB = BlendFunction::ONE; + mRasterState.blendFunctionSrcAlpha = BlendFunction::ONE; + mRasterState.blendFunctionDstRGB = BlendFunction::ZERO; + mRasterState.blendFunctionDstAlpha = BlendFunction::ZERO; + mRasterState.depthWrite = true; + break; + case BlendingMode::TRANSPARENT: + case BlendingMode::FADE: + mRasterState.blendFunctionSrcRGB = BlendFunction::ONE; + mRasterState.blendFunctionSrcAlpha = BlendFunction::ONE; + mRasterState.blendFunctionDstRGB = BlendFunction::ONE_MINUS_SRC_ALPHA; + mRasterState.blendFunctionDstAlpha = BlendFunction::ONE_MINUS_SRC_ALPHA; + mRasterState.depthWrite = false; + break; + case BlendingMode::ADD: + mRasterState.blendFunctionSrcRGB = BlendFunction::ONE; + mRasterState.blendFunctionSrcAlpha = BlendFunction::ONE; + mRasterState.blendFunctionDstRGB = BlendFunction::ONE; + mRasterState.blendFunctionDstAlpha = BlendFunction::ONE; + mRasterState.depthWrite = false; + break; + case BlendingMode::MULTIPLY: + mRasterState.blendFunctionSrcRGB = BlendFunction::ZERO; + mRasterState.blendFunctionSrcAlpha = BlendFunction::ZERO; + mRasterState.blendFunctionDstRGB = BlendFunction::SRC_COLOR; + mRasterState.blendFunctionDstAlpha = BlendFunction::SRC_COLOR; + mRasterState.depthWrite = false; + break; + case BlendingMode::SCREEN: + mRasterState.blendFunctionSrcRGB = BlendFunction::ONE; + mRasterState.blendFunctionSrcAlpha = BlendFunction::ONE; + mRasterState.blendFunctionDstRGB = BlendFunction::ONE_MINUS_SRC_COLOR; + mRasterState.blendFunctionDstAlpha = BlendFunction::ONE_MINUS_SRC_COLOR; + mRasterState.depthWrite = false; + break; + case BlendingMode::CUSTOM: + mRasterState.blendFunctionSrcRGB = mCustomBlendFunctions[0]; + mRasterState.blendFunctionSrcAlpha = mCustomBlendFunctions[1]; + mRasterState.blendFunctionDstRGB = mCustomBlendFunctions[2]; + mRasterState.blendFunctionDstAlpha = mCustomBlendFunctions[3]; + mRasterState.depthWrite = false; + } + + // depth write + bool depthWriteSet = false; + parser->getDepthWriteSet(&depthWriteSet); + if (depthWriteSet) { + bool depthWrite = false; + parser->getDepthWrite(&depthWrite); + mRasterState.depthWrite = depthWrite; + } + + // alpha to coverage + bool alphaToCoverageSet = false; + parser->getAlphaToCoverageSet(&alphaToCoverageSet); + if (alphaToCoverageSet) { + bool alphaToCoverage = false; + parser->getAlphaToCoverage(&alphaToCoverage); + mRasterState.alphaToCoverage = alphaToCoverage; + } else { + mRasterState.alphaToCoverage = mBlendingMode == BlendingMode::MASKED; + } +} + +void FMaterial::processSpecializationConstants(FEngine& engine, Builder const& builder, + MaterialParser const* const parser) { + // Older materials won't have a constants chunk, but that's okay. + parser->getConstants(&mMaterialConstants); + for (size_t i = 0, c = mMaterialConstants.size(); i < c; i++) { + auto& item = mMaterialConstants[i]; + // the key can be a string_view because mMaterialConstant owns the CString + std::string_view const key{ item.name.data(), item.name.size() }; + mSpecializationConstantsNameToIndex[key] = i; + } + + // Verify that all the constant specializations exist in the material and that their types match. + // The first specialization constants are defined internally by Filament. + // The subsequent constants are user-defined in the material. + + // Feature level 0 doesn't support instancing + int const maxInstanceCount = (engine.getActiveFeatureLevel() == FeatureLevel::FEATURE_LEVEL_0) + ? 1 : CONFIG_MAX_INSTANCES; + + int const maxFroxelBufferHeight = int(std::min( + FROXEL_BUFFER_MAX_ENTRY_COUNT / 4, + engine.getDriverApi().getMaxUniformBufferSize() / 16u)); + + bool const staticTextureWorkaround = + engine.getDriverApi().isWorkaroundNeeded(Workaround::METAL_STATIC_TEXTURE_TARGET_ERROR); + + bool const powerVrShaderWorkarounds = + engine.getDriverApi().isWorkaroundNeeded(Workaround::POWER_VR_SHADER_WORKAROUNDS); + + mSpecializationConstants.reserve(mMaterialConstants.size() + CONFIG_MAX_RESERVED_SPEC_CONSTANTS); + mSpecializationConstants.push_back({ + +ReservedSpecializationConstants::BACKEND_FEATURE_LEVEL, + int(engine.getSupportedFeatureLevel()) }); + mSpecializationConstants.push_back({ + +ReservedSpecializationConstants::CONFIG_MAX_INSTANCES, + int(maxInstanceCount) }); + mSpecializationConstants.push_back({ + +ReservedSpecializationConstants::CONFIG_FROXEL_BUFFER_HEIGHT, + int(maxFroxelBufferHeight) }); + mSpecializationConstants.push_back({ + +ReservedSpecializationConstants::CONFIG_DEBUG_DIRECTIONAL_SHADOWMAP, + engine.debug.shadowmap.debug_directional_shadowmap }); + mSpecializationConstants.push_back({ + +ReservedSpecializationConstants::CONFIG_DEBUG_FROXEL_VISUALIZATION, + engine.debug.lighting.debug_froxel_visualization }); + mSpecializationConstants.push_back({ + +ReservedSpecializationConstants::CONFIG_STATIC_TEXTURE_TARGET_WORKAROUND, + staticTextureWorkaround }); + mSpecializationConstants.push_back({ + +ReservedSpecializationConstants::CONFIG_POWER_VR_SHADER_WORKAROUNDS, + powerVrShaderWorkarounds }); + mSpecializationConstants.push_back({ + +ReservedSpecializationConstants::CONFIG_STEREO_EYE_COUNT, + int(engine.getConfig().stereoscopicEyeCount) }); + mSpecializationConstants.push_back({ + +ReservedSpecializationConstants::CONFIG_SH_BANDS_COUNT, + builder->mShBandsCount }); + mSpecializationConstants.push_back({ + +ReservedSpecializationConstants::CONFIG_SHADOW_SAMPLING_METHOD, + int32_t(builder->mShadowSamplingQuality) }); + if (UTILS_UNLIKELY(parser->getShaderLanguage() == ShaderLanguage::ESSL1)) { + // The actual value of this spec-constant is set in the OpenGLDriver backend. + mSpecializationConstants.push_back({ + +ReservedSpecializationConstants::CONFIG_SRGB_SWAPCHAIN_EMULATION, + false}); + } + + for (auto const& [name, value] : builder->mConstantSpecializations) { + std::string_view const key{ name.data(), name.size() }; + auto pos = mSpecializationConstantsNameToIndex.find(key); + FILAMENT_CHECK_PRECONDITION(pos != mSpecializationConstantsNameToIndex.end()) + << "The material " << mName.c_str_safe() + << " does not have a constant parameter named " << name.c_str() << "."; + constexpr char const* const types[3] = {"an int", "a float", "a bool"}; + auto const& constant = mMaterialConstants[pos->second]; + switch (constant.type) { + case ConstantType::INT: + FILAMENT_CHECK_PRECONDITION(std::holds_alternative(value)) + << "The constant parameter " << name.c_str() << " on material " + << mName.c_str_safe() << " is of type int, but " << types[value.index()] + << " was provided."; + break; + case ConstantType::FLOAT: + FILAMENT_CHECK_PRECONDITION(std::holds_alternative(value)) + << "The constant parameter " << name.c_str() << " on material " + << mName.c_str_safe() << " is of type float, but " << types[value.index()] + << " was provided."; + break; + case ConstantType::BOOL: + FILAMENT_CHECK_PRECONDITION(std::holds_alternative(value)) + << "The constant parameter " << name.c_str() << " on material " + << mName.c_str_safe() << " is of type bool, but " << types[value.index()] + << " was provided."; + break; + } + uint32_t const index = pos->second + CONFIG_MAX_RESERVED_SPEC_CONSTANTS; + mSpecializationConstants.push_back({ index, value }); + } +} + +void FMaterial::processPushConstants(FEngine&, MaterialParser const* parser) { + FixedCapacityVector& vertexConstants = + mPushConstants[uint8_t(ShaderStage::VERTEX)]; + FixedCapacityVector& fragmentConstants = + mPushConstants[uint8_t(ShaderStage::FRAGMENT)]; + + CString structVarName; + FixedCapacityVector pushConstants; + parser->getPushConstants(&structVarName, &pushConstants); + + vertexConstants.reserve(pushConstants.size()); + fragmentConstants.reserve(pushConstants.size()); + + constexpr size_t MAX_NAME_LEN = 60; + char buf[MAX_NAME_LEN]; + uint8_t vertexCount = 0, fragmentCount = 0; + + std::for_each(pushConstants.cbegin(), pushConstants.cend(), + [&](MaterialPushConstant const& constant) { + snprintf(buf, sizeof(buf), "%s.%s", structVarName.c_str(), constant.name.c_str()); + + switch (constant.stage) { + case ShaderStage::VERTEX: + vertexConstants.push_back({CString(buf), constant.type}); + vertexCount++; + break; + case ShaderStage::FRAGMENT: + fragmentConstants.push_back({CString(buf), constant.type}); + fragmentCount++; + break; + case ShaderStage::COMPUTE: + break; + } + }); +} + +void FMaterial::precacheDepthVariants(FEngine const& engine) { + // pre-cache all depth variants inside the default material. Note that this should be + // entirely optional; if we remove this pre-caching, these variants will be populated + // later, when/if needed by createAndCacheProgram(). Doing it now potentially uses more + // memory and increases init time, but reduces hiccups during the first frame. + if (UTILS_UNLIKELY(mIsDefaultMaterial)) { + auto const allDepthVariants = VariantUtils::getDepthVariants(); + for (auto const variant: allDepthVariants) { + assert_invariant(Variant::isValidDepthVariant(variant)); + if (hasVariant(variant)) { + prepareProgram(variant); + } + } + return; + } + + // if possible pre-cache all depth variants from the default material + if (mMaterialDomain == MaterialDomain::SURFACE && + !mIsDefaultMaterial && + !mHasCustomDepthShader) { + FMaterial const* const pDefaultMaterial = engine.getDefaultMaterial(); + assert_invariant(pDefaultMaterial); + auto const allDepthVariants = VariantUtils::getDepthVariants(); + for (auto const variant: allDepthVariants) { + assert_invariant(Variant::isValidDepthVariant(variant)); + mCachedPrograms[variant.key] = pDefaultMaterial->mCachedPrograms[variant.key]; + } + } +} + +void FMaterial::processDescriptorSets(FEngine& engine, MaterialParser const* const parser) { + UTILS_UNUSED_IN_RELEASE bool success; + + success = parser->getDescriptorBindings(&mProgramDescriptorBindings); + assert_invariant(success); + + std::array descriptorSetLayout; + success = parser->getDescriptorSetLayout(&descriptorSetLayout); + assert_invariant(success); + + mDescriptorSetLayout = { + engine.getDescriptorSetLayoutFactory(), + engine.getDriverApi(), std::move(descriptorSetLayout[0]) }; + + mPerViewDescriptorSetLayout = { + engine.getDescriptorSetLayoutFactory(), + engine.getDriverApi(), std::move(descriptorSetLayout[1]) }; +} + +descriptor_binding_t FMaterial::getSamplerBinding( + std::string_view const& name) const { + return mSamplerInterfaceBlock.getSamplerInfo(name)->binding; +} + +template bool FMaterial::setConstant(uint32_t id, int32_t value) noexcept; +template bool FMaterial::setConstant(uint32_t id, float value) noexcept; +template bool FMaterial::setConstant(uint32_t id, bool value) noexcept; + } // namespace filament diff --git a/filament/src/details/Material.h b/filament/src/details/Material.h index 6aab3d48eb5..d0e9d1492ba 100644 --- a/filament/src/details/Material.h +++ b/filament/src/details/Material.h @@ -21,17 +21,47 @@ #include "details/MaterialInstance.h" +#include "ds/DescriptorSetLayout.h" + #include +#include -#include +#include +#include #include #include #include +#include + +#include +#include +#include +#include #include +#include +#include +#include +#include #include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#if FILAMENT_ENABLE_MATDBG +#include +#endif namespace filament { @@ -41,10 +71,11 @@ class FEngine; class FMaterial : public Material { public: - FMaterial(FEngine& engine, const Material::Builder& builder); + FMaterial(FEngine& engine, const Builder& builder, + std::unique_ptr materialParser); ~FMaterial() noexcept; - class DefaultMaterialBuilder : public Material::Builder { + class DefaultMaterialBuilder : public Builder { public: DefaultMaterialBuilder(); }; @@ -57,11 +88,32 @@ class FMaterial : public Material { return mUniformInterfaceBlock; } - // return the uniform interface block for this material - const SamplerInterfaceBlock& getSamplerInterfaceBlock() const noexcept { - return mSamplerInterfaceBlock; + DescriptorSetLayout const& getPerViewDescriptorSetLayout() const noexcept { + assert_invariant(mMaterialDomain == MaterialDomain::POST_PROCESS); + return mPerViewDescriptorSetLayout; + } + + DescriptorSetLayout const& getPerViewDescriptorSetLayout(Variant const variant) const noexcept { + if (Variant::isValidDepthVariant(variant)) { + assert_invariant(mMaterialDomain == MaterialDomain::SURFACE); + return mEngine.getPerViewDescriptorSetLayoutDepthVariant(); + } + if (Variant::isSSRVariant(variant)) { + assert_invariant(mMaterialDomain == MaterialDomain::SURFACE); + return mEngine.getPerViewDescriptorSetLayoutSsrVariant(); + } + return mPerViewDescriptorSetLayout; } + DescriptorSetLayout const& getDescriptorSetLayout() const noexcept { + return mDescriptorSetLayout; + } + + void compile(CompilerPriorityQueue priority, + UserVariantFilterMask variantSpec, + backend::CallbackHandler* handler, + utils::Invocable&& callback) noexcept; + // Create an instance of this material FMaterialInstance* createInstance(const char* name) const noexcept; @@ -71,37 +123,51 @@ class FMaterial : public Material { BufferInterfaceBlock::FieldInfo const* reflect(std::string_view name) const noexcept; - FMaterialInstance const* getDefaultInstance() const noexcept { return &mDefaultInstance; } - FMaterialInstance* getDefaultInstance() noexcept { return &mDefaultInstance; } + FMaterialInstance const* getDefaultInstance() const noexcept { + return const_cast(this)->getDefaultInstance(); + } + + FMaterialInstance* getDefaultInstance() noexcept; FEngine& getEngine() const noexcept { return mEngine; } + bool isCached(Variant const variant) const noexcept { + return bool(mCachedPrograms[variant.key]); + } + + void invalidate(Variant::type_t variantMask = 0, Variant::type_t variantValue = 0) noexcept; + // prepareProgram creates the program for the material's given variant at the backend level. // Must be called outside of backend render pass. // Must be called before getProgram() below. - void prepareProgram(Variant variant) const noexcept { + void prepareProgram(Variant const variant, + backend::CompilerPriorityQueue const priorityQueue = CompilerPriorityQueue::HIGH) const noexcept { // prepareProgram() is called for each RenderPrimitive in the scene, so it must be efficient. - if (UTILS_UNLIKELY(!mCachedPrograms[variant.key])) { - prepareProgramSlow(variant); + if (UTILS_UNLIKELY(!isCached(variant))) { + prepareProgramSlow(variant, priorityQueue); } } // getProgram returns the backend program for the material's given variant. // Must be called after prepareProgram(). - [[nodiscard]] backend::Handle getProgram(Variant variant) const noexcept { + [[nodiscard]] backend::Handle getProgram(Variant const variant) const noexcept { #if FILAMENT_ENABLE_MATDBG - assert_invariant(variant.key < VARIANT_COUNT); + assert_invariant((size_t)variant.key < VARIANT_COUNT); std::unique_lock lock(mActiveProgramsLock); mActivePrograms.set(variant.key); lock.unlock(); + + if (isSharedVariant(variant)) { + FMaterial const* const pDefaultMaterial = mEngine.getDefaultMaterial(); + if (pDefaultMaterial && pDefaultMaterial->mCachedPrograms[variant.key]) { + return pDefaultMaterial->getProgram(variant); + } + } #endif assert_invariant(mCachedPrograms[variant.key]); return mCachedPrograms[variant.key]; } - backend::Program getProgramBuilderWithVariants(Variant variant, Variant vertexVariant, - Variant fragmentVariant) const noexcept; - bool isVariantLit() const noexcept { return mIsVariantLit; } const utils::CString& getName() const noexcept { return mName; } @@ -109,10 +175,13 @@ class FMaterial : public Material { backend::RasterState getRasterState() const noexcept { return mRasterState; } uint32_t getId() const noexcept { return mMaterialId; } + UserVariantFilterMask getSupportedVariants() const noexcept { + return UserVariantFilterMask(UserVariantFilterBit::ALL) & ~mVariantFilterMask; + } + Shading getShading() const noexcept { return mShading; } Interpolation getInterpolation() const noexcept { return mInterpolation; } BlendingMode getBlendingMode() const noexcept { return mBlendingMode; } - BlendingMode getRenderBlendingMode() const noexcept { return mRenderBlendingMode; } VertexDomain getVertexDomain() const noexcept { return mVertexDomain; } MaterialDomain getMaterialDomain() const noexcept { return mMaterialDomain; } CullingMode getCullingMode() const noexcept { return mCullingMode; } @@ -124,6 +193,7 @@ class FMaterial : public Material { } bool isDoubleSided() const noexcept { return mDoubleSided; } bool hasDoubleSidedCapability() const noexcept { return mDoubleSidedCapability; } + bool isAlphaToCoverageEnabled() const noexcept { return mRasterState.alphaToCoverage; } float getMaskThreshold() const noexcept { return mMaskThreshold; } bool hasShadowMultiplier() const noexcept { return mHasShadowMultiplier; } AttributeBitset getRequiredAttributes() const noexcept { return mRequiredAttributes; } @@ -135,10 +205,17 @@ class FMaterial : public Material { float getSpecularAntiAliasingVariance() const noexcept { return mSpecularAntiAliasingVariance; } float getSpecularAntiAliasingThreshold() const noexcept { return mSpecularAntiAliasingThreshold; } + backend::descriptor_binding_t getSamplerBinding( + std::string_view const& name) const; + bool hasMaterialProperty(Property property) const noexcept { return bool(mMaterialProperties & uint64_t(property)); } + SamplerInterfaceBlock const& getSamplerInterfaceBlock() const noexcept { + return mSamplerInterfaceBlock; + } + size_t getParameterCount() const noexcept { return mUniformInterfaceBlock.getFieldInfoList().size() + mSamplerInterfaceBlock.getSamplerInfoList().size() + @@ -148,11 +225,25 @@ class FMaterial : public Material { uint32_t generateMaterialInstanceId() const noexcept { return mMaterialInstanceId++; } - void applyPendingEdits() noexcept; + void destroyPrograms(FEngine& engine, + Variant::type_t variantMask = 0, + Variant::type_t variantValue = 0); + + // return the id of a specialization constant specified by name for this material + std::optional getSpecializationConstantId(std::string_view name) const noexcept ; - void destroyPrograms(FEngine& engine); + // Sets a specialization constant by id. call is no-op if the id is invalid. + // Return true is the value was changed. + template> + bool setConstant(uint32_t id, T value) noexcept; + + uint8_t getPerViewLayoutIndex() const noexcept { + return mPerViewLayoutIndex; + } #if FILAMENT_ENABLE_MATDBG + void applyPendingEdits() noexcept; + /** * Callback handlers for the debug server, potentially called from any thread. The userdata * argument has the same value that was passed to DebugServer::addMaterial(), which should @@ -174,7 +265,7 @@ class FMaterial : public Material { static void onQueryCallback(void* userdata, VariantList* pActiveVariants); void checkProgramEdits() noexcept { - if (UTILS_UNLIKELY(mPendingEdits.load())) { + if (UTILS_UNLIKELY(hasPendingEdits())) { applyPendingEdits(); } } @@ -183,33 +274,59 @@ class FMaterial : public Material { #endif private: - void prepareProgramSlow(Variant variant) const noexcept; - void getSurfaceProgramSlow(Variant variant) const noexcept; - void getPostProcessProgramSlow(Variant variant) const noexcept; + bool hasVariant(Variant variant) const noexcept; + void prepareProgramSlow(Variant variant, + CompilerPriorityQueue priorityQueue) const noexcept; + void getSurfaceProgramSlow(Variant variant, + CompilerPriorityQueue priorityQueue) const noexcept; + void getPostProcessProgramSlow(Variant variant, + CompilerPriorityQueue priorityQueue) const noexcept; + backend::Program getProgramWithVariants(Variant variant, + Variant vertexVariant, Variant fragmentVariant) const noexcept; + + void processBlendingMode(MaterialParser const* parser); + + void processSpecializationConstants(FEngine& engine, Builder const& builder, + MaterialParser const* parser); - void createAndCacheProgram(backend::Program&& p, - Variant variant) const noexcept; + void processPushConstants(FEngine& engine, MaterialParser const* parser); + + void precacheDepthVariants(FEngine const& engine); + + void processDescriptorSets(FEngine& engine, MaterialParser const* parser); + + void createAndCacheProgram(backend::Program&& p, Variant variant) const noexcept; + + inline bool isSharedVariant(Variant const variant) const { + return (mMaterialDomain == MaterialDomain::SURFACE) && !mIsDefaultMaterial && + !mHasCustomDepthShader && Variant::isValidDepthVariant(variant); + } // try to order by frequency of use mutable std::array, VARIANT_COUNT> mCachedPrograms; + DescriptorSetLayout mPerViewDescriptorSetLayout; + DescriptorSetLayout mDescriptorSetLayout; + backend::Program::DescriptorSetInfo mProgramDescriptorBindings; backend::RasterState mRasterState; - BlendingMode mRenderBlendingMode = BlendingMode::OPAQUE; TransparencyMode mTransparencyMode = TransparencyMode::DEFAULT; bool mIsVariantLit = false; backend::FeatureLevel mFeatureLevel = backend::FeatureLevel::FEATURE_LEVEL_1; Shading mShading = Shading::UNLIT; BlendingMode mBlendingMode = BlendingMode::OPAQUE; + std::array mCustomBlendFunctions = {}; Interpolation mInterpolation = Interpolation::SMOOTH; VertexDomain mVertexDomain = VertexDomain::OBJECT; MaterialDomain mMaterialDomain = MaterialDomain::SURFACE; CullingMode mCullingMode = CullingMode::NONE; AttributeBitset mRequiredAttributes; + UserVariantFilterMask mVariantFilterMask = 0; RefractionMode mRefractionMode = RefractionMode::NONE; RefractionType mRefractionType = RefractionType::SOLID; ReflectionMode mReflectionMode = ReflectionMode::DEFAULT; uint64_t mMaterialProperties = 0; + uint8_t mPerViewLayoutIndex = 0; float mMaskThreshold = 0.4f; float mSpecularAntiAliasingVariance = 0.0f; @@ -222,26 +339,51 @@ class FMaterial : public Material { bool mIsDefaultMaterial = false; bool mSpecularAntiAliasing = false; - FMaterialInstance mDefaultInstance; + // reserve some space to construct the default material instance + mutable FMaterialInstance* mDefaultMaterialInstance = nullptr; + SamplerInterfaceBlock mSamplerInterfaceBlock; BufferInterfaceBlock mUniformInterfaceBlock; SubpassInfo mSubpassInfo; - utils::FixedCapacityVector> mUniformBlockBindings; - SamplerGroupBindingInfoList mSamplerGroupBindingInfoList; - SamplerBindingToNameMap mSamplerBindingToNameMap; + + using BindingUniformInfoContainer = utils::FixedCapacityVector>; + + BindingUniformInfoContainer mBindingUniformInfo; + + using AttributeInfoContainer = utils::FixedCapacityVector>; + + AttributeInfoContainer mAttributeInfo; + + // Constants defined by this Material + utils::FixedCapacityVector mMaterialConstants; + // A map from the Constant name to the mMaterialConstant index + std::unordered_map mSpecializationConstantsNameToIndex; + // current specialization constants for the HwProgram + utils::FixedCapacityVector mSpecializationConstants; + + // current push constants for the HwProgram + std::array, + backend::Program::SHADER_TYPE_COUNT> + mPushConstants; #if FILAMENT_ENABLE_MATDBG matdbg::MaterialKey mDebuggerId; mutable utils::Mutex mActiveProgramsLock; mutable VariantList mActivePrograms; + mutable utils::Mutex mPendingEditsLock; + std::unique_ptr mPendingEdits; + void setPendingEdits(std::unique_ptr pendingEdits) noexcept; + bool hasPendingEdits() const noexcept; + void latchPendingEdits() noexcept; #endif utils::CString mName; FEngine& mEngine; const uint32_t mMaterialId; + uint64_t mCacheId = 0; mutable uint32_t mMaterialInstanceId = 0; - MaterialParser* mMaterialParser = nullptr; - std::atomic mPendingEdits = {}; + std::unique_ptr mMaterialParser; }; diff --git a/filament/src/details/MaterialInstance.cpp b/filament/src/details/MaterialInstance.cpp index ee5d81b9fc6..972b89cab76 100644 --- a/filament/src/details/MaterialInstance.cpp +++ b/filament/src/details/MaterialInstance.cpp @@ -16,18 +16,39 @@ #include -#include - -#include "details/MaterialInstance.h" - #include "RenderPass.h" +#include "ds/DescriptorSetLayout.h" + #include "details/Engine.h" #include "details/Material.h" +#include "details/MaterialInstance.h" #include "details/Texture.h" +#include "private/filament/EngineEnums.h" + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include #include +#include + +#include +#include +#include +#include +#include + using namespace filament::math; using namespace utils; @@ -35,19 +56,70 @@ namespace filament { using namespace backend; -FMaterialInstance::FMaterialInstance() noexcept - : mCulling(CullingMode::BACK), +FMaterialInstance::FMaterialInstance(FEngine& engine, FMaterial const* material, + const char* name) noexcept + : mMaterial(material), + mDescriptorSet(material->getDescriptorSetLayout()), + mCulling(CullingMode::BACK), mDepthFunc(RasterState::DepthFunc::LE), mColorWrite(false), mDepthWrite(false), mHasScissor(false), mIsDoubleSided(false), - mTransparencyMode(TransparencyMode::DEFAULT) { + mIsDefaultInstance(false), + mTransparencyMode(TransparencyMode::DEFAULT), + mName(name ? CString(name) : material->getName()) { + + FEngine::DriverApi& driver = engine.getDriverApi(); + + if (!material->getUniformInterfaceBlock().isEmpty()) { + mUniforms = UniformBuffer(material->getUniformInterfaceBlock().getSize()); + mUbHandle = driver.createBufferObject(mUniforms.getSize(), + BufferObjectBinding::UNIFORM, BufferUsage::STATIC); + driver.setDebugTag(mUbHandle.getId(), material->getName()); + } + + // set the UBO, always descriptor 0 + mDescriptorSet.setBuffer(0, mUbHandle, 0, mUniforms.getSize()); + + const RasterState& rasterState = material->getRasterState(); + // At the moment, only MaterialInstances have a stencil state, but in the future it should be + // possible to set the stencil state directly on a material (through material definitions, or + // MaterialBuilder). + // TODO: Here is where we'd "inherit" the stencil state from the Material. + // mStencilState = material->getStencilState(); + + // We inherit the resolved culling mode rather than the builder-set culling mode. + // This preserves the property whereby double-sidedness automatically disables culling. + mCulling = rasterState.culling; + mColorWrite = rasterState.colorWrite; + mDepthWrite = rasterState.depthWrite; + mDepthFunc = rasterState.depthFunc; + + mMaterialSortingKey = RenderPass::makeMaterialSortingKey( + material->getId(), material->generateMaterialInstanceId()); + + if (material->getBlendingMode() == BlendingMode::MASKED) { + setMaskThreshold(material->getMaskThreshold()); + } + + if (material->hasDoubleSidedCapability()) { + setDoubleSided(material->isDoubleSided()); + } + + if (material->hasSpecularAntiAliasing()) { + setSpecularAntiAliasingVariance(material->getSpecularAntiAliasingVariance()); + setSpecularAntiAliasingThreshold(material->getSpecularAntiAliasingThreshold()); + } + + setTransparencyMode(material->getTransparencyMode()); } FMaterialInstance::FMaterialInstance(FEngine& engine, FMaterialInstance const* other, const char* name) : mMaterial(other->mMaterial), + mTextureParameters(other->mTextureParameters), + mDescriptorSet(other->mDescriptorSet.duplicate(mMaterial->getDescriptorSetLayout())), mPolygonOffset(other->mPolygonOffset), mStencilState(other->mStencilState), mMaskThreshold(other->mMaskThreshold), @@ -59,6 +131,7 @@ FMaterialInstance::FMaterialInstance(FEngine& engine, mDepthWrite(other->mDepthWrite), mHasScissor(false), mIsDoubleSided(other->mIsDoubleSided), + mIsDefaultInstance(false), mScissorRect(other->mScissorRect), mName(name ? CString(name) : other->mName) { @@ -68,13 +141,12 @@ FMaterialInstance::FMaterialInstance(FEngine& engine, if (!material->getUniformInterfaceBlock().isEmpty()) { mUniforms.setUniforms(other->getUniformBuffer()); mUbHandle = driver.createBufferObject(mUniforms.getSize(), - BufferObjectBinding::UNIFORM, backend::BufferUsage::DYNAMIC); + BufferObjectBinding::UNIFORM, BufferUsage::DYNAMIC); + driver.setDebugTag(mUbHandle.getId(), material->getName()); } - if (!material->getSamplerInterfaceBlock().isEmpty()) { - mSamplers = other->getSamplerGroup(); - mSbHandle = driver.createSamplerGroup(mSamplers.getSize()); - } + // set the UBO, always descriptor 0 + mDescriptorSet.setBuffer(0, mUbHandle, 0, mUniforms.getSize()); if (material->hasDoubleSidedCapability()) { setDoubleSided(mIsDoubleSided); @@ -93,6 +165,11 @@ FMaterialInstance::FMaterialInstance(FEngine& engine, mMaterialSortingKey = RenderPass::makeMaterialSortingKey( material->getId(), material->generateMaterialInstanceId()); + + // If the original descriptor set has been commited, the copy needs to commit as well. + if (other->mDescriptorSet.getHandle()) { + mDescriptorSet.commitSlow(mMaterial->getDescriptorSetLayout(), driver); + } } FMaterialInstance* FMaterialInstance::duplicate( @@ -102,90 +179,56 @@ FMaterialInstance* FMaterialInstance::duplicate( return engine.createMaterialInstance(material, other, name); } -void FMaterialInstance::initDefaultInstance(FEngine& engine, FMaterial const* material) { - FEngine::DriverApi& driver = engine.getDriverApi(); - - mMaterial = material; - - if (!material->getUniformInterfaceBlock().isEmpty()) { - mUniforms = UniformBuffer(material->getUniformInterfaceBlock().getSize()); - mUbHandle = driver.createBufferObject(mUniforms.getSize(), - BufferObjectBinding::UNIFORM, backend::BufferUsage::STATIC); - } - - if (!material->getSamplerInterfaceBlock().isEmpty()) { - mSamplers = SamplerGroup(material->getSamplerInterfaceBlock().getSize()); - mSbHandle = driver.createSamplerGroup(mSamplers.getSize()); - } - - const RasterState& rasterState = material->getRasterState(); - // At the moment, only MaterialInstances have a stencil state, but in the future it should be - // possible to set the stencil state directly on a material (through material definitions, or - // MaterialBuilder). - // TODO: Here is where we'd "inherit" the stencil state from the Material. - // mStencilState = material->getStencilState(); - - // We inherit the resolved culling mode rather than the builder-set culling mode. - // This preserves the property whereby double-sidedness automatically disables culling. - mCulling = rasterState.culling; - mColorWrite = rasterState.colorWrite; - mDepthWrite = rasterState.depthWrite; - mDepthFunc = rasterState.depthFunc; - - mMaterialSortingKey = RenderPass::makeMaterialSortingKey( - material->getId(), material->generateMaterialInstanceId()); - - if (material->getBlendingMode() == BlendingMode::MASKED) { - setMaskThreshold(material->getMaskThreshold()); - } - - if (material->hasDoubleSidedCapability()) { - setDoubleSided(material->isDoubleSided()); - } - - if (material->hasSpecularAntiAliasing()) { - setSpecularAntiAliasingVariance(material->getSpecularAntiAliasingVariance()); - setSpecularAntiAliasingThreshold(material->getSpecularAntiAliasingThreshold()); - } - - setTransparencyMode(material->getTransparencyMode()); -} - FMaterialInstance::~FMaterialInstance() noexcept = default; void FMaterialInstance::terminate(FEngine& engine) { FEngine::DriverApi& driver = engine.getDriverApi(); + mDescriptorSet.terminate(driver); driver.destroyBufferObject(mUbHandle); - driver.destroySamplerGroup(mSbHandle); } -void FMaterialInstance::commitSlow(DriverApi& driver) const { +void FMaterialInstance::commit(DriverApi& driver) const { // update uniforms if needed if (mUniforms.isDirty()) { driver.updateBufferObject(mUbHandle, mUniforms.toBufferDescriptor(driver), 0); } - if (mSamplers.isDirty()) { - driver.updateSamplerGroup(mSbHandle, mSamplers.toBufferDescriptor(driver)); + if (!mTextureParameters.empty()) { + for (auto const& [binding, p]: mTextureParameters) { + assert_invariant(p.texture); + // TODO: figure out a way to do this more efficiently (isValid() is a hashmap lookup) + FEngine& engine = mMaterial->getEngine(); + FILAMENT_CHECK_PRECONDITION(engine.isValid(p.texture)) + << "Invalid texture still bound to MaterialInstance: '" << getName() << "'\n"; + Handle handle = p.texture->getHwHandleForSampling(); + assert_invariant(handle); + mDescriptorSet.setSampler(binding, handle, p.params); + } } + + // TODO: eventually we should remove this in RELEASE builds + fixMissingSamplers(); + + // Commit descriptors if needed (e.g. when textures are updated,or the first time) + mDescriptorSet.commit(mMaterial->getDescriptorSetLayout(), driver); } // ------------------------------------------------------------------------------------------------ -void FMaterialInstance::setParameter(std::string_view name, - backend::Handle texture, backend::SamplerParams params) noexcept { - size_t index = mMaterial->getSamplerInterfaceBlock().getSamplerInfo(name)->offset; - mSamplers.setSampler(index, { texture, params }); +void FMaterialInstance::setParameter(std::string_view const name, + Handle texture, SamplerParams const params) { + auto binding = mMaterial->getSamplerBinding(name); + mDescriptorSet.setSampler(binding, texture, params); } -void FMaterialInstance::setParameterImpl(std::string_view name, +void FMaterialInstance::setParameterImpl(std::string_view const name, FTexture const* texture, TextureSampler const& sampler) { #ifndef NDEBUG // Per GLES3.x specification, depth texture can't be filtered unless in compare mode. if (texture && isDepthFormat(texture->getFormat())) { if (sampler.getCompareMode() == SamplerCompareMode::NONE) { - SamplerMinFilter minFilter = sampler.getMinFilter(); - SamplerMagFilter magFilter = sampler.getMagFilter(); + SamplerMinFilter const minFilter = sampler.getMinFilter(); + SamplerMagFilter const magFilter = sampler.getMagFilter(); if (magFilter == SamplerMagFilter::LINEAR || minFilter == SamplerMinFilter::LINEAR || minFilter == SamplerMinFilter::LINEAR_MIPMAP_LINEAR || @@ -194,47 +237,55 @@ void FMaterialInstance::setParameterImpl(std::string_view name, PANIC_LOG("Depth textures can't be sampled with a linear filter " "unless the comparison mode is set to COMPARE_TO_TEXTURE. " "(material: \"%s\", parameter: \"%.*s\")", - getMaterial()->getName().c_str(), name.size(), name.data()); + getMaterial()->getName().c_str(), name.size(), name.data()); } } } #endif - Handle handle{}; - if (UTILS_LIKELY(texture)) { - handle = texture->getHwHandle(); + auto binding = mMaterial->getSamplerBinding(name); + if (texture && texture->textureHandleCanMutate()) { + mTextureParameters[binding] = { texture, sampler.getSamplerParams() }; + } else { + Handle handle{}; + if (texture) { + handle = texture->getHwHandleForSampling(); + assert_invariant(handle == texture->getHwHandle()); + } else { + mTextureParameters.erase(binding); + } + mDescriptorSet.setSampler(binding, handle, sampler.getSamplerParams()); } - setParameter(name, handle, sampler.getSamplerParams()); } -void FMaterialInstance::setMaskThreshold(float threshold) noexcept { - setParameter("_maskThreshold", math::saturate(threshold)); - mMaskThreshold = math::saturate(threshold); +void FMaterialInstance::setMaskThreshold(float const threshold) noexcept { + setParameter("_maskThreshold", saturate(threshold)); + mMaskThreshold = saturate(threshold); } float FMaterialInstance::getMaskThreshold() const noexcept { return mMaskThreshold; } -void FMaterialInstance::setSpecularAntiAliasingVariance(float variance) noexcept { - setParameter("_specularAntiAliasingVariance", math::saturate(variance)); - mSpecularAntiAliasingVariance = math::saturate(variance); +void FMaterialInstance::setSpecularAntiAliasingVariance(float const variance) noexcept { + setParameter("_specularAntiAliasingVariance", saturate(variance)); + mSpecularAntiAliasingVariance = saturate(variance); } float FMaterialInstance::getSpecularAntiAliasingVariance() const noexcept { return mSpecularAntiAliasingVariance; } -void FMaterialInstance::setSpecularAntiAliasingThreshold(float threshold) noexcept { - setParameter("_specularAntiAliasingThreshold", math::saturate(threshold * threshold)); - mSpecularAntiAliasingThreshold = std::sqrt(math::saturate(threshold * threshold)); +void FMaterialInstance::setSpecularAntiAliasingThreshold(float const threshold) noexcept { + setParameter("_specularAntiAliasingThreshold", saturate(threshold * threshold)); + mSpecularAntiAliasingThreshold = std::sqrt(saturate(threshold * threshold)); } float FMaterialInstance::getSpecularAntiAliasingThreshold() const noexcept { return mSpecularAntiAliasingThreshold; } -void FMaterialInstance::setDoubleSided(bool doubleSided) noexcept { +void FMaterialInstance::setDoubleSided(bool const doubleSided) noexcept { if (UTILS_UNLIKELY(!mMaterial->hasDoubleSidedCapability())) { slog.w << "Parent material does not have double-sided capability." << io::endl; return; @@ -250,11 +301,11 @@ bool FMaterialInstance::isDoubleSided() const noexcept { return mIsDoubleSided; } -void FMaterialInstance::setTransparencyMode(TransparencyMode mode) noexcept { +void FMaterialInstance::setTransparencyMode(TransparencyMode const mode) noexcept { mTransparencyMode = mode; } -void FMaterialInstance::setDepthCulling(bool enable) noexcept { +void FMaterialInstance::setDepthCulling(bool const enable) noexcept { mDepthFunc = enable ? RasterState::DepthFunc::GE : RasterState::DepthFunc::A; } @@ -267,9 +318,86 @@ const char* FMaterialInstance::getName() const noexcept { // the instance's CString rather than calling empty(). This allows instances to override the // parent material's name with a blank string. if (mName.data() == nullptr) { - return mMaterial->getName().c_str(); + return mMaterial->getName().c_str_safe(); } return mName.c_str(); } +// ------------------------------------------------------------------------------------------------ + +void FMaterialInstance::use(FEngine::DriverApi& driver) const { + + if (UTILS_UNLIKELY(mMissingSamplerDescriptors.any())) { + std::call_once(mMissingSamplersFlag, [this]() { + auto const& list = mMaterial->getSamplerInterfaceBlock().getSamplerInfoList(); + slog.w << "sampler parameters not set in MaterialInstance \"" + << mName.c_str_safe() << "\" or Material \"" + << mMaterial->getName().c_str_safe() << "\":\n"; + mMissingSamplerDescriptors.forEachSetBit([&list](descriptor_binding_t binding) { + auto pos = std::find_if(list.begin(), list.end(), [binding](const auto& item) { + return item.binding == binding; + }); + // just safety-check, should never fail + if (UTILS_LIKELY(pos != list.end())) { + slog.w << "[" << +binding << "] " << pos->name.c_str() << '\n'; + } + }); + flush(slog.w); + }); + mMissingSamplerDescriptors.clear(); + } + + mDescriptorSet.bind(driver, DescriptorSetBindingPoints::PER_MATERIAL); +} + +void FMaterialInstance::fixMissingSamplers() const { + // Here we check that all declared sampler parameters are set, this is required by + // Vulkan and Metal; GL is more permissive. If a sampler parameter is not set, we will + // log a warning once per MaterialInstance in the system log and patch-in a dummy + // texture. + auto const& layout = mMaterial->getDescriptorSetLayout(); + auto const samplersDescriptors = layout.getSamplerDescriptors(); + auto const validDescriptors = mDescriptorSet.getValidDescriptors(); + auto const missingSamplerDescriptors = + (validDescriptors & samplersDescriptors) ^ samplersDescriptors; + + // always record the missing samplers state at commit() time + mMissingSamplerDescriptors = missingSamplerDescriptors; + + if (UTILS_UNLIKELY(missingSamplerDescriptors.any())) { + // here we need to set the samplers that are missing + auto const& list = mMaterial->getSamplerInterfaceBlock().getSamplerInfoList(); + missingSamplerDescriptors.forEachSetBit([this, &list](descriptor_binding_t binding) { + auto pos = std::find_if(list.begin(), list.end(), [binding](const auto& item) { + return item.binding == binding; + }); + + FEngine const& engine = mMaterial->getEngine(); + + // just safety-check, should never fail + if (UTILS_LIKELY(pos != list.end())) { + switch (pos->type) { + case SamplerType::SAMPLER_2D: + mDescriptorSet.setSampler(binding, + engine.getZeroTexture(), {}); + break; + case SamplerType::SAMPLER_2D_ARRAY: + mDescriptorSet.setSampler(binding, + engine.getZeroTextureArray(), {}); + break; + case SamplerType::SAMPLER_CUBEMAP: + mDescriptorSet.setSampler(binding, + engine.getDummyCubemap()->getHwHandle(), {}); + break; + case SamplerType::SAMPLER_EXTERNAL: + case SamplerType::SAMPLER_3D: + case SamplerType::SAMPLER_CUBEMAP_ARRAY: + // we're currently not able to fix-up those + break; + } + } + }); + } +} + } // namespace filament diff --git a/filament/src/details/MaterialInstance.h b/filament/src/details/MaterialInstance.h index c98c8f3115e..91b0118ba7e 100644 --- a/filament/src/details/MaterialInstance.h +++ b/filament/src/details/MaterialInstance.h @@ -18,26 +18,43 @@ #define TNT_FILAMENT_DETAILS_MATERIALINSTANCE_H #include "downcast.h" + #include "UniformBuffer.h" + +#include "ds/DescriptorSet.h" + #include "details/Engine.h" #include "private/backend/DriverApi.h" -#include +#include -#include +#include +#include #include -#include +#include +#include -#include +#include + +#include +#include +#include +#include + +#include +#include namespace filament { class FMaterial; +class FTexture; class FMaterialInstance : public MaterialInstance { public: + FMaterialInstance(FEngine& engine, FMaterial const* material, + const char* name) noexcept; FMaterialInstance(FEngine& engine, FMaterialInstance const* other, const char* name); FMaterialInstance(const FMaterialInstance& rhs) = delete; FMaterialInstance& operator=(const FMaterialInstance& rhs) = delete; @@ -48,29 +65,17 @@ class FMaterialInstance : public MaterialInstance { void terminate(FEngine& engine); - void commit(FEngine::DriverApi& driver) const { - if (UTILS_UNLIKELY(mUniforms.isDirty() || mSamplers.isDirty())) { - commitSlow(driver); - } - } + void commit(FEngine::DriverApi& driver) const; - void use(FEngine::DriverApi& driver) const { - if (mUbHandle) { - driver.bindUniformBuffer(+UniformBindingPoints::PER_MATERIAL_INSTANCE, mUbHandle); - } - if (mSbHandle) { - driver.bindSamplers(+SamplerBindingPoints::PER_MATERIAL_INSTANCE, mSbHandle); - } - } + void use(FEngine::DriverApi& driver) const; FMaterial const* getMaterial() const noexcept { return mMaterial; } uint64_t getSortingKey() const noexcept { return mMaterialSortingKey; } UniformBuffer const& getUniformBuffer() const noexcept { return mUniforms; } - backend::SamplerGroup const& getSamplerGroup() const noexcept { return mSamplers; } - void setScissor(uint32_t left, uint32_t bottom, uint32_t width, uint32_t height) noexcept { + void setScissor(uint32_t const left, uint32_t const bottom, uint32_t const width, uint32_t const height) noexcept { constexpr uint32_t maxvalu = std::numeric_limits::max(); mScissorRect = { int32_t(left), int32_t(bottom), std::min(width, maxvalu), std::min(height, maxvalu) }; @@ -101,7 +106,11 @@ class FMaterialInstance : public MaterialInstance { backend::RasterState::DepthFunc getDepthFunc() const noexcept { return mDepthFunc; } - void setPolygonOffset(float scale, float constant) noexcept { + void setDepthFunc(backend::RasterState::DepthFunc const depthFunc) noexcept { + mDepthFunc = depthFunc; + } + + void setPolygonOffset(float const scale, float const constant) noexcept { // handle reversed Z mPolygonOffset = { -scale, -constant }; } @@ -126,19 +135,19 @@ class FMaterialInstance : public MaterialInstance { void setTransparencyMode(TransparencyMode mode) noexcept; - void setCullingMode(CullingMode culling) noexcept { mCulling = culling; } + void setCullingMode(CullingMode const culling) noexcept { mCulling = culling; } - void setColorWrite(bool enable) noexcept { mColorWrite = enable; } + void setColorWrite(bool const enable) noexcept { mColorWrite = enable; } - void setDepthWrite(bool enable) noexcept { mDepthWrite = enable; } + void setDepthWrite(bool const enable) noexcept { mDepthWrite = enable; } - void setStencilWrite(bool enable) noexcept { mStencilState.stencilWrite = enable; } + void setStencilWrite(bool const enable) noexcept { mStencilState.stencilWrite = enable; } void setDepthCulling(bool enable) noexcept; bool isDepthCullingEnabled() const noexcept; - void setStencilCompareFunction(StencilCompareFunc func, StencilFace face) noexcept { + void setStencilCompareFunction(StencilCompareFunc const func, StencilFace const face) noexcept { if (any(face & StencilFace::FRONT)) { mStencilState.front.stencilFunc = func; } @@ -147,7 +156,7 @@ class FMaterialInstance : public MaterialInstance { } } - void setStencilOpStencilFail(StencilOperation op, StencilFace face) noexcept { + void setStencilOpStencilFail(StencilOperation const op, StencilFace const face) noexcept { if (any(face & StencilFace::FRONT)) { mStencilState.front.stencilOpStencilFail = op; } @@ -156,7 +165,7 @@ class FMaterialInstance : public MaterialInstance { } } - void setStencilOpDepthFail(StencilOperation op, StencilFace face) noexcept { + void setStencilOpDepthFail(StencilOperation const op, StencilFace const face) noexcept { if (any(face & StencilFace::FRONT)) { mStencilState.front.stencilOpDepthFail = op; } @@ -165,7 +174,7 @@ class FMaterialInstance : public MaterialInstance { } } - void setStencilOpDepthStencilPass(StencilOperation op, StencilFace face) noexcept { + void setStencilOpDepthStencilPass(StencilOperation const op, StencilFace const face) noexcept { if (any(face & StencilFace::FRONT)) { mStencilState.front.stencilOpDepthStencilPass = op; } @@ -174,7 +183,7 @@ class FMaterialInstance : public MaterialInstance { } } - void setStencilReferenceValue(uint8_t value, StencilFace face) noexcept { + void setStencilReferenceValue(uint8_t const value, StencilFace const face) noexcept { if (any(face & StencilFace::FRONT)) { mStencilState.front.ref = value; } @@ -183,7 +192,7 @@ class FMaterialInstance : public MaterialInstance { } } - void setStencilReadMask(uint8_t readMask, StencilFace face) noexcept { + void setStencilReadMask(uint8_t const readMask, StencilFace const face) noexcept { if (any(face & StencilFace::FRONT)) { mStencilState.front.readMask = readMask; } @@ -192,7 +201,7 @@ class FMaterialInstance : public MaterialInstance { } } - void setStencilWriteMask(uint8_t writeMask, StencilFace face) noexcept { + void setStencilWriteMask(uint8_t const writeMask, StencilFace const face) noexcept { if (any(face & StencilFace::FRONT)) { mStencilState.front.writeMask = writeMask; } @@ -201,10 +210,21 @@ class FMaterialInstance : public MaterialInstance { } } + void setDefaultInstance(bool const value) noexcept { + mIsDefaultInstance = value; + } + + bool isDefaultInstance() const noexcept { + return mIsDefaultInstance; + } + + // Called by the engine to ensure that unset samplers are initialized with placedholders. + void fixMissingSamplers() const; + const char* getName() const noexcept; void setParameter(std::string_view name, - backend::Handle texture, backend::SamplerParams params) noexcept; + backend::Handle texture, backend::SamplerParams params); using MaterialInstance::setParameter; @@ -227,18 +247,21 @@ class FMaterialInstance : public MaterialInstance { void setParameterImpl(std::string_view name, FTexture const* texture, TextureSampler const& sampler); - FMaterialInstance() noexcept; - void initDefaultInstance(FEngine& engine, FMaterial const* material); - - void commitSlow(FEngine::DriverApi& driver) const; + template + T getParameterImpl(std::string_view name) const; // keep these grouped, they're accessed together in the render-loop FMaterial const* mMaterial = nullptr; + struct TextureParameter { + FTexture const* texture; + backend::SamplerParams params; + }; + backend::Handle mUbHandle; - backend::Handle mSbHandle; + tsl::robin_map mTextureParameters; + mutable DescriptorSet mDescriptorSet; UniformBuffer mUniforms; - backend::SamplerGroup mSamplers; backend::PolygonOffset mPolygonOffset{}; backend::StencilState mStencilState{}; @@ -253,6 +276,7 @@ class FMaterialInstance : public MaterialInstance { bool mDepthWrite : 1; bool mHasScissor : 1; bool mIsDoubleSided : 1; + bool mIsDefaultInstance : 1; TransparencyMode mTransparencyMode : 2; uint64_t mMaterialSortingKey = 0; @@ -264,6 +288,8 @@ class FMaterialInstance : public MaterialInstance { }; utils::CString mName; + mutable utils::bitset64 mMissingSamplerDescriptors{}; + mutable std::once_flag mMissingSamplersFlag; }; FILAMENT_DOWNCAST(MaterialInstance) diff --git a/filament/src/details/MorphTargetBuffer.cpp b/filament/src/details/MorphTargetBuffer.cpp index 716b3fe3880..c496d58b06e 100644 --- a/filament/src/details/MorphTargetBuffer.cpp +++ b/filament/src/details/MorphTargetBuffer.cpp @@ -25,6 +25,8 @@ #include #include +#include + namespace filament { using namespace backend; @@ -38,21 +40,25 @@ struct MorphTargetBuffer::BuilderDetails { using BuilderType = MorphTargetBuffer; BuilderType::Builder::Builder() noexcept = default; BuilderType::Builder::~Builder() noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder&& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder&& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder const& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder&& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder const& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder&& rhs) noexcept = default; -MorphTargetBuffer::Builder& MorphTargetBuffer::Builder::vertexCount(size_t vertexCount) noexcept { +MorphTargetBuffer::Builder& MorphTargetBuffer::Builder::vertexCount(size_t const vertexCount) noexcept { mImpl->mVertexCount = vertexCount; return *this; } -MorphTargetBuffer::Builder& MorphTargetBuffer::Builder::count(size_t count) noexcept { +MorphTargetBuffer::Builder& MorphTargetBuffer::Builder::count(size_t const count) noexcept { mImpl->mCount = count; return *this; } +MorphTargetBuffer::Builder& MorphTargetBuffer::Builder::name(const char* name, size_t const len) noexcept { + return BuilderNameMixin::name(name, len); +} + MorphTargetBuffer* MorphTargetBuffer::Builder::build(Engine& engine) { return downcast(engine).createMorphTargetBuffer(*this); } @@ -63,11 +69,11 @@ MorphTargetBuffer* MorphTargetBuffer::Builder::build(Engine& engine) { // When you change this value, you must change MAX_MORPH_TARGET_BUFFER_WIDTH at getters.vs constexpr size_t MAX_MORPH_TARGET_BUFFER_WIDTH = 2048; -static inline size_t getWidth(size_t vertexCount) noexcept { +static inline size_t getWidth(size_t const vertexCount) noexcept { return std::min(vertexCount, MAX_MORPH_TARGET_BUFFER_WIDTH); } -static inline size_t getHeight(size_t vertexCount) noexcept { +static inline size_t getHeight(size_t const vertexCount) noexcept { return (vertexCount + MAX_MORPH_TARGET_BUFFER_WIDTH) / MAX_MORPH_TARGET_BUFFER_WIDTH; } @@ -75,7 +81,7 @@ template inline size_t getSize(size_t vertexCount) noexcept; template<> -inline size_t getSize(size_t vertexCount) noexcept { +inline size_t getSize(size_t const vertexCount) noexcept { const size_t stride = getWidth(vertexCount); const size_t height = getHeight(vertexCount); return Texture::PixelBufferDescriptor::computeDataSize( @@ -85,7 +91,7 @@ inline size_t getSize(size_t vertexCount) noexcept { } template<> -inline size_t getSize(size_t vertexCount) noexcept { +inline size_t getSize(size_t const vertexCount) noexcept { const size_t stride = getWidth(vertexCount); const size_t height = getHeight(vertexCount); return Texture::PixelBufferDescriptor::computeDataSize( @@ -102,6 +108,11 @@ FMorphTargetBuffer::EmptyMorphTargetBuilder::EmptyMorphTargetBuilder() { FMorphTargetBuffer::FMorphTargetBuffer(FEngine& engine, const Builder& builder) : mVertexCount(builder->mVertexCount), mCount(builder->mCount) { + + if (UTILS_UNLIKELY(engine.getActiveFeatureLevel() == FeatureLevel::FEATURE_LEVEL_0)) { + return; + } + FEngine::DriverApi& driver = engine.getDriverApi(); // create buffer (here a texture) to store the morphing vertex data @@ -119,32 +130,32 @@ FMorphTargetBuffer::FMorphTargetBuffer(FEngine& engine, const Builder& builder) mCount, TextureUsage::DEFAULT); - // create and update sampler group - mSbHandle = driver.createSamplerGroup(PerRenderPrimitiveMorphingSib::SAMPLER_COUNT); - SamplerGroup samplerGroup(PerRenderPrimitiveMorphingSib::SAMPLER_COUNT); - samplerGroup.setSampler(PerRenderPrimitiveMorphingSib::POSITIONS, { mPbHandle, {}}); - samplerGroup.setSampler(PerRenderPrimitiveMorphingSib::TANGENTS, { mTbHandle, {}}); - driver.updateSamplerGroup(mSbHandle, samplerGroup.toBufferDescriptor(driver)); + if (auto name = builder.getName(); !name.empty()) { + driver.setDebugTag(mPbHandle.getId(), name); + driver.setDebugTag(mTbHandle.getId(), std::move(name)); + } } void FMorphTargetBuffer::terminate(FEngine& engine) { FEngine::DriverApi& driver = engine.getDriverApi(); - driver.destroySamplerGroup(mSbHandle); - driver.destroyTexture(mTbHandle); - driver.destroyTexture(mPbHandle); + if (mTbHandle) { + driver.destroyTexture(mTbHandle); + } + if (mPbHandle) { + driver.destroyTexture(mPbHandle); + } } -void FMorphTargetBuffer::setPositionsAt(FEngine& engine, size_t targetIndex, - math::float3 const* positions, size_t count, size_t offset) { +void FMorphTargetBuffer::setPositionsAt(FEngine& engine, size_t const targetIndex, + float3 const* positions, size_t const count, size_t const offset) { + FILAMENT_CHECK_PRECONDITION(offset + count <= mVertexCount) + << "MorphTargetBuffer (size=" << (unsigned)mVertexCount + << ") overflow (count=" << (unsigned)count << ", offset=" << (unsigned)offset << ")"; - ASSERT_PRECONDITION(offset + count <= mVertexCount, - "MorphTargetBuffer (size=%lu) overflow (count=%u, offset=%u)", - (unsigned)mVertexCount, (unsigned)count, (unsigned)offset); + auto size = getSize(count); - auto size = getSize(mVertexCount); - - ASSERT_PRECONDITION(targetIndex < mCount, - "%d target index must be < %d", targetIndex, mCount); + FILAMENT_CHECK_PRECONDITION(targetIndex < mCount) + << targetIndex << " target index must be < " << mCount; // We could use a pool instead of malloc() directly. auto* out = (float4*) malloc(size); @@ -158,21 +169,20 @@ void FMorphTargetBuffer::setPositionsAt(FEngine& engine, size_t targetIndex, count, offset); } -void FMorphTargetBuffer::setPositionsAt(FEngine& engine, size_t targetIndex, - math::float4 const* positions, size_t count, size_t offset) { - - ASSERT_PRECONDITION(offset + count <= mVertexCount, - "MorphTargetBuffer (size=%lu) overflow (count=%u, offset=%u)", - (unsigned)mVertexCount, (unsigned)count, (unsigned)offset); +void FMorphTargetBuffer::setPositionsAt(FEngine& engine, size_t const targetIndex, + float4 const* positions, size_t const count, size_t const offset) { + FILAMENT_CHECK_PRECONDITION(offset + count <= mVertexCount) + << "MorphTargetBuffer (size=" << (unsigned)mVertexCount + << ") overflow (count=" << (unsigned)count << ", offset=" << (unsigned)offset << ")"; - auto size = getSize(mVertexCount); + auto size = getSize(count); - ASSERT_PRECONDITION(targetIndex < mCount, - "%d target index must be < %d", targetIndex, mCount); + FILAMENT_CHECK_PRECONDITION(targetIndex < mCount) + << targetIndex << " target index must be < " << mCount; // We could use a pool instead of malloc() directly. auto* out = (float4*) malloc(size); - memcpy(out, positions, sizeof(math::float4) * count); + memcpy(out, positions, sizeof(float4) * count); FEngine::DriverApi& driver = engine.getDriverApi(); updateDataAt(driver, mPbHandle, @@ -181,17 +191,16 @@ void FMorphTargetBuffer::setPositionsAt(FEngine& engine, size_t targetIndex, count, offset); } -void FMorphTargetBuffer::setTangentsAt(FEngine& engine, size_t targetIndex, - math::short4 const* tangents, size_t count, size_t offset) { - - ASSERT_PRECONDITION(offset + count <= mVertexCount, - "MorphTargetBuffer (size=%lu) overflow (count=%u, offset=%u)", - (unsigned)mVertexCount, (unsigned)count, (unsigned)offset); +void FMorphTargetBuffer::setTangentsAt(FEngine& engine, size_t const targetIndex, + short4 const* tangents, size_t const count, size_t const offset) { + FILAMENT_CHECK_PRECONDITION(offset + count <= mVertexCount) + << "MorphTargetBuffer (size=" << (unsigned)mVertexCount + << ") overflow (count=" << (unsigned)count << ", offset=" << (unsigned)offset << ")"; - const auto size = getSize(mVertexCount); + const auto size = getSize(count); - ASSERT_PRECONDITION(targetIndex < mCount, - "%d target index must be < %d", targetIndex, mCount); + FILAMENT_CHECK_PRECONDITION(targetIndex < mCount) + << targetIndex << " target index must be < " << mCount; // We could use a pool instead of malloc() directly. auto* out = (short4*) malloc(size); @@ -205,22 +214,22 @@ void FMorphTargetBuffer::setTangentsAt(FEngine& engine, size_t targetIndex, } UTILS_NOINLINE -void FMorphTargetBuffer::updateDataAt(backend::DriverApi& driver, - Handle handle, PixelDataFormat format, PixelDataType type, - const char* out, size_t elementSize, - size_t targetIndex, size_t count, size_t offset) { +void FMorphTargetBuffer::updateDataAt(DriverApi& driver, + Handle handle, PixelDataFormat const format, PixelDataType const type, + const char* out, size_t const elementSize, + size_t const targetIndex, size_t const count, size_t const offset) { size_t yoffset = offset / MAX_MORPH_TARGET_BUFFER_WIDTH; size_t const xoffset = offset % MAX_MORPH_TARGET_BUFFER_WIDTH; size_t const textureWidth = getWidth(mVertexCount); size_t const alignment = ((textureWidth - xoffset) % textureWidth); - size_t const lineCount = (count - alignment) / textureWidth; - size_t const lastLineCount = (count - alignment) % textureWidth; + size_t const lineCount = (count > alignment) ? (count - alignment) / textureWidth : 0; + size_t const lastLineCount = (count > alignment) ? (count - alignment) % textureWidth : 0; // 'out' buffer is going to be used up to 3 times, so for simplicity we use a shared_buffer // to manage its lifetime. One side effect of this is that the callbacks below will allocate // a small object on the heap. - std::shared_ptr allocation((void*)out, ::free); + std::shared_ptr const allocation((void*)out, free); // Note: because the texture width is up to 2048, we're expecting that most of the time // only a single texture update call will be necessary (i.e. that there are no more diff --git a/filament/src/details/MorphTargetBuffer.h b/filament/src/details/MorphTargetBuffer.h index 50e8fc92b92..e386627770c 100644 --- a/filament/src/details/MorphTargetBuffer.h +++ b/filament/src/details/MorphTargetBuffer.h @@ -21,15 +21,15 @@ #include -#include "backend/DriverApiForward.h" - -#include "private/backend/SamplerGroup.h" - +#include +#include #include -#include +#include +#include -#include +#include +#include namespace filament { @@ -37,7 +37,7 @@ class FEngine; class FMorphTargetBuffer : public MorphTargetBuffer { public: - class EmptyMorphTargetBuilder : public MorphTargetBuffer::Builder { + class EmptyMorphTargetBuilder : public Builder { public: EmptyMorphTargetBuilder(); }; @@ -59,21 +59,23 @@ class FMorphTargetBuffer : public MorphTargetBuffer { inline size_t getVertexCount() const noexcept { return mVertexCount; } inline size_t getCount() const noexcept { return mCount; } -private: - friend class FView; - friend class RenderPass; + backend::TextureHandle getPositionsHandle() const noexcept { + return mPbHandle; + } + backend::TextureHandle getTangentsHandle() const noexcept { + return mTbHandle; + } + +private: void updateDataAt(backend::DriverApi& driver, backend::Handle handle, backend::PixelDataFormat format, backend::PixelDataType type, const char* out, size_t elementSize, size_t targetIndex, size_t count, size_t offset); - inline backend::Handle getHwHandle() const noexcept { return mSbHandle; } - - backend::Handle mSbHandle; - backend::Handle mPbHandle; - backend::Handle mTbHandle; - size_t mVertexCount; - size_t mCount; + backend::TextureHandle mPbHandle; + backend::TextureHandle mTbHandle; + uint32_t mVertexCount; + uint32_t mCount; }; FILAMENT_DOWNCAST(MorphTargetBuffer) diff --git a/filament/src/details/RenderTarget.cpp b/filament/src/details/RenderTarget.cpp index bb8a0854182..e2ac3f9204c 100644 --- a/filament/src/details/RenderTarget.cpp +++ b/filament/src/details/RenderTarget.cpp @@ -21,9 +21,19 @@ #include "FilamentAPI-impl.h" -#include #include +#include +#include +#include + +#include +#include +#include + +#include +#include + namespace filament { @@ -34,92 +44,128 @@ struct RenderTarget::BuilderDetails { uint32_t mWidth{}; uint32_t mHeight{}; uint8_t mSamples = 1; // currently not settable in the public facing API + // The number of layers for the render target. The value should be 1 except for multiview. + // If multiview is enabled, this value is appropriately updated based on the layerCount value + // from each attachment. Hence, #>1 means using multiview + uint8_t mLayerCount = 1; }; using BuilderType = RenderTarget; BuilderType::Builder::Builder() noexcept = default; BuilderType::Builder::~Builder() noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder&& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder&& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder const& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder&& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder const& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder&& rhs) noexcept = default; RenderTarget::Builder& RenderTarget::Builder::texture(AttachmentPoint pt, Texture* texture) noexcept { mImpl->mAttachments[(size_t)pt].texture = downcast(texture); return *this; } -RenderTarget::Builder& RenderTarget::Builder::mipLevel(AttachmentPoint pt, uint8_t level) noexcept { +RenderTarget::Builder& RenderTarget::Builder::mipLevel(AttachmentPoint pt, uint8_t const level) noexcept { mImpl->mAttachments[(size_t)pt].mipLevel = level; return *this; } -RenderTarget::Builder& RenderTarget::Builder::face(AttachmentPoint pt, CubemapFace face) noexcept { +RenderTarget::Builder& RenderTarget::Builder::face(AttachmentPoint pt, CubemapFace const face) noexcept { mImpl->mAttachments[(size_t)pt].face = face; return *this; } -RenderTarget::Builder& RenderTarget::Builder::layer(AttachmentPoint pt, uint32_t layer) noexcept { +RenderTarget::Builder& RenderTarget::Builder::layer(AttachmentPoint pt, uint32_t const layer) noexcept { mImpl->mAttachments[(size_t)pt].layer = layer; return *this; } +RenderTarget::Builder& RenderTarget::Builder::multiview(AttachmentPoint pt, uint8_t const layerCount, + uint8_t const baseLayer/*= 0*/) noexcept { + mImpl->mAttachments[(size_t)pt].layer = baseLayer; + mImpl->mAttachments[(size_t)pt].layerCount = layerCount; + return *this; +} + + RenderTarget* RenderTarget::Builder::build(Engine& engine) { using backend::TextureUsage; const FRenderTarget::Attachment& color = mImpl->mAttachments[(size_t)AttachmentPoint::COLOR0]; const FRenderTarget::Attachment& depth = mImpl->mAttachments[(size_t)AttachmentPoint::DEPTH]; - ASSERT_PRECONDITION(color.texture, "COLOR0 attachment not set"); - ASSERT_PRECONDITION(color.texture->getUsage() & TextureUsage::COLOR_ATTACHMENT, - "Texture usage must contain COLOR_ATTACHMENT"); + if (color.texture) { + FILAMENT_CHECK_PRECONDITION(color.texture->getUsage() & TextureUsage::COLOR_ATTACHMENT) + << "Texture usage must contain COLOR_ATTACHMENT"; + FILAMENT_CHECK_PRECONDITION(color.texture->getTarget() != Texture::Sampler::SAMPLER_EXTERNAL) + << "Color attachment can't be an external texture"; + } if (depth.texture) { - ASSERT_PRECONDITION(depth.texture->getUsage() & TextureUsage::DEPTH_ATTACHMENT, - "Texture usage must contain DEPTH_ATTACHMENT"); + FILAMENT_CHECK_PRECONDITION(depth.texture->getUsage() & TextureUsage::DEPTH_ATTACHMENT) + << "Texture usage must contain DEPTH_ATTACHMENT"; + FILAMENT_CHECK_PRECONDITION(depth.texture->getTarget() != Texture::Sampler::SAMPLER_EXTERNAL) + << "Depth attachment can't be an external texture"; } const size_t maxDrawBuffers = downcast(engine).getDriverApi().getMaxDrawBuffers(); for (size_t i = maxDrawBuffers; i < MAX_SUPPORTED_COLOR_ATTACHMENTS_COUNT; i++) { - ASSERT_PRECONDITION(!mImpl->mAttachments[i].texture, - "Only %u color attachments are supported, but COLOR%u attachment is set", - maxDrawBuffers, i); + FILAMENT_CHECK_PRECONDITION(!mImpl->mAttachments[i].texture) + << "Only " << maxDrawBuffers << " color attachments are supported, but COLOR" << i + << " attachment is set"; } uint32_t minWidth = std::numeric_limits::max(); uint32_t maxWidth = 0; uint32_t minHeight = std::numeric_limits::max(); uint32_t maxHeight = 0; + uint32_t minLayerCount = std::numeric_limits::max(); + uint32_t maxLayerCount = 0; for (auto const& attachment : mImpl->mAttachments) { if (attachment.texture) { const uint32_t w = attachment.texture->getWidth(attachment.mipLevel); const uint32_t h = attachment.texture->getHeight(attachment.mipLevel); + const uint32_t d = attachment.texture->getDepth(attachment.mipLevel); + const uint32_t l = attachment.layerCount; + if (l > 0) { + FILAMENT_CHECK_PRECONDITION( + attachment.texture->getTarget() == Texture::Sampler::SAMPLER_2D_ARRAY) + << "Texture sampler must be of 2d array for multiview"; + } + FILAMENT_CHECK_PRECONDITION(attachment.layer + l <= d) + << "layer + layerCount cannot exceed the number of depth"; minWidth = std::min(minWidth, w); minHeight = std::min(minHeight, h); + minLayerCount = std::min(minLayerCount, l); maxWidth = std::max(maxWidth, w); maxHeight = std::max(maxHeight, h); + maxLayerCount = std::max(maxLayerCount, l); } } - ASSERT_PRECONDITION(minWidth == maxWidth && minHeight == maxHeight, - "All attachments dimensions must match"); + FILAMENT_CHECK_PRECONDITION(minWidth == maxWidth && minHeight == maxHeight + && minLayerCount == maxLayerCount) << "All attachments dimensions must match"; mImpl->mWidth = minWidth; mImpl->mHeight = minHeight; + if (minLayerCount > 0) { + // mLayerCount should be 1 except for multiview use where we update this variable + // to the number of layerCount for multiview. + mImpl->mLayerCount = minLayerCount; + } return downcast(engine).createRenderTarget(*this); } // ------------------------------------------------------------------------------------------------ -FRenderTarget::FRenderTarget(FEngine& engine, const RenderTarget::Builder& builder) - : mSupportedColorAttachmentsCount(engine.getDriverApi().getMaxDrawBuffers()) { - +FRenderTarget::FRenderTarget(FEngine& engine, const Builder& builder) + : mSupportedColorAttachmentsCount(engine.getDriverApi().getMaxDrawBuffers()), + mSupportsReadPixels(false) { std::copy(std::begin(builder.mImpl->mAttachments), std::end(builder.mImpl->mAttachments), std::begin(mAttachments)); - backend::MRT mrt{}; + MRT mrt{}; TargetBufferInfo dinfo{}; - auto setAttachment = [this](TargetBufferInfo& info, AttachmentPoint attachmentPoint) { + auto setAttachment = [this, &driver = engine.getDriverApi()] + (TargetBufferInfo& info, AttachmentPoint attachmentPoint) { Attachment const& attachment = mAttachments[(size_t)attachmentPoint]; auto t = downcast(attachment.texture); info.handle = t->getHwHandle(); @@ -129,19 +175,30 @@ FRenderTarget::FRenderTarget(FEngine& engine, const RenderTarget::Builder& build } else { info.layer = attachment.layer; } + t->updateLodRange(info.level); }; UTILS_NOUNROLL for (size_t i = 0; i < MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT; i++) { Attachment const& attachment = mAttachments[i]; if (attachment.texture) { - TargetBufferFlags targetBufferBit = getTargetBufferFlagsAt(i); + TargetBufferFlags const targetBufferBit = getTargetBufferFlagsAt(i); mAttachmentMask |= targetBufferBit; setAttachment(mrt[i], (AttachmentPoint)i); if (any(attachment.texture->getUsage() & (TextureUsage::SAMPLEABLE | Texture::Usage::SUBPASS_INPUT))) { mSampleableAttachmentsMask |= targetBufferBit; } + + // readPixels() only applies to the color attachment that binds at index 0. + if (i == 0 && any(attachment.texture->getUsage() & TextureUsage::COLOR_ATTACHMENT)) { + + // TODO: the following will be changed to + // mSupportsReadPixels = + // any(attachment.texture->getUsage() & TextureUsage::BLIT_SRC); + // in a later filament version when clients have properly added the right usage. + mSupportsReadPixels = attachment.texture->hasBlitSrcUsage(); + } } } @@ -159,7 +216,8 @@ FRenderTarget::FRenderTarget(FEngine& engine, const RenderTarget::Builder& build FEngine::DriverApi& driver = engine.getDriverApi(); mHandle = driver.createRenderTarget(mAttachmentMask, - builder.mImpl->mWidth, builder.mImpl->mHeight, builder.mImpl->mSamples, mrt, dinfo, {}); + builder.mImpl->mWidth, builder.mImpl->mHeight, builder.mImpl->mSamples, + builder.mImpl->mLayerCount, mrt, dinfo, {}); } void FRenderTarget::terminate(FEngine& engine) { diff --git a/filament/src/details/RenderTarget.h b/filament/src/details/RenderTarget.h index 3b5dca98cb0..8ccf7255888 100644 --- a/filament/src/details/RenderTarget.h +++ b/filament/src/details/RenderTarget.h @@ -37,8 +37,11 @@ class FRenderTarget : public RenderTarget { struct Attachment { FTexture* texture = nullptr; uint8_t mipLevel = 0; - CubemapFace face = RenderTarget::CubemapFace::POSITIVE_X; + CubemapFace face = CubemapFace::POSITIVE_X; uint32_t layer = 0; + // Indicates the number of layers used for multiview, starting from the `layer` (baseIndex). + // This means `layer` + `layerCount` cannot exceed the number of depth for the attachment. + uint16_t layerCount = 0; }; FRenderTarget(FEngine& engine, const Builder& builder); @@ -65,6 +68,10 @@ class FRenderTarget : public RenderTarget { bool hasSampleableDepth() const noexcept; + bool supportsReadPixels() const noexcept { + return mSupportsReadPixels; + } + private: friend class RenderTarget; static constexpr size_t ATTACHMENT_COUNT = MAX_SUPPORTED_COLOR_ATTACHMENTS_COUNT + 1u; @@ -73,6 +80,7 @@ class FRenderTarget : public RenderTarget { backend::TargetBufferFlags mAttachmentMask = {}; backend::TargetBufferFlags mSampleableAttachmentsMask = {}; const uint8_t mSupportedColorAttachmentsCount; + bool mSupportsReadPixels = false; }; FILAMENT_DOWNCAST(RenderTarget) diff --git a/filament/src/details/Renderer.cpp b/filament/src/details/Renderer.cpp index 051c16ae9d7..6057c92a52c 100644 --- a/filament/src/details/Renderer.cpp +++ b/filament/src/details/Renderer.cpp @@ -16,6 +16,9 @@ #include "details/Renderer.h" +#include "Allocators.h" +#include "DebugRegistry.h" +#include "FrameHistory.h" #include "PostProcessManager.h" #include "RendererUtils.h" #include "RenderPass.h" @@ -28,21 +31,45 @@ #include "details/Texture.h" #include "details/View.h" +#include +#include +#include #include +#include +#include +#include #include #include "fg/FrameGraph.h" #include "fg/FrameGraphId.h" #include "fg/FrameGraphResources.h" +#include "fg/FrameGraphTexture.h" + +#include +#include +#include #include #include +#include +#include #include #include -#include #include +#include +#include +#include +#include + +#include +#include + +#ifdef __ANDROID__ +#include +#endif + // this helps visualize what dynamic-scaling is doing #define DEBUG_DYNAMIC_SCALING false @@ -55,7 +82,7 @@ using namespace backend; FRenderer::FRenderer(FEngine& engine) : mEngine(engine), - mFrameSkipper(1u), + mFrameSkipper(), mRenderTargetHandle(engine.getDefaultRenderTarget()), mFrameInfoManager(engine.getDriverApi()), mHdrTranslucent(TextureFormat::RGBA16F), @@ -63,13 +90,36 @@ FRenderer::FRenderer(FEngine& engine) : mHdrQualityHigh(TextureFormat::RGB16F), mIsRGB8Supported(false), mUserEpoch(engine.getEngineEpoch()), - mPerRenderPassArena(engine.getPerRenderPassAllocator()) + mResourceAllocator(std::make_unique( + engine.getSharedResourceAllocatorDisposer(), + engine.getConfig(), + engine.getDriverApi())) { FDebugRegistry& debugRegistry = engine.getDebugRegistry(); debugRegistry.registerProperty("d.renderer.doFrameCapture", &engine.debug.renderer.doFrameCapture); debugRegistry.registerProperty("d.renderer.disable_buffer_padding", &engine.debug.renderer.disable_buffer_padding); + debugRegistry.registerProperty("d.renderer.disable_subpasses", + &engine.debug.renderer.disable_subpasses); + debugRegistry.registerProperty("d.shadowmap.display_shadow_texture", + &engine.debug.shadowmap.display_shadow_texture); + debugRegistry.registerProperty("d.shadowmap.display_shadow_texture_scale", + &engine.debug.shadowmap.display_shadow_texture_scale); + debugRegistry.registerProperty("d.shadowmap.display_shadow_texture_layer", + &engine.debug.shadowmap.display_shadow_texture_layer); + debugRegistry.registerProperty("d.shadowmap.display_shadow_texture_level", + &engine.debug.shadowmap.display_shadow_texture_level); + debugRegistry.registerProperty("d.shadowmap.display_shadow_texture_channel", + &engine.debug.shadowmap.display_shadow_texture_channel); + debugRegistry.registerProperty("d.shadowmap.display_shadow_texture_layer_count", + &engine.debug.shadowmap.display_shadow_texture_layer_count); + debugRegistry.registerProperty("d.shadowmap.display_shadow_texture_level_count", + &engine.debug.shadowmap.display_shadow_texture_level_count); + debugRegistry.registerProperty("d.shadowmap.display_shadow_texture_power", + &engine.debug.shadowmap.display_shadow_texture_power); + debugRegistry.registerProperty("d.stereo.combine_multiview_images", + &engine.debug.stereo.combine_multiview_images); DriverApi& driver = engine.getDriverApi(); @@ -119,11 +169,11 @@ void FRenderer::terminate(FEngine& engine) { // shut down threads if we created any. DriverApi& driver = engine.getDriverApi(); - // before we can destroy this Renderer's resources, we must make sure + // Before we can destroy this Renderer's resources, we must make sure // that all pending commands have been executed (as they could reference data in this // instance, e.g. Fences, Callbacks, etc...) if (UTILS_HAS_THREADING) { - Fence::waitAndDestroy(engine.createFence(FFence::Type::SOFT)); + Fence::waitAndDestroy(engine.createFence()); } else { // In single threaded mode, allow recently-created objects (e.g. no-op fences in Skipper) // to initialize themselves, otherwise the engine tries to destroy invalid handles. @@ -131,13 +181,14 @@ void FRenderer::terminate(FEngine& engine) { } mFrameInfoManager.terminate(driver); mFrameSkipper.terminate(driver); + mResourceAllocator->terminate(); } void FRenderer::resetUserTime() { mUserEpoch = std::chrono::steady_clock::now(); } -TextureFormat FRenderer::getHdrFormat(const FView& view, bool translucent) const noexcept { +TextureFormat FRenderer::getHdrFormat(const FView& view, bool const translucent) const noexcept { if (translucent) { return mHdrTranslucent; } @@ -152,7 +203,7 @@ TextureFormat FRenderer::getHdrFormat(const FView& view, bool translucent) const } } -TextureFormat FRenderer::getLdrFormat(bool translucent) const noexcept { +TextureFormat FRenderer::getLdrFormat(bool const translucent) const noexcept { return (translucent || !mIsRGB8Supported) ? TextureFormat::RGBA8 : TextureFormat::RGB8; } @@ -167,7 +218,7 @@ std::pair, TargetBufferFlags> return { outTarget, outAttachmentMask }; } -backend::TargetBufferFlags FRenderer::getClearFlags() const noexcept { +TargetBufferFlags FRenderer::getClearFlags() const noexcept { return (mClearOptions.clear ? TargetBufferFlags::COLOR : TargetBufferFlags::NONE) | TargetBufferFlags::DEPTH_AND_STENCIL; } @@ -182,16 +233,73 @@ void FRenderer::initializeClearFlags() noexcept { mClearFlags = getClearFlags(); } -void FRenderer::setPresentationTime(int64_t monotonic_clock_ns) { +void FRenderer::setPresentationTime(int64_t const monotonic_clock_ns) { FEngine::DriverApi& driver = mEngine.getDriverApi(); driver.setPresentationTime(monotonic_clock_ns); } +void FRenderer::setVsyncTime(uint64_t const steadyClockTimeNano) noexcept { + mVsyncSteadyClockTimeNano = steadyClockTimeNano; +} + +void FRenderer::skipFrame(uint64_t vsyncSteadyClockTimeNano) { + SYSTRACE_CALL(); + + FILAMENT_CHECK_PRECONDITION(!mSwapChain) << + "skipFrame() can't be called between beginFrame() and endFrame()"; + + if (!vsyncSteadyClockTimeNano) { + vsyncSteadyClockTimeNano = mVsyncSteadyClockTimeNano; + mVsyncSteadyClockTimeNano = 0; + } + + FEngine& engine = mEngine; + FEngine::DriverApi& driver = engine.getDriverApi(); + + // Gives the backend a chance to execute periodic tasks. This must be called before + // the frame skipper. + driver.tick(); + + // do this before engine.flush() + mResourceAllocator->gc(true); + + // Run the component managers' GC in parallel + // WARNING: while doing this we can't access any component manager + auto& js = engine.getJobSystem(); + + auto *job = js.runAndRetain(jobs::createJob(js, nullptr, &FEngine::gc, &engine)); // gc all managers + + engine.flush(); // flush command stream + + // make sure we're done with the gcs + js.waitAndRelease(job); +} + bool FRenderer::beginFrame(FSwapChain* swapChain, uint64_t vsyncSteadyClockTimeNano) { assert_invariant(swapChain); SYSTRACE_CALL(); +#if 0 && defined(__ANDROID__) + char scratch[PROP_VALUE_MAX + 1]; + int length = __system_property_get("debug.filament.protected", scratch); + if (swapChain && length > 0) { + uint64_t flags = swapChain->getFlags(); + bool value = bool(atoi(scratch)); + if (value) { + flags |= SwapChain::CONFIG_PROTECTED_CONTENT; + } else { + flags &= ~SwapChain::CONFIG_PROTECTED_CONTENT; + } + swapChain->recreateWithNewFlags(mEngine, flags); + } +#endif + + if (!vsyncSteadyClockTimeNano) { + vsyncSteadyClockTimeNano = mVsyncSteadyClockTimeNano; + mVsyncSteadyClockTimeNano = 0; + } + // get the timestamp as soon as possible using namespace std::chrono; const steady_clock::time_point now{ steady_clock::now() }; @@ -201,11 +309,7 @@ bool FRenderer::beginFrame(FSwapChain* swapChain, uint64_t vsyncSteadyClockTimeN mFrameId++; mViewRenderedCount = 0; - { // scope for frame id trace - char buf[64]; - snprintf(buf, 64, "frame %u", mFrameId); - SYSTRACE_NAME(buf); - } + SYSTRACE_FRAME_ID(mFrameId); FEngine& engine = mEngine; FEngine::DriverApi& driver = engine.getDriverApi(); @@ -231,7 +335,8 @@ bool FRenderer::beginFrame(FSwapChain* swapChain, uint64_t vsyncSteadyClockTimeN // NOTE: this makes synchronous calls to the driver driver.updateStreams(&driver); - // gives the backend a chance to execute periodic tasks + // Gives the backend a chance to execute periodic tasks. This must be called before + // the frame skipper. driver.tick(); /* @@ -239,11 +344,19 @@ bool FRenderer::beginFrame(FSwapChain* swapChain, uint64_t vsyncSteadyClockTimeN * to ignore the return value and render the frame anyway -- which is perfectly fine. * The remaining work will be done when the first render() call is made. */ - auto beginFrameInternal = [this, appVsync]() { + auto beginFrameInternal = [this, appVsync, swapChain]() { FEngine& engine = mEngine; FEngine::DriverApi& driver = engine.getDriverApi(); - driver.beginFrame(appVsync.time_since_epoch().count(), mFrameId); + // we need to re-set mSwapChain here because if a frame was marked as "skip" but the + // user ignored us, we'd still want mSwapChain to be set. + mSwapChain = swapChain; + + driver.beginFrame( + appVsync.time_since_epoch().count(), + mDisplayInfo.refreshRate == 0.0 ? 0 : int64_t( + 1'000'000'000.0 / mDisplayInfo.refreshRate), + mFrameId); // This need to occur after the backend beginFrame() because some backends need to start // a command buffer before creating a fence. @@ -267,6 +380,10 @@ bool FRenderer::beginFrame(FSwapChain* swapChain, uint64_t vsyncSteadyClockTimeN // so we need to delay this work until that happens. mBeginFrameInternal = beginFrameInternal; + // clear mSwapChain because the frame should be skipped (it will be re-set if the user + // ignores the skip) + mSwapChain = nullptr; + // we need to flush in this case, to make sure the tick() call is executed at some point engine.flush(); @@ -290,14 +407,17 @@ void FRenderer::endFrame() { driver.debugThreading(); } - mFrameInfoManager.endFrame(driver); - mFrameSkipper.endFrame(driver); + FILAMENT_CHECK_PRECONDITION(engine.isValid(mSwapChain)) + << "SwapChain must remain valid until endFrame is called."; if (mSwapChain) { mSwapChain->commit(driver); mSwapChain = nullptr; } + mFrameInfoManager.endFrame(driver); + mFrameSkipper.endFrame(driver); + driver.endFrame(mFrameId); // gives the backend a chance to execute periodic tasks @@ -310,7 +430,7 @@ void FRenderer::endFrame() { } // do this before engine.flush() - engine.getResourceAllocator().gc(); + mResourceAllocator->gc(); // Run the component managers' GC in parallel // WARNING: while doing this we can't access any component manager @@ -324,26 +444,35 @@ void FRenderer::endFrame() { js.waitAndRelease(job); } -void FRenderer::readPixels(uint32_t xoffset, uint32_t yoffset, uint32_t width, uint32_t height, +void FRenderer::readPixels(uint32_t const xoffset, uint32_t const yoffset, uint32_t const width, uint32_t const height, PixelBufferDescriptor&& buffer) { #ifndef NDEBUG const bool withinFrame = mSwapChain != nullptr; - ASSERT_PRECONDITION(withinFrame, "readPixels() on a SwapChain must be called after" - " beginFrame() and before endFrame()."); + FILAMENT_CHECK_PRECONDITION(withinFrame) << "readPixels() on a SwapChain must be called after" + " beginFrame() and before endFrame()."; #endif RendererUtils::readPixels(mEngine.getDriverApi(), mRenderTargetHandle, xoffset, yoffset, width, height, std::move(buffer)); } void FRenderer::readPixels(FRenderTarget* renderTarget, - uint32_t xoffset, uint32_t yoffset, uint32_t width, uint32_t height, - backend::PixelBufferDescriptor&& buffer) { + uint32_t const xoffset, uint32_t const yoffset, uint32_t const width, uint32_t const height, + PixelBufferDescriptor&& buffer) { + + // TODO: change the following to an assert when client call sites have addressed the issue. + if (!renderTarget->supportsReadPixels()) { + slog.w << "readPixels() must be called with a renderTarget with COLOR0 created with " + "TextureUsage::BLIT_SRC. This precondition will be asserted in a later " + "release of Filament." + << io::endl; + } + RendererUtils::readPixels(mEngine.getDriverApi(), renderTarget->getHwHandle(), xoffset, yoffset, width, height, std::move(buffer)); } void FRenderer::copyFrame(FSwapChain* dstSwapChain, filament::Viewport const& dstViewport, - filament::Viewport const& srcViewport, CopyFrameFlag flags) { + filament::Viewport const& srcViewport, CopyFrameFlag const flags) { SYSTRACE_CALL(); assert_invariant(mSwapChain); @@ -368,19 +497,19 @@ void FRenderer::copyFrame(FSwapChain* dstSwapChain, filament::Viewport const& ds params.viewport.bottom = 0; params.viewport.width = std::numeric_limits::max(); params.viewport.height = std::numeric_limits::max(); + driver.beginRenderPass(mRenderTargetHandle, params); + driver.endRenderPass(); } - driver.beginRenderPass(mRenderTargetHandle, params); // Verify that the source swap chain is readable. assert_invariant(mSwapChain->isReadable()); - driver.blit(TargetBufferFlags::COLOR, - mRenderTargetHandle, dstViewport, mRenderTargetHandle, srcViewport, SamplerMagFilter::LINEAR); + driver.blitDEPRECATED(TargetBufferFlags::COLOR, mRenderTargetHandle, + dstViewport, mRenderTargetHandle, srcViewport, SamplerMagFilter::LINEAR); + if (flags & SET_PRESENTATION_TIME) { // TODO: Implement this properly, see https://github.com/google/filament/issues/633 } - driver.endRenderPass(); - if (flags & COMMIT) { dstSwapChain->commit(driver); } @@ -395,8 +524,11 @@ void FRenderer::renderStandaloneView(FView const* view) { using namespace std::chrono; - ASSERT_PRECONDITION(view->getRenderTarget(), - "View \"%s\" must have a RenderTarget associated", view->getName()); + FILAMENT_CHECK_PRECONDITION(view->getRenderTarget()) + << "View \"" << view->getName() << "\" must have a RenderTarget associated"; + + FILAMENT_CHECK_PRECONDITION(!mSwapChain) + << "renderStandaloneView() must be called outside of beginFrame() / endFrame()"; if (UTILS_LIKELY(view->getScene())) { mPreviousRenderTargets.clear(); @@ -407,19 +539,27 @@ void FRenderer::renderStandaloneView(FView const* view) { engine.prepare(); FEngine::DriverApi& driver = engine.getDriverApi(); - driver.beginFrame(steady_clock::now().time_since_epoch().count(), mFrameId); + driver.beginFrame( + steady_clock::now().time_since_epoch().count(), + mDisplayInfo.refreshRate == 0.0 ? 0 : int64_t( + 1'000'000'000.0 / mDisplayInfo.refreshRate), + mFrameId); renderInternal(view); driver.endFrame(mFrameId); + + // This is a workaround for internal bug b/361822355. + // TODO: properly address the bug and remove this workaround. + if (engine.getBackend() == Backend::VULKAN) { + engine.flushAndWait(); + } } } void FRenderer::render(FView const* view) { SYSTRACE_CALL(); - assert_invariant(mSwapChain); - if (UTILS_UNLIKELY(mBeginFrameInternal)) { // this should not happen, the user should not call render() if we returned false from // beginFrame(). But because this is allowed, we handle it gracefully. @@ -427,9 +567,12 @@ void FRenderer::render(FView const* view) { mBeginFrameInternal = {}; } - if (UTILS_LIKELY(view && view->getScene())) { + // after beginFrame() is called, mSwapChain should be true + assert_invariant(mSwapChain); + + if (UTILS_LIKELY(view && view->getScene() && view->hasCamera())) { if (mViewRenderedCount) { - // this is a good place to kick the GPU, since we've rendered a View before, + // This is a good place to kick the GPU, since we've rendered a View before, // and we're about to render another one. mEngine.getDriverApi().flush(); } @@ -439,17 +582,21 @@ void FRenderer::render(FView const* view) { } void FRenderer::renderInternal(FView const* view) { - // per-renderpass data - ArenaScope rootArena(mPerRenderPassArena); - FEngine& engine = mEngine; - JobSystem& js = engine.getJobSystem(); + + FILAMENT_CHECK_PRECONDITION(!view->hasPostProcessPass() || + engine.hasFeatureLevel(FeatureLevel::FEATURE_LEVEL_1)) + << "post-processing is not supported at FEATURE_LEVEL_0"; + + // per-renderpass data + RootArenaScope rootArenaScope(engine.getPerRenderPassArena()); // create a root job so no other job can escape + JobSystem& js = engine.getJobSystem(); auto *rootJob = js.setRootJob(js.createJob()); // execute the render pass - renderJob(rootArena, const_cast(*view)); + renderJob(rootArenaScope, const_cast(*view)); // make sure to flush the command buffer engine.flush(); @@ -458,16 +605,17 @@ void FRenderer::renderInternal(FView const* view) { js.runAndWait(rootJob); } -void FRenderer::renderJob(ArenaScope& arena, FView& view) { +void FRenderer::renderJob(RootArenaScope& rootArenaScope, FView& view) { FEngine& engine = mEngine; JobSystem& js = engine.getJobSystem(); FEngine::DriverApi& driver = engine.getDriverApi(); PostProcessManager& ppm = engine.getPostProcessManager(); + ppm.setFrameUniforms(driver, view.getFrameUniforms()); // DEBUG: driver commands must all happen from the same thread. Enforce that on debug builds. driver.debugThreading(); - const bool hasPostProcess = view.hasPostProcessPass(); + bool hasPostProcess = view.hasPostProcessPass(); bool hasScreenSpaceRefraction = false; bool hasColorGrading = hasPostProcess; bool hasDithering = view.getDithering() == Dithering::TEMPORAL; @@ -483,7 +631,16 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { auto colorGrading = view.getColorGrading(); auto ssReflectionsOptions = view.getScreenSpaceReflectionsOptions(); auto guardBandOptions = view.getGuardBandOptions(); + const bool isRenderingMultiview = view.hasStereo() && + engine.getConfig().stereoscopicType == StereoscopicType::MULTIVIEW; + // FIXME: This is to override some settings that are not supported for multiview at the moment. + // Remove this when all features are supported. + if (isRenderingMultiview) { + hasPostProcess = false; + msaaOptions.enabled = false; + } const uint8_t msaaSampleCount = msaaOptions.enabled ? msaaOptions.sampleCount : 1u; + if (!hasPostProcess) { // disable all effects that are part of post-processing dofOptions.enabled = false; @@ -494,6 +651,19 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { hasDithering = false; hasFXAA = false; scale = 1.0f; + } else { + // This configures post-process materials by setting constant parameters + if (taaOptions.enabled) { + ppm.configureTemporalAntiAliasingMaterial(taaOptions); + if (taaOptions.upscaling) { + // for now TAA upscaling is incompatible with regular dsr + dsrOptions.enabled = false; + // also, upscaling doesn't work well with quater-resolution SSAO + aoOptions.resolution = 1.0; + // Currently we only support a fixed TAA upscaling ratio + scale = 0.5f; + } + } } const bool blendModeTranslucent = view.getBlendMode() == BlendMode::TRANSLUCENT; @@ -502,19 +672,28 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { const bool needsAlphaChannel = (mSwapChain && mSwapChain->isTransparent()) || blendModeTranslucent; + const bool isProtectedContent = mSwapChain && mSwapChain->isProtected(); + + // Conditions to meet to be able to use the sub-pass rendering path. This is regardless of + // whether the backend supports subpasses (or if they are disabled in the debugRegistry). + const bool isSubpassPossible = + msaaSampleCount <= 1 && + hasColorGrading && + !bloomOptions.enabled && !dofOptions.enabled && !taaOptions.enabled; + // asSubpass is disabled with TAA (although it's supported) because performance was degraded // on qualcomm hardware -- we might need a backend dependent toggle at some point const PostProcessManager::ColorGradingConfig colorGradingConfig{ .asSubpass = - hasColorGrading && - msaaSampleCount <= 1 && - !bloomOptions.enabled && !dofOptions.enabled && !taaOptions.enabled && - driver.isFrameBufferFetchSupported(), + isSubpassPossible && + driver.isFrameBufferFetchSupported() && + !engine.debug.renderer.disable_subpasses, .customResolve = - msaaOptions.customResolve && msaaSampleCount > 1 && + driver.isFrameBufferFetchMultiSampleSupported() && + msaaOptions.customResolve && hasColorGrading && - driver.isFrameBufferFetchMultiSampleSupported(), + !engine.debug.renderer.disable_subpasses, .translucent = needsAlphaChannel, .fxaa = hasFXAA, .dithering = hasDithering, @@ -522,8 +701,11 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { TextureFormat::RGBA8 : getLdrFormat(needsAlphaChannel) }; + // by construction (msaaSampleCount) both asSubpass and customResolve can't be true + assert_invariant(colorGradingConfig.asSubpass + colorGradingConfig.customResolve < 2); + // whether we're scaled at all - const bool scaled = any(notEqual(scale, float2(1.0f))); + bool scaled = any(notEqual(scale, float2(1.0f))); // vp is the user defined viewport within the View filament::Viewport const& vp = view.getViewport(); @@ -544,13 +726,12 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { CameraInfo cameraInfo = view.computeCameraInfo(engine); - // when colorgrading-as-subpass is active, we know that many other effects are disabled - // such as dof, bloom. Moreover, if fxaa and scaling are not enabled, we're essentially in - // a very fast rendering path -- in this case, we would need an extra blit to "resolve" the - // buffer padding (because there are no other pass that can do it as a side effect). - // In this case, it is better to skip the padding, which won't be helping much. - const bool noBufferPadding = (colorGradingConfig.asSubpass && !hasFXAA && !scaled) - || engine.debug.renderer.disable_buffer_padding; + // If fxaa and scaling are not enabled, we're essentially in a very fast rendering path -- in + // this case, we would need an extra blit to "resolve" the buffer padding (because there are no + // other pass that can do it as a side effect). In this case, it is better to skip the padding, + // which won't be helping much. + const bool noBufferPadding = (isSubpassPossible && + !hasFXAA && !scaled) || engine.debug.renderer.disable_buffer_padding; // guardBand must be a multiple of 16 to guarantee the same exact rendering up to 4 mip levels. float const guardBand = guardBandOptions.enabled ? 16.0f : 0.0f; @@ -567,7 +748,7 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { // Without post-processing, we usually draw directly into // the SwapChain, and we might want to keep it this way. - auto round = [](uint32_t x) { + auto round = [](uint32_t const x) { constexpr uint32_t rounding = 16u; return (x + (rounding - 1u)) & ~(rounding - 1u); }; @@ -601,7 +782,7 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { // VERTEX_DOMAIN_DEVICE doesn't apply the projection, but it still needs this // clip transform, so we apply it separately (see main.vs) - cameraInfo.clipTransfrom = { ts[0][0], ts[1][1], ts[3].x, ts[3].y }; + cameraInfo.clipTransform = { ts[0][0], ts[1][1], ts[3].x, ts[3].y }; // adjust svp to the new, larger, rendering dimensions svp.width = uint32_t(width); @@ -610,17 +791,9 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { xvp.bottom = int32_t(guardBand); } - view.prepare(engine, driver, arena, svp, cameraInfo, getShaderUserTime(), needsAlphaChannel); + view.prepare(engine, driver, rootArenaScope, svp, cameraInfo, getShaderUserTime(), needsAlphaChannel); - view.prepareUpscaler(scale); - - // start froxelization immediately, it has no dependencies - JobSystem::Job* jobFroxelize = nullptr; - if (view.hasDynamicLighting()) { - jobFroxelize = js.runAndRetain(js.createJob(nullptr, - [&engine, &view, &viewMatrix = cameraInfo.view](JobSystem&, JobSystem::Job*) { - view.froxelize(engine, viewMatrix); })); - } + view.prepareUpscaler(scale, taaOptions, dsrOptions); /* * Allocate command buffer @@ -631,28 +804,32 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { // Allocate some space for our commands in the per-frame Arena, and use that space as // an Arena for commands. All this space is released when we exit this method. size_t const perFrameCommandsSize = engine.getPerFrameCommandsSize(); - void* const arenaBegin = arena.allocate(perFrameCommandsSize, CACHELINE_SIZE); + void* const arenaBegin = rootArenaScope.allocate(perFrameCommandsSize, CACHELINE_SIZE); void* const arenaEnd = pointermath::add(arenaBegin, perFrameCommandsSize); + + // This arena *must* stay valid until all commands have been processed RenderPass::Arena commandArena("Command Arena", { arenaBegin, arenaEnd }); RenderPass::RenderFlags renderFlags = 0; if (view.hasShadowing()) renderFlags |= RenderPass::HAS_SHADOWING; if (view.isFrontFaceWindingInverted()) renderFlags |= RenderPass::HAS_INVERSE_FRONT_FACES; - RenderPass pass(engine, commandArena); - pass.setRenderFlags(renderFlags); + RenderPassBuilder passBuilder(commandArena); + passBuilder.renderFlags(renderFlags); Variant variant; - variant.setDirectionalLighting(view.hasDirectionalLight()); + variant.setDirectionalLighting(view.hasDirectionalLighting()); variant.setDynamicLighting(view.hasDynamicLighting()); variant.setFog(view.hasFog()); variant.setVsm(view.hasShadowing() && view.getShadowType() != ShadowType::PCF); + variant.setStereo(view.hasStereo()); /* * Frame graph */ - FrameGraph fg(engine.getResourceAllocator()); + FrameGraph fg(*mResourceAllocator, + isProtectedContent ? FrameGraph::Mode::PROTECTED : FrameGraph::Mode::UNPROTECTED); auto& blackboard = fg.getBlackboard(); /* @@ -662,21 +839,21 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { if (view.needsShadowMap()) { Variant shadowVariant(Variant::DEPTH_VARIANT); shadowVariant.setVsm(view.getShadowType() == ShadowType::VSM); - - RenderPass shadowPass(pass); - shadowPass.setVariant(shadowVariant); - auto shadows = view.renderShadowMaps(engine, fg, cameraInfo, mShaderUserTime, shadowPass); + auto shadows = view.renderShadowMaps(engine, fg, cameraInfo, mShaderUserTime, + RenderPassBuilder{ commandArena } + .renderFlags(renderFlags) + .variant(shadowVariant)); blackboard["shadows"] = shadows; } - // When we don't have a custom RenderTarget, currentRenderTarget below is nullptr and is + // When we don't have a custom RenderTarget, customRenderTarget below is nullptr and is // recorded in the list of targets already rendered into -- this ensures that // initializeClearFlags() is called only once for the default RenderTarget. auto& previousRenderTargets = mPreviousRenderTargets; - FRenderTarget* const currentRenderTarget = downcast(view.getRenderTarget()); + FRenderTarget* const customRenderTarget = downcast(view.getRenderTarget()); if (UTILS_LIKELY( - previousRenderTargets.find(currentRenderTarget) == previousRenderTargets.end())) { - previousRenderTargets.insert(currentRenderTarget); + previousRenderTargets.find(customRenderTarget) == previousRenderTargets.end())) { + previousRenderTargets.insert(customRenderTarget); initializeClearFlags(); } @@ -693,10 +870,10 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { const TargetBufferFlags keepOverrideStartFlags = TargetBufferFlags::ALL & ~discardStartFlags; TargetBufferFlags keepOverrideEndFlags = TargetBufferFlags::NONE; - if (currentRenderTarget) { + if (customRenderTarget) { // For custom RenderTarget, we look at each attachment flag and if they have their // SAMPLEABLE usage bit set, we assume they must not be discarded after the render pass. - keepOverrideEndFlags |= currentRenderTarget->getSampleableAttachmentsMask(); + keepOverrideEndFlags |= customRenderTarget->getSampleableAttachmentsMask(); } // Renderer's ClearOptions apply once at the beginning of the frame (not for each View), @@ -721,7 +898,6 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { .keepOverrideEnd = keepOverrideEndFlags }, viewRenderTarget); - const bool blending = blendModeTranslucent; const TextureFormat hdrFormat = getHdrFormat(view, needsAlphaChannel); // the clearFlags and clearColor specified below will only apply when rendering into the @@ -749,11 +925,11 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { // updatePrimitivesLod must be run before appendCommands and once for each set // of RenderPass::setCamera / RenderPass::setGeometry calls. - view.updatePrimitivesLod(engine, cameraInfo, - scene.getRenderableData(), view.getVisibleRenderables()); + FView::updatePrimitivesLod(scene.getRenderableData(), + engine, cameraInfo, view.getVisibleRenderables()); - pass.setCamera(cameraInfo); - pass.setGeometry(scene.getRenderableData(), view.getVisibleRenderables(), scene.getRenderableUBO()); + passBuilder.camera(cameraInfo); + passBuilder.geometry(scene.getRenderableData(), view.getVisibleRenderables()); // view set-ups that need to happen before rendering fg.addTrivialSideEffectPass("Prepare View Uniforms", @@ -787,34 +963,96 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { uint32_t(float(xvp.width ) * aoOptions.resolution), uint32_t(float(xvp.height) * aoOptions.resolution)}); - view.commitUniforms(driver); - - // set uniforms and samplers for the color passes - view.bindPerViewUniformsAndSamplers(driver); + // this needs to reset the sampler that are only set in RendererUtils::colorPass(), because + // this descriptor-set is also used for ssr/picking/structure and these could be stale + // it would be better to use a separate desriptor-set for those two cases so that we don't + // have to do this + view.unbindSamplers(driver); + view.commitUniformsAndSamplers(driver); }); // -------------------------------------------------------------------------------------------- // structure pass -- automatically culled if not used // Currently it consists of a simple depth pass. - // This is normally used by SSAO and contact-shadows + // This is normally used by SSAO and contact-shadows. + // Also, picking is handled here if transparent picking is disabled. // TODO: the scaling should depends on all passes that need the structure pass - const auto [structure, picking_] = ppm.structure(fg, pass, renderFlags, svp.width, svp.height, { + const auto [structure, picking_] = ppm.structure(fg, + passBuilder, renderFlags, svp.width, svp.height, { .scale = aoOptions.resolution, - .picking = view.hasPicking() + .picking = view.hasPicking() && !view.isTransparentPickingEnabled() }); - blackboard["structure"] = structure; - const auto picking = picking_; + auto picking = picking_; + // -------------------------------------------------------------------------------------------- + // Picking pass -- automatically culled if not used + // Picking is handled here if transparent picking is enabled. if (view.hasPicking()) { + if (view.isTransparentPickingEnabled()) { + struct PickingRenderPassData { + FrameGraphId depth; + FrameGraphId picking; + }; + auto& pickingRenderPass = fg.addPass("Picking Render Pass", + [&](FrameGraph::Builder& builder, auto& data) { + bool const isFL0 = mEngine.getDriverApi().getFeatureLevel() == + FeatureLevel::FEATURE_LEVEL_0; + + // TODO: Specify the precision for picking pass + uint32_t const width = std::max(32u, + (uint32_t)std::ceil(float(svp.width) * aoOptions.resolution)); + uint32_t const height = std::max(32u, + (uint32_t)std::ceil(float(svp.height) * aoOptions.resolution)); + data.depth = builder.createTexture("Depth Buffer", { + .width = width, .height = height, + .format = isFL0 ? TextureFormat::DEPTH24 : TextureFormat::DEPTH32F }); + + data.depth = builder.write(data.depth, + FrameGraphTexture::Usage::DEPTH_ATTACHMENT); + + data.picking = builder.createTexture("Picking Buffer", { + .width = width, .height = height, + .format = isFL0 ? TextureFormat::RGBA8 : TextureFormat::RG32F }); + + data.picking = builder.write(data.picking, + FrameGraphTexture::Usage::COLOR_ATTACHMENT); + + builder.declareRenderPass("Picking Render Target", { + .attachments = {.color = { data.picking }, .depth = data.depth }, + .clearFlags = TargetBufferFlags::COLOR0 | TargetBufferFlags::DEPTH + }); + }, + [=, passBuilder = passBuilder](FrameGraphResources const& resources, + auto const& data, DriverApi& driver) mutable { + Variant pickingVariant(Variant::DEPTH_VARIANT); + pickingVariant.setPicking(true); + + auto out = resources.getRenderPassInfo(); + passBuilder.renderFlags(renderFlags); + passBuilder.variant(pickingVariant); + passBuilder.commandTypeFlags(RenderPass::CommandTypeFlags::DEPTH); + + RenderPass const pass{ passBuilder.build(mEngine, driver) }; + driver.beginRenderPass(out.target, out.params); + pass.getExecutor().execute(mEngine, driver); + driver.endRenderPass(); + }); + picking = pickingRenderPass->picking; + } + struct PickingResolvePassData { FrameGraphId picking; }; - fg.addPass("Picking Resolve Pass", + fg.addPass( + "Picking Resolve Pass", [&](FrameGraph::Builder& builder, auto& data) { - data.picking = builder.read(picking, - FrameGraphTexture::Usage::COLOR_ATTACHMENT); + // Note that BLIT_SRC is needed because this texture will be read later (via + // readPixels()). + data.picking = + builder.read(picking, FrameGraphTexture::Usage::COLOR_ATTACHMENT | + FrameGraphTexture::Usage::BLIT_SRC); builder.declareRenderPass("Picking Resolve Target", { .attachments = { .color = { data.picking }} }); @@ -823,15 +1061,22 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { [=, &view](FrameGraphResources const& resources, auto const&, DriverApi& driver) mutable { auto out = resources.getRenderPassInfo(); - view.executePickingQueries(driver, out.target, aoOptions.resolution); + view.executePickingQueries(driver, out.target, scale * aoOptions.resolution); }); } // Store this frame's camera projection in the frame history. if (UTILS_UNLIKELY(taaOptions.enabled)) { // Apply the TAA jitter to everything after the structure pass, starting with the color pass. - ppm.prepareTaa(fg, svp, view.getFrameHistory(), &FrameHistoryEntry::taa, - &cameraInfo, view.getPerViewUniforms()); + ppm.TaaJitterCamera(svp, taaOptions, view.getFrameHistory(), + &FrameHistoryEntry::taa, &cameraInfo); + + fg.addTrivialSideEffectPass("Jitter Camera", + [&engine, &cameraInfo, &descriptorSet = view.getColorPassDescriptorSet()] + (DriverApi& driver) { + descriptorSet.prepareCamera(engine, cameraInfo); + descriptorSet.commit(driver); + }); } // -------------------------------------------------------------------------------------------- @@ -851,39 +1096,91 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { ssReflectionsOptions.enabled ? TextureFormat::RGBA16F : TextureFormat::R11F_G11F_B10F, view.getCameraUser().getFieldOfView(Camera::Fov::VERTICAL), config.scale); config.ssrLodOffset = ssrConfig.lodOffset; - blackboard["ssr"] = ssrConfig.ssr; // -------------------------------------------------------------------------------------------- // screen-space reflections pass if (ssReflectionsOptions.enabled) { - auto reflections = ppm.ssr(fg, pass, + auto reflections = ppm.ssr(fg, passBuilder, view.getFrameHistory(), cameraInfo, - view.getPerViewUniforms(), structure, ssReflectionsOptions, { .width = svp.width, .height = svp.height }); - // generate the mipchain - PostProcessManager::generateMipmapSSR(ppm, fg, - reflections, ssrConfig.reflection, false, ssrConfig); + if (UTILS_LIKELY(reflections)) { + // generate the mipchain + PostProcessManager::generateMipmapSSR(ppm, fg, + reflections, ssrConfig.reflection, false, ssrConfig); + } + config.screenSpaceReflectionHistoryNotReady = !reflections; } // -------------------------------------------------------------------------------------------- // Color passes + // this makes the viewport relative to xvp + // FIXME: we should use 'vp' when rendering directly into the swapchain, but that's hard to + // know at this point. This will usually be the case when post-process is disabled. + // FIXME: we probably should take the dynamic scaling into account too + // if MSAA is enabled, we end-up rendering in an intermediate buffer. This is the only case where + // "!hasPostProcess" doesn't guarantee rendering into the swapchain. + const bool useIntermediateBuffer = hasPostProcess || msaaOptions.enabled || + (isRenderingMultiview && engine.debug.stereo.combine_multiview_images); + passBuilder.scissorViewport(useIntermediateBuffer ? xvp : vp); + // This one doesn't need to be a FrameGraph pass because it always happens by construction // (i.e. it won't be culled, unless everything is culled), so no need to complexify things. - pass.setVariant(variant); - pass.appendCommands(engine, RenderPass::COLOR); - pass.sortCommands(engine); + passBuilder.variant(variant); + + // This is optional, if not set, the per-view descriptor-set must be set before calling execute() + passBuilder.colorPassDescriptorSet(&view.getColorPassDescriptorSet()); + + // color-grading as subpass is done either by the color pass or the TAA pass if any + auto colorGradingConfigForColor = colorGradingConfig; + colorGradingConfigForColor.asSubpass = colorGradingConfigForColor.asSubpass && !taaOptions.enabled; + + if (colorGradingConfigForColor.asSubpass) { + // append color grading subpass after all other passes + passBuilder.customCommand(3, + RenderPass::Pass::BLENDED, + RenderPass::CustomCommand::EPILOG, + 0, [&ppm, &driver, colorGradingConfigForColor]() { + ppm.colorGradingSubpass(driver, colorGradingConfigForColor); + }); + } else if (colorGradingConfig.customResolve) { + // append custom resolve subpass after all other passes + passBuilder.customCommand(3, + RenderPass::Pass::BLENDED, + RenderPass::CustomCommand::EPILOG, + 0, [&ppm, &driver]() { + ppm.customResolveSubpass(driver); + }); + } + + passBuilder.commandTypeFlags(RenderPass::CommandTypeFlags::COLOR); + + + // RenderPass::IS_INSTANCED_STEREOSCOPIC only applies to the color pass + if (view.hasStereo() && + engine.getConfig().stereoscopicType == StereoscopicType::INSTANCED) { + renderFlags |= RenderPass::IS_INSTANCED_STEREOSCOPIC; + passBuilder.renderFlags(renderFlags); + } + + RenderPass const pass{ passBuilder.build(engine, driver) }; - FrameGraphTexture::Descriptor const desc = { + FrameGraphTexture::Descriptor colorBufferDesc = { .width = config.physicalViewport.width, .height = config.physicalViewport.height, .format = config.hdrFormat }; + // Set the depth to the number of layers if we're rendering multiview. + if (isRenderingMultiview) { + colorBufferDesc.depth = engine.getConfig().stereoscopicEyeCount; + colorBufferDesc.type = SamplerType::SAMPLER_2D_ARRAY; + } + // a non-drawing pass to prepare everything that need to be before the color passes execute fg.addTrivialSideEffectPass("Prepare Color Passes", [=, &js, &view, &ppm](DriverApi& driver) { @@ -891,7 +1188,7 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { if (colorGradingConfig.asSubpass) { ppm.colorGradingPrepareSubpass(driver, colorGrading, colorGradingConfig, vignetteOptions, - desc.width, desc.height); + colorBufferDesc.width, colorBufferDesc.height); } else if (colorGradingConfig.customResolve) { ppm.customResolvePrepareSubpass(driver, PostProcessManager::CustomResolveOp::COMPRESS); @@ -899,61 +1196,48 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { // We use a framegraph pass to wait for froxelization to finish (so it can be done // in parallel with .compile() - if (jobFroxelize) { - auto *sync = jobFroxelize; + auto sync = view.getFroxelizerSync(); + if (sync) { js.waitAndRelease(sync); view.commitFroxels(driver); } } ); - // color-grading as subpass is done either by the color pass or the TAA pass if any - auto colorGradingConfigForColor = colorGradingConfig; - colorGradingConfigForColor.asSubpass = colorGradingConfigForColor.asSubpass && !taaOptions.enabled; - - if (colorGradingConfigForColor.asSubpass) { - // append color grading subpass after all other passes - pass.appendCustomCommand( - RenderPass::Pass::BLENDED, - RenderPass::CustomCommand::EPILOG, - 0, [&ppm, &driver, colorGradingConfigForColor]() { - ppm.colorGradingSubpass(driver, colorGradingConfigForColor); - }); - } if (colorGradingConfig.customResolve) { - // append custom resolve subpass after all other passes - pass.appendCustomCommand( - RenderPass::Pass::BLENDED, - RenderPass::CustomCommand::EPILOG, - 0, [&ppm, &driver]() { - ppm.customResolveSubpass(driver); - }); - } - - // this makes the viewport relative to xvp - // FIXME: we should use 'vp' when rendering directly into the swapchain, but that's hard to - // know at this point. This will usually be the case when post-process is disabled. - // FIXME: we probably should take the dynamic scaling into account too - pass.setScissorViewport(hasPostProcess ? xvp : vp); - // the color pass itself + color-grading as subpass if needed - auto colorPassOutput = RendererUtils::colorPass(fg, "Color Pass", mEngine, view, - desc, config, colorGradingConfigForColor, pass.getExecutor()); + auto colorPassOutput = RendererUtils::colorPass(fg, "Color Pass", mEngine, view, { + .shadows = blackboard.get("shadows"), + .ssao = blackboard.get("ssao"), + .ssr = ssrConfig.ssr, + .structure = structure + }, + colorBufferDesc, config, colorGradingConfigForColor, pass.getExecutor()); if (view.isScreenSpaceRefractionEnabled() && !pass.empty()) { - // this cancels the colorPass() call above if refraction is active. - // the color pass + refraction + color-grading as subpass if needed - const auto [output, enabled] = RendererUtils::refractionPass(fg, mEngine, view, + // This cancels the colorPass() call above if refraction is active. + // The color pass + refraction + color-grading as subpass if needed + auto const output = RendererUtils::refractionPass(fg, mEngine, view, { + .shadows = blackboard.get("shadows"), + .ssao = blackboard.get("ssao"), + .ssr = ssrConfig.ssr, + .structure = structure + }, config, ssrConfig, colorGradingConfigForColor, pass); - colorPassOutput = output; - hasScreenSpaceRefraction = enabled; + + hasScreenSpaceRefraction = output.has_value(); + if (hasScreenSpaceRefraction) { + colorPassOutput = output.value(); + } } if (colorGradingConfig.customResolve) { - // TODO: we have to "uncompress" (i.e. detonemap) the color buffer here because it's used + assert_invariant(fg.getDescriptor(colorPassOutput.linearColor).samples <= 1); + // TODO: we have to "uncompress" (i.e. detonemap) the color buffer here because it's used // by many other passes (Bloom, TAA, DoF, etc...). We could make this more // efficient by using ARM_shader_framebuffer_fetch. We use a load/store (i.e. // subpass) here because it's more convenient. - colorPassOutput = ppm.customResolveUncompressPass(fg, colorPassOutput); + colorPassOutput.linearColor = + ppm.customResolveUncompressPass(fg, colorPassOutput.linearColor); } // export the color buffer if screen-space reflections are enabled @@ -962,35 +1246,45 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { FrameGraphId history; }; // FIXME: should we use the TAA-modified cameraInfo here or not? (we are). - auto projection = mat4f{ cameraInfo.projection * cameraInfo.getUserViewMatrix() }; + mat4 const projection = cameraInfo.projection * cameraInfo.getUserViewMatrix(); fg.addPass("Export SSR history", [&](FrameGraph::Builder& builder, auto& data) { // We need to use sideEffect here to ensure this pass won't be culled. // The "output" of this pass is going to be used during the next frame as // an "import". builder.sideEffect(); - data.history = builder.sample(colorPassOutput); // FIXME: an access must be declared for detach(), why? + + // we can't use colorPassOutput here because it could be tonemapped + data.history = builder.sample(colorPassOutput.linearColor); // FIXME: an access must be declared for detach(), why? }, [&view, projection](FrameGraphResources const& resources, auto const& data, - backend::DriverApi&) { + DriverApi&) { auto& history = view.getFrameHistory(); auto& current = history.getCurrent(); current.ssr.projection = projection; - resources.detach(data.history, - ¤t.ssr.color, ¤t.ssr.desc); + resources.detach(data.history, ¤t.ssr.color, ¤t.ssr.desc); }); } - FrameGraphId input = colorPassOutput; - fg.addTrivialSideEffectPass("Finish Color Passes", [&view](DriverApi& driver) { - // Unbind SSAO sampler, b/c the FrameGraph will delete the texture at the end of the pass. - view.cleanupRenderPasses(); - view.commitUniforms(driver); - }); - - // resolve depth -- which might be needed because of TAA or DoF. This pass will be culled - // if the depth is not used below. - auto const depth = ppm.resolveBaseLevel(fg, "Resolved Depth Buffer", - blackboard.get("depth")); + // this is the output of the color pass / input to post processing, + // this is only used later for comparing it with the output after post-processing + FrameGraphId const postProcessInput = colorGradingConfig.asSubpass ? + colorPassOutput.tonemappedColor : + colorPassOutput.linearColor; + + // input can change below + FrameGraphId input = postProcessInput; + + // Resolve depth -- which might be needed because of TAA or DoF. This pass will be culled + // if the depth is not used below or if the depth is not MS (e.g. it could have been + // auto-resolved). + // In practice, this is used on Vulkan and older Metal devices. + auto depth = ppm.resolve(fg, "Resolved Depth Buffer", colorPassOutput.depth, { .levels = 1 }); + + // Debug: CSM visualisation + if (UTILS_UNLIKELY(engine.debug.shadowmap.visualize_cascades && + view.hasShadowing() && view.hasDirectionalLighting())) { + input = ppm.debugShadowCascades(fg, input, depth); + } // TODO: DoF should be applied here, before TAA -- but if we do this it'll result in a lot of // fireflies due to the instability of the highlights. This can be fixed with a @@ -1001,6 +1295,15 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { if (taaOptions.enabled) { input = ppm.taa(fg, input, depth, view.getFrameHistory(), &FrameHistoryEntry::taa, taaOptions, colorGradingConfig); + if (taaOptions.upscaling) { + scale = 1.0f; + scaled = false; + UTILS_UNUSED_IN_RELEASE auto const& inputDesc = fg.getDescriptor(input); + svp.width = inputDesc.width; + svp.height = inputDesc.height; + xvp.width *= 2; + xvp.height *= 2; + } } // -------------------------------------------------------------------------------------------- @@ -1016,16 +1319,21 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { // The bokeh height is always correct regardless of the dynamic resolution scaling. // (because the CoC is calculated w.r.t. the height), so we only need to adjust // the width. - float const bokehAspectRatio = scale.x / scale.y; + float const aspect = (scale.x / scale.y) * dofOptions.cocAspectRatio; + float2 const bokehScale{ + aspect < 1.0f ? aspect : 1.0f, + aspect > 1.0f ? 1.0f / aspect : 1.0f + }; input = ppm.dof(fg, input, depth, cameraInfo, needsAlphaChannel, - bokehAspectRatio, dofOptions); + bokehScale, dofOptions); } FrameGraphId bloom, flare; if (bloomOptions.enabled) { - // generate the bloom buffer, which is stored in the blackboard as "bloom". This is + // Generate the bloom buffer, which is stored in the blackboard as "bloom". This is // consumed by the colorGrading pass and will be culled if colorGrading is disabled. - auto [bloom_, flare_] = ppm.bloom(fg, input, bloomOptions, TextureFormat::R11F_G11F_B10F, scale); + auto [bloom_, flare_] = ppm.bloom(fg, input, TextureFormat::R11F_G11F_B10F, + bloomOptions, taaOptions, scale); bloom = bloom_; flare = flare_; } @@ -1052,14 +1360,22 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { if (scaled) { mightNeedFinalBlit = false; auto viewport = DEBUG_DYNAMIC_SCALING ? xvp : vp; - input = ppm.upscale(fg, blending, dsrOptions, input, xvp, { + input = ppm.upscale(fg, needsAlphaChannel, dsrOptions, input, xvp, { .width = viewport.width, .height = viewport.height, - .format = colorGradingConfig.ldrFormat }); + .format = colorGradingConfig.ldrFormat }, SamplerMagFilter::LINEAR); xvp.left = xvp.bottom = 0; svp = xvp; } } + // Debug: combine the array texture for multiview into a single image. + if (UTILS_UNLIKELY(isRenderingMultiview && engine.debug.stereo.combine_multiview_images)) { + input = ppm.debugCombineArrayTexture(fg, blendModeTranslucent, input, xvp, { + .width = vp.width, .height = vp.height, + .format = colorGradingConfig.ldrFormat }, + SamplerMagFilter::NEAREST, SamplerMinFilter::NEAREST); + } + // We need to do special processing when rendering directly into the swap-chain, that is when // the viewRenderTarget is the default render target (mRenderTarget) and we're rendering into // it. @@ -1077,9 +1393,10 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { // TODO: in that specific scenario it would be better to just not use xvp // The intermediate buffer is accomplished with a "fake" opaqueBlit (i.e. blit) operation. - const bool outputIsSwapChain = (input == colorPassOutput) && (viewRenderTarget == mRenderTargetHandle); + const bool outputIsSwapChain = + (input == postProcessInput) && (viewRenderTarget == mRenderTargetHandle); if (mightNeedFinalBlit) { - if (blending || + if (blendModeTranslucent || xvp != svp || (outputIsSwapChain && (msaaSampleCount > 1 || @@ -1087,12 +1404,30 @@ void FRenderer::renderJob(ArenaScope& arena, FView& view) { hasScreenSpaceRefraction || ssReflectionsOptions.enabled))) { assert_invariant(!scaled); - input = ppm.blit(fg, blending, input, xvp, { - .width = vp.width, .height = vp.height, - .format = colorGradingConfig.ldrFormat }, SamplerMagFilter::NEAREST); + input = ppm.blit(fg, blendModeTranslucent, input, xvp, { + .width = vp.width, .height = vp.height, + .format = colorGradingConfig.ldrFormat }, + SamplerMagFilter::NEAREST, SamplerMinFilter::NEAREST); } } + if (UTILS_UNLIKELY(outputIsSwapChain && view.isStencilBufferEnabled())) { + assert_invariant(mSwapChain); + FILAMENT_CHECK_PRECONDITION(mSwapChain->hasStencilBuffer()) + << "View has stencil buffer enabled, but SwapChain does not have " + "SwapChain::CONFIG_HAS_STENCIL_BUFFER flag set."; + } + + if (UTILS_UNLIKELY(engine.debug.shadowmap.display_shadow_texture)) { + auto shadowmap = blackboard.get("shadowmap"); + input = ppm.debugDisplayShadowTexture(fg, input, shadowmap, + engine.debug.shadowmap.display_shadow_texture_scale, + engine.debug.shadowmap.display_shadow_texture_layer, + engine.debug.shadowmap.display_shadow_texture_level, + engine.debug.shadowmap.display_shadow_texture_channel, + engine.debug.shadowmap.display_shadow_texture_power); + } + // auto debug = structure // fg.forwardResource(fgViewRenderTarget, debug ? debug : input); diff --git a/filament/src/details/Renderer.h b/filament/src/details/Renderer.h index ae6b3788a2e..903f33c2123 100644 --- a/filament/src/details/Renderer.h +++ b/filament/src/details/Renderer.h @@ -29,9 +29,6 @@ #include "backend/DriverApiForward.h" -#include -#include - #include #include @@ -40,11 +37,25 @@ #include #include +#include + +#include #include +#include +#include +#include +#include +#include + +#include +#include + namespace filament { +class ResourceAllocator; + namespace backend { class Driver; } // namespace backend @@ -78,6 +89,11 @@ class FRenderer : public Renderer { void setPresentationTime(int64_t monotonic_clock_ns); + void setVsyncTime(uint64_t steadyClockTimeNano) noexcept; + + // skip a frame + void skipFrame(uint64_t vsyncSteadyClockTimeNano); + // start a frame bool beginFrame(FSwapChain* swapChain, uint64_t vsyncSteadyClockTimeNano); @@ -127,6 +143,18 @@ class FRenderer : public Renderer { mClearOptions = options; } + ClearOptions const& getClearOptions() const noexcept { + return mClearOptions; + } + + utils::FixedCapacityVector getFrameInfoHistory(size_t const historySize) const noexcept { + return mFrameInfoManager.getFrameInfoHistory(historySize); + } + + size_t getMaxFrameHistorySize() const noexcept { + return MAX_FRAMETIME_HISTORY; + } + private: friend class Renderer; using Command = RenderPass::Command; @@ -150,7 +178,7 @@ class FRenderer : public Renderer { std::pair, backend::TargetBufferFlags> getRenderTarget(FView const& view) const noexcept; - void recordHighWatermark(size_t watermark) noexcept { + void recordHighWatermark(size_t const watermark) noexcept { mCommandsHighWatermark = std::max(mCommandsHighWatermark, watermark); } @@ -159,7 +187,7 @@ class FRenderer : public Renderer { } void renderInternal(FView const* view); - void renderJob(ArenaScope& arena, FView& view); + void renderJob(RootArenaScope& rootArenaScope, FView& view); // keep a reference to our engine FEngine& mEngine; @@ -183,9 +211,8 @@ class FRenderer : public Renderer { backend::TargetBufferFlags mClearFlags{}; tsl::robin_set mPreviousRenderTargets; std::function mBeginFrameInternal; - - // per-frame arena for this Renderer - LinearAllocatorArena& mPerRenderPassArena; + uint64_t mVsyncSteadyClockTimeNano = 0; + std::unique_ptr mResourceAllocator{}; }; FILAMENT_DOWNCAST(Renderer) diff --git a/filament/src/details/Scene.cpp b/filament/src/details/Scene.cpp index 07d4d61fa4d..993540a02c7 100644 --- a/filament/src/details/Scene.cpp +++ b/filament/src/details/Scene.cpp @@ -23,6 +23,7 @@ #include "details/Engine.h" #include "details/IndirectLight.h" +#include "details/InstanceBuffer.h" #include "details/Skybox.h" #include "BufferPoolAllocator.h" @@ -32,6 +33,8 @@ #include #include +#include + #include using namespace filament::backend; @@ -49,78 +52,138 @@ FScene::FScene(FEngine& engine) : FScene::~FScene() noexcept = default; -void FScene::prepare(const mat4& worldOriginTransform, bool shadowReceiversAreCasters) noexcept { +void FScene::prepare(JobSystem& js, + RootArenaScope& rootArenaScope, + mat4 const& worldTransform, + bool shadowReceiversAreCasters) noexcept { // TODO: can we skip this in most cases? Since we rely on indices staying the same, // we could only skip, if nothing changed in the RCM. SYSTRACE_CALL(); + SYSTRACE_CONTEXT(); + + // This will reset the allocator upon exiting + ArenaScope localArenaScope(rootArenaScope.getArena()); + FEngine& engine = mEngine; - EntityManager& em = engine.getEntityManager(); - FRenderableManager& rcm = engine.getRenderableManager(); - FTransformManager& tcm = engine.getTransformManager(); - FLightManager& lcm = engine.getLightManager(); + EntityManager const& em = engine.getEntityManager(); + FRenderableManager const& rcm = engine.getRenderableManager(); + FTransformManager const& tcm = engine.getTransformManager(); + FLightManager const& lcm = engine.getLightManager(); // go through the list of entities, and gather the data of those that are renderables auto& sceneData = mRenderableData; auto& lightData = mLightData; auto const& entities = mEntities; + using RenderableContainerData = std::pair; + using RenderableInstanceContainer = FixedCapacityVector, false>; - // NOTE: we can't know in advance how many entities are renderable or lights because the corresponding - // component can be added after the entity is added to the scene. + using LightContainerData = std::pair; + using LightInstanceContainer = FixedCapacityVector, false>; + + RenderableInstanceContainer renderableInstances{ + RenderableInstanceContainer::with_capacity(entities.size(), localArenaScope.getArena()) }; + + LightInstanceContainer lightInstances{ + LightInstanceContainer::with_capacity(entities.size(), localArenaScope.getArena()) }; + + SYSTRACE_NAME_BEGIN("InstanceLoop"); + + // find the max intensity directional light index in our local array + float maxIntensity = 0.0f; + std::pair directionalLightInstances{}; + + /* + * First compute the exact number of renderables and lights in the scene. + * Also find the main directional light. + */ + + for (Entity const e: entities) { + if (UTILS_LIKELY(em.isAlive(e))) { + auto ti = tcm.getInstance(e); + auto li = lcm.getInstance(e); + auto ri = rcm.getInstance(e); + if (li) { + // we handle the directional light here because it'd prevent multithreading below + if (UTILS_UNLIKELY(lcm.isDirectionalLight(li))) { + // we don't store the directional lights, because we only have a single one + if (lcm.getIntensity(li) >= maxIntensity) { + maxIntensity = lcm.getIntensity(li); + directionalLightInstances = { li, ti }; + } + } else { + lightInstances.emplace_back(li, ti); + } + } + if (ri) { + renderableInstances.emplace_back(ri, ti); + } + } + } + + SYSTRACE_NAME_END(); + + /* + * Evaluate the capacity needed for the renderable and light SoAs + */ - size_t renderableDataCapacity = entities.size(); // we need the capacity to be multiple of 16 for SIMD loops - renderableDataCapacity = (renderableDataCapacity + 0xFu) & ~0xFu; // we need 1 extra entry at the end for the summed primitive count + size_t renderableDataCapacity = entities.size(); + renderableDataCapacity = (renderableDataCapacity + 0xFu) & ~0xFu; renderableDataCapacity = renderableDataCapacity + 1; - sceneData.clear(); - if (sceneData.capacity() < renderableDataCapacity) { - sceneData.setCapacity(renderableDataCapacity); - } - // The light data list will always contain at least one entry for the // dominating directional light, even if there are no entities. - size_t lightDataCapacity = std::max(1, entities.size()); // we need the capacity to be multiple of 16 for SIMD loops + size_t lightDataCapacity = std::max(DIRECTIONAL_LIGHTS_COUNT, entities.size()); lightDataCapacity = (lightDataCapacity + 0xFu) & ~0xFu; - lightData.clear(); - if (lightData.capacity() < lightDataCapacity) { - lightData.setCapacity(lightDataCapacity); - } - // the first entries are reserved for the directional lights (currently only one) - lightData.resize(DIRECTIONAL_LIGHTS_COUNT); - + /* + * Now resize the SoAs if needed + */ - // find the max intensity directional light index in our local array - float maxIntensity = 0.0f; + // TODO: the resize below could happen in a job - for (Entity e : entities) { - if (!em.isAlive(e)) { - continue; + if (!sceneData.capacity() || sceneData.size() != renderableInstances.size()) { + sceneData.clear(); + if (sceneData.capacity() < renderableDataCapacity) { + sceneData.setCapacity(renderableDataCapacity); } + assert_invariant(renderableInstances.size() <= sceneData.capacity()); + sceneData.resize(renderableInstances.size()); + } - // getInstance() always returns null if the entity is the Null entity, - // so we don't need to check for that, but we need to check it's alive - auto ri = rcm.getInstance(e); - auto li = lcm.getInstance(e); - if (!ri && !li) { - continue; + if (lightData.size() != lightInstances.size() + DIRECTIONAL_LIGHTS_COUNT) { + lightData.clear(); + if (lightData.capacity() < lightDataCapacity) { + lightData.setCapacity(lightDataCapacity); } + assert_invariant(lightInstances.size() + DIRECTIONAL_LIGHTS_COUNT <= lightData.capacity()); + lightData.resize(lightInstances.size() + DIRECTIONAL_LIGHTS_COUNT); + } + + /* + * Fill the SoA with the JobSystem + */ - // get the world transform - auto ti = tcm.getInstance(e); - // this is where we go from double to float for our transforms - const mat4f worldTransform{ worldOriginTransform * tcm.getWorldTransformAccurate(ti) }; - const bool reversedWindingOrder = det(worldTransform.upperLeft()) < 0; + auto renderableWork = [first = renderableInstances.data(), &rcm, &tcm, &worldTransform, + &sceneData, shadowReceiversAreCasters](auto* p, auto c) { + SYSTRACE_NAME("renderableWork"); + + for (size_t i = 0; i < c; i++) { + auto [ri, ti] = p[i]; + + // this is where we go from double to float for our transforms + const mat4f shaderWorldTransform{ + worldTransform * tcm.getWorldTransformAccurate(ti) }; + const bool reversedWindingOrder = det(shaderWorldTransform.upperLeft()) < 0; - // don't even draw this object if it doesn't have a transform (which shouldn't happen - // because one is always created when creating a Renderable component). - if (ri && ti) { // compute the world AABB so we can perform culling - const Box worldAABB = rigidTransform(rcm.getAABB(ri), worldTransform); + const Box worldAABB = rigidTransform(rcm.getAABB(ri), shaderWorldTransform); auto visibility = rcm.getVisibility(ri); visibility.reversedWindingOrder = reversedWindingOrder; @@ -131,81 +194,145 @@ void FScene::prepare(const mat4& worldOriginTransform, bool shadowReceiversAreCa // FIXME: We compute and store the local scale because it's needed for glTF but // we need a better way to handle this const mat4f& transform = tcm.getTransform(ti); - float scale = (length(transform[0].xyz) + length(transform[1].xyz) + - length(transform[2].xyz)) / 3.0f; - - // we know there is enough space in the array - sceneData.push_back_unsafe( - ri, // RENDERABLE_INSTANCE - worldTransform, // WORLD_TRANSFORM - visibility, // VISIBILITY_STATE - rcm.getSkinningBufferInfo(ri), // SKINNING_BUFFER - rcm.getMorphingBufferInfo(ri), // MORPHING_BUFFER - worldAABB.center, // WORLD_AABB_CENTER - 0, // VISIBLE_MASK - rcm.getChannels(ri), // CHANNELS - rcm.getInstanceCount(ri), // INSTANCE_COUNT - rcm.getLayerMask(ri), // LAYERS - worldAABB.halfExtent, // WORLD_AABB_EXTENT - {}, // PRIMITIVES - 0, // SUMMED_PRIMITIVE_COUNT - {}, // UBO - scale // USER_DATA - ); + float const scale = (length(transform[0].xyz) + length(transform[1].xyz) + + length(transform[2].xyz)) / 3.0f; + + size_t const index = std::distance(first, p) + i; + assert_invariant(index < sceneData.size()); + + sceneData.elementAt(index) = ri; + sceneData.elementAt(index) = shaderWorldTransform; + sceneData.elementAt(index) = visibility; + sceneData.elementAt(index) = rcm.getSkinningBufferInfo(ri); + sceneData.elementAt(index) = rcm.getMorphingBufferInfo(ri); + sceneData.elementAt(index) = rcm.getInstancesInfo(ri); + sceneData.elementAt(index) = worldAABB.center; + sceneData.elementAt(index) = 0; + sceneData.elementAt(index) = rcm.getChannels(ri); + sceneData.elementAt(index) = rcm.getLayerMask(ri); + sceneData.elementAt(index) = worldAABB.halfExtent; + //sceneData.elementAt(index) = {}; // already initialized, Slice<> + sceneData.elementAt(index) = 0; + //sceneData.elementAt(index) = {}; // not needed here + sceneData.elementAt(index) = scale; } - - if (li) { - // find the dominant directional light - if (UTILS_UNLIKELY(lcm.isDirectionalLight(li))) { - // we don't store the directional lights, because we only have a single one - if (lcm.getIntensity(li) >= maxIntensity) { - maxIntensity = lcm.getIntensity(li); - float3 d = lcm.getLocalDirection(li); - // using mat3f::getTransformForNormals handles non-uniform scaling - d = normalize(mat3f::getTransformForNormals(worldTransform.upperLeft()) * d); - lightData.elementAt(0) = - float4{ 0, 0, 0, std::numeric_limits::infinity() }; - lightData.elementAt(0) = d; - lightData.elementAt(0) = li; - } - } else { - const float4 p = worldTransform * float4{ lcm.getLocalPosition(li), 1 }; - float3 d = 0; - if (!lcm.isPointLight(li) || lcm.isIESLight(li)) { - d = lcm.getLocalDirection(li); - // using mat3f::getTransformForNormals handles non-uniform scaling - d = normalize(mat3f::getTransformForNormals(worldTransform.upperLeft()) * d); - } - lightData.push_back_unsafe( - float4{ p.xyz, lcm.getRadius(li) }, d, li, {}, {}, {}); + }; + + auto lightWork = [first = lightInstances.data(), &lcm, &tcm, &worldTransform, + &lightData](auto* p, auto c) { + SYSTRACE_NAME("lightWork"); + for (size_t i = 0; i < c; i++) { + auto [li, ti] = p[i]; + // this is where we go from double to float for our transforms + mat4f const shaderWorldTransform{ + worldTransform * tcm.getWorldTransformAccurate(ti) }; + float4 const position = shaderWorldTransform * float4{ lcm.getLocalPosition(li), 1 }; + float3 d = 0; + if (!lcm.isPointLight(li) || lcm.isIESLight(li)) { + d = lcm.getLocalDirection(li); + // using mat3f::getTransformForNormals handles non-uniform scaling + d = normalize(mat3f::getTransformForNormals(shaderWorldTransform.upperLeft()) * d); } + size_t const index = DIRECTIONAL_LIGHTS_COUNT + std::distance(first, p) + i; + assert_invariant(index < lightData.size()); + lightData.elementAt(index) = float4{ position.xyz, lcm.getRadius(li) }; + lightData.elementAt(index) = d; + lightData.elementAt(index) = li; } + }; + + + SYSTRACE_NAME_BEGIN("Renderable and Light jobs"); + + JobSystem::Job* rootJob = js.createJob(); + + auto* renderableJob = parallel_for(js, rootJob, + renderableInstances.data(), renderableInstances.size(), + std::cref(renderableWork), jobs::CountSplitter<64>()); + + auto* lightJob = parallel_for(js, rootJob, + lightInstances.data(), lightInstances.size(), + std::cref(lightWork), jobs::CountSplitter<32, 5>()); + + js.run(renderableJob); + js.run(lightJob); + + // Everything below can be done in parallel. + + /* + * Handle the directional light separately + */ + + if (auto [li, ti] = directionalLightInstances ; li) { + // in the code below, we only transform directions, so the translation of the + // world transform is irrelevant, and we don't need to use getWorldTransformAccurate() + + mat3 const worldDirectionTransform = + mat3::getTransformForNormals(tcm.getWorldTransformAccurate(ti).upperLeft()); + FLightManager::ShadowParams const params = lcm.getShadowParams(li); + float3 const localDirection = worldDirectionTransform * lcm.getLocalDirection(li); + double3 const shadowLocalDirection = params.options.transform * localDirection; + + // using mat3::getTransformForNormals handles non-uniform scaling + // note: in the common case of the rigid-body transform, getTransformForNormals() returns + // identity. + mat3 const worlTransformNormals = mat3::getTransformForNormals(worldTransform.upperLeft()); + double3 const d = worlTransformNormals * localDirection; + double3 const s = worlTransformNormals * shadowLocalDirection; + + // We compute the reference point for snapping shadowmaps without applying the + // rotation of `worldOriginTransform` on both sides, so that we don't have any instability + // due to the limited precision of the "light space" matrix (even at double precision). + + // getMv() Returns the world-to-lightspace transformation. See ShadowMap.cpp. + auto getMv = [](double3 direction) -> mat3 { + // We use the x-axis as the "up" reference so that the math is stable when the light + // is pointing down, which is a common case for lights. See ShadowMap.cpp. + return transpose(mat3::lookTo(direction, double3{ 1, 0, 0 })); + }; + double3 const worldOrigin = transpose(worldTransform.upperLeft()) * worldTransform[3].xyz; + mat3 const Mv = getMv(shadowLocalDirection); + double2 const lsReferencePoint = (Mv * worldOrigin).xy; + + constexpr float inf = std::numeric_limits::infinity(); + lightData.elementAt(0) = float4{ 0, 0, 0, inf }; + lightData.elementAt(0) = normalize(d); + lightData.elementAt(0) = normalize(s); + lightData.elementAt(0) = lsReferencePoint; + lightData.elementAt(0) = li; + } else { + lightData.elementAt(0) = 0; } // some elements past the end of the array will be accessed by SIMD code, we need to make // sure the data is valid enough as not to produce errors such as divide-by-zero // (e.g. in computeLightRanges()) - for (size_t i = lightData.size(), e = lightDataCapacity; i < e; i++) { + for (size_t i = lightData.size(), e = lightData.capacity(); i < e; i++) { new(lightData.data() + i) float4{ 0, 0, 0, 1 }; } // Purely for the benefit of MSAN, we can avoid uninitialized reads by zeroing out the // unused scene elements between the end of the array and the rounded-up count. if (UTILS_HAS_SANITIZE_MEMORY) { - for (size_t i = sceneData.size(), e = renderableDataCapacity; i < e; i++) { + for (size_t i = sceneData.size(), e = sceneData.capacity(); i < e; i++) { sceneData.data()[i] = 0; sceneData.data()[i] = 0; sceneData.data()[i] = {}; } } + + js.runAndWait(rootJob); + + SYSTRACE_NAME_END(); } void FScene::prepareVisibleRenderables(Range visibleRenderables) noexcept { + SYSTRACE_CALL(); RenderableSoa& sceneData = mRenderableData; - FRenderableManager& rcm = mEngine.getRenderableManager(); + FRenderableManager const& rcm = mEngine.getRenderableManager(); mHasContactShadows = false; - for (uint32_t i : visibleRenderables) { + for (uint32_t const i : visibleRenderables) { PerRenderableData& uboData = sceneData.elementAt(i); auto const visibility = sceneData.elementAt(i); @@ -224,7 +351,7 @@ void FScene::prepareVisibleRenderables(Range visibleRenderables) noexc // Note: if the model matrix is known to be a rigid-transform, we could just use it directly. mat3f m = mat3f::getTransformForNormals(model.upperLeft()); - m *= mat3f(1.0f / std::sqrt(max(float3{length2(m[0]), length2(m[1]), length2(m[2])}))); + m = prescaleForNormals(m); // The shading normal must be flipped for mirror transformations. // Basically we're shading the other side of the polygon and therefore need to negate the @@ -241,6 +368,7 @@ void FScene::prepareVisibleRenderables(Range visibleRenderables) noexc visibility.skinning, visibility.morphing, visibility.screenSpaceContactShadows, + sceneData.elementAt(i).buffer != nullptr, sceneData.elementAt(i)); uboData.morphTargetCount = sceneData.elementAt(i).count; @@ -257,11 +385,9 @@ void FScene::prepareVisibleRenderables(Range visibleRenderables) noexc void FScene::updateUBOs( Range visibleRenderables, Handle renderableUbh) noexcept { + SYSTRACE_CALL(); FEngine::DriverApi& driver = mEngine.getDriverApi(); - // store the UBO handle - mRenderableViewUbh = renderableUbh; - // don't allocate more than 16 KiB directly into the render stream static constexpr size_t MAX_STREAM_ALLOCATION_COUNT = 64; // 16 KiB const size_t count = visibleRenderables.size(); @@ -276,9 +402,21 @@ void FScene::updateUBOs( } }(); - // copy our data into the UBO for each visible renderable PerRenderableData const* const uboData = mRenderableData.data(); - for (uint32_t i : visibleRenderables) { + mat4f const* const worldTransformData = mRenderableData.data(); + + // prepare each InstanceBuffer. + FRenderableManager::InstancesInfo const* instancesData = mRenderableData.data(); + for (uint32_t const i : visibleRenderables) { + auto& instancesInfo = instancesData[i]; + if (UTILS_UNLIKELY(instancesInfo.buffer)) { + instancesInfo.buffer->prepare( + mEngine, worldTransformData[i], uboData[i], instancesInfo.handle); + } + } + + // copy our data into the UBO for each visible renderable + for (uint32_t const i : visibleRenderables) { buffer[i] = uboData[i]; } @@ -290,7 +428,7 @@ void FScene::updateUBOs( driver.resetBufferObject(renderableUbh); driver.updateBufferObjectUnsynchronized(renderableUbh, { buffer, count * sizeof(PerRenderableData), - +[](void* p, size_t s, void* user) { + +[](void* p, size_t const s, void* user) { std::weak_ptr* const weakShared = static_cast*>(user); if (s >= MAX_STREAM_ALLOCATION_COUNT * sizeof(PerRenderableData)) { @@ -301,23 +439,16 @@ void FScene::updateUBOs( delete weakShared; }, weakShared }, 0); - - // update skybox - if (mSkybox) { - mSkybox->commit(driver); - } } -void FScene::terminate(FEngine& engine) { - // DO NOT destroy this UBO, it's owned by the View - mRenderableViewUbh.clear(); +void FScene::terminate(FEngine&) { } -void FScene::prepareDynamicLights(const CameraInfo& camera, ArenaScope& rootArena, +void FScene::prepareDynamicLights(const CameraInfo& camera, Handle lightUbh) noexcept { FEngine::DriverApi& driver = mEngine.getDriverApi(); - FLightManager& lcm = mEngine.getLightManager(); - FScene::LightSoa& lightData = getLightData(); + FLightManager const& lcm = mEngine.getLightManager(); + LightSoa& lightData = getLightData(); /* * Here we copy our lights data into the GPU buffer. @@ -325,20 +456,20 @@ void FScene::prepareDynamicLights(const CameraInfo& camera, ArenaScope& rootAren size_t const size = lightData.size(); // number of point-light/spotlights - size_t positionalLightCount = size - DIRECTIONAL_LIGHTS_COUNT; + size_t const positionalLightCount = size - DIRECTIONAL_LIGHTS_COUNT; assert_invariant(positionalLightCount); - float4 const* const UTILS_RESTRICT spheres = lightData.data(); + float4 const* const UTILS_RESTRICT spheres = lightData.data(); // compute the light ranges (needed when building light trees) - float2* const zrange = lightData.data(); + float2* const zrange = lightData.data(); computeLightRanges(zrange, camera, spheres + DIRECTIONAL_LIGHTS_COUNT, positionalLightCount); LightsUib* const lp = driver.allocatePod(positionalLightCount); - auto const* UTILS_RESTRICT directions = lightData.data(); - auto const* UTILS_RESTRICT instances = lightData.data(); - auto const* UTILS_RESTRICT shadowInfo = lightData.data(); + auto const* UTILS_RESTRICT directions = lightData.data(); + auto const* UTILS_RESTRICT instances = lightData.data(); + auto const* UTILS_RESTRICT shadowInfo = lightData.data(); for (size_t i = DIRECTIONAL_LIGHTS_COUNT, c = size; i < c; ++i) { const size_t gpuIndex = i - DIRECTIONAL_LIGHTS_COUNT; auto li = instances[i]; @@ -394,22 +525,22 @@ inline void FScene::computeLightRanges( } UTILS_NOINLINE -void FScene::addEntity(Entity entity) { +void FScene::addEntity(Entity const entity) { mEntities.insert(entity); } UTILS_NOINLINE -void FScene::addEntities(const Entity* entities, size_t count) { +void FScene::addEntities(const Entity* entities, size_t const count) { mEntities.insert(entities, entities + count); } UTILS_NOINLINE -void FScene::remove(Entity entity) { +void FScene::remove(Entity const entity) { mEntities.erase(entity); } UTILS_NOINLINE -void FScene::removeEntities(const Entity* entities, size_t count) { +void FScene::removeEntities(const Entity* entities, size_t const count) { for (size_t i = 0; i < count; ++i, ++entities) { remove(*entities); } @@ -418,11 +549,11 @@ void FScene::removeEntities(const Entity* entities, size_t count) { UTILS_NOINLINE size_t FScene::getRenderableCount() const noexcept { FEngine& engine = mEngine; - EntityManager& em = engine.getEntityManager(); - FRenderableManager& rcm = engine.getRenderableManager(); + EntityManager const& em = engine.getEntityManager(); + FRenderableManager const& rcm = engine.getRenderableManager(); size_t count = 0; auto const& entities = mEntities; - for (Entity e : entities) { + for (Entity const e : entities) { count += em.isAlive(e) && rcm.getInstance(e) ? 1 : 0; } return count; @@ -431,18 +562,18 @@ size_t FScene::getRenderableCount() const noexcept { UTILS_NOINLINE size_t FScene::getLightCount() const noexcept { FEngine& engine = mEngine; - EntityManager& em = engine.getEntityManager(); - FLightManager& lcm = engine.getLightManager(); + EntityManager const& em = engine.getEntityManager(); + FLightManager const& lcm = engine.getLightManager(); size_t count = 0; auto const& entities = mEntities; - for (Entity e : entities) { + for (Entity const e : entities) { count += em.isAlive(e) && lcm.getInstance(e) ? 1 : 0; } return count; } UTILS_NOINLINE -bool FScene::hasEntity(Entity entity) const noexcept { +bool FScene::hasEntity(Entity const entity) const noexcept { return mEntities.find(entity) != mEntities.end(); } diff --git a/filament/src/details/Scene.h b/filament/src/details/Scene.h index 87da462a715..44d0ff950ca 100644 --- a/filament/src/details/Scene.h +++ b/filament/src/details/Scene.h @@ -22,6 +22,8 @@ #include "Allocators.h" #include "Culler.h" +#include "ds/DescriptorSet.h" + #include "components/LightManager.h" #include "components/RenderableManager.h" #include "components/TransformManager.h" @@ -31,6 +33,8 @@ #include #include +#include + #include #include #include @@ -55,7 +59,7 @@ class FSkybox; class FScene : public Scene { public: /* - * Filaments-scope Public API + * Filament-scope Public API */ FSkybox* getSkybox() const noexcept { return mSkybox; } @@ -70,17 +74,14 @@ class FScene : public Scene { ~FScene() noexcept; void terminate(FEngine& engine); - void prepare(const math::mat4& worldOriginTransform, bool shadowReceiversAreCasters) noexcept; + void prepare(utils::JobSystem& js, RootArenaScope& rootArenaScope, + math::mat4 const& worldTransform, bool shadowReceiversAreCasters) noexcept; void prepareVisibleRenderables(utils::Range visibleRenderables) noexcept; - void prepareDynamicLights(const CameraInfo& camera, ArenaScope& arena, + void prepareDynamicLights(const CameraInfo& camera, backend::Handle lightUbh) noexcept; - backend::Handle getRenderableUBO() const noexcept { - return mRenderableViewUbh; - } - /* * Storage for per-frame renderable data */ @@ -91,12 +92,12 @@ class FScene : public Scene { RENDERABLE_INSTANCE, // 4 | instance of the Renderable component WORLD_TRANSFORM, // 16 | instance of the Transform component VISIBILITY_STATE, // 2 | visibility data of the component - SKINNING_BUFFER, // 8 | bones uniform buffer handle, offset + SKINNING_BUFFER, // 8 | bones uniform buffer handle, offset, indices and weights MORPHING_BUFFER, // 16 | weights uniform buffer handle, count, morph targets + INSTANCES, // 16 | instancing info for this Renderable WORLD_AABB_CENTER, // 12 | world-space bounding box center of the renderable VISIBLE_MASK, // 2 | each bit represents a visibility in a pass CHANNELS, // 1 | currently light channels only - INSTANCE_COUNT, // 2 | draw instance count // These are not needed anymore after culling LAYERS, // 1 | layers @@ -106,6 +107,7 @@ class FScene : public Scene { PRIMITIVES, // 8 | level-of-detail'ed primitives SUMMED_PRIMITIVE_COUNT, // 4 | summed visible primitive counts UBO, // 128 | + DESCRIPTOR_SET_HANDLE, // FIXME: We need a better way to handle this USER_DATA, // 4 | user data currently used to store the scale @@ -117,15 +119,16 @@ class FScene : public Scene { FRenderableManager::Visibility, // VISIBILITY_STATE FRenderableManager::SkinningBindingInfo, // SKINNING_BUFFER FRenderableManager::MorphingBindingInfo, // MORPHING_BUFFER + FRenderableManager::InstancesInfo, // INSTANCES math::float3, // WORLD_AABB_CENTER VisibleMaskType, // VISIBLE_MASK uint8_t, // CHANNELS - uint16_t, // INSTANCE_COUNT uint8_t, // LAYERS math::float3, // WORLD_AABB_EXTENT utils::Slice, // PRIMITIVES uint32_t, // SUMMED_PRIMITIVE_COUNT PerRenderableData, // UBO + backend::DescriptorSetHandle, // DESCRIPTOR_SET_HANDLE // FIXME: We need a better way to handle this float // USER_DATA >; @@ -134,13 +137,13 @@ class FScene : public Scene { RenderableSoa& getRenderableData() noexcept { return mRenderableData; } static inline uint32_t getPrimitiveCount(RenderableSoa const& soa, - uint32_t first, uint32_t last) noexcept { + uint32_t const first, uint32_t const last) noexcept { // the caller must guarantee that last is dereferenceable return soa.elementAt(last) - soa.elementAt(first); } - static inline uint32_t getPrimitiveCount(RenderableSoa const& soa, uint32_t last) noexcept { + static inline uint32_t getPrimitiveCount(RenderableSoa const& soa, uint32_t const last) noexcept { // the caller must guarantee that last is dereferenceable return soa.elementAt(last); } @@ -161,6 +164,8 @@ class FScene : public Scene { enum { POSITION_RADIUS, DIRECTION, + SHADOW_DIRECTION, + SHADOW_REF, LIGHT_INSTANCE, VISIBILITY, SCREEN_SPACE_Z_RANGE, @@ -170,6 +175,8 @@ class FScene : public Scene { using LightSoa = utils::StructureOfArrays< math::float4, math::float3, + math::float3, + math::double2, FLightManager::Instance, Culler::result_type, math::float2, @@ -192,6 +199,7 @@ class FScene : public Scene { void addEntities(const utils::Entity* entities, size_t count); void remove(utils::Entity entity); void removeEntities(const utils::Entity* entities, size_t count); + size_t getEntityCount() const noexcept { return mEntities.size(); } size_t getRenderableCount() const noexcept; size_t getLightCount() const noexcept; bool hasEntity(utils::Entity entity) const noexcept; @@ -220,7 +228,6 @@ class FScene : public Scene { */ RenderableSoa mRenderableData; LightSoa mLightData; - backend::Handle mRenderableViewUbh; // This is actually owned by the view. bool mHasContactShadows = false; // State shared between Scene and driver callbacks. diff --git a/filament/src/details/SkinningBuffer.cpp b/filament/src/details/SkinningBuffer.cpp index 9fd859a2645..8386aab0b61 100644 --- a/filament/src/details/SkinningBuffer.cpp +++ b/filament/src/details/SkinningBuffer.cpp @@ -25,6 +25,12 @@ #include #include +#include + +#include +#include +#include + namespace filament { using namespace backend; @@ -38,22 +44,26 @@ struct SkinningBuffer::BuilderDetails { using BuilderType = SkinningBuffer; BuilderType::Builder::Builder() noexcept = default; BuilderType::Builder::~Builder() noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder&& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder&& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder const& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder&& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder const& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder&& rhs) noexcept = default; -SkinningBuffer::Builder& SkinningBuffer::Builder::boneCount(uint32_t boneCount) noexcept { +SkinningBuffer::Builder& SkinningBuffer::Builder::boneCount(uint32_t const boneCount) noexcept { mImpl->mBoneCount = boneCount; return *this; } -SkinningBuffer::Builder& SkinningBuffer::Builder::initialize(bool initialize) noexcept { +SkinningBuffer::Builder& SkinningBuffer::Builder::initialize(bool const initialize) noexcept { mImpl->mInitialize = initialize; return *this; } +SkinningBuffer::Builder& SkinningBuffer::Builder::name(const char* name, size_t const len) noexcept { + return BuilderNameMixin::name(name, len); +} + SkinningBuffer* SkinningBuffer::Builder::build(Engine& engine) { return downcast(engine).createSkinningBuffer(*this); } @@ -76,10 +86,15 @@ FSkinningBuffer::FSkinningBuffer(FEngine& engine, const Builder& builder) BufferObjectBinding::UNIFORM, BufferUsage::DYNAMIC); + if (auto name = builder.getName(); !name.empty()) { + // TODO: We should also tag the texture created inside createIndicesAndWeightsHandle. + driver.setDebugTag(mHandle.getId(), std::move(name)); + } + if (builder->mInitialize) { // initialize the bones to identity (before rounding up) auto* out = driver.allocatePod(mBoneCount); - std::uninitialized_fill_n(out, mBoneCount, FSkinningBuffer::makeBone({})); + std::uninitialized_fill_n(out, mBoneCount, makeBone({})); driver.updateBufferObject(mHandle, { out, mBoneCount * sizeof(PerRenderableBoneUib::BoneData) }, 0); } @@ -91,33 +106,34 @@ void FSkinningBuffer::terminate(FEngine& engine) { } void FSkinningBuffer::setBones(FEngine& engine, - RenderableManager::Bone const* transforms, size_t count, size_t offset) { - - ASSERT_PRECONDITION((offset + count) <= mBoneCount, - "SkinningBuffer (size=%lu) overflow (boneCount=%u, offset=%u)", - (unsigned)mBoneCount, (unsigned)count, (unsigned)offset); + RenderableManager::Bone const* transforms, size_t const count, size_t const offset) { + FILAMENT_CHECK_PRECONDITION((offset + count) <= mBoneCount) + << "SkinningBuffer (size=" << (unsigned)mBoneCount + << ") overflow (boneCount=" << (unsigned)count << ", offset=" << (unsigned)offset + << ")"; setBones(engine, mHandle, transforms, count, offset); } void FSkinningBuffer::setBones(FEngine& engine, - math::mat4f const* transforms, size_t count, size_t offset) { - - ASSERT_PRECONDITION((offset + count) <= mBoneCount, - "SkinningBuffer (size=%lu) overflow (boneCount=%u, offset=%u)", - (unsigned)mBoneCount, (unsigned)count, (unsigned)offset); + mat4f const* transforms, size_t const count, size_t const offset) { + FILAMENT_CHECK_PRECONDITION((offset + count) <= mBoneCount) + << "SkinningBuffer (size=" << (unsigned)mBoneCount + << ") overflow (boneCount=" << (unsigned)count << ", offset=" << (unsigned)offset + << ")"; setBones(engine, mHandle, transforms, count, offset); } +UTILS_UNUSED static uint32_t packHalf2x16(half2 v) noexcept { uint32_t lo = getBits(v[0]); uint32_t hi = getBits(v[1]); return (hi << 16) | lo; } -void FSkinningBuffer::setBones(FEngine& engine, Handle handle, - RenderableManager::Bone const* transforms, size_t boneCount, size_t offset) noexcept { +void FSkinningBuffer::setBones(FEngine& engine, Handle handle, + RenderableManager::Bone const* transforms, size_t const boneCount, size_t const offset) noexcept { auto& driverApi = engine.getDriverApi(); auto* UTILS_RESTRICT out = driverApi.allocatePod(boneCount); for (size_t i = 0, c = boneCount; i < c; ++i) { @@ -140,18 +156,13 @@ PerRenderableBoneUib::BoneData FSkinningBuffer::makeBone(mat4f transform) noexce transform[1], transform[2] }, - .cof = { - packHalf2x16({ cofactors[0].x, cofactors[0].y }), - packHalf2x16({ cofactors[0].z, cofactors[1].x }), - packHalf2x16({ cofactors[1].y, cofactors[1].z }), - packHalf2x16({ cofactors[2].x, cofactors[2].y }) - // cofactor[2][2] is not stored because we don't have space for it - } + .cof0 = cofactors[0], + .cof1x = cofactors[1].x }; } -void FSkinningBuffer::setBones(FEngine& engine, Handle handle, - mat4f const* transforms, size_t boneCount, size_t offset) noexcept { +void FSkinningBuffer::setBones(FEngine& engine, Handle handle, + mat4f const* transforms, size_t const boneCount, size_t const offset) noexcept { auto& driverApi = engine.getDriverApi(); auto* UTILS_RESTRICT out = driverApi.allocatePod(boneCount); for (size_t i = 0, c = boneCount; i < c; ++i) { @@ -162,5 +173,90 @@ void FSkinningBuffer::setBones(FEngine& engine, Handle offset * sizeof(PerRenderableBoneUib::BoneData)); } +// This value is limited by ES3.0, ES3.0 only guarantees 2048. +// When you change this value, you must change MAX_SKINNING_BUFFER_WIDTH at getters.vs +constexpr size_t MAX_SKINNING_BUFFER_WIDTH = 2048; + +static inline size_t getSkinningBufferWidth(size_t const pairCount) noexcept { + return std::clamp(pairCount, size_t(1), MAX_SKINNING_BUFFER_WIDTH); +} + +static inline size_t getSkinningBufferHeight(size_t const pairCount) noexcept { + return std::max(size_t(1), + (pairCount + MAX_SKINNING_BUFFER_WIDTH - 1) / MAX_SKINNING_BUFFER_WIDTH); +} + +inline size_t getSkinningBufferSize(size_t const pairCount) noexcept { + const size_t stride = getSkinningBufferWidth(pairCount); + const size_t height = getSkinningBufferHeight(pairCount); + return Texture::PixelBufferDescriptor::computeDataSize( + Texture::PixelBufferDescriptor::PixelDataFormat::RG, + Texture::PixelBufferDescriptor::PixelDataType::FLOAT, + stride, height, 1); +} + +UTILS_NOINLINE +void updateDataAt(DriverApi& driver, + Handle handle, PixelDataFormat const format, PixelDataType const type, + const utils::FixedCapacityVector& pairs, + size_t const count) { + + size_t const elementSize = sizeof(float2); + size_t const size = getSkinningBufferSize(count); + auto* out = (float2*)malloc(size); + memcpy(out, pairs.begin(), size); + + size_t const textureWidth = getSkinningBufferWidth(count); + size_t const lineCount = count / textureWidth; + size_t const lastLineCount = count % textureWidth; + + // 'out' buffer is going to be used up to 2 times, so for simplicity we use a shared_buffer + // to manage its lifetime. One side effect of this is that the callbacks below will allocate + // a small object on the heap. (inspired by MorphTargetBuffered) + std::shared_ptr const allocation((void*)out, free); + + if (lineCount) { + // update the full-width lines if any + driver.update3DImage(handle, 0, 0, 0, 0, + textureWidth, lineCount, 1, + PixelBufferDescriptor::make( + out, textureWidth * lineCount * elementSize, + format, type, [allocation](void const*, size_t) {} + )); + out += lineCount * textureWidth; + } + + if (lastLineCount) { + // update the last partial line if any + driver.update3DImage(handle, 0, 0, lineCount, 0, + lastLineCount, 1, 1, + PixelBufferDescriptor::make( + out, lastLineCount * elementSize, + format, type, [allocation](void const*, size_t) {} + )); + } +} + +TextureHandle FSkinningBuffer::createIndicesAndWeightsHandle( + FEngine& engine, size_t const count) { + FEngine::DriverApi& driver = engine.getDriverApi(); + // create a texture for skinning pairs data (bone index and weight) + return driver.createTexture(SamplerType::SAMPLER_2D, 1, + TextureFormat::RG32F, 1, + getSkinningBufferWidth(count), + getSkinningBufferHeight(count), 1, + TextureUsage::DEFAULT); +} + +void FSkinningBuffer::setIndicesAndWeightsData(FEngine& engine, + Handle textureHandle, + const utils::FixedCapacityVector& pairs, size_t const count) { + + FEngine::DriverApi& driver = engine.getDriverApi(); + updateDataAt(driver, textureHandle, + Texture::Format::RG, Texture::Type::FLOAT, + pairs, count); +} + } // namespace filament diff --git a/filament/src/details/SkinningBuffer.h b/filament/src/details/SkinningBuffer.h index 8fd1cddd410..11786e9387a 100644 --- a/filament/src/details/SkinningBuffer.h +++ b/filament/src/details/SkinningBuffer.h @@ -17,15 +17,23 @@ #ifndef TNT_FILAMENT_DETAILS_SKINNINGBUFFER_H #define TNT_FILAMENT_DETAILS_SKINNINGBUFFER_H -#include "downcast.h" #include -#include "private/filament/EngineEnums.h" -#include "private/filament/UibStructs.h" +#include "downcast.h" + +#include +#include +#include #include -#include +#include + +#include +#include + +#include +#include // for gtest class FilamentTest_Bones_Test; @@ -47,13 +55,13 @@ class FSkinningBuffer : public SkinningBuffer { size_t getBoneCount() const noexcept { return mBoneCount; } // round count to the size of the UBO in the shader - static size_t getPhysicalBoneCount(size_t count) noexcept { + static size_t getPhysicalBoneCount(size_t const count) noexcept { static_assert((CONFIG_MAX_BONE_COUNT & (CONFIG_MAX_BONE_COUNT - 1)) == 0); return (count + CONFIG_MAX_BONE_COUNT - 1) & ~(CONFIG_MAX_BONE_COUNT - 1); } private: - friend class ::FilamentTest_Bones_Test; + friend class FilamentTest_Bones_Test; friend class SkinningBuffer; friend class FRenderableManager; @@ -69,6 +77,13 @@ class FSkinningBuffer : public SkinningBuffer { return mHandle; } + static backend::TextureHandle createIndicesAndWeightsHandle(FEngine& engine, size_t count); + + static void setIndicesAndWeightsData(FEngine& engine, + backend::Handle textureHandle, + const utils::FixedCapacityVector& pairs, + size_t count); + backend::Handle mHandle; uint32_t mBoneCount; }; diff --git a/filament/src/details/Skybox.cpp b/filament/src/details/Skybox.cpp index e24abe27333..2de015dfb86 100644 --- a/filament/src/details/Skybox.cpp +++ b/filament/src/details/Skybox.cpp @@ -17,21 +17,28 @@ #include "details/Skybox.h" #include "details/Engine.h" -#include "details/Texture.h" -#include "details/VertexBuffer.h" -#include "details/IndexBuffer.h" #include "details/IndirectLight.h" #include "details/Material.h" -#include "details/MaterialInstance.h" +#include "details/Texture.h" +#include "details/VertexBuffer.h" #include "FilamentAPI-impl.h" +#include +#include +#include #include +#include #include +#include +#include #include -#include + +#include + +#include #include "generated/resources/materials.h" @@ -49,10 +56,10 @@ struct Skybox::BuilderDetails { using BuilderType = Skybox; BuilderType::Builder::Builder() noexcept = default; BuilderType::Builder::~Builder() noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder&& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder&& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder const& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder&& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder const& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder&& rhs) noexcept = default; Skybox::Builder& Skybox::Builder::environment(Texture* cubemap) noexcept { @@ -60,17 +67,17 @@ Skybox::Builder& Skybox::Builder::environment(Texture* cubemap) noexcept { return *this; } -Skybox::Builder& Skybox::Builder::intensity(float envIntensity) noexcept { +Skybox::Builder& Skybox::Builder::intensity(float const envIntensity) noexcept { mImpl->mIntensity = envIntensity; return *this; } -Skybox::Builder& Skybox::Builder::color(math::float4 color) noexcept { +Skybox::Builder& Skybox::Builder::color(float4 const color) noexcept { mImpl->mColor = color; return *this; } -Skybox::Builder& Skybox::Builder::showSun(bool show) noexcept { +Skybox::Builder& Skybox::Builder::showSun(bool const show) noexcept { mImpl->mShowSun = show; return *this; } @@ -78,8 +85,8 @@ Skybox::Builder& Skybox::Builder::showSun(bool show) noexcept { Skybox* Skybox::Builder::build(Engine& engine) { FTexture* cubemap = downcast(mImpl->mEnvironmentMap); - ASSERT_PRECONDITION(!cubemap || cubemap->isCubemap(), - "environment maps must be a cubemap"); + FILAMENT_CHECK_PRECONDITION(!cubemap || cubemap->isCubemap()) + << "environment maps must be a cubemap"; return downcast(engine).createSkybox(*this); } @@ -94,7 +101,7 @@ FSkybox::FSkybox(FEngine& engine, const Builder& builder) noexcept FMaterial const* material = engine.getSkyboxMaterial(); mSkyboxMaterialInstance = material->createInstance("Skybox"); - TextureSampler sampler(TextureSampler::MagFilter::LINEAR, TextureSampler::WrapMode::REPEAT); + TextureSampler const sampler(TextureSampler::MagFilter::LINEAR, TextureSampler::WrapMode::REPEAT); auto *pInstance = static_cast(mSkyboxMaterialInstance); FTexture const* texture = mSkyboxTexture ? mSkyboxTexture : engine.getDummyCubemap(); pInstance->setParameter("skybox", texture, sampler); @@ -117,36 +124,53 @@ FSkybox::FSkybox(FEngine& engine, const Builder& builder) noexcept } FMaterial const* FSkybox::createMaterial(FEngine& engine) { - FMaterial const* material = downcast(Material::Builder().package( - MATERIALS_SKYBOX_DATA, MATERIALS_SKYBOX_SIZE).build(engine)); - return material; + Material::Builder builder; +#ifdef FILAMENT_ENABLE_FEATURE_LEVEL_0 + if (UTILS_UNLIKELY(engine.getActiveFeatureLevel() == Engine::FeatureLevel::FEATURE_LEVEL_0)) { + builder.package(MATERIALS_SKYBOX_FL0_DATA, MATERIALS_SKYBOX_FL0_SIZE); + } else +#endif + { + switch (engine.getConfig().stereoscopicType) { + case Engine::StereoscopicType::NONE: + case Engine::StereoscopicType::INSTANCED: + builder.package(MATERIALS_SKYBOX_DATA, MATERIALS_SKYBOX_SIZE); + break; + case Engine::StereoscopicType::MULTIVIEW: +#ifdef FILAMENT_ENABLE_MULTIVIEW + builder.package(MATERIALS_SKYBOX_MULTIVIEW_DATA, MATERIALS_SKYBOX_MULTIVIEW_SIZE); +#else + PANIC_POSTCONDITION("Multiview is enabled in the Engine, but this build has not " + "been compiled for multiview."); +#endif + break; + } + } + auto material = builder.build(engine); + return downcast(material); } void FSkybox::terminate(FEngine& engine) noexcept { // use Engine::destroy because FEngine::destroy is inlined Engine& e = engine; - e.destroy(mSkyboxMaterialInstance); e.destroy(mSkybox); + e.destroy(mSkyboxMaterialInstance); engine.getEntityManager().destroy(mSkybox); - mSkyboxMaterialInstance = nullptr; mSkybox = {}; + mSkyboxMaterialInstance = nullptr; } -void FSkybox::setLayerMask(uint8_t select, uint8_t values) noexcept { +void FSkybox::setLayerMask(uint8_t const select, uint8_t const values) noexcept { auto& rcm = mRenderableManager; rcm.setLayerMask(rcm.getInstance(mSkybox), select, values); // we keep a checked version mLayerMask = (mLayerMask & ~select) | (values & select); } -void FSkybox::setColor(math::float4 color) noexcept { +void FSkybox::setColor(float4 const color) noexcept { mSkyboxMaterialInstance->setParameter("color", color); } -void FSkybox::commit(backend::DriverApi& driver) noexcept { - mSkyboxMaterialInstance->commit(driver); -} - } // namespace filament diff --git a/filament/src/details/Skybox.h b/filament/src/details/Skybox.h index 1e7347fecc6..e247728f8c2 100644 --- a/filament/src/details/Skybox.h +++ b/filament/src/details/Skybox.h @@ -53,9 +53,6 @@ class FSkybox : public Skybox { void setColor(math::float4 color) noexcept; - // commits UBOs - void commit(backend::DriverApi& driver) noexcept; - private: // we don't own these FTexture const* mSkyboxTexture = nullptr; diff --git a/filament/src/details/Stream.cpp b/filament/src/details/Stream.cpp index b1ec720c3e2..00d2ddaed73 100644 --- a/filament/src/details/Stream.cpp +++ b/filament/src/details/Stream.cpp @@ -23,10 +23,10 @@ #include +#include #include #include - namespace filament { using namespace backend; @@ -40,10 +40,10 @@ struct Stream::BuilderDetails { using BuilderType = Stream; BuilderType::Builder::Builder() noexcept = default; BuilderType::Builder::~Builder() noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder&& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder&& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder const& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder&& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder const& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder&& rhs) noexcept = default; Stream::Builder& Stream::Builder::stream(void* stream) noexcept { @@ -51,16 +51,20 @@ Stream::Builder& Stream::Builder::stream(void* stream) noexcept { return *this; } -Stream::Builder& Stream::Builder::width(uint32_t width) noexcept { +Stream::Builder& Stream::Builder::width(uint32_t const width) noexcept { mImpl->mWidth = width; return *this; } -Stream::Builder& Stream::Builder::height(uint32_t height) noexcept { +Stream::Builder& Stream::Builder::height(uint32_t const height) noexcept { mImpl->mHeight = height; return *this; } +Stream::Builder& Stream::Builder::name(const char* name, size_t const len) noexcept { + return BuilderNameMixin::name(name, len); +} + Stream* Stream::Builder::build(Engine& engine) { return downcast(engine).createStream(*this); } @@ -80,28 +84,34 @@ FStream::FStream(FEngine& engine, const Builder& builder) noexcept } else { mStreamHandle = engine.getDriverApi().createStreamAcquired(); } + + if (auto name = builder.getName(); !name.empty()) { + engine.getDriverApi().setDebugTag(mStreamHandle.getId(), std::move(name)); + } } void FStream::terminate(FEngine& engine) noexcept { engine.getDriverApi().destroyStream(mStreamHandle); } -void FStream::setAcquiredImage(void* image, Callback callback, void* userdata) noexcept { +void FStream::setAcquiredImage(void* image, + Callback const callback, void* userdata) noexcept { mEngine.getDriverApi().setAcquiredImage(mStreamHandle, image, nullptr, callback, userdata); } -void FStream::setAcquiredImage(void* image, CallbackHandler* handler, Callback callback, void* userdata) noexcept { +void FStream::setAcquiredImage(void* image, + CallbackHandler* handler, Callback const callback, void* userdata) noexcept { mEngine.getDriverApi().setAcquiredImage(mStreamHandle, image, handler, callback, userdata); } -void FStream::setDimensions(uint32_t width, uint32_t height) noexcept { +void FStream::setDimensions(uint32_t const width, uint32_t const height) noexcept { mWidth = width; mHeight = height; // unfortunately, because this call is synchronous, we must make sure the handle has been // created first if (UTILS_UNLIKELY(!mStreamHandle)) { - FFence::waitAndDestroy(mEngine.createFence(FFence::Type::SOFT), Fence::Mode::FLUSH); + FFence::waitAndDestroy(mEngine.createFence(), Fence::Mode::FLUSH); } mEngine.getDriverApi().setStreamDimensions(mStreamHandle, mWidth, mHeight); } diff --git a/filament/src/details/SwapChain.cpp b/filament/src/details/SwapChain.cpp index 07d61a05862..a2b4499d8ab 100644 --- a/filament/src/details/SwapChain.cpp +++ b/filament/src/details/SwapChain.cpp @@ -18,28 +18,81 @@ #include "details/Engine.h" +#include + +#include + +#include + +#include +#include + +#include + namespace filament { -FSwapChain::FSwapChain(FEngine& engine, void* nativeWindow, uint64_t flags) - : mEngine(engine), mNativeWindow(nativeWindow), mConfigFlags(flags) { - mSwapChain = engine.getDriverApi().createSwapChain(nativeWindow, flags); +FSwapChain::FSwapChain(FEngine& engine, void* nativeWindow, uint64_t const flags) + : mEngine(engine), mNativeWindow(nativeWindow), mConfigFlags(initFlags(engine, flags)) { + mHwSwapChain = engine.getDriverApi().createSwapChain(nativeWindow, flags); +} + +FSwapChain::FSwapChain(FEngine& engine, uint32_t const width, uint32_t const height, uint64_t const flags) + : mEngine(engine), mWidth(width), mHeight(height), mConfigFlags(initFlags(engine, flags)) { + mHwSwapChain = engine.getDriverApi().createSwapChainHeadless(width, height, flags); } -FSwapChain::FSwapChain(FEngine& engine, uint32_t width, uint32_t height, uint64_t flags) - : mEngine(engine), mConfigFlags(flags) { - mSwapChain = engine.getDriverApi().createSwapChainHeadless(width, height, flags); +void FSwapChain::recreateWithNewFlags(FEngine& engine, uint64_t flags) noexcept { + flags = initFlags(engine, flags); + if (flags != mConfigFlags) { + FEngine::DriverApi& driver = engine.getDriverApi(); + driver.destroySwapChain(mHwSwapChain); + mConfigFlags = flags; + if (mNativeWindow) { + mHwSwapChain = driver.createSwapChain(mNativeWindow, flags); + } else { + mHwSwapChain = driver.createSwapChainHeadless(mWidth, mHeight, flags); + } + } +} + +uint64_t FSwapChain::initFlags(FEngine& engine, uint64_t flags) noexcept { + if (!isSRGBSwapChainSupported(engine)) { + flags &= ~CONFIG_SRGB_COLORSPACE; + } + if (!isProtectedContentSupported(engine)) { + flags &= ~CONFIG_PROTECTED_CONTENT; + } + return flags; } void FSwapChain::terminate(FEngine& engine) noexcept { - engine.getDriverApi().destroySwapChain(mSwapChain); + engine.getDriverApi().destroySwapChain(mHwSwapChain); +} + +void FSwapChain::setFrameScheduledCallback( + backend::CallbackHandler* handler, FrameScheduledCallback&& callback, uint64_t const flags) { + mFrameScheduledCallbackIsSet = bool(callback); + mEngine.getDriverApi().setFrameScheduledCallback( + mHwSwapChain, handler, std::move(callback), flags); +} + +bool FSwapChain::isFrameScheduledCallbackSet() const noexcept { + return mFrameScheduledCallbackIsSet; +} + +void FSwapChain::setFrameCompletedCallback( + backend::CallbackHandler* handler, FrameCompletedCallback&& callback) noexcept { + using namespace std::placeholders; + auto boundCallback = std::bind(std::move(callback), this); + mEngine.getDriverApi().setFrameCompletedCallback(mHwSwapChain, handler, std::move(boundCallback)); } -void FSwapChain::setFrameScheduledCallback(FrameScheduledCallback callback, void* user) { - mEngine.getDriverApi().setFrameScheduledCallback(mSwapChain, callback, user); +bool FSwapChain::isSRGBSwapChainSupported(FEngine& engine) noexcept { + return engine.getDriverApi().isSRGBSwapChainSupported(); } -void FSwapChain::setFrameCompletedCallback(FrameCompletedCallback callback, void* user) { - mEngine.getDriverApi().setFrameCompletedCallback(mSwapChain, callback, user); +bool FSwapChain::isProtectedContentSupported(FEngine& engine) noexcept { + return engine.getDriverApi().isProtectedContentSupported(); } } // namespace filament diff --git a/filament/src/details/SwapChain.h b/filament/src/details/SwapChain.h index 7e397ca6939..e31bf670a36 100644 --- a/filament/src/details/SwapChain.h +++ b/filament/src/details/SwapChain.h @@ -23,7 +23,13 @@ #include -#include +#include +#include +#include + +#include + +#include namespace filament { @@ -36,38 +42,67 @@ class FSwapChain : public SwapChain { void terminate(FEngine& engine) noexcept; void makeCurrent(backend::DriverApi& driverApi) noexcept { - driverApi.makeCurrent(mSwapChain, mSwapChain); + driverApi.makeCurrent(mHwSwapChain, mHwSwapChain); } void commit(backend::DriverApi& driverApi) noexcept { - driverApi.commit(mSwapChain); + driverApi.commit(mHwSwapChain); } void* getNativeWindow() const noexcept { return mNativeWindow; } - constexpr bool isTransparent() const noexcept { + bool isTransparent() const noexcept { return (mConfigFlags & CONFIG_TRANSPARENT) != 0; } - constexpr bool isReadable() const noexcept { + bool isReadable() const noexcept { return (mConfigFlags & CONFIG_READABLE) != 0; } + bool hasStencilBuffer() const noexcept { + return (mConfigFlags & CONFIG_HAS_STENCIL_BUFFER) != 0; + } + + bool isProtected() const noexcept { + return (mConfigFlags & CONFIG_PROTECTED_CONTENT) != 0; + } + + // This returns the effective flags. Unsupported flags are cleared automatically. + uint64_t getFlags() const noexcept { + return mConfigFlags; + } + backend::Handle getHwHandle() const noexcept { - return mSwapChain; + return mHwSwapChain; } - void setFrameScheduledCallback(FrameScheduledCallback callback, void* user); + void setFrameScheduledCallback( + backend::CallbackHandler* handler, FrameScheduledCallback&& callback, uint64_t flags); + + bool isFrameScheduledCallbackSet() const noexcept; + + void setFrameCompletedCallback(backend::CallbackHandler* handler, + utils::Invocable&& callback) noexcept; + + static bool isSRGBSwapChainSupported(FEngine& engine) noexcept; + + static bool isProtectedContentSupported(FEngine& engine) noexcept; - void setFrameCompletedCallback(FrameCompletedCallback callback, void* user); + // This is currently only used for debugging. This allows to recreate the HwSwapChain with + // new flags. + void recreateWithNewFlags(FEngine& engine, uint64_t flags) noexcept; private: FEngine& mEngine; - backend::Handle mSwapChain; - void* mNativeWindow = nullptr; - uint64_t mConfigFlags = 0; + backend::Handle mHwSwapChain; + bool mFrameScheduledCallbackIsSet = false; + void* mNativeWindow{}; + uint32_t mWidth{}; + uint32_t mHeight{}; + uint64_t mConfigFlags{}; + static uint64_t initFlags(FEngine& engine, uint64_t flags) noexcept; }; FILAMENT_DOWNCAST(SwapChain) diff --git a/filament/src/details/Texture.cpp b/filament/src/details/Texture.cpp index 6f82ea7bd76..ee1c3d34329 100644 --- a/filament/src/details/Texture.cpp +++ b/filament/src/details/Texture.cpp @@ -25,14 +25,34 @@ #include +#include +#include + #include #include #include #include +#include +#include +#include + +#include +#include +#include +#include +#include #include #include +#include +#include +#include +#include + +#include +#include + using namespace utils; namespace filament { @@ -58,8 +78,10 @@ struct Texture::BuilderDetails { uint8_t mLevels = 1; Sampler mTarget = Sampler::SAMPLER_2D; InternalFormat mFormat = InternalFormat::RGBA8; - Usage mUsage = Usage::DEFAULT; + Usage mUsage = Usage::NONE; + bool mHasBlitSrc = false; bool mTextureIsSwizzled = false; + bool mExternal = false; std::array mSwizzle = { Swizzle::CHANNEL_0, Swizzle::CHANNEL_1, Swizzle::CHANNEL_2, Swizzle::CHANNEL_3 }; @@ -68,76 +90,155 @@ struct Texture::BuilderDetails { using BuilderType = Texture; BuilderType::Builder::Builder() noexcept = default; BuilderType::Builder::~Builder() noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder&& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder&& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder const& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder&& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder const& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder&& rhs) noexcept = default; -Texture::Builder& Texture::Builder::width(uint32_t width) noexcept { +Texture::Builder& Texture::Builder::width(uint32_t const width) noexcept { mImpl->mWidth = width; return *this; } -Texture::Builder& Texture::Builder::height(uint32_t height) noexcept { +Texture::Builder& Texture::Builder::height(uint32_t const height) noexcept { mImpl->mHeight = height; return *this; } -Texture::Builder& Texture::Builder::depth(uint32_t depth) noexcept { +Texture::Builder& Texture::Builder::depth(uint32_t const depth) noexcept { mImpl->mDepth = depth; return *this; } -Texture::Builder& Texture::Builder::levels(uint8_t levels) noexcept { +Texture::Builder& Texture::Builder::levels(uint8_t const levels) noexcept { mImpl->mLevels = std::max(uint8_t(1), levels); return *this; } -Texture::Builder& Texture::Builder::sampler(Texture::Sampler target) noexcept { +Texture::Builder& Texture::Builder::sampler(Sampler const target) noexcept { mImpl->mTarget = target; return *this; } -Texture::Builder& Texture::Builder::format(Texture::InternalFormat format) noexcept { +Texture::Builder& Texture::Builder::format(InternalFormat const format) noexcept { mImpl->mFormat = format; return *this; } -Texture::Builder& Texture::Builder::usage(Texture::Usage usage) noexcept { - mImpl->mUsage = Texture::Usage(usage); +Texture::Builder& Texture::Builder::usage(Usage const usage) noexcept { + mImpl->mUsage = Usage(usage); return *this; } -Texture::Builder& Texture::Builder::import(intptr_t id) noexcept { +Texture::Builder& Texture::Builder::import(intptr_t const id) noexcept { assert_invariant(id); // imported id can't be zero mImpl->mImportedId = id; return *this; } -Texture::Builder& Texture::Builder::swizzle(Swizzle r, Swizzle g, Swizzle b, Swizzle a) noexcept { +Texture::Builder& Texture::Builder::external() noexcept { + mImpl->mExternal = true; + return *this; +} + +Texture::Builder& Texture::Builder::swizzle(Swizzle const r, Swizzle const g, Swizzle const b, Swizzle const a) noexcept { mImpl->mTextureIsSwizzled = true; mImpl->mSwizzle = { r, g, b, a }; return *this; } +Texture::Builder& Texture::Builder::name(const char* name, size_t const len) noexcept { + return BuilderNameMixin::name(name, len); +} + Texture* Texture::Builder::build(Engine& engine) { - ASSERT_PRECONDITION(Texture::isTextureFormatSupported(engine, mImpl->mFormat), - "Texture format %u not supported on this platform", mImpl->mFormat); + FILAMENT_CHECK_PRECONDITION(Texture::isTextureFormatSupported(engine, mImpl->mFormat)) + << "Texture format " << uint16_t(mImpl->mFormat) << " not supported on this platform"; + + const bool isProtectedTexturesSupported = + downcast(engine).getDriverApi().isProtectedTexturesSupported(); + const bool useProtectedMemory = bool(mImpl->mUsage & TextureUsage::PROTECTED); + + FILAMENT_CHECK_PRECONDITION( + (isProtectedTexturesSupported && useProtectedMemory) || !useProtectedMemory) + << "Texture is PROTECTED but protected textures are not supported"; + + // SAMPLER_EXTERNAL implies imported. + if (mImpl->mTarget == SamplerType::SAMPLER_EXTERNAL) { + mImpl->mExternal = true; + } + + uint8_t maxLevelCount; + switch (mImpl->mTarget) { + case SamplerType::SAMPLER_2D: + case SamplerType::SAMPLER_2D_ARRAY: + case SamplerType::SAMPLER_CUBEMAP: + case SamplerType::SAMPLER_EXTERNAL: + case SamplerType::SAMPLER_CUBEMAP_ARRAY: + maxLevelCount = FTexture::maxLevelCount(mImpl->mWidth, mImpl->mHeight); + break; + case SamplerType::SAMPLER_3D: + maxLevelCount = FTexture::maxLevelCount(std::max( + { mImpl->mWidth, mImpl->mHeight, mImpl->mDepth })); + break; + } + mImpl->mLevels = std::min(mImpl->mLevels, maxLevelCount); + + if (mImpl->mUsage == TextureUsage::NONE) { + mImpl->mUsage = TextureUsage::DEFAULT; + if (mImpl->mLevels > 1 && + (mImpl->mWidth > 1 || mImpl->mHeight > 1) && + !mImpl->mExternal) { + const bool formatMipmappable = + downcast(engine).getDriverApi().isTextureFormatMipmappable(mImpl->mFormat); + if (formatMipmappable) { + // by default mipmappable textures have the BLIT usage bits set + mImpl->mUsage |= TextureUsage::BLIT_SRC | TextureUsage::BLIT_DST; + } + } + } + + // TODO: remove in a future filament release. + // Clients might not have known that textures that are read need to have BLIT_SRC as usages. For + // now, we workaround the issue by making sure any color attachment can be the source of a copy + // for readPixels(). + mImpl->mHasBlitSrc = any(mImpl->mUsage & TextureUsage::BLIT_SRC); + if (!mImpl->mHasBlitSrc && any(mImpl->mUsage & TextureUsage::COLOR_ATTACHMENT)) { + mImpl->mUsage |= TextureUsage::BLIT_SRC; + } const bool sampleable = bool(mImpl->mUsage & TextureUsage::SAMPLEABLE); const bool swizzled = mImpl->mTextureIsSwizzled; const bool imported = mImpl->mImportedId; #if defined(__EMSCRIPTEN__) - ASSERT_PRECONDITION(!swizzled, "WebGL does not support texture swizzling."); + FILAMENT_CHECK_PRECONDITION(!swizzled) << "WebGL does not support texture swizzling."; #endif - ASSERT_PRECONDITION((swizzled && sampleable) || !swizzled, - "Swizzled texture must be SAMPLEABLE"); + auto validateSamplerType = [&engine = downcast(engine)](SamplerType const sampler) -> bool { + switch (sampler) { + case SamplerType::SAMPLER_2D: + case SamplerType::SAMPLER_CUBEMAP: + case SamplerType::SAMPLER_EXTERNAL: + return true; + case SamplerType::SAMPLER_3D: + case SamplerType::SAMPLER_2D_ARRAY: + return engine.hasFeatureLevel(FeatureLevel::FEATURE_LEVEL_1); + case SamplerType::SAMPLER_CUBEMAP_ARRAY: + return engine.hasFeatureLevel(FeatureLevel::FEATURE_LEVEL_2); + } + }; + + FILAMENT_CHECK_PRECONDITION(validateSamplerType(mImpl->mTarget)) + << "SamplerType " << uint8_t(mImpl->mTarget) << " not support at feature level " + << uint8_t(engine.getActiveFeatureLevel()); + + FILAMENT_CHECK_PRECONDITION((swizzled && sampleable) || !swizzled) + << "Swizzled texture must be SAMPLEABLE"; - ASSERT_PRECONDITION((imported && sampleable) || !imported, - "Imported texture must be SAMPLEABLE"); + FILAMENT_CHECK_PRECONDITION((imported && sampleable) || !imported) + << "Imported texture must be SAMPLEABLE"; return downcast(engine).createTexture(*this); } @@ -145,108 +246,111 @@ Texture* Texture::Builder::build(Engine& engine) { // ------------------------------------------------------------------------------------------------ FTexture::FTexture(FEngine& engine, const Builder& builder) { + FEngine::DriverApi& driver = engine.getDriverApi(); + mDriver = &driver; // this is unfortunately needed for getHwHandleForSampling() mWidth = static_cast(builder->mWidth); mHeight = static_cast(builder->mHeight); mDepth = static_cast(builder->mDepth); mFormat = builder->mFormat; mUsage = builder->mUsage; mTarget = builder->mTarget; - - uint8_t maxLevelCount; - switch (builder->mTarget) { - case SamplerType::SAMPLER_2D: - case SamplerType::SAMPLER_2D_ARRAY: - case SamplerType::SAMPLER_CUBEMAP: - case SamplerType::SAMPLER_EXTERNAL: - case SamplerType::SAMPLER_CUBEMAP_ARRAY: - maxLevelCount = FTexture::maxLevelCount(mWidth, mHeight); - break; - case SamplerType::SAMPLER_3D: - maxLevelCount = FTexture::maxLevelCount(std::max(mWidth, std::max(mHeight, mDepth))); - break; + mLevelCount = builder->mLevels; + mSwizzle = builder->mSwizzle; + mTextureIsSwizzled = builder->mTextureIsSwizzled; + mHasBlitSrc = builder->mHasBlitSrc; + mExternal = builder->mExternal; + + bool const isImported = builder->mImportedId != 0; + if (mExternal && !isImported) { + // mHandle and mHandleForSampling will be created in setExternalImage() + // If this Texture is used for sampling before setExternalImage() is called, + // we'll lazily create a 1x1 placeholder texture. + return; } - mLevelCount = std::min(builder->mLevels, maxLevelCount); - - FEngine::DriverApi& driver = engine.getDriverApi(); - if (UTILS_LIKELY(builder->mImportedId == 0)) { - if (UTILS_LIKELY(!builder->mTextureIsSwizzled)) { - mHandle = driver.createTexture( - mTarget, mLevelCount, mFormat, mSampleCount, mWidth, mHeight, mDepth, mUsage); - } else { - mHandle = driver.createTextureSwizzled( - mTarget, mLevelCount, mFormat, mSampleCount, mWidth, mHeight, mDepth, mUsage, - builder->mSwizzle[0], builder->mSwizzle[1], builder->mSwizzle[2], - builder->mSwizzle[3]); - } + if (UTILS_LIKELY(!isImported)) { + mHandle = driver.createTexture( + mTarget, mLevelCount, mFormat, mSampleCount, mWidth, mHeight, mDepth, mUsage); } else { mHandle = driver.importTexture(builder->mImportedId, mTarget, mLevelCount, mFormat, mSampleCount, mWidth, mHeight, mDepth, mUsage); } + + if (UTILS_UNLIKELY(builder->mTextureIsSwizzled)) { + auto const& s = builder->mSwizzle; + auto swizzleView = driver.createTextureViewSwizzle(mHandle, s[0], s[1], s[2], s[3]); + driver.destroyTexture(mHandle); + mHandle = swizzleView; + } + + mHandleForSampling = mHandle; + + if (auto name = builder.getName(); !name.empty()) { + driver.setDebugTag(mHandle.getId(), std::move(name)); + } else { + driver.setDebugTag(mHandle.getId(), CString{"FTexture"}); + } } // frees driver resources, object becomes invalid void FTexture::terminate(FEngine& engine) { - FEngine::DriverApi& driver = engine.getDriverApi(); - driver.destroyTexture(mHandle); + setHandles({}); } -size_t FTexture::getWidth(size_t level) const noexcept { +size_t FTexture::getWidth(size_t const level) const noexcept { return valueForLevel(level, mWidth); } -size_t FTexture::getHeight(size_t level) const noexcept { +size_t FTexture::getHeight(size_t const level) const noexcept { return valueForLevel(level, mHeight); } -size_t FTexture::getDepth(size_t level) const noexcept { +size_t FTexture::getDepth(size_t const level) const noexcept { return valueForLevel(level, mDepth); } -void FTexture::setImage(FEngine& engine, size_t level, - uint32_t xoffset, uint32_t yoffset, uint32_t zoffset, - uint32_t width, uint32_t height, uint32_t depth, - FTexture::PixelBufferDescriptor&& buffer) const { +void FTexture::setImage(FEngine& engine, size_t const level, + uint32_t const xoffset, uint32_t const yoffset, uint32_t const zoffset, + uint32_t const width, uint32_t const height, uint32_t const depth, + PixelBufferDescriptor&& p) const { - auto validateTarget = [&engine](SamplerType sampler) -> bool { - switch (sampler) { - case SamplerType::SAMPLER_2D: - case SamplerType::SAMPLER_3D: - case SamplerType::SAMPLER_2D_ARRAY: - case SamplerType::SAMPLER_CUBEMAP: - return true; - case SamplerType::SAMPLER_EXTERNAL: - return false; - case SamplerType::SAMPLER_CUBEMAP_ARRAY: - return engine.hasFeatureLevel(FeatureLevel::FEATURE_LEVEL_2); - } - }; + if (UTILS_UNLIKELY(!engine.hasFeatureLevel(FeatureLevel::FEATURE_LEVEL_1))) { + FILAMENT_CHECK_PRECONDITION(p.stride == 0 || p.stride == width) + << "PixelBufferDescriptor stride must be 0 (or width) at FEATURE_LEVEL_0"; + } - ASSERT_PRECONDITION(buffer.type == PixelDataType::COMPRESSED || - validatePixelFormatAndType(mFormat, buffer.format, buffer.type), - "The combination of internal format=%u and {format=%u, type=%u} is not supported.", - unsigned(mFormat), unsigned(buffer.format), unsigned(buffer.type)); + // this should have been validated already + assert_invariant(isTextureFormatSupported(engine, mFormat)); - ASSERT_PRECONDITION(!mStream, "setImage() called on a Stream texture."); + FILAMENT_CHECK_PRECONDITION(p.type == PixelDataType::COMPRESSED || + validatePixelFormatAndType(mFormat, p.format, p.type)) + << "The combination of internal format=" << unsigned(mFormat) + << " and {format=" << unsigned(p.format) << ", type=" << unsigned(p.type) + << "} is not supported."; - ASSERT_PRECONDITION(level < mLevelCount, - "level=%u is >= to levelCount=%u.", unsigned(level), unsigned(mLevelCount)); + FILAMENT_CHECK_PRECONDITION(!mStream) << "setImage() called on a Stream texture."; - ASSERT_PRECONDITION(validateTarget(mTarget), - "Texture Sampler type (%u) not supported for this operation.", unsigned(mTarget)); + FILAMENT_CHECK_PRECONDITION(level < mLevelCount) + << "level=" << unsigned(level) << " is >= to levelCount=" << unsigned(mLevelCount) + << "."; - ASSERT_PRECONDITION(mSampleCount <= 1, - "Operation not supported with multisample (%u) texture.", unsigned(mSampleCount)); + FILAMENT_CHECK_PRECONDITION(!mExternal) + << "External Texture not supported for this operation."; - ASSERT_PRECONDITION(xoffset + width <= valueForLevel(level, mWidth), - "xoffset (%u) + width (%u) > texture width (%u) at level (%u)", - unsigned(xoffset), unsigned(width), unsigned(valueForLevel(level, mWidth)), unsigned(level)); + FILAMENT_CHECK_PRECONDITION(mSampleCount <= 1) << "Operation not supported with multisample (" + << unsigned(mSampleCount) << ") texture."; - ASSERT_PRECONDITION(yoffset + height <= valueForLevel(level, mHeight), - "yoffset (%u) + height (%u) > texture height (%u) at level (%u)", - unsigned(yoffset), unsigned(height), unsigned(valueForLevel(level, mHeight)), unsigned(level)); + FILAMENT_CHECK_PRECONDITION(xoffset + width <= valueForLevel(level, mWidth)) + << "xoffset (" << unsigned(xoffset) << ") + width (" << unsigned(width) + << ") > texture width (" << valueForLevel(level, mWidth) << ") at level (" + << unsigned(level) << ")"; - ASSERT_PRECONDITION(buffer.buffer, "Data buffer is nullptr."); + FILAMENT_CHECK_PRECONDITION(yoffset + height <= valueForLevel(level, mHeight)) + << "yoffset (" << unsigned(yoffset) << ") + height (" << unsigned(height) + << ") > texture height (" << valueForLevel(level, mHeight) << ") at level (" + << unsigned(level) << ")"; + + FILAMENT_CHECK_PRECONDITION(p.buffer) << "Data buffer is nullptr."; uint32_t effectiveTextureDepthOrLayers; switch (mTarget) { @@ -270,19 +374,37 @@ void FTexture::setImage(FEngine& engine, size_t level, break; } - ASSERT_PRECONDITION(zoffset + depth <= effectiveTextureDepthOrLayers, - "zoffset (%u) + depth (%u) > texture depth (%u) at level (%u)", - unsigned(zoffset), unsigned(depth), effectiveTextureDepthOrLayers, unsigned(level)); + FILAMENT_CHECK_PRECONDITION(zoffset + depth <= effectiveTextureDepthOrLayers) + << "zoffset (" << unsigned(zoffset) << ") + depth (" << unsigned(depth) + << ") > texture depth (" << effectiveTextureDepthOrLayers << ") at level (" + << unsigned(level) << ")"; + + using PBD = PixelBufferDescriptor; + size_t const stride = p.stride ? p.stride : width; + size_t const bpp = PBD::computeDataSize(p.format, p.type, 1, 1, 1); + size_t const bpr = PBD::computeDataSize(p.format, p.type, stride, 1, p.alignment); + size_t const bpl = bpr * height; // TODO: PBD should have a "layer stride" + // TODO: PBD should have a p.depth (# layers to skip) + FILAMENT_CHECK_PRECONDITION(bpp * p.left + bpr * p.top + bpl * (0 + depth) <= p.size) + << "buffer overflow: (size=" << size_t(p.size) << ", stride=" << size_t(p.stride) + << ", left=" << unsigned(p.left) << ", top=" << unsigned(p.top) + << ") smaller than specified region " + "{{" + << unsigned(xoffset) << "," << unsigned(yoffset) << "," << unsigned(zoffset) << "},{" + << unsigned(width) << "," << unsigned(height) << "," << unsigned(depth) << ")}}"; engine.getDriverApi().update3DImage(mHandle, - uint8_t(level), xoffset, yoffset, zoffset, width, height, depth, std::move(buffer)); + uint8_t(level), xoffset, yoffset, zoffset, width, height, depth, std::move(p)); + + // this method shouldn't have been const + const_cast(this)->updateLodRange(level); } // deprecated -void FTexture::setImage(FEngine& engine, size_t level, - Texture::PixelBufferDescriptor&& buffer, const FaceOffsets& faceOffsets) const { +void FTexture::setImage(FEngine& engine, size_t const level, + PixelBufferDescriptor&& buffer, const FaceOffsets& faceOffsets) const { - auto validateTarget = [](SamplerType sampler) -> bool { + auto validateTarget = [](SamplerType const sampler) -> bool { switch (sampler) { case SamplerType::SAMPLER_CUBEMAP: return true; @@ -295,20 +417,26 @@ void FTexture::setImage(FEngine& engine, size_t level, } }; - ASSERT_PRECONDITION(buffer.type == PixelDataType::COMPRESSED || - validatePixelFormatAndType(mFormat, buffer.format, buffer.type), - "The combination of internal format=%u and {format=%u, type=%u} is not supported.", - unsigned(mFormat), unsigned(buffer.format), unsigned(buffer.type)); + // this should have been validated already + assert_invariant(isTextureFormatSupported(engine, mFormat)); + + FILAMENT_CHECK_PRECONDITION(buffer.type == PixelDataType::COMPRESSED || + validatePixelFormatAndType(mFormat, buffer.format, buffer.type)) + << "The combination of internal format=" << unsigned(mFormat) + << " and {format=" << unsigned(buffer.format) << ", type=" << unsigned(buffer.type) + << "} is not supported."; - ASSERT_PRECONDITION(!mStream, "setImage() called on a Stream texture."); + FILAMENT_CHECK_PRECONDITION(!mStream) << "setImage() called on a Stream texture."; - ASSERT_PRECONDITION(level < mLevelCount, - "level=%u is >= to levelCount=%u.", unsigned(level), unsigned(mLevelCount)); + FILAMENT_CHECK_PRECONDITION(level < mLevelCount) + << "level=" << unsigned(level) << " is >= to levelCount=" << unsigned(mLevelCount) + << "."; - ASSERT_PRECONDITION(validateTarget(mTarget), - "Texture Sampler type (%u) not supported for this operation.", unsigned(mTarget)); + FILAMENT_CHECK_PRECONDITION(validateTarget(mTarget)) + << "Texture Sampler type (" << unsigned(mTarget) + << ") not supported for this operation."; - ASSERT_PRECONDITION(buffer.buffer, "Data buffer is nullptr."); + FILAMENT_CHECK_PRECONDITION(buffer.buffer) << "Data buffer is nullptr."; auto w = std::max(1u, mWidth >> level); auto h = std::max(1u, mHeight >> level); @@ -336,135 +464,194 @@ void FTexture::setImage(FEngine& engine, size_t level, engine.getDriverApi().queueCommand( make_copyable_function([buffer = std::move(buffer)]() {})); } + + // this method shouldn't been const + const_cast(this)->updateLodRange(level); } void FTexture::setExternalImage(FEngine& engine, void* image) noexcept { - if (mTarget == Sampler::SAMPLER_EXTERNAL) { - // The call to setupExternalImage is synchronous, and allows the driver to take ownership of - // the external image on this thread, if necessary. - engine.getDriverApi().setupExternalImage(image); - engine.getDriverApi().setExternalImage(mHandle, image); + FILAMENT_CHECK_PRECONDITION(mExternal) << "The texture must be external."; + + // The call to setupExternalImage is synchronous, and allows the driver to take ownership of the + // external image on this thread, if necessary. + auto& api = engine.getDriverApi(); + api.setupExternalImage(image); + + auto texture = api.createTextureExternalImage(mTarget, mFormat, mWidth, mHeight, mUsage, image); + + if (mTextureIsSwizzled) { + auto const& s = mSwizzle; + auto swizzleView = api.createTextureViewSwizzle(texture, s[0], s[1], s[2], s[3]); + api.destroyTexture(texture); + texture = swizzleView; } + + setHandles(texture); } -void FTexture::setExternalImage(FEngine& engine, void* image, size_t plane) noexcept { - if (mTarget == Sampler::SAMPLER_EXTERNAL) { - // The call to setupExternalImage is synchronous, and allows the driver to take ownership of - // the external image on this thread, if necessary. - engine.getDriverApi().setupExternalImage(image); - engine.getDriverApi().setExternalImagePlane(mHandle, image, plane); +void FTexture::setExternalImage(FEngine& engine, void* image, size_t const plane) noexcept { + FILAMENT_CHECK_PRECONDITION(mExternal) << "The texture must be external."; + + // The call to setupExternalImage is synchronous, and allows the driver to take ownership of + // the external image on this thread, if necessary. + auto& api = engine.getDriverApi(); + api.setupExternalImage(image); + + auto texture = + api.createTextureExternalImagePlane(mFormat, mWidth, mHeight, mUsage, image, plane); + + if (mTextureIsSwizzled) { + auto const& s = mSwizzle; + auto swizzleView = api.createTextureViewSwizzle(texture, s[0], s[1], s[2], s[3]); + api.destroyTexture(texture); + texture = swizzleView; } + + setHandles(texture); } void FTexture::setExternalStream(FEngine& engine, FStream* stream) noexcept { - if (stream) { - ASSERT_PRECONDITION(mTarget == Sampler::SAMPLER_EXTERNAL, - "Texture target must be SAMPLER_EXTERNAL"); + FILAMENT_CHECK_PRECONDITION(mExternal) << "The texture must be external."; + + auto& api = engine.getDriverApi(); + auto texture = api.createTexture( + mTarget, mLevelCount, mFormat, mSampleCount, mWidth, mHeight, mDepth, mUsage); + if (mTextureIsSwizzled) { + auto const& s = mSwizzle; + auto swizzleView = api.createTextureViewSwizzle(texture, s[0], s[1], s[2], s[3]); + api.destroyTexture(texture); + texture = swizzleView; + } + + setHandles(texture); + + if (stream) { mStream = stream; - engine.getDriverApi().setExternalStream(mHandle, stream->getHandle()); + api.setExternalStream(mHandle, stream->getHandle()); } else { mStream = nullptr; - engine.getDriverApi().setExternalStream(mHandle, backend::Handle()); + api.setExternalStream(mHandle, backend::Handle()); } } void FTexture::generateMipmaps(FEngine& engine) const noexcept { - ASSERT_PRECONDITION(mTarget != SamplerType::SAMPLER_EXTERNAL, - "External Textures are not mipmappable."); + FILAMENT_CHECK_PRECONDITION(!mExternal) + << "External Textures are not mipmappable."; + + FILAMENT_CHECK_PRECONDITION(mTarget != SamplerType::SAMPLER_3D) + << "3D Textures are not mipmappable."; const bool formatMipmappable = engine.getDriverApi().isTextureFormatMipmappable(mFormat); - ASSERT_PRECONDITION(formatMipmappable, - "Texture format %u is not mipmappable.", (unsigned)mFormat); + FILAMENT_CHECK_PRECONDITION(formatMipmappable) + << "Texture format " << (unsigned)mFormat << " is not mipmappable."; if (mLevelCount < 2 || (mWidth == 1 && mHeight == 1)) { return; } - if (engine.getDriverApi().canGenerateMipmaps()) { - engine.getDriverApi().generateMipmaps(mHandle); - return; - } + engine.getDriverApi().generateMipmaps(mHandle); + // this method shouldn't have been const + const_cast(this)->updateLodRange(0, mLevelCount); +} - auto generateMipsForLayer = [this, &engine](TargetBufferInfo proto) { - FEngine::DriverApi& driver = engine.getDriverApi(); - - // Wrap miplevel 0 in a render target so that we can use it as a blit source. - uint8_t level = 0; - uint32_t srcw = mWidth; - uint32_t srch = mHeight; - proto.handle = mHandle; - proto.level = level++; - backend::Handle srcrth = driver.createRenderTarget( - TargetBufferFlags::COLOR, srcw, srch, mSampleCount, proto, {}, {}); - - // Perform a blit for all miplevels down to 1x1. - backend::Handle dstrth; - do { - uint32_t dstw = std::max(srcw >> 1u, 1u); - uint32_t dsth = std::max(srch >> 1u, 1u); - proto.level = level++; - dstrth = driver.createRenderTarget( - TargetBufferFlags::COLOR, dstw, dsth, mSampleCount, proto, {}, {}); - driver.blit(TargetBufferFlags::COLOR, - dstrth, { 0, 0, dstw, dsth }, - srcrth, { 0, 0, srcw, srch }, - SamplerMagFilter::LINEAR); - driver.destroyRenderTarget(srcrth); - srcrth = dstrth; - srcw = dstw; - srch = dsth; - } while ((srcw > 1 || srch > 1) && level < mLevelCount); - driver.destroyRenderTarget(dstrth); - }; +bool FTexture::textureHandleCanMutate() const noexcept { + return (any(mUsage & Usage::SAMPLEABLE) && mLevelCount > 1) || mExternal; +} - switch (mTarget) { - case SamplerType::SAMPLER_2D: - generateMipsForLayer({}); - break; - case SamplerType::SAMPLER_2D_ARRAY: - UTILS_NOUNROLL - for (uint16_t layer = 0, c = mDepth; layer < c; ++layer) { - generateMipsForLayer({ .layer = layer }); - } - break; - case SamplerType::SAMPLER_CUBEMAP_ARRAY: - UTILS_NOUNROLL - for (uint16_t layer = 0, c = mDepth * 6; layer < c; ++layer) { - generateMipsForLayer({ .layer = layer }); +void FTexture::updateLodRange(uint8_t const baseLevel, uint8_t const levelCount) noexcept { + assert_invariant(!mExternal); + if (any(mUsage & Usage::SAMPLEABLE) && mLevelCount > 1) { + auto& range = mLodRange; + uint8_t const last = int8_t(baseLevel + levelCount); + if (range.first > baseLevel || range.last < last) { + if (range.empty()) { + range = { baseLevel, last }; + } else { + range.first = std::min(range.first, baseLevel); + range.last = std::max(range.last, last); } - break; - case SamplerType::SAMPLER_CUBEMAP: - UTILS_NOUNROLL - for (uint8_t face = 0; face < 6; ++face) { - generateMipsForLayer({ .layer = face }); - } - break; - case SamplerType::SAMPLER_EXTERNAL: - // not mipmapable - break; - case SamplerType::SAMPLER_3D: - // TODO: handle SAMPLER_3D -- this can't be done with a 2D blit, this would require - // a fragment shader - slog.w << "Texture::generateMipmap does not support SAMPLER_3D yet on this h/w." << io::endl; - break; + // We defer the creation of the texture view to getHwHandleForSampling() because it + // is a common case that by then, the view won't be needed. Creating the first view on a + // texture has a backend cost. + } + } +} + +void FTexture::setHandles(Handle handle) noexcept { + assert_invariant(!mHandle || mHandleForSampling); + if (mHandle) { + mDriver->destroyTexture(mHandle); } + if (mHandleForSampling != mHandle) { + mDriver->destroyTexture(mHandleForSampling); + } + mHandle = handle; + mHandleForSampling = handle; } -bool FTexture::isTextureFormatSupported(FEngine& engine, InternalFormat format) noexcept { +Handle FTexture::setHandleForSampling( + Handle handle) const noexcept { + assert_invariant(!mHandle || mHandleForSampling); + if (mHandleForSampling && mHandleForSampling != mHandle) { + mDriver->destroyTexture(mHandleForSampling); + } + return mHandleForSampling = handle; +} + +Handle FTexture::createPlaceholderTexture( + DriverApi& driver) noexcept { + auto handle = driver.createTexture( + Sampler::SAMPLER_2D, 1, InternalFormat::RGBA8, 1, 1, 1, 1, Usage::DEFAULT); + static uint8_t pixels[4] = { 0, 0, 0, 0 }; + driver.update3DImage(handle, 0, 0, 0, 0, 1, 1, 1, + { (char*)&pixels[0], sizeof(pixels), + PixelBufferDescriptor::PixelDataFormat::RGBA, + PixelBufferDescriptor::PixelDataType::UBYTE }); + return handle; +} + +Handle FTexture::getHwHandleForSampling() const noexcept { + if (UTILS_UNLIKELY(mExternal && !mHandleForSampling)) { + return setHandleForSampling(createPlaceholderTexture(*mDriver)); + } + auto const& range = mLodRange; + auto& activeRange = mActiveLodRange; + bool const lodRangeChanged = activeRange.first != range.first || activeRange.last != range.last; + if (UTILS_UNLIKELY(lodRangeChanged)) { + activeRange = range; + if (range.empty() || hasAllLods(range)) { + std::ignore = setHandleForSampling(mHandle); + } else { + std::ignore = setHandleForSampling(mDriver->createTextureView( + mHandle, range.first, range.size())); + } + } + return mHandleForSampling; +} + +void FTexture::updateLodRange(uint8_t const level) noexcept { + updateLodRange(level, 1); +} + +bool FTexture::isTextureFormatSupported(FEngine& engine, InternalFormat const format) noexcept { return engine.getDriverApi().isTextureFormatSupported(format); } +bool FTexture::isProtectedTexturesSupported(FEngine& engine) noexcept { + return engine.getDriverApi().isProtectedTexturesSupported(); +} + bool FTexture::isTextureSwizzleSupported(FEngine& engine) noexcept { return engine.getDriverApi().isTextureSwizzleSupported(); } -size_t FTexture::computeTextureDataSize(Texture::Format format, Texture::Type type, - size_t stride, size_t height, size_t alignment) noexcept { +size_t FTexture::computeTextureDataSize(Format const format, Type const type, + size_t const stride, size_t const height, size_t const alignment) noexcept { return PixelBufferDescriptor::computeDataSize(format, type, stride, height, alignment); } -size_t FTexture::getFormatSize(InternalFormat format) noexcept { +size_t FTexture::getFormatSize(InternalFormat const format) noexcept { return backend::getFormatSize(format); } @@ -481,26 +668,23 @@ void FTexture::generatePrefilterMipmap(FEngine& engine, /* validate input data */ - ASSERT_PRECONDITION(buffer.format == PixelDataFormat::RGB || - buffer.format == PixelDataFormat::RGBA, - "input data format must be RGB or RGBA"); + FILAMENT_CHECK_PRECONDITION( + buffer.format == PixelDataFormat::RGB || buffer.format == PixelDataFormat::RGBA) + << "input data format must be RGB or RGBA"; - ASSERT_PRECONDITION( - buffer.type == PixelDataType::FLOAT || + FILAMENT_CHECK_PRECONDITION(buffer.type == PixelDataType::FLOAT || buffer.type == PixelDataType::HALF || - buffer.type == PixelDataType::UINT_10F_11F_11F_REV, - "input data type must be FLOAT, HALF or UINT_10F_11F_11F_REV"); + buffer.type == PixelDataType::UINT_10F_11F_11F_REV) + << "input data type must be FLOAT, HALF or UINT_10F_11F_11F_REV"; /* validate texture */ - ASSERT_PRECONDITION(!(size & (size-1)), - "input data cubemap dimensions must be a power-of-two"); - - ASSERT_PRECONDITION(!isCompressed(), - "reflections texture cannot be compressed"); + FILAMENT_CHECK_PRECONDITION(!(size & (size - 1))) + << "input data cubemap dimensions must be a power-of-two"; + FILAMENT_CHECK_PRECONDITION(!isCompressed()) << "reflections texture cannot be compressed"; - PrefilterOptions defaultOptions; + PrefilterOptions const defaultOptions; options = options ? options : &defaultOptions; JobSystem& js = engine.getJobSystem(); @@ -558,7 +742,7 @@ void FTexture::generatePrefilterMipmap(FEngine& engine, Image temp; Cubemap cml = CubemapUtils::create(temp, size); for (size_t j = 0; j < 6; j++) { - Cubemap::Face face = (Cubemap::Face)j; + Cubemap::Face const face = (Cubemap::Face)j; Image const& image = cml.getImageForFace(face); for (size_t y = 0; y < size; y++) { Cubemap::Texel* out = (Cubemap::Texel*)image.getPixelRef(0, y); @@ -584,10 +768,10 @@ void FTexture::generatePrefilterMipmap(FEngine& engine, for (size_t x = 0; x < size; x++, out++, src++) { using fp10 = fp<0, 5, 5>; using fp11 = fp<0, 5, 6>; - fp11 r{ uint16_t( *src & 0x7FFu) }; - fp11 g{ uint16_t((*src >> 11u) & 0x7FFu) }; - fp10 b{ uint16_t((*src >> 22u) & 0x3FFu) }; - Cubemap::Texel texel{ fp11::tof(r), fp11::tof(g), fp10::tof(b) }; + fp11 const r{ uint16_t( *src & 0x7FFu) }; + fp11 const g{ uint16_t((*src >> 11u) & 0x7FFu) }; + fp10 const b{ uint16_t((*src >> 22u) & 0x3FFu) }; + Cubemap::Texel const texel{ fp11::tof(r), fp11::tof(g), fp10::tof(b) }; Cubemap::writeAt(out, texel); } } @@ -614,12 +798,12 @@ void FTexture::generatePrefilterMipmap(FEngine& engine, // Finally generate each pre-filtered mipmap level const size_t baseExp = ctz(size); - size_t numSamples = options->sampleCount; + size_t const numSamples = options->sampleCount; const size_t numLevels = baseExp + 1; - for (ssize_t i = baseExp; i >= 0; --i) { + for (ssize_t i = (ssize_t)baseExp; i >= 0; --i) { const size_t dim = 1U << i; const size_t level = baseExp - i; - const float lod = saturate(level / (numLevels - 1.0f)); + const float lod = saturate(float(level) / float(numLevels - 1)); const float linearRoughness = lod * lod; Image image; @@ -627,18 +811,18 @@ void FTexture::generatePrefilterMipmap(FEngine& engine, CubemapIBL::roughnessFilter(js, dst, { levels.begin(), uint32_t(levels.size()) }, linearRoughness, numSamples, mirror, true); - Texture::PixelBufferDescriptor pbd(image.getData(), image.getSize(), - Texture::PixelBufferDescriptor::PixelDataFormat::RGB, - Texture::PixelBufferDescriptor::PixelDataType::FLOAT, 1, 0, 0, image.getStride()); + PixelBufferDescriptor const pbd(image.getData(), image.getSize(), + PixelBufferDescriptor::PixelDataFormat::RGB, + PixelBufferDescriptor::PixelDataType::FLOAT, 1, 0, 0, image.getStride()); - uintptr_t base = uintptr_t(image.getData()); + uintptr_t const base = uintptr_t(image.getData()); for (size_t j = 0; j < 6; j++) { Image const& faceImage = dst.getImageForFace((Cubemap::Face)j); auto offset = uintptr_t(faceImage.getData()) - base; driver.update3DImage(mHandle, level, 0, 0, j, dim, dim, 1, { (char*)image.getData() + offset, dim * dim * 3 * sizeof(float), - Texture::PixelBufferDescriptor::PixelDataFormat::RGB, - Texture::PixelBufferDescriptor::PixelDataType::FLOAT, 1, + PixelBufferDescriptor::PixelDataFormat::RGB, + PixelBufferDescriptor::PixelDataType::FLOAT, 1, 0, 0, uint32_t(image.getStride()) }); } @@ -651,8 +835,8 @@ void FTexture::generatePrefilterMipmap(FEngine& engine, // by the caller (without being move()d here). } -bool FTexture::validatePixelFormatAndType(TextureFormat internalFormat, - PixelDataFormat format, PixelDataType type) noexcept { +bool FTexture::validatePixelFormatAndType(TextureFormat const internalFormat, + PixelDataFormat const format, PixelDataType const type) noexcept { switch (internalFormat) { case TextureFormat::R8: diff --git a/filament/src/details/Texture.h b/filament/src/details/Texture.h index cbf02e30424..f4354f2f577 100644 --- a/filament/src/details/Texture.h +++ b/filament/src/details/Texture.h @@ -19,12 +19,17 @@ #include "downcast.h" +#include +#include #include #include #include +#include +#include + namespace filament { class FEngine; @@ -38,6 +43,7 @@ class FTexture : public Texture { void terminate(FEngine& engine); backend::Handle getHwHandle() const noexcept { return mHandle; } + backend::Handle getHwHandleForSampling() const noexcept; size_t getWidth(size_t level = 0) const noexcept; size_t getHeight(size_t level = 0) const noexcept; @@ -66,10 +72,10 @@ class FTexture : public Texture { void generateMipmaps(FEngine& engine) const noexcept; - void setSampleCount(size_t sampleCount) noexcept { mSampleCount = uint8_t(sampleCount); } + void setSampleCount(size_t const sampleCount) noexcept { mSampleCount = uint8_t(sampleCount); } size_t getSampleCount() const noexcept { return mSampleCount; } bool isMultisample() const noexcept { return mSampleCount > 1; } - bool isCompressed() const noexcept { return backend::isCompressedFormat(mFormat); } + bool isCompressed() const noexcept { return isCompressedFormat(mFormat); } bool isCubemap() const noexcept { return mTarget == Sampler::SAMPLER_CUBEMAP; } @@ -79,42 +85,76 @@ class FTexture : public Texture { * Utilities */ - // synchronous call to the backend. returns whether a backend supports a particular format. + // Synchronous call to the backend. Returns whether a backend supports a particular format. static bool isTextureFormatSupported(FEngine& engine, InternalFormat format) noexcept; - // synchronous call to the backend. returns whether a backend supports texture swizzling. + // Synchronous call to the backend. Returns whether a backend supports protected textures. + static bool isProtectedTexturesSupported(FEngine& engine) noexcept; + + // Synchronous call to the backend. Returns whether a backend supports texture swizzling. static bool isTextureSwizzleSupported(FEngine& engine) noexcept; // storage needed on the CPU side for texture data uploads - static size_t computeTextureDataSize(Texture::Format format, Texture::Type type, + static size_t computeTextureDataSize(Format format, Type type, size_t stride, size_t height, size_t alignment) noexcept; // Size a of a pixel in bytes for the given format static size_t getFormatSize(InternalFormat format) noexcept; // Returns the with or height for a given mipmap level from the base value. - static inline size_t valueForLevel(uint8_t level, size_t baseLevelValue) { + static inline size_t valueForLevel(uint8_t const level, size_t const baseLevelValue) { return std::max(size_t(1), baseLevelValue >> level); } // Returns the max number of levels for a texture of given max dimensions - static inline uint8_t maxLevelCount(uint32_t maxDimension) noexcept { + static inline uint8_t maxLevelCount(uint32_t const maxDimension) noexcept { return std::max(1, std::ilogbf(float(maxDimension)) + 1); } // Returns the max number of levels for a texture of given dimensions - static inline uint8_t maxLevelCount(uint32_t width, uint32_t height) noexcept { - uint32_t maxDimension = std::max(width, height); + static inline uint8_t maxLevelCount(uint32_t const width, uint32_t const height) noexcept { + uint32_t const maxDimension = std::max(width, height); return maxLevelCount(maxDimension); } static bool validatePixelFormatAndType(backend::TextureFormat internalFormat, backend::PixelDataFormat format, backend::PixelDataType type) noexcept; + bool textureHandleCanMutate() const noexcept; + void updateLodRange(uint8_t level) noexcept; + + // TODO: remove in a future filament release. See below for description. + inline bool hasBlitSrcUsage() const noexcept { + return mHasBlitSrc; + } + private: friend class Texture; - FStream* mStream = nullptr; + struct LodRange { + // 0,0 means lod-range unset (all levels are available) + uint8_t first = 0; // first lod + uint8_t last = 0; // 1 past last lod + bool empty() const noexcept { return first == last; } + size_t size() const noexcept { return last - first; } + }; + + bool hasAllLods(LodRange const range) const noexcept { + return range.first == 0 && range.last == mLevelCount; + } + + void updateLodRange(uint8_t baseLevel, uint8_t levelCount) noexcept; + void setHandles(backend::Handle handle) noexcept; + backend::Handle setHandleForSampling( + backend::Handle handle) const noexcept; + static backend::Handle createPlaceholderTexture( + backend::DriverApi& driver) noexcept; + backend::Handle mHandle; + mutable backend::Handle mHandleForSampling; + backend::DriverApi* mDriver = nullptr; // this is only needed for getHwHandleForSampling() + LodRange mLodRange{}; + mutable LodRange mActiveLodRange{}; + uint32_t mWidth = 1; uint32_t mHeight = 1; uint32_t mDepth = 1; @@ -122,9 +162,22 @@ class FTexture : public Texture { Sampler mTarget = Sampler::SAMPLER_2D; uint8_t mLevelCount = 1; uint8_t mSampleCount = 1; + std::array mSwizzle = { + Swizzle::CHANNEL_0, Swizzle::CHANNEL_1, + Swizzle::CHANNEL_2, Swizzle::CHANNEL_3 }; + bool mTextureIsSwizzled; + Usage mUsage = Usage::DEFAULT; -}; + // TODO: remove in a future filament release. + // Indicates whether the user has set the TextureUsage::BLIT_SRC usage. This will be used to + // temporarily validate whether this texture can be used for readPixels. + bool mHasBlitSrc = false; + bool mExternal = false; + // there is 4 bytes of padding here + + FStream* mStream = nullptr; // only needed for streaming textures +}; FILAMENT_DOWNCAST(Texture) diff --git a/filament/src/details/VertexBuffer.cpp b/filament/src/details/VertexBuffer.cpp index 430fefa341e..881ff2abce7 100644 --- a/filament/src/details/VertexBuffer.cpp +++ b/filament/src/details/VertexBuffer.cpp @@ -21,53 +21,79 @@ #include "FilamentAPI-impl.h" -#include - +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include + +#include +#include + namespace filament { using namespace backend; using namespace filament::math; struct VertexBuffer::BuilderDetails { - FVertexBuffer::AttributeData mAttributes[MAX_VERTEX_ATTRIBUTE_COUNT]; + struct AttributeData : Attribute { + AttributeData() : Attribute{ .type = ElementType::FLOAT4 } { + static_assert(sizeof(Attribute) == sizeof(AttributeData), + "Attribute and Builder::Attribute must match"); + } + }; + std::array mAttributes{}; AttributeBitset mDeclaredAttributes; uint32_t mVertexCount = 0; uint8_t mBufferCount = 0; bool mBufferObjectsEnabled = false; + bool mAdvancedSkinningEnabled = false; // TODO: use bits to save memory }; using BuilderType = VertexBuffer; BuilderType::Builder::Builder() noexcept = default; BuilderType::Builder::~Builder() noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder::Builder(BuilderType::Builder&& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder const& rhs) noexcept = default; -BuilderType::Builder& BuilderType::Builder::operator=(BuilderType::Builder&& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder const& rhs) noexcept = default; +BuilderType::Builder::Builder(Builder&& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder const& rhs) noexcept = default; +BuilderType::Builder& BuilderType::Builder::operator=(Builder&& rhs) noexcept = default; -VertexBuffer::Builder& VertexBuffer::Builder::vertexCount(uint32_t vertexCount) noexcept { +VertexBuffer::Builder& VertexBuffer::Builder::vertexCount(uint32_t const vertexCount) noexcept { mImpl->mVertexCount = vertexCount; return *this; } -VertexBuffer::Builder& VertexBuffer::Builder::enableBufferObjects(bool enabled) noexcept { +VertexBuffer::Builder& VertexBuffer::Builder::enableBufferObjects(bool const enabled) noexcept { mImpl->mBufferObjectsEnabled = enabled; return *this; } -VertexBuffer::Builder& VertexBuffer::Builder::bufferCount(uint8_t bufferCount) noexcept { +VertexBuffer::Builder& VertexBuffer::Builder::bufferCount(uint8_t const bufferCount) noexcept { mImpl->mBufferCount = bufferCount; return *this; } -VertexBuffer::Builder& VertexBuffer::Builder::attribute(VertexAttribute attribute, - uint8_t bufferIndex, - AttributeType attributeType, - uint32_t byteOffset, +VertexBuffer::Builder& VertexBuffer::Builder::attribute(VertexAttribute const attribute, + uint8_t const bufferIndex, + AttributeType const attributeType, + uint32_t const byteOffset, uint8_t byteStride) noexcept { - size_t attributeSize = Driver::getElementTypeSize(attributeType); + size_t const attributeSize = Driver::getElementTypeSize(attributeType); if (byteStride == 0) { byteStride = (uint8_t)attributeSize; } @@ -86,11 +112,16 @@ VertexBuffer::Builder& VertexBuffer::Builder::attribute(VertexAttribute attribut } #endif - FVertexBuffer::AttributeData& entry = mImpl->mAttributes[attribute]; + auto& entry = mImpl->mAttributes[attribute]; entry.buffer = bufferIndex; entry.offset = byteOffset; entry.stride = byteStride; entry.type = attributeType; + if (attribute == BONE_INDICES) { + // BONE_INDICES must always be an integer type + entry.flags |= Attribute::FLAG_INTEGER_TARGET; + } + mImpl->mDeclaredAttributes.set(attribute); } else { utils::slog.w << "Ignoring VertexBuffer attribute, the limit of " << @@ -99,10 +130,10 @@ VertexBuffer::Builder& VertexBuffer::Builder::attribute(VertexAttribute attribut return *this; } -VertexBuffer::Builder& VertexBuffer::Builder::normalized(VertexAttribute attribute, - bool normalized) noexcept { +VertexBuffer::Builder& VertexBuffer::Builder::normalized(VertexAttribute const attribute, + bool const normalized) noexcept { if (size_t(attribute) < MAX_VERTEX_ATTRIBUTE_COUNT) { - FVertexBuffer::AttributeData& entry = mImpl->mAttributes[attribute]; + auto& entry = mImpl->mAttributes[attribute]; if (normalized) { entry.flags |= Attribute::FLAG_NORMALIZED; } else { @@ -112,88 +143,182 @@ VertexBuffer::Builder& VertexBuffer::Builder::normalized(VertexAttribute attribu return *this; } +VertexBuffer::Builder& VertexBuffer::Builder::advancedSkinning(bool const enabled) noexcept { + mImpl->mAdvancedSkinningEnabled = enabled; + return *this; +} + +VertexBuffer::Builder& VertexBuffer::Builder::name(const char* name, size_t const len) noexcept { + return BuilderNameMixin::name(name, len); +} + VertexBuffer* VertexBuffer::Builder::build(Engine& engine) { - ASSERT_PRECONDITION(mImpl->mVertexCount > 0, "vertexCount cannot be 0"); - ASSERT_PRECONDITION(mImpl->mBufferCount > 0, "bufferCount cannot be 0"); - ASSERT_PRECONDITION(mImpl->mBufferCount <= MAX_VERTEX_BUFFER_COUNT, - "bufferCount cannot be more than %d", MAX_VERTEX_BUFFER_COUNT); + FILAMENT_CHECK_PRECONDITION(mImpl->mVertexCount > 0) << "vertexCount cannot be 0"; + FILAMENT_CHECK_PRECONDITION(mImpl->mBufferCount > 0) << "bufferCount cannot be 0"; + FILAMENT_CHECK_PRECONDITION(mImpl->mBufferCount <= MAX_VERTEX_BUFFER_COUNT) + << "bufferCount cannot be more than " << MAX_VERTEX_BUFFER_COUNT; // Next we check if any unused buffer slots have been allocated. This helps prevent errors // because uploading to an unused slot can trigger undefined behavior in the backend. auto const& declaredAttributes = mImpl->mDeclaredAttributes; auto const& attributes = mImpl->mAttributes; utils::bitset32 attributedBuffers; - for (size_t j = 0; j < MAX_VERTEX_ATTRIBUTE_COUNT; ++j) { - if (declaredAttributes[j]) { - attributedBuffers.set(attributes[j].buffer); + + declaredAttributes.forEachSetBit([&](size_t const j){ + // update set of used buffers + attributedBuffers.set(attributes[j].buffer); + + if (engine.getActiveFeatureLevel() == FeatureLevel::FEATURE_LEVEL_0) { + FILAMENT_CHECK_PRECONDITION(!(attributes[j].flags & Attribute::FLAG_INTEGER_TARGET)) + << "Attribute::FLAG_INTEGER_TARGET not supported at FEATURE_LEVEL_0"; } - } - ASSERT_PRECONDITION(attributedBuffers.count() == mImpl->mBufferCount, - "At least one buffer slot was never assigned to an attribute."); + // also checks that we don't use an invalid type with integer attributes + if (attributes[j].flags & Attribute::FLAG_INTEGER_TARGET) { + using ET = ElementType; + constexpr uint32_t const invalidIntegerTypes = + (1 << (int)ET::FLOAT) | + (1 << (int)ET::FLOAT2) | + (1 << (int)ET::FLOAT3) | + (1 << (int)ET::FLOAT4) | + (1 << (int)ET::HALF) | + (1 << (int)ET::HALF2) | + (1 << (int)ET::HALF3) | + (1 << (int)ET::HALF4); + FILAMENT_CHECK_PRECONDITION(!(invalidIntegerTypes & (1 << (int)attributes[j].type))) + << "invalid integer vertex attribute type " << int(attributes[j].type); + } + }); + + FILAMENT_CHECK_PRECONDITION(attributedBuffers.count() == mImpl->mBufferCount) + << "At least one buffer slot was never assigned to an attribute."; + + if (mImpl->mAdvancedSkinningEnabled) { + FILAMENT_CHECK_PRECONDITION(!mImpl->mDeclaredAttributes[VertexAttribute::BONE_INDICES]) + << "Vertex buffer attribute BONE_INDICES is already defined, " + "no advanced skinning is allowed"; + FILAMENT_CHECK_PRECONDITION(!mImpl->mDeclaredAttributes[VertexAttribute::BONE_WEIGHTS]) + << "Vertex buffer attribute BONE_WEIGHTS is already defined, " + "no advanced skinning is allowed"; + FILAMENT_CHECK_PRECONDITION(mImpl->mBufferCount < (MAX_VERTEX_BUFFER_COUNT - 2)) + << "Vertex buffer uses to many buffers (" << mImpl->mBufferCount << ")"; + } return downcast(engine).createVertexBuffer(*this); } // ------------------------------------------------------------------------------------------------ -FVertexBuffer::FVertexBuffer(FEngine& engine, const VertexBuffer::Builder& builder) +FVertexBuffer::FVertexBuffer(FEngine& engine, const Builder& builder) : mVertexCount(builder->mVertexCount), mBufferCount(builder->mBufferCount), - mBufferObjectsEnabled(builder->mBufferObjectsEnabled) { + mBufferObjectsEnabled(builder->mBufferObjectsEnabled), + mAdvancedSkinningEnabled(builder->mAdvancedSkinningEnabled){ std::copy(std::begin(builder->mAttributes), std::end(builder->mAttributes), mAttributes.begin()); - mDeclaredAttributes = builder->mDeclaredAttributes; - uint8_t attributeCount = (uint8_t) mDeclaredAttributes.count(); - AttributeArray attributeArray; + if (mAdvancedSkinningEnabled) { + mAttributes[BONE_INDICES] = { + .offset = 0, + .stride = 8, + .buffer = mBufferCount, + .type = AttributeType::USHORT4, + .flags = Attribute::FLAG_INTEGER_TARGET, + }; + mDeclaredAttributes.set(BONE_INDICES); + mBufferCount++; + + mAttributes[BONE_WEIGHTS] = { + .offset = 0, + .stride = 16, + .buffer = mBufferCount, + .type = AttributeType::FLOAT4, + .flags = 0, + }; + mDeclaredAttributes.set(BONE_WEIGHTS); + mBufferCount++; + } else { + // Because the Material's SKN variant supports both skinning and morphing, it expects + // all attributes related to *both* to be present. In turn, this means that a VertexBuffer + // used for skinning and/or morphing, needs to provide all related attributes. + // Currently, the backend must handle disabled arrays in the VertexBuffer that are declared + // in the shader. In GL this happens automatically, in vulkan/metal, the backends have to + // use dummy buffers. + // - A complication is that backends need to know if an attribute is declared as float or + // integer in the shader, regardless of if the attribute is enabled or not in the + // VertexBuffer (e.g. the morphing attributes could be disabled because we're only using + // skinning). + // - Another complication is that the SKN variant is selected by the renderable + // (as opposed to the RenderPrimitive), so it's possible and valid for a primitive + // that isn't skinned nor morphed to be rendered with the SKN variant (morphing/skinning + // will then be disabled dynamically). + // + // Because of that we need to set FLAG_INTEGER_TARGET on all attributes that we know are + // integer in the shader and the bottom line is that BONE_INDICES always needs to be set to + // FLAG_INTEGER_TARGET. + mAttributes[BONE_INDICES].flags |= Attribute::FLAG_INTEGER_TARGET; + } - static_assert(attributeArray.size() == MAX_VERTEX_ATTRIBUTE_COUNT, - "Attribute and Builder::Attribute arrays must match"); + FEngine::DriverApi& driver = engine.getDriverApi(); - static_assert(sizeof(Attribute) == sizeof(AttributeData), - "Attribute and Builder::Attribute must match"); + mVertexBufferInfoHandle = engine.getVertexBufferInfoFactory().create(driver, + mBufferCount, mDeclaredAttributes.count(), mAttributes); - size_t bufferSizes[MAX_VERTEX_BUFFER_COUNT] = {}; + mHandle = driver.createVertexBuffer(mVertexCount, mVertexBufferInfoHandle); + if (auto name = builder.getName(); !name.empty()) { + driver.setDebugTag(mHandle.getId(), name); + } - auto const& declaredAttributes = mDeclaredAttributes; - auto const& attributes = mAttributes; + // calculate buffer sizes + size_t bufferSizes[MAX_VERTEX_BUFFER_COUNT] = {}; #pragma nounroll - for (size_t i = 0, n = attributeArray.size(); i < n; ++i) { - if (declaredAttributes[i]) { - const uint32_t offset = attributes[i].offset; - const uint8_t stride = attributes[i].stride; - const uint8_t slot = attributes[i].buffer; - - attributeArray[i].offset = offset; - attributeArray[i].stride = stride; - attributeArray[i].buffer = slot; - attributeArray[i].type = attributes[i].type; - attributeArray[i].flags = attributes[i].flags; - + for (size_t i = 0, n = mAttributes.size(); i < n; ++i) { + if (mDeclaredAttributes[i]) { + const uint32_t offset = mAttributes[i].offset; + const uint8_t stride = mAttributes[i].stride; + const uint8_t slot = mAttributes[i].buffer; const size_t end = offset + mVertexCount * stride; - bufferSizes[slot] = math::max(bufferSizes[slot], end); + if (slot != Attribute::BUFFER_UNUSED) { + assert_invariant(slot < MAX_VERTEX_BUFFER_COUNT); + bufferSizes[slot] = std::max(bufferSizes[slot], end); + } } } - // Backends do not (and should not) know the semantics of each vertex attribute, but they - // need to know whether the vertex shader consumes them as integers or as floats. - // NOTE: This flag needs to be set regardless of whether the attribute is actually declared. - attributeArray[BONE_INDICES].flags |= Attribute::FLAG_INTEGER_TARGET; - - FEngine::DriverApi& driver = engine.getDriverApi(); - - mHandle = driver.createVertexBuffer( - mBufferCount, attributeCount, mVertexCount, attributeArray); - - // If buffer objects are not enabled at the API level, then we create them internally. if (!mBufferObjectsEnabled) { + // If buffer objects are not enabled at the API level, then we create them internally. #pragma nounroll - for (size_t i = 0; i < MAX_VERTEX_BUFFER_COUNT; ++i) { - if (bufferSizes[i] > 0) { - BufferObjectHandle bo = driver.createBufferObject(bufferSizes[i], - backend::BufferObjectBinding::VERTEX, backend::BufferUsage::STATIC); - driver.setVertexBufferObject(mHandle, i, bo); - mBufferObjects[i] = bo; + for (size_t index = 0; index < MAX_VERTEX_BUFFER_COUNT; ++index) { + size_t const i = mAttributes[index].buffer; + if (i != Attribute::BUFFER_UNUSED) { + assert_invariant(bufferSizes[i] > 0); + if (!mBufferObjects[i]) { + BufferObjectHandle bo = driver.createBufferObject(bufferSizes[i], + BufferObjectBinding::VERTEX, BufferUsage::STATIC); + if (auto name = builder.getName(); !name.empty()) { + driver.setDebugTag(bo.getId(), name); + } + driver.setVertexBufferObject(mHandle, i, bo); + mBufferObjects[i] = bo; + } + } + } + } else { + // in advanced skinning mode, we manage the BONE_INDICES and BONE_WEIGHTS arrays ourselves, + // so we have to set the corresponding buffer objects. + if (mAdvancedSkinningEnabled) { + for (auto index : { BONE_INDICES, BONE_WEIGHTS }) { + size_t const i = mAttributes[index].buffer; + assert_invariant(i != Attribute::BUFFER_UNUSED); + assert_invariant(bufferSizes[i] > 0); + if (!mBufferObjects[i]) { + BufferObjectHandle const bo = driver.createBufferObject(bufferSizes[i], + BufferObjectBinding::VERTEX, BufferUsage::STATIC); + if (auto name = builder.getName(); !name.empty()) { + driver.setDebugTag(bo.getId(), name); + } + driver.setVertexBufferObject(mHandle, i, bo); + mBufferObjects[i] = bo; + } } } } @@ -207,35 +332,60 @@ void FVertexBuffer::terminate(FEngine& engine) { } } driver.destroyVertexBuffer(mHandle); + engine.getVertexBufferInfoFactory().destroy(driver, mVertexBufferInfoHandle); } size_t FVertexBuffer::getVertexCount() const noexcept { return mVertexCount; } -void FVertexBuffer::setBufferAt(FEngine& engine, uint8_t bufferIndex, - backend::BufferDescriptor&& buffer, uint32_t byteOffset) { - ASSERT_PRECONDITION(!mBufferObjectsEnabled, "Please use setBufferObjectAt()"); +void FVertexBuffer::setBufferAt(FEngine& engine, uint8_t const bufferIndex, + backend::BufferDescriptor&& buffer, uint32_t const byteOffset) { + FILAMENT_CHECK_PRECONDITION(!mBufferObjectsEnabled) << "Please use setBufferObjectAt()"; if (bufferIndex < mBufferCount) { assert_invariant(mBufferObjects[bufferIndex]); engine.getDriverApi().updateBufferObject(mBufferObjects[bufferIndex], std::move(buffer), byteOffset); } else { - ASSERT_PRECONDITION(bufferIndex < mBufferCount, "bufferIndex must be < bufferCount"); + FILAMENT_CHECK_PRECONDITION(bufferIndex < mBufferCount) + << "bufferIndex must be < bufferCount"; } } -void FVertexBuffer::setBufferObjectAt(FEngine& engine, uint8_t bufferIndex, +void FVertexBuffer::setBufferObjectAt(FEngine& engine, uint8_t const bufferIndex, FBufferObject const * bufferObject) { - ASSERT_PRECONDITION(mBufferObjectsEnabled, "Please use setBufferAt()"); - ASSERT_PRECONDITION(bufferObject->getBindingType() == BufferObject::BindingType::VERTEX, - "Binding type must be VERTEX."); + FILAMENT_CHECK_PRECONDITION(mBufferObjectsEnabled) << "Please use setBufferAt()"; + FILAMENT_CHECK_PRECONDITION(bufferObject->getBindingType() == BufferObject::BindingType::VERTEX) + << "Binding type must be VERTEX."; if (bufferIndex < mBufferCount) { auto hwBufferObject = bufferObject->getHwHandle(); engine.getDriverApi().setVertexBufferObject(mHandle, bufferIndex, hwBufferObject); + // store handle to recreate VertexBuffer in the case extra bone indices and weights definition + // used only in buffer object mode + mBufferObjects[bufferIndex] = hwBufferObject; } else { - ASSERT_PRECONDITION(bufferIndex < mBufferCount, "bufferIndex must be < bufferCount"); + FILAMENT_CHECK_PRECONDITION(bufferIndex < mBufferCount) + << "bufferIndex must be < bufferCount"; } } +void FVertexBuffer::updateBoneIndicesAndWeights(FEngine& engine, + std::unique_ptr skinJoints, + std::unique_ptr skinWeights) { + FILAMENT_CHECK_PRECONDITION(mAdvancedSkinningEnabled) << "No advanced skinning enabled"; + auto jointsData = skinJoints.release(); + uint8_t const indicesIndex = mAttributes[BONE_INDICES].buffer; + engine.getDriverApi().updateBufferObject(mBufferObjects[indicesIndex], + {jointsData, mVertexCount * 8, + [](void* buffer, size_t, void*) { delete[] static_cast(buffer); }}, + 0); + + auto weightsData = skinWeights.release(); + uint8_t const weightsIndex = mAttributes[BONE_WEIGHTS].buffer; + engine.getDriverApi().updateBufferObject(mBufferObjects[weightsIndex], + {weightsData, mVertexCount * 16, + [](void* buffer, size_t, void*) { delete[] static_cast(buffer); }}, + 0); +} + } // namespace filament diff --git a/filament/src/details/VertexBuffer.h b/filament/src/details/VertexBuffer.h index d8455bfe4d2..759c7fe0198 100644 --- a/filament/src/details/VertexBuffer.h +++ b/filament/src/details/VertexBuffer.h @@ -27,7 +27,10 @@ #include #include +#include + #include +#include #include namespace filament { @@ -37,16 +40,20 @@ class FEngine; class FVertexBuffer : public VertexBuffer { public: + using VertexBufferInfoHandle = backend::VertexBufferInfoHandle; using VertexBufferHandle = backend::VertexBufferHandle; using BufferObjectHandle = backend::BufferObjectHandle; FVertexBuffer(FEngine& engine, const Builder& builder); + FVertexBuffer(FEngine& engine, FVertexBuffer* buffer); // frees driver resources, object becomes invalid void terminate(FEngine& engine); VertexBufferHandle getHwHandle() const noexcept { return mHandle; } + VertexBufferInfoHandle getVertexBufferInfoHandle() const { return mVertexBufferInfoHandle; } + size_t getVertexCount() const noexcept; AttributeBitset getDeclaredAttributes() const noexcept { @@ -60,20 +67,20 @@ class FVertexBuffer : public VertexBuffer { void setBufferObjectAt(FEngine& engine, uint8_t bufferIndex, FBufferObject const * bufferObject); + void updateBoneIndicesAndWeights(FEngine& engine, std::unique_ptr skinJoints, + std::unique_ptr skinWeights); + private: friend class VertexBuffer; - - struct AttributeData : backend::Attribute { - AttributeData() : backend::Attribute{ .type = backend::ElementType::FLOAT4 } {} - }; - + VertexBufferInfoHandle mVertexBufferInfoHandle; VertexBufferHandle mHandle; - std::array mAttributes; + backend::AttributeArray mAttributes; std::array mBufferObjects; AttributeBitset mDeclaredAttributes; uint32_t mVertexCount = 0; uint8_t mBufferCount = 0; bool mBufferObjectsEnabled = false; + bool mAdvancedSkinningEnabled = false; }; FILAMENT_DOWNCAST(VertexBuffer) diff --git a/filament/src/details/View.cpp b/filament/src/details/View.cpp index eabc9b381a8..3022f4be596 100644 --- a/filament/src/details/View.cpp +++ b/filament/src/details/View.cpp @@ -17,9 +17,11 @@ #include "details/View.h" #include "Culler.h" +#include "FrameHistory.h" #include "Froxelizer.h" #include "RenderPrimitive.h" #include "ResourceAllocator.h" +#include "ShadowMapManager.h" #include "details/Engine.h" #include "details/IndirectLight.h" @@ -29,22 +31,26 @@ #include "details/Skybox.h" #include +#include #include #include -#include #include +#include +#include +#include #include #include #include -#include #include #include #include +#include #include +#include using namespace utils; @@ -57,9 +63,13 @@ static constexpr float PID_CONTROLLER_Ki = 0.002f; static constexpr float PID_CONTROLLER_Kd = 0.0f; FView::FView(FEngine& engine) - : mFroxelizer(engine), - mPerViewUniforms(engine), - mShadowMapManager(engine) { + : mCommonRenderableDescriptorSet(engine.getPerRenderableDescriptorSetLayout()), + mFroxelizer(engine), + mFogEntity(engine.getEntityManager().create()), + mIsStereoSupported(engine.getDriverApi().isStereoSupported()), + mUniforms(engine.getDriverApi()), + mColorPassDescriptorSet(engine, mUniforms) { + DriverApi& driver = engine.getDriverApi(); FDebugRegistry& debugRegistry = engine.getDebugRegistry(); @@ -67,33 +77,50 @@ FView::FView(FEngine& engine) debugRegistry.registerProperty("d.view.camera_at_origin", &engine.debug.view.camera_at_origin); - // Integral term is used to fight back the dead-band below, we limit how much it can act. + // The integral term is used to fight back the dead-band below, we limit how much it can act. mPidController.setIntegralLimits(-100.0f, 100.0f); - // dead-band, 1% for scaling down, 5% for scaling up. This stabilizes all the jitters. + // Dead-band, 1% for scaling down, 5% for scaling up. This stabilizes all the jitters. mPidController.setOutputDeadBand(-0.01f, 0.05f); #ifndef NDEBUG - debugRegistry.registerDataSource("d.view.frame_info", - mDebugFrameHistory.data(), mDebugFrameHistory.size()); - debugRegistry.registerProperty("d.view.pid.kp", &engine.debug.view.pid.kp); - debugRegistry.registerProperty("d.view.pid.ki", &engine.debug.view.pid.ki); - debugRegistry.registerProperty("d.view.pid.kd", &engine.debug.view.pid.kd); - // default parameters for debugging UI - engine.debug.view.pid.kp = 1.0f - std::exp(-1.0f / 8.0f); - engine.debug.view.pid.ki = PID_CONTROLLER_Ki; - engine.debug.view.pid.kd = PID_CONTROLLER_Kd; - mPidController.setParallelGains( - engine.debug.view.pid.kp, engine.debug.view.pid.ki, engine.debug.view.pid.kd); + // This can fail if another view has already registered this data source + mDebugState->owner = debugRegistry.registerDataSource("d.view.frame_info", + [weak = std::weak_ptr(mDebugState)]() -> DebugRegistry::DataSource { + // the View could have been destroyed by the time we do this + auto const state = weak.lock(); + if (!state) { + return { nullptr, 0 }; + } + // Lazily allocate the buffer for the debug data source, and mark this + // data source as active. It can never go back to inactive. + assert_invariant(!state->debugFrameHistory); + state->active = true; + state->debugFrameHistory = + std::make_unique>(); + return { state->debugFrameHistory->data(), state->debugFrameHistory->size() }; + }); + + if (UTILS_UNLIKELY(mDebugState->owner)) { + // publish the properties (they will be initialized in the main loop) + debugRegistry.registerProperty("d.view.pid.kp", &engine.debug.view.pid.kp); + debugRegistry.registerProperty("d.view.pid.ki", &engine.debug.view.pid.ki); + debugRegistry.registerProperty("d.view.pid.kd", &engine.debug.view.pid.kd); + } #endif - // allocate ubos + // allocate UBOs mLightUbh = driver.createBufferObject(CONFIG_MAX_LIGHT_COUNT * sizeof(LightsUib), BufferObjectBinding::UNIFORM, BufferUsage::DYNAMIC); mIsDynamicResolutionSupported = driver.isFrameTimeSupported(); mDefaultColorGrading = mColorGrading = engine.getDefaultColorGrading(); + + mColorPassDescriptorSet.init( + mLightUbh, + mFroxelizer.getRecordBuffer(), + mFroxelizer.getFroxelBuffer()); } FView::~FView() noexcept = default; @@ -111,10 +138,21 @@ void FView::terminate(FEngine& engine) { DriverApi& driver = engine.getDriverApi(); driver.destroyBufferObject(mLightUbh); driver.destroyBufferObject(mRenderableUbh); - drainFrameHistory(engine); - mShadowMapManager.terminate(engine); - mPerViewUniforms.terminate(driver); + clearFrameHistory(engine); + + ShadowMapManager::terminate(engine, mShadowMapManager); + mUniforms.terminate(driver); + mColorPassDescriptorSet.terminate(engine.getDescriptorSetLayoutFactory(), driver); mFroxelizer.terminate(driver); + mCommonRenderableDescriptorSet.terminate(driver); + + engine.getEntityManager().destroy(mFogEntity); + +#ifndef NDEBUG + if (UTILS_UNLIKELY(mDebugState->owner)) { + engine.getDebugRegistry().unregisterDataSource("d.view.frame_info"); + } +#endif } void FView::setViewport(filament::Viewport const& viewport) noexcept { @@ -147,15 +185,25 @@ void FView::setDynamicResolutionOptions(DynamicResolutionOptions const& options) } } -void FView::setDynamicLightingOptions(float zLightNear, float zLightFar) noexcept { +void FView::setDynamicLightingOptions(float const zLightNear, float const zLightFar) noexcept { mFroxelizer.setOptions(zLightNear, zLightFar); } float2 FView::updateScale(FEngine& engine, - FrameInfo const& info, + filament::details::FrameInfo const& info, Renderer::FrameRateOptions const& frameRateOptions, Renderer::DisplayInfo const& displayInfo) noexcept { +#ifndef NDEBUG + if (UTILS_LIKELY(!mDebugState->active)) { + // if we're not active, update the debug properties with the normal values + // and use that for configuring the PID controller. + engine.debug.view.pid.kp = 1.0f - std::exp(-frameRateOptions.scaleRate); + engine.debug.view.pid.ki = PID_CONTROLLER_Ki; + engine.debug.view.pid.kd = PID_CONTROLLER_Kd; + } +#endif + DynamicResolutionOptions const& options = mDynamicResolution; if (options.enabled) { if (!UTILS_UNLIKELY(info.valid)) { @@ -180,8 +228,8 @@ float2 FView::updateScale(FEngine& engine, const float dt = 1.0f; // we don't really need dt here, setting it to 1, means our parameters are in "frames" const float target = (1000.0f * float(frameRateOptions.interval)) / displayInfo.refreshRate; const float targetWithHeadroom = target * (1.0f - frameRateOptions.headRoomRatio); - float measured = duration{ info.denoisedFrameTime }.count(); - float out = mPidController.update(measured / targetWithHeadroom, 1.0f, dt); + float const measured = duration{ info.denoisedFrameTime }.count(); + float const out = mPidController.update(measured / targetWithHeadroom, 1.0f, dt); // maps pid command to a scale (absolute or relative, see below) const float command = out < 0.0f ? (1.0f / (1.0f - out)) : (1.0f + out); @@ -239,27 +287,31 @@ float2 FView::updateScale(FEngine& engine, #ifndef NDEBUG // only for debugging... - using duration_ms = std::chrono::duration; - const float target = (1000.0f * float(frameRateOptions.interval)) / displayInfo.refreshRate; - const float targetWithHeadroom = target * (1.0f - frameRateOptions.headRoomRatio); - std::move(mDebugFrameHistory.begin() + 1, - mDebugFrameHistory.end(), mDebugFrameHistory.begin()); - mDebugFrameHistory.back() = { - .target = target, - .targetWithHeadroom = targetWithHeadroom, - .frameTime = std::chrono::duration_cast(info.frameTime).count(), - .frameTimeDenoised = std::chrono::duration_cast(info.denoisedFrameTime).count(), - .scale = mScale.x * mScale.y, - .pid_e = mPidController.getError(), - .pid_i = mPidController.getIntegral(), - .pid_d = mPidController.getDerivative() - }; + if (UTILS_UNLIKELY(mDebugState->active && mDebugState->debugFrameHistory)) { + auto* const debugFrameHistory = mDebugState->debugFrameHistory.get(); + using namespace std::chrono; + using duration_ms = duration; + const float target = (1000.0f * float(frameRateOptions.interval)) / displayInfo.refreshRate; + const float targetWithHeadroom = target * (1.0f - frameRateOptions.headRoomRatio); + std::move(debugFrameHistory->begin() + 1, + debugFrameHistory->end(), debugFrameHistory->begin()); + debugFrameHistory->back() = { + .target = target, + .targetWithHeadroom = targetWithHeadroom, + .frameTime = duration_cast(info.frameTime).count(), + .frameTimeDenoised = duration_cast(info.denoisedFrameTime).count(), + .scale = mScale.x * mScale.y, + .pid_e = mPidController.getError(), + .pid_i = mPidController.getIntegral(), + .pid_d = mPidController.getDerivative() + }; + } #endif return mScale; } -void FView::setVisibleLayers(uint8_t select, uint8_t values) noexcept { +void FView::setVisibleLayers(uint8_t const select, uint8_t const values) noexcept { mVisibleLayers = (mVisibleLayers & ~select) | (values & select); } @@ -268,9 +320,8 @@ bool FView::isSkyboxVisible() const noexcept { return skybox != nullptr && (skybox->getLayerMask() & mVisibleLayers); } -void FView::prepareShadowing(FEngine& engine, DriverApi& driver, - FScene::RenderableSoa& renderableData, FScene::LightSoa& lightData, - CameraInfo const& cameraInfo) noexcept { +void FView::prepareShadowing(FEngine& engine, FScene::RenderableSoa& renderableData, + FScene::LightSoa const& lightData, CameraInfo const& cameraInfo) noexcept { SYSTRACE_CALL(); mHasShadowing = false; @@ -279,18 +330,18 @@ void FView::prepareShadowing(FEngine& engine, DriverApi& driver, return; } - mShadowMapManager.reset(); - auto& lcm = engine.getLightManager(); + ShadowMapManager::Builder builder; + // dominant directional light is always as index 0 - FLightManager::Instance directionalLight = lightData.elementAt(0); + FLightManager::Instance const directionalLight = lightData.elementAt(0); const bool hasDirectionalShadows = directionalLight && lcm.isShadowCaster(directionalLight); if (UTILS_UNLIKELY(hasDirectionalShadows)) { const auto& shadowOptions = lcm.getShadowOptions(directionalLight); assert_invariant(shadowOptions.shadowCascades >= 1 && shadowOptions.shadowCascades <= CONFIG_MAX_SHADOW_CASCADES); - mShadowMapManager.setDirectionalShadowMap(0, &shadowOptions); + builder.directionalShadowMap(0, &shadowOptions); } // Find all shadow-casting spotlights. @@ -304,40 +355,49 @@ void FView::prepareShadowing(FEngine& engine, DriverApi& driver, // when we get here all the lights should be visible assert_invariant(lightData.elementAt(l)); - FLightManager::Instance li = lightData.elementAt(l); + FLightManager::Instance const li = lightData.elementAt(l); if (UTILS_LIKELY(!li)) { continue; // invalid instance } if (UTILS_LIKELY(!lcm.isShadowCaster(li))) { + // Because we early exit here, we need to make sure we mark the light as non-casting. + // See `ShadowMapManager::updateSpotShadowMaps` for const_cast<> justification. + auto& shadowInfo = const_cast( + lightData.elementAt(l)); + shadowInfo.castsShadows = false; continue; // doesn't cast shadows } const bool spotLight = lcm.isSpotLight(li); + const size_t maxShadowMapCount = engine.getMaxShadowMapCount(); const size_t shadowMapCountNeeded = spotLight ? 1 : 6; - if (shadowMapCount + shadowMapCountNeeded <= CONFIG_MAX_SHADOWMAPS) { + if (shadowMapCount + shadowMapCountNeeded <= maxShadowMapCount) { shadowMapCount += shadowMapCountNeeded; const auto& shadowOptions = lcm.getShadowOptions(li); - mShadowMapManager.addShadowMap(l, spotLight, &shadowOptions); + builder.shadowMap(l, spotLight, &shadowOptions); } - if (shadowMapCount >= CONFIG_MAX_SHADOWMAPS) { + if (shadowMapCount >= maxShadowMapCount) { break; // we ran out of spotlight shadow casting } } - auto shadowTechnique = mShadowMapManager.update(engine, *this, cameraInfo, - renderableData, lightData); + if (builder.hasShadowMaps()) { + ShadowMapManager::createIfNeeded(engine, mShadowMapManager); + auto shadowTechnique = mShadowMapManager->update(builder, engine, *this, + cameraInfo, renderableData, lightData); - mHasShadowing = any(shadowTechnique); - mNeedsShadowMap = any(shadowTechnique & ShadowMapManager::ShadowTechnique::SHADOW_MAP); + mHasShadowing = any(shadowTechnique); + mNeedsShadowMap = any(shadowTechnique & ShadowMapManager::ShadowTechnique::SHADOW_MAP); + } } -void FView::prepareLighting(FEngine& engine, FEngine::DriverApi& driver, ArenaScope& arena, - filament::Viewport const& viewport, CameraInfo const& cameraInfo) noexcept { +void FView::prepareLighting(FEngine& engine, CameraInfo const& cameraInfo) noexcept { SYSTRACE_CALL(); + SYSTRACE_CONTEXT(); FScene* const scene = mScene; auto const& lightData = scene->getLightData(); @@ -346,15 +406,8 @@ void FView::prepareLighting(FEngine& engine, FEngine::DriverApi& driver, ArenaSc * Dynamic lights */ - mHasDynamicLighting = scene->getLightData().size() > FScene::DIRECTIONAL_LIGHTS_COUNT; - if (mHasDynamicLighting) { - scene->prepareDynamicLights(cameraInfo, arena, mLightUbh); - Froxelizer& froxelizer = mFroxelizer; - if (froxelizer.prepare(driver, arena, viewport, - cameraInfo.projection, cameraInfo.zn, cameraInfo.zf)) { - // update our uniform buffer if needed - mPerViewUniforms.prepareDynamicLights(mFroxelizer); - } + if (hasDynamicLighting()) { + scene->prepareDynamicLights(cameraInfo, mLightUbh); } // here the array of visible lights has been shrunk to CONFIG_MAX_LIGHT_COUNT @@ -365,8 +418,7 @@ void FView::prepareLighting(FEngine& engine, FEngine::DriverApi& driver, ArenaSc */ const float exposure = Exposure::exposure(cameraInfo.ev100); - - mPerViewUniforms.prepareExposure(cameraInfo.ev100); + mColorPassDescriptorSet.prepareExposure(cameraInfo.ev100); /* * Indirect light (IBL) @@ -383,17 +435,15 @@ void FView::prepareLighting(FEngine& engine, FEngine::DriverApi& driver, ArenaSc FSkybox const* const skybox = scene->getSkybox(); intensity = skybox ? skybox->getIntensity() : FIndirectLight::DEFAULT_INTENSITY; } - - mPerViewUniforms.prepareAmbientLight(engine, *ibl, intensity, exposure); + mColorPassDescriptorSet.prepareAmbientLight(engine, *ibl, intensity, exposure); /* * Directional light (always at index 0) */ - FLightManager::Instance directionalLight = lightData.elementAt(0); + FLightManager::Instance const directionalLight = lightData.elementAt(0); const float3 sceneSpaceDirection = lightData.elementAt(0); // guaranteed normalized - mPerViewUniforms.prepareDirectionalLight(engine, exposure, sceneSpaceDirection, directionalLight); - mHasDirectionalLight = directionalLight.isValid(); + mColorPassDescriptorSet.prepareDirectionalLight(engine, exposure, sceneSpaceDirection, directionalLight); } CameraInfo FView::computeCameraInfo(FEngine& engine) const noexcept { @@ -401,37 +451,41 @@ CameraInfo FView::computeCameraInfo(FEngine& engine) const noexcept { /* * We apply a "world origin" to "everything" in order to implement the IBL rotation. - * The "world origin" could also be useful for other things, like keeping the origin - * close to the camera position to improve fp precision in the shader for large scenes. + * The "world origin" is also used to keep the origin close to the camera position to + * improve fp precision in the shader for large scenes. */ - mat4 worldOriginScene; - FIndirectLight const* const ibl = scene->getIndirectLight(); - if (ibl) { - // the IBL transformation must be a rigid transform - mat3f rotation{ scene->getIndirectLight()->getRotation() }; - // for a rigid-body transform, the inverse is the transpose - worldOriginScene = mat4{ transpose(rotation) }; - } + double3 translation; + mat3 rotation; /* * Calculate all camera parameters needed to render this View for this frame. */ FCamera const* const camera = mViewingCamera ? mViewingCamera : mCullingCamera; - if (engine.debug.view.camera_at_origin) { // this moves the camera to the origin, effectively doing all shader computations in // view-space, which improves floating point precision in the shader by staying around // zero, where fp precision is highest. This also ensures that when the camera is placed // very far from the origin, objects are still rendered and lit properly. - worldOriginScene[3].xyz -= camera->getPosition(); + translation = -camera->getPosition(); } - return { *camera, worldOriginScene }; + FIndirectLight const* const ibl = scene->getIndirectLight(); + if (ibl) { + // the IBL transformation must be a rigid transform + rotation = mat3{ transpose(scene->getIndirectLight()->getRotation()) }; + // it is important to orthogonalize the matrix when converting it to doubles, because + // as float, it only has about a 1e-8 precision on the size of the basis vectors + rotation = orthogonalize(rotation); + } + return { *camera, mat4{ rotation } * mat4::translation(translation) }; } -void FView::prepare(FEngine& engine, DriverApi& driver, ArenaScope& arena, - filament::Viewport const& viewport, CameraInfo const& cameraInfo, - float4 const& userTime, bool needsAlphaChannel) noexcept { +void FView::prepare(FEngine& engine, DriverApi& driver, RootArenaScope& rootArenaScope, + filament::Viewport const viewport, CameraInfo cameraInfo, + float4 const& userTime, bool const needsAlphaChannel) noexcept { + + SYSTRACE_CALL(); + SYSTRACE_CONTEXT(); JobSystem& js = engine.getJobSystem(); @@ -444,14 +498,14 @@ void FView::prepare(FEngine& engine, DriverApi& driver, ArenaScope& arena, if (UTILS_LIKELY(mViewingCamera == nullptr)) { // In the common case when we don't have a viewing camera, cameraInfo.view is // already the culling view matrix - return Frustum{ mat4f{ highPrecisionMultiply(cameraInfo.projection, cameraInfo.view) }}; + return Frustum{ mat4f{ highPrecisionMultiply(cameraInfo.cullingProjection, cameraInfo.view) }}; } else { // Otherwise, we need to recalculate it from the culling camera. // Note: it is correct to always do the math from mCullingCamera, but it hides the // intent of the code, which is that we should only depend on CameraInfo here. // This is an extremely uncommon case. const mat4 projection = mCullingCamera->getCullingProjectionMatrix(); - const mat4 view = inverse(cameraInfo.worldOrigin * mCullingCamera->getModelMatrix()); + const mat4 view = inverse(cameraInfo.worldTransform * mCullingCamera->getModelMatrix()); return Frustum{ mat4f{ projection * view }}; } }; @@ -464,21 +518,39 @@ void FView::prepare(FEngine& engine, DriverApi& driver, ArenaScope& arena, * Gather all information needed to render this scene. Apply the world origin to all * objects in the scene. */ - scene->prepare(cameraInfo.worldOrigin, hasVSM()); + scene->prepare(js, rootArenaScope, + cameraInfo.worldTransform, + hasVSM()); /* * Light culling: runs in parallel with Renderable culling (below) */ + JobSystem::Job* froxelizeLightsJob = nullptr; JobSystem::Job* prepareVisibleLightsJob = nullptr; - if (scene->getLightData().size() > FScene::DIRECTIONAL_LIGHTS_COUNT) { + size_t const lightCount = scene->getLightData().size(); + if (lightCount > FScene::DIRECTIONAL_LIGHTS_COUNT) { + // create and start the prepareVisibleLights job + // note: this job updates LightData (non const) + // allocate a scratch buffer for distances outside the job below, so we don't need + // to use a locked allocator; the downside is that we need to account for the worst case. + size_t const positionalLightCount = lightCount - FScene::DIRECTIONAL_LIGHTS_COUNT; + float* const distances = rootArenaScope.allocate( + (positionalLightCount + 3u) & ~3u, CACHELINE_SIZE); + prepareVisibleLightsJob = js.runAndRetain(js.createJob(nullptr, - [&cullingFrustum, &engine, &arena, &cameraInfo, scene](JobSystem&, JobSystem::Job*) { - FView::prepareVisibleLights(engine.getLightManager(), arena, - cameraInfo.view, cullingFrustum, scene->getLightData()); + [&engine, distances, positionalLightCount, &viewMatrix = cameraInfo.view, &cullingFrustum, + &lightData = scene->getLightData()] + (JobSystem&, JobSystem::Job*) { + prepareVisibleLights(engine.getLightManager(), + { distances, distances + positionalLightCount }, + viewMatrix, cullingFrustum, lightData); })); } + // this is used later (in Renderer.cpp) to wait for froxelization to finishes + setFroxelizerSync(froxelizeLightsJob); + Range merged; FScene::RenderableSoa& renderableData = scene->getRenderableData(); @@ -504,7 +576,40 @@ void FView::prepare(FEngine& engine, DriverApi& driver, ArenaScope& arena, if (prepareVisibleLightsJob) { js.waitAndRelease(prepareVisibleLightsJob); } - prepareShadowing(engine, driver, renderableData, scene->getLightData(), cameraInfo); + + // lightData is const from this point on (can only happen after prepareVisibleLightsJob) + auto const& lightData = scene->getLightData(); + + // now we know if we have dynamic lighting (i.e.: dynamic lights are visible) + mHasDynamicLighting = lightData.size() > FScene::DIRECTIONAL_LIGHTS_COUNT; + + // we also know if we have a directional light + FLightManager::Instance const directionalLight = + lightData.elementAt(0); + mHasDirectionalLighting = directionalLight.isValid(); + + // As soon as prepareVisibleLight finishes, we can kick-off the froxelization + if (hasDynamicLighting()) { + auto& froxelizer = mFroxelizer; + if (froxelizer.prepare(driver, rootArenaScope, viewport, + cameraInfo.projection, cameraInfo.zn, cameraInfo.zf)) { + // TODO: might be more consistent to do this in prepareLighting(), but it's not + // strictly necessary + mColorPassDescriptorSet.prepareDynamicLights(mFroxelizer); + } + // We need to pass viewMatrix by value here because it extends the scope of this + // function. + std::function froxelizerWork = + [&froxelizer = mFroxelizer, &engine, viewMatrix = cameraInfo.view, &lightData] + (JobSystem&, JobSystem::Job*) { + froxelizer.froxelizeLights(engine, viewMatrix, lightData); + }; + froxelizeLightsJob = js.runAndRetain(js.createJob(nullptr, std::move(froxelizerWork))); + } + + setFroxelizerSync(froxelizeLightsJob); + + prepareShadowing(engine, renderableData, lightData, cameraInfo); /* * Partition the SoA so that renderables are partitioned w.r.t their visibility into the @@ -528,6 +633,8 @@ void FView::prepare(FEngine& engine, DriverApi& driver, ArenaScope& arena, // TODO: we need to compare performance of doing this partitioning vs not doing it. // and rely on checking visibility in the loops + SYSTRACE_NAME_BEGIN("Partitioning"); + // calculate the sorting key for all elements, based on their visibility uint8_t const* layers = renderableData.data(); auto const* visibility = renderableData.data(); @@ -560,7 +667,7 @@ void FView::prepare(FEngine& engine, DriverApi& driver, ArenaScope& arena, uint32_t(endDirCastersOnly - beginRenderables)}; merged = { 0, uint32_t(endPotentialSpotCastersOnly - beginRenderables) }; - if (!mShadowMapManager.hasSpotShadows()) { + if (!needsShadowMap() || !mShadowMapManager->hasSpotShadows()) { // we know we don't have spot shadows, we can reduce the range to not even include // the potential spot casters merged = { 0, uint32_t(endDirCastersOnly - beginRenderables) }; @@ -568,6 +675,8 @@ void FView::prepare(FEngine& engine, DriverApi& driver, ArenaScope& arena, mSpotLightShadowCasters = merged; + SYSTRACE_NAME_END(); + // TODO: when any spotlight is used, `merged` ends-up being the whole list. However, // some of the items will end-up not being visible by any light. Can we do better? // e.g. could we deffer some of the prepareVisibleRenderables() to later? @@ -581,13 +690,75 @@ void FView::prepare(FEngine& engine, DriverApi& driver, ArenaScope& arena, const size_t count = std::max(size_t(16u), (4u * merged.size() + 2u) / 3u); mRenderableUBOSize = uint32_t(count * sizeof(PerRenderableData)); driver.destroyBufferObject(mRenderableUbh); - mRenderableUbh = driver.createBufferObject(mRenderableUBOSize + sizeof(PerRenderableUib), + mRenderableUbh = driver.createBufferObject( + mRenderableUBOSize + sizeof(PerRenderableUib), BufferObjectBinding::UNIFORM, BufferUsage::DYNAMIC); } else { // TODO: should we shrink the underlying UBO at some point? } assert_invariant(mRenderableUbh); scene->updateUBOs(merged, mRenderableUbh); + + mCommonRenderableDescriptorSet.setBuffer( + +PerRenderableBindingPoints::OBJECT_UNIFORMS, mRenderableUbh, + 0, sizeof(PerRenderableUib)); + + mCommonRenderableDescriptorSet.commit( + engine.getPerRenderableDescriptorSetLayout(), driver); + } + } + + { // this must happen after mRenderableUbh is created/updated + // prepare skinning, morphing and hybrid instancing + auto& sceneData = scene->getRenderableData(); + for (uint32_t const i : merged) { + auto const& skinning = sceneData.elementAt(i); + auto const& morphing = sceneData.elementAt(i); + auto const& instance = sceneData.elementAt(i); + + // FIXME: when only one is active the UBO handle of the other is null + // (probably a problem on vulkan) + if (UTILS_UNLIKELY(skinning.handle || morphing.handle || instance.handle)) { + auto const ci = sceneData.elementAt(i); + FRenderableManager& rcm = engine.getRenderableManager(); + auto& descriptorSet = rcm.getDescriptorSet(ci); + + // initialize the descriptor set the first time it's needed + if (UTILS_UNLIKELY(!descriptorSet.getHandle())) { + descriptorSet = DescriptorSet{ engine.getPerRenderableDescriptorSetLayout() }; + } + + descriptorSet.setBuffer(+PerRenderableBindingPoints::OBJECT_UNIFORMS, + instance.handle ? instance.handle : mRenderableUbh, + 0, sizeof(PerRenderableUib)); + + if (UTILS_UNLIKELY(skinning.handle || morphing.handle)) { + + descriptorSet.setBuffer(+PerRenderableBindingPoints::BONES_UNIFORMS, + skinning.handle, 0, sizeof(PerRenderableBoneUib)); + + descriptorSet.setSampler(+PerRenderableBindingPoints::BONES_INDICES_AND_WEIGHTS, + skinning.boneIndicesAndWeightHandle, {}); + + descriptorSet.setBuffer(+PerRenderableBindingPoints::MORPHING_UNIFORMS, + morphing.handle, 0, sizeof(PerRenderableMorphingUib)); + + descriptorSet.setSampler(+PerRenderableBindingPoints::MORPH_TARGET_POSITIONS, + morphing.morphTargetBuffer->getPositionsHandle(), {}); + + descriptorSet.setSampler(+PerRenderableBindingPoints::MORPH_TARGET_TANGENTS, + morphing.morphTargetBuffer->getTangentsHandle(), {}); + } + + descriptorSet.commit(engine.getPerRenderableDescriptorSetLayout(), driver); + + // write the descriptor-set handle to the sceneData array for access later + sceneData.elementAt(i) = descriptorSet.getHandle(); + } else { + // use the shared descriptor-set + sceneData.elementAt(i) = + mCommonRenderableDescriptorSet.getHandle(); + } } } @@ -597,33 +768,25 @@ void FView::prepare(FEngine& engine, DriverApi& driver, ArenaScope& arena, * Relies on FScene::prepare() and prepareVisibleLights() */ - prepareLighting(engine, driver, arena, viewport, cameraInfo); + prepareLighting(engine, cameraInfo); /* * Update driver state */ - mPerViewUniforms.prepareTime(engine, userTime); - mPerViewUniforms.prepareFog(cameraInfo.getPosition(), mFogOptions); - mPerViewUniforms.prepareTemporalNoise(engine, mTemporalAntiAliasingOptions); - mPerViewUniforms.prepareBlending(needsAlphaChannel); -} - -void FView::bindPerViewUniformsAndSamplers(FEngine::DriverApi& driver) const noexcept { - mPerViewUniforms.bind(driver); + auto const& tcm = engine.getTransformManager(); + auto const fogTransform = tcm.getWorldTransformAccurate(tcm.getInstance(mFogEntity)); - driver.bindUniformBuffer(+UniformBindingPoints::LIGHTS, - mLightUbh); - - driver.bindUniformBuffer(+UniformBindingPoints::SHADOW, - mShadowMapManager.getShadowUniformsHandle()); - - driver.bindUniformBuffer(+UniformBindingPoints::FROXEL_RECORDS, - mFroxelizer.getRecordBuffer()); + mColorPassDescriptorSet.prepareTime(engine, userTime); + mColorPassDescriptorSet.prepareFog(engine, cameraInfo, fogTransform, mFogOptions, + scene->getIndirectLight()); + mColorPassDescriptorSet.prepareTemporalNoise(engine, mTemporalAntiAliasingOptions); + mColorPassDescriptorSet.prepareBlending(needsAlphaChannel); + mColorPassDescriptorSet.prepareMaterialGlobals(mMaterialGlobals); } void FView::computeVisibilityMasks( - uint8_t visibleLayers, + uint8_t const visibleLayers, uint8_t const* UTILS_RESTRICT layers, FRenderableManager::Visibility const* UTILS_RESTRICT visibility, Culler::result_type* UTILS_RESTRICT visibleMask, size_t count) { @@ -655,8 +818,8 @@ void FView::computeVisibilityMasks( UTILS_NOINLINE /* static */ FScene::RenderableSoa::iterator FView::partition( - FScene::RenderableSoa::iterator begin, - FScene::RenderableSoa::iterator end, + FScene::RenderableSoa::iterator const begin, + FScene::RenderableSoa::iterator const end, Culler::result_type mask, Culler::result_type value) noexcept { return std::partition(begin, end, [mask, value](auto it) { // Mask VISIBLE_MASK to ignore higher bits related to spot shadows. We only partition based @@ -665,16 +828,27 @@ UTILS_NOINLINE }); } -void FView::prepareUpscaler(float2 scale) const noexcept { +void FView::prepareUpscaler(float2 const scale, + TemporalAntiAliasingOptions const& taaOptions, + DynamicResolutionOptions const& dsrOptions) const noexcept { SYSTRACE_CALL(); - const float bias = (mDynamicResolution.quality >= QualityLevel::HIGH) ? - std::log2(std::min(scale.x, scale.y)) : 0.0f; - mPerViewUniforms.prepareLodBias(bias); + float bias = 0.0f; + float2 derivativesScale{ 1.0f }; + if (dsrOptions.enabled && dsrOptions.quality >= QualityLevel::HIGH) { + bias = std::log2(std::min(scale.x, scale.y)); + } + if (taaOptions.enabled) { + bias += taaOptions.lodBias; + if (taaOptions.upscaling) { + derivativesScale = 0.5f; + } + } + mColorPassDescriptorSet.prepareLodBias(bias, derivativesScale); } void FView::prepareCamera(FEngine& engine, const CameraInfo& cameraInfo) const noexcept { SYSTRACE_CALL(); - mPerViewUniforms.prepareCamera(engine, cameraInfo); + mColorPassDescriptorSet.prepareCamera(engine, cameraInfo); } void FView::prepareViewport( @@ -683,57 +857,65 @@ void FView::prepareViewport( SYSTRACE_CALL(); // TODO: we should pass viewport.{left|bottom} to the backend, so it can offset the // scissor properly. - mPerViewUniforms.prepareViewport(physicalViewport, logicalViewport); + mColorPassDescriptorSet.prepareViewport(physicalViewport, logicalViewport); } void FView::prepareSSAO(Handle ssao) const noexcept { - mPerViewUniforms.prepareSSAO(ssao, mAmbientOcclusionOptions); + mColorPassDescriptorSet.prepareSSAO(ssao, mAmbientOcclusionOptions); } -void FView::prepareSSR(Handle ssr, float refractionLodOffset, +void FView::prepareSSR(Handle ssr, + bool const disableSSR, + float const refractionLodOffset, ScreenSpaceReflectionsOptions const& ssrOptions) const noexcept { - mPerViewUniforms.prepareSSR(ssr, refractionLodOffset, ssrOptions); + mColorPassDescriptorSet.prepareSSR(ssr, disableSSR, refractionLodOffset, ssrOptions); } void FView::prepareStructure(Handle structure) const noexcept { // sampler must be NEAREST - mPerViewUniforms.prepareStructure(structure); + mColorPassDescriptorSet.prepareStructure(structure); } void FView::prepareShadow(Handle texture) const noexcept { - const auto& uniforms = mShadowMapManager.getShadowMappingUniforms(); + // when needsShadowMap() is not set, this method only just sets a dummy texture + // in the needed samplers (in that case `texture` is actually a dummy texture). + ShadowMapManager::ShadowMappingUniforms uniforms; + if (needsShadowMap()) { + uniforms = mShadowMapManager->getShadowMappingUniforms(); + } switch (mShadowType) { - case filament::ShadowType::PCF: - mPerViewUniforms.prepareShadowPCF(texture, uniforms); + case ShadowType::PCF: + mColorPassDescriptorSet.prepareShadowPCF(texture, uniforms); break; - case filament::ShadowType::VSM: - mPerViewUniforms.prepareShadowVSM(texture, uniforms, mVsmShadowOptions); + case ShadowType::VSM: + mColorPassDescriptorSet.prepareShadowVSM(texture, uniforms, mVsmShadowOptions); break; - case filament::ShadowType::DPCF: - mPerViewUniforms.prepareShadowDPCF(texture, uniforms, mSoftShadowOptions); + case ShadowType::DPCF: + mColorPassDescriptorSet.prepareShadowDPCF(texture, uniforms, mSoftShadowOptions); break; - case filament::ShadowType::PCSS: - mPerViewUniforms.prepareShadowPCSS(texture, uniforms, mSoftShadowOptions); + case ShadowType::PCSS: + mColorPassDescriptorSet.prepareShadowPCSS(texture, uniforms, mSoftShadowOptions); + break; + case ShadowType::PCFd: + mColorPassDescriptorSet.prepareShadowPCFDebug(texture, uniforms); break; } } -void FView::prepareShadowMapping(bool highPrecision) const noexcept { - mPerViewUniforms.prepareShadowMapping(highPrecision); -} - -void FView::cleanupRenderPasses() const noexcept { - mPerViewUniforms.unbindSamplers(); +void FView::prepareShadowMapping(bool const highPrecision) const noexcept { + if (mHasShadowing) { + assert_invariant(mShadowMapManager); + mColorPassDescriptorSet.prepareShadowMapping( + mShadowMapManager->getShadowUniformsHandle(), highPrecision); + } } -void FView::froxelize(FEngine& engine, mat4f const& viewMatrix) const noexcept { - SYSTRACE_CALL(); - assert_invariant(mHasDynamicLighting); - mFroxelizer.froxelizeLights(engine, viewMatrix, mScene->getLightData()); +void FView::commitUniformsAndSamplers(DriverApi& driver) const noexcept { + mColorPassDescriptorSet.commit(driver); } -void FView::commitUniforms(DriverApi& driver) const noexcept { - mPerViewUniforms.commit(driver); +void FView::unbindSamplers(DriverApi& driver) noexcept { + mColorPassDescriptorSet.unbindSamplers(driver); } void FView::commitFroxels(DriverApi& driverApi) const noexcept { @@ -747,14 +929,14 @@ void FView::prepareVisibleRenderables(JobSystem& js, Frustum const& frustum, FScene::RenderableSoa& renderableData) const noexcept { SYSTRACE_CALL(); if (UTILS_LIKELY(isFrustumCullingEnabled())) { - FView::cullRenderables(js, renderableData, frustum, VISIBLE_RENDERABLE_BIT); + cullRenderables(js, renderableData, frustum, VISIBLE_RENDERABLE_BIT); } else { std::uninitialized_fill(renderableData.begin(), renderableData.end(), VISIBLE_RENDERABLE); } } -void FView::cullRenderables(JobSystem& js, +void FView::cullRenderables(JobSystem&, FScene::RenderableSoa& renderableData, Frustum const& frustum, size_t bit) noexcept { SYSTRACE_CALL(); @@ -764,7 +946,7 @@ void FView::cullRenderables(JobSystem& js, // culling job (this runs on multiple threads) auto functor = [&frustum, worldAABBCenter, worldAABBExtent, visibleArray, bit] - (uint32_t index, uint32_t c) { + (uint32_t const index, uint32_t const c) { Culler::intersects( visibleArray + index, frustum, @@ -780,7 +962,8 @@ void FView::cullRenderables(JobSystem& js, functor(0, renderableData.size()); } -void FView::prepareVisibleLights(FLightManager const& lcm, ArenaScope& rootArena, +void FView::prepareVisibleLights(FLightManager const& lcm, + Slice scratch, mat4f const& viewMatrix, Frustum const& frustum, FScene::LightSoa& lightData) noexcept { SYSTRACE_CALL(); @@ -798,7 +981,7 @@ void FView::prepareVisibleLights(FLightManager const& lcm, ArenaScope& rootArena size_t visibleLightCount = FScene::DIRECTIONAL_LIGHTS_COUNT; // skip directional light for (size_t i = FScene::DIRECTIONAL_LIGHTS_COUNT; i < lightData.size(); i++) { - FLightManager::Instance li = instanceArray[i]; + FLightManager::Instance const li = instanceArray[i]; if (visibleArray[i]) { if (!lcm.isLightCaster(li)) { visibleArray[i] = 0; @@ -848,28 +1031,25 @@ void FView::prepareVisibleLights(FLightManager const& lcm, ArenaScope& rootArena * - This helps our limited numbers of spot-shadow as well. */ - ArenaScope arena(rootArena.getAllocator()); - size_t const size = visibleLightCount; // number of point/spotlights - size_t const positionalLightCount = size - FScene::DIRECTIONAL_LIGHTS_COUNT; + size_t const positionalLightCount = visibleLightCount - FScene::DIRECTIONAL_LIGHTS_COUNT; if (positionalLightCount) { - // always allocate at least 4 entries, because the vectorized loops below rely on that - float* const UTILS_RESTRICT distances = - arena.allocate((size + 3u) & ~3u, CACHELINE_SIZE); - + assert_invariant(positionalLightCount <= scratch.size()); // pre-compute the lights' distance to the camera, for sorting below // - we don't skip the directional light, because we don't care, it's ignored during sorting + float* const UTILS_RESTRICT distances = scratch.data(); float4 const* const UTILS_RESTRICT spheres = lightData.data(); - computeLightCameraDistances(distances, viewMatrix, spheres, size); + computeLightCameraDistances(distances, viewMatrix, spheres, visibleLightCount); // skip directional light Zip2Iterator b = { lightData.begin(), distances }; - std::sort(b + FScene::DIRECTIONAL_LIGHTS_COUNT, b + size, + std::sort(b + FScene::DIRECTIONAL_LIGHTS_COUNT, b + visibleLightCount, [](auto const& lhs, auto const& rhs) { return lhs.second < rhs.second; }); } // drop excess lights - lightData.resize(std::min(size, CONFIG_MAX_LIGHT_COUNT + FScene::DIRECTIONAL_LIGHTS_COUNT)); + lightData.resize(std::min(visibleLightCount, + CONFIG_MAX_LIGHT_COUNT + FScene::DIRECTIONAL_LIGHTS_COUNT)); } // These methods need to exist so clang honors the __restrict__ keyword, which in turn @@ -891,67 +1071,99 @@ inline void FView::computeLightCameraDistances( } } -void FView::updatePrimitivesLod(FEngine& engine, const CameraInfo&, - FScene::RenderableSoa& renderableData, Range visible) noexcept { +void FView::updatePrimitivesLod(FScene::RenderableSoa& renderableData, + FEngine const& engine, CameraInfo const&, Range visible) noexcept { FRenderableManager const& rcm = engine.getRenderableManager(); - for (uint32_t index : visible) { - uint8_t level = 0; // TODO: pick the proper level of detail + for (uint32_t const index : visible) { + uint8_t const level = 0; // TODO: pick the proper level of detail auto ri = renderableData.elementAt(index); renderableData.elementAt(index) = rcm.getRenderPrimitives(ri, level); } } FrameGraphId FView::renderShadowMaps(FEngine& engine, FrameGraph& fg, - CameraInfo const& cameraInfo, float4 const& userTime, RenderPass const& pass) noexcept { - return mShadowMapManager.render(engine, fg, pass, *this, cameraInfo, userTime); + CameraInfo const& cameraInfo, float4 const& userTime, + RenderPassBuilder const& passBuilder) noexcept { + assert_invariant(needsShadowMap()); + return mShadowMapManager->render(engine, fg, passBuilder, *this, cameraInfo, userTime); } void FView::commitFrameHistory(FEngine& engine) noexcept { // Here we need to destroy resources in mFrameHistory.back() + auto& disposer = engine.getResourceAllocatorDisposer(); auto& frameHistory = mFrameHistory; FrameHistoryEntry& last = frameHistory.back(); - last.taa.color.destroy(engine.getResourceAllocator()); - last.ssr.color.destroy(engine.getResourceAllocator()); + disposer.destroy(std::move(last.taa.color.handle)); + disposer.destroy(std::move(last.ssr.color.handle)); // and then push the new history entry to the history stack frameHistory.commit(); } -void FView::drainFrameHistory(FEngine& engine) noexcept { +void FView::clearFrameHistory(FEngine& engine) noexcept { // make sure we free all resources in the history - for (size_t i = 0; i < mFrameHistory.size(); ++i) { - commitFrameHistory(engine); + auto& disposer = engine.getResourceAllocatorDisposer(); + auto& frameHistory = mFrameHistory; + for (size_t i = 0; i < frameHistory.size(); ++i) { + FrameHistoryEntry& last = frameHistory[i]; + disposer.destroy(std::move(last.taa.color.handle)); + disposer.destroy(std::move(last.ssr.color.handle)); } } -void FView::executePickingQueries(backend::DriverApi& driver, - backend::RenderTargetHandle handle, float scale) noexcept { +void FView::executePickingQueries(DriverApi& driver, + RenderTargetHandle handle, float2 const scale) noexcept { while (mActivePickingQueriesList) { FPickingQuery* const pQuery = mActivePickingQueriesList; mActivePickingQueriesList = pQuery->next; // adjust for dynamic resolution and structure buffer scale - const uint32_t x = uint32_t(float(pQuery->x) * (scale * mScale.x)); - const uint32_t y = uint32_t(float(pQuery->y) * (scale * mScale.y)); - driver.readPixels(handle, x, y, 1, 1, { - &pQuery->result.renderable, 4*4, // 4*uint - // FIXME: RGBA_INTEGER is guaranteed to work. R_INTEGER must be queried. - backend::PixelDataFormat::RG_INTEGER, backend::PixelDataType::UINT, - pQuery->handler, [](void* buffer, size_t size, void* user) { - FPickingQuery* pQuery = static_cast(user); - pQuery->result.fragCoords = { - pQuery->x, pQuery->y,float(1.0 - pQuery->result.depth) }; - pQuery->callback(pQuery->result, pQuery); - FPickingQuery::put(pQuery); - }, pQuery - }); + const uint32_t x = uint32_t(float(pQuery->x) * scale.x); + const uint32_t y = uint32_t(float(pQuery->y) * scale.y); + + if (UTILS_UNLIKELY(driver.getFeatureLevel() == FeatureLevel::FEATURE_LEVEL_0)) { + driver.readPixels(handle, x, y, 1, 1, { + &pQuery->result.reserved1, 4u, // 4 + PixelDataFormat::RGBA, PixelDataType::UBYTE, + pQuery->handler, [](void*, size_t, void* user) { + FPickingQuery* pQuery = static_cast(user); + uint8_t const* const p = + reinterpret_cast(&pQuery->result.reserved1); + uint32_t const r = p[0]; + uint32_t const g = p[1]; + uint32_t const b = p[2]; + uint32_t const a = p[3]; + int32_t const identity = int32_t(a << 16u | (b << 8u) | g); + float const depth = float(r) / 255.0f; + pQuery->result.renderable = Entity::import(identity); + pQuery->result.depth = depth; + pQuery->result.fragCoords = { + pQuery->x, pQuery->y, float(1.0 - depth) }; + pQuery->callback(pQuery->result, pQuery); + FPickingQuery::put(pQuery); + }, pQuery + }); + } else { + driver.readPixels(handle, x, y, 1, 1, { + &pQuery->result.renderable, 4u * 4u, // 4*float + PixelDataFormat::RG, PixelDataType::FLOAT, + pQuery->handler, [](void*, size_t, void* user) { + FPickingQuery* const pQuery = static_cast(user); + // pQuery->result.renderable already contains the right value! + pQuery->result.fragCoords = { + pQuery->x, pQuery->y, float(1.0 - pQuery->result.depth) }; + pQuery->callback(pQuery->result, pQuery); + FPickingQuery::put(pQuery); + }, pQuery + }); + } } } void FView::setTemporalAntiAliasingOptions(TemporalAntiAliasingOptions options) noexcept { - options.feedback = math::clamp(options.feedback, 0.0f, 1.0f); + options.feedback = clamp(options.feedback, 0.0f, 1.0f); options.filterWidth = std::max(0.2f, options.filterWidth); // below 0.2 causes issues mTemporalAntiAliasingOptions = options; } @@ -970,29 +1182,29 @@ void FView::setScreenSpaceReflectionsOptions(ScreenSpaceReflectionsOptions optio mScreenSpaceReflectionsOptions = options; } -void FView::setGuardBandOptions(GuardBandOptions options) noexcept { +void FView::setGuardBandOptions(GuardBandOptions const options) noexcept { mGuardBandOptions = options; } void FView::setAmbientOcclusionOptions(AmbientOcclusionOptions options) noexcept { - options.radius = math::max(0.0f, options.radius); + options.radius = max(0.0f, options.radius); options.power = std::max(0.0f, options.power); - options.bias = math::clamp(options.bias, 0.0f, 0.1f); + options.bias = clamp(options.bias, 0.0f, 0.1f); // snap to the closer of 0.5 or 1.0 options.resolution = std::floor( - math::clamp(options.resolution * 2.0f, 1.0f, 2.0f) + 0.5f) * 0.5f; + clamp(options.resolution * 2.0f, 1.0f, 2.0f) + 0.5f) * 0.5f; options.intensity = std::max(0.0f, options.intensity); options.bilateralThreshold = std::max(0.0f, options.bilateralThreshold); - options.minHorizonAngleRad = math::clamp(options.minHorizonAngleRad, 0.0f, math::f::PI_2); - options.ssct.lightConeRad = math::clamp(options.ssct.lightConeRad, 0.0f, math::f::PI_2); + options.minHorizonAngleRad = clamp(options.minHorizonAngleRad, 0.0f, f::PI_2); + options.ssct.lightConeRad = clamp(options.ssct.lightConeRad, 0.0f, f::PI_2); options.ssct.shadowDistance = std::max(0.0f, options.ssct.shadowDistance); options.ssct.contactDistanceMax = std::max(0.0f, options.ssct.contactDistanceMax); options.ssct.intensity = std::max(0.0f, options.ssct.intensity); options.ssct.lightDirection = normalize(options.ssct.lightDirection); options.ssct.depthBias = std::max(0.0f, options.ssct.depthBias); options.ssct.depthSlopeBias = std::max(0.0f, options.ssct.depthSlopeBias); - options.ssct.sampleCount = math::clamp((unsigned)options.ssct.sampleCount, 1u, 255u); - options.ssct.rayCount = math::clamp((unsigned)options.ssct.rayCount, 1u, 255u); + options.ssct.sampleCount = clamp((unsigned)options.ssct.sampleCount, 1u, 255u); + options.ssct.rayCount = clamp((unsigned)options.ssct.rayCount, 1u, 255u); mAmbientOcclusionOptions = options; } void FView::setVsmShadowOptions(VsmShadowOptions options) noexcept { @@ -1007,17 +1219,17 @@ void FView::setSoftShadowOptions(SoftShadowOptions options) noexcept { } void FView::setBloomOptions(BloomOptions options) noexcept { - options.dirtStrength = math::saturate(options.dirtStrength); - options.levels = math::clamp(options.levels, uint8_t(3), uint8_t(11)); - options.resolution = math::clamp(options.resolution, 1u << options.levels, 2048u); - options.anamorphism = math::clamp(options.anamorphism, 1.0f/32.0f, 32.0f); + options.dirtStrength = saturate(options.dirtStrength); + options.resolution = clamp(options.resolution, 2u, 2048u); + options.levels = clamp(options.levels, uint8_t(1), + FTexture::maxLevelCount(options.resolution)); options.highlight = std::max(10.0f, options.highlight); mBloomOptions = options; } void FView::setFogOptions(FogOptions options) noexcept { options.distance = std::max(0.0f, options.distance); - options.maximumOpacity = math::clamp(options.maximumOpacity, 0.0f, 1.0f); + options.maximumOpacity = clamp(options.maximumOpacity, 0.0f, 1.0f); options.density = std::max(0.0f, options.density); options.heightFalloff = std::max(0.0f, options.heightFalloff); options.inScatteringSize = options.inScatteringSize; @@ -1032,18 +1244,34 @@ void FView::setDepthOfFieldOptions(DepthOfFieldOptions options) noexcept { } void FView::setVignetteOptions(VignetteOptions options) noexcept { - options.roundness = math::saturate(options.roundness); - options.midPoint = math::saturate(options.midPoint); - options.feather = math::clamp(options.feather, 0.05f, 1.0f); + options.roundness = saturate(options.roundness); + options.midPoint = saturate(options.midPoint); + options.feather = clamp(options.feather, 0.05f, 1.0f); mVignetteOptions = options; } -View::PickingQuery& FView::pick(uint32_t x, uint32_t y, backend::CallbackHandler* handler, - View::PickingQueryResultCallback callback) noexcept { +View::PickingQuery& FView::pick(uint32_t const x, uint32_t const y, CallbackHandler* handler, + PickingQueryResultCallback const callback) noexcept { FPickingQuery* pQuery = FPickingQuery::get(x, y, handler, callback); pQuery->next = mActivePickingQueriesList; mActivePickingQueriesList = pQuery; return *pQuery; } +void FView::setStereoscopicOptions(const StereoscopicOptions& options) noexcept { + mStereoscopicOptions = options; +} + +void FView::setMaterialGlobal(uint32_t const index, float4 const& value) { + FILAMENT_CHECK_PRECONDITION(index < 4) + << "material global variable index (" << +index << ") out of range"; + mMaterialGlobals[index] = value; +} + +float4 FView::getMaterialGlobal(uint32_t const index) const { + FILAMENT_CHECK_PRECONDITION(index < 4) + << "material global variable index (" << +index << ") out of range"; + return mMaterialGlobals[index]; +} + } // namespace filament diff --git a/filament/src/details/View.h b/filament/src/details/View.h index 8c9f42a9be3..34c49e40d5a 100644 --- a/filament/src/details/View.h +++ b/filament/src/details/View.h @@ -17,21 +17,24 @@ #ifndef TNT_FILAMENT_DETAILS_VIEW_H #define TNT_FILAMENT_DETAILS_VIEW_H -#include - -#include - #include "downcast.h" #include "Allocators.h" +#include "Culler.h" #include "FrameHistory.h" #include "FrameInfo.h" #include "Froxelizer.h" -#include "PerViewUniforms.h" #include "PIDController.h" -#include "ShadowMap.h" #include "ShadowMapManager.h" -#include "TypedUniformBuffer.h" + +#include "ds/ColorPassDescriptorSet.h" +#include "ds/DescriptorSet.h" +#include "ds/PostProcessDescriptorSet.h" +#include "ds/SsrPassDescriptorSet.h" +#include "ds/TypedUniformBuffer.h" + +#include "components/LightManager.h" +#include "components/RenderableManager.h" #include "details/Camera.h" #include "details/ColorGrading.h" @@ -39,13 +42,20 @@ #include "details/Scene.h" #include +#include -#include "private/backend/DriverApi.h" +#include +#include +#include +#include + +#include #include #include #include +#include #include #include #include @@ -53,6 +63,13 @@ #include #include +#include +#include +#include + +#include +#include + namespace utils { class JobSystem; } // namespace utils; @@ -73,8 +90,6 @@ class FMaterialInstance; class FRenderer; class FScene; -static constexpr Culler::result_type VISIBLE_RENDERABLE = 1u << VISIBLE_RENDERABLE_BIT; - // ------------------------------------------------------------------------------------------------ class FView : public View { @@ -88,12 +103,12 @@ class FView : public View { CameraInfo computeCameraInfo(FEngine& engine) const noexcept; - void prepare(FEngine& engine, backend::DriverApi& driver, ArenaScope& arena, - filament::Viewport const& viewport, CameraInfo const& cameraInfo, + // note: viewport/cameraInfo are passed by value to make it clear that prepare cannot + // keep references on them that would outlive the scope of prepare() (e.g. with JobSystem). + void prepare(FEngine& engine, backend::DriverApi& driver, RootArenaScope& rootArenaScope, + Viewport viewport, CameraInfo cameraInfo, math::float4 const& userTime, bool needsAlphaChannel) noexcept; - void bindPerViewUniformsAndSamplers(FEngine::DriverApi& driver) const noexcept; - void setScene(FScene* scene) { mScene = scene; } FScene const* getScene() const noexcept { return mScene; } FScene* getScene() noexcept { return mScene; } @@ -112,12 +127,15 @@ class FView : public View { } bool isSkyboxVisible() const noexcept; - void setFrustumCullingEnabled(bool culling) noexcept { mCulling = culling; } + void setFrustumCullingEnabled(bool const culling) noexcept { mCulling = culling; } bool isFrustumCullingEnabled() const noexcept { return mCulling; } - void setFrontFaceWindingInverted(bool inverted) noexcept { mFrontFaceWindingInverted = inverted; } + void setFrontFaceWindingInverted(bool const inverted) noexcept { mFrontFaceWindingInverted = inverted; } bool isFrontFaceWindingInverted() const noexcept { return mFrontFaceWindingInverted; } + void setTransparentPickingEnabled(bool const enabled) noexcept { mIsTransparentPickingEnabled = enabled; } + bool isTransparentPickingEnabled() const noexcept { return mIsTransparentPickingEnabled; } + void setVisibleLayers(uint8_t select, uint8_t values) noexcept; uint8_t getVisibleLayers() const noexcept { @@ -133,65 +151,82 @@ class FView : public View { return mName.c_str_safe(); } - void prepareUpscaler(math::float2 scale) const noexcept; + void prepareUpscaler(math::float2 scale, + TemporalAntiAliasingOptions const& taaOptions, + DynamicResolutionOptions const& dsrOptions) const noexcept; void prepareCamera(FEngine& engine, const CameraInfo& cameraInfo) const noexcept; void prepareViewport( const Viewport& physicalViewport, - const filament::Viewport& logicalViewport) const noexcept; + const Viewport& logicalViewport) const noexcept; - void prepareShadowing(FEngine& engine, backend::DriverApi& driver, - FScene::RenderableSoa& renderableData, FScene::LightSoa& lightData, - CameraInfo const& cameraInfo) noexcept; - void prepareLighting(FEngine& engine, FEngine::DriverApi& driver, ArenaScope& arena, - filament::Viewport const& viewport, CameraInfo const &cameraInfo) noexcept; + void prepareShadowing(FEngine& engine, FScene::RenderableSoa& renderableData, + FScene::LightSoa const& lightData, CameraInfo const& cameraInfo) noexcept; + void prepareLighting(FEngine& engine, CameraInfo const& cameraInfo) noexcept; void prepareSSAO(backend::Handle ssao) const noexcept; - void prepareSSR(backend::Handle ssr, float refractionLodOffset, + void prepareSSR(backend::Handle ssr, bool disableSSR, + float refractionLodOffset, ScreenSpaceReflectionsOptions const& ssrOptions) const noexcept; void prepareStructure(backend::Handle structure) const noexcept; void prepareShadow(backend::Handle structure) const noexcept; void prepareShadowMapping(bool highPrecision) const noexcept; - void cleanupRenderPasses() const noexcept; - void froxelize(FEngine& engine, math::mat4f const& viewMatrix) const noexcept; - void commitUniforms(backend::DriverApi& driver) const noexcept; void commitFroxels(backend::DriverApi& driverApi) const noexcept; + void commitUniformsAndSamplers(backend::DriverApi& driver) const noexcept; + void unbindSamplers(backend::DriverApi& driver) noexcept; + + utils::JobSystem::Job* getFroxelizerSync() const noexcept { return mFroxelizerSync; } + void setFroxelizerSync(utils::JobSystem::Job* sync) noexcept { mFroxelizerSync = sync; } - bool hasDirectionalLight() const noexcept { return mHasDirectionalLight; } + // ultimately decides to use the DIR variant + bool hasDirectionalLighting() const noexcept { return mHasDirectionalLighting; } + + // ultimately decides to use the DYN variant bool hasDynamicLighting() const noexcept { return mHasDynamicLighting; } + + // ultimately decides to use the SRE variant bool hasShadowing() const noexcept { return mHasShadowing; } + + bool needsDirectionalShadowMaps() const noexcept { return mHasShadowing && mHasDirectionalLighting; } + bool needsPointShadowMaps() const noexcept { return mHasShadowing && mHasDynamicLighting; } bool needsShadowMap() const noexcept { return mNeedsShadowMap; } bool hasFog() const noexcept { return mFogOptions.enabled && mFogOptions.density > 0.0f; } bool hasVSM() const noexcept { return mShadowType == ShadowType::VSM; } bool hasDPCF() const noexcept { return mShadowType == ShadowType::DPCF; } bool hasPCSS() const noexcept { return mShadowType == ShadowType::PCSS; } bool hasPicking() const noexcept { return mActivePickingQueriesList != nullptr; } + bool hasStereo() const noexcept { + return mIsStereoSupported && mStereoscopicOptions.enabled; + } FrameGraphId renderShadowMaps(FEngine& engine, FrameGraph& fg, CameraInfo const& cameraInfo, math::float4 const& userTime, - RenderPass const& pass) noexcept; + RenderPassBuilder const& passBuilder) noexcept; - void updatePrimitivesLod( - FEngine& engine, const CameraInfo& camera, - FScene::RenderableSoa& renderableData, Range visible) noexcept; + static void updatePrimitivesLod(FScene::RenderableSoa& renderableData, + FEngine const& engine, CameraInfo const& camera, + Range visible) noexcept; - void setShadowingEnabled(bool enabled) noexcept { mShadowingEnabled = enabled; } + void setShadowingEnabled(bool const enabled) noexcept { mShadowingEnabled = enabled; } bool isShadowingEnabled() const noexcept { return mShadowingEnabled; } - void setScreenSpaceRefractionEnabled(bool enabled) noexcept { mScreenSpaceRefractionEnabled = enabled; } + void setScreenSpaceRefractionEnabled(bool const enabled) noexcept { mScreenSpaceRefractionEnabled = enabled; } bool isScreenSpaceRefractionEnabled() const noexcept { return mScreenSpaceRefractionEnabled; } bool isScreenSpaceReflectionEnabled() const noexcept { return mScreenSpaceReflectionsOptions.enabled; } - void setStencilBufferEnabled(bool enabled) noexcept { mStencilBufferEnabled = enabled; } + void setStencilBufferEnabled(bool const enabled) noexcept { mStencilBufferEnabled = enabled; } bool isStencilBufferEnabled() const noexcept { return mStencilBufferEnabled; } - FCamera const* getDirectionalLightCamera() const noexcept { - return &mShadowMapManager.getShadowMap(0)->getDebugCamera(); + void setStereoscopicOptions(StereoscopicOptions const& options) noexcept; + + utils::FixedCapacityVector getDirectionalShadowCameras() const noexcept { + if (!mShadowMapManager) return {}; + return mShadowMapManager->getDirectionalShadowCameras(); } void setRenderTarget(FRenderTarget* renderTarget) noexcept { @@ -214,7 +249,7 @@ class FView : public View { return mMultiSampleAntiAliasingOptions.sampleCount; } - void setAntiAliasing(AntiAliasing type) noexcept { + void setAntiAliasing(AntiAliasing const type) noexcept { mAntiAliasing = type; } @@ -254,7 +289,7 @@ class FView : public View { return mColorGrading; } - void setDithering(Dithering dithering) noexcept { + void setDithering(Dithering const dithering) noexcept { mDithering = dithering; } @@ -262,16 +297,20 @@ class FView : public View { return mDithering; } + const StereoscopicOptions& getStereoscopicOptions() const noexcept { + return mStereoscopicOptions; + } + bool hasPostProcessPass() const noexcept { return mHasPostProcessPass; } math::float2 updateScale(FEngine& engine, - FrameInfo const& info, + details::FrameInfo const& info, Renderer::FrameRateOptions const& frameRateOptions, Renderer::DisplayInfo const& displayInfo) noexcept; - void setDynamicResolutionOptions(View::DynamicResolutionOptions const& options) noexcept; + void setDynamicResolutionOptions(DynamicResolutionOptions const& options) noexcept; DynamicResolutionOptions getDynamicResolutionOptions() const noexcept { return mDynamicResolution; @@ -287,11 +326,11 @@ class FView : public View { void setDynamicLightingOptions(float zLightNear, float zLightFar) noexcept; - void setPostProcessingEnabled(bool enabled) noexcept { + void setPostProcessingEnabled(bool const enabled) noexcept { mHasPostProcessPass = enabled; } - void setAmbientOcclusion(AmbientOcclusion ambientOcclusion) noexcept { + void setAmbientOcclusion(AmbientOcclusion const ambientOcclusion) noexcept { mAmbientOcclusionOptions.enabled = ambientOcclusion == AmbientOcclusion::SSAO; } @@ -305,7 +344,7 @@ class FView : public View { return mShadowType; } - void setShadowType(ShadowType shadow) noexcept { + void setShadowType(ShadowType const shadow) noexcept { mShadowType = shadow; } @@ -349,7 +388,7 @@ class FView : public View { return mVignetteOptions; } - void setBlendMode(BlendMode blendMode) noexcept { + void setBlendMode(BlendMode const blendMode) noexcept { mBlendMode = blendMode; } @@ -373,8 +412,12 @@ class FView : public View { FCamera& getCameraUser() noexcept { return *mCullingCamera; } void setCameraUser(FCamera* camera) noexcept { setCullingCamera(camera); } + bool hasCamera() const noexcept { + return mCullingCamera != nullptr; + } + backend::Handle getRenderTargetHandle() const noexcept { - backend::Handle kEmptyHandle; + backend::Handle const kEmptyHandle; return mRenderTarget == nullptr ? kEmptyHandle : mRenderTarget->getHwHandle(); } @@ -389,8 +432,7 @@ class FView : public View { static void cullRenderables(utils::JobSystem& js, FScene::RenderableSoa& renderableData, Frustum const& frustum, size_t bit) noexcept; - PerViewUniforms const& getPerViewUniforms() const noexcept { return mPerViewUniforms; } - PerViewUniforms& getPerViewUniforms() noexcept { return mPerViewUniforms; } + ColorPassDescriptorSet& getColorPassDescriptorSet() noexcept { return mColorPassDescriptorSet; } // Returns the frame history FIFO. This is typically used by the FrameGraph to access // previous frame data. @@ -402,27 +444,42 @@ class FView : public View { // (e.g.: after the FrameGraph execution). void commitFrameHistory(FEngine& engine) noexcept; + // Clean-up the whole history, free all resources. This is typically called when the View is + // being terminated. Or we're changing Renderer. + void clearFrameHistory(FEngine& engine) noexcept; + // create the picking query - View::PickingQuery& pick(uint32_t x, uint32_t y, backend::CallbackHandler* handler, - View::PickingQueryResultCallback callback) noexcept; + PickingQuery& pick(uint32_t x, uint32_t y, backend::CallbackHandler* handler, + PickingQueryResultCallback callback) noexcept; void executePickingQueries(backend::DriverApi& driver, - backend::RenderTargetHandle handle, float scale) noexcept; + backend::RenderTargetHandle handle, math::float2 scale) noexcept; -private: + void setMaterialGlobal(uint32_t index, math::float4 const& value); + + math::float4 getMaterialGlobal(uint32_t index) const; + utils::Entity getFogEntity() const noexcept { + return mFogEntity; + } + + TypedUniformBuffer& getFrameUniforms() noexcept { + return mUniforms; + } + +private: struct FPickingQuery : public PickingQuery { private: - FPickingQuery(uint32_t x, uint32_t y, + FPickingQuery(uint32_t const x, uint32_t const y, backend::CallbackHandler* handler, - View::PickingQueryResultCallback callback) noexcept + PickingQueryResultCallback const callback) noexcept : PickingQuery{}, x(x), y(y), handler(handler), callback(callback) {} ~FPickingQuery() noexcept = default; public: // TODO: use a small pool - static FPickingQuery* get(uint32_t x, uint32_t y, backend::CallbackHandler* handler, - View::PickingQueryResultCallback callback) noexcept { - return new FPickingQuery(x, y, handler, callback); + static FPickingQuery* get(uint32_t const x, uint32_t const y, backend::CallbackHandler* handler, + PickingQueryResultCallback const callback) noexcept { + return new(std::nothrow) FPickingQuery(x, y, handler, callback); } static void put(FPickingQuery* pQuery) noexcept { delete pQuery; @@ -432,7 +489,7 @@ class FView : public View { uint32_t const x; uint32_t const y; backend::CallbackHandler* const handler; - View::PickingQueryResultCallback const callback; + PickingQueryResultCallback const callback; // picking query result PickingQueryResult result; }; @@ -440,7 +497,8 @@ class FView : public View { void prepareVisibleRenderables(utils::JobSystem& js, Frustum const& frustum, FScene::RenderableSoa& renderableData) const noexcept; - static void prepareVisibleLights(FLightManager const& lcm, ArenaScope& rootArena, + static void prepareVisibleLights(FLightManager const& lcm, + utils::Slice scratch, math::mat4f const& viewMatrix, Frustum const& frustum, FScene::LightSoa& lightData) noexcept; @@ -453,10 +511,6 @@ class FView : public View { Culler::result_type* visibleMask, size_t count); - // Clean-up the whole history, free all resources. This is typically called when the View is - // being terminated. - void drainFrameHistory(FEngine& engine) noexcept; - // we don't inline this one, because the function is quite large and there is not much to // gain from inlining. static FScene::RenderableSoa::iterator partition( @@ -467,18 +521,21 @@ class FView : public View { // these are accessed in the render loop, keep together backend::Handle mLightUbh; backend::Handle mRenderableUbh; + DescriptorSet mCommonRenderableDescriptorSet; FScene* mScene = nullptr; // The camera set by the user, used for culling and viewing - FCamera* mCullingCamera = nullptr; + FCamera* /* UTILS_NONNULL */ mCullingCamera = nullptr; // FIXME: should always be non-null // The optional (debug) camera, used only for viewing FCamera* mViewingCamera = nullptr; mutable Froxelizer mFroxelizer; + utils::JobSystem::Job* mFroxelizerSync = nullptr; Viewport mViewport; bool mCulling = true; bool mFrontFaceWindingInverted = false; + bool mIsTransparentPickingEnabled = false; FRenderTarget* mRenderTarget = nullptr; @@ -501,9 +558,12 @@ class FView : public View { MultiSampleAntiAliasingOptions mMultiSampleAntiAliasingOptions; ScreenSpaceReflectionsOptions mScreenSpaceReflectionsOptions; GuardBandOptions mGuardBandOptions; + StereoscopicOptions mStereoscopicOptions; BlendMode mBlendMode = BlendMode::OPAQUE; const FColorGrading* mColorGrading = nullptr; const FColorGrading* mDefaultColorGrading = nullptr; + utils::Entity mFogEntity{}; + bool mIsStereoSupported : 1; PIDController mPidController; DynamicResolutionOptions mDynamicResolution; @@ -512,7 +572,8 @@ class FView : public View { RenderQuality mRenderQuality; - mutable PerViewUniforms mPerViewUniforms; + mutable TypedUniformBuffer mUniforms; + mutable ColorPassDescriptorSet mColorPassDescriptorSet; mutable FrameHistory mFrameHistory{}; @@ -525,15 +586,27 @@ class FView : public View { Range mVisibleDirectionalShadowCasters; Range mSpotLightShadowCasters; uint32_t mRenderableUBOSize = 0; - mutable bool mHasDirectionalLight = false; + mutable bool mHasDirectionalLighting = false; mutable bool mHasDynamicLighting = false; mutable bool mHasShadowing = false; mutable bool mNeedsShadowMap = false; - ShadowMapManager mShadowMapManager; + std::unique_ptr mShadowMapManager; + + std::array mMaterialGlobals = {{ + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + { 0, 0, 0, 1 }, + }}; #ifndef NDEBUG - std::array mDebugFrameHistory; + struct DebugState { + std::unique_ptr> debugFrameHistory{}; + bool owner = false; + bool active = false; + }; + std::shared_ptr mDebugState{ new DebugState }; #endif }; diff --git a/filament/src/ds/ColorPassDescriptorSet.cpp b/filament/src/ds/ColorPassDescriptorSet.cpp new file mode 100644 index 00000000000..e5234dd157a --- /dev/null +++ b/filament/src/ds/ColorPassDescriptorSet.cpp @@ -0,0 +1,576 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ColorPassDescriptorSet.h" + +#include "Froxelizer.h" +#include "HwDescriptorSetLayoutFactory.h" +#include "ShadowMapManager.h" +#include "TypedUniformBuffer.h" + +#include "components/LightManager.h" + +#include "details/Camera.h" +#include "details/Engine.h" +#include "details/IndirectLight.h" +#include "details/Texture.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include + +namespace filament { + +using namespace backend; +using namespace math; + +uint8_t ColorPassDescriptorSet::getIndex( + bool const lit, bool const ssr, bool const fog) noexcept { + + uint8_t index = 0; + + if (!lit) { + // this will remove samplers unused when unit + index |= 0x1; + } + + if (ssr) { + // this will add samplers needed for screen-space SSR + index |= 0x2; + } + + if (!fog) { + // this will remove samplers needed for fog + index |= 0x4; + } + + assert_invariant(index < DESCRIPTOR_LAYOUT_COUNT); + return index; +} + + +ColorPassDescriptorSet::ColorPassDescriptorSet(FEngine& engine, + TypedUniformBuffer& uniforms) noexcept + : mUniforms(uniforms) { + + constexpr UserVariantFilterMask filterFog = UserVariantFilterMask(UserVariantFilterBit::FOG); + constexpr UserVariantFilterMask keepFog = UserVariantFilterMask(0); + + for (bool const lit: { false, true }) { + for (bool const ssr: { false, true }) { + for (bool const fog: { false, true }) { + auto index = getIndex(lit, ssr, fog); + mDescriptorSetLayout[index] = { + engine.getDescriptorSetLayoutFactory(), + engine.getDriverApi(), + descriptor_sets::getPerViewDescriptorSetLayout( + MaterialDomain::SURFACE, + fog ? keepFog : filterFog, + lit, + ssr ? ReflectionMode::SCREEN_SPACE : ReflectionMode::DEFAULT, + ssr ? RefractionMode::SCREEN_SPACE : RefractionMode::NONE) + }; + mDescriptorSet[index] = DescriptorSet{ mDescriptorSetLayout[index] }; + } + } + } + + setBuffer(+PerViewBindingPoints::FRAME_UNIFORMS, + uniforms.getUboHandle(), 0, uniforms.getSize()); + + if (engine.getDFG().isValid()) { + TextureSampler const sampler(TextureSampler::MagFilter::LINEAR); + setSampler(+PerViewBindingPoints::IBL_DFG_LUT, + engine.getDFG().getTexture(), sampler.getSamplerParams()); + } +} + +void ColorPassDescriptorSet::init( + BufferObjectHandle lights, + BufferObjectHandle recordBuffer, + BufferObjectHandle froxelBuffer) noexcept { + for (auto&& descriptorSet: mDescriptorSet) { + descriptorSet.setBuffer(+PerViewBindingPoints::LIGHTS, + lights, 0, sizeof(LightsUib)); + descriptorSet.setBuffer(+PerViewBindingPoints::RECORD_BUFFER, + recordBuffer, 0, sizeof(FroxelRecordUib)); + descriptorSet.setBuffer(+PerViewBindingPoints::FROXEL_BUFFER, + froxelBuffer, 0, sizeof(FroxelsUib)); + } +} + +void ColorPassDescriptorSet::terminate(HwDescriptorSetLayoutFactory& factory, DriverApi& driver) { + for (auto&& entry : mDescriptorSet) { + entry.terminate(driver); + } + for (auto&& entry : mDescriptorSetLayout) { + entry.terminate(factory, driver); + } +} + +void ColorPassDescriptorSet::prepareCamera(FEngine& engine, const CameraInfo& camera) noexcept { + mat4f const& viewFromWorld = camera.view; + mat4f const& worldFromView = camera.model; + mat4f const& clipFromView = camera.projection; + + const mat4f viewFromClip{ inverse((mat4)camera.projection) }; + const mat4f worldFromClip{ highPrecisionMultiply(worldFromView, viewFromClip) }; + + auto& s = mUniforms.edit(); + s.viewFromWorldMatrix = viewFromWorld; // view + s.worldFromViewMatrix = worldFromView; // model + s.clipFromViewMatrix = clipFromView; // projection + s.viewFromClipMatrix = viewFromClip; // 1/projection + s.worldFromClipMatrix = worldFromClip; // 1/(projection * view) + s.userWorldFromWorldMatrix = mat4f(inverse(camera.worldTransform)); + s.clipTransform = camera.clipTransform; + s.cameraFar = camera.zf; + s.oneOverFarMinusNear = 1.0f / (camera.zf - camera.zn); + s.nearOverFarMinusNear = camera.zn / (camera.zf - camera.zn); + + mat4f const& headFromWorld = camera.view; + Engine::Config const& config = engine.getConfig(); + for (int i = 0; i < config.stereoscopicEyeCount; i++) { + mat4f const& eyeFromHead = camera.eyeFromView[i]; // identity for monoscopic rendering + mat4f const& clipFromEye = camera.eyeProjection[i]; + // clipFromEye * eyeFromHead * headFromWorld + s.clipFromWorldMatrix[i] = highPrecisionMultiply( + clipFromEye, highPrecisionMultiply(eyeFromHead, headFromWorld)); + } + + // with a clip-space of [-w, w] ==> z' = -z + // with a clip-space of [0, w] ==> z' = (w - z)/2 + s.clipControl = engine.getDriverApi().getClipSpaceParams(); +} + +void ColorPassDescriptorSet::prepareLodBias(float const bias, float2 const derivativesScale) noexcept { + auto& s = mUniforms.edit(); + s.lodBias = bias; + s.derivativesScale = derivativesScale; +} + +void ColorPassDescriptorSet::prepareExposure(float const ev100) noexcept { + const float exposure = Exposure::exposure(ev100); + auto& s = mUniforms.edit(); + s.exposure = exposure; + s.ev100 = ev100; +} + +void ColorPassDescriptorSet::prepareViewport( + const filament::Viewport& physicalViewport, + const filament::Viewport& logicalViewport) noexcept { + float4 const physical{ physicalViewport.left, physicalViewport.bottom, + physicalViewport.width, physicalViewport.height }; + float4 const logical{ logicalViewport.left, logicalViewport.bottom, + logicalViewport.width, logicalViewport.height }; + auto& s = mUniforms.edit(); + s.resolution = { physical.zw, 1.0f / physical.zw }; + s.logicalViewportScale = physical.zw / logical.zw; + s.logicalViewportOffset = -logical.xy / logical.zw; +} + +void ColorPassDescriptorSet::prepareTime(FEngine& engine, float4 const& userTime) noexcept { + auto& s = mUniforms.edit(); + const uint64_t oneSecondRemainder = engine.getEngineTime().count() % 1000000000; + const float fraction = float(double(oneSecondRemainder) / 1000000000.0); + s.time = fraction; + s.userTime = userTime; +} + +void ColorPassDescriptorSet::prepareTemporalNoise(FEngine& engine, + TemporalAntiAliasingOptions const& options) noexcept { + std::uniform_real_distribution uniformDistribution{ 0.0f, 1.0f }; + auto& s = mUniforms.edit(); + const float temporalNoise = uniformDistribution(engine.getRandomEngine()); + s.temporalNoise = options.enabled ? temporalNoise : 0.0f; +} + +void ColorPassDescriptorSet::prepareFog(FEngine& engine, const CameraInfo& cameraInfo, + mat4 const& userWorldFromFog, FogOptions const& options, FIndirectLight const* ibl) noexcept { + + auto packHalf2x16 = [](half2 v) -> uint32_t { + short2 s; + memcpy(&s[0], &v[0], sizeof(s)); + return s.y << 16 | s.x; + }; + + // Fog should be calculated in the "user's world coordinates" so that it's not + // affected by the IBL rotation. + // fogFromWorldMatrix below is only used to transform the view vector in the shader, which is + // why we store the cofactor matrix. + + mat4f const viewFromWorld = cameraInfo.view; + mat4 const worldFromUserWorld = cameraInfo.worldTransform; + mat4 const worldFromFog = worldFromUserWorld * userWorldFromFog; + mat4 const viewFromFog = viewFromWorld * worldFromFog; + + mat4 const fogFromView = inverse(viewFromFog); + mat3 const fogFromWorld = inverse(worldFromFog.upperLeft()); + + // camera position relative to the fog's origin + auto const userCameraPosition = fogFromView[3].xyz; + + const float heightFalloff = std::max(0.0f, options.heightFalloff); + + // precalculate the constant part of density integral + const float density = -float(heightFalloff * (userCameraPosition.y - options.height)); + + auto& s = mUniforms.edit(); + + // note: this code is written so that near/far/minLod/maxLod could be user settable + // currently they're inferred. + Handle fogColorTextureHandle; + if (options.skyColor) { + fogColorTextureHandle = downcast(options.skyColor)->getHwHandleForSampling(); + half2 const minMaxMip{ 0.0f, float(options.skyColor->getLevels()) - 1.0f }; + s.fogMinMaxMip = packHalf2x16(minMaxMip); + s.fogOneOverFarMinusNear = 1.0f / (cameraInfo.zf - cameraInfo.zn); + s.fogNearOverFarMinusNear = cameraInfo.zn / (cameraInfo.zf - cameraInfo.zn); + } + if (!fogColorTextureHandle && options.fogColorFromIbl) { + if (ibl) { + // When using the IBL, because we don't have mip levels, we don't have a mop to + // select based on the distance. However, we can cheat a little and use + // mip_roughnessOne-1 as the horizon base color and mip_roughnessOne as the near + // camera base color. This will give a distant fog that's a bit too sharp, but it + // improves the effect overall. + fogColorTextureHandle = ibl->getReflectionHwHandle(); + float const levelCount = float(ibl->getLevelCount()); + half2 const minMaxMip{ levelCount - 2.0f, levelCount - 1.0f }; + s.fogMinMaxMip = packHalf2x16(minMaxMip); + s.fogOneOverFarMinusNear = 1.0f / (cameraInfo.zf - cameraInfo.zn); + s.fogNearOverFarMinusNear = cameraInfo.zn / (cameraInfo.zf - cameraInfo.zn); + } + } + + setSampler(+PerViewBindingPoints::FOG, + fogColorTextureHandle ? + fogColorTextureHandle : engine.getDummyCubemap()->getHwHandleForSampling(), { + .filterMag = SamplerMagFilter::LINEAR, + .filterMin = SamplerMinFilter::LINEAR_MIPMAP_LINEAR + }); + + s.fogStart = options.distance; + s.fogMaxOpacity = options.maximumOpacity; + s.fogHeightFalloff = heightFalloff; + s.fogCutOffDistance = options.cutOffDistance; + s.fogColor = options.color; + s.fogDensity = { options.density, density, options.density * std::exp(density) }; + s.fogInscatteringStart = options.inScatteringStart; + s.fogInscatteringSize = options.inScatteringSize; + s.fogColorFromIbl = fogColorTextureHandle ? 1.0f : 0.0f; + s.fogFromWorldMatrix = mat3f{ cof(fogFromWorld) }; +} + +void ColorPassDescriptorSet::prepareSSAO(Handle ssao, + AmbientOcclusionOptions const& options) noexcept { + // High quality sampling is enabled only if AO itself is enabled and upsampling quality is at + // least set to high and of course only if upsampling is needed. + const bool highQualitySampling = options.upsampling >= QualityLevel::HIGH + && options.resolution < 1.0f; + + // LINEAR filtering is only needed when AO is enabled and low-quality upsampling is used. + setSampler(+PerViewBindingPoints::SSAO, ssao, { + .filterMag = options.enabled && !highQualitySampling ? + SamplerMagFilter::LINEAR : SamplerMagFilter::NEAREST + }); + + const float edgeDistance = 1.0f / options.bilateralThreshold; + auto& s = mUniforms.edit(); + s.aoSamplingQualityAndEdgeDistance = + options.enabled ? (highQualitySampling ? edgeDistance : 0.0f) : -1.0f; + s.aoBentNormals = options.enabled && options.bentNormals ? 1.0f : 0.0f; +} + +void ColorPassDescriptorSet::prepareBlending(bool const needsAlphaChannel) noexcept { + mUniforms.edit().needsAlphaChannel = needsAlphaChannel ? 1.0f : 0.0f; +} + +void ColorPassDescriptorSet::prepareMaterialGlobals( + std::array const& materialGlobals) noexcept { + mUniforms.edit().custom[0] = materialGlobals[0]; + mUniforms.edit().custom[1] = materialGlobals[1]; + mUniforms.edit().custom[2] = materialGlobals[2]; + mUniforms.edit().custom[3] = materialGlobals[3]; +} + +void ColorPassDescriptorSet::prepareSSR(Handle ssr, + bool const disableSSR, + float const refractionLodOffset, + ScreenSpaceReflectionsOptions const& ssrOptions) noexcept { + + setSampler(+PerViewBindingPoints::SSR, ssr, { + .filterMag = SamplerMagFilter::LINEAR, + .filterMin = SamplerMinFilter::LINEAR_MIPMAP_LINEAR + }); + + auto& s = mUniforms.edit(); + s.refractionLodOffset = refractionLodOffset; + s.ssrDistance = (ssrOptions.enabled && !disableSSR) ? ssrOptions.maxDistance : 0.0f; +} + +void ColorPassDescriptorSet::prepareHistorySSR(Handle ssr, + mat4f const& historyProjection, + mat4f const& uvFromViewMatrix, + ScreenSpaceReflectionsOptions const& ssrOptions) noexcept { + + setSampler(+PerViewBindingPoints::SSR, ssr, { + .filterMag = SamplerMagFilter::LINEAR, + .filterMin = SamplerMinFilter::LINEAR + }); + + auto& s = mUniforms.edit(); + s.ssrReprojection = historyProjection; + s.ssrUvFromViewMatrix = uvFromViewMatrix; + s.ssrThickness = ssrOptions.thickness; + s.ssrBias = ssrOptions.bias; + s.ssrDistance = ssrOptions.enabled ? ssrOptions.maxDistance : 0.0f; + s.ssrStride = ssrOptions.stride; +} + +void ColorPassDescriptorSet::prepareStructure(Handle structure) noexcept { + // sampler must be NEAREST + setSampler(+PerViewBindingPoints::STRUCTURE, structure, {}); +} + +void ColorPassDescriptorSet::prepareDirectionalLight(FEngine& engine, + float exposure, + float3 const& sceneSpaceDirection, + LightManagerInstance directionalLight) noexcept { + FLightManager const& lcm = engine.getLightManager(); + auto& s = mUniforms.edit(); + + float const shadowFar = lcm.getShadowFar(directionalLight); + s.shadowFarAttenuationParams = shadowFar > 0.0f ? + 0.5f * float2{ 10.0f, 10.0f / (shadowFar * shadowFar) } : float2{ 1.0f, 0.0f }; + + const float3 l = -sceneSpaceDirection; // guaranteed normalized + + if (directionalLight.isValid()) { + const float4 colorIntensity = { + lcm.getColor(directionalLight), lcm.getIntensity(directionalLight) * exposure }; + + s.lightDirection = l; + s.lightColorIntensity = colorIntensity; + s.lightChannels = lcm.getLightChannels(directionalLight); + + const bool isSun = lcm.isSunLight(directionalLight); + // The last parameter must be < 0.0f for regular directional lights + float4 sun{ 0.0f, 0.0f, 0.0f, -1.0f }; + if (UTILS_UNLIKELY(isSun && colorIntensity.w > 0.0f)) { + // Currently we have only a single directional light, so it's probably likely that it's + // also the Sun. However, conceptually, most directional lights won't be sun lights. + float const radius = lcm.getSunAngularRadius(directionalLight); + float const haloSize = lcm.getSunHaloSize(directionalLight); + float const haloFalloff = lcm.getSunHaloFalloff(directionalLight); + sun.x = std::cos(radius); + sun.y = std::sin(radius); + sun.z = 1.0f / (std::cos(radius * haloSize) - sun.x); + sun.w = haloFalloff; + } + s.sun = sun; + } else { + // Disable the sun if there's no directional light + s.sun = float4{ 0.0f, 0.0f, 0.0f, -1.0f }; + } +} + +void ColorPassDescriptorSet::prepareAmbientLight(FEngine& engine, FIndirectLight const& ibl, + float const intensity, float const exposure) noexcept { + auto& s = mUniforms.edit(); + + // Set up uniforms and sampler for the IBL, guaranteed to be non-null at this point. + float const iblRoughnessOneLevel = float(ibl.getLevelCount() - 1); + s.iblRoughnessOneLevel = iblRoughnessOneLevel; + s.iblLuminance = intensity * exposure; + std::transform(ibl.getSH(), ibl.getSH() + 9, s.iblSH, [](float3 const v) { + return float4(v, 0.0f); + }); + + // We always sample from the reflection texture, so provide a dummy texture if necessary. + Handle reflection = ibl.getReflectionHwHandle(); + if (!reflection) { + reflection = engine.getDummyCubemap()->getHwHandle(); + } + setSampler(+PerViewBindingPoints::IBL_SPECULAR, + reflection, { + .filterMag = SamplerMagFilter::LINEAR, + .filterMin = SamplerMinFilter::LINEAR_MIPMAP_LINEAR + }); +} + +void ColorPassDescriptorSet::prepareDynamicLights(Froxelizer& froxelizer) noexcept { + auto& s = mUniforms.edit(); + froxelizer.updateUniforms(s); + float const f = froxelizer.getLightFar(); + // TODO: make the falloff rate a parameter + s.lightFarAttenuationParams = 0.5f * float2{ 10.0f, 10.0f / (f * f) }; +} + +void ColorPassDescriptorSet::prepareShadowMapping(BufferObjectHandle shadowUniforms, bool const highPrecision) noexcept { + auto& s = mUniforms.edit(); + constexpr float low = 5.54f; // ~ std::log(std::numeric_limits::max()) * 0.5f; + constexpr float high = 42.0f; // ~ std::log(std::numeric_limits::max()) * 0.5f; + s.vsmExponent = highPrecision ? high : low; + setBuffer(+PerViewBindingPoints::SHADOWS, shadowUniforms, 0, sizeof(ShadowUib)); +} + +void ColorPassDescriptorSet::prepareShadowSampling(PerViewUib& uniforms, + ShadowMappingUniforms const& shadowMappingUniforms) noexcept { + uniforms.cascadeSplits = shadowMappingUniforms.cascadeSplits; + uniforms.ssContactShadowDistance = shadowMappingUniforms.ssContactShadowDistance; + uniforms.directionalShadows = int32_t(shadowMappingUniforms.directionalShadows); + uniforms.cascades = int32_t(shadowMappingUniforms.cascades); +} + +void ColorPassDescriptorSet::prepareShadowVSM(Handle texture, + ShadowMappingUniforms const& shadowMappingUniforms, + VsmShadowOptions const& options) noexcept { + constexpr float low = 5.54f; // ~ std::log(std::numeric_limits::max()) * 0.5f; + constexpr float high = 42.0f; // ~ std::log(std::numeric_limits::max()) * 0.5f; + SamplerMinFilter filterMin = SamplerMinFilter::LINEAR; + if (options.anisotropy > 0 || options.mipmapping) { + filterMin = SamplerMinFilter::LINEAR_MIPMAP_LINEAR; + } + setSampler(+PerViewBindingPoints::SHADOW_MAP, + texture, { + .filterMag = SamplerMagFilter::LINEAR, + .filterMin = filterMin, + .anisotropyLog2 = options.anisotropy, + }); + auto& s = mUniforms.edit(); + s.shadowSamplingType = SHADOW_SAMPLING_RUNTIME_EVSM; + s.vsmExponent = options.highPrecision ? high : low; + s.vsmDepthScale = options.minVarianceScale * 0.01f * s.vsmExponent; + s.vsmLightBleedReduction = options.lightBleedReduction; + prepareShadowSampling(s, shadowMappingUniforms); +} + +void ColorPassDescriptorSet::prepareShadowPCF(Handle texture, + ShadowMappingUniforms const& shadowMappingUniforms) noexcept { + setSampler(+PerViewBindingPoints::SHADOW_MAP, + texture, { + .filterMag = SamplerMagFilter::LINEAR, + .filterMin = SamplerMinFilter::LINEAR, + .compareMode = SamplerCompareMode::COMPARE_TO_TEXTURE, + .compareFunc = SamplerCompareFunc::GE + }); + auto& s = mUniforms.edit(); + s.shadowSamplingType = SHADOW_SAMPLING_RUNTIME_PCF; + prepareShadowSampling(s, shadowMappingUniforms); +} + +void ColorPassDescriptorSet::prepareShadowDPCF(Handle texture, + ShadowMappingUniforms const& shadowMappingUniforms, + SoftShadowOptions const& options) noexcept { + setSampler(+PerViewBindingPoints::SHADOW_MAP, texture, {}); + auto& s = mUniforms.edit(); + s.shadowSamplingType = SHADOW_SAMPLING_RUNTIME_DPCF; + s.shadowPenumbraRatioScale = options.penumbraRatioScale; + prepareShadowSampling(s, shadowMappingUniforms); +} + +void ColorPassDescriptorSet::prepareShadowPCSS(Handle texture, + ShadowMappingUniforms const& shadowMappingUniforms, + SoftShadowOptions const& options) noexcept { + setSampler(+PerViewBindingPoints::SHADOW_MAP, texture, {}); + auto& s = mUniforms.edit(); + s.shadowSamplingType = SHADOW_SAMPLING_RUNTIME_PCSS; + s.shadowPenumbraRatioScale = options.penumbraRatioScale; + prepareShadowSampling(s, shadowMappingUniforms); +} + +void ColorPassDescriptorSet::prepareShadowPCFDebug(Handle texture, + ShadowMappingUniforms const& shadowMappingUniforms) noexcept { + setSampler(+PerViewBindingPoints::SHADOW_MAP, texture, { + .filterMag = SamplerMagFilter::NEAREST, + .filterMin = SamplerMinFilter::NEAREST + }); + auto& s = mUniforms.edit(); + s.shadowSamplingType = SHADOW_SAMPLING_RUNTIME_PCF; + prepareShadowSampling(s, shadowMappingUniforms); +} + +void ColorPassDescriptorSet::commit(DriverApi& driver) noexcept { + if (mUniforms.isDirty()) { + driver.updateBufferObject(mUniforms.getUboHandle(), + mUniforms.toBufferDescriptor(driver), 0); + } + for (size_t i = 0; i < DESCRIPTOR_LAYOUT_COUNT; i++) { + mDescriptorSet[i].commit(mDescriptorSetLayout[i], driver); + } +} + +void ColorPassDescriptorSet::unbindSamplers(DriverApi&) noexcept { + // this needs to reset the sampler that are only set in RendererUtils::colorPass(), because + // this descriptor-set is also used for ssr/picking/structure and these could be stale + // it would be better to use a separate descriptor-set for those two cases so that we don't + // have to do this + setSampler(+PerViewBindingPoints::STRUCTURE, {}, {}); + setSampler(+PerViewBindingPoints::SHADOW_MAP, {}, {}); + setSampler(+PerViewBindingPoints::SSAO, {}, {}); + setSampler(+PerViewBindingPoints::SSR, {}, {}); +} + +void ColorPassDescriptorSet::setSampler(descriptor_binding_t const binding, + TextureHandle th, SamplerParams const params) noexcept { + for (size_t i = 0; i < DESCRIPTOR_LAYOUT_COUNT; i++) { + auto samplers = mDescriptorSetLayout[i].getSamplerDescriptors(); + if (samplers[binding]) { + mDescriptorSet[i].setSampler(binding, th, params); + } + } +} + +void ColorPassDescriptorSet::setBuffer(descriptor_binding_t const binding, + BufferObjectHandle boh, uint32_t const offset, uint32_t const size) noexcept { + for (size_t i = 0; i < DESCRIPTOR_LAYOUT_COUNT; i++) { + auto ubos = mDescriptorSetLayout[i].getUniformBufferDescriptors(); + if (ubos[binding]) { + mDescriptorSet[i].setBuffer(binding, boh, offset, size); + } + } +} + +} // namespace filament + diff --git a/filament/src/ds/ColorPassDescriptorSet.h b/filament/src/ds/ColorPassDescriptorSet.h new file mode 100644 index 00000000000..db0bfa2217f --- /dev/null +++ b/filament/src/ds/ColorPassDescriptorSet.h @@ -0,0 +1,180 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_PERVIEWUNIFORMS_H +#define TNT_FILAMENT_PERVIEWUNIFORMS_H + +#include + +#include "DescriptorSet.h" + +#include "TypedUniformBuffer.h" + +#include + +#include +#include + +#include + +#include +#include +#include +#include + +#include + +#include +#include + +namespace filament { + +class DescriptorSetLayout; +class HwDescriptorSetLayoutFactory; + +struct AmbientOcclusionOptions; +struct DynamicResolutionOptions; +struct FogOptions; +struct ScreenSpaceReflectionsOptions; +struct SoftShadowOptions; +struct TemporalAntiAliasingOptions; +struct VsmShadowOptions; + +struct CameraInfo; +struct ShadowMappingUniforms; + +class FEngine; +class FIndirectLight; +class Froxelizer; +class LightManager; + +class ColorPassDescriptorSet { + + using LightManagerInstance = utils::EntityInstance; + using TextureHandle = backend::Handle; + + static constexpr uint32_t const SHADOW_SAMPLING_RUNTIME_PCF = 0u; + static constexpr uint32_t const SHADOW_SAMPLING_RUNTIME_EVSM = 1u; + static constexpr uint32_t const SHADOW_SAMPLING_RUNTIME_DPCF = 2u; + static constexpr uint32_t const SHADOW_SAMPLING_RUNTIME_PCSS = 3u; + +public: + + static uint8_t getIndex(bool lit, bool ssr, bool fog) noexcept; + + ColorPassDescriptorSet(FEngine& engine, + TypedUniformBuffer& uniforms) noexcept; + + void init( + backend::BufferObjectHandle lights, + backend::BufferObjectHandle recordBuffer, + backend::BufferObjectHandle froxelBuffer) noexcept; + + void terminate(HwDescriptorSetLayoutFactory& factory, backend::DriverApi& driver); + + void prepareCamera(FEngine& engine, const CameraInfo& camera) noexcept; + void prepareLodBias(float bias, math::float2 derivativesScale) noexcept; + + /* + * @param viewport viewport (should be same as RenderPassParams::viewport) + * @param xoffset horizontal rendering offset *within* the viewport. + * Non-zero when we have guard bands. + * @param yoffset vertical rendering offset *within* the viewport. + * Non-zero when we have guard bands. + */ + void prepareViewport( + const Viewport& physicalViewport, + const Viewport& logicalViewport) noexcept; + + void prepareTime(FEngine& engine, math::float4 const& userTime) noexcept; + void prepareTemporalNoise(FEngine& engine, TemporalAntiAliasingOptions const& options) noexcept; + void prepareExposure(float ev100) noexcept; + void prepareFog(FEngine& engine, const CameraInfo& cameraInfo, + math::mat4 const& fogTransform, FogOptions const& options, + FIndirectLight const* ibl) noexcept; + void prepareStructure(TextureHandle structure) noexcept; + void prepareSSAO(TextureHandle ssao, AmbientOcclusionOptions const& options) noexcept; + void prepareBlending(bool needsAlphaChannel) noexcept; + void prepareMaterialGlobals(std::array const& materialGlobals) noexcept; + + // screen-space reflection and/or refraction (SSR) + void prepareSSR(TextureHandle ssr, + bool disableSSR, + float refractionLodOffset, + ScreenSpaceReflectionsOptions const& ssrOptions) noexcept; + + void prepareHistorySSR(TextureHandle ssr, + math::mat4f const& historyProjection, + math::mat4f const& uvFromViewMatrix, + ScreenSpaceReflectionsOptions const& ssrOptions) noexcept; + + void prepareShadowMapping(backend::BufferObjectHandle shadowUniforms, bool highPrecision) noexcept; + + void prepareDirectionalLight(FEngine& engine, float exposure, + math::float3 const& sceneSpaceDirection, LightManagerInstance instance) noexcept; + + void prepareAmbientLight(FEngine& engine, + FIndirectLight const& ibl, float intensity, float exposure) noexcept; + + void prepareDynamicLights(Froxelizer& froxelizer) noexcept; + + void prepareShadowVSM(TextureHandle texture, + ShadowMappingUniforms const& shadowMappingUniforms, + VsmShadowOptions const& options) noexcept; + + void prepareShadowPCF(TextureHandle texture, + ShadowMappingUniforms const& shadowMappingUniforms) noexcept; + + void prepareShadowDPCF(TextureHandle texture, + ShadowMappingUniforms const& shadowMappingUniforms, + SoftShadowOptions const& options) noexcept; + + void prepareShadowPCSS(TextureHandle texture, + ShadowMappingUniforms const& shadowMappingUniforms, + SoftShadowOptions const& options) noexcept; + + void prepareShadowPCFDebug(TextureHandle texture, + ShadowMappingUniforms const& shadowMappingUniforms) noexcept; + + // update local data into GPU UBO + void commit(backend::DriverApi& driver) noexcept; + + void unbindSamplers(backend::DriverApi& driver) noexcept; + + // bind this UBO + void bind(backend::DriverApi& driver, uint8_t const index) const noexcept { + mDescriptorSet[index].bind(driver, DescriptorSetBindingPoints::PER_VIEW); + } + +private: + static constexpr size_t DESCRIPTOR_LAYOUT_COUNT = 8; + + void setSampler(backend::descriptor_binding_t binding, + backend::TextureHandle th, backend::SamplerParams params) noexcept; + + void setBuffer(backend::descriptor_binding_t binding, + backend::BufferObjectHandle boh, uint32_t offset, uint32_t size) noexcept; + + TypedUniformBuffer& mUniforms; + std::array mDescriptorSetLayout; + std::array mDescriptorSet; + static void prepareShadowSampling(PerViewUib& uniforms, + ShadowMappingUniforms const& shadowMappingUniforms) noexcept; +}; + +} // namespace filament + +#endif //TNT_FILAMENT_PERVIEWUNIFORMS_H diff --git a/filament/src/ds/DescriptorSet.cpp b/filament/src/ds/DescriptorSet.cpp new file mode 100644 index 00000000000..01348dc1d58 --- /dev/null +++ b/filament/src/ds/DescriptorSet.cpp @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "DescriptorSet.h" + +#include "DescriptorSetLayout.h" + +#include "details/Engine.h" + +#include + +#include +#include + +#include +#include +#include + +#include +#include + +#include + +namespace filament { + +DescriptorSet::DescriptorSet() noexcept = default; + +DescriptorSet::~DescriptorSet() noexcept { + // make sure we're not leaking the descriptor set handle + assert_invariant(!mDescriptorSetHandle); +} + +DescriptorSet::DescriptorSet(DescriptorSetLayout const& descriptorSetLayout) noexcept + : mDescriptors(descriptorSetLayout.getMaxDescriptorBinding() + 1), + mDirty(std::numeric_limits::max()), + mSetAfterCommitWarning(false) { +} + +DescriptorSet::DescriptorSet(DescriptorSet&& rhs) noexcept = default; + +DescriptorSet& DescriptorSet::operator=(DescriptorSet&& rhs) noexcept { + if (this != &rhs) { + // make sure we're not leaking the descriptor set handle + assert_invariant(!mDescriptorSetHandle); + mDescriptors = std::move(rhs.mDescriptors); + mDescriptorSetHandle = std::move(rhs.mDescriptorSetHandle); + mDirty = rhs.mDirty; + mValid = rhs.mValid; + mSetAfterCommitWarning = rhs.mSetAfterCommitWarning; + } + return *this; +} + +void DescriptorSet::terminate(FEngine::DriverApi& driver) noexcept { + if (mDescriptorSetHandle) { + driver.destroyDescriptorSet(mDescriptorSetHandle); + mDescriptorSetHandle.clear(); + } +} + +void DescriptorSet::commitSlow(DescriptorSetLayout const& layout, + FEngine::DriverApi& driver) noexcept { + mDirty.clear(); + // if we have a dirty descriptor set, + // we need to allocate a new one and reset all the descriptors + if (UTILS_LIKELY(mDescriptorSetHandle)) { + // note: if the descriptor-set is bound, doing this will essentially make it dangling. + // This can result in a use-after-free in the driver if the new one isn't bound at some + // point later. + driver.destroyDescriptorSet(mDescriptorSetHandle); + } + mDescriptorSetHandle = driver.createDescriptorSet(layout.getHandle()); + mValid.forEachSetBit([&layout, &driver, + dsh = mDescriptorSetHandle, descriptors = mDescriptors.data()] + (backend::descriptor_binding_t const binding) { + if (layout.isSampler(binding)) { + driver.updateDescriptorSetTexture(dsh, binding, + descriptors[binding].texture.th, + descriptors[binding].texture.params); + } else { + driver.updateDescriptorSetBuffer(dsh, binding, + descriptors[binding].buffer.boh, + descriptors[binding].buffer.offset, + descriptors[binding].buffer.size); + } + }); +} + +void DescriptorSet::bind(FEngine::DriverApi& driver, DescriptorSetBindingPoints const set) const noexcept { + bind(driver, set, {}); +} + +void DescriptorSet::bind(FEngine::DriverApi& driver, DescriptorSetBindingPoints const set, + backend::DescriptorSetOffsetArray dynamicOffsets) const noexcept { + // TODO: on debug check that dynamicOffsets is large enough + + assert_invariant(mDescriptorSetHandle); + + // TODO: Make sure clients do the right thing and not change material instance parameters + // within the renderpass. We have to comment the assert out since it crashed a client's debug + // build. + // assert_invariant(mDirty.none()); + if (mDirty.any() && !mSetAfterCommitWarning) { + mDirty.forEachSetBit([&](uint8_t const binding) { + utils::slog.w << "Descriptor set (handle=" << mDescriptorSetHandle.getId() + << ") binding=" << (int) binding + << " was set between begin/endRenderPass" << utils::io::endl; + }); + mSetAfterCommitWarning = true; + } + driver.bindDescriptorSet(mDescriptorSetHandle, +set, std::move(dynamicOffsets)); +} + +void DescriptorSet::setBuffer( + backend::descriptor_binding_t const binding, + backend::Handle boh, uint32_t const offset, uint32_t const size) noexcept { + // TODO: validate it's the right kind of descriptor + if (mDescriptors[binding].buffer.boh != boh || mDescriptors[binding].buffer.size != size) { + // we don't set the dirty bit if only offset changes + mDirty.set(binding); + } + mDescriptors[binding].buffer = { boh, offset, size }; + mValid.set(binding, (bool)boh); +} + +void DescriptorSet::setSampler( + backend::descriptor_binding_t const binding, + backend::Handle th, backend::SamplerParams const params) noexcept { + // TODO: validate it's the right kind of descriptor + if (mDescriptors[binding].texture.th != th || mDescriptors[binding].texture.params != params) { + mDirty.set(binding); + } + mDescriptors[binding].texture = { th, params }; + mValid.set(binding, (bool)th); +} + +DescriptorSet DescriptorSet::duplicate(DescriptorSetLayout const& layout) const noexcept { + DescriptorSet set{layout}; + set.mDescriptors = mDescriptors; // Use the vector's assignment operator + set.mDirty = mDirty; + set.mValid = mValid; + return set; +} + +} // namespace filament diff --git a/filament/src/ds/DescriptorSet.h b/filament/src/ds/DescriptorSet.h new file mode 100644 index 00000000000..7a9f57d202c --- /dev/null +++ b/filament/src/ds/DescriptorSet.h @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_DETAILS_DESCRIPTORSET_H +#define TNT_FILAMENT_DETAILS_DESCRIPTORSET_H + +#include "DescriptorSetLayout.h" + +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include + +namespace filament { + +class DescriptorSet { +public: + DescriptorSet() noexcept; + explicit DescriptorSet(DescriptorSetLayout const& descriptorSetLayout) noexcept; + DescriptorSet(DescriptorSet const&) = delete; + DescriptorSet(DescriptorSet&& rhs) noexcept; + DescriptorSet& operator=(DescriptorSet const&) = delete; + DescriptorSet& operator=(DescriptorSet&& rhs) noexcept; + ~DescriptorSet() noexcept; + + void terminate(backend::DriverApi& driver) noexcept; + + // update the descriptors if needed + void commit(DescriptorSetLayout const& layout, backend::DriverApi& driver) noexcept { + if (UTILS_UNLIKELY(mDirty.any())) { + commitSlow(layout, driver); + } + } + + void commitSlow(DescriptorSetLayout const& layout, backend::DriverApi& driver) noexcept; + + // bind the descriptor set + void bind(backend::DriverApi& driver, DescriptorSetBindingPoints set) const noexcept; + + void bind(backend::DriverApi& driver, DescriptorSetBindingPoints set, + backend::DescriptorSetOffsetArray dynamicOffsets) const noexcept; + + // sets a ubo/ssbo descriptor + void setBuffer(backend::descriptor_binding_t binding, + backend::Handle boh, + uint32_t offset, uint32_t size) noexcept; + + // sets a sampler descriptor + void setSampler(backend::descriptor_binding_t binding, + backend::Handle th, + backend::SamplerParams params) noexcept; + + // Used for duplicating material + DescriptorSet duplicate(DescriptorSetLayout const& layout) const noexcept; + + backend::DescriptorSetHandle getHandle() const noexcept { + return mDescriptorSetHandle; + } + + utils::bitset64 getValidDescriptors() const noexcept { + return mValid; + } + +private: + struct Desc { + Desc() noexcept { } + union { + struct { + backend::Handle boh; + uint32_t offset; + uint32_t size; + } buffer{}; + struct { + backend::Handle th; + backend::SamplerParams params; + uint32_t padding; + } texture; + }; + }; + + utils::FixedCapacityVector mDescriptors; // 16 + mutable utils::bitset64 mDirty; // 8 + mutable utils::bitset64 mValid; // 8 + backend::DescriptorSetHandle mDescriptorSetHandle; // 4 + mutable bool mSetAfterCommitWarning = false; // 1 +}; + +} // namespace filament + +#endif //TNT_FILAMENT_DETAILS_DESCRIPTORSET_H diff --git a/filament/src/ds/DescriptorSetLayout.cpp b/filament/src/ds/DescriptorSetLayout.cpp new file mode 100644 index 00000000000..92134e5de01 --- /dev/null +++ b/filament/src/ds/DescriptorSetLayout.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "DescriptorSetLayout.h" + +#include "HwDescriptorSetLayoutFactory.h" + +#include "details/Engine.h" + +#include + +#include +#include + +namespace filament { + +DescriptorSetLayout::DescriptorSetLayout() noexcept = default; + +DescriptorSetLayout::DescriptorSetLayout( + HwDescriptorSetLayoutFactory& factory, + backend::DriverApi& driver, + backend::DescriptorSetLayout descriptorSetLayout) noexcept { + for (auto&& desc : descriptorSetLayout.bindings) { + mMaxDescriptorBinding = std::max(mMaxDescriptorBinding, desc.binding); + mSamplers.set(desc.binding, + desc.type == backend::DescriptorType::SAMPLER || + desc.type == backend::DescriptorType::SAMPLER_EXTERNAL); + mUniformBuffers.set(desc.binding, + desc.type == backend::DescriptorType::UNIFORM_BUFFER); + } + + mDescriptorSetLayoutHandle = factory.create(driver, + std::move(descriptorSetLayout)); +} + +void DescriptorSetLayout::terminate( + HwDescriptorSetLayoutFactory& factory, + backend::DriverApi& driver) noexcept { + if (mDescriptorSetLayoutHandle) { + factory.destroy(driver, mDescriptorSetLayoutHandle); + } +} + +DescriptorSetLayout::DescriptorSetLayout(DescriptorSetLayout&& rhs) noexcept = default; + +DescriptorSetLayout& DescriptorSetLayout::operator=(DescriptorSetLayout&& rhs) noexcept = default; + +} // namespace filament diff --git a/filament/src/ds/DescriptorSetLayout.h b/filament/src/ds/DescriptorSetLayout.h new file mode 100644 index 00000000000..44b5d478509 --- /dev/null +++ b/filament/src/ds/DescriptorSetLayout.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_DESCRIPTORSETLAYOUT_H +#define TNT_FILAMENT_DESCRIPTORSETLAYOUT_H + +#include + +#include +#include + +#include + +#include +#include + +namespace filament { + +class HwDescriptorSetLayoutFactory; + +class DescriptorSetLayout { +public: + DescriptorSetLayout() noexcept; + DescriptorSetLayout( + HwDescriptorSetLayoutFactory& factory, + backend::DriverApi& driver, + backend::DescriptorSetLayout descriptorSetLayout) noexcept; + + DescriptorSetLayout(DescriptorSetLayout const&) = delete; + DescriptorSetLayout(DescriptorSetLayout&& rhs) noexcept; + DescriptorSetLayout& operator=(DescriptorSetLayout const&) = delete; + DescriptorSetLayout& operator=(DescriptorSetLayout&& rhs) noexcept; + + void terminate( + HwDescriptorSetLayoutFactory& factory, + backend::DriverApi& driver) noexcept; + + backend::DescriptorSetLayoutHandle getHandle() const noexcept { + return mDescriptorSetLayoutHandle; + } + + size_t getMaxDescriptorBinding() const noexcept { + return mMaxDescriptorBinding; + } + + bool isSampler(backend::descriptor_binding_t const binding) const noexcept { + return mSamplers[binding]; + } + + utils::bitset64 getSamplerDescriptors() const noexcept { + return mSamplers; + } + + utils::bitset64 getUniformBufferDescriptors() const noexcept { + return mUniformBuffers; + } + +private: + backend::DescriptorSetLayoutHandle mDescriptorSetLayoutHandle; + utils::bitset64 mSamplers; + utils::bitset64 mUniformBuffers; + uint8_t mMaxDescriptorBinding = 0; +}; + + +} // namespace filament + +#endif //TNT_FILAMENT_DESCRIPTORSETLAYOUT_H diff --git a/filament/src/ds/PostProcessDescriptorSet.cpp b/filament/src/ds/PostProcessDescriptorSet.cpp new file mode 100644 index 00000000000..8ed72e79a46 --- /dev/null +++ b/filament/src/ds/PostProcessDescriptorSet.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "PostProcessDescriptorSet.h" + +#include "HwDescriptorSetLayoutFactory.h" +#include "TypedUniformBuffer.h" + +#include "details/Engine.h" + +#include +#include +#include + +#include + +namespace filament { + +using namespace backend; +using namespace math; + +PostProcessDescriptorSet::PostProcessDescriptorSet() noexcept = default; + +void PostProcessDescriptorSet::init(FEngine& engine) noexcept { + + // create the descriptor-set layout + mDescriptorSetLayout = filament::DescriptorSetLayout{ + engine.getDescriptorSetLayoutFactory(), + engine.getDriverApi(), descriptor_sets::getPostProcessLayout() }; + + // create the descriptor-set from the layout + mDescriptorSet = DescriptorSet{ mDescriptorSetLayout }; +} + +void PostProcessDescriptorSet::terminate(HwDescriptorSetLayoutFactory& factory, DriverApi& driver) { + mDescriptorSet.terminate(driver); + mDescriptorSetLayout.terminate(factory, driver); +} + +void PostProcessDescriptorSet::setFrameUniforms(DriverApi& driver, + TypedUniformBuffer& uniforms) noexcept { + // initialize the descriptor-set + mDescriptorSet.setBuffer(+PerViewBindingPoints::FRAME_UNIFORMS, + uniforms.getUboHandle(), 0, uniforms.getSize()); + + mDescriptorSet.commit(mDescriptorSetLayout, driver); +} + +void PostProcessDescriptorSet::bind(DriverApi& driver) noexcept { + mDescriptorSet.bind(driver, DescriptorSetBindingPoints::PER_VIEW); +} + +} // namespace filament + diff --git a/filament/src/ds/PostProcessDescriptorSet.h b/filament/src/ds/PostProcessDescriptorSet.h new file mode 100644 index 00000000000..e89d11180c6 --- /dev/null +++ b/filament/src/ds/PostProcessDescriptorSet.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_POSTPROCESSINGDESCRIPTORSET_H +#define TNT_FILAMENT_POSTPROCESSINGDESCRIPTORSET_H + +#include "DescriptorSet.h" + +#include "DescriptorSetLayout.h" + +#include "TypedUniformBuffer.h" + +#include + +#include + +namespace filament { + +class FEngine; +class HwDescriptorSetLayoutFactory; + +class PostProcessDescriptorSet { +public: + explicit PostProcessDescriptorSet() noexcept; + + void init(FEngine& engine) noexcept; + + void terminate(HwDescriptorSetLayoutFactory& factory, backend::DriverApi& driver); + + void setFrameUniforms(backend::DriverApi& driver, + TypedUniformBuffer& uniforms) noexcept; + + void bind(backend::DriverApi& driver) noexcept; + + DescriptorSetLayout const& getLayout() const noexcept { + return mDescriptorSetLayout; + } + +private: + DescriptorSetLayout mDescriptorSetLayout; + DescriptorSet mDescriptorSet; +}; + +} // namespace filament + +#endif //TNT_FILAMENT_POSTPROCESSINGDESCRIPTORSET_H diff --git a/filament/src/ds/ShadowMapDescriptorSet.cpp b/filament/src/ds/ShadowMapDescriptorSet.cpp new file mode 100644 index 00000000000..e2cceecce90 --- /dev/null +++ b/filament/src/ds/ShadowMapDescriptorSet.cpp @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ShadowMapDescriptorSet.h" + +#include "details/Camera.h" +#include "details/Engine.h" + +#include +#include +#include + +#include + +#include + +#include + +#include + +namespace filament { + +using namespace backend; +using namespace math; + +ShadowMapDescriptorSet::ShadowMapDescriptorSet(FEngine& engine) noexcept { + DriverApi& driver = engine.getDriverApi(); + + mUniformBufferHandle = driver.createBufferObject(sizeof(PerViewUib), + BufferObjectBinding::UNIFORM, BufferUsage::DYNAMIC); + + // create the descriptor-set from the layout + mDescriptorSet = DescriptorSet{ engine.getPerViewDescriptorSetLayoutDepthVariant() }; + + // initialize the descriptor-set + mDescriptorSet.setBuffer(+PerViewBindingPoints::FRAME_UNIFORMS, + mUniformBufferHandle, 0, sizeof(PerViewUib)); +} + +void ShadowMapDescriptorSet::terminate(DriverApi& driver) { + mDescriptorSet.terminate(driver); + driver.destroyBufferObject(mUniformBufferHandle); +} + +PerViewUib& ShadowMapDescriptorSet::edit(Transaction const& transaction) noexcept { + assert_invariant(transaction.uniforms); + return *transaction.uniforms; +} + +void ShadowMapDescriptorSet::prepareCamera(Transaction const& transaction, + DriverApi& driver, const CameraInfo& camera) noexcept { + mat4f const& viewFromWorld = camera.view; + mat4f const& worldFromView = camera.model; + mat4f const& clipFromView = camera.projection; + + const mat4f viewFromClip{ inverse((mat4)camera.projection) }; + const mat4f clipFromWorld{ highPrecisionMultiply(clipFromView, viewFromWorld) }; + const mat4f worldFromClip{ highPrecisionMultiply(worldFromView, viewFromClip) }; + + auto& s = edit(transaction); + s.viewFromWorldMatrix = viewFromWorld; // view + s.worldFromViewMatrix = worldFromView; // model + s.clipFromViewMatrix = clipFromView; // projection + s.viewFromClipMatrix = viewFromClip; // 1/projection + s.clipFromWorldMatrix[0] = clipFromWorld; // projection * view + s.worldFromClipMatrix = worldFromClip; // 1/(projection * view) + s.userWorldFromWorldMatrix = mat4f(inverse(camera.worldTransform)); + s.clipTransform = camera.clipTransform; + s.cameraFar = camera.zf; + s.oneOverFarMinusNear = 1.0f / (camera.zf - camera.zn); + s.nearOverFarMinusNear = camera.zn / (camera.zf - camera.zn); + + // with a clip-space of [-w, w] ==> z' = -z + // with a clip-space of [0, w] ==> z' = (w - z)/2 + s.clipControl = driver.getClipSpaceParams(); +} + +void ShadowMapDescriptorSet::prepareLodBias(Transaction const& transaction, float const bias) noexcept { + auto& s = edit(transaction); + s.lodBias = bias; +} + +void ShadowMapDescriptorSet::prepareViewport(Transaction const& transaction, + backend::Viewport const& viewport) noexcept { + float2 const dimensions{ viewport.width, viewport.height }; + auto& s = edit(transaction); + s.resolution = { dimensions, 1.0f / dimensions }; + s.logicalViewportScale = 1.0f; + s.logicalViewportOffset = 0.0f; +} + +void ShadowMapDescriptorSet::prepareTime(Transaction const& transaction, + FEngine const& engine, float4 const& userTime) noexcept { + auto& s = edit(transaction); + const uint64_t oneSecondRemainder = engine.getEngineTime().count() % 1'000'000'000; + const float fraction = float(double(oneSecondRemainder) / 1'000'000'000.0); + s.time = fraction; + s.userTime = userTime; +} + +void ShadowMapDescriptorSet::prepareShadowMapping(Transaction const& transaction, + bool const highPrecision) noexcept { + auto& s = edit(transaction); + constexpr float low = 5.54f; // ~ std::log(std::numeric_limits::max()) * 0.5f; + constexpr float high = 42.0f; // ~ std::log(std::numeric_limits::max()) * 0.5f; + s.vsmExponent = highPrecision ? high : low; +} + +ShadowMapDescriptorSet::Transaction ShadowMapDescriptorSet::open(DriverApi& driver) noexcept { + Transaction transaction; + // TODO: use out-of-line buffer if too large + transaction.uniforms = (PerViewUib *)driver.allocate(sizeof(PerViewUib), 16); + assert_invariant(transaction.uniforms); + return transaction; +} + +void ShadowMapDescriptorSet::commit(Transaction& transaction, + FEngine& engine, DriverApi& driver) noexcept { + driver.updateBufferObject(mUniformBufferHandle, { + transaction.uniforms, sizeof(PerViewUib) }, 0); + mDescriptorSet.commit(engine.getPerViewDescriptorSetLayoutDepthVariant(), driver); + transaction.uniforms = nullptr; +} + +void ShadowMapDescriptorSet::bind(DriverApi& driver) noexcept { + mDescriptorSet.bind(driver, DescriptorSetBindingPoints::PER_VIEW); +} + +} // namespace filament + diff --git a/filament/src/ds/ShadowMapDescriptorSet.h b/filament/src/ds/ShadowMapDescriptorSet.h new file mode 100644 index 00000000000..e280330be0c --- /dev/null +++ b/filament/src/ds/ShadowMapDescriptorSet.h @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_SHADOWMAPDESCRIPTORSET_H +#define TNT_FILAMENT_SHADOWMAPDESCRIPTORSET_H + +#include "DescriptorSet.h" + +#include "DescriptorSetLayout.h" + +#include "private/filament/UibStructs.h" + +#include +#include +#include + +#include + +namespace filament { + +struct CameraInfo; + +class FEngine; +class LightManager; + +/* + * PerShadowMapUniforms manages the UBO needed to generate our shadow maps. Internally it just + * holds onto a `PerViewUniform` UBO handle, but doesn't keep any shadow copy of it, instead it + * writes the data directly into the CommandStream, for this reason partial update of the data + * is not possible. + */ +class ShadowMapDescriptorSet { + +public: + class Transaction { + friend ShadowMapDescriptorSet; + PerViewUib* uniforms = nullptr; + Transaction() = default; // disallow creation by the caller + }; + + explicit ShadowMapDescriptorSet(FEngine& engine) noexcept; + + void terminate(backend::DriverApi& driver); + + static void prepareCamera(Transaction const& transaction, + backend::DriverApi& driver, const CameraInfo& camera) noexcept; + + static void prepareLodBias(Transaction const& transaction, + float bias) noexcept; + + static void prepareViewport(Transaction const& transaction, + backend::Viewport const& viewport) noexcept; + + static void prepareTime(Transaction const& transaction, + FEngine const& engine, math::float4 const& userTime) noexcept; + + static void prepareShadowMapping(Transaction const& transaction, + bool highPrecision) noexcept; + + static Transaction open(backend::DriverApi& driver) noexcept; + + // update local data into GPU UBO + void commit(Transaction& transaction, FEngine& engine, backend::DriverApi& driver) noexcept; + + // bind this UBO + void bind(backend::DriverApi& driver) noexcept; + +private: + static PerViewUib& edit(Transaction const& transaction) noexcept; + backend::Handle mUniformBufferHandle; + DescriptorSet mDescriptorSet; +}; + +} // namespace filament + +#endif //TNT_FILAMENT_SHADOWMAPDESCRIPTORSET_H diff --git a/filament/src/ds/SsrPassDescriptorSet.cpp b/filament/src/ds/SsrPassDescriptorSet.cpp new file mode 100644 index 00000000000..e20a6bbfabb --- /dev/null +++ b/filament/src/ds/SsrPassDescriptorSet.cpp @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SsrPassDescriptorSet.h" + +#include "TypedUniformBuffer.h" + +#include "details/Engine.h" + +#include +#include + +#include +#include + +#include + +#include + +#include + +namespace filament { + +using namespace backend; +using namespace math; + +SsrPassDescriptorSet::SsrPassDescriptorSet() noexcept = default; + +void SsrPassDescriptorSet::init(FEngine& engine) noexcept { + // create the descriptor-set from the layout + mDescriptorSet = DescriptorSet{ engine.getPerViewDescriptorSetLayoutSsrVariant() }; + + // create a dummy Shadow UBO (see comment in setFrameUniforms() below) + mShadowUbh = engine.getDriverApi().createBufferObject(sizeof(ShadowUib), + BufferObjectBinding::UNIFORM, BufferUsage::STATIC); +} + +void SsrPassDescriptorSet::terminate(DriverApi& driver) { + mDescriptorSet.terminate(driver); + driver.destroyBufferObject(mShadowUbh); +} + +void SsrPassDescriptorSet::setFrameUniforms(TypedUniformBuffer& uniforms) noexcept { + // initialize the descriptor-set + mDescriptorSet.setBuffer(+PerViewBindingPoints::FRAME_UNIFORMS, + uniforms.getUboHandle(), 0, uniforms.getSize()); + + // This is actually not used for the SSR variants, but the descriptor-set layout needs + // to have this UBO because the fragment shader used is the "generic" one. Both Metal + // and GL would be okay without this, but Vulkan's validation layer would complain. + mDescriptorSet.setBuffer(+PerViewBindingPoints::SHADOWS, mShadowUbh, 0, sizeof(ShadowUib)); + + mUniforms = std::addressof(uniforms); +} + +void SsrPassDescriptorSet::prepareHistorySSR(Handle ssr, + mat4f const& historyProjection, + mat4f const& uvFromViewMatrix, + ScreenSpaceReflectionsOptions const& ssrOptions) noexcept { + + mDescriptorSet.setSampler(+PerViewBindingPoints::SSR, ssr, { + .filterMag = SamplerMagFilter::LINEAR, + .filterMin = SamplerMinFilter::LINEAR + }); + + assert_invariant(mUniforms); + auto& s = mUniforms->edit(); + s.ssrReprojection = historyProjection; + s.ssrUvFromViewMatrix = uvFromViewMatrix; + s.ssrThickness = ssrOptions.thickness; + s.ssrBias = ssrOptions.bias; + s.ssrDistance = ssrOptions.enabled ? ssrOptions.maxDistance : 0.0f; + s.ssrStride = ssrOptions.stride; +} + +void SsrPassDescriptorSet::prepareStructure(Handle structure) noexcept { + // sampler must be NEAREST + mDescriptorSet.setSampler(+PerViewBindingPoints::STRUCTURE, structure, {}); +} + +void SsrPassDescriptorSet::commit(FEngine& engine) noexcept { + assert_invariant(mUniforms); + DriverApi& driver = engine.getDriverApi(); + if (mUniforms->isDirty()) { + driver.updateBufferObject(mUniforms->getUboHandle(), + mUniforms->toBufferDescriptor(driver), 0); + } + mDescriptorSet.commit(engine.getPerViewDescriptorSetLayoutSsrVariant(), driver); +} + +void SsrPassDescriptorSet::bind(DriverApi& driver) noexcept { + mDescriptorSet.bind(driver, DescriptorSetBindingPoints::PER_VIEW); +} + +} // namespace filament + diff --git a/filament/src/ds/SsrPassDescriptorSet.h b/filament/src/ds/SsrPassDescriptorSet.h new file mode 100644 index 00000000000..526ae790119 --- /dev/null +++ b/filament/src/ds/SsrPassDescriptorSet.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_SSRPASSDESCRIPTORSET_H +#define TNT_FILAMENT_SSRPASSDESCRIPTORSET_H + +#include "DescriptorSet.h" + +#include "DescriptorSetLayout.h" + +#include "TypedUniformBuffer.h" + +#include + +#include +#include + +#include + +namespace filament { + +class FEngine; + +struct ScreenSpaceReflectionsOptions; + +class SsrPassDescriptorSet { + + using TextureHandle = backend::Handle; + +public: + SsrPassDescriptorSet() noexcept; + + void init(FEngine& engine) noexcept; + + void terminate(backend::DriverApi& driver); + + void setFrameUniforms(TypedUniformBuffer& uniforms) noexcept; + + void prepareStructure(TextureHandle structure) noexcept; + + void prepareHistorySSR(TextureHandle ssr, + math::mat4f const& historyProjection, + math::mat4f const& uvFromViewMatrix, + ScreenSpaceReflectionsOptions const& ssrOptions) noexcept; + + + // update local data into GPU UBO + void commit(FEngine& engine) noexcept; + + // bind this descriptor set + void bind(backend::DriverApi& driver) noexcept; + +private: + TypedUniformBuffer* mUniforms = nullptr; + DescriptorSet mDescriptorSet; + backend::BufferObjectHandle mShadowUbh; +}; + +} // namespace filament + +#endif //TNT_FILAMENT_SSRPASSDESCRIPTORSET_H diff --git a/filament/src/ds/TypedBuffer.h b/filament/src/ds/TypedBuffer.h new file mode 100644 index 00000000000..22f245931aa --- /dev/null +++ b/filament/src/ds/TypedBuffer.h @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_TYPEDBUFFER_H +#define TNT_FILAMENT_TYPEDBUFFER_H + +#include + +#include + +#include +#include + +namespace filament { + +template +class TypedBuffer { // NOLINT(cppcoreguidelines-pro-type-member-init) +public: + + T& itemAt(size_t i) noexcept { + mSomethingDirty = true; + return mBuffer[i]; + } + + T& edit() noexcept { + return itemAt(0); + } + + // size of the uniform buffer in bytes + size_t getSize() const noexcept { return sizeof(T) * N; } + + // return if any uniform has been changed + bool isDirty() const noexcept { return mSomethingDirty; } + + // mark the whole buffer as "clean" (no modified uniforms) + void clean() const noexcept { mSomethingDirty = false; } + + // helper functions + + backend::BufferDescriptor toBufferDescriptor(backend::DriverApi& driver) const noexcept { + return toBufferDescriptor(driver, 0, getSize()); + } + + // copy the UBO data and cleans the dirty bits + backend::BufferDescriptor toBufferDescriptor( + backend::DriverApi& driver, size_t const offset, size_t const size) const noexcept { + backend::BufferDescriptor p; + p.size = size; + p.buffer = driver.allocate(p.size); // TODO: use out-of-line buffer if too large + memcpy(p.buffer, reinterpret_cast(mBuffer) + offset, p.size); // inlined + clean(); + return p; + } + +private: + T mBuffer[N]; + mutable bool mSomethingDirty = false; +}; + +} // namespace filament + +#endif // TNT_FILAMENT_TYPEDBUFFER_H diff --git a/filament/src/ds/TypedUniformBuffer.h b/filament/src/ds/TypedUniformBuffer.h new file mode 100644 index 00000000000..44d26995667 --- /dev/null +++ b/filament/src/ds/TypedUniformBuffer.h @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_TYPEDUNIFORMBUFFER_H +#define TNT_FILAMENT_TYPEDUNIFORMBUFFER_H + +#include "TypedBuffer.h" + +#include +#include +#include + +#include + +namespace filament { + +template +class TypedUniformBuffer { +public: + + explicit TypedUniformBuffer(backend::DriverApi& driver) noexcept { + mUboHandle = driver.createBufferObject( + mTypedBuffer.getSize(), + backend::BufferObjectBinding::UNIFORM, + backend::BufferUsage::DYNAMIC); + } + + void terminate(backend::DriverApi& driver) noexcept { + driver.destroyBufferObject(mUboHandle); + } + + TypedBuffer& getTypedBuffer() noexcept { + return mTypedBuffer; + } + + backend::BufferObjectHandle getUboHandle() const noexcept { + return mUboHandle; + } + + T& itemAt(size_t i) noexcept { + return mTypedBuffer.itemAt(i); + } + + T& edit() noexcept { + return mTypedBuffer.itemAt(0); + } + + // size of the uniform buffer in bytes + size_t getSize() const noexcept { return mTypedBuffer.getSize(); } + + // return if any uniform has been changed + bool isDirty() const noexcept { return mTypedBuffer.isDirty(); } + + // mark the whole buffer as "clean" (no modified uniforms) + void clean() const noexcept { mTypedBuffer.clean(); } + + // helper functions + backend::BufferDescriptor toBufferDescriptor(backend::DriverApi& driver) const noexcept { + return mTypedBuffer.toBufferDescriptor(driver); + } + + // copy the UBO data and cleans the dirty bits + backend::BufferDescriptor toBufferDescriptor( + backend::DriverApi& driver, size_t offset, size_t size) const noexcept { + return mTypedBuffer.toBufferDescriptor(driver, offset, size); + } + +private: + TypedBuffer mTypedBuffer; + backend::BufferObjectHandle mUboHandle; +}; + +} // namespace filament + + +#endif //TNT_FILAMENT_TYPEDUNIFORMBUFFER_H diff --git a/filament/src/fg/Blackboard.cpp b/filament/src/fg/Blackboard.cpp index e2044a8079b..62853cb1748 100644 --- a/filament/src/fg/Blackboard.cpp +++ b/filament/src/fg/Blackboard.cpp @@ -24,7 +24,7 @@ Blackboard::Blackboard() noexcept = default; Blackboard::~Blackboard() noexcept = default; -FrameGraphHandle Blackboard::getHandle(std::string_view name) const noexcept { +FrameGraphHandle Blackboard::getHandle(std::string_view const name) const noexcept { auto it = mMap.find(name); if (it != mMap.end()) { return it->second; @@ -32,17 +32,17 @@ FrameGraphHandle Blackboard::getHandle(std::string_view name) const noexcept { return {}; } -FrameGraphHandle& Blackboard::operator [](std::string_view name) noexcept { +FrameGraphHandle& Blackboard::operator [](std::string_view const name) noexcept { auto[pos, _] = mMap.insert_or_assign(name, FrameGraphHandle{}); return pos->second; } -void Blackboard::put(std::string_view name, FrameGraphHandle handle) noexcept { +void Blackboard::put(std::string_view const name, FrameGraphHandle const handle) noexcept { operator[](name) = handle; } -void Blackboard::remove(std::string_view name) noexcept { +void Blackboard::remove(std::string_view const name) noexcept { mMap.erase(name); } diff --git a/filament/src/fg/DependencyGraph.cpp b/filament/src/fg/DependencyGraph.cpp index c018bcf9823..fbcbf978866 100644 --- a/filament/src/fg/DependencyGraph.cpp +++ b/filament/src/fg/DependencyGraph.cpp @@ -34,7 +34,7 @@ uint32_t DependencyGraph::generateNodeId() noexcept { return mNodes.size(); } -void DependencyGraph::registerNode(Node* node, NodeID id) noexcept { +void DependencyGraph::registerNode(Node* node, NodeID const id) noexcept { // Node* is not fully constructed here assert_invariant(id == mNodes.size()); @@ -46,14 +46,14 @@ void DependencyGraph::registerNode(Node* node, NodeID id) noexcept { nodes.push_back(node); } -bool DependencyGraph::isEdgeValid(DependencyGraph::Edge const* edge) const noexcept { +bool DependencyGraph::isEdgeValid(Edge const* edge) const noexcept { auto& nodes = mNodes; Node const* from = nodes[edge->from]; Node const* to = nodes[edge->to]; return !from->isCulled() && !to->isCulled(); } -void DependencyGraph::link(DependencyGraph::Edge* edge) noexcept { +void DependencyGraph::link(Edge* edge) noexcept { // here we manually grow the fixed-size vector EdgeContainer& edges = mEdges; if (UTILS_UNLIKELY(edges.capacity() == edges.size())) { @@ -72,7 +72,7 @@ DependencyGraph::NodeContainer const& DependencyGraph::getNodes() const noexcept } DependencyGraph::EdgeContainer DependencyGraph::getIncomingEdges( - DependencyGraph::Node const* node) const noexcept { + Node const* node) const noexcept { // TODO: we might need something more efficient auto result = EdgeContainer::with_capacity(mEdges.size()); NodeID const nodeId = node->getId(); @@ -83,7 +83,7 @@ DependencyGraph::EdgeContainer DependencyGraph::getIncomingEdges( } DependencyGraph::EdgeContainer DependencyGraph::getOutgoingEdges( - DependencyGraph::Node const* node) const noexcept { + Node const* node) const noexcept { // TODO: we might need something more efficient auto result = EdgeContainer::with_capacity(mEdges.size()); NodeID const nodeId = node->getId(); @@ -93,11 +93,11 @@ DependencyGraph::EdgeContainer DependencyGraph::getOutgoingEdges( return result; } -DependencyGraph::Node const* DependencyGraph::getNode(DependencyGraph::NodeID id) const noexcept { +DependencyGraph::Node const* DependencyGraph::getNode(NodeID const id) const noexcept { return mNodes[id]; } -DependencyGraph::Node* DependencyGraph::getNode(DependencyGraph::NodeID id) noexcept { +DependencyGraph::Node* DependencyGraph::getNode(NodeID const id) noexcept { return mNodes[id]; } @@ -197,7 +197,7 @@ bool DependencyGraph::isAcyclic() const noexcept { DependencyGraph graph; graph.mEdges = mEdges; graph.mNodes = mNodes; - return DependencyGraph::isAcyclicInternal(graph); + return isAcyclicInternal(graph); #else return true; #endif diff --git a/filament/src/fg/FrameGraph.cpp b/filament/src/fg/FrameGraph.cpp index a9f31318314..6ccd8957662 100644 --- a/filament/src/fg/FrameGraph.cpp +++ b/filament/src/fg/FrameGraph.cpp @@ -16,17 +16,32 @@ #include "fg/FrameGraph.h" #include "fg/details/PassNode.h" +#include "fg/details/Resource.h" #include "fg/details/ResourceNode.h" #include "fg/details/DependencyGraph.h" +#include "FrameGraphId.h" +#include "FrameGraphPass.h" +#include "FrameGraphRenderPass.h" +#include "FrameGraphTexture.h" +#include "ResourceAllocator.h" + #include "details/Engine.h" #include #include +#include +#include +#include #include #include +#include +#include + +#include + namespace filament { inline FrameGraph::Builder::Builder(FrameGraph& fg, PassNode* passNode) noexcept @@ -37,7 +52,7 @@ void FrameGraph::Builder::sideEffect() noexcept { mPassNode->makeTarget(); } -const char* FrameGraph::Builder::getName(FrameGraphHandle handle) const noexcept { +const char* FrameGraph::Builder::getName(FrameGraphHandle const handle) const noexcept { return mFrameGraph.getResource(handle)->name; } @@ -51,7 +66,7 @@ uint32_t FrameGraph::Builder::declareRenderPass(const char* name, FrameGraphId FrameGraph::Builder::declareRenderPass( FrameGraphId color, uint32_t* index) { color = write(color); - uint32_t id = declareRenderPass(getName(color), + uint32_t const id = declareRenderPass(getName(color), { .attachments = { .color = { color }}}); if (index) *index = id; return color; @@ -59,9 +74,10 @@ FrameGraphId FrameGraph::Builder::declareRenderPass( // ------------------------------------------------------------------------------------------------ -FrameGraph::FrameGraph(ResourceAllocatorInterface& resourceAllocator) +FrameGraph::FrameGraph(ResourceAllocatorInterface& resourceAllocator, Mode const mode) : mResourceAllocator(resourceAllocator), - mArena("FrameGraph Arena", 131072), + mArena("FrameGraph Arena", 262144), + mMode(mode), mResourceSlots(mArena), mResources(mArena), mResourceNodes(mArena), @@ -179,11 +195,11 @@ FrameGraph& FrameGraph::compile() noexcept { void FrameGraph::execute(backend::DriverApi& driver) noexcept { - SYSTRACE_CALL(); - + bool const useProtectedMemory = mMode == Mode::PROTECTED; auto const& passNodes = mPassNodes; auto& resourceAllocator = mResourceAllocator; + SYSTRACE_NAME("FrameGraph"); driver.pushGroupMarker("FrameGraph"); auto first = passNodes.begin(); @@ -194,17 +210,16 @@ void FrameGraph::execute(backend::DriverApi& driver) noexcept { assert_invariant(!node->isCulled()); SYSTRACE_NAME(node->getName()); - driver.pushGroupMarker(node->getName()); // devirtualize resourcesList for (VirtualResource* resource : node->devirtualize) { assert_invariant(resource->first == node); - resource->devirtualize(resourceAllocator); + resource->devirtualize(resourceAllocator, useProtectedMemory); } // call execute - FrameGraphResources resources(*this, *node); + FrameGraphResources const resources(*this, *node); node->execute(resources, driver); // destroy concrete resources @@ -212,13 +227,12 @@ void FrameGraph::execute(backend::DriverApi& driver) noexcept { assert_invariant(resource->last == node); resource->destroy(resourceAllocator); } - driver.popGroupMarker(); } driver.popGroupMarker(); } -void FrameGraph::addPresentPass(const std::function& setup) noexcept { +void FrameGraph::addPresentPass(const std::function& setup) noexcept { PresentPassNode* node = mArena.make(*this); mPassNodes.push_back(node); Builder builder(*this, node); @@ -238,10 +252,10 @@ FrameGraphHandle FrameGraph::createNewVersion(FrameGraphHandle handle) noexcept assert_invariant(handle); ResourceNode* const node = getActiveResourceNode(handle); assert_invariant(node); - FrameGraphHandle parent = node->getParentHandle(); + FrameGraphHandle const parent = node->getParentHandle(); ResourceSlot& slot = getResourceSlot(handle); slot.version = ++handle.version; // increase the parent's version - slot.nid = mResourceNodes.size(); // create the new parent node + slot.nid = (ResourceSlot::Index)mResourceNodes.size(); // create the new parent node ResourceNode* newNode = mArena.make(*this, handle, parent); mResourceNodes.push_back(newNode); return handle; @@ -253,7 +267,7 @@ ResourceNode* FrameGraph::createNewVersionForSubresourceIfNeeded(ResourceNode* n // if we don't already have a new ResourceNode for this resource, create one. // we keep the old ResourceNode index, so we can direct all the reads to it. slot.sid = slot.nid; // record the current ResourceNode of the parent - slot.nid = mResourceNodes.size(); // create the new parent node + slot.nid = (ResourceSlot::Index)mResourceNodes.size(); // create the new parent node node = mArena.make(*this, node->resourceHandle, node->getParentHandle()); mResourceNodes.push_back(node); } @@ -266,17 +280,17 @@ FrameGraphHandle FrameGraph::addResourceInternal(VirtualResource* resource) noex FrameGraphHandle FrameGraph::addSubResourceInternal(FrameGraphHandle parent, VirtualResource* resource) noexcept { - FrameGraphHandle handle(mResourceSlots.size()); + FrameGraphHandle const handle(mResourceSlots.size()); ResourceSlot& slot = mResourceSlots.emplace_back(); - slot.rid = mResources.size(); - slot.nid = mResourceNodes.size(); + slot.rid = (ResourceSlot::Index)mResources.size(); + slot.nid = (ResourceSlot::Index)mResourceNodes.size(); mResources.push_back(resource); ResourceNode* pNode = mArena.make(*this, handle, parent); mResourceNodes.push_back(pNode); return handle; } -FrameGraphHandle FrameGraph::readInternal(FrameGraphHandle handle, PassNode* passNode, +FrameGraphHandle FrameGraph::readInternal(FrameGraphHandle const handle, PassNode* passNode, const std::function& connect) { assertValid(handle); @@ -285,10 +299,10 @@ FrameGraphHandle FrameGraph::readInternal(FrameGraphHandle handle, PassNode* pas ResourceNode* const node = getActiveResourceNode(handle); // Check preconditions - bool passAlreadyAWriter = node->hasWriteFrom(passNode); - ASSERT_PRECONDITION(!passAlreadyAWriter, - "Pass \"%s\" already writes to \"%s\"", - passNode->getName(), node->getName()); + bool const passAlreadyAWriter = node->hasWriteFrom(passNode); + FILAMENT_CHECK_PRECONDITION(!passAlreadyAWriter) + << "Pass \"" << passNode->getName() << "\" already writes to \"" << node->getName() + << "\""; if (!node->hasWriterPass() && !resource->isImported()) { // TODO: we're attempting to read from a resource that was never written and is not @@ -303,7 +317,7 @@ FrameGraphHandle FrameGraph::readInternal(FrameGraphHandle handle, PassNode* pas // node to the subresource -- but we may have two parent nodes, one for reads and // one for writes, so we need to use the one for reads. auto* parentNode = node->getParentNode(); - ResourceSlot& slot = getResourceSlot(parentNode->resourceHandle); + ResourceSlot const& slot = getResourceSlot(parentNode->resourceHandle); if (slot.sid >= 0) { // we have a parent's node for reads, use that one parentNode = mResourceNodes[slot.sid]; @@ -314,7 +328,7 @@ FrameGraphHandle FrameGraph::readInternal(FrameGraphHandle handle, PassNode* pas // resource is a parent of some subresource, and it might exist as a version for // writing, in this case we need to add a dependency from its "read" version to // itself. - ResourceSlot& slot = getResourceSlot(handle); + ResourceSlot const& slot = getResourceSlot(handle); if (slot.sid >= 0) { node->setParentReadDependency(mResourceNodes[slot.sid]); } @@ -383,8 +397,8 @@ FrameGraphHandle FrameGraph::writeInternal(FrameGraphHandle handle, PassNode* pa return {}; } -FrameGraphHandle FrameGraph::forwardResourceInternal(FrameGraphHandle resourceHandle, - FrameGraphHandle replaceResourceHandle) { +FrameGraphHandle FrameGraph::forwardResourceInternal(FrameGraphHandle const resourceHandle, + FrameGraphHandle const replaceResourceHandle) { assertValid(resourceHandle); @@ -435,22 +449,22 @@ FrameGraphId FrameGraph::import(char const* name, return FrameGraphId(addResourceInternal(vresource)); } -bool FrameGraph::isValid(FrameGraphHandle handle) const { +bool FrameGraph::isValid(FrameGraphHandle const handle) const { // Code below is written this way so that we can set breakpoints easily. if (!handle.isInitialized()) { return false; } - ResourceSlot slot = getResourceSlot(handle); + ResourceSlot const& slot = getResourceSlot(handle); if (handle.version != slot.version) { return false; } return true; } -void FrameGraph::assertValid(FrameGraphHandle handle) const { - ASSERT_PRECONDITION(isValid(handle), - "Resource handle is invalid or uninitialized {id=%u, version=%u}", - (int)handle.index, (int)handle.version); +void FrameGraph::assertValid(FrameGraphHandle const handle) const { + FILAMENT_CHECK_PRECONDITION(isValid(handle)) + << "Resource handle is invalid or uninitialized {id=" << (int)handle.index + << ", version=" << (int)handle.version << "}"; } bool FrameGraph::isCulled(FrameGraphPassBase const& pass) const noexcept { diff --git a/filament/src/fg/FrameGraph.h b/filament/src/fg/FrameGraph.h index 4538801bed6..2311e689678 100644 --- a/filament/src/fg/FrameGraph.h +++ b/filament/src/fg/FrameGraph.h @@ -204,7 +204,7 @@ class FrameGraph { * @return A new handle to the FrameGraphTexture. * The input handle is no-longer valid. */ - FrameGraphId sample(FrameGraphId input) { + FrameGraphId sample(FrameGraphId const input) { return read(input, FrameGraphTexture::Usage::SAMPLEABLE); } @@ -218,7 +218,13 @@ class FrameGraph { // -------------------------------------------------------------------------------------------- - explicit FrameGraph(ResourceAllocatorInterface& resourceAllocator); + enum class Mode { + UNPROTECTED, + PROTECTED, + }; + + explicit FrameGraph(ResourceAllocatorInterface& resourceAllocator, + Mode mode = Mode::UNPROTECTED); FrameGraph(FrameGraph const&) = delete; FrameGraph& operator=(FrameGraph const&) = delete; ~FrameGraph() noexcept; @@ -478,36 +484,36 @@ class FrameGraph { FrameGraphId write(PassNode* passNode, FrameGraphId input, typename RESOURCE::Usage usage); - ResourceSlot& getResourceSlot(FrameGraphHandle handle) noexcept { + ResourceSlot& getResourceSlot(FrameGraphHandle const handle) noexcept { assert_invariant((size_t)handle.index < mResourceSlots.size()); assert_invariant((size_t)mResourceSlots[handle.index].rid < mResources.size()); assert_invariant((size_t)mResourceSlots[handle.index].nid < mResourceNodes.size()); return mResourceSlots[handle.index]; } - ResourceSlot const& getResourceSlot(FrameGraphHandle handle) const noexcept { + ResourceSlot const& getResourceSlot(FrameGraphHandle const handle) const noexcept { return const_cast(this)->getResourceSlot(handle); } - VirtualResource* getResource(FrameGraphHandle handle) noexcept { + VirtualResource* getResource(FrameGraphHandle const handle) noexcept { assert_invariant(handle.isInitialized()); ResourceSlot const& slot = getResourceSlot(handle); assert_invariant((size_t)slot.rid < mResources.size()); return mResources[slot.rid]; } - ResourceNode* getActiveResourceNode(FrameGraphHandle handle) noexcept { + ResourceNode* getActiveResourceNode(FrameGraphHandle const handle) noexcept { assert_invariant(handle); ResourceSlot const& slot = getResourceSlot(handle); assert_invariant((size_t)slot.nid < mResourceNodes.size()); return mResourceNodes[slot.nid]; } - VirtualResource const* getResource(FrameGraphHandle handle) const noexcept { + VirtualResource const* getResource(FrameGraphHandle const handle) const noexcept { return const_cast(this)->getResource(handle); } - ResourceNode const* getResourceNode(FrameGraphHandle handle) const noexcept { + ResourceNode const* getResourceNode(FrameGraphHandle const handle) const noexcept { return const_cast(this)->getActiveResourceNode(handle); } @@ -517,6 +523,7 @@ class FrameGraph { ResourceAllocatorInterface& mResourceAllocator; LinearAllocatorArena mArena; DependencyGraph mGraph; + const Mode mMode; Vector mResourceSlots; Vector mResources; @@ -527,7 +534,7 @@ class FrameGraph { template FrameGraphPass& FrameGraph::addPass(char const* name, Setup setup, Execute&& execute) { - static_assert(sizeof(Execute) < 1024, "Execute() lambda is capturing too much data."); + static_assert(sizeof(Execute) < 2048, "Execute() lambda is capturing too much data."); // create the FrameGraph pass auto* const pass = mArena.make>(std::forward(execute)); @@ -553,7 +560,7 @@ FrameGraphPass& FrameGraph::addPass(char const* name, Setup setup) { template void FrameGraph::addTrivialSideEffectPass(char const* name, Execute&& execute) { - addPass(name, [](FrameGraph::Builder& builder, auto&) { builder.sideEffect(); }, + addPass(name, [](Builder& builder, auto&) { builder.sideEffect(); }, [execute](FrameGraphResources const&, auto const&, backend::DriverApi& driver) { execute(driver); }); diff --git a/filament/src/fg/FrameGraphId.h b/filament/src/fg/FrameGraphId.h index e5b8fc8d655..eb89174ad82 100644 --- a/filament/src/fg/FrameGraphId.h +++ b/filament/src/fg/FrameGraphId.h @@ -50,7 +50,7 @@ class FrameGraphHandle { // private ctor -- this cannot be constructed by users FrameGraphHandle() noexcept = default; - explicit FrameGraphHandle(Index index) noexcept : index(index) {} + explicit FrameGraphHandle(Index const index) noexcept : index(index) {} // index to the resource handle static constexpr uint16_t UNINITIALIZED = std::numeric_limits::max(); @@ -87,7 +87,7 @@ class FrameGraphId : public FrameGraphHandle { public: using FrameGraphHandle::FrameGraphHandle; FrameGraphId() noexcept = default; - explicit FrameGraphId(FrameGraphHandle r) : FrameGraphHandle(r) { } + explicit FrameGraphId(FrameGraphHandle const r) : FrameGraphHandle(r) { } }; } // namespace filament diff --git a/filament/src/fg/FrameGraphRenderPass.h b/filament/src/fg/FrameGraphRenderPass.h index 5ab1ec97d36..a45aaf5a002 100644 --- a/filament/src/fg/FrameGraphRenderPass.h +++ b/filament/src/fg/FrameGraphRenderPass.h @@ -47,7 +47,8 @@ struct FrameGraphRenderPass { Attachments attachments{}; Viewport viewport{}; math::float4 clearColor{}; - uint8_t samples = 0; // # of samples (0 = unset, default) + uint8_t samples = 0; // # of samples (0 = unset, default) + uint8_t layerCount = 1; // # of layer (# > 1 = multiview) backend::TargetBufferFlags clearFlags{}; backend::TargetBufferFlags discardStart{}; }; diff --git a/filament/src/fg/FrameGraphResources.cpp b/filament/src/fg/FrameGraphResources.cpp index 578d914f64c..23444393f05 100644 --- a/filament/src/fg/FrameGraphResources.cpp +++ b/filament/src/fg/FrameGraphResources.cpp @@ -32,32 +32,31 @@ const char* FrameGraphResources::getPassName() const noexcept { // this perhaps weirdly returns a reference, this is to express the fact that if this method // fails, it has to assert (or throw), it can't return for e.g. a nullptr, because the public // API doesn't return pointers. -// We still use ASSERT_PRECONDITION() because these failures are due to post conditions not met. -VirtualResource& FrameGraphResources::getResource(FrameGraphHandle handle) const { - ASSERT_PRECONDITION(handle, "Uninitialized handle when using FrameGraphResources."); +// We still use FILAMENT_CHECK_PRECONDITION() because these failures are due to post conditions not met. +VirtualResource& FrameGraphResources::getResource(FrameGraphHandle const handle) const { + FILAMENT_CHECK_PRECONDITION(handle) << "Uninitialized handle when using FrameGraphResources."; VirtualResource* const resource = mFrameGraph.getResource(handle); auto& declaredHandles = mPassNode.mDeclaredHandles; const bool hasReadOrWrite = declaredHandles.find(handle.index) != declaredHandles.cend(); - ASSERT_PRECONDITION(hasReadOrWrite, - "Pass \"%s\" didn't declare any access to resource \"%s\"", - mPassNode.getName(), resource->name); + FILAMENT_CHECK_PRECONDITION(hasReadOrWrite) + << "Pass \"" << mPassNode.getName() << "\" didn't declare any access to resource \"" + << resource->name << "\""; assert_invariant(resource->refcount); return *resource; } -FrameGraphResources::RenderPassInfo FrameGraphResources::getRenderPassInfo(uint32_t id) const { +FrameGraphResources::RenderPassInfo FrameGraphResources::getRenderPassInfo(uint32_t const id) const { // this cast is safe because this can only be called from a RenderPassNode RenderPassNode const& renderPassNode = static_cast(mPassNode); RenderPassNode::RenderPassData const* pRenderPassData = renderPassNode.getRenderPassData(id); - ASSERT_PRECONDITION(pRenderPassData, - "using invalid RenderPass index %u in Pass \"%s\"", - id, mPassNode.getName()); + FILAMENT_CHECK_PRECONDITION(pRenderPassData) << "using invalid RenderPass index " << id + << " in Pass \"" << mPassNode.getName() << "\""; return { pRenderPassData->backend.target, pRenderPassData->backend.params }; } diff --git a/filament/src/fg/FrameGraphResources.h b/filament/src/fg/FrameGraphResources.h index 9bc428f1cc4..bef469c50bb 100644 --- a/filament/src/fg/FrameGraphResources.h +++ b/filament/src/fg/FrameGraphResources.h @@ -115,7 +115,7 @@ class FrameGraphResources { * @param handle to a FrameGraphTexture * @return backend concrete Texture handle */ - backend::Handle getTexture(FrameGraphId handle) const { + backend::Handle getTexture(FrameGraphId const handle) const { return get(handle).handle; } diff --git a/filament/src/fg/FrameGraphTexture.cpp b/filament/src/fg/FrameGraphTexture.cpp index 2212b78c56e..03f29ad1f22 100644 --- a/filament/src/fg/FrameGraphTexture.cpp +++ b/filament/src/fg/FrameGraphTexture.cpp @@ -23,7 +23,12 @@ namespace filament { void FrameGraphTexture::create(ResourceAllocatorInterface& resourceAllocator, const char* name, - FrameGraphTexture::Descriptor const& descriptor, FrameGraphTexture::Usage usage) noexcept { + Descriptor const& descriptor, Usage usage, + bool const useProtectedMemory) noexcept { + if (useProtectedMemory) { + // FIXME: I think we should restrict this to attachments and blit destinations only + usage |= Usage::PROTECTED; + } std::array swizzle = { descriptor.swizzle.r, descriptor.swizzle.g, diff --git a/filament/src/fg/FrameGraphTexture.h b/filament/src/fg/FrameGraphTexture.h index 99a86d87e38..cb785bb7b6b 100644 --- a/filament/src/fg/FrameGraphTexture.h +++ b/filament/src/fg/FrameGraphTexture.h @@ -34,7 +34,8 @@ namespace filament { * struct SubResourceDescriptor; * a Usage bitmask * And declares and define: - * void create(ResourceAllocatorInterface&, const char* name, Descriptor const&, Usage) noexcept; + * void create(ResourceAllocatorInterface&, const char* name, Descriptor const&, Usage, + * bool useProtectedMemory) noexcept; * void destroy(ResourceAllocatorInterface&) noexcept; */ struct FrameGraphTexture { @@ -78,7 +79,7 @@ struct FrameGraphTexture { * @param descriptor Descriptor to the resource */ void create(ResourceAllocatorInterface& resourceAllocator, const char* name, - Descriptor const& descriptor, Usage usage) noexcept; + Descriptor const& descriptor, Usage usage, bool useProtectedMemory) noexcept; /** * Destroy the concrete resource diff --git a/filament/src/fg/PassNode.cpp b/filament/src/fg/PassNode.cpp index a28c2352a0c..caed82aff91 100644 --- a/filament/src/fg/PassNode.cpp +++ b/filament/src/fg/PassNode.cpp @@ -30,7 +30,7 @@ using namespace filament::backend; namespace filament { PassNode::PassNode(FrameGraph& fg) noexcept - : DependencyGraph::Node(fg.getGraph()), + : Node(fg.getGraph()), mFrameGraph(fg), devirtualize(fg.getArena()), destroy(fg.getArena()) { @@ -44,7 +44,7 @@ utils::CString PassNode::graphvizifyEdgeColor() const noexcept { return utils::CString{"red"}; } -void PassNode::registerResource(FrameGraphHandle resourceHandle) noexcept { +void PassNode::registerResource(FrameGraphHandle const resourceHandle) noexcept { VirtualResource* resource = mFrameGraph.getResource(resourceHandle); resource->neededByPass(this); mDeclaredHandles.insert(resourceHandle.index); @@ -76,28 +76,28 @@ void RenderPassNode::execute(FrameGraphResources const& resources, DriverApi& dr } } -uint32_t RenderPassNode::declareRenderTarget(FrameGraph& fg, FrameGraph::Builder& builder, +uint32_t RenderPassNode::declareRenderTarget(FrameGraph& fg, FrameGraph::Builder&, const char* name, FrameGraphRenderPass::Descriptor const& descriptor) { RenderPassData data; data.name = name; data.descriptor = descriptor; - FrameGraphRenderPass::Attachments& attachments = data.descriptor.attachments; // retrieve the ResourceNode of the attachments coming to us -- this will be used later // to compute the discard flags. DependencyGraph const& dependencyGraph = fg.getGraph(); auto incomingEdges = dependencyGraph.getIncomingEdges(this); - auto outgoingEdges = dependencyGraph.getOutgoingEdges(this); for (size_t i = 0; i < RenderPassData::ATTACHMENT_COUNT; i++) { - if (descriptor.attachments.array[i]) { - data.attachmentInfo[i] = attachments.array[i]; + FrameGraphId const& handle = + data.descriptor.attachments.array[i]; + if (handle) { + data.attachmentInfo[i] = handle; // TODO: this is not very efficient auto incomingPos = std::find_if(incomingEdges.begin(), incomingEdges.end(), - [&dependencyGraph, handle = descriptor.attachments.array[i]] + [&dependencyGraph, handle] (DependencyGraph::Edge const* edge) { ResourceNode const* node = static_cast( dependencyGraph.getNode(edge->from)); @@ -111,14 +111,14 @@ uint32_t RenderPassNode::declareRenderTarget(FrameGraph& fg, FrameGraph::Builder } // this could be either outgoing or incoming (if there are no outgoing) - data.outgoing[i] = fg.getActiveResourceNode(descriptor.attachments.array[i]); + data.outgoing[i] = fg.getActiveResourceNode(handle); if (data.outgoing[i] == data.incoming[i]) { data.outgoing[i] = nullptr; } } } - uint32_t id = mRenderTargetData.size(); + uint32_t const id = mRenderTargetData.size(); mRenderTargetData.push_back(data); return id; } @@ -151,7 +151,12 @@ void RenderPassNode::resolve() noexcept { rt.targetBufferFlags |= target; - if (!rt.outgoing[i] || !rt.outgoing[i]->hasActiveReaders()) { + // Discard at the end only if we are writing to this attachment AND later reading + // from it. (in particular, don't discard if we're not writing at all, because this + // attachment might have other readers after us). + // TODO: we could set the discard flag if we are the last reader, i.e. + // if rt->incoming[i] last reader is us. + if (rt.outgoing[i] && !rt.outgoing[i]->hasActiveReaders()) { rt.backend.params.flags.discardEnd |= target; } if (!rt.outgoing[i] || !rt.outgoing[i]->hasWriterPass()) { @@ -161,10 +166,10 @@ void RenderPassNode::resolve() noexcept { rt.backend.params.readOnlyDepthStencil |= RenderPassParams::READONLY_STENCIL; } } + // Discard at the start if this attachment has no prior writer if (!rt.incoming[i] || !rt.incoming[i]->hasActiveWriters()) { rt.backend.params.flags.discardStart |= target; } - VirtualResource* pResource = mFrameGraph.getResource(rt.descriptor.attachments.array[i]); Resource* pTextureResource = static_cast*>(pResource); @@ -185,10 +190,10 @@ void RenderPassNode::resolve() noexcept { minHeight = std::min(minHeight, h); maxHeight = std::max(maxHeight, h); } - // additionally, clear implies discardStart - rt.backend.params.flags.discardStart |= ( - rt.descriptor.clearFlags & rt.targetBufferFlags); } + // additionally, clear implies discardStart + rt.backend.params.flags.discardStart |= ( + rt.descriptor.clearFlags & rt.targetBufferFlags); assert_invariant(minWidth == maxWidth); assert_invariant(minHeight == maxHeight); @@ -196,8 +201,8 @@ void RenderPassNode::resolve() noexcept { // of all attachments size matches there are no ambiguity about the RT size. // if they don't match however, we select a size that will accommodate all attachments. - uint32_t width = maxWidth; - uint32_t height = maxHeight; + uint32_t const width = maxWidth; + uint32_t const height = maxHeight; // Update the descriptor if no size was specified (auto mode) if (!rt.descriptor.viewport.width) { @@ -224,6 +229,11 @@ void RenderPassNode::resolve() noexcept { rt.descriptor.samples = pImportedRenderTarget->importedDesc.samples; rt.backend.target = pImportedRenderTarget->target; + // We could end-up here more than once, for instance if the rendertarget is used + // by multiple passes (this would imply a read-back, btw). In this case, we don't want + // to clear it the 2nd time, so we clear the imported pass's clear flags. + pImportedRenderTarget->importedDesc.clearFlags = TargetBufferFlags::NONE; + // but don't discard attachments the imported target tells us to keep rt.backend.params.flags.discardStart &= ~pImportedRenderTarget->importedDesc.keepOverrideStart; rt.backend.params.flags.discardEnd &= ~pImportedRenderTarget->importedDesc.keepOverrideEnd; @@ -266,19 +276,19 @@ void RenderPassNode::RenderPassData::devirtualize(FrameGraph& fg, name, targetBufferFlags, backend.params.viewport.width, backend.params.viewport.height, - descriptor.samples, - colorInfo,info[0], info[1]); + descriptor.samples, descriptor.layerCount, + colorInfo, info[0], info[1]); } } void RenderPassNode::RenderPassData::destroy( - ResourceAllocatorInterface& resourceAllocator) noexcept { + ResourceAllocatorInterface& resourceAllocator) const noexcept { if (UTILS_LIKELY(!imported)) { resourceAllocator.destroyRenderTarget(backend.target); } } -RenderPassNode::RenderPassData const* RenderPassNode::getRenderPassData(uint32_t id) const noexcept { +RenderPassNode::RenderPassData const* RenderPassNode::getRenderPassData(uint32_t const id) const noexcept { return id < mRenderTargetData.size() ? &mRenderTargetData[id] : nullptr; } @@ -286,9 +296,9 @@ utils::CString RenderPassNode::graphvizify() const noexcept { #ifndef NDEBUG std::string s; - uint32_t id = getId(); + uint32_t const id = getId(); const char* const nodeName = getName(); - uint32_t refCount = getRefCount(); + uint32_t const refCount = getRefCount(); s.append("[label=\""); s.append(nodeName); @@ -334,7 +344,7 @@ utils::CString PresentPassNode::graphvizify() const noexcept { #ifndef NDEBUG std::string s; s.reserve(128); - uint32_t id = getId(); + uint32_t const id = getId(); s.append("[label=\"Present , id: "); s.append(std::to_string(id)); s.append("\", style=filled, fillcolor=red3]"); diff --git a/filament/src/fg/Resource.cpp b/filament/src/fg/Resource.cpp index 5bbeb80549c..be974a0defa 100644 --- a/filament/src/fg/Resource.cpp +++ b/filament/src/fg/Resource.cpp @@ -95,32 +95,32 @@ ImportedRenderTarget::ImportedRenderTarget(char const* resourceName, } UTILS_NOINLINE -void ImportedRenderTarget::assertConnect(FrameGraphTexture::Usage u) { +void ImportedRenderTarget::assertConnect(FrameGraphTexture::Usage const u) { constexpr auto ANY_ATTACHMENT = FrameGraphTexture::Usage::COLOR_ATTACHMENT | FrameGraphTexture::Usage::DEPTH_ATTACHMENT | FrameGraphTexture::Usage::STENCIL_ATTACHMENT; - ASSERT_PRECONDITION(none(u & ~ANY_ATTACHMENT), - "Imported render target resource \"%s\" can only be used as an attachment (usage=%s)", - name, utils::to_string(u).c_str()); + FILAMENT_CHECK_PRECONDITION(none(u & ~ANY_ATTACHMENT)) + << "Imported render target resource \"" << name + << "\" can only be used as an attachment (usage=" << utils::to_string(u).c_str() << ')'; } bool ImportedRenderTarget::connect(DependencyGraph& graph, PassNode* passNode, - ResourceNode* resourceNode, TextureUsage u) { + ResourceNode* resourceNode, TextureUsage const u) { // pass Node to resource Node edge (a write to) assertConnect(u); return Resource::connect(graph, passNode, resourceNode, u); } bool ImportedRenderTarget::connect(DependencyGraph& graph, ResourceNode* resourceNode, - PassNode* passNode, TextureUsage u) { + PassNode* passNode, TextureUsage const u) { // resource Node to pass Node edge (a read from) assertConnect(u); return Resource::connect(graph, resourceNode, passNode, u); } FrameGraphTexture::Usage ImportedRenderTarget::usageFromAttachmentsFlags( - TargetBufferFlags attachments) noexcept { + TargetBufferFlags const attachments) noexcept { if (any(attachments & TargetBufferFlags::COLOR_ALL)) return FrameGraphTexture::Usage::COLOR_ATTACHMENT; diff --git a/filament/src/fg/ResourceNode.cpp b/filament/src/fg/ResourceNode.cpp index 48f69cd96b4..2b4cf2af66b 100644 --- a/filament/src/fg/ResourceNode.cpp +++ b/filament/src/fg/ResourceNode.cpp @@ -20,8 +20,8 @@ namespace filament { -ResourceNode::ResourceNode(FrameGraph& fg, FrameGraphHandle h, FrameGraphHandle parent) noexcept - : DependencyGraph::Node(fg.getGraph()), +ResourceNode::ResourceNode(FrameGraph& fg, FrameGraphHandle const h, FrameGraphHandle const parent) noexcept + : Node(fg.getGraph()), resourceHandle(h), mFrameGraph(fg), mReaderPasses(fg.getArena()), mParentHandle(parent) { } @@ -80,7 +80,7 @@ bool ResourceNode::hasActiveReaders() const noexcept { bool ResourceNode::hasActiveWriters() const noexcept { // here we don't use mReaderPasses because this wouldn't account for subresources - DependencyGraph& dependencyGraph = mFrameGraph.getGraph(); + DependencyGraph const& dependencyGraph = mFrameGraph.getGraph(); auto const& writers = dependencyGraph.getIncomingEdges(this); // writers are not culled by definition if we're not culled ourselves return !writers.empty(); @@ -135,7 +135,7 @@ utils::CString ResourceNode::graphvizify() const noexcept { std::string s; s.reserve(128); - uint32_t id = getId(); + uint32_t const id = getId(); const char* const nodeName = getName(); VirtualResource* const pResource = mFrameGraph.getResource(resourceHandle); FrameGraph::ResourceSlot const& slot = mFrameGraph.getResourceSlot(resourceHandle); diff --git a/filament/src/fg/details/DependencyGraph.h b/filament/src/fg/details/DependencyGraph.h index 8acd58018c9..d75fa3a5f10 100644 --- a/filament/src/fg/details/DependencyGraph.h +++ b/filament/src/fg/details/DependencyGraph.h @@ -186,7 +186,7 @@ class DependencyGraph { }; inline DependencyGraph::Edge::Edge(DependencyGraph& graph, - DependencyGraph::Node* from, DependencyGraph::Node* to) + Node* from, Node* to) : from(from->getId()), to(to->getId()) { assert_invariant(graph.mNodes[this->from] == from); assert_invariant(graph.mNodes[this->to] == to); diff --git a/filament/src/fg/details/PassNode.h b/filament/src/fg/details/PassNode.h index 5dc500c57ad..9f483e7a6cb 100644 --- a/filament/src/fg/details/PassNode.h +++ b/filament/src/fg/details/PassNode.h @@ -80,7 +80,7 @@ class RenderPassNode : public PassNode { } backend; void devirtualize(FrameGraph& fg, ResourceAllocatorInterface& resourceAllocator) noexcept; - void destroy(ResourceAllocatorInterface& resourceAllocator) noexcept; + void destroy(ResourceAllocatorInterface& resourceAllocator) const noexcept; }; RenderPassNode(FrameGraph& fg, const char* name, FrameGraphPassBase* base) noexcept; diff --git a/filament/src/fg/details/Resource.h b/filament/src/fg/details/Resource.h index 966b4bc3388..7acd0e1595b 100644 --- a/filament/src/fg/details/Resource.h +++ b/filament/src/fg/details/Resource.h @@ -39,7 +39,7 @@ class ImportedRenderTarget; */ class ResourceEdgeBase : public DependencyGraph::Edge { public: - using DependencyGraph::Edge::Edge; + using Edge::Edge; }; /* @@ -84,7 +84,8 @@ class VirtualResource { ResourceEdgeBase const* writer) noexcept = 0; /* Instantiate the concrete resource */ - virtual void devirtualize(ResourceAllocatorInterface& resourceAllocator) noexcept = 0; + virtual void devirtualize(ResourceAllocatorInterface& resourceAllocator, + bool useProtectedMemory) noexcept = 0; /* Destroy the concrete resource */ virtual void destroy(ResourceAllocatorInterface& resourceAllocator) noexcept = 0; @@ -132,7 +133,7 @@ class Resource : public VirtualResource { Descriptor descriptor; SubResourceDescriptor subResourceDescriptor; - // weather the resource was detached + // whether the resource was detached bool detached = false; // An Edge with added data from this resource @@ -198,7 +199,7 @@ class Resource : public VirtualResource { */ void resolveUsage(DependencyGraph& graph, - ResourceEdgeBase const* const* edges, size_t count, + ResourceEdgeBase const* const* edges, size_t const count, ResourceEdgeBase const* writer) noexcept override { for (size_t i = 0; i < count; i++) { if (graph.isEdgeValid(edges[i])) { @@ -229,9 +230,10 @@ class Resource : public VirtualResource { delete static_cast(edge); } - void devirtualize(ResourceAllocatorInterface& resourceAllocator) noexcept override { + void devirtualize(ResourceAllocatorInterface& resourceAllocator, + bool useProtectedMemory) noexcept override { if (!isSubResource()) { - resource.create(resourceAllocator, name, descriptor, usage); + resource.create(resourceAllocator, name, descriptor, usage, useProtectedMemory); } else { // resource is guaranteed to be initialized before we are by construction resource = static_cast(parent)->resource; @@ -268,7 +270,7 @@ class ImportedResource : public Resource { } protected: - void devirtualize(ResourceAllocatorInterface&) noexcept override { + void devirtualize(ResourceAllocatorInterface&, bool) noexcept override { // imported resources don't need to devirtualize } void destroy(ResourceAllocatorInterface&) noexcept override { @@ -294,9 +296,10 @@ class ImportedResource : public Resource { private: UTILS_NOINLINE void assertConnect(FrameGraphTexture::Usage u) { - ASSERT_PRECONDITION((u & this->usage) == u, - "Requested usage %s not available on imported resource \"%s\" with usage %s", - utils::to_string(u).c_str(), this->name, utils::to_string(this->usage).c_str()); + FILAMENT_CHECK_PRECONDITION((u & this->usage) == u) + << "Requested usage " << utils::to_string(u).c_str() + << " not available on imported resource \"" << this->name << "\" with usage " + << utils::to_string(this->usage).c_str(); } }; diff --git a/filament/src/fsr.h b/filament/src/fsr.h index 98c70558aa4..350ee3c7e30 100644 --- a/filament/src/fsr.h +++ b/filament/src/fsr.h @@ -26,8 +26,8 @@ namespace filament { struct FSRScalingConfig { - filament::backend::Backend backend; - filament::Viewport input; // region of source to be scaled + backend::Backend backend; + Viewport input; // region of source to be scaled uint32_t inputWidth; // width of source uint32_t inputHeight; // height of source uint32_t outputWidth; // width of destination diff --git a/filament/src/materials/antiAliasing/taa.mat b/filament/src/materials/antiAliasing/taa.mat index 22a2d0a506c..86f55508e47 100644 --- a/filament/src/materials/antiAliasing/taa.mat +++ b/filament/src/materials/antiAliasing/taa.mat @@ -24,10 +24,62 @@ material { precision: high }, { - type : float[9], + type : float2, + name : jitter, + precision: high + }, + { + type : float4[9], name : filterWeights } ], + constants : [ + { + type : bool, + name : upscaling, + default : false + }, + { + type : bool, + name : historyReprojection, + default : true + }, + { + type : bool, + name : filterHistory, + default : true + }, + { + type : bool, + name : filterInput, + default : true + }, + { + type : int, + name : boxClipping, + default : 0 + }, + { + type : int, + name : boxType, + default : 1 + }, + { + type : bool, + name : useYCoCg, + default : false + }, + { + type : bool, + name : preventFlickering, + default : false + }, + { + type : float, + name : varianceGamma, + default : 1.0 + } + ], variables : [ vertex ], @@ -44,14 +96,6 @@ vertex { fragment { -#if defined(TARGET_METAL_ENVIRONMENT) || defined(TARGET_VULKAN_ENVIRONMENT) -#define TEXTURE_SPACE_UP -1 -#define TEXTURE_SPACE_DN 1 -#else -#define TEXTURE_SPACE_UP 1 -#define TEXTURE_SPACE_DN -1 -#endif - /* Clipping box type */ // min/max neighborhood @@ -61,9 +105,6 @@ fragment { // uses both min/max and variance #define BOX_TYPE_AABB_VARIANCE 2 -// High VARIANCE_GAMMA [0.75, 1.25] increases ghosting artefact, lower values increases jittering -#define VARIANCE_GAMMA 1.0 - /* Clipping algorithm */ // accurate box clipping @@ -73,34 +114,42 @@ fragment { // no clipping (for debugging only) #define BOX_CLIPPING_NONE 2 -/* Configuration mobile/desktop */ - -#if FILAMENT_QUALITY < FILAMENT_QUALITY_HIGH -#define BOX_CLIPPING BOX_CLIPPING_ACCURATE -#define BOX_TYPE BOX_TYPE_VARIANCE -#define USE_YCoCg 0 -#define FILTER_INPUT 1 -#define FILTER_HISTORY 0 -#else -#define BOX_CLIPPING BOX_CLIPPING_ACCURATE -#define BOX_TYPE BOX_TYPE_AABB_VARIANCE -#define USE_YCoCg 1 -#define FILTER_INPUT 1 -#define FILTER_HISTORY 1 -#endif +float rcp(float x) { + return 1.0 / x; +} -/* debugging helper */ +float lumaRGB(const vec3 c) { + return luminance(c); +} -#define HISTORY_REPROJECTION 1 -#define PREVENT_FLICKERING 0 // FIXME: thin lines disapear +float lumaYCoCg(const vec3 c) { + return c.x; +} +float luma(const vec3 c) { + return (materialConstants_useYCoCg && materialConstants_boxClipping != BOX_CLIPPING_NONE) ? + lumaYCoCg(c) : lumaRGB(c); +} -float luma(const vec3 color) { -#if USE_YCoCg - return color.x; -#else - return luminance(color); -#endif +vec3 tonemap(const vec3 c) { + return c * rcp(1.0 + max3(c)); +} + +vec4 tonemap(const vec4 c) { + return vec4(c.rgb * rcp(1.0 + max3(c.rgb)), c.a); +} + +vec3 tonemap(const float w, const vec3 c) { + return c * (w * rcp(1.0 + max3(c))); +} + +vec4 tonemap(const float w, const vec4 c) { + return vec4(c.rgb * (w * rcp(1.0 + max3(c.rgb))), c.a); +} + +vec3 untonemap(const vec3 c) { + const float epsilon = 1.0 / 65504.0; + return c * rcp(max(epsilon, 1.0 - max3(c))); } vec3 RGB_YCoCg(const vec3 c) { @@ -145,15 +194,16 @@ vec4 clipToBox(const int quality, // Optimized to 5 taps by removing the corner samples // And modified for mediump support vec4 sampleTextureCatmullRom(const sampler2D tex, const highp vec2 uv, const highp vec2 texSize) { - // We're going to sample a a 4x4 grid of texels surrounding the target UV coordinate. We'll do this by rounding - // down the sample location to get the exact center of our "starting" texel. The starting texel will be at - // location [1, 1] in the grid, where [0, 0] is the top left corner. + // We're going to sample a a 4x4 grid of texels surrounding the target UV coordinate. + // We'll do this by rounding down the sample location to get the exact center of our "starting" + // texel. The starting texel will be at location [1, 1] in the grid, where [0, 0] is the + // top left corner. highp vec2 samplePos = uv * texSize; highp vec2 texPos1 = floor(samplePos - 0.5) + 0.5; - // Compute the fractional offset from our starting texel to our original sample location, which we'll - // feed into the Catmull-Rom spline function to get our filter weights. + // Compute the fractional offset from our starting texel to our original sample location, + // which we'll feed into the Catmull-Rom spline function to get our filter weights. highp vec2 f = samplePos - texPos1; highp vec2 f2 = f * f; highp vec2 f3 = f2 * f; @@ -186,13 +236,23 @@ vec4 sampleTextureCatmullRom(const sampler2D tex, const highp vec2 uv, const hig float k3 = w3.x * w12.y; float k4 = w12.x * w3.y; - vec4 result = textureLod(tex, vec2(texPos12.x, texPos0.y), 0.0) * k0 - + textureLod(tex, vec2(texPos0.x, texPos12.y), 0.0) * k1 - + textureLod(tex, vec2(texPos12.x, texPos12.y), 0.0) * k2 - + textureLod(tex, vec2(texPos3.x, texPos12.y), 0.0) * k3 - + textureLod(tex, vec2(texPos12.x, texPos3.y), 0.0) * k4; + vec4 s[5]; + s[0] = textureLod(tex, vec2(texPos12.x, texPos0.y), 0.0); + s[1] = textureLod(tex, vec2(texPos0.x, texPos12.y), 0.0); + s[2] = textureLod(tex, vec2(texPos12.x, texPos12.y), 0.0); + s[3] = textureLod(tex, vec2(texPos3.x, texPos12.y), 0.0); + s[4] = textureLod(tex, vec2(texPos12.x, texPos3.y), 0.0); + + vec4 result = k0 * s[0] + + k1 * s[1] + + k2 * s[2] + + k3 * s[3] + + k4 * s[4]; - result *= 1.0 / (k0 + k1 + k2 + k3 + k4); + result *= rcp(k0 + k1 + k2 + k3 + k4); + + // we could end-up with negative values + result = max(vec4(0), result); return result; } @@ -200,127 +260,153 @@ vec4 sampleTextureCatmullRom(const sampler2D tex, const highp vec2 uv, const hig void postProcess(inout PostProcessInputs postProcess) { highp vec4 uv = variable_vertex.xyxy; // interpolated to pixel center - // read the depth buffer center sample for reprojection - float depth = textureLod(materialParams_depth, uv.xy, 0.0).r; - -#if HISTORY_REPROJECTION - uv.zw = uvToRenderTargetUV(uv.zw); - // reproject history to current frame - highp vec4 q = materialParams.reprojection * vec4(uv.zw, depth, 1.0); - uv.zw = (q.xy * (1.0 / q.w)) * 0.5 + 0.5; - uv.zw = uvToRenderTargetUV(uv.zw); -#endif + if (materialConstants_historyReprojection) { + // read the depth buffer center sample for reprojection + highp float depth = textureLod(materialParams_depth, uv.xy, 0.0).r; + // reproject history to current frame + uv.zw = uvToRenderTargetUV(uv.zw); + highp vec4 q = materialParams.reprojection * vec4(uv.zw, depth, 1.0); + uv.zw = (q.xy * (1.0 / q.w)) * 0.5 + 0.5; + uv.zw = uvToRenderTargetUV(uv.zw); + } // read center color and history samples - vec4 color = textureLod(materialParams_color, uv.xy, 0.0); -#if FILTER_HISTORY - vec4 history = sampleTextureCatmullRom(materialParams_history, uv.zw, - vec2(textureSize(materialParams_history, 0))); -#else - vec4 history = textureLod(materialParams_history, uv.zw, 0.0); -#endif + vec4 history; + if (materialConstants_filterHistory) { + history = sampleTextureCatmullRom(materialParams_history, uv.zw, + vec2(textureSize(materialParams_history, 0))); + } else { + history = textureLod(materialParams_history, uv.zw, 0.0); + } -#if USE_YCoCg - history.rgb = RGB_YCoCg(history.rgb); -#endif + highp vec2 size = vec2(textureSize(materialParams_color, 0)); + highp vec2 p = (floor(uv.xy * size) + 0.5) / size; + vec4 filtered = textureLod(materialParams_color, p, 0.0); - // build the history clamping box vec3 s[9]; - s[0] = textureLodOffset(materialParams_color, uv.xy, 0.0, ivec2(-1, TEXTURE_SPACE_DN)).rgb; - s[1] = textureLodOffset(materialParams_color, uv.xy, 0.0, ivec2( 0, TEXTURE_SPACE_DN)).rgb; - s[2] = textureLodOffset(materialParams_color, uv.xy, 0.0, ivec2( 1, TEXTURE_SPACE_DN)).rgb; - s[3] = textureLodOffset(materialParams_color, uv.xy, 0.0, ivec2(-1, 0)).rgb; - s[4] = color.rgb; - s[5] = textureLodOffset(materialParams_color, uv.xy, 0.0, ivec2( 1, 0)).rgb; - s[6] = textureLodOffset(materialParams_color, uv.xy, 0.0, ivec2(-1, TEXTURE_SPACE_UP)).rgb; - s[7] = textureLodOffset(materialParams_color, uv.xy, 0.0, ivec2( 0, TEXTURE_SPACE_UP)).rgb; - s[8] = textureLodOffset(materialParams_color, uv.xy, 0.0, ivec2( 1, TEXTURE_SPACE_UP)).rgb; - -#if USE_YCoCg - for (int i = 0 ; i < 9 ; i++) { - s[i] = RGB_YCoCg(s[i]); + if (materialConstants_filterInput || materialConstants_boxClipping != BOX_CLIPPING_NONE) { + s[0] = textureLodOffset(materialParams_color, p, 0.0, ivec2(-1, -1)).rgb; + s[1] = textureLodOffset(materialParams_color, p, 0.0, ivec2( 0, -1)).rgb; + s[2] = textureLodOffset(materialParams_color, p, 0.0, ivec2( 1, -1)).rgb; + s[3] = textureLodOffset(materialParams_color, p, 0.0, ivec2(-1, 0)).rgb; + s[4] = filtered.rgb; + s[5] = textureLodOffset(materialParams_color, p, 0.0, ivec2( 1, 0)).rgb; + s[6] = textureLodOffset(materialParams_color, p, 0.0, ivec2(-1, 1)).rgb; + s[7] = textureLodOffset(materialParams_color, p, 0.0, ivec2( 0, 1)).rgb; + s[8] = textureLodOffset(materialParams_color, p, 0.0, ivec2( 1, 1)).rgb; } - color.rgb = s[4].rgb; -#endif -#if FILTER_INPUT - // unjitter/filter input - vec4 filtered = vec4(0, 0, 0, color.a); - for (int i = 0 ; i < 9 ; i++) { - filtered.rgb += s[i] * materialParams.filterWeights[i]; + int j = 0; + float confidence = 1.0; + if (materialConstants_upscaling) { + highp vec2 subPixelOffset = (p - uv.xy) * size; // +/- [0.25, 0.25] + + // we reduce the contribution of a sample based on the distance + // to the high resolution pixel center + const float cutoff = 0.5; + highp float l = length(materialParams.jitter - subPixelOffset) / cutoff; + confidence = saturate(1.0 - l * l); + + if (materialConstants_filterInput) { + int jxp = subPixelOffset.y > 0.0 ? 1 : 2; + int jxn = subPixelOffset.y > 0.0 ? 0 : 3; + j = subPixelOffset.x > 0.0 ? jxp : jxn; + } } -#else - vec4 filtered = color; -#endif -#if BOX_TYPE == BOX_TYPE_AABB || BOX_TYPE == BOX_TYPE_AABB_VARIANCE - vec3 boxmin = min(s[4], min(min(s[1], s[3]), min(s[5], s[7]))); - vec3 boxmax = max(s[4], max(max(s[1], s[3]), max(s[5], s[7]))); - vec3 box9min = min(boxmin, min(min(s[0], s[2]), min(s[6], s[8]))); - vec3 box9max = max(boxmax, max(max(s[0], s[2]), max(s[6], s[8]))); - // round the corners of the 3x3 box - boxmin = (boxmin + box9min) * 0.5; - boxmax = (boxmax + box9max) * 0.5; -#endif - -#if BOX_TYPE == BOX_TYPE_VARIANCE || BOX_TYPE == BOX_TYPE_AABB_VARIANCE - // "An Excursion in Temporal Supersampling" by Marco Salvi - vec3 m0 = s[4]; - vec3 m1 = s[4] * s[4]; - // we use only 5 samples instead of all 9 - for (int i = 1 ; i < 9 ; i+=2) { - m0 += s[i]; - m1 += s[i] * s[i]; + if (materialConstants_filterInput) { + // unjitter/filter input + filtered = vec4(vec3(0), filtered.a); + for (int i = 0; i < 9; i++) { + float w = materialParams.filterWeights[i][j]; + filtered.rgb += s[i] * w; + } + filtered.rgb = max(filtered.rgb, vec3(0)); } - vec3 a0 = m0 * (1.0 / 5.0); - vec3 a1 = m1 * (1.0 / 5.0); - vec3 sigma = sqrt(a1 - a0 * a0); -#if BOX_TYPE == BOX_TYPE_VARIANCE - vec3 boxmin = a0 - VARIANCE_GAMMA * sigma; - vec3 boxmax = a0 + VARIANCE_GAMMA * sigma; -#else - boxmin = min(boxmin, a0 - VARIANCE_GAMMA * sigma); - boxmax = max(boxmax, a0 + VARIANCE_GAMMA * sigma); -#endif -#endif - // history clamping - history = clipToBox(BOX_CLIPPING, boxmin, boxmax, filtered, history); + // build the history clamping box + if (materialConstants_boxClipping != BOX_CLIPPING_NONE) { + if (materialConstants_useYCoCg) { + history.rgb = RGB_YCoCg(history.rgb); + filtered.rgb = RGB_YCoCg(filtered.rgb); + for (int i = 0; i < 9; i++) { + s[i] = RGB_YCoCg(s[i]); + } + } - float lumaColor = luma(filtered.rgb); - float lumaHistory = luma(history.rgb); + vec3 boxmin; + vec3 boxmax; + if (materialConstants_boxType == BOX_TYPE_AABB || + materialConstants_boxType == BOX_TYPE_AABB_VARIANCE) { + boxmin = min(s[4], min(min(s[1], s[3]), min(s[5], s[7]))); + boxmax = max(s[4], max(max(s[1], s[3]), max(s[5], s[7]))); + vec3 box9min = min(boxmin, min(min(s[0], s[2]), min(s[6], s[8]))); + vec3 box9max = max(boxmax, max(max(s[0], s[2]), max(s[6], s[8]))); + // round the corners of the 3x3 box, giving less importance to the corner samples + boxmin = (boxmin + box9min) * 0.5; + boxmax = (boxmax + box9max) * 0.5; + } - float alpha = materialParams.alpha; -#if PREVENT_FLICKERING - // [Lottes] prevents flickering by modulating the blend weight by the difference in luma - float diff = 1.0 - abs(lumaColor - lumaHistory) / (0.001 + max(lumaColor, lumaHistory)); - alpha *= diff * diff; -#endif + if (materialConstants_boxType == BOX_TYPE_VARIANCE || + materialConstants_boxType == BOX_TYPE_AABB_VARIANCE) { + // "An Excursion in Temporal Supersampling" by Marco Salvi + highp vec3 m0 = s[4];// conversion to highp + highp vec3 m1 = m0 * m0; + // we use only 5 samples instead of all 9 + for (int i = 1; i < 9; i+=2) { + highp vec3 c = s[i];// conversion to highp + m0 += c; + m1 += c * c; + } + highp vec3 a0 = m0 * (1.0 / 5.0); + highp vec3 a1 = m1 * (1.0 / 5.0); + highp vec3 sigma = sqrt(a1 - a0 * a0); + if (materialConstants_boxType == BOX_TYPE_VARIANCE) { + boxmin = a0 - materialConstants_varianceGamma * sigma; + boxmax = a0 + materialConstants_varianceGamma * sigma; + } else { + // intersect both bounding boxes + boxmin = max(boxmin, a0 - materialConstants_varianceGamma * sigma); + boxmax = min(boxmax, a0 + materialConstants_varianceGamma * sigma); + } + } + // history clamping + history = clipToBox(materialConstants_boxClipping, boxmin, boxmax, filtered, history); + } + + float alpha = materialParams.alpha * confidence; + if (materialConstants_preventFlickering) { + // [Lottes] prevents flickering by modulating the blend weight by the difference in luma + float lumaColor = luma(filtered.rgb); + float lumaHistory = luma(history.rgb); + float diff = 1.0 - abs(lumaColor - lumaHistory) / (0.001 + max(lumaColor, lumaHistory)); + alpha *= diff * diff; + } - // tonemapping for handling HDR - filtered.rgb *= 1.0 / (1.0 + lumaColor); - history.rgb *= 1.0 / (1.0 + lumaHistory); + // go back to RGB space before tonemapping + if (materialConstants_boxClipping != BOX_CLIPPING_NONE) { + if (materialConstants_useYCoCg) { + filtered.rgb = YCoCg_RGB(filtered.rgb); + history.rgb = YCoCg_RGB(history.rgb); + } + } + + // tonemap before mixing + filtered.rgb = tonemap(filtered.rgb); + history.rgb = tonemap(history.rgb); // combine history and current frame vec4 result = mix(history, filtered, alpha); // untonemap result - result.rgb *= 1.0 / (1.0 - luma(result.rgb)); - -#if USE_YCoCg - result.rgb = YCoCg_RGB(result.rgb); -#endif - - // store result (which will becomes new history) - // we could end-up with negative values due to the bicubic filter, which never recover on - // their own. - result = max(vec4(0), result); + result.rgb = untonemap(result.rgb); #if POST_PROCESS_OPAQUE // kill the work performed above result.a = 1.0; #endif + // store result (which will becomes new history) postProcess.color = result; } diff --git a/filament/src/materials/blitArray.mat b/filament/src/materials/blitArray.mat new file mode 100644 index 00000000000..39d3a18e534 --- /dev/null +++ b/filament/src/materials/blitArray.mat @@ -0,0 +1,42 @@ +material { + name : blitArray, + parameters : [ + { + type : sampler2dArray, + name : color, + precision: medium + }, + { + type : int, + name : layerIndex + }, + { + type : float, + name : levelOfDetail, + }, + { + type : float4, + name : viewport, + precision: high + } + ], + variables : [ + vertex + ], + depthWrite : false, + depthCulling : false, + domain: postprocess +} + +vertex { + void postProcessVertex(inout PostProcessVertexInputs postProcess) { + postProcess.vertex.xy = materialParams.viewport.xy + postProcess.normalizedUV * materialParams.viewport.zw; + postProcess.vertex.xy = uvToRenderTargetUV(postProcess.vertex.xy); + } +} + +fragment { + void postProcess(inout PostProcessInputs postProcess) { + postProcess.color = textureLod(materialParams_color, vec3(variable_vertex.xy, materialParams.layerIndex), materialParams.levelOfDetail); + } +} diff --git a/filament/src/materials/blitDepth.mat b/filament/src/materials/blitDepth.mat new file mode 100644 index 00000000000..c8536ad545c --- /dev/null +++ b/filament/src/materials/blitDepth.mat @@ -0,0 +1,42 @@ +material { + name : blitDepth, + parameters : [ + { + type : sampler2d, + name : depth, + precision: medium + }, + { + type : float4, + name : viewport, + precision: high + } + ], + outputs : [ + { + name : depth, + target : depth, + type : float + } + ], + variables : [ + vertex + ], + culling: none, + depthWrite : true, + depthCulling : false, + domain: postprocess, +} + +vertex { + void postProcessVertex(inout PostProcessVertexInputs postProcess) { + postProcess.vertex.xy = materialParams.viewport.xy + postProcess.normalizedUV * materialParams.viewport.zw; + postProcess.vertex.xy = uvToRenderTargetUV(postProcess.vertex.xy); + } +} + +fragment { + void postProcess(inout PostProcessInputs postProcess) { + postProcess.depth = textureLod(materialParams_depth, variable_vertex.xy, 0.0).r; + } +} diff --git a/filament/src/materials/blitLow.mat b/filament/src/materials/blitLow.mat index 1154305a64b..16148577655 100644 --- a/filament/src/materials/blitLow.mat +++ b/filament/src/materials/blitLow.mat @@ -8,13 +8,12 @@ material { }, { type : float4, - name : resolution, + name : viewport, precision: high }, { - type : float4, - name : viewport, - precision: high + type : float, + name : levelOfDetail, } ], variables : [ @@ -22,7 +21,8 @@ material { ], depthWrite : false, depthCulling : false, - domain: postprocess + domain: postprocess, + featureLevel : 0 } vertex { @@ -34,7 +34,10 @@ vertex { fragment { void postProcess(inout PostProcessInputs postProcess) { - postProcess.color = textureLod(materialParams_color, variable_vertex.xy, 0.0); +#if FILAMENT_EFFECTIVE_VERSION == 100 + postProcess.color = texture2D(materialParams_color, variable_vertex.xy); +#else + postProcess.color = textureLod(materialParams_color, variable_vertex.xy, materialParams.levelOfDetail); +#endif } } - diff --git a/filament/src/materials/bloom/bloomDownsample.mat b/filament/src/materials/bloom/bloomDownsample.mat index a05a0ca37f8..6553f767a85 100644 --- a/filament/src/materials/bloom/bloomDownsample.mat +++ b/filament/src/materials/bloom/bloomDownsample.mat @@ -5,18 +5,6 @@ material { type : sampler2d, name : source, precision: medium - }, - { - type : float, - name : level - }, - { - type : float, - name : threshold - }, - { - type : float, - name : invHighlight } ], variables : [ @@ -37,85 +25,43 @@ fragment { void dummy(){} - void threshold(inout vec3 c) { - // threshold everything below 1.0 - c = max(vec3(0.0), c - 1.0); - // crush everything above 1 - highp float f = max3(c); - c *= 1.0 / (1.0 + f * materialParams.invHighlight); - } - vec3 box4x4(vec3 s0, vec3 s1, vec3 s2, vec3 s3) { return (s0 + s1 + s2 + s3) * 0.25; } - vec3 box4x4Reinhard(vec3 s0, vec3 s1, vec3 s2, vec3 s3) { - float w0 = 1.0 / (1.0 + max3(s0)); - float w1 = 1.0 / (1.0 + max3(s1)); - float w2 = 1.0 / (1.0 + max3(s2)); - float w3 = 1.0 / (1.0 + max3(s3)); - return (s0 * w0 + s1 * w1 + s2 * w2 + s3 * w3) * (1.0 / (w0 + w1 + w2 + w3)); - } - void postProcess(inout PostProcessInputs postProcess) { - float lod = materialParams.level; highp vec2 uv = variable_vertex.xy; // see SIGGRAPH 2014: Advances in Real-Time Rendering // "Next Generation Post-Processing in Call of Duty Advanced Warfare" // Jorge Jimenez - vec3 c = textureLod(materialParams_source, uv, lod).rgb; + vec3 c = textureLod(materialParams_source, uv, 0.0).rgb; // The offsets below are in "source" texture space - vec3 lt = textureLodOffset(materialParams_source, uv, lod, ivec2(-1, -1)).rgb; - vec3 rt = textureLodOffset(materialParams_source, uv, lod, ivec2( 1, -1)).rgb; - vec3 rb = textureLodOffset(materialParams_source, uv, lod, ivec2( 1, 1)).rgb; - vec3 lb = textureLodOffset(materialParams_source, uv, lod, ivec2(-1, 1)).rgb; + vec3 lt = textureLodOffset(materialParams_source, uv, 0.0, ivec2(-1, -1)).rgb; + vec3 rt = textureLodOffset(materialParams_source, uv, 0.0, ivec2( 1, -1)).rgb; + vec3 rb = textureLodOffset(materialParams_source, uv, 0.0, ivec2( 1, 1)).rgb; + vec3 lb = textureLodOffset(materialParams_source, uv, 0.0, ivec2(-1, 1)).rgb; - vec3 lt2 = textureLodOffset(materialParams_source, uv, lod, ivec2(-2, -2)).rgb; - vec3 rt2 = textureLodOffset(materialParams_source, uv, lod, ivec2( 2, -2)).rgb; - vec3 rb2 = textureLodOffset(materialParams_source, uv, lod, ivec2( 2, 2)).rgb; - vec3 lb2 = textureLodOffset(materialParams_source, uv, lod, ivec2(-2, 2)).rgb; + vec3 lt2 = textureLodOffset(materialParams_source, uv, 0.0, ivec2(-2, -2)).rgb; + vec3 rt2 = textureLodOffset(materialParams_source, uv, 0.0, ivec2( 2, -2)).rgb; + vec3 rb2 = textureLodOffset(materialParams_source, uv, 0.0, ivec2( 2, 2)).rgb; + vec3 lb2 = textureLodOffset(materialParams_source, uv, 0.0, ivec2(-2, 2)).rgb; - vec3 l = textureLodOffset(materialParams_source, uv, lod, ivec2(-2, 0)).rgb; - vec3 t = textureLodOffset(materialParams_source, uv, lod, ivec2( 0, -2)).rgb; - vec3 r = textureLodOffset(materialParams_source, uv, lod, ivec2( 2, 0)).rgb; - vec3 b = textureLodOffset(materialParams_source, uv, lod, ivec2( 0, 2)).rgb; + vec3 l = textureLodOffset(materialParams_source, uv, 0.0, ivec2(-2, 0)).rgb; + vec3 t = textureLodOffset(materialParams_source, uv, 0.0, ivec2( 0, -2)).rgb; + vec3 r = textureLodOffset(materialParams_source, uv, 0.0, ivec2( 2, 0)).rgb; + vec3 b = textureLodOffset(materialParams_source, uv, 0.0, ivec2( 0, 2)).rgb; // five h4x4 boxes vec3 c0, c1; - if (materialParams.level <= 0.5) { - if (materialParams.threshold > 0.0) { - // Threshold the first level blur - threshold(c); - threshold(lt); - threshold(rt); - threshold(rb); - threshold(lb); - threshold(lt2); - threshold(rt2); - threshold(rb2); - threshold(lb2); - threshold(l); - threshold(t); - threshold(r); - threshold(b); - } - // Also apply fireflies (flickering) filtering - c0 = box4x4Reinhard(lt, rt, rb, lb); - c1 = box4x4Reinhard(c, l, t, lt2); - c1 += box4x4Reinhard(c, r, t, rt2); - c1 += box4x4Reinhard(c, r, b, rb2); - c1 += box4x4Reinhard(c, l, b, lb2); - } else { - // common case - c0 = box4x4(lt, rt, rb, lb); - c1 = box4x4(c, l, t, lt2); - c1 += box4x4(c, r, t, rt2); - c1 += box4x4(c, r, b, rb2); - c1 += box4x4(c, l, b, lb2); - } + // common case + c0 = box4x4(lt, rt, rb, lb); + c1 = box4x4(c, l, t, lt2); + c1 += box4x4(c, r, t, rt2); + c1 += box4x4(c, r, b, rb2); + c1 += box4x4(c, l, b, lb2); // weighted average of the five boxes postProcess.color.rgb = c0 * 0.5 + c1 * 0.125; diff --git a/filament/src/materials/bloom/bloomDownsample2x.mat b/filament/src/materials/bloom/bloomDownsample2x.mat new file mode 100644 index 00000000000..3af1b28ba4f --- /dev/null +++ b/filament/src/materials/bloom/bloomDownsample2x.mat @@ -0,0 +1,98 @@ +material { + name : bloomDownsample2x, + parameters : [ + { + type : sampler2d, + name : source, + precision: medium + }, + { + type : float, + name : level + }, + { + type : float, + name : threshold + }, + { + type : float, + name : fireflies + }, + { + type : float, + name : invHighlight + } + ], + variables : [ + vertex + ], + domain : postprocess, + depthWrite : false, + depthCulling : false +} + +vertex { + void postProcessVertex(inout PostProcessVertexInputs postProcess) { + postProcess.vertex.xy = uvToRenderTargetUV(postProcess.normalizedUV); + } +} + +fragment { + + void dummy(){} + + void threshold(inout vec3 c) { + // threshold everything below 1.0 + c = max(vec3(0.0), c - 1.0); + // crush everything above 1 + highp float f = max3(c); + c *= 1.0 / (1.0 + f * materialParams.invHighlight); + } + + void postProcess(inout PostProcessInputs postProcess) { + float lod = materialParams.level; + + highp vec2 size = vec2(textureSize(materialParams_source, int(lod))); + highp vec2 texelSize = vec2(1.0) / size; + + // Castaño, 2013, "Shadow Mapping Summary Part 1" + // 3x3 gaussian filter with 4 linear samples + vec2 offset = vec2(0.5); + highp vec2 uv = (variable_vertex.xy * size) + offset; + highp vec2 base = (floor(uv) - offset) * texelSize; + highp vec2 st = fract(uv); + vec2 uw = vec2(3.0 - 2.0 * st.x, 1.0 + 2.0 * st.x); + vec2 vw = vec2(3.0 - 2.0 * st.y, 1.0 + 2.0 * st.y); + highp vec2 u = vec2((2.0 - st.x) / uw.x - 1.0, st.x / uw.y + 1.0) * texelSize.x; + highp vec2 v = vec2((2.0 - st.y) / vw.x - 1.0, st.y / vw.y + 1.0) * texelSize.y; + vec3 c0 = textureLod(materialParams_source, base + vec2(u.x, v.x), lod).rgb; + vec3 c1 = textureLod(materialParams_source, base + vec2(u.y, v.x), lod).rgb; + vec3 c2 = textureLod(materialParams_source, base + vec2(u.x, v.y), lod).rgb; + vec3 c3 = textureLod(materialParams_source, base + vec2(u.y, v.y), lod).rgb; + + float w0 = uw.x * vw.x * (1.0 / 16.0); + float w1 = uw.y * vw.x * (1.0 / 16.0); + float w2 = uw.x * vw.y * (1.0 / 16.0); + float w3 = uw.y * vw.y * (1.0 / 16.0); + + if (materialParams.fireflies > 0.0) { + w0 /= (1.0 + max3(c0)); + w1 /= (1.0 + max3(c1)); + w2 /= (1.0 + max3(c2)); + w3 /= (1.0 + max3(c3)); + float w = 1.0 / (w0 + w1 + w2 + w3); + w0 *= w; + w1 *= w; + w2 *= w; + w3 *= w; + } + + vec3 c = c0 * w0 + c1 * w1 + c2 * w2 + c3 * w3; + + if (materialParams.threshold > 0.0) { + threshold(c); + } + + postProcess.color.rgb = c; + } +} diff --git a/filament/src/materials/bloom/bloomDownsample9.mat b/filament/src/materials/bloom/bloomDownsample9.mat new file mode 100644 index 00000000000..7a5fa47b3ec --- /dev/null +++ b/filament/src/materials/bloom/bloomDownsample9.mat @@ -0,0 +1,65 @@ +material { + name : bloomDownsample9, + parameters : [ + { + type : sampler2d, + name : source, + precision: medium + } + ], + variables : [ + vertex + ], + domain : postprocess, + depthWrite : false, + depthCulling : false +} + +vertex { + void postProcessVertex(inout PostProcessVertexInputs postProcess) { + postProcess.vertex.xy = uvToRenderTargetUV(postProcess.normalizedUV); + } +} + +fragment { + + void dummy(){} + + // see https://www.shadertoy.com/view/cslczj + // 6x6 downsampling kernel implemented via 9 bilinear samples + + void postProcess(inout PostProcessInputs postProcess) { + highp vec2 uv = variable_vertex.xy; + highp vec2 size = vec2(1.0) / vec2(textureSize(materialParams_source, 0)); + + float o = 1.5 + 0.261629; + float wa = 7.46602 / 32.0; + float wb = 1.0 - wa * 2.0; + float wab = wa * wb; + float waa = wa * wa; + float wbb = wb * wb; + + size *= o; + + vec3 c = textureLod(materialParams_source, uv + vec2(0.0) , 0.0).rgb; + vec3 l = textureLod(materialParams_source, uv + vec2(-size.x, 0.0), 0.0).rgb; + vec3 r = textureLod(materialParams_source, uv + vec2( size.x, 0.0), 0.0).rgb; + vec3 b = textureLod(materialParams_source, uv + vec2( 0.0,-size.y), 0.0).rgb; + vec3 t = textureLod(materialParams_source, uv + vec2( 0.0, size.y), 0.0).rgb; + vec3 lb = textureLod(materialParams_source, uv + vec2(-size.x,-size.y), 0.0).rgb; + vec3 rb = textureLod(materialParams_source, uv + vec2( size.x,-size.y), 0.0).rgb; + vec3 lt = textureLod(materialParams_source, uv + vec2(-size.x, size.y), 0.0).rgb; + vec3 rt = textureLod(materialParams_source, uv + vec2( size.x, size.y), 0.0).rgb; + + postProcess.color.rgb = + (c * wbb + + (l * wab + + (r * wab + + (b * wab + + (t * wab + + (lb * waa + + (rb * waa + + (lt * waa + + (rt * waa))))))))); + } +} diff --git a/filament/src/materials/bloom/bloomUpsample.mat b/filament/src/materials/bloom/bloomUpsample.mat index b67dc160c8e..9b11a60524a 100644 --- a/filament/src/materials/bloom/bloomUpsample.mat +++ b/filament/src/materials/bloom/bloomUpsample.mat @@ -10,10 +10,6 @@ material { type : float4, name : resolution, precision: high - }, - { - type : float, - name : level } ], variables : [ @@ -34,16 +30,15 @@ fragment { void dummy(){} void postProcess(inout PostProcessInputs postProcess) { - float lod = materialParams.level; highp vec2 uv = variable_vertex.xy; #if FILAMENT_QUALITY < FILAMENT_QUALITY_HIGH highp vec4 d = vec4(materialParams.resolution.zw, -materialParams.resolution.zw) * 0.5; vec3 c; - c = textureLod(materialParams_source, uv + d.zw, lod).rgb; - c += textureLod(materialParams_source, uv + d.xw, lod).rgb; - c += textureLod(materialParams_source, uv + d.xy, lod).rgb; - c += textureLod(materialParams_source, uv + d.zy, lod).rgb; + c = textureLod(materialParams_source, uv + d.zw, 0.0).rgb; + c += textureLod(materialParams_source, uv + d.xw, 0.0).rgb; + c += textureLod(materialParams_source, uv + d.xy, 0.0).rgb; + c += textureLod(materialParams_source, uv + d.zy, 0.0).rgb; postProcess.color.rgb = c * 0.25; #else // see SIGGRAPH 2014: Advances in Real-Time Rendering @@ -52,15 +47,15 @@ fragment { const float radius = 1.0; highp vec4 d = vec4(materialParams.resolution.zw, -materialParams.resolution.zw) * radius; vec3 c0, c1; - c0 = textureLod(materialParams_source, uv + d.zw, lod).rgb; - c0 += textureLod(materialParams_source, uv + d.xw, lod).rgb; - c0 += textureLod(materialParams_source, uv + d.xy, lod).rgb; - c0 += textureLod(materialParams_source, uv + d.zy, lod).rgb; - c0 += 4.0 * textureLod(materialParams_source, uv, lod).rgb; - c1 = textureLod(materialParams_source, uv + vec2(d.z, 0.0), lod).rgb; - c1 += textureLod(materialParams_source, uv + vec2(0.0, d.w), lod).rgb; - c1 += textureLod(materialParams_source, uv + vec2(d.x, 0.0), lod).rgb; - c1 += textureLod(materialParams_source, uv + vec2( 0.0, d.y), lod).rgb; + c0 = textureLod(materialParams_source, uv + d.zw, 0.0).rgb; + c0 += textureLod(materialParams_source, uv + d.xw, 0.0).rgb; + c0 += textureLod(materialParams_source, uv + d.xy, 0.0).rgb; + c0 += textureLod(materialParams_source, uv + d.zy, 0.0).rgb; + c0 += 4.0 * textureLod(materialParams_source, uv, 0.0).rgb; + c1 = textureLod(materialParams_source, uv + vec2(d.z, 0.0), 0.0).rgb; + c1 += textureLod(materialParams_source, uv + vec2(0.0, d.w), 0.0).rgb; + c1 += textureLod(materialParams_source, uv + vec2(d.x, 0.0), 0.0).rgb; + c1 += textureLod(materialParams_source, uv + vec2( 0.0, d.y), 0.0).rgb; postProcess.color.rgb = (c0 + 2.0 * c1) * (1.0 / 16.0); #endif } diff --git a/filament/src/materials/debugShadowCascades.mat b/filament/src/materials/debugShadowCascades.mat new file mode 100644 index 00000000000..36bf4e34cd6 --- /dev/null +++ b/filament/src/materials/debugShadowCascades.mat @@ -0,0 +1,80 @@ +material { + name : debugShadowCascades, + parameters : [ + { + type : sampler2d, + name : color, + precision: medium + }, + { + type : sampler2d, + name : depth, + precision: high + }, + { + type : float4, + name : cascadeSplits, + precision: high + }, + { + type : uint, + name : cascadeCount, + precision: high + } + ], + variables : [ + vertex + ], + depthWrite : false, + depthCulling : false, + domain: postprocess +} + +vertex { + void postProcessVertex(inout PostProcessVertexInputs postProcess) { + postProcess.vertex.xy = uvToRenderTargetUV(postProcess.normalizedUV); + } +} + +fragment { + void dummy(){} + + vec3 uintToColorDebug(int v) { + if (v == 0) { + return vec3(0.0, 1.0, 0.0); // green + } else if (v == 1) { + return vec3(0.0, 0.0, 1.0); // blue + } else if (v == 2) { + return vec3(1.0, 1.0, 0.0); // yellow + } else if (v == 3) { + return vec3(1.0, 0.0, 0.0); // red + } else if (v == 4) { + return vec3(1.0, 0.0, 1.0); // purple + } else if (v == 5) { + return vec3(0.0, 1.0, 1.0); // cyan + } + + // fallback to handle "not all code-paths return" warnings + return vec3(0.0, 0.0, 0.0); + } + + int getShadowCascade(highp float z) { + ivec4 greaterZ = ivec4(greaterThan(frameUniforms.cascadeSplits, vec4(z))); + int cascadeCount = frameUniforms.cascades & 0xF; + return clamp(greaterZ.x + greaterZ.y + greaterZ.z + greaterZ.w, 0, cascadeCount - 1); + } + + void postProcess(inout PostProcessInputs postProcess) { + vec4 color = textureLod(materialParams_color, variable_vertex.xy, 0.0); + + // depth from the depth buffer + highp float depth = textureLod(materialParams_depth, variable_vertex.xy, 0.0).r; + // convert to view-space (linear z). + highp vec4 p = mulMat4x4Float3(getViewFromClipMatrix(), vec3(0, 0, depth)); + highp float z = p.z / p.w; + + color.rgb *= uintToColorDebug(getShadowCascade(z)); + postProcess.color = color; + } +} + diff --git a/filament/src/materials/dof/dof.mat b/filament/src/materials/dof/dof.mat index cdf59458cda..b6bb5b1ea78 100644 --- a/filament/src/materials/dof/dof.mat +++ b/filament/src/materials/dof/dof.mat @@ -477,6 +477,7 @@ void fastTile(inout vec4 color, inout float alpha, } alpha = cocToAlpha(kernelSize); color *= rcp(sampleCount(ringCountFast)); + color = min(vec4(MEDIUMP_FLT_MAX), color); } void foregroundTile(inout vec4 foreground, inout float fgOpacity, @@ -658,6 +659,7 @@ void postProcess(inout PostProcessInputs postProcess) { // the downside of doing this is that we couldn't use a different upscaler for each // layer, but this is a lot less costly postProcess.color = foreground + (1.0 - fgOpacity) * background; + postProcess.color = min(vec4(MEDIUMP_FLT_MAX), postProcess.color); postProcess.alpha = fgOpacity + (1.0 - fgOpacity) * bgOpacity; } diff --git a/filament/src/materials/dof/dofMipmap.mat b/filament/src/materials/dof/dofMipmap.mat index b22492f463b..9c285309b66 100644 --- a/filament/src/materials/dof/dofMipmap.mat +++ b/filament/src/materials/dof/dofMipmap.mat @@ -11,10 +11,6 @@ material { name : coc, precision: medium }, - { - type : int, - name : mip - }, { type : float, name : weightScale @@ -65,19 +61,18 @@ void postProcess(inout PostProcessInputs postProcess) { // the bilateral weights need to be scaled by to match the lower resolution float weightScale = materialParams.weightScale; - float mip = float(materialParams.mip); - vec4 s01 = textureLodOffset(materialParams_color, uv, mip, ivec2(0, 1)); - vec4 s11 = textureLodOffset(materialParams_color, uv, mip, ivec2(1, 1)); - vec4 s10 = textureLodOffset(materialParams_color, uv, mip, ivec2(1, 0)); - vec4 s00 = textureLodOffset(materialParams_color, uv, mip, ivec2(0, 0)); + vec4 s01 = textureLodOffset(materialParams_color, uv, 0.0, ivec2(0, 1)); + vec4 s11 = textureLodOffset(materialParams_color, uv, 0.0, ivec2(1, 1)); + vec4 s10 = textureLodOffset(materialParams_color, uv, 0.0, ivec2(1, 0)); + vec4 s00 = textureLodOffset(materialParams_color, uv, 0.0, ivec2(0, 0)); // fetch the 4 corresponding CoC (textureGather with LOD doesn't exist) vec4 c; - c[0] = textureLodOffset(materialParams_coc, uv, mip, ivec2(0, 1)).r; - c[1] = textureLodOffset(materialParams_coc, uv, mip, ivec2(1, 1)).r; - c[2] = textureLodOffset(materialParams_coc, uv, mip, ivec2(1, 0)).r; - c[3] = textureLodOffset(materialParams_coc, uv, mip, ivec2(0, 0)).r; + c[0] = textureLodOffset(materialParams_coc, uv, 0.0, ivec2(0, 1)).r; + c[1] = textureLodOffset(materialParams_coc, uv, 0.0, ivec2(1, 1)).r; + c[2] = textureLodOffset(materialParams_coc, uv, 0.0, ivec2(1, 0)).r; + c[3] = textureLodOffset(materialParams_coc, uv, 0.0, ivec2(0, 0)).r; float outCoc = downsampleCoC(c); vec4 w = downsampleCocWeights(c, outCoc, weightScale); diff --git a/filament/src/materials/fsr/fsr_rcas.mat b/filament/src/materials/fsr/fsr_rcas.mat index 185e62d288c..cfdf0372042 100644 --- a/filament/src/materials/fsr/fsr_rcas.mat +++ b/filament/src/materials/fsr/fsr_rcas.mat @@ -43,6 +43,8 @@ fragment { #define FSR_RCAS_F 1 #if !POST_PROCESS_OPAQUE # define FSR_RCAS_PASSTHROUGH_ALPHA + // todo: make this a spec constant + # define FSR_RCAS_DENOISE #endif #include "ffx_fsr1.h" @@ -61,6 +63,9 @@ fragment { #endif p, materialParams.RcasCon); + // todo: make this an option + postProcess.color.rgb = max(vec3(0), postProcess.color.rgb); + #if POST_PROCESS_OPAQUE postProcess.color.a = 1.0; #endif diff --git a/filament/src/materials/resolveDepth.mat b/filament/src/materials/resolveDepth.mat new file mode 100644 index 00000000000..cdf0787a8d5 --- /dev/null +++ b/filament/src/materials/resolveDepth.mat @@ -0,0 +1,33 @@ +material { + name : resolveDepth, + parameters : [ + { + type : sampler2d, + name : depth, + precision: high, + multisample : true + } + ], + outputs : [ + { + name : depth, + target : depth, + type : float + } + ], + domain : postprocess, + depthWrite : true, + depthCulling : false, + culling: none +} + +fragment { + // resolve depth by keeping the first sample. This is similar to what glBlitFramebuffer() does + // this material is currently only used on Metal and Vulkan. + // Technically it should be feature-level 2 material, but that would restrict when we can use + // it because Vulkan can return feature-level 1 currently (we should fix that). + void postProcess(inout PostProcessInputs postProcess) { + highp ivec2 icoord = ivec2(gl_FragCoord.xy); + postProcess.depth = texelFetch(materialParams_depth, icoord, 0).r; + } +} diff --git a/filament/src/materials/separableGaussianBlur.fs b/filament/src/materials/separableGaussianBlur.fs index 4f8b2f373a0..1667eae239e 100644 --- a/filament/src/materials/separableGaussianBlur.fs +++ b/filament/src/materials/separableGaussianBlur.fs @@ -1,28 +1,33 @@ -// BLUR_TYPE and BLUR_SWIZZLE must be defined -// BLUR_TYPE vec2, vec3, vec4 -// BLUR_SWIZZLE r, rg, rgb, rgba - float vmax(const float v) { return v; } -void tap(inout highp BLUR_TYPE sum, const float weight, const highp vec2 position) { - vec4 s = TEXTURE_LOD(materialParams_source, position, materialParams.level, materialParams.layer); - sum.BLUR_SWIZZLE += s.BLUR_SWIZZLE * weight; +highp vec4 sourceTexLod(const highp vec2 p, float m, float l) { + // This condition is optimized away at compile-time. + if (materialConstants_arraySampler) { + return textureLod(materialParams_sourceArray, vec3(p, l), m); + } else { + return textureLod(materialParams_source, p, m); + } } -void tapReinhard(inout highp BLUR_TYPE sum, inout float totalWeight, const float weight, const highp vec2 position) { - vec4 s = TEXTURE_LOD(materialParams_source, position, materialParams.level, materialParams.layer); - float w = weight / (1.0 + vmax(s.BLUR_SWIZZLE)); +void tap(inout highp vec4 sum, const float weight, const highp vec2 position) { + highp vec4 s = sourceTexLod(position, materialParams.level, materialParams.layer); + sum += s * weight; +} + +void tapReinhard(inout highp vec4 sum, inout float totalWeight, const float weight, const highp vec2 position) { + highp vec4 s = sourceTexLod(position, materialParams.level, materialParams.layer); + float w = weight / (1.0 + vmax(s)); totalWeight += w; - sum.BLUR_SWIZZLE += s.BLUR_SWIZZLE * w; + sum += s * w; } void postProcess(inout PostProcessInputs postProcess) { highp vec2 uv = variable_vertex.xy; // we handle the center pixel separately - highp BLUR_TYPE sum = BLUR_TYPE(0.0); + highp vec4 sum = vec4(0.0); if (materialParams.reinhard != 0) { float totalWeight = 0.0; @@ -45,5 +50,17 @@ void postProcess(inout PostProcessInputs postProcess) { tap(sum, k, uv - o); } } - postProcess.color.BLUR_SWIZZLE = sum.BLUR_SWIZZLE; + + // These conditions are evaluated at compile time and help the driver optimize out unnecessary + // computations. + postProcess.color = vec4(0.0); + if (materialConstants_componentCount == 1) { + postProcess.color.r = sum.r; + } else if (materialConstants_componentCount == 2) { + postProcess.color.rg = sum.rg; + } else if (materialConstants_componentCount == 3) { + postProcess.color.rgb = sum.rgb; + } else { + postProcess.color.rgba = sum.rgba; + } } diff --git a/filament/src/materials/separableGaussianBlur.mat b/filament/src/materials/separableGaussianBlur.mat new file mode 100644 index 00000000000..1276ea90e8e --- /dev/null +++ b/filament/src/materials/separableGaussianBlur.mat @@ -0,0 +1,72 @@ +material { + name : separableGaussianBlur, + parameters : [ + { + type : sampler2d, + name : source, + precision: high + }, + { + type : sampler2dArray, + name : sourceArray, + precision: high + }, + { + type : float2, + name : axis + }, + { + type : float, + name : level + }, + { + type : float, + name : layer + }, + { + type : int, + name : count + }, + { + type : int, + name : reinhard + }, + { + type : float2[32], + name : kernel + } + ], + outputs : [ + { + type : float4, + name : color, + precision : high + } + ], + constants : [ + { + type : bool, + name : arraySampler, + default : false + }, + { + type : int, + name : componentCount, + default : 4 + } + ], + variables : [ + vertex + ], + domain : postprocess, + depthWrite : false, + depthCulling : false +} + +vertex { +#include "separableGaussianBlur.vs" +} + +fragment { +#include "separableGaussianBlur.fs" +} diff --git a/filament/src/materials/separableGaussianBlur1.mat b/filament/src/materials/separableGaussianBlur1.mat deleted file mode 100644 index 6b2bc609f3e..00000000000 --- a/filament/src/materials/separableGaussianBlur1.mat +++ /dev/null @@ -1,54 +0,0 @@ -material { - name : separableGaussianBlur1, - parameters : [ - { - type : sampler2d, - name : source, - precision: medium - }, - { - type : float2, - name : axis - }, - { - type : float, - name : level - }, - { - type : float, - name : layer - }, - { - type : int, - name : count - }, - { - type : int, - name : reinhard - }, - { - type : float2[32], - name : kernel - } - ], - variables : [ - vertex - ], - domain : postprocess, - depthWrite : false, - depthCulling : false -} - -vertex { -#include "separableGaussianBlur.vs" -} - -fragment { - -#define BLUR_TYPE vec2 -#define BLUR_SWIZZLE r -#define TEXTURE_LOD(s, p, m, l) textureLod(s, p, m) - -#include "separableGaussianBlur.fs" - -} diff --git a/filament/src/materials/separableGaussianBlur1L.mat b/filament/src/materials/separableGaussianBlur1L.mat deleted file mode 100644 index ff61f0dfab7..00000000000 --- a/filament/src/materials/separableGaussianBlur1L.mat +++ /dev/null @@ -1,54 +0,0 @@ -material { - name : separableGaussianBlur1L, - parameters : [ - { - type : sampler2dArray, - name : source, - precision: medium - }, - { - type : float2, - name : axis - }, - { - type : float, - name : level - }, - { - type : float, - name : layer - }, - { - type : int, - name : count - }, - { - type : int, - name : reinhard - }, - { - type : float2[32], - name : kernel - } - ], - variables : [ - vertex - ], - domain : postprocess, - depthWrite : false, - depthCulling : false -} - -vertex { -#include "separableGaussianBlur.vs" -} - -fragment { - -#define BLUR_TYPE vec2 -#define BLUR_SWIZZLE r -#define TEXTURE_LOD(s, p, m, l) textureLod(s, vec3(p, l), m) - -#include "separableGaussianBlur.fs" - -} diff --git a/filament/src/materials/separableGaussianBlur2.mat b/filament/src/materials/separableGaussianBlur2.mat deleted file mode 100644 index 81e1e385443..00000000000 --- a/filament/src/materials/separableGaussianBlur2.mat +++ /dev/null @@ -1,54 +0,0 @@ -material { - name : separableGaussianBlur2, - parameters : [ - { - type : sampler2d, - name : source, - precision: medium - }, - { - type : float2, - name : axis - }, - { - type : float, - name : level - }, - { - type : float, - name : layer - }, - { - type : int, - name : count - }, - { - type : int, - name : reinhard - }, - { - type : float2[32], - name : kernel - } - ], - variables : [ - vertex - ], - domain : postprocess, - depthWrite : false, - depthCulling : false -} - -vertex { -#include "separableGaussianBlur.vs" -} - -fragment { - -#define BLUR_TYPE vec2 -#define BLUR_SWIZZLE rg -#define TEXTURE_LOD(s, p, m, l) textureLod(s, p, m) - -#include "separableGaussianBlur.fs" - -} diff --git a/filament/src/materials/separableGaussianBlur2L.mat b/filament/src/materials/separableGaussianBlur2L.mat deleted file mode 100644 index 3368d5625b8..00000000000 --- a/filament/src/materials/separableGaussianBlur2L.mat +++ /dev/null @@ -1,54 +0,0 @@ -material { - name : separableGaussianBlur2L, - parameters : [ - { - type : sampler2dArray, - name : source, - precision: medium - }, - { - type : float2, - name : axis - }, - { - type : float, - name : level - }, - { - type : float, - name : layer - }, - { - type : int, - name : count - }, - { - type : int, - name : reinhard - }, - { - type : float2[32], - name : kernel - } - ], - variables : [ - vertex - ], - domain : postprocess, - depthWrite : false, - depthCulling : false -} - -vertex { -#include "separableGaussianBlur.vs" -} - -fragment { - -#define BLUR_TYPE vec2 -#define BLUR_SWIZZLE rg -#define TEXTURE_LOD(s, p, m, l) textureLod(s, vec3(p, l), m) - -#include "separableGaussianBlur.fs" - -} diff --git a/filament/src/materials/separableGaussianBlur3.mat b/filament/src/materials/separableGaussianBlur3.mat deleted file mode 100644 index ee4628448b3..00000000000 --- a/filament/src/materials/separableGaussianBlur3.mat +++ /dev/null @@ -1,54 +0,0 @@ -material { - name : separableGaussianBlur3, - parameters : [ - { - type : sampler2d, - name : source, - precision: medium - }, - { - type : float2, - name : axis - }, - { - type : float, - name : level - }, - { - type : float, - name : layer - }, - { - type : int, - name : count - }, - { - type : int, - name : reinhard - }, - { - type : float2[32], - name : kernel - } - ], - variables : [ - vertex - ], - domain : postprocess, - depthWrite : false, - depthCulling : false -} - -vertex { -#include "separableGaussianBlur.vs" -} - -fragment { - -#define BLUR_TYPE vec3 -#define BLUR_SWIZZLE rgb -#define TEXTURE_LOD(s, p, m, l) textureLod(s, p, m) - -#include "separableGaussianBlur.fs" - -} diff --git a/filament/src/materials/separableGaussianBlur3L.mat b/filament/src/materials/separableGaussianBlur3L.mat deleted file mode 100644 index 9302a56b1c4..00000000000 --- a/filament/src/materials/separableGaussianBlur3L.mat +++ /dev/null @@ -1,54 +0,0 @@ -material { - name : separableGaussianBlur3L, - parameters : [ - { - type : sampler2dArray, - name : source, - precision: medium - }, - { - type : float2, - name : axis - }, - { - type : float, - name : level - }, - { - type : float, - name : layer - }, - { - type : int, - name : count - }, - { - type : int, - name : reinhard - }, - { - type : float2[32], - name : kernel - } - ], - variables : [ - vertex - ], - domain : postprocess, - depthWrite : false, - depthCulling : false -} - -vertex { -#include "separableGaussianBlur.vs" -} - -fragment { - -#define BLUR_TYPE vec3 -#define BLUR_SWIZZLE rgb -#define TEXTURE_LOD(s, p, m, l) textureLod(s, vec3(p, l), m) - -#include "separableGaussianBlur.fs" - -} diff --git a/filament/src/materials/separableGaussianBlur4.mat b/filament/src/materials/separableGaussianBlur4.mat deleted file mode 100644 index f9d1173a136..00000000000 --- a/filament/src/materials/separableGaussianBlur4.mat +++ /dev/null @@ -1,54 +0,0 @@ -material { - name : separableGaussianBlur4, - parameters : [ - { - type : sampler2d, - name : source, - precision: medium - }, - { - type : float2, - name : axis - }, - { - type : float, - name : level - }, - { - type : float, - name : layer - }, - { - type : int, - name : count - }, - { - type : int, - name : reinhard - }, - { - type : float2[32], - name : kernel - } - ], - variables : [ - vertex - ], - domain : postprocess, - depthWrite : false, - depthCulling : false -} - -vertex { -#include "separableGaussianBlur.vs" -} - -fragment { - -#define BLUR_TYPE vec4 -#define BLUR_SWIZZLE rgba -#define TEXTURE_LOD(s, p, m, l) textureLod(s, p, m) - -#include "separableGaussianBlur.fs" - -} diff --git a/filament/src/materials/separableGaussianBlur4L.mat b/filament/src/materials/separableGaussianBlur4L.mat deleted file mode 100644 index f8e8ec9bca9..00000000000 --- a/filament/src/materials/separableGaussianBlur4L.mat +++ /dev/null @@ -1,54 +0,0 @@ -material { - name : separableGaussianBlur4L, - parameters : [ - { - type : sampler2dArray, - name : source, - precision: medium - }, - { - type : float2, - name : axis - }, - { - type : float, - name : level - }, - { - type : float, - name : layer - }, - { - type : int, - name : count - }, - { - type : int, - name : reinhard - }, - { - type : float2[32], - name : kernel - } - ], - variables : [ - vertex - ], - domain : postprocess, - depthWrite : false, - depthCulling : false -} - -vertex { -#include "separableGaussianBlur.vs" -} - -fragment { - -#define BLUR_TYPE vec4 -#define BLUR_SWIZZLE rgba -#define TEXTURE_LOD(s, p, m, l) textureLod(s, vec3(p, l), m) - -#include "separableGaussianBlur.fs" - -} diff --git a/filament/src/materials/shadowmap.mat b/filament/src/materials/shadowmap.mat new file mode 100644 index 00000000000..edca93b59db --- /dev/null +++ b/filament/src/materials/shadowmap.mat @@ -0,0 +1,59 @@ +material { + name : shadowmap, + parameters : [ + { + type : sampler2dArray, + name : shadowmap, + precision : high + }, + { + type : float, + name : power, + precision : high + }, + { + type : float2, + name : scale, + }, + { + type : int, + name : layer + }, + { + type : int, + name : level + }, + { + type : int, + name : channel + } + ], + variables : [ + vertex + ], + vertexDomain : device, + depthWrite : false, + depthCulling : false, + domain: postprocess +} + +vertex { + void postProcessVertex(inout PostProcessVertexInputs postProcess) { + postProcess.vertex.xy = postProcess.normalizedUV; + postProcess.position.xy = 1.0 + (postProcess.position.xy - 1.0) * materialParams.scale; + } +} + +fragment { + void dummy(){} + + void postProcess(inout PostProcessInputs postProcess) { + highp vec2 uv = uvToRenderTargetUV(variable_vertex.xy); + highp vec3 p = vec3(uv, float(materialParams.layer)); + float m = float(materialParams.level); + highp float c = textureLod(materialParams_shadowmap, p, m)[materialParams.channel]; + c = pow(abs(c), materialParams.power); + postProcess.color.rgb = vec3(c); + postProcess.color.a = 1.0; + } +} diff --git a/filament/src/materials/skybox.mat b/filament/src/materials/skybox.mat index 1d36108a275..c0a1181dbfa 100644 --- a/filament/src/materials/skybox.mat +++ b/filament/src/materials/skybox.mat @@ -35,10 +35,14 @@ fragment { if (materialParams.constantColor != 0) { sky = materialParams.color; } else { +#if MATERIAL_FEATURE_LEVEL == 0 + sky = vec4(textureCube(materialParams_skybox, variable_eyeDirection.xyz).rgb, 1.0); +#else sky = vec4(textureLod(materialParams_skybox, variable_eyeDirection.xyz, 0.0).rgb, 1.0); +#endif sky.rgb *= frameUniforms.iblLuminance; } - if (materialParams.showSun != 0 && frameUniforms.sun.w >= 0.0f) { + if (materialParams.showSun != 0 && frameUniforms.sun.w >= 0.0) { vec3 direction = normalize(variable_eyeDirection.xyz); // Assume the sun is a sphere vec3 sun = frameUniforms.lightColorIntensity.rgb * @@ -54,6 +58,15 @@ fragment { vertex { void materialVertex(inout MaterialVertexInputs material) { - material.eyeDirection.xyz = material.worldPosition.xyz; + // This code is taken from computeWorldPosition and assumes the vertex domain is 'device'. + vec4 p = getPosition(); + // GL convention to inverted DX convention + p.z = p.z * -0.5 + 0.5; + vec4 worldPosition = getWorldFromClipMatrix() * p; + // Getting the true world position would require dividing by w, but since this is a skybox + // at inifinity, this results in very large numbers for material.eyeDirection. + // Since the eyeDirection is only used as a direction vector in the fragment shader, we can + // skip that step to improve precision. + material.eyeDirection.xyz = worldPosition.xyz; } } diff --git a/filament/src/materials/ssao/mipmapDepth.mat b/filament/src/materials/ssao/mipmapDepth.mat index 74b3835e290..1fb36ab5fe3 100644 --- a/filament/src/materials/ssao/mipmapDepth.mat +++ b/filament/src/materials/ssao/mipmapDepth.mat @@ -5,10 +5,6 @@ material { type : sampler2d, name : depth, precision: high - }, - { - type : int, - name : level } ], variables : [ @@ -30,9 +26,8 @@ fragment { // We use a rotated grid sub-sample as it's cheap and gives good results // See Scalable Ambient Obscurance by McGuire and al. void postProcess(inout PostProcessInputs postProcess) { - int level = materialParams.level; ivec2 icoord = ivec2(gl_FragCoord.xy); postProcess.depth = texelFetch(materialParams_depth, - 2 * icoord + ivec2(icoord.y & 1, icoord.x & 1), level).r; + 2 * icoord + ivec2(icoord.y & 1, icoord.x & 1), 0).r; } } diff --git a/filament/src/materials/ssao/sao.mat b/filament/src/materials/ssao/sao.mat index b5564f2964c..a07da1b6602 100644 --- a/filament/src/materials/ssao/sao.mat +++ b/filament/src/materials/ssao/sao.mat @@ -131,7 +131,7 @@ fragment { #include "saoImpl.fs" #include "ssctImpl.fs" - #include "geometry.fs" + #include "../utils/geometry.fs" #include "ssaoUtils.fs" void dummy(){} diff --git a/filament/src/materials/ssao/saoBentNormals.mat b/filament/src/materials/ssao/saoBentNormals.mat index ee04929ab3b..14a6c005689 100644 --- a/filament/src/materials/ssao/saoBentNormals.mat +++ b/filament/src/materials/ssao/saoBentNormals.mat @@ -143,7 +143,7 @@ fragment { #include "saoImpl.fs" #include "ssctImpl.fs" - #include "geometry.fs" + #include "../utils/geometry.fs" #include "ssaoUtils.fs" void dummy(){} diff --git a/filament/src/materials/ssao/saoImpl.fs b/filament/src/materials/ssao/saoImpl.fs index 88c2c58d8f4..57f96141e1f 100644 --- a/filament/src/materials/ssao/saoImpl.fs +++ b/filament/src/materials/ssao/saoImpl.fs @@ -22,7 +22,7 @@ */ #include "ssaoUtils.fs" -#include "geometry.fs" +#include "../utils/geometry.fs" #ifndef COMPUTE_BENT_NORMAL #error COMPUTE_BENT_NORMAL must be set diff --git a/filament/src/materials/ssao/ssaoUtils.fs b/filament/src/materials/ssao/ssaoUtils.fs index f4ec5526f9e..43d3696f14d 100644 --- a/filament/src/materials/ssao/ssaoUtils.fs +++ b/filament/src/materials/ssao/ssaoUtils.fs @@ -17,7 +17,7 @@ #ifndef FILAMENT_MATERIALS_SSAO_UTILS #define FILAMENT_MATERIALS_SSAO_UTILS -#include "depthUtils.fs" +#include "../utils/depthUtils.fs" vec2 pack(highp float normalizedDepth) { // we need 16-bits of precision diff --git a/filament/src/materials/ssao/depthUtils.fs b/filament/src/materials/utils/depthUtils.fs similarity index 100% rename from filament/src/materials/ssao/depthUtils.fs rename to filament/src/materials/utils/depthUtils.fs diff --git a/filament/src/materials/ssao/geometry.fs b/filament/src/materials/utils/geometry.fs similarity index 96% rename from filament/src/materials/ssao/geometry.fs rename to filament/src/materials/utils/geometry.fs index 0984e049bc0..a1a5062100f 100644 --- a/filament/src/materials/ssao/geometry.fs +++ b/filament/src/materials/utils/geometry.fs @@ -130,10 +130,10 @@ highp vec3 computeViewSpaceNormal( highp vec2 texel, highp vec2 positionParams) { // todo: maybe make this a quality parameter #if FILAMENT_QUALITY == FILAMENT_QUALITY_HIGH - vec3 normal = computeViewSpaceNormalHighQ(materialParams_depth, uv, depth, position, + vec3 normal = computeViewSpaceNormalHighQ(depthTexture, uv, depth, position, texel, positionParams); #else - vec3 normal = computeViewSpaceNormalMediumQ(materialParams_depth, uv, position, + vec3 normal = computeViewSpaceNormalMediumQ(depthTexture, uv, position, texel, positionParams); #endif return normal; diff --git a/filament/src/materials/vsmMipmap.mat b/filament/src/materials/vsmMipmap.mat index 70e65b8f344..5047447bf28 100644 --- a/filament/src/materials/vsmMipmap.mat +++ b/filament/src/materials/vsmMipmap.mat @@ -10,10 +10,6 @@ material { type : int, name : layer }, - { - type : int, - name : level - }, { type : float, name : uvscale @@ -36,7 +32,6 @@ fragment { void postProcess(inout PostProcessInputs postProcess) { highp vec2 uv = gl_FragCoord.xy * materialParams.uvscale; postProcess.color = textureLod(materialParams_color, - vec3(uv, materialParams.layer), - float(materialParams.level)); + vec3(uv, materialParams.layer), 0.0); } } diff --git a/filament/test/CMakeLists.txt b/filament/test/CMakeLists.txt index f9aedc5468d..7b498008677 100644 --- a/filament/test/CMakeLists.txt +++ b/filament/test/CMakeLists.txt @@ -56,6 +56,14 @@ if (TNT_DEV) target_link_libraries(test_depth PRIVATE utils) endif() +if (ANDROID) + add_executable(test_compiler compiler_test.cpp) + target_link_libraries(test_compiler PRIVATE gtest) + target_link_libraries(test_compiler PRIVATE utils) + target_link_libraries(test_compiler PRIVATE EGL) + target_link_libraries(test_compiler PRIVATE GLESv3) +endif() + add_executable(test_material_parser filament_test_material_parser.cpp ${RESGEN_SOURCE}) diff --git a/filament/test/compiler_test.cpp b/filament/test/compiler_test.cpp new file mode 100644 index 00000000000..08b944ecabe --- /dev/null +++ b/filament/test/compiler_test.cpp @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include +#include +#include + +#include + +using namespace utils; +using namespace std::literals; + +class CompilerTest : public testing::Test { +protected: + void SetUp() override { + EGLBoolean success; + EGLint major, minor; + dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); + ASSERT_NE(dpy, EGL_NO_DISPLAY); + + EGLBoolean const initialized = eglInitialize(dpy, &major, &minor); + ASSERT_TRUE(initialized); + + EGLint const contextAttribs[] = { + EGL_CONTEXT_CLIENT_VERSION, 3, + EGL_NONE + }; + + EGLint configsCount; + EGLint configAttribs[] = { + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR, // 0 + EGL_RED_SIZE, 8, // 2 + EGL_GREEN_SIZE, 8, // 4 + EGL_BLUE_SIZE, 8, // 6 + EGL_NONE // 14 + }; + success = eglChooseConfig(dpy, configAttribs, &config, 1, &configsCount); + ASSERT_TRUE(success); + + context = eglCreateContext(dpy, config, EGL_NO_CONTEXT, contextAttribs); + ASSERT_NE(context, EGL_NO_CONTEXT); + + success = eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, context); + ASSERT_TRUE(success); + + ASSERT_EQ(eglGetError(), EGL_SUCCESS); + } + + void TearDown() override { + eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + eglDestroyContext(dpy, context); + eglTerminate(dpy); + } + +private: + EGLDisplay dpy; + EGLContext context; + EGLConfig config; +}; + +TEST_F(CompilerTest, Simple) { + auto shader = R"( +#version 300 es +void main() +{ +})"sv; + + const char* const src = shader.data(); + GLint const len = (GLint)shader.size(); + + GLuint const id = glCreateShader(GL_VERTEX_SHADER); + EXPECT_EQ(glGetError(), GL_NO_ERROR); + + glShaderSource(id, 1, &src, &len); + EXPECT_EQ(glGetError(), GL_NO_ERROR); + + glCompileShader(id); + EXPECT_EQ(glGetError(), GL_NO_ERROR); + + GLint result = 0; + glGetShaderiv(id, GL_COMPILE_STATUS, &result); + EXPECT_EQ(result, GL_TRUE); + + glDeleteShader(id); + EXPECT_EQ(glGetError(), GL_NO_ERROR); +} + +TEST_F(CompilerTest, CrashPVRUniFlexCompileToHw) { + + // Some PowerVR driver crash with this shader + + auto shader = R"( +#version 300 es + +layout(location = 0) in vec4 mesh_position; + +layout(std140) uniform FrameUniforms { + vec2 i; +} frameUniforms; + +void main() { + gl_Position = mesh_position; + gl_Position.z = dot(gl_Position.zw, frameUniforms.i); +})"sv; + + const char* const src = shader.data(); + GLint const len = (GLint)shader.size(); + + GLuint const id = glCreateShader(GL_VERTEX_SHADER); + EXPECT_EQ(glGetError(), GL_NO_ERROR); + + glShaderSource(id, 1, &src, &len); + EXPECT_EQ(glGetError(), GL_NO_ERROR); + + glCompileShader(id); + EXPECT_EQ(glGetError(), GL_NO_ERROR); + + GLint result = 0; + glGetShaderiv(id, GL_COMPILE_STATUS, &result); + EXPECT_EQ(result, GL_TRUE); + + glDeleteShader(id); + EXPECT_EQ(glGetError(), GL_NO_ERROR); +} + +TEST_F(CompilerTest, ConstParameters) { + + // Some PowerVR driver fail to compile this shader + + auto shader = R"( +#version 300 es + +highp mat3 m; +void buggy(const mediump vec3 n) { + m*n; +} + +void main() { +})"sv; + + const char* const src = shader.data(); + GLint const len = (GLint)shader.size(); + + GLuint const id = glCreateShader(GL_FRAGMENT_SHADER); + EXPECT_EQ(glGetError(), GL_NO_ERROR); + + glShaderSource(id, 1, &src, &len); + EXPECT_EQ(glGetError(), GL_NO_ERROR); + + glCompileShader(id); + EXPECT_EQ(glGetError(), GL_NO_ERROR); + + GLint result = 0; + glGetShaderiv(id, GL_COMPILE_STATUS, &result); + EXPECT_EQ(result, GL_TRUE); + + EXPECT_EQ(glGetError(), GL_NO_ERROR); + + glDeleteShader(id); + EXPECT_EQ(glGetError(), GL_NO_ERROR); +} + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/filament/test/filament_AtlasAllocator_test.cpp b/filament/test/filament_AtlasAllocator_test.cpp index d5be398a933..2b51780ccbd 100644 --- a/filament/test/filament_AtlasAllocator_test.cpp +++ b/filament/test/filament_AtlasAllocator_test.cpp @@ -117,6 +117,32 @@ TEST(AtlasAllocator, AllocateMixed2) { EXPECT_TRUE(c7.l == 2 && c7.code == 15); } +TEST(AtlasAllocator, AllocateFourCascades_Test) { + Viewport vp(0,0,1024,1024); + AtlasAllocator allocator(1024); + auto e0 = allocator.allocate(1024); + EXPECT_EQ(e0.viewport, vp); + EXPECT_EQ(e0.layer, 0); + + auto e1 = allocator.allocate(1024); + EXPECT_EQ(e1.viewport, vp); + EXPECT_EQ(e1.layer, 1); + + auto e2 = allocator.allocate(1024); + EXPECT_EQ(e2.viewport, vp); + EXPECT_EQ(e2.layer, 2); + + auto e3 = allocator.allocate(1024); + EXPECT_EQ(e3.viewport, vp); + EXPECT_EQ(e3.layer, 3); + + auto e4 = allocator.allocate(128); + EXPECT_EQ(e4.layer, 4); + + auto e5 = allocator.allocate(128); + EXPECT_EQ(e5.layer, 4); +} + TEST(AtlasAllocator, AllocateBySize) { AtlasAllocator allocator(256); diff --git a/filament/test/filament_framegraph_test.cpp b/filament/test/filament_framegraph_test.cpp index d5463a9041b..684f3e2bf2d 100644 --- a/filament/test/filament_framegraph_test.cpp +++ b/filament/test/filament_framegraph_test.cpp @@ -34,12 +34,17 @@ using namespace backend; class MockResourceAllocator : public ResourceAllocatorInterface { uint32_t handle = 0; + struct MockDisposer : public ResourceAllocatorDisposerInterface { + void destroy(backend::TextureHandle) noexcept override {} + } disposer; + public: backend::RenderTargetHandle createRenderTarget(const char* name, backend::TargetBufferFlags targetBufferFlags, uint32_t width, uint32_t height, uint8_t samples, + uint8_t layerCount, backend::MRT color, backend::TargetBufferInfo depth, backend::TargetBufferInfo stencil) noexcept override { @@ -59,6 +64,10 @@ class MockResourceAllocator : public ResourceAllocatorInterface { void destroyTexture(backend::TextureHandle h) noexcept override { } + + ResourceAllocatorDisposerInterface& getDisposer() noexcept override { + return disposer; + } }; class FrameGraphTest : public testing::Test { @@ -890,3 +899,55 @@ TEST_F(FrameGraphTest, SubResourcesWriteRead) { fg.execute(driverApi); } + +TEST_F(FrameGraphTest, WriteResourceReadAsAttachment) { + + // this check s that using a resources as a read-only attachment doesn't set the + // discard flag on that resource. i.e. that the mere fact of reading a resource as an + // attachment doesn't make it invalid. + // see: https://github.com/google/filament/issues/5005 + + struct PassData { + FrameGraphId input; + }; + auto& writePass = fg.addPass("Write Pass", [&](FrameGraph::Builder& builder, auto& data) { + data.input = builder.create("Output buffer", {.width=16, .height=32}); + data.input = builder.write(data.input, FrameGraphTexture::Usage::COLOR_ATTACHMENT); + builder.declareRenderPass("Output target", { .attachments = { + .color = { data.input } + }}); + builder.sideEffect(); + }, + [=](FrameGraphResources const& resources, auto const&, backend::DriverApi&) { + auto rt = resources.getRenderPassInfo(); + EXPECT_EQ(rt.params.flags.discardStart, TargetBufferFlags::COLOR0); + EXPECT_EQ(rt.params.flags.discardEnd, TargetBufferFlags::NONE); + }); + + fg.addPass("Read Pass", [&](FrameGraph::Builder& builder, auto& data) { + data.input = builder.read(writePass->input, FrameGraphTexture::Usage::COLOR_ATTACHMENT); + builder.declareRenderPass("Input target", { .attachments = { + .color = { data.input } + }}); + builder.sideEffect(); + }, + [=](FrameGraphResources const& resources, auto const&, backend::DriverApi&) { + auto rt = resources.getRenderPassInfo(); + EXPECT_EQ(rt.params.flags.discardStart, TargetBufferFlags::NONE); + EXPECT_EQ(rt.params.flags.discardEnd, TargetBufferFlags::NONE); + }); + + fg.addPass("Sample Pass", [&](FrameGraph::Builder& builder, auto& data) { + data.input = builder.sample(writePass->input); + builder.sideEffect(); + }, + [=](FrameGraphResources const& resources, auto const&, backend::DriverApi&) { + }); + + + EXPECT_TRUE(fg.isAcyclic()); + + fg.compile(); + + fg.execute(driverApi); +} diff --git a/filament/test/filament_rendering_test.cpp b/filament/test/filament_rendering_test.cpp index 83fcd71a433..18f019f1d13 100644 --- a/filament/test/filament_rendering_test.cpp +++ b/filament/test/filament_rendering_test.cpp @@ -22,7 +22,6 @@ #include #include #include -#include #include @@ -41,7 +40,6 @@ class RenderingTest : public testing::Test { Scene* mScene = nullptr; Camera* mCamera = nullptr; utils::Entity mCameraEntity; - ColorGrading* mColorGrading = nullptr; using closure_t = std::function; @@ -59,20 +57,13 @@ class RenderingTest : public testing::Test { mView->setViewport({0, 0, 16, 16}); mView->setScene(mScene); mView->setCamera(mCamera); - - LinearToneMapper linearToneMapper; - mColorGrading = ColorGrading::Builder() - .toneMapper(&linearToneMapper) - .build(*mEngine); - mView->setColorGrading(mColorGrading); + mView->setPostProcessingEnabled(false); mSkybox = Skybox::Builder().build(*mEngine); mScene->setSkybox(mSkybox); } void TearDown() override { - mEngine->destroy(mColorGrading); - mEngine->destroyCameraComponent(mCameraEntity); utils::EntityManager::get().destroy(mCameraEntity); @@ -115,27 +106,29 @@ class RenderingTest : public testing::Test { }; TEST_F(RenderingTest, ClearRed) { - // We need to clear red to >1 here to ensure a tonemapped value of 255 regardless of LUT - // precision. - mSkybox->setColor({ 2.0f, 0.0f, 0.0f, 1.0f }); + mSkybox->setColor({ 1.0f, 0.0f, 0.0f, 1.0f }); mView->setDithering(View::Dithering::NONE); - runTest([this](uint8_t const* rgba, uint32_t width, uint32_t height) { + bool callbackCalled = false; + runTest([this, &callbackCalled](uint8_t const* rgba, uint32_t width, uint32_t height) { EXPECT_EQ(rgba[0], 0xff); EXPECT_EQ(rgba[1], 0); EXPECT_EQ(rgba[2], 0); EXPECT_EQ(rgba[3], 0xff); + callbackCalled = true; }); + EXPECT_TRUE(callbackCalled); } TEST_F(RenderingTest, ClearGreen) { - // We need to clear green to >1 here to ensure a tonemapped value of 255 regardless of LUT - // precision. - mSkybox->setColor({ 0.0f, 2.0f, 0.0f, 1.0f }); + mSkybox->setColor({ 0.0f, 1.0f, 0.0f, 1.0f }); mView->setDithering(View::Dithering::NONE); - runTest([this](uint8_t const* rgba, uint32_t width, uint32_t height) { + bool callbackCalled = false; + runTest([this, &callbackCalled](uint8_t const* rgba, uint32_t width, uint32_t height) { EXPECT_EQ(rgba[0], 0); EXPECT_EQ(rgba[1], 0xff); EXPECT_EQ(rgba[2], 0); EXPECT_EQ(rgba[3], 0xff); + callbackCalled = true; }); + EXPECT_TRUE(callbackCalled); } diff --git a/filament/test/filament_test.cpp b/filament/test/filament_test.cpp index 790be957a6b..7bd3d3445ab 100644 --- a/filament/test/filament_test.cpp +++ b/filament/test/filament_test.cpp @@ -179,6 +179,23 @@ TEST(FilamentTest, SkinningMath) { } } +TEST(FilamentTest, TransformManagerSimple) { + filament::FTransformManager tcm; + EntityManager& em = EntityManager::get(); + Entity root = em.create(); + tcm.create(root); + + auto ti = tcm.getInstance(root); + + auto t = mat4f::translation(float3{ 1, 2, 3 }); + auto prev = tcm.getWorldTransform(ti); + tcm.setTransform(ti, t); + auto updated = tcm.getWorldTransform(ti); + + EXPECT_NE(prev, t); + EXPECT_EQ(updated, t); +} + TEST(FilamentTest, TransformManager) { filament::FTransformManager tcm; tcm.setAccurateTranslationsEnabled(true); @@ -640,7 +657,7 @@ TEST(FilamentTest, ColorConversion) { TEST(FilamentTest, FroxelData) { using namespace filament; - FEngine* engine = FEngine::create(); + FEngine* engine = downcast(Engine::create()); LinearAllocatorArena arena("FRenderer: per-frame allocator", 3 * 1024 * 1024); utils::ArenaScope scope(arena); @@ -702,8 +719,8 @@ TEST(FilamentTest, FroxelData) { LightManager::Instance instance = engine->getLightManager().getInstance(e); FScene::LightSoa lights; - lights.push_back({}, {}, {}, {}, {}, {}); // first one is always skipped - lights.push_back(float4{ 0, 0, -5, 1 }, {}, instance, 1, {}, {}); + lights.push_back({}, {}, {}, {}, {}, {}, {}, {}); // first one is always skipped + lights.push_back(float4{ 0, 0, -5, 1 }, {}, {}, {}, instance, 1, {}, {}); { froxelData.froxelizeLights(*engine, {}, lights); @@ -712,8 +729,8 @@ TEST(FilamentTest, FroxelData) { // light straddles the "light near" plane size_t pointCount = 0; for (const auto& entry : froxelBuffer) { - EXPECT_LE(entry.count, 1); - pointCount += entry.count; + EXPECT_LE(entry.count(), 1); + pointCount += entry.count(); } EXPECT_GT(pointCount, 0); } @@ -730,8 +747,8 @@ TEST(FilamentTest, FroxelData) { auto const& recordBuffer = froxelData.getRecordBufferUser(); size_t pointCount = 0; for (const auto& entry : froxelBuffer) { - EXPECT_LE(entry.count, 1); - pointCount += entry.count; + EXPECT_LE(entry.count(), 1); + pointCount += entry.count(); } EXPECT_GT(pointCount, 0); } diff --git a/filament/test/filament_test_material_parser.cpp b/filament/test/filament_test_material_parser.cpp index 3966ee99c80..853b540b300 100644 --- a/filament/test/filament_test_material_parser.cpp +++ b/filament/test/filament_test_material_parser.cpp @@ -31,7 +31,7 @@ using namespace filament; // This will re-compile the test material with the current version of matc. // To verify, rebuild and re-run test_material_parser (this test suite). TEST(MaterialParser, Parse) { - MaterialParser parser(backend::Backend::OPENGL, + MaterialParser parser({ backend::ShaderLanguage::ESSL3 }, FILAMENT_TEST_RESOURCES_TEST_MATERIAL_DATA, FILAMENT_TEST_RESOURCES_TEST_MATERIAL_SIZE); MaterialParser::ParseResult materialOk = parser.parse(); diff --git a/ide/emacs/c-filament-style.el b/ide/emacs/c-filament-style.el new file mode 100644 index 00000000000..6b25e52e1b7 --- /dev/null +++ b/ide/emacs/c-filament-style.el @@ -0,0 +1,79 @@ +;;; c-filament-style.el --- Filament C++ style -*- lexical-binding: t -*- + +;; Copyright (C) 2023 Google LLC + +;; Author: Eliza Velasquez +;; Version: 0.1.0 +;; Created: 2023-10-31 +;; Package-Requires: ((emacs "24.1")) +;; Keywords: c +;; URL: https://github.com/google/filament +;; SPDX-License-Identifier: Apache-2 + +;;; Commentary: + +;; Defines a basic Filament style for C++ code in Emacs. + +;;; Code: + +(require 'cc-mode) +(defvar c-syntactic-context) + +(defun c-filament-style-lineup-brace-list-intro (langelem) + "Indent first line of braced lists in the Filament style. + +This properly indents doubled-up arglists + lists, e.g. ({. It +also properly indents enums at 1x and other lists at 2x. + +LANGELEM is the cons of the syntactic symbol and the anchor +position (or nil if there is none)." + (save-excursion + (let (case-fold-search) + (goto-char (c-langelem-pos langelem)) + (if (looking-at "enum\\b") + c-basic-offset + (if (assq 'arglist-cont-nonempty c-syntactic-context) + (- c-basic-offset) + (* 2 c-basic-offset)))))) + +(defun c-filament-style-lineup-brace-list-entry (_langelem) + "Indent following lines in braced lists in the Filament style. + +This properly indents doubled-up arglists + lists, e.g. ({." + (if (assq 'arglist-cont-nonempty c-syntactic-context) + (- (* c-basic-offset 2)) + 0)) + +(defun c-filament-style-lineup-arglist (langelem) + "Indent following lines in braced lists in the Filament style. + +This properly indents arglists nested in if statements. LANGELEM +is the cons of the syntactic symbol and the anchor position (or +nil if there is none)." + (save-excursion + (let (case-fold-search) + (goto-char (c-langelem-pos langelem)) + (if (and (cdr c-syntactic-context) + (looking-at "if\\b")) + c-basic-offset + (* 2 c-basic-offset))))) + +(c-add-style "filament" + '((c-basic-offset . 4) + (c-offsets-alist + (innamespace . 0) + (inextern-lang . 0) + (arglist-intro . c-filament-style-lineup-arglist) + (arglist-cont . 0) + (arglist-cont-nonempty . c-filament-style-lineup-arglist) + (arglist-close . c-filament-style-lineup-arglist) + (statement-cont . ++) + (case-label . +) + (brace-list-intro . c-filament-style-lineup-brace-list-intro) + (brace-list-entry . c-filament-style-lineup-brace-list-entry) + (brace-list-close . c-filament-style-lineup-brace-list-entry) + (label . [0])))) + +(provide 'c-filament-style) + +;;; c-filament-style.el ends here diff --git a/ios/CocoaPods/Filament.podspec b/ios/CocoaPods/Filament.podspec index 125ac0511d1..1133525c5a7 100644 --- a/ios/CocoaPods/Filament.podspec +++ b/ios/CocoaPods/Filament.podspec @@ -1,12 +1,12 @@ Pod::Spec.new do |spec| spec.name = "Filament" - spec.version = "1.31.1" + spec.version = "1.56.6" spec.license = { :type => "Apache 2.0", :file => "LICENSE" } spec.homepage = "https://google.github.io/filament" spec.authors = "Google LLC." spec.summary = "Filament is a real-time physically based rendering engine for Android, iOS, Windows, Linux, macOS, and WASM/WebGL." spec.platform = :ios, "11.0" - spec.source = { :http => "https://github.com/google/filament/releases/download/v1.31.1/filament-v1.31.1-ios.tgz" } + spec.source = { :http => "https://github.com/google/filament/releases/download/v1.56.6/filament-v1.56.6-ios.tgz" } # Fix linking error with Xcode 12; we do not yet support the simulator on Apple silicon. spec.pod_target_xcconfig = { diff --git a/ios/samples/gltf-viewer/gltf-viewer.xcodeproj/project.pbxproj b/ios/samples/gltf-viewer/gltf-viewer.xcodeproj/project.pbxproj index 1f86f2cafc9..6ca453dd4fa 100644 --- a/ios/samples/gltf-viewer/gltf-viewer.xcodeproj/project.pbxproj +++ b/ios/samples/gltf-viewer/gltf-viewer.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ @@ -26,11 +26,11 @@ 1FF7EE9D5DD74F1A740C0D88 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 2B973C3E0FE0EEED37D41D32 /* FILModelView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FILModelView.h; sourceTree = ""; }; 3B5A2C1598614ED63098A783 /* FILViewController.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = FILViewController.mm; sourceTree = ""; }; - 5271315876D6BC61346DFD97 /* default_env_skybox.ktx */ = {isa = PBXFileReference; path = default_env_skybox.ktx; sourceTree = ""; }; + 5271315876D6BC61346DFD97 /* default_env_skybox.ktx */ = {isa = PBXFileReference; lastKnownFileType = file; path = default_env_skybox.ktx; sourceTree = ""; }; 6E6BB885F2B193E786CD9F14 /* FILViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FILViewController.h; sourceTree = ""; }; 7F78E613984102280C822052 /* BusterDrone */ = {isa = PBXFileReference; lastKnownFileType = folder; name = BusterDrone; path = ../../../third_party/models/BusterDrone; sourceTree = SOURCE_ROOT; }; - 9ADEA6DE7305D0B8CCFFA53D /* gltf-viewer.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "gltf-viewer.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - A027015F6F283E92C379F0B1 /* default_env_ibl.ktx */ = {isa = PBXFileReference; path = default_env_ibl.ktx; sourceTree = ""; }; + 9ADEA6DE7305D0B8CCFFA53D /* gltf-viewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "gltf-viewer.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + A027015F6F283E92C379F0B1 /* default_env_ibl.ktx */ = {isa = PBXFileReference; lastKnownFileType = file; path = default_env_ibl.ktx; sourceTree = ""; }; A0A866F9B1B8D315E88D3D12 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; B9C391BBD90EB54D27F8E4FD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; C7ECAA95F4A55C69B948F806 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; @@ -119,8 +119,6 @@ isa = PBXProject; attributes = { LastUpgradeCheck = 1200; - TargetAttributes = { - }; }; buildConfigurationList = 90327DE42AE5DF12C4BD2113 /* Build configuration list for PBXProject "gltf-viewer" */; compatibilityVersion = "Xcode 11.0"; @@ -423,7 +421,6 @@ "-lgltfio_core", "-luberarchive", "-limage", - "-lgeometry", "-lstb", "-lbasis_transcoder", "-lzstd", @@ -432,7 +429,6 @@ "-lmeshoptimizer", "-lviewer", "-lcivetweb", - "-lktxreader", "-luberzlib", ); PRODUCT_BUNDLE_IDENTIFIER = "${SAMPLE_CODE_DISAMBIGUATOR}.google.filament.gltf-viewer"; @@ -480,7 +476,6 @@ "-lgltfio_core", "-luberarchive", "-limage", - "-lgeometry", "-lstb", "-lbasis_transcoder", "-lzstd", @@ -489,7 +484,6 @@ "-lmeshoptimizer", "-lviewer", "-lcivetweb", - "-lktxreader", "-luberzlib", ); PRODUCT_BUNDLE_IDENTIFIER = "${SAMPLE_CODE_DISAMBIGUATOR}.google.filament.gltf-viewer"; @@ -599,7 +593,6 @@ "-lgltfio_core", "-luberarchive", "-limage", - "-lgeometry", "-lstb", "-lbasis_transcoder", "-lzstd", @@ -608,7 +601,6 @@ "-lmeshoptimizer", "-lviewer", "-lcivetweb", - "-lktxreader", "-luberzlib", ); PRODUCT_BUNDLE_IDENTIFIER = "${SAMPLE_CODE_DISAMBIGUATOR}.google.filament.gltf-viewer"; @@ -656,7 +648,6 @@ "-lgltfio_core", "-luberarchive", "-limage", - "-lgeometry", "-lstb", "-lbasis_transcoder", "-lzstd", @@ -665,7 +656,6 @@ "-lmeshoptimizer", "-lviewer", "-lcivetweb", - "-lktxreader", "-luberzlib", ); PRODUCT_BUNDLE_IDENTIFIER = "${SAMPLE_CODE_DISAMBIGUATOR}.google.filament.gltf-viewer"; diff --git a/ios/samples/gltf-viewer/gltf-viewer/FILModelView.h b/ios/samples/gltf-viewer/gltf-viewer/FILModelView.h index 43d0a36edf4..0bc5d7bc700 100644 --- a/ios/samples/gltf-viewer/gltf-viewer/FILModelView.h +++ b/ios/samples/gltf-viewer/gltf-viewer/FILModelView.h @@ -16,6 +16,8 @@ #import +#include + namespace filament { class Engine; class Scene; @@ -76,6 +78,17 @@ typedef NSData* _Nonnull (^ResourceCallback)(NSString* _Nonnull); - (void)destroyModel; +/** + * Issues a pick query at the given view coordinates. + * The coordinates should be in UIKit's coordinate system, with the origin at + * the top-left. + * The callback is triggered with entity of the picked object. + */ +typedef void (^PickCallback)(utils::Entity); +- (void)issuePickQuery:(CGPoint)point callback:(PickCallback)callback; + +- (NSString* _Nullable)getEntityName:(utils::Entity)entity; + /** * Sets up a root transform on the current model to make it fit into a unit cube. */ diff --git a/ios/samples/gltf-viewer/gltf-viewer/FILModelView.mm b/ios/samples/gltf-viewer/gltf-viewer/FILModelView.mm index f2fa902fbf1..20448ee63cc 100644 --- a/ios/samples/gltf-viewer/gltf-viewer/FILModelView.mm +++ b/ios/samples/gltf-viewer/gltf-viewer/FILModelView.mm @@ -127,13 +127,12 @@ - (void)initCommon { _swapChain = _engine->createSwapChain((__bridge void*)self.layer); - _materialProvider = createUbershaderProvider(_engine, - UBERARCHIVE_DEFAULT_DATA, UBERARCHIVE_DEFAULT_SIZE); + _materialProvider = + createUbershaderProvider(_engine, UBERARCHIVE_DEFAULT_DATA, UBERARCHIVE_DEFAULT_SIZE); EntityManager& em = EntityManager::get(); NameComponentManager* ncm = new NameComponentManager(em); _assetLoader = AssetLoader::create({_engine, _materialProvider, ncm, &em}); - _resourceLoader = new ResourceLoader( - {.engine = _engine, .normalizeSkinningWeights = true}); + _resourceLoader = new ResourceLoader({.engine = _engine, .normalizeSkinningWeights = true}); _stbDecoder = createStbProvider(_engine); _ktxDecoder = createKtx2Provider(_engine); _resourceLoader->addTextureProvider("image/png", _stbDecoder); @@ -182,6 +181,26 @@ - (void)destroyModel { _animator = nullptr; } +- (void)issuePickQuery:(CGPoint)point callback:(PickCallback)callback { + CGPoint pointOriginBottomLeft = CGPointMake(point.x, self.bounds.size.height - point.y); + CGPoint pointScaled = CGPointMake(pointOriginBottomLeft.x * self.contentScaleFactor, + pointOriginBottomLeft.y * self.contentScaleFactor); + _view->pick(pointScaled.x, pointScaled.y, + [callback](View::PickingQueryResult const& result) { callback(result.renderable); }); +} + +- (NSString* _Nullable)getEntityName:(utils::Entity)entity { + if (!_asset) { + return nil; + } + NameComponentManager* ncm = _assetLoader->getNames(); + NameComponentManager::Instance instance = ncm->getInstance(entity); + if (instance) { + return [NSString stringWithUTF8String:ncm->getName(ncm->getInstance(entity))]; + } + return nil; +} + - (void)transformToUnitCube { if (!_asset) { return; @@ -256,10 +275,6 @@ - (void)render { - (void)dealloc { [self destroyModel]; - delete _manipulator; - delete _stbDecoder; - delete _ktxDecoder; - _materialProvider->destroyMaterials(); delete _materialProvider; auto* ncm = _assetLoader->getNames(); @@ -267,6 +282,10 @@ - (void)dealloc { AssetLoader::destroy(&_assetLoader); delete _resourceLoader; + delete _manipulator; + delete _stbDecoder; + delete _ktxDecoder; + _engine->destroy(_swapChain); _engine->destroy(_view); EntityManager::get().destroy(_entities.camera); diff --git a/ios/samples/gltf-viewer/gltf-viewer/FILViewController.mm b/ios/samples/gltf-viewer/gltf-viewer/FILViewController.mm index 703ffa64167..80898ec19e1 100644 --- a/ios/samples/gltf-viewer/gltf-viewer/FILViewController.mm +++ b/ios/samples/gltf-viewer/gltf-viewer/FILViewController.mm @@ -15,6 +15,7 @@ */ #import "FILViewController.h" +#include #import "FILModelView.h" @@ -35,6 +36,9 @@ using namespace utils; using namespace ktxreader; +const float kToastAnimationDuration = 0.25f; +const float kToastDelayDuration = 2.0f; + @interface FILViewController () - (void)startDisplayLink; @@ -43,6 +47,9 @@ - (void)stopDisplayLink; - (void)createRenderables; - (void)createLights; +- (void)appWillResignActive:(NSNotification*)notification; +- (void)appDidBecomeActive:(NSNotification*)notification; + @end @implementation FILViewController { @@ -50,6 +57,7 @@ @implementation FILViewController { CFTimeInterval _startTime; viewer::RemoteServer* _server; viewer::AutomationEngine* _automation; + UILabel* _toastLabel; Texture* _skyboxTexture; Skybox* _skybox; @@ -57,6 +65,7 @@ @implementation FILViewController { IndirectLight* _indirectLight; Entity _sun; + UITapGestureRecognizer* _singleTapRecognizer; UITapGestureRecognizer* _doubleTapRecognizer; } @@ -67,6 +76,16 @@ - (void)viewDidLoad { self.title = @"https://google.github.io/filament/remote"; + // Observe lifecycle notifications to prevent us from rendering in the background. + [NSNotificationCenter.defaultCenter addObserver:self + selector:@selector(appWillResignActive:) + name:UIApplicationWillResignActiveNotification + object:nil]; + [NSNotificationCenter.defaultCenter addObserver:self + selector:@selector(appDidBecomeActive:) + name:UIApplicationDidBecomeActiveNotification + object:nil]; + // Arguments: // --model // path to glb or gltf file to load from documents directory @@ -94,9 +113,37 @@ - (void)viewDidLoad { _server = new viewer::RemoteServer(); _automation = viewer::AutomationEngine::createDefault(); - _doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(reloadModel)]; + _doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self + action:@selector(reloadModel)]; _doubleTapRecognizer.numberOfTapsRequired = 2; [self.modelView addGestureRecognizer:_doubleTapRecognizer]; + _singleTapRecognizer = + [[UITapGestureRecognizer alloc] initWithTarget:self + action:@selector(issuePickingQuery)]; + _singleTapRecognizer.numberOfTapsRequired = 1; + [self.modelView addGestureRecognizer:_singleTapRecognizer]; + + // Create a label at the top of the screen to toast messages to the user. + CGRect labelRect = self.view.bounds; + labelRect.size.height = 50; + _toastLabel = [[UILabel alloc] initWithFrame:labelRect]; + _toastLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth; + _toastLabel.textAlignment = NSTextAlignmentCenter; + _toastLabel.textColor = [UIColor whiteColor]; + _toastLabel.backgroundColor = [UIColor colorWithWhite:0.0f alpha:0.5f]; + _toastLabel.numberOfLines = 0; + _toastLabel.lineBreakMode = NSLineBreakByWordWrapping; + _toastLabel.text = @""; + _toastLabel.alpha = 0.0f; + [self.view addSubview:_toastLabel]; +} + +- (void)appWillResignActive:(NSNotification*)notification { + [self stopDisplayLink]; +} + +- (void)appDidBecomeActive:(NSNotification*)notification { + [self startDisplayLink]; } - (void)viewWillAppear:(BOOL)animated { @@ -223,7 +270,8 @@ - (void)loadSettings:(viewer::ReceivedMessage const*)message { .indirectLight = _indirectLight, .sunlight = _sun, }; - _automation->applySettings(self.modelView.engine, message->buffer, message->bufferByteCount, content); + _automation->applySettings( + self.modelView.engine, message->buffer, message->bufferByteCount, content); ColorGrading* const colorGrading = _automation->getColorGrading(self.modelView.engine); self.modelView.view->setColorGrading(colorGrading); self.modelView.cameraFocalLength = _automation->getViewerOptions().cameraFocalLength; @@ -268,7 +316,42 @@ - (void)reloadModel { [self createDefaultRenderables]; } +- (void)issuePickingQuery { + CGPoint tapLocation = [_singleTapRecognizer locationInView:self.modelView]; + __weak typeof(self) weakSelf = self; + [self.modelView issuePickQuery:tapLocation + callback:^(utils::Entity entity) { + NSString* name = [self.modelView getEntityName:entity]; + if (!name) { + name = @""; + } + NSString* message = [NSString + stringWithFormat:@"Picked entity %d (%@) at (%d,%d)", + entity.getId(), name, int(tapLocation.x), int(tapLocation.y)]; + [weakSelf toastMessage:message]; + }]; +} + +- (void)toastMessage:(NSString*)message { + _toastLabel.text = message; + _toastLabel.alpha = 0.0f; + [UIView animateWithDuration:kToastAnimationDuration + animations:^{ + _toastLabel.alpha = 1.0f; + } + completion:^(BOOL finished) { + [UIView animateWithDuration:kToastAnimationDuration + delay:kToastDelayDuration + options:UIViewAnimationOptionCurveEaseInOut + animations:^{ + _toastLabel.alpha = 0.0f; + } + completion:nil]; + }]; +} + - (void)dealloc { + [NSNotificationCenter.defaultCenter removeObserver:self]; delete _server; delete _automation; self.modelView.engine->destroy(_indirectLight); diff --git a/ios/samples/gltf-viewer/project.yml b/ios/samples/gltf-viewer/project.yml index a2d9b70377b..1f850dd45a0 100644 --- a/ios/samples/gltf-viewer/project.yml +++ b/ios/samples/gltf-viewer/project.yml @@ -19,8 +19,8 @@ targets: - FilamentApp settings: base: - OTHER_LDFLAGS: ["-lgltfio_core", "-luberarchive", "-limage", "-lgeometry", "-lstb", "-lbasis_transcoder", - "-lzstd", "-lcamutils", "-ldracodec", "-lmeshoptimizer", "-lviewer", "-lcivetweb", "-lktxreader", + OTHER_LDFLAGS: ["-lgltfio_core", "-luberarchive", "-limage", "-lstb", "-lbasis_transcoder", + "-lzstd", "-lcamutils", "-ldracodec", "-lmeshoptimizer", "-lviewer", "-lcivetweb", "-luberzlib"] preBuildScripts: - path: build-resources.sh diff --git a/ios/samples/hello-ar/hello-ar.xcodeproj/project.pbxproj b/ios/samples/hello-ar/hello-ar.xcodeproj/project.pbxproj index 0c9d64596af..4dad82057cb 100644 --- a/ios/samples/hello-ar/hello-ar.xcodeproj/project.pbxproj +++ b/ios/samples/hello-ar/hello-ar.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ @@ -22,15 +22,15 @@ /* Begin PBXFileReference section */ 05D9AFA7CFC6498FE2A8C6A5 /* FullScreenTriangle.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FullScreenTriangle.cpp; sourceTree = ""; }; - 2AFEFBF6FE91628599F70817 /* clear_coat.mat */ = {isa = PBXFileReference; path = clear_coat.mat; sourceTree = ""; }; + 2AFEFBF6FE91628599F70817 /* clear_coat.mat */ = {isa = PBXFileReference; lastKnownFileType = text; path = clear_coat.mat; sourceTree = ""; }; 2AFF66F1228C5F1079042FE2 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 33B2CBA1A0F654632B39A45D /* ARKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ARKit.framework; path = System/Library/Frameworks/ARKit.framework; sourceTree = SDKROOT; }; 4F8E6B508F8C5DE284DA2E34 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 53D025A0625708CC50AEA0DB /* FilamentView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FilamentView.m; sourceTree = ""; }; 5B5D3E611DCDD9CD2C13B825 /* FilamentApp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FilamentApp.h; sourceTree = ""; }; 6938BE21CFB8BEB2422BD490 /* FilamentArViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FilamentArViewController.h; sourceTree = ""; }; - 7C5E322BA97EEB4FB7EC030F /* camera_feed.mat */ = {isa = PBXFileReference; path = camera_feed.mat; sourceTree = ""; }; - 8832D93E678057F9940A226D /* shadow_plane.mat */ = {isa = PBXFileReference; path = shadow_plane.mat; sourceTree = ""; }; + 7C5E322BA97EEB4FB7EC030F /* camera_feed.mat */ = {isa = PBXFileReference; lastKnownFileType = text; path = camera_feed.mat; sourceTree = ""; }; + 8832D93E678057F9940A226D /* shadow_plane.mat */ = {isa = PBXFileReference; lastKnownFileType = text; path = shadow_plane.mat; sourceTree = ""; }; 973EB840E804440B2AA0F93A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; A85B9D53F72DEE0374F8EBDF /* FullScreenTriangle.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FullScreenTriangle.h; sourceTree = ""; }; AA47852B486CBD549FA68729 /* FilamentArViewController.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = FilamentArViewController.mm; sourceTree = ""; }; @@ -39,8 +39,8 @@ B6B92BD0FA8E6F9CFEAE1707 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; CF21F54926F34F027F4FCEA4 /* FilamentApp.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FilamentApp.cpp; sourceTree = ""; }; D0800F9FE0C390D084082637 /* FilamentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FilamentView.h; sourceTree = ""; }; - D7BA0AA38645722DCFA3490D /* hello-ar.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "hello-ar.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - DD0010D60097DEAA82DAA089 /* Resources.S */ = {isa = PBXFileReference; path = Resources.S; sourceTree = ""; }; + D7BA0AA38645722DCFA3490D /* hello-ar.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "hello-ar.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + DD0010D60097DEAA82DAA089 /* Resources.S */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = Resources.S; sourceTree = ""; }; EC652AC3D2C91759215320C3 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; FCF16FE1B4146DE87F2B76F3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ @@ -161,8 +161,6 @@ isa = PBXProject; attributes = { LastUpgradeCheck = 1200; - TargetAttributes = { - }; }; buildConfigurationList = 281E763643B2F1F3B903864B /* Build configuration list for PBXProject "hello-ar" */; compatibilityVersion = "Xcode 11.0"; @@ -290,7 +288,6 @@ "-lfilameshio", "-lmeshoptimizer", "-limage", - "-lktxreader", ); PRODUCT_BUNDLE_IDENTIFIER = "${SAMPLE_CODE_DISAMBIGUATOR}.google.filament.hello-ar"; SAMPLE_CODE_DISAMBIGUATOR = "${DEVELOPMENT_TEAM}"; @@ -337,7 +334,6 @@ "-lfilameshio", "-lmeshoptimizer", "-limage", - "-lktxreader", ); PRODUCT_BUNDLE_IDENTIFIER = "${SAMPLE_CODE_DISAMBIGUATOR}.google.filament.hello-ar"; SAMPLE_CODE_DISAMBIGUATOR = "${DEVELOPMENT_TEAM}"; @@ -446,7 +442,6 @@ "-lfilameshio", "-lmeshoptimizer", "-limage", - "-lktxreader", ); PRODUCT_BUNDLE_IDENTIFIER = "${SAMPLE_CODE_DISAMBIGUATOR}.google.filament.hello-ar"; SAMPLE_CODE_DISAMBIGUATOR = "${DEVELOPMENT_TEAM}"; @@ -610,7 +605,6 @@ "-lfilameshio", "-lmeshoptimizer", "-limage", - "-lktxreader", ); PRODUCT_BUNDLE_IDENTIFIER = "${SAMPLE_CODE_DISAMBIGUATOR}.google.filament.hello-ar"; SAMPLE_CODE_DISAMBIGUATOR = "${DEVELOPMENT_TEAM}"; diff --git a/ios/samples/hello-ar/project.yml b/ios/samples/hello-ar/project.yml index 7bbb9f68797..483e824a253 100644 --- a/ios/samples/hello-ar/project.yml +++ b/ios/samples/hello-ar/project.yml @@ -10,7 +10,7 @@ targets: - sdk: ARKit.framework settings: base: - OTHER_LDFLAGS: ["-lfilameshio", "-lmeshoptimizer", "-limage", "-lktxreader"] + OTHER_LDFLAGS: ["-lfilameshio", "-lmeshoptimizer", "-limage"] preBuildScripts: - path: build-resources.sh name: Build Resources diff --git a/ios/samples/hello-gltf/hello-gltf.xcodeproj/project.pbxproj b/ios/samples/hello-gltf/hello-gltf.xcodeproj/project.pbxproj index 1c87df56433..9d87ed5702f 100644 --- a/ios/samples/hello-gltf/hello-gltf.xcodeproj/project.pbxproj +++ b/ios/samples/hello-gltf/hello-gltf.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ @@ -31,10 +31,10 @@ 47B161015D23D464253ABAF1 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 6238AED51F5F46CCFBE6892D /* CameraManipulator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CameraManipulator.cpp; sourceTree = ""; }; 84D7269DBC8441140F7F8905 /* FilamentView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FilamentView.m; sourceTree = ""; }; - A37B936423E3B1BF1CA137E0 /* hello-gltf.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "hello-gltf.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + A37B936423E3B1BF1CA137E0 /* hello-gltf.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "hello-gltf.app"; sourceTree = BUILT_PRODUCTS_DIR; }; A52D063A6C24A885D52E2F79 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; - B1B470F3CDEE0D4A60B11C72 /* Resources.S */ = {isa = PBXFileReference; path = Resources.S; sourceTree = ""; }; - B299B19218E1CF7B2D13ABB8 /* DamagedHelmet.glb */ = {isa = PBXFileReference; path = DamagedHelmet.glb; sourceTree = ""; }; + B1B470F3CDEE0D4A60B11C72 /* Resources.S */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = Resources.S; sourceTree = ""; }; + B299B19218E1CF7B2D13ABB8 /* DamagedHelmet.glb */ = {isa = PBXFileReference; lastKnownFileType = file; path = DamagedHelmet.glb; sourceTree = ""; }; BAEAC7786B3EA7E47855A56B /* FilamentViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FilamentViewController.h; sourceTree = ""; }; D3A6F9906B0647549CF53196 /* FilamentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FilamentView.h; sourceTree = ""; }; EC3FAC405D5790391F3AE4FB /* App.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = App.h; sourceTree = ""; }; @@ -134,8 +134,6 @@ isa = PBXProject; attributes = { LastUpgradeCheck = 1200; - TargetAttributes = { - }; }; buildConfigurationList = C7514DDCFDA3C5F803E239F9 /* Build configuration list for PBXProject "hello-gltf" */; compatibilityVersion = "Xcode 11.0"; @@ -326,11 +324,9 @@ "-lgltfio_core", "-luberarchive", "-limage", - "-lgeometry", "-ldracodec", "-lmeshoptimizer", "-lbasis_transcoder", - "-lktxreader", "-lstb", "-lzstd", "-luberzlib", @@ -380,11 +376,9 @@ "-lgltfio_core", "-luberarchive", "-limage", - "-lgeometry", "-ldracodec", "-lmeshoptimizer", "-lbasis_transcoder", - "-lktxreader", "-lstb", "-lzstd", "-luberzlib", @@ -606,11 +600,9 @@ "-lgltfio_core", "-luberarchive", "-limage", - "-lgeometry", "-ldracodec", "-lmeshoptimizer", "-lbasis_transcoder", - "-lktxreader", "-lstb", "-lzstd", "-luberzlib", @@ -660,11 +652,9 @@ "-lgltfio_core", "-luberarchive", "-limage", - "-lgeometry", "-ldracodec", "-lmeshoptimizer", "-lbasis_transcoder", - "-lktxreader", "-lstb", "-lzstd", "-luberzlib", diff --git a/ios/samples/hello-gltf/hello-gltf/CameraManipulator.h b/ios/samples/hello-gltf/hello-gltf/CameraManipulator.h index 1eba71f2471..95036e6b320 100644 --- a/ios/samples/hello-gltf/hello-gltf/CameraManipulator.h +++ b/ios/samples/hello-gltf/hello-gltf/CameraManipulator.h @@ -17,6 +17,8 @@ #ifndef TNT_FILAMENT_SAMPLE_CAMERA_MANIPULATOR_H #define TNT_FILAMENT_SAMPLE_CAMERA_MANIPULATOR_H +#include + #include #include #include diff --git a/ios/samples/hello-gltf/project.yml b/ios/samples/hello-gltf/project.yml index e7a6819a9b9..377578053d3 100644 --- a/ios/samples/hello-gltf/project.yml +++ b/ios/samples/hello-gltf/project.yml @@ -12,8 +12,8 @@ targets: - FilamentApp settings: base: - OTHER_LDFLAGS: ["-lgltfio_core", "-luberarchive", "-limage", "-lgeometry", "-ldracodec", "-lmeshoptimizer", - "-lbasis_transcoder", "-lktxreader", "-lstb", "-lzstd", "-luberzlib"] + OTHER_LDFLAGS: ["-lgltfio_core", "-luberarchive", "-limage", "-ldracodec", "-lmeshoptimizer", + "-lbasis_transcoder", "-lstb", "-lzstd", "-luberzlib"] preBuildScripts: - path: build-resources.sh name: Build Resources diff --git a/ios/samples/hello-pbr/hello-pbr.xcodeproj/project.pbxproj b/ios/samples/hello-pbr/hello-pbr.xcodeproj/project.pbxproj index c0035ece9be..c80979f4f3c 100644 --- a/ios/samples/hello-pbr/hello-pbr.xcodeproj/project.pbxproj +++ b/ios/samples/hello-pbr/hello-pbr.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ @@ -22,15 +22,15 @@ /* Begin PBXFileReference section */ 17ADA23252FA61486B05D5BA /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 1CAE8879115ECEC53FA0F052 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 37CB2FCA6711AE57BD4B39F7 /* hello-pbr.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "hello-pbr.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 37CB2FCA6711AE57BD4B39F7 /* hello-pbr.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "hello-pbr.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 42B9073CE652C53E7F0A4602 /* FilamentView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = FilamentView.mm; sourceTree = ""; }; 4618C7511DE661F89B114734 /* FilamentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FilamentView.h; sourceTree = ""; }; 7D60AE7BAB964978FAA0C84C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 7FE9A0CE98FB055F3478E1CC /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; A17327655C031D575A522AD1 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; A3680F594905261290AEDB79 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - AC02B019CB36611A7BCE5773 /* Resources.S */ = {isa = PBXFileReference; path = Resources.S; sourceTree = ""; }; - ADF252527D202BB9D53E29C8 /* clear_coat.mat */ = {isa = PBXFileReference; path = clear_coat.mat; sourceTree = ""; }; + AC02B019CB36611A7BCE5773 /* Resources.S */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = Resources.S; sourceTree = ""; }; + ADF252527D202BB9D53E29C8 /* clear_coat.mat */ = {isa = PBXFileReference; lastKnownFileType = text; path = clear_coat.mat; sourceTree = ""; }; B35CDFC5B6E5142B5E57BE33 /* FilamentApp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FilamentApp.h; sourceTree = ""; }; D57C53C47A84D05D23B65278 /* CameraManipulator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CameraManipulator.cpp; sourceTree = ""; }; DACB12BFCAAA3222E7D1E9BB /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; @@ -116,8 +116,6 @@ isa = PBXProject; attributes = { LastUpgradeCheck = 1200; - TargetAttributes = { - }; }; buildConfigurationList = 0479354FB8D9A411347D91A6 /* Build configuration list for PBXProject "hello-pbr" */; compatibilityVersion = "Xcode 11.0"; @@ -307,7 +305,6 @@ "-lfilameshio", "-lmeshoptimizer", "-limage", - "-lktxreader", ); PRODUCT_BUNDLE_IDENTIFIER = "${SAMPLE_CODE_DISAMBIGUATOR}.google.filament.hello-pbr"; SAMPLE_CODE_DISAMBIGUATOR = "${DEVELOPMENT_TEAM}"; @@ -354,7 +351,6 @@ "-lfilameshio", "-lmeshoptimizer", "-limage", - "-lktxreader", ); PRODUCT_BUNDLE_IDENTIFIER = "${SAMPLE_CODE_DISAMBIGUATOR}.google.filament.hello-pbr"; SAMPLE_CODE_DISAMBIGUATOR = "${DEVELOPMENT_TEAM}"; @@ -401,7 +397,6 @@ "-lfilameshio", "-lmeshoptimizer", "-limage", - "-lktxreader", ); PRODUCT_BUNDLE_IDENTIFIER = "${SAMPLE_CODE_DISAMBIGUATOR}.google.filament.hello-pbr"; SAMPLE_CODE_DISAMBIGUATOR = "${DEVELOPMENT_TEAM}"; @@ -558,7 +553,6 @@ "-lfilameshio", "-lmeshoptimizer", "-limage", - "-lktxreader", ); PRODUCT_BUNDLE_IDENTIFIER = "${SAMPLE_CODE_DISAMBIGUATOR}.google.filament.hello-pbr"; SAMPLE_CODE_DISAMBIGUATOR = "${DEVELOPMENT_TEAM}"; diff --git a/ios/samples/hello-pbr/hello-pbr/CameraManipulator.h b/ios/samples/hello-pbr/hello-pbr/CameraManipulator.h index 1eba71f2471..95036e6b320 100644 --- a/ios/samples/hello-pbr/hello-pbr/CameraManipulator.h +++ b/ios/samples/hello-pbr/hello-pbr/CameraManipulator.h @@ -17,6 +17,8 @@ #ifndef TNT_FILAMENT_SAMPLE_CAMERA_MANIPULATOR_H #define TNT_FILAMENT_SAMPLE_CAMERA_MANIPULATOR_H +#include + #include #include #include diff --git a/ios/samples/hello-pbr/project.yml b/ios/samples/hello-pbr/project.yml index 70dffa50e43..36a6fd26a3e 100644 --- a/ios/samples/hello-pbr/project.yml +++ b/ios/samples/hello-pbr/project.yml @@ -8,7 +8,7 @@ targets: - FilamentApp settings: base: - OTHER_LDFLAGS: ["-lfilameshio", "-lmeshoptimizer", "-limage", "-lktxreader"] + OTHER_LDFLAGS: ["-lfilameshio", "-lmeshoptimizer", "-limage"] preBuildScripts: - path: build-resources.sh name: Build Resources diff --git a/ios/samples/transparent-rendering/transparent-rendering/Base.lproj/Main.storyboard b/ios/samples/transparent-rendering/transparent-rendering/Base.lproj/Main.storyboard index c676333761c..ebc26a4254a 100644 --- a/ios/samples/transparent-rendering/transparent-rendering/Base.lproj/Main.storyboard +++ b/ios/samples/transparent-rendering/transparent-rendering/Base.lproj/Main.storyboard @@ -1,11 +1,11 @@ - - - - + + - + + + @@ -20,24 +20,24 @@ - - This is a native UITextView. The triangle is rendered by Filament. + This is a native UITextView. The triangle is rendered by Filament. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras tincidunt neque a metus laoreet imperdiet. In cursus arcu quis turpis viverra convallis. Sed eu laoreet metus. Nunc id est lacus. Sed hendrerit elementum velit a finibus. Mauris vitae scelerisque erat. Proin ultricies quam nec justo vehicula, sed porta nulla facilisis. Phasellus orci lectus, ullamcorper efficitur urna non, sodales venenatis sem. Suspendisse auctor, enim non dapibus malesuada, est urna sollicitudin sapien, in sodales mi nulla quis odio. Suspendisse viverra vel orci vitae vestibulum. Fusce tristique ligula nisi, bibendum gravida est volutpat sed. Vivamus ut justo porttitor, feugiat lorem eget, rutrum orci. Donec nec nibh vitae ex consectetur pulvinar. Sed dignissim, metus a tincidunt finibus, justo massa auctor nunc, sit amet cursus ligula sapien ut enim. Quisque ut congue libero, in ultricies tortor. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean ac justo in tortor commodo efficitur et ut leo. - + + - + - + @@ -45,4 +45,12 @@ Phasellus orci lectus, ullamcorper efficitur urna non, sodales venenatis sem. Su + + + + + + + + diff --git a/ios/samples/transparent-rendering/transparent-rendering/FilamentView.mm b/ios/samples/transparent-rendering/transparent-rendering/FilamentView.mm index fd5ff421371..9f858189537 100644 --- a/ios/samples/transparent-rendering/transparent-rendering/FilamentView.mm +++ b/ios/samples/transparent-rendering/transparent-rendering/FilamentView.mm @@ -89,6 +89,7 @@ - (instancetype)initWithCoder:(NSCoder*)coder #elif FILAMENT_APP_USE_METAL [self initializeMetalLayer]; #endif + self.opaque = NO; [self initializeFilament]; self.contentScaleFactor = UIScreen.mainScreen.nativeScale; } diff --git a/libs/bluegl/CMakeLists.txt b/libs/bluegl/CMakeLists.txt index 3d8b6b63f93..704432cd15a 100644 --- a/libs/bluegl/CMakeLists.txt +++ b/libs/bluegl/CMakeLists.txt @@ -4,7 +4,13 @@ project(bluegl ASM) set(TARGET bluegl) set(PUBLIC_HDR_DIR include) -if (WIN32) +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(IS_64_BIT TRUE) +else() + set(IS_64_BIT FALSE) +endif() + +if (WIN32 AND IS_64_BIT) enable_language(ASM_MASM) set_property(SOURCE src/BlueGLCoreWindowsImpl.S PROPERTY LANGUAGE ASM_MASM) endif() @@ -19,13 +25,19 @@ set(SRCS if (WIN32) set(SRCS ${SRCS} src/BlueGLWindows.cpp) - set(SRCS ${SRCS} src/BlueGLCoreWindowsImpl.S) + if(NOT IS_64_BIT) + set(SRCS ${SRCS} src/BlueGLCoreWindows32Impl.cpp) + else() + set(SRCS ${SRCS} src/BlueGLCoreWindowsImpl.S) + endif() elseif (APPLE AND NOT IOS) set(SRCS ${SRCS} src/BlueGLDarwin.cpp) set(SRCS ${SRCS} src/BlueGLCoreDarwinUniversalImpl.S) elseif(LINUX) if(FILAMENT_SUPPORTS_EGL_ON_LINUX) set(SRCS ${SRCS} src/BlueGLLinuxEGL.cpp) + elseif(FILAMENT_SUPPORTS_OSMESA) + set(SRCS ${SRCS} src/BlueGLLinuxOSMesa.cpp) else() set(SRCS ${SRCS} src/BlueGLLinux.cpp) endif() diff --git a/libs/bluegl/bluegl-gen.py b/libs/bluegl/bluegl-gen.py index 1b39890b46c..b25f9ef59fc 100755 --- a/libs/bluegl/bluegl-gen.py +++ b/libs/bluegl/bluegl-gen.py @@ -33,14 +33,15 @@ def printApis(gl_apis): def parseFunctions(include_file, matcher): print('Parsing header %s...' % include_file) regex = re.compile(matcher) - functions = [] with open(include_file) as file: for line in file: match = regex.match(line) if match is not None: - functions.append(match.group(1)) + functions.append({'return': match.group(1), + 'name': match.group(2), + 'parameters': match.group(3)}) return functions @@ -223,9 +224,29 @@ def generateDefineHeader(api, functions, include_dir): with open(src_file, 'w') as file: file.write(header) for function in functions: - file.write('#define %s %s\n' % (function, 'bluegl_' + function)) + file.write('#define %s %s\n' % (function['name'], 'bluegl_' + function['name'])) file.write(footer) + +def parseArguments(parameters): + arguments = [] + + if parameters != 'void': + for parameter in parameters.split(","): + beg = parameter.rfind('*') + if beg == -1: + beg = parameter.rfind(' ') + beg += 1 + + end = parameter.rfind('[') + if end == -1: + end = len(parameter) + + arguments.append(parameter[beg:end]) + + return arguments + + def generateProxies(api, functions, output_dir, platforms): suffix = api['suffix'] @@ -244,7 +265,6 @@ def generateProxies(api, functions, output_dir, platforms): * See the License for the specific language governing permissions and * limitations under the License. */ - /********************************************************************************************** * Generated by bluegl/bluegl-gen.py * DO NOT EDIT @@ -266,23 +286,52 @@ def generateProxies(api, functions, output_dir, platforms): ; See the License for the specific language governing permissions and ; limitations under the License. ; - ; ; Generated by bluegl/bluegl-gen.py ; DO NOT EDIT ; - .code ''' % { 'year': datetime.now().year, } + headerC = '''/* + * Copyright (C) %(year)d The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/********************************************************************************************** + * Generated by bluegl/bluegl-gen.py + * DO NOT EDIT + **********************************************************************************************/ + +#include + +#ifdef __cplusplus +extern "C" { +#endif +''' % { + 'year': datetime.now().year, + } + osSpecificHeader = { - 'Linux': header , - 'LinuxAArch64': header , - 'Darwin': header , - 'DarwinAArch64': header , - 'Windows': headerMasM + 'Linux': header, + 'LinuxAArch64': header, + 'Darwin': header, + 'DarwinAArch64': header, + 'Windows': headerMasM, + 'Windows32': headerC, } osSpecificFooter = { @@ -290,63 +339,89 @@ def generateProxies(api, functions, output_dir, platforms): 'LinuxAArch64': '' , 'Darwin': '', 'DarwinAArch64': '', - 'Windows': 'end\n' + 'Windows': 'end\n', + 'Windows32': ''' +#ifdef __cplusplus +} +#endif +''' } code = { 'Linux': ''' -.global bluegl_%(function)s -.type bluegl_%(function)s, %%function -bluegl_%(function)s: - mov __blue_gl%(suffix)s_%(function)s@GOTPCREL(%%rip), %%r11 +.global bluegl_%(name)s +.type bluegl_%(name)s, %%function +bluegl_%(name)s: + mov __blue_gl%(suffix)s_%(name)s@GOTPCREL(%%rip), %%r11 jmp *(%%r11) ''', 'LinuxAArch64': ''' .align 2 - .global bluegl_%(function)s - .type bluegl_%(function)s, %%function -bluegl_%(function)s: - adrp x16, :got:__blue_gl%(suffix)s_%(function)s - ldr x16, [x16, #:got_lo12:__blue_gl%(suffix)s_%(function)s] + .global bluegl_%(name)s + .type bluegl_%(name)s, %%function +bluegl_%(name)s: + adrp x16, :got:__blue_gl%(suffix)s_%(name)s + ldr x16, [x16, #:got_lo12:__blue_gl%(suffix)s_%(name)s] ldr x16, [x16] br x16 - .size bluegl_%(function)s, .-bluegl_%(function)s + .size bluegl_%(name)s, .-bluegl_%(name)s ''', 'Darwin': ''' -.private_extern _bluegl_%(function)s -_bluegl_%(function)s: - mov ___blue_gl%(suffix)s_%(function)s@GOTPCREL(%%rip), %%r11 +.private_extern _bluegl_%(name)s +_bluegl_%(name)s: + mov ___blue_gl%(suffix)s_%(name)s@GOTPCREL(%%rip), %%r11 jmp *(%%r11) ''', 'DarwinAArch64': ''' -.private_extern _bluegl_%(function)s +.private_extern _bluegl_%(name)s .align 2 -_bluegl_%(function)s: - adrp x16, ___blue_gl%(suffix)s_%(function)s@GOTPAGE - ldr x16, [x16, ___blue_gl%(suffix)s_%(function)s@GOTPAGEOFF] +_bluegl_%(name)s: + adrp x16, ___blue_gl%(suffix)s_%(name)s@GOTPAGE + ldr x16, [x16, ___blue_gl%(suffix)s_%(name)s@GOTPAGEOFF] ldr x16, [x16] br x16 ''', 'Windows': ''' -extrn __blue_gl%(suffix)s_%(function)s: qword -bluegl_%(function)s proc - mov r11, __blue_gl%(suffix)s_%(function)s +extrn __blue_gl%(suffix)s_%(name)s: qword +bluegl_%(name)s proc + mov r11, __blue_gl%(suffix)s_%(name)s jmp r11 -bluegl_%(function)s endp +bluegl_%(name)s endp ''', + 'Windows32': ''' +extern void* __blue_gl%(suffix)s_%(name)s; +%(return)sAPIENTRY bluegl_%(name)s (%(parameters)s) { + typedef %(return)s(APIENTRYP PFN_%(name)s) (%(parameters)s); + return ((PFN_%(name)s)__blue_gl%(suffix)s_%(name)s)(%(arguments)s); +} +''' + } + + extension = { + 'Linux': 'S', + 'LinuxAArch64': 'S', + 'Darwin': 'S', + 'DarwinAArch64': 'S', + 'Windows': 'S', + 'Windows32': 'cpp', } for platform in platforms: - src_file = os.path.join(output_dir, 'BlueGL%s%sImpl.S' % (suffix, platform)) + src_file = os.path.join(output_dir, 'BlueGL%s%sImpl.%s' % (suffix, platform, extension[platform])) print('Generating proxy %s...' % src_file) with open(src_file, 'w') as file: file.write(osSpecificHeader[platform]) for function in functions: - file.write(code[platform] % {'function': function, 'suffix': suffix}) + file.write(code[platform] % { + 'suffix': suffix, + 'return': function['return'], + 'name': function['name'], + 'parameters': function['parameters'], + "arguments": ", ".join(parseArguments(function['parameters'])) + }) file.write(osSpecificFooter[platform]) - def generateSource(api, functions, output_dir): suffix = api['suffix'] if api['suffix'] != 'Core' else '' gl_suffix = '_gl_' + suffix.lower() if len(suffix) > 0 else '' @@ -399,11 +474,11 @@ def generateSource(api, functions, output_dir): file.write(header) file.write("extern \"C\" {\n") for function in functions: - file.write('void* __blue_gl%s_%s;\n' % (api['suffix'], function)) + file.write('void* __blue_gl%s_%s;\n' % (api['suffix'], function['name'])) file.write("}\n") file.write(struct_header) for function in functions: - file.write(' { &__blue_gl%s_%s, "%s" },\n' % (api['suffix'], function, function)) + file.write(' { &__blue_gl%s_%s, "%s" },\n' % (api['suffix'], function['name'], function['name'])) file.write(functions_footer) file.write("size_t %s%sNumFunctions = %d;" % ("blue", api['suffix'], len(functions))) @@ -411,7 +486,7 @@ def generateSource(api, functions, output_dir): def generateApis(apis, include_dir, output_dir): - platforms = ['Linux', 'LinuxAArch64', 'Darwin', 'DarwinAArch64', 'Windows'] + platforms = ['Linux', 'LinuxAArch64', 'Darwin', 'DarwinAArch64', 'Windows', 'Windows32'] for api in apis: functions = [] @@ -420,7 +495,7 @@ def generateApis(apis, include_dir, output_dir): functions += parseFunctions(include_file, api['matcher']) # remove duplicates - functions = list(set(functions)) + functions = list({function['name']: function for function in functions}.values()) print('Found %s functions' % len(functions)) generateHeader(api, functions, include_dir, output_dir) @@ -428,6 +503,7 @@ def generateApis(apis, include_dir, output_dir): generateProxies(api, functions, output_dir, platforms) generateSource(api, functions, output_dir) + if __name__ == '__main__': gl_apis = [ # OpenGL Core (4.x+) support @@ -438,7 +514,7 @@ def generateApis(apis, include_dir, output_dir): 'suffix': 'Core', 'directory': 'GL', 'headers': ['glcorearb.h', 'glext.h'], - 'matcher': r'GLAPI.*APIENTRY\s+(\w+)', + 'matcher': r'GLAPI\s+(.*)APIENTRY\s+(\w+)\s\((.*)\)', 'defines': ['GL_GLEXT_PROTOTYPES'] }, # Legacy OpenGL support @@ -449,7 +525,7 @@ def generateApis(apis, include_dir, output_dir): 'suffix': 'Legacy', 'directory': 'Legacy', 'headers': ['gl.h', 'glext.h'], - 'matcher': r'GLAPI.*APIENTRY\s+(\w+)', + 'matcher': r'GLAPI\s+(.*)APIENTRY\s+(\w+)\s\((.*)\)', 'defines': [] } ] diff --git a/libs/bluegl/include/bluegl/BlueGL.h b/libs/bluegl/include/bluegl/BlueGL.h index 538b302c836..40ee3612f6b 100644 --- a/libs/bluegl/include/bluegl/BlueGL.h +++ b/libs/bluegl/include/bluegl/BlueGL.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/libs/bluegl/include/bluegl/BlueGLDefines.h b/libs/bluegl/include/bluegl/BlueGLDefines.h index b74c83533f6..3bf586cd3fd 100644 --- a/libs/bluegl/include/bluegl/BlueGLDefines.h +++ b/libs/bluegl/include/bluegl/BlueGLDefines.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,2579 +22,2579 @@ #ifndef TNT_FILAMENT_BLUEGL__DEFINES_H #define TNT_FILAMENT_BLUEGL__DEFINES_H -#define glVertexAttrib4dARB bluegl_glVertexAttrib4dARB -#define glMultMatrixxOES bluegl_glMultMatrixxOES -#define glProgramParameters4fvNV bluegl_glProgramParameters4fvNV -#define glGenProgramPipelines bluegl_glGenProgramPipelines -#define glMultiTexCoordP3uiv bluegl_glMultiTexCoordP3uiv -#define glSecondaryColor3usv bluegl_glSecondaryColor3usv -#define glGetHistogramParameteriv bluegl_glGetHistogramParameteriv -#define glRenderbufferStorageEXT bluegl_glRenderbufferStorageEXT -#define glGetPathParameterivNV bluegl_glGetPathParameterivNV -#define glLineWidthxOES bluegl_glLineWidthxOES -#define glGlobalAlphaFactordSUN bluegl_glGlobalAlphaFactordSUN +#define glCullFace bluegl_glCullFace +#define glFrontFace bluegl_glFrontFace +#define glHint bluegl_glHint +#define glLineWidth bluegl_glLineWidth +#define glPointSize bluegl_glPointSize +#define glPolygonMode bluegl_glPolygonMode +#define glScissor bluegl_glScissor +#define glTexParameterf bluegl_glTexParameterf +#define glTexParameterfv bluegl_glTexParameterfv +#define glTexParameteri bluegl_glTexParameteri +#define glTexParameteriv bluegl_glTexParameteriv +#define glTexImage1D bluegl_glTexImage1D #define glTexImage2D bluegl_glTexImage2D -#define glGlobalAlphaFactorfSUN bluegl_glGlobalAlphaFactorfSUN -#define glNormalP3uiv bluegl_glNormalP3uiv -#define glColor4fNormal3fVertex3fSUN bluegl_glColor4fNormal3fVertex3fSUN -#define glMapVertexAttrib1fAPPLE bluegl_glMapVertexAttrib1fAPPLE -#define glTexCoord2fNormal3fVertex3fvSUN bluegl_glTexCoord2fNormal3fVertex3fvSUN -#define glVertexArrayVertexBuffers bluegl_glVertexArrayVertexBuffers +#define glDrawBuffer bluegl_glDrawBuffer +#define glClear bluegl_glClear +#define glClearColor bluegl_glClearColor +#define glClearStencil bluegl_glClearStencil +#define glClearDepth bluegl_glClearDepth +#define glStencilMask bluegl_glStencilMask +#define glColorMask bluegl_glColorMask +#define glDepthMask bluegl_glDepthMask +#define glDisable bluegl_glDisable +#define glEnable bluegl_glEnable +#define glFinish bluegl_glFinish +#define glFlush bluegl_glFlush +#define glBlendFunc bluegl_glBlendFunc +#define glLogicOp bluegl_glLogicOp +#define glStencilFunc bluegl_glStencilFunc +#define glStencilOp bluegl_glStencilOp +#define glDepthFunc bluegl_glDepthFunc +#define glPixelStoref bluegl_glPixelStoref +#define glPixelStorei bluegl_glPixelStorei +#define glReadBuffer bluegl_glReadBuffer +#define glReadPixels bluegl_glReadPixels +#define glGetBooleanv bluegl_glGetBooleanv +#define glGetDoublev bluegl_glGetDoublev +#define glGetError bluegl_glGetError +#define glGetFloatv bluegl_glGetFloatv +#define glGetIntegerv bluegl_glGetIntegerv +#define glGetString bluegl_glGetString +#define glGetTexImage bluegl_glGetTexImage +#define glGetTexParameterfv bluegl_glGetTexParameterfv +#define glGetTexParameteriv bluegl_glGetTexParameteriv +#define glGetTexLevelParameterfv bluegl_glGetTexLevelParameterfv +#define glGetTexLevelParameteriv bluegl_glGetTexLevelParameteriv +#define glIsEnabled bluegl_glIsEnabled +#define glDepthRange bluegl_glDepthRange +#define glViewport bluegl_glViewport +#define glDrawArrays bluegl_glDrawArrays +#define glDrawElements bluegl_glDrawElements +#define glGetPointerv bluegl_glGetPointerv +#define glPolygonOffset bluegl_glPolygonOffset +#define glCopyTexImage1D bluegl_glCopyTexImage1D +#define glCopyTexImage2D bluegl_glCopyTexImage2D +#define glCopyTexSubImage1D bluegl_glCopyTexSubImage1D +#define glCopyTexSubImage2D bluegl_glCopyTexSubImage2D +#define glTexSubImage1D bluegl_glTexSubImage1D +#define glTexSubImage2D bluegl_glTexSubImage2D +#define glBindTexture bluegl_glBindTexture +#define glDeleteTextures bluegl_glDeleteTextures +#define glGenTextures bluegl_glGenTextures +#define glIsTexture bluegl_glIsTexture +#define glDrawRangeElements bluegl_glDrawRangeElements +#define glTexImage3D bluegl_glTexImage3D +#define glTexSubImage3D bluegl_glTexSubImage3D +#define glCopyTexSubImage3D bluegl_glCopyTexSubImage3D +#define glActiveTexture bluegl_glActiveTexture +#define glSampleCoverage bluegl_glSampleCoverage +#define glCompressedTexImage3D bluegl_glCompressedTexImage3D +#define glCompressedTexImage2D bluegl_glCompressedTexImage2D +#define glCompressedTexImage1D bluegl_glCompressedTexImage1D +#define glCompressedTexSubImage3D bluegl_glCompressedTexSubImage3D +#define glCompressedTexSubImage2D bluegl_glCompressedTexSubImage2D +#define glCompressedTexSubImage1D bluegl_glCompressedTexSubImage1D +#define glGetCompressedTexImage bluegl_glGetCompressedTexImage +#define glBlendFuncSeparate bluegl_glBlendFuncSeparate +#define glMultiDrawArrays bluegl_glMultiDrawArrays +#define glMultiDrawElements bluegl_glMultiDrawElements +#define glPointParameterf bluegl_glPointParameterf +#define glPointParameterfv bluegl_glPointParameterfv +#define glPointParameteri bluegl_glPointParameteri +#define glPointParameteriv bluegl_glPointParameteriv +#define glBlendColor bluegl_glBlendColor +#define glBlendEquation bluegl_glBlendEquation +#define glGenQueries bluegl_glGenQueries +#define glDeleteQueries bluegl_glDeleteQueries +#define glIsQuery bluegl_glIsQuery +#define glBeginQuery bluegl_glBeginQuery +#define glEndQuery bluegl_glEndQuery +#define glGetQueryiv bluegl_glGetQueryiv +#define glGetQueryObjectiv bluegl_glGetQueryObjectiv +#define glGetQueryObjectuiv bluegl_glGetQueryObjectuiv +#define glBindBuffer bluegl_glBindBuffer +#define glDeleteBuffers bluegl_glDeleteBuffers +#define glGenBuffers bluegl_glGenBuffers +#define glIsBuffer bluegl_glIsBuffer +#define glBufferData bluegl_glBufferData +#define glBufferSubData bluegl_glBufferSubData +#define glGetBufferSubData bluegl_glGetBufferSubData +#define glMapBuffer bluegl_glMapBuffer +#define glUnmapBuffer bluegl_glUnmapBuffer +#define glGetBufferParameteriv bluegl_glGetBufferParameteriv +#define glGetBufferPointerv bluegl_glGetBufferPointerv +#define glBlendEquationSeparate bluegl_glBlendEquationSeparate +#define glDrawBuffers bluegl_glDrawBuffers +#define glStencilOpSeparate bluegl_glStencilOpSeparate +#define glStencilFuncSeparate bluegl_glStencilFuncSeparate +#define glStencilMaskSeparate bluegl_glStencilMaskSeparate +#define glAttachShader bluegl_glAttachShader +#define glBindAttribLocation bluegl_glBindAttribLocation +#define glCompileShader bluegl_glCompileShader +#define glCreateProgram bluegl_glCreateProgram +#define glCreateShader bluegl_glCreateShader +#define glDeleteProgram bluegl_glDeleteProgram +#define glDeleteShader bluegl_glDeleteShader +#define glDetachShader bluegl_glDetachShader +#define glDisableVertexAttribArray bluegl_glDisableVertexAttribArray +#define glEnableVertexAttribArray bluegl_glEnableVertexAttribArray +#define glGetActiveAttrib bluegl_glGetActiveAttrib +#define glGetActiveUniform bluegl_glGetActiveUniform +#define glGetAttachedShaders bluegl_glGetAttachedShaders +#define glGetAttribLocation bluegl_glGetAttribLocation +#define glGetProgramiv bluegl_glGetProgramiv +#define glGetProgramInfoLog bluegl_glGetProgramInfoLog +#define glGetShaderiv bluegl_glGetShaderiv +#define glGetShaderInfoLog bluegl_glGetShaderInfoLog +#define glGetShaderSource bluegl_glGetShaderSource +#define glGetUniformLocation bluegl_glGetUniformLocation +#define glGetUniformfv bluegl_glGetUniformfv +#define glGetUniformiv bluegl_glGetUniformiv +#define glGetVertexAttribdv bluegl_glGetVertexAttribdv +#define glGetVertexAttribfv bluegl_glGetVertexAttribfv +#define glGetVertexAttribiv bluegl_glGetVertexAttribiv +#define glGetVertexAttribPointerv bluegl_glGetVertexAttribPointerv +#define glIsProgram bluegl_glIsProgram +#define glIsShader bluegl_glIsShader +#define glLinkProgram bluegl_glLinkProgram #define glShaderSource bluegl_glShaderSource -#define glConvolutionFilter1D bluegl_glConvolutionFilter1D -#define glIsFenceAPPLE bluegl_glIsFenceAPPLE -#define glWindowPos2s bluegl_glWindowPos2s -#define glEvaluateDepthValuesARB bluegl_glEvaluateDepthValuesARB -#define glInterpolatePathsNV bluegl_glInterpolatePathsNV -#define glTextureParameterivEXT bluegl_glTextureParameterivEXT -#define glDeleteOcclusionQueriesNV bluegl_glDeleteOcclusionQueriesNV -#define glMakeTextureHandleResidentARB bluegl_glMakeTextureHandleResidentARB -#define glCopyImageSubDataNV bluegl_glCopyImageSubDataNV -#define glVertexAttribL3d bluegl_glVertexAttribL3d -#define glGetTextureSamplerHandleNV bluegl_glGetTextureSamplerHandleNV -#define glMakeTextureHandleResidentNV bluegl_glMakeTextureHandleResidentNV -#define glPolygonOffsetxOES bluegl_glPolygonOffsetxOES +#define glUseProgram bluegl_glUseProgram +#define glUniform1f bluegl_glUniform1f +#define glUniform2f bluegl_glUniform2f +#define glUniform3f bluegl_glUniform3f +#define glUniform4f bluegl_glUniform4f +#define glUniform1i bluegl_glUniform1i +#define glUniform2i bluegl_glUniform2i +#define glUniform3i bluegl_glUniform3i +#define glUniform4i bluegl_glUniform4i +#define glUniform1fv bluegl_glUniform1fv +#define glUniform2fv bluegl_glUniform2fv +#define glUniform3fv bluegl_glUniform3fv +#define glUniform4fv bluegl_glUniform4fv +#define glUniform1iv bluegl_glUniform1iv +#define glUniform2iv bluegl_glUniform2iv +#define glUniform3iv bluegl_glUniform3iv +#define glUniform4iv bluegl_glUniform4iv #define glUniformMatrix2fv bluegl_glUniformMatrix2fv -#define glMultiDrawElementsEXT bluegl_glMultiDrawElementsEXT -#define glVertexAttribI1uiv bluegl_glVertexAttribI1uiv -#define glPathCoordsNV bluegl_glPathCoordsNV -#define glVertexArrayVertexBindingDivisorEXT bluegl_glVertexArrayVertexBindingDivisorEXT +#define glUniformMatrix3fv bluegl_glUniformMatrix3fv +#define glUniformMatrix4fv bluegl_glUniformMatrix4fv +#define glValidateProgram bluegl_glValidateProgram +#define glVertexAttrib1d bluegl_glVertexAttrib1d +#define glVertexAttrib1dv bluegl_glVertexAttrib1dv +#define glVertexAttrib1f bluegl_glVertexAttrib1f +#define glVertexAttrib1fv bluegl_glVertexAttrib1fv +#define glVertexAttrib1s bluegl_glVertexAttrib1s +#define glVertexAttrib1sv bluegl_glVertexAttrib1sv +#define glVertexAttrib2d bluegl_glVertexAttrib2d #define glVertexAttrib2dv bluegl_glVertexAttrib2dv -#define glFinish bluegl_glFinish -#define glVertexAttribs2dvNV bluegl_glVertexAttribs2dvNV -#define glVertexAttribI1ivEXT bluegl_glVertexAttribI1ivEXT -#define glVertexAttrib2sNV bluegl_glVertexAttrib2sNV -#define glMultiTexCoord1iv bluegl_glMultiTexCoord1iv -#define glGetnMapiv bluegl_glGetnMapiv -#define glCompressedTexSubImage1DARB bluegl_glCompressedTexSubImage1DARB -#define glFogCoordPointerEXT bluegl_glFogCoordPointerEXT -#define glCompressedMultiTexImage1DEXT bluegl_glCompressedMultiTexImage1DEXT +#define glVertexAttrib2f bluegl_glVertexAttrib2f +#define glVertexAttrib2fv bluegl_glVertexAttrib2fv +#define glVertexAttrib2s bluegl_glVertexAttrib2s +#define glVertexAttrib2sv bluegl_glVertexAttrib2sv #define glVertexAttrib3d bluegl_glVertexAttrib3d -#define glLineWidth bluegl_glLineWidth -#define glGetShaderiv bluegl_glGetShaderiv -#define glProgramUniform1dv bluegl_glProgramUniform1dv -#define glGetVertexAttribLui64vNV bluegl_glGetVertexAttribLui64vNV -#define glProgramUniform1ui64vNV bluegl_glProgramUniform1ui64vNV -#define glGetRenderbufferParameteriv bluegl_glGetRenderbufferParameteriv -#define glGetOcclusionQueryivNV bluegl_glGetOcclusionQueryivNV -#define glUniformMatrix2x4dv bluegl_glUniformMatrix2x4dv -#define glGetVertexAttribPointervNV bluegl_glGetVertexAttribPointervNV -#define glUniform2fv bluegl_glUniform2fv -#define glRasterPos2xOES bluegl_glRasterPos2xOES -#define glGetCommandHeaderNV bluegl_glGetCommandHeaderNV -#define glUniformSubroutinesuiv bluegl_glUniformSubroutinesuiv -#define glGetPixelTransformParameterivEXT bluegl_glGetPixelTransformParameterivEXT -#define glGetFragDataLocation bluegl_glGetFragDataLocation -#define glTexCoord2fColor3fVertex3fSUN bluegl_glTexCoord2fColor3fVertex3fSUN -#define glSecondaryColor3uiv bluegl_glSecondaryColor3uiv -#define glEnableVertexArrayAttribEXT bluegl_glEnableVertexArrayAttribEXT -#define glPixelTexGenParameterfvSGIS bluegl_glPixelTexGenParameterfvSGIS -#define glProgramUniformMatrix3x4dvEXT bluegl_glProgramUniformMatrix3x4dvEXT -#define glMultiTexCoord2fvARB bluegl_glMultiTexCoord2fvARB -#define glHistogram bluegl_glHistogram -#define glGetSynciv bluegl_glGetSynciv -#define glBitmapxOES bluegl_glBitmapxOES -#define glGetnColorTable bluegl_glGetnColorTable -#define glGenerateMultiTexMipmapEXT bluegl_glGenerateMultiTexMipmapEXT -#define glVertexStream4fvATI bluegl_glVertexStream4fvATI -#define glSecondaryColorPointerEXT bluegl_glSecondaryColorPointerEXT -#define glVertexAttribIPointerEXT bluegl_glVertexAttribIPointerEXT -#define glEvalCoord2xvOES bluegl_glEvalCoord2xvOES -#define glDeleteFencesNV bluegl_glDeleteFencesNV -#define glAlphaFragmentOp1ATI bluegl_glAlphaFragmentOp1ATI -#define glGetActiveUniformName bluegl_glGetActiveUniformName -#define glGetCompressedTextureSubImage bluegl_glGetCompressedTextureSubImage -#define glGetTextureParameterfvEXT bluegl_glGetTextureParameterfvEXT -#define glDeleteShader bluegl_glDeleteShader -#define glRenderbufferStorageMultisample bluegl_glRenderbufferStorageMultisample -#define glTexCoord2fVertex3fSUN bluegl_glTexCoord2fVertex3fSUN -#define glGetActiveSubroutineUniformName bluegl_glGetActiveSubroutineUniformName -#define glGetVideoCaptureStreamfvNV bluegl_glGetVideoCaptureStreamfvNV -#define glInvalidateSubFramebuffer bluegl_glInvalidateSubFramebuffer -#define glIndexFormatNV bluegl_glIndexFormatNV -#define glMultiTexEnvfvEXT bluegl_glMultiTexEnvfvEXT -#define glUniformBufferEXT bluegl_glUniformBufferEXT -#define glNamedProgramLocalParametersI4uivEXT bluegl_glNamedProgramLocalParametersI4uivEXT -#define glWeightPathsNV bluegl_glWeightPathsNV -#define glGetnHistogram bluegl_glGetnHistogram -#define glTexCoord1bOES bluegl_glTexCoord1bOES -#define glSetFragmentShaderConstantATI bluegl_glSetFragmentShaderConstantATI -#define glRasterPos3xvOES bluegl_glRasterPos3xvOES -#define glCopyConvolutionFilter1DEXT bluegl_glCopyConvolutionFilter1DEXT -#define glArrayElementEXT bluegl_glArrayElementEXT -#define glCopyTextureImage2DEXT bluegl_glCopyTextureImage2DEXT -#define glNamedProgramLocalParameterI4uivEXT bluegl_glNamedProgramLocalParameterI4uivEXT -#define glMultiDrawElementsIndirectBindlessNV bluegl_glMultiDrawElementsIndirectBindlessNV -#define glClearColorIuiEXT bluegl_glClearColorIuiEXT -#define glMultiTexParameterfEXT bluegl_glMultiTexParameterfEXT -#define glVertexArrayVertexAttribIFormatEXT bluegl_glVertexArrayVertexAttribIFormatEXT -#define glVertexAttrib1sv bluegl_glVertexAttrib1sv -#define glVertexStream2dvATI bluegl_glVertexStream2dvATI -#define glUniform4iARB bluegl_glUniform4iARB -#define glVertexAttribs4svNV bluegl_glVertexAttribs4svNV -#define glProgramUniformMatrix3x2dvEXT bluegl_glProgramUniformMatrix3x2dvEXT -#define glProgramUniform1ui bluegl_glProgramUniform1ui -#define glVertexAttribIFormatNV bluegl_glVertexAttribIFormatNV -#define glFragmentLightModelfSGIX bluegl_glFragmentLightModelfSGIX -#define glGetActiveSubroutineName bluegl_glGetActiveSubroutineName -#define glConvolutionParameteri bluegl_glConvolutionParameteri -#define glMultiTexCoord4f bluegl_glMultiTexCoord4f -#define glTexCoord1xvOES bluegl_glTexCoord1xvOES -#define glIsTransformFeedback bluegl_glIsTransformFeedback -#define glBlendBarrierKHR bluegl_glBlendBarrierKHR -#define glBindBufferRangeEXT bluegl_glBindBufferRangeEXT -#define glPathColorGenNV bluegl_glPathColorGenNV -#define glEndQuery bluegl_glEndQuery +#define glVertexAttrib3dv bluegl_glVertexAttrib3dv +#define glVertexAttrib3f bluegl_glVertexAttrib3f +#define glVertexAttrib3fv bluegl_glVertexAttrib3fv +#define glVertexAttrib3s bluegl_glVertexAttrib3s +#define glVertexAttrib3sv bluegl_glVertexAttrib3sv +#define glVertexAttrib4Nbv bluegl_glVertexAttrib4Nbv +#define glVertexAttrib4Niv bluegl_glVertexAttrib4Niv +#define glVertexAttrib4Nsv bluegl_glVertexAttrib4Nsv +#define glVertexAttrib4Nub bluegl_glVertexAttrib4Nub +#define glVertexAttrib4Nubv bluegl_glVertexAttrib4Nubv +#define glVertexAttrib4Nuiv bluegl_glVertexAttrib4Nuiv +#define glVertexAttrib4Nusv bluegl_glVertexAttrib4Nusv +#define glVertexAttrib4bv bluegl_glVertexAttrib4bv +#define glVertexAttrib4d bluegl_glVertexAttrib4d +#define glVertexAttrib4dv bluegl_glVertexAttrib4dv +#define glVertexAttrib4f bluegl_glVertexAttrib4f +#define glVertexAttrib4fv bluegl_glVertexAttrib4fv +#define glVertexAttrib4iv bluegl_glVertexAttrib4iv +#define glVertexAttrib4s bluegl_glVertexAttrib4s +#define glVertexAttrib4sv bluegl_glVertexAttrib4sv +#define glVertexAttrib4ubv bluegl_glVertexAttrib4ubv +#define glVertexAttrib4uiv bluegl_glVertexAttrib4uiv +#define glVertexAttrib4usv bluegl_glVertexAttrib4usv +#define glVertexAttribPointer bluegl_glVertexAttribPointer +#define glUniformMatrix2x3fv bluegl_glUniformMatrix2x3fv +#define glUniformMatrix3x2fv bluegl_glUniformMatrix3x2fv #define glUniformMatrix2x4fv bluegl_glUniformMatrix2x4fv +#define glUniformMatrix4x2fv bluegl_glUniformMatrix4x2fv +#define glUniformMatrix3x4fv bluegl_glUniformMatrix3x4fv +#define glUniformMatrix4x3fv bluegl_glUniformMatrix4x3fv +#define glColorMaski bluegl_glColorMaski +#define glGetBooleani_v bluegl_glGetBooleani_v +#define glGetIntegeri_v bluegl_glGetIntegeri_v +#define glEnablei bluegl_glEnablei +#define glDisablei bluegl_glDisablei +#define glIsEnabledi bluegl_glIsEnabledi +#define glBeginTransformFeedback bluegl_glBeginTransformFeedback +#define glEndTransformFeedback bluegl_glEndTransformFeedback +#define glBindBufferRange bluegl_glBindBufferRange +#define glBindBufferBase bluegl_glBindBufferBase +#define glTransformFeedbackVaryings bluegl_glTransformFeedbackVaryings +#define glGetTransformFeedbackVarying bluegl_glGetTransformFeedbackVarying +#define glClampColor bluegl_glClampColor +#define glBeginConditionalRender bluegl_glBeginConditionalRender +#define glEndConditionalRender bluegl_glEndConditionalRender +#define glVertexAttribIPointer bluegl_glVertexAttribIPointer +#define glGetVertexAttribIiv bluegl_glGetVertexAttribIiv +#define glGetVertexAttribIuiv bluegl_glGetVertexAttribIuiv +#define glVertexAttribI1i bluegl_glVertexAttribI1i +#define glVertexAttribI2i bluegl_glVertexAttribI2i +#define glVertexAttribI3i bluegl_glVertexAttribI3i +#define glVertexAttribI4i bluegl_glVertexAttribI4i +#define glVertexAttribI1ui bluegl_glVertexAttribI1ui +#define glVertexAttribI2ui bluegl_glVertexAttribI2ui +#define glVertexAttribI3ui bluegl_glVertexAttribI3ui +#define glVertexAttribI4ui bluegl_glVertexAttribI4ui +#define glVertexAttribI1iv bluegl_glVertexAttribI1iv +#define glVertexAttribI2iv bluegl_glVertexAttribI2iv +#define glVertexAttribI3iv bluegl_glVertexAttribI3iv +#define glVertexAttribI4iv bluegl_glVertexAttribI4iv +#define glVertexAttribI1uiv bluegl_glVertexAttribI1uiv +#define glVertexAttribI2uiv bluegl_glVertexAttribI2uiv +#define glVertexAttribI3uiv bluegl_glVertexAttribI3uiv +#define glVertexAttribI4uiv bluegl_glVertexAttribI4uiv +#define glVertexAttribI4bv bluegl_glVertexAttribI4bv +#define glVertexAttribI4sv bluegl_glVertexAttribI4sv +#define glVertexAttribI4ubv bluegl_glVertexAttribI4ubv +#define glVertexAttribI4usv bluegl_glVertexAttribI4usv +#define glGetUniformuiv bluegl_glGetUniformuiv +#define glBindFragDataLocation bluegl_glBindFragDataLocation +#define glGetFragDataLocation bluegl_glGetFragDataLocation +#define glUniform1ui bluegl_glUniform1ui +#define glUniform2ui bluegl_glUniform2ui +#define glUniform3ui bluegl_glUniform3ui +#define glUniform4ui bluegl_glUniform4ui +#define glUniform1uiv bluegl_glUniform1uiv +#define glUniform2uiv bluegl_glUniform2uiv +#define glUniform3uiv bluegl_glUniform3uiv +#define glUniform4uiv bluegl_glUniform4uiv +#define glTexParameterIiv bluegl_glTexParameterIiv +#define glTexParameterIuiv bluegl_glTexParameterIuiv +#define glGetTexParameterIiv bluegl_glGetTexParameterIiv +#define glGetTexParameterIuiv bluegl_glGetTexParameterIuiv +#define glClearBufferiv bluegl_glClearBufferiv +#define glClearBufferuiv bluegl_glClearBufferuiv +#define glClearBufferfv bluegl_glClearBufferfv +#define glClearBufferfi bluegl_glClearBufferfi +#define glGetStringi bluegl_glGetStringi +#define glIsRenderbuffer bluegl_glIsRenderbuffer +#define glBindRenderbuffer bluegl_glBindRenderbuffer +#define glDeleteRenderbuffers bluegl_glDeleteRenderbuffers #define glGenRenderbuffers bluegl_glGenRenderbuffers -#define glShaderOp2EXT bluegl_glShaderOp2EXT -#define glDrawTransformFeedback bluegl_glDrawTransformFeedback -#define glProgramUniform3ui64vNV bluegl_glProgramUniform3ui64vNV -#define glNamedBufferStorage bluegl_glNamedBufferStorage -#define glOrthoxOES bluegl_glOrthoxOES -#define glVertexAttrib4ubvARB bluegl_glVertexAttrib4ubvARB -#define glStencilOp bluegl_glStencilOp -#define glProgramLocalParametersI4ivNV bluegl_glProgramLocalParametersI4ivNV -#define glVertexStream2iATI bluegl_glVertexStream2iATI -#define glWeightdvARB bluegl_glWeightdvARB -#define glVertexAttrib1fARB bluegl_glVertexAttrib1fARB -#define glColorFragmentOp2ATI bluegl_glColorFragmentOp2ATI -#define glGetBufferPointervARB bluegl_glGetBufferPointervARB -#define glNamedFramebufferTexture1DEXT bluegl_glNamedFramebufferTexture1DEXT -#define glVertexAttrib2fNV bluegl_glVertexAttrib2fNV -#define glDisableVertexAttribArray bluegl_glDisableVertexAttribArray -#define glTextureParameterf bluegl_glTextureParameterf -#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN -#define glNormal3fVertex3fSUN bluegl_glNormal3fVertex3fSUN -#define glGetTexBumpParameterfvATI bluegl_glGetTexBumpParameterfvATI -#define glMultiTexCoord3fARB bluegl_glMultiTexCoord3fARB -#define glTextureParameterfv bluegl_glTextureParameterfv -#define glTexBumpParameterivATI bluegl_glTexBumpParameterivATI -#define glLockArraysEXT bluegl_glLockArraysEXT -#define glIsEnabledIndexedEXT bluegl_glIsEnabledIndexedEXT -#define glGenerateMipmapEXT bluegl_glGenerateMipmapEXT -#define glVertexP3uiv bluegl_glVertexP3uiv -#define glClearNamedBufferSubData bluegl_glClearNamedBufferSubData -#define glInvalidateTexImage bluegl_glInvalidateTexImage +#define glRenderbufferStorage bluegl_glRenderbufferStorage +#define glGetRenderbufferParameteriv bluegl_glGetRenderbufferParameteriv +#define glIsFramebuffer bluegl_glIsFramebuffer #define glBindFramebuffer bluegl_glBindFramebuffer -#define glDrawArraysIndirect bluegl_glDrawArraysIndirect -#define glClipPlanexOES bluegl_glClipPlanexOES -#define glGetFloati_v bluegl_glGetFloati_v -#define glTransformFeedbackVaryingsEXT bluegl_glTransformFeedbackVaryingsEXT -#define glGetColorTableParameteriv bluegl_glGetColorTableParameteriv -#define glTexBufferRange bluegl_glTexBufferRange -#define glVertexAttribI1uivEXT bluegl_glVertexAttribI1uivEXT -#define glShaderBinary bluegl_glShaderBinary -#define glGetVertexAttribLi64vNV bluegl_glGetVertexAttribLi64vNV -#define glGetNamedBufferSubDataEXT bluegl_glGetNamedBufferSubDataEXT -#define glUniform3uivEXT bluegl_glUniform3uivEXT -#define glMatrixTranslatefEXT bluegl_glMatrixTranslatefEXT -#define glVertexAttribs2hvNV bluegl_glVertexAttribs2hvNV -#define glClearBufferSubData bluegl_glClearBufferSubData +#define glDeleteFramebuffers bluegl_glDeleteFramebuffers #define glGenFramebuffers bluegl_glGenFramebuffers -#define glVertexArrayAttribFormat bluegl_glVertexArrayAttribFormat +#define glCheckFramebufferStatus bluegl_glCheckFramebufferStatus +#define glFramebufferTexture1D bluegl_glFramebufferTexture1D +#define glFramebufferTexture2D bluegl_glFramebufferTexture2D +#define glFramebufferTexture3D bluegl_glFramebufferTexture3D +#define glFramebufferRenderbuffer bluegl_glFramebufferRenderbuffer +#define glGetFramebufferAttachmentParameteriv bluegl_glGetFramebufferAttachmentParameteriv +#define glGenerateMipmap bluegl_glGenerateMipmap +#define glBlitFramebuffer bluegl_glBlitFramebuffer +#define glRenderbufferStorageMultisample bluegl_glRenderbufferStorageMultisample +#define glFramebufferTextureLayer bluegl_glFramebufferTextureLayer +#define glMapBufferRange bluegl_glMapBufferRange +#define glFlushMappedBufferRange bluegl_glFlushMappedBufferRange +#define glBindVertexArray bluegl_glBindVertexArray +#define glDeleteVertexArrays bluegl_glDeleteVertexArrays +#define glGenVertexArrays bluegl_glGenVertexArrays +#define glIsVertexArray bluegl_glIsVertexArray +#define glDrawArraysInstanced bluegl_glDrawArraysInstanced +#define glDrawElementsInstanced bluegl_glDrawElementsInstanced +#define glTexBuffer bluegl_glTexBuffer +#define glPrimitiveRestartIndex bluegl_glPrimitiveRestartIndex +#define glCopyBufferSubData bluegl_glCopyBufferSubData +#define glGetUniformIndices bluegl_glGetUniformIndices #define glGetActiveUniformsiv bluegl_glGetActiveUniformsiv -#define glCompressedTextureSubImage1DEXT bluegl_glCompressedTextureSubImage1DEXT -#define glIsRenderbuffer bluegl_glIsRenderbuffer -#define glPresentFrameKeyedNV bluegl_glPresentFrameKeyedNV -#define glProgramUniformMatrix3fvEXT bluegl_glProgramUniformMatrix3fvEXT -#define glVertexAttribL2i64vNV bluegl_glVertexAttribL2i64vNV -#define glFogCoordhvNV bluegl_glFogCoordhvNV -#define glVertexAttrib4ubv bluegl_glVertexAttrib4ubv -#define glPushClientAttribDefaultEXT bluegl_glPushClientAttribDefaultEXT -#define glWindowPos3ivMESA bluegl_glWindowPos3ivMESA -#define glPrimitiveRestartIndexNV bluegl_glPrimitiveRestartIndexNV -#define glCreatePerfQueryINTEL bluegl_glCreatePerfQueryINTEL -#define glGetProgramLocalParameterIuivNV bluegl_glGetProgramLocalParameterIuivNV -#define glResizeBuffersMESA bluegl_glResizeBuffersMESA -#define glVertexStream1fATI bluegl_glVertexStream1fATI -#define glProgramUniform2ui bluegl_glProgramUniform2ui -#define glSecondaryColor3iv bluegl_glSecondaryColor3iv -#define glProgramParameters4dvNV bluegl_glProgramParameters4dvNV -#define glWindowPos3i bluegl_glWindowPos3i -#define glRectxvOES bluegl_glRectxvOES -#define glMultiTexCoord4iARB bluegl_glMultiTexCoord4iARB -#define glBeginConditionalRender bluegl_glBeginConditionalRender -#define glFreeObjectBufferATI bluegl_glFreeObjectBufferATI -#define glGetOcclusionQueryuivNV bluegl_glGetOcclusionQueryuivNV -#define glColorP4ui bluegl_glColorP4ui -#define glGetPathColorGenivNV bluegl_glGetPathColorGenivNV -#define glGetQueryiv bluegl_glGetQueryiv -#define glVertexAttribI2uiv bluegl_glVertexAttribI2uiv -#define glGetVertexArrayPointeri_vEXT bluegl_glGetVertexArrayPointeri_vEXT +#define glGetActiveUniformName bluegl_glGetActiveUniformName +#define glGetUniformBlockIndex bluegl_glGetUniformBlockIndex +#define glGetActiveUniformBlockiv bluegl_glGetActiveUniformBlockiv +#define glGetActiveUniformBlockName bluegl_glGetActiveUniformBlockName +#define glUniformBlockBinding bluegl_glUniformBlockBinding +#define glDrawElementsBaseVertex bluegl_glDrawElementsBaseVertex +#define glDrawRangeElementsBaseVertex bluegl_glDrawRangeElementsBaseVertex +#define glDrawElementsInstancedBaseVertex bluegl_glDrawElementsInstancedBaseVertex +#define glMultiDrawElementsBaseVertex bluegl_glMultiDrawElementsBaseVertex +#define glProvokingVertex bluegl_glProvokingVertex +#define glFenceSync bluegl_glFenceSync +#define glIsSync bluegl_glIsSync +#define glDeleteSync bluegl_glDeleteSync +#define glClientWaitSync bluegl_glClientWaitSync +#define glWaitSync bluegl_glWaitSync +#define glGetInteger64v bluegl_glGetInteger64v +#define glGetSynciv bluegl_glGetSynciv +#define glGetInteger64i_v bluegl_glGetInteger64i_v +#define glGetBufferParameteri64v bluegl_glGetBufferParameteri64v +#define glFramebufferTexture bluegl_glFramebufferTexture +#define glTexImage2DMultisample bluegl_glTexImage2DMultisample +#define glTexImage3DMultisample bluegl_glTexImage3DMultisample +#define glGetMultisamplefv bluegl_glGetMultisamplefv +#define glSampleMaski bluegl_glSampleMaski +#define glBindFragDataLocationIndexed bluegl_glBindFragDataLocationIndexed +#define glGetFragDataIndex bluegl_glGetFragDataIndex +#define glGenSamplers bluegl_glGenSamplers +#define glDeleteSamplers bluegl_glDeleteSamplers +#define glIsSampler bluegl_glIsSampler +#define glBindSampler bluegl_glBindSampler #define glSamplerParameteri bluegl_glSamplerParameteri -#define glResumeTransformFeedbackNV bluegl_glResumeTransformFeedbackNV -#define glVertexAttribL1ui64vNV bluegl_glVertexAttribL1ui64vNV -#define glPauseTransformFeedbackNV bluegl_glPauseTransformFeedbackNV -#define glVertexAttribs2fvNV bluegl_glVertexAttribs2fvNV -#define glProgramUniform1iv bluegl_glProgramUniform1iv -#define glGetColorTableSGI bluegl_glGetColorTableSGI -#define glGetActiveAttrib bluegl_glGetActiveAttrib -#define glResetMinmax bluegl_glResetMinmax -#define glBinormal3svEXT bluegl_glBinormal3svEXT -#define glVertexAttrib4fv bluegl_glVertexAttrib4fv -#define glIndexxOES bluegl_glIndexxOES -#define glMatrixMultTransposefEXT bluegl_glMatrixMultTransposefEXT -#define glNamedFramebufferTexture bluegl_glNamedFramebufferTexture -#define glVertexP2uiv bluegl_glVertexP2uiv -#define glMemoryBarrier bluegl_glMemoryBarrier -#define glGetGraphicsResetStatusARB bluegl_glGetGraphicsResetStatusARB -#define glBindAttribLocation bluegl_glBindAttribLocation -#define glVertexBlendEnviATI bluegl_glVertexBlendEnviATI -#define glAttachObjectARB bluegl_glAttachObjectARB -#define glNormalStream3bvATI bluegl_glNormalStream3bvATI -#define glNamedFramebufferTextureFaceEXT bluegl_glNamedFramebufferTextureFaceEXT -#define glGetConvolutionParameterivEXT bluegl_glGetConvolutionParameterivEXT -#define glProgramPathFragmentInputGenNV bluegl_glProgramPathFragmentInputGenNV -#define glIsFramebufferEXT bluegl_glIsFramebufferEXT -#define glIsVertexArray bluegl_glIsVertexArray -#define glGetVertexAttribIivEXT bluegl_glGetVertexAttribIivEXT -#define glTextureParameterIivEXT bluegl_glTextureParameterIivEXT -#define glGetnPixelMapuiv bluegl_glGetnPixelMapuiv -#define glGetInvariantFloatvEXT bluegl_glGetInvariantFloatvEXT -#define glAttachShader bluegl_glAttachShader -#define glSecondaryColor3i bluegl_glSecondaryColor3i -#define glTexCoord4hvNV bluegl_glTexCoord4hvNV -#define glColorTableSGI bluegl_glColorTableSGI -#define glProgramUniform4uivEXT bluegl_glProgramUniform4uivEXT -#define glPointSizexOES bluegl_glPointSizexOES -#define glTrackMatrixNV bluegl_glTrackMatrixNV -#define glMultiTexCoord1fv bluegl_glMultiTexCoord1fv -#define glSecondaryColorPointerListIBM bluegl_glSecondaryColorPointerListIBM -#define glGenBuffersARB bluegl_glGenBuffersARB -#define glTexCoord4fColor4fNormal3fVertex4fSUN bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN -#define glCopyColorTable bluegl_glCopyColorTable -#define glTexPageCommitmentARB bluegl_glTexPageCommitmentARB -#define glSetFenceAPPLE bluegl_glSetFenceAPPLE -#define glMultiTexCoord2dvARB bluegl_glMultiTexCoord2dvARB -#define glVertex4hvNV bluegl_glVertex4hvNV -#define glBindVertexBuffer bluegl_glBindVertexBuffer -#define glVertex3xvOES bluegl_glVertex3xvOES -#define glConvolutionParameterivEXT bluegl_glConvolutionParameterivEXT -#define glProgramUniform3ui64vARB bluegl_glProgramUniform3ui64vARB -#define glProgramUniform2dv bluegl_glProgramUniform2dv -#define glWindowPos4sMESA bluegl_glWindowPos4sMESA -#define glMultiTexImage1DEXT bluegl_glMultiTexImage1DEXT -#define glRenderbufferStorage bluegl_glRenderbufferStorage -#define glConvolutionFilter2D bluegl_glConvolutionFilter2D -#define glBinormal3bEXT bluegl_glBinormal3bEXT -#define glFragmentLightivSGIX bluegl_glFragmentLightivSGIX -#define glProgramUniform3iv bluegl_glProgramUniform3iv -#define glIsQuery bluegl_glIsQuery -#define glVertexStream2sATI bluegl_glVertexStream2sATI -#define glProgramUniform4iEXT bluegl_glProgramUniform4iEXT -#define glGetInvariantBooleanvEXT bluegl_glGetInvariantBooleanvEXT -#define glSecondaryColorFormatNV bluegl_glSecondaryColorFormatNV -#define glVertexAttrib4fNV bluegl_glVertexAttrib4fNV -#define glColorFragmentOp1ATI bluegl_glColorFragmentOp1ATI -#define glTransformFeedbackBufferBase bluegl_glTransformFeedbackBufferBase -#define glGetTexParameteriv bluegl_glGetTexParameteriv -#define glGetVertexAttribIiv bluegl_glGetVertexAttribIiv -#define glEndOcclusionQueryNV bluegl_glEndOcclusionQueryNV -#define glTransformFeedbackStreamAttribsNV bluegl_glTransformFeedbackStreamAttribsNV -#define glGetQueryBufferObjecti64v bluegl_glGetQueryBufferObjecti64v -#define glStencilFillPathInstancedNV bluegl_glStencilFillPathInstancedNV -#define glDrawCommandsStatesNV bluegl_glDrawCommandsStatesNV +#define glSamplerParameteriv bluegl_glSamplerParameteriv +#define glSamplerParameterf bluegl_glSamplerParameterf +#define glSamplerParameterfv bluegl_glSamplerParameterfv +#define glSamplerParameterIiv bluegl_glSamplerParameterIiv +#define glSamplerParameterIuiv bluegl_glSamplerParameterIuiv +#define glGetSamplerParameteriv bluegl_glGetSamplerParameteriv +#define glGetSamplerParameterIiv bluegl_glGetSamplerParameterIiv #define glGetSamplerParameterfv bluegl_glGetSamplerParameterfv -#define glMultiTexCoord4fARB bluegl_glMultiTexCoord4fARB -#define glUniform3ui64NV bluegl_glUniform3ui64NV -#define glVertexWeighthNV bluegl_glVertexWeighthNV -#define glWindowPos3ivARB bluegl_glWindowPos3ivARB -#define glSecondaryColor3ivEXT bluegl_glSecondaryColor3ivEXT -#define glBindVertexArray bluegl_glBindVertexArray -#define glGetVertexAttribLui64vARB bluegl_glGetVertexAttribLui64vARB -#define glUniform4i64NV bluegl_glUniform4i64NV -#define glBlendBarrierNV bluegl_glBlendBarrierNV -#define glWindowPos3fvARB bluegl_glWindowPos3fvARB -#define glBlendEquationSeparateiARB bluegl_glBlendEquationSeparateiARB -#define glGetVariantFloatvEXT bluegl_glGetVariantFloatvEXT -#define glColorSubTableEXT bluegl_glColorSubTableEXT -#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN -#define glGetProgramResourceiv bluegl_glGetProgramResourceiv -#define glMultiTexCoord1f bluegl_glMultiTexCoord1f -#define glGetNamedFramebufferAttachmentParameteriv bluegl_glGetNamedFramebufferAttachmentParameteriv -#define glDeleteProgramsNV bluegl_glDeleteProgramsNV -#define glGlobalAlphaFactoriSUN bluegl_glGlobalAlphaFactoriSUN -#define glGetFinalCombinerInputParameterfvNV bluegl_glGetFinalCombinerInputParameterfvNV -#define glNormalStream3dATI bluegl_glNormalStream3dATI -#define glMultiTexEnvivEXT bluegl_glMultiTexEnvivEXT -#define glTexCoord4xvOES bluegl_glTexCoord4xvOES -#define glProgramUniform4dvEXT bluegl_glProgramUniform4dvEXT -#define glProgramUniform2ui64vARB bluegl_glProgramUniform2ui64vARB -#define glBindBufferBaseNV bluegl_glBindBufferBaseNV -#define glVertexAttrib4s bluegl_glVertexAttrib4s -#define glTexCoord2fVertex3fvSUN bluegl_glTexCoord2fVertex3fvSUN -#define glMatrixMultdEXT bluegl_glMatrixMultdEXT -#define glGetnMapdvARB bluegl_glGetnMapdvARB -#define glEnableVertexArrayEXT bluegl_glEnableVertexArrayEXT -#define glConvolutionFilter1DEXT bluegl_glConvolutionFilter1DEXT -#define glMemoryBarrierEXT bluegl_glMemoryBarrierEXT -#define glNewObjectBufferATI bluegl_glNewObjectBufferATI -#define glProgramUniform2fv bluegl_glProgramUniform2fv -#define glUniformMatrix4x3fv bluegl_glUniformMatrix4x3fv -#define glGetHistogramParameterfv bluegl_glGetHistogramParameterfv -#define glFrameTerminatorGREMEDY bluegl_glFrameTerminatorGREMEDY -#define glGetProgramLocalParameterfvARB bluegl_glGetProgramLocalParameterfvARB -#define glUnmapNamedBuffer bluegl_glUnmapNamedBuffer -#define glWindowPos2svARB bluegl_glWindowPos2svARB -#define glBindTextureEXT bluegl_glBindTextureEXT -#define glVertexAttrib4svNV bluegl_glVertexAttrib4svNV -#define glPointParameterfSGIS bluegl_glPointParameterfSGIS -#define glSecondaryColor3hvNV bluegl_glSecondaryColor3hvNV -#define glColorTableParameterfv bluegl_glColorTableParameterfv -#define glNamedProgramLocalParameter4fEXT bluegl_glNamedProgramLocalParameter4fEXT -#define glGetTextureParameterivEXT bluegl_glGetTextureParameterivEXT -#define glTestObjectAPPLE bluegl_glTestObjectAPPLE -#define glGetIntegerui64vNV bluegl_glGetIntegerui64vNV -#define glIsVertexAttribEnabledAPPLE bluegl_glIsVertexAttribEnabledAPPLE -#define glActiveTextureARB bluegl_glActiveTextureARB -#define glVertexAttrib3dARB bluegl_glVertexAttrib3dARB -#define glGetTextureHandleARB bluegl_glGetTextureHandleARB -#define glGetColorTableEXT bluegl_glGetColorTableEXT -#define glDrawArraysEXT bluegl_glDrawArraysEXT -#define glImageTransformParameterfHP bluegl_glImageTransformParameterfHP -#define glActiveStencilFaceEXT bluegl_glActiveStencilFaceEXT +#define glGetSamplerParameterIuiv bluegl_glGetSamplerParameterIuiv +#define glQueryCounter bluegl_glQueryCounter +#define glGetQueryObjecti64v bluegl_glGetQueryObjecti64v +#define glGetQueryObjectui64v bluegl_glGetQueryObjectui64v +#define glVertexAttribDivisor bluegl_glVertexAttribDivisor +#define glVertexAttribP1ui bluegl_glVertexAttribP1ui +#define glVertexAttribP1uiv bluegl_glVertexAttribP1uiv +#define glVertexAttribP2ui bluegl_glVertexAttribP2ui +#define glVertexAttribP2uiv bluegl_glVertexAttribP2uiv +#define glVertexAttribP3ui bluegl_glVertexAttribP3ui +#define glVertexAttribP3uiv bluegl_glVertexAttribP3uiv +#define glVertexAttribP4ui bluegl_glVertexAttribP4ui +#define glVertexAttribP4uiv bluegl_glVertexAttribP4uiv +#define glMinSampleShading bluegl_glMinSampleShading +#define glBlendEquationi bluegl_glBlendEquationi +#define glBlendEquationSeparatei bluegl_glBlendEquationSeparatei +#define glBlendFunci bluegl_glBlendFunci +#define glBlendFuncSeparatei bluegl_glBlendFuncSeparatei +#define glDrawArraysIndirect bluegl_glDrawArraysIndirect +#define glDrawElementsIndirect bluegl_glDrawElementsIndirect +#define glUniform1d bluegl_glUniform1d +#define glUniform2d bluegl_glUniform2d +#define glUniform3d bluegl_glUniform3d +#define glUniform4d bluegl_glUniform4d +#define glUniform1dv bluegl_glUniform1dv +#define glUniform2dv bluegl_glUniform2dv +#define glUniform3dv bluegl_glUniform3dv +#define glUniform4dv bluegl_glUniform4dv +#define glUniformMatrix2dv bluegl_glUniformMatrix2dv +#define glUniformMatrix3dv bluegl_glUniformMatrix3dv +#define glUniformMatrix4dv bluegl_glUniformMatrix4dv +#define glUniformMatrix2x3dv bluegl_glUniformMatrix2x3dv +#define glUniformMatrix2x4dv bluegl_glUniformMatrix2x4dv +#define glUniformMatrix3x2dv bluegl_glUniformMatrix3x2dv #define glUniformMatrix3x4dv bluegl_glUniformMatrix3x4dv -#define glProgramUniform4i64ARB bluegl_glProgramUniform4i64ARB -#define glUniform3iv bluegl_glUniform3iv -#define glGetPerfMonitorCountersAMD bluegl_glGetPerfMonitorCountersAMD -#define glFinishFenceAPPLE bluegl_glFinishFenceAPPLE -#define glUniform4ivARB bluegl_glUniform4ivARB -#define glRenderbufferStorageMultisampleEXT bluegl_glRenderbufferStorageMultisampleEXT -#define glPointParameterfvARB bluegl_glPointParameterfvARB -#define glProgramLocalParameterI4uivNV bluegl_glProgramLocalParameterI4uivNV -#define glDeformSGIX bluegl_glDeformSGIX -#define glProgramUniformHandleui64vNV bluegl_glProgramUniformHandleui64vNV -#define glMultiDrawRangeElementArrayAPPLE bluegl_glMultiDrawRangeElementArrayAPPLE -#define glGetnUniformfvARB bluegl_glGetnUniformfvARB -#define glVertexAttribs3svNV bluegl_glVertexAttribs3svNV -#define glVertexAttrib1dvNV bluegl_glVertexAttrib1dvNV -#define glVertexStream1fvATI bluegl_glVertexStream1fvATI +#define glUniformMatrix4x2dv bluegl_glUniformMatrix4x2dv +#define glUniformMatrix4x3dv bluegl_glUniformMatrix4x3dv +#define glGetUniformdv bluegl_glGetUniformdv +#define glGetSubroutineUniformLocation bluegl_glGetSubroutineUniformLocation +#define glGetSubroutineIndex bluegl_glGetSubroutineIndex +#define glGetActiveSubroutineUniformiv bluegl_glGetActiveSubroutineUniformiv +#define glGetActiveSubroutineUniformName bluegl_glGetActiveSubroutineUniformName +#define glGetActiveSubroutineName bluegl_glGetActiveSubroutineName +#define glUniformSubroutinesuiv bluegl_glUniformSubroutinesuiv +#define glGetUniformSubroutineuiv bluegl_glGetUniformSubroutineuiv +#define glGetProgramStageiv bluegl_glGetProgramStageiv +#define glPatchParameteri bluegl_glPatchParameteri +#define glPatchParameterfv bluegl_glPatchParameterfv +#define glBindTransformFeedback bluegl_glBindTransformFeedback +#define glDeleteTransformFeedbacks bluegl_glDeleteTransformFeedbacks +#define glGenTransformFeedbacks bluegl_glGenTransformFeedbacks +#define glIsTransformFeedback bluegl_glIsTransformFeedback +#define glPauseTransformFeedback bluegl_glPauseTransformFeedback +#define glResumeTransformFeedback bluegl_glResumeTransformFeedback +#define glDrawTransformFeedback bluegl_glDrawTransformFeedback +#define glDrawTransformFeedbackStream bluegl_glDrawTransformFeedbackStream +#define glBeginQueryIndexed bluegl_glBeginQueryIndexed +#define glEndQueryIndexed bluegl_glEndQueryIndexed +#define glGetQueryIndexediv bluegl_glGetQueryIndexediv +#define glReleaseShaderCompiler bluegl_glReleaseShaderCompiler +#define glShaderBinary bluegl_glShaderBinary +#define glGetShaderPrecisionFormat bluegl_glGetShaderPrecisionFormat +#define glDepthRangef bluegl_glDepthRangef +#define glClearDepthf bluegl_glClearDepthf +#define glGetProgramBinary bluegl_glGetProgramBinary +#define glProgramBinary bluegl_glProgramBinary +#define glProgramParameteri bluegl_glProgramParameteri +#define glUseProgramStages bluegl_glUseProgramStages +#define glActiveShaderProgram bluegl_glActiveShaderProgram +#define glCreateShaderProgramv bluegl_glCreateShaderProgramv +#define glBindProgramPipeline bluegl_glBindProgramPipeline +#define glDeleteProgramPipelines bluegl_glDeleteProgramPipelines +#define glGenProgramPipelines bluegl_glGenProgramPipelines #define glIsProgramPipeline bluegl_glIsProgramPipeline -#define glGetObjectBufferfvATI bluegl_glGetObjectBufferfvATI -#define glBeginVertexShaderEXT bluegl_glBeginVertexShaderEXT -#define glVertexAttrib4svARB bluegl_glVertexAttrib4svARB -#define glWindowPos2d bluegl_glWindowPos2d -#define glWriteMaskEXT bluegl_glWriteMaskEXT -#define glDrawRangeElements bluegl_glDrawRangeElements -#define glGetFragDataIndex bluegl_glGetFragDataIndex -#define glDeleteTransformFeedbacksNV bluegl_glDeleteTransformFeedbacksNV -#define glProgramUniformMatrix2fvEXT bluegl_glProgramUniformMatrix2fvEXT +#define glGetProgramPipelineiv bluegl_glGetProgramPipelineiv +#define glProgramUniform1i bluegl_glProgramUniform1i +#define glProgramUniform1iv bluegl_glProgramUniform1iv +#define glProgramUniform1f bluegl_glProgramUniform1f +#define glProgramUniform1fv bluegl_glProgramUniform1fv +#define glProgramUniform1d bluegl_glProgramUniform1d +#define glProgramUniform1dv bluegl_glProgramUniform1dv +#define glProgramUniform1ui bluegl_glProgramUniform1ui +#define glProgramUniform1uiv bluegl_glProgramUniform1uiv +#define glProgramUniform2i bluegl_glProgramUniform2i +#define glProgramUniform2iv bluegl_glProgramUniform2iv +#define glProgramUniform2f bluegl_glProgramUniform2f +#define glProgramUniform2fv bluegl_glProgramUniform2fv +#define glProgramUniform2d bluegl_glProgramUniform2d +#define glProgramUniform2dv bluegl_glProgramUniform2dv +#define glProgramUniform2ui bluegl_glProgramUniform2ui +#define glProgramUniform2uiv bluegl_glProgramUniform2uiv +#define glProgramUniform3i bluegl_glProgramUniform3i +#define glProgramUniform3iv bluegl_glProgramUniform3iv +#define glProgramUniform3f bluegl_glProgramUniform3f +#define glProgramUniform3fv bluegl_glProgramUniform3fv +#define glProgramUniform3d bluegl_glProgramUniform3d +#define glProgramUniform3dv bluegl_glProgramUniform3dv #define glProgramUniform3ui bluegl_glProgramUniform3ui -#define glGetTransformFeedbacki_v bluegl_glGetTransformFeedbacki_v -#define glUniformMatrix3x2dv bluegl_glUniformMatrix3x2dv -#define glGetMapxvOES bluegl_glGetMapxvOES -#define glMemoryBarrierByRegion bluegl_glMemoryBarrierByRegion -#define glNamedFramebufferDrawBuffer bluegl_glNamedFramebufferDrawBuffer -#define glIsBufferResidentNV bluegl_glIsBufferResidentNV -#define glStencilOpSeparate bluegl_glStencilOpSeparate -#define glInvalidateNamedFramebufferSubData bluegl_glInvalidateNamedFramebufferSubData -#define glColor3hNV bluegl_glColor3hNV -#define glTextureMaterialEXT bluegl_glTextureMaterialEXT -#define glCompressedTextureSubImage2D bluegl_glCompressedTextureSubImage2D -#define glMultiTexGeniEXT bluegl_glMultiTexGeniEXT -#define glSecondaryColor3usvEXT bluegl_glSecondaryColor3usvEXT +#define glProgramUniform3uiv bluegl_glProgramUniform3uiv +#define glProgramUniform4i bluegl_glProgramUniform4i +#define glProgramUniform4iv bluegl_glProgramUniform4iv +#define glProgramUniform4f bluegl_glProgramUniform4f +#define glProgramUniform4fv bluegl_glProgramUniform4fv +#define glProgramUniform4d bluegl_glProgramUniform4d +#define glProgramUniform4dv bluegl_glProgramUniform4dv +#define glProgramUniform4ui bluegl_glProgramUniform4ui +#define glProgramUniform4uiv bluegl_glProgramUniform4uiv +#define glProgramUniformMatrix2fv bluegl_glProgramUniformMatrix2fv +#define glProgramUniformMatrix3fv bluegl_glProgramUniformMatrix3fv +#define glProgramUniformMatrix4fv bluegl_glProgramUniformMatrix4fv +#define glProgramUniformMatrix2dv bluegl_glProgramUniformMatrix2dv +#define glProgramUniformMatrix3dv bluegl_glProgramUniformMatrix3dv +#define glProgramUniformMatrix4dv bluegl_glProgramUniformMatrix4dv +#define glProgramUniformMatrix2x3fv bluegl_glProgramUniformMatrix2x3fv +#define glProgramUniformMatrix3x2fv bluegl_glProgramUniformMatrix3x2fv +#define glProgramUniformMatrix2x4fv bluegl_glProgramUniformMatrix2x4fv +#define glProgramUniformMatrix4x2fv bluegl_glProgramUniformMatrix4x2fv +#define glProgramUniformMatrix3x4fv bluegl_glProgramUniformMatrix3x4fv +#define glProgramUniformMatrix4x3fv bluegl_glProgramUniformMatrix4x3fv +#define glProgramUniformMatrix2x3dv bluegl_glProgramUniformMatrix2x3dv +#define glProgramUniformMatrix3x2dv bluegl_glProgramUniformMatrix3x2dv +#define glProgramUniformMatrix2x4dv bluegl_glProgramUniformMatrix2x4dv +#define glProgramUniformMatrix4x2dv bluegl_glProgramUniformMatrix4x2dv +#define glProgramUniformMatrix3x4dv bluegl_glProgramUniformMatrix3x4dv +#define glProgramUniformMatrix4x3dv bluegl_glProgramUniformMatrix4x3dv +#define glValidateProgramPipeline bluegl_glValidateProgramPipeline +#define glGetProgramPipelineInfoLog bluegl_glGetProgramPipelineInfoLog +#define glVertexAttribL1d bluegl_glVertexAttribL1d +#define glVertexAttribL2d bluegl_glVertexAttribL2d +#define glVertexAttribL3d bluegl_glVertexAttribL3d +#define glVertexAttribL4d bluegl_glVertexAttribL4d +#define glVertexAttribL1dv bluegl_glVertexAttribL1dv +#define glVertexAttribL2dv bluegl_glVertexAttribL2dv +#define glVertexAttribL3dv bluegl_glVertexAttribL3dv +#define glVertexAttribL4dv bluegl_glVertexAttribL4dv +#define glVertexAttribLPointer bluegl_glVertexAttribLPointer +#define glGetVertexAttribLdv bluegl_glGetVertexAttribLdv +#define glViewportArrayv bluegl_glViewportArrayv +#define glViewportIndexedf bluegl_glViewportIndexedf +#define glViewportIndexedfv bluegl_glViewportIndexedfv +#define glScissorArrayv bluegl_glScissorArrayv +#define glScissorIndexed bluegl_glScissorIndexed +#define glScissorIndexedv bluegl_glScissorIndexedv +#define glDepthRangeArrayv bluegl_glDepthRangeArrayv +#define glDepthRangeIndexed bluegl_glDepthRangeIndexed +#define glGetFloati_v bluegl_glGetFloati_v +#define glGetDoublei_v bluegl_glGetDoublei_v +#define glDrawArraysInstancedBaseInstance bluegl_glDrawArraysInstancedBaseInstance +#define glDrawElementsInstancedBaseInstance bluegl_glDrawElementsInstancedBaseInstance +#define glDrawElementsInstancedBaseVertexBaseInstance bluegl_glDrawElementsInstancedBaseVertexBaseInstance +#define glGetInternalformativ bluegl_glGetInternalformativ +#define glGetActiveAtomicCounterBufferiv bluegl_glGetActiveAtomicCounterBufferiv +#define glBindImageTexture bluegl_glBindImageTexture +#define glMemoryBarrier bluegl_glMemoryBarrier +#define glTexStorage1D bluegl_glTexStorage1D +#define glTexStorage2D bluegl_glTexStorage2D +#define glTexStorage3D bluegl_glTexStorage3D +#define glDrawTransformFeedbackInstanced bluegl_glDrawTransformFeedbackInstanced +#define glDrawTransformFeedbackStreamInstanced bluegl_glDrawTransformFeedbackStreamInstanced +#define glClearBufferData bluegl_glClearBufferData +#define glClearBufferSubData bluegl_glClearBufferSubData +#define glDispatchCompute bluegl_glDispatchCompute +#define glDispatchComputeIndirect bluegl_glDispatchComputeIndirect +#define glCopyImageSubData bluegl_glCopyImageSubData +#define glFramebufferParameteri bluegl_glFramebufferParameteri +#define glGetFramebufferParameteriv bluegl_glGetFramebufferParameteriv +#define glGetInternalformati64v bluegl_glGetInternalformati64v +#define glInvalidateTexSubImage bluegl_glInvalidateTexSubImage +#define glInvalidateTexImage bluegl_glInvalidateTexImage +#define glInvalidateBufferSubData bluegl_glInvalidateBufferSubData +#define glInvalidateBufferData bluegl_glInvalidateBufferData +#define glInvalidateFramebuffer bluegl_glInvalidateFramebuffer +#define glInvalidateSubFramebuffer bluegl_glInvalidateSubFramebuffer +#define glMultiDrawArraysIndirect bluegl_glMultiDrawArraysIndirect +#define glMultiDrawElementsIndirect bluegl_glMultiDrawElementsIndirect +#define glGetProgramInterfaceiv bluegl_glGetProgramInterfaceiv +#define glGetProgramResourceIndex bluegl_glGetProgramResourceIndex #define glGetProgramResourceName bluegl_glGetProgramResourceName -#define glTextureStorageSparseAMD bluegl_glTextureStorageSparseAMD -#define glPixelStorei bluegl_glPixelStorei -#define glGetBooleani_v bluegl_glGetBooleani_v -#define glGetPathCoordsNV bluegl_glGetPathCoordsNV -#define glVertexAttrib3svNV bluegl_glVertexAttrib3svNV -#define glUniformui64NV bluegl_glUniformui64NV -#define glIsImageHandleResidentNV bluegl_glIsImageHandleResidentNV -#define glBeginConditionalRenderNV bluegl_glBeginConditionalRenderNV -#define glNamedFramebufferParameteriEXT bluegl_glNamedFramebufferParameteriEXT -#define glIsVertexArrayAPPLE bluegl_glIsVertexArrayAPPLE -#define glPointParameterfvEXT bluegl_glPointParameterfvEXT -#define glGetnMapfvARB bluegl_glGetnMapfvARB -#define glCopyColorSubTable bluegl_glCopyColorSubTable -#define glVariantbvEXT bluegl_glVariantbvEXT -#define glTextureParameterIuiv bluegl_glTextureParameterIuiv -#define glPNTrianglesiATI bluegl_glPNTrianglesiATI -#define glBlendFunc bluegl_glBlendFunc -#define glVertexAttrib4uiv bluegl_glVertexAttrib4uiv -#define glUniform2ui bluegl_glUniform2ui -#define glBlendColor bluegl_glBlendColor -#define glViewport bluegl_glViewport -#define glWindowPos2fvARB bluegl_glWindowPos2fvARB -#define glSampleCoverage bluegl_glSampleCoverage -#define glSecondaryColor3ubv bluegl_glSecondaryColor3ubv -#define glColor4xOES bluegl_glColor4xOES -#define glVertexAttribL1dEXT bluegl_glVertexAttribL1dEXT -#define glMultTransposeMatrixf bluegl_glMultTransposeMatrixf -#define glGetVertexArrayIntegeri_vEXT bluegl_glGetVertexArrayIntegeri_vEXT -#define glCullParameterfvEXT bluegl_glCullParameterfvEXT -#define glMapNamedBufferRangeEXT bluegl_glMapNamedBufferRangeEXT -#define glTextureImage3DEXT bluegl_glTextureImage3DEXT -#define glBufferAddressRangeNV bluegl_glBufferAddressRangeNV -#define glGetVertexAttribdv bluegl_glGetVertexAttribdv -#define glNamedFramebufferSampleLocationsfvARB bluegl_glNamedFramebufferSampleLocationsfvARB -#define glMultiTexCoord2i bluegl_glMultiTexCoord2i -#define glBindFramebufferEXT bluegl_glBindFramebufferEXT -#define glTexParameterfv bluegl_glTexParameterfv -#define glGetProgramNamedParameterfvNV bluegl_glGetProgramNamedParameterfvNV -#define glTextureStorage3DEXT bluegl_glTextureStorage3DEXT -#define glGetDebugMessageLogAMD bluegl_glGetDebugMessageLogAMD -#define glTexCoord1hvNV bluegl_glTexCoord1hvNV -#define glRenderbufferStorageMultisampleCoverageNV bluegl_glRenderbufferStorageMultisampleCoverageNV -#define glProgramUniform3i64vARB bluegl_glProgramUniform3i64vARB -#define glFragmentMaterialfvSGIX bluegl_glFragmentMaterialfvSGIX -#define glGetImageHandleARB bluegl_glGetImageHandleARB -#define glVertexAttribs3fvNV bluegl_glVertexAttribs3fvNV -#define glTexSubImage4DSGIS bluegl_glTexSubImage4DSGIS -#define glListParameteriSGIX bluegl_glListParameteriSGIX -#define glPixelTransformParameterfEXT bluegl_glPixelTransformParameterfEXT -#define glMapParameterfvNV bluegl_glMapParameterfvNV -#define glProgramUniform3dv bluegl_glProgramUniform3dv -#define glUniformMatrix3fv bluegl_glUniformMatrix3fv -#define glProgramUniform4fEXT bluegl_glProgramUniform4fEXT -#define glMultiTexCoord2hNV bluegl_glMultiTexCoord2hNV -#define glVertexAttribI4uiv bluegl_glVertexAttribI4uiv -#define glSecondaryColor3b bluegl_glSecondaryColor3b -#define glFogxvOES bluegl_glFogxvOES -#define glGlobalAlphaFactorubSUN bluegl_glGlobalAlphaFactorubSUN -#define glVertexAttribI4svEXT bluegl_glVertexAttribI4svEXT -#define glSecondaryColor3sv bluegl_glSecondaryColor3sv -#define glProgramUniformMatrix2x3dvEXT bluegl_glProgramUniformMatrix2x3dvEXT -#define glTextureBarrier bluegl_glTextureBarrier -#define glCreateSamplers bluegl_glCreateSamplers -#define glVertexAttribP2ui bluegl_glVertexAttribP2ui -#define glGetTexParameterIiv bluegl_glGetTexParameterIiv -#define glConvolutionParameterfvEXT bluegl_glConvolutionParameterfvEXT -#define glPathGlyphIndexArrayNV bluegl_glPathGlyphIndexArrayNV -#define glCopyTexSubImage2D bluegl_glCopyTexSubImage2D -#define glVertexArrayParameteriAPPLE bluegl_glVertexArrayParameteriAPPLE -#define glGetnConvolutionFilterARB bluegl_glGetnConvolutionFilterARB -#define glVariantfvEXT bluegl_glVariantfvEXT -#define glGetMultisamplefvNV bluegl_glGetMultisamplefvNV -#define glQueryObjectParameteruiAMD bluegl_glQueryObjectParameteruiAMD -#define glMatrixIndexPointerARB bluegl_glMatrixIndexPointerARB -#define glGetQueryObjectuivARB bluegl_glGetQueryObjectuivARB -#define glColorFormatNV bluegl_glColorFormatNV -#define glMultiTexGenfvEXT bluegl_glMultiTexGenfvEXT -#define glGetUniformfvARB bluegl_glGetUniformfvARB -#define glTexCoord3hNV bluegl_glTexCoord3hNV -#define glPathGlyphRangeNV bluegl_glPathGlyphRangeNV -#define glCopyTextureSubImage3DEXT bluegl_glCopyTextureSubImage3DEXT -#define glColor3xOES bluegl_glColor3xOES -#define glVertexAttrib4hNV bluegl_glVertexAttrib4hNV -#define glProgramUniformui64NV bluegl_glProgramUniformui64NV -#define glVertexArrayVertexAttribLFormatEXT bluegl_glVertexArrayVertexAttribLFormatEXT -#define glGetMinmaxParameterivEXT bluegl_glGetMinmaxParameterivEXT -#define glWindowPos3iMESA bluegl_glWindowPos3iMESA +#define glGetProgramResourceiv bluegl_glGetProgramResourceiv +#define glGetProgramResourceLocation bluegl_glGetProgramResourceLocation +#define glGetProgramResourceLocationIndex bluegl_glGetProgramResourceLocationIndex +#define glShaderStorageBlockBinding bluegl_glShaderStorageBlockBinding +#define glTexBufferRange bluegl_glTexBufferRange +#define glTexStorage2DMultisample bluegl_glTexStorage2DMultisample +#define glTexStorage3DMultisample bluegl_glTexStorage3DMultisample +#define glTextureView bluegl_glTextureView +#define glBindVertexBuffer bluegl_glBindVertexBuffer +#define glVertexAttribFormat bluegl_glVertexAttribFormat +#define glVertexAttribIFormat bluegl_glVertexAttribIFormat #define glVertexAttribLFormat bluegl_glVertexAttribLFormat -#define glGetObjectParameterfvARB bluegl_glGetObjectParameterfvARB -#define glStencilFillPathNV bluegl_glStencilFillPathNV -#define glEvalCoord1xvOES bluegl_glEvalCoord1xvOES -#define glUniform4d bluegl_glUniform4d -#define glGetTextureHandleNV bluegl_glGetTextureHandleNV -#define glGetUniformuivEXT bluegl_glGetUniformuivEXT -#define glIsTextureEXT bluegl_glIsTextureEXT -#define glProgramUniform2d bluegl_glProgramUniform2d -#define glGetnUniformuivARB bluegl_glGetnUniformuivARB -#define glIsShader bluegl_glIsShader -#define glGetVertexArrayIndexed64iv bluegl_glGetVertexArrayIndexed64iv -#define glGetnHistogramARB bluegl_glGetnHistogramARB -#define glTexCoord2fColor4fNormal3fVertex3fvSUN bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN -#define glVertexAttribI2ivEXT bluegl_glVertexAttribI2ivEXT -#define glTexSubImage2DEXT bluegl_glTexSubImage2DEXT -#define glGetFragmentMaterialivSGIX bluegl_glGetFragmentMaterialivSGIX +#define glVertexAttribBinding bluegl_glVertexAttribBinding +#define glVertexBindingDivisor bluegl_glVertexBindingDivisor +#define glDebugMessageControl bluegl_glDebugMessageControl +#define glDebugMessageInsert bluegl_glDebugMessageInsert +#define glDebugMessageCallback bluegl_glDebugMessageCallback +#define glGetDebugMessageLog bluegl_glGetDebugMessageLog +#define glPushDebugGroup bluegl_glPushDebugGroup +#define glPopDebugGroup bluegl_glPopDebugGroup +#define glObjectLabel bluegl_glObjectLabel +#define glGetObjectLabel bluegl_glGetObjectLabel +#define glObjectPtrLabel bluegl_glObjectPtrLabel +#define glGetObjectPtrLabel bluegl_glGetObjectPtrLabel +#define glBufferStorage bluegl_glBufferStorage +#define glClearTexImage bluegl_glClearTexImage +#define glClearTexSubImage bluegl_glClearTexSubImage +#define glBindBuffersBase bluegl_glBindBuffersBase +#define glBindBuffersRange bluegl_glBindBuffersRange +#define glBindTextures bluegl_glBindTextures +#define glBindSamplers bluegl_glBindSamplers +#define glBindImageTextures bluegl_glBindImageTextures +#define glBindVertexBuffers bluegl_glBindVertexBuffers +#define glClipControl bluegl_glClipControl +#define glCreateTransformFeedbacks bluegl_glCreateTransformFeedbacks +#define glTransformFeedbackBufferBase bluegl_glTransformFeedbackBufferBase +#define glTransformFeedbackBufferRange bluegl_glTransformFeedbackBufferRange +#define glGetTransformFeedbackiv bluegl_glGetTransformFeedbackiv +#define glGetTransformFeedbacki_v bluegl_glGetTransformFeedbacki_v +#define glGetTransformFeedbacki64_v bluegl_glGetTransformFeedbacki64_v +#define glCreateBuffers bluegl_glCreateBuffers +#define glNamedBufferStorage bluegl_glNamedBufferStorage +#define glNamedBufferData bluegl_glNamedBufferData +#define glNamedBufferSubData bluegl_glNamedBufferSubData +#define glCopyNamedBufferSubData bluegl_glCopyNamedBufferSubData +#define glClearNamedBufferData bluegl_glClearNamedBufferData +#define glClearNamedBufferSubData bluegl_glClearNamedBufferSubData +#define glMapNamedBuffer bluegl_glMapNamedBuffer +#define glMapNamedBufferRange bluegl_glMapNamedBufferRange +#define glUnmapNamedBuffer bluegl_glUnmapNamedBuffer +#define glFlushMappedNamedBufferRange bluegl_glFlushMappedNamedBufferRange +#define glGetNamedBufferParameteriv bluegl_glGetNamedBufferParameteriv +#define glGetNamedBufferParameteri64v bluegl_glGetNamedBufferParameteri64v +#define glGetNamedBufferPointerv bluegl_glGetNamedBufferPointerv +#define glGetNamedBufferSubData bluegl_glGetNamedBufferSubData +#define glCreateFramebuffers bluegl_glCreateFramebuffers +#define glNamedFramebufferRenderbuffer bluegl_glNamedFramebufferRenderbuffer +#define glNamedFramebufferParameteri bluegl_glNamedFramebufferParameteri +#define glNamedFramebufferTexture bluegl_glNamedFramebufferTexture +#define glNamedFramebufferTextureLayer bluegl_glNamedFramebufferTextureLayer +#define glNamedFramebufferDrawBuffer bluegl_glNamedFramebufferDrawBuffer +#define glNamedFramebufferDrawBuffers bluegl_glNamedFramebufferDrawBuffers +#define glNamedFramebufferReadBuffer bluegl_glNamedFramebufferReadBuffer +#define glInvalidateNamedFramebufferData bluegl_glInvalidateNamedFramebufferData +#define glInvalidateNamedFramebufferSubData bluegl_glInvalidateNamedFramebufferSubData #define glClearNamedFramebufferiv bluegl_glClearNamedFramebufferiv -#define glMatrixMult3x3fNV bluegl_glMatrixMult3x3fNV -#define glGetQueryBufferObjectiv bluegl_glGetQueryBufferObjectiv -#define glVideoCaptureStreamParameterfvNV bluegl_glVideoCaptureStreamParameterfvNV -#define glTexImage3DMultisample bluegl_glTexImage3DMultisample -#define glVertexArraySecondaryColorOffsetEXT bluegl_glVertexArraySecondaryColorOffsetEXT -#define glVariantusvEXT bluegl_glVariantusvEXT -#define glDrawArraysInstanced bluegl_glDrawArraysInstanced -#define glProgramUniformMatrix2x4dvEXT bluegl_glProgramUniformMatrix2x4dvEXT -#define glProgramBufferParametersIivNV bluegl_glProgramBufferParametersIivNV -#define glViewportArrayv bluegl_glViewportArrayv -#define glTangent3svEXT bluegl_glTangent3svEXT -#define glReplacementCodeuiVertex3fSUN bluegl_glReplacementCodeuiVertex3fSUN -#define glSharpenTexFuncSGIS bluegl_glSharpenTexFuncSGIS -#define glNormalFormatNV bluegl_glNormalFormatNV -#define glVertexAttribL3dv bluegl_glVertexAttribL3dv -#define glNamedStringARB bluegl_glNamedStringARB -#define glVertexArrayVertexAttribFormatEXT bluegl_glVertexArrayVertexAttribFormatEXT -#define glMultiTexCoordP3ui bluegl_glMultiTexCoordP3ui -#define glMultiTexSubImage3DEXT bluegl_glMultiTexSubImage3DEXT -#define glUniform2fvARB bluegl_glUniform2fvARB -#define glGetPixelMapxv bluegl_glGetPixelMapxv -#define glTangent3ivEXT bluegl_glTangent3ivEXT -#define glGetLocalConstantIntegervEXT bluegl_glGetLocalConstantIntegervEXT -#define glPresentFrameDualFillNV bluegl_glPresentFrameDualFillNV -#define glEndVertexShaderEXT bluegl_glEndVertexShaderEXT -#define glVertexArrayVertexBuffer bluegl_glVertexArrayVertexBuffer -#define glMakeTextureHandleNonResidentNV bluegl_glMakeTextureHandleNonResidentNV -#define glVertexAttribI3uiEXT bluegl_glVertexAttribI3uiEXT -#define glBinormal3bvEXT bluegl_glBinormal3bvEXT -#define glPixelTexGenParameterfSGIS bluegl_glPixelTexGenParameterfSGIS -#define glMultiTexGenivEXT bluegl_glMultiTexGenivEXT -#define glGetVideoivNV bluegl_glGetVideoivNV -#define glMultiTexCoordP2ui bluegl_glMultiTexCoordP2ui -#define glDeletePerfQueryINTEL bluegl_glDeletePerfQueryINTEL -#define glDepthBoundsdNV bluegl_glDepthBoundsdNV -#define glPixelTransferxOES bluegl_glPixelTransferxOES -#define glCombinerOutputNV bluegl_glCombinerOutputNV -#define glCopyTextureSubImage1D bluegl_glCopyTextureSubImage1D -#define glVertexAttribI4iv bluegl_glVertexAttribI4iv -#define glCopyTexImage2DEXT bluegl_glCopyTexImage2DEXT -#define glBindLightParameterEXT bluegl_glBindLightParameterEXT -#define glMultiDrawElementsBaseVertex bluegl_glMultiDrawElementsBaseVertex -#define glProgramUniform2uivEXT bluegl_glProgramUniform2uivEXT -#define glDeletePerfMonitorsAMD bluegl_glDeletePerfMonitorsAMD -#define glCopyImageSubData bluegl_glCopyImageSubData -#define glPathCoverDepthFuncNV bluegl_glPathCoverDepthFuncNV -#define glGetFramebufferAttachmentParameteriv bluegl_glGetFramebufferAttachmentParameteriv -#define glRectxOES bluegl_glRectxOES -#define glTagSampleBufferSGIX bluegl_glTagSampleBufferSGIX -#define glVertexStream3svATI bluegl_glVertexStream3svATI -#define glGetPathTexGenfvNV bluegl_glGetPathTexGenfvNV -#define glOrthofOES bluegl_glOrthofOES -#define glCopyTexImage2D bluegl_glCopyTexImage2D -#define glTexCoord2fColor4ubVertex3fSUN bluegl_glTexCoord2fColor4ubVertex3fSUN -#define glMultTransposeMatrixdARB bluegl_glMultTransposeMatrixdARB -#define glProgramUniform3i bluegl_glProgramUniform3i -#define glArrayObjectATI bluegl_glArrayObjectATI -#define glMatrixRotatedEXT bluegl_glMatrixRotatedEXT -#define glTexCoordP2ui bluegl_glTexCoordP2ui -#define glPassTexCoordATI bluegl_glPassTexCoordATI -#define glIsTexture bluegl_glIsTexture -#define glCompressedTexSubImage3DARB bluegl_glCompressedTexSubImage3DARB -#define glDepthRangexOES bluegl_glDepthRangexOES -#define glImageTransformParameterivHP bluegl_glImageTransformParameterivHP -#define glMultTransposeMatrixfARB bluegl_glMultTransposeMatrixfARB -#define glUniformHandleui64vARB bluegl_glUniformHandleui64vARB -#define glGenTransformFeedbacks bluegl_glGenTransformFeedbacks -#define glTextureStorage1D bluegl_glTextureStorage1D -#define glGetVertexAttribivNV bluegl_glGetVertexAttribivNV -#define glReplacementCodePointerSUN bluegl_glReplacementCodePointerSUN -#define glVertexAttribI3uiv bluegl_glVertexAttribI3uiv -#define glReplacementCodeuiNormal3fVertex3fSUN bluegl_glReplacementCodeuiNormal3fVertex3fSUN -#define glVertexAttribL2dEXT bluegl_glVertexAttribL2dEXT -#define glProgramUniform3ui64NV bluegl_glProgramUniform3ui64NV -#define glProgramUniform3i64NV bluegl_glProgramUniform3i64NV -#define glGetNamedRenderbufferParameterivEXT bluegl_glGetNamedRenderbufferParameterivEXT -#define glTangent3bvEXT bluegl_glTangent3bvEXT -#define glProgramUniform1dvEXT bluegl_glProgramUniform1dvEXT -#define glMatrixLoadTransposedEXT bluegl_glMatrixLoadTransposedEXT -#define glGetVertexAttribLdv bluegl_glGetVertexAttribLdv -#define glVertexStream2dATI bluegl_glVertexStream2dATI -#define glGetFragmentLightivSGIX bluegl_glGetFragmentLightivSGIX -#define glGetMinmaxEXT bluegl_glGetMinmaxEXT -#define glFlushStaticDataIBM bluegl_glFlushStaticDataIBM -#define glShaderOp1EXT bluegl_glShaderOp1EXT -#define glIsStateNV bluegl_glIsStateNV -#define glGetProgramEnvParameterIuivNV bluegl_glGetProgramEnvParameterIuivNV -#define glGetVideoCaptureivNV bluegl_glGetVideoCaptureivNV -#define glPathStringNV bluegl_glPathStringNV -#define glListParameterfSGIX bluegl_glListParameterfSGIX -#define glFeedbackBufferxOES bluegl_glFeedbackBufferxOES -#define glGetNextPerfQueryIdINTEL bluegl_glGetNextPerfQueryIdINTEL -#define glGetVariantArrayObjectfvATI bluegl_glGetVariantArrayObjectfvATI -#define glUniform3d bluegl_glUniform3d -#define glMultiTexParameterfvEXT bluegl_glMultiTexParameterfvEXT -#define glGetLocalConstantFloatvEXT bluegl_glGetLocalConstantFloatvEXT -#define glMultiTexImage3DEXT bluegl_glMultiTexImage3DEXT -#define glWindowPos3fMESA bluegl_glWindowPos3fMESA -#define glCullParameterdvEXT bluegl_glCullParameterdvEXT -#define glGetTrackMatrixivNV bluegl_glGetTrackMatrixivNV -#define glBlendFuncSeparateINGR bluegl_glBlendFuncSeparateINGR -#define glUniformMatrix2fvARB bluegl_glUniformMatrix2fvARB -#define glDrawArraysInstancedEXT bluegl_glDrawArraysInstancedEXT -#define glMultiTexCoord3iARB bluegl_glMultiTexCoord3iARB -#define glGetNamedFramebufferParameterivEXT bluegl_glGetNamedFramebufferParameterivEXT -#define glGenTextures bluegl_glGenTextures -#define glIsPointInStrokePathNV bluegl_glIsPointInStrokePathNV -#define glDrawTransformFeedbackNV bluegl_glDrawTransformFeedbackNV -#define glGetActiveUniformARB bluegl_glGetActiveUniformARB +#define glClearNamedFramebufferuiv bluegl_glClearNamedFramebufferuiv #define glClearNamedFramebufferfv bluegl_glClearNamedFramebufferfv -#define glBeginVideoCaptureNV bluegl_glBeginVideoCaptureNV -#define glCopyTexImage1D bluegl_glCopyTexImage1D -#define glTexStorage1D bluegl_glTexStorage1D -#define glProgramUniform3ui64ARB bluegl_glProgramUniform3ui64ARB -#define glTextureSubImage2D bluegl_glTextureSubImage2D -#define glMultiTexCoord4bOES bluegl_glMultiTexCoord4bOES -#define glMultiDrawArraysIndirectCountARB bluegl_glMultiDrawArraysIndirectCountARB -#define glProgramUniformMatrix3dvEXT bluegl_glProgramUniformMatrix3dvEXT -#define glVertexAttrib2s bluegl_glVertexAttrib2s -#define glGetDoublev bluegl_glGetDoublev -#define glVertexAttrib3svARB bluegl_glVertexAttrib3svARB -#define glProgramNamedParameter4dvNV bluegl_glProgramNamedParameter4dvNV +#define glClearNamedFramebufferfi bluegl_glClearNamedFramebufferfi +#define glBlitNamedFramebuffer bluegl_glBlitNamedFramebuffer +#define glCheckNamedFramebufferStatus bluegl_glCheckNamedFramebufferStatus +#define glGetNamedFramebufferParameteriv bluegl_glGetNamedFramebufferParameteriv +#define glGetNamedFramebufferAttachmentParameteriv bluegl_glGetNamedFramebufferAttachmentParameteriv +#define glCreateRenderbuffers bluegl_glCreateRenderbuffers +#define glNamedRenderbufferStorage bluegl_glNamedRenderbufferStorage +#define glNamedRenderbufferStorageMultisample bluegl_glNamedRenderbufferStorageMultisample +#define glGetNamedRenderbufferParameteriv bluegl_glGetNamedRenderbufferParameteriv +#define glCreateTextures bluegl_glCreateTextures +#define glTextureBuffer bluegl_glTextureBuffer #define glTextureBufferRange bluegl_glTextureBufferRange -#define glFramebufferTextureFaceEXT bluegl_glFramebufferTextureFaceEXT -#define glBindBufferRange bluegl_glBindBufferRange -#define glEnablei bluegl_glEnablei -#define glGetTextureParameterIuivEXT bluegl_glGetTextureParameterIuivEXT -#define glGetProgramInterfaceiv bluegl_glGetProgramInterfaceiv -#define glClientAttribDefaultEXT bluegl_glClientAttribDefaultEXT -#define glVertexAttribL3ui64NV bluegl_glVertexAttribL3ui64NV -#define glWindowPos2dARB bluegl_glWindowPos2dARB -#define glVertexAttribI2uiEXT bluegl_glVertexAttribI2uiEXT -#define glBindVertexBuffers bluegl_glBindVertexBuffers -#define glProgramUniformMatrix3x4fv bluegl_glProgramUniformMatrix3x4fv -#define glGetTexLevelParameterxvOES bluegl_glGetTexLevelParameterxvOES -#define glVertexAttribPointer bluegl_glVertexAttribPointer -#define glTextureImage1DEXT bluegl_glTextureImage1DEXT -#define glVertexAttribs4dvNV bluegl_glVertexAttribs4dvNV -#define glSecondaryColor3svEXT bluegl_glSecondaryColor3svEXT -#define glGetQueryivARB bluegl_glGetQueryivARB -#define glTexCoord4bOES bluegl_glTexCoord4bOES -#define glProgramUniform1fEXT bluegl_glProgramUniform1fEXT -#define glVertexP2ui bluegl_glVertexP2ui -#define glSetInvariantEXT bluegl_glSetInvariantEXT -#define glActiveShaderProgram bluegl_glActiveShaderProgram -#define glVertexAttribL1ui64NV bluegl_glVertexAttribL1ui64NV -#define glGetVariantBooleanvEXT bluegl_glGetVariantBooleanvEXT -#define glAreTexturesResidentEXT bluegl_glAreTexturesResidentEXT -#define glMatrixMultTranspose3x3fNV bluegl_glMatrixMultTranspose3x3fNV -#define glProgramUniform2f bluegl_glProgramUniform2f -#define glClearNamedBufferDataEXT bluegl_glClearNamedBufferDataEXT -#define glIsOcclusionQueryNV bluegl_glIsOcclusionQueryNV -#define glVertexAttribI4bv bluegl_glVertexAttribI4bv -#define glTexCoord2xvOES bluegl_glTexCoord2xvOES -#define glVertexAttrib4Nubv bluegl_glVertexAttrib4Nubv -#define glVertexAttrib3hNV bluegl_glVertexAttrib3hNV -#define glMultiTexCoord2xvOES bluegl_glMultiTexCoord2xvOES -#define glFramebufferTextureEXT bluegl_glFramebufferTextureEXT -#define glProgramUniformMatrix3fv bluegl_glProgramUniformMatrix3fv -#define glGetInternalformatSampleivNV bluegl_glGetInternalformatSampleivNV -#define glPathSubCommandsNV bluegl_glPathSubCommandsNV -#define glStencilStrokePathNV bluegl_glStencilStrokePathNV -#define glPathParameterfNV bluegl_glPathParameterfNV -#define glActiveProgramEXT bluegl_glActiveProgramEXT -#define glClampColorARB bluegl_glClampColorARB -#define glVertexAttribI2uivEXT bluegl_glVertexAttribI2uivEXT -#define glVertexAttribL1ui64vARB bluegl_glVertexAttribL1ui64vARB -#define glValidateProgram bluegl_glValidateProgram -#define glMultiTexCoord2xOES bluegl_glMultiTexCoord2xOES -#define glFogCoordf bluegl_glFogCoordf -#define glGetError bluegl_glGetError -#define glSpriteParameterfSGIX bluegl_glSpriteParameterfSGIX -#define glVertexAttrib3dvNV bluegl_glVertexAttrib3dvNV -#define glMultiTexCoord3bOES bluegl_glMultiTexCoord3bOES -#define glGetTexParameterIuivEXT bluegl_glGetTexParameterIuivEXT -#define glIndexMaterialEXT bluegl_glIndexMaterialEXT -#define glUniform1iARB bluegl_glUniform1iARB -#define glVertexAttrib4NivARB bluegl_glVertexAttrib4NivARB +#define glTextureStorage1D bluegl_glTextureStorage1D +#define glTextureStorage2D bluegl_glTextureStorage2D +#define glTextureStorage3D bluegl_glTextureStorage3D +#define glTextureStorage2DMultisample bluegl_glTextureStorage2DMultisample +#define glTextureStorage3DMultisample bluegl_glTextureStorage3DMultisample +#define glTextureSubImage1D bluegl_glTextureSubImage1D +#define glTextureSubImage2D bluegl_glTextureSubImage2D +#define glTextureSubImage3D bluegl_glTextureSubImage3D +#define glCompressedTextureSubImage1D bluegl_glCompressedTextureSubImage1D +#define glCompressedTextureSubImage2D bluegl_glCompressedTextureSubImage2D +#define glCompressedTextureSubImage3D bluegl_glCompressedTextureSubImage3D +#define glCopyTextureSubImage1D bluegl_glCopyTextureSubImage1D +#define glCopyTextureSubImage2D bluegl_glCopyTextureSubImage2D +#define glCopyTextureSubImage3D bluegl_glCopyTextureSubImage3D +#define glTextureParameterf bluegl_glTextureParameterf +#define glTextureParameterfv bluegl_glTextureParameterfv #define glTextureParameteri bluegl_glTextureParameteri -#define glSecondaryColor3d bluegl_glSecondaryColor3d -#define glWindowPos2sv bluegl_glWindowPos2sv -#define glDrawBuffersARB bluegl_glDrawBuffersARB -#define glGetMultiTexParameterIuivEXT bluegl_glGetMultiTexParameterIuivEXT -#define glGetConvolutionFilter bluegl_glGetConvolutionFilter +#define glTextureParameterIiv bluegl_glTextureParameterIiv +#define glTextureParameterIuiv bluegl_glTextureParameterIuiv +#define glTextureParameteriv bluegl_glTextureParameteriv +#define glGenerateTextureMipmap bluegl_glGenerateTextureMipmap +#define glBindTextureUnit bluegl_glBindTextureUnit +#define glGetTextureImage bluegl_glGetTextureImage +#define glGetCompressedTextureImage bluegl_glGetCompressedTextureImage +#define glGetTextureLevelParameterfv bluegl_glGetTextureLevelParameterfv +#define glGetTextureLevelParameteriv bluegl_glGetTextureLevelParameteriv +#define glGetTextureParameterfv bluegl_glGetTextureParameterfv +#define glGetTextureParameterIiv bluegl_glGetTextureParameterIiv +#define glGetTextureParameterIuiv bluegl_glGetTextureParameterIuiv +#define glGetTextureParameteriv bluegl_glGetTextureParameteriv +#define glCreateVertexArrays bluegl_glCreateVertexArrays #define glDisableVertexArrayAttrib bluegl_glDisableVertexArrayAttrib -#define glProgramUniform4i bluegl_glProgramUniform4i -#define glCheckNamedFramebufferStatusEXT bluegl_glCheckNamedFramebufferStatusEXT -#define glMultiTexCoord3xOES bluegl_glMultiTexCoord3xOES -#define glDrawElementsInstancedEXT bluegl_glDrawElementsInstancedEXT -#define glColor4fNormal3fVertex3fvSUN bluegl_glColor4fNormal3fVertex3fvSUN -#define glIsTransformFeedbackNV bluegl_glIsTransformFeedbackNV -#define glDrawTransformFeedbackStreamInstanced bluegl_glDrawTransformFeedbackStreamInstanced -#define glMapNamedBufferEXT bluegl_glMapNamedBufferEXT -#define glVertexArrayIndexOffsetEXT bluegl_glVertexArrayIndexOffsetEXT -#define glPolygonMode bluegl_glPolygonMode -#define glGetDetailTexFuncSGIS bluegl_glGetDetailTexFuncSGIS -#define glMultiTexCoord2iv bluegl_glMultiTexCoord2iv -#define glGetHistogramParameterfvEXT bluegl_glGetHistogramParameterfvEXT -#define glProgramUniform4fvEXT bluegl_glProgramUniform4fvEXT -#define glDetailTexFuncSGIS bluegl_glDetailTexFuncSGIS -#define glTexParameterIivEXT bluegl_glTexParameterIivEXT -#define glNamedFramebufferTextureLayerEXT bluegl_glNamedFramebufferTextureLayerEXT -#define glDisablei bluegl_glDisablei -#define glUniform4fv bluegl_glUniform4fv -#define glVertexAttrib1hNV bluegl_glVertexAttrib1hNV -#define glWeightsvARB bluegl_glWeightsvARB -#define glSampleMaskIndexedNV bluegl_glSampleMaskIndexedNV -#define glVertexAttrib4dvARB bluegl_glVertexAttrib4dvARB -#define glBeginFragmentShaderATI bluegl_glBeginFragmentShaderATI -#define glNamedProgramLocalParameterI4ivEXT bluegl_glNamedProgramLocalParameterI4ivEXT -#define glGetConvolutionParameteriv bluegl_glGetConvolutionParameteriv -#define glClipControl bluegl_glClipControl -#define glBinormal3fEXT bluegl_glBinormal3fEXT -#define glColor4ubVertex2fSUN bluegl_glColor4ubVertex2fSUN -#define glCompressedTexImage3D bluegl_glCompressedTexImage3D -#define glGetTextureSamplerHandleARB bluegl_glGetTextureSamplerHandleARB -#define glUniform3uiv bluegl_glUniform3uiv -#define glGetVertexAttribPointerv bluegl_glGetVertexAttribPointerv -#define glGenBuffers bluegl_glGenBuffers -#define glVertexAttrib3dvARB bluegl_glVertexAttrib3dvARB -#define glFlushVertexArrayRangeNV bluegl_glFlushVertexArrayRangeNV -#define glGetProgramNamedParameterdvNV bluegl_glGetProgramNamedParameterdvNV -#define glConvolutionParameterf bluegl_glConvolutionParameterf -#define glVertex2bOES bluegl_glVertex2bOES -#define glGetObjectPtrLabel bluegl_glGetObjectPtrLabel -#define glBeginTransformFeedbackNV bluegl_glBeginTransformFeedbackNV +#define glEnableVertexArrayAttrib bluegl_glEnableVertexArrayAttrib +#define glVertexArrayElementBuffer bluegl_glVertexArrayElementBuffer +#define glVertexArrayVertexBuffer bluegl_glVertexArrayVertexBuffer +#define glVertexArrayVertexBuffers bluegl_glVertexArrayVertexBuffers +#define glVertexArrayAttribBinding bluegl_glVertexArrayAttribBinding +#define glVertexArrayAttribFormat bluegl_glVertexArrayAttribFormat +#define glVertexArrayAttribIFormat bluegl_glVertexArrayAttribIFormat +#define glVertexArrayAttribLFormat bluegl_glVertexArrayAttribLFormat +#define glVertexArrayBindingDivisor bluegl_glVertexArrayBindingDivisor +#define glGetVertexArrayiv bluegl_glGetVertexArrayiv +#define glGetVertexArrayIndexediv bluegl_glGetVertexArrayIndexediv +#define glGetVertexArrayIndexed64iv bluegl_glGetVertexArrayIndexed64iv +#define glCreateSamplers bluegl_glCreateSamplers +#define glCreateProgramPipelines bluegl_glCreateProgramPipelines +#define glCreateQueries bluegl_glCreateQueries +#define glGetQueryBufferObjecti64v bluegl_glGetQueryBufferObjecti64v +#define glGetQueryBufferObjectiv bluegl_glGetQueryBufferObjectiv +#define glGetQueryBufferObjectui64v bluegl_glGetQueryBufferObjectui64v +#define glGetQueryBufferObjectuiv bluegl_glGetQueryBufferObjectuiv +#define glMemoryBarrierByRegion bluegl_glMemoryBarrierByRegion #define glGetTextureSubImage bluegl_glGetTextureSubImage -#define glGetFramebufferAttachmentParameterivEXT bluegl_glGetFramebufferAttachmentParameterivEXT -#define glGetInteger64v bluegl_glGetInteger64v -#define glGetUniformLocation bluegl_glGetUniformLocation -#define glMultiTexCoord2fv bluegl_glMultiTexCoord2fv -#define glProgramUniform2uiv bluegl_glProgramUniform2uiv -#define glGetTexParameterIuiv bluegl_glGetTexParameterIuiv -#define glVertexAttribI4ui bluegl_glVertexAttribI4ui -#define glTexGenxvOES bluegl_glTexGenxvOES -#define glVertex4bOES bluegl_glVertex4bOES -#define glCopyTexSubImage2DEXT bluegl_glCopyTexSubImage2DEXT -#define glDrawBuffersATI bluegl_glDrawBuffersATI -#define glPathGlyphsNV bluegl_glPathGlyphsNV -#define glMatrixIndexuivARB bluegl_glMatrixIndexuivARB -#define glNamedProgramLocalParameterI4uiEXT bluegl_glNamedProgramLocalParameterI4uiEXT -#define glWindowPos2iv bluegl_glWindowPos2iv -#define glLightModelxOES bluegl_glLightModelxOES -#define glBindFragmentShaderATI bluegl_glBindFragmentShaderATI -#define glInvalidateTexSubImage bluegl_glInvalidateTexSubImage -#define glVertexAttrib4sARB bluegl_glVertexAttrib4sARB -#define glGetProgramiv bluegl_glGetProgramiv -#define glGetVideoCaptureStreamivNV bluegl_glGetVideoCaptureStreamivNV -#define glTextureParameterfvEXT bluegl_glTextureParameterfvEXT -#define glPNTrianglesfATI bluegl_glPNTrianglesfATI -#define glCheckNamedFramebufferStatus bluegl_glCheckNamedFramebufferStatus -#define glUniform4uiEXT bluegl_glUniform4uiEXT -#define glVertexAttrib2sv bluegl_glVertexAttrib2sv -#define glClearBufferData bluegl_glClearBufferData -#define glShaderSourceARB bluegl_glShaderSourceARB -#define glObjectPurgeableAPPLE bluegl_glObjectPurgeableAPPLE -#define glProgramUniform2iEXT bluegl_glProgramUniform2iEXT -#define glGetStringi bluegl_glGetStringi -#define glTexFilterFuncSGIS bluegl_glTexFilterFuncSGIS -#define glVertexArrayVertexAttribLOffsetEXT bluegl_glVertexArrayVertexAttribLOffsetEXT -#define glProgramLocalParametersI4uivNV bluegl_glProgramLocalParametersI4uivNV -#define glGetHistogramEXT bluegl_glGetHistogramEXT +#define glGetCompressedTextureSubImage bluegl_glGetCompressedTextureSubImage +#define glGetGraphicsResetStatus bluegl_glGetGraphicsResetStatus +#define glGetnCompressedTexImage bluegl_glGetnCompressedTexImage +#define glGetnTexImage bluegl_glGetnTexImage +#define glGetnUniformdv bluegl_glGetnUniformdv +#define glGetnUniformfv bluegl_glGetnUniformfv +#define glGetnUniformiv bluegl_glGetnUniformiv +#define glGetnUniformuiv bluegl_glGetnUniformuiv +#define glReadnPixels bluegl_glReadnPixels +#define glTextureBarrier bluegl_glTextureBarrier +#define glGetTextureHandleARB bluegl_glGetTextureHandleARB +#define glGetTextureSamplerHandleARB bluegl_glGetTextureSamplerHandleARB +#define glMakeTextureHandleResidentARB bluegl_glMakeTextureHandleResidentARB +#define glMakeTextureHandleNonResidentARB bluegl_glMakeTextureHandleNonResidentARB +#define glGetImageHandleARB bluegl_glGetImageHandleARB +#define glMakeImageHandleResidentARB bluegl_glMakeImageHandleResidentARB +#define glMakeImageHandleNonResidentARB bluegl_glMakeImageHandleNonResidentARB +#define glUniformHandleui64ARB bluegl_glUniformHandleui64ARB +#define glUniformHandleui64vARB bluegl_glUniformHandleui64vARB +#define glProgramUniformHandleui64ARB bluegl_glProgramUniformHandleui64ARB +#define glProgramUniformHandleui64vARB bluegl_glProgramUniformHandleui64vARB +#define glIsTextureHandleResidentARB bluegl_glIsTextureHandleResidentARB +#define glIsImageHandleResidentARB bluegl_glIsImageHandleResidentARB +#define glVertexAttribL1ui64ARB bluegl_glVertexAttribL1ui64ARB +#define glVertexAttribL1ui64vARB bluegl_glVertexAttribL1ui64vARB +#define glGetVertexAttribLui64vARB bluegl_glGetVertexAttribLui64vARB +#define glCreateSyncFromCLeventARB bluegl_glCreateSyncFromCLeventARB +#define glDispatchComputeGroupSizeARB bluegl_glDispatchComputeGroupSizeARB +#define glDebugMessageControlARB bluegl_glDebugMessageControlARB +#define glDebugMessageInsertARB bluegl_glDebugMessageInsertARB +#define glDebugMessageCallbackARB bluegl_glDebugMessageCallbackARB +#define glGetDebugMessageLogARB bluegl_glGetDebugMessageLogARB +#define glBlendEquationiARB bluegl_glBlendEquationiARB +#define glBlendEquationSeparateiARB bluegl_glBlendEquationSeparateiARB +#define glBlendFunciARB bluegl_glBlendFunciARB +#define glBlendFuncSeparateiARB bluegl_glBlendFuncSeparateiARB +#define glMultiDrawArraysIndirectCountARB bluegl_glMultiDrawArraysIndirectCountARB +#define glMultiDrawElementsIndirectCountARB bluegl_glMultiDrawElementsIndirectCountARB +#define glGetGraphicsResetStatusARB bluegl_glGetGraphicsResetStatusARB +#define glGetnTexImageARB bluegl_glGetnTexImageARB +#define glReadnPixelsARB bluegl_glReadnPixelsARB +#define glGetnCompressedTexImageARB bluegl_glGetnCompressedTexImageARB +#define glGetnUniformfvARB bluegl_glGetnUniformfvARB +#define glGetnUniformivARB bluegl_glGetnUniformivARB +#define glGetnUniformuivARB bluegl_glGetnUniformuivARB +#define glGetnUniformdvARB bluegl_glGetnUniformdvARB +#define glMinSampleShadingARB bluegl_glMinSampleShadingARB +#define glNamedStringARB bluegl_glNamedStringARB +#define glDeleteNamedStringARB bluegl_glDeleteNamedStringARB +#define glCompileShaderIncludeARB bluegl_glCompileShaderIncludeARB +#define glIsNamedStringARB bluegl_glIsNamedStringARB +#define glGetNamedStringARB bluegl_glGetNamedStringARB +#define glGetNamedStringivARB bluegl_glGetNamedStringivARB +#define glBufferPageCommitmentARB bluegl_glBufferPageCommitmentARB +#define glNamedBufferPageCommitmentEXT bluegl_glNamedBufferPageCommitmentEXT #define glNamedBufferPageCommitmentARB bluegl_glNamedBufferPageCommitmentARB -#define glMakeBufferResidentNV bluegl_glMakeBufferResidentNV -#define glNamedFramebufferDrawBuffers bluegl_glNamedFramebufferDrawBuffers -#define glVertexPointerListIBM bluegl_glVertexPointerListIBM -#define glGetUniformui64vNV bluegl_glGetUniformui64vNV -#define glClearDepthfOES bluegl_glClearDepthfOES -#define glWindowPos2iMESA bluegl_glWindowPos2iMESA -#define glCopyTextureImage1DEXT bluegl_glCopyTextureImage1DEXT -#define glBeginOcclusionQueryNV bluegl_glBeginOcclusionQueryNV -#define glLoadTransposeMatrixf bluegl_glLoadTransposeMatrixf -#define glNamedRenderbufferStorageMultisampleEXT bluegl_glNamedRenderbufferStorageMultisampleEXT -#define glNormalStream3fATI bluegl_glNormalStream3fATI -#define glNormal3hNV bluegl_glNormal3hNV -#define glUseProgram bluegl_glUseProgram -#define glPushGroupMarkerEXT bluegl_glPushGroupMarkerEXT -#define glMultiTexSubImage2DEXT bluegl_glMultiTexSubImage2DEXT -#define glVertexArrayRangeNV bluegl_glVertexArrayRangeNV -#define glGetMultiTexLevelParameterivEXT bluegl_glGetMultiTexLevelParameterivEXT -#define glMultiDrawArraysEXT bluegl_glMultiDrawArraysEXT -#define glVertexAttribL4ui64NV bluegl_glVertexAttribL4ui64NV -#define glVertexAttrib4Nub bluegl_glVertexAttrib4Nub -#define glFogCoordhNV bluegl_glFogCoordhNV -#define glVertexAttribI3ui bluegl_glVertexAttribI3ui -#define glTexImage3DMultisampleCoverageNV bluegl_glTexImage3DMultisampleCoverageNV -#define glGetUniformBufferSizeEXT bluegl_glGetUniformBufferSizeEXT -#define glCompileCommandListNV bluegl_glCompileCommandListNV -#define glVertexArrayVertexAttribBindingEXT bluegl_glVertexArrayVertexAttribBindingEXT -#define glBlendEquation bluegl_glBlendEquation -#define glBinormal3dvEXT bluegl_glBinormal3dvEXT -#define glVertexFormatNV bluegl_glVertexFormatNV -#define glProgramUniform4fv bluegl_glProgramUniform4fv -#define glTextureStorage2DMultisample bluegl_glTextureStorage2DMultisample -#define glProgramUniform3uiEXT bluegl_glProgramUniform3uiEXT -#define glFramebufferDrawBufferEXT bluegl_glFramebufferDrawBufferEXT -#define glCreateTextures bluegl_glCreateTextures -#define glMatrixPopEXT bluegl_glMatrixPopEXT -#define glProgramUniformui64vNV bluegl_glProgramUniformui64vNV -#define glFramebufferTexture2D bluegl_glFramebufferTexture2D -#define glGetAttribLocation bluegl_glGetAttribLocation -#define glUniform2fARB bluegl_glUniform2fARB -#define glDisableVertexArrayAttribEXT bluegl_glDisableVertexArrayAttribEXT -#define glTexStorage2D bluegl_glTexStorage2D -#define glVertexAttribI1iEXT bluegl_glVertexAttribI1iEXT -#define glUniform4ui bluegl_glUniform4ui -#define glMultiTexCoordP1uiv bluegl_glMultiTexCoordP1uiv -#define glNamedProgramLocalParametersI4ivEXT bluegl_glNamedProgramLocalParametersI4ivEXT -#define glImageTransformParameteriHP bluegl_glImageTransformParameteriHP -#define glIsBuffer bluegl_glIsBuffer -#define glFogCoorddv bluegl_glFogCoorddv +#define glTexPageCommitmentARB bluegl_glTexPageCommitmentARB #define glClientActiveTexture bluegl_glClientActiveTexture -#define glUniformHandleui64vNV bluegl_glUniformHandleui64vNV -#define glWindowPos3fARB bluegl_glWindowPos3fARB -#define glGetVertexAttribfvARB bluegl_glGetVertexAttribfvARB -#define glSamplerParameterfv bluegl_glSamplerParameterfv -#define glVertexAttrib4NsvARB bluegl_glVertexAttrib4NsvARB -#define glProgramUniform2ivEXT bluegl_glProgramUniform2ivEXT -#define glNamedProgramStringEXT bluegl_glNamedProgramStringEXT -#define glPointSize bluegl_glPointSize -#define glTexCoord4hNV bluegl_glTexCoord4hNV -#define glGetIntegerIndexedvEXT bluegl_glGetIntegerIndexedvEXT -#define glPrimitiveBoundingBoxARB bluegl_glPrimitiveBoundingBoxARB -#define glDebugMessageInsert bluegl_glDebugMessageInsert -#define glMultiTexCoord3bvOES bluegl_glMultiTexCoord3bvOES -#define glVertexAttribL1i64vNV bluegl_glVertexAttribL1i64vNV -#define glTextureBuffer bluegl_glTextureBuffer -#define glGetTextureParameterIiv bluegl_glGetTextureParameterIiv -#define glFramebufferTexture bluegl_glFramebufferTexture -#define glGetProgramivARB bluegl_glGetProgramivARB -#define glVertexAttribPointerARB bluegl_glVertexAttribPointerARB -#define glIsCommandListNV bluegl_glIsCommandListNV -#define glUniform1uivEXT bluegl_glUniform1uivEXT -#define glProgramUniform2i bluegl_glProgramUniform2i -#define glVertexAttribDivisorARB bluegl_glVertexAttribDivisorARB -#define glGetVertexAttribPointervARB bluegl_glGetVertexAttribPointervARB -#define glTextureImage2DMultisampleNV bluegl_glTextureImage2DMultisampleNV -#define glGetVariantPointervEXT bluegl_glGetVariantPointervEXT -#define glCheckFramebufferStatus bluegl_glCheckFramebufferStatus -#define glMap1xOES bluegl_glMap1xOES -#define glBindSampler bluegl_glBindSampler -#define glPathGlyphIndexRangeNV bluegl_glPathGlyphIndexRangeNV -#define glProgramEnvParameters4fvEXT bluegl_glProgramEnvParameters4fvEXT -#define glVertexAttrib3fNV bluegl_glVertexAttrib3fNV -#define glBindBuffersBase bluegl_glBindBuffersBase -#define glGetNamedProgramLocalParameterIivEXT bluegl_glGetNamedProgramLocalParameterIivEXT -#define glProgramUniform4d bluegl_glProgramUniform4d +#define glMultiTexCoord1d bluegl_glMultiTexCoord1d +#define glMultiTexCoord1dv bluegl_glMultiTexCoord1dv +#define glMultiTexCoord1f bluegl_glMultiTexCoord1f +#define glMultiTexCoord1fv bluegl_glMultiTexCoord1fv +#define glMultiTexCoord1i bluegl_glMultiTexCoord1i +#define glMultiTexCoord1iv bluegl_glMultiTexCoord1iv +#define glMultiTexCoord1s bluegl_glMultiTexCoord1s +#define glMultiTexCoord1sv bluegl_glMultiTexCoord1sv +#define glMultiTexCoord2d bluegl_glMultiTexCoord2d +#define glMultiTexCoord2dv bluegl_glMultiTexCoord2dv +#define glMultiTexCoord2f bluegl_glMultiTexCoord2f +#define glMultiTexCoord2fv bluegl_glMultiTexCoord2fv +#define glMultiTexCoord2i bluegl_glMultiTexCoord2i +#define glMultiTexCoord2iv bluegl_glMultiTexCoord2iv +#define glMultiTexCoord2s bluegl_glMultiTexCoord2s +#define glMultiTexCoord2sv bluegl_glMultiTexCoord2sv +#define glMultiTexCoord3d bluegl_glMultiTexCoord3d +#define glMultiTexCoord3dv bluegl_glMultiTexCoord3dv #define glMultiTexCoord3f bluegl_glMultiTexCoord3f -#define glDeleteProgram bluegl_glDeleteProgram -#define glReplacementCodeuiVertex3fvSUN bluegl_glReplacementCodeuiVertex3fvSUN -#define glMapNamedBufferRange bluegl_glMapNamedBufferRange -#define glFramebufferSampleLocationsfvARB bluegl_glFramebufferSampleLocationsfvARB -#define glMultiTexCoord1dvARB bluegl_glMultiTexCoord1dvARB -#define glClearBufferuiv bluegl_glClearBufferuiv -#define glDrawRangeElementsEXT bluegl_glDrawRangeElementsEXT -#define glVertexAttrib1hvNV bluegl_glVertexAttrib1hvNV +#define glMultiTexCoord3fv bluegl_glMultiTexCoord3fv +#define glMultiTexCoord3i bluegl_glMultiTexCoord3i +#define glMultiTexCoord3iv bluegl_glMultiTexCoord3iv +#define glMultiTexCoord3s bluegl_glMultiTexCoord3s +#define glMultiTexCoord3sv bluegl_glMultiTexCoord3sv +#define glMultiTexCoord4d bluegl_glMultiTexCoord4d +#define glMultiTexCoord4dv bluegl_glMultiTexCoord4dv +#define glMultiTexCoord4f bluegl_glMultiTexCoord4f +#define glMultiTexCoord4fv bluegl_glMultiTexCoord4fv +#define glMultiTexCoord4i bluegl_glMultiTexCoord4i +#define glMultiTexCoord4iv bluegl_glMultiTexCoord4iv +#define glMultiTexCoord4s bluegl_glMultiTexCoord4s +#define glMultiTexCoord4sv bluegl_glMultiTexCoord4sv +#define glLoadTransposeMatrixf bluegl_glLoadTransposeMatrixf +#define glLoadTransposeMatrixd bluegl_glLoadTransposeMatrixd +#define glMultTransposeMatrixf bluegl_glMultTransposeMatrixf +#define glMultTransposeMatrixd bluegl_glMultTransposeMatrixd +#define glFogCoordf bluegl_glFogCoordf +#define glFogCoordfv bluegl_glFogCoordfv +#define glFogCoordd bluegl_glFogCoordd +#define glFogCoorddv bluegl_glFogCoorddv +#define glFogCoordPointer bluegl_glFogCoordPointer +#define glSecondaryColor3b bluegl_glSecondaryColor3b #define glSecondaryColor3bv bluegl_glSecondaryColor3bv -#define glVDPAUMapSurfacesNV bluegl_glVDPAUMapSurfacesNV -#define glStencilMask bluegl_glStencilMask -#define glGetProgramResourceLocationIndex bluegl_glGetProgramResourceLocationIndex -#define glGetIntegerui64i_vNV bluegl_glGetIntegerui64i_vNV -#define glGetTextureLevelParameterfvEXT bluegl_glGetTextureLevelParameterfvEXT -#define glWindowPos3sv bluegl_glWindowPos3sv -#define glBlendEquationSeparatei bluegl_glBlendEquationSeparatei -#define glGetInfoLogARB bluegl_glGetInfoLogARB -#define glProgramNamedParameter4fNV bluegl_glProgramNamedParameter4fNV -#define glProgramParameter4fNV bluegl_glProgramParameter4fNV -#define glDeleteTextures bluegl_glDeleteTextures -#define glFramebufferDrawBuffersEXT bluegl_glFramebufferDrawBuffersEXT -#define glGetObjectLabelEXT bluegl_glGetObjectLabelEXT -#define glProgramUniform3ivEXT bluegl_glProgramUniform3ivEXT -#define glTextureParameterIiv bluegl_glTextureParameterIiv -#define glGetnUniformuiv bluegl_glGetnUniformuiv -#define glMapObjectBufferATI bluegl_glMapObjectBufferATI -#define glTangent3dvEXT bluegl_glTangent3dvEXT -#define glProgramParameter4dNV bluegl_glProgramParameter4dNV -#define glGenVertexArraysAPPLE bluegl_glGenVertexArraysAPPLE -#define glVertexAttrib4bvARB bluegl_glVertexAttrib4bvARB -#define glVertexStream1dATI bluegl_glVertexStream1dATI -#define glMultiTexCoord2svARB bluegl_glMultiTexCoord2svARB -#define glClearNamedBufferSubDataEXT bluegl_glClearNamedBufferSubDataEXT -#define glCompressedTextureSubImage3D bluegl_glCompressedTextureSubImage3D -#define glVertexAttribI4iEXT bluegl_glVertexAttribI4iEXT -#define glGetnPixelMapfvARB bluegl_glGetnPixelMapfvARB -#define glVertexStream4iATI bluegl_glVertexStream4iATI -#define glMatrixMultTransposedEXT bluegl_glMatrixMultTransposedEXT -#define glDisableVariantClientStateEXT bluegl_glDisableVariantClientStateEXT -#define glPrimitiveRestartNV bluegl_glPrimitiveRestartNV -#define glVertexAttribP4uiv bluegl_glVertexAttribP4uiv -#define glProgramUniformMatrix2fv bluegl_glProgramUniformMatrix2fv -#define glPolygonOffsetEXT bluegl_glPolygonOffsetEXT -#define glUseProgramObjectARB bluegl_glUseProgramObjectARB -#define glMatrixLoadfEXT bluegl_glMatrixLoadfEXT -#define glTextureSubImage1D bluegl_glTextureSubImage1D -#define glHistogramEXT bluegl_glHistogramEXT -#define glProgramUniform1ivEXT bluegl_glProgramUniform1ivEXT -#define glGetBufferParameterivARB bluegl_glGetBufferParameterivARB -#define glStringMarkerGREMEDY bluegl_glStringMarkerGREMEDY +#define glSecondaryColor3d bluegl_glSecondaryColor3d +#define glSecondaryColor3dv bluegl_glSecondaryColor3dv +#define glSecondaryColor3f bluegl_glSecondaryColor3f +#define glSecondaryColor3fv bluegl_glSecondaryColor3fv +#define glSecondaryColor3i bluegl_glSecondaryColor3i +#define glSecondaryColor3iv bluegl_glSecondaryColor3iv +#define glSecondaryColor3s bluegl_glSecondaryColor3s +#define glSecondaryColor3sv bluegl_glSecondaryColor3sv +#define glSecondaryColor3ub bluegl_glSecondaryColor3ub +#define glSecondaryColor3ubv bluegl_glSecondaryColor3ubv +#define glSecondaryColor3ui bluegl_glSecondaryColor3ui +#define glSecondaryColor3uiv bluegl_glSecondaryColor3uiv +#define glSecondaryColor3us bluegl_glSecondaryColor3us +#define glSecondaryColor3usv bluegl_glSecondaryColor3usv +#define glSecondaryColorPointer bluegl_glSecondaryColorPointer +#define glWindowPos2d bluegl_glWindowPos2d +#define glWindowPos2dv bluegl_glWindowPos2dv +#define glWindowPos2f bluegl_glWindowPos2f +#define glWindowPos2fv bluegl_glWindowPos2fv +#define glWindowPos2i bluegl_glWindowPos2i +#define glWindowPos2iv bluegl_glWindowPos2iv +#define glWindowPos2s bluegl_glWindowPos2s +#define glWindowPos2sv bluegl_glWindowPos2sv +#define glWindowPos3d bluegl_glWindowPos3d +#define glWindowPos3dv bluegl_glWindowPos3dv +#define glWindowPos3f bluegl_glWindowPos3f +#define glWindowPos3fv bluegl_glWindowPos3fv +#define glWindowPos3i bluegl_glWindowPos3i +#define glWindowPos3iv bluegl_glWindowPos3iv +#define glWindowPos3s bluegl_glWindowPos3s +#define glWindowPos3sv bluegl_glWindowPos3sv +#define glVertexP2ui bluegl_glVertexP2ui +#define glVertexP2uiv bluegl_glVertexP2uiv +#define glVertexP3ui bluegl_glVertexP3ui +#define glVertexP3uiv bluegl_glVertexP3uiv +#define glVertexP4ui bluegl_glVertexP4ui +#define glVertexP4uiv bluegl_glVertexP4uiv +#define glTexCoordP1ui bluegl_glTexCoordP1ui +#define glTexCoordP1uiv bluegl_glTexCoordP1uiv +#define glTexCoordP2ui bluegl_glTexCoordP2ui +#define glTexCoordP2uiv bluegl_glTexCoordP2uiv +#define glTexCoordP3ui bluegl_glTexCoordP3ui +#define glTexCoordP3uiv bluegl_glTexCoordP3uiv +#define glTexCoordP4ui bluegl_glTexCoordP4ui +#define glTexCoordP4uiv bluegl_glTexCoordP4uiv +#define glMultiTexCoordP1ui bluegl_glMultiTexCoordP1ui +#define glMultiTexCoordP1uiv bluegl_glMultiTexCoordP1uiv +#define glMultiTexCoordP2ui bluegl_glMultiTexCoordP2ui +#define glMultiTexCoordP2uiv bluegl_glMultiTexCoordP2uiv +#define glMultiTexCoordP3ui bluegl_glMultiTexCoordP3ui +#define glMultiTexCoordP3uiv bluegl_glMultiTexCoordP3uiv +#define glMultiTexCoordP4ui bluegl_glMultiTexCoordP4ui +#define glMultiTexCoordP4uiv bluegl_glMultiTexCoordP4uiv +#define glNormalP3ui bluegl_glNormalP3ui +#define glNormalP3uiv bluegl_glNormalP3uiv +#define glColorP3ui bluegl_glColorP3ui +#define glColorP3uiv bluegl_glColorP3uiv +#define glColorP4ui bluegl_glColorP4ui +#define glColorP4uiv bluegl_glColorP4uiv +#define glSecondaryColorP3ui bluegl_glSecondaryColorP3ui +#define glSecondaryColorP3uiv bluegl_glSecondaryColorP3uiv +#define glGetnMapdv bluegl_glGetnMapdv #define glGetnMapfv bluegl_glGetnMapfv -#define glMultiTexCoord3dvARB bluegl_glMultiTexCoord3dvARB -#define glFinishTextureSUNX bluegl_glFinishTextureSUNX -#define glWindowPos3dARB bluegl_glWindowPos3dARB -#define glNamedBufferStorageEXT bluegl_glNamedBufferStorageEXT -#define glIndexPointerListIBM bluegl_glIndexPointerListIBM -#define glColor3fVertex3fSUN bluegl_glColor3fVertex3fSUN -#define glDepthRangefOES bluegl_glDepthRangefOES -#define glVertexBlendEnvfATI bluegl_glVertexBlendEnvfATI -#define glMultiTexCoord1hvNV bluegl_glMultiTexCoord1hvNV -#define glGetPixelTexGenParameterfvSGIS bluegl_glGetPixelTexGenParameterfvSGIS -#define glDisableClientStateIndexedEXT bluegl_glDisableClientStateIndexedEXT -#define glProgramUniform1ui64NV bluegl_glProgramUniform1ui64NV -#define glMultiTexCoord1dv bluegl_glMultiTexCoord1dv -#define glMultiTexCoord1ivARB bluegl_glMultiTexCoord1ivARB -#define glMapVertexAttrib1dAPPLE bluegl_glMapVertexAttrib1dAPPLE -#define glGetPerfQueryIdByNameINTEL bluegl_glGetPerfQueryIdByNameINTEL -#define glUniform2ui64vNV bluegl_glUniform2ui64vNV -#define glGetSharpenTexFuncSGIS bluegl_glGetSharpenTexFuncSGIS -#define glBindImageTexture bluegl_glBindImageTexture +#define glGetnMapiv bluegl_glGetnMapiv +#define glGetnPixelMapfv bluegl_glGetnPixelMapfv +#define glGetnPixelMapuiv bluegl_glGetnPixelMapuiv +#define glGetnPixelMapusv bluegl_glGetnPixelMapusv +#define glGetnPolygonStipple bluegl_glGetnPolygonStipple +#define glGetnColorTable bluegl_glGetnColorTable +#define glGetnConvolutionFilter bluegl_glGetnConvolutionFilter +#define glGetnSeparableFilter bluegl_glGetnSeparableFilter +#define glGetnHistogram bluegl_glGetnHistogram +#define glGetnMinmax bluegl_glGetnMinmax +#define glPrimitiveBoundingBoxARB bluegl_glPrimitiveBoundingBoxARB +#define glClampColorARB bluegl_glClampColorARB +#define glDrawBuffersARB bluegl_glDrawBuffersARB +#define glDrawArraysInstancedARB bluegl_glDrawArraysInstancedARB +#define glDrawElementsInstancedARB bluegl_glDrawElementsInstancedARB +#define glProgramStringARB bluegl_glProgramStringARB +#define glBindProgramARB bluegl_glBindProgramARB +#define glDeleteProgramsARB bluegl_glDeleteProgramsARB +#define glGenProgramsARB bluegl_glGenProgramsARB +#define glProgramEnvParameter4dARB bluegl_glProgramEnvParameter4dARB #define glProgramEnvParameter4dvARB bluegl_glProgramEnvParameter4dvARB -#define glDeleteFramebuffers bluegl_glDeleteFramebuffers -#define glVertexArrayVertexOffsetEXT bluegl_glVertexArrayVertexOffsetEXT -#define glProgramLocalParameters4fvEXT bluegl_glProgramLocalParameters4fvEXT -#define glFogCoordFormatNV bluegl_glFogCoordFormatNV -#define glGenQueries bluegl_glGenQueries -#define glVertexAttribL4dEXT bluegl_glVertexAttribL4dEXT -#define glMultiTexCoord4fvARB bluegl_glMultiTexCoord4fvARB -#define glPixelZoomxOES bluegl_glPixelZoomxOES -#define glCopyTexSubImage3D bluegl_glCopyTexSubImage3D +#define glProgramEnvParameter4fARB bluegl_glProgramEnvParameter4fARB +#define glProgramEnvParameter4fvARB bluegl_glProgramEnvParameter4fvARB +#define glProgramLocalParameter4dARB bluegl_glProgramLocalParameter4dARB +#define glProgramLocalParameter4dvARB bluegl_glProgramLocalParameter4dvARB +#define glProgramLocalParameter4fARB bluegl_glProgramLocalParameter4fARB +#define glProgramLocalParameter4fvARB bluegl_glProgramLocalParameter4fvARB +#define glGetProgramEnvParameterdvARB bluegl_glGetProgramEnvParameterdvARB +#define glGetProgramEnvParameterfvARB bluegl_glGetProgramEnvParameterfvARB +#define glGetProgramLocalParameterdvARB bluegl_glGetProgramLocalParameterdvARB +#define glGetProgramLocalParameterfvARB bluegl_glGetProgramLocalParameterfvARB +#define glGetProgramivARB bluegl_glGetProgramivARB +#define glGetProgramStringARB bluegl_glGetProgramStringARB +#define glIsProgramARB bluegl_glIsProgramARB +#define glProgramParameteriARB bluegl_glProgramParameteriARB +#define glFramebufferTextureARB bluegl_glFramebufferTextureARB +#define glFramebufferTextureLayerARB bluegl_glFramebufferTextureLayerARB +#define glFramebufferTextureFaceARB bluegl_glFramebufferTextureFaceARB +#define glUniform1i64ARB bluegl_glUniform1i64ARB +#define glUniform2i64ARB bluegl_glUniform2i64ARB +#define glUniform3i64ARB bluegl_glUniform3i64ARB +#define glUniform4i64ARB bluegl_glUniform4i64ARB +#define glUniform1i64vARB bluegl_glUniform1i64vARB +#define glUniform2i64vARB bluegl_glUniform2i64vARB +#define glUniform3i64vARB bluegl_glUniform3i64vARB +#define glUniform4i64vARB bluegl_glUniform4i64vARB +#define glUniform1ui64ARB bluegl_glUniform1ui64ARB +#define glUniform2ui64ARB bluegl_glUniform2ui64ARB +#define glUniform3ui64ARB bluegl_glUniform3ui64ARB +#define glUniform4ui64ARB bluegl_glUniform4ui64ARB #define glUniform1ui64vARB bluegl_glUniform1ui64vARB -#define glGetMapControlPointsNV bluegl_glGetMapControlPointsNV -#define glLightEnviSGIX bluegl_glLightEnviSGIX -#define glVertexAttrib4Nbv bluegl_glVertexAttrib4Nbv -#define glDrawBuffer bluegl_glDrawBuffer -#define glDrawTransformFeedbackStream bluegl_glDrawTransformFeedbackStream -#define glDisableClientStateiEXT bluegl_glDisableClientStateiEXT -#define glFramebufferTexture3D bluegl_glFramebufferTexture3D -#define glTextureColorMaskSGIS bluegl_glTextureColorMaskSGIS -#define glCullFace bluegl_glCullFace -#define glGetNamedBufferSubData bluegl_glGetNamedBufferSubData -#define glDispatchCompute bluegl_glDispatchCompute -#define glInvalidateFramebuffer bluegl_glInvalidateFramebuffer -#define glDebugMessageControl bluegl_glDebugMessageControl -#define glProgramUniformMatrix3dv bluegl_glProgramUniformMatrix3dv -#define glSecondaryColor3ui bluegl_glSecondaryColor3ui -#define glShaderStorageBlockBinding bluegl_glShaderStorageBlockBinding -#define glUniformMatrix3fvARB bluegl_glUniformMatrix3fvARB -#define glGetUniformOffsetEXT bluegl_glGetUniformOffsetEXT -#define glBinormal3fvEXT bluegl_glBinormal3fvEXT -#define glMultiTexCoordPointerEXT bluegl_glMultiTexCoordPointerEXT -#define glVertexAttrib4sv bluegl_glVertexAttrib4sv +#define glUniform2ui64vARB bluegl_glUniform2ui64vARB +#define glUniform3ui64vARB bluegl_glUniform3ui64vARB +#define glUniform4ui64vARB bluegl_glUniform4ui64vARB +#define glGetUniformi64vARB bluegl_glGetUniformi64vARB +#define glGetUniformui64vARB bluegl_glGetUniformui64vARB +#define glGetnUniformi64vARB bluegl_glGetnUniformi64vARB +#define glGetnUniformui64vARB bluegl_glGetnUniformui64vARB +#define glProgramUniform1i64ARB bluegl_glProgramUniform1i64ARB +#define glProgramUniform2i64ARB bluegl_glProgramUniform2i64ARB +#define glProgramUniform3i64ARB bluegl_glProgramUniform3i64ARB +#define glProgramUniform4i64ARB bluegl_glProgramUniform4i64ARB +#define glProgramUniform1i64vARB bluegl_glProgramUniform1i64vARB +#define glProgramUniform2i64vARB bluegl_glProgramUniform2i64vARB +#define glProgramUniform3i64vARB bluegl_glProgramUniform3i64vARB +#define glProgramUniform4i64vARB bluegl_glProgramUniform4i64vARB +#define glProgramUniform1ui64ARB bluegl_glProgramUniform1ui64ARB +#define glProgramUniform2ui64ARB bluegl_glProgramUniform2ui64ARB +#define glProgramUniform3ui64ARB bluegl_glProgramUniform3ui64ARB +#define glProgramUniform4ui64ARB bluegl_glProgramUniform4ui64ARB +#define glProgramUniform1ui64vARB bluegl_glProgramUniform1ui64vARB +#define glProgramUniform2ui64vARB bluegl_glProgramUniform2ui64vARB +#define glProgramUniform3ui64vARB bluegl_glProgramUniform3ui64vARB +#define glProgramUniform4ui64vARB bluegl_glProgramUniform4ui64vARB +#define glColorTable bluegl_glColorTable +#define glColorTableParameterfv bluegl_glColorTableParameterfv +#define glColorTableParameteriv bluegl_glColorTableParameteriv +#define glCopyColorTable bluegl_glCopyColorTable +#define glGetColorTable bluegl_glGetColorTable +#define glGetColorTableParameterfv bluegl_glGetColorTableParameterfv +#define glGetColorTableParameteriv bluegl_glGetColorTableParameteriv +#define glColorSubTable bluegl_glColorSubTable +#define glCopyColorSubTable bluegl_glCopyColorSubTable +#define glConvolutionFilter1D bluegl_glConvolutionFilter1D +#define glConvolutionFilter2D bluegl_glConvolutionFilter2D +#define glConvolutionParameterf bluegl_glConvolutionParameterf +#define glConvolutionParameterfv bluegl_glConvolutionParameterfv +#define glConvolutionParameteri bluegl_glConvolutionParameteri +#define glConvolutionParameteriv bluegl_glConvolutionParameteriv +#define glCopyConvolutionFilter1D bluegl_glCopyConvolutionFilter1D +#define glCopyConvolutionFilter2D bluegl_glCopyConvolutionFilter2D +#define glGetConvolutionFilter bluegl_glGetConvolutionFilter +#define glGetConvolutionParameterfv bluegl_glGetConvolutionParameterfv +#define glGetConvolutionParameteriv bluegl_glGetConvolutionParameteriv +#define glGetSeparableFilter bluegl_glGetSeparableFilter +#define glSeparableFilter2D bluegl_glSeparableFilter2D +#define glGetHistogram bluegl_glGetHistogram +#define glGetHistogramParameterfv bluegl_glGetHistogramParameterfv +#define glGetHistogramParameteriv bluegl_glGetHistogramParameteriv +#define glGetMinmax bluegl_glGetMinmax +#define glGetMinmaxParameterfv bluegl_glGetMinmaxParameterfv +#define glGetMinmaxParameteriv bluegl_glGetMinmaxParameteriv +#define glHistogram bluegl_glHistogram +#define glMinmax bluegl_glMinmax +#define glResetHistogram bluegl_glResetHistogram +#define glResetMinmax bluegl_glResetMinmax +#define glVertexAttribDivisorARB bluegl_glVertexAttribDivisorARB +#define glCurrentPaletteMatrixARB bluegl_glCurrentPaletteMatrixARB #define glMatrixIndexubvARB bluegl_glMatrixIndexubvARB -#define glProgramUniform4ivEXT bluegl_glProgramUniform4ivEXT -#define glWindowPos4dMESA bluegl_glWindowPos4dMESA -#define glMultiDrawElementsIndirectCountARB bluegl_glMultiDrawElementsIndirectCountARB -#define glUniformMatrix4fvARB bluegl_glUniformMatrix4fvARB -#define glBindImageTextureEXT bluegl_glBindImageTextureEXT -#define glResolveDepthValuesNV bluegl_glResolveDepthValuesNV -#define glColor3fVertex3fvSUN bluegl_glColor3fVertex3fvSUN -#define glCompressedTexImage1D bluegl_glCompressedTexImage1D -#define glGetnUniformdvARB bluegl_glGetnUniformdvARB -#define glUniform1ui64vNV bluegl_glUniform1ui64vNV -#define glProgramEnvParameterI4uiNV bluegl_glProgramEnvParameterI4uiNV -#define glVertexAttrib4ubNV bluegl_glVertexAttrib4ubNV -#define glGenAsyncMarkersSGIX bluegl_glGenAsyncMarkersSGIX -#define glVertexBindingDivisor bluegl_glVertexBindingDivisor -#define glCreateShaderProgramv bluegl_glCreateShaderProgramv -#define glBindBufferARB bluegl_glBindBufferARB -#define glColor4ubVertex2fvSUN bluegl_glColor4ubVertex2fvSUN -#define glResetHistogram bluegl_glResetHistogram -#define glGetProgramResourceLocation bluegl_glGetProgramResourceLocation -#define glBlendFuncSeparateiARB bluegl_glBlendFuncSeparateiARB -#define glBinormalPointerEXT bluegl_glBinormalPointerEXT -#define glVertexAttrib2svNV bluegl_glVertexAttrib2svNV -#define glProgramUniform2i64vNV bluegl_glProgramUniform2i64vNV -#define glTextureNormalEXT bluegl_glTextureNormalEXT -#define glFlushMappedBufferRangeAPPLE bluegl_glFlushMappedBufferRangeAPPLE -#define glSecondaryColor3dv bluegl_glSecondaryColor3dv -#define glColorP3uiv bluegl_glColorP3uiv -#define glUniformMatrix4x2dv bluegl_glUniformMatrix4x2dv -#define glTexCoordP3ui bluegl_glTexCoordP3ui -#define glNamedBufferSubDataEXT bluegl_glNamedBufferSubDataEXT -#define glProvokingVertexEXT bluegl_glProvokingVertexEXT -#define glWeightbvARB bluegl_glWeightbvARB -#define glInvalidateNamedFramebufferData bluegl_glInvalidateNamedFramebufferData -#define glGetArrayObjectfvATI bluegl_glGetArrayObjectfvATI -#define glIsSampler bluegl_glIsSampler -#define glNormalStream3dvATI bluegl_glNormalStream3dvATI -#define glVertexAttribL4i64vNV bluegl_glVertexAttribL4i64vNV +#define glMatrixIndexusvARB bluegl_glMatrixIndexusvARB +#define glMatrixIndexuivARB bluegl_glMatrixIndexuivARB +#define glMatrixIndexPointerARB bluegl_glMatrixIndexPointerARB +#define glSampleCoverageARB bluegl_glSampleCoverageARB +#define glActiveTextureARB bluegl_glActiveTextureARB +#define glClientActiveTextureARB bluegl_glClientActiveTextureARB +#define glMultiTexCoord1dARB bluegl_glMultiTexCoord1dARB +#define glMultiTexCoord1dvARB bluegl_glMultiTexCoord1dvARB +#define glMultiTexCoord1fARB bluegl_glMultiTexCoord1fARB +#define glMultiTexCoord1fvARB bluegl_glMultiTexCoord1fvARB +#define glMultiTexCoord1iARB bluegl_glMultiTexCoord1iARB +#define glMultiTexCoord1ivARB bluegl_glMultiTexCoord1ivARB +#define glMultiTexCoord1sARB bluegl_glMultiTexCoord1sARB +#define glMultiTexCoord1svARB bluegl_glMultiTexCoord1svARB +#define glMultiTexCoord2dARB bluegl_glMultiTexCoord2dARB +#define glMultiTexCoord2dvARB bluegl_glMultiTexCoord2dvARB +#define glMultiTexCoord2fARB bluegl_glMultiTexCoord2fARB +#define glMultiTexCoord2fvARB bluegl_glMultiTexCoord2fvARB +#define glMultiTexCoord2iARB bluegl_glMultiTexCoord2iARB +#define glMultiTexCoord2ivARB bluegl_glMultiTexCoord2ivARB +#define glMultiTexCoord2sARB bluegl_glMultiTexCoord2sARB +#define glMultiTexCoord2svARB bluegl_glMultiTexCoord2svARB +#define glMultiTexCoord3dARB bluegl_glMultiTexCoord3dARB +#define glMultiTexCoord3dvARB bluegl_glMultiTexCoord3dvARB +#define glMultiTexCoord3fARB bluegl_glMultiTexCoord3fARB +#define glMultiTexCoord3fvARB bluegl_glMultiTexCoord3fvARB +#define glMultiTexCoord3iARB bluegl_glMultiTexCoord3iARB +#define glMultiTexCoord3ivARB bluegl_glMultiTexCoord3ivARB +#define glMultiTexCoord3sARB bluegl_glMultiTexCoord3sARB +#define glMultiTexCoord3svARB bluegl_glMultiTexCoord3svARB +#define glMultiTexCoord4dARB bluegl_glMultiTexCoord4dARB +#define glMultiTexCoord4dvARB bluegl_glMultiTexCoord4dvARB +#define glMultiTexCoord4fARB bluegl_glMultiTexCoord4fARB +#define glMultiTexCoord4fvARB bluegl_glMultiTexCoord4fvARB +#define glMultiTexCoord4iARB bluegl_glMultiTexCoord4iARB +#define glMultiTexCoord4ivARB bluegl_glMultiTexCoord4ivARB +#define glMultiTexCoord4sARB bluegl_glMultiTexCoord4sARB +#define glMultiTexCoord4svARB bluegl_glMultiTexCoord4svARB +#define glGenQueriesARB bluegl_glGenQueriesARB +#define glDeleteQueriesARB bluegl_glDeleteQueriesARB +#define glIsQueryARB bluegl_glIsQueryARB +#define glBeginQueryARB bluegl_glBeginQueryARB +#define glEndQueryARB bluegl_glEndQueryARB +#define glGetQueryivARB bluegl_glGetQueryivARB +#define glGetQueryObjectivARB bluegl_glGetQueryObjectivARB +#define glGetQueryObjectuivARB bluegl_glGetQueryObjectuivARB +#define glMaxShaderCompilerThreadsARB bluegl_glMaxShaderCompilerThreadsARB +#define glPointParameterfARB bluegl_glPointParameterfARB +#define glPointParameterfvARB bluegl_glPointParameterfvARB +#define glGetnMapdvARB bluegl_glGetnMapdvARB +#define glGetnMapfvARB bluegl_glGetnMapfvARB +#define glGetnMapivARB bluegl_glGetnMapivARB +#define glGetnPixelMapfvARB bluegl_glGetnPixelMapfvARB +#define glGetnPixelMapuivARB bluegl_glGetnPixelMapuivARB +#define glGetnPixelMapusvARB bluegl_glGetnPixelMapusvARB +#define glGetnPolygonStippleARB bluegl_glGetnPolygonStippleARB +#define glGetnColorTableARB bluegl_glGetnColorTableARB +#define glGetnConvolutionFilterARB bluegl_glGetnConvolutionFilterARB +#define glGetnSeparableFilterARB bluegl_glGetnSeparableFilterARB +#define glGetnHistogramARB bluegl_glGetnHistogramARB +#define glGetnMinmaxARB bluegl_glGetnMinmaxARB +#define glFramebufferSampleLocationsfvARB bluegl_glFramebufferSampleLocationsfvARB +#define glNamedFramebufferSampleLocationsfvARB bluegl_glNamedFramebufferSampleLocationsfvARB +#define glEvaluateDepthValuesARB bluegl_glEvaluateDepthValuesARB +#define glDeleteObjectARB bluegl_glDeleteObjectARB +#define glGetHandleARB bluegl_glGetHandleARB +#define glDetachObjectARB bluegl_glDetachObjectARB +#define glCreateShaderObjectARB bluegl_glCreateShaderObjectARB +#define glShaderSourceARB bluegl_glShaderSourceARB +#define glCompileShaderARB bluegl_glCompileShaderARB +#define glCreateProgramObjectARB bluegl_glCreateProgramObjectARB +#define glAttachObjectARB bluegl_glAttachObjectARB +#define glLinkProgramARB bluegl_glLinkProgramARB +#define glUseProgramObjectARB bluegl_glUseProgramObjectARB #define glValidateProgramARB bluegl_glValidateProgramARB -#define glUniform3ui bluegl_glUniform3ui -#define glTransformFeedbackVaryingsNV bluegl_glTransformFeedbackVaryingsNV -#define glGetSeparableFilter bluegl_glGetSeparableFilter -#define glGetCompressedTexImageARB bluegl_glGetCompressedTexImageARB -#define glProgramNamedParameter4fvNV bluegl_glProgramNamedParameter4fvNV -#define glTextureBarrierNV bluegl_glTextureBarrierNV -#define glRasterSamplesEXT bluegl_glRasterSamplesEXT -#define glSecondaryColor3dEXT bluegl_glSecondaryColor3dEXT -#define glVertexAttrib1svNV bluegl_glVertexAttrib1svNV -#define glTexImage3D bluegl_glTexImage3D -#define glUniform1i64ARB bluegl_glUniform1i64ARB -#define glVertexAttrib4Nuiv bluegl_glVertexAttrib4Nuiv -#define glGetProgramivNV bluegl_glGetProgramivNV -#define glGetTexGenxvOES bluegl_glGetTexGenxvOES -#define glVertexP4uiv bluegl_glVertexP4uiv -#define glMapGrid1xOES bluegl_glMapGrid1xOES -#define glProgramUniformMatrix2dv bluegl_glProgramUniformMatrix2dv -#define glColorMaski bluegl_glColorMaski -#define glEdgeFlagPointerListIBM bluegl_glEdgeFlagPointerListIBM -#define glGetUniformBlockIndex bluegl_glGetUniformBlockIndex -#define glClearColorxOES bluegl_glClearColorxOES -#define glPixelTransformParameteriEXT bluegl_glPixelTransformParameteriEXT -#define glNamedFramebufferTexture3DEXT bluegl_glNamedFramebufferTexture3DEXT -#define glTexCoord4xOES bluegl_glTexCoord4xOES +#define glUniform1fARB bluegl_glUniform1fARB +#define glUniform2fARB bluegl_glUniform2fARB +#define glUniform3fARB bluegl_glUniform3fARB +#define glUniform4fARB bluegl_glUniform4fARB +#define glUniform1iARB bluegl_glUniform1iARB +#define glUniform2iARB bluegl_glUniform2iARB +#define glUniform3iARB bluegl_glUniform3iARB +#define glUniform4iARB bluegl_glUniform4iARB +#define glUniform1fvARB bluegl_glUniform1fvARB +#define glUniform2fvARB bluegl_glUniform2fvARB +#define glUniform3fvARB bluegl_glUniform3fvARB +#define glUniform4fvARB bluegl_glUniform4fvARB +#define glUniform1ivARB bluegl_glUniform1ivARB +#define glUniform2ivARB bluegl_glUniform2ivARB +#define glUniform3ivARB bluegl_glUniform3ivARB +#define glUniform4ivARB bluegl_glUniform4ivARB +#define glUniformMatrix2fvARB bluegl_glUniformMatrix2fvARB +#define glUniformMatrix3fvARB bluegl_glUniformMatrix3fvARB +#define glUniformMatrix4fvARB bluegl_glUniformMatrix4fvARB +#define glGetObjectParameterfvARB bluegl_glGetObjectParameterfvARB +#define glGetObjectParameterivARB bluegl_glGetObjectParameterivARB +#define glGetInfoLogARB bluegl_glGetInfoLogARB +#define glGetAttachedObjectsARB bluegl_glGetAttachedObjectsARB +#define glGetUniformLocationARB bluegl_glGetUniformLocationARB +#define glGetActiveUniformARB bluegl_glGetActiveUniformARB +#define glGetUniformfvARB bluegl_glGetUniformfvARB #define glGetUniformivARB bluegl_glGetUniformivARB -#define glNamedFramebufferTextureEXT bluegl_glNamedFramebufferTextureEXT -#define glDrawBuffers bluegl_glDrawBuffers +#define glGetShaderSourceARB bluegl_glGetShaderSourceARB +#define glTexBufferARB bluegl_glTexBufferARB +#define glCompressedTexImage3DARB bluegl_glCompressedTexImage3DARB +#define glCompressedTexImage2DARB bluegl_glCompressedTexImage2DARB +#define glCompressedTexImage1DARB bluegl_glCompressedTexImage1DARB +#define glCompressedTexSubImage3DARB bluegl_glCompressedTexSubImage3DARB +#define glCompressedTexSubImage2DARB bluegl_glCompressedTexSubImage2DARB +#define glCompressedTexSubImage1DARB bluegl_glCompressedTexSubImage1DARB +#define glGetCompressedTexImageARB bluegl_glGetCompressedTexImageARB +#define glLoadTransposeMatrixfARB bluegl_glLoadTransposeMatrixfARB +#define glLoadTransposeMatrixdARB bluegl_glLoadTransposeMatrixdARB +#define glMultTransposeMatrixfARB bluegl_glMultTransposeMatrixfARB +#define glMultTransposeMatrixdARB bluegl_glMultTransposeMatrixdARB +#define glWeightbvARB bluegl_glWeightbvARB +#define glWeightsvARB bluegl_glWeightsvARB +#define glWeightivARB bluegl_glWeightivARB +#define glWeightfvARB bluegl_glWeightfvARB +#define glWeightdvARB bluegl_glWeightdvARB +#define glWeightubvARB bluegl_glWeightubvARB +#define glWeightusvARB bluegl_glWeightusvARB #define glWeightuivARB bluegl_glWeightuivARB -#define glMultiTexCoordP1ui bluegl_glMultiTexCoordP1ui -#define glCopyTexSubImage1DEXT bluegl_glCopyTexSubImage1DEXT -#define glVertexArrayAttribBinding bluegl_glVertexArrayAttribBinding -#define glVertexP4ui bluegl_glVertexP4ui -#define glVertex2hvNV bluegl_glVertex2hvNV -#define glDrawElementsInstancedBaseInstance bluegl_glDrawElementsInstancedBaseInstance -#define glNormalStream3sATI bluegl_glNormalStream3sATI -#define glTexCoord2fColor4fNormal3fVertex3fSUN bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN -#define glBindSamplers bluegl_glBindSamplers -#define glGetCompressedMultiTexImageEXT bluegl_glGetCompressedMultiTexImageEXT -#define glGetRenderbufferParameterivEXT bluegl_glGetRenderbufferParameterivEXT -#define glUniform3dv bluegl_glUniform3dv -#define glFlushRasterSGIX bluegl_glFlushRasterSGIX -#define glVertexAttribs3hvNV bluegl_glVertexAttribs3hvNV -#define glGetnSeparableFilterARB bluegl_glGetnSeparableFilterARB +#define glWeightPointerARB bluegl_glWeightPointerARB +#define glVertexBlendARB bluegl_glVertexBlendARB +#define glBindBufferARB bluegl_glBindBufferARB +#define glDeleteBuffersARB bluegl_glDeleteBuffersARB +#define glGenBuffersARB bluegl_glGenBuffersARB +#define glIsBufferARB bluegl_glIsBufferARB +#define glBufferDataARB bluegl_glBufferDataARB +#define glBufferSubDataARB bluegl_glBufferSubDataARB +#define glGetBufferSubDataARB bluegl_glGetBufferSubDataARB +#define glMapBufferARB bluegl_glMapBufferARB +#define glUnmapBufferARB bluegl_glUnmapBufferARB +#define glGetBufferParameterivARB bluegl_glGetBufferParameterivARB +#define glGetBufferPointervARB bluegl_glGetBufferPointervARB +#define glVertexAttrib1dARB bluegl_glVertexAttrib1dARB +#define glVertexAttrib1dvARB bluegl_glVertexAttrib1dvARB +#define glVertexAttrib1fARB bluegl_glVertexAttrib1fARB +#define glVertexAttrib1fvARB bluegl_glVertexAttrib1fvARB +#define glVertexAttrib1sARB bluegl_glVertexAttrib1sARB +#define glVertexAttrib1svARB bluegl_glVertexAttrib1svARB +#define glVertexAttrib2dARB bluegl_glVertexAttrib2dARB +#define glVertexAttrib2dvARB bluegl_glVertexAttrib2dvARB +#define glVertexAttrib2fARB bluegl_glVertexAttrib2fARB +#define glVertexAttrib2fvARB bluegl_glVertexAttrib2fvARB +#define glVertexAttrib2sARB bluegl_glVertexAttrib2sARB +#define glVertexAttrib2svARB bluegl_glVertexAttrib2svARB +#define glVertexAttrib3dARB bluegl_glVertexAttrib3dARB +#define glVertexAttrib3dvARB bluegl_glVertexAttrib3dvARB +#define glVertexAttrib3fARB bluegl_glVertexAttrib3fARB +#define glVertexAttrib3fvARB bluegl_glVertexAttrib3fvARB +#define glVertexAttrib3sARB bluegl_glVertexAttrib3sARB +#define glVertexAttrib3svARB bluegl_glVertexAttrib3svARB +#define glVertexAttrib4NbvARB bluegl_glVertexAttrib4NbvARB +#define glVertexAttrib4NivARB bluegl_glVertexAttrib4NivARB +#define glVertexAttrib4NsvARB bluegl_glVertexAttrib4NsvARB +#define glVertexAttrib4NubARB bluegl_glVertexAttrib4NubARB +#define glVertexAttrib4NubvARB bluegl_glVertexAttrib4NubvARB +#define glVertexAttrib4NuivARB bluegl_glVertexAttrib4NuivARB +#define glVertexAttrib4NusvARB bluegl_glVertexAttrib4NusvARB +#define glVertexAttrib4bvARB bluegl_glVertexAttrib4bvARB +#define glVertexAttrib4dARB bluegl_glVertexAttrib4dARB +#define glVertexAttrib4dvARB bluegl_glVertexAttrib4dvARB +#define glVertexAttrib4fARB bluegl_glVertexAttrib4fARB +#define glVertexAttrib4fvARB bluegl_glVertexAttrib4fvARB +#define glVertexAttrib4ivARB bluegl_glVertexAttrib4ivARB +#define glVertexAttrib4sARB bluegl_glVertexAttrib4sARB +#define glVertexAttrib4svARB bluegl_glVertexAttrib4svARB +#define glVertexAttrib4ubvARB bluegl_glVertexAttrib4ubvARB +#define glVertexAttrib4uivARB bluegl_glVertexAttrib4uivARB +#define glVertexAttrib4usvARB bluegl_glVertexAttrib4usvARB +#define glVertexAttribPointerARB bluegl_glVertexAttribPointerARB +#define glEnableVertexAttribArrayARB bluegl_glEnableVertexAttribArrayARB +#define glDisableVertexAttribArrayARB bluegl_glDisableVertexAttribArrayARB +#define glGetVertexAttribdvARB bluegl_glGetVertexAttribdvARB +#define glGetVertexAttribfvARB bluegl_glGetVertexAttribfvARB +#define glGetVertexAttribivARB bluegl_glGetVertexAttribivARB +#define glGetVertexAttribPointervARB bluegl_glGetVertexAttribPointervARB +#define glBindAttribLocationARB bluegl_glBindAttribLocationARB +#define glGetActiveAttribARB bluegl_glGetActiveAttribARB +#define glGetAttribLocationARB bluegl_glGetAttribLocationARB +#define glWindowPos2dARB bluegl_glWindowPos2dARB +#define glWindowPos2dvARB bluegl_glWindowPos2dvARB +#define glWindowPos2fARB bluegl_glWindowPos2fARB +#define glWindowPos2fvARB bluegl_glWindowPos2fvARB +#define glWindowPos2iARB bluegl_glWindowPos2iARB +#define glWindowPos2ivARB bluegl_glWindowPos2ivARB #define glWindowPos2sARB bluegl_glWindowPos2sARB -#define glPopDebugGroup bluegl_glPopDebugGroup -#define glVideoCaptureNV bluegl_glVideoCaptureNV -#define glTangent3bEXT bluegl_glTangent3bEXT -#define glLinkProgram bluegl_glLinkProgram -#define glFogCoordPointerListIBM bluegl_glFogCoordPointerListIBM -#define glRotatexOES bluegl_glRotatexOES -#define glPathParameterivNV bluegl_glPathParameterivNV -#define glVertexAttribLPointerEXT bluegl_glVertexAttribLPointerEXT -#define glGetInteger64i_v bluegl_glGetInteger64i_v -#define glCompressedMultiTexSubImage1DEXT bluegl_glCompressedMultiTexSubImage1DEXT -#define glConvolutionParameteriEXT bluegl_glConvolutionParameteriEXT -#define glNamedFramebufferTextureLayer bluegl_glNamedFramebufferTextureLayer -#define glWindowPos2sMESA bluegl_glWindowPos2sMESA -#define glCoverStrokePathInstancedNV bluegl_glCoverStrokePathInstancedNV -#define glTexParameteri bluegl_glTexParameteri -#define glUniform1uiv bluegl_glUniform1uiv -#define glMultiTexCoord4fv bluegl_glMultiTexCoord4fv -#define glProgramParameter4fvNV bluegl_glProgramParameter4fvNV -#define glDeformationMap3fSGIX bluegl_glDeformationMap3fSGIX -#define glBlendEquationiARB bluegl_glBlendEquationiARB -#define glStencilFunc bluegl_glStencilFunc -#define glFogCoordd bluegl_glFogCoordd -#define glUniform2iv bluegl_glUniform2iv -#define glUniform1i64NV bluegl_glUniform1i64NV -#define glTextureStorage2D bluegl_glTextureStorage2D -#define glTextureStorage2DMultisampleEXT bluegl_glTextureStorage2DMultisampleEXT -#define glCopyTexSubImage1D bluegl_glCopyTexSubImage1D -#define glSamplerParameterf bluegl_glSamplerParameterf -#define glDrawArraysInstancedBaseInstance bluegl_glDrawArraysInstancedBaseInstance -#define glVertexAttrib4uivARB bluegl_glVertexAttrib4uivARB -#define glVertexAttribFormatNV bluegl_glVertexAttribFormatNV -#define glIsQueryARB bluegl_glIsQueryARB -#define glSampleCoverageARB bluegl_glSampleCoverageARB -#define glGetnCompressedTexImageARB bluegl_glGetnCompressedTexImageARB -#define glTexCoord3xvOES bluegl_glTexCoord3xvOES -#define glTexCoord2fNormal3fVertex3fSUN bluegl_glTexCoord2fNormal3fVertex3fSUN -#define glGetGraphicsResetStatus bluegl_glGetGraphicsResetStatus -#define glProgramVertexLimitNV bluegl_glProgramVertexLimitNV -#define glCopyConvolutionFilter2D bluegl_glCopyConvolutionFilter2D -#define glVertexStream4fATI bluegl_glVertexStream4fATI -#define glSecondaryColor3f bluegl_glSecondaryColor3f -#define glTexCoordP1ui bluegl_glTexCoordP1ui -#define glProgramBufferParametersfvNV bluegl_glProgramBufferParametersfvNV -#define glTexCoord1xOES bluegl_glTexCoord1xOES -#define glFogCoordfv bluegl_glFogCoordfv -#define glMultiDrawElementsIndirectAMD bluegl_glMultiDrawElementsIndirectAMD -#define glGetnMinmaxARB bluegl_glGetnMinmaxARB -#define glSecondaryColor3uivEXT bluegl_glSecondaryColor3uivEXT -#define glColorMask bluegl_glColorMask -#define glTextureImage2DMultisampleCoverageNV bluegl_glTextureImage2DMultisampleCoverageNV -#define glMultiModeDrawElementsIBM bluegl_glMultiModeDrawElementsIBM -#define glVertexArrayAttribLFormat bluegl_glVertexArrayAttribLFormat -#define glBindFragDataLocationIndexed bluegl_glBindFragDataLocationIndexed -#define glGetNamedBufferParameterivEXT bluegl_glGetNamedBufferParameterivEXT -#define glSecondaryColor3bEXT bluegl_glSecondaryColor3bEXT -#define glVertexAttrib1fNV bluegl_glVertexAttrib1fNV -#define glVertexAttribI4uivEXT bluegl_glVertexAttribI4uivEXT -#define glGetQueryObjecti64vEXT bluegl_glGetQueryObjecti64vEXT -#define glNormalStream3bATI bluegl_glNormalStream3bATI -#define glGetObjectParameterivAPPLE bluegl_glGetObjectParameterivAPPLE -#define glProgramUniform3uivEXT bluegl_glProgramUniform3uivEXT -#define glProgramUniformHandleui64ARB bluegl_glProgramUniformHandleui64ARB -#define glGetPointerv bluegl_glGetPointerv -#define glUniformMatrix4x3dv bluegl_glUniformMatrix4x3dv -#define glTexCoordP4uiv bluegl_glTexCoordP4uiv -#define glVertexAttribI4sv bluegl_glVertexAttribI4sv -#define glFlushMappedNamedBufferRangeEXT bluegl_glFlushMappedNamedBufferRangeEXT -#define glDisableVertexArrayEXT bluegl_glDisableVertexArrayEXT -#define glGetPathDashArrayNV bluegl_glGetPathDashArrayNV -#define glProgramUniform2uiEXT bluegl_glProgramUniform2uiEXT -#define glBindImageTextures bluegl_glBindImageTextures -#define glVertexAttrib4sNV bluegl_glVertexAttrib4sNV -#define glReplacementCodeuiNormal3fVertex3fvSUN bluegl_glReplacementCodeuiNormal3fVertex3fvSUN -#define glVertex3hNV bluegl_glVertex3hNV -#define glReplacementCodeuiColor4fNormal3fVertex3fSUN bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN -#define glProgramUniform2i64NV bluegl_glProgramUniform2i64NV -#define glBufferData bluegl_glBufferData -#define glGetBufferParameteriv bluegl_glGetBufferParameteriv -#define glIsAsyncMarkerSGIX bluegl_glIsAsyncMarkerSGIX -#define glTexImage4DSGIS bluegl_glTexImage4DSGIS -#define glGetMultiTexEnvivEXT bluegl_glGetMultiTexEnvivEXT +#define glWindowPos2svARB bluegl_glWindowPos2svARB +#define glWindowPos3dARB bluegl_glWindowPos3dARB +#define glWindowPos3dvARB bluegl_glWindowPos3dvARB +#define glWindowPos3fARB bluegl_glWindowPos3fARB +#define glWindowPos3fvARB bluegl_glWindowPos3fvARB +#define glWindowPos3iARB bluegl_glWindowPos3iARB +#define glWindowPos3ivARB bluegl_glWindowPos3ivARB +#define glWindowPos3sARB bluegl_glWindowPos3sARB +#define glWindowPos3svARB bluegl_glWindowPos3svARB +#define glBlendBarrierKHR bluegl_glBlendBarrierKHR +#define glMultiTexCoord1bOES bluegl_glMultiTexCoord1bOES +#define glMultiTexCoord1bvOES bluegl_glMultiTexCoord1bvOES +#define glMultiTexCoord2bOES bluegl_glMultiTexCoord2bOES +#define glMultiTexCoord2bvOES bluegl_glMultiTexCoord2bvOES +#define glMultiTexCoord3bOES bluegl_glMultiTexCoord3bOES +#define glMultiTexCoord3bvOES bluegl_glMultiTexCoord3bvOES +#define glMultiTexCoord4bOES bluegl_glMultiTexCoord4bOES +#define glMultiTexCoord4bvOES bluegl_glMultiTexCoord4bvOES +#define glTexCoord1bOES bluegl_glTexCoord1bOES +#define glTexCoord1bvOES bluegl_glTexCoord1bvOES +#define glTexCoord2bOES bluegl_glTexCoord2bOES +#define glTexCoord2bvOES bluegl_glTexCoord2bvOES +#define glTexCoord3bOES bluegl_glTexCoord3bOES +#define glTexCoord3bvOES bluegl_glTexCoord3bvOES +#define glTexCoord4bOES bluegl_glTexCoord4bOES +#define glTexCoord4bvOES bluegl_glTexCoord4bvOES +#define glVertex2bOES bluegl_glVertex2bOES +#define glVertex2bvOES bluegl_glVertex2bvOES +#define glVertex3bOES bluegl_glVertex3bOES +#define glVertex3bvOES bluegl_glVertex3bvOES +#define glVertex4bOES bluegl_glVertex4bOES +#define glVertex4bvOES bluegl_glVertex4bvOES +#define glAlphaFuncxOES bluegl_glAlphaFuncxOES +#define glClearColorxOES bluegl_glClearColorxOES +#define glClearDepthxOES bluegl_glClearDepthxOES +#define glClipPlanexOES bluegl_glClipPlanexOES +#define glColor4xOES bluegl_glColor4xOES +#define glDepthRangexOES bluegl_glDepthRangexOES +#define glFogxOES bluegl_glFogxOES +#define glFogxvOES bluegl_glFogxvOES +#define glFrustumxOES bluegl_glFrustumxOES #define glGetClipPlanexOES bluegl_glGetClipPlanexOES -#define glUniform3uiEXT bluegl_glUniform3uiEXT -#define glMultiTexCoord3sv bluegl_glMultiTexCoord3sv -#define glVertexAttribs1hvNV bluegl_glVertexAttribs1hvNV -#define glGetPerfQueryInfoINTEL bluegl_glGetPerfQueryInfoINTEL -#define glGetClipPlanefOES bluegl_glGetClipPlanefOES -#define glSecondaryColor3ubEXT bluegl_glSecondaryColor3ubEXT -#define glSyncTextureINTEL bluegl_glSyncTextureINTEL -#define glProgramUniformMatrix3x2dv bluegl_glProgramUniformMatrix3x2dv -#define glUniformMatrix4x2fv bluegl_glUniformMatrix4x2fv -#define glTextureBufferEXT bluegl_glTextureBufferEXT -#define glVertexPointervINTEL bluegl_glVertexPointervINTEL -#define glGetShaderPrecisionFormat bluegl_glGetShaderPrecisionFormat -#define glGetTextureImage bluegl_glGetTextureImage -#define glUniform3ivARB bluegl_glUniform3ivARB -#define glFramebufferParameteri bluegl_glFramebufferParameteri +#define glGetFixedvOES bluegl_glGetFixedvOES +#define glGetTexEnvxvOES bluegl_glGetTexEnvxvOES +#define glGetTexParameterxvOES bluegl_glGetTexParameterxvOES +#define glLightModelxOES bluegl_glLightModelxOES +#define glLightModelxvOES bluegl_glLightModelxvOES +#define glLightxOES bluegl_glLightxOES +#define glLightxvOES bluegl_glLightxvOES +#define glLineWidthxOES bluegl_glLineWidthxOES +#define glLoadMatrixxOES bluegl_glLoadMatrixxOES +#define glMaterialxOES bluegl_glMaterialxOES +#define glMaterialxvOES bluegl_glMaterialxvOES +#define glMultMatrixxOES bluegl_glMultMatrixxOES +#define glMultiTexCoord4xOES bluegl_glMultiTexCoord4xOES +#define glNormal3xOES bluegl_glNormal3xOES +#define glOrthoxOES bluegl_glOrthoxOES #define glPointParameterxvOES bluegl_glPointParameterxvOES -#define glBlendFunci bluegl_glBlendFunci -#define glUniformMatrix2x3dv bluegl_glUniformMatrix2x3dv -#define glUniform2i64ARB bluegl_glUniform2i64ARB -#define glProgramEnvParameterI4ivNV bluegl_glProgramEnvParameterI4ivNV -#define glFragmentLightModelivSGIX bluegl_glFragmentLightModelivSGIX -#define glProgramUniform4ui64vARB bluegl_glProgramUniform4ui64vARB -#define glProgramUniformMatrix2x3fvEXT bluegl_glProgramUniformMatrix2x3fvEXT -#define glStencilClearTagEXT bluegl_glStencilClearTagEXT -#define glMultiTexCoord4s bluegl_glMultiTexCoord4s -#define glProgramUniformMatrix4dvEXT bluegl_glProgramUniformMatrix4dvEXT -#define glGetNamedBufferParameteri64v bluegl_glGetNamedBufferParameteri64v -#define glVertexAttribI3iEXT bluegl_glVertexAttribI3iEXT -#define glReplacementCodeuivSUN bluegl_glReplacementCodeuivSUN -#define glFragmentLightModeliSGIX bluegl_glFragmentLightModeliSGIX -#define glUniform2i64vNV bluegl_glUniform2i64vNV -#define glPointParameterivNV bluegl_glPointParameterivNV -#define glStencilStrokePathInstancedNV bluegl_glStencilStrokePathInstancedNV -#define glInsertComponentEXT bluegl_glInsertComponentEXT -#define glIsEnabled bluegl_glIsEnabled -#define glWindowPos3dMESA bluegl_glWindowPos3dMESA -#define glGetnCompressedTexImage bluegl_glGetnCompressedTexImage -#define glCopyMultiTexSubImage2DEXT bluegl_glCopyMultiTexSubImage2DEXT -#define glDisableIndexedEXT bluegl_glDisableIndexedEXT -#define glWindowPos2dv bluegl_glWindowPos2dv -#define glAlphaFuncxOES bluegl_glAlphaFuncxOES -#define glCreateFramebuffers bluegl_glCreateFramebuffers -#define glGetAttribLocationARB bluegl_glGetAttribLocationARB -#define glVertexAttrib1sARB bluegl_glVertexAttrib1sARB -#define glTexBumpParameterfvATI bluegl_glTexBumpParameterfvATI -#define glGetActiveSubroutineUniformiv bluegl_glGetActiveSubroutineUniformiv -#define glVertexAttrib2fARB bluegl_glVertexAttrib2fARB -#define glGetTransformFeedbacki64_v bluegl_glGetTransformFeedbacki64_v -#define glMultiTexCoord4hvNV bluegl_glMultiTexCoord4hvNV -#define glBlendColorEXT bluegl_glBlendColorEXT -#define glCompressedTexSubImage3D bluegl_glCompressedTexSubImage3D -#define glVertexStream4dvATI bluegl_glVertexStream4dvATI -#define glMaxShaderCompilerThreadsARB bluegl_glMaxShaderCompilerThreadsARB -#define glGlobalAlphaFactorbSUN bluegl_glGlobalAlphaFactorbSUN -#define glGlobalAlphaFactoruiSUN bluegl_glGlobalAlphaFactoruiSUN -#define glClientActiveTextureARB bluegl_glClientActiveTextureARB -#define glGenProgramsARB bluegl_glGenProgramsARB -#define glGetTexParameterPointervAPPLE bluegl_glGetTexParameterPointervAPPLE -#define glGetBooleanv bluegl_glGetBooleanv -#define glDrawElementsBaseVertex bluegl_glDrawElementsBaseVertex -#define glVertexAttribL4ui64vNV bluegl_glVertexAttribL4ui64vNV -#define glSecondaryColor3fvEXT bluegl_glSecondaryColor3fvEXT -#define glMultiTexCoord1s bluegl_glMultiTexCoord1s -#define glDeleteProgramsARB bluegl_glDeleteProgramsARB -#define glDrawElementsInstancedBaseVertex bluegl_glDrawElementsInstancedBaseVertex -#define glProgramUniform4dEXT bluegl_glProgramUniform4dEXT -#define glGetPathMetricRangeNV bluegl_glGetPathMetricRangeNV -#define glProgramUniform3iEXT bluegl_glProgramUniform3iEXT -#define glDeleteBuffers bluegl_glDeleteBuffers -#define glSecondaryColor3usEXT bluegl_glSecondaryColor3usEXT -#define glDepthMask bluegl_glDepthMask -#define glMultiTexCoord2dv bluegl_glMultiTexCoord2dv -#define glCopyConvolutionFilter2DEXT bluegl_glCopyConvolutionFilter2DEXT +#define glPointSizexOES bluegl_glPointSizexOES +#define glPolygonOffsetxOES bluegl_glPolygonOffsetxOES +#define glRotatexOES bluegl_glRotatexOES +#define glScalexOES bluegl_glScalexOES +#define glTexEnvxOES bluegl_glTexEnvxOES +#define glTexEnvxvOES bluegl_glTexEnvxvOES +#define glTexParameterxOES bluegl_glTexParameterxOES +#define glTexParameterxvOES bluegl_glTexParameterxvOES +#define glTranslatexOES bluegl_glTranslatexOES +#define glAccumxOES bluegl_glAccumxOES +#define glBitmapxOES bluegl_glBitmapxOES +#define glBlendColorxOES bluegl_glBlendColorxOES +#define glClearAccumxOES bluegl_glClearAccumxOES +#define glColor3xOES bluegl_glColor3xOES +#define glColor3xvOES bluegl_glColor3xvOES +#define glColor4xvOES bluegl_glColor4xvOES +#define glConvolutionParameterxOES bluegl_glConvolutionParameterxOES +#define glConvolutionParameterxvOES bluegl_glConvolutionParameterxvOES +#define glEvalCoord1xOES bluegl_glEvalCoord1xOES +#define glEvalCoord1xvOES bluegl_glEvalCoord1xvOES +#define glEvalCoord2xOES bluegl_glEvalCoord2xOES +#define glEvalCoord2xvOES bluegl_glEvalCoord2xvOES +#define glFeedbackBufferxOES bluegl_glFeedbackBufferxOES +#define glGetConvolutionParameterxvOES bluegl_glGetConvolutionParameterxvOES +#define glGetHistogramParameterxvOES bluegl_glGetHistogramParameterxvOES +#define glGetLightxOES bluegl_glGetLightxOES +#define glGetMapxvOES bluegl_glGetMapxvOES +#define glGetMaterialxOES bluegl_glGetMaterialxOES +#define glGetPixelMapxv bluegl_glGetPixelMapxv +#define glGetTexGenxvOES bluegl_glGetTexGenxvOES +#define glGetTexLevelParameterxvOES bluegl_glGetTexLevelParameterxvOES +#define glIndexxOES bluegl_glIndexxOES +#define glIndexxvOES bluegl_glIndexxvOES #define glLoadTransposeMatrixxOES bluegl_glLoadTransposeMatrixxOES -#define glPixelStoref bluegl_glPixelStoref -#define glStencilOpSeparateATI bluegl_glStencilOpSeparateATI -#define glCopyTextureSubImage1DEXT bluegl_glCopyTextureSubImage1DEXT -#define glMatrixScaledEXT bluegl_glMatrixScaledEXT -#define glProgramUniform2i64ARB bluegl_glProgramUniform2i64ARB -#define glTextureParameterfEXT bluegl_glTextureParameterfEXT -#define glGetProgramLocalParameterIivNV bluegl_glGetProgramLocalParameterIivNV -#define glGetShaderInfoLog bluegl_glGetShaderInfoLog -#define glTexCoordP2uiv bluegl_glTexCoordP2uiv -#define glDebugMessageCallback bluegl_glDebugMessageCallback -#define glLoadTransposeMatrixfARB bluegl_glLoadTransposeMatrixfARB -#define glUniform1ui bluegl_glUniform1ui -#define glVertexAttribL4dvEXT bluegl_glVertexAttribL4dvEXT -#define glVertex3bvOES bluegl_glVertex3bvOES -#define glPassThroughxOES bluegl_glPassThroughxOES -#define glGetFloatIndexedvEXT bluegl_glGetFloatIndexedvEXT -#define glSubpixelPrecisionBiasNV bluegl_glSubpixelPrecisionBiasNV -#define glFinishFenceNV bluegl_glFinishFenceNV -#define glGetProgramBinary bluegl_glGetProgramBinary -#define glBlendFuncSeparateIndexedAMD bluegl_glBlendFuncSeparateIndexedAMD -#define glBlendFuncSeparate bluegl_glBlendFuncSeparate -#define glIndexxvOES bluegl_glIndexxvOES -#define glVertexAttrib4NuivARB bluegl_glVertexAttrib4NuivARB -#define glUniform2ui64ARB bluegl_glUniform2ui64ARB -#define glEndPerfMonitorAMD bluegl_glEndPerfMonitorAMD -#define glReleaseShaderCompiler bluegl_glReleaseShaderCompiler -#define glGenFramebuffersEXT bluegl_glGenFramebuffersEXT -#define glUniform2uiv bluegl_glUniform2uiv -#define glGenSymbolsEXT bluegl_glGenSymbolsEXT -#define glVertexAttribIPointer bluegl_glVertexAttribIPointer -#define glUniformMatrix3x4fv bluegl_glUniformMatrix3x4fv -#define glTexCoord3bOES bluegl_glTexCoord3bOES -#define glVDPAUUnmapSurfacesNV bluegl_glVDPAUUnmapSurfacesNV -#define glProgramUniform4ui64NV bluegl_glProgramUniform4ui64NV -#define glUniformHandleui64NV bluegl_glUniformHandleui64NV -#define glGetStageIndexNV bluegl_glGetStageIndexNV -#define glMultiTexCoord3fvARB bluegl_glMultiTexCoord3fvARB -#define glBindBufferOffsetEXT bluegl_glBindBufferOffsetEXT -#define glVertexAttribL4dv bluegl_glVertexAttribL4dv -#define glClearStencil bluegl_glClearStencil -#define glWindowPos2ivMESA bluegl_glWindowPos2ivMESA -#define glReplacementCodeubvSUN bluegl_glReplacementCodeubvSUN -#define glClipPlanefOES bluegl_glClipPlanefOES -#define glMultiTexCoord1xOES bluegl_glMultiTexCoord1xOES -#define glGetProgramInfoLog bluegl_glGetProgramInfoLog -#define glEndFragmentShaderATI bluegl_glEndFragmentShaderATI -#define glGetTransformFeedbackVaryingNV bluegl_glGetTransformFeedbackVaryingNV -#define glProgramUniformMatrix4x2dv bluegl_glProgramUniformMatrix4x2dv -#define glResetHistogramEXT bluegl_glResetHistogramEXT -#define glUniform1i64vNV bluegl_glUniform1i64vNV -#define glProgramEnvParameter4dARB bluegl_glProgramEnvParameter4dARB -#define glCopyTextureSubImage2DEXT bluegl_glCopyTextureSubImage2DEXT -#define glGetCombinerInputParameterivNV bluegl_glGetCombinerInputParameterivNV -#define glUniformMatrix4fv bluegl_glUniformMatrix4fv -#define glGenQueriesARB bluegl_glGenQueriesARB -#define glGetnSeparableFilter bluegl_glGetnSeparableFilter -#define glUniform3ui64vARB bluegl_glUniform3ui64vARB -#define glMultiTexCoord1i bluegl_glMultiTexCoord1i -#define glColorTable bluegl_glColorTable -#define glVertexAttribs4ubvNV bluegl_glVertexAttribs4ubvNV -#define glProgramUniform3uiv bluegl_glProgramUniform3uiv -#define glProgramUniformMatrix3x2fv bluegl_glProgramUniformMatrix3x2fv -#define glUnmapBuffer bluegl_glUnmapBuffer -#define glBindTextureUnit bluegl_glBindTextureUnit -#define glTextureParameterIuivEXT bluegl_glTextureParameterIuivEXT -#define glVertexAttribDivisor bluegl_glVertexAttribDivisor -#define glSamplerParameterIiv bluegl_glSamplerParameterIiv -#define glGetDebugMessageLog bluegl_glGetDebugMessageLog -#define glSelectPerfMonitorCountersAMD bluegl_glSelectPerfMonitorCountersAMD -#define glVertexAttribI2i bluegl_glVertexAttribI2i -#define glDepthRangedNV bluegl_glDepthRangedNV -#define glTextureRangeAPPLE bluegl_glTextureRangeAPPLE -#define glEvalCoord2xOES bluegl_glEvalCoord2xOES -#define glCallCommandListNV bluegl_glCallCommandListNV -#define glVariantdvEXT bluegl_glVariantdvEXT -#define glBlendColorxOES bluegl_glBlendColorxOES -#define glFramebufferTexture2DEXT bluegl_glFramebufferTexture2DEXT -#define glGetString bluegl_glGetString -#define glVertexStream3iATI bluegl_glVertexStream3iATI -#define glHintPGI bluegl_glHintPGI -#define glGenPerfMonitorsAMD bluegl_glGenPerfMonitorsAMD -#define glTextureSubImage3DEXT bluegl_glTextureSubImage3DEXT -#define glVertexAttrib4usvARB bluegl_glVertexAttrib4usvARB -#define glVertexArrayBindVertexBufferEXT bluegl_glVertexArrayBindVertexBufferEXT -#define glMinSampleShading bluegl_glMinSampleShading -#define glIsPathNV bluegl_glIsPathNV -#define glGetPathTexGenivNV bluegl_glGetPathTexGenivNV -#define glProgramUniform3fv bluegl_glProgramUniform3fv -#define glVertexAttrib3sv bluegl_glVertexAttrib3sv -#define glGetUniformuiv bluegl_glGetUniformuiv -#define glGetPixelTransformParameterfvEXT bluegl_glGetPixelTransformParameterfvEXT -#define glMultiTexCoord3dv bluegl_glMultiTexCoord3dv -#define glVertexAttrib3fvARB bluegl_glVertexAttrib3fvARB -#define glGetProgramResourceIndex bluegl_glGetProgramResourceIndex -#define glGetMinmaxParameteriv bluegl_glGetMinmaxParameteriv -#define glConvolutionParameterfEXT bluegl_glConvolutionParameterfEXT -#define glProgramUniform4i64NV bluegl_glProgramUniform4i64NV -#define glProgramUniformMatrix4fvEXT bluegl_glProgramUniformMatrix4fvEXT -#define glMultiTexCoordP4ui bluegl_glMultiTexCoordP4ui -#define glEnableVertexAttribAPPLE bluegl_glEnableVertexAttribAPPLE -#define glTexCoordP3uiv bluegl_glTexCoordP3uiv -#define glCoverageModulationNV bluegl_glCoverageModulationNV -#define glMultiTexCoord3ivARB bluegl_glMultiTexCoord3ivARB -#define glListParameterfvSGIX bluegl_glListParameterfvSGIX -#define glNormal3fVertex3fvSUN bluegl_glNormal3fVertex3fvSUN -#define glVertexAttrib4bv bluegl_glVertexAttrib4bv -#define glTexParameterIiv bluegl_glTexParameterIiv -#define glNamedFramebufferParameteri bluegl_glNamedFramebufferParameteri -#define glGetFramebufferParameterivEXT bluegl_glGetFramebufferParameterivEXT -#define glReplacementCodeubSUN bluegl_glReplacementCodeubSUN -#define glTexCoord2bvOES bluegl_glTexCoord2bvOES -#define glGetVideoui64vNV bluegl_glGetVideoui64vNV -#define glTexStorage2DMultisample bluegl_glTexStorage2DMultisample -#define glColorTableParameteriv bluegl_glColorTableParameteriv -#define glConvolutionFilter2DEXT bluegl_glConvolutionFilter2DEXT -#define glSampleMaskEXT bluegl_glSampleMaskEXT -#define glGlobalAlphaFactorusSUN bluegl_glGlobalAlphaFactorusSUN -#define glBindRenderbuffer bluegl_glBindRenderbuffer -#define glVertexAttribI1i bluegl_glVertexAttribI1i -#define glProgramLocalParameterI4uiNV bluegl_glProgramLocalParameterI4uiNV -#define glProgramUniform4ui64ARB bluegl_glProgramUniform4ui64ARB -#define glObjectLabel bluegl_glObjectLabel -#define glGetColorTableParameterivEXT bluegl_glGetColorTableParameterivEXT -#define glGetCombinerOutputParameterivNV bluegl_glGetCombinerOutputParameterivNV -#define glDrawElementsInstancedARB bluegl_glDrawElementsInstancedARB -#define glGetMinmaxParameterfv bluegl_glGetMinmaxParameterfv -#define glMatrixPushEXT bluegl_glMatrixPushEXT -#define glMultiTexParameterIivEXT bluegl_glMultiTexParameterIivEXT -#define glGetPathColorGenfvNV bluegl_glGetPathColorGenfvNV -#define glBindProgramNV bluegl_glBindProgramNV -#define glFramebufferReadBufferEXT bluegl_glFramebufferReadBufferEXT -#define glFogCoordfEXT bluegl_glFogCoordfEXT -#define glVertexArrayNormalOffsetEXT bluegl_glVertexArrayNormalOffsetEXT -#define glReplacementCodeuiTexCoord2fVertex3fvSUN bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN -#define glGetnUniformfv bluegl_glGetnUniformfv -#define glPointParameterfEXT bluegl_glPointParameterfEXT -#define glEndVideoCaptureNV bluegl_glEndVideoCaptureNV -#define glVertexBlendARB bluegl_glVertexBlendARB -#define glVertexAttribL3i64vNV bluegl_glVertexAttribL3i64vNV -#define glSecondaryColor3fEXT bluegl_glSecondaryColor3fEXT -#define glStencilFuncSeparateATI bluegl_glStencilFuncSeparateATI -#define glCompressedMultiTexSubImage2DEXT bluegl_glCompressedMultiTexSubImage2DEXT -#define glTransformPathNV bluegl_glTransformPathNV -#define glIsEnabledi bluegl_glIsEnabledi -#define glExtractComponentEXT bluegl_glExtractComponentEXT -#define glGetFixedvOES bluegl_glGetFixedvOES -#define glDeleteProgramPipelines bluegl_glDeleteProgramPipelines -#define glCopyMultiTexSubImage3DEXT bluegl_glCopyMultiTexSubImage3DEXT -#define glCreateStatesNV bluegl_glCreateStatesNV -#define glSwizzleEXT bluegl_glSwizzleEXT -#define glVertexWeightfvEXT bluegl_glVertexWeightfvEXT -#define glNormalPointerEXT bluegl_glNormalPointerEXT -#define glGetConvolutionFilterEXT bluegl_glGetConvolutionFilterEXT -#define glCurrentPaletteMatrixARB bluegl_glCurrentPaletteMatrixARB -#define glVertexStream4sATI bluegl_glVertexStream4sATI -#define glUniform3ui64ARB bluegl_glUniform3ui64ARB -#define glProgramUniform1uivEXT bluegl_glProgramUniform1uivEXT -#define glVertexAttribs3dvNV bluegl_glVertexAttribs3dvNV -#define glExecuteProgramNV bluegl_glExecuteProgramNV -#define glFrameZoomSGIX bluegl_glFrameZoomSGIX -#define glFragmentMaterialfSGIX bluegl_glFragmentMaterialfSGIX -#define glFramebufferTextureLayerEXT bluegl_glFramebufferTextureLayerEXT -#define glVertexStream1iATI bluegl_glVertexStream1iATI -#define glVertexAttrib3s bluegl_glVertexAttrib3s -#define glFramebufferTextureMultiviewOVR bluegl_glFramebufferTextureMultiviewOVR -#define glElementPointerAPPLE bluegl_glElementPointerAPPLE -#define glWindowPos4ivMESA bluegl_glWindowPos4ivMESA -#define glTexSubImage3D bluegl_glTexSubImage3D -#define glGetFragmentMaterialfvSGIX bluegl_glGetFragmentMaterialfvSGIX -#define glProgramUniform1dEXT bluegl_glProgramUniform1dEXT -#define glGetFragmentLightfvSGIX bluegl_glGetFragmentLightfvSGIX -#define glTexCoord2bOES bluegl_glTexCoord2bOES -#define glVertexAttrib3fv bluegl_glVertexAttrib3fv -#define glMakeNamedBufferNonResidentNV bluegl_glMakeNamedBufferNonResidentNV -#define glIsProgramARB bluegl_glIsProgramARB -#define glScissorArrayv bluegl_glScissorArrayv -#define glMultiDrawElementsIndirect bluegl_glMultiDrawElementsIndirect -#define glGetMultiTexParameterfvEXT bluegl_glGetMultiTexParameterfvEXT -#define glWindowPos2iARB bluegl_glWindowPos2iARB -#define glGetProgramStringNV bluegl_glGetProgramStringNV -#define glTranslatexOES bluegl_glTranslatexOES -#define glMultiTexCoord4d bluegl_glMultiTexCoord4d -#define glColorTableParameterfvSGI bluegl_glColorTableParameterfvSGI -#define glTexCoord3bvOES bluegl_glTexCoord3bvOES -#define glUniform2ui64vARB bluegl_glUniform2ui64vARB -#define glMatrixIndexusvARB bluegl_glMatrixIndexusvARB -#define glGetMultiTexGenfvEXT bluegl_glGetMultiTexGenfvEXT -#define glGenerateTextureMipmapEXT bluegl_glGenerateTextureMipmapEXT -#define glGetMapParameterivNV bluegl_glGetMapParameterivNV -#define glGetConvolutionParameterxvOES bluegl_glGetConvolutionParameterxvOES -#define glVertexAttrib4fvNV bluegl_glVertexAttrib4fvNV -#define glBufferDataARB bluegl_glBufferDataARB -#define glWindowPos4fMESA bluegl_glWindowPos4fMESA -#define glPushDebugGroup bluegl_glPushDebugGroup -#define glProgramUniform2fEXT bluegl_glProgramUniform2fEXT -#define glCopyTexImage1DEXT bluegl_glCopyTexImage1DEXT -#define glCompressedTexSubImage2DARB bluegl_glCompressedTexSubImage2DARB -#define glCopyColorSubTableEXT bluegl_glCopyColorSubTableEXT -#define glTransformFeedbackAttribsNV bluegl_glTransformFeedbackAttribsNV -#define glMatrixFrustumEXT bluegl_glMatrixFrustumEXT -#define glIsBufferARB bluegl_glIsBufferARB -#define glUniform3fvARB bluegl_glUniform3fvARB -#define glMultiTexCoord3dARB bluegl_glMultiTexCoord3dARB -#define glIndexPointerEXT bluegl_glIndexPointerEXT -#define glMatrixLoad3x3fNV bluegl_glMatrixLoad3x3fNV -#define glUnmapNamedBufferEXT bluegl_glUnmapNamedBufferEXT -#define glCreateProgramObjectARB bluegl_glCreateProgramObjectARB +#define glMap1xOES bluegl_glMap1xOES +#define glMap2xOES bluegl_glMap2xOES +#define glMapGrid1xOES bluegl_glMapGrid1xOES #define glMapGrid2xOES bluegl_glMapGrid2xOES -#define glVertexPointerEXT bluegl_glVertexPointerEXT -#define glVertexStream4svATI bluegl_glVertexStream4svATI -#define glMultiTexCoord2hvNV bluegl_glMultiTexCoord2hvNV -#define glLabelObjectEXT bluegl_glLabelObjectEXT -#define glTextureImage3DMultisampleNV bluegl_glTextureImage3DMultisampleNV -#define glMultTransposeMatrixd bluegl_glMultTransposeMatrixd -#define glMultiTexCoord2fARB bluegl_glMultiTexCoord2fARB -#define glMultiTexCoord2dARB bluegl_glMultiTexCoord2dARB -#define glGetCombinerOutputParameterfvNV bluegl_glGetCombinerOutputParameterfvNV -#define glGetBufferPointerv bluegl_glGetBufferPointerv -#define glVertexAttrib1dNV bluegl_glVertexAttrib1dNV -#define glTextureView bluegl_glTextureView -#define glBlitFramebufferEXT bluegl_glBlitFramebufferEXT -#define glVertexWeightPointerEXT bluegl_glVertexWeightPointerEXT -#define glBindTextures bluegl_glBindTextures -#define glClearBufferiv bluegl_glClearBufferiv -#define glMultiTexCoord4ivARB bluegl_glMultiTexCoord4ivARB -#define glGetImageHandleNV bluegl_glGetImageHandleNV -#define glGetDoublei_vEXT bluegl_glGetDoublei_vEXT -#define glProgramUniform1i64NV bluegl_glProgramUniform1i64NV -#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN -#define glWindowPos3s bluegl_glWindowPos3s -#define glUniform4i64ARB bluegl_glUniform4i64ARB -#define glProgramUniform2dvEXT bluegl_glProgramUniform2dvEXT -#define glMultiTexSubImage1DEXT bluegl_glMultiTexSubImage1DEXT -#define glHint bluegl_glHint -#define glProgramUniformMatrix4fv bluegl_glProgramUniformMatrix4fv -#define glTexCoord4bvOES bluegl_glTexCoord4bvOES -#define glGetQueryObjectiv bluegl_glGetQueryObjectiv -#define glGetQueryIndexediv bluegl_glGetQueryIndexediv -#define glTexCoordP4ui bluegl_glTexCoordP4ui -#define glVertexStream2fvATI bluegl_glVertexStream2fvATI -#define glUniform3fv bluegl_glUniform3fv -#define glUniformMatrix2dv bluegl_glUniformMatrix2dv -#define glIsObjectBufferATI bluegl_glIsObjectBufferATI -#define glVertexAttribP2uiv bluegl_glVertexAttribP2uiv -#define glCompileShader bluegl_glCompileShader -#define glMatrixScalefEXT bluegl_glMatrixScalefEXT -#define glBinormal3ivEXT bluegl_glBinormal3ivEXT -#define glGetMapAttribParameterivNV bluegl_glGetMapAttribParameterivNV -#define glGetnPixelMapusvARB bluegl_glGetnPixelMapusvARB -#define glGetPerfMonitorCounterStringAMD bluegl_glGetPerfMonitorCounterStringAMD -#define glIsTextureHandleResidentNV bluegl_glIsTextureHandleResidentNV -#define glWaitSync bluegl_glWaitSync -#define glGenSamplers bluegl_glGenSamplers -#define glCompressedTextureImage3DEXT bluegl_glCompressedTextureImage3DEXT -#define glGetPerfMonitorCounterInfoAMD bluegl_glGetPerfMonitorCounterInfoAMD -#define glUniform2ivARB bluegl_glUniform2ivARB -#define glVertexAttrib2sARB bluegl_glVertexAttrib2sARB -#define glDrawCommandsAddressNV bluegl_glDrawCommandsAddressNV -#define glTexCoord1hNV bluegl_glTexCoord1hNV -#define glGetFirstPerfQueryIdINTEL bluegl_glGetFirstPerfQueryIdINTEL -#define glFramebufferTexture1D bluegl_glFramebufferTexture1D -#define glGetQueryObjecti64v bluegl_glGetQueryObjecti64v -#define glVertexStream1dvATI bluegl_glVertexStream1dvATI -#define glTexCoordPointerListIBM bluegl_glTexCoordPointerListIBM -#define glTexImage1D bluegl_glTexImage1D -#define glWindowPos2fvMESA bluegl_glWindowPos2fvMESA -#define glIsFenceNV bluegl_glIsFenceNV -#define glVariantsvEXT bluegl_glVariantsvEXT -#define glProgramUniform3dEXT bluegl_glProgramUniform3dEXT -#define glUniform2iARB bluegl_glUniform2iARB -#define glPointParameteri bluegl_glPointParameteri -#define glCreateRenderbuffers bluegl_glCreateRenderbuffers -#define glUniform4i bluegl_glUniform4i -#define glDeleteCommandListsNV bluegl_glDeleteCommandListsNV -#define glRequestResidentProgramsNV bluegl_glRequestResidentProgramsNV -#define glTextureSubImage3D bluegl_glTextureSubImage3D -#define glPixelStorex bluegl_glPixelStorex -#define glVertexAttrib4fARB bluegl_glVertexAttrib4fARB -#define glGetVertexAttribIuiv bluegl_glGetVertexAttribIuiv -#define glVertexAttrib1s bluegl_glVertexAttrib1s -#define glProgramUniformMatrix4x3dv bluegl_glProgramUniformMatrix4x3dv -#define glActiveVaryingNV bluegl_glActiveVaryingNV -#define glTangent3sEXT bluegl_glTangent3sEXT -#define glConvolutionParameteriv bluegl_glConvolutionParameteriv -#define glQueryCounter bluegl_glQueryCounter -#define glProgramUniform3d bluegl_glProgramUniform3d -#define glGetUniformi64vARB bluegl_glGetUniformi64vARB -#define glGetnUniformui64vARB bluegl_glGetnUniformui64vARB -#define glNamedProgramLocalParameters4fvEXT bluegl_glNamedProgramLocalParameters4fvEXT -#define glGetShaderSource bluegl_glGetShaderSource -#define glClearDepthdNV bluegl_glClearDepthdNV -#define glSecondaryColorP3ui bluegl_glSecondaryColorP3ui -#define glMinmax bluegl_glMinmax -#define glVariantubvEXT bluegl_glVariantubvEXT -#define glBinormal3sEXT bluegl_glBinormal3sEXT -#define glVertexAttrib4d bluegl_glVertexAttrib4d -#define glEndTransformFeedbackEXT bluegl_glEndTransformFeedbackEXT -#define glTexImage2DMultisample bluegl_glTexImage2DMultisample -#define glLoadMatrixxOES bluegl_glLoadMatrixxOES -#define glGetUniformfv bluegl_glGetUniformfv -#define glStartInstrumentsSGIX bluegl_glStartInstrumentsSGIX -#define glColor4ubVertex3fvSUN bluegl_glColor4ubVertex3fvSUN -#define glMatrixLoadTransposefEXT bluegl_glMatrixLoadTransposefEXT -#define glGetCompressedTexImage bluegl_glGetCompressedTexImage -#define glGetNamedProgramLocalParameterdvEXT bluegl_glGetNamedProgramLocalParameterdvEXT -#define glColorPointerEXT bluegl_glColorPointerEXT -#define glTangent3fEXT bluegl_glTangent3fEXT -#define glWindowPos2dvARB bluegl_glWindowPos2dvARB -#define glGetInvariantIntegervEXT bluegl_glGetInvariantIntegervEXT -#define glProgramUniform3fEXT bluegl_glProgramUniform3fEXT -#define glPixelTexGenSGIX bluegl_glPixelTexGenSGIX -#define glClampColor bluegl_glClampColor -#define glVertexAttribs4hvNV bluegl_glVertexAttribs4hvNV -#define glGetIntegeri_v bluegl_glGetIntegeri_v -#define glDeleteVertexArraysAPPLE bluegl_glDeleteVertexArraysAPPLE -#define glGetAttachedShaders bluegl_glGetAttachedShaders -#define glEndTransformFeedbackNV bluegl_glEndTransformFeedbackNV -#define glGetColorTableParameterfvSGI bluegl_glGetColorTableParameterfvSGI -#define glBindBufferBase bluegl_glBindBufferBase -#define glDeleteSync bluegl_glDeleteSync -#define glGetTransformFeedbackVarying bluegl_glGetTransformFeedbackVarying -#define glVertexAttrib1svARB bluegl_glVertexAttrib1svARB -#define glCopyPathNV bluegl_glCopyPathNV -#define glBindTransformFeedback bluegl_glBindTransformFeedback -#define glVertexAttrib4usv bluegl_glVertexAttrib4usv -#define glCompressedMultiTexImage3DEXT bluegl_glCompressedMultiTexImage3DEXT -#define glMatrixLoadTranspose3x3fNV bluegl_glMatrixLoadTranspose3x3fNV -#define glVertexStream1sATI bluegl_glVertexStream1sATI -#define glMultiDrawArraysIndirectBindlessNV bluegl_glMultiDrawArraysIndirectBindlessNV -#define glTexParameterIuiv bluegl_glTexParameterIuiv -#define glVDPAUFiniNV bluegl_glVDPAUFiniNV -#define glUniform1iv bluegl_glUniform1iv -#define glStencilThenCoverStrokePathNV bluegl_glStencilThenCoverStrokePathNV -#define glUniform3i64vNV bluegl_glUniform3i64vNV -#define glGetFragDataLocationEXT bluegl_glGetFragDataLocationEXT -#define glProgramUniformMatrix4dv bluegl_glProgramUniformMatrix4dv -#define glGetnUniformiv bluegl_glGetnUniformiv -#define glMapBuffer bluegl_glMapBuffer -#define glScissorIndexed bluegl_glScissorIndexed -#define glUniform3fARB bluegl_glUniform3fARB -#define glGetColorTable bluegl_glGetColorTable -#define glFramebufferTextureFaceARB bluegl_glFramebufferTextureFaceARB -#define glBeginTransformFeedbackEXT bluegl_glBeginTransformFeedbackEXT -#define glGenFencesNV bluegl_glGenFencesNV -#define glMultiTexImage2DEXT bluegl_glMultiTexImage2DEXT -#define glVertexAttrib2hNV bluegl_glVertexAttrib2hNV -#define glFragmentLightfvSGIX bluegl_glFragmentLightfvSGIX -#define glProgramUniform2iv bluegl_glProgramUniform2iv -#define glVertexAttribL4d bluegl_glVertexAttribL4d -#define glMapBufferARB bluegl_glMapBufferARB -#define glBindVideoCaptureStreamTextureNV bluegl_glBindVideoCaptureStreamTextureNV -#define glConvolutionParameterxvOES bluegl_glConvolutionParameterxvOES -#define glTexParameterIuivEXT bluegl_glTexParameterIuivEXT -#define glVertexAttribI4ubv bluegl_glVertexAttribI4ubv -#define glTexSubImage1DEXT bluegl_glTexSubImage1DEXT -#define glTextureStorage2DEXT bluegl_glTextureStorage2DEXT -#define glTexSubImage3DEXT bluegl_glTexSubImage3DEXT -#define glVertex2xvOES bluegl_glVertex2xvOES -#define glGetMultiTexImageEXT bluegl_glGetMultiTexImageEXT -#define glNormalStream3ivATI bluegl_glNormalStream3ivATI -#define glGetNamedBufferPointerv bluegl_glGetNamedBufferPointerv -#define glTexBuffer bluegl_glTexBuffer -#define glCombinerInputNV bluegl_glCombinerInputNV -#define glVertexAttrib1dARB bluegl_glVertexAttrib1dARB -#define glVertexP3ui bluegl_glVertexP3ui -#define glMatrixMult3x2fNV bluegl_glMatrixMult3x2fNV -#define glNamedFramebufferTexture2DEXT bluegl_glNamedFramebufferTexture2DEXT -#define glGetTextureLevelParameteriv bluegl_glGetTextureLevelParameteriv -#define glPixelMapx bluegl_glPixelMapx -#define glBlendFuncSeparatei bluegl_glBlendFuncSeparatei -#define glTessellationModeAMD bluegl_glTessellationModeAMD -#define glProgramEnvParametersI4uivNV bluegl_glProgramEnvParametersI4uivNV -#define glGetColorTableParameterfvEXT bluegl_glGetColorTableParameterfvEXT -#define glVertexAttribI1uiEXT bluegl_glVertexAttribI1uiEXT -#define glPrioritizeTexturesEXT bluegl_glPrioritizeTexturesEXT -#define glProgramUniform1i64vNV bluegl_glProgramUniform1i64vNV -#define glGetTextureParameteriv bluegl_glGetTextureParameteriv -#define glGetTransformFeedbackiv bluegl_glGetTransformFeedbackiv -#define glMultiDrawArraysIndirectBindlessCountNV bluegl_glMultiDrawArraysIndirectBindlessCountNV -#define glUseShaderProgramEXT bluegl_glUseShaderProgramEXT -#define glDeleteTransformFeedbacks bluegl_glDeleteTransformFeedbacks -#define glCoverageModulationTableNV bluegl_glCoverageModulationTableNV -#define glMultiTexCoord1d bluegl_glMultiTexCoord1d -#define glGetTexLevelParameteriv bluegl_glGetTexLevelParameteriv -#define glProgramUniform4ui bluegl_glProgramUniform4ui -#define glProgramUniform4iv bluegl_glProgramUniform4iv -#define glTangent3fvEXT bluegl_glTangent3fvEXT -#define glViewportIndexedfv bluegl_glViewportIndexedfv -#define glSampleMaski bluegl_glSampleMaski -#define glProgramUniformMatrix4x3dvEXT bluegl_glProgramUniformMatrix4x3dvEXT -#define glCompileShaderARB bluegl_glCompileShaderARB -#define glUniform4ui64ARB bluegl_glUniform4ui64ARB -#define glTexCoord3xOES bluegl_glTexCoord3xOES -#define glGetInternalformativ bluegl_glGetInternalformativ -#define glObjectPtrLabel bluegl_glObjectPtrLabel -#define glNormal3hvNV bluegl_glNormal3hvNV -#define glProgramUniform1uiv bluegl_glProgramUniform1uiv -#define glGenFragmentShadersATI bluegl_glGenFragmentShadersATI -#define glTexCoord2hvNV bluegl_glTexCoord2hvNV -#define glFinishAsyncSGIX bluegl_glFinishAsyncSGIX -#define glEnableVertexAttribArrayARB bluegl_glEnableVertexAttribArrayARB -#define glDeleteSamplers bluegl_glDeleteSamplers -#define glVertexAttrib1fvARB bluegl_glVertexAttrib1fvARB -#define glGetnUniformivARB bluegl_glGetnUniformivARB -#define glLoadTransposeMatrixd bluegl_glLoadTransposeMatrixd -#define glProgramParameteri bluegl_glProgramParameteri -#define glCreateShader bluegl_glCreateShader -#define glFragmentCoverageColorNV bluegl_glFragmentCoverageColorNV -#define glVertexStream3dvATI bluegl_glVertexStream3dvATI -#define glUniformHandleui64ARB bluegl_glUniformHandleui64ARB -#define glGetVaryingLocationNV bluegl_glGetVaryingLocationNV -#define glCompressedTextureSubImage2DEXT bluegl_glCompressedTextureSubImage2DEXT -#define glTangent3dEXT bluegl_glTangent3dEXT -#define glGetNamedBufferPointervEXT bluegl_glGetNamedBufferPointervEXT -#define glVertex2bvOES bluegl_glVertex2bvOES -#define glProgramBufferParametersIuivNV bluegl_glProgramBufferParametersIuivNV -#define glGetnTexImageARB bluegl_glGetnTexImageARB -#define glSetFenceNV bluegl_glSetFenceNV -#define glPathParameterfvNV bluegl_glPathParameterfvNV -#define glVertexAttribFormat bluegl_glVertexAttribFormat -#define glConservativeRasterParameterfNV bluegl_glConservativeRasterParameterfNV -#define glGetVertexAttribIuivEXT bluegl_glGetVertexAttribIuivEXT -#define glBindMultiTextureEXT bluegl_glBindMultiTextureEXT -#define glMapControlPointsNV bluegl_glMapControlPointsNV -#define glVertexAttrib4Nsv bluegl_glVertexAttrib4Nsv -#define glCompressedMultiTexImage2DEXT bluegl_glCompressedMultiTexImage2DEXT -#define glIsNamedBufferResidentNV bluegl_glIsNamedBufferResidentNV -#define glLoadProgramNV bluegl_glLoadProgramNV -#define glClearColor bluegl_glClearColor -#define glUniform2uivEXT bluegl_glUniform2uivEXT -#define glMultiTexGenfEXT bluegl_glMultiTexGenfEXT -#define glGetUniformdv bluegl_glGetUniformdv -#define glGenRenderbuffersEXT bluegl_glGenRenderbuffersEXT -#define glGetMultisamplefv bluegl_glGetMultisamplefv -#define glMapNamedBuffer bluegl_glMapNamedBuffer -#define glDeleteFramebuffersEXT bluegl_glDeleteFramebuffersEXT -#define glVertexAttribI4usvEXT bluegl_glVertexAttribI4usvEXT -#define glSecondaryColor3hNV bluegl_glSecondaryColor3hNV -#define glGenerateMipmap bluegl_glGenerateMipmap -#define glProgramEnvParameterI4uivNV bluegl_glProgramEnvParameterI4uivNV -#define glSeparableFilter2D bluegl_glSeparableFilter2D -#define glFogCoorddEXT bluegl_glFogCoorddEXT -#define glGetPerfCounterInfoINTEL bluegl_glGetPerfCounterInfoINTEL -#define glUniform4uiv bluegl_glUniform4uiv -#define glVertexAttribL2dv bluegl_glVertexAttribL2dv -#define glUniform1dv bluegl_glUniform1dv -#define glVertexAttribL1ui64ARB bluegl_glVertexAttribL1ui64ARB -#define glEndPerfQueryINTEL bluegl_glEndPerfQueryINTEL -#define glVertexArrayEdgeFlagOffsetEXT bluegl_glVertexArrayEdgeFlagOffsetEXT -#define glVertexAttrib1dv bluegl_glVertexAttrib1dv -#define glProgramUniformMatrix2dvEXT bluegl_glProgramUniformMatrix2dvEXT -#define glDepthRange bluegl_glDepthRange -#define glCombinerParameterfNV bluegl_glCombinerParameterfNV -#define glVariantArrayObjectATI bluegl_glVariantArrayObjectATI -#define glDeleteBuffersARB bluegl_glDeleteBuffersARB -#define glFragmentLightiSGIX bluegl_glFragmentLightiSGIX -#define glGetSamplerParameterIiv bluegl_glGetSamplerParameterIiv -#define glImportSyncEXT bluegl_glImportSyncEXT -#define glGetVertexAttribivARB bluegl_glGetVertexAttribivARB -#define glVertexAttribI2ui bluegl_glVertexAttribI2ui -#define glGetObjectParameterivARB bluegl_glGetObjectParameterivARB -#define glEnableClientStateiEXT bluegl_glEnableClientStateiEXT -#define glGetnUniformi64vARB bluegl_glGetnUniformi64vARB -#define glDeleteFencesAPPLE bluegl_glDeleteFencesAPPLE -#define glTransformFeedbackBufferRange bluegl_glTransformFeedbackBufferRange -#define glProgramUniform2fvEXT bluegl_glProgramUniform2fvEXT -#define glFramebufferTextureLayerARB bluegl_glFramebufferTextureLayerARB -#define glVertexAttribLFormatNV bluegl_glVertexAttribLFormatNV -#define glVertexAttrib2fvARB bluegl_glVertexAttrib2fvARB -#define glWindowPos4fvMESA bluegl_glWindowPos4fvMESA -#define glMakeNamedBufferResidentNV bluegl_glMakeNamedBufferResidentNV -#define glProgramUniformMatrix3x4fvEXT bluegl_glProgramUniformMatrix3x4fvEXT -#define glSamplePatternSGIS bluegl_glSamplePatternSGIS -#define glVDPAUGetSurfaceivNV bluegl_glVDPAUGetSurfaceivNV -#define glProgramUniformMatrix4x2fvEXT bluegl_glProgramUniformMatrix4x2fvEXT -#define glReplacementCodeuiColor3fVertex3fvSUN bluegl_glReplacementCodeuiColor3fVertex3fvSUN -#define glWindowPos3sMESA bluegl_glWindowPos3sMESA -#define glTexGenxOES bluegl_glTexGenxOES -#define glVertexAttrib4dNV bluegl_glVertexAttrib4dNV -#define glTangentPointerEXT bluegl_glTangentPointerEXT -#define glPixelTransformParameterfvEXT bluegl_glPixelTransformParameterfvEXT -#define glProgramUniform1i bluegl_glProgramUniform1i -#define glMultiTexCoord2bOES bluegl_glMultiTexCoord2bOES -#define glVertexAttribI2iv bluegl_glVertexAttribI2iv -#define glWindowPos4iMESA bluegl_glWindowPos4iMESA -#define glTestFenceNV bluegl_glTestFenceNV -#define glDispatchComputeGroupSizeARB bluegl_glDispatchComputeGroupSizeARB -#define glShaderOp3EXT bluegl_glShaderOp3EXT -#define glSampleMaskSGIS bluegl_glSampleMaskSGIS -#define glMultiTexParameterivEXT bluegl_glMultiTexParameterivEXT -#define glGetnMinmax bluegl_glGetnMinmax -#define glColorP3ui bluegl_glColorP3ui -#define glBeginQueryARB bluegl_glBeginQueryARB -#define glMultiDrawArraysIndirectAMD bluegl_glMultiDrawArraysIndirectAMD -#define glRasterPos4xOES bluegl_glRasterPos4xOES -#define glFogCoordPointer bluegl_glFogCoordPointer -#define glTextureLightEXT bluegl_glTextureLightEXT -#define glGetCombinerInputParameterfvNV bluegl_glGetCombinerInputParameterfvNV -#define glDeleteFragmentShaderATI bluegl_glDeleteFragmentShaderATI -#define glMultiTexCoord2sv bluegl_glMultiTexCoord2sv -#define glMultiTexCoord2s bluegl_glMultiTexCoord2s -#define glLightModelxvOES bluegl_glLightModelxvOES -#define glTessellationFactorAMD bluegl_glTessellationFactorAMD -#define glVariantivEXT bluegl_glVariantivEXT -#define glNamedFramebufferRenderbuffer bluegl_glNamedFramebufferRenderbuffer -#define glWindowPos2ivARB bluegl_glWindowPos2ivARB -#define glVertexArrayFogCoordOffsetEXT bluegl_glVertexArrayFogCoordOffsetEXT -#define glUniform2i bluegl_glUniform2i -#define glGetTexBumpParameterivATI bluegl_glGetTexBumpParameterivATI -#define glSamplerParameterIuiv bluegl_glSamplerParameterIuiv -#define glClearBufferfv bluegl_glClearBufferfv -#define glBindTextureUnitParameterEXT bluegl_glBindTextureUnitParameterEXT -#define glMultiTexCoord3hNV bluegl_glMultiTexCoord3hNV -#define glSecondaryColor3us bluegl_glSecondaryColor3us -#define glReplacementCodeusvSUN bluegl_glReplacementCodeusvSUN -#define glSecondaryColor3bvEXT bluegl_glSecondaryColor3bvEXT -#define glGetProgramPipelineInfoLog bluegl_glGetProgramPipelineInfoLog -#define glGetVideoi64vNV bluegl_glGetVideoi64vNV -#define glMultiTexCoord3iv bluegl_glMultiTexCoord3iv -#define glVertexArrayTexCoordOffsetEXT bluegl_glVertexArrayTexCoordOffsetEXT -#define glNamedRenderbufferStorageMultisampleCoverageEXT bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT -#define glGetSamplerParameterIuiv bluegl_glGetSamplerParameterIuiv -#define glVertexAttrib2dARB bluegl_glVertexAttrib2dARB -#define glNormalStream3svATI bluegl_glNormalStream3svATI -#define glClientActiveVertexStreamATI bluegl_glClientActiveVertexStreamATI -#define glStencilThenCoverFillPathInstancedNV bluegl_glStencilThenCoverFillPathInstancedNV -#define glSecondaryColor3uiEXT bluegl_glSecondaryColor3uiEXT -#define glTexCoord2hNV bluegl_glTexCoord2hNV -#define glVertexAttrib3fARB bluegl_glVertexAttrib3fARB -#define glGetQueryBufferObjectui64v bluegl_glGetQueryBufferObjectui64v -#define glGetMaterialxOES bluegl_glGetMaterialxOES -#define glMultiDrawArrays bluegl_glMultiDrawArrays -#define glSecondaryColor3iEXT bluegl_glSecondaryColor3iEXT -#define glProgramUniform2ui64NV bluegl_glProgramUniform2ui64NV -#define glDeleteQueries bluegl_glDeleteQueries -#define glDeleteRenderbuffers bluegl_glDeleteRenderbuffers -#define glGetProgramLocalParameterdvARB bluegl_glGetProgramLocalParameterdvARB -#define glTexCoord2xOES bluegl_glTexCoord2xOES -#define glBindBuffer bluegl_glBindBuffer -#define glResumeTransformFeedback bluegl_glResumeTransformFeedback -#define glFlushPixelDataRangeNV bluegl_glFlushPixelDataRangeNV -#define glSecondaryColorPointer bluegl_glSecondaryColorPointer -#define glVideoCaptureStreamParameterdvNV bluegl_glVideoCaptureStreamParameterdvNV -#define glTextureSubImage2DEXT bluegl_glTextureSubImage2DEXT -#define glDeletePathsNV bluegl_glDeletePathsNV -#define glGetFloatv bluegl_glGetFloatv -#define glVertexAttribI3uivEXT bluegl_glVertexAttribI3uivEXT -#define glGetVertexAttribdvARB bluegl_glGetVertexAttribdvARB -#define glUniform4ui64NV bluegl_glUniform4ui64NV -#define glGetTextureLevelParameterfv bluegl_glGetTextureLevelParameterfv -#define glWindowPos2i bluegl_glWindowPos2i -#define glReplacementCodeuiColor4ubVertex3fSUN bluegl_glReplacementCodeuiColor4ubVertex3fSUN -#define glCompressedMultiTexSubImage3DEXT bluegl_glCompressedMultiTexSubImage3DEXT -#define glGetTexParameterIivEXT bluegl_glGetTexParameterIivEXT -#define glDebugMessageCallbackARB bluegl_glDebugMessageCallbackARB -#define glWeightPointerARB bluegl_glWeightPointerARB -#define glFogxOES bluegl_glFogxOES -#define glProgramUniformMatrix2x4fvEXT bluegl_glProgramUniformMatrix2x4fvEXT -#define glVertexAttrib4iv bluegl_glVertexAttrib4iv -#define glProgramLocalParameterI4iNV bluegl_glProgramLocalParameterI4iNV -#define glGetnColorTableARB bluegl_glGetnColorTableARB -#define glClearNamedBufferData bluegl_glClearNamedBufferData -#define glColorMaskIndexedEXT bluegl_glColorMaskIndexedEXT -#define glVertexAttribLPointer bluegl_glVertexAttribLPointer -#define glProgramUniform3i64vNV bluegl_glProgramUniform3i64vNV -#define glScissor bluegl_glScissor -#define glSecondaryColor3fv bluegl_glSecondaryColor3fv -#define glCombinerParameterivNV bluegl_glCombinerParameterivNV -#define glGetTexLevelParameterfv bluegl_glGetTexLevelParameterfv -#define glDrawElementArrayATI bluegl_glDrawElementArrayATI -#define glVertexAttrib4Nusv bluegl_glVertexAttrib4Nusv -#define glWindowPos3dvMESA bluegl_glWindowPos3dvMESA -#define glMakeImageHandleResidentARB bluegl_glMakeImageHandleResidentARB -#define glWindowPos3svMESA bluegl_glWindowPos3svMESA -#define glGetMultiTexLevelParameterfvEXT bluegl_glGetMultiTexLevelParameterfvEXT -#define glRasterPos3xOES bluegl_glRasterPos3xOES -#define glBinormal3iEXT bluegl_glBinormal3iEXT -#define glVertexAttribP3uiv bluegl_glVertexAttribP3uiv -#define glProgramUniformMatrix2x3dv bluegl_glProgramUniformMatrix2x3dv -#define glEndConditionalRender bluegl_glEndConditionalRender -#define glBindParameterEXT bluegl_glBindParameterEXT -#define glCompileShaderIncludeARB bluegl_glCompileShaderIncludeARB -#define glTexStorageSparseAMD bluegl_glTexStorageSparseAMD -#define glCreateShaderProgramEXT bluegl_glCreateShaderProgramEXT -#define glUniformMatrix3x2fv bluegl_glUniformMatrix3x2fv -#define glPrimitiveRestartIndex bluegl_glPrimitiveRestartIndex -#define glCreateProgram bluegl_glCreateProgram -#define glMultiTexCoord3d bluegl_glMultiTexCoord3d -#define glGetFenceivNV bluegl_glGetFenceivNV -#define glUniform4dv bluegl_glUniform4dv -#define glUniform3i64ARB bluegl_glUniform3i64ARB -#define glTexturePageCommitmentEXT bluegl_glTexturePageCommitmentEXT -#define glColor4hNV bluegl_glColor4hNV -#define glVertexStream2fATI bluegl_glVertexStream2fATI -#define glDisable bluegl_glDisable -#define glFramebufferRenderbuffer bluegl_glFramebufferRenderbuffer -#define glIsRenderbufferEXT bluegl_glIsRenderbufferEXT -#define glGetMultiTexParameterIivEXT bluegl_glGetMultiTexParameterIivEXT -#define glVertexAttrib2fvNV bluegl_glVertexAttrib2fvNV -#define glReferencePlaneSGIX bluegl_glReferencePlaneSGIX -#define glUniform4fARB bluegl_glUniform4fARB -#define glClearBufferfi bluegl_glClearBufferfi -#define glBindFragDataLocation bluegl_glBindFragDataLocation -#define glGetIntegerv bluegl_glGetIntegerv -#define glGetObjectLabel bluegl_glGetObjectLabel -#define glBufferPageCommitmentARB bluegl_glBufferPageCommitmentARB -#define glBlendFuncIndexedAMD bluegl_glBlendFuncIndexedAMD -#define glGetQueryObjectui64vEXT bluegl_glGetQueryObjectui64vEXT -#define glReplacementCodeuiTexCoord2fVertex3fSUN bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN -#define glBlitFramebuffer bluegl_glBlitFramebuffer -#define glMultiTexCoord2f bluegl_glMultiTexCoord2f -#define glNamedFramebufferRenderbufferEXT bluegl_glNamedFramebufferRenderbufferEXT -#define glUseProgramStages bluegl_glUseProgramStages -#define glGetNamedStringivARB bluegl_glGetNamedStringivARB -#define glMultiTexCoord1iARB bluegl_glMultiTexCoord1iARB -#define glMultiTexCoord4xvOES bluegl_glMultiTexCoord4xvOES -#define glMakeImageHandleResidentNV bluegl_glMakeImageHandleResidentNV -#define glVertexAttrib1fvNV bluegl_glVertexAttrib1fvNV -#define glViewportIndexedf bluegl_glViewportIndexedf -#define glTexStorage3DMultisample bluegl_glTexStorage3DMultisample -#define glCreateShaderObjectARB bluegl_glCreateShaderObjectARB -#define glListDrawCommandsStatesClientNV bluegl_glListDrawCommandsStatesClientNV -#define glUniform1d bluegl_glUniform1d -#define glGetDebugMessageLogARB bluegl_glGetDebugMessageLogARB -#define glBlendParameteriNV bluegl_glBlendParameteriNV -#define glMultiTexCoord4sv bluegl_glMultiTexCoord4sv -#define glUniform1uiEXT bluegl_glUniform1uiEXT -#define glDebugMessageInsertAMD bluegl_glDebugMessageInsertAMD -#define glMultiDrawArraysIndirect bluegl_glMultiDrawArraysIndirect -#define glProgramUniform1d bluegl_glProgramUniform1d -#define glGetListParameterivSGIX bluegl_glGetListParameterivSGIX -#define glPointParameterfv bluegl_glPointParameterfv -#define glCopyBufferSubData bluegl_glCopyBufferSubData -#define glBindProgramARB bluegl_glBindProgramARB -#define glCombinerStageParameterfvNV bluegl_glCombinerStageParameterfvNV -#define glEndConditionalRenderNV bluegl_glEndConditionalRenderNV -#define glVertexAttribL3dEXT bluegl_glVertexAttribL3dEXT -#define glWindowPos3iv bluegl_glWindowPos3iv -#define glGetFogFuncSGIS bluegl_glGetFogFuncSGIS -#define glCompressedTexImage2D bluegl_glCompressedTexImage2D -#define glPixelTexGenParameteriSGIS bluegl_glPixelTexGenParameteriSGIS -#define glDebugMessageControlARB bluegl_glDebugMessageControlARB -#define glMapBufferRange bluegl_glMapBufferRange -#define glProgramUniform1fvEXT bluegl_glProgramUniform1fvEXT -#define glNamedRenderbufferStorageEXT bluegl_glNamedRenderbufferStorageEXT -#define glProgramUniformMatrix4x2fv bluegl_glProgramUniformMatrix4x2fv -#define glNamedProgramLocalParameterI4iEXT bluegl_glNamedProgramLocalParameterI4iEXT -#define glClearDepth bluegl_glClearDepth -#define glVertexAttribs1dvNV bluegl_glVertexAttribs1dvNV -#define glWindowPos3f bluegl_glWindowPos3f -#define glProvokingVertex bluegl_glProvokingVertex -#define glIsNamedStringARB bluegl_glIsNamedStringARB -#define glNamedBufferData bluegl_glNamedBufferData -#define glFragmentLightfSGIX bluegl_glFragmentLightfSGIX -#define glProgramUniform4uiv bluegl_glProgramUniform4uiv -#define glPointParameteriNV bluegl_glPointParameteriNV -#define glNamedFramebufferReadBuffer bluegl_glNamedFramebufferReadBuffer -#define glPatchParameterfv bluegl_glPatchParameterfv -#define glVertexArrayBindingDivisor bluegl_glVertexArrayBindingDivisor +#define glMultTransposeMatrixxOES bluegl_glMultTransposeMatrixxOES +#define glMultiTexCoord1xOES bluegl_glMultiTexCoord1xOES +#define glMultiTexCoord1xvOES bluegl_glMultiTexCoord1xvOES +#define glMultiTexCoord2xOES bluegl_glMultiTexCoord2xOES +#define glMultiTexCoord2xvOES bluegl_glMultiTexCoord2xvOES +#define glMultiTexCoord3xOES bluegl_glMultiTexCoord3xOES +#define glMultiTexCoord3xvOES bluegl_glMultiTexCoord3xvOES +#define glMultiTexCoord4xvOES bluegl_glMultiTexCoord4xvOES +#define glNormal3xvOES bluegl_glNormal3xvOES +#define glPassThroughxOES bluegl_glPassThroughxOES +#define glPixelMapx bluegl_glPixelMapx +#define glPixelStorex bluegl_glPixelStorex +#define glPixelTransferxOES bluegl_glPixelTransferxOES +#define glPixelZoomxOES bluegl_glPixelZoomxOES +#define glPrioritizeTexturesxOES bluegl_glPrioritizeTexturesxOES +#define glRasterPos2xOES bluegl_glRasterPos2xOES +#define glRasterPos2xvOES bluegl_glRasterPos2xvOES +#define glRasterPos3xOES bluegl_glRasterPos3xOES +#define glRasterPos3xvOES bluegl_glRasterPos3xvOES +#define glRasterPos4xOES bluegl_glRasterPos4xOES +#define glRasterPos4xvOES bluegl_glRasterPos4xvOES +#define glRectxOES bluegl_glRectxOES +#define glRectxvOES bluegl_glRectxvOES +#define glTexCoord1xOES bluegl_glTexCoord1xOES +#define glTexCoord1xvOES bluegl_glTexCoord1xvOES +#define glTexCoord2xOES bluegl_glTexCoord2xOES +#define glTexCoord2xvOES bluegl_glTexCoord2xvOES +#define glTexCoord3xOES bluegl_glTexCoord3xOES +#define glTexCoord3xvOES bluegl_glTexCoord3xvOES +#define glTexCoord4xOES bluegl_glTexCoord4xOES +#define glTexCoord4xvOES bluegl_glTexCoord4xvOES +#define glTexGenxOES bluegl_glTexGenxOES +#define glTexGenxvOES bluegl_glTexGenxvOES +#define glVertex2xOES bluegl_glVertex2xOES +#define glVertex2xvOES bluegl_glVertex2xvOES +#define glVertex3xOES bluegl_glVertex3xOES +#define glVertex3xvOES bluegl_glVertex3xvOES +#define glVertex4xOES bluegl_glVertex4xOES +#define glVertex4xvOES bluegl_glVertex4xvOES +#define glQueryMatrixxOES bluegl_glQueryMatrixxOES +#define glClearDepthfOES bluegl_glClearDepthfOES +#define glClipPlanefOES bluegl_glClipPlanefOES +#define glDepthRangefOES bluegl_glDepthRangefOES +#define glFrustumfOES bluegl_glFrustumfOES +#define glGetClipPlanefOES bluegl_glGetClipPlanefOES +#define glOrthofOES bluegl_glOrthofOES +#define glTbufferMask3DFX bluegl_glTbufferMask3DFX #define glDebugMessageEnableAMD bluegl_glDebugMessageEnableAMD -#define glGetVertexArrayIndexediv bluegl_glGetVertexArrayIndexediv -#define glGetVideoCaptureStreamdvNV bluegl_glGetVideoCaptureStreamdvNV -#define glAlphaFragmentOp2ATI bluegl_glAlphaFragmentOp2ATI -#define glVertex2hNV bluegl_glVertex2hNV -#define glCombinerParameteriNV bluegl_glCombinerParameteriNV -#define glGetNamedFramebufferAttachmentParameterivEXT bluegl_glGetNamedFramebufferAttachmentParameterivEXT -#define glIsVariantEnabledEXT bluegl_glIsVariantEnabledEXT -#define glGetVertexAttribfvNV bluegl_glGetVertexAttribfvNV -#define glGetProgramPipelineiv bluegl_glGetProgramPipelineiv -#define glUnmapBufferARB bluegl_glUnmapBufferARB -#define glVertexAttribPointerNV bluegl_glVertexAttribPointerNV -#define glGetPathSpacingNV bluegl_glGetPathSpacingNV -#define glMaterialxOES bluegl_glMaterialxOES -#define glVertexStream3fvATI bluegl_glVertexStream3fvATI -#define glVertexStream4dATI bluegl_glVertexStream4dATI -#define glVertexAttrib2d bluegl_glVertexAttrib2d -#define glStencilMaskSeparate bluegl_glStencilMaskSeparate +#define glDebugMessageInsertAMD bluegl_glDebugMessageInsertAMD +#define glDebugMessageCallbackAMD bluegl_glDebugMessageCallbackAMD +#define glGetDebugMessageLogAMD bluegl_glGetDebugMessageLogAMD +#define glBlendFuncIndexedAMD bluegl_glBlendFuncIndexedAMD +#define glBlendFuncSeparateIndexedAMD bluegl_glBlendFuncSeparateIndexedAMD +#define glBlendEquationIndexedAMD bluegl_glBlendEquationIndexedAMD +#define glBlendEquationSeparateIndexedAMD bluegl_glBlendEquationSeparateIndexedAMD +#define glUniform1i64NV bluegl_glUniform1i64NV +#define glUniform2i64NV bluegl_glUniform2i64NV +#define glUniform3i64NV bluegl_glUniform3i64NV +#define glUniform4i64NV bluegl_glUniform4i64NV +#define glUniform1i64vNV bluegl_glUniform1i64vNV +#define glUniform2i64vNV bluegl_glUniform2i64vNV +#define glUniform3i64vNV bluegl_glUniform3i64vNV +#define glUniform4i64vNV bluegl_glUniform4i64vNV +#define glUniform1ui64NV bluegl_glUniform1ui64NV +#define glUniform2ui64NV bluegl_glUniform2ui64NV +#define glUniform3ui64NV bluegl_glUniform3ui64NV +#define glUniform4ui64NV bluegl_glUniform4ui64NV +#define glUniform1ui64vNV bluegl_glUniform1ui64vNV +#define glUniform2ui64vNV bluegl_glUniform2ui64vNV +#define glUniform3ui64vNV bluegl_glUniform3ui64vNV +#define glUniform4ui64vNV bluegl_glUniform4ui64vNV +#define glGetUniformi64vNV bluegl_glGetUniformi64vNV +#define glGetUniformui64vNV bluegl_glGetUniformui64vNV +#define glProgramUniform1i64NV bluegl_glProgramUniform1i64NV +#define glProgramUniform2i64NV bluegl_glProgramUniform2i64NV +#define glProgramUniform3i64NV bluegl_glProgramUniform3i64NV +#define glProgramUniform4i64NV bluegl_glProgramUniform4i64NV +#define glProgramUniform1i64vNV bluegl_glProgramUniform1i64vNV +#define glProgramUniform2i64vNV bluegl_glProgramUniform2i64vNV +#define glProgramUniform3i64vNV bluegl_glProgramUniform3i64vNV +#define glProgramUniform4i64vNV bluegl_glProgramUniform4i64vNV +#define glProgramUniform1ui64NV bluegl_glProgramUniform1ui64NV +#define glProgramUniform2ui64NV bluegl_glProgramUniform2ui64NV +#define glProgramUniform3ui64NV bluegl_glProgramUniform3ui64NV +#define glProgramUniform4ui64NV bluegl_glProgramUniform4ui64NV +#define glProgramUniform1ui64vNV bluegl_glProgramUniform1ui64vNV +#define glProgramUniform2ui64vNV bluegl_glProgramUniform2ui64vNV +#define glProgramUniform3ui64vNV bluegl_glProgramUniform3ui64vNV +#define glProgramUniform4ui64vNV bluegl_glProgramUniform4ui64vNV +#define glVertexAttribParameteriAMD bluegl_glVertexAttribParameteriAMD +#define glMultiDrawArraysIndirectAMD bluegl_glMultiDrawArraysIndirectAMD +#define glMultiDrawElementsIndirectAMD bluegl_glMultiDrawElementsIndirectAMD +#define glGenNamesAMD bluegl_glGenNamesAMD +#define glDeleteNamesAMD bluegl_glDeleteNamesAMD +#define glIsNameAMD bluegl_glIsNameAMD +#define glQueryObjectParameteruiAMD bluegl_glQueryObjectParameteruiAMD +#define glGetPerfMonitorGroupsAMD bluegl_glGetPerfMonitorGroupsAMD +#define glGetPerfMonitorCountersAMD bluegl_glGetPerfMonitorCountersAMD +#define glGetPerfMonitorGroupStringAMD bluegl_glGetPerfMonitorGroupStringAMD +#define glGetPerfMonitorCounterStringAMD bluegl_glGetPerfMonitorCounterStringAMD +#define glGetPerfMonitorCounterInfoAMD bluegl_glGetPerfMonitorCounterInfoAMD +#define glGenPerfMonitorsAMD bluegl_glGenPerfMonitorsAMD +#define glDeletePerfMonitorsAMD bluegl_glDeletePerfMonitorsAMD +#define glSelectPerfMonitorCountersAMD bluegl_glSelectPerfMonitorCountersAMD +#define glBeginPerfMonitorAMD bluegl_glBeginPerfMonitorAMD +#define glEndPerfMonitorAMD bluegl_glEndPerfMonitorAMD +#define glGetPerfMonitorCounterDataAMD bluegl_glGetPerfMonitorCounterDataAMD +#define glSetMultisamplefvAMD bluegl_glSetMultisamplefvAMD +#define glTexStorageSparseAMD bluegl_glTexStorageSparseAMD +#define glTextureStorageSparseAMD bluegl_glTextureStorageSparseAMD +#define glStencilOpValueAMD bluegl_glStencilOpValueAMD +#define glTessellationFactorAMD bluegl_glTessellationFactorAMD +#define glTessellationModeAMD bluegl_glTessellationModeAMD +#define glElementPointerAPPLE bluegl_glElementPointerAPPLE +#define glDrawElementArrayAPPLE bluegl_glDrawElementArrayAPPLE +#define glDrawRangeElementArrayAPPLE bluegl_glDrawRangeElementArrayAPPLE +#define glMultiDrawElementArrayAPPLE bluegl_glMultiDrawElementArrayAPPLE +#define glMultiDrawRangeElementArrayAPPLE bluegl_glMultiDrawRangeElementArrayAPPLE +#define glGenFencesAPPLE bluegl_glGenFencesAPPLE +#define glDeleteFencesAPPLE bluegl_glDeleteFencesAPPLE +#define glSetFenceAPPLE bluegl_glSetFenceAPPLE +#define glIsFenceAPPLE bluegl_glIsFenceAPPLE #define glTestFenceAPPLE bluegl_glTestFenceAPPLE -#define glBindMaterialParameterEXT bluegl_glBindMaterialParameterEXT -#define glBlendEquationEXT bluegl_glBlendEquationEXT -#define glMultiTexCoord4hNV bluegl_glMultiTexCoord4hNV -#define glMultiTexCoord1fARB bluegl_glMultiTexCoord1fARB -#define glPrioritizeTexturesxOES bluegl_glPrioritizeTexturesxOES -#define glVertexAttribs1fvNV bluegl_glVertexAttribs1fvNV -#define glGetInternalformati64v bluegl_glGetInternalformati64v +#define glFinishFenceAPPLE bluegl_glFinishFenceAPPLE +#define glTestObjectAPPLE bluegl_glTestObjectAPPLE +#define glFinishObjectAPPLE bluegl_glFinishObjectAPPLE +#define glBufferParameteriAPPLE bluegl_glBufferParameteriAPPLE +#define glFlushMappedBufferRangeAPPLE bluegl_glFlushMappedBufferRangeAPPLE +#define glObjectPurgeableAPPLE bluegl_glObjectPurgeableAPPLE +#define glObjectUnpurgeableAPPLE bluegl_glObjectUnpurgeableAPPLE +#define glGetObjectParameterivAPPLE bluegl_glGetObjectParameterivAPPLE +#define glTextureRangeAPPLE bluegl_glTextureRangeAPPLE +#define glGetTexParameterPointervAPPLE bluegl_glGetTexParameterPointervAPPLE +#define glBindVertexArrayAPPLE bluegl_glBindVertexArrayAPPLE +#define glDeleteVertexArraysAPPLE bluegl_glDeleteVertexArraysAPPLE +#define glGenVertexArraysAPPLE bluegl_glGenVertexArraysAPPLE +#define glIsVertexArrayAPPLE bluegl_glIsVertexArrayAPPLE +#define glVertexArrayRangeAPPLE bluegl_glVertexArrayRangeAPPLE +#define glFlushVertexArrayRangeAPPLE bluegl_glFlushVertexArrayRangeAPPLE +#define glVertexArrayParameteriAPPLE bluegl_glVertexArrayParameteriAPPLE +#define glEnableVertexAttribAPPLE bluegl_glEnableVertexAttribAPPLE #define glDisableVertexAttribAPPLE bluegl_glDisableVertexAttribAPPLE +#define glIsVertexAttribEnabledAPPLE bluegl_glIsVertexAttribEnabledAPPLE +#define glMapVertexAttrib1dAPPLE bluegl_glMapVertexAttrib1dAPPLE +#define glMapVertexAttrib1fAPPLE bluegl_glMapVertexAttrib1fAPPLE +#define glMapVertexAttrib2dAPPLE bluegl_glMapVertexAttrib2dAPPLE +#define glMapVertexAttrib2fAPPLE bluegl_glMapVertexAttrib2fAPPLE +#define glDrawBuffersATI bluegl_glDrawBuffersATI +#define glElementPointerATI bluegl_glElementPointerATI +#define glDrawElementArrayATI bluegl_glDrawElementArrayATI +#define glDrawRangeElementArrayATI bluegl_glDrawRangeElementArrayATI +#define glTexBumpParameterivATI bluegl_glTexBumpParameterivATI +#define glTexBumpParameterfvATI bluegl_glTexBumpParameterfvATI +#define glGetTexBumpParameterivATI bluegl_glGetTexBumpParameterivATI +#define glGetTexBumpParameterfvATI bluegl_glGetTexBumpParameterfvATI +#define glGenFragmentShadersATI bluegl_glGenFragmentShadersATI +#define glBindFragmentShaderATI bluegl_glBindFragmentShaderATI +#define glDeleteFragmentShaderATI bluegl_glDeleteFragmentShaderATI +#define glBeginFragmentShaderATI bluegl_glBeginFragmentShaderATI +#define glEndFragmentShaderATI bluegl_glEndFragmentShaderATI +#define glPassTexCoordATI bluegl_glPassTexCoordATI +#define glSampleMapATI bluegl_glSampleMapATI +#define glColorFragmentOp1ATI bluegl_glColorFragmentOp1ATI +#define glColorFragmentOp2ATI bluegl_glColorFragmentOp2ATI +#define glColorFragmentOp3ATI bluegl_glColorFragmentOp3ATI +#define glAlphaFragmentOp1ATI bluegl_glAlphaFragmentOp1ATI +#define glAlphaFragmentOp2ATI bluegl_glAlphaFragmentOp2ATI +#define glAlphaFragmentOp3ATI bluegl_glAlphaFragmentOp3ATI +#define glSetFragmentShaderConstantATI bluegl_glSetFragmentShaderConstantATI +#define glMapObjectBufferATI bluegl_glMapObjectBufferATI +#define glUnmapObjectBufferATI bluegl_glUnmapObjectBufferATI +#define glPNTrianglesiATI bluegl_glPNTrianglesiATI +#define glPNTrianglesfATI bluegl_glPNTrianglesfATI +#define glStencilOpSeparateATI bluegl_glStencilOpSeparateATI +#define glStencilFuncSeparateATI bluegl_glStencilFuncSeparateATI +#define glNewObjectBufferATI bluegl_glNewObjectBufferATI +#define glIsObjectBufferATI bluegl_glIsObjectBufferATI +#define glUpdateObjectBufferATI bluegl_glUpdateObjectBufferATI +#define glGetObjectBufferfvATI bluegl_glGetObjectBufferfvATI +#define glGetObjectBufferivATI bluegl_glGetObjectBufferivATI +#define glFreeObjectBufferATI bluegl_glFreeObjectBufferATI +#define glArrayObjectATI bluegl_glArrayObjectATI +#define glGetArrayObjectfvATI bluegl_glGetArrayObjectfvATI +#define glGetArrayObjectivATI bluegl_glGetArrayObjectivATI +#define glVariantArrayObjectATI bluegl_glVariantArrayObjectATI +#define glGetVariantArrayObjectfvATI bluegl_glGetVariantArrayObjectfvATI +#define glGetVariantArrayObjectivATI bluegl_glGetVariantArrayObjectivATI +#define glVertexAttribArrayObjectATI bluegl_glVertexAttribArrayObjectATI +#define glGetVertexAttribArrayObjectfvATI bluegl_glGetVertexAttribArrayObjectfvATI +#define glGetVertexAttribArrayObjectivATI bluegl_glGetVertexAttribArrayObjectivATI +#define glVertexStream1sATI bluegl_glVertexStream1sATI +#define glVertexStream1svATI bluegl_glVertexStream1svATI +#define glVertexStream1iATI bluegl_glVertexStream1iATI +#define glVertexStream1ivATI bluegl_glVertexStream1ivATI +#define glVertexStream1fATI bluegl_glVertexStream1fATI +#define glVertexStream1fvATI bluegl_glVertexStream1fvATI +#define glVertexStream1dATI bluegl_glVertexStream1dATI +#define glVertexStream1dvATI bluegl_glVertexStream1dvATI +#define glVertexStream2sATI bluegl_glVertexStream2sATI +#define glVertexStream2svATI bluegl_glVertexStream2svATI +#define glVertexStream2iATI bluegl_glVertexStream2iATI +#define glVertexStream2ivATI bluegl_glVertexStream2ivATI +#define glVertexStream2fATI bluegl_glVertexStream2fATI +#define glVertexStream2fvATI bluegl_glVertexStream2fvATI +#define glVertexStream2dATI bluegl_glVertexStream2dATI +#define glVertexStream2dvATI bluegl_glVertexStream2dvATI #define glVertexStream3sATI bluegl_glVertexStream3sATI -#define glCheckFramebufferStatusEXT bluegl_glCheckFramebufferStatusEXT -#define glGetMinmax bluegl_glGetMinmax -#define glCopyTexSubImage3DEXT bluegl_glCopyTexSubImage3DEXT -#define glUniform1ivARB bluegl_glUniform1ivARB -#define glColorP4uiv bluegl_glColorP4uiv -#define glDisableVertexAttribArrayARB bluegl_glDisableVertexAttribArrayARB -#define glNamedProgramLocalParameter4fvEXT bluegl_glNamedProgramLocalParameter4fvEXT +#define glVertexStream3svATI bluegl_glVertexStream3svATI +#define glVertexStream3iATI bluegl_glVertexStream3iATI +#define glVertexStream3ivATI bluegl_glVertexStream3ivATI +#define glVertexStream3fATI bluegl_glVertexStream3fATI +#define glVertexStream3fvATI bluegl_glVertexStream3fvATI +#define glVertexStream3dATI bluegl_glVertexStream3dATI +#define glVertexStream3dvATI bluegl_glVertexStream3dvATI +#define glVertexStream4sATI bluegl_glVertexStream4sATI +#define glVertexStream4svATI bluegl_glVertexStream4svATI +#define glVertexStream4iATI bluegl_glVertexStream4iATI +#define glVertexStream4ivATI bluegl_glVertexStream4ivATI +#define glVertexStream4fATI bluegl_glVertexStream4fATI +#define glVertexStream4fvATI bluegl_glVertexStream4fvATI +#define glVertexStream4dATI bluegl_glVertexStream4dATI +#define glVertexStream4dvATI bluegl_glVertexStream4dvATI +#define glNormalStream3bATI bluegl_glNormalStream3bATI +#define glNormalStream3bvATI bluegl_glNormalStream3bvATI +#define glNormalStream3sATI bluegl_glNormalStream3sATI +#define glNormalStream3svATI bluegl_glNormalStream3svATI +#define glNormalStream3iATI bluegl_glNormalStream3iATI +#define glNormalStream3ivATI bluegl_glNormalStream3ivATI +#define glNormalStream3fATI bluegl_glNormalStream3fATI +#define glNormalStream3fvATI bluegl_glNormalStream3fvATI +#define glNormalStream3dATI bluegl_glNormalStream3dATI +#define glNormalStream3dvATI bluegl_glNormalStream3dvATI +#define glClientActiveVertexStreamATI bluegl_glClientActiveVertexStreamATI +#define glVertexBlendEnviATI bluegl_glVertexBlendEnviATI +#define glVertexBlendEnvfATI bluegl_glVertexBlendEnvfATI +#define glUniformBufferEXT bluegl_glUniformBufferEXT +#define glGetUniformBufferSizeEXT bluegl_glGetUniformBufferSizeEXT +#define glGetUniformOffsetEXT bluegl_glGetUniformOffsetEXT +#define glBlendColorEXT bluegl_glBlendColorEXT +#define glBlendEquationSeparateEXT bluegl_glBlendEquationSeparateEXT #define glBlendFuncSeparateEXT bluegl_glBlendFuncSeparateEXT -#define glVertexAttribL3i64NV bluegl_glVertexAttribL3i64NV -#define glBindProgramPipeline bluegl_glBindProgramPipeline -#define glCreateProgramPipelines bluegl_glCreateProgramPipelines -#define glDeleteRenderbuffersEXT bluegl_glDeleteRenderbuffersEXT -#define glEdgeFlagFormatNV bluegl_glEdgeFlagFormatNV -#define glGetActiveUniformBlockiv bluegl_glGetActiveUniformBlockiv -#define glProgramUniform3f bluegl_glProgramUniform3f -#define glDrawCommandsStatesAddressNV bluegl_glDrawCommandsStatesAddressNV -#define glGetVertexAttribfv bluegl_glGetVertexAttribfv -#define glGetVariantArrayObjectivATI bluegl_glGetVariantArrayObjectivATI -#define glNamedProgramLocalParameter4dEXT bluegl_glNamedProgramLocalParameter4dEXT -#define glGenTransformFeedbacksNV bluegl_glGenTransformFeedbacksNV -#define glDrawElementArrayAPPLE bluegl_glDrawElementArrayAPPLE -#define glVertexAttrib4NusvARB bluegl_glVertexAttrib4NusvARB -#define glBindRenderbufferEXT bluegl_glBindRenderbufferEXT -#define glUnmapTexture2DINTEL bluegl_glUnmapTexture2DINTEL -#define glGetProgramEnvParameterfvARB bluegl_glGetProgramEnvParameterfvARB -#define glVertexAttrib4f bluegl_glVertexAttrib4f -#define glGetnPixelMapfv bluegl_glGetnPixelMapfv -#define glVertexAttrib3dv bluegl_glVertexAttrib3dv -#define glFlushMappedBufferRange bluegl_glFlushMappedBufferRange -#define glSecondaryColor3ub bluegl_glSecondaryColor3ub -#define glGetPerfQueryDataINTEL bluegl_glGetPerfQueryDataINTEL -#define glGetnMapivARB bluegl_glGetnMapivARB +#define glBlendEquationEXT bluegl_glBlendEquationEXT +#define glColorSubTableEXT bluegl_glColorSubTableEXT +#define glCopyColorSubTableEXT bluegl_glCopyColorSubTableEXT +#define glLockArraysEXT bluegl_glLockArraysEXT +#define glUnlockArraysEXT bluegl_glUnlockArraysEXT +#define glConvolutionFilter1DEXT bluegl_glConvolutionFilter1DEXT +#define glConvolutionFilter2DEXT bluegl_glConvolutionFilter2DEXT +#define glConvolutionParameterfEXT bluegl_glConvolutionParameterfEXT +#define glConvolutionParameterfvEXT bluegl_glConvolutionParameterfvEXT +#define glConvolutionParameteriEXT bluegl_glConvolutionParameteriEXT +#define glConvolutionParameterivEXT bluegl_glConvolutionParameterivEXT +#define glCopyConvolutionFilter1DEXT bluegl_glCopyConvolutionFilter1DEXT +#define glCopyConvolutionFilter2DEXT bluegl_glCopyConvolutionFilter2DEXT +#define glGetConvolutionFilterEXT bluegl_glGetConvolutionFilterEXT +#define glGetConvolutionParameterfvEXT bluegl_glGetConvolutionParameterfvEXT +#define glGetConvolutionParameterivEXT bluegl_glGetConvolutionParameterivEXT +#define glGetSeparableFilterEXT bluegl_glGetSeparableFilterEXT #define glSeparableFilter2DEXT bluegl_glSeparableFilter2DEXT -#define glProgramUniformMatrix3x2fvEXT bluegl_glProgramUniformMatrix3x2fvEXT -#define glGenVertexArrays bluegl_glGenVertexArrays -#define glEndQueryARB bluegl_glEndQueryARB -#define glVertexAttrib2fv bluegl_glVertexAttrib2fv -#define glWindowPos2fv bluegl_glWindowPos2fv -#define glCopyConvolutionFilter1D bluegl_glCopyConvolutionFilter1D -#define glTexCoordFormatNV bluegl_glTexCoordFormatNV -#define glMultiTexCoordP2uiv bluegl_glMultiTexCoordP2uiv -#define glProgramUniform1ui64vARB bluegl_glProgramUniform1ui64vARB -#define glColorSubTable bluegl_glColorSubTable -#define glNamedBufferSubData bluegl_glNamedBufferSubData -#define glGetCompressedTextureImage bluegl_glGetCompressedTextureImage -#define glNamedCopyBufferSubDataEXT bluegl_glNamedCopyBufferSubDataEXT -#define glVertexAttribL1i64NV bluegl_glVertexAttribL1i64NV -#define glVertexArrayMultiTexCoordOffsetEXT bluegl_glVertexArrayMultiTexCoordOffsetEXT -#define glGetUniformIndices bluegl_glGetUniformIndices -#define glDrawArraysInstancedARB bluegl_glDrawArraysInstancedARB -#define glGetMultiTexGenivEXT bluegl_glGetMultiTexGenivEXT -#define glGetVertexArrayPointervEXT bluegl_glGetVertexArrayPointervEXT -#define glBeginQuery bluegl_glBeginQuery -#define glDetachObjectARB bluegl_glDetachObjectARB -#define glUniform4iv bluegl_glUniform4iv -#define glGetQueryObjectuiv bluegl_glGetQueryObjectuiv -#define glGetObjectBufferivATI bluegl_glGetObjectBufferivATI -#define glCreateTransformFeedbacks bluegl_glCreateTransformFeedbacks -#define glVertexStream3dATI bluegl_glVertexStream3dATI -#define glEvalMapsNV bluegl_glEvalMapsNV -#define glIsNameAMD bluegl_glIsNameAMD -#define glVertexAttrib4ivARB bluegl_glVertexAttrib4ivARB -#define glGetProgramSubroutineParameteruivNV bluegl_glGetProgramSubroutineParameteruivNV -#define glProgramUniformMatrix2x4dv bluegl_glProgramUniformMatrix2x4dv -#define glBeginPerfQueryINTEL bluegl_glBeginPerfQueryINTEL -#define glPathParameteriNV bluegl_glPathParameteriNV -#define glUniform4i64vNV bluegl_glUniform4i64vNV -#define glStateCaptureNV bluegl_glStateCaptureNV -#define glProgramUniform3fvEXT bluegl_glProgramUniform3fvEXT -#define glVertexAttribL1d bluegl_glVertexAttribL1d -#define glMatrixLoadIdentityEXT bluegl_glMatrixLoadIdentityEXT -#define glBindVertexArrayAPPLE bluegl_glBindVertexArrayAPPLE -#define glRasterPos2xvOES bluegl_glRasterPos2xvOES -#define glCommandListSegmentsNV bluegl_glCommandListSegmentsNV -#define glWindowPos4svMESA bluegl_glWindowPos4svMESA -#define glProgramLocalParameter4dvARB bluegl_glProgramLocalParameter4dvARB -#define glGetnPolygonStipple bluegl_glGetnPolygonStipple -#define glMultiTexCoord1svARB bluegl_glMultiTexCoord1svARB -#define glNamedRenderbufferStorage bluegl_glNamedRenderbufferStorage -#define glProgramEnvParameterI4iNV bluegl_glProgramEnvParameterI4iNV -#define glVertexAttribIFormat bluegl_glVertexAttribIFormat -#define glFogCoordfvEXT bluegl_glFogCoordfvEXT -#define glEnableVertexAttribArray bluegl_glEnableVertexAttribArray -#define glPolygonOffsetClampEXT bluegl_glPolygonOffsetClampEXT -#define glEnable bluegl_glEnable -#define glIndexFuncEXT bluegl_glIndexFuncEXT -#define glDepthRangeArrayv bluegl_glDepthRangeArrayv -#define glRasterPos4xvOES bluegl_glRasterPos4xvOES -#define glSpriteParameterfvSGIX bluegl_glSpriteParameterfvSGIX -#define glGetnUniformdv bluegl_glGetnUniformdv -#define glGetHistogram bluegl_glGetHistogram -#define glClearColorIiEXT bluegl_glClearColorIiEXT -#define glTbufferMask3DFX bluegl_glTbufferMask3DFX -#define glProgramUniform1f bluegl_glProgramUniform1f -#define glVertexAttrib4Niv bluegl_glVertexAttrib4Niv -#define glGetUniformLocationARB bluegl_glGetUniformLocationARB -#define glColor4hvNV bluegl_glColor4hvNV -#define glTextureBufferRangeEXT bluegl_glTextureBufferRangeEXT -#define glGlobalAlphaFactorsSUN bluegl_glGlobalAlphaFactorsSUN -#define glCopyTextureSubImage2D bluegl_glCopyTextureSubImage2D -#define glUniform1i64vARB bluegl_glUniform1i64vARB -#define glVertexAttrib2dNV bluegl_glVertexAttrib2dNV -#define glVertexAttrib4NbvARB bluegl_glVertexAttrib4NbvARB -#define glPatchParameteri bluegl_glPatchParameteri -#define glGetNamedStringARB bluegl_glGetNamedStringARB -#define glGetCombinerStageParameterfvNV bluegl_glGetCombinerStageParameterfvNV -#define glVertexAttrib2svARB bluegl_glVertexAttrib2svARB -#define glApplyFramebufferAttachmentCMAAINTEL bluegl_glApplyFramebufferAttachmentCMAAINTEL -#define glGetVideouivNV bluegl_glGetVideouivNV -#define glMultiTexCoord3s bluegl_glMultiTexCoord3s -#define glMultiTexCoord1sARB bluegl_glMultiTexCoord1sARB -#define glLogicOp bluegl_glLogicOp -#define glFogFuncSGIS bluegl_glFogFuncSGIS -#define glMatrixMultfEXT bluegl_glMatrixMultfEXT -#define glGetTexParameterfv bluegl_glGetTexParameterfv -#define glSecondaryColorP3uiv bluegl_glSecondaryColorP3uiv -#define glMultiTexParameteriEXT bluegl_glMultiTexParameteriEXT -#define glEnableClientStateIndexedEXT bluegl_glEnableClientStateIndexedEXT -#define glGenPathsNV bluegl_glGenPathsNV -#define glGetBufferSubData bluegl_glGetBufferSubData -#define glGetDoublei_v bluegl_glGetDoublei_v -#define glCoverStrokePathNV bluegl_glCoverStrokePathNV -#define glFrontFace bluegl_glFrontFace -#define glScissorIndexedv bluegl_glScissorIndexedv -#define glTextureStorage3D bluegl_glTextureStorage3D -#define glPathFogGenNV bluegl_glPathFogGenNV -#define glPixelTexGenParameterivSGIS bluegl_glPixelTexGenParameterivSGIS -#define glBlendEquationi bluegl_glBlendEquationi -#define glGetHistogramParameterivEXT bluegl_glGetHistogramParameterivEXT -#define glClearNamedFramebufferfi bluegl_glClearNamedFramebufferfi -#define glCopyColorTableSGI bluegl_glCopyColorTableSGI +#define glTangent3bEXT bluegl_glTangent3bEXT +#define glTangent3bvEXT bluegl_glTangent3bvEXT +#define glTangent3dEXT bluegl_glTangent3dEXT +#define glTangent3dvEXT bluegl_glTangent3dvEXT +#define glTangent3fEXT bluegl_glTangent3fEXT +#define glTangent3fvEXT bluegl_glTangent3fvEXT +#define glTangent3iEXT bluegl_glTangent3iEXT +#define glTangent3ivEXT bluegl_glTangent3ivEXT +#define glTangent3sEXT bluegl_glTangent3sEXT +#define glTangent3svEXT bluegl_glTangent3svEXT +#define glBinormal3bEXT bluegl_glBinormal3bEXT +#define glBinormal3bvEXT bluegl_glBinormal3bvEXT #define glBinormal3dEXT bluegl_glBinormal3dEXT -#define glGetBufferParameterui64vNV bluegl_glGetBufferParameterui64vNV -#define glTextureImage2DEXT bluegl_glTextureImage2DEXT -#define glTransformFeedbackVaryings bluegl_glTransformFeedbackVaryings -#define glNamedFramebufferSampleLocationsfvNV bluegl_glNamedFramebufferSampleLocationsfvNV -#define glMapTexture2DINTEL bluegl_glMapTexture2DINTEL -#define glMaterialxvOES bluegl_glMaterialxvOES -#define glGenNamesAMD bluegl_glGenNamesAMD -#define glUniform2uiEXT bluegl_glUniform2uiEXT -#define glMultiTexCoord1xvOES bluegl_glMultiTexCoord1xvOES -#define glEnableIndexedEXT bluegl_glEnableIndexedEXT -#define glCompressedTextureImage1DEXT bluegl_glCompressedTextureImage1DEXT -#define glMultiTexCoord3fv bluegl_glMultiTexCoord3fv -#define glGetnPolygonStippleARB bluegl_glGetnPolygonStippleARB -#define glTexCoord2fColor3fVertex3fvSUN bluegl_glTexCoord2fColor3fVertex3fvSUN -#define glBindTransformFeedbackNV bluegl_glBindTransformFeedbackNV -#define glVertexStream2svATI bluegl_glVertexStream2svATI -#define glMultiTexCoord1fvARB bluegl_glMultiTexCoord1fvARB -#define glMultiTexGendvEXT bluegl_glMultiTexGendvEXT -#define glProgramUniform2ui64vNV bluegl_glProgramUniform2ui64vNV -#define glGetNamedRenderbufferParameteriv bluegl_glGetNamedRenderbufferParameteriv -#define glBlendEquationSeparateEXT bluegl_glBlendEquationSeparateEXT -#define glInvalidateBufferData bluegl_glInvalidateBufferData -#define glFragmentLightModelfvSGIX bluegl_glFragmentLightModelfvSGIX -#define glMakeTextureHandleNonResidentARB bluegl_glMakeTextureHandleNonResidentARB -#define glMap2xOES bluegl_glMap2xOES -#define glFramebufferRenderbufferEXT bluegl_glFramebufferRenderbufferEXT -#define glGetMapAttribParameterfvNV bluegl_glGetMapAttribParameterfvNV -#define glVertexAttrib2dvARB bluegl_glVertexAttrib2dvARB -#define glInvalidateBufferSubData bluegl_glInvalidateBufferSubData -#define glVertexAttrib1d bluegl_glVertexAttrib1d -#define glDispatchComputeIndirect bluegl_glDispatchComputeIndirect -#define glStencilFuncSeparate bluegl_glStencilFuncSeparate -#define glMapVertexAttrib2fAPPLE bluegl_glMapVertexAttrib2fAPPLE -#define glProgramUniformMatrix2x4fv bluegl_glProgramUniformMatrix2x4fv -#define glReadPixels bluegl_glReadPixels -#define glVertexArrayAttribIFormat bluegl_glVertexArrayAttribIFormat -#define glCopyMultiTexSubImage1DEXT bluegl_glCopyMultiTexSubImage1DEXT -#define glBlendEquationSeparateIndexedAMD bluegl_glBlendEquationSeparateIndexedAMD -#define glGetTransformFeedbackVaryingEXT bluegl_glGetTransformFeedbackVaryingEXT -#define glProgramUniform2ui64ARB bluegl_glProgramUniform2ui64ARB -#define glProgramUniform1i64vARB bluegl_glProgramUniform1i64vARB -#define glMultiTexCoord4iv bluegl_glMultiTexCoord4iv -#define glLoadIdentityDeformationMapSGIX bluegl_glLoadIdentityDeformationMapSGIX -#define glGetMultiTexGendvEXT bluegl_glGetMultiTexGendvEXT -#define glVertex4xvOES bluegl_glVertex4xvOES -#define glVertexArrayVertexAttribOffsetEXT bluegl_glVertexArrayVertexAttribOffsetEXT -#define glNormalP3ui bluegl_glNormalP3ui -#define glMapParameterivNV bluegl_glMapParameterivNV -#define glColorPointervINTEL bluegl_glColorPointervINTEL -#define glGetQueryObjectui64v bluegl_glGetQueryObjectui64v -#define glGenFencesAPPLE bluegl_glGenFencesAPPLE -#define glNamedBufferPageCommitmentEXT bluegl_glNamedBufferPageCommitmentEXT -#define glGetShaderSourceARB bluegl_glGetShaderSourceARB -#define glClearNamedFramebufferuiv bluegl_glClearNamedFramebufferuiv -#define glVDPAUIsSurfaceNV bluegl_glVDPAUIsSurfaceNV -#define glVertexAttribL2ui64NV bluegl_glVertexAttribL2ui64NV -#define glColor4xvOES bluegl_glColor4xvOES -#define glUniformBlockBinding bluegl_glUniformBlockBinding -#define glListParameterivSGIX bluegl_glListParameterivSGIX -#define glPathSubCoordsNV bluegl_glPathSubCoordsNV -#define glGetProgramStringARB bluegl_glGetProgramStringARB -#define glPathStencilFuncNV bluegl_glPathStencilFuncNV -#define glBindVideoCaptureStreamBufferNV bluegl_glBindVideoCaptureStreamBufferNV -#define glReadnPixelsARB bluegl_glReadnPixelsARB -#define glTexBufferARB bluegl_glTexBufferARB -#define glVertexAttribL2ui64vNV bluegl_glVertexAttribL2ui64vNV -#define glCreateBuffers bluegl_glCreateBuffers -#define glImageTransformParameterfvHP bluegl_glImageTransformParameterfvHP -#define glUniform2d bluegl_glUniform2d -#define glBufferStorage bluegl_glBufferStorage -#define glGetTexFilterFuncSGIS bluegl_glGetTexFilterFuncSGIS -#define glGetHandleARB bluegl_glGetHandleARB -#define glGetHistogramParameterxvOES bluegl_glGetHistogramParameterxvOES -#define glMultiTexCoord2d bluegl_glMultiTexCoord2d -#define glVertex4hNV bluegl_glVertex4hNV -#define glGetPerfMonitorGroupStringAMD bluegl_glGetPerfMonitorGroupStringAMD -#define glCompressedTextureSubImage1D bluegl_glCompressedTextureSubImage1D -#define glIsFramebuffer bluegl_glIsFramebuffer -#define glUniform2dv bluegl_glUniform2dv -#define glVertexAttrib1dvARB bluegl_glVertexAttrib1dvARB -#define glClientWaitSync bluegl_glClientWaitSync -#define glProgramUniform4i64vARB bluegl_glProgramUniform4i64vARB -#define glGetActiveAttribARB bluegl_glGetActiveAttribARB -#define glCompressedTexImage3DARB bluegl_glCompressedTexImage3DARB -#define glVertexAttribI2iEXT bluegl_glVertexAttribI2iEXT -#define glProgramNamedParameter4dNV bluegl_glProgramNamedParameter4dNV -#define glProgramStringARB bluegl_glProgramStringARB -#define glWindowPos3fvMESA bluegl_glWindowPos3fvMESA -#define glBlendFunciARB bluegl_glBlendFunciARB -#define glVertexAttrib4dvNV bluegl_glVertexAttrib4dvNV -#define glWindowPos3dvARB bluegl_glWindowPos3dvARB -#define glMultiTexCoord1bvOES bluegl_glMultiTexCoord1bvOES -#define glVertexAttrib4fvARB bluegl_glVertexAttrib4fvARB +#define glBinormal3dvEXT bluegl_glBinormal3dvEXT +#define glBinormal3fEXT bluegl_glBinormal3fEXT +#define glBinormal3fvEXT bluegl_glBinormal3fvEXT +#define glBinormal3iEXT bluegl_glBinormal3iEXT +#define glBinormal3ivEXT bluegl_glBinormal3ivEXT +#define glBinormal3sEXT bluegl_glBinormal3sEXT +#define glBinormal3svEXT bluegl_glBinormal3svEXT +#define glTangentPointerEXT bluegl_glTangentPointerEXT +#define glBinormalPointerEXT bluegl_glBinormalPointerEXT +#define glCopyTexImage1DEXT bluegl_glCopyTexImage1DEXT +#define glCopyTexImage2DEXT bluegl_glCopyTexImage2DEXT +#define glCopyTexSubImage1DEXT bluegl_glCopyTexSubImage1DEXT +#define glCopyTexSubImage2DEXT bluegl_glCopyTexSubImage2DEXT +#define glCopyTexSubImage3DEXT bluegl_glCopyTexSubImage3DEXT +#define glCullParameterdvEXT bluegl_glCullParameterdvEXT +#define glCullParameterfvEXT bluegl_glCullParameterfvEXT +#define glLabelObjectEXT bluegl_glLabelObjectEXT +#define glGetObjectLabelEXT bluegl_glGetObjectLabelEXT +#define glInsertEventMarkerEXT bluegl_glInsertEventMarkerEXT +#define glPushGroupMarkerEXT bluegl_glPushGroupMarkerEXT #define glPopGroupMarkerEXT bluegl_glPopGroupMarkerEXT -#define glMultiDrawElements bluegl_glMultiDrawElements -#define glGetInstrumentsSGIX bluegl_glGetInstrumentsSGIX -#define glProgramUniform4dv bluegl_glProgramUniform4dv -#define glColorTableEXT bluegl_glColorTableEXT -#define glTexSubImage1D bluegl_glTexSubImage1D -#define glBeginPerfMonitorAMD bluegl_glBeginPerfMonitorAMD -#define glPointParameterfvSGIS bluegl_glPointParameterfvSGIS -#define glGetImageTransformParameterfvHP bluegl_glGetImageTransformParameterfvHP -#define glVertex3hvNV bluegl_glVertex3hvNV -#define glTexCoord4fVertex4fvSUN bluegl_glTexCoord4fVertex4fvSUN -#define glCompressedTexSubImage1D bluegl_glCompressedTexSubImage1D -#define glWindowPos2dvMESA bluegl_glWindowPos2dvMESA -#define glGetSamplerParameteriv bluegl_glGetSamplerParameteriv -#define glColorPointerListIBM bluegl_glColorPointerListIBM -#define glGetFinalCombinerInputParameterivNV bluegl_glGetFinalCombinerInputParameterivNV -#define glGetVertexAttribiv bluegl_glGetVertexAttribiv -#define glGetTexImage bluegl_glGetTexImage -#define glBufferSubData bluegl_glBufferSubData -#define glVertexAttrib3sARB bluegl_glVertexAttrib3sARB -#define glIsTextureHandleResidentARB bluegl_glIsTextureHandleResidentARB -#define glMultiTexCoord3i bluegl_glMultiTexCoord3i -#define glLinkProgramARB bluegl_glLinkProgramARB -#define glIsProgramNV bluegl_glIsProgramNV -#define glVertexAttribI4i bluegl_glVertexAttribI4i -#define glUniform1i bluegl_glUniform1i -#define glBindAttribLocationARB bluegl_glBindAttribLocationARB -#define glProgramUniform4i64vNV bluegl_glProgramUniform4i64vNV -#define glVertex4xOES bluegl_glVertex4xOES -#define glSetLocalConstantEXT bluegl_glSetLocalConstantEXT -#define glTexSubImage2D bluegl_glTexSubImage2D -#define glWindowPos2f bluegl_glWindowPos2f -#define glVariantPointerEXT bluegl_glVariantPointerEXT -#define glNamedRenderbufferStorageMultisample bluegl_glNamedRenderbufferStorageMultisample -#define glFogCoorddvEXT bluegl_glFogCoorddvEXT -#define glMultiModeDrawArraysIBM bluegl_glMultiModeDrawArraysIBM +#define glDepthBoundsEXT bluegl_glDepthBoundsEXT +#define glMatrixLoadfEXT bluegl_glMatrixLoadfEXT #define glMatrixLoaddEXT bluegl_glMatrixLoaddEXT -#define glDeleteQueriesARB bluegl_glDeleteQueriesARB -#define glUniform1fvARB bluegl_glUniform1fvARB -#define glDrawCommandsNV bluegl_glDrawCommandsNV -#define glSecondaryColor3dvEXT bluegl_glSecondaryColor3dvEXT -#define glFlushVertexArrayRangeAPPLE bluegl_glFlushVertexArrayRangeAPPLE -#define glTexEnvxvOES bluegl_glTexEnvxvOES -#define glGetSeparableFilterEXT bluegl_glGetSeparableFilterEXT -#define glVertexAttribI4bvEXT bluegl_glVertexAttribI4bvEXT -#define glUniform3i64NV bluegl_glUniform3i64NV -#define glBlendEquationIndexedAMD bluegl_glBlendEquationIndexedAMD -#define glPointParameterf bluegl_glPointParameterf -#define glVertex4bvOES bluegl_glVertex4bvOES -#define glStencilThenCoverFillPathNV bluegl_glStencilThenCoverFillPathNV +#define glMatrixMultfEXT bluegl_glMatrixMultfEXT +#define glMatrixMultdEXT bluegl_glMatrixMultdEXT +#define glMatrixLoadIdentityEXT bluegl_glMatrixLoadIdentityEXT +#define glMatrixRotatefEXT bluegl_glMatrixRotatefEXT +#define glMatrixRotatedEXT bluegl_glMatrixRotatedEXT +#define glMatrixScalefEXT bluegl_glMatrixScalefEXT +#define glMatrixScaledEXT bluegl_glMatrixScaledEXT +#define glMatrixTranslatefEXT bluegl_glMatrixTranslatefEXT +#define glMatrixTranslatedEXT bluegl_glMatrixTranslatedEXT +#define glMatrixFrustumEXT bluegl_glMatrixFrustumEXT +#define glMatrixOrthoEXT bluegl_glMatrixOrthoEXT +#define glMatrixPopEXT bluegl_glMatrixPopEXT +#define glMatrixPushEXT bluegl_glMatrixPushEXT +#define glClientAttribDefaultEXT bluegl_glClientAttribDefaultEXT +#define glPushClientAttribDefaultEXT bluegl_glPushClientAttribDefaultEXT +#define glTextureParameterfEXT bluegl_glTextureParameterfEXT +#define glTextureParameterfvEXT bluegl_glTextureParameterfvEXT +#define glTextureParameteriEXT bluegl_glTextureParameteriEXT +#define glTextureParameterivEXT bluegl_glTextureParameterivEXT +#define glTextureImage1DEXT bluegl_glTextureImage1DEXT +#define glTextureImage2DEXT bluegl_glTextureImage2DEXT +#define glTextureSubImage1DEXT bluegl_glTextureSubImage1DEXT +#define glTextureSubImage2DEXT bluegl_glTextureSubImage2DEXT +#define glCopyTextureImage1DEXT bluegl_glCopyTextureImage1DEXT +#define glCopyTextureImage2DEXT bluegl_glCopyTextureImage2DEXT +#define glCopyTextureSubImage1DEXT bluegl_glCopyTextureSubImage1DEXT +#define glCopyTextureSubImage2DEXT bluegl_glCopyTextureSubImage2DEXT +#define glGetTextureImageEXT bluegl_glGetTextureImageEXT +#define glGetTextureParameterfvEXT bluegl_glGetTextureParameterfvEXT +#define glGetTextureParameterivEXT bluegl_glGetTextureParameterivEXT +#define glGetTextureLevelParameterfvEXT bluegl_glGetTextureLevelParameterfvEXT +#define glGetTextureLevelParameterivEXT bluegl_glGetTextureLevelParameterivEXT +#define glTextureImage3DEXT bluegl_glTextureImage3DEXT +#define glTextureSubImage3DEXT bluegl_glTextureSubImage3DEXT +#define glCopyTextureSubImage3DEXT bluegl_glCopyTextureSubImage3DEXT +#define glBindMultiTextureEXT bluegl_glBindMultiTextureEXT +#define glMultiTexCoordPointerEXT bluegl_glMultiTexCoordPointerEXT +#define glMultiTexEnvfEXT bluegl_glMultiTexEnvfEXT +#define glMultiTexEnvfvEXT bluegl_glMultiTexEnvfvEXT +#define glMultiTexEnviEXT bluegl_glMultiTexEnviEXT +#define glMultiTexEnvivEXT bluegl_glMultiTexEnvivEXT +#define glMultiTexGendEXT bluegl_glMultiTexGendEXT +#define glMultiTexGendvEXT bluegl_glMultiTexGendvEXT +#define glMultiTexGenfEXT bluegl_glMultiTexGenfEXT +#define glMultiTexGenfvEXT bluegl_glMultiTexGenfvEXT +#define glMultiTexGeniEXT bluegl_glMultiTexGeniEXT +#define glMultiTexGenivEXT bluegl_glMultiTexGenivEXT +#define glGetMultiTexEnvfvEXT bluegl_glGetMultiTexEnvfvEXT +#define glGetMultiTexEnvivEXT bluegl_glGetMultiTexEnvivEXT +#define glGetMultiTexGendvEXT bluegl_glGetMultiTexGendvEXT +#define glGetMultiTexGenfvEXT bluegl_glGetMultiTexGenfvEXT +#define glGetMultiTexGenivEXT bluegl_glGetMultiTexGenivEXT +#define glMultiTexParameteriEXT bluegl_glMultiTexParameteriEXT +#define glMultiTexParameterivEXT bluegl_glMultiTexParameterivEXT +#define glMultiTexParameterfEXT bluegl_glMultiTexParameterfEXT +#define glMultiTexParameterfvEXT bluegl_glMultiTexParameterfvEXT +#define glMultiTexImage1DEXT bluegl_glMultiTexImage1DEXT +#define glMultiTexImage2DEXT bluegl_glMultiTexImage2DEXT +#define glMultiTexSubImage1DEXT bluegl_glMultiTexSubImage1DEXT +#define glMultiTexSubImage2DEXT bluegl_glMultiTexSubImage2DEXT +#define glCopyMultiTexImage1DEXT bluegl_glCopyMultiTexImage1DEXT +#define glCopyMultiTexImage2DEXT bluegl_glCopyMultiTexImage2DEXT +#define glCopyMultiTexSubImage1DEXT bluegl_glCopyMultiTexSubImage1DEXT +#define glCopyMultiTexSubImage2DEXT bluegl_glCopyMultiTexSubImage2DEXT +#define glGetMultiTexImageEXT bluegl_glGetMultiTexImageEXT +#define glGetMultiTexParameterfvEXT bluegl_glGetMultiTexParameterfvEXT +#define glGetMultiTexParameterivEXT bluegl_glGetMultiTexParameterivEXT +#define glGetMultiTexLevelParameterfvEXT bluegl_glGetMultiTexLevelParameterfvEXT +#define glGetMultiTexLevelParameterivEXT bluegl_glGetMultiTexLevelParameterivEXT +#define glMultiTexImage3DEXT bluegl_glMultiTexImage3DEXT +#define glMultiTexSubImage3DEXT bluegl_glMultiTexSubImage3DEXT +#define glCopyMultiTexSubImage3DEXT bluegl_glCopyMultiTexSubImage3DEXT +#define glEnableClientStateIndexedEXT bluegl_glEnableClientStateIndexedEXT +#define glDisableClientStateIndexedEXT bluegl_glDisableClientStateIndexedEXT +#define glGetFloatIndexedvEXT bluegl_glGetFloatIndexedvEXT +#define glGetDoubleIndexedvEXT bluegl_glGetDoubleIndexedvEXT +#define glGetPointerIndexedvEXT bluegl_glGetPointerIndexedvEXT +#define glEnableIndexedEXT bluegl_glEnableIndexedEXT +#define glDisableIndexedEXT bluegl_glDisableIndexedEXT +#define glIsEnabledIndexedEXT bluegl_glIsEnabledIndexedEXT +#define glGetIntegerIndexedvEXT bluegl_glGetIntegerIndexedvEXT +#define glGetBooleanIndexedvEXT bluegl_glGetBooleanIndexedvEXT +#define glCompressedTextureImage3DEXT bluegl_glCompressedTextureImage3DEXT #define glCompressedTextureImage2DEXT bluegl_glCompressedTextureImage2DEXT -#define glBlendEquationSeparate bluegl_glBlendEquationSeparate -#define glGetNamedFramebufferParameteriv bluegl_glGetNamedFramebufferParameteriv -#define glTexImage3DEXT bluegl_glTexImage3DEXT -#define glColorFragmentOp3ATI bluegl_glColorFragmentOp3ATI -#define glNormalPointerListIBM bluegl_glNormalPointerListIBM -#define glTexParameteriv bluegl_glTexParameteriv -#define glCompressedTexSubImage2D bluegl_glCompressedTexSubImage2D -#define glCoverFillPathNV bluegl_glCoverFillPathNV +#define glCompressedTextureImage1DEXT bluegl_glCompressedTextureImage1DEXT +#define glCompressedTextureSubImage3DEXT bluegl_glCompressedTextureSubImage3DEXT +#define glCompressedTextureSubImage2DEXT bluegl_glCompressedTextureSubImage2DEXT +#define glCompressedTextureSubImage1DEXT bluegl_glCompressedTextureSubImage1DEXT +#define glGetCompressedTextureImageEXT bluegl_glGetCompressedTextureImageEXT +#define glCompressedMultiTexImage3DEXT bluegl_glCompressedMultiTexImage3DEXT +#define glCompressedMultiTexImage2DEXT bluegl_glCompressedMultiTexImage2DEXT +#define glCompressedMultiTexImage1DEXT bluegl_glCompressedMultiTexImage1DEXT +#define glCompressedMultiTexSubImage3DEXT bluegl_glCompressedMultiTexSubImage3DEXT +#define glCompressedMultiTexSubImage2DEXT bluegl_glCompressedMultiTexSubImage2DEXT +#define glCompressedMultiTexSubImage1DEXT bluegl_glCompressedMultiTexSubImage1DEXT +#define glGetCompressedMultiTexImageEXT bluegl_glGetCompressedMultiTexImageEXT +#define glMatrixLoadTransposefEXT bluegl_glMatrixLoadTransposefEXT +#define glMatrixLoadTransposedEXT bluegl_glMatrixLoadTransposedEXT +#define glMatrixMultTransposefEXT bluegl_glMatrixMultTransposefEXT +#define glMatrixMultTransposedEXT bluegl_glMatrixMultTransposedEXT +#define glNamedBufferDataEXT bluegl_glNamedBufferDataEXT +#define glNamedBufferSubDataEXT bluegl_glNamedBufferSubDataEXT +#define glMapNamedBufferEXT bluegl_glMapNamedBufferEXT +#define glUnmapNamedBufferEXT bluegl_glUnmapNamedBufferEXT +#define glGetNamedBufferParameterivEXT bluegl_glGetNamedBufferParameterivEXT +#define glGetNamedBufferPointervEXT bluegl_glGetNamedBufferPointervEXT +#define glGetNamedBufferSubDataEXT bluegl_glGetNamedBufferSubDataEXT +#define glProgramUniform1fEXT bluegl_glProgramUniform1fEXT +#define glProgramUniform2fEXT bluegl_glProgramUniform2fEXT +#define glProgramUniform3fEXT bluegl_glProgramUniform3fEXT +#define glProgramUniform4fEXT bluegl_glProgramUniform4fEXT +#define glProgramUniform1iEXT bluegl_glProgramUniform1iEXT +#define glProgramUniform2iEXT bluegl_glProgramUniform2iEXT +#define glProgramUniform3iEXT bluegl_glProgramUniform3iEXT +#define glProgramUniform4iEXT bluegl_glProgramUniform4iEXT +#define glProgramUniform1fvEXT bluegl_glProgramUniform1fvEXT +#define glProgramUniform2fvEXT bluegl_glProgramUniform2fvEXT +#define glProgramUniform3fvEXT bluegl_glProgramUniform3fvEXT +#define glProgramUniform4fvEXT bluegl_glProgramUniform4fvEXT +#define glProgramUniform1ivEXT bluegl_glProgramUniform1ivEXT +#define glProgramUniform2ivEXT bluegl_glProgramUniform2ivEXT +#define glProgramUniform3ivEXT bluegl_glProgramUniform3ivEXT +#define glProgramUniform4ivEXT bluegl_glProgramUniform4ivEXT +#define glProgramUniformMatrix2fvEXT bluegl_glProgramUniformMatrix2fvEXT +#define glProgramUniformMatrix3fvEXT bluegl_glProgramUniformMatrix3fvEXT +#define glProgramUniformMatrix4fvEXT bluegl_glProgramUniformMatrix4fvEXT +#define glProgramUniformMatrix2x3fvEXT bluegl_glProgramUniformMatrix2x3fvEXT +#define glProgramUniformMatrix3x2fvEXT bluegl_glProgramUniformMatrix3x2fvEXT +#define glProgramUniformMatrix2x4fvEXT bluegl_glProgramUniformMatrix2x4fvEXT +#define glProgramUniformMatrix4x2fvEXT bluegl_glProgramUniformMatrix4x2fvEXT +#define glProgramUniformMatrix3x4fvEXT bluegl_glProgramUniformMatrix3x4fvEXT +#define glProgramUniformMatrix4x3fvEXT bluegl_glProgramUniformMatrix4x3fvEXT +#define glTextureBufferEXT bluegl_glTextureBufferEXT +#define glMultiTexBufferEXT bluegl_glMultiTexBufferEXT +#define glTextureParameterIivEXT bluegl_glTextureParameterIivEXT +#define glTextureParameterIuivEXT bluegl_glTextureParameterIuivEXT +#define glGetTextureParameterIivEXT bluegl_glGetTextureParameterIivEXT +#define glGetTextureParameterIuivEXT bluegl_glGetTextureParameterIuivEXT +#define glMultiTexParameterIivEXT bluegl_glMultiTexParameterIivEXT +#define glMultiTexParameterIuivEXT bluegl_glMultiTexParameterIuivEXT +#define glGetMultiTexParameterIivEXT bluegl_glGetMultiTexParameterIivEXT +#define glGetMultiTexParameterIuivEXT bluegl_glGetMultiTexParameterIuivEXT +#define glProgramUniform1uiEXT bluegl_glProgramUniform1uiEXT +#define glProgramUniform2uiEXT bluegl_glProgramUniform2uiEXT +#define glProgramUniform3uiEXT bluegl_glProgramUniform3uiEXT +#define glProgramUniform4uiEXT bluegl_glProgramUniform4uiEXT +#define glProgramUniform1uivEXT bluegl_glProgramUniform1uivEXT +#define glProgramUniform2uivEXT bluegl_glProgramUniform2uivEXT +#define glProgramUniform3uivEXT bluegl_glProgramUniform3uivEXT +#define glProgramUniform4uivEXT bluegl_glProgramUniform4uivEXT +#define glNamedProgramLocalParameters4fvEXT bluegl_glNamedProgramLocalParameters4fvEXT +#define glNamedProgramLocalParameterI4iEXT bluegl_glNamedProgramLocalParameterI4iEXT +#define glNamedProgramLocalParameterI4ivEXT bluegl_glNamedProgramLocalParameterI4ivEXT +#define glNamedProgramLocalParametersI4ivEXT bluegl_glNamedProgramLocalParametersI4ivEXT +#define glNamedProgramLocalParameterI4uiEXT bluegl_glNamedProgramLocalParameterI4uiEXT +#define glNamedProgramLocalParameterI4uivEXT bluegl_glNamedProgramLocalParameterI4uivEXT +#define glNamedProgramLocalParametersI4uivEXT bluegl_glNamedProgramLocalParametersI4uivEXT +#define glGetNamedProgramLocalParameterIivEXT bluegl_glGetNamedProgramLocalParameterIivEXT +#define glGetNamedProgramLocalParameterIuivEXT bluegl_glGetNamedProgramLocalParameterIuivEXT +#define glEnableClientStateiEXT bluegl_glEnableClientStateiEXT +#define glDisableClientStateiEXT bluegl_glDisableClientStateiEXT +#define glGetFloati_vEXT bluegl_glGetFloati_vEXT +#define glGetDoublei_vEXT bluegl_glGetDoublei_vEXT +#define glGetPointeri_vEXT bluegl_glGetPointeri_vEXT +#define glNamedProgramStringEXT bluegl_glNamedProgramStringEXT +#define glNamedProgramLocalParameter4dEXT bluegl_glNamedProgramLocalParameter4dEXT +#define glNamedProgramLocalParameter4dvEXT bluegl_glNamedProgramLocalParameter4dvEXT +#define glNamedProgramLocalParameter4fEXT bluegl_glNamedProgramLocalParameter4fEXT +#define glNamedProgramLocalParameter4fvEXT bluegl_glNamedProgramLocalParameter4fvEXT +#define glGetNamedProgramLocalParameterdvEXT bluegl_glGetNamedProgramLocalParameterdvEXT +#define glGetNamedProgramLocalParameterfvEXT bluegl_glGetNamedProgramLocalParameterfvEXT +#define glGetNamedProgramivEXT bluegl_glGetNamedProgramivEXT +#define glGetNamedProgramStringEXT bluegl_glGetNamedProgramStringEXT +#define glNamedRenderbufferStorageEXT bluegl_glNamedRenderbufferStorageEXT +#define glGetNamedRenderbufferParameterivEXT bluegl_glGetNamedRenderbufferParameterivEXT +#define glNamedRenderbufferStorageMultisampleEXT bluegl_glNamedRenderbufferStorageMultisampleEXT +#define glNamedRenderbufferStorageMultisampleCoverageEXT bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT +#define glCheckNamedFramebufferStatusEXT bluegl_glCheckNamedFramebufferStatusEXT +#define glNamedFramebufferTexture1DEXT bluegl_glNamedFramebufferTexture1DEXT +#define glNamedFramebufferTexture2DEXT bluegl_glNamedFramebufferTexture2DEXT +#define glNamedFramebufferTexture3DEXT bluegl_glNamedFramebufferTexture3DEXT +#define glNamedFramebufferRenderbufferEXT bluegl_glNamedFramebufferRenderbufferEXT +#define glGetNamedFramebufferAttachmentParameterivEXT bluegl_glGetNamedFramebufferAttachmentParameterivEXT +#define glGenerateTextureMipmapEXT bluegl_glGenerateTextureMipmapEXT +#define glGenerateMultiTexMipmapEXT bluegl_glGenerateMultiTexMipmapEXT +#define glFramebufferDrawBufferEXT bluegl_glFramebufferDrawBufferEXT +#define glFramebufferDrawBuffersEXT bluegl_glFramebufferDrawBuffersEXT +#define glFramebufferReadBufferEXT bluegl_glFramebufferReadBufferEXT +#define glGetFramebufferParameterivEXT bluegl_glGetFramebufferParameterivEXT +#define glNamedCopyBufferSubDataEXT bluegl_glNamedCopyBufferSubDataEXT +#define glNamedFramebufferTextureEXT bluegl_glNamedFramebufferTextureEXT +#define glNamedFramebufferTextureLayerEXT bluegl_glNamedFramebufferTextureLayerEXT +#define glNamedFramebufferTextureFaceEXT bluegl_glNamedFramebufferTextureFaceEXT +#define glTextureRenderbufferEXT bluegl_glTextureRenderbufferEXT +#define glMultiTexRenderbufferEXT bluegl_glMultiTexRenderbufferEXT +#define glVertexArrayVertexOffsetEXT bluegl_glVertexArrayVertexOffsetEXT +#define glVertexArrayColorOffsetEXT bluegl_glVertexArrayColorOffsetEXT +#define glVertexArrayEdgeFlagOffsetEXT bluegl_glVertexArrayEdgeFlagOffsetEXT +#define glVertexArrayIndexOffsetEXT bluegl_glVertexArrayIndexOffsetEXT +#define glVertexArrayNormalOffsetEXT bluegl_glVertexArrayNormalOffsetEXT +#define glVertexArrayTexCoordOffsetEXT bluegl_glVertexArrayTexCoordOffsetEXT +#define glVertexArrayMultiTexCoordOffsetEXT bluegl_glVertexArrayMultiTexCoordOffsetEXT +#define glVertexArrayFogCoordOffsetEXT bluegl_glVertexArrayFogCoordOffsetEXT +#define glVertexArraySecondaryColorOffsetEXT bluegl_glVertexArraySecondaryColorOffsetEXT +#define glVertexArrayVertexAttribOffsetEXT bluegl_glVertexArrayVertexAttribOffsetEXT +#define glVertexArrayVertexAttribIOffsetEXT bluegl_glVertexArrayVertexAttribIOffsetEXT +#define glEnableVertexArrayEXT bluegl_glEnableVertexArrayEXT +#define glDisableVertexArrayEXT bluegl_glDisableVertexArrayEXT +#define glEnableVertexArrayAttribEXT bluegl_glEnableVertexArrayAttribEXT +#define glDisableVertexArrayAttribEXT bluegl_glDisableVertexArrayAttribEXT +#define glGetVertexArrayIntegervEXT bluegl_glGetVertexArrayIntegervEXT +#define glGetVertexArrayPointervEXT bluegl_glGetVertexArrayPointervEXT +#define glGetVertexArrayIntegeri_vEXT bluegl_glGetVertexArrayIntegeri_vEXT +#define glGetVertexArrayPointeri_vEXT bluegl_glGetVertexArrayPointeri_vEXT +#define glMapNamedBufferRangeEXT bluegl_glMapNamedBufferRangeEXT +#define glFlushMappedNamedBufferRangeEXT bluegl_glFlushMappedNamedBufferRangeEXT +#define glNamedBufferStorageEXT bluegl_glNamedBufferStorageEXT +#define glClearNamedBufferDataEXT bluegl_glClearNamedBufferDataEXT +#define glClearNamedBufferSubDataEXT bluegl_glClearNamedBufferSubDataEXT +#define glNamedFramebufferParameteriEXT bluegl_glNamedFramebufferParameteriEXT +#define glGetNamedFramebufferParameterivEXT bluegl_glGetNamedFramebufferParameterivEXT +#define glProgramUniform1dEXT bluegl_glProgramUniform1dEXT +#define glProgramUniform2dEXT bluegl_glProgramUniform2dEXT +#define glProgramUniform3dEXT bluegl_glProgramUniform3dEXT +#define glProgramUniform4dEXT bluegl_glProgramUniform4dEXT +#define glProgramUniform1dvEXT bluegl_glProgramUniform1dvEXT +#define glProgramUniform2dvEXT bluegl_glProgramUniform2dvEXT +#define glProgramUniform3dvEXT bluegl_glProgramUniform3dvEXT +#define glProgramUniform4dvEXT bluegl_glProgramUniform4dvEXT +#define glProgramUniformMatrix2dvEXT bluegl_glProgramUniformMatrix2dvEXT +#define glProgramUniformMatrix3dvEXT bluegl_glProgramUniformMatrix3dvEXT +#define glProgramUniformMatrix4dvEXT bluegl_glProgramUniformMatrix4dvEXT +#define glProgramUniformMatrix2x3dvEXT bluegl_glProgramUniformMatrix2x3dvEXT +#define glProgramUniformMatrix2x4dvEXT bluegl_glProgramUniformMatrix2x4dvEXT +#define glProgramUniformMatrix3x2dvEXT bluegl_glProgramUniformMatrix3x2dvEXT +#define glProgramUniformMatrix3x4dvEXT bluegl_glProgramUniformMatrix3x4dvEXT #define glProgramUniformMatrix4x2dvEXT bluegl_glProgramUniformMatrix4x2dvEXT -#define glVertexAttrib1f bluegl_glVertexAttrib1f -#define glAlphaFragmentOp3ATI bluegl_glAlphaFragmentOp3ATI -#define glBeginQueryIndexed bluegl_glBeginQueryIndexed -#define glProgramUniformMatrix2x3fv bluegl_glProgramUniformMatrix2x3fv -#define glProgramUniform4ui64vNV bluegl_glProgramUniform4ui64vNV -#define glUniform1ui64NV bluegl_glUniform1ui64NV -#define glMultiTexCoord3svARB bluegl_glMultiTexCoord3svARB -#define glWeightivARB bluegl_glWeightivARB -#define glMultiTexCoord4xOES bluegl_glMultiTexCoord4xOES -#define glVertexAttribL2i64NV bluegl_glVertexAttribL2i64NV -#define glProgramUniformMatrix3x4dv bluegl_glProgramUniformMatrix3x4dv +#define glProgramUniformMatrix4x3dvEXT bluegl_glProgramUniformMatrix4x3dvEXT +#define glTextureBufferRangeEXT bluegl_glTextureBufferRangeEXT +#define glTextureStorage1DEXT bluegl_glTextureStorage1DEXT +#define glTextureStorage2DEXT bluegl_glTextureStorage2DEXT +#define glTextureStorage3DEXT bluegl_glTextureStorage3DEXT +#define glTextureStorage2DMultisampleEXT bluegl_glTextureStorage2DMultisampleEXT +#define glTextureStorage3DMultisampleEXT bluegl_glTextureStorage3DMultisampleEXT +#define glVertexArrayBindVertexBufferEXT bluegl_glVertexArrayBindVertexBufferEXT +#define glVertexArrayVertexAttribFormatEXT bluegl_glVertexArrayVertexAttribFormatEXT +#define glVertexArrayVertexAttribIFormatEXT bluegl_glVertexArrayVertexAttribIFormatEXT +#define glVertexArrayVertexAttribLFormatEXT bluegl_glVertexArrayVertexAttribLFormatEXT +#define glVertexArrayVertexAttribBindingEXT bluegl_glVertexArrayVertexAttribBindingEXT +#define glVertexArrayVertexBindingDivisorEXT bluegl_glVertexArrayVertexBindingDivisorEXT +#define glVertexArrayVertexAttribLOffsetEXT bluegl_glVertexArrayVertexAttribLOffsetEXT +#define glTexturePageCommitmentEXT bluegl_glTexturePageCommitmentEXT +#define glVertexArrayVertexAttribDivisorEXT bluegl_glVertexArrayVertexAttribDivisorEXT +#define glColorMaskIndexedEXT bluegl_glColorMaskIndexedEXT +#define glDrawArraysInstancedEXT bluegl_glDrawArraysInstancedEXT +#define glDrawElementsInstancedEXT bluegl_glDrawElementsInstancedEXT +#define glDrawRangeElementsEXT bluegl_glDrawRangeElementsEXT +#define glFogCoordfEXT bluegl_glFogCoordfEXT +#define glFogCoordfvEXT bluegl_glFogCoordfvEXT +#define glFogCoorddEXT bluegl_glFogCoorddEXT +#define glFogCoorddvEXT bluegl_glFogCoorddvEXT +#define glFogCoordPointerEXT bluegl_glFogCoordPointerEXT +#define glBlitFramebufferEXT bluegl_glBlitFramebufferEXT +#define glRenderbufferStorageMultisampleEXT bluegl_glRenderbufferStorageMultisampleEXT +#define glIsRenderbufferEXT bluegl_glIsRenderbufferEXT +#define glBindRenderbufferEXT bluegl_glBindRenderbufferEXT +#define glDeleteRenderbuffersEXT bluegl_glDeleteRenderbuffersEXT +#define glGenRenderbuffersEXT bluegl_glGenRenderbuffersEXT +#define glRenderbufferStorageEXT bluegl_glRenderbufferStorageEXT +#define glGetRenderbufferParameterivEXT bluegl_glGetRenderbufferParameterivEXT +#define glIsFramebufferEXT bluegl_glIsFramebufferEXT +#define glBindFramebufferEXT bluegl_glBindFramebufferEXT +#define glDeleteFramebuffersEXT bluegl_glDeleteFramebuffersEXT +#define glGenFramebuffersEXT bluegl_glGenFramebuffersEXT +#define glCheckFramebufferStatusEXT bluegl_glCheckFramebufferStatusEXT +#define glFramebufferTexture1DEXT bluegl_glFramebufferTexture1DEXT +#define glFramebufferTexture2DEXT bluegl_glFramebufferTexture2DEXT +#define glFramebufferTexture3DEXT bluegl_glFramebufferTexture3DEXT +#define glFramebufferRenderbufferEXT bluegl_glFramebufferRenderbufferEXT +#define glGetFramebufferAttachmentParameterivEXT bluegl_glGetFramebufferAttachmentParameterivEXT +#define glGenerateMipmapEXT bluegl_glGenerateMipmapEXT #define glProgramParameteriEXT bluegl_glProgramParameteriEXT -#define glSecondaryColor3sEXT bluegl_glSecondaryColor3sEXT -#define glCompressedTextureSubImage3DEXT bluegl_glCompressedTextureSubImage3DEXT -#define glGetPointervEXT bluegl_glGetPointervEXT +#define glProgramEnvParameters4fvEXT bluegl_glProgramEnvParameters4fvEXT +#define glProgramLocalParameters4fvEXT bluegl_glProgramLocalParameters4fvEXT +#define glGetUniformuivEXT bluegl_glGetUniformuivEXT +#define glBindFragDataLocationEXT bluegl_glBindFragDataLocationEXT +#define glGetFragDataLocationEXT bluegl_glGetFragDataLocationEXT +#define glUniform1uiEXT bluegl_glUniform1uiEXT +#define glUniform2uiEXT bluegl_glUniform2uiEXT +#define glUniform3uiEXT bluegl_glUniform3uiEXT +#define glUniform4uiEXT bluegl_glUniform4uiEXT +#define glUniform1uivEXT bluegl_glUniform1uivEXT +#define glUniform2uivEXT bluegl_glUniform2uivEXT +#define glUniform3uivEXT bluegl_glUniform3uivEXT +#define glUniform4uivEXT bluegl_glUniform4uivEXT +#define glGetHistogramEXT bluegl_glGetHistogramEXT +#define glGetHistogramParameterfvEXT bluegl_glGetHistogramParameterfvEXT +#define glGetHistogramParameterivEXT bluegl_glGetHistogramParameterivEXT +#define glGetMinmaxEXT bluegl_glGetMinmaxEXT #define glGetMinmaxParameterfvEXT bluegl_glGetMinmaxParameterfvEXT -#define glMultiTexCoord4sARB bluegl_glMultiTexCoord4sARB -#define glDrawElementsInstancedBaseVertexBaseInstance bluegl_glDrawElementsInstancedBaseVertexBaseInstance -#define glVDPAUSurfaceAccessNV bluegl_glVDPAUSurfaceAccessNV -#define glMultiTexCoord2iARB bluegl_glMultiTexCoord2iARB -#define glPathCommandsNV bluegl_glPathCommandsNV -#define glSetMultisamplefvAMD bluegl_glSetMultisamplefvAMD -#define glVertexStream3ivATI bluegl_glVertexStream3ivATI -#define glVDPAUUnregisterSurfaceNV bluegl_glVDPAUUnregisterSurfaceNV -#define glTextureRenderbufferEXT bluegl_glTextureRenderbufferEXT -#define glProgramLocalParameter4dARB bluegl_glProgramLocalParameter4dARB -#define glBindVertexShaderEXT bluegl_glBindVertexShaderEXT -#define glEnableVariantClientStateEXT bluegl_glEnableVariantClientStateEXT -#define glGetPointerIndexedvEXT bluegl_glGetPointerIndexedvEXT -#define glMultiTexEnvfEXT bluegl_glMultiTexEnvfEXT -#define glFrustumxOES bluegl_glFrustumxOES -#define glAreProgramsResidentNV bluegl_glAreProgramsResidentNV -#define glFramebufferSampleLocationsfvNV bluegl_glFramebufferSampleLocationsfvNV -#define glVertexAttrib1sNV bluegl_glVertexAttrib1sNV -#define glGetActiveUniformBlockName bluegl_glGetActiveUniformBlockName -#define glVertex2xOES bluegl_glVertex2xOES +#define glGetMinmaxParameterivEXT bluegl_glGetMinmaxParameterivEXT +#define glHistogramEXT bluegl_glHistogramEXT +#define glMinmaxEXT bluegl_glMinmaxEXT +#define glResetHistogramEXT bluegl_glResetHistogramEXT #define glResetMinmaxEXT bluegl_glResetMinmaxEXT -#define glMatrixOrthoEXT bluegl_glMatrixOrthoEXT -#define glUniform4ui64vNV bluegl_glUniform4ui64vNV -#define glProgramUniformMatrix4x3fvEXT bluegl_glProgramUniformMatrix4x3fvEXT -#define glVertexAttribs1svNV bluegl_glVertexAttribs1svNV -#define glDebugMessageCallbackAMD bluegl_glDebugMessageCallbackAMD -#define glProgramUniform1uiEXT bluegl_glProgramUniform1uiEXT -#define glTexBufferEXT bluegl_glTexBufferEXT -#define glUniform4f bluegl_glUniform4f -#define glUpdateObjectBufferATI bluegl_glUpdateObjectBufferATI -#define glProgramUniform1iEXT bluegl_glProgramUniform1iEXT -#define glGetMultiTexEnvfvEXT bluegl_glGetMultiTexEnvfvEXT -#define glVertexAttribL2d bluegl_glVertexAttribL2d -#define glConvolutionParameterxOES bluegl_glConvolutionParameterxOES -#define glGetVertexAttribArrayObjectivATI bluegl_glGetVertexAttribArrayObjectivATI -#define glGetListParameterfvSGIX bluegl_glGetListParameterfvSGIX -#define glInstrumentsBufferSGIX bluegl_glInstrumentsBufferSGIX -#define glDeleteNamesAMD bluegl_glDeleteNamesAMD -#define glGetSubroutineIndex bluegl_glGetSubroutineIndex -#define glVideoCaptureStreamParameterivNV bluegl_glVideoCaptureStreamParameterivNV -#define glMultiTexCoord4i bluegl_glMultiTexCoord4i -#define glGetFramebufferParameteriv bluegl_glGetFramebufferParameteriv -#define glVertexAttrib2hvNV bluegl_glVertexAttrib2hvNV -#define glMakeBufferNonResidentNV bluegl_glMakeBufferNonResidentNV -#define glPixelDataRangeNV bluegl_glPixelDataRangeNV -#define glNamedBufferDataEXT bluegl_glNamedBufferDataEXT -#define glIsImageHandleResidentARB bluegl_glIsImageHandleResidentARB -#define glFrustumfOES bluegl_glFrustumfOES -#define glGetArrayObjectivATI bluegl_glGetArrayObjectivATI -#define glMultiTexParameterIuivEXT bluegl_glMultiTexParameterIuivEXT -#define glGetMapParameterfvNV bluegl_glGetMapParameterfvNV -#define glMultTransposeMatrixxOES bluegl_glMultTransposeMatrixxOES -#define glGetPerfMonitorCounterDataAMD bluegl_glGetPerfMonitorCounterDataAMD -#define glClearDepthxOES bluegl_glClearDepthxOES -#define glColor3xvOES bluegl_glColor3xvOES -#define glVertexAttribI4ivEXT bluegl_glVertexAttribI4ivEXT -#define glMultiTexCoordP4uiv bluegl_glMultiTexCoordP4uiv -#define glVertexAttribI4usv bluegl_glVertexAttribI4usv -#define glGetnTexImage bluegl_glGetnTexImage -#define glReadBuffer bluegl_glReadBuffer -#define glUniform3iARB bluegl_glUniform3iARB -#define glMultiTexBufferEXT bluegl_glMultiTexBufferEXT -#define glNormalStream3fvATI bluegl_glNormalStream3fvATI -#define glDeleteVertexShaderEXT bluegl_glDeleteVertexShaderEXT -#define glVertexAttrib3hvNV bluegl_glVertexAttrib3hvNV -#define glDrawMeshArraysSUN bluegl_glDrawMeshArraysSUN -#define glVertexAttribL3dvEXT bluegl_glVertexAttribL3dvEXT -#define glReplacementCodeuiColor3fVertex3fSUN bluegl_glReplacementCodeuiColor3fVertex3fSUN -#define glProgramUniform1fv bluegl_glProgramUniform1fv -#define glNormal3xvOES bluegl_glNormal3xvOES -#define glGetProgramStageiv bluegl_glGetProgramStageiv -#define glUniform2ui64NV bluegl_glUniform2ui64NV -#define glProgramEnvParameter4fARB bluegl_glProgramEnvParameter4fARB +#define glIndexFuncEXT bluegl_glIndexFuncEXT +#define glIndexMaterialEXT bluegl_glIndexMaterialEXT +#define glApplyTextureEXT bluegl_glApplyTextureEXT +#define glTextureLightEXT bluegl_glTextureLightEXT +#define glTextureMaterialEXT bluegl_glTextureMaterialEXT +#define glMultiDrawArraysEXT bluegl_glMultiDrawArraysEXT +#define glMultiDrawElementsEXT bluegl_glMultiDrawElementsEXT +#define glSampleMaskEXT bluegl_glSampleMaskEXT +#define glSamplePatternEXT bluegl_glSamplePatternEXT +#define glColorTableEXT bluegl_glColorTableEXT +#define glGetColorTableEXT bluegl_glGetColorTableEXT +#define glGetColorTableParameterivEXT bluegl_glGetColorTableParameterivEXT +#define glGetColorTableParameterfvEXT bluegl_glGetColorTableParameterfvEXT +#define glPixelTransformParameteriEXT bluegl_glPixelTransformParameteriEXT +#define glPixelTransformParameterfEXT bluegl_glPixelTransformParameterfEXT #define glPixelTransformParameterivEXT bluegl_glPixelTransformParameterivEXT -#define glWindowPos4dvMESA bluegl_glWindowPos4dvMESA -#define glMultiDrawElementsIndirectBindlessCountNV bluegl_glMultiDrawElementsIndirectBindlessCountNV -#define glUniform3i64vARB bluegl_glUniform3i64vARB -#define glTextureStorage3DMultisample bluegl_glTextureStorage3DMultisample -#define glGetNamedBufferParameterui64vNV bluegl_glGetNamedBufferParameterui64vNV -#define glEndTransformFeedback bluegl_glEndTransformFeedback -#define glVertexAttribI3ivEXT bluegl_glVertexAttribI3ivEXT -#define glUniform2f bluegl_glUniform2f -#define glMultiTexCoord1dARB bluegl_glMultiTexCoord1dARB -#define glGetColorTableParameterfv bluegl_glGetColorTableParameterfv -#define glWindowPos3d bluegl_glWindowPos3d -#define glVertexAttribL3ui64vNV bluegl_glVertexAttribL3ui64vNV -#define glReplacementCodeuiSUN bluegl_glReplacementCodeuiSUN -#define glColor4ubVertex3fSUN bluegl_glColor4ubVertex3fSUN -#define glDrawRangeElementsBaseVertex bluegl_glDrawRangeElementsBaseVertex -#define glGetMultiTexParameterivEXT bluegl_glGetMultiTexParameterivEXT -#define glMultiTexCoord3hvNV bluegl_glMultiTexCoord3hvNV -#define glGetQueryBufferObjectuiv bluegl_glGetQueryBufferObjectuiv -#define glGetPerfMonitorGroupsAMD bluegl_glGetPerfMonitorGroupsAMD -#define glUnlockArraysEXT bluegl_glUnlockArraysEXT -#define glPauseTransformFeedback bluegl_glPauseTransformFeedback -#define glGetProgramEnvParameterIivNV bluegl_glGetProgramEnvParameterIivNV -#define glPathTexGenNV bluegl_glPathTexGenNV -#define glVertex3xOES bluegl_glVertex3xOES +#define glPixelTransformParameterfvEXT bluegl_glPixelTransformParameterfvEXT +#define glGetPixelTransformParameterivEXT bluegl_glGetPixelTransformParameterivEXT +#define glGetPixelTransformParameterfvEXT bluegl_glGetPixelTransformParameterfvEXT +#define glPointParameterfEXT bluegl_glPointParameterfEXT +#define glPointParameterfvEXT bluegl_glPointParameterfvEXT +#define glPolygonOffsetEXT bluegl_glPolygonOffsetEXT +#define glPolygonOffsetClampEXT bluegl_glPolygonOffsetClampEXT +#define glProvokingVertexEXT bluegl_glProvokingVertexEXT +#define glRasterSamplesEXT bluegl_glRasterSamplesEXT +#define glSecondaryColor3bEXT bluegl_glSecondaryColor3bEXT +#define glSecondaryColor3bvEXT bluegl_glSecondaryColor3bvEXT +#define glSecondaryColor3dEXT bluegl_glSecondaryColor3dEXT +#define glSecondaryColor3dvEXT bluegl_glSecondaryColor3dvEXT +#define glSecondaryColor3fEXT bluegl_glSecondaryColor3fEXT +#define glSecondaryColor3fvEXT bluegl_glSecondaryColor3fvEXT +#define glSecondaryColor3iEXT bluegl_glSecondaryColor3iEXT +#define glSecondaryColor3ivEXT bluegl_glSecondaryColor3ivEXT +#define glSecondaryColor3sEXT bluegl_glSecondaryColor3sEXT +#define glSecondaryColor3svEXT bluegl_glSecondaryColor3svEXT +#define glSecondaryColor3ubEXT bluegl_glSecondaryColor3ubEXT +#define glSecondaryColor3ubvEXT bluegl_glSecondaryColor3ubvEXT +#define glSecondaryColor3uiEXT bluegl_glSecondaryColor3uiEXT +#define glSecondaryColor3uivEXT bluegl_glSecondaryColor3uivEXT +#define glSecondaryColor3usEXT bluegl_glSecondaryColor3usEXT +#define glSecondaryColor3usvEXT bluegl_glSecondaryColor3usvEXT +#define glSecondaryColorPointerEXT bluegl_glSecondaryColorPointerEXT +#define glUseShaderProgramEXT bluegl_glUseShaderProgramEXT +#define glActiveProgramEXT bluegl_glActiveProgramEXT +#define glCreateShaderProgramEXT bluegl_glCreateShaderProgramEXT +#define glBindImageTextureEXT bluegl_glBindImageTextureEXT +#define glMemoryBarrierEXT bluegl_glMemoryBarrierEXT +#define glStencilClearTagEXT bluegl_glStencilClearTagEXT +#define glActiveStencilFaceEXT bluegl_glActiveStencilFaceEXT +#define glTexSubImage1DEXT bluegl_glTexSubImage1DEXT +#define glTexSubImage2DEXT bluegl_glTexSubImage2DEXT +#define glTexImage3DEXT bluegl_glTexImage3DEXT +#define glTexSubImage3DEXT bluegl_glTexSubImage3DEXT +#define glFramebufferTextureLayerEXT bluegl_glFramebufferTextureLayerEXT +#define glTexBufferEXT bluegl_glTexBufferEXT +#define glTexParameterIivEXT bluegl_glTexParameterIivEXT +#define glTexParameterIuivEXT bluegl_glTexParameterIuivEXT +#define glGetTexParameterIivEXT bluegl_glGetTexParameterIivEXT +#define glGetTexParameterIuivEXT bluegl_glGetTexParameterIuivEXT +#define glClearColorIiEXT bluegl_glClearColorIiEXT +#define glClearColorIuiEXT bluegl_glClearColorIuiEXT +#define glAreTexturesResidentEXT bluegl_glAreTexturesResidentEXT +#define glBindTextureEXT bluegl_glBindTextureEXT +#define glDeleteTexturesEXT bluegl_glDeleteTexturesEXT +#define glGenTexturesEXT bluegl_glGenTexturesEXT +#define glIsTextureEXT bluegl_glIsTextureEXT +#define glPrioritizeTexturesEXT bluegl_glPrioritizeTexturesEXT +#define glTextureNormalEXT bluegl_glTextureNormalEXT +#define glGetQueryObjecti64vEXT bluegl_glGetQueryObjecti64vEXT +#define glGetQueryObjectui64vEXT bluegl_glGetQueryObjectui64vEXT +#define glBeginTransformFeedbackEXT bluegl_glBeginTransformFeedbackEXT +#define glEndTransformFeedbackEXT bluegl_glEndTransformFeedbackEXT +#define glBindBufferRangeEXT bluegl_glBindBufferRangeEXT +#define glBindBufferOffsetEXT bluegl_glBindBufferOffsetEXT +#define glBindBufferBaseEXT bluegl_glBindBufferBaseEXT +#define glTransformFeedbackVaryingsEXT bluegl_glTransformFeedbackVaryingsEXT +#define glGetTransformFeedbackVaryingEXT bluegl_glGetTransformFeedbackVaryingEXT +#define glArrayElementEXT bluegl_glArrayElementEXT +#define glColorPointerEXT bluegl_glColorPointerEXT +#define glDrawArraysEXT bluegl_glDrawArraysEXT #define glEdgeFlagPointerEXT bluegl_glEdgeFlagPointerEXT -#define glVertexAttribBinding bluegl_glVertexAttribBinding -#define glVertexAttrib3f bluegl_glVertexAttrib3f -#define glVertexAttrib4NubARB bluegl_glVertexAttrib4NubARB -#define glWindowPos2svMESA bluegl_glWindowPos2svMESA -#define glGetUniformSubroutineuiv bluegl_glGetUniformSubroutineuiv -#define glMultiTexCoord2ivARB bluegl_glMultiTexCoord2ivARB -#define glFragmentMaterialivSGIX bluegl_glFragmentMaterialivSGIX -#define glSamplerParameteriv bluegl_glSamplerParameteriv -#define glVertexArrayColorOffsetEXT bluegl_glVertexArrayColorOffsetEXT -#define glVertexAttrib3sNV bluegl_glVertexAttrib3sNV -#define glDrawElementsInstanced bluegl_glDrawElementsInstanced -#define glCreateSyncFromCLeventARB bluegl_glCreateSyncFromCLeventARB -#define glInsertEventMarkerEXT bluegl_glInsertEventMarkerEXT -#define glGetTextureParameterfv bluegl_glGetTextureParameterfv -#define glCopyMultiTexImage2DEXT bluegl_glCopyMultiTexImage2DEXT -#define glVertexWeightfEXT bluegl_glVertexWeightfEXT -#define glUniform4i64vARB bluegl_glUniform4i64vARB -#define glGetPathParameterfvNV bluegl_glGetPathParameterfvNV -#define glBlitNamedFramebuffer bluegl_glBlitNamedFramebuffer +#define glGetPointervEXT bluegl_glGetPointervEXT +#define glIndexPointerEXT bluegl_glIndexPointerEXT +#define glNormalPointerEXT bluegl_glNormalPointerEXT #define glTexCoordPointerEXT bluegl_glTexCoordPointerEXT -#define glGetPathMetricsNV bluegl_glGetPathMetricsNV +#define glVertexPointerEXT bluegl_glVertexPointerEXT +#define glVertexAttribL1dEXT bluegl_glVertexAttribL1dEXT +#define glVertexAttribL2dEXT bluegl_glVertexAttribL2dEXT +#define glVertexAttribL3dEXT bluegl_glVertexAttribL3dEXT +#define glVertexAttribL4dEXT bluegl_glVertexAttribL4dEXT +#define glVertexAttribL1dvEXT bluegl_glVertexAttribL1dvEXT #define glVertexAttribL2dvEXT bluegl_glVertexAttribL2dvEXT +#define glVertexAttribL3dvEXT bluegl_glVertexAttribL3dvEXT +#define glVertexAttribL4dvEXT bluegl_glVertexAttribL4dvEXT +#define glVertexAttribLPointerEXT bluegl_glVertexAttribLPointerEXT +#define glGetVertexAttribLdvEXT bluegl_glGetVertexAttribLdvEXT +#define glBeginVertexShaderEXT bluegl_glBeginVertexShaderEXT +#define glEndVertexShaderEXT bluegl_glEndVertexShaderEXT +#define glBindVertexShaderEXT bluegl_glBindVertexShaderEXT +#define glGenVertexShadersEXT bluegl_glGenVertexShadersEXT +#define glDeleteVertexShaderEXT bluegl_glDeleteVertexShaderEXT +#define glShaderOp1EXT bluegl_glShaderOp1EXT +#define glShaderOp2EXT bluegl_glShaderOp2EXT +#define glShaderOp3EXT bluegl_glShaderOp3EXT +#define glSwizzleEXT bluegl_glSwizzleEXT +#define glWriteMaskEXT bluegl_glWriteMaskEXT +#define glInsertComponentEXT bluegl_glInsertComponentEXT +#define glExtractComponentEXT bluegl_glExtractComponentEXT +#define glGenSymbolsEXT bluegl_glGenSymbolsEXT +#define glSetInvariantEXT bluegl_glSetInvariantEXT +#define glSetLocalConstantEXT bluegl_glSetLocalConstantEXT +#define glVariantbvEXT bluegl_glVariantbvEXT +#define glVariantsvEXT bluegl_glVariantsvEXT +#define glVariantivEXT bluegl_glVariantivEXT +#define glVariantfvEXT bluegl_glVariantfvEXT +#define glVariantdvEXT bluegl_glVariantdvEXT +#define glVariantubvEXT bluegl_glVariantubvEXT +#define glVariantusvEXT bluegl_glVariantusvEXT #define glVariantuivEXT bluegl_glVariantuivEXT -#define glGetVertexAttribdvNV bluegl_glGetVertexAttribdvNV -#define glFenceSync bluegl_glFenceSync -#define glGetTextureParameterIuiv bluegl_glGetTextureParameterIuiv -#define glMultiTexCoord2sARB bluegl_glMultiTexCoord2sARB -#define glUniform2i64NV bluegl_glUniform2i64NV -#define glDeformationMap3dSGIX bluegl_glDeformationMap3dSGIX -#define glDrawRangeElementArrayAPPLE bluegl_glDrawRangeElementArrayAPPLE -#define glDepthFunc bluegl_glDepthFunc -#define glProgramUniform3dvEXT bluegl_glProgramUniform3dvEXT -#define glTexCoord3hvNV bluegl_glTexCoord3hvNV -#define glGetPathLengthNV bluegl_glGetPathLengthNV -#define glUnmapObjectBufferATI bluegl_glUnmapObjectBufferATI -#define glValidateProgramPipeline bluegl_glValidateProgramPipeline -#define glIsProgram bluegl_glIsProgram -#define glVertexAttrib4hvNV bluegl_glVertexAttrib4hvNV -#define glLoadTransposeMatrixdARB bluegl_glLoadTransposeMatrixdARB -#define glMapVertexAttrib2dAPPLE bluegl_glMapVertexAttrib2dAPPLE -#define glProgramBinary bluegl_glProgramBinary -#define glUniform3i bluegl_glUniform3i -#define glProgramUniform2dEXT bluegl_glProgramUniform2dEXT -#define glDepthRangeIndexed bluegl_glDepthRangeIndexed -#define glEvalCoord1xOES bluegl_glEvalCoord1xOES -#define glVertexArrayRangeAPPLE bluegl_glVertexArrayRangeAPPLE -#define glVertexStream1svATI bluegl_glVertexStream1svATI -#define glNormalStream3iATI bluegl_glNormalStream3iATI -#define glProgramUniform4f bluegl_glProgramUniform4f -#define glScalexOES bluegl_glScalexOES -#define glUniform1fv bluegl_glUniform1fv -#define glGetActiveUniform bluegl_glGetActiveUniform -#define glProgramUniformMatrix4x3fv bluegl_glProgramUniformMatrix4x3fv -#define glCreateVertexArrays bluegl_glCreateVertexArrays -#define glWindowPos3dv bluegl_glWindowPos3dv -#define glUniform1fARB bluegl_glUniform1fARB -#define glFragmentMaterialiSGIX bluegl_glFragmentMaterialiSGIX -#define glGetVertexAttribArrayObjectfvATI bluegl_glGetVertexAttribArrayObjectfvATI -#define glClearAccumxOES bluegl_glClearAccumxOES -#define glBindFragDataLocationEXT bluegl_glBindFragDataLocationEXT -#define glMultiTexCoord4dARB bluegl_glMultiTexCoord4dARB -#define glConvolutionParameterfv bluegl_glConvolutionParameterfv -#define glFragmentColorMaterialSGIX bluegl_glFragmentColorMaterialSGIX -#define glUniformMatrix3dv bluegl_glUniformMatrix3dv -#define glGetnPixelMapusv bluegl_glGetnPixelMapusv -#define glFramebufferTextureLayer bluegl_glFramebufferTextureLayer -#define glStencilThenCoverStrokePathInstancedNV bluegl_glStencilThenCoverStrokePathInstancedNV -#define glVDPAURegisterOutputSurfaceNV bluegl_glVDPAURegisterOutputSurfaceNV -#define glMultiTexCoord4dvARB bluegl_glMultiTexCoord4dvARB -#define glCopyTextureSubImage3D bluegl_glCopyTextureSubImage3D +#define glVariantPointerEXT bluegl_glVariantPointerEXT +#define glEnableVariantClientStateEXT bluegl_glEnableVariantClientStateEXT +#define glDisableVariantClientStateEXT bluegl_glDisableVariantClientStateEXT +#define glBindLightParameterEXT bluegl_glBindLightParameterEXT +#define glBindMaterialParameterEXT bluegl_glBindMaterialParameterEXT +#define glBindTexGenParameterEXT bluegl_glBindTexGenParameterEXT +#define glBindTextureUnitParameterEXT bluegl_glBindTextureUnitParameterEXT +#define glBindParameterEXT bluegl_glBindParameterEXT +#define glIsVariantEnabledEXT bluegl_glIsVariantEnabledEXT +#define glGetVariantBooleanvEXT bluegl_glGetVariantBooleanvEXT #define glGetVariantIntegervEXT bluegl_glGetVariantIntegervEXT -#define glGetTexEnvxvOES bluegl_glGetTexEnvxvOES -#define glGetFloati_vEXT bluegl_glGetFloati_vEXT -#define glAsyncMarkerSGIX bluegl_glAsyncMarkerSGIX -#define glTexCoord4fColor4fNormal3fVertex4fvSUN bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN +#define glGetVariantFloatvEXT bluegl_glGetVariantFloatvEXT +#define glGetVariantPointervEXT bluegl_glGetVariantPointervEXT +#define glGetInvariantBooleanvEXT bluegl_glGetInvariantBooleanvEXT +#define glGetInvariantIntegervEXT bluegl_glGetInvariantIntegervEXT +#define glGetInvariantFloatvEXT bluegl_glGetInvariantFloatvEXT +#define glGetLocalConstantBooleanvEXT bluegl_glGetLocalConstantBooleanvEXT +#define glGetLocalConstantIntegervEXT bluegl_glGetLocalConstantIntegervEXT +#define glGetLocalConstantFloatvEXT bluegl_glGetLocalConstantFloatvEXT +#define glVertexWeightfEXT bluegl_glVertexWeightfEXT +#define glVertexWeightfvEXT bluegl_glVertexWeightfvEXT +#define glVertexWeightPointerEXT bluegl_glVertexWeightPointerEXT +#define glImportSyncEXT bluegl_glImportSyncEXT +#define glFrameTerminatorGREMEDY bluegl_glFrameTerminatorGREMEDY +#define glStringMarkerGREMEDY bluegl_glStringMarkerGREMEDY +#define glImageTransformParameteriHP bluegl_glImageTransformParameteriHP +#define glImageTransformParameterfHP bluegl_glImageTransformParameterfHP +#define glImageTransformParameterivHP bluegl_glImageTransformParameterivHP +#define glImageTransformParameterfvHP bluegl_glImageTransformParameterfvHP +#define glGetImageTransformParameterivHP bluegl_glGetImageTransformParameterivHP +#define glGetImageTransformParameterfvHP bluegl_glGetImageTransformParameterfvHP +#define glMultiModeDrawArraysIBM bluegl_glMultiModeDrawArraysIBM +#define glMultiModeDrawElementsIBM bluegl_glMultiModeDrawElementsIBM +#define glFlushStaticDataIBM bluegl_glFlushStaticDataIBM +#define glColorPointerListIBM bluegl_glColorPointerListIBM +#define glSecondaryColorPointerListIBM bluegl_glSecondaryColorPointerListIBM +#define glEdgeFlagPointerListIBM bluegl_glEdgeFlagPointerListIBM +#define glFogCoordPointerListIBM bluegl_glFogCoordPointerListIBM +#define glIndexPointerListIBM bluegl_glIndexPointerListIBM +#define glNormalPointerListIBM bluegl_glNormalPointerListIBM +#define glTexCoordPointerListIBM bluegl_glTexCoordPointerListIBM +#define glVertexPointerListIBM bluegl_glVertexPointerListIBM +#define glBlendFuncSeparateINGR bluegl_glBlendFuncSeparateINGR +#define glApplyFramebufferAttachmentCMAAINTEL bluegl_glApplyFramebufferAttachmentCMAAINTEL +#define glSyncTextureINTEL bluegl_glSyncTextureINTEL +#define glUnmapTexture2DINTEL bluegl_glUnmapTexture2DINTEL +#define glMapTexture2DINTEL bluegl_glMapTexture2DINTEL +#define glVertexPointervINTEL bluegl_glVertexPointervINTEL +#define glNormalPointervINTEL bluegl_glNormalPointervINTEL +#define glColorPointervINTEL bluegl_glColorPointervINTEL +#define glTexCoordPointervINTEL bluegl_glTexCoordPointervINTEL +#define glBeginPerfQueryINTEL bluegl_glBeginPerfQueryINTEL +#define glCreatePerfQueryINTEL bluegl_glCreatePerfQueryINTEL +#define glDeletePerfQueryINTEL bluegl_glDeletePerfQueryINTEL +#define glEndPerfQueryINTEL bluegl_glEndPerfQueryINTEL +#define glGetFirstPerfQueryIdINTEL bluegl_glGetFirstPerfQueryIdINTEL +#define glGetNextPerfQueryIdINTEL bluegl_glGetNextPerfQueryIdINTEL +#define glGetPerfCounterInfoINTEL bluegl_glGetPerfCounterInfoINTEL +#define glGetPerfQueryDataINTEL bluegl_glGetPerfQueryDataINTEL +#define glGetPerfQueryIdByNameINTEL bluegl_glGetPerfQueryIdByNameINTEL +#define glGetPerfQueryInfoINTEL bluegl_glGetPerfQueryInfoINTEL +#define glResizeBuffersMESA bluegl_glResizeBuffersMESA +#define glWindowPos2dMESA bluegl_glWindowPos2dMESA +#define glWindowPos2dvMESA bluegl_glWindowPos2dvMESA +#define glWindowPos2fMESA bluegl_glWindowPos2fMESA +#define glWindowPos2fvMESA bluegl_glWindowPos2fvMESA +#define glWindowPos2iMESA bluegl_glWindowPos2iMESA +#define glWindowPos2ivMESA bluegl_glWindowPos2ivMESA +#define glWindowPos2sMESA bluegl_glWindowPos2sMESA +#define glWindowPos2svMESA bluegl_glWindowPos2svMESA +#define glWindowPos3dMESA bluegl_glWindowPos3dMESA +#define glWindowPos3dvMESA bluegl_glWindowPos3dvMESA +#define glWindowPos3fMESA bluegl_glWindowPos3fMESA +#define glWindowPos3fvMESA bluegl_glWindowPos3fvMESA +#define glWindowPos3iMESA bluegl_glWindowPos3iMESA +#define glWindowPos3ivMESA bluegl_glWindowPos3ivMESA +#define glWindowPos3sMESA bluegl_glWindowPos3sMESA +#define glWindowPos3svMESA bluegl_glWindowPos3svMESA +#define glWindowPos4dMESA bluegl_glWindowPos4dMESA +#define glWindowPos4dvMESA bluegl_glWindowPos4dvMESA +#define glWindowPos4fMESA bluegl_glWindowPos4fMESA +#define glWindowPos4fvMESA bluegl_glWindowPos4fvMESA +#define glWindowPos4iMESA bluegl_glWindowPos4iMESA +#define glWindowPos4ivMESA bluegl_glWindowPos4ivMESA +#define glWindowPos4sMESA bluegl_glWindowPos4sMESA +#define glWindowPos4svMESA bluegl_glWindowPos4svMESA +#define glBeginConditionalRenderNVX bluegl_glBeginConditionalRenderNVX +#define glEndConditionalRenderNVX bluegl_glEndConditionalRenderNVX +#define glMultiDrawArraysIndirectBindlessNV bluegl_glMultiDrawArraysIndirectBindlessNV +#define glMultiDrawElementsIndirectBindlessNV bluegl_glMultiDrawElementsIndirectBindlessNV +#define glMultiDrawArraysIndirectBindlessCountNV bluegl_glMultiDrawArraysIndirectBindlessCountNV +#define glMultiDrawElementsIndirectBindlessCountNV bluegl_glMultiDrawElementsIndirectBindlessCountNV +#define glGetTextureHandleNV bluegl_glGetTextureHandleNV +#define glGetTextureSamplerHandleNV bluegl_glGetTextureSamplerHandleNV +#define glMakeTextureHandleResidentNV bluegl_glMakeTextureHandleResidentNV +#define glMakeTextureHandleNonResidentNV bluegl_glMakeTextureHandleNonResidentNV +#define glGetImageHandleNV bluegl_glGetImageHandleNV +#define glMakeImageHandleResidentNV bluegl_glMakeImageHandleResidentNV +#define glMakeImageHandleNonResidentNV bluegl_glMakeImageHandleNonResidentNV +#define glUniformHandleui64NV bluegl_glUniformHandleui64NV +#define glUniformHandleui64vNV bluegl_glUniformHandleui64vNV +#define glProgramUniformHandleui64NV bluegl_glProgramUniformHandleui64NV +#define glProgramUniformHandleui64vNV bluegl_glProgramUniformHandleui64vNV +#define glIsTextureHandleResidentNV bluegl_glIsTextureHandleResidentNV +#define glIsImageHandleResidentNV bluegl_glIsImageHandleResidentNV +#define glBlendParameteriNV bluegl_glBlendParameteriNV +#define glBlendBarrierNV bluegl_glBlendBarrierNV +#define glCreateStatesNV bluegl_glCreateStatesNV +#define glDeleteStatesNV bluegl_glDeleteStatesNV +#define glIsStateNV bluegl_glIsStateNV +#define glStateCaptureNV bluegl_glStateCaptureNV +#define glGetCommandHeaderNV bluegl_glGetCommandHeaderNV +#define glGetStageIndexNV bluegl_glGetStageIndexNV +#define glDrawCommandsNV bluegl_glDrawCommandsNV +#define glDrawCommandsAddressNV bluegl_glDrawCommandsAddressNV +#define glDrawCommandsStatesNV bluegl_glDrawCommandsStatesNV +#define glDrawCommandsStatesAddressNV bluegl_glDrawCommandsStatesAddressNV +#define glCreateCommandListsNV bluegl_glCreateCommandListsNV +#define glDeleteCommandListsNV bluegl_glDeleteCommandListsNV +#define glIsCommandListNV bluegl_glIsCommandListNV +#define glListDrawCommandsStatesClientNV bluegl_glListDrawCommandsStatesClientNV +#define glCommandListSegmentsNV bluegl_glCommandListSegmentsNV +#define glCompileCommandListNV bluegl_glCompileCommandListNV +#define glCallCommandListNV bluegl_glCallCommandListNV +#define glBeginConditionalRenderNV bluegl_glBeginConditionalRenderNV +#define glEndConditionalRenderNV bluegl_glEndConditionalRenderNV +#define glSubpixelPrecisionBiasNV bluegl_glSubpixelPrecisionBiasNV +#define glConservativeRasterParameterfNV bluegl_glConservativeRasterParameterfNV +#define glCopyImageSubDataNV bluegl_glCopyImageSubDataNV +#define glDepthRangedNV bluegl_glDepthRangedNV +#define glClearDepthdNV bluegl_glClearDepthdNV +#define glDepthBoundsdNV bluegl_glDepthBoundsdNV +#define glDrawTextureNV bluegl_glDrawTextureNV +#define glMapControlPointsNV bluegl_glMapControlPointsNV +#define glMapParameterivNV bluegl_glMapParameterivNV +#define glMapParameterfvNV bluegl_glMapParameterfvNV +#define glGetMapControlPointsNV bluegl_glGetMapControlPointsNV +#define glGetMapParameterivNV bluegl_glGetMapParameterivNV +#define glGetMapParameterfvNV bluegl_glGetMapParameterfvNV +#define glGetMapAttribParameterivNV bluegl_glGetMapAttribParameterivNV +#define glGetMapAttribParameterfvNV bluegl_glGetMapAttribParameterfvNV +#define glEvalMapsNV bluegl_glEvalMapsNV +#define glGetMultisamplefvNV bluegl_glGetMultisamplefvNV +#define glSampleMaskIndexedNV bluegl_glSampleMaskIndexedNV #define glTexRenderbufferNV bluegl_glTexRenderbufferNV -#define glGetConvolutionParameterfvEXT bluegl_glGetConvolutionParameterfvEXT -#define glLightxvOES bluegl_glLightxvOES -#define glDeleteNamedStringARB bluegl_glDeleteNamedStringARB -#define glColor3hvNV bluegl_glColor3hvNV -#define glUniformMatrix4dv bluegl_glUniformMatrix4dv -#define glCompressedTexImage2DARB bluegl_glCompressedTexImage2DARB -#define glGenTexturesEXT bluegl_glGenTexturesEXT -#define glPathMemoryGlyphIndexArrayNV bluegl_glPathMemoryGlyphIndexArrayNV -#define glGetBufferSubDataARB bluegl_glGetBufferSubDataARB -#define glFinishObjectAPPLE bluegl_glFinishObjectAPPLE -#define glDetachShader bluegl_glDetachShader -#define glBindTexture bluegl_glBindTexture -#define glGetProgramResourcefvNV bluegl_glGetProgramResourcefvNV -#define glTexCoord2fColor4ubVertex3fvSUN bluegl_glTexCoord2fColor4ubVertex3fvSUN -#define glMultiTexCoord4dv bluegl_glMultiTexCoord4dv -#define glIsPointInFillPathNV bluegl_glIsPointInFillPathNV -#define glDrawTransformFeedbackInstanced bluegl_glDrawTransformFeedbackInstanced -#define glProgramParameteriARB bluegl_glProgramParameteriARB -#define glVertexAttrib3fvNV bluegl_glVertexAttrib3fvNV -#define glEnableVertexArrayAttrib bluegl_glEnableVertexArrayAttrib -#define glUniform3ui64vNV bluegl_glUniform3ui64vNV -#define glVertexAttribs4fvNV bluegl_glVertexAttribs4fvNV -#define glGetCompressedTextureImageEXT bluegl_glGetCompressedTextureImageEXT -#define glVertex3bOES bluegl_glVertex3bOES +#define glDeleteFencesNV bluegl_glDeleteFencesNV +#define glGenFencesNV bluegl_glGenFencesNV +#define glIsFenceNV bluegl_glIsFenceNV +#define glTestFenceNV bluegl_glTestFenceNV +#define glGetFenceivNV bluegl_glGetFenceivNV +#define glFinishFenceNV bluegl_glFinishFenceNV +#define glSetFenceNV bluegl_glSetFenceNV +#define glFragmentCoverageColorNV bluegl_glFragmentCoverageColorNV +#define glProgramNamedParameter4fNV bluegl_glProgramNamedParameter4fNV +#define glProgramNamedParameter4fvNV bluegl_glProgramNamedParameter4fvNV +#define glProgramNamedParameter4dNV bluegl_glProgramNamedParameter4dNV +#define glProgramNamedParameter4dvNV bluegl_glProgramNamedParameter4dvNV +#define glGetProgramNamedParameterfvNV bluegl_glGetProgramNamedParameterfvNV +#define glGetProgramNamedParameterdvNV bluegl_glGetProgramNamedParameterdvNV +#define glCoverageModulationTableNV bluegl_glCoverageModulationTableNV +#define glGetCoverageModulationTableNV bluegl_glGetCoverageModulationTableNV +#define glCoverageModulationNV bluegl_glCoverageModulationNV +#define glRenderbufferStorageMultisampleCoverageNV bluegl_glRenderbufferStorageMultisampleCoverageNV +#define glProgramVertexLimitNV bluegl_glProgramVertexLimitNV +#define glFramebufferTextureEXT bluegl_glFramebufferTextureEXT +#define glFramebufferTextureFaceEXT bluegl_glFramebufferTextureFaceEXT +#define glProgramLocalParameterI4iNV bluegl_glProgramLocalParameterI4iNV #define glProgramLocalParameterI4ivNV bluegl_glProgramLocalParameterI4ivNV -#define glWindowPos2fMESA bluegl_glWindowPos2fMESA -#define glWeightusvARB bluegl_glWeightusvARB -#define glGenOcclusionQueriesNV bluegl_glGenOcclusionQueriesNV -#define glTexCoordPointervINTEL bluegl_glTexCoordPointervINTEL -#define glGetTextureParameterIivEXT bluegl_glGetTextureParameterIivEXT -#define glDeleteStatesNV bluegl_glDeleteStatesNV -#define glProgramLocalParameter4fvARB bluegl_glProgramLocalParameter4fvARB -#define glCoverFillPathInstancedNV bluegl_glCoverFillPathInstancedNV -#define glBeginConditionalRenderNVX bluegl_glBeginConditionalRenderNVX -#define glPathDashArrayNV bluegl_glPathDashArrayNV -#define glSpriteParameteriSGIX bluegl_glSpriteParameteriSGIX -#define glGetNamedProgramStringEXT bluegl_glGetNamedProgramStringEXT -#define glCombinerParameterfvNV bluegl_glCombinerParameterfvNV -#define glTexParameterxvOES bluegl_glTexParameterxvOES -#define glVertexArrayVertexAttribDivisorEXT bluegl_glVertexArrayVertexAttribDivisorEXT +#define glProgramLocalParametersI4ivNV bluegl_glProgramLocalParametersI4ivNV +#define glProgramLocalParameterI4uiNV bluegl_glProgramLocalParameterI4uiNV +#define glProgramLocalParameterI4uivNV bluegl_glProgramLocalParameterI4uivNV +#define glProgramLocalParametersI4uivNV bluegl_glProgramLocalParametersI4uivNV +#define glProgramEnvParameterI4iNV bluegl_glProgramEnvParameterI4iNV +#define glProgramEnvParameterI4ivNV bluegl_glProgramEnvParameterI4ivNV +#define glProgramEnvParametersI4ivNV bluegl_glProgramEnvParametersI4ivNV +#define glProgramEnvParameterI4uiNV bluegl_glProgramEnvParameterI4uiNV +#define glProgramEnvParameterI4uivNV bluegl_glProgramEnvParameterI4uivNV +#define glProgramEnvParametersI4uivNV bluegl_glProgramEnvParametersI4uivNV +#define glGetProgramLocalParameterIivNV bluegl_glGetProgramLocalParameterIivNV +#define glGetProgramLocalParameterIuivNV bluegl_glGetProgramLocalParameterIuivNV +#define glGetProgramEnvParameterIivNV bluegl_glGetProgramEnvParameterIivNV +#define glGetProgramEnvParameterIuivNV bluegl_glGetProgramEnvParameterIuivNV #define glProgramSubroutineParametersuivNV bluegl_glProgramSubroutineParametersuivNV -#define glDeleteObjectARB bluegl_glDeleteObjectARB -#define glProgramUniform1i64ARB bluegl_glProgramUniform1i64ARB -#define glFramebufferTextureARB bluegl_glFramebufferTextureARB -#define glElementPointerATI bluegl_glElementPointerATI -#define glUniform2i64vARB bluegl_glUniform2i64vARB -#define glGetBooleanIndexedvEXT bluegl_glGetBooleanIndexedvEXT -#define glVertexAttribP1uiv bluegl_glVertexAttribP1uiv -#define glGetDoubleIndexedvEXT bluegl_glGetDoubleIndexedvEXT -#define glGetUniformiv bluegl_glGetUniformiv -#define glVertexAttribArrayObjectATI bluegl_glVertexAttribArrayObjectATI -#define glBufferSubDataARB bluegl_glBufferSubDataARB -#define glWindowPos2fARB bluegl_glWindowPos2fARB -#define glMultiTexCoord2bvOES bluegl_glMultiTexCoord2bvOES -#define glProgramUniform2i64vARB bluegl_glProgramUniform2i64vARB -#define glTexEnvxOES bluegl_glTexEnvxOES -#define glStencilOpValueAMD bluegl_glStencilOpValueAMD -#define glUniform4ui64vARB bluegl_glUniform4ui64vARB -#define glTangent3iEXT bluegl_glTangent3iEXT -#define glGetVertexAttribLdvEXT bluegl_glGetVertexAttribLdvEXT -#define glGetCoverageModulationTableNV bluegl_glGetCoverageModulationTableNV -#define glVertexWeighthvNV bluegl_glVertexWeighthvNV -#define glWindowPos3iARB bluegl_glWindowPos3iARB -#define glVertexAttribI1iv bluegl_glVertexAttribI1iv -#define glWindowPos3fv bluegl_glWindowPos3fv -#define glVertexStream4ivATI bluegl_glVertexStream4ivATI -#define glTextureImage3DMultisampleCoverageNV bluegl_glTextureImage3DMultisampleCoverageNV -#define glUniform3f bluegl_glUniform3f -#define glAccumxOES bluegl_glAccumxOES -#define glTexStorage3D bluegl_glTexStorage3D -#define glDrawArrays bluegl_glDrawArrays -#define glSamplePatternEXT bluegl_glSamplePatternEXT -#define glNormalPointervINTEL bluegl_glNormalPointervINTEL -#define glWeightubvARB bluegl_glWeightubvARB -#define glGenProgramsNV bluegl_glGenProgramsNV -#define glDepthRangef bluegl_glDepthRangef -#define glGetProgramParameterdvNV bluegl_glGetProgramParameterdvNV -#define glPollInstrumentsSGIX bluegl_glPollInstrumentsSGIX +#define glGetProgramSubroutineParameteruivNV bluegl_glGetProgramSubroutineParameteruivNV +#define glVertex2hNV bluegl_glVertex2hNV +#define glVertex2hvNV bluegl_glVertex2hvNV +#define glVertex3hNV bluegl_glVertex3hNV +#define glVertex3hvNV bluegl_glVertex3hvNV +#define glVertex4hNV bluegl_glVertex4hNV +#define glVertex4hvNV bluegl_glVertex4hvNV +#define glNormal3hNV bluegl_glNormal3hNV +#define glNormal3hvNV bluegl_glNormal3hvNV +#define glColor3hNV bluegl_glColor3hNV +#define glColor3hvNV bluegl_glColor3hvNV +#define glColor4hNV bluegl_glColor4hNV +#define glColor4hvNV bluegl_glColor4hvNV +#define glTexCoord1hNV bluegl_glTexCoord1hNV +#define glTexCoord1hvNV bluegl_glTexCoord1hvNV +#define glTexCoord2hNV bluegl_glTexCoord2hNV +#define glTexCoord2hvNV bluegl_glTexCoord2hvNV +#define glTexCoord3hNV bluegl_glTexCoord3hNV +#define glTexCoord3hvNV bluegl_glTexCoord3hvNV +#define glTexCoord4hNV bluegl_glTexCoord4hNV +#define glTexCoord4hvNV bluegl_glTexCoord4hvNV #define glMultiTexCoord1hNV bluegl_glMultiTexCoord1hNV -#define glSecondaryColor3s bluegl_glSecondaryColor3s -#define glTexCoordP1uiv bluegl_glTexCoordP1uiv -#define glStopInstrumentsSGIX bluegl_glStopInstrumentsSGIX -#define glActiveTexture bluegl_glActiveTexture -#define glVertexAttribs2svNV bluegl_glVertexAttribs2svNV -#define glGetActiveAtomicCounterBufferiv bluegl_glGetActiveAtomicCounterBufferiv -#define glEndConditionalRenderNVX bluegl_glEndConditionalRenderNVX -#define glDrawRangeElementArrayATI bluegl_glDrawRangeElementArrayATI -#define glCopyMultiTexImage1DEXT bluegl_glCopyMultiTexImage1DEXT -#define glReplacementCodeusSUN bluegl_glReplacementCodeusSUN -#define glMultiTexGendEXT bluegl_glMultiTexGendEXT -#define glMatrixRotatefEXT bluegl_glMatrixRotatefEXT -#define glBindBufferOffsetNV bluegl_glBindBufferOffsetNV -#define glVertexAttribI1ui bluegl_glVertexAttribI1ui -#define glMakeImageHandleNonResidentARB bluegl_glMakeImageHandleNonResidentARB -#define glTextureParameteriEXT bluegl_glTextureParameteriEXT -#define glDebugMessageInsertARB bluegl_glDebugMessageInsertARB -#define glVertexAttrib4NubvARB bluegl_glVertexAttrib4NubvARB -#define glDeleteTexturesEXT bluegl_glDeleteTexturesEXT -#define glWindowPos3svARB bluegl_glWindowPos3svARB -#define glTexParameterxOES bluegl_glTexParameterxOES -#define glVertexStream3fATI bluegl_glVertexStream3fATI -#define glNormal3xOES bluegl_glNormal3xOES -#define glMultiTexCoord4bvOES bluegl_glMultiTexCoord4bvOES -#define glVertexAttribL1dv bluegl_glVertexAttribL1dv -#define glGetImageTransformParameterivHP bluegl_glGetImageTransformParameterivHP -#define glGetSubroutineUniformLocation bluegl_glGetSubroutineUniformLocation -#define glProgramEnvParameter4fvARB bluegl_glProgramEnvParameter4fvARB -#define glGetTextureImageEXT bluegl_glGetTextureImageEXT -#define glBindTexGenParameterEXT bluegl_glBindTexGenParameterEXT -#define glMinSampleShadingARB bluegl_glMinSampleShadingARB -#define glGetAttachedObjectsARB bluegl_glGetAttachedObjectsARB -#define glGetVertexArrayiv bluegl_glGetVertexArrayiv -#define glWeightfvARB bluegl_glWeightfvARB +#define glMultiTexCoord1hvNV bluegl_glMultiTexCoord1hvNV +#define glMultiTexCoord2hNV bluegl_glMultiTexCoord2hNV +#define glMultiTexCoord2hvNV bluegl_glMultiTexCoord2hvNV +#define glMultiTexCoord3hNV bluegl_glMultiTexCoord3hNV +#define glMultiTexCoord3hvNV bluegl_glMultiTexCoord3hvNV +#define glMultiTexCoord4hNV bluegl_glMultiTexCoord4hNV +#define glMultiTexCoord4hvNV bluegl_glMultiTexCoord4hvNV +#define glFogCoordhNV bluegl_glFogCoordhNV +#define glFogCoordhvNV bluegl_glFogCoordhvNV +#define glSecondaryColor3hNV bluegl_glSecondaryColor3hNV +#define glSecondaryColor3hvNV bluegl_glSecondaryColor3hvNV +#define glVertexWeighthNV bluegl_glVertexWeighthNV +#define glVertexWeighthvNV bluegl_glVertexWeighthvNV +#define glVertexAttrib1hNV bluegl_glVertexAttrib1hNV +#define glVertexAttrib1hvNV bluegl_glVertexAttrib1hvNV +#define glVertexAttrib2hNV bluegl_glVertexAttrib2hNV +#define glVertexAttrib2hvNV bluegl_glVertexAttrib2hvNV +#define glVertexAttrib3hNV bluegl_glVertexAttrib3hNV +#define glVertexAttrib3hvNV bluegl_glVertexAttrib3hvNV +#define glVertexAttrib4hNV bluegl_glVertexAttrib4hNV +#define glVertexAttrib4hvNV bluegl_glVertexAttrib4hvNV +#define glVertexAttribs1hvNV bluegl_glVertexAttribs1hvNV +#define glVertexAttribs2hvNV bluegl_glVertexAttribs2hvNV +#define glVertexAttribs3hvNV bluegl_glVertexAttribs3hvNV +#define glVertexAttribs4hvNV bluegl_glVertexAttribs4hvNV +#define glGetInternalformatSampleivNV bluegl_glGetInternalformatSampleivNV +#define glGenOcclusionQueriesNV bluegl_glGenOcclusionQueriesNV +#define glDeleteOcclusionQueriesNV bluegl_glDeleteOcclusionQueriesNV +#define glIsOcclusionQueryNV bluegl_glIsOcclusionQueryNV +#define glBeginOcclusionQueryNV bluegl_glBeginOcclusionQueryNV +#define glEndOcclusionQueryNV bluegl_glEndOcclusionQueryNV +#define glGetOcclusionQueryivNV bluegl_glGetOcclusionQueryivNV +#define glGetOcclusionQueryuivNV bluegl_glGetOcclusionQueryuivNV +#define glProgramBufferParametersfvNV bluegl_glProgramBufferParametersfvNV +#define glProgramBufferParametersIivNV bluegl_glProgramBufferParametersIivNV +#define glProgramBufferParametersIuivNV bluegl_glProgramBufferParametersIuivNV +#define glGenPathsNV bluegl_glGenPathsNV +#define glDeletePathsNV bluegl_glDeletePathsNV +#define glIsPathNV bluegl_glIsPathNV +#define glPathCommandsNV bluegl_glPathCommandsNV +#define glPathCoordsNV bluegl_glPathCoordsNV +#define glPathSubCommandsNV bluegl_glPathSubCommandsNV +#define glPathSubCoordsNV bluegl_glPathSubCoordsNV +#define glPathStringNV bluegl_glPathStringNV +#define glPathGlyphsNV bluegl_glPathGlyphsNV +#define glPathGlyphRangeNV bluegl_glPathGlyphRangeNV +#define glWeightPathsNV bluegl_glWeightPathsNV +#define glCopyPathNV bluegl_glCopyPathNV +#define glInterpolatePathsNV bluegl_glInterpolatePathsNV +#define glTransformPathNV bluegl_glTransformPathNV +#define glPathParameterivNV bluegl_glPathParameterivNV +#define glPathParameteriNV bluegl_glPathParameteriNV +#define glPathParameterfvNV bluegl_glPathParameterfvNV +#define glPathParameterfNV bluegl_glPathParameterfNV +#define glPathDashArrayNV bluegl_glPathDashArrayNV +#define glPathStencilFuncNV bluegl_glPathStencilFuncNV +#define glPathStencilDepthOffsetNV bluegl_glPathStencilDepthOffsetNV +#define glStencilFillPathNV bluegl_glStencilFillPathNV +#define glStencilStrokePathNV bluegl_glStencilStrokePathNV +#define glStencilFillPathInstancedNV bluegl_glStencilFillPathInstancedNV +#define glStencilStrokePathInstancedNV bluegl_glStencilStrokePathInstancedNV +#define glPathCoverDepthFuncNV bluegl_glPathCoverDepthFuncNV +#define glCoverFillPathNV bluegl_glCoverFillPathNV +#define glCoverStrokePathNV bluegl_glCoverStrokePathNV +#define glCoverFillPathInstancedNV bluegl_glCoverFillPathInstancedNV +#define glCoverStrokePathInstancedNV bluegl_glCoverStrokePathInstancedNV +#define glGetPathParameterivNV bluegl_glGetPathParameterivNV +#define glGetPathParameterfvNV bluegl_glGetPathParameterfvNV #define glGetPathCommandsNV bluegl_glGetPathCommandsNV -#define glGetColorTableParameterivSGI bluegl_glGetColorTableParameterivSGI -#define glGetNamedProgramivEXT bluegl_glGetNamedProgramivEXT -#define glSecondaryColor3ubvEXT bluegl_glSecondaryColor3ubvEXT -#define glVDPAURegisterVideoSurfaceNV bluegl_glVDPAURegisterVideoSurfaceNV -#define glTexParameterf bluegl_glTexParameterf -#define glVertexAttribL4i64NV bluegl_glVertexAttribL4i64NV -#define glPollAsyncSGIX bluegl_glPollAsyncSGIX -#define glBufferParameteriAPPLE bluegl_glBufferParameteriAPPLE -#define glApplyTextureEXT bluegl_glApplyTextureEXT -#define glGenVertexShadersEXT bluegl_glGenVertexShadersEXT -#define glTexImage2DMultisampleCoverageNV bluegl_glTexImage2DMultisampleCoverageNV -#define glObjectUnpurgeableAPPLE bluegl_glObjectUnpurgeableAPPLE -#define glCopyNamedBufferSubData bluegl_glCopyNamedBufferSubData -#define glVertexAttrib4dv bluegl_glVertexAttrib4dv -#define glClearTexSubImage bluegl_glClearTexSubImage +#define glGetPathCoordsNV bluegl_glGetPathCoordsNV +#define glGetPathDashArrayNV bluegl_glGetPathDashArrayNV +#define glGetPathMetricsNV bluegl_glGetPathMetricsNV +#define glGetPathMetricRangeNV bluegl_glGetPathMetricRangeNV +#define glGetPathSpacingNV bluegl_glGetPathSpacingNV +#define glIsPointInFillPathNV bluegl_glIsPointInFillPathNV +#define glIsPointInStrokePathNV bluegl_glIsPointInStrokePathNV +#define glGetPathLengthNV bluegl_glGetPathLengthNV #define glPointAlongPathNV bluegl_glPointAlongPathNV -#define glFramebufferTexture1DEXT bluegl_glFramebufferTexture1DEXT #define glMatrixLoad3x2fNV bluegl_glMatrixLoad3x2fNV -#define glGetUniformui64vARB bluegl_glGetUniformui64vARB -#define glTextureStorage3DMultisampleEXT bluegl_glTextureStorage3DMultisampleEXT -#define glTexCoord1bvOES bluegl_glTexCoord1bvOES -#define glGetBufferParameteri64v bluegl_glGetBufferParameteri64v -#define glQueryMatrixxOES bluegl_glQueryMatrixxOES -#define glVertexAttrib1fv bluegl_glVertexAttrib1fv -#define glVertexAttribP3ui bluegl_glVertexAttribP3ui -#define glVDPAUInitNV bluegl_glVDPAUInitNV -#define glPathStencilDepthOffsetNV bluegl_glPathStencilDepthOffsetNV -#define glLightxOES bluegl_glLightxOES -#define glVertexAttribI3i bluegl_glVertexAttribI3i -#define glProgramUniformHandleui64vARB bluegl_glProgramUniformHandleui64vARB -#define glTextureParameteriv bluegl_glTextureParameteriv -#define glProgramUniformHandleui64NV bluegl_glProgramUniformHandleui64NV -#define glGetVertexArrayIntegervEXT bluegl_glGetVertexArrayIntegervEXT -#define glDrawElements bluegl_glDrawElements -#define glProgramUniform3i64ARB bluegl_glProgramUniform3i64ARB -#define glDeleteAsyncMarkersSGIX bluegl_glDeleteAsyncMarkersSGIX -#define glGetLightxOES bluegl_glGetLightxOES -#define glCreateCommandListsNV bluegl_glCreateCommandListsNV -#define glClear bluegl_glClear +#define glMatrixLoad3x3fNV bluegl_glMatrixLoad3x3fNV +#define glMatrixLoadTranspose3x3fNV bluegl_glMatrixLoadTranspose3x3fNV +#define glMatrixMult3x2fNV bluegl_glMatrixMult3x2fNV +#define glMatrixMult3x3fNV bluegl_glMatrixMult3x3fNV +#define glMatrixMultTranspose3x3fNV bluegl_glMatrixMultTranspose3x3fNV +#define glStencilThenCoverFillPathNV bluegl_glStencilThenCoverFillPathNV +#define glStencilThenCoverStrokePathNV bluegl_glStencilThenCoverStrokePathNV +#define glStencilThenCoverFillPathInstancedNV bluegl_glStencilThenCoverFillPathInstancedNV +#define glStencilThenCoverStrokePathInstancedNV bluegl_glStencilThenCoverStrokePathInstancedNV +#define glPathGlyphIndexRangeNV bluegl_glPathGlyphIndexRangeNV +#define glPathGlyphIndexArrayNV bluegl_glPathGlyphIndexArrayNV +#define glPathMemoryGlyphIndexArrayNV bluegl_glPathMemoryGlyphIndexArrayNV +#define glProgramPathFragmentInputGenNV bluegl_glProgramPathFragmentInputGenNV +#define glGetProgramResourcefvNV bluegl_glGetProgramResourcefvNV +#define glPathColorGenNV bluegl_glPathColorGenNV +#define glPathTexGenNV bluegl_glPathTexGenNV +#define glPathFogGenNV bluegl_glPathFogGenNV +#define glGetPathColorGenivNV bluegl_glGetPathColorGenivNV +#define glGetPathColorGenfvNV bluegl_glGetPathColorGenfvNV +#define glGetPathTexGenivNV bluegl_glGetPathTexGenivNV +#define glGetPathTexGenfvNV bluegl_glGetPathTexGenfvNV +#define glPixelDataRangeNV bluegl_glPixelDataRangeNV +#define glFlushPixelDataRangeNV bluegl_glFlushPixelDataRangeNV +#define glPointParameteriNV bluegl_glPointParameteriNV +#define glPointParameterivNV bluegl_glPointParameterivNV +#define glPresentFrameKeyedNV bluegl_glPresentFrameKeyedNV +#define glPresentFrameDualFillNV bluegl_glPresentFrameDualFillNV +#define glGetVideoivNV bluegl_glGetVideoivNV +#define glGetVideouivNV bluegl_glGetVideouivNV +#define glGetVideoi64vNV bluegl_glGetVideoi64vNV +#define glGetVideoui64vNV bluegl_glGetVideoui64vNV +#define glPrimitiveRestartNV bluegl_glPrimitiveRestartNV +#define glPrimitiveRestartIndexNV bluegl_glPrimitiveRestartIndexNV +#define glCombinerParameterfvNV bluegl_glCombinerParameterfvNV +#define glCombinerParameterfNV bluegl_glCombinerParameterfNV +#define glCombinerParameterivNV bluegl_glCombinerParameterivNV +#define glCombinerParameteriNV bluegl_glCombinerParameteriNV +#define glCombinerInputNV bluegl_glCombinerInputNV +#define glCombinerOutputNV bluegl_glCombinerOutputNV +#define glFinalCombinerInputNV bluegl_glFinalCombinerInputNV +#define glGetCombinerInputParameterfvNV bluegl_glGetCombinerInputParameterfvNV +#define glGetCombinerInputParameterivNV bluegl_glGetCombinerInputParameterivNV +#define glGetCombinerOutputParameterfvNV bluegl_glGetCombinerOutputParameterfvNV +#define glGetCombinerOutputParameterivNV bluegl_glGetCombinerOutputParameterivNV +#define glGetFinalCombinerInputParameterfvNV bluegl_glGetFinalCombinerInputParameterfvNV +#define glGetFinalCombinerInputParameterivNV bluegl_glGetFinalCombinerInputParameterivNV +#define glCombinerStageParameterfvNV bluegl_glCombinerStageParameterfvNV +#define glGetCombinerStageParameterfvNV bluegl_glGetCombinerStageParameterfvNV +#define glFramebufferSampleLocationsfvNV bluegl_glFramebufferSampleLocationsfvNV +#define glNamedFramebufferSampleLocationsfvNV bluegl_glNamedFramebufferSampleLocationsfvNV +#define glResolveDepthValuesNV bluegl_glResolveDepthValuesNV +#define glMakeBufferResidentNV bluegl_glMakeBufferResidentNV +#define glMakeBufferNonResidentNV bluegl_glMakeBufferNonResidentNV +#define glIsBufferResidentNV bluegl_glIsBufferResidentNV +#define glMakeNamedBufferResidentNV bluegl_glMakeNamedBufferResidentNV +#define glMakeNamedBufferNonResidentNV bluegl_glMakeNamedBufferNonResidentNV +#define glIsNamedBufferResidentNV bluegl_glIsNamedBufferResidentNV +#define glGetBufferParameterui64vNV bluegl_glGetBufferParameterui64vNV +#define glGetNamedBufferParameterui64vNV bluegl_glGetNamedBufferParameterui64vNV +#define glGetIntegerui64vNV bluegl_glGetIntegerui64vNV +#define glUniformui64NV bluegl_glUniformui64NV #define glUniformui64vNV bluegl_glUniformui64vNV -#define glVertexAttrib2dvNV bluegl_glVertexAttrib2dvNV -#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN -#define glWindowPos3sARB bluegl_glWindowPos3sARB -#define glDrawTextureNV bluegl_glDrawTextureNV -#define glIsSync bluegl_glIsSync -#define glMatrixTranslatedEXT bluegl_glMatrixTranslatedEXT +#define glProgramUniformui64NV bluegl_glProgramUniformui64NV +#define glProgramUniformui64vNV bluegl_glProgramUniformui64vNV +#define glTextureBarrierNV bluegl_glTextureBarrierNV +#define glTexImage2DMultisampleCoverageNV bluegl_glTexImage2DMultisampleCoverageNV +#define glTexImage3DMultisampleCoverageNV bluegl_glTexImage3DMultisampleCoverageNV +#define glTextureImage2DMultisampleNV bluegl_glTextureImage2DMultisampleNV +#define glTextureImage3DMultisampleNV bluegl_glTextureImage3DMultisampleNV +#define glTextureImage2DMultisampleCoverageNV bluegl_glTextureImage2DMultisampleCoverageNV +#define glTextureImage3DMultisampleCoverageNV bluegl_glTextureImage3DMultisampleCoverageNV +#define glBeginTransformFeedbackNV bluegl_glBeginTransformFeedbackNV +#define glEndTransformFeedbackNV bluegl_glEndTransformFeedbackNV +#define glTransformFeedbackAttribsNV bluegl_glTransformFeedbackAttribsNV +#define glBindBufferRangeNV bluegl_glBindBufferRangeNV +#define glBindBufferOffsetNV bluegl_glBindBufferOffsetNV +#define glBindBufferBaseNV bluegl_glBindBufferBaseNV +#define glTransformFeedbackVaryingsNV bluegl_glTransformFeedbackVaryingsNV +#define glActiveVaryingNV bluegl_glActiveVaryingNV +#define glGetVaryingLocationNV bluegl_glGetVaryingLocationNV #define glGetActiveVaryingNV bluegl_glGetActiveVaryingNV -#define glCreateQueries bluegl_glCreateQueries -#define glGetProgramEnvParameterdvARB bluegl_glGetProgramEnvParameterdvARB -#define glVertexArrayVertexAttribIOffsetEXT bluegl_glVertexArrayVertexAttribIOffsetEXT -#define glGetLocalConstantBooleanvEXT bluegl_glGetLocalConstantBooleanvEXT +#define glGetTransformFeedbackVaryingNV bluegl_glGetTransformFeedbackVaryingNV +#define glTransformFeedbackStreamAttribsNV bluegl_glTransformFeedbackStreamAttribsNV +#define glBindTransformFeedbackNV bluegl_glBindTransformFeedbackNV +#define glDeleteTransformFeedbacksNV bluegl_glDeleteTransformFeedbacksNV +#define glGenTransformFeedbacksNV bluegl_glGenTransformFeedbacksNV +#define glIsTransformFeedbackNV bluegl_glIsTransformFeedbackNV +#define glPauseTransformFeedbackNV bluegl_glPauseTransformFeedbackNV +#define glResumeTransformFeedbackNV bluegl_glResumeTransformFeedbackNV +#define glDrawTransformFeedbackNV bluegl_glDrawTransformFeedbackNV +#define glVDPAUInitNV bluegl_glVDPAUInitNV +#define glVDPAUFiniNV bluegl_glVDPAUFiniNV +#define glVDPAURegisterVideoSurfaceNV bluegl_glVDPAURegisterVideoSurfaceNV +#define glVDPAURegisterOutputSurfaceNV bluegl_glVDPAURegisterOutputSurfaceNV +#define glVDPAUIsSurfaceNV bluegl_glVDPAUIsSurfaceNV +#define glVDPAUUnregisterSurfaceNV bluegl_glVDPAUUnregisterSurfaceNV +#define glVDPAUGetSurfaceivNV bluegl_glVDPAUGetSurfaceivNV +#define glVDPAUSurfaceAccessNV bluegl_glVDPAUSurfaceAccessNV +#define glVDPAUMapSurfacesNV bluegl_glVDPAUMapSurfacesNV +#define glVDPAUUnmapSurfacesNV bluegl_glVDPAUUnmapSurfacesNV +#define glFlushVertexArrayRangeNV bluegl_glFlushVertexArrayRangeNV +#define glVertexArrayRangeNV bluegl_glVertexArrayRangeNV +#define glVertexAttribL1i64NV bluegl_glVertexAttribL1i64NV +#define glVertexAttribL2i64NV bluegl_glVertexAttribL2i64NV +#define glVertexAttribL3i64NV bluegl_glVertexAttribL3i64NV +#define glVertexAttribL4i64NV bluegl_glVertexAttribL4i64NV +#define glVertexAttribL1i64vNV bluegl_glVertexAttribL1i64vNV +#define glVertexAttribL2i64vNV bluegl_glVertexAttribL2i64vNV +#define glVertexAttribL3i64vNV bluegl_glVertexAttribL3i64vNV +#define glVertexAttribL4i64vNV bluegl_glVertexAttribL4i64vNV +#define glVertexAttribL1ui64NV bluegl_glVertexAttribL1ui64NV +#define glVertexAttribL2ui64NV bluegl_glVertexAttribL2ui64NV +#define glVertexAttribL3ui64NV bluegl_glVertexAttribL3ui64NV +#define glVertexAttribL4ui64NV bluegl_glVertexAttribL4ui64NV +#define glVertexAttribL1ui64vNV bluegl_glVertexAttribL1ui64vNV +#define glVertexAttribL2ui64vNV bluegl_glVertexAttribL2ui64vNV +#define glVertexAttribL3ui64vNV bluegl_glVertexAttribL3ui64vNV +#define glVertexAttribL4ui64vNV bluegl_glVertexAttribL4ui64vNV +#define glGetVertexAttribLi64vNV bluegl_glGetVertexAttribLi64vNV +#define glGetVertexAttribLui64vNV bluegl_glGetVertexAttribLui64vNV +#define glVertexAttribLFormatNV bluegl_glVertexAttribLFormatNV +#define glBufferAddressRangeNV bluegl_glBufferAddressRangeNV +#define glVertexFormatNV bluegl_glVertexFormatNV +#define glNormalFormatNV bluegl_glNormalFormatNV +#define glColorFormatNV bluegl_glColorFormatNV +#define glIndexFormatNV bluegl_glIndexFormatNV +#define glTexCoordFormatNV bluegl_glTexCoordFormatNV +#define glEdgeFlagFormatNV bluegl_glEdgeFlagFormatNV +#define glSecondaryColorFormatNV bluegl_glSecondaryColorFormatNV +#define glFogCoordFormatNV bluegl_glFogCoordFormatNV +#define glVertexAttribFormatNV bluegl_glVertexAttribFormatNV +#define glVertexAttribIFormatNV bluegl_glVertexAttribIFormatNV +#define glGetIntegerui64i_vNV bluegl_glGetIntegerui64i_vNV +#define glAreProgramsResidentNV bluegl_glAreProgramsResidentNV +#define glBindProgramNV bluegl_glBindProgramNV +#define glDeleteProgramsNV bluegl_glDeleteProgramsNV +#define glExecuteProgramNV bluegl_glExecuteProgramNV +#define glGenProgramsNV bluegl_glGenProgramsNV +#define glGetProgramParameterdvNV bluegl_glGetProgramParameterdvNV #define glGetProgramParameterfvNV bluegl_glGetProgramParameterfvNV -#define glSpriteParameterivSGIX bluegl_glSpriteParameterivSGIX -#define glMultiTexCoord3xvOES bluegl_glMultiTexCoord3xvOES -#define glBindBufferRangeNV bluegl_glBindBufferRangeNV -#define glMultiTexCoord1sv bluegl_glMultiTexCoord1sv -#define glVertexStream1ivATI bluegl_glVertexStream1ivATI -#define glGetQueryObjectivARB bluegl_glGetQueryObjectivARB -#define glReplacementCodeuiColor4ubVertex3fvSUN bluegl_glReplacementCodeuiColor4ubVertex3fvSUN -#define glFlushMappedNamedBufferRange bluegl_glFlushMappedNamedBufferRange -#define glPointParameteriv bluegl_glPointParameteriv -#define glGetTextureLevelParameterivEXT bluegl_glGetTextureLevelParameterivEXT -#define glMultiTexEnviEXT bluegl_glMultiTexEnviEXT -#define glPolygonOffset bluegl_glPolygonOffset -#define glUniform1ui64ARB bluegl_glUniform1ui64ARB -#define glDeleteVertexArrays bluegl_glDeleteVertexArrays -#define glGetUniformi64vNV bluegl_glGetUniformi64vNV -#define glVertexAttribI3iv bluegl_glVertexAttribI3iv -#define glEndQueryIndexed bluegl_glEndQueryIndexed -#define glTextureSubImage1DEXT bluegl_glTextureSubImage1DEXT +#define glGetProgramivNV bluegl_glGetProgramivNV +#define glGetProgramStringNV bluegl_glGetProgramStringNV +#define glGetTrackMatrixivNV bluegl_glGetTrackMatrixivNV +#define glGetVertexAttribdvNV bluegl_glGetVertexAttribdvNV +#define glGetVertexAttribfvNV bluegl_glGetVertexAttribfvNV +#define glGetVertexAttribivNV bluegl_glGetVertexAttribivNV +#define glGetVertexAttribPointervNV bluegl_glGetVertexAttribPointervNV +#define glIsProgramNV bluegl_glIsProgramNV +#define glLoadProgramNV bluegl_glLoadProgramNV +#define glProgramParameter4dNV bluegl_glProgramParameter4dNV +#define glProgramParameter4dvNV bluegl_glProgramParameter4dvNV +#define glProgramParameter4fNV bluegl_glProgramParameter4fNV +#define glProgramParameter4fvNV bluegl_glProgramParameter4fvNV +#define glProgramParameters4dvNV bluegl_glProgramParameters4dvNV +#define glProgramParameters4fvNV bluegl_glProgramParameters4fvNV +#define glRequestResidentProgramsNV bluegl_glRequestResidentProgramsNV +#define glTrackMatrixNV bluegl_glTrackMatrixNV +#define glVertexAttribPointerNV bluegl_glVertexAttribPointerNV +#define glVertexAttrib1dNV bluegl_glVertexAttrib1dNV +#define glVertexAttrib1dvNV bluegl_glVertexAttrib1dvNV +#define glVertexAttrib1fNV bluegl_glVertexAttrib1fNV +#define glVertexAttrib1fvNV bluegl_glVertexAttrib1fvNV +#define glVertexAttrib1sNV bluegl_glVertexAttrib1sNV +#define glVertexAttrib1svNV bluegl_glVertexAttrib1svNV +#define glVertexAttrib2dNV bluegl_glVertexAttrib2dNV +#define glVertexAttrib2dvNV bluegl_glVertexAttrib2dvNV +#define glVertexAttrib2fNV bluegl_glVertexAttrib2fNV +#define glVertexAttrib2fvNV bluegl_glVertexAttrib2fvNV +#define glVertexAttrib2sNV bluegl_glVertexAttrib2sNV +#define glVertexAttrib2svNV bluegl_glVertexAttrib2svNV +#define glVertexAttrib3dNV bluegl_glVertexAttrib3dNV +#define glVertexAttrib3dvNV bluegl_glVertexAttrib3dvNV +#define glVertexAttrib3fNV bluegl_glVertexAttrib3fNV +#define glVertexAttrib3fvNV bluegl_glVertexAttrib3fvNV +#define glVertexAttrib3sNV bluegl_glVertexAttrib3sNV +#define glVertexAttrib3svNV bluegl_glVertexAttrib3svNV +#define glVertexAttrib4dNV bluegl_glVertexAttrib4dNV +#define glVertexAttrib4dvNV bluegl_glVertexAttrib4dvNV +#define glVertexAttrib4fNV bluegl_glVertexAttrib4fNV +#define glVertexAttrib4fvNV bluegl_glVertexAttrib4fvNV +#define glVertexAttrib4sNV bluegl_glVertexAttrib4sNV +#define glVertexAttrib4svNV bluegl_glVertexAttrib4svNV +#define glVertexAttrib4ubNV bluegl_glVertexAttrib4ubNV +#define glVertexAttrib4ubvNV bluegl_glVertexAttrib4ubvNV +#define glVertexAttribs1dvNV bluegl_glVertexAttribs1dvNV +#define glVertexAttribs1fvNV bluegl_glVertexAttribs1fvNV +#define glVertexAttribs1svNV bluegl_glVertexAttribs1svNV +#define glVertexAttribs2dvNV bluegl_glVertexAttribs2dvNV +#define glVertexAttribs2fvNV bluegl_glVertexAttribs2fvNV +#define glVertexAttribs2svNV bluegl_glVertexAttribs2svNV +#define glVertexAttribs3dvNV bluegl_glVertexAttribs3dvNV +#define glVertexAttribs3fvNV bluegl_glVertexAttribs3fvNV +#define glVertexAttribs3svNV bluegl_glVertexAttribs3svNV +#define glVertexAttribs4dvNV bluegl_glVertexAttribs4dvNV +#define glVertexAttribs4fvNV bluegl_glVertexAttribs4fvNV +#define glVertexAttribs4svNV bluegl_glVertexAttribs4svNV +#define glVertexAttribs4ubvNV bluegl_glVertexAttribs4ubvNV +#define glVertexAttribI1iEXT bluegl_glVertexAttribI1iEXT +#define glVertexAttribI2iEXT bluegl_glVertexAttribI2iEXT +#define glVertexAttribI3iEXT bluegl_glVertexAttribI3iEXT +#define glVertexAttribI4iEXT bluegl_glVertexAttribI4iEXT +#define glVertexAttribI1uiEXT bluegl_glVertexAttribI1uiEXT +#define glVertexAttribI2uiEXT bluegl_glVertexAttribI2uiEXT +#define glVertexAttribI3uiEXT bluegl_glVertexAttribI3uiEXT +#define glVertexAttribI4uiEXT bluegl_glVertexAttribI4uiEXT +#define glVertexAttribI1ivEXT bluegl_glVertexAttribI1ivEXT +#define glVertexAttribI2ivEXT bluegl_glVertexAttribI2ivEXT +#define glVertexAttribI3ivEXT bluegl_glVertexAttribI3ivEXT +#define glVertexAttribI4ivEXT bluegl_glVertexAttribI4ivEXT +#define glVertexAttribI1uivEXT bluegl_glVertexAttribI1uivEXT +#define glVertexAttribI2uivEXT bluegl_glVertexAttribI2uivEXT +#define glVertexAttribI3uivEXT bluegl_glVertexAttribI3uivEXT +#define glVertexAttribI4uivEXT bluegl_glVertexAttribI4uivEXT +#define glVertexAttribI4bvEXT bluegl_glVertexAttribI4bvEXT +#define glVertexAttribI4svEXT bluegl_glVertexAttribI4svEXT #define glVertexAttribI4ubvEXT bluegl_glVertexAttribI4ubvEXT -#define glVertexAttribP4ui bluegl_glVertexAttribP4ui -#define glNamedProgramLocalParameter4dvEXT bluegl_glNamedProgramLocalParameter4dvEXT -#define glGetNamedProgramLocalParameterIuivEXT bluegl_glGetNamedProgramLocalParameterIuivEXT +#define glVertexAttribI4usvEXT bluegl_glVertexAttribI4usvEXT +#define glVertexAttribIPointerEXT bluegl_glVertexAttribIPointerEXT +#define glGetVertexAttribIivEXT bluegl_glGetVertexAttribIivEXT +#define glGetVertexAttribIuivEXT bluegl_glGetVertexAttribIuivEXT +#define glBeginVideoCaptureNV bluegl_glBeginVideoCaptureNV +#define glBindVideoCaptureStreamBufferNV bluegl_glBindVideoCaptureStreamBufferNV +#define glBindVideoCaptureStreamTextureNV bluegl_glBindVideoCaptureStreamTextureNV +#define glEndVideoCaptureNV bluegl_glEndVideoCaptureNV +#define glGetVideoCaptureivNV bluegl_glGetVideoCaptureivNV +#define glGetVideoCaptureStreamivNV bluegl_glGetVideoCaptureStreamivNV +#define glGetVideoCaptureStreamfvNV bluegl_glGetVideoCaptureStreamfvNV +#define glGetVideoCaptureStreamdvNV bluegl_glGetVideoCaptureStreamdvNV +#define glVideoCaptureNV bluegl_glVideoCaptureNV +#define glVideoCaptureStreamParameterivNV bluegl_glVideoCaptureStreamParameterivNV +#define glVideoCaptureStreamParameterfvNV bluegl_glVideoCaptureStreamParameterfvNV +#define glVideoCaptureStreamParameterdvNV bluegl_glVideoCaptureStreamParameterdvNV +#define glFramebufferTextureMultiviewOVR bluegl_glFramebufferTextureMultiviewOVR +#define glHintPGI bluegl_glHintPGI +#define glDetailTexFuncSGIS bluegl_glDetailTexFuncSGIS +#define glGetDetailTexFuncSGIS bluegl_glGetDetailTexFuncSGIS +#define glFogFuncSGIS bluegl_glFogFuncSGIS +#define glGetFogFuncSGIS bluegl_glGetFogFuncSGIS +#define glSampleMaskSGIS bluegl_glSampleMaskSGIS +#define glSamplePatternSGIS bluegl_glSamplePatternSGIS +#define glPixelTexGenParameteriSGIS bluegl_glPixelTexGenParameteriSGIS +#define glPixelTexGenParameterivSGIS bluegl_glPixelTexGenParameterivSGIS +#define glPixelTexGenParameterfSGIS bluegl_glPixelTexGenParameterfSGIS +#define glPixelTexGenParameterfvSGIS bluegl_glPixelTexGenParameterfvSGIS #define glGetPixelTexGenParameterivSGIS bluegl_glGetPixelTexGenParameterivSGIS -#define glGetnMapdv bluegl_glGetnMapdv -#define glMultiTexCoord4svARB bluegl_glMultiTexCoord4svARB -#define glVertexStream2ivATI bluegl_glVertexStream2ivATI -#define glUniform4uivEXT bluegl_glUniform4uivEXT -#define glGetPointeri_vEXT bluegl_glGetPointeri_vEXT -#define glClearTexImage bluegl_glClearTexImage -#define glVertexAttribP1ui bluegl_glVertexAttribP1ui -#define glCompressedTexImage1DARB bluegl_glCompressedTexImage1DARB -#define glTextureStorage1DEXT bluegl_glTextureStorage1DEXT -#define glUniform4fvARB bluegl_glUniform4fvARB -#define glFramebufferTexture3DEXT bluegl_glFramebufferTexture3DEXT -#define glDrawElementsIndirect bluegl_glDrawElementsIndirect -#define glBindBufferBaseEXT bluegl_glBindBufferBaseEXT +#define glGetPixelTexGenParameterfvSGIS bluegl_glGetPixelTexGenParameterfvSGIS +#define glPointParameterfSGIS bluegl_glPointParameterfSGIS +#define glPointParameterfvSGIS bluegl_glPointParameterfvSGIS +#define glSharpenTexFuncSGIS bluegl_glSharpenTexFuncSGIS +#define glGetSharpenTexFuncSGIS bluegl_glGetSharpenTexFuncSGIS +#define glTexImage4DSGIS bluegl_glTexImage4DSGIS +#define glTexSubImage4DSGIS bluegl_glTexSubImage4DSGIS +#define glTextureColorMaskSGIS bluegl_glTextureColorMaskSGIS +#define glGetTexFilterFuncSGIS bluegl_glGetTexFilterFuncSGIS +#define glTexFilterFuncSGIS bluegl_glTexFilterFuncSGIS +#define glAsyncMarkerSGIX bluegl_glAsyncMarkerSGIX +#define glFinishAsyncSGIX bluegl_glFinishAsyncSGIX +#define glPollAsyncSGIX bluegl_glPollAsyncSGIX +#define glGenAsyncMarkersSGIX bluegl_glGenAsyncMarkersSGIX +#define glDeleteAsyncMarkersSGIX bluegl_glDeleteAsyncMarkersSGIX +#define glIsAsyncMarkerSGIX bluegl_glIsAsyncMarkerSGIX +#define glFlushRasterSGIX bluegl_glFlushRasterSGIX +#define glFragmentColorMaterialSGIX bluegl_glFragmentColorMaterialSGIX +#define glFragmentLightfSGIX bluegl_glFragmentLightfSGIX +#define glFragmentLightfvSGIX bluegl_glFragmentLightfvSGIX +#define glFragmentLightiSGIX bluegl_glFragmentLightiSGIX +#define glFragmentLightivSGIX bluegl_glFragmentLightivSGIX +#define glFragmentLightModelfSGIX bluegl_glFragmentLightModelfSGIX +#define glFragmentLightModelfvSGIX bluegl_glFragmentLightModelfvSGIX +#define glFragmentLightModeliSGIX bluegl_glFragmentLightModeliSGIX +#define glFragmentLightModelivSGIX bluegl_glFragmentLightModelivSGIX +#define glFragmentMaterialfSGIX bluegl_glFragmentMaterialfSGIX +#define glFragmentMaterialfvSGIX bluegl_glFragmentMaterialfvSGIX +#define glFragmentMaterialiSGIX bluegl_glFragmentMaterialiSGIX +#define glFragmentMaterialivSGIX bluegl_glFragmentMaterialivSGIX +#define glGetFragmentLightfvSGIX bluegl_glGetFragmentLightfvSGIX +#define glGetFragmentLightivSGIX bluegl_glGetFragmentLightivSGIX +#define glGetFragmentMaterialfvSGIX bluegl_glGetFragmentMaterialfvSGIX +#define glGetFragmentMaterialivSGIX bluegl_glGetFragmentMaterialivSGIX +#define glLightEnviSGIX bluegl_glLightEnviSGIX +#define glFrameZoomSGIX bluegl_glFrameZoomSGIX #define glIglooInterfaceSGIX bluegl_glIglooInterfaceSGIX -#define glMinmaxEXT bluegl_glMinmaxEXT -#define glClearDepthf bluegl_glClearDepthf -#define glReadnPixels bluegl_glReadnPixels -#define glGenerateTextureMipmap bluegl_glGenerateTextureMipmap -#define glGetnPixelMapuivARB bluegl_glGetnPixelMapuivARB -#define glProgramLocalParameter4fARB bluegl_glProgramLocalParameter4fARB -#define glVertexAttribL1dvEXT bluegl_glVertexAttribL1dvEXT -#define glBeginTransformFeedback bluegl_glBeginTransformFeedback -#define glDepthBoundsEXT bluegl_glDepthBoundsEXT -#define glVertexAttrib2f bluegl_glVertexAttrib2f -#define glProgramEnvParametersI4ivNV bluegl_glProgramEnvParametersI4ivNV -#define glTexCoord4fVertex4fSUN bluegl_glTexCoord4fVertex4fSUN -#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN -#define glGetNamedProgramLocalParameterfvEXT bluegl_glGetNamedProgramLocalParameterfvEXT -#define glProgramUniform1ui64ARB bluegl_glProgramUniform1ui64ARB +#define glGetInstrumentsSGIX bluegl_glGetInstrumentsSGIX +#define glInstrumentsBufferSGIX bluegl_glInstrumentsBufferSGIX +#define glPollInstrumentsSGIX bluegl_glPollInstrumentsSGIX #define glReadInstrumentsSGIX bluegl_glReadInstrumentsSGIX -#define glVertexAttrib3dNV bluegl_glVertexAttrib3dNV -#define glProgramParameter4dvNV bluegl_glProgramParameter4dvNV +#define glStartInstrumentsSGIX bluegl_glStartInstrumentsSGIX +#define glStopInstrumentsSGIX bluegl_glStopInstrumentsSGIX +#define glGetListParameterfvSGIX bluegl_glGetListParameterfvSGIX +#define glGetListParameterivSGIX bluegl_glGetListParameterivSGIX +#define glListParameterfSGIX bluegl_glListParameterfSGIX +#define glListParameterfvSGIX bluegl_glListParameterfvSGIX +#define glListParameteriSGIX bluegl_glListParameteriSGIX +#define glListParameterivSGIX bluegl_glListParameterivSGIX +#define glPixelTexGenSGIX bluegl_glPixelTexGenSGIX +#define glDeformationMap3dSGIX bluegl_glDeformationMap3dSGIX +#define glDeformationMap3fSGIX bluegl_glDeformationMap3fSGIX +#define glDeformSGIX bluegl_glDeformSGIX +#define glLoadIdentityDeformationMapSGIX bluegl_glLoadIdentityDeformationMapSGIX +#define glReferencePlaneSGIX bluegl_glReferencePlaneSGIX +#define glSpriteParameterfSGIX bluegl_glSpriteParameterfSGIX +#define glSpriteParameterfvSGIX bluegl_glSpriteParameterfvSGIX +#define glSpriteParameteriSGIX bluegl_glSpriteParameteriSGIX +#define glSpriteParameterivSGIX bluegl_glSpriteParameterivSGIX +#define glTagSampleBufferSGIX bluegl_glTagSampleBufferSGIX +#define glColorTableSGI bluegl_glColorTableSGI +#define glColorTableParameterfvSGI bluegl_glColorTableParameterfvSGI #define glColorTableParameterivSGI bluegl_glColorTableParameterivSGI -#define glUniform1f bluegl_glUniform1f -#define glMultiTexRenderbufferEXT bluegl_glMultiTexRenderbufferEXT -#define glVertexAttribI4uiEXT bluegl_glVertexAttribI4uiEXT -#define glGetConvolutionParameterfv bluegl_glGetConvolutionParameterfv -#define glMultiTexCoord3sARB bluegl_glMultiTexCoord3sARB -#define glGetTexParameterxvOES bluegl_glGetTexParameterxvOES -#define glGetNamedBufferParameteriv bluegl_glGetNamedBufferParameteriv -#define glMultiDrawElementArrayAPPLE bluegl_glMultiDrawElementArrayAPPLE -#define glGetnConvolutionFilter bluegl_glGetnConvolutionFilter -#define glUniformMatrix2x3fv bluegl_glUniformMatrix2x3fv -#define glBindBuffersRange bluegl_glBindBuffersRange -#define glMakeImageHandleNonResidentNV bluegl_glMakeImageHandleNonResidentNV -#define glFinalCombinerInputNV bluegl_glFinalCombinerInputNV -#define glFlush bluegl_glFlush -#define glVertexArrayElementBuffer bluegl_glVertexArrayElementBuffer -#define glProgramUniform4uiEXT bluegl_glProgramUniform4uiEXT -#define glVertexAttrib4ubvNV bluegl_glVertexAttrib4ubvNV -#define glSampleMapATI bluegl_glSampleMapATI -#define glMultiTexCoord1bOES bluegl_glMultiTexCoord1bOES -#define glVertexAttribParameteriAMD bluegl_glVertexAttribParameteriAMD -#define glPointParameterfARB bluegl_glPointParameterfARB -#define glWindowPos2dMESA bluegl_glWindowPos2dMESA +#define glCopyColorTableSGI bluegl_glCopyColorTableSGI +#define glGetColorTableSGI bluegl_glGetColorTableSGI +#define glGetColorTableParameterfvSGI bluegl_glGetColorTableParameterfvSGI +#define glGetColorTableParameterivSGI bluegl_glGetColorTableParameterivSGI +#define glFinishTextureSUNX bluegl_glFinishTextureSUNX +#define glGlobalAlphaFactorbSUN bluegl_glGlobalAlphaFactorbSUN +#define glGlobalAlphaFactorsSUN bluegl_glGlobalAlphaFactorsSUN +#define glGlobalAlphaFactoriSUN bluegl_glGlobalAlphaFactoriSUN +#define glGlobalAlphaFactorfSUN bluegl_glGlobalAlphaFactorfSUN +#define glGlobalAlphaFactordSUN bluegl_glGlobalAlphaFactordSUN +#define glGlobalAlphaFactorubSUN bluegl_glGlobalAlphaFactorubSUN +#define glGlobalAlphaFactorusSUN bluegl_glGlobalAlphaFactorusSUN +#define glGlobalAlphaFactoruiSUN bluegl_glGlobalAlphaFactoruiSUN +#define glDrawMeshArraysSUN bluegl_glDrawMeshArraysSUN +#define glReplacementCodeuiSUN bluegl_glReplacementCodeuiSUN +#define glReplacementCodeusSUN bluegl_glReplacementCodeusSUN +#define glReplacementCodeubSUN bluegl_glReplacementCodeubSUN +#define glReplacementCodeuivSUN bluegl_glReplacementCodeuivSUN +#define glReplacementCodeusvSUN bluegl_glReplacementCodeusvSUN +#define glReplacementCodeubvSUN bluegl_glReplacementCodeubvSUN +#define glReplacementCodePointerSUN bluegl_glReplacementCodePointerSUN +#define glColor4ubVertex2fSUN bluegl_glColor4ubVertex2fSUN +#define glColor4ubVertex2fvSUN bluegl_glColor4ubVertex2fvSUN +#define glColor4ubVertex3fSUN bluegl_glColor4ubVertex3fSUN +#define glColor4ubVertex3fvSUN bluegl_glColor4ubVertex3fvSUN +#define glColor3fVertex3fSUN bluegl_glColor3fVertex3fSUN +#define glColor3fVertex3fvSUN bluegl_glColor3fVertex3fvSUN +#define glNormal3fVertex3fSUN bluegl_glNormal3fVertex3fSUN +#define glNormal3fVertex3fvSUN bluegl_glNormal3fVertex3fvSUN +#define glColor4fNormal3fVertex3fSUN bluegl_glColor4fNormal3fVertex3fSUN +#define glColor4fNormal3fVertex3fvSUN bluegl_glColor4fNormal3fVertex3fvSUN +#define glTexCoord2fVertex3fSUN bluegl_glTexCoord2fVertex3fSUN +#define glTexCoord2fVertex3fvSUN bluegl_glTexCoord2fVertex3fvSUN +#define glTexCoord4fVertex4fSUN bluegl_glTexCoord4fVertex4fSUN +#define glTexCoord4fVertex4fvSUN bluegl_glTexCoord4fVertex4fvSUN +#define glTexCoord2fColor4ubVertex3fSUN bluegl_glTexCoord2fColor4ubVertex3fSUN +#define glTexCoord2fColor4ubVertex3fvSUN bluegl_glTexCoord2fColor4ubVertex3fvSUN +#define glTexCoord2fColor3fVertex3fSUN bluegl_glTexCoord2fColor3fVertex3fSUN +#define glTexCoord2fColor3fVertex3fvSUN bluegl_glTexCoord2fColor3fVertex3fvSUN +#define glTexCoord2fNormal3fVertex3fSUN bluegl_glTexCoord2fNormal3fVertex3fSUN +#define glTexCoord2fNormal3fVertex3fvSUN bluegl_glTexCoord2fNormal3fVertex3fvSUN +#define glTexCoord2fColor4fNormal3fVertex3fSUN bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN +#define glTexCoord2fColor4fNormal3fVertex3fvSUN bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN +#define glTexCoord4fColor4fNormal3fVertex4fSUN bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN +#define glTexCoord4fColor4fNormal3fVertex4fvSUN bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN +#define glReplacementCodeuiVertex3fSUN bluegl_glReplacementCodeuiVertex3fSUN +#define glReplacementCodeuiVertex3fvSUN bluegl_glReplacementCodeuiVertex3fvSUN +#define glReplacementCodeuiColor4ubVertex3fSUN bluegl_glReplacementCodeuiColor4ubVertex3fSUN +#define glReplacementCodeuiColor4ubVertex3fvSUN bluegl_glReplacementCodeuiColor4ubVertex3fvSUN +#define glReplacementCodeuiColor3fVertex3fSUN bluegl_glReplacementCodeuiColor3fVertex3fSUN +#define glReplacementCodeuiColor3fVertex3fvSUN bluegl_glReplacementCodeuiColor3fVertex3fvSUN +#define glReplacementCodeuiNormal3fVertex3fSUN bluegl_glReplacementCodeuiNormal3fVertex3fSUN +#define glReplacementCodeuiNormal3fVertex3fvSUN bluegl_glReplacementCodeuiNormal3fVertex3fvSUN +#define glReplacementCodeuiColor4fNormal3fVertex3fSUN bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN +#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN +#define glReplacementCodeuiTexCoord2fVertex3fSUN bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN +#define glReplacementCodeuiTexCoord2fVertex3fvSUN bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN #endif // TNT_FILAMENT_BLUEGL__DEFINES_H diff --git a/libs/bluegl/src/BlueGLCoreDarwinAArch64Impl.S b/libs/bluegl/src/BlueGLCoreDarwinAArch64Impl.S index 28bf7f4eb19..82cfb225c0c 100644 --- a/libs/bluegl/src/BlueGLCoreDarwinAArch64Impl.S +++ b/libs/bluegl/src/BlueGLCoreDarwinAArch64Impl.S @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,97 +13,104 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - /********************************************************************************************** * Generated by bluegl/bluegl-gen.py * DO NOT EDIT **********************************************************************************************/ -.private_extern _bluegl_glVertexAttrib4dARB +.private_extern _bluegl_glCullFace .align 2 -_bluegl_glVertexAttrib4dARB: - adrp x16, ___blue_glCore_glVertexAttrib4dARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4dARB@GOTPAGEOFF] +_bluegl_glCullFace: + adrp x16, ___blue_glCore_glCullFace@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCullFace@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultMatrixxOES +.private_extern _bluegl_glFrontFace .align 2 -_bluegl_glMultMatrixxOES: - adrp x16, ___blue_glCore_glMultMatrixxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultMatrixxOES@GOTPAGEOFF] +_bluegl_glFrontFace: + adrp x16, ___blue_glCore_glFrontFace@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFrontFace@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramParameters4fvNV +.private_extern _bluegl_glHint .align 2 -_bluegl_glProgramParameters4fvNV: - adrp x16, ___blue_glCore_glProgramParameters4fvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramParameters4fvNV@GOTPAGEOFF] +_bluegl_glHint: + adrp x16, ___blue_glCore_glHint@GOTPAGE + ldr x16, [x16, ___blue_glCore_glHint@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenProgramPipelines +.private_extern _bluegl_glLineWidth .align 2 -_bluegl_glGenProgramPipelines: - adrp x16, ___blue_glCore_glGenProgramPipelines@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenProgramPipelines@GOTPAGEOFF] +_bluegl_glLineWidth: + adrp x16, ___blue_glCore_glLineWidth@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLineWidth@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoordP3uiv +.private_extern _bluegl_glPointSize .align 2 -_bluegl_glMultiTexCoordP3uiv: - adrp x16, ___blue_glCore_glMultiTexCoordP3uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoordP3uiv@GOTPAGEOFF] +_bluegl_glPointSize: + adrp x16, ___blue_glCore_glPointSize@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPointSize@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3usv +.private_extern _bluegl_glPolygonMode .align 2 -_bluegl_glSecondaryColor3usv: - adrp x16, ___blue_glCore_glSecondaryColor3usv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3usv@GOTPAGEOFF] +_bluegl_glPolygonMode: + adrp x16, ___blue_glCore_glPolygonMode@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPolygonMode@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetHistogramParameteriv +.private_extern _bluegl_glScissor .align 2 -_bluegl_glGetHistogramParameteriv: - adrp x16, ___blue_glCore_glGetHistogramParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetHistogramParameteriv@GOTPAGEOFF] +_bluegl_glScissor: + adrp x16, ___blue_glCore_glScissor@GOTPAGE + ldr x16, [x16, ___blue_glCore_glScissor@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glRenderbufferStorageEXT +.private_extern _bluegl_glTexParameterf .align 2 -_bluegl_glRenderbufferStorageEXT: - adrp x16, ___blue_glCore_glRenderbufferStorageEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glRenderbufferStorageEXT@GOTPAGEOFF] +_bluegl_glTexParameterf: + adrp x16, ___blue_glCore_glTexParameterf@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexParameterf@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPathParameterivNV +.private_extern _bluegl_glTexParameterfv .align 2 -_bluegl_glGetPathParameterivNV: - adrp x16, ___blue_glCore_glGetPathParameterivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPathParameterivNV@GOTPAGEOFF] +_bluegl_glTexParameterfv: + adrp x16, ___blue_glCore_glTexParameterfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexParameterfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLineWidthxOES +.private_extern _bluegl_glTexParameteri .align 2 -_bluegl_glLineWidthxOES: - adrp x16, ___blue_glCore_glLineWidthxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLineWidthxOES@GOTPAGEOFF] +_bluegl_glTexParameteri: + adrp x16, ___blue_glCore_glTexParameteri@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexParameteri@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGlobalAlphaFactordSUN +.private_extern _bluegl_glTexParameteriv .align 2 -_bluegl_glGlobalAlphaFactordSUN: - adrp x16, ___blue_glCore_glGlobalAlphaFactordSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGlobalAlphaFactordSUN@GOTPAGEOFF] +_bluegl_glTexParameteriv: + adrp x16, ___blue_glCore_glTexParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexParameteriv@GOTPAGEOFF] + ldr x16, [x16] + br x16 + +.private_extern _bluegl_glTexImage1D + .align 2 +_bluegl_glTexImage1D: + adrp x16, ___blue_glCore_glTexImage1D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexImage1D@GOTPAGEOFF] ldr x16, [x16] br x16 @@ -115,11155 +122,11131 @@ _bluegl_glTexImage2D: ldr x16, [x16] br x16 -.private_extern _bluegl_glGlobalAlphaFactorfSUN +.private_extern _bluegl_glDrawBuffer .align 2 -_bluegl_glGlobalAlphaFactorfSUN: - adrp x16, ___blue_glCore_glGlobalAlphaFactorfSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGlobalAlphaFactorfSUN@GOTPAGEOFF] +_bluegl_glDrawBuffer: + adrp x16, ___blue_glCore_glDrawBuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawBuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormalP3uiv +.private_extern _bluegl_glClear .align 2 -_bluegl_glNormalP3uiv: - adrp x16, ___blue_glCore_glNormalP3uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormalP3uiv@GOTPAGEOFF] +_bluegl_glClear: + adrp x16, ___blue_glCore_glClear@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClear@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColor4fNormal3fVertex3fSUN +.private_extern _bluegl_glClearColor .align 2 -_bluegl_glColor4fNormal3fVertex3fSUN: - adrp x16, ___blue_glCore_glColor4fNormal3fVertex3fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColor4fNormal3fVertex3fSUN@GOTPAGEOFF] +_bluegl_glClearColor: + adrp x16, ___blue_glCore_glClearColor@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearColor@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMapVertexAttrib1fAPPLE +.private_extern _bluegl_glClearStencil .align 2 -_bluegl_glMapVertexAttrib1fAPPLE: - adrp x16, ___blue_glCore_glMapVertexAttrib1fAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMapVertexAttrib1fAPPLE@GOTPAGEOFF] +_bluegl_glClearStencil: + adrp x16, ___blue_glCore_glClearStencil@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearStencil@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord2fNormal3fVertex3fvSUN +.private_extern _bluegl_glClearDepth .align 2 -_bluegl_glTexCoord2fNormal3fVertex3fvSUN: - adrp x16, ___blue_glCore_glTexCoord2fNormal3fVertex3fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord2fNormal3fVertex3fvSUN@GOTPAGEOFF] +_bluegl_glClearDepth: + adrp x16, ___blue_glCore_glClearDepth@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearDepth@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayVertexBuffers +.private_extern _bluegl_glStencilMask .align 2 -_bluegl_glVertexArrayVertexBuffers: - adrp x16, ___blue_glCore_glVertexArrayVertexBuffers@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayVertexBuffers@GOTPAGEOFF] +_bluegl_glStencilMask: + adrp x16, ___blue_glCore_glStencilMask@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStencilMask@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glShaderSource +.private_extern _bluegl_glColorMask .align 2 -_bluegl_glShaderSource: - adrp x16, ___blue_glCore_glShaderSource@GOTPAGE - ldr x16, [x16, ___blue_glCore_glShaderSource@GOTPAGEOFF] +_bluegl_glColorMask: + adrp x16, ___blue_glCore_glColorMask@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorMask@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glConvolutionFilter1D +.private_extern _bluegl_glDepthMask .align 2 -_bluegl_glConvolutionFilter1D: - adrp x16, ___blue_glCore_glConvolutionFilter1D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glConvolutionFilter1D@GOTPAGEOFF] +_bluegl_glDepthMask: + adrp x16, ___blue_glCore_glDepthMask@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDepthMask@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsFenceAPPLE +.private_extern _bluegl_glDisable .align 2 -_bluegl_glIsFenceAPPLE: - adrp x16, ___blue_glCore_glIsFenceAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsFenceAPPLE@GOTPAGEOFF] +_bluegl_glDisable: + adrp x16, ___blue_glCore_glDisable@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDisable@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2s +.private_extern _bluegl_glEnable .align 2 -_bluegl_glWindowPos2s: - adrp x16, ___blue_glCore_glWindowPos2s@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2s@GOTPAGEOFF] +_bluegl_glEnable: + adrp x16, ___blue_glCore_glEnable@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEnable@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEvaluateDepthValuesARB +.private_extern _bluegl_glFinish .align 2 -_bluegl_glEvaluateDepthValuesARB: - adrp x16, ___blue_glCore_glEvaluateDepthValuesARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEvaluateDepthValuesARB@GOTPAGEOFF] +_bluegl_glFinish: + adrp x16, ___blue_glCore_glFinish@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFinish@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glInterpolatePathsNV +.private_extern _bluegl_glFlush .align 2 -_bluegl_glInterpolatePathsNV: - adrp x16, ___blue_glCore_glInterpolatePathsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glInterpolatePathsNV@GOTPAGEOFF] +_bluegl_glFlush: + adrp x16, ___blue_glCore_glFlush@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFlush@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureParameterivEXT +.private_extern _bluegl_glBlendFunc .align 2 -_bluegl_glTextureParameterivEXT: - adrp x16, ___blue_glCore_glTextureParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureParameterivEXT@GOTPAGEOFF] +_bluegl_glBlendFunc: + adrp x16, ___blue_glCore_glBlendFunc@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendFunc@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteOcclusionQueriesNV +.private_extern _bluegl_glLogicOp .align 2 -_bluegl_glDeleteOcclusionQueriesNV: - adrp x16, ___blue_glCore_glDeleteOcclusionQueriesNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteOcclusionQueriesNV@GOTPAGEOFF] +_bluegl_glLogicOp: + adrp x16, ___blue_glCore_glLogicOp@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLogicOp@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMakeTextureHandleResidentARB +.private_extern _bluegl_glStencilFunc .align 2 -_bluegl_glMakeTextureHandleResidentARB: - adrp x16, ___blue_glCore_glMakeTextureHandleResidentARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMakeTextureHandleResidentARB@GOTPAGEOFF] +_bluegl_glStencilFunc: + adrp x16, ___blue_glCore_glStencilFunc@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStencilFunc@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyImageSubDataNV +.private_extern _bluegl_glStencilOp .align 2 -_bluegl_glCopyImageSubDataNV: - adrp x16, ___blue_glCore_glCopyImageSubDataNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyImageSubDataNV@GOTPAGEOFF] +_bluegl_glStencilOp: + adrp x16, ___blue_glCore_glStencilOp@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStencilOp@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL3d +.private_extern _bluegl_glDepthFunc .align 2 -_bluegl_glVertexAttribL3d: - adrp x16, ___blue_glCore_glVertexAttribL3d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL3d@GOTPAGEOFF] +_bluegl_glDepthFunc: + adrp x16, ___blue_glCore_glDepthFunc@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDepthFunc@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureSamplerHandleNV +.private_extern _bluegl_glPixelStoref .align 2 -_bluegl_glGetTextureSamplerHandleNV: - adrp x16, ___blue_glCore_glGetTextureSamplerHandleNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureSamplerHandleNV@GOTPAGEOFF] +_bluegl_glPixelStoref: + adrp x16, ___blue_glCore_glPixelStoref@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPixelStoref@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMakeTextureHandleResidentNV +.private_extern _bluegl_glPixelStorei .align 2 -_bluegl_glMakeTextureHandleResidentNV: - adrp x16, ___blue_glCore_glMakeTextureHandleResidentNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMakeTextureHandleResidentNV@GOTPAGEOFF] +_bluegl_glPixelStorei: + adrp x16, ___blue_glCore_glPixelStorei@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPixelStorei@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPolygonOffsetxOES +.private_extern _bluegl_glReadBuffer .align 2 -_bluegl_glPolygonOffsetxOES: - adrp x16, ___blue_glCore_glPolygonOffsetxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPolygonOffsetxOES@GOTPAGEOFF] - ldr x16, [x16] - br x16 - -.private_extern _bluegl_glUniformMatrix2fv - .align 2 -_bluegl_glUniformMatrix2fv: - adrp x16, ___blue_glCore_glUniformMatrix2fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix2fv@GOTPAGEOFF] - ldr x16, [x16] - br x16 - -.private_extern _bluegl_glMultiDrawElementsEXT - .align 2 -_bluegl_glMultiDrawElementsEXT: - adrp x16, ___blue_glCore_glMultiDrawElementsEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiDrawElementsEXT@GOTPAGEOFF] - ldr x16, [x16] - br x16 - -.private_extern _bluegl_glVertexAttribI1uiv - .align 2 -_bluegl_glVertexAttribI1uiv: - adrp x16, ___blue_glCore_glVertexAttribI1uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI1uiv@GOTPAGEOFF] +_bluegl_glReadBuffer: + adrp x16, ___blue_glCore_glReadBuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReadBuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathCoordsNV +.private_extern _bluegl_glReadPixels .align 2 -_bluegl_glPathCoordsNV: - adrp x16, ___blue_glCore_glPathCoordsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathCoordsNV@GOTPAGEOFF] +_bluegl_glReadPixels: + adrp x16, ___blue_glCore_glReadPixels@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReadPixels@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayVertexBindingDivisorEXT +.private_extern _bluegl_glGetBooleanv .align 2 -_bluegl_glVertexArrayVertexBindingDivisorEXT: - adrp x16, ___blue_glCore_glVertexArrayVertexBindingDivisorEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayVertexBindingDivisorEXT@GOTPAGEOFF] +_bluegl_glGetBooleanv: + adrp x16, ___blue_glCore_glGetBooleanv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetBooleanv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2dv +.private_extern _bluegl_glGetDoublev .align 2 -_bluegl_glVertexAttrib2dv: - adrp x16, ___blue_glCore_glVertexAttrib2dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2dv@GOTPAGEOFF] +_bluegl_glGetDoublev: + adrp x16, ___blue_glCore_glGetDoublev@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetDoublev@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFinish +.private_extern _bluegl_glGetError .align 2 -_bluegl_glFinish: - adrp x16, ___blue_glCore_glFinish@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFinish@GOTPAGEOFF] +_bluegl_glGetError: + adrp x16, ___blue_glCore_glGetError@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetError@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribs2dvNV +.private_extern _bluegl_glGetFloatv .align 2 -_bluegl_glVertexAttribs2dvNV: - adrp x16, ___blue_glCore_glVertexAttribs2dvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribs2dvNV@GOTPAGEOFF] +_bluegl_glGetFloatv: + adrp x16, ___blue_glCore_glGetFloatv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFloatv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI1ivEXT +.private_extern _bluegl_glGetIntegerv .align 2 -_bluegl_glVertexAttribI1ivEXT: - adrp x16, ___blue_glCore_glVertexAttribI1ivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI1ivEXT@GOTPAGEOFF] +_bluegl_glGetIntegerv: + adrp x16, ___blue_glCore_glGetIntegerv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetIntegerv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2sNV +.private_extern _bluegl_glGetString .align 2 -_bluegl_glVertexAttrib2sNV: - adrp x16, ___blue_glCore_glVertexAttrib2sNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2sNV@GOTPAGEOFF] +_bluegl_glGetString: + adrp x16, ___blue_glCore_glGetString@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetString@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1iv +.private_extern _bluegl_glGetTexImage .align 2 -_bluegl_glMultiTexCoord1iv: - adrp x16, ___blue_glCore_glMultiTexCoord1iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1iv@GOTPAGEOFF] +_bluegl_glGetTexImage: + adrp x16, ___blue_glCore_glGetTexImage@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTexImage@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnMapiv +.private_extern _bluegl_glGetTexParameterfv .align 2 -_bluegl_glGetnMapiv: - adrp x16, ___blue_glCore_glGetnMapiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnMapiv@GOTPAGEOFF] +_bluegl_glGetTexParameterfv: + adrp x16, ___blue_glCore_glGetTexParameterfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTexParameterfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTexSubImage1DARB +.private_extern _bluegl_glGetTexParameteriv .align 2 -_bluegl_glCompressedTexSubImage1DARB: - adrp x16, ___blue_glCore_glCompressedTexSubImage1DARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTexSubImage1DARB@GOTPAGEOFF] +_bluegl_glGetTexParameteriv: + adrp x16, ___blue_glCore_glGetTexParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTexParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFogCoordPointerEXT +.private_extern _bluegl_glGetTexLevelParameterfv .align 2 -_bluegl_glFogCoordPointerEXT: - adrp x16, ___blue_glCore_glFogCoordPointerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFogCoordPointerEXT@GOTPAGEOFF] +_bluegl_glGetTexLevelParameterfv: + adrp x16, ___blue_glCore_glGetTexLevelParameterfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTexLevelParameterfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedMultiTexImage1DEXT +.private_extern _bluegl_glGetTexLevelParameteriv .align 2 -_bluegl_glCompressedMultiTexImage1DEXT: - adrp x16, ___blue_glCore_glCompressedMultiTexImage1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedMultiTexImage1DEXT@GOTPAGEOFF] +_bluegl_glGetTexLevelParameteriv: + adrp x16, ___blue_glCore_glGetTexLevelParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTexLevelParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3d +.private_extern _bluegl_glIsEnabled .align 2 -_bluegl_glVertexAttrib3d: - adrp x16, ___blue_glCore_glVertexAttrib3d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3d@GOTPAGEOFF] +_bluegl_glIsEnabled: + adrp x16, ___blue_glCore_glIsEnabled@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsEnabled@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLineWidth +.private_extern _bluegl_glDepthRange .align 2 -_bluegl_glLineWidth: - adrp x16, ___blue_glCore_glLineWidth@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLineWidth@GOTPAGEOFF] +_bluegl_glDepthRange: + adrp x16, ___blue_glCore_glDepthRange@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDepthRange@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetShaderiv +.private_extern _bluegl_glViewport .align 2 -_bluegl_glGetShaderiv: - adrp x16, ___blue_glCore_glGetShaderiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetShaderiv@GOTPAGEOFF] +_bluegl_glViewport: + adrp x16, ___blue_glCore_glViewport@GOTPAGE + ldr x16, [x16, ___blue_glCore_glViewport@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1dv +.private_extern _bluegl_glDrawArrays .align 2 -_bluegl_glProgramUniform1dv: - adrp x16, ___blue_glCore_glProgramUniform1dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1dv@GOTPAGEOFF] +_bluegl_glDrawArrays: + adrp x16, ___blue_glCore_glDrawArrays@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawArrays@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribLui64vNV +.private_extern _bluegl_glDrawElements .align 2 -_bluegl_glGetVertexAttribLui64vNV: - adrp x16, ___blue_glCore_glGetVertexAttribLui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribLui64vNV@GOTPAGEOFF] +_bluegl_glDrawElements: + adrp x16, ___blue_glCore_glDrawElements@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawElements@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1ui64vNV +.private_extern _bluegl_glGetPointerv .align 2 -_bluegl_glProgramUniform1ui64vNV: - adrp x16, ___blue_glCore_glProgramUniform1ui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1ui64vNV@GOTPAGEOFF] +_bluegl_glGetPointerv: + adrp x16, ___blue_glCore_glGetPointerv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPointerv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetRenderbufferParameteriv +.private_extern _bluegl_glPolygonOffset .align 2 -_bluegl_glGetRenderbufferParameteriv: - adrp x16, ___blue_glCore_glGetRenderbufferParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetRenderbufferParameteriv@GOTPAGEOFF] +_bluegl_glPolygonOffset: + adrp x16, ___blue_glCore_glPolygonOffset@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPolygonOffset@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetOcclusionQueryivNV +.private_extern _bluegl_glCopyTexImage1D .align 2 -_bluegl_glGetOcclusionQueryivNV: - adrp x16, ___blue_glCore_glGetOcclusionQueryivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetOcclusionQueryivNV@GOTPAGEOFF] +_bluegl_glCopyTexImage1D: + adrp x16, ___blue_glCore_glCopyTexImage1D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyTexImage1D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix2x4dv +.private_extern _bluegl_glCopyTexImage2D .align 2 -_bluegl_glUniformMatrix2x4dv: - adrp x16, ___blue_glCore_glUniformMatrix2x4dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix2x4dv@GOTPAGEOFF] +_bluegl_glCopyTexImage2D: + adrp x16, ___blue_glCore_glCopyTexImage2D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyTexImage2D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribPointervNV +.private_extern _bluegl_glCopyTexSubImage1D .align 2 -_bluegl_glGetVertexAttribPointervNV: - adrp x16, ___blue_glCore_glGetVertexAttribPointervNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribPointervNV@GOTPAGEOFF] +_bluegl_glCopyTexSubImage1D: + adrp x16, ___blue_glCore_glCopyTexSubImage1D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyTexSubImage1D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2fv +.private_extern _bluegl_glCopyTexSubImage2D .align 2 -_bluegl_glUniform2fv: - adrp x16, ___blue_glCore_glUniform2fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2fv@GOTPAGEOFF] +_bluegl_glCopyTexSubImage2D: + adrp x16, ___blue_glCore_glCopyTexSubImage2D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyTexSubImage2D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glRasterPos2xOES +.private_extern _bluegl_glTexSubImage1D .align 2 -_bluegl_glRasterPos2xOES: - adrp x16, ___blue_glCore_glRasterPos2xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glRasterPos2xOES@GOTPAGEOFF] +_bluegl_glTexSubImage1D: + adrp x16, ___blue_glCore_glTexSubImage1D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexSubImage1D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetCommandHeaderNV +.private_extern _bluegl_glTexSubImage2D .align 2 -_bluegl_glGetCommandHeaderNV: - adrp x16, ___blue_glCore_glGetCommandHeaderNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetCommandHeaderNV@GOTPAGEOFF] +_bluegl_glTexSubImage2D: + adrp x16, ___blue_glCore_glTexSubImage2D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexSubImage2D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformSubroutinesuiv +.private_extern _bluegl_glBindTexture .align 2 -_bluegl_glUniformSubroutinesuiv: - adrp x16, ___blue_glCore_glUniformSubroutinesuiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformSubroutinesuiv@GOTPAGEOFF] +_bluegl_glBindTexture: + adrp x16, ___blue_glCore_glBindTexture@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindTexture@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPixelTransformParameterivEXT +.private_extern _bluegl_glDeleteTextures .align 2 -_bluegl_glGetPixelTransformParameterivEXT: - adrp x16, ___blue_glCore_glGetPixelTransformParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPixelTransformParameterivEXT@GOTPAGEOFF] +_bluegl_glDeleteTextures: + adrp x16, ___blue_glCore_glDeleteTextures@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteTextures@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFragDataLocation +.private_extern _bluegl_glGenTextures .align 2 -_bluegl_glGetFragDataLocation: - adrp x16, ___blue_glCore_glGetFragDataLocation@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFragDataLocation@GOTPAGEOFF] +_bluegl_glGenTextures: + adrp x16, ___blue_glCore_glGenTextures@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenTextures@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord2fColor3fVertex3fSUN +.private_extern _bluegl_glIsTexture .align 2 -_bluegl_glTexCoord2fColor3fVertex3fSUN: - adrp x16, ___blue_glCore_glTexCoord2fColor3fVertex3fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord2fColor3fVertex3fSUN@GOTPAGEOFF] +_bluegl_glIsTexture: + adrp x16, ___blue_glCore_glIsTexture@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsTexture@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3uiv +.private_extern _bluegl_glDrawRangeElements .align 2 -_bluegl_glSecondaryColor3uiv: - adrp x16, ___blue_glCore_glSecondaryColor3uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3uiv@GOTPAGEOFF] +_bluegl_glDrawRangeElements: + adrp x16, ___blue_glCore_glDrawRangeElements@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawRangeElements@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEnableVertexArrayAttribEXT +.private_extern _bluegl_glTexImage3D .align 2 -_bluegl_glEnableVertexArrayAttribEXT: - adrp x16, ___blue_glCore_glEnableVertexArrayAttribEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEnableVertexArrayAttribEXT@GOTPAGEOFF] +_bluegl_glTexImage3D: + adrp x16, ___blue_glCore_glTexImage3D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexImage3D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPixelTexGenParameterfvSGIS +.private_extern _bluegl_glTexSubImage3D .align 2 -_bluegl_glPixelTexGenParameterfvSGIS: - adrp x16, ___blue_glCore_glPixelTexGenParameterfvSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPixelTexGenParameterfvSGIS@GOTPAGEOFF] +_bluegl_glTexSubImage3D: + adrp x16, ___blue_glCore_glTexSubImage3D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexSubImage3D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix3x4dvEXT +.private_extern _bluegl_glCopyTexSubImage3D .align 2 -_bluegl_glProgramUniformMatrix3x4dvEXT: - adrp x16, ___blue_glCore_glProgramUniformMatrix3x4dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3x4dvEXT@GOTPAGEOFF] +_bluegl_glCopyTexSubImage3D: + adrp x16, ___blue_glCore_glCopyTexSubImage3D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyTexSubImage3D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2fvARB +.private_extern _bluegl_glActiveTexture .align 2 -_bluegl_glMultiTexCoord2fvARB: - adrp x16, ___blue_glCore_glMultiTexCoord2fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2fvARB@GOTPAGEOFF] +_bluegl_glActiveTexture: + adrp x16, ___blue_glCore_glActiveTexture@GOTPAGE + ldr x16, [x16, ___blue_glCore_glActiveTexture@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glHistogram +.private_extern _bluegl_glSampleCoverage .align 2 -_bluegl_glHistogram: - adrp x16, ___blue_glCore_glHistogram@GOTPAGE - ldr x16, [x16, ___blue_glCore_glHistogram@GOTPAGEOFF] +_bluegl_glSampleCoverage: + adrp x16, ___blue_glCore_glSampleCoverage@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSampleCoverage@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetSynciv +.private_extern _bluegl_glCompressedTexImage3D .align 2 -_bluegl_glGetSynciv: - adrp x16, ___blue_glCore_glGetSynciv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetSynciv@GOTPAGEOFF] +_bluegl_glCompressedTexImage3D: + adrp x16, ___blue_glCore_glCompressedTexImage3D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTexImage3D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBitmapxOES +.private_extern _bluegl_glCompressedTexImage2D .align 2 -_bluegl_glBitmapxOES: - adrp x16, ___blue_glCore_glBitmapxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBitmapxOES@GOTPAGEOFF] +_bluegl_glCompressedTexImage2D: + adrp x16, ___blue_glCore_glCompressedTexImage2D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTexImage2D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnColorTable +.private_extern _bluegl_glCompressedTexImage1D .align 2 -_bluegl_glGetnColorTable: - adrp x16, ___blue_glCore_glGetnColorTable@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnColorTable@GOTPAGEOFF] +_bluegl_glCompressedTexImage1D: + adrp x16, ___blue_glCore_glCompressedTexImage1D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTexImage1D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenerateMultiTexMipmapEXT +.private_extern _bluegl_glCompressedTexSubImage3D .align 2 -_bluegl_glGenerateMultiTexMipmapEXT: - adrp x16, ___blue_glCore_glGenerateMultiTexMipmapEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenerateMultiTexMipmapEXT@GOTPAGEOFF] +_bluegl_glCompressedTexSubImage3D: + adrp x16, ___blue_glCore_glCompressedTexSubImage3D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTexSubImage3D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream4fvATI +.private_extern _bluegl_glCompressedTexSubImage2D .align 2 -_bluegl_glVertexStream4fvATI: - adrp x16, ___blue_glCore_glVertexStream4fvATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream4fvATI@GOTPAGEOFF] +_bluegl_glCompressedTexSubImage2D: + adrp x16, ___blue_glCore_glCompressedTexSubImage2D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTexSubImage2D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColorPointerEXT +.private_extern _bluegl_glCompressedTexSubImage1D .align 2 -_bluegl_glSecondaryColorPointerEXT: - adrp x16, ___blue_glCore_glSecondaryColorPointerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColorPointerEXT@GOTPAGEOFF] +_bluegl_glCompressedTexSubImage1D: + adrp x16, ___blue_glCore_glCompressedTexSubImage1D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTexSubImage1D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribIPointerEXT +.private_extern _bluegl_glGetCompressedTexImage .align 2 -_bluegl_glVertexAttribIPointerEXT: - adrp x16, ___blue_glCore_glVertexAttribIPointerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribIPointerEXT@GOTPAGEOFF] +_bluegl_glGetCompressedTexImage: + adrp x16, ___blue_glCore_glGetCompressedTexImage@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetCompressedTexImage@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEvalCoord2xvOES +.private_extern _bluegl_glBlendFuncSeparate .align 2 -_bluegl_glEvalCoord2xvOES: - adrp x16, ___blue_glCore_glEvalCoord2xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEvalCoord2xvOES@GOTPAGEOFF] +_bluegl_glBlendFuncSeparate: + adrp x16, ___blue_glCore_glBlendFuncSeparate@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendFuncSeparate@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteFencesNV +.private_extern _bluegl_glMultiDrawArrays .align 2 -_bluegl_glDeleteFencesNV: - adrp x16, ___blue_glCore_glDeleteFencesNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteFencesNV@GOTPAGEOFF] +_bluegl_glMultiDrawArrays: + adrp x16, ___blue_glCore_glMultiDrawArrays@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiDrawArrays@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glAlphaFragmentOp1ATI +.private_extern _bluegl_glMultiDrawElements .align 2 -_bluegl_glAlphaFragmentOp1ATI: - adrp x16, ___blue_glCore_glAlphaFragmentOp1ATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glAlphaFragmentOp1ATI@GOTPAGEOFF] +_bluegl_glMultiDrawElements: + adrp x16, ___blue_glCore_glMultiDrawElements@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiDrawElements@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetActiveUniformName +.private_extern _bluegl_glPointParameterf .align 2 -_bluegl_glGetActiveUniformName: - adrp x16, ___blue_glCore_glGetActiveUniformName@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetActiveUniformName@GOTPAGEOFF] +_bluegl_glPointParameterf: + adrp x16, ___blue_glCore_glPointParameterf@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPointParameterf@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetCompressedTextureSubImage +.private_extern _bluegl_glPointParameterfv .align 2 -_bluegl_glGetCompressedTextureSubImage: - adrp x16, ___blue_glCore_glGetCompressedTextureSubImage@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetCompressedTextureSubImage@GOTPAGEOFF] +_bluegl_glPointParameterfv: + adrp x16, ___blue_glCore_glPointParameterfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPointParameterfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureParameterfvEXT +.private_extern _bluegl_glPointParameteri .align 2 -_bluegl_glGetTextureParameterfvEXT: - adrp x16, ___blue_glCore_glGetTextureParameterfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureParameterfvEXT@GOTPAGEOFF] +_bluegl_glPointParameteri: + adrp x16, ___blue_glCore_glPointParameteri@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPointParameteri@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteShader +.private_extern _bluegl_glPointParameteriv .align 2 -_bluegl_glDeleteShader: - adrp x16, ___blue_glCore_glDeleteShader@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteShader@GOTPAGEOFF] +_bluegl_glPointParameteriv: + adrp x16, ___blue_glCore_glPointParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPointParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glRenderbufferStorageMultisample +.private_extern _bluegl_glBlendColor .align 2 -_bluegl_glRenderbufferStorageMultisample: - adrp x16, ___blue_glCore_glRenderbufferStorageMultisample@GOTPAGE - ldr x16, [x16, ___blue_glCore_glRenderbufferStorageMultisample@GOTPAGEOFF] +_bluegl_glBlendColor: + adrp x16, ___blue_glCore_glBlendColor@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendColor@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord2fVertex3fSUN +.private_extern _bluegl_glBlendEquation .align 2 -_bluegl_glTexCoord2fVertex3fSUN: - adrp x16, ___blue_glCore_glTexCoord2fVertex3fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord2fVertex3fSUN@GOTPAGEOFF] +_bluegl_glBlendEquation: + adrp x16, ___blue_glCore_glBlendEquation@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendEquation@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetActiveSubroutineUniformName +.private_extern _bluegl_glGenQueries .align 2 -_bluegl_glGetActiveSubroutineUniformName: - adrp x16, ___blue_glCore_glGetActiveSubroutineUniformName@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetActiveSubroutineUniformName@GOTPAGEOFF] +_bluegl_glGenQueries: + adrp x16, ___blue_glCore_glGenQueries@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenQueries@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVideoCaptureStreamfvNV +.private_extern _bluegl_glDeleteQueries .align 2 -_bluegl_glGetVideoCaptureStreamfvNV: - adrp x16, ___blue_glCore_glGetVideoCaptureStreamfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVideoCaptureStreamfvNV@GOTPAGEOFF] +_bluegl_glDeleteQueries: + adrp x16, ___blue_glCore_glDeleteQueries@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteQueries@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glInvalidateSubFramebuffer +.private_extern _bluegl_glIsQuery .align 2 -_bluegl_glInvalidateSubFramebuffer: - adrp x16, ___blue_glCore_glInvalidateSubFramebuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glInvalidateSubFramebuffer@GOTPAGEOFF] +_bluegl_glIsQuery: + adrp x16, ___blue_glCore_glIsQuery@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsQuery@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIndexFormatNV +.private_extern _bluegl_glBeginQuery .align 2 -_bluegl_glIndexFormatNV: - adrp x16, ___blue_glCore_glIndexFormatNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIndexFormatNV@GOTPAGEOFF] +_bluegl_glBeginQuery: + adrp x16, ___blue_glCore_glBeginQuery@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBeginQuery@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexEnvfvEXT +.private_extern _bluegl_glEndQuery .align 2 -_bluegl_glMultiTexEnvfvEXT: - adrp x16, ___blue_glCore_glMultiTexEnvfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexEnvfvEXT@GOTPAGEOFF] +_bluegl_glEndQuery: + adrp x16, ___blue_glCore_glEndQuery@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEndQuery@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformBufferEXT +.private_extern _bluegl_glGetQueryiv .align 2 -_bluegl_glUniformBufferEXT: - adrp x16, ___blue_glCore_glUniformBufferEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformBufferEXT@GOTPAGEOFF] +_bluegl_glGetQueryiv: + adrp x16, ___blue_glCore_glGetQueryiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetQueryiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedProgramLocalParametersI4uivEXT +.private_extern _bluegl_glGetQueryObjectiv .align 2 -_bluegl_glNamedProgramLocalParametersI4uivEXT: - adrp x16, ___blue_glCore_glNamedProgramLocalParametersI4uivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParametersI4uivEXT@GOTPAGEOFF] +_bluegl_glGetQueryObjectiv: + adrp x16, ___blue_glCore_glGetQueryObjectiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetQueryObjectiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWeightPathsNV +.private_extern _bluegl_glGetQueryObjectuiv .align 2 -_bluegl_glWeightPathsNV: - adrp x16, ___blue_glCore_glWeightPathsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWeightPathsNV@GOTPAGEOFF] +_bluegl_glGetQueryObjectuiv: + adrp x16, ___blue_glCore_glGetQueryObjectuiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetQueryObjectuiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnHistogram +.private_extern _bluegl_glBindBuffer .align 2 -_bluegl_glGetnHistogram: - adrp x16, ___blue_glCore_glGetnHistogram@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnHistogram@GOTPAGEOFF] +_bluegl_glBindBuffer: + adrp x16, ___blue_glCore_glBindBuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindBuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord1bOES +.private_extern _bluegl_glDeleteBuffers .align 2 -_bluegl_glTexCoord1bOES: - adrp x16, ___blue_glCore_glTexCoord1bOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord1bOES@GOTPAGEOFF] +_bluegl_glDeleteBuffers: + adrp x16, ___blue_glCore_glDeleteBuffers@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteBuffers@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSetFragmentShaderConstantATI +.private_extern _bluegl_glGenBuffers .align 2 -_bluegl_glSetFragmentShaderConstantATI: - adrp x16, ___blue_glCore_glSetFragmentShaderConstantATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSetFragmentShaderConstantATI@GOTPAGEOFF] +_bluegl_glGenBuffers: + adrp x16, ___blue_glCore_glGenBuffers@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenBuffers@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glRasterPos3xvOES +.private_extern _bluegl_glIsBuffer .align 2 -_bluegl_glRasterPos3xvOES: - adrp x16, ___blue_glCore_glRasterPos3xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glRasterPos3xvOES@GOTPAGEOFF] +_bluegl_glIsBuffer: + adrp x16, ___blue_glCore_glIsBuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsBuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyConvolutionFilter1DEXT +.private_extern _bluegl_glBufferData .align 2 -_bluegl_glCopyConvolutionFilter1DEXT: - adrp x16, ___blue_glCore_glCopyConvolutionFilter1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyConvolutionFilter1DEXT@GOTPAGEOFF] +_bluegl_glBufferData: + adrp x16, ___blue_glCore_glBufferData@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBufferData@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glArrayElementEXT +.private_extern _bluegl_glBufferSubData .align 2 -_bluegl_glArrayElementEXT: - adrp x16, ___blue_glCore_glArrayElementEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glArrayElementEXT@GOTPAGEOFF] +_bluegl_glBufferSubData: + adrp x16, ___blue_glCore_glBufferSubData@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBufferSubData@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyTextureImage2DEXT +.private_extern _bluegl_glGetBufferSubData .align 2 -_bluegl_glCopyTextureImage2DEXT: - adrp x16, ___blue_glCore_glCopyTextureImage2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyTextureImage2DEXT@GOTPAGEOFF] +_bluegl_glGetBufferSubData: + adrp x16, ___blue_glCore_glGetBufferSubData@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetBufferSubData@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedProgramLocalParameterI4uivEXT +.private_extern _bluegl_glMapBuffer .align 2 -_bluegl_glNamedProgramLocalParameterI4uivEXT: - adrp x16, ___blue_glCore_glNamedProgramLocalParameterI4uivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParameterI4uivEXT@GOTPAGEOFF] +_bluegl_glMapBuffer: + adrp x16, ___blue_glCore_glMapBuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMapBuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiDrawElementsIndirectBindlessNV +.private_extern _bluegl_glUnmapBuffer .align 2 -_bluegl_glMultiDrawElementsIndirectBindlessNV: - adrp x16, ___blue_glCore_glMultiDrawElementsIndirectBindlessNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiDrawElementsIndirectBindlessNV@GOTPAGEOFF] +_bluegl_glUnmapBuffer: + adrp x16, ___blue_glCore_glUnmapBuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUnmapBuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearColorIuiEXT +.private_extern _bluegl_glGetBufferParameteriv .align 2 -_bluegl_glClearColorIuiEXT: - adrp x16, ___blue_glCore_glClearColorIuiEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearColorIuiEXT@GOTPAGEOFF] +_bluegl_glGetBufferParameteriv: + adrp x16, ___blue_glCore_glGetBufferParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetBufferParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexParameterfEXT +.private_extern _bluegl_glGetBufferPointerv .align 2 -_bluegl_glMultiTexParameterfEXT: - adrp x16, ___blue_glCore_glMultiTexParameterfEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexParameterfEXT@GOTPAGEOFF] +_bluegl_glGetBufferPointerv: + adrp x16, ___blue_glCore_glGetBufferPointerv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetBufferPointerv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayVertexAttribIFormatEXT +.private_extern _bluegl_glBlendEquationSeparate .align 2 -_bluegl_glVertexArrayVertexAttribIFormatEXT: - adrp x16, ___blue_glCore_glVertexArrayVertexAttribIFormatEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayVertexAttribIFormatEXT@GOTPAGEOFF] +_bluegl_glBlendEquationSeparate: + adrp x16, ___blue_glCore_glBlendEquationSeparate@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendEquationSeparate@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1sv +.private_extern _bluegl_glDrawBuffers .align 2 -_bluegl_glVertexAttrib1sv: - adrp x16, ___blue_glCore_glVertexAttrib1sv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1sv@GOTPAGEOFF] +_bluegl_glDrawBuffers: + adrp x16, ___blue_glCore_glDrawBuffers@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawBuffers@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream2dvATI +.private_extern _bluegl_glStencilOpSeparate .align 2 -_bluegl_glVertexStream2dvATI: - adrp x16, ___blue_glCore_glVertexStream2dvATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream2dvATI@GOTPAGEOFF] +_bluegl_glStencilOpSeparate: + adrp x16, ___blue_glCore_glStencilOpSeparate@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStencilOpSeparate@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4iARB +.private_extern _bluegl_glStencilFuncSeparate .align 2 -_bluegl_glUniform4iARB: - adrp x16, ___blue_glCore_glUniform4iARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4iARB@GOTPAGEOFF] +_bluegl_glStencilFuncSeparate: + adrp x16, ___blue_glCore_glStencilFuncSeparate@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStencilFuncSeparate@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribs4svNV +.private_extern _bluegl_glStencilMaskSeparate .align 2 -_bluegl_glVertexAttribs4svNV: - adrp x16, ___blue_glCore_glVertexAttribs4svNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribs4svNV@GOTPAGEOFF] +_bluegl_glStencilMaskSeparate: + adrp x16, ___blue_glCore_glStencilMaskSeparate@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStencilMaskSeparate@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix3x2dvEXT +.private_extern _bluegl_glAttachShader .align 2 -_bluegl_glProgramUniformMatrix3x2dvEXT: - adrp x16, ___blue_glCore_glProgramUniformMatrix3x2dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3x2dvEXT@GOTPAGEOFF] +_bluegl_glAttachShader: + adrp x16, ___blue_glCore_glAttachShader@GOTPAGE + ldr x16, [x16, ___blue_glCore_glAttachShader@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1ui +.private_extern _bluegl_glBindAttribLocation .align 2 -_bluegl_glProgramUniform1ui: - adrp x16, ___blue_glCore_glProgramUniform1ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1ui@GOTPAGEOFF] +_bluegl_glBindAttribLocation: + adrp x16, ___blue_glCore_glBindAttribLocation@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindAttribLocation@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribIFormatNV +.private_extern _bluegl_glCompileShader .align 2 -_bluegl_glVertexAttribIFormatNV: - adrp x16, ___blue_glCore_glVertexAttribIFormatNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribIFormatNV@GOTPAGEOFF] +_bluegl_glCompileShader: + adrp x16, ___blue_glCore_glCompileShader@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompileShader@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFragmentLightModelfSGIX +.private_extern _bluegl_glCreateProgram .align 2 -_bluegl_glFragmentLightModelfSGIX: - adrp x16, ___blue_glCore_glFragmentLightModelfSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFragmentLightModelfSGIX@GOTPAGEOFF] +_bluegl_glCreateProgram: + adrp x16, ___blue_glCore_glCreateProgram@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreateProgram@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetActiveSubroutineName +.private_extern _bluegl_glCreateShader .align 2 -_bluegl_glGetActiveSubroutineName: - adrp x16, ___blue_glCore_glGetActiveSubroutineName@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetActiveSubroutineName@GOTPAGEOFF] +_bluegl_glCreateShader: + adrp x16, ___blue_glCore_glCreateShader@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreateShader@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glConvolutionParameteri +.private_extern _bluegl_glDeleteProgram .align 2 -_bluegl_glConvolutionParameteri: - adrp x16, ___blue_glCore_glConvolutionParameteri@GOTPAGE - ldr x16, [x16, ___blue_glCore_glConvolutionParameteri@GOTPAGEOFF] +_bluegl_glDeleteProgram: + adrp x16, ___blue_glCore_glDeleteProgram@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteProgram@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4f +.private_extern _bluegl_glDeleteShader .align 2 -_bluegl_glMultiTexCoord4f: - adrp x16, ___blue_glCore_glMultiTexCoord4f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4f@GOTPAGEOFF] +_bluegl_glDeleteShader: + adrp x16, ___blue_glCore_glDeleteShader@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteShader@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord1xvOES +.private_extern _bluegl_glDetachShader .align 2 -_bluegl_glTexCoord1xvOES: - adrp x16, ___blue_glCore_glTexCoord1xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord1xvOES@GOTPAGEOFF] +_bluegl_glDetachShader: + adrp x16, ___blue_glCore_glDetachShader@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDetachShader@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsTransformFeedback +.private_extern _bluegl_glDisableVertexAttribArray .align 2 -_bluegl_glIsTransformFeedback: - adrp x16, ___blue_glCore_glIsTransformFeedback@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsTransformFeedback@GOTPAGEOFF] +_bluegl_glDisableVertexAttribArray: + adrp x16, ___blue_glCore_glDisableVertexAttribArray@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDisableVertexAttribArray@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendBarrierKHR +.private_extern _bluegl_glEnableVertexAttribArray .align 2 -_bluegl_glBlendBarrierKHR: - adrp x16, ___blue_glCore_glBlendBarrierKHR@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendBarrierKHR@GOTPAGEOFF] +_bluegl_glEnableVertexAttribArray: + adrp x16, ___blue_glCore_glEnableVertexAttribArray@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEnableVertexAttribArray@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindBufferRangeEXT +.private_extern _bluegl_glGetActiveAttrib .align 2 -_bluegl_glBindBufferRangeEXT: - adrp x16, ___blue_glCore_glBindBufferRangeEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindBufferRangeEXT@GOTPAGEOFF] +_bluegl_glGetActiveAttrib: + adrp x16, ___blue_glCore_glGetActiveAttrib@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetActiveAttrib@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathColorGenNV +.private_extern _bluegl_glGetActiveUniform .align 2 -_bluegl_glPathColorGenNV: - adrp x16, ___blue_glCore_glPathColorGenNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathColorGenNV@GOTPAGEOFF] +_bluegl_glGetActiveUniform: + adrp x16, ___blue_glCore_glGetActiveUniform@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetActiveUniform@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEndQuery +.private_extern _bluegl_glGetAttachedShaders .align 2 -_bluegl_glEndQuery: - adrp x16, ___blue_glCore_glEndQuery@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEndQuery@GOTPAGEOFF] +_bluegl_glGetAttachedShaders: + adrp x16, ___blue_glCore_glGetAttachedShaders@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetAttachedShaders@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix2x4fv +.private_extern _bluegl_glGetAttribLocation .align 2 -_bluegl_glUniformMatrix2x4fv: - adrp x16, ___blue_glCore_glUniformMatrix2x4fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix2x4fv@GOTPAGEOFF] +_bluegl_glGetAttribLocation: + adrp x16, ___blue_glCore_glGetAttribLocation@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetAttribLocation@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenRenderbuffers +.private_extern _bluegl_glGetProgramiv .align 2 -_bluegl_glGenRenderbuffers: - adrp x16, ___blue_glCore_glGenRenderbuffers@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenRenderbuffers@GOTPAGEOFF] +_bluegl_glGetProgramiv: + adrp x16, ___blue_glCore_glGetProgramiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glShaderOp2EXT +.private_extern _bluegl_glGetProgramInfoLog .align 2 -_bluegl_glShaderOp2EXT: - adrp x16, ___blue_glCore_glShaderOp2EXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glShaderOp2EXT@GOTPAGEOFF] +_bluegl_glGetProgramInfoLog: + adrp x16, ___blue_glCore_glGetProgramInfoLog@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramInfoLog@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawTransformFeedback +.private_extern _bluegl_glGetShaderiv .align 2 -_bluegl_glDrawTransformFeedback: - adrp x16, ___blue_glCore_glDrawTransformFeedback@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawTransformFeedback@GOTPAGEOFF] +_bluegl_glGetShaderiv: + adrp x16, ___blue_glCore_glGetShaderiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetShaderiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3ui64vNV +.private_extern _bluegl_glGetShaderInfoLog .align 2 -_bluegl_glProgramUniform3ui64vNV: - adrp x16, ___blue_glCore_glProgramUniform3ui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3ui64vNV@GOTPAGEOFF] +_bluegl_glGetShaderInfoLog: + adrp x16, ___blue_glCore_glGetShaderInfoLog@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetShaderInfoLog@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedBufferStorage +.private_extern _bluegl_glGetShaderSource .align 2 -_bluegl_glNamedBufferStorage: - adrp x16, ___blue_glCore_glNamedBufferStorage@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedBufferStorage@GOTPAGEOFF] +_bluegl_glGetShaderSource: + adrp x16, ___blue_glCore_glGetShaderSource@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetShaderSource@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glOrthoxOES +.private_extern _bluegl_glGetUniformLocation .align 2 -_bluegl_glOrthoxOES: - adrp x16, ___blue_glCore_glOrthoxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glOrthoxOES@GOTPAGEOFF] +_bluegl_glGetUniformLocation: + adrp x16, ___blue_glCore_glGetUniformLocation@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetUniformLocation@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4ubvARB +.private_extern _bluegl_glGetUniformfv .align 2 -_bluegl_glVertexAttrib4ubvARB: - adrp x16, ___blue_glCore_glVertexAttrib4ubvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4ubvARB@GOTPAGEOFF] +_bluegl_glGetUniformfv: + adrp x16, ___blue_glCore_glGetUniformfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetUniformfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStencilOp +.private_extern _bluegl_glGetUniformiv .align 2 -_bluegl_glStencilOp: - adrp x16, ___blue_glCore_glStencilOp@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStencilOp@GOTPAGEOFF] +_bluegl_glGetUniformiv: + adrp x16, ___blue_glCore_glGetUniformiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetUniformiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramLocalParametersI4ivNV +.private_extern _bluegl_glGetVertexAttribdv .align 2 -_bluegl_glProgramLocalParametersI4ivNV: - adrp x16, ___blue_glCore_glProgramLocalParametersI4ivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramLocalParametersI4ivNV@GOTPAGEOFF] +_bluegl_glGetVertexAttribdv: + adrp x16, ___blue_glCore_glGetVertexAttribdv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribdv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream2iATI +.private_extern _bluegl_glGetVertexAttribfv .align 2 -_bluegl_glVertexStream2iATI: - adrp x16, ___blue_glCore_glVertexStream2iATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream2iATI@GOTPAGEOFF] +_bluegl_glGetVertexAttribfv: + adrp x16, ___blue_glCore_glGetVertexAttribfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWeightdvARB +.private_extern _bluegl_glGetVertexAttribiv .align 2 -_bluegl_glWeightdvARB: - adrp x16, ___blue_glCore_glWeightdvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWeightdvARB@GOTPAGEOFF] +_bluegl_glGetVertexAttribiv: + adrp x16, ___blue_glCore_glGetVertexAttribiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1fARB +.private_extern _bluegl_glGetVertexAttribPointerv .align 2 -_bluegl_glVertexAttrib1fARB: - adrp x16, ___blue_glCore_glVertexAttrib1fARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1fARB@GOTPAGEOFF] +_bluegl_glGetVertexAttribPointerv: + adrp x16, ___blue_glCore_glGetVertexAttribPointerv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribPointerv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorFragmentOp2ATI +.private_extern _bluegl_glIsProgram .align 2 -_bluegl_glColorFragmentOp2ATI: - adrp x16, ___blue_glCore_glColorFragmentOp2ATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorFragmentOp2ATI@GOTPAGEOFF] +_bluegl_glIsProgram: + adrp x16, ___blue_glCore_glIsProgram@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsProgram@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetBufferPointervARB +.private_extern _bluegl_glIsShader .align 2 -_bluegl_glGetBufferPointervARB: - adrp x16, ___blue_glCore_glGetBufferPointervARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetBufferPointervARB@GOTPAGEOFF] +_bluegl_glIsShader: + adrp x16, ___blue_glCore_glIsShader@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsShader@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedFramebufferTexture1DEXT +.private_extern _bluegl_glLinkProgram .align 2 -_bluegl_glNamedFramebufferTexture1DEXT: - adrp x16, ___blue_glCore_glNamedFramebufferTexture1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedFramebufferTexture1DEXT@GOTPAGEOFF] +_bluegl_glLinkProgram: + adrp x16, ___blue_glCore_glLinkProgram@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLinkProgram@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2fNV +.private_extern _bluegl_glShaderSource .align 2 -_bluegl_glVertexAttrib2fNV: - adrp x16, ___blue_glCore_glVertexAttrib2fNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2fNV@GOTPAGEOFF] +_bluegl_glShaderSource: + adrp x16, ___blue_glCore_glShaderSource@GOTPAGE + ldr x16, [x16, ___blue_glCore_glShaderSource@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDisableVertexAttribArray +.private_extern _bluegl_glUseProgram .align 2 -_bluegl_glDisableVertexAttribArray: - adrp x16, ___blue_glCore_glDisableVertexAttribArray@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDisableVertexAttribArray@GOTPAGEOFF] +_bluegl_glUseProgram: + adrp x16, ___blue_glCore_glUseProgram@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUseProgram@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureParameterf +.private_extern _bluegl_glUniform1f .align 2 -_bluegl_glTextureParameterf: - adrp x16, ___blue_glCore_glTextureParameterf@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureParameterf@GOTPAGEOFF] +_bluegl_glUniform1f: + adrp x16, ___blue_glCore_glUniform1f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN +.private_extern _bluegl_glUniform2f .align 2 -_bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN: - adrp x16, ___blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN@GOTPAGEOFF] +_bluegl_glUniform2f: + adrp x16, ___blue_glCore_glUniform2f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormal3fVertex3fSUN +.private_extern _bluegl_glUniform3f .align 2 -_bluegl_glNormal3fVertex3fSUN: - adrp x16, ___blue_glCore_glNormal3fVertex3fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormal3fVertex3fSUN@GOTPAGEOFF] +_bluegl_glUniform3f: + adrp x16, ___blue_glCore_glUniform3f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTexBumpParameterfvATI +.private_extern _bluegl_glUniform4f .align 2 -_bluegl_glGetTexBumpParameterfvATI: - adrp x16, ___blue_glCore_glGetTexBumpParameterfvATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTexBumpParameterfvATI@GOTPAGEOFF] +_bluegl_glUniform4f: + adrp x16, ___blue_glCore_glUniform4f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3fARB +.private_extern _bluegl_glUniform1i .align 2 -_bluegl_glMultiTexCoord3fARB: - adrp x16, ___blue_glCore_glMultiTexCoord3fARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3fARB@GOTPAGEOFF] +_bluegl_glUniform1i: + adrp x16, ___blue_glCore_glUniform1i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureParameterfv +.private_extern _bluegl_glUniform2i .align 2 -_bluegl_glTextureParameterfv: - adrp x16, ___blue_glCore_glTextureParameterfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureParameterfv@GOTPAGEOFF] +_bluegl_glUniform2i: + adrp x16, ___blue_glCore_glUniform2i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexBumpParameterivATI +.private_extern _bluegl_glUniform3i .align 2 -_bluegl_glTexBumpParameterivATI: - adrp x16, ___blue_glCore_glTexBumpParameterivATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexBumpParameterivATI@GOTPAGEOFF] +_bluegl_glUniform3i: + adrp x16, ___blue_glCore_glUniform3i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLockArraysEXT +.private_extern _bluegl_glUniform4i .align 2 -_bluegl_glLockArraysEXT: - adrp x16, ___blue_glCore_glLockArraysEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLockArraysEXT@GOTPAGEOFF] +_bluegl_glUniform4i: + adrp x16, ___blue_glCore_glUniform4i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsEnabledIndexedEXT +.private_extern _bluegl_glUniform1fv .align 2 -_bluegl_glIsEnabledIndexedEXT: - adrp x16, ___blue_glCore_glIsEnabledIndexedEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsEnabledIndexedEXT@GOTPAGEOFF] +_bluegl_glUniform1fv: + adrp x16, ___blue_glCore_glUniform1fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenerateMipmapEXT +.private_extern _bluegl_glUniform2fv .align 2 -_bluegl_glGenerateMipmapEXT: - adrp x16, ___blue_glCore_glGenerateMipmapEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenerateMipmapEXT@GOTPAGEOFF] +_bluegl_glUniform2fv: + adrp x16, ___blue_glCore_glUniform2fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexP3uiv +.private_extern _bluegl_glUniform3fv .align 2 -_bluegl_glVertexP3uiv: - adrp x16, ___blue_glCore_glVertexP3uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexP3uiv@GOTPAGEOFF] +_bluegl_glUniform3fv: + adrp x16, ___blue_glCore_glUniform3fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearNamedBufferSubData +.private_extern _bluegl_glUniform4fv .align 2 -_bluegl_glClearNamedBufferSubData: - adrp x16, ___blue_glCore_glClearNamedBufferSubData@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearNamedBufferSubData@GOTPAGEOFF] +_bluegl_glUniform4fv: + adrp x16, ___blue_glCore_glUniform4fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glInvalidateTexImage +.private_extern _bluegl_glUniform1iv .align 2 -_bluegl_glInvalidateTexImage: - adrp x16, ___blue_glCore_glInvalidateTexImage@GOTPAGE - ldr x16, [x16, ___blue_glCore_glInvalidateTexImage@GOTPAGEOFF] +_bluegl_glUniform1iv: + adrp x16, ___blue_glCore_glUniform1iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindFramebuffer +.private_extern _bluegl_glUniform2iv .align 2 -_bluegl_glBindFramebuffer: - adrp x16, ___blue_glCore_glBindFramebuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindFramebuffer@GOTPAGEOFF] +_bluegl_glUniform2iv: + adrp x16, ___blue_glCore_glUniform2iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawArraysIndirect +.private_extern _bluegl_glUniform3iv .align 2 -_bluegl_glDrawArraysIndirect: - adrp x16, ___blue_glCore_glDrawArraysIndirect@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawArraysIndirect@GOTPAGEOFF] +_bluegl_glUniform3iv: + adrp x16, ___blue_glCore_glUniform3iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClipPlanexOES +.private_extern _bluegl_glUniform4iv .align 2 -_bluegl_glClipPlanexOES: - adrp x16, ___blue_glCore_glClipPlanexOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClipPlanexOES@GOTPAGEOFF] +_bluegl_glUniform4iv: + adrp x16, ___blue_glCore_glUniform4iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFloati_v +.private_extern _bluegl_glUniformMatrix2fv .align 2 -_bluegl_glGetFloati_v: - adrp x16, ___blue_glCore_glGetFloati_v@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFloati_v@GOTPAGEOFF] +_bluegl_glUniformMatrix2fv: + adrp x16, ___blue_glCore_glUniformMatrix2fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix2fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTransformFeedbackVaryingsEXT +.private_extern _bluegl_glUniformMatrix3fv .align 2 -_bluegl_glTransformFeedbackVaryingsEXT: - adrp x16, ___blue_glCore_glTransformFeedbackVaryingsEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTransformFeedbackVaryingsEXT@GOTPAGEOFF] +_bluegl_glUniformMatrix3fv: + adrp x16, ___blue_glCore_glUniformMatrix3fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix3fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetColorTableParameteriv +.private_extern _bluegl_glUniformMatrix4fv .align 2 -_bluegl_glGetColorTableParameteriv: - adrp x16, ___blue_glCore_glGetColorTableParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetColorTableParameteriv@GOTPAGEOFF] +_bluegl_glUniformMatrix4fv: + adrp x16, ___blue_glCore_glUniformMatrix4fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix4fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexBufferRange +.private_extern _bluegl_glValidateProgram .align 2 -_bluegl_glTexBufferRange: - adrp x16, ___blue_glCore_glTexBufferRange@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexBufferRange@GOTPAGEOFF] +_bluegl_glValidateProgram: + adrp x16, ___blue_glCore_glValidateProgram@GOTPAGE + ldr x16, [x16, ___blue_glCore_glValidateProgram@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI1uivEXT +.private_extern _bluegl_glVertexAttrib1d .align 2 -_bluegl_glVertexAttribI1uivEXT: - adrp x16, ___blue_glCore_glVertexAttribI1uivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI1uivEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib1d: + adrp x16, ___blue_glCore_glVertexAttrib1d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glShaderBinary +.private_extern _bluegl_glVertexAttrib1dv .align 2 -_bluegl_glShaderBinary: - adrp x16, ___blue_glCore_glShaderBinary@GOTPAGE - ldr x16, [x16, ___blue_glCore_glShaderBinary@GOTPAGEOFF] +_bluegl_glVertexAttrib1dv: + adrp x16, ___blue_glCore_glVertexAttrib1dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribLi64vNV +.private_extern _bluegl_glVertexAttrib1f .align 2 -_bluegl_glGetVertexAttribLi64vNV: - adrp x16, ___blue_glCore_glGetVertexAttribLi64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribLi64vNV@GOTPAGEOFF] +_bluegl_glVertexAttrib1f: + adrp x16, ___blue_glCore_glVertexAttrib1f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedBufferSubDataEXT +.private_extern _bluegl_glVertexAttrib1fv .align 2 -_bluegl_glGetNamedBufferSubDataEXT: - adrp x16, ___blue_glCore_glGetNamedBufferSubDataEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedBufferSubDataEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib1fv: + adrp x16, ___blue_glCore_glVertexAttrib1fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3uivEXT +.private_extern _bluegl_glVertexAttrib1s .align 2 -_bluegl_glUniform3uivEXT: - adrp x16, ___blue_glCore_glUniform3uivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3uivEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib1s: + adrp x16, ___blue_glCore_glVertexAttrib1s@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1s@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixTranslatefEXT +.private_extern _bluegl_glVertexAttrib1sv .align 2 -_bluegl_glMatrixTranslatefEXT: - adrp x16, ___blue_glCore_glMatrixTranslatefEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixTranslatefEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib1sv: + adrp x16, ___blue_glCore_glVertexAttrib1sv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1sv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribs2hvNV +.private_extern _bluegl_glVertexAttrib2d .align 2 -_bluegl_glVertexAttribs2hvNV: - adrp x16, ___blue_glCore_glVertexAttribs2hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribs2hvNV@GOTPAGEOFF] +_bluegl_glVertexAttrib2d: + adrp x16, ___blue_glCore_glVertexAttrib2d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearBufferSubData +.private_extern _bluegl_glVertexAttrib2dv .align 2 -_bluegl_glClearBufferSubData: - adrp x16, ___blue_glCore_glClearBufferSubData@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearBufferSubData@GOTPAGEOFF] +_bluegl_glVertexAttrib2dv: + adrp x16, ___blue_glCore_glVertexAttrib2dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenFramebuffers +.private_extern _bluegl_glVertexAttrib2f .align 2 -_bluegl_glGenFramebuffers: - adrp x16, ___blue_glCore_glGenFramebuffers@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenFramebuffers@GOTPAGEOFF] +_bluegl_glVertexAttrib2f: + adrp x16, ___blue_glCore_glVertexAttrib2f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayAttribFormat +.private_extern _bluegl_glVertexAttrib2fv .align 2 -_bluegl_glVertexArrayAttribFormat: - adrp x16, ___blue_glCore_glVertexArrayAttribFormat@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayAttribFormat@GOTPAGEOFF] +_bluegl_glVertexAttrib2fv: + adrp x16, ___blue_glCore_glVertexAttrib2fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetActiveUniformsiv +.private_extern _bluegl_glVertexAttrib2s .align 2 -_bluegl_glGetActiveUniformsiv: - adrp x16, ___blue_glCore_glGetActiveUniformsiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetActiveUniformsiv@GOTPAGEOFF] +_bluegl_glVertexAttrib2s: + adrp x16, ___blue_glCore_glVertexAttrib2s@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2s@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTextureSubImage1DEXT +.private_extern _bluegl_glVertexAttrib2sv .align 2 -_bluegl_glCompressedTextureSubImage1DEXT: - adrp x16, ___blue_glCore_glCompressedTextureSubImage1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTextureSubImage1DEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib2sv: + adrp x16, ___blue_glCore_glVertexAttrib2sv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2sv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsRenderbuffer +.private_extern _bluegl_glVertexAttrib3d .align 2 -_bluegl_glIsRenderbuffer: - adrp x16, ___blue_glCore_glIsRenderbuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsRenderbuffer@GOTPAGEOFF] +_bluegl_glVertexAttrib3d: + adrp x16, ___blue_glCore_glVertexAttrib3d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPresentFrameKeyedNV +.private_extern _bluegl_glVertexAttrib3dv .align 2 -_bluegl_glPresentFrameKeyedNV: - adrp x16, ___blue_glCore_glPresentFrameKeyedNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPresentFrameKeyedNV@GOTPAGEOFF] +_bluegl_glVertexAttrib3dv: + adrp x16, ___blue_glCore_glVertexAttrib3dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix3fvEXT +.private_extern _bluegl_glVertexAttrib3f .align 2 -_bluegl_glProgramUniformMatrix3fvEXT: - adrp x16, ___blue_glCore_glProgramUniformMatrix3fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3fvEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib3f: + adrp x16, ___blue_glCore_glVertexAttrib3f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL2i64vNV +.private_extern _bluegl_glVertexAttrib3fv .align 2 -_bluegl_glVertexAttribL2i64vNV: - adrp x16, ___blue_glCore_glVertexAttribL2i64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL2i64vNV@GOTPAGEOFF] +_bluegl_glVertexAttrib3fv: + adrp x16, ___blue_glCore_glVertexAttrib3fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFogCoordhvNV +.private_extern _bluegl_glVertexAttrib3s .align 2 -_bluegl_glFogCoordhvNV: - adrp x16, ___blue_glCore_glFogCoordhvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFogCoordhvNV@GOTPAGEOFF] +_bluegl_glVertexAttrib3s: + adrp x16, ___blue_glCore_glVertexAttrib3s@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3s@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4ubv +.private_extern _bluegl_glVertexAttrib3sv .align 2 -_bluegl_glVertexAttrib4ubv: - adrp x16, ___blue_glCore_glVertexAttrib4ubv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4ubv@GOTPAGEOFF] +_bluegl_glVertexAttrib3sv: + adrp x16, ___blue_glCore_glVertexAttrib3sv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3sv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPushClientAttribDefaultEXT +.private_extern _bluegl_glVertexAttrib4Nbv .align 2 -_bluegl_glPushClientAttribDefaultEXT: - adrp x16, ___blue_glCore_glPushClientAttribDefaultEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPushClientAttribDefaultEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib4Nbv: + adrp x16, ___blue_glCore_glVertexAttrib4Nbv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4Nbv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3ivMESA +.private_extern _bluegl_glVertexAttrib4Niv .align 2 -_bluegl_glWindowPos3ivMESA: - adrp x16, ___blue_glCore_glWindowPos3ivMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3ivMESA@GOTPAGEOFF] +_bluegl_glVertexAttrib4Niv: + adrp x16, ___blue_glCore_glVertexAttrib4Niv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4Niv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPrimitiveRestartIndexNV +.private_extern _bluegl_glVertexAttrib4Nsv .align 2 -_bluegl_glPrimitiveRestartIndexNV: - adrp x16, ___blue_glCore_glPrimitiveRestartIndexNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPrimitiveRestartIndexNV@GOTPAGEOFF] +_bluegl_glVertexAttrib4Nsv: + adrp x16, ___blue_glCore_glVertexAttrib4Nsv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4Nsv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreatePerfQueryINTEL +.private_extern _bluegl_glVertexAttrib4Nub .align 2 -_bluegl_glCreatePerfQueryINTEL: - adrp x16, ___blue_glCore_glCreatePerfQueryINTEL@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreatePerfQueryINTEL@GOTPAGEOFF] +_bluegl_glVertexAttrib4Nub: + adrp x16, ___blue_glCore_glVertexAttrib4Nub@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4Nub@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramLocalParameterIuivNV +.private_extern _bluegl_glVertexAttrib4Nubv .align 2 -_bluegl_glGetProgramLocalParameterIuivNV: - adrp x16, ___blue_glCore_glGetProgramLocalParameterIuivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramLocalParameterIuivNV@GOTPAGEOFF] +_bluegl_glVertexAttrib4Nubv: + adrp x16, ___blue_glCore_glVertexAttrib4Nubv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4Nubv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glResizeBuffersMESA +.private_extern _bluegl_glVertexAttrib4Nuiv .align 2 -_bluegl_glResizeBuffersMESA: - adrp x16, ___blue_glCore_glResizeBuffersMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glResizeBuffersMESA@GOTPAGEOFF] +_bluegl_glVertexAttrib4Nuiv: + adrp x16, ___blue_glCore_glVertexAttrib4Nuiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4Nuiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream1fATI +.private_extern _bluegl_glVertexAttrib4Nusv .align 2 -_bluegl_glVertexStream1fATI: - adrp x16, ___blue_glCore_glVertexStream1fATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream1fATI@GOTPAGEOFF] +_bluegl_glVertexAttrib4Nusv: + adrp x16, ___blue_glCore_glVertexAttrib4Nusv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4Nusv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2ui +.private_extern _bluegl_glVertexAttrib4bv .align 2 -_bluegl_glProgramUniform2ui: - adrp x16, ___blue_glCore_glProgramUniform2ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2ui@GOTPAGEOFF] +_bluegl_glVertexAttrib4bv: + adrp x16, ___blue_glCore_glVertexAttrib4bv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4bv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3iv +.private_extern _bluegl_glVertexAttrib4d .align 2 -_bluegl_glSecondaryColor3iv: - adrp x16, ___blue_glCore_glSecondaryColor3iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3iv@GOTPAGEOFF] +_bluegl_glVertexAttrib4d: + adrp x16, ___blue_glCore_glVertexAttrib4d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramParameters4dvNV +.private_extern _bluegl_glVertexAttrib4dv .align 2 -_bluegl_glProgramParameters4dvNV: - adrp x16, ___blue_glCore_glProgramParameters4dvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramParameters4dvNV@GOTPAGEOFF] +_bluegl_glVertexAttrib4dv: + adrp x16, ___blue_glCore_glVertexAttrib4dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3i +.private_extern _bluegl_glVertexAttrib4f .align 2 -_bluegl_glWindowPos3i: - adrp x16, ___blue_glCore_glWindowPos3i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3i@GOTPAGEOFF] +_bluegl_glVertexAttrib4f: + adrp x16, ___blue_glCore_glVertexAttrib4f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glRectxvOES +.private_extern _bluegl_glVertexAttrib4fv .align 2 -_bluegl_glRectxvOES: - adrp x16, ___blue_glCore_glRectxvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glRectxvOES@GOTPAGEOFF] +_bluegl_glVertexAttrib4fv: + adrp x16, ___blue_glCore_glVertexAttrib4fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4iARB +.private_extern _bluegl_glVertexAttrib4iv .align 2 -_bluegl_glMultiTexCoord4iARB: - adrp x16, ___blue_glCore_glMultiTexCoord4iARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4iARB@GOTPAGEOFF] +_bluegl_glVertexAttrib4iv: + adrp x16, ___blue_glCore_glVertexAttrib4iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBeginConditionalRender +.private_extern _bluegl_glVertexAttrib4s .align 2 -_bluegl_glBeginConditionalRender: - adrp x16, ___blue_glCore_glBeginConditionalRender@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBeginConditionalRender@GOTPAGEOFF] +_bluegl_glVertexAttrib4s: + adrp x16, ___blue_glCore_glVertexAttrib4s@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4s@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFreeObjectBufferATI +.private_extern _bluegl_glVertexAttrib4sv .align 2 -_bluegl_glFreeObjectBufferATI: - adrp x16, ___blue_glCore_glFreeObjectBufferATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFreeObjectBufferATI@GOTPAGEOFF] +_bluegl_glVertexAttrib4sv: + adrp x16, ___blue_glCore_glVertexAttrib4sv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4sv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetOcclusionQueryuivNV +.private_extern _bluegl_glVertexAttrib4ubv .align 2 -_bluegl_glGetOcclusionQueryuivNV: - adrp x16, ___blue_glCore_glGetOcclusionQueryuivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetOcclusionQueryuivNV@GOTPAGEOFF] +_bluegl_glVertexAttrib4ubv: + adrp x16, ___blue_glCore_glVertexAttrib4ubv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4ubv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorP4ui +.private_extern _bluegl_glVertexAttrib4uiv .align 2 -_bluegl_glColorP4ui: - adrp x16, ___blue_glCore_glColorP4ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorP4ui@GOTPAGEOFF] +_bluegl_glVertexAttrib4uiv: + adrp x16, ___blue_glCore_glVertexAttrib4uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPathColorGenivNV +.private_extern _bluegl_glVertexAttrib4usv .align 2 -_bluegl_glGetPathColorGenivNV: - adrp x16, ___blue_glCore_glGetPathColorGenivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPathColorGenivNV@GOTPAGEOFF] +_bluegl_glVertexAttrib4usv: + adrp x16, ___blue_glCore_glVertexAttrib4usv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4usv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetQueryiv +.private_extern _bluegl_glVertexAttribPointer .align 2 -_bluegl_glGetQueryiv: - adrp x16, ___blue_glCore_glGetQueryiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetQueryiv@GOTPAGEOFF] +_bluegl_glVertexAttribPointer: + adrp x16, ___blue_glCore_glVertexAttribPointer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribPointer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI2uiv +.private_extern _bluegl_glUniformMatrix2x3fv .align 2 -_bluegl_glVertexAttribI2uiv: - adrp x16, ___blue_glCore_glVertexAttribI2uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI2uiv@GOTPAGEOFF] +_bluegl_glUniformMatrix2x3fv: + adrp x16, ___blue_glCore_glUniformMatrix2x3fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix2x3fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexArrayPointeri_vEXT +.private_extern _bluegl_glUniformMatrix3x2fv .align 2 -_bluegl_glGetVertexArrayPointeri_vEXT: - adrp x16, ___blue_glCore_glGetVertexArrayPointeri_vEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexArrayPointeri_vEXT@GOTPAGEOFF] +_bluegl_glUniformMatrix3x2fv: + adrp x16, ___blue_glCore_glUniformMatrix3x2fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix3x2fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSamplerParameteri +.private_extern _bluegl_glUniformMatrix2x4fv .align 2 -_bluegl_glSamplerParameteri: - adrp x16, ___blue_glCore_glSamplerParameteri@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSamplerParameteri@GOTPAGEOFF] +_bluegl_glUniformMatrix2x4fv: + adrp x16, ___blue_glCore_glUniformMatrix2x4fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix2x4fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glResumeTransformFeedbackNV +.private_extern _bluegl_glUniformMatrix4x2fv .align 2 -_bluegl_glResumeTransformFeedbackNV: - adrp x16, ___blue_glCore_glResumeTransformFeedbackNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glResumeTransformFeedbackNV@GOTPAGEOFF] +_bluegl_glUniformMatrix4x2fv: + adrp x16, ___blue_glCore_glUniformMatrix4x2fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix4x2fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL1ui64vNV +.private_extern _bluegl_glUniformMatrix3x4fv .align 2 -_bluegl_glVertexAttribL1ui64vNV: - adrp x16, ___blue_glCore_glVertexAttribL1ui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL1ui64vNV@GOTPAGEOFF] +_bluegl_glUniformMatrix3x4fv: + adrp x16, ___blue_glCore_glUniformMatrix3x4fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix3x4fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPauseTransformFeedbackNV +.private_extern _bluegl_glUniformMatrix4x3fv .align 2 -_bluegl_glPauseTransformFeedbackNV: - adrp x16, ___blue_glCore_glPauseTransformFeedbackNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPauseTransformFeedbackNV@GOTPAGEOFF] +_bluegl_glUniformMatrix4x3fv: + adrp x16, ___blue_glCore_glUniformMatrix4x3fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix4x3fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribs2fvNV +.private_extern _bluegl_glColorMaski .align 2 -_bluegl_glVertexAttribs2fvNV: - adrp x16, ___blue_glCore_glVertexAttribs2fvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribs2fvNV@GOTPAGEOFF] +_bluegl_glColorMaski: + adrp x16, ___blue_glCore_glColorMaski@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorMaski@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1iv +.private_extern _bluegl_glGetBooleani_v .align 2 -_bluegl_glProgramUniform1iv: - adrp x16, ___blue_glCore_glProgramUniform1iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1iv@GOTPAGEOFF] +_bluegl_glGetBooleani_v: + adrp x16, ___blue_glCore_glGetBooleani_v@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetBooleani_v@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetColorTableSGI +.private_extern _bluegl_glGetIntegeri_v .align 2 -_bluegl_glGetColorTableSGI: - adrp x16, ___blue_glCore_glGetColorTableSGI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetColorTableSGI@GOTPAGEOFF] +_bluegl_glGetIntegeri_v: + adrp x16, ___blue_glCore_glGetIntegeri_v@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetIntegeri_v@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetActiveAttrib +.private_extern _bluegl_glEnablei .align 2 -_bluegl_glGetActiveAttrib: - adrp x16, ___blue_glCore_glGetActiveAttrib@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetActiveAttrib@GOTPAGEOFF] +_bluegl_glEnablei: + adrp x16, ___blue_glCore_glEnablei@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEnablei@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glResetMinmax +.private_extern _bluegl_glDisablei .align 2 -_bluegl_glResetMinmax: - adrp x16, ___blue_glCore_glResetMinmax@GOTPAGE - ldr x16, [x16, ___blue_glCore_glResetMinmax@GOTPAGEOFF] +_bluegl_glDisablei: + adrp x16, ___blue_glCore_glDisablei@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDisablei@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBinormal3svEXT +.private_extern _bluegl_glIsEnabledi .align 2 -_bluegl_glBinormal3svEXT: - adrp x16, ___blue_glCore_glBinormal3svEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBinormal3svEXT@GOTPAGEOFF] +_bluegl_glIsEnabledi: + adrp x16, ___blue_glCore_glIsEnabledi@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsEnabledi@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4fv +.private_extern _bluegl_glBeginTransformFeedback .align 2 -_bluegl_glVertexAttrib4fv: - adrp x16, ___blue_glCore_glVertexAttrib4fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4fv@GOTPAGEOFF] +_bluegl_glBeginTransformFeedback: + adrp x16, ___blue_glCore_glBeginTransformFeedback@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBeginTransformFeedback@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIndexxOES +.private_extern _bluegl_glEndTransformFeedback .align 2 -_bluegl_glIndexxOES: - adrp x16, ___blue_glCore_glIndexxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIndexxOES@GOTPAGEOFF] +_bluegl_glEndTransformFeedback: + adrp x16, ___blue_glCore_glEndTransformFeedback@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEndTransformFeedback@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixMultTransposefEXT +.private_extern _bluegl_glBindBufferRange .align 2 -_bluegl_glMatrixMultTransposefEXT: - adrp x16, ___blue_glCore_glMatrixMultTransposefEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixMultTransposefEXT@GOTPAGEOFF] +_bluegl_glBindBufferRange: + adrp x16, ___blue_glCore_glBindBufferRange@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindBufferRange@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedFramebufferTexture +.private_extern _bluegl_glBindBufferBase .align 2 -_bluegl_glNamedFramebufferTexture: - adrp x16, ___blue_glCore_glNamedFramebufferTexture@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedFramebufferTexture@GOTPAGEOFF] +_bluegl_glBindBufferBase: + adrp x16, ___blue_glCore_glBindBufferBase@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindBufferBase@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexP2uiv +.private_extern _bluegl_glTransformFeedbackVaryings .align 2 -_bluegl_glVertexP2uiv: - adrp x16, ___blue_glCore_glVertexP2uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexP2uiv@GOTPAGEOFF] +_bluegl_glTransformFeedbackVaryings: + adrp x16, ___blue_glCore_glTransformFeedbackVaryings@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTransformFeedbackVaryings@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMemoryBarrier +.private_extern _bluegl_glGetTransformFeedbackVarying .align 2 -_bluegl_glMemoryBarrier: - adrp x16, ___blue_glCore_glMemoryBarrier@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMemoryBarrier@GOTPAGEOFF] +_bluegl_glGetTransformFeedbackVarying: + adrp x16, ___blue_glCore_glGetTransformFeedbackVarying@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTransformFeedbackVarying@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetGraphicsResetStatusARB +.private_extern _bluegl_glClampColor .align 2 -_bluegl_glGetGraphicsResetStatusARB: - adrp x16, ___blue_glCore_glGetGraphicsResetStatusARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetGraphicsResetStatusARB@GOTPAGEOFF] +_bluegl_glClampColor: + adrp x16, ___blue_glCore_glClampColor@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClampColor@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindAttribLocation +.private_extern _bluegl_glBeginConditionalRender .align 2 -_bluegl_glBindAttribLocation: - adrp x16, ___blue_glCore_glBindAttribLocation@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindAttribLocation@GOTPAGEOFF] +_bluegl_glBeginConditionalRender: + adrp x16, ___blue_glCore_glBeginConditionalRender@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBeginConditionalRender@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexBlendEnviATI +.private_extern _bluegl_glEndConditionalRender .align 2 -_bluegl_glVertexBlendEnviATI: - adrp x16, ___blue_glCore_glVertexBlendEnviATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexBlendEnviATI@GOTPAGEOFF] +_bluegl_glEndConditionalRender: + adrp x16, ___blue_glCore_glEndConditionalRender@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEndConditionalRender@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glAttachObjectARB +.private_extern _bluegl_glVertexAttribIPointer .align 2 -_bluegl_glAttachObjectARB: - adrp x16, ___blue_glCore_glAttachObjectARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glAttachObjectARB@GOTPAGEOFF] +_bluegl_glVertexAttribIPointer: + adrp x16, ___blue_glCore_glVertexAttribIPointer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribIPointer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormalStream3bvATI +.private_extern _bluegl_glGetVertexAttribIiv .align 2 -_bluegl_glNormalStream3bvATI: - adrp x16, ___blue_glCore_glNormalStream3bvATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormalStream3bvATI@GOTPAGEOFF] +_bluegl_glGetVertexAttribIiv: + adrp x16, ___blue_glCore_glGetVertexAttribIiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribIiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedFramebufferTextureFaceEXT +.private_extern _bluegl_glGetVertexAttribIuiv .align 2 -_bluegl_glNamedFramebufferTextureFaceEXT: - adrp x16, ___blue_glCore_glNamedFramebufferTextureFaceEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedFramebufferTextureFaceEXT@GOTPAGEOFF] +_bluegl_glGetVertexAttribIuiv: + adrp x16, ___blue_glCore_glGetVertexAttribIuiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribIuiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetConvolutionParameterivEXT +.private_extern _bluegl_glVertexAttribI1i .align 2 -_bluegl_glGetConvolutionParameterivEXT: - adrp x16, ___blue_glCore_glGetConvolutionParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetConvolutionParameterivEXT@GOTPAGEOFF] +_bluegl_glVertexAttribI1i: + adrp x16, ___blue_glCore_glVertexAttribI1i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI1i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramPathFragmentInputGenNV +.private_extern _bluegl_glVertexAttribI2i .align 2 -_bluegl_glProgramPathFragmentInputGenNV: - adrp x16, ___blue_glCore_glProgramPathFragmentInputGenNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramPathFragmentInputGenNV@GOTPAGEOFF] +_bluegl_glVertexAttribI2i: + adrp x16, ___blue_glCore_glVertexAttribI2i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI2i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsFramebufferEXT +.private_extern _bluegl_glVertexAttribI3i .align 2 -_bluegl_glIsFramebufferEXT: - adrp x16, ___blue_glCore_glIsFramebufferEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsFramebufferEXT@GOTPAGEOFF] +_bluegl_glVertexAttribI3i: + adrp x16, ___blue_glCore_glVertexAttribI3i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI3i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsVertexArray +.private_extern _bluegl_glVertexAttribI4i .align 2 -_bluegl_glIsVertexArray: - adrp x16, ___blue_glCore_glIsVertexArray@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsVertexArray@GOTPAGEOFF] +_bluegl_glVertexAttribI4i: + adrp x16, ___blue_glCore_glVertexAttribI4i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI4i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribIivEXT +.private_extern _bluegl_glVertexAttribI1ui .align 2 -_bluegl_glGetVertexAttribIivEXT: - adrp x16, ___blue_glCore_glGetVertexAttribIivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribIivEXT@GOTPAGEOFF] +_bluegl_glVertexAttribI1ui: + adrp x16, ___blue_glCore_glVertexAttribI1ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI1ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureParameterIivEXT +.private_extern _bluegl_glVertexAttribI2ui .align 2 -_bluegl_glTextureParameterIivEXT: - adrp x16, ___blue_glCore_glTextureParameterIivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureParameterIivEXT@GOTPAGEOFF] +_bluegl_glVertexAttribI2ui: + adrp x16, ___blue_glCore_glVertexAttribI2ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI2ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnPixelMapuiv +.private_extern _bluegl_glVertexAttribI3ui .align 2 -_bluegl_glGetnPixelMapuiv: - adrp x16, ___blue_glCore_glGetnPixelMapuiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnPixelMapuiv@GOTPAGEOFF] +_bluegl_glVertexAttribI3ui: + adrp x16, ___blue_glCore_glVertexAttribI3ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI3ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetInvariantFloatvEXT +.private_extern _bluegl_glVertexAttribI4ui .align 2 -_bluegl_glGetInvariantFloatvEXT: - adrp x16, ___blue_glCore_glGetInvariantFloatvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetInvariantFloatvEXT@GOTPAGEOFF] +_bluegl_glVertexAttribI4ui: + adrp x16, ___blue_glCore_glVertexAttribI4ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI4ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glAttachShader +.private_extern _bluegl_glVertexAttribI1iv .align 2 -_bluegl_glAttachShader: - adrp x16, ___blue_glCore_glAttachShader@GOTPAGE - ldr x16, [x16, ___blue_glCore_glAttachShader@GOTPAGEOFF] +_bluegl_glVertexAttribI1iv: + adrp x16, ___blue_glCore_glVertexAttribI1iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI1iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3i +.private_extern _bluegl_glVertexAttribI2iv .align 2 -_bluegl_glSecondaryColor3i: - adrp x16, ___blue_glCore_glSecondaryColor3i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3i@GOTPAGEOFF] +_bluegl_glVertexAttribI2iv: + adrp x16, ___blue_glCore_glVertexAttribI2iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI2iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord4hvNV +.private_extern _bluegl_glVertexAttribI3iv .align 2 -_bluegl_glTexCoord4hvNV: - adrp x16, ___blue_glCore_glTexCoord4hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord4hvNV@GOTPAGEOFF] +_bluegl_glVertexAttribI3iv: + adrp x16, ___blue_glCore_glVertexAttribI3iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI3iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorTableSGI +.private_extern _bluegl_glVertexAttribI4iv .align 2 -_bluegl_glColorTableSGI: - adrp x16, ___blue_glCore_glColorTableSGI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorTableSGI@GOTPAGEOFF] +_bluegl_glVertexAttribI4iv: + adrp x16, ___blue_glCore_glVertexAttribI4iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI4iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4uivEXT +.private_extern _bluegl_glVertexAttribI1uiv .align 2 -_bluegl_glProgramUniform4uivEXT: - adrp x16, ___blue_glCore_glProgramUniform4uivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4uivEXT@GOTPAGEOFF] +_bluegl_glVertexAttribI1uiv: + adrp x16, ___blue_glCore_glVertexAttribI1uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI1uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPointSizexOES +.private_extern _bluegl_glVertexAttribI2uiv .align 2 -_bluegl_glPointSizexOES: - adrp x16, ___blue_glCore_glPointSizexOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPointSizexOES@GOTPAGEOFF] +_bluegl_glVertexAttribI2uiv: + adrp x16, ___blue_glCore_glVertexAttribI2uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI2uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTrackMatrixNV +.private_extern _bluegl_glVertexAttribI3uiv .align 2 -_bluegl_glTrackMatrixNV: - adrp x16, ___blue_glCore_glTrackMatrixNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTrackMatrixNV@GOTPAGEOFF] +_bluegl_glVertexAttribI3uiv: + adrp x16, ___blue_glCore_glVertexAttribI3uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI3uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1fv +.private_extern _bluegl_glVertexAttribI4uiv .align 2 -_bluegl_glMultiTexCoord1fv: - adrp x16, ___blue_glCore_glMultiTexCoord1fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1fv@GOTPAGEOFF] +_bluegl_glVertexAttribI4uiv: + adrp x16, ___blue_glCore_glVertexAttribI4uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI4uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColorPointerListIBM +.private_extern _bluegl_glVertexAttribI4bv .align 2 -_bluegl_glSecondaryColorPointerListIBM: - adrp x16, ___blue_glCore_glSecondaryColorPointerListIBM@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColorPointerListIBM@GOTPAGEOFF] +_bluegl_glVertexAttribI4bv: + adrp x16, ___blue_glCore_glVertexAttribI4bv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI4bv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenBuffersARB +.private_extern _bluegl_glVertexAttribI4sv .align 2 -_bluegl_glGenBuffersARB: - adrp x16, ___blue_glCore_glGenBuffersARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenBuffersARB@GOTPAGEOFF] +_bluegl_glVertexAttribI4sv: + adrp x16, ___blue_glCore_glVertexAttribI4sv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI4sv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN +.private_extern _bluegl_glVertexAttribI4ubv .align 2 -_bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN: - adrp x16, ___blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN@GOTPAGEOFF] +_bluegl_glVertexAttribI4ubv: + adrp x16, ___blue_glCore_glVertexAttribI4ubv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI4ubv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyColorTable +.private_extern _bluegl_glVertexAttribI4usv .align 2 -_bluegl_glCopyColorTable: - adrp x16, ___blue_glCore_glCopyColorTable@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyColorTable@GOTPAGEOFF] +_bluegl_glVertexAttribI4usv: + adrp x16, ___blue_glCore_glVertexAttribI4usv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI4usv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexPageCommitmentARB +.private_extern _bluegl_glGetUniformuiv .align 2 -_bluegl_glTexPageCommitmentARB: - adrp x16, ___blue_glCore_glTexPageCommitmentARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexPageCommitmentARB@GOTPAGEOFF] +_bluegl_glGetUniformuiv: + adrp x16, ___blue_glCore_glGetUniformuiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetUniformuiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSetFenceAPPLE +.private_extern _bluegl_glBindFragDataLocation .align 2 -_bluegl_glSetFenceAPPLE: - adrp x16, ___blue_glCore_glSetFenceAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSetFenceAPPLE@GOTPAGEOFF] +_bluegl_glBindFragDataLocation: + adrp x16, ___blue_glCore_glBindFragDataLocation@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindFragDataLocation@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2dvARB +.private_extern _bluegl_glGetFragDataLocation .align 2 -_bluegl_glMultiTexCoord2dvARB: - adrp x16, ___blue_glCore_glMultiTexCoord2dvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2dvARB@GOTPAGEOFF] +_bluegl_glGetFragDataLocation: + adrp x16, ___blue_glCore_glGetFragDataLocation@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFragDataLocation@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertex4hvNV +.private_extern _bluegl_glUniform1ui .align 2 -_bluegl_glVertex4hvNV: - adrp x16, ___blue_glCore_glVertex4hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertex4hvNV@GOTPAGEOFF] +_bluegl_glUniform1ui: + adrp x16, ___blue_glCore_glUniform1ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindVertexBuffer +.private_extern _bluegl_glUniform2ui .align 2 -_bluegl_glBindVertexBuffer: - adrp x16, ___blue_glCore_glBindVertexBuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindVertexBuffer@GOTPAGEOFF] +_bluegl_glUniform2ui: + adrp x16, ___blue_glCore_glUniform2ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertex3xvOES +.private_extern _bluegl_glUniform3ui .align 2 -_bluegl_glVertex3xvOES: - adrp x16, ___blue_glCore_glVertex3xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertex3xvOES@GOTPAGEOFF] +_bluegl_glUniform3ui: + adrp x16, ___blue_glCore_glUniform3ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glConvolutionParameterivEXT +.private_extern _bluegl_glUniform4ui .align 2 -_bluegl_glConvolutionParameterivEXT: - adrp x16, ___blue_glCore_glConvolutionParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glConvolutionParameterivEXT@GOTPAGEOFF] +_bluegl_glUniform4ui: + adrp x16, ___blue_glCore_glUniform4ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3ui64vARB +.private_extern _bluegl_glUniform1uiv .align 2 -_bluegl_glProgramUniform3ui64vARB: - adrp x16, ___blue_glCore_glProgramUniform3ui64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3ui64vARB@GOTPAGEOFF] +_bluegl_glUniform1uiv: + adrp x16, ___blue_glCore_glUniform1uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2dv +.private_extern _bluegl_glUniform2uiv .align 2 -_bluegl_glProgramUniform2dv: - adrp x16, ___blue_glCore_glProgramUniform2dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2dv@GOTPAGEOFF] +_bluegl_glUniform2uiv: + adrp x16, ___blue_glCore_glUniform2uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos4sMESA +.private_extern _bluegl_glUniform3uiv .align 2 -_bluegl_glWindowPos4sMESA: - adrp x16, ___blue_glCore_glWindowPos4sMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos4sMESA@GOTPAGEOFF] +_bluegl_glUniform3uiv: + adrp x16, ___blue_glCore_glUniform3uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexImage1DEXT +.private_extern _bluegl_glUniform4uiv .align 2 -_bluegl_glMultiTexImage1DEXT: - adrp x16, ___blue_glCore_glMultiTexImage1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexImage1DEXT@GOTPAGEOFF] +_bluegl_glUniform4uiv: + adrp x16, ___blue_glCore_glUniform4uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glRenderbufferStorage +.private_extern _bluegl_glTexParameterIiv .align 2 -_bluegl_glRenderbufferStorage: - adrp x16, ___blue_glCore_glRenderbufferStorage@GOTPAGE - ldr x16, [x16, ___blue_glCore_glRenderbufferStorage@GOTPAGEOFF] +_bluegl_glTexParameterIiv: + adrp x16, ___blue_glCore_glTexParameterIiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexParameterIiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glConvolutionFilter2D +.private_extern _bluegl_glTexParameterIuiv .align 2 -_bluegl_glConvolutionFilter2D: - adrp x16, ___blue_glCore_glConvolutionFilter2D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glConvolutionFilter2D@GOTPAGEOFF] +_bluegl_glTexParameterIuiv: + adrp x16, ___blue_glCore_glTexParameterIuiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexParameterIuiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBinormal3bEXT +.private_extern _bluegl_glGetTexParameterIiv .align 2 -_bluegl_glBinormal3bEXT: - adrp x16, ___blue_glCore_glBinormal3bEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBinormal3bEXT@GOTPAGEOFF] +_bluegl_glGetTexParameterIiv: + adrp x16, ___blue_glCore_glGetTexParameterIiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTexParameterIiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFragmentLightivSGIX +.private_extern _bluegl_glGetTexParameterIuiv .align 2 -_bluegl_glFragmentLightivSGIX: - adrp x16, ___blue_glCore_glFragmentLightivSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFragmentLightivSGIX@GOTPAGEOFF] +_bluegl_glGetTexParameterIuiv: + adrp x16, ___blue_glCore_glGetTexParameterIuiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTexParameterIuiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3iv +.private_extern _bluegl_glClearBufferiv .align 2 -_bluegl_glProgramUniform3iv: - adrp x16, ___blue_glCore_glProgramUniform3iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3iv@GOTPAGEOFF] +_bluegl_glClearBufferiv: + adrp x16, ___blue_glCore_glClearBufferiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearBufferiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsQuery +.private_extern _bluegl_glClearBufferuiv .align 2 -_bluegl_glIsQuery: - adrp x16, ___blue_glCore_glIsQuery@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsQuery@GOTPAGEOFF] +_bluegl_glClearBufferuiv: + adrp x16, ___blue_glCore_glClearBufferuiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearBufferuiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream2sATI +.private_extern _bluegl_glClearBufferfv .align 2 -_bluegl_glVertexStream2sATI: - adrp x16, ___blue_glCore_glVertexStream2sATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream2sATI@GOTPAGEOFF] +_bluegl_glClearBufferfv: + adrp x16, ___blue_glCore_glClearBufferfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearBufferfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4iEXT +.private_extern _bluegl_glClearBufferfi .align 2 -_bluegl_glProgramUniform4iEXT: - adrp x16, ___blue_glCore_glProgramUniform4iEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4iEXT@GOTPAGEOFF] +_bluegl_glClearBufferfi: + adrp x16, ___blue_glCore_glClearBufferfi@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearBufferfi@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetInvariantBooleanvEXT +.private_extern _bluegl_glGetStringi .align 2 -_bluegl_glGetInvariantBooleanvEXT: - adrp x16, ___blue_glCore_glGetInvariantBooleanvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetInvariantBooleanvEXT@GOTPAGEOFF] +_bluegl_glGetStringi: + adrp x16, ___blue_glCore_glGetStringi@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetStringi@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColorFormatNV +.private_extern _bluegl_glIsRenderbuffer .align 2 -_bluegl_glSecondaryColorFormatNV: - adrp x16, ___blue_glCore_glSecondaryColorFormatNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColorFormatNV@GOTPAGEOFF] +_bluegl_glIsRenderbuffer: + adrp x16, ___blue_glCore_glIsRenderbuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsRenderbuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4fNV +.private_extern _bluegl_glBindRenderbuffer .align 2 -_bluegl_glVertexAttrib4fNV: - adrp x16, ___blue_glCore_glVertexAttrib4fNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4fNV@GOTPAGEOFF] +_bluegl_glBindRenderbuffer: + adrp x16, ___blue_glCore_glBindRenderbuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindRenderbuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorFragmentOp1ATI +.private_extern _bluegl_glDeleteRenderbuffers .align 2 -_bluegl_glColorFragmentOp1ATI: - adrp x16, ___blue_glCore_glColorFragmentOp1ATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorFragmentOp1ATI@GOTPAGEOFF] +_bluegl_glDeleteRenderbuffers: + adrp x16, ___blue_glCore_glDeleteRenderbuffers@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteRenderbuffers@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTransformFeedbackBufferBase +.private_extern _bluegl_glGenRenderbuffers .align 2 -_bluegl_glTransformFeedbackBufferBase: - adrp x16, ___blue_glCore_glTransformFeedbackBufferBase@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTransformFeedbackBufferBase@GOTPAGEOFF] +_bluegl_glGenRenderbuffers: + adrp x16, ___blue_glCore_glGenRenderbuffers@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenRenderbuffers@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTexParameteriv +.private_extern _bluegl_glRenderbufferStorage .align 2 -_bluegl_glGetTexParameteriv: - adrp x16, ___blue_glCore_glGetTexParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTexParameteriv@GOTPAGEOFF] +_bluegl_glRenderbufferStorage: + adrp x16, ___blue_glCore_glRenderbufferStorage@GOTPAGE + ldr x16, [x16, ___blue_glCore_glRenderbufferStorage@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribIiv +.private_extern _bluegl_glGetRenderbufferParameteriv .align 2 -_bluegl_glGetVertexAttribIiv: - adrp x16, ___blue_glCore_glGetVertexAttribIiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribIiv@GOTPAGEOFF] +_bluegl_glGetRenderbufferParameteriv: + adrp x16, ___blue_glCore_glGetRenderbufferParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetRenderbufferParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEndOcclusionQueryNV +.private_extern _bluegl_glIsFramebuffer .align 2 -_bluegl_glEndOcclusionQueryNV: - adrp x16, ___blue_glCore_glEndOcclusionQueryNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEndOcclusionQueryNV@GOTPAGEOFF] +_bluegl_glIsFramebuffer: + adrp x16, ___blue_glCore_glIsFramebuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsFramebuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTransformFeedbackStreamAttribsNV +.private_extern _bluegl_glBindFramebuffer .align 2 -_bluegl_glTransformFeedbackStreamAttribsNV: - adrp x16, ___blue_glCore_glTransformFeedbackStreamAttribsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTransformFeedbackStreamAttribsNV@GOTPAGEOFF] +_bluegl_glBindFramebuffer: + adrp x16, ___blue_glCore_glBindFramebuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindFramebuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetQueryBufferObjecti64v +.private_extern _bluegl_glDeleteFramebuffers .align 2 -_bluegl_glGetQueryBufferObjecti64v: - adrp x16, ___blue_glCore_glGetQueryBufferObjecti64v@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetQueryBufferObjecti64v@GOTPAGEOFF] +_bluegl_glDeleteFramebuffers: + adrp x16, ___blue_glCore_glDeleteFramebuffers@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteFramebuffers@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStencilFillPathInstancedNV +.private_extern _bluegl_glGenFramebuffers .align 2 -_bluegl_glStencilFillPathInstancedNV: - adrp x16, ___blue_glCore_glStencilFillPathInstancedNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStencilFillPathInstancedNV@GOTPAGEOFF] +_bluegl_glGenFramebuffers: + adrp x16, ___blue_glCore_glGenFramebuffers@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenFramebuffers@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawCommandsStatesNV +.private_extern _bluegl_glCheckFramebufferStatus .align 2 -_bluegl_glDrawCommandsStatesNV: - adrp x16, ___blue_glCore_glDrawCommandsStatesNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawCommandsStatesNV@GOTPAGEOFF] +_bluegl_glCheckFramebufferStatus: + adrp x16, ___blue_glCore_glCheckFramebufferStatus@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCheckFramebufferStatus@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetSamplerParameterfv +.private_extern _bluegl_glFramebufferTexture1D .align 2 -_bluegl_glGetSamplerParameterfv: - adrp x16, ___blue_glCore_glGetSamplerParameterfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetSamplerParameterfv@GOTPAGEOFF] +_bluegl_glFramebufferTexture1D: + adrp x16, ___blue_glCore_glFramebufferTexture1D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferTexture1D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4fARB +.private_extern _bluegl_glFramebufferTexture2D .align 2 -_bluegl_glMultiTexCoord4fARB: - adrp x16, ___blue_glCore_glMultiTexCoord4fARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4fARB@GOTPAGEOFF] +_bluegl_glFramebufferTexture2D: + adrp x16, ___blue_glCore_glFramebufferTexture2D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferTexture2D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3ui64NV +.private_extern _bluegl_glFramebufferTexture3D .align 2 -_bluegl_glUniform3ui64NV: - adrp x16, ___blue_glCore_glUniform3ui64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3ui64NV@GOTPAGEOFF] +_bluegl_glFramebufferTexture3D: + adrp x16, ___blue_glCore_glFramebufferTexture3D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferTexture3D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexWeighthNV +.private_extern _bluegl_glFramebufferRenderbuffer .align 2 -_bluegl_glVertexWeighthNV: - adrp x16, ___blue_glCore_glVertexWeighthNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexWeighthNV@GOTPAGEOFF] +_bluegl_glFramebufferRenderbuffer: + adrp x16, ___blue_glCore_glFramebufferRenderbuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferRenderbuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3ivARB +.private_extern _bluegl_glGetFramebufferAttachmentParameteriv .align 2 -_bluegl_glWindowPos3ivARB: - adrp x16, ___blue_glCore_glWindowPos3ivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3ivARB@GOTPAGEOFF] +_bluegl_glGetFramebufferAttachmentParameteriv: + adrp x16, ___blue_glCore_glGetFramebufferAttachmentParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFramebufferAttachmentParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3ivEXT +.private_extern _bluegl_glGenerateMipmap .align 2 -_bluegl_glSecondaryColor3ivEXT: - adrp x16, ___blue_glCore_glSecondaryColor3ivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3ivEXT@GOTPAGEOFF] +_bluegl_glGenerateMipmap: + adrp x16, ___blue_glCore_glGenerateMipmap@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenerateMipmap@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindVertexArray +.private_extern _bluegl_glBlitFramebuffer .align 2 -_bluegl_glBindVertexArray: - adrp x16, ___blue_glCore_glBindVertexArray@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindVertexArray@GOTPAGEOFF] +_bluegl_glBlitFramebuffer: + adrp x16, ___blue_glCore_glBlitFramebuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlitFramebuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribLui64vARB +.private_extern _bluegl_glRenderbufferStorageMultisample .align 2 -_bluegl_glGetVertexAttribLui64vARB: - adrp x16, ___blue_glCore_glGetVertexAttribLui64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribLui64vARB@GOTPAGEOFF] +_bluegl_glRenderbufferStorageMultisample: + adrp x16, ___blue_glCore_glRenderbufferStorageMultisample@GOTPAGE + ldr x16, [x16, ___blue_glCore_glRenderbufferStorageMultisample@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4i64NV +.private_extern _bluegl_glFramebufferTextureLayer .align 2 -_bluegl_glUniform4i64NV: - adrp x16, ___blue_glCore_glUniform4i64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4i64NV@GOTPAGEOFF] +_bluegl_glFramebufferTextureLayer: + adrp x16, ___blue_glCore_glFramebufferTextureLayer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferTextureLayer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendBarrierNV +.private_extern _bluegl_glMapBufferRange .align 2 -_bluegl_glBlendBarrierNV: - adrp x16, ___blue_glCore_glBlendBarrierNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendBarrierNV@GOTPAGEOFF] +_bluegl_glMapBufferRange: + adrp x16, ___blue_glCore_glMapBufferRange@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMapBufferRange@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3fvARB +.private_extern _bluegl_glFlushMappedBufferRange .align 2 -_bluegl_glWindowPos3fvARB: - adrp x16, ___blue_glCore_glWindowPos3fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3fvARB@GOTPAGEOFF] +_bluegl_glFlushMappedBufferRange: + adrp x16, ___blue_glCore_glFlushMappedBufferRange@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFlushMappedBufferRange@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendEquationSeparateiARB +.private_extern _bluegl_glBindVertexArray .align 2 -_bluegl_glBlendEquationSeparateiARB: - adrp x16, ___blue_glCore_glBlendEquationSeparateiARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendEquationSeparateiARB@GOTPAGEOFF] +_bluegl_glBindVertexArray: + adrp x16, ___blue_glCore_glBindVertexArray@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindVertexArray@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVariantFloatvEXT +.private_extern _bluegl_glDeleteVertexArrays .align 2 -_bluegl_glGetVariantFloatvEXT: - adrp x16, ___blue_glCore_glGetVariantFloatvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVariantFloatvEXT@GOTPAGEOFF] +_bluegl_glDeleteVertexArrays: + adrp x16, ___blue_glCore_glDeleteVertexArrays@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteVertexArrays@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorSubTableEXT +.private_extern _bluegl_glGenVertexArrays .align 2 -_bluegl_glColorSubTableEXT: - adrp x16, ___blue_glCore_glColorSubTableEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorSubTableEXT@GOTPAGEOFF] +_bluegl_glGenVertexArrays: + adrp x16, ___blue_glCore_glGenVertexArrays@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenVertexArrays@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN +.private_extern _bluegl_glIsVertexArray .align 2 -_bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN: - adrp x16, ___blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN@GOTPAGEOFF] +_bluegl_glIsVertexArray: + adrp x16, ___blue_glCore_glIsVertexArray@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsVertexArray@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramResourceiv +.private_extern _bluegl_glDrawArraysInstanced .align 2 -_bluegl_glGetProgramResourceiv: - adrp x16, ___blue_glCore_glGetProgramResourceiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramResourceiv@GOTPAGEOFF] +_bluegl_glDrawArraysInstanced: + adrp x16, ___blue_glCore_glDrawArraysInstanced@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawArraysInstanced@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1f +.private_extern _bluegl_glDrawElementsInstanced .align 2 -_bluegl_glMultiTexCoord1f: - adrp x16, ___blue_glCore_glMultiTexCoord1f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1f@GOTPAGEOFF] +_bluegl_glDrawElementsInstanced: + adrp x16, ___blue_glCore_glDrawElementsInstanced@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawElementsInstanced@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedFramebufferAttachmentParameteriv +.private_extern _bluegl_glTexBuffer .align 2 -_bluegl_glGetNamedFramebufferAttachmentParameteriv: - adrp x16, ___blue_glCore_glGetNamedFramebufferAttachmentParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedFramebufferAttachmentParameteriv@GOTPAGEOFF] +_bluegl_glTexBuffer: + adrp x16, ___blue_glCore_glTexBuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexBuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteProgramsNV +.private_extern _bluegl_glPrimitiveRestartIndex .align 2 -_bluegl_glDeleteProgramsNV: - adrp x16, ___blue_glCore_glDeleteProgramsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteProgramsNV@GOTPAGEOFF] +_bluegl_glPrimitiveRestartIndex: + adrp x16, ___blue_glCore_glPrimitiveRestartIndex@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPrimitiveRestartIndex@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGlobalAlphaFactoriSUN +.private_extern _bluegl_glCopyBufferSubData .align 2 -_bluegl_glGlobalAlphaFactoriSUN: - adrp x16, ___blue_glCore_glGlobalAlphaFactoriSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGlobalAlphaFactoriSUN@GOTPAGEOFF] +_bluegl_glCopyBufferSubData: + adrp x16, ___blue_glCore_glCopyBufferSubData@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyBufferSubData@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFinalCombinerInputParameterfvNV +.private_extern _bluegl_glGetUniformIndices .align 2 -_bluegl_glGetFinalCombinerInputParameterfvNV: - adrp x16, ___blue_glCore_glGetFinalCombinerInputParameterfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFinalCombinerInputParameterfvNV@GOTPAGEOFF] +_bluegl_glGetUniformIndices: + adrp x16, ___blue_glCore_glGetUniformIndices@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetUniformIndices@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormalStream3dATI +.private_extern _bluegl_glGetActiveUniformsiv .align 2 -_bluegl_glNormalStream3dATI: - adrp x16, ___blue_glCore_glNormalStream3dATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormalStream3dATI@GOTPAGEOFF] +_bluegl_glGetActiveUniformsiv: + adrp x16, ___blue_glCore_glGetActiveUniformsiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetActiveUniformsiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexEnvivEXT +.private_extern _bluegl_glGetActiveUniformName .align 2 -_bluegl_glMultiTexEnvivEXT: - adrp x16, ___blue_glCore_glMultiTexEnvivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexEnvivEXT@GOTPAGEOFF] +_bluegl_glGetActiveUniformName: + adrp x16, ___blue_glCore_glGetActiveUniformName@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetActiveUniformName@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord4xvOES +.private_extern _bluegl_glGetUniformBlockIndex .align 2 -_bluegl_glTexCoord4xvOES: - adrp x16, ___blue_glCore_glTexCoord4xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord4xvOES@GOTPAGEOFF] +_bluegl_glGetUniformBlockIndex: + adrp x16, ___blue_glCore_glGetUniformBlockIndex@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetUniformBlockIndex@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4dvEXT +.private_extern _bluegl_glGetActiveUniformBlockiv .align 2 -_bluegl_glProgramUniform4dvEXT: - adrp x16, ___blue_glCore_glProgramUniform4dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4dvEXT@GOTPAGEOFF] +_bluegl_glGetActiveUniformBlockiv: + adrp x16, ___blue_glCore_glGetActiveUniformBlockiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetActiveUniformBlockiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2ui64vARB +.private_extern _bluegl_glGetActiveUniformBlockName .align 2 -_bluegl_glProgramUniform2ui64vARB: - adrp x16, ___blue_glCore_glProgramUniform2ui64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2ui64vARB@GOTPAGEOFF] +_bluegl_glGetActiveUniformBlockName: + adrp x16, ___blue_glCore_glGetActiveUniformBlockName@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetActiveUniformBlockName@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindBufferBaseNV +.private_extern _bluegl_glUniformBlockBinding .align 2 -_bluegl_glBindBufferBaseNV: - adrp x16, ___blue_glCore_glBindBufferBaseNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindBufferBaseNV@GOTPAGEOFF] +_bluegl_glUniformBlockBinding: + adrp x16, ___blue_glCore_glUniformBlockBinding@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformBlockBinding@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4s +.private_extern _bluegl_glDrawElementsBaseVertex .align 2 -_bluegl_glVertexAttrib4s: - adrp x16, ___blue_glCore_glVertexAttrib4s@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4s@GOTPAGEOFF] +_bluegl_glDrawElementsBaseVertex: + adrp x16, ___blue_glCore_glDrawElementsBaseVertex@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawElementsBaseVertex@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord2fVertex3fvSUN +.private_extern _bluegl_glDrawRangeElementsBaseVertex .align 2 -_bluegl_glTexCoord2fVertex3fvSUN: - adrp x16, ___blue_glCore_glTexCoord2fVertex3fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord2fVertex3fvSUN@GOTPAGEOFF] +_bluegl_glDrawRangeElementsBaseVertex: + adrp x16, ___blue_glCore_glDrawRangeElementsBaseVertex@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawRangeElementsBaseVertex@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixMultdEXT +.private_extern _bluegl_glDrawElementsInstancedBaseVertex .align 2 -_bluegl_glMatrixMultdEXT: - adrp x16, ___blue_glCore_glMatrixMultdEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixMultdEXT@GOTPAGEOFF] +_bluegl_glDrawElementsInstancedBaseVertex: + adrp x16, ___blue_glCore_glDrawElementsInstancedBaseVertex@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawElementsInstancedBaseVertex@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnMapdvARB +.private_extern _bluegl_glMultiDrawElementsBaseVertex .align 2 -_bluegl_glGetnMapdvARB: - adrp x16, ___blue_glCore_glGetnMapdvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnMapdvARB@GOTPAGEOFF] +_bluegl_glMultiDrawElementsBaseVertex: + adrp x16, ___blue_glCore_glMultiDrawElementsBaseVertex@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiDrawElementsBaseVertex@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEnableVertexArrayEXT +.private_extern _bluegl_glProvokingVertex .align 2 -_bluegl_glEnableVertexArrayEXT: - adrp x16, ___blue_glCore_glEnableVertexArrayEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEnableVertexArrayEXT@GOTPAGEOFF] +_bluegl_glProvokingVertex: + adrp x16, ___blue_glCore_glProvokingVertex@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProvokingVertex@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glConvolutionFilter1DEXT +.private_extern _bluegl_glFenceSync .align 2 -_bluegl_glConvolutionFilter1DEXT: - adrp x16, ___blue_glCore_glConvolutionFilter1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glConvolutionFilter1DEXT@GOTPAGEOFF] +_bluegl_glFenceSync: + adrp x16, ___blue_glCore_glFenceSync@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFenceSync@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMemoryBarrierEXT +.private_extern _bluegl_glIsSync .align 2 -_bluegl_glMemoryBarrierEXT: - adrp x16, ___blue_glCore_glMemoryBarrierEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMemoryBarrierEXT@GOTPAGEOFF] +_bluegl_glIsSync: + adrp x16, ___blue_glCore_glIsSync@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsSync@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNewObjectBufferATI +.private_extern _bluegl_glDeleteSync .align 2 -_bluegl_glNewObjectBufferATI: - adrp x16, ___blue_glCore_glNewObjectBufferATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNewObjectBufferATI@GOTPAGEOFF] +_bluegl_glDeleteSync: + adrp x16, ___blue_glCore_glDeleteSync@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteSync@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2fv +.private_extern _bluegl_glClientWaitSync .align 2 -_bluegl_glProgramUniform2fv: - adrp x16, ___blue_glCore_glProgramUniform2fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2fv@GOTPAGEOFF] +_bluegl_glClientWaitSync: + adrp x16, ___blue_glCore_glClientWaitSync@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClientWaitSync@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix4x3fv +.private_extern _bluegl_glWaitSync .align 2 -_bluegl_glUniformMatrix4x3fv: - adrp x16, ___blue_glCore_glUniformMatrix4x3fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix4x3fv@GOTPAGEOFF] +_bluegl_glWaitSync: + adrp x16, ___blue_glCore_glWaitSync@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWaitSync@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetHistogramParameterfv +.private_extern _bluegl_glGetInteger64v .align 2 -_bluegl_glGetHistogramParameterfv: - adrp x16, ___blue_glCore_glGetHistogramParameterfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetHistogramParameterfv@GOTPAGEOFF] +_bluegl_glGetInteger64v: + adrp x16, ___blue_glCore_glGetInteger64v@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetInteger64v@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFrameTerminatorGREMEDY +.private_extern _bluegl_glGetSynciv .align 2 -_bluegl_glFrameTerminatorGREMEDY: - adrp x16, ___blue_glCore_glFrameTerminatorGREMEDY@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFrameTerminatorGREMEDY@GOTPAGEOFF] +_bluegl_glGetSynciv: + adrp x16, ___blue_glCore_glGetSynciv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetSynciv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramLocalParameterfvARB +.private_extern _bluegl_glGetInteger64i_v .align 2 -_bluegl_glGetProgramLocalParameterfvARB: - adrp x16, ___blue_glCore_glGetProgramLocalParameterfvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramLocalParameterfvARB@GOTPAGEOFF] +_bluegl_glGetInteger64i_v: + adrp x16, ___blue_glCore_glGetInteger64i_v@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetInteger64i_v@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUnmapNamedBuffer +.private_extern _bluegl_glGetBufferParameteri64v .align 2 -_bluegl_glUnmapNamedBuffer: - adrp x16, ___blue_glCore_glUnmapNamedBuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUnmapNamedBuffer@GOTPAGEOFF] +_bluegl_glGetBufferParameteri64v: + adrp x16, ___blue_glCore_glGetBufferParameteri64v@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetBufferParameteri64v@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2svARB +.private_extern _bluegl_glFramebufferTexture .align 2 -_bluegl_glWindowPos2svARB: - adrp x16, ___blue_glCore_glWindowPos2svARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2svARB@GOTPAGEOFF] +_bluegl_glFramebufferTexture: + adrp x16, ___blue_glCore_glFramebufferTexture@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferTexture@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindTextureEXT +.private_extern _bluegl_glTexImage2DMultisample .align 2 -_bluegl_glBindTextureEXT: - adrp x16, ___blue_glCore_glBindTextureEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindTextureEXT@GOTPAGEOFF] +_bluegl_glTexImage2DMultisample: + adrp x16, ___blue_glCore_glTexImage2DMultisample@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexImage2DMultisample@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4svNV +.private_extern _bluegl_glTexImage3DMultisample .align 2 -_bluegl_glVertexAttrib4svNV: - adrp x16, ___blue_glCore_glVertexAttrib4svNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4svNV@GOTPAGEOFF] +_bluegl_glTexImage3DMultisample: + adrp x16, ___blue_glCore_glTexImage3DMultisample@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexImage3DMultisample@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPointParameterfSGIS +.private_extern _bluegl_glGetMultisamplefv .align 2 -_bluegl_glPointParameterfSGIS: - adrp x16, ___blue_glCore_glPointParameterfSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPointParameterfSGIS@GOTPAGEOFF] +_bluegl_glGetMultisamplefv: + adrp x16, ___blue_glCore_glGetMultisamplefv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMultisamplefv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3hvNV +.private_extern _bluegl_glSampleMaski .align 2 -_bluegl_glSecondaryColor3hvNV: - adrp x16, ___blue_glCore_glSecondaryColor3hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3hvNV@GOTPAGEOFF] +_bluegl_glSampleMaski: + adrp x16, ___blue_glCore_glSampleMaski@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSampleMaski@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorTableParameterfv +.private_extern _bluegl_glBindFragDataLocationIndexed .align 2 -_bluegl_glColorTableParameterfv: - adrp x16, ___blue_glCore_glColorTableParameterfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorTableParameterfv@GOTPAGEOFF] +_bluegl_glBindFragDataLocationIndexed: + adrp x16, ___blue_glCore_glBindFragDataLocationIndexed@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindFragDataLocationIndexed@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedProgramLocalParameter4fEXT +.private_extern _bluegl_glGetFragDataIndex .align 2 -_bluegl_glNamedProgramLocalParameter4fEXT: - adrp x16, ___blue_glCore_glNamedProgramLocalParameter4fEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParameter4fEXT@GOTPAGEOFF] +_bluegl_glGetFragDataIndex: + adrp x16, ___blue_glCore_glGetFragDataIndex@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFragDataIndex@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureParameterivEXT +.private_extern _bluegl_glGenSamplers .align 2 -_bluegl_glGetTextureParameterivEXT: - adrp x16, ___blue_glCore_glGetTextureParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureParameterivEXT@GOTPAGEOFF] +_bluegl_glGenSamplers: + adrp x16, ___blue_glCore_glGenSamplers@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenSamplers@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTestObjectAPPLE +.private_extern _bluegl_glDeleteSamplers .align 2 -_bluegl_glTestObjectAPPLE: - adrp x16, ___blue_glCore_glTestObjectAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTestObjectAPPLE@GOTPAGEOFF] +_bluegl_glDeleteSamplers: + adrp x16, ___blue_glCore_glDeleteSamplers@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteSamplers@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetIntegerui64vNV +.private_extern _bluegl_glIsSampler .align 2 -_bluegl_glGetIntegerui64vNV: - adrp x16, ___blue_glCore_glGetIntegerui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetIntegerui64vNV@GOTPAGEOFF] +_bluegl_glIsSampler: + adrp x16, ___blue_glCore_glIsSampler@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsSampler@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsVertexAttribEnabledAPPLE +.private_extern _bluegl_glBindSampler .align 2 -_bluegl_glIsVertexAttribEnabledAPPLE: - adrp x16, ___blue_glCore_glIsVertexAttribEnabledAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsVertexAttribEnabledAPPLE@GOTPAGEOFF] +_bluegl_glBindSampler: + adrp x16, ___blue_glCore_glBindSampler@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindSampler@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glActiveTextureARB +.private_extern _bluegl_glSamplerParameteri .align 2 -_bluegl_glActiveTextureARB: - adrp x16, ___blue_glCore_glActiveTextureARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glActiveTextureARB@GOTPAGEOFF] +_bluegl_glSamplerParameteri: + adrp x16, ___blue_glCore_glSamplerParameteri@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSamplerParameteri@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3dARB +.private_extern _bluegl_glSamplerParameteriv .align 2 -_bluegl_glVertexAttrib3dARB: - adrp x16, ___blue_glCore_glVertexAttrib3dARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3dARB@GOTPAGEOFF] +_bluegl_glSamplerParameteriv: + adrp x16, ___blue_glCore_glSamplerParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSamplerParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureHandleARB +.private_extern _bluegl_glSamplerParameterf .align 2 -_bluegl_glGetTextureHandleARB: - adrp x16, ___blue_glCore_glGetTextureHandleARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureHandleARB@GOTPAGEOFF] +_bluegl_glSamplerParameterf: + adrp x16, ___blue_glCore_glSamplerParameterf@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSamplerParameterf@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetColorTableEXT +.private_extern _bluegl_glSamplerParameterfv .align 2 -_bluegl_glGetColorTableEXT: - adrp x16, ___blue_glCore_glGetColorTableEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetColorTableEXT@GOTPAGEOFF] +_bluegl_glSamplerParameterfv: + adrp x16, ___blue_glCore_glSamplerParameterfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSamplerParameterfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawArraysEXT +.private_extern _bluegl_glSamplerParameterIiv .align 2 -_bluegl_glDrawArraysEXT: - adrp x16, ___blue_glCore_glDrawArraysEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawArraysEXT@GOTPAGEOFF] +_bluegl_glSamplerParameterIiv: + adrp x16, ___blue_glCore_glSamplerParameterIiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSamplerParameterIiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glImageTransformParameterfHP +.private_extern _bluegl_glSamplerParameterIuiv .align 2 -_bluegl_glImageTransformParameterfHP: - adrp x16, ___blue_glCore_glImageTransformParameterfHP@GOTPAGE - ldr x16, [x16, ___blue_glCore_glImageTransformParameterfHP@GOTPAGEOFF] +_bluegl_glSamplerParameterIuiv: + adrp x16, ___blue_glCore_glSamplerParameterIuiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSamplerParameterIuiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glActiveStencilFaceEXT +.private_extern _bluegl_glGetSamplerParameteriv .align 2 -_bluegl_glActiveStencilFaceEXT: - adrp x16, ___blue_glCore_glActiveStencilFaceEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glActiveStencilFaceEXT@GOTPAGEOFF] +_bluegl_glGetSamplerParameteriv: + adrp x16, ___blue_glCore_glGetSamplerParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetSamplerParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix3x4dv +.private_extern _bluegl_glGetSamplerParameterIiv .align 2 -_bluegl_glUniformMatrix3x4dv: - adrp x16, ___blue_glCore_glUniformMatrix3x4dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix3x4dv@GOTPAGEOFF] +_bluegl_glGetSamplerParameterIiv: + adrp x16, ___blue_glCore_glGetSamplerParameterIiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetSamplerParameterIiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4i64ARB +.private_extern _bluegl_glGetSamplerParameterfv .align 2 -_bluegl_glProgramUniform4i64ARB: - adrp x16, ___blue_glCore_glProgramUniform4i64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4i64ARB@GOTPAGEOFF] +_bluegl_glGetSamplerParameterfv: + adrp x16, ___blue_glCore_glGetSamplerParameterfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetSamplerParameterfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3iv +.private_extern _bluegl_glGetSamplerParameterIuiv .align 2 -_bluegl_glUniform3iv: - adrp x16, ___blue_glCore_glUniform3iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3iv@GOTPAGEOFF] +_bluegl_glGetSamplerParameterIuiv: + adrp x16, ___blue_glCore_glGetSamplerParameterIuiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetSamplerParameterIuiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPerfMonitorCountersAMD +.private_extern _bluegl_glQueryCounter .align 2 -_bluegl_glGetPerfMonitorCountersAMD: - adrp x16, ___blue_glCore_glGetPerfMonitorCountersAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPerfMonitorCountersAMD@GOTPAGEOFF] +_bluegl_glQueryCounter: + adrp x16, ___blue_glCore_glQueryCounter@GOTPAGE + ldr x16, [x16, ___blue_glCore_glQueryCounter@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFinishFenceAPPLE +.private_extern _bluegl_glGetQueryObjecti64v .align 2 -_bluegl_glFinishFenceAPPLE: - adrp x16, ___blue_glCore_glFinishFenceAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFinishFenceAPPLE@GOTPAGEOFF] +_bluegl_glGetQueryObjecti64v: + adrp x16, ___blue_glCore_glGetQueryObjecti64v@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetQueryObjecti64v@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4ivARB +.private_extern _bluegl_glGetQueryObjectui64v .align 2 -_bluegl_glUniform4ivARB: - adrp x16, ___blue_glCore_glUniform4ivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4ivARB@GOTPAGEOFF] +_bluegl_glGetQueryObjectui64v: + adrp x16, ___blue_glCore_glGetQueryObjectui64v@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetQueryObjectui64v@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glRenderbufferStorageMultisampleEXT +.private_extern _bluegl_glVertexAttribDivisor .align 2 -_bluegl_glRenderbufferStorageMultisampleEXT: - adrp x16, ___blue_glCore_glRenderbufferStorageMultisampleEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glRenderbufferStorageMultisampleEXT@GOTPAGEOFF] +_bluegl_glVertexAttribDivisor: + adrp x16, ___blue_glCore_glVertexAttribDivisor@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribDivisor@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPointParameterfvARB +.private_extern _bluegl_glVertexAttribP1ui .align 2 -_bluegl_glPointParameterfvARB: - adrp x16, ___blue_glCore_glPointParameterfvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPointParameterfvARB@GOTPAGEOFF] +_bluegl_glVertexAttribP1ui: + adrp x16, ___blue_glCore_glVertexAttribP1ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribP1ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramLocalParameterI4uivNV +.private_extern _bluegl_glVertexAttribP1uiv .align 2 -_bluegl_glProgramLocalParameterI4uivNV: - adrp x16, ___blue_glCore_glProgramLocalParameterI4uivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramLocalParameterI4uivNV@GOTPAGEOFF] +_bluegl_glVertexAttribP1uiv: + adrp x16, ___blue_glCore_glVertexAttribP1uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribP1uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeformSGIX +.private_extern _bluegl_glVertexAttribP2ui .align 2 -_bluegl_glDeformSGIX: - adrp x16, ___blue_glCore_glDeformSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeformSGIX@GOTPAGEOFF] +_bluegl_glVertexAttribP2ui: + adrp x16, ___blue_glCore_glVertexAttribP2ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribP2ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformHandleui64vNV +.private_extern _bluegl_glVertexAttribP2uiv .align 2 -_bluegl_glProgramUniformHandleui64vNV: - adrp x16, ___blue_glCore_glProgramUniformHandleui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformHandleui64vNV@GOTPAGEOFF] +_bluegl_glVertexAttribP2uiv: + adrp x16, ___blue_glCore_glVertexAttribP2uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribP2uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiDrawRangeElementArrayAPPLE +.private_extern _bluegl_glVertexAttribP3ui .align 2 -_bluegl_glMultiDrawRangeElementArrayAPPLE: - adrp x16, ___blue_glCore_glMultiDrawRangeElementArrayAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiDrawRangeElementArrayAPPLE@GOTPAGEOFF] +_bluegl_glVertexAttribP3ui: + adrp x16, ___blue_glCore_glVertexAttribP3ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribP3ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnUniformfvARB +.private_extern _bluegl_glVertexAttribP3uiv .align 2 -_bluegl_glGetnUniformfvARB: - adrp x16, ___blue_glCore_glGetnUniformfvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnUniformfvARB@GOTPAGEOFF] +_bluegl_glVertexAttribP3uiv: + adrp x16, ___blue_glCore_glVertexAttribP3uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribP3uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribs3svNV +.private_extern _bluegl_glVertexAttribP4ui .align 2 -_bluegl_glVertexAttribs3svNV: - adrp x16, ___blue_glCore_glVertexAttribs3svNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribs3svNV@GOTPAGEOFF] +_bluegl_glVertexAttribP4ui: + adrp x16, ___blue_glCore_glVertexAttribP4ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribP4ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1dvNV +.private_extern _bluegl_glVertexAttribP4uiv .align 2 -_bluegl_glVertexAttrib1dvNV: - adrp x16, ___blue_glCore_glVertexAttrib1dvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1dvNV@GOTPAGEOFF] +_bluegl_glVertexAttribP4uiv: + adrp x16, ___blue_glCore_glVertexAttribP4uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribP4uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream1fvATI +.private_extern _bluegl_glMinSampleShading .align 2 -_bluegl_glVertexStream1fvATI: - adrp x16, ___blue_glCore_glVertexStream1fvATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream1fvATI@GOTPAGEOFF] +_bluegl_glMinSampleShading: + adrp x16, ___blue_glCore_glMinSampleShading@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMinSampleShading@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsProgramPipeline +.private_extern _bluegl_glBlendEquationi .align 2 -_bluegl_glIsProgramPipeline: - adrp x16, ___blue_glCore_glIsProgramPipeline@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsProgramPipeline@GOTPAGEOFF] +_bluegl_glBlendEquationi: + adrp x16, ___blue_glCore_glBlendEquationi@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendEquationi@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetObjectBufferfvATI +.private_extern _bluegl_glBlendEquationSeparatei .align 2 -_bluegl_glGetObjectBufferfvATI: - adrp x16, ___blue_glCore_glGetObjectBufferfvATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetObjectBufferfvATI@GOTPAGEOFF] +_bluegl_glBlendEquationSeparatei: + adrp x16, ___blue_glCore_glBlendEquationSeparatei@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendEquationSeparatei@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBeginVertexShaderEXT +.private_extern _bluegl_glBlendFunci .align 2 -_bluegl_glBeginVertexShaderEXT: - adrp x16, ___blue_glCore_glBeginVertexShaderEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBeginVertexShaderEXT@GOTPAGEOFF] +_bluegl_glBlendFunci: + adrp x16, ___blue_glCore_glBlendFunci@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendFunci@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4svARB +.private_extern _bluegl_glBlendFuncSeparatei .align 2 -_bluegl_glVertexAttrib4svARB: - adrp x16, ___blue_glCore_glVertexAttrib4svARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4svARB@GOTPAGEOFF] +_bluegl_glBlendFuncSeparatei: + adrp x16, ___blue_glCore_glBlendFuncSeparatei@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendFuncSeparatei@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2d +.private_extern _bluegl_glDrawArraysIndirect .align 2 -_bluegl_glWindowPos2d: - adrp x16, ___blue_glCore_glWindowPos2d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2d@GOTPAGEOFF] +_bluegl_glDrawArraysIndirect: + adrp x16, ___blue_glCore_glDrawArraysIndirect@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawArraysIndirect@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWriteMaskEXT +.private_extern _bluegl_glDrawElementsIndirect .align 2 -_bluegl_glWriteMaskEXT: - adrp x16, ___blue_glCore_glWriteMaskEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWriteMaskEXT@GOTPAGEOFF] +_bluegl_glDrawElementsIndirect: + adrp x16, ___blue_glCore_glDrawElementsIndirect@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawElementsIndirect@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawRangeElements +.private_extern _bluegl_glUniform1d .align 2 -_bluegl_glDrawRangeElements: - adrp x16, ___blue_glCore_glDrawRangeElements@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawRangeElements@GOTPAGEOFF] +_bluegl_glUniform1d: + adrp x16, ___blue_glCore_glUniform1d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFragDataIndex +.private_extern _bluegl_glUniform2d .align 2 -_bluegl_glGetFragDataIndex: - adrp x16, ___blue_glCore_glGetFragDataIndex@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFragDataIndex@GOTPAGEOFF] +_bluegl_glUniform2d: + adrp x16, ___blue_glCore_glUniform2d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteTransformFeedbacksNV +.private_extern _bluegl_glUniform3d .align 2 -_bluegl_glDeleteTransformFeedbacksNV: - adrp x16, ___blue_glCore_glDeleteTransformFeedbacksNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteTransformFeedbacksNV@GOTPAGEOFF] +_bluegl_glUniform3d: + adrp x16, ___blue_glCore_glUniform3d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix2fvEXT +.private_extern _bluegl_glUniform4d .align 2 -_bluegl_glProgramUniformMatrix2fvEXT: - adrp x16, ___blue_glCore_glProgramUniformMatrix2fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2fvEXT@GOTPAGEOFF] +_bluegl_glUniform4d: + adrp x16, ___blue_glCore_glUniform4d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3ui +.private_extern _bluegl_glUniform1dv .align 2 -_bluegl_glProgramUniform3ui: - adrp x16, ___blue_glCore_glProgramUniform3ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3ui@GOTPAGEOFF] +_bluegl_glUniform1dv: + adrp x16, ___blue_glCore_glUniform1dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTransformFeedbacki_v +.private_extern _bluegl_glUniform2dv .align 2 -_bluegl_glGetTransformFeedbacki_v: - adrp x16, ___blue_glCore_glGetTransformFeedbacki_v@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTransformFeedbacki_v@GOTPAGEOFF] +_bluegl_glUniform2dv: + adrp x16, ___blue_glCore_glUniform2dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix3x2dv +.private_extern _bluegl_glUniform3dv .align 2 -_bluegl_glUniformMatrix3x2dv: - adrp x16, ___blue_glCore_glUniformMatrix3x2dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix3x2dv@GOTPAGEOFF] +_bluegl_glUniform3dv: + adrp x16, ___blue_glCore_glUniform3dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMapxvOES +.private_extern _bluegl_glUniform4dv .align 2 -_bluegl_glGetMapxvOES: - adrp x16, ___blue_glCore_glGetMapxvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMapxvOES@GOTPAGEOFF] +_bluegl_glUniform4dv: + adrp x16, ___blue_glCore_glUniform4dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMemoryBarrierByRegion +.private_extern _bluegl_glUniformMatrix2dv .align 2 -_bluegl_glMemoryBarrierByRegion: - adrp x16, ___blue_glCore_glMemoryBarrierByRegion@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMemoryBarrierByRegion@GOTPAGEOFF] +_bluegl_glUniformMatrix2dv: + adrp x16, ___blue_glCore_glUniformMatrix2dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix2dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedFramebufferDrawBuffer +.private_extern _bluegl_glUniformMatrix3dv .align 2 -_bluegl_glNamedFramebufferDrawBuffer: - adrp x16, ___blue_glCore_glNamedFramebufferDrawBuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedFramebufferDrawBuffer@GOTPAGEOFF] +_bluegl_glUniformMatrix3dv: + adrp x16, ___blue_glCore_glUniformMatrix3dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix3dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsBufferResidentNV +.private_extern _bluegl_glUniformMatrix4dv .align 2 -_bluegl_glIsBufferResidentNV: - adrp x16, ___blue_glCore_glIsBufferResidentNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsBufferResidentNV@GOTPAGEOFF] +_bluegl_glUniformMatrix4dv: + adrp x16, ___blue_glCore_glUniformMatrix4dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix4dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStencilOpSeparate +.private_extern _bluegl_glUniformMatrix2x3dv .align 2 -_bluegl_glStencilOpSeparate: - adrp x16, ___blue_glCore_glStencilOpSeparate@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStencilOpSeparate@GOTPAGEOFF] +_bluegl_glUniformMatrix2x3dv: + adrp x16, ___blue_glCore_glUniformMatrix2x3dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix2x3dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glInvalidateNamedFramebufferSubData +.private_extern _bluegl_glUniformMatrix2x4dv .align 2 -_bluegl_glInvalidateNamedFramebufferSubData: - adrp x16, ___blue_glCore_glInvalidateNamedFramebufferSubData@GOTPAGE - ldr x16, [x16, ___blue_glCore_glInvalidateNamedFramebufferSubData@GOTPAGEOFF] +_bluegl_glUniformMatrix2x4dv: + adrp x16, ___blue_glCore_glUniformMatrix2x4dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix2x4dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColor3hNV +.private_extern _bluegl_glUniformMatrix3x2dv .align 2 -_bluegl_glColor3hNV: - adrp x16, ___blue_glCore_glColor3hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColor3hNV@GOTPAGEOFF] +_bluegl_glUniformMatrix3x2dv: + adrp x16, ___blue_glCore_glUniformMatrix3x2dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix3x2dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureMaterialEXT +.private_extern _bluegl_glUniformMatrix3x4dv .align 2 -_bluegl_glTextureMaterialEXT: - adrp x16, ___blue_glCore_glTextureMaterialEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureMaterialEXT@GOTPAGEOFF] +_bluegl_glUniformMatrix3x4dv: + adrp x16, ___blue_glCore_glUniformMatrix3x4dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix3x4dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTextureSubImage2D +.private_extern _bluegl_glUniformMatrix4x2dv .align 2 -_bluegl_glCompressedTextureSubImage2D: - adrp x16, ___blue_glCore_glCompressedTextureSubImage2D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTextureSubImage2D@GOTPAGEOFF] +_bluegl_glUniformMatrix4x2dv: + adrp x16, ___blue_glCore_glUniformMatrix4x2dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix4x2dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexGeniEXT +.private_extern _bluegl_glUniformMatrix4x3dv .align 2 -_bluegl_glMultiTexGeniEXT: - adrp x16, ___blue_glCore_glMultiTexGeniEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexGeniEXT@GOTPAGEOFF] +_bluegl_glUniformMatrix4x3dv: + adrp x16, ___blue_glCore_glUniformMatrix4x3dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix4x3dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3usvEXT +.private_extern _bluegl_glGetUniformdv .align 2 -_bluegl_glSecondaryColor3usvEXT: - adrp x16, ___blue_glCore_glSecondaryColor3usvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3usvEXT@GOTPAGEOFF] +_bluegl_glGetUniformdv: + adrp x16, ___blue_glCore_glGetUniformdv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetUniformdv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramResourceName +.private_extern _bluegl_glGetSubroutineUniformLocation .align 2 -_bluegl_glGetProgramResourceName: - adrp x16, ___blue_glCore_glGetProgramResourceName@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramResourceName@GOTPAGEOFF] +_bluegl_glGetSubroutineUniformLocation: + adrp x16, ___blue_glCore_glGetSubroutineUniformLocation@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetSubroutineUniformLocation@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureStorageSparseAMD +.private_extern _bluegl_glGetSubroutineIndex .align 2 -_bluegl_glTextureStorageSparseAMD: - adrp x16, ___blue_glCore_glTextureStorageSparseAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureStorageSparseAMD@GOTPAGEOFF] +_bluegl_glGetSubroutineIndex: + adrp x16, ___blue_glCore_glGetSubroutineIndex@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetSubroutineIndex@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPixelStorei +.private_extern _bluegl_glGetActiveSubroutineUniformiv .align 2 -_bluegl_glPixelStorei: - adrp x16, ___blue_glCore_glPixelStorei@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPixelStorei@GOTPAGEOFF] +_bluegl_glGetActiveSubroutineUniformiv: + adrp x16, ___blue_glCore_glGetActiveSubroutineUniformiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetActiveSubroutineUniformiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetBooleani_v +.private_extern _bluegl_glGetActiveSubroutineUniformName .align 2 -_bluegl_glGetBooleani_v: - adrp x16, ___blue_glCore_glGetBooleani_v@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetBooleani_v@GOTPAGEOFF] +_bluegl_glGetActiveSubroutineUniformName: + adrp x16, ___blue_glCore_glGetActiveSubroutineUniformName@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetActiveSubroutineUniformName@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPathCoordsNV +.private_extern _bluegl_glGetActiveSubroutineName .align 2 -_bluegl_glGetPathCoordsNV: - adrp x16, ___blue_glCore_glGetPathCoordsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPathCoordsNV@GOTPAGEOFF] +_bluegl_glGetActiveSubroutineName: + adrp x16, ___blue_glCore_glGetActiveSubroutineName@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetActiveSubroutineName@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3svNV +.private_extern _bluegl_glUniformSubroutinesuiv .align 2 -_bluegl_glVertexAttrib3svNV: - adrp x16, ___blue_glCore_glVertexAttrib3svNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3svNV@GOTPAGEOFF] +_bluegl_glUniformSubroutinesuiv: + adrp x16, ___blue_glCore_glUniformSubroutinesuiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformSubroutinesuiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformui64NV +.private_extern _bluegl_glGetUniformSubroutineuiv .align 2 -_bluegl_glUniformui64NV: - adrp x16, ___blue_glCore_glUniformui64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformui64NV@GOTPAGEOFF] +_bluegl_glGetUniformSubroutineuiv: + adrp x16, ___blue_glCore_glGetUniformSubroutineuiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetUniformSubroutineuiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsImageHandleResidentNV +.private_extern _bluegl_glGetProgramStageiv .align 2 -_bluegl_glIsImageHandleResidentNV: - adrp x16, ___blue_glCore_glIsImageHandleResidentNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsImageHandleResidentNV@GOTPAGEOFF] +_bluegl_glGetProgramStageiv: + adrp x16, ___blue_glCore_glGetProgramStageiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramStageiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBeginConditionalRenderNV +.private_extern _bluegl_glPatchParameteri .align 2 -_bluegl_glBeginConditionalRenderNV: - adrp x16, ___blue_glCore_glBeginConditionalRenderNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBeginConditionalRenderNV@GOTPAGEOFF] +_bluegl_glPatchParameteri: + adrp x16, ___blue_glCore_glPatchParameteri@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPatchParameteri@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedFramebufferParameteriEXT +.private_extern _bluegl_glPatchParameterfv .align 2 -_bluegl_glNamedFramebufferParameteriEXT: - adrp x16, ___blue_glCore_glNamedFramebufferParameteriEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedFramebufferParameteriEXT@GOTPAGEOFF] +_bluegl_glPatchParameterfv: + adrp x16, ___blue_glCore_glPatchParameterfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPatchParameterfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsVertexArrayAPPLE +.private_extern _bluegl_glBindTransformFeedback .align 2 -_bluegl_glIsVertexArrayAPPLE: - adrp x16, ___blue_glCore_glIsVertexArrayAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsVertexArrayAPPLE@GOTPAGEOFF] +_bluegl_glBindTransformFeedback: + adrp x16, ___blue_glCore_glBindTransformFeedback@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindTransformFeedback@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPointParameterfvEXT +.private_extern _bluegl_glDeleteTransformFeedbacks .align 2 -_bluegl_glPointParameterfvEXT: - adrp x16, ___blue_glCore_glPointParameterfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPointParameterfvEXT@GOTPAGEOFF] +_bluegl_glDeleteTransformFeedbacks: + adrp x16, ___blue_glCore_glDeleteTransformFeedbacks@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteTransformFeedbacks@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnMapfvARB +.private_extern _bluegl_glGenTransformFeedbacks .align 2 -_bluegl_glGetnMapfvARB: - adrp x16, ___blue_glCore_glGetnMapfvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnMapfvARB@GOTPAGEOFF] +_bluegl_glGenTransformFeedbacks: + adrp x16, ___blue_glCore_glGenTransformFeedbacks@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenTransformFeedbacks@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyColorSubTable +.private_extern _bluegl_glIsTransformFeedback .align 2 -_bluegl_glCopyColorSubTable: - adrp x16, ___blue_glCore_glCopyColorSubTable@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyColorSubTable@GOTPAGEOFF] +_bluegl_glIsTransformFeedback: + adrp x16, ___blue_glCore_glIsTransformFeedback@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsTransformFeedback@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVariantbvEXT +.private_extern _bluegl_glPauseTransformFeedback .align 2 -_bluegl_glVariantbvEXT: - adrp x16, ___blue_glCore_glVariantbvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVariantbvEXT@GOTPAGEOFF] +_bluegl_glPauseTransformFeedback: + adrp x16, ___blue_glCore_glPauseTransformFeedback@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPauseTransformFeedback@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureParameterIuiv +.private_extern _bluegl_glResumeTransformFeedback .align 2 -_bluegl_glTextureParameterIuiv: - adrp x16, ___blue_glCore_glTextureParameterIuiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureParameterIuiv@GOTPAGEOFF] +_bluegl_glResumeTransformFeedback: + adrp x16, ___blue_glCore_glResumeTransformFeedback@GOTPAGE + ldr x16, [x16, ___blue_glCore_glResumeTransformFeedback@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPNTrianglesiATI +.private_extern _bluegl_glDrawTransformFeedback .align 2 -_bluegl_glPNTrianglesiATI: - adrp x16, ___blue_glCore_glPNTrianglesiATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPNTrianglesiATI@GOTPAGEOFF] +_bluegl_glDrawTransformFeedback: + adrp x16, ___blue_glCore_glDrawTransformFeedback@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawTransformFeedback@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendFunc +.private_extern _bluegl_glDrawTransformFeedbackStream .align 2 -_bluegl_glBlendFunc: - adrp x16, ___blue_glCore_glBlendFunc@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendFunc@GOTPAGEOFF] +_bluegl_glDrawTransformFeedbackStream: + adrp x16, ___blue_glCore_glDrawTransformFeedbackStream@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawTransformFeedbackStream@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4uiv +.private_extern _bluegl_glBeginQueryIndexed .align 2 -_bluegl_glVertexAttrib4uiv: - adrp x16, ___blue_glCore_glVertexAttrib4uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4uiv@GOTPAGEOFF] +_bluegl_glBeginQueryIndexed: + adrp x16, ___blue_glCore_glBeginQueryIndexed@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBeginQueryIndexed@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2ui +.private_extern _bluegl_glEndQueryIndexed .align 2 -_bluegl_glUniform2ui: - adrp x16, ___blue_glCore_glUniform2ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2ui@GOTPAGEOFF] +_bluegl_glEndQueryIndexed: + adrp x16, ___blue_glCore_glEndQueryIndexed@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEndQueryIndexed@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendColor +.private_extern _bluegl_glGetQueryIndexediv .align 2 -_bluegl_glBlendColor: - adrp x16, ___blue_glCore_glBlendColor@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendColor@GOTPAGEOFF] +_bluegl_glGetQueryIndexediv: + adrp x16, ___blue_glCore_glGetQueryIndexediv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetQueryIndexediv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glViewport +.private_extern _bluegl_glReleaseShaderCompiler .align 2 -_bluegl_glViewport: - adrp x16, ___blue_glCore_glViewport@GOTPAGE - ldr x16, [x16, ___blue_glCore_glViewport@GOTPAGEOFF] +_bluegl_glReleaseShaderCompiler: + adrp x16, ___blue_glCore_glReleaseShaderCompiler@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReleaseShaderCompiler@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2fvARB +.private_extern _bluegl_glShaderBinary .align 2 -_bluegl_glWindowPos2fvARB: - adrp x16, ___blue_glCore_glWindowPos2fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2fvARB@GOTPAGEOFF] +_bluegl_glShaderBinary: + adrp x16, ___blue_glCore_glShaderBinary@GOTPAGE + ldr x16, [x16, ___blue_glCore_glShaderBinary@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSampleCoverage +.private_extern _bluegl_glGetShaderPrecisionFormat .align 2 -_bluegl_glSampleCoverage: - adrp x16, ___blue_glCore_glSampleCoverage@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSampleCoverage@GOTPAGEOFF] +_bluegl_glGetShaderPrecisionFormat: + adrp x16, ___blue_glCore_glGetShaderPrecisionFormat@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetShaderPrecisionFormat@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3ubv +.private_extern _bluegl_glDepthRangef .align 2 -_bluegl_glSecondaryColor3ubv: - adrp x16, ___blue_glCore_glSecondaryColor3ubv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3ubv@GOTPAGEOFF] +_bluegl_glDepthRangef: + adrp x16, ___blue_glCore_glDepthRangef@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDepthRangef@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColor4xOES +.private_extern _bluegl_glClearDepthf .align 2 -_bluegl_glColor4xOES: - adrp x16, ___blue_glCore_glColor4xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColor4xOES@GOTPAGEOFF] +_bluegl_glClearDepthf: + adrp x16, ___blue_glCore_glClearDepthf@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearDepthf@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL1dEXT +.private_extern _bluegl_glGetProgramBinary .align 2 -_bluegl_glVertexAttribL1dEXT: - adrp x16, ___blue_glCore_glVertexAttribL1dEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL1dEXT@GOTPAGEOFF] +_bluegl_glGetProgramBinary: + adrp x16, ___blue_glCore_glGetProgramBinary@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramBinary@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultTransposeMatrixf +.private_extern _bluegl_glProgramBinary .align 2 -_bluegl_glMultTransposeMatrixf: - adrp x16, ___blue_glCore_glMultTransposeMatrixf@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultTransposeMatrixf@GOTPAGEOFF] +_bluegl_glProgramBinary: + adrp x16, ___blue_glCore_glProgramBinary@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramBinary@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexArrayIntegeri_vEXT +.private_extern _bluegl_glProgramParameteri .align 2 -_bluegl_glGetVertexArrayIntegeri_vEXT: - adrp x16, ___blue_glCore_glGetVertexArrayIntegeri_vEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexArrayIntegeri_vEXT@GOTPAGEOFF] +_bluegl_glProgramParameteri: + adrp x16, ___blue_glCore_glProgramParameteri@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramParameteri@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCullParameterfvEXT +.private_extern _bluegl_glUseProgramStages .align 2 -_bluegl_glCullParameterfvEXT: - adrp x16, ___blue_glCore_glCullParameterfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCullParameterfvEXT@GOTPAGEOFF] +_bluegl_glUseProgramStages: + adrp x16, ___blue_glCore_glUseProgramStages@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUseProgramStages@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMapNamedBufferRangeEXT +.private_extern _bluegl_glActiveShaderProgram .align 2 -_bluegl_glMapNamedBufferRangeEXT: - adrp x16, ___blue_glCore_glMapNamedBufferRangeEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMapNamedBufferRangeEXT@GOTPAGEOFF] +_bluegl_glActiveShaderProgram: + adrp x16, ___blue_glCore_glActiveShaderProgram@GOTPAGE + ldr x16, [x16, ___blue_glCore_glActiveShaderProgram@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureImage3DEXT +.private_extern _bluegl_glCreateShaderProgramv .align 2 -_bluegl_glTextureImage3DEXT: - adrp x16, ___blue_glCore_glTextureImage3DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureImage3DEXT@GOTPAGEOFF] +_bluegl_glCreateShaderProgramv: + adrp x16, ___blue_glCore_glCreateShaderProgramv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreateShaderProgramv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBufferAddressRangeNV +.private_extern _bluegl_glBindProgramPipeline .align 2 -_bluegl_glBufferAddressRangeNV: - adrp x16, ___blue_glCore_glBufferAddressRangeNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBufferAddressRangeNV@GOTPAGEOFF] +_bluegl_glBindProgramPipeline: + adrp x16, ___blue_glCore_glBindProgramPipeline@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindProgramPipeline@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribdv +.private_extern _bluegl_glDeleteProgramPipelines .align 2 -_bluegl_glGetVertexAttribdv: - adrp x16, ___blue_glCore_glGetVertexAttribdv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribdv@GOTPAGEOFF] +_bluegl_glDeleteProgramPipelines: + adrp x16, ___blue_glCore_glDeleteProgramPipelines@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteProgramPipelines@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedFramebufferSampleLocationsfvARB +.private_extern _bluegl_glGenProgramPipelines .align 2 -_bluegl_glNamedFramebufferSampleLocationsfvARB: - adrp x16, ___blue_glCore_glNamedFramebufferSampleLocationsfvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedFramebufferSampleLocationsfvARB@GOTPAGEOFF] +_bluegl_glGenProgramPipelines: + adrp x16, ___blue_glCore_glGenProgramPipelines@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenProgramPipelines@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2i +.private_extern _bluegl_glIsProgramPipeline .align 2 -_bluegl_glMultiTexCoord2i: - adrp x16, ___blue_glCore_glMultiTexCoord2i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2i@GOTPAGEOFF] +_bluegl_glIsProgramPipeline: + adrp x16, ___blue_glCore_glIsProgramPipeline@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsProgramPipeline@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindFramebufferEXT +.private_extern _bluegl_glGetProgramPipelineiv .align 2 -_bluegl_glBindFramebufferEXT: - adrp x16, ___blue_glCore_glBindFramebufferEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindFramebufferEXT@GOTPAGEOFF] +_bluegl_glGetProgramPipelineiv: + adrp x16, ___blue_glCore_glGetProgramPipelineiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramPipelineiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexParameterfv +.private_extern _bluegl_glProgramUniform1i .align 2 -_bluegl_glTexParameterfv: - adrp x16, ___blue_glCore_glTexParameterfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexParameterfv@GOTPAGEOFF] +_bluegl_glProgramUniform1i: + adrp x16, ___blue_glCore_glProgramUniform1i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramNamedParameterfvNV +.private_extern _bluegl_glProgramUniform1iv .align 2 -_bluegl_glGetProgramNamedParameterfvNV: - adrp x16, ___blue_glCore_glGetProgramNamedParameterfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramNamedParameterfvNV@GOTPAGEOFF] +_bluegl_glProgramUniform1iv: + adrp x16, ___blue_glCore_glProgramUniform1iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureStorage3DEXT +.private_extern _bluegl_glProgramUniform1f .align 2 -_bluegl_glTextureStorage3DEXT: - adrp x16, ___blue_glCore_glTextureStorage3DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureStorage3DEXT@GOTPAGEOFF] +_bluegl_glProgramUniform1f: + adrp x16, ___blue_glCore_glProgramUniform1f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetDebugMessageLogAMD +.private_extern _bluegl_glProgramUniform1fv .align 2 -_bluegl_glGetDebugMessageLogAMD: - adrp x16, ___blue_glCore_glGetDebugMessageLogAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetDebugMessageLogAMD@GOTPAGEOFF] +_bluegl_glProgramUniform1fv: + adrp x16, ___blue_glCore_glProgramUniform1fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord1hvNV +.private_extern _bluegl_glProgramUniform1d .align 2 -_bluegl_glTexCoord1hvNV: - adrp x16, ___blue_glCore_glTexCoord1hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord1hvNV@GOTPAGEOFF] +_bluegl_glProgramUniform1d: + adrp x16, ___blue_glCore_glProgramUniform1d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glRenderbufferStorageMultisampleCoverageNV +.private_extern _bluegl_glProgramUniform1dv .align 2 -_bluegl_glRenderbufferStorageMultisampleCoverageNV: - adrp x16, ___blue_glCore_glRenderbufferStorageMultisampleCoverageNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glRenderbufferStorageMultisampleCoverageNV@GOTPAGEOFF] +_bluegl_glProgramUniform1dv: + adrp x16, ___blue_glCore_glProgramUniform1dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3i64vARB +.private_extern _bluegl_glProgramUniform1ui .align 2 -_bluegl_glProgramUniform3i64vARB: - adrp x16, ___blue_glCore_glProgramUniform3i64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3i64vARB@GOTPAGEOFF] +_bluegl_glProgramUniform1ui: + adrp x16, ___blue_glCore_glProgramUniform1ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFragmentMaterialfvSGIX +.private_extern _bluegl_glProgramUniform1uiv .align 2 -_bluegl_glFragmentMaterialfvSGIX: - adrp x16, ___blue_glCore_glFragmentMaterialfvSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFragmentMaterialfvSGIX@GOTPAGEOFF] +_bluegl_glProgramUniform1uiv: + adrp x16, ___blue_glCore_glProgramUniform1uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetImageHandleARB +.private_extern _bluegl_glProgramUniform2i .align 2 -_bluegl_glGetImageHandleARB: - adrp x16, ___blue_glCore_glGetImageHandleARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetImageHandleARB@GOTPAGEOFF] +_bluegl_glProgramUniform2i: + adrp x16, ___blue_glCore_glProgramUniform2i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribs3fvNV +.private_extern _bluegl_glProgramUniform2iv .align 2 -_bluegl_glVertexAttribs3fvNV: - adrp x16, ___blue_glCore_glVertexAttribs3fvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribs3fvNV@GOTPAGEOFF] +_bluegl_glProgramUniform2iv: + adrp x16, ___blue_glCore_glProgramUniform2iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexSubImage4DSGIS +.private_extern _bluegl_glProgramUniform2f .align 2 -_bluegl_glTexSubImage4DSGIS: - adrp x16, ___blue_glCore_glTexSubImage4DSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexSubImage4DSGIS@GOTPAGEOFF] +_bluegl_glProgramUniform2f: + adrp x16, ___blue_glCore_glProgramUniform2f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glListParameteriSGIX +.private_extern _bluegl_glProgramUniform2fv .align 2 -_bluegl_glListParameteriSGIX: - adrp x16, ___blue_glCore_glListParameteriSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glListParameteriSGIX@GOTPAGEOFF] +_bluegl_glProgramUniform2fv: + adrp x16, ___blue_glCore_glProgramUniform2fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPixelTransformParameterfEXT +.private_extern _bluegl_glProgramUniform2d .align 2 -_bluegl_glPixelTransformParameterfEXT: - adrp x16, ___blue_glCore_glPixelTransformParameterfEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPixelTransformParameterfEXT@GOTPAGEOFF] +_bluegl_glProgramUniform2d: + adrp x16, ___blue_glCore_glProgramUniform2d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMapParameterfvNV +.private_extern _bluegl_glProgramUniform2dv .align 2 -_bluegl_glMapParameterfvNV: - adrp x16, ___blue_glCore_glMapParameterfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMapParameterfvNV@GOTPAGEOFF] +_bluegl_glProgramUniform2dv: + adrp x16, ___blue_glCore_glProgramUniform2dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3dv +.private_extern _bluegl_glProgramUniform2ui .align 2 -_bluegl_glProgramUniform3dv: - adrp x16, ___blue_glCore_glProgramUniform3dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3dv@GOTPAGEOFF] +_bluegl_glProgramUniform2ui: + adrp x16, ___blue_glCore_glProgramUniform2ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix3fv +.private_extern _bluegl_glProgramUniform2uiv .align 2 -_bluegl_glUniformMatrix3fv: - adrp x16, ___blue_glCore_glUniformMatrix3fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix3fv@GOTPAGEOFF] +_bluegl_glProgramUniform2uiv: + adrp x16, ___blue_glCore_glProgramUniform2uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4fEXT +.private_extern _bluegl_glProgramUniform3i .align 2 -_bluegl_glProgramUniform4fEXT: - adrp x16, ___blue_glCore_glProgramUniform4fEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4fEXT@GOTPAGEOFF] +_bluegl_glProgramUniform3i: + adrp x16, ___blue_glCore_glProgramUniform3i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2hNV +.private_extern _bluegl_glProgramUniform3iv .align 2 -_bluegl_glMultiTexCoord2hNV: - adrp x16, ___blue_glCore_glMultiTexCoord2hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2hNV@GOTPAGEOFF] +_bluegl_glProgramUniform3iv: + adrp x16, ___blue_glCore_glProgramUniform3iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI4uiv +.private_extern _bluegl_glProgramUniform3f .align 2 -_bluegl_glVertexAttribI4uiv: - adrp x16, ___blue_glCore_glVertexAttribI4uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI4uiv@GOTPAGEOFF] +_bluegl_glProgramUniform3f: + adrp x16, ___blue_glCore_glProgramUniform3f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3b +.private_extern _bluegl_glProgramUniform3fv .align 2 -_bluegl_glSecondaryColor3b: - adrp x16, ___blue_glCore_glSecondaryColor3b@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3b@GOTPAGEOFF] +_bluegl_glProgramUniform3fv: + adrp x16, ___blue_glCore_glProgramUniform3fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFogxvOES +.private_extern _bluegl_glProgramUniform3d .align 2 -_bluegl_glFogxvOES: - adrp x16, ___blue_glCore_glFogxvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFogxvOES@GOTPAGEOFF] +_bluegl_glProgramUniform3d: + adrp x16, ___blue_glCore_glProgramUniform3d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGlobalAlphaFactorubSUN +.private_extern _bluegl_glProgramUniform3dv .align 2 -_bluegl_glGlobalAlphaFactorubSUN: - adrp x16, ___blue_glCore_glGlobalAlphaFactorubSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGlobalAlphaFactorubSUN@GOTPAGEOFF] +_bluegl_glProgramUniform3dv: + adrp x16, ___blue_glCore_glProgramUniform3dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI4svEXT +.private_extern _bluegl_glProgramUniform3ui .align 2 -_bluegl_glVertexAttribI4svEXT: - adrp x16, ___blue_glCore_glVertexAttribI4svEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI4svEXT@GOTPAGEOFF] +_bluegl_glProgramUniform3ui: + adrp x16, ___blue_glCore_glProgramUniform3ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3sv +.private_extern _bluegl_glProgramUniform3uiv .align 2 -_bluegl_glSecondaryColor3sv: - adrp x16, ___blue_glCore_glSecondaryColor3sv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3sv@GOTPAGEOFF] +_bluegl_glProgramUniform3uiv: + adrp x16, ___blue_glCore_glProgramUniform3uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix2x3dvEXT +.private_extern _bluegl_glProgramUniform4i .align 2 -_bluegl_glProgramUniformMatrix2x3dvEXT: - adrp x16, ___blue_glCore_glProgramUniformMatrix2x3dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2x3dvEXT@GOTPAGEOFF] +_bluegl_glProgramUniform4i: + adrp x16, ___blue_glCore_glProgramUniform4i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureBarrier +.private_extern _bluegl_glProgramUniform4iv .align 2 -_bluegl_glTextureBarrier: - adrp x16, ___blue_glCore_glTextureBarrier@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureBarrier@GOTPAGEOFF] +_bluegl_glProgramUniform4iv: + adrp x16, ___blue_glCore_glProgramUniform4iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreateSamplers +.private_extern _bluegl_glProgramUniform4f .align 2 -_bluegl_glCreateSamplers: - adrp x16, ___blue_glCore_glCreateSamplers@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreateSamplers@GOTPAGEOFF] +_bluegl_glProgramUniform4f: + adrp x16, ___blue_glCore_glProgramUniform4f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribP2ui +.private_extern _bluegl_glProgramUniform4fv .align 2 -_bluegl_glVertexAttribP2ui: - adrp x16, ___blue_glCore_glVertexAttribP2ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribP2ui@GOTPAGEOFF] +_bluegl_glProgramUniform4fv: + adrp x16, ___blue_glCore_glProgramUniform4fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTexParameterIiv +.private_extern _bluegl_glProgramUniform4d .align 2 -_bluegl_glGetTexParameterIiv: - adrp x16, ___blue_glCore_glGetTexParameterIiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTexParameterIiv@GOTPAGEOFF] +_bluegl_glProgramUniform4d: + adrp x16, ___blue_glCore_glProgramUniform4d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glConvolutionParameterfvEXT +.private_extern _bluegl_glProgramUniform4dv .align 2 -_bluegl_glConvolutionParameterfvEXT: - adrp x16, ___blue_glCore_glConvolutionParameterfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glConvolutionParameterfvEXT@GOTPAGEOFF] +_bluegl_glProgramUniform4dv: + adrp x16, ___blue_glCore_glProgramUniform4dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathGlyphIndexArrayNV +.private_extern _bluegl_glProgramUniform4ui .align 2 -_bluegl_glPathGlyphIndexArrayNV: - adrp x16, ___blue_glCore_glPathGlyphIndexArrayNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathGlyphIndexArrayNV@GOTPAGEOFF] +_bluegl_glProgramUniform4ui: + adrp x16, ___blue_glCore_glProgramUniform4ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyTexSubImage2D +.private_extern _bluegl_glProgramUniform4uiv .align 2 -_bluegl_glCopyTexSubImage2D: - adrp x16, ___blue_glCore_glCopyTexSubImage2D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyTexSubImage2D@GOTPAGEOFF] +_bluegl_glProgramUniform4uiv: + adrp x16, ___blue_glCore_glProgramUniform4uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayParameteriAPPLE +.private_extern _bluegl_glProgramUniformMatrix2fv .align 2 -_bluegl_glVertexArrayParameteriAPPLE: - adrp x16, ___blue_glCore_glVertexArrayParameteriAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayParameteriAPPLE@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix2fv: + adrp x16, ___blue_glCore_glProgramUniformMatrix2fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnConvolutionFilterARB +.private_extern _bluegl_glProgramUniformMatrix3fv .align 2 -_bluegl_glGetnConvolutionFilterARB: - adrp x16, ___blue_glCore_glGetnConvolutionFilterARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnConvolutionFilterARB@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix3fv: + adrp x16, ___blue_glCore_glProgramUniformMatrix3fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVariantfvEXT +.private_extern _bluegl_glProgramUniformMatrix4fv .align 2 -_bluegl_glVariantfvEXT: - adrp x16, ___blue_glCore_glVariantfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVariantfvEXT@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix4fv: + adrp x16, ___blue_glCore_glProgramUniformMatrix4fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMultisamplefvNV +.private_extern _bluegl_glProgramUniformMatrix2dv .align 2 -_bluegl_glGetMultisamplefvNV: - adrp x16, ___blue_glCore_glGetMultisamplefvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMultisamplefvNV@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix2dv: + adrp x16, ___blue_glCore_glProgramUniformMatrix2dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glQueryObjectParameteruiAMD +.private_extern _bluegl_glProgramUniformMatrix3dv .align 2 -_bluegl_glQueryObjectParameteruiAMD: - adrp x16, ___blue_glCore_glQueryObjectParameteruiAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glQueryObjectParameteruiAMD@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix3dv: + adrp x16, ___blue_glCore_glProgramUniformMatrix3dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixIndexPointerARB +.private_extern _bluegl_glProgramUniformMatrix4dv .align 2 -_bluegl_glMatrixIndexPointerARB: - adrp x16, ___blue_glCore_glMatrixIndexPointerARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixIndexPointerARB@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix4dv: + adrp x16, ___blue_glCore_glProgramUniformMatrix4dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetQueryObjectuivARB +.private_extern _bluegl_glProgramUniformMatrix2x3fv .align 2 -_bluegl_glGetQueryObjectuivARB: - adrp x16, ___blue_glCore_glGetQueryObjectuivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetQueryObjectuivARB@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix2x3fv: + adrp x16, ___blue_glCore_glProgramUniformMatrix2x3fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2x3fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorFormatNV +.private_extern _bluegl_glProgramUniformMatrix3x2fv .align 2 -_bluegl_glColorFormatNV: - adrp x16, ___blue_glCore_glColorFormatNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorFormatNV@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix3x2fv: + adrp x16, ___blue_glCore_glProgramUniformMatrix3x2fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3x2fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexGenfvEXT +.private_extern _bluegl_glProgramUniformMatrix2x4fv .align 2 -_bluegl_glMultiTexGenfvEXT: - adrp x16, ___blue_glCore_glMultiTexGenfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexGenfvEXT@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix2x4fv: + adrp x16, ___blue_glCore_glProgramUniformMatrix2x4fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2x4fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetUniformfvARB +.private_extern _bluegl_glProgramUniformMatrix4x2fv .align 2 -_bluegl_glGetUniformfvARB: - adrp x16, ___blue_glCore_glGetUniformfvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetUniformfvARB@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix4x2fv: + adrp x16, ___blue_glCore_glProgramUniformMatrix4x2fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4x2fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord3hNV +.private_extern _bluegl_glProgramUniformMatrix3x4fv .align 2 -_bluegl_glTexCoord3hNV: - adrp x16, ___blue_glCore_glTexCoord3hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord3hNV@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix3x4fv: + adrp x16, ___blue_glCore_glProgramUniformMatrix3x4fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3x4fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathGlyphRangeNV +.private_extern _bluegl_glProgramUniformMatrix4x3fv .align 2 -_bluegl_glPathGlyphRangeNV: - adrp x16, ___blue_glCore_glPathGlyphRangeNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathGlyphRangeNV@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix4x3fv: + adrp x16, ___blue_glCore_glProgramUniformMatrix4x3fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4x3fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyTextureSubImage3DEXT +.private_extern _bluegl_glProgramUniformMatrix2x3dv .align 2 -_bluegl_glCopyTextureSubImage3DEXT: - adrp x16, ___blue_glCore_glCopyTextureSubImage3DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyTextureSubImage3DEXT@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix2x3dv: + adrp x16, ___blue_glCore_glProgramUniformMatrix2x3dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2x3dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColor3xOES +.private_extern _bluegl_glProgramUniformMatrix3x2dv .align 2 -_bluegl_glColor3xOES: - adrp x16, ___blue_glCore_glColor3xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColor3xOES@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix3x2dv: + adrp x16, ___blue_glCore_glProgramUniformMatrix3x2dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3x2dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4hNV +.private_extern _bluegl_glProgramUniformMatrix2x4dv .align 2 -_bluegl_glVertexAttrib4hNV: - adrp x16, ___blue_glCore_glVertexAttrib4hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4hNV@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix2x4dv: + adrp x16, ___blue_glCore_glProgramUniformMatrix2x4dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2x4dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformui64NV +.private_extern _bluegl_glProgramUniformMatrix4x2dv .align 2 -_bluegl_glProgramUniformui64NV: - adrp x16, ___blue_glCore_glProgramUniformui64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformui64NV@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix4x2dv: + adrp x16, ___blue_glCore_glProgramUniformMatrix4x2dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4x2dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayVertexAttribLFormatEXT +.private_extern _bluegl_glProgramUniformMatrix3x4dv .align 2 -_bluegl_glVertexArrayVertexAttribLFormatEXT: - adrp x16, ___blue_glCore_glVertexArrayVertexAttribLFormatEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayVertexAttribLFormatEXT@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix3x4dv: + adrp x16, ___blue_glCore_glProgramUniformMatrix3x4dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3x4dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMinmaxParameterivEXT +.private_extern _bluegl_glProgramUniformMatrix4x3dv .align 2 -_bluegl_glGetMinmaxParameterivEXT: - adrp x16, ___blue_glCore_glGetMinmaxParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMinmaxParameterivEXT@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix4x3dv: + adrp x16, ___blue_glCore_glProgramUniformMatrix4x3dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4x3dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3iMESA +.private_extern _bluegl_glValidateProgramPipeline .align 2 -_bluegl_glWindowPos3iMESA: - adrp x16, ___blue_glCore_glWindowPos3iMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3iMESA@GOTPAGEOFF] +_bluegl_glValidateProgramPipeline: + adrp x16, ___blue_glCore_glValidateProgramPipeline@GOTPAGE + ldr x16, [x16, ___blue_glCore_glValidateProgramPipeline@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribLFormat +.private_extern _bluegl_glGetProgramPipelineInfoLog .align 2 -_bluegl_glVertexAttribLFormat: - adrp x16, ___blue_glCore_glVertexAttribLFormat@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribLFormat@GOTPAGEOFF] +_bluegl_glGetProgramPipelineInfoLog: + adrp x16, ___blue_glCore_glGetProgramPipelineInfoLog@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramPipelineInfoLog@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetObjectParameterfvARB +.private_extern _bluegl_glVertexAttribL1d .align 2 -_bluegl_glGetObjectParameterfvARB: - adrp x16, ___blue_glCore_glGetObjectParameterfvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetObjectParameterfvARB@GOTPAGEOFF] +_bluegl_glVertexAttribL1d: + adrp x16, ___blue_glCore_glVertexAttribL1d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL1d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStencilFillPathNV +.private_extern _bluegl_glVertexAttribL2d .align 2 -_bluegl_glStencilFillPathNV: - adrp x16, ___blue_glCore_glStencilFillPathNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStencilFillPathNV@GOTPAGEOFF] +_bluegl_glVertexAttribL2d: + adrp x16, ___blue_glCore_glVertexAttribL2d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL2d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEvalCoord1xvOES +.private_extern _bluegl_glVertexAttribL3d .align 2 -_bluegl_glEvalCoord1xvOES: - adrp x16, ___blue_glCore_glEvalCoord1xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEvalCoord1xvOES@GOTPAGEOFF] +_bluegl_glVertexAttribL3d: + adrp x16, ___blue_glCore_glVertexAttribL3d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL3d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4d +.private_extern _bluegl_glVertexAttribL4d .align 2 -_bluegl_glUniform4d: - adrp x16, ___blue_glCore_glUniform4d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4d@GOTPAGEOFF] +_bluegl_glVertexAttribL4d: + adrp x16, ___blue_glCore_glVertexAttribL4d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL4d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureHandleNV +.private_extern _bluegl_glVertexAttribL1dv .align 2 -_bluegl_glGetTextureHandleNV: - adrp x16, ___blue_glCore_glGetTextureHandleNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureHandleNV@GOTPAGEOFF] +_bluegl_glVertexAttribL1dv: + adrp x16, ___blue_glCore_glVertexAttribL1dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL1dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetUniformuivEXT +.private_extern _bluegl_glVertexAttribL2dv .align 2 -_bluegl_glGetUniformuivEXT: - adrp x16, ___blue_glCore_glGetUniformuivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetUniformuivEXT@GOTPAGEOFF] +_bluegl_glVertexAttribL2dv: + adrp x16, ___blue_glCore_glVertexAttribL2dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL2dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsTextureEXT +.private_extern _bluegl_glVertexAttribL3dv .align 2 -_bluegl_glIsTextureEXT: - adrp x16, ___blue_glCore_glIsTextureEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsTextureEXT@GOTPAGEOFF] +_bluegl_glVertexAttribL3dv: + adrp x16, ___blue_glCore_glVertexAttribL3dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL3dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2d +.private_extern _bluegl_glVertexAttribL4dv .align 2 -_bluegl_glProgramUniform2d: - adrp x16, ___blue_glCore_glProgramUniform2d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2d@GOTPAGEOFF] +_bluegl_glVertexAttribL4dv: + adrp x16, ___blue_glCore_glVertexAttribL4dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL4dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnUniformuivARB +.private_extern _bluegl_glVertexAttribLPointer .align 2 -_bluegl_glGetnUniformuivARB: - adrp x16, ___blue_glCore_glGetnUniformuivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnUniformuivARB@GOTPAGEOFF] +_bluegl_glVertexAttribLPointer: + adrp x16, ___blue_glCore_glVertexAttribLPointer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribLPointer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsShader +.private_extern _bluegl_glGetVertexAttribLdv .align 2 -_bluegl_glIsShader: - adrp x16, ___blue_glCore_glIsShader@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsShader@GOTPAGEOFF] +_bluegl_glGetVertexAttribLdv: + adrp x16, ___blue_glCore_glGetVertexAttribLdv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribLdv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexArrayIndexed64iv +.private_extern _bluegl_glViewportArrayv .align 2 -_bluegl_glGetVertexArrayIndexed64iv: - adrp x16, ___blue_glCore_glGetVertexArrayIndexed64iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexArrayIndexed64iv@GOTPAGEOFF] +_bluegl_glViewportArrayv: + adrp x16, ___blue_glCore_glViewportArrayv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glViewportArrayv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnHistogramARB +.private_extern _bluegl_glViewportIndexedf .align 2 -_bluegl_glGetnHistogramARB: - adrp x16, ___blue_glCore_glGetnHistogramARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnHistogramARB@GOTPAGEOFF] +_bluegl_glViewportIndexedf: + adrp x16, ___blue_glCore_glViewportIndexedf@GOTPAGE + ldr x16, [x16, ___blue_glCore_glViewportIndexedf@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN +.private_extern _bluegl_glViewportIndexedfv .align 2 -_bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN: - adrp x16, ___blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN@GOTPAGEOFF] +_bluegl_glViewportIndexedfv: + adrp x16, ___blue_glCore_glViewportIndexedfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glViewportIndexedfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI2ivEXT +.private_extern _bluegl_glScissorArrayv .align 2 -_bluegl_glVertexAttribI2ivEXT: - adrp x16, ___blue_glCore_glVertexAttribI2ivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI2ivEXT@GOTPAGEOFF] +_bluegl_glScissorArrayv: + adrp x16, ___blue_glCore_glScissorArrayv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glScissorArrayv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexSubImage2DEXT +.private_extern _bluegl_glScissorIndexed .align 2 -_bluegl_glTexSubImage2DEXT: - adrp x16, ___blue_glCore_glTexSubImage2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexSubImage2DEXT@GOTPAGEOFF] +_bluegl_glScissorIndexed: + adrp x16, ___blue_glCore_glScissorIndexed@GOTPAGE + ldr x16, [x16, ___blue_glCore_glScissorIndexed@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFragmentMaterialivSGIX +.private_extern _bluegl_glScissorIndexedv .align 2 -_bluegl_glGetFragmentMaterialivSGIX: - adrp x16, ___blue_glCore_glGetFragmentMaterialivSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFragmentMaterialivSGIX@GOTPAGEOFF] +_bluegl_glScissorIndexedv: + adrp x16, ___blue_glCore_glScissorIndexedv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glScissorIndexedv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearNamedFramebufferiv +.private_extern _bluegl_glDepthRangeArrayv .align 2 -_bluegl_glClearNamedFramebufferiv: - adrp x16, ___blue_glCore_glClearNamedFramebufferiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearNamedFramebufferiv@GOTPAGEOFF] +_bluegl_glDepthRangeArrayv: + adrp x16, ___blue_glCore_glDepthRangeArrayv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDepthRangeArrayv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixMult3x3fNV +.private_extern _bluegl_glDepthRangeIndexed .align 2 -_bluegl_glMatrixMult3x3fNV: - adrp x16, ___blue_glCore_glMatrixMult3x3fNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixMult3x3fNV@GOTPAGEOFF] +_bluegl_glDepthRangeIndexed: + adrp x16, ___blue_glCore_glDepthRangeIndexed@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDepthRangeIndexed@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetQueryBufferObjectiv +.private_extern _bluegl_glGetFloati_v .align 2 -_bluegl_glGetQueryBufferObjectiv: - adrp x16, ___blue_glCore_glGetQueryBufferObjectiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetQueryBufferObjectiv@GOTPAGEOFF] +_bluegl_glGetFloati_v: + adrp x16, ___blue_glCore_glGetFloati_v@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFloati_v@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVideoCaptureStreamParameterfvNV +.private_extern _bluegl_glGetDoublei_v .align 2 -_bluegl_glVideoCaptureStreamParameterfvNV: - adrp x16, ___blue_glCore_glVideoCaptureStreamParameterfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVideoCaptureStreamParameterfvNV@GOTPAGEOFF] +_bluegl_glGetDoublei_v: + adrp x16, ___blue_glCore_glGetDoublei_v@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetDoublei_v@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexImage3DMultisample +.private_extern _bluegl_glDrawArraysInstancedBaseInstance .align 2 -_bluegl_glTexImage3DMultisample: - adrp x16, ___blue_glCore_glTexImage3DMultisample@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexImage3DMultisample@GOTPAGEOFF] +_bluegl_glDrawArraysInstancedBaseInstance: + adrp x16, ___blue_glCore_glDrawArraysInstancedBaseInstance@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawArraysInstancedBaseInstance@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArraySecondaryColorOffsetEXT +.private_extern _bluegl_glDrawElementsInstancedBaseInstance .align 2 -_bluegl_glVertexArraySecondaryColorOffsetEXT: - adrp x16, ___blue_glCore_glVertexArraySecondaryColorOffsetEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArraySecondaryColorOffsetEXT@GOTPAGEOFF] +_bluegl_glDrawElementsInstancedBaseInstance: + adrp x16, ___blue_glCore_glDrawElementsInstancedBaseInstance@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawElementsInstancedBaseInstance@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVariantusvEXT +.private_extern _bluegl_glDrawElementsInstancedBaseVertexBaseInstance .align 2 -_bluegl_glVariantusvEXT: - adrp x16, ___blue_glCore_glVariantusvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVariantusvEXT@GOTPAGEOFF] +_bluegl_glDrawElementsInstancedBaseVertexBaseInstance: + adrp x16, ___blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawArraysInstanced +.private_extern _bluegl_glGetInternalformativ .align 2 -_bluegl_glDrawArraysInstanced: - adrp x16, ___blue_glCore_glDrawArraysInstanced@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawArraysInstanced@GOTPAGEOFF] +_bluegl_glGetInternalformativ: + adrp x16, ___blue_glCore_glGetInternalformativ@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetInternalformativ@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix2x4dvEXT +.private_extern _bluegl_glGetActiveAtomicCounterBufferiv .align 2 -_bluegl_glProgramUniformMatrix2x4dvEXT: - adrp x16, ___blue_glCore_glProgramUniformMatrix2x4dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2x4dvEXT@GOTPAGEOFF] +_bluegl_glGetActiveAtomicCounterBufferiv: + adrp x16, ___blue_glCore_glGetActiveAtomicCounterBufferiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetActiveAtomicCounterBufferiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramBufferParametersIivNV +.private_extern _bluegl_glBindImageTexture .align 2 -_bluegl_glProgramBufferParametersIivNV: - adrp x16, ___blue_glCore_glProgramBufferParametersIivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramBufferParametersIivNV@GOTPAGEOFF] +_bluegl_glBindImageTexture: + adrp x16, ___blue_glCore_glBindImageTexture@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindImageTexture@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glViewportArrayv +.private_extern _bluegl_glMemoryBarrier .align 2 -_bluegl_glViewportArrayv: - adrp x16, ___blue_glCore_glViewportArrayv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glViewportArrayv@GOTPAGEOFF] +_bluegl_glMemoryBarrier: + adrp x16, ___blue_glCore_glMemoryBarrier@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMemoryBarrier@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTangent3svEXT +.private_extern _bluegl_glTexStorage1D .align 2 -_bluegl_glTangent3svEXT: - adrp x16, ___blue_glCore_glTangent3svEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTangent3svEXT@GOTPAGEOFF] +_bluegl_glTexStorage1D: + adrp x16, ___blue_glCore_glTexStorage1D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexStorage1D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeuiVertex3fSUN +.private_extern _bluegl_glTexStorage2D .align 2 -_bluegl_glReplacementCodeuiVertex3fSUN: - adrp x16, ___blue_glCore_glReplacementCodeuiVertex3fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeuiVertex3fSUN@GOTPAGEOFF] +_bluegl_glTexStorage2D: + adrp x16, ___blue_glCore_glTexStorage2D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexStorage2D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSharpenTexFuncSGIS +.private_extern _bluegl_glTexStorage3D .align 2 -_bluegl_glSharpenTexFuncSGIS: - adrp x16, ___blue_glCore_glSharpenTexFuncSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSharpenTexFuncSGIS@GOTPAGEOFF] +_bluegl_glTexStorage3D: + adrp x16, ___blue_glCore_glTexStorage3D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexStorage3D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormalFormatNV +.private_extern _bluegl_glDrawTransformFeedbackInstanced .align 2 -_bluegl_glNormalFormatNV: - adrp x16, ___blue_glCore_glNormalFormatNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormalFormatNV@GOTPAGEOFF] +_bluegl_glDrawTransformFeedbackInstanced: + adrp x16, ___blue_glCore_glDrawTransformFeedbackInstanced@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawTransformFeedbackInstanced@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL3dv +.private_extern _bluegl_glDrawTransformFeedbackStreamInstanced .align 2 -_bluegl_glVertexAttribL3dv: - adrp x16, ___blue_glCore_glVertexAttribL3dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL3dv@GOTPAGEOFF] +_bluegl_glDrawTransformFeedbackStreamInstanced: + adrp x16, ___blue_glCore_glDrawTransformFeedbackStreamInstanced@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawTransformFeedbackStreamInstanced@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedStringARB +.private_extern _bluegl_glClearBufferData .align 2 -_bluegl_glNamedStringARB: - adrp x16, ___blue_glCore_glNamedStringARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedStringARB@GOTPAGEOFF] +_bluegl_glClearBufferData: + adrp x16, ___blue_glCore_glClearBufferData@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearBufferData@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayVertexAttribFormatEXT +.private_extern _bluegl_glClearBufferSubData .align 2 -_bluegl_glVertexArrayVertexAttribFormatEXT: - adrp x16, ___blue_glCore_glVertexArrayVertexAttribFormatEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayVertexAttribFormatEXT@GOTPAGEOFF] +_bluegl_glClearBufferSubData: + adrp x16, ___blue_glCore_glClearBufferSubData@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearBufferSubData@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoordP3ui +.private_extern _bluegl_glDispatchCompute .align 2 -_bluegl_glMultiTexCoordP3ui: - adrp x16, ___blue_glCore_glMultiTexCoordP3ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoordP3ui@GOTPAGEOFF] +_bluegl_glDispatchCompute: + adrp x16, ___blue_glCore_glDispatchCompute@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDispatchCompute@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexSubImage3DEXT +.private_extern _bluegl_glDispatchComputeIndirect .align 2 -_bluegl_glMultiTexSubImage3DEXT: - adrp x16, ___blue_glCore_glMultiTexSubImage3DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexSubImage3DEXT@GOTPAGEOFF] +_bluegl_glDispatchComputeIndirect: + adrp x16, ___blue_glCore_glDispatchComputeIndirect@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDispatchComputeIndirect@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2fvARB +.private_extern _bluegl_glCopyImageSubData .align 2 -_bluegl_glUniform2fvARB: - adrp x16, ___blue_glCore_glUniform2fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2fvARB@GOTPAGEOFF] +_bluegl_glCopyImageSubData: + adrp x16, ___blue_glCore_glCopyImageSubData@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyImageSubData@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPixelMapxv +.private_extern _bluegl_glFramebufferParameteri .align 2 -_bluegl_glGetPixelMapxv: - adrp x16, ___blue_glCore_glGetPixelMapxv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPixelMapxv@GOTPAGEOFF] +_bluegl_glFramebufferParameteri: + adrp x16, ___blue_glCore_glFramebufferParameteri@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferParameteri@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTangent3ivEXT +.private_extern _bluegl_glGetFramebufferParameteriv .align 2 -_bluegl_glTangent3ivEXT: - adrp x16, ___blue_glCore_glTangent3ivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTangent3ivEXT@GOTPAGEOFF] +_bluegl_glGetFramebufferParameteriv: + adrp x16, ___blue_glCore_glGetFramebufferParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFramebufferParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetLocalConstantIntegervEXT +.private_extern _bluegl_glGetInternalformati64v .align 2 -_bluegl_glGetLocalConstantIntegervEXT: - adrp x16, ___blue_glCore_glGetLocalConstantIntegervEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetLocalConstantIntegervEXT@GOTPAGEOFF] +_bluegl_glGetInternalformati64v: + adrp x16, ___blue_glCore_glGetInternalformati64v@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetInternalformati64v@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPresentFrameDualFillNV +.private_extern _bluegl_glInvalidateTexSubImage .align 2 -_bluegl_glPresentFrameDualFillNV: - adrp x16, ___blue_glCore_glPresentFrameDualFillNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPresentFrameDualFillNV@GOTPAGEOFF] +_bluegl_glInvalidateTexSubImage: + adrp x16, ___blue_glCore_glInvalidateTexSubImage@GOTPAGE + ldr x16, [x16, ___blue_glCore_glInvalidateTexSubImage@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEndVertexShaderEXT +.private_extern _bluegl_glInvalidateTexImage .align 2 -_bluegl_glEndVertexShaderEXT: - adrp x16, ___blue_glCore_glEndVertexShaderEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEndVertexShaderEXT@GOTPAGEOFF] +_bluegl_glInvalidateTexImage: + adrp x16, ___blue_glCore_glInvalidateTexImage@GOTPAGE + ldr x16, [x16, ___blue_glCore_glInvalidateTexImage@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayVertexBuffer +.private_extern _bluegl_glInvalidateBufferSubData .align 2 -_bluegl_glVertexArrayVertexBuffer: - adrp x16, ___blue_glCore_glVertexArrayVertexBuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayVertexBuffer@GOTPAGEOFF] +_bluegl_glInvalidateBufferSubData: + adrp x16, ___blue_glCore_glInvalidateBufferSubData@GOTPAGE + ldr x16, [x16, ___blue_glCore_glInvalidateBufferSubData@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMakeTextureHandleNonResidentNV +.private_extern _bluegl_glInvalidateBufferData .align 2 -_bluegl_glMakeTextureHandleNonResidentNV: - adrp x16, ___blue_glCore_glMakeTextureHandleNonResidentNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMakeTextureHandleNonResidentNV@GOTPAGEOFF] +_bluegl_glInvalidateBufferData: + adrp x16, ___blue_glCore_glInvalidateBufferData@GOTPAGE + ldr x16, [x16, ___blue_glCore_glInvalidateBufferData@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI3uiEXT +.private_extern _bluegl_glInvalidateFramebuffer .align 2 -_bluegl_glVertexAttribI3uiEXT: - adrp x16, ___blue_glCore_glVertexAttribI3uiEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI3uiEXT@GOTPAGEOFF] +_bluegl_glInvalidateFramebuffer: + adrp x16, ___blue_glCore_glInvalidateFramebuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glInvalidateFramebuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBinormal3bvEXT +.private_extern _bluegl_glInvalidateSubFramebuffer .align 2 -_bluegl_glBinormal3bvEXT: - adrp x16, ___blue_glCore_glBinormal3bvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBinormal3bvEXT@GOTPAGEOFF] +_bluegl_glInvalidateSubFramebuffer: + adrp x16, ___blue_glCore_glInvalidateSubFramebuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glInvalidateSubFramebuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPixelTexGenParameterfSGIS +.private_extern _bluegl_glMultiDrawArraysIndirect .align 2 -_bluegl_glPixelTexGenParameterfSGIS: - adrp x16, ___blue_glCore_glPixelTexGenParameterfSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPixelTexGenParameterfSGIS@GOTPAGEOFF] +_bluegl_glMultiDrawArraysIndirect: + adrp x16, ___blue_glCore_glMultiDrawArraysIndirect@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiDrawArraysIndirect@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexGenivEXT +.private_extern _bluegl_glMultiDrawElementsIndirect .align 2 -_bluegl_glMultiTexGenivEXT: - adrp x16, ___blue_glCore_glMultiTexGenivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexGenivEXT@GOTPAGEOFF] +_bluegl_glMultiDrawElementsIndirect: + adrp x16, ___blue_glCore_glMultiDrawElementsIndirect@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiDrawElementsIndirect@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVideoivNV +.private_extern _bluegl_glGetProgramInterfaceiv .align 2 -_bluegl_glGetVideoivNV: - adrp x16, ___blue_glCore_glGetVideoivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVideoivNV@GOTPAGEOFF] +_bluegl_glGetProgramInterfaceiv: + adrp x16, ___blue_glCore_glGetProgramInterfaceiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramInterfaceiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoordP2ui +.private_extern _bluegl_glGetProgramResourceIndex .align 2 -_bluegl_glMultiTexCoordP2ui: - adrp x16, ___blue_glCore_glMultiTexCoordP2ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoordP2ui@GOTPAGEOFF] +_bluegl_glGetProgramResourceIndex: + adrp x16, ___blue_glCore_glGetProgramResourceIndex@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramResourceIndex@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeletePerfQueryINTEL +.private_extern _bluegl_glGetProgramResourceName .align 2 -_bluegl_glDeletePerfQueryINTEL: - adrp x16, ___blue_glCore_glDeletePerfQueryINTEL@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeletePerfQueryINTEL@GOTPAGEOFF] +_bluegl_glGetProgramResourceName: + adrp x16, ___blue_glCore_glGetProgramResourceName@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramResourceName@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDepthBoundsdNV +.private_extern _bluegl_glGetProgramResourceiv .align 2 -_bluegl_glDepthBoundsdNV: - adrp x16, ___blue_glCore_glDepthBoundsdNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDepthBoundsdNV@GOTPAGEOFF] +_bluegl_glGetProgramResourceiv: + adrp x16, ___blue_glCore_glGetProgramResourceiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramResourceiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPixelTransferxOES +.private_extern _bluegl_glGetProgramResourceLocation .align 2 -_bluegl_glPixelTransferxOES: - adrp x16, ___blue_glCore_glPixelTransferxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPixelTransferxOES@GOTPAGEOFF] +_bluegl_glGetProgramResourceLocation: + adrp x16, ___blue_glCore_glGetProgramResourceLocation@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramResourceLocation@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCombinerOutputNV +.private_extern _bluegl_glGetProgramResourceLocationIndex .align 2 -_bluegl_glCombinerOutputNV: - adrp x16, ___blue_glCore_glCombinerOutputNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCombinerOutputNV@GOTPAGEOFF] +_bluegl_glGetProgramResourceLocationIndex: + adrp x16, ___blue_glCore_glGetProgramResourceLocationIndex@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramResourceLocationIndex@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyTextureSubImage1D +.private_extern _bluegl_glShaderStorageBlockBinding .align 2 -_bluegl_glCopyTextureSubImage1D: - adrp x16, ___blue_glCore_glCopyTextureSubImage1D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyTextureSubImage1D@GOTPAGEOFF] +_bluegl_glShaderStorageBlockBinding: + adrp x16, ___blue_glCore_glShaderStorageBlockBinding@GOTPAGE + ldr x16, [x16, ___blue_glCore_glShaderStorageBlockBinding@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI4iv +.private_extern _bluegl_glTexBufferRange .align 2 -_bluegl_glVertexAttribI4iv: - adrp x16, ___blue_glCore_glVertexAttribI4iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI4iv@GOTPAGEOFF] +_bluegl_glTexBufferRange: + adrp x16, ___blue_glCore_glTexBufferRange@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexBufferRange@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyTexImage2DEXT +.private_extern _bluegl_glTexStorage2DMultisample .align 2 -_bluegl_glCopyTexImage2DEXT: - adrp x16, ___blue_glCore_glCopyTexImage2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyTexImage2DEXT@GOTPAGEOFF] +_bluegl_glTexStorage2DMultisample: + adrp x16, ___blue_glCore_glTexStorage2DMultisample@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexStorage2DMultisample@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindLightParameterEXT +.private_extern _bluegl_glTexStorage3DMultisample .align 2 -_bluegl_glBindLightParameterEXT: - adrp x16, ___blue_glCore_glBindLightParameterEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindLightParameterEXT@GOTPAGEOFF] +_bluegl_glTexStorage3DMultisample: + adrp x16, ___blue_glCore_glTexStorage3DMultisample@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexStorage3DMultisample@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiDrawElementsBaseVertex +.private_extern _bluegl_glTextureView .align 2 -_bluegl_glMultiDrawElementsBaseVertex: - adrp x16, ___blue_glCore_glMultiDrawElementsBaseVertex@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiDrawElementsBaseVertex@GOTPAGEOFF] +_bluegl_glTextureView: + adrp x16, ___blue_glCore_glTextureView@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureView@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2uivEXT +.private_extern _bluegl_glBindVertexBuffer .align 2 -_bluegl_glProgramUniform2uivEXT: - adrp x16, ___blue_glCore_glProgramUniform2uivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2uivEXT@GOTPAGEOFF] +_bluegl_glBindVertexBuffer: + adrp x16, ___blue_glCore_glBindVertexBuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindVertexBuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeletePerfMonitorsAMD +.private_extern _bluegl_glVertexAttribFormat .align 2 -_bluegl_glDeletePerfMonitorsAMD: - adrp x16, ___blue_glCore_glDeletePerfMonitorsAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeletePerfMonitorsAMD@GOTPAGEOFF] +_bluegl_glVertexAttribFormat: + adrp x16, ___blue_glCore_glVertexAttribFormat@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribFormat@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyImageSubData +.private_extern _bluegl_glVertexAttribIFormat .align 2 -_bluegl_glCopyImageSubData: - adrp x16, ___blue_glCore_glCopyImageSubData@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyImageSubData@GOTPAGEOFF] +_bluegl_glVertexAttribIFormat: + adrp x16, ___blue_glCore_glVertexAttribIFormat@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribIFormat@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathCoverDepthFuncNV +.private_extern _bluegl_glVertexAttribLFormat .align 2 -_bluegl_glPathCoverDepthFuncNV: - adrp x16, ___blue_glCore_glPathCoverDepthFuncNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathCoverDepthFuncNV@GOTPAGEOFF] +_bluegl_glVertexAttribLFormat: + adrp x16, ___blue_glCore_glVertexAttribLFormat@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribLFormat@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFramebufferAttachmentParameteriv +.private_extern _bluegl_glVertexAttribBinding .align 2 -_bluegl_glGetFramebufferAttachmentParameteriv: - adrp x16, ___blue_glCore_glGetFramebufferAttachmentParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFramebufferAttachmentParameteriv@GOTPAGEOFF] +_bluegl_glVertexAttribBinding: + adrp x16, ___blue_glCore_glVertexAttribBinding@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribBinding@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glRectxOES +.private_extern _bluegl_glVertexBindingDivisor .align 2 -_bluegl_glRectxOES: - adrp x16, ___blue_glCore_glRectxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glRectxOES@GOTPAGEOFF] +_bluegl_glVertexBindingDivisor: + adrp x16, ___blue_glCore_glVertexBindingDivisor@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexBindingDivisor@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTagSampleBufferSGIX +.private_extern _bluegl_glDebugMessageControl .align 2 -_bluegl_glTagSampleBufferSGIX: - adrp x16, ___blue_glCore_glTagSampleBufferSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTagSampleBufferSGIX@GOTPAGEOFF] +_bluegl_glDebugMessageControl: + adrp x16, ___blue_glCore_glDebugMessageControl@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDebugMessageControl@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream3svATI +.private_extern _bluegl_glDebugMessageInsert .align 2 -_bluegl_glVertexStream3svATI: - adrp x16, ___blue_glCore_glVertexStream3svATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream3svATI@GOTPAGEOFF] +_bluegl_glDebugMessageInsert: + adrp x16, ___blue_glCore_glDebugMessageInsert@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDebugMessageInsert@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPathTexGenfvNV +.private_extern _bluegl_glDebugMessageCallback .align 2 -_bluegl_glGetPathTexGenfvNV: - adrp x16, ___blue_glCore_glGetPathTexGenfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPathTexGenfvNV@GOTPAGEOFF] +_bluegl_glDebugMessageCallback: + adrp x16, ___blue_glCore_glDebugMessageCallback@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDebugMessageCallback@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glOrthofOES +.private_extern _bluegl_glGetDebugMessageLog .align 2 -_bluegl_glOrthofOES: - adrp x16, ___blue_glCore_glOrthofOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glOrthofOES@GOTPAGEOFF] +_bluegl_glGetDebugMessageLog: + adrp x16, ___blue_glCore_glGetDebugMessageLog@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetDebugMessageLog@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyTexImage2D +.private_extern _bluegl_glPushDebugGroup .align 2 -_bluegl_glCopyTexImage2D: - adrp x16, ___blue_glCore_glCopyTexImage2D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyTexImage2D@GOTPAGEOFF] +_bluegl_glPushDebugGroup: + adrp x16, ___blue_glCore_glPushDebugGroup@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPushDebugGroup@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord2fColor4ubVertex3fSUN +.private_extern _bluegl_glPopDebugGroup .align 2 -_bluegl_glTexCoord2fColor4ubVertex3fSUN: - adrp x16, ___blue_glCore_glTexCoord2fColor4ubVertex3fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord2fColor4ubVertex3fSUN@GOTPAGEOFF] +_bluegl_glPopDebugGroup: + adrp x16, ___blue_glCore_glPopDebugGroup@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPopDebugGroup@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultTransposeMatrixdARB +.private_extern _bluegl_glObjectLabel .align 2 -_bluegl_glMultTransposeMatrixdARB: - adrp x16, ___blue_glCore_glMultTransposeMatrixdARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultTransposeMatrixdARB@GOTPAGEOFF] +_bluegl_glObjectLabel: + adrp x16, ___blue_glCore_glObjectLabel@GOTPAGE + ldr x16, [x16, ___blue_glCore_glObjectLabel@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3i +.private_extern _bluegl_glGetObjectLabel .align 2 -_bluegl_glProgramUniform3i: - adrp x16, ___blue_glCore_glProgramUniform3i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3i@GOTPAGEOFF] +_bluegl_glGetObjectLabel: + adrp x16, ___blue_glCore_glGetObjectLabel@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetObjectLabel@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glArrayObjectATI +.private_extern _bluegl_glObjectPtrLabel .align 2 -_bluegl_glArrayObjectATI: - adrp x16, ___blue_glCore_glArrayObjectATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glArrayObjectATI@GOTPAGEOFF] +_bluegl_glObjectPtrLabel: + adrp x16, ___blue_glCore_glObjectPtrLabel@GOTPAGE + ldr x16, [x16, ___blue_glCore_glObjectPtrLabel@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixRotatedEXT +.private_extern _bluegl_glGetObjectPtrLabel .align 2 -_bluegl_glMatrixRotatedEXT: - adrp x16, ___blue_glCore_glMatrixRotatedEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixRotatedEXT@GOTPAGEOFF] +_bluegl_glGetObjectPtrLabel: + adrp x16, ___blue_glCore_glGetObjectPtrLabel@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetObjectPtrLabel@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoordP2ui +.private_extern _bluegl_glBufferStorage .align 2 -_bluegl_glTexCoordP2ui: - adrp x16, ___blue_glCore_glTexCoordP2ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoordP2ui@GOTPAGEOFF] +_bluegl_glBufferStorage: + adrp x16, ___blue_glCore_glBufferStorage@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBufferStorage@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPassTexCoordATI +.private_extern _bluegl_glClearTexImage .align 2 -_bluegl_glPassTexCoordATI: - adrp x16, ___blue_glCore_glPassTexCoordATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPassTexCoordATI@GOTPAGEOFF] +_bluegl_glClearTexImage: + adrp x16, ___blue_glCore_glClearTexImage@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearTexImage@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsTexture +.private_extern _bluegl_glClearTexSubImage .align 2 -_bluegl_glIsTexture: - adrp x16, ___blue_glCore_glIsTexture@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsTexture@GOTPAGEOFF] +_bluegl_glClearTexSubImage: + adrp x16, ___blue_glCore_glClearTexSubImage@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearTexSubImage@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTexSubImage3DARB +.private_extern _bluegl_glBindBuffersBase .align 2 -_bluegl_glCompressedTexSubImage3DARB: - adrp x16, ___blue_glCore_glCompressedTexSubImage3DARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTexSubImage3DARB@GOTPAGEOFF] +_bluegl_glBindBuffersBase: + adrp x16, ___blue_glCore_glBindBuffersBase@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindBuffersBase@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDepthRangexOES +.private_extern _bluegl_glBindBuffersRange .align 2 -_bluegl_glDepthRangexOES: - adrp x16, ___blue_glCore_glDepthRangexOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDepthRangexOES@GOTPAGEOFF] +_bluegl_glBindBuffersRange: + adrp x16, ___blue_glCore_glBindBuffersRange@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindBuffersRange@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glImageTransformParameterivHP +.private_extern _bluegl_glBindTextures .align 2 -_bluegl_glImageTransformParameterivHP: - adrp x16, ___blue_glCore_glImageTransformParameterivHP@GOTPAGE - ldr x16, [x16, ___blue_glCore_glImageTransformParameterivHP@GOTPAGEOFF] +_bluegl_glBindTextures: + adrp x16, ___blue_glCore_glBindTextures@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindTextures@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultTransposeMatrixfARB +.private_extern _bluegl_glBindSamplers .align 2 -_bluegl_glMultTransposeMatrixfARB: - adrp x16, ___blue_glCore_glMultTransposeMatrixfARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultTransposeMatrixfARB@GOTPAGEOFF] +_bluegl_glBindSamplers: + adrp x16, ___blue_glCore_glBindSamplers@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindSamplers@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformHandleui64vARB +.private_extern _bluegl_glBindImageTextures .align 2 -_bluegl_glUniformHandleui64vARB: - adrp x16, ___blue_glCore_glUniformHandleui64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformHandleui64vARB@GOTPAGEOFF] +_bluegl_glBindImageTextures: + adrp x16, ___blue_glCore_glBindImageTextures@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindImageTextures@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenTransformFeedbacks +.private_extern _bluegl_glBindVertexBuffers .align 2 -_bluegl_glGenTransformFeedbacks: - adrp x16, ___blue_glCore_glGenTransformFeedbacks@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenTransformFeedbacks@GOTPAGEOFF] +_bluegl_glBindVertexBuffers: + adrp x16, ___blue_glCore_glBindVertexBuffers@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindVertexBuffers@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureStorage1D +.private_extern _bluegl_glClipControl .align 2 -_bluegl_glTextureStorage1D: - adrp x16, ___blue_glCore_glTextureStorage1D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureStorage1D@GOTPAGEOFF] +_bluegl_glClipControl: + adrp x16, ___blue_glCore_glClipControl@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClipControl@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribivNV +.private_extern _bluegl_glCreateTransformFeedbacks .align 2 -_bluegl_glGetVertexAttribivNV: - adrp x16, ___blue_glCore_glGetVertexAttribivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribivNV@GOTPAGEOFF] +_bluegl_glCreateTransformFeedbacks: + adrp x16, ___blue_glCore_glCreateTransformFeedbacks@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreateTransformFeedbacks@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodePointerSUN +.private_extern _bluegl_glTransformFeedbackBufferBase .align 2 -_bluegl_glReplacementCodePointerSUN: - adrp x16, ___blue_glCore_glReplacementCodePointerSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodePointerSUN@GOTPAGEOFF] +_bluegl_glTransformFeedbackBufferBase: + adrp x16, ___blue_glCore_glTransformFeedbackBufferBase@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTransformFeedbackBufferBase@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI3uiv +.private_extern _bluegl_glTransformFeedbackBufferRange .align 2 -_bluegl_glVertexAttribI3uiv: - adrp x16, ___blue_glCore_glVertexAttribI3uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI3uiv@GOTPAGEOFF] +_bluegl_glTransformFeedbackBufferRange: + adrp x16, ___blue_glCore_glTransformFeedbackBufferRange@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTransformFeedbackBufferRange@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeuiNormal3fVertex3fSUN +.private_extern _bluegl_glGetTransformFeedbackiv .align 2 -_bluegl_glReplacementCodeuiNormal3fVertex3fSUN: - adrp x16, ___blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN@GOTPAGEOFF] +_bluegl_glGetTransformFeedbackiv: + adrp x16, ___blue_glCore_glGetTransformFeedbackiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTransformFeedbackiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL2dEXT +.private_extern _bluegl_glGetTransformFeedbacki_v .align 2 -_bluegl_glVertexAttribL2dEXT: - adrp x16, ___blue_glCore_glVertexAttribL2dEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL2dEXT@GOTPAGEOFF] +_bluegl_glGetTransformFeedbacki_v: + adrp x16, ___blue_glCore_glGetTransformFeedbacki_v@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTransformFeedbacki_v@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3ui64NV +.private_extern _bluegl_glGetTransformFeedbacki64_v .align 2 -_bluegl_glProgramUniform3ui64NV: - adrp x16, ___blue_glCore_glProgramUniform3ui64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3ui64NV@GOTPAGEOFF] +_bluegl_glGetTransformFeedbacki64_v: + adrp x16, ___blue_glCore_glGetTransformFeedbacki64_v@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTransformFeedbacki64_v@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3i64NV +.private_extern _bluegl_glCreateBuffers .align 2 -_bluegl_glProgramUniform3i64NV: - adrp x16, ___blue_glCore_glProgramUniform3i64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3i64NV@GOTPAGEOFF] +_bluegl_glCreateBuffers: + adrp x16, ___blue_glCore_glCreateBuffers@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreateBuffers@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedRenderbufferParameterivEXT +.private_extern _bluegl_glNamedBufferStorage .align 2 -_bluegl_glGetNamedRenderbufferParameterivEXT: - adrp x16, ___blue_glCore_glGetNamedRenderbufferParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedRenderbufferParameterivEXT@GOTPAGEOFF] +_bluegl_glNamedBufferStorage: + adrp x16, ___blue_glCore_glNamedBufferStorage@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedBufferStorage@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTangent3bvEXT +.private_extern _bluegl_glNamedBufferData .align 2 -_bluegl_glTangent3bvEXT: - adrp x16, ___blue_glCore_glTangent3bvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTangent3bvEXT@GOTPAGEOFF] +_bluegl_glNamedBufferData: + adrp x16, ___blue_glCore_glNamedBufferData@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedBufferData@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1dvEXT +.private_extern _bluegl_glNamedBufferSubData .align 2 -_bluegl_glProgramUniform1dvEXT: - adrp x16, ___blue_glCore_glProgramUniform1dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1dvEXT@GOTPAGEOFF] +_bluegl_glNamedBufferSubData: + adrp x16, ___blue_glCore_glNamedBufferSubData@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedBufferSubData@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixLoadTransposedEXT +.private_extern _bluegl_glCopyNamedBufferSubData .align 2 -_bluegl_glMatrixLoadTransposedEXT: - adrp x16, ___blue_glCore_glMatrixLoadTransposedEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixLoadTransposedEXT@GOTPAGEOFF] +_bluegl_glCopyNamedBufferSubData: + adrp x16, ___blue_glCore_glCopyNamedBufferSubData@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyNamedBufferSubData@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribLdv +.private_extern _bluegl_glClearNamedBufferData .align 2 -_bluegl_glGetVertexAttribLdv: - adrp x16, ___blue_glCore_glGetVertexAttribLdv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribLdv@GOTPAGEOFF] +_bluegl_glClearNamedBufferData: + adrp x16, ___blue_glCore_glClearNamedBufferData@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearNamedBufferData@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream2dATI +.private_extern _bluegl_glClearNamedBufferSubData .align 2 -_bluegl_glVertexStream2dATI: - adrp x16, ___blue_glCore_glVertexStream2dATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream2dATI@GOTPAGEOFF] +_bluegl_glClearNamedBufferSubData: + adrp x16, ___blue_glCore_glClearNamedBufferSubData@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearNamedBufferSubData@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFragmentLightivSGIX +.private_extern _bluegl_glMapNamedBuffer .align 2 -_bluegl_glGetFragmentLightivSGIX: - adrp x16, ___blue_glCore_glGetFragmentLightivSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFragmentLightivSGIX@GOTPAGEOFF] +_bluegl_glMapNamedBuffer: + adrp x16, ___blue_glCore_glMapNamedBuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMapNamedBuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMinmaxEXT +.private_extern _bluegl_glMapNamedBufferRange .align 2 -_bluegl_glGetMinmaxEXT: - adrp x16, ___blue_glCore_glGetMinmaxEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMinmaxEXT@GOTPAGEOFF] +_bluegl_glMapNamedBufferRange: + adrp x16, ___blue_glCore_glMapNamedBufferRange@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMapNamedBufferRange@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFlushStaticDataIBM +.private_extern _bluegl_glUnmapNamedBuffer .align 2 -_bluegl_glFlushStaticDataIBM: - adrp x16, ___blue_glCore_glFlushStaticDataIBM@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFlushStaticDataIBM@GOTPAGEOFF] +_bluegl_glUnmapNamedBuffer: + adrp x16, ___blue_glCore_glUnmapNamedBuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUnmapNamedBuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glShaderOp1EXT +.private_extern _bluegl_glFlushMappedNamedBufferRange .align 2 -_bluegl_glShaderOp1EXT: - adrp x16, ___blue_glCore_glShaderOp1EXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glShaderOp1EXT@GOTPAGEOFF] +_bluegl_glFlushMappedNamedBufferRange: + adrp x16, ___blue_glCore_glFlushMappedNamedBufferRange@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFlushMappedNamedBufferRange@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsStateNV +.private_extern _bluegl_glGetNamedBufferParameteriv .align 2 -_bluegl_glIsStateNV: - adrp x16, ___blue_glCore_glIsStateNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsStateNV@GOTPAGEOFF] +_bluegl_glGetNamedBufferParameteriv: + adrp x16, ___blue_glCore_glGetNamedBufferParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedBufferParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramEnvParameterIuivNV +.private_extern _bluegl_glGetNamedBufferParameteri64v .align 2 -_bluegl_glGetProgramEnvParameterIuivNV: - adrp x16, ___blue_glCore_glGetProgramEnvParameterIuivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramEnvParameterIuivNV@GOTPAGEOFF] +_bluegl_glGetNamedBufferParameteri64v: + adrp x16, ___blue_glCore_glGetNamedBufferParameteri64v@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedBufferParameteri64v@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVideoCaptureivNV +.private_extern _bluegl_glGetNamedBufferPointerv .align 2 -_bluegl_glGetVideoCaptureivNV: - adrp x16, ___blue_glCore_glGetVideoCaptureivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVideoCaptureivNV@GOTPAGEOFF] +_bluegl_glGetNamedBufferPointerv: + adrp x16, ___blue_glCore_glGetNamedBufferPointerv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedBufferPointerv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathStringNV +.private_extern _bluegl_glGetNamedBufferSubData .align 2 -_bluegl_glPathStringNV: - adrp x16, ___blue_glCore_glPathStringNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathStringNV@GOTPAGEOFF] +_bluegl_glGetNamedBufferSubData: + adrp x16, ___blue_glCore_glGetNamedBufferSubData@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedBufferSubData@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glListParameterfSGIX +.private_extern _bluegl_glCreateFramebuffers .align 2 -_bluegl_glListParameterfSGIX: - adrp x16, ___blue_glCore_glListParameterfSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glListParameterfSGIX@GOTPAGEOFF] +_bluegl_glCreateFramebuffers: + adrp x16, ___blue_glCore_glCreateFramebuffers@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreateFramebuffers@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFeedbackBufferxOES +.private_extern _bluegl_glNamedFramebufferRenderbuffer .align 2 -_bluegl_glFeedbackBufferxOES: - adrp x16, ___blue_glCore_glFeedbackBufferxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFeedbackBufferxOES@GOTPAGEOFF] +_bluegl_glNamedFramebufferRenderbuffer: + adrp x16, ___blue_glCore_glNamedFramebufferRenderbuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedFramebufferRenderbuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNextPerfQueryIdINTEL +.private_extern _bluegl_glNamedFramebufferParameteri .align 2 -_bluegl_glGetNextPerfQueryIdINTEL: - adrp x16, ___blue_glCore_glGetNextPerfQueryIdINTEL@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNextPerfQueryIdINTEL@GOTPAGEOFF] +_bluegl_glNamedFramebufferParameteri: + adrp x16, ___blue_glCore_glNamedFramebufferParameteri@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedFramebufferParameteri@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVariantArrayObjectfvATI +.private_extern _bluegl_glNamedFramebufferTexture .align 2 -_bluegl_glGetVariantArrayObjectfvATI: - adrp x16, ___blue_glCore_glGetVariantArrayObjectfvATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVariantArrayObjectfvATI@GOTPAGEOFF] +_bluegl_glNamedFramebufferTexture: + adrp x16, ___blue_glCore_glNamedFramebufferTexture@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedFramebufferTexture@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3d +.private_extern _bluegl_glNamedFramebufferTextureLayer .align 2 -_bluegl_glUniform3d: - adrp x16, ___blue_glCore_glUniform3d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3d@GOTPAGEOFF] +_bluegl_glNamedFramebufferTextureLayer: + adrp x16, ___blue_glCore_glNamedFramebufferTextureLayer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedFramebufferTextureLayer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexParameterfvEXT +.private_extern _bluegl_glNamedFramebufferDrawBuffer .align 2 -_bluegl_glMultiTexParameterfvEXT: - adrp x16, ___blue_glCore_glMultiTexParameterfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexParameterfvEXT@GOTPAGEOFF] +_bluegl_glNamedFramebufferDrawBuffer: + adrp x16, ___blue_glCore_glNamedFramebufferDrawBuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedFramebufferDrawBuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetLocalConstantFloatvEXT +.private_extern _bluegl_glNamedFramebufferDrawBuffers .align 2 -_bluegl_glGetLocalConstantFloatvEXT: - adrp x16, ___blue_glCore_glGetLocalConstantFloatvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetLocalConstantFloatvEXT@GOTPAGEOFF] +_bluegl_glNamedFramebufferDrawBuffers: + adrp x16, ___blue_glCore_glNamedFramebufferDrawBuffers@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedFramebufferDrawBuffers@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexImage3DEXT +.private_extern _bluegl_glNamedFramebufferReadBuffer .align 2 -_bluegl_glMultiTexImage3DEXT: - adrp x16, ___blue_glCore_glMultiTexImage3DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexImage3DEXT@GOTPAGEOFF] +_bluegl_glNamedFramebufferReadBuffer: + adrp x16, ___blue_glCore_glNamedFramebufferReadBuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedFramebufferReadBuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3fMESA +.private_extern _bluegl_glInvalidateNamedFramebufferData .align 2 -_bluegl_glWindowPos3fMESA: - adrp x16, ___blue_glCore_glWindowPos3fMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3fMESA@GOTPAGEOFF] +_bluegl_glInvalidateNamedFramebufferData: + adrp x16, ___blue_glCore_glInvalidateNamedFramebufferData@GOTPAGE + ldr x16, [x16, ___blue_glCore_glInvalidateNamedFramebufferData@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCullParameterdvEXT +.private_extern _bluegl_glInvalidateNamedFramebufferSubData .align 2 -_bluegl_glCullParameterdvEXT: - adrp x16, ___blue_glCore_glCullParameterdvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCullParameterdvEXT@GOTPAGEOFF] +_bluegl_glInvalidateNamedFramebufferSubData: + adrp x16, ___blue_glCore_glInvalidateNamedFramebufferSubData@GOTPAGE + ldr x16, [x16, ___blue_glCore_glInvalidateNamedFramebufferSubData@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTrackMatrixivNV +.private_extern _bluegl_glClearNamedFramebufferiv .align 2 -_bluegl_glGetTrackMatrixivNV: - adrp x16, ___blue_glCore_glGetTrackMatrixivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTrackMatrixivNV@GOTPAGEOFF] +_bluegl_glClearNamedFramebufferiv: + adrp x16, ___blue_glCore_glClearNamedFramebufferiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearNamedFramebufferiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendFuncSeparateINGR +.private_extern _bluegl_glClearNamedFramebufferuiv .align 2 -_bluegl_glBlendFuncSeparateINGR: - adrp x16, ___blue_glCore_glBlendFuncSeparateINGR@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendFuncSeparateINGR@GOTPAGEOFF] +_bluegl_glClearNamedFramebufferuiv: + adrp x16, ___blue_glCore_glClearNamedFramebufferuiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearNamedFramebufferuiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix2fvARB +.private_extern _bluegl_glClearNamedFramebufferfv .align 2 -_bluegl_glUniformMatrix2fvARB: - adrp x16, ___blue_glCore_glUniformMatrix2fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix2fvARB@GOTPAGEOFF] +_bluegl_glClearNamedFramebufferfv: + adrp x16, ___blue_glCore_glClearNamedFramebufferfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearNamedFramebufferfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawArraysInstancedEXT +.private_extern _bluegl_glClearNamedFramebufferfi .align 2 -_bluegl_glDrawArraysInstancedEXT: - adrp x16, ___blue_glCore_glDrawArraysInstancedEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawArraysInstancedEXT@GOTPAGEOFF] +_bluegl_glClearNamedFramebufferfi: + adrp x16, ___blue_glCore_glClearNamedFramebufferfi@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearNamedFramebufferfi@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3iARB +.private_extern _bluegl_glBlitNamedFramebuffer .align 2 -_bluegl_glMultiTexCoord3iARB: - adrp x16, ___blue_glCore_glMultiTexCoord3iARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3iARB@GOTPAGEOFF] +_bluegl_glBlitNamedFramebuffer: + adrp x16, ___blue_glCore_glBlitNamedFramebuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlitNamedFramebuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedFramebufferParameterivEXT +.private_extern _bluegl_glCheckNamedFramebufferStatus .align 2 -_bluegl_glGetNamedFramebufferParameterivEXT: - adrp x16, ___blue_glCore_glGetNamedFramebufferParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedFramebufferParameterivEXT@GOTPAGEOFF] +_bluegl_glCheckNamedFramebufferStatus: + adrp x16, ___blue_glCore_glCheckNamedFramebufferStatus@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCheckNamedFramebufferStatus@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenTextures +.private_extern _bluegl_glGetNamedFramebufferParameteriv .align 2 -_bluegl_glGenTextures: - adrp x16, ___blue_glCore_glGenTextures@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenTextures@GOTPAGEOFF] +_bluegl_glGetNamedFramebufferParameteriv: + adrp x16, ___blue_glCore_glGetNamedFramebufferParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedFramebufferParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsPointInStrokePathNV +.private_extern _bluegl_glGetNamedFramebufferAttachmentParameteriv .align 2 -_bluegl_glIsPointInStrokePathNV: - adrp x16, ___blue_glCore_glIsPointInStrokePathNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsPointInStrokePathNV@GOTPAGEOFF] +_bluegl_glGetNamedFramebufferAttachmentParameteriv: + adrp x16, ___blue_glCore_glGetNamedFramebufferAttachmentParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedFramebufferAttachmentParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawTransformFeedbackNV +.private_extern _bluegl_glCreateRenderbuffers .align 2 -_bluegl_glDrawTransformFeedbackNV: - adrp x16, ___blue_glCore_glDrawTransformFeedbackNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawTransformFeedbackNV@GOTPAGEOFF] +_bluegl_glCreateRenderbuffers: + adrp x16, ___blue_glCore_glCreateRenderbuffers@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreateRenderbuffers@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetActiveUniformARB +.private_extern _bluegl_glNamedRenderbufferStorage .align 2 -_bluegl_glGetActiveUniformARB: - adrp x16, ___blue_glCore_glGetActiveUniformARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetActiveUniformARB@GOTPAGEOFF] +_bluegl_glNamedRenderbufferStorage: + adrp x16, ___blue_glCore_glNamedRenderbufferStorage@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedRenderbufferStorage@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearNamedFramebufferfv +.private_extern _bluegl_glNamedRenderbufferStorageMultisample .align 2 -_bluegl_glClearNamedFramebufferfv: - adrp x16, ___blue_glCore_glClearNamedFramebufferfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearNamedFramebufferfv@GOTPAGEOFF] +_bluegl_glNamedRenderbufferStorageMultisample: + adrp x16, ___blue_glCore_glNamedRenderbufferStorageMultisample@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedRenderbufferStorageMultisample@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBeginVideoCaptureNV +.private_extern _bluegl_glGetNamedRenderbufferParameteriv .align 2 -_bluegl_glBeginVideoCaptureNV: - adrp x16, ___blue_glCore_glBeginVideoCaptureNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBeginVideoCaptureNV@GOTPAGEOFF] +_bluegl_glGetNamedRenderbufferParameteriv: + adrp x16, ___blue_glCore_glGetNamedRenderbufferParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedRenderbufferParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyTexImage1D +.private_extern _bluegl_glCreateTextures .align 2 -_bluegl_glCopyTexImage1D: - adrp x16, ___blue_glCore_glCopyTexImage1D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyTexImage1D@GOTPAGEOFF] +_bluegl_glCreateTextures: + adrp x16, ___blue_glCore_glCreateTextures@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreateTextures@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexStorage1D +.private_extern _bluegl_glTextureBuffer .align 2 -_bluegl_glTexStorage1D: - adrp x16, ___blue_glCore_glTexStorage1D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexStorage1D@GOTPAGEOFF] +_bluegl_glTextureBuffer: + adrp x16, ___blue_glCore_glTextureBuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureBuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3ui64ARB +.private_extern _bluegl_glTextureBufferRange .align 2 -_bluegl_glProgramUniform3ui64ARB: - adrp x16, ___blue_glCore_glProgramUniform3ui64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3ui64ARB@GOTPAGEOFF] +_bluegl_glTextureBufferRange: + adrp x16, ___blue_glCore_glTextureBufferRange@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureBufferRange@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureSubImage2D +.private_extern _bluegl_glTextureStorage1D .align 2 -_bluegl_glTextureSubImage2D: - adrp x16, ___blue_glCore_glTextureSubImage2D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureSubImage2D@GOTPAGEOFF] +_bluegl_glTextureStorage1D: + adrp x16, ___blue_glCore_glTextureStorage1D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureStorage1D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4bOES +.private_extern _bluegl_glTextureStorage2D .align 2 -_bluegl_glMultiTexCoord4bOES: - adrp x16, ___blue_glCore_glMultiTexCoord4bOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4bOES@GOTPAGEOFF] +_bluegl_glTextureStorage2D: + adrp x16, ___blue_glCore_glTextureStorage2D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureStorage2D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiDrawArraysIndirectCountARB +.private_extern _bluegl_glTextureStorage3D .align 2 -_bluegl_glMultiDrawArraysIndirectCountARB: - adrp x16, ___blue_glCore_glMultiDrawArraysIndirectCountARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiDrawArraysIndirectCountARB@GOTPAGEOFF] +_bluegl_glTextureStorage3D: + adrp x16, ___blue_glCore_glTextureStorage3D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureStorage3D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix3dvEXT +.private_extern _bluegl_glTextureStorage2DMultisample .align 2 -_bluegl_glProgramUniformMatrix3dvEXT: - adrp x16, ___blue_glCore_glProgramUniformMatrix3dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3dvEXT@GOTPAGEOFF] +_bluegl_glTextureStorage2DMultisample: + adrp x16, ___blue_glCore_glTextureStorage2DMultisample@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureStorage2DMultisample@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2s +.private_extern _bluegl_glTextureStorage3DMultisample .align 2 -_bluegl_glVertexAttrib2s: - adrp x16, ___blue_glCore_glVertexAttrib2s@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2s@GOTPAGEOFF] +_bluegl_glTextureStorage3DMultisample: + adrp x16, ___blue_glCore_glTextureStorage3DMultisample@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureStorage3DMultisample@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetDoublev +.private_extern _bluegl_glTextureSubImage1D .align 2 -_bluegl_glGetDoublev: - adrp x16, ___blue_glCore_glGetDoublev@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetDoublev@GOTPAGEOFF] +_bluegl_glTextureSubImage1D: + adrp x16, ___blue_glCore_glTextureSubImage1D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureSubImage1D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3svARB +.private_extern _bluegl_glTextureSubImage2D .align 2 -_bluegl_glVertexAttrib3svARB: - adrp x16, ___blue_glCore_glVertexAttrib3svARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3svARB@GOTPAGEOFF] +_bluegl_glTextureSubImage2D: + adrp x16, ___blue_glCore_glTextureSubImage2D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureSubImage2D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramNamedParameter4dvNV +.private_extern _bluegl_glTextureSubImage3D .align 2 -_bluegl_glProgramNamedParameter4dvNV: - adrp x16, ___blue_glCore_glProgramNamedParameter4dvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramNamedParameter4dvNV@GOTPAGEOFF] +_bluegl_glTextureSubImage3D: + adrp x16, ___blue_glCore_glTextureSubImage3D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureSubImage3D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureBufferRange +.private_extern _bluegl_glCompressedTextureSubImage1D .align 2 -_bluegl_glTextureBufferRange: - adrp x16, ___blue_glCore_glTextureBufferRange@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureBufferRange@GOTPAGEOFF] +_bluegl_glCompressedTextureSubImage1D: + adrp x16, ___blue_glCore_glCompressedTextureSubImage1D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTextureSubImage1D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferTextureFaceEXT +.private_extern _bluegl_glCompressedTextureSubImage2D .align 2 -_bluegl_glFramebufferTextureFaceEXT: - adrp x16, ___blue_glCore_glFramebufferTextureFaceEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferTextureFaceEXT@GOTPAGEOFF] +_bluegl_glCompressedTextureSubImage2D: + adrp x16, ___blue_glCore_glCompressedTextureSubImage2D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTextureSubImage2D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindBufferRange +.private_extern _bluegl_glCompressedTextureSubImage3D .align 2 -_bluegl_glBindBufferRange: - adrp x16, ___blue_glCore_glBindBufferRange@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindBufferRange@GOTPAGEOFF] +_bluegl_glCompressedTextureSubImage3D: + adrp x16, ___blue_glCore_glCompressedTextureSubImage3D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTextureSubImage3D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEnablei +.private_extern _bluegl_glCopyTextureSubImage1D .align 2 -_bluegl_glEnablei: - adrp x16, ___blue_glCore_glEnablei@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEnablei@GOTPAGEOFF] +_bluegl_glCopyTextureSubImage1D: + adrp x16, ___blue_glCore_glCopyTextureSubImage1D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyTextureSubImage1D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureParameterIuivEXT +.private_extern _bluegl_glCopyTextureSubImage2D .align 2 -_bluegl_glGetTextureParameterIuivEXT: - adrp x16, ___blue_glCore_glGetTextureParameterIuivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureParameterIuivEXT@GOTPAGEOFF] +_bluegl_glCopyTextureSubImage2D: + adrp x16, ___blue_glCore_glCopyTextureSubImage2D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyTextureSubImage2D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramInterfaceiv +.private_extern _bluegl_glCopyTextureSubImage3D .align 2 -_bluegl_glGetProgramInterfaceiv: - adrp x16, ___blue_glCore_glGetProgramInterfaceiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramInterfaceiv@GOTPAGEOFF] +_bluegl_glCopyTextureSubImage3D: + adrp x16, ___blue_glCore_glCopyTextureSubImage3D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyTextureSubImage3D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClientAttribDefaultEXT +.private_extern _bluegl_glTextureParameterf .align 2 -_bluegl_glClientAttribDefaultEXT: - adrp x16, ___blue_glCore_glClientAttribDefaultEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClientAttribDefaultEXT@GOTPAGEOFF] +_bluegl_glTextureParameterf: + adrp x16, ___blue_glCore_glTextureParameterf@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureParameterf@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL3ui64NV +.private_extern _bluegl_glTextureParameterfv .align 2 -_bluegl_glVertexAttribL3ui64NV: - adrp x16, ___blue_glCore_glVertexAttribL3ui64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL3ui64NV@GOTPAGEOFF] +_bluegl_glTextureParameterfv: + adrp x16, ___blue_glCore_glTextureParameterfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureParameterfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2dARB +.private_extern _bluegl_glTextureParameteri .align 2 -_bluegl_glWindowPos2dARB: - adrp x16, ___blue_glCore_glWindowPos2dARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2dARB@GOTPAGEOFF] +_bluegl_glTextureParameteri: + adrp x16, ___blue_glCore_glTextureParameteri@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureParameteri@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI2uiEXT +.private_extern _bluegl_glTextureParameterIiv .align 2 -_bluegl_glVertexAttribI2uiEXT: - adrp x16, ___blue_glCore_glVertexAttribI2uiEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI2uiEXT@GOTPAGEOFF] +_bluegl_glTextureParameterIiv: + adrp x16, ___blue_glCore_glTextureParameterIiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureParameterIiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindVertexBuffers +.private_extern _bluegl_glTextureParameterIuiv .align 2 -_bluegl_glBindVertexBuffers: - adrp x16, ___blue_glCore_glBindVertexBuffers@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindVertexBuffers@GOTPAGEOFF] +_bluegl_glTextureParameterIuiv: + adrp x16, ___blue_glCore_glTextureParameterIuiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureParameterIuiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix3x4fv +.private_extern _bluegl_glTextureParameteriv .align 2 -_bluegl_glProgramUniformMatrix3x4fv: - adrp x16, ___blue_glCore_glProgramUniformMatrix3x4fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3x4fv@GOTPAGEOFF] +_bluegl_glTextureParameteriv: + adrp x16, ___blue_glCore_glTextureParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTexLevelParameterxvOES +.private_extern _bluegl_glGenerateTextureMipmap .align 2 -_bluegl_glGetTexLevelParameterxvOES: - adrp x16, ___blue_glCore_glGetTexLevelParameterxvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTexLevelParameterxvOES@GOTPAGEOFF] +_bluegl_glGenerateTextureMipmap: + adrp x16, ___blue_glCore_glGenerateTextureMipmap@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenerateTextureMipmap@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribPointer +.private_extern _bluegl_glBindTextureUnit .align 2 -_bluegl_glVertexAttribPointer: - adrp x16, ___blue_glCore_glVertexAttribPointer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribPointer@GOTPAGEOFF] +_bluegl_glBindTextureUnit: + adrp x16, ___blue_glCore_glBindTextureUnit@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindTextureUnit@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureImage1DEXT +.private_extern _bluegl_glGetTextureImage .align 2 -_bluegl_glTextureImage1DEXT: - adrp x16, ___blue_glCore_glTextureImage1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureImage1DEXT@GOTPAGEOFF] +_bluegl_glGetTextureImage: + adrp x16, ___blue_glCore_glGetTextureImage@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureImage@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribs4dvNV +.private_extern _bluegl_glGetCompressedTextureImage .align 2 -_bluegl_glVertexAttribs4dvNV: - adrp x16, ___blue_glCore_glVertexAttribs4dvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribs4dvNV@GOTPAGEOFF] +_bluegl_glGetCompressedTextureImage: + adrp x16, ___blue_glCore_glGetCompressedTextureImage@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetCompressedTextureImage@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3svEXT +.private_extern _bluegl_glGetTextureLevelParameterfv .align 2 -_bluegl_glSecondaryColor3svEXT: - adrp x16, ___blue_glCore_glSecondaryColor3svEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3svEXT@GOTPAGEOFF] +_bluegl_glGetTextureLevelParameterfv: + adrp x16, ___blue_glCore_glGetTextureLevelParameterfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureLevelParameterfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetQueryivARB +.private_extern _bluegl_glGetTextureLevelParameteriv .align 2 -_bluegl_glGetQueryivARB: - adrp x16, ___blue_glCore_glGetQueryivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetQueryivARB@GOTPAGEOFF] +_bluegl_glGetTextureLevelParameteriv: + adrp x16, ___blue_glCore_glGetTextureLevelParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureLevelParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord4bOES +.private_extern _bluegl_glGetTextureParameterfv .align 2 -_bluegl_glTexCoord4bOES: - adrp x16, ___blue_glCore_glTexCoord4bOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord4bOES@GOTPAGEOFF] +_bluegl_glGetTextureParameterfv: + adrp x16, ___blue_glCore_glGetTextureParameterfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureParameterfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1fEXT +.private_extern _bluegl_glGetTextureParameterIiv .align 2 -_bluegl_glProgramUniform1fEXT: - adrp x16, ___blue_glCore_glProgramUniform1fEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1fEXT@GOTPAGEOFF] +_bluegl_glGetTextureParameterIiv: + adrp x16, ___blue_glCore_glGetTextureParameterIiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureParameterIiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexP2ui +.private_extern _bluegl_glGetTextureParameterIuiv .align 2 -_bluegl_glVertexP2ui: - adrp x16, ___blue_glCore_glVertexP2ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexP2ui@GOTPAGEOFF] +_bluegl_glGetTextureParameterIuiv: + adrp x16, ___blue_glCore_glGetTextureParameterIuiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureParameterIuiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSetInvariantEXT +.private_extern _bluegl_glGetTextureParameteriv .align 2 -_bluegl_glSetInvariantEXT: - adrp x16, ___blue_glCore_glSetInvariantEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSetInvariantEXT@GOTPAGEOFF] +_bluegl_glGetTextureParameteriv: + adrp x16, ___blue_glCore_glGetTextureParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glActiveShaderProgram +.private_extern _bluegl_glCreateVertexArrays .align 2 -_bluegl_glActiveShaderProgram: - adrp x16, ___blue_glCore_glActiveShaderProgram@GOTPAGE - ldr x16, [x16, ___blue_glCore_glActiveShaderProgram@GOTPAGEOFF] +_bluegl_glCreateVertexArrays: + adrp x16, ___blue_glCore_glCreateVertexArrays@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreateVertexArrays@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL1ui64NV +.private_extern _bluegl_glDisableVertexArrayAttrib .align 2 -_bluegl_glVertexAttribL1ui64NV: - adrp x16, ___blue_glCore_glVertexAttribL1ui64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL1ui64NV@GOTPAGEOFF] +_bluegl_glDisableVertexArrayAttrib: + adrp x16, ___blue_glCore_glDisableVertexArrayAttrib@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDisableVertexArrayAttrib@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVariantBooleanvEXT +.private_extern _bluegl_glEnableVertexArrayAttrib .align 2 -_bluegl_glGetVariantBooleanvEXT: - adrp x16, ___blue_glCore_glGetVariantBooleanvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVariantBooleanvEXT@GOTPAGEOFF] +_bluegl_glEnableVertexArrayAttrib: + adrp x16, ___blue_glCore_glEnableVertexArrayAttrib@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEnableVertexArrayAttrib@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glAreTexturesResidentEXT +.private_extern _bluegl_glVertexArrayElementBuffer .align 2 -_bluegl_glAreTexturesResidentEXT: - adrp x16, ___blue_glCore_glAreTexturesResidentEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glAreTexturesResidentEXT@GOTPAGEOFF] +_bluegl_glVertexArrayElementBuffer: + adrp x16, ___blue_glCore_glVertexArrayElementBuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayElementBuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixMultTranspose3x3fNV +.private_extern _bluegl_glVertexArrayVertexBuffer .align 2 -_bluegl_glMatrixMultTranspose3x3fNV: - adrp x16, ___blue_glCore_glMatrixMultTranspose3x3fNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixMultTranspose3x3fNV@GOTPAGEOFF] +_bluegl_glVertexArrayVertexBuffer: + adrp x16, ___blue_glCore_glVertexArrayVertexBuffer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayVertexBuffer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2f +.private_extern _bluegl_glVertexArrayVertexBuffers .align 2 -_bluegl_glProgramUniform2f: - adrp x16, ___blue_glCore_glProgramUniform2f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2f@GOTPAGEOFF] +_bluegl_glVertexArrayVertexBuffers: + adrp x16, ___blue_glCore_glVertexArrayVertexBuffers@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayVertexBuffers@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearNamedBufferDataEXT +.private_extern _bluegl_glVertexArrayAttribBinding .align 2 -_bluegl_glClearNamedBufferDataEXT: - adrp x16, ___blue_glCore_glClearNamedBufferDataEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearNamedBufferDataEXT@GOTPAGEOFF] +_bluegl_glVertexArrayAttribBinding: + adrp x16, ___blue_glCore_glVertexArrayAttribBinding@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayAttribBinding@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsOcclusionQueryNV +.private_extern _bluegl_glVertexArrayAttribFormat .align 2 -_bluegl_glIsOcclusionQueryNV: - adrp x16, ___blue_glCore_glIsOcclusionQueryNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsOcclusionQueryNV@GOTPAGEOFF] +_bluegl_glVertexArrayAttribFormat: + adrp x16, ___blue_glCore_glVertexArrayAttribFormat@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayAttribFormat@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI4bv +.private_extern _bluegl_glVertexArrayAttribIFormat .align 2 -_bluegl_glVertexAttribI4bv: - adrp x16, ___blue_glCore_glVertexAttribI4bv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI4bv@GOTPAGEOFF] +_bluegl_glVertexArrayAttribIFormat: + adrp x16, ___blue_glCore_glVertexArrayAttribIFormat@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayAttribIFormat@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord2xvOES +.private_extern _bluegl_glVertexArrayAttribLFormat .align 2 -_bluegl_glTexCoord2xvOES: - adrp x16, ___blue_glCore_glTexCoord2xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord2xvOES@GOTPAGEOFF] +_bluegl_glVertexArrayAttribLFormat: + adrp x16, ___blue_glCore_glVertexArrayAttribLFormat@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayAttribLFormat@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4Nubv +.private_extern _bluegl_glVertexArrayBindingDivisor .align 2 -_bluegl_glVertexAttrib4Nubv: - adrp x16, ___blue_glCore_glVertexAttrib4Nubv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4Nubv@GOTPAGEOFF] +_bluegl_glVertexArrayBindingDivisor: + adrp x16, ___blue_glCore_glVertexArrayBindingDivisor@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayBindingDivisor@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3hNV +.private_extern _bluegl_glGetVertexArrayiv .align 2 -_bluegl_glVertexAttrib3hNV: - adrp x16, ___blue_glCore_glVertexAttrib3hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3hNV@GOTPAGEOFF] +_bluegl_glGetVertexArrayiv: + adrp x16, ___blue_glCore_glGetVertexArrayiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexArrayiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2xvOES +.private_extern _bluegl_glGetVertexArrayIndexediv .align 2 -_bluegl_glMultiTexCoord2xvOES: - adrp x16, ___blue_glCore_glMultiTexCoord2xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2xvOES@GOTPAGEOFF] +_bluegl_glGetVertexArrayIndexediv: + adrp x16, ___blue_glCore_glGetVertexArrayIndexediv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexArrayIndexediv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferTextureEXT +.private_extern _bluegl_glGetVertexArrayIndexed64iv .align 2 -_bluegl_glFramebufferTextureEXT: - adrp x16, ___blue_glCore_glFramebufferTextureEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferTextureEXT@GOTPAGEOFF] +_bluegl_glGetVertexArrayIndexed64iv: + adrp x16, ___blue_glCore_glGetVertexArrayIndexed64iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexArrayIndexed64iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix3fv +.private_extern _bluegl_glCreateSamplers .align 2 -_bluegl_glProgramUniformMatrix3fv: - adrp x16, ___blue_glCore_glProgramUniformMatrix3fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3fv@GOTPAGEOFF] +_bluegl_glCreateSamplers: + adrp x16, ___blue_glCore_glCreateSamplers@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreateSamplers@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetInternalformatSampleivNV +.private_extern _bluegl_glCreateProgramPipelines .align 2 -_bluegl_glGetInternalformatSampleivNV: - adrp x16, ___blue_glCore_glGetInternalformatSampleivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetInternalformatSampleivNV@GOTPAGEOFF] +_bluegl_glCreateProgramPipelines: + adrp x16, ___blue_glCore_glCreateProgramPipelines@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreateProgramPipelines@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathSubCommandsNV +.private_extern _bluegl_glCreateQueries .align 2 -_bluegl_glPathSubCommandsNV: - adrp x16, ___blue_glCore_glPathSubCommandsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathSubCommandsNV@GOTPAGEOFF] +_bluegl_glCreateQueries: + adrp x16, ___blue_glCore_glCreateQueries@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreateQueries@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStencilStrokePathNV +.private_extern _bluegl_glGetQueryBufferObjecti64v .align 2 -_bluegl_glStencilStrokePathNV: - adrp x16, ___blue_glCore_glStencilStrokePathNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStencilStrokePathNV@GOTPAGEOFF] +_bluegl_glGetQueryBufferObjecti64v: + adrp x16, ___blue_glCore_glGetQueryBufferObjecti64v@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetQueryBufferObjecti64v@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathParameterfNV +.private_extern _bluegl_glGetQueryBufferObjectiv .align 2 -_bluegl_glPathParameterfNV: - adrp x16, ___blue_glCore_glPathParameterfNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathParameterfNV@GOTPAGEOFF] +_bluegl_glGetQueryBufferObjectiv: + adrp x16, ___blue_glCore_glGetQueryBufferObjectiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetQueryBufferObjectiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glActiveProgramEXT +.private_extern _bluegl_glGetQueryBufferObjectui64v .align 2 -_bluegl_glActiveProgramEXT: - adrp x16, ___blue_glCore_glActiveProgramEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glActiveProgramEXT@GOTPAGEOFF] +_bluegl_glGetQueryBufferObjectui64v: + adrp x16, ___blue_glCore_glGetQueryBufferObjectui64v@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetQueryBufferObjectui64v@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClampColorARB +.private_extern _bluegl_glGetQueryBufferObjectuiv .align 2 -_bluegl_glClampColorARB: - adrp x16, ___blue_glCore_glClampColorARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClampColorARB@GOTPAGEOFF] +_bluegl_glGetQueryBufferObjectuiv: + adrp x16, ___blue_glCore_glGetQueryBufferObjectuiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetQueryBufferObjectuiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI2uivEXT +.private_extern _bluegl_glMemoryBarrierByRegion .align 2 -_bluegl_glVertexAttribI2uivEXT: - adrp x16, ___blue_glCore_glVertexAttribI2uivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI2uivEXT@GOTPAGEOFF] +_bluegl_glMemoryBarrierByRegion: + adrp x16, ___blue_glCore_glMemoryBarrierByRegion@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMemoryBarrierByRegion@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL1ui64vARB +.private_extern _bluegl_glGetTextureSubImage .align 2 -_bluegl_glVertexAttribL1ui64vARB: - adrp x16, ___blue_glCore_glVertexAttribL1ui64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL1ui64vARB@GOTPAGEOFF] +_bluegl_glGetTextureSubImage: + adrp x16, ___blue_glCore_glGetTextureSubImage@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureSubImage@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glValidateProgram +.private_extern _bluegl_glGetCompressedTextureSubImage .align 2 -_bluegl_glValidateProgram: - adrp x16, ___blue_glCore_glValidateProgram@GOTPAGE - ldr x16, [x16, ___blue_glCore_glValidateProgram@GOTPAGEOFF] +_bluegl_glGetCompressedTextureSubImage: + adrp x16, ___blue_glCore_glGetCompressedTextureSubImage@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetCompressedTextureSubImage@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2xOES +.private_extern _bluegl_glGetGraphicsResetStatus .align 2 -_bluegl_glMultiTexCoord2xOES: - adrp x16, ___blue_glCore_glMultiTexCoord2xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2xOES@GOTPAGEOFF] +_bluegl_glGetGraphicsResetStatus: + adrp x16, ___blue_glCore_glGetGraphicsResetStatus@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetGraphicsResetStatus@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFogCoordf +.private_extern _bluegl_glGetnCompressedTexImage .align 2 -_bluegl_glFogCoordf: - adrp x16, ___blue_glCore_glFogCoordf@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFogCoordf@GOTPAGEOFF] +_bluegl_glGetnCompressedTexImage: + adrp x16, ___blue_glCore_glGetnCompressedTexImage@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnCompressedTexImage@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetError +.private_extern _bluegl_glGetnTexImage .align 2 -_bluegl_glGetError: - adrp x16, ___blue_glCore_glGetError@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetError@GOTPAGEOFF] +_bluegl_glGetnTexImage: + adrp x16, ___blue_glCore_glGetnTexImage@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnTexImage@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSpriteParameterfSGIX +.private_extern _bluegl_glGetnUniformdv .align 2 -_bluegl_glSpriteParameterfSGIX: - adrp x16, ___blue_glCore_glSpriteParameterfSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSpriteParameterfSGIX@GOTPAGEOFF] +_bluegl_glGetnUniformdv: + adrp x16, ___blue_glCore_glGetnUniformdv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnUniformdv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3dvNV +.private_extern _bluegl_glGetnUniformfv .align 2 -_bluegl_glVertexAttrib3dvNV: - adrp x16, ___blue_glCore_glVertexAttrib3dvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3dvNV@GOTPAGEOFF] +_bluegl_glGetnUniformfv: + adrp x16, ___blue_glCore_glGetnUniformfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnUniformfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3bOES +.private_extern _bluegl_glGetnUniformiv .align 2 -_bluegl_glMultiTexCoord3bOES: - adrp x16, ___blue_glCore_glMultiTexCoord3bOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3bOES@GOTPAGEOFF] +_bluegl_glGetnUniformiv: + adrp x16, ___blue_glCore_glGetnUniformiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnUniformiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTexParameterIuivEXT +.private_extern _bluegl_glGetnUniformuiv .align 2 -_bluegl_glGetTexParameterIuivEXT: - adrp x16, ___blue_glCore_glGetTexParameterIuivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTexParameterIuivEXT@GOTPAGEOFF] +_bluegl_glGetnUniformuiv: + adrp x16, ___blue_glCore_glGetnUniformuiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnUniformuiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIndexMaterialEXT +.private_extern _bluegl_glReadnPixels .align 2 -_bluegl_glIndexMaterialEXT: - adrp x16, ___blue_glCore_glIndexMaterialEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIndexMaterialEXT@GOTPAGEOFF] +_bluegl_glReadnPixels: + adrp x16, ___blue_glCore_glReadnPixels@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReadnPixels@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1iARB +.private_extern _bluegl_glTextureBarrier .align 2 -_bluegl_glUniform1iARB: - adrp x16, ___blue_glCore_glUniform1iARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1iARB@GOTPAGEOFF] +_bluegl_glTextureBarrier: + adrp x16, ___blue_glCore_glTextureBarrier@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureBarrier@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4NivARB +.private_extern _bluegl_glGetTextureHandleARB .align 2 -_bluegl_glVertexAttrib4NivARB: - adrp x16, ___blue_glCore_glVertexAttrib4NivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4NivARB@GOTPAGEOFF] +_bluegl_glGetTextureHandleARB: + adrp x16, ___blue_glCore_glGetTextureHandleARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureHandleARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureParameteri +.private_extern _bluegl_glGetTextureSamplerHandleARB .align 2 -_bluegl_glTextureParameteri: - adrp x16, ___blue_glCore_glTextureParameteri@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureParameteri@GOTPAGEOFF] +_bluegl_glGetTextureSamplerHandleARB: + adrp x16, ___blue_glCore_glGetTextureSamplerHandleARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureSamplerHandleARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3d +.private_extern _bluegl_glMakeTextureHandleResidentARB .align 2 -_bluegl_glSecondaryColor3d: - adrp x16, ___blue_glCore_glSecondaryColor3d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3d@GOTPAGEOFF] +_bluegl_glMakeTextureHandleResidentARB: + adrp x16, ___blue_glCore_glMakeTextureHandleResidentARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMakeTextureHandleResidentARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2sv +.private_extern _bluegl_glMakeTextureHandleNonResidentARB .align 2 -_bluegl_glWindowPos2sv: - adrp x16, ___blue_glCore_glWindowPos2sv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2sv@GOTPAGEOFF] +_bluegl_glMakeTextureHandleNonResidentARB: + adrp x16, ___blue_glCore_glMakeTextureHandleNonResidentARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMakeTextureHandleNonResidentARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawBuffersARB +.private_extern _bluegl_glGetImageHandleARB .align 2 -_bluegl_glDrawBuffersARB: - adrp x16, ___blue_glCore_glDrawBuffersARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawBuffersARB@GOTPAGEOFF] +_bluegl_glGetImageHandleARB: + adrp x16, ___blue_glCore_glGetImageHandleARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetImageHandleARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMultiTexParameterIuivEXT +.private_extern _bluegl_glMakeImageHandleResidentARB .align 2 -_bluegl_glGetMultiTexParameterIuivEXT: - adrp x16, ___blue_glCore_glGetMultiTexParameterIuivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMultiTexParameterIuivEXT@GOTPAGEOFF] +_bluegl_glMakeImageHandleResidentARB: + adrp x16, ___blue_glCore_glMakeImageHandleResidentARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMakeImageHandleResidentARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetConvolutionFilter +.private_extern _bluegl_glMakeImageHandleNonResidentARB .align 2 -_bluegl_glGetConvolutionFilter: - adrp x16, ___blue_glCore_glGetConvolutionFilter@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetConvolutionFilter@GOTPAGEOFF] +_bluegl_glMakeImageHandleNonResidentARB: + adrp x16, ___blue_glCore_glMakeImageHandleNonResidentARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMakeImageHandleNonResidentARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDisableVertexArrayAttrib +.private_extern _bluegl_glUniformHandleui64ARB .align 2 -_bluegl_glDisableVertexArrayAttrib: - adrp x16, ___blue_glCore_glDisableVertexArrayAttrib@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDisableVertexArrayAttrib@GOTPAGEOFF] +_bluegl_glUniformHandleui64ARB: + adrp x16, ___blue_glCore_glUniformHandleui64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformHandleui64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4i +.private_extern _bluegl_glUniformHandleui64vARB .align 2 -_bluegl_glProgramUniform4i: - adrp x16, ___blue_glCore_glProgramUniform4i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4i@GOTPAGEOFF] +_bluegl_glUniformHandleui64vARB: + adrp x16, ___blue_glCore_glUniformHandleui64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformHandleui64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCheckNamedFramebufferStatusEXT +.private_extern _bluegl_glProgramUniformHandleui64ARB .align 2 -_bluegl_glCheckNamedFramebufferStatusEXT: - adrp x16, ___blue_glCore_glCheckNamedFramebufferStatusEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCheckNamedFramebufferStatusEXT@GOTPAGEOFF] +_bluegl_glProgramUniformHandleui64ARB: + adrp x16, ___blue_glCore_glProgramUniformHandleui64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformHandleui64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3xOES +.private_extern _bluegl_glProgramUniformHandleui64vARB .align 2 -_bluegl_glMultiTexCoord3xOES: - adrp x16, ___blue_glCore_glMultiTexCoord3xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3xOES@GOTPAGEOFF] +_bluegl_glProgramUniformHandleui64vARB: + adrp x16, ___blue_glCore_glProgramUniformHandleui64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformHandleui64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawElementsInstancedEXT +.private_extern _bluegl_glIsTextureHandleResidentARB .align 2 -_bluegl_glDrawElementsInstancedEXT: - adrp x16, ___blue_glCore_glDrawElementsInstancedEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawElementsInstancedEXT@GOTPAGEOFF] +_bluegl_glIsTextureHandleResidentARB: + adrp x16, ___blue_glCore_glIsTextureHandleResidentARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsTextureHandleResidentARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColor4fNormal3fVertex3fvSUN +.private_extern _bluegl_glIsImageHandleResidentARB .align 2 -_bluegl_glColor4fNormal3fVertex3fvSUN: - adrp x16, ___blue_glCore_glColor4fNormal3fVertex3fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColor4fNormal3fVertex3fvSUN@GOTPAGEOFF] +_bluegl_glIsImageHandleResidentARB: + adrp x16, ___blue_glCore_glIsImageHandleResidentARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsImageHandleResidentARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsTransformFeedbackNV +.private_extern _bluegl_glVertexAttribL1ui64ARB .align 2 -_bluegl_glIsTransformFeedbackNV: - adrp x16, ___blue_glCore_glIsTransformFeedbackNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsTransformFeedbackNV@GOTPAGEOFF] +_bluegl_glVertexAttribL1ui64ARB: + adrp x16, ___blue_glCore_glVertexAttribL1ui64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL1ui64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawTransformFeedbackStreamInstanced +.private_extern _bluegl_glVertexAttribL1ui64vARB .align 2 -_bluegl_glDrawTransformFeedbackStreamInstanced: - adrp x16, ___blue_glCore_glDrawTransformFeedbackStreamInstanced@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawTransformFeedbackStreamInstanced@GOTPAGEOFF] +_bluegl_glVertexAttribL1ui64vARB: + adrp x16, ___blue_glCore_glVertexAttribL1ui64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL1ui64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMapNamedBufferEXT +.private_extern _bluegl_glGetVertexAttribLui64vARB .align 2 -_bluegl_glMapNamedBufferEXT: - adrp x16, ___blue_glCore_glMapNamedBufferEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMapNamedBufferEXT@GOTPAGEOFF] +_bluegl_glGetVertexAttribLui64vARB: + adrp x16, ___blue_glCore_glGetVertexAttribLui64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribLui64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayIndexOffsetEXT +.private_extern _bluegl_glCreateSyncFromCLeventARB .align 2 -_bluegl_glVertexArrayIndexOffsetEXT: - adrp x16, ___blue_glCore_glVertexArrayIndexOffsetEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayIndexOffsetEXT@GOTPAGEOFF] +_bluegl_glCreateSyncFromCLeventARB: + adrp x16, ___blue_glCore_glCreateSyncFromCLeventARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreateSyncFromCLeventARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPolygonMode +.private_extern _bluegl_glDispatchComputeGroupSizeARB .align 2 -_bluegl_glPolygonMode: - adrp x16, ___blue_glCore_glPolygonMode@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPolygonMode@GOTPAGEOFF] +_bluegl_glDispatchComputeGroupSizeARB: + adrp x16, ___blue_glCore_glDispatchComputeGroupSizeARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDispatchComputeGroupSizeARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetDetailTexFuncSGIS +.private_extern _bluegl_glDebugMessageControlARB .align 2 -_bluegl_glGetDetailTexFuncSGIS: - adrp x16, ___blue_glCore_glGetDetailTexFuncSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetDetailTexFuncSGIS@GOTPAGEOFF] +_bluegl_glDebugMessageControlARB: + adrp x16, ___blue_glCore_glDebugMessageControlARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDebugMessageControlARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2iv +.private_extern _bluegl_glDebugMessageInsertARB .align 2 -_bluegl_glMultiTexCoord2iv: - adrp x16, ___blue_glCore_glMultiTexCoord2iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2iv@GOTPAGEOFF] +_bluegl_glDebugMessageInsertARB: + adrp x16, ___blue_glCore_glDebugMessageInsertARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDebugMessageInsertARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetHistogramParameterfvEXT +.private_extern _bluegl_glDebugMessageCallbackARB .align 2 -_bluegl_glGetHistogramParameterfvEXT: - adrp x16, ___blue_glCore_glGetHistogramParameterfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetHistogramParameterfvEXT@GOTPAGEOFF] +_bluegl_glDebugMessageCallbackARB: + adrp x16, ___blue_glCore_glDebugMessageCallbackARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDebugMessageCallbackARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4fvEXT +.private_extern _bluegl_glGetDebugMessageLogARB .align 2 -_bluegl_glProgramUniform4fvEXT: - adrp x16, ___blue_glCore_glProgramUniform4fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4fvEXT@GOTPAGEOFF] +_bluegl_glGetDebugMessageLogARB: + adrp x16, ___blue_glCore_glGetDebugMessageLogARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetDebugMessageLogARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDetailTexFuncSGIS +.private_extern _bluegl_glBlendEquationiARB .align 2 -_bluegl_glDetailTexFuncSGIS: - adrp x16, ___blue_glCore_glDetailTexFuncSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDetailTexFuncSGIS@GOTPAGEOFF] +_bluegl_glBlendEquationiARB: + adrp x16, ___blue_glCore_glBlendEquationiARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendEquationiARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexParameterIivEXT +.private_extern _bluegl_glBlendEquationSeparateiARB .align 2 -_bluegl_glTexParameterIivEXT: - adrp x16, ___blue_glCore_glTexParameterIivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexParameterIivEXT@GOTPAGEOFF] +_bluegl_glBlendEquationSeparateiARB: + adrp x16, ___blue_glCore_glBlendEquationSeparateiARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendEquationSeparateiARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedFramebufferTextureLayerEXT +.private_extern _bluegl_glBlendFunciARB .align 2 -_bluegl_glNamedFramebufferTextureLayerEXT: - adrp x16, ___blue_glCore_glNamedFramebufferTextureLayerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedFramebufferTextureLayerEXT@GOTPAGEOFF] +_bluegl_glBlendFunciARB: + adrp x16, ___blue_glCore_glBlendFunciARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendFunciARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDisablei +.private_extern _bluegl_glBlendFuncSeparateiARB .align 2 -_bluegl_glDisablei: - adrp x16, ___blue_glCore_glDisablei@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDisablei@GOTPAGEOFF] +_bluegl_glBlendFuncSeparateiARB: + adrp x16, ___blue_glCore_glBlendFuncSeparateiARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendFuncSeparateiARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4fv +.private_extern _bluegl_glMultiDrawArraysIndirectCountARB .align 2 -_bluegl_glUniform4fv: - adrp x16, ___blue_glCore_glUniform4fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4fv@GOTPAGEOFF] +_bluegl_glMultiDrawArraysIndirectCountARB: + adrp x16, ___blue_glCore_glMultiDrawArraysIndirectCountARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiDrawArraysIndirectCountARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1hNV +.private_extern _bluegl_glMultiDrawElementsIndirectCountARB .align 2 -_bluegl_glVertexAttrib1hNV: - adrp x16, ___blue_glCore_glVertexAttrib1hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1hNV@GOTPAGEOFF] +_bluegl_glMultiDrawElementsIndirectCountARB: + adrp x16, ___blue_glCore_glMultiDrawElementsIndirectCountARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiDrawElementsIndirectCountARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWeightsvARB +.private_extern _bluegl_glGetGraphicsResetStatusARB .align 2 -_bluegl_glWeightsvARB: - adrp x16, ___blue_glCore_glWeightsvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWeightsvARB@GOTPAGEOFF] +_bluegl_glGetGraphicsResetStatusARB: + adrp x16, ___blue_glCore_glGetGraphicsResetStatusARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetGraphicsResetStatusARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSampleMaskIndexedNV +.private_extern _bluegl_glGetnTexImageARB .align 2 -_bluegl_glSampleMaskIndexedNV: - adrp x16, ___blue_glCore_glSampleMaskIndexedNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSampleMaskIndexedNV@GOTPAGEOFF] +_bluegl_glGetnTexImageARB: + adrp x16, ___blue_glCore_glGetnTexImageARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnTexImageARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4dvARB +.private_extern _bluegl_glReadnPixelsARB .align 2 -_bluegl_glVertexAttrib4dvARB: - adrp x16, ___blue_glCore_glVertexAttrib4dvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4dvARB@GOTPAGEOFF] +_bluegl_glReadnPixelsARB: + adrp x16, ___blue_glCore_glReadnPixelsARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReadnPixelsARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBeginFragmentShaderATI +.private_extern _bluegl_glGetnCompressedTexImageARB .align 2 -_bluegl_glBeginFragmentShaderATI: - adrp x16, ___blue_glCore_glBeginFragmentShaderATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBeginFragmentShaderATI@GOTPAGEOFF] +_bluegl_glGetnCompressedTexImageARB: + adrp x16, ___blue_glCore_glGetnCompressedTexImageARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnCompressedTexImageARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedProgramLocalParameterI4ivEXT +.private_extern _bluegl_glGetnUniformfvARB .align 2 -_bluegl_glNamedProgramLocalParameterI4ivEXT: - adrp x16, ___blue_glCore_glNamedProgramLocalParameterI4ivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParameterI4ivEXT@GOTPAGEOFF] +_bluegl_glGetnUniformfvARB: + adrp x16, ___blue_glCore_glGetnUniformfvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnUniformfvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetConvolutionParameteriv +.private_extern _bluegl_glGetnUniformivARB .align 2 -_bluegl_glGetConvolutionParameteriv: - adrp x16, ___blue_glCore_glGetConvolutionParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetConvolutionParameteriv@GOTPAGEOFF] +_bluegl_glGetnUniformivARB: + adrp x16, ___blue_glCore_glGetnUniformivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnUniformivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClipControl +.private_extern _bluegl_glGetnUniformuivARB .align 2 -_bluegl_glClipControl: - adrp x16, ___blue_glCore_glClipControl@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClipControl@GOTPAGEOFF] +_bluegl_glGetnUniformuivARB: + adrp x16, ___blue_glCore_glGetnUniformuivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnUniformuivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBinormal3fEXT +.private_extern _bluegl_glGetnUniformdvARB .align 2 -_bluegl_glBinormal3fEXT: - adrp x16, ___blue_glCore_glBinormal3fEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBinormal3fEXT@GOTPAGEOFF] +_bluegl_glGetnUniformdvARB: + adrp x16, ___blue_glCore_glGetnUniformdvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnUniformdvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColor4ubVertex2fSUN +.private_extern _bluegl_glMinSampleShadingARB .align 2 -_bluegl_glColor4ubVertex2fSUN: - adrp x16, ___blue_glCore_glColor4ubVertex2fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColor4ubVertex2fSUN@GOTPAGEOFF] +_bluegl_glMinSampleShadingARB: + adrp x16, ___blue_glCore_glMinSampleShadingARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMinSampleShadingARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTexImage3D +.private_extern _bluegl_glNamedStringARB .align 2 -_bluegl_glCompressedTexImage3D: - adrp x16, ___blue_glCore_glCompressedTexImage3D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTexImage3D@GOTPAGEOFF] +_bluegl_glNamedStringARB: + adrp x16, ___blue_glCore_glNamedStringARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedStringARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureSamplerHandleARB +.private_extern _bluegl_glDeleteNamedStringARB .align 2 -_bluegl_glGetTextureSamplerHandleARB: - adrp x16, ___blue_glCore_glGetTextureSamplerHandleARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureSamplerHandleARB@GOTPAGEOFF] +_bluegl_glDeleteNamedStringARB: + adrp x16, ___blue_glCore_glDeleteNamedStringARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteNamedStringARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3uiv +.private_extern _bluegl_glCompileShaderIncludeARB .align 2 -_bluegl_glUniform3uiv: - adrp x16, ___blue_glCore_glUniform3uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3uiv@GOTPAGEOFF] +_bluegl_glCompileShaderIncludeARB: + adrp x16, ___blue_glCore_glCompileShaderIncludeARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompileShaderIncludeARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribPointerv +.private_extern _bluegl_glIsNamedStringARB .align 2 -_bluegl_glGetVertexAttribPointerv: - adrp x16, ___blue_glCore_glGetVertexAttribPointerv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribPointerv@GOTPAGEOFF] +_bluegl_glIsNamedStringARB: + adrp x16, ___blue_glCore_glIsNamedStringARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsNamedStringARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenBuffers +.private_extern _bluegl_glGetNamedStringARB .align 2 -_bluegl_glGenBuffers: - adrp x16, ___blue_glCore_glGenBuffers@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenBuffers@GOTPAGEOFF] +_bluegl_glGetNamedStringARB: + adrp x16, ___blue_glCore_glGetNamedStringARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedStringARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3dvARB +.private_extern _bluegl_glGetNamedStringivARB .align 2 -_bluegl_glVertexAttrib3dvARB: - adrp x16, ___blue_glCore_glVertexAttrib3dvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3dvARB@GOTPAGEOFF] +_bluegl_glGetNamedStringivARB: + adrp x16, ___blue_glCore_glGetNamedStringivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedStringivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFlushVertexArrayRangeNV +.private_extern _bluegl_glBufferPageCommitmentARB .align 2 -_bluegl_glFlushVertexArrayRangeNV: - adrp x16, ___blue_glCore_glFlushVertexArrayRangeNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFlushVertexArrayRangeNV@GOTPAGEOFF] +_bluegl_glBufferPageCommitmentARB: + adrp x16, ___blue_glCore_glBufferPageCommitmentARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBufferPageCommitmentARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramNamedParameterdvNV +.private_extern _bluegl_glNamedBufferPageCommitmentEXT .align 2 -_bluegl_glGetProgramNamedParameterdvNV: - adrp x16, ___blue_glCore_glGetProgramNamedParameterdvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramNamedParameterdvNV@GOTPAGEOFF] +_bluegl_glNamedBufferPageCommitmentEXT: + adrp x16, ___blue_glCore_glNamedBufferPageCommitmentEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedBufferPageCommitmentEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glConvolutionParameterf +.private_extern _bluegl_glNamedBufferPageCommitmentARB .align 2 -_bluegl_glConvolutionParameterf: - adrp x16, ___blue_glCore_glConvolutionParameterf@GOTPAGE - ldr x16, [x16, ___blue_glCore_glConvolutionParameterf@GOTPAGEOFF] +_bluegl_glNamedBufferPageCommitmentARB: + adrp x16, ___blue_glCore_glNamedBufferPageCommitmentARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedBufferPageCommitmentARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertex2bOES +.private_extern _bluegl_glTexPageCommitmentARB .align 2 -_bluegl_glVertex2bOES: - adrp x16, ___blue_glCore_glVertex2bOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertex2bOES@GOTPAGEOFF] +_bluegl_glTexPageCommitmentARB: + adrp x16, ___blue_glCore_glTexPageCommitmentARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexPageCommitmentARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetObjectPtrLabel +.private_extern _bluegl_glClientActiveTexture .align 2 -_bluegl_glGetObjectPtrLabel: - adrp x16, ___blue_glCore_glGetObjectPtrLabel@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetObjectPtrLabel@GOTPAGEOFF] +_bluegl_glClientActiveTexture: + adrp x16, ___blue_glCore_glClientActiveTexture@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClientActiveTexture@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBeginTransformFeedbackNV +.private_extern _bluegl_glMultiTexCoord1d .align 2 -_bluegl_glBeginTransformFeedbackNV: - adrp x16, ___blue_glCore_glBeginTransformFeedbackNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBeginTransformFeedbackNV@GOTPAGEOFF] +_bluegl_glMultiTexCoord1d: + adrp x16, ___blue_glCore_glMultiTexCoord1d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureSubImage +.private_extern _bluegl_glMultiTexCoord1dv .align 2 -_bluegl_glGetTextureSubImage: - adrp x16, ___blue_glCore_glGetTextureSubImage@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureSubImage@GOTPAGEOFF] +_bluegl_glMultiTexCoord1dv: + adrp x16, ___blue_glCore_glMultiTexCoord1dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFramebufferAttachmentParameterivEXT +.private_extern _bluegl_glMultiTexCoord1f .align 2 -_bluegl_glGetFramebufferAttachmentParameterivEXT: - adrp x16, ___blue_glCore_glGetFramebufferAttachmentParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFramebufferAttachmentParameterivEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoord1f: + adrp x16, ___blue_glCore_glMultiTexCoord1f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetInteger64v +.private_extern _bluegl_glMultiTexCoord1fv .align 2 -_bluegl_glGetInteger64v: - adrp x16, ___blue_glCore_glGetInteger64v@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetInteger64v@GOTPAGEOFF] +_bluegl_glMultiTexCoord1fv: + adrp x16, ___blue_glCore_glMultiTexCoord1fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetUniformLocation +.private_extern _bluegl_glMultiTexCoord1i .align 2 -_bluegl_glGetUniformLocation: - adrp x16, ___blue_glCore_glGetUniformLocation@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetUniformLocation@GOTPAGEOFF] +_bluegl_glMultiTexCoord1i: + adrp x16, ___blue_glCore_glMultiTexCoord1i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2fv +.private_extern _bluegl_glMultiTexCoord1iv .align 2 -_bluegl_glMultiTexCoord2fv: - adrp x16, ___blue_glCore_glMultiTexCoord2fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2fv@GOTPAGEOFF] +_bluegl_glMultiTexCoord1iv: + adrp x16, ___blue_glCore_glMultiTexCoord1iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2uiv +.private_extern _bluegl_glMultiTexCoord1s .align 2 -_bluegl_glProgramUniform2uiv: - adrp x16, ___blue_glCore_glProgramUniform2uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2uiv@GOTPAGEOFF] +_bluegl_glMultiTexCoord1s: + adrp x16, ___blue_glCore_glMultiTexCoord1s@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1s@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTexParameterIuiv +.private_extern _bluegl_glMultiTexCoord1sv .align 2 -_bluegl_glGetTexParameterIuiv: - adrp x16, ___blue_glCore_glGetTexParameterIuiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTexParameterIuiv@GOTPAGEOFF] +_bluegl_glMultiTexCoord1sv: + adrp x16, ___blue_glCore_glMultiTexCoord1sv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1sv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI4ui +.private_extern _bluegl_glMultiTexCoord2d .align 2 -_bluegl_glVertexAttribI4ui: - adrp x16, ___blue_glCore_glVertexAttribI4ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI4ui@GOTPAGEOFF] +_bluegl_glMultiTexCoord2d: + adrp x16, ___blue_glCore_glMultiTexCoord2d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexGenxvOES +.private_extern _bluegl_glMultiTexCoord2dv .align 2 -_bluegl_glTexGenxvOES: - adrp x16, ___blue_glCore_glTexGenxvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexGenxvOES@GOTPAGEOFF] +_bluegl_glMultiTexCoord2dv: + adrp x16, ___blue_glCore_glMultiTexCoord2dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertex4bOES +.private_extern _bluegl_glMultiTexCoord2f .align 2 -_bluegl_glVertex4bOES: - adrp x16, ___blue_glCore_glVertex4bOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertex4bOES@GOTPAGEOFF] +_bluegl_glMultiTexCoord2f: + adrp x16, ___blue_glCore_glMultiTexCoord2f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyTexSubImage2DEXT +.private_extern _bluegl_glMultiTexCoord2fv .align 2 -_bluegl_glCopyTexSubImage2DEXT: - adrp x16, ___blue_glCore_glCopyTexSubImage2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyTexSubImage2DEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoord2fv: + adrp x16, ___blue_glCore_glMultiTexCoord2fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawBuffersATI +.private_extern _bluegl_glMultiTexCoord2i .align 2 -_bluegl_glDrawBuffersATI: - adrp x16, ___blue_glCore_glDrawBuffersATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawBuffersATI@GOTPAGEOFF] +_bluegl_glMultiTexCoord2i: + adrp x16, ___blue_glCore_glMultiTexCoord2i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathGlyphsNV +.private_extern _bluegl_glMultiTexCoord2iv .align 2 -_bluegl_glPathGlyphsNV: - adrp x16, ___blue_glCore_glPathGlyphsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathGlyphsNV@GOTPAGEOFF] +_bluegl_glMultiTexCoord2iv: + adrp x16, ___blue_glCore_glMultiTexCoord2iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixIndexuivARB +.private_extern _bluegl_glMultiTexCoord2s .align 2 -_bluegl_glMatrixIndexuivARB: - adrp x16, ___blue_glCore_glMatrixIndexuivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixIndexuivARB@GOTPAGEOFF] +_bluegl_glMultiTexCoord2s: + adrp x16, ___blue_glCore_glMultiTexCoord2s@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2s@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedProgramLocalParameterI4uiEXT +.private_extern _bluegl_glMultiTexCoord2sv .align 2 -_bluegl_glNamedProgramLocalParameterI4uiEXT: - adrp x16, ___blue_glCore_glNamedProgramLocalParameterI4uiEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParameterI4uiEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoord2sv: + adrp x16, ___blue_glCore_glMultiTexCoord2sv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2sv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2iv +.private_extern _bluegl_glMultiTexCoord3d .align 2 -_bluegl_glWindowPos2iv: - adrp x16, ___blue_glCore_glWindowPos2iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2iv@GOTPAGEOFF] +_bluegl_glMultiTexCoord3d: + adrp x16, ___blue_glCore_glMultiTexCoord3d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLightModelxOES +.private_extern _bluegl_glMultiTexCoord3dv .align 2 -_bluegl_glLightModelxOES: - adrp x16, ___blue_glCore_glLightModelxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLightModelxOES@GOTPAGEOFF] +_bluegl_glMultiTexCoord3dv: + adrp x16, ___blue_glCore_glMultiTexCoord3dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindFragmentShaderATI +.private_extern _bluegl_glMultiTexCoord3f .align 2 -_bluegl_glBindFragmentShaderATI: - adrp x16, ___blue_glCore_glBindFragmentShaderATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindFragmentShaderATI@GOTPAGEOFF] +_bluegl_glMultiTexCoord3f: + adrp x16, ___blue_glCore_glMultiTexCoord3f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glInvalidateTexSubImage +.private_extern _bluegl_glMultiTexCoord3fv .align 2 -_bluegl_glInvalidateTexSubImage: - adrp x16, ___blue_glCore_glInvalidateTexSubImage@GOTPAGE - ldr x16, [x16, ___blue_glCore_glInvalidateTexSubImage@GOTPAGEOFF] +_bluegl_glMultiTexCoord3fv: + adrp x16, ___blue_glCore_glMultiTexCoord3fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4sARB +.private_extern _bluegl_glMultiTexCoord3i .align 2 -_bluegl_glVertexAttrib4sARB: - adrp x16, ___blue_glCore_glVertexAttrib4sARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4sARB@GOTPAGEOFF] +_bluegl_glMultiTexCoord3i: + adrp x16, ___blue_glCore_glMultiTexCoord3i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramiv +.private_extern _bluegl_glMultiTexCoord3iv .align 2 -_bluegl_glGetProgramiv: - adrp x16, ___blue_glCore_glGetProgramiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramiv@GOTPAGEOFF] +_bluegl_glMultiTexCoord3iv: + adrp x16, ___blue_glCore_glMultiTexCoord3iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVideoCaptureStreamivNV +.private_extern _bluegl_glMultiTexCoord3s .align 2 -_bluegl_glGetVideoCaptureStreamivNV: - adrp x16, ___blue_glCore_glGetVideoCaptureStreamivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVideoCaptureStreamivNV@GOTPAGEOFF] +_bluegl_glMultiTexCoord3s: + adrp x16, ___blue_glCore_glMultiTexCoord3s@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3s@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureParameterfvEXT +.private_extern _bluegl_glMultiTexCoord3sv .align 2 -_bluegl_glTextureParameterfvEXT: - adrp x16, ___blue_glCore_glTextureParameterfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureParameterfvEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoord3sv: + adrp x16, ___blue_glCore_glMultiTexCoord3sv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3sv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPNTrianglesfATI +.private_extern _bluegl_glMultiTexCoord4d .align 2 -_bluegl_glPNTrianglesfATI: - adrp x16, ___blue_glCore_glPNTrianglesfATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPNTrianglesfATI@GOTPAGEOFF] +_bluegl_glMultiTexCoord4d: + adrp x16, ___blue_glCore_glMultiTexCoord4d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCheckNamedFramebufferStatus +.private_extern _bluegl_glMultiTexCoord4dv .align 2 -_bluegl_glCheckNamedFramebufferStatus: - adrp x16, ___blue_glCore_glCheckNamedFramebufferStatus@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCheckNamedFramebufferStatus@GOTPAGEOFF] +_bluegl_glMultiTexCoord4dv: + adrp x16, ___blue_glCore_glMultiTexCoord4dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4uiEXT +.private_extern _bluegl_glMultiTexCoord4f .align 2 -_bluegl_glUniform4uiEXT: - adrp x16, ___blue_glCore_glUniform4uiEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4uiEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoord4f: + adrp x16, ___blue_glCore_glMultiTexCoord4f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2sv +.private_extern _bluegl_glMultiTexCoord4fv .align 2 -_bluegl_glVertexAttrib2sv: - adrp x16, ___blue_glCore_glVertexAttrib2sv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2sv@GOTPAGEOFF] +_bluegl_glMultiTexCoord4fv: + adrp x16, ___blue_glCore_glMultiTexCoord4fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearBufferData +.private_extern _bluegl_glMultiTexCoord4i .align 2 -_bluegl_glClearBufferData: - adrp x16, ___blue_glCore_glClearBufferData@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearBufferData@GOTPAGEOFF] +_bluegl_glMultiTexCoord4i: + adrp x16, ___blue_glCore_glMultiTexCoord4i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glShaderSourceARB +.private_extern _bluegl_glMultiTexCoord4iv .align 2 -_bluegl_glShaderSourceARB: - adrp x16, ___blue_glCore_glShaderSourceARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glShaderSourceARB@GOTPAGEOFF] +_bluegl_glMultiTexCoord4iv: + adrp x16, ___blue_glCore_glMultiTexCoord4iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glObjectPurgeableAPPLE +.private_extern _bluegl_glMultiTexCoord4s .align 2 -_bluegl_glObjectPurgeableAPPLE: - adrp x16, ___blue_glCore_glObjectPurgeableAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glObjectPurgeableAPPLE@GOTPAGEOFF] +_bluegl_glMultiTexCoord4s: + adrp x16, ___blue_glCore_glMultiTexCoord4s@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4s@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2iEXT +.private_extern _bluegl_glMultiTexCoord4sv .align 2 -_bluegl_glProgramUniform2iEXT: - adrp x16, ___blue_glCore_glProgramUniform2iEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2iEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoord4sv: + adrp x16, ___blue_glCore_glMultiTexCoord4sv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4sv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetStringi +.private_extern _bluegl_glLoadTransposeMatrixf .align 2 -_bluegl_glGetStringi: - adrp x16, ___blue_glCore_glGetStringi@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetStringi@GOTPAGEOFF] +_bluegl_glLoadTransposeMatrixf: + adrp x16, ___blue_glCore_glLoadTransposeMatrixf@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLoadTransposeMatrixf@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexFilterFuncSGIS +.private_extern _bluegl_glLoadTransposeMatrixd .align 2 -_bluegl_glTexFilterFuncSGIS: - adrp x16, ___blue_glCore_glTexFilterFuncSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexFilterFuncSGIS@GOTPAGEOFF] +_bluegl_glLoadTransposeMatrixd: + adrp x16, ___blue_glCore_glLoadTransposeMatrixd@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLoadTransposeMatrixd@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayVertexAttribLOffsetEXT +.private_extern _bluegl_glMultTransposeMatrixf .align 2 -_bluegl_glVertexArrayVertexAttribLOffsetEXT: - adrp x16, ___blue_glCore_glVertexArrayVertexAttribLOffsetEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayVertexAttribLOffsetEXT@GOTPAGEOFF] +_bluegl_glMultTransposeMatrixf: + adrp x16, ___blue_glCore_glMultTransposeMatrixf@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultTransposeMatrixf@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramLocalParametersI4uivNV +.private_extern _bluegl_glMultTransposeMatrixd .align 2 -_bluegl_glProgramLocalParametersI4uivNV: - adrp x16, ___blue_glCore_glProgramLocalParametersI4uivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramLocalParametersI4uivNV@GOTPAGEOFF] +_bluegl_glMultTransposeMatrixd: + adrp x16, ___blue_glCore_glMultTransposeMatrixd@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultTransposeMatrixd@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetHistogramEXT +.private_extern _bluegl_glFogCoordf .align 2 -_bluegl_glGetHistogramEXT: - adrp x16, ___blue_glCore_glGetHistogramEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetHistogramEXT@GOTPAGEOFF] +_bluegl_glFogCoordf: + adrp x16, ___blue_glCore_glFogCoordf@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFogCoordf@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedBufferPageCommitmentARB +.private_extern _bluegl_glFogCoordfv .align 2 -_bluegl_glNamedBufferPageCommitmentARB: - adrp x16, ___blue_glCore_glNamedBufferPageCommitmentARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedBufferPageCommitmentARB@GOTPAGEOFF] +_bluegl_glFogCoordfv: + adrp x16, ___blue_glCore_glFogCoordfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFogCoordfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMakeBufferResidentNV +.private_extern _bluegl_glFogCoordd .align 2 -_bluegl_glMakeBufferResidentNV: - adrp x16, ___blue_glCore_glMakeBufferResidentNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMakeBufferResidentNV@GOTPAGEOFF] +_bluegl_glFogCoordd: + adrp x16, ___blue_glCore_glFogCoordd@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFogCoordd@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedFramebufferDrawBuffers +.private_extern _bluegl_glFogCoorddv .align 2 -_bluegl_glNamedFramebufferDrawBuffers: - adrp x16, ___blue_glCore_glNamedFramebufferDrawBuffers@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedFramebufferDrawBuffers@GOTPAGEOFF] +_bluegl_glFogCoorddv: + adrp x16, ___blue_glCore_glFogCoorddv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFogCoorddv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexPointerListIBM +.private_extern _bluegl_glFogCoordPointer .align 2 -_bluegl_glVertexPointerListIBM: - adrp x16, ___blue_glCore_glVertexPointerListIBM@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexPointerListIBM@GOTPAGEOFF] +_bluegl_glFogCoordPointer: + adrp x16, ___blue_glCore_glFogCoordPointer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFogCoordPointer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetUniformui64vNV +.private_extern _bluegl_glSecondaryColor3b .align 2 -_bluegl_glGetUniformui64vNV: - adrp x16, ___blue_glCore_glGetUniformui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetUniformui64vNV@GOTPAGEOFF] +_bluegl_glSecondaryColor3b: + adrp x16, ___blue_glCore_glSecondaryColor3b@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3b@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearDepthfOES +.private_extern _bluegl_glSecondaryColor3bv .align 2 -_bluegl_glClearDepthfOES: - adrp x16, ___blue_glCore_glClearDepthfOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearDepthfOES@GOTPAGEOFF] +_bluegl_glSecondaryColor3bv: + adrp x16, ___blue_glCore_glSecondaryColor3bv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3bv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2iMESA +.private_extern _bluegl_glSecondaryColor3d .align 2 -_bluegl_glWindowPos2iMESA: - adrp x16, ___blue_glCore_glWindowPos2iMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2iMESA@GOTPAGEOFF] +_bluegl_glSecondaryColor3d: + adrp x16, ___blue_glCore_glSecondaryColor3d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyTextureImage1DEXT +.private_extern _bluegl_glSecondaryColor3dv .align 2 -_bluegl_glCopyTextureImage1DEXT: - adrp x16, ___blue_glCore_glCopyTextureImage1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyTextureImage1DEXT@GOTPAGEOFF] +_bluegl_glSecondaryColor3dv: + adrp x16, ___blue_glCore_glSecondaryColor3dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBeginOcclusionQueryNV +.private_extern _bluegl_glSecondaryColor3f .align 2 -_bluegl_glBeginOcclusionQueryNV: - adrp x16, ___blue_glCore_glBeginOcclusionQueryNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBeginOcclusionQueryNV@GOTPAGEOFF] +_bluegl_glSecondaryColor3f: + adrp x16, ___blue_glCore_glSecondaryColor3f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLoadTransposeMatrixf +.private_extern _bluegl_glSecondaryColor3fv .align 2 -_bluegl_glLoadTransposeMatrixf: - adrp x16, ___blue_glCore_glLoadTransposeMatrixf@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLoadTransposeMatrixf@GOTPAGEOFF] +_bluegl_glSecondaryColor3fv: + adrp x16, ___blue_glCore_glSecondaryColor3fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedRenderbufferStorageMultisampleEXT +.private_extern _bluegl_glSecondaryColor3i .align 2 -_bluegl_glNamedRenderbufferStorageMultisampleEXT: - adrp x16, ___blue_glCore_glNamedRenderbufferStorageMultisampleEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedRenderbufferStorageMultisampleEXT@GOTPAGEOFF] +_bluegl_glSecondaryColor3i: + adrp x16, ___blue_glCore_glSecondaryColor3i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormalStream3fATI +.private_extern _bluegl_glSecondaryColor3iv .align 2 -_bluegl_glNormalStream3fATI: - adrp x16, ___blue_glCore_glNormalStream3fATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormalStream3fATI@GOTPAGEOFF] +_bluegl_glSecondaryColor3iv: + adrp x16, ___blue_glCore_glSecondaryColor3iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormal3hNV +.private_extern _bluegl_glSecondaryColor3s .align 2 -_bluegl_glNormal3hNV: - adrp x16, ___blue_glCore_glNormal3hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormal3hNV@GOTPAGEOFF] +_bluegl_glSecondaryColor3s: + adrp x16, ___blue_glCore_glSecondaryColor3s@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3s@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUseProgram +.private_extern _bluegl_glSecondaryColor3sv .align 2 -_bluegl_glUseProgram: - adrp x16, ___blue_glCore_glUseProgram@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUseProgram@GOTPAGEOFF] +_bluegl_glSecondaryColor3sv: + adrp x16, ___blue_glCore_glSecondaryColor3sv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3sv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPushGroupMarkerEXT +.private_extern _bluegl_glSecondaryColor3ub .align 2 -_bluegl_glPushGroupMarkerEXT: - adrp x16, ___blue_glCore_glPushGroupMarkerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPushGroupMarkerEXT@GOTPAGEOFF] +_bluegl_glSecondaryColor3ub: + adrp x16, ___blue_glCore_glSecondaryColor3ub@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3ub@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexSubImage2DEXT +.private_extern _bluegl_glSecondaryColor3ubv .align 2 -_bluegl_glMultiTexSubImage2DEXT: - adrp x16, ___blue_glCore_glMultiTexSubImage2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexSubImage2DEXT@GOTPAGEOFF] +_bluegl_glSecondaryColor3ubv: + adrp x16, ___blue_glCore_glSecondaryColor3ubv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3ubv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayRangeNV +.private_extern _bluegl_glSecondaryColor3ui .align 2 -_bluegl_glVertexArrayRangeNV: - adrp x16, ___blue_glCore_glVertexArrayRangeNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayRangeNV@GOTPAGEOFF] +_bluegl_glSecondaryColor3ui: + adrp x16, ___blue_glCore_glSecondaryColor3ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMultiTexLevelParameterivEXT +.private_extern _bluegl_glSecondaryColor3uiv .align 2 -_bluegl_glGetMultiTexLevelParameterivEXT: - adrp x16, ___blue_glCore_glGetMultiTexLevelParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMultiTexLevelParameterivEXT@GOTPAGEOFF] +_bluegl_glSecondaryColor3uiv: + adrp x16, ___blue_glCore_glSecondaryColor3uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiDrawArraysEXT +.private_extern _bluegl_glSecondaryColor3us .align 2 -_bluegl_glMultiDrawArraysEXT: - adrp x16, ___blue_glCore_glMultiDrawArraysEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiDrawArraysEXT@GOTPAGEOFF] +_bluegl_glSecondaryColor3us: + adrp x16, ___blue_glCore_glSecondaryColor3us@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3us@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL4ui64NV +.private_extern _bluegl_glSecondaryColor3usv .align 2 -_bluegl_glVertexAttribL4ui64NV: - adrp x16, ___blue_glCore_glVertexAttribL4ui64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL4ui64NV@GOTPAGEOFF] +_bluegl_glSecondaryColor3usv: + adrp x16, ___blue_glCore_glSecondaryColor3usv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3usv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4Nub +.private_extern _bluegl_glSecondaryColorPointer .align 2 -_bluegl_glVertexAttrib4Nub: - adrp x16, ___blue_glCore_glVertexAttrib4Nub@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4Nub@GOTPAGEOFF] +_bluegl_glSecondaryColorPointer: + adrp x16, ___blue_glCore_glSecondaryColorPointer@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColorPointer@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFogCoordhNV +.private_extern _bluegl_glWindowPos2d .align 2 -_bluegl_glFogCoordhNV: - adrp x16, ___blue_glCore_glFogCoordhNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFogCoordhNV@GOTPAGEOFF] +_bluegl_glWindowPos2d: + adrp x16, ___blue_glCore_glWindowPos2d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI3ui +.private_extern _bluegl_glWindowPos2dv .align 2 -_bluegl_glVertexAttribI3ui: - adrp x16, ___blue_glCore_glVertexAttribI3ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI3ui@GOTPAGEOFF] +_bluegl_glWindowPos2dv: + adrp x16, ___blue_glCore_glWindowPos2dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexImage3DMultisampleCoverageNV +.private_extern _bluegl_glWindowPos2f .align 2 -_bluegl_glTexImage3DMultisampleCoverageNV: - adrp x16, ___blue_glCore_glTexImage3DMultisampleCoverageNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexImage3DMultisampleCoverageNV@GOTPAGEOFF] +_bluegl_glWindowPos2f: + adrp x16, ___blue_glCore_glWindowPos2f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetUniformBufferSizeEXT +.private_extern _bluegl_glWindowPos2fv .align 2 -_bluegl_glGetUniformBufferSizeEXT: - adrp x16, ___blue_glCore_glGetUniformBufferSizeEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetUniformBufferSizeEXT@GOTPAGEOFF] +_bluegl_glWindowPos2fv: + adrp x16, ___blue_glCore_glWindowPos2fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompileCommandListNV +.private_extern _bluegl_glWindowPos2i .align 2 -_bluegl_glCompileCommandListNV: - adrp x16, ___blue_glCore_glCompileCommandListNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompileCommandListNV@GOTPAGEOFF] +_bluegl_glWindowPos2i: + adrp x16, ___blue_glCore_glWindowPos2i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayVertexAttribBindingEXT +.private_extern _bluegl_glWindowPos2iv .align 2 -_bluegl_glVertexArrayVertexAttribBindingEXT: - adrp x16, ___blue_glCore_glVertexArrayVertexAttribBindingEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayVertexAttribBindingEXT@GOTPAGEOFF] +_bluegl_glWindowPos2iv: + adrp x16, ___blue_glCore_glWindowPos2iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendEquation +.private_extern _bluegl_glWindowPos2s .align 2 -_bluegl_glBlendEquation: - adrp x16, ___blue_glCore_glBlendEquation@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendEquation@GOTPAGEOFF] +_bluegl_glWindowPos2s: + adrp x16, ___blue_glCore_glWindowPos2s@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2s@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBinormal3dvEXT +.private_extern _bluegl_glWindowPos2sv .align 2 -_bluegl_glBinormal3dvEXT: - adrp x16, ___blue_glCore_glBinormal3dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBinormal3dvEXT@GOTPAGEOFF] +_bluegl_glWindowPos2sv: + adrp x16, ___blue_glCore_glWindowPos2sv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2sv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexFormatNV +.private_extern _bluegl_glWindowPos3d .align 2 -_bluegl_glVertexFormatNV: - adrp x16, ___blue_glCore_glVertexFormatNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexFormatNV@GOTPAGEOFF] +_bluegl_glWindowPos3d: + adrp x16, ___blue_glCore_glWindowPos3d@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3d@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4fv +.private_extern _bluegl_glWindowPos3dv .align 2 -_bluegl_glProgramUniform4fv: - adrp x16, ___blue_glCore_glProgramUniform4fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4fv@GOTPAGEOFF] +_bluegl_glWindowPos3dv: + adrp x16, ___blue_glCore_glWindowPos3dv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3dv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureStorage2DMultisample +.private_extern _bluegl_glWindowPos3f .align 2 -_bluegl_glTextureStorage2DMultisample: - adrp x16, ___blue_glCore_glTextureStorage2DMultisample@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureStorage2DMultisample@GOTPAGEOFF] +_bluegl_glWindowPos3f: + adrp x16, ___blue_glCore_glWindowPos3f@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3f@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3uiEXT +.private_extern _bluegl_glWindowPos3fv .align 2 -_bluegl_glProgramUniform3uiEXT: - adrp x16, ___blue_glCore_glProgramUniform3uiEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3uiEXT@GOTPAGEOFF] +_bluegl_glWindowPos3fv: + adrp x16, ___blue_glCore_glWindowPos3fv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3fv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferDrawBufferEXT +.private_extern _bluegl_glWindowPos3i .align 2 -_bluegl_glFramebufferDrawBufferEXT: - adrp x16, ___blue_glCore_glFramebufferDrawBufferEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferDrawBufferEXT@GOTPAGEOFF] +_bluegl_glWindowPos3i: + adrp x16, ___blue_glCore_glWindowPos3i@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3i@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreateTextures +.private_extern _bluegl_glWindowPos3iv .align 2 -_bluegl_glCreateTextures: - adrp x16, ___blue_glCore_glCreateTextures@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreateTextures@GOTPAGEOFF] +_bluegl_glWindowPos3iv: + adrp x16, ___blue_glCore_glWindowPos3iv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3iv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixPopEXT +.private_extern _bluegl_glWindowPos3s .align 2 -_bluegl_glMatrixPopEXT: - adrp x16, ___blue_glCore_glMatrixPopEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixPopEXT@GOTPAGEOFF] +_bluegl_glWindowPos3s: + adrp x16, ___blue_glCore_glWindowPos3s@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3s@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformui64vNV +.private_extern _bluegl_glWindowPos3sv .align 2 -_bluegl_glProgramUniformui64vNV: - adrp x16, ___blue_glCore_glProgramUniformui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformui64vNV@GOTPAGEOFF] +_bluegl_glWindowPos3sv: + adrp x16, ___blue_glCore_glWindowPos3sv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3sv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferTexture2D +.private_extern _bluegl_glVertexP2ui .align 2 -_bluegl_glFramebufferTexture2D: - adrp x16, ___blue_glCore_glFramebufferTexture2D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferTexture2D@GOTPAGEOFF] +_bluegl_glVertexP2ui: + adrp x16, ___blue_glCore_glVertexP2ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexP2ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetAttribLocation +.private_extern _bluegl_glVertexP2uiv .align 2 -_bluegl_glGetAttribLocation: - adrp x16, ___blue_glCore_glGetAttribLocation@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetAttribLocation@GOTPAGEOFF] +_bluegl_glVertexP2uiv: + adrp x16, ___blue_glCore_glVertexP2uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexP2uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2fARB +.private_extern _bluegl_glVertexP3ui .align 2 -_bluegl_glUniform2fARB: - adrp x16, ___blue_glCore_glUniform2fARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2fARB@GOTPAGEOFF] +_bluegl_glVertexP3ui: + adrp x16, ___blue_glCore_glVertexP3ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexP3ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDisableVertexArrayAttribEXT +.private_extern _bluegl_glVertexP3uiv .align 2 -_bluegl_glDisableVertexArrayAttribEXT: - adrp x16, ___blue_glCore_glDisableVertexArrayAttribEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDisableVertexArrayAttribEXT@GOTPAGEOFF] +_bluegl_glVertexP3uiv: + adrp x16, ___blue_glCore_glVertexP3uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexP3uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexStorage2D +.private_extern _bluegl_glVertexP4ui .align 2 -_bluegl_glTexStorage2D: - adrp x16, ___blue_glCore_glTexStorage2D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexStorage2D@GOTPAGEOFF] +_bluegl_glVertexP4ui: + adrp x16, ___blue_glCore_glVertexP4ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexP4ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI1iEXT +.private_extern _bluegl_glVertexP4uiv .align 2 -_bluegl_glVertexAttribI1iEXT: - adrp x16, ___blue_glCore_glVertexAttribI1iEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI1iEXT@GOTPAGEOFF] +_bluegl_glVertexP4uiv: + adrp x16, ___blue_glCore_glVertexP4uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexP4uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4ui +.private_extern _bluegl_glTexCoordP1ui .align 2 -_bluegl_glUniform4ui: - adrp x16, ___blue_glCore_glUniform4ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4ui@GOTPAGEOFF] +_bluegl_glTexCoordP1ui: + adrp x16, ___blue_glCore_glTexCoordP1ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoordP1ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoordP1uiv +.private_extern _bluegl_glTexCoordP1uiv .align 2 -_bluegl_glMultiTexCoordP1uiv: - adrp x16, ___blue_glCore_glMultiTexCoordP1uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoordP1uiv@GOTPAGEOFF] +_bluegl_glTexCoordP1uiv: + adrp x16, ___blue_glCore_glTexCoordP1uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoordP1uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedProgramLocalParametersI4ivEXT +.private_extern _bluegl_glTexCoordP2ui .align 2 -_bluegl_glNamedProgramLocalParametersI4ivEXT: - adrp x16, ___blue_glCore_glNamedProgramLocalParametersI4ivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParametersI4ivEXT@GOTPAGEOFF] +_bluegl_glTexCoordP2ui: + adrp x16, ___blue_glCore_glTexCoordP2ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoordP2ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glImageTransformParameteriHP +.private_extern _bluegl_glTexCoordP2uiv .align 2 -_bluegl_glImageTransformParameteriHP: - adrp x16, ___blue_glCore_glImageTransformParameteriHP@GOTPAGE - ldr x16, [x16, ___blue_glCore_glImageTransformParameteriHP@GOTPAGEOFF] +_bluegl_glTexCoordP2uiv: + adrp x16, ___blue_glCore_glTexCoordP2uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoordP2uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsBuffer +.private_extern _bluegl_glTexCoordP3ui .align 2 -_bluegl_glIsBuffer: - adrp x16, ___blue_glCore_glIsBuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsBuffer@GOTPAGEOFF] +_bluegl_glTexCoordP3ui: + adrp x16, ___blue_glCore_glTexCoordP3ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoordP3ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFogCoorddv +.private_extern _bluegl_glTexCoordP3uiv .align 2 -_bluegl_glFogCoorddv: - adrp x16, ___blue_glCore_glFogCoorddv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFogCoorddv@GOTPAGEOFF] +_bluegl_glTexCoordP3uiv: + adrp x16, ___blue_glCore_glTexCoordP3uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoordP3uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClientActiveTexture +.private_extern _bluegl_glTexCoordP4ui .align 2 -_bluegl_glClientActiveTexture: - adrp x16, ___blue_glCore_glClientActiveTexture@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClientActiveTexture@GOTPAGEOFF] +_bluegl_glTexCoordP4ui: + adrp x16, ___blue_glCore_glTexCoordP4ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoordP4ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformHandleui64vNV +.private_extern _bluegl_glTexCoordP4uiv .align 2 -_bluegl_glUniformHandleui64vNV: - adrp x16, ___blue_glCore_glUniformHandleui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformHandleui64vNV@GOTPAGEOFF] +_bluegl_glTexCoordP4uiv: + adrp x16, ___blue_glCore_glTexCoordP4uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoordP4uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3fARB +.private_extern _bluegl_glMultiTexCoordP1ui .align 2 -_bluegl_glWindowPos3fARB: - adrp x16, ___blue_glCore_glWindowPos3fARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3fARB@GOTPAGEOFF] +_bluegl_glMultiTexCoordP1ui: + adrp x16, ___blue_glCore_glMultiTexCoordP1ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoordP1ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribfvARB +.private_extern _bluegl_glMultiTexCoordP1uiv .align 2 -_bluegl_glGetVertexAttribfvARB: - adrp x16, ___blue_glCore_glGetVertexAttribfvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribfvARB@GOTPAGEOFF] +_bluegl_glMultiTexCoordP1uiv: + adrp x16, ___blue_glCore_glMultiTexCoordP1uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoordP1uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSamplerParameterfv +.private_extern _bluegl_glMultiTexCoordP2ui .align 2 -_bluegl_glSamplerParameterfv: - adrp x16, ___blue_glCore_glSamplerParameterfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSamplerParameterfv@GOTPAGEOFF] +_bluegl_glMultiTexCoordP2ui: + adrp x16, ___blue_glCore_glMultiTexCoordP2ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoordP2ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4NsvARB +.private_extern _bluegl_glMultiTexCoordP2uiv .align 2 -_bluegl_glVertexAttrib4NsvARB: - adrp x16, ___blue_glCore_glVertexAttrib4NsvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4NsvARB@GOTPAGEOFF] +_bluegl_glMultiTexCoordP2uiv: + adrp x16, ___blue_glCore_glMultiTexCoordP2uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoordP2uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2ivEXT +.private_extern _bluegl_glMultiTexCoordP3ui .align 2 -_bluegl_glProgramUniform2ivEXT: - adrp x16, ___blue_glCore_glProgramUniform2ivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2ivEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoordP3ui: + adrp x16, ___blue_glCore_glMultiTexCoordP3ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoordP3ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedProgramStringEXT +.private_extern _bluegl_glMultiTexCoordP3uiv .align 2 -_bluegl_glNamedProgramStringEXT: - adrp x16, ___blue_glCore_glNamedProgramStringEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedProgramStringEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoordP3uiv: + adrp x16, ___blue_glCore_glMultiTexCoordP3uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoordP3uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPointSize +.private_extern _bluegl_glMultiTexCoordP4ui .align 2 -_bluegl_glPointSize: - adrp x16, ___blue_glCore_glPointSize@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPointSize@GOTPAGEOFF] +_bluegl_glMultiTexCoordP4ui: + adrp x16, ___blue_glCore_glMultiTexCoordP4ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoordP4ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord4hNV +.private_extern _bluegl_glMultiTexCoordP4uiv .align 2 -_bluegl_glTexCoord4hNV: - adrp x16, ___blue_glCore_glTexCoord4hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord4hNV@GOTPAGEOFF] +_bluegl_glMultiTexCoordP4uiv: + adrp x16, ___blue_glCore_glMultiTexCoordP4uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoordP4uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetIntegerIndexedvEXT +.private_extern _bluegl_glNormalP3ui .align 2 -_bluegl_glGetIntegerIndexedvEXT: - adrp x16, ___blue_glCore_glGetIntegerIndexedvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetIntegerIndexedvEXT@GOTPAGEOFF] +_bluegl_glNormalP3ui: + adrp x16, ___blue_glCore_glNormalP3ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormalP3ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPrimitiveBoundingBoxARB +.private_extern _bluegl_glNormalP3uiv .align 2 -_bluegl_glPrimitiveBoundingBoxARB: - adrp x16, ___blue_glCore_glPrimitiveBoundingBoxARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPrimitiveBoundingBoxARB@GOTPAGEOFF] +_bluegl_glNormalP3uiv: + adrp x16, ___blue_glCore_glNormalP3uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormalP3uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDebugMessageInsert +.private_extern _bluegl_glColorP3ui .align 2 -_bluegl_glDebugMessageInsert: - adrp x16, ___blue_glCore_glDebugMessageInsert@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDebugMessageInsert@GOTPAGEOFF] +_bluegl_glColorP3ui: + adrp x16, ___blue_glCore_glColorP3ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorP3ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3bvOES +.private_extern _bluegl_glColorP3uiv .align 2 -_bluegl_glMultiTexCoord3bvOES: - adrp x16, ___blue_glCore_glMultiTexCoord3bvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3bvOES@GOTPAGEOFF] +_bluegl_glColorP3uiv: + adrp x16, ___blue_glCore_glColorP3uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorP3uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL1i64vNV +.private_extern _bluegl_glColorP4ui .align 2 -_bluegl_glVertexAttribL1i64vNV: - adrp x16, ___blue_glCore_glVertexAttribL1i64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL1i64vNV@GOTPAGEOFF] +_bluegl_glColorP4ui: + adrp x16, ___blue_glCore_glColorP4ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorP4ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureBuffer +.private_extern _bluegl_glColorP4uiv .align 2 -_bluegl_glTextureBuffer: - adrp x16, ___blue_glCore_glTextureBuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureBuffer@GOTPAGEOFF] +_bluegl_glColorP4uiv: + adrp x16, ___blue_glCore_glColorP4uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorP4uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureParameterIiv +.private_extern _bluegl_glSecondaryColorP3ui .align 2 -_bluegl_glGetTextureParameterIiv: - adrp x16, ___blue_glCore_glGetTextureParameterIiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureParameterIiv@GOTPAGEOFF] +_bluegl_glSecondaryColorP3ui: + adrp x16, ___blue_glCore_glSecondaryColorP3ui@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColorP3ui@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferTexture +.private_extern _bluegl_glSecondaryColorP3uiv .align 2 -_bluegl_glFramebufferTexture: - adrp x16, ___blue_glCore_glFramebufferTexture@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferTexture@GOTPAGEOFF] +_bluegl_glSecondaryColorP3uiv: + adrp x16, ___blue_glCore_glSecondaryColorP3uiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColorP3uiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramivARB +.private_extern _bluegl_glGetnMapdv .align 2 -_bluegl_glGetProgramivARB: - adrp x16, ___blue_glCore_glGetProgramivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramivARB@GOTPAGEOFF] +_bluegl_glGetnMapdv: + adrp x16, ___blue_glCore_glGetnMapdv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnMapdv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribPointerARB +.private_extern _bluegl_glGetnMapfv .align 2 -_bluegl_glVertexAttribPointerARB: - adrp x16, ___blue_glCore_glVertexAttribPointerARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribPointerARB@GOTPAGEOFF] +_bluegl_glGetnMapfv: + adrp x16, ___blue_glCore_glGetnMapfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnMapfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsCommandListNV +.private_extern _bluegl_glGetnMapiv .align 2 -_bluegl_glIsCommandListNV: - adrp x16, ___blue_glCore_glIsCommandListNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsCommandListNV@GOTPAGEOFF] +_bluegl_glGetnMapiv: + adrp x16, ___blue_glCore_glGetnMapiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnMapiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1uivEXT +.private_extern _bluegl_glGetnPixelMapfv .align 2 -_bluegl_glUniform1uivEXT: - adrp x16, ___blue_glCore_glUniform1uivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1uivEXT@GOTPAGEOFF] +_bluegl_glGetnPixelMapfv: + adrp x16, ___blue_glCore_glGetnPixelMapfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnPixelMapfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2i +.private_extern _bluegl_glGetnPixelMapuiv .align 2 -_bluegl_glProgramUniform2i: - adrp x16, ___blue_glCore_glProgramUniform2i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2i@GOTPAGEOFF] +_bluegl_glGetnPixelMapuiv: + adrp x16, ___blue_glCore_glGetnPixelMapuiv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnPixelMapuiv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribDivisorARB +.private_extern _bluegl_glGetnPixelMapusv .align 2 -_bluegl_glVertexAttribDivisorARB: - adrp x16, ___blue_glCore_glVertexAttribDivisorARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribDivisorARB@GOTPAGEOFF] +_bluegl_glGetnPixelMapusv: + adrp x16, ___blue_glCore_glGetnPixelMapusv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnPixelMapusv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribPointervARB +.private_extern _bluegl_glGetnPolygonStipple .align 2 -_bluegl_glGetVertexAttribPointervARB: - adrp x16, ___blue_glCore_glGetVertexAttribPointervARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribPointervARB@GOTPAGEOFF] +_bluegl_glGetnPolygonStipple: + adrp x16, ___blue_glCore_glGetnPolygonStipple@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnPolygonStipple@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureImage2DMultisampleNV +.private_extern _bluegl_glGetnColorTable .align 2 -_bluegl_glTextureImage2DMultisampleNV: - adrp x16, ___blue_glCore_glTextureImage2DMultisampleNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureImage2DMultisampleNV@GOTPAGEOFF] +_bluegl_glGetnColorTable: + adrp x16, ___blue_glCore_glGetnColorTable@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnColorTable@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVariantPointervEXT +.private_extern _bluegl_glGetnConvolutionFilter .align 2 -_bluegl_glGetVariantPointervEXT: - adrp x16, ___blue_glCore_glGetVariantPointervEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVariantPointervEXT@GOTPAGEOFF] +_bluegl_glGetnConvolutionFilter: + adrp x16, ___blue_glCore_glGetnConvolutionFilter@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnConvolutionFilter@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCheckFramebufferStatus +.private_extern _bluegl_glGetnSeparableFilter .align 2 -_bluegl_glCheckFramebufferStatus: - adrp x16, ___blue_glCore_glCheckFramebufferStatus@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCheckFramebufferStatus@GOTPAGEOFF] +_bluegl_glGetnSeparableFilter: + adrp x16, ___blue_glCore_glGetnSeparableFilter@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnSeparableFilter@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMap1xOES +.private_extern _bluegl_glGetnHistogram .align 2 -_bluegl_glMap1xOES: - adrp x16, ___blue_glCore_glMap1xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMap1xOES@GOTPAGEOFF] +_bluegl_glGetnHistogram: + adrp x16, ___blue_glCore_glGetnHistogram@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnHistogram@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindSampler +.private_extern _bluegl_glGetnMinmax .align 2 -_bluegl_glBindSampler: - adrp x16, ___blue_glCore_glBindSampler@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindSampler@GOTPAGEOFF] +_bluegl_glGetnMinmax: + adrp x16, ___blue_glCore_glGetnMinmax@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnMinmax@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathGlyphIndexRangeNV +.private_extern _bluegl_glPrimitiveBoundingBoxARB .align 2 -_bluegl_glPathGlyphIndexRangeNV: - adrp x16, ___blue_glCore_glPathGlyphIndexRangeNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathGlyphIndexRangeNV@GOTPAGEOFF] +_bluegl_glPrimitiveBoundingBoxARB: + adrp x16, ___blue_glCore_glPrimitiveBoundingBoxARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPrimitiveBoundingBoxARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramEnvParameters4fvEXT +.private_extern _bluegl_glClampColorARB .align 2 -_bluegl_glProgramEnvParameters4fvEXT: - adrp x16, ___blue_glCore_glProgramEnvParameters4fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramEnvParameters4fvEXT@GOTPAGEOFF] +_bluegl_glClampColorARB: + adrp x16, ___blue_glCore_glClampColorARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClampColorARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3fNV +.private_extern _bluegl_glDrawBuffersARB .align 2 -_bluegl_glVertexAttrib3fNV: - adrp x16, ___blue_glCore_glVertexAttrib3fNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3fNV@GOTPAGEOFF] +_bluegl_glDrawBuffersARB: + adrp x16, ___blue_glCore_glDrawBuffersARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawBuffersARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindBuffersBase +.private_extern _bluegl_glDrawArraysInstancedARB .align 2 -_bluegl_glBindBuffersBase: - adrp x16, ___blue_glCore_glBindBuffersBase@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindBuffersBase@GOTPAGEOFF] +_bluegl_glDrawArraysInstancedARB: + adrp x16, ___blue_glCore_glDrawArraysInstancedARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawArraysInstancedARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedProgramLocalParameterIivEXT +.private_extern _bluegl_glDrawElementsInstancedARB .align 2 -_bluegl_glGetNamedProgramLocalParameterIivEXT: - adrp x16, ___blue_glCore_glGetNamedProgramLocalParameterIivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedProgramLocalParameterIivEXT@GOTPAGEOFF] +_bluegl_glDrawElementsInstancedARB: + adrp x16, ___blue_glCore_glDrawElementsInstancedARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawElementsInstancedARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4d +.private_extern _bluegl_glProgramStringARB .align 2 -_bluegl_glProgramUniform4d: - adrp x16, ___blue_glCore_glProgramUniform4d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4d@GOTPAGEOFF] +_bluegl_glProgramStringARB: + adrp x16, ___blue_glCore_glProgramStringARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramStringARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3f +.private_extern _bluegl_glBindProgramARB .align 2 -_bluegl_glMultiTexCoord3f: - adrp x16, ___blue_glCore_glMultiTexCoord3f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3f@GOTPAGEOFF] +_bluegl_glBindProgramARB: + adrp x16, ___blue_glCore_glBindProgramARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindProgramARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteProgram +.private_extern _bluegl_glDeleteProgramsARB .align 2 -_bluegl_glDeleteProgram: - adrp x16, ___blue_glCore_glDeleteProgram@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteProgram@GOTPAGEOFF] +_bluegl_glDeleteProgramsARB: + adrp x16, ___blue_glCore_glDeleteProgramsARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteProgramsARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeuiVertex3fvSUN +.private_extern _bluegl_glGenProgramsARB .align 2 -_bluegl_glReplacementCodeuiVertex3fvSUN: - adrp x16, ___blue_glCore_glReplacementCodeuiVertex3fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeuiVertex3fvSUN@GOTPAGEOFF] +_bluegl_glGenProgramsARB: + adrp x16, ___blue_glCore_glGenProgramsARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenProgramsARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMapNamedBufferRange +.private_extern _bluegl_glProgramEnvParameter4dARB .align 2 -_bluegl_glMapNamedBufferRange: - adrp x16, ___blue_glCore_glMapNamedBufferRange@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMapNamedBufferRange@GOTPAGEOFF] +_bluegl_glProgramEnvParameter4dARB: + adrp x16, ___blue_glCore_glProgramEnvParameter4dARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramEnvParameter4dARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferSampleLocationsfvARB +.private_extern _bluegl_glProgramEnvParameter4dvARB .align 2 -_bluegl_glFramebufferSampleLocationsfvARB: - adrp x16, ___blue_glCore_glFramebufferSampleLocationsfvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferSampleLocationsfvARB@GOTPAGEOFF] +_bluegl_glProgramEnvParameter4dvARB: + adrp x16, ___blue_glCore_glProgramEnvParameter4dvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramEnvParameter4dvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1dvARB +.private_extern _bluegl_glProgramEnvParameter4fARB .align 2 -_bluegl_glMultiTexCoord1dvARB: - adrp x16, ___blue_glCore_glMultiTexCoord1dvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1dvARB@GOTPAGEOFF] +_bluegl_glProgramEnvParameter4fARB: + adrp x16, ___blue_glCore_glProgramEnvParameter4fARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramEnvParameter4fARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearBufferuiv +.private_extern _bluegl_glProgramEnvParameter4fvARB .align 2 -_bluegl_glClearBufferuiv: - adrp x16, ___blue_glCore_glClearBufferuiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearBufferuiv@GOTPAGEOFF] +_bluegl_glProgramEnvParameter4fvARB: + adrp x16, ___blue_glCore_glProgramEnvParameter4fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramEnvParameter4fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawRangeElementsEXT +.private_extern _bluegl_glProgramLocalParameter4dARB .align 2 -_bluegl_glDrawRangeElementsEXT: - adrp x16, ___blue_glCore_glDrawRangeElementsEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawRangeElementsEXT@GOTPAGEOFF] +_bluegl_glProgramLocalParameter4dARB: + adrp x16, ___blue_glCore_glProgramLocalParameter4dARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramLocalParameter4dARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1hvNV +.private_extern _bluegl_glProgramLocalParameter4dvARB .align 2 -_bluegl_glVertexAttrib1hvNV: - adrp x16, ___blue_glCore_glVertexAttrib1hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1hvNV@GOTPAGEOFF] +_bluegl_glProgramLocalParameter4dvARB: + adrp x16, ___blue_glCore_glProgramLocalParameter4dvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramLocalParameter4dvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3bv +.private_extern _bluegl_glProgramLocalParameter4fARB .align 2 -_bluegl_glSecondaryColor3bv: - adrp x16, ___blue_glCore_glSecondaryColor3bv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3bv@GOTPAGEOFF] +_bluegl_glProgramLocalParameter4fARB: + adrp x16, ___blue_glCore_glProgramLocalParameter4fARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramLocalParameter4fARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVDPAUMapSurfacesNV +.private_extern _bluegl_glProgramLocalParameter4fvARB .align 2 -_bluegl_glVDPAUMapSurfacesNV: - adrp x16, ___blue_glCore_glVDPAUMapSurfacesNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVDPAUMapSurfacesNV@GOTPAGEOFF] +_bluegl_glProgramLocalParameter4fvARB: + adrp x16, ___blue_glCore_glProgramLocalParameter4fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramLocalParameter4fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStencilMask +.private_extern _bluegl_glGetProgramEnvParameterdvARB .align 2 -_bluegl_glStencilMask: - adrp x16, ___blue_glCore_glStencilMask@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStencilMask@GOTPAGEOFF] +_bluegl_glGetProgramEnvParameterdvARB: + adrp x16, ___blue_glCore_glGetProgramEnvParameterdvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramEnvParameterdvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramResourceLocationIndex +.private_extern _bluegl_glGetProgramEnvParameterfvARB .align 2 -_bluegl_glGetProgramResourceLocationIndex: - adrp x16, ___blue_glCore_glGetProgramResourceLocationIndex@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramResourceLocationIndex@GOTPAGEOFF] +_bluegl_glGetProgramEnvParameterfvARB: + adrp x16, ___blue_glCore_glGetProgramEnvParameterfvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramEnvParameterfvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetIntegerui64i_vNV +.private_extern _bluegl_glGetProgramLocalParameterdvARB .align 2 -_bluegl_glGetIntegerui64i_vNV: - adrp x16, ___blue_glCore_glGetIntegerui64i_vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetIntegerui64i_vNV@GOTPAGEOFF] +_bluegl_glGetProgramLocalParameterdvARB: + adrp x16, ___blue_glCore_glGetProgramLocalParameterdvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramLocalParameterdvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureLevelParameterfvEXT +.private_extern _bluegl_glGetProgramLocalParameterfvARB .align 2 -_bluegl_glGetTextureLevelParameterfvEXT: - adrp x16, ___blue_glCore_glGetTextureLevelParameterfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureLevelParameterfvEXT@GOTPAGEOFF] +_bluegl_glGetProgramLocalParameterfvARB: + adrp x16, ___blue_glCore_glGetProgramLocalParameterfvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramLocalParameterfvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3sv +.private_extern _bluegl_glGetProgramivARB .align 2 -_bluegl_glWindowPos3sv: - adrp x16, ___blue_glCore_glWindowPos3sv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3sv@GOTPAGEOFF] +_bluegl_glGetProgramivARB: + adrp x16, ___blue_glCore_glGetProgramivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendEquationSeparatei +.private_extern _bluegl_glGetProgramStringARB .align 2 -_bluegl_glBlendEquationSeparatei: - adrp x16, ___blue_glCore_glBlendEquationSeparatei@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendEquationSeparatei@GOTPAGEOFF] +_bluegl_glGetProgramStringARB: + adrp x16, ___blue_glCore_glGetProgramStringARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramStringARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetInfoLogARB +.private_extern _bluegl_glIsProgramARB .align 2 -_bluegl_glGetInfoLogARB: - adrp x16, ___blue_glCore_glGetInfoLogARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetInfoLogARB@GOTPAGEOFF] +_bluegl_glIsProgramARB: + adrp x16, ___blue_glCore_glIsProgramARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsProgramARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramNamedParameter4fNV +.private_extern _bluegl_glProgramParameteriARB .align 2 -_bluegl_glProgramNamedParameter4fNV: - adrp x16, ___blue_glCore_glProgramNamedParameter4fNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramNamedParameter4fNV@GOTPAGEOFF] +_bluegl_glProgramParameteriARB: + adrp x16, ___blue_glCore_glProgramParameteriARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramParameteriARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramParameter4fNV +.private_extern _bluegl_glFramebufferTextureARB .align 2 -_bluegl_glProgramParameter4fNV: - adrp x16, ___blue_glCore_glProgramParameter4fNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramParameter4fNV@GOTPAGEOFF] +_bluegl_glFramebufferTextureARB: + adrp x16, ___blue_glCore_glFramebufferTextureARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferTextureARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteTextures +.private_extern _bluegl_glFramebufferTextureLayerARB .align 2 -_bluegl_glDeleteTextures: - adrp x16, ___blue_glCore_glDeleteTextures@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteTextures@GOTPAGEOFF] +_bluegl_glFramebufferTextureLayerARB: + adrp x16, ___blue_glCore_glFramebufferTextureLayerARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferTextureLayerARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferDrawBuffersEXT +.private_extern _bluegl_glFramebufferTextureFaceARB .align 2 -_bluegl_glFramebufferDrawBuffersEXT: - adrp x16, ___blue_glCore_glFramebufferDrawBuffersEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferDrawBuffersEXT@GOTPAGEOFF] +_bluegl_glFramebufferTextureFaceARB: + adrp x16, ___blue_glCore_glFramebufferTextureFaceARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferTextureFaceARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetObjectLabelEXT +.private_extern _bluegl_glUniform1i64ARB .align 2 -_bluegl_glGetObjectLabelEXT: - adrp x16, ___blue_glCore_glGetObjectLabelEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetObjectLabelEXT@GOTPAGEOFF] +_bluegl_glUniform1i64ARB: + adrp x16, ___blue_glCore_glUniform1i64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1i64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3ivEXT +.private_extern _bluegl_glUniform2i64ARB .align 2 -_bluegl_glProgramUniform3ivEXT: - adrp x16, ___blue_glCore_glProgramUniform3ivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3ivEXT@GOTPAGEOFF] +_bluegl_glUniform2i64ARB: + adrp x16, ___blue_glCore_glUniform2i64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2i64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureParameterIiv +.private_extern _bluegl_glUniform3i64ARB .align 2 -_bluegl_glTextureParameterIiv: - adrp x16, ___blue_glCore_glTextureParameterIiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureParameterIiv@GOTPAGEOFF] +_bluegl_glUniform3i64ARB: + adrp x16, ___blue_glCore_glUniform3i64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3i64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnUniformuiv +.private_extern _bluegl_glUniform4i64ARB .align 2 -_bluegl_glGetnUniformuiv: - adrp x16, ___blue_glCore_glGetnUniformuiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnUniformuiv@GOTPAGEOFF] +_bluegl_glUniform4i64ARB: + adrp x16, ___blue_glCore_glUniform4i64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4i64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMapObjectBufferATI +.private_extern _bluegl_glUniform1i64vARB .align 2 -_bluegl_glMapObjectBufferATI: - adrp x16, ___blue_glCore_glMapObjectBufferATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMapObjectBufferATI@GOTPAGEOFF] +_bluegl_glUniform1i64vARB: + adrp x16, ___blue_glCore_glUniform1i64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1i64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTangent3dvEXT +.private_extern _bluegl_glUniform2i64vARB .align 2 -_bluegl_glTangent3dvEXT: - adrp x16, ___blue_glCore_glTangent3dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTangent3dvEXT@GOTPAGEOFF] +_bluegl_glUniform2i64vARB: + adrp x16, ___blue_glCore_glUniform2i64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2i64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramParameter4dNV +.private_extern _bluegl_glUniform3i64vARB .align 2 -_bluegl_glProgramParameter4dNV: - adrp x16, ___blue_glCore_glProgramParameter4dNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramParameter4dNV@GOTPAGEOFF] +_bluegl_glUniform3i64vARB: + adrp x16, ___blue_glCore_glUniform3i64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3i64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenVertexArraysAPPLE +.private_extern _bluegl_glUniform4i64vARB .align 2 -_bluegl_glGenVertexArraysAPPLE: - adrp x16, ___blue_glCore_glGenVertexArraysAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenVertexArraysAPPLE@GOTPAGEOFF] +_bluegl_glUniform4i64vARB: + adrp x16, ___blue_glCore_glUniform4i64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4i64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4bvARB +.private_extern _bluegl_glUniform1ui64ARB .align 2 -_bluegl_glVertexAttrib4bvARB: - adrp x16, ___blue_glCore_glVertexAttrib4bvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4bvARB@GOTPAGEOFF] +_bluegl_glUniform1ui64ARB: + adrp x16, ___blue_glCore_glUniform1ui64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1ui64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream1dATI +.private_extern _bluegl_glUniform2ui64ARB .align 2 -_bluegl_glVertexStream1dATI: - adrp x16, ___blue_glCore_glVertexStream1dATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream1dATI@GOTPAGEOFF] +_bluegl_glUniform2ui64ARB: + adrp x16, ___blue_glCore_glUniform2ui64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2ui64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2svARB +.private_extern _bluegl_glUniform3ui64ARB .align 2 -_bluegl_glMultiTexCoord2svARB: - adrp x16, ___blue_glCore_glMultiTexCoord2svARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2svARB@GOTPAGEOFF] +_bluegl_glUniform3ui64ARB: + adrp x16, ___blue_glCore_glUniform3ui64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3ui64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearNamedBufferSubDataEXT +.private_extern _bluegl_glUniform4ui64ARB .align 2 -_bluegl_glClearNamedBufferSubDataEXT: - adrp x16, ___blue_glCore_glClearNamedBufferSubDataEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearNamedBufferSubDataEXT@GOTPAGEOFF] +_bluegl_glUniform4ui64ARB: + adrp x16, ___blue_glCore_glUniform4ui64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4ui64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTextureSubImage3D +.private_extern _bluegl_glUniform1ui64vARB .align 2 -_bluegl_glCompressedTextureSubImage3D: - adrp x16, ___blue_glCore_glCompressedTextureSubImage3D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTextureSubImage3D@GOTPAGEOFF] +_bluegl_glUniform1ui64vARB: + adrp x16, ___blue_glCore_glUniform1ui64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1ui64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI4iEXT +.private_extern _bluegl_glUniform2ui64vARB .align 2 -_bluegl_glVertexAttribI4iEXT: - adrp x16, ___blue_glCore_glVertexAttribI4iEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI4iEXT@GOTPAGEOFF] +_bluegl_glUniform2ui64vARB: + adrp x16, ___blue_glCore_glUniform2ui64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2ui64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnPixelMapfvARB +.private_extern _bluegl_glUniform3ui64vARB .align 2 -_bluegl_glGetnPixelMapfvARB: - adrp x16, ___blue_glCore_glGetnPixelMapfvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnPixelMapfvARB@GOTPAGEOFF] +_bluegl_glUniform3ui64vARB: + adrp x16, ___blue_glCore_glUniform3ui64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3ui64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream4iATI +.private_extern _bluegl_glUniform4ui64vARB .align 2 -_bluegl_glVertexStream4iATI: - adrp x16, ___blue_glCore_glVertexStream4iATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream4iATI@GOTPAGEOFF] +_bluegl_glUniform4ui64vARB: + adrp x16, ___blue_glCore_glUniform4ui64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4ui64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixMultTransposedEXT +.private_extern _bluegl_glGetUniformi64vARB .align 2 -_bluegl_glMatrixMultTransposedEXT: - adrp x16, ___blue_glCore_glMatrixMultTransposedEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixMultTransposedEXT@GOTPAGEOFF] +_bluegl_glGetUniformi64vARB: + adrp x16, ___blue_glCore_glGetUniformi64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetUniformi64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDisableVariantClientStateEXT +.private_extern _bluegl_glGetUniformui64vARB .align 2 -_bluegl_glDisableVariantClientStateEXT: - adrp x16, ___blue_glCore_glDisableVariantClientStateEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDisableVariantClientStateEXT@GOTPAGEOFF] +_bluegl_glGetUniformui64vARB: + adrp x16, ___blue_glCore_glGetUniformui64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetUniformui64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPrimitiveRestartNV +.private_extern _bluegl_glGetnUniformi64vARB .align 2 -_bluegl_glPrimitiveRestartNV: - adrp x16, ___blue_glCore_glPrimitiveRestartNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPrimitiveRestartNV@GOTPAGEOFF] +_bluegl_glGetnUniformi64vARB: + adrp x16, ___blue_glCore_glGetnUniformi64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnUniformi64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribP4uiv +.private_extern _bluegl_glGetnUniformui64vARB .align 2 -_bluegl_glVertexAttribP4uiv: - adrp x16, ___blue_glCore_glVertexAttribP4uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribP4uiv@GOTPAGEOFF] +_bluegl_glGetnUniformui64vARB: + adrp x16, ___blue_glCore_glGetnUniformui64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnUniformui64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix2fv +.private_extern _bluegl_glProgramUniform1i64ARB .align 2 -_bluegl_glProgramUniformMatrix2fv: - adrp x16, ___blue_glCore_glProgramUniformMatrix2fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2fv@GOTPAGEOFF] +_bluegl_glProgramUniform1i64ARB: + adrp x16, ___blue_glCore_glProgramUniform1i64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1i64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPolygonOffsetEXT +.private_extern _bluegl_glProgramUniform2i64ARB .align 2 -_bluegl_glPolygonOffsetEXT: - adrp x16, ___blue_glCore_glPolygonOffsetEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPolygonOffsetEXT@GOTPAGEOFF] +_bluegl_glProgramUniform2i64ARB: + adrp x16, ___blue_glCore_glProgramUniform2i64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2i64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUseProgramObjectARB +.private_extern _bluegl_glProgramUniform3i64ARB .align 2 -_bluegl_glUseProgramObjectARB: - adrp x16, ___blue_glCore_glUseProgramObjectARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUseProgramObjectARB@GOTPAGEOFF] +_bluegl_glProgramUniform3i64ARB: + adrp x16, ___blue_glCore_glProgramUniform3i64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3i64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixLoadfEXT +.private_extern _bluegl_glProgramUniform4i64ARB .align 2 -_bluegl_glMatrixLoadfEXT: - adrp x16, ___blue_glCore_glMatrixLoadfEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixLoadfEXT@GOTPAGEOFF] +_bluegl_glProgramUniform4i64ARB: + adrp x16, ___blue_glCore_glProgramUniform4i64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4i64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureSubImage1D +.private_extern _bluegl_glProgramUniform1i64vARB .align 2 -_bluegl_glTextureSubImage1D: - adrp x16, ___blue_glCore_glTextureSubImage1D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureSubImage1D@GOTPAGEOFF] +_bluegl_glProgramUniform1i64vARB: + adrp x16, ___blue_glCore_glProgramUniform1i64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1i64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glHistogramEXT +.private_extern _bluegl_glProgramUniform2i64vARB .align 2 -_bluegl_glHistogramEXT: - adrp x16, ___blue_glCore_glHistogramEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glHistogramEXT@GOTPAGEOFF] +_bluegl_glProgramUniform2i64vARB: + adrp x16, ___blue_glCore_glProgramUniform2i64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2i64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1ivEXT +.private_extern _bluegl_glProgramUniform3i64vARB .align 2 -_bluegl_glProgramUniform1ivEXT: - adrp x16, ___blue_glCore_glProgramUniform1ivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1ivEXT@GOTPAGEOFF] +_bluegl_glProgramUniform3i64vARB: + adrp x16, ___blue_glCore_glProgramUniform3i64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3i64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetBufferParameterivARB +.private_extern _bluegl_glProgramUniform4i64vARB .align 2 -_bluegl_glGetBufferParameterivARB: - adrp x16, ___blue_glCore_glGetBufferParameterivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetBufferParameterivARB@GOTPAGEOFF] +_bluegl_glProgramUniform4i64vARB: + adrp x16, ___blue_glCore_glProgramUniform4i64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4i64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStringMarkerGREMEDY +.private_extern _bluegl_glProgramUniform1ui64ARB .align 2 -_bluegl_glStringMarkerGREMEDY: - adrp x16, ___blue_glCore_glStringMarkerGREMEDY@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStringMarkerGREMEDY@GOTPAGEOFF] +_bluegl_glProgramUniform1ui64ARB: + adrp x16, ___blue_glCore_glProgramUniform1ui64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1ui64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnMapfv +.private_extern _bluegl_glProgramUniform2ui64ARB .align 2 -_bluegl_glGetnMapfv: - adrp x16, ___blue_glCore_glGetnMapfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnMapfv@GOTPAGEOFF] +_bluegl_glProgramUniform2ui64ARB: + adrp x16, ___blue_glCore_glProgramUniform2ui64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2ui64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3dvARB +.private_extern _bluegl_glProgramUniform3ui64ARB .align 2 -_bluegl_glMultiTexCoord3dvARB: - adrp x16, ___blue_glCore_glMultiTexCoord3dvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3dvARB@GOTPAGEOFF] +_bluegl_glProgramUniform3ui64ARB: + adrp x16, ___blue_glCore_glProgramUniform3ui64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3ui64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFinishTextureSUNX +.private_extern _bluegl_glProgramUniform4ui64ARB .align 2 -_bluegl_glFinishTextureSUNX: - adrp x16, ___blue_glCore_glFinishTextureSUNX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFinishTextureSUNX@GOTPAGEOFF] +_bluegl_glProgramUniform4ui64ARB: + adrp x16, ___blue_glCore_glProgramUniform4ui64ARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4ui64ARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3dARB +.private_extern _bluegl_glProgramUniform1ui64vARB .align 2 -_bluegl_glWindowPos3dARB: - adrp x16, ___blue_glCore_glWindowPos3dARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3dARB@GOTPAGEOFF] +_bluegl_glProgramUniform1ui64vARB: + adrp x16, ___blue_glCore_glProgramUniform1ui64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1ui64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedBufferStorageEXT +.private_extern _bluegl_glProgramUniform2ui64vARB .align 2 -_bluegl_glNamedBufferStorageEXT: - adrp x16, ___blue_glCore_glNamedBufferStorageEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedBufferStorageEXT@GOTPAGEOFF] +_bluegl_glProgramUniform2ui64vARB: + adrp x16, ___blue_glCore_glProgramUniform2ui64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2ui64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIndexPointerListIBM +.private_extern _bluegl_glProgramUniform3ui64vARB .align 2 -_bluegl_glIndexPointerListIBM: - adrp x16, ___blue_glCore_glIndexPointerListIBM@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIndexPointerListIBM@GOTPAGEOFF] +_bluegl_glProgramUniform3ui64vARB: + adrp x16, ___blue_glCore_glProgramUniform3ui64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3ui64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColor3fVertex3fSUN +.private_extern _bluegl_glProgramUniform4ui64vARB .align 2 -_bluegl_glColor3fVertex3fSUN: - adrp x16, ___blue_glCore_glColor3fVertex3fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColor3fVertex3fSUN@GOTPAGEOFF] +_bluegl_glProgramUniform4ui64vARB: + adrp x16, ___blue_glCore_glProgramUniform4ui64vARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4ui64vARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDepthRangefOES +.private_extern _bluegl_glColorTable .align 2 -_bluegl_glDepthRangefOES: - adrp x16, ___blue_glCore_glDepthRangefOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDepthRangefOES@GOTPAGEOFF] +_bluegl_glColorTable: + adrp x16, ___blue_glCore_glColorTable@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorTable@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexBlendEnvfATI +.private_extern _bluegl_glColorTableParameterfv .align 2 -_bluegl_glVertexBlendEnvfATI: - adrp x16, ___blue_glCore_glVertexBlendEnvfATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexBlendEnvfATI@GOTPAGEOFF] +_bluegl_glColorTableParameterfv: + adrp x16, ___blue_glCore_glColorTableParameterfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorTableParameterfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1hvNV +.private_extern _bluegl_glColorTableParameteriv .align 2 -_bluegl_glMultiTexCoord1hvNV: - adrp x16, ___blue_glCore_glMultiTexCoord1hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1hvNV@GOTPAGEOFF] +_bluegl_glColorTableParameteriv: + adrp x16, ___blue_glCore_glColorTableParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorTableParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPixelTexGenParameterfvSGIS +.private_extern _bluegl_glCopyColorTable .align 2 -_bluegl_glGetPixelTexGenParameterfvSGIS: - adrp x16, ___blue_glCore_glGetPixelTexGenParameterfvSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPixelTexGenParameterfvSGIS@GOTPAGEOFF] +_bluegl_glCopyColorTable: + adrp x16, ___blue_glCore_glCopyColorTable@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyColorTable@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDisableClientStateIndexedEXT +.private_extern _bluegl_glGetColorTable .align 2 -_bluegl_glDisableClientStateIndexedEXT: - adrp x16, ___blue_glCore_glDisableClientStateIndexedEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDisableClientStateIndexedEXT@GOTPAGEOFF] +_bluegl_glGetColorTable: + adrp x16, ___blue_glCore_glGetColorTable@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetColorTable@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1ui64NV +.private_extern _bluegl_glGetColorTableParameterfv .align 2 -_bluegl_glProgramUniform1ui64NV: - adrp x16, ___blue_glCore_glProgramUniform1ui64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1ui64NV@GOTPAGEOFF] +_bluegl_glGetColorTableParameterfv: + adrp x16, ___blue_glCore_glGetColorTableParameterfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetColorTableParameterfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1dv +.private_extern _bluegl_glGetColorTableParameteriv .align 2 -_bluegl_glMultiTexCoord1dv: - adrp x16, ___blue_glCore_glMultiTexCoord1dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1dv@GOTPAGEOFF] +_bluegl_glGetColorTableParameteriv: + adrp x16, ___blue_glCore_glGetColorTableParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetColorTableParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1ivARB +.private_extern _bluegl_glColorSubTable .align 2 -_bluegl_glMultiTexCoord1ivARB: - adrp x16, ___blue_glCore_glMultiTexCoord1ivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1ivARB@GOTPAGEOFF] +_bluegl_glColorSubTable: + adrp x16, ___blue_glCore_glColorSubTable@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorSubTable@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMapVertexAttrib1dAPPLE +.private_extern _bluegl_glCopyColorSubTable .align 2 -_bluegl_glMapVertexAttrib1dAPPLE: - adrp x16, ___blue_glCore_glMapVertexAttrib1dAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMapVertexAttrib1dAPPLE@GOTPAGEOFF] +_bluegl_glCopyColorSubTable: + adrp x16, ___blue_glCore_glCopyColorSubTable@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyColorSubTable@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPerfQueryIdByNameINTEL +.private_extern _bluegl_glConvolutionFilter1D .align 2 -_bluegl_glGetPerfQueryIdByNameINTEL: - adrp x16, ___blue_glCore_glGetPerfQueryIdByNameINTEL@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPerfQueryIdByNameINTEL@GOTPAGEOFF] +_bluegl_glConvolutionFilter1D: + adrp x16, ___blue_glCore_glConvolutionFilter1D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glConvolutionFilter1D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2ui64vNV +.private_extern _bluegl_glConvolutionFilter2D .align 2 -_bluegl_glUniform2ui64vNV: - adrp x16, ___blue_glCore_glUniform2ui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2ui64vNV@GOTPAGEOFF] +_bluegl_glConvolutionFilter2D: + adrp x16, ___blue_glCore_glConvolutionFilter2D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glConvolutionFilter2D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetSharpenTexFuncSGIS +.private_extern _bluegl_glConvolutionParameterf .align 2 -_bluegl_glGetSharpenTexFuncSGIS: - adrp x16, ___blue_glCore_glGetSharpenTexFuncSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetSharpenTexFuncSGIS@GOTPAGEOFF] +_bluegl_glConvolutionParameterf: + adrp x16, ___blue_glCore_glConvolutionParameterf@GOTPAGE + ldr x16, [x16, ___blue_glCore_glConvolutionParameterf@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindImageTexture +.private_extern _bluegl_glConvolutionParameterfv .align 2 -_bluegl_glBindImageTexture: - adrp x16, ___blue_glCore_glBindImageTexture@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindImageTexture@GOTPAGEOFF] +_bluegl_glConvolutionParameterfv: + adrp x16, ___blue_glCore_glConvolutionParameterfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glConvolutionParameterfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramEnvParameter4dvARB +.private_extern _bluegl_glConvolutionParameteri .align 2 -_bluegl_glProgramEnvParameter4dvARB: - adrp x16, ___blue_glCore_glProgramEnvParameter4dvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramEnvParameter4dvARB@GOTPAGEOFF] +_bluegl_glConvolutionParameteri: + adrp x16, ___blue_glCore_glConvolutionParameteri@GOTPAGE + ldr x16, [x16, ___blue_glCore_glConvolutionParameteri@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteFramebuffers +.private_extern _bluegl_glConvolutionParameteriv .align 2 -_bluegl_glDeleteFramebuffers: - adrp x16, ___blue_glCore_glDeleteFramebuffers@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteFramebuffers@GOTPAGEOFF] +_bluegl_glConvolutionParameteriv: + adrp x16, ___blue_glCore_glConvolutionParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glConvolutionParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayVertexOffsetEXT +.private_extern _bluegl_glCopyConvolutionFilter1D .align 2 -_bluegl_glVertexArrayVertexOffsetEXT: - adrp x16, ___blue_glCore_glVertexArrayVertexOffsetEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayVertexOffsetEXT@GOTPAGEOFF] +_bluegl_glCopyConvolutionFilter1D: + adrp x16, ___blue_glCore_glCopyConvolutionFilter1D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyConvolutionFilter1D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramLocalParameters4fvEXT +.private_extern _bluegl_glCopyConvolutionFilter2D .align 2 -_bluegl_glProgramLocalParameters4fvEXT: - adrp x16, ___blue_glCore_glProgramLocalParameters4fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramLocalParameters4fvEXT@GOTPAGEOFF] +_bluegl_glCopyConvolutionFilter2D: + adrp x16, ___blue_glCore_glCopyConvolutionFilter2D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyConvolutionFilter2D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFogCoordFormatNV +.private_extern _bluegl_glGetConvolutionFilter .align 2 -_bluegl_glFogCoordFormatNV: - adrp x16, ___blue_glCore_glFogCoordFormatNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFogCoordFormatNV@GOTPAGEOFF] +_bluegl_glGetConvolutionFilter: + adrp x16, ___blue_glCore_glGetConvolutionFilter@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetConvolutionFilter@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenQueries +.private_extern _bluegl_glGetConvolutionParameterfv .align 2 -_bluegl_glGenQueries: - adrp x16, ___blue_glCore_glGenQueries@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenQueries@GOTPAGEOFF] +_bluegl_glGetConvolutionParameterfv: + adrp x16, ___blue_glCore_glGetConvolutionParameterfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetConvolutionParameterfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL4dEXT +.private_extern _bluegl_glGetConvolutionParameteriv .align 2 -_bluegl_glVertexAttribL4dEXT: - adrp x16, ___blue_glCore_glVertexAttribL4dEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL4dEXT@GOTPAGEOFF] +_bluegl_glGetConvolutionParameteriv: + adrp x16, ___blue_glCore_glGetConvolutionParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetConvolutionParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4fvARB +.private_extern _bluegl_glGetSeparableFilter .align 2 -_bluegl_glMultiTexCoord4fvARB: - adrp x16, ___blue_glCore_glMultiTexCoord4fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4fvARB@GOTPAGEOFF] +_bluegl_glGetSeparableFilter: + adrp x16, ___blue_glCore_glGetSeparableFilter@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetSeparableFilter@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPixelZoomxOES +.private_extern _bluegl_glSeparableFilter2D .align 2 -_bluegl_glPixelZoomxOES: - adrp x16, ___blue_glCore_glPixelZoomxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPixelZoomxOES@GOTPAGEOFF] +_bluegl_glSeparableFilter2D: + adrp x16, ___blue_glCore_glSeparableFilter2D@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSeparableFilter2D@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyTexSubImage3D +.private_extern _bluegl_glGetHistogram .align 2 -_bluegl_glCopyTexSubImage3D: - adrp x16, ___blue_glCore_glCopyTexSubImage3D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyTexSubImage3D@GOTPAGEOFF] +_bluegl_glGetHistogram: + adrp x16, ___blue_glCore_glGetHistogram@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetHistogram@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1ui64vARB +.private_extern _bluegl_glGetHistogramParameterfv .align 2 -_bluegl_glUniform1ui64vARB: - adrp x16, ___blue_glCore_glUniform1ui64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1ui64vARB@GOTPAGEOFF] +_bluegl_glGetHistogramParameterfv: + adrp x16, ___blue_glCore_glGetHistogramParameterfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetHistogramParameterfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMapControlPointsNV +.private_extern _bluegl_glGetHistogramParameteriv .align 2 -_bluegl_glGetMapControlPointsNV: - adrp x16, ___blue_glCore_glGetMapControlPointsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMapControlPointsNV@GOTPAGEOFF] +_bluegl_glGetHistogramParameteriv: + adrp x16, ___blue_glCore_glGetHistogramParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetHistogramParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLightEnviSGIX +.private_extern _bluegl_glGetMinmax .align 2 -_bluegl_glLightEnviSGIX: - adrp x16, ___blue_glCore_glLightEnviSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLightEnviSGIX@GOTPAGEOFF] +_bluegl_glGetMinmax: + adrp x16, ___blue_glCore_glGetMinmax@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMinmax@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4Nbv +.private_extern _bluegl_glGetMinmaxParameterfv .align 2 -_bluegl_glVertexAttrib4Nbv: - adrp x16, ___blue_glCore_glVertexAttrib4Nbv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4Nbv@GOTPAGEOFF] +_bluegl_glGetMinmaxParameterfv: + adrp x16, ___blue_glCore_glGetMinmaxParameterfv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMinmaxParameterfv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawBuffer +.private_extern _bluegl_glGetMinmaxParameteriv .align 2 -_bluegl_glDrawBuffer: - adrp x16, ___blue_glCore_glDrawBuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawBuffer@GOTPAGEOFF] +_bluegl_glGetMinmaxParameteriv: + adrp x16, ___blue_glCore_glGetMinmaxParameteriv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMinmaxParameteriv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawTransformFeedbackStream +.private_extern _bluegl_glHistogram .align 2 -_bluegl_glDrawTransformFeedbackStream: - adrp x16, ___blue_glCore_glDrawTransformFeedbackStream@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawTransformFeedbackStream@GOTPAGEOFF] +_bluegl_glHistogram: + adrp x16, ___blue_glCore_glHistogram@GOTPAGE + ldr x16, [x16, ___blue_glCore_glHistogram@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDisableClientStateiEXT +.private_extern _bluegl_glMinmax .align 2 -_bluegl_glDisableClientStateiEXT: - adrp x16, ___blue_glCore_glDisableClientStateiEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDisableClientStateiEXT@GOTPAGEOFF] +_bluegl_glMinmax: + adrp x16, ___blue_glCore_glMinmax@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMinmax@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferTexture3D +.private_extern _bluegl_glResetHistogram .align 2 -_bluegl_glFramebufferTexture3D: - adrp x16, ___blue_glCore_glFramebufferTexture3D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferTexture3D@GOTPAGEOFF] +_bluegl_glResetHistogram: + adrp x16, ___blue_glCore_glResetHistogram@GOTPAGE + ldr x16, [x16, ___blue_glCore_glResetHistogram@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureColorMaskSGIS +.private_extern _bluegl_glResetMinmax .align 2 -_bluegl_glTextureColorMaskSGIS: - adrp x16, ___blue_glCore_glTextureColorMaskSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureColorMaskSGIS@GOTPAGEOFF] +_bluegl_glResetMinmax: + adrp x16, ___blue_glCore_glResetMinmax@GOTPAGE + ldr x16, [x16, ___blue_glCore_glResetMinmax@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCullFace +.private_extern _bluegl_glVertexAttribDivisorARB .align 2 -_bluegl_glCullFace: - adrp x16, ___blue_glCore_glCullFace@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCullFace@GOTPAGEOFF] +_bluegl_glVertexAttribDivisorARB: + adrp x16, ___blue_glCore_glVertexAttribDivisorARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribDivisorARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedBufferSubData +.private_extern _bluegl_glCurrentPaletteMatrixARB .align 2 -_bluegl_glGetNamedBufferSubData: - adrp x16, ___blue_glCore_glGetNamedBufferSubData@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedBufferSubData@GOTPAGEOFF] +_bluegl_glCurrentPaletteMatrixARB: + adrp x16, ___blue_glCore_glCurrentPaletteMatrixARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCurrentPaletteMatrixARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDispatchCompute +.private_extern _bluegl_glMatrixIndexubvARB .align 2 -_bluegl_glDispatchCompute: - adrp x16, ___blue_glCore_glDispatchCompute@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDispatchCompute@GOTPAGEOFF] +_bluegl_glMatrixIndexubvARB: + adrp x16, ___blue_glCore_glMatrixIndexubvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixIndexubvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glInvalidateFramebuffer +.private_extern _bluegl_glMatrixIndexusvARB .align 2 -_bluegl_glInvalidateFramebuffer: - adrp x16, ___blue_glCore_glInvalidateFramebuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glInvalidateFramebuffer@GOTPAGEOFF] +_bluegl_glMatrixIndexusvARB: + adrp x16, ___blue_glCore_glMatrixIndexusvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixIndexusvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDebugMessageControl +.private_extern _bluegl_glMatrixIndexuivARB .align 2 -_bluegl_glDebugMessageControl: - adrp x16, ___blue_glCore_glDebugMessageControl@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDebugMessageControl@GOTPAGEOFF] +_bluegl_glMatrixIndexuivARB: + adrp x16, ___blue_glCore_glMatrixIndexuivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixIndexuivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix3dv +.private_extern _bluegl_glMatrixIndexPointerARB .align 2 -_bluegl_glProgramUniformMatrix3dv: - adrp x16, ___blue_glCore_glProgramUniformMatrix3dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3dv@GOTPAGEOFF] +_bluegl_glMatrixIndexPointerARB: + adrp x16, ___blue_glCore_glMatrixIndexPointerARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixIndexPointerARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3ui +.private_extern _bluegl_glSampleCoverageARB .align 2 -_bluegl_glSecondaryColor3ui: - adrp x16, ___blue_glCore_glSecondaryColor3ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3ui@GOTPAGEOFF] +_bluegl_glSampleCoverageARB: + adrp x16, ___blue_glCore_glSampleCoverageARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSampleCoverageARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glShaderStorageBlockBinding +.private_extern _bluegl_glActiveTextureARB .align 2 -_bluegl_glShaderStorageBlockBinding: - adrp x16, ___blue_glCore_glShaderStorageBlockBinding@GOTPAGE - ldr x16, [x16, ___blue_glCore_glShaderStorageBlockBinding@GOTPAGEOFF] +_bluegl_glActiveTextureARB: + adrp x16, ___blue_glCore_glActiveTextureARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glActiveTextureARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix3fvARB +.private_extern _bluegl_glClientActiveTextureARB .align 2 -_bluegl_glUniformMatrix3fvARB: - adrp x16, ___blue_glCore_glUniformMatrix3fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix3fvARB@GOTPAGEOFF] +_bluegl_glClientActiveTextureARB: + adrp x16, ___blue_glCore_glClientActiveTextureARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClientActiveTextureARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetUniformOffsetEXT +.private_extern _bluegl_glMultiTexCoord1dARB .align 2 -_bluegl_glGetUniformOffsetEXT: - adrp x16, ___blue_glCore_glGetUniformOffsetEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetUniformOffsetEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoord1dARB: + adrp x16, ___blue_glCore_glMultiTexCoord1dARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1dARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBinormal3fvEXT +.private_extern _bluegl_glMultiTexCoord1dvARB .align 2 -_bluegl_glBinormal3fvEXT: - adrp x16, ___blue_glCore_glBinormal3fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBinormal3fvEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoord1dvARB: + adrp x16, ___blue_glCore_glMultiTexCoord1dvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1dvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoordPointerEXT +.private_extern _bluegl_glMultiTexCoord1fARB .align 2 -_bluegl_glMultiTexCoordPointerEXT: - adrp x16, ___blue_glCore_glMultiTexCoordPointerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoordPointerEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoord1fARB: + adrp x16, ___blue_glCore_glMultiTexCoord1fARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1fARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4sv +.private_extern _bluegl_glMultiTexCoord1fvARB .align 2 -_bluegl_glVertexAttrib4sv: - adrp x16, ___blue_glCore_glVertexAttrib4sv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4sv@GOTPAGEOFF] +_bluegl_glMultiTexCoord1fvARB: + adrp x16, ___blue_glCore_glMultiTexCoord1fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixIndexubvARB +.private_extern _bluegl_glMultiTexCoord1iARB .align 2 -_bluegl_glMatrixIndexubvARB: - adrp x16, ___blue_glCore_glMatrixIndexubvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixIndexubvARB@GOTPAGEOFF] +_bluegl_glMultiTexCoord1iARB: + adrp x16, ___blue_glCore_glMultiTexCoord1iARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1iARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4ivEXT +.private_extern _bluegl_glMultiTexCoord1ivARB .align 2 -_bluegl_glProgramUniform4ivEXT: - adrp x16, ___blue_glCore_glProgramUniform4ivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4ivEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoord1ivARB: + adrp x16, ___blue_glCore_glMultiTexCoord1ivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1ivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos4dMESA +.private_extern _bluegl_glMultiTexCoord1sARB .align 2 -_bluegl_glWindowPos4dMESA: - adrp x16, ___blue_glCore_glWindowPos4dMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos4dMESA@GOTPAGEOFF] +_bluegl_glMultiTexCoord1sARB: + adrp x16, ___blue_glCore_glMultiTexCoord1sARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1sARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiDrawElementsIndirectCountARB +.private_extern _bluegl_glMultiTexCoord1svARB .align 2 -_bluegl_glMultiDrawElementsIndirectCountARB: - adrp x16, ___blue_glCore_glMultiDrawElementsIndirectCountARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiDrawElementsIndirectCountARB@GOTPAGEOFF] +_bluegl_glMultiTexCoord1svARB: + adrp x16, ___blue_glCore_glMultiTexCoord1svARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1svARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix4fvARB +.private_extern _bluegl_glMultiTexCoord2dARB .align 2 -_bluegl_glUniformMatrix4fvARB: - adrp x16, ___blue_glCore_glUniformMatrix4fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix4fvARB@GOTPAGEOFF] +_bluegl_glMultiTexCoord2dARB: + adrp x16, ___blue_glCore_glMultiTexCoord2dARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2dARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindImageTextureEXT +.private_extern _bluegl_glMultiTexCoord2dvARB .align 2 -_bluegl_glBindImageTextureEXT: - adrp x16, ___blue_glCore_glBindImageTextureEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindImageTextureEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoord2dvARB: + adrp x16, ___blue_glCore_glMultiTexCoord2dvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2dvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glResolveDepthValuesNV +.private_extern _bluegl_glMultiTexCoord2fARB .align 2 -_bluegl_glResolveDepthValuesNV: - adrp x16, ___blue_glCore_glResolveDepthValuesNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glResolveDepthValuesNV@GOTPAGEOFF] +_bluegl_glMultiTexCoord2fARB: + adrp x16, ___blue_glCore_glMultiTexCoord2fARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2fARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColor3fVertex3fvSUN +.private_extern _bluegl_glMultiTexCoord2fvARB .align 2 -_bluegl_glColor3fVertex3fvSUN: - adrp x16, ___blue_glCore_glColor3fVertex3fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColor3fVertex3fvSUN@GOTPAGEOFF] +_bluegl_glMultiTexCoord2fvARB: + adrp x16, ___blue_glCore_glMultiTexCoord2fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTexImage1D +.private_extern _bluegl_glMultiTexCoord2iARB .align 2 -_bluegl_glCompressedTexImage1D: - adrp x16, ___blue_glCore_glCompressedTexImage1D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTexImage1D@GOTPAGEOFF] +_bluegl_glMultiTexCoord2iARB: + adrp x16, ___blue_glCore_glMultiTexCoord2iARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2iARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnUniformdvARB +.private_extern _bluegl_glMultiTexCoord2ivARB .align 2 -_bluegl_glGetnUniformdvARB: - adrp x16, ___blue_glCore_glGetnUniformdvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnUniformdvARB@GOTPAGEOFF] +_bluegl_glMultiTexCoord2ivARB: + adrp x16, ___blue_glCore_glMultiTexCoord2ivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2ivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1ui64vNV +.private_extern _bluegl_glMultiTexCoord2sARB .align 2 -_bluegl_glUniform1ui64vNV: - adrp x16, ___blue_glCore_glUniform1ui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1ui64vNV@GOTPAGEOFF] +_bluegl_glMultiTexCoord2sARB: + adrp x16, ___blue_glCore_glMultiTexCoord2sARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2sARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramEnvParameterI4uiNV +.private_extern _bluegl_glMultiTexCoord2svARB .align 2 -_bluegl_glProgramEnvParameterI4uiNV: - adrp x16, ___blue_glCore_glProgramEnvParameterI4uiNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramEnvParameterI4uiNV@GOTPAGEOFF] +_bluegl_glMultiTexCoord2svARB: + adrp x16, ___blue_glCore_glMultiTexCoord2svARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2svARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4ubNV +.private_extern _bluegl_glMultiTexCoord3dARB .align 2 -_bluegl_glVertexAttrib4ubNV: - adrp x16, ___blue_glCore_glVertexAttrib4ubNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4ubNV@GOTPAGEOFF] +_bluegl_glMultiTexCoord3dARB: + adrp x16, ___blue_glCore_glMultiTexCoord3dARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3dARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenAsyncMarkersSGIX +.private_extern _bluegl_glMultiTexCoord3dvARB .align 2 -_bluegl_glGenAsyncMarkersSGIX: - adrp x16, ___blue_glCore_glGenAsyncMarkersSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenAsyncMarkersSGIX@GOTPAGEOFF] +_bluegl_glMultiTexCoord3dvARB: + adrp x16, ___blue_glCore_glMultiTexCoord3dvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3dvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexBindingDivisor +.private_extern _bluegl_glMultiTexCoord3fARB .align 2 -_bluegl_glVertexBindingDivisor: - adrp x16, ___blue_glCore_glVertexBindingDivisor@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexBindingDivisor@GOTPAGEOFF] +_bluegl_glMultiTexCoord3fARB: + adrp x16, ___blue_glCore_glMultiTexCoord3fARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3fARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreateShaderProgramv +.private_extern _bluegl_glMultiTexCoord3fvARB .align 2 -_bluegl_glCreateShaderProgramv: - adrp x16, ___blue_glCore_glCreateShaderProgramv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreateShaderProgramv@GOTPAGEOFF] +_bluegl_glMultiTexCoord3fvARB: + adrp x16, ___blue_glCore_glMultiTexCoord3fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindBufferARB +.private_extern _bluegl_glMultiTexCoord3iARB .align 2 -_bluegl_glBindBufferARB: - adrp x16, ___blue_glCore_glBindBufferARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindBufferARB@GOTPAGEOFF] +_bluegl_glMultiTexCoord3iARB: + adrp x16, ___blue_glCore_glMultiTexCoord3iARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3iARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColor4ubVertex2fvSUN +.private_extern _bluegl_glMultiTexCoord3ivARB .align 2 -_bluegl_glColor4ubVertex2fvSUN: - adrp x16, ___blue_glCore_glColor4ubVertex2fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColor4ubVertex2fvSUN@GOTPAGEOFF] +_bluegl_glMultiTexCoord3ivARB: + adrp x16, ___blue_glCore_glMultiTexCoord3ivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3ivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glResetHistogram +.private_extern _bluegl_glMultiTexCoord3sARB .align 2 -_bluegl_glResetHistogram: - adrp x16, ___blue_glCore_glResetHistogram@GOTPAGE - ldr x16, [x16, ___blue_glCore_glResetHistogram@GOTPAGEOFF] +_bluegl_glMultiTexCoord3sARB: + adrp x16, ___blue_glCore_glMultiTexCoord3sARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3sARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramResourceLocation +.private_extern _bluegl_glMultiTexCoord3svARB .align 2 -_bluegl_glGetProgramResourceLocation: - adrp x16, ___blue_glCore_glGetProgramResourceLocation@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramResourceLocation@GOTPAGEOFF] +_bluegl_glMultiTexCoord3svARB: + adrp x16, ___blue_glCore_glMultiTexCoord3svARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3svARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendFuncSeparateiARB +.private_extern _bluegl_glMultiTexCoord4dARB .align 2 -_bluegl_glBlendFuncSeparateiARB: - adrp x16, ___blue_glCore_glBlendFuncSeparateiARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendFuncSeparateiARB@GOTPAGEOFF] +_bluegl_glMultiTexCoord4dARB: + adrp x16, ___blue_glCore_glMultiTexCoord4dARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4dARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBinormalPointerEXT +.private_extern _bluegl_glMultiTexCoord4dvARB .align 2 -_bluegl_glBinormalPointerEXT: - adrp x16, ___blue_glCore_glBinormalPointerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBinormalPointerEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoord4dvARB: + adrp x16, ___blue_glCore_glMultiTexCoord4dvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4dvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2svNV +.private_extern _bluegl_glMultiTexCoord4fARB .align 2 -_bluegl_glVertexAttrib2svNV: - adrp x16, ___blue_glCore_glVertexAttrib2svNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2svNV@GOTPAGEOFF] +_bluegl_glMultiTexCoord4fARB: + adrp x16, ___blue_glCore_glMultiTexCoord4fARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4fARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2i64vNV +.private_extern _bluegl_glMultiTexCoord4fvARB .align 2 -_bluegl_glProgramUniform2i64vNV: - adrp x16, ___blue_glCore_glProgramUniform2i64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2i64vNV@GOTPAGEOFF] +_bluegl_glMultiTexCoord4fvARB: + adrp x16, ___blue_glCore_glMultiTexCoord4fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureNormalEXT +.private_extern _bluegl_glMultiTexCoord4iARB .align 2 -_bluegl_glTextureNormalEXT: - adrp x16, ___blue_glCore_glTextureNormalEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureNormalEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoord4iARB: + adrp x16, ___blue_glCore_glMultiTexCoord4iARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4iARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFlushMappedBufferRangeAPPLE +.private_extern _bluegl_glMultiTexCoord4ivARB .align 2 -_bluegl_glFlushMappedBufferRangeAPPLE: - adrp x16, ___blue_glCore_glFlushMappedBufferRangeAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFlushMappedBufferRangeAPPLE@GOTPAGEOFF] +_bluegl_glMultiTexCoord4ivARB: + adrp x16, ___blue_glCore_glMultiTexCoord4ivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4ivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3dv +.private_extern _bluegl_glMultiTexCoord4sARB .align 2 -_bluegl_glSecondaryColor3dv: - adrp x16, ___blue_glCore_glSecondaryColor3dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3dv@GOTPAGEOFF] +_bluegl_glMultiTexCoord4sARB: + adrp x16, ___blue_glCore_glMultiTexCoord4sARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4sARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorP3uiv +.private_extern _bluegl_glMultiTexCoord4svARB .align 2 -_bluegl_glColorP3uiv: - adrp x16, ___blue_glCore_glColorP3uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorP3uiv@GOTPAGEOFF] +_bluegl_glMultiTexCoord4svARB: + adrp x16, ___blue_glCore_glMultiTexCoord4svARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4svARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix4x2dv +.private_extern _bluegl_glGenQueriesARB .align 2 -_bluegl_glUniformMatrix4x2dv: - adrp x16, ___blue_glCore_glUniformMatrix4x2dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix4x2dv@GOTPAGEOFF] +_bluegl_glGenQueriesARB: + adrp x16, ___blue_glCore_glGenQueriesARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenQueriesARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoordP3ui +.private_extern _bluegl_glDeleteQueriesARB .align 2 -_bluegl_glTexCoordP3ui: - adrp x16, ___blue_glCore_glTexCoordP3ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoordP3ui@GOTPAGEOFF] +_bluegl_glDeleteQueriesARB: + adrp x16, ___blue_glCore_glDeleteQueriesARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteQueriesARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedBufferSubDataEXT +.private_extern _bluegl_glIsQueryARB .align 2 -_bluegl_glNamedBufferSubDataEXT: - adrp x16, ___blue_glCore_glNamedBufferSubDataEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedBufferSubDataEXT@GOTPAGEOFF] +_bluegl_glIsQueryARB: + adrp x16, ___blue_glCore_glIsQueryARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsQueryARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProvokingVertexEXT +.private_extern _bluegl_glBeginQueryARB .align 2 -_bluegl_glProvokingVertexEXT: - adrp x16, ___blue_glCore_glProvokingVertexEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProvokingVertexEXT@GOTPAGEOFF] +_bluegl_glBeginQueryARB: + adrp x16, ___blue_glCore_glBeginQueryARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBeginQueryARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWeightbvARB +.private_extern _bluegl_glEndQueryARB .align 2 -_bluegl_glWeightbvARB: - adrp x16, ___blue_glCore_glWeightbvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWeightbvARB@GOTPAGEOFF] +_bluegl_glEndQueryARB: + adrp x16, ___blue_glCore_glEndQueryARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEndQueryARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glInvalidateNamedFramebufferData +.private_extern _bluegl_glGetQueryivARB .align 2 -_bluegl_glInvalidateNamedFramebufferData: - adrp x16, ___blue_glCore_glInvalidateNamedFramebufferData@GOTPAGE - ldr x16, [x16, ___blue_glCore_glInvalidateNamedFramebufferData@GOTPAGEOFF] +_bluegl_glGetQueryivARB: + adrp x16, ___blue_glCore_glGetQueryivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetQueryivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetArrayObjectfvATI +.private_extern _bluegl_glGetQueryObjectivARB .align 2 -_bluegl_glGetArrayObjectfvATI: - adrp x16, ___blue_glCore_glGetArrayObjectfvATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetArrayObjectfvATI@GOTPAGEOFF] +_bluegl_glGetQueryObjectivARB: + adrp x16, ___blue_glCore_glGetQueryObjectivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetQueryObjectivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsSampler +.private_extern _bluegl_glGetQueryObjectuivARB .align 2 -_bluegl_glIsSampler: - adrp x16, ___blue_glCore_glIsSampler@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsSampler@GOTPAGEOFF] +_bluegl_glGetQueryObjectuivARB: + adrp x16, ___blue_glCore_glGetQueryObjectuivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetQueryObjectuivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormalStream3dvATI +.private_extern _bluegl_glMaxShaderCompilerThreadsARB .align 2 -_bluegl_glNormalStream3dvATI: - adrp x16, ___blue_glCore_glNormalStream3dvATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormalStream3dvATI@GOTPAGEOFF] +_bluegl_glMaxShaderCompilerThreadsARB: + adrp x16, ___blue_glCore_glMaxShaderCompilerThreadsARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMaxShaderCompilerThreadsARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL4i64vNV +.private_extern _bluegl_glPointParameterfARB .align 2 -_bluegl_glVertexAttribL4i64vNV: - adrp x16, ___blue_glCore_glVertexAttribL4i64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL4i64vNV@GOTPAGEOFF] +_bluegl_glPointParameterfARB: + adrp x16, ___blue_glCore_glPointParameterfARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPointParameterfARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glValidateProgramARB +.private_extern _bluegl_glPointParameterfvARB .align 2 -_bluegl_glValidateProgramARB: - adrp x16, ___blue_glCore_glValidateProgramARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glValidateProgramARB@GOTPAGEOFF] +_bluegl_glPointParameterfvARB: + adrp x16, ___blue_glCore_glPointParameterfvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPointParameterfvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3ui +.private_extern _bluegl_glGetnMapdvARB .align 2 -_bluegl_glUniform3ui: - adrp x16, ___blue_glCore_glUniform3ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3ui@GOTPAGEOFF] +_bluegl_glGetnMapdvARB: + adrp x16, ___blue_glCore_glGetnMapdvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnMapdvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTransformFeedbackVaryingsNV +.private_extern _bluegl_glGetnMapfvARB .align 2 -_bluegl_glTransformFeedbackVaryingsNV: - adrp x16, ___blue_glCore_glTransformFeedbackVaryingsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTransformFeedbackVaryingsNV@GOTPAGEOFF] +_bluegl_glGetnMapfvARB: + adrp x16, ___blue_glCore_glGetnMapfvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnMapfvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetSeparableFilter +.private_extern _bluegl_glGetnMapivARB .align 2 -_bluegl_glGetSeparableFilter: - adrp x16, ___blue_glCore_glGetSeparableFilter@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetSeparableFilter@GOTPAGEOFF] +_bluegl_glGetnMapivARB: + adrp x16, ___blue_glCore_glGetnMapivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnMapivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetCompressedTexImageARB +.private_extern _bluegl_glGetnPixelMapfvARB .align 2 -_bluegl_glGetCompressedTexImageARB: - adrp x16, ___blue_glCore_glGetCompressedTexImageARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetCompressedTexImageARB@GOTPAGEOFF] +_bluegl_glGetnPixelMapfvARB: + adrp x16, ___blue_glCore_glGetnPixelMapfvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnPixelMapfvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramNamedParameter4fvNV +.private_extern _bluegl_glGetnPixelMapuivARB .align 2 -_bluegl_glProgramNamedParameter4fvNV: - adrp x16, ___blue_glCore_glProgramNamedParameter4fvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramNamedParameter4fvNV@GOTPAGEOFF] +_bluegl_glGetnPixelMapuivARB: + adrp x16, ___blue_glCore_glGetnPixelMapuivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnPixelMapuivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureBarrierNV +.private_extern _bluegl_glGetnPixelMapusvARB .align 2 -_bluegl_glTextureBarrierNV: - adrp x16, ___blue_glCore_glTextureBarrierNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureBarrierNV@GOTPAGEOFF] +_bluegl_glGetnPixelMapusvARB: + adrp x16, ___blue_glCore_glGetnPixelMapusvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnPixelMapusvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glRasterSamplesEXT +.private_extern _bluegl_glGetnPolygonStippleARB .align 2 -_bluegl_glRasterSamplesEXT: - adrp x16, ___blue_glCore_glRasterSamplesEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glRasterSamplesEXT@GOTPAGEOFF] +_bluegl_glGetnPolygonStippleARB: + adrp x16, ___blue_glCore_glGetnPolygonStippleARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnPolygonStippleARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3dEXT +.private_extern _bluegl_glGetnColorTableARB .align 2 -_bluegl_glSecondaryColor3dEXT: - adrp x16, ___blue_glCore_glSecondaryColor3dEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3dEXT@GOTPAGEOFF] +_bluegl_glGetnColorTableARB: + adrp x16, ___blue_glCore_glGetnColorTableARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnColorTableARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1svNV +.private_extern _bluegl_glGetnConvolutionFilterARB .align 2 -_bluegl_glVertexAttrib1svNV: - adrp x16, ___blue_glCore_glVertexAttrib1svNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1svNV@GOTPAGEOFF] +_bluegl_glGetnConvolutionFilterARB: + adrp x16, ___blue_glCore_glGetnConvolutionFilterARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnConvolutionFilterARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexImage3D +.private_extern _bluegl_glGetnSeparableFilterARB .align 2 -_bluegl_glTexImage3D: - adrp x16, ___blue_glCore_glTexImage3D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexImage3D@GOTPAGEOFF] +_bluegl_glGetnSeparableFilterARB: + adrp x16, ___blue_glCore_glGetnSeparableFilterARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnSeparableFilterARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1i64ARB +.private_extern _bluegl_glGetnHistogramARB .align 2 -_bluegl_glUniform1i64ARB: - adrp x16, ___blue_glCore_glUniform1i64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1i64ARB@GOTPAGEOFF] +_bluegl_glGetnHistogramARB: + adrp x16, ___blue_glCore_glGetnHistogramARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnHistogramARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4Nuiv +.private_extern _bluegl_glGetnMinmaxARB .align 2 -_bluegl_glVertexAttrib4Nuiv: - adrp x16, ___blue_glCore_glVertexAttrib4Nuiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4Nuiv@GOTPAGEOFF] +_bluegl_glGetnMinmaxARB: + adrp x16, ___blue_glCore_glGetnMinmaxARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetnMinmaxARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramivNV +.private_extern _bluegl_glFramebufferSampleLocationsfvARB .align 2 -_bluegl_glGetProgramivNV: - adrp x16, ___blue_glCore_glGetProgramivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramivNV@GOTPAGEOFF] +_bluegl_glFramebufferSampleLocationsfvARB: + adrp x16, ___blue_glCore_glFramebufferSampleLocationsfvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferSampleLocationsfvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTexGenxvOES +.private_extern _bluegl_glNamedFramebufferSampleLocationsfvARB .align 2 -_bluegl_glGetTexGenxvOES: - adrp x16, ___blue_glCore_glGetTexGenxvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTexGenxvOES@GOTPAGEOFF] +_bluegl_glNamedFramebufferSampleLocationsfvARB: + adrp x16, ___blue_glCore_glNamedFramebufferSampleLocationsfvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedFramebufferSampleLocationsfvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexP4uiv +.private_extern _bluegl_glEvaluateDepthValuesARB .align 2 -_bluegl_glVertexP4uiv: - adrp x16, ___blue_glCore_glVertexP4uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexP4uiv@GOTPAGEOFF] +_bluegl_glEvaluateDepthValuesARB: + adrp x16, ___blue_glCore_glEvaluateDepthValuesARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEvaluateDepthValuesARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMapGrid1xOES +.private_extern _bluegl_glDeleteObjectARB .align 2 -_bluegl_glMapGrid1xOES: - adrp x16, ___blue_glCore_glMapGrid1xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMapGrid1xOES@GOTPAGEOFF] +_bluegl_glDeleteObjectARB: + adrp x16, ___blue_glCore_glDeleteObjectARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteObjectARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix2dv +.private_extern _bluegl_glGetHandleARB .align 2 -_bluegl_glProgramUniformMatrix2dv: - adrp x16, ___blue_glCore_glProgramUniformMatrix2dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2dv@GOTPAGEOFF] +_bluegl_glGetHandleARB: + adrp x16, ___blue_glCore_glGetHandleARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetHandleARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorMaski +.private_extern _bluegl_glDetachObjectARB .align 2 -_bluegl_glColorMaski: - adrp x16, ___blue_glCore_glColorMaski@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorMaski@GOTPAGEOFF] +_bluegl_glDetachObjectARB: + adrp x16, ___blue_glCore_glDetachObjectARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDetachObjectARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEdgeFlagPointerListIBM +.private_extern _bluegl_glCreateShaderObjectARB .align 2 -_bluegl_glEdgeFlagPointerListIBM: - adrp x16, ___blue_glCore_glEdgeFlagPointerListIBM@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEdgeFlagPointerListIBM@GOTPAGEOFF] +_bluegl_glCreateShaderObjectARB: + adrp x16, ___blue_glCore_glCreateShaderObjectARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreateShaderObjectARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetUniformBlockIndex +.private_extern _bluegl_glShaderSourceARB .align 2 -_bluegl_glGetUniformBlockIndex: - adrp x16, ___blue_glCore_glGetUniformBlockIndex@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetUniformBlockIndex@GOTPAGEOFF] +_bluegl_glShaderSourceARB: + adrp x16, ___blue_glCore_glShaderSourceARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glShaderSourceARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearColorxOES +.private_extern _bluegl_glCompileShaderARB .align 2 -_bluegl_glClearColorxOES: - adrp x16, ___blue_glCore_glClearColorxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearColorxOES@GOTPAGEOFF] +_bluegl_glCompileShaderARB: + adrp x16, ___blue_glCore_glCompileShaderARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompileShaderARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPixelTransformParameteriEXT +.private_extern _bluegl_glCreateProgramObjectARB .align 2 -_bluegl_glPixelTransformParameteriEXT: - adrp x16, ___blue_glCore_glPixelTransformParameteriEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPixelTransformParameteriEXT@GOTPAGEOFF] +_bluegl_glCreateProgramObjectARB: + adrp x16, ___blue_glCore_glCreateProgramObjectARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreateProgramObjectARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedFramebufferTexture3DEXT +.private_extern _bluegl_glAttachObjectARB .align 2 -_bluegl_glNamedFramebufferTexture3DEXT: - adrp x16, ___blue_glCore_glNamedFramebufferTexture3DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedFramebufferTexture3DEXT@GOTPAGEOFF] +_bluegl_glAttachObjectARB: + adrp x16, ___blue_glCore_glAttachObjectARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glAttachObjectARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord4xOES +.private_extern _bluegl_glLinkProgramARB .align 2 -_bluegl_glTexCoord4xOES: - adrp x16, ___blue_glCore_glTexCoord4xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord4xOES@GOTPAGEOFF] +_bluegl_glLinkProgramARB: + adrp x16, ___blue_glCore_glLinkProgramARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLinkProgramARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetUniformivARB +.private_extern _bluegl_glUseProgramObjectARB .align 2 -_bluegl_glGetUniformivARB: - adrp x16, ___blue_glCore_glGetUniformivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetUniformivARB@GOTPAGEOFF] +_bluegl_glUseProgramObjectARB: + adrp x16, ___blue_glCore_glUseProgramObjectARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUseProgramObjectARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedFramebufferTextureEXT +.private_extern _bluegl_glValidateProgramARB .align 2 -_bluegl_glNamedFramebufferTextureEXT: - adrp x16, ___blue_glCore_glNamedFramebufferTextureEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedFramebufferTextureEXT@GOTPAGEOFF] +_bluegl_glValidateProgramARB: + adrp x16, ___blue_glCore_glValidateProgramARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glValidateProgramARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawBuffers +.private_extern _bluegl_glUniform1fARB .align 2 -_bluegl_glDrawBuffers: - adrp x16, ___blue_glCore_glDrawBuffers@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawBuffers@GOTPAGEOFF] +_bluegl_glUniform1fARB: + adrp x16, ___blue_glCore_glUniform1fARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1fARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWeightuivARB +.private_extern _bluegl_glUniform2fARB .align 2 -_bluegl_glWeightuivARB: - adrp x16, ___blue_glCore_glWeightuivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWeightuivARB@GOTPAGEOFF] +_bluegl_glUniform2fARB: + adrp x16, ___blue_glCore_glUniform2fARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2fARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoordP1ui +.private_extern _bluegl_glUniform3fARB .align 2 -_bluegl_glMultiTexCoordP1ui: - adrp x16, ___blue_glCore_glMultiTexCoordP1ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoordP1ui@GOTPAGEOFF] +_bluegl_glUniform3fARB: + adrp x16, ___blue_glCore_glUniform3fARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3fARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyTexSubImage1DEXT +.private_extern _bluegl_glUniform4fARB .align 2 -_bluegl_glCopyTexSubImage1DEXT: - adrp x16, ___blue_glCore_glCopyTexSubImage1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyTexSubImage1DEXT@GOTPAGEOFF] +_bluegl_glUniform4fARB: + adrp x16, ___blue_glCore_glUniform4fARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4fARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayAttribBinding +.private_extern _bluegl_glUniform1iARB .align 2 -_bluegl_glVertexArrayAttribBinding: - adrp x16, ___blue_glCore_glVertexArrayAttribBinding@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayAttribBinding@GOTPAGEOFF] +_bluegl_glUniform1iARB: + adrp x16, ___blue_glCore_glUniform1iARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1iARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexP4ui +.private_extern _bluegl_glUniform2iARB .align 2 -_bluegl_glVertexP4ui: - adrp x16, ___blue_glCore_glVertexP4ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexP4ui@GOTPAGEOFF] +_bluegl_glUniform2iARB: + adrp x16, ___blue_glCore_glUniform2iARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2iARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertex2hvNV +.private_extern _bluegl_glUniform3iARB .align 2 -_bluegl_glVertex2hvNV: - adrp x16, ___blue_glCore_glVertex2hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertex2hvNV@GOTPAGEOFF] +_bluegl_glUniform3iARB: + adrp x16, ___blue_glCore_glUniform3iARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3iARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawElementsInstancedBaseInstance +.private_extern _bluegl_glUniform4iARB .align 2 -_bluegl_glDrawElementsInstancedBaseInstance: - adrp x16, ___blue_glCore_glDrawElementsInstancedBaseInstance@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawElementsInstancedBaseInstance@GOTPAGEOFF] +_bluegl_glUniform4iARB: + adrp x16, ___blue_glCore_glUniform4iARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4iARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormalStream3sATI +.private_extern _bluegl_glUniform1fvARB .align 2 -_bluegl_glNormalStream3sATI: - adrp x16, ___blue_glCore_glNormalStream3sATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormalStream3sATI@GOTPAGEOFF] +_bluegl_glUniform1fvARB: + adrp x16, ___blue_glCore_glUniform1fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN +.private_extern _bluegl_glUniform2fvARB .align 2 -_bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN: - adrp x16, ___blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN@GOTPAGEOFF] +_bluegl_glUniform2fvARB: + adrp x16, ___blue_glCore_glUniform2fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindSamplers +.private_extern _bluegl_glUniform3fvARB .align 2 -_bluegl_glBindSamplers: - adrp x16, ___blue_glCore_glBindSamplers@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindSamplers@GOTPAGEOFF] +_bluegl_glUniform3fvARB: + adrp x16, ___blue_glCore_glUniform3fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetCompressedMultiTexImageEXT +.private_extern _bluegl_glUniform4fvARB .align 2 -_bluegl_glGetCompressedMultiTexImageEXT: - adrp x16, ___blue_glCore_glGetCompressedMultiTexImageEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetCompressedMultiTexImageEXT@GOTPAGEOFF] +_bluegl_glUniform4fvARB: + adrp x16, ___blue_glCore_glUniform4fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetRenderbufferParameterivEXT +.private_extern _bluegl_glUniform1ivARB .align 2 -_bluegl_glGetRenderbufferParameterivEXT: - adrp x16, ___blue_glCore_glGetRenderbufferParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetRenderbufferParameterivEXT@GOTPAGEOFF] +_bluegl_glUniform1ivARB: + adrp x16, ___blue_glCore_glUniform1ivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1ivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3dv +.private_extern _bluegl_glUniform2ivARB .align 2 -_bluegl_glUniform3dv: - adrp x16, ___blue_glCore_glUniform3dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3dv@GOTPAGEOFF] +_bluegl_glUniform2ivARB: + adrp x16, ___blue_glCore_glUniform2ivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2ivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFlushRasterSGIX +.private_extern _bluegl_glUniform3ivARB .align 2 -_bluegl_glFlushRasterSGIX: - adrp x16, ___blue_glCore_glFlushRasterSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFlushRasterSGIX@GOTPAGEOFF] +_bluegl_glUniform3ivARB: + adrp x16, ___blue_glCore_glUniform3ivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3ivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribs3hvNV +.private_extern _bluegl_glUniform4ivARB .align 2 -_bluegl_glVertexAttribs3hvNV: - adrp x16, ___blue_glCore_glVertexAttribs3hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribs3hvNV@GOTPAGEOFF] +_bluegl_glUniform4ivARB: + adrp x16, ___blue_glCore_glUniform4ivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4ivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnSeparableFilterARB +.private_extern _bluegl_glUniformMatrix2fvARB .align 2 -_bluegl_glGetnSeparableFilterARB: - adrp x16, ___blue_glCore_glGetnSeparableFilterARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnSeparableFilterARB@GOTPAGEOFF] +_bluegl_glUniformMatrix2fvARB: + adrp x16, ___blue_glCore_glUniformMatrix2fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix2fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2sARB +.private_extern _bluegl_glUniformMatrix3fvARB .align 2 -_bluegl_glWindowPos2sARB: - adrp x16, ___blue_glCore_glWindowPos2sARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2sARB@GOTPAGEOFF] +_bluegl_glUniformMatrix3fvARB: + adrp x16, ___blue_glCore_glUniformMatrix3fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix3fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPopDebugGroup +.private_extern _bluegl_glUniformMatrix4fvARB .align 2 -_bluegl_glPopDebugGroup: - adrp x16, ___blue_glCore_glPopDebugGroup@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPopDebugGroup@GOTPAGEOFF] +_bluegl_glUniformMatrix4fvARB: + adrp x16, ___blue_glCore_glUniformMatrix4fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformMatrix4fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVideoCaptureNV +.private_extern _bluegl_glGetObjectParameterfvARB .align 2 -_bluegl_glVideoCaptureNV: - adrp x16, ___blue_glCore_glVideoCaptureNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVideoCaptureNV@GOTPAGEOFF] +_bluegl_glGetObjectParameterfvARB: + adrp x16, ___blue_glCore_glGetObjectParameterfvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetObjectParameterfvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTangent3bEXT +.private_extern _bluegl_glGetObjectParameterivARB .align 2 -_bluegl_glTangent3bEXT: - adrp x16, ___blue_glCore_glTangent3bEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTangent3bEXT@GOTPAGEOFF] +_bluegl_glGetObjectParameterivARB: + adrp x16, ___blue_glCore_glGetObjectParameterivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetObjectParameterivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLinkProgram +.private_extern _bluegl_glGetInfoLogARB .align 2 -_bluegl_glLinkProgram: - adrp x16, ___blue_glCore_glLinkProgram@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLinkProgram@GOTPAGEOFF] +_bluegl_glGetInfoLogARB: + adrp x16, ___blue_glCore_glGetInfoLogARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetInfoLogARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFogCoordPointerListIBM +.private_extern _bluegl_glGetAttachedObjectsARB .align 2 -_bluegl_glFogCoordPointerListIBM: - adrp x16, ___blue_glCore_glFogCoordPointerListIBM@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFogCoordPointerListIBM@GOTPAGEOFF] +_bluegl_glGetAttachedObjectsARB: + adrp x16, ___blue_glCore_glGetAttachedObjectsARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetAttachedObjectsARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glRotatexOES +.private_extern _bluegl_glGetUniformLocationARB .align 2 -_bluegl_glRotatexOES: - adrp x16, ___blue_glCore_glRotatexOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glRotatexOES@GOTPAGEOFF] +_bluegl_glGetUniformLocationARB: + adrp x16, ___blue_glCore_glGetUniformLocationARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetUniformLocationARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathParameterivNV +.private_extern _bluegl_glGetActiveUniformARB .align 2 -_bluegl_glPathParameterivNV: - adrp x16, ___blue_glCore_glPathParameterivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathParameterivNV@GOTPAGEOFF] +_bluegl_glGetActiveUniformARB: + adrp x16, ___blue_glCore_glGetActiveUniformARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetActiveUniformARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribLPointerEXT +.private_extern _bluegl_glGetUniformfvARB .align 2 -_bluegl_glVertexAttribLPointerEXT: - adrp x16, ___blue_glCore_glVertexAttribLPointerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribLPointerEXT@GOTPAGEOFF] +_bluegl_glGetUniformfvARB: + adrp x16, ___blue_glCore_glGetUniformfvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetUniformfvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetInteger64i_v +.private_extern _bluegl_glGetUniformivARB .align 2 -_bluegl_glGetInteger64i_v: - adrp x16, ___blue_glCore_glGetInteger64i_v@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetInteger64i_v@GOTPAGEOFF] +_bluegl_glGetUniformivARB: + adrp x16, ___blue_glCore_glGetUniformivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetUniformivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedMultiTexSubImage1DEXT +.private_extern _bluegl_glGetShaderSourceARB .align 2 -_bluegl_glCompressedMultiTexSubImage1DEXT: - adrp x16, ___blue_glCore_glCompressedMultiTexSubImage1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedMultiTexSubImage1DEXT@GOTPAGEOFF] +_bluegl_glGetShaderSourceARB: + adrp x16, ___blue_glCore_glGetShaderSourceARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetShaderSourceARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glConvolutionParameteriEXT +.private_extern _bluegl_glTexBufferARB .align 2 -_bluegl_glConvolutionParameteriEXT: - adrp x16, ___blue_glCore_glConvolutionParameteriEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glConvolutionParameteriEXT@GOTPAGEOFF] +_bluegl_glTexBufferARB: + adrp x16, ___blue_glCore_glTexBufferARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexBufferARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedFramebufferTextureLayer +.private_extern _bluegl_glCompressedTexImage3DARB .align 2 -_bluegl_glNamedFramebufferTextureLayer: - adrp x16, ___blue_glCore_glNamedFramebufferTextureLayer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedFramebufferTextureLayer@GOTPAGEOFF] +_bluegl_glCompressedTexImage3DARB: + adrp x16, ___blue_glCore_glCompressedTexImage3DARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTexImage3DARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2sMESA +.private_extern _bluegl_glCompressedTexImage2DARB .align 2 -_bluegl_glWindowPos2sMESA: - adrp x16, ___blue_glCore_glWindowPos2sMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2sMESA@GOTPAGEOFF] +_bluegl_glCompressedTexImage2DARB: + adrp x16, ___blue_glCore_glCompressedTexImage2DARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTexImage2DARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCoverStrokePathInstancedNV +.private_extern _bluegl_glCompressedTexImage1DARB .align 2 -_bluegl_glCoverStrokePathInstancedNV: - adrp x16, ___blue_glCore_glCoverStrokePathInstancedNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCoverStrokePathInstancedNV@GOTPAGEOFF] +_bluegl_glCompressedTexImage1DARB: + adrp x16, ___blue_glCore_glCompressedTexImage1DARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTexImage1DARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexParameteri +.private_extern _bluegl_glCompressedTexSubImage3DARB .align 2 -_bluegl_glTexParameteri: - adrp x16, ___blue_glCore_glTexParameteri@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexParameteri@GOTPAGEOFF] +_bluegl_glCompressedTexSubImage3DARB: + adrp x16, ___blue_glCore_glCompressedTexSubImage3DARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTexSubImage3DARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1uiv +.private_extern _bluegl_glCompressedTexSubImage2DARB .align 2 -_bluegl_glUniform1uiv: - adrp x16, ___blue_glCore_glUniform1uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1uiv@GOTPAGEOFF] +_bluegl_glCompressedTexSubImage2DARB: + adrp x16, ___blue_glCore_glCompressedTexSubImage2DARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTexSubImage2DARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4fv +.private_extern _bluegl_glCompressedTexSubImage1DARB .align 2 -_bluegl_glMultiTexCoord4fv: - adrp x16, ___blue_glCore_glMultiTexCoord4fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4fv@GOTPAGEOFF] +_bluegl_glCompressedTexSubImage1DARB: + adrp x16, ___blue_glCore_glCompressedTexSubImage1DARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTexSubImage1DARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramParameter4fvNV +.private_extern _bluegl_glGetCompressedTexImageARB .align 2 -_bluegl_glProgramParameter4fvNV: - adrp x16, ___blue_glCore_glProgramParameter4fvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramParameter4fvNV@GOTPAGEOFF] +_bluegl_glGetCompressedTexImageARB: + adrp x16, ___blue_glCore_glGetCompressedTexImageARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetCompressedTexImageARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeformationMap3fSGIX +.private_extern _bluegl_glLoadTransposeMatrixfARB .align 2 -_bluegl_glDeformationMap3fSGIX: - adrp x16, ___blue_glCore_glDeformationMap3fSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeformationMap3fSGIX@GOTPAGEOFF] +_bluegl_glLoadTransposeMatrixfARB: + adrp x16, ___blue_glCore_glLoadTransposeMatrixfARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLoadTransposeMatrixfARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendEquationiARB +.private_extern _bluegl_glLoadTransposeMatrixdARB .align 2 -_bluegl_glBlendEquationiARB: - adrp x16, ___blue_glCore_glBlendEquationiARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendEquationiARB@GOTPAGEOFF] +_bluegl_glLoadTransposeMatrixdARB: + adrp x16, ___blue_glCore_glLoadTransposeMatrixdARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLoadTransposeMatrixdARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStencilFunc +.private_extern _bluegl_glMultTransposeMatrixfARB .align 2 -_bluegl_glStencilFunc: - adrp x16, ___blue_glCore_glStencilFunc@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStencilFunc@GOTPAGEOFF] +_bluegl_glMultTransposeMatrixfARB: + adrp x16, ___blue_glCore_glMultTransposeMatrixfARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultTransposeMatrixfARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFogCoordd +.private_extern _bluegl_glMultTransposeMatrixdARB .align 2 -_bluegl_glFogCoordd: - adrp x16, ___blue_glCore_glFogCoordd@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFogCoordd@GOTPAGEOFF] +_bluegl_glMultTransposeMatrixdARB: + adrp x16, ___blue_glCore_glMultTransposeMatrixdARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultTransposeMatrixdARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2iv +.private_extern _bluegl_glWeightbvARB .align 2 -_bluegl_glUniform2iv: - adrp x16, ___blue_glCore_glUniform2iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2iv@GOTPAGEOFF] +_bluegl_glWeightbvARB: + adrp x16, ___blue_glCore_glWeightbvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWeightbvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1i64NV +.private_extern _bluegl_glWeightsvARB .align 2 -_bluegl_glUniform1i64NV: - adrp x16, ___blue_glCore_glUniform1i64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1i64NV@GOTPAGEOFF] +_bluegl_glWeightsvARB: + adrp x16, ___blue_glCore_glWeightsvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWeightsvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureStorage2D +.private_extern _bluegl_glWeightivARB .align 2 -_bluegl_glTextureStorage2D: - adrp x16, ___blue_glCore_glTextureStorage2D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureStorage2D@GOTPAGEOFF] +_bluegl_glWeightivARB: + adrp x16, ___blue_glCore_glWeightivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWeightivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureStorage2DMultisampleEXT +.private_extern _bluegl_glWeightfvARB .align 2 -_bluegl_glTextureStorage2DMultisampleEXT: - adrp x16, ___blue_glCore_glTextureStorage2DMultisampleEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureStorage2DMultisampleEXT@GOTPAGEOFF] +_bluegl_glWeightfvARB: + adrp x16, ___blue_glCore_glWeightfvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWeightfvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyTexSubImage1D +.private_extern _bluegl_glWeightdvARB .align 2 -_bluegl_glCopyTexSubImage1D: - adrp x16, ___blue_glCore_glCopyTexSubImage1D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyTexSubImage1D@GOTPAGEOFF] +_bluegl_glWeightdvARB: + adrp x16, ___blue_glCore_glWeightdvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWeightdvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSamplerParameterf +.private_extern _bluegl_glWeightubvARB .align 2 -_bluegl_glSamplerParameterf: - adrp x16, ___blue_glCore_glSamplerParameterf@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSamplerParameterf@GOTPAGEOFF] +_bluegl_glWeightubvARB: + adrp x16, ___blue_glCore_glWeightubvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWeightubvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawArraysInstancedBaseInstance +.private_extern _bluegl_glWeightusvARB .align 2 -_bluegl_glDrawArraysInstancedBaseInstance: - adrp x16, ___blue_glCore_glDrawArraysInstancedBaseInstance@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawArraysInstancedBaseInstance@GOTPAGEOFF] +_bluegl_glWeightusvARB: + adrp x16, ___blue_glCore_glWeightusvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWeightusvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4uivARB +.private_extern _bluegl_glWeightuivARB .align 2 -_bluegl_glVertexAttrib4uivARB: - adrp x16, ___blue_glCore_glVertexAttrib4uivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4uivARB@GOTPAGEOFF] +_bluegl_glWeightuivARB: + adrp x16, ___blue_glCore_glWeightuivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWeightuivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribFormatNV +.private_extern _bluegl_glWeightPointerARB .align 2 -_bluegl_glVertexAttribFormatNV: - adrp x16, ___blue_glCore_glVertexAttribFormatNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribFormatNV@GOTPAGEOFF] +_bluegl_glWeightPointerARB: + adrp x16, ___blue_glCore_glWeightPointerARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWeightPointerARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsQueryARB +.private_extern _bluegl_glVertexBlendARB .align 2 -_bluegl_glIsQueryARB: - adrp x16, ___blue_glCore_glIsQueryARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsQueryARB@GOTPAGEOFF] +_bluegl_glVertexBlendARB: + adrp x16, ___blue_glCore_glVertexBlendARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexBlendARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSampleCoverageARB +.private_extern _bluegl_glBindBufferARB .align 2 -_bluegl_glSampleCoverageARB: - adrp x16, ___blue_glCore_glSampleCoverageARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSampleCoverageARB@GOTPAGEOFF] +_bluegl_glBindBufferARB: + adrp x16, ___blue_glCore_glBindBufferARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindBufferARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnCompressedTexImageARB +.private_extern _bluegl_glDeleteBuffersARB .align 2 -_bluegl_glGetnCompressedTexImageARB: - adrp x16, ___blue_glCore_glGetnCompressedTexImageARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnCompressedTexImageARB@GOTPAGEOFF] +_bluegl_glDeleteBuffersARB: + adrp x16, ___blue_glCore_glDeleteBuffersARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteBuffersARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord3xvOES +.private_extern _bluegl_glGenBuffersARB .align 2 -_bluegl_glTexCoord3xvOES: - adrp x16, ___blue_glCore_glTexCoord3xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord3xvOES@GOTPAGEOFF] +_bluegl_glGenBuffersARB: + adrp x16, ___blue_glCore_glGenBuffersARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenBuffersARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord2fNormal3fVertex3fSUN +.private_extern _bluegl_glIsBufferARB .align 2 -_bluegl_glTexCoord2fNormal3fVertex3fSUN: - adrp x16, ___blue_glCore_glTexCoord2fNormal3fVertex3fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord2fNormal3fVertex3fSUN@GOTPAGEOFF] +_bluegl_glIsBufferARB: + adrp x16, ___blue_glCore_glIsBufferARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsBufferARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetGraphicsResetStatus +.private_extern _bluegl_glBufferDataARB .align 2 -_bluegl_glGetGraphicsResetStatus: - adrp x16, ___blue_glCore_glGetGraphicsResetStatus@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetGraphicsResetStatus@GOTPAGEOFF] +_bluegl_glBufferDataARB: + adrp x16, ___blue_glCore_glBufferDataARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBufferDataARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramVertexLimitNV +.private_extern _bluegl_glBufferSubDataARB .align 2 -_bluegl_glProgramVertexLimitNV: - adrp x16, ___blue_glCore_glProgramVertexLimitNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramVertexLimitNV@GOTPAGEOFF] +_bluegl_glBufferSubDataARB: + adrp x16, ___blue_glCore_glBufferSubDataARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBufferSubDataARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyConvolutionFilter2D +.private_extern _bluegl_glGetBufferSubDataARB .align 2 -_bluegl_glCopyConvolutionFilter2D: - adrp x16, ___blue_glCore_glCopyConvolutionFilter2D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyConvolutionFilter2D@GOTPAGEOFF] +_bluegl_glGetBufferSubDataARB: + adrp x16, ___blue_glCore_glGetBufferSubDataARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetBufferSubDataARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream4fATI +.private_extern _bluegl_glMapBufferARB .align 2 -_bluegl_glVertexStream4fATI: - adrp x16, ___blue_glCore_glVertexStream4fATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream4fATI@GOTPAGEOFF] +_bluegl_glMapBufferARB: + adrp x16, ___blue_glCore_glMapBufferARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMapBufferARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3f +.private_extern _bluegl_glUnmapBufferARB .align 2 -_bluegl_glSecondaryColor3f: - adrp x16, ___blue_glCore_glSecondaryColor3f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3f@GOTPAGEOFF] +_bluegl_glUnmapBufferARB: + adrp x16, ___blue_glCore_glUnmapBufferARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUnmapBufferARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoordP1ui +.private_extern _bluegl_glGetBufferParameterivARB .align 2 -_bluegl_glTexCoordP1ui: - adrp x16, ___blue_glCore_glTexCoordP1ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoordP1ui@GOTPAGEOFF] +_bluegl_glGetBufferParameterivARB: + adrp x16, ___blue_glCore_glGetBufferParameterivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetBufferParameterivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramBufferParametersfvNV +.private_extern _bluegl_glGetBufferPointervARB .align 2 -_bluegl_glProgramBufferParametersfvNV: - adrp x16, ___blue_glCore_glProgramBufferParametersfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramBufferParametersfvNV@GOTPAGEOFF] +_bluegl_glGetBufferPointervARB: + adrp x16, ___blue_glCore_glGetBufferPointervARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetBufferPointervARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord1xOES +.private_extern _bluegl_glVertexAttrib1dARB .align 2 -_bluegl_glTexCoord1xOES: - adrp x16, ___blue_glCore_glTexCoord1xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord1xOES@GOTPAGEOFF] +_bluegl_glVertexAttrib1dARB: + adrp x16, ___blue_glCore_glVertexAttrib1dARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1dARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFogCoordfv +.private_extern _bluegl_glVertexAttrib1dvARB .align 2 -_bluegl_glFogCoordfv: - adrp x16, ___blue_glCore_glFogCoordfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFogCoordfv@GOTPAGEOFF] +_bluegl_glVertexAttrib1dvARB: + adrp x16, ___blue_glCore_glVertexAttrib1dvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1dvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiDrawElementsIndirectAMD +.private_extern _bluegl_glVertexAttrib1fARB .align 2 -_bluegl_glMultiDrawElementsIndirectAMD: - adrp x16, ___blue_glCore_glMultiDrawElementsIndirectAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiDrawElementsIndirectAMD@GOTPAGEOFF] +_bluegl_glVertexAttrib1fARB: + adrp x16, ___blue_glCore_glVertexAttrib1fARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1fARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnMinmaxARB +.private_extern _bluegl_glVertexAttrib1fvARB .align 2 -_bluegl_glGetnMinmaxARB: - adrp x16, ___blue_glCore_glGetnMinmaxARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnMinmaxARB@GOTPAGEOFF] +_bluegl_glVertexAttrib1fvARB: + adrp x16, ___blue_glCore_glVertexAttrib1fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3uivEXT +.private_extern _bluegl_glVertexAttrib1sARB .align 2 -_bluegl_glSecondaryColor3uivEXT: - adrp x16, ___blue_glCore_glSecondaryColor3uivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3uivEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib1sARB: + adrp x16, ___blue_glCore_glVertexAttrib1sARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1sARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorMask +.private_extern _bluegl_glVertexAttrib1svARB .align 2 -_bluegl_glColorMask: - adrp x16, ___blue_glCore_glColorMask@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorMask@GOTPAGEOFF] +_bluegl_glVertexAttrib1svARB: + adrp x16, ___blue_glCore_glVertexAttrib1svARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1svARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureImage2DMultisampleCoverageNV +.private_extern _bluegl_glVertexAttrib2dARB .align 2 -_bluegl_glTextureImage2DMultisampleCoverageNV: - adrp x16, ___blue_glCore_glTextureImage2DMultisampleCoverageNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureImage2DMultisampleCoverageNV@GOTPAGEOFF] +_bluegl_glVertexAttrib2dARB: + adrp x16, ___blue_glCore_glVertexAttrib2dARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2dARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiModeDrawElementsIBM +.private_extern _bluegl_glVertexAttrib2dvARB .align 2 -_bluegl_glMultiModeDrawElementsIBM: - adrp x16, ___blue_glCore_glMultiModeDrawElementsIBM@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiModeDrawElementsIBM@GOTPAGEOFF] +_bluegl_glVertexAttrib2dvARB: + adrp x16, ___blue_glCore_glVertexAttrib2dvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2dvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayAttribLFormat +.private_extern _bluegl_glVertexAttrib2fARB .align 2 -_bluegl_glVertexArrayAttribLFormat: - adrp x16, ___blue_glCore_glVertexArrayAttribLFormat@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayAttribLFormat@GOTPAGEOFF] +_bluegl_glVertexAttrib2fARB: + adrp x16, ___blue_glCore_glVertexAttrib2fARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2fARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindFragDataLocationIndexed +.private_extern _bluegl_glVertexAttrib2fvARB .align 2 -_bluegl_glBindFragDataLocationIndexed: - adrp x16, ___blue_glCore_glBindFragDataLocationIndexed@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindFragDataLocationIndexed@GOTPAGEOFF] +_bluegl_glVertexAttrib2fvARB: + adrp x16, ___blue_glCore_glVertexAttrib2fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedBufferParameterivEXT +.private_extern _bluegl_glVertexAttrib2sARB .align 2 -_bluegl_glGetNamedBufferParameterivEXT: - adrp x16, ___blue_glCore_glGetNamedBufferParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedBufferParameterivEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib2sARB: + adrp x16, ___blue_glCore_glVertexAttrib2sARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2sARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3bEXT +.private_extern _bluegl_glVertexAttrib2svARB .align 2 -_bluegl_glSecondaryColor3bEXT: - adrp x16, ___blue_glCore_glSecondaryColor3bEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3bEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib2svARB: + adrp x16, ___blue_glCore_glVertexAttrib2svARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2svARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1fNV +.private_extern _bluegl_glVertexAttrib3dARB .align 2 -_bluegl_glVertexAttrib1fNV: - adrp x16, ___blue_glCore_glVertexAttrib1fNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1fNV@GOTPAGEOFF] +_bluegl_glVertexAttrib3dARB: + adrp x16, ___blue_glCore_glVertexAttrib3dARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3dARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI4uivEXT +.private_extern _bluegl_glVertexAttrib3dvARB .align 2 -_bluegl_glVertexAttribI4uivEXT: - adrp x16, ___blue_glCore_glVertexAttribI4uivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI4uivEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib3dvARB: + adrp x16, ___blue_glCore_glVertexAttrib3dvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3dvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetQueryObjecti64vEXT +.private_extern _bluegl_glVertexAttrib3fARB .align 2 -_bluegl_glGetQueryObjecti64vEXT: - adrp x16, ___blue_glCore_glGetQueryObjecti64vEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetQueryObjecti64vEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib3fARB: + adrp x16, ___blue_glCore_glVertexAttrib3fARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3fARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormalStream3bATI +.private_extern _bluegl_glVertexAttrib3fvARB .align 2 -_bluegl_glNormalStream3bATI: - adrp x16, ___blue_glCore_glNormalStream3bATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormalStream3bATI@GOTPAGEOFF] +_bluegl_glVertexAttrib3fvARB: + adrp x16, ___blue_glCore_glVertexAttrib3fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetObjectParameterivAPPLE +.private_extern _bluegl_glVertexAttrib3sARB .align 2 -_bluegl_glGetObjectParameterivAPPLE: - adrp x16, ___blue_glCore_glGetObjectParameterivAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetObjectParameterivAPPLE@GOTPAGEOFF] +_bluegl_glVertexAttrib3sARB: + adrp x16, ___blue_glCore_glVertexAttrib3sARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3sARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3uivEXT +.private_extern _bluegl_glVertexAttrib3svARB .align 2 -_bluegl_glProgramUniform3uivEXT: - adrp x16, ___blue_glCore_glProgramUniform3uivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3uivEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib3svARB: + adrp x16, ___blue_glCore_glVertexAttrib3svARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3svARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformHandleui64ARB +.private_extern _bluegl_glVertexAttrib4NbvARB .align 2 -_bluegl_glProgramUniformHandleui64ARB: - adrp x16, ___blue_glCore_glProgramUniformHandleui64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformHandleui64ARB@GOTPAGEOFF] +_bluegl_glVertexAttrib4NbvARB: + adrp x16, ___blue_glCore_glVertexAttrib4NbvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4NbvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPointerv +.private_extern _bluegl_glVertexAttrib4NivARB .align 2 -_bluegl_glGetPointerv: - adrp x16, ___blue_glCore_glGetPointerv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPointerv@GOTPAGEOFF] +_bluegl_glVertexAttrib4NivARB: + adrp x16, ___blue_glCore_glVertexAttrib4NivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4NivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix4x3dv +.private_extern _bluegl_glVertexAttrib4NsvARB .align 2 -_bluegl_glUniformMatrix4x3dv: - adrp x16, ___blue_glCore_glUniformMatrix4x3dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix4x3dv@GOTPAGEOFF] +_bluegl_glVertexAttrib4NsvARB: + adrp x16, ___blue_glCore_glVertexAttrib4NsvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4NsvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoordP4uiv +.private_extern _bluegl_glVertexAttrib4NubARB .align 2 -_bluegl_glTexCoordP4uiv: - adrp x16, ___blue_glCore_glTexCoordP4uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoordP4uiv@GOTPAGEOFF] +_bluegl_glVertexAttrib4NubARB: + adrp x16, ___blue_glCore_glVertexAttrib4NubARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4NubARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI4sv +.private_extern _bluegl_glVertexAttrib4NubvARB .align 2 -_bluegl_glVertexAttribI4sv: - adrp x16, ___blue_glCore_glVertexAttribI4sv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI4sv@GOTPAGEOFF] +_bluegl_glVertexAttrib4NubvARB: + adrp x16, ___blue_glCore_glVertexAttrib4NubvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4NubvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFlushMappedNamedBufferRangeEXT +.private_extern _bluegl_glVertexAttrib4NuivARB .align 2 -_bluegl_glFlushMappedNamedBufferRangeEXT: - adrp x16, ___blue_glCore_glFlushMappedNamedBufferRangeEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFlushMappedNamedBufferRangeEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib4NuivARB: + adrp x16, ___blue_glCore_glVertexAttrib4NuivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4NuivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDisableVertexArrayEXT +.private_extern _bluegl_glVertexAttrib4NusvARB .align 2 -_bluegl_glDisableVertexArrayEXT: - adrp x16, ___blue_glCore_glDisableVertexArrayEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDisableVertexArrayEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib4NusvARB: + adrp x16, ___blue_glCore_glVertexAttrib4NusvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4NusvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPathDashArrayNV +.private_extern _bluegl_glVertexAttrib4bvARB .align 2 -_bluegl_glGetPathDashArrayNV: - adrp x16, ___blue_glCore_glGetPathDashArrayNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPathDashArrayNV@GOTPAGEOFF] +_bluegl_glVertexAttrib4bvARB: + adrp x16, ___blue_glCore_glVertexAttrib4bvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4bvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2uiEXT +.private_extern _bluegl_glVertexAttrib4dARB .align 2 -_bluegl_glProgramUniform2uiEXT: - adrp x16, ___blue_glCore_glProgramUniform2uiEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2uiEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib4dARB: + adrp x16, ___blue_glCore_glVertexAttrib4dARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4dARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindImageTextures +.private_extern _bluegl_glVertexAttrib4dvARB .align 2 -_bluegl_glBindImageTextures: - adrp x16, ___blue_glCore_glBindImageTextures@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindImageTextures@GOTPAGEOFF] +_bluegl_glVertexAttrib4dvARB: + adrp x16, ___blue_glCore_glVertexAttrib4dvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4dvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4sNV +.private_extern _bluegl_glVertexAttrib4fARB .align 2 -_bluegl_glVertexAttrib4sNV: - adrp x16, ___blue_glCore_glVertexAttrib4sNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4sNV@GOTPAGEOFF] +_bluegl_glVertexAttrib4fARB: + adrp x16, ___blue_glCore_glVertexAttrib4fARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4fARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeuiNormal3fVertex3fvSUN +.private_extern _bluegl_glVertexAttrib4fvARB .align 2 -_bluegl_glReplacementCodeuiNormal3fVertex3fvSUN: - adrp x16, ___blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN@GOTPAGEOFF] +_bluegl_glVertexAttrib4fvARB: + adrp x16, ___blue_glCore_glVertexAttrib4fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertex3hNV +.private_extern _bluegl_glVertexAttrib4ivARB .align 2 -_bluegl_glVertex3hNV: - adrp x16, ___blue_glCore_glVertex3hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertex3hNV@GOTPAGEOFF] +_bluegl_glVertexAttrib4ivARB: + adrp x16, ___blue_glCore_glVertexAttrib4ivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4ivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN +.private_extern _bluegl_glVertexAttrib4sARB .align 2 -_bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN: - adrp x16, ___blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN@GOTPAGEOFF] +_bluegl_glVertexAttrib4sARB: + adrp x16, ___blue_glCore_glVertexAttrib4sARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4sARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2i64NV +.private_extern _bluegl_glVertexAttrib4svARB .align 2 -_bluegl_glProgramUniform2i64NV: - adrp x16, ___blue_glCore_glProgramUniform2i64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2i64NV@GOTPAGEOFF] +_bluegl_glVertexAttrib4svARB: + adrp x16, ___blue_glCore_glVertexAttrib4svARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4svARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBufferData +.private_extern _bluegl_glVertexAttrib4ubvARB .align 2 -_bluegl_glBufferData: - adrp x16, ___blue_glCore_glBufferData@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBufferData@GOTPAGEOFF] +_bluegl_glVertexAttrib4ubvARB: + adrp x16, ___blue_glCore_glVertexAttrib4ubvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4ubvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetBufferParameteriv +.private_extern _bluegl_glVertexAttrib4uivARB .align 2 -_bluegl_glGetBufferParameteriv: - adrp x16, ___blue_glCore_glGetBufferParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetBufferParameteriv@GOTPAGEOFF] +_bluegl_glVertexAttrib4uivARB: + adrp x16, ___blue_glCore_glVertexAttrib4uivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4uivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsAsyncMarkerSGIX +.private_extern _bluegl_glVertexAttrib4usvARB .align 2 -_bluegl_glIsAsyncMarkerSGIX: - adrp x16, ___blue_glCore_glIsAsyncMarkerSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsAsyncMarkerSGIX@GOTPAGEOFF] +_bluegl_glVertexAttrib4usvARB: + adrp x16, ___blue_glCore_glVertexAttrib4usvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4usvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexImage4DSGIS +.private_extern _bluegl_glVertexAttribPointerARB .align 2 -_bluegl_glTexImage4DSGIS: - adrp x16, ___blue_glCore_glTexImage4DSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexImage4DSGIS@GOTPAGEOFF] +_bluegl_glVertexAttribPointerARB: + adrp x16, ___blue_glCore_glVertexAttribPointerARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribPointerARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMultiTexEnvivEXT +.private_extern _bluegl_glEnableVertexAttribArrayARB .align 2 -_bluegl_glGetMultiTexEnvivEXT: - adrp x16, ___blue_glCore_glGetMultiTexEnvivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMultiTexEnvivEXT@GOTPAGEOFF] +_bluegl_glEnableVertexAttribArrayARB: + adrp x16, ___blue_glCore_glEnableVertexAttribArrayARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEnableVertexAttribArrayARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetClipPlanexOES +.private_extern _bluegl_glDisableVertexAttribArrayARB .align 2 -_bluegl_glGetClipPlanexOES: - adrp x16, ___blue_glCore_glGetClipPlanexOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetClipPlanexOES@GOTPAGEOFF] +_bluegl_glDisableVertexAttribArrayARB: + adrp x16, ___blue_glCore_glDisableVertexAttribArrayARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDisableVertexAttribArrayARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3uiEXT +.private_extern _bluegl_glGetVertexAttribdvARB .align 2 -_bluegl_glUniform3uiEXT: - adrp x16, ___blue_glCore_glUniform3uiEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3uiEXT@GOTPAGEOFF] +_bluegl_glGetVertexAttribdvARB: + adrp x16, ___blue_glCore_glGetVertexAttribdvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribdvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3sv +.private_extern _bluegl_glGetVertexAttribfvARB .align 2 -_bluegl_glMultiTexCoord3sv: - adrp x16, ___blue_glCore_glMultiTexCoord3sv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3sv@GOTPAGEOFF] +_bluegl_glGetVertexAttribfvARB: + adrp x16, ___blue_glCore_glGetVertexAttribfvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribfvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribs1hvNV +.private_extern _bluegl_glGetVertexAttribivARB .align 2 -_bluegl_glVertexAttribs1hvNV: - adrp x16, ___blue_glCore_glVertexAttribs1hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribs1hvNV@GOTPAGEOFF] +_bluegl_glGetVertexAttribivARB: + adrp x16, ___blue_glCore_glGetVertexAttribivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPerfQueryInfoINTEL +.private_extern _bluegl_glGetVertexAttribPointervARB .align 2 -_bluegl_glGetPerfQueryInfoINTEL: - adrp x16, ___blue_glCore_glGetPerfQueryInfoINTEL@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPerfQueryInfoINTEL@GOTPAGEOFF] +_bluegl_glGetVertexAttribPointervARB: + adrp x16, ___blue_glCore_glGetVertexAttribPointervARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribPointervARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetClipPlanefOES +.private_extern _bluegl_glBindAttribLocationARB .align 2 -_bluegl_glGetClipPlanefOES: - adrp x16, ___blue_glCore_glGetClipPlanefOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetClipPlanefOES@GOTPAGEOFF] +_bluegl_glBindAttribLocationARB: + adrp x16, ___blue_glCore_glBindAttribLocationARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindAttribLocationARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3ubEXT +.private_extern _bluegl_glGetActiveAttribARB .align 2 -_bluegl_glSecondaryColor3ubEXT: - adrp x16, ___blue_glCore_glSecondaryColor3ubEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3ubEXT@GOTPAGEOFF] +_bluegl_glGetActiveAttribARB: + adrp x16, ___blue_glCore_glGetActiveAttribARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetActiveAttribARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSyncTextureINTEL +.private_extern _bluegl_glGetAttribLocationARB .align 2 -_bluegl_glSyncTextureINTEL: - adrp x16, ___blue_glCore_glSyncTextureINTEL@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSyncTextureINTEL@GOTPAGEOFF] +_bluegl_glGetAttribLocationARB: + adrp x16, ___blue_glCore_glGetAttribLocationARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetAttribLocationARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix3x2dv +.private_extern _bluegl_glWindowPos2dARB .align 2 -_bluegl_glProgramUniformMatrix3x2dv: - adrp x16, ___blue_glCore_glProgramUniformMatrix3x2dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3x2dv@GOTPAGEOFF] +_bluegl_glWindowPos2dARB: + adrp x16, ___blue_glCore_glWindowPos2dARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2dARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix4x2fv +.private_extern _bluegl_glWindowPos2dvARB .align 2 -_bluegl_glUniformMatrix4x2fv: - adrp x16, ___blue_glCore_glUniformMatrix4x2fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix4x2fv@GOTPAGEOFF] +_bluegl_glWindowPos2dvARB: + adrp x16, ___blue_glCore_glWindowPos2dvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2dvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureBufferEXT +.private_extern _bluegl_glWindowPos2fARB .align 2 -_bluegl_glTextureBufferEXT: - adrp x16, ___blue_glCore_glTextureBufferEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureBufferEXT@GOTPAGEOFF] +_bluegl_glWindowPos2fARB: + adrp x16, ___blue_glCore_glWindowPos2fARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2fARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexPointervINTEL +.private_extern _bluegl_glWindowPos2fvARB .align 2 -_bluegl_glVertexPointervINTEL: - adrp x16, ___blue_glCore_glVertexPointervINTEL@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexPointervINTEL@GOTPAGEOFF] +_bluegl_glWindowPos2fvARB: + adrp x16, ___blue_glCore_glWindowPos2fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetShaderPrecisionFormat +.private_extern _bluegl_glWindowPos2iARB .align 2 -_bluegl_glGetShaderPrecisionFormat: - adrp x16, ___blue_glCore_glGetShaderPrecisionFormat@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetShaderPrecisionFormat@GOTPAGEOFF] +_bluegl_glWindowPos2iARB: + adrp x16, ___blue_glCore_glWindowPos2iARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2iARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureImage +.private_extern _bluegl_glWindowPos2ivARB .align 2 -_bluegl_glGetTextureImage: - adrp x16, ___blue_glCore_glGetTextureImage@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureImage@GOTPAGEOFF] +_bluegl_glWindowPos2ivARB: + adrp x16, ___blue_glCore_glWindowPos2ivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2ivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3ivARB +.private_extern _bluegl_glWindowPos2sARB .align 2 -_bluegl_glUniform3ivARB: - adrp x16, ___blue_glCore_glUniform3ivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3ivARB@GOTPAGEOFF] +_bluegl_glWindowPos2sARB: + adrp x16, ___blue_glCore_glWindowPos2sARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2sARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferParameteri +.private_extern _bluegl_glWindowPos2svARB .align 2 -_bluegl_glFramebufferParameteri: - adrp x16, ___blue_glCore_glFramebufferParameteri@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferParameteri@GOTPAGEOFF] +_bluegl_glWindowPos2svARB: + adrp x16, ___blue_glCore_glWindowPos2svARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2svARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPointParameterxvOES +.private_extern _bluegl_glWindowPos3dARB .align 2 -_bluegl_glPointParameterxvOES: - adrp x16, ___blue_glCore_glPointParameterxvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPointParameterxvOES@GOTPAGEOFF] +_bluegl_glWindowPos3dARB: + adrp x16, ___blue_glCore_glWindowPos3dARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3dARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendFunci +.private_extern _bluegl_glWindowPos3dvARB .align 2 -_bluegl_glBlendFunci: - adrp x16, ___blue_glCore_glBlendFunci@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendFunci@GOTPAGEOFF] +_bluegl_glWindowPos3dvARB: + adrp x16, ___blue_glCore_glWindowPos3dvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3dvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix2x3dv +.private_extern _bluegl_glWindowPos3fARB .align 2 -_bluegl_glUniformMatrix2x3dv: - adrp x16, ___blue_glCore_glUniformMatrix2x3dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix2x3dv@GOTPAGEOFF] +_bluegl_glWindowPos3fARB: + adrp x16, ___blue_glCore_glWindowPos3fARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3fARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2i64ARB +.private_extern _bluegl_glWindowPos3fvARB .align 2 -_bluegl_glUniform2i64ARB: - adrp x16, ___blue_glCore_glUniform2i64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2i64ARB@GOTPAGEOFF] +_bluegl_glWindowPos3fvARB: + adrp x16, ___blue_glCore_glWindowPos3fvARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3fvARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramEnvParameterI4ivNV +.private_extern _bluegl_glWindowPos3iARB .align 2 -_bluegl_glProgramEnvParameterI4ivNV: - adrp x16, ___blue_glCore_glProgramEnvParameterI4ivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramEnvParameterI4ivNV@GOTPAGEOFF] +_bluegl_glWindowPos3iARB: + adrp x16, ___blue_glCore_glWindowPos3iARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3iARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFragmentLightModelivSGIX +.private_extern _bluegl_glWindowPos3ivARB .align 2 -_bluegl_glFragmentLightModelivSGIX: - adrp x16, ___blue_glCore_glFragmentLightModelivSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFragmentLightModelivSGIX@GOTPAGEOFF] +_bluegl_glWindowPos3ivARB: + adrp x16, ___blue_glCore_glWindowPos3ivARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3ivARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4ui64vARB +.private_extern _bluegl_glWindowPos3sARB .align 2 -_bluegl_glProgramUniform4ui64vARB: - adrp x16, ___blue_glCore_glProgramUniform4ui64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4ui64vARB@GOTPAGEOFF] +_bluegl_glWindowPos3sARB: + adrp x16, ___blue_glCore_glWindowPos3sARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3sARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix2x3fvEXT +.private_extern _bluegl_glWindowPos3svARB .align 2 -_bluegl_glProgramUniformMatrix2x3fvEXT: - adrp x16, ___blue_glCore_glProgramUniformMatrix2x3fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2x3fvEXT@GOTPAGEOFF] +_bluegl_glWindowPos3svARB: + adrp x16, ___blue_glCore_glWindowPos3svARB@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3svARB@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStencilClearTagEXT +.private_extern _bluegl_glBlendBarrierKHR .align 2 -_bluegl_glStencilClearTagEXT: - adrp x16, ___blue_glCore_glStencilClearTagEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStencilClearTagEXT@GOTPAGEOFF] +_bluegl_glBlendBarrierKHR: + adrp x16, ___blue_glCore_glBlendBarrierKHR@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendBarrierKHR@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4s +.private_extern _bluegl_glMultiTexCoord1bOES .align 2 -_bluegl_glMultiTexCoord4s: - adrp x16, ___blue_glCore_glMultiTexCoord4s@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4s@GOTPAGEOFF] +_bluegl_glMultiTexCoord1bOES: + adrp x16, ___blue_glCore_glMultiTexCoord1bOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1bOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix4dvEXT +.private_extern _bluegl_glMultiTexCoord1bvOES .align 2 -_bluegl_glProgramUniformMatrix4dvEXT: - adrp x16, ___blue_glCore_glProgramUniformMatrix4dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4dvEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoord1bvOES: + adrp x16, ___blue_glCore_glMultiTexCoord1bvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1bvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedBufferParameteri64v +.private_extern _bluegl_glMultiTexCoord2bOES .align 2 -_bluegl_glGetNamedBufferParameteri64v: - adrp x16, ___blue_glCore_glGetNamedBufferParameteri64v@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedBufferParameteri64v@GOTPAGEOFF] +_bluegl_glMultiTexCoord2bOES: + adrp x16, ___blue_glCore_glMultiTexCoord2bOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2bOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI3iEXT +.private_extern _bluegl_glMultiTexCoord2bvOES .align 2 -_bluegl_glVertexAttribI3iEXT: - adrp x16, ___blue_glCore_glVertexAttribI3iEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI3iEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoord2bvOES: + adrp x16, ___blue_glCore_glMultiTexCoord2bvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2bvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeuivSUN +.private_extern _bluegl_glMultiTexCoord3bOES .align 2 -_bluegl_glReplacementCodeuivSUN: - adrp x16, ___blue_glCore_glReplacementCodeuivSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeuivSUN@GOTPAGEOFF] +_bluegl_glMultiTexCoord3bOES: + adrp x16, ___blue_glCore_glMultiTexCoord3bOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3bOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFragmentLightModeliSGIX +.private_extern _bluegl_glMultiTexCoord3bvOES .align 2 -_bluegl_glFragmentLightModeliSGIX: - adrp x16, ___blue_glCore_glFragmentLightModeliSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFragmentLightModeliSGIX@GOTPAGEOFF] +_bluegl_glMultiTexCoord3bvOES: + adrp x16, ___blue_glCore_glMultiTexCoord3bvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3bvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2i64vNV +.private_extern _bluegl_glMultiTexCoord4bOES .align 2 -_bluegl_glUniform2i64vNV: - adrp x16, ___blue_glCore_glUniform2i64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2i64vNV@GOTPAGEOFF] +_bluegl_glMultiTexCoord4bOES: + adrp x16, ___blue_glCore_glMultiTexCoord4bOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4bOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPointParameterivNV +.private_extern _bluegl_glMultiTexCoord4bvOES .align 2 -_bluegl_glPointParameterivNV: - adrp x16, ___blue_glCore_glPointParameterivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPointParameterivNV@GOTPAGEOFF] +_bluegl_glMultiTexCoord4bvOES: + adrp x16, ___blue_glCore_glMultiTexCoord4bvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4bvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStencilStrokePathInstancedNV +.private_extern _bluegl_glTexCoord1bOES .align 2 -_bluegl_glStencilStrokePathInstancedNV: - adrp x16, ___blue_glCore_glStencilStrokePathInstancedNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStencilStrokePathInstancedNV@GOTPAGEOFF] +_bluegl_glTexCoord1bOES: + adrp x16, ___blue_glCore_glTexCoord1bOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord1bOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glInsertComponentEXT +.private_extern _bluegl_glTexCoord1bvOES .align 2 -_bluegl_glInsertComponentEXT: - adrp x16, ___blue_glCore_glInsertComponentEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glInsertComponentEXT@GOTPAGEOFF] +_bluegl_glTexCoord1bvOES: + adrp x16, ___blue_glCore_glTexCoord1bvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord1bvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsEnabled +.private_extern _bluegl_glTexCoord2bOES .align 2 -_bluegl_glIsEnabled: - adrp x16, ___blue_glCore_glIsEnabled@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsEnabled@GOTPAGEOFF] +_bluegl_glTexCoord2bOES: + adrp x16, ___blue_glCore_glTexCoord2bOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord2bOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3dMESA +.private_extern _bluegl_glTexCoord2bvOES .align 2 -_bluegl_glWindowPos3dMESA: - adrp x16, ___blue_glCore_glWindowPos3dMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3dMESA@GOTPAGEOFF] +_bluegl_glTexCoord2bvOES: + adrp x16, ___blue_glCore_glTexCoord2bvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord2bvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnCompressedTexImage +.private_extern _bluegl_glTexCoord3bOES .align 2 -_bluegl_glGetnCompressedTexImage: - adrp x16, ___blue_glCore_glGetnCompressedTexImage@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnCompressedTexImage@GOTPAGEOFF] +_bluegl_glTexCoord3bOES: + adrp x16, ___blue_glCore_glTexCoord3bOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord3bOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyMultiTexSubImage2DEXT +.private_extern _bluegl_glTexCoord3bvOES .align 2 -_bluegl_glCopyMultiTexSubImage2DEXT: - adrp x16, ___blue_glCore_glCopyMultiTexSubImage2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyMultiTexSubImage2DEXT@GOTPAGEOFF] +_bluegl_glTexCoord3bvOES: + adrp x16, ___blue_glCore_glTexCoord3bvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord3bvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDisableIndexedEXT +.private_extern _bluegl_glTexCoord4bOES .align 2 -_bluegl_glDisableIndexedEXT: - adrp x16, ___blue_glCore_glDisableIndexedEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDisableIndexedEXT@GOTPAGEOFF] +_bluegl_glTexCoord4bOES: + adrp x16, ___blue_glCore_glTexCoord4bOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord4bOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2dv +.private_extern _bluegl_glTexCoord4bvOES .align 2 -_bluegl_glWindowPos2dv: - adrp x16, ___blue_glCore_glWindowPos2dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2dv@GOTPAGEOFF] +_bluegl_glTexCoord4bvOES: + adrp x16, ___blue_glCore_glTexCoord4bvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord4bvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glAlphaFuncxOES +.private_extern _bluegl_glVertex2bOES .align 2 -_bluegl_glAlphaFuncxOES: - adrp x16, ___blue_glCore_glAlphaFuncxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glAlphaFuncxOES@GOTPAGEOFF] +_bluegl_glVertex2bOES: + adrp x16, ___blue_glCore_glVertex2bOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertex2bOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreateFramebuffers +.private_extern _bluegl_glVertex2bvOES .align 2 -_bluegl_glCreateFramebuffers: - adrp x16, ___blue_glCore_glCreateFramebuffers@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreateFramebuffers@GOTPAGEOFF] +_bluegl_glVertex2bvOES: + adrp x16, ___blue_glCore_glVertex2bvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertex2bvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetAttribLocationARB +.private_extern _bluegl_glVertex3bOES .align 2 -_bluegl_glGetAttribLocationARB: - adrp x16, ___blue_glCore_glGetAttribLocationARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetAttribLocationARB@GOTPAGEOFF] +_bluegl_glVertex3bOES: + adrp x16, ___blue_glCore_glVertex3bOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertex3bOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1sARB +.private_extern _bluegl_glVertex3bvOES .align 2 -_bluegl_glVertexAttrib1sARB: - adrp x16, ___blue_glCore_glVertexAttrib1sARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1sARB@GOTPAGEOFF] +_bluegl_glVertex3bvOES: + adrp x16, ___blue_glCore_glVertex3bvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertex3bvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexBumpParameterfvATI +.private_extern _bluegl_glVertex4bOES .align 2 -_bluegl_glTexBumpParameterfvATI: - adrp x16, ___blue_glCore_glTexBumpParameterfvATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexBumpParameterfvATI@GOTPAGEOFF] +_bluegl_glVertex4bOES: + adrp x16, ___blue_glCore_glVertex4bOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertex4bOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetActiveSubroutineUniformiv +.private_extern _bluegl_glVertex4bvOES .align 2 -_bluegl_glGetActiveSubroutineUniformiv: - adrp x16, ___blue_glCore_glGetActiveSubroutineUniformiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetActiveSubroutineUniformiv@GOTPAGEOFF] +_bluegl_glVertex4bvOES: + adrp x16, ___blue_glCore_glVertex4bvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertex4bvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2fARB +.private_extern _bluegl_glAlphaFuncxOES .align 2 -_bluegl_glVertexAttrib2fARB: - adrp x16, ___blue_glCore_glVertexAttrib2fARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2fARB@GOTPAGEOFF] +_bluegl_glAlphaFuncxOES: + adrp x16, ___blue_glCore_glAlphaFuncxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glAlphaFuncxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTransformFeedbacki64_v +.private_extern _bluegl_glClearColorxOES .align 2 -_bluegl_glGetTransformFeedbacki64_v: - adrp x16, ___blue_glCore_glGetTransformFeedbacki64_v@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTransformFeedbacki64_v@GOTPAGEOFF] +_bluegl_glClearColorxOES: + adrp x16, ___blue_glCore_glClearColorxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearColorxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4hvNV +.private_extern _bluegl_glClearDepthxOES .align 2 -_bluegl_glMultiTexCoord4hvNV: - adrp x16, ___blue_glCore_glMultiTexCoord4hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4hvNV@GOTPAGEOFF] +_bluegl_glClearDepthxOES: + adrp x16, ___blue_glCore_glClearDepthxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearDepthxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendColorEXT +.private_extern _bluegl_glClipPlanexOES .align 2 -_bluegl_glBlendColorEXT: - adrp x16, ___blue_glCore_glBlendColorEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendColorEXT@GOTPAGEOFF] +_bluegl_glClipPlanexOES: + adrp x16, ___blue_glCore_glClipPlanexOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClipPlanexOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTexSubImage3D +.private_extern _bluegl_glColor4xOES .align 2 -_bluegl_glCompressedTexSubImage3D: - adrp x16, ___blue_glCore_glCompressedTexSubImage3D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTexSubImage3D@GOTPAGEOFF] +_bluegl_glColor4xOES: + adrp x16, ___blue_glCore_glColor4xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColor4xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream4dvATI +.private_extern _bluegl_glDepthRangexOES .align 2 -_bluegl_glVertexStream4dvATI: - adrp x16, ___blue_glCore_glVertexStream4dvATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream4dvATI@GOTPAGEOFF] +_bluegl_glDepthRangexOES: + adrp x16, ___blue_glCore_glDepthRangexOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDepthRangexOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMaxShaderCompilerThreadsARB +.private_extern _bluegl_glFogxOES .align 2 -_bluegl_glMaxShaderCompilerThreadsARB: - adrp x16, ___blue_glCore_glMaxShaderCompilerThreadsARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMaxShaderCompilerThreadsARB@GOTPAGEOFF] +_bluegl_glFogxOES: + adrp x16, ___blue_glCore_glFogxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFogxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGlobalAlphaFactorbSUN +.private_extern _bluegl_glFogxvOES .align 2 -_bluegl_glGlobalAlphaFactorbSUN: - adrp x16, ___blue_glCore_glGlobalAlphaFactorbSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGlobalAlphaFactorbSUN@GOTPAGEOFF] +_bluegl_glFogxvOES: + adrp x16, ___blue_glCore_glFogxvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFogxvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGlobalAlphaFactoruiSUN +.private_extern _bluegl_glFrustumxOES .align 2 -_bluegl_glGlobalAlphaFactoruiSUN: - adrp x16, ___blue_glCore_glGlobalAlphaFactoruiSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGlobalAlphaFactoruiSUN@GOTPAGEOFF] +_bluegl_glFrustumxOES: + adrp x16, ___blue_glCore_glFrustumxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFrustumxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClientActiveTextureARB +.private_extern _bluegl_glGetClipPlanexOES .align 2 -_bluegl_glClientActiveTextureARB: - adrp x16, ___blue_glCore_glClientActiveTextureARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClientActiveTextureARB@GOTPAGEOFF] +_bluegl_glGetClipPlanexOES: + adrp x16, ___blue_glCore_glGetClipPlanexOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetClipPlanexOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenProgramsARB +.private_extern _bluegl_glGetFixedvOES .align 2 -_bluegl_glGenProgramsARB: - adrp x16, ___blue_glCore_glGenProgramsARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenProgramsARB@GOTPAGEOFF] +_bluegl_glGetFixedvOES: + adrp x16, ___blue_glCore_glGetFixedvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFixedvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTexParameterPointervAPPLE +.private_extern _bluegl_glGetTexEnvxvOES .align 2 -_bluegl_glGetTexParameterPointervAPPLE: - adrp x16, ___blue_glCore_glGetTexParameterPointervAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTexParameterPointervAPPLE@GOTPAGEOFF] +_bluegl_glGetTexEnvxvOES: + adrp x16, ___blue_glCore_glGetTexEnvxvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTexEnvxvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetBooleanv +.private_extern _bluegl_glGetTexParameterxvOES .align 2 -_bluegl_glGetBooleanv: - adrp x16, ___blue_glCore_glGetBooleanv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetBooleanv@GOTPAGEOFF] +_bluegl_glGetTexParameterxvOES: + adrp x16, ___blue_glCore_glGetTexParameterxvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTexParameterxvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawElementsBaseVertex +.private_extern _bluegl_glLightModelxOES .align 2 -_bluegl_glDrawElementsBaseVertex: - adrp x16, ___blue_glCore_glDrawElementsBaseVertex@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawElementsBaseVertex@GOTPAGEOFF] +_bluegl_glLightModelxOES: + adrp x16, ___blue_glCore_glLightModelxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLightModelxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL4ui64vNV +.private_extern _bluegl_glLightModelxvOES .align 2 -_bluegl_glVertexAttribL4ui64vNV: - adrp x16, ___blue_glCore_glVertexAttribL4ui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL4ui64vNV@GOTPAGEOFF] +_bluegl_glLightModelxvOES: + adrp x16, ___blue_glCore_glLightModelxvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLightModelxvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3fvEXT +.private_extern _bluegl_glLightxOES .align 2 -_bluegl_glSecondaryColor3fvEXT: - adrp x16, ___blue_glCore_glSecondaryColor3fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3fvEXT@GOTPAGEOFF] +_bluegl_glLightxOES: + adrp x16, ___blue_glCore_glLightxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLightxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1s +.private_extern _bluegl_glLightxvOES .align 2 -_bluegl_glMultiTexCoord1s: - adrp x16, ___blue_glCore_glMultiTexCoord1s@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1s@GOTPAGEOFF] +_bluegl_glLightxvOES: + adrp x16, ___blue_glCore_glLightxvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLightxvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteProgramsARB +.private_extern _bluegl_glLineWidthxOES .align 2 -_bluegl_glDeleteProgramsARB: - adrp x16, ___blue_glCore_glDeleteProgramsARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteProgramsARB@GOTPAGEOFF] +_bluegl_glLineWidthxOES: + adrp x16, ___blue_glCore_glLineWidthxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLineWidthxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawElementsInstancedBaseVertex +.private_extern _bluegl_glLoadMatrixxOES .align 2 -_bluegl_glDrawElementsInstancedBaseVertex: - adrp x16, ___blue_glCore_glDrawElementsInstancedBaseVertex@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawElementsInstancedBaseVertex@GOTPAGEOFF] +_bluegl_glLoadMatrixxOES: + adrp x16, ___blue_glCore_glLoadMatrixxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLoadMatrixxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4dEXT +.private_extern _bluegl_glMaterialxOES .align 2 -_bluegl_glProgramUniform4dEXT: - adrp x16, ___blue_glCore_glProgramUniform4dEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4dEXT@GOTPAGEOFF] +_bluegl_glMaterialxOES: + adrp x16, ___blue_glCore_glMaterialxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMaterialxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPathMetricRangeNV +.private_extern _bluegl_glMaterialxvOES .align 2 -_bluegl_glGetPathMetricRangeNV: - adrp x16, ___blue_glCore_glGetPathMetricRangeNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPathMetricRangeNV@GOTPAGEOFF] +_bluegl_glMaterialxvOES: + adrp x16, ___blue_glCore_glMaterialxvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMaterialxvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3iEXT +.private_extern _bluegl_glMultMatrixxOES .align 2 -_bluegl_glProgramUniform3iEXT: - adrp x16, ___blue_glCore_glProgramUniform3iEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3iEXT@GOTPAGEOFF] +_bluegl_glMultMatrixxOES: + adrp x16, ___blue_glCore_glMultMatrixxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultMatrixxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteBuffers +.private_extern _bluegl_glMultiTexCoord4xOES .align 2 -_bluegl_glDeleteBuffers: - adrp x16, ___blue_glCore_glDeleteBuffers@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteBuffers@GOTPAGEOFF] +_bluegl_glMultiTexCoord4xOES: + adrp x16, ___blue_glCore_glMultiTexCoord4xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3usEXT +.private_extern _bluegl_glNormal3xOES .align 2 -_bluegl_glSecondaryColor3usEXT: - adrp x16, ___blue_glCore_glSecondaryColor3usEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3usEXT@GOTPAGEOFF] +_bluegl_glNormal3xOES: + adrp x16, ___blue_glCore_glNormal3xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormal3xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDepthMask +.private_extern _bluegl_glOrthoxOES .align 2 -_bluegl_glDepthMask: - adrp x16, ___blue_glCore_glDepthMask@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDepthMask@GOTPAGEOFF] +_bluegl_glOrthoxOES: + adrp x16, ___blue_glCore_glOrthoxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glOrthoxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2dv +.private_extern _bluegl_glPointParameterxvOES .align 2 -_bluegl_glMultiTexCoord2dv: - adrp x16, ___blue_glCore_glMultiTexCoord2dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2dv@GOTPAGEOFF] +_bluegl_glPointParameterxvOES: + adrp x16, ___blue_glCore_glPointParameterxvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPointParameterxvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyConvolutionFilter2DEXT +.private_extern _bluegl_glPointSizexOES .align 2 -_bluegl_glCopyConvolutionFilter2DEXT: - adrp x16, ___blue_glCore_glCopyConvolutionFilter2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyConvolutionFilter2DEXT@GOTPAGEOFF] +_bluegl_glPointSizexOES: + adrp x16, ___blue_glCore_glPointSizexOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPointSizexOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLoadTransposeMatrixxOES +.private_extern _bluegl_glPolygonOffsetxOES .align 2 -_bluegl_glLoadTransposeMatrixxOES: - adrp x16, ___blue_glCore_glLoadTransposeMatrixxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLoadTransposeMatrixxOES@GOTPAGEOFF] +_bluegl_glPolygonOffsetxOES: + adrp x16, ___blue_glCore_glPolygonOffsetxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPolygonOffsetxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPixelStoref +.private_extern _bluegl_glRotatexOES .align 2 -_bluegl_glPixelStoref: - adrp x16, ___blue_glCore_glPixelStoref@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPixelStoref@GOTPAGEOFF] +_bluegl_glRotatexOES: + adrp x16, ___blue_glCore_glRotatexOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glRotatexOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStencilOpSeparateATI +.private_extern _bluegl_glScalexOES .align 2 -_bluegl_glStencilOpSeparateATI: - adrp x16, ___blue_glCore_glStencilOpSeparateATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStencilOpSeparateATI@GOTPAGEOFF] +_bluegl_glScalexOES: + adrp x16, ___blue_glCore_glScalexOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glScalexOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyTextureSubImage1DEXT +.private_extern _bluegl_glTexEnvxOES .align 2 -_bluegl_glCopyTextureSubImage1DEXT: - adrp x16, ___blue_glCore_glCopyTextureSubImage1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyTextureSubImage1DEXT@GOTPAGEOFF] +_bluegl_glTexEnvxOES: + adrp x16, ___blue_glCore_glTexEnvxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexEnvxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixScaledEXT +.private_extern _bluegl_glTexEnvxvOES .align 2 -_bluegl_glMatrixScaledEXT: - adrp x16, ___blue_glCore_glMatrixScaledEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixScaledEXT@GOTPAGEOFF] +_bluegl_glTexEnvxvOES: + adrp x16, ___blue_glCore_glTexEnvxvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexEnvxvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2i64ARB +.private_extern _bluegl_glTexParameterxOES .align 2 -_bluegl_glProgramUniform2i64ARB: - adrp x16, ___blue_glCore_glProgramUniform2i64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2i64ARB@GOTPAGEOFF] +_bluegl_glTexParameterxOES: + adrp x16, ___blue_glCore_glTexParameterxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexParameterxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureParameterfEXT +.private_extern _bluegl_glTexParameterxvOES .align 2 -_bluegl_glTextureParameterfEXT: - adrp x16, ___blue_glCore_glTextureParameterfEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureParameterfEXT@GOTPAGEOFF] +_bluegl_glTexParameterxvOES: + adrp x16, ___blue_glCore_glTexParameterxvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexParameterxvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramLocalParameterIivNV +.private_extern _bluegl_glTranslatexOES .align 2 -_bluegl_glGetProgramLocalParameterIivNV: - adrp x16, ___blue_glCore_glGetProgramLocalParameterIivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramLocalParameterIivNV@GOTPAGEOFF] +_bluegl_glTranslatexOES: + adrp x16, ___blue_glCore_glTranslatexOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTranslatexOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetShaderInfoLog +.private_extern _bluegl_glAccumxOES .align 2 -_bluegl_glGetShaderInfoLog: - adrp x16, ___blue_glCore_glGetShaderInfoLog@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetShaderInfoLog@GOTPAGEOFF] +_bluegl_glAccumxOES: + adrp x16, ___blue_glCore_glAccumxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glAccumxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoordP2uiv +.private_extern _bluegl_glBitmapxOES .align 2 -_bluegl_glTexCoordP2uiv: - adrp x16, ___blue_glCore_glTexCoordP2uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoordP2uiv@GOTPAGEOFF] +_bluegl_glBitmapxOES: + adrp x16, ___blue_glCore_glBitmapxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBitmapxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDebugMessageCallback +.private_extern _bluegl_glBlendColorxOES .align 2 -_bluegl_glDebugMessageCallback: - adrp x16, ___blue_glCore_glDebugMessageCallback@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDebugMessageCallback@GOTPAGEOFF] +_bluegl_glBlendColorxOES: + adrp x16, ___blue_glCore_glBlendColorxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendColorxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLoadTransposeMatrixfARB +.private_extern _bluegl_glClearAccumxOES .align 2 -_bluegl_glLoadTransposeMatrixfARB: - adrp x16, ___blue_glCore_glLoadTransposeMatrixfARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLoadTransposeMatrixfARB@GOTPAGEOFF] +_bluegl_glClearAccumxOES: + adrp x16, ___blue_glCore_glClearAccumxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearAccumxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1ui +.private_extern _bluegl_glColor3xOES .align 2 -_bluegl_glUniform1ui: - adrp x16, ___blue_glCore_glUniform1ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1ui@GOTPAGEOFF] +_bluegl_glColor3xOES: + adrp x16, ___blue_glCore_glColor3xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColor3xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL4dvEXT +.private_extern _bluegl_glColor3xvOES .align 2 -_bluegl_glVertexAttribL4dvEXT: - adrp x16, ___blue_glCore_glVertexAttribL4dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL4dvEXT@GOTPAGEOFF] +_bluegl_glColor3xvOES: + adrp x16, ___blue_glCore_glColor3xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColor3xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertex3bvOES +.private_extern _bluegl_glColor4xvOES .align 2 -_bluegl_glVertex3bvOES: - adrp x16, ___blue_glCore_glVertex3bvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertex3bvOES@GOTPAGEOFF] +_bluegl_glColor4xvOES: + adrp x16, ___blue_glCore_glColor4xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColor4xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPassThroughxOES +.private_extern _bluegl_glConvolutionParameterxOES .align 2 -_bluegl_glPassThroughxOES: - adrp x16, ___blue_glCore_glPassThroughxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPassThroughxOES@GOTPAGEOFF] +_bluegl_glConvolutionParameterxOES: + adrp x16, ___blue_glCore_glConvolutionParameterxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glConvolutionParameterxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFloatIndexedvEXT +.private_extern _bluegl_glConvolutionParameterxvOES .align 2 -_bluegl_glGetFloatIndexedvEXT: - adrp x16, ___blue_glCore_glGetFloatIndexedvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFloatIndexedvEXT@GOTPAGEOFF] +_bluegl_glConvolutionParameterxvOES: + adrp x16, ___blue_glCore_glConvolutionParameterxvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glConvolutionParameterxvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSubpixelPrecisionBiasNV +.private_extern _bluegl_glEvalCoord1xOES .align 2 -_bluegl_glSubpixelPrecisionBiasNV: - adrp x16, ___blue_glCore_glSubpixelPrecisionBiasNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSubpixelPrecisionBiasNV@GOTPAGEOFF] +_bluegl_glEvalCoord1xOES: + adrp x16, ___blue_glCore_glEvalCoord1xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEvalCoord1xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFinishFenceNV +.private_extern _bluegl_glEvalCoord1xvOES .align 2 -_bluegl_glFinishFenceNV: - adrp x16, ___blue_glCore_glFinishFenceNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFinishFenceNV@GOTPAGEOFF] +_bluegl_glEvalCoord1xvOES: + adrp x16, ___blue_glCore_glEvalCoord1xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEvalCoord1xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramBinary +.private_extern _bluegl_glEvalCoord2xOES .align 2 -_bluegl_glGetProgramBinary: - adrp x16, ___blue_glCore_glGetProgramBinary@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramBinary@GOTPAGEOFF] +_bluegl_glEvalCoord2xOES: + adrp x16, ___blue_glCore_glEvalCoord2xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEvalCoord2xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendFuncSeparateIndexedAMD +.private_extern _bluegl_glEvalCoord2xvOES .align 2 -_bluegl_glBlendFuncSeparateIndexedAMD: - adrp x16, ___blue_glCore_glBlendFuncSeparateIndexedAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendFuncSeparateIndexedAMD@GOTPAGEOFF] +_bluegl_glEvalCoord2xvOES: + adrp x16, ___blue_glCore_glEvalCoord2xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEvalCoord2xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendFuncSeparate +.private_extern _bluegl_glFeedbackBufferxOES .align 2 -_bluegl_glBlendFuncSeparate: - adrp x16, ___blue_glCore_glBlendFuncSeparate@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendFuncSeparate@GOTPAGEOFF] +_bluegl_glFeedbackBufferxOES: + adrp x16, ___blue_glCore_glFeedbackBufferxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFeedbackBufferxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIndexxvOES +.private_extern _bluegl_glGetConvolutionParameterxvOES .align 2 -_bluegl_glIndexxvOES: - adrp x16, ___blue_glCore_glIndexxvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIndexxvOES@GOTPAGEOFF] +_bluegl_glGetConvolutionParameterxvOES: + adrp x16, ___blue_glCore_glGetConvolutionParameterxvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetConvolutionParameterxvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4NuivARB +.private_extern _bluegl_glGetHistogramParameterxvOES .align 2 -_bluegl_glVertexAttrib4NuivARB: - adrp x16, ___blue_glCore_glVertexAttrib4NuivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4NuivARB@GOTPAGEOFF] +_bluegl_glGetHistogramParameterxvOES: + adrp x16, ___blue_glCore_glGetHistogramParameterxvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetHistogramParameterxvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2ui64ARB +.private_extern _bluegl_glGetLightxOES .align 2 -_bluegl_glUniform2ui64ARB: - adrp x16, ___blue_glCore_glUniform2ui64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2ui64ARB@GOTPAGEOFF] +_bluegl_glGetLightxOES: + adrp x16, ___blue_glCore_glGetLightxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetLightxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEndPerfMonitorAMD +.private_extern _bluegl_glGetMapxvOES .align 2 -_bluegl_glEndPerfMonitorAMD: - adrp x16, ___blue_glCore_glEndPerfMonitorAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEndPerfMonitorAMD@GOTPAGEOFF] +_bluegl_glGetMapxvOES: + adrp x16, ___blue_glCore_glGetMapxvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMapxvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReleaseShaderCompiler +.private_extern _bluegl_glGetMaterialxOES .align 2 -_bluegl_glReleaseShaderCompiler: - adrp x16, ___blue_glCore_glReleaseShaderCompiler@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReleaseShaderCompiler@GOTPAGEOFF] +_bluegl_glGetMaterialxOES: + adrp x16, ___blue_glCore_glGetMaterialxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMaterialxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenFramebuffersEXT +.private_extern _bluegl_glGetPixelMapxv .align 2 -_bluegl_glGenFramebuffersEXT: - adrp x16, ___blue_glCore_glGenFramebuffersEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenFramebuffersEXT@GOTPAGEOFF] +_bluegl_glGetPixelMapxv: + adrp x16, ___blue_glCore_glGetPixelMapxv@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPixelMapxv@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2uiv +.private_extern _bluegl_glGetTexGenxvOES .align 2 -_bluegl_glUniform2uiv: - adrp x16, ___blue_glCore_glUniform2uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2uiv@GOTPAGEOFF] +_bluegl_glGetTexGenxvOES: + adrp x16, ___blue_glCore_glGetTexGenxvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTexGenxvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenSymbolsEXT +.private_extern _bluegl_glGetTexLevelParameterxvOES .align 2 -_bluegl_glGenSymbolsEXT: - adrp x16, ___blue_glCore_glGenSymbolsEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenSymbolsEXT@GOTPAGEOFF] +_bluegl_glGetTexLevelParameterxvOES: + adrp x16, ___blue_glCore_glGetTexLevelParameterxvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTexLevelParameterxvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribIPointer +.private_extern _bluegl_glIndexxOES .align 2 -_bluegl_glVertexAttribIPointer: - adrp x16, ___blue_glCore_glVertexAttribIPointer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribIPointer@GOTPAGEOFF] +_bluegl_glIndexxOES: + adrp x16, ___blue_glCore_glIndexxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIndexxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix3x4fv +.private_extern _bluegl_glIndexxvOES .align 2 -_bluegl_glUniformMatrix3x4fv: - adrp x16, ___blue_glCore_glUniformMatrix3x4fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix3x4fv@GOTPAGEOFF] +_bluegl_glIndexxvOES: + adrp x16, ___blue_glCore_glIndexxvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIndexxvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord3bOES +.private_extern _bluegl_glLoadTransposeMatrixxOES .align 2 -_bluegl_glTexCoord3bOES: - adrp x16, ___blue_glCore_glTexCoord3bOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord3bOES@GOTPAGEOFF] +_bluegl_glLoadTransposeMatrixxOES: + adrp x16, ___blue_glCore_glLoadTransposeMatrixxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLoadTransposeMatrixxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVDPAUUnmapSurfacesNV +.private_extern _bluegl_glMap1xOES .align 2 -_bluegl_glVDPAUUnmapSurfacesNV: - adrp x16, ___blue_glCore_glVDPAUUnmapSurfacesNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVDPAUUnmapSurfacesNV@GOTPAGEOFF] +_bluegl_glMap1xOES: + adrp x16, ___blue_glCore_glMap1xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMap1xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4ui64NV +.private_extern _bluegl_glMap2xOES .align 2 -_bluegl_glProgramUniform4ui64NV: - adrp x16, ___blue_glCore_glProgramUniform4ui64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4ui64NV@GOTPAGEOFF] +_bluegl_glMap2xOES: + adrp x16, ___blue_glCore_glMap2xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMap2xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformHandleui64NV +.private_extern _bluegl_glMapGrid1xOES .align 2 -_bluegl_glUniformHandleui64NV: - adrp x16, ___blue_glCore_glUniformHandleui64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformHandleui64NV@GOTPAGEOFF] +_bluegl_glMapGrid1xOES: + adrp x16, ___blue_glCore_glMapGrid1xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMapGrid1xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetStageIndexNV +.private_extern _bluegl_glMapGrid2xOES .align 2 -_bluegl_glGetStageIndexNV: - adrp x16, ___blue_glCore_glGetStageIndexNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetStageIndexNV@GOTPAGEOFF] +_bluegl_glMapGrid2xOES: + adrp x16, ___blue_glCore_glMapGrid2xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMapGrid2xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3fvARB +.private_extern _bluegl_glMultTransposeMatrixxOES .align 2 -_bluegl_glMultiTexCoord3fvARB: - adrp x16, ___blue_glCore_glMultiTexCoord3fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3fvARB@GOTPAGEOFF] +_bluegl_glMultTransposeMatrixxOES: + adrp x16, ___blue_glCore_glMultTransposeMatrixxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultTransposeMatrixxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindBufferOffsetEXT +.private_extern _bluegl_glMultiTexCoord1xOES .align 2 -_bluegl_glBindBufferOffsetEXT: - adrp x16, ___blue_glCore_glBindBufferOffsetEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindBufferOffsetEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoord1xOES: + adrp x16, ___blue_glCore_glMultiTexCoord1xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL4dv +.private_extern _bluegl_glMultiTexCoord1xvOES .align 2 -_bluegl_glVertexAttribL4dv: - adrp x16, ___blue_glCore_glVertexAttribL4dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL4dv@GOTPAGEOFF] +_bluegl_glMultiTexCoord1xvOES: + adrp x16, ___blue_glCore_glMultiTexCoord1xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearStencil +.private_extern _bluegl_glMultiTexCoord2xOES .align 2 -_bluegl_glClearStencil: - adrp x16, ___blue_glCore_glClearStencil@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearStencil@GOTPAGEOFF] +_bluegl_glMultiTexCoord2xOES: + adrp x16, ___blue_glCore_glMultiTexCoord2xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2ivMESA +.private_extern _bluegl_glMultiTexCoord2xvOES .align 2 -_bluegl_glWindowPos2ivMESA: - adrp x16, ___blue_glCore_glWindowPos2ivMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2ivMESA@GOTPAGEOFF] +_bluegl_glMultiTexCoord2xvOES: + adrp x16, ___blue_glCore_glMultiTexCoord2xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeubvSUN +.private_extern _bluegl_glMultiTexCoord3xOES .align 2 -_bluegl_glReplacementCodeubvSUN: - adrp x16, ___blue_glCore_glReplacementCodeubvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeubvSUN@GOTPAGEOFF] +_bluegl_glMultiTexCoord3xOES: + adrp x16, ___blue_glCore_glMultiTexCoord3xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClipPlanefOES +.private_extern _bluegl_glMultiTexCoord3xvOES .align 2 -_bluegl_glClipPlanefOES: - adrp x16, ___blue_glCore_glClipPlanefOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClipPlanefOES@GOTPAGEOFF] +_bluegl_glMultiTexCoord3xvOES: + adrp x16, ___blue_glCore_glMultiTexCoord3xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1xOES +.private_extern _bluegl_glMultiTexCoord4xvOES .align 2 -_bluegl_glMultiTexCoord1xOES: - adrp x16, ___blue_glCore_glMultiTexCoord1xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1xOES@GOTPAGEOFF] +_bluegl_glMultiTexCoord4xvOES: + adrp x16, ___blue_glCore_glMultiTexCoord4xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramInfoLog +.private_extern _bluegl_glNormal3xvOES .align 2 -_bluegl_glGetProgramInfoLog: - adrp x16, ___blue_glCore_glGetProgramInfoLog@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramInfoLog@GOTPAGEOFF] +_bluegl_glNormal3xvOES: + adrp x16, ___blue_glCore_glNormal3xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormal3xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEndFragmentShaderATI +.private_extern _bluegl_glPassThroughxOES .align 2 -_bluegl_glEndFragmentShaderATI: - adrp x16, ___blue_glCore_glEndFragmentShaderATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEndFragmentShaderATI@GOTPAGEOFF] +_bluegl_glPassThroughxOES: + adrp x16, ___blue_glCore_glPassThroughxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPassThroughxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTransformFeedbackVaryingNV +.private_extern _bluegl_glPixelMapx .align 2 -_bluegl_glGetTransformFeedbackVaryingNV: - adrp x16, ___blue_glCore_glGetTransformFeedbackVaryingNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTransformFeedbackVaryingNV@GOTPAGEOFF] +_bluegl_glPixelMapx: + adrp x16, ___blue_glCore_glPixelMapx@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPixelMapx@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix4x2dv +.private_extern _bluegl_glPixelStorex .align 2 -_bluegl_glProgramUniformMatrix4x2dv: - adrp x16, ___blue_glCore_glProgramUniformMatrix4x2dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4x2dv@GOTPAGEOFF] +_bluegl_glPixelStorex: + adrp x16, ___blue_glCore_glPixelStorex@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPixelStorex@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glResetHistogramEXT +.private_extern _bluegl_glPixelTransferxOES .align 2 -_bluegl_glResetHistogramEXT: - adrp x16, ___blue_glCore_glResetHistogramEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glResetHistogramEXT@GOTPAGEOFF] +_bluegl_glPixelTransferxOES: + adrp x16, ___blue_glCore_glPixelTransferxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPixelTransferxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1i64vNV +.private_extern _bluegl_glPixelZoomxOES .align 2 -_bluegl_glUniform1i64vNV: - adrp x16, ___blue_glCore_glUniform1i64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1i64vNV@GOTPAGEOFF] +_bluegl_glPixelZoomxOES: + adrp x16, ___blue_glCore_glPixelZoomxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPixelZoomxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramEnvParameter4dARB +.private_extern _bluegl_glPrioritizeTexturesxOES .align 2 -_bluegl_glProgramEnvParameter4dARB: - adrp x16, ___blue_glCore_glProgramEnvParameter4dARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramEnvParameter4dARB@GOTPAGEOFF] +_bluegl_glPrioritizeTexturesxOES: + adrp x16, ___blue_glCore_glPrioritizeTexturesxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPrioritizeTexturesxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyTextureSubImage2DEXT +.private_extern _bluegl_glRasterPos2xOES .align 2 -_bluegl_glCopyTextureSubImage2DEXT: - adrp x16, ___blue_glCore_glCopyTextureSubImage2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyTextureSubImage2DEXT@GOTPAGEOFF] +_bluegl_glRasterPos2xOES: + adrp x16, ___blue_glCore_glRasterPos2xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glRasterPos2xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetCombinerInputParameterivNV +.private_extern _bluegl_glRasterPos2xvOES .align 2 -_bluegl_glGetCombinerInputParameterivNV: - adrp x16, ___blue_glCore_glGetCombinerInputParameterivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetCombinerInputParameterivNV@GOTPAGEOFF] +_bluegl_glRasterPos2xvOES: + adrp x16, ___blue_glCore_glRasterPos2xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glRasterPos2xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix4fv +.private_extern _bluegl_glRasterPos3xOES .align 2 -_bluegl_glUniformMatrix4fv: - adrp x16, ___blue_glCore_glUniformMatrix4fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix4fv@GOTPAGEOFF] +_bluegl_glRasterPos3xOES: + adrp x16, ___blue_glCore_glRasterPos3xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glRasterPos3xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenQueriesARB +.private_extern _bluegl_glRasterPos3xvOES .align 2 -_bluegl_glGenQueriesARB: - adrp x16, ___blue_glCore_glGenQueriesARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenQueriesARB@GOTPAGEOFF] +_bluegl_glRasterPos3xvOES: + adrp x16, ___blue_glCore_glRasterPos3xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glRasterPos3xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnSeparableFilter +.private_extern _bluegl_glRasterPos4xOES .align 2 -_bluegl_glGetnSeparableFilter: - adrp x16, ___blue_glCore_glGetnSeparableFilter@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnSeparableFilter@GOTPAGEOFF] +_bluegl_glRasterPos4xOES: + adrp x16, ___blue_glCore_glRasterPos4xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glRasterPos4xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3ui64vARB +.private_extern _bluegl_glRasterPos4xvOES .align 2 -_bluegl_glUniform3ui64vARB: - adrp x16, ___blue_glCore_glUniform3ui64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3ui64vARB@GOTPAGEOFF] +_bluegl_glRasterPos4xvOES: + adrp x16, ___blue_glCore_glRasterPos4xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glRasterPos4xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1i +.private_extern _bluegl_glRectxOES .align 2 -_bluegl_glMultiTexCoord1i: - adrp x16, ___blue_glCore_glMultiTexCoord1i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1i@GOTPAGEOFF] +_bluegl_glRectxOES: + adrp x16, ___blue_glCore_glRectxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glRectxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorTable +.private_extern _bluegl_glRectxvOES .align 2 -_bluegl_glColorTable: - adrp x16, ___blue_glCore_glColorTable@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorTable@GOTPAGEOFF] +_bluegl_glRectxvOES: + adrp x16, ___blue_glCore_glRectxvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glRectxvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribs4ubvNV +.private_extern _bluegl_glTexCoord1xOES .align 2 -_bluegl_glVertexAttribs4ubvNV: - adrp x16, ___blue_glCore_glVertexAttribs4ubvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribs4ubvNV@GOTPAGEOFF] +_bluegl_glTexCoord1xOES: + adrp x16, ___blue_glCore_glTexCoord1xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord1xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3uiv +.private_extern _bluegl_glTexCoord1xvOES .align 2 -_bluegl_glProgramUniform3uiv: - adrp x16, ___blue_glCore_glProgramUniform3uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3uiv@GOTPAGEOFF] +_bluegl_glTexCoord1xvOES: + adrp x16, ___blue_glCore_glTexCoord1xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord1xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix3x2fv +.private_extern _bluegl_glTexCoord2xOES .align 2 -_bluegl_glProgramUniformMatrix3x2fv: - adrp x16, ___blue_glCore_glProgramUniformMatrix3x2fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3x2fv@GOTPAGEOFF] +_bluegl_glTexCoord2xOES: + adrp x16, ___blue_glCore_glTexCoord2xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord2xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUnmapBuffer +.private_extern _bluegl_glTexCoord2xvOES .align 2 -_bluegl_glUnmapBuffer: - adrp x16, ___blue_glCore_glUnmapBuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUnmapBuffer@GOTPAGEOFF] +_bluegl_glTexCoord2xvOES: + adrp x16, ___blue_glCore_glTexCoord2xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord2xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindTextureUnit +.private_extern _bluegl_glTexCoord3xOES .align 2 -_bluegl_glBindTextureUnit: - adrp x16, ___blue_glCore_glBindTextureUnit@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindTextureUnit@GOTPAGEOFF] +_bluegl_glTexCoord3xOES: + adrp x16, ___blue_glCore_glTexCoord3xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord3xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureParameterIuivEXT +.private_extern _bluegl_glTexCoord3xvOES .align 2 -_bluegl_glTextureParameterIuivEXT: - adrp x16, ___blue_glCore_glTextureParameterIuivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureParameterIuivEXT@GOTPAGEOFF] +_bluegl_glTexCoord3xvOES: + adrp x16, ___blue_glCore_glTexCoord3xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord3xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribDivisor +.private_extern _bluegl_glTexCoord4xOES .align 2 -_bluegl_glVertexAttribDivisor: - adrp x16, ___blue_glCore_glVertexAttribDivisor@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribDivisor@GOTPAGEOFF] +_bluegl_glTexCoord4xOES: + adrp x16, ___blue_glCore_glTexCoord4xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord4xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSamplerParameterIiv +.private_extern _bluegl_glTexCoord4xvOES .align 2 -_bluegl_glSamplerParameterIiv: - adrp x16, ___blue_glCore_glSamplerParameterIiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSamplerParameterIiv@GOTPAGEOFF] +_bluegl_glTexCoord4xvOES: + adrp x16, ___blue_glCore_glTexCoord4xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord4xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetDebugMessageLog +.private_extern _bluegl_glTexGenxOES .align 2 -_bluegl_glGetDebugMessageLog: - adrp x16, ___blue_glCore_glGetDebugMessageLog@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetDebugMessageLog@GOTPAGEOFF] +_bluegl_glTexGenxOES: + adrp x16, ___blue_glCore_glTexGenxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexGenxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSelectPerfMonitorCountersAMD +.private_extern _bluegl_glTexGenxvOES .align 2 -_bluegl_glSelectPerfMonitorCountersAMD: - adrp x16, ___blue_glCore_glSelectPerfMonitorCountersAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSelectPerfMonitorCountersAMD@GOTPAGEOFF] +_bluegl_glTexGenxvOES: + adrp x16, ___blue_glCore_glTexGenxvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexGenxvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI2i +.private_extern _bluegl_glVertex2xOES .align 2 -_bluegl_glVertexAttribI2i: - adrp x16, ___blue_glCore_glVertexAttribI2i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI2i@GOTPAGEOFF] +_bluegl_glVertex2xOES: + adrp x16, ___blue_glCore_glVertex2xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertex2xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDepthRangedNV +.private_extern _bluegl_glVertex2xvOES .align 2 -_bluegl_glDepthRangedNV: - adrp x16, ___blue_glCore_glDepthRangedNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDepthRangedNV@GOTPAGEOFF] +_bluegl_glVertex2xvOES: + adrp x16, ___blue_glCore_glVertex2xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertex2xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureRangeAPPLE +.private_extern _bluegl_glVertex3xOES .align 2 -_bluegl_glTextureRangeAPPLE: - adrp x16, ___blue_glCore_glTextureRangeAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureRangeAPPLE@GOTPAGEOFF] +_bluegl_glVertex3xOES: + adrp x16, ___blue_glCore_glVertex3xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertex3xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEvalCoord2xOES +.private_extern _bluegl_glVertex3xvOES .align 2 -_bluegl_glEvalCoord2xOES: - adrp x16, ___blue_glCore_glEvalCoord2xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEvalCoord2xOES@GOTPAGEOFF] +_bluegl_glVertex3xvOES: + adrp x16, ___blue_glCore_glVertex3xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertex3xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCallCommandListNV +.private_extern _bluegl_glVertex4xOES .align 2 -_bluegl_glCallCommandListNV: - adrp x16, ___blue_glCore_glCallCommandListNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCallCommandListNV@GOTPAGEOFF] +_bluegl_glVertex4xOES: + adrp x16, ___blue_glCore_glVertex4xOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertex4xOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVariantdvEXT +.private_extern _bluegl_glVertex4xvOES .align 2 -_bluegl_glVariantdvEXT: - adrp x16, ___blue_glCore_glVariantdvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVariantdvEXT@GOTPAGEOFF] +_bluegl_glVertex4xvOES: + adrp x16, ___blue_glCore_glVertex4xvOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertex4xvOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendColorxOES +.private_extern _bluegl_glQueryMatrixxOES .align 2 -_bluegl_glBlendColorxOES: - adrp x16, ___blue_glCore_glBlendColorxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendColorxOES@GOTPAGEOFF] +_bluegl_glQueryMatrixxOES: + adrp x16, ___blue_glCore_glQueryMatrixxOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glQueryMatrixxOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferTexture2DEXT +.private_extern _bluegl_glClearDepthfOES .align 2 -_bluegl_glFramebufferTexture2DEXT: - adrp x16, ___blue_glCore_glFramebufferTexture2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferTexture2DEXT@GOTPAGEOFF] +_bluegl_glClearDepthfOES: + adrp x16, ___blue_glCore_glClearDepthfOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearDepthfOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetString +.private_extern _bluegl_glClipPlanefOES .align 2 -_bluegl_glGetString: - adrp x16, ___blue_glCore_glGetString@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetString@GOTPAGEOFF] +_bluegl_glClipPlanefOES: + adrp x16, ___blue_glCore_glClipPlanefOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClipPlanefOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream3iATI +.private_extern _bluegl_glDepthRangefOES .align 2 -_bluegl_glVertexStream3iATI: - adrp x16, ___blue_glCore_glVertexStream3iATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream3iATI@GOTPAGEOFF] +_bluegl_glDepthRangefOES: + adrp x16, ___blue_glCore_glDepthRangefOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDepthRangefOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glHintPGI +.private_extern _bluegl_glFrustumfOES .align 2 -_bluegl_glHintPGI: - adrp x16, ___blue_glCore_glHintPGI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glHintPGI@GOTPAGEOFF] +_bluegl_glFrustumfOES: + adrp x16, ___blue_glCore_glFrustumfOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFrustumfOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenPerfMonitorsAMD +.private_extern _bluegl_glGetClipPlanefOES .align 2 -_bluegl_glGenPerfMonitorsAMD: - adrp x16, ___blue_glCore_glGenPerfMonitorsAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenPerfMonitorsAMD@GOTPAGEOFF] +_bluegl_glGetClipPlanefOES: + adrp x16, ___blue_glCore_glGetClipPlanefOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetClipPlanefOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureSubImage3DEXT +.private_extern _bluegl_glOrthofOES .align 2 -_bluegl_glTextureSubImage3DEXT: - adrp x16, ___blue_glCore_glTextureSubImage3DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureSubImage3DEXT@GOTPAGEOFF] +_bluegl_glOrthofOES: + adrp x16, ___blue_glCore_glOrthofOES@GOTPAGE + ldr x16, [x16, ___blue_glCore_glOrthofOES@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4usvARB +.private_extern _bluegl_glTbufferMask3DFX .align 2 -_bluegl_glVertexAttrib4usvARB: - adrp x16, ___blue_glCore_glVertexAttrib4usvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4usvARB@GOTPAGEOFF] +_bluegl_glTbufferMask3DFX: + adrp x16, ___blue_glCore_glTbufferMask3DFX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTbufferMask3DFX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayBindVertexBufferEXT +.private_extern _bluegl_glDebugMessageEnableAMD .align 2 -_bluegl_glVertexArrayBindVertexBufferEXT: - adrp x16, ___blue_glCore_glVertexArrayBindVertexBufferEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayBindVertexBufferEXT@GOTPAGEOFF] +_bluegl_glDebugMessageEnableAMD: + adrp x16, ___blue_glCore_glDebugMessageEnableAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDebugMessageEnableAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMinSampleShading +.private_extern _bluegl_glDebugMessageInsertAMD .align 2 -_bluegl_glMinSampleShading: - adrp x16, ___blue_glCore_glMinSampleShading@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMinSampleShading@GOTPAGEOFF] +_bluegl_glDebugMessageInsertAMD: + adrp x16, ___blue_glCore_glDebugMessageInsertAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDebugMessageInsertAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsPathNV +.private_extern _bluegl_glDebugMessageCallbackAMD .align 2 -_bluegl_glIsPathNV: - adrp x16, ___blue_glCore_glIsPathNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsPathNV@GOTPAGEOFF] +_bluegl_glDebugMessageCallbackAMD: + adrp x16, ___blue_glCore_glDebugMessageCallbackAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDebugMessageCallbackAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPathTexGenivNV +.private_extern _bluegl_glGetDebugMessageLogAMD .align 2 -_bluegl_glGetPathTexGenivNV: - adrp x16, ___blue_glCore_glGetPathTexGenivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPathTexGenivNV@GOTPAGEOFF] +_bluegl_glGetDebugMessageLogAMD: + adrp x16, ___blue_glCore_glGetDebugMessageLogAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetDebugMessageLogAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3fv +.private_extern _bluegl_glBlendFuncIndexedAMD .align 2 -_bluegl_glProgramUniform3fv: - adrp x16, ___blue_glCore_glProgramUniform3fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3fv@GOTPAGEOFF] +_bluegl_glBlendFuncIndexedAMD: + adrp x16, ___blue_glCore_glBlendFuncIndexedAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendFuncIndexedAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3sv +.private_extern _bluegl_glBlendFuncSeparateIndexedAMD .align 2 -_bluegl_glVertexAttrib3sv: - adrp x16, ___blue_glCore_glVertexAttrib3sv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3sv@GOTPAGEOFF] +_bluegl_glBlendFuncSeparateIndexedAMD: + adrp x16, ___blue_glCore_glBlendFuncSeparateIndexedAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendFuncSeparateIndexedAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetUniformuiv +.private_extern _bluegl_glBlendEquationIndexedAMD .align 2 -_bluegl_glGetUniformuiv: - adrp x16, ___blue_glCore_glGetUniformuiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetUniformuiv@GOTPAGEOFF] +_bluegl_glBlendEquationIndexedAMD: + adrp x16, ___blue_glCore_glBlendEquationIndexedAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendEquationIndexedAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPixelTransformParameterfvEXT +.private_extern _bluegl_glBlendEquationSeparateIndexedAMD .align 2 -_bluegl_glGetPixelTransformParameterfvEXT: - adrp x16, ___blue_glCore_glGetPixelTransformParameterfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPixelTransformParameterfvEXT@GOTPAGEOFF] +_bluegl_glBlendEquationSeparateIndexedAMD: + adrp x16, ___blue_glCore_glBlendEquationSeparateIndexedAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendEquationSeparateIndexedAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3dv +.private_extern _bluegl_glUniform1i64NV .align 2 -_bluegl_glMultiTexCoord3dv: - adrp x16, ___blue_glCore_glMultiTexCoord3dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3dv@GOTPAGEOFF] +_bluegl_glUniform1i64NV: + adrp x16, ___blue_glCore_glUniform1i64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1i64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3fvARB +.private_extern _bluegl_glUniform2i64NV .align 2 -_bluegl_glVertexAttrib3fvARB: - adrp x16, ___blue_glCore_glVertexAttrib3fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3fvARB@GOTPAGEOFF] +_bluegl_glUniform2i64NV: + adrp x16, ___blue_glCore_glUniform2i64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2i64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramResourceIndex +.private_extern _bluegl_glUniform3i64NV .align 2 -_bluegl_glGetProgramResourceIndex: - adrp x16, ___blue_glCore_glGetProgramResourceIndex@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramResourceIndex@GOTPAGEOFF] +_bluegl_glUniform3i64NV: + adrp x16, ___blue_glCore_glUniform3i64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3i64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMinmaxParameteriv +.private_extern _bluegl_glUniform4i64NV .align 2 -_bluegl_glGetMinmaxParameteriv: - adrp x16, ___blue_glCore_glGetMinmaxParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMinmaxParameteriv@GOTPAGEOFF] +_bluegl_glUniform4i64NV: + adrp x16, ___blue_glCore_glUniform4i64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4i64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glConvolutionParameterfEXT +.private_extern _bluegl_glUniform1i64vNV .align 2 -_bluegl_glConvolutionParameterfEXT: - adrp x16, ___blue_glCore_glConvolutionParameterfEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glConvolutionParameterfEXT@GOTPAGEOFF] +_bluegl_glUniform1i64vNV: + adrp x16, ___blue_glCore_glUniform1i64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1i64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4i64NV +.private_extern _bluegl_glUniform2i64vNV .align 2 -_bluegl_glProgramUniform4i64NV: - adrp x16, ___blue_glCore_glProgramUniform4i64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4i64NV@GOTPAGEOFF] +_bluegl_glUniform2i64vNV: + adrp x16, ___blue_glCore_glUniform2i64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2i64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix4fvEXT +.private_extern _bluegl_glUniform3i64vNV .align 2 -_bluegl_glProgramUniformMatrix4fvEXT: - adrp x16, ___blue_glCore_glProgramUniformMatrix4fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4fvEXT@GOTPAGEOFF] +_bluegl_glUniform3i64vNV: + adrp x16, ___blue_glCore_glUniform3i64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3i64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoordP4ui +.private_extern _bluegl_glUniform4i64vNV .align 2 -_bluegl_glMultiTexCoordP4ui: - adrp x16, ___blue_glCore_glMultiTexCoordP4ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoordP4ui@GOTPAGEOFF] +_bluegl_glUniform4i64vNV: + adrp x16, ___blue_glCore_glUniform4i64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4i64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEnableVertexAttribAPPLE +.private_extern _bluegl_glUniform1ui64NV .align 2 -_bluegl_glEnableVertexAttribAPPLE: - adrp x16, ___blue_glCore_glEnableVertexAttribAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEnableVertexAttribAPPLE@GOTPAGEOFF] +_bluegl_glUniform1ui64NV: + adrp x16, ___blue_glCore_glUniform1ui64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1ui64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoordP3uiv +.private_extern _bluegl_glUniform2ui64NV .align 2 -_bluegl_glTexCoordP3uiv: - adrp x16, ___blue_glCore_glTexCoordP3uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoordP3uiv@GOTPAGEOFF] +_bluegl_glUniform2ui64NV: + adrp x16, ___blue_glCore_glUniform2ui64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2ui64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCoverageModulationNV +.private_extern _bluegl_glUniform3ui64NV .align 2 -_bluegl_glCoverageModulationNV: - adrp x16, ___blue_glCore_glCoverageModulationNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCoverageModulationNV@GOTPAGEOFF] +_bluegl_glUniform3ui64NV: + adrp x16, ___blue_glCore_glUniform3ui64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3ui64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3ivARB +.private_extern _bluegl_glUniform4ui64NV .align 2 -_bluegl_glMultiTexCoord3ivARB: - adrp x16, ___blue_glCore_glMultiTexCoord3ivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3ivARB@GOTPAGEOFF] +_bluegl_glUniform4ui64NV: + adrp x16, ___blue_glCore_glUniform4ui64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4ui64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glListParameterfvSGIX +.private_extern _bluegl_glUniform1ui64vNV .align 2 -_bluegl_glListParameterfvSGIX: - adrp x16, ___blue_glCore_glListParameterfvSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glListParameterfvSGIX@GOTPAGEOFF] +_bluegl_glUniform1ui64vNV: + adrp x16, ___blue_glCore_glUniform1ui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1ui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormal3fVertex3fvSUN +.private_extern _bluegl_glUniform2ui64vNV .align 2 -_bluegl_glNormal3fVertex3fvSUN: - adrp x16, ___blue_glCore_glNormal3fVertex3fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormal3fVertex3fvSUN@GOTPAGEOFF] +_bluegl_glUniform2ui64vNV: + adrp x16, ___blue_glCore_glUniform2ui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2ui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4bv +.private_extern _bluegl_glUniform3ui64vNV .align 2 -_bluegl_glVertexAttrib4bv: - adrp x16, ___blue_glCore_glVertexAttrib4bv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4bv@GOTPAGEOFF] +_bluegl_glUniform3ui64vNV: + adrp x16, ___blue_glCore_glUniform3ui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3ui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexParameterIiv +.private_extern _bluegl_glUniform4ui64vNV .align 2 -_bluegl_glTexParameterIiv: - adrp x16, ___blue_glCore_glTexParameterIiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexParameterIiv@GOTPAGEOFF] +_bluegl_glUniform4ui64vNV: + adrp x16, ___blue_glCore_glUniform4ui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4ui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedFramebufferParameteri +.private_extern _bluegl_glGetUniformi64vNV .align 2 -_bluegl_glNamedFramebufferParameteri: - adrp x16, ___blue_glCore_glNamedFramebufferParameteri@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedFramebufferParameteri@GOTPAGEOFF] +_bluegl_glGetUniformi64vNV: + adrp x16, ___blue_glCore_glGetUniformi64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetUniformi64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFramebufferParameterivEXT +.private_extern _bluegl_glGetUniformui64vNV .align 2 -_bluegl_glGetFramebufferParameterivEXT: - adrp x16, ___blue_glCore_glGetFramebufferParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFramebufferParameterivEXT@GOTPAGEOFF] +_bluegl_glGetUniformui64vNV: + adrp x16, ___blue_glCore_glGetUniformui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetUniformui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeubSUN +.private_extern _bluegl_glProgramUniform1i64NV .align 2 -_bluegl_glReplacementCodeubSUN: - adrp x16, ___blue_glCore_glReplacementCodeubSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeubSUN@GOTPAGEOFF] +_bluegl_glProgramUniform1i64NV: + adrp x16, ___blue_glCore_glProgramUniform1i64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1i64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord2bvOES +.private_extern _bluegl_glProgramUniform2i64NV .align 2 -_bluegl_glTexCoord2bvOES: - adrp x16, ___blue_glCore_glTexCoord2bvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord2bvOES@GOTPAGEOFF] +_bluegl_glProgramUniform2i64NV: + adrp x16, ___blue_glCore_glProgramUniform2i64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2i64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVideoui64vNV +.private_extern _bluegl_glProgramUniform3i64NV .align 2 -_bluegl_glGetVideoui64vNV: - adrp x16, ___blue_glCore_glGetVideoui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVideoui64vNV@GOTPAGEOFF] +_bluegl_glProgramUniform3i64NV: + adrp x16, ___blue_glCore_glProgramUniform3i64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3i64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexStorage2DMultisample +.private_extern _bluegl_glProgramUniform4i64NV .align 2 -_bluegl_glTexStorage2DMultisample: - adrp x16, ___blue_glCore_glTexStorage2DMultisample@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexStorage2DMultisample@GOTPAGEOFF] +_bluegl_glProgramUniform4i64NV: + adrp x16, ___blue_glCore_glProgramUniform4i64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4i64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorTableParameteriv +.private_extern _bluegl_glProgramUniform1i64vNV .align 2 -_bluegl_glColorTableParameteriv: - adrp x16, ___blue_glCore_glColorTableParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorTableParameteriv@GOTPAGEOFF] +_bluegl_glProgramUniform1i64vNV: + adrp x16, ___blue_glCore_glProgramUniform1i64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1i64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glConvolutionFilter2DEXT +.private_extern _bluegl_glProgramUniform2i64vNV .align 2 -_bluegl_glConvolutionFilter2DEXT: - adrp x16, ___blue_glCore_glConvolutionFilter2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glConvolutionFilter2DEXT@GOTPAGEOFF] +_bluegl_glProgramUniform2i64vNV: + adrp x16, ___blue_glCore_glProgramUniform2i64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2i64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSampleMaskEXT +.private_extern _bluegl_glProgramUniform3i64vNV .align 2 -_bluegl_glSampleMaskEXT: - adrp x16, ___blue_glCore_glSampleMaskEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSampleMaskEXT@GOTPAGEOFF] +_bluegl_glProgramUniform3i64vNV: + adrp x16, ___blue_glCore_glProgramUniform3i64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3i64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGlobalAlphaFactorusSUN +.private_extern _bluegl_glProgramUniform4i64vNV .align 2 -_bluegl_glGlobalAlphaFactorusSUN: - adrp x16, ___blue_glCore_glGlobalAlphaFactorusSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGlobalAlphaFactorusSUN@GOTPAGEOFF] +_bluegl_glProgramUniform4i64vNV: + adrp x16, ___blue_glCore_glProgramUniform4i64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4i64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindRenderbuffer +.private_extern _bluegl_glProgramUniform1ui64NV .align 2 -_bluegl_glBindRenderbuffer: - adrp x16, ___blue_glCore_glBindRenderbuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindRenderbuffer@GOTPAGEOFF] +_bluegl_glProgramUniform1ui64NV: + adrp x16, ___blue_glCore_glProgramUniform1ui64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1ui64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI1i +.private_extern _bluegl_glProgramUniform2ui64NV .align 2 -_bluegl_glVertexAttribI1i: - adrp x16, ___blue_glCore_glVertexAttribI1i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI1i@GOTPAGEOFF] +_bluegl_glProgramUniform2ui64NV: + adrp x16, ___blue_glCore_glProgramUniform2ui64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2ui64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramLocalParameterI4uiNV +.private_extern _bluegl_glProgramUniform3ui64NV .align 2 -_bluegl_glProgramLocalParameterI4uiNV: - adrp x16, ___blue_glCore_glProgramLocalParameterI4uiNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramLocalParameterI4uiNV@GOTPAGEOFF] +_bluegl_glProgramUniform3ui64NV: + adrp x16, ___blue_glCore_glProgramUniform3ui64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3ui64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4ui64ARB +.private_extern _bluegl_glProgramUniform4ui64NV .align 2 -_bluegl_glProgramUniform4ui64ARB: - adrp x16, ___blue_glCore_glProgramUniform4ui64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4ui64ARB@GOTPAGEOFF] +_bluegl_glProgramUniform4ui64NV: + adrp x16, ___blue_glCore_glProgramUniform4ui64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4ui64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glObjectLabel +.private_extern _bluegl_glProgramUniform1ui64vNV .align 2 -_bluegl_glObjectLabel: - adrp x16, ___blue_glCore_glObjectLabel@GOTPAGE - ldr x16, [x16, ___blue_glCore_glObjectLabel@GOTPAGEOFF] +_bluegl_glProgramUniform1ui64vNV: + adrp x16, ___blue_glCore_glProgramUniform1ui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1ui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetColorTableParameterivEXT +.private_extern _bluegl_glProgramUniform2ui64vNV .align 2 -_bluegl_glGetColorTableParameterivEXT: - adrp x16, ___blue_glCore_glGetColorTableParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetColorTableParameterivEXT@GOTPAGEOFF] +_bluegl_glProgramUniform2ui64vNV: + adrp x16, ___blue_glCore_glProgramUniform2ui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2ui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetCombinerOutputParameterivNV +.private_extern _bluegl_glProgramUniform3ui64vNV .align 2 -_bluegl_glGetCombinerOutputParameterivNV: - adrp x16, ___blue_glCore_glGetCombinerOutputParameterivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetCombinerOutputParameterivNV@GOTPAGEOFF] +_bluegl_glProgramUniform3ui64vNV: + adrp x16, ___blue_glCore_glProgramUniform3ui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3ui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawElementsInstancedARB +.private_extern _bluegl_glProgramUniform4ui64vNV .align 2 -_bluegl_glDrawElementsInstancedARB: - adrp x16, ___blue_glCore_glDrawElementsInstancedARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawElementsInstancedARB@GOTPAGEOFF] +_bluegl_glProgramUniform4ui64vNV: + adrp x16, ___blue_glCore_glProgramUniform4ui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4ui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMinmaxParameterfv +.private_extern _bluegl_glVertexAttribParameteriAMD .align 2 -_bluegl_glGetMinmaxParameterfv: - adrp x16, ___blue_glCore_glGetMinmaxParameterfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMinmaxParameterfv@GOTPAGEOFF] +_bluegl_glVertexAttribParameteriAMD: + adrp x16, ___blue_glCore_glVertexAttribParameteriAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribParameteriAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixPushEXT +.private_extern _bluegl_glMultiDrawArraysIndirectAMD .align 2 -_bluegl_glMatrixPushEXT: - adrp x16, ___blue_glCore_glMatrixPushEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixPushEXT@GOTPAGEOFF] +_bluegl_glMultiDrawArraysIndirectAMD: + adrp x16, ___blue_glCore_glMultiDrawArraysIndirectAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiDrawArraysIndirectAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexParameterIivEXT +.private_extern _bluegl_glMultiDrawElementsIndirectAMD .align 2 -_bluegl_glMultiTexParameterIivEXT: - adrp x16, ___blue_glCore_glMultiTexParameterIivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexParameterIivEXT@GOTPAGEOFF] +_bluegl_glMultiDrawElementsIndirectAMD: + adrp x16, ___blue_glCore_glMultiDrawElementsIndirectAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiDrawElementsIndirectAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPathColorGenfvNV +.private_extern _bluegl_glGenNamesAMD .align 2 -_bluegl_glGetPathColorGenfvNV: - adrp x16, ___blue_glCore_glGetPathColorGenfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPathColorGenfvNV@GOTPAGEOFF] +_bluegl_glGenNamesAMD: + adrp x16, ___blue_glCore_glGenNamesAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenNamesAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindProgramNV +.private_extern _bluegl_glDeleteNamesAMD .align 2 -_bluegl_glBindProgramNV: - adrp x16, ___blue_glCore_glBindProgramNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindProgramNV@GOTPAGEOFF] +_bluegl_glDeleteNamesAMD: + adrp x16, ___blue_glCore_glDeleteNamesAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteNamesAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferReadBufferEXT +.private_extern _bluegl_glIsNameAMD .align 2 -_bluegl_glFramebufferReadBufferEXT: - adrp x16, ___blue_glCore_glFramebufferReadBufferEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferReadBufferEXT@GOTPAGEOFF] +_bluegl_glIsNameAMD: + adrp x16, ___blue_glCore_glIsNameAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsNameAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFogCoordfEXT +.private_extern _bluegl_glQueryObjectParameteruiAMD .align 2 -_bluegl_glFogCoordfEXT: - adrp x16, ___blue_glCore_glFogCoordfEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFogCoordfEXT@GOTPAGEOFF] +_bluegl_glQueryObjectParameteruiAMD: + adrp x16, ___blue_glCore_glQueryObjectParameteruiAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glQueryObjectParameteruiAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayNormalOffsetEXT +.private_extern _bluegl_glGetPerfMonitorGroupsAMD .align 2 -_bluegl_glVertexArrayNormalOffsetEXT: - adrp x16, ___blue_glCore_glVertexArrayNormalOffsetEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayNormalOffsetEXT@GOTPAGEOFF] +_bluegl_glGetPerfMonitorGroupsAMD: + adrp x16, ___blue_glCore_glGetPerfMonitorGroupsAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPerfMonitorGroupsAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN +.private_extern _bluegl_glGetPerfMonitorCountersAMD .align 2 -_bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN: - adrp x16, ___blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN@GOTPAGEOFF] +_bluegl_glGetPerfMonitorCountersAMD: + adrp x16, ___blue_glCore_glGetPerfMonitorCountersAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPerfMonitorCountersAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnUniformfv +.private_extern _bluegl_glGetPerfMonitorGroupStringAMD .align 2 -_bluegl_glGetnUniformfv: - adrp x16, ___blue_glCore_glGetnUniformfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnUniformfv@GOTPAGEOFF] +_bluegl_glGetPerfMonitorGroupStringAMD: + adrp x16, ___blue_glCore_glGetPerfMonitorGroupStringAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPerfMonitorGroupStringAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPointParameterfEXT +.private_extern _bluegl_glGetPerfMonitorCounterStringAMD .align 2 -_bluegl_glPointParameterfEXT: - adrp x16, ___blue_glCore_glPointParameterfEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPointParameterfEXT@GOTPAGEOFF] +_bluegl_glGetPerfMonitorCounterStringAMD: + adrp x16, ___blue_glCore_glGetPerfMonitorCounterStringAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPerfMonitorCounterStringAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEndVideoCaptureNV +.private_extern _bluegl_glGetPerfMonitorCounterInfoAMD .align 2 -_bluegl_glEndVideoCaptureNV: - adrp x16, ___blue_glCore_glEndVideoCaptureNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEndVideoCaptureNV@GOTPAGEOFF] +_bluegl_glGetPerfMonitorCounterInfoAMD: + adrp x16, ___blue_glCore_glGetPerfMonitorCounterInfoAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPerfMonitorCounterInfoAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexBlendARB +.private_extern _bluegl_glGenPerfMonitorsAMD .align 2 -_bluegl_glVertexBlendARB: - adrp x16, ___blue_glCore_glVertexBlendARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexBlendARB@GOTPAGEOFF] +_bluegl_glGenPerfMonitorsAMD: + adrp x16, ___blue_glCore_glGenPerfMonitorsAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenPerfMonitorsAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL3i64vNV +.private_extern _bluegl_glDeletePerfMonitorsAMD .align 2 -_bluegl_glVertexAttribL3i64vNV: - adrp x16, ___blue_glCore_glVertexAttribL3i64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL3i64vNV@GOTPAGEOFF] +_bluegl_glDeletePerfMonitorsAMD: + adrp x16, ___blue_glCore_glDeletePerfMonitorsAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeletePerfMonitorsAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3fEXT +.private_extern _bluegl_glSelectPerfMonitorCountersAMD .align 2 -_bluegl_glSecondaryColor3fEXT: - adrp x16, ___blue_glCore_glSecondaryColor3fEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3fEXT@GOTPAGEOFF] +_bluegl_glSelectPerfMonitorCountersAMD: + adrp x16, ___blue_glCore_glSelectPerfMonitorCountersAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSelectPerfMonitorCountersAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStencilFuncSeparateATI +.private_extern _bluegl_glBeginPerfMonitorAMD .align 2 -_bluegl_glStencilFuncSeparateATI: - adrp x16, ___blue_glCore_glStencilFuncSeparateATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStencilFuncSeparateATI@GOTPAGEOFF] +_bluegl_glBeginPerfMonitorAMD: + adrp x16, ___blue_glCore_glBeginPerfMonitorAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBeginPerfMonitorAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedMultiTexSubImage2DEXT +.private_extern _bluegl_glEndPerfMonitorAMD .align 2 -_bluegl_glCompressedMultiTexSubImage2DEXT: - adrp x16, ___blue_glCore_glCompressedMultiTexSubImage2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedMultiTexSubImage2DEXT@GOTPAGEOFF] +_bluegl_glEndPerfMonitorAMD: + adrp x16, ___blue_glCore_glEndPerfMonitorAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEndPerfMonitorAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTransformPathNV +.private_extern _bluegl_glGetPerfMonitorCounterDataAMD .align 2 -_bluegl_glTransformPathNV: - adrp x16, ___blue_glCore_glTransformPathNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTransformPathNV@GOTPAGEOFF] +_bluegl_glGetPerfMonitorCounterDataAMD: + adrp x16, ___blue_glCore_glGetPerfMonitorCounterDataAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPerfMonitorCounterDataAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsEnabledi +.private_extern _bluegl_glSetMultisamplefvAMD .align 2 -_bluegl_glIsEnabledi: - adrp x16, ___blue_glCore_glIsEnabledi@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsEnabledi@GOTPAGEOFF] +_bluegl_glSetMultisamplefvAMD: + adrp x16, ___blue_glCore_glSetMultisamplefvAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSetMultisamplefvAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glExtractComponentEXT +.private_extern _bluegl_glTexStorageSparseAMD .align 2 -_bluegl_glExtractComponentEXT: - adrp x16, ___blue_glCore_glExtractComponentEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glExtractComponentEXT@GOTPAGEOFF] +_bluegl_glTexStorageSparseAMD: + adrp x16, ___blue_glCore_glTexStorageSparseAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexStorageSparseAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFixedvOES +.private_extern _bluegl_glTextureStorageSparseAMD .align 2 -_bluegl_glGetFixedvOES: - adrp x16, ___blue_glCore_glGetFixedvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFixedvOES@GOTPAGEOFF] +_bluegl_glTextureStorageSparseAMD: + adrp x16, ___blue_glCore_glTextureStorageSparseAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureStorageSparseAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteProgramPipelines +.private_extern _bluegl_glStencilOpValueAMD .align 2 -_bluegl_glDeleteProgramPipelines: - adrp x16, ___blue_glCore_glDeleteProgramPipelines@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteProgramPipelines@GOTPAGEOFF] +_bluegl_glStencilOpValueAMD: + adrp x16, ___blue_glCore_glStencilOpValueAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStencilOpValueAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyMultiTexSubImage3DEXT +.private_extern _bluegl_glTessellationFactorAMD .align 2 -_bluegl_glCopyMultiTexSubImage3DEXT: - adrp x16, ___blue_glCore_glCopyMultiTexSubImage3DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyMultiTexSubImage3DEXT@GOTPAGEOFF] +_bluegl_glTessellationFactorAMD: + adrp x16, ___blue_glCore_glTessellationFactorAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTessellationFactorAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreateStatesNV +.private_extern _bluegl_glTessellationModeAMD .align 2 -_bluegl_glCreateStatesNV: - adrp x16, ___blue_glCore_glCreateStatesNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreateStatesNV@GOTPAGEOFF] +_bluegl_glTessellationModeAMD: + adrp x16, ___blue_glCore_glTessellationModeAMD@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTessellationModeAMD@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSwizzleEXT +.private_extern _bluegl_glElementPointerAPPLE .align 2 -_bluegl_glSwizzleEXT: - adrp x16, ___blue_glCore_glSwizzleEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSwizzleEXT@GOTPAGEOFF] +_bluegl_glElementPointerAPPLE: + adrp x16, ___blue_glCore_glElementPointerAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glElementPointerAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexWeightfvEXT +.private_extern _bluegl_glDrawElementArrayAPPLE .align 2 -_bluegl_glVertexWeightfvEXT: - adrp x16, ___blue_glCore_glVertexWeightfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexWeightfvEXT@GOTPAGEOFF] +_bluegl_glDrawElementArrayAPPLE: + adrp x16, ___blue_glCore_glDrawElementArrayAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawElementArrayAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormalPointerEXT +.private_extern _bluegl_glDrawRangeElementArrayAPPLE .align 2 -_bluegl_glNormalPointerEXT: - adrp x16, ___blue_glCore_glNormalPointerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormalPointerEXT@GOTPAGEOFF] +_bluegl_glDrawRangeElementArrayAPPLE: + adrp x16, ___blue_glCore_glDrawRangeElementArrayAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawRangeElementArrayAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetConvolutionFilterEXT +.private_extern _bluegl_glMultiDrawElementArrayAPPLE .align 2 -_bluegl_glGetConvolutionFilterEXT: - adrp x16, ___blue_glCore_glGetConvolutionFilterEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetConvolutionFilterEXT@GOTPAGEOFF] +_bluegl_glMultiDrawElementArrayAPPLE: + adrp x16, ___blue_glCore_glMultiDrawElementArrayAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiDrawElementArrayAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCurrentPaletteMatrixARB +.private_extern _bluegl_glMultiDrawRangeElementArrayAPPLE .align 2 -_bluegl_glCurrentPaletteMatrixARB: - adrp x16, ___blue_glCore_glCurrentPaletteMatrixARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCurrentPaletteMatrixARB@GOTPAGEOFF] +_bluegl_glMultiDrawRangeElementArrayAPPLE: + adrp x16, ___blue_glCore_glMultiDrawRangeElementArrayAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiDrawRangeElementArrayAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream4sATI +.private_extern _bluegl_glGenFencesAPPLE .align 2 -_bluegl_glVertexStream4sATI: - adrp x16, ___blue_glCore_glVertexStream4sATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream4sATI@GOTPAGEOFF] +_bluegl_glGenFencesAPPLE: + adrp x16, ___blue_glCore_glGenFencesAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenFencesAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3ui64ARB +.private_extern _bluegl_glDeleteFencesAPPLE .align 2 -_bluegl_glUniform3ui64ARB: - adrp x16, ___blue_glCore_glUniform3ui64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3ui64ARB@GOTPAGEOFF] +_bluegl_glDeleteFencesAPPLE: + adrp x16, ___blue_glCore_glDeleteFencesAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteFencesAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1uivEXT +.private_extern _bluegl_glSetFenceAPPLE .align 2 -_bluegl_glProgramUniform1uivEXT: - adrp x16, ___blue_glCore_glProgramUniform1uivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1uivEXT@GOTPAGEOFF] +_bluegl_glSetFenceAPPLE: + adrp x16, ___blue_glCore_glSetFenceAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSetFenceAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribs3dvNV +.private_extern _bluegl_glIsFenceAPPLE .align 2 -_bluegl_glVertexAttribs3dvNV: - adrp x16, ___blue_glCore_glVertexAttribs3dvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribs3dvNV@GOTPAGEOFF] +_bluegl_glIsFenceAPPLE: + adrp x16, ___blue_glCore_glIsFenceAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsFenceAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glExecuteProgramNV +.private_extern _bluegl_glTestFenceAPPLE .align 2 -_bluegl_glExecuteProgramNV: - adrp x16, ___blue_glCore_glExecuteProgramNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glExecuteProgramNV@GOTPAGEOFF] +_bluegl_glTestFenceAPPLE: + adrp x16, ___blue_glCore_glTestFenceAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTestFenceAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFrameZoomSGIX +.private_extern _bluegl_glFinishFenceAPPLE .align 2 -_bluegl_glFrameZoomSGIX: - adrp x16, ___blue_glCore_glFrameZoomSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFrameZoomSGIX@GOTPAGEOFF] +_bluegl_glFinishFenceAPPLE: + adrp x16, ___blue_glCore_glFinishFenceAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFinishFenceAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFragmentMaterialfSGIX +.private_extern _bluegl_glTestObjectAPPLE .align 2 -_bluegl_glFragmentMaterialfSGIX: - adrp x16, ___blue_glCore_glFragmentMaterialfSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFragmentMaterialfSGIX@GOTPAGEOFF] +_bluegl_glTestObjectAPPLE: + adrp x16, ___blue_glCore_glTestObjectAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTestObjectAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferTextureLayerEXT +.private_extern _bluegl_glFinishObjectAPPLE .align 2 -_bluegl_glFramebufferTextureLayerEXT: - adrp x16, ___blue_glCore_glFramebufferTextureLayerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferTextureLayerEXT@GOTPAGEOFF] +_bluegl_glFinishObjectAPPLE: + adrp x16, ___blue_glCore_glFinishObjectAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFinishObjectAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream1iATI +.private_extern _bluegl_glBufferParameteriAPPLE .align 2 -_bluegl_glVertexStream1iATI: - adrp x16, ___blue_glCore_glVertexStream1iATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream1iATI@GOTPAGEOFF] +_bluegl_glBufferParameteriAPPLE: + adrp x16, ___blue_glCore_glBufferParameteriAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBufferParameteriAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3s +.private_extern _bluegl_glFlushMappedBufferRangeAPPLE .align 2 -_bluegl_glVertexAttrib3s: - adrp x16, ___blue_glCore_glVertexAttrib3s@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3s@GOTPAGEOFF] +_bluegl_glFlushMappedBufferRangeAPPLE: + adrp x16, ___blue_glCore_glFlushMappedBufferRangeAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFlushMappedBufferRangeAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferTextureMultiviewOVR +.private_extern _bluegl_glObjectPurgeableAPPLE .align 2 -_bluegl_glFramebufferTextureMultiviewOVR: - adrp x16, ___blue_glCore_glFramebufferTextureMultiviewOVR@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferTextureMultiviewOVR@GOTPAGEOFF] +_bluegl_glObjectPurgeableAPPLE: + adrp x16, ___blue_glCore_glObjectPurgeableAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glObjectPurgeableAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glElementPointerAPPLE +.private_extern _bluegl_glObjectUnpurgeableAPPLE .align 2 -_bluegl_glElementPointerAPPLE: - adrp x16, ___blue_glCore_glElementPointerAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glElementPointerAPPLE@GOTPAGEOFF] +_bluegl_glObjectUnpurgeableAPPLE: + adrp x16, ___blue_glCore_glObjectUnpurgeableAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glObjectUnpurgeableAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos4ivMESA +.private_extern _bluegl_glGetObjectParameterivAPPLE .align 2 -_bluegl_glWindowPos4ivMESA: - adrp x16, ___blue_glCore_glWindowPos4ivMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos4ivMESA@GOTPAGEOFF] +_bluegl_glGetObjectParameterivAPPLE: + adrp x16, ___blue_glCore_glGetObjectParameterivAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetObjectParameterivAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexSubImage3D +.private_extern _bluegl_glTextureRangeAPPLE .align 2 -_bluegl_glTexSubImage3D: - adrp x16, ___blue_glCore_glTexSubImage3D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexSubImage3D@GOTPAGEOFF] +_bluegl_glTextureRangeAPPLE: + adrp x16, ___blue_glCore_glTextureRangeAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureRangeAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFragmentMaterialfvSGIX +.private_extern _bluegl_glGetTexParameterPointervAPPLE .align 2 -_bluegl_glGetFragmentMaterialfvSGIX: - adrp x16, ___blue_glCore_glGetFragmentMaterialfvSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFragmentMaterialfvSGIX@GOTPAGEOFF] +_bluegl_glGetTexParameterPointervAPPLE: + adrp x16, ___blue_glCore_glGetTexParameterPointervAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTexParameterPointervAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1dEXT +.private_extern _bluegl_glBindVertexArrayAPPLE .align 2 -_bluegl_glProgramUniform1dEXT: - adrp x16, ___blue_glCore_glProgramUniform1dEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1dEXT@GOTPAGEOFF] +_bluegl_glBindVertexArrayAPPLE: + adrp x16, ___blue_glCore_glBindVertexArrayAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindVertexArrayAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFragmentLightfvSGIX +.private_extern _bluegl_glDeleteVertexArraysAPPLE .align 2 -_bluegl_glGetFragmentLightfvSGIX: - adrp x16, ___blue_glCore_glGetFragmentLightfvSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFragmentLightfvSGIX@GOTPAGEOFF] +_bluegl_glDeleteVertexArraysAPPLE: + adrp x16, ___blue_glCore_glDeleteVertexArraysAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteVertexArraysAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord2bOES +.private_extern _bluegl_glGenVertexArraysAPPLE .align 2 -_bluegl_glTexCoord2bOES: - adrp x16, ___blue_glCore_glTexCoord2bOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord2bOES@GOTPAGEOFF] +_bluegl_glGenVertexArraysAPPLE: + adrp x16, ___blue_glCore_glGenVertexArraysAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenVertexArraysAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3fv +.private_extern _bluegl_glIsVertexArrayAPPLE .align 2 -_bluegl_glVertexAttrib3fv: - adrp x16, ___blue_glCore_glVertexAttrib3fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3fv@GOTPAGEOFF] +_bluegl_glIsVertexArrayAPPLE: + adrp x16, ___blue_glCore_glIsVertexArrayAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsVertexArrayAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMakeNamedBufferNonResidentNV +.private_extern _bluegl_glVertexArrayRangeAPPLE .align 2 -_bluegl_glMakeNamedBufferNonResidentNV: - adrp x16, ___blue_glCore_glMakeNamedBufferNonResidentNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMakeNamedBufferNonResidentNV@GOTPAGEOFF] +_bluegl_glVertexArrayRangeAPPLE: + adrp x16, ___blue_glCore_glVertexArrayRangeAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayRangeAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsProgramARB +.private_extern _bluegl_glFlushVertexArrayRangeAPPLE .align 2 -_bluegl_glIsProgramARB: - adrp x16, ___blue_glCore_glIsProgramARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsProgramARB@GOTPAGEOFF] +_bluegl_glFlushVertexArrayRangeAPPLE: + adrp x16, ___blue_glCore_glFlushVertexArrayRangeAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFlushVertexArrayRangeAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glScissorArrayv +.private_extern _bluegl_glVertexArrayParameteriAPPLE .align 2 -_bluegl_glScissorArrayv: - adrp x16, ___blue_glCore_glScissorArrayv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glScissorArrayv@GOTPAGEOFF] +_bluegl_glVertexArrayParameteriAPPLE: + adrp x16, ___blue_glCore_glVertexArrayParameteriAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayParameteriAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiDrawElementsIndirect +.private_extern _bluegl_glEnableVertexAttribAPPLE .align 2 -_bluegl_glMultiDrawElementsIndirect: - adrp x16, ___blue_glCore_glMultiDrawElementsIndirect@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiDrawElementsIndirect@GOTPAGEOFF] +_bluegl_glEnableVertexAttribAPPLE: + adrp x16, ___blue_glCore_glEnableVertexAttribAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEnableVertexAttribAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMultiTexParameterfvEXT +.private_extern _bluegl_glDisableVertexAttribAPPLE .align 2 -_bluegl_glGetMultiTexParameterfvEXT: - adrp x16, ___blue_glCore_glGetMultiTexParameterfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMultiTexParameterfvEXT@GOTPAGEOFF] +_bluegl_glDisableVertexAttribAPPLE: + adrp x16, ___blue_glCore_glDisableVertexAttribAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDisableVertexAttribAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2iARB +.private_extern _bluegl_glIsVertexAttribEnabledAPPLE .align 2 -_bluegl_glWindowPos2iARB: - adrp x16, ___blue_glCore_glWindowPos2iARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2iARB@GOTPAGEOFF] +_bluegl_glIsVertexAttribEnabledAPPLE: + adrp x16, ___blue_glCore_glIsVertexAttribEnabledAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsVertexAttribEnabledAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramStringNV +.private_extern _bluegl_glMapVertexAttrib1dAPPLE .align 2 -_bluegl_glGetProgramStringNV: - adrp x16, ___blue_glCore_glGetProgramStringNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramStringNV@GOTPAGEOFF] +_bluegl_glMapVertexAttrib1dAPPLE: + adrp x16, ___blue_glCore_glMapVertexAttrib1dAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMapVertexAttrib1dAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTranslatexOES +.private_extern _bluegl_glMapVertexAttrib1fAPPLE .align 2 -_bluegl_glTranslatexOES: - adrp x16, ___blue_glCore_glTranslatexOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTranslatexOES@GOTPAGEOFF] +_bluegl_glMapVertexAttrib1fAPPLE: + adrp x16, ___blue_glCore_glMapVertexAttrib1fAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMapVertexAttrib1fAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4d +.private_extern _bluegl_glMapVertexAttrib2dAPPLE .align 2 -_bluegl_glMultiTexCoord4d: - adrp x16, ___blue_glCore_glMultiTexCoord4d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4d@GOTPAGEOFF] +_bluegl_glMapVertexAttrib2dAPPLE: + adrp x16, ___blue_glCore_glMapVertexAttrib2dAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMapVertexAttrib2dAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorTableParameterfvSGI +.private_extern _bluegl_glMapVertexAttrib2fAPPLE .align 2 -_bluegl_glColorTableParameterfvSGI: - adrp x16, ___blue_glCore_glColorTableParameterfvSGI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorTableParameterfvSGI@GOTPAGEOFF] +_bluegl_glMapVertexAttrib2fAPPLE: + adrp x16, ___blue_glCore_glMapVertexAttrib2fAPPLE@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMapVertexAttrib2fAPPLE@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord3bvOES +.private_extern _bluegl_glDrawBuffersATI .align 2 -_bluegl_glTexCoord3bvOES: - adrp x16, ___blue_glCore_glTexCoord3bvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord3bvOES@GOTPAGEOFF] +_bluegl_glDrawBuffersATI: + adrp x16, ___blue_glCore_glDrawBuffersATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawBuffersATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2ui64vARB +.private_extern _bluegl_glElementPointerATI .align 2 -_bluegl_glUniform2ui64vARB: - adrp x16, ___blue_glCore_glUniform2ui64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2ui64vARB@GOTPAGEOFF] +_bluegl_glElementPointerATI: + adrp x16, ___blue_glCore_glElementPointerATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glElementPointerATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixIndexusvARB +.private_extern _bluegl_glDrawElementArrayATI .align 2 -_bluegl_glMatrixIndexusvARB: - adrp x16, ___blue_glCore_glMatrixIndexusvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixIndexusvARB@GOTPAGEOFF] +_bluegl_glDrawElementArrayATI: + adrp x16, ___blue_glCore_glDrawElementArrayATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawElementArrayATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMultiTexGenfvEXT +.private_extern _bluegl_glDrawRangeElementArrayATI .align 2 -_bluegl_glGetMultiTexGenfvEXT: - adrp x16, ___blue_glCore_glGetMultiTexGenfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMultiTexGenfvEXT@GOTPAGEOFF] +_bluegl_glDrawRangeElementArrayATI: + adrp x16, ___blue_glCore_glDrawRangeElementArrayATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawRangeElementArrayATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenerateTextureMipmapEXT +.private_extern _bluegl_glTexBumpParameterivATI .align 2 -_bluegl_glGenerateTextureMipmapEXT: - adrp x16, ___blue_glCore_glGenerateTextureMipmapEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenerateTextureMipmapEXT@GOTPAGEOFF] +_bluegl_glTexBumpParameterivATI: + adrp x16, ___blue_glCore_glTexBumpParameterivATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexBumpParameterivATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMapParameterivNV +.private_extern _bluegl_glTexBumpParameterfvATI .align 2 -_bluegl_glGetMapParameterivNV: - adrp x16, ___blue_glCore_glGetMapParameterivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMapParameterivNV@GOTPAGEOFF] +_bluegl_glTexBumpParameterfvATI: + adrp x16, ___blue_glCore_glTexBumpParameterfvATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexBumpParameterfvATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetConvolutionParameterxvOES +.private_extern _bluegl_glGetTexBumpParameterivATI .align 2 -_bluegl_glGetConvolutionParameterxvOES: - adrp x16, ___blue_glCore_glGetConvolutionParameterxvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetConvolutionParameterxvOES@GOTPAGEOFF] +_bluegl_glGetTexBumpParameterivATI: + adrp x16, ___blue_glCore_glGetTexBumpParameterivATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTexBumpParameterivATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4fvNV +.private_extern _bluegl_glGetTexBumpParameterfvATI .align 2 -_bluegl_glVertexAttrib4fvNV: - adrp x16, ___blue_glCore_glVertexAttrib4fvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4fvNV@GOTPAGEOFF] +_bluegl_glGetTexBumpParameterfvATI: + adrp x16, ___blue_glCore_glGetTexBumpParameterfvATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTexBumpParameterfvATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBufferDataARB +.private_extern _bluegl_glGenFragmentShadersATI .align 2 -_bluegl_glBufferDataARB: - adrp x16, ___blue_glCore_glBufferDataARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBufferDataARB@GOTPAGEOFF] +_bluegl_glGenFragmentShadersATI: + adrp x16, ___blue_glCore_glGenFragmentShadersATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenFragmentShadersATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos4fMESA +.private_extern _bluegl_glBindFragmentShaderATI .align 2 -_bluegl_glWindowPos4fMESA: - adrp x16, ___blue_glCore_glWindowPos4fMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos4fMESA@GOTPAGEOFF] +_bluegl_glBindFragmentShaderATI: + adrp x16, ___blue_glCore_glBindFragmentShaderATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindFragmentShaderATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPushDebugGroup +.private_extern _bluegl_glDeleteFragmentShaderATI .align 2 -_bluegl_glPushDebugGroup: - adrp x16, ___blue_glCore_glPushDebugGroup@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPushDebugGroup@GOTPAGEOFF] +_bluegl_glDeleteFragmentShaderATI: + adrp x16, ___blue_glCore_glDeleteFragmentShaderATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteFragmentShaderATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2fEXT +.private_extern _bluegl_glBeginFragmentShaderATI .align 2 -_bluegl_glProgramUniform2fEXT: - adrp x16, ___blue_glCore_glProgramUniform2fEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2fEXT@GOTPAGEOFF] +_bluegl_glBeginFragmentShaderATI: + adrp x16, ___blue_glCore_glBeginFragmentShaderATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBeginFragmentShaderATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyTexImage1DEXT +.private_extern _bluegl_glEndFragmentShaderATI .align 2 -_bluegl_glCopyTexImage1DEXT: - adrp x16, ___blue_glCore_glCopyTexImage1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyTexImage1DEXT@GOTPAGEOFF] +_bluegl_glEndFragmentShaderATI: + adrp x16, ___blue_glCore_glEndFragmentShaderATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEndFragmentShaderATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTexSubImage2DARB +.private_extern _bluegl_glPassTexCoordATI .align 2 -_bluegl_glCompressedTexSubImage2DARB: - adrp x16, ___blue_glCore_glCompressedTexSubImage2DARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTexSubImage2DARB@GOTPAGEOFF] +_bluegl_glPassTexCoordATI: + adrp x16, ___blue_glCore_glPassTexCoordATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPassTexCoordATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyColorSubTableEXT +.private_extern _bluegl_glSampleMapATI .align 2 -_bluegl_glCopyColorSubTableEXT: - adrp x16, ___blue_glCore_glCopyColorSubTableEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyColorSubTableEXT@GOTPAGEOFF] +_bluegl_glSampleMapATI: + adrp x16, ___blue_glCore_glSampleMapATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSampleMapATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTransformFeedbackAttribsNV +.private_extern _bluegl_glColorFragmentOp1ATI .align 2 -_bluegl_glTransformFeedbackAttribsNV: - adrp x16, ___blue_glCore_glTransformFeedbackAttribsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTransformFeedbackAttribsNV@GOTPAGEOFF] +_bluegl_glColorFragmentOp1ATI: + adrp x16, ___blue_glCore_glColorFragmentOp1ATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorFragmentOp1ATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixFrustumEXT +.private_extern _bluegl_glColorFragmentOp2ATI .align 2 -_bluegl_glMatrixFrustumEXT: - adrp x16, ___blue_glCore_glMatrixFrustumEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixFrustumEXT@GOTPAGEOFF] +_bluegl_glColorFragmentOp2ATI: + adrp x16, ___blue_glCore_glColorFragmentOp2ATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorFragmentOp2ATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsBufferARB +.private_extern _bluegl_glColorFragmentOp3ATI .align 2 -_bluegl_glIsBufferARB: - adrp x16, ___blue_glCore_glIsBufferARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsBufferARB@GOTPAGEOFF] +_bluegl_glColorFragmentOp3ATI: + adrp x16, ___blue_glCore_glColorFragmentOp3ATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorFragmentOp3ATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3fvARB +.private_extern _bluegl_glAlphaFragmentOp1ATI .align 2 -_bluegl_glUniform3fvARB: - adrp x16, ___blue_glCore_glUniform3fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3fvARB@GOTPAGEOFF] +_bluegl_glAlphaFragmentOp1ATI: + adrp x16, ___blue_glCore_glAlphaFragmentOp1ATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glAlphaFragmentOp1ATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3dARB +.private_extern _bluegl_glAlphaFragmentOp2ATI .align 2 -_bluegl_glMultiTexCoord3dARB: - adrp x16, ___blue_glCore_glMultiTexCoord3dARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3dARB@GOTPAGEOFF] +_bluegl_glAlphaFragmentOp2ATI: + adrp x16, ___blue_glCore_glAlphaFragmentOp2ATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glAlphaFragmentOp2ATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIndexPointerEXT +.private_extern _bluegl_glAlphaFragmentOp3ATI .align 2 -_bluegl_glIndexPointerEXT: - adrp x16, ___blue_glCore_glIndexPointerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIndexPointerEXT@GOTPAGEOFF] +_bluegl_glAlphaFragmentOp3ATI: + adrp x16, ___blue_glCore_glAlphaFragmentOp3ATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glAlphaFragmentOp3ATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixLoad3x3fNV +.private_extern _bluegl_glSetFragmentShaderConstantATI .align 2 -_bluegl_glMatrixLoad3x3fNV: - adrp x16, ___blue_glCore_glMatrixLoad3x3fNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixLoad3x3fNV@GOTPAGEOFF] +_bluegl_glSetFragmentShaderConstantATI: + adrp x16, ___blue_glCore_glSetFragmentShaderConstantATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSetFragmentShaderConstantATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUnmapNamedBufferEXT +.private_extern _bluegl_glMapObjectBufferATI .align 2 -_bluegl_glUnmapNamedBufferEXT: - adrp x16, ___blue_glCore_glUnmapNamedBufferEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUnmapNamedBufferEXT@GOTPAGEOFF] +_bluegl_glMapObjectBufferATI: + adrp x16, ___blue_glCore_glMapObjectBufferATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMapObjectBufferATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreateProgramObjectARB +.private_extern _bluegl_glUnmapObjectBufferATI .align 2 -_bluegl_glCreateProgramObjectARB: - adrp x16, ___blue_glCore_glCreateProgramObjectARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreateProgramObjectARB@GOTPAGEOFF] +_bluegl_glUnmapObjectBufferATI: + adrp x16, ___blue_glCore_glUnmapObjectBufferATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUnmapObjectBufferATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMapGrid2xOES +.private_extern _bluegl_glPNTrianglesiATI .align 2 -_bluegl_glMapGrid2xOES: - adrp x16, ___blue_glCore_glMapGrid2xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMapGrid2xOES@GOTPAGEOFF] +_bluegl_glPNTrianglesiATI: + adrp x16, ___blue_glCore_glPNTrianglesiATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPNTrianglesiATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexPointerEXT +.private_extern _bluegl_glPNTrianglesfATI .align 2 -_bluegl_glVertexPointerEXT: - adrp x16, ___blue_glCore_glVertexPointerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexPointerEXT@GOTPAGEOFF] +_bluegl_glPNTrianglesfATI: + adrp x16, ___blue_glCore_glPNTrianglesfATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPNTrianglesfATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream4svATI +.private_extern _bluegl_glStencilOpSeparateATI .align 2 -_bluegl_glVertexStream4svATI: - adrp x16, ___blue_glCore_glVertexStream4svATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream4svATI@GOTPAGEOFF] +_bluegl_glStencilOpSeparateATI: + adrp x16, ___blue_glCore_glStencilOpSeparateATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStencilOpSeparateATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2hvNV +.private_extern _bluegl_glStencilFuncSeparateATI .align 2 -_bluegl_glMultiTexCoord2hvNV: - adrp x16, ___blue_glCore_glMultiTexCoord2hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2hvNV@GOTPAGEOFF] +_bluegl_glStencilFuncSeparateATI: + adrp x16, ___blue_glCore_glStencilFuncSeparateATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStencilFuncSeparateATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLabelObjectEXT +.private_extern _bluegl_glNewObjectBufferATI .align 2 -_bluegl_glLabelObjectEXT: - adrp x16, ___blue_glCore_glLabelObjectEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLabelObjectEXT@GOTPAGEOFF] +_bluegl_glNewObjectBufferATI: + adrp x16, ___blue_glCore_glNewObjectBufferATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNewObjectBufferATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureImage3DMultisampleNV +.private_extern _bluegl_glIsObjectBufferATI .align 2 -_bluegl_glTextureImage3DMultisampleNV: - adrp x16, ___blue_glCore_glTextureImage3DMultisampleNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureImage3DMultisampleNV@GOTPAGEOFF] +_bluegl_glIsObjectBufferATI: + adrp x16, ___blue_glCore_glIsObjectBufferATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsObjectBufferATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultTransposeMatrixd +.private_extern _bluegl_glUpdateObjectBufferATI .align 2 -_bluegl_glMultTransposeMatrixd: - adrp x16, ___blue_glCore_glMultTransposeMatrixd@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultTransposeMatrixd@GOTPAGEOFF] +_bluegl_glUpdateObjectBufferATI: + adrp x16, ___blue_glCore_glUpdateObjectBufferATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUpdateObjectBufferATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2fARB +.private_extern _bluegl_glGetObjectBufferfvATI .align 2 -_bluegl_glMultiTexCoord2fARB: - adrp x16, ___blue_glCore_glMultiTexCoord2fARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2fARB@GOTPAGEOFF] +_bluegl_glGetObjectBufferfvATI: + adrp x16, ___blue_glCore_glGetObjectBufferfvATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetObjectBufferfvATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2dARB +.private_extern _bluegl_glGetObjectBufferivATI .align 2 -_bluegl_glMultiTexCoord2dARB: - adrp x16, ___blue_glCore_glMultiTexCoord2dARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2dARB@GOTPAGEOFF] +_bluegl_glGetObjectBufferivATI: + adrp x16, ___blue_glCore_glGetObjectBufferivATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetObjectBufferivATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetCombinerOutputParameterfvNV +.private_extern _bluegl_glFreeObjectBufferATI .align 2 -_bluegl_glGetCombinerOutputParameterfvNV: - adrp x16, ___blue_glCore_glGetCombinerOutputParameterfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetCombinerOutputParameterfvNV@GOTPAGEOFF] +_bluegl_glFreeObjectBufferATI: + adrp x16, ___blue_glCore_glFreeObjectBufferATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFreeObjectBufferATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetBufferPointerv +.private_extern _bluegl_glArrayObjectATI .align 2 -_bluegl_glGetBufferPointerv: - adrp x16, ___blue_glCore_glGetBufferPointerv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetBufferPointerv@GOTPAGEOFF] +_bluegl_glArrayObjectATI: + adrp x16, ___blue_glCore_glArrayObjectATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glArrayObjectATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1dNV +.private_extern _bluegl_glGetArrayObjectfvATI .align 2 -_bluegl_glVertexAttrib1dNV: - adrp x16, ___blue_glCore_glVertexAttrib1dNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1dNV@GOTPAGEOFF] +_bluegl_glGetArrayObjectfvATI: + adrp x16, ___blue_glCore_glGetArrayObjectfvATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetArrayObjectfvATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureView +.private_extern _bluegl_glGetArrayObjectivATI .align 2 -_bluegl_glTextureView: - adrp x16, ___blue_glCore_glTextureView@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureView@GOTPAGEOFF] +_bluegl_glGetArrayObjectivATI: + adrp x16, ___blue_glCore_glGetArrayObjectivATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetArrayObjectivATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlitFramebufferEXT +.private_extern _bluegl_glVariantArrayObjectATI .align 2 -_bluegl_glBlitFramebufferEXT: - adrp x16, ___blue_glCore_glBlitFramebufferEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlitFramebufferEXT@GOTPAGEOFF] +_bluegl_glVariantArrayObjectATI: + adrp x16, ___blue_glCore_glVariantArrayObjectATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVariantArrayObjectATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexWeightPointerEXT +.private_extern _bluegl_glGetVariantArrayObjectfvATI .align 2 -_bluegl_glVertexWeightPointerEXT: - adrp x16, ___blue_glCore_glVertexWeightPointerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexWeightPointerEXT@GOTPAGEOFF] +_bluegl_glGetVariantArrayObjectfvATI: + adrp x16, ___blue_glCore_glGetVariantArrayObjectfvATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVariantArrayObjectfvATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindTextures +.private_extern _bluegl_glGetVariantArrayObjectivATI .align 2 -_bluegl_glBindTextures: - adrp x16, ___blue_glCore_glBindTextures@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindTextures@GOTPAGEOFF] +_bluegl_glGetVariantArrayObjectivATI: + adrp x16, ___blue_glCore_glGetVariantArrayObjectivATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVariantArrayObjectivATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearBufferiv +.private_extern _bluegl_glVertexAttribArrayObjectATI .align 2 -_bluegl_glClearBufferiv: - adrp x16, ___blue_glCore_glClearBufferiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearBufferiv@GOTPAGEOFF] +_bluegl_glVertexAttribArrayObjectATI: + adrp x16, ___blue_glCore_glVertexAttribArrayObjectATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribArrayObjectATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4ivARB +.private_extern _bluegl_glGetVertexAttribArrayObjectfvATI .align 2 -_bluegl_glMultiTexCoord4ivARB: - adrp x16, ___blue_glCore_glMultiTexCoord4ivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4ivARB@GOTPAGEOFF] +_bluegl_glGetVertexAttribArrayObjectfvATI: + adrp x16, ___blue_glCore_glGetVertexAttribArrayObjectfvATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribArrayObjectfvATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetImageHandleNV +.private_extern _bluegl_glGetVertexAttribArrayObjectivATI .align 2 -_bluegl_glGetImageHandleNV: - adrp x16, ___blue_glCore_glGetImageHandleNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetImageHandleNV@GOTPAGEOFF] +_bluegl_glGetVertexAttribArrayObjectivATI: + adrp x16, ___blue_glCore_glGetVertexAttribArrayObjectivATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribArrayObjectivATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetDoublei_vEXT +.private_extern _bluegl_glVertexStream1sATI .align 2 -_bluegl_glGetDoublei_vEXT: - adrp x16, ___blue_glCore_glGetDoublei_vEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetDoublei_vEXT@GOTPAGEOFF] +_bluegl_glVertexStream1sATI: + adrp x16, ___blue_glCore_glVertexStream1sATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream1sATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1i64NV +.private_extern _bluegl_glVertexStream1svATI .align 2 -_bluegl_glProgramUniform1i64NV: - adrp x16, ___blue_glCore_glProgramUniform1i64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1i64NV@GOTPAGEOFF] +_bluegl_glVertexStream1svATI: + adrp x16, ___blue_glCore_glVertexStream1svATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream1svATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN +.private_extern _bluegl_glVertexStream1iATI .align 2 -_bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN: - adrp x16, ___blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN@GOTPAGEOFF] +_bluegl_glVertexStream1iATI: + adrp x16, ___blue_glCore_glVertexStream1iATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream1iATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3s +.private_extern _bluegl_glVertexStream1ivATI .align 2 -_bluegl_glWindowPos3s: - adrp x16, ___blue_glCore_glWindowPos3s@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3s@GOTPAGEOFF] +_bluegl_glVertexStream1ivATI: + adrp x16, ___blue_glCore_glVertexStream1ivATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream1ivATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4i64ARB +.private_extern _bluegl_glVertexStream1fATI .align 2 -_bluegl_glUniform4i64ARB: - adrp x16, ___blue_glCore_glUniform4i64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4i64ARB@GOTPAGEOFF] +_bluegl_glVertexStream1fATI: + adrp x16, ___blue_glCore_glVertexStream1fATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream1fATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2dvEXT +.private_extern _bluegl_glVertexStream1fvATI .align 2 -_bluegl_glProgramUniform2dvEXT: - adrp x16, ___blue_glCore_glProgramUniform2dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2dvEXT@GOTPAGEOFF] +_bluegl_glVertexStream1fvATI: + adrp x16, ___blue_glCore_glVertexStream1fvATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream1fvATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexSubImage1DEXT +.private_extern _bluegl_glVertexStream1dATI .align 2 -_bluegl_glMultiTexSubImage1DEXT: - adrp x16, ___blue_glCore_glMultiTexSubImage1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexSubImage1DEXT@GOTPAGEOFF] +_bluegl_glVertexStream1dATI: + adrp x16, ___blue_glCore_glVertexStream1dATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream1dATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glHint +.private_extern _bluegl_glVertexStream1dvATI .align 2 -_bluegl_glHint: - adrp x16, ___blue_glCore_glHint@GOTPAGE - ldr x16, [x16, ___blue_glCore_glHint@GOTPAGEOFF] +_bluegl_glVertexStream1dvATI: + adrp x16, ___blue_glCore_glVertexStream1dvATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream1dvATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix4fv +.private_extern _bluegl_glVertexStream2sATI .align 2 -_bluegl_glProgramUniformMatrix4fv: - adrp x16, ___blue_glCore_glProgramUniformMatrix4fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4fv@GOTPAGEOFF] +_bluegl_glVertexStream2sATI: + adrp x16, ___blue_glCore_glVertexStream2sATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream2sATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord4bvOES +.private_extern _bluegl_glVertexStream2svATI .align 2 -_bluegl_glTexCoord4bvOES: - adrp x16, ___blue_glCore_glTexCoord4bvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord4bvOES@GOTPAGEOFF] +_bluegl_glVertexStream2svATI: + adrp x16, ___blue_glCore_glVertexStream2svATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream2svATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetQueryObjectiv +.private_extern _bluegl_glVertexStream2iATI .align 2 -_bluegl_glGetQueryObjectiv: - adrp x16, ___blue_glCore_glGetQueryObjectiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetQueryObjectiv@GOTPAGEOFF] +_bluegl_glVertexStream2iATI: + adrp x16, ___blue_glCore_glVertexStream2iATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream2iATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetQueryIndexediv +.private_extern _bluegl_glVertexStream2ivATI .align 2 -_bluegl_glGetQueryIndexediv: - adrp x16, ___blue_glCore_glGetQueryIndexediv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetQueryIndexediv@GOTPAGEOFF] +_bluegl_glVertexStream2ivATI: + adrp x16, ___blue_glCore_glVertexStream2ivATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream2ivATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoordP4ui +.private_extern _bluegl_glVertexStream2fATI .align 2 -_bluegl_glTexCoordP4ui: - adrp x16, ___blue_glCore_glTexCoordP4ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoordP4ui@GOTPAGEOFF] +_bluegl_glVertexStream2fATI: + adrp x16, ___blue_glCore_glVertexStream2fATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream2fATI@GOTPAGEOFF] ldr x16, [x16] br x16 @@ -11275,2851 +11258,2851 @@ _bluegl_glVertexStream2fvATI: ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3fv +.private_extern _bluegl_glVertexStream2dATI .align 2 -_bluegl_glUniform3fv: - adrp x16, ___blue_glCore_glUniform3fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3fv@GOTPAGEOFF] +_bluegl_glVertexStream2dATI: + adrp x16, ___blue_glCore_glVertexStream2dATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream2dATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix2dv +.private_extern _bluegl_glVertexStream2dvATI .align 2 -_bluegl_glUniformMatrix2dv: - adrp x16, ___blue_glCore_glUniformMatrix2dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix2dv@GOTPAGEOFF] +_bluegl_glVertexStream2dvATI: + adrp x16, ___blue_glCore_glVertexStream2dvATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream2dvATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsObjectBufferATI +.private_extern _bluegl_glVertexStream3sATI .align 2 -_bluegl_glIsObjectBufferATI: - adrp x16, ___blue_glCore_glIsObjectBufferATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsObjectBufferATI@GOTPAGEOFF] +_bluegl_glVertexStream3sATI: + adrp x16, ___blue_glCore_glVertexStream3sATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream3sATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribP2uiv +.private_extern _bluegl_glVertexStream3svATI .align 2 -_bluegl_glVertexAttribP2uiv: - adrp x16, ___blue_glCore_glVertexAttribP2uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribP2uiv@GOTPAGEOFF] +_bluegl_glVertexStream3svATI: + adrp x16, ___blue_glCore_glVertexStream3svATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream3svATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompileShader +.private_extern _bluegl_glVertexStream3iATI .align 2 -_bluegl_glCompileShader: - adrp x16, ___blue_glCore_glCompileShader@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompileShader@GOTPAGEOFF] +_bluegl_glVertexStream3iATI: + adrp x16, ___blue_glCore_glVertexStream3iATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream3iATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixScalefEXT +.private_extern _bluegl_glVertexStream3ivATI .align 2 -_bluegl_glMatrixScalefEXT: - adrp x16, ___blue_glCore_glMatrixScalefEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixScalefEXT@GOTPAGEOFF] +_bluegl_glVertexStream3ivATI: + adrp x16, ___blue_glCore_glVertexStream3ivATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream3ivATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBinormal3ivEXT +.private_extern _bluegl_glVertexStream3fATI .align 2 -_bluegl_glBinormal3ivEXT: - adrp x16, ___blue_glCore_glBinormal3ivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBinormal3ivEXT@GOTPAGEOFF] +_bluegl_glVertexStream3fATI: + adrp x16, ___blue_glCore_glVertexStream3fATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream3fATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMapAttribParameterivNV +.private_extern _bluegl_glVertexStream3fvATI .align 2 -_bluegl_glGetMapAttribParameterivNV: - adrp x16, ___blue_glCore_glGetMapAttribParameterivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMapAttribParameterivNV@GOTPAGEOFF] +_bluegl_glVertexStream3fvATI: + adrp x16, ___blue_glCore_glVertexStream3fvATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream3fvATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnPixelMapusvARB +.private_extern _bluegl_glVertexStream3dATI .align 2 -_bluegl_glGetnPixelMapusvARB: - adrp x16, ___blue_glCore_glGetnPixelMapusvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnPixelMapusvARB@GOTPAGEOFF] +_bluegl_glVertexStream3dATI: + adrp x16, ___blue_glCore_glVertexStream3dATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream3dATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPerfMonitorCounterStringAMD +.private_extern _bluegl_glVertexStream3dvATI .align 2 -_bluegl_glGetPerfMonitorCounterStringAMD: - adrp x16, ___blue_glCore_glGetPerfMonitorCounterStringAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPerfMonitorCounterStringAMD@GOTPAGEOFF] +_bluegl_glVertexStream3dvATI: + adrp x16, ___blue_glCore_glVertexStream3dvATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream3dvATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsTextureHandleResidentNV +.private_extern _bluegl_glVertexStream4sATI .align 2 -_bluegl_glIsTextureHandleResidentNV: - adrp x16, ___blue_glCore_glIsTextureHandleResidentNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsTextureHandleResidentNV@GOTPAGEOFF] +_bluegl_glVertexStream4sATI: + adrp x16, ___blue_glCore_glVertexStream4sATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream4sATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWaitSync +.private_extern _bluegl_glVertexStream4svATI .align 2 -_bluegl_glWaitSync: - adrp x16, ___blue_glCore_glWaitSync@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWaitSync@GOTPAGEOFF] +_bluegl_glVertexStream4svATI: + adrp x16, ___blue_glCore_glVertexStream4svATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream4svATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenSamplers +.private_extern _bluegl_glVertexStream4iATI .align 2 -_bluegl_glGenSamplers: - adrp x16, ___blue_glCore_glGenSamplers@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenSamplers@GOTPAGEOFF] +_bluegl_glVertexStream4iATI: + adrp x16, ___blue_glCore_glVertexStream4iATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream4iATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTextureImage3DEXT +.private_extern _bluegl_glVertexStream4ivATI .align 2 -_bluegl_glCompressedTextureImage3DEXT: - adrp x16, ___blue_glCore_glCompressedTextureImage3DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTextureImage3DEXT@GOTPAGEOFF] +_bluegl_glVertexStream4ivATI: + adrp x16, ___blue_glCore_glVertexStream4ivATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream4ivATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPerfMonitorCounterInfoAMD +.private_extern _bluegl_glVertexStream4fATI .align 2 -_bluegl_glGetPerfMonitorCounterInfoAMD: - adrp x16, ___blue_glCore_glGetPerfMonitorCounterInfoAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPerfMonitorCounterInfoAMD@GOTPAGEOFF] +_bluegl_glVertexStream4fATI: + adrp x16, ___blue_glCore_glVertexStream4fATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream4fATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2ivARB +.private_extern _bluegl_glVertexStream4fvATI .align 2 -_bluegl_glUniform2ivARB: - adrp x16, ___blue_glCore_glUniform2ivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2ivARB@GOTPAGEOFF] +_bluegl_glVertexStream4fvATI: + adrp x16, ___blue_glCore_glVertexStream4fvATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream4fvATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2sARB +.private_extern _bluegl_glVertexStream4dATI .align 2 -_bluegl_glVertexAttrib2sARB: - adrp x16, ___blue_glCore_glVertexAttrib2sARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2sARB@GOTPAGEOFF] +_bluegl_glVertexStream4dATI: + adrp x16, ___blue_glCore_glVertexStream4dATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream4dATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawCommandsAddressNV +.private_extern _bluegl_glVertexStream4dvATI .align 2 -_bluegl_glDrawCommandsAddressNV: - adrp x16, ___blue_glCore_glDrawCommandsAddressNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawCommandsAddressNV@GOTPAGEOFF] +_bluegl_glVertexStream4dvATI: + adrp x16, ___blue_glCore_glVertexStream4dvATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexStream4dvATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord1hNV +.private_extern _bluegl_glNormalStream3bATI .align 2 -_bluegl_glTexCoord1hNV: - adrp x16, ___blue_glCore_glTexCoord1hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord1hNV@GOTPAGEOFF] +_bluegl_glNormalStream3bATI: + adrp x16, ___blue_glCore_glNormalStream3bATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormalStream3bATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFirstPerfQueryIdINTEL +.private_extern _bluegl_glNormalStream3bvATI .align 2 -_bluegl_glGetFirstPerfQueryIdINTEL: - adrp x16, ___blue_glCore_glGetFirstPerfQueryIdINTEL@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFirstPerfQueryIdINTEL@GOTPAGEOFF] +_bluegl_glNormalStream3bvATI: + adrp x16, ___blue_glCore_glNormalStream3bvATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormalStream3bvATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferTexture1D +.private_extern _bluegl_glNormalStream3sATI .align 2 -_bluegl_glFramebufferTexture1D: - adrp x16, ___blue_glCore_glFramebufferTexture1D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferTexture1D@GOTPAGEOFF] +_bluegl_glNormalStream3sATI: + adrp x16, ___blue_glCore_glNormalStream3sATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormalStream3sATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetQueryObjecti64v +.private_extern _bluegl_glNormalStream3svATI .align 2 -_bluegl_glGetQueryObjecti64v: - adrp x16, ___blue_glCore_glGetQueryObjecti64v@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetQueryObjecti64v@GOTPAGEOFF] +_bluegl_glNormalStream3svATI: + adrp x16, ___blue_glCore_glNormalStream3svATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormalStream3svATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream1dvATI +.private_extern _bluegl_glNormalStream3iATI .align 2 -_bluegl_glVertexStream1dvATI: - adrp x16, ___blue_glCore_glVertexStream1dvATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream1dvATI@GOTPAGEOFF] +_bluegl_glNormalStream3iATI: + adrp x16, ___blue_glCore_glNormalStream3iATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormalStream3iATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoordPointerListIBM +.private_extern _bluegl_glNormalStream3ivATI .align 2 -_bluegl_glTexCoordPointerListIBM: - adrp x16, ___blue_glCore_glTexCoordPointerListIBM@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoordPointerListIBM@GOTPAGEOFF] +_bluegl_glNormalStream3ivATI: + adrp x16, ___blue_glCore_glNormalStream3ivATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormalStream3ivATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexImage1D +.private_extern _bluegl_glNormalStream3fATI .align 2 -_bluegl_glTexImage1D: - adrp x16, ___blue_glCore_glTexImage1D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexImage1D@GOTPAGEOFF] +_bluegl_glNormalStream3fATI: + adrp x16, ___blue_glCore_glNormalStream3fATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormalStream3fATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2fvMESA +.private_extern _bluegl_glNormalStream3fvATI .align 2 -_bluegl_glWindowPos2fvMESA: - adrp x16, ___blue_glCore_glWindowPos2fvMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2fvMESA@GOTPAGEOFF] +_bluegl_glNormalStream3fvATI: + adrp x16, ___blue_glCore_glNormalStream3fvATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormalStream3fvATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsFenceNV +.private_extern _bluegl_glNormalStream3dATI .align 2 -_bluegl_glIsFenceNV: - adrp x16, ___blue_glCore_glIsFenceNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsFenceNV@GOTPAGEOFF] +_bluegl_glNormalStream3dATI: + adrp x16, ___blue_glCore_glNormalStream3dATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormalStream3dATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVariantsvEXT +.private_extern _bluegl_glNormalStream3dvATI .align 2 -_bluegl_glVariantsvEXT: - adrp x16, ___blue_glCore_glVariantsvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVariantsvEXT@GOTPAGEOFF] +_bluegl_glNormalStream3dvATI: + adrp x16, ___blue_glCore_glNormalStream3dvATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormalStream3dvATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3dEXT +.private_extern _bluegl_glClientActiveVertexStreamATI .align 2 -_bluegl_glProgramUniform3dEXT: - adrp x16, ___blue_glCore_glProgramUniform3dEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3dEXT@GOTPAGEOFF] +_bluegl_glClientActiveVertexStreamATI: + adrp x16, ___blue_glCore_glClientActiveVertexStreamATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClientActiveVertexStreamATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2iARB +.private_extern _bluegl_glVertexBlendEnviATI .align 2 -_bluegl_glUniform2iARB: - adrp x16, ___blue_glCore_glUniform2iARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2iARB@GOTPAGEOFF] +_bluegl_glVertexBlendEnviATI: + adrp x16, ___blue_glCore_glVertexBlendEnviATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexBlendEnviATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPointParameteri +.private_extern _bluegl_glVertexBlendEnvfATI .align 2 -_bluegl_glPointParameteri: - adrp x16, ___blue_glCore_glPointParameteri@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPointParameteri@GOTPAGEOFF] +_bluegl_glVertexBlendEnvfATI: + adrp x16, ___blue_glCore_glVertexBlendEnvfATI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexBlendEnvfATI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreateRenderbuffers +.private_extern _bluegl_glUniformBufferEXT .align 2 -_bluegl_glCreateRenderbuffers: - adrp x16, ___blue_glCore_glCreateRenderbuffers@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreateRenderbuffers@GOTPAGEOFF] +_bluegl_glUniformBufferEXT: + adrp x16, ___blue_glCore_glUniformBufferEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformBufferEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4i +.private_extern _bluegl_glGetUniformBufferSizeEXT .align 2 -_bluegl_glUniform4i: - adrp x16, ___blue_glCore_glUniform4i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4i@GOTPAGEOFF] +_bluegl_glGetUniformBufferSizeEXT: + adrp x16, ___blue_glCore_glGetUniformBufferSizeEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetUniformBufferSizeEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteCommandListsNV +.private_extern _bluegl_glGetUniformOffsetEXT .align 2 -_bluegl_glDeleteCommandListsNV: - adrp x16, ___blue_glCore_glDeleteCommandListsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteCommandListsNV@GOTPAGEOFF] +_bluegl_glGetUniformOffsetEXT: + adrp x16, ___blue_glCore_glGetUniformOffsetEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetUniformOffsetEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glRequestResidentProgramsNV +.private_extern _bluegl_glBlendColorEXT .align 2 -_bluegl_glRequestResidentProgramsNV: - adrp x16, ___blue_glCore_glRequestResidentProgramsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glRequestResidentProgramsNV@GOTPAGEOFF] +_bluegl_glBlendColorEXT: + adrp x16, ___blue_glCore_glBlendColorEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendColorEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureSubImage3D +.private_extern _bluegl_glBlendEquationSeparateEXT .align 2 -_bluegl_glTextureSubImage3D: - adrp x16, ___blue_glCore_glTextureSubImage3D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureSubImage3D@GOTPAGEOFF] +_bluegl_glBlendEquationSeparateEXT: + adrp x16, ___blue_glCore_glBlendEquationSeparateEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendEquationSeparateEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPixelStorex +.private_extern _bluegl_glBlendFuncSeparateEXT .align 2 -_bluegl_glPixelStorex: - adrp x16, ___blue_glCore_glPixelStorex@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPixelStorex@GOTPAGEOFF] +_bluegl_glBlendFuncSeparateEXT: + adrp x16, ___blue_glCore_glBlendFuncSeparateEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendFuncSeparateEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4fARB +.private_extern _bluegl_glBlendEquationEXT .align 2 -_bluegl_glVertexAttrib4fARB: - adrp x16, ___blue_glCore_glVertexAttrib4fARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4fARB@GOTPAGEOFF] +_bluegl_glBlendEquationEXT: + adrp x16, ___blue_glCore_glBlendEquationEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendEquationEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribIuiv +.private_extern _bluegl_glColorSubTableEXT .align 2 -_bluegl_glGetVertexAttribIuiv: - adrp x16, ___blue_glCore_glGetVertexAttribIuiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribIuiv@GOTPAGEOFF] +_bluegl_glColorSubTableEXT: + adrp x16, ___blue_glCore_glColorSubTableEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorSubTableEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1s +.private_extern _bluegl_glCopyColorSubTableEXT .align 2 -_bluegl_glVertexAttrib1s: - adrp x16, ___blue_glCore_glVertexAttrib1s@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1s@GOTPAGEOFF] +_bluegl_glCopyColorSubTableEXT: + adrp x16, ___blue_glCore_glCopyColorSubTableEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyColorSubTableEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix4x3dv +.private_extern _bluegl_glLockArraysEXT .align 2 -_bluegl_glProgramUniformMatrix4x3dv: - adrp x16, ___blue_glCore_glProgramUniformMatrix4x3dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4x3dv@GOTPAGEOFF] +_bluegl_glLockArraysEXT: + adrp x16, ___blue_glCore_glLockArraysEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLockArraysEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glActiveVaryingNV +.private_extern _bluegl_glUnlockArraysEXT .align 2 -_bluegl_glActiveVaryingNV: - adrp x16, ___blue_glCore_glActiveVaryingNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glActiveVaryingNV@GOTPAGEOFF] +_bluegl_glUnlockArraysEXT: + adrp x16, ___blue_glCore_glUnlockArraysEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUnlockArraysEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTangent3sEXT +.private_extern _bluegl_glConvolutionFilter1DEXT .align 2 -_bluegl_glTangent3sEXT: - adrp x16, ___blue_glCore_glTangent3sEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTangent3sEXT@GOTPAGEOFF] +_bluegl_glConvolutionFilter1DEXT: + adrp x16, ___blue_glCore_glConvolutionFilter1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glConvolutionFilter1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glConvolutionParameteriv +.private_extern _bluegl_glConvolutionFilter2DEXT .align 2 -_bluegl_glConvolutionParameteriv: - adrp x16, ___blue_glCore_glConvolutionParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glConvolutionParameteriv@GOTPAGEOFF] +_bluegl_glConvolutionFilter2DEXT: + adrp x16, ___blue_glCore_glConvolutionFilter2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glConvolutionFilter2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glQueryCounter +.private_extern _bluegl_glConvolutionParameterfEXT .align 2 -_bluegl_glQueryCounter: - adrp x16, ___blue_glCore_glQueryCounter@GOTPAGE - ldr x16, [x16, ___blue_glCore_glQueryCounter@GOTPAGEOFF] +_bluegl_glConvolutionParameterfEXT: + adrp x16, ___blue_glCore_glConvolutionParameterfEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glConvolutionParameterfEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3d +.private_extern _bluegl_glConvolutionParameterfvEXT .align 2 -_bluegl_glProgramUniform3d: - adrp x16, ___blue_glCore_glProgramUniform3d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3d@GOTPAGEOFF] +_bluegl_glConvolutionParameterfvEXT: + adrp x16, ___blue_glCore_glConvolutionParameterfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glConvolutionParameterfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetUniformi64vARB +.private_extern _bluegl_glConvolutionParameteriEXT .align 2 -_bluegl_glGetUniformi64vARB: - adrp x16, ___blue_glCore_glGetUniformi64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetUniformi64vARB@GOTPAGEOFF] +_bluegl_glConvolutionParameteriEXT: + adrp x16, ___blue_glCore_glConvolutionParameteriEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glConvolutionParameteriEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnUniformui64vARB +.private_extern _bluegl_glConvolutionParameterivEXT .align 2 -_bluegl_glGetnUniformui64vARB: - adrp x16, ___blue_glCore_glGetnUniformui64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnUniformui64vARB@GOTPAGEOFF] +_bluegl_glConvolutionParameterivEXT: + adrp x16, ___blue_glCore_glConvolutionParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glConvolutionParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedProgramLocalParameters4fvEXT +.private_extern _bluegl_glCopyConvolutionFilter1DEXT .align 2 -_bluegl_glNamedProgramLocalParameters4fvEXT: - adrp x16, ___blue_glCore_glNamedProgramLocalParameters4fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParameters4fvEXT@GOTPAGEOFF] +_bluegl_glCopyConvolutionFilter1DEXT: + adrp x16, ___blue_glCore_glCopyConvolutionFilter1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyConvolutionFilter1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetShaderSource +.private_extern _bluegl_glCopyConvolutionFilter2DEXT .align 2 -_bluegl_glGetShaderSource: - adrp x16, ___blue_glCore_glGetShaderSource@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetShaderSource@GOTPAGEOFF] +_bluegl_glCopyConvolutionFilter2DEXT: + adrp x16, ___blue_glCore_glCopyConvolutionFilter2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyConvolutionFilter2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearDepthdNV +.private_extern _bluegl_glGetConvolutionFilterEXT .align 2 -_bluegl_glClearDepthdNV: - adrp x16, ___blue_glCore_glClearDepthdNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearDepthdNV@GOTPAGEOFF] +_bluegl_glGetConvolutionFilterEXT: + adrp x16, ___blue_glCore_glGetConvolutionFilterEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetConvolutionFilterEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColorP3ui +.private_extern _bluegl_glGetConvolutionParameterfvEXT .align 2 -_bluegl_glSecondaryColorP3ui: - adrp x16, ___blue_glCore_glSecondaryColorP3ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColorP3ui@GOTPAGEOFF] +_bluegl_glGetConvolutionParameterfvEXT: + adrp x16, ___blue_glCore_glGetConvolutionParameterfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetConvolutionParameterfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMinmax +.private_extern _bluegl_glGetConvolutionParameterivEXT .align 2 -_bluegl_glMinmax: - adrp x16, ___blue_glCore_glMinmax@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMinmax@GOTPAGEOFF] +_bluegl_glGetConvolutionParameterivEXT: + adrp x16, ___blue_glCore_glGetConvolutionParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetConvolutionParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVariantubvEXT +.private_extern _bluegl_glGetSeparableFilterEXT .align 2 -_bluegl_glVariantubvEXT: - adrp x16, ___blue_glCore_glVariantubvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVariantubvEXT@GOTPAGEOFF] +_bluegl_glGetSeparableFilterEXT: + adrp x16, ___blue_glCore_glGetSeparableFilterEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetSeparableFilterEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBinormal3sEXT +.private_extern _bluegl_glSeparableFilter2DEXT .align 2 -_bluegl_glBinormal3sEXT: - adrp x16, ___blue_glCore_glBinormal3sEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBinormal3sEXT@GOTPAGEOFF] +_bluegl_glSeparableFilter2DEXT: + adrp x16, ___blue_glCore_glSeparableFilter2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSeparableFilter2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4d +.private_extern _bluegl_glTangent3bEXT .align 2 -_bluegl_glVertexAttrib4d: - adrp x16, ___blue_glCore_glVertexAttrib4d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4d@GOTPAGEOFF] +_bluegl_glTangent3bEXT: + adrp x16, ___blue_glCore_glTangent3bEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTangent3bEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEndTransformFeedbackEXT +.private_extern _bluegl_glTangent3bvEXT .align 2 -_bluegl_glEndTransformFeedbackEXT: - adrp x16, ___blue_glCore_glEndTransformFeedbackEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEndTransformFeedbackEXT@GOTPAGEOFF] +_bluegl_glTangent3bvEXT: + adrp x16, ___blue_glCore_glTangent3bvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTangent3bvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexImage2DMultisample +.private_extern _bluegl_glTangent3dEXT .align 2 -_bluegl_glTexImage2DMultisample: - adrp x16, ___blue_glCore_glTexImage2DMultisample@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexImage2DMultisample@GOTPAGEOFF] +_bluegl_glTangent3dEXT: + adrp x16, ___blue_glCore_glTangent3dEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTangent3dEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLoadMatrixxOES +.private_extern _bluegl_glTangent3dvEXT .align 2 -_bluegl_glLoadMatrixxOES: - adrp x16, ___blue_glCore_glLoadMatrixxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLoadMatrixxOES@GOTPAGEOFF] +_bluegl_glTangent3dvEXT: + adrp x16, ___blue_glCore_glTangent3dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTangent3dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetUniformfv +.private_extern _bluegl_glTangent3fEXT .align 2 -_bluegl_glGetUniformfv: - adrp x16, ___blue_glCore_glGetUniformfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetUniformfv@GOTPAGEOFF] +_bluegl_glTangent3fEXT: + adrp x16, ___blue_glCore_glTangent3fEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTangent3fEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStartInstrumentsSGIX +.private_extern _bluegl_glTangent3fvEXT .align 2 -_bluegl_glStartInstrumentsSGIX: - adrp x16, ___blue_glCore_glStartInstrumentsSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStartInstrumentsSGIX@GOTPAGEOFF] +_bluegl_glTangent3fvEXT: + adrp x16, ___blue_glCore_glTangent3fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTangent3fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColor4ubVertex3fvSUN +.private_extern _bluegl_glTangent3iEXT .align 2 -_bluegl_glColor4ubVertex3fvSUN: - adrp x16, ___blue_glCore_glColor4ubVertex3fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColor4ubVertex3fvSUN@GOTPAGEOFF] +_bluegl_glTangent3iEXT: + adrp x16, ___blue_glCore_glTangent3iEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTangent3iEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixLoadTransposefEXT +.private_extern _bluegl_glTangent3ivEXT .align 2 -_bluegl_glMatrixLoadTransposefEXT: - adrp x16, ___blue_glCore_glMatrixLoadTransposefEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixLoadTransposefEXT@GOTPAGEOFF] +_bluegl_glTangent3ivEXT: + adrp x16, ___blue_glCore_glTangent3ivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTangent3ivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetCompressedTexImage +.private_extern _bluegl_glTangent3sEXT .align 2 -_bluegl_glGetCompressedTexImage: - adrp x16, ___blue_glCore_glGetCompressedTexImage@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetCompressedTexImage@GOTPAGEOFF] +_bluegl_glTangent3sEXT: + adrp x16, ___blue_glCore_glTangent3sEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTangent3sEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedProgramLocalParameterdvEXT +.private_extern _bluegl_glTangent3svEXT .align 2 -_bluegl_glGetNamedProgramLocalParameterdvEXT: - adrp x16, ___blue_glCore_glGetNamedProgramLocalParameterdvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedProgramLocalParameterdvEXT@GOTPAGEOFF] +_bluegl_glTangent3svEXT: + adrp x16, ___blue_glCore_glTangent3svEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTangent3svEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorPointerEXT +.private_extern _bluegl_glBinormal3bEXT .align 2 -_bluegl_glColorPointerEXT: - adrp x16, ___blue_glCore_glColorPointerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorPointerEXT@GOTPAGEOFF] +_bluegl_glBinormal3bEXT: + adrp x16, ___blue_glCore_glBinormal3bEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBinormal3bEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTangent3fEXT +.private_extern _bluegl_glBinormal3bvEXT .align 2 -_bluegl_glTangent3fEXT: - adrp x16, ___blue_glCore_glTangent3fEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTangent3fEXT@GOTPAGEOFF] +_bluegl_glBinormal3bvEXT: + adrp x16, ___blue_glCore_glBinormal3bvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBinormal3bvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2dvARB +.private_extern _bluegl_glBinormal3dEXT .align 2 -_bluegl_glWindowPos2dvARB: - adrp x16, ___blue_glCore_glWindowPos2dvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2dvARB@GOTPAGEOFF] +_bluegl_glBinormal3dEXT: + adrp x16, ___blue_glCore_glBinormal3dEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBinormal3dEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetInvariantIntegervEXT +.private_extern _bluegl_glBinormal3dvEXT .align 2 -_bluegl_glGetInvariantIntegervEXT: - adrp x16, ___blue_glCore_glGetInvariantIntegervEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetInvariantIntegervEXT@GOTPAGEOFF] +_bluegl_glBinormal3dvEXT: + adrp x16, ___blue_glCore_glBinormal3dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBinormal3dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3fEXT +.private_extern _bluegl_glBinormal3fEXT .align 2 -_bluegl_glProgramUniform3fEXT: - adrp x16, ___blue_glCore_glProgramUniform3fEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3fEXT@GOTPAGEOFF] +_bluegl_glBinormal3fEXT: + adrp x16, ___blue_glCore_glBinormal3fEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBinormal3fEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPixelTexGenSGIX +.private_extern _bluegl_glBinormal3fvEXT .align 2 -_bluegl_glPixelTexGenSGIX: - adrp x16, ___blue_glCore_glPixelTexGenSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPixelTexGenSGIX@GOTPAGEOFF] +_bluegl_glBinormal3fvEXT: + adrp x16, ___blue_glCore_glBinormal3fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBinormal3fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClampColor +.private_extern _bluegl_glBinormal3iEXT .align 2 -_bluegl_glClampColor: - adrp x16, ___blue_glCore_glClampColor@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClampColor@GOTPAGEOFF] +_bluegl_glBinormal3iEXT: + adrp x16, ___blue_glCore_glBinormal3iEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBinormal3iEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribs4hvNV +.private_extern _bluegl_glBinormal3ivEXT .align 2 -_bluegl_glVertexAttribs4hvNV: - adrp x16, ___blue_glCore_glVertexAttribs4hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribs4hvNV@GOTPAGEOFF] +_bluegl_glBinormal3ivEXT: + adrp x16, ___blue_glCore_glBinormal3ivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBinormal3ivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetIntegeri_v +.private_extern _bluegl_glBinormal3sEXT .align 2 -_bluegl_glGetIntegeri_v: - adrp x16, ___blue_glCore_glGetIntegeri_v@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetIntegeri_v@GOTPAGEOFF] +_bluegl_glBinormal3sEXT: + adrp x16, ___blue_glCore_glBinormal3sEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBinormal3sEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteVertexArraysAPPLE +.private_extern _bluegl_glBinormal3svEXT .align 2 -_bluegl_glDeleteVertexArraysAPPLE: - adrp x16, ___blue_glCore_glDeleteVertexArraysAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteVertexArraysAPPLE@GOTPAGEOFF] +_bluegl_glBinormal3svEXT: + adrp x16, ___blue_glCore_glBinormal3svEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBinormal3svEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetAttachedShaders +.private_extern _bluegl_glTangentPointerEXT .align 2 -_bluegl_glGetAttachedShaders: - adrp x16, ___blue_glCore_glGetAttachedShaders@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetAttachedShaders@GOTPAGEOFF] +_bluegl_glTangentPointerEXT: + adrp x16, ___blue_glCore_glTangentPointerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTangentPointerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEndTransformFeedbackNV +.private_extern _bluegl_glBinormalPointerEXT .align 2 -_bluegl_glEndTransformFeedbackNV: - adrp x16, ___blue_glCore_glEndTransformFeedbackNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEndTransformFeedbackNV@GOTPAGEOFF] +_bluegl_glBinormalPointerEXT: + adrp x16, ___blue_glCore_glBinormalPointerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBinormalPointerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetColorTableParameterfvSGI +.private_extern _bluegl_glCopyTexImage1DEXT .align 2 -_bluegl_glGetColorTableParameterfvSGI: - adrp x16, ___blue_glCore_glGetColorTableParameterfvSGI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetColorTableParameterfvSGI@GOTPAGEOFF] +_bluegl_glCopyTexImage1DEXT: + adrp x16, ___blue_glCore_glCopyTexImage1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyTexImage1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindBufferBase +.private_extern _bluegl_glCopyTexImage2DEXT .align 2 -_bluegl_glBindBufferBase: - adrp x16, ___blue_glCore_glBindBufferBase@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindBufferBase@GOTPAGEOFF] +_bluegl_glCopyTexImage2DEXT: + adrp x16, ___blue_glCore_glCopyTexImage2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyTexImage2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteSync +.private_extern _bluegl_glCopyTexSubImage1DEXT .align 2 -_bluegl_glDeleteSync: - adrp x16, ___blue_glCore_glDeleteSync@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteSync@GOTPAGEOFF] +_bluegl_glCopyTexSubImage1DEXT: + adrp x16, ___blue_glCore_glCopyTexSubImage1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyTexSubImage1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTransformFeedbackVarying +.private_extern _bluegl_glCopyTexSubImage2DEXT .align 2 -_bluegl_glGetTransformFeedbackVarying: - adrp x16, ___blue_glCore_glGetTransformFeedbackVarying@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTransformFeedbackVarying@GOTPAGEOFF] +_bluegl_glCopyTexSubImage2DEXT: + adrp x16, ___blue_glCore_glCopyTexSubImage2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyTexSubImage2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1svARB +.private_extern _bluegl_glCopyTexSubImage3DEXT .align 2 -_bluegl_glVertexAttrib1svARB: - adrp x16, ___blue_glCore_glVertexAttrib1svARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1svARB@GOTPAGEOFF] +_bluegl_glCopyTexSubImage3DEXT: + adrp x16, ___blue_glCore_glCopyTexSubImage3DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyTexSubImage3DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyPathNV +.private_extern _bluegl_glCullParameterdvEXT .align 2 -_bluegl_glCopyPathNV: - adrp x16, ___blue_glCore_glCopyPathNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyPathNV@GOTPAGEOFF] +_bluegl_glCullParameterdvEXT: + adrp x16, ___blue_glCore_glCullParameterdvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCullParameterdvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindTransformFeedback +.private_extern _bluegl_glCullParameterfvEXT .align 2 -_bluegl_glBindTransformFeedback: - adrp x16, ___blue_glCore_glBindTransformFeedback@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindTransformFeedback@GOTPAGEOFF] +_bluegl_glCullParameterfvEXT: + adrp x16, ___blue_glCore_glCullParameterfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCullParameterfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4usv +.private_extern _bluegl_glLabelObjectEXT .align 2 -_bluegl_glVertexAttrib4usv: - adrp x16, ___blue_glCore_glVertexAttrib4usv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4usv@GOTPAGEOFF] +_bluegl_glLabelObjectEXT: + adrp x16, ___blue_glCore_glLabelObjectEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLabelObjectEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedMultiTexImage3DEXT +.private_extern _bluegl_glGetObjectLabelEXT .align 2 -_bluegl_glCompressedMultiTexImage3DEXT: - adrp x16, ___blue_glCore_glCompressedMultiTexImage3DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedMultiTexImage3DEXT@GOTPAGEOFF] +_bluegl_glGetObjectLabelEXT: + adrp x16, ___blue_glCore_glGetObjectLabelEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetObjectLabelEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixLoadTranspose3x3fNV +.private_extern _bluegl_glInsertEventMarkerEXT .align 2 -_bluegl_glMatrixLoadTranspose3x3fNV: - adrp x16, ___blue_glCore_glMatrixLoadTranspose3x3fNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixLoadTranspose3x3fNV@GOTPAGEOFF] +_bluegl_glInsertEventMarkerEXT: + adrp x16, ___blue_glCore_glInsertEventMarkerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glInsertEventMarkerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream1sATI +.private_extern _bluegl_glPushGroupMarkerEXT .align 2 -_bluegl_glVertexStream1sATI: - adrp x16, ___blue_glCore_glVertexStream1sATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream1sATI@GOTPAGEOFF] +_bluegl_glPushGroupMarkerEXT: + adrp x16, ___blue_glCore_glPushGroupMarkerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPushGroupMarkerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiDrawArraysIndirectBindlessNV +.private_extern _bluegl_glPopGroupMarkerEXT .align 2 -_bluegl_glMultiDrawArraysIndirectBindlessNV: - adrp x16, ___blue_glCore_glMultiDrawArraysIndirectBindlessNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiDrawArraysIndirectBindlessNV@GOTPAGEOFF] +_bluegl_glPopGroupMarkerEXT: + adrp x16, ___blue_glCore_glPopGroupMarkerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPopGroupMarkerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexParameterIuiv +.private_extern _bluegl_glDepthBoundsEXT .align 2 -_bluegl_glTexParameterIuiv: - adrp x16, ___blue_glCore_glTexParameterIuiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexParameterIuiv@GOTPAGEOFF] +_bluegl_glDepthBoundsEXT: + adrp x16, ___blue_glCore_glDepthBoundsEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDepthBoundsEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVDPAUFiniNV +.private_extern _bluegl_glMatrixLoadfEXT .align 2 -_bluegl_glVDPAUFiniNV: - adrp x16, ___blue_glCore_glVDPAUFiniNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVDPAUFiniNV@GOTPAGEOFF] +_bluegl_glMatrixLoadfEXT: + adrp x16, ___blue_glCore_glMatrixLoadfEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixLoadfEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1iv +.private_extern _bluegl_glMatrixLoaddEXT .align 2 -_bluegl_glUniform1iv: - adrp x16, ___blue_glCore_glUniform1iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1iv@GOTPAGEOFF] +_bluegl_glMatrixLoaddEXT: + adrp x16, ___blue_glCore_glMatrixLoaddEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixLoaddEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStencilThenCoverStrokePathNV +.private_extern _bluegl_glMatrixMultfEXT .align 2 -_bluegl_glStencilThenCoverStrokePathNV: - adrp x16, ___blue_glCore_glStencilThenCoverStrokePathNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStencilThenCoverStrokePathNV@GOTPAGEOFF] +_bluegl_glMatrixMultfEXT: + adrp x16, ___blue_glCore_glMatrixMultfEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixMultfEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3i64vNV +.private_extern _bluegl_glMatrixMultdEXT .align 2 -_bluegl_glUniform3i64vNV: - adrp x16, ___blue_glCore_glUniform3i64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3i64vNV@GOTPAGEOFF] +_bluegl_glMatrixMultdEXT: + adrp x16, ___blue_glCore_glMatrixMultdEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixMultdEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFragDataLocationEXT +.private_extern _bluegl_glMatrixLoadIdentityEXT .align 2 -_bluegl_glGetFragDataLocationEXT: - adrp x16, ___blue_glCore_glGetFragDataLocationEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFragDataLocationEXT@GOTPAGEOFF] +_bluegl_glMatrixLoadIdentityEXT: + adrp x16, ___blue_glCore_glMatrixLoadIdentityEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixLoadIdentityEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix4dv +.private_extern _bluegl_glMatrixRotatefEXT .align 2 -_bluegl_glProgramUniformMatrix4dv: - adrp x16, ___blue_glCore_glProgramUniformMatrix4dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4dv@GOTPAGEOFF] +_bluegl_glMatrixRotatefEXT: + adrp x16, ___blue_glCore_glMatrixRotatefEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixRotatefEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnUniformiv +.private_extern _bluegl_glMatrixRotatedEXT .align 2 -_bluegl_glGetnUniformiv: - adrp x16, ___blue_glCore_glGetnUniformiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnUniformiv@GOTPAGEOFF] +_bluegl_glMatrixRotatedEXT: + adrp x16, ___blue_glCore_glMatrixRotatedEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixRotatedEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMapBuffer +.private_extern _bluegl_glMatrixScalefEXT .align 2 -_bluegl_glMapBuffer: - adrp x16, ___blue_glCore_glMapBuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMapBuffer@GOTPAGEOFF] +_bluegl_glMatrixScalefEXT: + adrp x16, ___blue_glCore_glMatrixScalefEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixScalefEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glScissorIndexed +.private_extern _bluegl_glMatrixScaledEXT .align 2 -_bluegl_glScissorIndexed: - adrp x16, ___blue_glCore_glScissorIndexed@GOTPAGE - ldr x16, [x16, ___blue_glCore_glScissorIndexed@GOTPAGEOFF] +_bluegl_glMatrixScaledEXT: + adrp x16, ___blue_glCore_glMatrixScaledEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixScaledEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3fARB +.private_extern _bluegl_glMatrixTranslatefEXT .align 2 -_bluegl_glUniform3fARB: - adrp x16, ___blue_glCore_glUniform3fARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3fARB@GOTPAGEOFF] +_bluegl_glMatrixTranslatefEXT: + adrp x16, ___blue_glCore_glMatrixTranslatefEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixTranslatefEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetColorTable +.private_extern _bluegl_glMatrixTranslatedEXT .align 2 -_bluegl_glGetColorTable: - adrp x16, ___blue_glCore_glGetColorTable@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetColorTable@GOTPAGEOFF] +_bluegl_glMatrixTranslatedEXT: + adrp x16, ___blue_glCore_glMatrixTranslatedEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixTranslatedEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferTextureFaceARB +.private_extern _bluegl_glMatrixFrustumEXT .align 2 -_bluegl_glFramebufferTextureFaceARB: - adrp x16, ___blue_glCore_glFramebufferTextureFaceARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferTextureFaceARB@GOTPAGEOFF] +_bluegl_glMatrixFrustumEXT: + adrp x16, ___blue_glCore_glMatrixFrustumEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixFrustumEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBeginTransformFeedbackEXT +.private_extern _bluegl_glMatrixOrthoEXT .align 2 -_bluegl_glBeginTransformFeedbackEXT: - adrp x16, ___blue_glCore_glBeginTransformFeedbackEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBeginTransformFeedbackEXT@GOTPAGEOFF] +_bluegl_glMatrixOrthoEXT: + adrp x16, ___blue_glCore_glMatrixOrthoEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixOrthoEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenFencesNV +.private_extern _bluegl_glMatrixPopEXT .align 2 -_bluegl_glGenFencesNV: - adrp x16, ___blue_glCore_glGenFencesNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenFencesNV@GOTPAGEOFF] +_bluegl_glMatrixPopEXT: + adrp x16, ___blue_glCore_glMatrixPopEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixPopEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexImage2DEXT +.private_extern _bluegl_glMatrixPushEXT .align 2 -_bluegl_glMultiTexImage2DEXT: - adrp x16, ___blue_glCore_glMultiTexImage2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexImage2DEXT@GOTPAGEOFF] +_bluegl_glMatrixPushEXT: + adrp x16, ___blue_glCore_glMatrixPushEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixPushEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2hNV +.private_extern _bluegl_glClientAttribDefaultEXT .align 2 -_bluegl_glVertexAttrib2hNV: - adrp x16, ___blue_glCore_glVertexAttrib2hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2hNV@GOTPAGEOFF] +_bluegl_glClientAttribDefaultEXT: + adrp x16, ___blue_glCore_glClientAttribDefaultEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClientAttribDefaultEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFragmentLightfvSGIX +.private_extern _bluegl_glPushClientAttribDefaultEXT .align 2 -_bluegl_glFragmentLightfvSGIX: - adrp x16, ___blue_glCore_glFragmentLightfvSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFragmentLightfvSGIX@GOTPAGEOFF] +_bluegl_glPushClientAttribDefaultEXT: + adrp x16, ___blue_glCore_glPushClientAttribDefaultEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPushClientAttribDefaultEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2iv +.private_extern _bluegl_glTextureParameterfEXT .align 2 -_bluegl_glProgramUniform2iv: - adrp x16, ___blue_glCore_glProgramUniform2iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2iv@GOTPAGEOFF] +_bluegl_glTextureParameterfEXT: + adrp x16, ___blue_glCore_glTextureParameterfEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureParameterfEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL4d +.private_extern _bluegl_glTextureParameterfvEXT .align 2 -_bluegl_glVertexAttribL4d: - adrp x16, ___blue_glCore_glVertexAttribL4d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL4d@GOTPAGEOFF] +_bluegl_glTextureParameterfvEXT: + adrp x16, ___blue_glCore_glTextureParameterfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureParameterfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMapBufferARB +.private_extern _bluegl_glTextureParameteriEXT .align 2 -_bluegl_glMapBufferARB: - adrp x16, ___blue_glCore_glMapBufferARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMapBufferARB@GOTPAGEOFF] +_bluegl_glTextureParameteriEXT: + adrp x16, ___blue_glCore_glTextureParameteriEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureParameteriEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindVideoCaptureStreamTextureNV +.private_extern _bluegl_glTextureParameterivEXT .align 2 -_bluegl_glBindVideoCaptureStreamTextureNV: - adrp x16, ___blue_glCore_glBindVideoCaptureStreamTextureNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindVideoCaptureStreamTextureNV@GOTPAGEOFF] +_bluegl_glTextureParameterivEXT: + adrp x16, ___blue_glCore_glTextureParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glConvolutionParameterxvOES +.private_extern _bluegl_glTextureImage1DEXT .align 2 -_bluegl_glConvolutionParameterxvOES: - adrp x16, ___blue_glCore_glConvolutionParameterxvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glConvolutionParameterxvOES@GOTPAGEOFF] +_bluegl_glTextureImage1DEXT: + adrp x16, ___blue_glCore_glTextureImage1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureImage1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexParameterIuivEXT +.private_extern _bluegl_glTextureImage2DEXT .align 2 -_bluegl_glTexParameterIuivEXT: - adrp x16, ___blue_glCore_glTexParameterIuivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexParameterIuivEXT@GOTPAGEOFF] +_bluegl_glTextureImage2DEXT: + adrp x16, ___blue_glCore_glTextureImage2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureImage2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI4ubv +.private_extern _bluegl_glTextureSubImage1DEXT .align 2 -_bluegl_glVertexAttribI4ubv: - adrp x16, ___blue_glCore_glVertexAttribI4ubv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI4ubv@GOTPAGEOFF] +_bluegl_glTextureSubImage1DEXT: + adrp x16, ___blue_glCore_glTextureSubImage1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureSubImage1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexSubImage1DEXT +.private_extern _bluegl_glTextureSubImage2DEXT .align 2 -_bluegl_glTexSubImage1DEXT: - adrp x16, ___blue_glCore_glTexSubImage1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexSubImage1DEXT@GOTPAGEOFF] +_bluegl_glTextureSubImage2DEXT: + adrp x16, ___blue_glCore_glTextureSubImage2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureSubImage2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureStorage2DEXT +.private_extern _bluegl_glCopyTextureImage1DEXT .align 2 -_bluegl_glTextureStorage2DEXT: - adrp x16, ___blue_glCore_glTextureStorage2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureStorage2DEXT@GOTPAGEOFF] +_bluegl_glCopyTextureImage1DEXT: + adrp x16, ___blue_glCore_glCopyTextureImage1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyTextureImage1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexSubImage3DEXT +.private_extern _bluegl_glCopyTextureImage2DEXT .align 2 -_bluegl_glTexSubImage3DEXT: - adrp x16, ___blue_glCore_glTexSubImage3DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexSubImage3DEXT@GOTPAGEOFF] +_bluegl_glCopyTextureImage2DEXT: + adrp x16, ___blue_glCore_glCopyTextureImage2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyTextureImage2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertex2xvOES +.private_extern _bluegl_glCopyTextureSubImage1DEXT .align 2 -_bluegl_glVertex2xvOES: - adrp x16, ___blue_glCore_glVertex2xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertex2xvOES@GOTPAGEOFF] +_bluegl_glCopyTextureSubImage1DEXT: + adrp x16, ___blue_glCore_glCopyTextureSubImage1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyTextureSubImage1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMultiTexImageEXT +.private_extern _bluegl_glCopyTextureSubImage2DEXT .align 2 -_bluegl_glGetMultiTexImageEXT: - adrp x16, ___blue_glCore_glGetMultiTexImageEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMultiTexImageEXT@GOTPAGEOFF] +_bluegl_glCopyTextureSubImage2DEXT: + adrp x16, ___blue_glCore_glCopyTextureSubImage2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyTextureSubImage2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormalStream3ivATI +.private_extern _bluegl_glGetTextureImageEXT .align 2 -_bluegl_glNormalStream3ivATI: - adrp x16, ___blue_glCore_glNormalStream3ivATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormalStream3ivATI@GOTPAGEOFF] +_bluegl_glGetTextureImageEXT: + adrp x16, ___blue_glCore_glGetTextureImageEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureImageEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedBufferPointerv +.private_extern _bluegl_glGetTextureParameterfvEXT .align 2 -_bluegl_glGetNamedBufferPointerv: - adrp x16, ___blue_glCore_glGetNamedBufferPointerv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedBufferPointerv@GOTPAGEOFF] +_bluegl_glGetTextureParameterfvEXT: + adrp x16, ___blue_glCore_glGetTextureParameterfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureParameterfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexBuffer +.private_extern _bluegl_glGetTextureParameterivEXT .align 2 -_bluegl_glTexBuffer: - adrp x16, ___blue_glCore_glTexBuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexBuffer@GOTPAGEOFF] +_bluegl_glGetTextureParameterivEXT: + adrp x16, ___blue_glCore_glGetTextureParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCombinerInputNV +.private_extern _bluegl_glGetTextureLevelParameterfvEXT .align 2 -_bluegl_glCombinerInputNV: - adrp x16, ___blue_glCore_glCombinerInputNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCombinerInputNV@GOTPAGEOFF] +_bluegl_glGetTextureLevelParameterfvEXT: + adrp x16, ___blue_glCore_glGetTextureLevelParameterfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureLevelParameterfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1dARB +.private_extern _bluegl_glGetTextureLevelParameterivEXT .align 2 -_bluegl_glVertexAttrib1dARB: - adrp x16, ___blue_glCore_glVertexAttrib1dARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1dARB@GOTPAGEOFF] +_bluegl_glGetTextureLevelParameterivEXT: + adrp x16, ___blue_glCore_glGetTextureLevelParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureLevelParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexP3ui +.private_extern _bluegl_glTextureImage3DEXT .align 2 -_bluegl_glVertexP3ui: - adrp x16, ___blue_glCore_glVertexP3ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexP3ui@GOTPAGEOFF] +_bluegl_glTextureImage3DEXT: + adrp x16, ___blue_glCore_glTextureImage3DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureImage3DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixMult3x2fNV +.private_extern _bluegl_glTextureSubImage3DEXT .align 2 -_bluegl_glMatrixMult3x2fNV: - adrp x16, ___blue_glCore_glMatrixMult3x2fNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixMult3x2fNV@GOTPAGEOFF] +_bluegl_glTextureSubImage3DEXT: + adrp x16, ___blue_glCore_glTextureSubImage3DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureSubImage3DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedFramebufferTexture2DEXT +.private_extern _bluegl_glCopyTextureSubImage3DEXT .align 2 -_bluegl_glNamedFramebufferTexture2DEXT: - adrp x16, ___blue_glCore_glNamedFramebufferTexture2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedFramebufferTexture2DEXT@GOTPAGEOFF] +_bluegl_glCopyTextureSubImage3DEXT: + adrp x16, ___blue_glCore_glCopyTextureSubImage3DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyTextureSubImage3DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureLevelParameteriv +.private_extern _bluegl_glBindMultiTextureEXT .align 2 -_bluegl_glGetTextureLevelParameteriv: - adrp x16, ___blue_glCore_glGetTextureLevelParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureLevelParameteriv@GOTPAGEOFF] +_bluegl_glBindMultiTextureEXT: + adrp x16, ___blue_glCore_glBindMultiTextureEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindMultiTextureEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPixelMapx +.private_extern _bluegl_glMultiTexCoordPointerEXT .align 2 -_bluegl_glPixelMapx: - adrp x16, ___blue_glCore_glPixelMapx@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPixelMapx@GOTPAGEOFF] +_bluegl_glMultiTexCoordPointerEXT: + adrp x16, ___blue_glCore_glMultiTexCoordPointerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoordPointerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendFuncSeparatei +.private_extern _bluegl_glMultiTexEnvfEXT .align 2 -_bluegl_glBlendFuncSeparatei: - adrp x16, ___blue_glCore_glBlendFuncSeparatei@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendFuncSeparatei@GOTPAGEOFF] +_bluegl_glMultiTexEnvfEXT: + adrp x16, ___blue_glCore_glMultiTexEnvfEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexEnvfEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTessellationModeAMD +.private_extern _bluegl_glMultiTexEnvfvEXT .align 2 -_bluegl_glTessellationModeAMD: - adrp x16, ___blue_glCore_glTessellationModeAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTessellationModeAMD@GOTPAGEOFF] +_bluegl_glMultiTexEnvfvEXT: + adrp x16, ___blue_glCore_glMultiTexEnvfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexEnvfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramEnvParametersI4uivNV +.private_extern _bluegl_glMultiTexEnviEXT .align 2 -_bluegl_glProgramEnvParametersI4uivNV: - adrp x16, ___blue_glCore_glProgramEnvParametersI4uivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramEnvParametersI4uivNV@GOTPAGEOFF] +_bluegl_glMultiTexEnviEXT: + adrp x16, ___blue_glCore_glMultiTexEnviEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexEnviEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetColorTableParameterfvEXT +.private_extern _bluegl_glMultiTexEnvivEXT .align 2 -_bluegl_glGetColorTableParameterfvEXT: - adrp x16, ___blue_glCore_glGetColorTableParameterfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetColorTableParameterfvEXT@GOTPAGEOFF] +_bluegl_glMultiTexEnvivEXT: + adrp x16, ___blue_glCore_glMultiTexEnvivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexEnvivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI1uiEXT +.private_extern _bluegl_glMultiTexGendEXT .align 2 -_bluegl_glVertexAttribI1uiEXT: - adrp x16, ___blue_glCore_glVertexAttribI1uiEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI1uiEXT@GOTPAGEOFF] +_bluegl_glMultiTexGendEXT: + adrp x16, ___blue_glCore_glMultiTexGendEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexGendEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPrioritizeTexturesEXT +.private_extern _bluegl_glMultiTexGendvEXT .align 2 -_bluegl_glPrioritizeTexturesEXT: - adrp x16, ___blue_glCore_glPrioritizeTexturesEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPrioritizeTexturesEXT@GOTPAGEOFF] +_bluegl_glMultiTexGendvEXT: + adrp x16, ___blue_glCore_glMultiTexGendvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexGendvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1i64vNV +.private_extern _bluegl_glMultiTexGenfEXT .align 2 -_bluegl_glProgramUniform1i64vNV: - adrp x16, ___blue_glCore_glProgramUniform1i64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1i64vNV@GOTPAGEOFF] +_bluegl_glMultiTexGenfEXT: + adrp x16, ___blue_glCore_glMultiTexGenfEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexGenfEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureParameteriv +.private_extern _bluegl_glMultiTexGenfvEXT .align 2 -_bluegl_glGetTextureParameteriv: - adrp x16, ___blue_glCore_glGetTextureParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureParameteriv@GOTPAGEOFF] +_bluegl_glMultiTexGenfvEXT: + adrp x16, ___blue_glCore_glMultiTexGenfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexGenfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTransformFeedbackiv +.private_extern _bluegl_glMultiTexGeniEXT .align 2 -_bluegl_glGetTransformFeedbackiv: - adrp x16, ___blue_glCore_glGetTransformFeedbackiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTransformFeedbackiv@GOTPAGEOFF] +_bluegl_glMultiTexGeniEXT: + adrp x16, ___blue_glCore_glMultiTexGeniEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexGeniEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiDrawArraysIndirectBindlessCountNV +.private_extern _bluegl_glMultiTexGenivEXT .align 2 -_bluegl_glMultiDrawArraysIndirectBindlessCountNV: - adrp x16, ___blue_glCore_glMultiDrawArraysIndirectBindlessCountNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiDrawArraysIndirectBindlessCountNV@GOTPAGEOFF] +_bluegl_glMultiTexGenivEXT: + adrp x16, ___blue_glCore_glMultiTexGenivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexGenivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUseShaderProgramEXT +.private_extern _bluegl_glGetMultiTexEnvfvEXT .align 2 -_bluegl_glUseShaderProgramEXT: - adrp x16, ___blue_glCore_glUseShaderProgramEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUseShaderProgramEXT@GOTPAGEOFF] +_bluegl_glGetMultiTexEnvfvEXT: + adrp x16, ___blue_glCore_glGetMultiTexEnvfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMultiTexEnvfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteTransformFeedbacks +.private_extern _bluegl_glGetMultiTexEnvivEXT .align 2 -_bluegl_glDeleteTransformFeedbacks: - adrp x16, ___blue_glCore_glDeleteTransformFeedbacks@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteTransformFeedbacks@GOTPAGEOFF] +_bluegl_glGetMultiTexEnvivEXT: + adrp x16, ___blue_glCore_glGetMultiTexEnvivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMultiTexEnvivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCoverageModulationTableNV +.private_extern _bluegl_glGetMultiTexGendvEXT .align 2 -_bluegl_glCoverageModulationTableNV: - adrp x16, ___blue_glCore_glCoverageModulationTableNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCoverageModulationTableNV@GOTPAGEOFF] +_bluegl_glGetMultiTexGendvEXT: + adrp x16, ___blue_glCore_glGetMultiTexGendvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMultiTexGendvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1d +.private_extern _bluegl_glGetMultiTexGenfvEXT .align 2 -_bluegl_glMultiTexCoord1d: - adrp x16, ___blue_glCore_glMultiTexCoord1d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1d@GOTPAGEOFF] +_bluegl_glGetMultiTexGenfvEXT: + adrp x16, ___blue_glCore_glGetMultiTexGenfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMultiTexGenfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTexLevelParameteriv +.private_extern _bluegl_glGetMultiTexGenivEXT .align 2 -_bluegl_glGetTexLevelParameteriv: - adrp x16, ___blue_glCore_glGetTexLevelParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTexLevelParameteriv@GOTPAGEOFF] +_bluegl_glGetMultiTexGenivEXT: + adrp x16, ___blue_glCore_glGetMultiTexGenivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMultiTexGenivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4ui +.private_extern _bluegl_glMultiTexParameteriEXT .align 2 -_bluegl_glProgramUniform4ui: - adrp x16, ___blue_glCore_glProgramUniform4ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4ui@GOTPAGEOFF] +_bluegl_glMultiTexParameteriEXT: + adrp x16, ___blue_glCore_glMultiTexParameteriEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexParameteriEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4iv +.private_extern _bluegl_glMultiTexParameterivEXT .align 2 -_bluegl_glProgramUniform4iv: - adrp x16, ___blue_glCore_glProgramUniform4iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4iv@GOTPAGEOFF] +_bluegl_glMultiTexParameterivEXT: + adrp x16, ___blue_glCore_glMultiTexParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTangent3fvEXT +.private_extern _bluegl_glMultiTexParameterfEXT .align 2 -_bluegl_glTangent3fvEXT: - adrp x16, ___blue_glCore_glTangent3fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTangent3fvEXT@GOTPAGEOFF] +_bluegl_glMultiTexParameterfEXT: + adrp x16, ___blue_glCore_glMultiTexParameterfEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexParameterfEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glViewportIndexedfv +.private_extern _bluegl_glMultiTexParameterfvEXT .align 2 -_bluegl_glViewportIndexedfv: - adrp x16, ___blue_glCore_glViewportIndexedfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glViewportIndexedfv@GOTPAGEOFF] +_bluegl_glMultiTexParameterfvEXT: + adrp x16, ___blue_glCore_glMultiTexParameterfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexParameterfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSampleMaski +.private_extern _bluegl_glMultiTexImage1DEXT .align 2 -_bluegl_glSampleMaski: - adrp x16, ___blue_glCore_glSampleMaski@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSampleMaski@GOTPAGEOFF] +_bluegl_glMultiTexImage1DEXT: + adrp x16, ___blue_glCore_glMultiTexImage1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexImage1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix4x3dvEXT +.private_extern _bluegl_glMultiTexImage2DEXT .align 2 -_bluegl_glProgramUniformMatrix4x3dvEXT: - adrp x16, ___blue_glCore_glProgramUniformMatrix4x3dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4x3dvEXT@GOTPAGEOFF] +_bluegl_glMultiTexImage2DEXT: + adrp x16, ___blue_glCore_glMultiTexImage2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexImage2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompileShaderARB +.private_extern _bluegl_glMultiTexSubImage1DEXT .align 2 -_bluegl_glCompileShaderARB: - adrp x16, ___blue_glCore_glCompileShaderARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompileShaderARB@GOTPAGEOFF] +_bluegl_glMultiTexSubImage1DEXT: + adrp x16, ___blue_glCore_glMultiTexSubImage1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexSubImage1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4ui64ARB +.private_extern _bluegl_glMultiTexSubImage2DEXT .align 2 -_bluegl_glUniform4ui64ARB: - adrp x16, ___blue_glCore_glUniform4ui64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4ui64ARB@GOTPAGEOFF] +_bluegl_glMultiTexSubImage2DEXT: + adrp x16, ___blue_glCore_glMultiTexSubImage2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexSubImage2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord3xOES +.private_extern _bluegl_glCopyMultiTexImage1DEXT .align 2 -_bluegl_glTexCoord3xOES: - adrp x16, ___blue_glCore_glTexCoord3xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord3xOES@GOTPAGEOFF] +_bluegl_glCopyMultiTexImage1DEXT: + adrp x16, ___blue_glCore_glCopyMultiTexImage1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyMultiTexImage1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetInternalformativ +.private_extern _bluegl_glCopyMultiTexImage2DEXT .align 2 -_bluegl_glGetInternalformativ: - adrp x16, ___blue_glCore_glGetInternalformativ@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetInternalformativ@GOTPAGEOFF] +_bluegl_glCopyMultiTexImage2DEXT: + adrp x16, ___blue_glCore_glCopyMultiTexImage2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyMultiTexImage2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glObjectPtrLabel +.private_extern _bluegl_glCopyMultiTexSubImage1DEXT .align 2 -_bluegl_glObjectPtrLabel: - adrp x16, ___blue_glCore_glObjectPtrLabel@GOTPAGE - ldr x16, [x16, ___blue_glCore_glObjectPtrLabel@GOTPAGEOFF] +_bluegl_glCopyMultiTexSubImage1DEXT: + adrp x16, ___blue_glCore_glCopyMultiTexSubImage1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyMultiTexSubImage1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormal3hvNV +.private_extern _bluegl_glCopyMultiTexSubImage2DEXT .align 2 -_bluegl_glNormal3hvNV: - adrp x16, ___blue_glCore_glNormal3hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormal3hvNV@GOTPAGEOFF] +_bluegl_glCopyMultiTexSubImage2DEXT: + adrp x16, ___blue_glCore_glCopyMultiTexSubImage2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyMultiTexSubImage2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1uiv +.private_extern _bluegl_glGetMultiTexImageEXT .align 2 -_bluegl_glProgramUniform1uiv: - adrp x16, ___blue_glCore_glProgramUniform1uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1uiv@GOTPAGEOFF] +_bluegl_glGetMultiTexImageEXT: + adrp x16, ___blue_glCore_glGetMultiTexImageEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMultiTexImageEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenFragmentShadersATI +.private_extern _bluegl_glGetMultiTexParameterfvEXT .align 2 -_bluegl_glGenFragmentShadersATI: - adrp x16, ___blue_glCore_glGenFragmentShadersATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenFragmentShadersATI@GOTPAGEOFF] +_bluegl_glGetMultiTexParameterfvEXT: + adrp x16, ___blue_glCore_glGetMultiTexParameterfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMultiTexParameterfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord2hvNV +.private_extern _bluegl_glGetMultiTexParameterivEXT .align 2 -_bluegl_glTexCoord2hvNV: - adrp x16, ___blue_glCore_glTexCoord2hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord2hvNV@GOTPAGEOFF] +_bluegl_glGetMultiTexParameterivEXT: + adrp x16, ___blue_glCore_glGetMultiTexParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMultiTexParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFinishAsyncSGIX +.private_extern _bluegl_glGetMultiTexLevelParameterfvEXT .align 2 -_bluegl_glFinishAsyncSGIX: - adrp x16, ___blue_glCore_glFinishAsyncSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFinishAsyncSGIX@GOTPAGEOFF] +_bluegl_glGetMultiTexLevelParameterfvEXT: + adrp x16, ___blue_glCore_glGetMultiTexLevelParameterfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMultiTexLevelParameterfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEnableVertexAttribArrayARB +.private_extern _bluegl_glGetMultiTexLevelParameterivEXT .align 2 -_bluegl_glEnableVertexAttribArrayARB: - adrp x16, ___blue_glCore_glEnableVertexAttribArrayARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEnableVertexAttribArrayARB@GOTPAGEOFF] +_bluegl_glGetMultiTexLevelParameterivEXT: + adrp x16, ___blue_glCore_glGetMultiTexLevelParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMultiTexLevelParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteSamplers +.private_extern _bluegl_glMultiTexImage3DEXT .align 2 -_bluegl_glDeleteSamplers: - adrp x16, ___blue_glCore_glDeleteSamplers@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteSamplers@GOTPAGEOFF] +_bluegl_glMultiTexImage3DEXT: + adrp x16, ___blue_glCore_glMultiTexImage3DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexImage3DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1fvARB +.private_extern _bluegl_glMultiTexSubImage3DEXT .align 2 -_bluegl_glVertexAttrib1fvARB: - adrp x16, ___blue_glCore_glVertexAttrib1fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1fvARB@GOTPAGEOFF] +_bluegl_glMultiTexSubImage3DEXT: + adrp x16, ___blue_glCore_glMultiTexSubImage3DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexSubImage3DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnUniformivARB +.private_extern _bluegl_glCopyMultiTexSubImage3DEXT .align 2 -_bluegl_glGetnUniformivARB: - adrp x16, ___blue_glCore_glGetnUniformivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnUniformivARB@GOTPAGEOFF] +_bluegl_glCopyMultiTexSubImage3DEXT: + adrp x16, ___blue_glCore_glCopyMultiTexSubImage3DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyMultiTexSubImage3DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLoadTransposeMatrixd +.private_extern _bluegl_glEnableClientStateIndexedEXT .align 2 -_bluegl_glLoadTransposeMatrixd: - adrp x16, ___blue_glCore_glLoadTransposeMatrixd@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLoadTransposeMatrixd@GOTPAGEOFF] +_bluegl_glEnableClientStateIndexedEXT: + adrp x16, ___blue_glCore_glEnableClientStateIndexedEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEnableClientStateIndexedEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramParameteri +.private_extern _bluegl_glDisableClientStateIndexedEXT .align 2 -_bluegl_glProgramParameteri: - adrp x16, ___blue_glCore_glProgramParameteri@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramParameteri@GOTPAGEOFF] +_bluegl_glDisableClientStateIndexedEXT: + adrp x16, ___blue_glCore_glDisableClientStateIndexedEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDisableClientStateIndexedEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreateShader +.private_extern _bluegl_glGetFloatIndexedvEXT .align 2 -_bluegl_glCreateShader: - adrp x16, ___blue_glCore_glCreateShader@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreateShader@GOTPAGEOFF] +_bluegl_glGetFloatIndexedvEXT: + adrp x16, ___blue_glCore_glGetFloatIndexedvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFloatIndexedvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFragmentCoverageColorNV +.private_extern _bluegl_glGetDoubleIndexedvEXT .align 2 -_bluegl_glFragmentCoverageColorNV: - adrp x16, ___blue_glCore_glFragmentCoverageColorNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFragmentCoverageColorNV@GOTPAGEOFF] +_bluegl_glGetDoubleIndexedvEXT: + adrp x16, ___blue_glCore_glGetDoubleIndexedvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetDoubleIndexedvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream3dvATI +.private_extern _bluegl_glGetPointerIndexedvEXT .align 2 -_bluegl_glVertexStream3dvATI: - adrp x16, ___blue_glCore_glVertexStream3dvATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream3dvATI@GOTPAGEOFF] +_bluegl_glGetPointerIndexedvEXT: + adrp x16, ___blue_glCore_glGetPointerIndexedvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPointerIndexedvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformHandleui64ARB +.private_extern _bluegl_glEnableIndexedEXT .align 2 -_bluegl_glUniformHandleui64ARB: - adrp x16, ___blue_glCore_glUniformHandleui64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformHandleui64ARB@GOTPAGEOFF] +_bluegl_glEnableIndexedEXT: + adrp x16, ___blue_glCore_glEnableIndexedEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEnableIndexedEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVaryingLocationNV +.private_extern _bluegl_glDisableIndexedEXT .align 2 -_bluegl_glGetVaryingLocationNV: - adrp x16, ___blue_glCore_glGetVaryingLocationNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVaryingLocationNV@GOTPAGEOFF] +_bluegl_glDisableIndexedEXT: + adrp x16, ___blue_glCore_glDisableIndexedEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDisableIndexedEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTextureSubImage2DEXT +.private_extern _bluegl_glIsEnabledIndexedEXT .align 2 -_bluegl_glCompressedTextureSubImage2DEXT: - adrp x16, ___blue_glCore_glCompressedTextureSubImage2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTextureSubImage2DEXT@GOTPAGEOFF] +_bluegl_glIsEnabledIndexedEXT: + adrp x16, ___blue_glCore_glIsEnabledIndexedEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsEnabledIndexedEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTangent3dEXT +.private_extern _bluegl_glGetIntegerIndexedvEXT .align 2 -_bluegl_glTangent3dEXT: - adrp x16, ___blue_glCore_glTangent3dEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTangent3dEXT@GOTPAGEOFF] +_bluegl_glGetIntegerIndexedvEXT: + adrp x16, ___blue_glCore_glGetIntegerIndexedvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetIntegerIndexedvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedBufferPointervEXT +.private_extern _bluegl_glGetBooleanIndexedvEXT .align 2 -_bluegl_glGetNamedBufferPointervEXT: - adrp x16, ___blue_glCore_glGetNamedBufferPointervEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedBufferPointervEXT@GOTPAGEOFF] +_bluegl_glGetBooleanIndexedvEXT: + adrp x16, ___blue_glCore_glGetBooleanIndexedvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetBooleanIndexedvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertex2bvOES +.private_extern _bluegl_glCompressedTextureImage3DEXT .align 2 -_bluegl_glVertex2bvOES: - adrp x16, ___blue_glCore_glVertex2bvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertex2bvOES@GOTPAGEOFF] +_bluegl_glCompressedTextureImage3DEXT: + adrp x16, ___blue_glCore_glCompressedTextureImage3DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTextureImage3DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramBufferParametersIuivNV +.private_extern _bluegl_glCompressedTextureImage2DEXT .align 2 -_bluegl_glProgramBufferParametersIuivNV: - adrp x16, ___blue_glCore_glProgramBufferParametersIuivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramBufferParametersIuivNV@GOTPAGEOFF] +_bluegl_glCompressedTextureImage2DEXT: + adrp x16, ___blue_glCore_glCompressedTextureImage2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTextureImage2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnTexImageARB +.private_extern _bluegl_glCompressedTextureImage1DEXT .align 2 -_bluegl_glGetnTexImageARB: - adrp x16, ___blue_glCore_glGetnTexImageARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnTexImageARB@GOTPAGEOFF] +_bluegl_glCompressedTextureImage1DEXT: + adrp x16, ___blue_glCore_glCompressedTextureImage1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTextureImage1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSetFenceNV +.private_extern _bluegl_glCompressedTextureSubImage3DEXT .align 2 -_bluegl_glSetFenceNV: - adrp x16, ___blue_glCore_glSetFenceNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSetFenceNV@GOTPAGEOFF] +_bluegl_glCompressedTextureSubImage3DEXT: + adrp x16, ___blue_glCore_glCompressedTextureSubImage3DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTextureSubImage3DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathParameterfvNV +.private_extern _bluegl_glCompressedTextureSubImage2DEXT .align 2 -_bluegl_glPathParameterfvNV: - adrp x16, ___blue_glCore_glPathParameterfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathParameterfvNV@GOTPAGEOFF] +_bluegl_glCompressedTextureSubImage2DEXT: + adrp x16, ___blue_glCore_glCompressedTextureSubImage2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTextureSubImage2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribFormat +.private_extern _bluegl_glCompressedTextureSubImage1DEXT .align 2 -_bluegl_glVertexAttribFormat: - adrp x16, ___blue_glCore_glVertexAttribFormat@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribFormat@GOTPAGEOFF] +_bluegl_glCompressedTextureSubImage1DEXT: + adrp x16, ___blue_glCore_glCompressedTextureSubImage1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedTextureSubImage1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glConservativeRasterParameterfNV +.private_extern _bluegl_glGetCompressedTextureImageEXT .align 2 -_bluegl_glConservativeRasterParameterfNV: - adrp x16, ___blue_glCore_glConservativeRasterParameterfNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glConservativeRasterParameterfNV@GOTPAGEOFF] +_bluegl_glGetCompressedTextureImageEXT: + adrp x16, ___blue_glCore_glGetCompressedTextureImageEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetCompressedTextureImageEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribIuivEXT +.private_extern _bluegl_glCompressedMultiTexImage3DEXT .align 2 -_bluegl_glGetVertexAttribIuivEXT: - adrp x16, ___blue_glCore_glGetVertexAttribIuivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribIuivEXT@GOTPAGEOFF] +_bluegl_glCompressedMultiTexImage3DEXT: + adrp x16, ___blue_glCore_glCompressedMultiTexImage3DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedMultiTexImage3DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindMultiTextureEXT +.private_extern _bluegl_glCompressedMultiTexImage2DEXT .align 2 -_bluegl_glBindMultiTextureEXT: - adrp x16, ___blue_glCore_glBindMultiTextureEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindMultiTextureEXT@GOTPAGEOFF] +_bluegl_glCompressedMultiTexImage2DEXT: + adrp x16, ___blue_glCore_glCompressedMultiTexImage2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedMultiTexImage2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMapControlPointsNV +.private_extern _bluegl_glCompressedMultiTexImage1DEXT .align 2 -_bluegl_glMapControlPointsNV: - adrp x16, ___blue_glCore_glMapControlPointsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMapControlPointsNV@GOTPAGEOFF] +_bluegl_glCompressedMultiTexImage1DEXT: + adrp x16, ___blue_glCore_glCompressedMultiTexImage1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedMultiTexImage1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4Nsv +.private_extern _bluegl_glCompressedMultiTexSubImage3DEXT .align 2 -_bluegl_glVertexAttrib4Nsv: - adrp x16, ___blue_glCore_glVertexAttrib4Nsv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4Nsv@GOTPAGEOFF] +_bluegl_glCompressedMultiTexSubImage3DEXT: + adrp x16, ___blue_glCore_glCompressedMultiTexSubImage3DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedMultiTexSubImage3DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedMultiTexImage2DEXT +.private_extern _bluegl_glCompressedMultiTexSubImage2DEXT .align 2 -_bluegl_glCompressedMultiTexImage2DEXT: - adrp x16, ___blue_glCore_glCompressedMultiTexImage2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedMultiTexImage2DEXT@GOTPAGEOFF] +_bluegl_glCompressedMultiTexSubImage2DEXT: + adrp x16, ___blue_glCore_glCompressedMultiTexSubImage2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedMultiTexSubImage2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsNamedBufferResidentNV +.private_extern _bluegl_glCompressedMultiTexSubImage1DEXT .align 2 -_bluegl_glIsNamedBufferResidentNV: - adrp x16, ___blue_glCore_glIsNamedBufferResidentNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsNamedBufferResidentNV@GOTPAGEOFF] +_bluegl_glCompressedMultiTexSubImage1DEXT: + adrp x16, ___blue_glCore_glCompressedMultiTexSubImage1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompressedMultiTexSubImage1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLoadProgramNV +.private_extern _bluegl_glGetCompressedMultiTexImageEXT .align 2 -_bluegl_glLoadProgramNV: - adrp x16, ___blue_glCore_glLoadProgramNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLoadProgramNV@GOTPAGEOFF] +_bluegl_glGetCompressedMultiTexImageEXT: + adrp x16, ___blue_glCore_glGetCompressedMultiTexImageEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetCompressedMultiTexImageEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearColor +.private_extern _bluegl_glMatrixLoadTransposefEXT .align 2 -_bluegl_glClearColor: - adrp x16, ___blue_glCore_glClearColor@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearColor@GOTPAGEOFF] +_bluegl_glMatrixLoadTransposefEXT: + adrp x16, ___blue_glCore_glMatrixLoadTransposefEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixLoadTransposefEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2uivEXT +.private_extern _bluegl_glMatrixLoadTransposedEXT .align 2 -_bluegl_glUniform2uivEXT: - adrp x16, ___blue_glCore_glUniform2uivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2uivEXT@GOTPAGEOFF] +_bluegl_glMatrixLoadTransposedEXT: + adrp x16, ___blue_glCore_glMatrixLoadTransposedEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixLoadTransposedEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexGenfEXT +.private_extern _bluegl_glMatrixMultTransposefEXT .align 2 -_bluegl_glMultiTexGenfEXT: - adrp x16, ___blue_glCore_glMultiTexGenfEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexGenfEXT@GOTPAGEOFF] +_bluegl_glMatrixMultTransposefEXT: + adrp x16, ___blue_glCore_glMatrixMultTransposefEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixMultTransposefEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetUniformdv +.private_extern _bluegl_glMatrixMultTransposedEXT .align 2 -_bluegl_glGetUniformdv: - adrp x16, ___blue_glCore_glGetUniformdv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetUniformdv@GOTPAGEOFF] +_bluegl_glMatrixMultTransposedEXT: + adrp x16, ___blue_glCore_glMatrixMultTransposedEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixMultTransposedEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenRenderbuffersEXT +.private_extern _bluegl_glNamedBufferDataEXT .align 2 -_bluegl_glGenRenderbuffersEXT: - adrp x16, ___blue_glCore_glGenRenderbuffersEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenRenderbuffersEXT@GOTPAGEOFF] +_bluegl_glNamedBufferDataEXT: + adrp x16, ___blue_glCore_glNamedBufferDataEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedBufferDataEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMultisamplefv +.private_extern _bluegl_glNamedBufferSubDataEXT .align 2 -_bluegl_glGetMultisamplefv: - adrp x16, ___blue_glCore_glGetMultisamplefv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMultisamplefv@GOTPAGEOFF] +_bluegl_glNamedBufferSubDataEXT: + adrp x16, ___blue_glCore_glNamedBufferSubDataEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedBufferSubDataEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMapNamedBuffer +.private_extern _bluegl_glMapNamedBufferEXT .align 2 -_bluegl_glMapNamedBuffer: - adrp x16, ___blue_glCore_glMapNamedBuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMapNamedBuffer@GOTPAGEOFF] +_bluegl_glMapNamedBufferEXT: + adrp x16, ___blue_glCore_glMapNamedBufferEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMapNamedBufferEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteFramebuffersEXT +.private_extern _bluegl_glUnmapNamedBufferEXT .align 2 -_bluegl_glDeleteFramebuffersEXT: - adrp x16, ___blue_glCore_glDeleteFramebuffersEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteFramebuffersEXT@GOTPAGEOFF] +_bluegl_glUnmapNamedBufferEXT: + adrp x16, ___blue_glCore_glUnmapNamedBufferEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUnmapNamedBufferEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI4usvEXT +.private_extern _bluegl_glGetNamedBufferParameterivEXT .align 2 -_bluegl_glVertexAttribI4usvEXT: - adrp x16, ___blue_glCore_glVertexAttribI4usvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI4usvEXT@GOTPAGEOFF] +_bluegl_glGetNamedBufferParameterivEXT: + adrp x16, ___blue_glCore_glGetNamedBufferParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedBufferParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3hNV +.private_extern _bluegl_glGetNamedBufferPointervEXT .align 2 -_bluegl_glSecondaryColor3hNV: - adrp x16, ___blue_glCore_glSecondaryColor3hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3hNV@GOTPAGEOFF] +_bluegl_glGetNamedBufferPointervEXT: + adrp x16, ___blue_glCore_glGetNamedBufferPointervEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedBufferPointervEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenerateMipmap +.private_extern _bluegl_glGetNamedBufferSubDataEXT .align 2 -_bluegl_glGenerateMipmap: - adrp x16, ___blue_glCore_glGenerateMipmap@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenerateMipmap@GOTPAGEOFF] +_bluegl_glGetNamedBufferSubDataEXT: + adrp x16, ___blue_glCore_glGetNamedBufferSubDataEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedBufferSubDataEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramEnvParameterI4uivNV +.private_extern _bluegl_glProgramUniform1fEXT .align 2 -_bluegl_glProgramEnvParameterI4uivNV: - adrp x16, ___blue_glCore_glProgramEnvParameterI4uivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramEnvParameterI4uivNV@GOTPAGEOFF] +_bluegl_glProgramUniform1fEXT: + adrp x16, ___blue_glCore_glProgramUniform1fEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1fEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSeparableFilter2D +.private_extern _bluegl_glProgramUniform2fEXT .align 2 -_bluegl_glSeparableFilter2D: - adrp x16, ___blue_glCore_glSeparableFilter2D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSeparableFilter2D@GOTPAGEOFF] +_bluegl_glProgramUniform2fEXT: + adrp x16, ___blue_glCore_glProgramUniform2fEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2fEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFogCoorddEXT +.private_extern _bluegl_glProgramUniform3fEXT .align 2 -_bluegl_glFogCoorddEXT: - adrp x16, ___blue_glCore_glFogCoorddEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFogCoorddEXT@GOTPAGEOFF] +_bluegl_glProgramUniform3fEXT: + adrp x16, ___blue_glCore_glProgramUniform3fEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3fEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPerfCounterInfoINTEL +.private_extern _bluegl_glProgramUniform4fEXT .align 2 -_bluegl_glGetPerfCounterInfoINTEL: - adrp x16, ___blue_glCore_glGetPerfCounterInfoINTEL@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPerfCounterInfoINTEL@GOTPAGEOFF] +_bluegl_glProgramUniform4fEXT: + adrp x16, ___blue_glCore_glProgramUniform4fEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4fEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4uiv +.private_extern _bluegl_glProgramUniform1iEXT .align 2 -_bluegl_glUniform4uiv: - adrp x16, ___blue_glCore_glUniform4uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4uiv@GOTPAGEOFF] +_bluegl_glProgramUniform1iEXT: + adrp x16, ___blue_glCore_glProgramUniform1iEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1iEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL2dv +.private_extern _bluegl_glProgramUniform2iEXT .align 2 -_bluegl_glVertexAttribL2dv: - adrp x16, ___blue_glCore_glVertexAttribL2dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL2dv@GOTPAGEOFF] +_bluegl_glProgramUniform2iEXT: + adrp x16, ___blue_glCore_glProgramUniform2iEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2iEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1dv +.private_extern _bluegl_glProgramUniform3iEXT .align 2 -_bluegl_glUniform1dv: - adrp x16, ___blue_glCore_glUniform1dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1dv@GOTPAGEOFF] +_bluegl_glProgramUniform3iEXT: + adrp x16, ___blue_glCore_glProgramUniform3iEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3iEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL1ui64ARB +.private_extern _bluegl_glProgramUniform4iEXT .align 2 -_bluegl_glVertexAttribL1ui64ARB: - adrp x16, ___blue_glCore_glVertexAttribL1ui64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL1ui64ARB@GOTPAGEOFF] +_bluegl_glProgramUniform4iEXT: + adrp x16, ___blue_glCore_glProgramUniform4iEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4iEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEndPerfQueryINTEL +.private_extern _bluegl_glProgramUniform1fvEXT .align 2 -_bluegl_glEndPerfQueryINTEL: - adrp x16, ___blue_glCore_glEndPerfQueryINTEL@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEndPerfQueryINTEL@GOTPAGEOFF] +_bluegl_glProgramUniform1fvEXT: + adrp x16, ___blue_glCore_glProgramUniform1fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayEdgeFlagOffsetEXT +.private_extern _bluegl_glProgramUniform2fvEXT .align 2 -_bluegl_glVertexArrayEdgeFlagOffsetEXT: - adrp x16, ___blue_glCore_glVertexArrayEdgeFlagOffsetEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayEdgeFlagOffsetEXT@GOTPAGEOFF] +_bluegl_glProgramUniform2fvEXT: + adrp x16, ___blue_glCore_glProgramUniform2fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1dv +.private_extern _bluegl_glProgramUniform3fvEXT .align 2 -_bluegl_glVertexAttrib1dv: - adrp x16, ___blue_glCore_glVertexAttrib1dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1dv@GOTPAGEOFF] +_bluegl_glProgramUniform3fvEXT: + adrp x16, ___blue_glCore_glProgramUniform3fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix2dvEXT +.private_extern _bluegl_glProgramUniform4fvEXT .align 2 -_bluegl_glProgramUniformMatrix2dvEXT: - adrp x16, ___blue_glCore_glProgramUniformMatrix2dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2dvEXT@GOTPAGEOFF] +_bluegl_glProgramUniform4fvEXT: + adrp x16, ___blue_glCore_glProgramUniform4fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDepthRange +.private_extern _bluegl_glProgramUniform1ivEXT .align 2 -_bluegl_glDepthRange: - adrp x16, ___blue_glCore_glDepthRange@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDepthRange@GOTPAGEOFF] +_bluegl_glProgramUniform1ivEXT: + adrp x16, ___blue_glCore_glProgramUniform1ivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1ivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCombinerParameterfNV +.private_extern _bluegl_glProgramUniform2ivEXT .align 2 -_bluegl_glCombinerParameterfNV: - adrp x16, ___blue_glCore_glCombinerParameterfNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCombinerParameterfNV@GOTPAGEOFF] +_bluegl_glProgramUniform2ivEXT: + adrp x16, ___blue_glCore_glProgramUniform2ivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2ivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVariantArrayObjectATI +.private_extern _bluegl_glProgramUniform3ivEXT .align 2 -_bluegl_glVariantArrayObjectATI: - adrp x16, ___blue_glCore_glVariantArrayObjectATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVariantArrayObjectATI@GOTPAGEOFF] +_bluegl_glProgramUniform3ivEXT: + adrp x16, ___blue_glCore_glProgramUniform3ivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3ivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteBuffersARB +.private_extern _bluegl_glProgramUniform4ivEXT .align 2 -_bluegl_glDeleteBuffersARB: - adrp x16, ___blue_glCore_glDeleteBuffersARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteBuffersARB@GOTPAGEOFF] +_bluegl_glProgramUniform4ivEXT: + adrp x16, ___blue_glCore_glProgramUniform4ivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4ivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFragmentLightiSGIX +.private_extern _bluegl_glProgramUniformMatrix2fvEXT .align 2 -_bluegl_glFragmentLightiSGIX: - adrp x16, ___blue_glCore_glFragmentLightiSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFragmentLightiSGIX@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix2fvEXT: + adrp x16, ___blue_glCore_glProgramUniformMatrix2fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetSamplerParameterIiv +.private_extern _bluegl_glProgramUniformMatrix3fvEXT .align 2 -_bluegl_glGetSamplerParameterIiv: - adrp x16, ___blue_glCore_glGetSamplerParameterIiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetSamplerParameterIiv@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix3fvEXT: + adrp x16, ___blue_glCore_glProgramUniformMatrix3fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glImportSyncEXT +.private_extern _bluegl_glProgramUniformMatrix4fvEXT .align 2 -_bluegl_glImportSyncEXT: - adrp x16, ___blue_glCore_glImportSyncEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glImportSyncEXT@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix4fvEXT: + adrp x16, ___blue_glCore_glProgramUniformMatrix4fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribivARB +.private_extern _bluegl_glProgramUniformMatrix2x3fvEXT .align 2 -_bluegl_glGetVertexAttribivARB: - adrp x16, ___blue_glCore_glGetVertexAttribivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribivARB@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix2x3fvEXT: + adrp x16, ___blue_glCore_glProgramUniformMatrix2x3fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2x3fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI2ui +.private_extern _bluegl_glProgramUniformMatrix3x2fvEXT .align 2 -_bluegl_glVertexAttribI2ui: - adrp x16, ___blue_glCore_glVertexAttribI2ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI2ui@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix3x2fvEXT: + adrp x16, ___blue_glCore_glProgramUniformMatrix3x2fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3x2fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetObjectParameterivARB +.private_extern _bluegl_glProgramUniformMatrix2x4fvEXT .align 2 -_bluegl_glGetObjectParameterivARB: - adrp x16, ___blue_glCore_glGetObjectParameterivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetObjectParameterivARB@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix2x4fvEXT: + adrp x16, ___blue_glCore_glProgramUniformMatrix2x4fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2x4fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEnableClientStateiEXT +.private_extern _bluegl_glProgramUniformMatrix4x2fvEXT .align 2 -_bluegl_glEnableClientStateiEXT: - adrp x16, ___blue_glCore_glEnableClientStateiEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEnableClientStateiEXT@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix4x2fvEXT: + adrp x16, ___blue_glCore_glProgramUniformMatrix4x2fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4x2fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnUniformi64vARB +.private_extern _bluegl_glProgramUniformMatrix3x4fvEXT .align 2 -_bluegl_glGetnUniformi64vARB: - adrp x16, ___blue_glCore_glGetnUniformi64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnUniformi64vARB@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix3x4fvEXT: + adrp x16, ___blue_glCore_glProgramUniformMatrix3x4fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3x4fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteFencesAPPLE +.private_extern _bluegl_glProgramUniformMatrix4x3fvEXT .align 2 -_bluegl_glDeleteFencesAPPLE: - adrp x16, ___blue_glCore_glDeleteFencesAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteFencesAPPLE@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix4x3fvEXT: + adrp x16, ___blue_glCore_glProgramUniformMatrix4x3fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4x3fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTransformFeedbackBufferRange +.private_extern _bluegl_glTextureBufferEXT .align 2 -_bluegl_glTransformFeedbackBufferRange: - adrp x16, ___blue_glCore_glTransformFeedbackBufferRange@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTransformFeedbackBufferRange@GOTPAGEOFF] +_bluegl_glTextureBufferEXT: + adrp x16, ___blue_glCore_glTextureBufferEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureBufferEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2fvEXT +.private_extern _bluegl_glMultiTexBufferEXT .align 2 -_bluegl_glProgramUniform2fvEXT: - adrp x16, ___blue_glCore_glProgramUniform2fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2fvEXT@GOTPAGEOFF] +_bluegl_glMultiTexBufferEXT: + adrp x16, ___blue_glCore_glMultiTexBufferEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexBufferEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferTextureLayerARB +.private_extern _bluegl_glTextureParameterIivEXT .align 2 -_bluegl_glFramebufferTextureLayerARB: - adrp x16, ___blue_glCore_glFramebufferTextureLayerARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferTextureLayerARB@GOTPAGEOFF] +_bluegl_glTextureParameterIivEXT: + adrp x16, ___blue_glCore_glTextureParameterIivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureParameterIivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribLFormatNV +.private_extern _bluegl_glTextureParameterIuivEXT .align 2 -_bluegl_glVertexAttribLFormatNV: - adrp x16, ___blue_glCore_glVertexAttribLFormatNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribLFormatNV@GOTPAGEOFF] +_bluegl_glTextureParameterIuivEXT: + adrp x16, ___blue_glCore_glTextureParameterIuivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureParameterIuivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2fvARB +.private_extern _bluegl_glGetTextureParameterIivEXT .align 2 -_bluegl_glVertexAttrib2fvARB: - adrp x16, ___blue_glCore_glVertexAttrib2fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2fvARB@GOTPAGEOFF] +_bluegl_glGetTextureParameterIivEXT: + adrp x16, ___blue_glCore_glGetTextureParameterIivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureParameterIivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos4fvMESA +.private_extern _bluegl_glGetTextureParameterIuivEXT .align 2 -_bluegl_glWindowPos4fvMESA: - adrp x16, ___blue_glCore_glWindowPos4fvMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos4fvMESA@GOTPAGEOFF] +_bluegl_glGetTextureParameterIuivEXT: + adrp x16, ___blue_glCore_glGetTextureParameterIuivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureParameterIuivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMakeNamedBufferResidentNV +.private_extern _bluegl_glMultiTexParameterIivEXT .align 2 -_bluegl_glMakeNamedBufferResidentNV: - adrp x16, ___blue_glCore_glMakeNamedBufferResidentNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMakeNamedBufferResidentNV@GOTPAGEOFF] +_bluegl_glMultiTexParameterIivEXT: + adrp x16, ___blue_glCore_glMultiTexParameterIivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexParameterIivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix3x4fvEXT +.private_extern _bluegl_glMultiTexParameterIuivEXT .align 2 -_bluegl_glProgramUniformMatrix3x4fvEXT: - adrp x16, ___blue_glCore_glProgramUniformMatrix3x4fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3x4fvEXT@GOTPAGEOFF] +_bluegl_glMultiTexParameterIuivEXT: + adrp x16, ___blue_glCore_glMultiTexParameterIuivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexParameterIuivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSamplePatternSGIS +.private_extern _bluegl_glGetMultiTexParameterIivEXT .align 2 -_bluegl_glSamplePatternSGIS: - adrp x16, ___blue_glCore_glSamplePatternSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSamplePatternSGIS@GOTPAGEOFF] +_bluegl_glGetMultiTexParameterIivEXT: + adrp x16, ___blue_glCore_glGetMultiTexParameterIivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMultiTexParameterIivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVDPAUGetSurfaceivNV +.private_extern _bluegl_glGetMultiTexParameterIuivEXT .align 2 -_bluegl_glVDPAUGetSurfaceivNV: - adrp x16, ___blue_glCore_glVDPAUGetSurfaceivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVDPAUGetSurfaceivNV@GOTPAGEOFF] +_bluegl_glGetMultiTexParameterIuivEXT: + adrp x16, ___blue_glCore_glGetMultiTexParameterIuivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMultiTexParameterIuivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix4x2fvEXT +.private_extern _bluegl_glProgramUniform1uiEXT .align 2 -_bluegl_glProgramUniformMatrix4x2fvEXT: - adrp x16, ___blue_glCore_glProgramUniformMatrix4x2fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4x2fvEXT@GOTPAGEOFF] +_bluegl_glProgramUniform1uiEXT: + adrp x16, ___blue_glCore_glProgramUniform1uiEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1uiEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeuiColor3fVertex3fvSUN +.private_extern _bluegl_glProgramUniform2uiEXT .align 2 -_bluegl_glReplacementCodeuiColor3fVertex3fvSUN: - adrp x16, ___blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN@GOTPAGEOFF] +_bluegl_glProgramUniform2uiEXT: + adrp x16, ___blue_glCore_glProgramUniform2uiEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2uiEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3sMESA +.private_extern _bluegl_glProgramUniform3uiEXT .align 2 -_bluegl_glWindowPos3sMESA: - adrp x16, ___blue_glCore_glWindowPos3sMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3sMESA@GOTPAGEOFF] +_bluegl_glProgramUniform3uiEXT: + adrp x16, ___blue_glCore_glProgramUniform3uiEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3uiEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexGenxOES +.private_extern _bluegl_glProgramUniform4uiEXT .align 2 -_bluegl_glTexGenxOES: - adrp x16, ___blue_glCore_glTexGenxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexGenxOES@GOTPAGEOFF] +_bluegl_glProgramUniform4uiEXT: + adrp x16, ___blue_glCore_glProgramUniform4uiEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4uiEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4dNV +.private_extern _bluegl_glProgramUniform1uivEXT .align 2 -_bluegl_glVertexAttrib4dNV: - adrp x16, ___blue_glCore_glVertexAttrib4dNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4dNV@GOTPAGEOFF] +_bluegl_glProgramUniform1uivEXT: + adrp x16, ___blue_glCore_glProgramUniform1uivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1uivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTangentPointerEXT +.private_extern _bluegl_glProgramUniform2uivEXT .align 2 -_bluegl_glTangentPointerEXT: - adrp x16, ___blue_glCore_glTangentPointerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTangentPointerEXT@GOTPAGEOFF] +_bluegl_glProgramUniform2uivEXT: + adrp x16, ___blue_glCore_glProgramUniform2uivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2uivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPixelTransformParameterfvEXT +.private_extern _bluegl_glProgramUniform3uivEXT .align 2 -_bluegl_glPixelTransformParameterfvEXT: - adrp x16, ___blue_glCore_glPixelTransformParameterfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPixelTransformParameterfvEXT@GOTPAGEOFF] +_bluegl_glProgramUniform3uivEXT: + adrp x16, ___blue_glCore_glProgramUniform3uivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3uivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1i +.private_extern _bluegl_glProgramUniform4uivEXT .align 2 -_bluegl_glProgramUniform1i: - adrp x16, ___blue_glCore_glProgramUniform1i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1i@GOTPAGEOFF] +_bluegl_glProgramUniform4uivEXT: + adrp x16, ___blue_glCore_glProgramUniform4uivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4uivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2bOES +.private_extern _bluegl_glNamedProgramLocalParameters4fvEXT .align 2 -_bluegl_glMultiTexCoord2bOES: - adrp x16, ___blue_glCore_glMultiTexCoord2bOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2bOES@GOTPAGEOFF] +_bluegl_glNamedProgramLocalParameters4fvEXT: + adrp x16, ___blue_glCore_glNamedProgramLocalParameters4fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParameters4fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI2iv +.private_extern _bluegl_glNamedProgramLocalParameterI4iEXT .align 2 -_bluegl_glVertexAttribI2iv: - adrp x16, ___blue_glCore_glVertexAttribI2iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI2iv@GOTPAGEOFF] +_bluegl_glNamedProgramLocalParameterI4iEXT: + adrp x16, ___blue_glCore_glNamedProgramLocalParameterI4iEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParameterI4iEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos4iMESA +.private_extern _bluegl_glNamedProgramLocalParameterI4ivEXT .align 2 -_bluegl_glWindowPos4iMESA: - adrp x16, ___blue_glCore_glWindowPos4iMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos4iMESA@GOTPAGEOFF] +_bluegl_glNamedProgramLocalParameterI4ivEXT: + adrp x16, ___blue_glCore_glNamedProgramLocalParameterI4ivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParameterI4ivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTestFenceNV +.private_extern _bluegl_glNamedProgramLocalParametersI4ivEXT .align 2 -_bluegl_glTestFenceNV: - adrp x16, ___blue_glCore_glTestFenceNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTestFenceNV@GOTPAGEOFF] +_bluegl_glNamedProgramLocalParametersI4ivEXT: + adrp x16, ___blue_glCore_glNamedProgramLocalParametersI4ivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParametersI4ivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDispatchComputeGroupSizeARB +.private_extern _bluegl_glNamedProgramLocalParameterI4uiEXT .align 2 -_bluegl_glDispatchComputeGroupSizeARB: - adrp x16, ___blue_glCore_glDispatchComputeGroupSizeARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDispatchComputeGroupSizeARB@GOTPAGEOFF] +_bluegl_glNamedProgramLocalParameterI4uiEXT: + adrp x16, ___blue_glCore_glNamedProgramLocalParameterI4uiEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParameterI4uiEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glShaderOp3EXT +.private_extern _bluegl_glNamedProgramLocalParameterI4uivEXT .align 2 -_bluegl_glShaderOp3EXT: - adrp x16, ___blue_glCore_glShaderOp3EXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glShaderOp3EXT@GOTPAGEOFF] +_bluegl_glNamedProgramLocalParameterI4uivEXT: + adrp x16, ___blue_glCore_glNamedProgramLocalParameterI4uivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParameterI4uivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSampleMaskSGIS +.private_extern _bluegl_glNamedProgramLocalParametersI4uivEXT .align 2 -_bluegl_glSampleMaskSGIS: - adrp x16, ___blue_glCore_glSampleMaskSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSampleMaskSGIS@GOTPAGEOFF] +_bluegl_glNamedProgramLocalParametersI4uivEXT: + adrp x16, ___blue_glCore_glNamedProgramLocalParametersI4uivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParametersI4uivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexParameterivEXT +.private_extern _bluegl_glGetNamedProgramLocalParameterIivEXT .align 2 -_bluegl_glMultiTexParameterivEXT: - adrp x16, ___blue_glCore_glMultiTexParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexParameterivEXT@GOTPAGEOFF] +_bluegl_glGetNamedProgramLocalParameterIivEXT: + adrp x16, ___blue_glCore_glGetNamedProgramLocalParameterIivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedProgramLocalParameterIivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnMinmax +.private_extern _bluegl_glGetNamedProgramLocalParameterIuivEXT .align 2 -_bluegl_glGetnMinmax: - adrp x16, ___blue_glCore_glGetnMinmax@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnMinmax@GOTPAGEOFF] +_bluegl_glGetNamedProgramLocalParameterIuivEXT: + adrp x16, ___blue_glCore_glGetNamedProgramLocalParameterIuivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedProgramLocalParameterIuivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorP3ui +.private_extern _bluegl_glEnableClientStateiEXT .align 2 -_bluegl_glColorP3ui: - adrp x16, ___blue_glCore_glColorP3ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorP3ui@GOTPAGEOFF] +_bluegl_glEnableClientStateiEXT: + adrp x16, ___blue_glCore_glEnableClientStateiEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEnableClientStateiEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBeginQueryARB +.private_extern _bluegl_glDisableClientStateiEXT .align 2 -_bluegl_glBeginQueryARB: - adrp x16, ___blue_glCore_glBeginQueryARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBeginQueryARB@GOTPAGEOFF] +_bluegl_glDisableClientStateiEXT: + adrp x16, ___blue_glCore_glDisableClientStateiEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDisableClientStateiEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiDrawArraysIndirectAMD +.private_extern _bluegl_glGetFloati_vEXT .align 2 -_bluegl_glMultiDrawArraysIndirectAMD: - adrp x16, ___blue_glCore_glMultiDrawArraysIndirectAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiDrawArraysIndirectAMD@GOTPAGEOFF] +_bluegl_glGetFloati_vEXT: + adrp x16, ___blue_glCore_glGetFloati_vEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFloati_vEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glRasterPos4xOES +.private_extern _bluegl_glGetDoublei_vEXT .align 2 -_bluegl_glRasterPos4xOES: - adrp x16, ___blue_glCore_glRasterPos4xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glRasterPos4xOES@GOTPAGEOFF] +_bluegl_glGetDoublei_vEXT: + adrp x16, ___blue_glCore_glGetDoublei_vEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetDoublei_vEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFogCoordPointer +.private_extern _bluegl_glGetPointeri_vEXT .align 2 -_bluegl_glFogCoordPointer: - adrp x16, ___blue_glCore_glFogCoordPointer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFogCoordPointer@GOTPAGEOFF] +_bluegl_glGetPointeri_vEXT: + adrp x16, ___blue_glCore_glGetPointeri_vEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPointeri_vEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureLightEXT +.private_extern _bluegl_glNamedProgramStringEXT .align 2 -_bluegl_glTextureLightEXT: - adrp x16, ___blue_glCore_glTextureLightEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureLightEXT@GOTPAGEOFF] +_bluegl_glNamedProgramStringEXT: + adrp x16, ___blue_glCore_glNamedProgramStringEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedProgramStringEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetCombinerInputParameterfvNV +.private_extern _bluegl_glNamedProgramLocalParameter4dEXT .align 2 -_bluegl_glGetCombinerInputParameterfvNV: - adrp x16, ___blue_glCore_glGetCombinerInputParameterfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetCombinerInputParameterfvNV@GOTPAGEOFF] +_bluegl_glNamedProgramLocalParameter4dEXT: + adrp x16, ___blue_glCore_glNamedProgramLocalParameter4dEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParameter4dEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteFragmentShaderATI +.private_extern _bluegl_glNamedProgramLocalParameter4dvEXT .align 2 -_bluegl_glDeleteFragmentShaderATI: - adrp x16, ___blue_glCore_glDeleteFragmentShaderATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteFragmentShaderATI@GOTPAGEOFF] +_bluegl_glNamedProgramLocalParameter4dvEXT: + adrp x16, ___blue_glCore_glNamedProgramLocalParameter4dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParameter4dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2sv +.private_extern _bluegl_glNamedProgramLocalParameter4fEXT .align 2 -_bluegl_glMultiTexCoord2sv: - adrp x16, ___blue_glCore_glMultiTexCoord2sv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2sv@GOTPAGEOFF] +_bluegl_glNamedProgramLocalParameter4fEXT: + adrp x16, ___blue_glCore_glNamedProgramLocalParameter4fEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParameter4fEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2s +.private_extern _bluegl_glNamedProgramLocalParameter4fvEXT .align 2 -_bluegl_glMultiTexCoord2s: - adrp x16, ___blue_glCore_glMultiTexCoord2s@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2s@GOTPAGEOFF] +_bluegl_glNamedProgramLocalParameter4fvEXT: + adrp x16, ___blue_glCore_glNamedProgramLocalParameter4fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParameter4fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLightModelxvOES +.private_extern _bluegl_glGetNamedProgramLocalParameterdvEXT .align 2 -_bluegl_glLightModelxvOES: - adrp x16, ___blue_glCore_glLightModelxvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLightModelxvOES@GOTPAGEOFF] +_bluegl_glGetNamedProgramLocalParameterdvEXT: + adrp x16, ___blue_glCore_glGetNamedProgramLocalParameterdvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedProgramLocalParameterdvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTessellationFactorAMD +.private_extern _bluegl_glGetNamedProgramLocalParameterfvEXT .align 2 -_bluegl_glTessellationFactorAMD: - adrp x16, ___blue_glCore_glTessellationFactorAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTessellationFactorAMD@GOTPAGEOFF] +_bluegl_glGetNamedProgramLocalParameterfvEXT: + adrp x16, ___blue_glCore_glGetNamedProgramLocalParameterfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedProgramLocalParameterfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVariantivEXT +.private_extern _bluegl_glGetNamedProgramivEXT .align 2 -_bluegl_glVariantivEXT: - adrp x16, ___blue_glCore_glVariantivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVariantivEXT@GOTPAGEOFF] +_bluegl_glGetNamedProgramivEXT: + adrp x16, ___blue_glCore_glGetNamedProgramivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedProgramivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedFramebufferRenderbuffer +.private_extern _bluegl_glGetNamedProgramStringEXT .align 2 -_bluegl_glNamedFramebufferRenderbuffer: - adrp x16, ___blue_glCore_glNamedFramebufferRenderbuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedFramebufferRenderbuffer@GOTPAGEOFF] +_bluegl_glGetNamedProgramStringEXT: + adrp x16, ___blue_glCore_glGetNamedProgramStringEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedProgramStringEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2ivARB +.private_extern _bluegl_glNamedRenderbufferStorageEXT .align 2 -_bluegl_glWindowPos2ivARB: - adrp x16, ___blue_glCore_glWindowPos2ivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2ivARB@GOTPAGEOFF] +_bluegl_glNamedRenderbufferStorageEXT: + adrp x16, ___blue_glCore_glNamedRenderbufferStorageEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedRenderbufferStorageEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayFogCoordOffsetEXT +.private_extern _bluegl_glGetNamedRenderbufferParameterivEXT .align 2 -_bluegl_glVertexArrayFogCoordOffsetEXT: - adrp x16, ___blue_glCore_glVertexArrayFogCoordOffsetEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayFogCoordOffsetEXT@GOTPAGEOFF] +_bluegl_glGetNamedRenderbufferParameterivEXT: + adrp x16, ___blue_glCore_glGetNamedRenderbufferParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedRenderbufferParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2i +.private_extern _bluegl_glNamedRenderbufferStorageMultisampleEXT .align 2 -_bluegl_glUniform2i: - adrp x16, ___blue_glCore_glUniform2i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2i@GOTPAGEOFF] +_bluegl_glNamedRenderbufferStorageMultisampleEXT: + adrp x16, ___blue_glCore_glNamedRenderbufferStorageMultisampleEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedRenderbufferStorageMultisampleEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTexBumpParameterivATI +.private_extern _bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT .align 2 -_bluegl_glGetTexBumpParameterivATI: - adrp x16, ___blue_glCore_glGetTexBumpParameterivATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTexBumpParameterivATI@GOTPAGEOFF] +_bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT: + adrp x16, ___blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSamplerParameterIuiv +.private_extern _bluegl_glCheckNamedFramebufferStatusEXT .align 2 -_bluegl_glSamplerParameterIuiv: - adrp x16, ___blue_glCore_glSamplerParameterIuiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSamplerParameterIuiv@GOTPAGEOFF] +_bluegl_glCheckNamedFramebufferStatusEXT: + adrp x16, ___blue_glCore_glCheckNamedFramebufferStatusEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCheckNamedFramebufferStatusEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearBufferfv +.private_extern _bluegl_glNamedFramebufferTexture1DEXT .align 2 -_bluegl_glClearBufferfv: - adrp x16, ___blue_glCore_glClearBufferfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearBufferfv@GOTPAGEOFF] +_bluegl_glNamedFramebufferTexture1DEXT: + adrp x16, ___blue_glCore_glNamedFramebufferTexture1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedFramebufferTexture1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindTextureUnitParameterEXT +.private_extern _bluegl_glNamedFramebufferTexture2DEXT .align 2 -_bluegl_glBindTextureUnitParameterEXT: - adrp x16, ___blue_glCore_glBindTextureUnitParameterEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindTextureUnitParameterEXT@GOTPAGEOFF] +_bluegl_glNamedFramebufferTexture2DEXT: + adrp x16, ___blue_glCore_glNamedFramebufferTexture2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedFramebufferTexture2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3hNV +.private_extern _bluegl_glNamedFramebufferTexture3DEXT .align 2 -_bluegl_glMultiTexCoord3hNV: - adrp x16, ___blue_glCore_glMultiTexCoord3hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3hNV@GOTPAGEOFF] +_bluegl_glNamedFramebufferTexture3DEXT: + adrp x16, ___blue_glCore_glNamedFramebufferTexture3DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedFramebufferTexture3DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3us +.private_extern _bluegl_glNamedFramebufferRenderbufferEXT .align 2 -_bluegl_glSecondaryColor3us: - adrp x16, ___blue_glCore_glSecondaryColor3us@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3us@GOTPAGEOFF] +_bluegl_glNamedFramebufferRenderbufferEXT: + adrp x16, ___blue_glCore_glNamedFramebufferRenderbufferEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedFramebufferRenderbufferEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeusvSUN +.private_extern _bluegl_glGetNamedFramebufferAttachmentParameterivEXT .align 2 -_bluegl_glReplacementCodeusvSUN: - adrp x16, ___blue_glCore_glReplacementCodeusvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeusvSUN@GOTPAGEOFF] +_bluegl_glGetNamedFramebufferAttachmentParameterivEXT: + adrp x16, ___blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3bvEXT +.private_extern _bluegl_glGenerateTextureMipmapEXT .align 2 -_bluegl_glSecondaryColor3bvEXT: - adrp x16, ___blue_glCore_glSecondaryColor3bvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3bvEXT@GOTPAGEOFF] +_bluegl_glGenerateTextureMipmapEXT: + adrp x16, ___blue_glCore_glGenerateTextureMipmapEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenerateTextureMipmapEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramPipelineInfoLog +.private_extern _bluegl_glGenerateMultiTexMipmapEXT .align 2 -_bluegl_glGetProgramPipelineInfoLog: - adrp x16, ___blue_glCore_glGetProgramPipelineInfoLog@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramPipelineInfoLog@GOTPAGEOFF] +_bluegl_glGenerateMultiTexMipmapEXT: + adrp x16, ___blue_glCore_glGenerateMultiTexMipmapEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenerateMultiTexMipmapEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVideoi64vNV +.private_extern _bluegl_glFramebufferDrawBufferEXT .align 2 -_bluegl_glGetVideoi64vNV: - adrp x16, ___blue_glCore_glGetVideoi64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVideoi64vNV@GOTPAGEOFF] +_bluegl_glFramebufferDrawBufferEXT: + adrp x16, ___blue_glCore_glFramebufferDrawBufferEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferDrawBufferEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3iv +.private_extern _bluegl_glFramebufferDrawBuffersEXT .align 2 -_bluegl_glMultiTexCoord3iv: - adrp x16, ___blue_glCore_glMultiTexCoord3iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3iv@GOTPAGEOFF] +_bluegl_glFramebufferDrawBuffersEXT: + adrp x16, ___blue_glCore_glFramebufferDrawBuffersEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferDrawBuffersEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayTexCoordOffsetEXT +.private_extern _bluegl_glFramebufferReadBufferEXT .align 2 -_bluegl_glVertexArrayTexCoordOffsetEXT: - adrp x16, ___blue_glCore_glVertexArrayTexCoordOffsetEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayTexCoordOffsetEXT@GOTPAGEOFF] +_bluegl_glFramebufferReadBufferEXT: + adrp x16, ___blue_glCore_glFramebufferReadBufferEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferReadBufferEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT +.private_extern _bluegl_glGetFramebufferParameterivEXT .align 2 -_bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT: - adrp x16, ___blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT@GOTPAGEOFF] +_bluegl_glGetFramebufferParameterivEXT: + adrp x16, ___blue_glCore_glGetFramebufferParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFramebufferParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetSamplerParameterIuiv +.private_extern _bluegl_glNamedCopyBufferSubDataEXT .align 2 -_bluegl_glGetSamplerParameterIuiv: - adrp x16, ___blue_glCore_glGetSamplerParameterIuiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetSamplerParameterIuiv@GOTPAGEOFF] +_bluegl_glNamedCopyBufferSubDataEXT: + adrp x16, ___blue_glCore_glNamedCopyBufferSubDataEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedCopyBufferSubDataEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2dARB +.private_extern _bluegl_glNamedFramebufferTextureEXT .align 2 -_bluegl_glVertexAttrib2dARB: - adrp x16, ___blue_glCore_glVertexAttrib2dARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2dARB@GOTPAGEOFF] +_bluegl_glNamedFramebufferTextureEXT: + adrp x16, ___blue_glCore_glNamedFramebufferTextureEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedFramebufferTextureEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormalStream3svATI +.private_extern _bluegl_glNamedFramebufferTextureLayerEXT .align 2 -_bluegl_glNormalStream3svATI: - adrp x16, ___blue_glCore_glNormalStream3svATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormalStream3svATI@GOTPAGEOFF] +_bluegl_glNamedFramebufferTextureLayerEXT: + adrp x16, ___blue_glCore_glNamedFramebufferTextureLayerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedFramebufferTextureLayerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClientActiveVertexStreamATI +.private_extern _bluegl_glNamedFramebufferTextureFaceEXT .align 2 -_bluegl_glClientActiveVertexStreamATI: - adrp x16, ___blue_glCore_glClientActiveVertexStreamATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClientActiveVertexStreamATI@GOTPAGEOFF] +_bluegl_glNamedFramebufferTextureFaceEXT: + adrp x16, ___blue_glCore_glNamedFramebufferTextureFaceEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedFramebufferTextureFaceEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStencilThenCoverFillPathInstancedNV +.private_extern _bluegl_glTextureRenderbufferEXT .align 2 -_bluegl_glStencilThenCoverFillPathInstancedNV: - adrp x16, ___blue_glCore_glStencilThenCoverFillPathInstancedNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStencilThenCoverFillPathInstancedNV@GOTPAGEOFF] +_bluegl_glTextureRenderbufferEXT: + adrp x16, ___blue_glCore_glTextureRenderbufferEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureRenderbufferEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3uiEXT +.private_extern _bluegl_glMultiTexRenderbufferEXT .align 2 -_bluegl_glSecondaryColor3uiEXT: - adrp x16, ___blue_glCore_glSecondaryColor3uiEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3uiEXT@GOTPAGEOFF] +_bluegl_glMultiTexRenderbufferEXT: + adrp x16, ___blue_glCore_glMultiTexRenderbufferEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexRenderbufferEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord2hNV +.private_extern _bluegl_glVertexArrayVertexOffsetEXT .align 2 -_bluegl_glTexCoord2hNV: - adrp x16, ___blue_glCore_glTexCoord2hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord2hNV@GOTPAGEOFF] +_bluegl_glVertexArrayVertexOffsetEXT: + adrp x16, ___blue_glCore_glVertexArrayVertexOffsetEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayVertexOffsetEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3fARB +.private_extern _bluegl_glVertexArrayColorOffsetEXT .align 2 -_bluegl_glVertexAttrib3fARB: - adrp x16, ___blue_glCore_glVertexAttrib3fARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3fARB@GOTPAGEOFF] +_bluegl_glVertexArrayColorOffsetEXT: + adrp x16, ___blue_glCore_glVertexArrayColorOffsetEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayColorOffsetEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetQueryBufferObjectui64v +.private_extern _bluegl_glVertexArrayEdgeFlagOffsetEXT .align 2 -_bluegl_glGetQueryBufferObjectui64v: - adrp x16, ___blue_glCore_glGetQueryBufferObjectui64v@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetQueryBufferObjectui64v@GOTPAGEOFF] +_bluegl_glVertexArrayEdgeFlagOffsetEXT: + adrp x16, ___blue_glCore_glVertexArrayEdgeFlagOffsetEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayEdgeFlagOffsetEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMaterialxOES +.private_extern _bluegl_glVertexArrayIndexOffsetEXT .align 2 -_bluegl_glGetMaterialxOES: - adrp x16, ___blue_glCore_glGetMaterialxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMaterialxOES@GOTPAGEOFF] +_bluegl_glVertexArrayIndexOffsetEXT: + adrp x16, ___blue_glCore_glVertexArrayIndexOffsetEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayIndexOffsetEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiDrawArrays +.private_extern _bluegl_glVertexArrayNormalOffsetEXT .align 2 -_bluegl_glMultiDrawArrays: - adrp x16, ___blue_glCore_glMultiDrawArrays@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiDrawArrays@GOTPAGEOFF] +_bluegl_glVertexArrayNormalOffsetEXT: + adrp x16, ___blue_glCore_glVertexArrayNormalOffsetEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayNormalOffsetEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3iEXT +.private_extern _bluegl_glVertexArrayTexCoordOffsetEXT .align 2 -_bluegl_glSecondaryColor3iEXT: - adrp x16, ___blue_glCore_glSecondaryColor3iEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3iEXT@GOTPAGEOFF] +_bluegl_glVertexArrayTexCoordOffsetEXT: + adrp x16, ___blue_glCore_glVertexArrayTexCoordOffsetEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayTexCoordOffsetEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2ui64NV +.private_extern _bluegl_glVertexArrayMultiTexCoordOffsetEXT .align 2 -_bluegl_glProgramUniform2ui64NV: - adrp x16, ___blue_glCore_glProgramUniform2ui64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2ui64NV@GOTPAGEOFF] +_bluegl_glVertexArrayMultiTexCoordOffsetEXT: + adrp x16, ___blue_glCore_glVertexArrayMultiTexCoordOffsetEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayMultiTexCoordOffsetEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteQueries +.private_extern _bluegl_glVertexArrayFogCoordOffsetEXT .align 2 -_bluegl_glDeleteQueries: - adrp x16, ___blue_glCore_glDeleteQueries@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteQueries@GOTPAGEOFF] +_bluegl_glVertexArrayFogCoordOffsetEXT: + adrp x16, ___blue_glCore_glVertexArrayFogCoordOffsetEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayFogCoordOffsetEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteRenderbuffers +.private_extern _bluegl_glVertexArraySecondaryColorOffsetEXT .align 2 -_bluegl_glDeleteRenderbuffers: - adrp x16, ___blue_glCore_glDeleteRenderbuffers@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteRenderbuffers@GOTPAGEOFF] +_bluegl_glVertexArraySecondaryColorOffsetEXT: + adrp x16, ___blue_glCore_glVertexArraySecondaryColorOffsetEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArraySecondaryColorOffsetEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramLocalParameterdvARB +.private_extern _bluegl_glVertexArrayVertexAttribOffsetEXT .align 2 -_bluegl_glGetProgramLocalParameterdvARB: - adrp x16, ___blue_glCore_glGetProgramLocalParameterdvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramLocalParameterdvARB@GOTPAGEOFF] +_bluegl_glVertexArrayVertexAttribOffsetEXT: + adrp x16, ___blue_glCore_glVertexArrayVertexAttribOffsetEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayVertexAttribOffsetEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord2xOES +.private_extern _bluegl_glVertexArrayVertexAttribIOffsetEXT .align 2 -_bluegl_glTexCoord2xOES: - adrp x16, ___blue_glCore_glTexCoord2xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord2xOES@GOTPAGEOFF] +_bluegl_glVertexArrayVertexAttribIOffsetEXT: + adrp x16, ___blue_glCore_glVertexArrayVertexAttribIOffsetEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayVertexAttribIOffsetEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindBuffer +.private_extern _bluegl_glEnableVertexArrayEXT .align 2 -_bluegl_glBindBuffer: - adrp x16, ___blue_glCore_glBindBuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindBuffer@GOTPAGEOFF] +_bluegl_glEnableVertexArrayEXT: + adrp x16, ___blue_glCore_glEnableVertexArrayEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEnableVertexArrayEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glResumeTransformFeedback +.private_extern _bluegl_glDisableVertexArrayEXT .align 2 -_bluegl_glResumeTransformFeedback: - adrp x16, ___blue_glCore_glResumeTransformFeedback@GOTPAGE - ldr x16, [x16, ___blue_glCore_glResumeTransformFeedback@GOTPAGEOFF] +_bluegl_glDisableVertexArrayEXT: + adrp x16, ___blue_glCore_glDisableVertexArrayEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDisableVertexArrayEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFlushPixelDataRangeNV +.private_extern _bluegl_glEnableVertexArrayAttribEXT .align 2 -_bluegl_glFlushPixelDataRangeNV: - adrp x16, ___blue_glCore_glFlushPixelDataRangeNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFlushPixelDataRangeNV@GOTPAGEOFF] +_bluegl_glEnableVertexArrayAttribEXT: + adrp x16, ___blue_glCore_glEnableVertexArrayAttribEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEnableVertexArrayAttribEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColorPointer +.private_extern _bluegl_glDisableVertexArrayAttribEXT .align 2 -_bluegl_glSecondaryColorPointer: - adrp x16, ___blue_glCore_glSecondaryColorPointer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColorPointer@GOTPAGEOFF] +_bluegl_glDisableVertexArrayAttribEXT: + adrp x16, ___blue_glCore_glDisableVertexArrayAttribEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDisableVertexArrayAttribEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVideoCaptureStreamParameterdvNV +.private_extern _bluegl_glGetVertexArrayIntegervEXT .align 2 -_bluegl_glVideoCaptureStreamParameterdvNV: - adrp x16, ___blue_glCore_glVideoCaptureStreamParameterdvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVideoCaptureStreamParameterdvNV@GOTPAGEOFF] +_bluegl_glGetVertexArrayIntegervEXT: + adrp x16, ___blue_glCore_glGetVertexArrayIntegervEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexArrayIntegervEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureSubImage2DEXT +.private_extern _bluegl_glGetVertexArrayPointervEXT .align 2 -_bluegl_glTextureSubImage2DEXT: - adrp x16, ___blue_glCore_glTextureSubImage2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureSubImage2DEXT@GOTPAGEOFF] +_bluegl_glGetVertexArrayPointervEXT: + adrp x16, ___blue_glCore_glGetVertexArrayPointervEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexArrayPointervEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeletePathsNV +.private_extern _bluegl_glGetVertexArrayIntegeri_vEXT .align 2 -_bluegl_glDeletePathsNV: - adrp x16, ___blue_glCore_glDeletePathsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeletePathsNV@GOTPAGEOFF] +_bluegl_glGetVertexArrayIntegeri_vEXT: + adrp x16, ___blue_glCore_glGetVertexArrayIntegeri_vEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexArrayIntegeri_vEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFloatv +.private_extern _bluegl_glGetVertexArrayPointeri_vEXT .align 2 -_bluegl_glGetFloatv: - adrp x16, ___blue_glCore_glGetFloatv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFloatv@GOTPAGEOFF] +_bluegl_glGetVertexArrayPointeri_vEXT: + adrp x16, ___blue_glCore_glGetVertexArrayPointeri_vEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexArrayPointeri_vEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI3uivEXT +.private_extern _bluegl_glMapNamedBufferRangeEXT .align 2 -_bluegl_glVertexAttribI3uivEXT: - adrp x16, ___blue_glCore_glVertexAttribI3uivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI3uivEXT@GOTPAGEOFF] +_bluegl_glMapNamedBufferRangeEXT: + adrp x16, ___blue_glCore_glMapNamedBufferRangeEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMapNamedBufferRangeEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribdvARB +.private_extern _bluegl_glFlushMappedNamedBufferRangeEXT .align 2 -_bluegl_glGetVertexAttribdvARB: - adrp x16, ___blue_glCore_glGetVertexAttribdvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribdvARB@GOTPAGEOFF] +_bluegl_glFlushMappedNamedBufferRangeEXT: + adrp x16, ___blue_glCore_glFlushMappedNamedBufferRangeEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFlushMappedNamedBufferRangeEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4ui64NV +.private_extern _bluegl_glNamedBufferStorageEXT .align 2 -_bluegl_glUniform4ui64NV: - adrp x16, ___blue_glCore_glUniform4ui64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4ui64NV@GOTPAGEOFF] +_bluegl_glNamedBufferStorageEXT: + adrp x16, ___blue_glCore_glNamedBufferStorageEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedBufferStorageEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureLevelParameterfv +.private_extern _bluegl_glClearNamedBufferDataEXT .align 2 -_bluegl_glGetTextureLevelParameterfv: - adrp x16, ___blue_glCore_glGetTextureLevelParameterfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureLevelParameterfv@GOTPAGEOFF] +_bluegl_glClearNamedBufferDataEXT: + adrp x16, ___blue_glCore_glClearNamedBufferDataEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearNamedBufferDataEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2i +.private_extern _bluegl_glClearNamedBufferSubDataEXT .align 2 -_bluegl_glWindowPos2i: - adrp x16, ___blue_glCore_glWindowPos2i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2i@GOTPAGEOFF] +_bluegl_glClearNamedBufferSubDataEXT: + adrp x16, ___blue_glCore_glClearNamedBufferSubDataEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearNamedBufferSubDataEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeuiColor4ubVertex3fSUN +.private_extern _bluegl_glNamedFramebufferParameteriEXT .align 2 -_bluegl_glReplacementCodeuiColor4ubVertex3fSUN: - adrp x16, ___blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN@GOTPAGEOFF] +_bluegl_glNamedFramebufferParameteriEXT: + adrp x16, ___blue_glCore_glNamedFramebufferParameteriEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedFramebufferParameteriEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedMultiTexSubImage3DEXT +.private_extern _bluegl_glGetNamedFramebufferParameterivEXT .align 2 -_bluegl_glCompressedMultiTexSubImage3DEXT: - adrp x16, ___blue_glCore_glCompressedMultiTexSubImage3DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedMultiTexSubImage3DEXT@GOTPAGEOFF] +_bluegl_glGetNamedFramebufferParameterivEXT: + adrp x16, ___blue_glCore_glGetNamedFramebufferParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedFramebufferParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTexParameterIivEXT +.private_extern _bluegl_glProgramUniform1dEXT .align 2 -_bluegl_glGetTexParameterIivEXT: - adrp x16, ___blue_glCore_glGetTexParameterIivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTexParameterIivEXT@GOTPAGEOFF] +_bluegl_glProgramUniform1dEXT: + adrp x16, ___blue_glCore_glProgramUniform1dEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1dEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDebugMessageCallbackARB +.private_extern _bluegl_glProgramUniform2dEXT .align 2 -_bluegl_glDebugMessageCallbackARB: - adrp x16, ___blue_glCore_glDebugMessageCallbackARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDebugMessageCallbackARB@GOTPAGEOFF] +_bluegl_glProgramUniform2dEXT: + adrp x16, ___blue_glCore_glProgramUniform2dEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2dEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWeightPointerARB +.private_extern _bluegl_glProgramUniform3dEXT .align 2 -_bluegl_glWeightPointerARB: - adrp x16, ___blue_glCore_glWeightPointerARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWeightPointerARB@GOTPAGEOFF] +_bluegl_glProgramUniform3dEXT: + adrp x16, ___blue_glCore_glProgramUniform3dEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3dEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFogxOES +.private_extern _bluegl_glProgramUniform4dEXT .align 2 -_bluegl_glFogxOES: - adrp x16, ___blue_glCore_glFogxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFogxOES@GOTPAGEOFF] +_bluegl_glProgramUniform4dEXT: + adrp x16, ___blue_glCore_glProgramUniform4dEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4dEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix2x4fvEXT +.private_extern _bluegl_glProgramUniform1dvEXT .align 2 -_bluegl_glProgramUniformMatrix2x4fvEXT: - adrp x16, ___blue_glCore_glProgramUniformMatrix2x4fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2x4fvEXT@GOTPAGEOFF] +_bluegl_glProgramUniform1dvEXT: + adrp x16, ___blue_glCore_glProgramUniform1dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform1dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4iv +.private_extern _bluegl_glProgramUniform2dvEXT .align 2 -_bluegl_glVertexAttrib4iv: - adrp x16, ___blue_glCore_glVertexAttrib4iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4iv@GOTPAGEOFF] +_bluegl_glProgramUniform2dvEXT: + adrp x16, ___blue_glCore_glProgramUniform2dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform2dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramLocalParameterI4iNV +.private_extern _bluegl_glProgramUniform3dvEXT .align 2 -_bluegl_glProgramLocalParameterI4iNV: - adrp x16, ___blue_glCore_glProgramLocalParameterI4iNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramLocalParameterI4iNV@GOTPAGEOFF] +_bluegl_glProgramUniform3dvEXT: + adrp x16, ___blue_glCore_glProgramUniform3dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform3dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnColorTableARB +.private_extern _bluegl_glProgramUniform4dvEXT .align 2 -_bluegl_glGetnColorTableARB: - adrp x16, ___blue_glCore_glGetnColorTableARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnColorTableARB@GOTPAGEOFF] +_bluegl_glProgramUniform4dvEXT: + adrp x16, ___blue_glCore_glProgramUniform4dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniform4dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearNamedBufferData +.private_extern _bluegl_glProgramUniformMatrix2dvEXT .align 2 -_bluegl_glClearNamedBufferData: - adrp x16, ___blue_glCore_glClearNamedBufferData@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearNamedBufferData@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix2dvEXT: + adrp x16, ___blue_glCore_glProgramUniformMatrix2dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorMaskIndexedEXT +.private_extern _bluegl_glProgramUniformMatrix3dvEXT .align 2 -_bluegl_glColorMaskIndexedEXT: - adrp x16, ___blue_glCore_glColorMaskIndexedEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorMaskIndexedEXT@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix3dvEXT: + adrp x16, ___blue_glCore_glProgramUniformMatrix3dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribLPointer +.private_extern _bluegl_glProgramUniformMatrix4dvEXT .align 2 -_bluegl_glVertexAttribLPointer: - adrp x16, ___blue_glCore_glVertexAttribLPointer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribLPointer@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix4dvEXT: + adrp x16, ___blue_glCore_glProgramUniformMatrix4dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3i64vNV +.private_extern _bluegl_glProgramUniformMatrix2x3dvEXT .align 2 -_bluegl_glProgramUniform3i64vNV: - adrp x16, ___blue_glCore_glProgramUniform3i64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3i64vNV@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix2x3dvEXT: + adrp x16, ___blue_glCore_glProgramUniformMatrix2x3dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2x3dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glScissor +.private_extern _bluegl_glProgramUniformMatrix2x4dvEXT .align 2 -_bluegl_glScissor: - adrp x16, ___blue_glCore_glScissor@GOTPAGE - ldr x16, [x16, ___blue_glCore_glScissor@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix2x4dvEXT: + adrp x16, ___blue_glCore_glProgramUniformMatrix2x4dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2x4dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3fv +.private_extern _bluegl_glProgramUniformMatrix3x2dvEXT .align 2 -_bluegl_glSecondaryColor3fv: - adrp x16, ___blue_glCore_glSecondaryColor3fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3fv@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix3x2dvEXT: + adrp x16, ___blue_glCore_glProgramUniformMatrix3x2dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3x2dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCombinerParameterivNV +.private_extern _bluegl_glProgramUniformMatrix3x4dvEXT .align 2 -_bluegl_glCombinerParameterivNV: - adrp x16, ___blue_glCore_glCombinerParameterivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCombinerParameterivNV@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix3x4dvEXT: + adrp x16, ___blue_glCore_glProgramUniformMatrix3x4dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3x4dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTexLevelParameterfv +.private_extern _bluegl_glProgramUniformMatrix4x2dvEXT .align 2 -_bluegl_glGetTexLevelParameterfv: - adrp x16, ___blue_glCore_glGetTexLevelParameterfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTexLevelParameterfv@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix4x2dvEXT: + adrp x16, ___blue_glCore_glProgramUniformMatrix4x2dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4x2dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawElementArrayATI +.private_extern _bluegl_glProgramUniformMatrix4x3dvEXT .align 2 -_bluegl_glDrawElementArrayATI: - adrp x16, ___blue_glCore_glDrawElementArrayATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawElementArrayATI@GOTPAGEOFF] +_bluegl_glProgramUniformMatrix4x3dvEXT: + adrp x16, ___blue_glCore_glProgramUniformMatrix4x3dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4x3dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4Nusv +.private_extern _bluegl_glTextureBufferRangeEXT .align 2 -_bluegl_glVertexAttrib4Nusv: - adrp x16, ___blue_glCore_glVertexAttrib4Nusv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4Nusv@GOTPAGEOFF] +_bluegl_glTextureBufferRangeEXT: + adrp x16, ___blue_glCore_glTextureBufferRangeEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureBufferRangeEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3dvMESA +.private_extern _bluegl_glTextureStorage1DEXT .align 2 -_bluegl_glWindowPos3dvMESA: - adrp x16, ___blue_glCore_glWindowPos3dvMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3dvMESA@GOTPAGEOFF] +_bluegl_glTextureStorage1DEXT: + adrp x16, ___blue_glCore_glTextureStorage1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureStorage1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMakeImageHandleResidentARB +.private_extern _bluegl_glTextureStorage2DEXT .align 2 -_bluegl_glMakeImageHandleResidentARB: - adrp x16, ___blue_glCore_glMakeImageHandleResidentARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMakeImageHandleResidentARB@GOTPAGEOFF] +_bluegl_glTextureStorage2DEXT: + adrp x16, ___blue_glCore_glTextureStorage2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureStorage2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3svMESA +.private_extern _bluegl_glTextureStorage3DEXT .align 2 -_bluegl_glWindowPos3svMESA: - adrp x16, ___blue_glCore_glWindowPos3svMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3svMESA@GOTPAGEOFF] +_bluegl_glTextureStorage3DEXT: + adrp x16, ___blue_glCore_glTextureStorage3DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureStorage3DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMultiTexLevelParameterfvEXT +.private_extern _bluegl_glTextureStorage2DMultisampleEXT .align 2 -_bluegl_glGetMultiTexLevelParameterfvEXT: - adrp x16, ___blue_glCore_glGetMultiTexLevelParameterfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMultiTexLevelParameterfvEXT@GOTPAGEOFF] +_bluegl_glTextureStorage2DMultisampleEXT: + adrp x16, ___blue_glCore_glTextureStorage2DMultisampleEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureStorage2DMultisampleEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glRasterPos3xOES +.private_extern _bluegl_glTextureStorage3DMultisampleEXT .align 2 -_bluegl_glRasterPos3xOES: - adrp x16, ___blue_glCore_glRasterPos3xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glRasterPos3xOES@GOTPAGEOFF] +_bluegl_glTextureStorage3DMultisampleEXT: + adrp x16, ___blue_glCore_glTextureStorage3DMultisampleEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureStorage3DMultisampleEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBinormal3iEXT +.private_extern _bluegl_glVertexArrayBindVertexBufferEXT .align 2 -_bluegl_glBinormal3iEXT: - adrp x16, ___blue_glCore_glBinormal3iEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBinormal3iEXT@GOTPAGEOFF] +_bluegl_glVertexArrayBindVertexBufferEXT: + adrp x16, ___blue_glCore_glVertexArrayBindVertexBufferEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayBindVertexBufferEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribP3uiv +.private_extern _bluegl_glVertexArrayVertexAttribFormatEXT .align 2 -_bluegl_glVertexAttribP3uiv: - adrp x16, ___blue_glCore_glVertexAttribP3uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribP3uiv@GOTPAGEOFF] +_bluegl_glVertexArrayVertexAttribFormatEXT: + adrp x16, ___blue_glCore_glVertexArrayVertexAttribFormatEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayVertexAttribFormatEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix2x3dv +.private_extern _bluegl_glVertexArrayVertexAttribIFormatEXT .align 2 -_bluegl_glProgramUniformMatrix2x3dv: - adrp x16, ___blue_glCore_glProgramUniformMatrix2x3dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2x3dv@GOTPAGEOFF] +_bluegl_glVertexArrayVertexAttribIFormatEXT: + adrp x16, ___blue_glCore_glVertexArrayVertexAttribIFormatEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayVertexAttribIFormatEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEndConditionalRender +.private_extern _bluegl_glVertexArrayVertexAttribLFormatEXT .align 2 -_bluegl_glEndConditionalRender: - adrp x16, ___blue_glCore_glEndConditionalRender@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEndConditionalRender@GOTPAGEOFF] +_bluegl_glVertexArrayVertexAttribLFormatEXT: + adrp x16, ___blue_glCore_glVertexArrayVertexAttribLFormatEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayVertexAttribLFormatEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindParameterEXT +.private_extern _bluegl_glVertexArrayVertexAttribBindingEXT .align 2 -_bluegl_glBindParameterEXT: - adrp x16, ___blue_glCore_glBindParameterEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindParameterEXT@GOTPAGEOFF] +_bluegl_glVertexArrayVertexAttribBindingEXT: + adrp x16, ___blue_glCore_glVertexArrayVertexAttribBindingEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayVertexAttribBindingEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompileShaderIncludeARB +.private_extern _bluegl_glVertexArrayVertexBindingDivisorEXT .align 2 -_bluegl_glCompileShaderIncludeARB: - adrp x16, ___blue_glCore_glCompileShaderIncludeARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompileShaderIncludeARB@GOTPAGEOFF] +_bluegl_glVertexArrayVertexBindingDivisorEXT: + adrp x16, ___blue_glCore_glVertexArrayVertexBindingDivisorEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayVertexBindingDivisorEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexStorageSparseAMD +.private_extern _bluegl_glVertexArrayVertexAttribLOffsetEXT .align 2 -_bluegl_glTexStorageSparseAMD: - adrp x16, ___blue_glCore_glTexStorageSparseAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexStorageSparseAMD@GOTPAGEOFF] +_bluegl_glVertexArrayVertexAttribLOffsetEXT: + adrp x16, ___blue_glCore_glVertexArrayVertexAttribLOffsetEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayVertexAttribLOffsetEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreateShaderProgramEXT +.private_extern _bluegl_glTexturePageCommitmentEXT .align 2 -_bluegl_glCreateShaderProgramEXT: - adrp x16, ___blue_glCore_glCreateShaderProgramEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreateShaderProgramEXT@GOTPAGEOFF] +_bluegl_glTexturePageCommitmentEXT: + adrp x16, ___blue_glCore_glTexturePageCommitmentEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexturePageCommitmentEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix3x2fv +.private_extern _bluegl_glVertexArrayVertexAttribDivisorEXT .align 2 -_bluegl_glUniformMatrix3x2fv: - adrp x16, ___blue_glCore_glUniformMatrix3x2fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix3x2fv@GOTPAGEOFF] +_bluegl_glVertexArrayVertexAttribDivisorEXT: + adrp x16, ___blue_glCore_glVertexArrayVertexAttribDivisorEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayVertexAttribDivisorEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPrimitiveRestartIndex +.private_extern _bluegl_glColorMaskIndexedEXT .align 2 -_bluegl_glPrimitiveRestartIndex: - adrp x16, ___blue_glCore_glPrimitiveRestartIndex@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPrimitiveRestartIndex@GOTPAGEOFF] +_bluegl_glColorMaskIndexedEXT: + adrp x16, ___blue_glCore_glColorMaskIndexedEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorMaskIndexedEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreateProgram +.private_extern _bluegl_glDrawArraysInstancedEXT .align 2 -_bluegl_glCreateProgram: - adrp x16, ___blue_glCore_glCreateProgram@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreateProgram@GOTPAGEOFF] +_bluegl_glDrawArraysInstancedEXT: + adrp x16, ___blue_glCore_glDrawArraysInstancedEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawArraysInstancedEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3d +.private_extern _bluegl_glDrawElementsInstancedEXT .align 2 -_bluegl_glMultiTexCoord3d: - adrp x16, ___blue_glCore_glMultiTexCoord3d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3d@GOTPAGEOFF] +_bluegl_glDrawElementsInstancedEXT: + adrp x16, ___blue_glCore_glDrawElementsInstancedEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawElementsInstancedEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFenceivNV +.private_extern _bluegl_glDrawRangeElementsEXT .align 2 -_bluegl_glGetFenceivNV: - adrp x16, ___blue_glCore_glGetFenceivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFenceivNV@GOTPAGEOFF] +_bluegl_glDrawRangeElementsEXT: + adrp x16, ___blue_glCore_glDrawRangeElementsEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawRangeElementsEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4dv +.private_extern _bluegl_glFogCoordfEXT .align 2 -_bluegl_glUniform4dv: - adrp x16, ___blue_glCore_glUniform4dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4dv@GOTPAGEOFF] +_bluegl_glFogCoordfEXT: + adrp x16, ___blue_glCore_glFogCoordfEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFogCoordfEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3i64ARB +.private_extern _bluegl_glFogCoordfvEXT .align 2 -_bluegl_glUniform3i64ARB: - adrp x16, ___blue_glCore_glUniform3i64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3i64ARB@GOTPAGEOFF] +_bluegl_glFogCoordfvEXT: + adrp x16, ___blue_glCore_glFogCoordfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFogCoordfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexturePageCommitmentEXT +.private_extern _bluegl_glFogCoorddEXT .align 2 -_bluegl_glTexturePageCommitmentEXT: - adrp x16, ___blue_glCore_glTexturePageCommitmentEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexturePageCommitmentEXT@GOTPAGEOFF] +_bluegl_glFogCoorddEXT: + adrp x16, ___blue_glCore_glFogCoorddEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFogCoorddEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColor4hNV +.private_extern _bluegl_glFogCoorddvEXT .align 2 -_bluegl_glColor4hNV: - adrp x16, ___blue_glCore_glColor4hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColor4hNV@GOTPAGEOFF] +_bluegl_glFogCoorddvEXT: + adrp x16, ___blue_glCore_glFogCoorddvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFogCoorddvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream2fATI +.private_extern _bluegl_glFogCoordPointerEXT .align 2 -_bluegl_glVertexStream2fATI: - adrp x16, ___blue_glCore_glVertexStream2fATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream2fATI@GOTPAGEOFF] +_bluegl_glFogCoordPointerEXT: + adrp x16, ___blue_glCore_glFogCoordPointerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFogCoordPointerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDisable +.private_extern _bluegl_glBlitFramebufferEXT .align 2 -_bluegl_glDisable: - adrp x16, ___blue_glCore_glDisable@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDisable@GOTPAGEOFF] +_bluegl_glBlitFramebufferEXT: + adrp x16, ___blue_glCore_glBlitFramebufferEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlitFramebufferEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferRenderbuffer +.private_extern _bluegl_glRenderbufferStorageMultisampleEXT .align 2 -_bluegl_glFramebufferRenderbuffer: - adrp x16, ___blue_glCore_glFramebufferRenderbuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferRenderbuffer@GOTPAGEOFF] +_bluegl_glRenderbufferStorageMultisampleEXT: + adrp x16, ___blue_glCore_glRenderbufferStorageMultisampleEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glRenderbufferStorageMultisampleEXT@GOTPAGEOFF] ldr x16, [x16] br x16 @@ -14131,6482 +14114,6498 @@ _bluegl_glIsRenderbufferEXT: ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMultiTexParameterIivEXT +.private_extern _bluegl_glBindRenderbufferEXT .align 2 -_bluegl_glGetMultiTexParameterIivEXT: - adrp x16, ___blue_glCore_glGetMultiTexParameterIivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMultiTexParameterIivEXT@GOTPAGEOFF] +_bluegl_glBindRenderbufferEXT: + adrp x16, ___blue_glCore_glBindRenderbufferEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindRenderbufferEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2fvNV +.private_extern _bluegl_glDeleteRenderbuffersEXT .align 2 -_bluegl_glVertexAttrib2fvNV: - adrp x16, ___blue_glCore_glVertexAttrib2fvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2fvNV@GOTPAGEOFF] +_bluegl_glDeleteRenderbuffersEXT: + adrp x16, ___blue_glCore_glDeleteRenderbuffersEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteRenderbuffersEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReferencePlaneSGIX +.private_extern _bluegl_glGenRenderbuffersEXT .align 2 -_bluegl_glReferencePlaneSGIX: - adrp x16, ___blue_glCore_glReferencePlaneSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReferencePlaneSGIX@GOTPAGEOFF] +_bluegl_glGenRenderbuffersEXT: + adrp x16, ___blue_glCore_glGenRenderbuffersEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenRenderbuffersEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4fARB +.private_extern _bluegl_glRenderbufferStorageEXT .align 2 -_bluegl_glUniform4fARB: - adrp x16, ___blue_glCore_glUniform4fARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4fARB@GOTPAGEOFF] +_bluegl_glRenderbufferStorageEXT: + adrp x16, ___blue_glCore_glRenderbufferStorageEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glRenderbufferStorageEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearBufferfi +.private_extern _bluegl_glGetRenderbufferParameterivEXT .align 2 -_bluegl_glClearBufferfi: - adrp x16, ___blue_glCore_glClearBufferfi@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearBufferfi@GOTPAGEOFF] +_bluegl_glGetRenderbufferParameterivEXT: + adrp x16, ___blue_glCore_glGetRenderbufferParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetRenderbufferParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindFragDataLocation +.private_extern _bluegl_glIsFramebufferEXT .align 2 -_bluegl_glBindFragDataLocation: - adrp x16, ___blue_glCore_glBindFragDataLocation@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindFragDataLocation@GOTPAGEOFF] +_bluegl_glIsFramebufferEXT: + adrp x16, ___blue_glCore_glIsFramebufferEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsFramebufferEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetIntegerv +.private_extern _bluegl_glBindFramebufferEXT .align 2 -_bluegl_glGetIntegerv: - adrp x16, ___blue_glCore_glGetIntegerv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetIntegerv@GOTPAGEOFF] +_bluegl_glBindFramebufferEXT: + adrp x16, ___blue_glCore_glBindFramebufferEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindFramebufferEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetObjectLabel +.private_extern _bluegl_glDeleteFramebuffersEXT .align 2 -_bluegl_glGetObjectLabel: - adrp x16, ___blue_glCore_glGetObjectLabel@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetObjectLabel@GOTPAGEOFF] +_bluegl_glDeleteFramebuffersEXT: + adrp x16, ___blue_glCore_glDeleteFramebuffersEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteFramebuffersEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBufferPageCommitmentARB +.private_extern _bluegl_glGenFramebuffersEXT .align 2 -_bluegl_glBufferPageCommitmentARB: - adrp x16, ___blue_glCore_glBufferPageCommitmentARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBufferPageCommitmentARB@GOTPAGEOFF] +_bluegl_glGenFramebuffersEXT: + adrp x16, ___blue_glCore_glGenFramebuffersEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenFramebuffersEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendFuncIndexedAMD +.private_extern _bluegl_glCheckFramebufferStatusEXT .align 2 -_bluegl_glBlendFuncIndexedAMD: - adrp x16, ___blue_glCore_glBlendFuncIndexedAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendFuncIndexedAMD@GOTPAGEOFF] +_bluegl_glCheckFramebufferStatusEXT: + adrp x16, ___blue_glCore_glCheckFramebufferStatusEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCheckFramebufferStatusEXT@GOTPAGEOFF] + ldr x16, [x16] + br x16 + +.private_extern _bluegl_glFramebufferTexture1DEXT + .align 2 +_bluegl_glFramebufferTexture1DEXT: + adrp x16, ___blue_glCore_glFramebufferTexture1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferTexture1DEXT@GOTPAGEOFF] + ldr x16, [x16] + br x16 + +.private_extern _bluegl_glFramebufferTexture2DEXT + .align 2 +_bluegl_glFramebufferTexture2DEXT: + adrp x16, ___blue_glCore_glFramebufferTexture2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferTexture2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetQueryObjectui64vEXT +.private_extern _bluegl_glFramebufferTexture3DEXT .align 2 -_bluegl_glGetQueryObjectui64vEXT: - adrp x16, ___blue_glCore_glGetQueryObjectui64vEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetQueryObjectui64vEXT@GOTPAGEOFF] +_bluegl_glFramebufferTexture3DEXT: + adrp x16, ___blue_glCore_glFramebufferTexture3DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferTexture3DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN +.private_extern _bluegl_glFramebufferRenderbufferEXT .align 2 -_bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN: - adrp x16, ___blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN@GOTPAGEOFF] +_bluegl_glFramebufferRenderbufferEXT: + adrp x16, ___blue_glCore_glFramebufferRenderbufferEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferRenderbufferEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlitFramebuffer +.private_extern _bluegl_glGetFramebufferAttachmentParameterivEXT .align 2 -_bluegl_glBlitFramebuffer: - adrp x16, ___blue_glCore_glBlitFramebuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlitFramebuffer@GOTPAGEOFF] +_bluegl_glGetFramebufferAttachmentParameterivEXT: + adrp x16, ___blue_glCore_glGetFramebufferAttachmentParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFramebufferAttachmentParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2f +.private_extern _bluegl_glGenerateMipmapEXT .align 2 -_bluegl_glMultiTexCoord2f: - adrp x16, ___blue_glCore_glMultiTexCoord2f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2f@GOTPAGEOFF] +_bluegl_glGenerateMipmapEXT: + adrp x16, ___blue_glCore_glGenerateMipmapEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenerateMipmapEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedFramebufferRenderbufferEXT +.private_extern _bluegl_glProgramParameteriEXT .align 2 -_bluegl_glNamedFramebufferRenderbufferEXT: - adrp x16, ___blue_glCore_glNamedFramebufferRenderbufferEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedFramebufferRenderbufferEXT@GOTPAGEOFF] +_bluegl_glProgramParameteriEXT: + adrp x16, ___blue_glCore_glProgramParameteriEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramParameteriEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUseProgramStages +.private_extern _bluegl_glProgramEnvParameters4fvEXT .align 2 -_bluegl_glUseProgramStages: - adrp x16, ___blue_glCore_glUseProgramStages@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUseProgramStages@GOTPAGEOFF] +_bluegl_glProgramEnvParameters4fvEXT: + adrp x16, ___blue_glCore_glProgramEnvParameters4fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramEnvParameters4fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedStringivARB +.private_extern _bluegl_glProgramLocalParameters4fvEXT .align 2 -_bluegl_glGetNamedStringivARB: - adrp x16, ___blue_glCore_glGetNamedStringivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedStringivARB@GOTPAGEOFF] +_bluegl_glProgramLocalParameters4fvEXT: + adrp x16, ___blue_glCore_glProgramLocalParameters4fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramLocalParameters4fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1iARB +.private_extern _bluegl_glGetUniformuivEXT .align 2 -_bluegl_glMultiTexCoord1iARB: - adrp x16, ___blue_glCore_glMultiTexCoord1iARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1iARB@GOTPAGEOFF] +_bluegl_glGetUniformuivEXT: + adrp x16, ___blue_glCore_glGetUniformuivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetUniformuivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4xvOES +.private_extern _bluegl_glBindFragDataLocationEXT .align 2 -_bluegl_glMultiTexCoord4xvOES: - adrp x16, ___blue_glCore_glMultiTexCoord4xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4xvOES@GOTPAGEOFF] +_bluegl_glBindFragDataLocationEXT: + adrp x16, ___blue_glCore_glBindFragDataLocationEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindFragDataLocationEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMakeImageHandleResidentNV +.private_extern _bluegl_glGetFragDataLocationEXT .align 2 -_bluegl_glMakeImageHandleResidentNV: - adrp x16, ___blue_glCore_glMakeImageHandleResidentNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMakeImageHandleResidentNV@GOTPAGEOFF] +_bluegl_glGetFragDataLocationEXT: + adrp x16, ___blue_glCore_glGetFragDataLocationEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFragDataLocationEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1fvNV +.private_extern _bluegl_glUniform1uiEXT .align 2 -_bluegl_glVertexAttrib1fvNV: - adrp x16, ___blue_glCore_glVertexAttrib1fvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1fvNV@GOTPAGEOFF] +_bluegl_glUniform1uiEXT: + adrp x16, ___blue_glCore_glUniform1uiEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1uiEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glViewportIndexedf +.private_extern _bluegl_glUniform2uiEXT .align 2 -_bluegl_glViewportIndexedf: - adrp x16, ___blue_glCore_glViewportIndexedf@GOTPAGE - ldr x16, [x16, ___blue_glCore_glViewportIndexedf@GOTPAGEOFF] +_bluegl_glUniform2uiEXT: + adrp x16, ___blue_glCore_glUniform2uiEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2uiEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexStorage3DMultisample +.private_extern _bluegl_glUniform3uiEXT .align 2 -_bluegl_glTexStorage3DMultisample: - adrp x16, ___blue_glCore_glTexStorage3DMultisample@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexStorage3DMultisample@GOTPAGEOFF] +_bluegl_glUniform3uiEXT: + adrp x16, ___blue_glCore_glUniform3uiEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3uiEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreateShaderObjectARB +.private_extern _bluegl_glUniform4uiEXT .align 2 -_bluegl_glCreateShaderObjectARB: - adrp x16, ___blue_glCore_glCreateShaderObjectARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreateShaderObjectARB@GOTPAGEOFF] +_bluegl_glUniform4uiEXT: + adrp x16, ___blue_glCore_glUniform4uiEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4uiEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glListDrawCommandsStatesClientNV +.private_extern _bluegl_glUniform1uivEXT .align 2 -_bluegl_glListDrawCommandsStatesClientNV: - adrp x16, ___blue_glCore_glListDrawCommandsStatesClientNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glListDrawCommandsStatesClientNV@GOTPAGEOFF] +_bluegl_glUniform1uivEXT: + adrp x16, ___blue_glCore_glUniform1uivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform1uivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1d +.private_extern _bluegl_glUniform2uivEXT .align 2 -_bluegl_glUniform1d: - adrp x16, ___blue_glCore_glUniform1d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1d@GOTPAGEOFF] +_bluegl_glUniform2uivEXT: + adrp x16, ___blue_glCore_glUniform2uivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform2uivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetDebugMessageLogARB +.private_extern _bluegl_glUniform3uivEXT .align 2 -_bluegl_glGetDebugMessageLogARB: - adrp x16, ___blue_glCore_glGetDebugMessageLogARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetDebugMessageLogARB@GOTPAGEOFF] +_bluegl_glUniform3uivEXT: + adrp x16, ___blue_glCore_glUniform3uivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform3uivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendParameteriNV +.private_extern _bluegl_glUniform4uivEXT .align 2 -_bluegl_glBlendParameteriNV: - adrp x16, ___blue_glCore_glBlendParameteriNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendParameteriNV@GOTPAGEOFF] +_bluegl_glUniform4uivEXT: + adrp x16, ___blue_glCore_glUniform4uivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniform4uivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4sv +.private_extern _bluegl_glGetHistogramEXT .align 2 -_bluegl_glMultiTexCoord4sv: - adrp x16, ___blue_glCore_glMultiTexCoord4sv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4sv@GOTPAGEOFF] +_bluegl_glGetHistogramEXT: + adrp x16, ___blue_glCore_glGetHistogramEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetHistogramEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1uiEXT +.private_extern _bluegl_glGetHistogramParameterfvEXT .align 2 -_bluegl_glUniform1uiEXT: - adrp x16, ___blue_glCore_glUniform1uiEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1uiEXT@GOTPAGEOFF] +_bluegl_glGetHistogramParameterfvEXT: + adrp x16, ___blue_glCore_glGetHistogramParameterfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetHistogramParameterfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDebugMessageInsertAMD +.private_extern _bluegl_glGetHistogramParameterivEXT .align 2 -_bluegl_glDebugMessageInsertAMD: - adrp x16, ___blue_glCore_glDebugMessageInsertAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDebugMessageInsertAMD@GOTPAGEOFF] +_bluegl_glGetHistogramParameterivEXT: + adrp x16, ___blue_glCore_glGetHistogramParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetHistogramParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiDrawArraysIndirect +.private_extern _bluegl_glGetMinmaxEXT .align 2 -_bluegl_glMultiDrawArraysIndirect: - adrp x16, ___blue_glCore_glMultiDrawArraysIndirect@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiDrawArraysIndirect@GOTPAGEOFF] +_bluegl_glGetMinmaxEXT: + adrp x16, ___blue_glCore_glGetMinmaxEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMinmaxEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1d +.private_extern _bluegl_glGetMinmaxParameterfvEXT .align 2 -_bluegl_glProgramUniform1d: - adrp x16, ___blue_glCore_glProgramUniform1d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1d@GOTPAGEOFF] +_bluegl_glGetMinmaxParameterfvEXT: + adrp x16, ___blue_glCore_glGetMinmaxParameterfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMinmaxParameterfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetListParameterivSGIX +.private_extern _bluegl_glGetMinmaxParameterivEXT .align 2 -_bluegl_glGetListParameterivSGIX: - adrp x16, ___blue_glCore_glGetListParameterivSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetListParameterivSGIX@GOTPAGEOFF] +_bluegl_glGetMinmaxParameterivEXT: + adrp x16, ___blue_glCore_glGetMinmaxParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMinmaxParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPointParameterfv +.private_extern _bluegl_glHistogramEXT .align 2 -_bluegl_glPointParameterfv: - adrp x16, ___blue_glCore_glPointParameterfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPointParameterfv@GOTPAGEOFF] +_bluegl_glHistogramEXT: + adrp x16, ___blue_glCore_glHistogramEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glHistogramEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyBufferSubData +.private_extern _bluegl_glMinmaxEXT .align 2 -_bluegl_glCopyBufferSubData: - adrp x16, ___blue_glCore_glCopyBufferSubData@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyBufferSubData@GOTPAGEOFF] +_bluegl_glMinmaxEXT: + adrp x16, ___blue_glCore_glMinmaxEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMinmaxEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindProgramARB +.private_extern _bluegl_glResetHistogramEXT .align 2 -_bluegl_glBindProgramARB: - adrp x16, ___blue_glCore_glBindProgramARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindProgramARB@GOTPAGEOFF] +_bluegl_glResetHistogramEXT: + adrp x16, ___blue_glCore_glResetHistogramEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glResetHistogramEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCombinerStageParameterfvNV +.private_extern _bluegl_glResetMinmaxEXT .align 2 -_bluegl_glCombinerStageParameterfvNV: - adrp x16, ___blue_glCore_glCombinerStageParameterfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCombinerStageParameterfvNV@GOTPAGEOFF] +_bluegl_glResetMinmaxEXT: + adrp x16, ___blue_glCore_glResetMinmaxEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glResetMinmaxEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEndConditionalRenderNV +.private_extern _bluegl_glIndexFuncEXT .align 2 -_bluegl_glEndConditionalRenderNV: - adrp x16, ___blue_glCore_glEndConditionalRenderNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEndConditionalRenderNV@GOTPAGEOFF] +_bluegl_glIndexFuncEXT: + adrp x16, ___blue_glCore_glIndexFuncEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIndexFuncEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL3dEXT +.private_extern _bluegl_glIndexMaterialEXT .align 2 -_bluegl_glVertexAttribL3dEXT: - adrp x16, ___blue_glCore_glVertexAttribL3dEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL3dEXT@GOTPAGEOFF] +_bluegl_glIndexMaterialEXT: + adrp x16, ___blue_glCore_glIndexMaterialEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIndexMaterialEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3iv +.private_extern _bluegl_glApplyTextureEXT .align 2 -_bluegl_glWindowPos3iv: - adrp x16, ___blue_glCore_glWindowPos3iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3iv@GOTPAGEOFF] +_bluegl_glApplyTextureEXT: + adrp x16, ___blue_glCore_glApplyTextureEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glApplyTextureEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFogFuncSGIS +.private_extern _bluegl_glTextureLightEXT .align 2 -_bluegl_glGetFogFuncSGIS: - adrp x16, ___blue_glCore_glGetFogFuncSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFogFuncSGIS@GOTPAGEOFF] +_bluegl_glTextureLightEXT: + adrp x16, ___blue_glCore_glTextureLightEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureLightEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTexImage2D +.private_extern _bluegl_glTextureMaterialEXT .align 2 -_bluegl_glCompressedTexImage2D: - adrp x16, ___blue_glCore_glCompressedTexImage2D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTexImage2D@GOTPAGEOFF] +_bluegl_glTextureMaterialEXT: + adrp x16, ___blue_glCore_glTextureMaterialEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureMaterialEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPixelTexGenParameteriSGIS +.private_extern _bluegl_glMultiDrawArraysEXT .align 2 -_bluegl_glPixelTexGenParameteriSGIS: - adrp x16, ___blue_glCore_glPixelTexGenParameteriSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPixelTexGenParameteriSGIS@GOTPAGEOFF] +_bluegl_glMultiDrawArraysEXT: + adrp x16, ___blue_glCore_glMultiDrawArraysEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiDrawArraysEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDebugMessageControlARB +.private_extern _bluegl_glMultiDrawElementsEXT .align 2 -_bluegl_glDebugMessageControlARB: - adrp x16, ___blue_glCore_glDebugMessageControlARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDebugMessageControlARB@GOTPAGEOFF] +_bluegl_glMultiDrawElementsEXT: + adrp x16, ___blue_glCore_glMultiDrawElementsEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiDrawElementsEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMapBufferRange +.private_extern _bluegl_glSampleMaskEXT .align 2 -_bluegl_glMapBufferRange: - adrp x16, ___blue_glCore_glMapBufferRange@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMapBufferRange@GOTPAGEOFF] +_bluegl_glSampleMaskEXT: + adrp x16, ___blue_glCore_glSampleMaskEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSampleMaskEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1fvEXT +.private_extern _bluegl_glSamplePatternEXT .align 2 -_bluegl_glProgramUniform1fvEXT: - adrp x16, ___blue_glCore_glProgramUniform1fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1fvEXT@GOTPAGEOFF] +_bluegl_glSamplePatternEXT: + adrp x16, ___blue_glCore_glSamplePatternEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSamplePatternEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedRenderbufferStorageEXT +.private_extern _bluegl_glColorTableEXT .align 2 -_bluegl_glNamedRenderbufferStorageEXT: - adrp x16, ___blue_glCore_glNamedRenderbufferStorageEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedRenderbufferStorageEXT@GOTPAGEOFF] +_bluegl_glColorTableEXT: + adrp x16, ___blue_glCore_glColorTableEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorTableEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix4x2fv +.private_extern _bluegl_glGetColorTableEXT .align 2 -_bluegl_glProgramUniformMatrix4x2fv: - adrp x16, ___blue_glCore_glProgramUniformMatrix4x2fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4x2fv@GOTPAGEOFF] +_bluegl_glGetColorTableEXT: + adrp x16, ___blue_glCore_glGetColorTableEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetColorTableEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedProgramLocalParameterI4iEXT +.private_extern _bluegl_glGetColorTableParameterivEXT .align 2 -_bluegl_glNamedProgramLocalParameterI4iEXT: - adrp x16, ___blue_glCore_glNamedProgramLocalParameterI4iEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParameterI4iEXT@GOTPAGEOFF] +_bluegl_glGetColorTableParameterivEXT: + adrp x16, ___blue_glCore_glGetColorTableParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetColorTableParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearDepth +.private_extern _bluegl_glGetColorTableParameterfvEXT .align 2 -_bluegl_glClearDepth: - adrp x16, ___blue_glCore_glClearDepth@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearDepth@GOTPAGEOFF] +_bluegl_glGetColorTableParameterfvEXT: + adrp x16, ___blue_glCore_glGetColorTableParameterfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetColorTableParameterfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribs1dvNV +.private_extern _bluegl_glPixelTransformParameteriEXT .align 2 -_bluegl_glVertexAttribs1dvNV: - adrp x16, ___blue_glCore_glVertexAttribs1dvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribs1dvNV@GOTPAGEOFF] +_bluegl_glPixelTransformParameteriEXT: + adrp x16, ___blue_glCore_glPixelTransformParameteriEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPixelTransformParameteriEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3f +.private_extern _bluegl_glPixelTransformParameterfEXT .align 2 -_bluegl_glWindowPos3f: - adrp x16, ___blue_glCore_glWindowPos3f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3f@GOTPAGEOFF] +_bluegl_glPixelTransformParameterfEXT: + adrp x16, ___blue_glCore_glPixelTransformParameterfEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPixelTransformParameterfEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProvokingVertex +.private_extern _bluegl_glPixelTransformParameterivEXT .align 2 -_bluegl_glProvokingVertex: - adrp x16, ___blue_glCore_glProvokingVertex@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProvokingVertex@GOTPAGEOFF] +_bluegl_glPixelTransformParameterivEXT: + adrp x16, ___blue_glCore_glPixelTransformParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPixelTransformParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsNamedStringARB +.private_extern _bluegl_glPixelTransformParameterfvEXT .align 2 -_bluegl_glIsNamedStringARB: - adrp x16, ___blue_glCore_glIsNamedStringARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsNamedStringARB@GOTPAGEOFF] +_bluegl_glPixelTransformParameterfvEXT: + adrp x16, ___blue_glCore_glPixelTransformParameterfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPixelTransformParameterfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedBufferData +.private_extern _bluegl_glGetPixelTransformParameterivEXT .align 2 -_bluegl_glNamedBufferData: - adrp x16, ___blue_glCore_glNamedBufferData@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedBufferData@GOTPAGEOFF] +_bluegl_glGetPixelTransformParameterivEXT: + adrp x16, ___blue_glCore_glGetPixelTransformParameterivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPixelTransformParameterivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFragmentLightfSGIX +.private_extern _bluegl_glGetPixelTransformParameterfvEXT .align 2 -_bluegl_glFragmentLightfSGIX: - adrp x16, ___blue_glCore_glFragmentLightfSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFragmentLightfSGIX@GOTPAGEOFF] +_bluegl_glGetPixelTransformParameterfvEXT: + adrp x16, ___blue_glCore_glGetPixelTransformParameterfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPixelTransformParameterfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4uiv +.private_extern _bluegl_glPointParameterfEXT .align 2 -_bluegl_glProgramUniform4uiv: - adrp x16, ___blue_glCore_glProgramUniform4uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4uiv@GOTPAGEOFF] +_bluegl_glPointParameterfEXT: + adrp x16, ___blue_glCore_glPointParameterfEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPointParameterfEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPointParameteriNV +.private_extern _bluegl_glPointParameterfvEXT .align 2 -_bluegl_glPointParameteriNV: - adrp x16, ___blue_glCore_glPointParameteriNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPointParameteriNV@GOTPAGEOFF] +_bluegl_glPointParameterfvEXT: + adrp x16, ___blue_glCore_glPointParameterfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPointParameterfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedFramebufferReadBuffer +.private_extern _bluegl_glPolygonOffsetEXT .align 2 -_bluegl_glNamedFramebufferReadBuffer: - adrp x16, ___blue_glCore_glNamedFramebufferReadBuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedFramebufferReadBuffer@GOTPAGEOFF] +_bluegl_glPolygonOffsetEXT: + adrp x16, ___blue_glCore_glPolygonOffsetEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPolygonOffsetEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPatchParameterfv +.private_extern _bluegl_glPolygonOffsetClampEXT .align 2 -_bluegl_glPatchParameterfv: - adrp x16, ___blue_glCore_glPatchParameterfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPatchParameterfv@GOTPAGEOFF] +_bluegl_glPolygonOffsetClampEXT: + adrp x16, ___blue_glCore_glPolygonOffsetClampEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPolygonOffsetClampEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayBindingDivisor +.private_extern _bluegl_glProvokingVertexEXT .align 2 -_bluegl_glVertexArrayBindingDivisor: - adrp x16, ___blue_glCore_glVertexArrayBindingDivisor@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayBindingDivisor@GOTPAGEOFF] +_bluegl_glProvokingVertexEXT: + adrp x16, ___blue_glCore_glProvokingVertexEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProvokingVertexEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDebugMessageEnableAMD +.private_extern _bluegl_glRasterSamplesEXT .align 2 -_bluegl_glDebugMessageEnableAMD: - adrp x16, ___blue_glCore_glDebugMessageEnableAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDebugMessageEnableAMD@GOTPAGEOFF] +_bluegl_glRasterSamplesEXT: + adrp x16, ___blue_glCore_glRasterSamplesEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glRasterSamplesEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexArrayIndexediv +.private_extern _bluegl_glSecondaryColor3bEXT .align 2 -_bluegl_glGetVertexArrayIndexediv: - adrp x16, ___blue_glCore_glGetVertexArrayIndexediv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexArrayIndexediv@GOTPAGEOFF] +_bluegl_glSecondaryColor3bEXT: + adrp x16, ___blue_glCore_glSecondaryColor3bEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3bEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVideoCaptureStreamdvNV +.private_extern _bluegl_glSecondaryColor3bvEXT .align 2 -_bluegl_glGetVideoCaptureStreamdvNV: - adrp x16, ___blue_glCore_glGetVideoCaptureStreamdvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVideoCaptureStreamdvNV@GOTPAGEOFF] +_bluegl_glSecondaryColor3bvEXT: + adrp x16, ___blue_glCore_glSecondaryColor3bvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3bvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glAlphaFragmentOp2ATI +.private_extern _bluegl_glSecondaryColor3dEXT .align 2 -_bluegl_glAlphaFragmentOp2ATI: - adrp x16, ___blue_glCore_glAlphaFragmentOp2ATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glAlphaFragmentOp2ATI@GOTPAGEOFF] +_bluegl_glSecondaryColor3dEXT: + adrp x16, ___blue_glCore_glSecondaryColor3dEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3dEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertex2hNV +.private_extern _bluegl_glSecondaryColor3dvEXT .align 2 -_bluegl_glVertex2hNV: - adrp x16, ___blue_glCore_glVertex2hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertex2hNV@GOTPAGEOFF] +_bluegl_glSecondaryColor3dvEXT: + adrp x16, ___blue_glCore_glSecondaryColor3dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCombinerParameteriNV +.private_extern _bluegl_glSecondaryColor3fEXT .align 2 -_bluegl_glCombinerParameteriNV: - adrp x16, ___blue_glCore_glCombinerParameteriNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCombinerParameteriNV@GOTPAGEOFF] +_bluegl_glSecondaryColor3fEXT: + adrp x16, ___blue_glCore_glSecondaryColor3fEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3fEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedFramebufferAttachmentParameterivEXT +.private_extern _bluegl_glSecondaryColor3fvEXT .align 2 -_bluegl_glGetNamedFramebufferAttachmentParameterivEXT: - adrp x16, ___blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT@GOTPAGEOFF] +_bluegl_glSecondaryColor3fvEXT: + adrp x16, ___blue_glCore_glSecondaryColor3fvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3fvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsVariantEnabledEXT +.private_extern _bluegl_glSecondaryColor3iEXT .align 2 -_bluegl_glIsVariantEnabledEXT: - adrp x16, ___blue_glCore_glIsVariantEnabledEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsVariantEnabledEXT@GOTPAGEOFF] +_bluegl_glSecondaryColor3iEXT: + adrp x16, ___blue_glCore_glSecondaryColor3iEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3iEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribfvNV +.private_extern _bluegl_glSecondaryColor3ivEXT .align 2 -_bluegl_glGetVertexAttribfvNV: - adrp x16, ___blue_glCore_glGetVertexAttribfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribfvNV@GOTPAGEOFF] +_bluegl_glSecondaryColor3ivEXT: + adrp x16, ___blue_glCore_glSecondaryColor3ivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3ivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramPipelineiv +.private_extern _bluegl_glSecondaryColor3sEXT .align 2 -_bluegl_glGetProgramPipelineiv: - adrp x16, ___blue_glCore_glGetProgramPipelineiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramPipelineiv@GOTPAGEOFF] +_bluegl_glSecondaryColor3sEXT: + adrp x16, ___blue_glCore_glSecondaryColor3sEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3sEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUnmapBufferARB +.private_extern _bluegl_glSecondaryColor3svEXT .align 2 -_bluegl_glUnmapBufferARB: - adrp x16, ___blue_glCore_glUnmapBufferARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUnmapBufferARB@GOTPAGEOFF] +_bluegl_glSecondaryColor3svEXT: + adrp x16, ___blue_glCore_glSecondaryColor3svEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3svEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribPointerNV +.private_extern _bluegl_glSecondaryColor3ubEXT .align 2 -_bluegl_glVertexAttribPointerNV: - adrp x16, ___blue_glCore_glVertexAttribPointerNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribPointerNV@GOTPAGEOFF] +_bluegl_glSecondaryColor3ubEXT: + adrp x16, ___blue_glCore_glSecondaryColor3ubEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3ubEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPathSpacingNV +.private_extern _bluegl_glSecondaryColor3ubvEXT .align 2 -_bluegl_glGetPathSpacingNV: - adrp x16, ___blue_glCore_glGetPathSpacingNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPathSpacingNV@GOTPAGEOFF] +_bluegl_glSecondaryColor3ubvEXT: + adrp x16, ___blue_glCore_glSecondaryColor3ubvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3ubvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMaterialxOES +.private_extern _bluegl_glSecondaryColor3uiEXT .align 2 -_bluegl_glMaterialxOES: - adrp x16, ___blue_glCore_glMaterialxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMaterialxOES@GOTPAGEOFF] +_bluegl_glSecondaryColor3uiEXT: + adrp x16, ___blue_glCore_glSecondaryColor3uiEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3uiEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream3fvATI +.private_extern _bluegl_glSecondaryColor3uivEXT .align 2 -_bluegl_glVertexStream3fvATI: - adrp x16, ___blue_glCore_glVertexStream3fvATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream3fvATI@GOTPAGEOFF] +_bluegl_glSecondaryColor3uivEXT: + adrp x16, ___blue_glCore_glSecondaryColor3uivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3uivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream4dATI +.private_extern _bluegl_glSecondaryColor3usEXT .align 2 -_bluegl_glVertexStream4dATI: - adrp x16, ___blue_glCore_glVertexStream4dATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream4dATI@GOTPAGEOFF] +_bluegl_glSecondaryColor3usEXT: + adrp x16, ___blue_glCore_glSecondaryColor3usEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3usEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2d +.private_extern _bluegl_glSecondaryColor3usvEXT .align 2 -_bluegl_glVertexAttrib2d: - adrp x16, ___blue_glCore_glVertexAttrib2d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2d@GOTPAGEOFF] +_bluegl_glSecondaryColor3usvEXT: + adrp x16, ___blue_glCore_glSecondaryColor3usvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3usvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStencilMaskSeparate +.private_extern _bluegl_glSecondaryColorPointerEXT .align 2 -_bluegl_glStencilMaskSeparate: - adrp x16, ___blue_glCore_glStencilMaskSeparate@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStencilMaskSeparate@GOTPAGEOFF] +_bluegl_glSecondaryColorPointerEXT: + adrp x16, ___blue_glCore_glSecondaryColorPointerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColorPointerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTestFenceAPPLE +.private_extern _bluegl_glUseShaderProgramEXT .align 2 -_bluegl_glTestFenceAPPLE: - adrp x16, ___blue_glCore_glTestFenceAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTestFenceAPPLE@GOTPAGEOFF] +_bluegl_glUseShaderProgramEXT: + adrp x16, ___blue_glCore_glUseShaderProgramEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUseShaderProgramEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindMaterialParameterEXT +.private_extern _bluegl_glActiveProgramEXT .align 2 -_bluegl_glBindMaterialParameterEXT: - adrp x16, ___blue_glCore_glBindMaterialParameterEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindMaterialParameterEXT@GOTPAGEOFF] +_bluegl_glActiveProgramEXT: + adrp x16, ___blue_glCore_glActiveProgramEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glActiveProgramEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendEquationEXT +.private_extern _bluegl_glCreateShaderProgramEXT .align 2 -_bluegl_glBlendEquationEXT: - adrp x16, ___blue_glCore_glBlendEquationEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendEquationEXT@GOTPAGEOFF] +_bluegl_glCreateShaderProgramEXT: + adrp x16, ___blue_glCore_glCreateShaderProgramEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreateShaderProgramEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4hNV +.private_extern _bluegl_glBindImageTextureEXT .align 2 -_bluegl_glMultiTexCoord4hNV: - adrp x16, ___blue_glCore_glMultiTexCoord4hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4hNV@GOTPAGEOFF] +_bluegl_glBindImageTextureEXT: + adrp x16, ___blue_glCore_glBindImageTextureEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindImageTextureEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1fARB +.private_extern _bluegl_glMemoryBarrierEXT .align 2 -_bluegl_glMultiTexCoord1fARB: - adrp x16, ___blue_glCore_glMultiTexCoord1fARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1fARB@GOTPAGEOFF] +_bluegl_glMemoryBarrierEXT: + adrp x16, ___blue_glCore_glMemoryBarrierEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMemoryBarrierEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPrioritizeTexturesxOES +.private_extern _bluegl_glStencilClearTagEXT .align 2 -_bluegl_glPrioritizeTexturesxOES: - adrp x16, ___blue_glCore_glPrioritizeTexturesxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPrioritizeTexturesxOES@GOTPAGEOFF] +_bluegl_glStencilClearTagEXT: + adrp x16, ___blue_glCore_glStencilClearTagEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStencilClearTagEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribs1fvNV +.private_extern _bluegl_glActiveStencilFaceEXT .align 2 -_bluegl_glVertexAttribs1fvNV: - adrp x16, ___blue_glCore_glVertexAttribs1fvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribs1fvNV@GOTPAGEOFF] +_bluegl_glActiveStencilFaceEXT: + adrp x16, ___blue_glCore_glActiveStencilFaceEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glActiveStencilFaceEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetInternalformati64v +.private_extern _bluegl_glTexSubImage1DEXT .align 2 -_bluegl_glGetInternalformati64v: - adrp x16, ___blue_glCore_glGetInternalformati64v@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetInternalformati64v@GOTPAGEOFF] +_bluegl_glTexSubImage1DEXT: + adrp x16, ___blue_glCore_glTexSubImage1DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexSubImage1DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDisableVertexAttribAPPLE +.private_extern _bluegl_glTexSubImage2DEXT .align 2 -_bluegl_glDisableVertexAttribAPPLE: - adrp x16, ___blue_glCore_glDisableVertexAttribAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDisableVertexAttribAPPLE@GOTPAGEOFF] +_bluegl_glTexSubImage2DEXT: + adrp x16, ___blue_glCore_glTexSubImage2DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexSubImage2DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream3sATI +.private_extern _bluegl_glTexImage3DEXT .align 2 -_bluegl_glVertexStream3sATI: - adrp x16, ___blue_glCore_glVertexStream3sATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream3sATI@GOTPAGEOFF] +_bluegl_glTexImage3DEXT: + adrp x16, ___blue_glCore_glTexImage3DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexImage3DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCheckFramebufferStatusEXT +.private_extern _bluegl_glTexSubImage3DEXT .align 2 -_bluegl_glCheckFramebufferStatusEXT: - adrp x16, ___blue_glCore_glCheckFramebufferStatusEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCheckFramebufferStatusEXT@GOTPAGEOFF] +_bluegl_glTexSubImage3DEXT: + adrp x16, ___blue_glCore_glTexSubImage3DEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexSubImage3DEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMinmax +.private_extern _bluegl_glFramebufferTextureLayerEXT .align 2 -_bluegl_glGetMinmax: - adrp x16, ___blue_glCore_glGetMinmax@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMinmax@GOTPAGEOFF] +_bluegl_glFramebufferTextureLayerEXT: + adrp x16, ___blue_glCore_glFramebufferTextureLayerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferTextureLayerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyTexSubImage3DEXT +.private_extern _bluegl_glTexBufferEXT .align 2 -_bluegl_glCopyTexSubImage3DEXT: - adrp x16, ___blue_glCore_glCopyTexSubImage3DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyTexSubImage3DEXT@GOTPAGEOFF] +_bluegl_glTexBufferEXT: + adrp x16, ___blue_glCore_glTexBufferEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexBufferEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1ivARB +.private_extern _bluegl_glTexParameterIivEXT .align 2 -_bluegl_glUniform1ivARB: - adrp x16, ___blue_glCore_glUniform1ivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1ivARB@GOTPAGEOFF] +_bluegl_glTexParameterIivEXT: + adrp x16, ___blue_glCore_glTexParameterIivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexParameterIivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorP4uiv +.private_extern _bluegl_glTexParameterIuivEXT .align 2 -_bluegl_glColorP4uiv: - adrp x16, ___blue_glCore_glColorP4uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorP4uiv@GOTPAGEOFF] +_bluegl_glTexParameterIuivEXT: + adrp x16, ___blue_glCore_glTexParameterIuivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexParameterIuivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDisableVertexAttribArrayARB +.private_extern _bluegl_glGetTexParameterIivEXT .align 2 -_bluegl_glDisableVertexAttribArrayARB: - adrp x16, ___blue_glCore_glDisableVertexAttribArrayARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDisableVertexAttribArrayARB@GOTPAGEOFF] +_bluegl_glGetTexParameterIivEXT: + adrp x16, ___blue_glCore_glGetTexParameterIivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTexParameterIivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedProgramLocalParameter4fvEXT +.private_extern _bluegl_glGetTexParameterIuivEXT .align 2 -_bluegl_glNamedProgramLocalParameter4fvEXT: - adrp x16, ___blue_glCore_glNamedProgramLocalParameter4fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParameter4fvEXT@GOTPAGEOFF] +_bluegl_glGetTexParameterIuivEXT: + adrp x16, ___blue_glCore_glGetTexParameterIuivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTexParameterIuivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendFuncSeparateEXT +.private_extern _bluegl_glClearColorIiEXT .align 2 -_bluegl_glBlendFuncSeparateEXT: - adrp x16, ___blue_glCore_glBlendFuncSeparateEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendFuncSeparateEXT@GOTPAGEOFF] +_bluegl_glClearColorIiEXT: + adrp x16, ___blue_glCore_glClearColorIiEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearColorIiEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL3i64NV +.private_extern _bluegl_glClearColorIuiEXT .align 2 -_bluegl_glVertexAttribL3i64NV: - adrp x16, ___blue_glCore_glVertexAttribL3i64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL3i64NV@GOTPAGEOFF] +_bluegl_glClearColorIuiEXT: + adrp x16, ___blue_glCore_glClearColorIuiEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearColorIuiEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindProgramPipeline +.private_extern _bluegl_glAreTexturesResidentEXT .align 2 -_bluegl_glBindProgramPipeline: - adrp x16, ___blue_glCore_glBindProgramPipeline@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindProgramPipeline@GOTPAGEOFF] +_bluegl_glAreTexturesResidentEXT: + adrp x16, ___blue_glCore_glAreTexturesResidentEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glAreTexturesResidentEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreateProgramPipelines +.private_extern _bluegl_glBindTextureEXT .align 2 -_bluegl_glCreateProgramPipelines: - adrp x16, ___blue_glCore_glCreateProgramPipelines@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreateProgramPipelines@GOTPAGEOFF] +_bluegl_glBindTextureEXT: + adrp x16, ___blue_glCore_glBindTextureEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindTextureEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteRenderbuffersEXT +.private_extern _bluegl_glDeleteTexturesEXT .align 2 -_bluegl_glDeleteRenderbuffersEXT: - adrp x16, ___blue_glCore_glDeleteRenderbuffersEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteRenderbuffersEXT@GOTPAGEOFF] +_bluegl_glDeleteTexturesEXT: + adrp x16, ___blue_glCore_glDeleteTexturesEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteTexturesEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEdgeFlagFormatNV +.private_extern _bluegl_glGenTexturesEXT .align 2 -_bluegl_glEdgeFlagFormatNV: - adrp x16, ___blue_glCore_glEdgeFlagFormatNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEdgeFlagFormatNV@GOTPAGEOFF] +_bluegl_glGenTexturesEXT: + adrp x16, ___blue_glCore_glGenTexturesEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenTexturesEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetActiveUniformBlockiv +.private_extern _bluegl_glIsTextureEXT .align 2 -_bluegl_glGetActiveUniformBlockiv: - adrp x16, ___blue_glCore_glGetActiveUniformBlockiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetActiveUniformBlockiv@GOTPAGEOFF] +_bluegl_glIsTextureEXT: + adrp x16, ___blue_glCore_glIsTextureEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsTextureEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3f +.private_extern _bluegl_glPrioritizeTexturesEXT .align 2 -_bluegl_glProgramUniform3f: - adrp x16, ___blue_glCore_glProgramUniform3f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3f@GOTPAGEOFF] +_bluegl_glPrioritizeTexturesEXT: + adrp x16, ___blue_glCore_glPrioritizeTexturesEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPrioritizeTexturesEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawCommandsStatesAddressNV +.private_extern _bluegl_glTextureNormalEXT .align 2 -_bluegl_glDrawCommandsStatesAddressNV: - adrp x16, ___blue_glCore_glDrawCommandsStatesAddressNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawCommandsStatesAddressNV@GOTPAGEOFF] +_bluegl_glTextureNormalEXT: + adrp x16, ___blue_glCore_glTextureNormalEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureNormalEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribfv +.private_extern _bluegl_glGetQueryObjecti64vEXT .align 2 -_bluegl_glGetVertexAttribfv: - adrp x16, ___blue_glCore_glGetVertexAttribfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribfv@GOTPAGEOFF] +_bluegl_glGetQueryObjecti64vEXT: + adrp x16, ___blue_glCore_glGetQueryObjecti64vEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetQueryObjecti64vEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVariantArrayObjectivATI +.private_extern _bluegl_glGetQueryObjectui64vEXT .align 2 -_bluegl_glGetVariantArrayObjectivATI: - adrp x16, ___blue_glCore_glGetVariantArrayObjectivATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVariantArrayObjectivATI@GOTPAGEOFF] +_bluegl_glGetQueryObjectui64vEXT: + adrp x16, ___blue_glCore_glGetQueryObjectui64vEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetQueryObjectui64vEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedProgramLocalParameter4dEXT +.private_extern _bluegl_glBeginTransformFeedbackEXT .align 2 -_bluegl_glNamedProgramLocalParameter4dEXT: - adrp x16, ___blue_glCore_glNamedProgramLocalParameter4dEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParameter4dEXT@GOTPAGEOFF] +_bluegl_glBeginTransformFeedbackEXT: + adrp x16, ___blue_glCore_glBeginTransformFeedbackEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBeginTransformFeedbackEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenTransformFeedbacksNV +.private_extern _bluegl_glEndTransformFeedbackEXT .align 2 -_bluegl_glGenTransformFeedbacksNV: - adrp x16, ___blue_glCore_glGenTransformFeedbacksNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenTransformFeedbacksNV@GOTPAGEOFF] +_bluegl_glEndTransformFeedbackEXT: + adrp x16, ___blue_glCore_glEndTransformFeedbackEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEndTransformFeedbackEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawElementArrayAPPLE +.private_extern _bluegl_glBindBufferRangeEXT .align 2 -_bluegl_glDrawElementArrayAPPLE: - adrp x16, ___blue_glCore_glDrawElementArrayAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawElementArrayAPPLE@GOTPAGEOFF] +_bluegl_glBindBufferRangeEXT: + adrp x16, ___blue_glCore_glBindBufferRangeEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindBufferRangeEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4NusvARB +.private_extern _bluegl_glBindBufferOffsetEXT .align 2 -_bluegl_glVertexAttrib4NusvARB: - adrp x16, ___blue_glCore_glVertexAttrib4NusvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4NusvARB@GOTPAGEOFF] +_bluegl_glBindBufferOffsetEXT: + adrp x16, ___blue_glCore_glBindBufferOffsetEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindBufferOffsetEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindRenderbufferEXT +.private_extern _bluegl_glBindBufferBaseEXT .align 2 -_bluegl_glBindRenderbufferEXT: - adrp x16, ___blue_glCore_glBindRenderbufferEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindRenderbufferEXT@GOTPAGEOFF] +_bluegl_glBindBufferBaseEXT: + adrp x16, ___blue_glCore_glBindBufferBaseEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindBufferBaseEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUnmapTexture2DINTEL +.private_extern _bluegl_glTransformFeedbackVaryingsEXT .align 2 -_bluegl_glUnmapTexture2DINTEL: - adrp x16, ___blue_glCore_glUnmapTexture2DINTEL@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUnmapTexture2DINTEL@GOTPAGEOFF] +_bluegl_glTransformFeedbackVaryingsEXT: + adrp x16, ___blue_glCore_glTransformFeedbackVaryingsEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTransformFeedbackVaryingsEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramEnvParameterfvARB +.private_extern _bluegl_glGetTransformFeedbackVaryingEXT .align 2 -_bluegl_glGetProgramEnvParameterfvARB: - adrp x16, ___blue_glCore_glGetProgramEnvParameterfvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramEnvParameterfvARB@GOTPAGEOFF] +_bluegl_glGetTransformFeedbackVaryingEXT: + adrp x16, ___blue_glCore_glGetTransformFeedbackVaryingEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTransformFeedbackVaryingEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4f +.private_extern _bluegl_glArrayElementEXT .align 2 -_bluegl_glVertexAttrib4f: - adrp x16, ___blue_glCore_glVertexAttrib4f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4f@GOTPAGEOFF] +_bluegl_glArrayElementEXT: + adrp x16, ___blue_glCore_glArrayElementEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glArrayElementEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnPixelMapfv +.private_extern _bluegl_glColorPointerEXT .align 2 -_bluegl_glGetnPixelMapfv: - adrp x16, ___blue_glCore_glGetnPixelMapfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnPixelMapfv@GOTPAGEOFF] +_bluegl_glColorPointerEXT: + adrp x16, ___blue_glCore_glColorPointerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorPointerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3dv +.private_extern _bluegl_glDrawArraysEXT .align 2 -_bluegl_glVertexAttrib3dv: - adrp x16, ___blue_glCore_glVertexAttrib3dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3dv@GOTPAGEOFF] +_bluegl_glDrawArraysEXT: + adrp x16, ___blue_glCore_glDrawArraysEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawArraysEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFlushMappedBufferRange +.private_extern _bluegl_glEdgeFlagPointerEXT .align 2 -_bluegl_glFlushMappedBufferRange: - adrp x16, ___blue_glCore_glFlushMappedBufferRange@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFlushMappedBufferRange@GOTPAGEOFF] +_bluegl_glEdgeFlagPointerEXT: + adrp x16, ___blue_glCore_glEdgeFlagPointerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEdgeFlagPointerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3ub +.private_extern _bluegl_glGetPointervEXT .align 2 -_bluegl_glSecondaryColor3ub: - adrp x16, ___blue_glCore_glSecondaryColor3ub@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3ub@GOTPAGEOFF] +_bluegl_glGetPointervEXT: + adrp x16, ___blue_glCore_glGetPointervEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPointervEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPerfQueryDataINTEL +.private_extern _bluegl_glIndexPointerEXT .align 2 -_bluegl_glGetPerfQueryDataINTEL: - adrp x16, ___blue_glCore_glGetPerfQueryDataINTEL@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPerfQueryDataINTEL@GOTPAGEOFF] +_bluegl_glIndexPointerEXT: + adrp x16, ___blue_glCore_glIndexPointerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIndexPointerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnMapivARB +.private_extern _bluegl_glNormalPointerEXT .align 2 -_bluegl_glGetnMapivARB: - adrp x16, ___blue_glCore_glGetnMapivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnMapivARB@GOTPAGEOFF] +_bluegl_glNormalPointerEXT: + adrp x16, ___blue_glCore_glNormalPointerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormalPointerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSeparableFilter2DEXT +.private_extern _bluegl_glTexCoordPointerEXT .align 2 -_bluegl_glSeparableFilter2DEXT: - adrp x16, ___blue_glCore_glSeparableFilter2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSeparableFilter2DEXT@GOTPAGEOFF] +_bluegl_glTexCoordPointerEXT: + adrp x16, ___blue_glCore_glTexCoordPointerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoordPointerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix3x2fvEXT +.private_extern _bluegl_glVertexPointerEXT .align 2 -_bluegl_glProgramUniformMatrix3x2fvEXT: - adrp x16, ___blue_glCore_glProgramUniformMatrix3x2fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3x2fvEXT@GOTPAGEOFF] +_bluegl_glVertexPointerEXT: + adrp x16, ___blue_glCore_glVertexPointerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexPointerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenVertexArrays +.private_extern _bluegl_glVertexAttribL1dEXT .align 2 -_bluegl_glGenVertexArrays: - adrp x16, ___blue_glCore_glGenVertexArrays@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenVertexArrays@GOTPAGEOFF] +_bluegl_glVertexAttribL1dEXT: + adrp x16, ___blue_glCore_glVertexAttribL1dEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL1dEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEndQueryARB +.private_extern _bluegl_glVertexAttribL2dEXT .align 2 -_bluegl_glEndQueryARB: - adrp x16, ___blue_glCore_glEndQueryARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEndQueryARB@GOTPAGEOFF] +_bluegl_glVertexAttribL2dEXT: + adrp x16, ___blue_glCore_glVertexAttribL2dEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL2dEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2fv +.private_extern _bluegl_glVertexAttribL3dEXT .align 2 -_bluegl_glVertexAttrib2fv: - adrp x16, ___blue_glCore_glVertexAttrib2fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2fv@GOTPAGEOFF] +_bluegl_glVertexAttribL3dEXT: + adrp x16, ___blue_glCore_glVertexAttribL3dEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL3dEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2fv +.private_extern _bluegl_glVertexAttribL4dEXT .align 2 -_bluegl_glWindowPos2fv: - adrp x16, ___blue_glCore_glWindowPos2fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2fv@GOTPAGEOFF] +_bluegl_glVertexAttribL4dEXT: + adrp x16, ___blue_glCore_glVertexAttribL4dEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL4dEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyConvolutionFilter1D +.private_extern _bluegl_glVertexAttribL1dvEXT .align 2 -_bluegl_glCopyConvolutionFilter1D: - adrp x16, ___blue_glCore_glCopyConvolutionFilter1D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyConvolutionFilter1D@GOTPAGEOFF] +_bluegl_glVertexAttribL1dvEXT: + adrp x16, ___blue_glCore_glVertexAttribL1dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL1dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoordFormatNV +.private_extern _bluegl_glVertexAttribL2dvEXT .align 2 -_bluegl_glTexCoordFormatNV: - adrp x16, ___blue_glCore_glTexCoordFormatNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoordFormatNV@GOTPAGEOFF] +_bluegl_glVertexAttribL2dvEXT: + adrp x16, ___blue_glCore_glVertexAttribL2dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL2dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoordP2uiv +.private_extern _bluegl_glVertexAttribL3dvEXT .align 2 -_bluegl_glMultiTexCoordP2uiv: - adrp x16, ___blue_glCore_glMultiTexCoordP2uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoordP2uiv@GOTPAGEOFF] +_bluegl_glVertexAttribL3dvEXT: + adrp x16, ___blue_glCore_glVertexAttribL3dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL3dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1ui64vARB +.private_extern _bluegl_glVertexAttribL4dvEXT .align 2 -_bluegl_glProgramUniform1ui64vARB: - adrp x16, ___blue_glCore_glProgramUniform1ui64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1ui64vARB@GOTPAGEOFF] +_bluegl_glVertexAttribL4dvEXT: + adrp x16, ___blue_glCore_glVertexAttribL4dvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL4dvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorSubTable +.private_extern _bluegl_glVertexAttribLPointerEXT .align 2 -_bluegl_glColorSubTable: - adrp x16, ___blue_glCore_glColorSubTable@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorSubTable@GOTPAGEOFF] +_bluegl_glVertexAttribLPointerEXT: + adrp x16, ___blue_glCore_glVertexAttribLPointerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribLPointerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedBufferSubData +.private_extern _bluegl_glGetVertexAttribLdvEXT .align 2 -_bluegl_glNamedBufferSubData: - adrp x16, ___blue_glCore_glNamedBufferSubData@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedBufferSubData@GOTPAGEOFF] +_bluegl_glGetVertexAttribLdvEXT: + adrp x16, ___blue_glCore_glGetVertexAttribLdvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribLdvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetCompressedTextureImage +.private_extern _bluegl_glBeginVertexShaderEXT .align 2 -_bluegl_glGetCompressedTextureImage: - adrp x16, ___blue_glCore_glGetCompressedTextureImage@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetCompressedTextureImage@GOTPAGEOFF] +_bluegl_glBeginVertexShaderEXT: + adrp x16, ___blue_glCore_glBeginVertexShaderEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBeginVertexShaderEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedCopyBufferSubDataEXT +.private_extern _bluegl_glEndVertexShaderEXT .align 2 -_bluegl_glNamedCopyBufferSubDataEXT: - adrp x16, ___blue_glCore_glNamedCopyBufferSubDataEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedCopyBufferSubDataEXT@GOTPAGEOFF] +_bluegl_glEndVertexShaderEXT: + adrp x16, ___blue_glCore_glEndVertexShaderEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEndVertexShaderEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL1i64NV +.private_extern _bluegl_glBindVertexShaderEXT .align 2 -_bluegl_glVertexAttribL1i64NV: - adrp x16, ___blue_glCore_glVertexAttribL1i64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL1i64NV@GOTPAGEOFF] +_bluegl_glBindVertexShaderEXT: + adrp x16, ___blue_glCore_glBindVertexShaderEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindVertexShaderEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayMultiTexCoordOffsetEXT +.private_extern _bluegl_glGenVertexShadersEXT .align 2 -_bluegl_glVertexArrayMultiTexCoordOffsetEXT: - adrp x16, ___blue_glCore_glVertexArrayMultiTexCoordOffsetEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayMultiTexCoordOffsetEXT@GOTPAGEOFF] +_bluegl_glGenVertexShadersEXT: + adrp x16, ___blue_glCore_glGenVertexShadersEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenVertexShadersEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetUniformIndices +.private_extern _bluegl_glDeleteVertexShaderEXT .align 2 -_bluegl_glGetUniformIndices: - adrp x16, ___blue_glCore_glGetUniformIndices@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetUniformIndices@GOTPAGEOFF] +_bluegl_glDeleteVertexShaderEXT: + adrp x16, ___blue_glCore_glDeleteVertexShaderEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteVertexShaderEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawArraysInstancedARB +.private_extern _bluegl_glShaderOp1EXT .align 2 -_bluegl_glDrawArraysInstancedARB: - adrp x16, ___blue_glCore_glDrawArraysInstancedARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawArraysInstancedARB@GOTPAGEOFF] +_bluegl_glShaderOp1EXT: + adrp x16, ___blue_glCore_glShaderOp1EXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glShaderOp1EXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMultiTexGenivEXT +.private_extern _bluegl_glShaderOp2EXT .align 2 -_bluegl_glGetMultiTexGenivEXT: - adrp x16, ___blue_glCore_glGetMultiTexGenivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMultiTexGenivEXT@GOTPAGEOFF] +_bluegl_glShaderOp2EXT: + adrp x16, ___blue_glCore_glShaderOp2EXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glShaderOp2EXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexArrayPointervEXT +.private_extern _bluegl_glShaderOp3EXT .align 2 -_bluegl_glGetVertexArrayPointervEXT: - adrp x16, ___blue_glCore_glGetVertexArrayPointervEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexArrayPointervEXT@GOTPAGEOFF] +_bluegl_glShaderOp3EXT: + adrp x16, ___blue_glCore_glShaderOp3EXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glShaderOp3EXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBeginQuery +.private_extern _bluegl_glSwizzleEXT .align 2 -_bluegl_glBeginQuery: - adrp x16, ___blue_glCore_glBeginQuery@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBeginQuery@GOTPAGEOFF] +_bluegl_glSwizzleEXT: + adrp x16, ___blue_glCore_glSwizzleEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSwizzleEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDetachObjectARB +.private_extern _bluegl_glWriteMaskEXT .align 2 -_bluegl_glDetachObjectARB: - adrp x16, ___blue_glCore_glDetachObjectARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDetachObjectARB@GOTPAGEOFF] +_bluegl_glWriteMaskEXT: + adrp x16, ___blue_glCore_glWriteMaskEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWriteMaskEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4iv +.private_extern _bluegl_glInsertComponentEXT .align 2 -_bluegl_glUniform4iv: - adrp x16, ___blue_glCore_glUniform4iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4iv@GOTPAGEOFF] +_bluegl_glInsertComponentEXT: + adrp x16, ___blue_glCore_glInsertComponentEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glInsertComponentEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetQueryObjectuiv +.private_extern _bluegl_glExtractComponentEXT .align 2 -_bluegl_glGetQueryObjectuiv: - adrp x16, ___blue_glCore_glGetQueryObjectuiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetQueryObjectuiv@GOTPAGEOFF] +_bluegl_glExtractComponentEXT: + adrp x16, ___blue_glCore_glExtractComponentEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glExtractComponentEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetObjectBufferivATI +.private_extern _bluegl_glGenSymbolsEXT .align 2 -_bluegl_glGetObjectBufferivATI: - adrp x16, ___blue_glCore_glGetObjectBufferivATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetObjectBufferivATI@GOTPAGEOFF] +_bluegl_glGenSymbolsEXT: + adrp x16, ___blue_glCore_glGenSymbolsEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenSymbolsEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreateTransformFeedbacks +.private_extern _bluegl_glSetInvariantEXT .align 2 -_bluegl_glCreateTransformFeedbacks: - adrp x16, ___blue_glCore_glCreateTransformFeedbacks@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreateTransformFeedbacks@GOTPAGEOFF] +_bluegl_glSetInvariantEXT: + adrp x16, ___blue_glCore_glSetInvariantEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSetInvariantEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream3dATI +.private_extern _bluegl_glSetLocalConstantEXT .align 2 -_bluegl_glVertexStream3dATI: - adrp x16, ___blue_glCore_glVertexStream3dATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream3dATI@GOTPAGEOFF] +_bluegl_glSetLocalConstantEXT: + adrp x16, ___blue_glCore_glSetLocalConstantEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSetLocalConstantEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEvalMapsNV +.private_extern _bluegl_glVariantbvEXT .align 2 -_bluegl_glEvalMapsNV: - adrp x16, ___blue_glCore_glEvalMapsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEvalMapsNV@GOTPAGEOFF] +_bluegl_glVariantbvEXT: + adrp x16, ___blue_glCore_glVariantbvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVariantbvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsNameAMD +.private_extern _bluegl_glVariantsvEXT .align 2 -_bluegl_glIsNameAMD: - adrp x16, ___blue_glCore_glIsNameAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsNameAMD@GOTPAGEOFF] +_bluegl_glVariantsvEXT: + adrp x16, ___blue_glCore_glVariantsvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVariantsvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4ivARB +.private_extern _bluegl_glVariantivEXT .align 2 -_bluegl_glVertexAttrib4ivARB: - adrp x16, ___blue_glCore_glVertexAttrib4ivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4ivARB@GOTPAGEOFF] +_bluegl_glVariantivEXT: + adrp x16, ___blue_glCore_glVariantivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVariantivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramSubroutineParameteruivNV +.private_extern _bluegl_glVariantfvEXT .align 2 -_bluegl_glGetProgramSubroutineParameteruivNV: - adrp x16, ___blue_glCore_glGetProgramSubroutineParameteruivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramSubroutineParameteruivNV@GOTPAGEOFF] +_bluegl_glVariantfvEXT: + adrp x16, ___blue_glCore_glVariantfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVariantfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix2x4dv +.private_extern _bluegl_glVariantdvEXT .align 2 -_bluegl_glProgramUniformMatrix2x4dv: - adrp x16, ___blue_glCore_glProgramUniformMatrix2x4dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2x4dv@GOTPAGEOFF] +_bluegl_glVariantdvEXT: + adrp x16, ___blue_glCore_glVariantdvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVariantdvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBeginPerfQueryINTEL +.private_extern _bluegl_glVariantubvEXT .align 2 -_bluegl_glBeginPerfQueryINTEL: - adrp x16, ___blue_glCore_glBeginPerfQueryINTEL@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBeginPerfQueryINTEL@GOTPAGEOFF] +_bluegl_glVariantubvEXT: + adrp x16, ___blue_glCore_glVariantubvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVariantubvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathParameteriNV +.private_extern _bluegl_glVariantusvEXT .align 2 -_bluegl_glPathParameteriNV: - adrp x16, ___blue_glCore_glPathParameteriNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathParameteriNV@GOTPAGEOFF] +_bluegl_glVariantusvEXT: + adrp x16, ___blue_glCore_glVariantusvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVariantusvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4i64vNV +.private_extern _bluegl_glVariantuivEXT .align 2 -_bluegl_glUniform4i64vNV: - adrp x16, ___blue_glCore_glUniform4i64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4i64vNV@GOTPAGEOFF] +_bluegl_glVariantuivEXT: + adrp x16, ___blue_glCore_glVariantuivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVariantuivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStateCaptureNV +.private_extern _bluegl_glVariantPointerEXT .align 2 -_bluegl_glStateCaptureNV: - adrp x16, ___blue_glCore_glStateCaptureNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStateCaptureNV@GOTPAGEOFF] +_bluegl_glVariantPointerEXT: + adrp x16, ___blue_glCore_glVariantPointerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVariantPointerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3fvEXT +.private_extern _bluegl_glEnableVariantClientStateEXT .align 2 -_bluegl_glProgramUniform3fvEXT: - adrp x16, ___blue_glCore_glProgramUniform3fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3fvEXT@GOTPAGEOFF] +_bluegl_glEnableVariantClientStateEXT: + adrp x16, ___blue_glCore_glEnableVariantClientStateEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEnableVariantClientStateEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL1d +.private_extern _bluegl_glDisableVariantClientStateEXT .align 2 -_bluegl_glVertexAttribL1d: - adrp x16, ___blue_glCore_glVertexAttribL1d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL1d@GOTPAGEOFF] +_bluegl_glDisableVariantClientStateEXT: + adrp x16, ___blue_glCore_glDisableVariantClientStateEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDisableVariantClientStateEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixLoadIdentityEXT +.private_extern _bluegl_glBindLightParameterEXT .align 2 -_bluegl_glMatrixLoadIdentityEXT: - adrp x16, ___blue_glCore_glMatrixLoadIdentityEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixLoadIdentityEXT@GOTPAGEOFF] +_bluegl_glBindLightParameterEXT: + adrp x16, ___blue_glCore_glBindLightParameterEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindLightParameterEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindVertexArrayAPPLE +.private_extern _bluegl_glBindMaterialParameterEXT .align 2 -_bluegl_glBindVertexArrayAPPLE: - adrp x16, ___blue_glCore_glBindVertexArrayAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindVertexArrayAPPLE@GOTPAGEOFF] +_bluegl_glBindMaterialParameterEXT: + adrp x16, ___blue_glCore_glBindMaterialParameterEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindMaterialParameterEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glRasterPos2xvOES +.private_extern _bluegl_glBindTexGenParameterEXT .align 2 -_bluegl_glRasterPos2xvOES: - adrp x16, ___blue_glCore_glRasterPos2xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glRasterPos2xvOES@GOTPAGEOFF] +_bluegl_glBindTexGenParameterEXT: + adrp x16, ___blue_glCore_glBindTexGenParameterEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindTexGenParameterEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCommandListSegmentsNV +.private_extern _bluegl_glBindTextureUnitParameterEXT .align 2 -_bluegl_glCommandListSegmentsNV: - adrp x16, ___blue_glCore_glCommandListSegmentsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCommandListSegmentsNV@GOTPAGEOFF] +_bluegl_glBindTextureUnitParameterEXT: + adrp x16, ___blue_glCore_glBindTextureUnitParameterEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindTextureUnitParameterEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos4svMESA +.private_extern _bluegl_glBindParameterEXT .align 2 -_bluegl_glWindowPos4svMESA: - adrp x16, ___blue_glCore_glWindowPos4svMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos4svMESA@GOTPAGEOFF] +_bluegl_glBindParameterEXT: + adrp x16, ___blue_glCore_glBindParameterEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindParameterEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramLocalParameter4dvARB +.private_extern _bluegl_glIsVariantEnabledEXT .align 2 -_bluegl_glProgramLocalParameter4dvARB: - adrp x16, ___blue_glCore_glProgramLocalParameter4dvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramLocalParameter4dvARB@GOTPAGEOFF] +_bluegl_glIsVariantEnabledEXT: + adrp x16, ___blue_glCore_glIsVariantEnabledEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsVariantEnabledEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnPolygonStipple +.private_extern _bluegl_glGetVariantBooleanvEXT .align 2 -_bluegl_glGetnPolygonStipple: - adrp x16, ___blue_glCore_glGetnPolygonStipple@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnPolygonStipple@GOTPAGEOFF] +_bluegl_glGetVariantBooleanvEXT: + adrp x16, ___blue_glCore_glGetVariantBooleanvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVariantBooleanvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1svARB +.private_extern _bluegl_glGetVariantIntegervEXT .align 2 -_bluegl_glMultiTexCoord1svARB: - adrp x16, ___blue_glCore_glMultiTexCoord1svARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1svARB@GOTPAGEOFF] +_bluegl_glGetVariantIntegervEXT: + adrp x16, ___blue_glCore_glGetVariantIntegervEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVariantIntegervEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedRenderbufferStorage +.private_extern _bluegl_glGetVariantFloatvEXT .align 2 -_bluegl_glNamedRenderbufferStorage: - adrp x16, ___blue_glCore_glNamedRenderbufferStorage@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedRenderbufferStorage@GOTPAGEOFF] +_bluegl_glGetVariantFloatvEXT: + adrp x16, ___blue_glCore_glGetVariantFloatvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVariantFloatvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramEnvParameterI4iNV +.private_extern _bluegl_glGetVariantPointervEXT .align 2 -_bluegl_glProgramEnvParameterI4iNV: - adrp x16, ___blue_glCore_glProgramEnvParameterI4iNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramEnvParameterI4iNV@GOTPAGEOFF] +_bluegl_glGetVariantPointervEXT: + adrp x16, ___blue_glCore_glGetVariantPointervEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVariantPointervEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribIFormat +.private_extern _bluegl_glGetInvariantBooleanvEXT .align 2 -_bluegl_glVertexAttribIFormat: - adrp x16, ___blue_glCore_glVertexAttribIFormat@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribIFormat@GOTPAGEOFF] +_bluegl_glGetInvariantBooleanvEXT: + adrp x16, ___blue_glCore_glGetInvariantBooleanvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetInvariantBooleanvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFogCoordfvEXT +.private_extern _bluegl_glGetInvariantIntegervEXT .align 2 -_bluegl_glFogCoordfvEXT: - adrp x16, ___blue_glCore_glFogCoordfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFogCoordfvEXT@GOTPAGEOFF] +_bluegl_glGetInvariantIntegervEXT: + adrp x16, ___blue_glCore_glGetInvariantIntegervEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetInvariantIntegervEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEnableVertexAttribArray +.private_extern _bluegl_glGetInvariantFloatvEXT .align 2 -_bluegl_glEnableVertexAttribArray: - adrp x16, ___blue_glCore_glEnableVertexAttribArray@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEnableVertexAttribArray@GOTPAGEOFF] +_bluegl_glGetInvariantFloatvEXT: + adrp x16, ___blue_glCore_glGetInvariantFloatvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetInvariantFloatvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPolygonOffsetClampEXT +.private_extern _bluegl_glGetLocalConstantBooleanvEXT .align 2 -_bluegl_glPolygonOffsetClampEXT: - adrp x16, ___blue_glCore_glPolygonOffsetClampEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPolygonOffsetClampEXT@GOTPAGEOFF] +_bluegl_glGetLocalConstantBooleanvEXT: + adrp x16, ___blue_glCore_glGetLocalConstantBooleanvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetLocalConstantBooleanvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEnable +.private_extern _bluegl_glGetLocalConstantIntegervEXT .align 2 -_bluegl_glEnable: - adrp x16, ___blue_glCore_glEnable@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEnable@GOTPAGEOFF] +_bluegl_glGetLocalConstantIntegervEXT: + adrp x16, ___blue_glCore_glGetLocalConstantIntegervEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetLocalConstantIntegervEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIndexFuncEXT +.private_extern _bluegl_glGetLocalConstantFloatvEXT .align 2 -_bluegl_glIndexFuncEXT: - adrp x16, ___blue_glCore_glIndexFuncEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIndexFuncEXT@GOTPAGEOFF] +_bluegl_glGetLocalConstantFloatvEXT: + adrp x16, ___blue_glCore_glGetLocalConstantFloatvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetLocalConstantFloatvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDepthRangeArrayv +.private_extern _bluegl_glVertexWeightfEXT .align 2 -_bluegl_glDepthRangeArrayv: - adrp x16, ___blue_glCore_glDepthRangeArrayv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDepthRangeArrayv@GOTPAGEOFF] +_bluegl_glVertexWeightfEXT: + adrp x16, ___blue_glCore_glVertexWeightfEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexWeightfEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glRasterPos4xvOES +.private_extern _bluegl_glVertexWeightfvEXT .align 2 -_bluegl_glRasterPos4xvOES: - adrp x16, ___blue_glCore_glRasterPos4xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glRasterPos4xvOES@GOTPAGEOFF] +_bluegl_glVertexWeightfvEXT: + adrp x16, ___blue_glCore_glVertexWeightfvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexWeightfvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSpriteParameterfvSGIX +.private_extern _bluegl_glVertexWeightPointerEXT .align 2 -_bluegl_glSpriteParameterfvSGIX: - adrp x16, ___blue_glCore_glSpriteParameterfvSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSpriteParameterfvSGIX@GOTPAGEOFF] +_bluegl_glVertexWeightPointerEXT: + adrp x16, ___blue_glCore_glVertexWeightPointerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexWeightPointerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnUniformdv +.private_extern _bluegl_glImportSyncEXT .align 2 -_bluegl_glGetnUniformdv: - adrp x16, ___blue_glCore_glGetnUniformdv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnUniformdv@GOTPAGEOFF] +_bluegl_glImportSyncEXT: + adrp x16, ___blue_glCore_glImportSyncEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glImportSyncEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetHistogram +.private_extern _bluegl_glFrameTerminatorGREMEDY .align 2 -_bluegl_glGetHistogram: - adrp x16, ___blue_glCore_glGetHistogram@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetHistogram@GOTPAGEOFF] +_bluegl_glFrameTerminatorGREMEDY: + adrp x16, ___blue_glCore_glFrameTerminatorGREMEDY@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFrameTerminatorGREMEDY@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearColorIiEXT +.private_extern _bluegl_glStringMarkerGREMEDY .align 2 -_bluegl_glClearColorIiEXT: - adrp x16, ___blue_glCore_glClearColorIiEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearColorIiEXT@GOTPAGEOFF] +_bluegl_glStringMarkerGREMEDY: + adrp x16, ___blue_glCore_glStringMarkerGREMEDY@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStringMarkerGREMEDY@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTbufferMask3DFX +.private_extern _bluegl_glImageTransformParameteriHP .align 2 -_bluegl_glTbufferMask3DFX: - adrp x16, ___blue_glCore_glTbufferMask3DFX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTbufferMask3DFX@GOTPAGEOFF] +_bluegl_glImageTransformParameteriHP: + adrp x16, ___blue_glCore_glImageTransformParameteriHP@GOTPAGE + ldr x16, [x16, ___blue_glCore_glImageTransformParameteriHP@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1f +.private_extern _bluegl_glImageTransformParameterfHP .align 2 -_bluegl_glProgramUniform1f: - adrp x16, ___blue_glCore_glProgramUniform1f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1f@GOTPAGEOFF] +_bluegl_glImageTransformParameterfHP: + adrp x16, ___blue_glCore_glImageTransformParameterfHP@GOTPAGE + ldr x16, [x16, ___blue_glCore_glImageTransformParameterfHP@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4Niv +.private_extern _bluegl_glImageTransformParameterivHP .align 2 -_bluegl_glVertexAttrib4Niv: - adrp x16, ___blue_glCore_glVertexAttrib4Niv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4Niv@GOTPAGEOFF] +_bluegl_glImageTransformParameterivHP: + adrp x16, ___blue_glCore_glImageTransformParameterivHP@GOTPAGE + ldr x16, [x16, ___blue_glCore_glImageTransformParameterivHP@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetUniformLocationARB +.private_extern _bluegl_glImageTransformParameterfvHP .align 2 -_bluegl_glGetUniformLocationARB: - adrp x16, ___blue_glCore_glGetUniformLocationARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetUniformLocationARB@GOTPAGEOFF] +_bluegl_glImageTransformParameterfvHP: + adrp x16, ___blue_glCore_glImageTransformParameterfvHP@GOTPAGE + ldr x16, [x16, ___blue_glCore_glImageTransformParameterfvHP@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColor4hvNV +.private_extern _bluegl_glGetImageTransformParameterivHP .align 2 -_bluegl_glColor4hvNV: - adrp x16, ___blue_glCore_glColor4hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColor4hvNV@GOTPAGEOFF] +_bluegl_glGetImageTransformParameterivHP: + adrp x16, ___blue_glCore_glGetImageTransformParameterivHP@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetImageTransformParameterivHP@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureBufferRangeEXT +.private_extern _bluegl_glGetImageTransformParameterfvHP .align 2 -_bluegl_glTextureBufferRangeEXT: - adrp x16, ___blue_glCore_glTextureBufferRangeEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureBufferRangeEXT@GOTPAGEOFF] +_bluegl_glGetImageTransformParameterfvHP: + adrp x16, ___blue_glCore_glGetImageTransformParameterfvHP@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetImageTransformParameterfvHP@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGlobalAlphaFactorsSUN +.private_extern _bluegl_glMultiModeDrawArraysIBM .align 2 -_bluegl_glGlobalAlphaFactorsSUN: - adrp x16, ___blue_glCore_glGlobalAlphaFactorsSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGlobalAlphaFactorsSUN@GOTPAGEOFF] +_bluegl_glMultiModeDrawArraysIBM: + adrp x16, ___blue_glCore_glMultiModeDrawArraysIBM@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiModeDrawArraysIBM@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyTextureSubImage2D +.private_extern _bluegl_glMultiModeDrawElementsIBM .align 2 -_bluegl_glCopyTextureSubImage2D: - adrp x16, ___blue_glCore_glCopyTextureSubImage2D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyTextureSubImage2D@GOTPAGEOFF] +_bluegl_glMultiModeDrawElementsIBM: + adrp x16, ___blue_glCore_glMultiModeDrawElementsIBM@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiModeDrawElementsIBM@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1i64vARB +.private_extern _bluegl_glFlushStaticDataIBM .align 2 -_bluegl_glUniform1i64vARB: - adrp x16, ___blue_glCore_glUniform1i64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1i64vARB@GOTPAGEOFF] +_bluegl_glFlushStaticDataIBM: + adrp x16, ___blue_glCore_glFlushStaticDataIBM@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFlushStaticDataIBM@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2dNV +.private_extern _bluegl_glColorPointerListIBM .align 2 -_bluegl_glVertexAttrib2dNV: - adrp x16, ___blue_glCore_glVertexAttrib2dNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2dNV@GOTPAGEOFF] +_bluegl_glColorPointerListIBM: + adrp x16, ___blue_glCore_glColorPointerListIBM@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorPointerListIBM@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4NbvARB +.private_extern _bluegl_glSecondaryColorPointerListIBM .align 2 -_bluegl_glVertexAttrib4NbvARB: - adrp x16, ___blue_glCore_glVertexAttrib4NbvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4NbvARB@GOTPAGEOFF] +_bluegl_glSecondaryColorPointerListIBM: + adrp x16, ___blue_glCore_glSecondaryColorPointerListIBM@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColorPointerListIBM@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPatchParameteri +.private_extern _bluegl_glEdgeFlagPointerListIBM .align 2 -_bluegl_glPatchParameteri: - adrp x16, ___blue_glCore_glPatchParameteri@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPatchParameteri@GOTPAGEOFF] +_bluegl_glEdgeFlagPointerListIBM: + adrp x16, ___blue_glCore_glEdgeFlagPointerListIBM@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEdgeFlagPointerListIBM@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedStringARB +.private_extern _bluegl_glFogCoordPointerListIBM .align 2 -_bluegl_glGetNamedStringARB: - adrp x16, ___blue_glCore_glGetNamedStringARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedStringARB@GOTPAGEOFF] +_bluegl_glFogCoordPointerListIBM: + adrp x16, ___blue_glCore_glFogCoordPointerListIBM@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFogCoordPointerListIBM@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetCombinerStageParameterfvNV +.private_extern _bluegl_glIndexPointerListIBM .align 2 -_bluegl_glGetCombinerStageParameterfvNV: - adrp x16, ___blue_glCore_glGetCombinerStageParameterfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetCombinerStageParameterfvNV@GOTPAGEOFF] +_bluegl_glIndexPointerListIBM: + adrp x16, ___blue_glCore_glIndexPointerListIBM@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIndexPointerListIBM@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2svARB +.private_extern _bluegl_glNormalPointerListIBM .align 2 -_bluegl_glVertexAttrib2svARB: - adrp x16, ___blue_glCore_glVertexAttrib2svARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2svARB@GOTPAGEOFF] +_bluegl_glNormalPointerListIBM: + adrp x16, ___blue_glCore_glNormalPointerListIBM@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormalPointerListIBM@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glApplyFramebufferAttachmentCMAAINTEL +.private_extern _bluegl_glTexCoordPointerListIBM .align 2 -_bluegl_glApplyFramebufferAttachmentCMAAINTEL: - adrp x16, ___blue_glCore_glApplyFramebufferAttachmentCMAAINTEL@GOTPAGE - ldr x16, [x16, ___blue_glCore_glApplyFramebufferAttachmentCMAAINTEL@GOTPAGEOFF] +_bluegl_glTexCoordPointerListIBM: + adrp x16, ___blue_glCore_glTexCoordPointerListIBM@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoordPointerListIBM@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVideouivNV +.private_extern _bluegl_glVertexPointerListIBM .align 2 -_bluegl_glGetVideouivNV: - adrp x16, ___blue_glCore_glGetVideouivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVideouivNV@GOTPAGEOFF] +_bluegl_glVertexPointerListIBM: + adrp x16, ___blue_glCore_glVertexPointerListIBM@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexPointerListIBM@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3s +.private_extern _bluegl_glBlendFuncSeparateINGR .align 2 -_bluegl_glMultiTexCoord3s: - adrp x16, ___blue_glCore_glMultiTexCoord3s@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3s@GOTPAGEOFF] +_bluegl_glBlendFuncSeparateINGR: + adrp x16, ___blue_glCore_glBlendFuncSeparateINGR@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendFuncSeparateINGR@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1sARB +.private_extern _bluegl_glApplyFramebufferAttachmentCMAAINTEL .align 2 -_bluegl_glMultiTexCoord1sARB: - adrp x16, ___blue_glCore_glMultiTexCoord1sARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1sARB@GOTPAGEOFF] +_bluegl_glApplyFramebufferAttachmentCMAAINTEL: + adrp x16, ___blue_glCore_glApplyFramebufferAttachmentCMAAINTEL@GOTPAGE + ldr x16, [x16, ___blue_glCore_glApplyFramebufferAttachmentCMAAINTEL@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLogicOp +.private_extern _bluegl_glSyncTextureINTEL .align 2 -_bluegl_glLogicOp: - adrp x16, ___blue_glCore_glLogicOp@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLogicOp@GOTPAGEOFF] +_bluegl_glSyncTextureINTEL: + adrp x16, ___blue_glCore_glSyncTextureINTEL@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSyncTextureINTEL@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFogFuncSGIS +.private_extern _bluegl_glUnmapTexture2DINTEL .align 2 -_bluegl_glFogFuncSGIS: - adrp x16, ___blue_glCore_glFogFuncSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFogFuncSGIS@GOTPAGEOFF] +_bluegl_glUnmapTexture2DINTEL: + adrp x16, ___blue_glCore_glUnmapTexture2DINTEL@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUnmapTexture2DINTEL@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixMultfEXT +.private_extern _bluegl_glMapTexture2DINTEL .align 2 -_bluegl_glMatrixMultfEXT: - adrp x16, ___blue_glCore_glMatrixMultfEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixMultfEXT@GOTPAGEOFF] +_bluegl_glMapTexture2DINTEL: + adrp x16, ___blue_glCore_glMapTexture2DINTEL@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMapTexture2DINTEL@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTexParameterfv +.private_extern _bluegl_glVertexPointervINTEL .align 2 -_bluegl_glGetTexParameterfv: - adrp x16, ___blue_glCore_glGetTexParameterfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTexParameterfv@GOTPAGEOFF] +_bluegl_glVertexPointervINTEL: + adrp x16, ___blue_glCore_glVertexPointervINTEL@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexPointervINTEL@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColorP3uiv +.private_extern _bluegl_glNormalPointervINTEL .align 2 -_bluegl_glSecondaryColorP3uiv: - adrp x16, ___blue_glCore_glSecondaryColorP3uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColorP3uiv@GOTPAGEOFF] +_bluegl_glNormalPointervINTEL: + adrp x16, ___blue_glCore_glNormalPointervINTEL@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormalPointervINTEL@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexParameteriEXT +.private_extern _bluegl_glColorPointervINTEL .align 2 -_bluegl_glMultiTexParameteriEXT: - adrp x16, ___blue_glCore_glMultiTexParameteriEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexParameteriEXT@GOTPAGEOFF] +_bluegl_glColorPointervINTEL: + adrp x16, ___blue_glCore_glColorPointervINTEL@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorPointervINTEL@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEnableClientStateIndexedEXT +.private_extern _bluegl_glTexCoordPointervINTEL .align 2 -_bluegl_glEnableClientStateIndexedEXT: - adrp x16, ___blue_glCore_glEnableClientStateIndexedEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEnableClientStateIndexedEXT@GOTPAGEOFF] +_bluegl_glTexCoordPointervINTEL: + adrp x16, ___blue_glCore_glTexCoordPointervINTEL@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoordPointervINTEL@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenPathsNV +.private_extern _bluegl_glBeginPerfQueryINTEL .align 2 -_bluegl_glGenPathsNV: - adrp x16, ___blue_glCore_glGenPathsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenPathsNV@GOTPAGEOFF] +_bluegl_glBeginPerfQueryINTEL: + adrp x16, ___blue_glCore_glBeginPerfQueryINTEL@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBeginPerfQueryINTEL@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetBufferSubData +.private_extern _bluegl_glCreatePerfQueryINTEL .align 2 -_bluegl_glGetBufferSubData: - adrp x16, ___blue_glCore_glGetBufferSubData@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetBufferSubData@GOTPAGEOFF] +_bluegl_glCreatePerfQueryINTEL: + adrp x16, ___blue_glCore_glCreatePerfQueryINTEL@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreatePerfQueryINTEL@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetDoublei_v +.private_extern _bluegl_glDeletePerfQueryINTEL .align 2 -_bluegl_glGetDoublei_v: - adrp x16, ___blue_glCore_glGetDoublei_v@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetDoublei_v@GOTPAGEOFF] +_bluegl_glDeletePerfQueryINTEL: + adrp x16, ___blue_glCore_glDeletePerfQueryINTEL@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeletePerfQueryINTEL@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCoverStrokePathNV +.private_extern _bluegl_glEndPerfQueryINTEL .align 2 -_bluegl_glCoverStrokePathNV: - adrp x16, ___blue_glCore_glCoverStrokePathNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCoverStrokePathNV@GOTPAGEOFF] +_bluegl_glEndPerfQueryINTEL: + adrp x16, ___blue_glCore_glEndPerfQueryINTEL@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEndPerfQueryINTEL@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFrontFace +.private_extern _bluegl_glGetFirstPerfQueryIdINTEL .align 2 -_bluegl_glFrontFace: - adrp x16, ___blue_glCore_glFrontFace@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFrontFace@GOTPAGEOFF] +_bluegl_glGetFirstPerfQueryIdINTEL: + adrp x16, ___blue_glCore_glGetFirstPerfQueryIdINTEL@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFirstPerfQueryIdINTEL@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glScissorIndexedv +.private_extern _bluegl_glGetNextPerfQueryIdINTEL .align 2 -_bluegl_glScissorIndexedv: - adrp x16, ___blue_glCore_glScissorIndexedv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glScissorIndexedv@GOTPAGEOFF] +_bluegl_glGetNextPerfQueryIdINTEL: + adrp x16, ___blue_glCore_glGetNextPerfQueryIdINTEL@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNextPerfQueryIdINTEL@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureStorage3D +.private_extern _bluegl_glGetPerfCounterInfoINTEL .align 2 -_bluegl_glTextureStorage3D: - adrp x16, ___blue_glCore_glTextureStorage3D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureStorage3D@GOTPAGEOFF] +_bluegl_glGetPerfCounterInfoINTEL: + adrp x16, ___blue_glCore_glGetPerfCounterInfoINTEL@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPerfCounterInfoINTEL@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathFogGenNV +.private_extern _bluegl_glGetPerfQueryDataINTEL .align 2 -_bluegl_glPathFogGenNV: - adrp x16, ___blue_glCore_glPathFogGenNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathFogGenNV@GOTPAGEOFF] +_bluegl_glGetPerfQueryDataINTEL: + adrp x16, ___blue_glCore_glGetPerfQueryDataINTEL@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPerfQueryDataINTEL@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPixelTexGenParameterivSGIS +.private_extern _bluegl_glGetPerfQueryIdByNameINTEL .align 2 -_bluegl_glPixelTexGenParameterivSGIS: - adrp x16, ___blue_glCore_glPixelTexGenParameterivSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPixelTexGenParameterivSGIS@GOTPAGEOFF] +_bluegl_glGetPerfQueryIdByNameINTEL: + adrp x16, ___blue_glCore_glGetPerfQueryIdByNameINTEL@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPerfQueryIdByNameINTEL@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendEquationi +.private_extern _bluegl_glGetPerfQueryInfoINTEL .align 2 -_bluegl_glBlendEquationi: - adrp x16, ___blue_glCore_glBlendEquationi@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendEquationi@GOTPAGEOFF] +_bluegl_glGetPerfQueryInfoINTEL: + adrp x16, ___blue_glCore_glGetPerfQueryInfoINTEL@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPerfQueryInfoINTEL@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetHistogramParameterivEXT +.private_extern _bluegl_glResizeBuffersMESA .align 2 -_bluegl_glGetHistogramParameterivEXT: - adrp x16, ___blue_glCore_glGetHistogramParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetHistogramParameterivEXT@GOTPAGEOFF] +_bluegl_glResizeBuffersMESA: + adrp x16, ___blue_glCore_glResizeBuffersMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glResizeBuffersMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearNamedFramebufferfi +.private_extern _bluegl_glWindowPos2dMESA .align 2 -_bluegl_glClearNamedFramebufferfi: - adrp x16, ___blue_glCore_glClearNamedFramebufferfi@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearNamedFramebufferfi@GOTPAGEOFF] +_bluegl_glWindowPos2dMESA: + adrp x16, ___blue_glCore_glWindowPos2dMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2dMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyColorTableSGI +.private_extern _bluegl_glWindowPos2dvMESA .align 2 -_bluegl_glCopyColorTableSGI: - adrp x16, ___blue_glCore_glCopyColorTableSGI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyColorTableSGI@GOTPAGEOFF] +_bluegl_glWindowPos2dvMESA: + adrp x16, ___blue_glCore_glWindowPos2dvMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2dvMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBinormal3dEXT +.private_extern _bluegl_glWindowPos2fMESA .align 2 -_bluegl_glBinormal3dEXT: - adrp x16, ___blue_glCore_glBinormal3dEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBinormal3dEXT@GOTPAGEOFF] +_bluegl_glWindowPos2fMESA: + adrp x16, ___blue_glCore_glWindowPos2fMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2fMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetBufferParameterui64vNV +.private_extern _bluegl_glWindowPos2fvMESA .align 2 -_bluegl_glGetBufferParameterui64vNV: - adrp x16, ___blue_glCore_glGetBufferParameterui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetBufferParameterui64vNV@GOTPAGEOFF] +_bluegl_glWindowPos2fvMESA: + adrp x16, ___blue_glCore_glWindowPos2fvMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2fvMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureImage2DEXT +.private_extern _bluegl_glWindowPos2iMESA .align 2 -_bluegl_glTextureImage2DEXT: - adrp x16, ___blue_glCore_glTextureImage2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureImage2DEXT@GOTPAGEOFF] +_bluegl_glWindowPos2iMESA: + adrp x16, ___blue_glCore_glWindowPos2iMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2iMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTransformFeedbackVaryings +.private_extern _bluegl_glWindowPos2ivMESA .align 2 -_bluegl_glTransformFeedbackVaryings: - adrp x16, ___blue_glCore_glTransformFeedbackVaryings@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTransformFeedbackVaryings@GOTPAGEOFF] +_bluegl_glWindowPos2ivMESA: + adrp x16, ___blue_glCore_glWindowPos2ivMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2ivMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedFramebufferSampleLocationsfvNV +.private_extern _bluegl_glWindowPos2sMESA .align 2 -_bluegl_glNamedFramebufferSampleLocationsfvNV: - adrp x16, ___blue_glCore_glNamedFramebufferSampleLocationsfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedFramebufferSampleLocationsfvNV@GOTPAGEOFF] +_bluegl_glWindowPos2sMESA: + adrp x16, ___blue_glCore_glWindowPos2sMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2sMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMapTexture2DINTEL +.private_extern _bluegl_glWindowPos2svMESA .align 2 -_bluegl_glMapTexture2DINTEL: - adrp x16, ___blue_glCore_glMapTexture2DINTEL@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMapTexture2DINTEL@GOTPAGEOFF] +_bluegl_glWindowPos2svMESA: + adrp x16, ___blue_glCore_glWindowPos2svMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos2svMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMaterialxvOES +.private_extern _bluegl_glWindowPos3dMESA .align 2 -_bluegl_glMaterialxvOES: - adrp x16, ___blue_glCore_glMaterialxvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMaterialxvOES@GOTPAGEOFF] +_bluegl_glWindowPos3dMESA: + adrp x16, ___blue_glCore_glWindowPos3dMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3dMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenNamesAMD +.private_extern _bluegl_glWindowPos3dvMESA .align 2 -_bluegl_glGenNamesAMD: - adrp x16, ___blue_glCore_glGenNamesAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenNamesAMD@GOTPAGEOFF] +_bluegl_glWindowPos3dvMESA: + adrp x16, ___blue_glCore_glWindowPos3dvMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3dvMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2uiEXT +.private_extern _bluegl_glWindowPos3fMESA .align 2 -_bluegl_glUniform2uiEXT: - adrp x16, ___blue_glCore_glUniform2uiEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2uiEXT@GOTPAGEOFF] +_bluegl_glWindowPos3fMESA: + adrp x16, ___blue_glCore_glWindowPos3fMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3fMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1xvOES +.private_extern _bluegl_glWindowPos3fvMESA .align 2 -_bluegl_glMultiTexCoord1xvOES: - adrp x16, ___blue_glCore_glMultiTexCoord1xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1xvOES@GOTPAGEOFF] +_bluegl_glWindowPos3fvMESA: + adrp x16, ___blue_glCore_glWindowPos3fvMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3fvMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEnableIndexedEXT +.private_extern _bluegl_glWindowPos3iMESA .align 2 -_bluegl_glEnableIndexedEXT: - adrp x16, ___blue_glCore_glEnableIndexedEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEnableIndexedEXT@GOTPAGEOFF] +_bluegl_glWindowPos3iMESA: + adrp x16, ___blue_glCore_glWindowPos3iMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3iMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTextureImage1DEXT +.private_extern _bluegl_glWindowPos3ivMESA .align 2 -_bluegl_glCompressedTextureImage1DEXT: - adrp x16, ___blue_glCore_glCompressedTextureImage1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTextureImage1DEXT@GOTPAGEOFF] +_bluegl_glWindowPos3ivMESA: + adrp x16, ___blue_glCore_glWindowPos3ivMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3ivMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3fv +.private_extern _bluegl_glWindowPos3sMESA .align 2 -_bluegl_glMultiTexCoord3fv: - adrp x16, ___blue_glCore_glMultiTexCoord3fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3fv@GOTPAGEOFF] +_bluegl_glWindowPos3sMESA: + adrp x16, ___blue_glCore_glWindowPos3sMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3sMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnPolygonStippleARB +.private_extern _bluegl_glWindowPos3svMESA .align 2 -_bluegl_glGetnPolygonStippleARB: - adrp x16, ___blue_glCore_glGetnPolygonStippleARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnPolygonStippleARB@GOTPAGEOFF] +_bluegl_glWindowPos3svMESA: + adrp x16, ___blue_glCore_glWindowPos3svMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos3svMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord2fColor3fVertex3fvSUN +.private_extern _bluegl_glWindowPos4dMESA .align 2 -_bluegl_glTexCoord2fColor3fVertex3fvSUN: - adrp x16, ___blue_glCore_glTexCoord2fColor3fVertex3fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord2fColor3fVertex3fvSUN@GOTPAGEOFF] +_bluegl_glWindowPos4dMESA: + adrp x16, ___blue_glCore_glWindowPos4dMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos4dMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindTransformFeedbackNV +.private_extern _bluegl_glWindowPos4dvMESA .align 2 -_bluegl_glBindTransformFeedbackNV: - adrp x16, ___blue_glCore_glBindTransformFeedbackNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindTransformFeedbackNV@GOTPAGEOFF] +_bluegl_glWindowPos4dvMESA: + adrp x16, ___blue_glCore_glWindowPos4dvMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos4dvMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream2svATI +.private_extern _bluegl_glWindowPos4fMESA .align 2 -_bluegl_glVertexStream2svATI: - adrp x16, ___blue_glCore_glVertexStream2svATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream2svATI@GOTPAGEOFF] +_bluegl_glWindowPos4fMESA: + adrp x16, ___blue_glCore_glWindowPos4fMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos4fMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1fvARB +.private_extern _bluegl_glWindowPos4fvMESA .align 2 -_bluegl_glMultiTexCoord1fvARB: - adrp x16, ___blue_glCore_glMultiTexCoord1fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1fvARB@GOTPAGEOFF] +_bluegl_glWindowPos4fvMESA: + adrp x16, ___blue_glCore_glWindowPos4fvMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos4fvMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexGendvEXT +.private_extern _bluegl_glWindowPos4iMESA .align 2 -_bluegl_glMultiTexGendvEXT: - adrp x16, ___blue_glCore_glMultiTexGendvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexGendvEXT@GOTPAGEOFF] +_bluegl_glWindowPos4iMESA: + adrp x16, ___blue_glCore_glWindowPos4iMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos4iMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2ui64vNV +.private_extern _bluegl_glWindowPos4ivMESA .align 2 -_bluegl_glProgramUniform2ui64vNV: - adrp x16, ___blue_glCore_glProgramUniform2ui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2ui64vNV@GOTPAGEOFF] +_bluegl_glWindowPos4ivMESA: + adrp x16, ___blue_glCore_glWindowPos4ivMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos4ivMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedRenderbufferParameteriv +.private_extern _bluegl_glWindowPos4sMESA .align 2 -_bluegl_glGetNamedRenderbufferParameteriv: - adrp x16, ___blue_glCore_glGetNamedRenderbufferParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedRenderbufferParameteriv@GOTPAGEOFF] +_bluegl_glWindowPos4sMESA: + adrp x16, ___blue_glCore_glWindowPos4sMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos4sMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendEquationSeparateEXT +.private_extern _bluegl_glWindowPos4svMESA .align 2 -_bluegl_glBlendEquationSeparateEXT: - adrp x16, ___blue_glCore_glBlendEquationSeparateEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendEquationSeparateEXT@GOTPAGEOFF] +_bluegl_glWindowPos4svMESA: + adrp x16, ___blue_glCore_glWindowPos4svMESA@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWindowPos4svMESA@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glInvalidateBufferData +.private_extern _bluegl_glBeginConditionalRenderNVX .align 2 -_bluegl_glInvalidateBufferData: - adrp x16, ___blue_glCore_glInvalidateBufferData@GOTPAGE - ldr x16, [x16, ___blue_glCore_glInvalidateBufferData@GOTPAGEOFF] +_bluegl_glBeginConditionalRenderNVX: + adrp x16, ___blue_glCore_glBeginConditionalRenderNVX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBeginConditionalRenderNVX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFragmentLightModelfvSGIX +.private_extern _bluegl_glEndConditionalRenderNVX .align 2 -_bluegl_glFragmentLightModelfvSGIX: - adrp x16, ___blue_glCore_glFragmentLightModelfvSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFragmentLightModelfvSGIX@GOTPAGEOFF] +_bluegl_glEndConditionalRenderNVX: + adrp x16, ___blue_glCore_glEndConditionalRenderNVX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEndConditionalRenderNVX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMakeTextureHandleNonResidentARB +.private_extern _bluegl_glMultiDrawArraysIndirectBindlessNV .align 2 -_bluegl_glMakeTextureHandleNonResidentARB: - adrp x16, ___blue_glCore_glMakeTextureHandleNonResidentARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMakeTextureHandleNonResidentARB@GOTPAGEOFF] +_bluegl_glMultiDrawArraysIndirectBindlessNV: + adrp x16, ___blue_glCore_glMultiDrawArraysIndirectBindlessNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiDrawArraysIndirectBindlessNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMap2xOES +.private_extern _bluegl_glMultiDrawElementsIndirectBindlessNV .align 2 -_bluegl_glMap2xOES: - adrp x16, ___blue_glCore_glMap2xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMap2xOES@GOTPAGEOFF] +_bluegl_glMultiDrawElementsIndirectBindlessNV: + adrp x16, ___blue_glCore_glMultiDrawElementsIndirectBindlessNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiDrawElementsIndirectBindlessNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferRenderbufferEXT +.private_extern _bluegl_glMultiDrawArraysIndirectBindlessCountNV .align 2 -_bluegl_glFramebufferRenderbufferEXT: - adrp x16, ___blue_glCore_glFramebufferRenderbufferEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferRenderbufferEXT@GOTPAGEOFF] +_bluegl_glMultiDrawArraysIndirectBindlessCountNV: + adrp x16, ___blue_glCore_glMultiDrawArraysIndirectBindlessCountNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiDrawArraysIndirectBindlessCountNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMapAttribParameterfvNV +.private_extern _bluegl_glMultiDrawElementsIndirectBindlessCountNV .align 2 -_bluegl_glGetMapAttribParameterfvNV: - adrp x16, ___blue_glCore_glGetMapAttribParameterfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMapAttribParameterfvNV@GOTPAGEOFF] +_bluegl_glMultiDrawElementsIndirectBindlessCountNV: + adrp x16, ___blue_glCore_glMultiDrawElementsIndirectBindlessCountNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiDrawElementsIndirectBindlessCountNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2dvARB +.private_extern _bluegl_glGetTextureHandleNV .align 2 -_bluegl_glVertexAttrib2dvARB: - adrp x16, ___blue_glCore_glVertexAttrib2dvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2dvARB@GOTPAGEOFF] +_bluegl_glGetTextureHandleNV: + adrp x16, ___blue_glCore_glGetTextureHandleNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureHandleNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glInvalidateBufferSubData +.private_extern _bluegl_glGetTextureSamplerHandleNV .align 2 -_bluegl_glInvalidateBufferSubData: - adrp x16, ___blue_glCore_glInvalidateBufferSubData@GOTPAGE - ldr x16, [x16, ___blue_glCore_glInvalidateBufferSubData@GOTPAGEOFF] +_bluegl_glGetTextureSamplerHandleNV: + adrp x16, ___blue_glCore_glGetTextureSamplerHandleNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTextureSamplerHandleNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1d +.private_extern _bluegl_glMakeTextureHandleResidentNV .align 2 -_bluegl_glVertexAttrib1d: - adrp x16, ___blue_glCore_glVertexAttrib1d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1d@GOTPAGEOFF] +_bluegl_glMakeTextureHandleResidentNV: + adrp x16, ___blue_glCore_glMakeTextureHandleResidentNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMakeTextureHandleResidentNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDispatchComputeIndirect +.private_extern _bluegl_glMakeTextureHandleNonResidentNV .align 2 -_bluegl_glDispatchComputeIndirect: - adrp x16, ___blue_glCore_glDispatchComputeIndirect@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDispatchComputeIndirect@GOTPAGEOFF] +_bluegl_glMakeTextureHandleNonResidentNV: + adrp x16, ___blue_glCore_glMakeTextureHandleNonResidentNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMakeTextureHandleNonResidentNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStencilFuncSeparate +.private_extern _bluegl_glGetImageHandleNV .align 2 -_bluegl_glStencilFuncSeparate: - adrp x16, ___blue_glCore_glStencilFuncSeparate@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStencilFuncSeparate@GOTPAGEOFF] +_bluegl_glGetImageHandleNV: + adrp x16, ___blue_glCore_glGetImageHandleNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetImageHandleNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMapVertexAttrib2fAPPLE +.private_extern _bluegl_glMakeImageHandleResidentNV .align 2 -_bluegl_glMapVertexAttrib2fAPPLE: - adrp x16, ___blue_glCore_glMapVertexAttrib2fAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMapVertexAttrib2fAPPLE@GOTPAGEOFF] +_bluegl_glMakeImageHandleResidentNV: + adrp x16, ___blue_glCore_glMakeImageHandleResidentNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMakeImageHandleResidentNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix2x4fv +.private_extern _bluegl_glMakeImageHandleNonResidentNV .align 2 -_bluegl_glProgramUniformMatrix2x4fv: - adrp x16, ___blue_glCore_glProgramUniformMatrix2x4fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2x4fv@GOTPAGEOFF] +_bluegl_glMakeImageHandleNonResidentNV: + adrp x16, ___blue_glCore_glMakeImageHandleNonResidentNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMakeImageHandleNonResidentNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReadPixels +.private_extern _bluegl_glUniformHandleui64NV .align 2 -_bluegl_glReadPixels: - adrp x16, ___blue_glCore_glReadPixels@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReadPixels@GOTPAGEOFF] +_bluegl_glUniformHandleui64NV: + adrp x16, ___blue_glCore_glUniformHandleui64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformHandleui64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayAttribIFormat +.private_extern _bluegl_glUniformHandleui64vNV .align 2 -_bluegl_glVertexArrayAttribIFormat: - adrp x16, ___blue_glCore_glVertexArrayAttribIFormat@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayAttribIFormat@GOTPAGEOFF] +_bluegl_glUniformHandleui64vNV: + adrp x16, ___blue_glCore_glUniformHandleui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformHandleui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyMultiTexSubImage1DEXT +.private_extern _bluegl_glProgramUniformHandleui64NV .align 2 -_bluegl_glCopyMultiTexSubImage1DEXT: - adrp x16, ___blue_glCore_glCopyMultiTexSubImage1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyMultiTexSubImage1DEXT@GOTPAGEOFF] +_bluegl_glProgramUniformHandleui64NV: + adrp x16, ___blue_glCore_glProgramUniformHandleui64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformHandleui64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendEquationSeparateIndexedAMD +.private_extern _bluegl_glProgramUniformHandleui64vNV .align 2 -_bluegl_glBlendEquationSeparateIndexedAMD: - adrp x16, ___blue_glCore_glBlendEquationSeparateIndexedAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendEquationSeparateIndexedAMD@GOTPAGEOFF] +_bluegl_glProgramUniformHandleui64vNV: + adrp x16, ___blue_glCore_glProgramUniformHandleui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformHandleui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTransformFeedbackVaryingEXT +.private_extern _bluegl_glIsTextureHandleResidentNV .align 2 -_bluegl_glGetTransformFeedbackVaryingEXT: - adrp x16, ___blue_glCore_glGetTransformFeedbackVaryingEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTransformFeedbackVaryingEXT@GOTPAGEOFF] +_bluegl_glIsTextureHandleResidentNV: + adrp x16, ___blue_glCore_glIsTextureHandleResidentNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsTextureHandleResidentNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2ui64ARB +.private_extern _bluegl_glIsImageHandleResidentNV .align 2 -_bluegl_glProgramUniform2ui64ARB: - adrp x16, ___blue_glCore_glProgramUniform2ui64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2ui64ARB@GOTPAGEOFF] +_bluegl_glIsImageHandleResidentNV: + adrp x16, ___blue_glCore_glIsImageHandleResidentNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsImageHandleResidentNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1i64vARB +.private_extern _bluegl_glBlendParameteriNV .align 2 -_bluegl_glProgramUniform1i64vARB: - adrp x16, ___blue_glCore_glProgramUniform1i64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1i64vARB@GOTPAGEOFF] +_bluegl_glBlendParameteriNV: + adrp x16, ___blue_glCore_glBlendParameteriNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendParameteriNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4iv +.private_extern _bluegl_glBlendBarrierNV .align 2 -_bluegl_glMultiTexCoord4iv: - adrp x16, ___blue_glCore_glMultiTexCoord4iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4iv@GOTPAGEOFF] +_bluegl_glBlendBarrierNV: + adrp x16, ___blue_glCore_glBlendBarrierNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBlendBarrierNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLoadIdentityDeformationMapSGIX +.private_extern _bluegl_glCreateStatesNV .align 2 -_bluegl_glLoadIdentityDeformationMapSGIX: - adrp x16, ___blue_glCore_glLoadIdentityDeformationMapSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLoadIdentityDeformationMapSGIX@GOTPAGEOFF] +_bluegl_glCreateStatesNV: + adrp x16, ___blue_glCore_glCreateStatesNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreateStatesNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMultiTexGendvEXT +.private_extern _bluegl_glDeleteStatesNV .align 2 -_bluegl_glGetMultiTexGendvEXT: - adrp x16, ___blue_glCore_glGetMultiTexGendvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMultiTexGendvEXT@GOTPAGEOFF] +_bluegl_glDeleteStatesNV: + adrp x16, ___blue_glCore_glDeleteStatesNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteStatesNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertex4xvOES +.private_extern _bluegl_glIsStateNV .align 2 -_bluegl_glVertex4xvOES: - adrp x16, ___blue_glCore_glVertex4xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertex4xvOES@GOTPAGEOFF] +_bluegl_glIsStateNV: + adrp x16, ___blue_glCore_glIsStateNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsStateNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayVertexAttribOffsetEXT +.private_extern _bluegl_glStateCaptureNV .align 2 -_bluegl_glVertexArrayVertexAttribOffsetEXT: - adrp x16, ___blue_glCore_glVertexArrayVertexAttribOffsetEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayVertexAttribOffsetEXT@GOTPAGEOFF] +_bluegl_glStateCaptureNV: + adrp x16, ___blue_glCore_glStateCaptureNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStateCaptureNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormalP3ui +.private_extern _bluegl_glGetCommandHeaderNV .align 2 -_bluegl_glNormalP3ui: - adrp x16, ___blue_glCore_glNormalP3ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormalP3ui@GOTPAGEOFF] +_bluegl_glGetCommandHeaderNV: + adrp x16, ___blue_glCore_glGetCommandHeaderNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetCommandHeaderNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMapParameterivNV +.private_extern _bluegl_glGetStageIndexNV .align 2 -_bluegl_glMapParameterivNV: - adrp x16, ___blue_glCore_glMapParameterivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMapParameterivNV@GOTPAGEOFF] +_bluegl_glGetStageIndexNV: + adrp x16, ___blue_glCore_glGetStageIndexNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetStageIndexNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorPointervINTEL +.private_extern _bluegl_glDrawCommandsNV .align 2 -_bluegl_glColorPointervINTEL: - adrp x16, ___blue_glCore_glColorPointervINTEL@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorPointervINTEL@GOTPAGEOFF] +_bluegl_glDrawCommandsNV: + adrp x16, ___blue_glCore_glDrawCommandsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawCommandsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetQueryObjectui64v +.private_extern _bluegl_glDrawCommandsAddressNV .align 2 -_bluegl_glGetQueryObjectui64v: - adrp x16, ___blue_glCore_glGetQueryObjectui64v@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetQueryObjectui64v@GOTPAGEOFF] +_bluegl_glDrawCommandsAddressNV: + adrp x16, ___blue_glCore_glDrawCommandsAddressNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawCommandsAddressNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenFencesAPPLE +.private_extern _bluegl_glDrawCommandsStatesNV .align 2 -_bluegl_glGenFencesAPPLE: - adrp x16, ___blue_glCore_glGenFencesAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenFencesAPPLE@GOTPAGEOFF] +_bluegl_glDrawCommandsStatesNV: + adrp x16, ___blue_glCore_glDrawCommandsStatesNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawCommandsStatesNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedBufferPageCommitmentEXT +.private_extern _bluegl_glDrawCommandsStatesAddressNV .align 2 -_bluegl_glNamedBufferPageCommitmentEXT: - adrp x16, ___blue_glCore_glNamedBufferPageCommitmentEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedBufferPageCommitmentEXT@GOTPAGEOFF] +_bluegl_glDrawCommandsStatesAddressNV: + adrp x16, ___blue_glCore_glDrawCommandsStatesAddressNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawCommandsStatesAddressNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetShaderSourceARB +.private_extern _bluegl_glCreateCommandListsNV .align 2 -_bluegl_glGetShaderSourceARB: - adrp x16, ___blue_glCore_glGetShaderSourceARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetShaderSourceARB@GOTPAGEOFF] +_bluegl_glCreateCommandListsNV: + adrp x16, ___blue_glCore_glCreateCommandListsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCreateCommandListsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearNamedFramebufferuiv +.private_extern _bluegl_glDeleteCommandListsNV .align 2 -_bluegl_glClearNamedFramebufferuiv: - adrp x16, ___blue_glCore_glClearNamedFramebufferuiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearNamedFramebufferuiv@GOTPAGEOFF] +_bluegl_glDeleteCommandListsNV: + adrp x16, ___blue_glCore_glDeleteCommandListsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteCommandListsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVDPAUIsSurfaceNV +.private_extern _bluegl_glIsCommandListNV .align 2 -_bluegl_glVDPAUIsSurfaceNV: - adrp x16, ___blue_glCore_glVDPAUIsSurfaceNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVDPAUIsSurfaceNV@GOTPAGEOFF] +_bluegl_glIsCommandListNV: + adrp x16, ___blue_glCore_glIsCommandListNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsCommandListNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL2ui64NV +.private_extern _bluegl_glListDrawCommandsStatesClientNV .align 2 -_bluegl_glVertexAttribL2ui64NV: - adrp x16, ___blue_glCore_glVertexAttribL2ui64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL2ui64NV@GOTPAGEOFF] +_bluegl_glListDrawCommandsStatesClientNV: + adrp x16, ___blue_glCore_glListDrawCommandsStatesClientNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glListDrawCommandsStatesClientNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColor4xvOES +.private_extern _bluegl_glCommandListSegmentsNV .align 2 -_bluegl_glColor4xvOES: - adrp x16, ___blue_glCore_glColor4xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColor4xvOES@GOTPAGEOFF] +_bluegl_glCommandListSegmentsNV: + adrp x16, ___blue_glCore_glCommandListSegmentsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCommandListSegmentsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformBlockBinding +.private_extern _bluegl_glCompileCommandListNV .align 2 -_bluegl_glUniformBlockBinding: - adrp x16, ___blue_glCore_glUniformBlockBinding@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformBlockBinding@GOTPAGEOFF] +_bluegl_glCompileCommandListNV: + adrp x16, ___blue_glCore_glCompileCommandListNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCompileCommandListNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glListParameterivSGIX +.private_extern _bluegl_glCallCommandListNV .align 2 -_bluegl_glListParameterivSGIX: - adrp x16, ___blue_glCore_glListParameterivSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glListParameterivSGIX@GOTPAGEOFF] +_bluegl_glCallCommandListNV: + adrp x16, ___blue_glCore_glCallCommandListNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCallCommandListNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathSubCoordsNV +.private_extern _bluegl_glBeginConditionalRenderNV .align 2 -_bluegl_glPathSubCoordsNV: - adrp x16, ___blue_glCore_glPathSubCoordsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathSubCoordsNV@GOTPAGEOFF] +_bluegl_glBeginConditionalRenderNV: + adrp x16, ___blue_glCore_glBeginConditionalRenderNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBeginConditionalRenderNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramStringARB +.private_extern _bluegl_glEndConditionalRenderNV .align 2 -_bluegl_glGetProgramStringARB: - adrp x16, ___blue_glCore_glGetProgramStringARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramStringARB@GOTPAGEOFF] +_bluegl_glEndConditionalRenderNV: + adrp x16, ___blue_glCore_glEndConditionalRenderNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEndConditionalRenderNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathStencilFuncNV +.private_extern _bluegl_glSubpixelPrecisionBiasNV .align 2 -_bluegl_glPathStencilFuncNV: - adrp x16, ___blue_glCore_glPathStencilFuncNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathStencilFuncNV@GOTPAGEOFF] +_bluegl_glSubpixelPrecisionBiasNV: + adrp x16, ___blue_glCore_glSubpixelPrecisionBiasNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSubpixelPrecisionBiasNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindVideoCaptureStreamBufferNV +.private_extern _bluegl_glConservativeRasterParameterfNV .align 2 -_bluegl_glBindVideoCaptureStreamBufferNV: - adrp x16, ___blue_glCore_glBindVideoCaptureStreamBufferNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindVideoCaptureStreamBufferNV@GOTPAGEOFF] +_bluegl_glConservativeRasterParameterfNV: + adrp x16, ___blue_glCore_glConservativeRasterParameterfNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glConservativeRasterParameterfNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReadnPixelsARB +.private_extern _bluegl_glCopyImageSubDataNV .align 2 -_bluegl_glReadnPixelsARB: - adrp x16, ___blue_glCore_glReadnPixelsARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReadnPixelsARB@GOTPAGEOFF] +_bluegl_glCopyImageSubDataNV: + adrp x16, ___blue_glCore_glCopyImageSubDataNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyImageSubDataNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexBufferARB +.private_extern _bluegl_glDepthRangedNV .align 2 -_bluegl_glTexBufferARB: - adrp x16, ___blue_glCore_glTexBufferARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexBufferARB@GOTPAGEOFF] +_bluegl_glDepthRangedNV: + adrp x16, ___blue_glCore_glDepthRangedNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDepthRangedNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL2ui64vNV +.private_extern _bluegl_glClearDepthdNV .align 2 -_bluegl_glVertexAttribL2ui64vNV: - adrp x16, ___blue_glCore_glVertexAttribL2ui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL2ui64vNV@GOTPAGEOFF] +_bluegl_glClearDepthdNV: + adrp x16, ___blue_glCore_glClearDepthdNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glClearDepthdNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreateBuffers +.private_extern _bluegl_glDepthBoundsdNV .align 2 -_bluegl_glCreateBuffers: - adrp x16, ___blue_glCore_glCreateBuffers@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreateBuffers@GOTPAGEOFF] +_bluegl_glDepthBoundsdNV: + adrp x16, ___blue_glCore_glDepthBoundsdNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDepthBoundsdNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glImageTransformParameterfvHP +.private_extern _bluegl_glDrawTextureNV .align 2 -_bluegl_glImageTransformParameterfvHP: - adrp x16, ___blue_glCore_glImageTransformParameterfvHP@GOTPAGE - ldr x16, [x16, ___blue_glCore_glImageTransformParameterfvHP@GOTPAGEOFF] +_bluegl_glDrawTextureNV: + adrp x16, ___blue_glCore_glDrawTextureNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawTextureNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2d +.private_extern _bluegl_glMapControlPointsNV .align 2 -_bluegl_glUniform2d: - adrp x16, ___blue_glCore_glUniform2d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2d@GOTPAGEOFF] +_bluegl_glMapControlPointsNV: + adrp x16, ___blue_glCore_glMapControlPointsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMapControlPointsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBufferStorage +.private_extern _bluegl_glMapParameterivNV .align 2 -_bluegl_glBufferStorage: - adrp x16, ___blue_glCore_glBufferStorage@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBufferStorage@GOTPAGEOFF] +_bluegl_glMapParameterivNV: + adrp x16, ___blue_glCore_glMapParameterivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMapParameterivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTexFilterFuncSGIS +.private_extern _bluegl_glMapParameterfvNV .align 2 -_bluegl_glGetTexFilterFuncSGIS: - adrp x16, ___blue_glCore_glGetTexFilterFuncSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTexFilterFuncSGIS@GOTPAGEOFF] +_bluegl_glMapParameterfvNV: + adrp x16, ___blue_glCore_glMapParameterfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMapParameterfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetHandleARB +.private_extern _bluegl_glGetMapControlPointsNV .align 2 -_bluegl_glGetHandleARB: - adrp x16, ___blue_glCore_glGetHandleARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetHandleARB@GOTPAGEOFF] +_bluegl_glGetMapControlPointsNV: + adrp x16, ___blue_glCore_glGetMapControlPointsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMapControlPointsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetHistogramParameterxvOES +.private_extern _bluegl_glGetMapParameterivNV .align 2 -_bluegl_glGetHistogramParameterxvOES: - adrp x16, ___blue_glCore_glGetHistogramParameterxvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetHistogramParameterxvOES@GOTPAGEOFF] +_bluegl_glGetMapParameterivNV: + adrp x16, ___blue_glCore_glGetMapParameterivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMapParameterivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2d +.private_extern _bluegl_glGetMapParameterfvNV .align 2 -_bluegl_glMultiTexCoord2d: - adrp x16, ___blue_glCore_glMultiTexCoord2d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2d@GOTPAGEOFF] +_bluegl_glGetMapParameterfvNV: + adrp x16, ___blue_glCore_glGetMapParameterfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMapParameterfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertex4hNV +.private_extern _bluegl_glGetMapAttribParameterivNV .align 2 -_bluegl_glVertex4hNV: - adrp x16, ___blue_glCore_glVertex4hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertex4hNV@GOTPAGEOFF] +_bluegl_glGetMapAttribParameterivNV: + adrp x16, ___blue_glCore_glGetMapAttribParameterivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMapAttribParameterivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPerfMonitorGroupStringAMD +.private_extern _bluegl_glGetMapAttribParameterfvNV .align 2 -_bluegl_glGetPerfMonitorGroupStringAMD: - adrp x16, ___blue_glCore_glGetPerfMonitorGroupStringAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPerfMonitorGroupStringAMD@GOTPAGEOFF] +_bluegl_glGetMapAttribParameterfvNV: + adrp x16, ___blue_glCore_glGetMapAttribParameterfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMapAttribParameterfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTextureSubImage1D +.private_extern _bluegl_glEvalMapsNV .align 2 -_bluegl_glCompressedTextureSubImage1D: - adrp x16, ___blue_glCore_glCompressedTextureSubImage1D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTextureSubImage1D@GOTPAGEOFF] +_bluegl_glEvalMapsNV: + adrp x16, ___blue_glCore_glEvalMapsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEvalMapsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsFramebuffer +.private_extern _bluegl_glGetMultisamplefvNV .align 2 -_bluegl_glIsFramebuffer: - adrp x16, ___blue_glCore_glIsFramebuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsFramebuffer@GOTPAGEOFF] +_bluegl_glGetMultisamplefvNV: + adrp x16, ___blue_glCore_glGetMultisamplefvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetMultisamplefvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2dv +.private_extern _bluegl_glSampleMaskIndexedNV .align 2 -_bluegl_glUniform2dv: - adrp x16, ___blue_glCore_glUniform2dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2dv@GOTPAGEOFF] +_bluegl_glSampleMaskIndexedNV: + adrp x16, ___blue_glCore_glSampleMaskIndexedNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSampleMaskIndexedNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1dvARB +.private_extern _bluegl_glTexRenderbufferNV .align 2 -_bluegl_glVertexAttrib1dvARB: - adrp x16, ___blue_glCore_glVertexAttrib1dvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1dvARB@GOTPAGEOFF] +_bluegl_glTexRenderbufferNV: + adrp x16, ___blue_glCore_glTexRenderbufferNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexRenderbufferNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClientWaitSync +.private_extern _bluegl_glDeleteFencesNV .align 2 -_bluegl_glClientWaitSync: - adrp x16, ___blue_glCore_glClientWaitSync@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClientWaitSync@GOTPAGEOFF] +_bluegl_glDeleteFencesNV: + adrp x16, ___blue_glCore_glDeleteFencesNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteFencesNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4i64vARB +.private_extern _bluegl_glGenFencesNV .align 2 -_bluegl_glProgramUniform4i64vARB: - adrp x16, ___blue_glCore_glProgramUniform4i64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4i64vARB@GOTPAGEOFF] +_bluegl_glGenFencesNV: + adrp x16, ___blue_glCore_glGenFencesNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenFencesNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetActiveAttribARB +.private_extern _bluegl_glIsFenceNV .align 2 -_bluegl_glGetActiveAttribARB: - adrp x16, ___blue_glCore_glGetActiveAttribARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetActiveAttribARB@GOTPAGEOFF] +_bluegl_glIsFenceNV: + adrp x16, ___blue_glCore_glIsFenceNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsFenceNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTexImage3DARB +.private_extern _bluegl_glTestFenceNV .align 2 -_bluegl_glCompressedTexImage3DARB: - adrp x16, ___blue_glCore_glCompressedTexImage3DARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTexImage3DARB@GOTPAGEOFF] +_bluegl_glTestFenceNV: + adrp x16, ___blue_glCore_glTestFenceNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTestFenceNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI2iEXT +.private_extern _bluegl_glGetFenceivNV .align 2 -_bluegl_glVertexAttribI2iEXT: - adrp x16, ___blue_glCore_glVertexAttribI2iEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI2iEXT@GOTPAGEOFF] +_bluegl_glGetFenceivNV: + adrp x16, ___blue_glCore_glGetFenceivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFenceivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramNamedParameter4dNV +.private_extern _bluegl_glFinishFenceNV .align 2 -_bluegl_glProgramNamedParameter4dNV: - adrp x16, ___blue_glCore_glProgramNamedParameter4dNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramNamedParameter4dNV@GOTPAGEOFF] +_bluegl_glFinishFenceNV: + adrp x16, ___blue_glCore_glFinishFenceNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFinishFenceNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramStringARB +.private_extern _bluegl_glSetFenceNV .align 2 -_bluegl_glProgramStringARB: - adrp x16, ___blue_glCore_glProgramStringARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramStringARB@GOTPAGEOFF] +_bluegl_glSetFenceNV: + adrp x16, ___blue_glCore_glSetFenceNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSetFenceNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3fvMESA +.private_extern _bluegl_glFragmentCoverageColorNV .align 2 -_bluegl_glWindowPos3fvMESA: - adrp x16, ___blue_glCore_glWindowPos3fvMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3fvMESA@GOTPAGEOFF] +_bluegl_glFragmentCoverageColorNV: + adrp x16, ___blue_glCore_glFragmentCoverageColorNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFragmentCoverageColorNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendFunciARB +.private_extern _bluegl_glProgramNamedParameter4fNV .align 2 -_bluegl_glBlendFunciARB: - adrp x16, ___blue_glCore_glBlendFunciARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendFunciARB@GOTPAGEOFF] +_bluegl_glProgramNamedParameter4fNV: + adrp x16, ___blue_glCore_glProgramNamedParameter4fNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramNamedParameter4fNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4dvNV +.private_extern _bluegl_glProgramNamedParameter4fvNV .align 2 -_bluegl_glVertexAttrib4dvNV: - adrp x16, ___blue_glCore_glVertexAttrib4dvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4dvNV@GOTPAGEOFF] +_bluegl_glProgramNamedParameter4fvNV: + adrp x16, ___blue_glCore_glProgramNamedParameter4fvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramNamedParameter4fvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3dvARB +.private_extern _bluegl_glProgramNamedParameter4dNV .align 2 -_bluegl_glWindowPos3dvARB: - adrp x16, ___blue_glCore_glWindowPos3dvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3dvARB@GOTPAGEOFF] +_bluegl_glProgramNamedParameter4dNV: + adrp x16, ___blue_glCore_glProgramNamedParameter4dNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramNamedParameter4dNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1bvOES +.private_extern _bluegl_glProgramNamedParameter4dvNV .align 2 -_bluegl_glMultiTexCoord1bvOES: - adrp x16, ___blue_glCore_glMultiTexCoord1bvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1bvOES@GOTPAGEOFF] +_bluegl_glProgramNamedParameter4dvNV: + adrp x16, ___blue_glCore_glProgramNamedParameter4dvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramNamedParameter4dvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4fvARB +.private_extern _bluegl_glGetProgramNamedParameterfvNV .align 2 -_bluegl_glVertexAttrib4fvARB: - adrp x16, ___blue_glCore_glVertexAttrib4fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4fvARB@GOTPAGEOFF] +_bluegl_glGetProgramNamedParameterfvNV: + adrp x16, ___blue_glCore_glGetProgramNamedParameterfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramNamedParameterfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPopGroupMarkerEXT +.private_extern _bluegl_glGetProgramNamedParameterdvNV .align 2 -_bluegl_glPopGroupMarkerEXT: - adrp x16, ___blue_glCore_glPopGroupMarkerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPopGroupMarkerEXT@GOTPAGEOFF] +_bluegl_glGetProgramNamedParameterdvNV: + adrp x16, ___blue_glCore_glGetProgramNamedParameterdvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramNamedParameterdvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiDrawElements +.private_extern _bluegl_glCoverageModulationTableNV .align 2 -_bluegl_glMultiDrawElements: - adrp x16, ___blue_glCore_glMultiDrawElements@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiDrawElements@GOTPAGEOFF] +_bluegl_glCoverageModulationTableNV: + adrp x16, ___blue_glCore_glCoverageModulationTableNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCoverageModulationTableNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetInstrumentsSGIX +.private_extern _bluegl_glGetCoverageModulationTableNV .align 2 -_bluegl_glGetInstrumentsSGIX: - adrp x16, ___blue_glCore_glGetInstrumentsSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetInstrumentsSGIX@GOTPAGEOFF] +_bluegl_glGetCoverageModulationTableNV: + adrp x16, ___blue_glCore_glGetCoverageModulationTableNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetCoverageModulationTableNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4dv +.private_extern _bluegl_glCoverageModulationNV .align 2 -_bluegl_glProgramUniform4dv: - adrp x16, ___blue_glCore_glProgramUniform4dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4dv@GOTPAGEOFF] +_bluegl_glCoverageModulationNV: + adrp x16, ___blue_glCore_glCoverageModulationNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCoverageModulationNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorTableEXT +.private_extern _bluegl_glRenderbufferStorageMultisampleCoverageNV .align 2 -_bluegl_glColorTableEXT: - adrp x16, ___blue_glCore_glColorTableEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorTableEXT@GOTPAGEOFF] +_bluegl_glRenderbufferStorageMultisampleCoverageNV: + adrp x16, ___blue_glCore_glRenderbufferStorageMultisampleCoverageNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glRenderbufferStorageMultisampleCoverageNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexSubImage1D +.private_extern _bluegl_glProgramVertexLimitNV .align 2 -_bluegl_glTexSubImage1D: - adrp x16, ___blue_glCore_glTexSubImage1D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexSubImage1D@GOTPAGEOFF] +_bluegl_glProgramVertexLimitNV: + adrp x16, ___blue_glCore_glProgramVertexLimitNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramVertexLimitNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBeginPerfMonitorAMD +.private_extern _bluegl_glFramebufferTextureEXT .align 2 -_bluegl_glBeginPerfMonitorAMD: - adrp x16, ___blue_glCore_glBeginPerfMonitorAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBeginPerfMonitorAMD@GOTPAGEOFF] +_bluegl_glFramebufferTextureEXT: + adrp x16, ___blue_glCore_glFramebufferTextureEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferTextureEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPointParameterfvSGIS +.private_extern _bluegl_glFramebufferTextureFaceEXT .align 2 -_bluegl_glPointParameterfvSGIS: - adrp x16, ___blue_glCore_glPointParameterfvSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPointParameterfvSGIS@GOTPAGEOFF] +_bluegl_glFramebufferTextureFaceEXT: + adrp x16, ___blue_glCore_glFramebufferTextureFaceEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferTextureFaceEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetImageTransformParameterfvHP +.private_extern _bluegl_glProgramLocalParameterI4iNV .align 2 -_bluegl_glGetImageTransformParameterfvHP: - adrp x16, ___blue_glCore_glGetImageTransformParameterfvHP@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetImageTransformParameterfvHP@GOTPAGEOFF] +_bluegl_glProgramLocalParameterI4iNV: + adrp x16, ___blue_glCore_glProgramLocalParameterI4iNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramLocalParameterI4iNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertex3hvNV +.private_extern _bluegl_glProgramLocalParameterI4ivNV .align 2 -_bluegl_glVertex3hvNV: - adrp x16, ___blue_glCore_glVertex3hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertex3hvNV@GOTPAGEOFF] +_bluegl_glProgramLocalParameterI4ivNV: + adrp x16, ___blue_glCore_glProgramLocalParameterI4ivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramLocalParameterI4ivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord4fVertex4fvSUN +.private_extern _bluegl_glProgramLocalParametersI4ivNV .align 2 -_bluegl_glTexCoord4fVertex4fvSUN: - adrp x16, ___blue_glCore_glTexCoord4fVertex4fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord4fVertex4fvSUN@GOTPAGEOFF] +_bluegl_glProgramLocalParametersI4ivNV: + adrp x16, ___blue_glCore_glProgramLocalParametersI4ivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramLocalParametersI4ivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTexSubImage1D +.private_extern _bluegl_glProgramLocalParameterI4uiNV .align 2 -_bluegl_glCompressedTexSubImage1D: - adrp x16, ___blue_glCore_glCompressedTexSubImage1D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTexSubImage1D@GOTPAGEOFF] +_bluegl_glProgramLocalParameterI4uiNV: + adrp x16, ___blue_glCore_glProgramLocalParameterI4uiNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramLocalParameterI4uiNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2dvMESA +.private_extern _bluegl_glProgramLocalParameterI4uivNV .align 2 -_bluegl_glWindowPos2dvMESA: - adrp x16, ___blue_glCore_glWindowPos2dvMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2dvMESA@GOTPAGEOFF] +_bluegl_glProgramLocalParameterI4uivNV: + adrp x16, ___blue_glCore_glProgramLocalParameterI4uivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramLocalParameterI4uivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetSamplerParameteriv +.private_extern _bluegl_glProgramLocalParametersI4uivNV .align 2 -_bluegl_glGetSamplerParameteriv: - adrp x16, ___blue_glCore_glGetSamplerParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetSamplerParameteriv@GOTPAGEOFF] +_bluegl_glProgramLocalParametersI4uivNV: + adrp x16, ___blue_glCore_glProgramLocalParametersI4uivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramLocalParametersI4uivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorPointerListIBM +.private_extern _bluegl_glProgramEnvParameterI4iNV .align 2 -_bluegl_glColorPointerListIBM: - adrp x16, ___blue_glCore_glColorPointerListIBM@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorPointerListIBM@GOTPAGEOFF] +_bluegl_glProgramEnvParameterI4iNV: + adrp x16, ___blue_glCore_glProgramEnvParameterI4iNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramEnvParameterI4iNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFinalCombinerInputParameterivNV +.private_extern _bluegl_glProgramEnvParameterI4ivNV .align 2 -_bluegl_glGetFinalCombinerInputParameterivNV: - adrp x16, ___blue_glCore_glGetFinalCombinerInputParameterivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFinalCombinerInputParameterivNV@GOTPAGEOFF] +_bluegl_glProgramEnvParameterI4ivNV: + adrp x16, ___blue_glCore_glProgramEnvParameterI4ivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramEnvParameterI4ivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribiv +.private_extern _bluegl_glProgramEnvParametersI4ivNV .align 2 -_bluegl_glGetVertexAttribiv: - adrp x16, ___blue_glCore_glGetVertexAttribiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribiv@GOTPAGEOFF] +_bluegl_glProgramEnvParametersI4ivNV: + adrp x16, ___blue_glCore_glProgramEnvParametersI4ivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramEnvParametersI4ivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTexImage +.private_extern _bluegl_glProgramEnvParameterI4uiNV .align 2 -_bluegl_glGetTexImage: - adrp x16, ___blue_glCore_glGetTexImage@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTexImage@GOTPAGEOFF] +_bluegl_glProgramEnvParameterI4uiNV: + adrp x16, ___blue_glCore_glProgramEnvParameterI4uiNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramEnvParameterI4uiNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBufferSubData +.private_extern _bluegl_glProgramEnvParameterI4uivNV .align 2 -_bluegl_glBufferSubData: - adrp x16, ___blue_glCore_glBufferSubData@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBufferSubData@GOTPAGEOFF] +_bluegl_glProgramEnvParameterI4uivNV: + adrp x16, ___blue_glCore_glProgramEnvParameterI4uivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramEnvParameterI4uivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3sARB +.private_extern _bluegl_glProgramEnvParametersI4uivNV .align 2 -_bluegl_glVertexAttrib3sARB: - adrp x16, ___blue_glCore_glVertexAttrib3sARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3sARB@GOTPAGEOFF] +_bluegl_glProgramEnvParametersI4uivNV: + adrp x16, ___blue_glCore_glProgramEnvParametersI4uivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramEnvParametersI4uivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsTextureHandleResidentARB +.private_extern _bluegl_glGetProgramLocalParameterIivNV .align 2 -_bluegl_glIsTextureHandleResidentARB: - adrp x16, ___blue_glCore_glIsTextureHandleResidentARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsTextureHandleResidentARB@GOTPAGEOFF] +_bluegl_glGetProgramLocalParameterIivNV: + adrp x16, ___blue_glCore_glGetProgramLocalParameterIivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramLocalParameterIivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3i +.private_extern _bluegl_glGetProgramLocalParameterIuivNV .align 2 -_bluegl_glMultiTexCoord3i: - adrp x16, ___blue_glCore_glMultiTexCoord3i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3i@GOTPAGEOFF] +_bluegl_glGetProgramLocalParameterIuivNV: + adrp x16, ___blue_glCore_glGetProgramLocalParameterIuivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramLocalParameterIuivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLinkProgramARB +.private_extern _bluegl_glGetProgramEnvParameterIivNV .align 2 -_bluegl_glLinkProgramARB: - adrp x16, ___blue_glCore_glLinkProgramARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLinkProgramARB@GOTPAGEOFF] +_bluegl_glGetProgramEnvParameterIivNV: + adrp x16, ___blue_glCore_glGetProgramEnvParameterIivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramEnvParameterIivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsProgramNV +.private_extern _bluegl_glGetProgramEnvParameterIuivNV .align 2 -_bluegl_glIsProgramNV: - adrp x16, ___blue_glCore_glIsProgramNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsProgramNV@GOTPAGEOFF] +_bluegl_glGetProgramEnvParameterIuivNV: + adrp x16, ___blue_glCore_glGetProgramEnvParameterIuivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramEnvParameterIuivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI4i +.private_extern _bluegl_glProgramSubroutineParametersuivNV .align 2 -_bluegl_glVertexAttribI4i: - adrp x16, ___blue_glCore_glVertexAttribI4i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI4i@GOTPAGEOFF] +_bluegl_glProgramSubroutineParametersuivNV: + adrp x16, ___blue_glCore_glProgramSubroutineParametersuivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramSubroutineParametersuivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1i +.private_extern _bluegl_glGetProgramSubroutineParameteruivNV .align 2 -_bluegl_glUniform1i: - adrp x16, ___blue_glCore_glUniform1i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1i@GOTPAGEOFF] +_bluegl_glGetProgramSubroutineParameteruivNV: + adrp x16, ___blue_glCore_glGetProgramSubroutineParameteruivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramSubroutineParameteruivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindAttribLocationARB +.private_extern _bluegl_glVertex2hNV .align 2 -_bluegl_glBindAttribLocationARB: - adrp x16, ___blue_glCore_glBindAttribLocationARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindAttribLocationARB@GOTPAGEOFF] +_bluegl_glVertex2hNV: + adrp x16, ___blue_glCore_glVertex2hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertex2hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4i64vNV +.private_extern _bluegl_glVertex2hvNV .align 2 -_bluegl_glProgramUniform4i64vNV: - adrp x16, ___blue_glCore_glProgramUniform4i64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4i64vNV@GOTPAGEOFF] +_bluegl_glVertex2hvNV: + adrp x16, ___blue_glCore_glVertex2hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertex2hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertex4xOES +.private_extern _bluegl_glVertex3hNV .align 2 -_bluegl_glVertex4xOES: - adrp x16, ___blue_glCore_glVertex4xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertex4xOES@GOTPAGEOFF] +_bluegl_glVertex3hNV: + adrp x16, ___blue_glCore_glVertex3hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertex3hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSetLocalConstantEXT +.private_extern _bluegl_glVertex3hvNV .align 2 -_bluegl_glSetLocalConstantEXT: - adrp x16, ___blue_glCore_glSetLocalConstantEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSetLocalConstantEXT@GOTPAGEOFF] +_bluegl_glVertex3hvNV: + adrp x16, ___blue_glCore_glVertex3hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertex3hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexSubImage2D +.private_extern _bluegl_glVertex4hNV .align 2 -_bluegl_glTexSubImage2D: - adrp x16, ___blue_glCore_glTexSubImage2D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexSubImage2D@GOTPAGEOFF] +_bluegl_glVertex4hNV: + adrp x16, ___blue_glCore_glVertex4hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertex4hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2f +.private_extern _bluegl_glVertex4hvNV .align 2 -_bluegl_glWindowPos2f: - adrp x16, ___blue_glCore_glWindowPos2f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2f@GOTPAGEOFF] +_bluegl_glVertex4hvNV: + adrp x16, ___blue_glCore_glVertex4hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertex4hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVariantPointerEXT +.private_extern _bluegl_glNormal3hNV .align 2 -_bluegl_glVariantPointerEXT: - adrp x16, ___blue_glCore_glVariantPointerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVariantPointerEXT@GOTPAGEOFF] +_bluegl_glNormal3hNV: + adrp x16, ___blue_glCore_glNormal3hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormal3hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedRenderbufferStorageMultisample +.private_extern _bluegl_glNormal3hvNV .align 2 -_bluegl_glNamedRenderbufferStorageMultisample: - adrp x16, ___blue_glCore_glNamedRenderbufferStorageMultisample@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedRenderbufferStorageMultisample@GOTPAGEOFF] +_bluegl_glNormal3hvNV: + adrp x16, ___blue_glCore_glNormal3hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormal3hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFogCoorddvEXT +.private_extern _bluegl_glColor3hNV .align 2 -_bluegl_glFogCoorddvEXT: - adrp x16, ___blue_glCore_glFogCoorddvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFogCoorddvEXT@GOTPAGEOFF] +_bluegl_glColor3hNV: + adrp x16, ___blue_glCore_glColor3hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColor3hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiModeDrawArraysIBM +.private_extern _bluegl_glColor3hvNV .align 2 -_bluegl_glMultiModeDrawArraysIBM: - adrp x16, ___blue_glCore_glMultiModeDrawArraysIBM@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiModeDrawArraysIBM@GOTPAGEOFF] +_bluegl_glColor3hvNV: + adrp x16, ___blue_glCore_glColor3hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColor3hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixLoaddEXT +.private_extern _bluegl_glColor4hNV .align 2 -_bluegl_glMatrixLoaddEXT: - adrp x16, ___blue_glCore_glMatrixLoaddEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixLoaddEXT@GOTPAGEOFF] +_bluegl_glColor4hNV: + adrp x16, ___blue_glCore_glColor4hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColor4hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteQueriesARB +.private_extern _bluegl_glColor4hvNV .align 2 -_bluegl_glDeleteQueriesARB: - adrp x16, ___blue_glCore_glDeleteQueriesARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteQueriesARB@GOTPAGEOFF] +_bluegl_glColor4hvNV: + adrp x16, ___blue_glCore_glColor4hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColor4hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1fvARB +.private_extern _bluegl_glTexCoord1hNV .align 2 -_bluegl_glUniform1fvARB: - adrp x16, ___blue_glCore_glUniform1fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1fvARB@GOTPAGEOFF] +_bluegl_glTexCoord1hNV: + adrp x16, ___blue_glCore_glTexCoord1hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord1hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawCommandsNV +.private_extern _bluegl_glTexCoord1hvNV .align 2 -_bluegl_glDrawCommandsNV: - adrp x16, ___blue_glCore_glDrawCommandsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawCommandsNV@GOTPAGEOFF] +_bluegl_glTexCoord1hvNV: + adrp x16, ___blue_glCore_glTexCoord1hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord1hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3dvEXT +.private_extern _bluegl_glTexCoord2hNV .align 2 -_bluegl_glSecondaryColor3dvEXT: - adrp x16, ___blue_glCore_glSecondaryColor3dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3dvEXT@GOTPAGEOFF] +_bluegl_glTexCoord2hNV: + adrp x16, ___blue_glCore_glTexCoord2hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord2hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFlushVertexArrayRangeAPPLE +.private_extern _bluegl_glTexCoord2hvNV .align 2 -_bluegl_glFlushVertexArrayRangeAPPLE: - adrp x16, ___blue_glCore_glFlushVertexArrayRangeAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFlushVertexArrayRangeAPPLE@GOTPAGEOFF] +_bluegl_glTexCoord2hvNV: + adrp x16, ___blue_glCore_glTexCoord2hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord2hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexEnvxvOES +.private_extern _bluegl_glTexCoord3hNV .align 2 -_bluegl_glTexEnvxvOES: - adrp x16, ___blue_glCore_glTexEnvxvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexEnvxvOES@GOTPAGEOFF] +_bluegl_glTexCoord3hNV: + adrp x16, ___blue_glCore_glTexCoord3hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord3hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetSeparableFilterEXT +.private_extern _bluegl_glTexCoord3hvNV .align 2 -_bluegl_glGetSeparableFilterEXT: - adrp x16, ___blue_glCore_glGetSeparableFilterEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetSeparableFilterEXT@GOTPAGEOFF] +_bluegl_glTexCoord3hvNV: + adrp x16, ___blue_glCore_glTexCoord3hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord3hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI4bvEXT +.private_extern _bluegl_glTexCoord4hNV .align 2 -_bluegl_glVertexAttribI4bvEXT: - adrp x16, ___blue_glCore_glVertexAttribI4bvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI4bvEXT@GOTPAGEOFF] +_bluegl_glTexCoord4hNV: + adrp x16, ___blue_glCore_glTexCoord4hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord4hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3i64NV +.private_extern _bluegl_glTexCoord4hvNV .align 2 -_bluegl_glUniform3i64NV: - adrp x16, ___blue_glCore_glUniform3i64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3i64NV@GOTPAGEOFF] +_bluegl_glTexCoord4hvNV: + adrp x16, ___blue_glCore_glTexCoord4hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord4hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendEquationIndexedAMD +.private_extern _bluegl_glMultiTexCoord1hNV .align 2 -_bluegl_glBlendEquationIndexedAMD: - adrp x16, ___blue_glCore_glBlendEquationIndexedAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendEquationIndexedAMD@GOTPAGEOFF] +_bluegl_glMultiTexCoord1hNV: + adrp x16, ___blue_glCore_glMultiTexCoord1hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPointParameterf +.private_extern _bluegl_glMultiTexCoord1hvNV .align 2 -_bluegl_glPointParameterf: - adrp x16, ___blue_glCore_glPointParameterf@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPointParameterf@GOTPAGEOFF] +_bluegl_glMultiTexCoord1hvNV: + adrp x16, ___blue_glCore_glMultiTexCoord1hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord1hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertex4bvOES +.private_extern _bluegl_glMultiTexCoord2hNV .align 2 -_bluegl_glVertex4bvOES: - adrp x16, ___blue_glCore_glVertex4bvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertex4bvOES@GOTPAGEOFF] +_bluegl_glMultiTexCoord2hNV: + adrp x16, ___blue_glCore_glMultiTexCoord2hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStencilThenCoverFillPathNV +.private_extern _bluegl_glMultiTexCoord2hvNV .align 2 -_bluegl_glStencilThenCoverFillPathNV: - adrp x16, ___blue_glCore_glStencilThenCoverFillPathNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStencilThenCoverFillPathNV@GOTPAGEOFF] +_bluegl_glMultiTexCoord2hvNV: + adrp x16, ___blue_glCore_glMultiTexCoord2hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord2hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTextureImage2DEXT +.private_extern _bluegl_glMultiTexCoord3hNV .align 2 -_bluegl_glCompressedTextureImage2DEXT: - adrp x16, ___blue_glCore_glCompressedTextureImage2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTextureImage2DEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoord3hNV: + adrp x16, ___blue_glCore_glMultiTexCoord3hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlendEquationSeparate +.private_extern _bluegl_glMultiTexCoord3hvNV .align 2 -_bluegl_glBlendEquationSeparate: - adrp x16, ___blue_glCore_glBlendEquationSeparate@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlendEquationSeparate@GOTPAGEOFF] +_bluegl_glMultiTexCoord3hvNV: + adrp x16, ___blue_glCore_glMultiTexCoord3hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord3hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedFramebufferParameteriv +.private_extern _bluegl_glMultiTexCoord4hNV .align 2 -_bluegl_glGetNamedFramebufferParameteriv: - adrp x16, ___blue_glCore_glGetNamedFramebufferParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedFramebufferParameteriv@GOTPAGEOFF] +_bluegl_glMultiTexCoord4hNV: + adrp x16, ___blue_glCore_glMultiTexCoord4hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexImage3DEXT +.private_extern _bluegl_glMultiTexCoord4hvNV .align 2 -_bluegl_glTexImage3DEXT: - adrp x16, ___blue_glCore_glTexImage3DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexImage3DEXT@GOTPAGEOFF] +_bluegl_glMultiTexCoord4hvNV: + adrp x16, ___blue_glCore_glMultiTexCoord4hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMultiTexCoord4hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorFragmentOp3ATI +.private_extern _bluegl_glFogCoordhNV .align 2 -_bluegl_glColorFragmentOp3ATI: - adrp x16, ___blue_glCore_glColorFragmentOp3ATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorFragmentOp3ATI@GOTPAGEOFF] +_bluegl_glFogCoordhNV: + adrp x16, ___blue_glCore_glFogCoordhNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFogCoordhNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormalPointerListIBM +.private_extern _bluegl_glFogCoordhvNV .align 2 -_bluegl_glNormalPointerListIBM: - adrp x16, ___blue_glCore_glNormalPointerListIBM@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormalPointerListIBM@GOTPAGEOFF] +_bluegl_glFogCoordhvNV: + adrp x16, ___blue_glCore_glFogCoordhvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFogCoordhvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexParameteriv +.private_extern _bluegl_glSecondaryColor3hNV .align 2 -_bluegl_glTexParameteriv: - adrp x16, ___blue_glCore_glTexParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexParameteriv@GOTPAGEOFF] +_bluegl_glSecondaryColor3hNV: + adrp x16, ___blue_glCore_glSecondaryColor3hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTexSubImage2D +.private_extern _bluegl_glSecondaryColor3hvNV .align 2 -_bluegl_glCompressedTexSubImage2D: - adrp x16, ___blue_glCore_glCompressedTexSubImage2D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTexSubImage2D@GOTPAGEOFF] +_bluegl_glSecondaryColor3hvNV: + adrp x16, ___blue_glCore_glSecondaryColor3hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColor3hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCoverFillPathNV +.private_extern _bluegl_glVertexWeighthNV .align 2 -_bluegl_glCoverFillPathNV: - adrp x16, ___blue_glCore_glCoverFillPathNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCoverFillPathNV@GOTPAGEOFF] +_bluegl_glVertexWeighthNV: + adrp x16, ___blue_glCore_glVertexWeighthNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexWeighthNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix4x2dvEXT +.private_extern _bluegl_glVertexWeighthvNV .align 2 -_bluegl_glProgramUniformMatrix4x2dvEXT: - adrp x16, ___blue_glCore_glProgramUniformMatrix4x2dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4x2dvEXT@GOTPAGEOFF] +_bluegl_glVertexWeighthvNV: + adrp x16, ___blue_glCore_glVertexWeighthvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexWeighthvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1f +.private_extern _bluegl_glVertexAttrib1hNV .align 2 -_bluegl_glVertexAttrib1f: - adrp x16, ___blue_glCore_glVertexAttrib1f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1f@GOTPAGEOFF] +_bluegl_glVertexAttrib1hNV: + adrp x16, ___blue_glCore_glVertexAttrib1hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glAlphaFragmentOp3ATI +.private_extern _bluegl_glVertexAttrib1hvNV .align 2 -_bluegl_glAlphaFragmentOp3ATI: - adrp x16, ___blue_glCore_glAlphaFragmentOp3ATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glAlphaFragmentOp3ATI@GOTPAGEOFF] +_bluegl_glVertexAttrib1hvNV: + adrp x16, ___blue_glCore_glVertexAttrib1hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBeginQueryIndexed +.private_extern _bluegl_glVertexAttrib2hNV .align 2 -_bluegl_glBeginQueryIndexed: - adrp x16, ___blue_glCore_glBeginQueryIndexed@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBeginQueryIndexed@GOTPAGEOFF] +_bluegl_glVertexAttrib2hNV: + adrp x16, ___blue_glCore_glVertexAttrib2hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix2x3fv +.private_extern _bluegl_glVertexAttrib2hvNV .align 2 -_bluegl_glProgramUniformMatrix2x3fv: - adrp x16, ___blue_glCore_glProgramUniformMatrix2x3fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix2x3fv@GOTPAGEOFF] +_bluegl_glVertexAttrib2hvNV: + adrp x16, ___blue_glCore_glVertexAttrib2hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4ui64vNV +.private_extern _bluegl_glVertexAttrib3hNV .align 2 -_bluegl_glProgramUniform4ui64vNV: - adrp x16, ___blue_glCore_glProgramUniform4ui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4ui64vNV@GOTPAGEOFF] +_bluegl_glVertexAttrib3hNV: + adrp x16, ___blue_glCore_glVertexAttrib3hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1ui64NV +.private_extern _bluegl_glVertexAttrib3hvNV .align 2 -_bluegl_glUniform1ui64NV: - adrp x16, ___blue_glCore_glUniform1ui64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1ui64NV@GOTPAGEOFF] +_bluegl_glVertexAttrib3hvNV: + adrp x16, ___blue_glCore_glVertexAttrib3hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3svARB +.private_extern _bluegl_glVertexAttrib4hNV .align 2 -_bluegl_glMultiTexCoord3svARB: - adrp x16, ___blue_glCore_glMultiTexCoord3svARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3svARB@GOTPAGEOFF] +_bluegl_glVertexAttrib4hNV: + adrp x16, ___blue_glCore_glVertexAttrib4hNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4hNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWeightivARB +.private_extern _bluegl_glVertexAttrib4hvNV .align 2 -_bluegl_glWeightivARB: - adrp x16, ___blue_glCore_glWeightivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWeightivARB@GOTPAGEOFF] +_bluegl_glVertexAttrib4hvNV: + adrp x16, ___blue_glCore_glVertexAttrib4hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4xOES +.private_extern _bluegl_glVertexAttribs1hvNV .align 2 -_bluegl_glMultiTexCoord4xOES: - adrp x16, ___blue_glCore_glMultiTexCoord4xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4xOES@GOTPAGEOFF] +_bluegl_glVertexAttribs1hvNV: + adrp x16, ___blue_glCore_glVertexAttribs1hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribs1hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL2i64NV +.private_extern _bluegl_glVertexAttribs2hvNV .align 2 -_bluegl_glVertexAttribL2i64NV: - adrp x16, ___blue_glCore_glVertexAttribL2i64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL2i64NV@GOTPAGEOFF] +_bluegl_glVertexAttribs2hvNV: + adrp x16, ___blue_glCore_glVertexAttribs2hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribs2hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix3x4dv +.private_extern _bluegl_glVertexAttribs3hvNV .align 2 -_bluegl_glProgramUniformMatrix3x4dv: - adrp x16, ___blue_glCore_glProgramUniformMatrix3x4dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix3x4dv@GOTPAGEOFF] +_bluegl_glVertexAttribs3hvNV: + adrp x16, ___blue_glCore_glVertexAttribs3hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribs3hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramParameteriEXT +.private_extern _bluegl_glVertexAttribs4hvNV .align 2 -_bluegl_glProgramParameteriEXT: - adrp x16, ___blue_glCore_glProgramParameteriEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramParameteriEXT@GOTPAGEOFF] +_bluegl_glVertexAttribs4hvNV: + adrp x16, ___blue_glCore_glVertexAttribs4hvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribs4hvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3sEXT +.private_extern _bluegl_glGetInternalformatSampleivNV .align 2 -_bluegl_glSecondaryColor3sEXT: - adrp x16, ___blue_glCore_glSecondaryColor3sEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3sEXT@GOTPAGEOFF] +_bluegl_glGetInternalformatSampleivNV: + adrp x16, ___blue_glCore_glGetInternalformatSampleivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetInternalformatSampleivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTextureSubImage3DEXT +.private_extern _bluegl_glGenOcclusionQueriesNV .align 2 -_bluegl_glCompressedTextureSubImage3DEXT: - adrp x16, ___blue_glCore_glCompressedTextureSubImage3DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTextureSubImage3DEXT@GOTPAGEOFF] +_bluegl_glGenOcclusionQueriesNV: + adrp x16, ___blue_glCore_glGenOcclusionQueriesNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenOcclusionQueriesNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPointervEXT +.private_extern _bluegl_glDeleteOcclusionQueriesNV .align 2 -_bluegl_glGetPointervEXT: - adrp x16, ___blue_glCore_glGetPointervEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPointervEXT@GOTPAGEOFF] +_bluegl_glDeleteOcclusionQueriesNV: + adrp x16, ___blue_glCore_glDeleteOcclusionQueriesNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteOcclusionQueriesNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMinmaxParameterfvEXT +.private_extern _bluegl_glIsOcclusionQueryNV .align 2 -_bluegl_glGetMinmaxParameterfvEXT: - adrp x16, ___blue_glCore_glGetMinmaxParameterfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMinmaxParameterfvEXT@GOTPAGEOFF] +_bluegl_glIsOcclusionQueryNV: + adrp x16, ___blue_glCore_glIsOcclusionQueryNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsOcclusionQueryNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4sARB +.private_extern _bluegl_glBeginOcclusionQueryNV .align 2 -_bluegl_glMultiTexCoord4sARB: - adrp x16, ___blue_glCore_glMultiTexCoord4sARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4sARB@GOTPAGEOFF] +_bluegl_glBeginOcclusionQueryNV: + adrp x16, ___blue_glCore_glBeginOcclusionQueryNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBeginOcclusionQueryNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawElementsInstancedBaseVertexBaseInstance +.private_extern _bluegl_glEndOcclusionQueryNV .align 2 -_bluegl_glDrawElementsInstancedBaseVertexBaseInstance: - adrp x16, ___blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance@GOTPAGEOFF] +_bluegl_glEndOcclusionQueryNV: + adrp x16, ___blue_glCore_glEndOcclusionQueryNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEndOcclusionQueryNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVDPAUSurfaceAccessNV +.private_extern _bluegl_glGetOcclusionQueryivNV .align 2 -_bluegl_glVDPAUSurfaceAccessNV: - adrp x16, ___blue_glCore_glVDPAUSurfaceAccessNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVDPAUSurfaceAccessNV@GOTPAGEOFF] +_bluegl_glGetOcclusionQueryivNV: + adrp x16, ___blue_glCore_glGetOcclusionQueryivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetOcclusionQueryivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2iARB +.private_extern _bluegl_glGetOcclusionQueryuivNV .align 2 -_bluegl_glMultiTexCoord2iARB: - adrp x16, ___blue_glCore_glMultiTexCoord2iARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2iARB@GOTPAGEOFF] +_bluegl_glGetOcclusionQueryuivNV: + adrp x16, ___blue_glCore_glGetOcclusionQueryuivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetOcclusionQueryuivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathCommandsNV +.private_extern _bluegl_glProgramBufferParametersfvNV .align 2 -_bluegl_glPathCommandsNV: - adrp x16, ___blue_glCore_glPathCommandsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathCommandsNV@GOTPAGEOFF] +_bluegl_glProgramBufferParametersfvNV: + adrp x16, ___blue_glCore_glProgramBufferParametersfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramBufferParametersfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSetMultisamplefvAMD +.private_extern _bluegl_glProgramBufferParametersIivNV .align 2 -_bluegl_glSetMultisamplefvAMD: - adrp x16, ___blue_glCore_glSetMultisamplefvAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSetMultisamplefvAMD@GOTPAGEOFF] +_bluegl_glProgramBufferParametersIivNV: + adrp x16, ___blue_glCore_glProgramBufferParametersIivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramBufferParametersIivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream3ivATI +.private_extern _bluegl_glProgramBufferParametersIuivNV .align 2 -_bluegl_glVertexStream3ivATI: - adrp x16, ___blue_glCore_glVertexStream3ivATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream3ivATI@GOTPAGEOFF] +_bluegl_glProgramBufferParametersIuivNV: + adrp x16, ___blue_glCore_glProgramBufferParametersIuivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramBufferParametersIuivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVDPAUUnregisterSurfaceNV +.private_extern _bluegl_glGenPathsNV .align 2 -_bluegl_glVDPAUUnregisterSurfaceNV: - adrp x16, ___blue_glCore_glVDPAUUnregisterSurfaceNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVDPAUUnregisterSurfaceNV@GOTPAGEOFF] +_bluegl_glGenPathsNV: + adrp x16, ___blue_glCore_glGenPathsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenPathsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureRenderbufferEXT +.private_extern _bluegl_glDeletePathsNV .align 2 -_bluegl_glTextureRenderbufferEXT: - adrp x16, ___blue_glCore_glTextureRenderbufferEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureRenderbufferEXT@GOTPAGEOFF] +_bluegl_glDeletePathsNV: + adrp x16, ___blue_glCore_glDeletePathsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeletePathsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramLocalParameter4dARB +.private_extern _bluegl_glIsPathNV .align 2 -_bluegl_glProgramLocalParameter4dARB: - adrp x16, ___blue_glCore_glProgramLocalParameter4dARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramLocalParameter4dARB@GOTPAGEOFF] +_bluegl_glIsPathNV: + adrp x16, ___blue_glCore_glIsPathNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsPathNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindVertexShaderEXT +.private_extern _bluegl_glPathCommandsNV .align 2 -_bluegl_glBindVertexShaderEXT: - adrp x16, ___blue_glCore_glBindVertexShaderEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindVertexShaderEXT@GOTPAGEOFF] +_bluegl_glPathCommandsNV: + adrp x16, ___blue_glCore_glPathCommandsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathCommandsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEnableVariantClientStateEXT +.private_extern _bluegl_glPathCoordsNV .align 2 -_bluegl_glEnableVariantClientStateEXT: - adrp x16, ___blue_glCore_glEnableVariantClientStateEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEnableVariantClientStateEXT@GOTPAGEOFF] +_bluegl_glPathCoordsNV: + adrp x16, ___blue_glCore_glPathCoordsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathCoordsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPointerIndexedvEXT +.private_extern _bluegl_glPathSubCommandsNV .align 2 -_bluegl_glGetPointerIndexedvEXT: - adrp x16, ___blue_glCore_glGetPointerIndexedvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPointerIndexedvEXT@GOTPAGEOFF] +_bluegl_glPathSubCommandsNV: + adrp x16, ___blue_glCore_glPathSubCommandsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathSubCommandsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexEnvfEXT +.private_extern _bluegl_glPathSubCoordsNV .align 2 -_bluegl_glMultiTexEnvfEXT: - adrp x16, ___blue_glCore_glMultiTexEnvfEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexEnvfEXT@GOTPAGEOFF] +_bluegl_glPathSubCoordsNV: + adrp x16, ___blue_glCore_glPathSubCoordsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathSubCoordsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFrustumxOES +.private_extern _bluegl_glPathStringNV .align 2 -_bluegl_glFrustumxOES: - adrp x16, ___blue_glCore_glFrustumxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFrustumxOES@GOTPAGEOFF] +_bluegl_glPathStringNV: + adrp x16, ___blue_glCore_glPathStringNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathStringNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glAreProgramsResidentNV +.private_extern _bluegl_glPathGlyphsNV .align 2 -_bluegl_glAreProgramsResidentNV: - adrp x16, ___blue_glCore_glAreProgramsResidentNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glAreProgramsResidentNV@GOTPAGEOFF] +_bluegl_glPathGlyphsNV: + adrp x16, ___blue_glCore_glPathGlyphsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathGlyphsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferSampleLocationsfvNV +.private_extern _bluegl_glPathGlyphRangeNV .align 2 -_bluegl_glFramebufferSampleLocationsfvNV: - adrp x16, ___blue_glCore_glFramebufferSampleLocationsfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferSampleLocationsfvNV@GOTPAGEOFF] +_bluegl_glPathGlyphRangeNV: + adrp x16, ___blue_glCore_glPathGlyphRangeNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathGlyphRangeNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1sNV +.private_extern _bluegl_glWeightPathsNV .align 2 -_bluegl_glVertexAttrib1sNV: - adrp x16, ___blue_glCore_glVertexAttrib1sNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1sNV@GOTPAGEOFF] +_bluegl_glWeightPathsNV: + adrp x16, ___blue_glCore_glWeightPathsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glWeightPathsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetActiveUniformBlockName +.private_extern _bluegl_glCopyPathNV .align 2 -_bluegl_glGetActiveUniformBlockName: - adrp x16, ___blue_glCore_glGetActiveUniformBlockName@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetActiveUniformBlockName@GOTPAGEOFF] +_bluegl_glCopyPathNV: + adrp x16, ___blue_glCore_glCopyPathNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyPathNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertex2xOES +.private_extern _bluegl_glInterpolatePathsNV .align 2 -_bluegl_glVertex2xOES: - adrp x16, ___blue_glCore_glVertex2xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertex2xOES@GOTPAGEOFF] +_bluegl_glInterpolatePathsNV: + adrp x16, ___blue_glCore_glInterpolatePathsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glInterpolatePathsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glResetMinmaxEXT +.private_extern _bluegl_glTransformPathNV .align 2 -_bluegl_glResetMinmaxEXT: - adrp x16, ___blue_glCore_glResetMinmaxEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glResetMinmaxEXT@GOTPAGEOFF] +_bluegl_glTransformPathNV: + adrp x16, ___blue_glCore_glTransformPathNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTransformPathNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixOrthoEXT +.private_extern _bluegl_glPathParameterivNV .align 2 -_bluegl_glMatrixOrthoEXT: - adrp x16, ___blue_glCore_glMatrixOrthoEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixOrthoEXT@GOTPAGEOFF] +_bluegl_glPathParameterivNV: + adrp x16, ___blue_glCore_glPathParameterivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathParameterivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4ui64vNV +.private_extern _bluegl_glPathParameteriNV .align 2 -_bluegl_glUniform4ui64vNV: - adrp x16, ___blue_glCore_glUniform4ui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4ui64vNV@GOTPAGEOFF] +_bluegl_glPathParameteriNV: + adrp x16, ___blue_glCore_glPathParameteriNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathParameteriNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix4x3fvEXT +.private_extern _bluegl_glPathParameterfvNV .align 2 -_bluegl_glProgramUniformMatrix4x3fvEXT: - adrp x16, ___blue_glCore_glProgramUniformMatrix4x3fvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4x3fvEXT@GOTPAGEOFF] +_bluegl_glPathParameterfvNV: + adrp x16, ___blue_glCore_glPathParameterfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathParameterfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribs1svNV +.private_extern _bluegl_glPathParameterfNV .align 2 -_bluegl_glVertexAttribs1svNV: - adrp x16, ___blue_glCore_glVertexAttribs1svNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribs1svNV@GOTPAGEOFF] +_bluegl_glPathParameterfNV: + adrp x16, ___blue_glCore_glPathParameterfNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathParameterfNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDebugMessageCallbackAMD +.private_extern _bluegl_glPathDashArrayNV .align 2 -_bluegl_glDebugMessageCallbackAMD: - adrp x16, ___blue_glCore_glDebugMessageCallbackAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDebugMessageCallbackAMD@GOTPAGEOFF] +_bluegl_glPathDashArrayNV: + adrp x16, ___blue_glCore_glPathDashArrayNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathDashArrayNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1uiEXT +.private_extern _bluegl_glPathStencilFuncNV .align 2 -_bluegl_glProgramUniform1uiEXT: - adrp x16, ___blue_glCore_glProgramUniform1uiEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1uiEXT@GOTPAGEOFF] +_bluegl_glPathStencilFuncNV: + adrp x16, ___blue_glCore_glPathStencilFuncNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathStencilFuncNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexBufferEXT +.private_extern _bluegl_glPathStencilDepthOffsetNV .align 2 -_bluegl_glTexBufferEXT: - adrp x16, ___blue_glCore_glTexBufferEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexBufferEXT@GOTPAGEOFF] +_bluegl_glPathStencilDepthOffsetNV: + adrp x16, ___blue_glCore_glPathStencilDepthOffsetNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathStencilDepthOffsetNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4f +.private_extern _bluegl_glStencilFillPathNV .align 2 -_bluegl_glUniform4f: - adrp x16, ___blue_glCore_glUniform4f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4f@GOTPAGEOFF] +_bluegl_glStencilFillPathNV: + adrp x16, ___blue_glCore_glStencilFillPathNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStencilFillPathNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUpdateObjectBufferATI +.private_extern _bluegl_glStencilStrokePathNV .align 2 -_bluegl_glUpdateObjectBufferATI: - adrp x16, ___blue_glCore_glUpdateObjectBufferATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUpdateObjectBufferATI@GOTPAGEOFF] +_bluegl_glStencilStrokePathNV: + adrp x16, ___blue_glCore_glStencilStrokePathNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStencilStrokePathNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1iEXT +.private_extern _bluegl_glStencilFillPathInstancedNV .align 2 -_bluegl_glProgramUniform1iEXT: - adrp x16, ___blue_glCore_glProgramUniform1iEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1iEXT@GOTPAGEOFF] +_bluegl_glStencilFillPathInstancedNV: + adrp x16, ___blue_glCore_glStencilFillPathInstancedNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStencilFillPathInstancedNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMultiTexEnvfvEXT +.private_extern _bluegl_glStencilStrokePathInstancedNV .align 2 -_bluegl_glGetMultiTexEnvfvEXT: - adrp x16, ___blue_glCore_glGetMultiTexEnvfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMultiTexEnvfvEXT@GOTPAGEOFF] +_bluegl_glStencilStrokePathInstancedNV: + adrp x16, ___blue_glCore_glStencilStrokePathInstancedNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStencilStrokePathInstancedNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL2d +.private_extern _bluegl_glPathCoverDepthFuncNV .align 2 -_bluegl_glVertexAttribL2d: - adrp x16, ___blue_glCore_glVertexAttribL2d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL2d@GOTPAGEOFF] +_bluegl_glPathCoverDepthFuncNV: + adrp x16, ___blue_glCore_glPathCoverDepthFuncNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathCoverDepthFuncNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glConvolutionParameterxOES +.private_extern _bluegl_glCoverFillPathNV .align 2 -_bluegl_glConvolutionParameterxOES: - adrp x16, ___blue_glCore_glConvolutionParameterxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glConvolutionParameterxOES@GOTPAGEOFF] +_bluegl_glCoverFillPathNV: + adrp x16, ___blue_glCore_glCoverFillPathNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCoverFillPathNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribArrayObjectivATI +.private_extern _bluegl_glCoverStrokePathNV .align 2 -_bluegl_glGetVertexAttribArrayObjectivATI: - adrp x16, ___blue_glCore_glGetVertexAttribArrayObjectivATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribArrayObjectivATI@GOTPAGEOFF] +_bluegl_glCoverStrokePathNV: + adrp x16, ___blue_glCore_glCoverStrokePathNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCoverStrokePathNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetListParameterfvSGIX +.private_extern _bluegl_glCoverFillPathInstancedNV .align 2 -_bluegl_glGetListParameterfvSGIX: - adrp x16, ___blue_glCore_glGetListParameterfvSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetListParameterfvSGIX@GOTPAGEOFF] +_bluegl_glCoverFillPathInstancedNV: + adrp x16, ___blue_glCore_glCoverFillPathInstancedNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCoverFillPathInstancedNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glInstrumentsBufferSGIX +.private_extern _bluegl_glCoverStrokePathInstancedNV .align 2 -_bluegl_glInstrumentsBufferSGIX: - adrp x16, ___blue_glCore_glInstrumentsBufferSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glInstrumentsBufferSGIX@GOTPAGEOFF] +_bluegl_glCoverStrokePathInstancedNV: + adrp x16, ___blue_glCore_glCoverStrokePathInstancedNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCoverStrokePathInstancedNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteNamesAMD +.private_extern _bluegl_glGetPathParameterivNV .align 2 -_bluegl_glDeleteNamesAMD: - adrp x16, ___blue_glCore_glDeleteNamesAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteNamesAMD@GOTPAGEOFF] +_bluegl_glGetPathParameterivNV: + adrp x16, ___blue_glCore_glGetPathParameterivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPathParameterivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetSubroutineIndex +.private_extern _bluegl_glGetPathParameterfvNV .align 2 -_bluegl_glGetSubroutineIndex: - adrp x16, ___blue_glCore_glGetSubroutineIndex@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetSubroutineIndex@GOTPAGEOFF] +_bluegl_glGetPathParameterfvNV: + adrp x16, ___blue_glCore_glGetPathParameterfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPathParameterfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVideoCaptureStreamParameterivNV +.private_extern _bluegl_glGetPathCommandsNV .align 2 -_bluegl_glVideoCaptureStreamParameterivNV: - adrp x16, ___blue_glCore_glVideoCaptureStreamParameterivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVideoCaptureStreamParameterivNV@GOTPAGEOFF] +_bluegl_glGetPathCommandsNV: + adrp x16, ___blue_glCore_glGetPathCommandsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPathCommandsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4i +.private_extern _bluegl_glGetPathCoordsNV .align 2 -_bluegl_glMultiTexCoord4i: - adrp x16, ___blue_glCore_glMultiTexCoord4i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4i@GOTPAGEOFF] +_bluegl_glGetPathCoordsNV: + adrp x16, ___blue_glCore_glGetPathCoordsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPathCoordsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFramebufferParameteriv +.private_extern _bluegl_glGetPathDashArrayNV .align 2 -_bluegl_glGetFramebufferParameteriv: - adrp x16, ___blue_glCore_glGetFramebufferParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFramebufferParameteriv@GOTPAGEOFF] +_bluegl_glGetPathDashArrayNV: + adrp x16, ___blue_glCore_glGetPathDashArrayNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPathDashArrayNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2hvNV +.private_extern _bluegl_glGetPathMetricsNV .align 2 -_bluegl_glVertexAttrib2hvNV: - adrp x16, ___blue_glCore_glVertexAttrib2hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2hvNV@GOTPAGEOFF] +_bluegl_glGetPathMetricsNV: + adrp x16, ___blue_glCore_glGetPathMetricsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPathMetricsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMakeBufferNonResidentNV +.private_extern _bluegl_glGetPathMetricRangeNV .align 2 -_bluegl_glMakeBufferNonResidentNV: - adrp x16, ___blue_glCore_glMakeBufferNonResidentNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMakeBufferNonResidentNV@GOTPAGEOFF] +_bluegl_glGetPathMetricRangeNV: + adrp x16, ___blue_glCore_glGetPathMetricRangeNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPathMetricRangeNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPixelDataRangeNV +.private_extern _bluegl_glGetPathSpacingNV .align 2 -_bluegl_glPixelDataRangeNV: - adrp x16, ___blue_glCore_glPixelDataRangeNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPixelDataRangeNV@GOTPAGEOFF] +_bluegl_glGetPathSpacingNV: + adrp x16, ___blue_glCore_glGetPathSpacingNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPathSpacingNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedBufferDataEXT +.private_extern _bluegl_glIsPointInFillPathNV .align 2 -_bluegl_glNamedBufferDataEXT: - adrp x16, ___blue_glCore_glNamedBufferDataEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedBufferDataEXT@GOTPAGEOFF] +_bluegl_glIsPointInFillPathNV: + adrp x16, ___blue_glCore_glIsPointInFillPathNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsPointInFillPathNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsImageHandleResidentARB +.private_extern _bluegl_glIsPointInStrokePathNV .align 2 -_bluegl_glIsImageHandleResidentARB: - adrp x16, ___blue_glCore_glIsImageHandleResidentARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsImageHandleResidentARB@GOTPAGEOFF] +_bluegl_glIsPointInStrokePathNV: + adrp x16, ___blue_glCore_glIsPointInStrokePathNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsPointInStrokePathNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFrustumfOES +.private_extern _bluegl_glGetPathLengthNV .align 2 -_bluegl_glFrustumfOES: - adrp x16, ___blue_glCore_glFrustumfOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFrustumfOES@GOTPAGEOFF] +_bluegl_glGetPathLengthNV: + adrp x16, ___blue_glCore_glGetPathLengthNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPathLengthNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetArrayObjectivATI +.private_extern _bluegl_glPointAlongPathNV .align 2 -_bluegl_glGetArrayObjectivATI: - adrp x16, ___blue_glCore_glGetArrayObjectivATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetArrayObjectivATI@GOTPAGEOFF] +_bluegl_glPointAlongPathNV: + adrp x16, ___blue_glCore_glPointAlongPathNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPointAlongPathNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexParameterIuivEXT +.private_extern _bluegl_glMatrixLoad3x2fNV .align 2 -_bluegl_glMultiTexParameterIuivEXT: - adrp x16, ___blue_glCore_glMultiTexParameterIuivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexParameterIuivEXT@GOTPAGEOFF] +_bluegl_glMatrixLoad3x2fNV: + adrp x16, ___blue_glCore_glMatrixLoad3x2fNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixLoad3x2fNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMapParameterfvNV +.private_extern _bluegl_glMatrixLoad3x3fNV .align 2 -_bluegl_glGetMapParameterfvNV: - adrp x16, ___blue_glCore_glGetMapParameterfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMapParameterfvNV@GOTPAGEOFF] +_bluegl_glMatrixLoad3x3fNV: + adrp x16, ___blue_glCore_glMatrixLoad3x3fNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixLoad3x3fNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultTransposeMatrixxOES +.private_extern _bluegl_glMatrixLoadTranspose3x3fNV .align 2 -_bluegl_glMultTransposeMatrixxOES: - adrp x16, ___blue_glCore_glMultTransposeMatrixxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultTransposeMatrixxOES@GOTPAGEOFF] +_bluegl_glMatrixLoadTranspose3x3fNV: + adrp x16, ___blue_glCore_glMatrixLoadTranspose3x3fNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixLoadTranspose3x3fNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPerfMonitorCounterDataAMD +.private_extern _bluegl_glMatrixMult3x2fNV .align 2 -_bluegl_glGetPerfMonitorCounterDataAMD: - adrp x16, ___blue_glCore_glGetPerfMonitorCounterDataAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPerfMonitorCounterDataAMD@GOTPAGEOFF] +_bluegl_glMatrixMult3x2fNV: + adrp x16, ___blue_glCore_glMatrixMult3x2fNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixMult3x2fNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearDepthxOES +.private_extern _bluegl_glMatrixMult3x3fNV .align 2 -_bluegl_glClearDepthxOES: - adrp x16, ___blue_glCore_glClearDepthxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearDepthxOES@GOTPAGEOFF] +_bluegl_glMatrixMult3x3fNV: + adrp x16, ___blue_glCore_glMatrixMult3x3fNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixMult3x3fNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColor3xvOES +.private_extern _bluegl_glMatrixMultTranspose3x3fNV .align 2 -_bluegl_glColor3xvOES: - adrp x16, ___blue_glCore_glColor3xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColor3xvOES@GOTPAGEOFF] +_bluegl_glMatrixMultTranspose3x3fNV: + adrp x16, ___blue_glCore_glMatrixMultTranspose3x3fNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMatrixMultTranspose3x3fNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI4ivEXT +.private_extern _bluegl_glStencilThenCoverFillPathNV .align 2 -_bluegl_glVertexAttribI4ivEXT: - adrp x16, ___blue_glCore_glVertexAttribI4ivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI4ivEXT@GOTPAGEOFF] +_bluegl_glStencilThenCoverFillPathNV: + adrp x16, ___blue_glCore_glStencilThenCoverFillPathNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStencilThenCoverFillPathNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoordP4uiv +.private_extern _bluegl_glStencilThenCoverStrokePathNV .align 2 -_bluegl_glMultiTexCoordP4uiv: - adrp x16, ___blue_glCore_glMultiTexCoordP4uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoordP4uiv@GOTPAGEOFF] +_bluegl_glStencilThenCoverStrokePathNV: + adrp x16, ___blue_glCore_glStencilThenCoverStrokePathNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStencilThenCoverStrokePathNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI4usv +.private_extern _bluegl_glStencilThenCoverFillPathInstancedNV .align 2 -_bluegl_glVertexAttribI4usv: - adrp x16, ___blue_glCore_glVertexAttribI4usv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI4usv@GOTPAGEOFF] +_bluegl_glStencilThenCoverFillPathInstancedNV: + adrp x16, ___blue_glCore_glStencilThenCoverFillPathInstancedNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStencilThenCoverFillPathInstancedNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnTexImage +.private_extern _bluegl_glStencilThenCoverStrokePathInstancedNV .align 2 -_bluegl_glGetnTexImage: - adrp x16, ___blue_glCore_glGetnTexImage@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnTexImage@GOTPAGEOFF] +_bluegl_glStencilThenCoverStrokePathInstancedNV: + adrp x16, ___blue_glCore_glStencilThenCoverStrokePathInstancedNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStencilThenCoverStrokePathInstancedNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReadBuffer +.private_extern _bluegl_glPathGlyphIndexRangeNV .align 2 -_bluegl_glReadBuffer: - adrp x16, ___blue_glCore_glReadBuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReadBuffer@GOTPAGEOFF] +_bluegl_glPathGlyphIndexRangeNV: + adrp x16, ___blue_glCore_glPathGlyphIndexRangeNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathGlyphIndexRangeNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3iARB +.private_extern _bluegl_glPathGlyphIndexArrayNV .align 2 -_bluegl_glUniform3iARB: - adrp x16, ___blue_glCore_glUniform3iARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3iARB@GOTPAGEOFF] +_bluegl_glPathGlyphIndexArrayNV: + adrp x16, ___blue_glCore_glPathGlyphIndexArrayNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathGlyphIndexArrayNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexBufferEXT +.private_extern _bluegl_glPathMemoryGlyphIndexArrayNV .align 2 -_bluegl_glMultiTexBufferEXT: - adrp x16, ___blue_glCore_glMultiTexBufferEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexBufferEXT@GOTPAGEOFF] +_bluegl_glPathMemoryGlyphIndexArrayNV: + adrp x16, ___blue_glCore_glPathMemoryGlyphIndexArrayNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathMemoryGlyphIndexArrayNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormalStream3fvATI +.private_extern _bluegl_glProgramPathFragmentInputGenNV .align 2 -_bluegl_glNormalStream3fvATI: - adrp x16, ___blue_glCore_glNormalStream3fvATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormalStream3fvATI@GOTPAGEOFF] +_bluegl_glProgramPathFragmentInputGenNV: + adrp x16, ___blue_glCore_glProgramPathFragmentInputGenNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramPathFragmentInputGenNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteVertexShaderEXT +.private_extern _bluegl_glGetProgramResourcefvNV .align 2 -_bluegl_glDeleteVertexShaderEXT: - adrp x16, ___blue_glCore_glDeleteVertexShaderEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteVertexShaderEXT@GOTPAGEOFF] +_bluegl_glGetProgramResourcefvNV: + adrp x16, ___blue_glCore_glGetProgramResourcefvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramResourcefvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3hvNV +.private_extern _bluegl_glPathColorGenNV .align 2 -_bluegl_glVertexAttrib3hvNV: - adrp x16, ___blue_glCore_glVertexAttrib3hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3hvNV@GOTPAGEOFF] +_bluegl_glPathColorGenNV: + adrp x16, ___blue_glCore_glPathColorGenNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathColorGenNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawMeshArraysSUN +.private_extern _bluegl_glPathTexGenNV .align 2 -_bluegl_glDrawMeshArraysSUN: - adrp x16, ___blue_glCore_glDrawMeshArraysSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawMeshArraysSUN@GOTPAGEOFF] +_bluegl_glPathTexGenNV: + adrp x16, ___blue_glCore_glPathTexGenNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathTexGenNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL3dvEXT +.private_extern _bluegl_glPathFogGenNV .align 2 -_bluegl_glVertexAttribL3dvEXT: - adrp x16, ___blue_glCore_glVertexAttribL3dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL3dvEXT@GOTPAGEOFF] +_bluegl_glPathFogGenNV: + adrp x16, ___blue_glCore_glPathFogGenNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPathFogGenNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeuiColor3fVertex3fSUN +.private_extern _bluegl_glGetPathColorGenivNV .align 2 -_bluegl_glReplacementCodeuiColor3fVertex3fSUN: - adrp x16, ___blue_glCore_glReplacementCodeuiColor3fVertex3fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeuiColor3fVertex3fSUN@GOTPAGEOFF] +_bluegl_glGetPathColorGenivNV: + adrp x16, ___blue_glCore_glGetPathColorGenivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPathColorGenivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1fv +.private_extern _bluegl_glGetPathColorGenfvNV .align 2 -_bluegl_glProgramUniform1fv: - adrp x16, ___blue_glCore_glProgramUniform1fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1fv@GOTPAGEOFF] +_bluegl_glGetPathColorGenfvNV: + adrp x16, ___blue_glCore_glGetPathColorGenfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPathColorGenfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormal3xvOES +.private_extern _bluegl_glGetPathTexGenivNV .align 2 -_bluegl_glNormal3xvOES: - adrp x16, ___blue_glCore_glNormal3xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormal3xvOES@GOTPAGEOFF] +_bluegl_glGetPathTexGenivNV: + adrp x16, ___blue_glCore_glGetPathTexGenivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPathTexGenivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramStageiv +.private_extern _bluegl_glGetPathTexGenfvNV .align 2 -_bluegl_glGetProgramStageiv: - adrp x16, ___blue_glCore_glGetProgramStageiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramStageiv@GOTPAGEOFF] +_bluegl_glGetPathTexGenfvNV: + adrp x16, ___blue_glCore_glGetPathTexGenfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPathTexGenfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2ui64NV +.private_extern _bluegl_glPixelDataRangeNV .align 2 -_bluegl_glUniform2ui64NV: - adrp x16, ___blue_glCore_glUniform2ui64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2ui64NV@GOTPAGEOFF] +_bluegl_glPixelDataRangeNV: + adrp x16, ___blue_glCore_glPixelDataRangeNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPixelDataRangeNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramEnvParameter4fARB +.private_extern _bluegl_glFlushPixelDataRangeNV .align 2 -_bluegl_glProgramEnvParameter4fARB: - adrp x16, ___blue_glCore_glProgramEnvParameter4fARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramEnvParameter4fARB@GOTPAGEOFF] +_bluegl_glFlushPixelDataRangeNV: + adrp x16, ___blue_glCore_glFlushPixelDataRangeNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFlushPixelDataRangeNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPixelTransformParameterivEXT +.private_extern _bluegl_glPointParameteriNV .align 2 -_bluegl_glPixelTransformParameterivEXT: - adrp x16, ___blue_glCore_glPixelTransformParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPixelTransformParameterivEXT@GOTPAGEOFF] +_bluegl_glPointParameteriNV: + adrp x16, ___blue_glCore_glPointParameteriNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPointParameteriNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos4dvMESA +.private_extern _bluegl_glPointParameterivNV .align 2 -_bluegl_glWindowPos4dvMESA: - adrp x16, ___blue_glCore_glWindowPos4dvMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos4dvMESA@GOTPAGEOFF] +_bluegl_glPointParameterivNV: + adrp x16, ___blue_glCore_glPointParameterivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPointParameterivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiDrawElementsIndirectBindlessCountNV +.private_extern _bluegl_glPresentFrameKeyedNV .align 2 -_bluegl_glMultiDrawElementsIndirectBindlessCountNV: - adrp x16, ___blue_glCore_glMultiDrawElementsIndirectBindlessCountNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiDrawElementsIndirectBindlessCountNV@GOTPAGEOFF] +_bluegl_glPresentFrameKeyedNV: + adrp x16, ___blue_glCore_glPresentFrameKeyedNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPresentFrameKeyedNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3i64vARB +.private_extern _bluegl_glPresentFrameDualFillNV .align 2 -_bluegl_glUniform3i64vARB: - adrp x16, ___blue_glCore_glUniform3i64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3i64vARB@GOTPAGEOFF] +_bluegl_glPresentFrameDualFillNV: + adrp x16, ___blue_glCore_glPresentFrameDualFillNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPresentFrameDualFillNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureStorage3DMultisample +.private_extern _bluegl_glGetVideoivNV .align 2 -_bluegl_glTextureStorage3DMultisample: - adrp x16, ___blue_glCore_glTextureStorage3DMultisample@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureStorage3DMultisample@GOTPAGEOFF] +_bluegl_glGetVideoivNV: + adrp x16, ___blue_glCore_glGetVideoivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVideoivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedBufferParameterui64vNV +.private_extern _bluegl_glGetVideouivNV .align 2 -_bluegl_glGetNamedBufferParameterui64vNV: - adrp x16, ___blue_glCore_glGetNamedBufferParameterui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedBufferParameterui64vNV@GOTPAGEOFF] +_bluegl_glGetVideouivNV: + adrp x16, ___blue_glCore_glGetVideouivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVideouivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEndTransformFeedback +.private_extern _bluegl_glGetVideoi64vNV .align 2 -_bluegl_glEndTransformFeedback: - adrp x16, ___blue_glCore_glEndTransformFeedback@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEndTransformFeedback@GOTPAGEOFF] +_bluegl_glGetVideoi64vNV: + adrp x16, ___blue_glCore_glGetVideoi64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVideoi64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI3ivEXT +.private_extern _bluegl_glGetVideoui64vNV .align 2 -_bluegl_glVertexAttribI3ivEXT: - adrp x16, ___blue_glCore_glVertexAttribI3ivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI3ivEXT@GOTPAGEOFF] +_bluegl_glGetVideoui64vNV: + adrp x16, ___blue_glCore_glGetVideoui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVideoui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2f +.private_extern _bluegl_glPrimitiveRestartNV .align 2 -_bluegl_glUniform2f: - adrp x16, ___blue_glCore_glUniform2f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2f@GOTPAGEOFF] +_bluegl_glPrimitiveRestartNV: + adrp x16, ___blue_glCore_glPrimitiveRestartNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPrimitiveRestartNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1dARB +.private_extern _bluegl_glPrimitiveRestartIndexNV .align 2 -_bluegl_glMultiTexCoord1dARB: - adrp x16, ___blue_glCore_glMultiTexCoord1dARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1dARB@GOTPAGEOFF] +_bluegl_glPrimitiveRestartIndexNV: + adrp x16, ___blue_glCore_glPrimitiveRestartIndexNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPrimitiveRestartIndexNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetColorTableParameterfv +.private_extern _bluegl_glCombinerParameterfvNV .align 2 -_bluegl_glGetColorTableParameterfv: - adrp x16, ___blue_glCore_glGetColorTableParameterfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetColorTableParameterfv@GOTPAGEOFF] +_bluegl_glCombinerParameterfvNV: + adrp x16, ___blue_glCore_glCombinerParameterfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCombinerParameterfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3d +.private_extern _bluegl_glCombinerParameterfNV .align 2 -_bluegl_glWindowPos3d: - adrp x16, ___blue_glCore_glWindowPos3d@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3d@GOTPAGEOFF] +_bluegl_glCombinerParameterfNV: + adrp x16, ___blue_glCore_glCombinerParameterfNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCombinerParameterfNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL3ui64vNV +.private_extern _bluegl_glCombinerParameterivNV .align 2 -_bluegl_glVertexAttribL3ui64vNV: - adrp x16, ___blue_glCore_glVertexAttribL3ui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL3ui64vNV@GOTPAGEOFF] +_bluegl_glCombinerParameterivNV: + adrp x16, ___blue_glCore_glCombinerParameterivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCombinerParameterivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeuiSUN +.private_extern _bluegl_glCombinerParameteriNV .align 2 -_bluegl_glReplacementCodeuiSUN: - adrp x16, ___blue_glCore_glReplacementCodeuiSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeuiSUN@GOTPAGEOFF] +_bluegl_glCombinerParameteriNV: + adrp x16, ___blue_glCore_glCombinerParameteriNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCombinerParameteriNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColor4ubVertex3fSUN +.private_extern _bluegl_glCombinerInputNV .align 2 -_bluegl_glColor4ubVertex3fSUN: - adrp x16, ___blue_glCore_glColor4ubVertex3fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColor4ubVertex3fSUN@GOTPAGEOFF] +_bluegl_glCombinerInputNV: + adrp x16, ___blue_glCore_glCombinerInputNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCombinerInputNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawRangeElementsBaseVertex +.private_extern _bluegl_glCombinerOutputNV .align 2 -_bluegl_glDrawRangeElementsBaseVertex: - adrp x16, ___blue_glCore_glDrawRangeElementsBaseVertex@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawRangeElementsBaseVertex@GOTPAGEOFF] +_bluegl_glCombinerOutputNV: + adrp x16, ___blue_glCore_glCombinerOutputNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCombinerOutputNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetMultiTexParameterivEXT +.private_extern _bluegl_glFinalCombinerInputNV .align 2 -_bluegl_glGetMultiTexParameterivEXT: - adrp x16, ___blue_glCore_glGetMultiTexParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetMultiTexParameterivEXT@GOTPAGEOFF] +_bluegl_glFinalCombinerInputNV: + adrp x16, ___blue_glCore_glFinalCombinerInputNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFinalCombinerInputNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3hvNV +.private_extern _bluegl_glGetCombinerInputParameterfvNV .align 2 -_bluegl_glMultiTexCoord3hvNV: - adrp x16, ___blue_glCore_glMultiTexCoord3hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3hvNV@GOTPAGEOFF] +_bluegl_glGetCombinerInputParameterfvNV: + adrp x16, ___blue_glCore_glGetCombinerInputParameterfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetCombinerInputParameterfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetQueryBufferObjectuiv +.private_extern _bluegl_glGetCombinerInputParameterivNV .align 2 -_bluegl_glGetQueryBufferObjectuiv: - adrp x16, ___blue_glCore_glGetQueryBufferObjectuiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetQueryBufferObjectuiv@GOTPAGEOFF] +_bluegl_glGetCombinerInputParameterivNV: + adrp x16, ___blue_glCore_glGetCombinerInputParameterivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetCombinerInputParameterivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPerfMonitorGroupsAMD +.private_extern _bluegl_glGetCombinerOutputParameterfvNV .align 2 -_bluegl_glGetPerfMonitorGroupsAMD: - adrp x16, ___blue_glCore_glGetPerfMonitorGroupsAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPerfMonitorGroupsAMD@GOTPAGEOFF] +_bluegl_glGetCombinerOutputParameterfvNV: + adrp x16, ___blue_glCore_glGetCombinerOutputParameterfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetCombinerOutputParameterfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUnlockArraysEXT +.private_extern _bluegl_glGetCombinerOutputParameterivNV .align 2 -_bluegl_glUnlockArraysEXT: - adrp x16, ___blue_glCore_glUnlockArraysEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUnlockArraysEXT@GOTPAGEOFF] +_bluegl_glGetCombinerOutputParameterivNV: + adrp x16, ___blue_glCore_glGetCombinerOutputParameterivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetCombinerOutputParameterivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPauseTransformFeedback +.private_extern _bluegl_glGetFinalCombinerInputParameterfvNV .align 2 -_bluegl_glPauseTransformFeedback: - adrp x16, ___blue_glCore_glPauseTransformFeedback@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPauseTransformFeedback@GOTPAGEOFF] +_bluegl_glGetFinalCombinerInputParameterfvNV: + adrp x16, ___blue_glCore_glGetFinalCombinerInputParameterfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFinalCombinerInputParameterfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramEnvParameterIivNV +.private_extern _bluegl_glGetFinalCombinerInputParameterivNV .align 2 -_bluegl_glGetProgramEnvParameterIivNV: - adrp x16, ___blue_glCore_glGetProgramEnvParameterIivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramEnvParameterIivNV@GOTPAGEOFF] +_bluegl_glGetFinalCombinerInputParameterivNV: + adrp x16, ___blue_glCore_glGetFinalCombinerInputParameterivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFinalCombinerInputParameterivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathTexGenNV +.private_extern _bluegl_glCombinerStageParameterfvNV .align 2 -_bluegl_glPathTexGenNV: - adrp x16, ___blue_glCore_glPathTexGenNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathTexGenNV@GOTPAGEOFF] +_bluegl_glCombinerStageParameterfvNV: + adrp x16, ___blue_glCore_glCombinerStageParameterfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCombinerStageParameterfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertex3xOES +.private_extern _bluegl_glGetCombinerStageParameterfvNV .align 2 -_bluegl_glVertex3xOES: - adrp x16, ___blue_glCore_glVertex3xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertex3xOES@GOTPAGEOFF] +_bluegl_glGetCombinerStageParameterfvNV: + adrp x16, ___blue_glCore_glGetCombinerStageParameterfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetCombinerStageParameterfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEdgeFlagPointerEXT +.private_extern _bluegl_glFramebufferSampleLocationsfvNV .align 2 -_bluegl_glEdgeFlagPointerEXT: - adrp x16, ___blue_glCore_glEdgeFlagPointerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEdgeFlagPointerEXT@GOTPAGEOFF] +_bluegl_glFramebufferSampleLocationsfvNV: + adrp x16, ___blue_glCore_glFramebufferSampleLocationsfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferSampleLocationsfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribBinding +.private_extern _bluegl_glNamedFramebufferSampleLocationsfvNV .align 2 -_bluegl_glVertexAttribBinding: - adrp x16, ___blue_glCore_glVertexAttribBinding@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribBinding@GOTPAGEOFF] +_bluegl_glNamedFramebufferSampleLocationsfvNV: + adrp x16, ___blue_glCore_glNamedFramebufferSampleLocationsfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNamedFramebufferSampleLocationsfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3f +.private_extern _bluegl_glResolveDepthValuesNV .align 2 -_bluegl_glVertexAttrib3f: - adrp x16, ___blue_glCore_glVertexAttrib3f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3f@GOTPAGEOFF] +_bluegl_glResolveDepthValuesNV: + adrp x16, ___blue_glCore_glResolveDepthValuesNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glResolveDepthValuesNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4NubARB +.private_extern _bluegl_glMakeBufferResidentNV .align 2 -_bluegl_glVertexAttrib4NubARB: - adrp x16, ___blue_glCore_glVertexAttrib4NubARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4NubARB@GOTPAGEOFF] +_bluegl_glMakeBufferResidentNV: + adrp x16, ___blue_glCore_glMakeBufferResidentNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMakeBufferResidentNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2svMESA +.private_extern _bluegl_glMakeBufferNonResidentNV .align 2 -_bluegl_glWindowPos2svMESA: - adrp x16, ___blue_glCore_glWindowPos2svMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2svMESA@GOTPAGEOFF] +_bluegl_glMakeBufferNonResidentNV: + adrp x16, ___blue_glCore_glMakeBufferNonResidentNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMakeBufferNonResidentNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetUniformSubroutineuiv +.private_extern _bluegl_glIsBufferResidentNV .align 2 -_bluegl_glGetUniformSubroutineuiv: - adrp x16, ___blue_glCore_glGetUniformSubroutineuiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetUniformSubroutineuiv@GOTPAGEOFF] +_bluegl_glIsBufferResidentNV: + adrp x16, ___blue_glCore_glIsBufferResidentNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsBufferResidentNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2ivARB +.private_extern _bluegl_glMakeNamedBufferResidentNV .align 2 -_bluegl_glMultiTexCoord2ivARB: - adrp x16, ___blue_glCore_glMultiTexCoord2ivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2ivARB@GOTPAGEOFF] +_bluegl_glMakeNamedBufferResidentNV: + adrp x16, ___blue_glCore_glMakeNamedBufferResidentNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMakeNamedBufferResidentNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFragmentMaterialivSGIX +.private_extern _bluegl_glMakeNamedBufferNonResidentNV .align 2 -_bluegl_glFragmentMaterialivSGIX: - adrp x16, ___blue_glCore_glFragmentMaterialivSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFragmentMaterialivSGIX@GOTPAGEOFF] +_bluegl_glMakeNamedBufferNonResidentNV: + adrp x16, ___blue_glCore_glMakeNamedBufferNonResidentNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glMakeNamedBufferNonResidentNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSamplerParameteriv +.private_extern _bluegl_glIsNamedBufferResidentNV .align 2 -_bluegl_glSamplerParameteriv: - adrp x16, ___blue_glCore_glSamplerParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSamplerParameteriv@GOTPAGEOFF] +_bluegl_glIsNamedBufferResidentNV: + adrp x16, ___blue_glCore_glIsNamedBufferResidentNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsNamedBufferResidentNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayColorOffsetEXT +.private_extern _bluegl_glGetBufferParameterui64vNV .align 2 -_bluegl_glVertexArrayColorOffsetEXT: - adrp x16, ___blue_glCore_glVertexArrayColorOffsetEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayColorOffsetEXT@GOTPAGEOFF] +_bluegl_glGetBufferParameterui64vNV: + adrp x16, ___blue_glCore_glGetBufferParameterui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetBufferParameterui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3sNV +.private_extern _bluegl_glGetNamedBufferParameterui64vNV .align 2 -_bluegl_glVertexAttrib3sNV: - adrp x16, ___blue_glCore_glVertexAttrib3sNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3sNV@GOTPAGEOFF] +_bluegl_glGetNamedBufferParameterui64vNV: + adrp x16, ___blue_glCore_glGetNamedBufferParameterui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetNamedBufferParameterui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawElementsInstanced +.private_extern _bluegl_glGetIntegerui64vNV .align 2 -_bluegl_glDrawElementsInstanced: - adrp x16, ___blue_glCore_glDrawElementsInstanced@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawElementsInstanced@GOTPAGEOFF] +_bluegl_glGetIntegerui64vNV: + adrp x16, ___blue_glCore_glGetIntegerui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetIntegerui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreateSyncFromCLeventARB +.private_extern _bluegl_glUniformui64NV .align 2 -_bluegl_glCreateSyncFromCLeventARB: - adrp x16, ___blue_glCore_glCreateSyncFromCLeventARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreateSyncFromCLeventARB@GOTPAGEOFF] +_bluegl_glUniformui64NV: + adrp x16, ___blue_glCore_glUniformui64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformui64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glInsertEventMarkerEXT +.private_extern _bluegl_glUniformui64vNV .align 2 -_bluegl_glInsertEventMarkerEXT: - adrp x16, ___blue_glCore_glInsertEventMarkerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glInsertEventMarkerEXT@GOTPAGEOFF] +_bluegl_glUniformui64vNV: + adrp x16, ___blue_glCore_glUniformui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glUniformui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureParameterfv +.private_extern _bluegl_glProgramUniformui64NV .align 2 -_bluegl_glGetTextureParameterfv: - adrp x16, ___blue_glCore_glGetTextureParameterfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureParameterfv@GOTPAGEOFF] +_bluegl_glProgramUniformui64NV: + adrp x16, ___blue_glCore_glProgramUniformui64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformui64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyMultiTexImage2DEXT +.private_extern _bluegl_glProgramUniformui64vNV .align 2 -_bluegl_glCopyMultiTexImage2DEXT: - adrp x16, ___blue_glCore_glCopyMultiTexImage2DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyMultiTexImage2DEXT@GOTPAGEOFF] +_bluegl_glProgramUniformui64vNV: + adrp x16, ___blue_glCore_glProgramUniformui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramUniformui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexWeightfEXT +.private_extern _bluegl_glTextureBarrierNV .align 2 -_bluegl_glVertexWeightfEXT: - adrp x16, ___blue_glCore_glVertexWeightfEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexWeightfEXT@GOTPAGEOFF] +_bluegl_glTextureBarrierNV: + adrp x16, ___blue_glCore_glTextureBarrierNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureBarrierNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4i64vARB +.private_extern _bluegl_glTexImage2DMultisampleCoverageNV .align 2 -_bluegl_glUniform4i64vARB: - adrp x16, ___blue_glCore_glUniform4i64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4i64vARB@GOTPAGEOFF] +_bluegl_glTexImage2DMultisampleCoverageNV: + adrp x16, ___blue_glCore_glTexImage2DMultisampleCoverageNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexImage2DMultisampleCoverageNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPathParameterfvNV +.private_extern _bluegl_glTexImage3DMultisampleCoverageNV .align 2 -_bluegl_glGetPathParameterfvNV: - adrp x16, ___blue_glCore_glGetPathParameterfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPathParameterfvNV@GOTPAGEOFF] +_bluegl_glTexImage3DMultisampleCoverageNV: + adrp x16, ___blue_glCore_glTexImage3DMultisampleCoverageNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexImage3DMultisampleCoverageNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBlitNamedFramebuffer +.private_extern _bluegl_glTextureImage2DMultisampleNV .align 2 -_bluegl_glBlitNamedFramebuffer: - adrp x16, ___blue_glCore_glBlitNamedFramebuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBlitNamedFramebuffer@GOTPAGEOFF] +_bluegl_glTextureImage2DMultisampleNV: + adrp x16, ___blue_glCore_glTextureImage2DMultisampleNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureImage2DMultisampleNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoordPointerEXT +.private_extern _bluegl_glTextureImage3DMultisampleNV .align 2 -_bluegl_glTexCoordPointerEXT: - adrp x16, ___blue_glCore_glTexCoordPointerEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoordPointerEXT@GOTPAGEOFF] +_bluegl_glTextureImage3DMultisampleNV: + adrp x16, ___blue_glCore_glTextureImage3DMultisampleNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureImage3DMultisampleNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPathMetricsNV +.private_extern _bluegl_glTextureImage2DMultisampleCoverageNV .align 2 -_bluegl_glGetPathMetricsNV: - adrp x16, ___blue_glCore_glGetPathMetricsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPathMetricsNV@GOTPAGEOFF] +_bluegl_glTextureImage2DMultisampleCoverageNV: + adrp x16, ___blue_glCore_glTextureImage2DMultisampleCoverageNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureImage2DMultisampleCoverageNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL2dvEXT +.private_extern _bluegl_glTextureImage3DMultisampleCoverageNV .align 2 -_bluegl_glVertexAttribL2dvEXT: - adrp x16, ___blue_glCore_glVertexAttribL2dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL2dvEXT@GOTPAGEOFF] +_bluegl_glTextureImage3DMultisampleCoverageNV: + adrp x16, ___blue_glCore_glTextureImage3DMultisampleCoverageNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureImage3DMultisampleCoverageNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVariantuivEXT +.private_extern _bluegl_glBeginTransformFeedbackNV .align 2 -_bluegl_glVariantuivEXT: - adrp x16, ___blue_glCore_glVariantuivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVariantuivEXT@GOTPAGEOFF] +_bluegl_glBeginTransformFeedbackNV: + adrp x16, ___blue_glCore_glBeginTransformFeedbackNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBeginTransformFeedbackNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribdvNV +.private_extern _bluegl_glEndTransformFeedbackNV .align 2 -_bluegl_glGetVertexAttribdvNV: - adrp x16, ___blue_glCore_glGetVertexAttribdvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribdvNV@GOTPAGEOFF] +_bluegl_glEndTransformFeedbackNV: + adrp x16, ___blue_glCore_glEndTransformFeedbackNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEndTransformFeedbackNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFenceSync +.private_extern _bluegl_glTransformFeedbackAttribsNV .align 2 -_bluegl_glFenceSync: - adrp x16, ___blue_glCore_glFenceSync@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFenceSync@GOTPAGEOFF] +_bluegl_glTransformFeedbackAttribsNV: + adrp x16, ___blue_glCore_glTransformFeedbackAttribsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTransformFeedbackAttribsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureParameterIuiv +.private_extern _bluegl_glBindBufferRangeNV .align 2 -_bluegl_glGetTextureParameterIuiv: - adrp x16, ___blue_glCore_glGetTextureParameterIuiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureParameterIuiv@GOTPAGEOFF] +_bluegl_glBindBufferRangeNV: + adrp x16, ___blue_glCore_glBindBufferRangeNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindBufferRangeNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2sARB +.private_extern _bluegl_glBindBufferOffsetNV .align 2 -_bluegl_glMultiTexCoord2sARB: - adrp x16, ___blue_glCore_glMultiTexCoord2sARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2sARB@GOTPAGEOFF] +_bluegl_glBindBufferOffsetNV: + adrp x16, ___blue_glCore_glBindBufferOffsetNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindBufferOffsetNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2i64NV +.private_extern _bluegl_glBindBufferBaseNV .align 2 -_bluegl_glUniform2i64NV: - adrp x16, ___blue_glCore_glUniform2i64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2i64NV@GOTPAGEOFF] +_bluegl_glBindBufferBaseNV: + adrp x16, ___blue_glCore_glBindBufferBaseNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindBufferBaseNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeformationMap3dSGIX +.private_extern _bluegl_glTransformFeedbackVaryingsNV .align 2 -_bluegl_glDeformationMap3dSGIX: - adrp x16, ___blue_glCore_glDeformationMap3dSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeformationMap3dSGIX@GOTPAGEOFF] +_bluegl_glTransformFeedbackVaryingsNV: + adrp x16, ___blue_glCore_glTransformFeedbackVaryingsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTransformFeedbackVaryingsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawRangeElementArrayAPPLE +.private_extern _bluegl_glActiveVaryingNV .align 2 -_bluegl_glDrawRangeElementArrayAPPLE: - adrp x16, ___blue_glCore_glDrawRangeElementArrayAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawRangeElementArrayAPPLE@GOTPAGEOFF] +_bluegl_glActiveVaryingNV: + adrp x16, ___blue_glCore_glActiveVaryingNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glActiveVaryingNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDepthFunc +.private_extern _bluegl_glGetVaryingLocationNV .align 2 -_bluegl_glDepthFunc: - adrp x16, ___blue_glCore_glDepthFunc@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDepthFunc@GOTPAGEOFF] +_bluegl_glGetVaryingLocationNV: + adrp x16, ___blue_glCore_glGetVaryingLocationNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVaryingLocationNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3dvEXT +.private_extern _bluegl_glGetActiveVaryingNV .align 2 -_bluegl_glProgramUniform3dvEXT: - adrp x16, ___blue_glCore_glProgramUniform3dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3dvEXT@GOTPAGEOFF] +_bluegl_glGetActiveVaryingNV: + adrp x16, ___blue_glCore_glGetActiveVaryingNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetActiveVaryingNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord3hvNV +.private_extern _bluegl_glGetTransformFeedbackVaryingNV .align 2 -_bluegl_glTexCoord3hvNV: - adrp x16, ___blue_glCore_glTexCoord3hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord3hvNV@GOTPAGEOFF] +_bluegl_glGetTransformFeedbackVaryingNV: + adrp x16, ___blue_glCore_glGetTransformFeedbackVaryingNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTransformFeedbackVaryingNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPathLengthNV +.private_extern _bluegl_glTransformFeedbackStreamAttribsNV .align 2 -_bluegl_glGetPathLengthNV: - adrp x16, ___blue_glCore_glGetPathLengthNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPathLengthNV@GOTPAGEOFF] +_bluegl_glTransformFeedbackStreamAttribsNV: + adrp x16, ___blue_glCore_glTransformFeedbackStreamAttribsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTransformFeedbackStreamAttribsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUnmapObjectBufferATI +.private_extern _bluegl_glBindTransformFeedbackNV .align 2 -_bluegl_glUnmapObjectBufferATI: - adrp x16, ___blue_glCore_glUnmapObjectBufferATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUnmapObjectBufferATI@GOTPAGEOFF] +_bluegl_glBindTransformFeedbackNV: + adrp x16, ___blue_glCore_glBindTransformFeedbackNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindTransformFeedbackNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glValidateProgramPipeline +.private_extern _bluegl_glDeleteTransformFeedbacksNV .align 2 -_bluegl_glValidateProgramPipeline: - adrp x16, ___blue_glCore_glValidateProgramPipeline@GOTPAGE - ldr x16, [x16, ___blue_glCore_glValidateProgramPipeline@GOTPAGEOFF] +_bluegl_glDeleteTransformFeedbacksNV: + adrp x16, ___blue_glCore_glDeleteTransformFeedbacksNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteTransformFeedbacksNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsProgram +.private_extern _bluegl_glGenTransformFeedbacksNV .align 2 -_bluegl_glIsProgram: - adrp x16, ___blue_glCore_glIsProgram@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsProgram@GOTPAGEOFF] +_bluegl_glGenTransformFeedbacksNV: + adrp x16, ___blue_glCore_glGenTransformFeedbacksNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenTransformFeedbacksNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4hvNV +.private_extern _bluegl_glIsTransformFeedbackNV .align 2 -_bluegl_glVertexAttrib4hvNV: - adrp x16, ___blue_glCore_glVertexAttrib4hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4hvNV@GOTPAGEOFF] +_bluegl_glIsTransformFeedbackNV: + adrp x16, ___blue_glCore_glIsTransformFeedbackNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsTransformFeedbackNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLoadTransposeMatrixdARB +.private_extern _bluegl_glPauseTransformFeedbackNV .align 2 -_bluegl_glLoadTransposeMatrixdARB: - adrp x16, ___blue_glCore_glLoadTransposeMatrixdARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLoadTransposeMatrixdARB@GOTPAGEOFF] +_bluegl_glPauseTransformFeedbackNV: + adrp x16, ___blue_glCore_glPauseTransformFeedbackNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPauseTransformFeedbackNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMapVertexAttrib2dAPPLE +.private_extern _bluegl_glResumeTransformFeedbackNV .align 2 -_bluegl_glMapVertexAttrib2dAPPLE: - adrp x16, ___blue_glCore_glMapVertexAttrib2dAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMapVertexAttrib2dAPPLE@GOTPAGEOFF] +_bluegl_glResumeTransformFeedbackNV: + adrp x16, ___blue_glCore_glResumeTransformFeedbackNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glResumeTransformFeedbackNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramBinary +.private_extern _bluegl_glDrawTransformFeedbackNV .align 2 -_bluegl_glProgramBinary: - adrp x16, ___blue_glCore_glProgramBinary@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramBinary@GOTPAGEOFF] +_bluegl_glDrawTransformFeedbackNV: + adrp x16, ___blue_glCore_glDrawTransformFeedbackNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawTransformFeedbackNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3i +.private_extern _bluegl_glVDPAUInitNV .align 2 -_bluegl_glUniform3i: - adrp x16, ___blue_glCore_glUniform3i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3i@GOTPAGEOFF] +_bluegl_glVDPAUInitNV: + adrp x16, ___blue_glCore_glVDPAUInitNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVDPAUInitNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2dEXT +.private_extern _bluegl_glVDPAUFiniNV .align 2 -_bluegl_glProgramUniform2dEXT: - adrp x16, ___blue_glCore_glProgramUniform2dEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2dEXT@GOTPAGEOFF] +_bluegl_glVDPAUFiniNV: + adrp x16, ___blue_glCore_glVDPAUFiniNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVDPAUFiniNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDepthRangeIndexed +.private_extern _bluegl_glVDPAURegisterVideoSurfaceNV .align 2 -_bluegl_glDepthRangeIndexed: - adrp x16, ___blue_glCore_glDepthRangeIndexed@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDepthRangeIndexed@GOTPAGEOFF] +_bluegl_glVDPAURegisterVideoSurfaceNV: + adrp x16, ___blue_glCore_glVDPAURegisterVideoSurfaceNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVDPAURegisterVideoSurfaceNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEvalCoord1xOES +.private_extern _bluegl_glVDPAURegisterOutputSurfaceNV .align 2 -_bluegl_glEvalCoord1xOES: - adrp x16, ___blue_glCore_glEvalCoord1xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEvalCoord1xOES@GOTPAGEOFF] +_bluegl_glVDPAURegisterOutputSurfaceNV: + adrp x16, ___blue_glCore_glVDPAURegisterOutputSurfaceNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVDPAURegisterOutputSurfaceNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayRangeAPPLE +.private_extern _bluegl_glVDPAUIsSurfaceNV .align 2 -_bluegl_glVertexArrayRangeAPPLE: - adrp x16, ___blue_glCore_glVertexArrayRangeAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayRangeAPPLE@GOTPAGEOFF] +_bluegl_glVDPAUIsSurfaceNV: + adrp x16, ___blue_glCore_glVDPAUIsSurfaceNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVDPAUIsSurfaceNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream1svATI +.private_extern _bluegl_glVDPAUUnregisterSurfaceNV .align 2 -_bluegl_glVertexStream1svATI: - adrp x16, ___blue_glCore_glVertexStream1svATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream1svATI@GOTPAGEOFF] +_bluegl_glVDPAUUnregisterSurfaceNV: + adrp x16, ___blue_glCore_glVDPAUUnregisterSurfaceNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVDPAUUnregisterSurfaceNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormalStream3iATI +.private_extern _bluegl_glVDPAUGetSurfaceivNV .align 2 -_bluegl_glNormalStream3iATI: - adrp x16, ___blue_glCore_glNormalStream3iATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormalStream3iATI@GOTPAGEOFF] +_bluegl_glVDPAUGetSurfaceivNV: + adrp x16, ___blue_glCore_glVDPAUGetSurfaceivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVDPAUGetSurfaceivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4f +.private_extern _bluegl_glVDPAUSurfaceAccessNV .align 2 -_bluegl_glProgramUniform4f: - adrp x16, ___blue_glCore_glProgramUniform4f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4f@GOTPAGEOFF] +_bluegl_glVDPAUSurfaceAccessNV: + adrp x16, ___blue_glCore_glVDPAUSurfaceAccessNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVDPAUSurfaceAccessNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glScalexOES +.private_extern _bluegl_glVDPAUMapSurfacesNV .align 2 -_bluegl_glScalexOES: - adrp x16, ___blue_glCore_glScalexOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glScalexOES@GOTPAGEOFF] +_bluegl_glVDPAUMapSurfacesNV: + adrp x16, ___blue_glCore_glVDPAUMapSurfacesNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVDPAUMapSurfacesNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1fv +.private_extern _bluegl_glVDPAUUnmapSurfacesNV .align 2 -_bluegl_glUniform1fv: - adrp x16, ___blue_glCore_glUniform1fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1fv@GOTPAGEOFF] +_bluegl_glVDPAUUnmapSurfacesNV: + adrp x16, ___blue_glCore_glVDPAUUnmapSurfacesNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVDPAUUnmapSurfacesNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetActiveUniform +.private_extern _bluegl_glFlushVertexArrayRangeNV .align 2 -_bluegl_glGetActiveUniform: - adrp x16, ___blue_glCore_glGetActiveUniform@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetActiveUniform@GOTPAGEOFF] +_bluegl_glFlushVertexArrayRangeNV: + adrp x16, ___blue_glCore_glFlushVertexArrayRangeNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFlushVertexArrayRangeNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformMatrix4x3fv +.private_extern _bluegl_glVertexArrayRangeNV .align 2 -_bluegl_glProgramUniformMatrix4x3fv: - adrp x16, ___blue_glCore_glProgramUniformMatrix4x3fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformMatrix4x3fv@GOTPAGEOFF] +_bluegl_glVertexArrayRangeNV: + adrp x16, ___blue_glCore_glVertexArrayRangeNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexArrayRangeNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreateVertexArrays +.private_extern _bluegl_glVertexAttribL1i64NV .align 2 -_bluegl_glCreateVertexArrays: - adrp x16, ___blue_glCore_glCreateVertexArrays@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreateVertexArrays@GOTPAGEOFF] +_bluegl_glVertexAttribL1i64NV: + adrp x16, ___blue_glCore_glVertexAttribL1i64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL1i64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3dv +.private_extern _bluegl_glVertexAttribL2i64NV .align 2 -_bluegl_glWindowPos3dv: - adrp x16, ___blue_glCore_glWindowPos3dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3dv@GOTPAGEOFF] +_bluegl_glVertexAttribL2i64NV: + adrp x16, ___blue_glCore_glVertexAttribL2i64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL2i64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1fARB +.private_extern _bluegl_glVertexAttribL3i64NV .align 2 -_bluegl_glUniform1fARB: - adrp x16, ___blue_glCore_glUniform1fARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1fARB@GOTPAGEOFF] +_bluegl_glVertexAttribL3i64NV: + adrp x16, ___blue_glCore_glVertexAttribL3i64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL3i64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFragmentMaterialiSGIX +.private_extern _bluegl_glVertexAttribL4i64NV .align 2 -_bluegl_glFragmentMaterialiSGIX: - adrp x16, ___blue_glCore_glFragmentMaterialiSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFragmentMaterialiSGIX@GOTPAGEOFF] +_bluegl_glVertexAttribL4i64NV: + adrp x16, ___blue_glCore_glVertexAttribL4i64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL4i64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribArrayObjectfvATI +.private_extern _bluegl_glVertexAttribL1i64vNV .align 2 -_bluegl_glGetVertexAttribArrayObjectfvATI: - adrp x16, ___blue_glCore_glGetVertexAttribArrayObjectfvATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribArrayObjectfvATI@GOTPAGEOFF] +_bluegl_glVertexAttribL1i64vNV: + adrp x16, ___blue_glCore_glVertexAttribL1i64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL1i64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearAccumxOES +.private_extern _bluegl_glVertexAttribL2i64vNV .align 2 -_bluegl_glClearAccumxOES: - adrp x16, ___blue_glCore_glClearAccumxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearAccumxOES@GOTPAGEOFF] +_bluegl_glVertexAttribL2i64vNV: + adrp x16, ___blue_glCore_glVertexAttribL2i64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL2i64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindFragDataLocationEXT +.private_extern _bluegl_glVertexAttribL3i64vNV .align 2 -_bluegl_glBindFragDataLocationEXT: - adrp x16, ___blue_glCore_glBindFragDataLocationEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindFragDataLocationEXT@GOTPAGEOFF] +_bluegl_glVertexAttribL3i64vNV: + adrp x16, ___blue_glCore_glVertexAttribL3i64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL3i64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4dARB +.private_extern _bluegl_glVertexAttribL4i64vNV .align 2 -_bluegl_glMultiTexCoord4dARB: - adrp x16, ___blue_glCore_glMultiTexCoord4dARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4dARB@GOTPAGEOFF] +_bluegl_glVertexAttribL4i64vNV: + adrp x16, ___blue_glCore_glVertexAttribL4i64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL4i64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glConvolutionParameterfv +.private_extern _bluegl_glVertexAttribL1ui64NV .align 2 -_bluegl_glConvolutionParameterfv: - adrp x16, ___blue_glCore_glConvolutionParameterfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glConvolutionParameterfv@GOTPAGEOFF] +_bluegl_glVertexAttribL1ui64NV: + adrp x16, ___blue_glCore_glVertexAttribL1ui64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL1ui64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFragmentColorMaterialSGIX +.private_extern _bluegl_glVertexAttribL2ui64NV .align 2 -_bluegl_glFragmentColorMaterialSGIX: - adrp x16, ___blue_glCore_glFragmentColorMaterialSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFragmentColorMaterialSGIX@GOTPAGEOFF] +_bluegl_glVertexAttribL2ui64NV: + adrp x16, ___blue_glCore_glVertexAttribL2ui64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL2ui64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix3dv +.private_extern _bluegl_glVertexAttribL3ui64NV .align 2 -_bluegl_glUniformMatrix3dv: - adrp x16, ___blue_glCore_glUniformMatrix3dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix3dv@GOTPAGEOFF] +_bluegl_glVertexAttribL3ui64NV: + adrp x16, ___blue_glCore_glVertexAttribL3ui64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL3ui64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnPixelMapusv +.private_extern _bluegl_glVertexAttribL4ui64NV .align 2 -_bluegl_glGetnPixelMapusv: - adrp x16, ___blue_glCore_glGetnPixelMapusv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnPixelMapusv@GOTPAGEOFF] +_bluegl_glVertexAttribL4ui64NV: + adrp x16, ___blue_glCore_glVertexAttribL4ui64NV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL4ui64NV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferTextureLayer +.private_extern _bluegl_glVertexAttribL1ui64vNV .align 2 -_bluegl_glFramebufferTextureLayer: - adrp x16, ___blue_glCore_glFramebufferTextureLayer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferTextureLayer@GOTPAGEOFF] +_bluegl_glVertexAttribL1ui64vNV: + adrp x16, ___blue_glCore_glVertexAttribL1ui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL1ui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStencilThenCoverStrokePathInstancedNV +.private_extern _bluegl_glVertexAttribL2ui64vNV .align 2 -_bluegl_glStencilThenCoverStrokePathInstancedNV: - adrp x16, ___blue_glCore_glStencilThenCoverStrokePathInstancedNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStencilThenCoverStrokePathInstancedNV@GOTPAGEOFF] +_bluegl_glVertexAttribL2ui64vNV: + adrp x16, ___blue_glCore_glVertexAttribL2ui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL2ui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVDPAURegisterOutputSurfaceNV +.private_extern _bluegl_glVertexAttribL3ui64vNV .align 2 -_bluegl_glVDPAURegisterOutputSurfaceNV: - adrp x16, ___blue_glCore_glVDPAURegisterOutputSurfaceNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVDPAURegisterOutputSurfaceNV@GOTPAGEOFF] +_bluegl_glVertexAttribL3ui64vNV: + adrp x16, ___blue_glCore_glVertexAttribL3ui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL3ui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4dvARB +.private_extern _bluegl_glVertexAttribL4ui64vNV .align 2 -_bluegl_glMultiTexCoord4dvARB: - adrp x16, ___blue_glCore_glMultiTexCoord4dvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4dvARB@GOTPAGEOFF] +_bluegl_glVertexAttribL4ui64vNV: + adrp x16, ___blue_glCore_glVertexAttribL4ui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribL4ui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyTextureSubImage3D +.private_extern _bluegl_glGetVertexAttribLi64vNV .align 2 -_bluegl_glCopyTextureSubImage3D: - adrp x16, ___blue_glCore_glCopyTextureSubImage3D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyTextureSubImage3D@GOTPAGEOFF] +_bluegl_glGetVertexAttribLi64vNV: + adrp x16, ___blue_glCore_glGetVertexAttribLi64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribLi64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVariantIntegervEXT +.private_extern _bluegl_glGetVertexAttribLui64vNV .align 2 -_bluegl_glGetVariantIntegervEXT: - adrp x16, ___blue_glCore_glGetVariantIntegervEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVariantIntegervEXT@GOTPAGEOFF] +_bluegl_glGetVertexAttribLui64vNV: + adrp x16, ___blue_glCore_glGetVertexAttribLui64vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribLui64vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTexEnvxvOES +.private_extern _bluegl_glVertexAttribLFormatNV .align 2 -_bluegl_glGetTexEnvxvOES: - adrp x16, ___blue_glCore_glGetTexEnvxvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTexEnvxvOES@GOTPAGEOFF] +_bluegl_glVertexAttribLFormatNV: + adrp x16, ___blue_glCore_glVertexAttribLFormatNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribLFormatNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetFloati_vEXT +.private_extern _bluegl_glBufferAddressRangeNV .align 2 -_bluegl_glGetFloati_vEXT: - adrp x16, ___blue_glCore_glGetFloati_vEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetFloati_vEXT@GOTPAGEOFF] +_bluegl_glBufferAddressRangeNV: + adrp x16, ___blue_glCore_glBufferAddressRangeNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBufferAddressRangeNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glAsyncMarkerSGIX +.private_extern _bluegl_glVertexFormatNV .align 2 -_bluegl_glAsyncMarkerSGIX: - adrp x16, ___blue_glCore_glAsyncMarkerSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glAsyncMarkerSGIX@GOTPAGEOFF] +_bluegl_glVertexFormatNV: + adrp x16, ___blue_glCore_glVertexFormatNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexFormatNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN +.private_extern _bluegl_glNormalFormatNV .align 2 -_bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN: - adrp x16, ___blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN@GOTPAGEOFF] +_bluegl_glNormalFormatNV: + adrp x16, ___blue_glCore_glNormalFormatNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormalFormatNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexRenderbufferNV +.private_extern _bluegl_glColorFormatNV .align 2 -_bluegl_glTexRenderbufferNV: - adrp x16, ___blue_glCore_glTexRenderbufferNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexRenderbufferNV@GOTPAGEOFF] +_bluegl_glColorFormatNV: + adrp x16, ___blue_glCore_glColorFormatNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorFormatNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetConvolutionParameterfvEXT +.private_extern _bluegl_glIndexFormatNV .align 2 -_bluegl_glGetConvolutionParameterfvEXT: - adrp x16, ___blue_glCore_glGetConvolutionParameterfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetConvolutionParameterfvEXT@GOTPAGEOFF] +_bluegl_glIndexFormatNV: + adrp x16, ___blue_glCore_glIndexFormatNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIndexFormatNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLightxvOES +.private_extern _bluegl_glTexCoordFormatNV .align 2 -_bluegl_glLightxvOES: - adrp x16, ___blue_glCore_glLightxvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLightxvOES@GOTPAGEOFF] +_bluegl_glTexCoordFormatNV: + adrp x16, ___blue_glCore_glTexCoordFormatNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoordFormatNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteNamedStringARB +.private_extern _bluegl_glEdgeFlagFormatNV .align 2 -_bluegl_glDeleteNamedStringARB: - adrp x16, ___blue_glCore_glDeleteNamedStringARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteNamedStringARB@GOTPAGEOFF] +_bluegl_glEdgeFlagFormatNV: + adrp x16, ___blue_glCore_glEdgeFlagFormatNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEdgeFlagFormatNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColor3hvNV +.private_extern _bluegl_glSecondaryColorFormatNV .align 2 -_bluegl_glColor3hvNV: - adrp x16, ___blue_glCore_glColor3hvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColor3hvNV@GOTPAGEOFF] +_bluegl_glSecondaryColorFormatNV: + adrp x16, ___blue_glCore_glSecondaryColorFormatNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSecondaryColorFormatNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix4dv +.private_extern _bluegl_glFogCoordFormatNV .align 2 -_bluegl_glUniformMatrix4dv: - adrp x16, ___blue_glCore_glUniformMatrix4dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix4dv@GOTPAGEOFF] +_bluegl_glFogCoordFormatNV: + adrp x16, ___blue_glCore_glFogCoordFormatNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFogCoordFormatNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTexImage2DARB +.private_extern _bluegl_glVertexAttribFormatNV .align 2 -_bluegl_glCompressedTexImage2DARB: - adrp x16, ___blue_glCore_glCompressedTexImage2DARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTexImage2DARB@GOTPAGEOFF] +_bluegl_glVertexAttribFormatNV: + adrp x16, ___blue_glCore_glVertexAttribFormatNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribFormatNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenTexturesEXT +.private_extern _bluegl_glVertexAttribIFormatNV .align 2 -_bluegl_glGenTexturesEXT: - adrp x16, ___blue_glCore_glGenTexturesEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenTexturesEXT@GOTPAGEOFF] +_bluegl_glVertexAttribIFormatNV: + adrp x16, ___blue_glCore_glVertexAttribIFormatNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribIFormatNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathMemoryGlyphIndexArrayNV +.private_extern _bluegl_glGetIntegerui64i_vNV .align 2 -_bluegl_glPathMemoryGlyphIndexArrayNV: - adrp x16, ___blue_glCore_glPathMemoryGlyphIndexArrayNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathMemoryGlyphIndexArrayNV@GOTPAGEOFF] +_bluegl_glGetIntegerui64i_vNV: + adrp x16, ___blue_glCore_glGetIntegerui64i_vNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetIntegerui64i_vNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetBufferSubDataARB +.private_extern _bluegl_glAreProgramsResidentNV .align 2 -_bluegl_glGetBufferSubDataARB: - adrp x16, ___blue_glCore_glGetBufferSubDataARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetBufferSubDataARB@GOTPAGEOFF] +_bluegl_glAreProgramsResidentNV: + adrp x16, ___blue_glCore_glAreProgramsResidentNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glAreProgramsResidentNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFinishObjectAPPLE +.private_extern _bluegl_glBindProgramNV .align 2 -_bluegl_glFinishObjectAPPLE: - adrp x16, ___blue_glCore_glFinishObjectAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFinishObjectAPPLE@GOTPAGEOFF] +_bluegl_glBindProgramNV: + adrp x16, ___blue_glCore_glBindProgramNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindProgramNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDetachShader +.private_extern _bluegl_glDeleteProgramsNV .align 2 -_bluegl_glDetachShader: - adrp x16, ___blue_glCore_glDetachShader@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDetachShader@GOTPAGEOFF] +_bluegl_glDeleteProgramsNV: + adrp x16, ___blue_glCore_glDeleteProgramsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteProgramsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindTexture +.private_extern _bluegl_glExecuteProgramNV .align 2 -_bluegl_glBindTexture: - adrp x16, ___blue_glCore_glBindTexture@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindTexture@GOTPAGEOFF] +_bluegl_glExecuteProgramNV: + adrp x16, ___blue_glCore_glExecuteProgramNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glExecuteProgramNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramResourcefvNV +.private_extern _bluegl_glGenProgramsNV .align 2 -_bluegl_glGetProgramResourcefvNV: - adrp x16, ___blue_glCore_glGetProgramResourcefvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramResourcefvNV@GOTPAGEOFF] +_bluegl_glGenProgramsNV: + adrp x16, ___blue_glCore_glGenProgramsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenProgramsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord2fColor4ubVertex3fvSUN +.private_extern _bluegl_glGetProgramParameterdvNV .align 2 -_bluegl_glTexCoord2fColor4ubVertex3fvSUN: - adrp x16, ___blue_glCore_glTexCoord2fColor4ubVertex3fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord2fColor4ubVertex3fvSUN@GOTPAGEOFF] +_bluegl_glGetProgramParameterdvNV: + adrp x16, ___blue_glCore_glGetProgramParameterdvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramParameterdvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4dv +.private_extern _bluegl_glGetProgramParameterfvNV .align 2 -_bluegl_glMultiTexCoord4dv: - adrp x16, ___blue_glCore_glMultiTexCoord4dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4dv@GOTPAGEOFF] +_bluegl_glGetProgramParameterfvNV: + adrp x16, ___blue_glCore_glGetProgramParameterfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramParameterfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsPointInFillPathNV +.private_extern _bluegl_glGetProgramivNV .align 2 -_bluegl_glIsPointInFillPathNV: - adrp x16, ___blue_glCore_glIsPointInFillPathNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsPointInFillPathNV@GOTPAGEOFF] +_bluegl_glGetProgramivNV: + adrp x16, ___blue_glCore_glGetProgramivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawTransformFeedbackInstanced +.private_extern _bluegl_glGetProgramStringNV .align 2 -_bluegl_glDrawTransformFeedbackInstanced: - adrp x16, ___blue_glCore_glDrawTransformFeedbackInstanced@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawTransformFeedbackInstanced@GOTPAGEOFF] +_bluegl_glGetProgramStringNV: + adrp x16, ___blue_glCore_glGetProgramStringNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetProgramStringNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramParameteriARB +.private_extern _bluegl_glGetTrackMatrixivNV .align 2 -_bluegl_glProgramParameteriARB: - adrp x16, ___blue_glCore_glProgramParameteriARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramParameteriARB@GOTPAGEOFF] +_bluegl_glGetTrackMatrixivNV: + adrp x16, ___blue_glCore_glGetTrackMatrixivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTrackMatrixivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3fvNV +.private_extern _bluegl_glGetVertexAttribdvNV .align 2 -_bluegl_glVertexAttrib3fvNV: - adrp x16, ___blue_glCore_glVertexAttrib3fvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3fvNV@GOTPAGEOFF] +_bluegl_glGetVertexAttribdvNV: + adrp x16, ___blue_glCore_glGetVertexAttribdvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribdvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEnableVertexArrayAttrib +.private_extern _bluegl_glGetVertexAttribfvNV .align 2 -_bluegl_glEnableVertexArrayAttrib: - adrp x16, ___blue_glCore_glEnableVertexArrayAttrib@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEnableVertexArrayAttrib@GOTPAGEOFF] +_bluegl_glGetVertexAttribfvNV: + adrp x16, ___blue_glCore_glGetVertexAttribfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3ui64vNV +.private_extern _bluegl_glGetVertexAttribivNV .align 2 -_bluegl_glUniform3ui64vNV: - adrp x16, ___blue_glCore_glUniform3ui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3ui64vNV@GOTPAGEOFF] +_bluegl_glGetVertexAttribivNV: + adrp x16, ___blue_glCore_glGetVertexAttribivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribs4fvNV +.private_extern _bluegl_glGetVertexAttribPointervNV .align 2 -_bluegl_glVertexAttribs4fvNV: - adrp x16, ___blue_glCore_glVertexAttribs4fvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribs4fvNV@GOTPAGEOFF] +_bluegl_glGetVertexAttribPointervNV: + adrp x16, ___blue_glCore_glGetVertexAttribPointervNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribPointervNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetCompressedTextureImageEXT +.private_extern _bluegl_glIsProgramNV .align 2 -_bluegl_glGetCompressedTextureImageEXT: - adrp x16, ___blue_glCore_glGetCompressedTextureImageEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetCompressedTextureImageEXT@GOTPAGEOFF] +_bluegl_glIsProgramNV: + adrp x16, ___blue_glCore_glIsProgramNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsProgramNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertex3bOES +.private_extern _bluegl_glLoadProgramNV .align 2 -_bluegl_glVertex3bOES: - adrp x16, ___blue_glCore_glVertex3bOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertex3bOES@GOTPAGEOFF] +_bluegl_glLoadProgramNV: + adrp x16, ___blue_glCore_glLoadProgramNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLoadProgramNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramLocalParameterI4ivNV +.private_extern _bluegl_glProgramParameter4dNV .align 2 -_bluegl_glProgramLocalParameterI4ivNV: - adrp x16, ___blue_glCore_glProgramLocalParameterI4ivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramLocalParameterI4ivNV@GOTPAGEOFF] +_bluegl_glProgramParameter4dNV: + adrp x16, ___blue_glCore_glProgramParameter4dNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramParameter4dNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2fMESA +.private_extern _bluegl_glProgramParameter4dvNV .align 2 -_bluegl_glWindowPos2fMESA: - adrp x16, ___blue_glCore_glWindowPos2fMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2fMESA@GOTPAGEOFF] +_bluegl_glProgramParameter4dvNV: + adrp x16, ___blue_glCore_glProgramParameter4dvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramParameter4dvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWeightusvARB +.private_extern _bluegl_glProgramParameter4fNV .align 2 -_bluegl_glWeightusvARB: - adrp x16, ___blue_glCore_glWeightusvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWeightusvARB@GOTPAGEOFF] +_bluegl_glProgramParameter4fNV: + adrp x16, ___blue_glCore_glProgramParameter4fNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramParameter4fNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenOcclusionQueriesNV +.private_extern _bluegl_glProgramParameter4fvNV .align 2 -_bluegl_glGenOcclusionQueriesNV: - adrp x16, ___blue_glCore_glGenOcclusionQueriesNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenOcclusionQueriesNV@GOTPAGEOFF] +_bluegl_glProgramParameter4fvNV: + adrp x16, ___blue_glCore_glProgramParameter4fvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramParameter4fvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoordPointervINTEL +.private_extern _bluegl_glProgramParameters4dvNV .align 2 -_bluegl_glTexCoordPointervINTEL: - adrp x16, ___blue_glCore_glTexCoordPointervINTEL@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoordPointervINTEL@GOTPAGEOFF] +_bluegl_glProgramParameters4dvNV: + adrp x16, ___blue_glCore_glProgramParameters4dvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramParameters4dvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureParameterIivEXT +.private_extern _bluegl_glProgramParameters4fvNV .align 2 -_bluegl_glGetTextureParameterIivEXT: - adrp x16, ___blue_glCore_glGetTextureParameterIivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureParameterIivEXT@GOTPAGEOFF] +_bluegl_glProgramParameters4fvNV: + adrp x16, ___blue_glCore_glProgramParameters4fvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glProgramParameters4fvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteStatesNV +.private_extern _bluegl_glRequestResidentProgramsNV .align 2 -_bluegl_glDeleteStatesNV: - adrp x16, ___blue_glCore_glDeleteStatesNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteStatesNV@GOTPAGEOFF] +_bluegl_glRequestResidentProgramsNV: + adrp x16, ___blue_glCore_glRequestResidentProgramsNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glRequestResidentProgramsNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramLocalParameter4fvARB +.private_extern _bluegl_glTrackMatrixNV .align 2 -_bluegl_glProgramLocalParameter4fvARB: - adrp x16, ___blue_glCore_glProgramLocalParameter4fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramLocalParameter4fvARB@GOTPAGEOFF] +_bluegl_glTrackMatrixNV: + adrp x16, ___blue_glCore_glTrackMatrixNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTrackMatrixNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCoverFillPathInstancedNV +.private_extern _bluegl_glVertexAttribPointerNV .align 2 -_bluegl_glCoverFillPathInstancedNV: - adrp x16, ___blue_glCore_glCoverFillPathInstancedNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCoverFillPathInstancedNV@GOTPAGEOFF] +_bluegl_glVertexAttribPointerNV: + adrp x16, ___blue_glCore_glVertexAttribPointerNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribPointerNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBeginConditionalRenderNVX +.private_extern _bluegl_glVertexAttrib1dNV .align 2 -_bluegl_glBeginConditionalRenderNVX: - adrp x16, ___blue_glCore_glBeginConditionalRenderNVX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBeginConditionalRenderNVX@GOTPAGEOFF] +_bluegl_glVertexAttrib1dNV: + adrp x16, ___blue_glCore_glVertexAttrib1dNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1dNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathDashArrayNV +.private_extern _bluegl_glVertexAttrib1dvNV .align 2 -_bluegl_glPathDashArrayNV: - adrp x16, ___blue_glCore_glPathDashArrayNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathDashArrayNV@GOTPAGEOFF] +_bluegl_glVertexAttrib1dvNV: + adrp x16, ___blue_glCore_glVertexAttrib1dvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1dvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSpriteParameteriSGIX +.private_extern _bluegl_glVertexAttrib1fNV .align 2 -_bluegl_glSpriteParameteriSGIX: - adrp x16, ___blue_glCore_glSpriteParameteriSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSpriteParameteriSGIX@GOTPAGEOFF] +_bluegl_glVertexAttrib1fNV: + adrp x16, ___blue_glCore_glVertexAttrib1fNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1fNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedProgramStringEXT +.private_extern _bluegl_glVertexAttrib1fvNV .align 2 -_bluegl_glGetNamedProgramStringEXT: - adrp x16, ___blue_glCore_glGetNamedProgramStringEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedProgramStringEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib1fvNV: + adrp x16, ___blue_glCore_glVertexAttrib1fvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1fvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCombinerParameterfvNV +.private_extern _bluegl_glVertexAttrib1sNV .align 2 -_bluegl_glCombinerParameterfvNV: - adrp x16, ___blue_glCore_glCombinerParameterfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCombinerParameterfvNV@GOTPAGEOFF] +_bluegl_glVertexAttrib1sNV: + adrp x16, ___blue_glCore_glVertexAttrib1sNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1sNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexParameterxvOES +.private_extern _bluegl_glVertexAttrib1svNV .align 2 -_bluegl_glTexParameterxvOES: - adrp x16, ___blue_glCore_glTexParameterxvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexParameterxvOES@GOTPAGEOFF] +_bluegl_glVertexAttrib1svNV: + adrp x16, ___blue_glCore_glVertexAttrib1svNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib1svNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayVertexAttribDivisorEXT +.private_extern _bluegl_glVertexAttrib2dNV .align 2 -_bluegl_glVertexArrayVertexAttribDivisorEXT: - adrp x16, ___blue_glCore_glVertexArrayVertexAttribDivisorEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayVertexAttribDivisorEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib2dNV: + adrp x16, ___blue_glCore_glVertexAttrib2dNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2dNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramSubroutineParametersuivNV +.private_extern _bluegl_glVertexAttrib2dvNV .align 2 -_bluegl_glProgramSubroutineParametersuivNV: - adrp x16, ___blue_glCore_glProgramSubroutineParametersuivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramSubroutineParametersuivNV@GOTPAGEOFF] +_bluegl_glVertexAttrib2dvNV: + adrp x16, ___blue_glCore_glVertexAttrib2dvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2dvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteObjectARB +.private_extern _bluegl_glVertexAttrib2fNV .align 2 -_bluegl_glDeleteObjectARB: - adrp x16, ___blue_glCore_glDeleteObjectARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteObjectARB@GOTPAGEOFF] +_bluegl_glVertexAttrib2fNV: + adrp x16, ___blue_glCore_glVertexAttrib2fNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2fNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1i64ARB +.private_extern _bluegl_glVertexAttrib2fvNV .align 2 -_bluegl_glProgramUniform1i64ARB: - adrp x16, ___blue_glCore_glProgramUniform1i64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1i64ARB@GOTPAGEOFF] +_bluegl_glVertexAttrib2fvNV: + adrp x16, ___blue_glCore_glVertexAttrib2fvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2fvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferTextureARB +.private_extern _bluegl_glVertexAttrib2sNV .align 2 -_bluegl_glFramebufferTextureARB: - adrp x16, ___blue_glCore_glFramebufferTextureARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferTextureARB@GOTPAGEOFF] +_bluegl_glVertexAttrib2sNV: + adrp x16, ___blue_glCore_glVertexAttrib2sNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2sNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glElementPointerATI +.private_extern _bluegl_glVertexAttrib2svNV .align 2 -_bluegl_glElementPointerATI: - adrp x16, ___blue_glCore_glElementPointerATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glElementPointerATI@GOTPAGEOFF] +_bluegl_glVertexAttrib2svNV: + adrp x16, ___blue_glCore_glVertexAttrib2svNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib2svNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform2i64vARB +.private_extern _bluegl_glVertexAttrib3dNV .align 2 -_bluegl_glUniform2i64vARB: - adrp x16, ___blue_glCore_glUniform2i64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform2i64vARB@GOTPAGEOFF] +_bluegl_glVertexAttrib3dNV: + adrp x16, ___blue_glCore_glVertexAttrib3dNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3dNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetBooleanIndexedvEXT +.private_extern _bluegl_glVertexAttrib3dvNV .align 2 -_bluegl_glGetBooleanIndexedvEXT: - adrp x16, ___blue_glCore_glGetBooleanIndexedvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetBooleanIndexedvEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib3dvNV: + adrp x16, ___blue_glCore_glVertexAttrib3dvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3dvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribP1uiv +.private_extern _bluegl_glVertexAttrib3fNV .align 2 -_bluegl_glVertexAttribP1uiv: - adrp x16, ___blue_glCore_glVertexAttribP1uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribP1uiv@GOTPAGEOFF] +_bluegl_glVertexAttrib3fNV: + adrp x16, ___blue_glCore_glVertexAttrib3fNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3fNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetDoubleIndexedvEXT +.private_extern _bluegl_glVertexAttrib3fvNV .align 2 -_bluegl_glGetDoubleIndexedvEXT: - adrp x16, ___blue_glCore_glGetDoubleIndexedvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetDoubleIndexedvEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib3fvNV: + adrp x16, ___blue_glCore_glVertexAttrib3fvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3fvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetUniformiv +.private_extern _bluegl_glVertexAttrib3sNV .align 2 -_bluegl_glGetUniformiv: - adrp x16, ___blue_glCore_glGetUniformiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetUniformiv@GOTPAGEOFF] +_bluegl_glVertexAttrib3sNV: + adrp x16, ___blue_glCore_glVertexAttrib3sNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3sNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribArrayObjectATI +.private_extern _bluegl_glVertexAttrib3svNV .align 2 -_bluegl_glVertexAttribArrayObjectATI: - adrp x16, ___blue_glCore_glVertexAttribArrayObjectATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribArrayObjectATI@GOTPAGEOFF] +_bluegl_glVertexAttrib3svNV: + adrp x16, ___blue_glCore_glVertexAttrib3svNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib3svNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBufferSubDataARB +.private_extern _bluegl_glVertexAttrib4dNV .align 2 -_bluegl_glBufferSubDataARB: - adrp x16, ___blue_glCore_glBufferSubDataARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBufferSubDataARB@GOTPAGEOFF] +_bluegl_glVertexAttrib4dNV: + adrp x16, ___blue_glCore_glVertexAttrib4dNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4dNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2fARB +.private_extern _bluegl_glVertexAttrib4dvNV .align 2 -_bluegl_glWindowPos2fARB: - adrp x16, ___blue_glCore_glWindowPos2fARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2fARB@GOTPAGEOFF] +_bluegl_glVertexAttrib4dvNV: + adrp x16, ___blue_glCore_glVertexAttrib4dvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4dvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord2bvOES +.private_extern _bluegl_glVertexAttrib4fNV .align 2 -_bluegl_glMultiTexCoord2bvOES: - adrp x16, ___blue_glCore_glMultiTexCoord2bvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord2bvOES@GOTPAGEOFF] +_bluegl_glVertexAttrib4fNV: + adrp x16, ___blue_glCore_glVertexAttrib4fNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4fNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform2i64vARB +.private_extern _bluegl_glVertexAttrib4fvNV .align 2 -_bluegl_glProgramUniform2i64vARB: - adrp x16, ___blue_glCore_glProgramUniform2i64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform2i64vARB@GOTPAGEOFF] +_bluegl_glVertexAttrib4fvNV: + adrp x16, ___blue_glCore_glVertexAttrib4fvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4fvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexEnvxOES +.private_extern _bluegl_glVertexAttrib4sNV .align 2 -_bluegl_glTexEnvxOES: - adrp x16, ___blue_glCore_glTexEnvxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexEnvxOES@GOTPAGEOFF] +_bluegl_glVertexAttrib4sNV: + adrp x16, ___blue_glCore_glVertexAttrib4sNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4sNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStencilOpValueAMD +.private_extern _bluegl_glVertexAttrib4svNV .align 2 -_bluegl_glStencilOpValueAMD: - adrp x16, ___blue_glCore_glStencilOpValueAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStencilOpValueAMD@GOTPAGEOFF] +_bluegl_glVertexAttrib4svNV: + adrp x16, ___blue_glCore_glVertexAttrib4svNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4svNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4ui64vARB +.private_extern _bluegl_glVertexAttrib4ubNV .align 2 -_bluegl_glUniform4ui64vARB: - adrp x16, ___blue_glCore_glUniform4ui64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4ui64vARB@GOTPAGEOFF] +_bluegl_glVertexAttrib4ubNV: + adrp x16, ___blue_glCore_glVertexAttrib4ubNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4ubNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTangent3iEXT +.private_extern _bluegl_glVertexAttrib4ubvNV .align 2 -_bluegl_glTangent3iEXT: - adrp x16, ___blue_glCore_glTangent3iEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTangent3iEXT@GOTPAGEOFF] +_bluegl_glVertexAttrib4ubvNV: + adrp x16, ___blue_glCore_glVertexAttrib4ubvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttrib4ubvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexAttribLdvEXT +.private_extern _bluegl_glVertexAttribs1dvNV .align 2 -_bluegl_glGetVertexAttribLdvEXT: - adrp x16, ___blue_glCore_glGetVertexAttribLdvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexAttribLdvEXT@GOTPAGEOFF] +_bluegl_glVertexAttribs1dvNV: + adrp x16, ___blue_glCore_glVertexAttribs1dvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribs1dvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetCoverageModulationTableNV +.private_extern _bluegl_glVertexAttribs1fvNV .align 2 -_bluegl_glGetCoverageModulationTableNV: - adrp x16, ___blue_glCore_glGetCoverageModulationTableNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetCoverageModulationTableNV@GOTPAGEOFF] +_bluegl_glVertexAttribs1fvNV: + adrp x16, ___blue_glCore_glVertexAttribs1fvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribs1fvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexWeighthvNV +.private_extern _bluegl_glVertexAttribs1svNV .align 2 -_bluegl_glVertexWeighthvNV: - adrp x16, ___blue_glCore_glVertexWeighthvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexWeighthvNV@GOTPAGEOFF] +_bluegl_glVertexAttribs1svNV: + adrp x16, ___blue_glCore_glVertexAttribs1svNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribs1svNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3iARB +.private_extern _bluegl_glVertexAttribs2dvNV .align 2 -_bluegl_glWindowPos3iARB: - adrp x16, ___blue_glCore_glWindowPos3iARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3iARB@GOTPAGEOFF] +_bluegl_glVertexAttribs2dvNV: + adrp x16, ___blue_glCore_glVertexAttribs2dvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribs2dvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI1iv +.private_extern _bluegl_glVertexAttribs2fvNV .align 2 -_bluegl_glVertexAttribI1iv: - adrp x16, ___blue_glCore_glVertexAttribI1iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI1iv@GOTPAGEOFF] +_bluegl_glVertexAttribs2fvNV: + adrp x16, ___blue_glCore_glVertexAttribs2fvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribs2fvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3fv +.private_extern _bluegl_glVertexAttribs2svNV .align 2 -_bluegl_glWindowPos3fv: - adrp x16, ___blue_glCore_glWindowPos3fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3fv@GOTPAGEOFF] +_bluegl_glVertexAttribs2svNV: + adrp x16, ___blue_glCore_glVertexAttribs2svNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribs2svNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream4ivATI +.private_extern _bluegl_glVertexAttribs3dvNV .align 2 -_bluegl_glVertexStream4ivATI: - adrp x16, ___blue_glCore_glVertexStream4ivATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream4ivATI@GOTPAGEOFF] +_bluegl_glVertexAttribs3dvNV: + adrp x16, ___blue_glCore_glVertexAttribs3dvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribs3dvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureImage3DMultisampleCoverageNV +.private_extern _bluegl_glVertexAttribs3fvNV .align 2 -_bluegl_glTextureImage3DMultisampleCoverageNV: - adrp x16, ___blue_glCore_glTextureImage3DMultisampleCoverageNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureImage3DMultisampleCoverageNV@GOTPAGEOFF] +_bluegl_glVertexAttribs3fvNV: + adrp x16, ___blue_glCore_glVertexAttribs3fvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribs3fvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform3f +.private_extern _bluegl_glVertexAttribs3svNV .align 2 -_bluegl_glUniform3f: - adrp x16, ___blue_glCore_glUniform3f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform3f@GOTPAGEOFF] +_bluegl_glVertexAttribs3svNV: + adrp x16, ___blue_glCore_glVertexAttribs3svNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribs3svNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glAccumxOES +.private_extern _bluegl_glVertexAttribs4dvNV .align 2 -_bluegl_glAccumxOES: - adrp x16, ___blue_glCore_glAccumxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glAccumxOES@GOTPAGEOFF] +_bluegl_glVertexAttribs4dvNV: + adrp x16, ___blue_glCore_glVertexAttribs4dvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribs4dvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexStorage3D +.private_extern _bluegl_glVertexAttribs4fvNV .align 2 -_bluegl_glTexStorage3D: - adrp x16, ___blue_glCore_glTexStorage3D@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexStorage3D@GOTPAGEOFF] +_bluegl_glVertexAttribs4fvNV: + adrp x16, ___blue_glCore_glVertexAttribs4fvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribs4fvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawArrays +.private_extern _bluegl_glVertexAttribs4svNV .align 2 -_bluegl_glDrawArrays: - adrp x16, ___blue_glCore_glDrawArrays@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawArrays@GOTPAGEOFF] +_bluegl_glVertexAttribs4svNV: + adrp x16, ___blue_glCore_glVertexAttribs4svNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribs4svNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSamplePatternEXT +.private_extern _bluegl_glVertexAttribs4ubvNV .align 2 -_bluegl_glSamplePatternEXT: - adrp x16, ___blue_glCore_glSamplePatternEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSamplePatternEXT@GOTPAGEOFF] +_bluegl_glVertexAttribs4ubvNV: + adrp x16, ___blue_glCore_glVertexAttribs4ubvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribs4ubvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormalPointervINTEL +.private_extern _bluegl_glVertexAttribI1iEXT .align 2 -_bluegl_glNormalPointervINTEL: - adrp x16, ___blue_glCore_glNormalPointervINTEL@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormalPointervINTEL@GOTPAGEOFF] +_bluegl_glVertexAttribI1iEXT: + adrp x16, ___blue_glCore_glVertexAttribI1iEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI1iEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWeightubvARB +.private_extern _bluegl_glVertexAttribI2iEXT .align 2 -_bluegl_glWeightubvARB: - adrp x16, ___blue_glCore_glWeightubvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWeightubvARB@GOTPAGEOFF] +_bluegl_glVertexAttribI2iEXT: + adrp x16, ___blue_glCore_glVertexAttribI2iEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI2iEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenProgramsNV +.private_extern _bluegl_glVertexAttribI3iEXT .align 2 -_bluegl_glGenProgramsNV: - adrp x16, ___blue_glCore_glGenProgramsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenProgramsNV@GOTPAGEOFF] +_bluegl_glVertexAttribI3iEXT: + adrp x16, ___blue_glCore_glVertexAttribI3iEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI3iEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDepthRangef +.private_extern _bluegl_glVertexAttribI4iEXT .align 2 -_bluegl_glDepthRangef: - adrp x16, ___blue_glCore_glDepthRangef@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDepthRangef@GOTPAGEOFF] +_bluegl_glVertexAttribI4iEXT: + adrp x16, ___blue_glCore_glVertexAttribI4iEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI4iEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramParameterdvNV +.private_extern _bluegl_glVertexAttribI1uiEXT .align 2 -_bluegl_glGetProgramParameterdvNV: - adrp x16, ___blue_glCore_glGetProgramParameterdvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramParameterdvNV@GOTPAGEOFF] +_bluegl_glVertexAttribI1uiEXT: + adrp x16, ___blue_glCore_glVertexAttribI1uiEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI1uiEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPollInstrumentsSGIX +.private_extern _bluegl_glVertexAttribI2uiEXT .align 2 -_bluegl_glPollInstrumentsSGIX: - adrp x16, ___blue_glCore_glPollInstrumentsSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPollInstrumentsSGIX@GOTPAGEOFF] +_bluegl_glVertexAttribI2uiEXT: + adrp x16, ___blue_glCore_glVertexAttribI2uiEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI2uiEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1hNV +.private_extern _bluegl_glVertexAttribI3uiEXT .align 2 -_bluegl_glMultiTexCoord1hNV: - adrp x16, ___blue_glCore_glMultiTexCoord1hNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1hNV@GOTPAGEOFF] +_bluegl_glVertexAttribI3uiEXT: + adrp x16, ___blue_glCore_glVertexAttribI3uiEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI3uiEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3s +.private_extern _bluegl_glVertexAttribI4uiEXT .align 2 -_bluegl_glSecondaryColor3s: - adrp x16, ___blue_glCore_glSecondaryColor3s@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3s@GOTPAGEOFF] +_bluegl_glVertexAttribI4uiEXT: + adrp x16, ___blue_glCore_glVertexAttribI4uiEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI4uiEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoordP1uiv +.private_extern _bluegl_glVertexAttribI1ivEXT .align 2 -_bluegl_glTexCoordP1uiv: - adrp x16, ___blue_glCore_glTexCoordP1uiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoordP1uiv@GOTPAGEOFF] +_bluegl_glVertexAttribI1ivEXT: + adrp x16, ___blue_glCore_glVertexAttribI1ivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI1ivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glStopInstrumentsSGIX +.private_extern _bluegl_glVertexAttribI2ivEXT .align 2 -_bluegl_glStopInstrumentsSGIX: - adrp x16, ___blue_glCore_glStopInstrumentsSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glStopInstrumentsSGIX@GOTPAGEOFF] +_bluegl_glVertexAttribI2ivEXT: + adrp x16, ___blue_glCore_glVertexAttribI2ivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI2ivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glActiveTexture +.private_extern _bluegl_glVertexAttribI3ivEXT .align 2 -_bluegl_glActiveTexture: - adrp x16, ___blue_glCore_glActiveTexture@GOTPAGE - ldr x16, [x16, ___blue_glCore_glActiveTexture@GOTPAGEOFF] +_bluegl_glVertexAttribI3ivEXT: + adrp x16, ___blue_glCore_glVertexAttribI3ivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI3ivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribs2svNV +.private_extern _bluegl_glVertexAttribI4ivEXT .align 2 -_bluegl_glVertexAttribs2svNV: - adrp x16, ___blue_glCore_glVertexAttribs2svNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribs2svNV@GOTPAGEOFF] +_bluegl_glVertexAttribI4ivEXT: + adrp x16, ___blue_glCore_glVertexAttribI4ivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI4ivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetActiveAtomicCounterBufferiv +.private_extern _bluegl_glVertexAttribI1uivEXT .align 2 -_bluegl_glGetActiveAtomicCounterBufferiv: - adrp x16, ___blue_glCore_glGetActiveAtomicCounterBufferiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetActiveAtomicCounterBufferiv@GOTPAGEOFF] +_bluegl_glVertexAttribI1uivEXT: + adrp x16, ___blue_glCore_glVertexAttribI1uivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI1uivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEndConditionalRenderNVX +.private_extern _bluegl_glVertexAttribI2uivEXT .align 2 -_bluegl_glEndConditionalRenderNVX: - adrp x16, ___blue_glCore_glEndConditionalRenderNVX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEndConditionalRenderNVX@GOTPAGEOFF] +_bluegl_glVertexAttribI2uivEXT: + adrp x16, ___blue_glCore_glVertexAttribI2uivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI2uivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawRangeElementArrayATI +.private_extern _bluegl_glVertexAttribI3uivEXT .align 2 -_bluegl_glDrawRangeElementArrayATI: - adrp x16, ___blue_glCore_glDrawRangeElementArrayATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawRangeElementArrayATI@GOTPAGEOFF] +_bluegl_glVertexAttribI3uivEXT: + adrp x16, ___blue_glCore_glVertexAttribI3uivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI3uivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyMultiTexImage1DEXT +.private_extern _bluegl_glVertexAttribI4uivEXT .align 2 -_bluegl_glCopyMultiTexImage1DEXT: - adrp x16, ___blue_glCore_glCopyMultiTexImage1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyMultiTexImage1DEXT@GOTPAGEOFF] +_bluegl_glVertexAttribI4uivEXT: + adrp x16, ___blue_glCore_glVertexAttribI4uivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI4uivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeusSUN +.private_extern _bluegl_glVertexAttribI4bvEXT .align 2 -_bluegl_glReplacementCodeusSUN: - adrp x16, ___blue_glCore_glReplacementCodeusSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeusSUN@GOTPAGEOFF] +_bluegl_glVertexAttribI4bvEXT: + adrp x16, ___blue_glCore_glVertexAttribI4bvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI4bvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexGendEXT +.private_extern _bluegl_glVertexAttribI4svEXT .align 2 -_bluegl_glMultiTexGendEXT: - adrp x16, ___blue_glCore_glMultiTexGendEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexGendEXT@GOTPAGEOFF] +_bluegl_glVertexAttribI4svEXT: + adrp x16, ___blue_glCore_glVertexAttribI4svEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI4svEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixRotatefEXT +.private_extern _bluegl_glVertexAttribI4ubvEXT .align 2 -_bluegl_glMatrixRotatefEXT: - adrp x16, ___blue_glCore_glMatrixRotatefEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixRotatefEXT@GOTPAGEOFF] +_bluegl_glVertexAttribI4ubvEXT: + adrp x16, ___blue_glCore_glVertexAttribI4ubvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI4ubvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindBufferOffsetNV +.private_extern _bluegl_glVertexAttribI4usvEXT .align 2 -_bluegl_glBindBufferOffsetNV: - adrp x16, ___blue_glCore_glBindBufferOffsetNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindBufferOffsetNV@GOTPAGEOFF] +_bluegl_glVertexAttribI4usvEXT: + adrp x16, ___blue_glCore_glVertexAttribI4usvEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribI4usvEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI1ui +.private_extern _bluegl_glVertexAttribIPointerEXT .align 2 -_bluegl_glVertexAttribI1ui: - adrp x16, ___blue_glCore_glVertexAttribI1ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI1ui@GOTPAGEOFF] +_bluegl_glVertexAttribIPointerEXT: + adrp x16, ___blue_glCore_glVertexAttribIPointerEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVertexAttribIPointerEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMakeImageHandleNonResidentARB +.private_extern _bluegl_glGetVertexAttribIivEXT .align 2 -_bluegl_glMakeImageHandleNonResidentARB: - adrp x16, ___blue_glCore_glMakeImageHandleNonResidentARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMakeImageHandleNonResidentARB@GOTPAGEOFF] +_bluegl_glGetVertexAttribIivEXT: + adrp x16, ___blue_glCore_glGetVertexAttribIivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribIivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureParameteriEXT +.private_extern _bluegl_glGetVertexAttribIuivEXT .align 2 -_bluegl_glTextureParameteriEXT: - adrp x16, ___blue_glCore_glTextureParameteriEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureParameteriEXT@GOTPAGEOFF] +_bluegl_glGetVertexAttribIuivEXT: + adrp x16, ___blue_glCore_glGetVertexAttribIuivEXT@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVertexAttribIuivEXT@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDebugMessageInsertARB +.private_extern _bluegl_glBeginVideoCaptureNV .align 2 -_bluegl_glDebugMessageInsertARB: - adrp x16, ___blue_glCore_glDebugMessageInsertARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDebugMessageInsertARB@GOTPAGEOFF] +_bluegl_glBeginVideoCaptureNV: + adrp x16, ___blue_glCore_glBeginVideoCaptureNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBeginVideoCaptureNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4NubvARB +.private_extern _bluegl_glBindVideoCaptureStreamBufferNV .align 2 -_bluegl_glVertexAttrib4NubvARB: - adrp x16, ___blue_glCore_glVertexAttrib4NubvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4NubvARB@GOTPAGEOFF] +_bluegl_glBindVideoCaptureStreamBufferNV: + adrp x16, ___blue_glCore_glBindVideoCaptureStreamBufferNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindVideoCaptureStreamBufferNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteTexturesEXT +.private_extern _bluegl_glBindVideoCaptureStreamTextureNV .align 2 -_bluegl_glDeleteTexturesEXT: - adrp x16, ___blue_glCore_glDeleteTexturesEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteTexturesEXT@GOTPAGEOFF] +_bluegl_glBindVideoCaptureStreamTextureNV: + adrp x16, ___blue_glCore_glBindVideoCaptureStreamTextureNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glBindVideoCaptureStreamTextureNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3svARB +.private_extern _bluegl_glEndVideoCaptureNV .align 2 -_bluegl_glWindowPos3svARB: - adrp x16, ___blue_glCore_glWindowPos3svARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3svARB@GOTPAGEOFF] +_bluegl_glEndVideoCaptureNV: + adrp x16, ___blue_glCore_glEndVideoCaptureNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glEndVideoCaptureNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexParameterxOES +.private_extern _bluegl_glGetVideoCaptureivNV .align 2 -_bluegl_glTexParameterxOES: - adrp x16, ___blue_glCore_glTexParameterxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexParameterxOES@GOTPAGEOFF] +_bluegl_glGetVideoCaptureivNV: + adrp x16, ___blue_glCore_glGetVideoCaptureivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVideoCaptureivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream3fATI +.private_extern _bluegl_glGetVideoCaptureStreamivNV .align 2 -_bluegl_glVertexStream3fATI: - adrp x16, ___blue_glCore_glVertexStream3fATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream3fATI@GOTPAGEOFF] +_bluegl_glGetVideoCaptureStreamivNV: + adrp x16, ___blue_glCore_glGetVideoCaptureStreamivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVideoCaptureStreamivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNormal3xOES +.private_extern _bluegl_glGetVideoCaptureStreamfvNV .align 2 -_bluegl_glNormal3xOES: - adrp x16, ___blue_glCore_glNormal3xOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNormal3xOES@GOTPAGEOFF] +_bluegl_glGetVideoCaptureStreamfvNV: + adrp x16, ___blue_glCore_glGetVideoCaptureStreamfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVideoCaptureStreamfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4bvOES +.private_extern _bluegl_glGetVideoCaptureStreamdvNV .align 2 -_bluegl_glMultiTexCoord4bvOES: - adrp x16, ___blue_glCore_glMultiTexCoord4bvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4bvOES@GOTPAGEOFF] +_bluegl_glGetVideoCaptureStreamdvNV: + adrp x16, ___blue_glCore_glGetVideoCaptureStreamdvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetVideoCaptureStreamdvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL1dv +.private_extern _bluegl_glVideoCaptureNV .align 2 -_bluegl_glVertexAttribL1dv: - adrp x16, ___blue_glCore_glVertexAttribL1dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL1dv@GOTPAGEOFF] +_bluegl_glVideoCaptureNV: + adrp x16, ___blue_glCore_glVideoCaptureNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVideoCaptureNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetImageTransformParameterivHP +.private_extern _bluegl_glVideoCaptureStreamParameterivNV .align 2 -_bluegl_glGetImageTransformParameterivHP: - adrp x16, ___blue_glCore_glGetImageTransformParameterivHP@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetImageTransformParameterivHP@GOTPAGEOFF] +_bluegl_glVideoCaptureStreamParameterivNV: + adrp x16, ___blue_glCore_glVideoCaptureStreamParameterivNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVideoCaptureStreamParameterivNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetSubroutineUniformLocation +.private_extern _bluegl_glVideoCaptureStreamParameterfvNV .align 2 -_bluegl_glGetSubroutineUniformLocation: - adrp x16, ___blue_glCore_glGetSubroutineUniformLocation@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetSubroutineUniformLocation@GOTPAGEOFF] +_bluegl_glVideoCaptureStreamParameterfvNV: + adrp x16, ___blue_glCore_glVideoCaptureStreamParameterfvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVideoCaptureStreamParameterfvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramEnvParameter4fvARB +.private_extern _bluegl_glVideoCaptureStreamParameterdvNV .align 2 -_bluegl_glProgramEnvParameter4fvARB: - adrp x16, ___blue_glCore_glProgramEnvParameter4fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramEnvParameter4fvARB@GOTPAGEOFF] +_bluegl_glVideoCaptureStreamParameterdvNV: + adrp x16, ___blue_glCore_glVideoCaptureStreamParameterdvNV@GOTPAGE + ldr x16, [x16, ___blue_glCore_glVideoCaptureStreamParameterdvNV@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureImageEXT +.private_extern _bluegl_glFramebufferTextureMultiviewOVR .align 2 -_bluegl_glGetTextureImageEXT: - adrp x16, ___blue_glCore_glGetTextureImageEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureImageEXT@GOTPAGEOFF] +_bluegl_glFramebufferTextureMultiviewOVR: + adrp x16, ___blue_glCore_glFramebufferTextureMultiviewOVR@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFramebufferTextureMultiviewOVR@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindTexGenParameterEXT +.private_extern _bluegl_glHintPGI .align 2 -_bluegl_glBindTexGenParameterEXT: - adrp x16, ___blue_glCore_glBindTexGenParameterEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindTexGenParameterEXT@GOTPAGEOFF] +_bluegl_glHintPGI: + adrp x16, ___blue_glCore_glHintPGI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glHintPGI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMinSampleShadingARB +.private_extern _bluegl_glDetailTexFuncSGIS .align 2 -_bluegl_glMinSampleShadingARB: - adrp x16, ___blue_glCore_glMinSampleShadingARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMinSampleShadingARB@GOTPAGEOFF] +_bluegl_glDetailTexFuncSGIS: + adrp x16, ___blue_glCore_glDetailTexFuncSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDetailTexFuncSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetAttachedObjectsARB +.private_extern _bluegl_glGetDetailTexFuncSGIS .align 2 -_bluegl_glGetAttachedObjectsARB: - adrp x16, ___blue_glCore_glGetAttachedObjectsARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetAttachedObjectsARB@GOTPAGEOFF] +_bluegl_glGetDetailTexFuncSGIS: + adrp x16, ___blue_glCore_glGetDetailTexFuncSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetDetailTexFuncSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexArrayiv +.private_extern _bluegl_glFogFuncSGIS .align 2 -_bluegl_glGetVertexArrayiv: - adrp x16, ___blue_glCore_glGetVertexArrayiv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexArrayiv@GOTPAGEOFF] +_bluegl_glFogFuncSGIS: + adrp x16, ___blue_glCore_glFogFuncSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFogFuncSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWeightfvARB +.private_extern _bluegl_glGetFogFuncSGIS .align 2 -_bluegl_glWeightfvARB: - adrp x16, ___blue_glCore_glWeightfvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWeightfvARB@GOTPAGEOFF] +_bluegl_glGetFogFuncSGIS: + adrp x16, ___blue_glCore_glGetFogFuncSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFogFuncSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPathCommandsNV +.private_extern _bluegl_glSampleMaskSGIS .align 2 -_bluegl_glGetPathCommandsNV: - adrp x16, ___blue_glCore_glGetPathCommandsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPathCommandsNV@GOTPAGEOFF] +_bluegl_glSampleMaskSGIS: + adrp x16, ___blue_glCore_glSampleMaskSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSampleMaskSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetColorTableParameterivSGI +.private_extern _bluegl_glSamplePatternSGIS .align 2 -_bluegl_glGetColorTableParameterivSGI: - adrp x16, ___blue_glCore_glGetColorTableParameterivSGI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetColorTableParameterivSGI@GOTPAGEOFF] +_bluegl_glSamplePatternSGIS: + adrp x16, ___blue_glCore_glSamplePatternSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSamplePatternSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedProgramivEXT +.private_extern _bluegl_glPixelTexGenParameteriSGIS .align 2 -_bluegl_glGetNamedProgramivEXT: - adrp x16, ___blue_glCore_glGetNamedProgramivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedProgramivEXT@GOTPAGEOFF] +_bluegl_glPixelTexGenParameteriSGIS: + adrp x16, ___blue_glCore_glPixelTexGenParameteriSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPixelTexGenParameteriSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSecondaryColor3ubvEXT +.private_extern _bluegl_glPixelTexGenParameterivSGIS .align 2 -_bluegl_glSecondaryColor3ubvEXT: - adrp x16, ___blue_glCore_glSecondaryColor3ubvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSecondaryColor3ubvEXT@GOTPAGEOFF] +_bluegl_glPixelTexGenParameterivSGIS: + adrp x16, ___blue_glCore_glPixelTexGenParameterivSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPixelTexGenParameterivSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVDPAURegisterVideoSurfaceNV +.private_extern _bluegl_glPixelTexGenParameterfSGIS .align 2 -_bluegl_glVDPAURegisterVideoSurfaceNV: - adrp x16, ___blue_glCore_glVDPAURegisterVideoSurfaceNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVDPAURegisterVideoSurfaceNV@GOTPAGEOFF] +_bluegl_glPixelTexGenParameterfSGIS: + adrp x16, ___blue_glCore_glPixelTexGenParameterfSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPixelTexGenParameterfSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexParameterf +.private_extern _bluegl_glPixelTexGenParameterfvSGIS .align 2 -_bluegl_glTexParameterf: - adrp x16, ___blue_glCore_glTexParameterf@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexParameterf@GOTPAGEOFF] +_bluegl_glPixelTexGenParameterfvSGIS: + adrp x16, ___blue_glCore_glPixelTexGenParameterfvSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPixelTexGenParameterfvSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL4i64NV +.private_extern _bluegl_glGetPixelTexGenParameterivSGIS .align 2 -_bluegl_glVertexAttribL4i64NV: - adrp x16, ___blue_glCore_glVertexAttribL4i64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL4i64NV@GOTPAGEOFF] +_bluegl_glGetPixelTexGenParameterivSGIS: + adrp x16, ___blue_glCore_glGetPixelTexGenParameterivSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPixelTexGenParameterivSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPollAsyncSGIX +.private_extern _bluegl_glGetPixelTexGenParameterfvSGIS .align 2 -_bluegl_glPollAsyncSGIX: - adrp x16, ___blue_glCore_glPollAsyncSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPollAsyncSGIX@GOTPAGEOFF] +_bluegl_glGetPixelTexGenParameterfvSGIS: + adrp x16, ___blue_glCore_glGetPixelTexGenParameterfvSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetPixelTexGenParameterfvSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBufferParameteriAPPLE +.private_extern _bluegl_glPointParameterfSGIS .align 2 -_bluegl_glBufferParameteriAPPLE: - adrp x16, ___blue_glCore_glBufferParameteriAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBufferParameteriAPPLE@GOTPAGEOFF] +_bluegl_glPointParameterfSGIS: + adrp x16, ___blue_glCore_glPointParameterfSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPointParameterfSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glApplyTextureEXT +.private_extern _bluegl_glPointParameterfvSGIS .align 2 -_bluegl_glApplyTextureEXT: - adrp x16, ___blue_glCore_glApplyTextureEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glApplyTextureEXT@GOTPAGEOFF] +_bluegl_glPointParameterfvSGIS: + adrp x16, ___blue_glCore_glPointParameterfvSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPointParameterfvSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenVertexShadersEXT +.private_extern _bluegl_glSharpenTexFuncSGIS .align 2 -_bluegl_glGenVertexShadersEXT: - adrp x16, ___blue_glCore_glGenVertexShadersEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenVertexShadersEXT@GOTPAGEOFF] +_bluegl_glSharpenTexFuncSGIS: + adrp x16, ___blue_glCore_glSharpenTexFuncSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSharpenTexFuncSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexImage2DMultisampleCoverageNV +.private_extern _bluegl_glGetSharpenTexFuncSGIS .align 2 -_bluegl_glTexImage2DMultisampleCoverageNV: - adrp x16, ___blue_glCore_glTexImage2DMultisampleCoverageNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexImage2DMultisampleCoverageNV@GOTPAGEOFF] +_bluegl_glGetSharpenTexFuncSGIS: + adrp x16, ___blue_glCore_glGetSharpenTexFuncSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetSharpenTexFuncSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glObjectUnpurgeableAPPLE +.private_extern _bluegl_glTexImage4DSGIS .align 2 -_bluegl_glObjectUnpurgeableAPPLE: - adrp x16, ___blue_glCore_glObjectUnpurgeableAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glObjectUnpurgeableAPPLE@GOTPAGEOFF] +_bluegl_glTexImage4DSGIS: + adrp x16, ___blue_glCore_glTexImage4DSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexImage4DSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCopyNamedBufferSubData +.private_extern _bluegl_glTexSubImage4DSGIS .align 2 -_bluegl_glCopyNamedBufferSubData: - adrp x16, ___blue_glCore_glCopyNamedBufferSubData@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCopyNamedBufferSubData@GOTPAGEOFF] +_bluegl_glTexSubImage4DSGIS: + adrp x16, ___blue_glCore_glTexSubImage4DSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexSubImage4DSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4dv +.private_extern _bluegl_glTextureColorMaskSGIS .align 2 -_bluegl_glVertexAttrib4dv: - adrp x16, ___blue_glCore_glVertexAttrib4dv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4dv@GOTPAGEOFF] +_bluegl_glTextureColorMaskSGIS: + adrp x16, ___blue_glCore_glTextureColorMaskSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTextureColorMaskSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearTexSubImage +.private_extern _bluegl_glGetTexFilterFuncSGIS .align 2 -_bluegl_glClearTexSubImage: - adrp x16, ___blue_glCore_glClearTexSubImage@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearTexSubImage@GOTPAGEOFF] +_bluegl_glGetTexFilterFuncSGIS: + adrp x16, ___blue_glCore_glGetTexFilterFuncSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetTexFilterFuncSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPointAlongPathNV +.private_extern _bluegl_glTexFilterFuncSGIS .align 2 -_bluegl_glPointAlongPathNV: - adrp x16, ___blue_glCore_glPointAlongPathNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPointAlongPathNV@GOTPAGEOFF] +_bluegl_glTexFilterFuncSGIS: + adrp x16, ___blue_glCore_glTexFilterFuncSGIS@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexFilterFuncSGIS@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferTexture1DEXT +.private_extern _bluegl_glAsyncMarkerSGIX .align 2 -_bluegl_glFramebufferTexture1DEXT: - adrp x16, ___blue_glCore_glFramebufferTexture1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferTexture1DEXT@GOTPAGEOFF] +_bluegl_glAsyncMarkerSGIX: + adrp x16, ___blue_glCore_glAsyncMarkerSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glAsyncMarkerSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixLoad3x2fNV +.private_extern _bluegl_glFinishAsyncSGIX .align 2 -_bluegl_glMatrixLoad3x2fNV: - adrp x16, ___blue_glCore_glMatrixLoad3x2fNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixLoad3x2fNV@GOTPAGEOFF] +_bluegl_glFinishAsyncSGIX: + adrp x16, ___blue_glCore_glFinishAsyncSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFinishAsyncSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetUniformui64vARB +.private_extern _bluegl_glPollAsyncSGIX .align 2 -_bluegl_glGetUniformui64vARB: - adrp x16, ___blue_glCore_glGetUniformui64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetUniformui64vARB@GOTPAGEOFF] +_bluegl_glPollAsyncSGIX: + adrp x16, ___blue_glCore_glPollAsyncSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPollAsyncSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureStorage3DMultisampleEXT +.private_extern _bluegl_glGenAsyncMarkersSGIX .align 2 -_bluegl_glTextureStorage3DMultisampleEXT: - adrp x16, ___blue_glCore_glTextureStorage3DMultisampleEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureStorage3DMultisampleEXT@GOTPAGEOFF] +_bluegl_glGenAsyncMarkersSGIX: + adrp x16, ___blue_glCore_glGenAsyncMarkersSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGenAsyncMarkersSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord1bvOES +.private_extern _bluegl_glDeleteAsyncMarkersSGIX .align 2 -_bluegl_glTexCoord1bvOES: - adrp x16, ___blue_glCore_glTexCoord1bvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord1bvOES@GOTPAGEOFF] +_bluegl_glDeleteAsyncMarkersSGIX: + adrp x16, ___blue_glCore_glDeleteAsyncMarkersSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeleteAsyncMarkersSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetBufferParameteri64v +.private_extern _bluegl_glIsAsyncMarkerSGIX .align 2 -_bluegl_glGetBufferParameteri64v: - adrp x16, ___blue_glCore_glGetBufferParameteri64v@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetBufferParameteri64v@GOTPAGEOFF] +_bluegl_glIsAsyncMarkerSGIX: + adrp x16, ___blue_glCore_glIsAsyncMarkerSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIsAsyncMarkerSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glQueryMatrixxOES +.private_extern _bluegl_glFlushRasterSGIX .align 2 -_bluegl_glQueryMatrixxOES: - adrp x16, ___blue_glCore_glQueryMatrixxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glQueryMatrixxOES@GOTPAGEOFF] +_bluegl_glFlushRasterSGIX: + adrp x16, ___blue_glCore_glFlushRasterSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFlushRasterSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib1fv +.private_extern _bluegl_glFragmentColorMaterialSGIX .align 2 -_bluegl_glVertexAttrib1fv: - adrp x16, ___blue_glCore_glVertexAttrib1fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib1fv@GOTPAGEOFF] +_bluegl_glFragmentColorMaterialSGIX: + adrp x16, ___blue_glCore_glFragmentColorMaterialSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFragmentColorMaterialSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribP3ui +.private_extern _bluegl_glFragmentLightfSGIX .align 2 -_bluegl_glVertexAttribP3ui: - adrp x16, ___blue_glCore_glVertexAttribP3ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribP3ui@GOTPAGEOFF] +_bluegl_glFragmentLightfSGIX: + adrp x16, ___blue_glCore_glFragmentLightfSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFragmentLightfSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVDPAUInitNV +.private_extern _bluegl_glFragmentLightfvSGIX .align 2 -_bluegl_glVDPAUInitNV: - adrp x16, ___blue_glCore_glVDPAUInitNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVDPAUInitNV@GOTPAGEOFF] +_bluegl_glFragmentLightfvSGIX: + adrp x16, ___blue_glCore_glFragmentLightfvSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFragmentLightfvSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPathStencilDepthOffsetNV +.private_extern _bluegl_glFragmentLightiSGIX .align 2 -_bluegl_glPathStencilDepthOffsetNV: - adrp x16, ___blue_glCore_glPathStencilDepthOffsetNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPathStencilDepthOffsetNV@GOTPAGEOFF] +_bluegl_glFragmentLightiSGIX: + adrp x16, ___blue_glCore_glFragmentLightiSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFragmentLightiSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glLightxOES +.private_extern _bluegl_glFragmentLightivSGIX .align 2 -_bluegl_glLightxOES: - adrp x16, ___blue_glCore_glLightxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glLightxOES@GOTPAGEOFF] +_bluegl_glFragmentLightivSGIX: + adrp x16, ___blue_glCore_glFragmentLightivSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFragmentLightivSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI3i +.private_extern _bluegl_glFragmentLightModelfSGIX .align 2 -_bluegl_glVertexAttribI3i: - adrp x16, ___blue_glCore_glVertexAttribI3i@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI3i@GOTPAGEOFF] +_bluegl_glFragmentLightModelfSGIX: + adrp x16, ___blue_glCore_glFragmentLightModelfSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFragmentLightModelfSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformHandleui64vARB +.private_extern _bluegl_glFragmentLightModelfvSGIX .align 2 -_bluegl_glProgramUniformHandleui64vARB: - adrp x16, ___blue_glCore_glProgramUniformHandleui64vARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformHandleui64vARB@GOTPAGEOFF] +_bluegl_glFragmentLightModelfvSGIX: + adrp x16, ___blue_glCore_glFragmentLightModelfvSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFragmentLightModelfvSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureParameteriv +.private_extern _bluegl_glFragmentLightModeliSGIX .align 2 -_bluegl_glTextureParameteriv: - adrp x16, ___blue_glCore_glTextureParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureParameteriv@GOTPAGEOFF] +_bluegl_glFragmentLightModeliSGIX: + adrp x16, ___blue_glCore_glFragmentLightModeliSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFragmentLightModeliSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniformHandleui64NV +.private_extern _bluegl_glFragmentLightModelivSGIX .align 2 -_bluegl_glProgramUniformHandleui64NV: - adrp x16, ___blue_glCore_glProgramUniformHandleui64NV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniformHandleui64NV@GOTPAGEOFF] +_bluegl_glFragmentLightModelivSGIX: + adrp x16, ___blue_glCore_glFragmentLightModelivSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFragmentLightModelivSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetVertexArrayIntegervEXT +.private_extern _bluegl_glFragmentMaterialfSGIX .align 2 -_bluegl_glGetVertexArrayIntegervEXT: - adrp x16, ___blue_glCore_glGetVertexArrayIntegervEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetVertexArrayIntegervEXT@GOTPAGEOFF] +_bluegl_glFragmentMaterialfSGIX: + adrp x16, ___blue_glCore_glFragmentMaterialfSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFragmentMaterialfSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawElements +.private_extern _bluegl_glFragmentMaterialfvSGIX .align 2 -_bluegl_glDrawElements: - adrp x16, ___blue_glCore_glDrawElements@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawElements@GOTPAGEOFF] +_bluegl_glFragmentMaterialfvSGIX: + adrp x16, ___blue_glCore_glFragmentMaterialfvSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFragmentMaterialfvSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform3i64ARB +.private_extern _bluegl_glFragmentMaterialiSGIX .align 2 -_bluegl_glProgramUniform3i64ARB: - adrp x16, ___blue_glCore_glProgramUniform3i64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform3i64ARB@GOTPAGEOFF] +_bluegl_glFragmentMaterialiSGIX: + adrp x16, ___blue_glCore_glFragmentMaterialiSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFragmentMaterialiSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteAsyncMarkersSGIX +.private_extern _bluegl_glFragmentMaterialivSGIX .align 2 -_bluegl_glDeleteAsyncMarkersSGIX: - adrp x16, ___blue_glCore_glDeleteAsyncMarkersSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteAsyncMarkersSGIX@GOTPAGEOFF] +_bluegl_glFragmentMaterialivSGIX: + adrp x16, ___blue_glCore_glFragmentMaterialivSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFragmentMaterialivSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetLightxOES +.private_extern _bluegl_glGetFragmentLightfvSGIX .align 2 -_bluegl_glGetLightxOES: - adrp x16, ___blue_glCore_glGetLightxOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetLightxOES@GOTPAGEOFF] +_bluegl_glGetFragmentLightfvSGIX: + adrp x16, ___blue_glCore_glGetFragmentLightfvSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFragmentLightfvSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreateCommandListsNV +.private_extern _bluegl_glGetFragmentLightivSGIX .align 2 -_bluegl_glCreateCommandListsNV: - adrp x16, ___blue_glCore_glCreateCommandListsNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreateCommandListsNV@GOTPAGEOFF] +_bluegl_glGetFragmentLightivSGIX: + adrp x16, ___blue_glCore_glGetFragmentLightivSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFragmentLightivSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClear +.private_extern _bluegl_glGetFragmentMaterialfvSGIX .align 2 -_bluegl_glClear: - adrp x16, ___blue_glCore_glClear@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClear@GOTPAGEOFF] +_bluegl_glGetFragmentMaterialfvSGIX: + adrp x16, ___blue_glCore_glGetFragmentMaterialfvSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFragmentMaterialfvSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformui64vNV +.private_extern _bluegl_glGetFragmentMaterialivSGIX .align 2 -_bluegl_glUniformui64vNV: - adrp x16, ___blue_glCore_glUniformui64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformui64vNV@GOTPAGEOFF] +_bluegl_glGetFragmentMaterialivSGIX: + adrp x16, ___blue_glCore_glGetFragmentMaterialivSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetFragmentMaterialivSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2dvNV +.private_extern _bluegl_glLightEnviSGIX .align 2 -_bluegl_glVertexAttrib2dvNV: - adrp x16, ___blue_glCore_glVertexAttrib2dvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2dvNV@GOTPAGEOFF] +_bluegl_glLightEnviSGIX: + adrp x16, ___blue_glCore_glLightEnviSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLightEnviSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN +.private_extern _bluegl_glFrameZoomSGIX .align 2 -_bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN: - adrp x16, ___blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN@GOTPAGEOFF] +_bluegl_glFrameZoomSGIX: + adrp x16, ___blue_glCore_glFrameZoomSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFrameZoomSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos3sARB +.private_extern _bluegl_glIglooInterfaceSGIX .align 2 -_bluegl_glWindowPos3sARB: - adrp x16, ___blue_glCore_glWindowPos3sARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos3sARB@GOTPAGEOFF] +_bluegl_glIglooInterfaceSGIX: + adrp x16, ___blue_glCore_glIglooInterfaceSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glIglooInterfaceSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawTextureNV +.private_extern _bluegl_glGetInstrumentsSGIX .align 2 -_bluegl_glDrawTextureNV: - adrp x16, ___blue_glCore_glDrawTextureNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawTextureNV@GOTPAGEOFF] +_bluegl_glGetInstrumentsSGIX: + adrp x16, ___blue_glCore_glGetInstrumentsSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetInstrumentsSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIsSync +.private_extern _bluegl_glInstrumentsBufferSGIX .align 2 -_bluegl_glIsSync: - adrp x16, ___blue_glCore_glIsSync@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIsSync@GOTPAGEOFF] +_bluegl_glInstrumentsBufferSGIX: + adrp x16, ___blue_glCore_glInstrumentsBufferSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glInstrumentsBufferSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMatrixTranslatedEXT +.private_extern _bluegl_glPollInstrumentsSGIX .align 2 -_bluegl_glMatrixTranslatedEXT: - adrp x16, ___blue_glCore_glMatrixTranslatedEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMatrixTranslatedEXT@GOTPAGEOFF] +_bluegl_glPollInstrumentsSGIX: + adrp x16, ___blue_glCore_glPollInstrumentsSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPollInstrumentsSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetActiveVaryingNV +.private_extern _bluegl_glReadInstrumentsSGIX .align 2 -_bluegl_glGetActiveVaryingNV: - adrp x16, ___blue_glCore_glGetActiveVaryingNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetActiveVaryingNV@GOTPAGEOFF] +_bluegl_glReadInstrumentsSGIX: + adrp x16, ___blue_glCore_glReadInstrumentsSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReadInstrumentsSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCreateQueries +.private_extern _bluegl_glStartInstrumentsSGIX .align 2 -_bluegl_glCreateQueries: - adrp x16, ___blue_glCore_glCreateQueries@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCreateQueries@GOTPAGEOFF] +_bluegl_glStartInstrumentsSGIX: + adrp x16, ___blue_glCore_glStartInstrumentsSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStartInstrumentsSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramEnvParameterdvARB +.private_extern _bluegl_glStopInstrumentsSGIX .align 2 -_bluegl_glGetProgramEnvParameterdvARB: - adrp x16, ___blue_glCore_glGetProgramEnvParameterdvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramEnvParameterdvARB@GOTPAGEOFF] +_bluegl_glStopInstrumentsSGIX: + adrp x16, ___blue_glCore_glStopInstrumentsSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glStopInstrumentsSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayVertexAttribIOffsetEXT +.private_extern _bluegl_glGetListParameterfvSGIX .align 2 -_bluegl_glVertexArrayVertexAttribIOffsetEXT: - adrp x16, ___blue_glCore_glVertexArrayVertexAttribIOffsetEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayVertexAttribIOffsetEXT@GOTPAGEOFF] +_bluegl_glGetListParameterfvSGIX: + adrp x16, ___blue_glCore_glGetListParameterfvSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetListParameterfvSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetLocalConstantBooleanvEXT +.private_extern _bluegl_glGetListParameterivSGIX .align 2 -_bluegl_glGetLocalConstantBooleanvEXT: - adrp x16, ___blue_glCore_glGetLocalConstantBooleanvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetLocalConstantBooleanvEXT@GOTPAGEOFF] +_bluegl_glGetListParameterivSGIX: + adrp x16, ___blue_glCore_glGetListParameterivSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetListParameterivSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetProgramParameterfvNV +.private_extern _bluegl_glListParameterfSGIX .align 2 -_bluegl_glGetProgramParameterfvNV: - adrp x16, ___blue_glCore_glGetProgramParameterfvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetProgramParameterfvNV@GOTPAGEOFF] +_bluegl_glListParameterfSGIX: + adrp x16, ___blue_glCore_glListParameterfSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glListParameterfSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSpriteParameterivSGIX +.private_extern _bluegl_glListParameterfvSGIX .align 2 -_bluegl_glSpriteParameterivSGIX: - adrp x16, ___blue_glCore_glSpriteParameterivSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSpriteParameterivSGIX@GOTPAGEOFF] +_bluegl_glListParameterfvSGIX: + adrp x16, ___blue_glCore_glListParameterfvSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glListParameterfvSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3xvOES +.private_extern _bluegl_glListParameteriSGIX .align 2 -_bluegl_glMultiTexCoord3xvOES: - adrp x16, ___blue_glCore_glMultiTexCoord3xvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3xvOES@GOTPAGEOFF] +_bluegl_glListParameteriSGIX: + adrp x16, ___blue_glCore_glListParameteriSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glListParameteriSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindBufferRangeNV +.private_extern _bluegl_glListParameterivSGIX .align 2 -_bluegl_glBindBufferRangeNV: - adrp x16, ___blue_glCore_glBindBufferRangeNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindBufferRangeNV@GOTPAGEOFF] +_bluegl_glListParameterivSGIX: + adrp x16, ___blue_glCore_glListParameterivSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glListParameterivSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1sv +.private_extern _bluegl_glPixelTexGenSGIX .align 2 -_bluegl_glMultiTexCoord1sv: - adrp x16, ___blue_glCore_glMultiTexCoord1sv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1sv@GOTPAGEOFF] +_bluegl_glPixelTexGenSGIX: + adrp x16, ___blue_glCore_glPixelTexGenSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glPixelTexGenSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream1ivATI +.private_extern _bluegl_glDeformationMap3dSGIX .align 2 -_bluegl_glVertexStream1ivATI: - adrp x16, ___blue_glCore_glVertexStream1ivATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream1ivATI@GOTPAGEOFF] +_bluegl_glDeformationMap3dSGIX: + adrp x16, ___blue_glCore_glDeformationMap3dSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeformationMap3dSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetQueryObjectivARB +.private_extern _bluegl_glDeformationMap3fSGIX .align 2 -_bluegl_glGetQueryObjectivARB: - adrp x16, ___blue_glCore_glGetQueryObjectivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetQueryObjectivARB@GOTPAGEOFF] +_bluegl_glDeformationMap3fSGIX: + adrp x16, ___blue_glCore_glDeformationMap3fSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeformationMap3fSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeuiColor4ubVertex3fvSUN +.private_extern _bluegl_glDeformSGIX .align 2 -_bluegl_glReplacementCodeuiColor4ubVertex3fvSUN: - adrp x16, ___blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN@GOTPAGEOFF] +_bluegl_glDeformSGIX: + adrp x16, ___blue_glCore_glDeformSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDeformSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFlushMappedNamedBufferRange +.private_extern _bluegl_glLoadIdentityDeformationMapSGIX .align 2 -_bluegl_glFlushMappedNamedBufferRange: - adrp x16, ___blue_glCore_glFlushMappedNamedBufferRange@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFlushMappedNamedBufferRange@GOTPAGEOFF] +_bluegl_glLoadIdentityDeformationMapSGIX: + adrp x16, ___blue_glCore_glLoadIdentityDeformationMapSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glLoadIdentityDeformationMapSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPointParameteriv +.private_extern _bluegl_glReferencePlaneSGIX .align 2 -_bluegl_glPointParameteriv: - adrp x16, ___blue_glCore_glPointParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPointParameteriv@GOTPAGEOFF] +_bluegl_glReferencePlaneSGIX: + adrp x16, ___blue_glCore_glReferencePlaneSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReferencePlaneSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTextureLevelParameterivEXT +.private_extern _bluegl_glSpriteParameterfSGIX .align 2 -_bluegl_glGetTextureLevelParameterivEXT: - adrp x16, ___blue_glCore_glGetTextureLevelParameterivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTextureLevelParameterivEXT@GOTPAGEOFF] +_bluegl_glSpriteParameterfSGIX: + adrp x16, ___blue_glCore_glSpriteParameterfSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSpriteParameterfSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexEnviEXT +.private_extern _bluegl_glSpriteParameterfvSGIX .align 2 -_bluegl_glMultiTexEnviEXT: - adrp x16, ___blue_glCore_glMultiTexEnviEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexEnviEXT@GOTPAGEOFF] +_bluegl_glSpriteParameterfvSGIX: + adrp x16, ___blue_glCore_glSpriteParameterfvSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSpriteParameterfvSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPolygonOffset +.private_extern _bluegl_glSpriteParameteriSGIX .align 2 -_bluegl_glPolygonOffset: - adrp x16, ___blue_glCore_glPolygonOffset@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPolygonOffset@GOTPAGEOFF] +_bluegl_glSpriteParameteriSGIX: + adrp x16, ___blue_glCore_glSpriteParameteriSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSpriteParameteriSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1ui64ARB +.private_extern _bluegl_glSpriteParameterivSGIX .align 2 -_bluegl_glUniform1ui64ARB: - adrp x16, ___blue_glCore_glUniform1ui64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1ui64ARB@GOTPAGEOFF] +_bluegl_glSpriteParameterivSGIX: + adrp x16, ___blue_glCore_glSpriteParameterivSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glSpriteParameterivSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDeleteVertexArrays +.private_extern _bluegl_glTagSampleBufferSGIX .align 2 -_bluegl_glDeleteVertexArrays: - adrp x16, ___blue_glCore_glDeleteVertexArrays@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDeleteVertexArrays@GOTPAGEOFF] +_bluegl_glTagSampleBufferSGIX: + adrp x16, ___blue_glCore_glTagSampleBufferSGIX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTagSampleBufferSGIX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetUniformi64vNV +.private_extern _bluegl_glColorTableSGI .align 2 -_bluegl_glGetUniformi64vNV: - adrp x16, ___blue_glCore_glGetUniformi64vNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetUniformi64vNV@GOTPAGEOFF] +_bluegl_glColorTableSGI: + adrp x16, ___blue_glCore_glColorTableSGI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorTableSGI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI3iv +.private_extern _bluegl_glColorTableParameterfvSGI .align 2 -_bluegl_glVertexAttribI3iv: - adrp x16, ___blue_glCore_glVertexAttribI3iv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI3iv@GOTPAGEOFF] +_bluegl_glColorTableParameterfvSGI: + adrp x16, ___blue_glCore_glColorTableParameterfvSGI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorTableParameterfvSGI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glEndQueryIndexed +.private_extern _bluegl_glColorTableParameterivSGI .align 2 -_bluegl_glEndQueryIndexed: - adrp x16, ___blue_glCore_glEndQueryIndexed@GOTPAGE - ldr x16, [x16, ___blue_glCore_glEndQueryIndexed@GOTPAGEOFF] +_bluegl_glColorTableParameterivSGI: + adrp x16, ___blue_glCore_glColorTableParameterivSGI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColorTableParameterivSGI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureSubImage1DEXT +.private_extern _bluegl_glCopyColorTableSGI .align 2 -_bluegl_glTextureSubImage1DEXT: - adrp x16, ___blue_glCore_glTextureSubImage1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureSubImage1DEXT@GOTPAGEOFF] +_bluegl_glCopyColorTableSGI: + adrp x16, ___blue_glCore_glCopyColorTableSGI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glCopyColorTableSGI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI4ubvEXT +.private_extern _bluegl_glGetColorTableSGI .align 2 -_bluegl_glVertexAttribI4ubvEXT: - adrp x16, ___blue_glCore_glVertexAttribI4ubvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI4ubvEXT@GOTPAGEOFF] +_bluegl_glGetColorTableSGI: + adrp x16, ___blue_glCore_glGetColorTableSGI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetColorTableSGI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribP4ui +.private_extern _bluegl_glGetColorTableParameterfvSGI .align 2 -_bluegl_glVertexAttribP4ui: - adrp x16, ___blue_glCore_glVertexAttribP4ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribP4ui@GOTPAGEOFF] +_bluegl_glGetColorTableParameterfvSGI: + adrp x16, ___blue_glCore_glGetColorTableParameterfvSGI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetColorTableParameterfvSGI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glNamedProgramLocalParameter4dvEXT +.private_extern _bluegl_glGetColorTableParameterivSGI .align 2 -_bluegl_glNamedProgramLocalParameter4dvEXT: - adrp x16, ___blue_glCore_glNamedProgramLocalParameter4dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glNamedProgramLocalParameter4dvEXT@GOTPAGEOFF] +_bluegl_glGetColorTableParameterivSGI: + adrp x16, ___blue_glCore_glGetColorTableParameterivSGI@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGetColorTableParameterivSGI@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedProgramLocalParameterIuivEXT +.private_extern _bluegl_glFinishTextureSUNX .align 2 -_bluegl_glGetNamedProgramLocalParameterIuivEXT: - adrp x16, ___blue_glCore_glGetNamedProgramLocalParameterIuivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedProgramLocalParameterIuivEXT@GOTPAGEOFF] +_bluegl_glFinishTextureSUNX: + adrp x16, ___blue_glCore_glFinishTextureSUNX@GOTPAGE + ldr x16, [x16, ___blue_glCore_glFinishTextureSUNX@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPixelTexGenParameterivSGIS +.private_extern _bluegl_glGlobalAlphaFactorbSUN .align 2 -_bluegl_glGetPixelTexGenParameterivSGIS: - adrp x16, ___blue_glCore_glGetPixelTexGenParameterivSGIS@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPixelTexGenParameterivSGIS@GOTPAGEOFF] +_bluegl_glGlobalAlphaFactorbSUN: + adrp x16, ___blue_glCore_glGlobalAlphaFactorbSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGlobalAlphaFactorbSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnMapdv +.private_extern _bluegl_glGlobalAlphaFactorsSUN .align 2 -_bluegl_glGetnMapdv: - adrp x16, ___blue_glCore_glGetnMapdv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnMapdv@GOTPAGEOFF] +_bluegl_glGlobalAlphaFactorsSUN: + adrp x16, ___blue_glCore_glGlobalAlphaFactorsSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGlobalAlphaFactorsSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord4svARB +.private_extern _bluegl_glGlobalAlphaFactoriSUN .align 2 -_bluegl_glMultiTexCoord4svARB: - adrp x16, ___blue_glCore_glMultiTexCoord4svARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord4svARB@GOTPAGEOFF] +_bluegl_glGlobalAlphaFactoriSUN: + adrp x16, ___blue_glCore_glGlobalAlphaFactoriSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGlobalAlphaFactoriSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexStream2ivATI +.private_extern _bluegl_glGlobalAlphaFactorfSUN .align 2 -_bluegl_glVertexStream2ivATI: - adrp x16, ___blue_glCore_glVertexStream2ivATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexStream2ivATI@GOTPAGEOFF] +_bluegl_glGlobalAlphaFactorfSUN: + adrp x16, ___blue_glCore_glGlobalAlphaFactorfSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGlobalAlphaFactorfSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4uivEXT +.private_extern _bluegl_glGlobalAlphaFactordSUN .align 2 -_bluegl_glUniform4uivEXT: - adrp x16, ___blue_glCore_glUniform4uivEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4uivEXT@GOTPAGEOFF] +_bluegl_glGlobalAlphaFactordSUN: + adrp x16, ___blue_glCore_glGlobalAlphaFactordSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGlobalAlphaFactordSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetPointeri_vEXT +.private_extern _bluegl_glGlobalAlphaFactorubSUN .align 2 -_bluegl_glGetPointeri_vEXT: - adrp x16, ___blue_glCore_glGetPointeri_vEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetPointeri_vEXT@GOTPAGEOFF] +_bluegl_glGlobalAlphaFactorubSUN: + adrp x16, ___blue_glCore_glGlobalAlphaFactorubSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGlobalAlphaFactorubSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearTexImage +.private_extern _bluegl_glGlobalAlphaFactorusSUN .align 2 -_bluegl_glClearTexImage: - adrp x16, ___blue_glCore_glClearTexImage@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearTexImage@GOTPAGEOFF] +_bluegl_glGlobalAlphaFactorusSUN: + adrp x16, ___blue_glCore_glGlobalAlphaFactorusSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGlobalAlphaFactorusSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribP1ui +.private_extern _bluegl_glGlobalAlphaFactoruiSUN .align 2 -_bluegl_glVertexAttribP1ui: - adrp x16, ___blue_glCore_glVertexAttribP1ui@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribP1ui@GOTPAGEOFF] +_bluegl_glGlobalAlphaFactoruiSUN: + adrp x16, ___blue_glCore_glGlobalAlphaFactoruiSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glGlobalAlphaFactoruiSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glCompressedTexImage1DARB +.private_extern _bluegl_glDrawMeshArraysSUN .align 2 -_bluegl_glCompressedTexImage1DARB: - adrp x16, ___blue_glCore_glCompressedTexImage1DARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glCompressedTexImage1DARB@GOTPAGEOFF] +_bluegl_glDrawMeshArraysSUN: + adrp x16, ___blue_glCore_glDrawMeshArraysSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glDrawMeshArraysSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTextureStorage1DEXT +.private_extern _bluegl_glReplacementCodeuiSUN .align 2 -_bluegl_glTextureStorage1DEXT: - adrp x16, ___blue_glCore_glTextureStorage1DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTextureStorage1DEXT@GOTPAGEOFF] +_bluegl_glReplacementCodeuiSUN: + adrp x16, ___blue_glCore_glReplacementCodeuiSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeuiSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform4fvARB +.private_extern _bluegl_glReplacementCodeusSUN .align 2 -_bluegl_glUniform4fvARB: - adrp x16, ___blue_glCore_glUniform4fvARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform4fvARB@GOTPAGEOFF] +_bluegl_glReplacementCodeusSUN: + adrp x16, ___blue_glCore_glReplacementCodeusSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeusSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFramebufferTexture3DEXT +.private_extern _bluegl_glReplacementCodeubSUN .align 2 -_bluegl_glFramebufferTexture3DEXT: - adrp x16, ___blue_glCore_glFramebufferTexture3DEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFramebufferTexture3DEXT@GOTPAGEOFF] +_bluegl_glReplacementCodeubSUN: + adrp x16, ___blue_glCore_glReplacementCodeubSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeubSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDrawElementsIndirect +.private_extern _bluegl_glReplacementCodeuivSUN .align 2 -_bluegl_glDrawElementsIndirect: - adrp x16, ___blue_glCore_glDrawElementsIndirect@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDrawElementsIndirect@GOTPAGEOFF] +_bluegl_glReplacementCodeuivSUN: + adrp x16, ___blue_glCore_glReplacementCodeuivSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeuivSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindBufferBaseEXT +.private_extern _bluegl_glReplacementCodeusvSUN .align 2 -_bluegl_glBindBufferBaseEXT: - adrp x16, ___blue_glCore_glBindBufferBaseEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindBufferBaseEXT@GOTPAGEOFF] +_bluegl_glReplacementCodeusvSUN: + adrp x16, ___blue_glCore_glReplacementCodeusvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeusvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glIglooInterfaceSGIX +.private_extern _bluegl_glReplacementCodeubvSUN .align 2 -_bluegl_glIglooInterfaceSGIX: - adrp x16, ___blue_glCore_glIglooInterfaceSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glIglooInterfaceSGIX@GOTPAGEOFF] +_bluegl_glReplacementCodeubvSUN: + adrp x16, ___blue_glCore_glReplacementCodeubvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeubvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMinmaxEXT +.private_extern _bluegl_glReplacementCodePointerSUN .align 2 -_bluegl_glMinmaxEXT: - adrp x16, ___blue_glCore_glMinmaxEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMinmaxEXT@GOTPAGEOFF] +_bluegl_glReplacementCodePointerSUN: + adrp x16, ___blue_glCore_glReplacementCodePointerSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodePointerSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glClearDepthf +.private_extern _bluegl_glColor4ubVertex2fSUN .align 2 -_bluegl_glClearDepthf: - adrp x16, ___blue_glCore_glClearDepthf@GOTPAGE - ldr x16, [x16, ___blue_glCore_glClearDepthf@GOTPAGEOFF] +_bluegl_glColor4ubVertex2fSUN: + adrp x16, ___blue_glCore_glColor4ubVertex2fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColor4ubVertex2fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReadnPixels +.private_extern _bluegl_glColor4ubVertex2fvSUN .align 2 -_bluegl_glReadnPixels: - adrp x16, ___blue_glCore_glReadnPixels@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReadnPixels@GOTPAGEOFF] +_bluegl_glColor4ubVertex2fvSUN: + adrp x16, ___blue_glCore_glColor4ubVertex2fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColor4ubVertex2fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGenerateTextureMipmap +.private_extern _bluegl_glColor4ubVertex3fSUN .align 2 -_bluegl_glGenerateTextureMipmap: - adrp x16, ___blue_glCore_glGenerateTextureMipmap@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGenerateTextureMipmap@GOTPAGEOFF] +_bluegl_glColor4ubVertex3fSUN: + adrp x16, ___blue_glCore_glColor4ubVertex3fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColor4ubVertex3fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnPixelMapuivARB +.private_extern _bluegl_glColor4ubVertex3fvSUN .align 2 -_bluegl_glGetnPixelMapuivARB: - adrp x16, ___blue_glCore_glGetnPixelMapuivARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnPixelMapuivARB@GOTPAGEOFF] +_bluegl_glColor4ubVertex3fvSUN: + adrp x16, ___blue_glCore_glColor4ubVertex3fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColor4ubVertex3fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramLocalParameter4fARB +.private_extern _bluegl_glColor3fVertex3fSUN .align 2 -_bluegl_glProgramLocalParameter4fARB: - adrp x16, ___blue_glCore_glProgramLocalParameter4fARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramLocalParameter4fARB@GOTPAGEOFF] +_bluegl_glColor3fVertex3fSUN: + adrp x16, ___blue_glCore_glColor3fVertex3fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColor3fVertex3fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribL1dvEXT +.private_extern _bluegl_glColor3fVertex3fvSUN .align 2 -_bluegl_glVertexAttribL1dvEXT: - adrp x16, ___blue_glCore_glVertexAttribL1dvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribL1dvEXT@GOTPAGEOFF] +_bluegl_glColor3fVertex3fvSUN: + adrp x16, ___blue_glCore_glColor3fVertex3fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColor3fVertex3fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBeginTransformFeedback +.private_extern _bluegl_glNormal3fVertex3fSUN .align 2 -_bluegl_glBeginTransformFeedback: - adrp x16, ___blue_glCore_glBeginTransformFeedback@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBeginTransformFeedback@GOTPAGEOFF] +_bluegl_glNormal3fVertex3fSUN: + adrp x16, ___blue_glCore_glNormal3fVertex3fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormal3fVertex3fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glDepthBoundsEXT +.private_extern _bluegl_glNormal3fVertex3fvSUN .align 2 -_bluegl_glDepthBoundsEXT: - adrp x16, ___blue_glCore_glDepthBoundsEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glDepthBoundsEXT@GOTPAGEOFF] +_bluegl_glNormal3fVertex3fvSUN: + adrp x16, ___blue_glCore_glNormal3fVertex3fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glNormal3fVertex3fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib2f +.private_extern _bluegl_glColor4fNormal3fVertex3fSUN .align 2 -_bluegl_glVertexAttrib2f: - adrp x16, ___blue_glCore_glVertexAttrib2f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib2f@GOTPAGEOFF] +_bluegl_glColor4fNormal3fVertex3fSUN: + adrp x16, ___blue_glCore_glColor4fNormal3fVertex3fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColor4fNormal3fVertex3fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramEnvParametersI4ivNV +.private_extern _bluegl_glColor4fNormal3fVertex3fvSUN .align 2 -_bluegl_glProgramEnvParametersI4ivNV: - adrp x16, ___blue_glCore_glProgramEnvParametersI4ivNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramEnvParametersI4ivNV@GOTPAGEOFF] +_bluegl_glColor4fNormal3fVertex3fvSUN: + adrp x16, ___blue_glCore_glColor4fNormal3fVertex3fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glColor4fNormal3fVertex3fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glTexCoord4fVertex4fSUN +.private_extern _bluegl_glTexCoord2fVertex3fSUN .align 2 -_bluegl_glTexCoord4fVertex4fSUN: - adrp x16, ___blue_glCore_glTexCoord4fVertex4fSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glTexCoord4fVertex4fSUN@GOTPAGEOFF] +_bluegl_glTexCoord2fVertex3fSUN: + adrp x16, ___blue_glCore_glTexCoord2fVertex3fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord2fVertex3fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN +.private_extern _bluegl_glTexCoord2fVertex3fvSUN .align 2 -_bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN: - adrp x16, ___blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN@GOTPAGEOFF] +_bluegl_glTexCoord2fVertex3fvSUN: + adrp x16, ___blue_glCore_glTexCoord2fVertex3fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord2fVertex3fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedProgramLocalParameterfvEXT +.private_extern _bluegl_glTexCoord4fVertex4fSUN .align 2 -_bluegl_glGetNamedProgramLocalParameterfvEXT: - adrp x16, ___blue_glCore_glGetNamedProgramLocalParameterfvEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedProgramLocalParameterfvEXT@GOTPAGEOFF] +_bluegl_glTexCoord4fVertex4fSUN: + adrp x16, ___blue_glCore_glTexCoord4fVertex4fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord4fVertex4fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform1ui64ARB +.private_extern _bluegl_glTexCoord4fVertex4fvSUN .align 2 -_bluegl_glProgramUniform1ui64ARB: - adrp x16, ___blue_glCore_glProgramUniform1ui64ARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform1ui64ARB@GOTPAGEOFF] +_bluegl_glTexCoord4fVertex4fvSUN: + adrp x16, ___blue_glCore_glTexCoord4fVertex4fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord4fVertex4fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glReadInstrumentsSGIX +.private_extern _bluegl_glTexCoord2fColor4ubVertex3fSUN .align 2 -_bluegl_glReadInstrumentsSGIX: - adrp x16, ___blue_glCore_glReadInstrumentsSGIX@GOTPAGE - ldr x16, [x16, ___blue_glCore_glReadInstrumentsSGIX@GOTPAGEOFF] +_bluegl_glTexCoord2fColor4ubVertex3fSUN: + adrp x16, ___blue_glCore_glTexCoord2fColor4ubVertex3fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord2fColor4ubVertex3fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib3dNV +.private_extern _bluegl_glTexCoord2fColor4ubVertex3fvSUN .align 2 -_bluegl_glVertexAttrib3dNV: - adrp x16, ___blue_glCore_glVertexAttrib3dNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib3dNV@GOTPAGEOFF] +_bluegl_glTexCoord2fColor4ubVertex3fvSUN: + adrp x16, ___blue_glCore_glTexCoord2fColor4ubVertex3fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord2fColor4ubVertex3fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramParameter4dvNV +.private_extern _bluegl_glTexCoord2fColor3fVertex3fSUN .align 2 -_bluegl_glProgramParameter4dvNV: - adrp x16, ___blue_glCore_glProgramParameter4dvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramParameter4dvNV@GOTPAGEOFF] +_bluegl_glTexCoord2fColor3fVertex3fSUN: + adrp x16, ___blue_glCore_glTexCoord2fColor3fVertex3fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord2fColor3fVertex3fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glColorTableParameterivSGI +.private_extern _bluegl_glTexCoord2fColor3fVertex3fvSUN .align 2 -_bluegl_glColorTableParameterivSGI: - adrp x16, ___blue_glCore_glColorTableParameterivSGI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glColorTableParameterivSGI@GOTPAGEOFF] +_bluegl_glTexCoord2fColor3fVertex3fvSUN: + adrp x16, ___blue_glCore_glTexCoord2fColor3fVertex3fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord2fColor3fVertex3fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniform1f +.private_extern _bluegl_glTexCoord2fNormal3fVertex3fSUN .align 2 -_bluegl_glUniform1f: - adrp x16, ___blue_glCore_glUniform1f@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniform1f@GOTPAGEOFF] +_bluegl_glTexCoord2fNormal3fVertex3fSUN: + adrp x16, ___blue_glCore_glTexCoord2fNormal3fVertex3fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord2fNormal3fVertex3fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexRenderbufferEXT +.private_extern _bluegl_glTexCoord2fNormal3fVertex3fvSUN .align 2 -_bluegl_glMultiTexRenderbufferEXT: - adrp x16, ___blue_glCore_glMultiTexRenderbufferEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexRenderbufferEXT@GOTPAGEOFF] +_bluegl_glTexCoord2fNormal3fVertex3fvSUN: + adrp x16, ___blue_glCore_glTexCoord2fNormal3fVertex3fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord2fNormal3fVertex3fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribI4uiEXT +.private_extern _bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN .align 2 -_bluegl_glVertexAttribI4uiEXT: - adrp x16, ___blue_glCore_glVertexAttribI4uiEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribI4uiEXT@GOTPAGEOFF] +_bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN: + adrp x16, ___blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetConvolutionParameterfv +.private_extern _bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN .align 2 -_bluegl_glGetConvolutionParameterfv: - adrp x16, ___blue_glCore_glGetConvolutionParameterfv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetConvolutionParameterfv@GOTPAGEOFF] +_bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN: + adrp x16, ___blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord3sARB +.private_extern _bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN .align 2 -_bluegl_glMultiTexCoord3sARB: - adrp x16, ___blue_glCore_glMultiTexCoord3sARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord3sARB@GOTPAGEOFF] +_bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN: + adrp x16, ___blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetTexParameterxvOES +.private_extern _bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN .align 2 -_bluegl_glGetTexParameterxvOES: - adrp x16, ___blue_glCore_glGetTexParameterxvOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetTexParameterxvOES@GOTPAGEOFF] +_bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN: + adrp x16, ___blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetNamedBufferParameteriv +.private_extern _bluegl_glReplacementCodeuiVertex3fSUN .align 2 -_bluegl_glGetNamedBufferParameteriv: - adrp x16, ___blue_glCore_glGetNamedBufferParameteriv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetNamedBufferParameteriv@GOTPAGEOFF] +_bluegl_glReplacementCodeuiVertex3fSUN: + adrp x16, ___blue_glCore_glReplacementCodeuiVertex3fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeuiVertex3fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiDrawElementArrayAPPLE +.private_extern _bluegl_glReplacementCodeuiVertex3fvSUN .align 2 -_bluegl_glMultiDrawElementArrayAPPLE: - adrp x16, ___blue_glCore_glMultiDrawElementArrayAPPLE@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiDrawElementArrayAPPLE@GOTPAGEOFF] +_bluegl_glReplacementCodeuiVertex3fvSUN: + adrp x16, ___blue_glCore_glReplacementCodeuiVertex3fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeuiVertex3fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glGetnConvolutionFilter +.private_extern _bluegl_glReplacementCodeuiColor4ubVertex3fSUN .align 2 -_bluegl_glGetnConvolutionFilter: - adrp x16, ___blue_glCore_glGetnConvolutionFilter@GOTPAGE - ldr x16, [x16, ___blue_glCore_glGetnConvolutionFilter@GOTPAGEOFF] +_bluegl_glReplacementCodeuiColor4ubVertex3fSUN: + adrp x16, ___blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glUniformMatrix2x3fv +.private_extern _bluegl_glReplacementCodeuiColor4ubVertex3fvSUN .align 2 -_bluegl_glUniformMatrix2x3fv: - adrp x16, ___blue_glCore_glUniformMatrix2x3fv@GOTPAGE - ldr x16, [x16, ___blue_glCore_glUniformMatrix2x3fv@GOTPAGEOFF] +_bluegl_glReplacementCodeuiColor4ubVertex3fvSUN: + adrp x16, ___blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glBindBuffersRange +.private_extern _bluegl_glReplacementCodeuiColor3fVertex3fSUN .align 2 -_bluegl_glBindBuffersRange: - adrp x16, ___blue_glCore_glBindBuffersRange@GOTPAGE - ldr x16, [x16, ___blue_glCore_glBindBuffersRange@GOTPAGEOFF] +_bluegl_glReplacementCodeuiColor3fVertex3fSUN: + adrp x16, ___blue_glCore_glReplacementCodeuiColor3fVertex3fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeuiColor3fVertex3fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMakeImageHandleNonResidentNV +.private_extern _bluegl_glReplacementCodeuiColor3fVertex3fvSUN .align 2 -_bluegl_glMakeImageHandleNonResidentNV: - adrp x16, ___blue_glCore_glMakeImageHandleNonResidentNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMakeImageHandleNonResidentNV@GOTPAGEOFF] +_bluegl_glReplacementCodeuiColor3fVertex3fvSUN: + adrp x16, ___blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFinalCombinerInputNV +.private_extern _bluegl_glReplacementCodeuiNormal3fVertex3fSUN .align 2 -_bluegl_glFinalCombinerInputNV: - adrp x16, ___blue_glCore_glFinalCombinerInputNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFinalCombinerInputNV@GOTPAGEOFF] +_bluegl_glReplacementCodeuiNormal3fVertex3fSUN: + adrp x16, ___blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glFlush +.private_extern _bluegl_glReplacementCodeuiNormal3fVertex3fvSUN .align 2 -_bluegl_glFlush: - adrp x16, ___blue_glCore_glFlush@GOTPAGE - ldr x16, [x16, ___blue_glCore_glFlush@GOTPAGEOFF] +_bluegl_glReplacementCodeuiNormal3fVertex3fvSUN: + adrp x16, ___blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexArrayElementBuffer +.private_extern _bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN .align 2 -_bluegl_glVertexArrayElementBuffer: - adrp x16, ___blue_glCore_glVertexArrayElementBuffer@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexArrayElementBuffer@GOTPAGEOFF] +_bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN: + adrp x16, ___blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glProgramUniform4uiEXT +.private_extern _bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN .align 2 -_bluegl_glProgramUniform4uiEXT: - adrp x16, ___blue_glCore_glProgramUniform4uiEXT@GOTPAGE - ldr x16, [x16, ___blue_glCore_glProgramUniform4uiEXT@GOTPAGEOFF] +_bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN: + adrp x16, ___blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttrib4ubvNV +.private_extern _bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN .align 2 -_bluegl_glVertexAttrib4ubvNV: - adrp x16, ___blue_glCore_glVertexAttrib4ubvNV@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttrib4ubvNV@GOTPAGEOFF] +_bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN: + adrp x16, ___blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glSampleMapATI +.private_extern _bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN .align 2 -_bluegl_glSampleMapATI: - adrp x16, ___blue_glCore_glSampleMapATI@GOTPAGE - ldr x16, [x16, ___blue_glCore_glSampleMapATI@GOTPAGEOFF] +_bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN: + adrp x16, ___blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glMultiTexCoord1bOES +.private_extern _bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN .align 2 -_bluegl_glMultiTexCoord1bOES: - adrp x16, ___blue_glCore_glMultiTexCoord1bOES@GOTPAGE - ldr x16, [x16, ___blue_glCore_glMultiTexCoord1bOES@GOTPAGEOFF] +_bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN: + adrp x16, ___blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glVertexAttribParameteriAMD +.private_extern _bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN .align 2 -_bluegl_glVertexAttribParameteriAMD: - adrp x16, ___blue_glCore_glVertexAttribParameteriAMD@GOTPAGE - ldr x16, [x16, ___blue_glCore_glVertexAttribParameteriAMD@GOTPAGEOFF] +_bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN: + adrp x16, ___blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glPointParameterfARB +.private_extern _bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN .align 2 -_bluegl_glPointParameterfARB: - adrp x16, ___blue_glCore_glPointParameterfARB@GOTPAGE - ldr x16, [x16, ___blue_glCore_glPointParameterfARB@GOTPAGEOFF] +_bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN: + adrp x16, ___blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN@GOTPAGEOFF] ldr x16, [x16] br x16 -.private_extern _bluegl_glWindowPos2dMESA +.private_extern _bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN .align 2 -_bluegl_glWindowPos2dMESA: - adrp x16, ___blue_glCore_glWindowPos2dMESA@GOTPAGE - ldr x16, [x16, ___blue_glCore_glWindowPos2dMESA@GOTPAGEOFF] +_bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN: + adrp x16, ___blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN@GOTPAGE + ldr x16, [x16, ___blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN@GOTPAGEOFF] ldr x16, [x16] br x16 diff --git a/libs/bluegl/src/BlueGLCoreDarwinImpl.S b/libs/bluegl/src/BlueGLCoreDarwinImpl.S index b133275e3cc..5e101443a1d 100644 --- a/libs/bluegl/src/BlueGLCoreDarwinImpl.S +++ b/libs/bluegl/src/BlueGLCoreDarwinImpl.S @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,65 +13,69 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - /********************************************************************************************** * Generated by bluegl/bluegl-gen.py * DO NOT EDIT **********************************************************************************************/ -.private_extern _bluegl_glVertexAttrib4dARB -_bluegl_glVertexAttrib4dARB: - mov ___blue_glCore_glVertexAttrib4dARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCullFace +_bluegl_glCullFace: + mov ___blue_glCore_glCullFace@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultMatrixxOES -_bluegl_glMultMatrixxOES: - mov ___blue_glCore_glMultMatrixxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFrontFace +_bluegl_glFrontFace: + mov ___blue_glCore_glFrontFace@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramParameters4fvNV -_bluegl_glProgramParameters4fvNV: - mov ___blue_glCore_glProgramParameters4fvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glHint +_bluegl_glHint: + mov ___blue_glCore_glHint@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenProgramPipelines -_bluegl_glGenProgramPipelines: - mov ___blue_glCore_glGenProgramPipelines@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLineWidth +_bluegl_glLineWidth: + mov ___blue_glCore_glLineWidth@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoordP3uiv -_bluegl_glMultiTexCoordP3uiv: - mov ___blue_glCore_glMultiTexCoordP3uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPointSize +_bluegl_glPointSize: + mov ___blue_glCore_glPointSize@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3usv -_bluegl_glSecondaryColor3usv: - mov ___blue_glCore_glSecondaryColor3usv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPolygonMode +_bluegl_glPolygonMode: + mov ___blue_glCore_glPolygonMode@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetHistogramParameteriv -_bluegl_glGetHistogramParameteriv: - mov ___blue_glCore_glGetHistogramParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glScissor +_bluegl_glScissor: + mov ___blue_glCore_glScissor@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glRenderbufferStorageEXT -_bluegl_glRenderbufferStorageEXT: - mov ___blue_glCore_glRenderbufferStorageEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexParameterf +_bluegl_glTexParameterf: + mov ___blue_glCore_glTexParameterf@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPathParameterivNV -_bluegl_glGetPathParameterivNV: - mov ___blue_glCore_glGetPathParameterivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexParameterfv +_bluegl_glTexParameterfv: + mov ___blue_glCore_glTexParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLineWidthxOES -_bluegl_glLineWidthxOES: - mov ___blue_glCore_glLineWidthxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexParameteri +_bluegl_glTexParameteri: + mov ___blue_glCore_glTexParameteri@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGlobalAlphaFactordSUN -_bluegl_glGlobalAlphaFactordSUN: - mov ___blue_glCore_glGlobalAlphaFactordSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexParameteriv +_bluegl_glTexParameteriv: + mov ___blue_glCore_glTexParameteriv@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.private_extern _bluegl_glTexImage1D +_bluegl_glTexImage1D: + mov ___blue_glCore_glTexImage1D@GOTPCREL(%rip), %r11 jmp *(%r11) .private_extern _bluegl_glTexImage2D @@ -79,1339 +83,1349 @@ _bluegl_glTexImage2D: mov ___blue_glCore_glTexImage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGlobalAlphaFactorfSUN -_bluegl_glGlobalAlphaFactorfSUN: - mov ___blue_glCore_glGlobalAlphaFactorfSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawBuffer +_bluegl_glDrawBuffer: + mov ___blue_glCore_glDrawBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormalP3uiv -_bluegl_glNormalP3uiv: - mov ___blue_glCore_glNormalP3uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClear +_bluegl_glClear: + mov ___blue_glCore_glClear@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColor4fNormal3fVertex3fSUN -_bluegl_glColor4fNormal3fVertex3fSUN: - mov ___blue_glCore_glColor4fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearColor +_bluegl_glClearColor: + mov ___blue_glCore_glClearColor@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMapVertexAttrib1fAPPLE -_bluegl_glMapVertexAttrib1fAPPLE: - mov ___blue_glCore_glMapVertexAttrib1fAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearStencil +_bluegl_glClearStencil: + mov ___blue_glCore_glClearStencil@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord2fNormal3fVertex3fvSUN -_bluegl_glTexCoord2fNormal3fVertex3fvSUN: - mov ___blue_glCore_glTexCoord2fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearDepth +_bluegl_glClearDepth: + mov ___blue_glCore_glClearDepth@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayVertexBuffers -_bluegl_glVertexArrayVertexBuffers: - mov ___blue_glCore_glVertexArrayVertexBuffers@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStencilMask +_bluegl_glStencilMask: + mov ___blue_glCore_glStencilMask@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glShaderSource -_bluegl_glShaderSource: - mov ___blue_glCore_glShaderSource@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorMask +_bluegl_glColorMask: + mov ___blue_glCore_glColorMask@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glConvolutionFilter1D -_bluegl_glConvolutionFilter1D: - mov ___blue_glCore_glConvolutionFilter1D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDepthMask +_bluegl_glDepthMask: + mov ___blue_glCore_glDepthMask@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsFenceAPPLE -_bluegl_glIsFenceAPPLE: - mov ___blue_glCore_glIsFenceAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDisable +_bluegl_glDisable: + mov ___blue_glCore_glDisable@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2s -_bluegl_glWindowPos2s: - mov ___blue_glCore_glWindowPos2s@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEnable +_bluegl_glEnable: + mov ___blue_glCore_glEnable@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEvaluateDepthValuesARB -_bluegl_glEvaluateDepthValuesARB: - mov ___blue_glCore_glEvaluateDepthValuesARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFinish +_bluegl_glFinish: + mov ___blue_glCore_glFinish@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glInterpolatePathsNV -_bluegl_glInterpolatePathsNV: - mov ___blue_glCore_glInterpolatePathsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFlush +_bluegl_glFlush: + mov ___blue_glCore_glFlush@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureParameterivEXT -_bluegl_glTextureParameterivEXT: - mov ___blue_glCore_glTextureParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendFunc +_bluegl_glBlendFunc: + mov ___blue_glCore_glBlendFunc@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteOcclusionQueriesNV -_bluegl_glDeleteOcclusionQueriesNV: - mov ___blue_glCore_glDeleteOcclusionQueriesNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLogicOp +_bluegl_glLogicOp: + mov ___blue_glCore_glLogicOp@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMakeTextureHandleResidentARB -_bluegl_glMakeTextureHandleResidentARB: - mov ___blue_glCore_glMakeTextureHandleResidentARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStencilFunc +_bluegl_glStencilFunc: + mov ___blue_glCore_glStencilFunc@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyImageSubDataNV -_bluegl_glCopyImageSubDataNV: - mov ___blue_glCore_glCopyImageSubDataNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStencilOp +_bluegl_glStencilOp: + mov ___blue_glCore_glStencilOp@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL3d -_bluegl_glVertexAttribL3d: - mov ___blue_glCore_glVertexAttribL3d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDepthFunc +_bluegl_glDepthFunc: + mov ___blue_glCore_glDepthFunc@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureSamplerHandleNV -_bluegl_glGetTextureSamplerHandleNV: - mov ___blue_glCore_glGetTextureSamplerHandleNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPixelStoref +_bluegl_glPixelStoref: + mov ___blue_glCore_glPixelStoref@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMakeTextureHandleResidentNV -_bluegl_glMakeTextureHandleResidentNV: - mov ___blue_glCore_glMakeTextureHandleResidentNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPixelStorei +_bluegl_glPixelStorei: + mov ___blue_glCore_glPixelStorei@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPolygonOffsetxOES -_bluegl_glPolygonOffsetxOES: - mov ___blue_glCore_glPolygonOffsetxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReadBuffer +_bluegl_glReadBuffer: + mov ___blue_glCore_glReadBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix2fv -_bluegl_glUniformMatrix2fv: - mov ___blue_glCore_glUniformMatrix2fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReadPixels +_bluegl_glReadPixels: + mov ___blue_glCore_glReadPixels@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiDrawElementsEXT -_bluegl_glMultiDrawElementsEXT: - mov ___blue_glCore_glMultiDrawElementsEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetBooleanv +_bluegl_glGetBooleanv: + mov ___blue_glCore_glGetBooleanv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI1uiv -_bluegl_glVertexAttribI1uiv: - mov ___blue_glCore_glVertexAttribI1uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetDoublev +_bluegl_glGetDoublev: + mov ___blue_glCore_glGetDoublev@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathCoordsNV -_bluegl_glPathCoordsNV: - mov ___blue_glCore_glPathCoordsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetError +_bluegl_glGetError: + mov ___blue_glCore_glGetError@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayVertexBindingDivisorEXT -_bluegl_glVertexArrayVertexBindingDivisorEXT: - mov ___blue_glCore_glVertexArrayVertexBindingDivisorEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFloatv +_bluegl_glGetFloatv: + mov ___blue_glCore_glGetFloatv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2dv -_bluegl_glVertexAttrib2dv: - mov ___blue_glCore_glVertexAttrib2dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetIntegerv +_bluegl_glGetIntegerv: + mov ___blue_glCore_glGetIntegerv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFinish -_bluegl_glFinish: - mov ___blue_glCore_glFinish@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetString +_bluegl_glGetString: + mov ___blue_glCore_glGetString@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribs2dvNV -_bluegl_glVertexAttribs2dvNV: - mov ___blue_glCore_glVertexAttribs2dvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTexImage +_bluegl_glGetTexImage: + mov ___blue_glCore_glGetTexImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI1ivEXT -_bluegl_glVertexAttribI1ivEXT: - mov ___blue_glCore_glVertexAttribI1ivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTexParameterfv +_bluegl_glGetTexParameterfv: + mov ___blue_glCore_glGetTexParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2sNV -_bluegl_glVertexAttrib2sNV: - mov ___blue_glCore_glVertexAttrib2sNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTexParameteriv +_bluegl_glGetTexParameteriv: + mov ___blue_glCore_glGetTexParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1iv -_bluegl_glMultiTexCoord1iv: - mov ___blue_glCore_glMultiTexCoord1iv@GOTPCREL(%rip), %r11 - jmp *(%r11) +.private_extern _bluegl_glGetTexLevelParameterfv +_bluegl_glGetTexLevelParameterfv: + mov ___blue_glCore_glGetTexLevelParameterfv@GOTPCREL(%rip), %r11 + jmp *(%r11) -.private_extern _bluegl_glGetnMapiv -_bluegl_glGetnMapiv: - mov ___blue_glCore_glGetnMapiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTexLevelParameteriv +_bluegl_glGetTexLevelParameteriv: + mov ___blue_glCore_glGetTexLevelParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTexSubImage1DARB -_bluegl_glCompressedTexSubImage1DARB: - mov ___blue_glCore_glCompressedTexSubImage1DARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsEnabled +_bluegl_glIsEnabled: + mov ___blue_glCore_glIsEnabled@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFogCoordPointerEXT -_bluegl_glFogCoordPointerEXT: - mov ___blue_glCore_glFogCoordPointerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDepthRange +_bluegl_glDepthRange: + mov ___blue_glCore_glDepthRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedMultiTexImage1DEXT -_bluegl_glCompressedMultiTexImage1DEXT: - mov ___blue_glCore_glCompressedMultiTexImage1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glViewport +_bluegl_glViewport: + mov ___blue_glCore_glViewport@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3d -_bluegl_glVertexAttrib3d: - mov ___blue_glCore_glVertexAttrib3d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawArrays +_bluegl_glDrawArrays: + mov ___blue_glCore_glDrawArrays@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLineWidth -_bluegl_glLineWidth: - mov ___blue_glCore_glLineWidth@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawElements +_bluegl_glDrawElements: + mov ___blue_glCore_glDrawElements@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetShaderiv -_bluegl_glGetShaderiv: - mov ___blue_glCore_glGetShaderiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPointerv +_bluegl_glGetPointerv: + mov ___blue_glCore_glGetPointerv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1dv -_bluegl_glProgramUniform1dv: - mov ___blue_glCore_glProgramUniform1dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPolygonOffset +_bluegl_glPolygonOffset: + mov ___blue_glCore_glPolygonOffset@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribLui64vNV -_bluegl_glGetVertexAttribLui64vNV: - mov ___blue_glCore_glGetVertexAttribLui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyTexImage1D +_bluegl_glCopyTexImage1D: + mov ___blue_glCore_glCopyTexImage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1ui64vNV -_bluegl_glProgramUniform1ui64vNV: - mov ___blue_glCore_glProgramUniform1ui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyTexImage2D +_bluegl_glCopyTexImage2D: + mov ___blue_glCore_glCopyTexImage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetRenderbufferParameteriv -_bluegl_glGetRenderbufferParameteriv: - mov ___blue_glCore_glGetRenderbufferParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyTexSubImage1D +_bluegl_glCopyTexSubImage1D: + mov ___blue_glCore_glCopyTexSubImage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetOcclusionQueryivNV -_bluegl_glGetOcclusionQueryivNV: - mov ___blue_glCore_glGetOcclusionQueryivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyTexSubImage2D +_bluegl_glCopyTexSubImage2D: + mov ___blue_glCore_glCopyTexSubImage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix2x4dv -_bluegl_glUniformMatrix2x4dv: - mov ___blue_glCore_glUniformMatrix2x4dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexSubImage1D +_bluegl_glTexSubImage1D: + mov ___blue_glCore_glTexSubImage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribPointervNV -_bluegl_glGetVertexAttribPointervNV: - mov ___blue_glCore_glGetVertexAttribPointervNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexSubImage2D +_bluegl_glTexSubImage2D: + mov ___blue_glCore_glTexSubImage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2fv -_bluegl_glUniform2fv: - mov ___blue_glCore_glUniform2fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindTexture +_bluegl_glBindTexture: + mov ___blue_glCore_glBindTexture@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glRasterPos2xOES -_bluegl_glRasterPos2xOES: - mov ___blue_glCore_glRasterPos2xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteTextures +_bluegl_glDeleteTextures: + mov ___blue_glCore_glDeleteTextures@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetCommandHeaderNV -_bluegl_glGetCommandHeaderNV: - mov ___blue_glCore_glGetCommandHeaderNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenTextures +_bluegl_glGenTextures: + mov ___blue_glCore_glGenTextures@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformSubroutinesuiv -_bluegl_glUniformSubroutinesuiv: - mov ___blue_glCore_glUniformSubroutinesuiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsTexture +_bluegl_glIsTexture: + mov ___blue_glCore_glIsTexture@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPixelTransformParameterivEXT -_bluegl_glGetPixelTransformParameterivEXT: - mov ___blue_glCore_glGetPixelTransformParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawRangeElements +_bluegl_glDrawRangeElements: + mov ___blue_glCore_glDrawRangeElements@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFragDataLocation -_bluegl_glGetFragDataLocation: - mov ___blue_glCore_glGetFragDataLocation@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexImage3D +_bluegl_glTexImage3D: + mov ___blue_glCore_glTexImage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord2fColor3fVertex3fSUN -_bluegl_glTexCoord2fColor3fVertex3fSUN: - mov ___blue_glCore_glTexCoord2fColor3fVertex3fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexSubImage3D +_bluegl_glTexSubImage3D: + mov ___blue_glCore_glTexSubImage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3uiv -_bluegl_glSecondaryColor3uiv: - mov ___blue_glCore_glSecondaryColor3uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyTexSubImage3D +_bluegl_glCopyTexSubImage3D: + mov ___blue_glCore_glCopyTexSubImage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEnableVertexArrayAttribEXT -_bluegl_glEnableVertexArrayAttribEXT: - mov ___blue_glCore_glEnableVertexArrayAttribEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glActiveTexture +_bluegl_glActiveTexture: + mov ___blue_glCore_glActiveTexture@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPixelTexGenParameterfvSGIS -_bluegl_glPixelTexGenParameterfvSGIS: - mov ___blue_glCore_glPixelTexGenParameterfvSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSampleCoverage +_bluegl_glSampleCoverage: + mov ___blue_glCore_glSampleCoverage@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix3x4dvEXT -_bluegl_glProgramUniformMatrix3x4dvEXT: - mov ___blue_glCore_glProgramUniformMatrix3x4dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTexImage3D +_bluegl_glCompressedTexImage3D: + mov ___blue_glCore_glCompressedTexImage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2fvARB -_bluegl_glMultiTexCoord2fvARB: - mov ___blue_glCore_glMultiTexCoord2fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTexImage2D +_bluegl_glCompressedTexImage2D: + mov ___blue_glCore_glCompressedTexImage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glHistogram -_bluegl_glHistogram: - mov ___blue_glCore_glHistogram@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTexImage1D +_bluegl_glCompressedTexImage1D: + mov ___blue_glCore_glCompressedTexImage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetSynciv -_bluegl_glGetSynciv: - mov ___blue_glCore_glGetSynciv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTexSubImage3D +_bluegl_glCompressedTexSubImage3D: + mov ___blue_glCore_glCompressedTexSubImage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBitmapxOES -_bluegl_glBitmapxOES: - mov ___blue_glCore_glBitmapxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTexSubImage2D +_bluegl_glCompressedTexSubImage2D: + mov ___blue_glCore_glCompressedTexSubImage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnColorTable -_bluegl_glGetnColorTable: - mov ___blue_glCore_glGetnColorTable@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTexSubImage1D +_bluegl_glCompressedTexSubImage1D: + mov ___blue_glCore_glCompressedTexSubImage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenerateMultiTexMipmapEXT -_bluegl_glGenerateMultiTexMipmapEXT: - mov ___blue_glCore_glGenerateMultiTexMipmapEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetCompressedTexImage +_bluegl_glGetCompressedTexImage: + mov ___blue_glCore_glGetCompressedTexImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream4fvATI -_bluegl_glVertexStream4fvATI: - mov ___blue_glCore_glVertexStream4fvATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendFuncSeparate +_bluegl_glBlendFuncSeparate: + mov ___blue_glCore_glBlendFuncSeparate@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColorPointerEXT -_bluegl_glSecondaryColorPointerEXT: - mov ___blue_glCore_glSecondaryColorPointerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiDrawArrays +_bluegl_glMultiDrawArrays: + mov ___blue_glCore_glMultiDrawArrays@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribIPointerEXT -_bluegl_glVertexAttribIPointerEXT: - mov ___blue_glCore_glVertexAttribIPointerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiDrawElements +_bluegl_glMultiDrawElements: + mov ___blue_glCore_glMultiDrawElements@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEvalCoord2xvOES -_bluegl_glEvalCoord2xvOES: - mov ___blue_glCore_glEvalCoord2xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPointParameterf +_bluegl_glPointParameterf: + mov ___blue_glCore_glPointParameterf@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteFencesNV -_bluegl_glDeleteFencesNV: - mov ___blue_glCore_glDeleteFencesNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPointParameterfv +_bluegl_glPointParameterfv: + mov ___blue_glCore_glPointParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glAlphaFragmentOp1ATI -_bluegl_glAlphaFragmentOp1ATI: - mov ___blue_glCore_glAlphaFragmentOp1ATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPointParameteri +_bluegl_glPointParameteri: + mov ___blue_glCore_glPointParameteri@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetActiveUniformName -_bluegl_glGetActiveUniformName: - mov ___blue_glCore_glGetActiveUniformName@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPointParameteriv +_bluegl_glPointParameteriv: + mov ___blue_glCore_glPointParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetCompressedTextureSubImage -_bluegl_glGetCompressedTextureSubImage: - mov ___blue_glCore_glGetCompressedTextureSubImage@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendColor +_bluegl_glBlendColor: + mov ___blue_glCore_glBlendColor@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureParameterfvEXT -_bluegl_glGetTextureParameterfvEXT: - mov ___blue_glCore_glGetTextureParameterfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendEquation +_bluegl_glBlendEquation: + mov ___blue_glCore_glBlendEquation@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteShader -_bluegl_glDeleteShader: - mov ___blue_glCore_glDeleteShader@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenQueries +_bluegl_glGenQueries: + mov ___blue_glCore_glGenQueries@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glRenderbufferStorageMultisample -_bluegl_glRenderbufferStorageMultisample: - mov ___blue_glCore_glRenderbufferStorageMultisample@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteQueries +_bluegl_glDeleteQueries: + mov ___blue_glCore_glDeleteQueries@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord2fVertex3fSUN -_bluegl_glTexCoord2fVertex3fSUN: - mov ___blue_glCore_glTexCoord2fVertex3fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsQuery +_bluegl_glIsQuery: + mov ___blue_glCore_glIsQuery@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetActiveSubroutineUniformName -_bluegl_glGetActiveSubroutineUniformName: - mov ___blue_glCore_glGetActiveSubroutineUniformName@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBeginQuery +_bluegl_glBeginQuery: + mov ___blue_glCore_glBeginQuery@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVideoCaptureStreamfvNV -_bluegl_glGetVideoCaptureStreamfvNV: - mov ___blue_glCore_glGetVideoCaptureStreamfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEndQuery +_bluegl_glEndQuery: + mov ___blue_glCore_glEndQuery@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glInvalidateSubFramebuffer -_bluegl_glInvalidateSubFramebuffer: - mov ___blue_glCore_glInvalidateSubFramebuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetQueryiv +_bluegl_glGetQueryiv: + mov ___blue_glCore_glGetQueryiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIndexFormatNV -_bluegl_glIndexFormatNV: - mov ___blue_glCore_glIndexFormatNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetQueryObjectiv +_bluegl_glGetQueryObjectiv: + mov ___blue_glCore_glGetQueryObjectiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexEnvfvEXT -_bluegl_glMultiTexEnvfvEXT: - mov ___blue_glCore_glMultiTexEnvfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetQueryObjectuiv +_bluegl_glGetQueryObjectuiv: + mov ___blue_glCore_glGetQueryObjectuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformBufferEXT -_bluegl_glUniformBufferEXT: - mov ___blue_glCore_glUniformBufferEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindBuffer +_bluegl_glBindBuffer: + mov ___blue_glCore_glBindBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedProgramLocalParametersI4uivEXT -_bluegl_glNamedProgramLocalParametersI4uivEXT: - mov ___blue_glCore_glNamedProgramLocalParametersI4uivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteBuffers +_bluegl_glDeleteBuffers: + mov ___blue_glCore_glDeleteBuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWeightPathsNV -_bluegl_glWeightPathsNV: - mov ___blue_glCore_glWeightPathsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenBuffers +_bluegl_glGenBuffers: + mov ___blue_glCore_glGenBuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnHistogram -_bluegl_glGetnHistogram: - mov ___blue_glCore_glGetnHistogram@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsBuffer +_bluegl_glIsBuffer: + mov ___blue_glCore_glIsBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord1bOES -_bluegl_glTexCoord1bOES: - mov ___blue_glCore_glTexCoord1bOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBufferData +_bluegl_glBufferData: + mov ___blue_glCore_glBufferData@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSetFragmentShaderConstantATI -_bluegl_glSetFragmentShaderConstantATI: - mov ___blue_glCore_glSetFragmentShaderConstantATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBufferSubData +_bluegl_glBufferSubData: + mov ___blue_glCore_glBufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glRasterPos3xvOES -_bluegl_glRasterPos3xvOES: - mov ___blue_glCore_glRasterPos3xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetBufferSubData +_bluegl_glGetBufferSubData: + mov ___blue_glCore_glGetBufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyConvolutionFilter1DEXT -_bluegl_glCopyConvolutionFilter1DEXT: - mov ___blue_glCore_glCopyConvolutionFilter1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMapBuffer +_bluegl_glMapBuffer: + mov ___blue_glCore_glMapBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glArrayElementEXT -_bluegl_glArrayElementEXT: - mov ___blue_glCore_glArrayElementEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUnmapBuffer +_bluegl_glUnmapBuffer: + mov ___blue_glCore_glUnmapBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyTextureImage2DEXT -_bluegl_glCopyTextureImage2DEXT: - mov ___blue_glCore_glCopyTextureImage2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetBufferParameteriv +_bluegl_glGetBufferParameteriv: + mov ___blue_glCore_glGetBufferParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedProgramLocalParameterI4uivEXT -_bluegl_glNamedProgramLocalParameterI4uivEXT: - mov ___blue_glCore_glNamedProgramLocalParameterI4uivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetBufferPointerv +_bluegl_glGetBufferPointerv: + mov ___blue_glCore_glGetBufferPointerv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiDrawElementsIndirectBindlessNV -_bluegl_glMultiDrawElementsIndirectBindlessNV: - mov ___blue_glCore_glMultiDrawElementsIndirectBindlessNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendEquationSeparate +_bluegl_glBlendEquationSeparate: + mov ___blue_glCore_glBlendEquationSeparate@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearColorIuiEXT -_bluegl_glClearColorIuiEXT: - mov ___blue_glCore_glClearColorIuiEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawBuffers +_bluegl_glDrawBuffers: + mov ___blue_glCore_glDrawBuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexParameterfEXT -_bluegl_glMultiTexParameterfEXT: - mov ___blue_glCore_glMultiTexParameterfEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStencilOpSeparate +_bluegl_glStencilOpSeparate: + mov ___blue_glCore_glStencilOpSeparate@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayVertexAttribIFormatEXT -_bluegl_glVertexArrayVertexAttribIFormatEXT: - mov ___blue_glCore_glVertexArrayVertexAttribIFormatEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStencilFuncSeparate +_bluegl_glStencilFuncSeparate: + mov ___blue_glCore_glStencilFuncSeparate@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1sv -_bluegl_glVertexAttrib1sv: - mov ___blue_glCore_glVertexAttrib1sv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStencilMaskSeparate +_bluegl_glStencilMaskSeparate: + mov ___blue_glCore_glStencilMaskSeparate@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream2dvATI -_bluegl_glVertexStream2dvATI: - mov ___blue_glCore_glVertexStream2dvATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glAttachShader +_bluegl_glAttachShader: + mov ___blue_glCore_glAttachShader@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4iARB -_bluegl_glUniform4iARB: - mov ___blue_glCore_glUniform4iARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindAttribLocation +_bluegl_glBindAttribLocation: + mov ___blue_glCore_glBindAttribLocation@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribs4svNV -_bluegl_glVertexAttribs4svNV: - mov ___blue_glCore_glVertexAttribs4svNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompileShader +_bluegl_glCompileShader: + mov ___blue_glCore_glCompileShader@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix3x2dvEXT -_bluegl_glProgramUniformMatrix3x2dvEXT: - mov ___blue_glCore_glProgramUniformMatrix3x2dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreateProgram +_bluegl_glCreateProgram: + mov ___blue_glCore_glCreateProgram@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1ui -_bluegl_glProgramUniform1ui: - mov ___blue_glCore_glProgramUniform1ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreateShader +_bluegl_glCreateShader: + mov ___blue_glCore_glCreateShader@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribIFormatNV -_bluegl_glVertexAttribIFormatNV: - mov ___blue_glCore_glVertexAttribIFormatNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteProgram +_bluegl_glDeleteProgram: + mov ___blue_glCore_glDeleteProgram@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFragmentLightModelfSGIX -_bluegl_glFragmentLightModelfSGIX: - mov ___blue_glCore_glFragmentLightModelfSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteShader +_bluegl_glDeleteShader: + mov ___blue_glCore_glDeleteShader@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetActiveSubroutineName -_bluegl_glGetActiveSubroutineName: - mov ___blue_glCore_glGetActiveSubroutineName@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDetachShader +_bluegl_glDetachShader: + mov ___blue_glCore_glDetachShader@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glConvolutionParameteri -_bluegl_glConvolutionParameteri: - mov ___blue_glCore_glConvolutionParameteri@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDisableVertexAttribArray +_bluegl_glDisableVertexAttribArray: + mov ___blue_glCore_glDisableVertexAttribArray@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4f -_bluegl_glMultiTexCoord4f: - mov ___blue_glCore_glMultiTexCoord4f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEnableVertexAttribArray +_bluegl_glEnableVertexAttribArray: + mov ___blue_glCore_glEnableVertexAttribArray@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord1xvOES -_bluegl_glTexCoord1xvOES: - mov ___blue_glCore_glTexCoord1xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetActiveAttrib +_bluegl_glGetActiveAttrib: + mov ___blue_glCore_glGetActiveAttrib@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsTransformFeedback -_bluegl_glIsTransformFeedback: - mov ___blue_glCore_glIsTransformFeedback@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetActiveUniform +_bluegl_glGetActiveUniform: + mov ___blue_glCore_glGetActiveUniform@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendBarrierKHR -_bluegl_glBlendBarrierKHR: - mov ___blue_glCore_glBlendBarrierKHR@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetAttachedShaders +_bluegl_glGetAttachedShaders: + mov ___blue_glCore_glGetAttachedShaders@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindBufferRangeEXT -_bluegl_glBindBufferRangeEXT: - mov ___blue_glCore_glBindBufferRangeEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetAttribLocation +_bluegl_glGetAttribLocation: + mov ___blue_glCore_glGetAttribLocation@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathColorGenNV -_bluegl_glPathColorGenNV: - mov ___blue_glCore_glPathColorGenNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramiv +_bluegl_glGetProgramiv: + mov ___blue_glCore_glGetProgramiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEndQuery -_bluegl_glEndQuery: - mov ___blue_glCore_glEndQuery@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramInfoLog +_bluegl_glGetProgramInfoLog: + mov ___blue_glCore_glGetProgramInfoLog@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix2x4fv -_bluegl_glUniformMatrix2x4fv: - mov ___blue_glCore_glUniformMatrix2x4fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetShaderiv +_bluegl_glGetShaderiv: + mov ___blue_glCore_glGetShaderiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenRenderbuffers -_bluegl_glGenRenderbuffers: - mov ___blue_glCore_glGenRenderbuffers@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetShaderInfoLog +_bluegl_glGetShaderInfoLog: + mov ___blue_glCore_glGetShaderInfoLog@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glShaderOp2EXT -_bluegl_glShaderOp2EXT: - mov ___blue_glCore_glShaderOp2EXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetShaderSource +_bluegl_glGetShaderSource: + mov ___blue_glCore_glGetShaderSource@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawTransformFeedback -_bluegl_glDrawTransformFeedback: - mov ___blue_glCore_glDrawTransformFeedback@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetUniformLocation +_bluegl_glGetUniformLocation: + mov ___blue_glCore_glGetUniformLocation@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3ui64vNV -_bluegl_glProgramUniform3ui64vNV: - mov ___blue_glCore_glProgramUniform3ui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetUniformfv +_bluegl_glGetUniformfv: + mov ___blue_glCore_glGetUniformfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedBufferStorage -_bluegl_glNamedBufferStorage: - mov ___blue_glCore_glNamedBufferStorage@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetUniformiv +_bluegl_glGetUniformiv: + mov ___blue_glCore_glGetUniformiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glOrthoxOES -_bluegl_glOrthoxOES: - mov ___blue_glCore_glOrthoxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribdv +_bluegl_glGetVertexAttribdv: + mov ___blue_glCore_glGetVertexAttribdv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4ubvARB -_bluegl_glVertexAttrib4ubvARB: - mov ___blue_glCore_glVertexAttrib4ubvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribfv +_bluegl_glGetVertexAttribfv: + mov ___blue_glCore_glGetVertexAttribfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStencilOp -_bluegl_glStencilOp: - mov ___blue_glCore_glStencilOp@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribiv +_bluegl_glGetVertexAttribiv: + mov ___blue_glCore_glGetVertexAttribiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramLocalParametersI4ivNV -_bluegl_glProgramLocalParametersI4ivNV: - mov ___blue_glCore_glProgramLocalParametersI4ivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribPointerv +_bluegl_glGetVertexAttribPointerv: + mov ___blue_glCore_glGetVertexAttribPointerv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream2iATI -_bluegl_glVertexStream2iATI: - mov ___blue_glCore_glVertexStream2iATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsProgram +_bluegl_glIsProgram: + mov ___blue_glCore_glIsProgram@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWeightdvARB -_bluegl_glWeightdvARB: - mov ___blue_glCore_glWeightdvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsShader +_bluegl_glIsShader: + mov ___blue_glCore_glIsShader@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1fARB -_bluegl_glVertexAttrib1fARB: - mov ___blue_glCore_glVertexAttrib1fARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLinkProgram +_bluegl_glLinkProgram: + mov ___blue_glCore_glLinkProgram@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorFragmentOp2ATI -_bluegl_glColorFragmentOp2ATI: - mov ___blue_glCore_glColorFragmentOp2ATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glShaderSource +_bluegl_glShaderSource: + mov ___blue_glCore_glShaderSource@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetBufferPointervARB -_bluegl_glGetBufferPointervARB: - mov ___blue_glCore_glGetBufferPointervARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUseProgram +_bluegl_glUseProgram: + mov ___blue_glCore_glUseProgram@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedFramebufferTexture1DEXT -_bluegl_glNamedFramebufferTexture1DEXT: - mov ___blue_glCore_glNamedFramebufferTexture1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1f +_bluegl_glUniform1f: + mov ___blue_glCore_glUniform1f@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2fNV -_bluegl_glVertexAttrib2fNV: - mov ___blue_glCore_glVertexAttrib2fNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2f +_bluegl_glUniform2f: + mov ___blue_glCore_glUniform2f@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDisableVertexAttribArray -_bluegl_glDisableVertexAttribArray: - mov ___blue_glCore_glDisableVertexAttribArray@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3f +_bluegl_glUniform3f: + mov ___blue_glCore_glUniform3f@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureParameterf -_bluegl_glTextureParameterf: - mov ___blue_glCore_glTextureParameterf@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4f +_bluegl_glUniform4f: + mov ___blue_glCore_glUniform4f@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN -_bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN: - mov ___blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1i +_bluegl_glUniform1i: + mov ___blue_glCore_glUniform1i@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormal3fVertex3fSUN -_bluegl_glNormal3fVertex3fSUN: - mov ___blue_glCore_glNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2i +_bluegl_glUniform2i: + mov ___blue_glCore_glUniform2i@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.private_extern _bluegl_glUniform3i +_bluegl_glUniform3i: + mov ___blue_glCore_glUniform3i@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTexBumpParameterfvATI -_bluegl_glGetTexBumpParameterfvATI: - mov ___blue_glCore_glGetTexBumpParameterfvATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4i +_bluegl_glUniform4i: + mov ___blue_glCore_glUniform4i@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3fARB -_bluegl_glMultiTexCoord3fARB: - mov ___blue_glCore_glMultiTexCoord3fARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1fv +_bluegl_glUniform1fv: + mov ___blue_glCore_glUniform1fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureParameterfv -_bluegl_glTextureParameterfv: - mov ___blue_glCore_glTextureParameterfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2fv +_bluegl_glUniform2fv: + mov ___blue_glCore_glUniform2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexBumpParameterivATI -_bluegl_glTexBumpParameterivATI: - mov ___blue_glCore_glTexBumpParameterivATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3fv +_bluegl_glUniform3fv: + mov ___blue_glCore_glUniform3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLockArraysEXT -_bluegl_glLockArraysEXT: - mov ___blue_glCore_glLockArraysEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4fv +_bluegl_glUniform4fv: + mov ___blue_glCore_glUniform4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsEnabledIndexedEXT -_bluegl_glIsEnabledIndexedEXT: - mov ___blue_glCore_glIsEnabledIndexedEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1iv +_bluegl_glUniform1iv: + mov ___blue_glCore_glUniform1iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenerateMipmapEXT -_bluegl_glGenerateMipmapEXT: - mov ___blue_glCore_glGenerateMipmapEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2iv +_bluegl_glUniform2iv: + mov ___blue_glCore_glUniform2iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexP3uiv -_bluegl_glVertexP3uiv: - mov ___blue_glCore_glVertexP3uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3iv +_bluegl_glUniform3iv: + mov ___blue_glCore_glUniform3iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearNamedBufferSubData -_bluegl_glClearNamedBufferSubData: - mov ___blue_glCore_glClearNamedBufferSubData@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4iv +_bluegl_glUniform4iv: + mov ___blue_glCore_glUniform4iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glInvalidateTexImage -_bluegl_glInvalidateTexImage: - mov ___blue_glCore_glInvalidateTexImage@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix2fv +_bluegl_glUniformMatrix2fv: + mov ___blue_glCore_glUniformMatrix2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindFramebuffer -_bluegl_glBindFramebuffer: - mov ___blue_glCore_glBindFramebuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix3fv +_bluegl_glUniformMatrix3fv: + mov ___blue_glCore_glUniformMatrix3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawArraysIndirect -_bluegl_glDrawArraysIndirect: - mov ___blue_glCore_glDrawArraysIndirect@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix4fv +_bluegl_glUniformMatrix4fv: + mov ___blue_glCore_glUniformMatrix4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClipPlanexOES -_bluegl_glClipPlanexOES: - mov ___blue_glCore_glClipPlanexOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glValidateProgram +_bluegl_glValidateProgram: + mov ___blue_glCore_glValidateProgram@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFloati_v -_bluegl_glGetFloati_v: - mov ___blue_glCore_glGetFloati_v@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1d +_bluegl_glVertexAttrib1d: + mov ___blue_glCore_glVertexAttrib1d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTransformFeedbackVaryingsEXT -_bluegl_glTransformFeedbackVaryingsEXT: - mov ___blue_glCore_glTransformFeedbackVaryingsEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1dv +_bluegl_glVertexAttrib1dv: + mov ___blue_glCore_glVertexAttrib1dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetColorTableParameteriv -_bluegl_glGetColorTableParameteriv: - mov ___blue_glCore_glGetColorTableParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1f +_bluegl_glVertexAttrib1f: + mov ___blue_glCore_glVertexAttrib1f@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexBufferRange -_bluegl_glTexBufferRange: - mov ___blue_glCore_glTexBufferRange@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1fv +_bluegl_glVertexAttrib1fv: + mov ___blue_glCore_glVertexAttrib1fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI1uivEXT -_bluegl_glVertexAttribI1uivEXT: - mov ___blue_glCore_glVertexAttribI1uivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1s +_bluegl_glVertexAttrib1s: + mov ___blue_glCore_glVertexAttrib1s@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glShaderBinary -_bluegl_glShaderBinary: - mov ___blue_glCore_glShaderBinary@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1sv +_bluegl_glVertexAttrib1sv: + mov ___blue_glCore_glVertexAttrib1sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribLi64vNV -_bluegl_glGetVertexAttribLi64vNV: - mov ___blue_glCore_glGetVertexAttribLi64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2d +_bluegl_glVertexAttrib2d: + mov ___blue_glCore_glVertexAttrib2d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedBufferSubDataEXT -_bluegl_glGetNamedBufferSubDataEXT: - mov ___blue_glCore_glGetNamedBufferSubDataEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2dv +_bluegl_glVertexAttrib2dv: + mov ___blue_glCore_glVertexAttrib2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3uivEXT -_bluegl_glUniform3uivEXT: - mov ___blue_glCore_glUniform3uivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2f +_bluegl_glVertexAttrib2f: + mov ___blue_glCore_glVertexAttrib2f@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixTranslatefEXT -_bluegl_glMatrixTranslatefEXT: - mov ___blue_glCore_glMatrixTranslatefEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2fv +_bluegl_glVertexAttrib2fv: + mov ___blue_glCore_glVertexAttrib2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribs2hvNV -_bluegl_glVertexAttribs2hvNV: - mov ___blue_glCore_glVertexAttribs2hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2s +_bluegl_glVertexAttrib2s: + mov ___blue_glCore_glVertexAttrib2s@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearBufferSubData -_bluegl_glClearBufferSubData: - mov ___blue_glCore_glClearBufferSubData@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2sv +_bluegl_glVertexAttrib2sv: + mov ___blue_glCore_glVertexAttrib2sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenFramebuffers -_bluegl_glGenFramebuffers: - mov ___blue_glCore_glGenFramebuffers@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3d +_bluegl_glVertexAttrib3d: + mov ___blue_glCore_glVertexAttrib3d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayAttribFormat -_bluegl_glVertexArrayAttribFormat: - mov ___blue_glCore_glVertexArrayAttribFormat@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3dv +_bluegl_glVertexAttrib3dv: + mov ___blue_glCore_glVertexAttrib3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetActiveUniformsiv -_bluegl_glGetActiveUniformsiv: - mov ___blue_glCore_glGetActiveUniformsiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3f +_bluegl_glVertexAttrib3f: + mov ___blue_glCore_glVertexAttrib3f@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTextureSubImage1DEXT -_bluegl_glCompressedTextureSubImage1DEXT: - mov ___blue_glCore_glCompressedTextureSubImage1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3fv +_bluegl_glVertexAttrib3fv: + mov ___blue_glCore_glVertexAttrib3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsRenderbuffer -_bluegl_glIsRenderbuffer: - mov ___blue_glCore_glIsRenderbuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3s +_bluegl_glVertexAttrib3s: + mov ___blue_glCore_glVertexAttrib3s@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPresentFrameKeyedNV -_bluegl_glPresentFrameKeyedNV: - mov ___blue_glCore_glPresentFrameKeyedNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3sv +_bluegl_glVertexAttrib3sv: + mov ___blue_glCore_glVertexAttrib3sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix3fvEXT -_bluegl_glProgramUniformMatrix3fvEXT: - mov ___blue_glCore_glProgramUniformMatrix3fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4Nbv +_bluegl_glVertexAttrib4Nbv: + mov ___blue_glCore_glVertexAttrib4Nbv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL2i64vNV -_bluegl_glVertexAttribL2i64vNV: - mov ___blue_glCore_glVertexAttribL2i64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4Niv +_bluegl_glVertexAttrib4Niv: + mov ___blue_glCore_glVertexAttrib4Niv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFogCoordhvNV -_bluegl_glFogCoordhvNV: - mov ___blue_glCore_glFogCoordhvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4Nsv +_bluegl_glVertexAttrib4Nsv: + mov ___blue_glCore_glVertexAttrib4Nsv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4ubv -_bluegl_glVertexAttrib4ubv: - mov ___blue_glCore_glVertexAttrib4ubv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4Nub +_bluegl_glVertexAttrib4Nub: + mov ___blue_glCore_glVertexAttrib4Nub@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPushClientAttribDefaultEXT -_bluegl_glPushClientAttribDefaultEXT: - mov ___blue_glCore_glPushClientAttribDefaultEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4Nubv +_bluegl_glVertexAttrib4Nubv: + mov ___blue_glCore_glVertexAttrib4Nubv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3ivMESA -_bluegl_glWindowPos3ivMESA: - mov ___blue_glCore_glWindowPos3ivMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4Nuiv +_bluegl_glVertexAttrib4Nuiv: + mov ___blue_glCore_glVertexAttrib4Nuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPrimitiveRestartIndexNV -_bluegl_glPrimitiveRestartIndexNV: - mov ___blue_glCore_glPrimitiveRestartIndexNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4Nusv +_bluegl_glVertexAttrib4Nusv: + mov ___blue_glCore_glVertexAttrib4Nusv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreatePerfQueryINTEL -_bluegl_glCreatePerfQueryINTEL: - mov ___blue_glCore_glCreatePerfQueryINTEL@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4bv +_bluegl_glVertexAttrib4bv: + mov ___blue_glCore_glVertexAttrib4bv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramLocalParameterIuivNV -_bluegl_glGetProgramLocalParameterIuivNV: - mov ___blue_glCore_glGetProgramLocalParameterIuivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4d +_bluegl_glVertexAttrib4d: + mov ___blue_glCore_glVertexAttrib4d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glResizeBuffersMESA -_bluegl_glResizeBuffersMESA: - mov ___blue_glCore_glResizeBuffersMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4dv +_bluegl_glVertexAttrib4dv: + mov ___blue_glCore_glVertexAttrib4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream1fATI -_bluegl_glVertexStream1fATI: - mov ___blue_glCore_glVertexStream1fATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4f +_bluegl_glVertexAttrib4f: + mov ___blue_glCore_glVertexAttrib4f@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2ui -_bluegl_glProgramUniform2ui: - mov ___blue_glCore_glProgramUniform2ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4fv +_bluegl_glVertexAttrib4fv: + mov ___blue_glCore_glVertexAttrib4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3iv -_bluegl_glSecondaryColor3iv: - mov ___blue_glCore_glSecondaryColor3iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4iv +_bluegl_glVertexAttrib4iv: + mov ___blue_glCore_glVertexAttrib4iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramParameters4dvNV -_bluegl_glProgramParameters4dvNV: - mov ___blue_glCore_glProgramParameters4dvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4s +_bluegl_glVertexAttrib4s: + mov ___blue_glCore_glVertexAttrib4s@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3i -_bluegl_glWindowPos3i: - mov ___blue_glCore_glWindowPos3i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4sv +_bluegl_glVertexAttrib4sv: + mov ___blue_glCore_glVertexAttrib4sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glRectxvOES -_bluegl_glRectxvOES: - mov ___blue_glCore_glRectxvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4ubv +_bluegl_glVertexAttrib4ubv: + mov ___blue_glCore_glVertexAttrib4ubv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4iARB -_bluegl_glMultiTexCoord4iARB: - mov ___blue_glCore_glMultiTexCoord4iARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4uiv +_bluegl_glVertexAttrib4uiv: + mov ___blue_glCore_glVertexAttrib4uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBeginConditionalRender -_bluegl_glBeginConditionalRender: - mov ___blue_glCore_glBeginConditionalRender@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4usv +_bluegl_glVertexAttrib4usv: + mov ___blue_glCore_glVertexAttrib4usv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFreeObjectBufferATI -_bluegl_glFreeObjectBufferATI: - mov ___blue_glCore_glFreeObjectBufferATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribPointer +_bluegl_glVertexAttribPointer: + mov ___blue_glCore_glVertexAttribPointer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetOcclusionQueryuivNV -_bluegl_glGetOcclusionQueryuivNV: - mov ___blue_glCore_glGetOcclusionQueryuivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix2x3fv +_bluegl_glUniformMatrix2x3fv: + mov ___blue_glCore_glUniformMatrix2x3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorP4ui -_bluegl_glColorP4ui: - mov ___blue_glCore_glColorP4ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix3x2fv +_bluegl_glUniformMatrix3x2fv: + mov ___blue_glCore_glUniformMatrix3x2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPathColorGenivNV -_bluegl_glGetPathColorGenivNV: - mov ___blue_glCore_glGetPathColorGenivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix2x4fv +_bluegl_glUniformMatrix2x4fv: + mov ___blue_glCore_glUniformMatrix2x4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetQueryiv -_bluegl_glGetQueryiv: - mov ___blue_glCore_glGetQueryiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix4x2fv +_bluegl_glUniformMatrix4x2fv: + mov ___blue_glCore_glUniformMatrix4x2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI2uiv -_bluegl_glVertexAttribI2uiv: - mov ___blue_glCore_glVertexAttribI2uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix3x4fv +_bluegl_glUniformMatrix3x4fv: + mov ___blue_glCore_glUniformMatrix3x4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexArrayPointeri_vEXT -_bluegl_glGetVertexArrayPointeri_vEXT: - mov ___blue_glCore_glGetVertexArrayPointeri_vEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix4x3fv +_bluegl_glUniformMatrix4x3fv: + mov ___blue_glCore_glUniformMatrix4x3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSamplerParameteri -_bluegl_glSamplerParameteri: - mov ___blue_glCore_glSamplerParameteri@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorMaski +_bluegl_glColorMaski: + mov ___blue_glCore_glColorMaski@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glResumeTransformFeedbackNV -_bluegl_glResumeTransformFeedbackNV: - mov ___blue_glCore_glResumeTransformFeedbackNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetBooleani_v +_bluegl_glGetBooleani_v: + mov ___blue_glCore_glGetBooleani_v@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL1ui64vNV -_bluegl_glVertexAttribL1ui64vNV: - mov ___blue_glCore_glVertexAttribL1ui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetIntegeri_v +_bluegl_glGetIntegeri_v: + mov ___blue_glCore_glGetIntegeri_v@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPauseTransformFeedbackNV -_bluegl_glPauseTransformFeedbackNV: - mov ___blue_glCore_glPauseTransformFeedbackNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEnablei +_bluegl_glEnablei: + mov ___blue_glCore_glEnablei@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribs2fvNV -_bluegl_glVertexAttribs2fvNV: - mov ___blue_glCore_glVertexAttribs2fvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDisablei +_bluegl_glDisablei: + mov ___blue_glCore_glDisablei@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1iv -_bluegl_glProgramUniform1iv: - mov ___blue_glCore_glProgramUniform1iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsEnabledi +_bluegl_glIsEnabledi: + mov ___blue_glCore_glIsEnabledi@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetColorTableSGI -_bluegl_glGetColorTableSGI: - mov ___blue_glCore_glGetColorTableSGI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBeginTransformFeedback +_bluegl_glBeginTransformFeedback: + mov ___blue_glCore_glBeginTransformFeedback@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetActiveAttrib -_bluegl_glGetActiveAttrib: - mov ___blue_glCore_glGetActiveAttrib@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEndTransformFeedback +_bluegl_glEndTransformFeedback: + mov ___blue_glCore_glEndTransformFeedback@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glResetMinmax -_bluegl_glResetMinmax: - mov ___blue_glCore_glResetMinmax@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindBufferRange +_bluegl_glBindBufferRange: + mov ___blue_glCore_glBindBufferRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBinormal3svEXT -_bluegl_glBinormal3svEXT: - mov ___blue_glCore_glBinormal3svEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindBufferBase +_bluegl_glBindBufferBase: + mov ___blue_glCore_glBindBufferBase@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4fv -_bluegl_glVertexAttrib4fv: - mov ___blue_glCore_glVertexAttrib4fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTransformFeedbackVaryings +_bluegl_glTransformFeedbackVaryings: + mov ___blue_glCore_glTransformFeedbackVaryings@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIndexxOES -_bluegl_glIndexxOES: - mov ___blue_glCore_glIndexxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTransformFeedbackVarying +_bluegl_glGetTransformFeedbackVarying: + mov ___blue_glCore_glGetTransformFeedbackVarying@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixMultTransposefEXT -_bluegl_glMatrixMultTransposefEXT: - mov ___blue_glCore_glMatrixMultTransposefEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClampColor +_bluegl_glClampColor: + mov ___blue_glCore_glClampColor@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedFramebufferTexture -_bluegl_glNamedFramebufferTexture: - mov ___blue_glCore_glNamedFramebufferTexture@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBeginConditionalRender +_bluegl_glBeginConditionalRender: + mov ___blue_glCore_glBeginConditionalRender@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexP2uiv -_bluegl_glVertexP2uiv: - mov ___blue_glCore_glVertexP2uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEndConditionalRender +_bluegl_glEndConditionalRender: + mov ___blue_glCore_glEndConditionalRender@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMemoryBarrier -_bluegl_glMemoryBarrier: - mov ___blue_glCore_glMemoryBarrier@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribIPointer +_bluegl_glVertexAttribIPointer: + mov ___blue_glCore_glVertexAttribIPointer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetGraphicsResetStatusARB -_bluegl_glGetGraphicsResetStatusARB: - mov ___blue_glCore_glGetGraphicsResetStatusARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribIiv +_bluegl_glGetVertexAttribIiv: + mov ___blue_glCore_glGetVertexAttribIiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindAttribLocation -_bluegl_glBindAttribLocation: - mov ___blue_glCore_glBindAttribLocation@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribIuiv +_bluegl_glGetVertexAttribIuiv: + mov ___blue_glCore_glGetVertexAttribIuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexBlendEnviATI -_bluegl_glVertexBlendEnviATI: - mov ___blue_glCore_glVertexBlendEnviATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI1i +_bluegl_glVertexAttribI1i: + mov ___blue_glCore_glVertexAttribI1i@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glAttachObjectARB -_bluegl_glAttachObjectARB: - mov ___blue_glCore_glAttachObjectARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI2i +_bluegl_glVertexAttribI2i: + mov ___blue_glCore_glVertexAttribI2i@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormalStream3bvATI -_bluegl_glNormalStream3bvATI: - mov ___blue_glCore_glNormalStream3bvATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI3i +_bluegl_glVertexAttribI3i: + mov ___blue_glCore_glVertexAttribI3i@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedFramebufferTextureFaceEXT -_bluegl_glNamedFramebufferTextureFaceEXT: - mov ___blue_glCore_glNamedFramebufferTextureFaceEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI4i +_bluegl_glVertexAttribI4i: + mov ___blue_glCore_glVertexAttribI4i@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetConvolutionParameterivEXT -_bluegl_glGetConvolutionParameterivEXT: - mov ___blue_glCore_glGetConvolutionParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI1ui +_bluegl_glVertexAttribI1ui: + mov ___blue_glCore_glVertexAttribI1ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramPathFragmentInputGenNV -_bluegl_glProgramPathFragmentInputGenNV: - mov ___blue_glCore_glProgramPathFragmentInputGenNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI2ui +_bluegl_glVertexAttribI2ui: + mov ___blue_glCore_glVertexAttribI2ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsFramebufferEXT -_bluegl_glIsFramebufferEXT: - mov ___blue_glCore_glIsFramebufferEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI3ui +_bluegl_glVertexAttribI3ui: + mov ___blue_glCore_glVertexAttribI3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsVertexArray -_bluegl_glIsVertexArray: - mov ___blue_glCore_glIsVertexArray@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI4ui +_bluegl_glVertexAttribI4ui: + mov ___blue_glCore_glVertexAttribI4ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribIivEXT -_bluegl_glGetVertexAttribIivEXT: - mov ___blue_glCore_glGetVertexAttribIivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI1iv +_bluegl_glVertexAttribI1iv: + mov ___blue_glCore_glVertexAttribI1iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureParameterIivEXT -_bluegl_glTextureParameterIivEXT: - mov ___blue_glCore_glTextureParameterIivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI2iv +_bluegl_glVertexAttribI2iv: + mov ___blue_glCore_glVertexAttribI2iv@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.private_extern _bluegl_glVertexAttribI3iv +_bluegl_glVertexAttribI3iv: + mov ___blue_glCore_glVertexAttribI3iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnPixelMapuiv -_bluegl_glGetnPixelMapuiv: - mov ___blue_glCore_glGetnPixelMapuiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI4iv +_bluegl_glVertexAttribI4iv: + mov ___blue_glCore_glVertexAttribI4iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetInvariantFloatvEXT -_bluegl_glGetInvariantFloatvEXT: - mov ___blue_glCore_glGetInvariantFloatvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI1uiv +_bluegl_glVertexAttribI1uiv: + mov ___blue_glCore_glVertexAttribI1uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glAttachShader -_bluegl_glAttachShader: - mov ___blue_glCore_glAttachShader@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI2uiv +_bluegl_glVertexAttribI2uiv: + mov ___blue_glCore_glVertexAttribI2uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3i -_bluegl_glSecondaryColor3i: - mov ___blue_glCore_glSecondaryColor3i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI3uiv +_bluegl_glVertexAttribI3uiv: + mov ___blue_glCore_glVertexAttribI3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord4hvNV -_bluegl_glTexCoord4hvNV: - mov ___blue_glCore_glTexCoord4hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI4uiv +_bluegl_glVertexAttribI4uiv: + mov ___blue_glCore_glVertexAttribI4uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorTableSGI -_bluegl_glColorTableSGI: - mov ___blue_glCore_glColorTableSGI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI4bv +_bluegl_glVertexAttribI4bv: + mov ___blue_glCore_glVertexAttribI4bv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4uivEXT -_bluegl_glProgramUniform4uivEXT: - mov ___blue_glCore_glProgramUniform4uivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI4sv +_bluegl_glVertexAttribI4sv: + mov ___blue_glCore_glVertexAttribI4sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPointSizexOES -_bluegl_glPointSizexOES: - mov ___blue_glCore_glPointSizexOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI4ubv +_bluegl_glVertexAttribI4ubv: + mov ___blue_glCore_glVertexAttribI4ubv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTrackMatrixNV -_bluegl_glTrackMatrixNV: - mov ___blue_glCore_glTrackMatrixNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI4usv +_bluegl_glVertexAttribI4usv: + mov ___blue_glCore_glVertexAttribI4usv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1fv -_bluegl_glMultiTexCoord1fv: - mov ___blue_glCore_glMultiTexCoord1fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetUniformuiv +_bluegl_glGetUniformuiv: + mov ___blue_glCore_glGetUniformuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColorPointerListIBM -_bluegl_glSecondaryColorPointerListIBM: - mov ___blue_glCore_glSecondaryColorPointerListIBM@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindFragDataLocation +_bluegl_glBindFragDataLocation: + mov ___blue_glCore_glBindFragDataLocation@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenBuffersARB -_bluegl_glGenBuffersARB: - mov ___blue_glCore_glGenBuffersARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFragDataLocation +_bluegl_glGetFragDataLocation: + mov ___blue_glCore_glGetFragDataLocation@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN -_bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN: - mov ___blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1ui +_bluegl_glUniform1ui: + mov ___blue_glCore_glUniform1ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyColorTable -_bluegl_glCopyColorTable: - mov ___blue_glCore_glCopyColorTable@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2ui +_bluegl_glUniform2ui: + mov ___blue_glCore_glUniform2ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexPageCommitmentARB -_bluegl_glTexPageCommitmentARB: - mov ___blue_glCore_glTexPageCommitmentARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3ui +_bluegl_glUniform3ui: + mov ___blue_glCore_glUniform3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSetFenceAPPLE -_bluegl_glSetFenceAPPLE: - mov ___blue_glCore_glSetFenceAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4ui +_bluegl_glUniform4ui: + mov ___blue_glCore_glUniform4ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2dvARB -_bluegl_glMultiTexCoord2dvARB: - mov ___blue_glCore_glMultiTexCoord2dvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1uiv +_bluegl_glUniform1uiv: + mov ___blue_glCore_glUniform1uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertex4hvNV -_bluegl_glVertex4hvNV: - mov ___blue_glCore_glVertex4hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2uiv +_bluegl_glUniform2uiv: + mov ___blue_glCore_glUniform2uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindVertexBuffer -_bluegl_glBindVertexBuffer: - mov ___blue_glCore_glBindVertexBuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3uiv +_bluegl_glUniform3uiv: + mov ___blue_glCore_glUniform3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertex3xvOES -_bluegl_glVertex3xvOES: - mov ___blue_glCore_glVertex3xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4uiv +_bluegl_glUniform4uiv: + mov ___blue_glCore_glUniform4uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glConvolutionParameterivEXT -_bluegl_glConvolutionParameterivEXT: - mov ___blue_glCore_glConvolutionParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexParameterIiv +_bluegl_glTexParameterIiv: + mov ___blue_glCore_glTexParameterIiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3ui64vARB -_bluegl_glProgramUniform3ui64vARB: - mov ___blue_glCore_glProgramUniform3ui64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexParameterIuiv +_bluegl_glTexParameterIuiv: + mov ___blue_glCore_glTexParameterIuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2dv -_bluegl_glProgramUniform2dv: - mov ___blue_glCore_glProgramUniform2dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTexParameterIiv +_bluegl_glGetTexParameterIiv: + mov ___blue_glCore_glGetTexParameterIiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos4sMESA -_bluegl_glWindowPos4sMESA: - mov ___blue_glCore_glWindowPos4sMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTexParameterIuiv +_bluegl_glGetTexParameterIuiv: + mov ___blue_glCore_glGetTexParameterIuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexImage1DEXT -_bluegl_glMultiTexImage1DEXT: - mov ___blue_glCore_glMultiTexImage1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearBufferiv +_bluegl_glClearBufferiv: + mov ___blue_glCore_glClearBufferiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glRenderbufferStorage -_bluegl_glRenderbufferStorage: - mov ___blue_glCore_glRenderbufferStorage@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearBufferuiv +_bluegl_glClearBufferuiv: + mov ___blue_glCore_glClearBufferuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glConvolutionFilter2D -_bluegl_glConvolutionFilter2D: - mov ___blue_glCore_glConvolutionFilter2D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearBufferfv +_bluegl_glClearBufferfv: + mov ___blue_glCore_glClearBufferfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBinormal3bEXT -_bluegl_glBinormal3bEXT: - mov ___blue_glCore_glBinormal3bEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearBufferfi +_bluegl_glClearBufferfi: + mov ___blue_glCore_glClearBufferfi@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFragmentLightivSGIX -_bluegl_glFragmentLightivSGIX: - mov ___blue_glCore_glFragmentLightivSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetStringi +_bluegl_glGetStringi: + mov ___blue_glCore_glGetStringi@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3iv -_bluegl_glProgramUniform3iv: - mov ___blue_glCore_glProgramUniform3iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsRenderbuffer +_bluegl_glIsRenderbuffer: + mov ___blue_glCore_glIsRenderbuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsQuery -_bluegl_glIsQuery: - mov ___blue_glCore_glIsQuery@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindRenderbuffer +_bluegl_glBindRenderbuffer: + mov ___blue_glCore_glBindRenderbuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream2sATI -_bluegl_glVertexStream2sATI: - mov ___blue_glCore_glVertexStream2sATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteRenderbuffers +_bluegl_glDeleteRenderbuffers: + mov ___blue_glCore_glDeleteRenderbuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4iEXT -_bluegl_glProgramUniform4iEXT: - mov ___blue_glCore_glProgramUniform4iEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenRenderbuffers +_bluegl_glGenRenderbuffers: + mov ___blue_glCore_glGenRenderbuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetInvariantBooleanvEXT -_bluegl_glGetInvariantBooleanvEXT: - mov ___blue_glCore_glGetInvariantBooleanvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glRenderbufferStorage +_bluegl_glRenderbufferStorage: + mov ___blue_glCore_glRenderbufferStorage@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColorFormatNV -_bluegl_glSecondaryColorFormatNV: - mov ___blue_glCore_glSecondaryColorFormatNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetRenderbufferParameteriv +_bluegl_glGetRenderbufferParameteriv: + mov ___blue_glCore_glGetRenderbufferParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4fNV -_bluegl_glVertexAttrib4fNV: - mov ___blue_glCore_glVertexAttrib4fNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsFramebuffer +_bluegl_glIsFramebuffer: + mov ___blue_glCore_glIsFramebuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorFragmentOp1ATI -_bluegl_glColorFragmentOp1ATI: - mov ___blue_glCore_glColorFragmentOp1ATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindFramebuffer +_bluegl_glBindFramebuffer: + mov ___blue_glCore_glBindFramebuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTransformFeedbackBufferBase -_bluegl_glTransformFeedbackBufferBase: - mov ___blue_glCore_glTransformFeedbackBufferBase@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteFramebuffers +_bluegl_glDeleteFramebuffers: + mov ___blue_glCore_glDeleteFramebuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTexParameteriv -_bluegl_glGetTexParameteriv: - mov ___blue_glCore_glGetTexParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenFramebuffers +_bluegl_glGenFramebuffers: + mov ___blue_glCore_glGenFramebuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribIiv -_bluegl_glGetVertexAttribIiv: - mov ___blue_glCore_glGetVertexAttribIiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCheckFramebufferStatus +_bluegl_glCheckFramebufferStatus: + mov ___blue_glCore_glCheckFramebufferStatus@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEndOcclusionQueryNV -_bluegl_glEndOcclusionQueryNV: - mov ___blue_glCore_glEndOcclusionQueryNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferTexture1D +_bluegl_glFramebufferTexture1D: + mov ___blue_glCore_glFramebufferTexture1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTransformFeedbackStreamAttribsNV -_bluegl_glTransformFeedbackStreamAttribsNV: - mov ___blue_glCore_glTransformFeedbackStreamAttribsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferTexture2D +_bluegl_glFramebufferTexture2D: + mov ___blue_glCore_glFramebufferTexture2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetQueryBufferObjecti64v -_bluegl_glGetQueryBufferObjecti64v: - mov ___blue_glCore_glGetQueryBufferObjecti64v@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferTexture3D +_bluegl_glFramebufferTexture3D: + mov ___blue_glCore_glFramebufferTexture3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStencilFillPathInstancedNV -_bluegl_glStencilFillPathInstancedNV: - mov ___blue_glCore_glStencilFillPathInstancedNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferRenderbuffer +_bluegl_glFramebufferRenderbuffer: + mov ___blue_glCore_glFramebufferRenderbuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawCommandsStatesNV -_bluegl_glDrawCommandsStatesNV: - mov ___blue_glCore_glDrawCommandsStatesNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFramebufferAttachmentParameteriv +_bluegl_glGetFramebufferAttachmentParameteriv: + mov ___blue_glCore_glGetFramebufferAttachmentParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetSamplerParameterfv -_bluegl_glGetSamplerParameterfv: - mov ___blue_glCore_glGetSamplerParameterfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenerateMipmap +_bluegl_glGenerateMipmap: + mov ___blue_glCore_glGenerateMipmap@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4fARB -_bluegl_glMultiTexCoord4fARB: - mov ___blue_glCore_glMultiTexCoord4fARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlitFramebuffer +_bluegl_glBlitFramebuffer: + mov ___blue_glCore_glBlitFramebuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3ui64NV -_bluegl_glUniform3ui64NV: - mov ___blue_glCore_glUniform3ui64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glRenderbufferStorageMultisample +_bluegl_glRenderbufferStorageMultisample: + mov ___blue_glCore_glRenderbufferStorageMultisample@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexWeighthNV -_bluegl_glVertexWeighthNV: - mov ___blue_glCore_glVertexWeighthNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferTextureLayer +_bluegl_glFramebufferTextureLayer: + mov ___blue_glCore_glFramebufferTextureLayer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3ivARB -_bluegl_glWindowPos3ivARB: - mov ___blue_glCore_glWindowPos3ivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMapBufferRange +_bluegl_glMapBufferRange: + mov ___blue_glCore_glMapBufferRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3ivEXT -_bluegl_glSecondaryColor3ivEXT: - mov ___blue_glCore_glSecondaryColor3ivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFlushMappedBufferRange +_bluegl_glFlushMappedBufferRange: + mov ___blue_glCore_glFlushMappedBufferRange@GOTPCREL(%rip), %r11 jmp *(%r11) .private_extern _bluegl_glBindVertexArray @@ -1419,404 +1433,414 @@ _bluegl_glBindVertexArray: mov ___blue_glCore_glBindVertexArray@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribLui64vARB -_bluegl_glGetVertexAttribLui64vARB: - mov ___blue_glCore_glGetVertexAttribLui64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteVertexArrays +_bluegl_glDeleteVertexArrays: + mov ___blue_glCore_glDeleteVertexArrays@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4i64NV -_bluegl_glUniform4i64NV: - mov ___blue_glCore_glUniform4i64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenVertexArrays +_bluegl_glGenVertexArrays: + mov ___blue_glCore_glGenVertexArrays@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendBarrierNV -_bluegl_glBlendBarrierNV: - mov ___blue_glCore_glBlendBarrierNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsVertexArray +_bluegl_glIsVertexArray: + mov ___blue_glCore_glIsVertexArray@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3fvARB -_bluegl_glWindowPos3fvARB: - mov ___blue_glCore_glWindowPos3fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawArraysInstanced +_bluegl_glDrawArraysInstanced: + mov ___blue_glCore_glDrawArraysInstanced@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendEquationSeparateiARB -_bluegl_glBlendEquationSeparateiARB: - mov ___blue_glCore_glBlendEquationSeparateiARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawElementsInstanced +_bluegl_glDrawElementsInstanced: + mov ___blue_glCore_glDrawElementsInstanced@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVariantFloatvEXT -_bluegl_glGetVariantFloatvEXT: - mov ___blue_glCore_glGetVariantFloatvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexBuffer +_bluegl_glTexBuffer: + mov ___blue_glCore_glTexBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorSubTableEXT -_bluegl_glColorSubTableEXT: - mov ___blue_glCore_glColorSubTableEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPrimitiveRestartIndex +_bluegl_glPrimitiveRestartIndex: + mov ___blue_glCore_glPrimitiveRestartIndex@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN -_bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN: - mov ___blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyBufferSubData +_bluegl_glCopyBufferSubData: + mov ___blue_glCore_glCopyBufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramResourceiv -_bluegl_glGetProgramResourceiv: - mov ___blue_glCore_glGetProgramResourceiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetUniformIndices +_bluegl_glGetUniformIndices: + mov ___blue_glCore_glGetUniformIndices@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1f -_bluegl_glMultiTexCoord1f: - mov ___blue_glCore_glMultiTexCoord1f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetActiveUniformsiv +_bluegl_glGetActiveUniformsiv: + mov ___blue_glCore_glGetActiveUniformsiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedFramebufferAttachmentParameteriv -_bluegl_glGetNamedFramebufferAttachmentParameteriv: - mov ___blue_glCore_glGetNamedFramebufferAttachmentParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetActiveUniformName +_bluegl_glGetActiveUniformName: + mov ___blue_glCore_glGetActiveUniformName@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteProgramsNV -_bluegl_glDeleteProgramsNV: - mov ___blue_glCore_glDeleteProgramsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetUniformBlockIndex +_bluegl_glGetUniformBlockIndex: + mov ___blue_glCore_glGetUniformBlockIndex@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGlobalAlphaFactoriSUN -_bluegl_glGlobalAlphaFactoriSUN: - mov ___blue_glCore_glGlobalAlphaFactoriSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetActiveUniformBlockiv +_bluegl_glGetActiveUniformBlockiv: + mov ___blue_glCore_glGetActiveUniformBlockiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFinalCombinerInputParameterfvNV -_bluegl_glGetFinalCombinerInputParameterfvNV: - mov ___blue_glCore_glGetFinalCombinerInputParameterfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetActiveUniformBlockName +_bluegl_glGetActiveUniformBlockName: + mov ___blue_glCore_glGetActiveUniformBlockName@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormalStream3dATI -_bluegl_glNormalStream3dATI: - mov ___blue_glCore_glNormalStream3dATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformBlockBinding +_bluegl_glUniformBlockBinding: + mov ___blue_glCore_glUniformBlockBinding@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexEnvivEXT -_bluegl_glMultiTexEnvivEXT: - mov ___blue_glCore_glMultiTexEnvivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawElementsBaseVertex +_bluegl_glDrawElementsBaseVertex: + mov ___blue_glCore_glDrawElementsBaseVertex@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord4xvOES -_bluegl_glTexCoord4xvOES: - mov ___blue_glCore_glTexCoord4xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawRangeElementsBaseVertex +_bluegl_glDrawRangeElementsBaseVertex: + mov ___blue_glCore_glDrawRangeElementsBaseVertex@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4dvEXT -_bluegl_glProgramUniform4dvEXT: - mov ___blue_glCore_glProgramUniform4dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawElementsInstancedBaseVertex +_bluegl_glDrawElementsInstancedBaseVertex: + mov ___blue_glCore_glDrawElementsInstancedBaseVertex@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2ui64vARB -_bluegl_glProgramUniform2ui64vARB: - mov ___blue_glCore_glProgramUniform2ui64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiDrawElementsBaseVertex +_bluegl_glMultiDrawElementsBaseVertex: + mov ___blue_glCore_glMultiDrawElementsBaseVertex@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindBufferBaseNV -_bluegl_glBindBufferBaseNV: - mov ___blue_glCore_glBindBufferBaseNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProvokingVertex +_bluegl_glProvokingVertex: + mov ___blue_glCore_glProvokingVertex@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4s -_bluegl_glVertexAttrib4s: - mov ___blue_glCore_glVertexAttrib4s@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFenceSync +_bluegl_glFenceSync: + mov ___blue_glCore_glFenceSync@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord2fVertex3fvSUN -_bluegl_glTexCoord2fVertex3fvSUN: - mov ___blue_glCore_glTexCoord2fVertex3fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsSync +_bluegl_glIsSync: + mov ___blue_glCore_glIsSync@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixMultdEXT -_bluegl_glMatrixMultdEXT: - mov ___blue_glCore_glMatrixMultdEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteSync +_bluegl_glDeleteSync: + mov ___blue_glCore_glDeleteSync@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnMapdvARB -_bluegl_glGetnMapdvARB: - mov ___blue_glCore_glGetnMapdvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClientWaitSync +_bluegl_glClientWaitSync: + mov ___blue_glCore_glClientWaitSync@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEnableVertexArrayEXT -_bluegl_glEnableVertexArrayEXT: - mov ___blue_glCore_glEnableVertexArrayEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWaitSync +_bluegl_glWaitSync: + mov ___blue_glCore_glWaitSync@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glConvolutionFilter1DEXT -_bluegl_glConvolutionFilter1DEXT: - mov ___blue_glCore_glConvolutionFilter1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetInteger64v +_bluegl_glGetInteger64v: + mov ___blue_glCore_glGetInteger64v@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMemoryBarrierEXT -_bluegl_glMemoryBarrierEXT: - mov ___blue_glCore_glMemoryBarrierEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetSynciv +_bluegl_glGetSynciv: + mov ___blue_glCore_glGetSynciv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNewObjectBufferATI -_bluegl_glNewObjectBufferATI: - mov ___blue_glCore_glNewObjectBufferATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetInteger64i_v +_bluegl_glGetInteger64i_v: + mov ___blue_glCore_glGetInteger64i_v@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2fv -_bluegl_glProgramUniform2fv: - mov ___blue_glCore_glProgramUniform2fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetBufferParameteri64v +_bluegl_glGetBufferParameteri64v: + mov ___blue_glCore_glGetBufferParameteri64v@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix4x3fv -_bluegl_glUniformMatrix4x3fv: - mov ___blue_glCore_glUniformMatrix4x3fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferTexture +_bluegl_glFramebufferTexture: + mov ___blue_glCore_glFramebufferTexture@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetHistogramParameterfv -_bluegl_glGetHistogramParameterfv: - mov ___blue_glCore_glGetHistogramParameterfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexImage2DMultisample +_bluegl_glTexImage2DMultisample: + mov ___blue_glCore_glTexImage2DMultisample@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFrameTerminatorGREMEDY -_bluegl_glFrameTerminatorGREMEDY: - mov ___blue_glCore_glFrameTerminatorGREMEDY@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexImage3DMultisample +_bluegl_glTexImage3DMultisample: + mov ___blue_glCore_glTexImage3DMultisample@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramLocalParameterfvARB -_bluegl_glGetProgramLocalParameterfvARB: - mov ___blue_glCore_glGetProgramLocalParameterfvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMultisamplefv +_bluegl_glGetMultisamplefv: + mov ___blue_glCore_glGetMultisamplefv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUnmapNamedBuffer -_bluegl_glUnmapNamedBuffer: - mov ___blue_glCore_glUnmapNamedBuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSampleMaski +_bluegl_glSampleMaski: + mov ___blue_glCore_glSampleMaski@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.private_extern _bluegl_glBindFragDataLocationIndexed +_bluegl_glBindFragDataLocationIndexed: + mov ___blue_glCore_glBindFragDataLocationIndexed@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2svARB -_bluegl_glWindowPos2svARB: - mov ___blue_glCore_glWindowPos2svARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFragDataIndex +_bluegl_glGetFragDataIndex: + mov ___blue_glCore_glGetFragDataIndex@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindTextureEXT -_bluegl_glBindTextureEXT: - mov ___blue_glCore_glBindTextureEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenSamplers +_bluegl_glGenSamplers: + mov ___blue_glCore_glGenSamplers@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4svNV -_bluegl_glVertexAttrib4svNV: - mov ___blue_glCore_glVertexAttrib4svNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteSamplers +_bluegl_glDeleteSamplers: + mov ___blue_glCore_glDeleteSamplers@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPointParameterfSGIS -_bluegl_glPointParameterfSGIS: - mov ___blue_glCore_glPointParameterfSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsSampler +_bluegl_glIsSampler: + mov ___blue_glCore_glIsSampler@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3hvNV -_bluegl_glSecondaryColor3hvNV: - mov ___blue_glCore_glSecondaryColor3hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindSampler +_bluegl_glBindSampler: + mov ___blue_glCore_glBindSampler@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorTableParameterfv -_bluegl_glColorTableParameterfv: - mov ___blue_glCore_glColorTableParameterfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSamplerParameteri +_bluegl_glSamplerParameteri: + mov ___blue_glCore_glSamplerParameteri@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedProgramLocalParameter4fEXT -_bluegl_glNamedProgramLocalParameter4fEXT: - mov ___blue_glCore_glNamedProgramLocalParameter4fEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSamplerParameteriv +_bluegl_glSamplerParameteriv: + mov ___blue_glCore_glSamplerParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureParameterivEXT -_bluegl_glGetTextureParameterivEXT: - mov ___blue_glCore_glGetTextureParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSamplerParameterf +_bluegl_glSamplerParameterf: + mov ___blue_glCore_glSamplerParameterf@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTestObjectAPPLE -_bluegl_glTestObjectAPPLE: - mov ___blue_glCore_glTestObjectAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSamplerParameterfv +_bluegl_glSamplerParameterfv: + mov ___blue_glCore_glSamplerParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetIntegerui64vNV -_bluegl_glGetIntegerui64vNV: - mov ___blue_glCore_glGetIntegerui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSamplerParameterIiv +_bluegl_glSamplerParameterIiv: + mov ___blue_glCore_glSamplerParameterIiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsVertexAttribEnabledAPPLE -_bluegl_glIsVertexAttribEnabledAPPLE: - mov ___blue_glCore_glIsVertexAttribEnabledAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSamplerParameterIuiv +_bluegl_glSamplerParameterIuiv: + mov ___blue_glCore_glSamplerParameterIuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glActiveTextureARB -_bluegl_glActiveTextureARB: - mov ___blue_glCore_glActiveTextureARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetSamplerParameteriv +_bluegl_glGetSamplerParameteriv: + mov ___blue_glCore_glGetSamplerParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3dARB -_bluegl_glVertexAttrib3dARB: - mov ___blue_glCore_glVertexAttrib3dARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetSamplerParameterIiv +_bluegl_glGetSamplerParameterIiv: + mov ___blue_glCore_glGetSamplerParameterIiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureHandleARB -_bluegl_glGetTextureHandleARB: - mov ___blue_glCore_glGetTextureHandleARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetSamplerParameterfv +_bluegl_glGetSamplerParameterfv: + mov ___blue_glCore_glGetSamplerParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetColorTableEXT -_bluegl_glGetColorTableEXT: - mov ___blue_glCore_glGetColorTableEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetSamplerParameterIuiv +_bluegl_glGetSamplerParameterIuiv: + mov ___blue_glCore_glGetSamplerParameterIuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawArraysEXT -_bluegl_glDrawArraysEXT: - mov ___blue_glCore_glDrawArraysEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glQueryCounter +_bluegl_glQueryCounter: + mov ___blue_glCore_glQueryCounter@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glImageTransformParameterfHP -_bluegl_glImageTransformParameterfHP: - mov ___blue_glCore_glImageTransformParameterfHP@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetQueryObjecti64v +_bluegl_glGetQueryObjecti64v: + mov ___blue_glCore_glGetQueryObjecti64v@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glActiveStencilFaceEXT -_bluegl_glActiveStencilFaceEXT: - mov ___blue_glCore_glActiveStencilFaceEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetQueryObjectui64v +_bluegl_glGetQueryObjectui64v: + mov ___blue_glCore_glGetQueryObjectui64v@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix3x4dv -_bluegl_glUniformMatrix3x4dv: - mov ___blue_glCore_glUniformMatrix3x4dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribDivisor +_bluegl_glVertexAttribDivisor: + mov ___blue_glCore_glVertexAttribDivisor@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4i64ARB -_bluegl_glProgramUniform4i64ARB: - mov ___blue_glCore_glProgramUniform4i64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribP1ui +_bluegl_glVertexAttribP1ui: + mov ___blue_glCore_glVertexAttribP1ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3iv -_bluegl_glUniform3iv: - mov ___blue_glCore_glUniform3iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribP1uiv +_bluegl_glVertexAttribP1uiv: + mov ___blue_glCore_glVertexAttribP1uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPerfMonitorCountersAMD -_bluegl_glGetPerfMonitorCountersAMD: - mov ___blue_glCore_glGetPerfMonitorCountersAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribP2ui +_bluegl_glVertexAttribP2ui: + mov ___blue_glCore_glVertexAttribP2ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFinishFenceAPPLE -_bluegl_glFinishFenceAPPLE: - mov ___blue_glCore_glFinishFenceAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribP2uiv +_bluegl_glVertexAttribP2uiv: + mov ___blue_glCore_glVertexAttribP2uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4ivARB -_bluegl_glUniform4ivARB: - mov ___blue_glCore_glUniform4ivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribP3ui +_bluegl_glVertexAttribP3ui: + mov ___blue_glCore_glVertexAttribP3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glRenderbufferStorageMultisampleEXT -_bluegl_glRenderbufferStorageMultisampleEXT: - mov ___blue_glCore_glRenderbufferStorageMultisampleEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribP3uiv +_bluegl_glVertexAttribP3uiv: + mov ___blue_glCore_glVertexAttribP3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPointParameterfvARB -_bluegl_glPointParameterfvARB: - mov ___blue_glCore_glPointParameterfvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribP4ui +_bluegl_glVertexAttribP4ui: + mov ___blue_glCore_glVertexAttribP4ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramLocalParameterI4uivNV -_bluegl_glProgramLocalParameterI4uivNV: - mov ___blue_glCore_glProgramLocalParameterI4uivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribP4uiv +_bluegl_glVertexAttribP4uiv: + mov ___blue_glCore_glVertexAttribP4uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeformSGIX -_bluegl_glDeformSGIX: - mov ___blue_glCore_glDeformSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMinSampleShading +_bluegl_glMinSampleShading: + mov ___blue_glCore_glMinSampleShading@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformHandleui64vNV -_bluegl_glProgramUniformHandleui64vNV: - mov ___blue_glCore_glProgramUniformHandleui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendEquationi +_bluegl_glBlendEquationi: + mov ___blue_glCore_glBlendEquationi@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiDrawRangeElementArrayAPPLE -_bluegl_glMultiDrawRangeElementArrayAPPLE: - mov ___blue_glCore_glMultiDrawRangeElementArrayAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendEquationSeparatei +_bluegl_glBlendEquationSeparatei: + mov ___blue_glCore_glBlendEquationSeparatei@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnUniformfvARB -_bluegl_glGetnUniformfvARB: - mov ___blue_glCore_glGetnUniformfvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendFunci +_bluegl_glBlendFunci: + mov ___blue_glCore_glBlendFunci@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribs3svNV -_bluegl_glVertexAttribs3svNV: - mov ___blue_glCore_glVertexAttribs3svNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendFuncSeparatei +_bluegl_glBlendFuncSeparatei: + mov ___blue_glCore_glBlendFuncSeparatei@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1dvNV -_bluegl_glVertexAttrib1dvNV: - mov ___blue_glCore_glVertexAttrib1dvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawArraysIndirect +_bluegl_glDrawArraysIndirect: + mov ___blue_glCore_glDrawArraysIndirect@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream1fvATI -_bluegl_glVertexStream1fvATI: - mov ___blue_glCore_glVertexStream1fvATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawElementsIndirect +_bluegl_glDrawElementsIndirect: + mov ___blue_glCore_glDrawElementsIndirect@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsProgramPipeline -_bluegl_glIsProgramPipeline: - mov ___blue_glCore_glIsProgramPipeline@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1d +_bluegl_glUniform1d: + mov ___blue_glCore_glUniform1d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetObjectBufferfvATI -_bluegl_glGetObjectBufferfvATI: - mov ___blue_glCore_glGetObjectBufferfvATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2d +_bluegl_glUniform2d: + mov ___blue_glCore_glUniform2d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBeginVertexShaderEXT -_bluegl_glBeginVertexShaderEXT: - mov ___blue_glCore_glBeginVertexShaderEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3d +_bluegl_glUniform3d: + mov ___blue_glCore_glUniform3d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4svARB -_bluegl_glVertexAttrib4svARB: - mov ___blue_glCore_glVertexAttrib4svARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4d +_bluegl_glUniform4d: + mov ___blue_glCore_glUniform4d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2d -_bluegl_glWindowPos2d: - mov ___blue_glCore_glWindowPos2d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1dv +_bluegl_glUniform1dv: + mov ___blue_glCore_glUniform1dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWriteMaskEXT -_bluegl_glWriteMaskEXT: - mov ___blue_glCore_glWriteMaskEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2dv +_bluegl_glUniform2dv: + mov ___blue_glCore_glUniform2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawRangeElements -_bluegl_glDrawRangeElements: - mov ___blue_glCore_glDrawRangeElements@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3dv +_bluegl_glUniform3dv: + mov ___blue_glCore_glUniform3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFragDataIndex -_bluegl_glGetFragDataIndex: - mov ___blue_glCore_glGetFragDataIndex@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4dv +_bluegl_glUniform4dv: + mov ___blue_glCore_glUniform4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteTransformFeedbacksNV -_bluegl_glDeleteTransformFeedbacksNV: - mov ___blue_glCore_glDeleteTransformFeedbacksNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix2dv +_bluegl_glUniformMatrix2dv: + mov ___blue_glCore_glUniformMatrix2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix2fvEXT -_bluegl_glProgramUniformMatrix2fvEXT: - mov ___blue_glCore_glProgramUniformMatrix2fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix3dv +_bluegl_glUniformMatrix3dv: + mov ___blue_glCore_glUniformMatrix3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3ui -_bluegl_glProgramUniform3ui: - mov ___blue_glCore_glProgramUniform3ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix4dv +_bluegl_glUniformMatrix4dv: + mov ___blue_glCore_glUniformMatrix4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTransformFeedbacki_v -_bluegl_glGetTransformFeedbacki_v: - mov ___blue_glCore_glGetTransformFeedbacki_v@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix2x3dv +_bluegl_glUniformMatrix2x3dv: + mov ___blue_glCore_glUniformMatrix2x3dv@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.private_extern _bluegl_glUniformMatrix2x4dv +_bluegl_glUniformMatrix2x4dv: + mov ___blue_glCore_glUniformMatrix2x4dv@GOTPCREL(%rip), %r11 jmp *(%r11) .private_extern _bluegl_glUniformMatrix3x2dv @@ -1824,314 +1848,314 @@ _bluegl_glUniformMatrix3x2dv: mov ___blue_glCore_glUniformMatrix3x2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMapxvOES -_bluegl_glGetMapxvOES: - mov ___blue_glCore_glGetMapxvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix3x4dv +_bluegl_glUniformMatrix3x4dv: + mov ___blue_glCore_glUniformMatrix3x4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMemoryBarrierByRegion -_bluegl_glMemoryBarrierByRegion: - mov ___blue_glCore_glMemoryBarrierByRegion@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix4x2dv +_bluegl_glUniformMatrix4x2dv: + mov ___blue_glCore_glUniformMatrix4x2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedFramebufferDrawBuffer -_bluegl_glNamedFramebufferDrawBuffer: - mov ___blue_glCore_glNamedFramebufferDrawBuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix4x3dv +_bluegl_glUniformMatrix4x3dv: + mov ___blue_glCore_glUniformMatrix4x3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsBufferResidentNV -_bluegl_glIsBufferResidentNV: - mov ___blue_glCore_glIsBufferResidentNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetUniformdv +_bluegl_glGetUniformdv: + mov ___blue_glCore_glGetUniformdv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStencilOpSeparate -_bluegl_glStencilOpSeparate: - mov ___blue_glCore_glStencilOpSeparate@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetSubroutineUniformLocation +_bluegl_glGetSubroutineUniformLocation: + mov ___blue_glCore_glGetSubroutineUniformLocation@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glInvalidateNamedFramebufferSubData -_bluegl_glInvalidateNamedFramebufferSubData: - mov ___blue_glCore_glInvalidateNamedFramebufferSubData@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetSubroutineIndex +_bluegl_glGetSubroutineIndex: + mov ___blue_glCore_glGetSubroutineIndex@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColor3hNV -_bluegl_glColor3hNV: - mov ___blue_glCore_glColor3hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetActiveSubroutineUniformiv +_bluegl_glGetActiveSubroutineUniformiv: + mov ___blue_glCore_glGetActiveSubroutineUniformiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureMaterialEXT -_bluegl_glTextureMaterialEXT: - mov ___blue_glCore_glTextureMaterialEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetActiveSubroutineUniformName +_bluegl_glGetActiveSubroutineUniformName: + mov ___blue_glCore_glGetActiveSubroutineUniformName@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTextureSubImage2D -_bluegl_glCompressedTextureSubImage2D: - mov ___blue_glCore_glCompressedTextureSubImage2D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetActiveSubroutineName +_bluegl_glGetActiveSubroutineName: + mov ___blue_glCore_glGetActiveSubroutineName@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexGeniEXT -_bluegl_glMultiTexGeniEXT: - mov ___blue_glCore_glMultiTexGeniEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformSubroutinesuiv +_bluegl_glUniformSubroutinesuiv: + mov ___blue_glCore_glUniformSubroutinesuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3usvEXT -_bluegl_glSecondaryColor3usvEXT: - mov ___blue_glCore_glSecondaryColor3usvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetUniformSubroutineuiv +_bluegl_glGetUniformSubroutineuiv: + mov ___blue_glCore_glGetUniformSubroutineuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramResourceName -_bluegl_glGetProgramResourceName: - mov ___blue_glCore_glGetProgramResourceName@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramStageiv +_bluegl_glGetProgramStageiv: + mov ___blue_glCore_glGetProgramStageiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureStorageSparseAMD -_bluegl_glTextureStorageSparseAMD: - mov ___blue_glCore_glTextureStorageSparseAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPatchParameteri +_bluegl_glPatchParameteri: + mov ___blue_glCore_glPatchParameteri@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPixelStorei -_bluegl_glPixelStorei: - mov ___blue_glCore_glPixelStorei@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPatchParameterfv +_bluegl_glPatchParameterfv: + mov ___blue_glCore_glPatchParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetBooleani_v -_bluegl_glGetBooleani_v: - mov ___blue_glCore_glGetBooleani_v@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindTransformFeedback +_bluegl_glBindTransformFeedback: + mov ___blue_glCore_glBindTransformFeedback@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPathCoordsNV -_bluegl_glGetPathCoordsNV: - mov ___blue_glCore_glGetPathCoordsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteTransformFeedbacks +_bluegl_glDeleteTransformFeedbacks: + mov ___blue_glCore_glDeleteTransformFeedbacks@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3svNV -_bluegl_glVertexAttrib3svNV: - mov ___blue_glCore_glVertexAttrib3svNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenTransformFeedbacks +_bluegl_glGenTransformFeedbacks: + mov ___blue_glCore_glGenTransformFeedbacks@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformui64NV -_bluegl_glUniformui64NV: - mov ___blue_glCore_glUniformui64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsTransformFeedback +_bluegl_glIsTransformFeedback: + mov ___blue_glCore_glIsTransformFeedback@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsImageHandleResidentNV -_bluegl_glIsImageHandleResidentNV: - mov ___blue_glCore_glIsImageHandleResidentNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPauseTransformFeedback +_bluegl_glPauseTransformFeedback: + mov ___blue_glCore_glPauseTransformFeedback@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBeginConditionalRenderNV -_bluegl_glBeginConditionalRenderNV: - mov ___blue_glCore_glBeginConditionalRenderNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glResumeTransformFeedback +_bluegl_glResumeTransformFeedback: + mov ___blue_glCore_glResumeTransformFeedback@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedFramebufferParameteriEXT -_bluegl_glNamedFramebufferParameteriEXT: - mov ___blue_glCore_glNamedFramebufferParameteriEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawTransformFeedback +_bluegl_glDrawTransformFeedback: + mov ___blue_glCore_glDrawTransformFeedback@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsVertexArrayAPPLE -_bluegl_glIsVertexArrayAPPLE: - mov ___blue_glCore_glIsVertexArrayAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawTransformFeedbackStream +_bluegl_glDrawTransformFeedbackStream: + mov ___blue_glCore_glDrawTransformFeedbackStream@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPointParameterfvEXT -_bluegl_glPointParameterfvEXT: - mov ___blue_glCore_glPointParameterfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBeginQueryIndexed +_bluegl_glBeginQueryIndexed: + mov ___blue_glCore_glBeginQueryIndexed@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnMapfvARB -_bluegl_glGetnMapfvARB: - mov ___blue_glCore_glGetnMapfvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEndQueryIndexed +_bluegl_glEndQueryIndexed: + mov ___blue_glCore_glEndQueryIndexed@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyColorSubTable -_bluegl_glCopyColorSubTable: - mov ___blue_glCore_glCopyColorSubTable@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetQueryIndexediv +_bluegl_glGetQueryIndexediv: + mov ___blue_glCore_glGetQueryIndexediv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVariantbvEXT -_bluegl_glVariantbvEXT: - mov ___blue_glCore_glVariantbvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReleaseShaderCompiler +_bluegl_glReleaseShaderCompiler: + mov ___blue_glCore_glReleaseShaderCompiler@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureParameterIuiv -_bluegl_glTextureParameterIuiv: - mov ___blue_glCore_glTextureParameterIuiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glShaderBinary +_bluegl_glShaderBinary: + mov ___blue_glCore_glShaderBinary@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPNTrianglesiATI -_bluegl_glPNTrianglesiATI: - mov ___blue_glCore_glPNTrianglesiATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetShaderPrecisionFormat +_bluegl_glGetShaderPrecisionFormat: + mov ___blue_glCore_glGetShaderPrecisionFormat@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendFunc -_bluegl_glBlendFunc: - mov ___blue_glCore_glBlendFunc@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDepthRangef +_bluegl_glDepthRangef: + mov ___blue_glCore_glDepthRangef@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4uiv -_bluegl_glVertexAttrib4uiv: - mov ___blue_glCore_glVertexAttrib4uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearDepthf +_bluegl_glClearDepthf: + mov ___blue_glCore_glClearDepthf@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2ui -_bluegl_glUniform2ui: - mov ___blue_glCore_glUniform2ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramBinary +_bluegl_glGetProgramBinary: + mov ___blue_glCore_glGetProgramBinary@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendColor -_bluegl_glBlendColor: - mov ___blue_glCore_glBlendColor@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramBinary +_bluegl_glProgramBinary: + mov ___blue_glCore_glProgramBinary@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glViewport -_bluegl_glViewport: - mov ___blue_glCore_glViewport@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramParameteri +_bluegl_glProgramParameteri: + mov ___blue_glCore_glProgramParameteri@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2fvARB -_bluegl_glWindowPos2fvARB: - mov ___blue_glCore_glWindowPos2fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUseProgramStages +_bluegl_glUseProgramStages: + mov ___blue_glCore_glUseProgramStages@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSampleCoverage -_bluegl_glSampleCoverage: - mov ___blue_glCore_glSampleCoverage@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glActiveShaderProgram +_bluegl_glActiveShaderProgram: + mov ___blue_glCore_glActiveShaderProgram@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3ubv -_bluegl_glSecondaryColor3ubv: - mov ___blue_glCore_glSecondaryColor3ubv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreateShaderProgramv +_bluegl_glCreateShaderProgramv: + mov ___blue_glCore_glCreateShaderProgramv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColor4xOES -_bluegl_glColor4xOES: - mov ___blue_glCore_glColor4xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindProgramPipeline +_bluegl_glBindProgramPipeline: + mov ___blue_glCore_glBindProgramPipeline@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL1dEXT -_bluegl_glVertexAttribL1dEXT: - mov ___blue_glCore_glVertexAttribL1dEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteProgramPipelines +_bluegl_glDeleteProgramPipelines: + mov ___blue_glCore_glDeleteProgramPipelines@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultTransposeMatrixf -_bluegl_glMultTransposeMatrixf: - mov ___blue_glCore_glMultTransposeMatrixf@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenProgramPipelines +_bluegl_glGenProgramPipelines: + mov ___blue_glCore_glGenProgramPipelines@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexArrayIntegeri_vEXT -_bluegl_glGetVertexArrayIntegeri_vEXT: - mov ___blue_glCore_glGetVertexArrayIntegeri_vEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsProgramPipeline +_bluegl_glIsProgramPipeline: + mov ___blue_glCore_glIsProgramPipeline@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCullParameterfvEXT -_bluegl_glCullParameterfvEXT: - mov ___blue_glCore_glCullParameterfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramPipelineiv +_bluegl_glGetProgramPipelineiv: + mov ___blue_glCore_glGetProgramPipelineiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMapNamedBufferRangeEXT -_bluegl_glMapNamedBufferRangeEXT: - mov ___blue_glCore_glMapNamedBufferRangeEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1i +_bluegl_glProgramUniform1i: + mov ___blue_glCore_glProgramUniform1i@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureImage3DEXT -_bluegl_glTextureImage3DEXT: - mov ___blue_glCore_glTextureImage3DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1iv +_bluegl_glProgramUniform1iv: + mov ___blue_glCore_glProgramUniform1iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBufferAddressRangeNV -_bluegl_glBufferAddressRangeNV: - mov ___blue_glCore_glBufferAddressRangeNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1f +_bluegl_glProgramUniform1f: + mov ___blue_glCore_glProgramUniform1f@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribdv -_bluegl_glGetVertexAttribdv: - mov ___blue_glCore_glGetVertexAttribdv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1fv +_bluegl_glProgramUniform1fv: + mov ___blue_glCore_glProgramUniform1fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedFramebufferSampleLocationsfvARB -_bluegl_glNamedFramebufferSampleLocationsfvARB: - mov ___blue_glCore_glNamedFramebufferSampleLocationsfvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1d +_bluegl_glProgramUniform1d: + mov ___blue_glCore_glProgramUniform1d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2i -_bluegl_glMultiTexCoord2i: - mov ___blue_glCore_glMultiTexCoord2i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1dv +_bluegl_glProgramUniform1dv: + mov ___blue_glCore_glProgramUniform1dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindFramebufferEXT -_bluegl_glBindFramebufferEXT: - mov ___blue_glCore_glBindFramebufferEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1ui +_bluegl_glProgramUniform1ui: + mov ___blue_glCore_glProgramUniform1ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexParameterfv -_bluegl_glTexParameterfv: - mov ___blue_glCore_glTexParameterfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1uiv +_bluegl_glProgramUniform1uiv: + mov ___blue_glCore_glProgramUniform1uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramNamedParameterfvNV -_bluegl_glGetProgramNamedParameterfvNV: - mov ___blue_glCore_glGetProgramNamedParameterfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2i +_bluegl_glProgramUniform2i: + mov ___blue_glCore_glProgramUniform2i@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureStorage3DEXT -_bluegl_glTextureStorage3DEXT: - mov ___blue_glCore_glTextureStorage3DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2iv +_bluegl_glProgramUniform2iv: + mov ___blue_glCore_glProgramUniform2iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetDebugMessageLogAMD -_bluegl_glGetDebugMessageLogAMD: - mov ___blue_glCore_glGetDebugMessageLogAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2f +_bluegl_glProgramUniform2f: + mov ___blue_glCore_glProgramUniform2f@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord1hvNV -_bluegl_glTexCoord1hvNV: - mov ___blue_glCore_glTexCoord1hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2fv +_bluegl_glProgramUniform2fv: + mov ___blue_glCore_glProgramUniform2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glRenderbufferStorageMultisampleCoverageNV -_bluegl_glRenderbufferStorageMultisampleCoverageNV: - mov ___blue_glCore_glRenderbufferStorageMultisampleCoverageNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2d +_bluegl_glProgramUniform2d: + mov ___blue_glCore_glProgramUniform2d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3i64vARB -_bluegl_glProgramUniform3i64vARB: - mov ___blue_glCore_glProgramUniform3i64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2dv +_bluegl_glProgramUniform2dv: + mov ___blue_glCore_glProgramUniform2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFragmentMaterialfvSGIX -_bluegl_glFragmentMaterialfvSGIX: - mov ___blue_glCore_glFragmentMaterialfvSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2ui +_bluegl_glProgramUniform2ui: + mov ___blue_glCore_glProgramUniform2ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetImageHandleARB -_bluegl_glGetImageHandleARB: - mov ___blue_glCore_glGetImageHandleARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2uiv +_bluegl_glProgramUniform2uiv: + mov ___blue_glCore_glProgramUniform2uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribs3fvNV -_bluegl_glVertexAttribs3fvNV: - mov ___blue_glCore_glVertexAttribs3fvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3i +_bluegl_glProgramUniform3i: + mov ___blue_glCore_glProgramUniform3i@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexSubImage4DSGIS -_bluegl_glTexSubImage4DSGIS: - mov ___blue_glCore_glTexSubImage4DSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3iv +_bluegl_glProgramUniform3iv: + mov ___blue_glCore_glProgramUniform3iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glListParameteriSGIX -_bluegl_glListParameteriSGIX: - mov ___blue_glCore_glListParameteriSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3f +_bluegl_glProgramUniform3f: + mov ___blue_glCore_glProgramUniform3f@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPixelTransformParameterfEXT -_bluegl_glPixelTransformParameterfEXT: - mov ___blue_glCore_glPixelTransformParameterfEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3fv +_bluegl_glProgramUniform3fv: + mov ___blue_glCore_glProgramUniform3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMapParameterfvNV -_bluegl_glMapParameterfvNV: - mov ___blue_glCore_glMapParameterfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3d +_bluegl_glProgramUniform3d: + mov ___blue_glCore_glProgramUniform3d@GOTPCREL(%rip), %r11 jmp *(%r11) .private_extern _bluegl_glProgramUniform3dv @@ -2139,844 +2163,839 @@ _bluegl_glProgramUniform3dv: mov ___blue_glCore_glProgramUniform3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix3fv -_bluegl_glUniformMatrix3fv: - mov ___blue_glCore_glUniformMatrix3fv@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.private_extern _bluegl_glProgramUniform4fEXT -_bluegl_glProgramUniform4fEXT: - mov ___blue_glCore_glProgramUniform4fEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3ui +_bluegl_glProgramUniform3ui: + mov ___blue_glCore_glProgramUniform3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2hNV -_bluegl_glMultiTexCoord2hNV: - mov ___blue_glCore_glMultiTexCoord2hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3uiv +_bluegl_glProgramUniform3uiv: + mov ___blue_glCore_glProgramUniform3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI4uiv -_bluegl_glVertexAttribI4uiv: - mov ___blue_glCore_glVertexAttribI4uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4i +_bluegl_glProgramUniform4i: + mov ___blue_glCore_glProgramUniform4i@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3b -_bluegl_glSecondaryColor3b: - mov ___blue_glCore_glSecondaryColor3b@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4iv +_bluegl_glProgramUniform4iv: + mov ___blue_glCore_glProgramUniform4iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFogxvOES -_bluegl_glFogxvOES: - mov ___blue_glCore_glFogxvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4f +_bluegl_glProgramUniform4f: + mov ___blue_glCore_glProgramUniform4f@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGlobalAlphaFactorubSUN -_bluegl_glGlobalAlphaFactorubSUN: - mov ___blue_glCore_glGlobalAlphaFactorubSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4fv +_bluegl_glProgramUniform4fv: + mov ___blue_glCore_glProgramUniform4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI4svEXT -_bluegl_glVertexAttribI4svEXT: - mov ___blue_glCore_glVertexAttribI4svEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4d +_bluegl_glProgramUniform4d: + mov ___blue_glCore_glProgramUniform4d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3sv -_bluegl_glSecondaryColor3sv: - mov ___blue_glCore_glSecondaryColor3sv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4dv +_bluegl_glProgramUniform4dv: + mov ___blue_glCore_glProgramUniform4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix2x3dvEXT -_bluegl_glProgramUniformMatrix2x3dvEXT: - mov ___blue_glCore_glProgramUniformMatrix2x3dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4ui +_bluegl_glProgramUniform4ui: + mov ___blue_glCore_glProgramUniform4ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureBarrier -_bluegl_glTextureBarrier: - mov ___blue_glCore_glTextureBarrier@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4uiv +_bluegl_glProgramUniform4uiv: + mov ___blue_glCore_glProgramUniform4uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreateSamplers -_bluegl_glCreateSamplers: - mov ___blue_glCore_glCreateSamplers@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix2fv +_bluegl_glProgramUniformMatrix2fv: + mov ___blue_glCore_glProgramUniformMatrix2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribP2ui -_bluegl_glVertexAttribP2ui: - mov ___blue_glCore_glVertexAttribP2ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix3fv +_bluegl_glProgramUniformMatrix3fv: + mov ___blue_glCore_glProgramUniformMatrix3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTexParameterIiv -_bluegl_glGetTexParameterIiv: - mov ___blue_glCore_glGetTexParameterIiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix4fv +_bluegl_glProgramUniformMatrix4fv: + mov ___blue_glCore_glProgramUniformMatrix4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glConvolutionParameterfvEXT -_bluegl_glConvolutionParameterfvEXT: - mov ___blue_glCore_glConvolutionParameterfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix2dv +_bluegl_glProgramUniformMatrix2dv: + mov ___blue_glCore_glProgramUniformMatrix2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathGlyphIndexArrayNV -_bluegl_glPathGlyphIndexArrayNV: - mov ___blue_glCore_glPathGlyphIndexArrayNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix3dv +_bluegl_glProgramUniformMatrix3dv: + mov ___blue_glCore_glProgramUniformMatrix3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyTexSubImage2D -_bluegl_glCopyTexSubImage2D: - mov ___blue_glCore_glCopyTexSubImage2D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix4dv +_bluegl_glProgramUniformMatrix4dv: + mov ___blue_glCore_glProgramUniformMatrix4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayParameteriAPPLE -_bluegl_glVertexArrayParameteriAPPLE: - mov ___blue_glCore_glVertexArrayParameteriAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix2x3fv +_bluegl_glProgramUniformMatrix2x3fv: + mov ___blue_glCore_glProgramUniformMatrix2x3fv@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glGetnConvolutionFilterARB -_bluegl_glGetnConvolutionFilterARB: - mov ___blue_glCore_glGetnConvolutionFilterARB@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glProgramUniformMatrix3x2fv +_bluegl_glProgramUniformMatrix3x2fv: + mov ___blue_glCore_glProgramUniformMatrix3x2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVariantfvEXT -_bluegl_glVariantfvEXT: - mov ___blue_glCore_glVariantfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix2x4fv +_bluegl_glProgramUniformMatrix2x4fv: + mov ___blue_glCore_glProgramUniformMatrix2x4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMultisamplefvNV -_bluegl_glGetMultisamplefvNV: - mov ___blue_glCore_glGetMultisamplefvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix4x2fv +_bluegl_glProgramUniformMatrix4x2fv: + mov ___blue_glCore_glProgramUniformMatrix4x2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glQueryObjectParameteruiAMD -_bluegl_glQueryObjectParameteruiAMD: - mov ___blue_glCore_glQueryObjectParameteruiAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix3x4fv +_bluegl_glProgramUniformMatrix3x4fv: + mov ___blue_glCore_glProgramUniformMatrix3x4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixIndexPointerARB -_bluegl_glMatrixIndexPointerARB: - mov ___blue_glCore_glMatrixIndexPointerARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix4x3fv +_bluegl_glProgramUniformMatrix4x3fv: + mov ___blue_glCore_glProgramUniformMatrix4x3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetQueryObjectuivARB -_bluegl_glGetQueryObjectuivARB: - mov ___blue_glCore_glGetQueryObjectuivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix2x3dv +_bluegl_glProgramUniformMatrix2x3dv: + mov ___blue_glCore_glProgramUniformMatrix2x3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorFormatNV -_bluegl_glColorFormatNV: - mov ___blue_glCore_glColorFormatNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix3x2dv +_bluegl_glProgramUniformMatrix3x2dv: + mov ___blue_glCore_glProgramUniformMatrix3x2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexGenfvEXT -_bluegl_glMultiTexGenfvEXT: - mov ___blue_glCore_glMultiTexGenfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix2x4dv +_bluegl_glProgramUniformMatrix2x4dv: + mov ___blue_glCore_glProgramUniformMatrix2x4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetUniformfvARB -_bluegl_glGetUniformfvARB: - mov ___blue_glCore_glGetUniformfvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix4x2dv +_bluegl_glProgramUniformMatrix4x2dv: + mov ___blue_glCore_glProgramUniformMatrix4x2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord3hNV -_bluegl_glTexCoord3hNV: - mov ___blue_glCore_glTexCoord3hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix3x4dv +_bluegl_glProgramUniformMatrix3x4dv: + mov ___blue_glCore_glProgramUniformMatrix3x4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathGlyphRangeNV -_bluegl_glPathGlyphRangeNV: - mov ___blue_glCore_glPathGlyphRangeNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix4x3dv +_bluegl_glProgramUniformMatrix4x3dv: + mov ___blue_glCore_glProgramUniformMatrix4x3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyTextureSubImage3DEXT -_bluegl_glCopyTextureSubImage3DEXT: - mov ___blue_glCore_glCopyTextureSubImage3DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glValidateProgramPipeline +_bluegl_glValidateProgramPipeline: + mov ___blue_glCore_glValidateProgramPipeline@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColor3xOES -_bluegl_glColor3xOES: - mov ___blue_glCore_glColor3xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramPipelineInfoLog +_bluegl_glGetProgramPipelineInfoLog: + mov ___blue_glCore_glGetProgramPipelineInfoLog@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4hNV -_bluegl_glVertexAttrib4hNV: - mov ___blue_glCore_glVertexAttrib4hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL1d +_bluegl_glVertexAttribL1d: + mov ___blue_glCore_glVertexAttribL1d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformui64NV -_bluegl_glProgramUniformui64NV: - mov ___blue_glCore_glProgramUniformui64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL2d +_bluegl_glVertexAttribL2d: + mov ___blue_glCore_glVertexAttribL2d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayVertexAttribLFormatEXT -_bluegl_glVertexArrayVertexAttribLFormatEXT: - mov ___blue_glCore_glVertexArrayVertexAttribLFormatEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL3d +_bluegl_glVertexAttribL3d: + mov ___blue_glCore_glVertexAttribL3d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMinmaxParameterivEXT -_bluegl_glGetMinmaxParameterivEXT: - mov ___blue_glCore_glGetMinmaxParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL4d +_bluegl_glVertexAttribL4d: + mov ___blue_glCore_glVertexAttribL4d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3iMESA -_bluegl_glWindowPos3iMESA: - mov ___blue_glCore_glWindowPos3iMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL1dv +_bluegl_glVertexAttribL1dv: + mov ___blue_glCore_glVertexAttribL1dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribLFormat -_bluegl_glVertexAttribLFormat: - mov ___blue_glCore_glVertexAttribLFormat@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL2dv +_bluegl_glVertexAttribL2dv: + mov ___blue_glCore_glVertexAttribL2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetObjectParameterfvARB -_bluegl_glGetObjectParameterfvARB: - mov ___blue_glCore_glGetObjectParameterfvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL3dv +_bluegl_glVertexAttribL3dv: + mov ___blue_glCore_glVertexAttribL3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStencilFillPathNV -_bluegl_glStencilFillPathNV: - mov ___blue_glCore_glStencilFillPathNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL4dv +_bluegl_glVertexAttribL4dv: + mov ___blue_glCore_glVertexAttribL4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEvalCoord1xvOES -_bluegl_glEvalCoord1xvOES: - mov ___blue_glCore_glEvalCoord1xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribLPointer +_bluegl_glVertexAttribLPointer: + mov ___blue_glCore_glVertexAttribLPointer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4d -_bluegl_glUniform4d: - mov ___blue_glCore_glUniform4d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribLdv +_bluegl_glGetVertexAttribLdv: + mov ___blue_glCore_glGetVertexAttribLdv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureHandleNV -_bluegl_glGetTextureHandleNV: - mov ___blue_glCore_glGetTextureHandleNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glViewportArrayv +_bluegl_glViewportArrayv: + mov ___blue_glCore_glViewportArrayv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetUniformuivEXT -_bluegl_glGetUniformuivEXT: - mov ___blue_glCore_glGetUniformuivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glViewportIndexedf +_bluegl_glViewportIndexedf: + mov ___blue_glCore_glViewportIndexedf@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsTextureEXT -_bluegl_glIsTextureEXT: - mov ___blue_glCore_glIsTextureEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glViewportIndexedfv +_bluegl_glViewportIndexedfv: + mov ___blue_glCore_glViewportIndexedfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2d -_bluegl_glProgramUniform2d: - mov ___blue_glCore_glProgramUniform2d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glScissorArrayv +_bluegl_glScissorArrayv: + mov ___blue_glCore_glScissorArrayv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnUniformuivARB -_bluegl_glGetnUniformuivARB: - mov ___blue_glCore_glGetnUniformuivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glScissorIndexed +_bluegl_glScissorIndexed: + mov ___blue_glCore_glScissorIndexed@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsShader -_bluegl_glIsShader: - mov ___blue_glCore_glIsShader@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glScissorIndexedv +_bluegl_glScissorIndexedv: + mov ___blue_glCore_glScissorIndexedv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexArrayIndexed64iv -_bluegl_glGetVertexArrayIndexed64iv: - mov ___blue_glCore_glGetVertexArrayIndexed64iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDepthRangeArrayv +_bluegl_glDepthRangeArrayv: + mov ___blue_glCore_glDepthRangeArrayv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnHistogramARB -_bluegl_glGetnHistogramARB: - mov ___blue_glCore_glGetnHistogramARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDepthRangeIndexed +_bluegl_glDepthRangeIndexed: + mov ___blue_glCore_glDepthRangeIndexed@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN -_bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN: - mov ___blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFloati_v +_bluegl_glGetFloati_v: + mov ___blue_glCore_glGetFloati_v@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI2ivEXT -_bluegl_glVertexAttribI2ivEXT: - mov ___blue_glCore_glVertexAttribI2ivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetDoublei_v +_bluegl_glGetDoublei_v: + mov ___blue_glCore_glGetDoublei_v@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexSubImage2DEXT -_bluegl_glTexSubImage2DEXT: - mov ___blue_glCore_glTexSubImage2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawArraysInstancedBaseInstance +_bluegl_glDrawArraysInstancedBaseInstance: + mov ___blue_glCore_glDrawArraysInstancedBaseInstance@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFragmentMaterialivSGIX -_bluegl_glGetFragmentMaterialivSGIX: - mov ___blue_glCore_glGetFragmentMaterialivSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawElementsInstancedBaseInstance +_bluegl_glDrawElementsInstancedBaseInstance: + mov ___blue_glCore_glDrawElementsInstancedBaseInstance@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearNamedFramebufferiv -_bluegl_glClearNamedFramebufferiv: - mov ___blue_glCore_glClearNamedFramebufferiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawElementsInstancedBaseVertexBaseInstance +_bluegl_glDrawElementsInstancedBaseVertexBaseInstance: + mov ___blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixMult3x3fNV -_bluegl_glMatrixMult3x3fNV: - mov ___blue_glCore_glMatrixMult3x3fNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetInternalformativ +_bluegl_glGetInternalformativ: + mov ___blue_glCore_glGetInternalformativ@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetQueryBufferObjectiv -_bluegl_glGetQueryBufferObjectiv: - mov ___blue_glCore_glGetQueryBufferObjectiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetActiveAtomicCounterBufferiv +_bluegl_glGetActiveAtomicCounterBufferiv: + mov ___blue_glCore_glGetActiveAtomicCounterBufferiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVideoCaptureStreamParameterfvNV -_bluegl_glVideoCaptureStreamParameterfvNV: - mov ___blue_glCore_glVideoCaptureStreamParameterfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindImageTexture +_bluegl_glBindImageTexture: + mov ___blue_glCore_glBindImageTexture@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexImage3DMultisample -_bluegl_glTexImage3DMultisample: - mov ___blue_glCore_glTexImage3DMultisample@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMemoryBarrier +_bluegl_glMemoryBarrier: + mov ___blue_glCore_glMemoryBarrier@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArraySecondaryColorOffsetEXT -_bluegl_glVertexArraySecondaryColorOffsetEXT: - mov ___blue_glCore_glVertexArraySecondaryColorOffsetEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexStorage1D +_bluegl_glTexStorage1D: + mov ___blue_glCore_glTexStorage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVariantusvEXT -_bluegl_glVariantusvEXT: - mov ___blue_glCore_glVariantusvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexStorage2D +_bluegl_glTexStorage2D: + mov ___blue_glCore_glTexStorage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawArraysInstanced -_bluegl_glDrawArraysInstanced: - mov ___blue_glCore_glDrawArraysInstanced@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexStorage3D +_bluegl_glTexStorage3D: + mov ___blue_glCore_glTexStorage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix2x4dvEXT -_bluegl_glProgramUniformMatrix2x4dvEXT: - mov ___blue_glCore_glProgramUniformMatrix2x4dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawTransformFeedbackInstanced +_bluegl_glDrawTransformFeedbackInstanced: + mov ___blue_glCore_glDrawTransformFeedbackInstanced@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramBufferParametersIivNV -_bluegl_glProgramBufferParametersIivNV: - mov ___blue_glCore_glProgramBufferParametersIivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawTransformFeedbackStreamInstanced +_bluegl_glDrawTransformFeedbackStreamInstanced: + mov ___blue_glCore_glDrawTransformFeedbackStreamInstanced@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glViewportArrayv -_bluegl_glViewportArrayv: - mov ___blue_glCore_glViewportArrayv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearBufferData +_bluegl_glClearBufferData: + mov ___blue_glCore_glClearBufferData@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTangent3svEXT -_bluegl_glTangent3svEXT: - mov ___blue_glCore_glTangent3svEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearBufferSubData +_bluegl_glClearBufferSubData: + mov ___blue_glCore_glClearBufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeuiVertex3fSUN -_bluegl_glReplacementCodeuiVertex3fSUN: - mov ___blue_glCore_glReplacementCodeuiVertex3fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDispatchCompute +_bluegl_glDispatchCompute: + mov ___blue_glCore_glDispatchCompute@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSharpenTexFuncSGIS -_bluegl_glSharpenTexFuncSGIS: - mov ___blue_glCore_glSharpenTexFuncSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDispatchComputeIndirect +_bluegl_glDispatchComputeIndirect: + mov ___blue_glCore_glDispatchComputeIndirect@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormalFormatNV -_bluegl_glNormalFormatNV: - mov ___blue_glCore_glNormalFormatNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyImageSubData +_bluegl_glCopyImageSubData: + mov ___blue_glCore_glCopyImageSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL3dv -_bluegl_glVertexAttribL3dv: - mov ___blue_glCore_glVertexAttribL3dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferParameteri +_bluegl_glFramebufferParameteri: + mov ___blue_glCore_glFramebufferParameteri@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedStringARB -_bluegl_glNamedStringARB: - mov ___blue_glCore_glNamedStringARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFramebufferParameteriv +_bluegl_glGetFramebufferParameteriv: + mov ___blue_glCore_glGetFramebufferParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayVertexAttribFormatEXT -_bluegl_glVertexArrayVertexAttribFormatEXT: - mov ___blue_glCore_glVertexArrayVertexAttribFormatEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetInternalformati64v +_bluegl_glGetInternalformati64v: + mov ___blue_glCore_glGetInternalformati64v@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoordP3ui -_bluegl_glMultiTexCoordP3ui: - mov ___blue_glCore_glMultiTexCoordP3ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glInvalidateTexSubImage +_bluegl_glInvalidateTexSubImage: + mov ___blue_glCore_glInvalidateTexSubImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexSubImage3DEXT -_bluegl_glMultiTexSubImage3DEXT: - mov ___blue_glCore_glMultiTexSubImage3DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glInvalidateTexImage +_bluegl_glInvalidateTexImage: + mov ___blue_glCore_glInvalidateTexImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2fvARB -_bluegl_glUniform2fvARB: - mov ___blue_glCore_glUniform2fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glInvalidateBufferSubData +_bluegl_glInvalidateBufferSubData: + mov ___blue_glCore_glInvalidateBufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPixelMapxv -_bluegl_glGetPixelMapxv: - mov ___blue_glCore_glGetPixelMapxv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glInvalidateBufferData +_bluegl_glInvalidateBufferData: + mov ___blue_glCore_glInvalidateBufferData@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTangent3ivEXT -_bluegl_glTangent3ivEXT: - mov ___blue_glCore_glTangent3ivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glInvalidateFramebuffer +_bluegl_glInvalidateFramebuffer: + mov ___blue_glCore_glInvalidateFramebuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetLocalConstantIntegervEXT -_bluegl_glGetLocalConstantIntegervEXT: - mov ___blue_glCore_glGetLocalConstantIntegervEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glInvalidateSubFramebuffer +_bluegl_glInvalidateSubFramebuffer: + mov ___blue_glCore_glInvalidateSubFramebuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPresentFrameDualFillNV -_bluegl_glPresentFrameDualFillNV: - mov ___blue_glCore_glPresentFrameDualFillNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiDrawArraysIndirect +_bluegl_glMultiDrawArraysIndirect: + mov ___blue_glCore_glMultiDrawArraysIndirect@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEndVertexShaderEXT -_bluegl_glEndVertexShaderEXT: - mov ___blue_glCore_glEndVertexShaderEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiDrawElementsIndirect +_bluegl_glMultiDrawElementsIndirect: + mov ___blue_glCore_glMultiDrawElementsIndirect@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayVertexBuffer -_bluegl_glVertexArrayVertexBuffer: - mov ___blue_glCore_glVertexArrayVertexBuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramInterfaceiv +_bluegl_glGetProgramInterfaceiv: + mov ___blue_glCore_glGetProgramInterfaceiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMakeTextureHandleNonResidentNV -_bluegl_glMakeTextureHandleNonResidentNV: - mov ___blue_glCore_glMakeTextureHandleNonResidentNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramResourceIndex +_bluegl_glGetProgramResourceIndex: + mov ___blue_glCore_glGetProgramResourceIndex@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI3uiEXT -_bluegl_glVertexAttribI3uiEXT: - mov ___blue_glCore_glVertexAttribI3uiEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramResourceName +_bluegl_glGetProgramResourceName: + mov ___blue_glCore_glGetProgramResourceName@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBinormal3bvEXT -_bluegl_glBinormal3bvEXT: - mov ___blue_glCore_glBinormal3bvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramResourceiv +_bluegl_glGetProgramResourceiv: + mov ___blue_glCore_glGetProgramResourceiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPixelTexGenParameterfSGIS -_bluegl_glPixelTexGenParameterfSGIS: - mov ___blue_glCore_glPixelTexGenParameterfSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramResourceLocation +_bluegl_glGetProgramResourceLocation: + mov ___blue_glCore_glGetProgramResourceLocation@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexGenivEXT -_bluegl_glMultiTexGenivEXT: - mov ___blue_glCore_glMultiTexGenivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramResourceLocationIndex +_bluegl_glGetProgramResourceLocationIndex: + mov ___blue_glCore_glGetProgramResourceLocationIndex@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVideoivNV -_bluegl_glGetVideoivNV: - mov ___blue_glCore_glGetVideoivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glShaderStorageBlockBinding +_bluegl_glShaderStorageBlockBinding: + mov ___blue_glCore_glShaderStorageBlockBinding@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoordP2ui -_bluegl_glMultiTexCoordP2ui: - mov ___blue_glCore_glMultiTexCoordP2ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexBufferRange +_bluegl_glTexBufferRange: + mov ___blue_glCore_glTexBufferRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeletePerfQueryINTEL -_bluegl_glDeletePerfQueryINTEL: - mov ___blue_glCore_glDeletePerfQueryINTEL@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexStorage2DMultisample +_bluegl_glTexStorage2DMultisample: + mov ___blue_glCore_glTexStorage2DMultisample@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDepthBoundsdNV -_bluegl_glDepthBoundsdNV: - mov ___blue_glCore_glDepthBoundsdNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexStorage3DMultisample +_bluegl_glTexStorage3DMultisample: + mov ___blue_glCore_glTexStorage3DMultisample@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPixelTransferxOES -_bluegl_glPixelTransferxOES: - mov ___blue_glCore_glPixelTransferxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureView +_bluegl_glTextureView: + mov ___blue_glCore_glTextureView@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCombinerOutputNV -_bluegl_glCombinerOutputNV: - mov ___blue_glCore_glCombinerOutputNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindVertexBuffer +_bluegl_glBindVertexBuffer: + mov ___blue_glCore_glBindVertexBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyTextureSubImage1D -_bluegl_glCopyTextureSubImage1D: - mov ___blue_glCore_glCopyTextureSubImage1D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribFormat +_bluegl_glVertexAttribFormat: + mov ___blue_glCore_glVertexAttribFormat@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI4iv -_bluegl_glVertexAttribI4iv: - mov ___blue_glCore_glVertexAttribI4iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribIFormat +_bluegl_glVertexAttribIFormat: + mov ___blue_glCore_glVertexAttribIFormat@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyTexImage2DEXT -_bluegl_glCopyTexImage2DEXT: - mov ___blue_glCore_glCopyTexImage2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribLFormat +_bluegl_glVertexAttribLFormat: + mov ___blue_glCore_glVertexAttribLFormat@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindLightParameterEXT -_bluegl_glBindLightParameterEXT: - mov ___blue_glCore_glBindLightParameterEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribBinding +_bluegl_glVertexAttribBinding: + mov ___blue_glCore_glVertexAttribBinding@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiDrawElementsBaseVertex -_bluegl_glMultiDrawElementsBaseVertex: - mov ___blue_glCore_glMultiDrawElementsBaseVertex@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexBindingDivisor +_bluegl_glVertexBindingDivisor: + mov ___blue_glCore_glVertexBindingDivisor@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2uivEXT -_bluegl_glProgramUniform2uivEXT: - mov ___blue_glCore_glProgramUniform2uivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDebugMessageControl +_bluegl_glDebugMessageControl: + mov ___blue_glCore_glDebugMessageControl@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeletePerfMonitorsAMD -_bluegl_glDeletePerfMonitorsAMD: - mov ___blue_glCore_glDeletePerfMonitorsAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDebugMessageInsert +_bluegl_glDebugMessageInsert: + mov ___blue_glCore_glDebugMessageInsert@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyImageSubData -_bluegl_glCopyImageSubData: - mov ___blue_glCore_glCopyImageSubData@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDebugMessageCallback +_bluegl_glDebugMessageCallback: + mov ___blue_glCore_glDebugMessageCallback@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathCoverDepthFuncNV -_bluegl_glPathCoverDepthFuncNV: - mov ___blue_glCore_glPathCoverDepthFuncNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetDebugMessageLog +_bluegl_glGetDebugMessageLog: + mov ___blue_glCore_glGetDebugMessageLog@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFramebufferAttachmentParameteriv -_bluegl_glGetFramebufferAttachmentParameteriv: - mov ___blue_glCore_glGetFramebufferAttachmentParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPushDebugGroup +_bluegl_glPushDebugGroup: + mov ___blue_glCore_glPushDebugGroup@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glRectxOES -_bluegl_glRectxOES: - mov ___blue_glCore_glRectxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPopDebugGroup +_bluegl_glPopDebugGroup: + mov ___blue_glCore_glPopDebugGroup@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTagSampleBufferSGIX -_bluegl_glTagSampleBufferSGIX: - mov ___blue_glCore_glTagSampleBufferSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glObjectLabel +_bluegl_glObjectLabel: + mov ___blue_glCore_glObjectLabel@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glVertexStream3svATI -_bluegl_glVertexStream3svATI: - mov ___blue_glCore_glVertexStream3svATI@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glGetObjectLabel +_bluegl_glGetObjectLabel: + mov ___blue_glCore_glGetObjectLabel@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPathTexGenfvNV -_bluegl_glGetPathTexGenfvNV: - mov ___blue_glCore_glGetPathTexGenfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glObjectPtrLabel +_bluegl_glObjectPtrLabel: + mov ___blue_glCore_glObjectPtrLabel@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glOrthofOES -_bluegl_glOrthofOES: - mov ___blue_glCore_glOrthofOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetObjectPtrLabel +_bluegl_glGetObjectPtrLabel: + mov ___blue_glCore_glGetObjectPtrLabel@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyTexImage2D -_bluegl_glCopyTexImage2D: - mov ___blue_glCore_glCopyTexImage2D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBufferStorage +_bluegl_glBufferStorage: + mov ___blue_glCore_glBufferStorage@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord2fColor4ubVertex3fSUN -_bluegl_glTexCoord2fColor4ubVertex3fSUN: - mov ___blue_glCore_glTexCoord2fColor4ubVertex3fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearTexImage +_bluegl_glClearTexImage: + mov ___blue_glCore_glClearTexImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultTransposeMatrixdARB -_bluegl_glMultTransposeMatrixdARB: - mov ___blue_glCore_glMultTransposeMatrixdARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearTexSubImage +_bluegl_glClearTexSubImage: + mov ___blue_glCore_glClearTexSubImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3i -_bluegl_glProgramUniform3i: - mov ___blue_glCore_glProgramUniform3i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindBuffersBase +_bluegl_glBindBuffersBase: + mov ___blue_glCore_glBindBuffersBase@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glArrayObjectATI -_bluegl_glArrayObjectATI: - mov ___blue_glCore_glArrayObjectATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindBuffersRange +_bluegl_glBindBuffersRange: + mov ___blue_glCore_glBindBuffersRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixRotatedEXT -_bluegl_glMatrixRotatedEXT: - mov ___blue_glCore_glMatrixRotatedEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindTextures +_bluegl_glBindTextures: + mov ___blue_glCore_glBindTextures@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoordP2ui -_bluegl_glTexCoordP2ui: - mov ___blue_glCore_glTexCoordP2ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindSamplers +_bluegl_glBindSamplers: + mov ___blue_glCore_glBindSamplers@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPassTexCoordATI -_bluegl_glPassTexCoordATI: - mov ___blue_glCore_glPassTexCoordATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindImageTextures +_bluegl_glBindImageTextures: + mov ___blue_glCore_glBindImageTextures@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsTexture -_bluegl_glIsTexture: - mov ___blue_glCore_glIsTexture@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindVertexBuffers +_bluegl_glBindVertexBuffers: + mov ___blue_glCore_glBindVertexBuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTexSubImage3DARB -_bluegl_glCompressedTexSubImage3DARB: - mov ___blue_glCore_glCompressedTexSubImage3DARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClipControl +_bluegl_glClipControl: + mov ___blue_glCore_glClipControl@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDepthRangexOES -_bluegl_glDepthRangexOES: - mov ___blue_glCore_glDepthRangexOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreateTransformFeedbacks +_bluegl_glCreateTransformFeedbacks: + mov ___blue_glCore_glCreateTransformFeedbacks@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glImageTransformParameterivHP -_bluegl_glImageTransformParameterivHP: - mov ___blue_glCore_glImageTransformParameterivHP@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTransformFeedbackBufferBase +_bluegl_glTransformFeedbackBufferBase: + mov ___blue_glCore_glTransformFeedbackBufferBase@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultTransposeMatrixfARB -_bluegl_glMultTransposeMatrixfARB: - mov ___blue_glCore_glMultTransposeMatrixfARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTransformFeedbackBufferRange +_bluegl_glTransformFeedbackBufferRange: + mov ___blue_glCore_glTransformFeedbackBufferRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformHandleui64vARB -_bluegl_glUniformHandleui64vARB: - mov ___blue_glCore_glUniformHandleui64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTransformFeedbackiv +_bluegl_glGetTransformFeedbackiv: + mov ___blue_glCore_glGetTransformFeedbackiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenTransformFeedbacks -_bluegl_glGenTransformFeedbacks: - mov ___blue_glCore_glGenTransformFeedbacks@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTransformFeedbacki_v +_bluegl_glGetTransformFeedbacki_v: + mov ___blue_glCore_glGetTransformFeedbacki_v@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureStorage1D -_bluegl_glTextureStorage1D: - mov ___blue_glCore_glTextureStorage1D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTransformFeedbacki64_v +_bluegl_glGetTransformFeedbacki64_v: + mov ___blue_glCore_glGetTransformFeedbacki64_v@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribivNV -_bluegl_glGetVertexAttribivNV: - mov ___blue_glCore_glGetVertexAttribivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreateBuffers +_bluegl_glCreateBuffers: + mov ___blue_glCore_glCreateBuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodePointerSUN -_bluegl_glReplacementCodePointerSUN: - mov ___blue_glCore_glReplacementCodePointerSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedBufferStorage +_bluegl_glNamedBufferStorage: + mov ___blue_glCore_glNamedBufferStorage@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI3uiv -_bluegl_glVertexAttribI3uiv: - mov ___blue_glCore_glVertexAttribI3uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedBufferData +_bluegl_glNamedBufferData: + mov ___blue_glCore_glNamedBufferData@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeuiNormal3fVertex3fSUN -_bluegl_glReplacementCodeuiNormal3fVertex3fSUN: - mov ___blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedBufferSubData +_bluegl_glNamedBufferSubData: + mov ___blue_glCore_glNamedBufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL2dEXT -_bluegl_glVertexAttribL2dEXT: - mov ___blue_glCore_glVertexAttribL2dEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyNamedBufferSubData +_bluegl_glCopyNamedBufferSubData: + mov ___blue_glCore_glCopyNamedBufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3ui64NV -_bluegl_glProgramUniform3ui64NV: - mov ___blue_glCore_glProgramUniform3ui64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearNamedBufferData +_bluegl_glClearNamedBufferData: + mov ___blue_glCore_glClearNamedBufferData@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3i64NV -_bluegl_glProgramUniform3i64NV: - mov ___blue_glCore_glProgramUniform3i64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearNamedBufferSubData +_bluegl_glClearNamedBufferSubData: + mov ___blue_glCore_glClearNamedBufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedRenderbufferParameterivEXT -_bluegl_glGetNamedRenderbufferParameterivEXT: - mov ___blue_glCore_glGetNamedRenderbufferParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMapNamedBuffer +_bluegl_glMapNamedBuffer: + mov ___blue_glCore_glMapNamedBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTangent3bvEXT -_bluegl_glTangent3bvEXT: - mov ___blue_glCore_glTangent3bvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMapNamedBufferRange +_bluegl_glMapNamedBufferRange: + mov ___blue_glCore_glMapNamedBufferRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1dvEXT -_bluegl_glProgramUniform1dvEXT: - mov ___blue_glCore_glProgramUniform1dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUnmapNamedBuffer +_bluegl_glUnmapNamedBuffer: + mov ___blue_glCore_glUnmapNamedBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixLoadTransposedEXT -_bluegl_glMatrixLoadTransposedEXT: - mov ___blue_glCore_glMatrixLoadTransposedEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFlushMappedNamedBufferRange +_bluegl_glFlushMappedNamedBufferRange: + mov ___blue_glCore_glFlushMappedNamedBufferRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribLdv -_bluegl_glGetVertexAttribLdv: - mov ___blue_glCore_glGetVertexAttribLdv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedBufferParameteriv +_bluegl_glGetNamedBufferParameteriv: + mov ___blue_glCore_glGetNamedBufferParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream2dATI -_bluegl_glVertexStream2dATI: - mov ___blue_glCore_glVertexStream2dATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedBufferParameteri64v +_bluegl_glGetNamedBufferParameteri64v: + mov ___blue_glCore_glGetNamedBufferParameteri64v@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFragmentLightivSGIX -_bluegl_glGetFragmentLightivSGIX: - mov ___blue_glCore_glGetFragmentLightivSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedBufferPointerv +_bluegl_glGetNamedBufferPointerv: + mov ___blue_glCore_glGetNamedBufferPointerv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMinmaxEXT -_bluegl_glGetMinmaxEXT: - mov ___blue_glCore_glGetMinmaxEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedBufferSubData +_bluegl_glGetNamedBufferSubData: + mov ___blue_glCore_glGetNamedBufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFlushStaticDataIBM -_bluegl_glFlushStaticDataIBM: - mov ___blue_glCore_glFlushStaticDataIBM@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreateFramebuffers +_bluegl_glCreateFramebuffers: + mov ___blue_glCore_glCreateFramebuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glShaderOp1EXT -_bluegl_glShaderOp1EXT: - mov ___blue_glCore_glShaderOp1EXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedFramebufferRenderbuffer +_bluegl_glNamedFramebufferRenderbuffer: + mov ___blue_glCore_glNamedFramebufferRenderbuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsStateNV -_bluegl_glIsStateNV: - mov ___blue_glCore_glIsStateNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedFramebufferParameteri +_bluegl_glNamedFramebufferParameteri: + mov ___blue_glCore_glNamedFramebufferParameteri@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramEnvParameterIuivNV -_bluegl_glGetProgramEnvParameterIuivNV: - mov ___blue_glCore_glGetProgramEnvParameterIuivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedFramebufferTexture +_bluegl_glNamedFramebufferTexture: + mov ___blue_glCore_glNamedFramebufferTexture@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVideoCaptureivNV -_bluegl_glGetVideoCaptureivNV: - mov ___blue_glCore_glGetVideoCaptureivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedFramebufferTextureLayer +_bluegl_glNamedFramebufferTextureLayer: + mov ___blue_glCore_glNamedFramebufferTextureLayer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathStringNV -_bluegl_glPathStringNV: - mov ___blue_glCore_glPathStringNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedFramebufferDrawBuffer +_bluegl_glNamedFramebufferDrawBuffer: + mov ___blue_glCore_glNamedFramebufferDrawBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glListParameterfSGIX -_bluegl_glListParameterfSGIX: - mov ___blue_glCore_glListParameterfSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedFramebufferDrawBuffers +_bluegl_glNamedFramebufferDrawBuffers: + mov ___blue_glCore_glNamedFramebufferDrawBuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFeedbackBufferxOES -_bluegl_glFeedbackBufferxOES: - mov ___blue_glCore_glFeedbackBufferxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedFramebufferReadBuffer +_bluegl_glNamedFramebufferReadBuffer: + mov ___blue_glCore_glNamedFramebufferReadBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNextPerfQueryIdINTEL -_bluegl_glGetNextPerfQueryIdINTEL: - mov ___blue_glCore_glGetNextPerfQueryIdINTEL@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glInvalidateNamedFramebufferData +_bluegl_glInvalidateNamedFramebufferData: + mov ___blue_glCore_glInvalidateNamedFramebufferData@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVariantArrayObjectfvATI -_bluegl_glGetVariantArrayObjectfvATI: - mov ___blue_glCore_glGetVariantArrayObjectfvATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glInvalidateNamedFramebufferSubData +_bluegl_glInvalidateNamedFramebufferSubData: + mov ___blue_glCore_glInvalidateNamedFramebufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3d -_bluegl_glUniform3d: - mov ___blue_glCore_glUniform3d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearNamedFramebufferiv +_bluegl_glClearNamedFramebufferiv: + mov ___blue_glCore_glClearNamedFramebufferiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexParameterfvEXT -_bluegl_glMultiTexParameterfvEXT: - mov ___blue_glCore_glMultiTexParameterfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearNamedFramebufferuiv +_bluegl_glClearNamedFramebufferuiv: + mov ___blue_glCore_glClearNamedFramebufferuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetLocalConstantFloatvEXT -_bluegl_glGetLocalConstantFloatvEXT: - mov ___blue_glCore_glGetLocalConstantFloatvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearNamedFramebufferfv +_bluegl_glClearNamedFramebufferfv: + mov ___blue_glCore_glClearNamedFramebufferfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexImage3DEXT -_bluegl_glMultiTexImage3DEXT: - mov ___blue_glCore_glMultiTexImage3DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearNamedFramebufferfi +_bluegl_glClearNamedFramebufferfi: + mov ___blue_glCore_glClearNamedFramebufferfi@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3fMESA -_bluegl_glWindowPos3fMESA: - mov ___blue_glCore_glWindowPos3fMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlitNamedFramebuffer +_bluegl_glBlitNamedFramebuffer: + mov ___blue_glCore_glBlitNamedFramebuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCullParameterdvEXT -_bluegl_glCullParameterdvEXT: - mov ___blue_glCore_glCullParameterdvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCheckNamedFramebufferStatus +_bluegl_glCheckNamedFramebufferStatus: + mov ___blue_glCore_glCheckNamedFramebufferStatus@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTrackMatrixivNV -_bluegl_glGetTrackMatrixivNV: - mov ___blue_glCore_glGetTrackMatrixivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedFramebufferParameteriv +_bluegl_glGetNamedFramebufferParameteriv: + mov ___blue_glCore_glGetNamedFramebufferParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendFuncSeparateINGR -_bluegl_glBlendFuncSeparateINGR: - mov ___blue_glCore_glBlendFuncSeparateINGR@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedFramebufferAttachmentParameteriv +_bluegl_glGetNamedFramebufferAttachmentParameteriv: + mov ___blue_glCore_glGetNamedFramebufferAttachmentParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix2fvARB -_bluegl_glUniformMatrix2fvARB: - mov ___blue_glCore_glUniformMatrix2fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreateRenderbuffers +_bluegl_glCreateRenderbuffers: + mov ___blue_glCore_glCreateRenderbuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawArraysInstancedEXT -_bluegl_glDrawArraysInstancedEXT: - mov ___blue_glCore_glDrawArraysInstancedEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedRenderbufferStorage +_bluegl_glNamedRenderbufferStorage: + mov ___blue_glCore_glNamedRenderbufferStorage@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3iARB -_bluegl_glMultiTexCoord3iARB: - mov ___blue_glCore_glMultiTexCoord3iARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedRenderbufferStorageMultisample +_bluegl_glNamedRenderbufferStorageMultisample: + mov ___blue_glCore_glNamedRenderbufferStorageMultisample@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedFramebufferParameterivEXT -_bluegl_glGetNamedFramebufferParameterivEXT: - mov ___blue_glCore_glGetNamedFramebufferParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedRenderbufferParameteriv +_bluegl_glGetNamedRenderbufferParameteriv: + mov ___blue_glCore_glGetNamedRenderbufferParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenTextures -_bluegl_glGenTextures: - mov ___blue_glCore_glGenTextures@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreateTextures +_bluegl_glCreateTextures: + mov ___blue_glCore_glCreateTextures@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsPointInStrokePathNV -_bluegl_glIsPointInStrokePathNV: - mov ___blue_glCore_glIsPointInStrokePathNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureBuffer +_bluegl_glTextureBuffer: + mov ___blue_glCore_glTextureBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawTransformFeedbackNV -_bluegl_glDrawTransformFeedbackNV: - mov ___blue_glCore_glDrawTransformFeedbackNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureBufferRange +_bluegl_glTextureBufferRange: + mov ___blue_glCore_glTextureBufferRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetActiveUniformARB -_bluegl_glGetActiveUniformARB: - mov ___blue_glCore_glGetActiveUniformARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureStorage1D +_bluegl_glTextureStorage1D: + mov ___blue_glCore_glTextureStorage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearNamedFramebufferfv -_bluegl_glClearNamedFramebufferfv: - mov ___blue_glCore_glClearNamedFramebufferfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureStorage2D +_bluegl_glTextureStorage2D: + mov ___blue_glCore_glTextureStorage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBeginVideoCaptureNV -_bluegl_glBeginVideoCaptureNV: - mov ___blue_glCore_glBeginVideoCaptureNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureStorage3D +_bluegl_glTextureStorage3D: + mov ___blue_glCore_glTextureStorage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyTexImage1D -_bluegl_glCopyTexImage1D: - mov ___blue_glCore_glCopyTexImage1D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureStorage2DMultisample +_bluegl_glTextureStorage2DMultisample: + mov ___blue_glCore_glTextureStorage2DMultisample@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexStorage1D -_bluegl_glTexStorage1D: - mov ___blue_glCore_glTexStorage1D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureStorage3DMultisample +_bluegl_glTextureStorage3DMultisample: + mov ___blue_glCore_glTextureStorage3DMultisample@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3ui64ARB -_bluegl_glProgramUniform3ui64ARB: - mov ___blue_glCore_glProgramUniform3ui64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureSubImage1D +_bluegl_glTextureSubImage1D: + mov ___blue_glCore_glTextureSubImage1D@GOTPCREL(%rip), %r11 jmp *(%r11) .private_extern _bluegl_glTextureSubImage2D @@ -2984,579 +3003,579 @@ _bluegl_glTextureSubImage2D: mov ___blue_glCore_glTextureSubImage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4bOES -_bluegl_glMultiTexCoord4bOES: - mov ___blue_glCore_glMultiTexCoord4bOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureSubImage3D +_bluegl_glTextureSubImage3D: + mov ___blue_glCore_glTextureSubImage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiDrawArraysIndirectCountARB -_bluegl_glMultiDrawArraysIndirectCountARB: - mov ___blue_glCore_glMultiDrawArraysIndirectCountARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTextureSubImage1D +_bluegl_glCompressedTextureSubImage1D: + mov ___blue_glCore_glCompressedTextureSubImage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix3dvEXT -_bluegl_glProgramUniformMatrix3dvEXT: - mov ___blue_glCore_glProgramUniformMatrix3dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTextureSubImage2D +_bluegl_glCompressedTextureSubImage2D: + mov ___blue_glCore_glCompressedTextureSubImage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2s -_bluegl_glVertexAttrib2s: - mov ___blue_glCore_glVertexAttrib2s@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTextureSubImage3D +_bluegl_glCompressedTextureSubImage3D: + mov ___blue_glCore_glCompressedTextureSubImage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetDoublev -_bluegl_glGetDoublev: - mov ___blue_glCore_glGetDoublev@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyTextureSubImage1D +_bluegl_glCopyTextureSubImage1D: + mov ___blue_glCore_glCopyTextureSubImage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3svARB -_bluegl_glVertexAttrib3svARB: - mov ___blue_glCore_glVertexAttrib3svARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyTextureSubImage2D +_bluegl_glCopyTextureSubImage2D: + mov ___blue_glCore_glCopyTextureSubImage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramNamedParameter4dvNV -_bluegl_glProgramNamedParameter4dvNV: - mov ___blue_glCore_glProgramNamedParameter4dvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyTextureSubImage3D +_bluegl_glCopyTextureSubImage3D: + mov ___blue_glCore_glCopyTextureSubImage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureBufferRange -_bluegl_glTextureBufferRange: - mov ___blue_glCore_glTextureBufferRange@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureParameterf +_bluegl_glTextureParameterf: + mov ___blue_glCore_glTextureParameterf@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferTextureFaceEXT -_bluegl_glFramebufferTextureFaceEXT: - mov ___blue_glCore_glFramebufferTextureFaceEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureParameterfv +_bluegl_glTextureParameterfv: + mov ___blue_glCore_glTextureParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindBufferRange -_bluegl_glBindBufferRange: - mov ___blue_glCore_glBindBufferRange@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureParameteri +_bluegl_glTextureParameteri: + mov ___blue_glCore_glTextureParameteri@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEnablei -_bluegl_glEnablei: - mov ___blue_glCore_glEnablei@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureParameterIiv +_bluegl_glTextureParameterIiv: + mov ___blue_glCore_glTextureParameterIiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureParameterIuivEXT -_bluegl_glGetTextureParameterIuivEXT: - mov ___blue_glCore_glGetTextureParameterIuivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureParameterIuiv +_bluegl_glTextureParameterIuiv: + mov ___blue_glCore_glTextureParameterIuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramInterfaceiv -_bluegl_glGetProgramInterfaceiv: - mov ___blue_glCore_glGetProgramInterfaceiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureParameteriv +_bluegl_glTextureParameteriv: + mov ___blue_glCore_glTextureParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClientAttribDefaultEXT -_bluegl_glClientAttribDefaultEXT: - mov ___blue_glCore_glClientAttribDefaultEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenerateTextureMipmap +_bluegl_glGenerateTextureMipmap: + mov ___blue_glCore_glGenerateTextureMipmap@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL3ui64NV -_bluegl_glVertexAttribL3ui64NV: - mov ___blue_glCore_glVertexAttribL3ui64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindTextureUnit +_bluegl_glBindTextureUnit: + mov ___blue_glCore_glBindTextureUnit@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2dARB -_bluegl_glWindowPos2dARB: - mov ___blue_glCore_glWindowPos2dARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTextureImage +_bluegl_glGetTextureImage: + mov ___blue_glCore_glGetTextureImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI2uiEXT -_bluegl_glVertexAttribI2uiEXT: - mov ___blue_glCore_glVertexAttribI2uiEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetCompressedTextureImage +_bluegl_glGetCompressedTextureImage: + mov ___blue_glCore_glGetCompressedTextureImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindVertexBuffers -_bluegl_glBindVertexBuffers: - mov ___blue_glCore_glBindVertexBuffers@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTextureLevelParameterfv +_bluegl_glGetTextureLevelParameterfv: + mov ___blue_glCore_glGetTextureLevelParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix3x4fv -_bluegl_glProgramUniformMatrix3x4fv: - mov ___blue_glCore_glProgramUniformMatrix3x4fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTextureLevelParameteriv +_bluegl_glGetTextureLevelParameteriv: + mov ___blue_glCore_glGetTextureLevelParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTexLevelParameterxvOES -_bluegl_glGetTexLevelParameterxvOES: - mov ___blue_glCore_glGetTexLevelParameterxvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTextureParameterfv +_bluegl_glGetTextureParameterfv: + mov ___blue_glCore_glGetTextureParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glVertexAttribPointer -_bluegl_glVertexAttribPointer: - mov ___blue_glCore_glVertexAttribPointer@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glGetTextureParameterIiv +_bluegl_glGetTextureParameterIiv: + mov ___blue_glCore_glGetTextureParameterIiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureImage1DEXT -_bluegl_glTextureImage1DEXT: - mov ___blue_glCore_glTextureImage1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTextureParameterIuiv +_bluegl_glGetTextureParameterIuiv: + mov ___blue_glCore_glGetTextureParameterIuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribs4dvNV -_bluegl_glVertexAttribs4dvNV: - mov ___blue_glCore_glVertexAttribs4dvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTextureParameteriv +_bluegl_glGetTextureParameteriv: + mov ___blue_glCore_glGetTextureParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3svEXT -_bluegl_glSecondaryColor3svEXT: - mov ___blue_glCore_glSecondaryColor3svEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreateVertexArrays +_bluegl_glCreateVertexArrays: + mov ___blue_glCore_glCreateVertexArrays@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetQueryivARB -_bluegl_glGetQueryivARB: - mov ___blue_glCore_glGetQueryivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDisableVertexArrayAttrib +_bluegl_glDisableVertexArrayAttrib: + mov ___blue_glCore_glDisableVertexArrayAttrib@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord4bOES -_bluegl_glTexCoord4bOES: - mov ___blue_glCore_glTexCoord4bOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEnableVertexArrayAttrib +_bluegl_glEnableVertexArrayAttrib: + mov ___blue_glCore_glEnableVertexArrayAttrib@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1fEXT -_bluegl_glProgramUniform1fEXT: - mov ___blue_glCore_glProgramUniform1fEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayElementBuffer +_bluegl_glVertexArrayElementBuffer: + mov ___blue_glCore_glVertexArrayElementBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexP2ui -_bluegl_glVertexP2ui: - mov ___blue_glCore_glVertexP2ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayVertexBuffer +_bluegl_glVertexArrayVertexBuffer: + mov ___blue_glCore_glVertexArrayVertexBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSetInvariantEXT -_bluegl_glSetInvariantEXT: - mov ___blue_glCore_glSetInvariantEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayVertexBuffers +_bluegl_glVertexArrayVertexBuffers: + mov ___blue_glCore_glVertexArrayVertexBuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glActiveShaderProgram -_bluegl_glActiveShaderProgram: - mov ___blue_glCore_glActiveShaderProgram@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayAttribBinding +_bluegl_glVertexArrayAttribBinding: + mov ___blue_glCore_glVertexArrayAttribBinding@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL1ui64NV -_bluegl_glVertexAttribL1ui64NV: - mov ___blue_glCore_glVertexAttribL1ui64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayAttribFormat +_bluegl_glVertexArrayAttribFormat: + mov ___blue_glCore_glVertexArrayAttribFormat@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVariantBooleanvEXT -_bluegl_glGetVariantBooleanvEXT: - mov ___blue_glCore_glGetVariantBooleanvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayAttribIFormat +_bluegl_glVertexArrayAttribIFormat: + mov ___blue_glCore_glVertexArrayAttribIFormat@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glAreTexturesResidentEXT -_bluegl_glAreTexturesResidentEXT: - mov ___blue_glCore_glAreTexturesResidentEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayAttribLFormat +_bluegl_glVertexArrayAttribLFormat: + mov ___blue_glCore_glVertexArrayAttribLFormat@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixMultTranspose3x3fNV -_bluegl_glMatrixMultTranspose3x3fNV: - mov ___blue_glCore_glMatrixMultTranspose3x3fNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayBindingDivisor +_bluegl_glVertexArrayBindingDivisor: + mov ___blue_glCore_glVertexArrayBindingDivisor@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2f -_bluegl_glProgramUniform2f: - mov ___blue_glCore_glProgramUniform2f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexArrayiv +_bluegl_glGetVertexArrayiv: + mov ___blue_glCore_glGetVertexArrayiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearNamedBufferDataEXT -_bluegl_glClearNamedBufferDataEXT: - mov ___blue_glCore_glClearNamedBufferDataEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexArrayIndexediv +_bluegl_glGetVertexArrayIndexediv: + mov ___blue_glCore_glGetVertexArrayIndexediv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsOcclusionQueryNV -_bluegl_glIsOcclusionQueryNV: - mov ___blue_glCore_glIsOcclusionQueryNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexArrayIndexed64iv +_bluegl_glGetVertexArrayIndexed64iv: + mov ___blue_glCore_glGetVertexArrayIndexed64iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI4bv -_bluegl_glVertexAttribI4bv: - mov ___blue_glCore_glVertexAttribI4bv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreateSamplers +_bluegl_glCreateSamplers: + mov ___blue_glCore_glCreateSamplers@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord2xvOES -_bluegl_glTexCoord2xvOES: - mov ___blue_glCore_glTexCoord2xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreateProgramPipelines +_bluegl_glCreateProgramPipelines: + mov ___blue_glCore_glCreateProgramPipelines@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4Nubv -_bluegl_glVertexAttrib4Nubv: - mov ___blue_glCore_glVertexAttrib4Nubv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreateQueries +_bluegl_glCreateQueries: + mov ___blue_glCore_glCreateQueries@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3hNV -_bluegl_glVertexAttrib3hNV: - mov ___blue_glCore_glVertexAttrib3hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetQueryBufferObjecti64v +_bluegl_glGetQueryBufferObjecti64v: + mov ___blue_glCore_glGetQueryBufferObjecti64v@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2xvOES -_bluegl_glMultiTexCoord2xvOES: - mov ___blue_glCore_glMultiTexCoord2xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetQueryBufferObjectiv +_bluegl_glGetQueryBufferObjectiv: + mov ___blue_glCore_glGetQueryBufferObjectiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferTextureEXT -_bluegl_glFramebufferTextureEXT: - mov ___blue_glCore_glFramebufferTextureEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetQueryBufferObjectui64v +_bluegl_glGetQueryBufferObjectui64v: + mov ___blue_glCore_glGetQueryBufferObjectui64v@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix3fv -_bluegl_glProgramUniformMatrix3fv: - mov ___blue_glCore_glProgramUniformMatrix3fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetQueryBufferObjectuiv +_bluegl_glGetQueryBufferObjectuiv: + mov ___blue_glCore_glGetQueryBufferObjectuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetInternalformatSampleivNV -_bluegl_glGetInternalformatSampleivNV: - mov ___blue_glCore_glGetInternalformatSampleivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMemoryBarrierByRegion +_bluegl_glMemoryBarrierByRegion: + mov ___blue_glCore_glMemoryBarrierByRegion@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathSubCommandsNV -_bluegl_glPathSubCommandsNV: - mov ___blue_glCore_glPathSubCommandsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTextureSubImage +_bluegl_glGetTextureSubImage: + mov ___blue_glCore_glGetTextureSubImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStencilStrokePathNV -_bluegl_glStencilStrokePathNV: - mov ___blue_glCore_glStencilStrokePathNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetCompressedTextureSubImage +_bluegl_glGetCompressedTextureSubImage: + mov ___blue_glCore_glGetCompressedTextureSubImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathParameterfNV -_bluegl_glPathParameterfNV: - mov ___blue_glCore_glPathParameterfNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetGraphicsResetStatus +_bluegl_glGetGraphicsResetStatus: + mov ___blue_glCore_glGetGraphicsResetStatus@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glActiveProgramEXT -_bluegl_glActiveProgramEXT: - mov ___blue_glCore_glActiveProgramEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnCompressedTexImage +_bluegl_glGetnCompressedTexImage: + mov ___blue_glCore_glGetnCompressedTexImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClampColorARB -_bluegl_glClampColorARB: - mov ___blue_glCore_glClampColorARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnTexImage +_bluegl_glGetnTexImage: + mov ___blue_glCore_glGetnTexImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI2uivEXT -_bluegl_glVertexAttribI2uivEXT: - mov ___blue_glCore_glVertexAttribI2uivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnUniformdv +_bluegl_glGetnUniformdv: + mov ___blue_glCore_glGetnUniformdv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL1ui64vARB -_bluegl_glVertexAttribL1ui64vARB: - mov ___blue_glCore_glVertexAttribL1ui64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnUniformfv +_bluegl_glGetnUniformfv: + mov ___blue_glCore_glGetnUniformfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glValidateProgram -_bluegl_glValidateProgram: - mov ___blue_glCore_glValidateProgram@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnUniformiv +_bluegl_glGetnUniformiv: + mov ___blue_glCore_glGetnUniformiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2xOES -_bluegl_glMultiTexCoord2xOES: - mov ___blue_glCore_glMultiTexCoord2xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnUniformuiv +_bluegl_glGetnUniformuiv: + mov ___blue_glCore_glGetnUniformuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFogCoordf -_bluegl_glFogCoordf: - mov ___blue_glCore_glFogCoordf@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReadnPixels +_bluegl_glReadnPixels: + mov ___blue_glCore_glReadnPixels@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetError -_bluegl_glGetError: - mov ___blue_glCore_glGetError@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureBarrier +_bluegl_glTextureBarrier: + mov ___blue_glCore_glTextureBarrier@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSpriteParameterfSGIX -_bluegl_glSpriteParameterfSGIX: - mov ___blue_glCore_glSpriteParameterfSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTextureHandleARB +_bluegl_glGetTextureHandleARB: + mov ___blue_glCore_glGetTextureHandleARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3dvNV -_bluegl_glVertexAttrib3dvNV: - mov ___blue_glCore_glVertexAttrib3dvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTextureSamplerHandleARB +_bluegl_glGetTextureSamplerHandleARB: + mov ___blue_glCore_glGetTextureSamplerHandleARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3bOES -_bluegl_glMultiTexCoord3bOES: - mov ___blue_glCore_glMultiTexCoord3bOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMakeTextureHandleResidentARB +_bluegl_glMakeTextureHandleResidentARB: + mov ___blue_glCore_glMakeTextureHandleResidentARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTexParameterIuivEXT -_bluegl_glGetTexParameterIuivEXT: - mov ___blue_glCore_glGetTexParameterIuivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMakeTextureHandleNonResidentARB +_bluegl_glMakeTextureHandleNonResidentARB: + mov ___blue_glCore_glMakeTextureHandleNonResidentARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIndexMaterialEXT -_bluegl_glIndexMaterialEXT: - mov ___blue_glCore_glIndexMaterialEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetImageHandleARB +_bluegl_glGetImageHandleARB: + mov ___blue_glCore_glGetImageHandleARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1iARB -_bluegl_glUniform1iARB: - mov ___blue_glCore_glUniform1iARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMakeImageHandleResidentARB +_bluegl_glMakeImageHandleResidentARB: + mov ___blue_glCore_glMakeImageHandleResidentARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4NivARB -_bluegl_glVertexAttrib4NivARB: - mov ___blue_glCore_glVertexAttrib4NivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMakeImageHandleNonResidentARB +_bluegl_glMakeImageHandleNonResidentARB: + mov ___blue_glCore_glMakeImageHandleNonResidentARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureParameteri -_bluegl_glTextureParameteri: - mov ___blue_glCore_glTextureParameteri@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformHandleui64ARB +_bluegl_glUniformHandleui64ARB: + mov ___blue_glCore_glUniformHandleui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3d -_bluegl_glSecondaryColor3d: - mov ___blue_glCore_glSecondaryColor3d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformHandleui64vARB +_bluegl_glUniformHandleui64vARB: + mov ___blue_glCore_glUniformHandleui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2sv -_bluegl_glWindowPos2sv: - mov ___blue_glCore_glWindowPos2sv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformHandleui64ARB +_bluegl_glProgramUniformHandleui64ARB: + mov ___blue_glCore_glProgramUniformHandleui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawBuffersARB -_bluegl_glDrawBuffersARB: - mov ___blue_glCore_glDrawBuffersARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformHandleui64vARB +_bluegl_glProgramUniformHandleui64vARB: + mov ___blue_glCore_glProgramUniformHandleui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMultiTexParameterIuivEXT -_bluegl_glGetMultiTexParameterIuivEXT: - mov ___blue_glCore_glGetMultiTexParameterIuivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsTextureHandleResidentARB +_bluegl_glIsTextureHandleResidentARB: + mov ___blue_glCore_glIsTextureHandleResidentARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetConvolutionFilter -_bluegl_glGetConvolutionFilter: - mov ___blue_glCore_glGetConvolutionFilter@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsImageHandleResidentARB +_bluegl_glIsImageHandleResidentARB: + mov ___blue_glCore_glIsImageHandleResidentARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDisableVertexArrayAttrib -_bluegl_glDisableVertexArrayAttrib: - mov ___blue_glCore_glDisableVertexArrayAttrib@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL1ui64ARB +_bluegl_glVertexAttribL1ui64ARB: + mov ___blue_glCore_glVertexAttribL1ui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4i -_bluegl_glProgramUniform4i: - mov ___blue_glCore_glProgramUniform4i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL1ui64vARB +_bluegl_glVertexAttribL1ui64vARB: + mov ___blue_glCore_glVertexAttribL1ui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCheckNamedFramebufferStatusEXT -_bluegl_glCheckNamedFramebufferStatusEXT: - mov ___blue_glCore_glCheckNamedFramebufferStatusEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribLui64vARB +_bluegl_glGetVertexAttribLui64vARB: + mov ___blue_glCore_glGetVertexAttribLui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3xOES -_bluegl_glMultiTexCoord3xOES: - mov ___blue_glCore_glMultiTexCoord3xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreateSyncFromCLeventARB +_bluegl_glCreateSyncFromCLeventARB: + mov ___blue_glCore_glCreateSyncFromCLeventARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawElementsInstancedEXT -_bluegl_glDrawElementsInstancedEXT: - mov ___blue_glCore_glDrawElementsInstancedEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDispatchComputeGroupSizeARB +_bluegl_glDispatchComputeGroupSizeARB: + mov ___blue_glCore_glDispatchComputeGroupSizeARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColor4fNormal3fVertex3fvSUN -_bluegl_glColor4fNormal3fVertex3fvSUN: - mov ___blue_glCore_glColor4fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDebugMessageControlARB +_bluegl_glDebugMessageControlARB: + mov ___blue_glCore_glDebugMessageControlARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsTransformFeedbackNV -_bluegl_glIsTransformFeedbackNV: - mov ___blue_glCore_glIsTransformFeedbackNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDebugMessageInsertARB +_bluegl_glDebugMessageInsertARB: + mov ___blue_glCore_glDebugMessageInsertARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawTransformFeedbackStreamInstanced -_bluegl_glDrawTransformFeedbackStreamInstanced: - mov ___blue_glCore_glDrawTransformFeedbackStreamInstanced@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDebugMessageCallbackARB +_bluegl_glDebugMessageCallbackARB: + mov ___blue_glCore_glDebugMessageCallbackARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMapNamedBufferEXT -_bluegl_glMapNamedBufferEXT: - mov ___blue_glCore_glMapNamedBufferEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetDebugMessageLogARB +_bluegl_glGetDebugMessageLogARB: + mov ___blue_glCore_glGetDebugMessageLogARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayIndexOffsetEXT -_bluegl_glVertexArrayIndexOffsetEXT: - mov ___blue_glCore_glVertexArrayIndexOffsetEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendEquationiARB +_bluegl_glBlendEquationiARB: + mov ___blue_glCore_glBlendEquationiARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPolygonMode -_bluegl_glPolygonMode: - mov ___blue_glCore_glPolygonMode@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendEquationSeparateiARB +_bluegl_glBlendEquationSeparateiARB: + mov ___blue_glCore_glBlendEquationSeparateiARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetDetailTexFuncSGIS -_bluegl_glGetDetailTexFuncSGIS: - mov ___blue_glCore_glGetDetailTexFuncSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendFunciARB +_bluegl_glBlendFunciARB: + mov ___blue_glCore_glBlendFunciARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2iv -_bluegl_glMultiTexCoord2iv: - mov ___blue_glCore_glMultiTexCoord2iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendFuncSeparateiARB +_bluegl_glBlendFuncSeparateiARB: + mov ___blue_glCore_glBlendFuncSeparateiARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetHistogramParameterfvEXT -_bluegl_glGetHistogramParameterfvEXT: - mov ___blue_glCore_glGetHistogramParameterfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiDrawArraysIndirectCountARB +_bluegl_glMultiDrawArraysIndirectCountARB: + mov ___blue_glCore_glMultiDrawArraysIndirectCountARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4fvEXT -_bluegl_glProgramUniform4fvEXT: - mov ___blue_glCore_glProgramUniform4fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiDrawElementsIndirectCountARB +_bluegl_glMultiDrawElementsIndirectCountARB: + mov ___blue_glCore_glMultiDrawElementsIndirectCountARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDetailTexFuncSGIS -_bluegl_glDetailTexFuncSGIS: - mov ___blue_glCore_glDetailTexFuncSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetGraphicsResetStatusARB +_bluegl_glGetGraphicsResetStatusARB: + mov ___blue_glCore_glGetGraphicsResetStatusARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexParameterIivEXT -_bluegl_glTexParameterIivEXT: - mov ___blue_glCore_glTexParameterIivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnTexImageARB +_bluegl_glGetnTexImageARB: + mov ___blue_glCore_glGetnTexImageARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedFramebufferTextureLayerEXT -_bluegl_glNamedFramebufferTextureLayerEXT: - mov ___blue_glCore_glNamedFramebufferTextureLayerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReadnPixelsARB +_bluegl_glReadnPixelsARB: + mov ___blue_glCore_glReadnPixelsARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDisablei -_bluegl_glDisablei: - mov ___blue_glCore_glDisablei@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnCompressedTexImageARB +_bluegl_glGetnCompressedTexImageARB: + mov ___blue_glCore_glGetnCompressedTexImageARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4fv -_bluegl_glUniform4fv: - mov ___blue_glCore_glUniform4fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnUniformfvARB +_bluegl_glGetnUniformfvARB: + mov ___blue_glCore_glGetnUniformfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1hNV -_bluegl_glVertexAttrib1hNV: - mov ___blue_glCore_glVertexAttrib1hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnUniformivARB +_bluegl_glGetnUniformivARB: + mov ___blue_glCore_glGetnUniformivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWeightsvARB -_bluegl_glWeightsvARB: - mov ___blue_glCore_glWeightsvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnUniformuivARB +_bluegl_glGetnUniformuivARB: + mov ___blue_glCore_glGetnUniformuivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSampleMaskIndexedNV -_bluegl_glSampleMaskIndexedNV: - mov ___blue_glCore_glSampleMaskIndexedNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnUniformdvARB +_bluegl_glGetnUniformdvARB: + mov ___blue_glCore_glGetnUniformdvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4dvARB -_bluegl_glVertexAttrib4dvARB: - mov ___blue_glCore_glVertexAttrib4dvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMinSampleShadingARB +_bluegl_glMinSampleShadingARB: + mov ___blue_glCore_glMinSampleShadingARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBeginFragmentShaderATI -_bluegl_glBeginFragmentShaderATI: - mov ___blue_glCore_glBeginFragmentShaderATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedStringARB +_bluegl_glNamedStringARB: + mov ___blue_glCore_glNamedStringARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedProgramLocalParameterI4ivEXT -_bluegl_glNamedProgramLocalParameterI4ivEXT: - mov ___blue_glCore_glNamedProgramLocalParameterI4ivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteNamedStringARB +_bluegl_glDeleteNamedStringARB: + mov ___blue_glCore_glDeleteNamedStringARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetConvolutionParameteriv -_bluegl_glGetConvolutionParameteriv: - mov ___blue_glCore_glGetConvolutionParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompileShaderIncludeARB +_bluegl_glCompileShaderIncludeARB: + mov ___blue_glCore_glCompileShaderIncludeARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClipControl -_bluegl_glClipControl: - mov ___blue_glCore_glClipControl@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsNamedStringARB +_bluegl_glIsNamedStringARB: + mov ___blue_glCore_glIsNamedStringARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBinormal3fEXT -_bluegl_glBinormal3fEXT: - mov ___blue_glCore_glBinormal3fEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedStringARB +_bluegl_glGetNamedStringARB: + mov ___blue_glCore_glGetNamedStringARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColor4ubVertex2fSUN -_bluegl_glColor4ubVertex2fSUN: - mov ___blue_glCore_glColor4ubVertex2fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedStringivARB +_bluegl_glGetNamedStringivARB: + mov ___blue_glCore_glGetNamedStringivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTexImage3D -_bluegl_glCompressedTexImage3D: - mov ___blue_glCore_glCompressedTexImage3D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBufferPageCommitmentARB +_bluegl_glBufferPageCommitmentARB: + mov ___blue_glCore_glBufferPageCommitmentARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureSamplerHandleARB -_bluegl_glGetTextureSamplerHandleARB: - mov ___blue_glCore_glGetTextureSamplerHandleARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedBufferPageCommitmentEXT +_bluegl_glNamedBufferPageCommitmentEXT: + mov ___blue_glCore_glNamedBufferPageCommitmentEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3uiv -_bluegl_glUniform3uiv: - mov ___blue_glCore_glUniform3uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedBufferPageCommitmentARB +_bluegl_glNamedBufferPageCommitmentARB: + mov ___blue_glCore_glNamedBufferPageCommitmentARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribPointerv -_bluegl_glGetVertexAttribPointerv: - mov ___blue_glCore_glGetVertexAttribPointerv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexPageCommitmentARB +_bluegl_glTexPageCommitmentARB: + mov ___blue_glCore_glTexPageCommitmentARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenBuffers -_bluegl_glGenBuffers: - mov ___blue_glCore_glGenBuffers@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClientActiveTexture +_bluegl_glClientActiveTexture: + mov ___blue_glCore_glClientActiveTexture@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3dvARB -_bluegl_glVertexAttrib3dvARB: - mov ___blue_glCore_glVertexAttrib3dvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1d +_bluegl_glMultiTexCoord1d: + mov ___blue_glCore_glMultiTexCoord1d@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glFlushVertexArrayRangeNV -_bluegl_glFlushVertexArrayRangeNV: - mov ___blue_glCore_glFlushVertexArrayRangeNV@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glMultiTexCoord1dv +_bluegl_glMultiTexCoord1dv: + mov ___blue_glCore_glMultiTexCoord1dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramNamedParameterdvNV -_bluegl_glGetProgramNamedParameterdvNV: - mov ___blue_glCore_glGetProgramNamedParameterdvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1f +_bluegl_glMultiTexCoord1f: + mov ___blue_glCore_glMultiTexCoord1f@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glConvolutionParameterf -_bluegl_glConvolutionParameterf: - mov ___blue_glCore_glConvolutionParameterf@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1fv +_bluegl_glMultiTexCoord1fv: + mov ___blue_glCore_glMultiTexCoord1fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertex2bOES -_bluegl_glVertex2bOES: - mov ___blue_glCore_glVertex2bOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1i +_bluegl_glMultiTexCoord1i: + mov ___blue_glCore_glMultiTexCoord1i@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetObjectPtrLabel -_bluegl_glGetObjectPtrLabel: - mov ___blue_glCore_glGetObjectPtrLabel@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1iv +_bluegl_glMultiTexCoord1iv: + mov ___blue_glCore_glMultiTexCoord1iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBeginTransformFeedbackNV -_bluegl_glBeginTransformFeedbackNV: - mov ___blue_glCore_glBeginTransformFeedbackNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1s +_bluegl_glMultiTexCoord1s: + mov ___blue_glCore_glMultiTexCoord1s@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureSubImage -_bluegl_glGetTextureSubImage: - mov ___blue_glCore_glGetTextureSubImage@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1sv +_bluegl_glMultiTexCoord1sv: + mov ___blue_glCore_glMultiTexCoord1sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFramebufferAttachmentParameterivEXT -_bluegl_glGetFramebufferAttachmentParameterivEXT: - mov ___blue_glCore_glGetFramebufferAttachmentParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2d +_bluegl_glMultiTexCoord2d: + mov ___blue_glCore_glMultiTexCoord2d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetInteger64v -_bluegl_glGetInteger64v: - mov ___blue_glCore_glGetInteger64v@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2dv +_bluegl_glMultiTexCoord2dv: + mov ___blue_glCore_glMultiTexCoord2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetUniformLocation -_bluegl_glGetUniformLocation: - mov ___blue_glCore_glGetUniformLocation@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2f +_bluegl_glMultiTexCoord2f: + mov ___blue_glCore_glMultiTexCoord2f@GOTPCREL(%rip), %r11 jmp *(%r11) .private_extern _bluegl_glMultiTexCoord2fv @@ -3564,379 +3583,389 @@ _bluegl_glMultiTexCoord2fv: mov ___blue_glCore_glMultiTexCoord2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2uiv -_bluegl_glProgramUniform2uiv: - mov ___blue_glCore_glProgramUniform2uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2i +_bluegl_glMultiTexCoord2i: + mov ___blue_glCore_glMultiTexCoord2i@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTexParameterIuiv -_bluegl_glGetTexParameterIuiv: - mov ___blue_glCore_glGetTexParameterIuiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2iv +_bluegl_glMultiTexCoord2iv: + mov ___blue_glCore_glMultiTexCoord2iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI4ui -_bluegl_glVertexAttribI4ui: - mov ___blue_glCore_glVertexAttribI4ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2s +_bluegl_glMultiTexCoord2s: + mov ___blue_glCore_glMultiTexCoord2s@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexGenxvOES -_bluegl_glTexGenxvOES: - mov ___blue_glCore_glTexGenxvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2sv +_bluegl_glMultiTexCoord2sv: + mov ___blue_glCore_glMultiTexCoord2sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertex4bOES -_bluegl_glVertex4bOES: - mov ___blue_glCore_glVertex4bOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3d +_bluegl_glMultiTexCoord3d: + mov ___blue_glCore_glMultiTexCoord3d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyTexSubImage2DEXT -_bluegl_glCopyTexSubImage2DEXT: - mov ___blue_glCore_glCopyTexSubImage2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3dv +_bluegl_glMultiTexCoord3dv: + mov ___blue_glCore_glMultiTexCoord3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawBuffersATI -_bluegl_glDrawBuffersATI: - mov ___blue_glCore_glDrawBuffersATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3f +_bluegl_glMultiTexCoord3f: + mov ___blue_glCore_glMultiTexCoord3f@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathGlyphsNV -_bluegl_glPathGlyphsNV: - mov ___blue_glCore_glPathGlyphsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3fv +_bluegl_glMultiTexCoord3fv: + mov ___blue_glCore_glMultiTexCoord3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixIndexuivARB -_bluegl_glMatrixIndexuivARB: - mov ___blue_glCore_glMatrixIndexuivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3i +_bluegl_glMultiTexCoord3i: + mov ___blue_glCore_glMultiTexCoord3i@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedProgramLocalParameterI4uiEXT -_bluegl_glNamedProgramLocalParameterI4uiEXT: - mov ___blue_glCore_glNamedProgramLocalParameterI4uiEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3iv +_bluegl_glMultiTexCoord3iv: + mov ___blue_glCore_glMultiTexCoord3iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2iv -_bluegl_glWindowPos2iv: - mov ___blue_glCore_glWindowPos2iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3s +_bluegl_glMultiTexCoord3s: + mov ___blue_glCore_glMultiTexCoord3s@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLightModelxOES -_bluegl_glLightModelxOES: - mov ___blue_glCore_glLightModelxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3sv +_bluegl_glMultiTexCoord3sv: + mov ___blue_glCore_glMultiTexCoord3sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindFragmentShaderATI -_bluegl_glBindFragmentShaderATI: - mov ___blue_glCore_glBindFragmentShaderATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4d +_bluegl_glMultiTexCoord4d: + mov ___blue_glCore_glMultiTexCoord4d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glInvalidateTexSubImage -_bluegl_glInvalidateTexSubImage: - mov ___blue_glCore_glInvalidateTexSubImage@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4dv +_bluegl_glMultiTexCoord4dv: + mov ___blue_glCore_glMultiTexCoord4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4sARB -_bluegl_glVertexAttrib4sARB: - mov ___blue_glCore_glVertexAttrib4sARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4f +_bluegl_glMultiTexCoord4f: + mov ___blue_glCore_glMultiTexCoord4f@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramiv -_bluegl_glGetProgramiv: - mov ___blue_glCore_glGetProgramiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4fv +_bluegl_glMultiTexCoord4fv: + mov ___blue_glCore_glMultiTexCoord4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVideoCaptureStreamivNV -_bluegl_glGetVideoCaptureStreamivNV: - mov ___blue_glCore_glGetVideoCaptureStreamivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4i +_bluegl_glMultiTexCoord4i: + mov ___blue_glCore_glMultiTexCoord4i@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureParameterfvEXT -_bluegl_glTextureParameterfvEXT: - mov ___blue_glCore_glTextureParameterfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4iv +_bluegl_glMultiTexCoord4iv: + mov ___blue_glCore_glMultiTexCoord4iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPNTrianglesfATI -_bluegl_glPNTrianglesfATI: - mov ___blue_glCore_glPNTrianglesfATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4s +_bluegl_glMultiTexCoord4s: + mov ___blue_glCore_glMultiTexCoord4s@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCheckNamedFramebufferStatus -_bluegl_glCheckNamedFramebufferStatus: - mov ___blue_glCore_glCheckNamedFramebufferStatus@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4sv +_bluegl_glMultiTexCoord4sv: + mov ___blue_glCore_glMultiTexCoord4sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4uiEXT -_bluegl_glUniform4uiEXT: - mov ___blue_glCore_glUniform4uiEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLoadTransposeMatrixf +_bluegl_glLoadTransposeMatrixf: + mov ___blue_glCore_glLoadTransposeMatrixf@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2sv -_bluegl_glVertexAttrib2sv: - mov ___blue_glCore_glVertexAttrib2sv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLoadTransposeMatrixd +_bluegl_glLoadTransposeMatrixd: + mov ___blue_glCore_glLoadTransposeMatrixd@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearBufferData -_bluegl_glClearBufferData: - mov ___blue_glCore_glClearBufferData@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultTransposeMatrixf +_bluegl_glMultTransposeMatrixf: + mov ___blue_glCore_glMultTransposeMatrixf@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glShaderSourceARB -_bluegl_glShaderSourceARB: - mov ___blue_glCore_glShaderSourceARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultTransposeMatrixd +_bluegl_glMultTransposeMatrixd: + mov ___blue_glCore_glMultTransposeMatrixd@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glObjectPurgeableAPPLE -_bluegl_glObjectPurgeableAPPLE: - mov ___blue_glCore_glObjectPurgeableAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFogCoordf +_bluegl_glFogCoordf: + mov ___blue_glCore_glFogCoordf@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2iEXT -_bluegl_glProgramUniform2iEXT: - mov ___blue_glCore_glProgramUniform2iEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFogCoordfv +_bluegl_glFogCoordfv: + mov ___blue_glCore_glFogCoordfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetStringi -_bluegl_glGetStringi: - mov ___blue_glCore_glGetStringi@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFogCoordd +_bluegl_glFogCoordd: + mov ___blue_glCore_glFogCoordd@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexFilterFuncSGIS -_bluegl_glTexFilterFuncSGIS: - mov ___blue_glCore_glTexFilterFuncSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFogCoorddv +_bluegl_glFogCoorddv: + mov ___blue_glCore_glFogCoorddv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayVertexAttribLOffsetEXT -_bluegl_glVertexArrayVertexAttribLOffsetEXT: - mov ___blue_glCore_glVertexArrayVertexAttribLOffsetEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFogCoordPointer +_bluegl_glFogCoordPointer: + mov ___blue_glCore_glFogCoordPointer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramLocalParametersI4uivNV -_bluegl_glProgramLocalParametersI4uivNV: - mov ___blue_glCore_glProgramLocalParametersI4uivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3b +_bluegl_glSecondaryColor3b: + mov ___blue_glCore_glSecondaryColor3b@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetHistogramEXT -_bluegl_glGetHistogramEXT: - mov ___blue_glCore_glGetHistogramEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3bv +_bluegl_glSecondaryColor3bv: + mov ___blue_glCore_glSecondaryColor3bv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedBufferPageCommitmentARB -_bluegl_glNamedBufferPageCommitmentARB: - mov ___blue_glCore_glNamedBufferPageCommitmentARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3d +_bluegl_glSecondaryColor3d: + mov ___blue_glCore_glSecondaryColor3d@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.private_extern _bluegl_glSecondaryColor3dv +_bluegl_glSecondaryColor3dv: + mov ___blue_glCore_glSecondaryColor3dv@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.private_extern _bluegl_glSecondaryColor3f +_bluegl_glSecondaryColor3f: + mov ___blue_glCore_glSecondaryColor3f@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMakeBufferResidentNV -_bluegl_glMakeBufferResidentNV: - mov ___blue_glCore_glMakeBufferResidentNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3fv +_bluegl_glSecondaryColor3fv: + mov ___blue_glCore_glSecondaryColor3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedFramebufferDrawBuffers -_bluegl_glNamedFramebufferDrawBuffers: - mov ___blue_glCore_glNamedFramebufferDrawBuffers@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3i +_bluegl_glSecondaryColor3i: + mov ___blue_glCore_glSecondaryColor3i@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexPointerListIBM -_bluegl_glVertexPointerListIBM: - mov ___blue_glCore_glVertexPointerListIBM@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3iv +_bluegl_glSecondaryColor3iv: + mov ___blue_glCore_glSecondaryColor3iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetUniformui64vNV -_bluegl_glGetUniformui64vNV: - mov ___blue_glCore_glGetUniformui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3s +_bluegl_glSecondaryColor3s: + mov ___blue_glCore_glSecondaryColor3s@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearDepthfOES -_bluegl_glClearDepthfOES: - mov ___blue_glCore_glClearDepthfOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3sv +_bluegl_glSecondaryColor3sv: + mov ___blue_glCore_glSecondaryColor3sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2iMESA -_bluegl_glWindowPos2iMESA: - mov ___blue_glCore_glWindowPos2iMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3ub +_bluegl_glSecondaryColor3ub: + mov ___blue_glCore_glSecondaryColor3ub@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyTextureImage1DEXT -_bluegl_glCopyTextureImage1DEXT: - mov ___blue_glCore_glCopyTextureImage1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3ubv +_bluegl_glSecondaryColor3ubv: + mov ___blue_glCore_glSecondaryColor3ubv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBeginOcclusionQueryNV -_bluegl_glBeginOcclusionQueryNV: - mov ___blue_glCore_glBeginOcclusionQueryNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3ui +_bluegl_glSecondaryColor3ui: + mov ___blue_glCore_glSecondaryColor3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLoadTransposeMatrixf -_bluegl_glLoadTransposeMatrixf: - mov ___blue_glCore_glLoadTransposeMatrixf@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3uiv +_bluegl_glSecondaryColor3uiv: + mov ___blue_glCore_glSecondaryColor3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedRenderbufferStorageMultisampleEXT -_bluegl_glNamedRenderbufferStorageMultisampleEXT: - mov ___blue_glCore_glNamedRenderbufferStorageMultisampleEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3us +_bluegl_glSecondaryColor3us: + mov ___blue_glCore_glSecondaryColor3us@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormalStream3fATI -_bluegl_glNormalStream3fATI: - mov ___blue_glCore_glNormalStream3fATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3usv +_bluegl_glSecondaryColor3usv: + mov ___blue_glCore_glSecondaryColor3usv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormal3hNV -_bluegl_glNormal3hNV: - mov ___blue_glCore_glNormal3hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColorPointer +_bluegl_glSecondaryColorPointer: + mov ___blue_glCore_glSecondaryColorPointer@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUseProgram -_bluegl_glUseProgram: - mov ___blue_glCore_glUseProgram@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2d +_bluegl_glWindowPos2d: + mov ___blue_glCore_glWindowPos2d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPushGroupMarkerEXT -_bluegl_glPushGroupMarkerEXT: - mov ___blue_glCore_glPushGroupMarkerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2dv +_bluegl_glWindowPos2dv: + mov ___blue_glCore_glWindowPos2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexSubImage2DEXT -_bluegl_glMultiTexSubImage2DEXT: - mov ___blue_glCore_glMultiTexSubImage2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2f +_bluegl_glWindowPos2f: + mov ___blue_glCore_glWindowPos2f@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayRangeNV -_bluegl_glVertexArrayRangeNV: - mov ___blue_glCore_glVertexArrayRangeNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2fv +_bluegl_glWindowPos2fv: + mov ___blue_glCore_glWindowPos2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMultiTexLevelParameterivEXT -_bluegl_glGetMultiTexLevelParameterivEXT: - mov ___blue_glCore_glGetMultiTexLevelParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2i +_bluegl_glWindowPos2i: + mov ___blue_glCore_glWindowPos2i@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiDrawArraysEXT -_bluegl_glMultiDrawArraysEXT: - mov ___blue_glCore_glMultiDrawArraysEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2iv +_bluegl_glWindowPos2iv: + mov ___blue_glCore_glWindowPos2iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL4ui64NV -_bluegl_glVertexAttribL4ui64NV: - mov ___blue_glCore_glVertexAttribL4ui64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2s +_bluegl_glWindowPos2s: + mov ___blue_glCore_glWindowPos2s@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4Nub -_bluegl_glVertexAttrib4Nub: - mov ___blue_glCore_glVertexAttrib4Nub@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2sv +_bluegl_glWindowPos2sv: + mov ___blue_glCore_glWindowPos2sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFogCoordhNV -_bluegl_glFogCoordhNV: - mov ___blue_glCore_glFogCoordhNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3d +_bluegl_glWindowPos3d: + mov ___blue_glCore_glWindowPos3d@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI3ui -_bluegl_glVertexAttribI3ui: - mov ___blue_glCore_glVertexAttribI3ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3dv +_bluegl_glWindowPos3dv: + mov ___blue_glCore_glWindowPos3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexImage3DMultisampleCoverageNV -_bluegl_glTexImage3DMultisampleCoverageNV: - mov ___blue_glCore_glTexImage3DMultisampleCoverageNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3f +_bluegl_glWindowPos3f: + mov ___blue_glCore_glWindowPos3f@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetUniformBufferSizeEXT -_bluegl_glGetUniformBufferSizeEXT: - mov ___blue_glCore_glGetUniformBufferSizeEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3fv +_bluegl_glWindowPos3fv: + mov ___blue_glCore_glWindowPos3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompileCommandListNV -_bluegl_glCompileCommandListNV: - mov ___blue_glCore_glCompileCommandListNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3i +_bluegl_glWindowPos3i: + mov ___blue_glCore_glWindowPos3i@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayVertexAttribBindingEXT -_bluegl_glVertexArrayVertexAttribBindingEXT: - mov ___blue_glCore_glVertexArrayVertexAttribBindingEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3iv +_bluegl_glWindowPos3iv: + mov ___blue_glCore_glWindowPos3iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendEquation -_bluegl_glBlendEquation: - mov ___blue_glCore_glBlendEquation@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3s +_bluegl_glWindowPos3s: + mov ___blue_glCore_glWindowPos3s@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBinormal3dvEXT -_bluegl_glBinormal3dvEXT: - mov ___blue_glCore_glBinormal3dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3sv +_bluegl_glWindowPos3sv: + mov ___blue_glCore_glWindowPos3sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexFormatNV -_bluegl_glVertexFormatNV: - mov ___blue_glCore_glVertexFormatNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexP2ui +_bluegl_glVertexP2ui: + mov ___blue_glCore_glVertexP2ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4fv -_bluegl_glProgramUniform4fv: - mov ___blue_glCore_glProgramUniform4fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexP2uiv +_bluegl_glVertexP2uiv: + mov ___blue_glCore_glVertexP2uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureStorage2DMultisample -_bluegl_glTextureStorage2DMultisample: - mov ___blue_glCore_glTextureStorage2DMultisample@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexP3ui +_bluegl_glVertexP3ui: + mov ___blue_glCore_glVertexP3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3uiEXT -_bluegl_glProgramUniform3uiEXT: - mov ___blue_glCore_glProgramUniform3uiEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexP3uiv +_bluegl_glVertexP3uiv: + mov ___blue_glCore_glVertexP3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferDrawBufferEXT -_bluegl_glFramebufferDrawBufferEXT: - mov ___blue_glCore_glFramebufferDrawBufferEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexP4ui +_bluegl_glVertexP4ui: + mov ___blue_glCore_glVertexP4ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreateTextures -_bluegl_glCreateTextures: - mov ___blue_glCore_glCreateTextures@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexP4uiv +_bluegl_glVertexP4uiv: + mov ___blue_glCore_glVertexP4uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixPopEXT -_bluegl_glMatrixPopEXT: - mov ___blue_glCore_glMatrixPopEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoordP1ui +_bluegl_glTexCoordP1ui: + mov ___blue_glCore_glTexCoordP1ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformui64vNV -_bluegl_glProgramUniformui64vNV: - mov ___blue_glCore_glProgramUniformui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoordP1uiv +_bluegl_glTexCoordP1uiv: + mov ___blue_glCore_glTexCoordP1uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferTexture2D -_bluegl_glFramebufferTexture2D: - mov ___blue_glCore_glFramebufferTexture2D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoordP2ui +_bluegl_glTexCoordP2ui: + mov ___blue_glCore_glTexCoordP2ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetAttribLocation -_bluegl_glGetAttribLocation: - mov ___blue_glCore_glGetAttribLocation@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoordP2uiv +_bluegl_glTexCoordP2uiv: + mov ___blue_glCore_glTexCoordP2uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2fARB -_bluegl_glUniform2fARB: - mov ___blue_glCore_glUniform2fARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoordP3ui +_bluegl_glTexCoordP3ui: + mov ___blue_glCore_glTexCoordP3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDisableVertexArrayAttribEXT -_bluegl_glDisableVertexArrayAttribEXT: - mov ___blue_glCore_glDisableVertexArrayAttribEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoordP3uiv +_bluegl_glTexCoordP3uiv: + mov ___blue_glCore_glTexCoordP3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexStorage2D -_bluegl_glTexStorage2D: - mov ___blue_glCore_glTexStorage2D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoordP4ui +_bluegl_glTexCoordP4ui: + mov ___blue_glCore_glTexCoordP4ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI1iEXT -_bluegl_glVertexAttribI1iEXT: - mov ___blue_glCore_glVertexAttribI1iEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoordP4uiv +_bluegl_glTexCoordP4uiv: + mov ___blue_glCore_glTexCoordP4uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4ui -_bluegl_glUniform4ui: - mov ___blue_glCore_glUniform4ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoordP1ui +_bluegl_glMultiTexCoordP1ui: + mov ___blue_glCore_glMultiTexCoordP1ui@GOTPCREL(%rip), %r11 jmp *(%r11) .private_extern _bluegl_glMultiTexCoordP1uiv @@ -3944,1744 +3973,1734 @@ _bluegl_glMultiTexCoordP1uiv: mov ___blue_glCore_glMultiTexCoordP1uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedProgramLocalParametersI4ivEXT -_bluegl_glNamedProgramLocalParametersI4ivEXT: - mov ___blue_glCore_glNamedProgramLocalParametersI4ivEXT@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.private_extern _bluegl_glImageTransformParameteriHP -_bluegl_glImageTransformParameteriHP: - mov ___blue_glCore_glImageTransformParameteriHP@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.private_extern _bluegl_glIsBuffer -_bluegl_glIsBuffer: - mov ___blue_glCore_glIsBuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoordP2ui +_bluegl_glMultiTexCoordP2ui: + mov ___blue_glCore_glMultiTexCoordP2ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFogCoorddv -_bluegl_glFogCoorddv: - mov ___blue_glCore_glFogCoorddv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoordP2uiv +_bluegl_glMultiTexCoordP2uiv: + mov ___blue_glCore_glMultiTexCoordP2uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClientActiveTexture -_bluegl_glClientActiveTexture: - mov ___blue_glCore_glClientActiveTexture@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoordP3ui +_bluegl_glMultiTexCoordP3ui: + mov ___blue_glCore_glMultiTexCoordP3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformHandleui64vNV -_bluegl_glUniformHandleui64vNV: - mov ___blue_glCore_glUniformHandleui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoordP3uiv +_bluegl_glMultiTexCoordP3uiv: + mov ___blue_glCore_glMultiTexCoordP3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3fARB -_bluegl_glWindowPos3fARB: - mov ___blue_glCore_glWindowPos3fARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoordP4ui +_bluegl_glMultiTexCoordP4ui: + mov ___blue_glCore_glMultiTexCoordP4ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribfvARB -_bluegl_glGetVertexAttribfvARB: - mov ___blue_glCore_glGetVertexAttribfvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoordP4uiv +_bluegl_glMultiTexCoordP4uiv: + mov ___blue_glCore_glMultiTexCoordP4uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSamplerParameterfv -_bluegl_glSamplerParameterfv: - mov ___blue_glCore_glSamplerParameterfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormalP3ui +_bluegl_glNormalP3ui: + mov ___blue_glCore_glNormalP3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4NsvARB -_bluegl_glVertexAttrib4NsvARB: - mov ___blue_glCore_glVertexAttrib4NsvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormalP3uiv +_bluegl_glNormalP3uiv: + mov ___blue_glCore_glNormalP3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2ivEXT -_bluegl_glProgramUniform2ivEXT: - mov ___blue_glCore_glProgramUniform2ivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorP3ui +_bluegl_glColorP3ui: + mov ___blue_glCore_glColorP3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedProgramStringEXT -_bluegl_glNamedProgramStringEXT: - mov ___blue_glCore_glNamedProgramStringEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorP3uiv +_bluegl_glColorP3uiv: + mov ___blue_glCore_glColorP3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPointSize -_bluegl_glPointSize: - mov ___blue_glCore_glPointSize@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorP4ui +_bluegl_glColorP4ui: + mov ___blue_glCore_glColorP4ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord4hNV -_bluegl_glTexCoord4hNV: - mov ___blue_glCore_glTexCoord4hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorP4uiv +_bluegl_glColorP4uiv: + mov ___blue_glCore_glColorP4uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetIntegerIndexedvEXT -_bluegl_glGetIntegerIndexedvEXT: - mov ___blue_glCore_glGetIntegerIndexedvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColorP3ui +_bluegl_glSecondaryColorP3ui: + mov ___blue_glCore_glSecondaryColorP3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPrimitiveBoundingBoxARB -_bluegl_glPrimitiveBoundingBoxARB: - mov ___blue_glCore_glPrimitiveBoundingBoxARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColorP3uiv +_bluegl_glSecondaryColorP3uiv: + mov ___blue_glCore_glSecondaryColorP3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDebugMessageInsert -_bluegl_glDebugMessageInsert: - mov ___blue_glCore_glDebugMessageInsert@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnMapdv +_bluegl_glGetnMapdv: + mov ___blue_glCore_glGetnMapdv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3bvOES -_bluegl_glMultiTexCoord3bvOES: - mov ___blue_glCore_glMultiTexCoord3bvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnMapfv +_bluegl_glGetnMapfv: + mov ___blue_glCore_glGetnMapfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL1i64vNV -_bluegl_glVertexAttribL1i64vNV: - mov ___blue_glCore_glVertexAttribL1i64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnMapiv +_bluegl_glGetnMapiv: + mov ___blue_glCore_glGetnMapiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureBuffer -_bluegl_glTextureBuffer: - mov ___blue_glCore_glTextureBuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnPixelMapfv +_bluegl_glGetnPixelMapfv: + mov ___blue_glCore_glGetnPixelMapfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureParameterIiv -_bluegl_glGetTextureParameterIiv: - mov ___blue_glCore_glGetTextureParameterIiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnPixelMapuiv +_bluegl_glGetnPixelMapuiv: + mov ___blue_glCore_glGetnPixelMapuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferTexture -_bluegl_glFramebufferTexture: - mov ___blue_glCore_glFramebufferTexture@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnPixelMapusv +_bluegl_glGetnPixelMapusv: + mov ___blue_glCore_glGetnPixelMapusv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramivARB -_bluegl_glGetProgramivARB: - mov ___blue_glCore_glGetProgramivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnPolygonStipple +_bluegl_glGetnPolygonStipple: + mov ___blue_glCore_glGetnPolygonStipple@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribPointerARB -_bluegl_glVertexAttribPointerARB: - mov ___blue_glCore_glVertexAttribPointerARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnColorTable +_bluegl_glGetnColorTable: + mov ___blue_glCore_glGetnColorTable@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsCommandListNV -_bluegl_glIsCommandListNV: - mov ___blue_glCore_glIsCommandListNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnConvolutionFilter +_bluegl_glGetnConvolutionFilter: + mov ___blue_glCore_glGetnConvolutionFilter@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1uivEXT -_bluegl_glUniform1uivEXT: - mov ___blue_glCore_glUniform1uivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnSeparableFilter +_bluegl_glGetnSeparableFilter: + mov ___blue_glCore_glGetnSeparableFilter@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2i -_bluegl_glProgramUniform2i: - mov ___blue_glCore_glProgramUniform2i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnHistogram +_bluegl_glGetnHistogram: + mov ___blue_glCore_glGetnHistogram@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribDivisorARB -_bluegl_glVertexAttribDivisorARB: - mov ___blue_glCore_glVertexAttribDivisorARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnMinmax +_bluegl_glGetnMinmax: + mov ___blue_glCore_glGetnMinmax@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribPointervARB -_bluegl_glGetVertexAttribPointervARB: - mov ___blue_glCore_glGetVertexAttribPointervARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPrimitiveBoundingBoxARB +_bluegl_glPrimitiveBoundingBoxARB: + mov ___blue_glCore_glPrimitiveBoundingBoxARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureImage2DMultisampleNV -_bluegl_glTextureImage2DMultisampleNV: - mov ___blue_glCore_glTextureImage2DMultisampleNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClampColorARB +_bluegl_glClampColorARB: + mov ___blue_glCore_glClampColorARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVariantPointervEXT -_bluegl_glGetVariantPointervEXT: - mov ___blue_glCore_glGetVariantPointervEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawBuffersARB +_bluegl_glDrawBuffersARB: + mov ___blue_glCore_glDrawBuffersARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCheckFramebufferStatus -_bluegl_glCheckFramebufferStatus: - mov ___blue_glCore_glCheckFramebufferStatus@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawArraysInstancedARB +_bluegl_glDrawArraysInstancedARB: + mov ___blue_glCore_glDrawArraysInstancedARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMap1xOES -_bluegl_glMap1xOES: - mov ___blue_glCore_glMap1xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawElementsInstancedARB +_bluegl_glDrawElementsInstancedARB: + mov ___blue_glCore_glDrawElementsInstancedARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindSampler -_bluegl_glBindSampler: - mov ___blue_glCore_glBindSampler@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramStringARB +_bluegl_glProgramStringARB: + mov ___blue_glCore_glProgramStringARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathGlyphIndexRangeNV -_bluegl_glPathGlyphIndexRangeNV: - mov ___blue_glCore_glPathGlyphIndexRangeNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindProgramARB +_bluegl_glBindProgramARB: + mov ___blue_glCore_glBindProgramARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramEnvParameters4fvEXT -_bluegl_glProgramEnvParameters4fvEXT: - mov ___blue_glCore_glProgramEnvParameters4fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteProgramsARB +_bluegl_glDeleteProgramsARB: + mov ___blue_glCore_glDeleteProgramsARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3fNV -_bluegl_glVertexAttrib3fNV: - mov ___blue_glCore_glVertexAttrib3fNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenProgramsARB +_bluegl_glGenProgramsARB: + mov ___blue_glCore_glGenProgramsARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindBuffersBase -_bluegl_glBindBuffersBase: - mov ___blue_glCore_glBindBuffersBase@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramEnvParameter4dARB +_bluegl_glProgramEnvParameter4dARB: + mov ___blue_glCore_glProgramEnvParameter4dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedProgramLocalParameterIivEXT -_bluegl_glGetNamedProgramLocalParameterIivEXT: - mov ___blue_glCore_glGetNamedProgramLocalParameterIivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramEnvParameter4dvARB +_bluegl_glProgramEnvParameter4dvARB: + mov ___blue_glCore_glProgramEnvParameter4dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4d -_bluegl_glProgramUniform4d: - mov ___blue_glCore_glProgramUniform4d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramEnvParameter4fARB +_bluegl_glProgramEnvParameter4fARB: + mov ___blue_glCore_glProgramEnvParameter4fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3f -_bluegl_glMultiTexCoord3f: - mov ___blue_glCore_glMultiTexCoord3f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramEnvParameter4fvARB +_bluegl_glProgramEnvParameter4fvARB: + mov ___blue_glCore_glProgramEnvParameter4fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteProgram -_bluegl_glDeleteProgram: - mov ___blue_glCore_glDeleteProgram@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramLocalParameter4dARB +_bluegl_glProgramLocalParameter4dARB: + mov ___blue_glCore_glProgramLocalParameter4dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeuiVertex3fvSUN -_bluegl_glReplacementCodeuiVertex3fvSUN: - mov ___blue_glCore_glReplacementCodeuiVertex3fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramLocalParameter4dvARB +_bluegl_glProgramLocalParameter4dvARB: + mov ___blue_glCore_glProgramLocalParameter4dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMapNamedBufferRange -_bluegl_glMapNamedBufferRange: - mov ___blue_glCore_glMapNamedBufferRange@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramLocalParameter4fARB +_bluegl_glProgramLocalParameter4fARB: + mov ___blue_glCore_glProgramLocalParameter4fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferSampleLocationsfvARB -_bluegl_glFramebufferSampleLocationsfvARB: - mov ___blue_glCore_glFramebufferSampleLocationsfvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramLocalParameter4fvARB +_bluegl_glProgramLocalParameter4fvARB: + mov ___blue_glCore_glProgramLocalParameter4fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1dvARB -_bluegl_glMultiTexCoord1dvARB: - mov ___blue_glCore_glMultiTexCoord1dvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramEnvParameterdvARB +_bluegl_glGetProgramEnvParameterdvARB: + mov ___blue_glCore_glGetProgramEnvParameterdvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearBufferuiv -_bluegl_glClearBufferuiv: - mov ___blue_glCore_glClearBufferuiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramEnvParameterfvARB +_bluegl_glGetProgramEnvParameterfvARB: + mov ___blue_glCore_glGetProgramEnvParameterfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawRangeElementsEXT -_bluegl_glDrawRangeElementsEXT: - mov ___blue_glCore_glDrawRangeElementsEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramLocalParameterdvARB +_bluegl_glGetProgramLocalParameterdvARB: + mov ___blue_glCore_glGetProgramLocalParameterdvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1hvNV -_bluegl_glVertexAttrib1hvNV: - mov ___blue_glCore_glVertexAttrib1hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramLocalParameterfvARB +_bluegl_glGetProgramLocalParameterfvARB: + mov ___blue_glCore_glGetProgramLocalParameterfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3bv -_bluegl_glSecondaryColor3bv: - mov ___blue_glCore_glSecondaryColor3bv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramivARB +_bluegl_glGetProgramivARB: + mov ___blue_glCore_glGetProgramivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVDPAUMapSurfacesNV -_bluegl_glVDPAUMapSurfacesNV: - mov ___blue_glCore_glVDPAUMapSurfacesNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramStringARB +_bluegl_glGetProgramStringARB: + mov ___blue_glCore_glGetProgramStringARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStencilMask -_bluegl_glStencilMask: - mov ___blue_glCore_glStencilMask@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsProgramARB +_bluegl_glIsProgramARB: + mov ___blue_glCore_glIsProgramARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramResourceLocationIndex -_bluegl_glGetProgramResourceLocationIndex: - mov ___blue_glCore_glGetProgramResourceLocationIndex@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramParameteriARB +_bluegl_glProgramParameteriARB: + mov ___blue_glCore_glProgramParameteriARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetIntegerui64i_vNV -_bluegl_glGetIntegerui64i_vNV: - mov ___blue_glCore_glGetIntegerui64i_vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferTextureARB +_bluegl_glFramebufferTextureARB: + mov ___blue_glCore_glFramebufferTextureARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureLevelParameterfvEXT -_bluegl_glGetTextureLevelParameterfvEXT: - mov ___blue_glCore_glGetTextureLevelParameterfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferTextureLayerARB +_bluegl_glFramebufferTextureLayerARB: + mov ___blue_glCore_glFramebufferTextureLayerARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3sv -_bluegl_glWindowPos3sv: - mov ___blue_glCore_glWindowPos3sv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferTextureFaceARB +_bluegl_glFramebufferTextureFaceARB: + mov ___blue_glCore_glFramebufferTextureFaceARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendEquationSeparatei -_bluegl_glBlendEquationSeparatei: - mov ___blue_glCore_glBlendEquationSeparatei@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1i64ARB +_bluegl_glUniform1i64ARB: + mov ___blue_glCore_glUniform1i64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetInfoLogARB -_bluegl_glGetInfoLogARB: - mov ___blue_glCore_glGetInfoLogARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2i64ARB +_bluegl_glUniform2i64ARB: + mov ___blue_glCore_glUniform2i64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramNamedParameter4fNV -_bluegl_glProgramNamedParameter4fNV: - mov ___blue_glCore_glProgramNamedParameter4fNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3i64ARB +_bluegl_glUniform3i64ARB: + mov ___blue_glCore_glUniform3i64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramParameter4fNV -_bluegl_glProgramParameter4fNV: - mov ___blue_glCore_glProgramParameter4fNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4i64ARB +_bluegl_glUniform4i64ARB: + mov ___blue_glCore_glUniform4i64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteTextures -_bluegl_glDeleteTextures: - mov ___blue_glCore_glDeleteTextures@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1i64vARB +_bluegl_glUniform1i64vARB: + mov ___blue_glCore_glUniform1i64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferDrawBuffersEXT -_bluegl_glFramebufferDrawBuffersEXT: - mov ___blue_glCore_glFramebufferDrawBuffersEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2i64vARB +_bluegl_glUniform2i64vARB: + mov ___blue_glCore_glUniform2i64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetObjectLabelEXT -_bluegl_glGetObjectLabelEXT: - mov ___blue_glCore_glGetObjectLabelEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3i64vARB +_bluegl_glUniform3i64vARB: + mov ___blue_glCore_glUniform3i64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3ivEXT -_bluegl_glProgramUniform3ivEXT: - mov ___blue_glCore_glProgramUniform3ivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4i64vARB +_bluegl_glUniform4i64vARB: + mov ___blue_glCore_glUniform4i64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureParameterIiv -_bluegl_glTextureParameterIiv: - mov ___blue_glCore_glTextureParameterIiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1ui64ARB +_bluegl_glUniform1ui64ARB: + mov ___blue_glCore_glUniform1ui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnUniformuiv -_bluegl_glGetnUniformuiv: - mov ___blue_glCore_glGetnUniformuiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2ui64ARB +_bluegl_glUniform2ui64ARB: + mov ___blue_glCore_glUniform2ui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMapObjectBufferATI -_bluegl_glMapObjectBufferATI: - mov ___blue_glCore_glMapObjectBufferATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3ui64ARB +_bluegl_glUniform3ui64ARB: + mov ___blue_glCore_glUniform3ui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTangent3dvEXT -_bluegl_glTangent3dvEXT: - mov ___blue_glCore_glTangent3dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4ui64ARB +_bluegl_glUniform4ui64ARB: + mov ___blue_glCore_glUniform4ui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramParameter4dNV -_bluegl_glProgramParameter4dNV: - mov ___blue_glCore_glProgramParameter4dNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1ui64vARB +_bluegl_glUniform1ui64vARB: + mov ___blue_glCore_glUniform1ui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenVertexArraysAPPLE -_bluegl_glGenVertexArraysAPPLE: - mov ___blue_glCore_glGenVertexArraysAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2ui64vARB +_bluegl_glUniform2ui64vARB: + mov ___blue_glCore_glUniform2ui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4bvARB -_bluegl_glVertexAttrib4bvARB: - mov ___blue_glCore_glVertexAttrib4bvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3ui64vARB +_bluegl_glUniform3ui64vARB: + mov ___blue_glCore_glUniform3ui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream1dATI -_bluegl_glVertexStream1dATI: - mov ___blue_glCore_glVertexStream1dATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4ui64vARB +_bluegl_glUniform4ui64vARB: + mov ___blue_glCore_glUniform4ui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2svARB -_bluegl_glMultiTexCoord2svARB: - mov ___blue_glCore_glMultiTexCoord2svARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetUniformi64vARB +_bluegl_glGetUniformi64vARB: + mov ___blue_glCore_glGetUniformi64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearNamedBufferSubDataEXT -_bluegl_glClearNamedBufferSubDataEXT: - mov ___blue_glCore_glClearNamedBufferSubDataEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetUniformui64vARB +_bluegl_glGetUniformui64vARB: + mov ___blue_glCore_glGetUniformui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTextureSubImage3D -_bluegl_glCompressedTextureSubImage3D: - mov ___blue_glCore_glCompressedTextureSubImage3D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnUniformi64vARB +_bluegl_glGetnUniformi64vARB: + mov ___blue_glCore_glGetnUniformi64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI4iEXT -_bluegl_glVertexAttribI4iEXT: - mov ___blue_glCore_glVertexAttribI4iEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnUniformui64vARB +_bluegl_glGetnUniformui64vARB: + mov ___blue_glCore_glGetnUniformui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnPixelMapfvARB -_bluegl_glGetnPixelMapfvARB: - mov ___blue_glCore_glGetnPixelMapfvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1i64ARB +_bluegl_glProgramUniform1i64ARB: + mov ___blue_glCore_glProgramUniform1i64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream4iATI -_bluegl_glVertexStream4iATI: - mov ___blue_glCore_glVertexStream4iATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2i64ARB +_bluegl_glProgramUniform2i64ARB: + mov ___blue_glCore_glProgramUniform2i64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixMultTransposedEXT -_bluegl_glMatrixMultTransposedEXT: - mov ___blue_glCore_glMatrixMultTransposedEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3i64ARB +_bluegl_glProgramUniform3i64ARB: + mov ___blue_glCore_glProgramUniform3i64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDisableVariantClientStateEXT -_bluegl_glDisableVariantClientStateEXT: - mov ___blue_glCore_glDisableVariantClientStateEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4i64ARB +_bluegl_glProgramUniform4i64ARB: + mov ___blue_glCore_glProgramUniform4i64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPrimitiveRestartNV -_bluegl_glPrimitiveRestartNV: - mov ___blue_glCore_glPrimitiveRestartNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1i64vARB +_bluegl_glProgramUniform1i64vARB: + mov ___blue_glCore_glProgramUniform1i64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribP4uiv -_bluegl_glVertexAttribP4uiv: - mov ___blue_glCore_glVertexAttribP4uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2i64vARB +_bluegl_glProgramUniform2i64vARB: + mov ___blue_glCore_glProgramUniform2i64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix2fv -_bluegl_glProgramUniformMatrix2fv: - mov ___blue_glCore_glProgramUniformMatrix2fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3i64vARB +_bluegl_glProgramUniform3i64vARB: + mov ___blue_glCore_glProgramUniform3i64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPolygonOffsetEXT -_bluegl_glPolygonOffsetEXT: - mov ___blue_glCore_glPolygonOffsetEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4i64vARB +_bluegl_glProgramUniform4i64vARB: + mov ___blue_glCore_glProgramUniform4i64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glUseProgramObjectARB -_bluegl_glUseProgramObjectARB: - mov ___blue_glCore_glUseProgramObjectARB@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glProgramUniform1ui64ARB +_bluegl_glProgramUniform1ui64ARB: + mov ___blue_glCore_glProgramUniform1ui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixLoadfEXT -_bluegl_glMatrixLoadfEXT: - mov ___blue_glCore_glMatrixLoadfEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2ui64ARB +_bluegl_glProgramUniform2ui64ARB: + mov ___blue_glCore_glProgramUniform2ui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureSubImage1D -_bluegl_glTextureSubImage1D: - mov ___blue_glCore_glTextureSubImage1D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3ui64ARB +_bluegl_glProgramUniform3ui64ARB: + mov ___blue_glCore_glProgramUniform3ui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glHistogramEXT -_bluegl_glHistogramEXT: - mov ___blue_glCore_glHistogramEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4ui64ARB +_bluegl_glProgramUniform4ui64ARB: + mov ___blue_glCore_glProgramUniform4ui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1ivEXT -_bluegl_glProgramUniform1ivEXT: - mov ___blue_glCore_glProgramUniform1ivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1ui64vARB +_bluegl_glProgramUniform1ui64vARB: + mov ___blue_glCore_glProgramUniform1ui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetBufferParameterivARB -_bluegl_glGetBufferParameterivARB: - mov ___blue_glCore_glGetBufferParameterivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2ui64vARB +_bluegl_glProgramUniform2ui64vARB: + mov ___blue_glCore_glProgramUniform2ui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStringMarkerGREMEDY -_bluegl_glStringMarkerGREMEDY: - mov ___blue_glCore_glStringMarkerGREMEDY@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3ui64vARB +_bluegl_glProgramUniform3ui64vARB: + mov ___blue_glCore_glProgramUniform3ui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnMapfv -_bluegl_glGetnMapfv: - mov ___blue_glCore_glGetnMapfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4ui64vARB +_bluegl_glProgramUniform4ui64vARB: + mov ___blue_glCore_glProgramUniform4ui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3dvARB -_bluegl_glMultiTexCoord3dvARB: - mov ___blue_glCore_glMultiTexCoord3dvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorTable +_bluegl_glColorTable: + mov ___blue_glCore_glColorTable@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFinishTextureSUNX -_bluegl_glFinishTextureSUNX: - mov ___blue_glCore_glFinishTextureSUNX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorTableParameterfv +_bluegl_glColorTableParameterfv: + mov ___blue_glCore_glColorTableParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3dARB -_bluegl_glWindowPos3dARB: - mov ___blue_glCore_glWindowPos3dARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorTableParameteriv +_bluegl_glColorTableParameteriv: + mov ___blue_glCore_glColorTableParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedBufferStorageEXT -_bluegl_glNamedBufferStorageEXT: - mov ___blue_glCore_glNamedBufferStorageEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyColorTable +_bluegl_glCopyColorTable: + mov ___blue_glCore_glCopyColorTable@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIndexPointerListIBM -_bluegl_glIndexPointerListIBM: - mov ___blue_glCore_glIndexPointerListIBM@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetColorTable +_bluegl_glGetColorTable: + mov ___blue_glCore_glGetColorTable@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColor3fVertex3fSUN -_bluegl_glColor3fVertex3fSUN: - mov ___blue_glCore_glColor3fVertex3fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetColorTableParameterfv +_bluegl_glGetColorTableParameterfv: + mov ___blue_glCore_glGetColorTableParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDepthRangefOES -_bluegl_glDepthRangefOES: - mov ___blue_glCore_glDepthRangefOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetColorTableParameteriv +_bluegl_glGetColorTableParameteriv: + mov ___blue_glCore_glGetColorTableParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexBlendEnvfATI -_bluegl_glVertexBlendEnvfATI: - mov ___blue_glCore_glVertexBlendEnvfATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorSubTable +_bluegl_glColorSubTable: + mov ___blue_glCore_glColorSubTable@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1hvNV -_bluegl_glMultiTexCoord1hvNV: - mov ___blue_glCore_glMultiTexCoord1hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyColorSubTable +_bluegl_glCopyColorSubTable: + mov ___blue_glCore_glCopyColorSubTable@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPixelTexGenParameterfvSGIS -_bluegl_glGetPixelTexGenParameterfvSGIS: - mov ___blue_glCore_glGetPixelTexGenParameterfvSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glConvolutionFilter1D +_bluegl_glConvolutionFilter1D: + mov ___blue_glCore_glConvolutionFilter1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDisableClientStateIndexedEXT -_bluegl_glDisableClientStateIndexedEXT: - mov ___blue_glCore_glDisableClientStateIndexedEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glConvolutionFilter2D +_bluegl_glConvolutionFilter2D: + mov ___blue_glCore_glConvolutionFilter2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1ui64NV -_bluegl_glProgramUniform1ui64NV: - mov ___blue_glCore_glProgramUniform1ui64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glConvolutionParameterf +_bluegl_glConvolutionParameterf: + mov ___blue_glCore_glConvolutionParameterf@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1dv -_bluegl_glMultiTexCoord1dv: - mov ___blue_glCore_glMultiTexCoord1dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glConvolutionParameterfv +_bluegl_glConvolutionParameterfv: + mov ___blue_glCore_glConvolutionParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1ivARB -_bluegl_glMultiTexCoord1ivARB: - mov ___blue_glCore_glMultiTexCoord1ivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glConvolutionParameteri +_bluegl_glConvolutionParameteri: + mov ___blue_glCore_glConvolutionParameteri@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMapVertexAttrib1dAPPLE -_bluegl_glMapVertexAttrib1dAPPLE: - mov ___blue_glCore_glMapVertexAttrib1dAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glConvolutionParameteriv +_bluegl_glConvolutionParameteriv: + mov ___blue_glCore_glConvolutionParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPerfQueryIdByNameINTEL -_bluegl_glGetPerfQueryIdByNameINTEL: - mov ___blue_glCore_glGetPerfQueryIdByNameINTEL@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyConvolutionFilter1D +_bluegl_glCopyConvolutionFilter1D: + mov ___blue_glCore_glCopyConvolutionFilter1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2ui64vNV -_bluegl_glUniform2ui64vNV: - mov ___blue_glCore_glUniform2ui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyConvolutionFilter2D +_bluegl_glCopyConvolutionFilter2D: + mov ___blue_glCore_glCopyConvolutionFilter2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetSharpenTexFuncSGIS -_bluegl_glGetSharpenTexFuncSGIS: - mov ___blue_glCore_glGetSharpenTexFuncSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetConvolutionFilter +_bluegl_glGetConvolutionFilter: + mov ___blue_glCore_glGetConvolutionFilter@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindImageTexture -_bluegl_glBindImageTexture: - mov ___blue_glCore_glBindImageTexture@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetConvolutionParameterfv +_bluegl_glGetConvolutionParameterfv: + mov ___blue_glCore_glGetConvolutionParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramEnvParameter4dvARB -_bluegl_glProgramEnvParameter4dvARB: - mov ___blue_glCore_glProgramEnvParameter4dvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetConvolutionParameteriv +_bluegl_glGetConvolutionParameteriv: + mov ___blue_glCore_glGetConvolutionParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteFramebuffers -_bluegl_glDeleteFramebuffers: - mov ___blue_glCore_glDeleteFramebuffers@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetSeparableFilter +_bluegl_glGetSeparableFilter: + mov ___blue_glCore_glGetSeparableFilter@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayVertexOffsetEXT -_bluegl_glVertexArrayVertexOffsetEXT: - mov ___blue_glCore_glVertexArrayVertexOffsetEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSeparableFilter2D +_bluegl_glSeparableFilter2D: + mov ___blue_glCore_glSeparableFilter2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramLocalParameters4fvEXT -_bluegl_glProgramLocalParameters4fvEXT: - mov ___blue_glCore_glProgramLocalParameters4fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetHistogram +_bluegl_glGetHistogram: + mov ___blue_glCore_glGetHistogram@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFogCoordFormatNV -_bluegl_glFogCoordFormatNV: - mov ___blue_glCore_glFogCoordFormatNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetHistogramParameterfv +_bluegl_glGetHistogramParameterfv: + mov ___blue_glCore_glGetHistogramParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenQueries -_bluegl_glGenQueries: - mov ___blue_glCore_glGenQueries@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetHistogramParameteriv +_bluegl_glGetHistogramParameteriv: + mov ___blue_glCore_glGetHistogramParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL4dEXT -_bluegl_glVertexAttribL4dEXT: - mov ___blue_glCore_glVertexAttribL4dEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMinmax +_bluegl_glGetMinmax: + mov ___blue_glCore_glGetMinmax@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4fvARB -_bluegl_glMultiTexCoord4fvARB: - mov ___blue_glCore_glMultiTexCoord4fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMinmaxParameterfv +_bluegl_glGetMinmaxParameterfv: + mov ___blue_glCore_glGetMinmaxParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPixelZoomxOES -_bluegl_glPixelZoomxOES: - mov ___blue_glCore_glPixelZoomxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMinmaxParameteriv +_bluegl_glGetMinmaxParameteriv: + mov ___blue_glCore_glGetMinmaxParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyTexSubImage3D -_bluegl_glCopyTexSubImage3D: - mov ___blue_glCore_glCopyTexSubImage3D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glHistogram +_bluegl_glHistogram: + mov ___blue_glCore_glHistogram@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1ui64vARB -_bluegl_glUniform1ui64vARB: - mov ___blue_glCore_glUniform1ui64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMinmax +_bluegl_glMinmax: + mov ___blue_glCore_glMinmax@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMapControlPointsNV -_bluegl_glGetMapControlPointsNV: - mov ___blue_glCore_glGetMapControlPointsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glResetHistogram +_bluegl_glResetHistogram: + mov ___blue_glCore_glResetHistogram@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLightEnviSGIX -_bluegl_glLightEnviSGIX: - mov ___blue_glCore_glLightEnviSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glResetMinmax +_bluegl_glResetMinmax: + mov ___blue_glCore_glResetMinmax@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4Nbv -_bluegl_glVertexAttrib4Nbv: - mov ___blue_glCore_glVertexAttrib4Nbv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribDivisorARB +_bluegl_glVertexAttribDivisorARB: + mov ___blue_glCore_glVertexAttribDivisorARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawBuffer -_bluegl_glDrawBuffer: - mov ___blue_glCore_glDrawBuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCurrentPaletteMatrixARB +_bluegl_glCurrentPaletteMatrixARB: + mov ___blue_glCore_glCurrentPaletteMatrixARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawTransformFeedbackStream -_bluegl_glDrawTransformFeedbackStream: - mov ___blue_glCore_glDrawTransformFeedbackStream@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixIndexubvARB +_bluegl_glMatrixIndexubvARB: + mov ___blue_glCore_glMatrixIndexubvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDisableClientStateiEXT -_bluegl_glDisableClientStateiEXT: - mov ___blue_glCore_glDisableClientStateiEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixIndexusvARB +_bluegl_glMatrixIndexusvARB: + mov ___blue_glCore_glMatrixIndexusvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferTexture3D -_bluegl_glFramebufferTexture3D: - mov ___blue_glCore_glFramebufferTexture3D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixIndexuivARB +_bluegl_glMatrixIndexuivARB: + mov ___blue_glCore_glMatrixIndexuivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureColorMaskSGIS -_bluegl_glTextureColorMaskSGIS: - mov ___blue_glCore_glTextureColorMaskSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixIndexPointerARB +_bluegl_glMatrixIndexPointerARB: + mov ___blue_glCore_glMatrixIndexPointerARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCullFace -_bluegl_glCullFace: - mov ___blue_glCore_glCullFace@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSampleCoverageARB +_bluegl_glSampleCoverageARB: + mov ___blue_glCore_glSampleCoverageARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedBufferSubData -_bluegl_glGetNamedBufferSubData: - mov ___blue_glCore_glGetNamedBufferSubData@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glActiveTextureARB +_bluegl_glActiveTextureARB: + mov ___blue_glCore_glActiveTextureARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDispatchCompute -_bluegl_glDispatchCompute: - mov ___blue_glCore_glDispatchCompute@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClientActiveTextureARB +_bluegl_glClientActiveTextureARB: + mov ___blue_glCore_glClientActiveTextureARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glInvalidateFramebuffer -_bluegl_glInvalidateFramebuffer: - mov ___blue_glCore_glInvalidateFramebuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1dARB +_bluegl_glMultiTexCoord1dARB: + mov ___blue_glCore_glMultiTexCoord1dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDebugMessageControl -_bluegl_glDebugMessageControl: - mov ___blue_glCore_glDebugMessageControl@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1dvARB +_bluegl_glMultiTexCoord1dvARB: + mov ___blue_glCore_glMultiTexCoord1dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix3dv -_bluegl_glProgramUniformMatrix3dv: - mov ___blue_glCore_glProgramUniformMatrix3dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1fARB +_bluegl_glMultiTexCoord1fARB: + mov ___blue_glCore_glMultiTexCoord1fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3ui -_bluegl_glSecondaryColor3ui: - mov ___blue_glCore_glSecondaryColor3ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1fvARB +_bluegl_glMultiTexCoord1fvARB: + mov ___blue_glCore_glMultiTexCoord1fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glShaderStorageBlockBinding -_bluegl_glShaderStorageBlockBinding: - mov ___blue_glCore_glShaderStorageBlockBinding@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1iARB +_bluegl_glMultiTexCoord1iARB: + mov ___blue_glCore_glMultiTexCoord1iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix3fvARB -_bluegl_glUniformMatrix3fvARB: - mov ___blue_glCore_glUniformMatrix3fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1ivARB +_bluegl_glMultiTexCoord1ivARB: + mov ___blue_glCore_glMultiTexCoord1ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetUniformOffsetEXT -_bluegl_glGetUniformOffsetEXT: - mov ___blue_glCore_glGetUniformOffsetEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1sARB +_bluegl_glMultiTexCoord1sARB: + mov ___blue_glCore_glMultiTexCoord1sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBinormal3fvEXT -_bluegl_glBinormal3fvEXT: - mov ___blue_glCore_glBinormal3fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1svARB +_bluegl_glMultiTexCoord1svARB: + mov ___blue_glCore_glMultiTexCoord1svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoordPointerEXT -_bluegl_glMultiTexCoordPointerEXT: - mov ___blue_glCore_glMultiTexCoordPointerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2dARB +_bluegl_glMultiTexCoord2dARB: + mov ___blue_glCore_glMultiTexCoord2dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4sv -_bluegl_glVertexAttrib4sv: - mov ___blue_glCore_glVertexAttrib4sv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2dvARB +_bluegl_glMultiTexCoord2dvARB: + mov ___blue_glCore_glMultiTexCoord2dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixIndexubvARB -_bluegl_glMatrixIndexubvARB: - mov ___blue_glCore_glMatrixIndexubvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2fARB +_bluegl_glMultiTexCoord2fARB: + mov ___blue_glCore_glMultiTexCoord2fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4ivEXT -_bluegl_glProgramUniform4ivEXT: - mov ___blue_glCore_glProgramUniform4ivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2fvARB +_bluegl_glMultiTexCoord2fvARB: + mov ___blue_glCore_glMultiTexCoord2fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos4dMESA -_bluegl_glWindowPos4dMESA: - mov ___blue_glCore_glWindowPos4dMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2iARB +_bluegl_glMultiTexCoord2iARB: + mov ___blue_glCore_glMultiTexCoord2iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiDrawElementsIndirectCountARB -_bluegl_glMultiDrawElementsIndirectCountARB: - mov ___blue_glCore_glMultiDrawElementsIndirectCountARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2ivARB +_bluegl_glMultiTexCoord2ivARB: + mov ___blue_glCore_glMultiTexCoord2ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix4fvARB -_bluegl_glUniformMatrix4fvARB: - mov ___blue_glCore_glUniformMatrix4fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2sARB +_bluegl_glMultiTexCoord2sARB: + mov ___blue_glCore_glMultiTexCoord2sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindImageTextureEXT -_bluegl_glBindImageTextureEXT: - mov ___blue_glCore_glBindImageTextureEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2svARB +_bluegl_glMultiTexCoord2svARB: + mov ___blue_glCore_glMultiTexCoord2svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glResolveDepthValuesNV -_bluegl_glResolveDepthValuesNV: - mov ___blue_glCore_glResolveDepthValuesNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3dARB +_bluegl_glMultiTexCoord3dARB: + mov ___blue_glCore_glMultiTexCoord3dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColor3fVertex3fvSUN -_bluegl_glColor3fVertex3fvSUN: - mov ___blue_glCore_glColor3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3dvARB +_bluegl_glMultiTexCoord3dvARB: + mov ___blue_glCore_glMultiTexCoord3dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTexImage1D -_bluegl_glCompressedTexImage1D: - mov ___blue_glCore_glCompressedTexImage1D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3fARB +_bluegl_glMultiTexCoord3fARB: + mov ___blue_glCore_glMultiTexCoord3fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnUniformdvARB -_bluegl_glGetnUniformdvARB: - mov ___blue_glCore_glGetnUniformdvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3fvARB +_bluegl_glMultiTexCoord3fvARB: + mov ___blue_glCore_glMultiTexCoord3fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1ui64vNV -_bluegl_glUniform1ui64vNV: - mov ___blue_glCore_glUniform1ui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3iARB +_bluegl_glMultiTexCoord3iARB: + mov ___blue_glCore_glMultiTexCoord3iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramEnvParameterI4uiNV -_bluegl_glProgramEnvParameterI4uiNV: - mov ___blue_glCore_glProgramEnvParameterI4uiNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3ivARB +_bluegl_glMultiTexCoord3ivARB: + mov ___blue_glCore_glMultiTexCoord3ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4ubNV -_bluegl_glVertexAttrib4ubNV: - mov ___blue_glCore_glVertexAttrib4ubNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3sARB +_bluegl_glMultiTexCoord3sARB: + mov ___blue_glCore_glMultiTexCoord3sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenAsyncMarkersSGIX -_bluegl_glGenAsyncMarkersSGIX: - mov ___blue_glCore_glGenAsyncMarkersSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3svARB +_bluegl_glMultiTexCoord3svARB: + mov ___blue_glCore_glMultiTexCoord3svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexBindingDivisor -_bluegl_glVertexBindingDivisor: - mov ___blue_glCore_glVertexBindingDivisor@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4dARB +_bluegl_glMultiTexCoord4dARB: + mov ___blue_glCore_glMultiTexCoord4dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreateShaderProgramv -_bluegl_glCreateShaderProgramv: - mov ___blue_glCore_glCreateShaderProgramv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4dvARB +_bluegl_glMultiTexCoord4dvARB: + mov ___blue_glCore_glMultiTexCoord4dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindBufferARB -_bluegl_glBindBufferARB: - mov ___blue_glCore_glBindBufferARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4fARB +_bluegl_glMultiTexCoord4fARB: + mov ___blue_glCore_glMultiTexCoord4fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColor4ubVertex2fvSUN -_bluegl_glColor4ubVertex2fvSUN: - mov ___blue_glCore_glColor4ubVertex2fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4fvARB +_bluegl_glMultiTexCoord4fvARB: + mov ___blue_glCore_glMultiTexCoord4fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glResetHistogram -_bluegl_glResetHistogram: - mov ___blue_glCore_glResetHistogram@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4iARB +_bluegl_glMultiTexCoord4iARB: + mov ___blue_glCore_glMultiTexCoord4iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramResourceLocation -_bluegl_glGetProgramResourceLocation: - mov ___blue_glCore_glGetProgramResourceLocation@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4ivARB +_bluegl_glMultiTexCoord4ivARB: + mov ___blue_glCore_glMultiTexCoord4ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendFuncSeparateiARB -_bluegl_glBlendFuncSeparateiARB: - mov ___blue_glCore_glBlendFuncSeparateiARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4sARB +_bluegl_glMultiTexCoord4sARB: + mov ___blue_glCore_glMultiTexCoord4sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBinormalPointerEXT -_bluegl_glBinormalPointerEXT: - mov ___blue_glCore_glBinormalPointerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4svARB +_bluegl_glMultiTexCoord4svARB: + mov ___blue_glCore_glMultiTexCoord4svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2svNV -_bluegl_glVertexAttrib2svNV: - mov ___blue_glCore_glVertexAttrib2svNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenQueriesARB +_bluegl_glGenQueriesARB: + mov ___blue_glCore_glGenQueriesARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2i64vNV -_bluegl_glProgramUniform2i64vNV: - mov ___blue_glCore_glProgramUniform2i64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteQueriesARB +_bluegl_glDeleteQueriesARB: + mov ___blue_glCore_glDeleteQueriesARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureNormalEXT -_bluegl_glTextureNormalEXT: - mov ___blue_glCore_glTextureNormalEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsQueryARB +_bluegl_glIsQueryARB: + mov ___blue_glCore_glIsQueryARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFlushMappedBufferRangeAPPLE -_bluegl_glFlushMappedBufferRangeAPPLE: - mov ___blue_glCore_glFlushMappedBufferRangeAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBeginQueryARB +_bluegl_glBeginQueryARB: + mov ___blue_glCore_glBeginQueryARB@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glSecondaryColor3dv -_bluegl_glSecondaryColor3dv: - mov ___blue_glCore_glSecondaryColor3dv@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glEndQueryARB +_bluegl_glEndQueryARB: + mov ___blue_glCore_glEndQueryARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorP3uiv -_bluegl_glColorP3uiv: - mov ___blue_glCore_glColorP3uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetQueryivARB +_bluegl_glGetQueryivARB: + mov ___blue_glCore_glGetQueryivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix4x2dv -_bluegl_glUniformMatrix4x2dv: - mov ___blue_glCore_glUniformMatrix4x2dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetQueryObjectivARB +_bluegl_glGetQueryObjectivARB: + mov ___blue_glCore_glGetQueryObjectivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoordP3ui -_bluegl_glTexCoordP3ui: - mov ___blue_glCore_glTexCoordP3ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetQueryObjectuivARB +_bluegl_glGetQueryObjectuivARB: + mov ___blue_glCore_glGetQueryObjectuivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedBufferSubDataEXT -_bluegl_glNamedBufferSubDataEXT: - mov ___blue_glCore_glNamedBufferSubDataEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMaxShaderCompilerThreadsARB +_bluegl_glMaxShaderCompilerThreadsARB: + mov ___blue_glCore_glMaxShaderCompilerThreadsARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProvokingVertexEXT -_bluegl_glProvokingVertexEXT: - mov ___blue_glCore_glProvokingVertexEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPointParameterfARB +_bluegl_glPointParameterfARB: + mov ___blue_glCore_glPointParameterfARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWeightbvARB -_bluegl_glWeightbvARB: - mov ___blue_glCore_glWeightbvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPointParameterfvARB +_bluegl_glPointParameterfvARB: + mov ___blue_glCore_glPointParameterfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glInvalidateNamedFramebufferData -_bluegl_glInvalidateNamedFramebufferData: - mov ___blue_glCore_glInvalidateNamedFramebufferData@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnMapdvARB +_bluegl_glGetnMapdvARB: + mov ___blue_glCore_glGetnMapdvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetArrayObjectfvATI -_bluegl_glGetArrayObjectfvATI: - mov ___blue_glCore_glGetArrayObjectfvATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnMapfvARB +_bluegl_glGetnMapfvARB: + mov ___blue_glCore_glGetnMapfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsSampler -_bluegl_glIsSampler: - mov ___blue_glCore_glIsSampler@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnMapivARB +_bluegl_glGetnMapivARB: + mov ___blue_glCore_glGetnMapivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormalStream3dvATI -_bluegl_glNormalStream3dvATI: - mov ___blue_glCore_glNormalStream3dvATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnPixelMapfvARB +_bluegl_glGetnPixelMapfvARB: + mov ___blue_glCore_glGetnPixelMapfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL4i64vNV -_bluegl_glVertexAttribL4i64vNV: - mov ___blue_glCore_glVertexAttribL4i64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnPixelMapuivARB +_bluegl_glGetnPixelMapuivARB: + mov ___blue_glCore_glGetnPixelMapuivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glValidateProgramARB -_bluegl_glValidateProgramARB: - mov ___blue_glCore_glValidateProgramARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnPixelMapusvARB +_bluegl_glGetnPixelMapusvARB: + mov ___blue_glCore_glGetnPixelMapusvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3ui -_bluegl_glUniform3ui: - mov ___blue_glCore_glUniform3ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnPolygonStippleARB +_bluegl_glGetnPolygonStippleARB: + mov ___blue_glCore_glGetnPolygonStippleARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTransformFeedbackVaryingsNV -_bluegl_glTransformFeedbackVaryingsNV: - mov ___blue_glCore_glTransformFeedbackVaryingsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnColorTableARB +_bluegl_glGetnColorTableARB: + mov ___blue_glCore_glGetnColorTableARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetSeparableFilter -_bluegl_glGetSeparableFilter: - mov ___blue_glCore_glGetSeparableFilter@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnConvolutionFilterARB +_bluegl_glGetnConvolutionFilterARB: + mov ___blue_glCore_glGetnConvolutionFilterARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetCompressedTexImageARB -_bluegl_glGetCompressedTexImageARB: - mov ___blue_glCore_glGetCompressedTexImageARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnSeparableFilterARB +_bluegl_glGetnSeparableFilterARB: + mov ___blue_glCore_glGetnSeparableFilterARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramNamedParameter4fvNV -_bluegl_glProgramNamedParameter4fvNV: - mov ___blue_glCore_glProgramNamedParameter4fvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnHistogramARB +_bluegl_glGetnHistogramARB: + mov ___blue_glCore_glGetnHistogramARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureBarrierNV -_bluegl_glTextureBarrierNV: - mov ___blue_glCore_glTextureBarrierNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetnMinmaxARB +_bluegl_glGetnMinmaxARB: + mov ___blue_glCore_glGetnMinmaxARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glRasterSamplesEXT -_bluegl_glRasterSamplesEXT: - mov ___blue_glCore_glRasterSamplesEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferSampleLocationsfvARB +_bluegl_glFramebufferSampleLocationsfvARB: + mov ___blue_glCore_glFramebufferSampleLocationsfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3dEXT -_bluegl_glSecondaryColor3dEXT: - mov ___blue_glCore_glSecondaryColor3dEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedFramebufferSampleLocationsfvARB +_bluegl_glNamedFramebufferSampleLocationsfvARB: + mov ___blue_glCore_glNamedFramebufferSampleLocationsfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1svNV -_bluegl_glVertexAttrib1svNV: - mov ___blue_glCore_glVertexAttrib1svNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEvaluateDepthValuesARB +_bluegl_glEvaluateDepthValuesARB: + mov ___blue_glCore_glEvaluateDepthValuesARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexImage3D -_bluegl_glTexImage3D: - mov ___blue_glCore_glTexImage3D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteObjectARB +_bluegl_glDeleteObjectARB: + mov ___blue_glCore_glDeleteObjectARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1i64ARB -_bluegl_glUniform1i64ARB: - mov ___blue_glCore_glUniform1i64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetHandleARB +_bluegl_glGetHandleARB: + mov ___blue_glCore_glGetHandleARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4Nuiv -_bluegl_glVertexAttrib4Nuiv: - mov ___blue_glCore_glVertexAttrib4Nuiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDetachObjectARB +_bluegl_glDetachObjectARB: + mov ___blue_glCore_glDetachObjectARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramivNV -_bluegl_glGetProgramivNV: - mov ___blue_glCore_glGetProgramivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreateShaderObjectARB +_bluegl_glCreateShaderObjectARB: + mov ___blue_glCore_glCreateShaderObjectARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTexGenxvOES -_bluegl_glGetTexGenxvOES: - mov ___blue_glCore_glGetTexGenxvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glShaderSourceARB +_bluegl_glShaderSourceARB: + mov ___blue_glCore_glShaderSourceARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexP4uiv -_bluegl_glVertexP4uiv: - mov ___blue_glCore_glVertexP4uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompileShaderARB +_bluegl_glCompileShaderARB: + mov ___blue_glCore_glCompileShaderARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMapGrid1xOES -_bluegl_glMapGrid1xOES: - mov ___blue_glCore_glMapGrid1xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreateProgramObjectARB +_bluegl_glCreateProgramObjectARB: + mov ___blue_glCore_glCreateProgramObjectARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix2dv -_bluegl_glProgramUniformMatrix2dv: - mov ___blue_glCore_glProgramUniformMatrix2dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glAttachObjectARB +_bluegl_glAttachObjectARB: + mov ___blue_glCore_glAttachObjectARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorMaski -_bluegl_glColorMaski: - mov ___blue_glCore_glColorMaski@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLinkProgramARB +_bluegl_glLinkProgramARB: + mov ___blue_glCore_glLinkProgramARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEdgeFlagPointerListIBM -_bluegl_glEdgeFlagPointerListIBM: - mov ___blue_glCore_glEdgeFlagPointerListIBM@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUseProgramObjectARB +_bluegl_glUseProgramObjectARB: + mov ___blue_glCore_glUseProgramObjectARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetUniformBlockIndex -_bluegl_glGetUniformBlockIndex: - mov ___blue_glCore_glGetUniformBlockIndex@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glValidateProgramARB +_bluegl_glValidateProgramARB: + mov ___blue_glCore_glValidateProgramARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearColorxOES -_bluegl_glClearColorxOES: - mov ___blue_glCore_glClearColorxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1fARB +_bluegl_glUniform1fARB: + mov ___blue_glCore_glUniform1fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPixelTransformParameteriEXT -_bluegl_glPixelTransformParameteriEXT: - mov ___blue_glCore_glPixelTransformParameteriEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2fARB +_bluegl_glUniform2fARB: + mov ___blue_glCore_glUniform2fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedFramebufferTexture3DEXT -_bluegl_glNamedFramebufferTexture3DEXT: - mov ___blue_glCore_glNamedFramebufferTexture3DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3fARB +_bluegl_glUniform3fARB: + mov ___blue_glCore_glUniform3fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord4xOES -_bluegl_glTexCoord4xOES: - mov ___blue_glCore_glTexCoord4xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4fARB +_bluegl_glUniform4fARB: + mov ___blue_glCore_glUniform4fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetUniformivARB -_bluegl_glGetUniformivARB: - mov ___blue_glCore_glGetUniformivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1iARB +_bluegl_glUniform1iARB: + mov ___blue_glCore_glUniform1iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedFramebufferTextureEXT -_bluegl_glNamedFramebufferTextureEXT: - mov ___blue_glCore_glNamedFramebufferTextureEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2iARB +_bluegl_glUniform2iARB: + mov ___blue_glCore_glUniform2iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawBuffers -_bluegl_glDrawBuffers: - mov ___blue_glCore_glDrawBuffers@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3iARB +_bluegl_glUniform3iARB: + mov ___blue_glCore_glUniform3iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWeightuivARB -_bluegl_glWeightuivARB: - mov ___blue_glCore_glWeightuivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4iARB +_bluegl_glUniform4iARB: + mov ___blue_glCore_glUniform4iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoordP1ui -_bluegl_glMultiTexCoordP1ui: - mov ___blue_glCore_glMultiTexCoordP1ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1fvARB +_bluegl_glUniform1fvARB: + mov ___blue_glCore_glUniform1fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyTexSubImage1DEXT -_bluegl_glCopyTexSubImage1DEXT: - mov ___blue_glCore_glCopyTexSubImage1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2fvARB +_bluegl_glUniform2fvARB: + mov ___blue_glCore_glUniform2fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayAttribBinding -_bluegl_glVertexArrayAttribBinding: - mov ___blue_glCore_glVertexArrayAttribBinding@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3fvARB +_bluegl_glUniform3fvARB: + mov ___blue_glCore_glUniform3fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexP4ui -_bluegl_glVertexP4ui: - mov ___blue_glCore_glVertexP4ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4fvARB +_bluegl_glUniform4fvARB: + mov ___blue_glCore_glUniform4fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertex2hvNV -_bluegl_glVertex2hvNV: - mov ___blue_glCore_glVertex2hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1ivARB +_bluegl_glUniform1ivARB: + mov ___blue_glCore_glUniform1ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawElementsInstancedBaseInstance -_bluegl_glDrawElementsInstancedBaseInstance: - mov ___blue_glCore_glDrawElementsInstancedBaseInstance@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2ivARB +_bluegl_glUniform2ivARB: + mov ___blue_glCore_glUniform2ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormalStream3sATI -_bluegl_glNormalStream3sATI: - mov ___blue_glCore_glNormalStream3sATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3ivARB +_bluegl_glUniform3ivARB: + mov ___blue_glCore_glUniform3ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN -_bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN: - mov ___blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4ivARB +_bluegl_glUniform4ivARB: + mov ___blue_glCore_glUniform4ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindSamplers -_bluegl_glBindSamplers: - mov ___blue_glCore_glBindSamplers@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix2fvARB +_bluegl_glUniformMatrix2fvARB: + mov ___blue_glCore_glUniformMatrix2fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetCompressedMultiTexImageEXT -_bluegl_glGetCompressedMultiTexImageEXT: - mov ___blue_glCore_glGetCompressedMultiTexImageEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix3fvARB +_bluegl_glUniformMatrix3fvARB: + mov ___blue_glCore_glUniformMatrix3fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetRenderbufferParameterivEXT -_bluegl_glGetRenderbufferParameterivEXT: - mov ___blue_glCore_glGetRenderbufferParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformMatrix4fvARB +_bluegl_glUniformMatrix4fvARB: + mov ___blue_glCore_glUniformMatrix4fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3dv -_bluegl_glUniform3dv: - mov ___blue_glCore_glUniform3dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetObjectParameterfvARB +_bluegl_glGetObjectParameterfvARB: + mov ___blue_glCore_glGetObjectParameterfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFlushRasterSGIX -_bluegl_glFlushRasterSGIX: - mov ___blue_glCore_glFlushRasterSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetObjectParameterivARB +_bluegl_glGetObjectParameterivARB: + mov ___blue_glCore_glGetObjectParameterivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribs3hvNV -_bluegl_glVertexAttribs3hvNV: - mov ___blue_glCore_glVertexAttribs3hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetInfoLogARB +_bluegl_glGetInfoLogARB: + mov ___blue_glCore_glGetInfoLogARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnSeparableFilterARB -_bluegl_glGetnSeparableFilterARB: - mov ___blue_glCore_glGetnSeparableFilterARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetAttachedObjectsARB +_bluegl_glGetAttachedObjectsARB: + mov ___blue_glCore_glGetAttachedObjectsARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2sARB -_bluegl_glWindowPos2sARB: - mov ___blue_glCore_glWindowPos2sARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetUniformLocationARB +_bluegl_glGetUniformLocationARB: + mov ___blue_glCore_glGetUniformLocationARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPopDebugGroup -_bluegl_glPopDebugGroup: - mov ___blue_glCore_glPopDebugGroup@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetActiveUniformARB +_bluegl_glGetActiveUniformARB: + mov ___blue_glCore_glGetActiveUniformARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVideoCaptureNV -_bluegl_glVideoCaptureNV: - mov ___blue_glCore_glVideoCaptureNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetUniformfvARB +_bluegl_glGetUniformfvARB: + mov ___blue_glCore_glGetUniformfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTangent3bEXT -_bluegl_glTangent3bEXT: - mov ___blue_glCore_glTangent3bEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetUniformivARB +_bluegl_glGetUniformivARB: + mov ___blue_glCore_glGetUniformivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLinkProgram -_bluegl_glLinkProgram: - mov ___blue_glCore_glLinkProgram@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetShaderSourceARB +_bluegl_glGetShaderSourceARB: + mov ___blue_glCore_glGetShaderSourceARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFogCoordPointerListIBM -_bluegl_glFogCoordPointerListIBM: - mov ___blue_glCore_glFogCoordPointerListIBM@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexBufferARB +_bluegl_glTexBufferARB: + mov ___blue_glCore_glTexBufferARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glRotatexOES -_bluegl_glRotatexOES: - mov ___blue_glCore_glRotatexOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTexImage3DARB +_bluegl_glCompressedTexImage3DARB: + mov ___blue_glCore_glCompressedTexImage3DARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathParameterivNV -_bluegl_glPathParameterivNV: - mov ___blue_glCore_glPathParameterivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTexImage2DARB +_bluegl_glCompressedTexImage2DARB: + mov ___blue_glCore_glCompressedTexImage2DARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribLPointerEXT -_bluegl_glVertexAttribLPointerEXT: - mov ___blue_glCore_glVertexAttribLPointerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTexImage1DARB +_bluegl_glCompressedTexImage1DARB: + mov ___blue_glCore_glCompressedTexImage1DARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetInteger64i_v -_bluegl_glGetInteger64i_v: - mov ___blue_glCore_glGetInteger64i_v@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTexSubImage3DARB +_bluegl_glCompressedTexSubImage3DARB: + mov ___blue_glCore_glCompressedTexSubImage3DARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedMultiTexSubImage1DEXT -_bluegl_glCompressedMultiTexSubImage1DEXT: - mov ___blue_glCore_glCompressedMultiTexSubImage1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTexSubImage2DARB +_bluegl_glCompressedTexSubImage2DARB: + mov ___blue_glCore_glCompressedTexSubImage2DARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glConvolutionParameteriEXT -_bluegl_glConvolutionParameteriEXT: - mov ___blue_glCore_glConvolutionParameteriEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTexSubImage1DARB +_bluegl_glCompressedTexSubImage1DARB: + mov ___blue_glCore_glCompressedTexSubImage1DARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedFramebufferTextureLayer -_bluegl_glNamedFramebufferTextureLayer: - mov ___blue_glCore_glNamedFramebufferTextureLayer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetCompressedTexImageARB +_bluegl_glGetCompressedTexImageARB: + mov ___blue_glCore_glGetCompressedTexImageARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2sMESA -_bluegl_glWindowPos2sMESA: - mov ___blue_glCore_glWindowPos2sMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLoadTransposeMatrixfARB +_bluegl_glLoadTransposeMatrixfARB: + mov ___blue_glCore_glLoadTransposeMatrixfARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCoverStrokePathInstancedNV -_bluegl_glCoverStrokePathInstancedNV: - mov ___blue_glCore_glCoverStrokePathInstancedNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLoadTransposeMatrixdARB +_bluegl_glLoadTransposeMatrixdARB: + mov ___blue_glCore_glLoadTransposeMatrixdARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexParameteri -_bluegl_glTexParameteri: - mov ___blue_glCore_glTexParameteri@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultTransposeMatrixfARB +_bluegl_glMultTransposeMatrixfARB: + mov ___blue_glCore_glMultTransposeMatrixfARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1uiv -_bluegl_glUniform1uiv: - mov ___blue_glCore_glUniform1uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultTransposeMatrixdARB +_bluegl_glMultTransposeMatrixdARB: + mov ___blue_glCore_glMultTransposeMatrixdARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4fv -_bluegl_glMultiTexCoord4fv: - mov ___blue_glCore_glMultiTexCoord4fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWeightbvARB +_bluegl_glWeightbvARB: + mov ___blue_glCore_glWeightbvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramParameter4fvNV -_bluegl_glProgramParameter4fvNV: - mov ___blue_glCore_glProgramParameter4fvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWeightsvARB +_bluegl_glWeightsvARB: + mov ___blue_glCore_glWeightsvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeformationMap3fSGIX -_bluegl_glDeformationMap3fSGIX: - mov ___blue_glCore_glDeformationMap3fSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWeightivARB +_bluegl_glWeightivARB: + mov ___blue_glCore_glWeightivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendEquationiARB -_bluegl_glBlendEquationiARB: - mov ___blue_glCore_glBlendEquationiARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWeightfvARB +_bluegl_glWeightfvARB: + mov ___blue_glCore_glWeightfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStencilFunc -_bluegl_glStencilFunc: - mov ___blue_glCore_glStencilFunc@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWeightdvARB +_bluegl_glWeightdvARB: + mov ___blue_glCore_glWeightdvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFogCoordd -_bluegl_glFogCoordd: - mov ___blue_glCore_glFogCoordd@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWeightubvARB +_bluegl_glWeightubvARB: + mov ___blue_glCore_glWeightubvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2iv -_bluegl_glUniform2iv: - mov ___blue_glCore_glUniform2iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWeightusvARB +_bluegl_glWeightusvARB: + mov ___blue_glCore_glWeightusvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1i64NV -_bluegl_glUniform1i64NV: - mov ___blue_glCore_glUniform1i64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWeightuivARB +_bluegl_glWeightuivARB: + mov ___blue_glCore_glWeightuivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureStorage2D -_bluegl_glTextureStorage2D: - mov ___blue_glCore_glTextureStorage2D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWeightPointerARB +_bluegl_glWeightPointerARB: + mov ___blue_glCore_glWeightPointerARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureStorage2DMultisampleEXT -_bluegl_glTextureStorage2DMultisampleEXT: - mov ___blue_glCore_glTextureStorage2DMultisampleEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexBlendARB +_bluegl_glVertexBlendARB: + mov ___blue_glCore_glVertexBlendARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyTexSubImage1D -_bluegl_glCopyTexSubImage1D: - mov ___blue_glCore_glCopyTexSubImage1D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindBufferARB +_bluegl_glBindBufferARB: + mov ___blue_glCore_glBindBufferARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSamplerParameterf -_bluegl_glSamplerParameterf: - mov ___blue_glCore_glSamplerParameterf@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteBuffersARB +_bluegl_glDeleteBuffersARB: + mov ___blue_glCore_glDeleteBuffersARB@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glDrawArraysInstancedBaseInstance -_bluegl_glDrawArraysInstancedBaseInstance: - mov ___blue_glCore_glDrawArraysInstancedBaseInstance@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glGenBuffersARB +_bluegl_glGenBuffersARB: + mov ___blue_glCore_glGenBuffersARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4uivARB -_bluegl_glVertexAttrib4uivARB: - mov ___blue_glCore_glVertexAttrib4uivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsBufferARB +_bluegl_glIsBufferARB: + mov ___blue_glCore_glIsBufferARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribFormatNV -_bluegl_glVertexAttribFormatNV: - mov ___blue_glCore_glVertexAttribFormatNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBufferDataARB +_bluegl_glBufferDataARB: + mov ___blue_glCore_glBufferDataARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsQueryARB -_bluegl_glIsQueryARB: - mov ___blue_glCore_glIsQueryARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBufferSubDataARB +_bluegl_glBufferSubDataARB: + mov ___blue_glCore_glBufferSubDataARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSampleCoverageARB -_bluegl_glSampleCoverageARB: - mov ___blue_glCore_glSampleCoverageARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetBufferSubDataARB +_bluegl_glGetBufferSubDataARB: + mov ___blue_glCore_glGetBufferSubDataARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnCompressedTexImageARB -_bluegl_glGetnCompressedTexImageARB: - mov ___blue_glCore_glGetnCompressedTexImageARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMapBufferARB +_bluegl_glMapBufferARB: + mov ___blue_glCore_glMapBufferARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord3xvOES -_bluegl_glTexCoord3xvOES: - mov ___blue_glCore_glTexCoord3xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUnmapBufferARB +_bluegl_glUnmapBufferARB: + mov ___blue_glCore_glUnmapBufferARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord2fNormal3fVertex3fSUN -_bluegl_glTexCoord2fNormal3fVertex3fSUN: - mov ___blue_glCore_glTexCoord2fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetBufferParameterivARB +_bluegl_glGetBufferParameterivARB: + mov ___blue_glCore_glGetBufferParameterivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetGraphicsResetStatus -_bluegl_glGetGraphicsResetStatus: - mov ___blue_glCore_glGetGraphicsResetStatus@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetBufferPointervARB +_bluegl_glGetBufferPointervARB: + mov ___blue_glCore_glGetBufferPointervARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramVertexLimitNV -_bluegl_glProgramVertexLimitNV: - mov ___blue_glCore_glProgramVertexLimitNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1dARB +_bluegl_glVertexAttrib1dARB: + mov ___blue_glCore_glVertexAttrib1dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyConvolutionFilter2D -_bluegl_glCopyConvolutionFilter2D: - mov ___blue_glCore_glCopyConvolutionFilter2D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1dvARB +_bluegl_glVertexAttrib1dvARB: + mov ___blue_glCore_glVertexAttrib1dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream4fATI -_bluegl_glVertexStream4fATI: - mov ___blue_glCore_glVertexStream4fATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1fARB +_bluegl_glVertexAttrib1fARB: + mov ___blue_glCore_glVertexAttrib1fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3f -_bluegl_glSecondaryColor3f: - mov ___blue_glCore_glSecondaryColor3f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1fvARB +_bluegl_glVertexAttrib1fvARB: + mov ___blue_glCore_glVertexAttrib1fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoordP1ui -_bluegl_glTexCoordP1ui: - mov ___blue_glCore_glTexCoordP1ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1sARB +_bluegl_glVertexAttrib1sARB: + mov ___blue_glCore_glVertexAttrib1sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramBufferParametersfvNV -_bluegl_glProgramBufferParametersfvNV: - mov ___blue_glCore_glProgramBufferParametersfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1svARB +_bluegl_glVertexAttrib1svARB: + mov ___blue_glCore_glVertexAttrib1svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord1xOES -_bluegl_glTexCoord1xOES: - mov ___blue_glCore_glTexCoord1xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2dARB +_bluegl_glVertexAttrib2dARB: + mov ___blue_glCore_glVertexAttrib2dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFogCoordfv -_bluegl_glFogCoordfv: - mov ___blue_glCore_glFogCoordfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2dvARB +_bluegl_glVertexAttrib2dvARB: + mov ___blue_glCore_glVertexAttrib2dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiDrawElementsIndirectAMD -_bluegl_glMultiDrawElementsIndirectAMD: - mov ___blue_glCore_glMultiDrawElementsIndirectAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2fARB +_bluegl_glVertexAttrib2fARB: + mov ___blue_glCore_glVertexAttrib2fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnMinmaxARB -_bluegl_glGetnMinmaxARB: - mov ___blue_glCore_glGetnMinmaxARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2fvARB +_bluegl_glVertexAttrib2fvARB: + mov ___blue_glCore_glVertexAttrib2fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3uivEXT -_bluegl_glSecondaryColor3uivEXT: - mov ___blue_glCore_glSecondaryColor3uivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2sARB +_bluegl_glVertexAttrib2sARB: + mov ___blue_glCore_glVertexAttrib2sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorMask -_bluegl_glColorMask: - mov ___blue_glCore_glColorMask@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2svARB +_bluegl_glVertexAttrib2svARB: + mov ___blue_glCore_glVertexAttrib2svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureImage2DMultisampleCoverageNV -_bluegl_glTextureImage2DMultisampleCoverageNV: - mov ___blue_glCore_glTextureImage2DMultisampleCoverageNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3dARB +_bluegl_glVertexAttrib3dARB: + mov ___blue_glCore_glVertexAttrib3dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiModeDrawElementsIBM -_bluegl_glMultiModeDrawElementsIBM: - mov ___blue_glCore_glMultiModeDrawElementsIBM@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3dvARB +_bluegl_glVertexAttrib3dvARB: + mov ___blue_glCore_glVertexAttrib3dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayAttribLFormat -_bluegl_glVertexArrayAttribLFormat: - mov ___blue_glCore_glVertexArrayAttribLFormat@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3fARB +_bluegl_glVertexAttrib3fARB: + mov ___blue_glCore_glVertexAttrib3fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindFragDataLocationIndexed -_bluegl_glBindFragDataLocationIndexed: - mov ___blue_glCore_glBindFragDataLocationIndexed@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3fvARB +_bluegl_glVertexAttrib3fvARB: + mov ___blue_glCore_glVertexAttrib3fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedBufferParameterivEXT -_bluegl_glGetNamedBufferParameterivEXT: - mov ___blue_glCore_glGetNamedBufferParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3sARB +_bluegl_glVertexAttrib3sARB: + mov ___blue_glCore_glVertexAttrib3sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3bEXT -_bluegl_glSecondaryColor3bEXT: - mov ___blue_glCore_glSecondaryColor3bEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3svARB +_bluegl_glVertexAttrib3svARB: + mov ___blue_glCore_glVertexAttrib3svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1fNV -_bluegl_glVertexAttrib1fNV: - mov ___blue_glCore_glVertexAttrib1fNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4NbvARB +_bluegl_glVertexAttrib4NbvARB: + mov ___blue_glCore_glVertexAttrib4NbvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI4uivEXT -_bluegl_glVertexAttribI4uivEXT: - mov ___blue_glCore_glVertexAttribI4uivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4NivARB +_bluegl_glVertexAttrib4NivARB: + mov ___blue_glCore_glVertexAttrib4NivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetQueryObjecti64vEXT -_bluegl_glGetQueryObjecti64vEXT: - mov ___blue_glCore_glGetQueryObjecti64vEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4NsvARB +_bluegl_glVertexAttrib4NsvARB: + mov ___blue_glCore_glVertexAttrib4NsvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormalStream3bATI -_bluegl_glNormalStream3bATI: - mov ___blue_glCore_glNormalStream3bATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4NubARB +_bluegl_glVertexAttrib4NubARB: + mov ___blue_glCore_glVertexAttrib4NubARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetObjectParameterivAPPLE -_bluegl_glGetObjectParameterivAPPLE: - mov ___blue_glCore_glGetObjectParameterivAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4NubvARB +_bluegl_glVertexAttrib4NubvARB: + mov ___blue_glCore_glVertexAttrib4NubvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3uivEXT -_bluegl_glProgramUniform3uivEXT: - mov ___blue_glCore_glProgramUniform3uivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4NuivARB +_bluegl_glVertexAttrib4NuivARB: + mov ___blue_glCore_glVertexAttrib4NuivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformHandleui64ARB -_bluegl_glProgramUniformHandleui64ARB: - mov ___blue_glCore_glProgramUniformHandleui64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4NusvARB +_bluegl_glVertexAttrib4NusvARB: + mov ___blue_glCore_glVertexAttrib4NusvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPointerv -_bluegl_glGetPointerv: - mov ___blue_glCore_glGetPointerv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4bvARB +_bluegl_glVertexAttrib4bvARB: + mov ___blue_glCore_glVertexAttrib4bvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix4x3dv -_bluegl_glUniformMatrix4x3dv: - mov ___blue_glCore_glUniformMatrix4x3dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4dARB +_bluegl_glVertexAttrib4dARB: + mov ___blue_glCore_glVertexAttrib4dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoordP4uiv -_bluegl_glTexCoordP4uiv: - mov ___blue_glCore_glTexCoordP4uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4dvARB +_bluegl_glVertexAttrib4dvARB: + mov ___blue_glCore_glVertexAttrib4dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI4sv -_bluegl_glVertexAttribI4sv: - mov ___blue_glCore_glVertexAttribI4sv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4fARB +_bluegl_glVertexAttrib4fARB: + mov ___blue_glCore_glVertexAttrib4fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFlushMappedNamedBufferRangeEXT -_bluegl_glFlushMappedNamedBufferRangeEXT: - mov ___blue_glCore_glFlushMappedNamedBufferRangeEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4fvARB +_bluegl_glVertexAttrib4fvARB: + mov ___blue_glCore_glVertexAttrib4fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDisableVertexArrayEXT -_bluegl_glDisableVertexArrayEXT: - mov ___blue_glCore_glDisableVertexArrayEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4ivARB +_bluegl_glVertexAttrib4ivARB: + mov ___blue_glCore_glVertexAttrib4ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPathDashArrayNV -_bluegl_glGetPathDashArrayNV: - mov ___blue_glCore_glGetPathDashArrayNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4sARB +_bluegl_glVertexAttrib4sARB: + mov ___blue_glCore_glVertexAttrib4sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2uiEXT -_bluegl_glProgramUniform2uiEXT: - mov ___blue_glCore_glProgramUniform2uiEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4svARB +_bluegl_glVertexAttrib4svARB: + mov ___blue_glCore_glVertexAttrib4svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindImageTextures -_bluegl_glBindImageTextures: - mov ___blue_glCore_glBindImageTextures@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4ubvARB +_bluegl_glVertexAttrib4ubvARB: + mov ___blue_glCore_glVertexAttrib4ubvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4sNV -_bluegl_glVertexAttrib4sNV: - mov ___blue_glCore_glVertexAttrib4sNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4uivARB +_bluegl_glVertexAttrib4uivARB: + mov ___blue_glCore_glVertexAttrib4uivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeuiNormal3fVertex3fvSUN -_bluegl_glReplacementCodeuiNormal3fVertex3fvSUN: - mov ___blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4usvARB +_bluegl_glVertexAttrib4usvARB: + mov ___blue_glCore_glVertexAttrib4usvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertex3hNV -_bluegl_glVertex3hNV: - mov ___blue_glCore_glVertex3hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribPointerARB +_bluegl_glVertexAttribPointerARB: + mov ___blue_glCore_glVertexAttribPointerARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN -_bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN: - mov ___blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEnableVertexAttribArrayARB +_bluegl_glEnableVertexAttribArrayARB: + mov ___blue_glCore_glEnableVertexAttribArrayARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2i64NV -_bluegl_glProgramUniform2i64NV: - mov ___blue_glCore_glProgramUniform2i64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDisableVertexAttribArrayARB +_bluegl_glDisableVertexAttribArrayARB: + mov ___blue_glCore_glDisableVertexAttribArrayARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBufferData -_bluegl_glBufferData: - mov ___blue_glCore_glBufferData@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribdvARB +_bluegl_glGetVertexAttribdvARB: + mov ___blue_glCore_glGetVertexAttribdvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetBufferParameteriv -_bluegl_glGetBufferParameteriv: - mov ___blue_glCore_glGetBufferParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribfvARB +_bluegl_glGetVertexAttribfvARB: + mov ___blue_glCore_glGetVertexAttribfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsAsyncMarkerSGIX -_bluegl_glIsAsyncMarkerSGIX: - mov ___blue_glCore_glIsAsyncMarkerSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribivARB +_bluegl_glGetVertexAttribivARB: + mov ___blue_glCore_glGetVertexAttribivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexImage4DSGIS -_bluegl_glTexImage4DSGIS: - mov ___blue_glCore_glTexImage4DSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribPointervARB +_bluegl_glGetVertexAttribPointervARB: + mov ___blue_glCore_glGetVertexAttribPointervARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMultiTexEnvivEXT -_bluegl_glGetMultiTexEnvivEXT: - mov ___blue_glCore_glGetMultiTexEnvivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindAttribLocationARB +_bluegl_glBindAttribLocationARB: + mov ___blue_glCore_glBindAttribLocationARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetClipPlanexOES -_bluegl_glGetClipPlanexOES: - mov ___blue_glCore_glGetClipPlanexOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetActiveAttribARB +_bluegl_glGetActiveAttribARB: + mov ___blue_glCore_glGetActiveAttribARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3uiEXT -_bluegl_glUniform3uiEXT: - mov ___blue_glCore_glUniform3uiEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetAttribLocationARB +_bluegl_glGetAttribLocationARB: + mov ___blue_glCore_glGetAttribLocationARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3sv -_bluegl_glMultiTexCoord3sv: - mov ___blue_glCore_glMultiTexCoord3sv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2dARB +_bluegl_glWindowPos2dARB: + mov ___blue_glCore_glWindowPos2dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribs1hvNV -_bluegl_glVertexAttribs1hvNV: - mov ___blue_glCore_glVertexAttribs1hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2dvARB +_bluegl_glWindowPos2dvARB: + mov ___blue_glCore_glWindowPos2dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPerfQueryInfoINTEL -_bluegl_glGetPerfQueryInfoINTEL: - mov ___blue_glCore_glGetPerfQueryInfoINTEL@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2fARB +_bluegl_glWindowPos2fARB: + mov ___blue_glCore_glWindowPos2fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetClipPlanefOES -_bluegl_glGetClipPlanefOES: - mov ___blue_glCore_glGetClipPlanefOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2fvARB +_bluegl_glWindowPos2fvARB: + mov ___blue_glCore_glWindowPos2fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3ubEXT -_bluegl_glSecondaryColor3ubEXT: - mov ___blue_glCore_glSecondaryColor3ubEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2iARB +_bluegl_glWindowPos2iARB: + mov ___blue_glCore_glWindowPos2iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSyncTextureINTEL -_bluegl_glSyncTextureINTEL: - mov ___blue_glCore_glSyncTextureINTEL@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2ivARB +_bluegl_glWindowPos2ivARB: + mov ___blue_glCore_glWindowPos2ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix3x2dv -_bluegl_glProgramUniformMatrix3x2dv: - mov ___blue_glCore_glProgramUniformMatrix3x2dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2sARB +_bluegl_glWindowPos2sARB: + mov ___blue_glCore_glWindowPos2sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix4x2fv -_bluegl_glUniformMatrix4x2fv: - mov ___blue_glCore_glUniformMatrix4x2fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2svARB +_bluegl_glWindowPos2svARB: + mov ___blue_glCore_glWindowPos2svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureBufferEXT -_bluegl_glTextureBufferEXT: - mov ___blue_glCore_glTextureBufferEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3dARB +_bluegl_glWindowPos3dARB: + mov ___blue_glCore_glWindowPos3dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexPointervINTEL -_bluegl_glVertexPointervINTEL: - mov ___blue_glCore_glVertexPointervINTEL@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3dvARB +_bluegl_glWindowPos3dvARB: + mov ___blue_glCore_glWindowPos3dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetShaderPrecisionFormat -_bluegl_glGetShaderPrecisionFormat: - mov ___blue_glCore_glGetShaderPrecisionFormat@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3fARB +_bluegl_glWindowPos3fARB: + mov ___blue_glCore_glWindowPos3fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureImage -_bluegl_glGetTextureImage: - mov ___blue_glCore_glGetTextureImage@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3fvARB +_bluegl_glWindowPos3fvARB: + mov ___blue_glCore_glWindowPos3fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3ivARB -_bluegl_glUniform3ivARB: - mov ___blue_glCore_glUniform3ivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3iARB +_bluegl_glWindowPos3iARB: + mov ___blue_glCore_glWindowPos3iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferParameteri -_bluegl_glFramebufferParameteri: - mov ___blue_glCore_glFramebufferParameteri@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3ivARB +_bluegl_glWindowPos3ivARB: + mov ___blue_glCore_glWindowPos3ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPointParameterxvOES -_bluegl_glPointParameterxvOES: - mov ___blue_glCore_glPointParameterxvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3sARB +_bluegl_glWindowPos3sARB: + mov ___blue_glCore_glWindowPos3sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendFunci -_bluegl_glBlendFunci: - mov ___blue_glCore_glBlendFunci@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3svARB +_bluegl_glWindowPos3svARB: + mov ___blue_glCore_glWindowPos3svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix2x3dv -_bluegl_glUniformMatrix2x3dv: - mov ___blue_glCore_glUniformMatrix2x3dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendBarrierKHR +_bluegl_glBlendBarrierKHR: + mov ___blue_glCore_glBlendBarrierKHR@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2i64ARB -_bluegl_glUniform2i64ARB: - mov ___blue_glCore_glUniform2i64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1bOES +_bluegl_glMultiTexCoord1bOES: + mov ___blue_glCore_glMultiTexCoord1bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramEnvParameterI4ivNV -_bluegl_glProgramEnvParameterI4ivNV: - mov ___blue_glCore_glProgramEnvParameterI4ivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1bvOES +_bluegl_glMultiTexCoord1bvOES: + mov ___blue_glCore_glMultiTexCoord1bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFragmentLightModelivSGIX -_bluegl_glFragmentLightModelivSGIX: - mov ___blue_glCore_glFragmentLightModelivSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2bOES +_bluegl_glMultiTexCoord2bOES: + mov ___blue_glCore_glMultiTexCoord2bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4ui64vARB -_bluegl_glProgramUniform4ui64vARB: - mov ___blue_glCore_glProgramUniform4ui64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2bvOES +_bluegl_glMultiTexCoord2bvOES: + mov ___blue_glCore_glMultiTexCoord2bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix2x3fvEXT -_bluegl_glProgramUniformMatrix2x3fvEXT: - mov ___blue_glCore_glProgramUniformMatrix2x3fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3bOES +_bluegl_glMultiTexCoord3bOES: + mov ___blue_glCore_glMultiTexCoord3bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStencilClearTagEXT -_bluegl_glStencilClearTagEXT: - mov ___blue_glCore_glStencilClearTagEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3bvOES +_bluegl_glMultiTexCoord3bvOES: + mov ___blue_glCore_glMultiTexCoord3bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4s -_bluegl_glMultiTexCoord4s: - mov ___blue_glCore_glMultiTexCoord4s@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4bOES +_bluegl_glMultiTexCoord4bOES: + mov ___blue_glCore_glMultiTexCoord4bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix4dvEXT -_bluegl_glProgramUniformMatrix4dvEXT: - mov ___blue_glCore_glProgramUniformMatrix4dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4bvOES +_bluegl_glMultiTexCoord4bvOES: + mov ___blue_glCore_glMultiTexCoord4bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedBufferParameteri64v -_bluegl_glGetNamedBufferParameteri64v: - mov ___blue_glCore_glGetNamedBufferParameteri64v@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord1bOES +_bluegl_glTexCoord1bOES: + mov ___blue_glCore_glTexCoord1bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI3iEXT -_bluegl_glVertexAttribI3iEXT: - mov ___blue_glCore_glVertexAttribI3iEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord1bvOES +_bluegl_glTexCoord1bvOES: + mov ___blue_glCore_glTexCoord1bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeuivSUN -_bluegl_glReplacementCodeuivSUN: - mov ___blue_glCore_glReplacementCodeuivSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord2bOES +_bluegl_glTexCoord2bOES: + mov ___blue_glCore_glTexCoord2bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFragmentLightModeliSGIX -_bluegl_glFragmentLightModeliSGIX: - mov ___blue_glCore_glFragmentLightModeliSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord2bvOES +_bluegl_glTexCoord2bvOES: + mov ___blue_glCore_glTexCoord2bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2i64vNV -_bluegl_glUniform2i64vNV: - mov ___blue_glCore_glUniform2i64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord3bOES +_bluegl_glTexCoord3bOES: + mov ___blue_glCore_glTexCoord3bOES@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glPointParameterivNV -_bluegl_glPointParameterivNV: - mov ___blue_glCore_glPointParameterivNV@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glTexCoord3bvOES +_bluegl_glTexCoord3bvOES: + mov ___blue_glCore_glTexCoord3bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStencilStrokePathInstancedNV -_bluegl_glStencilStrokePathInstancedNV: - mov ___blue_glCore_glStencilStrokePathInstancedNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord4bOES +_bluegl_glTexCoord4bOES: + mov ___blue_glCore_glTexCoord4bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glInsertComponentEXT -_bluegl_glInsertComponentEXT: - mov ___blue_glCore_glInsertComponentEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord4bvOES +_bluegl_glTexCoord4bvOES: + mov ___blue_glCore_glTexCoord4bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsEnabled -_bluegl_glIsEnabled: - mov ___blue_glCore_glIsEnabled@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertex2bOES +_bluegl_glVertex2bOES: + mov ___blue_glCore_glVertex2bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3dMESA -_bluegl_glWindowPos3dMESA: - mov ___blue_glCore_glWindowPos3dMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertex2bvOES +_bluegl_glVertex2bvOES: + mov ___blue_glCore_glVertex2bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnCompressedTexImage -_bluegl_glGetnCompressedTexImage: - mov ___blue_glCore_glGetnCompressedTexImage@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertex3bOES +_bluegl_glVertex3bOES: + mov ___blue_glCore_glVertex3bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyMultiTexSubImage2DEXT -_bluegl_glCopyMultiTexSubImage2DEXT: - mov ___blue_glCore_glCopyMultiTexSubImage2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertex3bvOES +_bluegl_glVertex3bvOES: + mov ___blue_glCore_glVertex3bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDisableIndexedEXT -_bluegl_glDisableIndexedEXT: - mov ___blue_glCore_glDisableIndexedEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertex4bOES +_bluegl_glVertex4bOES: + mov ___blue_glCore_glVertex4bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2dv -_bluegl_glWindowPos2dv: - mov ___blue_glCore_glWindowPos2dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertex4bvOES +_bluegl_glVertex4bvOES: + mov ___blue_glCore_glVertex4bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) .private_extern _bluegl_glAlphaFuncxOES @@ -5689,2224 +5708,2229 @@ _bluegl_glAlphaFuncxOES: mov ___blue_glCore_glAlphaFuncxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreateFramebuffers -_bluegl_glCreateFramebuffers: - mov ___blue_glCore_glCreateFramebuffers@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearColorxOES +_bluegl_glClearColorxOES: + mov ___blue_glCore_glClearColorxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetAttribLocationARB -_bluegl_glGetAttribLocationARB: - mov ___blue_glCore_glGetAttribLocationARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearDepthxOES +_bluegl_glClearDepthxOES: + mov ___blue_glCore_glClearDepthxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1sARB -_bluegl_glVertexAttrib1sARB: - mov ___blue_glCore_glVertexAttrib1sARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClipPlanexOES +_bluegl_glClipPlanexOES: + mov ___blue_glCore_glClipPlanexOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexBumpParameterfvATI -_bluegl_glTexBumpParameterfvATI: - mov ___blue_glCore_glTexBumpParameterfvATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColor4xOES +_bluegl_glColor4xOES: + mov ___blue_glCore_glColor4xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetActiveSubroutineUniformiv -_bluegl_glGetActiveSubroutineUniformiv: - mov ___blue_glCore_glGetActiveSubroutineUniformiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDepthRangexOES +_bluegl_glDepthRangexOES: + mov ___blue_glCore_glDepthRangexOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2fARB -_bluegl_glVertexAttrib2fARB: - mov ___blue_glCore_glVertexAttrib2fARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFogxOES +_bluegl_glFogxOES: + mov ___blue_glCore_glFogxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTransformFeedbacki64_v -_bluegl_glGetTransformFeedbacki64_v: - mov ___blue_glCore_glGetTransformFeedbacki64_v@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFogxvOES +_bluegl_glFogxvOES: + mov ___blue_glCore_glFogxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4hvNV -_bluegl_glMultiTexCoord4hvNV: - mov ___blue_glCore_glMultiTexCoord4hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFrustumxOES +_bluegl_glFrustumxOES: + mov ___blue_glCore_glFrustumxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendColorEXT -_bluegl_glBlendColorEXT: - mov ___blue_glCore_glBlendColorEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetClipPlanexOES +_bluegl_glGetClipPlanexOES: + mov ___blue_glCore_glGetClipPlanexOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTexSubImage3D -_bluegl_glCompressedTexSubImage3D: - mov ___blue_glCore_glCompressedTexSubImage3D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFixedvOES +_bluegl_glGetFixedvOES: + mov ___blue_glCore_glGetFixedvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream4dvATI -_bluegl_glVertexStream4dvATI: - mov ___blue_glCore_glVertexStream4dvATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTexEnvxvOES +_bluegl_glGetTexEnvxvOES: + mov ___blue_glCore_glGetTexEnvxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMaxShaderCompilerThreadsARB -_bluegl_glMaxShaderCompilerThreadsARB: - mov ___blue_glCore_glMaxShaderCompilerThreadsARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTexParameterxvOES +_bluegl_glGetTexParameterxvOES: + mov ___blue_glCore_glGetTexParameterxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGlobalAlphaFactorbSUN -_bluegl_glGlobalAlphaFactorbSUN: - mov ___blue_glCore_glGlobalAlphaFactorbSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLightModelxOES +_bluegl_glLightModelxOES: + mov ___blue_glCore_glLightModelxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGlobalAlphaFactoruiSUN -_bluegl_glGlobalAlphaFactoruiSUN: - mov ___blue_glCore_glGlobalAlphaFactoruiSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLightModelxvOES +_bluegl_glLightModelxvOES: + mov ___blue_glCore_glLightModelxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClientActiveTextureARB -_bluegl_glClientActiveTextureARB: - mov ___blue_glCore_glClientActiveTextureARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLightxOES +_bluegl_glLightxOES: + mov ___blue_glCore_glLightxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenProgramsARB -_bluegl_glGenProgramsARB: - mov ___blue_glCore_glGenProgramsARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLightxvOES +_bluegl_glLightxvOES: + mov ___blue_glCore_glLightxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTexParameterPointervAPPLE -_bluegl_glGetTexParameterPointervAPPLE: - mov ___blue_glCore_glGetTexParameterPointervAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLineWidthxOES +_bluegl_glLineWidthxOES: + mov ___blue_glCore_glLineWidthxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetBooleanv -_bluegl_glGetBooleanv: - mov ___blue_glCore_glGetBooleanv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLoadMatrixxOES +_bluegl_glLoadMatrixxOES: + mov ___blue_glCore_glLoadMatrixxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawElementsBaseVertex -_bluegl_glDrawElementsBaseVertex: - mov ___blue_glCore_glDrawElementsBaseVertex@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMaterialxOES +_bluegl_glMaterialxOES: + mov ___blue_glCore_glMaterialxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL4ui64vNV -_bluegl_glVertexAttribL4ui64vNV: - mov ___blue_glCore_glVertexAttribL4ui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMaterialxvOES +_bluegl_glMaterialxvOES: + mov ___blue_glCore_glMaterialxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3fvEXT -_bluegl_glSecondaryColor3fvEXT: - mov ___blue_glCore_glSecondaryColor3fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultMatrixxOES +_bluegl_glMultMatrixxOES: + mov ___blue_glCore_glMultMatrixxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1s -_bluegl_glMultiTexCoord1s: - mov ___blue_glCore_glMultiTexCoord1s@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4xOES +_bluegl_glMultiTexCoord4xOES: + mov ___blue_glCore_glMultiTexCoord4xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteProgramsARB -_bluegl_glDeleteProgramsARB: - mov ___blue_glCore_glDeleteProgramsARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormal3xOES +_bluegl_glNormal3xOES: + mov ___blue_glCore_glNormal3xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawElementsInstancedBaseVertex -_bluegl_glDrawElementsInstancedBaseVertex: - mov ___blue_glCore_glDrawElementsInstancedBaseVertex@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glOrthoxOES +_bluegl_glOrthoxOES: + mov ___blue_glCore_glOrthoxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4dEXT -_bluegl_glProgramUniform4dEXT: - mov ___blue_glCore_glProgramUniform4dEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPointParameterxvOES +_bluegl_glPointParameterxvOES: + mov ___blue_glCore_glPointParameterxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPathMetricRangeNV -_bluegl_glGetPathMetricRangeNV: - mov ___blue_glCore_glGetPathMetricRangeNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPointSizexOES +_bluegl_glPointSizexOES: + mov ___blue_glCore_glPointSizexOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3iEXT -_bluegl_glProgramUniform3iEXT: - mov ___blue_glCore_glProgramUniform3iEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPolygonOffsetxOES +_bluegl_glPolygonOffsetxOES: + mov ___blue_glCore_glPolygonOffsetxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteBuffers -_bluegl_glDeleteBuffers: - mov ___blue_glCore_glDeleteBuffers@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glRotatexOES +_bluegl_glRotatexOES: + mov ___blue_glCore_glRotatexOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3usEXT -_bluegl_glSecondaryColor3usEXT: - mov ___blue_glCore_glSecondaryColor3usEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glScalexOES +_bluegl_glScalexOES: + mov ___blue_glCore_glScalexOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDepthMask -_bluegl_glDepthMask: - mov ___blue_glCore_glDepthMask@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexEnvxOES +_bluegl_glTexEnvxOES: + mov ___blue_glCore_glTexEnvxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2dv -_bluegl_glMultiTexCoord2dv: - mov ___blue_glCore_glMultiTexCoord2dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexEnvxvOES +_bluegl_glTexEnvxvOES: + mov ___blue_glCore_glTexEnvxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyConvolutionFilter2DEXT -_bluegl_glCopyConvolutionFilter2DEXT: - mov ___blue_glCore_glCopyConvolutionFilter2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexParameterxOES +_bluegl_glTexParameterxOES: + mov ___blue_glCore_glTexParameterxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLoadTransposeMatrixxOES -_bluegl_glLoadTransposeMatrixxOES: - mov ___blue_glCore_glLoadTransposeMatrixxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexParameterxvOES +_bluegl_glTexParameterxvOES: + mov ___blue_glCore_glTexParameterxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPixelStoref -_bluegl_glPixelStoref: - mov ___blue_glCore_glPixelStoref@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTranslatexOES +_bluegl_glTranslatexOES: + mov ___blue_glCore_glTranslatexOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStencilOpSeparateATI -_bluegl_glStencilOpSeparateATI: - mov ___blue_glCore_glStencilOpSeparateATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glAccumxOES +_bluegl_glAccumxOES: + mov ___blue_glCore_glAccumxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyTextureSubImage1DEXT -_bluegl_glCopyTextureSubImage1DEXT: - mov ___blue_glCore_glCopyTextureSubImage1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBitmapxOES +_bluegl_glBitmapxOES: + mov ___blue_glCore_glBitmapxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixScaledEXT -_bluegl_glMatrixScaledEXT: - mov ___blue_glCore_glMatrixScaledEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendColorxOES +_bluegl_glBlendColorxOES: + mov ___blue_glCore_glBlendColorxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2i64ARB -_bluegl_glProgramUniform2i64ARB: - mov ___blue_glCore_glProgramUniform2i64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearAccumxOES +_bluegl_glClearAccumxOES: + mov ___blue_glCore_glClearAccumxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureParameterfEXT -_bluegl_glTextureParameterfEXT: - mov ___blue_glCore_glTextureParameterfEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColor3xOES +_bluegl_glColor3xOES: + mov ___blue_glCore_glColor3xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramLocalParameterIivNV -_bluegl_glGetProgramLocalParameterIivNV: - mov ___blue_glCore_glGetProgramLocalParameterIivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColor3xvOES +_bluegl_glColor3xvOES: + mov ___blue_glCore_glColor3xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetShaderInfoLog -_bluegl_glGetShaderInfoLog: - mov ___blue_glCore_glGetShaderInfoLog@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColor4xvOES +_bluegl_glColor4xvOES: + mov ___blue_glCore_glColor4xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoordP2uiv -_bluegl_glTexCoordP2uiv: - mov ___blue_glCore_glTexCoordP2uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glConvolutionParameterxOES +_bluegl_glConvolutionParameterxOES: + mov ___blue_glCore_glConvolutionParameterxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDebugMessageCallback -_bluegl_glDebugMessageCallback: - mov ___blue_glCore_glDebugMessageCallback@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glConvolutionParameterxvOES +_bluegl_glConvolutionParameterxvOES: + mov ___blue_glCore_glConvolutionParameterxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLoadTransposeMatrixfARB -_bluegl_glLoadTransposeMatrixfARB: - mov ___blue_glCore_glLoadTransposeMatrixfARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEvalCoord1xOES +_bluegl_glEvalCoord1xOES: + mov ___blue_glCore_glEvalCoord1xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1ui -_bluegl_glUniform1ui: - mov ___blue_glCore_glUniform1ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEvalCoord1xvOES +_bluegl_glEvalCoord1xvOES: + mov ___blue_glCore_glEvalCoord1xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL4dvEXT -_bluegl_glVertexAttribL4dvEXT: - mov ___blue_glCore_glVertexAttribL4dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEvalCoord2xOES +_bluegl_glEvalCoord2xOES: + mov ___blue_glCore_glEvalCoord2xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertex3bvOES -_bluegl_glVertex3bvOES: - mov ___blue_glCore_glVertex3bvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEvalCoord2xvOES +_bluegl_glEvalCoord2xvOES: + mov ___blue_glCore_glEvalCoord2xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPassThroughxOES -_bluegl_glPassThroughxOES: - mov ___blue_glCore_glPassThroughxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFeedbackBufferxOES +_bluegl_glFeedbackBufferxOES: + mov ___blue_glCore_glFeedbackBufferxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFloatIndexedvEXT -_bluegl_glGetFloatIndexedvEXT: - mov ___blue_glCore_glGetFloatIndexedvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetConvolutionParameterxvOES +_bluegl_glGetConvolutionParameterxvOES: + mov ___blue_glCore_glGetConvolutionParameterxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSubpixelPrecisionBiasNV -_bluegl_glSubpixelPrecisionBiasNV: - mov ___blue_glCore_glSubpixelPrecisionBiasNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetHistogramParameterxvOES +_bluegl_glGetHistogramParameterxvOES: + mov ___blue_glCore_glGetHistogramParameterxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFinishFenceNV -_bluegl_glFinishFenceNV: - mov ___blue_glCore_glFinishFenceNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetLightxOES +_bluegl_glGetLightxOES: + mov ___blue_glCore_glGetLightxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramBinary -_bluegl_glGetProgramBinary: - mov ___blue_glCore_glGetProgramBinary@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMapxvOES +_bluegl_glGetMapxvOES: + mov ___blue_glCore_glGetMapxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendFuncSeparateIndexedAMD -_bluegl_glBlendFuncSeparateIndexedAMD: - mov ___blue_glCore_glBlendFuncSeparateIndexedAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMaterialxOES +_bluegl_glGetMaterialxOES: + mov ___blue_glCore_glGetMaterialxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendFuncSeparate -_bluegl_glBlendFuncSeparate: - mov ___blue_glCore_glBlendFuncSeparate@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPixelMapxv +_bluegl_glGetPixelMapxv: + mov ___blue_glCore_glGetPixelMapxv@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIndexxvOES -_bluegl_glIndexxvOES: - mov ___blue_glCore_glIndexxvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTexGenxvOES +_bluegl_glGetTexGenxvOES: + mov ___blue_glCore_glGetTexGenxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4NuivARB -_bluegl_glVertexAttrib4NuivARB: - mov ___blue_glCore_glVertexAttrib4NuivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTexLevelParameterxvOES +_bluegl_glGetTexLevelParameterxvOES: + mov ___blue_glCore_glGetTexLevelParameterxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2ui64ARB -_bluegl_glUniform2ui64ARB: - mov ___blue_glCore_glUniform2ui64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIndexxOES +_bluegl_glIndexxOES: + mov ___blue_glCore_glIndexxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEndPerfMonitorAMD -_bluegl_glEndPerfMonitorAMD: - mov ___blue_glCore_glEndPerfMonitorAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIndexxvOES +_bluegl_glIndexxvOES: + mov ___blue_glCore_glIndexxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReleaseShaderCompiler -_bluegl_glReleaseShaderCompiler: - mov ___blue_glCore_glReleaseShaderCompiler@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLoadTransposeMatrixxOES +_bluegl_glLoadTransposeMatrixxOES: + mov ___blue_glCore_glLoadTransposeMatrixxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenFramebuffersEXT -_bluegl_glGenFramebuffersEXT: - mov ___blue_glCore_glGenFramebuffersEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMap1xOES +_bluegl_glMap1xOES: + mov ___blue_glCore_glMap1xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2uiv -_bluegl_glUniform2uiv: - mov ___blue_glCore_glUniform2uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMap2xOES +_bluegl_glMap2xOES: + mov ___blue_glCore_glMap2xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenSymbolsEXT -_bluegl_glGenSymbolsEXT: - mov ___blue_glCore_glGenSymbolsEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMapGrid1xOES +_bluegl_glMapGrid1xOES: + mov ___blue_glCore_glMapGrid1xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribIPointer -_bluegl_glVertexAttribIPointer: - mov ___blue_glCore_glVertexAttribIPointer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMapGrid2xOES +_bluegl_glMapGrid2xOES: + mov ___blue_glCore_glMapGrid2xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix3x4fv -_bluegl_glUniformMatrix3x4fv: - mov ___blue_glCore_glUniformMatrix3x4fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultTransposeMatrixxOES +_bluegl_glMultTransposeMatrixxOES: + mov ___blue_glCore_glMultTransposeMatrixxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord3bOES -_bluegl_glTexCoord3bOES: - mov ___blue_glCore_glTexCoord3bOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1xOES +_bluegl_glMultiTexCoord1xOES: + mov ___blue_glCore_glMultiTexCoord1xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVDPAUUnmapSurfacesNV -_bluegl_glVDPAUUnmapSurfacesNV: - mov ___blue_glCore_glVDPAUUnmapSurfacesNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1xvOES +_bluegl_glMultiTexCoord1xvOES: + mov ___blue_glCore_glMultiTexCoord1xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4ui64NV -_bluegl_glProgramUniform4ui64NV: - mov ___blue_glCore_glProgramUniform4ui64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2xOES +_bluegl_glMultiTexCoord2xOES: + mov ___blue_glCore_glMultiTexCoord2xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformHandleui64NV -_bluegl_glUniformHandleui64NV: - mov ___blue_glCore_glUniformHandleui64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2xvOES +_bluegl_glMultiTexCoord2xvOES: + mov ___blue_glCore_glMultiTexCoord2xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetStageIndexNV -_bluegl_glGetStageIndexNV: - mov ___blue_glCore_glGetStageIndexNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3xOES +_bluegl_glMultiTexCoord3xOES: + mov ___blue_glCore_glMultiTexCoord3xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3fvARB -_bluegl_glMultiTexCoord3fvARB: - mov ___blue_glCore_glMultiTexCoord3fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3xvOES +_bluegl_glMultiTexCoord3xvOES: + mov ___blue_glCore_glMultiTexCoord3xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindBufferOffsetEXT -_bluegl_glBindBufferOffsetEXT: - mov ___blue_glCore_glBindBufferOffsetEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4xvOES +_bluegl_glMultiTexCoord4xvOES: + mov ___blue_glCore_glMultiTexCoord4xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL4dv -_bluegl_glVertexAttribL4dv: - mov ___blue_glCore_glVertexAttribL4dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormal3xvOES +_bluegl_glNormal3xvOES: + mov ___blue_glCore_glNormal3xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearStencil -_bluegl_glClearStencil: - mov ___blue_glCore_glClearStencil@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPassThroughxOES +_bluegl_glPassThroughxOES: + mov ___blue_glCore_glPassThroughxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2ivMESA -_bluegl_glWindowPos2ivMESA: - mov ___blue_glCore_glWindowPos2ivMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPixelMapx +_bluegl_glPixelMapx: + mov ___blue_glCore_glPixelMapx@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeubvSUN -_bluegl_glReplacementCodeubvSUN: - mov ___blue_glCore_glReplacementCodeubvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPixelStorex +_bluegl_glPixelStorex: + mov ___blue_glCore_glPixelStorex@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClipPlanefOES -_bluegl_glClipPlanefOES: - mov ___blue_glCore_glClipPlanefOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPixelTransferxOES +_bluegl_glPixelTransferxOES: + mov ___blue_glCore_glPixelTransferxOES@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glMultiTexCoord1xOES -_bluegl_glMultiTexCoord1xOES: - mov ___blue_glCore_glMultiTexCoord1xOES@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glPixelZoomxOES +_bluegl_glPixelZoomxOES: + mov ___blue_glCore_glPixelZoomxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramInfoLog -_bluegl_glGetProgramInfoLog: - mov ___blue_glCore_glGetProgramInfoLog@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPrioritizeTexturesxOES +_bluegl_glPrioritizeTexturesxOES: + mov ___blue_glCore_glPrioritizeTexturesxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEndFragmentShaderATI -_bluegl_glEndFragmentShaderATI: - mov ___blue_glCore_glEndFragmentShaderATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glRasterPos2xOES +_bluegl_glRasterPos2xOES: + mov ___blue_glCore_glRasterPos2xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTransformFeedbackVaryingNV -_bluegl_glGetTransformFeedbackVaryingNV: - mov ___blue_glCore_glGetTransformFeedbackVaryingNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glRasterPos2xvOES +_bluegl_glRasterPos2xvOES: + mov ___blue_glCore_glRasterPos2xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix4x2dv -_bluegl_glProgramUniformMatrix4x2dv: - mov ___blue_glCore_glProgramUniformMatrix4x2dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glRasterPos3xOES +_bluegl_glRasterPos3xOES: + mov ___blue_glCore_glRasterPos3xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glResetHistogramEXT -_bluegl_glResetHistogramEXT: - mov ___blue_glCore_glResetHistogramEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glRasterPos3xvOES +_bluegl_glRasterPos3xvOES: + mov ___blue_glCore_glRasterPos3xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1i64vNV -_bluegl_glUniform1i64vNV: - mov ___blue_glCore_glUniform1i64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glRasterPos4xOES +_bluegl_glRasterPos4xOES: + mov ___blue_glCore_glRasterPos4xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramEnvParameter4dARB -_bluegl_glProgramEnvParameter4dARB: - mov ___blue_glCore_glProgramEnvParameter4dARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glRasterPos4xvOES +_bluegl_glRasterPos4xvOES: + mov ___blue_glCore_glRasterPos4xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyTextureSubImage2DEXT -_bluegl_glCopyTextureSubImage2DEXT: - mov ___blue_glCore_glCopyTextureSubImage2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glRectxOES +_bluegl_glRectxOES: + mov ___blue_glCore_glRectxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetCombinerInputParameterivNV -_bluegl_glGetCombinerInputParameterivNV: - mov ___blue_glCore_glGetCombinerInputParameterivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glRectxvOES +_bluegl_glRectxvOES: + mov ___blue_glCore_glRectxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix4fv -_bluegl_glUniformMatrix4fv: - mov ___blue_glCore_glUniformMatrix4fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord1xOES +_bluegl_glTexCoord1xOES: + mov ___blue_glCore_glTexCoord1xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenQueriesARB -_bluegl_glGenQueriesARB: - mov ___blue_glCore_glGenQueriesARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord1xvOES +_bluegl_glTexCoord1xvOES: + mov ___blue_glCore_glTexCoord1xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnSeparableFilter -_bluegl_glGetnSeparableFilter: - mov ___blue_glCore_glGetnSeparableFilter@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord2xOES +_bluegl_glTexCoord2xOES: + mov ___blue_glCore_glTexCoord2xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3ui64vARB -_bluegl_glUniform3ui64vARB: - mov ___blue_glCore_glUniform3ui64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord2xvOES +_bluegl_glTexCoord2xvOES: + mov ___blue_glCore_glTexCoord2xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1i -_bluegl_glMultiTexCoord1i: - mov ___blue_glCore_glMultiTexCoord1i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord3xOES +_bluegl_glTexCoord3xOES: + mov ___blue_glCore_glTexCoord3xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorTable -_bluegl_glColorTable: - mov ___blue_glCore_glColorTable@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord3xvOES +_bluegl_glTexCoord3xvOES: + mov ___blue_glCore_glTexCoord3xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribs4ubvNV -_bluegl_glVertexAttribs4ubvNV: - mov ___blue_glCore_glVertexAttribs4ubvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord4xOES +_bluegl_glTexCoord4xOES: + mov ___blue_glCore_glTexCoord4xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3uiv -_bluegl_glProgramUniform3uiv: - mov ___blue_glCore_glProgramUniform3uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord4xvOES +_bluegl_glTexCoord4xvOES: + mov ___blue_glCore_glTexCoord4xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix3x2fv -_bluegl_glProgramUniformMatrix3x2fv: - mov ___blue_glCore_glProgramUniformMatrix3x2fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexGenxOES +_bluegl_glTexGenxOES: + mov ___blue_glCore_glTexGenxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUnmapBuffer -_bluegl_glUnmapBuffer: - mov ___blue_glCore_glUnmapBuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexGenxvOES +_bluegl_glTexGenxvOES: + mov ___blue_glCore_glTexGenxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindTextureUnit -_bluegl_glBindTextureUnit: - mov ___blue_glCore_glBindTextureUnit@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertex2xOES +_bluegl_glVertex2xOES: + mov ___blue_glCore_glVertex2xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureParameterIuivEXT -_bluegl_glTextureParameterIuivEXT: - mov ___blue_glCore_glTextureParameterIuivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertex2xvOES +_bluegl_glVertex2xvOES: + mov ___blue_glCore_glVertex2xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribDivisor -_bluegl_glVertexAttribDivisor: - mov ___blue_glCore_glVertexAttribDivisor@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertex3xOES +_bluegl_glVertex3xOES: + mov ___blue_glCore_glVertex3xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSamplerParameterIiv -_bluegl_glSamplerParameterIiv: - mov ___blue_glCore_glSamplerParameterIiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertex3xvOES +_bluegl_glVertex3xvOES: + mov ___blue_glCore_glVertex3xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetDebugMessageLog -_bluegl_glGetDebugMessageLog: - mov ___blue_glCore_glGetDebugMessageLog@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertex4xOES +_bluegl_glVertex4xOES: + mov ___blue_glCore_glVertex4xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSelectPerfMonitorCountersAMD -_bluegl_glSelectPerfMonitorCountersAMD: - mov ___blue_glCore_glSelectPerfMonitorCountersAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertex4xvOES +_bluegl_glVertex4xvOES: + mov ___blue_glCore_glVertex4xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI2i -_bluegl_glVertexAttribI2i: - mov ___blue_glCore_glVertexAttribI2i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glQueryMatrixxOES +_bluegl_glQueryMatrixxOES: + mov ___blue_glCore_glQueryMatrixxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDepthRangedNV -_bluegl_glDepthRangedNV: - mov ___blue_glCore_glDepthRangedNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearDepthfOES +_bluegl_glClearDepthfOES: + mov ___blue_glCore_glClearDepthfOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureRangeAPPLE -_bluegl_glTextureRangeAPPLE: - mov ___blue_glCore_glTextureRangeAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClipPlanefOES +_bluegl_glClipPlanefOES: + mov ___blue_glCore_glClipPlanefOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEvalCoord2xOES -_bluegl_glEvalCoord2xOES: - mov ___blue_glCore_glEvalCoord2xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDepthRangefOES +_bluegl_glDepthRangefOES: + mov ___blue_glCore_glDepthRangefOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCallCommandListNV -_bluegl_glCallCommandListNV: - mov ___blue_glCore_glCallCommandListNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFrustumfOES +_bluegl_glFrustumfOES: + mov ___blue_glCore_glFrustumfOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVariantdvEXT -_bluegl_glVariantdvEXT: - mov ___blue_glCore_glVariantdvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetClipPlanefOES +_bluegl_glGetClipPlanefOES: + mov ___blue_glCore_glGetClipPlanefOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendColorxOES -_bluegl_glBlendColorxOES: - mov ___blue_glCore_glBlendColorxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glOrthofOES +_bluegl_glOrthofOES: + mov ___blue_glCore_glOrthofOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferTexture2DEXT -_bluegl_glFramebufferTexture2DEXT: - mov ___blue_glCore_glFramebufferTexture2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTbufferMask3DFX +_bluegl_glTbufferMask3DFX: + mov ___blue_glCore_glTbufferMask3DFX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetString -_bluegl_glGetString: - mov ___blue_glCore_glGetString@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDebugMessageEnableAMD +_bluegl_glDebugMessageEnableAMD: + mov ___blue_glCore_glDebugMessageEnableAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream3iATI -_bluegl_glVertexStream3iATI: - mov ___blue_glCore_glVertexStream3iATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDebugMessageInsertAMD +_bluegl_glDebugMessageInsertAMD: + mov ___blue_glCore_glDebugMessageInsertAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glHintPGI -_bluegl_glHintPGI: - mov ___blue_glCore_glHintPGI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDebugMessageCallbackAMD +_bluegl_glDebugMessageCallbackAMD: + mov ___blue_glCore_glDebugMessageCallbackAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenPerfMonitorsAMD -_bluegl_glGenPerfMonitorsAMD: - mov ___blue_glCore_glGenPerfMonitorsAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetDebugMessageLogAMD +_bluegl_glGetDebugMessageLogAMD: + mov ___blue_glCore_glGetDebugMessageLogAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureSubImage3DEXT -_bluegl_glTextureSubImage3DEXT: - mov ___blue_glCore_glTextureSubImage3DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendFuncIndexedAMD +_bluegl_glBlendFuncIndexedAMD: + mov ___blue_glCore_glBlendFuncIndexedAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4usvARB -_bluegl_glVertexAttrib4usvARB: - mov ___blue_glCore_glVertexAttrib4usvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendFuncSeparateIndexedAMD +_bluegl_glBlendFuncSeparateIndexedAMD: + mov ___blue_glCore_glBlendFuncSeparateIndexedAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayBindVertexBufferEXT -_bluegl_glVertexArrayBindVertexBufferEXT: - mov ___blue_glCore_glVertexArrayBindVertexBufferEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendEquationIndexedAMD +_bluegl_glBlendEquationIndexedAMD: + mov ___blue_glCore_glBlendEquationIndexedAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMinSampleShading -_bluegl_glMinSampleShading: - mov ___blue_glCore_glMinSampleShading@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendEquationSeparateIndexedAMD +_bluegl_glBlendEquationSeparateIndexedAMD: + mov ___blue_glCore_glBlendEquationSeparateIndexedAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsPathNV -_bluegl_glIsPathNV: - mov ___blue_glCore_glIsPathNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1i64NV +_bluegl_glUniform1i64NV: + mov ___blue_glCore_glUniform1i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPathTexGenivNV -_bluegl_glGetPathTexGenivNV: - mov ___blue_glCore_glGetPathTexGenivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2i64NV +_bluegl_glUniform2i64NV: + mov ___blue_glCore_glUniform2i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3fv -_bluegl_glProgramUniform3fv: - mov ___blue_glCore_glProgramUniform3fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3i64NV +_bluegl_glUniform3i64NV: + mov ___blue_glCore_glUniform3i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3sv -_bluegl_glVertexAttrib3sv: - mov ___blue_glCore_glVertexAttrib3sv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4i64NV +_bluegl_glUniform4i64NV: + mov ___blue_glCore_glUniform4i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetUniformuiv -_bluegl_glGetUniformuiv: - mov ___blue_glCore_glGetUniformuiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1i64vNV +_bluegl_glUniform1i64vNV: + mov ___blue_glCore_glUniform1i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPixelTransformParameterfvEXT -_bluegl_glGetPixelTransformParameterfvEXT: - mov ___blue_glCore_glGetPixelTransformParameterfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2i64vNV +_bluegl_glUniform2i64vNV: + mov ___blue_glCore_glUniform2i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3dv -_bluegl_glMultiTexCoord3dv: - mov ___blue_glCore_glMultiTexCoord3dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3i64vNV +_bluegl_glUniform3i64vNV: + mov ___blue_glCore_glUniform3i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3fvARB -_bluegl_glVertexAttrib3fvARB: - mov ___blue_glCore_glVertexAttrib3fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4i64vNV +_bluegl_glUniform4i64vNV: + mov ___blue_glCore_glUniform4i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramResourceIndex -_bluegl_glGetProgramResourceIndex: - mov ___blue_glCore_glGetProgramResourceIndex@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1ui64NV +_bluegl_glUniform1ui64NV: + mov ___blue_glCore_glUniform1ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMinmaxParameteriv -_bluegl_glGetMinmaxParameteriv: - mov ___blue_glCore_glGetMinmaxParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2ui64NV +_bluegl_glUniform2ui64NV: + mov ___blue_glCore_glUniform2ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glConvolutionParameterfEXT -_bluegl_glConvolutionParameterfEXT: - mov ___blue_glCore_glConvolutionParameterfEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3ui64NV +_bluegl_glUniform3ui64NV: + mov ___blue_glCore_glUniform3ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4i64NV -_bluegl_glProgramUniform4i64NV: - mov ___blue_glCore_glProgramUniform4i64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4ui64NV +_bluegl_glUniform4ui64NV: + mov ___blue_glCore_glUniform4ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix4fvEXT -_bluegl_glProgramUniformMatrix4fvEXT: - mov ___blue_glCore_glProgramUniformMatrix4fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1ui64vNV +_bluegl_glUniform1ui64vNV: + mov ___blue_glCore_glUniform1ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoordP4ui -_bluegl_glMultiTexCoordP4ui: - mov ___blue_glCore_glMultiTexCoordP4ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2ui64vNV +_bluegl_glUniform2ui64vNV: + mov ___blue_glCore_glUniform2ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEnableVertexAttribAPPLE -_bluegl_glEnableVertexAttribAPPLE: - mov ___blue_glCore_glEnableVertexAttribAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3ui64vNV +_bluegl_glUniform3ui64vNV: + mov ___blue_glCore_glUniform3ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoordP3uiv -_bluegl_glTexCoordP3uiv: - mov ___blue_glCore_glTexCoordP3uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4ui64vNV +_bluegl_glUniform4ui64vNV: + mov ___blue_glCore_glUniform4ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCoverageModulationNV -_bluegl_glCoverageModulationNV: - mov ___blue_glCore_glCoverageModulationNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetUniformi64vNV +_bluegl_glGetUniformi64vNV: + mov ___blue_glCore_glGetUniformi64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3ivARB -_bluegl_glMultiTexCoord3ivARB: - mov ___blue_glCore_glMultiTexCoord3ivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetUniformui64vNV +_bluegl_glGetUniformui64vNV: + mov ___blue_glCore_glGetUniformui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glListParameterfvSGIX -_bluegl_glListParameterfvSGIX: - mov ___blue_glCore_glListParameterfvSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1i64NV +_bluegl_glProgramUniform1i64NV: + mov ___blue_glCore_glProgramUniform1i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormal3fVertex3fvSUN -_bluegl_glNormal3fVertex3fvSUN: - mov ___blue_glCore_glNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2i64NV +_bluegl_glProgramUniform2i64NV: + mov ___blue_glCore_glProgramUniform2i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4bv -_bluegl_glVertexAttrib4bv: - mov ___blue_glCore_glVertexAttrib4bv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3i64NV +_bluegl_glProgramUniform3i64NV: + mov ___blue_glCore_glProgramUniform3i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexParameterIiv -_bluegl_glTexParameterIiv: - mov ___blue_glCore_glTexParameterIiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4i64NV +_bluegl_glProgramUniform4i64NV: + mov ___blue_glCore_glProgramUniform4i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedFramebufferParameteri -_bluegl_glNamedFramebufferParameteri: - mov ___blue_glCore_glNamedFramebufferParameteri@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1i64vNV +_bluegl_glProgramUniform1i64vNV: + mov ___blue_glCore_glProgramUniform1i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFramebufferParameterivEXT -_bluegl_glGetFramebufferParameterivEXT: - mov ___blue_glCore_glGetFramebufferParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2i64vNV +_bluegl_glProgramUniform2i64vNV: + mov ___blue_glCore_glProgramUniform2i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeubSUN -_bluegl_glReplacementCodeubSUN: - mov ___blue_glCore_glReplacementCodeubSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3i64vNV +_bluegl_glProgramUniform3i64vNV: + mov ___blue_glCore_glProgramUniform3i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord2bvOES -_bluegl_glTexCoord2bvOES: - mov ___blue_glCore_glTexCoord2bvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4i64vNV +_bluegl_glProgramUniform4i64vNV: + mov ___blue_glCore_glProgramUniform4i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVideoui64vNV -_bluegl_glGetVideoui64vNV: - mov ___blue_glCore_glGetVideoui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1ui64NV +_bluegl_glProgramUniform1ui64NV: + mov ___blue_glCore_glProgramUniform1ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexStorage2DMultisample -_bluegl_glTexStorage2DMultisample: - mov ___blue_glCore_glTexStorage2DMultisample@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2ui64NV +_bluegl_glProgramUniform2ui64NV: + mov ___blue_glCore_glProgramUniform2ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorTableParameteriv -_bluegl_glColorTableParameteriv: - mov ___blue_glCore_glColorTableParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3ui64NV +_bluegl_glProgramUniform3ui64NV: + mov ___blue_glCore_glProgramUniform3ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glConvolutionFilter2DEXT -_bluegl_glConvolutionFilter2DEXT: - mov ___blue_glCore_glConvolutionFilter2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4ui64NV +_bluegl_glProgramUniform4ui64NV: + mov ___blue_glCore_glProgramUniform4ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSampleMaskEXT -_bluegl_glSampleMaskEXT: - mov ___blue_glCore_glSampleMaskEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1ui64vNV +_bluegl_glProgramUniform1ui64vNV: + mov ___blue_glCore_glProgramUniform1ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGlobalAlphaFactorusSUN -_bluegl_glGlobalAlphaFactorusSUN: - mov ___blue_glCore_glGlobalAlphaFactorusSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2ui64vNV +_bluegl_glProgramUniform2ui64vNV: + mov ___blue_glCore_glProgramUniform2ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindRenderbuffer -_bluegl_glBindRenderbuffer: - mov ___blue_glCore_glBindRenderbuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3ui64vNV +_bluegl_glProgramUniform3ui64vNV: + mov ___blue_glCore_glProgramUniform3ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI1i -_bluegl_glVertexAttribI1i: - mov ___blue_glCore_glVertexAttribI1i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4ui64vNV +_bluegl_glProgramUniform4ui64vNV: + mov ___blue_glCore_glProgramUniform4ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramLocalParameterI4uiNV -_bluegl_glProgramLocalParameterI4uiNV: - mov ___blue_glCore_glProgramLocalParameterI4uiNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribParameteriAMD +_bluegl_glVertexAttribParameteriAMD: + mov ___blue_glCore_glVertexAttribParameteriAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4ui64ARB -_bluegl_glProgramUniform4ui64ARB: - mov ___blue_glCore_glProgramUniform4ui64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiDrawArraysIndirectAMD +_bluegl_glMultiDrawArraysIndirectAMD: + mov ___blue_glCore_glMultiDrawArraysIndirectAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glObjectLabel -_bluegl_glObjectLabel: - mov ___blue_glCore_glObjectLabel@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiDrawElementsIndirectAMD +_bluegl_glMultiDrawElementsIndirectAMD: + mov ___blue_glCore_glMultiDrawElementsIndirectAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetColorTableParameterivEXT -_bluegl_glGetColorTableParameterivEXT: - mov ___blue_glCore_glGetColorTableParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenNamesAMD +_bluegl_glGenNamesAMD: + mov ___blue_glCore_glGenNamesAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetCombinerOutputParameterivNV -_bluegl_glGetCombinerOutputParameterivNV: - mov ___blue_glCore_glGetCombinerOutputParameterivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteNamesAMD +_bluegl_glDeleteNamesAMD: + mov ___blue_glCore_glDeleteNamesAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawElementsInstancedARB -_bluegl_glDrawElementsInstancedARB: - mov ___blue_glCore_glDrawElementsInstancedARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsNameAMD +_bluegl_glIsNameAMD: + mov ___blue_glCore_glIsNameAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMinmaxParameterfv -_bluegl_glGetMinmaxParameterfv: - mov ___blue_glCore_glGetMinmaxParameterfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glQueryObjectParameteruiAMD +_bluegl_glQueryObjectParameteruiAMD: + mov ___blue_glCore_glQueryObjectParameteruiAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixPushEXT -_bluegl_glMatrixPushEXT: - mov ___blue_glCore_glMatrixPushEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPerfMonitorGroupsAMD +_bluegl_glGetPerfMonitorGroupsAMD: + mov ___blue_glCore_glGetPerfMonitorGroupsAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexParameterIivEXT -_bluegl_glMultiTexParameterIivEXT: - mov ___blue_glCore_glMultiTexParameterIivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPerfMonitorCountersAMD +_bluegl_glGetPerfMonitorCountersAMD: + mov ___blue_glCore_glGetPerfMonitorCountersAMD@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glGetPathColorGenfvNV -_bluegl_glGetPathColorGenfvNV: - mov ___blue_glCore_glGetPathColorGenfvNV@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glGetPerfMonitorGroupStringAMD +_bluegl_glGetPerfMonitorGroupStringAMD: + mov ___blue_glCore_glGetPerfMonitorGroupStringAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindProgramNV -_bluegl_glBindProgramNV: - mov ___blue_glCore_glBindProgramNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPerfMonitorCounterStringAMD +_bluegl_glGetPerfMonitorCounterStringAMD: + mov ___blue_glCore_glGetPerfMonitorCounterStringAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferReadBufferEXT -_bluegl_glFramebufferReadBufferEXT: - mov ___blue_glCore_glFramebufferReadBufferEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPerfMonitorCounterInfoAMD +_bluegl_glGetPerfMonitorCounterInfoAMD: + mov ___blue_glCore_glGetPerfMonitorCounterInfoAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFogCoordfEXT -_bluegl_glFogCoordfEXT: - mov ___blue_glCore_glFogCoordfEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenPerfMonitorsAMD +_bluegl_glGenPerfMonitorsAMD: + mov ___blue_glCore_glGenPerfMonitorsAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayNormalOffsetEXT -_bluegl_glVertexArrayNormalOffsetEXT: - mov ___blue_glCore_glVertexArrayNormalOffsetEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeletePerfMonitorsAMD +_bluegl_glDeletePerfMonitorsAMD: + mov ___blue_glCore_glDeletePerfMonitorsAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN -_bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN: - mov ___blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSelectPerfMonitorCountersAMD +_bluegl_glSelectPerfMonitorCountersAMD: + mov ___blue_glCore_glSelectPerfMonitorCountersAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnUniformfv -_bluegl_glGetnUniformfv: - mov ___blue_glCore_glGetnUniformfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBeginPerfMonitorAMD +_bluegl_glBeginPerfMonitorAMD: + mov ___blue_glCore_glBeginPerfMonitorAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPointParameterfEXT -_bluegl_glPointParameterfEXT: - mov ___blue_glCore_glPointParameterfEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEndPerfMonitorAMD +_bluegl_glEndPerfMonitorAMD: + mov ___blue_glCore_glEndPerfMonitorAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEndVideoCaptureNV -_bluegl_glEndVideoCaptureNV: - mov ___blue_glCore_glEndVideoCaptureNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPerfMonitorCounterDataAMD +_bluegl_glGetPerfMonitorCounterDataAMD: + mov ___blue_glCore_glGetPerfMonitorCounterDataAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexBlendARB -_bluegl_glVertexBlendARB: - mov ___blue_glCore_glVertexBlendARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSetMultisamplefvAMD +_bluegl_glSetMultisamplefvAMD: + mov ___blue_glCore_glSetMultisamplefvAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL3i64vNV -_bluegl_glVertexAttribL3i64vNV: - mov ___blue_glCore_glVertexAttribL3i64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexStorageSparseAMD +_bluegl_glTexStorageSparseAMD: + mov ___blue_glCore_glTexStorageSparseAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3fEXT -_bluegl_glSecondaryColor3fEXT: - mov ___blue_glCore_glSecondaryColor3fEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureStorageSparseAMD +_bluegl_glTextureStorageSparseAMD: + mov ___blue_glCore_glTextureStorageSparseAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStencilFuncSeparateATI -_bluegl_glStencilFuncSeparateATI: - mov ___blue_glCore_glStencilFuncSeparateATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStencilOpValueAMD +_bluegl_glStencilOpValueAMD: + mov ___blue_glCore_glStencilOpValueAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedMultiTexSubImage2DEXT -_bluegl_glCompressedMultiTexSubImage2DEXT: - mov ___blue_glCore_glCompressedMultiTexSubImage2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTessellationFactorAMD +_bluegl_glTessellationFactorAMD: + mov ___blue_glCore_glTessellationFactorAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTransformPathNV -_bluegl_glTransformPathNV: - mov ___blue_glCore_glTransformPathNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTessellationModeAMD +_bluegl_glTessellationModeAMD: + mov ___blue_glCore_glTessellationModeAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsEnabledi -_bluegl_glIsEnabledi: - mov ___blue_glCore_glIsEnabledi@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glElementPointerAPPLE +_bluegl_glElementPointerAPPLE: + mov ___blue_glCore_glElementPointerAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glExtractComponentEXT -_bluegl_glExtractComponentEXT: - mov ___blue_glCore_glExtractComponentEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawElementArrayAPPLE +_bluegl_glDrawElementArrayAPPLE: + mov ___blue_glCore_glDrawElementArrayAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFixedvOES -_bluegl_glGetFixedvOES: - mov ___blue_glCore_glGetFixedvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawRangeElementArrayAPPLE +_bluegl_glDrawRangeElementArrayAPPLE: + mov ___blue_glCore_glDrawRangeElementArrayAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteProgramPipelines -_bluegl_glDeleteProgramPipelines: - mov ___blue_glCore_glDeleteProgramPipelines@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiDrawElementArrayAPPLE +_bluegl_glMultiDrawElementArrayAPPLE: + mov ___blue_glCore_glMultiDrawElementArrayAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyMultiTexSubImage3DEXT -_bluegl_glCopyMultiTexSubImage3DEXT: - mov ___blue_glCore_glCopyMultiTexSubImage3DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiDrawRangeElementArrayAPPLE +_bluegl_glMultiDrawRangeElementArrayAPPLE: + mov ___blue_glCore_glMultiDrawRangeElementArrayAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreateStatesNV -_bluegl_glCreateStatesNV: - mov ___blue_glCore_glCreateStatesNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenFencesAPPLE +_bluegl_glGenFencesAPPLE: + mov ___blue_glCore_glGenFencesAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSwizzleEXT -_bluegl_glSwizzleEXT: - mov ___blue_glCore_glSwizzleEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteFencesAPPLE +_bluegl_glDeleteFencesAPPLE: + mov ___blue_glCore_glDeleteFencesAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexWeightfvEXT -_bluegl_glVertexWeightfvEXT: - mov ___blue_glCore_glVertexWeightfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSetFenceAPPLE +_bluegl_glSetFenceAPPLE: + mov ___blue_glCore_glSetFenceAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormalPointerEXT -_bluegl_glNormalPointerEXT: - mov ___blue_glCore_glNormalPointerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsFenceAPPLE +_bluegl_glIsFenceAPPLE: + mov ___blue_glCore_glIsFenceAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetConvolutionFilterEXT -_bluegl_glGetConvolutionFilterEXT: - mov ___blue_glCore_glGetConvolutionFilterEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTestFenceAPPLE +_bluegl_glTestFenceAPPLE: + mov ___blue_glCore_glTestFenceAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCurrentPaletteMatrixARB -_bluegl_glCurrentPaletteMatrixARB: - mov ___blue_glCore_glCurrentPaletteMatrixARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFinishFenceAPPLE +_bluegl_glFinishFenceAPPLE: + mov ___blue_glCore_glFinishFenceAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream4sATI -_bluegl_glVertexStream4sATI: - mov ___blue_glCore_glVertexStream4sATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTestObjectAPPLE +_bluegl_glTestObjectAPPLE: + mov ___blue_glCore_glTestObjectAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3ui64ARB -_bluegl_glUniform3ui64ARB: - mov ___blue_glCore_glUniform3ui64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFinishObjectAPPLE +_bluegl_glFinishObjectAPPLE: + mov ___blue_glCore_glFinishObjectAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1uivEXT -_bluegl_glProgramUniform1uivEXT: - mov ___blue_glCore_glProgramUniform1uivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBufferParameteriAPPLE +_bluegl_glBufferParameteriAPPLE: + mov ___blue_glCore_glBufferParameteriAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribs3dvNV -_bluegl_glVertexAttribs3dvNV: - mov ___blue_glCore_glVertexAttribs3dvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFlushMappedBufferRangeAPPLE +_bluegl_glFlushMappedBufferRangeAPPLE: + mov ___blue_glCore_glFlushMappedBufferRangeAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glExecuteProgramNV -_bluegl_glExecuteProgramNV: - mov ___blue_glCore_glExecuteProgramNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glObjectPurgeableAPPLE +_bluegl_glObjectPurgeableAPPLE: + mov ___blue_glCore_glObjectPurgeableAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFrameZoomSGIX -_bluegl_glFrameZoomSGIX: - mov ___blue_glCore_glFrameZoomSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glObjectUnpurgeableAPPLE +_bluegl_glObjectUnpurgeableAPPLE: + mov ___blue_glCore_glObjectUnpurgeableAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFragmentMaterialfSGIX -_bluegl_glFragmentMaterialfSGIX: - mov ___blue_glCore_glFragmentMaterialfSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetObjectParameterivAPPLE +_bluegl_glGetObjectParameterivAPPLE: + mov ___blue_glCore_glGetObjectParameterivAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferTextureLayerEXT -_bluegl_glFramebufferTextureLayerEXT: - mov ___blue_glCore_glFramebufferTextureLayerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureRangeAPPLE +_bluegl_glTextureRangeAPPLE: + mov ___blue_glCore_glTextureRangeAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream1iATI -_bluegl_glVertexStream1iATI: - mov ___blue_glCore_glVertexStream1iATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTexParameterPointervAPPLE +_bluegl_glGetTexParameterPointervAPPLE: + mov ___blue_glCore_glGetTexParameterPointervAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3s -_bluegl_glVertexAttrib3s: - mov ___blue_glCore_glVertexAttrib3s@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindVertexArrayAPPLE +_bluegl_glBindVertexArrayAPPLE: + mov ___blue_glCore_glBindVertexArrayAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferTextureMultiviewOVR -_bluegl_glFramebufferTextureMultiviewOVR: - mov ___blue_glCore_glFramebufferTextureMultiviewOVR@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteVertexArraysAPPLE +_bluegl_glDeleteVertexArraysAPPLE: + mov ___blue_glCore_glDeleteVertexArraysAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glElementPointerAPPLE -_bluegl_glElementPointerAPPLE: - mov ___blue_glCore_glElementPointerAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenVertexArraysAPPLE +_bluegl_glGenVertexArraysAPPLE: + mov ___blue_glCore_glGenVertexArraysAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos4ivMESA -_bluegl_glWindowPos4ivMESA: - mov ___blue_glCore_glWindowPos4ivMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsVertexArrayAPPLE +_bluegl_glIsVertexArrayAPPLE: + mov ___blue_glCore_glIsVertexArrayAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexSubImage3D -_bluegl_glTexSubImage3D: - mov ___blue_glCore_glTexSubImage3D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayRangeAPPLE +_bluegl_glVertexArrayRangeAPPLE: + mov ___blue_glCore_glVertexArrayRangeAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFragmentMaterialfvSGIX -_bluegl_glGetFragmentMaterialfvSGIX: - mov ___blue_glCore_glGetFragmentMaterialfvSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFlushVertexArrayRangeAPPLE +_bluegl_glFlushVertexArrayRangeAPPLE: + mov ___blue_glCore_glFlushVertexArrayRangeAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1dEXT -_bluegl_glProgramUniform1dEXT: - mov ___blue_glCore_glProgramUniform1dEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayParameteriAPPLE +_bluegl_glVertexArrayParameteriAPPLE: + mov ___blue_glCore_glVertexArrayParameteriAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFragmentLightfvSGIX -_bluegl_glGetFragmentLightfvSGIX: - mov ___blue_glCore_glGetFragmentLightfvSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEnableVertexAttribAPPLE +_bluegl_glEnableVertexAttribAPPLE: + mov ___blue_glCore_glEnableVertexAttribAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord2bOES -_bluegl_glTexCoord2bOES: - mov ___blue_glCore_glTexCoord2bOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDisableVertexAttribAPPLE +_bluegl_glDisableVertexAttribAPPLE: + mov ___blue_glCore_glDisableVertexAttribAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3fv -_bluegl_glVertexAttrib3fv: - mov ___blue_glCore_glVertexAttrib3fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsVertexAttribEnabledAPPLE +_bluegl_glIsVertexAttribEnabledAPPLE: + mov ___blue_glCore_glIsVertexAttribEnabledAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMakeNamedBufferNonResidentNV -_bluegl_glMakeNamedBufferNonResidentNV: - mov ___blue_glCore_glMakeNamedBufferNonResidentNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMapVertexAttrib1dAPPLE +_bluegl_glMapVertexAttrib1dAPPLE: + mov ___blue_glCore_glMapVertexAttrib1dAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsProgramARB -_bluegl_glIsProgramARB: - mov ___blue_glCore_glIsProgramARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMapVertexAttrib1fAPPLE +_bluegl_glMapVertexAttrib1fAPPLE: + mov ___blue_glCore_glMapVertexAttrib1fAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glScissorArrayv -_bluegl_glScissorArrayv: - mov ___blue_glCore_glScissorArrayv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMapVertexAttrib2dAPPLE +_bluegl_glMapVertexAttrib2dAPPLE: + mov ___blue_glCore_glMapVertexAttrib2dAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiDrawElementsIndirect -_bluegl_glMultiDrawElementsIndirect: - mov ___blue_glCore_glMultiDrawElementsIndirect@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMapVertexAttrib2fAPPLE +_bluegl_glMapVertexAttrib2fAPPLE: + mov ___blue_glCore_glMapVertexAttrib2fAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMultiTexParameterfvEXT -_bluegl_glGetMultiTexParameterfvEXT: - mov ___blue_glCore_glGetMultiTexParameterfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawBuffersATI +_bluegl_glDrawBuffersATI: + mov ___blue_glCore_glDrawBuffersATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2iARB -_bluegl_glWindowPos2iARB: - mov ___blue_glCore_glWindowPos2iARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glElementPointerATI +_bluegl_glElementPointerATI: + mov ___blue_glCore_glElementPointerATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramStringNV -_bluegl_glGetProgramStringNV: - mov ___blue_glCore_glGetProgramStringNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawElementArrayATI +_bluegl_glDrawElementArrayATI: + mov ___blue_glCore_glDrawElementArrayATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTranslatexOES -_bluegl_glTranslatexOES: - mov ___blue_glCore_glTranslatexOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawRangeElementArrayATI +_bluegl_glDrawRangeElementArrayATI: + mov ___blue_glCore_glDrawRangeElementArrayATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4d -_bluegl_glMultiTexCoord4d: - mov ___blue_glCore_glMultiTexCoord4d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexBumpParameterivATI +_bluegl_glTexBumpParameterivATI: + mov ___blue_glCore_glTexBumpParameterivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorTableParameterfvSGI -_bluegl_glColorTableParameterfvSGI: - mov ___blue_glCore_glColorTableParameterfvSGI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexBumpParameterfvATI +_bluegl_glTexBumpParameterfvATI: + mov ___blue_glCore_glTexBumpParameterfvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord3bvOES -_bluegl_glTexCoord3bvOES: - mov ___blue_glCore_glTexCoord3bvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTexBumpParameterivATI +_bluegl_glGetTexBumpParameterivATI: + mov ___blue_glCore_glGetTexBumpParameterivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2ui64vARB -_bluegl_glUniform2ui64vARB: - mov ___blue_glCore_glUniform2ui64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTexBumpParameterfvATI +_bluegl_glGetTexBumpParameterfvATI: + mov ___blue_glCore_glGetTexBumpParameterfvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixIndexusvARB -_bluegl_glMatrixIndexusvARB: - mov ___blue_glCore_glMatrixIndexusvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenFragmentShadersATI +_bluegl_glGenFragmentShadersATI: + mov ___blue_glCore_glGenFragmentShadersATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMultiTexGenfvEXT -_bluegl_glGetMultiTexGenfvEXT: - mov ___blue_glCore_glGetMultiTexGenfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindFragmentShaderATI +_bluegl_glBindFragmentShaderATI: + mov ___blue_glCore_glBindFragmentShaderATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenerateTextureMipmapEXT -_bluegl_glGenerateTextureMipmapEXT: - mov ___blue_glCore_glGenerateTextureMipmapEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteFragmentShaderATI +_bluegl_glDeleteFragmentShaderATI: + mov ___blue_glCore_glDeleteFragmentShaderATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMapParameterivNV -_bluegl_glGetMapParameterivNV: - mov ___blue_glCore_glGetMapParameterivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBeginFragmentShaderATI +_bluegl_glBeginFragmentShaderATI: + mov ___blue_glCore_glBeginFragmentShaderATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetConvolutionParameterxvOES -_bluegl_glGetConvolutionParameterxvOES: - mov ___blue_glCore_glGetConvolutionParameterxvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEndFragmentShaderATI +_bluegl_glEndFragmentShaderATI: + mov ___blue_glCore_glEndFragmentShaderATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4fvNV -_bluegl_glVertexAttrib4fvNV: - mov ___blue_glCore_glVertexAttrib4fvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPassTexCoordATI +_bluegl_glPassTexCoordATI: + mov ___blue_glCore_glPassTexCoordATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBufferDataARB -_bluegl_glBufferDataARB: - mov ___blue_glCore_glBufferDataARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSampleMapATI +_bluegl_glSampleMapATI: + mov ___blue_glCore_glSampleMapATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos4fMESA -_bluegl_glWindowPos4fMESA: - mov ___blue_glCore_glWindowPos4fMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorFragmentOp1ATI +_bluegl_glColorFragmentOp1ATI: + mov ___blue_glCore_glColorFragmentOp1ATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPushDebugGroup -_bluegl_glPushDebugGroup: - mov ___blue_glCore_glPushDebugGroup@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorFragmentOp2ATI +_bluegl_glColorFragmentOp2ATI: + mov ___blue_glCore_glColorFragmentOp2ATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2fEXT -_bluegl_glProgramUniform2fEXT: - mov ___blue_glCore_glProgramUniform2fEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorFragmentOp3ATI +_bluegl_glColorFragmentOp3ATI: + mov ___blue_glCore_glColorFragmentOp3ATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyTexImage1DEXT -_bluegl_glCopyTexImage1DEXT: - mov ___blue_glCore_glCopyTexImage1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glAlphaFragmentOp1ATI +_bluegl_glAlphaFragmentOp1ATI: + mov ___blue_glCore_glAlphaFragmentOp1ATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTexSubImage2DARB -_bluegl_glCompressedTexSubImage2DARB: - mov ___blue_glCore_glCompressedTexSubImage2DARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glAlphaFragmentOp2ATI +_bluegl_glAlphaFragmentOp2ATI: + mov ___blue_glCore_glAlphaFragmentOp2ATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyColorSubTableEXT -_bluegl_glCopyColorSubTableEXT: - mov ___blue_glCore_glCopyColorSubTableEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glAlphaFragmentOp3ATI +_bluegl_glAlphaFragmentOp3ATI: + mov ___blue_glCore_glAlphaFragmentOp3ATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTransformFeedbackAttribsNV -_bluegl_glTransformFeedbackAttribsNV: - mov ___blue_glCore_glTransformFeedbackAttribsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSetFragmentShaderConstantATI +_bluegl_glSetFragmentShaderConstantATI: + mov ___blue_glCore_glSetFragmentShaderConstantATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixFrustumEXT -_bluegl_glMatrixFrustumEXT: - mov ___blue_glCore_glMatrixFrustumEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMapObjectBufferATI +_bluegl_glMapObjectBufferATI: + mov ___blue_glCore_glMapObjectBufferATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsBufferARB -_bluegl_glIsBufferARB: - mov ___blue_glCore_glIsBufferARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUnmapObjectBufferATI +_bluegl_glUnmapObjectBufferATI: + mov ___blue_glCore_glUnmapObjectBufferATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3fvARB -_bluegl_glUniform3fvARB: - mov ___blue_glCore_glUniform3fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPNTrianglesiATI +_bluegl_glPNTrianglesiATI: + mov ___blue_glCore_glPNTrianglesiATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3dARB -_bluegl_glMultiTexCoord3dARB: - mov ___blue_glCore_glMultiTexCoord3dARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPNTrianglesfATI +_bluegl_glPNTrianglesfATI: + mov ___blue_glCore_glPNTrianglesfATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIndexPointerEXT -_bluegl_glIndexPointerEXT: - mov ___blue_glCore_glIndexPointerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStencilOpSeparateATI +_bluegl_glStencilOpSeparateATI: + mov ___blue_glCore_glStencilOpSeparateATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixLoad3x3fNV -_bluegl_glMatrixLoad3x3fNV: - mov ___blue_glCore_glMatrixLoad3x3fNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStencilFuncSeparateATI +_bluegl_glStencilFuncSeparateATI: + mov ___blue_glCore_glStencilFuncSeparateATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUnmapNamedBufferEXT -_bluegl_glUnmapNamedBufferEXT: - mov ___blue_glCore_glUnmapNamedBufferEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNewObjectBufferATI +_bluegl_glNewObjectBufferATI: + mov ___blue_glCore_glNewObjectBufferATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreateProgramObjectARB -_bluegl_glCreateProgramObjectARB: - mov ___blue_glCore_glCreateProgramObjectARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsObjectBufferATI +_bluegl_glIsObjectBufferATI: + mov ___blue_glCore_glIsObjectBufferATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMapGrid2xOES -_bluegl_glMapGrid2xOES: - mov ___blue_glCore_glMapGrid2xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUpdateObjectBufferATI +_bluegl_glUpdateObjectBufferATI: + mov ___blue_glCore_glUpdateObjectBufferATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexPointerEXT -_bluegl_glVertexPointerEXT: - mov ___blue_glCore_glVertexPointerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetObjectBufferfvATI +_bluegl_glGetObjectBufferfvATI: + mov ___blue_glCore_glGetObjectBufferfvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream4svATI -_bluegl_glVertexStream4svATI: - mov ___blue_glCore_glVertexStream4svATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetObjectBufferivATI +_bluegl_glGetObjectBufferivATI: + mov ___blue_glCore_glGetObjectBufferivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2hvNV -_bluegl_glMultiTexCoord2hvNV: - mov ___blue_glCore_glMultiTexCoord2hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFreeObjectBufferATI +_bluegl_glFreeObjectBufferATI: + mov ___blue_glCore_glFreeObjectBufferATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLabelObjectEXT -_bluegl_glLabelObjectEXT: - mov ___blue_glCore_glLabelObjectEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glArrayObjectATI +_bluegl_glArrayObjectATI: + mov ___blue_glCore_glArrayObjectATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureImage3DMultisampleNV -_bluegl_glTextureImage3DMultisampleNV: - mov ___blue_glCore_glTextureImage3DMultisampleNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetArrayObjectfvATI +_bluegl_glGetArrayObjectfvATI: + mov ___blue_glCore_glGetArrayObjectfvATI@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glMultTransposeMatrixd -_bluegl_glMultTransposeMatrixd: - mov ___blue_glCore_glMultTransposeMatrixd@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glGetArrayObjectivATI +_bluegl_glGetArrayObjectivATI: + mov ___blue_glCore_glGetArrayObjectivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2fARB -_bluegl_glMultiTexCoord2fARB: - mov ___blue_glCore_glMultiTexCoord2fARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVariantArrayObjectATI +_bluegl_glVariantArrayObjectATI: + mov ___blue_glCore_glVariantArrayObjectATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2dARB -_bluegl_glMultiTexCoord2dARB: - mov ___blue_glCore_glMultiTexCoord2dARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVariantArrayObjectfvATI +_bluegl_glGetVariantArrayObjectfvATI: + mov ___blue_glCore_glGetVariantArrayObjectfvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetCombinerOutputParameterfvNV -_bluegl_glGetCombinerOutputParameterfvNV: - mov ___blue_glCore_glGetCombinerOutputParameterfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVariantArrayObjectivATI +_bluegl_glGetVariantArrayObjectivATI: + mov ___blue_glCore_glGetVariantArrayObjectivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetBufferPointerv -_bluegl_glGetBufferPointerv: - mov ___blue_glCore_glGetBufferPointerv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribArrayObjectATI +_bluegl_glVertexAttribArrayObjectATI: + mov ___blue_glCore_glVertexAttribArrayObjectATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1dNV -_bluegl_glVertexAttrib1dNV: - mov ___blue_glCore_glVertexAttrib1dNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribArrayObjectfvATI +_bluegl_glGetVertexAttribArrayObjectfvATI: + mov ___blue_glCore_glGetVertexAttribArrayObjectfvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureView -_bluegl_glTextureView: - mov ___blue_glCore_glTextureView@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribArrayObjectivATI +_bluegl_glGetVertexAttribArrayObjectivATI: + mov ___blue_glCore_glGetVertexAttribArrayObjectivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlitFramebufferEXT -_bluegl_glBlitFramebufferEXT: - mov ___blue_glCore_glBlitFramebufferEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream1sATI +_bluegl_glVertexStream1sATI: + mov ___blue_glCore_glVertexStream1sATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexWeightPointerEXT -_bluegl_glVertexWeightPointerEXT: - mov ___blue_glCore_glVertexWeightPointerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream1svATI +_bluegl_glVertexStream1svATI: + mov ___blue_glCore_glVertexStream1svATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindTextures -_bluegl_glBindTextures: - mov ___blue_glCore_glBindTextures@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream1iATI +_bluegl_glVertexStream1iATI: + mov ___blue_glCore_glVertexStream1iATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearBufferiv -_bluegl_glClearBufferiv: - mov ___blue_glCore_glClearBufferiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream1ivATI +_bluegl_glVertexStream1ivATI: + mov ___blue_glCore_glVertexStream1ivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4ivARB -_bluegl_glMultiTexCoord4ivARB: - mov ___blue_glCore_glMultiTexCoord4ivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream1fATI +_bluegl_glVertexStream1fATI: + mov ___blue_glCore_glVertexStream1fATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetImageHandleNV -_bluegl_glGetImageHandleNV: - mov ___blue_glCore_glGetImageHandleNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream1fvATI +_bluegl_glVertexStream1fvATI: + mov ___blue_glCore_glVertexStream1fvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetDoublei_vEXT -_bluegl_glGetDoublei_vEXT: - mov ___blue_glCore_glGetDoublei_vEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream1dATI +_bluegl_glVertexStream1dATI: + mov ___blue_glCore_glVertexStream1dATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1i64NV -_bluegl_glProgramUniform1i64NV: - mov ___blue_glCore_glProgramUniform1i64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream1dvATI +_bluegl_glVertexStream1dvATI: + mov ___blue_glCore_glVertexStream1dvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN -_bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN: - mov ___blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream2sATI +_bluegl_glVertexStream2sATI: + mov ___blue_glCore_glVertexStream2sATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3s -_bluegl_glWindowPos3s: - mov ___blue_glCore_glWindowPos3s@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream2svATI +_bluegl_glVertexStream2svATI: + mov ___blue_glCore_glVertexStream2svATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4i64ARB -_bluegl_glUniform4i64ARB: - mov ___blue_glCore_glUniform4i64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream2iATI +_bluegl_glVertexStream2iATI: + mov ___blue_glCore_glVertexStream2iATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2dvEXT -_bluegl_glProgramUniform2dvEXT: - mov ___blue_glCore_glProgramUniform2dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream2ivATI +_bluegl_glVertexStream2ivATI: + mov ___blue_glCore_glVertexStream2ivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexSubImage1DEXT -_bluegl_glMultiTexSubImage1DEXT: - mov ___blue_glCore_glMultiTexSubImage1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream2fATI +_bluegl_glVertexStream2fATI: + mov ___blue_glCore_glVertexStream2fATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glHint -_bluegl_glHint: - mov ___blue_glCore_glHint@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream2fvATI +_bluegl_glVertexStream2fvATI: + mov ___blue_glCore_glVertexStream2fvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix4fv -_bluegl_glProgramUniformMatrix4fv: - mov ___blue_glCore_glProgramUniformMatrix4fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream2dATI +_bluegl_glVertexStream2dATI: + mov ___blue_glCore_glVertexStream2dATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord4bvOES -_bluegl_glTexCoord4bvOES: - mov ___blue_glCore_glTexCoord4bvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream2dvATI +_bluegl_glVertexStream2dvATI: + mov ___blue_glCore_glVertexStream2dvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetQueryObjectiv -_bluegl_glGetQueryObjectiv: - mov ___blue_glCore_glGetQueryObjectiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream3sATI +_bluegl_glVertexStream3sATI: + mov ___blue_glCore_glVertexStream3sATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetQueryIndexediv -_bluegl_glGetQueryIndexediv: - mov ___blue_glCore_glGetQueryIndexediv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream3svATI +_bluegl_glVertexStream3svATI: + mov ___blue_glCore_glVertexStream3svATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoordP4ui -_bluegl_glTexCoordP4ui: - mov ___blue_glCore_glTexCoordP4ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream3iATI +_bluegl_glVertexStream3iATI: + mov ___blue_glCore_glVertexStream3iATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream2fvATI -_bluegl_glVertexStream2fvATI: - mov ___blue_glCore_glVertexStream2fvATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream3ivATI +_bluegl_glVertexStream3ivATI: + mov ___blue_glCore_glVertexStream3ivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3fv -_bluegl_glUniform3fv: - mov ___blue_glCore_glUniform3fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream3fATI +_bluegl_glVertexStream3fATI: + mov ___blue_glCore_glVertexStream3fATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix2dv -_bluegl_glUniformMatrix2dv: - mov ___blue_glCore_glUniformMatrix2dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream3fvATI +_bluegl_glVertexStream3fvATI: + mov ___blue_glCore_glVertexStream3fvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsObjectBufferATI -_bluegl_glIsObjectBufferATI: - mov ___blue_glCore_glIsObjectBufferATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream3dATI +_bluegl_glVertexStream3dATI: + mov ___blue_glCore_glVertexStream3dATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribP2uiv -_bluegl_glVertexAttribP2uiv: - mov ___blue_glCore_glVertexAttribP2uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream3dvATI +_bluegl_glVertexStream3dvATI: + mov ___blue_glCore_glVertexStream3dvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompileShader -_bluegl_glCompileShader: - mov ___blue_glCore_glCompileShader@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream4sATI +_bluegl_glVertexStream4sATI: + mov ___blue_glCore_glVertexStream4sATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixScalefEXT -_bluegl_glMatrixScalefEXT: - mov ___blue_glCore_glMatrixScalefEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream4svATI +_bluegl_glVertexStream4svATI: + mov ___blue_glCore_glVertexStream4svATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBinormal3ivEXT -_bluegl_glBinormal3ivEXT: - mov ___blue_glCore_glBinormal3ivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream4iATI +_bluegl_glVertexStream4iATI: + mov ___blue_glCore_glVertexStream4iATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMapAttribParameterivNV -_bluegl_glGetMapAttribParameterivNV: - mov ___blue_glCore_glGetMapAttribParameterivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream4ivATI +_bluegl_glVertexStream4ivATI: + mov ___blue_glCore_glVertexStream4ivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnPixelMapusvARB -_bluegl_glGetnPixelMapusvARB: - mov ___blue_glCore_glGetnPixelMapusvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream4fATI +_bluegl_glVertexStream4fATI: + mov ___blue_glCore_glVertexStream4fATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPerfMonitorCounterStringAMD -_bluegl_glGetPerfMonitorCounterStringAMD: - mov ___blue_glCore_glGetPerfMonitorCounterStringAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream4fvATI +_bluegl_glVertexStream4fvATI: + mov ___blue_glCore_glVertexStream4fvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsTextureHandleResidentNV -_bluegl_glIsTextureHandleResidentNV: - mov ___blue_glCore_glIsTextureHandleResidentNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream4dATI +_bluegl_glVertexStream4dATI: + mov ___blue_glCore_glVertexStream4dATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWaitSync -_bluegl_glWaitSync: - mov ___blue_glCore_glWaitSync@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexStream4dvATI +_bluegl_glVertexStream4dvATI: + mov ___blue_glCore_glVertexStream4dvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenSamplers -_bluegl_glGenSamplers: - mov ___blue_glCore_glGenSamplers@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormalStream3bATI +_bluegl_glNormalStream3bATI: + mov ___blue_glCore_glNormalStream3bATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTextureImage3DEXT -_bluegl_glCompressedTextureImage3DEXT: - mov ___blue_glCore_glCompressedTextureImage3DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormalStream3bvATI +_bluegl_glNormalStream3bvATI: + mov ___blue_glCore_glNormalStream3bvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPerfMonitorCounterInfoAMD -_bluegl_glGetPerfMonitorCounterInfoAMD: - mov ___blue_glCore_glGetPerfMonitorCounterInfoAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormalStream3sATI +_bluegl_glNormalStream3sATI: + mov ___blue_glCore_glNormalStream3sATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2ivARB -_bluegl_glUniform2ivARB: - mov ___blue_glCore_glUniform2ivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormalStream3svATI +_bluegl_glNormalStream3svATI: + mov ___blue_glCore_glNormalStream3svATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2sARB -_bluegl_glVertexAttrib2sARB: - mov ___blue_glCore_glVertexAttrib2sARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormalStream3iATI +_bluegl_glNormalStream3iATI: + mov ___blue_glCore_glNormalStream3iATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawCommandsAddressNV -_bluegl_glDrawCommandsAddressNV: - mov ___blue_glCore_glDrawCommandsAddressNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormalStream3ivATI +_bluegl_glNormalStream3ivATI: + mov ___blue_glCore_glNormalStream3ivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord1hNV -_bluegl_glTexCoord1hNV: - mov ___blue_glCore_glTexCoord1hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormalStream3fATI +_bluegl_glNormalStream3fATI: + mov ___blue_glCore_glNormalStream3fATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFirstPerfQueryIdINTEL -_bluegl_glGetFirstPerfQueryIdINTEL: - mov ___blue_glCore_glGetFirstPerfQueryIdINTEL@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormalStream3fvATI +_bluegl_glNormalStream3fvATI: + mov ___blue_glCore_glNormalStream3fvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferTexture1D -_bluegl_glFramebufferTexture1D: - mov ___blue_glCore_glFramebufferTexture1D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormalStream3dATI +_bluegl_glNormalStream3dATI: + mov ___blue_glCore_glNormalStream3dATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetQueryObjecti64v -_bluegl_glGetQueryObjecti64v: - mov ___blue_glCore_glGetQueryObjecti64v@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormalStream3dvATI +_bluegl_glNormalStream3dvATI: + mov ___blue_glCore_glNormalStream3dvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream1dvATI -_bluegl_glVertexStream1dvATI: - mov ___blue_glCore_glVertexStream1dvATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClientActiveVertexStreamATI +_bluegl_glClientActiveVertexStreamATI: + mov ___blue_glCore_glClientActiveVertexStreamATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoordPointerListIBM -_bluegl_glTexCoordPointerListIBM: - mov ___blue_glCore_glTexCoordPointerListIBM@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexBlendEnviATI +_bluegl_glVertexBlendEnviATI: + mov ___blue_glCore_glVertexBlendEnviATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexImage1D -_bluegl_glTexImage1D: - mov ___blue_glCore_glTexImage1D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexBlendEnvfATI +_bluegl_glVertexBlendEnvfATI: + mov ___blue_glCore_glVertexBlendEnvfATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2fvMESA -_bluegl_glWindowPos2fvMESA: - mov ___blue_glCore_glWindowPos2fvMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformBufferEXT +_bluegl_glUniformBufferEXT: + mov ___blue_glCore_glUniformBufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsFenceNV -_bluegl_glIsFenceNV: - mov ___blue_glCore_glIsFenceNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetUniformBufferSizeEXT +_bluegl_glGetUniformBufferSizeEXT: + mov ___blue_glCore_glGetUniformBufferSizeEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVariantsvEXT -_bluegl_glVariantsvEXT: - mov ___blue_glCore_glVariantsvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetUniformOffsetEXT +_bluegl_glGetUniformOffsetEXT: + mov ___blue_glCore_glGetUniformOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3dEXT -_bluegl_glProgramUniform3dEXT: - mov ___blue_glCore_glProgramUniform3dEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendColorEXT +_bluegl_glBlendColorEXT: + mov ___blue_glCore_glBlendColorEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2iARB -_bluegl_glUniform2iARB: - mov ___blue_glCore_glUniform2iARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendEquationSeparateEXT +_bluegl_glBlendEquationSeparateEXT: + mov ___blue_glCore_glBlendEquationSeparateEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPointParameteri -_bluegl_glPointParameteri: - mov ___blue_glCore_glPointParameteri@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendFuncSeparateEXT +_bluegl_glBlendFuncSeparateEXT: + mov ___blue_glCore_glBlendFuncSeparateEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreateRenderbuffers -_bluegl_glCreateRenderbuffers: - mov ___blue_glCore_glCreateRenderbuffers@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendEquationEXT +_bluegl_glBlendEquationEXT: + mov ___blue_glCore_glBlendEquationEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4i -_bluegl_glUniform4i: - mov ___blue_glCore_glUniform4i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorSubTableEXT +_bluegl_glColorSubTableEXT: + mov ___blue_glCore_glColorSubTableEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteCommandListsNV -_bluegl_glDeleteCommandListsNV: - mov ___blue_glCore_glDeleteCommandListsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyColorSubTableEXT +_bluegl_glCopyColorSubTableEXT: + mov ___blue_glCore_glCopyColorSubTableEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glRequestResidentProgramsNV -_bluegl_glRequestResidentProgramsNV: - mov ___blue_glCore_glRequestResidentProgramsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLockArraysEXT +_bluegl_glLockArraysEXT: + mov ___blue_glCore_glLockArraysEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureSubImage3D -_bluegl_glTextureSubImage3D: - mov ___blue_glCore_glTextureSubImage3D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUnlockArraysEXT +_bluegl_glUnlockArraysEXT: + mov ___blue_glCore_glUnlockArraysEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPixelStorex -_bluegl_glPixelStorex: - mov ___blue_glCore_glPixelStorex@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glConvolutionFilter1DEXT +_bluegl_glConvolutionFilter1DEXT: + mov ___blue_glCore_glConvolutionFilter1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4fARB -_bluegl_glVertexAttrib4fARB: - mov ___blue_glCore_glVertexAttrib4fARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glConvolutionFilter2DEXT +_bluegl_glConvolutionFilter2DEXT: + mov ___blue_glCore_glConvolutionFilter2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribIuiv -_bluegl_glGetVertexAttribIuiv: - mov ___blue_glCore_glGetVertexAttribIuiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glConvolutionParameterfEXT +_bluegl_glConvolutionParameterfEXT: + mov ___blue_glCore_glConvolutionParameterfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1s -_bluegl_glVertexAttrib1s: - mov ___blue_glCore_glVertexAttrib1s@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glConvolutionParameterfvEXT +_bluegl_glConvolutionParameterfvEXT: + mov ___blue_glCore_glConvolutionParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix4x3dv -_bluegl_glProgramUniformMatrix4x3dv: - mov ___blue_glCore_glProgramUniformMatrix4x3dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glConvolutionParameteriEXT +_bluegl_glConvolutionParameteriEXT: + mov ___blue_glCore_glConvolutionParameteriEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glActiveVaryingNV -_bluegl_glActiveVaryingNV: - mov ___blue_glCore_glActiveVaryingNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glConvolutionParameterivEXT +_bluegl_glConvolutionParameterivEXT: + mov ___blue_glCore_glConvolutionParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTangent3sEXT -_bluegl_glTangent3sEXT: - mov ___blue_glCore_glTangent3sEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyConvolutionFilter1DEXT +_bluegl_glCopyConvolutionFilter1DEXT: + mov ___blue_glCore_glCopyConvolutionFilter1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glConvolutionParameteriv -_bluegl_glConvolutionParameteriv: - mov ___blue_glCore_glConvolutionParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyConvolutionFilter2DEXT +_bluegl_glCopyConvolutionFilter2DEXT: + mov ___blue_glCore_glCopyConvolutionFilter2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glQueryCounter -_bluegl_glQueryCounter: - mov ___blue_glCore_glQueryCounter@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetConvolutionFilterEXT +_bluegl_glGetConvolutionFilterEXT: + mov ___blue_glCore_glGetConvolutionFilterEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3d -_bluegl_glProgramUniform3d: - mov ___blue_glCore_glProgramUniform3d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetConvolutionParameterfvEXT +_bluegl_glGetConvolutionParameterfvEXT: + mov ___blue_glCore_glGetConvolutionParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetUniformi64vARB -_bluegl_glGetUniformi64vARB: - mov ___blue_glCore_glGetUniformi64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetConvolutionParameterivEXT +_bluegl_glGetConvolutionParameterivEXT: + mov ___blue_glCore_glGetConvolutionParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnUniformui64vARB -_bluegl_glGetnUniformui64vARB: - mov ___blue_glCore_glGetnUniformui64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetSeparableFilterEXT +_bluegl_glGetSeparableFilterEXT: + mov ___blue_glCore_glGetSeparableFilterEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedProgramLocalParameters4fvEXT -_bluegl_glNamedProgramLocalParameters4fvEXT: - mov ___blue_glCore_glNamedProgramLocalParameters4fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSeparableFilter2DEXT +_bluegl_glSeparableFilter2DEXT: + mov ___blue_glCore_glSeparableFilter2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetShaderSource -_bluegl_glGetShaderSource: - mov ___blue_glCore_glGetShaderSource@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTangent3bEXT +_bluegl_glTangent3bEXT: + mov ___blue_glCore_glTangent3bEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearDepthdNV -_bluegl_glClearDepthdNV: - mov ___blue_glCore_glClearDepthdNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTangent3bvEXT +_bluegl_glTangent3bvEXT: + mov ___blue_glCore_glTangent3bvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColorP3ui -_bluegl_glSecondaryColorP3ui: - mov ___blue_glCore_glSecondaryColorP3ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTangent3dEXT +_bluegl_glTangent3dEXT: + mov ___blue_glCore_glTangent3dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMinmax -_bluegl_glMinmax: - mov ___blue_glCore_glMinmax@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTangent3dvEXT +_bluegl_glTangent3dvEXT: + mov ___blue_glCore_glTangent3dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVariantubvEXT -_bluegl_glVariantubvEXT: - mov ___blue_glCore_glVariantubvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTangent3fEXT +_bluegl_glTangent3fEXT: + mov ___blue_glCore_glTangent3fEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBinormal3sEXT -_bluegl_glBinormal3sEXT: - mov ___blue_glCore_glBinormal3sEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTangent3fvEXT +_bluegl_glTangent3fvEXT: + mov ___blue_glCore_glTangent3fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4d -_bluegl_glVertexAttrib4d: - mov ___blue_glCore_glVertexAttrib4d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTangent3iEXT +_bluegl_glTangent3iEXT: + mov ___blue_glCore_glTangent3iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEndTransformFeedbackEXT -_bluegl_glEndTransformFeedbackEXT: - mov ___blue_glCore_glEndTransformFeedbackEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTangent3ivEXT +_bluegl_glTangent3ivEXT: + mov ___blue_glCore_glTangent3ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexImage2DMultisample -_bluegl_glTexImage2DMultisample: - mov ___blue_glCore_glTexImage2DMultisample@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTangent3sEXT +_bluegl_glTangent3sEXT: + mov ___blue_glCore_glTangent3sEXT@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glLoadMatrixxOES -_bluegl_glLoadMatrixxOES: - mov ___blue_glCore_glLoadMatrixxOES@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glTangent3svEXT +_bluegl_glTangent3svEXT: + mov ___blue_glCore_glTangent3svEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetUniformfv -_bluegl_glGetUniformfv: - mov ___blue_glCore_glGetUniformfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBinormal3bEXT +_bluegl_glBinormal3bEXT: + mov ___blue_glCore_glBinormal3bEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStartInstrumentsSGIX -_bluegl_glStartInstrumentsSGIX: - mov ___blue_glCore_glStartInstrumentsSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBinormal3bvEXT +_bluegl_glBinormal3bvEXT: + mov ___blue_glCore_glBinormal3bvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColor4ubVertex3fvSUN -_bluegl_glColor4ubVertex3fvSUN: - mov ___blue_glCore_glColor4ubVertex3fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBinormal3dEXT +_bluegl_glBinormal3dEXT: + mov ___blue_glCore_glBinormal3dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixLoadTransposefEXT -_bluegl_glMatrixLoadTransposefEXT: - mov ___blue_glCore_glMatrixLoadTransposefEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBinormal3dvEXT +_bluegl_glBinormal3dvEXT: + mov ___blue_glCore_glBinormal3dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetCompressedTexImage -_bluegl_glGetCompressedTexImage: - mov ___blue_glCore_glGetCompressedTexImage@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBinormal3fEXT +_bluegl_glBinormal3fEXT: + mov ___blue_glCore_glBinormal3fEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedProgramLocalParameterdvEXT -_bluegl_glGetNamedProgramLocalParameterdvEXT: - mov ___blue_glCore_glGetNamedProgramLocalParameterdvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBinormal3fvEXT +_bluegl_glBinormal3fvEXT: + mov ___blue_glCore_glBinormal3fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorPointerEXT -_bluegl_glColorPointerEXT: - mov ___blue_glCore_glColorPointerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBinormal3iEXT +_bluegl_glBinormal3iEXT: + mov ___blue_glCore_glBinormal3iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTangent3fEXT -_bluegl_glTangent3fEXT: - mov ___blue_glCore_glTangent3fEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBinormal3ivEXT +_bluegl_glBinormal3ivEXT: + mov ___blue_glCore_glBinormal3ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2dvARB -_bluegl_glWindowPos2dvARB: - mov ___blue_glCore_glWindowPos2dvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBinormal3sEXT +_bluegl_glBinormal3sEXT: + mov ___blue_glCore_glBinormal3sEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetInvariantIntegervEXT -_bluegl_glGetInvariantIntegervEXT: - mov ___blue_glCore_glGetInvariantIntegervEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBinormal3svEXT +_bluegl_glBinormal3svEXT: + mov ___blue_glCore_glBinormal3svEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3fEXT -_bluegl_glProgramUniform3fEXT: - mov ___blue_glCore_glProgramUniform3fEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTangentPointerEXT +_bluegl_glTangentPointerEXT: + mov ___blue_glCore_glTangentPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPixelTexGenSGIX -_bluegl_glPixelTexGenSGIX: - mov ___blue_glCore_glPixelTexGenSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBinormalPointerEXT +_bluegl_glBinormalPointerEXT: + mov ___blue_glCore_glBinormalPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClampColor -_bluegl_glClampColor: - mov ___blue_glCore_glClampColor@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyTexImage1DEXT +_bluegl_glCopyTexImage1DEXT: + mov ___blue_glCore_glCopyTexImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribs4hvNV -_bluegl_glVertexAttribs4hvNV: - mov ___blue_glCore_glVertexAttribs4hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyTexImage2DEXT +_bluegl_glCopyTexImage2DEXT: + mov ___blue_glCore_glCopyTexImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetIntegeri_v -_bluegl_glGetIntegeri_v: - mov ___blue_glCore_glGetIntegeri_v@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyTexSubImage1DEXT +_bluegl_glCopyTexSubImage1DEXT: + mov ___blue_glCore_glCopyTexSubImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteVertexArraysAPPLE -_bluegl_glDeleteVertexArraysAPPLE: - mov ___blue_glCore_glDeleteVertexArraysAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyTexSubImage2DEXT +_bluegl_glCopyTexSubImage2DEXT: + mov ___blue_glCore_glCopyTexSubImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetAttachedShaders -_bluegl_glGetAttachedShaders: - mov ___blue_glCore_glGetAttachedShaders@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyTexSubImage3DEXT +_bluegl_glCopyTexSubImage3DEXT: + mov ___blue_glCore_glCopyTexSubImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEndTransformFeedbackNV -_bluegl_glEndTransformFeedbackNV: - mov ___blue_glCore_glEndTransformFeedbackNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCullParameterdvEXT +_bluegl_glCullParameterdvEXT: + mov ___blue_glCore_glCullParameterdvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetColorTableParameterfvSGI -_bluegl_glGetColorTableParameterfvSGI: - mov ___blue_glCore_glGetColorTableParameterfvSGI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCullParameterfvEXT +_bluegl_glCullParameterfvEXT: + mov ___blue_glCore_glCullParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindBufferBase -_bluegl_glBindBufferBase: - mov ___blue_glCore_glBindBufferBase@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLabelObjectEXT +_bluegl_glLabelObjectEXT: + mov ___blue_glCore_glLabelObjectEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteSync -_bluegl_glDeleteSync: - mov ___blue_glCore_glDeleteSync@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetObjectLabelEXT +_bluegl_glGetObjectLabelEXT: + mov ___blue_glCore_glGetObjectLabelEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTransformFeedbackVarying -_bluegl_glGetTransformFeedbackVarying: - mov ___blue_glCore_glGetTransformFeedbackVarying@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glInsertEventMarkerEXT +_bluegl_glInsertEventMarkerEXT: + mov ___blue_glCore_glInsertEventMarkerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1svARB -_bluegl_glVertexAttrib1svARB: - mov ___blue_glCore_glVertexAttrib1svARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPushGroupMarkerEXT +_bluegl_glPushGroupMarkerEXT: + mov ___blue_glCore_glPushGroupMarkerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyPathNV -_bluegl_glCopyPathNV: - mov ___blue_glCore_glCopyPathNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPopGroupMarkerEXT +_bluegl_glPopGroupMarkerEXT: + mov ___blue_glCore_glPopGroupMarkerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindTransformFeedback -_bluegl_glBindTransformFeedback: - mov ___blue_glCore_glBindTransformFeedback@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDepthBoundsEXT +_bluegl_glDepthBoundsEXT: + mov ___blue_glCore_glDepthBoundsEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4usv -_bluegl_glVertexAttrib4usv: - mov ___blue_glCore_glVertexAttrib4usv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixLoadfEXT +_bluegl_glMatrixLoadfEXT: + mov ___blue_glCore_glMatrixLoadfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedMultiTexImage3DEXT -_bluegl_glCompressedMultiTexImage3DEXT: - mov ___blue_glCore_glCompressedMultiTexImage3DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixLoaddEXT +_bluegl_glMatrixLoaddEXT: + mov ___blue_glCore_glMatrixLoaddEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixLoadTranspose3x3fNV -_bluegl_glMatrixLoadTranspose3x3fNV: - mov ___blue_glCore_glMatrixLoadTranspose3x3fNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixMultfEXT +_bluegl_glMatrixMultfEXT: + mov ___blue_glCore_glMatrixMultfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream1sATI -_bluegl_glVertexStream1sATI: - mov ___blue_glCore_glVertexStream1sATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixMultdEXT +_bluegl_glMatrixMultdEXT: + mov ___blue_glCore_glMatrixMultdEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiDrawArraysIndirectBindlessNV -_bluegl_glMultiDrawArraysIndirectBindlessNV: - mov ___blue_glCore_glMultiDrawArraysIndirectBindlessNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixLoadIdentityEXT +_bluegl_glMatrixLoadIdentityEXT: + mov ___blue_glCore_glMatrixLoadIdentityEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexParameterIuiv -_bluegl_glTexParameterIuiv: - mov ___blue_glCore_glTexParameterIuiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixRotatefEXT +_bluegl_glMatrixRotatefEXT: + mov ___blue_glCore_glMatrixRotatefEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVDPAUFiniNV -_bluegl_glVDPAUFiniNV: - mov ___blue_glCore_glVDPAUFiniNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixRotatedEXT +_bluegl_glMatrixRotatedEXT: + mov ___blue_glCore_glMatrixRotatedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1iv -_bluegl_glUniform1iv: - mov ___blue_glCore_glUniform1iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixScalefEXT +_bluegl_glMatrixScalefEXT: + mov ___blue_glCore_glMatrixScalefEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStencilThenCoverStrokePathNV -_bluegl_glStencilThenCoverStrokePathNV: - mov ___blue_glCore_glStencilThenCoverStrokePathNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixScaledEXT +_bluegl_glMatrixScaledEXT: + mov ___blue_glCore_glMatrixScaledEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3i64vNV -_bluegl_glUniform3i64vNV: - mov ___blue_glCore_glUniform3i64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixTranslatefEXT +_bluegl_glMatrixTranslatefEXT: + mov ___blue_glCore_glMatrixTranslatefEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFragDataLocationEXT -_bluegl_glGetFragDataLocationEXT: - mov ___blue_glCore_glGetFragDataLocationEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixTranslatedEXT +_bluegl_glMatrixTranslatedEXT: + mov ___blue_glCore_glMatrixTranslatedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix4dv -_bluegl_glProgramUniformMatrix4dv: - mov ___blue_glCore_glProgramUniformMatrix4dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixFrustumEXT +_bluegl_glMatrixFrustumEXT: + mov ___blue_glCore_glMatrixFrustumEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnUniformiv -_bluegl_glGetnUniformiv: - mov ___blue_glCore_glGetnUniformiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixOrthoEXT +_bluegl_glMatrixOrthoEXT: + mov ___blue_glCore_glMatrixOrthoEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMapBuffer -_bluegl_glMapBuffer: - mov ___blue_glCore_glMapBuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixPopEXT +_bluegl_glMatrixPopEXT: + mov ___blue_glCore_glMatrixPopEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glScissorIndexed -_bluegl_glScissorIndexed: - mov ___blue_glCore_glScissorIndexed@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixPushEXT +_bluegl_glMatrixPushEXT: + mov ___blue_glCore_glMatrixPushEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3fARB -_bluegl_glUniform3fARB: - mov ___blue_glCore_glUniform3fARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClientAttribDefaultEXT +_bluegl_glClientAttribDefaultEXT: + mov ___blue_glCore_glClientAttribDefaultEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetColorTable -_bluegl_glGetColorTable: - mov ___blue_glCore_glGetColorTable@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPushClientAttribDefaultEXT +_bluegl_glPushClientAttribDefaultEXT: + mov ___blue_glCore_glPushClientAttribDefaultEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferTextureFaceARB -_bluegl_glFramebufferTextureFaceARB: - mov ___blue_glCore_glFramebufferTextureFaceARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureParameterfEXT +_bluegl_glTextureParameterfEXT: + mov ___blue_glCore_glTextureParameterfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBeginTransformFeedbackEXT -_bluegl_glBeginTransformFeedbackEXT: - mov ___blue_glCore_glBeginTransformFeedbackEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureParameterfvEXT +_bluegl_glTextureParameterfvEXT: + mov ___blue_glCore_glTextureParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenFencesNV -_bluegl_glGenFencesNV: - mov ___blue_glCore_glGenFencesNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureParameteriEXT +_bluegl_glTextureParameteriEXT: + mov ___blue_glCore_glTextureParameteriEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexImage2DEXT -_bluegl_glMultiTexImage2DEXT: - mov ___blue_glCore_glMultiTexImage2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureParameterivEXT +_bluegl_glTextureParameterivEXT: + mov ___blue_glCore_glTextureParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2hNV -_bluegl_glVertexAttrib2hNV: - mov ___blue_glCore_glVertexAttrib2hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureImage1DEXT +_bluegl_glTextureImage1DEXT: + mov ___blue_glCore_glTextureImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFragmentLightfvSGIX -_bluegl_glFragmentLightfvSGIX: - mov ___blue_glCore_glFragmentLightfvSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureImage2DEXT +_bluegl_glTextureImage2DEXT: + mov ___blue_glCore_glTextureImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2iv -_bluegl_glProgramUniform2iv: - mov ___blue_glCore_glProgramUniform2iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureSubImage1DEXT +_bluegl_glTextureSubImage1DEXT: + mov ___blue_glCore_glTextureSubImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL4d -_bluegl_glVertexAttribL4d: - mov ___blue_glCore_glVertexAttribL4d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureSubImage2DEXT +_bluegl_glTextureSubImage2DEXT: + mov ___blue_glCore_glTextureSubImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMapBufferARB -_bluegl_glMapBufferARB: - mov ___blue_glCore_glMapBufferARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyTextureImage1DEXT +_bluegl_glCopyTextureImage1DEXT: + mov ___blue_glCore_glCopyTextureImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindVideoCaptureStreamTextureNV -_bluegl_glBindVideoCaptureStreamTextureNV: - mov ___blue_glCore_glBindVideoCaptureStreamTextureNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyTextureImage2DEXT +_bluegl_glCopyTextureImage2DEXT: + mov ___blue_glCore_glCopyTextureImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glConvolutionParameterxvOES -_bluegl_glConvolutionParameterxvOES: - mov ___blue_glCore_glConvolutionParameterxvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyTextureSubImage1DEXT +_bluegl_glCopyTextureSubImage1DEXT: + mov ___blue_glCore_glCopyTextureSubImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexParameterIuivEXT -_bluegl_glTexParameterIuivEXT: - mov ___blue_glCore_glTexParameterIuivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyTextureSubImage2DEXT +_bluegl_glCopyTextureSubImage2DEXT: + mov ___blue_glCore_glCopyTextureSubImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI4ubv -_bluegl_glVertexAttribI4ubv: - mov ___blue_glCore_glVertexAttribI4ubv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTextureImageEXT +_bluegl_glGetTextureImageEXT: + mov ___blue_glCore_glGetTextureImageEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexSubImage1DEXT -_bluegl_glTexSubImage1DEXT: - mov ___blue_glCore_glTexSubImage1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTextureParameterfvEXT +_bluegl_glGetTextureParameterfvEXT: + mov ___blue_glCore_glGetTextureParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureStorage2DEXT -_bluegl_glTextureStorage2DEXT: - mov ___blue_glCore_glTextureStorage2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTextureParameterivEXT +_bluegl_glGetTextureParameterivEXT: + mov ___blue_glCore_glGetTextureParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexSubImage3DEXT -_bluegl_glTexSubImage3DEXT: - mov ___blue_glCore_glTexSubImage3DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTextureLevelParameterfvEXT +_bluegl_glGetTextureLevelParameterfvEXT: + mov ___blue_glCore_glGetTextureLevelParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertex2xvOES -_bluegl_glVertex2xvOES: - mov ___blue_glCore_glVertex2xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTextureLevelParameterivEXT +_bluegl_glGetTextureLevelParameterivEXT: + mov ___blue_glCore_glGetTextureLevelParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMultiTexImageEXT -_bluegl_glGetMultiTexImageEXT: - mov ___blue_glCore_glGetMultiTexImageEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureImage3DEXT +_bluegl_glTextureImage3DEXT: + mov ___blue_glCore_glTextureImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormalStream3ivATI -_bluegl_glNormalStream3ivATI: - mov ___blue_glCore_glNormalStream3ivATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureSubImage3DEXT +_bluegl_glTextureSubImage3DEXT: + mov ___blue_glCore_glTextureSubImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedBufferPointerv -_bluegl_glGetNamedBufferPointerv: - mov ___blue_glCore_glGetNamedBufferPointerv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyTextureSubImage3DEXT +_bluegl_glCopyTextureSubImage3DEXT: + mov ___blue_glCore_glCopyTextureSubImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexBuffer -_bluegl_glTexBuffer: - mov ___blue_glCore_glTexBuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindMultiTextureEXT +_bluegl_glBindMultiTextureEXT: + mov ___blue_glCore_glBindMultiTextureEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCombinerInputNV -_bluegl_glCombinerInputNV: - mov ___blue_glCore_glCombinerInputNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoordPointerEXT +_bluegl_glMultiTexCoordPointerEXT: + mov ___blue_glCore_glMultiTexCoordPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1dARB -_bluegl_glVertexAttrib1dARB: - mov ___blue_glCore_glVertexAttrib1dARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexEnvfEXT +_bluegl_glMultiTexEnvfEXT: + mov ___blue_glCore_glMultiTexEnvfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexP3ui -_bluegl_glVertexP3ui: - mov ___blue_glCore_glVertexP3ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexEnvfvEXT +_bluegl_glMultiTexEnvfvEXT: + mov ___blue_glCore_glMultiTexEnvfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixMult3x2fNV -_bluegl_glMatrixMult3x2fNV: - mov ___blue_glCore_glMatrixMult3x2fNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexEnviEXT +_bluegl_glMultiTexEnviEXT: + mov ___blue_glCore_glMultiTexEnviEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedFramebufferTexture2DEXT -_bluegl_glNamedFramebufferTexture2DEXT: - mov ___blue_glCore_glNamedFramebufferTexture2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexEnvivEXT +_bluegl_glMultiTexEnvivEXT: + mov ___blue_glCore_glMultiTexEnvivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureLevelParameteriv -_bluegl_glGetTextureLevelParameteriv: - mov ___blue_glCore_glGetTextureLevelParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexGendEXT +_bluegl_glMultiTexGendEXT: + mov ___blue_glCore_glMultiTexGendEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPixelMapx -_bluegl_glPixelMapx: - mov ___blue_glCore_glPixelMapx@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexGendvEXT +_bluegl_glMultiTexGendvEXT: + mov ___blue_glCore_glMultiTexGendvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendFuncSeparatei -_bluegl_glBlendFuncSeparatei: - mov ___blue_glCore_glBlendFuncSeparatei@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexGenfEXT +_bluegl_glMultiTexGenfEXT: + mov ___blue_glCore_glMultiTexGenfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTessellationModeAMD -_bluegl_glTessellationModeAMD: - mov ___blue_glCore_glTessellationModeAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexGenfvEXT +_bluegl_glMultiTexGenfvEXT: + mov ___blue_glCore_glMultiTexGenfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramEnvParametersI4uivNV -_bluegl_glProgramEnvParametersI4uivNV: - mov ___blue_glCore_glProgramEnvParametersI4uivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexGeniEXT +_bluegl_glMultiTexGeniEXT: + mov ___blue_glCore_glMultiTexGeniEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetColorTableParameterfvEXT -_bluegl_glGetColorTableParameterfvEXT: - mov ___blue_glCore_glGetColorTableParameterfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexGenivEXT +_bluegl_glMultiTexGenivEXT: + mov ___blue_glCore_glMultiTexGenivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI1uiEXT -_bluegl_glVertexAttribI1uiEXT: - mov ___blue_glCore_glVertexAttribI1uiEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMultiTexEnvfvEXT +_bluegl_glGetMultiTexEnvfvEXT: + mov ___blue_glCore_glGetMultiTexEnvfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPrioritizeTexturesEXT -_bluegl_glPrioritizeTexturesEXT: - mov ___blue_glCore_glPrioritizeTexturesEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMultiTexEnvivEXT +_bluegl_glGetMultiTexEnvivEXT: + mov ___blue_glCore_glGetMultiTexEnvivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1i64vNV -_bluegl_glProgramUniform1i64vNV: - mov ___blue_glCore_glProgramUniform1i64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMultiTexGendvEXT +_bluegl_glGetMultiTexGendvEXT: + mov ___blue_glCore_glGetMultiTexGendvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureParameteriv -_bluegl_glGetTextureParameteriv: - mov ___blue_glCore_glGetTextureParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMultiTexGenfvEXT +_bluegl_glGetMultiTexGenfvEXT: + mov ___blue_glCore_glGetMultiTexGenfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTransformFeedbackiv -_bluegl_glGetTransformFeedbackiv: - mov ___blue_glCore_glGetTransformFeedbackiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMultiTexGenivEXT +_bluegl_glGetMultiTexGenivEXT: + mov ___blue_glCore_glGetMultiTexGenivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiDrawArraysIndirectBindlessCountNV -_bluegl_glMultiDrawArraysIndirectBindlessCountNV: - mov ___blue_glCore_glMultiDrawArraysIndirectBindlessCountNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexParameteriEXT +_bluegl_glMultiTexParameteriEXT: + mov ___blue_glCore_glMultiTexParameteriEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUseShaderProgramEXT -_bluegl_glUseShaderProgramEXT: - mov ___blue_glCore_glUseShaderProgramEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexParameterivEXT +_bluegl_glMultiTexParameterivEXT: + mov ___blue_glCore_glMultiTexParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteTransformFeedbacks -_bluegl_glDeleteTransformFeedbacks: - mov ___blue_glCore_glDeleteTransformFeedbacks@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexParameterfEXT +_bluegl_glMultiTexParameterfEXT: + mov ___blue_glCore_glMultiTexParameterfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCoverageModulationTableNV -_bluegl_glCoverageModulationTableNV: - mov ___blue_glCore_glCoverageModulationTableNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexParameterfvEXT +_bluegl_glMultiTexParameterfvEXT: + mov ___blue_glCore_glMultiTexParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1d -_bluegl_glMultiTexCoord1d: - mov ___blue_glCore_glMultiTexCoord1d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexImage1DEXT +_bluegl_glMultiTexImage1DEXT: + mov ___blue_glCore_glMultiTexImage1DEXT@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.private_extern _bluegl_glMultiTexImage2DEXT +_bluegl_glMultiTexImage2DEXT: + mov ___blue_glCore_glMultiTexImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTexLevelParameteriv -_bluegl_glGetTexLevelParameteriv: - mov ___blue_glCore_glGetTexLevelParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexSubImage1DEXT +_bluegl_glMultiTexSubImage1DEXT: + mov ___blue_glCore_glMultiTexSubImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4ui -_bluegl_glProgramUniform4ui: - mov ___blue_glCore_glProgramUniform4ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexSubImage2DEXT +_bluegl_glMultiTexSubImage2DEXT: + mov ___blue_glCore_glMultiTexSubImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4iv -_bluegl_glProgramUniform4iv: - mov ___blue_glCore_glProgramUniform4iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyMultiTexImage1DEXT +_bluegl_glCopyMultiTexImage1DEXT: + mov ___blue_glCore_glCopyMultiTexImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTangent3fvEXT -_bluegl_glTangent3fvEXT: - mov ___blue_glCore_glTangent3fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyMultiTexImage2DEXT +_bluegl_glCopyMultiTexImage2DEXT: + mov ___blue_glCore_glCopyMultiTexImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glViewportIndexedfv -_bluegl_glViewportIndexedfv: - mov ___blue_glCore_glViewportIndexedfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyMultiTexSubImage1DEXT +_bluegl_glCopyMultiTexSubImage1DEXT: + mov ___blue_glCore_glCopyMultiTexSubImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSampleMaski -_bluegl_glSampleMaski: - mov ___blue_glCore_glSampleMaski@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyMultiTexSubImage2DEXT +_bluegl_glCopyMultiTexSubImage2DEXT: + mov ___blue_glCore_glCopyMultiTexSubImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix4x3dvEXT -_bluegl_glProgramUniformMatrix4x3dvEXT: - mov ___blue_glCore_glProgramUniformMatrix4x3dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMultiTexImageEXT +_bluegl_glGetMultiTexImageEXT: + mov ___blue_glCore_glGetMultiTexImageEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompileShaderARB -_bluegl_glCompileShaderARB: - mov ___blue_glCore_glCompileShaderARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMultiTexParameterfvEXT +_bluegl_glGetMultiTexParameterfvEXT: + mov ___blue_glCore_glGetMultiTexParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4ui64ARB -_bluegl_glUniform4ui64ARB: - mov ___blue_glCore_glUniform4ui64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMultiTexParameterivEXT +_bluegl_glGetMultiTexParameterivEXT: + mov ___blue_glCore_glGetMultiTexParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord3xOES -_bluegl_glTexCoord3xOES: - mov ___blue_glCore_glTexCoord3xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMultiTexLevelParameterfvEXT +_bluegl_glGetMultiTexLevelParameterfvEXT: + mov ___blue_glCore_glGetMultiTexLevelParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetInternalformativ -_bluegl_glGetInternalformativ: - mov ___blue_glCore_glGetInternalformativ@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMultiTexLevelParameterivEXT +_bluegl_glGetMultiTexLevelParameterivEXT: + mov ___blue_glCore_glGetMultiTexLevelParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glObjectPtrLabel -_bluegl_glObjectPtrLabel: - mov ___blue_glCore_glObjectPtrLabel@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexImage3DEXT +_bluegl_glMultiTexImage3DEXT: + mov ___blue_glCore_glMultiTexImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormal3hvNV -_bluegl_glNormal3hvNV: - mov ___blue_glCore_glNormal3hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexSubImage3DEXT +_bluegl_glMultiTexSubImage3DEXT: + mov ___blue_glCore_glMultiTexSubImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1uiv -_bluegl_glProgramUniform1uiv: - mov ___blue_glCore_glProgramUniform1uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyMultiTexSubImage3DEXT +_bluegl_glCopyMultiTexSubImage3DEXT: + mov ___blue_glCore_glCopyMultiTexSubImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenFragmentShadersATI -_bluegl_glGenFragmentShadersATI: - mov ___blue_glCore_glGenFragmentShadersATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEnableClientStateIndexedEXT +_bluegl_glEnableClientStateIndexedEXT: + mov ___blue_glCore_glEnableClientStateIndexedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord2hvNV -_bluegl_glTexCoord2hvNV: - mov ___blue_glCore_glTexCoord2hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDisableClientStateIndexedEXT +_bluegl_glDisableClientStateIndexedEXT: + mov ___blue_glCore_glDisableClientStateIndexedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFinishAsyncSGIX -_bluegl_glFinishAsyncSGIX: - mov ___blue_glCore_glFinishAsyncSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFloatIndexedvEXT +_bluegl_glGetFloatIndexedvEXT: + mov ___blue_glCore_glGetFloatIndexedvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEnableVertexAttribArrayARB -_bluegl_glEnableVertexAttribArrayARB: - mov ___blue_glCore_glEnableVertexAttribArrayARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetDoubleIndexedvEXT +_bluegl_glGetDoubleIndexedvEXT: + mov ___blue_glCore_glGetDoubleIndexedvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteSamplers -_bluegl_glDeleteSamplers: - mov ___blue_glCore_glDeleteSamplers@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPointerIndexedvEXT +_bluegl_glGetPointerIndexedvEXT: + mov ___blue_glCore_glGetPointerIndexedvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1fvARB -_bluegl_glVertexAttrib1fvARB: - mov ___blue_glCore_glVertexAttrib1fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEnableIndexedEXT +_bluegl_glEnableIndexedEXT: + mov ___blue_glCore_glEnableIndexedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnUniformivARB -_bluegl_glGetnUniformivARB: - mov ___blue_glCore_glGetnUniformivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDisableIndexedEXT +_bluegl_glDisableIndexedEXT: + mov ___blue_glCore_glDisableIndexedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLoadTransposeMatrixd -_bluegl_glLoadTransposeMatrixd: - mov ___blue_glCore_glLoadTransposeMatrixd@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsEnabledIndexedEXT +_bluegl_glIsEnabledIndexedEXT: + mov ___blue_glCore_glIsEnabledIndexedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramParameteri -_bluegl_glProgramParameteri: - mov ___blue_glCore_glProgramParameteri@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetIntegerIndexedvEXT +_bluegl_glGetIntegerIndexedvEXT: + mov ___blue_glCore_glGetIntegerIndexedvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreateShader -_bluegl_glCreateShader: - mov ___blue_glCore_glCreateShader@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetBooleanIndexedvEXT +_bluegl_glGetBooleanIndexedvEXT: + mov ___blue_glCore_glGetBooleanIndexedvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFragmentCoverageColorNV -_bluegl_glFragmentCoverageColorNV: - mov ___blue_glCore_glFragmentCoverageColorNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTextureImage3DEXT +_bluegl_glCompressedTextureImage3DEXT: + mov ___blue_glCore_glCompressedTextureImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream3dvATI -_bluegl_glVertexStream3dvATI: - mov ___blue_glCore_glVertexStream3dvATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTextureImage2DEXT +_bluegl_glCompressedTextureImage2DEXT: + mov ___blue_glCore_glCompressedTextureImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformHandleui64ARB -_bluegl_glUniformHandleui64ARB: - mov ___blue_glCore_glUniformHandleui64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTextureImage1DEXT +_bluegl_glCompressedTextureImage1DEXT: + mov ___blue_glCore_glCompressedTextureImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVaryingLocationNV -_bluegl_glGetVaryingLocationNV: - mov ___blue_glCore_glGetVaryingLocationNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTextureSubImage3DEXT +_bluegl_glCompressedTextureSubImage3DEXT: + mov ___blue_glCore_glCompressedTextureSubImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) .private_extern _bluegl_glCompressedTextureSubImage2DEXT @@ -7914,1914 +7938,1904 @@ _bluegl_glCompressedTextureSubImage2DEXT: mov ___blue_glCore_glCompressedTextureSubImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTangent3dEXT -_bluegl_glTangent3dEXT: - mov ___blue_glCore_glTangent3dEXT@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.private_extern _bluegl_glGetNamedBufferPointervEXT -_bluegl_glGetNamedBufferPointervEXT: - mov ___blue_glCore_glGetNamedBufferPointervEXT@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.private_extern _bluegl_glVertex2bvOES -_bluegl_glVertex2bvOES: - mov ___blue_glCore_glVertex2bvOES@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.private_extern _bluegl_glProgramBufferParametersIuivNV -_bluegl_glProgramBufferParametersIuivNV: - mov ___blue_glCore_glProgramBufferParametersIuivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedTextureSubImage1DEXT +_bluegl_glCompressedTextureSubImage1DEXT: + mov ___blue_glCore_glCompressedTextureSubImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnTexImageARB -_bluegl_glGetnTexImageARB: - mov ___blue_glCore_glGetnTexImageARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetCompressedTextureImageEXT +_bluegl_glGetCompressedTextureImageEXT: + mov ___blue_glCore_glGetCompressedTextureImageEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSetFenceNV -_bluegl_glSetFenceNV: - mov ___blue_glCore_glSetFenceNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedMultiTexImage3DEXT +_bluegl_glCompressedMultiTexImage3DEXT: + mov ___blue_glCore_glCompressedMultiTexImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathParameterfvNV -_bluegl_glPathParameterfvNV: - mov ___blue_glCore_glPathParameterfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedMultiTexImage2DEXT +_bluegl_glCompressedMultiTexImage2DEXT: + mov ___blue_glCore_glCompressedMultiTexImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribFormat -_bluegl_glVertexAttribFormat: - mov ___blue_glCore_glVertexAttribFormat@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedMultiTexImage1DEXT +_bluegl_glCompressedMultiTexImage1DEXT: + mov ___blue_glCore_glCompressedMultiTexImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glConservativeRasterParameterfNV -_bluegl_glConservativeRasterParameterfNV: - mov ___blue_glCore_glConservativeRasterParameterfNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedMultiTexSubImage3DEXT +_bluegl_glCompressedMultiTexSubImage3DEXT: + mov ___blue_glCore_glCompressedMultiTexSubImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribIuivEXT -_bluegl_glGetVertexAttribIuivEXT: - mov ___blue_glCore_glGetVertexAttribIuivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedMultiTexSubImage2DEXT +_bluegl_glCompressedMultiTexSubImage2DEXT: + mov ___blue_glCore_glCompressedMultiTexSubImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindMultiTextureEXT -_bluegl_glBindMultiTextureEXT: - mov ___blue_glCore_glBindMultiTextureEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompressedMultiTexSubImage1DEXT +_bluegl_glCompressedMultiTexSubImage1DEXT: + mov ___blue_glCore_glCompressedMultiTexSubImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMapControlPointsNV -_bluegl_glMapControlPointsNV: - mov ___blue_glCore_glMapControlPointsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetCompressedMultiTexImageEXT +_bluegl_glGetCompressedMultiTexImageEXT: + mov ___blue_glCore_glGetCompressedMultiTexImageEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4Nsv -_bluegl_glVertexAttrib4Nsv: - mov ___blue_glCore_glVertexAttrib4Nsv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixLoadTransposefEXT +_bluegl_glMatrixLoadTransposefEXT: + mov ___blue_glCore_glMatrixLoadTransposefEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedMultiTexImage2DEXT -_bluegl_glCompressedMultiTexImage2DEXT: - mov ___blue_glCore_glCompressedMultiTexImage2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixLoadTransposedEXT +_bluegl_glMatrixLoadTransposedEXT: + mov ___blue_glCore_glMatrixLoadTransposedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsNamedBufferResidentNV -_bluegl_glIsNamedBufferResidentNV: - mov ___blue_glCore_glIsNamedBufferResidentNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixMultTransposefEXT +_bluegl_glMatrixMultTransposefEXT: + mov ___blue_glCore_glMatrixMultTransposefEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLoadProgramNV -_bluegl_glLoadProgramNV: - mov ___blue_glCore_glLoadProgramNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixMultTransposedEXT +_bluegl_glMatrixMultTransposedEXT: + mov ___blue_glCore_glMatrixMultTransposedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearColor -_bluegl_glClearColor: - mov ___blue_glCore_glClearColor@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedBufferDataEXT +_bluegl_glNamedBufferDataEXT: + mov ___blue_glCore_glNamedBufferDataEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2uivEXT -_bluegl_glUniform2uivEXT: - mov ___blue_glCore_glUniform2uivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedBufferSubDataEXT +_bluegl_glNamedBufferSubDataEXT: + mov ___blue_glCore_glNamedBufferSubDataEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexGenfEXT -_bluegl_glMultiTexGenfEXT: - mov ___blue_glCore_glMultiTexGenfEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMapNamedBufferEXT +_bluegl_glMapNamedBufferEXT: + mov ___blue_glCore_glMapNamedBufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetUniformdv -_bluegl_glGetUniformdv: - mov ___blue_glCore_glGetUniformdv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUnmapNamedBufferEXT +_bluegl_glUnmapNamedBufferEXT: + mov ___blue_glCore_glUnmapNamedBufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenRenderbuffersEXT -_bluegl_glGenRenderbuffersEXT: - mov ___blue_glCore_glGenRenderbuffersEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedBufferParameterivEXT +_bluegl_glGetNamedBufferParameterivEXT: + mov ___blue_glCore_glGetNamedBufferParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMultisamplefv -_bluegl_glGetMultisamplefv: - mov ___blue_glCore_glGetMultisamplefv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedBufferPointervEXT +_bluegl_glGetNamedBufferPointervEXT: + mov ___blue_glCore_glGetNamedBufferPointervEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMapNamedBuffer -_bluegl_glMapNamedBuffer: - mov ___blue_glCore_glMapNamedBuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedBufferSubDataEXT +_bluegl_glGetNamedBufferSubDataEXT: + mov ___blue_glCore_glGetNamedBufferSubDataEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteFramebuffersEXT -_bluegl_glDeleteFramebuffersEXT: - mov ___blue_glCore_glDeleteFramebuffersEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1fEXT +_bluegl_glProgramUniform1fEXT: + mov ___blue_glCore_glProgramUniform1fEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI4usvEXT -_bluegl_glVertexAttribI4usvEXT: - mov ___blue_glCore_glVertexAttribI4usvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2fEXT +_bluegl_glProgramUniform2fEXT: + mov ___blue_glCore_glProgramUniform2fEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3hNV -_bluegl_glSecondaryColor3hNV: - mov ___blue_glCore_glSecondaryColor3hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3fEXT +_bluegl_glProgramUniform3fEXT: + mov ___blue_glCore_glProgramUniform3fEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenerateMipmap -_bluegl_glGenerateMipmap: - mov ___blue_glCore_glGenerateMipmap@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4fEXT +_bluegl_glProgramUniform4fEXT: + mov ___blue_glCore_glProgramUniform4fEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramEnvParameterI4uivNV -_bluegl_glProgramEnvParameterI4uivNV: - mov ___blue_glCore_glProgramEnvParameterI4uivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1iEXT +_bluegl_glProgramUniform1iEXT: + mov ___blue_glCore_glProgramUniform1iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSeparableFilter2D -_bluegl_glSeparableFilter2D: - mov ___blue_glCore_glSeparableFilter2D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2iEXT +_bluegl_glProgramUniform2iEXT: + mov ___blue_glCore_glProgramUniform2iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFogCoorddEXT -_bluegl_glFogCoorddEXT: - mov ___blue_glCore_glFogCoorddEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3iEXT +_bluegl_glProgramUniform3iEXT: + mov ___blue_glCore_glProgramUniform3iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPerfCounterInfoINTEL -_bluegl_glGetPerfCounterInfoINTEL: - mov ___blue_glCore_glGetPerfCounterInfoINTEL@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4iEXT +_bluegl_glProgramUniform4iEXT: + mov ___blue_glCore_glProgramUniform4iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4uiv -_bluegl_glUniform4uiv: - mov ___blue_glCore_glUniform4uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1fvEXT +_bluegl_glProgramUniform1fvEXT: + mov ___blue_glCore_glProgramUniform1fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL2dv -_bluegl_glVertexAttribL2dv: - mov ___blue_glCore_glVertexAttribL2dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2fvEXT +_bluegl_glProgramUniform2fvEXT: + mov ___blue_glCore_glProgramUniform2fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1dv -_bluegl_glUniform1dv: - mov ___blue_glCore_glUniform1dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3fvEXT +_bluegl_glProgramUniform3fvEXT: + mov ___blue_glCore_glProgramUniform3fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL1ui64ARB -_bluegl_glVertexAttribL1ui64ARB: - mov ___blue_glCore_glVertexAttribL1ui64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4fvEXT +_bluegl_glProgramUniform4fvEXT: + mov ___blue_glCore_glProgramUniform4fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEndPerfQueryINTEL -_bluegl_glEndPerfQueryINTEL: - mov ___blue_glCore_glEndPerfQueryINTEL@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1ivEXT +_bluegl_glProgramUniform1ivEXT: + mov ___blue_glCore_glProgramUniform1ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayEdgeFlagOffsetEXT -_bluegl_glVertexArrayEdgeFlagOffsetEXT: - mov ___blue_glCore_glVertexArrayEdgeFlagOffsetEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2ivEXT +_bluegl_glProgramUniform2ivEXT: + mov ___blue_glCore_glProgramUniform2ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1dv -_bluegl_glVertexAttrib1dv: - mov ___blue_glCore_glVertexAttrib1dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3ivEXT +_bluegl_glProgramUniform3ivEXT: + mov ___blue_glCore_glProgramUniform3ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix2dvEXT -_bluegl_glProgramUniformMatrix2dvEXT: - mov ___blue_glCore_glProgramUniformMatrix2dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4ivEXT +_bluegl_glProgramUniform4ivEXT: + mov ___blue_glCore_glProgramUniform4ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDepthRange -_bluegl_glDepthRange: - mov ___blue_glCore_glDepthRange@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix2fvEXT +_bluegl_glProgramUniformMatrix2fvEXT: + mov ___blue_glCore_glProgramUniformMatrix2fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCombinerParameterfNV -_bluegl_glCombinerParameterfNV: - mov ___blue_glCore_glCombinerParameterfNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix3fvEXT +_bluegl_glProgramUniformMatrix3fvEXT: + mov ___blue_glCore_glProgramUniformMatrix3fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVariantArrayObjectATI -_bluegl_glVariantArrayObjectATI: - mov ___blue_glCore_glVariantArrayObjectATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix4fvEXT +_bluegl_glProgramUniformMatrix4fvEXT: + mov ___blue_glCore_glProgramUniformMatrix4fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteBuffersARB -_bluegl_glDeleteBuffersARB: - mov ___blue_glCore_glDeleteBuffersARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix2x3fvEXT +_bluegl_glProgramUniformMatrix2x3fvEXT: + mov ___blue_glCore_glProgramUniformMatrix2x3fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFragmentLightiSGIX -_bluegl_glFragmentLightiSGIX: - mov ___blue_glCore_glFragmentLightiSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix3x2fvEXT +_bluegl_glProgramUniformMatrix3x2fvEXT: + mov ___blue_glCore_glProgramUniformMatrix3x2fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetSamplerParameterIiv -_bluegl_glGetSamplerParameterIiv: - mov ___blue_glCore_glGetSamplerParameterIiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix2x4fvEXT +_bluegl_glProgramUniformMatrix2x4fvEXT: + mov ___blue_glCore_glProgramUniformMatrix2x4fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glImportSyncEXT -_bluegl_glImportSyncEXT: - mov ___blue_glCore_glImportSyncEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix4x2fvEXT +_bluegl_glProgramUniformMatrix4x2fvEXT: + mov ___blue_glCore_glProgramUniformMatrix4x2fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribivARB -_bluegl_glGetVertexAttribivARB: - mov ___blue_glCore_glGetVertexAttribivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix3x4fvEXT +_bluegl_glProgramUniformMatrix3x4fvEXT: + mov ___blue_glCore_glProgramUniformMatrix3x4fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI2ui -_bluegl_glVertexAttribI2ui: - mov ___blue_glCore_glVertexAttribI2ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix4x3fvEXT +_bluegl_glProgramUniformMatrix4x3fvEXT: + mov ___blue_glCore_glProgramUniformMatrix4x3fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetObjectParameterivARB -_bluegl_glGetObjectParameterivARB: - mov ___blue_glCore_glGetObjectParameterivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureBufferEXT +_bluegl_glTextureBufferEXT: + mov ___blue_glCore_glTextureBufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEnableClientStateiEXT -_bluegl_glEnableClientStateiEXT: - mov ___blue_glCore_glEnableClientStateiEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexBufferEXT +_bluegl_glMultiTexBufferEXT: + mov ___blue_glCore_glMultiTexBufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnUniformi64vARB -_bluegl_glGetnUniformi64vARB: - mov ___blue_glCore_glGetnUniformi64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureParameterIivEXT +_bluegl_glTextureParameterIivEXT: + mov ___blue_glCore_glTextureParameterIivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteFencesAPPLE -_bluegl_glDeleteFencesAPPLE: - mov ___blue_glCore_glDeleteFencesAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureParameterIuivEXT +_bluegl_glTextureParameterIuivEXT: + mov ___blue_glCore_glTextureParameterIuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTransformFeedbackBufferRange -_bluegl_glTransformFeedbackBufferRange: - mov ___blue_glCore_glTransformFeedbackBufferRange@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTextureParameterIivEXT +_bluegl_glGetTextureParameterIivEXT: + mov ___blue_glCore_glGetTextureParameterIivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2fvEXT -_bluegl_glProgramUniform2fvEXT: - mov ___blue_glCore_glProgramUniform2fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTextureParameterIuivEXT +_bluegl_glGetTextureParameterIuivEXT: + mov ___blue_glCore_glGetTextureParameterIuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferTextureLayerARB -_bluegl_glFramebufferTextureLayerARB: - mov ___blue_glCore_glFramebufferTextureLayerARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexParameterIivEXT +_bluegl_glMultiTexParameterIivEXT: + mov ___blue_glCore_glMultiTexParameterIivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribLFormatNV -_bluegl_glVertexAttribLFormatNV: - mov ___blue_glCore_glVertexAttribLFormatNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexParameterIuivEXT +_bluegl_glMultiTexParameterIuivEXT: + mov ___blue_glCore_glMultiTexParameterIuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2fvARB -_bluegl_glVertexAttrib2fvARB: - mov ___blue_glCore_glVertexAttrib2fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMultiTexParameterIivEXT +_bluegl_glGetMultiTexParameterIivEXT: + mov ___blue_glCore_glGetMultiTexParameterIivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glWindowPos4fvMESA -_bluegl_glWindowPos4fvMESA: - mov ___blue_glCore_glWindowPos4fvMESA@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glGetMultiTexParameterIuivEXT +_bluegl_glGetMultiTexParameterIuivEXT: + mov ___blue_glCore_glGetMultiTexParameterIuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMakeNamedBufferResidentNV -_bluegl_glMakeNamedBufferResidentNV: - mov ___blue_glCore_glMakeNamedBufferResidentNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1uiEXT +_bluegl_glProgramUniform1uiEXT: + mov ___blue_glCore_glProgramUniform1uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix3x4fvEXT -_bluegl_glProgramUniformMatrix3x4fvEXT: - mov ___blue_glCore_glProgramUniformMatrix3x4fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2uiEXT +_bluegl_glProgramUniform2uiEXT: + mov ___blue_glCore_glProgramUniform2uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSamplePatternSGIS -_bluegl_glSamplePatternSGIS: - mov ___blue_glCore_glSamplePatternSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3uiEXT +_bluegl_glProgramUniform3uiEXT: + mov ___blue_glCore_glProgramUniform3uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVDPAUGetSurfaceivNV -_bluegl_glVDPAUGetSurfaceivNV: - mov ___blue_glCore_glVDPAUGetSurfaceivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4uiEXT +_bluegl_glProgramUniform4uiEXT: + mov ___blue_glCore_glProgramUniform4uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix4x2fvEXT -_bluegl_glProgramUniformMatrix4x2fvEXT: - mov ___blue_glCore_glProgramUniformMatrix4x2fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1uivEXT +_bluegl_glProgramUniform1uivEXT: + mov ___blue_glCore_glProgramUniform1uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeuiColor3fVertex3fvSUN -_bluegl_glReplacementCodeuiColor3fVertex3fvSUN: - mov ___blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2uivEXT +_bluegl_glProgramUniform2uivEXT: + mov ___blue_glCore_glProgramUniform2uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3sMESA -_bluegl_glWindowPos3sMESA: - mov ___blue_glCore_glWindowPos3sMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3uivEXT +_bluegl_glProgramUniform3uivEXT: + mov ___blue_glCore_glProgramUniform3uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexGenxOES -_bluegl_glTexGenxOES: - mov ___blue_glCore_glTexGenxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4uivEXT +_bluegl_glProgramUniform4uivEXT: + mov ___blue_glCore_glProgramUniform4uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4dNV -_bluegl_glVertexAttrib4dNV: - mov ___blue_glCore_glVertexAttrib4dNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedProgramLocalParameters4fvEXT +_bluegl_glNamedProgramLocalParameters4fvEXT: + mov ___blue_glCore_glNamedProgramLocalParameters4fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTangentPointerEXT -_bluegl_glTangentPointerEXT: - mov ___blue_glCore_glTangentPointerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedProgramLocalParameterI4iEXT +_bluegl_glNamedProgramLocalParameterI4iEXT: + mov ___blue_glCore_glNamedProgramLocalParameterI4iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPixelTransformParameterfvEXT -_bluegl_glPixelTransformParameterfvEXT: - mov ___blue_glCore_glPixelTransformParameterfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedProgramLocalParameterI4ivEXT +_bluegl_glNamedProgramLocalParameterI4ivEXT: + mov ___blue_glCore_glNamedProgramLocalParameterI4ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1i -_bluegl_glProgramUniform1i: - mov ___blue_glCore_glProgramUniform1i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedProgramLocalParametersI4ivEXT +_bluegl_glNamedProgramLocalParametersI4ivEXT: + mov ___blue_glCore_glNamedProgramLocalParametersI4ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2bOES -_bluegl_glMultiTexCoord2bOES: - mov ___blue_glCore_glMultiTexCoord2bOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedProgramLocalParameterI4uiEXT +_bluegl_glNamedProgramLocalParameterI4uiEXT: + mov ___blue_glCore_glNamedProgramLocalParameterI4uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI2iv -_bluegl_glVertexAttribI2iv: - mov ___blue_glCore_glVertexAttribI2iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedProgramLocalParameterI4uivEXT +_bluegl_glNamedProgramLocalParameterI4uivEXT: + mov ___blue_glCore_glNamedProgramLocalParameterI4uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos4iMESA -_bluegl_glWindowPos4iMESA: - mov ___blue_glCore_glWindowPos4iMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedProgramLocalParametersI4uivEXT +_bluegl_glNamedProgramLocalParametersI4uivEXT: + mov ___blue_glCore_glNamedProgramLocalParametersI4uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTestFenceNV -_bluegl_glTestFenceNV: - mov ___blue_glCore_glTestFenceNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedProgramLocalParameterIivEXT +_bluegl_glGetNamedProgramLocalParameterIivEXT: + mov ___blue_glCore_glGetNamedProgramLocalParameterIivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDispatchComputeGroupSizeARB -_bluegl_glDispatchComputeGroupSizeARB: - mov ___blue_glCore_glDispatchComputeGroupSizeARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedProgramLocalParameterIuivEXT +_bluegl_glGetNamedProgramLocalParameterIuivEXT: + mov ___blue_glCore_glGetNamedProgramLocalParameterIuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glShaderOp3EXT -_bluegl_glShaderOp3EXT: - mov ___blue_glCore_glShaderOp3EXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEnableClientStateiEXT +_bluegl_glEnableClientStateiEXT: + mov ___blue_glCore_glEnableClientStateiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSampleMaskSGIS -_bluegl_glSampleMaskSGIS: - mov ___blue_glCore_glSampleMaskSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDisableClientStateiEXT +_bluegl_glDisableClientStateiEXT: + mov ___blue_glCore_glDisableClientStateiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexParameterivEXT -_bluegl_glMultiTexParameterivEXT: - mov ___blue_glCore_glMultiTexParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFloati_vEXT +_bluegl_glGetFloati_vEXT: + mov ___blue_glCore_glGetFloati_vEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnMinmax -_bluegl_glGetnMinmax: - mov ___blue_glCore_glGetnMinmax@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetDoublei_vEXT +_bluegl_glGetDoublei_vEXT: + mov ___blue_glCore_glGetDoublei_vEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorP3ui -_bluegl_glColorP3ui: - mov ___blue_glCore_glColorP3ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPointeri_vEXT +_bluegl_glGetPointeri_vEXT: + mov ___blue_glCore_glGetPointeri_vEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBeginQueryARB -_bluegl_glBeginQueryARB: - mov ___blue_glCore_glBeginQueryARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedProgramStringEXT +_bluegl_glNamedProgramStringEXT: + mov ___blue_glCore_glNamedProgramStringEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiDrawArraysIndirectAMD -_bluegl_glMultiDrawArraysIndirectAMD: - mov ___blue_glCore_glMultiDrawArraysIndirectAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedProgramLocalParameter4dEXT +_bluegl_glNamedProgramLocalParameter4dEXT: + mov ___blue_glCore_glNamedProgramLocalParameter4dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glRasterPos4xOES -_bluegl_glRasterPos4xOES: - mov ___blue_glCore_glRasterPos4xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedProgramLocalParameter4dvEXT +_bluegl_glNamedProgramLocalParameter4dvEXT: + mov ___blue_glCore_glNamedProgramLocalParameter4dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFogCoordPointer -_bluegl_glFogCoordPointer: - mov ___blue_glCore_glFogCoordPointer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedProgramLocalParameter4fEXT +_bluegl_glNamedProgramLocalParameter4fEXT: + mov ___blue_glCore_glNamedProgramLocalParameter4fEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureLightEXT -_bluegl_glTextureLightEXT: - mov ___blue_glCore_glTextureLightEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedProgramLocalParameter4fvEXT +_bluegl_glNamedProgramLocalParameter4fvEXT: + mov ___blue_glCore_glNamedProgramLocalParameter4fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetCombinerInputParameterfvNV -_bluegl_glGetCombinerInputParameterfvNV: - mov ___blue_glCore_glGetCombinerInputParameterfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedProgramLocalParameterdvEXT +_bluegl_glGetNamedProgramLocalParameterdvEXT: + mov ___blue_glCore_glGetNamedProgramLocalParameterdvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteFragmentShaderATI -_bluegl_glDeleteFragmentShaderATI: - mov ___blue_glCore_glDeleteFragmentShaderATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedProgramLocalParameterfvEXT +_bluegl_glGetNamedProgramLocalParameterfvEXT: + mov ___blue_glCore_glGetNamedProgramLocalParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2sv -_bluegl_glMultiTexCoord2sv: - mov ___blue_glCore_glMultiTexCoord2sv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedProgramivEXT +_bluegl_glGetNamedProgramivEXT: + mov ___blue_glCore_glGetNamedProgramivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2s -_bluegl_glMultiTexCoord2s: - mov ___blue_glCore_glMultiTexCoord2s@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedProgramStringEXT +_bluegl_glGetNamedProgramStringEXT: + mov ___blue_glCore_glGetNamedProgramStringEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLightModelxvOES -_bluegl_glLightModelxvOES: - mov ___blue_glCore_glLightModelxvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedRenderbufferStorageEXT +_bluegl_glNamedRenderbufferStorageEXT: + mov ___blue_glCore_glNamedRenderbufferStorageEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTessellationFactorAMD -_bluegl_glTessellationFactorAMD: - mov ___blue_glCore_glTessellationFactorAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedRenderbufferParameterivEXT +_bluegl_glGetNamedRenderbufferParameterivEXT: + mov ___blue_glCore_glGetNamedRenderbufferParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVariantivEXT -_bluegl_glVariantivEXT: - mov ___blue_glCore_glVariantivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedRenderbufferStorageMultisampleEXT +_bluegl_glNamedRenderbufferStorageMultisampleEXT: + mov ___blue_glCore_glNamedRenderbufferStorageMultisampleEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedFramebufferRenderbuffer -_bluegl_glNamedFramebufferRenderbuffer: - mov ___blue_glCore_glNamedFramebufferRenderbuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT +_bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT: + mov ___blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2ivARB -_bluegl_glWindowPos2ivARB: - mov ___blue_glCore_glWindowPos2ivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCheckNamedFramebufferStatusEXT +_bluegl_glCheckNamedFramebufferStatusEXT: + mov ___blue_glCore_glCheckNamedFramebufferStatusEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayFogCoordOffsetEXT -_bluegl_glVertexArrayFogCoordOffsetEXT: - mov ___blue_glCore_glVertexArrayFogCoordOffsetEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedFramebufferTexture1DEXT +_bluegl_glNamedFramebufferTexture1DEXT: + mov ___blue_glCore_glNamedFramebufferTexture1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2i -_bluegl_glUniform2i: - mov ___blue_glCore_glUniform2i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedFramebufferTexture2DEXT +_bluegl_glNamedFramebufferTexture2DEXT: + mov ___blue_glCore_glNamedFramebufferTexture2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTexBumpParameterivATI -_bluegl_glGetTexBumpParameterivATI: - mov ___blue_glCore_glGetTexBumpParameterivATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedFramebufferTexture3DEXT +_bluegl_glNamedFramebufferTexture3DEXT: + mov ___blue_glCore_glNamedFramebufferTexture3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSamplerParameterIuiv -_bluegl_glSamplerParameterIuiv: - mov ___blue_glCore_glSamplerParameterIuiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedFramebufferRenderbufferEXT +_bluegl_glNamedFramebufferRenderbufferEXT: + mov ___blue_glCore_glNamedFramebufferRenderbufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearBufferfv -_bluegl_glClearBufferfv: - mov ___blue_glCore_glClearBufferfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedFramebufferAttachmentParameterivEXT +_bluegl_glGetNamedFramebufferAttachmentParameterivEXT: + mov ___blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindTextureUnitParameterEXT -_bluegl_glBindTextureUnitParameterEXT: - mov ___blue_glCore_glBindTextureUnitParameterEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenerateTextureMipmapEXT +_bluegl_glGenerateTextureMipmapEXT: + mov ___blue_glCore_glGenerateTextureMipmapEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3hNV -_bluegl_glMultiTexCoord3hNV: - mov ___blue_glCore_glMultiTexCoord3hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenerateMultiTexMipmapEXT +_bluegl_glGenerateMultiTexMipmapEXT: + mov ___blue_glCore_glGenerateMultiTexMipmapEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3us -_bluegl_glSecondaryColor3us: - mov ___blue_glCore_glSecondaryColor3us@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferDrawBufferEXT +_bluegl_glFramebufferDrawBufferEXT: + mov ___blue_glCore_glFramebufferDrawBufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeusvSUN -_bluegl_glReplacementCodeusvSUN: - mov ___blue_glCore_glReplacementCodeusvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferDrawBuffersEXT +_bluegl_glFramebufferDrawBuffersEXT: + mov ___blue_glCore_glFramebufferDrawBuffersEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3bvEXT -_bluegl_glSecondaryColor3bvEXT: - mov ___blue_glCore_glSecondaryColor3bvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferReadBufferEXT +_bluegl_glFramebufferReadBufferEXT: + mov ___blue_glCore_glFramebufferReadBufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramPipelineInfoLog -_bluegl_glGetProgramPipelineInfoLog: - mov ___blue_glCore_glGetProgramPipelineInfoLog@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFramebufferParameterivEXT +_bluegl_glGetFramebufferParameterivEXT: + mov ___blue_glCore_glGetFramebufferParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVideoi64vNV -_bluegl_glGetVideoi64vNV: - mov ___blue_glCore_glGetVideoi64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedCopyBufferSubDataEXT +_bluegl_glNamedCopyBufferSubDataEXT: + mov ___blue_glCore_glNamedCopyBufferSubDataEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3iv -_bluegl_glMultiTexCoord3iv: - mov ___blue_glCore_glMultiTexCoord3iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedFramebufferTextureEXT +_bluegl_glNamedFramebufferTextureEXT: + mov ___blue_glCore_glNamedFramebufferTextureEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayTexCoordOffsetEXT -_bluegl_glVertexArrayTexCoordOffsetEXT: - mov ___blue_glCore_glVertexArrayTexCoordOffsetEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedFramebufferTextureLayerEXT +_bluegl_glNamedFramebufferTextureLayerEXT: + mov ___blue_glCore_glNamedFramebufferTextureLayerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT -_bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT: - mov ___blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedFramebufferTextureFaceEXT +_bluegl_glNamedFramebufferTextureFaceEXT: + mov ___blue_glCore_glNamedFramebufferTextureFaceEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetSamplerParameterIuiv -_bluegl_glGetSamplerParameterIuiv: - mov ___blue_glCore_glGetSamplerParameterIuiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureRenderbufferEXT +_bluegl_glTextureRenderbufferEXT: + mov ___blue_glCore_glTextureRenderbufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2dARB -_bluegl_glVertexAttrib2dARB: - mov ___blue_glCore_glVertexAttrib2dARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexRenderbufferEXT +_bluegl_glMultiTexRenderbufferEXT: + mov ___blue_glCore_glMultiTexRenderbufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormalStream3svATI -_bluegl_glNormalStream3svATI: - mov ___blue_glCore_glNormalStream3svATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayVertexOffsetEXT +_bluegl_glVertexArrayVertexOffsetEXT: + mov ___blue_glCore_glVertexArrayVertexOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClientActiveVertexStreamATI -_bluegl_glClientActiveVertexStreamATI: - mov ___blue_glCore_glClientActiveVertexStreamATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayColorOffsetEXT +_bluegl_glVertexArrayColorOffsetEXT: + mov ___blue_glCore_glVertexArrayColorOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStencilThenCoverFillPathInstancedNV -_bluegl_glStencilThenCoverFillPathInstancedNV: - mov ___blue_glCore_glStencilThenCoverFillPathInstancedNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayEdgeFlagOffsetEXT +_bluegl_glVertexArrayEdgeFlagOffsetEXT: + mov ___blue_glCore_glVertexArrayEdgeFlagOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3uiEXT -_bluegl_glSecondaryColor3uiEXT: - mov ___blue_glCore_glSecondaryColor3uiEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayIndexOffsetEXT +_bluegl_glVertexArrayIndexOffsetEXT: + mov ___blue_glCore_glVertexArrayIndexOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord2hNV -_bluegl_glTexCoord2hNV: - mov ___blue_glCore_glTexCoord2hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayNormalOffsetEXT +_bluegl_glVertexArrayNormalOffsetEXT: + mov ___blue_glCore_glVertexArrayNormalOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3fARB -_bluegl_glVertexAttrib3fARB: - mov ___blue_glCore_glVertexAttrib3fARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayTexCoordOffsetEXT +_bluegl_glVertexArrayTexCoordOffsetEXT: + mov ___blue_glCore_glVertexArrayTexCoordOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetQueryBufferObjectui64v -_bluegl_glGetQueryBufferObjectui64v: - mov ___blue_glCore_glGetQueryBufferObjectui64v@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayMultiTexCoordOffsetEXT +_bluegl_glVertexArrayMultiTexCoordOffsetEXT: + mov ___blue_glCore_glVertexArrayMultiTexCoordOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMaterialxOES -_bluegl_glGetMaterialxOES: - mov ___blue_glCore_glGetMaterialxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayFogCoordOffsetEXT +_bluegl_glVertexArrayFogCoordOffsetEXT: + mov ___blue_glCore_glVertexArrayFogCoordOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiDrawArrays -_bluegl_glMultiDrawArrays: - mov ___blue_glCore_glMultiDrawArrays@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArraySecondaryColorOffsetEXT +_bluegl_glVertexArraySecondaryColorOffsetEXT: + mov ___blue_glCore_glVertexArraySecondaryColorOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3iEXT -_bluegl_glSecondaryColor3iEXT: - mov ___blue_glCore_glSecondaryColor3iEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayVertexAttribOffsetEXT +_bluegl_glVertexArrayVertexAttribOffsetEXT: + mov ___blue_glCore_glVertexArrayVertexAttribOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2ui64NV -_bluegl_glProgramUniform2ui64NV: - mov ___blue_glCore_glProgramUniform2ui64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayVertexAttribIOffsetEXT +_bluegl_glVertexArrayVertexAttribIOffsetEXT: + mov ___blue_glCore_glVertexArrayVertexAttribIOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteQueries -_bluegl_glDeleteQueries: - mov ___blue_glCore_glDeleteQueries@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEnableVertexArrayEXT +_bluegl_glEnableVertexArrayEXT: + mov ___blue_glCore_glEnableVertexArrayEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteRenderbuffers -_bluegl_glDeleteRenderbuffers: - mov ___blue_glCore_glDeleteRenderbuffers@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDisableVertexArrayEXT +_bluegl_glDisableVertexArrayEXT: + mov ___blue_glCore_glDisableVertexArrayEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramLocalParameterdvARB -_bluegl_glGetProgramLocalParameterdvARB: - mov ___blue_glCore_glGetProgramLocalParameterdvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEnableVertexArrayAttribEXT +_bluegl_glEnableVertexArrayAttribEXT: + mov ___blue_glCore_glEnableVertexArrayAttribEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord2xOES -_bluegl_glTexCoord2xOES: - mov ___blue_glCore_glTexCoord2xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDisableVertexArrayAttribEXT +_bluegl_glDisableVertexArrayAttribEXT: + mov ___blue_glCore_glDisableVertexArrayAttribEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindBuffer -_bluegl_glBindBuffer: - mov ___blue_glCore_glBindBuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexArrayIntegervEXT +_bluegl_glGetVertexArrayIntegervEXT: + mov ___blue_glCore_glGetVertexArrayIntegervEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glResumeTransformFeedback -_bluegl_glResumeTransformFeedback: - mov ___blue_glCore_glResumeTransformFeedback@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexArrayPointervEXT +_bluegl_glGetVertexArrayPointervEXT: + mov ___blue_glCore_glGetVertexArrayPointervEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFlushPixelDataRangeNV -_bluegl_glFlushPixelDataRangeNV: - mov ___blue_glCore_glFlushPixelDataRangeNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexArrayIntegeri_vEXT +_bluegl_glGetVertexArrayIntegeri_vEXT: + mov ___blue_glCore_glGetVertexArrayIntegeri_vEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColorPointer -_bluegl_glSecondaryColorPointer: - mov ___blue_glCore_glSecondaryColorPointer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexArrayPointeri_vEXT +_bluegl_glGetVertexArrayPointeri_vEXT: + mov ___blue_glCore_glGetVertexArrayPointeri_vEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVideoCaptureStreamParameterdvNV -_bluegl_glVideoCaptureStreamParameterdvNV: - mov ___blue_glCore_glVideoCaptureStreamParameterdvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMapNamedBufferRangeEXT +_bluegl_glMapNamedBufferRangeEXT: + mov ___blue_glCore_glMapNamedBufferRangeEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureSubImage2DEXT -_bluegl_glTextureSubImage2DEXT: - mov ___blue_glCore_glTextureSubImage2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFlushMappedNamedBufferRangeEXT +_bluegl_glFlushMappedNamedBufferRangeEXT: + mov ___blue_glCore_glFlushMappedNamedBufferRangeEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeletePathsNV -_bluegl_glDeletePathsNV: - mov ___blue_glCore_glDeletePathsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedBufferStorageEXT +_bluegl_glNamedBufferStorageEXT: + mov ___blue_glCore_glNamedBufferStorageEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFloatv -_bluegl_glGetFloatv: - mov ___blue_glCore_glGetFloatv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearNamedBufferDataEXT +_bluegl_glClearNamedBufferDataEXT: + mov ___blue_glCore_glClearNamedBufferDataEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI3uivEXT -_bluegl_glVertexAttribI3uivEXT: - mov ___blue_glCore_glVertexAttribI3uivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearNamedBufferSubDataEXT +_bluegl_glClearNamedBufferSubDataEXT: + mov ___blue_glCore_glClearNamedBufferSubDataEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribdvARB -_bluegl_glGetVertexAttribdvARB: - mov ___blue_glCore_glGetVertexAttribdvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedFramebufferParameteriEXT +_bluegl_glNamedFramebufferParameteriEXT: + mov ___blue_glCore_glNamedFramebufferParameteriEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4ui64NV -_bluegl_glUniform4ui64NV: - mov ___blue_glCore_glUniform4ui64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedFramebufferParameterivEXT +_bluegl_glGetNamedFramebufferParameterivEXT: + mov ___blue_glCore_glGetNamedFramebufferParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureLevelParameterfv -_bluegl_glGetTextureLevelParameterfv: - mov ___blue_glCore_glGetTextureLevelParameterfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1dEXT +_bluegl_glProgramUniform1dEXT: + mov ___blue_glCore_glProgramUniform1dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2i -_bluegl_glWindowPos2i: - mov ___blue_glCore_glWindowPos2i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform2dEXT +_bluegl_glProgramUniform2dEXT: + mov ___blue_glCore_glProgramUniform2dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeuiColor4ubVertex3fSUN -_bluegl_glReplacementCodeuiColor4ubVertex3fSUN: - mov ___blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3dEXT +_bluegl_glProgramUniform3dEXT: + mov ___blue_glCore_glProgramUniform3dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedMultiTexSubImage3DEXT -_bluegl_glCompressedMultiTexSubImage3DEXT: - mov ___blue_glCore_glCompressedMultiTexSubImage3DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4dEXT +_bluegl_glProgramUniform4dEXT: + mov ___blue_glCore_glProgramUniform4dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTexParameterIivEXT -_bluegl_glGetTexParameterIivEXT: - mov ___blue_glCore_glGetTexParameterIivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform1dvEXT +_bluegl_glProgramUniform1dvEXT: + mov ___blue_glCore_glProgramUniform1dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glDebugMessageCallbackARB -_bluegl_glDebugMessageCallbackARB: - mov ___blue_glCore_glDebugMessageCallbackARB@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glProgramUniform2dvEXT +_bluegl_glProgramUniform2dvEXT: + mov ___blue_glCore_glProgramUniform2dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWeightPointerARB -_bluegl_glWeightPointerARB: - mov ___blue_glCore_glWeightPointerARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform3dvEXT +_bluegl_glProgramUniform3dvEXT: + mov ___blue_glCore_glProgramUniform3dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFogxOES -_bluegl_glFogxOES: - mov ___blue_glCore_glFogxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniform4dvEXT +_bluegl_glProgramUniform4dvEXT: + mov ___blue_glCore_glProgramUniform4dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix2x4fvEXT -_bluegl_glProgramUniformMatrix2x4fvEXT: - mov ___blue_glCore_glProgramUniformMatrix2x4fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix2dvEXT +_bluegl_glProgramUniformMatrix2dvEXT: + mov ___blue_glCore_glProgramUniformMatrix2dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4iv -_bluegl_glVertexAttrib4iv: - mov ___blue_glCore_glVertexAttrib4iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix3dvEXT +_bluegl_glProgramUniformMatrix3dvEXT: + mov ___blue_glCore_glProgramUniformMatrix3dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramLocalParameterI4iNV -_bluegl_glProgramLocalParameterI4iNV: - mov ___blue_glCore_glProgramLocalParameterI4iNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix4dvEXT +_bluegl_glProgramUniformMatrix4dvEXT: + mov ___blue_glCore_glProgramUniformMatrix4dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnColorTableARB -_bluegl_glGetnColorTableARB: - mov ___blue_glCore_glGetnColorTableARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix2x3dvEXT +_bluegl_glProgramUniformMatrix2x3dvEXT: + mov ___blue_glCore_glProgramUniformMatrix2x3dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearNamedBufferData -_bluegl_glClearNamedBufferData: - mov ___blue_glCore_glClearNamedBufferData@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix2x4dvEXT +_bluegl_glProgramUniformMatrix2x4dvEXT: + mov ___blue_glCore_glProgramUniformMatrix2x4dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorMaskIndexedEXT -_bluegl_glColorMaskIndexedEXT: - mov ___blue_glCore_glColorMaskIndexedEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix3x2dvEXT +_bluegl_glProgramUniformMatrix3x2dvEXT: + mov ___blue_glCore_glProgramUniformMatrix3x2dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribLPointer -_bluegl_glVertexAttribLPointer: - mov ___blue_glCore_glVertexAttribLPointer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix3x4dvEXT +_bluegl_glProgramUniformMatrix3x4dvEXT: + mov ___blue_glCore_glProgramUniformMatrix3x4dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3i64vNV -_bluegl_glProgramUniform3i64vNV: - mov ___blue_glCore_glProgramUniform3i64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix4x2dvEXT +_bluegl_glProgramUniformMatrix4x2dvEXT: + mov ___blue_glCore_glProgramUniformMatrix4x2dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glScissor -_bluegl_glScissor: - mov ___blue_glCore_glScissor@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformMatrix4x3dvEXT +_bluegl_glProgramUniformMatrix4x3dvEXT: + mov ___blue_glCore_glProgramUniformMatrix4x3dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3fv -_bluegl_glSecondaryColor3fv: - mov ___blue_glCore_glSecondaryColor3fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureBufferRangeEXT +_bluegl_glTextureBufferRangeEXT: + mov ___blue_glCore_glTextureBufferRangeEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCombinerParameterivNV -_bluegl_glCombinerParameterivNV: - mov ___blue_glCore_glCombinerParameterivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureStorage1DEXT +_bluegl_glTextureStorage1DEXT: + mov ___blue_glCore_glTextureStorage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTexLevelParameterfv -_bluegl_glGetTexLevelParameterfv: - mov ___blue_glCore_glGetTexLevelParameterfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureStorage2DEXT +_bluegl_glTextureStorage2DEXT: + mov ___blue_glCore_glTextureStorage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawElementArrayATI -_bluegl_glDrawElementArrayATI: - mov ___blue_glCore_glDrawElementArrayATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureStorage3DEXT +_bluegl_glTextureStorage3DEXT: + mov ___blue_glCore_glTextureStorage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4Nusv -_bluegl_glVertexAttrib4Nusv: - mov ___blue_glCore_glVertexAttrib4Nusv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureStorage2DMultisampleEXT +_bluegl_glTextureStorage2DMultisampleEXT: + mov ___blue_glCore_glTextureStorage2DMultisampleEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3dvMESA -_bluegl_glWindowPos3dvMESA: - mov ___blue_glCore_glWindowPos3dvMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureStorage3DMultisampleEXT +_bluegl_glTextureStorage3DMultisampleEXT: + mov ___blue_glCore_glTextureStorage3DMultisampleEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMakeImageHandleResidentARB -_bluegl_glMakeImageHandleResidentARB: - mov ___blue_glCore_glMakeImageHandleResidentARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayBindVertexBufferEXT +_bluegl_glVertexArrayBindVertexBufferEXT: + mov ___blue_glCore_glVertexArrayBindVertexBufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3svMESA -_bluegl_glWindowPos3svMESA: - mov ___blue_glCore_glWindowPos3svMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayVertexAttribFormatEXT +_bluegl_glVertexArrayVertexAttribFormatEXT: + mov ___blue_glCore_glVertexArrayVertexAttribFormatEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMultiTexLevelParameterfvEXT -_bluegl_glGetMultiTexLevelParameterfvEXT: - mov ___blue_glCore_glGetMultiTexLevelParameterfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayVertexAttribIFormatEXT +_bluegl_glVertexArrayVertexAttribIFormatEXT: + mov ___blue_glCore_glVertexArrayVertexAttribIFormatEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glRasterPos3xOES -_bluegl_glRasterPos3xOES: - mov ___blue_glCore_glRasterPos3xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayVertexAttribLFormatEXT +_bluegl_glVertexArrayVertexAttribLFormatEXT: + mov ___blue_glCore_glVertexArrayVertexAttribLFormatEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBinormal3iEXT -_bluegl_glBinormal3iEXT: - mov ___blue_glCore_glBinormal3iEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayVertexAttribBindingEXT +_bluegl_glVertexArrayVertexAttribBindingEXT: + mov ___blue_glCore_glVertexArrayVertexAttribBindingEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribP3uiv -_bluegl_glVertexAttribP3uiv: - mov ___blue_glCore_glVertexAttribP3uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayVertexBindingDivisorEXT +_bluegl_glVertexArrayVertexBindingDivisorEXT: + mov ___blue_glCore_glVertexArrayVertexBindingDivisorEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix2x3dv -_bluegl_glProgramUniformMatrix2x3dv: - mov ___blue_glCore_glProgramUniformMatrix2x3dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayVertexAttribLOffsetEXT +_bluegl_glVertexArrayVertexAttribLOffsetEXT: + mov ___blue_glCore_glVertexArrayVertexAttribLOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEndConditionalRender -_bluegl_glEndConditionalRender: - mov ___blue_glCore_glEndConditionalRender@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexturePageCommitmentEXT +_bluegl_glTexturePageCommitmentEXT: + mov ___blue_glCore_glTexturePageCommitmentEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindParameterEXT -_bluegl_glBindParameterEXT: - mov ___blue_glCore_glBindParameterEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayVertexAttribDivisorEXT +_bluegl_glVertexArrayVertexAttribDivisorEXT: + mov ___blue_glCore_glVertexArrayVertexAttribDivisorEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompileShaderIncludeARB -_bluegl_glCompileShaderIncludeARB: - mov ___blue_glCore_glCompileShaderIncludeARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorMaskIndexedEXT +_bluegl_glColorMaskIndexedEXT: + mov ___blue_glCore_glColorMaskIndexedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexStorageSparseAMD -_bluegl_glTexStorageSparseAMD: - mov ___blue_glCore_glTexStorageSparseAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawArraysInstancedEXT +_bluegl_glDrawArraysInstancedEXT: + mov ___blue_glCore_glDrawArraysInstancedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreateShaderProgramEXT -_bluegl_glCreateShaderProgramEXT: - mov ___blue_glCore_glCreateShaderProgramEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawElementsInstancedEXT +_bluegl_glDrawElementsInstancedEXT: + mov ___blue_glCore_glDrawElementsInstancedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix3x2fv -_bluegl_glUniformMatrix3x2fv: - mov ___blue_glCore_glUniformMatrix3x2fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawRangeElementsEXT +_bluegl_glDrawRangeElementsEXT: + mov ___blue_glCore_glDrawRangeElementsEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPrimitiveRestartIndex -_bluegl_glPrimitiveRestartIndex: - mov ___blue_glCore_glPrimitiveRestartIndex@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFogCoordfEXT +_bluegl_glFogCoordfEXT: + mov ___blue_glCore_glFogCoordfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreateProgram -_bluegl_glCreateProgram: - mov ___blue_glCore_glCreateProgram@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFogCoordfvEXT +_bluegl_glFogCoordfvEXT: + mov ___blue_glCore_glFogCoordfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3d -_bluegl_glMultiTexCoord3d: - mov ___blue_glCore_glMultiTexCoord3d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFogCoorddEXT +_bluegl_glFogCoorddEXT: + mov ___blue_glCore_glFogCoorddEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFenceivNV -_bluegl_glGetFenceivNV: - mov ___blue_glCore_glGetFenceivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFogCoorddvEXT +_bluegl_glFogCoorddvEXT: + mov ___blue_glCore_glFogCoorddvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4dv -_bluegl_glUniform4dv: - mov ___blue_glCore_glUniform4dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFogCoordPointerEXT +_bluegl_glFogCoordPointerEXT: + mov ___blue_glCore_glFogCoordPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3i64ARB -_bluegl_glUniform3i64ARB: - mov ___blue_glCore_glUniform3i64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlitFramebufferEXT +_bluegl_glBlitFramebufferEXT: + mov ___blue_glCore_glBlitFramebufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexturePageCommitmentEXT -_bluegl_glTexturePageCommitmentEXT: - mov ___blue_glCore_glTexturePageCommitmentEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glRenderbufferStorageMultisampleEXT +_bluegl_glRenderbufferStorageMultisampleEXT: + mov ___blue_glCore_glRenderbufferStorageMultisampleEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColor4hNV -_bluegl_glColor4hNV: - mov ___blue_glCore_glColor4hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsRenderbufferEXT +_bluegl_glIsRenderbufferEXT: + mov ___blue_glCore_glIsRenderbufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream2fATI -_bluegl_glVertexStream2fATI: - mov ___blue_glCore_glVertexStream2fATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindRenderbufferEXT +_bluegl_glBindRenderbufferEXT: + mov ___blue_glCore_glBindRenderbufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDisable -_bluegl_glDisable: - mov ___blue_glCore_glDisable@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteRenderbuffersEXT +_bluegl_glDeleteRenderbuffersEXT: + mov ___blue_glCore_glDeleteRenderbuffersEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferRenderbuffer -_bluegl_glFramebufferRenderbuffer: - mov ___blue_glCore_glFramebufferRenderbuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenRenderbuffersEXT +_bluegl_glGenRenderbuffersEXT: + mov ___blue_glCore_glGenRenderbuffersEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsRenderbufferEXT -_bluegl_glIsRenderbufferEXT: - mov ___blue_glCore_glIsRenderbufferEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glRenderbufferStorageEXT +_bluegl_glRenderbufferStorageEXT: + mov ___blue_glCore_glRenderbufferStorageEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMultiTexParameterIivEXT -_bluegl_glGetMultiTexParameterIivEXT: - mov ___blue_glCore_glGetMultiTexParameterIivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetRenderbufferParameterivEXT +_bluegl_glGetRenderbufferParameterivEXT: + mov ___blue_glCore_glGetRenderbufferParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2fvNV -_bluegl_glVertexAttrib2fvNV: - mov ___blue_glCore_glVertexAttrib2fvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsFramebufferEXT +_bluegl_glIsFramebufferEXT: + mov ___blue_glCore_glIsFramebufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReferencePlaneSGIX -_bluegl_glReferencePlaneSGIX: - mov ___blue_glCore_glReferencePlaneSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindFramebufferEXT +_bluegl_glBindFramebufferEXT: + mov ___blue_glCore_glBindFramebufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4fARB -_bluegl_glUniform4fARB: - mov ___blue_glCore_glUniform4fARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteFramebuffersEXT +_bluegl_glDeleteFramebuffersEXT: + mov ___blue_glCore_glDeleteFramebuffersEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearBufferfi -_bluegl_glClearBufferfi: - mov ___blue_glCore_glClearBufferfi@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenFramebuffersEXT +_bluegl_glGenFramebuffersEXT: + mov ___blue_glCore_glGenFramebuffersEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindFragDataLocation -_bluegl_glBindFragDataLocation: - mov ___blue_glCore_glBindFragDataLocation@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCheckFramebufferStatusEXT +_bluegl_glCheckFramebufferStatusEXT: + mov ___blue_glCore_glCheckFramebufferStatusEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetIntegerv -_bluegl_glGetIntegerv: - mov ___blue_glCore_glGetIntegerv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferTexture1DEXT +_bluegl_glFramebufferTexture1DEXT: + mov ___blue_glCore_glFramebufferTexture1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetObjectLabel -_bluegl_glGetObjectLabel: - mov ___blue_glCore_glGetObjectLabel@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferTexture2DEXT +_bluegl_glFramebufferTexture2DEXT: + mov ___blue_glCore_glFramebufferTexture2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBufferPageCommitmentARB -_bluegl_glBufferPageCommitmentARB: - mov ___blue_glCore_glBufferPageCommitmentARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferTexture3DEXT +_bluegl_glFramebufferTexture3DEXT: + mov ___blue_glCore_glFramebufferTexture3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendFuncIndexedAMD -_bluegl_glBlendFuncIndexedAMD: - mov ___blue_glCore_glBlendFuncIndexedAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferRenderbufferEXT +_bluegl_glFramebufferRenderbufferEXT: + mov ___blue_glCore_glFramebufferRenderbufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetQueryObjectui64vEXT -_bluegl_glGetQueryObjectui64vEXT: - mov ___blue_glCore_glGetQueryObjectui64vEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFramebufferAttachmentParameterivEXT +_bluegl_glGetFramebufferAttachmentParameterivEXT: + mov ___blue_glCore_glGetFramebufferAttachmentParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN -_bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN: - mov ___blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenerateMipmapEXT +_bluegl_glGenerateMipmapEXT: + mov ___blue_glCore_glGenerateMipmapEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlitFramebuffer -_bluegl_glBlitFramebuffer: - mov ___blue_glCore_glBlitFramebuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramParameteriEXT +_bluegl_glProgramParameteriEXT: + mov ___blue_glCore_glProgramParameteriEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2f -_bluegl_glMultiTexCoord2f: - mov ___blue_glCore_glMultiTexCoord2f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramEnvParameters4fvEXT +_bluegl_glProgramEnvParameters4fvEXT: + mov ___blue_glCore_glProgramEnvParameters4fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedFramebufferRenderbufferEXT -_bluegl_glNamedFramebufferRenderbufferEXT: - mov ___blue_glCore_glNamedFramebufferRenderbufferEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramLocalParameters4fvEXT +_bluegl_glProgramLocalParameters4fvEXT: + mov ___blue_glCore_glProgramLocalParameters4fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUseProgramStages -_bluegl_glUseProgramStages: - mov ___blue_glCore_glUseProgramStages@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetUniformuivEXT +_bluegl_glGetUniformuivEXT: + mov ___blue_glCore_glGetUniformuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedStringivARB -_bluegl_glGetNamedStringivARB: - mov ___blue_glCore_glGetNamedStringivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindFragDataLocationEXT +_bluegl_glBindFragDataLocationEXT: + mov ___blue_glCore_glBindFragDataLocationEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1iARB -_bluegl_glMultiTexCoord1iARB: - mov ___blue_glCore_glMultiTexCoord1iARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFragDataLocationEXT +_bluegl_glGetFragDataLocationEXT: + mov ___blue_glCore_glGetFragDataLocationEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4xvOES -_bluegl_glMultiTexCoord4xvOES: - mov ___blue_glCore_glMultiTexCoord4xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1uiEXT +_bluegl_glUniform1uiEXT: + mov ___blue_glCore_glUniform1uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMakeImageHandleResidentNV -_bluegl_glMakeImageHandleResidentNV: - mov ___blue_glCore_glMakeImageHandleResidentNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2uiEXT +_bluegl_glUniform2uiEXT: + mov ___blue_glCore_glUniform2uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1fvNV -_bluegl_glVertexAttrib1fvNV: - mov ___blue_glCore_glVertexAttrib1fvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3uiEXT +_bluegl_glUniform3uiEXT: + mov ___blue_glCore_glUniform3uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glViewportIndexedf -_bluegl_glViewportIndexedf: - mov ___blue_glCore_glViewportIndexedf@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4uiEXT +_bluegl_glUniform4uiEXT: + mov ___blue_glCore_glUniform4uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexStorage3DMultisample -_bluegl_glTexStorage3DMultisample: - mov ___blue_glCore_glTexStorage3DMultisample@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform1uivEXT +_bluegl_glUniform1uivEXT: + mov ___blue_glCore_glUniform1uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreateShaderObjectARB -_bluegl_glCreateShaderObjectARB: - mov ___blue_glCore_glCreateShaderObjectARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform2uivEXT +_bluegl_glUniform2uivEXT: + mov ___blue_glCore_glUniform2uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glListDrawCommandsStatesClientNV -_bluegl_glListDrawCommandsStatesClientNV: - mov ___blue_glCore_glListDrawCommandsStatesClientNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform3uivEXT +_bluegl_glUniform3uivEXT: + mov ___blue_glCore_glUniform3uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1d -_bluegl_glUniform1d: - mov ___blue_glCore_glUniform1d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniform4uivEXT +_bluegl_glUniform4uivEXT: + mov ___blue_glCore_glUniform4uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetDebugMessageLogARB -_bluegl_glGetDebugMessageLogARB: - mov ___blue_glCore_glGetDebugMessageLogARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetHistogramEXT +_bluegl_glGetHistogramEXT: + mov ___blue_glCore_glGetHistogramEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendParameteriNV -_bluegl_glBlendParameteriNV: - mov ___blue_glCore_glBlendParameteriNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetHistogramParameterfvEXT +_bluegl_glGetHistogramParameterfvEXT: + mov ___blue_glCore_glGetHistogramParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4sv -_bluegl_glMultiTexCoord4sv: - mov ___blue_glCore_glMultiTexCoord4sv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetHistogramParameterivEXT +_bluegl_glGetHistogramParameterivEXT: + mov ___blue_glCore_glGetHistogramParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1uiEXT -_bluegl_glUniform1uiEXT: - mov ___blue_glCore_glUniform1uiEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMinmaxEXT +_bluegl_glGetMinmaxEXT: + mov ___blue_glCore_glGetMinmaxEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDebugMessageInsertAMD -_bluegl_glDebugMessageInsertAMD: - mov ___blue_glCore_glDebugMessageInsertAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMinmaxParameterfvEXT +_bluegl_glGetMinmaxParameterfvEXT: + mov ___blue_glCore_glGetMinmaxParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiDrawArraysIndirect -_bluegl_glMultiDrawArraysIndirect: - mov ___blue_glCore_glMultiDrawArraysIndirect@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMinmaxParameterivEXT +_bluegl_glGetMinmaxParameterivEXT: + mov ___blue_glCore_glGetMinmaxParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1d -_bluegl_glProgramUniform1d: - mov ___blue_glCore_glProgramUniform1d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glHistogramEXT +_bluegl_glHistogramEXT: + mov ___blue_glCore_glHistogramEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetListParameterivSGIX -_bluegl_glGetListParameterivSGIX: - mov ___blue_glCore_glGetListParameterivSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMinmaxEXT +_bluegl_glMinmaxEXT: + mov ___blue_glCore_glMinmaxEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPointParameterfv -_bluegl_glPointParameterfv: - mov ___blue_glCore_glPointParameterfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glResetHistogramEXT +_bluegl_glResetHistogramEXT: + mov ___blue_glCore_glResetHistogramEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyBufferSubData -_bluegl_glCopyBufferSubData: - mov ___blue_glCore_glCopyBufferSubData@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glResetMinmaxEXT +_bluegl_glResetMinmaxEXT: + mov ___blue_glCore_glResetMinmaxEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindProgramARB -_bluegl_glBindProgramARB: - mov ___blue_glCore_glBindProgramARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIndexFuncEXT +_bluegl_glIndexFuncEXT: + mov ___blue_glCore_glIndexFuncEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCombinerStageParameterfvNV -_bluegl_glCombinerStageParameterfvNV: - mov ___blue_glCore_glCombinerStageParameterfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIndexMaterialEXT +_bluegl_glIndexMaterialEXT: + mov ___blue_glCore_glIndexMaterialEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEndConditionalRenderNV -_bluegl_glEndConditionalRenderNV: - mov ___blue_glCore_glEndConditionalRenderNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glApplyTextureEXT +_bluegl_glApplyTextureEXT: + mov ___blue_glCore_glApplyTextureEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL3dEXT -_bluegl_glVertexAttribL3dEXT: - mov ___blue_glCore_glVertexAttribL3dEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureLightEXT +_bluegl_glTextureLightEXT: + mov ___blue_glCore_glTextureLightEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3iv -_bluegl_glWindowPos3iv: - mov ___blue_glCore_glWindowPos3iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureMaterialEXT +_bluegl_glTextureMaterialEXT: + mov ___blue_glCore_glTextureMaterialEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFogFuncSGIS -_bluegl_glGetFogFuncSGIS: - mov ___blue_glCore_glGetFogFuncSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiDrawArraysEXT +_bluegl_glMultiDrawArraysEXT: + mov ___blue_glCore_glMultiDrawArraysEXT@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glCompressedTexImage2D -_bluegl_glCompressedTexImage2D: - mov ___blue_glCore_glCompressedTexImage2D@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glMultiDrawElementsEXT +_bluegl_glMultiDrawElementsEXT: + mov ___blue_glCore_glMultiDrawElementsEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPixelTexGenParameteriSGIS -_bluegl_glPixelTexGenParameteriSGIS: - mov ___blue_glCore_glPixelTexGenParameteriSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSampleMaskEXT +_bluegl_glSampleMaskEXT: + mov ___blue_glCore_glSampleMaskEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDebugMessageControlARB -_bluegl_glDebugMessageControlARB: - mov ___blue_glCore_glDebugMessageControlARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSamplePatternEXT +_bluegl_glSamplePatternEXT: + mov ___blue_glCore_glSamplePatternEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMapBufferRange -_bluegl_glMapBufferRange: - mov ___blue_glCore_glMapBufferRange@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorTableEXT +_bluegl_glColorTableEXT: + mov ___blue_glCore_glColorTableEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1fvEXT -_bluegl_glProgramUniform1fvEXT: - mov ___blue_glCore_glProgramUniform1fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetColorTableEXT +_bluegl_glGetColorTableEXT: + mov ___blue_glCore_glGetColorTableEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedRenderbufferStorageEXT -_bluegl_glNamedRenderbufferStorageEXT: - mov ___blue_glCore_glNamedRenderbufferStorageEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetColorTableParameterivEXT +_bluegl_glGetColorTableParameterivEXT: + mov ___blue_glCore_glGetColorTableParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix4x2fv -_bluegl_glProgramUniformMatrix4x2fv: - mov ___blue_glCore_glProgramUniformMatrix4x2fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetColorTableParameterfvEXT +_bluegl_glGetColorTableParameterfvEXT: + mov ___blue_glCore_glGetColorTableParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedProgramLocalParameterI4iEXT -_bluegl_glNamedProgramLocalParameterI4iEXT: - mov ___blue_glCore_glNamedProgramLocalParameterI4iEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPixelTransformParameteriEXT +_bluegl_glPixelTransformParameteriEXT: + mov ___blue_glCore_glPixelTransformParameteriEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearDepth -_bluegl_glClearDepth: - mov ___blue_glCore_glClearDepth@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPixelTransformParameterfEXT +_bluegl_glPixelTransformParameterfEXT: + mov ___blue_glCore_glPixelTransformParameterfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribs1dvNV -_bluegl_glVertexAttribs1dvNV: - mov ___blue_glCore_glVertexAttribs1dvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPixelTransformParameterivEXT +_bluegl_glPixelTransformParameterivEXT: + mov ___blue_glCore_glPixelTransformParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3f -_bluegl_glWindowPos3f: - mov ___blue_glCore_glWindowPos3f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPixelTransformParameterfvEXT +_bluegl_glPixelTransformParameterfvEXT: + mov ___blue_glCore_glPixelTransformParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProvokingVertex -_bluegl_glProvokingVertex: - mov ___blue_glCore_glProvokingVertex@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPixelTransformParameterivEXT +_bluegl_glGetPixelTransformParameterivEXT: + mov ___blue_glCore_glGetPixelTransformParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsNamedStringARB -_bluegl_glIsNamedStringARB: - mov ___blue_glCore_glIsNamedStringARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPixelTransformParameterfvEXT +_bluegl_glGetPixelTransformParameterfvEXT: + mov ___blue_glCore_glGetPixelTransformParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedBufferData -_bluegl_glNamedBufferData: - mov ___blue_glCore_glNamedBufferData@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPointParameterfEXT +_bluegl_glPointParameterfEXT: + mov ___blue_glCore_glPointParameterfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFragmentLightfSGIX -_bluegl_glFragmentLightfSGIX: - mov ___blue_glCore_glFragmentLightfSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPointParameterfvEXT +_bluegl_glPointParameterfvEXT: + mov ___blue_glCore_glPointParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4uiv -_bluegl_glProgramUniform4uiv: - mov ___blue_glCore_glProgramUniform4uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPolygonOffsetEXT +_bluegl_glPolygonOffsetEXT: + mov ___blue_glCore_glPolygonOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPointParameteriNV -_bluegl_glPointParameteriNV: - mov ___blue_glCore_glPointParameteriNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPolygonOffsetClampEXT +_bluegl_glPolygonOffsetClampEXT: + mov ___blue_glCore_glPolygonOffsetClampEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedFramebufferReadBuffer -_bluegl_glNamedFramebufferReadBuffer: - mov ___blue_glCore_glNamedFramebufferReadBuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProvokingVertexEXT +_bluegl_glProvokingVertexEXT: + mov ___blue_glCore_glProvokingVertexEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPatchParameterfv -_bluegl_glPatchParameterfv: - mov ___blue_glCore_glPatchParameterfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glRasterSamplesEXT +_bluegl_glRasterSamplesEXT: + mov ___blue_glCore_glRasterSamplesEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayBindingDivisor -_bluegl_glVertexArrayBindingDivisor: - mov ___blue_glCore_glVertexArrayBindingDivisor@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3bEXT +_bluegl_glSecondaryColor3bEXT: + mov ___blue_glCore_glSecondaryColor3bEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDebugMessageEnableAMD -_bluegl_glDebugMessageEnableAMD: - mov ___blue_glCore_glDebugMessageEnableAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3bvEXT +_bluegl_glSecondaryColor3bvEXT: + mov ___blue_glCore_glSecondaryColor3bvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexArrayIndexediv -_bluegl_glGetVertexArrayIndexediv: - mov ___blue_glCore_glGetVertexArrayIndexediv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3dEXT +_bluegl_glSecondaryColor3dEXT: + mov ___blue_glCore_glSecondaryColor3dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVideoCaptureStreamdvNV -_bluegl_glGetVideoCaptureStreamdvNV: - mov ___blue_glCore_glGetVideoCaptureStreamdvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3dvEXT +_bluegl_glSecondaryColor3dvEXT: + mov ___blue_glCore_glSecondaryColor3dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glAlphaFragmentOp2ATI -_bluegl_glAlphaFragmentOp2ATI: - mov ___blue_glCore_glAlphaFragmentOp2ATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3fEXT +_bluegl_glSecondaryColor3fEXT: + mov ___blue_glCore_glSecondaryColor3fEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertex2hNV -_bluegl_glVertex2hNV: - mov ___blue_glCore_glVertex2hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3fvEXT +_bluegl_glSecondaryColor3fvEXT: + mov ___blue_glCore_glSecondaryColor3fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCombinerParameteriNV -_bluegl_glCombinerParameteriNV: - mov ___blue_glCore_glCombinerParameteriNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3iEXT +_bluegl_glSecondaryColor3iEXT: + mov ___blue_glCore_glSecondaryColor3iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedFramebufferAttachmentParameterivEXT -_bluegl_glGetNamedFramebufferAttachmentParameterivEXT: - mov ___blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3ivEXT +_bluegl_glSecondaryColor3ivEXT: + mov ___blue_glCore_glSecondaryColor3ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsVariantEnabledEXT -_bluegl_glIsVariantEnabledEXT: - mov ___blue_glCore_glIsVariantEnabledEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3sEXT +_bluegl_glSecondaryColor3sEXT: + mov ___blue_glCore_glSecondaryColor3sEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribfvNV -_bluegl_glGetVertexAttribfvNV: - mov ___blue_glCore_glGetVertexAttribfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3svEXT +_bluegl_glSecondaryColor3svEXT: + mov ___blue_glCore_glSecondaryColor3svEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramPipelineiv -_bluegl_glGetProgramPipelineiv: - mov ___blue_glCore_glGetProgramPipelineiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3ubEXT +_bluegl_glSecondaryColor3ubEXT: + mov ___blue_glCore_glSecondaryColor3ubEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUnmapBufferARB -_bluegl_glUnmapBufferARB: - mov ___blue_glCore_glUnmapBufferARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3ubvEXT +_bluegl_glSecondaryColor3ubvEXT: + mov ___blue_glCore_glSecondaryColor3ubvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribPointerNV -_bluegl_glVertexAttribPointerNV: - mov ___blue_glCore_glVertexAttribPointerNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3uiEXT +_bluegl_glSecondaryColor3uiEXT: + mov ___blue_glCore_glSecondaryColor3uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPathSpacingNV -_bluegl_glGetPathSpacingNV: - mov ___blue_glCore_glGetPathSpacingNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3uivEXT +_bluegl_glSecondaryColor3uivEXT: + mov ___blue_glCore_glSecondaryColor3uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMaterialxOES -_bluegl_glMaterialxOES: - mov ___blue_glCore_glMaterialxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3usEXT +_bluegl_glSecondaryColor3usEXT: + mov ___blue_glCore_glSecondaryColor3usEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream3fvATI -_bluegl_glVertexStream3fvATI: - mov ___blue_glCore_glVertexStream3fvATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3usvEXT +_bluegl_glSecondaryColor3usvEXT: + mov ___blue_glCore_glSecondaryColor3usvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream4dATI -_bluegl_glVertexStream4dATI: - mov ___blue_glCore_glVertexStream4dATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColorPointerEXT +_bluegl_glSecondaryColorPointerEXT: + mov ___blue_glCore_glSecondaryColorPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2d -_bluegl_glVertexAttrib2d: - mov ___blue_glCore_glVertexAttrib2d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUseShaderProgramEXT +_bluegl_glUseShaderProgramEXT: + mov ___blue_glCore_glUseShaderProgramEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStencilMaskSeparate -_bluegl_glStencilMaskSeparate: - mov ___blue_glCore_glStencilMaskSeparate@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glActiveProgramEXT +_bluegl_glActiveProgramEXT: + mov ___blue_glCore_glActiveProgramEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTestFenceAPPLE -_bluegl_glTestFenceAPPLE: - mov ___blue_glCore_glTestFenceAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreateShaderProgramEXT +_bluegl_glCreateShaderProgramEXT: + mov ___blue_glCore_glCreateShaderProgramEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindMaterialParameterEXT -_bluegl_glBindMaterialParameterEXT: - mov ___blue_glCore_glBindMaterialParameterEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindImageTextureEXT +_bluegl_glBindImageTextureEXT: + mov ___blue_glCore_glBindImageTextureEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendEquationEXT -_bluegl_glBlendEquationEXT: - mov ___blue_glCore_glBlendEquationEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMemoryBarrierEXT +_bluegl_glMemoryBarrierEXT: + mov ___blue_glCore_glMemoryBarrierEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4hNV -_bluegl_glMultiTexCoord4hNV: - mov ___blue_glCore_glMultiTexCoord4hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStencilClearTagEXT +_bluegl_glStencilClearTagEXT: + mov ___blue_glCore_glStencilClearTagEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1fARB -_bluegl_glMultiTexCoord1fARB: - mov ___blue_glCore_glMultiTexCoord1fARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glActiveStencilFaceEXT +_bluegl_glActiveStencilFaceEXT: + mov ___blue_glCore_glActiveStencilFaceEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPrioritizeTexturesxOES -_bluegl_glPrioritizeTexturesxOES: - mov ___blue_glCore_glPrioritizeTexturesxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexSubImage1DEXT +_bluegl_glTexSubImage1DEXT: + mov ___blue_glCore_glTexSubImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribs1fvNV -_bluegl_glVertexAttribs1fvNV: - mov ___blue_glCore_glVertexAttribs1fvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexSubImage2DEXT +_bluegl_glTexSubImage2DEXT: + mov ___blue_glCore_glTexSubImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetInternalformati64v -_bluegl_glGetInternalformati64v: - mov ___blue_glCore_glGetInternalformati64v@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexImage3DEXT +_bluegl_glTexImage3DEXT: + mov ___blue_glCore_glTexImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDisableVertexAttribAPPLE -_bluegl_glDisableVertexAttribAPPLE: - mov ___blue_glCore_glDisableVertexAttribAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexSubImage3DEXT +_bluegl_glTexSubImage3DEXT: + mov ___blue_glCore_glTexSubImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream3sATI -_bluegl_glVertexStream3sATI: - mov ___blue_glCore_glVertexStream3sATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferTextureLayerEXT +_bluegl_glFramebufferTextureLayerEXT: + mov ___blue_glCore_glFramebufferTextureLayerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCheckFramebufferStatusEXT -_bluegl_glCheckFramebufferStatusEXT: - mov ___blue_glCore_glCheckFramebufferStatusEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexBufferEXT +_bluegl_glTexBufferEXT: + mov ___blue_glCore_glTexBufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMinmax -_bluegl_glGetMinmax: - mov ___blue_glCore_glGetMinmax@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexParameterIivEXT +_bluegl_glTexParameterIivEXT: + mov ___blue_glCore_glTexParameterIivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyTexSubImage3DEXT -_bluegl_glCopyTexSubImage3DEXT: - mov ___blue_glCore_glCopyTexSubImage3DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexParameterIuivEXT +_bluegl_glTexParameterIuivEXT: + mov ___blue_glCore_glTexParameterIuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1ivARB -_bluegl_glUniform1ivARB: - mov ___blue_glCore_glUniform1ivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTexParameterIivEXT +_bluegl_glGetTexParameterIivEXT: + mov ___blue_glCore_glGetTexParameterIivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorP4uiv -_bluegl_glColorP4uiv: - mov ___blue_glCore_glColorP4uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTexParameterIuivEXT +_bluegl_glGetTexParameterIuivEXT: + mov ___blue_glCore_glGetTexParameterIuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDisableVertexAttribArrayARB -_bluegl_glDisableVertexAttribArrayARB: - mov ___blue_glCore_glDisableVertexAttribArrayARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearColorIiEXT +_bluegl_glClearColorIiEXT: + mov ___blue_glCore_glClearColorIiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedProgramLocalParameter4fvEXT -_bluegl_glNamedProgramLocalParameter4fvEXT: - mov ___blue_glCore_glNamedProgramLocalParameter4fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearColorIuiEXT +_bluegl_glClearColorIuiEXT: + mov ___blue_glCore_glClearColorIuiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendFuncSeparateEXT -_bluegl_glBlendFuncSeparateEXT: - mov ___blue_glCore_glBlendFuncSeparateEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glAreTexturesResidentEXT +_bluegl_glAreTexturesResidentEXT: + mov ___blue_glCore_glAreTexturesResidentEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL3i64NV -_bluegl_glVertexAttribL3i64NV: - mov ___blue_glCore_glVertexAttribL3i64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindTextureEXT +_bluegl_glBindTextureEXT: + mov ___blue_glCore_glBindTextureEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindProgramPipeline -_bluegl_glBindProgramPipeline: - mov ___blue_glCore_glBindProgramPipeline@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteTexturesEXT +_bluegl_glDeleteTexturesEXT: + mov ___blue_glCore_glDeleteTexturesEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreateProgramPipelines -_bluegl_glCreateProgramPipelines: - mov ___blue_glCore_glCreateProgramPipelines@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenTexturesEXT +_bluegl_glGenTexturesEXT: + mov ___blue_glCore_glGenTexturesEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteRenderbuffersEXT -_bluegl_glDeleteRenderbuffersEXT: - mov ___blue_glCore_glDeleteRenderbuffersEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsTextureEXT +_bluegl_glIsTextureEXT: + mov ___blue_glCore_glIsTextureEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEdgeFlagFormatNV -_bluegl_glEdgeFlagFormatNV: - mov ___blue_glCore_glEdgeFlagFormatNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPrioritizeTexturesEXT +_bluegl_glPrioritizeTexturesEXT: + mov ___blue_glCore_glPrioritizeTexturesEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetActiveUniformBlockiv -_bluegl_glGetActiveUniformBlockiv: - mov ___blue_glCore_glGetActiveUniformBlockiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureNormalEXT +_bluegl_glTextureNormalEXT: + mov ___blue_glCore_glTextureNormalEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3f -_bluegl_glProgramUniform3f: - mov ___blue_glCore_glProgramUniform3f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetQueryObjecti64vEXT +_bluegl_glGetQueryObjecti64vEXT: + mov ___blue_glCore_glGetQueryObjecti64vEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawCommandsStatesAddressNV -_bluegl_glDrawCommandsStatesAddressNV: - mov ___blue_glCore_glDrawCommandsStatesAddressNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetQueryObjectui64vEXT +_bluegl_glGetQueryObjectui64vEXT: + mov ___blue_glCore_glGetQueryObjectui64vEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribfv -_bluegl_glGetVertexAttribfv: - mov ___blue_glCore_glGetVertexAttribfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBeginTransformFeedbackEXT +_bluegl_glBeginTransformFeedbackEXT: + mov ___blue_glCore_glBeginTransformFeedbackEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVariantArrayObjectivATI -_bluegl_glGetVariantArrayObjectivATI: - mov ___blue_glCore_glGetVariantArrayObjectivATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEndTransformFeedbackEXT +_bluegl_glEndTransformFeedbackEXT: + mov ___blue_glCore_glEndTransformFeedbackEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedProgramLocalParameter4dEXT -_bluegl_glNamedProgramLocalParameter4dEXT: - mov ___blue_glCore_glNamedProgramLocalParameter4dEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindBufferRangeEXT +_bluegl_glBindBufferRangeEXT: + mov ___blue_glCore_glBindBufferRangeEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenTransformFeedbacksNV -_bluegl_glGenTransformFeedbacksNV: - mov ___blue_glCore_glGenTransformFeedbacksNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindBufferOffsetEXT +_bluegl_glBindBufferOffsetEXT: + mov ___blue_glCore_glBindBufferOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawElementArrayAPPLE -_bluegl_glDrawElementArrayAPPLE: - mov ___blue_glCore_glDrawElementArrayAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindBufferBaseEXT +_bluegl_glBindBufferBaseEXT: + mov ___blue_glCore_glBindBufferBaseEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4NusvARB -_bluegl_glVertexAttrib4NusvARB: - mov ___blue_glCore_glVertexAttrib4NusvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTransformFeedbackVaryingsEXT +_bluegl_glTransformFeedbackVaryingsEXT: + mov ___blue_glCore_glTransformFeedbackVaryingsEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindRenderbufferEXT -_bluegl_glBindRenderbufferEXT: - mov ___blue_glCore_glBindRenderbufferEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTransformFeedbackVaryingEXT +_bluegl_glGetTransformFeedbackVaryingEXT: + mov ___blue_glCore_glGetTransformFeedbackVaryingEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUnmapTexture2DINTEL -_bluegl_glUnmapTexture2DINTEL: - mov ___blue_glCore_glUnmapTexture2DINTEL@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glArrayElementEXT +_bluegl_glArrayElementEXT: + mov ___blue_glCore_glArrayElementEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramEnvParameterfvARB -_bluegl_glGetProgramEnvParameterfvARB: - mov ___blue_glCore_glGetProgramEnvParameterfvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorPointerEXT +_bluegl_glColorPointerEXT: + mov ___blue_glCore_glColorPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4f -_bluegl_glVertexAttrib4f: - mov ___blue_glCore_glVertexAttrib4f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawArraysEXT +_bluegl_glDrawArraysEXT: + mov ___blue_glCore_glDrawArraysEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnPixelMapfv -_bluegl_glGetnPixelMapfv: - mov ___blue_glCore_glGetnPixelMapfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEdgeFlagPointerEXT +_bluegl_glEdgeFlagPointerEXT: + mov ___blue_glCore_glEdgeFlagPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3dv -_bluegl_glVertexAttrib3dv: - mov ___blue_glCore_glVertexAttrib3dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPointervEXT +_bluegl_glGetPointervEXT: + mov ___blue_glCore_glGetPointervEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFlushMappedBufferRange -_bluegl_glFlushMappedBufferRange: - mov ___blue_glCore_glFlushMappedBufferRange@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIndexPointerEXT +_bluegl_glIndexPointerEXT: + mov ___blue_glCore_glIndexPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3ub -_bluegl_glSecondaryColor3ub: - mov ___blue_glCore_glSecondaryColor3ub@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormalPointerEXT +_bluegl_glNormalPointerEXT: + mov ___blue_glCore_glNormalPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPerfQueryDataINTEL -_bluegl_glGetPerfQueryDataINTEL: - mov ___blue_glCore_glGetPerfQueryDataINTEL@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoordPointerEXT +_bluegl_glTexCoordPointerEXT: + mov ___blue_glCore_glTexCoordPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnMapivARB -_bluegl_glGetnMapivARB: - mov ___blue_glCore_glGetnMapivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexPointerEXT +_bluegl_glVertexPointerEXT: + mov ___blue_glCore_glVertexPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSeparableFilter2DEXT -_bluegl_glSeparableFilter2DEXT: - mov ___blue_glCore_glSeparableFilter2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL1dEXT +_bluegl_glVertexAttribL1dEXT: + mov ___blue_glCore_glVertexAttribL1dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix3x2fvEXT -_bluegl_glProgramUniformMatrix3x2fvEXT: - mov ___blue_glCore_glProgramUniformMatrix3x2fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL2dEXT +_bluegl_glVertexAttribL2dEXT: + mov ___blue_glCore_glVertexAttribL2dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenVertexArrays -_bluegl_glGenVertexArrays: - mov ___blue_glCore_glGenVertexArrays@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL3dEXT +_bluegl_glVertexAttribL3dEXT: + mov ___blue_glCore_glVertexAttribL3dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEndQueryARB -_bluegl_glEndQueryARB: - mov ___blue_glCore_glEndQueryARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL4dEXT +_bluegl_glVertexAttribL4dEXT: + mov ___blue_glCore_glVertexAttribL4dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2fv -_bluegl_glVertexAttrib2fv: - mov ___blue_glCore_glVertexAttrib2fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL1dvEXT +_bluegl_glVertexAttribL1dvEXT: + mov ___blue_glCore_glVertexAttribL1dvEXT@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.private_extern _bluegl_glVertexAttribL2dvEXT +_bluegl_glVertexAttribL2dvEXT: + mov ___blue_glCore_glVertexAttribL2dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2fv -_bluegl_glWindowPos2fv: - mov ___blue_glCore_glWindowPos2fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL3dvEXT +_bluegl_glVertexAttribL3dvEXT: + mov ___blue_glCore_glVertexAttribL3dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyConvolutionFilter1D -_bluegl_glCopyConvolutionFilter1D: - mov ___blue_glCore_glCopyConvolutionFilter1D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL4dvEXT +_bluegl_glVertexAttribL4dvEXT: + mov ___blue_glCore_glVertexAttribL4dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoordFormatNV -_bluegl_glTexCoordFormatNV: - mov ___blue_glCore_glTexCoordFormatNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribLPointerEXT +_bluegl_glVertexAttribLPointerEXT: + mov ___blue_glCore_glVertexAttribLPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoordP2uiv -_bluegl_glMultiTexCoordP2uiv: - mov ___blue_glCore_glMultiTexCoordP2uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribLdvEXT +_bluegl_glGetVertexAttribLdvEXT: + mov ___blue_glCore_glGetVertexAttribLdvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1ui64vARB -_bluegl_glProgramUniform1ui64vARB: - mov ___blue_glCore_glProgramUniform1ui64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBeginVertexShaderEXT +_bluegl_glBeginVertexShaderEXT: + mov ___blue_glCore_glBeginVertexShaderEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorSubTable -_bluegl_glColorSubTable: - mov ___blue_glCore_glColorSubTable@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEndVertexShaderEXT +_bluegl_glEndVertexShaderEXT: + mov ___blue_glCore_glEndVertexShaderEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedBufferSubData -_bluegl_glNamedBufferSubData: - mov ___blue_glCore_glNamedBufferSubData@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindVertexShaderEXT +_bluegl_glBindVertexShaderEXT: + mov ___blue_glCore_glBindVertexShaderEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetCompressedTextureImage -_bluegl_glGetCompressedTextureImage: - mov ___blue_glCore_glGetCompressedTextureImage@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenVertexShadersEXT +_bluegl_glGenVertexShadersEXT: + mov ___blue_glCore_glGenVertexShadersEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedCopyBufferSubDataEXT -_bluegl_glNamedCopyBufferSubDataEXT: - mov ___blue_glCore_glNamedCopyBufferSubDataEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteVertexShaderEXT +_bluegl_glDeleteVertexShaderEXT: + mov ___blue_glCore_glDeleteVertexShaderEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL1i64NV -_bluegl_glVertexAttribL1i64NV: - mov ___blue_glCore_glVertexAttribL1i64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glShaderOp1EXT +_bluegl_glShaderOp1EXT: + mov ___blue_glCore_glShaderOp1EXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayMultiTexCoordOffsetEXT -_bluegl_glVertexArrayMultiTexCoordOffsetEXT: - mov ___blue_glCore_glVertexArrayMultiTexCoordOffsetEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glShaderOp2EXT +_bluegl_glShaderOp2EXT: + mov ___blue_glCore_glShaderOp2EXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetUniformIndices -_bluegl_glGetUniformIndices: - mov ___blue_glCore_glGetUniformIndices@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glShaderOp3EXT +_bluegl_glShaderOp3EXT: + mov ___blue_glCore_glShaderOp3EXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawArraysInstancedARB -_bluegl_glDrawArraysInstancedARB: - mov ___blue_glCore_glDrawArraysInstancedARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSwizzleEXT +_bluegl_glSwizzleEXT: + mov ___blue_glCore_glSwizzleEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMultiTexGenivEXT -_bluegl_glGetMultiTexGenivEXT: - mov ___blue_glCore_glGetMultiTexGenivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWriteMaskEXT +_bluegl_glWriteMaskEXT: + mov ___blue_glCore_glWriteMaskEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexArrayPointervEXT -_bluegl_glGetVertexArrayPointervEXT: - mov ___blue_glCore_glGetVertexArrayPointervEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glInsertComponentEXT +_bluegl_glInsertComponentEXT: + mov ___blue_glCore_glInsertComponentEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBeginQuery -_bluegl_glBeginQuery: - mov ___blue_glCore_glBeginQuery@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glExtractComponentEXT +_bluegl_glExtractComponentEXT: + mov ___blue_glCore_glExtractComponentEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDetachObjectARB -_bluegl_glDetachObjectARB: - mov ___blue_glCore_glDetachObjectARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenSymbolsEXT +_bluegl_glGenSymbolsEXT: + mov ___blue_glCore_glGenSymbolsEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4iv -_bluegl_glUniform4iv: - mov ___blue_glCore_glUniform4iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSetInvariantEXT +_bluegl_glSetInvariantEXT: + mov ___blue_glCore_glSetInvariantEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetQueryObjectuiv -_bluegl_glGetQueryObjectuiv: - mov ___blue_glCore_glGetQueryObjectuiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSetLocalConstantEXT +_bluegl_glSetLocalConstantEXT: + mov ___blue_glCore_glSetLocalConstantEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetObjectBufferivATI -_bluegl_glGetObjectBufferivATI: - mov ___blue_glCore_glGetObjectBufferivATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVariantbvEXT +_bluegl_glVariantbvEXT: + mov ___blue_glCore_glVariantbvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreateTransformFeedbacks -_bluegl_glCreateTransformFeedbacks: - mov ___blue_glCore_glCreateTransformFeedbacks@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVariantsvEXT +_bluegl_glVariantsvEXT: + mov ___blue_glCore_glVariantsvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream3dATI -_bluegl_glVertexStream3dATI: - mov ___blue_glCore_glVertexStream3dATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVariantivEXT +_bluegl_glVariantivEXT: + mov ___blue_glCore_glVariantivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEvalMapsNV -_bluegl_glEvalMapsNV: - mov ___blue_glCore_glEvalMapsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVariantfvEXT +_bluegl_glVariantfvEXT: + mov ___blue_glCore_glVariantfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsNameAMD -_bluegl_glIsNameAMD: - mov ___blue_glCore_glIsNameAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVariantdvEXT +_bluegl_glVariantdvEXT: + mov ___blue_glCore_glVariantdvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4ivARB -_bluegl_glVertexAttrib4ivARB: - mov ___blue_glCore_glVertexAttrib4ivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVariantubvEXT +_bluegl_glVariantubvEXT: + mov ___blue_glCore_glVariantubvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramSubroutineParameteruivNV -_bluegl_glGetProgramSubroutineParameteruivNV: - mov ___blue_glCore_glGetProgramSubroutineParameteruivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVariantusvEXT +_bluegl_glVariantusvEXT: + mov ___blue_glCore_glVariantusvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix2x4dv -_bluegl_glProgramUniformMatrix2x4dv: - mov ___blue_glCore_glProgramUniformMatrix2x4dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVariantuivEXT +_bluegl_glVariantuivEXT: + mov ___blue_glCore_glVariantuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBeginPerfQueryINTEL -_bluegl_glBeginPerfQueryINTEL: - mov ___blue_glCore_glBeginPerfQueryINTEL@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVariantPointerEXT +_bluegl_glVariantPointerEXT: + mov ___blue_glCore_glVariantPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathParameteriNV -_bluegl_glPathParameteriNV: - mov ___blue_glCore_glPathParameteriNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEnableVariantClientStateEXT +_bluegl_glEnableVariantClientStateEXT: + mov ___blue_glCore_glEnableVariantClientStateEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4i64vNV -_bluegl_glUniform4i64vNV: - mov ___blue_glCore_glUniform4i64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDisableVariantClientStateEXT +_bluegl_glDisableVariantClientStateEXT: + mov ___blue_glCore_glDisableVariantClientStateEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStateCaptureNV -_bluegl_glStateCaptureNV: - mov ___blue_glCore_glStateCaptureNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindLightParameterEXT +_bluegl_glBindLightParameterEXT: + mov ___blue_glCore_glBindLightParameterEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3fvEXT -_bluegl_glProgramUniform3fvEXT: - mov ___blue_glCore_glProgramUniform3fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindMaterialParameterEXT +_bluegl_glBindMaterialParameterEXT: + mov ___blue_glCore_glBindMaterialParameterEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL1d -_bluegl_glVertexAttribL1d: - mov ___blue_glCore_glVertexAttribL1d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindTexGenParameterEXT +_bluegl_glBindTexGenParameterEXT: + mov ___blue_glCore_glBindTexGenParameterEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixLoadIdentityEXT -_bluegl_glMatrixLoadIdentityEXT: - mov ___blue_glCore_glMatrixLoadIdentityEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindTextureUnitParameterEXT +_bluegl_glBindTextureUnitParameterEXT: + mov ___blue_glCore_glBindTextureUnitParameterEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindVertexArrayAPPLE -_bluegl_glBindVertexArrayAPPLE: - mov ___blue_glCore_glBindVertexArrayAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindParameterEXT +_bluegl_glBindParameterEXT: + mov ___blue_glCore_glBindParameterEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glRasterPos2xvOES -_bluegl_glRasterPos2xvOES: - mov ___blue_glCore_glRasterPos2xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsVariantEnabledEXT +_bluegl_glIsVariantEnabledEXT: + mov ___blue_glCore_glIsVariantEnabledEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCommandListSegmentsNV -_bluegl_glCommandListSegmentsNV: - mov ___blue_glCore_glCommandListSegmentsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVariantBooleanvEXT +_bluegl_glGetVariantBooleanvEXT: + mov ___blue_glCore_glGetVariantBooleanvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos4svMESA -_bluegl_glWindowPos4svMESA: - mov ___blue_glCore_glWindowPos4svMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVariantIntegervEXT +_bluegl_glGetVariantIntegervEXT: + mov ___blue_glCore_glGetVariantIntegervEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramLocalParameter4dvARB -_bluegl_glProgramLocalParameter4dvARB: - mov ___blue_glCore_glProgramLocalParameter4dvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVariantFloatvEXT +_bluegl_glGetVariantFloatvEXT: + mov ___blue_glCore_glGetVariantFloatvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnPolygonStipple -_bluegl_glGetnPolygonStipple: - mov ___blue_glCore_glGetnPolygonStipple@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVariantPointervEXT +_bluegl_glGetVariantPointervEXT: + mov ___blue_glCore_glGetVariantPointervEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1svARB -_bluegl_glMultiTexCoord1svARB: - mov ___blue_glCore_glMultiTexCoord1svARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetInvariantBooleanvEXT +_bluegl_glGetInvariantBooleanvEXT: + mov ___blue_glCore_glGetInvariantBooleanvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedRenderbufferStorage -_bluegl_glNamedRenderbufferStorage: - mov ___blue_glCore_glNamedRenderbufferStorage@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetInvariantIntegervEXT +_bluegl_glGetInvariantIntegervEXT: + mov ___blue_glCore_glGetInvariantIntegervEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramEnvParameterI4iNV -_bluegl_glProgramEnvParameterI4iNV: - mov ___blue_glCore_glProgramEnvParameterI4iNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetInvariantFloatvEXT +_bluegl_glGetInvariantFloatvEXT: + mov ___blue_glCore_glGetInvariantFloatvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribIFormat -_bluegl_glVertexAttribIFormat: - mov ___blue_glCore_glVertexAttribIFormat@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetLocalConstantBooleanvEXT +_bluegl_glGetLocalConstantBooleanvEXT: + mov ___blue_glCore_glGetLocalConstantBooleanvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFogCoordfvEXT -_bluegl_glFogCoordfvEXT: - mov ___blue_glCore_glFogCoordfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetLocalConstantIntegervEXT +_bluegl_glGetLocalConstantIntegervEXT: + mov ___blue_glCore_glGetLocalConstantIntegervEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEnableVertexAttribArray -_bluegl_glEnableVertexAttribArray: - mov ___blue_glCore_glEnableVertexAttribArray@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetLocalConstantFloatvEXT +_bluegl_glGetLocalConstantFloatvEXT: + mov ___blue_glCore_glGetLocalConstantFloatvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPolygonOffsetClampEXT -_bluegl_glPolygonOffsetClampEXT: - mov ___blue_glCore_glPolygonOffsetClampEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexWeightfEXT +_bluegl_glVertexWeightfEXT: + mov ___blue_glCore_glVertexWeightfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEnable -_bluegl_glEnable: - mov ___blue_glCore_glEnable@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexWeightfvEXT +_bluegl_glVertexWeightfvEXT: + mov ___blue_glCore_glVertexWeightfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIndexFuncEXT -_bluegl_glIndexFuncEXT: - mov ___blue_glCore_glIndexFuncEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexWeightPointerEXT +_bluegl_glVertexWeightPointerEXT: + mov ___blue_glCore_glVertexWeightPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDepthRangeArrayv -_bluegl_glDepthRangeArrayv: - mov ___blue_glCore_glDepthRangeArrayv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glImportSyncEXT +_bluegl_glImportSyncEXT: + mov ___blue_glCore_glImportSyncEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glRasterPos4xvOES -_bluegl_glRasterPos4xvOES: - mov ___blue_glCore_glRasterPos4xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFrameTerminatorGREMEDY +_bluegl_glFrameTerminatorGREMEDY: + mov ___blue_glCore_glFrameTerminatorGREMEDY@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSpriteParameterfvSGIX -_bluegl_glSpriteParameterfvSGIX: - mov ___blue_glCore_glSpriteParameterfvSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStringMarkerGREMEDY +_bluegl_glStringMarkerGREMEDY: + mov ___blue_glCore_glStringMarkerGREMEDY@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnUniformdv -_bluegl_glGetnUniformdv: - mov ___blue_glCore_glGetnUniformdv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glImageTransformParameteriHP +_bluegl_glImageTransformParameteriHP: + mov ___blue_glCore_glImageTransformParameteriHP@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetHistogram -_bluegl_glGetHistogram: - mov ___blue_glCore_glGetHistogram@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glImageTransformParameterfHP +_bluegl_glImageTransformParameterfHP: + mov ___blue_glCore_glImageTransformParameterfHP@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearColorIiEXT -_bluegl_glClearColorIiEXT: - mov ___blue_glCore_glClearColorIiEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glImageTransformParameterivHP +_bluegl_glImageTransformParameterivHP: + mov ___blue_glCore_glImageTransformParameterivHP@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTbufferMask3DFX -_bluegl_glTbufferMask3DFX: - mov ___blue_glCore_glTbufferMask3DFX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glImageTransformParameterfvHP +_bluegl_glImageTransformParameterfvHP: + mov ___blue_glCore_glImageTransformParameterfvHP@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1f -_bluegl_glProgramUniform1f: - mov ___blue_glCore_glProgramUniform1f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetImageTransformParameterivHP +_bluegl_glGetImageTransformParameterivHP: + mov ___blue_glCore_glGetImageTransformParameterivHP@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4Niv -_bluegl_glVertexAttrib4Niv: - mov ___blue_glCore_glVertexAttrib4Niv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetImageTransformParameterfvHP +_bluegl_glGetImageTransformParameterfvHP: + mov ___blue_glCore_glGetImageTransformParameterfvHP@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetUniformLocationARB -_bluegl_glGetUniformLocationARB: - mov ___blue_glCore_glGetUniformLocationARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiModeDrawArraysIBM +_bluegl_glMultiModeDrawArraysIBM: + mov ___blue_glCore_glMultiModeDrawArraysIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColor4hvNV -_bluegl_glColor4hvNV: - mov ___blue_glCore_glColor4hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiModeDrawElementsIBM +_bluegl_glMultiModeDrawElementsIBM: + mov ___blue_glCore_glMultiModeDrawElementsIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureBufferRangeEXT -_bluegl_glTextureBufferRangeEXT: - mov ___blue_glCore_glTextureBufferRangeEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFlushStaticDataIBM +_bluegl_glFlushStaticDataIBM: + mov ___blue_glCore_glFlushStaticDataIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGlobalAlphaFactorsSUN -_bluegl_glGlobalAlphaFactorsSUN: - mov ___blue_glCore_glGlobalAlphaFactorsSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorPointerListIBM +_bluegl_glColorPointerListIBM: + mov ___blue_glCore_glColorPointerListIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyTextureSubImage2D -_bluegl_glCopyTextureSubImage2D: - mov ___blue_glCore_glCopyTextureSubImage2D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColorPointerListIBM +_bluegl_glSecondaryColorPointerListIBM: + mov ___blue_glCore_glSecondaryColorPointerListIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1i64vARB -_bluegl_glUniform1i64vARB: - mov ___blue_glCore_glUniform1i64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEdgeFlagPointerListIBM +_bluegl_glEdgeFlagPointerListIBM: + mov ___blue_glCore_glEdgeFlagPointerListIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2dNV -_bluegl_glVertexAttrib2dNV: - mov ___blue_glCore_glVertexAttrib2dNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFogCoordPointerListIBM +_bluegl_glFogCoordPointerListIBM: + mov ___blue_glCore_glFogCoordPointerListIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4NbvARB -_bluegl_glVertexAttrib4NbvARB: - mov ___blue_glCore_glVertexAttrib4NbvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIndexPointerListIBM +_bluegl_glIndexPointerListIBM: + mov ___blue_glCore_glIndexPointerListIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPatchParameteri -_bluegl_glPatchParameteri: - mov ___blue_glCore_glPatchParameteri@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormalPointerListIBM +_bluegl_glNormalPointerListIBM: + mov ___blue_glCore_glNormalPointerListIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedStringARB -_bluegl_glGetNamedStringARB: - mov ___blue_glCore_glGetNamedStringARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoordPointerListIBM +_bluegl_glTexCoordPointerListIBM: + mov ___blue_glCore_glTexCoordPointerListIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetCombinerStageParameterfvNV -_bluegl_glGetCombinerStageParameterfvNV: - mov ___blue_glCore_glGetCombinerStageParameterfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexPointerListIBM +_bluegl_glVertexPointerListIBM: + mov ___blue_glCore_glVertexPointerListIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2svARB -_bluegl_glVertexAttrib2svARB: - mov ___blue_glCore_glVertexAttrib2svARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendFuncSeparateINGR +_bluegl_glBlendFuncSeparateINGR: + mov ___blue_glCore_glBlendFuncSeparateINGR@GOTPCREL(%rip), %r11 jmp *(%r11) .private_extern _bluegl_glApplyFramebufferAttachmentCMAAINTEL @@ -9829,549 +9843,559 @@ _bluegl_glApplyFramebufferAttachmentCMAAINTEL: mov ___blue_glCore_glApplyFramebufferAttachmentCMAAINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVideouivNV -_bluegl_glGetVideouivNV: - mov ___blue_glCore_glGetVideouivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSyncTextureINTEL +_bluegl_glSyncTextureINTEL: + mov ___blue_glCore_glSyncTextureINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3s -_bluegl_glMultiTexCoord3s: - mov ___blue_glCore_glMultiTexCoord3s@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUnmapTexture2DINTEL +_bluegl_glUnmapTexture2DINTEL: + mov ___blue_glCore_glUnmapTexture2DINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1sARB -_bluegl_glMultiTexCoord1sARB: - mov ___blue_glCore_glMultiTexCoord1sARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMapTexture2DINTEL +_bluegl_glMapTexture2DINTEL: + mov ___blue_glCore_glMapTexture2DINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLogicOp -_bluegl_glLogicOp: - mov ___blue_glCore_glLogicOp@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexPointervINTEL +_bluegl_glVertexPointervINTEL: + mov ___blue_glCore_glVertexPointervINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFogFuncSGIS -_bluegl_glFogFuncSGIS: - mov ___blue_glCore_glFogFuncSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormalPointervINTEL +_bluegl_glNormalPointervINTEL: + mov ___blue_glCore_glNormalPointervINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixMultfEXT -_bluegl_glMatrixMultfEXT: - mov ___blue_glCore_glMatrixMultfEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorPointervINTEL +_bluegl_glColorPointervINTEL: + mov ___blue_glCore_glColorPointervINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTexParameterfv -_bluegl_glGetTexParameterfv: - mov ___blue_glCore_glGetTexParameterfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoordPointervINTEL +_bluegl_glTexCoordPointervINTEL: + mov ___blue_glCore_glTexCoordPointervINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColorP3uiv -_bluegl_glSecondaryColorP3uiv: - mov ___blue_glCore_glSecondaryColorP3uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBeginPerfQueryINTEL +_bluegl_glBeginPerfQueryINTEL: + mov ___blue_glCore_glBeginPerfQueryINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexParameteriEXT -_bluegl_glMultiTexParameteriEXT: - mov ___blue_glCore_glMultiTexParameteriEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreatePerfQueryINTEL +_bluegl_glCreatePerfQueryINTEL: + mov ___blue_glCore_glCreatePerfQueryINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEnableClientStateIndexedEXT -_bluegl_glEnableClientStateIndexedEXT: - mov ___blue_glCore_glEnableClientStateIndexedEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeletePerfQueryINTEL +_bluegl_glDeletePerfQueryINTEL: + mov ___blue_glCore_glDeletePerfQueryINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenPathsNV -_bluegl_glGenPathsNV: - mov ___blue_glCore_glGenPathsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEndPerfQueryINTEL +_bluegl_glEndPerfQueryINTEL: + mov ___blue_glCore_glEndPerfQueryINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetBufferSubData -_bluegl_glGetBufferSubData: - mov ___blue_glCore_glGetBufferSubData@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFirstPerfQueryIdINTEL +_bluegl_glGetFirstPerfQueryIdINTEL: + mov ___blue_glCore_glGetFirstPerfQueryIdINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetDoublei_v -_bluegl_glGetDoublei_v: - mov ___blue_glCore_glGetDoublei_v@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNextPerfQueryIdINTEL +_bluegl_glGetNextPerfQueryIdINTEL: + mov ___blue_glCore_glGetNextPerfQueryIdINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCoverStrokePathNV -_bluegl_glCoverStrokePathNV: - mov ___blue_glCore_glCoverStrokePathNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPerfCounterInfoINTEL +_bluegl_glGetPerfCounterInfoINTEL: + mov ___blue_glCore_glGetPerfCounterInfoINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFrontFace -_bluegl_glFrontFace: - mov ___blue_glCore_glFrontFace@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPerfQueryDataINTEL +_bluegl_glGetPerfQueryDataINTEL: + mov ___blue_glCore_glGetPerfQueryDataINTEL@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.private_extern _bluegl_glGetPerfQueryIdByNameINTEL +_bluegl_glGetPerfQueryIdByNameINTEL: + mov ___blue_glCore_glGetPerfQueryIdByNameINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glScissorIndexedv -_bluegl_glScissorIndexedv: - mov ___blue_glCore_glScissorIndexedv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPerfQueryInfoINTEL +_bluegl_glGetPerfQueryInfoINTEL: + mov ___blue_glCore_glGetPerfQueryInfoINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureStorage3D -_bluegl_glTextureStorage3D: - mov ___blue_glCore_glTextureStorage3D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glResizeBuffersMESA +_bluegl_glResizeBuffersMESA: + mov ___blue_glCore_glResizeBuffersMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathFogGenNV -_bluegl_glPathFogGenNV: - mov ___blue_glCore_glPathFogGenNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2dMESA +_bluegl_glWindowPos2dMESA: + mov ___blue_glCore_glWindowPos2dMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPixelTexGenParameterivSGIS -_bluegl_glPixelTexGenParameterivSGIS: - mov ___blue_glCore_glPixelTexGenParameterivSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2dvMESA +_bluegl_glWindowPos2dvMESA: + mov ___blue_glCore_glWindowPos2dvMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendEquationi -_bluegl_glBlendEquationi: - mov ___blue_glCore_glBlendEquationi@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2fMESA +_bluegl_glWindowPos2fMESA: + mov ___blue_glCore_glWindowPos2fMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetHistogramParameterivEXT -_bluegl_glGetHistogramParameterivEXT: - mov ___blue_glCore_glGetHistogramParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2fvMESA +_bluegl_glWindowPos2fvMESA: + mov ___blue_glCore_glWindowPos2fvMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearNamedFramebufferfi -_bluegl_glClearNamedFramebufferfi: - mov ___blue_glCore_glClearNamedFramebufferfi@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2iMESA +_bluegl_glWindowPos2iMESA: + mov ___blue_glCore_glWindowPos2iMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyColorTableSGI -_bluegl_glCopyColorTableSGI: - mov ___blue_glCore_glCopyColorTableSGI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2ivMESA +_bluegl_glWindowPos2ivMESA: + mov ___blue_glCore_glWindowPos2ivMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBinormal3dEXT -_bluegl_glBinormal3dEXT: - mov ___blue_glCore_glBinormal3dEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2sMESA +_bluegl_glWindowPos2sMESA: + mov ___blue_glCore_glWindowPos2sMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetBufferParameterui64vNV -_bluegl_glGetBufferParameterui64vNV: - mov ___blue_glCore_glGetBufferParameterui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos2svMESA +_bluegl_glWindowPos2svMESA: + mov ___blue_glCore_glWindowPos2svMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureImage2DEXT -_bluegl_glTextureImage2DEXT: - mov ___blue_glCore_glTextureImage2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3dMESA +_bluegl_glWindowPos3dMESA: + mov ___blue_glCore_glWindowPos3dMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTransformFeedbackVaryings -_bluegl_glTransformFeedbackVaryings: - mov ___blue_glCore_glTransformFeedbackVaryings@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3dvMESA +_bluegl_glWindowPos3dvMESA: + mov ___blue_glCore_glWindowPos3dvMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedFramebufferSampleLocationsfvNV -_bluegl_glNamedFramebufferSampleLocationsfvNV: - mov ___blue_glCore_glNamedFramebufferSampleLocationsfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3fMESA +_bluegl_glWindowPos3fMESA: + mov ___blue_glCore_glWindowPos3fMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMapTexture2DINTEL -_bluegl_glMapTexture2DINTEL: - mov ___blue_glCore_glMapTexture2DINTEL@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3fvMESA +_bluegl_glWindowPos3fvMESA: + mov ___blue_glCore_glWindowPos3fvMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMaterialxvOES -_bluegl_glMaterialxvOES: - mov ___blue_glCore_glMaterialxvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3iMESA +_bluegl_glWindowPos3iMESA: + mov ___blue_glCore_glWindowPos3iMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenNamesAMD -_bluegl_glGenNamesAMD: - mov ___blue_glCore_glGenNamesAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3ivMESA +_bluegl_glWindowPos3ivMESA: + mov ___blue_glCore_glWindowPos3ivMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2uiEXT -_bluegl_glUniform2uiEXT: - mov ___blue_glCore_glUniform2uiEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3sMESA +_bluegl_glWindowPos3sMESA: + mov ___blue_glCore_glWindowPos3sMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1xvOES -_bluegl_glMultiTexCoord1xvOES: - mov ___blue_glCore_glMultiTexCoord1xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos3svMESA +_bluegl_glWindowPos3svMESA: + mov ___blue_glCore_glWindowPos3svMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEnableIndexedEXT -_bluegl_glEnableIndexedEXT: - mov ___blue_glCore_glEnableIndexedEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos4dMESA +_bluegl_glWindowPos4dMESA: + mov ___blue_glCore_glWindowPos4dMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTextureImage1DEXT -_bluegl_glCompressedTextureImage1DEXT: - mov ___blue_glCore_glCompressedTextureImage1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos4dvMESA +_bluegl_glWindowPos4dvMESA: + mov ___blue_glCore_glWindowPos4dvMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3fv -_bluegl_glMultiTexCoord3fv: - mov ___blue_glCore_glMultiTexCoord3fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos4fMESA +_bluegl_glWindowPos4fMESA: + mov ___blue_glCore_glWindowPos4fMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnPolygonStippleARB -_bluegl_glGetnPolygonStippleARB: - mov ___blue_glCore_glGetnPolygonStippleARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos4fvMESA +_bluegl_glWindowPos4fvMESA: + mov ___blue_glCore_glWindowPos4fvMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord2fColor3fVertex3fvSUN -_bluegl_glTexCoord2fColor3fVertex3fvSUN: - mov ___blue_glCore_glTexCoord2fColor3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos4iMESA +_bluegl_glWindowPos4iMESA: + mov ___blue_glCore_glWindowPos4iMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindTransformFeedbackNV -_bluegl_glBindTransformFeedbackNV: - mov ___blue_glCore_glBindTransformFeedbackNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos4ivMESA +_bluegl_glWindowPos4ivMESA: + mov ___blue_glCore_glWindowPos4ivMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream2svATI -_bluegl_glVertexStream2svATI: - mov ___blue_glCore_glVertexStream2svATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos4sMESA +_bluegl_glWindowPos4sMESA: + mov ___blue_glCore_glWindowPos4sMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1fvARB -_bluegl_glMultiTexCoord1fvARB: - mov ___blue_glCore_glMultiTexCoord1fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWindowPos4svMESA +_bluegl_glWindowPos4svMESA: + mov ___blue_glCore_glWindowPos4svMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexGendvEXT -_bluegl_glMultiTexGendvEXT: - mov ___blue_glCore_glMultiTexGendvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBeginConditionalRenderNVX +_bluegl_glBeginConditionalRenderNVX: + mov ___blue_glCore_glBeginConditionalRenderNVX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2ui64vNV -_bluegl_glProgramUniform2ui64vNV: - mov ___blue_glCore_glProgramUniform2ui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEndConditionalRenderNVX +_bluegl_glEndConditionalRenderNVX: + mov ___blue_glCore_glEndConditionalRenderNVX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedRenderbufferParameteriv -_bluegl_glGetNamedRenderbufferParameteriv: - mov ___blue_glCore_glGetNamedRenderbufferParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiDrawArraysIndirectBindlessNV +_bluegl_glMultiDrawArraysIndirectBindlessNV: + mov ___blue_glCore_glMultiDrawArraysIndirectBindlessNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendEquationSeparateEXT -_bluegl_glBlendEquationSeparateEXT: - mov ___blue_glCore_glBlendEquationSeparateEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiDrawElementsIndirectBindlessNV +_bluegl_glMultiDrawElementsIndirectBindlessNV: + mov ___blue_glCore_glMultiDrawElementsIndirectBindlessNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glInvalidateBufferData -_bluegl_glInvalidateBufferData: - mov ___blue_glCore_glInvalidateBufferData@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiDrawArraysIndirectBindlessCountNV +_bluegl_glMultiDrawArraysIndirectBindlessCountNV: + mov ___blue_glCore_glMultiDrawArraysIndirectBindlessCountNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFragmentLightModelfvSGIX -_bluegl_glFragmentLightModelfvSGIX: - mov ___blue_glCore_glFragmentLightModelfvSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiDrawElementsIndirectBindlessCountNV +_bluegl_glMultiDrawElementsIndirectBindlessCountNV: + mov ___blue_glCore_glMultiDrawElementsIndirectBindlessCountNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMakeTextureHandleNonResidentARB -_bluegl_glMakeTextureHandleNonResidentARB: - mov ___blue_glCore_glMakeTextureHandleNonResidentARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTextureHandleNV +_bluegl_glGetTextureHandleNV: + mov ___blue_glCore_glGetTextureHandleNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMap2xOES -_bluegl_glMap2xOES: - mov ___blue_glCore_glMap2xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTextureSamplerHandleNV +_bluegl_glGetTextureSamplerHandleNV: + mov ___blue_glCore_glGetTextureSamplerHandleNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferRenderbufferEXT -_bluegl_glFramebufferRenderbufferEXT: - mov ___blue_glCore_glFramebufferRenderbufferEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMakeTextureHandleResidentNV +_bluegl_glMakeTextureHandleResidentNV: + mov ___blue_glCore_glMakeTextureHandleResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMapAttribParameterfvNV -_bluegl_glGetMapAttribParameterfvNV: - mov ___blue_glCore_glGetMapAttribParameterfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMakeTextureHandleNonResidentNV +_bluegl_glMakeTextureHandleNonResidentNV: + mov ___blue_glCore_glMakeTextureHandleNonResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2dvARB -_bluegl_glVertexAttrib2dvARB: - mov ___blue_glCore_glVertexAttrib2dvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetImageHandleNV +_bluegl_glGetImageHandleNV: + mov ___blue_glCore_glGetImageHandleNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glInvalidateBufferSubData -_bluegl_glInvalidateBufferSubData: - mov ___blue_glCore_glInvalidateBufferSubData@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMakeImageHandleResidentNV +_bluegl_glMakeImageHandleResidentNV: + mov ___blue_glCore_glMakeImageHandleResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1d -_bluegl_glVertexAttrib1d: - mov ___blue_glCore_glVertexAttrib1d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMakeImageHandleNonResidentNV +_bluegl_glMakeImageHandleNonResidentNV: + mov ___blue_glCore_glMakeImageHandleNonResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDispatchComputeIndirect -_bluegl_glDispatchComputeIndirect: - mov ___blue_glCore_glDispatchComputeIndirect@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformHandleui64NV +_bluegl_glUniformHandleui64NV: + mov ___blue_glCore_glUniformHandleui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStencilFuncSeparate -_bluegl_glStencilFuncSeparate: - mov ___blue_glCore_glStencilFuncSeparate@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformHandleui64vNV +_bluegl_glUniformHandleui64vNV: + mov ___blue_glCore_glUniformHandleui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMapVertexAttrib2fAPPLE -_bluegl_glMapVertexAttrib2fAPPLE: - mov ___blue_glCore_glMapVertexAttrib2fAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformHandleui64NV +_bluegl_glProgramUniformHandleui64NV: + mov ___blue_glCore_glProgramUniformHandleui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix2x4fv -_bluegl_glProgramUniformMatrix2x4fv: - mov ___blue_glCore_glProgramUniformMatrix2x4fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformHandleui64vNV +_bluegl_glProgramUniformHandleui64vNV: + mov ___blue_glCore_glProgramUniformHandleui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReadPixels -_bluegl_glReadPixels: - mov ___blue_glCore_glReadPixels@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsTextureHandleResidentNV +_bluegl_glIsTextureHandleResidentNV: + mov ___blue_glCore_glIsTextureHandleResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayAttribIFormat -_bluegl_glVertexArrayAttribIFormat: - mov ___blue_glCore_glVertexArrayAttribIFormat@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsImageHandleResidentNV +_bluegl_glIsImageHandleResidentNV: + mov ___blue_glCore_glIsImageHandleResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyMultiTexSubImage1DEXT -_bluegl_glCopyMultiTexSubImage1DEXT: - mov ___blue_glCore_glCopyMultiTexSubImage1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendParameteriNV +_bluegl_glBlendParameteriNV: + mov ___blue_glCore_glBlendParameteriNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendEquationSeparateIndexedAMD -_bluegl_glBlendEquationSeparateIndexedAMD: - mov ___blue_glCore_glBlendEquationSeparateIndexedAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBlendBarrierNV +_bluegl_glBlendBarrierNV: + mov ___blue_glCore_glBlendBarrierNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTransformFeedbackVaryingEXT -_bluegl_glGetTransformFeedbackVaryingEXT: - mov ___blue_glCore_glGetTransformFeedbackVaryingEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreateStatesNV +_bluegl_glCreateStatesNV: + mov ___blue_glCore_glCreateStatesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2ui64ARB -_bluegl_glProgramUniform2ui64ARB: - mov ___blue_glCore_glProgramUniform2ui64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteStatesNV +_bluegl_glDeleteStatesNV: + mov ___blue_glCore_glDeleteStatesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1i64vARB -_bluegl_glProgramUniform1i64vARB: - mov ___blue_glCore_glProgramUniform1i64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsStateNV +_bluegl_glIsStateNV: + mov ___blue_glCore_glIsStateNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4iv -_bluegl_glMultiTexCoord4iv: - mov ___blue_glCore_glMultiTexCoord4iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStateCaptureNV +_bluegl_glStateCaptureNV: + mov ___blue_glCore_glStateCaptureNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLoadIdentityDeformationMapSGIX -_bluegl_glLoadIdentityDeformationMapSGIX: - mov ___blue_glCore_glLoadIdentityDeformationMapSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetCommandHeaderNV +_bluegl_glGetCommandHeaderNV: + mov ___blue_glCore_glGetCommandHeaderNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMultiTexGendvEXT -_bluegl_glGetMultiTexGendvEXT: - mov ___blue_glCore_glGetMultiTexGendvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetStageIndexNV +_bluegl_glGetStageIndexNV: + mov ___blue_glCore_glGetStageIndexNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertex4xvOES -_bluegl_glVertex4xvOES: - mov ___blue_glCore_glVertex4xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawCommandsNV +_bluegl_glDrawCommandsNV: + mov ___blue_glCore_glDrawCommandsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayVertexAttribOffsetEXT -_bluegl_glVertexArrayVertexAttribOffsetEXT: - mov ___blue_glCore_glVertexArrayVertexAttribOffsetEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawCommandsAddressNV +_bluegl_glDrawCommandsAddressNV: + mov ___blue_glCore_glDrawCommandsAddressNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormalP3ui -_bluegl_glNormalP3ui: - mov ___blue_glCore_glNormalP3ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawCommandsStatesNV +_bluegl_glDrawCommandsStatesNV: + mov ___blue_glCore_glDrawCommandsStatesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMapParameterivNV -_bluegl_glMapParameterivNV: - mov ___blue_glCore_glMapParameterivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawCommandsStatesAddressNV +_bluegl_glDrawCommandsStatesAddressNV: + mov ___blue_glCore_glDrawCommandsStatesAddressNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorPointervINTEL -_bluegl_glColorPointervINTEL: - mov ___blue_glCore_glColorPointervINTEL@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCreateCommandListsNV +_bluegl_glCreateCommandListsNV: + mov ___blue_glCore_glCreateCommandListsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetQueryObjectui64v -_bluegl_glGetQueryObjectui64v: - mov ___blue_glCore_glGetQueryObjectui64v@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteCommandListsNV +_bluegl_glDeleteCommandListsNV: + mov ___blue_glCore_glDeleteCommandListsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenFencesAPPLE -_bluegl_glGenFencesAPPLE: - mov ___blue_glCore_glGenFencesAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsCommandListNV +_bluegl_glIsCommandListNV: + mov ___blue_glCore_glIsCommandListNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedBufferPageCommitmentEXT -_bluegl_glNamedBufferPageCommitmentEXT: - mov ___blue_glCore_glNamedBufferPageCommitmentEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glListDrawCommandsStatesClientNV +_bluegl_glListDrawCommandsStatesClientNV: + mov ___blue_glCore_glListDrawCommandsStatesClientNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetShaderSourceARB -_bluegl_glGetShaderSourceARB: - mov ___blue_glCore_glGetShaderSourceARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCommandListSegmentsNV +_bluegl_glCommandListSegmentsNV: + mov ___blue_glCore_glCommandListSegmentsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearNamedFramebufferuiv -_bluegl_glClearNamedFramebufferuiv: - mov ___blue_glCore_glClearNamedFramebufferuiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCompileCommandListNV +_bluegl_glCompileCommandListNV: + mov ___blue_glCore_glCompileCommandListNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVDPAUIsSurfaceNV -_bluegl_glVDPAUIsSurfaceNV: - mov ___blue_glCore_glVDPAUIsSurfaceNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCallCommandListNV +_bluegl_glCallCommandListNV: + mov ___blue_glCore_glCallCommandListNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL2ui64NV -_bluegl_glVertexAttribL2ui64NV: - mov ___blue_glCore_glVertexAttribL2ui64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBeginConditionalRenderNV +_bluegl_glBeginConditionalRenderNV: + mov ___blue_glCore_glBeginConditionalRenderNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColor4xvOES -_bluegl_glColor4xvOES: - mov ___blue_glCore_glColor4xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEndConditionalRenderNV +_bluegl_glEndConditionalRenderNV: + mov ___blue_glCore_glEndConditionalRenderNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformBlockBinding -_bluegl_glUniformBlockBinding: - mov ___blue_glCore_glUniformBlockBinding@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSubpixelPrecisionBiasNV +_bluegl_glSubpixelPrecisionBiasNV: + mov ___blue_glCore_glSubpixelPrecisionBiasNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glListParameterivSGIX -_bluegl_glListParameterivSGIX: - mov ___blue_glCore_glListParameterivSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glConservativeRasterParameterfNV +_bluegl_glConservativeRasterParameterfNV: + mov ___blue_glCore_glConservativeRasterParameterfNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathSubCoordsNV -_bluegl_glPathSubCoordsNV: - mov ___blue_glCore_glPathSubCoordsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyImageSubDataNV +_bluegl_glCopyImageSubDataNV: + mov ___blue_glCore_glCopyImageSubDataNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramStringARB -_bluegl_glGetProgramStringARB: - mov ___blue_glCore_glGetProgramStringARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDepthRangedNV +_bluegl_glDepthRangedNV: + mov ___blue_glCore_glDepthRangedNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathStencilFuncNV -_bluegl_glPathStencilFuncNV: - mov ___blue_glCore_glPathStencilFuncNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glClearDepthdNV +_bluegl_glClearDepthdNV: + mov ___blue_glCore_glClearDepthdNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindVideoCaptureStreamBufferNV -_bluegl_glBindVideoCaptureStreamBufferNV: - mov ___blue_glCore_glBindVideoCaptureStreamBufferNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDepthBoundsdNV +_bluegl_glDepthBoundsdNV: + mov ___blue_glCore_glDepthBoundsdNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReadnPixelsARB -_bluegl_glReadnPixelsARB: - mov ___blue_glCore_glReadnPixelsARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawTextureNV +_bluegl_glDrawTextureNV: + mov ___blue_glCore_glDrawTextureNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexBufferARB -_bluegl_glTexBufferARB: - mov ___blue_glCore_glTexBufferARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMapControlPointsNV +_bluegl_glMapControlPointsNV: + mov ___blue_glCore_glMapControlPointsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL2ui64vNV -_bluegl_glVertexAttribL2ui64vNV: - mov ___blue_glCore_glVertexAttribL2ui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMapParameterivNV +_bluegl_glMapParameterivNV: + mov ___blue_glCore_glMapParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreateBuffers -_bluegl_glCreateBuffers: - mov ___blue_glCore_glCreateBuffers@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMapParameterfvNV +_bluegl_glMapParameterfvNV: + mov ___blue_glCore_glMapParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glImageTransformParameterfvHP -_bluegl_glImageTransformParameterfvHP: - mov ___blue_glCore_glImageTransformParameterfvHP@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMapControlPointsNV +_bluegl_glGetMapControlPointsNV: + mov ___blue_glCore_glGetMapControlPointsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2d -_bluegl_glUniform2d: - mov ___blue_glCore_glUniform2d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMapParameterivNV +_bluegl_glGetMapParameterivNV: + mov ___blue_glCore_glGetMapParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBufferStorage -_bluegl_glBufferStorage: - mov ___blue_glCore_glBufferStorage@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMapParameterfvNV +_bluegl_glGetMapParameterfvNV: + mov ___blue_glCore_glGetMapParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTexFilterFuncSGIS -_bluegl_glGetTexFilterFuncSGIS: - mov ___blue_glCore_glGetTexFilterFuncSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMapAttribParameterivNV +_bluegl_glGetMapAttribParameterivNV: + mov ___blue_glCore_glGetMapAttribParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetHandleARB -_bluegl_glGetHandleARB: - mov ___blue_glCore_glGetHandleARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMapAttribParameterfvNV +_bluegl_glGetMapAttribParameterfvNV: + mov ___blue_glCore_glGetMapAttribParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetHistogramParameterxvOES -_bluegl_glGetHistogramParameterxvOES: - mov ___blue_glCore_glGetHistogramParameterxvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEvalMapsNV +_bluegl_glEvalMapsNV: + mov ___blue_glCore_glEvalMapsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2d -_bluegl_glMultiTexCoord2d: - mov ___blue_glCore_glMultiTexCoord2d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetMultisamplefvNV +_bluegl_glGetMultisamplefvNV: + mov ___blue_glCore_glGetMultisamplefvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertex4hNV -_bluegl_glVertex4hNV: - mov ___blue_glCore_glVertex4hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSampleMaskIndexedNV +_bluegl_glSampleMaskIndexedNV: + mov ___blue_glCore_glSampleMaskIndexedNV@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.private_extern _bluegl_glTexRenderbufferNV +_bluegl_glTexRenderbufferNV: + mov ___blue_glCore_glTexRenderbufferNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPerfMonitorGroupStringAMD -_bluegl_glGetPerfMonitorGroupStringAMD: - mov ___blue_glCore_glGetPerfMonitorGroupStringAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteFencesNV +_bluegl_glDeleteFencesNV: + mov ___blue_glCore_glDeleteFencesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTextureSubImage1D -_bluegl_glCompressedTextureSubImage1D: - mov ___blue_glCore_glCompressedTextureSubImage1D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenFencesNV +_bluegl_glGenFencesNV: + mov ___blue_glCore_glGenFencesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsFramebuffer -_bluegl_glIsFramebuffer: - mov ___blue_glCore_glIsFramebuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsFenceNV +_bluegl_glIsFenceNV: + mov ___blue_glCore_glIsFenceNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2dv -_bluegl_glUniform2dv: - mov ___blue_glCore_glUniform2dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTestFenceNV +_bluegl_glTestFenceNV: + mov ___blue_glCore_glTestFenceNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1dvARB -_bluegl_glVertexAttrib1dvARB: - mov ___blue_glCore_glVertexAttrib1dvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFenceivNV +_bluegl_glGetFenceivNV: + mov ___blue_glCore_glGetFenceivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClientWaitSync -_bluegl_glClientWaitSync: - mov ___blue_glCore_glClientWaitSync@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFinishFenceNV +_bluegl_glFinishFenceNV: + mov ___blue_glCore_glFinishFenceNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4i64vARB -_bluegl_glProgramUniform4i64vARB: - mov ___blue_glCore_glProgramUniform4i64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSetFenceNV +_bluegl_glSetFenceNV: + mov ___blue_glCore_glSetFenceNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetActiveAttribARB -_bluegl_glGetActiveAttribARB: - mov ___blue_glCore_glGetActiveAttribARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFragmentCoverageColorNV +_bluegl_glFragmentCoverageColorNV: + mov ___blue_glCore_glFragmentCoverageColorNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTexImage3DARB -_bluegl_glCompressedTexImage3DARB: - mov ___blue_glCore_glCompressedTexImage3DARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramNamedParameter4fNV +_bluegl_glProgramNamedParameter4fNV: + mov ___blue_glCore_glProgramNamedParameter4fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI2iEXT -_bluegl_glVertexAttribI2iEXT: - mov ___blue_glCore_glVertexAttribI2iEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramNamedParameter4fvNV +_bluegl_glProgramNamedParameter4fvNV: + mov ___blue_glCore_glProgramNamedParameter4fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) .private_extern _bluegl_glProgramNamedParameter4dNV @@ -10379,2364 +10403,2349 @@ _bluegl_glProgramNamedParameter4dNV: mov ___blue_glCore_glProgramNamedParameter4dNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramStringARB -_bluegl_glProgramStringARB: - mov ___blue_glCore_glProgramStringARB@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.private_extern _bluegl_glWindowPos3fvMESA -_bluegl_glWindowPos3fvMESA: - mov ___blue_glCore_glWindowPos3fvMESA@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.private_extern _bluegl_glBlendFunciARB -_bluegl_glBlendFunciARB: - mov ___blue_glCore_glBlendFunciARB@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.private_extern _bluegl_glVertexAttrib4dvNV -_bluegl_glVertexAttrib4dvNV: - mov ___blue_glCore_glVertexAttrib4dvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramNamedParameter4dvNV +_bluegl_glProgramNamedParameter4dvNV: + mov ___blue_glCore_glProgramNamedParameter4dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3dvARB -_bluegl_glWindowPos3dvARB: - mov ___blue_glCore_glWindowPos3dvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramNamedParameterfvNV +_bluegl_glGetProgramNamedParameterfvNV: + mov ___blue_glCore_glGetProgramNamedParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1bvOES -_bluegl_glMultiTexCoord1bvOES: - mov ___blue_glCore_glMultiTexCoord1bvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramNamedParameterdvNV +_bluegl_glGetProgramNamedParameterdvNV: + mov ___blue_glCore_glGetProgramNamedParameterdvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4fvARB -_bluegl_glVertexAttrib4fvARB: - mov ___blue_glCore_glVertexAttrib4fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCoverageModulationTableNV +_bluegl_glCoverageModulationTableNV: + mov ___blue_glCore_glCoverageModulationTableNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPopGroupMarkerEXT -_bluegl_glPopGroupMarkerEXT: - mov ___blue_glCore_glPopGroupMarkerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetCoverageModulationTableNV +_bluegl_glGetCoverageModulationTableNV: + mov ___blue_glCore_glGetCoverageModulationTableNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiDrawElements -_bluegl_glMultiDrawElements: - mov ___blue_glCore_glMultiDrawElements@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCoverageModulationNV +_bluegl_glCoverageModulationNV: + mov ___blue_glCore_glCoverageModulationNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetInstrumentsSGIX -_bluegl_glGetInstrumentsSGIX: - mov ___blue_glCore_glGetInstrumentsSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glRenderbufferStorageMultisampleCoverageNV +_bluegl_glRenderbufferStorageMultisampleCoverageNV: + mov ___blue_glCore_glRenderbufferStorageMultisampleCoverageNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4dv -_bluegl_glProgramUniform4dv: - mov ___blue_glCore_glProgramUniform4dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramVertexLimitNV +_bluegl_glProgramVertexLimitNV: + mov ___blue_glCore_glProgramVertexLimitNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorTableEXT -_bluegl_glColorTableEXT: - mov ___blue_glCore_glColorTableEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferTextureEXT +_bluegl_glFramebufferTextureEXT: + mov ___blue_glCore_glFramebufferTextureEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexSubImage1D -_bluegl_glTexSubImage1D: - mov ___blue_glCore_glTexSubImage1D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferTextureFaceEXT +_bluegl_glFramebufferTextureFaceEXT: + mov ___blue_glCore_glFramebufferTextureFaceEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBeginPerfMonitorAMD -_bluegl_glBeginPerfMonitorAMD: - mov ___blue_glCore_glBeginPerfMonitorAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramLocalParameterI4iNV +_bluegl_glProgramLocalParameterI4iNV: + mov ___blue_glCore_glProgramLocalParameterI4iNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPointParameterfvSGIS -_bluegl_glPointParameterfvSGIS: - mov ___blue_glCore_glPointParameterfvSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramLocalParameterI4ivNV +_bluegl_glProgramLocalParameterI4ivNV: + mov ___blue_glCore_glProgramLocalParameterI4ivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetImageTransformParameterfvHP -_bluegl_glGetImageTransformParameterfvHP: - mov ___blue_glCore_glGetImageTransformParameterfvHP@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramLocalParametersI4ivNV +_bluegl_glProgramLocalParametersI4ivNV: + mov ___blue_glCore_glProgramLocalParametersI4ivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertex3hvNV -_bluegl_glVertex3hvNV: - mov ___blue_glCore_glVertex3hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramLocalParameterI4uiNV +_bluegl_glProgramLocalParameterI4uiNV: + mov ___blue_glCore_glProgramLocalParameterI4uiNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord4fVertex4fvSUN -_bluegl_glTexCoord4fVertex4fvSUN: - mov ___blue_glCore_glTexCoord4fVertex4fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramLocalParameterI4uivNV +_bluegl_glProgramLocalParameterI4uivNV: + mov ___blue_glCore_glProgramLocalParameterI4uivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTexSubImage1D -_bluegl_glCompressedTexSubImage1D: - mov ___blue_glCore_glCompressedTexSubImage1D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramLocalParametersI4uivNV +_bluegl_glProgramLocalParametersI4uivNV: + mov ___blue_glCore_glProgramLocalParametersI4uivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2dvMESA -_bluegl_glWindowPos2dvMESA: - mov ___blue_glCore_glWindowPos2dvMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramEnvParameterI4iNV +_bluegl_glProgramEnvParameterI4iNV: + mov ___blue_glCore_glProgramEnvParameterI4iNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetSamplerParameteriv -_bluegl_glGetSamplerParameteriv: - mov ___blue_glCore_glGetSamplerParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramEnvParameterI4ivNV +_bluegl_glProgramEnvParameterI4ivNV: + mov ___blue_glCore_glProgramEnvParameterI4ivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorPointerListIBM -_bluegl_glColorPointerListIBM: - mov ___blue_glCore_glColorPointerListIBM@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramEnvParametersI4ivNV +_bluegl_glProgramEnvParametersI4ivNV: + mov ___blue_glCore_glProgramEnvParametersI4ivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFinalCombinerInputParameterivNV -_bluegl_glGetFinalCombinerInputParameterivNV: - mov ___blue_glCore_glGetFinalCombinerInputParameterivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramEnvParameterI4uiNV +_bluegl_glProgramEnvParameterI4uiNV: + mov ___blue_glCore_glProgramEnvParameterI4uiNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribiv -_bluegl_glGetVertexAttribiv: - mov ___blue_glCore_glGetVertexAttribiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramEnvParameterI4uivNV +_bluegl_glProgramEnvParameterI4uivNV: + mov ___blue_glCore_glProgramEnvParameterI4uivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTexImage -_bluegl_glGetTexImage: - mov ___blue_glCore_glGetTexImage@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramEnvParametersI4uivNV +_bluegl_glProgramEnvParametersI4uivNV: + mov ___blue_glCore_glProgramEnvParametersI4uivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBufferSubData -_bluegl_glBufferSubData: - mov ___blue_glCore_glBufferSubData@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramLocalParameterIivNV +_bluegl_glGetProgramLocalParameterIivNV: + mov ___blue_glCore_glGetProgramLocalParameterIivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3sARB -_bluegl_glVertexAttrib3sARB: - mov ___blue_glCore_glVertexAttrib3sARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramLocalParameterIuivNV +_bluegl_glGetProgramLocalParameterIuivNV: + mov ___blue_glCore_glGetProgramLocalParameterIuivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsTextureHandleResidentARB -_bluegl_glIsTextureHandleResidentARB: - mov ___blue_glCore_glIsTextureHandleResidentARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramEnvParameterIivNV +_bluegl_glGetProgramEnvParameterIivNV: + mov ___blue_glCore_glGetProgramEnvParameterIivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3i -_bluegl_glMultiTexCoord3i: - mov ___blue_glCore_glMultiTexCoord3i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramEnvParameterIuivNV +_bluegl_glGetProgramEnvParameterIuivNV: + mov ___blue_glCore_glGetProgramEnvParameterIuivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLinkProgramARB -_bluegl_glLinkProgramARB: - mov ___blue_glCore_glLinkProgramARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramSubroutineParametersuivNV +_bluegl_glProgramSubroutineParametersuivNV: + mov ___blue_glCore_glProgramSubroutineParametersuivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsProgramNV -_bluegl_glIsProgramNV: - mov ___blue_glCore_glIsProgramNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramSubroutineParameteruivNV +_bluegl_glGetProgramSubroutineParameteruivNV: + mov ___blue_glCore_glGetProgramSubroutineParameteruivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI4i -_bluegl_glVertexAttribI4i: - mov ___blue_glCore_glVertexAttribI4i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertex2hNV +_bluegl_glVertex2hNV: + mov ___blue_glCore_glVertex2hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1i -_bluegl_glUniform1i: - mov ___blue_glCore_glUniform1i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertex2hvNV +_bluegl_glVertex2hvNV: + mov ___blue_glCore_glVertex2hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindAttribLocationARB -_bluegl_glBindAttribLocationARB: - mov ___blue_glCore_glBindAttribLocationARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertex3hNV +_bluegl_glVertex3hNV: + mov ___blue_glCore_glVertex3hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4i64vNV -_bluegl_glProgramUniform4i64vNV: - mov ___blue_glCore_glProgramUniform4i64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertex3hvNV +_bluegl_glVertex3hvNV: + mov ___blue_glCore_glVertex3hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertex4xOES -_bluegl_glVertex4xOES: - mov ___blue_glCore_glVertex4xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertex4hNV +_bluegl_glVertex4hNV: + mov ___blue_glCore_glVertex4hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSetLocalConstantEXT -_bluegl_glSetLocalConstantEXT: - mov ___blue_glCore_glSetLocalConstantEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertex4hvNV +_bluegl_glVertex4hvNV: + mov ___blue_glCore_glVertex4hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexSubImage2D -_bluegl_glTexSubImage2D: - mov ___blue_glCore_glTexSubImage2D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormal3hNV +_bluegl_glNormal3hNV: + mov ___blue_glCore_glNormal3hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2f -_bluegl_glWindowPos2f: - mov ___blue_glCore_glWindowPos2f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormal3hvNV +_bluegl_glNormal3hvNV: + mov ___blue_glCore_glNormal3hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVariantPointerEXT -_bluegl_glVariantPointerEXT: - mov ___blue_glCore_glVariantPointerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColor3hNV +_bluegl_glColor3hNV: + mov ___blue_glCore_glColor3hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedRenderbufferStorageMultisample -_bluegl_glNamedRenderbufferStorageMultisample: - mov ___blue_glCore_glNamedRenderbufferStorageMultisample@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColor3hvNV +_bluegl_glColor3hvNV: + mov ___blue_glCore_glColor3hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFogCoorddvEXT -_bluegl_glFogCoorddvEXT: - mov ___blue_glCore_glFogCoorddvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColor4hNV +_bluegl_glColor4hNV: + mov ___blue_glCore_glColor4hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiModeDrawArraysIBM -_bluegl_glMultiModeDrawArraysIBM: - mov ___blue_glCore_glMultiModeDrawArraysIBM@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColor4hvNV +_bluegl_glColor4hvNV: + mov ___blue_glCore_glColor4hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixLoaddEXT -_bluegl_glMatrixLoaddEXT: - mov ___blue_glCore_glMatrixLoaddEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord1hNV +_bluegl_glTexCoord1hNV: + mov ___blue_glCore_glTexCoord1hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteQueriesARB -_bluegl_glDeleteQueriesARB: - mov ___blue_glCore_glDeleteQueriesARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord1hvNV +_bluegl_glTexCoord1hvNV: + mov ___blue_glCore_glTexCoord1hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1fvARB -_bluegl_glUniform1fvARB: - mov ___blue_glCore_glUniform1fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord2hNV +_bluegl_glTexCoord2hNV: + mov ___blue_glCore_glTexCoord2hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawCommandsNV -_bluegl_glDrawCommandsNV: - mov ___blue_glCore_glDrawCommandsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord2hvNV +_bluegl_glTexCoord2hvNV: + mov ___blue_glCore_glTexCoord2hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3dvEXT -_bluegl_glSecondaryColor3dvEXT: - mov ___blue_glCore_glSecondaryColor3dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord3hNV +_bluegl_glTexCoord3hNV: + mov ___blue_glCore_glTexCoord3hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFlushVertexArrayRangeAPPLE -_bluegl_glFlushVertexArrayRangeAPPLE: - mov ___blue_glCore_glFlushVertexArrayRangeAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord3hvNV +_bluegl_glTexCoord3hvNV: + mov ___blue_glCore_glTexCoord3hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexEnvxvOES -_bluegl_glTexEnvxvOES: - mov ___blue_glCore_glTexEnvxvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord4hNV +_bluegl_glTexCoord4hNV: + mov ___blue_glCore_glTexCoord4hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetSeparableFilterEXT -_bluegl_glGetSeparableFilterEXT: - mov ___blue_glCore_glGetSeparableFilterEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord4hvNV +_bluegl_glTexCoord4hvNV: + mov ___blue_glCore_glTexCoord4hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI4bvEXT -_bluegl_glVertexAttribI4bvEXT: - mov ___blue_glCore_glVertexAttribI4bvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1hNV +_bluegl_glMultiTexCoord1hNV: + mov ___blue_glCore_glMultiTexCoord1hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3i64NV -_bluegl_glUniform3i64NV: - mov ___blue_glCore_glUniform3i64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord1hvNV +_bluegl_glMultiTexCoord1hvNV: + mov ___blue_glCore_glMultiTexCoord1hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendEquationIndexedAMD -_bluegl_glBlendEquationIndexedAMD: - mov ___blue_glCore_glBlendEquationIndexedAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2hNV +_bluegl_glMultiTexCoord2hNV: + mov ___blue_glCore_glMultiTexCoord2hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPointParameterf -_bluegl_glPointParameterf: - mov ___blue_glCore_glPointParameterf@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord2hvNV +_bluegl_glMultiTexCoord2hvNV: + mov ___blue_glCore_glMultiTexCoord2hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertex4bvOES -_bluegl_glVertex4bvOES: - mov ___blue_glCore_glVertex4bvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3hNV +_bluegl_glMultiTexCoord3hNV: + mov ___blue_glCore_glMultiTexCoord3hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStencilThenCoverFillPathNV -_bluegl_glStencilThenCoverFillPathNV: - mov ___blue_glCore_glStencilThenCoverFillPathNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord3hvNV +_bluegl_glMultiTexCoord3hvNV: + mov ___blue_glCore_glMultiTexCoord3hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTextureImage2DEXT -_bluegl_glCompressedTextureImage2DEXT: - mov ___blue_glCore_glCompressedTextureImage2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4hNV +_bluegl_glMultiTexCoord4hNV: + mov ___blue_glCore_glMultiTexCoord4hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlendEquationSeparate -_bluegl_glBlendEquationSeparate: - mov ___blue_glCore_glBlendEquationSeparate@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMultiTexCoord4hvNV +_bluegl_glMultiTexCoord4hvNV: + mov ___blue_glCore_glMultiTexCoord4hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedFramebufferParameteriv -_bluegl_glGetNamedFramebufferParameteriv: - mov ___blue_glCore_glGetNamedFramebufferParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFogCoordhNV +_bluegl_glFogCoordhNV: + mov ___blue_glCore_glFogCoordhNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexImage3DEXT -_bluegl_glTexImage3DEXT: - mov ___blue_glCore_glTexImage3DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFogCoordhvNV +_bluegl_glFogCoordhvNV: + mov ___blue_glCore_glFogCoordhvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorFragmentOp3ATI -_bluegl_glColorFragmentOp3ATI: - mov ___blue_glCore_glColorFragmentOp3ATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3hNV +_bluegl_glSecondaryColor3hNV: + mov ___blue_glCore_glSecondaryColor3hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormalPointerListIBM -_bluegl_glNormalPointerListIBM: - mov ___blue_glCore_glNormalPointerListIBM@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColor3hvNV +_bluegl_glSecondaryColor3hvNV: + mov ___blue_glCore_glSecondaryColor3hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexParameteriv -_bluegl_glTexParameteriv: - mov ___blue_glCore_glTexParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexWeighthNV +_bluegl_glVertexWeighthNV: + mov ___blue_glCore_glVertexWeighthNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTexSubImage2D -_bluegl_glCompressedTexSubImage2D: - mov ___blue_glCore_glCompressedTexSubImage2D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexWeighthvNV +_bluegl_glVertexWeighthvNV: + mov ___blue_glCore_glVertexWeighthvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCoverFillPathNV -_bluegl_glCoverFillPathNV: - mov ___blue_glCore_glCoverFillPathNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1hNV +_bluegl_glVertexAttrib1hNV: + mov ___blue_glCore_glVertexAttrib1hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix4x2dvEXT -_bluegl_glProgramUniformMatrix4x2dvEXT: - mov ___blue_glCore_glProgramUniformMatrix4x2dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1hvNV +_bluegl_glVertexAttrib1hvNV: + mov ___blue_glCore_glVertexAttrib1hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1f -_bluegl_glVertexAttrib1f: - mov ___blue_glCore_glVertexAttrib1f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2hNV +_bluegl_glVertexAttrib2hNV: + mov ___blue_glCore_glVertexAttrib2hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glAlphaFragmentOp3ATI -_bluegl_glAlphaFragmentOp3ATI: - mov ___blue_glCore_glAlphaFragmentOp3ATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2hvNV +_bluegl_glVertexAttrib2hvNV: + mov ___blue_glCore_glVertexAttrib2hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBeginQueryIndexed -_bluegl_glBeginQueryIndexed: - mov ___blue_glCore_glBeginQueryIndexed@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3hNV +_bluegl_glVertexAttrib3hNV: + mov ___blue_glCore_glVertexAttrib3hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix2x3fv -_bluegl_glProgramUniformMatrix2x3fv: - mov ___blue_glCore_glProgramUniformMatrix2x3fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3hvNV +_bluegl_glVertexAttrib3hvNV: + mov ___blue_glCore_glVertexAttrib3hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4ui64vNV -_bluegl_glProgramUniform4ui64vNV: - mov ___blue_glCore_glProgramUniform4ui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4hNV +_bluegl_glVertexAttrib4hNV: + mov ___blue_glCore_glVertexAttrib4hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1ui64NV -_bluegl_glUniform1ui64NV: - mov ___blue_glCore_glUniform1ui64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4hvNV +_bluegl_glVertexAttrib4hvNV: + mov ___blue_glCore_glVertexAttrib4hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3svARB -_bluegl_glMultiTexCoord3svARB: - mov ___blue_glCore_glMultiTexCoord3svARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribs1hvNV +_bluegl_glVertexAttribs1hvNV: + mov ___blue_glCore_glVertexAttribs1hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWeightivARB -_bluegl_glWeightivARB: - mov ___blue_glCore_glWeightivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribs2hvNV +_bluegl_glVertexAttribs2hvNV: + mov ___blue_glCore_glVertexAttribs2hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glMultiTexCoord4xOES -_bluegl_glMultiTexCoord4xOES: - mov ___blue_glCore_glMultiTexCoord4xOES@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glVertexAttribs3hvNV +_bluegl_glVertexAttribs3hvNV: + mov ___blue_glCore_glVertexAttribs3hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL2i64NV -_bluegl_glVertexAttribL2i64NV: - mov ___blue_glCore_glVertexAttribL2i64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribs4hvNV +_bluegl_glVertexAttribs4hvNV: + mov ___blue_glCore_glVertexAttribs4hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix3x4dv -_bluegl_glProgramUniformMatrix3x4dv: - mov ___blue_glCore_glProgramUniformMatrix3x4dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetInternalformatSampleivNV +_bluegl_glGetInternalformatSampleivNV: + mov ___blue_glCore_glGetInternalformatSampleivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramParameteriEXT -_bluegl_glProgramParameteriEXT: - mov ___blue_glCore_glProgramParameteriEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenOcclusionQueriesNV +_bluegl_glGenOcclusionQueriesNV: + mov ___blue_glCore_glGenOcclusionQueriesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3sEXT -_bluegl_glSecondaryColor3sEXT: - mov ___blue_glCore_glSecondaryColor3sEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteOcclusionQueriesNV +_bluegl_glDeleteOcclusionQueriesNV: + mov ___blue_glCore_glDeleteOcclusionQueriesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTextureSubImage3DEXT -_bluegl_glCompressedTextureSubImage3DEXT: - mov ___blue_glCore_glCompressedTextureSubImage3DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsOcclusionQueryNV +_bluegl_glIsOcclusionQueryNV: + mov ___blue_glCore_glIsOcclusionQueryNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPointervEXT -_bluegl_glGetPointervEXT: - mov ___blue_glCore_glGetPointervEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBeginOcclusionQueryNV +_bluegl_glBeginOcclusionQueryNV: + mov ___blue_glCore_glBeginOcclusionQueryNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMinmaxParameterfvEXT -_bluegl_glGetMinmaxParameterfvEXT: - mov ___blue_glCore_glGetMinmaxParameterfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEndOcclusionQueryNV +_bluegl_glEndOcclusionQueryNV: + mov ___blue_glCore_glEndOcclusionQueryNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4sARB -_bluegl_glMultiTexCoord4sARB: - mov ___blue_glCore_glMultiTexCoord4sARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetOcclusionQueryivNV +_bluegl_glGetOcclusionQueryivNV: + mov ___blue_glCore_glGetOcclusionQueryivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawElementsInstancedBaseVertexBaseInstance -_bluegl_glDrawElementsInstancedBaseVertexBaseInstance: - mov ___blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetOcclusionQueryuivNV +_bluegl_glGetOcclusionQueryuivNV: + mov ___blue_glCore_glGetOcclusionQueryuivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVDPAUSurfaceAccessNV -_bluegl_glVDPAUSurfaceAccessNV: - mov ___blue_glCore_glVDPAUSurfaceAccessNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramBufferParametersfvNV +_bluegl_glProgramBufferParametersfvNV: + mov ___blue_glCore_glProgramBufferParametersfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2iARB -_bluegl_glMultiTexCoord2iARB: - mov ___blue_glCore_glMultiTexCoord2iARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramBufferParametersIivNV +_bluegl_glProgramBufferParametersIivNV: + mov ___blue_glCore_glProgramBufferParametersIivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathCommandsNV -_bluegl_glPathCommandsNV: - mov ___blue_glCore_glPathCommandsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramBufferParametersIuivNV +_bluegl_glProgramBufferParametersIuivNV: + mov ___blue_glCore_glProgramBufferParametersIuivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSetMultisamplefvAMD -_bluegl_glSetMultisamplefvAMD: - mov ___blue_glCore_glSetMultisamplefvAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenPathsNV +_bluegl_glGenPathsNV: + mov ___blue_glCore_glGenPathsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream3ivATI -_bluegl_glVertexStream3ivATI: - mov ___blue_glCore_glVertexStream3ivATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeletePathsNV +_bluegl_glDeletePathsNV: + mov ___blue_glCore_glDeletePathsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVDPAUUnregisterSurfaceNV -_bluegl_glVDPAUUnregisterSurfaceNV: - mov ___blue_glCore_glVDPAUUnregisterSurfaceNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsPathNV +_bluegl_glIsPathNV: + mov ___blue_glCore_glIsPathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureRenderbufferEXT -_bluegl_glTextureRenderbufferEXT: - mov ___blue_glCore_glTextureRenderbufferEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathCommandsNV +_bluegl_glPathCommandsNV: + mov ___blue_glCore_glPathCommandsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramLocalParameter4dARB -_bluegl_glProgramLocalParameter4dARB: - mov ___blue_glCore_glProgramLocalParameter4dARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathCoordsNV +_bluegl_glPathCoordsNV: + mov ___blue_glCore_glPathCoordsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindVertexShaderEXT -_bluegl_glBindVertexShaderEXT: - mov ___blue_glCore_glBindVertexShaderEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathSubCommandsNV +_bluegl_glPathSubCommandsNV: + mov ___blue_glCore_glPathSubCommandsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEnableVariantClientStateEXT -_bluegl_glEnableVariantClientStateEXT: - mov ___blue_glCore_glEnableVariantClientStateEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathSubCoordsNV +_bluegl_glPathSubCoordsNV: + mov ___blue_glCore_glPathSubCoordsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPointerIndexedvEXT -_bluegl_glGetPointerIndexedvEXT: - mov ___blue_glCore_glGetPointerIndexedvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathStringNV +_bluegl_glPathStringNV: + mov ___blue_glCore_glPathStringNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexEnvfEXT -_bluegl_glMultiTexEnvfEXT: - mov ___blue_glCore_glMultiTexEnvfEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathGlyphsNV +_bluegl_glPathGlyphsNV: + mov ___blue_glCore_glPathGlyphsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFrustumxOES -_bluegl_glFrustumxOES: - mov ___blue_glCore_glFrustumxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathGlyphRangeNV +_bluegl_glPathGlyphRangeNV: + mov ___blue_glCore_glPathGlyphRangeNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glAreProgramsResidentNV -_bluegl_glAreProgramsResidentNV: - mov ___blue_glCore_glAreProgramsResidentNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glWeightPathsNV +_bluegl_glWeightPathsNV: + mov ___blue_glCore_glWeightPathsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferSampleLocationsfvNV -_bluegl_glFramebufferSampleLocationsfvNV: - mov ___blue_glCore_glFramebufferSampleLocationsfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyPathNV +_bluegl_glCopyPathNV: + mov ___blue_glCore_glCopyPathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1sNV -_bluegl_glVertexAttrib1sNV: - mov ___blue_glCore_glVertexAttrib1sNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glInterpolatePathsNV +_bluegl_glInterpolatePathsNV: + mov ___blue_glCore_glInterpolatePathsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetActiveUniformBlockName -_bluegl_glGetActiveUniformBlockName: - mov ___blue_glCore_glGetActiveUniformBlockName@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTransformPathNV +_bluegl_glTransformPathNV: + mov ___blue_glCore_glTransformPathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertex2xOES -_bluegl_glVertex2xOES: - mov ___blue_glCore_glVertex2xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathParameterivNV +_bluegl_glPathParameterivNV: + mov ___blue_glCore_glPathParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glResetMinmaxEXT -_bluegl_glResetMinmaxEXT: - mov ___blue_glCore_glResetMinmaxEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathParameteriNV +_bluegl_glPathParameteriNV: + mov ___blue_glCore_glPathParameteriNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixOrthoEXT -_bluegl_glMatrixOrthoEXT: - mov ___blue_glCore_glMatrixOrthoEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathParameterfvNV +_bluegl_glPathParameterfvNV: + mov ___blue_glCore_glPathParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4ui64vNV -_bluegl_glUniform4ui64vNV: - mov ___blue_glCore_glUniform4ui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathParameterfNV +_bluegl_glPathParameterfNV: + mov ___blue_glCore_glPathParameterfNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix4x3fvEXT -_bluegl_glProgramUniformMatrix4x3fvEXT: - mov ___blue_glCore_glProgramUniformMatrix4x3fvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathDashArrayNV +_bluegl_glPathDashArrayNV: + mov ___blue_glCore_glPathDashArrayNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribs1svNV -_bluegl_glVertexAttribs1svNV: - mov ___blue_glCore_glVertexAttribs1svNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathStencilFuncNV +_bluegl_glPathStencilFuncNV: + mov ___blue_glCore_glPathStencilFuncNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDebugMessageCallbackAMD -_bluegl_glDebugMessageCallbackAMD: - mov ___blue_glCore_glDebugMessageCallbackAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathStencilDepthOffsetNV +_bluegl_glPathStencilDepthOffsetNV: + mov ___blue_glCore_glPathStencilDepthOffsetNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1uiEXT -_bluegl_glProgramUniform1uiEXT: - mov ___blue_glCore_glProgramUniform1uiEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStencilFillPathNV +_bluegl_glStencilFillPathNV: + mov ___blue_glCore_glStencilFillPathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexBufferEXT -_bluegl_glTexBufferEXT: - mov ___blue_glCore_glTexBufferEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStencilStrokePathNV +_bluegl_glStencilStrokePathNV: + mov ___blue_glCore_glStencilStrokePathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4f -_bluegl_glUniform4f: - mov ___blue_glCore_glUniform4f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStencilFillPathInstancedNV +_bluegl_glStencilFillPathInstancedNV: + mov ___blue_glCore_glStencilFillPathInstancedNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUpdateObjectBufferATI -_bluegl_glUpdateObjectBufferATI: - mov ___blue_glCore_glUpdateObjectBufferATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStencilStrokePathInstancedNV +_bluegl_glStencilStrokePathInstancedNV: + mov ___blue_glCore_glStencilStrokePathInstancedNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1iEXT -_bluegl_glProgramUniform1iEXT: - mov ___blue_glCore_glProgramUniform1iEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathCoverDepthFuncNV +_bluegl_glPathCoverDepthFuncNV: + mov ___blue_glCore_glPathCoverDepthFuncNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMultiTexEnvfvEXT -_bluegl_glGetMultiTexEnvfvEXT: - mov ___blue_glCore_glGetMultiTexEnvfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCoverFillPathNV +_bluegl_glCoverFillPathNV: + mov ___blue_glCore_glCoverFillPathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL2d -_bluegl_glVertexAttribL2d: - mov ___blue_glCore_glVertexAttribL2d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCoverStrokePathNV +_bluegl_glCoverStrokePathNV: + mov ___blue_glCore_glCoverStrokePathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glConvolutionParameterxOES -_bluegl_glConvolutionParameterxOES: - mov ___blue_glCore_glConvolutionParameterxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCoverFillPathInstancedNV +_bluegl_glCoverFillPathInstancedNV: + mov ___blue_glCore_glCoverFillPathInstancedNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribArrayObjectivATI -_bluegl_glGetVertexAttribArrayObjectivATI: - mov ___blue_glCore_glGetVertexAttribArrayObjectivATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCoverStrokePathInstancedNV +_bluegl_glCoverStrokePathInstancedNV: + mov ___blue_glCore_glCoverStrokePathInstancedNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetListParameterfvSGIX -_bluegl_glGetListParameterfvSGIX: - mov ___blue_glCore_glGetListParameterfvSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPathParameterivNV +_bluegl_glGetPathParameterivNV: + mov ___blue_glCore_glGetPathParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glInstrumentsBufferSGIX -_bluegl_glInstrumentsBufferSGIX: - mov ___blue_glCore_glInstrumentsBufferSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPathParameterfvNV +_bluegl_glGetPathParameterfvNV: + mov ___blue_glCore_glGetPathParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteNamesAMD -_bluegl_glDeleteNamesAMD: - mov ___blue_glCore_glDeleteNamesAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPathCommandsNV +_bluegl_glGetPathCommandsNV: + mov ___blue_glCore_glGetPathCommandsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetSubroutineIndex -_bluegl_glGetSubroutineIndex: - mov ___blue_glCore_glGetSubroutineIndex@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPathCoordsNV +_bluegl_glGetPathCoordsNV: + mov ___blue_glCore_glGetPathCoordsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVideoCaptureStreamParameterivNV -_bluegl_glVideoCaptureStreamParameterivNV: - mov ___blue_glCore_glVideoCaptureStreamParameterivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPathDashArrayNV +_bluegl_glGetPathDashArrayNV: + mov ___blue_glCore_glGetPathDashArrayNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4i -_bluegl_glMultiTexCoord4i: - mov ___blue_glCore_glMultiTexCoord4i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPathMetricsNV +_bluegl_glGetPathMetricsNV: + mov ___blue_glCore_glGetPathMetricsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFramebufferParameteriv -_bluegl_glGetFramebufferParameteriv: - mov ___blue_glCore_glGetFramebufferParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPathMetricRangeNV +_bluegl_glGetPathMetricRangeNV: + mov ___blue_glCore_glGetPathMetricRangeNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2hvNV -_bluegl_glVertexAttrib2hvNV: - mov ___blue_glCore_glVertexAttrib2hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPathSpacingNV +_bluegl_glGetPathSpacingNV: + mov ___blue_glCore_glGetPathSpacingNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMakeBufferNonResidentNV -_bluegl_glMakeBufferNonResidentNV: - mov ___blue_glCore_glMakeBufferNonResidentNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsPointInFillPathNV +_bluegl_glIsPointInFillPathNV: + mov ___blue_glCore_glIsPointInFillPathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPixelDataRangeNV -_bluegl_glPixelDataRangeNV: - mov ___blue_glCore_glPixelDataRangeNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsPointInStrokePathNV +_bluegl_glIsPointInStrokePathNV: + mov ___blue_glCore_glIsPointInStrokePathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedBufferDataEXT -_bluegl_glNamedBufferDataEXT: - mov ___blue_glCore_glNamedBufferDataEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPathLengthNV +_bluegl_glGetPathLengthNV: + mov ___blue_glCore_glGetPathLengthNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsImageHandleResidentARB -_bluegl_glIsImageHandleResidentARB: - mov ___blue_glCore_glIsImageHandleResidentARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPointAlongPathNV +_bluegl_glPointAlongPathNV: + mov ___blue_glCore_glPointAlongPathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFrustumfOES -_bluegl_glFrustumfOES: - mov ___blue_glCore_glFrustumfOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixLoad3x2fNV +_bluegl_glMatrixLoad3x2fNV: + mov ___blue_glCore_glMatrixLoad3x2fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetArrayObjectivATI -_bluegl_glGetArrayObjectivATI: - mov ___blue_glCore_glGetArrayObjectivATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixLoad3x3fNV +_bluegl_glMatrixLoad3x3fNV: + mov ___blue_glCore_glMatrixLoad3x3fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexParameterIuivEXT -_bluegl_glMultiTexParameterIuivEXT: - mov ___blue_glCore_glMultiTexParameterIuivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixLoadTranspose3x3fNV +_bluegl_glMatrixLoadTranspose3x3fNV: + mov ___blue_glCore_glMatrixLoadTranspose3x3fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMapParameterfvNV -_bluegl_glGetMapParameterfvNV: - mov ___blue_glCore_glGetMapParameterfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixMult3x2fNV +_bluegl_glMatrixMult3x2fNV: + mov ___blue_glCore_glMatrixMult3x2fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultTransposeMatrixxOES -_bluegl_glMultTransposeMatrixxOES: - mov ___blue_glCore_glMultTransposeMatrixxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixMult3x3fNV +_bluegl_glMatrixMult3x3fNV: + mov ___blue_glCore_glMatrixMult3x3fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPerfMonitorCounterDataAMD -_bluegl_glGetPerfMonitorCounterDataAMD: - mov ___blue_glCore_glGetPerfMonitorCounterDataAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMatrixMultTranspose3x3fNV +_bluegl_glMatrixMultTranspose3x3fNV: + mov ___blue_glCore_glMatrixMultTranspose3x3fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearDepthxOES -_bluegl_glClearDepthxOES: - mov ___blue_glCore_glClearDepthxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStencilThenCoverFillPathNV +_bluegl_glStencilThenCoverFillPathNV: + mov ___blue_glCore_glStencilThenCoverFillPathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColor3xvOES -_bluegl_glColor3xvOES: - mov ___blue_glCore_glColor3xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStencilThenCoverStrokePathNV +_bluegl_glStencilThenCoverStrokePathNV: + mov ___blue_glCore_glStencilThenCoverStrokePathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI4ivEXT -_bluegl_glVertexAttribI4ivEXT: - mov ___blue_glCore_glVertexAttribI4ivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStencilThenCoverFillPathInstancedNV +_bluegl_glStencilThenCoverFillPathInstancedNV: + mov ___blue_glCore_glStencilThenCoverFillPathInstancedNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoordP4uiv -_bluegl_glMultiTexCoordP4uiv: - mov ___blue_glCore_glMultiTexCoordP4uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStencilThenCoverStrokePathInstancedNV +_bluegl_glStencilThenCoverStrokePathInstancedNV: + mov ___blue_glCore_glStencilThenCoverStrokePathInstancedNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI4usv -_bluegl_glVertexAttribI4usv: - mov ___blue_glCore_glVertexAttribI4usv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathGlyphIndexRangeNV +_bluegl_glPathGlyphIndexRangeNV: + mov ___blue_glCore_glPathGlyphIndexRangeNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnTexImage -_bluegl_glGetnTexImage: - mov ___blue_glCore_glGetnTexImage@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathGlyphIndexArrayNV +_bluegl_glPathGlyphIndexArrayNV: + mov ___blue_glCore_glPathGlyphIndexArrayNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReadBuffer -_bluegl_glReadBuffer: - mov ___blue_glCore_glReadBuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathMemoryGlyphIndexArrayNV +_bluegl_glPathMemoryGlyphIndexArrayNV: + mov ___blue_glCore_glPathMemoryGlyphIndexArrayNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3iARB -_bluegl_glUniform3iARB: - mov ___blue_glCore_glUniform3iARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramPathFragmentInputGenNV +_bluegl_glProgramPathFragmentInputGenNV: + mov ___blue_glCore_glProgramPathFragmentInputGenNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexBufferEXT -_bluegl_glMultiTexBufferEXT: - mov ___blue_glCore_glMultiTexBufferEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramResourcefvNV +_bluegl_glGetProgramResourcefvNV: + mov ___blue_glCore_glGetProgramResourcefvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormalStream3fvATI -_bluegl_glNormalStream3fvATI: - mov ___blue_glCore_glNormalStream3fvATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathColorGenNV +_bluegl_glPathColorGenNV: + mov ___blue_glCore_glPathColorGenNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteVertexShaderEXT -_bluegl_glDeleteVertexShaderEXT: - mov ___blue_glCore_glDeleteVertexShaderEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathTexGenNV +_bluegl_glPathTexGenNV: + mov ___blue_glCore_glPathTexGenNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3hvNV -_bluegl_glVertexAttrib3hvNV: - mov ___blue_glCore_glVertexAttrib3hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPathFogGenNV +_bluegl_glPathFogGenNV: + mov ___blue_glCore_glPathFogGenNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawMeshArraysSUN -_bluegl_glDrawMeshArraysSUN: - mov ___blue_glCore_glDrawMeshArraysSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPathColorGenivNV +_bluegl_glGetPathColorGenivNV: + mov ___blue_glCore_glGetPathColorGenivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL3dvEXT -_bluegl_glVertexAttribL3dvEXT: - mov ___blue_glCore_glVertexAttribL3dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPathColorGenfvNV +_bluegl_glGetPathColorGenfvNV: + mov ___blue_glCore_glGetPathColorGenfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeuiColor3fVertex3fSUN -_bluegl_glReplacementCodeuiColor3fVertex3fSUN: - mov ___blue_glCore_glReplacementCodeuiColor3fVertex3fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPathTexGenivNV +_bluegl_glGetPathTexGenivNV: + mov ___blue_glCore_glGetPathTexGenivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1fv -_bluegl_glProgramUniform1fv: - mov ___blue_glCore_glProgramUniform1fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPathTexGenfvNV +_bluegl_glGetPathTexGenfvNV: + mov ___blue_glCore_glGetPathTexGenfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormal3xvOES -_bluegl_glNormal3xvOES: - mov ___blue_glCore_glNormal3xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPixelDataRangeNV +_bluegl_glPixelDataRangeNV: + mov ___blue_glCore_glPixelDataRangeNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramStageiv -_bluegl_glGetProgramStageiv: - mov ___blue_glCore_glGetProgramStageiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFlushPixelDataRangeNV +_bluegl_glFlushPixelDataRangeNV: + mov ___blue_glCore_glFlushPixelDataRangeNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2ui64NV -_bluegl_glUniform2ui64NV: - mov ___blue_glCore_glUniform2ui64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPointParameteriNV +_bluegl_glPointParameteriNV: + mov ___blue_glCore_glPointParameteriNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramEnvParameter4fARB -_bluegl_glProgramEnvParameter4fARB: - mov ___blue_glCore_glProgramEnvParameter4fARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPointParameterivNV +_bluegl_glPointParameterivNV: + mov ___blue_glCore_glPointParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPixelTransformParameterivEXT -_bluegl_glPixelTransformParameterivEXT: - mov ___blue_glCore_glPixelTransformParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPresentFrameKeyedNV +_bluegl_glPresentFrameKeyedNV: + mov ___blue_glCore_glPresentFrameKeyedNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos4dvMESA -_bluegl_glWindowPos4dvMESA: - mov ___blue_glCore_glWindowPos4dvMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPresentFrameDualFillNV +_bluegl_glPresentFrameDualFillNV: + mov ___blue_glCore_glPresentFrameDualFillNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiDrawElementsIndirectBindlessCountNV -_bluegl_glMultiDrawElementsIndirectBindlessCountNV: - mov ___blue_glCore_glMultiDrawElementsIndirectBindlessCountNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVideoivNV +_bluegl_glGetVideoivNV: + mov ___blue_glCore_glGetVideoivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3i64vARB -_bluegl_glUniform3i64vARB: - mov ___blue_glCore_glUniform3i64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVideouivNV +_bluegl_glGetVideouivNV: + mov ___blue_glCore_glGetVideouivNV@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glTextureStorage3DMultisample -_bluegl_glTextureStorage3DMultisample: - mov ___blue_glCore_glTextureStorage3DMultisample@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glGetVideoi64vNV +_bluegl_glGetVideoi64vNV: + mov ___blue_glCore_glGetVideoi64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedBufferParameterui64vNV -_bluegl_glGetNamedBufferParameterui64vNV: - mov ___blue_glCore_glGetNamedBufferParameterui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVideoui64vNV +_bluegl_glGetVideoui64vNV: + mov ___blue_glCore_glGetVideoui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEndTransformFeedback -_bluegl_glEndTransformFeedback: - mov ___blue_glCore_glEndTransformFeedback@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPrimitiveRestartNV +_bluegl_glPrimitiveRestartNV: + mov ___blue_glCore_glPrimitiveRestartNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI3ivEXT -_bluegl_glVertexAttribI3ivEXT: - mov ___blue_glCore_glVertexAttribI3ivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPrimitiveRestartIndexNV +_bluegl_glPrimitiveRestartIndexNV: + mov ___blue_glCore_glPrimitiveRestartIndexNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2f -_bluegl_glUniform2f: - mov ___blue_glCore_glUniform2f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCombinerParameterfvNV +_bluegl_glCombinerParameterfvNV: + mov ___blue_glCore_glCombinerParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1dARB -_bluegl_glMultiTexCoord1dARB: - mov ___blue_glCore_glMultiTexCoord1dARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCombinerParameterfNV +_bluegl_glCombinerParameterfNV: + mov ___blue_glCore_glCombinerParameterfNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetColorTableParameterfv -_bluegl_glGetColorTableParameterfv: - mov ___blue_glCore_glGetColorTableParameterfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCombinerParameterivNV +_bluegl_glCombinerParameterivNV: + mov ___blue_glCore_glCombinerParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3d -_bluegl_glWindowPos3d: - mov ___blue_glCore_glWindowPos3d@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCombinerParameteriNV +_bluegl_glCombinerParameteriNV: + mov ___blue_glCore_glCombinerParameteriNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL3ui64vNV -_bluegl_glVertexAttribL3ui64vNV: - mov ___blue_glCore_glVertexAttribL3ui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCombinerInputNV +_bluegl_glCombinerInputNV: + mov ___blue_glCore_glCombinerInputNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeuiSUN -_bluegl_glReplacementCodeuiSUN: - mov ___blue_glCore_glReplacementCodeuiSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCombinerOutputNV +_bluegl_glCombinerOutputNV: + mov ___blue_glCore_glCombinerOutputNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColor4ubVertex3fSUN -_bluegl_glColor4ubVertex3fSUN: - mov ___blue_glCore_glColor4ubVertex3fSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFinalCombinerInputNV +_bluegl_glFinalCombinerInputNV: + mov ___blue_glCore_glFinalCombinerInputNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawRangeElementsBaseVertex -_bluegl_glDrawRangeElementsBaseVertex: - mov ___blue_glCore_glDrawRangeElementsBaseVertex@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetCombinerInputParameterfvNV +_bluegl_glGetCombinerInputParameterfvNV: + mov ___blue_glCore_glGetCombinerInputParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetMultiTexParameterivEXT -_bluegl_glGetMultiTexParameterivEXT: - mov ___blue_glCore_glGetMultiTexParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetCombinerInputParameterivNV +_bluegl_glGetCombinerInputParameterivNV: + mov ___blue_glCore_glGetCombinerInputParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3hvNV -_bluegl_glMultiTexCoord3hvNV: - mov ___blue_glCore_glMultiTexCoord3hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetCombinerOutputParameterfvNV +_bluegl_glGetCombinerOutputParameterfvNV: + mov ___blue_glCore_glGetCombinerOutputParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetQueryBufferObjectuiv -_bluegl_glGetQueryBufferObjectuiv: - mov ___blue_glCore_glGetQueryBufferObjectuiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetCombinerOutputParameterivNV +_bluegl_glGetCombinerOutputParameterivNV: + mov ___blue_glCore_glGetCombinerOutputParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPerfMonitorGroupsAMD -_bluegl_glGetPerfMonitorGroupsAMD: - mov ___blue_glCore_glGetPerfMonitorGroupsAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFinalCombinerInputParameterfvNV +_bluegl_glGetFinalCombinerInputParameterfvNV: + mov ___blue_glCore_glGetFinalCombinerInputParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUnlockArraysEXT -_bluegl_glUnlockArraysEXT: - mov ___blue_glCore_glUnlockArraysEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFinalCombinerInputParameterivNV +_bluegl_glGetFinalCombinerInputParameterivNV: + mov ___blue_glCore_glGetFinalCombinerInputParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPauseTransformFeedback -_bluegl_glPauseTransformFeedback: - mov ___blue_glCore_glPauseTransformFeedback@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCombinerStageParameterfvNV +_bluegl_glCombinerStageParameterfvNV: + mov ___blue_glCore_glCombinerStageParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramEnvParameterIivNV -_bluegl_glGetProgramEnvParameterIivNV: - mov ___blue_glCore_glGetProgramEnvParameterIivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetCombinerStageParameterfvNV +_bluegl_glGetCombinerStageParameterfvNV: + mov ___blue_glCore_glGetCombinerStageParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathTexGenNV -_bluegl_glPathTexGenNV: - mov ___blue_glCore_glPathTexGenNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferSampleLocationsfvNV +_bluegl_glFramebufferSampleLocationsfvNV: + mov ___blue_glCore_glFramebufferSampleLocationsfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertex3xOES -_bluegl_glVertex3xOES: - mov ___blue_glCore_glVertex3xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNamedFramebufferSampleLocationsfvNV +_bluegl_glNamedFramebufferSampleLocationsfvNV: + mov ___blue_glCore_glNamedFramebufferSampleLocationsfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEdgeFlagPointerEXT -_bluegl_glEdgeFlagPointerEXT: - mov ___blue_glCore_glEdgeFlagPointerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glResolveDepthValuesNV +_bluegl_glResolveDepthValuesNV: + mov ___blue_glCore_glResolveDepthValuesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribBinding -_bluegl_glVertexAttribBinding: - mov ___blue_glCore_glVertexAttribBinding@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMakeBufferResidentNV +_bluegl_glMakeBufferResidentNV: + mov ___blue_glCore_glMakeBufferResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3f -_bluegl_glVertexAttrib3f: - mov ___blue_glCore_glVertexAttrib3f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMakeBufferNonResidentNV +_bluegl_glMakeBufferNonResidentNV: + mov ___blue_glCore_glMakeBufferNonResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4NubARB -_bluegl_glVertexAttrib4NubARB: - mov ___blue_glCore_glVertexAttrib4NubARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsBufferResidentNV +_bluegl_glIsBufferResidentNV: + mov ___blue_glCore_glIsBufferResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2svMESA -_bluegl_glWindowPos2svMESA: - mov ___blue_glCore_glWindowPos2svMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMakeNamedBufferResidentNV +_bluegl_glMakeNamedBufferResidentNV: + mov ___blue_glCore_glMakeNamedBufferResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetUniformSubroutineuiv -_bluegl_glGetUniformSubroutineuiv: - mov ___blue_glCore_glGetUniformSubroutineuiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glMakeNamedBufferNonResidentNV +_bluegl_glMakeNamedBufferNonResidentNV: + mov ___blue_glCore_glMakeNamedBufferNonResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2ivARB -_bluegl_glMultiTexCoord2ivARB: - mov ___blue_glCore_glMultiTexCoord2ivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsNamedBufferResidentNV +_bluegl_glIsNamedBufferResidentNV: + mov ___blue_glCore_glIsNamedBufferResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFragmentMaterialivSGIX -_bluegl_glFragmentMaterialivSGIX: - mov ___blue_glCore_glFragmentMaterialivSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetBufferParameterui64vNV +_bluegl_glGetBufferParameterui64vNV: + mov ___blue_glCore_glGetBufferParameterui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSamplerParameteriv -_bluegl_glSamplerParameteriv: - mov ___blue_glCore_glSamplerParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetNamedBufferParameterui64vNV +_bluegl_glGetNamedBufferParameterui64vNV: + mov ___blue_glCore_glGetNamedBufferParameterui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayColorOffsetEXT -_bluegl_glVertexArrayColorOffsetEXT: - mov ___blue_glCore_glVertexArrayColorOffsetEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetIntegerui64vNV +_bluegl_glGetIntegerui64vNV: + mov ___blue_glCore_glGetIntegerui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3sNV -_bluegl_glVertexAttrib3sNV: - mov ___blue_glCore_glVertexAttrib3sNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformui64NV +_bluegl_glUniformui64NV: + mov ___blue_glCore_glUniformui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawElementsInstanced -_bluegl_glDrawElementsInstanced: - mov ___blue_glCore_glDrawElementsInstanced@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glUniformui64vNV +_bluegl_glUniformui64vNV: + mov ___blue_glCore_glUniformui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreateSyncFromCLeventARB -_bluegl_glCreateSyncFromCLeventARB: - mov ___blue_glCore_glCreateSyncFromCLeventARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformui64NV +_bluegl_glProgramUniformui64NV: + mov ___blue_glCore_glProgramUniformui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glInsertEventMarkerEXT -_bluegl_glInsertEventMarkerEXT: - mov ___blue_glCore_glInsertEventMarkerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramUniformui64vNV +_bluegl_glProgramUniformui64vNV: + mov ___blue_glCore_glProgramUniformui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureParameterfv -_bluegl_glGetTextureParameterfv: - mov ___blue_glCore_glGetTextureParameterfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureBarrierNV +_bluegl_glTextureBarrierNV: + mov ___blue_glCore_glTextureBarrierNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyMultiTexImage2DEXT -_bluegl_glCopyMultiTexImage2DEXT: - mov ___blue_glCore_glCopyMultiTexImage2DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexImage2DMultisampleCoverageNV +_bluegl_glTexImage2DMultisampleCoverageNV: + mov ___blue_glCore_glTexImage2DMultisampleCoverageNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexWeightfEXT -_bluegl_glVertexWeightfEXT: - mov ___blue_glCore_glVertexWeightfEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexImage3DMultisampleCoverageNV +_bluegl_glTexImage3DMultisampleCoverageNV: + mov ___blue_glCore_glTexImage3DMultisampleCoverageNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4i64vARB -_bluegl_glUniform4i64vARB: - mov ___blue_glCore_glUniform4i64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureImage2DMultisampleNV +_bluegl_glTextureImage2DMultisampleNV: + mov ___blue_glCore_glTextureImage2DMultisampleNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPathParameterfvNV -_bluegl_glGetPathParameterfvNV: - mov ___blue_glCore_glGetPathParameterfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureImage3DMultisampleNV +_bluegl_glTextureImage3DMultisampleNV: + mov ___blue_glCore_glTextureImage3DMultisampleNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBlitNamedFramebuffer -_bluegl_glBlitNamedFramebuffer: - mov ___blue_glCore_glBlitNamedFramebuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureImage2DMultisampleCoverageNV +_bluegl_glTextureImage2DMultisampleCoverageNV: + mov ___blue_glCore_glTextureImage2DMultisampleCoverageNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoordPointerEXT -_bluegl_glTexCoordPointerEXT: - mov ___blue_glCore_glTexCoordPointerEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureImage3DMultisampleCoverageNV +_bluegl_glTextureImage3DMultisampleCoverageNV: + mov ___blue_glCore_glTextureImage3DMultisampleCoverageNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPathMetricsNV -_bluegl_glGetPathMetricsNV: - mov ___blue_glCore_glGetPathMetricsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBeginTransformFeedbackNV +_bluegl_glBeginTransformFeedbackNV: + mov ___blue_glCore_glBeginTransformFeedbackNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL2dvEXT -_bluegl_glVertexAttribL2dvEXT: - mov ___blue_glCore_glVertexAttribL2dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEndTransformFeedbackNV +_bluegl_glEndTransformFeedbackNV: + mov ___blue_glCore_glEndTransformFeedbackNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVariantuivEXT -_bluegl_glVariantuivEXT: - mov ___blue_glCore_glVariantuivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTransformFeedbackAttribsNV +_bluegl_glTransformFeedbackAttribsNV: + mov ___blue_glCore_glTransformFeedbackAttribsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribdvNV -_bluegl_glGetVertexAttribdvNV: - mov ___blue_glCore_glGetVertexAttribdvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindBufferRangeNV +_bluegl_glBindBufferRangeNV: + mov ___blue_glCore_glBindBufferRangeNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFenceSync -_bluegl_glFenceSync: - mov ___blue_glCore_glFenceSync@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindBufferOffsetNV +_bluegl_glBindBufferOffsetNV: + mov ___blue_glCore_glBindBufferOffsetNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureParameterIuiv -_bluegl_glGetTextureParameterIuiv: - mov ___blue_glCore_glGetTextureParameterIuiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindBufferBaseNV +_bluegl_glBindBufferBaseNV: + mov ___blue_glCore_glBindBufferBaseNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2sARB -_bluegl_glMultiTexCoord2sARB: - mov ___blue_glCore_glMultiTexCoord2sARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTransformFeedbackVaryingsNV +_bluegl_glTransformFeedbackVaryingsNV: + mov ___blue_glCore_glTransformFeedbackVaryingsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2i64NV -_bluegl_glUniform2i64NV: - mov ___blue_glCore_glUniform2i64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glActiveVaryingNV +_bluegl_glActiveVaryingNV: + mov ___blue_glCore_glActiveVaryingNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeformationMap3dSGIX -_bluegl_glDeformationMap3dSGIX: - mov ___blue_glCore_glDeformationMap3dSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVaryingLocationNV +_bluegl_glGetVaryingLocationNV: + mov ___blue_glCore_glGetVaryingLocationNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawRangeElementArrayAPPLE -_bluegl_glDrawRangeElementArrayAPPLE: - mov ___blue_glCore_glDrawRangeElementArrayAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetActiveVaryingNV +_bluegl_glGetActiveVaryingNV: + mov ___blue_glCore_glGetActiveVaryingNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDepthFunc -_bluegl_glDepthFunc: - mov ___blue_glCore_glDepthFunc@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTransformFeedbackVaryingNV +_bluegl_glGetTransformFeedbackVaryingNV: + mov ___blue_glCore_glGetTransformFeedbackVaryingNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3dvEXT -_bluegl_glProgramUniform3dvEXT: - mov ___blue_glCore_glProgramUniform3dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTransformFeedbackStreamAttribsNV +_bluegl_glTransformFeedbackStreamAttribsNV: + mov ___blue_glCore_glTransformFeedbackStreamAttribsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord3hvNV -_bluegl_glTexCoord3hvNV: - mov ___blue_glCore_glTexCoord3hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindTransformFeedbackNV +_bluegl_glBindTransformFeedbackNV: + mov ___blue_glCore_glBindTransformFeedbackNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPathLengthNV -_bluegl_glGetPathLengthNV: - mov ___blue_glCore_glGetPathLengthNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteTransformFeedbacksNV +_bluegl_glDeleteTransformFeedbacksNV: + mov ___blue_glCore_glDeleteTransformFeedbacksNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUnmapObjectBufferATI -_bluegl_glUnmapObjectBufferATI: - mov ___blue_glCore_glUnmapObjectBufferATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenTransformFeedbacksNV +_bluegl_glGenTransformFeedbacksNV: + mov ___blue_glCore_glGenTransformFeedbacksNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glValidateProgramPipeline -_bluegl_glValidateProgramPipeline: - mov ___blue_glCore_glValidateProgramPipeline@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsTransformFeedbackNV +_bluegl_glIsTransformFeedbackNV: + mov ___blue_glCore_glIsTransformFeedbackNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsProgram -_bluegl_glIsProgram: - mov ___blue_glCore_glIsProgram@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPauseTransformFeedbackNV +_bluegl_glPauseTransformFeedbackNV: + mov ___blue_glCore_glPauseTransformFeedbackNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4hvNV -_bluegl_glVertexAttrib4hvNV: - mov ___blue_glCore_glVertexAttrib4hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glResumeTransformFeedbackNV +_bluegl_glResumeTransformFeedbackNV: + mov ___blue_glCore_glResumeTransformFeedbackNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLoadTransposeMatrixdARB -_bluegl_glLoadTransposeMatrixdARB: - mov ___blue_glCore_glLoadTransposeMatrixdARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawTransformFeedbackNV +_bluegl_glDrawTransformFeedbackNV: + mov ___blue_glCore_glDrawTransformFeedbackNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMapVertexAttrib2dAPPLE -_bluegl_glMapVertexAttrib2dAPPLE: - mov ___blue_glCore_glMapVertexAttrib2dAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVDPAUInitNV +_bluegl_glVDPAUInitNV: + mov ___blue_glCore_glVDPAUInitNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramBinary -_bluegl_glProgramBinary: - mov ___blue_glCore_glProgramBinary@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVDPAUFiniNV +_bluegl_glVDPAUFiniNV: + mov ___blue_glCore_glVDPAUFiniNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3i -_bluegl_glUniform3i: - mov ___blue_glCore_glUniform3i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVDPAURegisterVideoSurfaceNV +_bluegl_glVDPAURegisterVideoSurfaceNV: + mov ___blue_glCore_glVDPAURegisterVideoSurfaceNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2dEXT -_bluegl_glProgramUniform2dEXT: - mov ___blue_glCore_glProgramUniform2dEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVDPAURegisterOutputSurfaceNV +_bluegl_glVDPAURegisterOutputSurfaceNV: + mov ___blue_glCore_glVDPAURegisterOutputSurfaceNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDepthRangeIndexed -_bluegl_glDepthRangeIndexed: - mov ___blue_glCore_glDepthRangeIndexed@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVDPAUIsSurfaceNV +_bluegl_glVDPAUIsSurfaceNV: + mov ___blue_glCore_glVDPAUIsSurfaceNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEvalCoord1xOES -_bluegl_glEvalCoord1xOES: - mov ___blue_glCore_glEvalCoord1xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVDPAUUnregisterSurfaceNV +_bluegl_glVDPAUUnregisterSurfaceNV: + mov ___blue_glCore_glVDPAUUnregisterSurfaceNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayRangeAPPLE -_bluegl_glVertexArrayRangeAPPLE: - mov ___blue_glCore_glVertexArrayRangeAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVDPAUGetSurfaceivNV +_bluegl_glVDPAUGetSurfaceivNV: + mov ___blue_glCore_glVDPAUGetSurfaceivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream1svATI -_bluegl_glVertexStream1svATI: - mov ___blue_glCore_glVertexStream1svATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVDPAUSurfaceAccessNV +_bluegl_glVDPAUSurfaceAccessNV: + mov ___blue_glCore_glVDPAUSurfaceAccessNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormalStream3iATI -_bluegl_glNormalStream3iATI: - mov ___blue_glCore_glNormalStream3iATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVDPAUMapSurfacesNV +_bluegl_glVDPAUMapSurfacesNV: + mov ___blue_glCore_glVDPAUMapSurfacesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4f -_bluegl_glProgramUniform4f: - mov ___blue_glCore_glProgramUniform4f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVDPAUUnmapSurfacesNV +_bluegl_glVDPAUUnmapSurfacesNV: + mov ___blue_glCore_glVDPAUUnmapSurfacesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glScalexOES -_bluegl_glScalexOES: - mov ___blue_glCore_glScalexOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFlushVertexArrayRangeNV +_bluegl_glFlushVertexArrayRangeNV: + mov ___blue_glCore_glFlushVertexArrayRangeNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1fv -_bluegl_glUniform1fv: - mov ___blue_glCore_glUniform1fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexArrayRangeNV +_bluegl_glVertexArrayRangeNV: + mov ___blue_glCore_glVertexArrayRangeNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetActiveUniform -_bluegl_glGetActiveUniform: - mov ___blue_glCore_glGetActiveUniform@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL1i64NV +_bluegl_glVertexAttribL1i64NV: + mov ___blue_glCore_glVertexAttribL1i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformMatrix4x3fv -_bluegl_glProgramUniformMatrix4x3fv: - mov ___blue_glCore_glProgramUniformMatrix4x3fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL2i64NV +_bluegl_glVertexAttribL2i64NV: + mov ___blue_glCore_glVertexAttribL2i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreateVertexArrays -_bluegl_glCreateVertexArrays: - mov ___blue_glCore_glCreateVertexArrays@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL3i64NV +_bluegl_glVertexAttribL3i64NV: + mov ___blue_glCore_glVertexAttribL3i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3dv -_bluegl_glWindowPos3dv: - mov ___blue_glCore_glWindowPos3dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL4i64NV +_bluegl_glVertexAttribL4i64NV: + mov ___blue_glCore_glVertexAttribL4i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1fARB -_bluegl_glUniform1fARB: - mov ___blue_glCore_glUniform1fARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL1i64vNV +_bluegl_glVertexAttribL1i64vNV: + mov ___blue_glCore_glVertexAttribL1i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFragmentMaterialiSGIX -_bluegl_glFragmentMaterialiSGIX: - mov ___blue_glCore_glFragmentMaterialiSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL2i64vNV +_bluegl_glVertexAttribL2i64vNV: + mov ___blue_glCore_glVertexAttribL2i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribArrayObjectfvATI -_bluegl_glGetVertexAttribArrayObjectfvATI: - mov ___blue_glCore_glGetVertexAttribArrayObjectfvATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL3i64vNV +_bluegl_glVertexAttribL3i64vNV: + mov ___blue_glCore_glVertexAttribL3i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearAccumxOES -_bluegl_glClearAccumxOES: - mov ___blue_glCore_glClearAccumxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL4i64vNV +_bluegl_glVertexAttribL4i64vNV: + mov ___blue_glCore_glVertexAttribL4i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindFragDataLocationEXT -_bluegl_glBindFragDataLocationEXT: - mov ___blue_glCore_glBindFragDataLocationEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL1ui64NV +_bluegl_glVertexAttribL1ui64NV: + mov ___blue_glCore_glVertexAttribL1ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4dARB -_bluegl_glMultiTexCoord4dARB: - mov ___blue_glCore_glMultiTexCoord4dARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL2ui64NV +_bluegl_glVertexAttribL2ui64NV: + mov ___blue_glCore_glVertexAttribL2ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glConvolutionParameterfv -_bluegl_glConvolutionParameterfv: - mov ___blue_glCore_glConvolutionParameterfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL3ui64NV +_bluegl_glVertexAttribL3ui64NV: + mov ___blue_glCore_glVertexAttribL3ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFragmentColorMaterialSGIX -_bluegl_glFragmentColorMaterialSGIX: - mov ___blue_glCore_glFragmentColorMaterialSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL4ui64NV +_bluegl_glVertexAttribL4ui64NV: + mov ___blue_glCore_glVertexAttribL4ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glUniformMatrix3dv -_bluegl_glUniformMatrix3dv: - mov ___blue_glCore_glUniformMatrix3dv@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glVertexAttribL1ui64vNV +_bluegl_glVertexAttribL1ui64vNV: + mov ___blue_glCore_glVertexAttribL1ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnPixelMapusv -_bluegl_glGetnPixelMapusv: - mov ___blue_glCore_glGetnPixelMapusv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL2ui64vNV +_bluegl_glVertexAttribL2ui64vNV: + mov ___blue_glCore_glVertexAttribL2ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferTextureLayer -_bluegl_glFramebufferTextureLayer: - mov ___blue_glCore_glFramebufferTextureLayer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL3ui64vNV +_bluegl_glVertexAttribL3ui64vNV: + mov ___blue_glCore_glVertexAttribL3ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStencilThenCoverStrokePathInstancedNV -_bluegl_glStencilThenCoverStrokePathInstancedNV: - mov ___blue_glCore_glStencilThenCoverStrokePathInstancedNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribL4ui64vNV +_bluegl_glVertexAttribL4ui64vNV: + mov ___blue_glCore_glVertexAttribL4ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVDPAURegisterOutputSurfaceNV -_bluegl_glVDPAURegisterOutputSurfaceNV: - mov ___blue_glCore_glVDPAURegisterOutputSurfaceNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribLi64vNV +_bluegl_glGetVertexAttribLi64vNV: + mov ___blue_glCore_glGetVertexAttribLi64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4dvARB -_bluegl_glMultiTexCoord4dvARB: - mov ___blue_glCore_glMultiTexCoord4dvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribLui64vNV +_bluegl_glGetVertexAttribLui64vNV: + mov ___blue_glCore_glGetVertexAttribLui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyTextureSubImage3D -_bluegl_glCopyTextureSubImage3D: - mov ___blue_glCore_glCopyTextureSubImage3D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribLFormatNV +_bluegl_glVertexAttribLFormatNV: + mov ___blue_glCore_glVertexAttribLFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVariantIntegervEXT -_bluegl_glGetVariantIntegervEXT: - mov ___blue_glCore_glGetVariantIntegervEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBufferAddressRangeNV +_bluegl_glBufferAddressRangeNV: + mov ___blue_glCore_glBufferAddressRangeNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTexEnvxvOES -_bluegl_glGetTexEnvxvOES: - mov ___blue_glCore_glGetTexEnvxvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexFormatNV +_bluegl_glVertexFormatNV: + mov ___blue_glCore_glVertexFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetFloati_vEXT -_bluegl_glGetFloati_vEXT: - mov ___blue_glCore_glGetFloati_vEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormalFormatNV +_bluegl_glNormalFormatNV: + mov ___blue_glCore_glNormalFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glAsyncMarkerSGIX -_bluegl_glAsyncMarkerSGIX: - mov ___blue_glCore_glAsyncMarkerSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorFormatNV +_bluegl_glColorFormatNV: + mov ___blue_glCore_glColorFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN -_bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN: - mov ___blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIndexFormatNV +_bluegl_glIndexFormatNV: + mov ___blue_glCore_glIndexFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexRenderbufferNV -_bluegl_glTexRenderbufferNV: - mov ___blue_glCore_glTexRenderbufferNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoordFormatNV +_bluegl_glTexCoordFormatNV: + mov ___blue_glCore_glTexCoordFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetConvolutionParameterfvEXT -_bluegl_glGetConvolutionParameterfvEXT: - mov ___blue_glCore_glGetConvolutionParameterfvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEdgeFlagFormatNV +_bluegl_glEdgeFlagFormatNV: + mov ___blue_glCore_glEdgeFlagFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLightxvOES -_bluegl_glLightxvOES: - mov ___blue_glCore_glLightxvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSecondaryColorFormatNV +_bluegl_glSecondaryColorFormatNV: + mov ___blue_glCore_glSecondaryColorFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteNamedStringARB -_bluegl_glDeleteNamedStringARB: - mov ___blue_glCore_glDeleteNamedStringARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFogCoordFormatNV +_bluegl_glFogCoordFormatNV: + mov ___blue_glCore_glFogCoordFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColor3hvNV -_bluegl_glColor3hvNV: - mov ___blue_glCore_glColor3hvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribFormatNV +_bluegl_glVertexAttribFormatNV: + mov ___blue_glCore_glVertexAttribFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix4dv -_bluegl_glUniformMatrix4dv: - mov ___blue_glCore_glUniformMatrix4dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribIFormatNV +_bluegl_glVertexAttribIFormatNV: + mov ___blue_glCore_glVertexAttribIFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTexImage2DARB -_bluegl_glCompressedTexImage2DARB: - mov ___blue_glCore_glCompressedTexImage2DARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetIntegerui64i_vNV +_bluegl_glGetIntegerui64i_vNV: + mov ___blue_glCore_glGetIntegerui64i_vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenTexturesEXT -_bluegl_glGenTexturesEXT: - mov ___blue_glCore_glGenTexturesEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glAreProgramsResidentNV +_bluegl_glAreProgramsResidentNV: + mov ___blue_glCore_glAreProgramsResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathMemoryGlyphIndexArrayNV -_bluegl_glPathMemoryGlyphIndexArrayNV: - mov ___blue_glCore_glPathMemoryGlyphIndexArrayNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindProgramNV +_bluegl_glBindProgramNV: + mov ___blue_glCore_glBindProgramNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetBufferSubDataARB -_bluegl_glGetBufferSubDataARB: - mov ___blue_glCore_glGetBufferSubDataARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteProgramsNV +_bluegl_glDeleteProgramsNV: + mov ___blue_glCore_glDeleteProgramsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFinishObjectAPPLE -_bluegl_glFinishObjectAPPLE: - mov ___blue_glCore_glFinishObjectAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glExecuteProgramNV +_bluegl_glExecuteProgramNV: + mov ___blue_glCore_glExecuteProgramNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDetachShader -_bluegl_glDetachShader: - mov ___blue_glCore_glDetachShader@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenProgramsNV +_bluegl_glGenProgramsNV: + mov ___blue_glCore_glGenProgramsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindTexture -_bluegl_glBindTexture: - mov ___blue_glCore_glBindTexture@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramParameterdvNV +_bluegl_glGetProgramParameterdvNV: + mov ___blue_glCore_glGetProgramParameterdvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramResourcefvNV -_bluegl_glGetProgramResourcefvNV: - mov ___blue_glCore_glGetProgramResourcefvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramParameterfvNV +_bluegl_glGetProgramParameterfvNV: + mov ___blue_glCore_glGetProgramParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord2fColor4ubVertex3fvSUN -_bluegl_glTexCoord2fColor4ubVertex3fvSUN: - mov ___blue_glCore_glTexCoord2fColor4ubVertex3fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramivNV +_bluegl_glGetProgramivNV: + mov ___blue_glCore_glGetProgramivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4dv -_bluegl_glMultiTexCoord4dv: - mov ___blue_glCore_glMultiTexCoord4dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetProgramStringNV +_bluegl_glGetProgramStringNV: + mov ___blue_glCore_glGetProgramStringNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsPointInFillPathNV -_bluegl_glIsPointInFillPathNV: - mov ___blue_glCore_glIsPointInFillPathNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTrackMatrixivNV +_bluegl_glGetTrackMatrixivNV: + mov ___blue_glCore_glGetTrackMatrixivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawTransformFeedbackInstanced -_bluegl_glDrawTransformFeedbackInstanced: - mov ___blue_glCore_glDrawTransformFeedbackInstanced@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribdvNV +_bluegl_glGetVertexAttribdvNV: + mov ___blue_glCore_glGetVertexAttribdvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramParameteriARB -_bluegl_glProgramParameteriARB: - mov ___blue_glCore_glProgramParameteriARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribfvNV +_bluegl_glGetVertexAttribfvNV: + mov ___blue_glCore_glGetVertexAttribfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3fvNV -_bluegl_glVertexAttrib3fvNV: - mov ___blue_glCore_glVertexAttrib3fvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribivNV +_bluegl_glGetVertexAttribivNV: + mov ___blue_glCore_glGetVertexAttribivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEnableVertexArrayAttrib -_bluegl_glEnableVertexArrayAttrib: - mov ___blue_glCore_glEnableVertexArrayAttrib@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribPointervNV +_bluegl_glGetVertexAttribPointervNV: + mov ___blue_glCore_glGetVertexAttribPointervNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3ui64vNV -_bluegl_glUniform3ui64vNV: - mov ___blue_glCore_glUniform3ui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsProgramNV +_bluegl_glIsProgramNV: + mov ___blue_glCore_glIsProgramNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribs4fvNV -_bluegl_glVertexAttribs4fvNV: - mov ___blue_glCore_glVertexAttribs4fvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLoadProgramNV +_bluegl_glLoadProgramNV: + mov ___blue_glCore_glLoadProgramNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetCompressedTextureImageEXT -_bluegl_glGetCompressedTextureImageEXT: - mov ___blue_glCore_glGetCompressedTextureImageEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramParameter4dNV +_bluegl_glProgramParameter4dNV: + mov ___blue_glCore_glProgramParameter4dNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertex3bOES -_bluegl_glVertex3bOES: - mov ___blue_glCore_glVertex3bOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramParameter4dvNV +_bluegl_glProgramParameter4dvNV: + mov ___blue_glCore_glProgramParameter4dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramLocalParameterI4ivNV -_bluegl_glProgramLocalParameterI4ivNV: - mov ___blue_glCore_glProgramLocalParameterI4ivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramParameter4fNV +_bluegl_glProgramParameter4fNV: + mov ___blue_glCore_glProgramParameter4fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2fMESA -_bluegl_glWindowPos2fMESA: - mov ___blue_glCore_glWindowPos2fMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramParameter4fvNV +_bluegl_glProgramParameter4fvNV: + mov ___blue_glCore_glProgramParameter4fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWeightusvARB -_bluegl_glWeightusvARB: - mov ___blue_glCore_glWeightusvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramParameters4dvNV +_bluegl_glProgramParameters4dvNV: + mov ___blue_glCore_glProgramParameters4dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenOcclusionQueriesNV -_bluegl_glGenOcclusionQueriesNV: - mov ___blue_glCore_glGenOcclusionQueriesNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glProgramParameters4fvNV +_bluegl_glProgramParameters4fvNV: + mov ___blue_glCore_glProgramParameters4fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoordPointervINTEL -_bluegl_glTexCoordPointervINTEL: - mov ___blue_glCore_glTexCoordPointervINTEL@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glRequestResidentProgramsNV +_bluegl_glRequestResidentProgramsNV: + mov ___blue_glCore_glRequestResidentProgramsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureParameterIivEXT -_bluegl_glGetTextureParameterIivEXT: - mov ___blue_glCore_glGetTextureParameterIivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTrackMatrixNV +_bluegl_glTrackMatrixNV: + mov ___blue_glCore_glTrackMatrixNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteStatesNV -_bluegl_glDeleteStatesNV: - mov ___blue_glCore_glDeleteStatesNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribPointerNV +_bluegl_glVertexAttribPointerNV: + mov ___blue_glCore_glVertexAttribPointerNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramLocalParameter4fvARB -_bluegl_glProgramLocalParameter4fvARB: - mov ___blue_glCore_glProgramLocalParameter4fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1dNV +_bluegl_glVertexAttrib1dNV: + mov ___blue_glCore_glVertexAttrib1dNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCoverFillPathInstancedNV -_bluegl_glCoverFillPathInstancedNV: - mov ___blue_glCore_glCoverFillPathInstancedNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1dvNV +_bluegl_glVertexAttrib1dvNV: + mov ___blue_glCore_glVertexAttrib1dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBeginConditionalRenderNVX -_bluegl_glBeginConditionalRenderNVX: - mov ___blue_glCore_glBeginConditionalRenderNVX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1fNV +_bluegl_glVertexAttrib1fNV: + mov ___blue_glCore_glVertexAttrib1fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathDashArrayNV -_bluegl_glPathDashArrayNV: - mov ___blue_glCore_glPathDashArrayNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1fvNV +_bluegl_glVertexAttrib1fvNV: + mov ___blue_glCore_glVertexAttrib1fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSpriteParameteriSGIX -_bluegl_glSpriteParameteriSGIX: - mov ___blue_glCore_glSpriteParameteriSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1sNV +_bluegl_glVertexAttrib1sNV: + mov ___blue_glCore_glVertexAttrib1sNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedProgramStringEXT -_bluegl_glGetNamedProgramStringEXT: - mov ___blue_glCore_glGetNamedProgramStringEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib1svNV +_bluegl_glVertexAttrib1svNV: + mov ___blue_glCore_glVertexAttrib1svNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCombinerParameterfvNV -_bluegl_glCombinerParameterfvNV: - mov ___blue_glCore_glCombinerParameterfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2dNV +_bluegl_glVertexAttrib2dNV: + mov ___blue_glCore_glVertexAttrib2dNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexParameterxvOES -_bluegl_glTexParameterxvOES: - mov ___blue_glCore_glTexParameterxvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2dvNV +_bluegl_glVertexAttrib2dvNV: + mov ___blue_glCore_glVertexAttrib2dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayVertexAttribDivisorEXT -_bluegl_glVertexArrayVertexAttribDivisorEXT: - mov ___blue_glCore_glVertexArrayVertexAttribDivisorEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2fNV +_bluegl_glVertexAttrib2fNV: + mov ___blue_glCore_glVertexAttrib2fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramSubroutineParametersuivNV -_bluegl_glProgramSubroutineParametersuivNV: - mov ___blue_glCore_glProgramSubroutineParametersuivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2fvNV +_bluegl_glVertexAttrib2fvNV: + mov ___blue_glCore_glVertexAttrib2fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteObjectARB -_bluegl_glDeleteObjectARB: - mov ___blue_glCore_glDeleteObjectARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2sNV +_bluegl_glVertexAttrib2sNV: + mov ___blue_glCore_glVertexAttrib2sNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform1i64ARB -_bluegl_glProgramUniform1i64ARB: - mov ___blue_glCore_glProgramUniform1i64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib2svNV +_bluegl_glVertexAttrib2svNV: + mov ___blue_glCore_glVertexAttrib2svNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferTextureARB -_bluegl_glFramebufferTextureARB: - mov ___blue_glCore_glFramebufferTextureARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3dNV +_bluegl_glVertexAttrib3dNV: + mov ___blue_glCore_glVertexAttrib3dNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glElementPointerATI -_bluegl_glElementPointerATI: - mov ___blue_glCore_glElementPointerATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3dvNV +_bluegl_glVertexAttrib3dvNV: + mov ___blue_glCore_glVertexAttrib3dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform2i64vARB -_bluegl_glUniform2i64vARB: - mov ___blue_glCore_glUniform2i64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3fNV +_bluegl_glVertexAttrib3fNV: + mov ___blue_glCore_glVertexAttrib3fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetBooleanIndexedvEXT -_bluegl_glGetBooleanIndexedvEXT: - mov ___blue_glCore_glGetBooleanIndexedvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3fvNV +_bluegl_glVertexAttrib3fvNV: + mov ___blue_glCore_glVertexAttrib3fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribP1uiv -_bluegl_glVertexAttribP1uiv: - mov ___blue_glCore_glVertexAttribP1uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3sNV +_bluegl_glVertexAttrib3sNV: + mov ___blue_glCore_glVertexAttrib3sNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetDoubleIndexedvEXT -_bluegl_glGetDoubleIndexedvEXT: - mov ___blue_glCore_glGetDoubleIndexedvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib3svNV +_bluegl_glVertexAttrib3svNV: + mov ___blue_glCore_glVertexAttrib3svNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetUniformiv -_bluegl_glGetUniformiv: - mov ___blue_glCore_glGetUniformiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4dNV +_bluegl_glVertexAttrib4dNV: + mov ___blue_glCore_glVertexAttrib4dNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribArrayObjectATI -_bluegl_glVertexAttribArrayObjectATI: - mov ___blue_glCore_glVertexAttribArrayObjectATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4dvNV +_bluegl_glVertexAttrib4dvNV: + mov ___blue_glCore_glVertexAttrib4dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBufferSubDataARB -_bluegl_glBufferSubDataARB: - mov ___blue_glCore_glBufferSubDataARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4fNV +_bluegl_glVertexAttrib4fNV: + mov ___blue_glCore_glVertexAttrib4fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2fARB -_bluegl_glWindowPos2fARB: - mov ___blue_glCore_glWindowPos2fARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4fvNV +_bluegl_glVertexAttrib4fvNV: + mov ___blue_glCore_glVertexAttrib4fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord2bvOES -_bluegl_glMultiTexCoord2bvOES: - mov ___blue_glCore_glMultiTexCoord2bvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4sNV +_bluegl_glVertexAttrib4sNV: + mov ___blue_glCore_glVertexAttrib4sNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform2i64vARB -_bluegl_glProgramUniform2i64vARB: - mov ___blue_glCore_glProgramUniform2i64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4svNV +_bluegl_glVertexAttrib4svNV: + mov ___blue_glCore_glVertexAttrib4svNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexEnvxOES -_bluegl_glTexEnvxOES: - mov ___blue_glCore_glTexEnvxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4ubNV +_bluegl_glVertexAttrib4ubNV: + mov ___blue_glCore_glVertexAttrib4ubNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStencilOpValueAMD -_bluegl_glStencilOpValueAMD: - mov ___blue_glCore_glStencilOpValueAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttrib4ubvNV +_bluegl_glVertexAttrib4ubvNV: + mov ___blue_glCore_glVertexAttrib4ubvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4ui64vARB -_bluegl_glUniform4ui64vARB: - mov ___blue_glCore_glUniform4ui64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribs1dvNV +_bluegl_glVertexAttribs1dvNV: + mov ___blue_glCore_glVertexAttribs1dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTangent3iEXT -_bluegl_glTangent3iEXT: - mov ___blue_glCore_glTangent3iEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribs1fvNV +_bluegl_glVertexAttribs1fvNV: + mov ___blue_glCore_glVertexAttribs1fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexAttribLdvEXT -_bluegl_glGetVertexAttribLdvEXT: - mov ___blue_glCore_glGetVertexAttribLdvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribs1svNV +_bluegl_glVertexAttribs1svNV: + mov ___blue_glCore_glVertexAttribs1svNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetCoverageModulationTableNV -_bluegl_glGetCoverageModulationTableNV: - mov ___blue_glCore_glGetCoverageModulationTableNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribs2dvNV +_bluegl_glVertexAttribs2dvNV: + mov ___blue_glCore_glVertexAttribs2dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexWeighthvNV -_bluegl_glVertexWeighthvNV: - mov ___blue_glCore_glVertexWeighthvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribs2fvNV +_bluegl_glVertexAttribs2fvNV: + mov ___blue_glCore_glVertexAttribs2fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3iARB -_bluegl_glWindowPos3iARB: - mov ___blue_glCore_glWindowPos3iARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribs2svNV +_bluegl_glVertexAttribs2svNV: + mov ___blue_glCore_glVertexAttribs2svNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI1iv -_bluegl_glVertexAttribI1iv: - mov ___blue_glCore_glVertexAttribI1iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribs3dvNV +_bluegl_glVertexAttribs3dvNV: + mov ___blue_glCore_glVertexAttribs3dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3fv -_bluegl_glWindowPos3fv: - mov ___blue_glCore_glWindowPos3fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribs3fvNV +_bluegl_glVertexAttribs3fvNV: + mov ___blue_glCore_glVertexAttribs3fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream4ivATI -_bluegl_glVertexStream4ivATI: - mov ___blue_glCore_glVertexStream4ivATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribs3svNV +_bluegl_glVertexAttribs3svNV: + mov ___blue_glCore_glVertexAttribs3svNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureImage3DMultisampleCoverageNV -_bluegl_glTextureImage3DMultisampleCoverageNV: - mov ___blue_glCore_glTextureImage3DMultisampleCoverageNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribs4dvNV +_bluegl_glVertexAttribs4dvNV: + mov ___blue_glCore_glVertexAttribs4dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform3f -_bluegl_glUniform3f: - mov ___blue_glCore_glUniform3f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribs4fvNV +_bluegl_glVertexAttribs4fvNV: + mov ___blue_glCore_glVertexAttribs4fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glAccumxOES -_bluegl_glAccumxOES: - mov ___blue_glCore_glAccumxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribs4svNV +_bluegl_glVertexAttribs4svNV: + mov ___blue_glCore_glVertexAttribs4svNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexStorage3D -_bluegl_glTexStorage3D: - mov ___blue_glCore_glTexStorage3D@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribs4ubvNV +_bluegl_glVertexAttribs4ubvNV: + mov ___blue_glCore_glVertexAttribs4ubvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawArrays -_bluegl_glDrawArrays: - mov ___blue_glCore_glDrawArrays@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI1iEXT +_bluegl_glVertexAttribI1iEXT: + mov ___blue_glCore_glVertexAttribI1iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSamplePatternEXT -_bluegl_glSamplePatternEXT: - mov ___blue_glCore_glSamplePatternEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI2iEXT +_bluegl_glVertexAttribI2iEXT: + mov ___blue_glCore_glVertexAttribI2iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glNormalPointervINTEL -_bluegl_glNormalPointervINTEL: - mov ___blue_glCore_glNormalPointervINTEL@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glVertexAttribI3iEXT +_bluegl_glVertexAttribI3iEXT: + mov ___blue_glCore_glVertexAttribI3iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWeightubvARB -_bluegl_glWeightubvARB: - mov ___blue_glCore_glWeightubvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI4iEXT +_bluegl_glVertexAttribI4iEXT: + mov ___blue_glCore_glVertexAttribI4iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenProgramsNV -_bluegl_glGenProgramsNV: - mov ___blue_glCore_glGenProgramsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI1uiEXT +_bluegl_glVertexAttribI1uiEXT: + mov ___blue_glCore_glVertexAttribI1uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDepthRangef -_bluegl_glDepthRangef: - mov ___blue_glCore_glDepthRangef@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI2uiEXT +_bluegl_glVertexAttribI2uiEXT: + mov ___blue_glCore_glVertexAttribI2uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramParameterdvNV -_bluegl_glGetProgramParameterdvNV: - mov ___blue_glCore_glGetProgramParameterdvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI3uiEXT +_bluegl_glVertexAttribI3uiEXT: + mov ___blue_glCore_glVertexAttribI3uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPollInstrumentsSGIX -_bluegl_glPollInstrumentsSGIX: - mov ___blue_glCore_glPollInstrumentsSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI4uiEXT +_bluegl_glVertexAttribI4uiEXT: + mov ___blue_glCore_glVertexAttribI4uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1hNV -_bluegl_glMultiTexCoord1hNV: - mov ___blue_glCore_glMultiTexCoord1hNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI1ivEXT +_bluegl_glVertexAttribI1ivEXT: + mov ___blue_glCore_glVertexAttribI1ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3s -_bluegl_glSecondaryColor3s: - mov ___blue_glCore_glSecondaryColor3s@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI2ivEXT +_bluegl_glVertexAttribI2ivEXT: + mov ___blue_glCore_glVertexAttribI2ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoordP1uiv -_bluegl_glTexCoordP1uiv: - mov ___blue_glCore_glTexCoordP1uiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI3ivEXT +_bluegl_glVertexAttribI3ivEXT: + mov ___blue_glCore_glVertexAttribI3ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glStopInstrumentsSGIX -_bluegl_glStopInstrumentsSGIX: - mov ___blue_glCore_glStopInstrumentsSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI4ivEXT +_bluegl_glVertexAttribI4ivEXT: + mov ___blue_glCore_glVertexAttribI4ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glActiveTexture -_bluegl_glActiveTexture: - mov ___blue_glCore_glActiveTexture@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI1uivEXT +_bluegl_glVertexAttribI1uivEXT: + mov ___blue_glCore_glVertexAttribI1uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribs2svNV -_bluegl_glVertexAttribs2svNV: - mov ___blue_glCore_glVertexAttribs2svNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI2uivEXT +_bluegl_glVertexAttribI2uivEXT: + mov ___blue_glCore_glVertexAttribI2uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetActiveAtomicCounterBufferiv -_bluegl_glGetActiveAtomicCounterBufferiv: - mov ___blue_glCore_glGetActiveAtomicCounterBufferiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI3uivEXT +_bluegl_glVertexAttribI3uivEXT: + mov ___blue_glCore_glVertexAttribI3uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEndConditionalRenderNVX -_bluegl_glEndConditionalRenderNVX: - mov ___blue_glCore_glEndConditionalRenderNVX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI4uivEXT +_bluegl_glVertexAttribI4uivEXT: + mov ___blue_glCore_glVertexAttribI4uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawRangeElementArrayATI -_bluegl_glDrawRangeElementArrayATI: - mov ___blue_glCore_glDrawRangeElementArrayATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI4bvEXT +_bluegl_glVertexAttribI4bvEXT: + mov ___blue_glCore_glVertexAttribI4bvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyMultiTexImage1DEXT -_bluegl_glCopyMultiTexImage1DEXT: - mov ___blue_glCore_glCopyMultiTexImage1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI4svEXT +_bluegl_glVertexAttribI4svEXT: + mov ___blue_glCore_glVertexAttribI4svEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeusSUN -_bluegl_glReplacementCodeusSUN: - mov ___blue_glCore_glReplacementCodeusSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI4ubvEXT +_bluegl_glVertexAttribI4ubvEXT: + mov ___blue_glCore_glVertexAttribI4ubvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexGendEXT -_bluegl_glMultiTexGendEXT: - mov ___blue_glCore_glMultiTexGendEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribI4usvEXT +_bluegl_glVertexAttribI4usvEXT: + mov ___blue_glCore_glVertexAttribI4usvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixRotatefEXT -_bluegl_glMatrixRotatefEXT: - mov ___blue_glCore_glMatrixRotatefEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVertexAttribIPointerEXT +_bluegl_glVertexAttribIPointerEXT: + mov ___blue_glCore_glVertexAttribIPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindBufferOffsetNV -_bluegl_glBindBufferOffsetNV: - mov ___blue_glCore_glBindBufferOffsetNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribIivEXT +_bluegl_glGetVertexAttribIivEXT: + mov ___blue_glCore_glGetVertexAttribIivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI1ui -_bluegl_glVertexAttribI1ui: - mov ___blue_glCore_glVertexAttribI1ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVertexAttribIuivEXT +_bluegl_glGetVertexAttribIuivEXT: + mov ___blue_glCore_glGetVertexAttribIuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMakeImageHandleNonResidentARB -_bluegl_glMakeImageHandleNonResidentARB: - mov ___blue_glCore_glMakeImageHandleNonResidentARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBeginVideoCaptureNV +_bluegl_glBeginVideoCaptureNV: + mov ___blue_glCore_glBeginVideoCaptureNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureParameteriEXT -_bluegl_glTextureParameteriEXT: - mov ___blue_glCore_glTextureParameteriEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindVideoCaptureStreamBufferNV +_bluegl_glBindVideoCaptureStreamBufferNV: + mov ___blue_glCore_glBindVideoCaptureStreamBufferNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDebugMessageInsertARB -_bluegl_glDebugMessageInsertARB: - mov ___blue_glCore_glDebugMessageInsertARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glBindVideoCaptureStreamTextureNV +_bluegl_glBindVideoCaptureStreamTextureNV: + mov ___blue_glCore_glBindVideoCaptureStreamTextureNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4NubvARB -_bluegl_glVertexAttrib4NubvARB: - mov ___blue_glCore_glVertexAttrib4NubvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glEndVideoCaptureNV +_bluegl_glEndVideoCaptureNV: + mov ___blue_glCore_glEndVideoCaptureNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteTexturesEXT -_bluegl_glDeleteTexturesEXT: - mov ___blue_glCore_glDeleteTexturesEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVideoCaptureivNV +_bluegl_glGetVideoCaptureivNV: + mov ___blue_glCore_glGetVideoCaptureivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3svARB -_bluegl_glWindowPos3svARB: - mov ___blue_glCore_glWindowPos3svARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVideoCaptureStreamivNV +_bluegl_glGetVideoCaptureStreamivNV: + mov ___blue_glCore_glGetVideoCaptureStreamivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexParameterxOES -_bluegl_glTexParameterxOES: - mov ___blue_glCore_glTexParameterxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVideoCaptureStreamfvNV +_bluegl_glGetVideoCaptureStreamfvNV: + mov ___blue_glCore_glGetVideoCaptureStreamfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream3fATI -_bluegl_glVertexStream3fATI: - mov ___blue_glCore_glVertexStream3fATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetVideoCaptureStreamdvNV +_bluegl_glGetVideoCaptureStreamdvNV: + mov ___blue_glCore_glGetVideoCaptureStreamdvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNormal3xOES -_bluegl_glNormal3xOES: - mov ___blue_glCore_glNormal3xOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVideoCaptureNV +_bluegl_glVideoCaptureNV: + mov ___blue_glCore_glVideoCaptureNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4bvOES -_bluegl_glMultiTexCoord4bvOES: - mov ___blue_glCore_glMultiTexCoord4bvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVideoCaptureStreamParameterivNV +_bluegl_glVideoCaptureStreamParameterivNV: + mov ___blue_glCore_glVideoCaptureStreamParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL1dv -_bluegl_glVertexAttribL1dv: - mov ___blue_glCore_glVertexAttribL1dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVideoCaptureStreamParameterfvNV +_bluegl_glVideoCaptureStreamParameterfvNV: + mov ___blue_glCore_glVideoCaptureStreamParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetImageTransformParameterivHP -_bluegl_glGetImageTransformParameterivHP: - mov ___blue_glCore_glGetImageTransformParameterivHP@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glVideoCaptureStreamParameterdvNV +_bluegl_glVideoCaptureStreamParameterdvNV: + mov ___blue_glCore_glVideoCaptureStreamParameterdvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetSubroutineUniformLocation -_bluegl_glGetSubroutineUniformLocation: - mov ___blue_glCore_glGetSubroutineUniformLocation@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFramebufferTextureMultiviewOVR +_bluegl_glFramebufferTextureMultiviewOVR: + mov ___blue_glCore_glFramebufferTextureMultiviewOVR@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramEnvParameter4fvARB -_bluegl_glProgramEnvParameter4fvARB: - mov ___blue_glCore_glProgramEnvParameter4fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glHintPGI +_bluegl_glHintPGI: + mov ___blue_glCore_glHintPGI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureImageEXT -_bluegl_glGetTextureImageEXT: - mov ___blue_glCore_glGetTextureImageEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDetailTexFuncSGIS +_bluegl_glDetailTexFuncSGIS: + mov ___blue_glCore_glDetailTexFuncSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindTexGenParameterEXT -_bluegl_glBindTexGenParameterEXT: - mov ___blue_glCore_glBindTexGenParameterEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetDetailTexFuncSGIS +_bluegl_glGetDetailTexFuncSGIS: + mov ___blue_glCore_glGetDetailTexFuncSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMinSampleShadingARB -_bluegl_glMinSampleShadingARB: - mov ___blue_glCore_glMinSampleShadingARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFogFuncSGIS +_bluegl_glFogFuncSGIS: + mov ___blue_glCore_glFogFuncSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetAttachedObjectsARB -_bluegl_glGetAttachedObjectsARB: - mov ___blue_glCore_glGetAttachedObjectsARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFogFuncSGIS +_bluegl_glGetFogFuncSGIS: + mov ___blue_glCore_glGetFogFuncSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexArrayiv -_bluegl_glGetVertexArrayiv: - mov ___blue_glCore_glGetVertexArrayiv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSampleMaskSGIS +_bluegl_glSampleMaskSGIS: + mov ___blue_glCore_glSampleMaskSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWeightfvARB -_bluegl_glWeightfvARB: - mov ___blue_glCore_glWeightfvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSamplePatternSGIS +_bluegl_glSamplePatternSGIS: + mov ___blue_glCore_glSamplePatternSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPathCommandsNV -_bluegl_glGetPathCommandsNV: - mov ___blue_glCore_glGetPathCommandsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPixelTexGenParameteriSGIS +_bluegl_glPixelTexGenParameteriSGIS: + mov ___blue_glCore_glPixelTexGenParameteriSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetColorTableParameterivSGI -_bluegl_glGetColorTableParameterivSGI: - mov ___blue_glCore_glGetColorTableParameterivSGI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPixelTexGenParameterivSGIS +_bluegl_glPixelTexGenParameterivSGIS: + mov ___blue_glCore_glPixelTexGenParameterivSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedProgramivEXT -_bluegl_glGetNamedProgramivEXT: - mov ___blue_glCore_glGetNamedProgramivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPixelTexGenParameterfSGIS +_bluegl_glPixelTexGenParameterfSGIS: + mov ___blue_glCore_glPixelTexGenParameterfSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSecondaryColor3ubvEXT -_bluegl_glSecondaryColor3ubvEXT: - mov ___blue_glCore_glSecondaryColor3ubvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPixelTexGenParameterfvSGIS +_bluegl_glPixelTexGenParameterfvSGIS: + mov ___blue_glCore_glPixelTexGenParameterfvSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVDPAURegisterVideoSurfaceNV -_bluegl_glVDPAURegisterVideoSurfaceNV: - mov ___blue_glCore_glVDPAURegisterVideoSurfaceNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPixelTexGenParameterivSGIS +_bluegl_glGetPixelTexGenParameterivSGIS: + mov ___blue_glCore_glGetPixelTexGenParameterivSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexParameterf -_bluegl_glTexParameterf: - mov ___blue_glCore_glTexParameterf@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetPixelTexGenParameterfvSGIS +_bluegl_glGetPixelTexGenParameterfvSGIS: + mov ___blue_glCore_glGetPixelTexGenParameterfvSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL4i64NV -_bluegl_glVertexAttribL4i64NV: - mov ___blue_glCore_glVertexAttribL4i64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPointParameterfSGIS +_bluegl_glPointParameterfSGIS: + mov ___blue_glCore_glPointParameterfSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPollAsyncSGIX -_bluegl_glPollAsyncSGIX: - mov ___blue_glCore_glPollAsyncSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPointParameterfvSGIS +_bluegl_glPointParameterfvSGIS: + mov ___blue_glCore_glPointParameterfvSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBufferParameteriAPPLE -_bluegl_glBufferParameteriAPPLE: - mov ___blue_glCore_glBufferParameteriAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSharpenTexFuncSGIS +_bluegl_glSharpenTexFuncSGIS: + mov ___blue_glCore_glSharpenTexFuncSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glApplyTextureEXT -_bluegl_glApplyTextureEXT: - mov ___blue_glCore_glApplyTextureEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetSharpenTexFuncSGIS +_bluegl_glGetSharpenTexFuncSGIS: + mov ___blue_glCore_glGetSharpenTexFuncSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenVertexShadersEXT -_bluegl_glGenVertexShadersEXT: - mov ___blue_glCore_glGenVertexShadersEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexImage4DSGIS +_bluegl_glTexImage4DSGIS: + mov ___blue_glCore_glTexImage4DSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexImage2DMultisampleCoverageNV -_bluegl_glTexImage2DMultisampleCoverageNV: - mov ___blue_glCore_glTexImage2DMultisampleCoverageNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexSubImage4DSGIS +_bluegl_glTexSubImage4DSGIS: + mov ___blue_glCore_glTexSubImage4DSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glObjectUnpurgeableAPPLE -_bluegl_glObjectUnpurgeableAPPLE: - mov ___blue_glCore_glObjectUnpurgeableAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTextureColorMaskSGIS +_bluegl_glTextureColorMaskSGIS: + mov ___blue_glCore_glTextureColorMaskSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCopyNamedBufferSubData -_bluegl_glCopyNamedBufferSubData: - mov ___blue_glCore_glCopyNamedBufferSubData@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetTexFilterFuncSGIS +_bluegl_glGetTexFilterFuncSGIS: + mov ___blue_glCore_glGetTexFilterFuncSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4dv -_bluegl_glVertexAttrib4dv: - mov ___blue_glCore_glVertexAttrib4dv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexFilterFuncSGIS +_bluegl_glTexFilterFuncSGIS: + mov ___blue_glCore_glTexFilterFuncSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearTexSubImage -_bluegl_glClearTexSubImage: - mov ___blue_glCore_glClearTexSubImage@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glAsyncMarkerSGIX +_bluegl_glAsyncMarkerSGIX: + mov ___blue_glCore_glAsyncMarkerSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPointAlongPathNV -_bluegl_glPointAlongPathNV: - mov ___blue_glCore_glPointAlongPathNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFinishAsyncSGIX +_bluegl_glFinishAsyncSGIX: + mov ___blue_glCore_glFinishAsyncSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferTexture1DEXT -_bluegl_glFramebufferTexture1DEXT: - mov ___blue_glCore_glFramebufferTexture1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPollAsyncSGIX +_bluegl_glPollAsyncSGIX: + mov ___blue_glCore_glPollAsyncSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixLoad3x2fNV -_bluegl_glMatrixLoad3x2fNV: - mov ___blue_glCore_glMatrixLoad3x2fNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGenAsyncMarkersSGIX +_bluegl_glGenAsyncMarkersSGIX: + mov ___blue_glCore_glGenAsyncMarkersSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetUniformui64vARB -_bluegl_glGetUniformui64vARB: - mov ___blue_glCore_glGetUniformui64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeleteAsyncMarkersSGIX +_bluegl_glDeleteAsyncMarkersSGIX: + mov ___blue_glCore_glDeleteAsyncMarkersSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureStorage3DMultisampleEXT -_bluegl_glTextureStorage3DMultisampleEXT: - mov ___blue_glCore_glTextureStorage3DMultisampleEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIsAsyncMarkerSGIX +_bluegl_glIsAsyncMarkerSGIX: + mov ___blue_glCore_glIsAsyncMarkerSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTexCoord1bvOES -_bluegl_glTexCoord1bvOES: - mov ___blue_glCore_glTexCoord1bvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFlushRasterSGIX +_bluegl_glFlushRasterSGIX: + mov ___blue_glCore_glFlushRasterSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetBufferParameteri64v -_bluegl_glGetBufferParameteri64v: - mov ___blue_glCore_glGetBufferParameteri64v@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFragmentColorMaterialSGIX +_bluegl_glFragmentColorMaterialSGIX: + mov ___blue_glCore_glFragmentColorMaterialSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glQueryMatrixxOES -_bluegl_glQueryMatrixxOES: - mov ___blue_glCore_glQueryMatrixxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFragmentLightfSGIX +_bluegl_glFragmentLightfSGIX: + mov ___blue_glCore_glFragmentLightfSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib1fv -_bluegl_glVertexAttrib1fv: - mov ___blue_glCore_glVertexAttrib1fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFragmentLightfvSGIX +_bluegl_glFragmentLightfvSGIX: + mov ___blue_glCore_glFragmentLightfvSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribP3ui -_bluegl_glVertexAttribP3ui: - mov ___blue_glCore_glVertexAttribP3ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFragmentLightiSGIX +_bluegl_glFragmentLightiSGIX: + mov ___blue_glCore_glFragmentLightiSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVDPAUInitNV -_bluegl_glVDPAUInitNV: - mov ___blue_glCore_glVDPAUInitNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFragmentLightivSGIX +_bluegl_glFragmentLightivSGIX: + mov ___blue_glCore_glFragmentLightivSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPathStencilDepthOffsetNV -_bluegl_glPathStencilDepthOffsetNV: - mov ___blue_glCore_glPathStencilDepthOffsetNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFragmentLightModelfSGIX +_bluegl_glFragmentLightModelfSGIX: + mov ___blue_glCore_glFragmentLightModelfSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glLightxOES -_bluegl_glLightxOES: - mov ___blue_glCore_glLightxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFragmentLightModelfvSGIX +_bluegl_glFragmentLightModelfvSGIX: + mov ___blue_glCore_glFragmentLightModelfvSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI3i -_bluegl_glVertexAttribI3i: - mov ___blue_glCore_glVertexAttribI3i@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFragmentLightModeliSGIX +_bluegl_glFragmentLightModeliSGIX: + mov ___blue_glCore_glFragmentLightModeliSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformHandleui64vARB -_bluegl_glProgramUniformHandleui64vARB: - mov ___blue_glCore_glProgramUniformHandleui64vARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFragmentLightModelivSGIX +_bluegl_glFragmentLightModelivSGIX: + mov ___blue_glCore_glFragmentLightModelivSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureParameteriv -_bluegl_glTextureParameteriv: - mov ___blue_glCore_glTextureParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFragmentMaterialfSGIX +_bluegl_glFragmentMaterialfSGIX: + mov ___blue_glCore_glFragmentMaterialfSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniformHandleui64NV -_bluegl_glProgramUniformHandleui64NV: - mov ___blue_glCore_glProgramUniformHandleui64NV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFragmentMaterialfvSGIX +_bluegl_glFragmentMaterialfvSGIX: + mov ___blue_glCore_glFragmentMaterialfvSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetVertexArrayIntegervEXT -_bluegl_glGetVertexArrayIntegervEXT: - mov ___blue_glCore_glGetVertexArrayIntegervEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFragmentMaterialiSGIX +_bluegl_glFragmentMaterialiSGIX: + mov ___blue_glCore_glFragmentMaterialiSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawElements -_bluegl_glDrawElements: - mov ___blue_glCore_glDrawElements@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFragmentMaterialivSGIX +_bluegl_glFragmentMaterialivSGIX: + mov ___blue_glCore_glFragmentMaterialivSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform3i64ARB -_bluegl_glProgramUniform3i64ARB: - mov ___blue_glCore_glProgramUniform3i64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFragmentLightfvSGIX +_bluegl_glGetFragmentLightfvSGIX: + mov ___blue_glCore_glGetFragmentLightfvSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteAsyncMarkersSGIX -_bluegl_glDeleteAsyncMarkersSGIX: - mov ___blue_glCore_glDeleteAsyncMarkersSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFragmentLightivSGIX +_bluegl_glGetFragmentLightivSGIX: + mov ___blue_glCore_glGetFragmentLightivSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetLightxOES -_bluegl_glGetLightxOES: - mov ___blue_glCore_glGetLightxOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFragmentMaterialfvSGIX +_bluegl_glGetFragmentMaterialfvSGIX: + mov ___blue_glCore_glGetFragmentMaterialfvSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreateCommandListsNV -_bluegl_glCreateCommandListsNV: - mov ___blue_glCore_glCreateCommandListsNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetFragmentMaterialivSGIX +_bluegl_glGetFragmentMaterialivSGIX: + mov ___blue_glCore_glGetFragmentMaterialivSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClear -_bluegl_glClear: - mov ___blue_glCore_glClear@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLightEnviSGIX +_bluegl_glLightEnviSGIX: + mov ___blue_glCore_glLightEnviSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformui64vNV -_bluegl_glUniformui64vNV: - mov ___blue_glCore_glUniformui64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFrameZoomSGIX +_bluegl_glFrameZoomSGIX: + mov ___blue_glCore_glFrameZoomSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2dvNV -_bluegl_glVertexAttrib2dvNV: - mov ___blue_glCore_glVertexAttrib2dvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glIglooInterfaceSGIX +_bluegl_glIglooInterfaceSGIX: + mov ___blue_glCore_glIglooInterfaceSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN -_bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN: - mov ___blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetInstrumentsSGIX +_bluegl_glGetInstrumentsSGIX: + mov ___blue_glCore_glGetInstrumentsSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos3sARB -_bluegl_glWindowPos3sARB: - mov ___blue_glCore_glWindowPos3sARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glInstrumentsBufferSGIX +_bluegl_glInstrumentsBufferSGIX: + mov ___blue_glCore_glInstrumentsBufferSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) - -.private_extern _bluegl_glDrawTextureNV -_bluegl_glDrawTextureNV: - mov ___blue_glCore_glDrawTextureNV@GOTPCREL(%rip), %r11 + +.private_extern _bluegl_glPollInstrumentsSGIX +_bluegl_glPollInstrumentsSGIX: + mov ___blue_glCore_glPollInstrumentsSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIsSync -_bluegl_glIsSync: - mov ___blue_glCore_glIsSync@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReadInstrumentsSGIX +_bluegl_glReadInstrumentsSGIX: + mov ___blue_glCore_glReadInstrumentsSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMatrixTranslatedEXT -_bluegl_glMatrixTranslatedEXT: - mov ___blue_glCore_glMatrixTranslatedEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStartInstrumentsSGIX +_bluegl_glStartInstrumentsSGIX: + mov ___blue_glCore_glStartInstrumentsSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetActiveVaryingNV -_bluegl_glGetActiveVaryingNV: - mov ___blue_glCore_glGetActiveVaryingNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glStopInstrumentsSGIX +_bluegl_glStopInstrumentsSGIX: + mov ___blue_glCore_glStopInstrumentsSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCreateQueries -_bluegl_glCreateQueries: - mov ___blue_glCore_glCreateQueries@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetListParameterfvSGIX +_bluegl_glGetListParameterfvSGIX: + mov ___blue_glCore_glGetListParameterfvSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramEnvParameterdvARB -_bluegl_glGetProgramEnvParameterdvARB: - mov ___blue_glCore_glGetProgramEnvParameterdvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetListParameterivSGIX +_bluegl_glGetListParameterivSGIX: + mov ___blue_glCore_glGetListParameterivSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayVertexAttribIOffsetEXT -_bluegl_glVertexArrayVertexAttribIOffsetEXT: - mov ___blue_glCore_glVertexArrayVertexAttribIOffsetEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glListParameterfSGIX +_bluegl_glListParameterfSGIX: + mov ___blue_glCore_glListParameterfSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetLocalConstantBooleanvEXT -_bluegl_glGetLocalConstantBooleanvEXT: - mov ___blue_glCore_glGetLocalConstantBooleanvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glListParameterfvSGIX +_bluegl_glListParameterfvSGIX: + mov ___blue_glCore_glListParameterfvSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetProgramParameterfvNV -_bluegl_glGetProgramParameterfvNV: - mov ___blue_glCore_glGetProgramParameterfvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glListParameteriSGIX +_bluegl_glListParameteriSGIX: + mov ___blue_glCore_glListParameteriSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSpriteParameterivSGIX -_bluegl_glSpriteParameterivSGIX: - mov ___blue_glCore_glSpriteParameterivSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glListParameterivSGIX +_bluegl_glListParameterivSGIX: + mov ___blue_glCore_glListParameterivSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3xvOES -_bluegl_glMultiTexCoord3xvOES: - mov ___blue_glCore_glMultiTexCoord3xvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glPixelTexGenSGIX +_bluegl_glPixelTexGenSGIX: + mov ___blue_glCore_glPixelTexGenSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindBufferRangeNV -_bluegl_glBindBufferRangeNV: - mov ___blue_glCore_glBindBufferRangeNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeformationMap3dSGIX +_bluegl_glDeformationMap3dSGIX: + mov ___blue_glCore_glDeformationMap3dSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1sv -_bluegl_glMultiTexCoord1sv: - mov ___blue_glCore_glMultiTexCoord1sv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeformationMap3fSGIX +_bluegl_glDeformationMap3fSGIX: + mov ___blue_glCore_glDeformationMap3fSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream1ivATI -_bluegl_glVertexStream1ivATI: - mov ___blue_glCore_glVertexStream1ivATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDeformSGIX +_bluegl_glDeformSGIX: + mov ___blue_glCore_glDeformSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetQueryObjectivARB -_bluegl_glGetQueryObjectivARB: - mov ___blue_glCore_glGetQueryObjectivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glLoadIdentityDeformationMapSGIX +_bluegl_glLoadIdentityDeformationMapSGIX: + mov ___blue_glCore_glLoadIdentityDeformationMapSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeuiColor4ubVertex3fvSUN -_bluegl_glReplacementCodeuiColor4ubVertex3fvSUN: - mov ___blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReferencePlaneSGIX +_bluegl_glReferencePlaneSGIX: + mov ___blue_glCore_glReferencePlaneSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFlushMappedNamedBufferRange -_bluegl_glFlushMappedNamedBufferRange: - mov ___blue_glCore_glFlushMappedNamedBufferRange@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSpriteParameterfSGIX +_bluegl_glSpriteParameterfSGIX: + mov ___blue_glCore_glSpriteParameterfSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPointParameteriv -_bluegl_glPointParameteriv: - mov ___blue_glCore_glPointParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSpriteParameterfvSGIX +_bluegl_glSpriteParameterfvSGIX: + mov ___blue_glCore_glSpriteParameterfvSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTextureLevelParameterivEXT -_bluegl_glGetTextureLevelParameterivEXT: - mov ___blue_glCore_glGetTextureLevelParameterivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSpriteParameteriSGIX +_bluegl_glSpriteParameteriSGIX: + mov ___blue_glCore_glSpriteParameteriSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexEnviEXT -_bluegl_glMultiTexEnviEXT: - mov ___blue_glCore_glMultiTexEnviEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glSpriteParameterivSGIX +_bluegl_glSpriteParameterivSGIX: + mov ___blue_glCore_glSpriteParameterivSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPolygonOffset -_bluegl_glPolygonOffset: - mov ___blue_glCore_glPolygonOffset@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTagSampleBufferSGIX +_bluegl_glTagSampleBufferSGIX: + mov ___blue_glCore_glTagSampleBufferSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1ui64ARB -_bluegl_glUniform1ui64ARB: - mov ___blue_glCore_glUniform1ui64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorTableSGI +_bluegl_glColorTableSGI: + mov ___blue_glCore_glColorTableSGI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDeleteVertexArrays -_bluegl_glDeleteVertexArrays: - mov ___blue_glCore_glDeleteVertexArrays@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorTableParameterfvSGI +_bluegl_glColorTableParameterfvSGI: + mov ___blue_glCore_glColorTableParameterfvSGI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetUniformi64vNV -_bluegl_glGetUniformi64vNV: - mov ___blue_glCore_glGetUniformi64vNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColorTableParameterivSGI +_bluegl_glColorTableParameterivSGI: + mov ___blue_glCore_glColorTableParameterivSGI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI3iv -_bluegl_glVertexAttribI3iv: - mov ___blue_glCore_glVertexAttribI3iv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glCopyColorTableSGI +_bluegl_glCopyColorTableSGI: + mov ___blue_glCore_glCopyColorTableSGI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glEndQueryIndexed -_bluegl_glEndQueryIndexed: - mov ___blue_glCore_glEndQueryIndexed@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetColorTableSGI +_bluegl_glGetColorTableSGI: + mov ___blue_glCore_glGetColorTableSGI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureSubImage1DEXT -_bluegl_glTextureSubImage1DEXT: - mov ___blue_glCore_glTextureSubImage1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetColorTableParameterfvSGI +_bluegl_glGetColorTableParameterfvSGI: + mov ___blue_glCore_glGetColorTableParameterfvSGI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI4ubvEXT -_bluegl_glVertexAttribI4ubvEXT: - mov ___blue_glCore_glVertexAttribI4ubvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGetColorTableParameterivSGI +_bluegl_glGetColorTableParameterivSGI: + mov ___blue_glCore_glGetColorTableParameterivSGI@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribP4ui -_bluegl_glVertexAttribP4ui: - mov ___blue_glCore_glVertexAttribP4ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glFinishTextureSUNX +_bluegl_glFinishTextureSUNX: + mov ___blue_glCore_glFinishTextureSUNX@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glNamedProgramLocalParameter4dvEXT -_bluegl_glNamedProgramLocalParameter4dvEXT: - mov ___blue_glCore_glNamedProgramLocalParameter4dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGlobalAlphaFactorbSUN +_bluegl_glGlobalAlphaFactorbSUN: + mov ___blue_glCore_glGlobalAlphaFactorbSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedProgramLocalParameterIuivEXT -_bluegl_glGetNamedProgramLocalParameterIuivEXT: - mov ___blue_glCore_glGetNamedProgramLocalParameterIuivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGlobalAlphaFactorsSUN +_bluegl_glGlobalAlphaFactorsSUN: + mov ___blue_glCore_glGlobalAlphaFactorsSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPixelTexGenParameterivSGIS -_bluegl_glGetPixelTexGenParameterivSGIS: - mov ___blue_glCore_glGetPixelTexGenParameterivSGIS@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGlobalAlphaFactoriSUN +_bluegl_glGlobalAlphaFactoriSUN: + mov ___blue_glCore_glGlobalAlphaFactoriSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnMapdv -_bluegl_glGetnMapdv: - mov ___blue_glCore_glGetnMapdv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGlobalAlphaFactorfSUN +_bluegl_glGlobalAlphaFactorfSUN: + mov ___blue_glCore_glGlobalAlphaFactorfSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord4svARB -_bluegl_glMultiTexCoord4svARB: - mov ___blue_glCore_glMultiTexCoord4svARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGlobalAlphaFactordSUN +_bluegl_glGlobalAlphaFactordSUN: + mov ___blue_glCore_glGlobalAlphaFactordSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexStream2ivATI -_bluegl_glVertexStream2ivATI: - mov ___blue_glCore_glVertexStream2ivATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGlobalAlphaFactorubSUN +_bluegl_glGlobalAlphaFactorubSUN: + mov ___blue_glCore_glGlobalAlphaFactorubSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4uivEXT -_bluegl_glUniform4uivEXT: - mov ___blue_glCore_glUniform4uivEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGlobalAlphaFactorusSUN +_bluegl_glGlobalAlphaFactorusSUN: + mov ___blue_glCore_glGlobalAlphaFactorusSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetPointeri_vEXT -_bluegl_glGetPointeri_vEXT: - mov ___blue_glCore_glGetPointeri_vEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glGlobalAlphaFactoruiSUN +_bluegl_glGlobalAlphaFactoruiSUN: + mov ___blue_glCore_glGlobalAlphaFactoruiSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearTexImage -_bluegl_glClearTexImage: - mov ___blue_glCore_glClearTexImage@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glDrawMeshArraysSUN +_bluegl_glDrawMeshArraysSUN: + mov ___blue_glCore_glDrawMeshArraysSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribP1ui -_bluegl_glVertexAttribP1ui: - mov ___blue_glCore_glVertexAttribP1ui@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeuiSUN +_bluegl_glReplacementCodeuiSUN: + mov ___blue_glCore_glReplacementCodeuiSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glCompressedTexImage1DARB -_bluegl_glCompressedTexImage1DARB: - mov ___blue_glCore_glCompressedTexImage1DARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeusSUN +_bluegl_glReplacementCodeusSUN: + mov ___blue_glCore_glReplacementCodeusSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glTextureStorage1DEXT -_bluegl_glTextureStorage1DEXT: - mov ___blue_glCore_glTextureStorage1DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeubSUN +_bluegl_glReplacementCodeubSUN: + mov ___blue_glCore_glReplacementCodeubSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform4fvARB -_bluegl_glUniform4fvARB: - mov ___blue_glCore_glUniform4fvARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeuivSUN +_bluegl_glReplacementCodeuivSUN: + mov ___blue_glCore_glReplacementCodeuivSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFramebufferTexture3DEXT -_bluegl_glFramebufferTexture3DEXT: - mov ___blue_glCore_glFramebufferTexture3DEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeusvSUN +_bluegl_glReplacementCodeusvSUN: + mov ___blue_glCore_glReplacementCodeusvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDrawElementsIndirect -_bluegl_glDrawElementsIndirect: - mov ___blue_glCore_glDrawElementsIndirect@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeubvSUN +_bluegl_glReplacementCodeubvSUN: + mov ___blue_glCore_glReplacementCodeubvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindBufferBaseEXT -_bluegl_glBindBufferBaseEXT: - mov ___blue_glCore_glBindBufferBaseEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodePointerSUN +_bluegl_glReplacementCodePointerSUN: + mov ___blue_glCore_glReplacementCodePointerSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glIglooInterfaceSGIX -_bluegl_glIglooInterfaceSGIX: - mov ___blue_glCore_glIglooInterfaceSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColor4ubVertex2fSUN +_bluegl_glColor4ubVertex2fSUN: + mov ___blue_glCore_glColor4ubVertex2fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMinmaxEXT -_bluegl_glMinmaxEXT: - mov ___blue_glCore_glMinmaxEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColor4ubVertex2fvSUN +_bluegl_glColor4ubVertex2fvSUN: + mov ___blue_glCore_glColor4ubVertex2fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glClearDepthf -_bluegl_glClearDepthf: - mov ___blue_glCore_glClearDepthf@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColor4ubVertex3fSUN +_bluegl_glColor4ubVertex3fSUN: + mov ___blue_glCore_glColor4ubVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReadnPixels -_bluegl_glReadnPixels: - mov ___blue_glCore_glReadnPixels@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColor4ubVertex3fvSUN +_bluegl_glColor4ubVertex3fvSUN: + mov ___blue_glCore_glColor4ubVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGenerateTextureMipmap -_bluegl_glGenerateTextureMipmap: - mov ___blue_glCore_glGenerateTextureMipmap@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColor3fVertex3fSUN +_bluegl_glColor3fVertex3fSUN: + mov ___blue_glCore_glColor3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnPixelMapuivARB -_bluegl_glGetnPixelMapuivARB: - mov ___blue_glCore_glGetnPixelMapuivARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColor3fVertex3fvSUN +_bluegl_glColor3fVertex3fvSUN: + mov ___blue_glCore_glColor3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramLocalParameter4fARB -_bluegl_glProgramLocalParameter4fARB: - mov ___blue_glCore_glProgramLocalParameter4fARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormal3fVertex3fSUN +_bluegl_glNormal3fVertex3fSUN: + mov ___blue_glCore_glNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribL1dvEXT -_bluegl_glVertexAttribL1dvEXT: - mov ___blue_glCore_glVertexAttribL1dvEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glNormal3fVertex3fvSUN +_bluegl_glNormal3fVertex3fvSUN: + mov ___blue_glCore_glNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBeginTransformFeedback -_bluegl_glBeginTransformFeedback: - mov ___blue_glCore_glBeginTransformFeedback@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColor4fNormal3fVertex3fSUN +_bluegl_glColor4fNormal3fVertex3fSUN: + mov ___blue_glCore_glColor4fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glDepthBoundsEXT -_bluegl_glDepthBoundsEXT: - mov ___blue_glCore_glDepthBoundsEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glColor4fNormal3fVertex3fvSUN +_bluegl_glColor4fNormal3fVertex3fvSUN: + mov ___blue_glCore_glColor4fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib2f -_bluegl_glVertexAttrib2f: - mov ___blue_glCore_glVertexAttrib2f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord2fVertex3fSUN +_bluegl_glTexCoord2fVertex3fSUN: + mov ___blue_glCore_glTexCoord2fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramEnvParametersI4ivNV -_bluegl_glProgramEnvParametersI4ivNV: - mov ___blue_glCore_glProgramEnvParametersI4ivNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord2fVertex3fvSUN +_bluegl_glTexCoord2fVertex3fvSUN: + mov ___blue_glCore_glTexCoord2fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) .private_extern _bluegl_glTexCoord4fVertex4fSUN @@ -12744,147 +12753,137 @@ _bluegl_glTexCoord4fVertex4fSUN: mov ___blue_glCore_glTexCoord4fVertex4fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN -_bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN: - mov ___blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.private_extern _bluegl_glGetNamedProgramLocalParameterfvEXT -_bluegl_glGetNamedProgramLocalParameterfvEXT: - mov ___blue_glCore_glGetNamedProgramLocalParameterfvEXT@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.private_extern _bluegl_glProgramUniform1ui64ARB -_bluegl_glProgramUniform1ui64ARB: - mov ___blue_glCore_glProgramUniform1ui64ARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord4fVertex4fvSUN +_bluegl_glTexCoord4fVertex4fvSUN: + mov ___blue_glCore_glTexCoord4fVertex4fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glReadInstrumentsSGIX -_bluegl_glReadInstrumentsSGIX: - mov ___blue_glCore_glReadInstrumentsSGIX@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord2fColor4ubVertex3fSUN +_bluegl_glTexCoord2fColor4ubVertex3fSUN: + mov ___blue_glCore_glTexCoord2fColor4ubVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib3dNV -_bluegl_glVertexAttrib3dNV: - mov ___blue_glCore_glVertexAttrib3dNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord2fColor4ubVertex3fvSUN +_bluegl_glTexCoord2fColor4ubVertex3fvSUN: + mov ___blue_glCore_glTexCoord2fColor4ubVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramParameter4dvNV -_bluegl_glProgramParameter4dvNV: - mov ___blue_glCore_glProgramParameter4dvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord2fColor3fVertex3fSUN +_bluegl_glTexCoord2fColor3fVertex3fSUN: + mov ___blue_glCore_glTexCoord2fColor3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glColorTableParameterivSGI -_bluegl_glColorTableParameterivSGI: - mov ___blue_glCore_glColorTableParameterivSGI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord2fColor3fVertex3fvSUN +_bluegl_glTexCoord2fColor3fVertex3fvSUN: + mov ___blue_glCore_glTexCoord2fColor3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniform1f -_bluegl_glUniform1f: - mov ___blue_glCore_glUniform1f@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord2fNormal3fVertex3fSUN +_bluegl_glTexCoord2fNormal3fVertex3fSUN: + mov ___blue_glCore_glTexCoord2fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexRenderbufferEXT -_bluegl_glMultiTexRenderbufferEXT: - mov ___blue_glCore_glMultiTexRenderbufferEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord2fNormal3fVertex3fvSUN +_bluegl_glTexCoord2fNormal3fVertex3fvSUN: + mov ___blue_glCore_glTexCoord2fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribI4uiEXT -_bluegl_glVertexAttribI4uiEXT: - mov ___blue_glCore_glVertexAttribI4uiEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN +_bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN: + mov ___blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetConvolutionParameterfv -_bluegl_glGetConvolutionParameterfv: - mov ___blue_glCore_glGetConvolutionParameterfv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN +_bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN: + mov ___blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord3sARB -_bluegl_glMultiTexCoord3sARB: - mov ___blue_glCore_glMultiTexCoord3sARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN +_bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN: + mov ___blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetTexParameterxvOES -_bluegl_glGetTexParameterxvOES: - mov ___blue_glCore_glGetTexParameterxvOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN +_bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN: + mov ___blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetNamedBufferParameteriv -_bluegl_glGetNamedBufferParameteriv: - mov ___blue_glCore_glGetNamedBufferParameteriv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeuiVertex3fSUN +_bluegl_glReplacementCodeuiVertex3fSUN: + mov ___blue_glCore_glReplacementCodeuiVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiDrawElementArrayAPPLE -_bluegl_glMultiDrawElementArrayAPPLE: - mov ___blue_glCore_glMultiDrawElementArrayAPPLE@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeuiVertex3fvSUN +_bluegl_glReplacementCodeuiVertex3fvSUN: + mov ___blue_glCore_glReplacementCodeuiVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glGetnConvolutionFilter -_bluegl_glGetnConvolutionFilter: - mov ___blue_glCore_glGetnConvolutionFilter@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeuiColor4ubVertex3fSUN +_bluegl_glReplacementCodeuiColor4ubVertex3fSUN: + mov ___blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glUniformMatrix2x3fv -_bluegl_glUniformMatrix2x3fv: - mov ___blue_glCore_glUniformMatrix2x3fv@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeuiColor4ubVertex3fvSUN +_bluegl_glReplacementCodeuiColor4ubVertex3fvSUN: + mov ___blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glBindBuffersRange -_bluegl_glBindBuffersRange: - mov ___blue_glCore_glBindBuffersRange@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeuiColor3fVertex3fSUN +_bluegl_glReplacementCodeuiColor3fVertex3fSUN: + mov ___blue_glCore_glReplacementCodeuiColor3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMakeImageHandleNonResidentNV -_bluegl_glMakeImageHandleNonResidentNV: - mov ___blue_glCore_glMakeImageHandleNonResidentNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeuiColor3fVertex3fvSUN +_bluegl_glReplacementCodeuiColor3fVertex3fvSUN: + mov ___blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFinalCombinerInputNV -_bluegl_glFinalCombinerInputNV: - mov ___blue_glCore_glFinalCombinerInputNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeuiNormal3fVertex3fSUN +_bluegl_glReplacementCodeuiNormal3fVertex3fSUN: + mov ___blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glFlush -_bluegl_glFlush: - mov ___blue_glCore_glFlush@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeuiNormal3fVertex3fvSUN +_bluegl_glReplacementCodeuiNormal3fVertex3fvSUN: + mov ___blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexArrayElementBuffer -_bluegl_glVertexArrayElementBuffer: - mov ___blue_glCore_glVertexArrayElementBuffer@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN +_bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN: + mov ___blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glProgramUniform4uiEXT -_bluegl_glProgramUniform4uiEXT: - mov ___blue_glCore_glProgramUniform4uiEXT@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN +_bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN: + mov ___blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttrib4ubvNV -_bluegl_glVertexAttrib4ubvNV: - mov ___blue_glCore_glVertexAttrib4ubvNV@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN +_bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN: + mov ___blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glSampleMapATI -_bluegl_glSampleMapATI: - mov ___blue_glCore_glSampleMapATI@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN +_bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN: + mov ___blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glMultiTexCoord1bOES -_bluegl_glMultiTexCoord1bOES: - mov ___blue_glCore_glMultiTexCoord1bOES@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN +_bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN: + mov ___blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glVertexAttribParameteriAMD -_bluegl_glVertexAttribParameteriAMD: - mov ___blue_glCore_glVertexAttribParameteriAMD@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN +_bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN: + mov ___blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glPointParameterfARB -_bluegl_glPointParameterfARB: - mov ___blue_glCore_glPointParameterfARB@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN +_bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN: + mov ___blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.private_extern _bluegl_glWindowPos2dMESA -_bluegl_glWindowPos2dMESA: - mov ___blue_glCore_glWindowPos2dMESA@GOTPCREL(%rip), %r11 +.private_extern _bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN +_bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN: + mov ___blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) diff --git a/libs/bluegl/src/BlueGLCoreLinuxAArch64Impl.S b/libs/bluegl/src/BlueGLCoreLinuxAArch64Impl.S index 9b508383580..8f592fa69d7 100644 --- a/libs/bluegl/src/BlueGLCoreLinuxAArch64Impl.S +++ b/libs/bluegl/src/BlueGLCoreLinuxAArch64Impl.S @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,121 +13,130 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - /********************************************************************************************** * Generated by bluegl/bluegl-gen.py * DO NOT EDIT **********************************************************************************************/ .align 2 - .global bluegl_glVertexAttrib4dARB - .type bluegl_glVertexAttrib4dARB, %function -bluegl_glVertexAttrib4dARB: - adrp x16, :got:__blue_glCore_glVertexAttrib4dARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4dARB] + .global bluegl_glCullFace + .type bluegl_glCullFace, %function +bluegl_glCullFace: + adrp x16, :got:__blue_glCore_glCullFace + ldr x16, [x16, #:got_lo12:__blue_glCore_glCullFace] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4dARB, .-bluegl_glVertexAttrib4dARB + .size bluegl_glCullFace, .-bluegl_glCullFace .align 2 - .global bluegl_glMultMatrixxOES - .type bluegl_glMultMatrixxOES, %function -bluegl_glMultMatrixxOES: - adrp x16, :got:__blue_glCore_glMultMatrixxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultMatrixxOES] + .global bluegl_glFrontFace + .type bluegl_glFrontFace, %function +bluegl_glFrontFace: + adrp x16, :got:__blue_glCore_glFrontFace + ldr x16, [x16, #:got_lo12:__blue_glCore_glFrontFace] ldr x16, [x16] br x16 - .size bluegl_glMultMatrixxOES, .-bluegl_glMultMatrixxOES + .size bluegl_glFrontFace, .-bluegl_glFrontFace .align 2 - .global bluegl_glProgramParameters4fvNV - .type bluegl_glProgramParameters4fvNV, %function -bluegl_glProgramParameters4fvNV: - adrp x16, :got:__blue_glCore_glProgramParameters4fvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramParameters4fvNV] + .global bluegl_glHint + .type bluegl_glHint, %function +bluegl_glHint: + adrp x16, :got:__blue_glCore_glHint + ldr x16, [x16, #:got_lo12:__blue_glCore_glHint] ldr x16, [x16] br x16 - .size bluegl_glProgramParameters4fvNV, .-bluegl_glProgramParameters4fvNV + .size bluegl_glHint, .-bluegl_glHint .align 2 - .global bluegl_glGenProgramPipelines - .type bluegl_glGenProgramPipelines, %function -bluegl_glGenProgramPipelines: - adrp x16, :got:__blue_glCore_glGenProgramPipelines - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenProgramPipelines] + .global bluegl_glLineWidth + .type bluegl_glLineWidth, %function +bluegl_glLineWidth: + adrp x16, :got:__blue_glCore_glLineWidth + ldr x16, [x16, #:got_lo12:__blue_glCore_glLineWidth] ldr x16, [x16] br x16 - .size bluegl_glGenProgramPipelines, .-bluegl_glGenProgramPipelines + .size bluegl_glLineWidth, .-bluegl_glLineWidth .align 2 - .global bluegl_glMultiTexCoordP3uiv - .type bluegl_glMultiTexCoordP3uiv, %function -bluegl_glMultiTexCoordP3uiv: - adrp x16, :got:__blue_glCore_glMultiTexCoordP3uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoordP3uiv] + .global bluegl_glPointSize + .type bluegl_glPointSize, %function +bluegl_glPointSize: + adrp x16, :got:__blue_glCore_glPointSize + ldr x16, [x16, #:got_lo12:__blue_glCore_glPointSize] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoordP3uiv, .-bluegl_glMultiTexCoordP3uiv + .size bluegl_glPointSize, .-bluegl_glPointSize .align 2 - .global bluegl_glSecondaryColor3usv - .type bluegl_glSecondaryColor3usv, %function -bluegl_glSecondaryColor3usv: - adrp x16, :got:__blue_glCore_glSecondaryColor3usv - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3usv] + .global bluegl_glPolygonMode + .type bluegl_glPolygonMode, %function +bluegl_glPolygonMode: + adrp x16, :got:__blue_glCore_glPolygonMode + ldr x16, [x16, #:got_lo12:__blue_glCore_glPolygonMode] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3usv, .-bluegl_glSecondaryColor3usv + .size bluegl_glPolygonMode, .-bluegl_glPolygonMode .align 2 - .global bluegl_glGetHistogramParameteriv - .type bluegl_glGetHistogramParameteriv, %function -bluegl_glGetHistogramParameteriv: - adrp x16, :got:__blue_glCore_glGetHistogramParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetHistogramParameteriv] + .global bluegl_glScissor + .type bluegl_glScissor, %function +bluegl_glScissor: + adrp x16, :got:__blue_glCore_glScissor + ldr x16, [x16, #:got_lo12:__blue_glCore_glScissor] ldr x16, [x16] br x16 - .size bluegl_glGetHistogramParameteriv, .-bluegl_glGetHistogramParameteriv + .size bluegl_glScissor, .-bluegl_glScissor .align 2 - .global bluegl_glRenderbufferStorageEXT - .type bluegl_glRenderbufferStorageEXT, %function -bluegl_glRenderbufferStorageEXT: - adrp x16, :got:__blue_glCore_glRenderbufferStorageEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glRenderbufferStorageEXT] + .global bluegl_glTexParameterf + .type bluegl_glTexParameterf, %function +bluegl_glTexParameterf: + adrp x16, :got:__blue_glCore_glTexParameterf + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameterf] ldr x16, [x16] br x16 - .size bluegl_glRenderbufferStorageEXT, .-bluegl_glRenderbufferStorageEXT + .size bluegl_glTexParameterf, .-bluegl_glTexParameterf .align 2 - .global bluegl_glGetPathParameterivNV - .type bluegl_glGetPathParameterivNV, %function -bluegl_glGetPathParameterivNV: - adrp x16, :got:__blue_glCore_glGetPathParameterivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathParameterivNV] + .global bluegl_glTexParameterfv + .type bluegl_glTexParameterfv, %function +bluegl_glTexParameterfv: + adrp x16, :got:__blue_glCore_glTexParameterfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameterfv] ldr x16, [x16] br x16 - .size bluegl_glGetPathParameterivNV, .-bluegl_glGetPathParameterivNV + .size bluegl_glTexParameterfv, .-bluegl_glTexParameterfv .align 2 - .global bluegl_glLineWidthxOES - .type bluegl_glLineWidthxOES, %function -bluegl_glLineWidthxOES: - adrp x16, :got:__blue_glCore_glLineWidthxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glLineWidthxOES] + .global bluegl_glTexParameteri + .type bluegl_glTexParameteri, %function +bluegl_glTexParameteri: + adrp x16, :got:__blue_glCore_glTexParameteri + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameteri] ldr x16, [x16] br x16 - .size bluegl_glLineWidthxOES, .-bluegl_glLineWidthxOES + .size bluegl_glTexParameteri, .-bluegl_glTexParameteri .align 2 - .global bluegl_glGlobalAlphaFactordSUN - .type bluegl_glGlobalAlphaFactordSUN, %function -bluegl_glGlobalAlphaFactordSUN: - adrp x16, :got:__blue_glCore_glGlobalAlphaFactordSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glGlobalAlphaFactordSUN] + .global bluegl_glTexParameteriv + .type bluegl_glTexParameteriv, %function +bluegl_glTexParameteriv: + adrp x16, :got:__blue_glCore_glTexParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameteriv] ldr x16, [x16] br x16 - .size bluegl_glGlobalAlphaFactordSUN, .-bluegl_glGlobalAlphaFactordSUN + .size bluegl_glTexParameteriv, .-bluegl_glTexParameteriv + + .align 2 + .global bluegl_glTexImage1D + .type bluegl_glTexImage1D, %function +bluegl_glTexImage1D: + adrp x16, :got:__blue_glCore_glTexImage1D + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexImage1D] + ldr x16, [x16] + br x16 + .size bluegl_glTexImage1D, .-bluegl_glTexImage1D .align 2 .global bluegl_glTexImage2D @@ -140,264 +149,104 @@ bluegl_glTexImage2D: .size bluegl_glTexImage2D, .-bluegl_glTexImage2D .align 2 - .global bluegl_glGlobalAlphaFactorfSUN - .type bluegl_glGlobalAlphaFactorfSUN, %function -bluegl_glGlobalAlphaFactorfSUN: - adrp x16, :got:__blue_glCore_glGlobalAlphaFactorfSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glGlobalAlphaFactorfSUN] + .global bluegl_glDrawBuffer + .type bluegl_glDrawBuffer, %function +bluegl_glDrawBuffer: + adrp x16, :got:__blue_glCore_glDrawBuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawBuffer] ldr x16, [x16] br x16 - .size bluegl_glGlobalAlphaFactorfSUN, .-bluegl_glGlobalAlphaFactorfSUN + .size bluegl_glDrawBuffer, .-bluegl_glDrawBuffer .align 2 - .global bluegl_glNormalP3uiv - .type bluegl_glNormalP3uiv, %function -bluegl_glNormalP3uiv: - adrp x16, :got:__blue_glCore_glNormalP3uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalP3uiv] + .global bluegl_glClear + .type bluegl_glClear, %function +bluegl_glClear: + adrp x16, :got:__blue_glCore_glClear + ldr x16, [x16, #:got_lo12:__blue_glCore_glClear] ldr x16, [x16] br x16 - .size bluegl_glNormalP3uiv, .-bluegl_glNormalP3uiv + .size bluegl_glClear, .-bluegl_glClear .align 2 - .global bluegl_glColor4fNormal3fVertex3fSUN - .type bluegl_glColor4fNormal3fVertex3fSUN, %function -bluegl_glColor4fNormal3fVertex3fSUN: - adrp x16, :got:__blue_glCore_glColor4fNormal3fVertex3fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4fNormal3fVertex3fSUN] + .global bluegl_glClearColor + .type bluegl_glClearColor, %function +bluegl_glClearColor: + adrp x16, :got:__blue_glCore_glClearColor + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearColor] ldr x16, [x16] br x16 - .size bluegl_glColor4fNormal3fVertex3fSUN, .-bluegl_glColor4fNormal3fVertex3fSUN + .size bluegl_glClearColor, .-bluegl_glClearColor .align 2 - .global bluegl_glMapVertexAttrib1fAPPLE - .type bluegl_glMapVertexAttrib1fAPPLE, %function -bluegl_glMapVertexAttrib1fAPPLE: - adrp x16, :got:__blue_glCore_glMapVertexAttrib1fAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glMapVertexAttrib1fAPPLE] + .global bluegl_glClearStencil + .type bluegl_glClearStencil, %function +bluegl_glClearStencil: + adrp x16, :got:__blue_glCore_glClearStencil + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearStencil] ldr x16, [x16] br x16 - .size bluegl_glMapVertexAttrib1fAPPLE, .-bluegl_glMapVertexAttrib1fAPPLE + .size bluegl_glClearStencil, .-bluegl_glClearStencil .align 2 - .global bluegl_glTexCoord2fNormal3fVertex3fvSUN - .type bluegl_glTexCoord2fNormal3fVertex3fvSUN, %function -bluegl_glTexCoord2fNormal3fVertex3fvSUN: - adrp x16, :got:__blue_glCore_glTexCoord2fNormal3fVertex3fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fNormal3fVertex3fvSUN] + .global bluegl_glClearDepth + .type bluegl_glClearDepth, %function +bluegl_glClearDepth: + adrp x16, :got:__blue_glCore_glClearDepth + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearDepth] ldr x16, [x16] br x16 - .size bluegl_glTexCoord2fNormal3fVertex3fvSUN, .-bluegl_glTexCoord2fNormal3fVertex3fvSUN + .size bluegl_glClearDepth, .-bluegl_glClearDepth .align 2 - .global bluegl_glVertexArrayVertexBuffers - .type bluegl_glVertexArrayVertexBuffers, %function -bluegl_glVertexArrayVertexBuffers: - adrp x16, :got:__blue_glCore_glVertexArrayVertexBuffers - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexBuffers] + .global bluegl_glStencilMask + .type bluegl_glStencilMask, %function +bluegl_glStencilMask: + adrp x16, :got:__blue_glCore_glStencilMask + ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilMask] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayVertexBuffers, .-bluegl_glVertexArrayVertexBuffers + .size bluegl_glStencilMask, .-bluegl_glStencilMask .align 2 - .global bluegl_glShaderSource - .type bluegl_glShaderSource, %function -bluegl_glShaderSource: - adrp x16, :got:__blue_glCore_glShaderSource - ldr x16, [x16, #:got_lo12:__blue_glCore_glShaderSource] + .global bluegl_glColorMask + .type bluegl_glColorMask, %function +bluegl_glColorMask: + adrp x16, :got:__blue_glCore_glColorMask + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorMask] ldr x16, [x16] br x16 - .size bluegl_glShaderSource, .-bluegl_glShaderSource + .size bluegl_glColorMask, .-bluegl_glColorMask .align 2 - .global bluegl_glConvolutionFilter1D - .type bluegl_glConvolutionFilter1D, %function -bluegl_glConvolutionFilter1D: - adrp x16, :got:__blue_glCore_glConvolutionFilter1D - ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionFilter1D] + .global bluegl_glDepthMask + .type bluegl_glDepthMask, %function +bluegl_glDepthMask: + adrp x16, :got:__blue_glCore_glDepthMask + ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthMask] ldr x16, [x16] br x16 - .size bluegl_glConvolutionFilter1D, .-bluegl_glConvolutionFilter1D + .size bluegl_glDepthMask, .-bluegl_glDepthMask .align 2 - .global bluegl_glIsFenceAPPLE - .type bluegl_glIsFenceAPPLE, %function -bluegl_glIsFenceAPPLE: - adrp x16, :got:__blue_glCore_glIsFenceAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsFenceAPPLE] + .global bluegl_glDisable + .type bluegl_glDisable, %function +bluegl_glDisable: + adrp x16, :got:__blue_glCore_glDisable + ldr x16, [x16, #:got_lo12:__blue_glCore_glDisable] ldr x16, [x16] br x16 - .size bluegl_glIsFenceAPPLE, .-bluegl_glIsFenceAPPLE + .size bluegl_glDisable, .-bluegl_glDisable .align 2 - .global bluegl_glWindowPos2s - .type bluegl_glWindowPos2s, %function -bluegl_glWindowPos2s: - adrp x16, :got:__blue_glCore_glWindowPos2s - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2s] - ldr x16, [x16] - br x16 - .size bluegl_glWindowPos2s, .-bluegl_glWindowPos2s - - .align 2 - .global bluegl_glEvaluateDepthValuesARB - .type bluegl_glEvaluateDepthValuesARB, %function -bluegl_glEvaluateDepthValuesARB: - adrp x16, :got:__blue_glCore_glEvaluateDepthValuesARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glEvaluateDepthValuesARB] - ldr x16, [x16] - br x16 - .size bluegl_glEvaluateDepthValuesARB, .-bluegl_glEvaluateDepthValuesARB - - .align 2 - .global bluegl_glInterpolatePathsNV - .type bluegl_glInterpolatePathsNV, %function -bluegl_glInterpolatePathsNV: - adrp x16, :got:__blue_glCore_glInterpolatePathsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glInterpolatePathsNV] - ldr x16, [x16] - br x16 - .size bluegl_glInterpolatePathsNV, .-bluegl_glInterpolatePathsNV - - .align 2 - .global bluegl_glTextureParameterivEXT - .type bluegl_glTextureParameterivEXT, %function -bluegl_glTextureParameterivEXT: - adrp x16, :got:__blue_glCore_glTextureParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameterivEXT] - ldr x16, [x16] - br x16 - .size bluegl_glTextureParameterivEXT, .-bluegl_glTextureParameterivEXT - - .align 2 - .global bluegl_glDeleteOcclusionQueriesNV - .type bluegl_glDeleteOcclusionQueriesNV, %function -bluegl_glDeleteOcclusionQueriesNV: - adrp x16, :got:__blue_glCore_glDeleteOcclusionQueriesNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteOcclusionQueriesNV] - ldr x16, [x16] - br x16 - .size bluegl_glDeleteOcclusionQueriesNV, .-bluegl_glDeleteOcclusionQueriesNV - - .align 2 - .global bluegl_glMakeTextureHandleResidentARB - .type bluegl_glMakeTextureHandleResidentARB, %function -bluegl_glMakeTextureHandleResidentARB: - adrp x16, :got:__blue_glCore_glMakeTextureHandleResidentARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeTextureHandleResidentARB] - ldr x16, [x16] - br x16 - .size bluegl_glMakeTextureHandleResidentARB, .-bluegl_glMakeTextureHandleResidentARB - - .align 2 - .global bluegl_glCopyImageSubDataNV - .type bluegl_glCopyImageSubDataNV, %function -bluegl_glCopyImageSubDataNV: - adrp x16, :got:__blue_glCore_glCopyImageSubDataNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyImageSubDataNV] - ldr x16, [x16] - br x16 - .size bluegl_glCopyImageSubDataNV, .-bluegl_glCopyImageSubDataNV - - .align 2 - .global bluegl_glVertexAttribL3d - .type bluegl_glVertexAttribL3d, %function -bluegl_glVertexAttribL3d: - adrp x16, :got:__blue_glCore_glVertexAttribL3d - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL3d] - ldr x16, [x16] - br x16 - .size bluegl_glVertexAttribL3d, .-bluegl_glVertexAttribL3d - - .align 2 - .global bluegl_glGetTextureSamplerHandleNV - .type bluegl_glGetTextureSamplerHandleNV, %function -bluegl_glGetTextureSamplerHandleNV: - adrp x16, :got:__blue_glCore_glGetTextureSamplerHandleNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureSamplerHandleNV] - ldr x16, [x16] - br x16 - .size bluegl_glGetTextureSamplerHandleNV, .-bluegl_glGetTextureSamplerHandleNV - - .align 2 - .global bluegl_glMakeTextureHandleResidentNV - .type bluegl_glMakeTextureHandleResidentNV, %function -bluegl_glMakeTextureHandleResidentNV: - adrp x16, :got:__blue_glCore_glMakeTextureHandleResidentNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeTextureHandleResidentNV] - ldr x16, [x16] - br x16 - .size bluegl_glMakeTextureHandleResidentNV, .-bluegl_glMakeTextureHandleResidentNV - - .align 2 - .global bluegl_glPolygonOffsetxOES - .type bluegl_glPolygonOffsetxOES, %function -bluegl_glPolygonOffsetxOES: - adrp x16, :got:__blue_glCore_glPolygonOffsetxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glPolygonOffsetxOES] - ldr x16, [x16] - br x16 - .size bluegl_glPolygonOffsetxOES, .-bluegl_glPolygonOffsetxOES - - .align 2 - .global bluegl_glUniformMatrix2fv - .type bluegl_glUniformMatrix2fv, %function -bluegl_glUniformMatrix2fv: - adrp x16, :got:__blue_glCore_glUniformMatrix2fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix2fv] - ldr x16, [x16] - br x16 - .size bluegl_glUniformMatrix2fv, .-bluegl_glUniformMatrix2fv - - .align 2 - .global bluegl_glMultiDrawElementsEXT - .type bluegl_glMultiDrawElementsEXT, %function -bluegl_glMultiDrawElementsEXT: - adrp x16, :got:__blue_glCore_glMultiDrawElementsEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawElementsEXT] - ldr x16, [x16] - br x16 - .size bluegl_glMultiDrawElementsEXT, .-bluegl_glMultiDrawElementsEXT - - .align 2 - .global bluegl_glVertexAttribI1uiv - .type bluegl_glVertexAttribI1uiv, %function -bluegl_glVertexAttribI1uiv: - adrp x16, :got:__blue_glCore_glVertexAttribI1uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI1uiv] - ldr x16, [x16] - br x16 - .size bluegl_glVertexAttribI1uiv, .-bluegl_glVertexAttribI1uiv - - .align 2 - .global bluegl_glPathCoordsNV - .type bluegl_glPathCoordsNV, %function -bluegl_glPathCoordsNV: - adrp x16, :got:__blue_glCore_glPathCoordsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathCoordsNV] - ldr x16, [x16] - br x16 - .size bluegl_glPathCoordsNV, .-bluegl_glPathCoordsNV - - .align 2 - .global bluegl_glVertexArrayVertexBindingDivisorEXT - .type bluegl_glVertexArrayVertexBindingDivisorEXT, %function -bluegl_glVertexArrayVertexBindingDivisorEXT: - adrp x16, :got:__blue_glCore_glVertexArrayVertexBindingDivisorEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexBindingDivisorEXT] - ldr x16, [x16] - br x16 - .size bluegl_glVertexArrayVertexBindingDivisorEXT, .-bluegl_glVertexArrayVertexBindingDivisorEXT - - .align 2 - .global bluegl_glVertexAttrib2dv - .type bluegl_glVertexAttrib2dv, %function -bluegl_glVertexAttrib2dv: - adrp x16, :got:__blue_glCore_glVertexAttrib2dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2dv] + .global bluegl_glEnable + .type bluegl_glEnable, %function +bluegl_glEnable: + adrp x16, :got:__blue_glCore_glEnable + ldr x16, [x16, #:got_lo12:__blue_glCore_glEnable] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2dv, .-bluegl_glVertexAttrib2dv + .size bluegl_glEnable, .-bluegl_glEnable .align 2 .global bluegl_glFinish @@ -410,3164 +259,2944 @@ bluegl_glFinish: .size bluegl_glFinish, .-bluegl_glFinish .align 2 - .global bluegl_glVertexAttribs2dvNV - .type bluegl_glVertexAttribs2dvNV, %function -bluegl_glVertexAttribs2dvNV: - adrp x16, :got:__blue_glCore_glVertexAttribs2dvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs2dvNV] - ldr x16, [x16] - br x16 - .size bluegl_glVertexAttribs2dvNV, .-bluegl_glVertexAttribs2dvNV - - .align 2 - .global bluegl_glVertexAttribI1ivEXT - .type bluegl_glVertexAttribI1ivEXT, %function -bluegl_glVertexAttribI1ivEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI1ivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI1ivEXT] - ldr x16, [x16] - br x16 - .size bluegl_glVertexAttribI1ivEXT, .-bluegl_glVertexAttribI1ivEXT - - .align 2 - .global bluegl_glVertexAttrib2sNV - .type bluegl_glVertexAttrib2sNV, %function -bluegl_glVertexAttrib2sNV: - adrp x16, :got:__blue_glCore_glVertexAttrib2sNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2sNV] - ldr x16, [x16] - br x16 - .size bluegl_glVertexAttrib2sNV, .-bluegl_glVertexAttrib2sNV - - .align 2 - .global bluegl_glMultiTexCoord1iv - .type bluegl_glMultiTexCoord1iv, %function -bluegl_glMultiTexCoord1iv: - adrp x16, :got:__blue_glCore_glMultiTexCoord1iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1iv] - ldr x16, [x16] - br x16 - .size bluegl_glMultiTexCoord1iv, .-bluegl_glMultiTexCoord1iv - - .align 2 - .global bluegl_glGetnMapiv - .type bluegl_glGetnMapiv, %function -bluegl_glGetnMapiv: - adrp x16, :got:__blue_glCore_glGetnMapiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnMapiv] - ldr x16, [x16] - br x16 - .size bluegl_glGetnMapiv, .-bluegl_glGetnMapiv - - .align 2 - .global bluegl_glCompressedTexSubImage1DARB - .type bluegl_glCompressedTexSubImage1DARB, %function -bluegl_glCompressedTexSubImage1DARB: - adrp x16, :got:__blue_glCore_glCompressedTexSubImage1DARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexSubImage1DARB] - ldr x16, [x16] - br x16 - .size bluegl_glCompressedTexSubImage1DARB, .-bluegl_glCompressedTexSubImage1DARB - - .align 2 - .global bluegl_glFogCoordPointerEXT - .type bluegl_glFogCoordPointerEXT, %function -bluegl_glFogCoordPointerEXT: - adrp x16, :got:__blue_glCore_glFogCoordPointerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordPointerEXT] - ldr x16, [x16] - br x16 - .size bluegl_glFogCoordPointerEXT, .-bluegl_glFogCoordPointerEXT - - .align 2 - .global bluegl_glCompressedMultiTexImage1DEXT - .type bluegl_glCompressedMultiTexImage1DEXT, %function -bluegl_glCompressedMultiTexImage1DEXT: - adrp x16, :got:__blue_glCore_glCompressedMultiTexImage1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedMultiTexImage1DEXT] - ldr x16, [x16] - br x16 - .size bluegl_glCompressedMultiTexImage1DEXT, .-bluegl_glCompressedMultiTexImage1DEXT - - .align 2 - .global bluegl_glVertexAttrib3d - .type bluegl_glVertexAttrib3d, %function -bluegl_glVertexAttrib3d: - adrp x16, :got:__blue_glCore_glVertexAttrib3d - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3d] - ldr x16, [x16] - br x16 - .size bluegl_glVertexAttrib3d, .-bluegl_glVertexAttrib3d - - .align 2 - .global bluegl_glLineWidth - .type bluegl_glLineWidth, %function -bluegl_glLineWidth: - adrp x16, :got:__blue_glCore_glLineWidth - ldr x16, [x16, #:got_lo12:__blue_glCore_glLineWidth] - ldr x16, [x16] - br x16 - .size bluegl_glLineWidth, .-bluegl_glLineWidth - - .align 2 - .global bluegl_glGetShaderiv - .type bluegl_glGetShaderiv, %function -bluegl_glGetShaderiv: - adrp x16, :got:__blue_glCore_glGetShaderiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetShaderiv] - ldr x16, [x16] - br x16 - .size bluegl_glGetShaderiv, .-bluegl_glGetShaderiv - - .align 2 - .global bluegl_glProgramUniform1dv - .type bluegl_glProgramUniform1dv, %function -bluegl_glProgramUniform1dv: - adrp x16, :got:__blue_glCore_glProgramUniform1dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1dv] - ldr x16, [x16] - br x16 - .size bluegl_glProgramUniform1dv, .-bluegl_glProgramUniform1dv - - .align 2 - .global bluegl_glGetVertexAttribLui64vNV - .type bluegl_glGetVertexAttribLui64vNV, %function -bluegl_glGetVertexAttribLui64vNV: - adrp x16, :got:__blue_glCore_glGetVertexAttribLui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribLui64vNV] - ldr x16, [x16] - br x16 - .size bluegl_glGetVertexAttribLui64vNV, .-bluegl_glGetVertexAttribLui64vNV - - .align 2 - .global bluegl_glProgramUniform1ui64vNV - .type bluegl_glProgramUniform1ui64vNV, %function -bluegl_glProgramUniform1ui64vNV: - adrp x16, :got:__blue_glCore_glProgramUniform1ui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1ui64vNV] - ldr x16, [x16] - br x16 - .size bluegl_glProgramUniform1ui64vNV, .-bluegl_glProgramUniform1ui64vNV - - .align 2 - .global bluegl_glGetRenderbufferParameteriv - .type bluegl_glGetRenderbufferParameteriv, %function -bluegl_glGetRenderbufferParameteriv: - adrp x16, :got:__blue_glCore_glGetRenderbufferParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetRenderbufferParameteriv] - ldr x16, [x16] - br x16 - .size bluegl_glGetRenderbufferParameteriv, .-bluegl_glGetRenderbufferParameteriv - - .align 2 - .global bluegl_glGetOcclusionQueryivNV - .type bluegl_glGetOcclusionQueryivNV, %function -bluegl_glGetOcclusionQueryivNV: - adrp x16, :got:__blue_glCore_glGetOcclusionQueryivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetOcclusionQueryivNV] - ldr x16, [x16] - br x16 - .size bluegl_glGetOcclusionQueryivNV, .-bluegl_glGetOcclusionQueryivNV - - .align 2 - .global bluegl_glUniformMatrix2x4dv - .type bluegl_glUniformMatrix2x4dv, %function -bluegl_glUniformMatrix2x4dv: - adrp x16, :got:__blue_glCore_glUniformMatrix2x4dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix2x4dv] - ldr x16, [x16] - br x16 - .size bluegl_glUniformMatrix2x4dv, .-bluegl_glUniformMatrix2x4dv - - .align 2 - .global bluegl_glGetVertexAttribPointervNV - .type bluegl_glGetVertexAttribPointervNV, %function -bluegl_glGetVertexAttribPointervNV: - adrp x16, :got:__blue_glCore_glGetVertexAttribPointervNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribPointervNV] - ldr x16, [x16] - br x16 - .size bluegl_glGetVertexAttribPointervNV, .-bluegl_glGetVertexAttribPointervNV - - .align 2 - .global bluegl_glUniform2fv - .type bluegl_glUniform2fv, %function -bluegl_glUniform2fv: - adrp x16, :got:__blue_glCore_glUniform2fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2fv] - ldr x16, [x16] - br x16 - .size bluegl_glUniform2fv, .-bluegl_glUniform2fv - - .align 2 - .global bluegl_glRasterPos2xOES - .type bluegl_glRasterPos2xOES, %function -bluegl_glRasterPos2xOES: - adrp x16, :got:__blue_glCore_glRasterPos2xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glRasterPos2xOES] - ldr x16, [x16] - br x16 - .size bluegl_glRasterPos2xOES, .-bluegl_glRasterPos2xOES - - .align 2 - .global bluegl_glGetCommandHeaderNV - .type bluegl_glGetCommandHeaderNV, %function -bluegl_glGetCommandHeaderNV: - adrp x16, :got:__blue_glCore_glGetCommandHeaderNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCommandHeaderNV] - ldr x16, [x16] - br x16 - .size bluegl_glGetCommandHeaderNV, .-bluegl_glGetCommandHeaderNV - - .align 2 - .global bluegl_glUniformSubroutinesuiv - .type bluegl_glUniformSubroutinesuiv, %function -bluegl_glUniformSubroutinesuiv: - adrp x16, :got:__blue_glCore_glUniformSubroutinesuiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformSubroutinesuiv] - ldr x16, [x16] - br x16 - .size bluegl_glUniformSubroutinesuiv, .-bluegl_glUniformSubroutinesuiv - - .align 2 - .global bluegl_glGetPixelTransformParameterivEXT - .type bluegl_glGetPixelTransformParameterivEXT, %function -bluegl_glGetPixelTransformParameterivEXT: - adrp x16, :got:__blue_glCore_glGetPixelTransformParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPixelTransformParameterivEXT] - ldr x16, [x16] - br x16 - .size bluegl_glGetPixelTransformParameterivEXT, .-bluegl_glGetPixelTransformParameterivEXT - - .align 2 - .global bluegl_glGetFragDataLocation - .type bluegl_glGetFragDataLocation, %function -bluegl_glGetFragDataLocation: - adrp x16, :got:__blue_glCore_glGetFragDataLocation - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFragDataLocation] - ldr x16, [x16] - br x16 - .size bluegl_glGetFragDataLocation, .-bluegl_glGetFragDataLocation - - .align 2 - .global bluegl_glTexCoord2fColor3fVertex3fSUN - .type bluegl_glTexCoord2fColor3fVertex3fSUN, %function -bluegl_glTexCoord2fColor3fVertex3fSUN: - adrp x16, :got:__blue_glCore_glTexCoord2fColor3fVertex3fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fColor3fVertex3fSUN] - ldr x16, [x16] - br x16 - .size bluegl_glTexCoord2fColor3fVertex3fSUN, .-bluegl_glTexCoord2fColor3fVertex3fSUN - - .align 2 - .global bluegl_glSecondaryColor3uiv - .type bluegl_glSecondaryColor3uiv, %function -bluegl_glSecondaryColor3uiv: - adrp x16, :got:__blue_glCore_glSecondaryColor3uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3uiv] - ldr x16, [x16] - br x16 - .size bluegl_glSecondaryColor3uiv, .-bluegl_glSecondaryColor3uiv - - .align 2 - .global bluegl_glEnableVertexArrayAttribEXT - .type bluegl_glEnableVertexArrayAttribEXT, %function -bluegl_glEnableVertexArrayAttribEXT: - adrp x16, :got:__blue_glCore_glEnableVertexArrayAttribEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableVertexArrayAttribEXT] - ldr x16, [x16] - br x16 - .size bluegl_glEnableVertexArrayAttribEXT, .-bluegl_glEnableVertexArrayAttribEXT - - .align 2 - .global bluegl_glPixelTexGenParameterfvSGIS - .type bluegl_glPixelTexGenParameterfvSGIS, %function -bluegl_glPixelTexGenParameterfvSGIS: - adrp x16, :got:__blue_glCore_glPixelTexGenParameterfvSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTexGenParameterfvSGIS] + .global bluegl_glFlush + .type bluegl_glFlush, %function +bluegl_glFlush: + adrp x16, :got:__blue_glCore_glFlush + ldr x16, [x16, #:got_lo12:__blue_glCore_glFlush] ldr x16, [x16] br x16 - .size bluegl_glPixelTexGenParameterfvSGIS, .-bluegl_glPixelTexGenParameterfvSGIS + .size bluegl_glFlush, .-bluegl_glFlush - .align 2 - .global bluegl_glProgramUniformMatrix3x4dvEXT - .type bluegl_glProgramUniformMatrix3x4dvEXT, %function -bluegl_glProgramUniformMatrix3x4dvEXT: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix3x4dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3x4dvEXT] + .align 2 + .global bluegl_glBlendFunc + .type bluegl_glBlendFunc, %function +bluegl_glBlendFunc: + adrp x16, :got:__blue_glCore_glBlendFunc + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFunc] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix3x4dvEXT, .-bluegl_glProgramUniformMatrix3x4dvEXT + .size bluegl_glBlendFunc, .-bluegl_glBlendFunc .align 2 - .global bluegl_glMultiTexCoord2fvARB - .type bluegl_glMultiTexCoord2fvARB, %function -bluegl_glMultiTexCoord2fvARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord2fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2fvARB] + .global bluegl_glLogicOp + .type bluegl_glLogicOp, %function +bluegl_glLogicOp: + adrp x16, :got:__blue_glCore_glLogicOp + ldr x16, [x16, #:got_lo12:__blue_glCore_glLogicOp] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2fvARB, .-bluegl_glMultiTexCoord2fvARB + .size bluegl_glLogicOp, .-bluegl_glLogicOp .align 2 - .global bluegl_glHistogram - .type bluegl_glHistogram, %function -bluegl_glHistogram: - adrp x16, :got:__blue_glCore_glHistogram - ldr x16, [x16, #:got_lo12:__blue_glCore_glHistogram] + .global bluegl_glStencilFunc + .type bluegl_glStencilFunc, %function +bluegl_glStencilFunc: + adrp x16, :got:__blue_glCore_glStencilFunc + ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilFunc] ldr x16, [x16] br x16 - .size bluegl_glHistogram, .-bluegl_glHistogram + .size bluegl_glStencilFunc, .-bluegl_glStencilFunc .align 2 - .global bluegl_glGetSynciv - .type bluegl_glGetSynciv, %function -bluegl_glGetSynciv: - adrp x16, :got:__blue_glCore_glGetSynciv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSynciv] + .global bluegl_glStencilOp + .type bluegl_glStencilOp, %function +bluegl_glStencilOp: + adrp x16, :got:__blue_glCore_glStencilOp + ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilOp] ldr x16, [x16] br x16 - .size bluegl_glGetSynciv, .-bluegl_glGetSynciv + .size bluegl_glStencilOp, .-bluegl_glStencilOp .align 2 - .global bluegl_glBitmapxOES - .type bluegl_glBitmapxOES, %function -bluegl_glBitmapxOES: - adrp x16, :got:__blue_glCore_glBitmapxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glBitmapxOES] + .global bluegl_glDepthFunc + .type bluegl_glDepthFunc, %function +bluegl_glDepthFunc: + adrp x16, :got:__blue_glCore_glDepthFunc + ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthFunc] ldr x16, [x16] br x16 - .size bluegl_glBitmapxOES, .-bluegl_glBitmapxOES + .size bluegl_glDepthFunc, .-bluegl_glDepthFunc .align 2 - .global bluegl_glGetnColorTable - .type bluegl_glGetnColorTable, %function -bluegl_glGetnColorTable: - adrp x16, :got:__blue_glCore_glGetnColorTable - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnColorTable] + .global bluegl_glPixelStoref + .type bluegl_glPixelStoref, %function +bluegl_glPixelStoref: + adrp x16, :got:__blue_glCore_glPixelStoref + ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelStoref] ldr x16, [x16] br x16 - .size bluegl_glGetnColorTable, .-bluegl_glGetnColorTable + .size bluegl_glPixelStoref, .-bluegl_glPixelStoref .align 2 - .global bluegl_glGenerateMultiTexMipmapEXT - .type bluegl_glGenerateMultiTexMipmapEXT, %function -bluegl_glGenerateMultiTexMipmapEXT: - adrp x16, :got:__blue_glCore_glGenerateMultiTexMipmapEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenerateMultiTexMipmapEXT] + .global bluegl_glPixelStorei + .type bluegl_glPixelStorei, %function +bluegl_glPixelStorei: + adrp x16, :got:__blue_glCore_glPixelStorei + ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelStorei] ldr x16, [x16] br x16 - .size bluegl_glGenerateMultiTexMipmapEXT, .-bluegl_glGenerateMultiTexMipmapEXT + .size bluegl_glPixelStorei, .-bluegl_glPixelStorei .align 2 - .global bluegl_glVertexStream4fvATI - .type bluegl_glVertexStream4fvATI, %function -bluegl_glVertexStream4fvATI: - adrp x16, :got:__blue_glCore_glVertexStream4fvATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream4fvATI] + .global bluegl_glReadBuffer + .type bluegl_glReadBuffer, %function +bluegl_glReadBuffer: + adrp x16, :got:__blue_glCore_glReadBuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glReadBuffer] ldr x16, [x16] br x16 - .size bluegl_glVertexStream4fvATI, .-bluegl_glVertexStream4fvATI + .size bluegl_glReadBuffer, .-bluegl_glReadBuffer .align 2 - .global bluegl_glSecondaryColorPointerEXT - .type bluegl_glSecondaryColorPointerEXT, %function -bluegl_glSecondaryColorPointerEXT: - adrp x16, :got:__blue_glCore_glSecondaryColorPointerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColorPointerEXT] + .global bluegl_glReadPixels + .type bluegl_glReadPixels, %function +bluegl_glReadPixels: + adrp x16, :got:__blue_glCore_glReadPixels + ldr x16, [x16, #:got_lo12:__blue_glCore_glReadPixels] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColorPointerEXT, .-bluegl_glSecondaryColorPointerEXT + .size bluegl_glReadPixels, .-bluegl_glReadPixels .align 2 - .global bluegl_glVertexAttribIPointerEXT - .type bluegl_glVertexAttribIPointerEXT, %function -bluegl_glVertexAttribIPointerEXT: - adrp x16, :got:__blue_glCore_glVertexAttribIPointerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribIPointerEXT] + .global bluegl_glGetBooleanv + .type bluegl_glGetBooleanv, %function +bluegl_glGetBooleanv: + adrp x16, :got:__blue_glCore_glGetBooleanv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBooleanv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribIPointerEXT, .-bluegl_glVertexAttribIPointerEXT + .size bluegl_glGetBooleanv, .-bluegl_glGetBooleanv .align 2 - .global bluegl_glEvalCoord2xvOES - .type bluegl_glEvalCoord2xvOES, %function -bluegl_glEvalCoord2xvOES: - adrp x16, :got:__blue_glCore_glEvalCoord2xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glEvalCoord2xvOES] + .global bluegl_glGetDoublev + .type bluegl_glGetDoublev, %function +bluegl_glGetDoublev: + adrp x16, :got:__blue_glCore_glGetDoublev + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetDoublev] ldr x16, [x16] br x16 - .size bluegl_glEvalCoord2xvOES, .-bluegl_glEvalCoord2xvOES + .size bluegl_glGetDoublev, .-bluegl_glGetDoublev .align 2 - .global bluegl_glDeleteFencesNV - .type bluegl_glDeleteFencesNV, %function -bluegl_glDeleteFencesNV: - adrp x16, :got:__blue_glCore_glDeleteFencesNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteFencesNV] + .global bluegl_glGetError + .type bluegl_glGetError, %function +bluegl_glGetError: + adrp x16, :got:__blue_glCore_glGetError + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetError] ldr x16, [x16] br x16 - .size bluegl_glDeleteFencesNV, .-bluegl_glDeleteFencesNV + .size bluegl_glGetError, .-bluegl_glGetError .align 2 - .global bluegl_glAlphaFragmentOp1ATI - .type bluegl_glAlphaFragmentOp1ATI, %function -bluegl_glAlphaFragmentOp1ATI: - adrp x16, :got:__blue_glCore_glAlphaFragmentOp1ATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glAlphaFragmentOp1ATI] + .global bluegl_glGetFloatv + .type bluegl_glGetFloatv, %function +bluegl_glGetFloatv: + adrp x16, :got:__blue_glCore_glGetFloatv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFloatv] ldr x16, [x16] br x16 - .size bluegl_glAlphaFragmentOp1ATI, .-bluegl_glAlphaFragmentOp1ATI + .size bluegl_glGetFloatv, .-bluegl_glGetFloatv .align 2 - .global bluegl_glGetActiveUniformName - .type bluegl_glGetActiveUniformName, %function -bluegl_glGetActiveUniformName: - adrp x16, :got:__blue_glCore_glGetActiveUniformName - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveUniformName] + .global bluegl_glGetIntegerv + .type bluegl_glGetIntegerv, %function +bluegl_glGetIntegerv: + adrp x16, :got:__blue_glCore_glGetIntegerv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetIntegerv] ldr x16, [x16] br x16 - .size bluegl_glGetActiveUniformName, .-bluegl_glGetActiveUniformName + .size bluegl_glGetIntegerv, .-bluegl_glGetIntegerv .align 2 - .global bluegl_glGetCompressedTextureSubImage - .type bluegl_glGetCompressedTextureSubImage, %function -bluegl_glGetCompressedTextureSubImage: - adrp x16, :got:__blue_glCore_glGetCompressedTextureSubImage - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCompressedTextureSubImage] + .global bluegl_glGetString + .type bluegl_glGetString, %function +bluegl_glGetString: + adrp x16, :got:__blue_glCore_glGetString + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetString] ldr x16, [x16] br x16 - .size bluegl_glGetCompressedTextureSubImage, .-bluegl_glGetCompressedTextureSubImage + .size bluegl_glGetString, .-bluegl_glGetString .align 2 - .global bluegl_glGetTextureParameterfvEXT - .type bluegl_glGetTextureParameterfvEXT, %function -bluegl_glGetTextureParameterfvEXT: - adrp x16, :got:__blue_glCore_glGetTextureParameterfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureParameterfvEXT] + .global bluegl_glGetTexImage + .type bluegl_glGetTexImage, %function +bluegl_glGetTexImage: + adrp x16, :got:__blue_glCore_glGetTexImage + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexImage] ldr x16, [x16] br x16 - .size bluegl_glGetTextureParameterfvEXT, .-bluegl_glGetTextureParameterfvEXT + .size bluegl_glGetTexImage, .-bluegl_glGetTexImage .align 2 - .global bluegl_glDeleteShader - .type bluegl_glDeleteShader, %function -bluegl_glDeleteShader: - adrp x16, :got:__blue_glCore_glDeleteShader - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteShader] + .global bluegl_glGetTexParameterfv + .type bluegl_glGetTexParameterfv, %function +bluegl_glGetTexParameterfv: + adrp x16, :got:__blue_glCore_glGetTexParameterfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexParameterfv] ldr x16, [x16] br x16 - .size bluegl_glDeleteShader, .-bluegl_glDeleteShader + .size bluegl_glGetTexParameterfv, .-bluegl_glGetTexParameterfv .align 2 - .global bluegl_glRenderbufferStorageMultisample - .type bluegl_glRenderbufferStorageMultisample, %function -bluegl_glRenderbufferStorageMultisample: - adrp x16, :got:__blue_glCore_glRenderbufferStorageMultisample - ldr x16, [x16, #:got_lo12:__blue_glCore_glRenderbufferStorageMultisample] + .global bluegl_glGetTexParameteriv + .type bluegl_glGetTexParameteriv, %function +bluegl_glGetTexParameteriv: + adrp x16, :got:__blue_glCore_glGetTexParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexParameteriv] ldr x16, [x16] br x16 - .size bluegl_glRenderbufferStorageMultisample, .-bluegl_glRenderbufferStorageMultisample + .size bluegl_glGetTexParameteriv, .-bluegl_glGetTexParameteriv .align 2 - .global bluegl_glTexCoord2fVertex3fSUN - .type bluegl_glTexCoord2fVertex3fSUN, %function -bluegl_glTexCoord2fVertex3fSUN: - adrp x16, :got:__blue_glCore_glTexCoord2fVertex3fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fVertex3fSUN] + .global bluegl_glGetTexLevelParameterfv + .type bluegl_glGetTexLevelParameterfv, %function +bluegl_glGetTexLevelParameterfv: + adrp x16, :got:__blue_glCore_glGetTexLevelParameterfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexLevelParameterfv] ldr x16, [x16] br x16 - .size bluegl_glTexCoord2fVertex3fSUN, .-bluegl_glTexCoord2fVertex3fSUN + .size bluegl_glGetTexLevelParameterfv, .-bluegl_glGetTexLevelParameterfv .align 2 - .global bluegl_glGetActiveSubroutineUniformName - .type bluegl_glGetActiveSubroutineUniformName, %function -bluegl_glGetActiveSubroutineUniformName: - adrp x16, :got:__blue_glCore_glGetActiveSubroutineUniformName - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveSubroutineUniformName] + .global bluegl_glGetTexLevelParameteriv + .type bluegl_glGetTexLevelParameteriv, %function +bluegl_glGetTexLevelParameteriv: + adrp x16, :got:__blue_glCore_glGetTexLevelParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexLevelParameteriv] ldr x16, [x16] br x16 - .size bluegl_glGetActiveSubroutineUniformName, .-bluegl_glGetActiveSubroutineUniformName + .size bluegl_glGetTexLevelParameteriv, .-bluegl_glGetTexLevelParameteriv .align 2 - .global bluegl_glGetVideoCaptureStreamfvNV - .type bluegl_glGetVideoCaptureStreamfvNV, %function -bluegl_glGetVideoCaptureStreamfvNV: - adrp x16, :got:__blue_glCore_glGetVideoCaptureStreamfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVideoCaptureStreamfvNV] + .global bluegl_glIsEnabled + .type bluegl_glIsEnabled, %function +bluegl_glIsEnabled: + adrp x16, :got:__blue_glCore_glIsEnabled + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsEnabled] ldr x16, [x16] br x16 - .size bluegl_glGetVideoCaptureStreamfvNV, .-bluegl_glGetVideoCaptureStreamfvNV + .size bluegl_glIsEnabled, .-bluegl_glIsEnabled .align 2 - .global bluegl_glInvalidateSubFramebuffer - .type bluegl_glInvalidateSubFramebuffer, %function -bluegl_glInvalidateSubFramebuffer: - adrp x16, :got:__blue_glCore_glInvalidateSubFramebuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glInvalidateSubFramebuffer] + .global bluegl_glDepthRange + .type bluegl_glDepthRange, %function +bluegl_glDepthRange: + adrp x16, :got:__blue_glCore_glDepthRange + ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthRange] ldr x16, [x16] br x16 - .size bluegl_glInvalidateSubFramebuffer, .-bluegl_glInvalidateSubFramebuffer + .size bluegl_glDepthRange, .-bluegl_glDepthRange .align 2 - .global bluegl_glIndexFormatNV - .type bluegl_glIndexFormatNV, %function -bluegl_glIndexFormatNV: - adrp x16, :got:__blue_glCore_glIndexFormatNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glIndexFormatNV] + .global bluegl_glViewport + .type bluegl_glViewport, %function +bluegl_glViewport: + adrp x16, :got:__blue_glCore_glViewport + ldr x16, [x16, #:got_lo12:__blue_glCore_glViewport] ldr x16, [x16] br x16 - .size bluegl_glIndexFormatNV, .-bluegl_glIndexFormatNV + .size bluegl_glViewport, .-bluegl_glViewport .align 2 - .global bluegl_glMultiTexEnvfvEXT - .type bluegl_glMultiTexEnvfvEXT, %function -bluegl_glMultiTexEnvfvEXT: - adrp x16, :got:__blue_glCore_glMultiTexEnvfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexEnvfvEXT] + .global bluegl_glDrawArrays + .type bluegl_glDrawArrays, %function +bluegl_glDrawArrays: + adrp x16, :got:__blue_glCore_glDrawArrays + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawArrays] ldr x16, [x16] br x16 - .size bluegl_glMultiTexEnvfvEXT, .-bluegl_glMultiTexEnvfvEXT + .size bluegl_glDrawArrays, .-bluegl_glDrawArrays .align 2 - .global bluegl_glUniformBufferEXT - .type bluegl_glUniformBufferEXT, %function -bluegl_glUniformBufferEXT: - adrp x16, :got:__blue_glCore_glUniformBufferEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformBufferEXT] + .global bluegl_glDrawElements + .type bluegl_glDrawElements, %function +bluegl_glDrawElements: + adrp x16, :got:__blue_glCore_glDrawElements + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElements] ldr x16, [x16] br x16 - .size bluegl_glUniformBufferEXT, .-bluegl_glUniformBufferEXT + .size bluegl_glDrawElements, .-bluegl_glDrawElements .align 2 - .global bluegl_glNamedProgramLocalParametersI4uivEXT - .type bluegl_glNamedProgramLocalParametersI4uivEXT, %function -bluegl_glNamedProgramLocalParametersI4uivEXT: - adrp x16, :got:__blue_glCore_glNamedProgramLocalParametersI4uivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParametersI4uivEXT] + .global bluegl_glGetPointerv + .type bluegl_glGetPointerv, %function +bluegl_glGetPointerv: + adrp x16, :got:__blue_glCore_glGetPointerv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPointerv] ldr x16, [x16] br x16 - .size bluegl_glNamedProgramLocalParametersI4uivEXT, .-bluegl_glNamedProgramLocalParametersI4uivEXT + .size bluegl_glGetPointerv, .-bluegl_glGetPointerv .align 2 - .global bluegl_glWeightPathsNV - .type bluegl_glWeightPathsNV, %function -bluegl_glWeightPathsNV: - adrp x16, :got:__blue_glCore_glWeightPathsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightPathsNV] + .global bluegl_glPolygonOffset + .type bluegl_glPolygonOffset, %function +bluegl_glPolygonOffset: + adrp x16, :got:__blue_glCore_glPolygonOffset + ldr x16, [x16, #:got_lo12:__blue_glCore_glPolygonOffset] ldr x16, [x16] br x16 - .size bluegl_glWeightPathsNV, .-bluegl_glWeightPathsNV + .size bluegl_glPolygonOffset, .-bluegl_glPolygonOffset .align 2 - .global bluegl_glGetnHistogram - .type bluegl_glGetnHistogram, %function -bluegl_glGetnHistogram: - adrp x16, :got:__blue_glCore_glGetnHistogram - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnHistogram] + .global bluegl_glCopyTexImage1D + .type bluegl_glCopyTexImage1D, %function +bluegl_glCopyTexImage1D: + adrp x16, :got:__blue_glCore_glCopyTexImage1D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexImage1D] ldr x16, [x16] br x16 - .size bluegl_glGetnHistogram, .-bluegl_glGetnHistogram + .size bluegl_glCopyTexImage1D, .-bluegl_glCopyTexImage1D .align 2 - .global bluegl_glTexCoord1bOES - .type bluegl_glTexCoord1bOES, %function -bluegl_glTexCoord1bOES: - adrp x16, :got:__blue_glCore_glTexCoord1bOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord1bOES] + .global bluegl_glCopyTexImage2D + .type bluegl_glCopyTexImage2D, %function +bluegl_glCopyTexImage2D: + adrp x16, :got:__blue_glCore_glCopyTexImage2D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexImage2D] ldr x16, [x16] br x16 - .size bluegl_glTexCoord1bOES, .-bluegl_glTexCoord1bOES + .size bluegl_glCopyTexImage2D, .-bluegl_glCopyTexImage2D .align 2 - .global bluegl_glSetFragmentShaderConstantATI - .type bluegl_glSetFragmentShaderConstantATI, %function -bluegl_glSetFragmentShaderConstantATI: - adrp x16, :got:__blue_glCore_glSetFragmentShaderConstantATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glSetFragmentShaderConstantATI] + .global bluegl_glCopyTexSubImage1D + .type bluegl_glCopyTexSubImage1D, %function +bluegl_glCopyTexSubImage1D: + adrp x16, :got:__blue_glCore_glCopyTexSubImage1D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexSubImage1D] ldr x16, [x16] br x16 - .size bluegl_glSetFragmentShaderConstantATI, .-bluegl_glSetFragmentShaderConstantATI + .size bluegl_glCopyTexSubImage1D, .-bluegl_glCopyTexSubImage1D .align 2 - .global bluegl_glRasterPos3xvOES - .type bluegl_glRasterPos3xvOES, %function -bluegl_glRasterPos3xvOES: - adrp x16, :got:__blue_glCore_glRasterPos3xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glRasterPos3xvOES] + .global bluegl_glCopyTexSubImage2D + .type bluegl_glCopyTexSubImage2D, %function +bluegl_glCopyTexSubImage2D: + adrp x16, :got:__blue_glCore_glCopyTexSubImage2D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexSubImage2D] ldr x16, [x16] br x16 - .size bluegl_glRasterPos3xvOES, .-bluegl_glRasterPos3xvOES + .size bluegl_glCopyTexSubImage2D, .-bluegl_glCopyTexSubImage2D .align 2 - .global bluegl_glCopyConvolutionFilter1DEXT - .type bluegl_glCopyConvolutionFilter1DEXT, %function -bluegl_glCopyConvolutionFilter1DEXT: - adrp x16, :got:__blue_glCore_glCopyConvolutionFilter1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyConvolutionFilter1DEXT] + .global bluegl_glTexSubImage1D + .type bluegl_glTexSubImage1D, %function +bluegl_glTexSubImage1D: + adrp x16, :got:__blue_glCore_glTexSubImage1D + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexSubImage1D] ldr x16, [x16] br x16 - .size bluegl_glCopyConvolutionFilter1DEXT, .-bluegl_glCopyConvolutionFilter1DEXT + .size bluegl_glTexSubImage1D, .-bluegl_glTexSubImage1D .align 2 - .global bluegl_glArrayElementEXT - .type bluegl_glArrayElementEXT, %function -bluegl_glArrayElementEXT: - adrp x16, :got:__blue_glCore_glArrayElementEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glArrayElementEXT] + .global bluegl_glTexSubImage2D + .type bluegl_glTexSubImage2D, %function +bluegl_glTexSubImage2D: + adrp x16, :got:__blue_glCore_glTexSubImage2D + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexSubImage2D] ldr x16, [x16] br x16 - .size bluegl_glArrayElementEXT, .-bluegl_glArrayElementEXT + .size bluegl_glTexSubImage2D, .-bluegl_glTexSubImage2D .align 2 - .global bluegl_glCopyTextureImage2DEXT - .type bluegl_glCopyTextureImage2DEXT, %function -bluegl_glCopyTextureImage2DEXT: - adrp x16, :got:__blue_glCore_glCopyTextureImage2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTextureImage2DEXT] + .global bluegl_glBindTexture + .type bluegl_glBindTexture, %function +bluegl_glBindTexture: + adrp x16, :got:__blue_glCore_glBindTexture + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindTexture] ldr x16, [x16] br x16 - .size bluegl_glCopyTextureImage2DEXT, .-bluegl_glCopyTextureImage2DEXT + .size bluegl_glBindTexture, .-bluegl_glBindTexture .align 2 - .global bluegl_glNamedProgramLocalParameterI4uivEXT - .type bluegl_glNamedProgramLocalParameterI4uivEXT, %function -bluegl_glNamedProgramLocalParameterI4uivEXT: - adrp x16, :got:__blue_glCore_glNamedProgramLocalParameterI4uivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParameterI4uivEXT] + .global bluegl_glDeleteTextures + .type bluegl_glDeleteTextures, %function +bluegl_glDeleteTextures: + adrp x16, :got:__blue_glCore_glDeleteTextures + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteTextures] ldr x16, [x16] br x16 - .size bluegl_glNamedProgramLocalParameterI4uivEXT, .-bluegl_glNamedProgramLocalParameterI4uivEXT + .size bluegl_glDeleteTextures, .-bluegl_glDeleteTextures .align 2 - .global bluegl_glMultiDrawElementsIndirectBindlessNV - .type bluegl_glMultiDrawElementsIndirectBindlessNV, %function -bluegl_glMultiDrawElementsIndirectBindlessNV: - adrp x16, :got:__blue_glCore_glMultiDrawElementsIndirectBindlessNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawElementsIndirectBindlessNV] + .global bluegl_glGenTextures + .type bluegl_glGenTextures, %function +bluegl_glGenTextures: + adrp x16, :got:__blue_glCore_glGenTextures + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenTextures] ldr x16, [x16] br x16 - .size bluegl_glMultiDrawElementsIndirectBindlessNV, .-bluegl_glMultiDrawElementsIndirectBindlessNV + .size bluegl_glGenTextures, .-bluegl_glGenTextures .align 2 - .global bluegl_glClearColorIuiEXT - .type bluegl_glClearColorIuiEXT, %function -bluegl_glClearColorIuiEXT: - adrp x16, :got:__blue_glCore_glClearColorIuiEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearColorIuiEXT] + .global bluegl_glIsTexture + .type bluegl_glIsTexture, %function +bluegl_glIsTexture: + adrp x16, :got:__blue_glCore_glIsTexture + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsTexture] ldr x16, [x16] br x16 - .size bluegl_glClearColorIuiEXT, .-bluegl_glClearColorIuiEXT + .size bluegl_glIsTexture, .-bluegl_glIsTexture .align 2 - .global bluegl_glMultiTexParameterfEXT - .type bluegl_glMultiTexParameterfEXT, %function -bluegl_glMultiTexParameterfEXT: - adrp x16, :got:__blue_glCore_glMultiTexParameterfEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexParameterfEXT] + .global bluegl_glDrawRangeElements + .type bluegl_glDrawRangeElements, %function +bluegl_glDrawRangeElements: + adrp x16, :got:__blue_glCore_glDrawRangeElements + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawRangeElements] ldr x16, [x16] br x16 - .size bluegl_glMultiTexParameterfEXT, .-bluegl_glMultiTexParameterfEXT + .size bluegl_glDrawRangeElements, .-bluegl_glDrawRangeElements .align 2 - .global bluegl_glVertexArrayVertexAttribIFormatEXT - .type bluegl_glVertexArrayVertexAttribIFormatEXT, %function -bluegl_glVertexArrayVertexAttribIFormatEXT: - adrp x16, :got:__blue_glCore_glVertexArrayVertexAttribIFormatEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexAttribIFormatEXT] + .global bluegl_glTexImage3D + .type bluegl_glTexImage3D, %function +bluegl_glTexImage3D: + adrp x16, :got:__blue_glCore_glTexImage3D + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexImage3D] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayVertexAttribIFormatEXT, .-bluegl_glVertexArrayVertexAttribIFormatEXT + .size bluegl_glTexImage3D, .-bluegl_glTexImage3D .align 2 - .global bluegl_glVertexAttrib1sv - .type bluegl_glVertexAttrib1sv, %function -bluegl_glVertexAttrib1sv: - adrp x16, :got:__blue_glCore_glVertexAttrib1sv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1sv] + .global bluegl_glTexSubImage3D + .type bluegl_glTexSubImage3D, %function +bluegl_glTexSubImage3D: + adrp x16, :got:__blue_glCore_glTexSubImage3D + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexSubImage3D] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1sv, .-bluegl_glVertexAttrib1sv + .size bluegl_glTexSubImage3D, .-bluegl_glTexSubImage3D .align 2 - .global bluegl_glVertexStream2dvATI - .type bluegl_glVertexStream2dvATI, %function -bluegl_glVertexStream2dvATI: - adrp x16, :got:__blue_glCore_glVertexStream2dvATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream2dvATI] + .global bluegl_glCopyTexSubImage3D + .type bluegl_glCopyTexSubImage3D, %function +bluegl_glCopyTexSubImage3D: + adrp x16, :got:__blue_glCore_glCopyTexSubImage3D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexSubImage3D] ldr x16, [x16] br x16 - .size bluegl_glVertexStream2dvATI, .-bluegl_glVertexStream2dvATI + .size bluegl_glCopyTexSubImage3D, .-bluegl_glCopyTexSubImage3D .align 2 - .global bluegl_glUniform4iARB - .type bluegl_glUniform4iARB, %function -bluegl_glUniform4iARB: - adrp x16, :got:__blue_glCore_glUniform4iARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4iARB] + .global bluegl_glActiveTexture + .type bluegl_glActiveTexture, %function +bluegl_glActiveTexture: + adrp x16, :got:__blue_glCore_glActiveTexture + ldr x16, [x16, #:got_lo12:__blue_glCore_glActiveTexture] ldr x16, [x16] br x16 - .size bluegl_glUniform4iARB, .-bluegl_glUniform4iARB + .size bluegl_glActiveTexture, .-bluegl_glActiveTexture .align 2 - .global bluegl_glVertexAttribs4svNV - .type bluegl_glVertexAttribs4svNV, %function -bluegl_glVertexAttribs4svNV: - adrp x16, :got:__blue_glCore_glVertexAttribs4svNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs4svNV] + .global bluegl_glSampleCoverage + .type bluegl_glSampleCoverage, %function +bluegl_glSampleCoverage: + adrp x16, :got:__blue_glCore_glSampleCoverage + ldr x16, [x16, #:got_lo12:__blue_glCore_glSampleCoverage] + ldr x16, [x16] + br x16 + .size bluegl_glSampleCoverage, .-bluegl_glSampleCoverage + + .align 2 + .global bluegl_glCompressedTexImage3D + .type bluegl_glCompressedTexImage3D, %function +bluegl_glCompressedTexImage3D: + adrp x16, :got:__blue_glCore_glCompressedTexImage3D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexImage3D] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribs4svNV, .-bluegl_glVertexAttribs4svNV + .size bluegl_glCompressedTexImage3D, .-bluegl_glCompressedTexImage3D .align 2 - .global bluegl_glProgramUniformMatrix3x2dvEXT - .type bluegl_glProgramUniformMatrix3x2dvEXT, %function -bluegl_glProgramUniformMatrix3x2dvEXT: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix3x2dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3x2dvEXT] + .global bluegl_glCompressedTexImage2D + .type bluegl_glCompressedTexImage2D, %function +bluegl_glCompressedTexImage2D: + adrp x16, :got:__blue_glCore_glCompressedTexImage2D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexImage2D] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix3x2dvEXT, .-bluegl_glProgramUniformMatrix3x2dvEXT + .size bluegl_glCompressedTexImage2D, .-bluegl_glCompressedTexImage2D .align 2 - .global bluegl_glProgramUniform1ui - .type bluegl_glProgramUniform1ui, %function -bluegl_glProgramUniform1ui: - adrp x16, :got:__blue_glCore_glProgramUniform1ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1ui] + .global bluegl_glCompressedTexImage1D + .type bluegl_glCompressedTexImage1D, %function +bluegl_glCompressedTexImage1D: + adrp x16, :got:__blue_glCore_glCompressedTexImage1D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexImage1D] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1ui, .-bluegl_glProgramUniform1ui + .size bluegl_glCompressedTexImage1D, .-bluegl_glCompressedTexImage1D .align 2 - .global bluegl_glVertexAttribIFormatNV - .type bluegl_glVertexAttribIFormatNV, %function -bluegl_glVertexAttribIFormatNV: - adrp x16, :got:__blue_glCore_glVertexAttribIFormatNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribIFormatNV] + .global bluegl_glCompressedTexSubImage3D + .type bluegl_glCompressedTexSubImage3D, %function +bluegl_glCompressedTexSubImage3D: + adrp x16, :got:__blue_glCore_glCompressedTexSubImage3D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexSubImage3D] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribIFormatNV, .-bluegl_glVertexAttribIFormatNV + .size bluegl_glCompressedTexSubImage3D, .-bluegl_glCompressedTexSubImage3D .align 2 - .global bluegl_glFragmentLightModelfSGIX - .type bluegl_glFragmentLightModelfSGIX, %function -bluegl_glFragmentLightModelfSGIX: - adrp x16, :got:__blue_glCore_glFragmentLightModelfSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentLightModelfSGIX] + .global bluegl_glCompressedTexSubImage2D + .type bluegl_glCompressedTexSubImage2D, %function +bluegl_glCompressedTexSubImage2D: + adrp x16, :got:__blue_glCore_glCompressedTexSubImage2D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexSubImage2D] ldr x16, [x16] br x16 - .size bluegl_glFragmentLightModelfSGIX, .-bluegl_glFragmentLightModelfSGIX + .size bluegl_glCompressedTexSubImage2D, .-bluegl_glCompressedTexSubImage2D .align 2 - .global bluegl_glGetActiveSubroutineName - .type bluegl_glGetActiveSubroutineName, %function -bluegl_glGetActiveSubroutineName: - adrp x16, :got:__blue_glCore_glGetActiveSubroutineName - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveSubroutineName] + .global bluegl_glCompressedTexSubImage1D + .type bluegl_glCompressedTexSubImage1D, %function +bluegl_glCompressedTexSubImage1D: + adrp x16, :got:__blue_glCore_glCompressedTexSubImage1D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexSubImage1D] ldr x16, [x16] br x16 - .size bluegl_glGetActiveSubroutineName, .-bluegl_glGetActiveSubroutineName + .size bluegl_glCompressedTexSubImage1D, .-bluegl_glCompressedTexSubImage1D .align 2 - .global bluegl_glConvolutionParameteri - .type bluegl_glConvolutionParameteri, %function -bluegl_glConvolutionParameteri: - adrp x16, :got:__blue_glCore_glConvolutionParameteri - ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameteri] + .global bluegl_glGetCompressedTexImage + .type bluegl_glGetCompressedTexImage, %function +bluegl_glGetCompressedTexImage: + adrp x16, :got:__blue_glCore_glGetCompressedTexImage + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCompressedTexImage] ldr x16, [x16] br x16 - .size bluegl_glConvolutionParameteri, .-bluegl_glConvolutionParameteri + .size bluegl_glGetCompressedTexImage, .-bluegl_glGetCompressedTexImage .align 2 - .global bluegl_glMultiTexCoord4f - .type bluegl_glMultiTexCoord4f, %function -bluegl_glMultiTexCoord4f: - adrp x16, :got:__blue_glCore_glMultiTexCoord4f - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4f] + .global bluegl_glBlendFuncSeparate + .type bluegl_glBlendFuncSeparate, %function +bluegl_glBlendFuncSeparate: + adrp x16, :got:__blue_glCore_glBlendFuncSeparate + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFuncSeparate] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4f, .-bluegl_glMultiTexCoord4f + .size bluegl_glBlendFuncSeparate, .-bluegl_glBlendFuncSeparate .align 2 - .global bluegl_glTexCoord1xvOES - .type bluegl_glTexCoord1xvOES, %function -bluegl_glTexCoord1xvOES: - adrp x16, :got:__blue_glCore_glTexCoord1xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord1xvOES] + .global bluegl_glMultiDrawArrays + .type bluegl_glMultiDrawArrays, %function +bluegl_glMultiDrawArrays: + adrp x16, :got:__blue_glCore_glMultiDrawArrays + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawArrays] ldr x16, [x16] br x16 - .size bluegl_glTexCoord1xvOES, .-bluegl_glTexCoord1xvOES + .size bluegl_glMultiDrawArrays, .-bluegl_glMultiDrawArrays .align 2 - .global bluegl_glIsTransformFeedback - .type bluegl_glIsTransformFeedback, %function -bluegl_glIsTransformFeedback: - adrp x16, :got:__blue_glCore_glIsTransformFeedback - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsTransformFeedback] + .global bluegl_glMultiDrawElements + .type bluegl_glMultiDrawElements, %function +bluegl_glMultiDrawElements: + adrp x16, :got:__blue_glCore_glMultiDrawElements + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawElements] ldr x16, [x16] br x16 - .size bluegl_glIsTransformFeedback, .-bluegl_glIsTransformFeedback + .size bluegl_glMultiDrawElements, .-bluegl_glMultiDrawElements .align 2 - .global bluegl_glBlendBarrierKHR - .type bluegl_glBlendBarrierKHR, %function -bluegl_glBlendBarrierKHR: - adrp x16, :got:__blue_glCore_glBlendBarrierKHR - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendBarrierKHR] + .global bluegl_glPointParameterf + .type bluegl_glPointParameterf, %function +bluegl_glPointParameterf: + adrp x16, :got:__blue_glCore_glPointParameterf + ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterf] ldr x16, [x16] br x16 - .size bluegl_glBlendBarrierKHR, .-bluegl_glBlendBarrierKHR + .size bluegl_glPointParameterf, .-bluegl_glPointParameterf .align 2 - .global bluegl_glBindBufferRangeEXT - .type bluegl_glBindBufferRangeEXT, %function -bluegl_glBindBufferRangeEXT: - adrp x16, :got:__blue_glCore_glBindBufferRangeEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBufferRangeEXT] + .global bluegl_glPointParameterfv + .type bluegl_glPointParameterfv, %function +bluegl_glPointParameterfv: + adrp x16, :got:__blue_glCore_glPointParameterfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterfv] ldr x16, [x16] br x16 - .size bluegl_glBindBufferRangeEXT, .-bluegl_glBindBufferRangeEXT + .size bluegl_glPointParameterfv, .-bluegl_glPointParameterfv .align 2 - .global bluegl_glPathColorGenNV - .type bluegl_glPathColorGenNV, %function -bluegl_glPathColorGenNV: - adrp x16, :got:__blue_glCore_glPathColorGenNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathColorGenNV] + .global bluegl_glPointParameteri + .type bluegl_glPointParameteri, %function +bluegl_glPointParameteri: + adrp x16, :got:__blue_glCore_glPointParameteri + ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameteri] ldr x16, [x16] br x16 - .size bluegl_glPathColorGenNV, .-bluegl_glPathColorGenNV + .size bluegl_glPointParameteri, .-bluegl_glPointParameteri .align 2 - .global bluegl_glEndQuery - .type bluegl_glEndQuery, %function -bluegl_glEndQuery: - adrp x16, :got:__blue_glCore_glEndQuery - ldr x16, [x16, #:got_lo12:__blue_glCore_glEndQuery] + .global bluegl_glPointParameteriv + .type bluegl_glPointParameteriv, %function +bluegl_glPointParameteriv: + adrp x16, :got:__blue_glCore_glPointParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameteriv] ldr x16, [x16] br x16 - .size bluegl_glEndQuery, .-bluegl_glEndQuery + .size bluegl_glPointParameteriv, .-bluegl_glPointParameteriv .align 2 - .global bluegl_glUniformMatrix2x4fv - .type bluegl_glUniformMatrix2x4fv, %function -bluegl_glUniformMatrix2x4fv: - adrp x16, :got:__blue_glCore_glUniformMatrix2x4fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix2x4fv] + .global bluegl_glBlendColor + .type bluegl_glBlendColor, %function +bluegl_glBlendColor: + adrp x16, :got:__blue_glCore_glBlendColor + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendColor] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix2x4fv, .-bluegl_glUniformMatrix2x4fv + .size bluegl_glBlendColor, .-bluegl_glBlendColor .align 2 - .global bluegl_glGenRenderbuffers - .type bluegl_glGenRenderbuffers, %function -bluegl_glGenRenderbuffers: - adrp x16, :got:__blue_glCore_glGenRenderbuffers - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenRenderbuffers] + .global bluegl_glBlendEquation + .type bluegl_glBlendEquation, %function +bluegl_glBlendEquation: + adrp x16, :got:__blue_glCore_glBlendEquation + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquation] ldr x16, [x16] br x16 - .size bluegl_glGenRenderbuffers, .-bluegl_glGenRenderbuffers + .size bluegl_glBlendEquation, .-bluegl_glBlendEquation .align 2 - .global bluegl_glShaderOp2EXT - .type bluegl_glShaderOp2EXT, %function -bluegl_glShaderOp2EXT: - adrp x16, :got:__blue_glCore_glShaderOp2EXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glShaderOp2EXT] + .global bluegl_glGenQueries + .type bluegl_glGenQueries, %function +bluegl_glGenQueries: + adrp x16, :got:__blue_glCore_glGenQueries + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenQueries] ldr x16, [x16] br x16 - .size bluegl_glShaderOp2EXT, .-bluegl_glShaderOp2EXT + .size bluegl_glGenQueries, .-bluegl_glGenQueries .align 2 - .global bluegl_glDrawTransformFeedback - .type bluegl_glDrawTransformFeedback, %function -bluegl_glDrawTransformFeedback: - adrp x16, :got:__blue_glCore_glDrawTransformFeedback - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawTransformFeedback] + .global bluegl_glDeleteQueries + .type bluegl_glDeleteQueries, %function +bluegl_glDeleteQueries: + adrp x16, :got:__blue_glCore_glDeleteQueries + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteQueries] ldr x16, [x16] br x16 - .size bluegl_glDrawTransformFeedback, .-bluegl_glDrawTransformFeedback + .size bluegl_glDeleteQueries, .-bluegl_glDeleteQueries .align 2 - .global bluegl_glProgramUniform3ui64vNV - .type bluegl_glProgramUniform3ui64vNV, %function -bluegl_glProgramUniform3ui64vNV: - adrp x16, :got:__blue_glCore_glProgramUniform3ui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3ui64vNV] + .global bluegl_glIsQuery + .type bluegl_glIsQuery, %function +bluegl_glIsQuery: + adrp x16, :got:__blue_glCore_glIsQuery + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsQuery] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3ui64vNV, .-bluegl_glProgramUniform3ui64vNV + .size bluegl_glIsQuery, .-bluegl_glIsQuery .align 2 - .global bluegl_glNamedBufferStorage - .type bluegl_glNamedBufferStorage, %function -bluegl_glNamedBufferStorage: - adrp x16, :got:__blue_glCore_glNamedBufferStorage - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedBufferStorage] + .global bluegl_glBeginQuery + .type bluegl_glBeginQuery, %function +bluegl_glBeginQuery: + adrp x16, :got:__blue_glCore_glBeginQuery + ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginQuery] ldr x16, [x16] br x16 - .size bluegl_glNamedBufferStorage, .-bluegl_glNamedBufferStorage + .size bluegl_glBeginQuery, .-bluegl_glBeginQuery .align 2 - .global bluegl_glOrthoxOES - .type bluegl_glOrthoxOES, %function -bluegl_glOrthoxOES: - adrp x16, :got:__blue_glCore_glOrthoxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glOrthoxOES] + .global bluegl_glEndQuery + .type bluegl_glEndQuery, %function +bluegl_glEndQuery: + adrp x16, :got:__blue_glCore_glEndQuery + ldr x16, [x16, #:got_lo12:__blue_glCore_glEndQuery] ldr x16, [x16] br x16 - .size bluegl_glOrthoxOES, .-bluegl_glOrthoxOES + .size bluegl_glEndQuery, .-bluegl_glEndQuery .align 2 - .global bluegl_glVertexAttrib4ubvARB - .type bluegl_glVertexAttrib4ubvARB, %function -bluegl_glVertexAttrib4ubvARB: - adrp x16, :got:__blue_glCore_glVertexAttrib4ubvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4ubvARB] + .global bluegl_glGetQueryiv + .type bluegl_glGetQueryiv, %function +bluegl_glGetQueryiv: + adrp x16, :got:__blue_glCore_glGetQueryiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryiv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4ubvARB, .-bluegl_glVertexAttrib4ubvARB + .size bluegl_glGetQueryiv, .-bluegl_glGetQueryiv .align 2 - .global bluegl_glStencilOp - .type bluegl_glStencilOp, %function -bluegl_glStencilOp: - adrp x16, :got:__blue_glCore_glStencilOp - ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilOp] + .global bluegl_glGetQueryObjectiv + .type bluegl_glGetQueryObjectiv, %function +bluegl_glGetQueryObjectiv: + adrp x16, :got:__blue_glCore_glGetQueryObjectiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryObjectiv] ldr x16, [x16] br x16 - .size bluegl_glStencilOp, .-bluegl_glStencilOp + .size bluegl_glGetQueryObjectiv, .-bluegl_glGetQueryObjectiv .align 2 - .global bluegl_glProgramLocalParametersI4ivNV - .type bluegl_glProgramLocalParametersI4ivNV, %function -bluegl_glProgramLocalParametersI4ivNV: - adrp x16, :got:__blue_glCore_glProgramLocalParametersI4ivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParametersI4ivNV] + .global bluegl_glGetQueryObjectuiv + .type bluegl_glGetQueryObjectuiv, %function +bluegl_glGetQueryObjectuiv: + adrp x16, :got:__blue_glCore_glGetQueryObjectuiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryObjectuiv] ldr x16, [x16] br x16 - .size bluegl_glProgramLocalParametersI4ivNV, .-bluegl_glProgramLocalParametersI4ivNV + .size bluegl_glGetQueryObjectuiv, .-bluegl_glGetQueryObjectuiv .align 2 - .global bluegl_glVertexStream2iATI - .type bluegl_glVertexStream2iATI, %function -bluegl_glVertexStream2iATI: - adrp x16, :got:__blue_glCore_glVertexStream2iATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream2iATI] + .global bluegl_glBindBuffer + .type bluegl_glBindBuffer, %function +bluegl_glBindBuffer: + adrp x16, :got:__blue_glCore_glBindBuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBuffer] ldr x16, [x16] br x16 - .size bluegl_glVertexStream2iATI, .-bluegl_glVertexStream2iATI + .size bluegl_glBindBuffer, .-bluegl_glBindBuffer .align 2 - .global bluegl_glWeightdvARB - .type bluegl_glWeightdvARB, %function -bluegl_glWeightdvARB: - adrp x16, :got:__blue_glCore_glWeightdvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightdvARB] + .global bluegl_glDeleteBuffers + .type bluegl_glDeleteBuffers, %function +bluegl_glDeleteBuffers: + adrp x16, :got:__blue_glCore_glDeleteBuffers + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteBuffers] ldr x16, [x16] br x16 - .size bluegl_glWeightdvARB, .-bluegl_glWeightdvARB + .size bluegl_glDeleteBuffers, .-bluegl_glDeleteBuffers .align 2 - .global bluegl_glVertexAttrib1fARB - .type bluegl_glVertexAttrib1fARB, %function -bluegl_glVertexAttrib1fARB: - adrp x16, :got:__blue_glCore_glVertexAttrib1fARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1fARB] + .global bluegl_glGenBuffers + .type bluegl_glGenBuffers, %function +bluegl_glGenBuffers: + adrp x16, :got:__blue_glCore_glGenBuffers + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenBuffers] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1fARB, .-bluegl_glVertexAttrib1fARB + .size bluegl_glGenBuffers, .-bluegl_glGenBuffers .align 2 - .global bluegl_glColorFragmentOp2ATI - .type bluegl_glColorFragmentOp2ATI, %function -bluegl_glColorFragmentOp2ATI: - adrp x16, :got:__blue_glCore_glColorFragmentOp2ATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorFragmentOp2ATI] + .global bluegl_glIsBuffer + .type bluegl_glIsBuffer, %function +bluegl_glIsBuffer: + adrp x16, :got:__blue_glCore_glIsBuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsBuffer] ldr x16, [x16] br x16 - .size bluegl_glColorFragmentOp2ATI, .-bluegl_glColorFragmentOp2ATI + .size bluegl_glIsBuffer, .-bluegl_glIsBuffer .align 2 - .global bluegl_glGetBufferPointervARB - .type bluegl_glGetBufferPointervARB, %function -bluegl_glGetBufferPointervARB: - adrp x16, :got:__blue_glCore_glGetBufferPointervARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBufferPointervARB] + .global bluegl_glBufferData + .type bluegl_glBufferData, %function +bluegl_glBufferData: + adrp x16, :got:__blue_glCore_glBufferData + ldr x16, [x16, #:got_lo12:__blue_glCore_glBufferData] ldr x16, [x16] br x16 - .size bluegl_glGetBufferPointervARB, .-bluegl_glGetBufferPointervARB + .size bluegl_glBufferData, .-bluegl_glBufferData .align 2 - .global bluegl_glNamedFramebufferTexture1DEXT - .type bluegl_glNamedFramebufferTexture1DEXT, %function -bluegl_glNamedFramebufferTexture1DEXT: - adrp x16, :got:__blue_glCore_glNamedFramebufferTexture1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferTexture1DEXT] + .global bluegl_glBufferSubData + .type bluegl_glBufferSubData, %function +bluegl_glBufferSubData: + adrp x16, :got:__blue_glCore_glBufferSubData + ldr x16, [x16, #:got_lo12:__blue_glCore_glBufferSubData] ldr x16, [x16] br x16 - .size bluegl_glNamedFramebufferTexture1DEXT, .-bluegl_glNamedFramebufferTexture1DEXT + .size bluegl_glBufferSubData, .-bluegl_glBufferSubData .align 2 - .global bluegl_glVertexAttrib2fNV - .type bluegl_glVertexAttrib2fNV, %function -bluegl_glVertexAttrib2fNV: - adrp x16, :got:__blue_glCore_glVertexAttrib2fNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2fNV] + .global bluegl_glGetBufferSubData + .type bluegl_glGetBufferSubData, %function +bluegl_glGetBufferSubData: + adrp x16, :got:__blue_glCore_glGetBufferSubData + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBufferSubData] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2fNV, .-bluegl_glVertexAttrib2fNV + .size bluegl_glGetBufferSubData, .-bluegl_glGetBufferSubData .align 2 - .global bluegl_glDisableVertexAttribArray - .type bluegl_glDisableVertexAttribArray, %function -bluegl_glDisableVertexAttribArray: - adrp x16, :got:__blue_glCore_glDisableVertexAttribArray - ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableVertexAttribArray] + .global bluegl_glMapBuffer + .type bluegl_glMapBuffer, %function +bluegl_glMapBuffer: + adrp x16, :got:__blue_glCore_glMapBuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glMapBuffer] ldr x16, [x16] br x16 - .size bluegl_glDisableVertexAttribArray, .-bluegl_glDisableVertexAttribArray + .size bluegl_glMapBuffer, .-bluegl_glMapBuffer .align 2 - .global bluegl_glTextureParameterf - .type bluegl_glTextureParameterf, %function -bluegl_glTextureParameterf: - adrp x16, :got:__blue_glCore_glTextureParameterf - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameterf] + .global bluegl_glUnmapBuffer + .type bluegl_glUnmapBuffer, %function +bluegl_glUnmapBuffer: + adrp x16, :got:__blue_glCore_glUnmapBuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glUnmapBuffer] ldr x16, [x16] br x16 - .size bluegl_glTextureParameterf, .-bluegl_glTextureParameterf + .size bluegl_glUnmapBuffer, .-bluegl_glUnmapBuffer .align 2 - .global bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN - .type bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN, %function -bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN] + .global bluegl_glGetBufferParameteriv + .type bluegl_glGetBufferParameteriv, %function +bluegl_glGetBufferParameteriv: + adrp x16, :got:__blue_glCore_glGetBufferParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBufferParameteriv] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN, .-bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN + .size bluegl_glGetBufferParameteriv, .-bluegl_glGetBufferParameteriv .align 2 - .global bluegl_glNormal3fVertex3fSUN - .type bluegl_glNormal3fVertex3fSUN, %function -bluegl_glNormal3fVertex3fSUN: - adrp x16, :got:__blue_glCore_glNormal3fVertex3fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormal3fVertex3fSUN] + .global bluegl_glGetBufferPointerv + .type bluegl_glGetBufferPointerv, %function +bluegl_glGetBufferPointerv: + adrp x16, :got:__blue_glCore_glGetBufferPointerv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBufferPointerv] ldr x16, [x16] br x16 - .size bluegl_glNormal3fVertex3fSUN, .-bluegl_glNormal3fVertex3fSUN + .size bluegl_glGetBufferPointerv, .-bluegl_glGetBufferPointerv .align 2 - .global bluegl_glGetTexBumpParameterfvATI - .type bluegl_glGetTexBumpParameterfvATI, %function -bluegl_glGetTexBumpParameterfvATI: - adrp x16, :got:__blue_glCore_glGetTexBumpParameterfvATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexBumpParameterfvATI] + .global bluegl_glBlendEquationSeparate + .type bluegl_glBlendEquationSeparate, %function +bluegl_glBlendEquationSeparate: + adrp x16, :got:__blue_glCore_glBlendEquationSeparate + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquationSeparate] ldr x16, [x16] br x16 - .size bluegl_glGetTexBumpParameterfvATI, .-bluegl_glGetTexBumpParameterfvATI + .size bluegl_glBlendEquationSeparate, .-bluegl_glBlendEquationSeparate .align 2 - .global bluegl_glMultiTexCoord3fARB - .type bluegl_glMultiTexCoord3fARB, %function -bluegl_glMultiTexCoord3fARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord3fARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3fARB] + .global bluegl_glDrawBuffers + .type bluegl_glDrawBuffers, %function +bluegl_glDrawBuffers: + adrp x16, :got:__blue_glCore_glDrawBuffers + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawBuffers] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3fARB, .-bluegl_glMultiTexCoord3fARB + .size bluegl_glDrawBuffers, .-bluegl_glDrawBuffers .align 2 - .global bluegl_glTextureParameterfv - .type bluegl_glTextureParameterfv, %function -bluegl_glTextureParameterfv: - adrp x16, :got:__blue_glCore_glTextureParameterfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameterfv] + .global bluegl_glStencilOpSeparate + .type bluegl_glStencilOpSeparate, %function +bluegl_glStencilOpSeparate: + adrp x16, :got:__blue_glCore_glStencilOpSeparate + ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilOpSeparate] ldr x16, [x16] br x16 - .size bluegl_glTextureParameterfv, .-bluegl_glTextureParameterfv + .size bluegl_glStencilOpSeparate, .-bluegl_glStencilOpSeparate .align 2 - .global bluegl_glTexBumpParameterivATI - .type bluegl_glTexBumpParameterivATI, %function -bluegl_glTexBumpParameterivATI: - adrp x16, :got:__blue_glCore_glTexBumpParameterivATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexBumpParameterivATI] + .global bluegl_glStencilFuncSeparate + .type bluegl_glStencilFuncSeparate, %function +bluegl_glStencilFuncSeparate: + adrp x16, :got:__blue_glCore_glStencilFuncSeparate + ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilFuncSeparate] ldr x16, [x16] br x16 - .size bluegl_glTexBumpParameterivATI, .-bluegl_glTexBumpParameterivATI + .size bluegl_glStencilFuncSeparate, .-bluegl_glStencilFuncSeparate .align 2 - .global bluegl_glLockArraysEXT - .type bluegl_glLockArraysEXT, %function -bluegl_glLockArraysEXT: - adrp x16, :got:__blue_glCore_glLockArraysEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glLockArraysEXT] + .global bluegl_glStencilMaskSeparate + .type bluegl_glStencilMaskSeparate, %function +bluegl_glStencilMaskSeparate: + adrp x16, :got:__blue_glCore_glStencilMaskSeparate + ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilMaskSeparate] ldr x16, [x16] br x16 - .size bluegl_glLockArraysEXT, .-bluegl_glLockArraysEXT + .size bluegl_glStencilMaskSeparate, .-bluegl_glStencilMaskSeparate .align 2 - .global bluegl_glIsEnabledIndexedEXT - .type bluegl_glIsEnabledIndexedEXT, %function -bluegl_glIsEnabledIndexedEXT: - adrp x16, :got:__blue_glCore_glIsEnabledIndexedEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsEnabledIndexedEXT] + .global bluegl_glAttachShader + .type bluegl_glAttachShader, %function +bluegl_glAttachShader: + adrp x16, :got:__blue_glCore_glAttachShader + ldr x16, [x16, #:got_lo12:__blue_glCore_glAttachShader] ldr x16, [x16] br x16 - .size bluegl_glIsEnabledIndexedEXT, .-bluegl_glIsEnabledIndexedEXT + .size bluegl_glAttachShader, .-bluegl_glAttachShader .align 2 - .global bluegl_glGenerateMipmapEXT - .type bluegl_glGenerateMipmapEXT, %function -bluegl_glGenerateMipmapEXT: - adrp x16, :got:__blue_glCore_glGenerateMipmapEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenerateMipmapEXT] + .global bluegl_glBindAttribLocation + .type bluegl_glBindAttribLocation, %function +bluegl_glBindAttribLocation: + adrp x16, :got:__blue_glCore_glBindAttribLocation + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindAttribLocation] ldr x16, [x16] br x16 - .size bluegl_glGenerateMipmapEXT, .-bluegl_glGenerateMipmapEXT + .size bluegl_glBindAttribLocation, .-bluegl_glBindAttribLocation .align 2 - .global bluegl_glVertexP3uiv - .type bluegl_glVertexP3uiv, %function -bluegl_glVertexP3uiv: - adrp x16, :got:__blue_glCore_glVertexP3uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexP3uiv] + .global bluegl_glCompileShader + .type bluegl_glCompileShader, %function +bluegl_glCompileShader: + adrp x16, :got:__blue_glCore_glCompileShader + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompileShader] ldr x16, [x16] br x16 - .size bluegl_glVertexP3uiv, .-bluegl_glVertexP3uiv + .size bluegl_glCompileShader, .-bluegl_glCompileShader .align 2 - .global bluegl_glClearNamedBufferSubData - .type bluegl_glClearNamedBufferSubData, %function -bluegl_glClearNamedBufferSubData: - adrp x16, :got:__blue_glCore_glClearNamedBufferSubData - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearNamedBufferSubData] + .global bluegl_glCreateProgram + .type bluegl_glCreateProgram, %function +bluegl_glCreateProgram: + adrp x16, :got:__blue_glCore_glCreateProgram + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateProgram] ldr x16, [x16] br x16 - .size bluegl_glClearNamedBufferSubData, .-bluegl_glClearNamedBufferSubData + .size bluegl_glCreateProgram, .-bluegl_glCreateProgram .align 2 - .global bluegl_glInvalidateTexImage - .type bluegl_glInvalidateTexImage, %function -bluegl_glInvalidateTexImage: - adrp x16, :got:__blue_glCore_glInvalidateTexImage - ldr x16, [x16, #:got_lo12:__blue_glCore_glInvalidateTexImage] + .global bluegl_glCreateShader + .type bluegl_glCreateShader, %function +bluegl_glCreateShader: + adrp x16, :got:__blue_glCore_glCreateShader + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateShader] ldr x16, [x16] br x16 - .size bluegl_glInvalidateTexImage, .-bluegl_glInvalidateTexImage + .size bluegl_glCreateShader, .-bluegl_glCreateShader .align 2 - .global bluegl_glBindFramebuffer - .type bluegl_glBindFramebuffer, %function -bluegl_glBindFramebuffer: - adrp x16, :got:__blue_glCore_glBindFramebuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindFramebuffer] + .global bluegl_glDeleteProgram + .type bluegl_glDeleteProgram, %function +bluegl_glDeleteProgram: + adrp x16, :got:__blue_glCore_glDeleteProgram + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteProgram] ldr x16, [x16] br x16 - .size bluegl_glBindFramebuffer, .-bluegl_glBindFramebuffer + .size bluegl_glDeleteProgram, .-bluegl_glDeleteProgram .align 2 - .global bluegl_glDrawArraysIndirect - .type bluegl_glDrawArraysIndirect, %function -bluegl_glDrawArraysIndirect: - adrp x16, :got:__blue_glCore_glDrawArraysIndirect - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawArraysIndirect] + .global bluegl_glDeleteShader + .type bluegl_glDeleteShader, %function +bluegl_glDeleteShader: + adrp x16, :got:__blue_glCore_glDeleteShader + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteShader] ldr x16, [x16] br x16 - .size bluegl_glDrawArraysIndirect, .-bluegl_glDrawArraysIndirect + .size bluegl_glDeleteShader, .-bluegl_glDeleteShader .align 2 - .global bluegl_glClipPlanexOES - .type bluegl_glClipPlanexOES, %function -bluegl_glClipPlanexOES: - adrp x16, :got:__blue_glCore_glClipPlanexOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glClipPlanexOES] + .global bluegl_glDetachShader + .type bluegl_glDetachShader, %function +bluegl_glDetachShader: + adrp x16, :got:__blue_glCore_glDetachShader + ldr x16, [x16, #:got_lo12:__blue_glCore_glDetachShader] ldr x16, [x16] br x16 - .size bluegl_glClipPlanexOES, .-bluegl_glClipPlanexOES + .size bluegl_glDetachShader, .-bluegl_glDetachShader .align 2 - .global bluegl_glGetFloati_v - .type bluegl_glGetFloati_v, %function -bluegl_glGetFloati_v: - adrp x16, :got:__blue_glCore_glGetFloati_v - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFloati_v] + .global bluegl_glDisableVertexAttribArray + .type bluegl_glDisableVertexAttribArray, %function +bluegl_glDisableVertexAttribArray: + adrp x16, :got:__blue_glCore_glDisableVertexAttribArray + ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableVertexAttribArray] ldr x16, [x16] br x16 - .size bluegl_glGetFloati_v, .-bluegl_glGetFloati_v + .size bluegl_glDisableVertexAttribArray, .-bluegl_glDisableVertexAttribArray .align 2 - .global bluegl_glTransformFeedbackVaryingsEXT - .type bluegl_glTransformFeedbackVaryingsEXT, %function -bluegl_glTransformFeedbackVaryingsEXT: - adrp x16, :got:__blue_glCore_glTransformFeedbackVaryingsEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTransformFeedbackVaryingsEXT] + .global bluegl_glEnableVertexAttribArray + .type bluegl_glEnableVertexAttribArray, %function +bluegl_glEnableVertexAttribArray: + adrp x16, :got:__blue_glCore_glEnableVertexAttribArray + ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableVertexAttribArray] ldr x16, [x16] br x16 - .size bluegl_glTransformFeedbackVaryingsEXT, .-bluegl_glTransformFeedbackVaryingsEXT + .size bluegl_glEnableVertexAttribArray, .-bluegl_glEnableVertexAttribArray .align 2 - .global bluegl_glGetColorTableParameteriv - .type bluegl_glGetColorTableParameteriv, %function -bluegl_glGetColorTableParameteriv: - adrp x16, :got:__blue_glCore_glGetColorTableParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetColorTableParameteriv] + .global bluegl_glGetActiveAttrib + .type bluegl_glGetActiveAttrib, %function +bluegl_glGetActiveAttrib: + adrp x16, :got:__blue_glCore_glGetActiveAttrib + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveAttrib] ldr x16, [x16] br x16 - .size bluegl_glGetColorTableParameteriv, .-bluegl_glGetColorTableParameteriv + .size bluegl_glGetActiveAttrib, .-bluegl_glGetActiveAttrib .align 2 - .global bluegl_glTexBufferRange - .type bluegl_glTexBufferRange, %function -bluegl_glTexBufferRange: - adrp x16, :got:__blue_glCore_glTexBufferRange - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexBufferRange] + .global bluegl_glGetActiveUniform + .type bluegl_glGetActiveUniform, %function +bluegl_glGetActiveUniform: + adrp x16, :got:__blue_glCore_glGetActiveUniform + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveUniform] ldr x16, [x16] br x16 - .size bluegl_glTexBufferRange, .-bluegl_glTexBufferRange + .size bluegl_glGetActiveUniform, .-bluegl_glGetActiveUniform .align 2 - .global bluegl_glVertexAttribI1uivEXT - .type bluegl_glVertexAttribI1uivEXT, %function -bluegl_glVertexAttribI1uivEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI1uivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI1uivEXT] + .global bluegl_glGetAttachedShaders + .type bluegl_glGetAttachedShaders, %function +bluegl_glGetAttachedShaders: + adrp x16, :got:__blue_glCore_glGetAttachedShaders + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetAttachedShaders] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI1uivEXT, .-bluegl_glVertexAttribI1uivEXT + .size bluegl_glGetAttachedShaders, .-bluegl_glGetAttachedShaders .align 2 - .global bluegl_glShaderBinary - .type bluegl_glShaderBinary, %function -bluegl_glShaderBinary: - adrp x16, :got:__blue_glCore_glShaderBinary - ldr x16, [x16, #:got_lo12:__blue_glCore_glShaderBinary] + .global bluegl_glGetAttribLocation + .type bluegl_glGetAttribLocation, %function +bluegl_glGetAttribLocation: + adrp x16, :got:__blue_glCore_glGetAttribLocation + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetAttribLocation] ldr x16, [x16] br x16 - .size bluegl_glShaderBinary, .-bluegl_glShaderBinary + .size bluegl_glGetAttribLocation, .-bluegl_glGetAttribLocation .align 2 - .global bluegl_glGetVertexAttribLi64vNV - .type bluegl_glGetVertexAttribLi64vNV, %function -bluegl_glGetVertexAttribLi64vNV: - adrp x16, :got:__blue_glCore_glGetVertexAttribLi64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribLi64vNV] + .global bluegl_glGetProgramiv + .type bluegl_glGetProgramiv, %function +bluegl_glGetProgramiv: + adrp x16, :got:__blue_glCore_glGetProgramiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramiv] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribLi64vNV, .-bluegl_glGetVertexAttribLi64vNV + .size bluegl_glGetProgramiv, .-bluegl_glGetProgramiv .align 2 - .global bluegl_glGetNamedBufferSubDataEXT - .type bluegl_glGetNamedBufferSubDataEXT, %function -bluegl_glGetNamedBufferSubDataEXT: - adrp x16, :got:__blue_glCore_glGetNamedBufferSubDataEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedBufferSubDataEXT] + .global bluegl_glGetProgramInfoLog + .type bluegl_glGetProgramInfoLog, %function +bluegl_glGetProgramInfoLog: + adrp x16, :got:__blue_glCore_glGetProgramInfoLog + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramInfoLog] ldr x16, [x16] br x16 - .size bluegl_glGetNamedBufferSubDataEXT, .-bluegl_glGetNamedBufferSubDataEXT + .size bluegl_glGetProgramInfoLog, .-bluegl_glGetProgramInfoLog .align 2 - .global bluegl_glUniform3uivEXT - .type bluegl_glUniform3uivEXT, %function -bluegl_glUniform3uivEXT: - adrp x16, :got:__blue_glCore_glUniform3uivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3uivEXT] + .global bluegl_glGetShaderiv + .type bluegl_glGetShaderiv, %function +bluegl_glGetShaderiv: + adrp x16, :got:__blue_glCore_glGetShaderiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetShaderiv] ldr x16, [x16] br x16 - .size bluegl_glUniform3uivEXT, .-bluegl_glUniform3uivEXT + .size bluegl_glGetShaderiv, .-bluegl_glGetShaderiv .align 2 - .global bluegl_glMatrixTranslatefEXT - .type bluegl_glMatrixTranslatefEXT, %function -bluegl_glMatrixTranslatefEXT: - adrp x16, :got:__blue_glCore_glMatrixTranslatefEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixTranslatefEXT] + .global bluegl_glGetShaderInfoLog + .type bluegl_glGetShaderInfoLog, %function +bluegl_glGetShaderInfoLog: + adrp x16, :got:__blue_glCore_glGetShaderInfoLog + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetShaderInfoLog] ldr x16, [x16] br x16 - .size bluegl_glMatrixTranslatefEXT, .-bluegl_glMatrixTranslatefEXT + .size bluegl_glGetShaderInfoLog, .-bluegl_glGetShaderInfoLog .align 2 - .global bluegl_glVertexAttribs2hvNV - .type bluegl_glVertexAttribs2hvNV, %function -bluegl_glVertexAttribs2hvNV: - adrp x16, :got:__blue_glCore_glVertexAttribs2hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs2hvNV] + .global bluegl_glGetShaderSource + .type bluegl_glGetShaderSource, %function +bluegl_glGetShaderSource: + adrp x16, :got:__blue_glCore_glGetShaderSource + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetShaderSource] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribs2hvNV, .-bluegl_glVertexAttribs2hvNV + .size bluegl_glGetShaderSource, .-bluegl_glGetShaderSource .align 2 - .global bluegl_glClearBufferSubData - .type bluegl_glClearBufferSubData, %function -bluegl_glClearBufferSubData: - adrp x16, :got:__blue_glCore_glClearBufferSubData - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearBufferSubData] + .global bluegl_glGetUniformLocation + .type bluegl_glGetUniformLocation, %function +bluegl_glGetUniformLocation: + adrp x16, :got:__blue_glCore_glGetUniformLocation + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformLocation] ldr x16, [x16] br x16 - .size bluegl_glClearBufferSubData, .-bluegl_glClearBufferSubData + .size bluegl_glGetUniformLocation, .-bluegl_glGetUniformLocation .align 2 - .global bluegl_glGenFramebuffers - .type bluegl_glGenFramebuffers, %function -bluegl_glGenFramebuffers: - adrp x16, :got:__blue_glCore_glGenFramebuffers - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenFramebuffers] + .global bluegl_glGetUniformfv + .type bluegl_glGetUniformfv, %function +bluegl_glGetUniformfv: + adrp x16, :got:__blue_glCore_glGetUniformfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformfv] ldr x16, [x16] br x16 - .size bluegl_glGenFramebuffers, .-bluegl_glGenFramebuffers + .size bluegl_glGetUniformfv, .-bluegl_glGetUniformfv .align 2 - .global bluegl_glVertexArrayAttribFormat - .type bluegl_glVertexArrayAttribFormat, %function -bluegl_glVertexArrayAttribFormat: - adrp x16, :got:__blue_glCore_glVertexArrayAttribFormat - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayAttribFormat] + .global bluegl_glGetUniformiv + .type bluegl_glGetUniformiv, %function +bluegl_glGetUniformiv: + adrp x16, :got:__blue_glCore_glGetUniformiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformiv] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayAttribFormat, .-bluegl_glVertexArrayAttribFormat + .size bluegl_glGetUniformiv, .-bluegl_glGetUniformiv .align 2 - .global bluegl_glGetActiveUniformsiv - .type bluegl_glGetActiveUniformsiv, %function -bluegl_glGetActiveUniformsiv: - adrp x16, :got:__blue_glCore_glGetActiveUniformsiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveUniformsiv] + .global bluegl_glGetVertexAttribdv + .type bluegl_glGetVertexAttribdv, %function +bluegl_glGetVertexAttribdv: + adrp x16, :got:__blue_glCore_glGetVertexAttribdv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribdv] ldr x16, [x16] br x16 - .size bluegl_glGetActiveUniformsiv, .-bluegl_glGetActiveUniformsiv + .size bluegl_glGetVertexAttribdv, .-bluegl_glGetVertexAttribdv .align 2 - .global bluegl_glCompressedTextureSubImage1DEXT - .type bluegl_glCompressedTextureSubImage1DEXT, %function -bluegl_glCompressedTextureSubImage1DEXT: - adrp x16, :got:__blue_glCore_glCompressedTextureSubImage1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTextureSubImage1DEXT] + .global bluegl_glGetVertexAttribfv + .type bluegl_glGetVertexAttribfv, %function +bluegl_glGetVertexAttribfv: + adrp x16, :got:__blue_glCore_glGetVertexAttribfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribfv] + ldr x16, [x16] + br x16 + .size bluegl_glGetVertexAttribfv, .-bluegl_glGetVertexAttribfv + + .align 2 + .global bluegl_glGetVertexAttribiv + .type bluegl_glGetVertexAttribiv, %function +bluegl_glGetVertexAttribiv: + adrp x16, :got:__blue_glCore_glGetVertexAttribiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribiv] ldr x16, [x16] br x16 - .size bluegl_glCompressedTextureSubImage1DEXT, .-bluegl_glCompressedTextureSubImage1DEXT + .size bluegl_glGetVertexAttribiv, .-bluegl_glGetVertexAttribiv .align 2 - .global bluegl_glIsRenderbuffer - .type bluegl_glIsRenderbuffer, %function -bluegl_glIsRenderbuffer: - adrp x16, :got:__blue_glCore_glIsRenderbuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsRenderbuffer] + .global bluegl_glGetVertexAttribPointerv + .type bluegl_glGetVertexAttribPointerv, %function +bluegl_glGetVertexAttribPointerv: + adrp x16, :got:__blue_glCore_glGetVertexAttribPointerv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribPointerv] ldr x16, [x16] br x16 - .size bluegl_glIsRenderbuffer, .-bluegl_glIsRenderbuffer + .size bluegl_glGetVertexAttribPointerv, .-bluegl_glGetVertexAttribPointerv .align 2 - .global bluegl_glPresentFrameKeyedNV - .type bluegl_glPresentFrameKeyedNV, %function -bluegl_glPresentFrameKeyedNV: - adrp x16, :got:__blue_glCore_glPresentFrameKeyedNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPresentFrameKeyedNV] + .global bluegl_glIsProgram + .type bluegl_glIsProgram, %function +bluegl_glIsProgram: + adrp x16, :got:__blue_glCore_glIsProgram + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsProgram] ldr x16, [x16] br x16 - .size bluegl_glPresentFrameKeyedNV, .-bluegl_glPresentFrameKeyedNV + .size bluegl_glIsProgram, .-bluegl_glIsProgram .align 2 - .global bluegl_glProgramUniformMatrix3fvEXT - .type bluegl_glProgramUniformMatrix3fvEXT, %function -bluegl_glProgramUniformMatrix3fvEXT: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix3fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3fvEXT] + .global bluegl_glIsShader + .type bluegl_glIsShader, %function +bluegl_glIsShader: + adrp x16, :got:__blue_glCore_glIsShader + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsShader] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix3fvEXT, .-bluegl_glProgramUniformMatrix3fvEXT + .size bluegl_glIsShader, .-bluegl_glIsShader .align 2 - .global bluegl_glVertexAttribL2i64vNV - .type bluegl_glVertexAttribL2i64vNV, %function -bluegl_glVertexAttribL2i64vNV: - adrp x16, :got:__blue_glCore_glVertexAttribL2i64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL2i64vNV] + .global bluegl_glLinkProgram + .type bluegl_glLinkProgram, %function +bluegl_glLinkProgram: + adrp x16, :got:__blue_glCore_glLinkProgram + ldr x16, [x16, #:got_lo12:__blue_glCore_glLinkProgram] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL2i64vNV, .-bluegl_glVertexAttribL2i64vNV + .size bluegl_glLinkProgram, .-bluegl_glLinkProgram .align 2 - .global bluegl_glFogCoordhvNV - .type bluegl_glFogCoordhvNV, %function -bluegl_glFogCoordhvNV: - adrp x16, :got:__blue_glCore_glFogCoordhvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordhvNV] + .global bluegl_glShaderSource + .type bluegl_glShaderSource, %function +bluegl_glShaderSource: + adrp x16, :got:__blue_glCore_glShaderSource + ldr x16, [x16, #:got_lo12:__blue_glCore_glShaderSource] ldr x16, [x16] br x16 - .size bluegl_glFogCoordhvNV, .-bluegl_glFogCoordhvNV + .size bluegl_glShaderSource, .-bluegl_glShaderSource .align 2 - .global bluegl_glVertexAttrib4ubv - .type bluegl_glVertexAttrib4ubv, %function -bluegl_glVertexAttrib4ubv: - adrp x16, :got:__blue_glCore_glVertexAttrib4ubv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4ubv] + .global bluegl_glUseProgram + .type bluegl_glUseProgram, %function +bluegl_glUseProgram: + adrp x16, :got:__blue_glCore_glUseProgram + ldr x16, [x16, #:got_lo12:__blue_glCore_glUseProgram] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4ubv, .-bluegl_glVertexAttrib4ubv + .size bluegl_glUseProgram, .-bluegl_glUseProgram .align 2 - .global bluegl_glPushClientAttribDefaultEXT - .type bluegl_glPushClientAttribDefaultEXT, %function -bluegl_glPushClientAttribDefaultEXT: - adrp x16, :got:__blue_glCore_glPushClientAttribDefaultEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glPushClientAttribDefaultEXT] + .global bluegl_glUniform1f + .type bluegl_glUniform1f, %function +bluegl_glUniform1f: + adrp x16, :got:__blue_glCore_glUniform1f + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1f] ldr x16, [x16] br x16 - .size bluegl_glPushClientAttribDefaultEXT, .-bluegl_glPushClientAttribDefaultEXT + .size bluegl_glUniform1f, .-bluegl_glUniform1f .align 2 - .global bluegl_glWindowPos3ivMESA - .type bluegl_glWindowPos3ivMESA, %function -bluegl_glWindowPos3ivMESA: - adrp x16, :got:__blue_glCore_glWindowPos3ivMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3ivMESA] + .global bluegl_glUniform2f + .type bluegl_glUniform2f, %function +bluegl_glUniform2f: + adrp x16, :got:__blue_glCore_glUniform2f + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2f] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3ivMESA, .-bluegl_glWindowPos3ivMESA + .size bluegl_glUniform2f, .-bluegl_glUniform2f .align 2 - .global bluegl_glPrimitiveRestartIndexNV - .type bluegl_glPrimitiveRestartIndexNV, %function -bluegl_glPrimitiveRestartIndexNV: - adrp x16, :got:__blue_glCore_glPrimitiveRestartIndexNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPrimitiveRestartIndexNV] + .global bluegl_glUniform3f + .type bluegl_glUniform3f, %function +bluegl_glUniform3f: + adrp x16, :got:__blue_glCore_glUniform3f + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3f] ldr x16, [x16] br x16 - .size bluegl_glPrimitiveRestartIndexNV, .-bluegl_glPrimitiveRestartIndexNV + .size bluegl_glUniform3f, .-bluegl_glUniform3f .align 2 - .global bluegl_glCreatePerfQueryINTEL - .type bluegl_glCreatePerfQueryINTEL, %function -bluegl_glCreatePerfQueryINTEL: - adrp x16, :got:__blue_glCore_glCreatePerfQueryINTEL - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreatePerfQueryINTEL] + .global bluegl_glUniform4f + .type bluegl_glUniform4f, %function +bluegl_glUniform4f: + adrp x16, :got:__blue_glCore_glUniform4f + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4f] ldr x16, [x16] br x16 - .size bluegl_glCreatePerfQueryINTEL, .-bluegl_glCreatePerfQueryINTEL + .size bluegl_glUniform4f, .-bluegl_glUniform4f .align 2 - .global bluegl_glGetProgramLocalParameterIuivNV - .type bluegl_glGetProgramLocalParameterIuivNV, %function -bluegl_glGetProgramLocalParameterIuivNV: - adrp x16, :got:__blue_glCore_glGetProgramLocalParameterIuivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramLocalParameterIuivNV] + .global bluegl_glUniform1i + .type bluegl_glUniform1i, %function +bluegl_glUniform1i: + adrp x16, :got:__blue_glCore_glUniform1i + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1i] ldr x16, [x16] br x16 - .size bluegl_glGetProgramLocalParameterIuivNV, .-bluegl_glGetProgramLocalParameterIuivNV + .size bluegl_glUniform1i, .-bluegl_glUniform1i .align 2 - .global bluegl_glResizeBuffersMESA - .type bluegl_glResizeBuffersMESA, %function -bluegl_glResizeBuffersMESA: - adrp x16, :got:__blue_glCore_glResizeBuffersMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glResizeBuffersMESA] + .global bluegl_glUniform2i + .type bluegl_glUniform2i, %function +bluegl_glUniform2i: + adrp x16, :got:__blue_glCore_glUniform2i + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2i] ldr x16, [x16] br x16 - .size bluegl_glResizeBuffersMESA, .-bluegl_glResizeBuffersMESA + .size bluegl_glUniform2i, .-bluegl_glUniform2i .align 2 - .global bluegl_glVertexStream1fATI - .type bluegl_glVertexStream1fATI, %function -bluegl_glVertexStream1fATI: - adrp x16, :got:__blue_glCore_glVertexStream1fATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream1fATI] + .global bluegl_glUniform3i + .type bluegl_glUniform3i, %function +bluegl_glUniform3i: + adrp x16, :got:__blue_glCore_glUniform3i + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3i] ldr x16, [x16] br x16 - .size bluegl_glVertexStream1fATI, .-bluegl_glVertexStream1fATI + .size bluegl_glUniform3i, .-bluegl_glUniform3i .align 2 - .global bluegl_glProgramUniform2ui - .type bluegl_glProgramUniform2ui, %function -bluegl_glProgramUniform2ui: - adrp x16, :got:__blue_glCore_glProgramUniform2ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2ui] + .global bluegl_glUniform4i + .type bluegl_glUniform4i, %function +bluegl_glUniform4i: + adrp x16, :got:__blue_glCore_glUniform4i + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4i] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2ui, .-bluegl_glProgramUniform2ui + .size bluegl_glUniform4i, .-bluegl_glUniform4i .align 2 - .global bluegl_glSecondaryColor3iv - .type bluegl_glSecondaryColor3iv, %function -bluegl_glSecondaryColor3iv: - adrp x16, :got:__blue_glCore_glSecondaryColor3iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3iv] + .global bluegl_glUniform1fv + .type bluegl_glUniform1fv, %function +bluegl_glUniform1fv: + adrp x16, :got:__blue_glCore_glUniform1fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1fv] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3iv, .-bluegl_glSecondaryColor3iv + .size bluegl_glUniform1fv, .-bluegl_glUniform1fv .align 2 - .global bluegl_glProgramParameters4dvNV - .type bluegl_glProgramParameters4dvNV, %function -bluegl_glProgramParameters4dvNV: - adrp x16, :got:__blue_glCore_glProgramParameters4dvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramParameters4dvNV] + .global bluegl_glUniform2fv + .type bluegl_glUniform2fv, %function +bluegl_glUniform2fv: + adrp x16, :got:__blue_glCore_glUniform2fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2fv] ldr x16, [x16] br x16 - .size bluegl_glProgramParameters4dvNV, .-bluegl_glProgramParameters4dvNV + .size bluegl_glUniform2fv, .-bluegl_glUniform2fv .align 2 - .global bluegl_glWindowPos3i - .type bluegl_glWindowPos3i, %function -bluegl_glWindowPos3i: - adrp x16, :got:__blue_glCore_glWindowPos3i - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3i] + .global bluegl_glUniform3fv + .type bluegl_glUniform3fv, %function +bluegl_glUniform3fv: + adrp x16, :got:__blue_glCore_glUniform3fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3fv] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3i, .-bluegl_glWindowPos3i + .size bluegl_glUniform3fv, .-bluegl_glUniform3fv .align 2 - .global bluegl_glRectxvOES - .type bluegl_glRectxvOES, %function -bluegl_glRectxvOES: - adrp x16, :got:__blue_glCore_glRectxvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glRectxvOES] + .global bluegl_glUniform4fv + .type bluegl_glUniform4fv, %function +bluegl_glUniform4fv: + adrp x16, :got:__blue_glCore_glUniform4fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4fv] ldr x16, [x16] br x16 - .size bluegl_glRectxvOES, .-bluegl_glRectxvOES + .size bluegl_glUniform4fv, .-bluegl_glUniform4fv .align 2 - .global bluegl_glMultiTexCoord4iARB - .type bluegl_glMultiTexCoord4iARB, %function -bluegl_glMultiTexCoord4iARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord4iARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4iARB] + .global bluegl_glUniform1iv + .type bluegl_glUniform1iv, %function +bluegl_glUniform1iv: + adrp x16, :got:__blue_glCore_glUniform1iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1iv] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4iARB, .-bluegl_glMultiTexCoord4iARB + .size bluegl_glUniform1iv, .-bluegl_glUniform1iv .align 2 - .global bluegl_glBeginConditionalRender - .type bluegl_glBeginConditionalRender, %function -bluegl_glBeginConditionalRender: - adrp x16, :got:__blue_glCore_glBeginConditionalRender - ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginConditionalRender] + .global bluegl_glUniform2iv + .type bluegl_glUniform2iv, %function +bluegl_glUniform2iv: + adrp x16, :got:__blue_glCore_glUniform2iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2iv] ldr x16, [x16] br x16 - .size bluegl_glBeginConditionalRender, .-bluegl_glBeginConditionalRender + .size bluegl_glUniform2iv, .-bluegl_glUniform2iv .align 2 - .global bluegl_glFreeObjectBufferATI - .type bluegl_glFreeObjectBufferATI, %function -bluegl_glFreeObjectBufferATI: - adrp x16, :got:__blue_glCore_glFreeObjectBufferATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glFreeObjectBufferATI] + .global bluegl_glUniform3iv + .type bluegl_glUniform3iv, %function +bluegl_glUniform3iv: + adrp x16, :got:__blue_glCore_glUniform3iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3iv] ldr x16, [x16] br x16 - .size bluegl_glFreeObjectBufferATI, .-bluegl_glFreeObjectBufferATI + .size bluegl_glUniform3iv, .-bluegl_glUniform3iv .align 2 - .global bluegl_glGetOcclusionQueryuivNV - .type bluegl_glGetOcclusionQueryuivNV, %function -bluegl_glGetOcclusionQueryuivNV: - adrp x16, :got:__blue_glCore_glGetOcclusionQueryuivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetOcclusionQueryuivNV] + .global bluegl_glUniform4iv + .type bluegl_glUniform4iv, %function +bluegl_glUniform4iv: + adrp x16, :got:__blue_glCore_glUniform4iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4iv] ldr x16, [x16] br x16 - .size bluegl_glGetOcclusionQueryuivNV, .-bluegl_glGetOcclusionQueryuivNV + .size bluegl_glUniform4iv, .-bluegl_glUniform4iv .align 2 - .global bluegl_glColorP4ui - .type bluegl_glColorP4ui, %function -bluegl_glColorP4ui: - adrp x16, :got:__blue_glCore_glColorP4ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorP4ui] + .global bluegl_glUniformMatrix2fv + .type bluegl_glUniformMatrix2fv, %function +bluegl_glUniformMatrix2fv: + adrp x16, :got:__blue_glCore_glUniformMatrix2fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix2fv] ldr x16, [x16] br x16 - .size bluegl_glColorP4ui, .-bluegl_glColorP4ui + .size bluegl_glUniformMatrix2fv, .-bluegl_glUniformMatrix2fv .align 2 - .global bluegl_glGetPathColorGenivNV - .type bluegl_glGetPathColorGenivNV, %function -bluegl_glGetPathColorGenivNV: - adrp x16, :got:__blue_glCore_glGetPathColorGenivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathColorGenivNV] + .global bluegl_glUniformMatrix3fv + .type bluegl_glUniformMatrix3fv, %function +bluegl_glUniformMatrix3fv: + adrp x16, :got:__blue_glCore_glUniformMatrix3fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix3fv] ldr x16, [x16] br x16 - .size bluegl_glGetPathColorGenivNV, .-bluegl_glGetPathColorGenivNV + .size bluegl_glUniformMatrix3fv, .-bluegl_glUniformMatrix3fv .align 2 - .global bluegl_glGetQueryiv - .type bluegl_glGetQueryiv, %function -bluegl_glGetQueryiv: - adrp x16, :got:__blue_glCore_glGetQueryiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryiv] + .global bluegl_glUniformMatrix4fv + .type bluegl_glUniformMatrix4fv, %function +bluegl_glUniformMatrix4fv: + adrp x16, :got:__blue_glCore_glUniformMatrix4fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix4fv] ldr x16, [x16] br x16 - .size bluegl_glGetQueryiv, .-bluegl_glGetQueryiv + .size bluegl_glUniformMatrix4fv, .-bluegl_glUniformMatrix4fv .align 2 - .global bluegl_glVertexAttribI2uiv - .type bluegl_glVertexAttribI2uiv, %function -bluegl_glVertexAttribI2uiv: - adrp x16, :got:__blue_glCore_glVertexAttribI2uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI2uiv] + .global bluegl_glValidateProgram + .type bluegl_glValidateProgram, %function +bluegl_glValidateProgram: + adrp x16, :got:__blue_glCore_glValidateProgram + ldr x16, [x16, #:got_lo12:__blue_glCore_glValidateProgram] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI2uiv, .-bluegl_glVertexAttribI2uiv + .size bluegl_glValidateProgram, .-bluegl_glValidateProgram .align 2 - .global bluegl_glGetVertexArrayPointeri_vEXT - .type bluegl_glGetVertexArrayPointeri_vEXT, %function -bluegl_glGetVertexArrayPointeri_vEXT: - adrp x16, :got:__blue_glCore_glGetVertexArrayPointeri_vEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexArrayPointeri_vEXT] + .global bluegl_glVertexAttrib1d + .type bluegl_glVertexAttrib1d, %function +bluegl_glVertexAttrib1d: + adrp x16, :got:__blue_glCore_glVertexAttrib1d + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1d] ldr x16, [x16] br x16 - .size bluegl_glGetVertexArrayPointeri_vEXT, .-bluegl_glGetVertexArrayPointeri_vEXT + .size bluegl_glVertexAttrib1d, .-bluegl_glVertexAttrib1d .align 2 - .global bluegl_glSamplerParameteri - .type bluegl_glSamplerParameteri, %function -bluegl_glSamplerParameteri: - adrp x16, :got:__blue_glCore_glSamplerParameteri - ldr x16, [x16, #:got_lo12:__blue_glCore_glSamplerParameteri] + .global bluegl_glVertexAttrib1dv + .type bluegl_glVertexAttrib1dv, %function +bluegl_glVertexAttrib1dv: + adrp x16, :got:__blue_glCore_glVertexAttrib1dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1dv] ldr x16, [x16] br x16 - .size bluegl_glSamplerParameteri, .-bluegl_glSamplerParameteri + .size bluegl_glVertexAttrib1dv, .-bluegl_glVertexAttrib1dv .align 2 - .global bluegl_glResumeTransformFeedbackNV - .type bluegl_glResumeTransformFeedbackNV, %function -bluegl_glResumeTransformFeedbackNV: - adrp x16, :got:__blue_glCore_glResumeTransformFeedbackNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glResumeTransformFeedbackNV] + .global bluegl_glVertexAttrib1f + .type bluegl_glVertexAttrib1f, %function +bluegl_glVertexAttrib1f: + adrp x16, :got:__blue_glCore_glVertexAttrib1f + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1f] ldr x16, [x16] br x16 - .size bluegl_glResumeTransformFeedbackNV, .-bluegl_glResumeTransformFeedbackNV + .size bluegl_glVertexAttrib1f, .-bluegl_glVertexAttrib1f .align 2 - .global bluegl_glVertexAttribL1ui64vNV - .type bluegl_glVertexAttribL1ui64vNV, %function -bluegl_glVertexAttribL1ui64vNV: - adrp x16, :got:__blue_glCore_glVertexAttribL1ui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1ui64vNV] + .global bluegl_glVertexAttrib1fv + .type bluegl_glVertexAttrib1fv, %function +bluegl_glVertexAttrib1fv: + adrp x16, :got:__blue_glCore_glVertexAttrib1fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1fv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL1ui64vNV, .-bluegl_glVertexAttribL1ui64vNV + .size bluegl_glVertexAttrib1fv, .-bluegl_glVertexAttrib1fv .align 2 - .global bluegl_glPauseTransformFeedbackNV - .type bluegl_glPauseTransformFeedbackNV, %function -bluegl_glPauseTransformFeedbackNV: - adrp x16, :got:__blue_glCore_glPauseTransformFeedbackNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPauseTransformFeedbackNV] + .global bluegl_glVertexAttrib1s + .type bluegl_glVertexAttrib1s, %function +bluegl_glVertexAttrib1s: + adrp x16, :got:__blue_glCore_glVertexAttrib1s + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1s] ldr x16, [x16] br x16 - .size bluegl_glPauseTransformFeedbackNV, .-bluegl_glPauseTransformFeedbackNV + .size bluegl_glVertexAttrib1s, .-bluegl_glVertexAttrib1s .align 2 - .global bluegl_glVertexAttribs2fvNV - .type bluegl_glVertexAttribs2fvNV, %function -bluegl_glVertexAttribs2fvNV: - adrp x16, :got:__blue_glCore_glVertexAttribs2fvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs2fvNV] + .global bluegl_glVertexAttrib1sv + .type bluegl_glVertexAttrib1sv, %function +bluegl_glVertexAttrib1sv: + adrp x16, :got:__blue_glCore_glVertexAttrib1sv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1sv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribs2fvNV, .-bluegl_glVertexAttribs2fvNV + .size bluegl_glVertexAttrib1sv, .-bluegl_glVertexAttrib1sv .align 2 - .global bluegl_glProgramUniform1iv - .type bluegl_glProgramUniform1iv, %function -bluegl_glProgramUniform1iv: - adrp x16, :got:__blue_glCore_glProgramUniform1iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1iv] + .global bluegl_glVertexAttrib2d + .type bluegl_glVertexAttrib2d, %function +bluegl_glVertexAttrib2d: + adrp x16, :got:__blue_glCore_glVertexAttrib2d + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2d] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1iv, .-bluegl_glProgramUniform1iv + .size bluegl_glVertexAttrib2d, .-bluegl_glVertexAttrib2d .align 2 - .global bluegl_glGetColorTableSGI - .type bluegl_glGetColorTableSGI, %function -bluegl_glGetColorTableSGI: - adrp x16, :got:__blue_glCore_glGetColorTableSGI - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetColorTableSGI] + .global bluegl_glVertexAttrib2dv + .type bluegl_glVertexAttrib2dv, %function +bluegl_glVertexAttrib2dv: + adrp x16, :got:__blue_glCore_glVertexAttrib2dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2dv] ldr x16, [x16] br x16 - .size bluegl_glGetColorTableSGI, .-bluegl_glGetColorTableSGI + .size bluegl_glVertexAttrib2dv, .-bluegl_glVertexAttrib2dv .align 2 - .global bluegl_glGetActiveAttrib - .type bluegl_glGetActiveAttrib, %function -bluegl_glGetActiveAttrib: - adrp x16, :got:__blue_glCore_glGetActiveAttrib - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveAttrib] + .global bluegl_glVertexAttrib2f + .type bluegl_glVertexAttrib2f, %function +bluegl_glVertexAttrib2f: + adrp x16, :got:__blue_glCore_glVertexAttrib2f + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2f] ldr x16, [x16] br x16 - .size bluegl_glGetActiveAttrib, .-bluegl_glGetActiveAttrib + .size bluegl_glVertexAttrib2f, .-bluegl_glVertexAttrib2f .align 2 - .global bluegl_glResetMinmax - .type bluegl_glResetMinmax, %function -bluegl_glResetMinmax: - adrp x16, :got:__blue_glCore_glResetMinmax - ldr x16, [x16, #:got_lo12:__blue_glCore_glResetMinmax] + .global bluegl_glVertexAttrib2fv + .type bluegl_glVertexAttrib2fv, %function +bluegl_glVertexAttrib2fv: + adrp x16, :got:__blue_glCore_glVertexAttrib2fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2fv] ldr x16, [x16] br x16 - .size bluegl_glResetMinmax, .-bluegl_glResetMinmax + .size bluegl_glVertexAttrib2fv, .-bluegl_glVertexAttrib2fv .align 2 - .global bluegl_glBinormal3svEXT - .type bluegl_glBinormal3svEXT, %function -bluegl_glBinormal3svEXT: - adrp x16, :got:__blue_glCore_glBinormal3svEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3svEXT] + .global bluegl_glVertexAttrib2s + .type bluegl_glVertexAttrib2s, %function +bluegl_glVertexAttrib2s: + adrp x16, :got:__blue_glCore_glVertexAttrib2s + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2s] ldr x16, [x16] br x16 - .size bluegl_glBinormal3svEXT, .-bluegl_glBinormal3svEXT + .size bluegl_glVertexAttrib2s, .-bluegl_glVertexAttrib2s .align 2 - .global bluegl_glVertexAttrib4fv - .type bluegl_glVertexAttrib4fv, %function -bluegl_glVertexAttrib4fv: - adrp x16, :got:__blue_glCore_glVertexAttrib4fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4fv] + .global bluegl_glVertexAttrib2sv + .type bluegl_glVertexAttrib2sv, %function +bluegl_glVertexAttrib2sv: + adrp x16, :got:__blue_glCore_glVertexAttrib2sv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2sv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4fv, .-bluegl_glVertexAttrib4fv + .size bluegl_glVertexAttrib2sv, .-bluegl_glVertexAttrib2sv .align 2 - .global bluegl_glIndexxOES - .type bluegl_glIndexxOES, %function -bluegl_glIndexxOES: - adrp x16, :got:__blue_glCore_glIndexxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glIndexxOES] + .global bluegl_glVertexAttrib3d + .type bluegl_glVertexAttrib3d, %function +bluegl_glVertexAttrib3d: + adrp x16, :got:__blue_glCore_glVertexAttrib3d + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3d] ldr x16, [x16] br x16 - .size bluegl_glIndexxOES, .-bluegl_glIndexxOES + .size bluegl_glVertexAttrib3d, .-bluegl_glVertexAttrib3d .align 2 - .global bluegl_glMatrixMultTransposefEXT - .type bluegl_glMatrixMultTransposefEXT, %function -bluegl_glMatrixMultTransposefEXT: - adrp x16, :got:__blue_glCore_glMatrixMultTransposefEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixMultTransposefEXT] + .global bluegl_glVertexAttrib3dv + .type bluegl_glVertexAttrib3dv, %function +bluegl_glVertexAttrib3dv: + adrp x16, :got:__blue_glCore_glVertexAttrib3dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3dv] ldr x16, [x16] br x16 - .size bluegl_glMatrixMultTransposefEXT, .-bluegl_glMatrixMultTransposefEXT + .size bluegl_glVertexAttrib3dv, .-bluegl_glVertexAttrib3dv .align 2 - .global bluegl_glNamedFramebufferTexture - .type bluegl_glNamedFramebufferTexture, %function -bluegl_glNamedFramebufferTexture: - adrp x16, :got:__blue_glCore_glNamedFramebufferTexture - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferTexture] + .global bluegl_glVertexAttrib3f + .type bluegl_glVertexAttrib3f, %function +bluegl_glVertexAttrib3f: + adrp x16, :got:__blue_glCore_glVertexAttrib3f + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3f] ldr x16, [x16] br x16 - .size bluegl_glNamedFramebufferTexture, .-bluegl_glNamedFramebufferTexture + .size bluegl_glVertexAttrib3f, .-bluegl_glVertexAttrib3f .align 2 - .global bluegl_glVertexP2uiv - .type bluegl_glVertexP2uiv, %function -bluegl_glVertexP2uiv: - adrp x16, :got:__blue_glCore_glVertexP2uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexP2uiv] + .global bluegl_glVertexAttrib3fv + .type bluegl_glVertexAttrib3fv, %function +bluegl_glVertexAttrib3fv: + adrp x16, :got:__blue_glCore_glVertexAttrib3fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3fv] + ldr x16, [x16] + br x16 + .size bluegl_glVertexAttrib3fv, .-bluegl_glVertexAttrib3fv + + .align 2 + .global bluegl_glVertexAttrib3s + .type bluegl_glVertexAttrib3s, %function +bluegl_glVertexAttrib3s: + adrp x16, :got:__blue_glCore_glVertexAttrib3s + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3s] ldr x16, [x16] br x16 - .size bluegl_glVertexP2uiv, .-bluegl_glVertexP2uiv + .size bluegl_glVertexAttrib3s, .-bluegl_glVertexAttrib3s .align 2 - .global bluegl_glMemoryBarrier - .type bluegl_glMemoryBarrier, %function -bluegl_glMemoryBarrier: - adrp x16, :got:__blue_glCore_glMemoryBarrier - ldr x16, [x16, #:got_lo12:__blue_glCore_glMemoryBarrier] + .global bluegl_glVertexAttrib3sv + .type bluegl_glVertexAttrib3sv, %function +bluegl_glVertexAttrib3sv: + adrp x16, :got:__blue_glCore_glVertexAttrib3sv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3sv] ldr x16, [x16] br x16 - .size bluegl_glMemoryBarrier, .-bluegl_glMemoryBarrier + .size bluegl_glVertexAttrib3sv, .-bluegl_glVertexAttrib3sv .align 2 - .global bluegl_glGetGraphicsResetStatusARB - .type bluegl_glGetGraphicsResetStatusARB, %function -bluegl_glGetGraphicsResetStatusARB: - adrp x16, :got:__blue_glCore_glGetGraphicsResetStatusARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetGraphicsResetStatusARB] + .global bluegl_glVertexAttrib4Nbv + .type bluegl_glVertexAttrib4Nbv, %function +bluegl_glVertexAttrib4Nbv: + adrp x16, :got:__blue_glCore_glVertexAttrib4Nbv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4Nbv] ldr x16, [x16] br x16 - .size bluegl_glGetGraphicsResetStatusARB, .-bluegl_glGetGraphicsResetStatusARB + .size bluegl_glVertexAttrib4Nbv, .-bluegl_glVertexAttrib4Nbv .align 2 - .global bluegl_glBindAttribLocation - .type bluegl_glBindAttribLocation, %function -bluegl_glBindAttribLocation: - adrp x16, :got:__blue_glCore_glBindAttribLocation - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindAttribLocation] + .global bluegl_glVertexAttrib4Niv + .type bluegl_glVertexAttrib4Niv, %function +bluegl_glVertexAttrib4Niv: + adrp x16, :got:__blue_glCore_glVertexAttrib4Niv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4Niv] ldr x16, [x16] br x16 - .size bluegl_glBindAttribLocation, .-bluegl_glBindAttribLocation + .size bluegl_glVertexAttrib4Niv, .-bluegl_glVertexAttrib4Niv .align 2 - .global bluegl_glVertexBlendEnviATI - .type bluegl_glVertexBlendEnviATI, %function -bluegl_glVertexBlendEnviATI: - adrp x16, :got:__blue_glCore_glVertexBlendEnviATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexBlendEnviATI] + .global bluegl_glVertexAttrib4Nsv + .type bluegl_glVertexAttrib4Nsv, %function +bluegl_glVertexAttrib4Nsv: + adrp x16, :got:__blue_glCore_glVertexAttrib4Nsv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4Nsv] ldr x16, [x16] br x16 - .size bluegl_glVertexBlendEnviATI, .-bluegl_glVertexBlendEnviATI + .size bluegl_glVertexAttrib4Nsv, .-bluegl_glVertexAttrib4Nsv .align 2 - .global bluegl_glAttachObjectARB - .type bluegl_glAttachObjectARB, %function -bluegl_glAttachObjectARB: - adrp x16, :got:__blue_glCore_glAttachObjectARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glAttachObjectARB] + .global bluegl_glVertexAttrib4Nub + .type bluegl_glVertexAttrib4Nub, %function +bluegl_glVertexAttrib4Nub: + adrp x16, :got:__blue_glCore_glVertexAttrib4Nub + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4Nub] ldr x16, [x16] br x16 - .size bluegl_glAttachObjectARB, .-bluegl_glAttachObjectARB + .size bluegl_glVertexAttrib4Nub, .-bluegl_glVertexAttrib4Nub .align 2 - .global bluegl_glNormalStream3bvATI - .type bluegl_glNormalStream3bvATI, %function -bluegl_glNormalStream3bvATI: - adrp x16, :got:__blue_glCore_glNormalStream3bvATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3bvATI] + .global bluegl_glVertexAttrib4Nubv + .type bluegl_glVertexAttrib4Nubv, %function +bluegl_glVertexAttrib4Nubv: + adrp x16, :got:__blue_glCore_glVertexAttrib4Nubv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4Nubv] ldr x16, [x16] br x16 - .size bluegl_glNormalStream3bvATI, .-bluegl_glNormalStream3bvATI + .size bluegl_glVertexAttrib4Nubv, .-bluegl_glVertexAttrib4Nubv .align 2 - .global bluegl_glNamedFramebufferTextureFaceEXT - .type bluegl_glNamedFramebufferTextureFaceEXT, %function -bluegl_glNamedFramebufferTextureFaceEXT: - adrp x16, :got:__blue_glCore_glNamedFramebufferTextureFaceEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferTextureFaceEXT] + .global bluegl_glVertexAttrib4Nuiv + .type bluegl_glVertexAttrib4Nuiv, %function +bluegl_glVertexAttrib4Nuiv: + adrp x16, :got:__blue_glCore_glVertexAttrib4Nuiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4Nuiv] ldr x16, [x16] br x16 - .size bluegl_glNamedFramebufferTextureFaceEXT, .-bluegl_glNamedFramebufferTextureFaceEXT + .size bluegl_glVertexAttrib4Nuiv, .-bluegl_glVertexAttrib4Nuiv .align 2 - .global bluegl_glGetConvolutionParameterivEXT - .type bluegl_glGetConvolutionParameterivEXT, %function -bluegl_glGetConvolutionParameterivEXT: - adrp x16, :got:__blue_glCore_glGetConvolutionParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetConvolutionParameterivEXT] + .global bluegl_glVertexAttrib4Nusv + .type bluegl_glVertexAttrib4Nusv, %function +bluegl_glVertexAttrib4Nusv: + adrp x16, :got:__blue_glCore_glVertexAttrib4Nusv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4Nusv] ldr x16, [x16] br x16 - .size bluegl_glGetConvolutionParameterivEXT, .-bluegl_glGetConvolutionParameterivEXT + .size bluegl_glVertexAttrib4Nusv, .-bluegl_glVertexAttrib4Nusv .align 2 - .global bluegl_glProgramPathFragmentInputGenNV - .type bluegl_glProgramPathFragmentInputGenNV, %function -bluegl_glProgramPathFragmentInputGenNV: - adrp x16, :got:__blue_glCore_glProgramPathFragmentInputGenNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramPathFragmentInputGenNV] + .global bluegl_glVertexAttrib4bv + .type bluegl_glVertexAttrib4bv, %function +bluegl_glVertexAttrib4bv: + adrp x16, :got:__blue_glCore_glVertexAttrib4bv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4bv] ldr x16, [x16] br x16 - .size bluegl_glProgramPathFragmentInputGenNV, .-bluegl_glProgramPathFragmentInputGenNV + .size bluegl_glVertexAttrib4bv, .-bluegl_glVertexAttrib4bv .align 2 - .global bluegl_glIsFramebufferEXT - .type bluegl_glIsFramebufferEXT, %function -bluegl_glIsFramebufferEXT: - adrp x16, :got:__blue_glCore_glIsFramebufferEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsFramebufferEXT] + .global bluegl_glVertexAttrib4d + .type bluegl_glVertexAttrib4d, %function +bluegl_glVertexAttrib4d: + adrp x16, :got:__blue_glCore_glVertexAttrib4d + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4d] ldr x16, [x16] br x16 - .size bluegl_glIsFramebufferEXT, .-bluegl_glIsFramebufferEXT + .size bluegl_glVertexAttrib4d, .-bluegl_glVertexAttrib4d .align 2 - .global bluegl_glIsVertexArray - .type bluegl_glIsVertexArray, %function -bluegl_glIsVertexArray: - adrp x16, :got:__blue_glCore_glIsVertexArray - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsVertexArray] + .global bluegl_glVertexAttrib4dv + .type bluegl_glVertexAttrib4dv, %function +bluegl_glVertexAttrib4dv: + adrp x16, :got:__blue_glCore_glVertexAttrib4dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4dv] ldr x16, [x16] br x16 - .size bluegl_glIsVertexArray, .-bluegl_glIsVertexArray + .size bluegl_glVertexAttrib4dv, .-bluegl_glVertexAttrib4dv .align 2 - .global bluegl_glGetVertexAttribIivEXT - .type bluegl_glGetVertexAttribIivEXT, %function -bluegl_glGetVertexAttribIivEXT: - adrp x16, :got:__blue_glCore_glGetVertexAttribIivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribIivEXT] + .global bluegl_glVertexAttrib4f + .type bluegl_glVertexAttrib4f, %function +bluegl_glVertexAttrib4f: + adrp x16, :got:__blue_glCore_glVertexAttrib4f + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4f] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribIivEXT, .-bluegl_glGetVertexAttribIivEXT + .size bluegl_glVertexAttrib4f, .-bluegl_glVertexAttrib4f .align 2 - .global bluegl_glTextureParameterIivEXT - .type bluegl_glTextureParameterIivEXT, %function -bluegl_glTextureParameterIivEXT: - adrp x16, :got:__blue_glCore_glTextureParameterIivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameterIivEXT] + .global bluegl_glVertexAttrib4fv + .type bluegl_glVertexAttrib4fv, %function +bluegl_glVertexAttrib4fv: + adrp x16, :got:__blue_glCore_glVertexAttrib4fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4fv] ldr x16, [x16] br x16 - .size bluegl_glTextureParameterIivEXT, .-bluegl_glTextureParameterIivEXT + .size bluegl_glVertexAttrib4fv, .-bluegl_glVertexAttrib4fv .align 2 - .global bluegl_glGetnPixelMapuiv - .type bluegl_glGetnPixelMapuiv, %function -bluegl_glGetnPixelMapuiv: - adrp x16, :got:__blue_glCore_glGetnPixelMapuiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnPixelMapuiv] + .global bluegl_glVertexAttrib4iv + .type bluegl_glVertexAttrib4iv, %function +bluegl_glVertexAttrib4iv: + adrp x16, :got:__blue_glCore_glVertexAttrib4iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4iv] ldr x16, [x16] br x16 - .size bluegl_glGetnPixelMapuiv, .-bluegl_glGetnPixelMapuiv + .size bluegl_glVertexAttrib4iv, .-bluegl_glVertexAttrib4iv .align 2 - .global bluegl_glGetInvariantFloatvEXT - .type bluegl_glGetInvariantFloatvEXT, %function -bluegl_glGetInvariantFloatvEXT: - adrp x16, :got:__blue_glCore_glGetInvariantFloatvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInvariantFloatvEXT] + .global bluegl_glVertexAttrib4s + .type bluegl_glVertexAttrib4s, %function +bluegl_glVertexAttrib4s: + adrp x16, :got:__blue_glCore_glVertexAttrib4s + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4s] ldr x16, [x16] br x16 - .size bluegl_glGetInvariantFloatvEXT, .-bluegl_glGetInvariantFloatvEXT + .size bluegl_glVertexAttrib4s, .-bluegl_glVertexAttrib4s .align 2 - .global bluegl_glAttachShader - .type bluegl_glAttachShader, %function -bluegl_glAttachShader: - adrp x16, :got:__blue_glCore_glAttachShader - ldr x16, [x16, #:got_lo12:__blue_glCore_glAttachShader] + .global bluegl_glVertexAttrib4sv + .type bluegl_glVertexAttrib4sv, %function +bluegl_glVertexAttrib4sv: + adrp x16, :got:__blue_glCore_glVertexAttrib4sv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4sv] ldr x16, [x16] br x16 - .size bluegl_glAttachShader, .-bluegl_glAttachShader + .size bluegl_glVertexAttrib4sv, .-bluegl_glVertexAttrib4sv .align 2 - .global bluegl_glSecondaryColor3i - .type bluegl_glSecondaryColor3i, %function -bluegl_glSecondaryColor3i: - adrp x16, :got:__blue_glCore_glSecondaryColor3i - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3i] + .global bluegl_glVertexAttrib4ubv + .type bluegl_glVertexAttrib4ubv, %function +bluegl_glVertexAttrib4ubv: + adrp x16, :got:__blue_glCore_glVertexAttrib4ubv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4ubv] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3i, .-bluegl_glSecondaryColor3i + .size bluegl_glVertexAttrib4ubv, .-bluegl_glVertexAttrib4ubv .align 2 - .global bluegl_glTexCoord4hvNV - .type bluegl_glTexCoord4hvNV, %function -bluegl_glTexCoord4hvNV: - adrp x16, :got:__blue_glCore_glTexCoord4hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord4hvNV] + .global bluegl_glVertexAttrib4uiv + .type bluegl_glVertexAttrib4uiv, %function +bluegl_glVertexAttrib4uiv: + adrp x16, :got:__blue_glCore_glVertexAttrib4uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4uiv] ldr x16, [x16] br x16 - .size bluegl_glTexCoord4hvNV, .-bluegl_glTexCoord4hvNV + .size bluegl_glVertexAttrib4uiv, .-bluegl_glVertexAttrib4uiv .align 2 - .global bluegl_glColorTableSGI - .type bluegl_glColorTableSGI, %function -bluegl_glColorTableSGI: - adrp x16, :got:__blue_glCore_glColorTableSGI - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorTableSGI] + .global bluegl_glVertexAttrib4usv + .type bluegl_glVertexAttrib4usv, %function +bluegl_glVertexAttrib4usv: + adrp x16, :got:__blue_glCore_glVertexAttrib4usv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4usv] ldr x16, [x16] br x16 - .size bluegl_glColorTableSGI, .-bluegl_glColorTableSGI + .size bluegl_glVertexAttrib4usv, .-bluegl_glVertexAttrib4usv .align 2 - .global bluegl_glProgramUniform4uivEXT - .type bluegl_glProgramUniform4uivEXT, %function -bluegl_glProgramUniform4uivEXT: - adrp x16, :got:__blue_glCore_glProgramUniform4uivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4uivEXT] + .global bluegl_glVertexAttribPointer + .type bluegl_glVertexAttribPointer, %function +bluegl_glVertexAttribPointer: + adrp x16, :got:__blue_glCore_glVertexAttribPointer + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribPointer] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4uivEXT, .-bluegl_glProgramUniform4uivEXT + .size bluegl_glVertexAttribPointer, .-bluegl_glVertexAttribPointer .align 2 - .global bluegl_glPointSizexOES - .type bluegl_glPointSizexOES, %function -bluegl_glPointSizexOES: - adrp x16, :got:__blue_glCore_glPointSizexOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glPointSizexOES] + .global bluegl_glUniformMatrix2x3fv + .type bluegl_glUniformMatrix2x3fv, %function +bluegl_glUniformMatrix2x3fv: + adrp x16, :got:__blue_glCore_glUniformMatrix2x3fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix2x3fv] ldr x16, [x16] br x16 - .size bluegl_glPointSizexOES, .-bluegl_glPointSizexOES + .size bluegl_glUniformMatrix2x3fv, .-bluegl_glUniformMatrix2x3fv .align 2 - .global bluegl_glTrackMatrixNV - .type bluegl_glTrackMatrixNV, %function -bluegl_glTrackMatrixNV: - adrp x16, :got:__blue_glCore_glTrackMatrixNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTrackMatrixNV] + .global bluegl_glUniformMatrix3x2fv + .type bluegl_glUniformMatrix3x2fv, %function +bluegl_glUniformMatrix3x2fv: + adrp x16, :got:__blue_glCore_glUniformMatrix3x2fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix3x2fv] ldr x16, [x16] br x16 - .size bluegl_glTrackMatrixNV, .-bluegl_glTrackMatrixNV + .size bluegl_glUniformMatrix3x2fv, .-bluegl_glUniformMatrix3x2fv .align 2 - .global bluegl_glMultiTexCoord1fv - .type bluegl_glMultiTexCoord1fv, %function -bluegl_glMultiTexCoord1fv: - adrp x16, :got:__blue_glCore_glMultiTexCoord1fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1fv] + .global bluegl_glUniformMatrix2x4fv + .type bluegl_glUniformMatrix2x4fv, %function +bluegl_glUniformMatrix2x4fv: + adrp x16, :got:__blue_glCore_glUniformMatrix2x4fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix2x4fv] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1fv, .-bluegl_glMultiTexCoord1fv + .size bluegl_glUniformMatrix2x4fv, .-bluegl_glUniformMatrix2x4fv .align 2 - .global bluegl_glSecondaryColorPointerListIBM - .type bluegl_glSecondaryColorPointerListIBM, %function -bluegl_glSecondaryColorPointerListIBM: - adrp x16, :got:__blue_glCore_glSecondaryColorPointerListIBM - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColorPointerListIBM] + .global bluegl_glUniformMatrix4x2fv + .type bluegl_glUniformMatrix4x2fv, %function +bluegl_glUniformMatrix4x2fv: + adrp x16, :got:__blue_glCore_glUniformMatrix4x2fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix4x2fv] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColorPointerListIBM, .-bluegl_glSecondaryColorPointerListIBM + .size bluegl_glUniformMatrix4x2fv, .-bluegl_glUniformMatrix4x2fv .align 2 - .global bluegl_glGenBuffersARB - .type bluegl_glGenBuffersARB, %function -bluegl_glGenBuffersARB: - adrp x16, :got:__blue_glCore_glGenBuffersARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenBuffersARB] + .global bluegl_glUniformMatrix3x4fv + .type bluegl_glUniformMatrix3x4fv, %function +bluegl_glUniformMatrix3x4fv: + adrp x16, :got:__blue_glCore_glUniformMatrix3x4fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix3x4fv] ldr x16, [x16] br x16 - .size bluegl_glGenBuffersARB, .-bluegl_glGenBuffersARB + .size bluegl_glUniformMatrix3x4fv, .-bluegl_glUniformMatrix3x4fv .align 2 - .global bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN - .type bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN, %function -bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN: - adrp x16, :got:__blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN] + .global bluegl_glUniformMatrix4x3fv + .type bluegl_glUniformMatrix4x3fv, %function +bluegl_glUniformMatrix4x3fv: + adrp x16, :got:__blue_glCore_glUniformMatrix4x3fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix4x3fv] ldr x16, [x16] br x16 - .size bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN, .-bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN + .size bluegl_glUniformMatrix4x3fv, .-bluegl_glUniformMatrix4x3fv .align 2 - .global bluegl_glCopyColorTable - .type bluegl_glCopyColorTable, %function -bluegl_glCopyColorTable: - adrp x16, :got:__blue_glCore_glCopyColorTable - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyColorTable] + .global bluegl_glColorMaski + .type bluegl_glColorMaski, %function +bluegl_glColorMaski: + adrp x16, :got:__blue_glCore_glColorMaski + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorMaski] ldr x16, [x16] br x16 - .size bluegl_glCopyColorTable, .-bluegl_glCopyColorTable + .size bluegl_glColorMaski, .-bluegl_glColorMaski .align 2 - .global bluegl_glTexPageCommitmentARB - .type bluegl_glTexPageCommitmentARB, %function -bluegl_glTexPageCommitmentARB: - adrp x16, :got:__blue_glCore_glTexPageCommitmentARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexPageCommitmentARB] + .global bluegl_glGetBooleani_v + .type bluegl_glGetBooleani_v, %function +bluegl_glGetBooleani_v: + adrp x16, :got:__blue_glCore_glGetBooleani_v + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBooleani_v] ldr x16, [x16] br x16 - .size bluegl_glTexPageCommitmentARB, .-bluegl_glTexPageCommitmentARB + .size bluegl_glGetBooleani_v, .-bluegl_glGetBooleani_v .align 2 - .global bluegl_glSetFenceAPPLE - .type bluegl_glSetFenceAPPLE, %function -bluegl_glSetFenceAPPLE: - adrp x16, :got:__blue_glCore_glSetFenceAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glSetFenceAPPLE] + .global bluegl_glGetIntegeri_v + .type bluegl_glGetIntegeri_v, %function +bluegl_glGetIntegeri_v: + adrp x16, :got:__blue_glCore_glGetIntegeri_v + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetIntegeri_v] ldr x16, [x16] br x16 - .size bluegl_glSetFenceAPPLE, .-bluegl_glSetFenceAPPLE + .size bluegl_glGetIntegeri_v, .-bluegl_glGetIntegeri_v .align 2 - .global bluegl_glMultiTexCoord2dvARB - .type bluegl_glMultiTexCoord2dvARB, %function -bluegl_glMultiTexCoord2dvARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord2dvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2dvARB] + .global bluegl_glEnablei + .type bluegl_glEnablei, %function +bluegl_glEnablei: + adrp x16, :got:__blue_glCore_glEnablei + ldr x16, [x16, #:got_lo12:__blue_glCore_glEnablei] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2dvARB, .-bluegl_glMultiTexCoord2dvARB + .size bluegl_glEnablei, .-bluegl_glEnablei .align 2 - .global bluegl_glVertex4hvNV - .type bluegl_glVertex4hvNV, %function -bluegl_glVertex4hvNV: - adrp x16, :got:__blue_glCore_glVertex4hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex4hvNV] + .global bluegl_glDisablei + .type bluegl_glDisablei, %function +bluegl_glDisablei: + adrp x16, :got:__blue_glCore_glDisablei + ldr x16, [x16, #:got_lo12:__blue_glCore_glDisablei] ldr x16, [x16] br x16 - .size bluegl_glVertex4hvNV, .-bluegl_glVertex4hvNV + .size bluegl_glDisablei, .-bluegl_glDisablei .align 2 - .global bluegl_glBindVertexBuffer - .type bluegl_glBindVertexBuffer, %function -bluegl_glBindVertexBuffer: - adrp x16, :got:__blue_glCore_glBindVertexBuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindVertexBuffer] + .global bluegl_glIsEnabledi + .type bluegl_glIsEnabledi, %function +bluegl_glIsEnabledi: + adrp x16, :got:__blue_glCore_glIsEnabledi + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsEnabledi] ldr x16, [x16] br x16 - .size bluegl_glBindVertexBuffer, .-bluegl_glBindVertexBuffer + .size bluegl_glIsEnabledi, .-bluegl_glIsEnabledi .align 2 - .global bluegl_glVertex3xvOES - .type bluegl_glVertex3xvOES, %function -bluegl_glVertex3xvOES: - adrp x16, :got:__blue_glCore_glVertex3xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex3xvOES] + .global bluegl_glBeginTransformFeedback + .type bluegl_glBeginTransformFeedback, %function +bluegl_glBeginTransformFeedback: + adrp x16, :got:__blue_glCore_glBeginTransformFeedback + ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginTransformFeedback] ldr x16, [x16] br x16 - .size bluegl_glVertex3xvOES, .-bluegl_glVertex3xvOES + .size bluegl_glBeginTransformFeedback, .-bluegl_glBeginTransformFeedback .align 2 - .global bluegl_glConvolutionParameterivEXT - .type bluegl_glConvolutionParameterivEXT, %function -bluegl_glConvolutionParameterivEXT: - adrp x16, :got:__blue_glCore_glConvolutionParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameterivEXT] + .global bluegl_glEndTransformFeedback + .type bluegl_glEndTransformFeedback, %function +bluegl_glEndTransformFeedback: + adrp x16, :got:__blue_glCore_glEndTransformFeedback + ldr x16, [x16, #:got_lo12:__blue_glCore_glEndTransformFeedback] ldr x16, [x16] br x16 - .size bluegl_glConvolutionParameterivEXT, .-bluegl_glConvolutionParameterivEXT + .size bluegl_glEndTransformFeedback, .-bluegl_glEndTransformFeedback .align 2 - .global bluegl_glProgramUniform3ui64vARB - .type bluegl_glProgramUniform3ui64vARB, %function -bluegl_glProgramUniform3ui64vARB: - adrp x16, :got:__blue_glCore_glProgramUniform3ui64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3ui64vARB] + .global bluegl_glBindBufferRange + .type bluegl_glBindBufferRange, %function +bluegl_glBindBufferRange: + adrp x16, :got:__blue_glCore_glBindBufferRange + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBufferRange] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3ui64vARB, .-bluegl_glProgramUniform3ui64vARB + .size bluegl_glBindBufferRange, .-bluegl_glBindBufferRange .align 2 - .global bluegl_glProgramUniform2dv - .type bluegl_glProgramUniform2dv, %function -bluegl_glProgramUniform2dv: - adrp x16, :got:__blue_glCore_glProgramUniform2dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2dv] + .global bluegl_glBindBufferBase + .type bluegl_glBindBufferBase, %function +bluegl_glBindBufferBase: + adrp x16, :got:__blue_glCore_glBindBufferBase + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBufferBase] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2dv, .-bluegl_glProgramUniform2dv + .size bluegl_glBindBufferBase, .-bluegl_glBindBufferBase .align 2 - .global bluegl_glWindowPos4sMESA - .type bluegl_glWindowPos4sMESA, %function -bluegl_glWindowPos4sMESA: - adrp x16, :got:__blue_glCore_glWindowPos4sMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos4sMESA] + .global bluegl_glTransformFeedbackVaryings + .type bluegl_glTransformFeedbackVaryings, %function +bluegl_glTransformFeedbackVaryings: + adrp x16, :got:__blue_glCore_glTransformFeedbackVaryings + ldr x16, [x16, #:got_lo12:__blue_glCore_glTransformFeedbackVaryings] ldr x16, [x16] br x16 - .size bluegl_glWindowPos4sMESA, .-bluegl_glWindowPos4sMESA + .size bluegl_glTransformFeedbackVaryings, .-bluegl_glTransformFeedbackVaryings .align 2 - .global bluegl_glMultiTexImage1DEXT - .type bluegl_glMultiTexImage1DEXT, %function -bluegl_glMultiTexImage1DEXT: - adrp x16, :got:__blue_glCore_glMultiTexImage1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexImage1DEXT] + .global bluegl_glGetTransformFeedbackVarying + .type bluegl_glGetTransformFeedbackVarying, %function +bluegl_glGetTransformFeedbackVarying: + adrp x16, :got:__blue_glCore_glGetTransformFeedbackVarying + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTransformFeedbackVarying] ldr x16, [x16] br x16 - .size bluegl_glMultiTexImage1DEXT, .-bluegl_glMultiTexImage1DEXT + .size bluegl_glGetTransformFeedbackVarying, .-bluegl_glGetTransformFeedbackVarying .align 2 - .global bluegl_glRenderbufferStorage - .type bluegl_glRenderbufferStorage, %function -bluegl_glRenderbufferStorage: - adrp x16, :got:__blue_glCore_glRenderbufferStorage - ldr x16, [x16, #:got_lo12:__blue_glCore_glRenderbufferStorage] + .global bluegl_glClampColor + .type bluegl_glClampColor, %function +bluegl_glClampColor: + adrp x16, :got:__blue_glCore_glClampColor + ldr x16, [x16, #:got_lo12:__blue_glCore_glClampColor] ldr x16, [x16] br x16 - .size bluegl_glRenderbufferStorage, .-bluegl_glRenderbufferStorage + .size bluegl_glClampColor, .-bluegl_glClampColor .align 2 - .global bluegl_glConvolutionFilter2D - .type bluegl_glConvolutionFilter2D, %function -bluegl_glConvolutionFilter2D: - adrp x16, :got:__blue_glCore_glConvolutionFilter2D - ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionFilter2D] + .global bluegl_glBeginConditionalRender + .type bluegl_glBeginConditionalRender, %function +bluegl_glBeginConditionalRender: + adrp x16, :got:__blue_glCore_glBeginConditionalRender + ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginConditionalRender] ldr x16, [x16] br x16 - .size bluegl_glConvolutionFilter2D, .-bluegl_glConvolutionFilter2D + .size bluegl_glBeginConditionalRender, .-bluegl_glBeginConditionalRender .align 2 - .global bluegl_glBinormal3bEXT - .type bluegl_glBinormal3bEXT, %function -bluegl_glBinormal3bEXT: - adrp x16, :got:__blue_glCore_glBinormal3bEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3bEXT] + .global bluegl_glEndConditionalRender + .type bluegl_glEndConditionalRender, %function +bluegl_glEndConditionalRender: + adrp x16, :got:__blue_glCore_glEndConditionalRender + ldr x16, [x16, #:got_lo12:__blue_glCore_glEndConditionalRender] ldr x16, [x16] br x16 - .size bluegl_glBinormal3bEXT, .-bluegl_glBinormal3bEXT + .size bluegl_glEndConditionalRender, .-bluegl_glEndConditionalRender .align 2 - .global bluegl_glFragmentLightivSGIX - .type bluegl_glFragmentLightivSGIX, %function -bluegl_glFragmentLightivSGIX: - adrp x16, :got:__blue_glCore_glFragmentLightivSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentLightivSGIX] + .global bluegl_glVertexAttribIPointer + .type bluegl_glVertexAttribIPointer, %function +bluegl_glVertexAttribIPointer: + adrp x16, :got:__blue_glCore_glVertexAttribIPointer + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribIPointer] ldr x16, [x16] br x16 - .size bluegl_glFragmentLightivSGIX, .-bluegl_glFragmentLightivSGIX + .size bluegl_glVertexAttribIPointer, .-bluegl_glVertexAttribIPointer .align 2 - .global bluegl_glProgramUniform3iv - .type bluegl_glProgramUniform3iv, %function -bluegl_glProgramUniform3iv: - adrp x16, :got:__blue_glCore_glProgramUniform3iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3iv] + .global bluegl_glGetVertexAttribIiv + .type bluegl_glGetVertexAttribIiv, %function +bluegl_glGetVertexAttribIiv: + adrp x16, :got:__blue_glCore_glGetVertexAttribIiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribIiv] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3iv, .-bluegl_glProgramUniform3iv + .size bluegl_glGetVertexAttribIiv, .-bluegl_glGetVertexAttribIiv .align 2 - .global bluegl_glIsQuery - .type bluegl_glIsQuery, %function -bluegl_glIsQuery: - adrp x16, :got:__blue_glCore_glIsQuery - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsQuery] + .global bluegl_glGetVertexAttribIuiv + .type bluegl_glGetVertexAttribIuiv, %function +bluegl_glGetVertexAttribIuiv: + adrp x16, :got:__blue_glCore_glGetVertexAttribIuiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribIuiv] ldr x16, [x16] br x16 - .size bluegl_glIsQuery, .-bluegl_glIsQuery + .size bluegl_glGetVertexAttribIuiv, .-bluegl_glGetVertexAttribIuiv .align 2 - .global bluegl_glVertexStream2sATI - .type bluegl_glVertexStream2sATI, %function -bluegl_glVertexStream2sATI: - adrp x16, :got:__blue_glCore_glVertexStream2sATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream2sATI] + .global bluegl_glVertexAttribI1i + .type bluegl_glVertexAttribI1i, %function +bluegl_glVertexAttribI1i: + adrp x16, :got:__blue_glCore_glVertexAttribI1i + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI1i] ldr x16, [x16] br x16 - .size bluegl_glVertexStream2sATI, .-bluegl_glVertexStream2sATI + .size bluegl_glVertexAttribI1i, .-bluegl_glVertexAttribI1i .align 2 - .global bluegl_glProgramUniform4iEXT - .type bluegl_glProgramUniform4iEXT, %function -bluegl_glProgramUniform4iEXT: - adrp x16, :got:__blue_glCore_glProgramUniform4iEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4iEXT] + .global bluegl_glVertexAttribI2i + .type bluegl_glVertexAttribI2i, %function +bluegl_glVertexAttribI2i: + adrp x16, :got:__blue_glCore_glVertexAttribI2i + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI2i] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4iEXT, .-bluegl_glProgramUniform4iEXT + .size bluegl_glVertexAttribI2i, .-bluegl_glVertexAttribI2i .align 2 - .global bluegl_glGetInvariantBooleanvEXT - .type bluegl_glGetInvariantBooleanvEXT, %function -bluegl_glGetInvariantBooleanvEXT: - adrp x16, :got:__blue_glCore_glGetInvariantBooleanvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInvariantBooleanvEXT] + .global bluegl_glVertexAttribI3i + .type bluegl_glVertexAttribI3i, %function +bluegl_glVertexAttribI3i: + adrp x16, :got:__blue_glCore_glVertexAttribI3i + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI3i] ldr x16, [x16] br x16 - .size bluegl_glGetInvariantBooleanvEXT, .-bluegl_glGetInvariantBooleanvEXT + .size bluegl_glVertexAttribI3i, .-bluegl_glVertexAttribI3i .align 2 - .global bluegl_glSecondaryColorFormatNV - .type bluegl_glSecondaryColorFormatNV, %function -bluegl_glSecondaryColorFormatNV: - adrp x16, :got:__blue_glCore_glSecondaryColorFormatNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColorFormatNV] + .global bluegl_glVertexAttribI4i + .type bluegl_glVertexAttribI4i, %function +bluegl_glVertexAttribI4i: + adrp x16, :got:__blue_glCore_glVertexAttribI4i + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4i] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColorFormatNV, .-bluegl_glSecondaryColorFormatNV + .size bluegl_glVertexAttribI4i, .-bluegl_glVertexAttribI4i .align 2 - .global bluegl_glVertexAttrib4fNV - .type bluegl_glVertexAttrib4fNV, %function -bluegl_glVertexAttrib4fNV: - adrp x16, :got:__blue_glCore_glVertexAttrib4fNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4fNV] + .global bluegl_glVertexAttribI1ui + .type bluegl_glVertexAttribI1ui, %function +bluegl_glVertexAttribI1ui: + adrp x16, :got:__blue_glCore_glVertexAttribI1ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI1ui] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4fNV, .-bluegl_glVertexAttrib4fNV + .size bluegl_glVertexAttribI1ui, .-bluegl_glVertexAttribI1ui .align 2 - .global bluegl_glColorFragmentOp1ATI - .type bluegl_glColorFragmentOp1ATI, %function -bluegl_glColorFragmentOp1ATI: - adrp x16, :got:__blue_glCore_glColorFragmentOp1ATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorFragmentOp1ATI] + .global bluegl_glVertexAttribI2ui + .type bluegl_glVertexAttribI2ui, %function +bluegl_glVertexAttribI2ui: + adrp x16, :got:__blue_glCore_glVertexAttribI2ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI2ui] ldr x16, [x16] br x16 - .size bluegl_glColorFragmentOp1ATI, .-bluegl_glColorFragmentOp1ATI + .size bluegl_glVertexAttribI2ui, .-bluegl_glVertexAttribI2ui .align 2 - .global bluegl_glTransformFeedbackBufferBase - .type bluegl_glTransformFeedbackBufferBase, %function -bluegl_glTransformFeedbackBufferBase: - adrp x16, :got:__blue_glCore_glTransformFeedbackBufferBase - ldr x16, [x16, #:got_lo12:__blue_glCore_glTransformFeedbackBufferBase] + .global bluegl_glVertexAttribI3ui + .type bluegl_glVertexAttribI3ui, %function +bluegl_glVertexAttribI3ui: + adrp x16, :got:__blue_glCore_glVertexAttribI3ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI3ui] ldr x16, [x16] br x16 - .size bluegl_glTransformFeedbackBufferBase, .-bluegl_glTransformFeedbackBufferBase + .size bluegl_glVertexAttribI3ui, .-bluegl_glVertexAttribI3ui .align 2 - .global bluegl_glGetTexParameteriv - .type bluegl_glGetTexParameteriv, %function -bluegl_glGetTexParameteriv: - adrp x16, :got:__blue_glCore_glGetTexParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexParameteriv] + .global bluegl_glVertexAttribI4ui + .type bluegl_glVertexAttribI4ui, %function +bluegl_glVertexAttribI4ui: + adrp x16, :got:__blue_glCore_glVertexAttribI4ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4ui] ldr x16, [x16] br x16 - .size bluegl_glGetTexParameteriv, .-bluegl_glGetTexParameteriv + .size bluegl_glVertexAttribI4ui, .-bluegl_glVertexAttribI4ui .align 2 - .global bluegl_glGetVertexAttribIiv - .type bluegl_glGetVertexAttribIiv, %function -bluegl_glGetVertexAttribIiv: - adrp x16, :got:__blue_glCore_glGetVertexAttribIiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribIiv] + .global bluegl_glVertexAttribI1iv + .type bluegl_glVertexAttribI1iv, %function +bluegl_glVertexAttribI1iv: + adrp x16, :got:__blue_glCore_glVertexAttribI1iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI1iv] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribIiv, .-bluegl_glGetVertexAttribIiv + .size bluegl_glVertexAttribI1iv, .-bluegl_glVertexAttribI1iv .align 2 - .global bluegl_glEndOcclusionQueryNV - .type bluegl_glEndOcclusionQueryNV, %function -bluegl_glEndOcclusionQueryNV: - adrp x16, :got:__blue_glCore_glEndOcclusionQueryNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glEndOcclusionQueryNV] + .global bluegl_glVertexAttribI2iv + .type bluegl_glVertexAttribI2iv, %function +bluegl_glVertexAttribI2iv: + adrp x16, :got:__blue_glCore_glVertexAttribI2iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI2iv] ldr x16, [x16] br x16 - .size bluegl_glEndOcclusionQueryNV, .-bluegl_glEndOcclusionQueryNV + .size bluegl_glVertexAttribI2iv, .-bluegl_glVertexAttribI2iv .align 2 - .global bluegl_glTransformFeedbackStreamAttribsNV - .type bluegl_glTransformFeedbackStreamAttribsNV, %function -bluegl_glTransformFeedbackStreamAttribsNV: - adrp x16, :got:__blue_glCore_glTransformFeedbackStreamAttribsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTransformFeedbackStreamAttribsNV] + .global bluegl_glVertexAttribI3iv + .type bluegl_glVertexAttribI3iv, %function +bluegl_glVertexAttribI3iv: + adrp x16, :got:__blue_glCore_glVertexAttribI3iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI3iv] ldr x16, [x16] br x16 - .size bluegl_glTransformFeedbackStreamAttribsNV, .-bluegl_glTransformFeedbackStreamAttribsNV + .size bluegl_glVertexAttribI3iv, .-bluegl_glVertexAttribI3iv .align 2 - .global bluegl_glGetQueryBufferObjecti64v - .type bluegl_glGetQueryBufferObjecti64v, %function -bluegl_glGetQueryBufferObjecti64v: - adrp x16, :got:__blue_glCore_glGetQueryBufferObjecti64v - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryBufferObjecti64v] + .global bluegl_glVertexAttribI4iv + .type bluegl_glVertexAttribI4iv, %function +bluegl_glVertexAttribI4iv: + adrp x16, :got:__blue_glCore_glVertexAttribI4iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4iv] ldr x16, [x16] br x16 - .size bluegl_glGetQueryBufferObjecti64v, .-bluegl_glGetQueryBufferObjecti64v + .size bluegl_glVertexAttribI4iv, .-bluegl_glVertexAttribI4iv .align 2 - .global bluegl_glStencilFillPathInstancedNV - .type bluegl_glStencilFillPathInstancedNV, %function -bluegl_glStencilFillPathInstancedNV: - adrp x16, :got:__blue_glCore_glStencilFillPathInstancedNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilFillPathInstancedNV] + .global bluegl_glVertexAttribI1uiv + .type bluegl_glVertexAttribI1uiv, %function +bluegl_glVertexAttribI1uiv: + adrp x16, :got:__blue_glCore_glVertexAttribI1uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI1uiv] ldr x16, [x16] br x16 - .size bluegl_glStencilFillPathInstancedNV, .-bluegl_glStencilFillPathInstancedNV + .size bluegl_glVertexAttribI1uiv, .-bluegl_glVertexAttribI1uiv .align 2 - .global bluegl_glDrawCommandsStatesNV - .type bluegl_glDrawCommandsStatesNV, %function -bluegl_glDrawCommandsStatesNV: - adrp x16, :got:__blue_glCore_glDrawCommandsStatesNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawCommandsStatesNV] + .global bluegl_glVertexAttribI2uiv + .type bluegl_glVertexAttribI2uiv, %function +bluegl_glVertexAttribI2uiv: + adrp x16, :got:__blue_glCore_glVertexAttribI2uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI2uiv] ldr x16, [x16] br x16 - .size bluegl_glDrawCommandsStatesNV, .-bluegl_glDrawCommandsStatesNV + .size bluegl_glVertexAttribI2uiv, .-bluegl_glVertexAttribI2uiv .align 2 - .global bluegl_glGetSamplerParameterfv - .type bluegl_glGetSamplerParameterfv, %function -bluegl_glGetSamplerParameterfv: - adrp x16, :got:__blue_glCore_glGetSamplerParameterfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSamplerParameterfv] + .global bluegl_glVertexAttribI3uiv + .type bluegl_glVertexAttribI3uiv, %function +bluegl_glVertexAttribI3uiv: + adrp x16, :got:__blue_glCore_glVertexAttribI3uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI3uiv] ldr x16, [x16] br x16 - .size bluegl_glGetSamplerParameterfv, .-bluegl_glGetSamplerParameterfv + .size bluegl_glVertexAttribI3uiv, .-bluegl_glVertexAttribI3uiv .align 2 - .global bluegl_glMultiTexCoord4fARB - .type bluegl_glMultiTexCoord4fARB, %function -bluegl_glMultiTexCoord4fARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord4fARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4fARB] + .global bluegl_glVertexAttribI4uiv + .type bluegl_glVertexAttribI4uiv, %function +bluegl_glVertexAttribI4uiv: + adrp x16, :got:__blue_glCore_glVertexAttribI4uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4uiv] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4fARB, .-bluegl_glMultiTexCoord4fARB + .size bluegl_glVertexAttribI4uiv, .-bluegl_glVertexAttribI4uiv .align 2 - .global bluegl_glUniform3ui64NV - .type bluegl_glUniform3ui64NV, %function -bluegl_glUniform3ui64NV: - adrp x16, :got:__blue_glCore_glUniform3ui64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3ui64NV] + .global bluegl_glVertexAttribI4bv + .type bluegl_glVertexAttribI4bv, %function +bluegl_glVertexAttribI4bv: + adrp x16, :got:__blue_glCore_glVertexAttribI4bv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4bv] ldr x16, [x16] br x16 - .size bluegl_glUniform3ui64NV, .-bluegl_glUniform3ui64NV + .size bluegl_glVertexAttribI4bv, .-bluegl_glVertexAttribI4bv .align 2 - .global bluegl_glVertexWeighthNV - .type bluegl_glVertexWeighthNV, %function -bluegl_glVertexWeighthNV: - adrp x16, :got:__blue_glCore_glVertexWeighthNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexWeighthNV] + .global bluegl_glVertexAttribI4sv + .type bluegl_glVertexAttribI4sv, %function +bluegl_glVertexAttribI4sv: + adrp x16, :got:__blue_glCore_glVertexAttribI4sv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4sv] ldr x16, [x16] br x16 - .size bluegl_glVertexWeighthNV, .-bluegl_glVertexWeighthNV + .size bluegl_glVertexAttribI4sv, .-bluegl_glVertexAttribI4sv .align 2 - .global bluegl_glWindowPos3ivARB - .type bluegl_glWindowPos3ivARB, %function -bluegl_glWindowPos3ivARB: - adrp x16, :got:__blue_glCore_glWindowPos3ivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3ivARB] + .global bluegl_glVertexAttribI4ubv + .type bluegl_glVertexAttribI4ubv, %function +bluegl_glVertexAttribI4ubv: + adrp x16, :got:__blue_glCore_glVertexAttribI4ubv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4ubv] + ldr x16, [x16] + br x16 + .size bluegl_glVertexAttribI4ubv, .-bluegl_glVertexAttribI4ubv + + .align 2 + .global bluegl_glVertexAttribI4usv + .type bluegl_glVertexAttribI4usv, %function +bluegl_glVertexAttribI4usv: + adrp x16, :got:__blue_glCore_glVertexAttribI4usv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4usv] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3ivARB, .-bluegl_glWindowPos3ivARB + .size bluegl_glVertexAttribI4usv, .-bluegl_glVertexAttribI4usv .align 2 - .global bluegl_glSecondaryColor3ivEXT - .type bluegl_glSecondaryColor3ivEXT, %function -bluegl_glSecondaryColor3ivEXT: - adrp x16, :got:__blue_glCore_glSecondaryColor3ivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3ivEXT] + .global bluegl_glGetUniformuiv + .type bluegl_glGetUniformuiv, %function +bluegl_glGetUniformuiv: + adrp x16, :got:__blue_glCore_glGetUniformuiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformuiv] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3ivEXT, .-bluegl_glSecondaryColor3ivEXT + .size bluegl_glGetUniformuiv, .-bluegl_glGetUniformuiv .align 2 - .global bluegl_glBindVertexArray - .type bluegl_glBindVertexArray, %function -bluegl_glBindVertexArray: - adrp x16, :got:__blue_glCore_glBindVertexArray - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindVertexArray] + .global bluegl_glBindFragDataLocation + .type bluegl_glBindFragDataLocation, %function +bluegl_glBindFragDataLocation: + adrp x16, :got:__blue_glCore_glBindFragDataLocation + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindFragDataLocation] ldr x16, [x16] br x16 - .size bluegl_glBindVertexArray, .-bluegl_glBindVertexArray + .size bluegl_glBindFragDataLocation, .-bluegl_glBindFragDataLocation .align 2 - .global bluegl_glGetVertexAttribLui64vARB - .type bluegl_glGetVertexAttribLui64vARB, %function -bluegl_glGetVertexAttribLui64vARB: - adrp x16, :got:__blue_glCore_glGetVertexAttribLui64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribLui64vARB] + .global bluegl_glGetFragDataLocation + .type bluegl_glGetFragDataLocation, %function +bluegl_glGetFragDataLocation: + adrp x16, :got:__blue_glCore_glGetFragDataLocation + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFragDataLocation] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribLui64vARB, .-bluegl_glGetVertexAttribLui64vARB + .size bluegl_glGetFragDataLocation, .-bluegl_glGetFragDataLocation .align 2 - .global bluegl_glUniform4i64NV - .type bluegl_glUniform4i64NV, %function -bluegl_glUniform4i64NV: - adrp x16, :got:__blue_glCore_glUniform4i64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4i64NV] + .global bluegl_glUniform1ui + .type bluegl_glUniform1ui, %function +bluegl_glUniform1ui: + adrp x16, :got:__blue_glCore_glUniform1ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1ui] ldr x16, [x16] br x16 - .size bluegl_glUniform4i64NV, .-bluegl_glUniform4i64NV + .size bluegl_glUniform1ui, .-bluegl_glUniform1ui .align 2 - .global bluegl_glBlendBarrierNV - .type bluegl_glBlendBarrierNV, %function -bluegl_glBlendBarrierNV: - adrp x16, :got:__blue_glCore_glBlendBarrierNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendBarrierNV] + .global bluegl_glUniform2ui + .type bluegl_glUniform2ui, %function +bluegl_glUniform2ui: + adrp x16, :got:__blue_glCore_glUniform2ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2ui] ldr x16, [x16] br x16 - .size bluegl_glBlendBarrierNV, .-bluegl_glBlendBarrierNV + .size bluegl_glUniform2ui, .-bluegl_glUniform2ui .align 2 - .global bluegl_glWindowPos3fvARB - .type bluegl_glWindowPos3fvARB, %function -bluegl_glWindowPos3fvARB: - adrp x16, :got:__blue_glCore_glWindowPos3fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3fvARB] + .global bluegl_glUniform3ui + .type bluegl_glUniform3ui, %function +bluegl_glUniform3ui: + adrp x16, :got:__blue_glCore_glUniform3ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3ui] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3fvARB, .-bluegl_glWindowPos3fvARB + .size bluegl_glUniform3ui, .-bluegl_glUniform3ui .align 2 - .global bluegl_glBlendEquationSeparateiARB - .type bluegl_glBlendEquationSeparateiARB, %function -bluegl_glBlendEquationSeparateiARB: - adrp x16, :got:__blue_glCore_glBlendEquationSeparateiARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquationSeparateiARB] + .global bluegl_glUniform4ui + .type bluegl_glUniform4ui, %function +bluegl_glUniform4ui: + adrp x16, :got:__blue_glCore_glUniform4ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4ui] ldr x16, [x16] br x16 - .size bluegl_glBlendEquationSeparateiARB, .-bluegl_glBlendEquationSeparateiARB + .size bluegl_glUniform4ui, .-bluegl_glUniform4ui .align 2 - .global bluegl_glGetVariantFloatvEXT - .type bluegl_glGetVariantFloatvEXT, %function -bluegl_glGetVariantFloatvEXT: - adrp x16, :got:__blue_glCore_glGetVariantFloatvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVariantFloatvEXT] + .global bluegl_glUniform1uiv + .type bluegl_glUniform1uiv, %function +bluegl_glUniform1uiv: + adrp x16, :got:__blue_glCore_glUniform1uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1uiv] ldr x16, [x16] br x16 - .size bluegl_glGetVariantFloatvEXT, .-bluegl_glGetVariantFloatvEXT + .size bluegl_glUniform1uiv, .-bluegl_glUniform1uiv .align 2 - .global bluegl_glColorSubTableEXT - .type bluegl_glColorSubTableEXT, %function -bluegl_glColorSubTableEXT: - adrp x16, :got:__blue_glCore_glColorSubTableEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorSubTableEXT] + .global bluegl_glUniform2uiv + .type bluegl_glUniform2uiv, %function +bluegl_glUniform2uiv: + adrp x16, :got:__blue_glCore_glUniform2uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2uiv] ldr x16, [x16] br x16 - .size bluegl_glColorSubTableEXT, .-bluegl_glColorSubTableEXT + .size bluegl_glUniform2uiv, .-bluegl_glUniform2uiv .align 2 - .global bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN - .type bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN, %function -bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN] + .global bluegl_glUniform3uiv + .type bluegl_glUniform3uiv, %function +bluegl_glUniform3uiv: + adrp x16, :got:__blue_glCore_glUniform3uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3uiv] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN, .-bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN + .size bluegl_glUniform3uiv, .-bluegl_glUniform3uiv .align 2 - .global bluegl_glGetProgramResourceiv - .type bluegl_glGetProgramResourceiv, %function -bluegl_glGetProgramResourceiv: - adrp x16, :got:__blue_glCore_glGetProgramResourceiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramResourceiv] + .global bluegl_glUniform4uiv + .type bluegl_glUniform4uiv, %function +bluegl_glUniform4uiv: + adrp x16, :got:__blue_glCore_glUniform4uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4uiv] ldr x16, [x16] br x16 - .size bluegl_glGetProgramResourceiv, .-bluegl_glGetProgramResourceiv + .size bluegl_glUniform4uiv, .-bluegl_glUniform4uiv .align 2 - .global bluegl_glMultiTexCoord1f - .type bluegl_glMultiTexCoord1f, %function -bluegl_glMultiTexCoord1f: - adrp x16, :got:__blue_glCore_glMultiTexCoord1f - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1f] + .global bluegl_glTexParameterIiv + .type bluegl_glTexParameterIiv, %function +bluegl_glTexParameterIiv: + adrp x16, :got:__blue_glCore_glTexParameterIiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameterIiv] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1f, .-bluegl_glMultiTexCoord1f + .size bluegl_glTexParameterIiv, .-bluegl_glTexParameterIiv .align 2 - .global bluegl_glGetNamedFramebufferAttachmentParameteriv - .type bluegl_glGetNamedFramebufferAttachmentParameteriv, %function -bluegl_glGetNamedFramebufferAttachmentParameteriv: - adrp x16, :got:__blue_glCore_glGetNamedFramebufferAttachmentParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedFramebufferAttachmentParameteriv] + .global bluegl_glTexParameterIuiv + .type bluegl_glTexParameterIuiv, %function +bluegl_glTexParameterIuiv: + adrp x16, :got:__blue_glCore_glTexParameterIuiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameterIuiv] ldr x16, [x16] br x16 - .size bluegl_glGetNamedFramebufferAttachmentParameteriv, .-bluegl_glGetNamedFramebufferAttachmentParameteriv + .size bluegl_glTexParameterIuiv, .-bluegl_glTexParameterIuiv .align 2 - .global bluegl_glDeleteProgramsNV - .type bluegl_glDeleteProgramsNV, %function -bluegl_glDeleteProgramsNV: - adrp x16, :got:__blue_glCore_glDeleteProgramsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteProgramsNV] + .global bluegl_glGetTexParameterIiv + .type bluegl_glGetTexParameterIiv, %function +bluegl_glGetTexParameterIiv: + adrp x16, :got:__blue_glCore_glGetTexParameterIiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexParameterIiv] ldr x16, [x16] br x16 - .size bluegl_glDeleteProgramsNV, .-bluegl_glDeleteProgramsNV + .size bluegl_glGetTexParameterIiv, .-bluegl_glGetTexParameterIiv .align 2 - .global bluegl_glGlobalAlphaFactoriSUN - .type bluegl_glGlobalAlphaFactoriSUN, %function -bluegl_glGlobalAlphaFactoriSUN: - adrp x16, :got:__blue_glCore_glGlobalAlphaFactoriSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glGlobalAlphaFactoriSUN] + .global bluegl_glGetTexParameterIuiv + .type bluegl_glGetTexParameterIuiv, %function +bluegl_glGetTexParameterIuiv: + adrp x16, :got:__blue_glCore_glGetTexParameterIuiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexParameterIuiv] ldr x16, [x16] br x16 - .size bluegl_glGlobalAlphaFactoriSUN, .-bluegl_glGlobalAlphaFactoriSUN + .size bluegl_glGetTexParameterIuiv, .-bluegl_glGetTexParameterIuiv .align 2 - .global bluegl_glGetFinalCombinerInputParameterfvNV - .type bluegl_glGetFinalCombinerInputParameterfvNV, %function -bluegl_glGetFinalCombinerInputParameterfvNV: - adrp x16, :got:__blue_glCore_glGetFinalCombinerInputParameterfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFinalCombinerInputParameterfvNV] + .global bluegl_glClearBufferiv + .type bluegl_glClearBufferiv, %function +bluegl_glClearBufferiv: + adrp x16, :got:__blue_glCore_glClearBufferiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearBufferiv] ldr x16, [x16] br x16 - .size bluegl_glGetFinalCombinerInputParameterfvNV, .-bluegl_glGetFinalCombinerInputParameterfvNV + .size bluegl_glClearBufferiv, .-bluegl_glClearBufferiv .align 2 - .global bluegl_glNormalStream3dATI - .type bluegl_glNormalStream3dATI, %function -bluegl_glNormalStream3dATI: - adrp x16, :got:__blue_glCore_glNormalStream3dATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3dATI] + .global bluegl_glClearBufferuiv + .type bluegl_glClearBufferuiv, %function +bluegl_glClearBufferuiv: + adrp x16, :got:__blue_glCore_glClearBufferuiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearBufferuiv] ldr x16, [x16] br x16 - .size bluegl_glNormalStream3dATI, .-bluegl_glNormalStream3dATI + .size bluegl_glClearBufferuiv, .-bluegl_glClearBufferuiv .align 2 - .global bluegl_glMultiTexEnvivEXT - .type bluegl_glMultiTexEnvivEXT, %function -bluegl_glMultiTexEnvivEXT: - adrp x16, :got:__blue_glCore_glMultiTexEnvivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexEnvivEXT] + .global bluegl_glClearBufferfv + .type bluegl_glClearBufferfv, %function +bluegl_glClearBufferfv: + adrp x16, :got:__blue_glCore_glClearBufferfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearBufferfv] ldr x16, [x16] br x16 - .size bluegl_glMultiTexEnvivEXT, .-bluegl_glMultiTexEnvivEXT + .size bluegl_glClearBufferfv, .-bluegl_glClearBufferfv .align 2 - .global bluegl_glTexCoord4xvOES - .type bluegl_glTexCoord4xvOES, %function -bluegl_glTexCoord4xvOES: - adrp x16, :got:__blue_glCore_glTexCoord4xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord4xvOES] + .global bluegl_glClearBufferfi + .type bluegl_glClearBufferfi, %function +bluegl_glClearBufferfi: + adrp x16, :got:__blue_glCore_glClearBufferfi + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearBufferfi] ldr x16, [x16] br x16 - .size bluegl_glTexCoord4xvOES, .-bluegl_glTexCoord4xvOES + .size bluegl_glClearBufferfi, .-bluegl_glClearBufferfi .align 2 - .global bluegl_glProgramUniform4dvEXT - .type bluegl_glProgramUniform4dvEXT, %function -bluegl_glProgramUniform4dvEXT: - adrp x16, :got:__blue_glCore_glProgramUniform4dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4dvEXT] + .global bluegl_glGetStringi + .type bluegl_glGetStringi, %function +bluegl_glGetStringi: + adrp x16, :got:__blue_glCore_glGetStringi + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetStringi] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4dvEXT, .-bluegl_glProgramUniform4dvEXT + .size bluegl_glGetStringi, .-bluegl_glGetStringi .align 2 - .global bluegl_glProgramUniform2ui64vARB - .type bluegl_glProgramUniform2ui64vARB, %function -bluegl_glProgramUniform2ui64vARB: - adrp x16, :got:__blue_glCore_glProgramUniform2ui64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2ui64vARB] + .global bluegl_glIsRenderbuffer + .type bluegl_glIsRenderbuffer, %function +bluegl_glIsRenderbuffer: + adrp x16, :got:__blue_glCore_glIsRenderbuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsRenderbuffer] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2ui64vARB, .-bluegl_glProgramUniform2ui64vARB + .size bluegl_glIsRenderbuffer, .-bluegl_glIsRenderbuffer .align 2 - .global bluegl_glBindBufferBaseNV - .type bluegl_glBindBufferBaseNV, %function -bluegl_glBindBufferBaseNV: - adrp x16, :got:__blue_glCore_glBindBufferBaseNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBufferBaseNV] + .global bluegl_glBindRenderbuffer + .type bluegl_glBindRenderbuffer, %function +bluegl_glBindRenderbuffer: + adrp x16, :got:__blue_glCore_glBindRenderbuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindRenderbuffer] ldr x16, [x16] br x16 - .size bluegl_glBindBufferBaseNV, .-bluegl_glBindBufferBaseNV + .size bluegl_glBindRenderbuffer, .-bluegl_glBindRenderbuffer .align 2 - .global bluegl_glVertexAttrib4s - .type bluegl_glVertexAttrib4s, %function -bluegl_glVertexAttrib4s: - adrp x16, :got:__blue_glCore_glVertexAttrib4s - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4s] + .global bluegl_glDeleteRenderbuffers + .type bluegl_glDeleteRenderbuffers, %function +bluegl_glDeleteRenderbuffers: + adrp x16, :got:__blue_glCore_glDeleteRenderbuffers + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteRenderbuffers] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4s, .-bluegl_glVertexAttrib4s + .size bluegl_glDeleteRenderbuffers, .-bluegl_glDeleteRenderbuffers .align 2 - .global bluegl_glTexCoord2fVertex3fvSUN - .type bluegl_glTexCoord2fVertex3fvSUN, %function -bluegl_glTexCoord2fVertex3fvSUN: - adrp x16, :got:__blue_glCore_glTexCoord2fVertex3fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fVertex3fvSUN] + .global bluegl_glGenRenderbuffers + .type bluegl_glGenRenderbuffers, %function +bluegl_glGenRenderbuffers: + adrp x16, :got:__blue_glCore_glGenRenderbuffers + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenRenderbuffers] ldr x16, [x16] br x16 - .size bluegl_glTexCoord2fVertex3fvSUN, .-bluegl_glTexCoord2fVertex3fvSUN + .size bluegl_glGenRenderbuffers, .-bluegl_glGenRenderbuffers .align 2 - .global bluegl_glMatrixMultdEXT - .type bluegl_glMatrixMultdEXT, %function -bluegl_glMatrixMultdEXT: - adrp x16, :got:__blue_glCore_glMatrixMultdEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixMultdEXT] + .global bluegl_glRenderbufferStorage + .type bluegl_glRenderbufferStorage, %function +bluegl_glRenderbufferStorage: + adrp x16, :got:__blue_glCore_glRenderbufferStorage + ldr x16, [x16, #:got_lo12:__blue_glCore_glRenderbufferStorage] ldr x16, [x16] br x16 - .size bluegl_glMatrixMultdEXT, .-bluegl_glMatrixMultdEXT + .size bluegl_glRenderbufferStorage, .-bluegl_glRenderbufferStorage .align 2 - .global bluegl_glGetnMapdvARB - .type bluegl_glGetnMapdvARB, %function -bluegl_glGetnMapdvARB: - adrp x16, :got:__blue_glCore_glGetnMapdvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnMapdvARB] + .global bluegl_glGetRenderbufferParameteriv + .type bluegl_glGetRenderbufferParameteriv, %function +bluegl_glGetRenderbufferParameteriv: + adrp x16, :got:__blue_glCore_glGetRenderbufferParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetRenderbufferParameteriv] ldr x16, [x16] br x16 - .size bluegl_glGetnMapdvARB, .-bluegl_glGetnMapdvARB + .size bluegl_glGetRenderbufferParameteriv, .-bluegl_glGetRenderbufferParameteriv .align 2 - .global bluegl_glEnableVertexArrayEXT - .type bluegl_glEnableVertexArrayEXT, %function -bluegl_glEnableVertexArrayEXT: - adrp x16, :got:__blue_glCore_glEnableVertexArrayEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableVertexArrayEXT] + .global bluegl_glIsFramebuffer + .type bluegl_glIsFramebuffer, %function +bluegl_glIsFramebuffer: + adrp x16, :got:__blue_glCore_glIsFramebuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsFramebuffer] ldr x16, [x16] br x16 - .size bluegl_glEnableVertexArrayEXT, .-bluegl_glEnableVertexArrayEXT + .size bluegl_glIsFramebuffer, .-bluegl_glIsFramebuffer .align 2 - .global bluegl_glConvolutionFilter1DEXT - .type bluegl_glConvolutionFilter1DEXT, %function -bluegl_glConvolutionFilter1DEXT: - adrp x16, :got:__blue_glCore_glConvolutionFilter1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionFilter1DEXT] + .global bluegl_glBindFramebuffer + .type bluegl_glBindFramebuffer, %function +bluegl_glBindFramebuffer: + adrp x16, :got:__blue_glCore_glBindFramebuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindFramebuffer] ldr x16, [x16] br x16 - .size bluegl_glConvolutionFilter1DEXT, .-bluegl_glConvolutionFilter1DEXT + .size bluegl_glBindFramebuffer, .-bluegl_glBindFramebuffer .align 2 - .global bluegl_glMemoryBarrierEXT - .type bluegl_glMemoryBarrierEXT, %function -bluegl_glMemoryBarrierEXT: - adrp x16, :got:__blue_glCore_glMemoryBarrierEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMemoryBarrierEXT] + .global bluegl_glDeleteFramebuffers + .type bluegl_glDeleteFramebuffers, %function +bluegl_glDeleteFramebuffers: + adrp x16, :got:__blue_glCore_glDeleteFramebuffers + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteFramebuffers] ldr x16, [x16] br x16 - .size bluegl_glMemoryBarrierEXT, .-bluegl_glMemoryBarrierEXT + .size bluegl_glDeleteFramebuffers, .-bluegl_glDeleteFramebuffers .align 2 - .global bluegl_glNewObjectBufferATI - .type bluegl_glNewObjectBufferATI, %function -bluegl_glNewObjectBufferATI: - adrp x16, :got:__blue_glCore_glNewObjectBufferATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glNewObjectBufferATI] + .global bluegl_glGenFramebuffers + .type bluegl_glGenFramebuffers, %function +bluegl_glGenFramebuffers: + adrp x16, :got:__blue_glCore_glGenFramebuffers + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenFramebuffers] ldr x16, [x16] br x16 - .size bluegl_glNewObjectBufferATI, .-bluegl_glNewObjectBufferATI + .size bluegl_glGenFramebuffers, .-bluegl_glGenFramebuffers .align 2 - .global bluegl_glProgramUniform2fv - .type bluegl_glProgramUniform2fv, %function -bluegl_glProgramUniform2fv: - adrp x16, :got:__blue_glCore_glProgramUniform2fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2fv] + .global bluegl_glCheckFramebufferStatus + .type bluegl_glCheckFramebufferStatus, %function +bluegl_glCheckFramebufferStatus: + adrp x16, :got:__blue_glCore_glCheckFramebufferStatus + ldr x16, [x16, #:got_lo12:__blue_glCore_glCheckFramebufferStatus] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2fv, .-bluegl_glProgramUniform2fv + .size bluegl_glCheckFramebufferStatus, .-bluegl_glCheckFramebufferStatus .align 2 - .global bluegl_glUniformMatrix4x3fv - .type bluegl_glUniformMatrix4x3fv, %function -bluegl_glUniformMatrix4x3fv: - adrp x16, :got:__blue_glCore_glUniformMatrix4x3fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix4x3fv] + .global bluegl_glFramebufferTexture1D + .type bluegl_glFramebufferTexture1D, %function +bluegl_glFramebufferTexture1D: + adrp x16, :got:__blue_glCore_glFramebufferTexture1D + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTexture1D] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix4x3fv, .-bluegl_glUniformMatrix4x3fv + .size bluegl_glFramebufferTexture1D, .-bluegl_glFramebufferTexture1D .align 2 - .global bluegl_glGetHistogramParameterfv - .type bluegl_glGetHistogramParameterfv, %function -bluegl_glGetHistogramParameterfv: - adrp x16, :got:__blue_glCore_glGetHistogramParameterfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetHistogramParameterfv] + .global bluegl_glFramebufferTexture2D + .type bluegl_glFramebufferTexture2D, %function +bluegl_glFramebufferTexture2D: + adrp x16, :got:__blue_glCore_glFramebufferTexture2D + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTexture2D] ldr x16, [x16] br x16 - .size bluegl_glGetHistogramParameterfv, .-bluegl_glGetHistogramParameterfv + .size bluegl_glFramebufferTexture2D, .-bluegl_glFramebufferTexture2D .align 2 - .global bluegl_glFrameTerminatorGREMEDY - .type bluegl_glFrameTerminatorGREMEDY, %function -bluegl_glFrameTerminatorGREMEDY: - adrp x16, :got:__blue_glCore_glFrameTerminatorGREMEDY - ldr x16, [x16, #:got_lo12:__blue_glCore_glFrameTerminatorGREMEDY] + .global bluegl_glFramebufferTexture3D + .type bluegl_glFramebufferTexture3D, %function +bluegl_glFramebufferTexture3D: + adrp x16, :got:__blue_glCore_glFramebufferTexture3D + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTexture3D] ldr x16, [x16] br x16 - .size bluegl_glFrameTerminatorGREMEDY, .-bluegl_glFrameTerminatorGREMEDY + .size bluegl_glFramebufferTexture3D, .-bluegl_glFramebufferTexture3D .align 2 - .global bluegl_glGetProgramLocalParameterfvARB - .type bluegl_glGetProgramLocalParameterfvARB, %function -bluegl_glGetProgramLocalParameterfvARB: - adrp x16, :got:__blue_glCore_glGetProgramLocalParameterfvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramLocalParameterfvARB] + .global bluegl_glFramebufferRenderbuffer + .type bluegl_glFramebufferRenderbuffer, %function +bluegl_glFramebufferRenderbuffer: + adrp x16, :got:__blue_glCore_glFramebufferRenderbuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferRenderbuffer] ldr x16, [x16] br x16 - .size bluegl_glGetProgramLocalParameterfvARB, .-bluegl_glGetProgramLocalParameterfvARB + .size bluegl_glFramebufferRenderbuffer, .-bluegl_glFramebufferRenderbuffer .align 2 - .global bluegl_glUnmapNamedBuffer - .type bluegl_glUnmapNamedBuffer, %function -bluegl_glUnmapNamedBuffer: - adrp x16, :got:__blue_glCore_glUnmapNamedBuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glUnmapNamedBuffer] + .global bluegl_glGetFramebufferAttachmentParameteriv + .type bluegl_glGetFramebufferAttachmentParameteriv, %function +bluegl_glGetFramebufferAttachmentParameteriv: + adrp x16, :got:__blue_glCore_glGetFramebufferAttachmentParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFramebufferAttachmentParameteriv] ldr x16, [x16] br x16 - .size bluegl_glUnmapNamedBuffer, .-bluegl_glUnmapNamedBuffer + .size bluegl_glGetFramebufferAttachmentParameteriv, .-bluegl_glGetFramebufferAttachmentParameteriv .align 2 - .global bluegl_glWindowPos2svARB - .type bluegl_glWindowPos2svARB, %function -bluegl_glWindowPos2svARB: - adrp x16, :got:__blue_glCore_glWindowPos2svARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2svARB] + .global bluegl_glGenerateMipmap + .type bluegl_glGenerateMipmap, %function +bluegl_glGenerateMipmap: + adrp x16, :got:__blue_glCore_glGenerateMipmap + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenerateMipmap] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2svARB, .-bluegl_glWindowPos2svARB + .size bluegl_glGenerateMipmap, .-bluegl_glGenerateMipmap .align 2 - .global bluegl_glBindTextureEXT - .type bluegl_glBindTextureEXT, %function -bluegl_glBindTextureEXT: - adrp x16, :got:__blue_glCore_glBindTextureEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindTextureEXT] + .global bluegl_glBlitFramebuffer + .type bluegl_glBlitFramebuffer, %function +bluegl_glBlitFramebuffer: + adrp x16, :got:__blue_glCore_glBlitFramebuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlitFramebuffer] ldr x16, [x16] br x16 - .size bluegl_glBindTextureEXT, .-bluegl_glBindTextureEXT + .size bluegl_glBlitFramebuffer, .-bluegl_glBlitFramebuffer .align 2 - .global bluegl_glVertexAttrib4svNV - .type bluegl_glVertexAttrib4svNV, %function -bluegl_glVertexAttrib4svNV: - adrp x16, :got:__blue_glCore_glVertexAttrib4svNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4svNV] + .global bluegl_glRenderbufferStorageMultisample + .type bluegl_glRenderbufferStorageMultisample, %function +bluegl_glRenderbufferStorageMultisample: + adrp x16, :got:__blue_glCore_glRenderbufferStorageMultisample + ldr x16, [x16, #:got_lo12:__blue_glCore_glRenderbufferStorageMultisample] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4svNV, .-bluegl_glVertexAttrib4svNV + .size bluegl_glRenderbufferStorageMultisample, .-bluegl_glRenderbufferStorageMultisample .align 2 - .global bluegl_glPointParameterfSGIS - .type bluegl_glPointParameterfSGIS, %function -bluegl_glPointParameterfSGIS: - adrp x16, :got:__blue_glCore_glPointParameterfSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterfSGIS] + .global bluegl_glFramebufferTextureLayer + .type bluegl_glFramebufferTextureLayer, %function +bluegl_glFramebufferTextureLayer: + adrp x16, :got:__blue_glCore_glFramebufferTextureLayer + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTextureLayer] ldr x16, [x16] br x16 - .size bluegl_glPointParameterfSGIS, .-bluegl_glPointParameterfSGIS + .size bluegl_glFramebufferTextureLayer, .-bluegl_glFramebufferTextureLayer .align 2 - .global bluegl_glSecondaryColor3hvNV - .type bluegl_glSecondaryColor3hvNV, %function -bluegl_glSecondaryColor3hvNV: - adrp x16, :got:__blue_glCore_glSecondaryColor3hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3hvNV] + .global bluegl_glMapBufferRange + .type bluegl_glMapBufferRange, %function +bluegl_glMapBufferRange: + adrp x16, :got:__blue_glCore_glMapBufferRange + ldr x16, [x16, #:got_lo12:__blue_glCore_glMapBufferRange] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3hvNV, .-bluegl_glSecondaryColor3hvNV + .size bluegl_glMapBufferRange, .-bluegl_glMapBufferRange .align 2 - .global bluegl_glColorTableParameterfv - .type bluegl_glColorTableParameterfv, %function -bluegl_glColorTableParameterfv: - adrp x16, :got:__blue_glCore_glColorTableParameterfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorTableParameterfv] + .global bluegl_glFlushMappedBufferRange + .type bluegl_glFlushMappedBufferRange, %function +bluegl_glFlushMappedBufferRange: + adrp x16, :got:__blue_glCore_glFlushMappedBufferRange + ldr x16, [x16, #:got_lo12:__blue_glCore_glFlushMappedBufferRange] + ldr x16, [x16] + br x16 + .size bluegl_glFlushMappedBufferRange, .-bluegl_glFlushMappedBufferRange + + .align 2 + .global bluegl_glBindVertexArray + .type bluegl_glBindVertexArray, %function +bluegl_glBindVertexArray: + adrp x16, :got:__blue_glCore_glBindVertexArray + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindVertexArray] ldr x16, [x16] br x16 - .size bluegl_glColorTableParameterfv, .-bluegl_glColorTableParameterfv + .size bluegl_glBindVertexArray, .-bluegl_glBindVertexArray .align 2 - .global bluegl_glNamedProgramLocalParameter4fEXT - .type bluegl_glNamedProgramLocalParameter4fEXT, %function -bluegl_glNamedProgramLocalParameter4fEXT: - adrp x16, :got:__blue_glCore_glNamedProgramLocalParameter4fEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParameter4fEXT] + .global bluegl_glDeleteVertexArrays + .type bluegl_glDeleteVertexArrays, %function +bluegl_glDeleteVertexArrays: + adrp x16, :got:__blue_glCore_glDeleteVertexArrays + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteVertexArrays] ldr x16, [x16] br x16 - .size bluegl_glNamedProgramLocalParameter4fEXT, .-bluegl_glNamedProgramLocalParameter4fEXT + .size bluegl_glDeleteVertexArrays, .-bluegl_glDeleteVertexArrays .align 2 - .global bluegl_glGetTextureParameterivEXT - .type bluegl_glGetTextureParameterivEXT, %function -bluegl_glGetTextureParameterivEXT: - adrp x16, :got:__blue_glCore_glGetTextureParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureParameterivEXT] + .global bluegl_glGenVertexArrays + .type bluegl_glGenVertexArrays, %function +bluegl_glGenVertexArrays: + adrp x16, :got:__blue_glCore_glGenVertexArrays + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenVertexArrays] ldr x16, [x16] br x16 - .size bluegl_glGetTextureParameterivEXT, .-bluegl_glGetTextureParameterivEXT + .size bluegl_glGenVertexArrays, .-bluegl_glGenVertexArrays .align 2 - .global bluegl_glTestObjectAPPLE - .type bluegl_glTestObjectAPPLE, %function -bluegl_glTestObjectAPPLE: - adrp x16, :got:__blue_glCore_glTestObjectAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glTestObjectAPPLE] + .global bluegl_glIsVertexArray + .type bluegl_glIsVertexArray, %function +bluegl_glIsVertexArray: + adrp x16, :got:__blue_glCore_glIsVertexArray + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsVertexArray] ldr x16, [x16] br x16 - .size bluegl_glTestObjectAPPLE, .-bluegl_glTestObjectAPPLE + .size bluegl_glIsVertexArray, .-bluegl_glIsVertexArray .align 2 - .global bluegl_glGetIntegerui64vNV - .type bluegl_glGetIntegerui64vNV, %function -bluegl_glGetIntegerui64vNV: - adrp x16, :got:__blue_glCore_glGetIntegerui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetIntegerui64vNV] + .global bluegl_glDrawArraysInstanced + .type bluegl_glDrawArraysInstanced, %function +bluegl_glDrawArraysInstanced: + adrp x16, :got:__blue_glCore_glDrawArraysInstanced + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawArraysInstanced] ldr x16, [x16] br x16 - .size bluegl_glGetIntegerui64vNV, .-bluegl_glGetIntegerui64vNV + .size bluegl_glDrawArraysInstanced, .-bluegl_glDrawArraysInstanced .align 2 - .global bluegl_glIsVertexAttribEnabledAPPLE - .type bluegl_glIsVertexAttribEnabledAPPLE, %function -bluegl_glIsVertexAttribEnabledAPPLE: - adrp x16, :got:__blue_glCore_glIsVertexAttribEnabledAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsVertexAttribEnabledAPPLE] + .global bluegl_glDrawElementsInstanced + .type bluegl_glDrawElementsInstanced, %function +bluegl_glDrawElementsInstanced: + adrp x16, :got:__blue_glCore_glDrawElementsInstanced + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementsInstanced] ldr x16, [x16] br x16 - .size bluegl_glIsVertexAttribEnabledAPPLE, .-bluegl_glIsVertexAttribEnabledAPPLE + .size bluegl_glDrawElementsInstanced, .-bluegl_glDrawElementsInstanced .align 2 - .global bluegl_glActiveTextureARB - .type bluegl_glActiveTextureARB, %function -bluegl_glActiveTextureARB: - adrp x16, :got:__blue_glCore_glActiveTextureARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glActiveTextureARB] + .global bluegl_glTexBuffer + .type bluegl_glTexBuffer, %function +bluegl_glTexBuffer: + adrp x16, :got:__blue_glCore_glTexBuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexBuffer] ldr x16, [x16] br x16 - .size bluegl_glActiveTextureARB, .-bluegl_glActiveTextureARB + .size bluegl_glTexBuffer, .-bluegl_glTexBuffer .align 2 - .global bluegl_glVertexAttrib3dARB - .type bluegl_glVertexAttrib3dARB, %function -bluegl_glVertexAttrib3dARB: - adrp x16, :got:__blue_glCore_glVertexAttrib3dARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3dARB] + .global bluegl_glPrimitiveRestartIndex + .type bluegl_glPrimitiveRestartIndex, %function +bluegl_glPrimitiveRestartIndex: + adrp x16, :got:__blue_glCore_glPrimitiveRestartIndex + ldr x16, [x16, #:got_lo12:__blue_glCore_glPrimitiveRestartIndex] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3dARB, .-bluegl_glVertexAttrib3dARB + .size bluegl_glPrimitiveRestartIndex, .-bluegl_glPrimitiveRestartIndex .align 2 - .global bluegl_glGetTextureHandleARB - .type bluegl_glGetTextureHandleARB, %function -bluegl_glGetTextureHandleARB: - adrp x16, :got:__blue_glCore_glGetTextureHandleARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureHandleARB] + .global bluegl_glCopyBufferSubData + .type bluegl_glCopyBufferSubData, %function +bluegl_glCopyBufferSubData: + adrp x16, :got:__blue_glCore_glCopyBufferSubData + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyBufferSubData] ldr x16, [x16] br x16 - .size bluegl_glGetTextureHandleARB, .-bluegl_glGetTextureHandleARB + .size bluegl_glCopyBufferSubData, .-bluegl_glCopyBufferSubData .align 2 - .global bluegl_glGetColorTableEXT - .type bluegl_glGetColorTableEXT, %function -bluegl_glGetColorTableEXT: - adrp x16, :got:__blue_glCore_glGetColorTableEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetColorTableEXT] + .global bluegl_glGetUniformIndices + .type bluegl_glGetUniformIndices, %function +bluegl_glGetUniformIndices: + adrp x16, :got:__blue_glCore_glGetUniformIndices + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformIndices] ldr x16, [x16] br x16 - .size bluegl_glGetColorTableEXT, .-bluegl_glGetColorTableEXT + .size bluegl_glGetUniformIndices, .-bluegl_glGetUniformIndices .align 2 - .global bluegl_glDrawArraysEXT - .type bluegl_glDrawArraysEXT, %function -bluegl_glDrawArraysEXT: - adrp x16, :got:__blue_glCore_glDrawArraysEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawArraysEXT] + .global bluegl_glGetActiveUniformsiv + .type bluegl_glGetActiveUniformsiv, %function +bluegl_glGetActiveUniformsiv: + adrp x16, :got:__blue_glCore_glGetActiveUniformsiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveUniformsiv] ldr x16, [x16] br x16 - .size bluegl_glDrawArraysEXT, .-bluegl_glDrawArraysEXT + .size bluegl_glGetActiveUniformsiv, .-bluegl_glGetActiveUniformsiv .align 2 - .global bluegl_glImageTransformParameterfHP - .type bluegl_glImageTransformParameterfHP, %function -bluegl_glImageTransformParameterfHP: - adrp x16, :got:__blue_glCore_glImageTransformParameterfHP - ldr x16, [x16, #:got_lo12:__blue_glCore_glImageTransformParameterfHP] + .global bluegl_glGetActiveUniformName + .type bluegl_glGetActiveUniformName, %function +bluegl_glGetActiveUniformName: + adrp x16, :got:__blue_glCore_glGetActiveUniformName + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveUniformName] ldr x16, [x16] br x16 - .size bluegl_glImageTransformParameterfHP, .-bluegl_glImageTransformParameterfHP + .size bluegl_glGetActiveUniformName, .-bluegl_glGetActiveUniformName .align 2 - .global bluegl_glActiveStencilFaceEXT - .type bluegl_glActiveStencilFaceEXT, %function -bluegl_glActiveStencilFaceEXT: - adrp x16, :got:__blue_glCore_glActiveStencilFaceEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glActiveStencilFaceEXT] + .global bluegl_glGetUniformBlockIndex + .type bluegl_glGetUniformBlockIndex, %function +bluegl_glGetUniformBlockIndex: + adrp x16, :got:__blue_glCore_glGetUniformBlockIndex + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformBlockIndex] ldr x16, [x16] br x16 - .size bluegl_glActiveStencilFaceEXT, .-bluegl_glActiveStencilFaceEXT + .size bluegl_glGetUniformBlockIndex, .-bluegl_glGetUniformBlockIndex .align 2 - .global bluegl_glUniformMatrix3x4dv - .type bluegl_glUniformMatrix3x4dv, %function -bluegl_glUniformMatrix3x4dv: - adrp x16, :got:__blue_glCore_glUniformMatrix3x4dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix3x4dv] + .global bluegl_glGetActiveUniformBlockiv + .type bluegl_glGetActiveUniformBlockiv, %function +bluegl_glGetActiveUniformBlockiv: + adrp x16, :got:__blue_glCore_glGetActiveUniformBlockiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveUniformBlockiv] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix3x4dv, .-bluegl_glUniformMatrix3x4dv + .size bluegl_glGetActiveUniformBlockiv, .-bluegl_glGetActiveUniformBlockiv .align 2 - .global bluegl_glProgramUniform4i64ARB - .type bluegl_glProgramUniform4i64ARB, %function -bluegl_glProgramUniform4i64ARB: - adrp x16, :got:__blue_glCore_glProgramUniform4i64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4i64ARB] + .global bluegl_glGetActiveUniformBlockName + .type bluegl_glGetActiveUniformBlockName, %function +bluegl_glGetActiveUniformBlockName: + adrp x16, :got:__blue_glCore_glGetActiveUniformBlockName + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveUniformBlockName] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4i64ARB, .-bluegl_glProgramUniform4i64ARB + .size bluegl_glGetActiveUniformBlockName, .-bluegl_glGetActiveUniformBlockName .align 2 - .global bluegl_glUniform3iv - .type bluegl_glUniform3iv, %function -bluegl_glUniform3iv: - adrp x16, :got:__blue_glCore_glUniform3iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3iv] + .global bluegl_glUniformBlockBinding + .type bluegl_glUniformBlockBinding, %function +bluegl_glUniformBlockBinding: + adrp x16, :got:__blue_glCore_glUniformBlockBinding + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformBlockBinding] ldr x16, [x16] br x16 - .size bluegl_glUniform3iv, .-bluegl_glUniform3iv + .size bluegl_glUniformBlockBinding, .-bluegl_glUniformBlockBinding .align 2 - .global bluegl_glGetPerfMonitorCountersAMD - .type bluegl_glGetPerfMonitorCountersAMD, %function -bluegl_glGetPerfMonitorCountersAMD: - adrp x16, :got:__blue_glCore_glGetPerfMonitorCountersAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfMonitorCountersAMD] + .global bluegl_glDrawElementsBaseVertex + .type bluegl_glDrawElementsBaseVertex, %function +bluegl_glDrawElementsBaseVertex: + adrp x16, :got:__blue_glCore_glDrawElementsBaseVertex + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementsBaseVertex] ldr x16, [x16] br x16 - .size bluegl_glGetPerfMonitorCountersAMD, .-bluegl_glGetPerfMonitorCountersAMD + .size bluegl_glDrawElementsBaseVertex, .-bluegl_glDrawElementsBaseVertex .align 2 - .global bluegl_glFinishFenceAPPLE - .type bluegl_glFinishFenceAPPLE, %function -bluegl_glFinishFenceAPPLE: - adrp x16, :got:__blue_glCore_glFinishFenceAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glFinishFenceAPPLE] + .global bluegl_glDrawRangeElementsBaseVertex + .type bluegl_glDrawRangeElementsBaseVertex, %function +bluegl_glDrawRangeElementsBaseVertex: + adrp x16, :got:__blue_glCore_glDrawRangeElementsBaseVertex + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawRangeElementsBaseVertex] ldr x16, [x16] br x16 - .size bluegl_glFinishFenceAPPLE, .-bluegl_glFinishFenceAPPLE + .size bluegl_glDrawRangeElementsBaseVertex, .-bluegl_glDrawRangeElementsBaseVertex .align 2 - .global bluegl_glUniform4ivARB - .type bluegl_glUniform4ivARB, %function -bluegl_glUniform4ivARB: - adrp x16, :got:__blue_glCore_glUniform4ivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4ivARB] + .global bluegl_glDrawElementsInstancedBaseVertex + .type bluegl_glDrawElementsInstancedBaseVertex, %function +bluegl_glDrawElementsInstancedBaseVertex: + adrp x16, :got:__blue_glCore_glDrawElementsInstancedBaseVertex + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementsInstancedBaseVertex] ldr x16, [x16] br x16 - .size bluegl_glUniform4ivARB, .-bluegl_glUniform4ivARB + .size bluegl_glDrawElementsInstancedBaseVertex, .-bluegl_glDrawElementsInstancedBaseVertex .align 2 - .global bluegl_glRenderbufferStorageMultisampleEXT - .type bluegl_glRenderbufferStorageMultisampleEXT, %function -bluegl_glRenderbufferStorageMultisampleEXT: - adrp x16, :got:__blue_glCore_glRenderbufferStorageMultisampleEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glRenderbufferStorageMultisampleEXT] + .global bluegl_glMultiDrawElementsBaseVertex + .type bluegl_glMultiDrawElementsBaseVertex, %function +bluegl_glMultiDrawElementsBaseVertex: + adrp x16, :got:__blue_glCore_glMultiDrawElementsBaseVertex + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawElementsBaseVertex] ldr x16, [x16] br x16 - .size bluegl_glRenderbufferStorageMultisampleEXT, .-bluegl_glRenderbufferStorageMultisampleEXT + .size bluegl_glMultiDrawElementsBaseVertex, .-bluegl_glMultiDrawElementsBaseVertex .align 2 - .global bluegl_glPointParameterfvARB - .type bluegl_glPointParameterfvARB, %function -bluegl_glPointParameterfvARB: - adrp x16, :got:__blue_glCore_glPointParameterfvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterfvARB] + .global bluegl_glProvokingVertex + .type bluegl_glProvokingVertex, %function +bluegl_glProvokingVertex: + adrp x16, :got:__blue_glCore_glProvokingVertex + ldr x16, [x16, #:got_lo12:__blue_glCore_glProvokingVertex] ldr x16, [x16] br x16 - .size bluegl_glPointParameterfvARB, .-bluegl_glPointParameterfvARB + .size bluegl_glProvokingVertex, .-bluegl_glProvokingVertex .align 2 - .global bluegl_glProgramLocalParameterI4uivNV - .type bluegl_glProgramLocalParameterI4uivNV, %function -bluegl_glProgramLocalParameterI4uivNV: - adrp x16, :got:__blue_glCore_glProgramLocalParameterI4uivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParameterI4uivNV] + .global bluegl_glFenceSync + .type bluegl_glFenceSync, %function +bluegl_glFenceSync: + adrp x16, :got:__blue_glCore_glFenceSync + ldr x16, [x16, #:got_lo12:__blue_glCore_glFenceSync] ldr x16, [x16] br x16 - .size bluegl_glProgramLocalParameterI4uivNV, .-bluegl_glProgramLocalParameterI4uivNV + .size bluegl_glFenceSync, .-bluegl_glFenceSync .align 2 - .global bluegl_glDeformSGIX - .type bluegl_glDeformSGIX, %function -bluegl_glDeformSGIX: - adrp x16, :got:__blue_glCore_glDeformSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeformSGIX] + .global bluegl_glIsSync + .type bluegl_glIsSync, %function +bluegl_glIsSync: + adrp x16, :got:__blue_glCore_glIsSync + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsSync] ldr x16, [x16] br x16 - .size bluegl_glDeformSGIX, .-bluegl_glDeformSGIX + .size bluegl_glIsSync, .-bluegl_glIsSync .align 2 - .global bluegl_glProgramUniformHandleui64vNV - .type bluegl_glProgramUniformHandleui64vNV, %function -bluegl_glProgramUniformHandleui64vNV: - adrp x16, :got:__blue_glCore_glProgramUniformHandleui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformHandleui64vNV] + .global bluegl_glDeleteSync + .type bluegl_glDeleteSync, %function +bluegl_glDeleteSync: + adrp x16, :got:__blue_glCore_glDeleteSync + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteSync] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformHandleui64vNV, .-bluegl_glProgramUniformHandleui64vNV + .size bluegl_glDeleteSync, .-bluegl_glDeleteSync .align 2 - .global bluegl_glMultiDrawRangeElementArrayAPPLE - .type bluegl_glMultiDrawRangeElementArrayAPPLE, %function -bluegl_glMultiDrawRangeElementArrayAPPLE: - adrp x16, :got:__blue_glCore_glMultiDrawRangeElementArrayAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawRangeElementArrayAPPLE] + .global bluegl_glClientWaitSync + .type bluegl_glClientWaitSync, %function +bluegl_glClientWaitSync: + adrp x16, :got:__blue_glCore_glClientWaitSync + ldr x16, [x16, #:got_lo12:__blue_glCore_glClientWaitSync] ldr x16, [x16] br x16 - .size bluegl_glMultiDrawRangeElementArrayAPPLE, .-bluegl_glMultiDrawRangeElementArrayAPPLE + .size bluegl_glClientWaitSync, .-bluegl_glClientWaitSync .align 2 - .global bluegl_glGetnUniformfvARB - .type bluegl_glGetnUniformfvARB, %function -bluegl_glGetnUniformfvARB: - adrp x16, :got:__blue_glCore_glGetnUniformfvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformfvARB] + .global bluegl_glWaitSync + .type bluegl_glWaitSync, %function +bluegl_glWaitSync: + adrp x16, :got:__blue_glCore_glWaitSync + ldr x16, [x16, #:got_lo12:__blue_glCore_glWaitSync] ldr x16, [x16] br x16 - .size bluegl_glGetnUniformfvARB, .-bluegl_glGetnUniformfvARB + .size bluegl_glWaitSync, .-bluegl_glWaitSync .align 2 - .global bluegl_glVertexAttribs3svNV - .type bluegl_glVertexAttribs3svNV, %function -bluegl_glVertexAttribs3svNV: - adrp x16, :got:__blue_glCore_glVertexAttribs3svNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs3svNV] + .global bluegl_glGetInteger64v + .type bluegl_glGetInteger64v, %function +bluegl_glGetInteger64v: + adrp x16, :got:__blue_glCore_glGetInteger64v + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInteger64v] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribs3svNV, .-bluegl_glVertexAttribs3svNV + .size bluegl_glGetInteger64v, .-bluegl_glGetInteger64v .align 2 - .global bluegl_glVertexAttrib1dvNV - .type bluegl_glVertexAttrib1dvNV, %function -bluegl_glVertexAttrib1dvNV: - adrp x16, :got:__blue_glCore_glVertexAttrib1dvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1dvNV] + .global bluegl_glGetSynciv + .type bluegl_glGetSynciv, %function +bluegl_glGetSynciv: + adrp x16, :got:__blue_glCore_glGetSynciv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSynciv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1dvNV, .-bluegl_glVertexAttrib1dvNV + .size bluegl_glGetSynciv, .-bluegl_glGetSynciv .align 2 - .global bluegl_glVertexStream1fvATI - .type bluegl_glVertexStream1fvATI, %function -bluegl_glVertexStream1fvATI: - adrp x16, :got:__blue_glCore_glVertexStream1fvATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream1fvATI] + .global bluegl_glGetInteger64i_v + .type bluegl_glGetInteger64i_v, %function +bluegl_glGetInteger64i_v: + adrp x16, :got:__blue_glCore_glGetInteger64i_v + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInteger64i_v] ldr x16, [x16] br x16 - .size bluegl_glVertexStream1fvATI, .-bluegl_glVertexStream1fvATI + .size bluegl_glGetInteger64i_v, .-bluegl_glGetInteger64i_v .align 2 - .global bluegl_glIsProgramPipeline - .type bluegl_glIsProgramPipeline, %function -bluegl_glIsProgramPipeline: - adrp x16, :got:__blue_glCore_glIsProgramPipeline - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsProgramPipeline] + .global bluegl_glGetBufferParameteri64v + .type bluegl_glGetBufferParameteri64v, %function +bluegl_glGetBufferParameteri64v: + adrp x16, :got:__blue_glCore_glGetBufferParameteri64v + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBufferParameteri64v] ldr x16, [x16] br x16 - .size bluegl_glIsProgramPipeline, .-bluegl_glIsProgramPipeline + .size bluegl_glGetBufferParameteri64v, .-bluegl_glGetBufferParameteri64v .align 2 - .global bluegl_glGetObjectBufferfvATI - .type bluegl_glGetObjectBufferfvATI, %function -bluegl_glGetObjectBufferfvATI: - adrp x16, :got:__blue_glCore_glGetObjectBufferfvATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetObjectBufferfvATI] + .global bluegl_glFramebufferTexture + .type bluegl_glFramebufferTexture, %function +bluegl_glFramebufferTexture: + adrp x16, :got:__blue_glCore_glFramebufferTexture + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTexture] ldr x16, [x16] br x16 - .size bluegl_glGetObjectBufferfvATI, .-bluegl_glGetObjectBufferfvATI + .size bluegl_glFramebufferTexture, .-bluegl_glFramebufferTexture .align 2 - .global bluegl_glBeginVertexShaderEXT - .type bluegl_glBeginVertexShaderEXT, %function -bluegl_glBeginVertexShaderEXT: - adrp x16, :got:__blue_glCore_glBeginVertexShaderEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginVertexShaderEXT] + .global bluegl_glTexImage2DMultisample + .type bluegl_glTexImage2DMultisample, %function +bluegl_glTexImage2DMultisample: + adrp x16, :got:__blue_glCore_glTexImage2DMultisample + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexImage2DMultisample] ldr x16, [x16] br x16 - .size bluegl_glBeginVertexShaderEXT, .-bluegl_glBeginVertexShaderEXT + .size bluegl_glTexImage2DMultisample, .-bluegl_glTexImage2DMultisample .align 2 - .global bluegl_glVertexAttrib4svARB - .type bluegl_glVertexAttrib4svARB, %function -bluegl_glVertexAttrib4svARB: - adrp x16, :got:__blue_glCore_glVertexAttrib4svARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4svARB] + .global bluegl_glTexImage3DMultisample + .type bluegl_glTexImage3DMultisample, %function +bluegl_glTexImage3DMultisample: + adrp x16, :got:__blue_glCore_glTexImage3DMultisample + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexImage3DMultisample] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4svARB, .-bluegl_glVertexAttrib4svARB + .size bluegl_glTexImage3DMultisample, .-bluegl_glTexImage3DMultisample .align 2 - .global bluegl_glWindowPos2d - .type bluegl_glWindowPos2d, %function -bluegl_glWindowPos2d: - adrp x16, :got:__blue_glCore_glWindowPos2d - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2d] + .global bluegl_glGetMultisamplefv + .type bluegl_glGetMultisamplefv, %function +bluegl_glGetMultisamplefv: + adrp x16, :got:__blue_glCore_glGetMultisamplefv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultisamplefv] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2d, .-bluegl_glWindowPos2d + .size bluegl_glGetMultisamplefv, .-bluegl_glGetMultisamplefv .align 2 - .global bluegl_glWriteMaskEXT - .type bluegl_glWriteMaskEXT, %function -bluegl_glWriteMaskEXT: - adrp x16, :got:__blue_glCore_glWriteMaskEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glWriteMaskEXT] + .global bluegl_glSampleMaski + .type bluegl_glSampleMaski, %function +bluegl_glSampleMaski: + adrp x16, :got:__blue_glCore_glSampleMaski + ldr x16, [x16, #:got_lo12:__blue_glCore_glSampleMaski] ldr x16, [x16] br x16 - .size bluegl_glWriteMaskEXT, .-bluegl_glWriteMaskEXT + .size bluegl_glSampleMaski, .-bluegl_glSampleMaski .align 2 - .global bluegl_glDrawRangeElements - .type bluegl_glDrawRangeElements, %function -bluegl_glDrawRangeElements: - adrp x16, :got:__blue_glCore_glDrawRangeElements - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawRangeElements] + .global bluegl_glBindFragDataLocationIndexed + .type bluegl_glBindFragDataLocationIndexed, %function +bluegl_glBindFragDataLocationIndexed: + adrp x16, :got:__blue_glCore_glBindFragDataLocationIndexed + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindFragDataLocationIndexed] ldr x16, [x16] br x16 - .size bluegl_glDrawRangeElements, .-bluegl_glDrawRangeElements + .size bluegl_glBindFragDataLocationIndexed, .-bluegl_glBindFragDataLocationIndexed .align 2 .global bluegl_glGetFragDataIndex @@ -3580,9764 +3209,9954 @@ bluegl_glGetFragDataIndex: .size bluegl_glGetFragDataIndex, .-bluegl_glGetFragDataIndex .align 2 - .global bluegl_glDeleteTransformFeedbacksNV - .type bluegl_glDeleteTransformFeedbacksNV, %function -bluegl_glDeleteTransformFeedbacksNV: - adrp x16, :got:__blue_glCore_glDeleteTransformFeedbacksNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteTransformFeedbacksNV] + .global bluegl_glGenSamplers + .type bluegl_glGenSamplers, %function +bluegl_glGenSamplers: + adrp x16, :got:__blue_glCore_glGenSamplers + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenSamplers] ldr x16, [x16] br x16 - .size bluegl_glDeleteTransformFeedbacksNV, .-bluegl_glDeleteTransformFeedbacksNV + .size bluegl_glGenSamplers, .-bluegl_glGenSamplers .align 2 - .global bluegl_glProgramUniformMatrix2fvEXT - .type bluegl_glProgramUniformMatrix2fvEXT, %function -bluegl_glProgramUniformMatrix2fvEXT: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix2fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2fvEXT] + .global bluegl_glDeleteSamplers + .type bluegl_glDeleteSamplers, %function +bluegl_glDeleteSamplers: + adrp x16, :got:__blue_glCore_glDeleteSamplers + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteSamplers] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix2fvEXT, .-bluegl_glProgramUniformMatrix2fvEXT + .size bluegl_glDeleteSamplers, .-bluegl_glDeleteSamplers .align 2 - .global bluegl_glProgramUniform3ui - .type bluegl_glProgramUniform3ui, %function -bluegl_glProgramUniform3ui: - adrp x16, :got:__blue_glCore_glProgramUniform3ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3ui] + .global bluegl_glIsSampler + .type bluegl_glIsSampler, %function +bluegl_glIsSampler: + adrp x16, :got:__blue_glCore_glIsSampler + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsSampler] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3ui, .-bluegl_glProgramUniform3ui + .size bluegl_glIsSampler, .-bluegl_glIsSampler .align 2 - .global bluegl_glGetTransformFeedbacki_v - .type bluegl_glGetTransformFeedbacki_v, %function -bluegl_glGetTransformFeedbacki_v: - adrp x16, :got:__blue_glCore_glGetTransformFeedbacki_v - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTransformFeedbacki_v] + .global bluegl_glBindSampler + .type bluegl_glBindSampler, %function +bluegl_glBindSampler: + adrp x16, :got:__blue_glCore_glBindSampler + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindSampler] ldr x16, [x16] br x16 - .size bluegl_glGetTransformFeedbacki_v, .-bluegl_glGetTransformFeedbacki_v + .size bluegl_glBindSampler, .-bluegl_glBindSampler .align 2 - .global bluegl_glUniformMatrix3x2dv - .type bluegl_glUniformMatrix3x2dv, %function -bluegl_glUniformMatrix3x2dv: - adrp x16, :got:__blue_glCore_glUniformMatrix3x2dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix3x2dv] + .global bluegl_glSamplerParameteri + .type bluegl_glSamplerParameteri, %function +bluegl_glSamplerParameteri: + adrp x16, :got:__blue_glCore_glSamplerParameteri + ldr x16, [x16, #:got_lo12:__blue_glCore_glSamplerParameteri] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix3x2dv, .-bluegl_glUniformMatrix3x2dv + .size bluegl_glSamplerParameteri, .-bluegl_glSamplerParameteri .align 2 - .global bluegl_glGetMapxvOES - .type bluegl_glGetMapxvOES, %function -bluegl_glGetMapxvOES: - adrp x16, :got:__blue_glCore_glGetMapxvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMapxvOES] + .global bluegl_glSamplerParameteriv + .type bluegl_glSamplerParameteriv, %function +bluegl_glSamplerParameteriv: + adrp x16, :got:__blue_glCore_glSamplerParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glSamplerParameteriv] ldr x16, [x16] br x16 - .size bluegl_glGetMapxvOES, .-bluegl_glGetMapxvOES + .size bluegl_glSamplerParameteriv, .-bluegl_glSamplerParameteriv .align 2 - .global bluegl_glMemoryBarrierByRegion - .type bluegl_glMemoryBarrierByRegion, %function -bluegl_glMemoryBarrierByRegion: - adrp x16, :got:__blue_glCore_glMemoryBarrierByRegion - ldr x16, [x16, #:got_lo12:__blue_glCore_glMemoryBarrierByRegion] + .global bluegl_glSamplerParameterf + .type bluegl_glSamplerParameterf, %function +bluegl_glSamplerParameterf: + adrp x16, :got:__blue_glCore_glSamplerParameterf + ldr x16, [x16, #:got_lo12:__blue_glCore_glSamplerParameterf] ldr x16, [x16] br x16 - .size bluegl_glMemoryBarrierByRegion, .-bluegl_glMemoryBarrierByRegion + .size bluegl_glSamplerParameterf, .-bluegl_glSamplerParameterf .align 2 - .global bluegl_glNamedFramebufferDrawBuffer - .type bluegl_glNamedFramebufferDrawBuffer, %function -bluegl_glNamedFramebufferDrawBuffer: - adrp x16, :got:__blue_glCore_glNamedFramebufferDrawBuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferDrawBuffer] + .global bluegl_glSamplerParameterfv + .type bluegl_glSamplerParameterfv, %function +bluegl_glSamplerParameterfv: + adrp x16, :got:__blue_glCore_glSamplerParameterfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glSamplerParameterfv] ldr x16, [x16] br x16 - .size bluegl_glNamedFramebufferDrawBuffer, .-bluegl_glNamedFramebufferDrawBuffer + .size bluegl_glSamplerParameterfv, .-bluegl_glSamplerParameterfv .align 2 - .global bluegl_glIsBufferResidentNV - .type bluegl_glIsBufferResidentNV, %function -bluegl_glIsBufferResidentNV: - adrp x16, :got:__blue_glCore_glIsBufferResidentNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsBufferResidentNV] + .global bluegl_glSamplerParameterIiv + .type bluegl_glSamplerParameterIiv, %function +bluegl_glSamplerParameterIiv: + adrp x16, :got:__blue_glCore_glSamplerParameterIiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glSamplerParameterIiv] ldr x16, [x16] br x16 - .size bluegl_glIsBufferResidentNV, .-bluegl_glIsBufferResidentNV + .size bluegl_glSamplerParameterIiv, .-bluegl_glSamplerParameterIiv .align 2 - .global bluegl_glStencilOpSeparate - .type bluegl_glStencilOpSeparate, %function -bluegl_glStencilOpSeparate: - adrp x16, :got:__blue_glCore_glStencilOpSeparate - ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilOpSeparate] + .global bluegl_glSamplerParameterIuiv + .type bluegl_glSamplerParameterIuiv, %function +bluegl_glSamplerParameterIuiv: + adrp x16, :got:__blue_glCore_glSamplerParameterIuiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glSamplerParameterIuiv] ldr x16, [x16] br x16 - .size bluegl_glStencilOpSeparate, .-bluegl_glStencilOpSeparate + .size bluegl_glSamplerParameterIuiv, .-bluegl_glSamplerParameterIuiv .align 2 - .global bluegl_glInvalidateNamedFramebufferSubData - .type bluegl_glInvalidateNamedFramebufferSubData, %function -bluegl_glInvalidateNamedFramebufferSubData: - adrp x16, :got:__blue_glCore_glInvalidateNamedFramebufferSubData - ldr x16, [x16, #:got_lo12:__blue_glCore_glInvalidateNamedFramebufferSubData] + .global bluegl_glGetSamplerParameteriv + .type bluegl_glGetSamplerParameteriv, %function +bluegl_glGetSamplerParameteriv: + adrp x16, :got:__blue_glCore_glGetSamplerParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSamplerParameteriv] ldr x16, [x16] br x16 - .size bluegl_glInvalidateNamedFramebufferSubData, .-bluegl_glInvalidateNamedFramebufferSubData + .size bluegl_glGetSamplerParameteriv, .-bluegl_glGetSamplerParameteriv .align 2 - .global bluegl_glColor3hNV - .type bluegl_glColor3hNV, %function -bluegl_glColor3hNV: - adrp x16, :got:__blue_glCore_glColor3hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glColor3hNV] + .global bluegl_glGetSamplerParameterIiv + .type bluegl_glGetSamplerParameterIiv, %function +bluegl_glGetSamplerParameterIiv: + adrp x16, :got:__blue_glCore_glGetSamplerParameterIiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSamplerParameterIiv] ldr x16, [x16] br x16 - .size bluegl_glColor3hNV, .-bluegl_glColor3hNV + .size bluegl_glGetSamplerParameterIiv, .-bluegl_glGetSamplerParameterIiv .align 2 - .global bluegl_glTextureMaterialEXT - .type bluegl_glTextureMaterialEXT, %function -bluegl_glTextureMaterialEXT: - adrp x16, :got:__blue_glCore_glTextureMaterialEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureMaterialEXT] + .global bluegl_glGetSamplerParameterfv + .type bluegl_glGetSamplerParameterfv, %function +bluegl_glGetSamplerParameterfv: + adrp x16, :got:__blue_glCore_glGetSamplerParameterfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSamplerParameterfv] ldr x16, [x16] br x16 - .size bluegl_glTextureMaterialEXT, .-bluegl_glTextureMaterialEXT + .size bluegl_glGetSamplerParameterfv, .-bluegl_glGetSamplerParameterfv .align 2 - .global bluegl_glCompressedTextureSubImage2D - .type bluegl_glCompressedTextureSubImage2D, %function -bluegl_glCompressedTextureSubImage2D: - adrp x16, :got:__blue_glCore_glCompressedTextureSubImage2D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTextureSubImage2D] + .global bluegl_glGetSamplerParameterIuiv + .type bluegl_glGetSamplerParameterIuiv, %function +bluegl_glGetSamplerParameterIuiv: + adrp x16, :got:__blue_glCore_glGetSamplerParameterIuiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSamplerParameterIuiv] ldr x16, [x16] br x16 - .size bluegl_glCompressedTextureSubImage2D, .-bluegl_glCompressedTextureSubImage2D + .size bluegl_glGetSamplerParameterIuiv, .-bluegl_glGetSamplerParameterIuiv .align 2 - .global bluegl_glMultiTexGeniEXT - .type bluegl_glMultiTexGeniEXT, %function -bluegl_glMultiTexGeniEXT: - adrp x16, :got:__blue_glCore_glMultiTexGeniEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexGeniEXT] + .global bluegl_glQueryCounter + .type bluegl_glQueryCounter, %function +bluegl_glQueryCounter: + adrp x16, :got:__blue_glCore_glQueryCounter + ldr x16, [x16, #:got_lo12:__blue_glCore_glQueryCounter] ldr x16, [x16] br x16 - .size bluegl_glMultiTexGeniEXT, .-bluegl_glMultiTexGeniEXT + .size bluegl_glQueryCounter, .-bluegl_glQueryCounter .align 2 - .global bluegl_glSecondaryColor3usvEXT - .type bluegl_glSecondaryColor3usvEXT, %function -bluegl_glSecondaryColor3usvEXT: - adrp x16, :got:__blue_glCore_glSecondaryColor3usvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3usvEXT] + .global bluegl_glGetQueryObjecti64v + .type bluegl_glGetQueryObjecti64v, %function +bluegl_glGetQueryObjecti64v: + adrp x16, :got:__blue_glCore_glGetQueryObjecti64v + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryObjecti64v] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3usvEXT, .-bluegl_glSecondaryColor3usvEXT + .size bluegl_glGetQueryObjecti64v, .-bluegl_glGetQueryObjecti64v .align 2 - .global bluegl_glGetProgramResourceName - .type bluegl_glGetProgramResourceName, %function -bluegl_glGetProgramResourceName: - adrp x16, :got:__blue_glCore_glGetProgramResourceName - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramResourceName] + .global bluegl_glGetQueryObjectui64v + .type bluegl_glGetQueryObjectui64v, %function +bluegl_glGetQueryObjectui64v: + adrp x16, :got:__blue_glCore_glGetQueryObjectui64v + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryObjectui64v] ldr x16, [x16] br x16 - .size bluegl_glGetProgramResourceName, .-bluegl_glGetProgramResourceName + .size bluegl_glGetQueryObjectui64v, .-bluegl_glGetQueryObjectui64v .align 2 - .global bluegl_glTextureStorageSparseAMD - .type bluegl_glTextureStorageSparseAMD, %function -bluegl_glTextureStorageSparseAMD: - adrp x16, :got:__blue_glCore_glTextureStorageSparseAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorageSparseAMD] + .global bluegl_glVertexAttribDivisor + .type bluegl_glVertexAttribDivisor, %function +bluegl_glVertexAttribDivisor: + adrp x16, :got:__blue_glCore_glVertexAttribDivisor + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribDivisor] ldr x16, [x16] br x16 - .size bluegl_glTextureStorageSparseAMD, .-bluegl_glTextureStorageSparseAMD + .size bluegl_glVertexAttribDivisor, .-bluegl_glVertexAttribDivisor .align 2 - .global bluegl_glPixelStorei - .type bluegl_glPixelStorei, %function -bluegl_glPixelStorei: - adrp x16, :got:__blue_glCore_glPixelStorei - ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelStorei] + .global bluegl_glVertexAttribP1ui + .type bluegl_glVertexAttribP1ui, %function +bluegl_glVertexAttribP1ui: + adrp x16, :got:__blue_glCore_glVertexAttribP1ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribP1ui] ldr x16, [x16] br x16 - .size bluegl_glPixelStorei, .-bluegl_glPixelStorei + .size bluegl_glVertexAttribP1ui, .-bluegl_glVertexAttribP1ui .align 2 - .global bluegl_glGetBooleani_v - .type bluegl_glGetBooleani_v, %function -bluegl_glGetBooleani_v: - adrp x16, :got:__blue_glCore_glGetBooleani_v - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBooleani_v] + .global bluegl_glVertexAttribP1uiv + .type bluegl_glVertexAttribP1uiv, %function +bluegl_glVertexAttribP1uiv: + adrp x16, :got:__blue_glCore_glVertexAttribP1uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribP1uiv] ldr x16, [x16] br x16 - .size bluegl_glGetBooleani_v, .-bluegl_glGetBooleani_v + .size bluegl_glVertexAttribP1uiv, .-bluegl_glVertexAttribP1uiv .align 2 - .global bluegl_glGetPathCoordsNV - .type bluegl_glGetPathCoordsNV, %function -bluegl_glGetPathCoordsNV: - adrp x16, :got:__blue_glCore_glGetPathCoordsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathCoordsNV] + .global bluegl_glVertexAttribP2ui + .type bluegl_glVertexAttribP2ui, %function +bluegl_glVertexAttribP2ui: + adrp x16, :got:__blue_glCore_glVertexAttribP2ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribP2ui] ldr x16, [x16] br x16 - .size bluegl_glGetPathCoordsNV, .-bluegl_glGetPathCoordsNV + .size bluegl_glVertexAttribP2ui, .-bluegl_glVertexAttribP2ui .align 2 - .global bluegl_glVertexAttrib3svNV - .type bluegl_glVertexAttrib3svNV, %function -bluegl_glVertexAttrib3svNV: - adrp x16, :got:__blue_glCore_glVertexAttrib3svNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3svNV] + .global bluegl_glVertexAttribP2uiv + .type bluegl_glVertexAttribP2uiv, %function +bluegl_glVertexAttribP2uiv: + adrp x16, :got:__blue_glCore_glVertexAttribP2uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribP2uiv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3svNV, .-bluegl_glVertexAttrib3svNV + .size bluegl_glVertexAttribP2uiv, .-bluegl_glVertexAttribP2uiv .align 2 - .global bluegl_glUniformui64NV - .type bluegl_glUniformui64NV, %function -bluegl_glUniformui64NV: - adrp x16, :got:__blue_glCore_glUniformui64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformui64NV] + .global bluegl_glVertexAttribP3ui + .type bluegl_glVertexAttribP3ui, %function +bluegl_glVertexAttribP3ui: + adrp x16, :got:__blue_glCore_glVertexAttribP3ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribP3ui] ldr x16, [x16] br x16 - .size bluegl_glUniformui64NV, .-bluegl_glUniformui64NV + .size bluegl_glVertexAttribP3ui, .-bluegl_glVertexAttribP3ui .align 2 - .global bluegl_glIsImageHandleResidentNV - .type bluegl_glIsImageHandleResidentNV, %function -bluegl_glIsImageHandleResidentNV: - adrp x16, :got:__blue_glCore_glIsImageHandleResidentNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsImageHandleResidentNV] + .global bluegl_glVertexAttribP3uiv + .type bluegl_glVertexAttribP3uiv, %function +bluegl_glVertexAttribP3uiv: + adrp x16, :got:__blue_glCore_glVertexAttribP3uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribP3uiv] ldr x16, [x16] br x16 - .size bluegl_glIsImageHandleResidentNV, .-bluegl_glIsImageHandleResidentNV + .size bluegl_glVertexAttribP3uiv, .-bluegl_glVertexAttribP3uiv .align 2 - .global bluegl_glBeginConditionalRenderNV - .type bluegl_glBeginConditionalRenderNV, %function -bluegl_glBeginConditionalRenderNV: - adrp x16, :got:__blue_glCore_glBeginConditionalRenderNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginConditionalRenderNV] + .global bluegl_glVertexAttribP4ui + .type bluegl_glVertexAttribP4ui, %function +bluegl_glVertexAttribP4ui: + adrp x16, :got:__blue_glCore_glVertexAttribP4ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribP4ui] ldr x16, [x16] br x16 - .size bluegl_glBeginConditionalRenderNV, .-bluegl_glBeginConditionalRenderNV + .size bluegl_glVertexAttribP4ui, .-bluegl_glVertexAttribP4ui .align 2 - .global bluegl_glNamedFramebufferParameteriEXT - .type bluegl_glNamedFramebufferParameteriEXT, %function -bluegl_glNamedFramebufferParameteriEXT: - adrp x16, :got:__blue_glCore_glNamedFramebufferParameteriEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferParameteriEXT] + .global bluegl_glVertexAttribP4uiv + .type bluegl_glVertexAttribP4uiv, %function +bluegl_glVertexAttribP4uiv: + adrp x16, :got:__blue_glCore_glVertexAttribP4uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribP4uiv] ldr x16, [x16] br x16 - .size bluegl_glNamedFramebufferParameteriEXT, .-bluegl_glNamedFramebufferParameteriEXT + .size bluegl_glVertexAttribP4uiv, .-bluegl_glVertexAttribP4uiv .align 2 - .global bluegl_glIsVertexArrayAPPLE - .type bluegl_glIsVertexArrayAPPLE, %function -bluegl_glIsVertexArrayAPPLE: - adrp x16, :got:__blue_glCore_glIsVertexArrayAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsVertexArrayAPPLE] + .global bluegl_glMinSampleShading + .type bluegl_glMinSampleShading, %function +bluegl_glMinSampleShading: + adrp x16, :got:__blue_glCore_glMinSampleShading + ldr x16, [x16, #:got_lo12:__blue_glCore_glMinSampleShading] ldr x16, [x16] br x16 - .size bluegl_glIsVertexArrayAPPLE, .-bluegl_glIsVertexArrayAPPLE + .size bluegl_glMinSampleShading, .-bluegl_glMinSampleShading .align 2 - .global bluegl_glPointParameterfvEXT - .type bluegl_glPointParameterfvEXT, %function -bluegl_glPointParameterfvEXT: - adrp x16, :got:__blue_glCore_glPointParameterfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterfvEXT] + .global bluegl_glBlendEquationi + .type bluegl_glBlendEquationi, %function +bluegl_glBlendEquationi: + adrp x16, :got:__blue_glCore_glBlendEquationi + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquationi] + ldr x16, [x16] + br x16 + .size bluegl_glBlendEquationi, .-bluegl_glBlendEquationi + + .align 2 + .global bluegl_glBlendEquationSeparatei + .type bluegl_glBlendEquationSeparatei, %function +bluegl_glBlendEquationSeparatei: + adrp x16, :got:__blue_glCore_glBlendEquationSeparatei + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquationSeparatei] ldr x16, [x16] br x16 - .size bluegl_glPointParameterfvEXT, .-bluegl_glPointParameterfvEXT + .size bluegl_glBlendEquationSeparatei, .-bluegl_glBlendEquationSeparatei .align 2 - .global bluegl_glGetnMapfvARB - .type bluegl_glGetnMapfvARB, %function -bluegl_glGetnMapfvARB: - adrp x16, :got:__blue_glCore_glGetnMapfvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnMapfvARB] + .global bluegl_glBlendFunci + .type bluegl_glBlendFunci, %function +bluegl_glBlendFunci: + adrp x16, :got:__blue_glCore_glBlendFunci + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFunci] ldr x16, [x16] br x16 - .size bluegl_glGetnMapfvARB, .-bluegl_glGetnMapfvARB + .size bluegl_glBlendFunci, .-bluegl_glBlendFunci .align 2 - .global bluegl_glCopyColorSubTable - .type bluegl_glCopyColorSubTable, %function -bluegl_glCopyColorSubTable: - adrp x16, :got:__blue_glCore_glCopyColorSubTable - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyColorSubTable] + .global bluegl_glBlendFuncSeparatei + .type bluegl_glBlendFuncSeparatei, %function +bluegl_glBlendFuncSeparatei: + adrp x16, :got:__blue_glCore_glBlendFuncSeparatei + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFuncSeparatei] ldr x16, [x16] br x16 - .size bluegl_glCopyColorSubTable, .-bluegl_glCopyColorSubTable + .size bluegl_glBlendFuncSeparatei, .-bluegl_glBlendFuncSeparatei .align 2 - .global bluegl_glVariantbvEXT - .type bluegl_glVariantbvEXT, %function -bluegl_glVariantbvEXT: - adrp x16, :got:__blue_glCore_glVariantbvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantbvEXT] + .global bluegl_glDrawArraysIndirect + .type bluegl_glDrawArraysIndirect, %function +bluegl_glDrawArraysIndirect: + adrp x16, :got:__blue_glCore_glDrawArraysIndirect + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawArraysIndirect] ldr x16, [x16] br x16 - .size bluegl_glVariantbvEXT, .-bluegl_glVariantbvEXT + .size bluegl_glDrawArraysIndirect, .-bluegl_glDrawArraysIndirect .align 2 - .global bluegl_glTextureParameterIuiv - .type bluegl_glTextureParameterIuiv, %function -bluegl_glTextureParameterIuiv: - adrp x16, :got:__blue_glCore_glTextureParameterIuiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameterIuiv] + .global bluegl_glDrawElementsIndirect + .type bluegl_glDrawElementsIndirect, %function +bluegl_glDrawElementsIndirect: + adrp x16, :got:__blue_glCore_glDrawElementsIndirect + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementsIndirect] ldr x16, [x16] br x16 - .size bluegl_glTextureParameterIuiv, .-bluegl_glTextureParameterIuiv + .size bluegl_glDrawElementsIndirect, .-bluegl_glDrawElementsIndirect .align 2 - .global bluegl_glPNTrianglesiATI - .type bluegl_glPNTrianglesiATI, %function -bluegl_glPNTrianglesiATI: - adrp x16, :got:__blue_glCore_glPNTrianglesiATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glPNTrianglesiATI] + .global bluegl_glUniform1d + .type bluegl_glUniform1d, %function +bluegl_glUniform1d: + adrp x16, :got:__blue_glCore_glUniform1d + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1d] ldr x16, [x16] br x16 - .size bluegl_glPNTrianglesiATI, .-bluegl_glPNTrianglesiATI + .size bluegl_glUniform1d, .-bluegl_glUniform1d .align 2 - .global bluegl_glBlendFunc - .type bluegl_glBlendFunc, %function -bluegl_glBlendFunc: - adrp x16, :got:__blue_glCore_glBlendFunc - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFunc] + .global bluegl_glUniform2d + .type bluegl_glUniform2d, %function +bluegl_glUniform2d: + adrp x16, :got:__blue_glCore_glUniform2d + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2d] ldr x16, [x16] br x16 - .size bluegl_glBlendFunc, .-bluegl_glBlendFunc + .size bluegl_glUniform2d, .-bluegl_glUniform2d .align 2 - .global bluegl_glVertexAttrib4uiv - .type bluegl_glVertexAttrib4uiv, %function -bluegl_glVertexAttrib4uiv: - adrp x16, :got:__blue_glCore_glVertexAttrib4uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4uiv] + .global bluegl_glUniform3d + .type bluegl_glUniform3d, %function +bluegl_glUniform3d: + adrp x16, :got:__blue_glCore_glUniform3d + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3d] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4uiv, .-bluegl_glVertexAttrib4uiv + .size bluegl_glUniform3d, .-bluegl_glUniform3d .align 2 - .global bluegl_glUniform2ui - .type bluegl_glUniform2ui, %function -bluegl_glUniform2ui: - adrp x16, :got:__blue_glCore_glUniform2ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2ui] + .global bluegl_glUniform4d + .type bluegl_glUniform4d, %function +bluegl_glUniform4d: + adrp x16, :got:__blue_glCore_glUniform4d + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4d] ldr x16, [x16] br x16 - .size bluegl_glUniform2ui, .-bluegl_glUniform2ui + .size bluegl_glUniform4d, .-bluegl_glUniform4d .align 2 - .global bluegl_glBlendColor - .type bluegl_glBlendColor, %function -bluegl_glBlendColor: - adrp x16, :got:__blue_glCore_glBlendColor - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendColor] + .global bluegl_glUniform1dv + .type bluegl_glUniform1dv, %function +bluegl_glUniform1dv: + adrp x16, :got:__blue_glCore_glUniform1dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1dv] ldr x16, [x16] br x16 - .size bluegl_glBlendColor, .-bluegl_glBlendColor + .size bluegl_glUniform1dv, .-bluegl_glUniform1dv .align 2 - .global bluegl_glViewport - .type bluegl_glViewport, %function -bluegl_glViewport: - adrp x16, :got:__blue_glCore_glViewport - ldr x16, [x16, #:got_lo12:__blue_glCore_glViewport] + .global bluegl_glUniform2dv + .type bluegl_glUniform2dv, %function +bluegl_glUniform2dv: + adrp x16, :got:__blue_glCore_glUniform2dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2dv] ldr x16, [x16] br x16 - .size bluegl_glViewport, .-bluegl_glViewport + .size bluegl_glUniform2dv, .-bluegl_glUniform2dv .align 2 - .global bluegl_glWindowPos2fvARB - .type bluegl_glWindowPos2fvARB, %function -bluegl_glWindowPos2fvARB: - adrp x16, :got:__blue_glCore_glWindowPos2fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2fvARB] + .global bluegl_glUniform3dv + .type bluegl_glUniform3dv, %function +bluegl_glUniform3dv: + adrp x16, :got:__blue_glCore_glUniform3dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3dv] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2fvARB, .-bluegl_glWindowPos2fvARB + .size bluegl_glUniform3dv, .-bluegl_glUniform3dv .align 2 - .global bluegl_glSampleCoverage - .type bluegl_glSampleCoverage, %function -bluegl_glSampleCoverage: - adrp x16, :got:__blue_glCore_glSampleCoverage - ldr x16, [x16, #:got_lo12:__blue_glCore_glSampleCoverage] + .global bluegl_glUniform4dv + .type bluegl_glUniform4dv, %function +bluegl_glUniform4dv: + adrp x16, :got:__blue_glCore_glUniform4dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4dv] ldr x16, [x16] br x16 - .size bluegl_glSampleCoverage, .-bluegl_glSampleCoverage + .size bluegl_glUniform4dv, .-bluegl_glUniform4dv .align 2 - .global bluegl_glSecondaryColor3ubv - .type bluegl_glSecondaryColor3ubv, %function -bluegl_glSecondaryColor3ubv: - adrp x16, :got:__blue_glCore_glSecondaryColor3ubv - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3ubv] + .global bluegl_glUniformMatrix2dv + .type bluegl_glUniformMatrix2dv, %function +bluegl_glUniformMatrix2dv: + adrp x16, :got:__blue_glCore_glUniformMatrix2dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix2dv] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3ubv, .-bluegl_glSecondaryColor3ubv + .size bluegl_glUniformMatrix2dv, .-bluegl_glUniformMatrix2dv .align 2 - .global bluegl_glColor4xOES - .type bluegl_glColor4xOES, %function -bluegl_glColor4xOES: - adrp x16, :got:__blue_glCore_glColor4xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4xOES] + .global bluegl_glUniformMatrix3dv + .type bluegl_glUniformMatrix3dv, %function +bluegl_glUniformMatrix3dv: + adrp x16, :got:__blue_glCore_glUniformMatrix3dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix3dv] ldr x16, [x16] br x16 - .size bluegl_glColor4xOES, .-bluegl_glColor4xOES + .size bluegl_glUniformMatrix3dv, .-bluegl_glUniformMatrix3dv .align 2 - .global bluegl_glVertexAttribL1dEXT - .type bluegl_glVertexAttribL1dEXT, %function -bluegl_glVertexAttribL1dEXT: - adrp x16, :got:__blue_glCore_glVertexAttribL1dEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1dEXT] + .global bluegl_glUniformMatrix4dv + .type bluegl_glUniformMatrix4dv, %function +bluegl_glUniformMatrix4dv: + adrp x16, :got:__blue_glCore_glUniformMatrix4dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix4dv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL1dEXT, .-bluegl_glVertexAttribL1dEXT + .size bluegl_glUniformMatrix4dv, .-bluegl_glUniformMatrix4dv .align 2 - .global bluegl_glMultTransposeMatrixf - .type bluegl_glMultTransposeMatrixf, %function -bluegl_glMultTransposeMatrixf: - adrp x16, :got:__blue_glCore_glMultTransposeMatrixf - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultTransposeMatrixf] + .global bluegl_glUniformMatrix2x3dv + .type bluegl_glUniformMatrix2x3dv, %function +bluegl_glUniformMatrix2x3dv: + adrp x16, :got:__blue_glCore_glUniformMatrix2x3dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix2x3dv] ldr x16, [x16] br x16 - .size bluegl_glMultTransposeMatrixf, .-bluegl_glMultTransposeMatrixf + .size bluegl_glUniformMatrix2x3dv, .-bluegl_glUniformMatrix2x3dv .align 2 - .global bluegl_glGetVertexArrayIntegeri_vEXT - .type bluegl_glGetVertexArrayIntegeri_vEXT, %function -bluegl_glGetVertexArrayIntegeri_vEXT: - adrp x16, :got:__blue_glCore_glGetVertexArrayIntegeri_vEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexArrayIntegeri_vEXT] + .global bluegl_glUniformMatrix2x4dv + .type bluegl_glUniformMatrix2x4dv, %function +bluegl_glUniformMatrix2x4dv: + adrp x16, :got:__blue_glCore_glUniformMatrix2x4dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix2x4dv] ldr x16, [x16] br x16 - .size bluegl_glGetVertexArrayIntegeri_vEXT, .-bluegl_glGetVertexArrayIntegeri_vEXT + .size bluegl_glUniformMatrix2x4dv, .-bluegl_glUniformMatrix2x4dv .align 2 - .global bluegl_glCullParameterfvEXT - .type bluegl_glCullParameterfvEXT, %function -bluegl_glCullParameterfvEXT: - adrp x16, :got:__blue_glCore_glCullParameterfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCullParameterfvEXT] + .global bluegl_glUniformMatrix3x2dv + .type bluegl_glUniformMatrix3x2dv, %function +bluegl_glUniformMatrix3x2dv: + adrp x16, :got:__blue_glCore_glUniformMatrix3x2dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix3x2dv] ldr x16, [x16] br x16 - .size bluegl_glCullParameterfvEXT, .-bluegl_glCullParameterfvEXT + .size bluegl_glUniformMatrix3x2dv, .-bluegl_glUniformMatrix3x2dv .align 2 - .global bluegl_glMapNamedBufferRangeEXT - .type bluegl_glMapNamedBufferRangeEXT, %function -bluegl_glMapNamedBufferRangeEXT: - adrp x16, :got:__blue_glCore_glMapNamedBufferRangeEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMapNamedBufferRangeEXT] + .global bluegl_glUniformMatrix3x4dv + .type bluegl_glUniformMatrix3x4dv, %function +bluegl_glUniformMatrix3x4dv: + adrp x16, :got:__blue_glCore_glUniformMatrix3x4dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix3x4dv] ldr x16, [x16] br x16 - .size bluegl_glMapNamedBufferRangeEXT, .-bluegl_glMapNamedBufferRangeEXT + .size bluegl_glUniformMatrix3x4dv, .-bluegl_glUniformMatrix3x4dv .align 2 - .global bluegl_glTextureImage3DEXT - .type bluegl_glTextureImage3DEXT, %function -bluegl_glTextureImage3DEXT: - adrp x16, :got:__blue_glCore_glTextureImage3DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureImage3DEXT] + .global bluegl_glUniformMatrix4x2dv + .type bluegl_glUniformMatrix4x2dv, %function +bluegl_glUniformMatrix4x2dv: + adrp x16, :got:__blue_glCore_glUniformMatrix4x2dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix4x2dv] ldr x16, [x16] br x16 - .size bluegl_glTextureImage3DEXT, .-bluegl_glTextureImage3DEXT + .size bluegl_glUniformMatrix4x2dv, .-bluegl_glUniformMatrix4x2dv .align 2 - .global bluegl_glBufferAddressRangeNV - .type bluegl_glBufferAddressRangeNV, %function -bluegl_glBufferAddressRangeNV: - adrp x16, :got:__blue_glCore_glBufferAddressRangeNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glBufferAddressRangeNV] + .global bluegl_glUniformMatrix4x3dv + .type bluegl_glUniformMatrix4x3dv, %function +bluegl_glUniformMatrix4x3dv: + adrp x16, :got:__blue_glCore_glUniformMatrix4x3dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix4x3dv] ldr x16, [x16] br x16 - .size bluegl_glBufferAddressRangeNV, .-bluegl_glBufferAddressRangeNV + .size bluegl_glUniformMatrix4x3dv, .-bluegl_glUniformMatrix4x3dv .align 2 - .global bluegl_glGetVertexAttribdv - .type bluegl_glGetVertexAttribdv, %function -bluegl_glGetVertexAttribdv: - adrp x16, :got:__blue_glCore_glGetVertexAttribdv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribdv] + .global bluegl_glGetUniformdv + .type bluegl_glGetUniformdv, %function +bluegl_glGetUniformdv: + adrp x16, :got:__blue_glCore_glGetUniformdv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformdv] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribdv, .-bluegl_glGetVertexAttribdv + .size bluegl_glGetUniformdv, .-bluegl_glGetUniformdv .align 2 - .global bluegl_glNamedFramebufferSampleLocationsfvARB - .type bluegl_glNamedFramebufferSampleLocationsfvARB, %function -bluegl_glNamedFramebufferSampleLocationsfvARB: - adrp x16, :got:__blue_glCore_glNamedFramebufferSampleLocationsfvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferSampleLocationsfvARB] + .global bluegl_glGetSubroutineUniformLocation + .type bluegl_glGetSubroutineUniformLocation, %function +bluegl_glGetSubroutineUniformLocation: + adrp x16, :got:__blue_glCore_glGetSubroutineUniformLocation + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSubroutineUniformLocation] ldr x16, [x16] br x16 - .size bluegl_glNamedFramebufferSampleLocationsfvARB, .-bluegl_glNamedFramebufferSampleLocationsfvARB + .size bluegl_glGetSubroutineUniformLocation, .-bluegl_glGetSubroutineUniformLocation .align 2 - .global bluegl_glMultiTexCoord2i - .type bluegl_glMultiTexCoord2i, %function -bluegl_glMultiTexCoord2i: - adrp x16, :got:__blue_glCore_glMultiTexCoord2i - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2i] + .global bluegl_glGetSubroutineIndex + .type bluegl_glGetSubroutineIndex, %function +bluegl_glGetSubroutineIndex: + adrp x16, :got:__blue_glCore_glGetSubroutineIndex + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSubroutineIndex] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2i, .-bluegl_glMultiTexCoord2i + .size bluegl_glGetSubroutineIndex, .-bluegl_glGetSubroutineIndex .align 2 - .global bluegl_glBindFramebufferEXT - .type bluegl_glBindFramebufferEXT, %function -bluegl_glBindFramebufferEXT: - adrp x16, :got:__blue_glCore_glBindFramebufferEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindFramebufferEXT] + .global bluegl_glGetActiveSubroutineUniformiv + .type bluegl_glGetActiveSubroutineUniformiv, %function +bluegl_glGetActiveSubroutineUniformiv: + adrp x16, :got:__blue_glCore_glGetActiveSubroutineUniformiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveSubroutineUniformiv] ldr x16, [x16] br x16 - .size bluegl_glBindFramebufferEXT, .-bluegl_glBindFramebufferEXT + .size bluegl_glGetActiveSubroutineUniformiv, .-bluegl_glGetActiveSubroutineUniformiv .align 2 - .global bluegl_glTexParameterfv - .type bluegl_glTexParameterfv, %function -bluegl_glTexParameterfv: - adrp x16, :got:__blue_glCore_glTexParameterfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameterfv] + .global bluegl_glGetActiveSubroutineUniformName + .type bluegl_glGetActiveSubroutineUniformName, %function +bluegl_glGetActiveSubroutineUniformName: + adrp x16, :got:__blue_glCore_glGetActiveSubroutineUniformName + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveSubroutineUniformName] ldr x16, [x16] br x16 - .size bluegl_glTexParameterfv, .-bluegl_glTexParameterfv + .size bluegl_glGetActiveSubroutineUniformName, .-bluegl_glGetActiveSubroutineUniformName .align 2 - .global bluegl_glGetProgramNamedParameterfvNV - .type bluegl_glGetProgramNamedParameterfvNV, %function -bluegl_glGetProgramNamedParameterfvNV: - adrp x16, :got:__blue_glCore_glGetProgramNamedParameterfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramNamedParameterfvNV] + .global bluegl_glGetActiveSubroutineName + .type bluegl_glGetActiveSubroutineName, %function +bluegl_glGetActiveSubroutineName: + adrp x16, :got:__blue_glCore_glGetActiveSubroutineName + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveSubroutineName] ldr x16, [x16] br x16 - .size bluegl_glGetProgramNamedParameterfvNV, .-bluegl_glGetProgramNamedParameterfvNV + .size bluegl_glGetActiveSubroutineName, .-bluegl_glGetActiveSubroutineName .align 2 - .global bluegl_glTextureStorage3DEXT - .type bluegl_glTextureStorage3DEXT, %function -bluegl_glTextureStorage3DEXT: - adrp x16, :got:__blue_glCore_glTextureStorage3DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage3DEXT] + .global bluegl_glUniformSubroutinesuiv + .type bluegl_glUniformSubroutinesuiv, %function +bluegl_glUniformSubroutinesuiv: + adrp x16, :got:__blue_glCore_glUniformSubroutinesuiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformSubroutinesuiv] ldr x16, [x16] br x16 - .size bluegl_glTextureStorage3DEXT, .-bluegl_glTextureStorage3DEXT + .size bluegl_glUniformSubroutinesuiv, .-bluegl_glUniformSubroutinesuiv .align 2 - .global bluegl_glGetDebugMessageLogAMD - .type bluegl_glGetDebugMessageLogAMD, %function -bluegl_glGetDebugMessageLogAMD: - adrp x16, :got:__blue_glCore_glGetDebugMessageLogAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetDebugMessageLogAMD] + .global bluegl_glGetUniformSubroutineuiv + .type bluegl_glGetUniformSubroutineuiv, %function +bluegl_glGetUniformSubroutineuiv: + adrp x16, :got:__blue_glCore_glGetUniformSubroutineuiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformSubroutineuiv] ldr x16, [x16] br x16 - .size bluegl_glGetDebugMessageLogAMD, .-bluegl_glGetDebugMessageLogAMD + .size bluegl_glGetUniformSubroutineuiv, .-bluegl_glGetUniformSubroutineuiv .align 2 - .global bluegl_glTexCoord1hvNV - .type bluegl_glTexCoord1hvNV, %function -bluegl_glTexCoord1hvNV: - adrp x16, :got:__blue_glCore_glTexCoord1hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord1hvNV] + .global bluegl_glGetProgramStageiv + .type bluegl_glGetProgramStageiv, %function +bluegl_glGetProgramStageiv: + adrp x16, :got:__blue_glCore_glGetProgramStageiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramStageiv] ldr x16, [x16] br x16 - .size bluegl_glTexCoord1hvNV, .-bluegl_glTexCoord1hvNV + .size bluegl_glGetProgramStageiv, .-bluegl_glGetProgramStageiv .align 2 - .global bluegl_glRenderbufferStorageMultisampleCoverageNV - .type bluegl_glRenderbufferStorageMultisampleCoverageNV, %function -bluegl_glRenderbufferStorageMultisampleCoverageNV: - adrp x16, :got:__blue_glCore_glRenderbufferStorageMultisampleCoverageNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glRenderbufferStorageMultisampleCoverageNV] + .global bluegl_glPatchParameteri + .type bluegl_glPatchParameteri, %function +bluegl_glPatchParameteri: + adrp x16, :got:__blue_glCore_glPatchParameteri + ldr x16, [x16, #:got_lo12:__blue_glCore_glPatchParameteri] ldr x16, [x16] br x16 - .size bluegl_glRenderbufferStorageMultisampleCoverageNV, .-bluegl_glRenderbufferStorageMultisampleCoverageNV + .size bluegl_glPatchParameteri, .-bluegl_glPatchParameteri .align 2 - .global bluegl_glProgramUniform3i64vARB - .type bluegl_glProgramUniform3i64vARB, %function -bluegl_glProgramUniform3i64vARB: - adrp x16, :got:__blue_glCore_glProgramUniform3i64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3i64vARB] + .global bluegl_glPatchParameterfv + .type bluegl_glPatchParameterfv, %function +bluegl_glPatchParameterfv: + adrp x16, :got:__blue_glCore_glPatchParameterfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glPatchParameterfv] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3i64vARB, .-bluegl_glProgramUniform3i64vARB + .size bluegl_glPatchParameterfv, .-bluegl_glPatchParameterfv .align 2 - .global bluegl_glFragmentMaterialfvSGIX - .type bluegl_glFragmentMaterialfvSGIX, %function -bluegl_glFragmentMaterialfvSGIX: - adrp x16, :got:__blue_glCore_glFragmentMaterialfvSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentMaterialfvSGIX] + .global bluegl_glBindTransformFeedback + .type bluegl_glBindTransformFeedback, %function +bluegl_glBindTransformFeedback: + adrp x16, :got:__blue_glCore_glBindTransformFeedback + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindTransformFeedback] ldr x16, [x16] br x16 - .size bluegl_glFragmentMaterialfvSGIX, .-bluegl_glFragmentMaterialfvSGIX + .size bluegl_glBindTransformFeedback, .-bluegl_glBindTransformFeedback .align 2 - .global bluegl_glGetImageHandleARB - .type bluegl_glGetImageHandleARB, %function -bluegl_glGetImageHandleARB: - adrp x16, :got:__blue_glCore_glGetImageHandleARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetImageHandleARB] + .global bluegl_glDeleteTransformFeedbacks + .type bluegl_glDeleteTransformFeedbacks, %function +bluegl_glDeleteTransformFeedbacks: + adrp x16, :got:__blue_glCore_glDeleteTransformFeedbacks + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteTransformFeedbacks] ldr x16, [x16] br x16 - .size bluegl_glGetImageHandleARB, .-bluegl_glGetImageHandleARB + .size bluegl_glDeleteTransformFeedbacks, .-bluegl_glDeleteTransformFeedbacks .align 2 - .global bluegl_glVertexAttribs3fvNV - .type bluegl_glVertexAttribs3fvNV, %function -bluegl_glVertexAttribs3fvNV: - adrp x16, :got:__blue_glCore_glVertexAttribs3fvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs3fvNV] + .global bluegl_glGenTransformFeedbacks + .type bluegl_glGenTransformFeedbacks, %function +bluegl_glGenTransformFeedbacks: + adrp x16, :got:__blue_glCore_glGenTransformFeedbacks + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenTransformFeedbacks] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribs3fvNV, .-bluegl_glVertexAttribs3fvNV + .size bluegl_glGenTransformFeedbacks, .-bluegl_glGenTransformFeedbacks .align 2 - .global bluegl_glTexSubImage4DSGIS - .type bluegl_glTexSubImage4DSGIS, %function -bluegl_glTexSubImage4DSGIS: - adrp x16, :got:__blue_glCore_glTexSubImage4DSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexSubImage4DSGIS] + .global bluegl_glIsTransformFeedback + .type bluegl_glIsTransformFeedback, %function +bluegl_glIsTransformFeedback: + adrp x16, :got:__blue_glCore_glIsTransformFeedback + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsTransformFeedback] ldr x16, [x16] br x16 - .size bluegl_glTexSubImage4DSGIS, .-bluegl_glTexSubImage4DSGIS + .size bluegl_glIsTransformFeedback, .-bluegl_glIsTransformFeedback .align 2 - .global bluegl_glListParameteriSGIX - .type bluegl_glListParameteriSGIX, %function -bluegl_glListParameteriSGIX: - adrp x16, :got:__blue_glCore_glListParameteriSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glListParameteriSGIX] + .global bluegl_glPauseTransformFeedback + .type bluegl_glPauseTransformFeedback, %function +bluegl_glPauseTransformFeedback: + adrp x16, :got:__blue_glCore_glPauseTransformFeedback + ldr x16, [x16, #:got_lo12:__blue_glCore_glPauseTransformFeedback] ldr x16, [x16] br x16 - .size bluegl_glListParameteriSGIX, .-bluegl_glListParameteriSGIX + .size bluegl_glPauseTransformFeedback, .-bluegl_glPauseTransformFeedback .align 2 - .global bluegl_glPixelTransformParameterfEXT - .type bluegl_glPixelTransformParameterfEXT, %function -bluegl_glPixelTransformParameterfEXT: - adrp x16, :got:__blue_glCore_glPixelTransformParameterfEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTransformParameterfEXT] + .global bluegl_glResumeTransformFeedback + .type bluegl_glResumeTransformFeedback, %function +bluegl_glResumeTransformFeedback: + adrp x16, :got:__blue_glCore_glResumeTransformFeedback + ldr x16, [x16, #:got_lo12:__blue_glCore_glResumeTransformFeedback] ldr x16, [x16] br x16 - .size bluegl_glPixelTransformParameterfEXT, .-bluegl_glPixelTransformParameterfEXT + .size bluegl_glResumeTransformFeedback, .-bluegl_glResumeTransformFeedback .align 2 - .global bluegl_glMapParameterfvNV - .type bluegl_glMapParameterfvNV, %function -bluegl_glMapParameterfvNV: - adrp x16, :got:__blue_glCore_glMapParameterfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMapParameterfvNV] + .global bluegl_glDrawTransformFeedback + .type bluegl_glDrawTransformFeedback, %function +bluegl_glDrawTransformFeedback: + adrp x16, :got:__blue_glCore_glDrawTransformFeedback + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawTransformFeedback] ldr x16, [x16] br x16 - .size bluegl_glMapParameterfvNV, .-bluegl_glMapParameterfvNV + .size bluegl_glDrawTransformFeedback, .-bluegl_glDrawTransformFeedback .align 2 - .global bluegl_glProgramUniform3dv - .type bluegl_glProgramUniform3dv, %function -bluegl_glProgramUniform3dv: - adrp x16, :got:__blue_glCore_glProgramUniform3dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3dv] + .global bluegl_glDrawTransformFeedbackStream + .type bluegl_glDrawTransformFeedbackStream, %function +bluegl_glDrawTransformFeedbackStream: + adrp x16, :got:__blue_glCore_glDrawTransformFeedbackStream + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawTransformFeedbackStream] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3dv, .-bluegl_glProgramUniform3dv + .size bluegl_glDrawTransformFeedbackStream, .-bluegl_glDrawTransformFeedbackStream .align 2 - .global bluegl_glUniformMatrix3fv - .type bluegl_glUniformMatrix3fv, %function -bluegl_glUniformMatrix3fv: - adrp x16, :got:__blue_glCore_glUniformMatrix3fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix3fv] + .global bluegl_glBeginQueryIndexed + .type bluegl_glBeginQueryIndexed, %function +bluegl_glBeginQueryIndexed: + adrp x16, :got:__blue_glCore_glBeginQueryIndexed + ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginQueryIndexed] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix3fv, .-bluegl_glUniformMatrix3fv + .size bluegl_glBeginQueryIndexed, .-bluegl_glBeginQueryIndexed .align 2 - .global bluegl_glProgramUniform4fEXT - .type bluegl_glProgramUniform4fEXT, %function -bluegl_glProgramUniform4fEXT: - adrp x16, :got:__blue_glCore_glProgramUniform4fEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4fEXT] + .global bluegl_glEndQueryIndexed + .type bluegl_glEndQueryIndexed, %function +bluegl_glEndQueryIndexed: + adrp x16, :got:__blue_glCore_glEndQueryIndexed + ldr x16, [x16, #:got_lo12:__blue_glCore_glEndQueryIndexed] + ldr x16, [x16] + br x16 + .size bluegl_glEndQueryIndexed, .-bluegl_glEndQueryIndexed + + .align 2 + .global bluegl_glGetQueryIndexediv + .type bluegl_glGetQueryIndexediv, %function +bluegl_glGetQueryIndexediv: + adrp x16, :got:__blue_glCore_glGetQueryIndexediv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryIndexediv] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4fEXT, .-bluegl_glProgramUniform4fEXT + .size bluegl_glGetQueryIndexediv, .-bluegl_glGetQueryIndexediv .align 2 - .global bluegl_glMultiTexCoord2hNV - .type bluegl_glMultiTexCoord2hNV, %function -bluegl_glMultiTexCoord2hNV: - adrp x16, :got:__blue_glCore_glMultiTexCoord2hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2hNV] + .global bluegl_glReleaseShaderCompiler + .type bluegl_glReleaseShaderCompiler, %function +bluegl_glReleaseShaderCompiler: + adrp x16, :got:__blue_glCore_glReleaseShaderCompiler + ldr x16, [x16, #:got_lo12:__blue_glCore_glReleaseShaderCompiler] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2hNV, .-bluegl_glMultiTexCoord2hNV + .size bluegl_glReleaseShaderCompiler, .-bluegl_glReleaseShaderCompiler .align 2 - .global bluegl_glVertexAttribI4uiv - .type bluegl_glVertexAttribI4uiv, %function -bluegl_glVertexAttribI4uiv: - adrp x16, :got:__blue_glCore_glVertexAttribI4uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4uiv] + .global bluegl_glShaderBinary + .type bluegl_glShaderBinary, %function +bluegl_glShaderBinary: + adrp x16, :got:__blue_glCore_glShaderBinary + ldr x16, [x16, #:got_lo12:__blue_glCore_glShaderBinary] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI4uiv, .-bluegl_glVertexAttribI4uiv + .size bluegl_glShaderBinary, .-bluegl_glShaderBinary .align 2 - .global bluegl_glSecondaryColor3b - .type bluegl_glSecondaryColor3b, %function -bluegl_glSecondaryColor3b: - adrp x16, :got:__blue_glCore_glSecondaryColor3b - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3b] + .global bluegl_glGetShaderPrecisionFormat + .type bluegl_glGetShaderPrecisionFormat, %function +bluegl_glGetShaderPrecisionFormat: + adrp x16, :got:__blue_glCore_glGetShaderPrecisionFormat + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetShaderPrecisionFormat] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3b, .-bluegl_glSecondaryColor3b + .size bluegl_glGetShaderPrecisionFormat, .-bluegl_glGetShaderPrecisionFormat .align 2 - .global bluegl_glFogxvOES - .type bluegl_glFogxvOES, %function -bluegl_glFogxvOES: - adrp x16, :got:__blue_glCore_glFogxvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glFogxvOES] + .global bluegl_glDepthRangef + .type bluegl_glDepthRangef, %function +bluegl_glDepthRangef: + adrp x16, :got:__blue_glCore_glDepthRangef + ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthRangef] ldr x16, [x16] br x16 - .size bluegl_glFogxvOES, .-bluegl_glFogxvOES + .size bluegl_glDepthRangef, .-bluegl_glDepthRangef .align 2 - .global bluegl_glGlobalAlphaFactorubSUN - .type bluegl_glGlobalAlphaFactorubSUN, %function -bluegl_glGlobalAlphaFactorubSUN: - adrp x16, :got:__blue_glCore_glGlobalAlphaFactorubSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glGlobalAlphaFactorubSUN] + .global bluegl_glClearDepthf + .type bluegl_glClearDepthf, %function +bluegl_glClearDepthf: + adrp x16, :got:__blue_glCore_glClearDepthf + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearDepthf] ldr x16, [x16] br x16 - .size bluegl_glGlobalAlphaFactorubSUN, .-bluegl_glGlobalAlphaFactorubSUN + .size bluegl_glClearDepthf, .-bluegl_glClearDepthf .align 2 - .global bluegl_glVertexAttribI4svEXT - .type bluegl_glVertexAttribI4svEXT, %function -bluegl_glVertexAttribI4svEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI4svEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4svEXT] + .global bluegl_glGetProgramBinary + .type bluegl_glGetProgramBinary, %function +bluegl_glGetProgramBinary: + adrp x16, :got:__blue_glCore_glGetProgramBinary + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramBinary] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI4svEXT, .-bluegl_glVertexAttribI4svEXT + .size bluegl_glGetProgramBinary, .-bluegl_glGetProgramBinary .align 2 - .global bluegl_glSecondaryColor3sv - .type bluegl_glSecondaryColor3sv, %function -bluegl_glSecondaryColor3sv: - adrp x16, :got:__blue_glCore_glSecondaryColor3sv - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3sv] + .global bluegl_glProgramBinary + .type bluegl_glProgramBinary, %function +bluegl_glProgramBinary: + adrp x16, :got:__blue_glCore_glProgramBinary + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramBinary] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3sv, .-bluegl_glSecondaryColor3sv + .size bluegl_glProgramBinary, .-bluegl_glProgramBinary .align 2 - .global bluegl_glProgramUniformMatrix2x3dvEXT - .type bluegl_glProgramUniformMatrix2x3dvEXT, %function -bluegl_glProgramUniformMatrix2x3dvEXT: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix2x3dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2x3dvEXT] + .global bluegl_glProgramParameteri + .type bluegl_glProgramParameteri, %function +bluegl_glProgramParameteri: + adrp x16, :got:__blue_glCore_glProgramParameteri + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramParameteri] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix2x3dvEXT, .-bluegl_glProgramUniformMatrix2x3dvEXT + .size bluegl_glProgramParameteri, .-bluegl_glProgramParameteri .align 2 - .global bluegl_glTextureBarrier - .type bluegl_glTextureBarrier, %function -bluegl_glTextureBarrier: - adrp x16, :got:__blue_glCore_glTextureBarrier - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureBarrier] + .global bluegl_glUseProgramStages + .type bluegl_glUseProgramStages, %function +bluegl_glUseProgramStages: + adrp x16, :got:__blue_glCore_glUseProgramStages + ldr x16, [x16, #:got_lo12:__blue_glCore_glUseProgramStages] ldr x16, [x16] br x16 - .size bluegl_glTextureBarrier, .-bluegl_glTextureBarrier + .size bluegl_glUseProgramStages, .-bluegl_glUseProgramStages .align 2 - .global bluegl_glCreateSamplers - .type bluegl_glCreateSamplers, %function -bluegl_glCreateSamplers: - adrp x16, :got:__blue_glCore_glCreateSamplers - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateSamplers] + .global bluegl_glActiveShaderProgram + .type bluegl_glActiveShaderProgram, %function +bluegl_glActiveShaderProgram: + adrp x16, :got:__blue_glCore_glActiveShaderProgram + ldr x16, [x16, #:got_lo12:__blue_glCore_glActiveShaderProgram] ldr x16, [x16] br x16 - .size bluegl_glCreateSamplers, .-bluegl_glCreateSamplers + .size bluegl_glActiveShaderProgram, .-bluegl_glActiveShaderProgram .align 2 - .global bluegl_glVertexAttribP2ui - .type bluegl_glVertexAttribP2ui, %function -bluegl_glVertexAttribP2ui: - adrp x16, :got:__blue_glCore_glVertexAttribP2ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribP2ui] + .global bluegl_glCreateShaderProgramv + .type bluegl_glCreateShaderProgramv, %function +bluegl_glCreateShaderProgramv: + adrp x16, :got:__blue_glCore_glCreateShaderProgramv + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateShaderProgramv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribP2ui, .-bluegl_glVertexAttribP2ui + .size bluegl_glCreateShaderProgramv, .-bluegl_glCreateShaderProgramv .align 2 - .global bluegl_glGetTexParameterIiv - .type bluegl_glGetTexParameterIiv, %function -bluegl_glGetTexParameterIiv: - adrp x16, :got:__blue_glCore_glGetTexParameterIiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexParameterIiv] + .global bluegl_glBindProgramPipeline + .type bluegl_glBindProgramPipeline, %function +bluegl_glBindProgramPipeline: + adrp x16, :got:__blue_glCore_glBindProgramPipeline + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindProgramPipeline] ldr x16, [x16] br x16 - .size bluegl_glGetTexParameterIiv, .-bluegl_glGetTexParameterIiv + .size bluegl_glBindProgramPipeline, .-bluegl_glBindProgramPipeline .align 2 - .global bluegl_glConvolutionParameterfvEXT - .type bluegl_glConvolutionParameterfvEXT, %function -bluegl_glConvolutionParameterfvEXT: - adrp x16, :got:__blue_glCore_glConvolutionParameterfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameterfvEXT] + .global bluegl_glDeleteProgramPipelines + .type bluegl_glDeleteProgramPipelines, %function +bluegl_glDeleteProgramPipelines: + adrp x16, :got:__blue_glCore_glDeleteProgramPipelines + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteProgramPipelines] ldr x16, [x16] br x16 - .size bluegl_glConvolutionParameterfvEXT, .-bluegl_glConvolutionParameterfvEXT + .size bluegl_glDeleteProgramPipelines, .-bluegl_glDeleteProgramPipelines .align 2 - .global bluegl_glPathGlyphIndexArrayNV - .type bluegl_glPathGlyphIndexArrayNV, %function -bluegl_glPathGlyphIndexArrayNV: - adrp x16, :got:__blue_glCore_glPathGlyphIndexArrayNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathGlyphIndexArrayNV] + .global bluegl_glGenProgramPipelines + .type bluegl_glGenProgramPipelines, %function +bluegl_glGenProgramPipelines: + adrp x16, :got:__blue_glCore_glGenProgramPipelines + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenProgramPipelines] ldr x16, [x16] br x16 - .size bluegl_glPathGlyphIndexArrayNV, .-bluegl_glPathGlyphIndexArrayNV + .size bluegl_glGenProgramPipelines, .-bluegl_glGenProgramPipelines .align 2 - .global bluegl_glCopyTexSubImage2D - .type bluegl_glCopyTexSubImage2D, %function -bluegl_glCopyTexSubImage2D: - adrp x16, :got:__blue_glCore_glCopyTexSubImage2D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexSubImage2D] + .global bluegl_glIsProgramPipeline + .type bluegl_glIsProgramPipeline, %function +bluegl_glIsProgramPipeline: + adrp x16, :got:__blue_glCore_glIsProgramPipeline + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsProgramPipeline] ldr x16, [x16] br x16 - .size bluegl_glCopyTexSubImage2D, .-bluegl_glCopyTexSubImage2D + .size bluegl_glIsProgramPipeline, .-bluegl_glIsProgramPipeline .align 2 - .global bluegl_glVertexArrayParameteriAPPLE - .type bluegl_glVertexArrayParameteriAPPLE, %function -bluegl_glVertexArrayParameteriAPPLE: - adrp x16, :got:__blue_glCore_glVertexArrayParameteriAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayParameteriAPPLE] + .global bluegl_glGetProgramPipelineiv + .type bluegl_glGetProgramPipelineiv, %function +bluegl_glGetProgramPipelineiv: + adrp x16, :got:__blue_glCore_glGetProgramPipelineiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramPipelineiv] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayParameteriAPPLE, .-bluegl_glVertexArrayParameteriAPPLE + .size bluegl_glGetProgramPipelineiv, .-bluegl_glGetProgramPipelineiv .align 2 - .global bluegl_glGetnConvolutionFilterARB - .type bluegl_glGetnConvolutionFilterARB, %function -bluegl_glGetnConvolutionFilterARB: - adrp x16, :got:__blue_glCore_glGetnConvolutionFilterARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnConvolutionFilterARB] + .global bluegl_glProgramUniform1i + .type bluegl_glProgramUniform1i, %function +bluegl_glProgramUniform1i: + adrp x16, :got:__blue_glCore_glProgramUniform1i + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1i] ldr x16, [x16] br x16 - .size bluegl_glGetnConvolutionFilterARB, .-bluegl_glGetnConvolutionFilterARB + .size bluegl_glProgramUniform1i, .-bluegl_glProgramUniform1i .align 2 - .global bluegl_glVariantfvEXT - .type bluegl_glVariantfvEXT, %function -bluegl_glVariantfvEXT: - adrp x16, :got:__blue_glCore_glVariantfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantfvEXT] + .global bluegl_glProgramUniform1iv + .type bluegl_glProgramUniform1iv, %function +bluegl_glProgramUniform1iv: + adrp x16, :got:__blue_glCore_glProgramUniform1iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1iv] ldr x16, [x16] br x16 - .size bluegl_glVariantfvEXT, .-bluegl_glVariantfvEXT + .size bluegl_glProgramUniform1iv, .-bluegl_glProgramUniform1iv .align 2 - .global bluegl_glGetMultisamplefvNV - .type bluegl_glGetMultisamplefvNV, %function -bluegl_glGetMultisamplefvNV: - adrp x16, :got:__blue_glCore_glGetMultisamplefvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultisamplefvNV] + .global bluegl_glProgramUniform1f + .type bluegl_glProgramUniform1f, %function +bluegl_glProgramUniform1f: + adrp x16, :got:__blue_glCore_glProgramUniform1f + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1f] ldr x16, [x16] br x16 - .size bluegl_glGetMultisamplefvNV, .-bluegl_glGetMultisamplefvNV + .size bluegl_glProgramUniform1f, .-bluegl_glProgramUniform1f .align 2 - .global bluegl_glQueryObjectParameteruiAMD - .type bluegl_glQueryObjectParameteruiAMD, %function -bluegl_glQueryObjectParameteruiAMD: - adrp x16, :got:__blue_glCore_glQueryObjectParameteruiAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glQueryObjectParameteruiAMD] + .global bluegl_glProgramUniform1fv + .type bluegl_glProgramUniform1fv, %function +bluegl_glProgramUniform1fv: + adrp x16, :got:__blue_glCore_glProgramUniform1fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1fv] ldr x16, [x16] br x16 - .size bluegl_glQueryObjectParameteruiAMD, .-bluegl_glQueryObjectParameteruiAMD + .size bluegl_glProgramUniform1fv, .-bluegl_glProgramUniform1fv .align 2 - .global bluegl_glMatrixIndexPointerARB - .type bluegl_glMatrixIndexPointerARB, %function -bluegl_glMatrixIndexPointerARB: - adrp x16, :got:__blue_glCore_glMatrixIndexPointerARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixIndexPointerARB] + .global bluegl_glProgramUniform1d + .type bluegl_glProgramUniform1d, %function +bluegl_glProgramUniform1d: + adrp x16, :got:__blue_glCore_glProgramUniform1d + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1d] ldr x16, [x16] br x16 - .size bluegl_glMatrixIndexPointerARB, .-bluegl_glMatrixIndexPointerARB + .size bluegl_glProgramUniform1d, .-bluegl_glProgramUniform1d .align 2 - .global bluegl_glGetQueryObjectuivARB - .type bluegl_glGetQueryObjectuivARB, %function -bluegl_glGetQueryObjectuivARB: - adrp x16, :got:__blue_glCore_glGetQueryObjectuivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryObjectuivARB] + .global bluegl_glProgramUniform1dv + .type bluegl_glProgramUniform1dv, %function +bluegl_glProgramUniform1dv: + adrp x16, :got:__blue_glCore_glProgramUniform1dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1dv] ldr x16, [x16] br x16 - .size bluegl_glGetQueryObjectuivARB, .-bluegl_glGetQueryObjectuivARB + .size bluegl_glProgramUniform1dv, .-bluegl_glProgramUniform1dv .align 2 - .global bluegl_glColorFormatNV - .type bluegl_glColorFormatNV, %function -bluegl_glColorFormatNV: - adrp x16, :got:__blue_glCore_glColorFormatNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorFormatNV] + .global bluegl_glProgramUniform1ui + .type bluegl_glProgramUniform1ui, %function +bluegl_glProgramUniform1ui: + adrp x16, :got:__blue_glCore_glProgramUniform1ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1ui] ldr x16, [x16] br x16 - .size bluegl_glColorFormatNV, .-bluegl_glColorFormatNV + .size bluegl_glProgramUniform1ui, .-bluegl_glProgramUniform1ui .align 2 - .global bluegl_glMultiTexGenfvEXT - .type bluegl_glMultiTexGenfvEXT, %function -bluegl_glMultiTexGenfvEXT: - adrp x16, :got:__blue_glCore_glMultiTexGenfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexGenfvEXT] + .global bluegl_glProgramUniform1uiv + .type bluegl_glProgramUniform1uiv, %function +bluegl_glProgramUniform1uiv: + adrp x16, :got:__blue_glCore_glProgramUniform1uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1uiv] ldr x16, [x16] br x16 - .size bluegl_glMultiTexGenfvEXT, .-bluegl_glMultiTexGenfvEXT + .size bluegl_glProgramUniform1uiv, .-bluegl_glProgramUniform1uiv .align 2 - .global bluegl_glGetUniformfvARB - .type bluegl_glGetUniformfvARB, %function -bluegl_glGetUniformfvARB: - adrp x16, :got:__blue_glCore_glGetUniformfvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformfvARB] + .global bluegl_glProgramUniform2i + .type bluegl_glProgramUniform2i, %function +bluegl_glProgramUniform2i: + adrp x16, :got:__blue_glCore_glProgramUniform2i + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2i] ldr x16, [x16] br x16 - .size bluegl_glGetUniformfvARB, .-bluegl_glGetUniformfvARB + .size bluegl_glProgramUniform2i, .-bluegl_glProgramUniform2i .align 2 - .global bluegl_glTexCoord3hNV - .type bluegl_glTexCoord3hNV, %function -bluegl_glTexCoord3hNV: - adrp x16, :got:__blue_glCore_glTexCoord3hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord3hNV] + .global bluegl_glProgramUniform2iv + .type bluegl_glProgramUniform2iv, %function +bluegl_glProgramUniform2iv: + adrp x16, :got:__blue_glCore_glProgramUniform2iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2iv] ldr x16, [x16] br x16 - .size bluegl_glTexCoord3hNV, .-bluegl_glTexCoord3hNV + .size bluegl_glProgramUniform2iv, .-bluegl_glProgramUniform2iv .align 2 - .global bluegl_glPathGlyphRangeNV - .type bluegl_glPathGlyphRangeNV, %function -bluegl_glPathGlyphRangeNV: - adrp x16, :got:__blue_glCore_glPathGlyphRangeNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathGlyphRangeNV] + .global bluegl_glProgramUniform2f + .type bluegl_glProgramUniform2f, %function +bluegl_glProgramUniform2f: + adrp x16, :got:__blue_glCore_glProgramUniform2f + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2f] ldr x16, [x16] br x16 - .size bluegl_glPathGlyphRangeNV, .-bluegl_glPathGlyphRangeNV + .size bluegl_glProgramUniform2f, .-bluegl_glProgramUniform2f .align 2 - .global bluegl_glCopyTextureSubImage3DEXT - .type bluegl_glCopyTextureSubImage3DEXT, %function -bluegl_glCopyTextureSubImage3DEXT: - adrp x16, :got:__blue_glCore_glCopyTextureSubImage3DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTextureSubImage3DEXT] + .global bluegl_glProgramUniform2fv + .type bluegl_glProgramUniform2fv, %function +bluegl_glProgramUniform2fv: + adrp x16, :got:__blue_glCore_glProgramUniform2fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2fv] ldr x16, [x16] br x16 - .size bluegl_glCopyTextureSubImage3DEXT, .-bluegl_glCopyTextureSubImage3DEXT + .size bluegl_glProgramUniform2fv, .-bluegl_glProgramUniform2fv .align 2 - .global bluegl_glColor3xOES - .type bluegl_glColor3xOES, %function -bluegl_glColor3xOES: - adrp x16, :got:__blue_glCore_glColor3xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glColor3xOES] + .global bluegl_glProgramUniform2d + .type bluegl_glProgramUniform2d, %function +bluegl_glProgramUniform2d: + adrp x16, :got:__blue_glCore_glProgramUniform2d + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2d] ldr x16, [x16] br x16 - .size bluegl_glColor3xOES, .-bluegl_glColor3xOES + .size bluegl_glProgramUniform2d, .-bluegl_glProgramUniform2d .align 2 - .global bluegl_glVertexAttrib4hNV - .type bluegl_glVertexAttrib4hNV, %function -bluegl_glVertexAttrib4hNV: - adrp x16, :got:__blue_glCore_glVertexAttrib4hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4hNV] + .global bluegl_glProgramUniform2dv + .type bluegl_glProgramUniform2dv, %function +bluegl_glProgramUniform2dv: + adrp x16, :got:__blue_glCore_glProgramUniform2dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2dv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4hNV, .-bluegl_glVertexAttrib4hNV + .size bluegl_glProgramUniform2dv, .-bluegl_glProgramUniform2dv .align 2 - .global bluegl_glProgramUniformui64NV - .type bluegl_glProgramUniformui64NV, %function -bluegl_glProgramUniformui64NV: - adrp x16, :got:__blue_glCore_glProgramUniformui64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformui64NV] + .global bluegl_glProgramUniform2ui + .type bluegl_glProgramUniform2ui, %function +bluegl_glProgramUniform2ui: + adrp x16, :got:__blue_glCore_glProgramUniform2ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2ui] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformui64NV, .-bluegl_glProgramUniformui64NV + .size bluegl_glProgramUniform2ui, .-bluegl_glProgramUniform2ui .align 2 - .global bluegl_glVertexArrayVertexAttribLFormatEXT - .type bluegl_glVertexArrayVertexAttribLFormatEXT, %function -bluegl_glVertexArrayVertexAttribLFormatEXT: - adrp x16, :got:__blue_glCore_glVertexArrayVertexAttribLFormatEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexAttribLFormatEXT] + .global bluegl_glProgramUniform2uiv + .type bluegl_glProgramUniform2uiv, %function +bluegl_glProgramUniform2uiv: + adrp x16, :got:__blue_glCore_glProgramUniform2uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2uiv] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayVertexAttribLFormatEXT, .-bluegl_glVertexArrayVertexAttribLFormatEXT + .size bluegl_glProgramUniform2uiv, .-bluegl_glProgramUniform2uiv .align 2 - .global bluegl_glGetMinmaxParameterivEXT - .type bluegl_glGetMinmaxParameterivEXT, %function -bluegl_glGetMinmaxParameterivEXT: - adrp x16, :got:__blue_glCore_glGetMinmaxParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMinmaxParameterivEXT] + .global bluegl_glProgramUniform3i + .type bluegl_glProgramUniform3i, %function +bluegl_glProgramUniform3i: + adrp x16, :got:__blue_glCore_glProgramUniform3i + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3i] ldr x16, [x16] br x16 - .size bluegl_glGetMinmaxParameterivEXT, .-bluegl_glGetMinmaxParameterivEXT + .size bluegl_glProgramUniform3i, .-bluegl_glProgramUniform3i .align 2 - .global bluegl_glWindowPos3iMESA - .type bluegl_glWindowPos3iMESA, %function -bluegl_glWindowPos3iMESA: - adrp x16, :got:__blue_glCore_glWindowPos3iMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3iMESA] + .global bluegl_glProgramUniform3iv + .type bluegl_glProgramUniform3iv, %function +bluegl_glProgramUniform3iv: + adrp x16, :got:__blue_glCore_glProgramUniform3iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3iv] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3iMESA, .-bluegl_glWindowPos3iMESA + .size bluegl_glProgramUniform3iv, .-bluegl_glProgramUniform3iv .align 2 - .global bluegl_glVertexAttribLFormat - .type bluegl_glVertexAttribLFormat, %function -bluegl_glVertexAttribLFormat: - adrp x16, :got:__blue_glCore_glVertexAttribLFormat - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribLFormat] + .global bluegl_glProgramUniform3f + .type bluegl_glProgramUniform3f, %function +bluegl_glProgramUniform3f: + adrp x16, :got:__blue_glCore_glProgramUniform3f + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3f] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribLFormat, .-bluegl_glVertexAttribLFormat + .size bluegl_glProgramUniform3f, .-bluegl_glProgramUniform3f .align 2 - .global bluegl_glGetObjectParameterfvARB - .type bluegl_glGetObjectParameterfvARB, %function -bluegl_glGetObjectParameterfvARB: - adrp x16, :got:__blue_glCore_glGetObjectParameterfvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetObjectParameterfvARB] + .global bluegl_glProgramUniform3fv + .type bluegl_glProgramUniform3fv, %function +bluegl_glProgramUniform3fv: + adrp x16, :got:__blue_glCore_glProgramUniform3fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3fv] ldr x16, [x16] br x16 - .size bluegl_glGetObjectParameterfvARB, .-bluegl_glGetObjectParameterfvARB + .size bluegl_glProgramUniform3fv, .-bluegl_glProgramUniform3fv .align 2 - .global bluegl_glStencilFillPathNV - .type bluegl_glStencilFillPathNV, %function -bluegl_glStencilFillPathNV: - adrp x16, :got:__blue_glCore_glStencilFillPathNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilFillPathNV] + .global bluegl_glProgramUniform3d + .type bluegl_glProgramUniform3d, %function +bluegl_glProgramUniform3d: + adrp x16, :got:__blue_glCore_glProgramUniform3d + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3d] ldr x16, [x16] br x16 - .size bluegl_glStencilFillPathNV, .-bluegl_glStencilFillPathNV + .size bluegl_glProgramUniform3d, .-bluegl_glProgramUniform3d .align 2 - .global bluegl_glEvalCoord1xvOES - .type bluegl_glEvalCoord1xvOES, %function -bluegl_glEvalCoord1xvOES: - adrp x16, :got:__blue_glCore_glEvalCoord1xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glEvalCoord1xvOES] + .global bluegl_glProgramUniform3dv + .type bluegl_glProgramUniform3dv, %function +bluegl_glProgramUniform3dv: + adrp x16, :got:__blue_glCore_glProgramUniform3dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3dv] ldr x16, [x16] br x16 - .size bluegl_glEvalCoord1xvOES, .-bluegl_glEvalCoord1xvOES + .size bluegl_glProgramUniform3dv, .-bluegl_glProgramUniform3dv .align 2 - .global bluegl_glUniform4d - .type bluegl_glUniform4d, %function -bluegl_glUniform4d: - adrp x16, :got:__blue_glCore_glUniform4d - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4d] + .global bluegl_glProgramUniform3ui + .type bluegl_glProgramUniform3ui, %function +bluegl_glProgramUniform3ui: + adrp x16, :got:__blue_glCore_glProgramUniform3ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3ui] ldr x16, [x16] br x16 - .size bluegl_glUniform4d, .-bluegl_glUniform4d + .size bluegl_glProgramUniform3ui, .-bluegl_glProgramUniform3ui .align 2 - .global bluegl_glGetTextureHandleNV - .type bluegl_glGetTextureHandleNV, %function -bluegl_glGetTextureHandleNV: - adrp x16, :got:__blue_glCore_glGetTextureHandleNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureHandleNV] + .global bluegl_glProgramUniform3uiv + .type bluegl_glProgramUniform3uiv, %function +bluegl_glProgramUniform3uiv: + adrp x16, :got:__blue_glCore_glProgramUniform3uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3uiv] ldr x16, [x16] br x16 - .size bluegl_glGetTextureHandleNV, .-bluegl_glGetTextureHandleNV + .size bluegl_glProgramUniform3uiv, .-bluegl_glProgramUniform3uiv .align 2 - .global bluegl_glGetUniformuivEXT - .type bluegl_glGetUniformuivEXT, %function -bluegl_glGetUniformuivEXT: - adrp x16, :got:__blue_glCore_glGetUniformuivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformuivEXT] + .global bluegl_glProgramUniform4i + .type bluegl_glProgramUniform4i, %function +bluegl_glProgramUniform4i: + adrp x16, :got:__blue_glCore_glProgramUniform4i + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4i] ldr x16, [x16] br x16 - .size bluegl_glGetUniformuivEXT, .-bluegl_glGetUniformuivEXT + .size bluegl_glProgramUniform4i, .-bluegl_glProgramUniform4i .align 2 - .global bluegl_glIsTextureEXT - .type bluegl_glIsTextureEXT, %function -bluegl_glIsTextureEXT: - adrp x16, :got:__blue_glCore_glIsTextureEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsTextureEXT] + .global bluegl_glProgramUniform4iv + .type bluegl_glProgramUniform4iv, %function +bluegl_glProgramUniform4iv: + adrp x16, :got:__blue_glCore_glProgramUniform4iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4iv] ldr x16, [x16] br x16 - .size bluegl_glIsTextureEXT, .-bluegl_glIsTextureEXT + .size bluegl_glProgramUniform4iv, .-bluegl_glProgramUniform4iv .align 2 - .global bluegl_glProgramUniform2d - .type bluegl_glProgramUniform2d, %function -bluegl_glProgramUniform2d: - adrp x16, :got:__blue_glCore_glProgramUniform2d - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2d] + .global bluegl_glProgramUniform4f + .type bluegl_glProgramUniform4f, %function +bluegl_glProgramUniform4f: + adrp x16, :got:__blue_glCore_glProgramUniform4f + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4f] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2d, .-bluegl_glProgramUniform2d + .size bluegl_glProgramUniform4f, .-bluegl_glProgramUniform4f .align 2 - .global bluegl_glGetnUniformuivARB - .type bluegl_glGetnUniformuivARB, %function -bluegl_glGetnUniformuivARB: - adrp x16, :got:__blue_glCore_glGetnUniformuivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformuivARB] + .global bluegl_glProgramUniform4fv + .type bluegl_glProgramUniform4fv, %function +bluegl_glProgramUniform4fv: + adrp x16, :got:__blue_glCore_glProgramUniform4fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4fv] ldr x16, [x16] br x16 - .size bluegl_glGetnUniformuivARB, .-bluegl_glGetnUniformuivARB + .size bluegl_glProgramUniform4fv, .-bluegl_glProgramUniform4fv .align 2 - .global bluegl_glIsShader - .type bluegl_glIsShader, %function -bluegl_glIsShader: - adrp x16, :got:__blue_glCore_glIsShader - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsShader] + .global bluegl_glProgramUniform4d + .type bluegl_glProgramUniform4d, %function +bluegl_glProgramUniform4d: + adrp x16, :got:__blue_glCore_glProgramUniform4d + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4d] ldr x16, [x16] br x16 - .size bluegl_glIsShader, .-bluegl_glIsShader + .size bluegl_glProgramUniform4d, .-bluegl_glProgramUniform4d .align 2 - .global bluegl_glGetVertexArrayIndexed64iv - .type bluegl_glGetVertexArrayIndexed64iv, %function -bluegl_glGetVertexArrayIndexed64iv: - adrp x16, :got:__blue_glCore_glGetVertexArrayIndexed64iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexArrayIndexed64iv] + .global bluegl_glProgramUniform4dv + .type bluegl_glProgramUniform4dv, %function +bluegl_glProgramUniform4dv: + adrp x16, :got:__blue_glCore_glProgramUniform4dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4dv] ldr x16, [x16] br x16 - .size bluegl_glGetVertexArrayIndexed64iv, .-bluegl_glGetVertexArrayIndexed64iv + .size bluegl_glProgramUniform4dv, .-bluegl_glProgramUniform4dv .align 2 - .global bluegl_glGetnHistogramARB - .type bluegl_glGetnHistogramARB, %function -bluegl_glGetnHistogramARB: - adrp x16, :got:__blue_glCore_glGetnHistogramARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnHistogramARB] + .global bluegl_glProgramUniform4ui + .type bluegl_glProgramUniform4ui, %function +bluegl_glProgramUniform4ui: + adrp x16, :got:__blue_glCore_glProgramUniform4ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4ui] ldr x16, [x16] br x16 - .size bluegl_glGetnHistogramARB, .-bluegl_glGetnHistogramARB + .size bluegl_glProgramUniform4ui, .-bluegl_glProgramUniform4ui .align 2 - .global bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN - .type bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN, %function -bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN: - adrp x16, :got:__blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN] + .global bluegl_glProgramUniform4uiv + .type bluegl_glProgramUniform4uiv, %function +bluegl_glProgramUniform4uiv: + adrp x16, :got:__blue_glCore_glProgramUniform4uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4uiv] ldr x16, [x16] br x16 - .size bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN, .-bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN + .size bluegl_glProgramUniform4uiv, .-bluegl_glProgramUniform4uiv .align 2 - .global bluegl_glVertexAttribI2ivEXT - .type bluegl_glVertexAttribI2ivEXT, %function -bluegl_glVertexAttribI2ivEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI2ivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI2ivEXT] + .global bluegl_glProgramUniformMatrix2fv + .type bluegl_glProgramUniformMatrix2fv, %function +bluegl_glProgramUniformMatrix2fv: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix2fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2fv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI2ivEXT, .-bluegl_glVertexAttribI2ivEXT + .size bluegl_glProgramUniformMatrix2fv, .-bluegl_glProgramUniformMatrix2fv .align 2 - .global bluegl_glTexSubImage2DEXT - .type bluegl_glTexSubImage2DEXT, %function -bluegl_glTexSubImage2DEXT: - adrp x16, :got:__blue_glCore_glTexSubImage2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexSubImage2DEXT] + .global bluegl_glProgramUniformMatrix3fv + .type bluegl_glProgramUniformMatrix3fv, %function +bluegl_glProgramUniformMatrix3fv: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix3fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3fv] ldr x16, [x16] br x16 - .size bluegl_glTexSubImage2DEXT, .-bluegl_glTexSubImage2DEXT + .size bluegl_glProgramUniformMatrix3fv, .-bluegl_glProgramUniformMatrix3fv .align 2 - .global bluegl_glGetFragmentMaterialivSGIX - .type bluegl_glGetFragmentMaterialivSGIX, %function -bluegl_glGetFragmentMaterialivSGIX: - adrp x16, :got:__blue_glCore_glGetFragmentMaterialivSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFragmentMaterialivSGIX] + .global bluegl_glProgramUniformMatrix4fv + .type bluegl_glProgramUniformMatrix4fv, %function +bluegl_glProgramUniformMatrix4fv: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix4fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4fv] ldr x16, [x16] br x16 - .size bluegl_glGetFragmentMaterialivSGIX, .-bluegl_glGetFragmentMaterialivSGIX + .size bluegl_glProgramUniformMatrix4fv, .-bluegl_glProgramUniformMatrix4fv .align 2 - .global bluegl_glClearNamedFramebufferiv - .type bluegl_glClearNamedFramebufferiv, %function -bluegl_glClearNamedFramebufferiv: - adrp x16, :got:__blue_glCore_glClearNamedFramebufferiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearNamedFramebufferiv] + .global bluegl_glProgramUniformMatrix2dv + .type bluegl_glProgramUniformMatrix2dv, %function +bluegl_glProgramUniformMatrix2dv: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix2dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2dv] ldr x16, [x16] br x16 - .size bluegl_glClearNamedFramebufferiv, .-bluegl_glClearNamedFramebufferiv + .size bluegl_glProgramUniformMatrix2dv, .-bluegl_glProgramUniformMatrix2dv .align 2 - .global bluegl_glMatrixMult3x3fNV - .type bluegl_glMatrixMult3x3fNV, %function -bluegl_glMatrixMult3x3fNV: - adrp x16, :got:__blue_glCore_glMatrixMult3x3fNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixMult3x3fNV] + .global bluegl_glProgramUniformMatrix3dv + .type bluegl_glProgramUniformMatrix3dv, %function +bluegl_glProgramUniformMatrix3dv: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix3dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3dv] ldr x16, [x16] br x16 - .size bluegl_glMatrixMult3x3fNV, .-bluegl_glMatrixMult3x3fNV + .size bluegl_glProgramUniformMatrix3dv, .-bluegl_glProgramUniformMatrix3dv .align 2 - .global bluegl_glGetQueryBufferObjectiv - .type bluegl_glGetQueryBufferObjectiv, %function -bluegl_glGetQueryBufferObjectiv: - adrp x16, :got:__blue_glCore_glGetQueryBufferObjectiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryBufferObjectiv] + .global bluegl_glProgramUniformMatrix4dv + .type bluegl_glProgramUniformMatrix4dv, %function +bluegl_glProgramUniformMatrix4dv: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix4dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4dv] ldr x16, [x16] br x16 - .size bluegl_glGetQueryBufferObjectiv, .-bluegl_glGetQueryBufferObjectiv + .size bluegl_glProgramUniformMatrix4dv, .-bluegl_glProgramUniformMatrix4dv .align 2 - .global bluegl_glVideoCaptureStreamParameterfvNV - .type bluegl_glVideoCaptureStreamParameterfvNV, %function -bluegl_glVideoCaptureStreamParameterfvNV: - adrp x16, :got:__blue_glCore_glVideoCaptureStreamParameterfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVideoCaptureStreamParameterfvNV] + .global bluegl_glProgramUniformMatrix2x3fv + .type bluegl_glProgramUniformMatrix2x3fv, %function +bluegl_glProgramUniformMatrix2x3fv: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix2x3fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2x3fv] ldr x16, [x16] br x16 - .size bluegl_glVideoCaptureStreamParameterfvNV, .-bluegl_glVideoCaptureStreamParameterfvNV + .size bluegl_glProgramUniformMatrix2x3fv, .-bluegl_glProgramUniformMatrix2x3fv .align 2 - .global bluegl_glTexImage3DMultisample - .type bluegl_glTexImage3DMultisample, %function -bluegl_glTexImage3DMultisample: - adrp x16, :got:__blue_glCore_glTexImage3DMultisample - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexImage3DMultisample] + .global bluegl_glProgramUniformMatrix3x2fv + .type bluegl_glProgramUniformMatrix3x2fv, %function +bluegl_glProgramUniformMatrix3x2fv: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix3x2fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3x2fv] ldr x16, [x16] br x16 - .size bluegl_glTexImage3DMultisample, .-bluegl_glTexImage3DMultisample + .size bluegl_glProgramUniformMatrix3x2fv, .-bluegl_glProgramUniformMatrix3x2fv .align 2 - .global bluegl_glVertexArraySecondaryColorOffsetEXT - .type bluegl_glVertexArraySecondaryColorOffsetEXT, %function -bluegl_glVertexArraySecondaryColorOffsetEXT: - adrp x16, :got:__blue_glCore_glVertexArraySecondaryColorOffsetEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArraySecondaryColorOffsetEXT] + .global bluegl_glProgramUniformMatrix2x4fv + .type bluegl_glProgramUniformMatrix2x4fv, %function +bluegl_glProgramUniformMatrix2x4fv: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix2x4fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2x4fv] ldr x16, [x16] br x16 - .size bluegl_glVertexArraySecondaryColorOffsetEXT, .-bluegl_glVertexArraySecondaryColorOffsetEXT + .size bluegl_glProgramUniformMatrix2x4fv, .-bluegl_glProgramUniformMatrix2x4fv .align 2 - .global bluegl_glVariantusvEXT - .type bluegl_glVariantusvEXT, %function -bluegl_glVariantusvEXT: - adrp x16, :got:__blue_glCore_glVariantusvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantusvEXT] + .global bluegl_glProgramUniformMatrix4x2fv + .type bluegl_glProgramUniformMatrix4x2fv, %function +bluegl_glProgramUniformMatrix4x2fv: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix4x2fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4x2fv] ldr x16, [x16] br x16 - .size bluegl_glVariantusvEXT, .-bluegl_glVariantusvEXT + .size bluegl_glProgramUniformMatrix4x2fv, .-bluegl_glProgramUniformMatrix4x2fv .align 2 - .global bluegl_glDrawArraysInstanced - .type bluegl_glDrawArraysInstanced, %function -bluegl_glDrawArraysInstanced: - adrp x16, :got:__blue_glCore_glDrawArraysInstanced - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawArraysInstanced] + .global bluegl_glProgramUniformMatrix3x4fv + .type bluegl_glProgramUniformMatrix3x4fv, %function +bluegl_glProgramUniformMatrix3x4fv: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix3x4fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3x4fv] ldr x16, [x16] br x16 - .size bluegl_glDrawArraysInstanced, .-bluegl_glDrawArraysInstanced + .size bluegl_glProgramUniformMatrix3x4fv, .-bluegl_glProgramUniformMatrix3x4fv .align 2 - .global bluegl_glProgramUniformMatrix2x4dvEXT - .type bluegl_glProgramUniformMatrix2x4dvEXT, %function -bluegl_glProgramUniformMatrix2x4dvEXT: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix2x4dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2x4dvEXT] + .global bluegl_glProgramUniformMatrix4x3fv + .type bluegl_glProgramUniformMatrix4x3fv, %function +bluegl_glProgramUniformMatrix4x3fv: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix4x3fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4x3fv] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix2x4dvEXT, .-bluegl_glProgramUniformMatrix2x4dvEXT + .size bluegl_glProgramUniformMatrix4x3fv, .-bluegl_glProgramUniformMatrix4x3fv .align 2 - .global bluegl_glProgramBufferParametersIivNV - .type bluegl_glProgramBufferParametersIivNV, %function -bluegl_glProgramBufferParametersIivNV: - adrp x16, :got:__blue_glCore_glProgramBufferParametersIivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramBufferParametersIivNV] + .global bluegl_glProgramUniformMatrix2x3dv + .type bluegl_glProgramUniformMatrix2x3dv, %function +bluegl_glProgramUniformMatrix2x3dv: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix2x3dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2x3dv] ldr x16, [x16] br x16 - .size bluegl_glProgramBufferParametersIivNV, .-bluegl_glProgramBufferParametersIivNV + .size bluegl_glProgramUniformMatrix2x3dv, .-bluegl_glProgramUniformMatrix2x3dv .align 2 - .global bluegl_glViewportArrayv - .type bluegl_glViewportArrayv, %function -bluegl_glViewportArrayv: - adrp x16, :got:__blue_glCore_glViewportArrayv - ldr x16, [x16, #:got_lo12:__blue_glCore_glViewportArrayv] + .global bluegl_glProgramUniformMatrix3x2dv + .type bluegl_glProgramUniformMatrix3x2dv, %function +bluegl_glProgramUniformMatrix3x2dv: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix3x2dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3x2dv] ldr x16, [x16] br x16 - .size bluegl_glViewportArrayv, .-bluegl_glViewportArrayv + .size bluegl_glProgramUniformMatrix3x2dv, .-bluegl_glProgramUniformMatrix3x2dv .align 2 - .global bluegl_glTangent3svEXT - .type bluegl_glTangent3svEXT, %function -bluegl_glTangent3svEXT: - adrp x16, :got:__blue_glCore_glTangent3svEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3svEXT] + .global bluegl_glProgramUniformMatrix2x4dv + .type bluegl_glProgramUniformMatrix2x4dv, %function +bluegl_glProgramUniformMatrix2x4dv: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix2x4dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2x4dv] + ldr x16, [x16] + br x16 + .size bluegl_glProgramUniformMatrix2x4dv, .-bluegl_glProgramUniformMatrix2x4dv + + .align 2 + .global bluegl_glProgramUniformMatrix4x2dv + .type bluegl_glProgramUniformMatrix4x2dv, %function +bluegl_glProgramUniformMatrix4x2dv: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix4x2dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4x2dv] ldr x16, [x16] br x16 - .size bluegl_glTangent3svEXT, .-bluegl_glTangent3svEXT + .size bluegl_glProgramUniformMatrix4x2dv, .-bluegl_glProgramUniformMatrix4x2dv .align 2 - .global bluegl_glReplacementCodeuiVertex3fSUN - .type bluegl_glReplacementCodeuiVertex3fSUN, %function -bluegl_glReplacementCodeuiVertex3fSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeuiVertex3fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiVertex3fSUN] + .global bluegl_glProgramUniformMatrix3x4dv + .type bluegl_glProgramUniformMatrix3x4dv, %function +bluegl_glProgramUniformMatrix3x4dv: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix3x4dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3x4dv] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeuiVertex3fSUN, .-bluegl_glReplacementCodeuiVertex3fSUN + .size bluegl_glProgramUniformMatrix3x4dv, .-bluegl_glProgramUniformMatrix3x4dv .align 2 - .global bluegl_glSharpenTexFuncSGIS - .type bluegl_glSharpenTexFuncSGIS, %function -bluegl_glSharpenTexFuncSGIS: - adrp x16, :got:__blue_glCore_glSharpenTexFuncSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glSharpenTexFuncSGIS] + .global bluegl_glProgramUniformMatrix4x3dv + .type bluegl_glProgramUniformMatrix4x3dv, %function +bluegl_glProgramUniformMatrix4x3dv: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix4x3dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4x3dv] ldr x16, [x16] br x16 - .size bluegl_glSharpenTexFuncSGIS, .-bluegl_glSharpenTexFuncSGIS + .size bluegl_glProgramUniformMatrix4x3dv, .-bluegl_glProgramUniformMatrix4x3dv .align 2 - .global bluegl_glNormalFormatNV - .type bluegl_glNormalFormatNV, %function -bluegl_glNormalFormatNV: - adrp x16, :got:__blue_glCore_glNormalFormatNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalFormatNV] + .global bluegl_glValidateProgramPipeline + .type bluegl_glValidateProgramPipeline, %function +bluegl_glValidateProgramPipeline: + adrp x16, :got:__blue_glCore_glValidateProgramPipeline + ldr x16, [x16, #:got_lo12:__blue_glCore_glValidateProgramPipeline] ldr x16, [x16] br x16 - .size bluegl_glNormalFormatNV, .-bluegl_glNormalFormatNV + .size bluegl_glValidateProgramPipeline, .-bluegl_glValidateProgramPipeline .align 2 - .global bluegl_glVertexAttribL3dv - .type bluegl_glVertexAttribL3dv, %function -bluegl_glVertexAttribL3dv: - adrp x16, :got:__blue_glCore_glVertexAttribL3dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL3dv] + .global bluegl_glGetProgramPipelineInfoLog + .type bluegl_glGetProgramPipelineInfoLog, %function +bluegl_glGetProgramPipelineInfoLog: + adrp x16, :got:__blue_glCore_glGetProgramPipelineInfoLog + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramPipelineInfoLog] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL3dv, .-bluegl_glVertexAttribL3dv + .size bluegl_glGetProgramPipelineInfoLog, .-bluegl_glGetProgramPipelineInfoLog .align 2 - .global bluegl_glNamedStringARB - .type bluegl_glNamedStringARB, %function -bluegl_glNamedStringARB: - adrp x16, :got:__blue_glCore_glNamedStringARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedStringARB] + .global bluegl_glVertexAttribL1d + .type bluegl_glVertexAttribL1d, %function +bluegl_glVertexAttribL1d: + adrp x16, :got:__blue_glCore_glVertexAttribL1d + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1d] ldr x16, [x16] br x16 - .size bluegl_glNamedStringARB, .-bluegl_glNamedStringARB + .size bluegl_glVertexAttribL1d, .-bluegl_glVertexAttribL1d .align 2 - .global bluegl_glVertexArrayVertexAttribFormatEXT - .type bluegl_glVertexArrayVertexAttribFormatEXT, %function -bluegl_glVertexArrayVertexAttribFormatEXT: - adrp x16, :got:__blue_glCore_glVertexArrayVertexAttribFormatEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexAttribFormatEXT] + .global bluegl_glVertexAttribL2d + .type bluegl_glVertexAttribL2d, %function +bluegl_glVertexAttribL2d: + adrp x16, :got:__blue_glCore_glVertexAttribL2d + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL2d] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayVertexAttribFormatEXT, .-bluegl_glVertexArrayVertexAttribFormatEXT + .size bluegl_glVertexAttribL2d, .-bluegl_glVertexAttribL2d .align 2 - .global bluegl_glMultiTexCoordP3ui - .type bluegl_glMultiTexCoordP3ui, %function -bluegl_glMultiTexCoordP3ui: - adrp x16, :got:__blue_glCore_glMultiTexCoordP3ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoordP3ui] + .global bluegl_glVertexAttribL3d + .type bluegl_glVertexAttribL3d, %function +bluegl_glVertexAttribL3d: + adrp x16, :got:__blue_glCore_glVertexAttribL3d + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL3d] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoordP3ui, .-bluegl_glMultiTexCoordP3ui + .size bluegl_glVertexAttribL3d, .-bluegl_glVertexAttribL3d .align 2 - .global bluegl_glMultiTexSubImage3DEXT - .type bluegl_glMultiTexSubImage3DEXT, %function -bluegl_glMultiTexSubImage3DEXT: - adrp x16, :got:__blue_glCore_glMultiTexSubImage3DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexSubImage3DEXT] + .global bluegl_glVertexAttribL4d + .type bluegl_glVertexAttribL4d, %function +bluegl_glVertexAttribL4d: + adrp x16, :got:__blue_glCore_glVertexAttribL4d + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL4d] ldr x16, [x16] br x16 - .size bluegl_glMultiTexSubImage3DEXT, .-bluegl_glMultiTexSubImage3DEXT + .size bluegl_glVertexAttribL4d, .-bluegl_glVertexAttribL4d .align 2 - .global bluegl_glUniform2fvARB - .type bluegl_glUniform2fvARB, %function -bluegl_glUniform2fvARB: - adrp x16, :got:__blue_glCore_glUniform2fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2fvARB] + .global bluegl_glVertexAttribL1dv + .type bluegl_glVertexAttribL1dv, %function +bluegl_glVertexAttribL1dv: + adrp x16, :got:__blue_glCore_glVertexAttribL1dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1dv] ldr x16, [x16] br x16 - .size bluegl_glUniform2fvARB, .-bluegl_glUniform2fvARB + .size bluegl_glVertexAttribL1dv, .-bluegl_glVertexAttribL1dv .align 2 - .global bluegl_glGetPixelMapxv - .type bluegl_glGetPixelMapxv, %function -bluegl_glGetPixelMapxv: - adrp x16, :got:__blue_glCore_glGetPixelMapxv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPixelMapxv] + .global bluegl_glVertexAttribL2dv + .type bluegl_glVertexAttribL2dv, %function +bluegl_glVertexAttribL2dv: + adrp x16, :got:__blue_glCore_glVertexAttribL2dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL2dv] ldr x16, [x16] br x16 - .size bluegl_glGetPixelMapxv, .-bluegl_glGetPixelMapxv + .size bluegl_glVertexAttribL2dv, .-bluegl_glVertexAttribL2dv .align 2 - .global bluegl_glTangent3ivEXT - .type bluegl_glTangent3ivEXT, %function -bluegl_glTangent3ivEXT: - adrp x16, :got:__blue_glCore_glTangent3ivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3ivEXT] + .global bluegl_glVertexAttribL3dv + .type bluegl_glVertexAttribL3dv, %function +bluegl_glVertexAttribL3dv: + adrp x16, :got:__blue_glCore_glVertexAttribL3dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL3dv] ldr x16, [x16] br x16 - .size bluegl_glTangent3ivEXT, .-bluegl_glTangent3ivEXT + .size bluegl_glVertexAttribL3dv, .-bluegl_glVertexAttribL3dv .align 2 - .global bluegl_glGetLocalConstantIntegervEXT - .type bluegl_glGetLocalConstantIntegervEXT, %function -bluegl_glGetLocalConstantIntegervEXT: - adrp x16, :got:__blue_glCore_glGetLocalConstantIntegervEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetLocalConstantIntegervEXT] + .global bluegl_glVertexAttribL4dv + .type bluegl_glVertexAttribL4dv, %function +bluegl_glVertexAttribL4dv: + adrp x16, :got:__blue_glCore_glVertexAttribL4dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL4dv] ldr x16, [x16] br x16 - .size bluegl_glGetLocalConstantIntegervEXT, .-bluegl_glGetLocalConstantIntegervEXT + .size bluegl_glVertexAttribL4dv, .-bluegl_glVertexAttribL4dv .align 2 - .global bluegl_glPresentFrameDualFillNV - .type bluegl_glPresentFrameDualFillNV, %function -bluegl_glPresentFrameDualFillNV: - adrp x16, :got:__blue_glCore_glPresentFrameDualFillNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPresentFrameDualFillNV] + .global bluegl_glVertexAttribLPointer + .type bluegl_glVertexAttribLPointer, %function +bluegl_glVertexAttribLPointer: + adrp x16, :got:__blue_glCore_glVertexAttribLPointer + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribLPointer] ldr x16, [x16] br x16 - .size bluegl_glPresentFrameDualFillNV, .-bluegl_glPresentFrameDualFillNV + .size bluegl_glVertexAttribLPointer, .-bluegl_glVertexAttribLPointer .align 2 - .global bluegl_glEndVertexShaderEXT - .type bluegl_glEndVertexShaderEXT, %function -bluegl_glEndVertexShaderEXT: - adrp x16, :got:__blue_glCore_glEndVertexShaderEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glEndVertexShaderEXT] + .global bluegl_glGetVertexAttribLdv + .type bluegl_glGetVertexAttribLdv, %function +bluegl_glGetVertexAttribLdv: + adrp x16, :got:__blue_glCore_glGetVertexAttribLdv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribLdv] ldr x16, [x16] br x16 - .size bluegl_glEndVertexShaderEXT, .-bluegl_glEndVertexShaderEXT + .size bluegl_glGetVertexAttribLdv, .-bluegl_glGetVertexAttribLdv .align 2 - .global bluegl_glVertexArrayVertexBuffer - .type bluegl_glVertexArrayVertexBuffer, %function -bluegl_glVertexArrayVertexBuffer: - adrp x16, :got:__blue_glCore_glVertexArrayVertexBuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexBuffer] + .global bluegl_glViewportArrayv + .type bluegl_glViewportArrayv, %function +bluegl_glViewportArrayv: + adrp x16, :got:__blue_glCore_glViewportArrayv + ldr x16, [x16, #:got_lo12:__blue_glCore_glViewportArrayv] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayVertexBuffer, .-bluegl_glVertexArrayVertexBuffer + .size bluegl_glViewportArrayv, .-bluegl_glViewportArrayv .align 2 - .global bluegl_glMakeTextureHandleNonResidentNV - .type bluegl_glMakeTextureHandleNonResidentNV, %function -bluegl_glMakeTextureHandleNonResidentNV: - adrp x16, :got:__blue_glCore_glMakeTextureHandleNonResidentNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeTextureHandleNonResidentNV] + .global bluegl_glViewportIndexedf + .type bluegl_glViewportIndexedf, %function +bluegl_glViewportIndexedf: + adrp x16, :got:__blue_glCore_glViewportIndexedf + ldr x16, [x16, #:got_lo12:__blue_glCore_glViewportIndexedf] ldr x16, [x16] br x16 - .size bluegl_glMakeTextureHandleNonResidentNV, .-bluegl_glMakeTextureHandleNonResidentNV + .size bluegl_glViewportIndexedf, .-bluegl_glViewportIndexedf .align 2 - .global bluegl_glVertexAttribI3uiEXT - .type bluegl_glVertexAttribI3uiEXT, %function -bluegl_glVertexAttribI3uiEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI3uiEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI3uiEXT] + .global bluegl_glViewportIndexedfv + .type bluegl_glViewportIndexedfv, %function +bluegl_glViewportIndexedfv: + adrp x16, :got:__blue_glCore_glViewportIndexedfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glViewportIndexedfv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI3uiEXT, .-bluegl_glVertexAttribI3uiEXT + .size bluegl_glViewportIndexedfv, .-bluegl_glViewportIndexedfv .align 2 - .global bluegl_glBinormal3bvEXT - .type bluegl_glBinormal3bvEXT, %function -bluegl_glBinormal3bvEXT: - adrp x16, :got:__blue_glCore_glBinormal3bvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3bvEXT] + .global bluegl_glScissorArrayv + .type bluegl_glScissorArrayv, %function +bluegl_glScissorArrayv: + adrp x16, :got:__blue_glCore_glScissorArrayv + ldr x16, [x16, #:got_lo12:__blue_glCore_glScissorArrayv] ldr x16, [x16] br x16 - .size bluegl_glBinormal3bvEXT, .-bluegl_glBinormal3bvEXT + .size bluegl_glScissorArrayv, .-bluegl_glScissorArrayv .align 2 - .global bluegl_glPixelTexGenParameterfSGIS - .type bluegl_glPixelTexGenParameterfSGIS, %function -bluegl_glPixelTexGenParameterfSGIS: - adrp x16, :got:__blue_glCore_glPixelTexGenParameterfSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTexGenParameterfSGIS] + .global bluegl_glScissorIndexed + .type bluegl_glScissorIndexed, %function +bluegl_glScissorIndexed: + adrp x16, :got:__blue_glCore_glScissorIndexed + ldr x16, [x16, #:got_lo12:__blue_glCore_glScissorIndexed] ldr x16, [x16] br x16 - .size bluegl_glPixelTexGenParameterfSGIS, .-bluegl_glPixelTexGenParameterfSGIS + .size bluegl_glScissorIndexed, .-bluegl_glScissorIndexed .align 2 - .global bluegl_glMultiTexGenivEXT - .type bluegl_glMultiTexGenivEXT, %function -bluegl_glMultiTexGenivEXT: - adrp x16, :got:__blue_glCore_glMultiTexGenivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexGenivEXT] + .global bluegl_glScissorIndexedv + .type bluegl_glScissorIndexedv, %function +bluegl_glScissorIndexedv: + adrp x16, :got:__blue_glCore_glScissorIndexedv + ldr x16, [x16, #:got_lo12:__blue_glCore_glScissorIndexedv] ldr x16, [x16] br x16 - .size bluegl_glMultiTexGenivEXT, .-bluegl_glMultiTexGenivEXT + .size bluegl_glScissorIndexedv, .-bluegl_glScissorIndexedv .align 2 - .global bluegl_glGetVideoivNV - .type bluegl_glGetVideoivNV, %function -bluegl_glGetVideoivNV: - adrp x16, :got:__blue_glCore_glGetVideoivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVideoivNV] + .global bluegl_glDepthRangeArrayv + .type bluegl_glDepthRangeArrayv, %function +bluegl_glDepthRangeArrayv: + adrp x16, :got:__blue_glCore_glDepthRangeArrayv + ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthRangeArrayv] ldr x16, [x16] br x16 - .size bluegl_glGetVideoivNV, .-bluegl_glGetVideoivNV + .size bluegl_glDepthRangeArrayv, .-bluegl_glDepthRangeArrayv .align 2 - .global bluegl_glMultiTexCoordP2ui - .type bluegl_glMultiTexCoordP2ui, %function -bluegl_glMultiTexCoordP2ui: - adrp x16, :got:__blue_glCore_glMultiTexCoordP2ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoordP2ui] + .global bluegl_glDepthRangeIndexed + .type bluegl_glDepthRangeIndexed, %function +bluegl_glDepthRangeIndexed: + adrp x16, :got:__blue_glCore_glDepthRangeIndexed + ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthRangeIndexed] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoordP2ui, .-bluegl_glMultiTexCoordP2ui + .size bluegl_glDepthRangeIndexed, .-bluegl_glDepthRangeIndexed .align 2 - .global bluegl_glDeletePerfQueryINTEL - .type bluegl_glDeletePerfQueryINTEL, %function -bluegl_glDeletePerfQueryINTEL: - adrp x16, :got:__blue_glCore_glDeletePerfQueryINTEL - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeletePerfQueryINTEL] + .global bluegl_glGetFloati_v + .type bluegl_glGetFloati_v, %function +bluegl_glGetFloati_v: + adrp x16, :got:__blue_glCore_glGetFloati_v + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFloati_v] ldr x16, [x16] br x16 - .size bluegl_glDeletePerfQueryINTEL, .-bluegl_glDeletePerfQueryINTEL + .size bluegl_glGetFloati_v, .-bluegl_glGetFloati_v .align 2 - .global bluegl_glDepthBoundsdNV - .type bluegl_glDepthBoundsdNV, %function -bluegl_glDepthBoundsdNV: - adrp x16, :got:__blue_glCore_glDepthBoundsdNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthBoundsdNV] + .global bluegl_glGetDoublei_v + .type bluegl_glGetDoublei_v, %function +bluegl_glGetDoublei_v: + adrp x16, :got:__blue_glCore_glGetDoublei_v + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetDoublei_v] ldr x16, [x16] br x16 - .size bluegl_glDepthBoundsdNV, .-bluegl_glDepthBoundsdNV + .size bluegl_glGetDoublei_v, .-bluegl_glGetDoublei_v .align 2 - .global bluegl_glPixelTransferxOES - .type bluegl_glPixelTransferxOES, %function -bluegl_glPixelTransferxOES: - adrp x16, :got:__blue_glCore_glPixelTransferxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTransferxOES] + .global bluegl_glDrawArraysInstancedBaseInstance + .type bluegl_glDrawArraysInstancedBaseInstance, %function +bluegl_glDrawArraysInstancedBaseInstance: + adrp x16, :got:__blue_glCore_glDrawArraysInstancedBaseInstance + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawArraysInstancedBaseInstance] ldr x16, [x16] br x16 - .size bluegl_glPixelTransferxOES, .-bluegl_glPixelTransferxOES + .size bluegl_glDrawArraysInstancedBaseInstance, .-bluegl_glDrawArraysInstancedBaseInstance .align 2 - .global bluegl_glCombinerOutputNV - .type bluegl_glCombinerOutputNV, %function -bluegl_glCombinerOutputNV: - adrp x16, :got:__blue_glCore_glCombinerOutputNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCombinerOutputNV] + .global bluegl_glDrawElementsInstancedBaseInstance + .type bluegl_glDrawElementsInstancedBaseInstance, %function +bluegl_glDrawElementsInstancedBaseInstance: + adrp x16, :got:__blue_glCore_glDrawElementsInstancedBaseInstance + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementsInstancedBaseInstance] ldr x16, [x16] br x16 - .size bluegl_glCombinerOutputNV, .-bluegl_glCombinerOutputNV + .size bluegl_glDrawElementsInstancedBaseInstance, .-bluegl_glDrawElementsInstancedBaseInstance .align 2 - .global bluegl_glCopyTextureSubImage1D - .type bluegl_glCopyTextureSubImage1D, %function -bluegl_glCopyTextureSubImage1D: - adrp x16, :got:__blue_glCore_glCopyTextureSubImage1D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTextureSubImage1D] + .global bluegl_glDrawElementsInstancedBaseVertexBaseInstance + .type bluegl_glDrawElementsInstancedBaseVertexBaseInstance, %function +bluegl_glDrawElementsInstancedBaseVertexBaseInstance: + adrp x16, :got:__blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance] ldr x16, [x16] br x16 - .size bluegl_glCopyTextureSubImage1D, .-bluegl_glCopyTextureSubImage1D + .size bluegl_glDrawElementsInstancedBaseVertexBaseInstance, .-bluegl_glDrawElementsInstancedBaseVertexBaseInstance .align 2 - .global bluegl_glVertexAttribI4iv - .type bluegl_glVertexAttribI4iv, %function -bluegl_glVertexAttribI4iv: - adrp x16, :got:__blue_glCore_glVertexAttribI4iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4iv] + .global bluegl_glGetInternalformativ + .type bluegl_glGetInternalformativ, %function +bluegl_glGetInternalformativ: + adrp x16, :got:__blue_glCore_glGetInternalformativ + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInternalformativ] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI4iv, .-bluegl_glVertexAttribI4iv + .size bluegl_glGetInternalformativ, .-bluegl_glGetInternalformativ .align 2 - .global bluegl_glCopyTexImage2DEXT - .type bluegl_glCopyTexImage2DEXT, %function -bluegl_glCopyTexImage2DEXT: - adrp x16, :got:__blue_glCore_glCopyTexImage2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexImage2DEXT] + .global bluegl_glGetActiveAtomicCounterBufferiv + .type bluegl_glGetActiveAtomicCounterBufferiv, %function +bluegl_glGetActiveAtomicCounterBufferiv: + adrp x16, :got:__blue_glCore_glGetActiveAtomicCounterBufferiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveAtomicCounterBufferiv] ldr x16, [x16] br x16 - .size bluegl_glCopyTexImage2DEXT, .-bluegl_glCopyTexImage2DEXT + .size bluegl_glGetActiveAtomicCounterBufferiv, .-bluegl_glGetActiveAtomicCounterBufferiv .align 2 - .global bluegl_glBindLightParameterEXT - .type bluegl_glBindLightParameterEXT, %function -bluegl_glBindLightParameterEXT: - adrp x16, :got:__blue_glCore_glBindLightParameterEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindLightParameterEXT] + .global bluegl_glBindImageTexture + .type bluegl_glBindImageTexture, %function +bluegl_glBindImageTexture: + adrp x16, :got:__blue_glCore_glBindImageTexture + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindImageTexture] ldr x16, [x16] br x16 - .size bluegl_glBindLightParameterEXT, .-bluegl_glBindLightParameterEXT + .size bluegl_glBindImageTexture, .-bluegl_glBindImageTexture .align 2 - .global bluegl_glMultiDrawElementsBaseVertex - .type bluegl_glMultiDrawElementsBaseVertex, %function -bluegl_glMultiDrawElementsBaseVertex: - adrp x16, :got:__blue_glCore_glMultiDrawElementsBaseVertex - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawElementsBaseVertex] + .global bluegl_glMemoryBarrier + .type bluegl_glMemoryBarrier, %function +bluegl_glMemoryBarrier: + adrp x16, :got:__blue_glCore_glMemoryBarrier + ldr x16, [x16, #:got_lo12:__blue_glCore_glMemoryBarrier] ldr x16, [x16] br x16 - .size bluegl_glMultiDrawElementsBaseVertex, .-bluegl_glMultiDrawElementsBaseVertex + .size bluegl_glMemoryBarrier, .-bluegl_glMemoryBarrier .align 2 - .global bluegl_glProgramUniform2uivEXT - .type bluegl_glProgramUniform2uivEXT, %function -bluegl_glProgramUniform2uivEXT: - adrp x16, :got:__blue_glCore_glProgramUniform2uivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2uivEXT] + .global bluegl_glTexStorage1D + .type bluegl_glTexStorage1D, %function +bluegl_glTexStorage1D: + adrp x16, :got:__blue_glCore_glTexStorage1D + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexStorage1D] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2uivEXT, .-bluegl_glProgramUniform2uivEXT + .size bluegl_glTexStorage1D, .-bluegl_glTexStorage1D .align 2 - .global bluegl_glDeletePerfMonitorsAMD - .type bluegl_glDeletePerfMonitorsAMD, %function -bluegl_glDeletePerfMonitorsAMD: - adrp x16, :got:__blue_glCore_glDeletePerfMonitorsAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeletePerfMonitorsAMD] + .global bluegl_glTexStorage2D + .type bluegl_glTexStorage2D, %function +bluegl_glTexStorage2D: + adrp x16, :got:__blue_glCore_glTexStorage2D + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexStorage2D] ldr x16, [x16] br x16 - .size bluegl_glDeletePerfMonitorsAMD, .-bluegl_glDeletePerfMonitorsAMD + .size bluegl_glTexStorage2D, .-bluegl_glTexStorage2D .align 2 - .global bluegl_glCopyImageSubData - .type bluegl_glCopyImageSubData, %function -bluegl_glCopyImageSubData: - adrp x16, :got:__blue_glCore_glCopyImageSubData - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyImageSubData] + .global bluegl_glTexStorage3D + .type bluegl_glTexStorage3D, %function +bluegl_glTexStorage3D: + adrp x16, :got:__blue_glCore_glTexStorage3D + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexStorage3D] ldr x16, [x16] br x16 - .size bluegl_glCopyImageSubData, .-bluegl_glCopyImageSubData + .size bluegl_glTexStorage3D, .-bluegl_glTexStorage3D .align 2 - .global bluegl_glPathCoverDepthFuncNV - .type bluegl_glPathCoverDepthFuncNV, %function -bluegl_glPathCoverDepthFuncNV: - adrp x16, :got:__blue_glCore_glPathCoverDepthFuncNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathCoverDepthFuncNV] + .global bluegl_glDrawTransformFeedbackInstanced + .type bluegl_glDrawTransformFeedbackInstanced, %function +bluegl_glDrawTransformFeedbackInstanced: + adrp x16, :got:__blue_glCore_glDrawTransformFeedbackInstanced + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawTransformFeedbackInstanced] ldr x16, [x16] br x16 - .size bluegl_glPathCoverDepthFuncNV, .-bluegl_glPathCoverDepthFuncNV + .size bluegl_glDrawTransformFeedbackInstanced, .-bluegl_glDrawTransformFeedbackInstanced .align 2 - .global bluegl_glGetFramebufferAttachmentParameteriv - .type bluegl_glGetFramebufferAttachmentParameteriv, %function -bluegl_glGetFramebufferAttachmentParameteriv: - adrp x16, :got:__blue_glCore_glGetFramebufferAttachmentParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFramebufferAttachmentParameteriv] + .global bluegl_glDrawTransformFeedbackStreamInstanced + .type bluegl_glDrawTransformFeedbackStreamInstanced, %function +bluegl_glDrawTransformFeedbackStreamInstanced: + adrp x16, :got:__blue_glCore_glDrawTransformFeedbackStreamInstanced + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawTransformFeedbackStreamInstanced] ldr x16, [x16] br x16 - .size bluegl_glGetFramebufferAttachmentParameteriv, .-bluegl_glGetFramebufferAttachmentParameteriv + .size bluegl_glDrawTransformFeedbackStreamInstanced, .-bluegl_glDrawTransformFeedbackStreamInstanced .align 2 - .global bluegl_glRectxOES - .type bluegl_glRectxOES, %function -bluegl_glRectxOES: - adrp x16, :got:__blue_glCore_glRectxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glRectxOES] + .global bluegl_glClearBufferData + .type bluegl_glClearBufferData, %function +bluegl_glClearBufferData: + adrp x16, :got:__blue_glCore_glClearBufferData + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearBufferData] ldr x16, [x16] br x16 - .size bluegl_glRectxOES, .-bluegl_glRectxOES + .size bluegl_glClearBufferData, .-bluegl_glClearBufferData .align 2 - .global bluegl_glTagSampleBufferSGIX - .type bluegl_glTagSampleBufferSGIX, %function -bluegl_glTagSampleBufferSGIX: - adrp x16, :got:__blue_glCore_glTagSampleBufferSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glTagSampleBufferSGIX] + .global bluegl_glClearBufferSubData + .type bluegl_glClearBufferSubData, %function +bluegl_glClearBufferSubData: + adrp x16, :got:__blue_glCore_glClearBufferSubData + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearBufferSubData] ldr x16, [x16] br x16 - .size bluegl_glTagSampleBufferSGIX, .-bluegl_glTagSampleBufferSGIX + .size bluegl_glClearBufferSubData, .-bluegl_glClearBufferSubData .align 2 - .global bluegl_glVertexStream3svATI - .type bluegl_glVertexStream3svATI, %function -bluegl_glVertexStream3svATI: - adrp x16, :got:__blue_glCore_glVertexStream3svATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream3svATI] + .global bluegl_glDispatchCompute + .type bluegl_glDispatchCompute, %function +bluegl_glDispatchCompute: + adrp x16, :got:__blue_glCore_glDispatchCompute + ldr x16, [x16, #:got_lo12:__blue_glCore_glDispatchCompute] ldr x16, [x16] br x16 - .size bluegl_glVertexStream3svATI, .-bluegl_glVertexStream3svATI + .size bluegl_glDispatchCompute, .-bluegl_glDispatchCompute .align 2 - .global bluegl_glGetPathTexGenfvNV - .type bluegl_glGetPathTexGenfvNV, %function -bluegl_glGetPathTexGenfvNV: - adrp x16, :got:__blue_glCore_glGetPathTexGenfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathTexGenfvNV] + .global bluegl_glDispatchComputeIndirect + .type bluegl_glDispatchComputeIndirect, %function +bluegl_glDispatchComputeIndirect: + adrp x16, :got:__blue_glCore_glDispatchComputeIndirect + ldr x16, [x16, #:got_lo12:__blue_glCore_glDispatchComputeIndirect] ldr x16, [x16] br x16 - .size bluegl_glGetPathTexGenfvNV, .-bluegl_glGetPathTexGenfvNV + .size bluegl_glDispatchComputeIndirect, .-bluegl_glDispatchComputeIndirect .align 2 - .global bluegl_glOrthofOES - .type bluegl_glOrthofOES, %function -bluegl_glOrthofOES: - adrp x16, :got:__blue_glCore_glOrthofOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glOrthofOES] + .global bluegl_glCopyImageSubData + .type bluegl_glCopyImageSubData, %function +bluegl_glCopyImageSubData: + adrp x16, :got:__blue_glCore_glCopyImageSubData + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyImageSubData] ldr x16, [x16] br x16 - .size bluegl_glOrthofOES, .-bluegl_glOrthofOES + .size bluegl_glCopyImageSubData, .-bluegl_glCopyImageSubData .align 2 - .global bluegl_glCopyTexImage2D - .type bluegl_glCopyTexImage2D, %function -bluegl_glCopyTexImage2D: - adrp x16, :got:__blue_glCore_glCopyTexImage2D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexImage2D] + .global bluegl_glFramebufferParameteri + .type bluegl_glFramebufferParameteri, %function +bluegl_glFramebufferParameteri: + adrp x16, :got:__blue_glCore_glFramebufferParameteri + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferParameteri] + ldr x16, [x16] + br x16 + .size bluegl_glFramebufferParameteri, .-bluegl_glFramebufferParameteri + + .align 2 + .global bluegl_glGetFramebufferParameteriv + .type bluegl_glGetFramebufferParameteriv, %function +bluegl_glGetFramebufferParameteriv: + adrp x16, :got:__blue_glCore_glGetFramebufferParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFramebufferParameteriv] ldr x16, [x16] br x16 - .size bluegl_glCopyTexImage2D, .-bluegl_glCopyTexImage2D + .size bluegl_glGetFramebufferParameteriv, .-bluegl_glGetFramebufferParameteriv .align 2 - .global bluegl_glTexCoord2fColor4ubVertex3fSUN - .type bluegl_glTexCoord2fColor4ubVertex3fSUN, %function -bluegl_glTexCoord2fColor4ubVertex3fSUN: - adrp x16, :got:__blue_glCore_glTexCoord2fColor4ubVertex3fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fColor4ubVertex3fSUN] + .global bluegl_glGetInternalformati64v + .type bluegl_glGetInternalformati64v, %function +bluegl_glGetInternalformati64v: + adrp x16, :got:__blue_glCore_glGetInternalformati64v + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInternalformati64v] ldr x16, [x16] br x16 - .size bluegl_glTexCoord2fColor4ubVertex3fSUN, .-bluegl_glTexCoord2fColor4ubVertex3fSUN + .size bluegl_glGetInternalformati64v, .-bluegl_glGetInternalformati64v .align 2 - .global bluegl_glMultTransposeMatrixdARB - .type bluegl_glMultTransposeMatrixdARB, %function -bluegl_glMultTransposeMatrixdARB: - adrp x16, :got:__blue_glCore_glMultTransposeMatrixdARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultTransposeMatrixdARB] + .global bluegl_glInvalidateTexSubImage + .type bluegl_glInvalidateTexSubImage, %function +bluegl_glInvalidateTexSubImage: + adrp x16, :got:__blue_glCore_glInvalidateTexSubImage + ldr x16, [x16, #:got_lo12:__blue_glCore_glInvalidateTexSubImage] ldr x16, [x16] br x16 - .size bluegl_glMultTransposeMatrixdARB, .-bluegl_glMultTransposeMatrixdARB + .size bluegl_glInvalidateTexSubImage, .-bluegl_glInvalidateTexSubImage .align 2 - .global bluegl_glProgramUniform3i - .type bluegl_glProgramUniform3i, %function -bluegl_glProgramUniform3i: - adrp x16, :got:__blue_glCore_glProgramUniform3i - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3i] + .global bluegl_glInvalidateTexImage + .type bluegl_glInvalidateTexImage, %function +bluegl_glInvalidateTexImage: + adrp x16, :got:__blue_glCore_glInvalidateTexImage + ldr x16, [x16, #:got_lo12:__blue_glCore_glInvalidateTexImage] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3i, .-bluegl_glProgramUniform3i + .size bluegl_glInvalidateTexImage, .-bluegl_glInvalidateTexImage .align 2 - .global bluegl_glArrayObjectATI - .type bluegl_glArrayObjectATI, %function -bluegl_glArrayObjectATI: - adrp x16, :got:__blue_glCore_glArrayObjectATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glArrayObjectATI] + .global bluegl_glInvalidateBufferSubData + .type bluegl_glInvalidateBufferSubData, %function +bluegl_glInvalidateBufferSubData: + adrp x16, :got:__blue_glCore_glInvalidateBufferSubData + ldr x16, [x16, #:got_lo12:__blue_glCore_glInvalidateBufferSubData] ldr x16, [x16] br x16 - .size bluegl_glArrayObjectATI, .-bluegl_glArrayObjectATI + .size bluegl_glInvalidateBufferSubData, .-bluegl_glInvalidateBufferSubData .align 2 - .global bluegl_glMatrixRotatedEXT - .type bluegl_glMatrixRotatedEXT, %function -bluegl_glMatrixRotatedEXT: - adrp x16, :got:__blue_glCore_glMatrixRotatedEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixRotatedEXT] + .global bluegl_glInvalidateBufferData + .type bluegl_glInvalidateBufferData, %function +bluegl_glInvalidateBufferData: + adrp x16, :got:__blue_glCore_glInvalidateBufferData + ldr x16, [x16, #:got_lo12:__blue_glCore_glInvalidateBufferData] ldr x16, [x16] br x16 - .size bluegl_glMatrixRotatedEXT, .-bluegl_glMatrixRotatedEXT + .size bluegl_glInvalidateBufferData, .-bluegl_glInvalidateBufferData .align 2 - .global bluegl_glTexCoordP2ui - .type bluegl_glTexCoordP2ui, %function -bluegl_glTexCoordP2ui: - adrp x16, :got:__blue_glCore_glTexCoordP2ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordP2ui] + .global bluegl_glInvalidateFramebuffer + .type bluegl_glInvalidateFramebuffer, %function +bluegl_glInvalidateFramebuffer: + adrp x16, :got:__blue_glCore_glInvalidateFramebuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glInvalidateFramebuffer] ldr x16, [x16] br x16 - .size bluegl_glTexCoordP2ui, .-bluegl_glTexCoordP2ui + .size bluegl_glInvalidateFramebuffer, .-bluegl_glInvalidateFramebuffer .align 2 - .global bluegl_glPassTexCoordATI - .type bluegl_glPassTexCoordATI, %function -bluegl_glPassTexCoordATI: - adrp x16, :got:__blue_glCore_glPassTexCoordATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glPassTexCoordATI] + .global bluegl_glInvalidateSubFramebuffer + .type bluegl_glInvalidateSubFramebuffer, %function +bluegl_glInvalidateSubFramebuffer: + adrp x16, :got:__blue_glCore_glInvalidateSubFramebuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glInvalidateSubFramebuffer] ldr x16, [x16] br x16 - .size bluegl_glPassTexCoordATI, .-bluegl_glPassTexCoordATI + .size bluegl_glInvalidateSubFramebuffer, .-bluegl_glInvalidateSubFramebuffer .align 2 - .global bluegl_glIsTexture - .type bluegl_glIsTexture, %function -bluegl_glIsTexture: - adrp x16, :got:__blue_glCore_glIsTexture - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsTexture] + .global bluegl_glMultiDrawArraysIndirect + .type bluegl_glMultiDrawArraysIndirect, %function +bluegl_glMultiDrawArraysIndirect: + adrp x16, :got:__blue_glCore_glMultiDrawArraysIndirect + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawArraysIndirect] ldr x16, [x16] br x16 - .size bluegl_glIsTexture, .-bluegl_glIsTexture + .size bluegl_glMultiDrawArraysIndirect, .-bluegl_glMultiDrawArraysIndirect .align 2 - .global bluegl_glCompressedTexSubImage3DARB - .type bluegl_glCompressedTexSubImage3DARB, %function -bluegl_glCompressedTexSubImage3DARB: - adrp x16, :got:__blue_glCore_glCompressedTexSubImage3DARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexSubImage3DARB] + .global bluegl_glMultiDrawElementsIndirect + .type bluegl_glMultiDrawElementsIndirect, %function +bluegl_glMultiDrawElementsIndirect: + adrp x16, :got:__blue_glCore_glMultiDrawElementsIndirect + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawElementsIndirect] ldr x16, [x16] br x16 - .size bluegl_glCompressedTexSubImage3DARB, .-bluegl_glCompressedTexSubImage3DARB + .size bluegl_glMultiDrawElementsIndirect, .-bluegl_glMultiDrawElementsIndirect .align 2 - .global bluegl_glDepthRangexOES - .type bluegl_glDepthRangexOES, %function -bluegl_glDepthRangexOES: - adrp x16, :got:__blue_glCore_glDepthRangexOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthRangexOES] + .global bluegl_glGetProgramInterfaceiv + .type bluegl_glGetProgramInterfaceiv, %function +bluegl_glGetProgramInterfaceiv: + adrp x16, :got:__blue_glCore_glGetProgramInterfaceiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramInterfaceiv] ldr x16, [x16] br x16 - .size bluegl_glDepthRangexOES, .-bluegl_glDepthRangexOES + .size bluegl_glGetProgramInterfaceiv, .-bluegl_glGetProgramInterfaceiv .align 2 - .global bluegl_glImageTransformParameterivHP - .type bluegl_glImageTransformParameterivHP, %function -bluegl_glImageTransformParameterivHP: - adrp x16, :got:__blue_glCore_glImageTransformParameterivHP - ldr x16, [x16, #:got_lo12:__blue_glCore_glImageTransformParameterivHP] + .global bluegl_glGetProgramResourceIndex + .type bluegl_glGetProgramResourceIndex, %function +bluegl_glGetProgramResourceIndex: + adrp x16, :got:__blue_glCore_glGetProgramResourceIndex + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramResourceIndex] ldr x16, [x16] br x16 - .size bluegl_glImageTransformParameterivHP, .-bluegl_glImageTransformParameterivHP + .size bluegl_glGetProgramResourceIndex, .-bluegl_glGetProgramResourceIndex .align 2 - .global bluegl_glMultTransposeMatrixfARB - .type bluegl_glMultTransposeMatrixfARB, %function -bluegl_glMultTransposeMatrixfARB: - adrp x16, :got:__blue_glCore_glMultTransposeMatrixfARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultTransposeMatrixfARB] + .global bluegl_glGetProgramResourceName + .type bluegl_glGetProgramResourceName, %function +bluegl_glGetProgramResourceName: + adrp x16, :got:__blue_glCore_glGetProgramResourceName + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramResourceName] ldr x16, [x16] br x16 - .size bluegl_glMultTransposeMatrixfARB, .-bluegl_glMultTransposeMatrixfARB + .size bluegl_glGetProgramResourceName, .-bluegl_glGetProgramResourceName .align 2 - .global bluegl_glUniformHandleui64vARB - .type bluegl_glUniformHandleui64vARB, %function -bluegl_glUniformHandleui64vARB: - adrp x16, :got:__blue_glCore_glUniformHandleui64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformHandleui64vARB] + .global bluegl_glGetProgramResourceiv + .type bluegl_glGetProgramResourceiv, %function +bluegl_glGetProgramResourceiv: + adrp x16, :got:__blue_glCore_glGetProgramResourceiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramResourceiv] ldr x16, [x16] br x16 - .size bluegl_glUniformHandleui64vARB, .-bluegl_glUniformHandleui64vARB + .size bluegl_glGetProgramResourceiv, .-bluegl_glGetProgramResourceiv .align 2 - .global bluegl_glGenTransformFeedbacks - .type bluegl_glGenTransformFeedbacks, %function -bluegl_glGenTransformFeedbacks: - adrp x16, :got:__blue_glCore_glGenTransformFeedbacks - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenTransformFeedbacks] + .global bluegl_glGetProgramResourceLocation + .type bluegl_glGetProgramResourceLocation, %function +bluegl_glGetProgramResourceLocation: + adrp x16, :got:__blue_glCore_glGetProgramResourceLocation + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramResourceLocation] ldr x16, [x16] br x16 - .size bluegl_glGenTransformFeedbacks, .-bluegl_glGenTransformFeedbacks + .size bluegl_glGetProgramResourceLocation, .-bluegl_glGetProgramResourceLocation .align 2 - .global bluegl_glTextureStorage1D - .type bluegl_glTextureStorage1D, %function -bluegl_glTextureStorage1D: - adrp x16, :got:__blue_glCore_glTextureStorage1D - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage1D] + .global bluegl_glGetProgramResourceLocationIndex + .type bluegl_glGetProgramResourceLocationIndex, %function +bluegl_glGetProgramResourceLocationIndex: + adrp x16, :got:__blue_glCore_glGetProgramResourceLocationIndex + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramResourceLocationIndex] ldr x16, [x16] br x16 - .size bluegl_glTextureStorage1D, .-bluegl_glTextureStorage1D + .size bluegl_glGetProgramResourceLocationIndex, .-bluegl_glGetProgramResourceLocationIndex .align 2 - .global bluegl_glGetVertexAttribivNV - .type bluegl_glGetVertexAttribivNV, %function -bluegl_glGetVertexAttribivNV: - adrp x16, :got:__blue_glCore_glGetVertexAttribivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribivNV] + .global bluegl_glShaderStorageBlockBinding + .type bluegl_glShaderStorageBlockBinding, %function +bluegl_glShaderStorageBlockBinding: + adrp x16, :got:__blue_glCore_glShaderStorageBlockBinding + ldr x16, [x16, #:got_lo12:__blue_glCore_glShaderStorageBlockBinding] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribivNV, .-bluegl_glGetVertexAttribivNV + .size bluegl_glShaderStorageBlockBinding, .-bluegl_glShaderStorageBlockBinding .align 2 - .global bluegl_glReplacementCodePointerSUN - .type bluegl_glReplacementCodePointerSUN, %function -bluegl_glReplacementCodePointerSUN: - adrp x16, :got:__blue_glCore_glReplacementCodePointerSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodePointerSUN] + .global bluegl_glTexBufferRange + .type bluegl_glTexBufferRange, %function +bluegl_glTexBufferRange: + adrp x16, :got:__blue_glCore_glTexBufferRange + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexBufferRange] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodePointerSUN, .-bluegl_glReplacementCodePointerSUN + .size bluegl_glTexBufferRange, .-bluegl_glTexBufferRange .align 2 - .global bluegl_glVertexAttribI3uiv - .type bluegl_glVertexAttribI3uiv, %function -bluegl_glVertexAttribI3uiv: - adrp x16, :got:__blue_glCore_glVertexAttribI3uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI3uiv] + .global bluegl_glTexStorage2DMultisample + .type bluegl_glTexStorage2DMultisample, %function +bluegl_glTexStorage2DMultisample: + adrp x16, :got:__blue_glCore_glTexStorage2DMultisample + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexStorage2DMultisample] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI3uiv, .-bluegl_glVertexAttribI3uiv + .size bluegl_glTexStorage2DMultisample, .-bluegl_glTexStorage2DMultisample .align 2 - .global bluegl_glReplacementCodeuiNormal3fVertex3fSUN - .type bluegl_glReplacementCodeuiNormal3fVertex3fSUN, %function -bluegl_glReplacementCodeuiNormal3fVertex3fSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN] + .global bluegl_glTexStorage3DMultisample + .type bluegl_glTexStorage3DMultisample, %function +bluegl_glTexStorage3DMultisample: + adrp x16, :got:__blue_glCore_glTexStorage3DMultisample + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexStorage3DMultisample] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeuiNormal3fVertex3fSUN, .-bluegl_glReplacementCodeuiNormal3fVertex3fSUN + .size bluegl_glTexStorage3DMultisample, .-bluegl_glTexStorage3DMultisample .align 2 - .global bluegl_glVertexAttribL2dEXT - .type bluegl_glVertexAttribL2dEXT, %function -bluegl_glVertexAttribL2dEXT: - adrp x16, :got:__blue_glCore_glVertexAttribL2dEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL2dEXT] + .global bluegl_glTextureView + .type bluegl_glTextureView, %function +bluegl_glTextureView: + adrp x16, :got:__blue_glCore_glTextureView + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureView] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL2dEXT, .-bluegl_glVertexAttribL2dEXT + .size bluegl_glTextureView, .-bluegl_glTextureView .align 2 - .global bluegl_glProgramUniform3ui64NV - .type bluegl_glProgramUniform3ui64NV, %function -bluegl_glProgramUniform3ui64NV: - adrp x16, :got:__blue_glCore_glProgramUniform3ui64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3ui64NV] + .global bluegl_glBindVertexBuffer + .type bluegl_glBindVertexBuffer, %function +bluegl_glBindVertexBuffer: + adrp x16, :got:__blue_glCore_glBindVertexBuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindVertexBuffer] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3ui64NV, .-bluegl_glProgramUniform3ui64NV + .size bluegl_glBindVertexBuffer, .-bluegl_glBindVertexBuffer .align 2 - .global bluegl_glProgramUniform3i64NV - .type bluegl_glProgramUniform3i64NV, %function -bluegl_glProgramUniform3i64NV: - adrp x16, :got:__blue_glCore_glProgramUniform3i64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3i64NV] + .global bluegl_glVertexAttribFormat + .type bluegl_glVertexAttribFormat, %function +bluegl_glVertexAttribFormat: + adrp x16, :got:__blue_glCore_glVertexAttribFormat + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribFormat] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3i64NV, .-bluegl_glProgramUniform3i64NV + .size bluegl_glVertexAttribFormat, .-bluegl_glVertexAttribFormat .align 2 - .global bluegl_glGetNamedRenderbufferParameterivEXT - .type bluegl_glGetNamedRenderbufferParameterivEXT, %function -bluegl_glGetNamedRenderbufferParameterivEXT: - adrp x16, :got:__blue_glCore_glGetNamedRenderbufferParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedRenderbufferParameterivEXT] + .global bluegl_glVertexAttribIFormat + .type bluegl_glVertexAttribIFormat, %function +bluegl_glVertexAttribIFormat: + adrp x16, :got:__blue_glCore_glVertexAttribIFormat + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribIFormat] ldr x16, [x16] br x16 - .size bluegl_glGetNamedRenderbufferParameterivEXT, .-bluegl_glGetNamedRenderbufferParameterivEXT + .size bluegl_glVertexAttribIFormat, .-bluegl_glVertexAttribIFormat .align 2 - .global bluegl_glTangent3bvEXT - .type bluegl_glTangent3bvEXT, %function -bluegl_glTangent3bvEXT: - adrp x16, :got:__blue_glCore_glTangent3bvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3bvEXT] + .global bluegl_glVertexAttribLFormat + .type bluegl_glVertexAttribLFormat, %function +bluegl_glVertexAttribLFormat: + adrp x16, :got:__blue_glCore_glVertexAttribLFormat + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribLFormat] ldr x16, [x16] br x16 - .size bluegl_glTangent3bvEXT, .-bluegl_glTangent3bvEXT + .size bluegl_glVertexAttribLFormat, .-bluegl_glVertexAttribLFormat .align 2 - .global bluegl_glProgramUniform1dvEXT - .type bluegl_glProgramUniform1dvEXT, %function -bluegl_glProgramUniform1dvEXT: - adrp x16, :got:__blue_glCore_glProgramUniform1dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1dvEXT] + .global bluegl_glVertexAttribBinding + .type bluegl_glVertexAttribBinding, %function +bluegl_glVertexAttribBinding: + adrp x16, :got:__blue_glCore_glVertexAttribBinding + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribBinding] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1dvEXT, .-bluegl_glProgramUniform1dvEXT + .size bluegl_glVertexAttribBinding, .-bluegl_glVertexAttribBinding .align 2 - .global bluegl_glMatrixLoadTransposedEXT - .type bluegl_glMatrixLoadTransposedEXT, %function -bluegl_glMatrixLoadTransposedEXT: - adrp x16, :got:__blue_glCore_glMatrixLoadTransposedEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixLoadTransposedEXT] + .global bluegl_glVertexBindingDivisor + .type bluegl_glVertexBindingDivisor, %function +bluegl_glVertexBindingDivisor: + adrp x16, :got:__blue_glCore_glVertexBindingDivisor + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexBindingDivisor] ldr x16, [x16] br x16 - .size bluegl_glMatrixLoadTransposedEXT, .-bluegl_glMatrixLoadTransposedEXT + .size bluegl_glVertexBindingDivisor, .-bluegl_glVertexBindingDivisor .align 2 - .global bluegl_glGetVertexAttribLdv - .type bluegl_glGetVertexAttribLdv, %function -bluegl_glGetVertexAttribLdv: - adrp x16, :got:__blue_glCore_glGetVertexAttribLdv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribLdv] + .global bluegl_glDebugMessageControl + .type bluegl_glDebugMessageControl, %function +bluegl_glDebugMessageControl: + adrp x16, :got:__blue_glCore_glDebugMessageControl + ldr x16, [x16, #:got_lo12:__blue_glCore_glDebugMessageControl] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribLdv, .-bluegl_glGetVertexAttribLdv + .size bluegl_glDebugMessageControl, .-bluegl_glDebugMessageControl .align 2 - .global bluegl_glVertexStream2dATI - .type bluegl_glVertexStream2dATI, %function -bluegl_glVertexStream2dATI: - adrp x16, :got:__blue_glCore_glVertexStream2dATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream2dATI] + .global bluegl_glDebugMessageInsert + .type bluegl_glDebugMessageInsert, %function +bluegl_glDebugMessageInsert: + adrp x16, :got:__blue_glCore_glDebugMessageInsert + ldr x16, [x16, #:got_lo12:__blue_glCore_glDebugMessageInsert] ldr x16, [x16] br x16 - .size bluegl_glVertexStream2dATI, .-bluegl_glVertexStream2dATI + .size bluegl_glDebugMessageInsert, .-bluegl_glDebugMessageInsert .align 2 - .global bluegl_glGetFragmentLightivSGIX - .type bluegl_glGetFragmentLightivSGIX, %function -bluegl_glGetFragmentLightivSGIX: - adrp x16, :got:__blue_glCore_glGetFragmentLightivSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFragmentLightivSGIX] + .global bluegl_glDebugMessageCallback + .type bluegl_glDebugMessageCallback, %function +bluegl_glDebugMessageCallback: + adrp x16, :got:__blue_glCore_glDebugMessageCallback + ldr x16, [x16, #:got_lo12:__blue_glCore_glDebugMessageCallback] ldr x16, [x16] br x16 - .size bluegl_glGetFragmentLightivSGIX, .-bluegl_glGetFragmentLightivSGIX + .size bluegl_glDebugMessageCallback, .-bluegl_glDebugMessageCallback .align 2 - .global bluegl_glGetMinmaxEXT - .type bluegl_glGetMinmaxEXT, %function -bluegl_glGetMinmaxEXT: - adrp x16, :got:__blue_glCore_glGetMinmaxEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMinmaxEXT] + .global bluegl_glGetDebugMessageLog + .type bluegl_glGetDebugMessageLog, %function +bluegl_glGetDebugMessageLog: + adrp x16, :got:__blue_glCore_glGetDebugMessageLog + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetDebugMessageLog] ldr x16, [x16] br x16 - .size bluegl_glGetMinmaxEXT, .-bluegl_glGetMinmaxEXT + .size bluegl_glGetDebugMessageLog, .-bluegl_glGetDebugMessageLog .align 2 - .global bluegl_glFlushStaticDataIBM - .type bluegl_glFlushStaticDataIBM, %function -bluegl_glFlushStaticDataIBM: - adrp x16, :got:__blue_glCore_glFlushStaticDataIBM - ldr x16, [x16, #:got_lo12:__blue_glCore_glFlushStaticDataIBM] + .global bluegl_glPushDebugGroup + .type bluegl_glPushDebugGroup, %function +bluegl_glPushDebugGroup: + adrp x16, :got:__blue_glCore_glPushDebugGroup + ldr x16, [x16, #:got_lo12:__blue_glCore_glPushDebugGroup] ldr x16, [x16] br x16 - .size bluegl_glFlushStaticDataIBM, .-bluegl_glFlushStaticDataIBM + .size bluegl_glPushDebugGroup, .-bluegl_glPushDebugGroup .align 2 - .global bluegl_glShaderOp1EXT - .type bluegl_glShaderOp1EXT, %function -bluegl_glShaderOp1EXT: - adrp x16, :got:__blue_glCore_glShaderOp1EXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glShaderOp1EXT] + .global bluegl_glPopDebugGroup + .type bluegl_glPopDebugGroup, %function +bluegl_glPopDebugGroup: + adrp x16, :got:__blue_glCore_glPopDebugGroup + ldr x16, [x16, #:got_lo12:__blue_glCore_glPopDebugGroup] ldr x16, [x16] br x16 - .size bluegl_glShaderOp1EXT, .-bluegl_glShaderOp1EXT + .size bluegl_glPopDebugGroup, .-bluegl_glPopDebugGroup .align 2 - .global bluegl_glIsStateNV - .type bluegl_glIsStateNV, %function -bluegl_glIsStateNV: - adrp x16, :got:__blue_glCore_glIsStateNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsStateNV] + .global bluegl_glObjectLabel + .type bluegl_glObjectLabel, %function +bluegl_glObjectLabel: + adrp x16, :got:__blue_glCore_glObjectLabel + ldr x16, [x16, #:got_lo12:__blue_glCore_glObjectLabel] ldr x16, [x16] br x16 - .size bluegl_glIsStateNV, .-bluegl_glIsStateNV + .size bluegl_glObjectLabel, .-bluegl_glObjectLabel .align 2 - .global bluegl_glGetProgramEnvParameterIuivNV - .type bluegl_glGetProgramEnvParameterIuivNV, %function -bluegl_glGetProgramEnvParameterIuivNV: - adrp x16, :got:__blue_glCore_glGetProgramEnvParameterIuivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramEnvParameterIuivNV] + .global bluegl_glGetObjectLabel + .type bluegl_glGetObjectLabel, %function +bluegl_glGetObjectLabel: + adrp x16, :got:__blue_glCore_glGetObjectLabel + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetObjectLabel] ldr x16, [x16] br x16 - .size bluegl_glGetProgramEnvParameterIuivNV, .-bluegl_glGetProgramEnvParameterIuivNV + .size bluegl_glGetObjectLabel, .-bluegl_glGetObjectLabel .align 2 - .global bluegl_glGetVideoCaptureivNV - .type bluegl_glGetVideoCaptureivNV, %function -bluegl_glGetVideoCaptureivNV: - adrp x16, :got:__blue_glCore_glGetVideoCaptureivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVideoCaptureivNV] + .global bluegl_glObjectPtrLabel + .type bluegl_glObjectPtrLabel, %function +bluegl_glObjectPtrLabel: + adrp x16, :got:__blue_glCore_glObjectPtrLabel + ldr x16, [x16, #:got_lo12:__blue_glCore_glObjectPtrLabel] ldr x16, [x16] br x16 - .size bluegl_glGetVideoCaptureivNV, .-bluegl_glGetVideoCaptureivNV + .size bluegl_glObjectPtrLabel, .-bluegl_glObjectPtrLabel .align 2 - .global bluegl_glPathStringNV - .type bluegl_glPathStringNV, %function -bluegl_glPathStringNV: - adrp x16, :got:__blue_glCore_glPathStringNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathStringNV] + .global bluegl_glGetObjectPtrLabel + .type bluegl_glGetObjectPtrLabel, %function +bluegl_glGetObjectPtrLabel: + adrp x16, :got:__blue_glCore_glGetObjectPtrLabel + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetObjectPtrLabel] ldr x16, [x16] br x16 - .size bluegl_glPathStringNV, .-bluegl_glPathStringNV + .size bluegl_glGetObjectPtrLabel, .-bluegl_glGetObjectPtrLabel .align 2 - .global bluegl_glListParameterfSGIX - .type bluegl_glListParameterfSGIX, %function -bluegl_glListParameterfSGIX: - adrp x16, :got:__blue_glCore_glListParameterfSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glListParameterfSGIX] + .global bluegl_glBufferStorage + .type bluegl_glBufferStorage, %function +bluegl_glBufferStorage: + adrp x16, :got:__blue_glCore_glBufferStorage + ldr x16, [x16, #:got_lo12:__blue_glCore_glBufferStorage] ldr x16, [x16] br x16 - .size bluegl_glListParameterfSGIX, .-bluegl_glListParameterfSGIX + .size bluegl_glBufferStorage, .-bluegl_glBufferStorage .align 2 - .global bluegl_glFeedbackBufferxOES - .type bluegl_glFeedbackBufferxOES, %function -bluegl_glFeedbackBufferxOES: - adrp x16, :got:__blue_glCore_glFeedbackBufferxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glFeedbackBufferxOES] + .global bluegl_glClearTexImage + .type bluegl_glClearTexImage, %function +bluegl_glClearTexImage: + adrp x16, :got:__blue_glCore_glClearTexImage + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearTexImage] ldr x16, [x16] br x16 - .size bluegl_glFeedbackBufferxOES, .-bluegl_glFeedbackBufferxOES + .size bluegl_glClearTexImage, .-bluegl_glClearTexImage .align 2 - .global bluegl_glGetNextPerfQueryIdINTEL - .type bluegl_glGetNextPerfQueryIdINTEL, %function -bluegl_glGetNextPerfQueryIdINTEL: - adrp x16, :got:__blue_glCore_glGetNextPerfQueryIdINTEL - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNextPerfQueryIdINTEL] + .global bluegl_glClearTexSubImage + .type bluegl_glClearTexSubImage, %function +bluegl_glClearTexSubImage: + adrp x16, :got:__blue_glCore_glClearTexSubImage + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearTexSubImage] ldr x16, [x16] br x16 - .size bluegl_glGetNextPerfQueryIdINTEL, .-bluegl_glGetNextPerfQueryIdINTEL + .size bluegl_glClearTexSubImage, .-bluegl_glClearTexSubImage .align 2 - .global bluegl_glGetVariantArrayObjectfvATI - .type bluegl_glGetVariantArrayObjectfvATI, %function -bluegl_glGetVariantArrayObjectfvATI: - adrp x16, :got:__blue_glCore_glGetVariantArrayObjectfvATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVariantArrayObjectfvATI] + .global bluegl_glBindBuffersBase + .type bluegl_glBindBuffersBase, %function +bluegl_glBindBuffersBase: + adrp x16, :got:__blue_glCore_glBindBuffersBase + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBuffersBase] ldr x16, [x16] br x16 - .size bluegl_glGetVariantArrayObjectfvATI, .-bluegl_glGetVariantArrayObjectfvATI + .size bluegl_glBindBuffersBase, .-bluegl_glBindBuffersBase .align 2 - .global bluegl_glUniform3d - .type bluegl_glUniform3d, %function -bluegl_glUniform3d: - adrp x16, :got:__blue_glCore_glUniform3d - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3d] + .global bluegl_glBindBuffersRange + .type bluegl_glBindBuffersRange, %function +bluegl_glBindBuffersRange: + adrp x16, :got:__blue_glCore_glBindBuffersRange + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBuffersRange] ldr x16, [x16] br x16 - .size bluegl_glUniform3d, .-bluegl_glUniform3d + .size bluegl_glBindBuffersRange, .-bluegl_glBindBuffersRange .align 2 - .global bluegl_glMultiTexParameterfvEXT - .type bluegl_glMultiTexParameterfvEXT, %function -bluegl_glMultiTexParameterfvEXT: - adrp x16, :got:__blue_glCore_glMultiTexParameterfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexParameterfvEXT] + .global bluegl_glBindTextures + .type bluegl_glBindTextures, %function +bluegl_glBindTextures: + adrp x16, :got:__blue_glCore_glBindTextures + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindTextures] ldr x16, [x16] br x16 - .size bluegl_glMultiTexParameterfvEXT, .-bluegl_glMultiTexParameterfvEXT + .size bluegl_glBindTextures, .-bluegl_glBindTextures .align 2 - .global bluegl_glGetLocalConstantFloatvEXT - .type bluegl_glGetLocalConstantFloatvEXT, %function -bluegl_glGetLocalConstantFloatvEXT: - adrp x16, :got:__blue_glCore_glGetLocalConstantFloatvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetLocalConstantFloatvEXT] + .global bluegl_glBindSamplers + .type bluegl_glBindSamplers, %function +bluegl_glBindSamplers: + adrp x16, :got:__blue_glCore_glBindSamplers + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindSamplers] ldr x16, [x16] br x16 - .size bluegl_glGetLocalConstantFloatvEXT, .-bluegl_glGetLocalConstantFloatvEXT + .size bluegl_glBindSamplers, .-bluegl_glBindSamplers .align 2 - .global bluegl_glMultiTexImage3DEXT - .type bluegl_glMultiTexImage3DEXT, %function -bluegl_glMultiTexImage3DEXT: - adrp x16, :got:__blue_glCore_glMultiTexImage3DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexImage3DEXT] + .global bluegl_glBindImageTextures + .type bluegl_glBindImageTextures, %function +bluegl_glBindImageTextures: + adrp x16, :got:__blue_glCore_glBindImageTextures + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindImageTextures] ldr x16, [x16] br x16 - .size bluegl_glMultiTexImage3DEXT, .-bluegl_glMultiTexImage3DEXT + .size bluegl_glBindImageTextures, .-bluegl_glBindImageTextures .align 2 - .global bluegl_glWindowPos3fMESA - .type bluegl_glWindowPos3fMESA, %function -bluegl_glWindowPos3fMESA: - adrp x16, :got:__blue_glCore_glWindowPos3fMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3fMESA] + .global bluegl_glBindVertexBuffers + .type bluegl_glBindVertexBuffers, %function +bluegl_glBindVertexBuffers: + adrp x16, :got:__blue_glCore_glBindVertexBuffers + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindVertexBuffers] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3fMESA, .-bluegl_glWindowPos3fMESA + .size bluegl_glBindVertexBuffers, .-bluegl_glBindVertexBuffers .align 2 - .global bluegl_glCullParameterdvEXT - .type bluegl_glCullParameterdvEXT, %function -bluegl_glCullParameterdvEXT: - adrp x16, :got:__blue_glCore_glCullParameterdvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCullParameterdvEXT] + .global bluegl_glClipControl + .type bluegl_glClipControl, %function +bluegl_glClipControl: + adrp x16, :got:__blue_glCore_glClipControl + ldr x16, [x16, #:got_lo12:__blue_glCore_glClipControl] ldr x16, [x16] br x16 - .size bluegl_glCullParameterdvEXT, .-bluegl_glCullParameterdvEXT + .size bluegl_glClipControl, .-bluegl_glClipControl .align 2 - .global bluegl_glGetTrackMatrixivNV - .type bluegl_glGetTrackMatrixivNV, %function -bluegl_glGetTrackMatrixivNV: - adrp x16, :got:__blue_glCore_glGetTrackMatrixivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTrackMatrixivNV] + .global bluegl_glCreateTransformFeedbacks + .type bluegl_glCreateTransformFeedbacks, %function +bluegl_glCreateTransformFeedbacks: + adrp x16, :got:__blue_glCore_glCreateTransformFeedbacks + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateTransformFeedbacks] ldr x16, [x16] br x16 - .size bluegl_glGetTrackMatrixivNV, .-bluegl_glGetTrackMatrixivNV + .size bluegl_glCreateTransformFeedbacks, .-bluegl_glCreateTransformFeedbacks .align 2 - .global bluegl_glBlendFuncSeparateINGR - .type bluegl_glBlendFuncSeparateINGR, %function -bluegl_glBlendFuncSeparateINGR: - adrp x16, :got:__blue_glCore_glBlendFuncSeparateINGR - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFuncSeparateINGR] + .global bluegl_glTransformFeedbackBufferBase + .type bluegl_glTransformFeedbackBufferBase, %function +bluegl_glTransformFeedbackBufferBase: + adrp x16, :got:__blue_glCore_glTransformFeedbackBufferBase + ldr x16, [x16, #:got_lo12:__blue_glCore_glTransformFeedbackBufferBase] ldr x16, [x16] br x16 - .size bluegl_glBlendFuncSeparateINGR, .-bluegl_glBlendFuncSeparateINGR + .size bluegl_glTransformFeedbackBufferBase, .-bluegl_glTransformFeedbackBufferBase .align 2 - .global bluegl_glUniformMatrix2fvARB - .type bluegl_glUniformMatrix2fvARB, %function -bluegl_glUniformMatrix2fvARB: - adrp x16, :got:__blue_glCore_glUniformMatrix2fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix2fvARB] + .global bluegl_glTransformFeedbackBufferRange + .type bluegl_glTransformFeedbackBufferRange, %function +bluegl_glTransformFeedbackBufferRange: + adrp x16, :got:__blue_glCore_glTransformFeedbackBufferRange + ldr x16, [x16, #:got_lo12:__blue_glCore_glTransformFeedbackBufferRange] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix2fvARB, .-bluegl_glUniformMatrix2fvARB + .size bluegl_glTransformFeedbackBufferRange, .-bluegl_glTransformFeedbackBufferRange .align 2 - .global bluegl_glDrawArraysInstancedEXT - .type bluegl_glDrawArraysInstancedEXT, %function -bluegl_glDrawArraysInstancedEXT: - adrp x16, :got:__blue_glCore_glDrawArraysInstancedEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawArraysInstancedEXT] + .global bluegl_glGetTransformFeedbackiv + .type bluegl_glGetTransformFeedbackiv, %function +bluegl_glGetTransformFeedbackiv: + adrp x16, :got:__blue_glCore_glGetTransformFeedbackiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTransformFeedbackiv] ldr x16, [x16] br x16 - .size bluegl_glDrawArraysInstancedEXT, .-bluegl_glDrawArraysInstancedEXT + .size bluegl_glGetTransformFeedbackiv, .-bluegl_glGetTransformFeedbackiv .align 2 - .global bluegl_glMultiTexCoord3iARB - .type bluegl_glMultiTexCoord3iARB, %function -bluegl_glMultiTexCoord3iARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord3iARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3iARB] + .global bluegl_glGetTransformFeedbacki_v + .type bluegl_glGetTransformFeedbacki_v, %function +bluegl_glGetTransformFeedbacki_v: + adrp x16, :got:__blue_glCore_glGetTransformFeedbacki_v + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTransformFeedbacki_v] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3iARB, .-bluegl_glMultiTexCoord3iARB + .size bluegl_glGetTransformFeedbacki_v, .-bluegl_glGetTransformFeedbacki_v .align 2 - .global bluegl_glGetNamedFramebufferParameterivEXT - .type bluegl_glGetNamedFramebufferParameterivEXT, %function -bluegl_glGetNamedFramebufferParameterivEXT: - adrp x16, :got:__blue_glCore_glGetNamedFramebufferParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedFramebufferParameterivEXT] + .global bluegl_glGetTransformFeedbacki64_v + .type bluegl_glGetTransformFeedbacki64_v, %function +bluegl_glGetTransformFeedbacki64_v: + adrp x16, :got:__blue_glCore_glGetTransformFeedbacki64_v + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTransformFeedbacki64_v] ldr x16, [x16] br x16 - .size bluegl_glGetNamedFramebufferParameterivEXT, .-bluegl_glGetNamedFramebufferParameterivEXT + .size bluegl_glGetTransformFeedbacki64_v, .-bluegl_glGetTransformFeedbacki64_v .align 2 - .global bluegl_glGenTextures - .type bluegl_glGenTextures, %function -bluegl_glGenTextures: - adrp x16, :got:__blue_glCore_glGenTextures - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenTextures] + .global bluegl_glCreateBuffers + .type bluegl_glCreateBuffers, %function +bluegl_glCreateBuffers: + adrp x16, :got:__blue_glCore_glCreateBuffers + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateBuffers] ldr x16, [x16] br x16 - .size bluegl_glGenTextures, .-bluegl_glGenTextures + .size bluegl_glCreateBuffers, .-bluegl_glCreateBuffers .align 2 - .global bluegl_glIsPointInStrokePathNV - .type bluegl_glIsPointInStrokePathNV, %function -bluegl_glIsPointInStrokePathNV: - adrp x16, :got:__blue_glCore_glIsPointInStrokePathNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsPointInStrokePathNV] + .global bluegl_glNamedBufferStorage + .type bluegl_glNamedBufferStorage, %function +bluegl_glNamedBufferStorage: + adrp x16, :got:__blue_glCore_glNamedBufferStorage + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedBufferStorage] ldr x16, [x16] br x16 - .size bluegl_glIsPointInStrokePathNV, .-bluegl_glIsPointInStrokePathNV + .size bluegl_glNamedBufferStorage, .-bluegl_glNamedBufferStorage .align 2 - .global bluegl_glDrawTransformFeedbackNV - .type bluegl_glDrawTransformFeedbackNV, %function -bluegl_glDrawTransformFeedbackNV: - adrp x16, :got:__blue_glCore_glDrawTransformFeedbackNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawTransformFeedbackNV] + .global bluegl_glNamedBufferData + .type bluegl_glNamedBufferData, %function +bluegl_glNamedBufferData: + adrp x16, :got:__blue_glCore_glNamedBufferData + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedBufferData] ldr x16, [x16] br x16 - .size bluegl_glDrawTransformFeedbackNV, .-bluegl_glDrawTransformFeedbackNV + .size bluegl_glNamedBufferData, .-bluegl_glNamedBufferData .align 2 - .global bluegl_glGetActiveUniformARB - .type bluegl_glGetActiveUniformARB, %function -bluegl_glGetActiveUniformARB: - adrp x16, :got:__blue_glCore_glGetActiveUniformARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveUniformARB] + .global bluegl_glNamedBufferSubData + .type bluegl_glNamedBufferSubData, %function +bluegl_glNamedBufferSubData: + adrp x16, :got:__blue_glCore_glNamedBufferSubData + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedBufferSubData] ldr x16, [x16] br x16 - .size bluegl_glGetActiveUniformARB, .-bluegl_glGetActiveUniformARB + .size bluegl_glNamedBufferSubData, .-bluegl_glNamedBufferSubData .align 2 - .global bluegl_glClearNamedFramebufferfv - .type bluegl_glClearNamedFramebufferfv, %function -bluegl_glClearNamedFramebufferfv: - adrp x16, :got:__blue_glCore_glClearNamedFramebufferfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearNamedFramebufferfv] + .global bluegl_glCopyNamedBufferSubData + .type bluegl_glCopyNamedBufferSubData, %function +bluegl_glCopyNamedBufferSubData: + adrp x16, :got:__blue_glCore_glCopyNamedBufferSubData + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyNamedBufferSubData] ldr x16, [x16] br x16 - .size bluegl_glClearNamedFramebufferfv, .-bluegl_glClearNamedFramebufferfv + .size bluegl_glCopyNamedBufferSubData, .-bluegl_glCopyNamedBufferSubData .align 2 - .global bluegl_glBeginVideoCaptureNV - .type bluegl_glBeginVideoCaptureNV, %function -bluegl_glBeginVideoCaptureNV: - adrp x16, :got:__blue_glCore_glBeginVideoCaptureNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginVideoCaptureNV] + .global bluegl_glClearNamedBufferData + .type bluegl_glClearNamedBufferData, %function +bluegl_glClearNamedBufferData: + adrp x16, :got:__blue_glCore_glClearNamedBufferData + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearNamedBufferData] ldr x16, [x16] br x16 - .size bluegl_glBeginVideoCaptureNV, .-bluegl_glBeginVideoCaptureNV + .size bluegl_glClearNamedBufferData, .-bluegl_glClearNamedBufferData .align 2 - .global bluegl_glCopyTexImage1D - .type bluegl_glCopyTexImage1D, %function -bluegl_glCopyTexImage1D: - adrp x16, :got:__blue_glCore_glCopyTexImage1D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexImage1D] + .global bluegl_glClearNamedBufferSubData + .type bluegl_glClearNamedBufferSubData, %function +bluegl_glClearNamedBufferSubData: + adrp x16, :got:__blue_glCore_glClearNamedBufferSubData + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearNamedBufferSubData] ldr x16, [x16] br x16 - .size bluegl_glCopyTexImage1D, .-bluegl_glCopyTexImage1D + .size bluegl_glClearNamedBufferSubData, .-bluegl_glClearNamedBufferSubData .align 2 - .global bluegl_glTexStorage1D - .type bluegl_glTexStorage1D, %function -bluegl_glTexStorage1D: - adrp x16, :got:__blue_glCore_glTexStorage1D - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexStorage1D] + .global bluegl_glMapNamedBuffer + .type bluegl_glMapNamedBuffer, %function +bluegl_glMapNamedBuffer: + adrp x16, :got:__blue_glCore_glMapNamedBuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glMapNamedBuffer] ldr x16, [x16] br x16 - .size bluegl_glTexStorage1D, .-bluegl_glTexStorage1D + .size bluegl_glMapNamedBuffer, .-bluegl_glMapNamedBuffer .align 2 - .global bluegl_glProgramUniform3ui64ARB - .type bluegl_glProgramUniform3ui64ARB, %function -bluegl_glProgramUniform3ui64ARB: - adrp x16, :got:__blue_glCore_glProgramUniform3ui64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3ui64ARB] + .global bluegl_glMapNamedBufferRange + .type bluegl_glMapNamedBufferRange, %function +bluegl_glMapNamedBufferRange: + adrp x16, :got:__blue_glCore_glMapNamedBufferRange + ldr x16, [x16, #:got_lo12:__blue_glCore_glMapNamedBufferRange] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3ui64ARB, .-bluegl_glProgramUniform3ui64ARB + .size bluegl_glMapNamedBufferRange, .-bluegl_glMapNamedBufferRange .align 2 - .global bluegl_glTextureSubImage2D - .type bluegl_glTextureSubImage2D, %function -bluegl_glTextureSubImage2D: - adrp x16, :got:__blue_glCore_glTextureSubImage2D - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureSubImage2D] + .global bluegl_glUnmapNamedBuffer + .type bluegl_glUnmapNamedBuffer, %function +bluegl_glUnmapNamedBuffer: + adrp x16, :got:__blue_glCore_glUnmapNamedBuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glUnmapNamedBuffer] ldr x16, [x16] br x16 - .size bluegl_glTextureSubImage2D, .-bluegl_glTextureSubImage2D + .size bluegl_glUnmapNamedBuffer, .-bluegl_glUnmapNamedBuffer .align 2 - .global bluegl_glMultiTexCoord4bOES - .type bluegl_glMultiTexCoord4bOES, %function -bluegl_glMultiTexCoord4bOES: - adrp x16, :got:__blue_glCore_glMultiTexCoord4bOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4bOES] + .global bluegl_glFlushMappedNamedBufferRange + .type bluegl_glFlushMappedNamedBufferRange, %function +bluegl_glFlushMappedNamedBufferRange: + adrp x16, :got:__blue_glCore_glFlushMappedNamedBufferRange + ldr x16, [x16, #:got_lo12:__blue_glCore_glFlushMappedNamedBufferRange] + ldr x16, [x16] + br x16 + .size bluegl_glFlushMappedNamedBufferRange, .-bluegl_glFlushMappedNamedBufferRange + + .align 2 + .global bluegl_glGetNamedBufferParameteriv + .type bluegl_glGetNamedBufferParameteriv, %function +bluegl_glGetNamedBufferParameteriv: + adrp x16, :got:__blue_glCore_glGetNamedBufferParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedBufferParameteriv] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4bOES, .-bluegl_glMultiTexCoord4bOES + .size bluegl_glGetNamedBufferParameteriv, .-bluegl_glGetNamedBufferParameteriv .align 2 - .global bluegl_glMultiDrawArraysIndirectCountARB - .type bluegl_glMultiDrawArraysIndirectCountARB, %function -bluegl_glMultiDrawArraysIndirectCountARB: - adrp x16, :got:__blue_glCore_glMultiDrawArraysIndirectCountARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawArraysIndirectCountARB] + .global bluegl_glGetNamedBufferParameteri64v + .type bluegl_glGetNamedBufferParameteri64v, %function +bluegl_glGetNamedBufferParameteri64v: + adrp x16, :got:__blue_glCore_glGetNamedBufferParameteri64v + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedBufferParameteri64v] ldr x16, [x16] br x16 - .size bluegl_glMultiDrawArraysIndirectCountARB, .-bluegl_glMultiDrawArraysIndirectCountARB + .size bluegl_glGetNamedBufferParameteri64v, .-bluegl_glGetNamedBufferParameteri64v .align 2 - .global bluegl_glProgramUniformMatrix3dvEXT - .type bluegl_glProgramUniformMatrix3dvEXT, %function -bluegl_glProgramUniformMatrix3dvEXT: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix3dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3dvEXT] + .global bluegl_glGetNamedBufferPointerv + .type bluegl_glGetNamedBufferPointerv, %function +bluegl_glGetNamedBufferPointerv: + adrp x16, :got:__blue_glCore_glGetNamedBufferPointerv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedBufferPointerv] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix3dvEXT, .-bluegl_glProgramUniformMatrix3dvEXT + .size bluegl_glGetNamedBufferPointerv, .-bluegl_glGetNamedBufferPointerv .align 2 - .global bluegl_glVertexAttrib2s - .type bluegl_glVertexAttrib2s, %function -bluegl_glVertexAttrib2s: - adrp x16, :got:__blue_glCore_glVertexAttrib2s - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2s] + .global bluegl_glGetNamedBufferSubData + .type bluegl_glGetNamedBufferSubData, %function +bluegl_glGetNamedBufferSubData: + adrp x16, :got:__blue_glCore_glGetNamedBufferSubData + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedBufferSubData] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2s, .-bluegl_glVertexAttrib2s + .size bluegl_glGetNamedBufferSubData, .-bluegl_glGetNamedBufferSubData .align 2 - .global bluegl_glGetDoublev - .type bluegl_glGetDoublev, %function -bluegl_glGetDoublev: - adrp x16, :got:__blue_glCore_glGetDoublev - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetDoublev] + .global bluegl_glCreateFramebuffers + .type bluegl_glCreateFramebuffers, %function +bluegl_glCreateFramebuffers: + adrp x16, :got:__blue_glCore_glCreateFramebuffers + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateFramebuffers] ldr x16, [x16] br x16 - .size bluegl_glGetDoublev, .-bluegl_glGetDoublev + .size bluegl_glCreateFramebuffers, .-bluegl_glCreateFramebuffers .align 2 - .global bluegl_glVertexAttrib3svARB - .type bluegl_glVertexAttrib3svARB, %function -bluegl_glVertexAttrib3svARB: - adrp x16, :got:__blue_glCore_glVertexAttrib3svARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3svARB] + .global bluegl_glNamedFramebufferRenderbuffer + .type bluegl_glNamedFramebufferRenderbuffer, %function +bluegl_glNamedFramebufferRenderbuffer: + adrp x16, :got:__blue_glCore_glNamedFramebufferRenderbuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferRenderbuffer] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3svARB, .-bluegl_glVertexAttrib3svARB + .size bluegl_glNamedFramebufferRenderbuffer, .-bluegl_glNamedFramebufferRenderbuffer .align 2 - .global bluegl_glProgramNamedParameter4dvNV - .type bluegl_glProgramNamedParameter4dvNV, %function -bluegl_glProgramNamedParameter4dvNV: - adrp x16, :got:__blue_glCore_glProgramNamedParameter4dvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramNamedParameter4dvNV] + .global bluegl_glNamedFramebufferParameteri + .type bluegl_glNamedFramebufferParameteri, %function +bluegl_glNamedFramebufferParameteri: + adrp x16, :got:__blue_glCore_glNamedFramebufferParameteri + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferParameteri] ldr x16, [x16] br x16 - .size bluegl_glProgramNamedParameter4dvNV, .-bluegl_glProgramNamedParameter4dvNV + .size bluegl_glNamedFramebufferParameteri, .-bluegl_glNamedFramebufferParameteri .align 2 - .global bluegl_glTextureBufferRange - .type bluegl_glTextureBufferRange, %function -bluegl_glTextureBufferRange: - adrp x16, :got:__blue_glCore_glTextureBufferRange - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureBufferRange] + .global bluegl_glNamedFramebufferTexture + .type bluegl_glNamedFramebufferTexture, %function +bluegl_glNamedFramebufferTexture: + adrp x16, :got:__blue_glCore_glNamedFramebufferTexture + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferTexture] ldr x16, [x16] br x16 - .size bluegl_glTextureBufferRange, .-bluegl_glTextureBufferRange + .size bluegl_glNamedFramebufferTexture, .-bluegl_glNamedFramebufferTexture .align 2 - .global bluegl_glFramebufferTextureFaceEXT - .type bluegl_glFramebufferTextureFaceEXT, %function -bluegl_glFramebufferTextureFaceEXT: - adrp x16, :got:__blue_glCore_glFramebufferTextureFaceEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTextureFaceEXT] + .global bluegl_glNamedFramebufferTextureLayer + .type bluegl_glNamedFramebufferTextureLayer, %function +bluegl_glNamedFramebufferTextureLayer: + adrp x16, :got:__blue_glCore_glNamedFramebufferTextureLayer + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferTextureLayer] ldr x16, [x16] br x16 - .size bluegl_glFramebufferTextureFaceEXT, .-bluegl_glFramebufferTextureFaceEXT + .size bluegl_glNamedFramebufferTextureLayer, .-bluegl_glNamedFramebufferTextureLayer .align 2 - .global bluegl_glBindBufferRange - .type bluegl_glBindBufferRange, %function -bluegl_glBindBufferRange: - adrp x16, :got:__blue_glCore_glBindBufferRange - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBufferRange] + .global bluegl_glNamedFramebufferDrawBuffer + .type bluegl_glNamedFramebufferDrawBuffer, %function +bluegl_glNamedFramebufferDrawBuffer: + adrp x16, :got:__blue_glCore_glNamedFramebufferDrawBuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferDrawBuffer] ldr x16, [x16] br x16 - .size bluegl_glBindBufferRange, .-bluegl_glBindBufferRange + .size bluegl_glNamedFramebufferDrawBuffer, .-bluegl_glNamedFramebufferDrawBuffer .align 2 - .global bluegl_glEnablei - .type bluegl_glEnablei, %function -bluegl_glEnablei: - adrp x16, :got:__blue_glCore_glEnablei - ldr x16, [x16, #:got_lo12:__blue_glCore_glEnablei] + .global bluegl_glNamedFramebufferDrawBuffers + .type bluegl_glNamedFramebufferDrawBuffers, %function +bluegl_glNamedFramebufferDrawBuffers: + adrp x16, :got:__blue_glCore_glNamedFramebufferDrawBuffers + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferDrawBuffers] ldr x16, [x16] br x16 - .size bluegl_glEnablei, .-bluegl_glEnablei + .size bluegl_glNamedFramebufferDrawBuffers, .-bluegl_glNamedFramebufferDrawBuffers .align 2 - .global bluegl_glGetTextureParameterIuivEXT - .type bluegl_glGetTextureParameterIuivEXT, %function -bluegl_glGetTextureParameterIuivEXT: - adrp x16, :got:__blue_glCore_glGetTextureParameterIuivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureParameterIuivEXT] + .global bluegl_glNamedFramebufferReadBuffer + .type bluegl_glNamedFramebufferReadBuffer, %function +bluegl_glNamedFramebufferReadBuffer: + adrp x16, :got:__blue_glCore_glNamedFramebufferReadBuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferReadBuffer] ldr x16, [x16] br x16 - .size bluegl_glGetTextureParameterIuivEXT, .-bluegl_glGetTextureParameterIuivEXT + .size bluegl_glNamedFramebufferReadBuffer, .-bluegl_glNamedFramebufferReadBuffer .align 2 - .global bluegl_glGetProgramInterfaceiv - .type bluegl_glGetProgramInterfaceiv, %function -bluegl_glGetProgramInterfaceiv: - adrp x16, :got:__blue_glCore_glGetProgramInterfaceiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramInterfaceiv] + .global bluegl_glInvalidateNamedFramebufferData + .type bluegl_glInvalidateNamedFramebufferData, %function +bluegl_glInvalidateNamedFramebufferData: + adrp x16, :got:__blue_glCore_glInvalidateNamedFramebufferData + ldr x16, [x16, #:got_lo12:__blue_glCore_glInvalidateNamedFramebufferData] ldr x16, [x16] br x16 - .size bluegl_glGetProgramInterfaceiv, .-bluegl_glGetProgramInterfaceiv + .size bluegl_glInvalidateNamedFramebufferData, .-bluegl_glInvalidateNamedFramebufferData .align 2 - .global bluegl_glClientAttribDefaultEXT - .type bluegl_glClientAttribDefaultEXT, %function -bluegl_glClientAttribDefaultEXT: - adrp x16, :got:__blue_glCore_glClientAttribDefaultEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glClientAttribDefaultEXT] + .global bluegl_glInvalidateNamedFramebufferSubData + .type bluegl_glInvalidateNamedFramebufferSubData, %function +bluegl_glInvalidateNamedFramebufferSubData: + adrp x16, :got:__blue_glCore_glInvalidateNamedFramebufferSubData + ldr x16, [x16, #:got_lo12:__blue_glCore_glInvalidateNamedFramebufferSubData] ldr x16, [x16] br x16 - .size bluegl_glClientAttribDefaultEXT, .-bluegl_glClientAttribDefaultEXT + .size bluegl_glInvalidateNamedFramebufferSubData, .-bluegl_glInvalidateNamedFramebufferSubData .align 2 - .global bluegl_glVertexAttribL3ui64NV - .type bluegl_glVertexAttribL3ui64NV, %function -bluegl_glVertexAttribL3ui64NV: - adrp x16, :got:__blue_glCore_glVertexAttribL3ui64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL3ui64NV] + .global bluegl_glClearNamedFramebufferiv + .type bluegl_glClearNamedFramebufferiv, %function +bluegl_glClearNamedFramebufferiv: + adrp x16, :got:__blue_glCore_glClearNamedFramebufferiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearNamedFramebufferiv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL3ui64NV, .-bluegl_glVertexAttribL3ui64NV + .size bluegl_glClearNamedFramebufferiv, .-bluegl_glClearNamedFramebufferiv .align 2 - .global bluegl_glWindowPos2dARB - .type bluegl_glWindowPos2dARB, %function -bluegl_glWindowPos2dARB: - adrp x16, :got:__blue_glCore_glWindowPos2dARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2dARB] + .global bluegl_glClearNamedFramebufferuiv + .type bluegl_glClearNamedFramebufferuiv, %function +bluegl_glClearNamedFramebufferuiv: + adrp x16, :got:__blue_glCore_glClearNamedFramebufferuiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearNamedFramebufferuiv] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2dARB, .-bluegl_glWindowPos2dARB + .size bluegl_glClearNamedFramebufferuiv, .-bluegl_glClearNamedFramebufferuiv .align 2 - .global bluegl_glVertexAttribI2uiEXT - .type bluegl_glVertexAttribI2uiEXT, %function -bluegl_glVertexAttribI2uiEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI2uiEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI2uiEXT] + .global bluegl_glClearNamedFramebufferfv + .type bluegl_glClearNamedFramebufferfv, %function +bluegl_glClearNamedFramebufferfv: + adrp x16, :got:__blue_glCore_glClearNamedFramebufferfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearNamedFramebufferfv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI2uiEXT, .-bluegl_glVertexAttribI2uiEXT + .size bluegl_glClearNamedFramebufferfv, .-bluegl_glClearNamedFramebufferfv .align 2 - .global bluegl_glBindVertexBuffers - .type bluegl_glBindVertexBuffers, %function -bluegl_glBindVertexBuffers: - adrp x16, :got:__blue_glCore_glBindVertexBuffers - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindVertexBuffers] + .global bluegl_glClearNamedFramebufferfi + .type bluegl_glClearNamedFramebufferfi, %function +bluegl_glClearNamedFramebufferfi: + adrp x16, :got:__blue_glCore_glClearNamedFramebufferfi + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearNamedFramebufferfi] ldr x16, [x16] br x16 - .size bluegl_glBindVertexBuffers, .-bluegl_glBindVertexBuffers + .size bluegl_glClearNamedFramebufferfi, .-bluegl_glClearNamedFramebufferfi .align 2 - .global bluegl_glProgramUniformMatrix3x4fv - .type bluegl_glProgramUniformMatrix3x4fv, %function -bluegl_glProgramUniformMatrix3x4fv: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix3x4fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3x4fv] + .global bluegl_glBlitNamedFramebuffer + .type bluegl_glBlitNamedFramebuffer, %function +bluegl_glBlitNamedFramebuffer: + adrp x16, :got:__blue_glCore_glBlitNamedFramebuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlitNamedFramebuffer] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix3x4fv, .-bluegl_glProgramUniformMatrix3x4fv + .size bluegl_glBlitNamedFramebuffer, .-bluegl_glBlitNamedFramebuffer .align 2 - .global bluegl_glGetTexLevelParameterxvOES - .type bluegl_glGetTexLevelParameterxvOES, %function -bluegl_glGetTexLevelParameterxvOES: - adrp x16, :got:__blue_glCore_glGetTexLevelParameterxvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexLevelParameterxvOES] + .global bluegl_glCheckNamedFramebufferStatus + .type bluegl_glCheckNamedFramebufferStatus, %function +bluegl_glCheckNamedFramebufferStatus: + adrp x16, :got:__blue_glCore_glCheckNamedFramebufferStatus + ldr x16, [x16, #:got_lo12:__blue_glCore_glCheckNamedFramebufferStatus] ldr x16, [x16] br x16 - .size bluegl_glGetTexLevelParameterxvOES, .-bluegl_glGetTexLevelParameterxvOES + .size bluegl_glCheckNamedFramebufferStatus, .-bluegl_glCheckNamedFramebufferStatus .align 2 - .global bluegl_glVertexAttribPointer - .type bluegl_glVertexAttribPointer, %function -bluegl_glVertexAttribPointer: - adrp x16, :got:__blue_glCore_glVertexAttribPointer - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribPointer] + .global bluegl_glGetNamedFramebufferParameteriv + .type bluegl_glGetNamedFramebufferParameteriv, %function +bluegl_glGetNamedFramebufferParameteriv: + adrp x16, :got:__blue_glCore_glGetNamedFramebufferParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedFramebufferParameteriv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribPointer, .-bluegl_glVertexAttribPointer + .size bluegl_glGetNamedFramebufferParameteriv, .-bluegl_glGetNamedFramebufferParameteriv .align 2 - .global bluegl_glTextureImage1DEXT - .type bluegl_glTextureImage1DEXT, %function -bluegl_glTextureImage1DEXT: - adrp x16, :got:__blue_glCore_glTextureImage1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureImage1DEXT] + .global bluegl_glGetNamedFramebufferAttachmentParameteriv + .type bluegl_glGetNamedFramebufferAttachmentParameteriv, %function +bluegl_glGetNamedFramebufferAttachmentParameteriv: + adrp x16, :got:__blue_glCore_glGetNamedFramebufferAttachmentParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedFramebufferAttachmentParameteriv] ldr x16, [x16] br x16 - .size bluegl_glTextureImage1DEXT, .-bluegl_glTextureImage1DEXT + .size bluegl_glGetNamedFramebufferAttachmentParameteriv, .-bluegl_glGetNamedFramebufferAttachmentParameteriv .align 2 - .global bluegl_glVertexAttribs4dvNV - .type bluegl_glVertexAttribs4dvNV, %function -bluegl_glVertexAttribs4dvNV: - adrp x16, :got:__blue_glCore_glVertexAttribs4dvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs4dvNV] + .global bluegl_glCreateRenderbuffers + .type bluegl_glCreateRenderbuffers, %function +bluegl_glCreateRenderbuffers: + adrp x16, :got:__blue_glCore_glCreateRenderbuffers + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateRenderbuffers] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribs4dvNV, .-bluegl_glVertexAttribs4dvNV + .size bluegl_glCreateRenderbuffers, .-bluegl_glCreateRenderbuffers .align 2 - .global bluegl_glSecondaryColor3svEXT - .type bluegl_glSecondaryColor3svEXT, %function -bluegl_glSecondaryColor3svEXT: - adrp x16, :got:__blue_glCore_glSecondaryColor3svEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3svEXT] + .global bluegl_glNamedRenderbufferStorage + .type bluegl_glNamedRenderbufferStorage, %function +bluegl_glNamedRenderbufferStorage: + adrp x16, :got:__blue_glCore_glNamedRenderbufferStorage + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedRenderbufferStorage] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3svEXT, .-bluegl_glSecondaryColor3svEXT + .size bluegl_glNamedRenderbufferStorage, .-bluegl_glNamedRenderbufferStorage .align 2 - .global bluegl_glGetQueryivARB - .type bluegl_glGetQueryivARB, %function -bluegl_glGetQueryivARB: - adrp x16, :got:__blue_glCore_glGetQueryivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryivARB] + .global bluegl_glNamedRenderbufferStorageMultisample + .type bluegl_glNamedRenderbufferStorageMultisample, %function +bluegl_glNamedRenderbufferStorageMultisample: + adrp x16, :got:__blue_glCore_glNamedRenderbufferStorageMultisample + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedRenderbufferStorageMultisample] ldr x16, [x16] br x16 - .size bluegl_glGetQueryivARB, .-bluegl_glGetQueryivARB + .size bluegl_glNamedRenderbufferStorageMultisample, .-bluegl_glNamedRenderbufferStorageMultisample .align 2 - .global bluegl_glTexCoord4bOES - .type bluegl_glTexCoord4bOES, %function -bluegl_glTexCoord4bOES: - adrp x16, :got:__blue_glCore_glTexCoord4bOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord4bOES] + .global bluegl_glGetNamedRenderbufferParameteriv + .type bluegl_glGetNamedRenderbufferParameteriv, %function +bluegl_glGetNamedRenderbufferParameteriv: + adrp x16, :got:__blue_glCore_glGetNamedRenderbufferParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedRenderbufferParameteriv] ldr x16, [x16] br x16 - .size bluegl_glTexCoord4bOES, .-bluegl_glTexCoord4bOES + .size bluegl_glGetNamedRenderbufferParameteriv, .-bluegl_glGetNamedRenderbufferParameteriv .align 2 - .global bluegl_glProgramUniform1fEXT - .type bluegl_glProgramUniform1fEXT, %function -bluegl_glProgramUniform1fEXT: - adrp x16, :got:__blue_glCore_glProgramUniform1fEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1fEXT] + .global bluegl_glCreateTextures + .type bluegl_glCreateTextures, %function +bluegl_glCreateTextures: + adrp x16, :got:__blue_glCore_glCreateTextures + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateTextures] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1fEXT, .-bluegl_glProgramUniform1fEXT + .size bluegl_glCreateTextures, .-bluegl_glCreateTextures .align 2 - .global bluegl_glVertexP2ui - .type bluegl_glVertexP2ui, %function -bluegl_glVertexP2ui: - adrp x16, :got:__blue_glCore_glVertexP2ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexP2ui] + .global bluegl_glTextureBuffer + .type bluegl_glTextureBuffer, %function +bluegl_glTextureBuffer: + adrp x16, :got:__blue_glCore_glTextureBuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureBuffer] ldr x16, [x16] br x16 - .size bluegl_glVertexP2ui, .-bluegl_glVertexP2ui + .size bluegl_glTextureBuffer, .-bluegl_glTextureBuffer .align 2 - .global bluegl_glSetInvariantEXT - .type bluegl_glSetInvariantEXT, %function -bluegl_glSetInvariantEXT: - adrp x16, :got:__blue_glCore_glSetInvariantEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSetInvariantEXT] + .global bluegl_glTextureBufferRange + .type bluegl_glTextureBufferRange, %function +bluegl_glTextureBufferRange: + adrp x16, :got:__blue_glCore_glTextureBufferRange + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureBufferRange] ldr x16, [x16] br x16 - .size bluegl_glSetInvariantEXT, .-bluegl_glSetInvariantEXT + .size bluegl_glTextureBufferRange, .-bluegl_glTextureBufferRange .align 2 - .global bluegl_glActiveShaderProgram - .type bluegl_glActiveShaderProgram, %function -bluegl_glActiveShaderProgram: - adrp x16, :got:__blue_glCore_glActiveShaderProgram - ldr x16, [x16, #:got_lo12:__blue_glCore_glActiveShaderProgram] + .global bluegl_glTextureStorage1D + .type bluegl_glTextureStorage1D, %function +bluegl_glTextureStorage1D: + adrp x16, :got:__blue_glCore_glTextureStorage1D + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage1D] ldr x16, [x16] br x16 - .size bluegl_glActiveShaderProgram, .-bluegl_glActiveShaderProgram + .size bluegl_glTextureStorage1D, .-bluegl_glTextureStorage1D .align 2 - .global bluegl_glVertexAttribL1ui64NV - .type bluegl_glVertexAttribL1ui64NV, %function -bluegl_glVertexAttribL1ui64NV: - adrp x16, :got:__blue_glCore_glVertexAttribL1ui64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1ui64NV] + .global bluegl_glTextureStorage2D + .type bluegl_glTextureStorage2D, %function +bluegl_glTextureStorage2D: + adrp x16, :got:__blue_glCore_glTextureStorage2D + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage2D] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL1ui64NV, .-bluegl_glVertexAttribL1ui64NV + .size bluegl_glTextureStorage2D, .-bluegl_glTextureStorage2D .align 2 - .global bluegl_glGetVariantBooleanvEXT - .type bluegl_glGetVariantBooleanvEXT, %function -bluegl_glGetVariantBooleanvEXT: - adrp x16, :got:__blue_glCore_glGetVariantBooleanvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVariantBooleanvEXT] + .global bluegl_glTextureStorage3D + .type bluegl_glTextureStorage3D, %function +bluegl_glTextureStorage3D: + adrp x16, :got:__blue_glCore_glTextureStorage3D + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage3D] ldr x16, [x16] br x16 - .size bluegl_glGetVariantBooleanvEXT, .-bluegl_glGetVariantBooleanvEXT + .size bluegl_glTextureStorage3D, .-bluegl_glTextureStorage3D .align 2 - .global bluegl_glAreTexturesResidentEXT - .type bluegl_glAreTexturesResidentEXT, %function -bluegl_glAreTexturesResidentEXT: - adrp x16, :got:__blue_glCore_glAreTexturesResidentEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glAreTexturesResidentEXT] + .global bluegl_glTextureStorage2DMultisample + .type bluegl_glTextureStorage2DMultisample, %function +bluegl_glTextureStorage2DMultisample: + adrp x16, :got:__blue_glCore_glTextureStorage2DMultisample + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage2DMultisample] ldr x16, [x16] br x16 - .size bluegl_glAreTexturesResidentEXT, .-bluegl_glAreTexturesResidentEXT + .size bluegl_glTextureStorage2DMultisample, .-bluegl_glTextureStorage2DMultisample .align 2 - .global bluegl_glMatrixMultTranspose3x3fNV - .type bluegl_glMatrixMultTranspose3x3fNV, %function -bluegl_glMatrixMultTranspose3x3fNV: - adrp x16, :got:__blue_glCore_glMatrixMultTranspose3x3fNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixMultTranspose3x3fNV] + .global bluegl_glTextureStorage3DMultisample + .type bluegl_glTextureStorage3DMultisample, %function +bluegl_glTextureStorage3DMultisample: + adrp x16, :got:__blue_glCore_glTextureStorage3DMultisample + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage3DMultisample] ldr x16, [x16] br x16 - .size bluegl_glMatrixMultTranspose3x3fNV, .-bluegl_glMatrixMultTranspose3x3fNV + .size bluegl_glTextureStorage3DMultisample, .-bluegl_glTextureStorage3DMultisample .align 2 - .global bluegl_glProgramUniform2f - .type bluegl_glProgramUniform2f, %function -bluegl_glProgramUniform2f: - adrp x16, :got:__blue_glCore_glProgramUniform2f - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2f] + .global bluegl_glTextureSubImage1D + .type bluegl_glTextureSubImage1D, %function +bluegl_glTextureSubImage1D: + adrp x16, :got:__blue_glCore_glTextureSubImage1D + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureSubImage1D] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2f, .-bluegl_glProgramUniform2f + .size bluegl_glTextureSubImage1D, .-bluegl_glTextureSubImage1D .align 2 - .global bluegl_glClearNamedBufferDataEXT - .type bluegl_glClearNamedBufferDataEXT, %function -bluegl_glClearNamedBufferDataEXT: - adrp x16, :got:__blue_glCore_glClearNamedBufferDataEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearNamedBufferDataEXT] + .global bluegl_glTextureSubImage2D + .type bluegl_glTextureSubImage2D, %function +bluegl_glTextureSubImage2D: + adrp x16, :got:__blue_glCore_glTextureSubImage2D + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureSubImage2D] ldr x16, [x16] br x16 - .size bluegl_glClearNamedBufferDataEXT, .-bluegl_glClearNamedBufferDataEXT + .size bluegl_glTextureSubImage2D, .-bluegl_glTextureSubImage2D .align 2 - .global bluegl_glIsOcclusionQueryNV - .type bluegl_glIsOcclusionQueryNV, %function -bluegl_glIsOcclusionQueryNV: - adrp x16, :got:__blue_glCore_glIsOcclusionQueryNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsOcclusionQueryNV] + .global bluegl_glTextureSubImage3D + .type bluegl_glTextureSubImage3D, %function +bluegl_glTextureSubImage3D: + adrp x16, :got:__blue_glCore_glTextureSubImage3D + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureSubImage3D] ldr x16, [x16] br x16 - .size bluegl_glIsOcclusionQueryNV, .-bluegl_glIsOcclusionQueryNV + .size bluegl_glTextureSubImage3D, .-bluegl_glTextureSubImage3D .align 2 - .global bluegl_glVertexAttribI4bv - .type bluegl_glVertexAttribI4bv, %function -bluegl_glVertexAttribI4bv: - adrp x16, :got:__blue_glCore_glVertexAttribI4bv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4bv] + .global bluegl_glCompressedTextureSubImage1D + .type bluegl_glCompressedTextureSubImage1D, %function +bluegl_glCompressedTextureSubImage1D: + adrp x16, :got:__blue_glCore_glCompressedTextureSubImage1D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTextureSubImage1D] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI4bv, .-bluegl_glVertexAttribI4bv + .size bluegl_glCompressedTextureSubImage1D, .-bluegl_glCompressedTextureSubImage1D .align 2 - .global bluegl_glTexCoord2xvOES - .type bluegl_glTexCoord2xvOES, %function -bluegl_glTexCoord2xvOES: - adrp x16, :got:__blue_glCore_glTexCoord2xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2xvOES] + .global bluegl_glCompressedTextureSubImage2D + .type bluegl_glCompressedTextureSubImage2D, %function +bluegl_glCompressedTextureSubImage2D: + adrp x16, :got:__blue_glCore_glCompressedTextureSubImage2D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTextureSubImage2D] ldr x16, [x16] br x16 - .size bluegl_glTexCoord2xvOES, .-bluegl_glTexCoord2xvOES + .size bluegl_glCompressedTextureSubImage2D, .-bluegl_glCompressedTextureSubImage2D .align 2 - .global bluegl_glVertexAttrib4Nubv - .type bluegl_glVertexAttrib4Nubv, %function -bluegl_glVertexAttrib4Nubv: - adrp x16, :got:__blue_glCore_glVertexAttrib4Nubv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4Nubv] + .global bluegl_glCompressedTextureSubImage3D + .type bluegl_glCompressedTextureSubImage3D, %function +bluegl_glCompressedTextureSubImage3D: + adrp x16, :got:__blue_glCore_glCompressedTextureSubImage3D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTextureSubImage3D] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4Nubv, .-bluegl_glVertexAttrib4Nubv + .size bluegl_glCompressedTextureSubImage3D, .-bluegl_glCompressedTextureSubImage3D .align 2 - .global bluegl_glVertexAttrib3hNV - .type bluegl_glVertexAttrib3hNV, %function -bluegl_glVertexAttrib3hNV: - adrp x16, :got:__blue_glCore_glVertexAttrib3hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3hNV] + .global bluegl_glCopyTextureSubImage1D + .type bluegl_glCopyTextureSubImage1D, %function +bluegl_glCopyTextureSubImage1D: + adrp x16, :got:__blue_glCore_glCopyTextureSubImage1D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTextureSubImage1D] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3hNV, .-bluegl_glVertexAttrib3hNV + .size bluegl_glCopyTextureSubImage1D, .-bluegl_glCopyTextureSubImage1D .align 2 - .global bluegl_glMultiTexCoord2xvOES - .type bluegl_glMultiTexCoord2xvOES, %function -bluegl_glMultiTexCoord2xvOES: - adrp x16, :got:__blue_glCore_glMultiTexCoord2xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2xvOES] + .global bluegl_glCopyTextureSubImage2D + .type bluegl_glCopyTextureSubImage2D, %function +bluegl_glCopyTextureSubImage2D: + adrp x16, :got:__blue_glCore_glCopyTextureSubImage2D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTextureSubImage2D] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2xvOES, .-bluegl_glMultiTexCoord2xvOES + .size bluegl_glCopyTextureSubImage2D, .-bluegl_glCopyTextureSubImage2D .align 2 - .global bluegl_glFramebufferTextureEXT - .type bluegl_glFramebufferTextureEXT, %function -bluegl_glFramebufferTextureEXT: - adrp x16, :got:__blue_glCore_glFramebufferTextureEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTextureEXT] + .global bluegl_glCopyTextureSubImage3D + .type bluegl_glCopyTextureSubImage3D, %function +bluegl_glCopyTextureSubImage3D: + adrp x16, :got:__blue_glCore_glCopyTextureSubImage3D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTextureSubImage3D] + ldr x16, [x16] + br x16 + .size bluegl_glCopyTextureSubImage3D, .-bluegl_glCopyTextureSubImage3D + + .align 2 + .global bluegl_glTextureParameterf + .type bluegl_glTextureParameterf, %function +bluegl_glTextureParameterf: + adrp x16, :got:__blue_glCore_glTextureParameterf + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameterf] ldr x16, [x16] br x16 - .size bluegl_glFramebufferTextureEXT, .-bluegl_glFramebufferTextureEXT + .size bluegl_glTextureParameterf, .-bluegl_glTextureParameterf .align 2 - .global bluegl_glProgramUniformMatrix3fv - .type bluegl_glProgramUniformMatrix3fv, %function -bluegl_glProgramUniformMatrix3fv: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix3fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3fv] + .global bluegl_glTextureParameterfv + .type bluegl_glTextureParameterfv, %function +bluegl_glTextureParameterfv: + adrp x16, :got:__blue_glCore_glTextureParameterfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameterfv] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix3fv, .-bluegl_glProgramUniformMatrix3fv + .size bluegl_glTextureParameterfv, .-bluegl_glTextureParameterfv .align 2 - .global bluegl_glGetInternalformatSampleivNV - .type bluegl_glGetInternalformatSampleivNV, %function -bluegl_glGetInternalformatSampleivNV: - adrp x16, :got:__blue_glCore_glGetInternalformatSampleivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInternalformatSampleivNV] + .global bluegl_glTextureParameteri + .type bluegl_glTextureParameteri, %function +bluegl_glTextureParameteri: + adrp x16, :got:__blue_glCore_glTextureParameteri + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameteri] ldr x16, [x16] br x16 - .size bluegl_glGetInternalformatSampleivNV, .-bluegl_glGetInternalformatSampleivNV + .size bluegl_glTextureParameteri, .-bluegl_glTextureParameteri .align 2 - .global bluegl_glPathSubCommandsNV - .type bluegl_glPathSubCommandsNV, %function -bluegl_glPathSubCommandsNV: - adrp x16, :got:__blue_glCore_glPathSubCommandsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathSubCommandsNV] + .global bluegl_glTextureParameterIiv + .type bluegl_glTextureParameterIiv, %function +bluegl_glTextureParameterIiv: + adrp x16, :got:__blue_glCore_glTextureParameterIiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameterIiv] ldr x16, [x16] br x16 - .size bluegl_glPathSubCommandsNV, .-bluegl_glPathSubCommandsNV + .size bluegl_glTextureParameterIiv, .-bluegl_glTextureParameterIiv .align 2 - .global bluegl_glStencilStrokePathNV - .type bluegl_glStencilStrokePathNV, %function -bluegl_glStencilStrokePathNV: - adrp x16, :got:__blue_glCore_glStencilStrokePathNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilStrokePathNV] + .global bluegl_glTextureParameterIuiv + .type bluegl_glTextureParameterIuiv, %function +bluegl_glTextureParameterIuiv: + adrp x16, :got:__blue_glCore_glTextureParameterIuiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameterIuiv] ldr x16, [x16] br x16 - .size bluegl_glStencilStrokePathNV, .-bluegl_glStencilStrokePathNV + .size bluegl_glTextureParameterIuiv, .-bluegl_glTextureParameterIuiv .align 2 - .global bluegl_glPathParameterfNV - .type bluegl_glPathParameterfNV, %function -bluegl_glPathParameterfNV: - adrp x16, :got:__blue_glCore_glPathParameterfNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathParameterfNV] + .global bluegl_glTextureParameteriv + .type bluegl_glTextureParameteriv, %function +bluegl_glTextureParameteriv: + adrp x16, :got:__blue_glCore_glTextureParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameteriv] ldr x16, [x16] br x16 - .size bluegl_glPathParameterfNV, .-bluegl_glPathParameterfNV + .size bluegl_glTextureParameteriv, .-bluegl_glTextureParameteriv .align 2 - .global bluegl_glActiveProgramEXT - .type bluegl_glActiveProgramEXT, %function -bluegl_glActiveProgramEXT: - adrp x16, :got:__blue_glCore_glActiveProgramEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glActiveProgramEXT] + .global bluegl_glGenerateTextureMipmap + .type bluegl_glGenerateTextureMipmap, %function +bluegl_glGenerateTextureMipmap: + adrp x16, :got:__blue_glCore_glGenerateTextureMipmap + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenerateTextureMipmap] ldr x16, [x16] br x16 - .size bluegl_glActiveProgramEXT, .-bluegl_glActiveProgramEXT + .size bluegl_glGenerateTextureMipmap, .-bluegl_glGenerateTextureMipmap .align 2 - .global bluegl_glClampColorARB - .type bluegl_glClampColorARB, %function -bluegl_glClampColorARB: - adrp x16, :got:__blue_glCore_glClampColorARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glClampColorARB] + .global bluegl_glBindTextureUnit + .type bluegl_glBindTextureUnit, %function +bluegl_glBindTextureUnit: + adrp x16, :got:__blue_glCore_glBindTextureUnit + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindTextureUnit] ldr x16, [x16] br x16 - .size bluegl_glClampColorARB, .-bluegl_glClampColorARB + .size bluegl_glBindTextureUnit, .-bluegl_glBindTextureUnit .align 2 - .global bluegl_glVertexAttribI2uivEXT - .type bluegl_glVertexAttribI2uivEXT, %function -bluegl_glVertexAttribI2uivEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI2uivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI2uivEXT] + .global bluegl_glGetTextureImage + .type bluegl_glGetTextureImage, %function +bluegl_glGetTextureImage: + adrp x16, :got:__blue_glCore_glGetTextureImage + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureImage] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI2uivEXT, .-bluegl_glVertexAttribI2uivEXT + .size bluegl_glGetTextureImage, .-bluegl_glGetTextureImage .align 2 - .global bluegl_glVertexAttribL1ui64vARB - .type bluegl_glVertexAttribL1ui64vARB, %function -bluegl_glVertexAttribL1ui64vARB: - adrp x16, :got:__blue_glCore_glVertexAttribL1ui64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1ui64vARB] + .global bluegl_glGetCompressedTextureImage + .type bluegl_glGetCompressedTextureImage, %function +bluegl_glGetCompressedTextureImage: + adrp x16, :got:__blue_glCore_glGetCompressedTextureImage + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCompressedTextureImage] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL1ui64vARB, .-bluegl_glVertexAttribL1ui64vARB + .size bluegl_glGetCompressedTextureImage, .-bluegl_glGetCompressedTextureImage .align 2 - .global bluegl_glValidateProgram - .type bluegl_glValidateProgram, %function -bluegl_glValidateProgram: - adrp x16, :got:__blue_glCore_glValidateProgram - ldr x16, [x16, #:got_lo12:__blue_glCore_glValidateProgram] + .global bluegl_glGetTextureLevelParameterfv + .type bluegl_glGetTextureLevelParameterfv, %function +bluegl_glGetTextureLevelParameterfv: + adrp x16, :got:__blue_glCore_glGetTextureLevelParameterfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureLevelParameterfv] ldr x16, [x16] br x16 - .size bluegl_glValidateProgram, .-bluegl_glValidateProgram + .size bluegl_glGetTextureLevelParameterfv, .-bluegl_glGetTextureLevelParameterfv .align 2 - .global bluegl_glMultiTexCoord2xOES - .type bluegl_glMultiTexCoord2xOES, %function -bluegl_glMultiTexCoord2xOES: - adrp x16, :got:__blue_glCore_glMultiTexCoord2xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2xOES] + .global bluegl_glGetTextureLevelParameteriv + .type bluegl_glGetTextureLevelParameteriv, %function +bluegl_glGetTextureLevelParameteriv: + adrp x16, :got:__blue_glCore_glGetTextureLevelParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureLevelParameteriv] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2xOES, .-bluegl_glMultiTexCoord2xOES + .size bluegl_glGetTextureLevelParameteriv, .-bluegl_glGetTextureLevelParameteriv .align 2 - .global bluegl_glFogCoordf - .type bluegl_glFogCoordf, %function -bluegl_glFogCoordf: - adrp x16, :got:__blue_glCore_glFogCoordf - ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordf] + .global bluegl_glGetTextureParameterfv + .type bluegl_glGetTextureParameterfv, %function +bluegl_glGetTextureParameterfv: + adrp x16, :got:__blue_glCore_glGetTextureParameterfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureParameterfv] ldr x16, [x16] br x16 - .size bluegl_glFogCoordf, .-bluegl_glFogCoordf + .size bluegl_glGetTextureParameterfv, .-bluegl_glGetTextureParameterfv .align 2 - .global bluegl_glGetError - .type bluegl_glGetError, %function -bluegl_glGetError: - adrp x16, :got:__blue_glCore_glGetError - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetError] + .global bluegl_glGetTextureParameterIiv + .type bluegl_glGetTextureParameterIiv, %function +bluegl_glGetTextureParameterIiv: + adrp x16, :got:__blue_glCore_glGetTextureParameterIiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureParameterIiv] ldr x16, [x16] br x16 - .size bluegl_glGetError, .-bluegl_glGetError + .size bluegl_glGetTextureParameterIiv, .-bluegl_glGetTextureParameterIiv .align 2 - .global bluegl_glSpriteParameterfSGIX - .type bluegl_glSpriteParameterfSGIX, %function -bluegl_glSpriteParameterfSGIX: - adrp x16, :got:__blue_glCore_glSpriteParameterfSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glSpriteParameterfSGIX] + .global bluegl_glGetTextureParameterIuiv + .type bluegl_glGetTextureParameterIuiv, %function +bluegl_glGetTextureParameterIuiv: + adrp x16, :got:__blue_glCore_glGetTextureParameterIuiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureParameterIuiv] ldr x16, [x16] br x16 - .size bluegl_glSpriteParameterfSGIX, .-bluegl_glSpriteParameterfSGIX + .size bluegl_glGetTextureParameterIuiv, .-bluegl_glGetTextureParameterIuiv .align 2 - .global bluegl_glVertexAttrib3dvNV - .type bluegl_glVertexAttrib3dvNV, %function -bluegl_glVertexAttrib3dvNV: - adrp x16, :got:__blue_glCore_glVertexAttrib3dvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3dvNV] + .global bluegl_glGetTextureParameteriv + .type bluegl_glGetTextureParameteriv, %function +bluegl_glGetTextureParameteriv: + adrp x16, :got:__blue_glCore_glGetTextureParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureParameteriv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3dvNV, .-bluegl_glVertexAttrib3dvNV + .size bluegl_glGetTextureParameteriv, .-bluegl_glGetTextureParameteriv .align 2 - .global bluegl_glMultiTexCoord3bOES - .type bluegl_glMultiTexCoord3bOES, %function -bluegl_glMultiTexCoord3bOES: - adrp x16, :got:__blue_glCore_glMultiTexCoord3bOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3bOES] + .global bluegl_glCreateVertexArrays + .type bluegl_glCreateVertexArrays, %function +bluegl_glCreateVertexArrays: + adrp x16, :got:__blue_glCore_glCreateVertexArrays + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateVertexArrays] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3bOES, .-bluegl_glMultiTexCoord3bOES + .size bluegl_glCreateVertexArrays, .-bluegl_glCreateVertexArrays .align 2 - .global bluegl_glGetTexParameterIuivEXT - .type bluegl_glGetTexParameterIuivEXT, %function -bluegl_glGetTexParameterIuivEXT: - adrp x16, :got:__blue_glCore_glGetTexParameterIuivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexParameterIuivEXT] + .global bluegl_glDisableVertexArrayAttrib + .type bluegl_glDisableVertexArrayAttrib, %function +bluegl_glDisableVertexArrayAttrib: + adrp x16, :got:__blue_glCore_glDisableVertexArrayAttrib + ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableVertexArrayAttrib] ldr x16, [x16] br x16 - .size bluegl_glGetTexParameterIuivEXT, .-bluegl_glGetTexParameterIuivEXT + .size bluegl_glDisableVertexArrayAttrib, .-bluegl_glDisableVertexArrayAttrib .align 2 - .global bluegl_glIndexMaterialEXT - .type bluegl_glIndexMaterialEXT, %function -bluegl_glIndexMaterialEXT: - adrp x16, :got:__blue_glCore_glIndexMaterialEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glIndexMaterialEXT] + .global bluegl_glEnableVertexArrayAttrib + .type bluegl_glEnableVertexArrayAttrib, %function +bluegl_glEnableVertexArrayAttrib: + adrp x16, :got:__blue_glCore_glEnableVertexArrayAttrib + ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableVertexArrayAttrib] ldr x16, [x16] br x16 - .size bluegl_glIndexMaterialEXT, .-bluegl_glIndexMaterialEXT + .size bluegl_glEnableVertexArrayAttrib, .-bluegl_glEnableVertexArrayAttrib .align 2 - .global bluegl_glUniform1iARB - .type bluegl_glUniform1iARB, %function -bluegl_glUniform1iARB: - adrp x16, :got:__blue_glCore_glUniform1iARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1iARB] + .global bluegl_glVertexArrayElementBuffer + .type bluegl_glVertexArrayElementBuffer, %function +bluegl_glVertexArrayElementBuffer: + adrp x16, :got:__blue_glCore_glVertexArrayElementBuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayElementBuffer] ldr x16, [x16] br x16 - .size bluegl_glUniform1iARB, .-bluegl_glUniform1iARB + .size bluegl_glVertexArrayElementBuffer, .-bluegl_glVertexArrayElementBuffer .align 2 - .global bluegl_glVertexAttrib4NivARB - .type bluegl_glVertexAttrib4NivARB, %function -bluegl_glVertexAttrib4NivARB: - adrp x16, :got:__blue_glCore_glVertexAttrib4NivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4NivARB] + .global bluegl_glVertexArrayVertexBuffer + .type bluegl_glVertexArrayVertexBuffer, %function +bluegl_glVertexArrayVertexBuffer: + adrp x16, :got:__blue_glCore_glVertexArrayVertexBuffer + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexBuffer] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4NivARB, .-bluegl_glVertexAttrib4NivARB + .size bluegl_glVertexArrayVertexBuffer, .-bluegl_glVertexArrayVertexBuffer .align 2 - .global bluegl_glTextureParameteri - .type bluegl_glTextureParameteri, %function -bluegl_glTextureParameteri: - adrp x16, :got:__blue_glCore_glTextureParameteri - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameteri] + .global bluegl_glVertexArrayVertexBuffers + .type bluegl_glVertexArrayVertexBuffers, %function +bluegl_glVertexArrayVertexBuffers: + adrp x16, :got:__blue_glCore_glVertexArrayVertexBuffers + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexBuffers] ldr x16, [x16] br x16 - .size bluegl_glTextureParameteri, .-bluegl_glTextureParameteri + .size bluegl_glVertexArrayVertexBuffers, .-bluegl_glVertexArrayVertexBuffers .align 2 - .global bluegl_glSecondaryColor3d - .type bluegl_glSecondaryColor3d, %function -bluegl_glSecondaryColor3d: - adrp x16, :got:__blue_glCore_glSecondaryColor3d - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3d] + .global bluegl_glVertexArrayAttribBinding + .type bluegl_glVertexArrayAttribBinding, %function +bluegl_glVertexArrayAttribBinding: + adrp x16, :got:__blue_glCore_glVertexArrayAttribBinding + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayAttribBinding] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3d, .-bluegl_glSecondaryColor3d + .size bluegl_glVertexArrayAttribBinding, .-bluegl_glVertexArrayAttribBinding .align 2 - .global bluegl_glWindowPos2sv - .type bluegl_glWindowPos2sv, %function -bluegl_glWindowPos2sv: - adrp x16, :got:__blue_glCore_glWindowPos2sv - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2sv] + .global bluegl_glVertexArrayAttribFormat + .type bluegl_glVertexArrayAttribFormat, %function +bluegl_glVertexArrayAttribFormat: + adrp x16, :got:__blue_glCore_glVertexArrayAttribFormat + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayAttribFormat] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2sv, .-bluegl_glWindowPos2sv + .size bluegl_glVertexArrayAttribFormat, .-bluegl_glVertexArrayAttribFormat .align 2 - .global bluegl_glDrawBuffersARB - .type bluegl_glDrawBuffersARB, %function -bluegl_glDrawBuffersARB: - adrp x16, :got:__blue_glCore_glDrawBuffersARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawBuffersARB] + .global bluegl_glVertexArrayAttribIFormat + .type bluegl_glVertexArrayAttribIFormat, %function +bluegl_glVertexArrayAttribIFormat: + adrp x16, :got:__blue_glCore_glVertexArrayAttribIFormat + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayAttribIFormat] ldr x16, [x16] br x16 - .size bluegl_glDrawBuffersARB, .-bluegl_glDrawBuffersARB + .size bluegl_glVertexArrayAttribIFormat, .-bluegl_glVertexArrayAttribIFormat .align 2 - .global bluegl_glGetMultiTexParameterIuivEXT - .type bluegl_glGetMultiTexParameterIuivEXT, %function -bluegl_glGetMultiTexParameterIuivEXT: - adrp x16, :got:__blue_glCore_glGetMultiTexParameterIuivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexParameterIuivEXT] + .global bluegl_glVertexArrayAttribLFormat + .type bluegl_glVertexArrayAttribLFormat, %function +bluegl_glVertexArrayAttribLFormat: + adrp x16, :got:__blue_glCore_glVertexArrayAttribLFormat + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayAttribLFormat] ldr x16, [x16] br x16 - .size bluegl_glGetMultiTexParameterIuivEXT, .-bluegl_glGetMultiTexParameterIuivEXT + .size bluegl_glVertexArrayAttribLFormat, .-bluegl_glVertexArrayAttribLFormat .align 2 - .global bluegl_glGetConvolutionFilter - .type bluegl_glGetConvolutionFilter, %function -bluegl_glGetConvolutionFilter: - adrp x16, :got:__blue_glCore_glGetConvolutionFilter - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetConvolutionFilter] + .global bluegl_glVertexArrayBindingDivisor + .type bluegl_glVertexArrayBindingDivisor, %function +bluegl_glVertexArrayBindingDivisor: + adrp x16, :got:__blue_glCore_glVertexArrayBindingDivisor + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayBindingDivisor] ldr x16, [x16] br x16 - .size bluegl_glGetConvolutionFilter, .-bluegl_glGetConvolutionFilter + .size bluegl_glVertexArrayBindingDivisor, .-bluegl_glVertexArrayBindingDivisor .align 2 - .global bluegl_glDisableVertexArrayAttrib - .type bluegl_glDisableVertexArrayAttrib, %function -bluegl_glDisableVertexArrayAttrib: - adrp x16, :got:__blue_glCore_glDisableVertexArrayAttrib - ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableVertexArrayAttrib] + .global bluegl_glGetVertexArrayiv + .type bluegl_glGetVertexArrayiv, %function +bluegl_glGetVertexArrayiv: + adrp x16, :got:__blue_glCore_glGetVertexArrayiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexArrayiv] ldr x16, [x16] br x16 - .size bluegl_glDisableVertexArrayAttrib, .-bluegl_glDisableVertexArrayAttrib + .size bluegl_glGetVertexArrayiv, .-bluegl_glGetVertexArrayiv .align 2 - .global bluegl_glProgramUniform4i - .type bluegl_glProgramUniform4i, %function -bluegl_glProgramUniform4i: - adrp x16, :got:__blue_glCore_glProgramUniform4i - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4i] + .global bluegl_glGetVertexArrayIndexediv + .type bluegl_glGetVertexArrayIndexediv, %function +bluegl_glGetVertexArrayIndexediv: + adrp x16, :got:__blue_glCore_glGetVertexArrayIndexediv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexArrayIndexediv] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4i, .-bluegl_glProgramUniform4i + .size bluegl_glGetVertexArrayIndexediv, .-bluegl_glGetVertexArrayIndexediv .align 2 - .global bluegl_glCheckNamedFramebufferStatusEXT - .type bluegl_glCheckNamedFramebufferStatusEXT, %function -bluegl_glCheckNamedFramebufferStatusEXT: - adrp x16, :got:__blue_glCore_glCheckNamedFramebufferStatusEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCheckNamedFramebufferStatusEXT] + .global bluegl_glGetVertexArrayIndexed64iv + .type bluegl_glGetVertexArrayIndexed64iv, %function +bluegl_glGetVertexArrayIndexed64iv: + adrp x16, :got:__blue_glCore_glGetVertexArrayIndexed64iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexArrayIndexed64iv] ldr x16, [x16] br x16 - .size bluegl_glCheckNamedFramebufferStatusEXT, .-bluegl_glCheckNamedFramebufferStatusEXT + .size bluegl_glGetVertexArrayIndexed64iv, .-bluegl_glGetVertexArrayIndexed64iv .align 2 - .global bluegl_glMultiTexCoord3xOES - .type bluegl_glMultiTexCoord3xOES, %function -bluegl_glMultiTexCoord3xOES: - adrp x16, :got:__blue_glCore_glMultiTexCoord3xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3xOES] + .global bluegl_glCreateSamplers + .type bluegl_glCreateSamplers, %function +bluegl_glCreateSamplers: + adrp x16, :got:__blue_glCore_glCreateSamplers + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateSamplers] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3xOES, .-bluegl_glMultiTexCoord3xOES + .size bluegl_glCreateSamplers, .-bluegl_glCreateSamplers .align 2 - .global bluegl_glDrawElementsInstancedEXT - .type bluegl_glDrawElementsInstancedEXT, %function -bluegl_glDrawElementsInstancedEXT: - adrp x16, :got:__blue_glCore_glDrawElementsInstancedEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementsInstancedEXT] + .global bluegl_glCreateProgramPipelines + .type bluegl_glCreateProgramPipelines, %function +bluegl_glCreateProgramPipelines: + adrp x16, :got:__blue_glCore_glCreateProgramPipelines + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateProgramPipelines] ldr x16, [x16] br x16 - .size bluegl_glDrawElementsInstancedEXT, .-bluegl_glDrawElementsInstancedEXT + .size bluegl_glCreateProgramPipelines, .-bluegl_glCreateProgramPipelines .align 2 - .global bluegl_glColor4fNormal3fVertex3fvSUN - .type bluegl_glColor4fNormal3fVertex3fvSUN, %function -bluegl_glColor4fNormal3fVertex3fvSUN: - adrp x16, :got:__blue_glCore_glColor4fNormal3fVertex3fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4fNormal3fVertex3fvSUN] + .global bluegl_glCreateQueries + .type bluegl_glCreateQueries, %function +bluegl_glCreateQueries: + adrp x16, :got:__blue_glCore_glCreateQueries + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateQueries] ldr x16, [x16] br x16 - .size bluegl_glColor4fNormal3fVertex3fvSUN, .-bluegl_glColor4fNormal3fVertex3fvSUN + .size bluegl_glCreateQueries, .-bluegl_glCreateQueries .align 2 - .global bluegl_glIsTransformFeedbackNV - .type bluegl_glIsTransformFeedbackNV, %function -bluegl_glIsTransformFeedbackNV: - adrp x16, :got:__blue_glCore_glIsTransformFeedbackNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsTransformFeedbackNV] + .global bluegl_glGetQueryBufferObjecti64v + .type bluegl_glGetQueryBufferObjecti64v, %function +bluegl_glGetQueryBufferObjecti64v: + adrp x16, :got:__blue_glCore_glGetQueryBufferObjecti64v + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryBufferObjecti64v] ldr x16, [x16] br x16 - .size bluegl_glIsTransformFeedbackNV, .-bluegl_glIsTransformFeedbackNV + .size bluegl_glGetQueryBufferObjecti64v, .-bluegl_glGetQueryBufferObjecti64v .align 2 - .global bluegl_glDrawTransformFeedbackStreamInstanced - .type bluegl_glDrawTransformFeedbackStreamInstanced, %function -bluegl_glDrawTransformFeedbackStreamInstanced: - adrp x16, :got:__blue_glCore_glDrawTransformFeedbackStreamInstanced - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawTransformFeedbackStreamInstanced] + .global bluegl_glGetQueryBufferObjectiv + .type bluegl_glGetQueryBufferObjectiv, %function +bluegl_glGetQueryBufferObjectiv: + adrp x16, :got:__blue_glCore_glGetQueryBufferObjectiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryBufferObjectiv] ldr x16, [x16] br x16 - .size bluegl_glDrawTransformFeedbackStreamInstanced, .-bluegl_glDrawTransformFeedbackStreamInstanced + .size bluegl_glGetQueryBufferObjectiv, .-bluegl_glGetQueryBufferObjectiv .align 2 - .global bluegl_glMapNamedBufferEXT - .type bluegl_glMapNamedBufferEXT, %function -bluegl_glMapNamedBufferEXT: - adrp x16, :got:__blue_glCore_glMapNamedBufferEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMapNamedBufferEXT] + .global bluegl_glGetQueryBufferObjectui64v + .type bluegl_glGetQueryBufferObjectui64v, %function +bluegl_glGetQueryBufferObjectui64v: + adrp x16, :got:__blue_glCore_glGetQueryBufferObjectui64v + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryBufferObjectui64v] ldr x16, [x16] br x16 - .size bluegl_glMapNamedBufferEXT, .-bluegl_glMapNamedBufferEXT + .size bluegl_glGetQueryBufferObjectui64v, .-bluegl_glGetQueryBufferObjectui64v .align 2 - .global bluegl_glVertexArrayIndexOffsetEXT - .type bluegl_glVertexArrayIndexOffsetEXT, %function -bluegl_glVertexArrayIndexOffsetEXT: - adrp x16, :got:__blue_glCore_glVertexArrayIndexOffsetEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayIndexOffsetEXT] + .global bluegl_glGetQueryBufferObjectuiv + .type bluegl_glGetQueryBufferObjectuiv, %function +bluegl_glGetQueryBufferObjectuiv: + adrp x16, :got:__blue_glCore_glGetQueryBufferObjectuiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryBufferObjectuiv] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayIndexOffsetEXT, .-bluegl_glVertexArrayIndexOffsetEXT + .size bluegl_glGetQueryBufferObjectuiv, .-bluegl_glGetQueryBufferObjectuiv .align 2 - .global bluegl_glPolygonMode - .type bluegl_glPolygonMode, %function -bluegl_glPolygonMode: - adrp x16, :got:__blue_glCore_glPolygonMode - ldr x16, [x16, #:got_lo12:__blue_glCore_glPolygonMode] + .global bluegl_glMemoryBarrierByRegion + .type bluegl_glMemoryBarrierByRegion, %function +bluegl_glMemoryBarrierByRegion: + adrp x16, :got:__blue_glCore_glMemoryBarrierByRegion + ldr x16, [x16, #:got_lo12:__blue_glCore_glMemoryBarrierByRegion] ldr x16, [x16] br x16 - .size bluegl_glPolygonMode, .-bluegl_glPolygonMode + .size bluegl_glMemoryBarrierByRegion, .-bluegl_glMemoryBarrierByRegion .align 2 - .global bluegl_glGetDetailTexFuncSGIS - .type bluegl_glGetDetailTexFuncSGIS, %function -bluegl_glGetDetailTexFuncSGIS: - adrp x16, :got:__blue_glCore_glGetDetailTexFuncSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetDetailTexFuncSGIS] + .global bluegl_glGetTextureSubImage + .type bluegl_glGetTextureSubImage, %function +bluegl_glGetTextureSubImage: + adrp x16, :got:__blue_glCore_glGetTextureSubImage + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureSubImage] ldr x16, [x16] br x16 - .size bluegl_glGetDetailTexFuncSGIS, .-bluegl_glGetDetailTexFuncSGIS + .size bluegl_glGetTextureSubImage, .-bluegl_glGetTextureSubImage .align 2 - .global bluegl_glMultiTexCoord2iv - .type bluegl_glMultiTexCoord2iv, %function -bluegl_glMultiTexCoord2iv: - adrp x16, :got:__blue_glCore_glMultiTexCoord2iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2iv] + .global bluegl_glGetCompressedTextureSubImage + .type bluegl_glGetCompressedTextureSubImage, %function +bluegl_glGetCompressedTextureSubImage: + adrp x16, :got:__blue_glCore_glGetCompressedTextureSubImage + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCompressedTextureSubImage] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2iv, .-bluegl_glMultiTexCoord2iv + .size bluegl_glGetCompressedTextureSubImage, .-bluegl_glGetCompressedTextureSubImage .align 2 - .global bluegl_glGetHistogramParameterfvEXT - .type bluegl_glGetHistogramParameterfvEXT, %function -bluegl_glGetHistogramParameterfvEXT: - adrp x16, :got:__blue_glCore_glGetHistogramParameterfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetHistogramParameterfvEXT] + .global bluegl_glGetGraphicsResetStatus + .type bluegl_glGetGraphicsResetStatus, %function +bluegl_glGetGraphicsResetStatus: + adrp x16, :got:__blue_glCore_glGetGraphicsResetStatus + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetGraphicsResetStatus] ldr x16, [x16] br x16 - .size bluegl_glGetHistogramParameterfvEXT, .-bluegl_glGetHistogramParameterfvEXT + .size bluegl_glGetGraphicsResetStatus, .-bluegl_glGetGraphicsResetStatus .align 2 - .global bluegl_glProgramUniform4fvEXT - .type bluegl_glProgramUniform4fvEXT, %function -bluegl_glProgramUniform4fvEXT: - adrp x16, :got:__blue_glCore_glProgramUniform4fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4fvEXT] + .global bluegl_glGetnCompressedTexImage + .type bluegl_glGetnCompressedTexImage, %function +bluegl_glGetnCompressedTexImage: + adrp x16, :got:__blue_glCore_glGetnCompressedTexImage + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnCompressedTexImage] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4fvEXT, .-bluegl_glProgramUniform4fvEXT + .size bluegl_glGetnCompressedTexImage, .-bluegl_glGetnCompressedTexImage .align 2 - .global bluegl_glDetailTexFuncSGIS - .type bluegl_glDetailTexFuncSGIS, %function -bluegl_glDetailTexFuncSGIS: - adrp x16, :got:__blue_glCore_glDetailTexFuncSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glDetailTexFuncSGIS] + .global bluegl_glGetnTexImage + .type bluegl_glGetnTexImage, %function +bluegl_glGetnTexImage: + adrp x16, :got:__blue_glCore_glGetnTexImage + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnTexImage] ldr x16, [x16] br x16 - .size bluegl_glDetailTexFuncSGIS, .-bluegl_glDetailTexFuncSGIS + .size bluegl_glGetnTexImage, .-bluegl_glGetnTexImage .align 2 - .global bluegl_glTexParameterIivEXT - .type bluegl_glTexParameterIivEXT, %function -bluegl_glTexParameterIivEXT: - adrp x16, :got:__blue_glCore_glTexParameterIivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameterIivEXT] + .global bluegl_glGetnUniformdv + .type bluegl_glGetnUniformdv, %function +bluegl_glGetnUniformdv: + adrp x16, :got:__blue_glCore_glGetnUniformdv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformdv] ldr x16, [x16] br x16 - .size bluegl_glTexParameterIivEXT, .-bluegl_glTexParameterIivEXT + .size bluegl_glGetnUniformdv, .-bluegl_glGetnUniformdv .align 2 - .global bluegl_glNamedFramebufferTextureLayerEXT - .type bluegl_glNamedFramebufferTextureLayerEXT, %function -bluegl_glNamedFramebufferTextureLayerEXT: - adrp x16, :got:__blue_glCore_glNamedFramebufferTextureLayerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferTextureLayerEXT] + .global bluegl_glGetnUniformfv + .type bluegl_glGetnUniformfv, %function +bluegl_glGetnUniformfv: + adrp x16, :got:__blue_glCore_glGetnUniformfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformfv] ldr x16, [x16] br x16 - .size bluegl_glNamedFramebufferTextureLayerEXT, .-bluegl_glNamedFramebufferTextureLayerEXT + .size bluegl_glGetnUniformfv, .-bluegl_glGetnUniformfv .align 2 - .global bluegl_glDisablei - .type bluegl_glDisablei, %function -bluegl_glDisablei: - adrp x16, :got:__blue_glCore_glDisablei - ldr x16, [x16, #:got_lo12:__blue_glCore_glDisablei] + .global bluegl_glGetnUniformiv + .type bluegl_glGetnUniformiv, %function +bluegl_glGetnUniformiv: + adrp x16, :got:__blue_glCore_glGetnUniformiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformiv] ldr x16, [x16] br x16 - .size bluegl_glDisablei, .-bluegl_glDisablei + .size bluegl_glGetnUniformiv, .-bluegl_glGetnUniformiv .align 2 - .global bluegl_glUniform4fv - .type bluegl_glUniform4fv, %function -bluegl_glUniform4fv: - adrp x16, :got:__blue_glCore_glUniform4fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4fv] + .global bluegl_glGetnUniformuiv + .type bluegl_glGetnUniformuiv, %function +bluegl_glGetnUniformuiv: + adrp x16, :got:__blue_glCore_glGetnUniformuiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformuiv] ldr x16, [x16] br x16 - .size bluegl_glUniform4fv, .-bluegl_glUniform4fv + .size bluegl_glGetnUniformuiv, .-bluegl_glGetnUniformuiv .align 2 - .global bluegl_glVertexAttrib1hNV - .type bluegl_glVertexAttrib1hNV, %function -bluegl_glVertexAttrib1hNV: - adrp x16, :got:__blue_glCore_glVertexAttrib1hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1hNV] + .global bluegl_glReadnPixels + .type bluegl_glReadnPixels, %function +bluegl_glReadnPixels: + adrp x16, :got:__blue_glCore_glReadnPixels + ldr x16, [x16, #:got_lo12:__blue_glCore_glReadnPixels] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1hNV, .-bluegl_glVertexAttrib1hNV + .size bluegl_glReadnPixels, .-bluegl_glReadnPixels .align 2 - .global bluegl_glWeightsvARB - .type bluegl_glWeightsvARB, %function -bluegl_glWeightsvARB: - adrp x16, :got:__blue_glCore_glWeightsvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightsvARB] + .global bluegl_glTextureBarrier + .type bluegl_glTextureBarrier, %function +bluegl_glTextureBarrier: + adrp x16, :got:__blue_glCore_glTextureBarrier + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureBarrier] ldr x16, [x16] br x16 - .size bluegl_glWeightsvARB, .-bluegl_glWeightsvARB + .size bluegl_glTextureBarrier, .-bluegl_glTextureBarrier .align 2 - .global bluegl_glSampleMaskIndexedNV - .type bluegl_glSampleMaskIndexedNV, %function -bluegl_glSampleMaskIndexedNV: - adrp x16, :got:__blue_glCore_glSampleMaskIndexedNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glSampleMaskIndexedNV] + .global bluegl_glGetTextureHandleARB + .type bluegl_glGetTextureHandleARB, %function +bluegl_glGetTextureHandleARB: + adrp x16, :got:__blue_glCore_glGetTextureHandleARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureHandleARB] ldr x16, [x16] br x16 - .size bluegl_glSampleMaskIndexedNV, .-bluegl_glSampleMaskIndexedNV + .size bluegl_glGetTextureHandleARB, .-bluegl_glGetTextureHandleARB .align 2 - .global bluegl_glVertexAttrib4dvARB - .type bluegl_glVertexAttrib4dvARB, %function -bluegl_glVertexAttrib4dvARB: - adrp x16, :got:__blue_glCore_glVertexAttrib4dvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4dvARB] + .global bluegl_glGetTextureSamplerHandleARB + .type bluegl_glGetTextureSamplerHandleARB, %function +bluegl_glGetTextureSamplerHandleARB: + adrp x16, :got:__blue_glCore_glGetTextureSamplerHandleARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureSamplerHandleARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4dvARB, .-bluegl_glVertexAttrib4dvARB + .size bluegl_glGetTextureSamplerHandleARB, .-bluegl_glGetTextureSamplerHandleARB .align 2 - .global bluegl_glBeginFragmentShaderATI - .type bluegl_glBeginFragmentShaderATI, %function -bluegl_glBeginFragmentShaderATI: - adrp x16, :got:__blue_glCore_glBeginFragmentShaderATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginFragmentShaderATI] + .global bluegl_glMakeTextureHandleResidentARB + .type bluegl_glMakeTextureHandleResidentARB, %function +bluegl_glMakeTextureHandleResidentARB: + adrp x16, :got:__blue_glCore_glMakeTextureHandleResidentARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeTextureHandleResidentARB] ldr x16, [x16] br x16 - .size bluegl_glBeginFragmentShaderATI, .-bluegl_glBeginFragmentShaderATI + .size bluegl_glMakeTextureHandleResidentARB, .-bluegl_glMakeTextureHandleResidentARB .align 2 - .global bluegl_glNamedProgramLocalParameterI4ivEXT - .type bluegl_glNamedProgramLocalParameterI4ivEXT, %function -bluegl_glNamedProgramLocalParameterI4ivEXT: - adrp x16, :got:__blue_glCore_glNamedProgramLocalParameterI4ivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParameterI4ivEXT] + .global bluegl_glMakeTextureHandleNonResidentARB + .type bluegl_glMakeTextureHandleNonResidentARB, %function +bluegl_glMakeTextureHandleNonResidentARB: + adrp x16, :got:__blue_glCore_glMakeTextureHandleNonResidentARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeTextureHandleNonResidentARB] ldr x16, [x16] br x16 - .size bluegl_glNamedProgramLocalParameterI4ivEXT, .-bluegl_glNamedProgramLocalParameterI4ivEXT + .size bluegl_glMakeTextureHandleNonResidentARB, .-bluegl_glMakeTextureHandleNonResidentARB .align 2 - .global bluegl_glGetConvolutionParameteriv - .type bluegl_glGetConvolutionParameteriv, %function -bluegl_glGetConvolutionParameteriv: - adrp x16, :got:__blue_glCore_glGetConvolutionParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetConvolutionParameteriv] + .global bluegl_glGetImageHandleARB + .type bluegl_glGetImageHandleARB, %function +bluegl_glGetImageHandleARB: + adrp x16, :got:__blue_glCore_glGetImageHandleARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetImageHandleARB] ldr x16, [x16] br x16 - .size bluegl_glGetConvolutionParameteriv, .-bluegl_glGetConvolutionParameteriv + .size bluegl_glGetImageHandleARB, .-bluegl_glGetImageHandleARB .align 2 - .global bluegl_glClipControl - .type bluegl_glClipControl, %function -bluegl_glClipControl: - adrp x16, :got:__blue_glCore_glClipControl - ldr x16, [x16, #:got_lo12:__blue_glCore_glClipControl] + .global bluegl_glMakeImageHandleResidentARB + .type bluegl_glMakeImageHandleResidentARB, %function +bluegl_glMakeImageHandleResidentARB: + adrp x16, :got:__blue_glCore_glMakeImageHandleResidentARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeImageHandleResidentARB] ldr x16, [x16] br x16 - .size bluegl_glClipControl, .-bluegl_glClipControl + .size bluegl_glMakeImageHandleResidentARB, .-bluegl_glMakeImageHandleResidentARB .align 2 - .global bluegl_glBinormal3fEXT - .type bluegl_glBinormal3fEXT, %function -bluegl_glBinormal3fEXT: - adrp x16, :got:__blue_glCore_glBinormal3fEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3fEXT] + .global bluegl_glMakeImageHandleNonResidentARB + .type bluegl_glMakeImageHandleNonResidentARB, %function +bluegl_glMakeImageHandleNonResidentARB: + adrp x16, :got:__blue_glCore_glMakeImageHandleNonResidentARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeImageHandleNonResidentARB] ldr x16, [x16] br x16 - .size bluegl_glBinormal3fEXT, .-bluegl_glBinormal3fEXT + .size bluegl_glMakeImageHandleNonResidentARB, .-bluegl_glMakeImageHandleNonResidentARB .align 2 - .global bluegl_glColor4ubVertex2fSUN - .type bluegl_glColor4ubVertex2fSUN, %function -bluegl_glColor4ubVertex2fSUN: - adrp x16, :got:__blue_glCore_glColor4ubVertex2fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4ubVertex2fSUN] + .global bluegl_glUniformHandleui64ARB + .type bluegl_glUniformHandleui64ARB, %function +bluegl_glUniformHandleui64ARB: + adrp x16, :got:__blue_glCore_glUniformHandleui64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformHandleui64ARB] ldr x16, [x16] br x16 - .size bluegl_glColor4ubVertex2fSUN, .-bluegl_glColor4ubVertex2fSUN + .size bluegl_glUniformHandleui64ARB, .-bluegl_glUniformHandleui64ARB .align 2 - .global bluegl_glCompressedTexImage3D - .type bluegl_glCompressedTexImage3D, %function -bluegl_glCompressedTexImage3D: - adrp x16, :got:__blue_glCore_glCompressedTexImage3D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexImage3D] + .global bluegl_glUniformHandleui64vARB + .type bluegl_glUniformHandleui64vARB, %function +bluegl_glUniformHandleui64vARB: + adrp x16, :got:__blue_glCore_glUniformHandleui64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformHandleui64vARB] ldr x16, [x16] br x16 - .size bluegl_glCompressedTexImage3D, .-bluegl_glCompressedTexImage3D + .size bluegl_glUniformHandleui64vARB, .-bluegl_glUniformHandleui64vARB .align 2 - .global bluegl_glGetTextureSamplerHandleARB - .type bluegl_glGetTextureSamplerHandleARB, %function -bluegl_glGetTextureSamplerHandleARB: - adrp x16, :got:__blue_glCore_glGetTextureSamplerHandleARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureSamplerHandleARB] + .global bluegl_glProgramUniformHandleui64ARB + .type bluegl_glProgramUniformHandleui64ARB, %function +bluegl_glProgramUniformHandleui64ARB: + adrp x16, :got:__blue_glCore_glProgramUniformHandleui64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformHandleui64ARB] ldr x16, [x16] br x16 - .size bluegl_glGetTextureSamplerHandleARB, .-bluegl_glGetTextureSamplerHandleARB + .size bluegl_glProgramUniformHandleui64ARB, .-bluegl_glProgramUniformHandleui64ARB .align 2 - .global bluegl_glUniform3uiv - .type bluegl_glUniform3uiv, %function -bluegl_glUniform3uiv: - adrp x16, :got:__blue_glCore_glUniform3uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3uiv] + .global bluegl_glProgramUniformHandleui64vARB + .type bluegl_glProgramUniformHandleui64vARB, %function +bluegl_glProgramUniformHandleui64vARB: + adrp x16, :got:__blue_glCore_glProgramUniformHandleui64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformHandleui64vARB] ldr x16, [x16] br x16 - .size bluegl_glUniform3uiv, .-bluegl_glUniform3uiv + .size bluegl_glProgramUniformHandleui64vARB, .-bluegl_glProgramUniformHandleui64vARB .align 2 - .global bluegl_glGetVertexAttribPointerv - .type bluegl_glGetVertexAttribPointerv, %function -bluegl_glGetVertexAttribPointerv: - adrp x16, :got:__blue_glCore_glGetVertexAttribPointerv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribPointerv] + .global bluegl_glIsTextureHandleResidentARB + .type bluegl_glIsTextureHandleResidentARB, %function +bluegl_glIsTextureHandleResidentARB: + adrp x16, :got:__blue_glCore_glIsTextureHandleResidentARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsTextureHandleResidentARB] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribPointerv, .-bluegl_glGetVertexAttribPointerv + .size bluegl_glIsTextureHandleResidentARB, .-bluegl_glIsTextureHandleResidentARB .align 2 - .global bluegl_glGenBuffers - .type bluegl_glGenBuffers, %function -bluegl_glGenBuffers: - adrp x16, :got:__blue_glCore_glGenBuffers - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenBuffers] + .global bluegl_glIsImageHandleResidentARB + .type bluegl_glIsImageHandleResidentARB, %function +bluegl_glIsImageHandleResidentARB: + adrp x16, :got:__blue_glCore_glIsImageHandleResidentARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsImageHandleResidentARB] ldr x16, [x16] br x16 - .size bluegl_glGenBuffers, .-bluegl_glGenBuffers + .size bluegl_glIsImageHandleResidentARB, .-bluegl_glIsImageHandleResidentARB .align 2 - .global bluegl_glVertexAttrib3dvARB - .type bluegl_glVertexAttrib3dvARB, %function -bluegl_glVertexAttrib3dvARB: - adrp x16, :got:__blue_glCore_glVertexAttrib3dvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3dvARB] + .global bluegl_glVertexAttribL1ui64ARB + .type bluegl_glVertexAttribL1ui64ARB, %function +bluegl_glVertexAttribL1ui64ARB: + adrp x16, :got:__blue_glCore_glVertexAttribL1ui64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1ui64ARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3dvARB, .-bluegl_glVertexAttrib3dvARB + .size bluegl_glVertexAttribL1ui64ARB, .-bluegl_glVertexAttribL1ui64ARB .align 2 - .global bluegl_glFlushVertexArrayRangeNV - .type bluegl_glFlushVertexArrayRangeNV, %function -bluegl_glFlushVertexArrayRangeNV: - adrp x16, :got:__blue_glCore_glFlushVertexArrayRangeNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glFlushVertexArrayRangeNV] + .global bluegl_glVertexAttribL1ui64vARB + .type bluegl_glVertexAttribL1ui64vARB, %function +bluegl_glVertexAttribL1ui64vARB: + adrp x16, :got:__blue_glCore_glVertexAttribL1ui64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1ui64vARB] + ldr x16, [x16] + br x16 + .size bluegl_glVertexAttribL1ui64vARB, .-bluegl_glVertexAttribL1ui64vARB + + .align 2 + .global bluegl_glGetVertexAttribLui64vARB + .type bluegl_glGetVertexAttribLui64vARB, %function +bluegl_glGetVertexAttribLui64vARB: + adrp x16, :got:__blue_glCore_glGetVertexAttribLui64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribLui64vARB] ldr x16, [x16] br x16 - .size bluegl_glFlushVertexArrayRangeNV, .-bluegl_glFlushVertexArrayRangeNV + .size bluegl_glGetVertexAttribLui64vARB, .-bluegl_glGetVertexAttribLui64vARB .align 2 - .global bluegl_glGetProgramNamedParameterdvNV - .type bluegl_glGetProgramNamedParameterdvNV, %function -bluegl_glGetProgramNamedParameterdvNV: - adrp x16, :got:__blue_glCore_glGetProgramNamedParameterdvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramNamedParameterdvNV] + .global bluegl_glCreateSyncFromCLeventARB + .type bluegl_glCreateSyncFromCLeventARB, %function +bluegl_glCreateSyncFromCLeventARB: + adrp x16, :got:__blue_glCore_glCreateSyncFromCLeventARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateSyncFromCLeventARB] ldr x16, [x16] br x16 - .size bluegl_glGetProgramNamedParameterdvNV, .-bluegl_glGetProgramNamedParameterdvNV + .size bluegl_glCreateSyncFromCLeventARB, .-bluegl_glCreateSyncFromCLeventARB .align 2 - .global bluegl_glConvolutionParameterf - .type bluegl_glConvolutionParameterf, %function -bluegl_glConvolutionParameterf: - adrp x16, :got:__blue_glCore_glConvolutionParameterf - ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameterf] + .global bluegl_glDispatchComputeGroupSizeARB + .type bluegl_glDispatchComputeGroupSizeARB, %function +bluegl_glDispatchComputeGroupSizeARB: + adrp x16, :got:__blue_glCore_glDispatchComputeGroupSizeARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glDispatchComputeGroupSizeARB] ldr x16, [x16] br x16 - .size bluegl_glConvolutionParameterf, .-bluegl_glConvolutionParameterf + .size bluegl_glDispatchComputeGroupSizeARB, .-bluegl_glDispatchComputeGroupSizeARB .align 2 - .global bluegl_glVertex2bOES - .type bluegl_glVertex2bOES, %function -bluegl_glVertex2bOES: - adrp x16, :got:__blue_glCore_glVertex2bOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex2bOES] + .global bluegl_glDebugMessageControlARB + .type bluegl_glDebugMessageControlARB, %function +bluegl_glDebugMessageControlARB: + adrp x16, :got:__blue_glCore_glDebugMessageControlARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glDebugMessageControlARB] ldr x16, [x16] br x16 - .size bluegl_glVertex2bOES, .-bluegl_glVertex2bOES + .size bluegl_glDebugMessageControlARB, .-bluegl_glDebugMessageControlARB .align 2 - .global bluegl_glGetObjectPtrLabel - .type bluegl_glGetObjectPtrLabel, %function -bluegl_glGetObjectPtrLabel: - adrp x16, :got:__blue_glCore_glGetObjectPtrLabel - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetObjectPtrLabel] + .global bluegl_glDebugMessageInsertARB + .type bluegl_glDebugMessageInsertARB, %function +bluegl_glDebugMessageInsertARB: + adrp x16, :got:__blue_glCore_glDebugMessageInsertARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glDebugMessageInsertARB] ldr x16, [x16] br x16 - .size bluegl_glGetObjectPtrLabel, .-bluegl_glGetObjectPtrLabel + .size bluegl_glDebugMessageInsertARB, .-bluegl_glDebugMessageInsertARB .align 2 - .global bluegl_glBeginTransformFeedbackNV - .type bluegl_glBeginTransformFeedbackNV, %function -bluegl_glBeginTransformFeedbackNV: - adrp x16, :got:__blue_glCore_glBeginTransformFeedbackNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginTransformFeedbackNV] + .global bluegl_glDebugMessageCallbackARB + .type bluegl_glDebugMessageCallbackARB, %function +bluegl_glDebugMessageCallbackARB: + adrp x16, :got:__blue_glCore_glDebugMessageCallbackARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glDebugMessageCallbackARB] ldr x16, [x16] br x16 - .size bluegl_glBeginTransformFeedbackNV, .-bluegl_glBeginTransformFeedbackNV + .size bluegl_glDebugMessageCallbackARB, .-bluegl_glDebugMessageCallbackARB .align 2 - .global bluegl_glGetTextureSubImage - .type bluegl_glGetTextureSubImage, %function -bluegl_glGetTextureSubImage: - adrp x16, :got:__blue_glCore_glGetTextureSubImage - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureSubImage] + .global bluegl_glGetDebugMessageLogARB + .type bluegl_glGetDebugMessageLogARB, %function +bluegl_glGetDebugMessageLogARB: + adrp x16, :got:__blue_glCore_glGetDebugMessageLogARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetDebugMessageLogARB] ldr x16, [x16] br x16 - .size bluegl_glGetTextureSubImage, .-bluegl_glGetTextureSubImage + .size bluegl_glGetDebugMessageLogARB, .-bluegl_glGetDebugMessageLogARB .align 2 - .global bluegl_glGetFramebufferAttachmentParameterivEXT - .type bluegl_glGetFramebufferAttachmentParameterivEXT, %function -bluegl_glGetFramebufferAttachmentParameterivEXT: - adrp x16, :got:__blue_glCore_glGetFramebufferAttachmentParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFramebufferAttachmentParameterivEXT] + .global bluegl_glBlendEquationiARB + .type bluegl_glBlendEquationiARB, %function +bluegl_glBlendEquationiARB: + adrp x16, :got:__blue_glCore_glBlendEquationiARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquationiARB] ldr x16, [x16] br x16 - .size bluegl_glGetFramebufferAttachmentParameterivEXT, .-bluegl_glGetFramebufferAttachmentParameterivEXT + .size bluegl_glBlendEquationiARB, .-bluegl_glBlendEquationiARB .align 2 - .global bluegl_glGetInteger64v - .type bluegl_glGetInteger64v, %function -bluegl_glGetInteger64v: - adrp x16, :got:__blue_glCore_glGetInteger64v - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInteger64v] + .global bluegl_glBlendEquationSeparateiARB + .type bluegl_glBlendEquationSeparateiARB, %function +bluegl_glBlendEquationSeparateiARB: + adrp x16, :got:__blue_glCore_glBlendEquationSeparateiARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquationSeparateiARB] ldr x16, [x16] br x16 - .size bluegl_glGetInteger64v, .-bluegl_glGetInteger64v + .size bluegl_glBlendEquationSeparateiARB, .-bluegl_glBlendEquationSeparateiARB .align 2 - .global bluegl_glGetUniformLocation - .type bluegl_glGetUniformLocation, %function -bluegl_glGetUniformLocation: - adrp x16, :got:__blue_glCore_glGetUniformLocation - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformLocation] + .global bluegl_glBlendFunciARB + .type bluegl_glBlendFunciARB, %function +bluegl_glBlendFunciARB: + adrp x16, :got:__blue_glCore_glBlendFunciARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFunciARB] ldr x16, [x16] br x16 - .size bluegl_glGetUniformLocation, .-bluegl_glGetUniformLocation + .size bluegl_glBlendFunciARB, .-bluegl_glBlendFunciARB .align 2 - .global bluegl_glMultiTexCoord2fv - .type bluegl_glMultiTexCoord2fv, %function -bluegl_glMultiTexCoord2fv: - adrp x16, :got:__blue_glCore_glMultiTexCoord2fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2fv] + .global bluegl_glBlendFuncSeparateiARB + .type bluegl_glBlendFuncSeparateiARB, %function +bluegl_glBlendFuncSeparateiARB: + adrp x16, :got:__blue_glCore_glBlendFuncSeparateiARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFuncSeparateiARB] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2fv, .-bluegl_glMultiTexCoord2fv + .size bluegl_glBlendFuncSeparateiARB, .-bluegl_glBlendFuncSeparateiARB .align 2 - .global bluegl_glProgramUniform2uiv - .type bluegl_glProgramUniform2uiv, %function -bluegl_glProgramUniform2uiv: - adrp x16, :got:__blue_glCore_glProgramUniform2uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2uiv] + .global bluegl_glMultiDrawArraysIndirectCountARB + .type bluegl_glMultiDrawArraysIndirectCountARB, %function +bluegl_glMultiDrawArraysIndirectCountARB: + adrp x16, :got:__blue_glCore_glMultiDrawArraysIndirectCountARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawArraysIndirectCountARB] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2uiv, .-bluegl_glProgramUniform2uiv + .size bluegl_glMultiDrawArraysIndirectCountARB, .-bluegl_glMultiDrawArraysIndirectCountARB .align 2 - .global bluegl_glGetTexParameterIuiv - .type bluegl_glGetTexParameterIuiv, %function -bluegl_glGetTexParameterIuiv: - adrp x16, :got:__blue_glCore_glGetTexParameterIuiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexParameterIuiv] + .global bluegl_glMultiDrawElementsIndirectCountARB + .type bluegl_glMultiDrawElementsIndirectCountARB, %function +bluegl_glMultiDrawElementsIndirectCountARB: + adrp x16, :got:__blue_glCore_glMultiDrawElementsIndirectCountARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawElementsIndirectCountARB] ldr x16, [x16] br x16 - .size bluegl_glGetTexParameterIuiv, .-bluegl_glGetTexParameterIuiv + .size bluegl_glMultiDrawElementsIndirectCountARB, .-bluegl_glMultiDrawElementsIndirectCountARB .align 2 - .global bluegl_glVertexAttribI4ui - .type bluegl_glVertexAttribI4ui, %function -bluegl_glVertexAttribI4ui: - adrp x16, :got:__blue_glCore_glVertexAttribI4ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4ui] + .global bluegl_glGetGraphicsResetStatusARB + .type bluegl_glGetGraphicsResetStatusARB, %function +bluegl_glGetGraphicsResetStatusARB: + adrp x16, :got:__blue_glCore_glGetGraphicsResetStatusARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetGraphicsResetStatusARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI4ui, .-bluegl_glVertexAttribI4ui + .size bluegl_glGetGraphicsResetStatusARB, .-bluegl_glGetGraphicsResetStatusARB .align 2 - .global bluegl_glTexGenxvOES - .type bluegl_glTexGenxvOES, %function -bluegl_glTexGenxvOES: - adrp x16, :got:__blue_glCore_glTexGenxvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexGenxvOES] + .global bluegl_glGetnTexImageARB + .type bluegl_glGetnTexImageARB, %function +bluegl_glGetnTexImageARB: + adrp x16, :got:__blue_glCore_glGetnTexImageARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnTexImageARB] ldr x16, [x16] br x16 - .size bluegl_glTexGenxvOES, .-bluegl_glTexGenxvOES + .size bluegl_glGetnTexImageARB, .-bluegl_glGetnTexImageARB .align 2 - .global bluegl_glVertex4bOES - .type bluegl_glVertex4bOES, %function -bluegl_glVertex4bOES: - adrp x16, :got:__blue_glCore_glVertex4bOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex4bOES] + .global bluegl_glReadnPixelsARB + .type bluegl_glReadnPixelsARB, %function +bluegl_glReadnPixelsARB: + adrp x16, :got:__blue_glCore_glReadnPixelsARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glReadnPixelsARB] ldr x16, [x16] br x16 - .size bluegl_glVertex4bOES, .-bluegl_glVertex4bOES + .size bluegl_glReadnPixelsARB, .-bluegl_glReadnPixelsARB .align 2 - .global bluegl_glCopyTexSubImage2DEXT - .type bluegl_glCopyTexSubImage2DEXT, %function -bluegl_glCopyTexSubImage2DEXT: - adrp x16, :got:__blue_glCore_glCopyTexSubImage2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexSubImage2DEXT] + .global bluegl_glGetnCompressedTexImageARB + .type bluegl_glGetnCompressedTexImageARB, %function +bluegl_glGetnCompressedTexImageARB: + adrp x16, :got:__blue_glCore_glGetnCompressedTexImageARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnCompressedTexImageARB] ldr x16, [x16] br x16 - .size bluegl_glCopyTexSubImage2DEXT, .-bluegl_glCopyTexSubImage2DEXT + .size bluegl_glGetnCompressedTexImageARB, .-bluegl_glGetnCompressedTexImageARB .align 2 - .global bluegl_glDrawBuffersATI - .type bluegl_glDrawBuffersATI, %function -bluegl_glDrawBuffersATI: - adrp x16, :got:__blue_glCore_glDrawBuffersATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawBuffersATI] + .global bluegl_glGetnUniformfvARB + .type bluegl_glGetnUniformfvARB, %function +bluegl_glGetnUniformfvARB: + adrp x16, :got:__blue_glCore_glGetnUniformfvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformfvARB] ldr x16, [x16] br x16 - .size bluegl_glDrawBuffersATI, .-bluegl_glDrawBuffersATI + .size bluegl_glGetnUniformfvARB, .-bluegl_glGetnUniformfvARB .align 2 - .global bluegl_glPathGlyphsNV - .type bluegl_glPathGlyphsNV, %function -bluegl_glPathGlyphsNV: - adrp x16, :got:__blue_glCore_glPathGlyphsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathGlyphsNV] + .global bluegl_glGetnUniformivARB + .type bluegl_glGetnUniformivARB, %function +bluegl_glGetnUniformivARB: + adrp x16, :got:__blue_glCore_glGetnUniformivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformivARB] ldr x16, [x16] br x16 - .size bluegl_glPathGlyphsNV, .-bluegl_glPathGlyphsNV + .size bluegl_glGetnUniformivARB, .-bluegl_glGetnUniformivARB .align 2 - .global bluegl_glMatrixIndexuivARB - .type bluegl_glMatrixIndexuivARB, %function -bluegl_glMatrixIndexuivARB: - adrp x16, :got:__blue_glCore_glMatrixIndexuivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixIndexuivARB] + .global bluegl_glGetnUniformuivARB + .type bluegl_glGetnUniformuivARB, %function +bluegl_glGetnUniformuivARB: + adrp x16, :got:__blue_glCore_glGetnUniformuivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformuivARB] ldr x16, [x16] br x16 - .size bluegl_glMatrixIndexuivARB, .-bluegl_glMatrixIndexuivARB + .size bluegl_glGetnUniformuivARB, .-bluegl_glGetnUniformuivARB .align 2 - .global bluegl_glNamedProgramLocalParameterI4uiEXT - .type bluegl_glNamedProgramLocalParameterI4uiEXT, %function -bluegl_glNamedProgramLocalParameterI4uiEXT: - adrp x16, :got:__blue_glCore_glNamedProgramLocalParameterI4uiEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParameterI4uiEXT] + .global bluegl_glGetnUniformdvARB + .type bluegl_glGetnUniformdvARB, %function +bluegl_glGetnUniformdvARB: + adrp x16, :got:__blue_glCore_glGetnUniformdvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformdvARB] ldr x16, [x16] br x16 - .size bluegl_glNamedProgramLocalParameterI4uiEXT, .-bluegl_glNamedProgramLocalParameterI4uiEXT + .size bluegl_glGetnUniformdvARB, .-bluegl_glGetnUniformdvARB .align 2 - .global bluegl_glWindowPos2iv - .type bluegl_glWindowPos2iv, %function -bluegl_glWindowPos2iv: - adrp x16, :got:__blue_glCore_glWindowPos2iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2iv] + .global bluegl_glMinSampleShadingARB + .type bluegl_glMinSampleShadingARB, %function +bluegl_glMinSampleShadingARB: + adrp x16, :got:__blue_glCore_glMinSampleShadingARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMinSampleShadingARB] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2iv, .-bluegl_glWindowPos2iv + .size bluegl_glMinSampleShadingARB, .-bluegl_glMinSampleShadingARB .align 2 - .global bluegl_glLightModelxOES - .type bluegl_glLightModelxOES, %function -bluegl_glLightModelxOES: - adrp x16, :got:__blue_glCore_glLightModelxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glLightModelxOES] + .global bluegl_glNamedStringARB + .type bluegl_glNamedStringARB, %function +bluegl_glNamedStringARB: + adrp x16, :got:__blue_glCore_glNamedStringARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedStringARB] ldr x16, [x16] br x16 - .size bluegl_glLightModelxOES, .-bluegl_glLightModelxOES + .size bluegl_glNamedStringARB, .-bluegl_glNamedStringARB .align 2 - .global bluegl_glBindFragmentShaderATI - .type bluegl_glBindFragmentShaderATI, %function -bluegl_glBindFragmentShaderATI: - adrp x16, :got:__blue_glCore_glBindFragmentShaderATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindFragmentShaderATI] + .global bluegl_glDeleteNamedStringARB + .type bluegl_glDeleteNamedStringARB, %function +bluegl_glDeleteNamedStringARB: + adrp x16, :got:__blue_glCore_glDeleteNamedStringARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteNamedStringARB] ldr x16, [x16] br x16 - .size bluegl_glBindFragmentShaderATI, .-bluegl_glBindFragmentShaderATI + .size bluegl_glDeleteNamedStringARB, .-bluegl_glDeleteNamedStringARB .align 2 - .global bluegl_glInvalidateTexSubImage - .type bluegl_glInvalidateTexSubImage, %function -bluegl_glInvalidateTexSubImage: - adrp x16, :got:__blue_glCore_glInvalidateTexSubImage - ldr x16, [x16, #:got_lo12:__blue_glCore_glInvalidateTexSubImage] + .global bluegl_glCompileShaderIncludeARB + .type bluegl_glCompileShaderIncludeARB, %function +bluegl_glCompileShaderIncludeARB: + adrp x16, :got:__blue_glCore_glCompileShaderIncludeARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompileShaderIncludeARB] ldr x16, [x16] br x16 - .size bluegl_glInvalidateTexSubImage, .-bluegl_glInvalidateTexSubImage + .size bluegl_glCompileShaderIncludeARB, .-bluegl_glCompileShaderIncludeARB .align 2 - .global bluegl_glVertexAttrib4sARB - .type bluegl_glVertexAttrib4sARB, %function -bluegl_glVertexAttrib4sARB: - adrp x16, :got:__blue_glCore_glVertexAttrib4sARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4sARB] + .global bluegl_glIsNamedStringARB + .type bluegl_glIsNamedStringARB, %function +bluegl_glIsNamedStringARB: + adrp x16, :got:__blue_glCore_glIsNamedStringARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsNamedStringARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4sARB, .-bluegl_glVertexAttrib4sARB + .size bluegl_glIsNamedStringARB, .-bluegl_glIsNamedStringARB .align 2 - .global bluegl_glGetProgramiv - .type bluegl_glGetProgramiv, %function -bluegl_glGetProgramiv: - adrp x16, :got:__blue_glCore_glGetProgramiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramiv] + .global bluegl_glGetNamedStringARB + .type bluegl_glGetNamedStringARB, %function +bluegl_glGetNamedStringARB: + adrp x16, :got:__blue_glCore_glGetNamedStringARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedStringARB] ldr x16, [x16] br x16 - .size bluegl_glGetProgramiv, .-bluegl_glGetProgramiv + .size bluegl_glGetNamedStringARB, .-bluegl_glGetNamedStringARB .align 2 - .global bluegl_glGetVideoCaptureStreamivNV - .type bluegl_glGetVideoCaptureStreamivNV, %function -bluegl_glGetVideoCaptureStreamivNV: - adrp x16, :got:__blue_glCore_glGetVideoCaptureStreamivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVideoCaptureStreamivNV] + .global bluegl_glGetNamedStringivARB + .type bluegl_glGetNamedStringivARB, %function +bluegl_glGetNamedStringivARB: + adrp x16, :got:__blue_glCore_glGetNamedStringivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedStringivARB] ldr x16, [x16] br x16 - .size bluegl_glGetVideoCaptureStreamivNV, .-bluegl_glGetVideoCaptureStreamivNV + .size bluegl_glGetNamedStringivARB, .-bluegl_glGetNamedStringivARB .align 2 - .global bluegl_glTextureParameterfvEXT - .type bluegl_glTextureParameterfvEXT, %function -bluegl_glTextureParameterfvEXT: - adrp x16, :got:__blue_glCore_glTextureParameterfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameterfvEXT] + .global bluegl_glBufferPageCommitmentARB + .type bluegl_glBufferPageCommitmentARB, %function +bluegl_glBufferPageCommitmentARB: + adrp x16, :got:__blue_glCore_glBufferPageCommitmentARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glBufferPageCommitmentARB] ldr x16, [x16] br x16 - .size bluegl_glTextureParameterfvEXT, .-bluegl_glTextureParameterfvEXT + .size bluegl_glBufferPageCommitmentARB, .-bluegl_glBufferPageCommitmentARB .align 2 - .global bluegl_glPNTrianglesfATI - .type bluegl_glPNTrianglesfATI, %function -bluegl_glPNTrianglesfATI: - adrp x16, :got:__blue_glCore_glPNTrianglesfATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glPNTrianglesfATI] + .global bluegl_glNamedBufferPageCommitmentEXT + .type bluegl_glNamedBufferPageCommitmentEXT, %function +bluegl_glNamedBufferPageCommitmentEXT: + adrp x16, :got:__blue_glCore_glNamedBufferPageCommitmentEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedBufferPageCommitmentEXT] ldr x16, [x16] br x16 - .size bluegl_glPNTrianglesfATI, .-bluegl_glPNTrianglesfATI + .size bluegl_glNamedBufferPageCommitmentEXT, .-bluegl_glNamedBufferPageCommitmentEXT .align 2 - .global bluegl_glCheckNamedFramebufferStatus - .type bluegl_glCheckNamedFramebufferStatus, %function -bluegl_glCheckNamedFramebufferStatus: - adrp x16, :got:__blue_glCore_glCheckNamedFramebufferStatus - ldr x16, [x16, #:got_lo12:__blue_glCore_glCheckNamedFramebufferStatus] + .global bluegl_glNamedBufferPageCommitmentARB + .type bluegl_glNamedBufferPageCommitmentARB, %function +bluegl_glNamedBufferPageCommitmentARB: + adrp x16, :got:__blue_glCore_glNamedBufferPageCommitmentARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedBufferPageCommitmentARB] ldr x16, [x16] br x16 - .size bluegl_glCheckNamedFramebufferStatus, .-bluegl_glCheckNamedFramebufferStatus + .size bluegl_glNamedBufferPageCommitmentARB, .-bluegl_glNamedBufferPageCommitmentARB .align 2 - .global bluegl_glUniform4uiEXT - .type bluegl_glUniform4uiEXT, %function -bluegl_glUniform4uiEXT: - adrp x16, :got:__blue_glCore_glUniform4uiEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4uiEXT] + .global bluegl_glTexPageCommitmentARB + .type bluegl_glTexPageCommitmentARB, %function +bluegl_glTexPageCommitmentARB: + adrp x16, :got:__blue_glCore_glTexPageCommitmentARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexPageCommitmentARB] ldr x16, [x16] br x16 - .size bluegl_glUniform4uiEXT, .-bluegl_glUniform4uiEXT + .size bluegl_glTexPageCommitmentARB, .-bluegl_glTexPageCommitmentARB .align 2 - .global bluegl_glVertexAttrib2sv - .type bluegl_glVertexAttrib2sv, %function -bluegl_glVertexAttrib2sv: - adrp x16, :got:__blue_glCore_glVertexAttrib2sv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2sv] + .global bluegl_glClientActiveTexture + .type bluegl_glClientActiveTexture, %function +bluegl_glClientActiveTexture: + adrp x16, :got:__blue_glCore_glClientActiveTexture + ldr x16, [x16, #:got_lo12:__blue_glCore_glClientActiveTexture] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2sv, .-bluegl_glVertexAttrib2sv + .size bluegl_glClientActiveTexture, .-bluegl_glClientActiveTexture .align 2 - .global bluegl_glClearBufferData - .type bluegl_glClearBufferData, %function -bluegl_glClearBufferData: - adrp x16, :got:__blue_glCore_glClearBufferData - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearBufferData] + .global bluegl_glMultiTexCoord1d + .type bluegl_glMultiTexCoord1d, %function +bluegl_glMultiTexCoord1d: + adrp x16, :got:__blue_glCore_glMultiTexCoord1d + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1d] ldr x16, [x16] br x16 - .size bluegl_glClearBufferData, .-bluegl_glClearBufferData + .size bluegl_glMultiTexCoord1d, .-bluegl_glMultiTexCoord1d .align 2 - .global bluegl_glShaderSourceARB - .type bluegl_glShaderSourceARB, %function -bluegl_glShaderSourceARB: - adrp x16, :got:__blue_glCore_glShaderSourceARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glShaderSourceARB] + .global bluegl_glMultiTexCoord1dv + .type bluegl_glMultiTexCoord1dv, %function +bluegl_glMultiTexCoord1dv: + adrp x16, :got:__blue_glCore_glMultiTexCoord1dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1dv] ldr x16, [x16] br x16 - .size bluegl_glShaderSourceARB, .-bluegl_glShaderSourceARB + .size bluegl_glMultiTexCoord1dv, .-bluegl_glMultiTexCoord1dv .align 2 - .global bluegl_glObjectPurgeableAPPLE - .type bluegl_glObjectPurgeableAPPLE, %function -bluegl_glObjectPurgeableAPPLE: - adrp x16, :got:__blue_glCore_glObjectPurgeableAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glObjectPurgeableAPPLE] + .global bluegl_glMultiTexCoord1f + .type bluegl_glMultiTexCoord1f, %function +bluegl_glMultiTexCoord1f: + adrp x16, :got:__blue_glCore_glMultiTexCoord1f + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1f] ldr x16, [x16] br x16 - .size bluegl_glObjectPurgeableAPPLE, .-bluegl_glObjectPurgeableAPPLE + .size bluegl_glMultiTexCoord1f, .-bluegl_glMultiTexCoord1f .align 2 - .global bluegl_glProgramUniform2iEXT - .type bluegl_glProgramUniform2iEXT, %function -bluegl_glProgramUniform2iEXT: - adrp x16, :got:__blue_glCore_glProgramUniform2iEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2iEXT] + .global bluegl_glMultiTexCoord1fv + .type bluegl_glMultiTexCoord1fv, %function +bluegl_glMultiTexCoord1fv: + adrp x16, :got:__blue_glCore_glMultiTexCoord1fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1fv] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2iEXT, .-bluegl_glProgramUniform2iEXT + .size bluegl_glMultiTexCoord1fv, .-bluegl_glMultiTexCoord1fv .align 2 - .global bluegl_glGetStringi - .type bluegl_glGetStringi, %function -bluegl_glGetStringi: - adrp x16, :got:__blue_glCore_glGetStringi - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetStringi] + .global bluegl_glMultiTexCoord1i + .type bluegl_glMultiTexCoord1i, %function +bluegl_glMultiTexCoord1i: + adrp x16, :got:__blue_glCore_glMultiTexCoord1i + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1i] ldr x16, [x16] br x16 - .size bluegl_glGetStringi, .-bluegl_glGetStringi + .size bluegl_glMultiTexCoord1i, .-bluegl_glMultiTexCoord1i .align 2 - .global bluegl_glTexFilterFuncSGIS - .type bluegl_glTexFilterFuncSGIS, %function -bluegl_glTexFilterFuncSGIS: - adrp x16, :got:__blue_glCore_glTexFilterFuncSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexFilterFuncSGIS] + .global bluegl_glMultiTexCoord1iv + .type bluegl_glMultiTexCoord1iv, %function +bluegl_glMultiTexCoord1iv: + adrp x16, :got:__blue_glCore_glMultiTexCoord1iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1iv] ldr x16, [x16] br x16 - .size bluegl_glTexFilterFuncSGIS, .-bluegl_glTexFilterFuncSGIS + .size bluegl_glMultiTexCoord1iv, .-bluegl_glMultiTexCoord1iv .align 2 - .global bluegl_glVertexArrayVertexAttribLOffsetEXT - .type bluegl_glVertexArrayVertexAttribLOffsetEXT, %function -bluegl_glVertexArrayVertexAttribLOffsetEXT: - adrp x16, :got:__blue_glCore_glVertexArrayVertexAttribLOffsetEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexAttribLOffsetEXT] + .global bluegl_glMultiTexCoord1s + .type bluegl_glMultiTexCoord1s, %function +bluegl_glMultiTexCoord1s: + adrp x16, :got:__blue_glCore_glMultiTexCoord1s + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1s] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayVertexAttribLOffsetEXT, .-bluegl_glVertexArrayVertexAttribLOffsetEXT + .size bluegl_glMultiTexCoord1s, .-bluegl_glMultiTexCoord1s .align 2 - .global bluegl_glProgramLocalParametersI4uivNV - .type bluegl_glProgramLocalParametersI4uivNV, %function -bluegl_glProgramLocalParametersI4uivNV: - adrp x16, :got:__blue_glCore_glProgramLocalParametersI4uivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParametersI4uivNV] + .global bluegl_glMultiTexCoord1sv + .type bluegl_glMultiTexCoord1sv, %function +bluegl_glMultiTexCoord1sv: + adrp x16, :got:__blue_glCore_glMultiTexCoord1sv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1sv] ldr x16, [x16] br x16 - .size bluegl_glProgramLocalParametersI4uivNV, .-bluegl_glProgramLocalParametersI4uivNV + .size bluegl_glMultiTexCoord1sv, .-bluegl_glMultiTexCoord1sv .align 2 - .global bluegl_glGetHistogramEXT - .type bluegl_glGetHistogramEXT, %function -bluegl_glGetHistogramEXT: - adrp x16, :got:__blue_glCore_glGetHistogramEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetHistogramEXT] + .global bluegl_glMultiTexCoord2d + .type bluegl_glMultiTexCoord2d, %function +bluegl_glMultiTexCoord2d: + adrp x16, :got:__blue_glCore_glMultiTexCoord2d + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2d] ldr x16, [x16] br x16 - .size bluegl_glGetHistogramEXT, .-bluegl_glGetHistogramEXT + .size bluegl_glMultiTexCoord2d, .-bluegl_glMultiTexCoord2d .align 2 - .global bluegl_glNamedBufferPageCommitmentARB - .type bluegl_glNamedBufferPageCommitmentARB, %function -bluegl_glNamedBufferPageCommitmentARB: - adrp x16, :got:__blue_glCore_glNamedBufferPageCommitmentARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedBufferPageCommitmentARB] + .global bluegl_glMultiTexCoord2dv + .type bluegl_glMultiTexCoord2dv, %function +bluegl_glMultiTexCoord2dv: + adrp x16, :got:__blue_glCore_glMultiTexCoord2dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2dv] + ldr x16, [x16] + br x16 + .size bluegl_glMultiTexCoord2dv, .-bluegl_glMultiTexCoord2dv + + .align 2 + .global bluegl_glMultiTexCoord2f + .type bluegl_glMultiTexCoord2f, %function +bluegl_glMultiTexCoord2f: + adrp x16, :got:__blue_glCore_glMultiTexCoord2f + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2f] ldr x16, [x16] br x16 - .size bluegl_glNamedBufferPageCommitmentARB, .-bluegl_glNamedBufferPageCommitmentARB + .size bluegl_glMultiTexCoord2f, .-bluegl_glMultiTexCoord2f .align 2 - .global bluegl_glMakeBufferResidentNV - .type bluegl_glMakeBufferResidentNV, %function -bluegl_glMakeBufferResidentNV: - adrp x16, :got:__blue_glCore_glMakeBufferResidentNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeBufferResidentNV] + .global bluegl_glMultiTexCoord2fv + .type bluegl_glMultiTexCoord2fv, %function +bluegl_glMultiTexCoord2fv: + adrp x16, :got:__blue_glCore_glMultiTexCoord2fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2fv] ldr x16, [x16] br x16 - .size bluegl_glMakeBufferResidentNV, .-bluegl_glMakeBufferResidentNV + .size bluegl_glMultiTexCoord2fv, .-bluegl_glMultiTexCoord2fv .align 2 - .global bluegl_glNamedFramebufferDrawBuffers - .type bluegl_glNamedFramebufferDrawBuffers, %function -bluegl_glNamedFramebufferDrawBuffers: - adrp x16, :got:__blue_glCore_glNamedFramebufferDrawBuffers - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferDrawBuffers] + .global bluegl_glMultiTexCoord2i + .type bluegl_glMultiTexCoord2i, %function +bluegl_glMultiTexCoord2i: + adrp x16, :got:__blue_glCore_glMultiTexCoord2i + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2i] ldr x16, [x16] br x16 - .size bluegl_glNamedFramebufferDrawBuffers, .-bluegl_glNamedFramebufferDrawBuffers + .size bluegl_glMultiTexCoord2i, .-bluegl_glMultiTexCoord2i .align 2 - .global bluegl_glVertexPointerListIBM - .type bluegl_glVertexPointerListIBM, %function -bluegl_glVertexPointerListIBM: - adrp x16, :got:__blue_glCore_glVertexPointerListIBM - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexPointerListIBM] + .global bluegl_glMultiTexCoord2iv + .type bluegl_glMultiTexCoord2iv, %function +bluegl_glMultiTexCoord2iv: + adrp x16, :got:__blue_glCore_glMultiTexCoord2iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2iv] ldr x16, [x16] br x16 - .size bluegl_glVertexPointerListIBM, .-bluegl_glVertexPointerListIBM + .size bluegl_glMultiTexCoord2iv, .-bluegl_glMultiTexCoord2iv .align 2 - .global bluegl_glGetUniformui64vNV - .type bluegl_glGetUniformui64vNV, %function -bluegl_glGetUniformui64vNV: - adrp x16, :got:__blue_glCore_glGetUniformui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformui64vNV] + .global bluegl_glMultiTexCoord2s + .type bluegl_glMultiTexCoord2s, %function +bluegl_glMultiTexCoord2s: + adrp x16, :got:__blue_glCore_glMultiTexCoord2s + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2s] ldr x16, [x16] br x16 - .size bluegl_glGetUniformui64vNV, .-bluegl_glGetUniformui64vNV + .size bluegl_glMultiTexCoord2s, .-bluegl_glMultiTexCoord2s .align 2 - .global bluegl_glClearDepthfOES - .type bluegl_glClearDepthfOES, %function -bluegl_glClearDepthfOES: - adrp x16, :got:__blue_glCore_glClearDepthfOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearDepthfOES] + .global bluegl_glMultiTexCoord2sv + .type bluegl_glMultiTexCoord2sv, %function +bluegl_glMultiTexCoord2sv: + adrp x16, :got:__blue_glCore_glMultiTexCoord2sv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2sv] ldr x16, [x16] br x16 - .size bluegl_glClearDepthfOES, .-bluegl_glClearDepthfOES + .size bluegl_glMultiTexCoord2sv, .-bluegl_glMultiTexCoord2sv .align 2 - .global bluegl_glWindowPos2iMESA - .type bluegl_glWindowPos2iMESA, %function -bluegl_glWindowPos2iMESA: - adrp x16, :got:__blue_glCore_glWindowPos2iMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2iMESA] + .global bluegl_glMultiTexCoord3d + .type bluegl_glMultiTexCoord3d, %function +bluegl_glMultiTexCoord3d: + adrp x16, :got:__blue_glCore_glMultiTexCoord3d + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3d] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2iMESA, .-bluegl_glWindowPos2iMESA + .size bluegl_glMultiTexCoord3d, .-bluegl_glMultiTexCoord3d .align 2 - .global bluegl_glCopyTextureImage1DEXT - .type bluegl_glCopyTextureImage1DEXT, %function -bluegl_glCopyTextureImage1DEXT: - adrp x16, :got:__blue_glCore_glCopyTextureImage1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTextureImage1DEXT] + .global bluegl_glMultiTexCoord3dv + .type bluegl_glMultiTexCoord3dv, %function +bluegl_glMultiTexCoord3dv: + adrp x16, :got:__blue_glCore_glMultiTexCoord3dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3dv] ldr x16, [x16] br x16 - .size bluegl_glCopyTextureImage1DEXT, .-bluegl_glCopyTextureImage1DEXT + .size bluegl_glMultiTexCoord3dv, .-bluegl_glMultiTexCoord3dv .align 2 - .global bluegl_glBeginOcclusionQueryNV - .type bluegl_glBeginOcclusionQueryNV, %function -bluegl_glBeginOcclusionQueryNV: - adrp x16, :got:__blue_glCore_glBeginOcclusionQueryNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginOcclusionQueryNV] + .global bluegl_glMultiTexCoord3f + .type bluegl_glMultiTexCoord3f, %function +bluegl_glMultiTexCoord3f: + adrp x16, :got:__blue_glCore_glMultiTexCoord3f + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3f] ldr x16, [x16] br x16 - .size bluegl_glBeginOcclusionQueryNV, .-bluegl_glBeginOcclusionQueryNV + .size bluegl_glMultiTexCoord3f, .-bluegl_glMultiTexCoord3f .align 2 - .global bluegl_glLoadTransposeMatrixf - .type bluegl_glLoadTransposeMatrixf, %function -bluegl_glLoadTransposeMatrixf: - adrp x16, :got:__blue_glCore_glLoadTransposeMatrixf - ldr x16, [x16, #:got_lo12:__blue_glCore_glLoadTransposeMatrixf] + .global bluegl_glMultiTexCoord3fv + .type bluegl_glMultiTexCoord3fv, %function +bluegl_glMultiTexCoord3fv: + adrp x16, :got:__blue_glCore_glMultiTexCoord3fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3fv] ldr x16, [x16] br x16 - .size bluegl_glLoadTransposeMatrixf, .-bluegl_glLoadTransposeMatrixf + .size bluegl_glMultiTexCoord3fv, .-bluegl_glMultiTexCoord3fv .align 2 - .global bluegl_glNamedRenderbufferStorageMultisampleEXT - .type bluegl_glNamedRenderbufferStorageMultisampleEXT, %function -bluegl_glNamedRenderbufferStorageMultisampleEXT: - adrp x16, :got:__blue_glCore_glNamedRenderbufferStorageMultisampleEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedRenderbufferStorageMultisampleEXT] + .global bluegl_glMultiTexCoord3i + .type bluegl_glMultiTexCoord3i, %function +bluegl_glMultiTexCoord3i: + adrp x16, :got:__blue_glCore_glMultiTexCoord3i + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3i] ldr x16, [x16] br x16 - .size bluegl_glNamedRenderbufferStorageMultisampleEXT, .-bluegl_glNamedRenderbufferStorageMultisampleEXT + .size bluegl_glMultiTexCoord3i, .-bluegl_glMultiTexCoord3i .align 2 - .global bluegl_glNormalStream3fATI - .type bluegl_glNormalStream3fATI, %function -bluegl_glNormalStream3fATI: - adrp x16, :got:__blue_glCore_glNormalStream3fATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3fATI] + .global bluegl_glMultiTexCoord3iv + .type bluegl_glMultiTexCoord3iv, %function +bluegl_glMultiTexCoord3iv: + adrp x16, :got:__blue_glCore_glMultiTexCoord3iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3iv] ldr x16, [x16] br x16 - .size bluegl_glNormalStream3fATI, .-bluegl_glNormalStream3fATI + .size bluegl_glMultiTexCoord3iv, .-bluegl_glMultiTexCoord3iv .align 2 - .global bluegl_glNormal3hNV - .type bluegl_glNormal3hNV, %function -bluegl_glNormal3hNV: - adrp x16, :got:__blue_glCore_glNormal3hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormal3hNV] + .global bluegl_glMultiTexCoord3s + .type bluegl_glMultiTexCoord3s, %function +bluegl_glMultiTexCoord3s: + adrp x16, :got:__blue_glCore_glMultiTexCoord3s + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3s] ldr x16, [x16] br x16 - .size bluegl_glNormal3hNV, .-bluegl_glNormal3hNV + .size bluegl_glMultiTexCoord3s, .-bluegl_glMultiTexCoord3s .align 2 - .global bluegl_glUseProgram - .type bluegl_glUseProgram, %function -bluegl_glUseProgram: - adrp x16, :got:__blue_glCore_glUseProgram - ldr x16, [x16, #:got_lo12:__blue_glCore_glUseProgram] + .global bluegl_glMultiTexCoord3sv + .type bluegl_glMultiTexCoord3sv, %function +bluegl_glMultiTexCoord3sv: + adrp x16, :got:__blue_glCore_glMultiTexCoord3sv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3sv] ldr x16, [x16] br x16 - .size bluegl_glUseProgram, .-bluegl_glUseProgram + .size bluegl_glMultiTexCoord3sv, .-bluegl_glMultiTexCoord3sv .align 2 - .global bluegl_glPushGroupMarkerEXT - .type bluegl_glPushGroupMarkerEXT, %function -bluegl_glPushGroupMarkerEXT: - adrp x16, :got:__blue_glCore_glPushGroupMarkerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glPushGroupMarkerEXT] + .global bluegl_glMultiTexCoord4d + .type bluegl_glMultiTexCoord4d, %function +bluegl_glMultiTexCoord4d: + adrp x16, :got:__blue_glCore_glMultiTexCoord4d + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4d] ldr x16, [x16] br x16 - .size bluegl_glPushGroupMarkerEXT, .-bluegl_glPushGroupMarkerEXT + .size bluegl_glMultiTexCoord4d, .-bluegl_glMultiTexCoord4d .align 2 - .global bluegl_glMultiTexSubImage2DEXT - .type bluegl_glMultiTexSubImage2DEXT, %function -bluegl_glMultiTexSubImage2DEXT: - adrp x16, :got:__blue_glCore_glMultiTexSubImage2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexSubImage2DEXT] + .global bluegl_glMultiTexCoord4dv + .type bluegl_glMultiTexCoord4dv, %function +bluegl_glMultiTexCoord4dv: + adrp x16, :got:__blue_glCore_glMultiTexCoord4dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4dv] ldr x16, [x16] br x16 - .size bluegl_glMultiTexSubImage2DEXT, .-bluegl_glMultiTexSubImage2DEXT + .size bluegl_glMultiTexCoord4dv, .-bluegl_glMultiTexCoord4dv .align 2 - .global bluegl_glVertexArrayRangeNV - .type bluegl_glVertexArrayRangeNV, %function -bluegl_glVertexArrayRangeNV: - adrp x16, :got:__blue_glCore_glVertexArrayRangeNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayRangeNV] + .global bluegl_glMultiTexCoord4f + .type bluegl_glMultiTexCoord4f, %function +bluegl_glMultiTexCoord4f: + adrp x16, :got:__blue_glCore_glMultiTexCoord4f + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4f] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayRangeNV, .-bluegl_glVertexArrayRangeNV + .size bluegl_glMultiTexCoord4f, .-bluegl_glMultiTexCoord4f .align 2 - .global bluegl_glGetMultiTexLevelParameterivEXT - .type bluegl_glGetMultiTexLevelParameterivEXT, %function -bluegl_glGetMultiTexLevelParameterivEXT: - adrp x16, :got:__blue_glCore_glGetMultiTexLevelParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexLevelParameterivEXT] + .global bluegl_glMultiTexCoord4fv + .type bluegl_glMultiTexCoord4fv, %function +bluegl_glMultiTexCoord4fv: + adrp x16, :got:__blue_glCore_glMultiTexCoord4fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4fv] ldr x16, [x16] br x16 - .size bluegl_glGetMultiTexLevelParameterivEXT, .-bluegl_glGetMultiTexLevelParameterivEXT + .size bluegl_glMultiTexCoord4fv, .-bluegl_glMultiTexCoord4fv .align 2 - .global bluegl_glMultiDrawArraysEXT - .type bluegl_glMultiDrawArraysEXT, %function -bluegl_glMultiDrawArraysEXT: - adrp x16, :got:__blue_glCore_glMultiDrawArraysEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawArraysEXT] + .global bluegl_glMultiTexCoord4i + .type bluegl_glMultiTexCoord4i, %function +bluegl_glMultiTexCoord4i: + adrp x16, :got:__blue_glCore_glMultiTexCoord4i + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4i] ldr x16, [x16] br x16 - .size bluegl_glMultiDrawArraysEXT, .-bluegl_glMultiDrawArraysEXT + .size bluegl_glMultiTexCoord4i, .-bluegl_glMultiTexCoord4i .align 2 - .global bluegl_glVertexAttribL4ui64NV - .type bluegl_glVertexAttribL4ui64NV, %function -bluegl_glVertexAttribL4ui64NV: - adrp x16, :got:__blue_glCore_glVertexAttribL4ui64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL4ui64NV] + .global bluegl_glMultiTexCoord4iv + .type bluegl_glMultiTexCoord4iv, %function +bluegl_glMultiTexCoord4iv: + adrp x16, :got:__blue_glCore_glMultiTexCoord4iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4iv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL4ui64NV, .-bluegl_glVertexAttribL4ui64NV + .size bluegl_glMultiTexCoord4iv, .-bluegl_glMultiTexCoord4iv .align 2 - .global bluegl_glVertexAttrib4Nub - .type bluegl_glVertexAttrib4Nub, %function -bluegl_glVertexAttrib4Nub: - adrp x16, :got:__blue_glCore_glVertexAttrib4Nub - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4Nub] + .global bluegl_glMultiTexCoord4s + .type bluegl_glMultiTexCoord4s, %function +bluegl_glMultiTexCoord4s: + adrp x16, :got:__blue_glCore_glMultiTexCoord4s + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4s] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4Nub, .-bluegl_glVertexAttrib4Nub + .size bluegl_glMultiTexCoord4s, .-bluegl_glMultiTexCoord4s .align 2 - .global bluegl_glFogCoordhNV - .type bluegl_glFogCoordhNV, %function -bluegl_glFogCoordhNV: - adrp x16, :got:__blue_glCore_glFogCoordhNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordhNV] + .global bluegl_glMultiTexCoord4sv + .type bluegl_glMultiTexCoord4sv, %function +bluegl_glMultiTexCoord4sv: + adrp x16, :got:__blue_glCore_glMultiTexCoord4sv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4sv] ldr x16, [x16] br x16 - .size bluegl_glFogCoordhNV, .-bluegl_glFogCoordhNV + .size bluegl_glMultiTexCoord4sv, .-bluegl_glMultiTexCoord4sv .align 2 - .global bluegl_glVertexAttribI3ui - .type bluegl_glVertexAttribI3ui, %function -bluegl_glVertexAttribI3ui: - adrp x16, :got:__blue_glCore_glVertexAttribI3ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI3ui] + .global bluegl_glLoadTransposeMatrixf + .type bluegl_glLoadTransposeMatrixf, %function +bluegl_glLoadTransposeMatrixf: + adrp x16, :got:__blue_glCore_glLoadTransposeMatrixf + ldr x16, [x16, #:got_lo12:__blue_glCore_glLoadTransposeMatrixf] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI3ui, .-bluegl_glVertexAttribI3ui + .size bluegl_glLoadTransposeMatrixf, .-bluegl_glLoadTransposeMatrixf .align 2 - .global bluegl_glTexImage3DMultisampleCoverageNV - .type bluegl_glTexImage3DMultisampleCoverageNV, %function -bluegl_glTexImage3DMultisampleCoverageNV: - adrp x16, :got:__blue_glCore_glTexImage3DMultisampleCoverageNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexImage3DMultisampleCoverageNV] + .global bluegl_glLoadTransposeMatrixd + .type bluegl_glLoadTransposeMatrixd, %function +bluegl_glLoadTransposeMatrixd: + adrp x16, :got:__blue_glCore_glLoadTransposeMatrixd + ldr x16, [x16, #:got_lo12:__blue_glCore_glLoadTransposeMatrixd] ldr x16, [x16] br x16 - .size bluegl_glTexImage3DMultisampleCoverageNV, .-bluegl_glTexImage3DMultisampleCoverageNV + .size bluegl_glLoadTransposeMatrixd, .-bluegl_glLoadTransposeMatrixd .align 2 - .global bluegl_glGetUniformBufferSizeEXT - .type bluegl_glGetUniformBufferSizeEXT, %function -bluegl_glGetUniformBufferSizeEXT: - adrp x16, :got:__blue_glCore_glGetUniformBufferSizeEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformBufferSizeEXT] + .global bluegl_glMultTransposeMatrixf + .type bluegl_glMultTransposeMatrixf, %function +bluegl_glMultTransposeMatrixf: + adrp x16, :got:__blue_glCore_glMultTransposeMatrixf + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultTransposeMatrixf] ldr x16, [x16] br x16 - .size bluegl_glGetUniformBufferSizeEXT, .-bluegl_glGetUniformBufferSizeEXT + .size bluegl_glMultTransposeMatrixf, .-bluegl_glMultTransposeMatrixf .align 2 - .global bluegl_glCompileCommandListNV - .type bluegl_glCompileCommandListNV, %function -bluegl_glCompileCommandListNV: - adrp x16, :got:__blue_glCore_glCompileCommandListNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompileCommandListNV] + .global bluegl_glMultTransposeMatrixd + .type bluegl_glMultTransposeMatrixd, %function +bluegl_glMultTransposeMatrixd: + adrp x16, :got:__blue_glCore_glMultTransposeMatrixd + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultTransposeMatrixd] ldr x16, [x16] br x16 - .size bluegl_glCompileCommandListNV, .-bluegl_glCompileCommandListNV + .size bluegl_glMultTransposeMatrixd, .-bluegl_glMultTransposeMatrixd .align 2 - .global bluegl_glVertexArrayVertexAttribBindingEXT - .type bluegl_glVertexArrayVertexAttribBindingEXT, %function -bluegl_glVertexArrayVertexAttribBindingEXT: - adrp x16, :got:__blue_glCore_glVertexArrayVertexAttribBindingEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexAttribBindingEXT] + .global bluegl_glFogCoordf + .type bluegl_glFogCoordf, %function +bluegl_glFogCoordf: + adrp x16, :got:__blue_glCore_glFogCoordf + ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordf] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayVertexAttribBindingEXT, .-bluegl_glVertexArrayVertexAttribBindingEXT + .size bluegl_glFogCoordf, .-bluegl_glFogCoordf .align 2 - .global bluegl_glBlendEquation - .type bluegl_glBlendEquation, %function -bluegl_glBlendEquation: - adrp x16, :got:__blue_glCore_glBlendEquation - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquation] + .global bluegl_glFogCoordfv + .type bluegl_glFogCoordfv, %function +bluegl_glFogCoordfv: + adrp x16, :got:__blue_glCore_glFogCoordfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordfv] ldr x16, [x16] br x16 - .size bluegl_glBlendEquation, .-bluegl_glBlendEquation + .size bluegl_glFogCoordfv, .-bluegl_glFogCoordfv .align 2 - .global bluegl_glBinormal3dvEXT - .type bluegl_glBinormal3dvEXT, %function -bluegl_glBinormal3dvEXT: - adrp x16, :got:__blue_glCore_glBinormal3dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3dvEXT] + .global bluegl_glFogCoordd + .type bluegl_glFogCoordd, %function +bluegl_glFogCoordd: + adrp x16, :got:__blue_glCore_glFogCoordd + ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordd] ldr x16, [x16] br x16 - .size bluegl_glBinormal3dvEXT, .-bluegl_glBinormal3dvEXT + .size bluegl_glFogCoordd, .-bluegl_glFogCoordd .align 2 - .global bluegl_glVertexFormatNV - .type bluegl_glVertexFormatNV, %function -bluegl_glVertexFormatNV: - adrp x16, :got:__blue_glCore_glVertexFormatNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexFormatNV] + .global bluegl_glFogCoorddv + .type bluegl_glFogCoorddv, %function +bluegl_glFogCoorddv: + adrp x16, :got:__blue_glCore_glFogCoorddv + ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoorddv] ldr x16, [x16] br x16 - .size bluegl_glVertexFormatNV, .-bluegl_glVertexFormatNV + .size bluegl_glFogCoorddv, .-bluegl_glFogCoorddv .align 2 - .global bluegl_glProgramUniform4fv - .type bluegl_glProgramUniform4fv, %function -bluegl_glProgramUniform4fv: - adrp x16, :got:__blue_glCore_glProgramUniform4fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4fv] + .global bluegl_glFogCoordPointer + .type bluegl_glFogCoordPointer, %function +bluegl_glFogCoordPointer: + adrp x16, :got:__blue_glCore_glFogCoordPointer + ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordPointer] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4fv, .-bluegl_glProgramUniform4fv + .size bluegl_glFogCoordPointer, .-bluegl_glFogCoordPointer .align 2 - .global bluegl_glTextureStorage2DMultisample - .type bluegl_glTextureStorage2DMultisample, %function -bluegl_glTextureStorage2DMultisample: - adrp x16, :got:__blue_glCore_glTextureStorage2DMultisample - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage2DMultisample] + .global bluegl_glSecondaryColor3b + .type bluegl_glSecondaryColor3b, %function +bluegl_glSecondaryColor3b: + adrp x16, :got:__blue_glCore_glSecondaryColor3b + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3b] ldr x16, [x16] br x16 - .size bluegl_glTextureStorage2DMultisample, .-bluegl_glTextureStorage2DMultisample + .size bluegl_glSecondaryColor3b, .-bluegl_glSecondaryColor3b .align 2 - .global bluegl_glProgramUniform3uiEXT - .type bluegl_glProgramUniform3uiEXT, %function -bluegl_glProgramUniform3uiEXT: - adrp x16, :got:__blue_glCore_glProgramUniform3uiEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3uiEXT] + .global bluegl_glSecondaryColor3bv + .type bluegl_glSecondaryColor3bv, %function +bluegl_glSecondaryColor3bv: + adrp x16, :got:__blue_glCore_glSecondaryColor3bv + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3bv] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3uiEXT, .-bluegl_glProgramUniform3uiEXT + .size bluegl_glSecondaryColor3bv, .-bluegl_glSecondaryColor3bv .align 2 - .global bluegl_glFramebufferDrawBufferEXT - .type bluegl_glFramebufferDrawBufferEXT, %function -bluegl_glFramebufferDrawBufferEXT: - adrp x16, :got:__blue_glCore_glFramebufferDrawBufferEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferDrawBufferEXT] + .global bluegl_glSecondaryColor3d + .type bluegl_glSecondaryColor3d, %function +bluegl_glSecondaryColor3d: + adrp x16, :got:__blue_glCore_glSecondaryColor3d + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3d] ldr x16, [x16] br x16 - .size bluegl_glFramebufferDrawBufferEXT, .-bluegl_glFramebufferDrawBufferEXT + .size bluegl_glSecondaryColor3d, .-bluegl_glSecondaryColor3d .align 2 - .global bluegl_glCreateTextures - .type bluegl_glCreateTextures, %function -bluegl_glCreateTextures: - adrp x16, :got:__blue_glCore_glCreateTextures - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateTextures] + .global bluegl_glSecondaryColor3dv + .type bluegl_glSecondaryColor3dv, %function +bluegl_glSecondaryColor3dv: + adrp x16, :got:__blue_glCore_glSecondaryColor3dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3dv] ldr x16, [x16] br x16 - .size bluegl_glCreateTextures, .-bluegl_glCreateTextures + .size bluegl_glSecondaryColor3dv, .-bluegl_glSecondaryColor3dv .align 2 - .global bluegl_glMatrixPopEXT - .type bluegl_glMatrixPopEXT, %function -bluegl_glMatrixPopEXT: - adrp x16, :got:__blue_glCore_glMatrixPopEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixPopEXT] + .global bluegl_glSecondaryColor3f + .type bluegl_glSecondaryColor3f, %function +bluegl_glSecondaryColor3f: + adrp x16, :got:__blue_glCore_glSecondaryColor3f + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3f] ldr x16, [x16] br x16 - .size bluegl_glMatrixPopEXT, .-bluegl_glMatrixPopEXT + .size bluegl_glSecondaryColor3f, .-bluegl_glSecondaryColor3f .align 2 - .global bluegl_glProgramUniformui64vNV - .type bluegl_glProgramUniformui64vNV, %function -bluegl_glProgramUniformui64vNV: - adrp x16, :got:__blue_glCore_glProgramUniformui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformui64vNV] + .global bluegl_glSecondaryColor3fv + .type bluegl_glSecondaryColor3fv, %function +bluegl_glSecondaryColor3fv: + adrp x16, :got:__blue_glCore_glSecondaryColor3fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3fv] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformui64vNV, .-bluegl_glProgramUniformui64vNV + .size bluegl_glSecondaryColor3fv, .-bluegl_glSecondaryColor3fv .align 2 - .global bluegl_glFramebufferTexture2D - .type bluegl_glFramebufferTexture2D, %function -bluegl_glFramebufferTexture2D: - adrp x16, :got:__blue_glCore_glFramebufferTexture2D - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTexture2D] + .global bluegl_glSecondaryColor3i + .type bluegl_glSecondaryColor3i, %function +bluegl_glSecondaryColor3i: + adrp x16, :got:__blue_glCore_glSecondaryColor3i + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3i] ldr x16, [x16] br x16 - .size bluegl_glFramebufferTexture2D, .-bluegl_glFramebufferTexture2D + .size bluegl_glSecondaryColor3i, .-bluegl_glSecondaryColor3i .align 2 - .global bluegl_glGetAttribLocation - .type bluegl_glGetAttribLocation, %function -bluegl_glGetAttribLocation: - adrp x16, :got:__blue_glCore_glGetAttribLocation - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetAttribLocation] + .global bluegl_glSecondaryColor3iv + .type bluegl_glSecondaryColor3iv, %function +bluegl_glSecondaryColor3iv: + adrp x16, :got:__blue_glCore_glSecondaryColor3iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3iv] ldr x16, [x16] br x16 - .size bluegl_glGetAttribLocation, .-bluegl_glGetAttribLocation + .size bluegl_glSecondaryColor3iv, .-bluegl_glSecondaryColor3iv .align 2 - .global bluegl_glUniform2fARB - .type bluegl_glUniform2fARB, %function -bluegl_glUniform2fARB: - adrp x16, :got:__blue_glCore_glUniform2fARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2fARB] + .global bluegl_glSecondaryColor3s + .type bluegl_glSecondaryColor3s, %function +bluegl_glSecondaryColor3s: + adrp x16, :got:__blue_glCore_glSecondaryColor3s + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3s] ldr x16, [x16] br x16 - .size bluegl_glUniform2fARB, .-bluegl_glUniform2fARB + .size bluegl_glSecondaryColor3s, .-bluegl_glSecondaryColor3s .align 2 - .global bluegl_glDisableVertexArrayAttribEXT - .type bluegl_glDisableVertexArrayAttribEXT, %function -bluegl_glDisableVertexArrayAttribEXT: - adrp x16, :got:__blue_glCore_glDisableVertexArrayAttribEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableVertexArrayAttribEXT] + .global bluegl_glSecondaryColor3sv + .type bluegl_glSecondaryColor3sv, %function +bluegl_glSecondaryColor3sv: + adrp x16, :got:__blue_glCore_glSecondaryColor3sv + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3sv] ldr x16, [x16] br x16 - .size bluegl_glDisableVertexArrayAttribEXT, .-bluegl_glDisableVertexArrayAttribEXT + .size bluegl_glSecondaryColor3sv, .-bluegl_glSecondaryColor3sv .align 2 - .global bluegl_glTexStorage2D - .type bluegl_glTexStorage2D, %function -bluegl_glTexStorage2D: - adrp x16, :got:__blue_glCore_glTexStorage2D - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexStorage2D] + .global bluegl_glSecondaryColor3ub + .type bluegl_glSecondaryColor3ub, %function +bluegl_glSecondaryColor3ub: + adrp x16, :got:__blue_glCore_glSecondaryColor3ub + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3ub] ldr x16, [x16] br x16 - .size bluegl_glTexStorage2D, .-bluegl_glTexStorage2D + .size bluegl_glSecondaryColor3ub, .-bluegl_glSecondaryColor3ub .align 2 - .global bluegl_glVertexAttribI1iEXT - .type bluegl_glVertexAttribI1iEXT, %function -bluegl_glVertexAttribI1iEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI1iEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI1iEXT] + .global bluegl_glSecondaryColor3ubv + .type bluegl_glSecondaryColor3ubv, %function +bluegl_glSecondaryColor3ubv: + adrp x16, :got:__blue_glCore_glSecondaryColor3ubv + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3ubv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI1iEXT, .-bluegl_glVertexAttribI1iEXT + .size bluegl_glSecondaryColor3ubv, .-bluegl_glSecondaryColor3ubv .align 2 - .global bluegl_glUniform4ui - .type bluegl_glUniform4ui, %function -bluegl_glUniform4ui: - adrp x16, :got:__blue_glCore_glUniform4ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4ui] + .global bluegl_glSecondaryColor3ui + .type bluegl_glSecondaryColor3ui, %function +bluegl_glSecondaryColor3ui: + adrp x16, :got:__blue_glCore_glSecondaryColor3ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3ui] ldr x16, [x16] br x16 - .size bluegl_glUniform4ui, .-bluegl_glUniform4ui + .size bluegl_glSecondaryColor3ui, .-bluegl_glSecondaryColor3ui .align 2 - .global bluegl_glMultiTexCoordP1uiv - .type bluegl_glMultiTexCoordP1uiv, %function -bluegl_glMultiTexCoordP1uiv: - adrp x16, :got:__blue_glCore_glMultiTexCoordP1uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoordP1uiv] + .global bluegl_glSecondaryColor3uiv + .type bluegl_glSecondaryColor3uiv, %function +bluegl_glSecondaryColor3uiv: + adrp x16, :got:__blue_glCore_glSecondaryColor3uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3uiv] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoordP1uiv, .-bluegl_glMultiTexCoordP1uiv + .size bluegl_glSecondaryColor3uiv, .-bluegl_glSecondaryColor3uiv .align 2 - .global bluegl_glNamedProgramLocalParametersI4ivEXT - .type bluegl_glNamedProgramLocalParametersI4ivEXT, %function -bluegl_glNamedProgramLocalParametersI4ivEXT: - adrp x16, :got:__blue_glCore_glNamedProgramLocalParametersI4ivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParametersI4ivEXT] + .global bluegl_glSecondaryColor3us + .type bluegl_glSecondaryColor3us, %function +bluegl_glSecondaryColor3us: + adrp x16, :got:__blue_glCore_glSecondaryColor3us + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3us] ldr x16, [x16] br x16 - .size bluegl_glNamedProgramLocalParametersI4ivEXT, .-bluegl_glNamedProgramLocalParametersI4ivEXT + .size bluegl_glSecondaryColor3us, .-bluegl_glSecondaryColor3us .align 2 - .global bluegl_glImageTransformParameteriHP - .type bluegl_glImageTransformParameteriHP, %function -bluegl_glImageTransformParameteriHP: - adrp x16, :got:__blue_glCore_glImageTransformParameteriHP - ldr x16, [x16, #:got_lo12:__blue_glCore_glImageTransformParameteriHP] + .global bluegl_glSecondaryColor3usv + .type bluegl_glSecondaryColor3usv, %function +bluegl_glSecondaryColor3usv: + adrp x16, :got:__blue_glCore_glSecondaryColor3usv + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3usv] ldr x16, [x16] br x16 - .size bluegl_glImageTransformParameteriHP, .-bluegl_glImageTransformParameteriHP + .size bluegl_glSecondaryColor3usv, .-bluegl_glSecondaryColor3usv .align 2 - .global bluegl_glIsBuffer - .type bluegl_glIsBuffer, %function -bluegl_glIsBuffer: - adrp x16, :got:__blue_glCore_glIsBuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsBuffer] + .global bluegl_glSecondaryColorPointer + .type bluegl_glSecondaryColorPointer, %function +bluegl_glSecondaryColorPointer: + adrp x16, :got:__blue_glCore_glSecondaryColorPointer + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColorPointer] ldr x16, [x16] br x16 - .size bluegl_glIsBuffer, .-bluegl_glIsBuffer + .size bluegl_glSecondaryColorPointer, .-bluegl_glSecondaryColorPointer .align 2 - .global bluegl_glFogCoorddv - .type bluegl_glFogCoorddv, %function -bluegl_glFogCoorddv: - adrp x16, :got:__blue_glCore_glFogCoorddv - ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoorddv] + .global bluegl_glWindowPos2d + .type bluegl_glWindowPos2d, %function +bluegl_glWindowPos2d: + adrp x16, :got:__blue_glCore_glWindowPos2d + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2d] ldr x16, [x16] br x16 - .size bluegl_glFogCoorddv, .-bluegl_glFogCoorddv + .size bluegl_glWindowPos2d, .-bluegl_glWindowPos2d .align 2 - .global bluegl_glClientActiveTexture - .type bluegl_glClientActiveTexture, %function -bluegl_glClientActiveTexture: - adrp x16, :got:__blue_glCore_glClientActiveTexture - ldr x16, [x16, #:got_lo12:__blue_glCore_glClientActiveTexture] + .global bluegl_glWindowPos2dv + .type bluegl_glWindowPos2dv, %function +bluegl_glWindowPos2dv: + adrp x16, :got:__blue_glCore_glWindowPos2dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2dv] ldr x16, [x16] br x16 - .size bluegl_glClientActiveTexture, .-bluegl_glClientActiveTexture + .size bluegl_glWindowPos2dv, .-bluegl_glWindowPos2dv .align 2 - .global bluegl_glUniformHandleui64vNV - .type bluegl_glUniformHandleui64vNV, %function -bluegl_glUniformHandleui64vNV: - adrp x16, :got:__blue_glCore_glUniformHandleui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformHandleui64vNV] + .global bluegl_glWindowPos2f + .type bluegl_glWindowPos2f, %function +bluegl_glWindowPos2f: + adrp x16, :got:__blue_glCore_glWindowPos2f + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2f] ldr x16, [x16] br x16 - .size bluegl_glUniformHandleui64vNV, .-bluegl_glUniformHandleui64vNV + .size bluegl_glWindowPos2f, .-bluegl_glWindowPos2f .align 2 - .global bluegl_glWindowPos3fARB - .type bluegl_glWindowPos3fARB, %function -bluegl_glWindowPos3fARB: - adrp x16, :got:__blue_glCore_glWindowPos3fARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3fARB] + .global bluegl_glWindowPos2fv + .type bluegl_glWindowPos2fv, %function +bluegl_glWindowPos2fv: + adrp x16, :got:__blue_glCore_glWindowPos2fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2fv] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3fARB, .-bluegl_glWindowPos3fARB + .size bluegl_glWindowPos2fv, .-bluegl_glWindowPos2fv .align 2 - .global bluegl_glGetVertexAttribfvARB - .type bluegl_glGetVertexAttribfvARB, %function -bluegl_glGetVertexAttribfvARB: - adrp x16, :got:__blue_glCore_glGetVertexAttribfvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribfvARB] + .global bluegl_glWindowPos2i + .type bluegl_glWindowPos2i, %function +bluegl_glWindowPos2i: + adrp x16, :got:__blue_glCore_glWindowPos2i + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2i] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribfvARB, .-bluegl_glGetVertexAttribfvARB + .size bluegl_glWindowPos2i, .-bluegl_glWindowPos2i .align 2 - .global bluegl_glSamplerParameterfv - .type bluegl_glSamplerParameterfv, %function -bluegl_glSamplerParameterfv: - adrp x16, :got:__blue_glCore_glSamplerParameterfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glSamplerParameterfv] + .global bluegl_glWindowPos2iv + .type bluegl_glWindowPos2iv, %function +bluegl_glWindowPos2iv: + adrp x16, :got:__blue_glCore_glWindowPos2iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2iv] ldr x16, [x16] br x16 - .size bluegl_glSamplerParameterfv, .-bluegl_glSamplerParameterfv + .size bluegl_glWindowPos2iv, .-bluegl_glWindowPos2iv .align 2 - .global bluegl_glVertexAttrib4NsvARB - .type bluegl_glVertexAttrib4NsvARB, %function -bluegl_glVertexAttrib4NsvARB: - adrp x16, :got:__blue_glCore_glVertexAttrib4NsvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4NsvARB] + .global bluegl_glWindowPos2s + .type bluegl_glWindowPos2s, %function +bluegl_glWindowPos2s: + adrp x16, :got:__blue_glCore_glWindowPos2s + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2s] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4NsvARB, .-bluegl_glVertexAttrib4NsvARB + .size bluegl_glWindowPos2s, .-bluegl_glWindowPos2s .align 2 - .global bluegl_glProgramUniform2ivEXT - .type bluegl_glProgramUniform2ivEXT, %function -bluegl_glProgramUniform2ivEXT: - adrp x16, :got:__blue_glCore_glProgramUniform2ivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2ivEXT] + .global bluegl_glWindowPos2sv + .type bluegl_glWindowPos2sv, %function +bluegl_glWindowPos2sv: + adrp x16, :got:__blue_glCore_glWindowPos2sv + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2sv] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2ivEXT, .-bluegl_glProgramUniform2ivEXT + .size bluegl_glWindowPos2sv, .-bluegl_glWindowPos2sv .align 2 - .global bluegl_glNamedProgramStringEXT - .type bluegl_glNamedProgramStringEXT, %function -bluegl_glNamedProgramStringEXT: - adrp x16, :got:__blue_glCore_glNamedProgramStringEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramStringEXT] + .global bluegl_glWindowPos3d + .type bluegl_glWindowPos3d, %function +bluegl_glWindowPos3d: + adrp x16, :got:__blue_glCore_glWindowPos3d + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3d] ldr x16, [x16] br x16 - .size bluegl_glNamedProgramStringEXT, .-bluegl_glNamedProgramStringEXT + .size bluegl_glWindowPos3d, .-bluegl_glWindowPos3d .align 2 - .global bluegl_glPointSize - .type bluegl_glPointSize, %function -bluegl_glPointSize: - adrp x16, :got:__blue_glCore_glPointSize - ldr x16, [x16, #:got_lo12:__blue_glCore_glPointSize] + .global bluegl_glWindowPos3dv + .type bluegl_glWindowPos3dv, %function +bluegl_glWindowPos3dv: + adrp x16, :got:__blue_glCore_glWindowPos3dv + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3dv] ldr x16, [x16] br x16 - .size bluegl_glPointSize, .-bluegl_glPointSize + .size bluegl_glWindowPos3dv, .-bluegl_glWindowPos3dv .align 2 - .global bluegl_glTexCoord4hNV - .type bluegl_glTexCoord4hNV, %function -bluegl_glTexCoord4hNV: - adrp x16, :got:__blue_glCore_glTexCoord4hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord4hNV] + .global bluegl_glWindowPos3f + .type bluegl_glWindowPos3f, %function +bluegl_glWindowPos3f: + adrp x16, :got:__blue_glCore_glWindowPos3f + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3f] ldr x16, [x16] br x16 - .size bluegl_glTexCoord4hNV, .-bluegl_glTexCoord4hNV + .size bluegl_glWindowPos3f, .-bluegl_glWindowPos3f .align 2 - .global bluegl_glGetIntegerIndexedvEXT - .type bluegl_glGetIntegerIndexedvEXT, %function -bluegl_glGetIntegerIndexedvEXT: - adrp x16, :got:__blue_glCore_glGetIntegerIndexedvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetIntegerIndexedvEXT] + .global bluegl_glWindowPos3fv + .type bluegl_glWindowPos3fv, %function +bluegl_glWindowPos3fv: + adrp x16, :got:__blue_glCore_glWindowPos3fv + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3fv] ldr x16, [x16] br x16 - .size bluegl_glGetIntegerIndexedvEXT, .-bluegl_glGetIntegerIndexedvEXT + .size bluegl_glWindowPos3fv, .-bluegl_glWindowPos3fv .align 2 - .global bluegl_glPrimitiveBoundingBoxARB - .type bluegl_glPrimitiveBoundingBoxARB, %function -bluegl_glPrimitiveBoundingBoxARB: - adrp x16, :got:__blue_glCore_glPrimitiveBoundingBoxARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glPrimitiveBoundingBoxARB] + .global bluegl_glWindowPos3i + .type bluegl_glWindowPos3i, %function +bluegl_glWindowPos3i: + adrp x16, :got:__blue_glCore_glWindowPos3i + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3i] ldr x16, [x16] br x16 - .size bluegl_glPrimitiveBoundingBoxARB, .-bluegl_glPrimitiveBoundingBoxARB + .size bluegl_glWindowPos3i, .-bluegl_glWindowPos3i .align 2 - .global bluegl_glDebugMessageInsert - .type bluegl_glDebugMessageInsert, %function -bluegl_glDebugMessageInsert: - adrp x16, :got:__blue_glCore_glDebugMessageInsert - ldr x16, [x16, #:got_lo12:__blue_glCore_glDebugMessageInsert] + .global bluegl_glWindowPos3iv + .type bluegl_glWindowPos3iv, %function +bluegl_glWindowPos3iv: + adrp x16, :got:__blue_glCore_glWindowPos3iv + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3iv] ldr x16, [x16] br x16 - .size bluegl_glDebugMessageInsert, .-bluegl_glDebugMessageInsert + .size bluegl_glWindowPos3iv, .-bluegl_glWindowPos3iv .align 2 - .global bluegl_glMultiTexCoord3bvOES - .type bluegl_glMultiTexCoord3bvOES, %function -bluegl_glMultiTexCoord3bvOES: - adrp x16, :got:__blue_glCore_glMultiTexCoord3bvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3bvOES] + .global bluegl_glWindowPos3s + .type bluegl_glWindowPos3s, %function +bluegl_glWindowPos3s: + adrp x16, :got:__blue_glCore_glWindowPos3s + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3s] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3bvOES, .-bluegl_glMultiTexCoord3bvOES + .size bluegl_glWindowPos3s, .-bluegl_glWindowPos3s .align 2 - .global bluegl_glVertexAttribL1i64vNV - .type bluegl_glVertexAttribL1i64vNV, %function -bluegl_glVertexAttribL1i64vNV: - adrp x16, :got:__blue_glCore_glVertexAttribL1i64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1i64vNV] + .global bluegl_glWindowPos3sv + .type bluegl_glWindowPos3sv, %function +bluegl_glWindowPos3sv: + adrp x16, :got:__blue_glCore_glWindowPos3sv + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3sv] + ldr x16, [x16] + br x16 + .size bluegl_glWindowPos3sv, .-bluegl_glWindowPos3sv + + .align 2 + .global bluegl_glVertexP2ui + .type bluegl_glVertexP2ui, %function +bluegl_glVertexP2ui: + adrp x16, :got:__blue_glCore_glVertexP2ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexP2ui] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL1i64vNV, .-bluegl_glVertexAttribL1i64vNV + .size bluegl_glVertexP2ui, .-bluegl_glVertexP2ui .align 2 - .global bluegl_glTextureBuffer - .type bluegl_glTextureBuffer, %function -bluegl_glTextureBuffer: - adrp x16, :got:__blue_glCore_glTextureBuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureBuffer] + .global bluegl_glVertexP2uiv + .type bluegl_glVertexP2uiv, %function +bluegl_glVertexP2uiv: + adrp x16, :got:__blue_glCore_glVertexP2uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexP2uiv] ldr x16, [x16] br x16 - .size bluegl_glTextureBuffer, .-bluegl_glTextureBuffer + .size bluegl_glVertexP2uiv, .-bluegl_glVertexP2uiv .align 2 - .global bluegl_glGetTextureParameterIiv - .type bluegl_glGetTextureParameterIiv, %function -bluegl_glGetTextureParameterIiv: - adrp x16, :got:__blue_glCore_glGetTextureParameterIiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureParameterIiv] + .global bluegl_glVertexP3ui + .type bluegl_glVertexP3ui, %function +bluegl_glVertexP3ui: + adrp x16, :got:__blue_glCore_glVertexP3ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexP3ui] ldr x16, [x16] br x16 - .size bluegl_glGetTextureParameterIiv, .-bluegl_glGetTextureParameterIiv + .size bluegl_glVertexP3ui, .-bluegl_glVertexP3ui .align 2 - .global bluegl_glFramebufferTexture - .type bluegl_glFramebufferTexture, %function -bluegl_glFramebufferTexture: - adrp x16, :got:__blue_glCore_glFramebufferTexture - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTexture] + .global bluegl_glVertexP3uiv + .type bluegl_glVertexP3uiv, %function +bluegl_glVertexP3uiv: + adrp x16, :got:__blue_glCore_glVertexP3uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexP3uiv] ldr x16, [x16] br x16 - .size bluegl_glFramebufferTexture, .-bluegl_glFramebufferTexture + .size bluegl_glVertexP3uiv, .-bluegl_glVertexP3uiv .align 2 - .global bluegl_glGetProgramivARB - .type bluegl_glGetProgramivARB, %function -bluegl_glGetProgramivARB: - adrp x16, :got:__blue_glCore_glGetProgramivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramivARB] + .global bluegl_glVertexP4ui + .type bluegl_glVertexP4ui, %function +bluegl_glVertexP4ui: + adrp x16, :got:__blue_glCore_glVertexP4ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexP4ui] ldr x16, [x16] br x16 - .size bluegl_glGetProgramivARB, .-bluegl_glGetProgramivARB + .size bluegl_glVertexP4ui, .-bluegl_glVertexP4ui .align 2 - .global bluegl_glVertexAttribPointerARB - .type bluegl_glVertexAttribPointerARB, %function -bluegl_glVertexAttribPointerARB: - adrp x16, :got:__blue_glCore_glVertexAttribPointerARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribPointerARB] + .global bluegl_glVertexP4uiv + .type bluegl_glVertexP4uiv, %function +bluegl_glVertexP4uiv: + adrp x16, :got:__blue_glCore_glVertexP4uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexP4uiv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribPointerARB, .-bluegl_glVertexAttribPointerARB + .size bluegl_glVertexP4uiv, .-bluegl_glVertexP4uiv .align 2 - .global bluegl_glIsCommandListNV - .type bluegl_glIsCommandListNV, %function -bluegl_glIsCommandListNV: - adrp x16, :got:__blue_glCore_glIsCommandListNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsCommandListNV] + .global bluegl_glTexCoordP1ui + .type bluegl_glTexCoordP1ui, %function +bluegl_glTexCoordP1ui: + adrp x16, :got:__blue_glCore_glTexCoordP1ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordP1ui] ldr x16, [x16] br x16 - .size bluegl_glIsCommandListNV, .-bluegl_glIsCommandListNV + .size bluegl_glTexCoordP1ui, .-bluegl_glTexCoordP1ui .align 2 - .global bluegl_glUniform1uivEXT - .type bluegl_glUniform1uivEXT, %function -bluegl_glUniform1uivEXT: - adrp x16, :got:__blue_glCore_glUniform1uivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1uivEXT] + .global bluegl_glTexCoordP1uiv + .type bluegl_glTexCoordP1uiv, %function +bluegl_glTexCoordP1uiv: + adrp x16, :got:__blue_glCore_glTexCoordP1uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordP1uiv] ldr x16, [x16] br x16 - .size bluegl_glUniform1uivEXT, .-bluegl_glUniform1uivEXT + .size bluegl_glTexCoordP1uiv, .-bluegl_glTexCoordP1uiv .align 2 - .global bluegl_glProgramUniform2i - .type bluegl_glProgramUniform2i, %function -bluegl_glProgramUniform2i: - adrp x16, :got:__blue_glCore_glProgramUniform2i - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2i] + .global bluegl_glTexCoordP2ui + .type bluegl_glTexCoordP2ui, %function +bluegl_glTexCoordP2ui: + adrp x16, :got:__blue_glCore_glTexCoordP2ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordP2ui] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2i, .-bluegl_glProgramUniform2i + .size bluegl_glTexCoordP2ui, .-bluegl_glTexCoordP2ui .align 2 - .global bluegl_glVertexAttribDivisorARB - .type bluegl_glVertexAttribDivisorARB, %function -bluegl_glVertexAttribDivisorARB: - adrp x16, :got:__blue_glCore_glVertexAttribDivisorARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribDivisorARB] + .global bluegl_glTexCoordP2uiv + .type bluegl_glTexCoordP2uiv, %function +bluegl_glTexCoordP2uiv: + adrp x16, :got:__blue_glCore_glTexCoordP2uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordP2uiv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribDivisorARB, .-bluegl_glVertexAttribDivisorARB + .size bluegl_glTexCoordP2uiv, .-bluegl_glTexCoordP2uiv .align 2 - .global bluegl_glGetVertexAttribPointervARB - .type bluegl_glGetVertexAttribPointervARB, %function -bluegl_glGetVertexAttribPointervARB: - adrp x16, :got:__blue_glCore_glGetVertexAttribPointervARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribPointervARB] + .global bluegl_glTexCoordP3ui + .type bluegl_glTexCoordP3ui, %function +bluegl_glTexCoordP3ui: + adrp x16, :got:__blue_glCore_glTexCoordP3ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordP3ui] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribPointervARB, .-bluegl_glGetVertexAttribPointervARB + .size bluegl_glTexCoordP3ui, .-bluegl_glTexCoordP3ui .align 2 - .global bluegl_glTextureImage2DMultisampleNV - .type bluegl_glTextureImage2DMultisampleNV, %function -bluegl_glTextureImage2DMultisampleNV: - adrp x16, :got:__blue_glCore_glTextureImage2DMultisampleNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureImage2DMultisampleNV] + .global bluegl_glTexCoordP3uiv + .type bluegl_glTexCoordP3uiv, %function +bluegl_glTexCoordP3uiv: + adrp x16, :got:__blue_glCore_glTexCoordP3uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordP3uiv] ldr x16, [x16] br x16 - .size bluegl_glTextureImage2DMultisampleNV, .-bluegl_glTextureImage2DMultisampleNV + .size bluegl_glTexCoordP3uiv, .-bluegl_glTexCoordP3uiv .align 2 - .global bluegl_glGetVariantPointervEXT - .type bluegl_glGetVariantPointervEXT, %function -bluegl_glGetVariantPointervEXT: - adrp x16, :got:__blue_glCore_glGetVariantPointervEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVariantPointervEXT] + .global bluegl_glTexCoordP4ui + .type bluegl_glTexCoordP4ui, %function +bluegl_glTexCoordP4ui: + adrp x16, :got:__blue_glCore_glTexCoordP4ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordP4ui] ldr x16, [x16] br x16 - .size bluegl_glGetVariantPointervEXT, .-bluegl_glGetVariantPointervEXT + .size bluegl_glTexCoordP4ui, .-bluegl_glTexCoordP4ui .align 2 - .global bluegl_glCheckFramebufferStatus - .type bluegl_glCheckFramebufferStatus, %function -bluegl_glCheckFramebufferStatus: - adrp x16, :got:__blue_glCore_glCheckFramebufferStatus - ldr x16, [x16, #:got_lo12:__blue_glCore_glCheckFramebufferStatus] + .global bluegl_glTexCoordP4uiv + .type bluegl_glTexCoordP4uiv, %function +bluegl_glTexCoordP4uiv: + adrp x16, :got:__blue_glCore_glTexCoordP4uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordP4uiv] ldr x16, [x16] br x16 - .size bluegl_glCheckFramebufferStatus, .-bluegl_glCheckFramebufferStatus + .size bluegl_glTexCoordP4uiv, .-bluegl_glTexCoordP4uiv .align 2 - .global bluegl_glMap1xOES - .type bluegl_glMap1xOES, %function -bluegl_glMap1xOES: - adrp x16, :got:__blue_glCore_glMap1xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMap1xOES] + .global bluegl_glMultiTexCoordP1ui + .type bluegl_glMultiTexCoordP1ui, %function +bluegl_glMultiTexCoordP1ui: + adrp x16, :got:__blue_glCore_glMultiTexCoordP1ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoordP1ui] ldr x16, [x16] br x16 - .size bluegl_glMap1xOES, .-bluegl_glMap1xOES + .size bluegl_glMultiTexCoordP1ui, .-bluegl_glMultiTexCoordP1ui .align 2 - .global bluegl_glBindSampler - .type bluegl_glBindSampler, %function -bluegl_glBindSampler: - adrp x16, :got:__blue_glCore_glBindSampler - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindSampler] + .global bluegl_glMultiTexCoordP1uiv + .type bluegl_glMultiTexCoordP1uiv, %function +bluegl_glMultiTexCoordP1uiv: + adrp x16, :got:__blue_glCore_glMultiTexCoordP1uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoordP1uiv] ldr x16, [x16] br x16 - .size bluegl_glBindSampler, .-bluegl_glBindSampler + .size bluegl_glMultiTexCoordP1uiv, .-bluegl_glMultiTexCoordP1uiv .align 2 - .global bluegl_glPathGlyphIndexRangeNV - .type bluegl_glPathGlyphIndexRangeNV, %function -bluegl_glPathGlyphIndexRangeNV: - adrp x16, :got:__blue_glCore_glPathGlyphIndexRangeNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathGlyphIndexRangeNV] + .global bluegl_glMultiTexCoordP2ui + .type bluegl_glMultiTexCoordP2ui, %function +bluegl_glMultiTexCoordP2ui: + adrp x16, :got:__blue_glCore_glMultiTexCoordP2ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoordP2ui] ldr x16, [x16] br x16 - .size bluegl_glPathGlyphIndexRangeNV, .-bluegl_glPathGlyphIndexRangeNV + .size bluegl_glMultiTexCoordP2ui, .-bluegl_glMultiTexCoordP2ui .align 2 - .global bluegl_glProgramEnvParameters4fvEXT - .type bluegl_glProgramEnvParameters4fvEXT, %function -bluegl_glProgramEnvParameters4fvEXT: - adrp x16, :got:__blue_glCore_glProgramEnvParameters4fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParameters4fvEXT] + .global bluegl_glMultiTexCoordP2uiv + .type bluegl_glMultiTexCoordP2uiv, %function +bluegl_glMultiTexCoordP2uiv: + adrp x16, :got:__blue_glCore_glMultiTexCoordP2uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoordP2uiv] ldr x16, [x16] br x16 - .size bluegl_glProgramEnvParameters4fvEXT, .-bluegl_glProgramEnvParameters4fvEXT + .size bluegl_glMultiTexCoordP2uiv, .-bluegl_glMultiTexCoordP2uiv .align 2 - .global bluegl_glVertexAttrib3fNV - .type bluegl_glVertexAttrib3fNV, %function -bluegl_glVertexAttrib3fNV: - adrp x16, :got:__blue_glCore_glVertexAttrib3fNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3fNV] + .global bluegl_glMultiTexCoordP3ui + .type bluegl_glMultiTexCoordP3ui, %function +bluegl_glMultiTexCoordP3ui: + adrp x16, :got:__blue_glCore_glMultiTexCoordP3ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoordP3ui] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3fNV, .-bluegl_glVertexAttrib3fNV + .size bluegl_glMultiTexCoordP3ui, .-bluegl_glMultiTexCoordP3ui .align 2 - .global bluegl_glBindBuffersBase - .type bluegl_glBindBuffersBase, %function -bluegl_glBindBuffersBase: - adrp x16, :got:__blue_glCore_glBindBuffersBase - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBuffersBase] + .global bluegl_glMultiTexCoordP3uiv + .type bluegl_glMultiTexCoordP3uiv, %function +bluegl_glMultiTexCoordP3uiv: + adrp x16, :got:__blue_glCore_glMultiTexCoordP3uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoordP3uiv] ldr x16, [x16] br x16 - .size bluegl_glBindBuffersBase, .-bluegl_glBindBuffersBase + .size bluegl_glMultiTexCoordP3uiv, .-bluegl_glMultiTexCoordP3uiv .align 2 - .global bluegl_glGetNamedProgramLocalParameterIivEXT - .type bluegl_glGetNamedProgramLocalParameterIivEXT, %function -bluegl_glGetNamedProgramLocalParameterIivEXT: - adrp x16, :got:__blue_glCore_glGetNamedProgramLocalParameterIivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedProgramLocalParameterIivEXT] + .global bluegl_glMultiTexCoordP4ui + .type bluegl_glMultiTexCoordP4ui, %function +bluegl_glMultiTexCoordP4ui: + adrp x16, :got:__blue_glCore_glMultiTexCoordP4ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoordP4ui] ldr x16, [x16] br x16 - .size bluegl_glGetNamedProgramLocalParameterIivEXT, .-bluegl_glGetNamedProgramLocalParameterIivEXT + .size bluegl_glMultiTexCoordP4ui, .-bluegl_glMultiTexCoordP4ui .align 2 - .global bluegl_glProgramUniform4d - .type bluegl_glProgramUniform4d, %function -bluegl_glProgramUniform4d: - adrp x16, :got:__blue_glCore_glProgramUniform4d - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4d] + .global bluegl_glMultiTexCoordP4uiv + .type bluegl_glMultiTexCoordP4uiv, %function +bluegl_glMultiTexCoordP4uiv: + adrp x16, :got:__blue_glCore_glMultiTexCoordP4uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoordP4uiv] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4d, .-bluegl_glProgramUniform4d + .size bluegl_glMultiTexCoordP4uiv, .-bluegl_glMultiTexCoordP4uiv .align 2 - .global bluegl_glMultiTexCoord3f - .type bluegl_glMultiTexCoord3f, %function -bluegl_glMultiTexCoord3f: - adrp x16, :got:__blue_glCore_glMultiTexCoord3f - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3f] + .global bluegl_glNormalP3ui + .type bluegl_glNormalP3ui, %function +bluegl_glNormalP3ui: + adrp x16, :got:__blue_glCore_glNormalP3ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalP3ui] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3f, .-bluegl_glMultiTexCoord3f + .size bluegl_glNormalP3ui, .-bluegl_glNormalP3ui .align 2 - .global bluegl_glDeleteProgram - .type bluegl_glDeleteProgram, %function -bluegl_glDeleteProgram: - adrp x16, :got:__blue_glCore_glDeleteProgram - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteProgram] + .global bluegl_glNormalP3uiv + .type bluegl_glNormalP3uiv, %function +bluegl_glNormalP3uiv: + adrp x16, :got:__blue_glCore_glNormalP3uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalP3uiv] ldr x16, [x16] br x16 - .size bluegl_glDeleteProgram, .-bluegl_glDeleteProgram + .size bluegl_glNormalP3uiv, .-bluegl_glNormalP3uiv .align 2 - .global bluegl_glReplacementCodeuiVertex3fvSUN - .type bluegl_glReplacementCodeuiVertex3fvSUN, %function -bluegl_glReplacementCodeuiVertex3fvSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeuiVertex3fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiVertex3fvSUN] + .global bluegl_glColorP3ui + .type bluegl_glColorP3ui, %function +bluegl_glColorP3ui: + adrp x16, :got:__blue_glCore_glColorP3ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorP3ui] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeuiVertex3fvSUN, .-bluegl_glReplacementCodeuiVertex3fvSUN + .size bluegl_glColorP3ui, .-bluegl_glColorP3ui .align 2 - .global bluegl_glMapNamedBufferRange - .type bluegl_glMapNamedBufferRange, %function -bluegl_glMapNamedBufferRange: - adrp x16, :got:__blue_glCore_glMapNamedBufferRange - ldr x16, [x16, #:got_lo12:__blue_glCore_glMapNamedBufferRange] + .global bluegl_glColorP3uiv + .type bluegl_glColorP3uiv, %function +bluegl_glColorP3uiv: + adrp x16, :got:__blue_glCore_glColorP3uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorP3uiv] ldr x16, [x16] br x16 - .size bluegl_glMapNamedBufferRange, .-bluegl_glMapNamedBufferRange + .size bluegl_glColorP3uiv, .-bluegl_glColorP3uiv .align 2 - .global bluegl_glFramebufferSampleLocationsfvARB - .type bluegl_glFramebufferSampleLocationsfvARB, %function -bluegl_glFramebufferSampleLocationsfvARB: - adrp x16, :got:__blue_glCore_glFramebufferSampleLocationsfvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferSampleLocationsfvARB] + .global bluegl_glColorP4ui + .type bluegl_glColorP4ui, %function +bluegl_glColorP4ui: + adrp x16, :got:__blue_glCore_glColorP4ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorP4ui] ldr x16, [x16] br x16 - .size bluegl_glFramebufferSampleLocationsfvARB, .-bluegl_glFramebufferSampleLocationsfvARB + .size bluegl_glColorP4ui, .-bluegl_glColorP4ui .align 2 - .global bluegl_glMultiTexCoord1dvARB - .type bluegl_glMultiTexCoord1dvARB, %function -bluegl_glMultiTexCoord1dvARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord1dvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1dvARB] + .global bluegl_glColorP4uiv + .type bluegl_glColorP4uiv, %function +bluegl_glColorP4uiv: + adrp x16, :got:__blue_glCore_glColorP4uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorP4uiv] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1dvARB, .-bluegl_glMultiTexCoord1dvARB + .size bluegl_glColorP4uiv, .-bluegl_glColorP4uiv .align 2 - .global bluegl_glClearBufferuiv - .type bluegl_glClearBufferuiv, %function -bluegl_glClearBufferuiv: - adrp x16, :got:__blue_glCore_glClearBufferuiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearBufferuiv] + .global bluegl_glSecondaryColorP3ui + .type bluegl_glSecondaryColorP3ui, %function +bluegl_glSecondaryColorP3ui: + adrp x16, :got:__blue_glCore_glSecondaryColorP3ui + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColorP3ui] ldr x16, [x16] br x16 - .size bluegl_glClearBufferuiv, .-bluegl_glClearBufferuiv + .size bluegl_glSecondaryColorP3ui, .-bluegl_glSecondaryColorP3ui .align 2 - .global bluegl_glDrawRangeElementsEXT - .type bluegl_glDrawRangeElementsEXT, %function -bluegl_glDrawRangeElementsEXT: - adrp x16, :got:__blue_glCore_glDrawRangeElementsEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawRangeElementsEXT] + .global bluegl_glSecondaryColorP3uiv + .type bluegl_glSecondaryColorP3uiv, %function +bluegl_glSecondaryColorP3uiv: + adrp x16, :got:__blue_glCore_glSecondaryColorP3uiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColorP3uiv] ldr x16, [x16] br x16 - .size bluegl_glDrawRangeElementsEXT, .-bluegl_glDrawRangeElementsEXT + .size bluegl_glSecondaryColorP3uiv, .-bluegl_glSecondaryColorP3uiv .align 2 - .global bluegl_glVertexAttrib1hvNV - .type bluegl_glVertexAttrib1hvNV, %function -bluegl_glVertexAttrib1hvNV: - adrp x16, :got:__blue_glCore_glVertexAttrib1hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1hvNV] + .global bluegl_glGetnMapdv + .type bluegl_glGetnMapdv, %function +bluegl_glGetnMapdv: + adrp x16, :got:__blue_glCore_glGetnMapdv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnMapdv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1hvNV, .-bluegl_glVertexAttrib1hvNV + .size bluegl_glGetnMapdv, .-bluegl_glGetnMapdv .align 2 - .global bluegl_glSecondaryColor3bv - .type bluegl_glSecondaryColor3bv, %function -bluegl_glSecondaryColor3bv: - adrp x16, :got:__blue_glCore_glSecondaryColor3bv - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3bv] + .global bluegl_glGetnMapfv + .type bluegl_glGetnMapfv, %function +bluegl_glGetnMapfv: + adrp x16, :got:__blue_glCore_glGetnMapfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnMapfv] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3bv, .-bluegl_glSecondaryColor3bv + .size bluegl_glGetnMapfv, .-bluegl_glGetnMapfv .align 2 - .global bluegl_glVDPAUMapSurfacesNV - .type bluegl_glVDPAUMapSurfacesNV, %function -bluegl_glVDPAUMapSurfacesNV: - adrp x16, :got:__blue_glCore_glVDPAUMapSurfacesNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAUMapSurfacesNV] + .global bluegl_glGetnMapiv + .type bluegl_glGetnMapiv, %function +bluegl_glGetnMapiv: + adrp x16, :got:__blue_glCore_glGetnMapiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnMapiv] ldr x16, [x16] br x16 - .size bluegl_glVDPAUMapSurfacesNV, .-bluegl_glVDPAUMapSurfacesNV + .size bluegl_glGetnMapiv, .-bluegl_glGetnMapiv .align 2 - .global bluegl_glStencilMask - .type bluegl_glStencilMask, %function -bluegl_glStencilMask: - adrp x16, :got:__blue_glCore_glStencilMask - ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilMask] + .global bluegl_glGetnPixelMapfv + .type bluegl_glGetnPixelMapfv, %function +bluegl_glGetnPixelMapfv: + adrp x16, :got:__blue_glCore_glGetnPixelMapfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnPixelMapfv] ldr x16, [x16] br x16 - .size bluegl_glStencilMask, .-bluegl_glStencilMask + .size bluegl_glGetnPixelMapfv, .-bluegl_glGetnPixelMapfv .align 2 - .global bluegl_glGetProgramResourceLocationIndex - .type bluegl_glGetProgramResourceLocationIndex, %function -bluegl_glGetProgramResourceLocationIndex: - adrp x16, :got:__blue_glCore_glGetProgramResourceLocationIndex - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramResourceLocationIndex] + .global bluegl_glGetnPixelMapuiv + .type bluegl_glGetnPixelMapuiv, %function +bluegl_glGetnPixelMapuiv: + adrp x16, :got:__blue_glCore_glGetnPixelMapuiv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnPixelMapuiv] ldr x16, [x16] br x16 - .size bluegl_glGetProgramResourceLocationIndex, .-bluegl_glGetProgramResourceLocationIndex + .size bluegl_glGetnPixelMapuiv, .-bluegl_glGetnPixelMapuiv .align 2 - .global bluegl_glGetIntegerui64i_vNV - .type bluegl_glGetIntegerui64i_vNV, %function -bluegl_glGetIntegerui64i_vNV: - adrp x16, :got:__blue_glCore_glGetIntegerui64i_vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetIntegerui64i_vNV] + .global bluegl_glGetnPixelMapusv + .type bluegl_glGetnPixelMapusv, %function +bluegl_glGetnPixelMapusv: + adrp x16, :got:__blue_glCore_glGetnPixelMapusv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnPixelMapusv] ldr x16, [x16] br x16 - .size bluegl_glGetIntegerui64i_vNV, .-bluegl_glGetIntegerui64i_vNV + .size bluegl_glGetnPixelMapusv, .-bluegl_glGetnPixelMapusv .align 2 - .global bluegl_glGetTextureLevelParameterfvEXT - .type bluegl_glGetTextureLevelParameterfvEXT, %function -bluegl_glGetTextureLevelParameterfvEXT: - adrp x16, :got:__blue_glCore_glGetTextureLevelParameterfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureLevelParameterfvEXT] + .global bluegl_glGetnPolygonStipple + .type bluegl_glGetnPolygonStipple, %function +bluegl_glGetnPolygonStipple: + adrp x16, :got:__blue_glCore_glGetnPolygonStipple + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnPolygonStipple] ldr x16, [x16] br x16 - .size bluegl_glGetTextureLevelParameterfvEXT, .-bluegl_glGetTextureLevelParameterfvEXT + .size bluegl_glGetnPolygonStipple, .-bluegl_glGetnPolygonStipple .align 2 - .global bluegl_glWindowPos3sv - .type bluegl_glWindowPos3sv, %function -bluegl_glWindowPos3sv: - adrp x16, :got:__blue_glCore_glWindowPos3sv - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3sv] + .global bluegl_glGetnColorTable + .type bluegl_glGetnColorTable, %function +bluegl_glGetnColorTable: + adrp x16, :got:__blue_glCore_glGetnColorTable + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnColorTable] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3sv, .-bluegl_glWindowPos3sv + .size bluegl_glGetnColorTable, .-bluegl_glGetnColorTable .align 2 - .global bluegl_glBlendEquationSeparatei - .type bluegl_glBlendEquationSeparatei, %function -bluegl_glBlendEquationSeparatei: - adrp x16, :got:__blue_glCore_glBlendEquationSeparatei - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquationSeparatei] + .global bluegl_glGetnConvolutionFilter + .type bluegl_glGetnConvolutionFilter, %function +bluegl_glGetnConvolutionFilter: + adrp x16, :got:__blue_glCore_glGetnConvolutionFilter + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnConvolutionFilter] ldr x16, [x16] br x16 - .size bluegl_glBlendEquationSeparatei, .-bluegl_glBlendEquationSeparatei + .size bluegl_glGetnConvolutionFilter, .-bluegl_glGetnConvolutionFilter .align 2 - .global bluegl_glGetInfoLogARB - .type bluegl_glGetInfoLogARB, %function -bluegl_glGetInfoLogARB: - adrp x16, :got:__blue_glCore_glGetInfoLogARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInfoLogARB] + .global bluegl_glGetnSeparableFilter + .type bluegl_glGetnSeparableFilter, %function +bluegl_glGetnSeparableFilter: + adrp x16, :got:__blue_glCore_glGetnSeparableFilter + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnSeparableFilter] ldr x16, [x16] br x16 - .size bluegl_glGetInfoLogARB, .-bluegl_glGetInfoLogARB + .size bluegl_glGetnSeparableFilter, .-bluegl_glGetnSeparableFilter .align 2 - .global bluegl_glProgramNamedParameter4fNV - .type bluegl_glProgramNamedParameter4fNV, %function -bluegl_glProgramNamedParameter4fNV: - adrp x16, :got:__blue_glCore_glProgramNamedParameter4fNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramNamedParameter4fNV] + .global bluegl_glGetnHistogram + .type bluegl_glGetnHistogram, %function +bluegl_glGetnHistogram: + adrp x16, :got:__blue_glCore_glGetnHistogram + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnHistogram] ldr x16, [x16] br x16 - .size bluegl_glProgramNamedParameter4fNV, .-bluegl_glProgramNamedParameter4fNV + .size bluegl_glGetnHistogram, .-bluegl_glGetnHistogram .align 2 - .global bluegl_glProgramParameter4fNV - .type bluegl_glProgramParameter4fNV, %function -bluegl_glProgramParameter4fNV: - adrp x16, :got:__blue_glCore_glProgramParameter4fNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramParameter4fNV] + .global bluegl_glGetnMinmax + .type bluegl_glGetnMinmax, %function +bluegl_glGetnMinmax: + adrp x16, :got:__blue_glCore_glGetnMinmax + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnMinmax] ldr x16, [x16] br x16 - .size bluegl_glProgramParameter4fNV, .-bluegl_glProgramParameter4fNV + .size bluegl_glGetnMinmax, .-bluegl_glGetnMinmax .align 2 - .global bluegl_glDeleteTextures - .type bluegl_glDeleteTextures, %function -bluegl_glDeleteTextures: - adrp x16, :got:__blue_glCore_glDeleteTextures - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteTextures] + .global bluegl_glPrimitiveBoundingBoxARB + .type bluegl_glPrimitiveBoundingBoxARB, %function +bluegl_glPrimitiveBoundingBoxARB: + adrp x16, :got:__blue_glCore_glPrimitiveBoundingBoxARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glPrimitiveBoundingBoxARB] + ldr x16, [x16] + br x16 + .size bluegl_glPrimitiveBoundingBoxARB, .-bluegl_glPrimitiveBoundingBoxARB + + .align 2 + .global bluegl_glClampColorARB + .type bluegl_glClampColorARB, %function +bluegl_glClampColorARB: + adrp x16, :got:__blue_glCore_glClampColorARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glClampColorARB] ldr x16, [x16] br x16 - .size bluegl_glDeleteTextures, .-bluegl_glDeleteTextures + .size bluegl_glClampColorARB, .-bluegl_glClampColorARB .align 2 - .global bluegl_glFramebufferDrawBuffersEXT - .type bluegl_glFramebufferDrawBuffersEXT, %function -bluegl_glFramebufferDrawBuffersEXT: - adrp x16, :got:__blue_glCore_glFramebufferDrawBuffersEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferDrawBuffersEXT] + .global bluegl_glDrawBuffersARB + .type bluegl_glDrawBuffersARB, %function +bluegl_glDrawBuffersARB: + adrp x16, :got:__blue_glCore_glDrawBuffersARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawBuffersARB] ldr x16, [x16] br x16 - .size bluegl_glFramebufferDrawBuffersEXT, .-bluegl_glFramebufferDrawBuffersEXT + .size bluegl_glDrawBuffersARB, .-bluegl_glDrawBuffersARB .align 2 - .global bluegl_glGetObjectLabelEXT - .type bluegl_glGetObjectLabelEXT, %function -bluegl_glGetObjectLabelEXT: - adrp x16, :got:__blue_glCore_glGetObjectLabelEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetObjectLabelEXT] + .global bluegl_glDrawArraysInstancedARB + .type bluegl_glDrawArraysInstancedARB, %function +bluegl_glDrawArraysInstancedARB: + adrp x16, :got:__blue_glCore_glDrawArraysInstancedARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawArraysInstancedARB] ldr x16, [x16] br x16 - .size bluegl_glGetObjectLabelEXT, .-bluegl_glGetObjectLabelEXT + .size bluegl_glDrawArraysInstancedARB, .-bluegl_glDrawArraysInstancedARB .align 2 - .global bluegl_glProgramUniform3ivEXT - .type bluegl_glProgramUniform3ivEXT, %function -bluegl_glProgramUniform3ivEXT: - adrp x16, :got:__blue_glCore_glProgramUniform3ivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3ivEXT] + .global bluegl_glDrawElementsInstancedARB + .type bluegl_glDrawElementsInstancedARB, %function +bluegl_glDrawElementsInstancedARB: + adrp x16, :got:__blue_glCore_glDrawElementsInstancedARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementsInstancedARB] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3ivEXT, .-bluegl_glProgramUniform3ivEXT + .size bluegl_glDrawElementsInstancedARB, .-bluegl_glDrawElementsInstancedARB .align 2 - .global bluegl_glTextureParameterIiv - .type bluegl_glTextureParameterIiv, %function -bluegl_glTextureParameterIiv: - adrp x16, :got:__blue_glCore_glTextureParameterIiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameterIiv] + .global bluegl_glProgramStringARB + .type bluegl_glProgramStringARB, %function +bluegl_glProgramStringARB: + adrp x16, :got:__blue_glCore_glProgramStringARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramStringARB] ldr x16, [x16] br x16 - .size bluegl_glTextureParameterIiv, .-bluegl_glTextureParameterIiv + .size bluegl_glProgramStringARB, .-bluegl_glProgramStringARB .align 2 - .global bluegl_glGetnUniformuiv - .type bluegl_glGetnUniformuiv, %function -bluegl_glGetnUniformuiv: - adrp x16, :got:__blue_glCore_glGetnUniformuiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformuiv] + .global bluegl_glBindProgramARB + .type bluegl_glBindProgramARB, %function +bluegl_glBindProgramARB: + adrp x16, :got:__blue_glCore_glBindProgramARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindProgramARB] ldr x16, [x16] br x16 - .size bluegl_glGetnUniformuiv, .-bluegl_glGetnUniformuiv + .size bluegl_glBindProgramARB, .-bluegl_glBindProgramARB .align 2 - .global bluegl_glMapObjectBufferATI - .type bluegl_glMapObjectBufferATI, %function -bluegl_glMapObjectBufferATI: - adrp x16, :got:__blue_glCore_glMapObjectBufferATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glMapObjectBufferATI] + .global bluegl_glDeleteProgramsARB + .type bluegl_glDeleteProgramsARB, %function +bluegl_glDeleteProgramsARB: + adrp x16, :got:__blue_glCore_glDeleteProgramsARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteProgramsARB] ldr x16, [x16] br x16 - .size bluegl_glMapObjectBufferATI, .-bluegl_glMapObjectBufferATI + .size bluegl_glDeleteProgramsARB, .-bluegl_glDeleteProgramsARB .align 2 - .global bluegl_glTangent3dvEXT - .type bluegl_glTangent3dvEXT, %function -bluegl_glTangent3dvEXT: - adrp x16, :got:__blue_glCore_glTangent3dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3dvEXT] + .global bluegl_glGenProgramsARB + .type bluegl_glGenProgramsARB, %function +bluegl_glGenProgramsARB: + adrp x16, :got:__blue_glCore_glGenProgramsARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenProgramsARB] ldr x16, [x16] br x16 - .size bluegl_glTangent3dvEXT, .-bluegl_glTangent3dvEXT + .size bluegl_glGenProgramsARB, .-bluegl_glGenProgramsARB .align 2 - .global bluegl_glProgramParameter4dNV - .type bluegl_glProgramParameter4dNV, %function -bluegl_glProgramParameter4dNV: - adrp x16, :got:__blue_glCore_glProgramParameter4dNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramParameter4dNV] + .global bluegl_glProgramEnvParameter4dARB + .type bluegl_glProgramEnvParameter4dARB, %function +bluegl_glProgramEnvParameter4dARB: + adrp x16, :got:__blue_glCore_glProgramEnvParameter4dARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParameter4dARB] ldr x16, [x16] br x16 - .size bluegl_glProgramParameter4dNV, .-bluegl_glProgramParameter4dNV + .size bluegl_glProgramEnvParameter4dARB, .-bluegl_glProgramEnvParameter4dARB .align 2 - .global bluegl_glGenVertexArraysAPPLE - .type bluegl_glGenVertexArraysAPPLE, %function -bluegl_glGenVertexArraysAPPLE: - adrp x16, :got:__blue_glCore_glGenVertexArraysAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenVertexArraysAPPLE] + .global bluegl_glProgramEnvParameter4dvARB + .type bluegl_glProgramEnvParameter4dvARB, %function +bluegl_glProgramEnvParameter4dvARB: + adrp x16, :got:__blue_glCore_glProgramEnvParameter4dvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParameter4dvARB] ldr x16, [x16] br x16 - .size bluegl_glGenVertexArraysAPPLE, .-bluegl_glGenVertexArraysAPPLE + .size bluegl_glProgramEnvParameter4dvARB, .-bluegl_glProgramEnvParameter4dvARB .align 2 - .global bluegl_glVertexAttrib4bvARB - .type bluegl_glVertexAttrib4bvARB, %function -bluegl_glVertexAttrib4bvARB: - adrp x16, :got:__blue_glCore_glVertexAttrib4bvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4bvARB] + .global bluegl_glProgramEnvParameter4fARB + .type bluegl_glProgramEnvParameter4fARB, %function +bluegl_glProgramEnvParameter4fARB: + adrp x16, :got:__blue_glCore_glProgramEnvParameter4fARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParameter4fARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4bvARB, .-bluegl_glVertexAttrib4bvARB + .size bluegl_glProgramEnvParameter4fARB, .-bluegl_glProgramEnvParameter4fARB .align 2 - .global bluegl_glVertexStream1dATI - .type bluegl_glVertexStream1dATI, %function -bluegl_glVertexStream1dATI: - adrp x16, :got:__blue_glCore_glVertexStream1dATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream1dATI] + .global bluegl_glProgramEnvParameter4fvARB + .type bluegl_glProgramEnvParameter4fvARB, %function +bluegl_glProgramEnvParameter4fvARB: + adrp x16, :got:__blue_glCore_glProgramEnvParameter4fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParameter4fvARB] ldr x16, [x16] br x16 - .size bluegl_glVertexStream1dATI, .-bluegl_glVertexStream1dATI + .size bluegl_glProgramEnvParameter4fvARB, .-bluegl_glProgramEnvParameter4fvARB .align 2 - .global bluegl_glMultiTexCoord2svARB - .type bluegl_glMultiTexCoord2svARB, %function -bluegl_glMultiTexCoord2svARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord2svARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2svARB] + .global bluegl_glProgramLocalParameter4dARB + .type bluegl_glProgramLocalParameter4dARB, %function +bluegl_glProgramLocalParameter4dARB: + adrp x16, :got:__blue_glCore_glProgramLocalParameter4dARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParameter4dARB] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2svARB, .-bluegl_glMultiTexCoord2svARB + .size bluegl_glProgramLocalParameter4dARB, .-bluegl_glProgramLocalParameter4dARB .align 2 - .global bluegl_glClearNamedBufferSubDataEXT - .type bluegl_glClearNamedBufferSubDataEXT, %function -bluegl_glClearNamedBufferSubDataEXT: - adrp x16, :got:__blue_glCore_glClearNamedBufferSubDataEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearNamedBufferSubDataEXT] + .global bluegl_glProgramLocalParameter4dvARB + .type bluegl_glProgramLocalParameter4dvARB, %function +bluegl_glProgramLocalParameter4dvARB: + adrp x16, :got:__blue_glCore_glProgramLocalParameter4dvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParameter4dvARB] ldr x16, [x16] br x16 - .size bluegl_glClearNamedBufferSubDataEXT, .-bluegl_glClearNamedBufferSubDataEXT + .size bluegl_glProgramLocalParameter4dvARB, .-bluegl_glProgramLocalParameter4dvARB .align 2 - .global bluegl_glCompressedTextureSubImage3D - .type bluegl_glCompressedTextureSubImage3D, %function -bluegl_glCompressedTextureSubImage3D: - adrp x16, :got:__blue_glCore_glCompressedTextureSubImage3D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTextureSubImage3D] + .global bluegl_glProgramLocalParameter4fARB + .type bluegl_glProgramLocalParameter4fARB, %function +bluegl_glProgramLocalParameter4fARB: + adrp x16, :got:__blue_glCore_glProgramLocalParameter4fARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParameter4fARB] ldr x16, [x16] br x16 - .size bluegl_glCompressedTextureSubImage3D, .-bluegl_glCompressedTextureSubImage3D + .size bluegl_glProgramLocalParameter4fARB, .-bluegl_glProgramLocalParameter4fARB .align 2 - .global bluegl_glVertexAttribI4iEXT - .type bluegl_glVertexAttribI4iEXT, %function -bluegl_glVertexAttribI4iEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI4iEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4iEXT] + .global bluegl_glProgramLocalParameter4fvARB + .type bluegl_glProgramLocalParameter4fvARB, %function +bluegl_glProgramLocalParameter4fvARB: + adrp x16, :got:__blue_glCore_glProgramLocalParameter4fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParameter4fvARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI4iEXT, .-bluegl_glVertexAttribI4iEXT + .size bluegl_glProgramLocalParameter4fvARB, .-bluegl_glProgramLocalParameter4fvARB .align 2 - .global bluegl_glGetnPixelMapfvARB - .type bluegl_glGetnPixelMapfvARB, %function -bluegl_glGetnPixelMapfvARB: - adrp x16, :got:__blue_glCore_glGetnPixelMapfvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnPixelMapfvARB] + .global bluegl_glGetProgramEnvParameterdvARB + .type bluegl_glGetProgramEnvParameterdvARB, %function +bluegl_glGetProgramEnvParameterdvARB: + adrp x16, :got:__blue_glCore_glGetProgramEnvParameterdvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramEnvParameterdvARB] ldr x16, [x16] br x16 - .size bluegl_glGetnPixelMapfvARB, .-bluegl_glGetnPixelMapfvARB + .size bluegl_glGetProgramEnvParameterdvARB, .-bluegl_glGetProgramEnvParameterdvARB .align 2 - .global bluegl_glVertexStream4iATI - .type bluegl_glVertexStream4iATI, %function -bluegl_glVertexStream4iATI: - adrp x16, :got:__blue_glCore_glVertexStream4iATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream4iATI] + .global bluegl_glGetProgramEnvParameterfvARB + .type bluegl_glGetProgramEnvParameterfvARB, %function +bluegl_glGetProgramEnvParameterfvARB: + adrp x16, :got:__blue_glCore_glGetProgramEnvParameterfvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramEnvParameterfvARB] ldr x16, [x16] br x16 - .size bluegl_glVertexStream4iATI, .-bluegl_glVertexStream4iATI + .size bluegl_glGetProgramEnvParameterfvARB, .-bluegl_glGetProgramEnvParameterfvARB .align 2 - .global bluegl_glMatrixMultTransposedEXT - .type bluegl_glMatrixMultTransposedEXT, %function -bluegl_glMatrixMultTransposedEXT: - adrp x16, :got:__blue_glCore_glMatrixMultTransposedEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixMultTransposedEXT] + .global bluegl_glGetProgramLocalParameterdvARB + .type bluegl_glGetProgramLocalParameterdvARB, %function +bluegl_glGetProgramLocalParameterdvARB: + adrp x16, :got:__blue_glCore_glGetProgramLocalParameterdvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramLocalParameterdvARB] ldr x16, [x16] br x16 - .size bluegl_glMatrixMultTransposedEXT, .-bluegl_glMatrixMultTransposedEXT + .size bluegl_glGetProgramLocalParameterdvARB, .-bluegl_glGetProgramLocalParameterdvARB .align 2 - .global bluegl_glDisableVariantClientStateEXT - .type bluegl_glDisableVariantClientStateEXT, %function -bluegl_glDisableVariantClientStateEXT: - adrp x16, :got:__blue_glCore_glDisableVariantClientStateEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableVariantClientStateEXT] + .global bluegl_glGetProgramLocalParameterfvARB + .type bluegl_glGetProgramLocalParameterfvARB, %function +bluegl_glGetProgramLocalParameterfvARB: + adrp x16, :got:__blue_glCore_glGetProgramLocalParameterfvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramLocalParameterfvARB] ldr x16, [x16] br x16 - .size bluegl_glDisableVariantClientStateEXT, .-bluegl_glDisableVariantClientStateEXT + .size bluegl_glGetProgramLocalParameterfvARB, .-bluegl_glGetProgramLocalParameterfvARB .align 2 - .global bluegl_glPrimitiveRestartNV - .type bluegl_glPrimitiveRestartNV, %function -bluegl_glPrimitiveRestartNV: - adrp x16, :got:__blue_glCore_glPrimitiveRestartNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPrimitiveRestartNV] + .global bluegl_glGetProgramivARB + .type bluegl_glGetProgramivARB, %function +bluegl_glGetProgramivARB: + adrp x16, :got:__blue_glCore_glGetProgramivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramivARB] ldr x16, [x16] br x16 - .size bluegl_glPrimitiveRestartNV, .-bluegl_glPrimitiveRestartNV + .size bluegl_glGetProgramivARB, .-bluegl_glGetProgramivARB .align 2 - .global bluegl_glVertexAttribP4uiv - .type bluegl_glVertexAttribP4uiv, %function -bluegl_glVertexAttribP4uiv: - adrp x16, :got:__blue_glCore_glVertexAttribP4uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribP4uiv] + .global bluegl_glGetProgramStringARB + .type bluegl_glGetProgramStringARB, %function +bluegl_glGetProgramStringARB: + adrp x16, :got:__blue_glCore_glGetProgramStringARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramStringARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribP4uiv, .-bluegl_glVertexAttribP4uiv + .size bluegl_glGetProgramStringARB, .-bluegl_glGetProgramStringARB .align 2 - .global bluegl_glProgramUniformMatrix2fv - .type bluegl_glProgramUniformMatrix2fv, %function -bluegl_glProgramUniformMatrix2fv: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix2fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2fv] + .global bluegl_glIsProgramARB + .type bluegl_glIsProgramARB, %function +bluegl_glIsProgramARB: + adrp x16, :got:__blue_glCore_glIsProgramARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsProgramARB] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix2fv, .-bluegl_glProgramUniformMatrix2fv + .size bluegl_glIsProgramARB, .-bluegl_glIsProgramARB .align 2 - .global bluegl_glPolygonOffsetEXT - .type bluegl_glPolygonOffsetEXT, %function -bluegl_glPolygonOffsetEXT: - adrp x16, :got:__blue_glCore_glPolygonOffsetEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glPolygonOffsetEXT] + .global bluegl_glProgramParameteriARB + .type bluegl_glProgramParameteriARB, %function +bluegl_glProgramParameteriARB: + adrp x16, :got:__blue_glCore_glProgramParameteriARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramParameteriARB] ldr x16, [x16] br x16 - .size bluegl_glPolygonOffsetEXT, .-bluegl_glPolygonOffsetEXT + .size bluegl_glProgramParameteriARB, .-bluegl_glProgramParameteriARB .align 2 - .global bluegl_glUseProgramObjectARB - .type bluegl_glUseProgramObjectARB, %function -bluegl_glUseProgramObjectARB: - adrp x16, :got:__blue_glCore_glUseProgramObjectARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUseProgramObjectARB] + .global bluegl_glFramebufferTextureARB + .type bluegl_glFramebufferTextureARB, %function +bluegl_glFramebufferTextureARB: + adrp x16, :got:__blue_glCore_glFramebufferTextureARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTextureARB] ldr x16, [x16] br x16 - .size bluegl_glUseProgramObjectARB, .-bluegl_glUseProgramObjectARB + .size bluegl_glFramebufferTextureARB, .-bluegl_glFramebufferTextureARB .align 2 - .global bluegl_glMatrixLoadfEXT - .type bluegl_glMatrixLoadfEXT, %function -bluegl_glMatrixLoadfEXT: - adrp x16, :got:__blue_glCore_glMatrixLoadfEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixLoadfEXT] + .global bluegl_glFramebufferTextureLayerARB + .type bluegl_glFramebufferTextureLayerARB, %function +bluegl_glFramebufferTextureLayerARB: + adrp x16, :got:__blue_glCore_glFramebufferTextureLayerARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTextureLayerARB] ldr x16, [x16] br x16 - .size bluegl_glMatrixLoadfEXT, .-bluegl_glMatrixLoadfEXT + .size bluegl_glFramebufferTextureLayerARB, .-bluegl_glFramebufferTextureLayerARB .align 2 - .global bluegl_glTextureSubImage1D - .type bluegl_glTextureSubImage1D, %function -bluegl_glTextureSubImage1D: - adrp x16, :got:__blue_glCore_glTextureSubImage1D - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureSubImage1D] + .global bluegl_glFramebufferTextureFaceARB + .type bluegl_glFramebufferTextureFaceARB, %function +bluegl_glFramebufferTextureFaceARB: + adrp x16, :got:__blue_glCore_glFramebufferTextureFaceARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTextureFaceARB] ldr x16, [x16] br x16 - .size bluegl_glTextureSubImage1D, .-bluegl_glTextureSubImage1D + .size bluegl_glFramebufferTextureFaceARB, .-bluegl_glFramebufferTextureFaceARB .align 2 - .global bluegl_glHistogramEXT - .type bluegl_glHistogramEXT, %function -bluegl_glHistogramEXT: - adrp x16, :got:__blue_glCore_glHistogramEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glHistogramEXT] + .global bluegl_glUniform1i64ARB + .type bluegl_glUniform1i64ARB, %function +bluegl_glUniform1i64ARB: + adrp x16, :got:__blue_glCore_glUniform1i64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1i64ARB] ldr x16, [x16] br x16 - .size bluegl_glHistogramEXT, .-bluegl_glHistogramEXT + .size bluegl_glUniform1i64ARB, .-bluegl_glUniform1i64ARB .align 2 - .global bluegl_glProgramUniform1ivEXT - .type bluegl_glProgramUniform1ivEXT, %function -bluegl_glProgramUniform1ivEXT: - adrp x16, :got:__blue_glCore_glProgramUniform1ivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1ivEXT] + .global bluegl_glUniform2i64ARB + .type bluegl_glUniform2i64ARB, %function +bluegl_glUniform2i64ARB: + adrp x16, :got:__blue_glCore_glUniform2i64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2i64ARB] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1ivEXT, .-bluegl_glProgramUniform1ivEXT + .size bluegl_glUniform2i64ARB, .-bluegl_glUniform2i64ARB .align 2 - .global bluegl_glGetBufferParameterivARB - .type bluegl_glGetBufferParameterivARB, %function -bluegl_glGetBufferParameterivARB: - adrp x16, :got:__blue_glCore_glGetBufferParameterivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBufferParameterivARB] + .global bluegl_glUniform3i64ARB + .type bluegl_glUniform3i64ARB, %function +bluegl_glUniform3i64ARB: + adrp x16, :got:__blue_glCore_glUniform3i64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3i64ARB] ldr x16, [x16] br x16 - .size bluegl_glGetBufferParameterivARB, .-bluegl_glGetBufferParameterivARB + .size bluegl_glUniform3i64ARB, .-bluegl_glUniform3i64ARB .align 2 - .global bluegl_glStringMarkerGREMEDY - .type bluegl_glStringMarkerGREMEDY, %function -bluegl_glStringMarkerGREMEDY: - adrp x16, :got:__blue_glCore_glStringMarkerGREMEDY - ldr x16, [x16, #:got_lo12:__blue_glCore_glStringMarkerGREMEDY] + .global bluegl_glUniform4i64ARB + .type bluegl_glUniform4i64ARB, %function +bluegl_glUniform4i64ARB: + adrp x16, :got:__blue_glCore_glUniform4i64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4i64ARB] ldr x16, [x16] br x16 - .size bluegl_glStringMarkerGREMEDY, .-bluegl_glStringMarkerGREMEDY + .size bluegl_glUniform4i64ARB, .-bluegl_glUniform4i64ARB .align 2 - .global bluegl_glGetnMapfv - .type bluegl_glGetnMapfv, %function -bluegl_glGetnMapfv: - adrp x16, :got:__blue_glCore_glGetnMapfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnMapfv] + .global bluegl_glUniform1i64vARB + .type bluegl_glUniform1i64vARB, %function +bluegl_glUniform1i64vARB: + adrp x16, :got:__blue_glCore_glUniform1i64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1i64vARB] ldr x16, [x16] br x16 - .size bluegl_glGetnMapfv, .-bluegl_glGetnMapfv + .size bluegl_glUniform1i64vARB, .-bluegl_glUniform1i64vARB .align 2 - .global bluegl_glMultiTexCoord3dvARB - .type bluegl_glMultiTexCoord3dvARB, %function -bluegl_glMultiTexCoord3dvARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord3dvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3dvARB] + .global bluegl_glUniform2i64vARB + .type bluegl_glUniform2i64vARB, %function +bluegl_glUniform2i64vARB: + adrp x16, :got:__blue_glCore_glUniform2i64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2i64vARB] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3dvARB, .-bluegl_glMultiTexCoord3dvARB + .size bluegl_glUniform2i64vARB, .-bluegl_glUniform2i64vARB .align 2 - .global bluegl_glFinishTextureSUNX - .type bluegl_glFinishTextureSUNX, %function -bluegl_glFinishTextureSUNX: - adrp x16, :got:__blue_glCore_glFinishTextureSUNX - ldr x16, [x16, #:got_lo12:__blue_glCore_glFinishTextureSUNX] + .global bluegl_glUniform3i64vARB + .type bluegl_glUniform3i64vARB, %function +bluegl_glUniform3i64vARB: + adrp x16, :got:__blue_glCore_glUniform3i64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3i64vARB] ldr x16, [x16] br x16 - .size bluegl_glFinishTextureSUNX, .-bluegl_glFinishTextureSUNX + .size bluegl_glUniform3i64vARB, .-bluegl_glUniform3i64vARB .align 2 - .global bluegl_glWindowPos3dARB - .type bluegl_glWindowPos3dARB, %function -bluegl_glWindowPos3dARB: - adrp x16, :got:__blue_glCore_glWindowPos3dARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3dARB] + .global bluegl_glUniform4i64vARB + .type bluegl_glUniform4i64vARB, %function +bluegl_glUniform4i64vARB: + adrp x16, :got:__blue_glCore_glUniform4i64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4i64vARB] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3dARB, .-bluegl_glWindowPos3dARB + .size bluegl_glUniform4i64vARB, .-bluegl_glUniform4i64vARB .align 2 - .global bluegl_glNamedBufferStorageEXT - .type bluegl_glNamedBufferStorageEXT, %function -bluegl_glNamedBufferStorageEXT: - adrp x16, :got:__blue_glCore_glNamedBufferStorageEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedBufferStorageEXT] + .global bluegl_glUniform1ui64ARB + .type bluegl_glUniform1ui64ARB, %function +bluegl_glUniform1ui64ARB: + adrp x16, :got:__blue_glCore_glUniform1ui64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1ui64ARB] ldr x16, [x16] br x16 - .size bluegl_glNamedBufferStorageEXT, .-bluegl_glNamedBufferStorageEXT + .size bluegl_glUniform1ui64ARB, .-bluegl_glUniform1ui64ARB .align 2 - .global bluegl_glIndexPointerListIBM - .type bluegl_glIndexPointerListIBM, %function -bluegl_glIndexPointerListIBM: - adrp x16, :got:__blue_glCore_glIndexPointerListIBM - ldr x16, [x16, #:got_lo12:__blue_glCore_glIndexPointerListIBM] + .global bluegl_glUniform2ui64ARB + .type bluegl_glUniform2ui64ARB, %function +bluegl_glUniform2ui64ARB: + adrp x16, :got:__blue_glCore_glUniform2ui64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2ui64ARB] ldr x16, [x16] br x16 - .size bluegl_glIndexPointerListIBM, .-bluegl_glIndexPointerListIBM + .size bluegl_glUniform2ui64ARB, .-bluegl_glUniform2ui64ARB .align 2 - .global bluegl_glColor3fVertex3fSUN - .type bluegl_glColor3fVertex3fSUN, %function -bluegl_glColor3fVertex3fSUN: - adrp x16, :got:__blue_glCore_glColor3fVertex3fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glColor3fVertex3fSUN] + .global bluegl_glUniform3ui64ARB + .type bluegl_glUniform3ui64ARB, %function +bluegl_glUniform3ui64ARB: + adrp x16, :got:__blue_glCore_glUniform3ui64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3ui64ARB] ldr x16, [x16] br x16 - .size bluegl_glColor3fVertex3fSUN, .-bluegl_glColor3fVertex3fSUN + .size bluegl_glUniform3ui64ARB, .-bluegl_glUniform3ui64ARB .align 2 - .global bluegl_glDepthRangefOES - .type bluegl_glDepthRangefOES, %function -bluegl_glDepthRangefOES: - adrp x16, :got:__blue_glCore_glDepthRangefOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthRangefOES] + .global bluegl_glUniform4ui64ARB + .type bluegl_glUniform4ui64ARB, %function +bluegl_glUniform4ui64ARB: + adrp x16, :got:__blue_glCore_glUniform4ui64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4ui64ARB] ldr x16, [x16] br x16 - .size bluegl_glDepthRangefOES, .-bluegl_glDepthRangefOES + .size bluegl_glUniform4ui64ARB, .-bluegl_glUniform4ui64ARB .align 2 - .global bluegl_glVertexBlendEnvfATI - .type bluegl_glVertexBlendEnvfATI, %function -bluegl_glVertexBlendEnvfATI: - adrp x16, :got:__blue_glCore_glVertexBlendEnvfATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexBlendEnvfATI] + .global bluegl_glUniform1ui64vARB + .type bluegl_glUniform1ui64vARB, %function +bluegl_glUniform1ui64vARB: + adrp x16, :got:__blue_glCore_glUniform1ui64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1ui64vARB] ldr x16, [x16] br x16 - .size bluegl_glVertexBlendEnvfATI, .-bluegl_glVertexBlendEnvfATI + .size bluegl_glUniform1ui64vARB, .-bluegl_glUniform1ui64vARB .align 2 - .global bluegl_glMultiTexCoord1hvNV - .type bluegl_glMultiTexCoord1hvNV, %function -bluegl_glMultiTexCoord1hvNV: - adrp x16, :got:__blue_glCore_glMultiTexCoord1hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1hvNV] + .global bluegl_glUniform2ui64vARB + .type bluegl_glUniform2ui64vARB, %function +bluegl_glUniform2ui64vARB: + adrp x16, :got:__blue_glCore_glUniform2ui64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2ui64vARB] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1hvNV, .-bluegl_glMultiTexCoord1hvNV + .size bluegl_glUniform2ui64vARB, .-bluegl_glUniform2ui64vARB .align 2 - .global bluegl_glGetPixelTexGenParameterfvSGIS - .type bluegl_glGetPixelTexGenParameterfvSGIS, %function -bluegl_glGetPixelTexGenParameterfvSGIS: - adrp x16, :got:__blue_glCore_glGetPixelTexGenParameterfvSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPixelTexGenParameterfvSGIS] + .global bluegl_glUniform3ui64vARB + .type bluegl_glUniform3ui64vARB, %function +bluegl_glUniform3ui64vARB: + adrp x16, :got:__blue_glCore_glUniform3ui64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3ui64vARB] ldr x16, [x16] br x16 - .size bluegl_glGetPixelTexGenParameterfvSGIS, .-bluegl_glGetPixelTexGenParameterfvSGIS + .size bluegl_glUniform3ui64vARB, .-bluegl_glUniform3ui64vARB .align 2 - .global bluegl_glDisableClientStateIndexedEXT - .type bluegl_glDisableClientStateIndexedEXT, %function -bluegl_glDisableClientStateIndexedEXT: - adrp x16, :got:__blue_glCore_glDisableClientStateIndexedEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableClientStateIndexedEXT] + .global bluegl_glUniform4ui64vARB + .type bluegl_glUniform4ui64vARB, %function +bluegl_glUniform4ui64vARB: + adrp x16, :got:__blue_glCore_glUniform4ui64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4ui64vARB] ldr x16, [x16] br x16 - .size bluegl_glDisableClientStateIndexedEXT, .-bluegl_glDisableClientStateIndexedEXT + .size bluegl_glUniform4ui64vARB, .-bluegl_glUniform4ui64vARB .align 2 - .global bluegl_glProgramUniform1ui64NV - .type bluegl_glProgramUniform1ui64NV, %function -bluegl_glProgramUniform1ui64NV: - adrp x16, :got:__blue_glCore_glProgramUniform1ui64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1ui64NV] + .global bluegl_glGetUniformi64vARB + .type bluegl_glGetUniformi64vARB, %function +bluegl_glGetUniformi64vARB: + adrp x16, :got:__blue_glCore_glGetUniformi64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformi64vARB] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1ui64NV, .-bluegl_glProgramUniform1ui64NV + .size bluegl_glGetUniformi64vARB, .-bluegl_glGetUniformi64vARB .align 2 - .global bluegl_glMultiTexCoord1dv - .type bluegl_glMultiTexCoord1dv, %function -bluegl_glMultiTexCoord1dv: - adrp x16, :got:__blue_glCore_glMultiTexCoord1dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1dv] + .global bluegl_glGetUniformui64vARB + .type bluegl_glGetUniformui64vARB, %function +bluegl_glGetUniformui64vARB: + adrp x16, :got:__blue_glCore_glGetUniformui64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformui64vARB] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1dv, .-bluegl_glMultiTexCoord1dv + .size bluegl_glGetUniformui64vARB, .-bluegl_glGetUniformui64vARB .align 2 - .global bluegl_glMultiTexCoord1ivARB - .type bluegl_glMultiTexCoord1ivARB, %function -bluegl_glMultiTexCoord1ivARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord1ivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1ivARB] + .global bluegl_glGetnUniformi64vARB + .type bluegl_glGetnUniformi64vARB, %function +bluegl_glGetnUniformi64vARB: + adrp x16, :got:__blue_glCore_glGetnUniformi64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformi64vARB] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1ivARB, .-bluegl_glMultiTexCoord1ivARB + .size bluegl_glGetnUniformi64vARB, .-bluegl_glGetnUniformi64vARB .align 2 - .global bluegl_glMapVertexAttrib1dAPPLE - .type bluegl_glMapVertexAttrib1dAPPLE, %function -bluegl_glMapVertexAttrib1dAPPLE: - adrp x16, :got:__blue_glCore_glMapVertexAttrib1dAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glMapVertexAttrib1dAPPLE] + .global bluegl_glGetnUniformui64vARB + .type bluegl_glGetnUniformui64vARB, %function +bluegl_glGetnUniformui64vARB: + adrp x16, :got:__blue_glCore_glGetnUniformui64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformui64vARB] ldr x16, [x16] br x16 - .size bluegl_glMapVertexAttrib1dAPPLE, .-bluegl_glMapVertexAttrib1dAPPLE + .size bluegl_glGetnUniformui64vARB, .-bluegl_glGetnUniformui64vARB .align 2 - .global bluegl_glGetPerfQueryIdByNameINTEL - .type bluegl_glGetPerfQueryIdByNameINTEL, %function -bluegl_glGetPerfQueryIdByNameINTEL: - adrp x16, :got:__blue_glCore_glGetPerfQueryIdByNameINTEL - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfQueryIdByNameINTEL] + .global bluegl_glProgramUniform1i64ARB + .type bluegl_glProgramUniform1i64ARB, %function +bluegl_glProgramUniform1i64ARB: + adrp x16, :got:__blue_glCore_glProgramUniform1i64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1i64ARB] ldr x16, [x16] br x16 - .size bluegl_glGetPerfQueryIdByNameINTEL, .-bluegl_glGetPerfQueryIdByNameINTEL + .size bluegl_glProgramUniform1i64ARB, .-bluegl_glProgramUniform1i64ARB .align 2 - .global bluegl_glUniform2ui64vNV - .type bluegl_glUniform2ui64vNV, %function -bluegl_glUniform2ui64vNV: - adrp x16, :got:__blue_glCore_glUniform2ui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2ui64vNV] + .global bluegl_glProgramUniform2i64ARB + .type bluegl_glProgramUniform2i64ARB, %function +bluegl_glProgramUniform2i64ARB: + adrp x16, :got:__blue_glCore_glProgramUniform2i64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2i64ARB] ldr x16, [x16] br x16 - .size bluegl_glUniform2ui64vNV, .-bluegl_glUniform2ui64vNV + .size bluegl_glProgramUniform2i64ARB, .-bluegl_glProgramUniform2i64ARB .align 2 - .global bluegl_glGetSharpenTexFuncSGIS - .type bluegl_glGetSharpenTexFuncSGIS, %function -bluegl_glGetSharpenTexFuncSGIS: - adrp x16, :got:__blue_glCore_glGetSharpenTexFuncSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSharpenTexFuncSGIS] + .global bluegl_glProgramUniform3i64ARB + .type bluegl_glProgramUniform3i64ARB, %function +bluegl_glProgramUniform3i64ARB: + adrp x16, :got:__blue_glCore_glProgramUniform3i64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3i64ARB] ldr x16, [x16] br x16 - .size bluegl_glGetSharpenTexFuncSGIS, .-bluegl_glGetSharpenTexFuncSGIS + .size bluegl_glProgramUniform3i64ARB, .-bluegl_glProgramUniform3i64ARB .align 2 - .global bluegl_glBindImageTexture - .type bluegl_glBindImageTexture, %function -bluegl_glBindImageTexture: - adrp x16, :got:__blue_glCore_glBindImageTexture - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindImageTexture] + .global bluegl_glProgramUniform4i64ARB + .type bluegl_glProgramUniform4i64ARB, %function +bluegl_glProgramUniform4i64ARB: + adrp x16, :got:__blue_glCore_glProgramUniform4i64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4i64ARB] ldr x16, [x16] br x16 - .size bluegl_glBindImageTexture, .-bluegl_glBindImageTexture + .size bluegl_glProgramUniform4i64ARB, .-bluegl_glProgramUniform4i64ARB .align 2 - .global bluegl_glProgramEnvParameter4dvARB - .type bluegl_glProgramEnvParameter4dvARB, %function -bluegl_glProgramEnvParameter4dvARB: - adrp x16, :got:__blue_glCore_glProgramEnvParameter4dvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParameter4dvARB] + .global bluegl_glProgramUniform1i64vARB + .type bluegl_glProgramUniform1i64vARB, %function +bluegl_glProgramUniform1i64vARB: + adrp x16, :got:__blue_glCore_glProgramUniform1i64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1i64vARB] ldr x16, [x16] br x16 - .size bluegl_glProgramEnvParameter4dvARB, .-bluegl_glProgramEnvParameter4dvARB + .size bluegl_glProgramUniform1i64vARB, .-bluegl_glProgramUniform1i64vARB .align 2 - .global bluegl_glDeleteFramebuffers - .type bluegl_glDeleteFramebuffers, %function -bluegl_glDeleteFramebuffers: - adrp x16, :got:__blue_glCore_glDeleteFramebuffers - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteFramebuffers] + .global bluegl_glProgramUniform2i64vARB + .type bluegl_glProgramUniform2i64vARB, %function +bluegl_glProgramUniform2i64vARB: + adrp x16, :got:__blue_glCore_glProgramUniform2i64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2i64vARB] ldr x16, [x16] br x16 - .size bluegl_glDeleteFramebuffers, .-bluegl_glDeleteFramebuffers + .size bluegl_glProgramUniform2i64vARB, .-bluegl_glProgramUniform2i64vARB .align 2 - .global bluegl_glVertexArrayVertexOffsetEXT - .type bluegl_glVertexArrayVertexOffsetEXT, %function -bluegl_glVertexArrayVertexOffsetEXT: - adrp x16, :got:__blue_glCore_glVertexArrayVertexOffsetEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexOffsetEXT] + .global bluegl_glProgramUniform3i64vARB + .type bluegl_glProgramUniform3i64vARB, %function +bluegl_glProgramUniform3i64vARB: + adrp x16, :got:__blue_glCore_glProgramUniform3i64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3i64vARB] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayVertexOffsetEXT, .-bluegl_glVertexArrayVertexOffsetEXT + .size bluegl_glProgramUniform3i64vARB, .-bluegl_glProgramUniform3i64vARB .align 2 - .global bluegl_glProgramLocalParameters4fvEXT - .type bluegl_glProgramLocalParameters4fvEXT, %function -bluegl_glProgramLocalParameters4fvEXT: - adrp x16, :got:__blue_glCore_glProgramLocalParameters4fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParameters4fvEXT] + .global bluegl_glProgramUniform4i64vARB + .type bluegl_glProgramUniform4i64vARB, %function +bluegl_glProgramUniform4i64vARB: + adrp x16, :got:__blue_glCore_glProgramUniform4i64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4i64vARB] ldr x16, [x16] br x16 - .size bluegl_glProgramLocalParameters4fvEXT, .-bluegl_glProgramLocalParameters4fvEXT + .size bluegl_glProgramUniform4i64vARB, .-bluegl_glProgramUniform4i64vARB .align 2 - .global bluegl_glFogCoordFormatNV - .type bluegl_glFogCoordFormatNV, %function -bluegl_glFogCoordFormatNV: - adrp x16, :got:__blue_glCore_glFogCoordFormatNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordFormatNV] + .global bluegl_glProgramUniform1ui64ARB + .type bluegl_glProgramUniform1ui64ARB, %function +bluegl_glProgramUniform1ui64ARB: + adrp x16, :got:__blue_glCore_glProgramUniform1ui64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1ui64ARB] ldr x16, [x16] br x16 - .size bluegl_glFogCoordFormatNV, .-bluegl_glFogCoordFormatNV + .size bluegl_glProgramUniform1ui64ARB, .-bluegl_glProgramUniform1ui64ARB .align 2 - .global bluegl_glGenQueries - .type bluegl_glGenQueries, %function -bluegl_glGenQueries: - adrp x16, :got:__blue_glCore_glGenQueries - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenQueries] + .global bluegl_glProgramUniform2ui64ARB + .type bluegl_glProgramUniform2ui64ARB, %function +bluegl_glProgramUniform2ui64ARB: + adrp x16, :got:__blue_glCore_glProgramUniform2ui64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2ui64ARB] ldr x16, [x16] br x16 - .size bluegl_glGenQueries, .-bluegl_glGenQueries + .size bluegl_glProgramUniform2ui64ARB, .-bluegl_glProgramUniform2ui64ARB .align 2 - .global bluegl_glVertexAttribL4dEXT - .type bluegl_glVertexAttribL4dEXT, %function -bluegl_glVertexAttribL4dEXT: - adrp x16, :got:__blue_glCore_glVertexAttribL4dEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL4dEXT] + .global bluegl_glProgramUniform3ui64ARB + .type bluegl_glProgramUniform3ui64ARB, %function +bluegl_glProgramUniform3ui64ARB: + adrp x16, :got:__blue_glCore_glProgramUniform3ui64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3ui64ARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL4dEXT, .-bluegl_glVertexAttribL4dEXT + .size bluegl_glProgramUniform3ui64ARB, .-bluegl_glProgramUniform3ui64ARB .align 2 - .global bluegl_glMultiTexCoord4fvARB - .type bluegl_glMultiTexCoord4fvARB, %function -bluegl_glMultiTexCoord4fvARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord4fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4fvARB] + .global bluegl_glProgramUniform4ui64ARB + .type bluegl_glProgramUniform4ui64ARB, %function +bluegl_glProgramUniform4ui64ARB: + adrp x16, :got:__blue_glCore_glProgramUniform4ui64ARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4ui64ARB] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4fvARB, .-bluegl_glMultiTexCoord4fvARB + .size bluegl_glProgramUniform4ui64ARB, .-bluegl_glProgramUniform4ui64ARB .align 2 - .global bluegl_glPixelZoomxOES - .type bluegl_glPixelZoomxOES, %function -bluegl_glPixelZoomxOES: - adrp x16, :got:__blue_glCore_glPixelZoomxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelZoomxOES] + .global bluegl_glProgramUniform1ui64vARB + .type bluegl_glProgramUniform1ui64vARB, %function +bluegl_glProgramUniform1ui64vARB: + adrp x16, :got:__blue_glCore_glProgramUniform1ui64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1ui64vARB] ldr x16, [x16] br x16 - .size bluegl_glPixelZoomxOES, .-bluegl_glPixelZoomxOES + .size bluegl_glProgramUniform1ui64vARB, .-bluegl_glProgramUniform1ui64vARB .align 2 - .global bluegl_glCopyTexSubImage3D - .type bluegl_glCopyTexSubImage3D, %function -bluegl_glCopyTexSubImage3D: - adrp x16, :got:__blue_glCore_glCopyTexSubImage3D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexSubImage3D] + .global bluegl_glProgramUniform2ui64vARB + .type bluegl_glProgramUniform2ui64vARB, %function +bluegl_glProgramUniform2ui64vARB: + adrp x16, :got:__blue_glCore_glProgramUniform2ui64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2ui64vARB] ldr x16, [x16] br x16 - .size bluegl_glCopyTexSubImage3D, .-bluegl_glCopyTexSubImage3D + .size bluegl_glProgramUniform2ui64vARB, .-bluegl_glProgramUniform2ui64vARB .align 2 - .global bluegl_glUniform1ui64vARB - .type bluegl_glUniform1ui64vARB, %function -bluegl_glUniform1ui64vARB: - adrp x16, :got:__blue_glCore_glUniform1ui64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1ui64vARB] + .global bluegl_glProgramUniform3ui64vARB + .type bluegl_glProgramUniform3ui64vARB, %function +bluegl_glProgramUniform3ui64vARB: + adrp x16, :got:__blue_glCore_glProgramUniform3ui64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3ui64vARB] ldr x16, [x16] br x16 - .size bluegl_glUniform1ui64vARB, .-bluegl_glUniform1ui64vARB + .size bluegl_glProgramUniform3ui64vARB, .-bluegl_glProgramUniform3ui64vARB .align 2 - .global bluegl_glGetMapControlPointsNV - .type bluegl_glGetMapControlPointsNV, %function -bluegl_glGetMapControlPointsNV: - adrp x16, :got:__blue_glCore_glGetMapControlPointsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMapControlPointsNV] + .global bluegl_glProgramUniform4ui64vARB + .type bluegl_glProgramUniform4ui64vARB, %function +bluegl_glProgramUniform4ui64vARB: + adrp x16, :got:__blue_glCore_glProgramUniform4ui64vARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4ui64vARB] ldr x16, [x16] br x16 - .size bluegl_glGetMapControlPointsNV, .-bluegl_glGetMapControlPointsNV + .size bluegl_glProgramUniform4ui64vARB, .-bluegl_glProgramUniform4ui64vARB .align 2 - .global bluegl_glLightEnviSGIX - .type bluegl_glLightEnviSGIX, %function -bluegl_glLightEnviSGIX: - adrp x16, :got:__blue_glCore_glLightEnviSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glLightEnviSGIX] + .global bluegl_glColorTable + .type bluegl_glColorTable, %function +bluegl_glColorTable: + adrp x16, :got:__blue_glCore_glColorTable + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorTable] + ldr x16, [x16] + br x16 + .size bluegl_glColorTable, .-bluegl_glColorTable + + .align 2 + .global bluegl_glColorTableParameterfv + .type bluegl_glColorTableParameterfv, %function +bluegl_glColorTableParameterfv: + adrp x16, :got:__blue_glCore_glColorTableParameterfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorTableParameterfv] ldr x16, [x16] br x16 - .size bluegl_glLightEnviSGIX, .-bluegl_glLightEnviSGIX + .size bluegl_glColorTableParameterfv, .-bluegl_glColorTableParameterfv .align 2 - .global bluegl_glVertexAttrib4Nbv - .type bluegl_glVertexAttrib4Nbv, %function -bluegl_glVertexAttrib4Nbv: - adrp x16, :got:__blue_glCore_glVertexAttrib4Nbv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4Nbv] + .global bluegl_glColorTableParameteriv + .type bluegl_glColorTableParameteriv, %function +bluegl_glColorTableParameteriv: + adrp x16, :got:__blue_glCore_glColorTableParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorTableParameteriv] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4Nbv, .-bluegl_glVertexAttrib4Nbv + .size bluegl_glColorTableParameteriv, .-bluegl_glColorTableParameteriv .align 2 - .global bluegl_glDrawBuffer - .type bluegl_glDrawBuffer, %function -bluegl_glDrawBuffer: - adrp x16, :got:__blue_glCore_glDrawBuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawBuffer] + .global bluegl_glCopyColorTable + .type bluegl_glCopyColorTable, %function +bluegl_glCopyColorTable: + adrp x16, :got:__blue_glCore_glCopyColorTable + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyColorTable] ldr x16, [x16] br x16 - .size bluegl_glDrawBuffer, .-bluegl_glDrawBuffer + .size bluegl_glCopyColorTable, .-bluegl_glCopyColorTable .align 2 - .global bluegl_glDrawTransformFeedbackStream - .type bluegl_glDrawTransformFeedbackStream, %function -bluegl_glDrawTransformFeedbackStream: - adrp x16, :got:__blue_glCore_glDrawTransformFeedbackStream - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawTransformFeedbackStream] + .global bluegl_glGetColorTable + .type bluegl_glGetColorTable, %function +bluegl_glGetColorTable: + adrp x16, :got:__blue_glCore_glGetColorTable + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetColorTable] ldr x16, [x16] br x16 - .size bluegl_glDrawTransformFeedbackStream, .-bluegl_glDrawTransformFeedbackStream + .size bluegl_glGetColorTable, .-bluegl_glGetColorTable .align 2 - .global bluegl_glDisableClientStateiEXT - .type bluegl_glDisableClientStateiEXT, %function -bluegl_glDisableClientStateiEXT: - adrp x16, :got:__blue_glCore_glDisableClientStateiEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableClientStateiEXT] + .global bluegl_glGetColorTableParameterfv + .type bluegl_glGetColorTableParameterfv, %function +bluegl_glGetColorTableParameterfv: + adrp x16, :got:__blue_glCore_glGetColorTableParameterfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetColorTableParameterfv] ldr x16, [x16] br x16 - .size bluegl_glDisableClientStateiEXT, .-bluegl_glDisableClientStateiEXT + .size bluegl_glGetColorTableParameterfv, .-bluegl_glGetColorTableParameterfv .align 2 - .global bluegl_glFramebufferTexture3D - .type bluegl_glFramebufferTexture3D, %function -bluegl_glFramebufferTexture3D: - adrp x16, :got:__blue_glCore_glFramebufferTexture3D - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTexture3D] + .global bluegl_glGetColorTableParameteriv + .type bluegl_glGetColorTableParameteriv, %function +bluegl_glGetColorTableParameteriv: + adrp x16, :got:__blue_glCore_glGetColorTableParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetColorTableParameteriv] ldr x16, [x16] br x16 - .size bluegl_glFramebufferTexture3D, .-bluegl_glFramebufferTexture3D + .size bluegl_glGetColorTableParameteriv, .-bluegl_glGetColorTableParameteriv .align 2 - .global bluegl_glTextureColorMaskSGIS - .type bluegl_glTextureColorMaskSGIS, %function -bluegl_glTextureColorMaskSGIS: - adrp x16, :got:__blue_glCore_glTextureColorMaskSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureColorMaskSGIS] + .global bluegl_glColorSubTable + .type bluegl_glColorSubTable, %function +bluegl_glColorSubTable: + adrp x16, :got:__blue_glCore_glColorSubTable + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorSubTable] ldr x16, [x16] br x16 - .size bluegl_glTextureColorMaskSGIS, .-bluegl_glTextureColorMaskSGIS + .size bluegl_glColorSubTable, .-bluegl_glColorSubTable .align 2 - .global bluegl_glCullFace - .type bluegl_glCullFace, %function -bluegl_glCullFace: - adrp x16, :got:__blue_glCore_glCullFace - ldr x16, [x16, #:got_lo12:__blue_glCore_glCullFace] + .global bluegl_glCopyColorSubTable + .type bluegl_glCopyColorSubTable, %function +bluegl_glCopyColorSubTable: + adrp x16, :got:__blue_glCore_glCopyColorSubTable + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyColorSubTable] ldr x16, [x16] br x16 - .size bluegl_glCullFace, .-bluegl_glCullFace + .size bluegl_glCopyColorSubTable, .-bluegl_glCopyColorSubTable .align 2 - .global bluegl_glGetNamedBufferSubData - .type bluegl_glGetNamedBufferSubData, %function -bluegl_glGetNamedBufferSubData: - adrp x16, :got:__blue_glCore_glGetNamedBufferSubData - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedBufferSubData] + .global bluegl_glConvolutionFilter1D + .type bluegl_glConvolutionFilter1D, %function +bluegl_glConvolutionFilter1D: + adrp x16, :got:__blue_glCore_glConvolutionFilter1D + ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionFilter1D] ldr x16, [x16] br x16 - .size bluegl_glGetNamedBufferSubData, .-bluegl_glGetNamedBufferSubData + .size bluegl_glConvolutionFilter1D, .-bluegl_glConvolutionFilter1D .align 2 - .global bluegl_glDispatchCompute - .type bluegl_glDispatchCompute, %function -bluegl_glDispatchCompute: - adrp x16, :got:__blue_glCore_glDispatchCompute - ldr x16, [x16, #:got_lo12:__blue_glCore_glDispatchCompute] + .global bluegl_glConvolutionFilter2D + .type bluegl_glConvolutionFilter2D, %function +bluegl_glConvolutionFilter2D: + adrp x16, :got:__blue_glCore_glConvolutionFilter2D + ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionFilter2D] ldr x16, [x16] br x16 - .size bluegl_glDispatchCompute, .-bluegl_glDispatchCompute + .size bluegl_glConvolutionFilter2D, .-bluegl_glConvolutionFilter2D .align 2 - .global bluegl_glInvalidateFramebuffer - .type bluegl_glInvalidateFramebuffer, %function -bluegl_glInvalidateFramebuffer: - adrp x16, :got:__blue_glCore_glInvalidateFramebuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glInvalidateFramebuffer] + .global bluegl_glConvolutionParameterf + .type bluegl_glConvolutionParameterf, %function +bluegl_glConvolutionParameterf: + adrp x16, :got:__blue_glCore_glConvolutionParameterf + ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameterf] ldr x16, [x16] br x16 - .size bluegl_glInvalidateFramebuffer, .-bluegl_glInvalidateFramebuffer + .size bluegl_glConvolutionParameterf, .-bluegl_glConvolutionParameterf .align 2 - .global bluegl_glDebugMessageControl - .type bluegl_glDebugMessageControl, %function -bluegl_glDebugMessageControl: - adrp x16, :got:__blue_glCore_glDebugMessageControl - ldr x16, [x16, #:got_lo12:__blue_glCore_glDebugMessageControl] + .global bluegl_glConvolutionParameterfv + .type bluegl_glConvolutionParameterfv, %function +bluegl_glConvolutionParameterfv: + adrp x16, :got:__blue_glCore_glConvolutionParameterfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameterfv] ldr x16, [x16] br x16 - .size bluegl_glDebugMessageControl, .-bluegl_glDebugMessageControl + .size bluegl_glConvolutionParameterfv, .-bluegl_glConvolutionParameterfv .align 2 - .global bluegl_glProgramUniformMatrix3dv - .type bluegl_glProgramUniformMatrix3dv, %function -bluegl_glProgramUniformMatrix3dv: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix3dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3dv] + .global bluegl_glConvolutionParameteri + .type bluegl_glConvolutionParameteri, %function +bluegl_glConvolutionParameteri: + adrp x16, :got:__blue_glCore_glConvolutionParameteri + ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameteri] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix3dv, .-bluegl_glProgramUniformMatrix3dv + .size bluegl_glConvolutionParameteri, .-bluegl_glConvolutionParameteri .align 2 - .global bluegl_glSecondaryColor3ui - .type bluegl_glSecondaryColor3ui, %function -bluegl_glSecondaryColor3ui: - adrp x16, :got:__blue_glCore_glSecondaryColor3ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3ui] + .global bluegl_glConvolutionParameteriv + .type bluegl_glConvolutionParameteriv, %function +bluegl_glConvolutionParameteriv: + adrp x16, :got:__blue_glCore_glConvolutionParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameteriv] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3ui, .-bluegl_glSecondaryColor3ui + .size bluegl_glConvolutionParameteriv, .-bluegl_glConvolutionParameteriv .align 2 - .global bluegl_glShaderStorageBlockBinding - .type bluegl_glShaderStorageBlockBinding, %function -bluegl_glShaderStorageBlockBinding: - adrp x16, :got:__blue_glCore_glShaderStorageBlockBinding - ldr x16, [x16, #:got_lo12:__blue_glCore_glShaderStorageBlockBinding] + .global bluegl_glCopyConvolutionFilter1D + .type bluegl_glCopyConvolutionFilter1D, %function +bluegl_glCopyConvolutionFilter1D: + adrp x16, :got:__blue_glCore_glCopyConvolutionFilter1D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyConvolutionFilter1D] ldr x16, [x16] br x16 - .size bluegl_glShaderStorageBlockBinding, .-bluegl_glShaderStorageBlockBinding + .size bluegl_glCopyConvolutionFilter1D, .-bluegl_glCopyConvolutionFilter1D .align 2 - .global bluegl_glUniformMatrix3fvARB - .type bluegl_glUniformMatrix3fvARB, %function -bluegl_glUniformMatrix3fvARB: - adrp x16, :got:__blue_glCore_glUniformMatrix3fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix3fvARB] + .global bluegl_glCopyConvolutionFilter2D + .type bluegl_glCopyConvolutionFilter2D, %function +bluegl_glCopyConvolutionFilter2D: + adrp x16, :got:__blue_glCore_glCopyConvolutionFilter2D + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyConvolutionFilter2D] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix3fvARB, .-bluegl_glUniformMatrix3fvARB + .size bluegl_glCopyConvolutionFilter2D, .-bluegl_glCopyConvolutionFilter2D .align 2 - .global bluegl_glGetUniformOffsetEXT - .type bluegl_glGetUniformOffsetEXT, %function -bluegl_glGetUniformOffsetEXT: - adrp x16, :got:__blue_glCore_glGetUniformOffsetEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformOffsetEXT] + .global bluegl_glGetConvolutionFilter + .type bluegl_glGetConvolutionFilter, %function +bluegl_glGetConvolutionFilter: + adrp x16, :got:__blue_glCore_glGetConvolutionFilter + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetConvolutionFilter] ldr x16, [x16] br x16 - .size bluegl_glGetUniformOffsetEXT, .-bluegl_glGetUniformOffsetEXT + .size bluegl_glGetConvolutionFilter, .-bluegl_glGetConvolutionFilter .align 2 - .global bluegl_glBinormal3fvEXT - .type bluegl_glBinormal3fvEXT, %function -bluegl_glBinormal3fvEXT: - adrp x16, :got:__blue_glCore_glBinormal3fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3fvEXT] + .global bluegl_glGetConvolutionParameterfv + .type bluegl_glGetConvolutionParameterfv, %function +bluegl_glGetConvolutionParameterfv: + adrp x16, :got:__blue_glCore_glGetConvolutionParameterfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetConvolutionParameterfv] ldr x16, [x16] br x16 - .size bluegl_glBinormal3fvEXT, .-bluegl_glBinormal3fvEXT + .size bluegl_glGetConvolutionParameterfv, .-bluegl_glGetConvolutionParameterfv .align 2 - .global bluegl_glMultiTexCoordPointerEXT - .type bluegl_glMultiTexCoordPointerEXT, %function -bluegl_glMultiTexCoordPointerEXT: - adrp x16, :got:__blue_glCore_glMultiTexCoordPointerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoordPointerEXT] + .global bluegl_glGetConvolutionParameteriv + .type bluegl_glGetConvolutionParameteriv, %function +bluegl_glGetConvolutionParameteriv: + adrp x16, :got:__blue_glCore_glGetConvolutionParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetConvolutionParameteriv] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoordPointerEXT, .-bluegl_glMultiTexCoordPointerEXT + .size bluegl_glGetConvolutionParameteriv, .-bluegl_glGetConvolutionParameteriv .align 2 - .global bluegl_glVertexAttrib4sv - .type bluegl_glVertexAttrib4sv, %function -bluegl_glVertexAttrib4sv: - adrp x16, :got:__blue_glCore_glVertexAttrib4sv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4sv] + .global bluegl_glGetSeparableFilter + .type bluegl_glGetSeparableFilter, %function +bluegl_glGetSeparableFilter: + adrp x16, :got:__blue_glCore_glGetSeparableFilter + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSeparableFilter] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4sv, .-bluegl_glVertexAttrib4sv + .size bluegl_glGetSeparableFilter, .-bluegl_glGetSeparableFilter .align 2 - .global bluegl_glMatrixIndexubvARB - .type bluegl_glMatrixIndexubvARB, %function -bluegl_glMatrixIndexubvARB: - adrp x16, :got:__blue_glCore_glMatrixIndexubvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixIndexubvARB] + .global bluegl_glSeparableFilter2D + .type bluegl_glSeparableFilter2D, %function +bluegl_glSeparableFilter2D: + adrp x16, :got:__blue_glCore_glSeparableFilter2D + ldr x16, [x16, #:got_lo12:__blue_glCore_glSeparableFilter2D] ldr x16, [x16] br x16 - .size bluegl_glMatrixIndexubvARB, .-bluegl_glMatrixIndexubvARB + .size bluegl_glSeparableFilter2D, .-bluegl_glSeparableFilter2D .align 2 - .global bluegl_glProgramUniform4ivEXT - .type bluegl_glProgramUniform4ivEXT, %function -bluegl_glProgramUniform4ivEXT: - adrp x16, :got:__blue_glCore_glProgramUniform4ivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4ivEXT] + .global bluegl_glGetHistogram + .type bluegl_glGetHistogram, %function +bluegl_glGetHistogram: + adrp x16, :got:__blue_glCore_glGetHistogram + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetHistogram] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4ivEXT, .-bluegl_glProgramUniform4ivEXT + .size bluegl_glGetHistogram, .-bluegl_glGetHistogram .align 2 - .global bluegl_glWindowPos4dMESA - .type bluegl_glWindowPos4dMESA, %function -bluegl_glWindowPos4dMESA: - adrp x16, :got:__blue_glCore_glWindowPos4dMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos4dMESA] + .global bluegl_glGetHistogramParameterfv + .type bluegl_glGetHistogramParameterfv, %function +bluegl_glGetHistogramParameterfv: + adrp x16, :got:__blue_glCore_glGetHistogramParameterfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetHistogramParameterfv] ldr x16, [x16] br x16 - .size bluegl_glWindowPos4dMESA, .-bluegl_glWindowPos4dMESA + .size bluegl_glGetHistogramParameterfv, .-bluegl_glGetHistogramParameterfv .align 2 - .global bluegl_glMultiDrawElementsIndirectCountARB - .type bluegl_glMultiDrawElementsIndirectCountARB, %function -bluegl_glMultiDrawElementsIndirectCountARB: - adrp x16, :got:__blue_glCore_glMultiDrawElementsIndirectCountARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawElementsIndirectCountARB] + .global bluegl_glGetHistogramParameteriv + .type bluegl_glGetHistogramParameteriv, %function +bluegl_glGetHistogramParameteriv: + adrp x16, :got:__blue_glCore_glGetHistogramParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetHistogramParameteriv] ldr x16, [x16] br x16 - .size bluegl_glMultiDrawElementsIndirectCountARB, .-bluegl_glMultiDrawElementsIndirectCountARB + .size bluegl_glGetHistogramParameteriv, .-bluegl_glGetHistogramParameteriv .align 2 - .global bluegl_glUniformMatrix4fvARB - .type bluegl_glUniformMatrix4fvARB, %function -bluegl_glUniformMatrix4fvARB: - adrp x16, :got:__blue_glCore_glUniformMatrix4fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix4fvARB] + .global bluegl_glGetMinmax + .type bluegl_glGetMinmax, %function +bluegl_glGetMinmax: + adrp x16, :got:__blue_glCore_glGetMinmax + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMinmax] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix4fvARB, .-bluegl_glUniformMatrix4fvARB + .size bluegl_glGetMinmax, .-bluegl_glGetMinmax .align 2 - .global bluegl_glBindImageTextureEXT - .type bluegl_glBindImageTextureEXT, %function -bluegl_glBindImageTextureEXT: - adrp x16, :got:__blue_glCore_glBindImageTextureEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindImageTextureEXT] + .global bluegl_glGetMinmaxParameterfv + .type bluegl_glGetMinmaxParameterfv, %function +bluegl_glGetMinmaxParameterfv: + adrp x16, :got:__blue_glCore_glGetMinmaxParameterfv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMinmaxParameterfv] ldr x16, [x16] br x16 - .size bluegl_glBindImageTextureEXT, .-bluegl_glBindImageTextureEXT + .size bluegl_glGetMinmaxParameterfv, .-bluegl_glGetMinmaxParameterfv .align 2 - .global bluegl_glResolveDepthValuesNV - .type bluegl_glResolveDepthValuesNV, %function -bluegl_glResolveDepthValuesNV: - adrp x16, :got:__blue_glCore_glResolveDepthValuesNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glResolveDepthValuesNV] + .global bluegl_glGetMinmaxParameteriv + .type bluegl_glGetMinmaxParameteriv, %function +bluegl_glGetMinmaxParameteriv: + adrp x16, :got:__blue_glCore_glGetMinmaxParameteriv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMinmaxParameteriv] ldr x16, [x16] br x16 - .size bluegl_glResolveDepthValuesNV, .-bluegl_glResolveDepthValuesNV + .size bluegl_glGetMinmaxParameteriv, .-bluegl_glGetMinmaxParameteriv .align 2 - .global bluegl_glColor3fVertex3fvSUN - .type bluegl_glColor3fVertex3fvSUN, %function -bluegl_glColor3fVertex3fvSUN: - adrp x16, :got:__blue_glCore_glColor3fVertex3fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glColor3fVertex3fvSUN] + .global bluegl_glHistogram + .type bluegl_glHistogram, %function +bluegl_glHistogram: + adrp x16, :got:__blue_glCore_glHistogram + ldr x16, [x16, #:got_lo12:__blue_glCore_glHistogram] ldr x16, [x16] br x16 - .size bluegl_glColor3fVertex3fvSUN, .-bluegl_glColor3fVertex3fvSUN + .size bluegl_glHistogram, .-bluegl_glHistogram .align 2 - .global bluegl_glCompressedTexImage1D - .type bluegl_glCompressedTexImage1D, %function -bluegl_glCompressedTexImage1D: - adrp x16, :got:__blue_glCore_glCompressedTexImage1D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexImage1D] + .global bluegl_glMinmax + .type bluegl_glMinmax, %function +bluegl_glMinmax: + adrp x16, :got:__blue_glCore_glMinmax + ldr x16, [x16, #:got_lo12:__blue_glCore_glMinmax] ldr x16, [x16] br x16 - .size bluegl_glCompressedTexImage1D, .-bluegl_glCompressedTexImage1D + .size bluegl_glMinmax, .-bluegl_glMinmax .align 2 - .global bluegl_glGetnUniformdvARB - .type bluegl_glGetnUniformdvARB, %function -bluegl_glGetnUniformdvARB: - adrp x16, :got:__blue_glCore_glGetnUniformdvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformdvARB] + .global bluegl_glResetHistogram + .type bluegl_glResetHistogram, %function +bluegl_glResetHistogram: + adrp x16, :got:__blue_glCore_glResetHistogram + ldr x16, [x16, #:got_lo12:__blue_glCore_glResetHistogram] ldr x16, [x16] br x16 - .size bluegl_glGetnUniformdvARB, .-bluegl_glGetnUniformdvARB + .size bluegl_glResetHistogram, .-bluegl_glResetHistogram .align 2 - .global bluegl_glUniform1ui64vNV - .type bluegl_glUniform1ui64vNV, %function -bluegl_glUniform1ui64vNV: - adrp x16, :got:__blue_glCore_glUniform1ui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1ui64vNV] + .global bluegl_glResetMinmax + .type bluegl_glResetMinmax, %function +bluegl_glResetMinmax: + adrp x16, :got:__blue_glCore_glResetMinmax + ldr x16, [x16, #:got_lo12:__blue_glCore_glResetMinmax] ldr x16, [x16] br x16 - .size bluegl_glUniform1ui64vNV, .-bluegl_glUniform1ui64vNV + .size bluegl_glResetMinmax, .-bluegl_glResetMinmax .align 2 - .global bluegl_glProgramEnvParameterI4uiNV - .type bluegl_glProgramEnvParameterI4uiNV, %function -bluegl_glProgramEnvParameterI4uiNV: - adrp x16, :got:__blue_glCore_glProgramEnvParameterI4uiNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParameterI4uiNV] + .global bluegl_glVertexAttribDivisorARB + .type bluegl_glVertexAttribDivisorARB, %function +bluegl_glVertexAttribDivisorARB: + adrp x16, :got:__blue_glCore_glVertexAttribDivisorARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribDivisorARB] ldr x16, [x16] br x16 - .size bluegl_glProgramEnvParameterI4uiNV, .-bluegl_glProgramEnvParameterI4uiNV + .size bluegl_glVertexAttribDivisorARB, .-bluegl_glVertexAttribDivisorARB .align 2 - .global bluegl_glVertexAttrib4ubNV - .type bluegl_glVertexAttrib4ubNV, %function -bluegl_glVertexAttrib4ubNV: - adrp x16, :got:__blue_glCore_glVertexAttrib4ubNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4ubNV] + .global bluegl_glCurrentPaletteMatrixARB + .type bluegl_glCurrentPaletteMatrixARB, %function +bluegl_glCurrentPaletteMatrixARB: + adrp x16, :got:__blue_glCore_glCurrentPaletteMatrixARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glCurrentPaletteMatrixARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4ubNV, .-bluegl_glVertexAttrib4ubNV + .size bluegl_glCurrentPaletteMatrixARB, .-bluegl_glCurrentPaletteMatrixARB .align 2 - .global bluegl_glGenAsyncMarkersSGIX - .type bluegl_glGenAsyncMarkersSGIX, %function -bluegl_glGenAsyncMarkersSGIX: - adrp x16, :got:__blue_glCore_glGenAsyncMarkersSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenAsyncMarkersSGIX] + .global bluegl_glMatrixIndexubvARB + .type bluegl_glMatrixIndexubvARB, %function +bluegl_glMatrixIndexubvARB: + adrp x16, :got:__blue_glCore_glMatrixIndexubvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixIndexubvARB] ldr x16, [x16] br x16 - .size bluegl_glGenAsyncMarkersSGIX, .-bluegl_glGenAsyncMarkersSGIX + .size bluegl_glMatrixIndexubvARB, .-bluegl_glMatrixIndexubvARB .align 2 - .global bluegl_glVertexBindingDivisor - .type bluegl_glVertexBindingDivisor, %function -bluegl_glVertexBindingDivisor: - adrp x16, :got:__blue_glCore_glVertexBindingDivisor - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexBindingDivisor] + .global bluegl_glMatrixIndexusvARB + .type bluegl_glMatrixIndexusvARB, %function +bluegl_glMatrixIndexusvARB: + adrp x16, :got:__blue_glCore_glMatrixIndexusvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixIndexusvARB] ldr x16, [x16] br x16 - .size bluegl_glVertexBindingDivisor, .-bluegl_glVertexBindingDivisor + .size bluegl_glMatrixIndexusvARB, .-bluegl_glMatrixIndexusvARB .align 2 - .global bluegl_glCreateShaderProgramv - .type bluegl_glCreateShaderProgramv, %function -bluegl_glCreateShaderProgramv: - adrp x16, :got:__blue_glCore_glCreateShaderProgramv - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateShaderProgramv] + .global bluegl_glMatrixIndexuivARB + .type bluegl_glMatrixIndexuivARB, %function +bluegl_glMatrixIndexuivARB: + adrp x16, :got:__blue_glCore_glMatrixIndexuivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixIndexuivARB] ldr x16, [x16] br x16 - .size bluegl_glCreateShaderProgramv, .-bluegl_glCreateShaderProgramv + .size bluegl_glMatrixIndexuivARB, .-bluegl_glMatrixIndexuivARB .align 2 - .global bluegl_glBindBufferARB - .type bluegl_glBindBufferARB, %function -bluegl_glBindBufferARB: - adrp x16, :got:__blue_glCore_glBindBufferARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBufferARB] + .global bluegl_glMatrixIndexPointerARB + .type bluegl_glMatrixIndexPointerARB, %function +bluegl_glMatrixIndexPointerARB: + adrp x16, :got:__blue_glCore_glMatrixIndexPointerARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixIndexPointerARB] ldr x16, [x16] br x16 - .size bluegl_glBindBufferARB, .-bluegl_glBindBufferARB + .size bluegl_glMatrixIndexPointerARB, .-bluegl_glMatrixIndexPointerARB .align 2 - .global bluegl_glColor4ubVertex2fvSUN - .type bluegl_glColor4ubVertex2fvSUN, %function -bluegl_glColor4ubVertex2fvSUN: - adrp x16, :got:__blue_glCore_glColor4ubVertex2fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4ubVertex2fvSUN] + .global bluegl_glSampleCoverageARB + .type bluegl_glSampleCoverageARB, %function +bluegl_glSampleCoverageARB: + adrp x16, :got:__blue_glCore_glSampleCoverageARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glSampleCoverageARB] ldr x16, [x16] br x16 - .size bluegl_glColor4ubVertex2fvSUN, .-bluegl_glColor4ubVertex2fvSUN + .size bluegl_glSampleCoverageARB, .-bluegl_glSampleCoverageARB .align 2 - .global bluegl_glResetHistogram - .type bluegl_glResetHistogram, %function -bluegl_glResetHistogram: - adrp x16, :got:__blue_glCore_glResetHistogram - ldr x16, [x16, #:got_lo12:__blue_glCore_glResetHistogram] + .global bluegl_glActiveTextureARB + .type bluegl_glActiveTextureARB, %function +bluegl_glActiveTextureARB: + adrp x16, :got:__blue_glCore_glActiveTextureARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glActiveTextureARB] ldr x16, [x16] br x16 - .size bluegl_glResetHistogram, .-bluegl_glResetHistogram + .size bluegl_glActiveTextureARB, .-bluegl_glActiveTextureARB .align 2 - .global bluegl_glGetProgramResourceLocation - .type bluegl_glGetProgramResourceLocation, %function -bluegl_glGetProgramResourceLocation: - adrp x16, :got:__blue_glCore_glGetProgramResourceLocation - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramResourceLocation] + .global bluegl_glClientActiveTextureARB + .type bluegl_glClientActiveTextureARB, %function +bluegl_glClientActiveTextureARB: + adrp x16, :got:__blue_glCore_glClientActiveTextureARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glClientActiveTextureARB] ldr x16, [x16] br x16 - .size bluegl_glGetProgramResourceLocation, .-bluegl_glGetProgramResourceLocation + .size bluegl_glClientActiveTextureARB, .-bluegl_glClientActiveTextureARB .align 2 - .global bluegl_glBlendFuncSeparateiARB - .type bluegl_glBlendFuncSeparateiARB, %function -bluegl_glBlendFuncSeparateiARB: - adrp x16, :got:__blue_glCore_glBlendFuncSeparateiARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFuncSeparateiARB] + .global bluegl_glMultiTexCoord1dARB + .type bluegl_glMultiTexCoord1dARB, %function +bluegl_glMultiTexCoord1dARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord1dARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1dARB] ldr x16, [x16] br x16 - .size bluegl_glBlendFuncSeparateiARB, .-bluegl_glBlendFuncSeparateiARB + .size bluegl_glMultiTexCoord1dARB, .-bluegl_glMultiTexCoord1dARB .align 2 - .global bluegl_glBinormalPointerEXT - .type bluegl_glBinormalPointerEXT, %function -bluegl_glBinormalPointerEXT: - adrp x16, :got:__blue_glCore_glBinormalPointerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormalPointerEXT] + .global bluegl_glMultiTexCoord1dvARB + .type bluegl_glMultiTexCoord1dvARB, %function +bluegl_glMultiTexCoord1dvARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord1dvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1dvARB] ldr x16, [x16] br x16 - .size bluegl_glBinormalPointerEXT, .-bluegl_glBinormalPointerEXT + .size bluegl_glMultiTexCoord1dvARB, .-bluegl_glMultiTexCoord1dvARB .align 2 - .global bluegl_glVertexAttrib2svNV - .type bluegl_glVertexAttrib2svNV, %function -bluegl_glVertexAttrib2svNV: - adrp x16, :got:__blue_glCore_glVertexAttrib2svNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2svNV] + .global bluegl_glMultiTexCoord1fARB + .type bluegl_glMultiTexCoord1fARB, %function +bluegl_glMultiTexCoord1fARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord1fARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1fARB] + ldr x16, [x16] + br x16 + .size bluegl_glMultiTexCoord1fARB, .-bluegl_glMultiTexCoord1fARB + + .align 2 + .global bluegl_glMultiTexCoord1fvARB + .type bluegl_glMultiTexCoord1fvARB, %function +bluegl_glMultiTexCoord1fvARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord1fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1fvARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2svNV, .-bluegl_glVertexAttrib2svNV + .size bluegl_glMultiTexCoord1fvARB, .-bluegl_glMultiTexCoord1fvARB .align 2 - .global bluegl_glProgramUniform2i64vNV - .type bluegl_glProgramUniform2i64vNV, %function -bluegl_glProgramUniform2i64vNV: - adrp x16, :got:__blue_glCore_glProgramUniform2i64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2i64vNV] + .global bluegl_glMultiTexCoord1iARB + .type bluegl_glMultiTexCoord1iARB, %function +bluegl_glMultiTexCoord1iARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord1iARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1iARB] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2i64vNV, .-bluegl_glProgramUniform2i64vNV + .size bluegl_glMultiTexCoord1iARB, .-bluegl_glMultiTexCoord1iARB .align 2 - .global bluegl_glTextureNormalEXT - .type bluegl_glTextureNormalEXT, %function -bluegl_glTextureNormalEXT: - adrp x16, :got:__blue_glCore_glTextureNormalEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureNormalEXT] + .global bluegl_glMultiTexCoord1ivARB + .type bluegl_glMultiTexCoord1ivARB, %function +bluegl_glMultiTexCoord1ivARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord1ivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1ivARB] ldr x16, [x16] br x16 - .size bluegl_glTextureNormalEXT, .-bluegl_glTextureNormalEXT + .size bluegl_glMultiTexCoord1ivARB, .-bluegl_glMultiTexCoord1ivARB .align 2 - .global bluegl_glFlushMappedBufferRangeAPPLE - .type bluegl_glFlushMappedBufferRangeAPPLE, %function -bluegl_glFlushMappedBufferRangeAPPLE: - adrp x16, :got:__blue_glCore_glFlushMappedBufferRangeAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glFlushMappedBufferRangeAPPLE] + .global bluegl_glMultiTexCoord1sARB + .type bluegl_glMultiTexCoord1sARB, %function +bluegl_glMultiTexCoord1sARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord1sARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1sARB] ldr x16, [x16] br x16 - .size bluegl_glFlushMappedBufferRangeAPPLE, .-bluegl_glFlushMappedBufferRangeAPPLE + .size bluegl_glMultiTexCoord1sARB, .-bluegl_glMultiTexCoord1sARB .align 2 - .global bluegl_glSecondaryColor3dv - .type bluegl_glSecondaryColor3dv, %function -bluegl_glSecondaryColor3dv: - adrp x16, :got:__blue_glCore_glSecondaryColor3dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3dv] + .global bluegl_glMultiTexCoord1svARB + .type bluegl_glMultiTexCoord1svARB, %function +bluegl_glMultiTexCoord1svARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord1svARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1svARB] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3dv, .-bluegl_glSecondaryColor3dv + .size bluegl_glMultiTexCoord1svARB, .-bluegl_glMultiTexCoord1svARB .align 2 - .global bluegl_glColorP3uiv - .type bluegl_glColorP3uiv, %function -bluegl_glColorP3uiv: - adrp x16, :got:__blue_glCore_glColorP3uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorP3uiv] + .global bluegl_glMultiTexCoord2dARB + .type bluegl_glMultiTexCoord2dARB, %function +bluegl_glMultiTexCoord2dARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord2dARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2dARB] ldr x16, [x16] br x16 - .size bluegl_glColorP3uiv, .-bluegl_glColorP3uiv + .size bluegl_glMultiTexCoord2dARB, .-bluegl_glMultiTexCoord2dARB .align 2 - .global bluegl_glUniformMatrix4x2dv - .type bluegl_glUniformMatrix4x2dv, %function -bluegl_glUniformMatrix4x2dv: - adrp x16, :got:__blue_glCore_glUniformMatrix4x2dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix4x2dv] + .global bluegl_glMultiTexCoord2dvARB + .type bluegl_glMultiTexCoord2dvARB, %function +bluegl_glMultiTexCoord2dvARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord2dvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2dvARB] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix4x2dv, .-bluegl_glUniformMatrix4x2dv + .size bluegl_glMultiTexCoord2dvARB, .-bluegl_glMultiTexCoord2dvARB .align 2 - .global bluegl_glTexCoordP3ui - .type bluegl_glTexCoordP3ui, %function -bluegl_glTexCoordP3ui: - adrp x16, :got:__blue_glCore_glTexCoordP3ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordP3ui] + .global bluegl_glMultiTexCoord2fARB + .type bluegl_glMultiTexCoord2fARB, %function +bluegl_glMultiTexCoord2fARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord2fARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2fARB] ldr x16, [x16] br x16 - .size bluegl_glTexCoordP3ui, .-bluegl_glTexCoordP3ui + .size bluegl_glMultiTexCoord2fARB, .-bluegl_glMultiTexCoord2fARB .align 2 - .global bluegl_glNamedBufferSubDataEXT - .type bluegl_glNamedBufferSubDataEXT, %function -bluegl_glNamedBufferSubDataEXT: - adrp x16, :got:__blue_glCore_glNamedBufferSubDataEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedBufferSubDataEXT] + .global bluegl_glMultiTexCoord2fvARB + .type bluegl_glMultiTexCoord2fvARB, %function +bluegl_glMultiTexCoord2fvARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord2fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2fvARB] ldr x16, [x16] br x16 - .size bluegl_glNamedBufferSubDataEXT, .-bluegl_glNamedBufferSubDataEXT + .size bluegl_glMultiTexCoord2fvARB, .-bluegl_glMultiTexCoord2fvARB .align 2 - .global bluegl_glProvokingVertexEXT - .type bluegl_glProvokingVertexEXT, %function -bluegl_glProvokingVertexEXT: - adrp x16, :got:__blue_glCore_glProvokingVertexEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProvokingVertexEXT] + .global bluegl_glMultiTexCoord2iARB + .type bluegl_glMultiTexCoord2iARB, %function +bluegl_glMultiTexCoord2iARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord2iARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2iARB] ldr x16, [x16] br x16 - .size bluegl_glProvokingVertexEXT, .-bluegl_glProvokingVertexEXT + .size bluegl_glMultiTexCoord2iARB, .-bluegl_glMultiTexCoord2iARB .align 2 - .global bluegl_glWeightbvARB - .type bluegl_glWeightbvARB, %function -bluegl_glWeightbvARB: - adrp x16, :got:__blue_glCore_glWeightbvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightbvARB] + .global bluegl_glMultiTexCoord2ivARB + .type bluegl_glMultiTexCoord2ivARB, %function +bluegl_glMultiTexCoord2ivARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord2ivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2ivARB] ldr x16, [x16] br x16 - .size bluegl_glWeightbvARB, .-bluegl_glWeightbvARB + .size bluegl_glMultiTexCoord2ivARB, .-bluegl_glMultiTexCoord2ivARB .align 2 - .global bluegl_glInvalidateNamedFramebufferData - .type bluegl_glInvalidateNamedFramebufferData, %function -bluegl_glInvalidateNamedFramebufferData: - adrp x16, :got:__blue_glCore_glInvalidateNamedFramebufferData - ldr x16, [x16, #:got_lo12:__blue_glCore_glInvalidateNamedFramebufferData] + .global bluegl_glMultiTexCoord2sARB + .type bluegl_glMultiTexCoord2sARB, %function +bluegl_glMultiTexCoord2sARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord2sARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2sARB] ldr x16, [x16] br x16 - .size bluegl_glInvalidateNamedFramebufferData, .-bluegl_glInvalidateNamedFramebufferData + .size bluegl_glMultiTexCoord2sARB, .-bluegl_glMultiTexCoord2sARB .align 2 - .global bluegl_glGetArrayObjectfvATI - .type bluegl_glGetArrayObjectfvATI, %function -bluegl_glGetArrayObjectfvATI: - adrp x16, :got:__blue_glCore_glGetArrayObjectfvATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetArrayObjectfvATI] + .global bluegl_glMultiTexCoord2svARB + .type bluegl_glMultiTexCoord2svARB, %function +bluegl_glMultiTexCoord2svARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord2svARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2svARB] ldr x16, [x16] br x16 - .size bluegl_glGetArrayObjectfvATI, .-bluegl_glGetArrayObjectfvATI + .size bluegl_glMultiTexCoord2svARB, .-bluegl_glMultiTexCoord2svARB .align 2 - .global bluegl_glIsSampler - .type bluegl_glIsSampler, %function -bluegl_glIsSampler: - adrp x16, :got:__blue_glCore_glIsSampler - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsSampler] + .global bluegl_glMultiTexCoord3dARB + .type bluegl_glMultiTexCoord3dARB, %function +bluegl_glMultiTexCoord3dARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord3dARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3dARB] ldr x16, [x16] br x16 - .size bluegl_glIsSampler, .-bluegl_glIsSampler + .size bluegl_glMultiTexCoord3dARB, .-bluegl_glMultiTexCoord3dARB .align 2 - .global bluegl_glNormalStream3dvATI - .type bluegl_glNormalStream3dvATI, %function -bluegl_glNormalStream3dvATI: - adrp x16, :got:__blue_glCore_glNormalStream3dvATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3dvATI] + .global bluegl_glMultiTexCoord3dvARB + .type bluegl_glMultiTexCoord3dvARB, %function +bluegl_glMultiTexCoord3dvARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord3dvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3dvARB] ldr x16, [x16] br x16 - .size bluegl_glNormalStream3dvATI, .-bluegl_glNormalStream3dvATI + .size bluegl_glMultiTexCoord3dvARB, .-bluegl_glMultiTexCoord3dvARB .align 2 - .global bluegl_glVertexAttribL4i64vNV - .type bluegl_glVertexAttribL4i64vNV, %function -bluegl_glVertexAttribL4i64vNV: - adrp x16, :got:__blue_glCore_glVertexAttribL4i64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL4i64vNV] + .global bluegl_glMultiTexCoord3fARB + .type bluegl_glMultiTexCoord3fARB, %function +bluegl_glMultiTexCoord3fARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord3fARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3fARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL4i64vNV, .-bluegl_glVertexAttribL4i64vNV + .size bluegl_glMultiTexCoord3fARB, .-bluegl_glMultiTexCoord3fARB .align 2 - .global bluegl_glValidateProgramARB - .type bluegl_glValidateProgramARB, %function -bluegl_glValidateProgramARB: - adrp x16, :got:__blue_glCore_glValidateProgramARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glValidateProgramARB] + .global bluegl_glMultiTexCoord3fvARB + .type bluegl_glMultiTexCoord3fvARB, %function +bluegl_glMultiTexCoord3fvARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord3fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3fvARB] ldr x16, [x16] br x16 - .size bluegl_glValidateProgramARB, .-bluegl_glValidateProgramARB + .size bluegl_glMultiTexCoord3fvARB, .-bluegl_glMultiTexCoord3fvARB .align 2 - .global bluegl_glUniform3ui - .type bluegl_glUniform3ui, %function -bluegl_glUniform3ui: - adrp x16, :got:__blue_glCore_glUniform3ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3ui] + .global bluegl_glMultiTexCoord3iARB + .type bluegl_glMultiTexCoord3iARB, %function +bluegl_glMultiTexCoord3iARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord3iARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3iARB] ldr x16, [x16] br x16 - .size bluegl_glUniform3ui, .-bluegl_glUniform3ui + .size bluegl_glMultiTexCoord3iARB, .-bluegl_glMultiTexCoord3iARB .align 2 - .global bluegl_glTransformFeedbackVaryingsNV - .type bluegl_glTransformFeedbackVaryingsNV, %function -bluegl_glTransformFeedbackVaryingsNV: - adrp x16, :got:__blue_glCore_glTransformFeedbackVaryingsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTransformFeedbackVaryingsNV] + .global bluegl_glMultiTexCoord3ivARB + .type bluegl_glMultiTexCoord3ivARB, %function +bluegl_glMultiTexCoord3ivARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord3ivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3ivARB] ldr x16, [x16] br x16 - .size bluegl_glTransformFeedbackVaryingsNV, .-bluegl_glTransformFeedbackVaryingsNV + .size bluegl_glMultiTexCoord3ivARB, .-bluegl_glMultiTexCoord3ivARB .align 2 - .global bluegl_glGetSeparableFilter - .type bluegl_glGetSeparableFilter, %function -bluegl_glGetSeparableFilter: - adrp x16, :got:__blue_glCore_glGetSeparableFilter - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSeparableFilter] + .global bluegl_glMultiTexCoord3sARB + .type bluegl_glMultiTexCoord3sARB, %function +bluegl_glMultiTexCoord3sARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord3sARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3sARB] ldr x16, [x16] br x16 - .size bluegl_glGetSeparableFilter, .-bluegl_glGetSeparableFilter + .size bluegl_glMultiTexCoord3sARB, .-bluegl_glMultiTexCoord3sARB .align 2 - .global bluegl_glGetCompressedTexImageARB - .type bluegl_glGetCompressedTexImageARB, %function -bluegl_glGetCompressedTexImageARB: - adrp x16, :got:__blue_glCore_glGetCompressedTexImageARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCompressedTexImageARB] + .global bluegl_glMultiTexCoord3svARB + .type bluegl_glMultiTexCoord3svARB, %function +bluegl_glMultiTexCoord3svARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord3svARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3svARB] ldr x16, [x16] br x16 - .size bluegl_glGetCompressedTexImageARB, .-bluegl_glGetCompressedTexImageARB + .size bluegl_glMultiTexCoord3svARB, .-bluegl_glMultiTexCoord3svARB .align 2 - .global bluegl_glProgramNamedParameter4fvNV - .type bluegl_glProgramNamedParameter4fvNV, %function -bluegl_glProgramNamedParameter4fvNV: - adrp x16, :got:__blue_glCore_glProgramNamedParameter4fvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramNamedParameter4fvNV] + .global bluegl_glMultiTexCoord4dARB + .type bluegl_glMultiTexCoord4dARB, %function +bluegl_glMultiTexCoord4dARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord4dARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4dARB] ldr x16, [x16] br x16 - .size bluegl_glProgramNamedParameter4fvNV, .-bluegl_glProgramNamedParameter4fvNV + .size bluegl_glMultiTexCoord4dARB, .-bluegl_glMultiTexCoord4dARB .align 2 - .global bluegl_glTextureBarrierNV - .type bluegl_glTextureBarrierNV, %function -bluegl_glTextureBarrierNV: - adrp x16, :got:__blue_glCore_glTextureBarrierNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureBarrierNV] + .global bluegl_glMultiTexCoord4dvARB + .type bluegl_glMultiTexCoord4dvARB, %function +bluegl_glMultiTexCoord4dvARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord4dvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4dvARB] ldr x16, [x16] br x16 - .size bluegl_glTextureBarrierNV, .-bluegl_glTextureBarrierNV + .size bluegl_glMultiTexCoord4dvARB, .-bluegl_glMultiTexCoord4dvARB .align 2 - .global bluegl_glRasterSamplesEXT - .type bluegl_glRasterSamplesEXT, %function -bluegl_glRasterSamplesEXT: - adrp x16, :got:__blue_glCore_glRasterSamplesEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glRasterSamplesEXT] + .global bluegl_glMultiTexCoord4fARB + .type bluegl_glMultiTexCoord4fARB, %function +bluegl_glMultiTexCoord4fARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord4fARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4fARB] ldr x16, [x16] br x16 - .size bluegl_glRasterSamplesEXT, .-bluegl_glRasterSamplesEXT + .size bluegl_glMultiTexCoord4fARB, .-bluegl_glMultiTexCoord4fARB .align 2 - .global bluegl_glSecondaryColor3dEXT - .type bluegl_glSecondaryColor3dEXT, %function -bluegl_glSecondaryColor3dEXT: - adrp x16, :got:__blue_glCore_glSecondaryColor3dEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3dEXT] + .global bluegl_glMultiTexCoord4fvARB + .type bluegl_glMultiTexCoord4fvARB, %function +bluegl_glMultiTexCoord4fvARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord4fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4fvARB] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3dEXT, .-bluegl_glSecondaryColor3dEXT + .size bluegl_glMultiTexCoord4fvARB, .-bluegl_glMultiTexCoord4fvARB .align 2 - .global bluegl_glVertexAttrib1svNV - .type bluegl_glVertexAttrib1svNV, %function -bluegl_glVertexAttrib1svNV: - adrp x16, :got:__blue_glCore_glVertexAttrib1svNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1svNV] + .global bluegl_glMultiTexCoord4iARB + .type bluegl_glMultiTexCoord4iARB, %function +bluegl_glMultiTexCoord4iARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord4iARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4iARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1svNV, .-bluegl_glVertexAttrib1svNV + .size bluegl_glMultiTexCoord4iARB, .-bluegl_glMultiTexCoord4iARB .align 2 - .global bluegl_glTexImage3D - .type bluegl_glTexImage3D, %function -bluegl_glTexImage3D: - adrp x16, :got:__blue_glCore_glTexImage3D - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexImage3D] + .global bluegl_glMultiTexCoord4ivARB + .type bluegl_glMultiTexCoord4ivARB, %function +bluegl_glMultiTexCoord4ivARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord4ivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4ivARB] ldr x16, [x16] br x16 - .size bluegl_glTexImage3D, .-bluegl_glTexImage3D + .size bluegl_glMultiTexCoord4ivARB, .-bluegl_glMultiTexCoord4ivARB .align 2 - .global bluegl_glUniform1i64ARB - .type bluegl_glUniform1i64ARB, %function -bluegl_glUniform1i64ARB: - adrp x16, :got:__blue_glCore_glUniform1i64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1i64ARB] + .global bluegl_glMultiTexCoord4sARB + .type bluegl_glMultiTexCoord4sARB, %function +bluegl_glMultiTexCoord4sARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord4sARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4sARB] ldr x16, [x16] br x16 - .size bluegl_glUniform1i64ARB, .-bluegl_glUniform1i64ARB + .size bluegl_glMultiTexCoord4sARB, .-bluegl_glMultiTexCoord4sARB .align 2 - .global bluegl_glVertexAttrib4Nuiv - .type bluegl_glVertexAttrib4Nuiv, %function -bluegl_glVertexAttrib4Nuiv: - adrp x16, :got:__blue_glCore_glVertexAttrib4Nuiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4Nuiv] + .global bluegl_glMultiTexCoord4svARB + .type bluegl_glMultiTexCoord4svARB, %function +bluegl_glMultiTexCoord4svARB: + adrp x16, :got:__blue_glCore_glMultiTexCoord4svARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4svARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4Nuiv, .-bluegl_glVertexAttrib4Nuiv + .size bluegl_glMultiTexCoord4svARB, .-bluegl_glMultiTexCoord4svARB .align 2 - .global bluegl_glGetProgramivNV - .type bluegl_glGetProgramivNV, %function -bluegl_glGetProgramivNV: - adrp x16, :got:__blue_glCore_glGetProgramivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramivNV] + .global bluegl_glGenQueriesARB + .type bluegl_glGenQueriesARB, %function +bluegl_glGenQueriesARB: + adrp x16, :got:__blue_glCore_glGenQueriesARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenQueriesARB] ldr x16, [x16] br x16 - .size bluegl_glGetProgramivNV, .-bluegl_glGetProgramivNV + .size bluegl_glGenQueriesARB, .-bluegl_glGenQueriesARB .align 2 - .global bluegl_glGetTexGenxvOES - .type bluegl_glGetTexGenxvOES, %function -bluegl_glGetTexGenxvOES: - adrp x16, :got:__blue_glCore_glGetTexGenxvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexGenxvOES] + .global bluegl_glDeleteQueriesARB + .type bluegl_glDeleteQueriesARB, %function +bluegl_glDeleteQueriesARB: + adrp x16, :got:__blue_glCore_glDeleteQueriesARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteQueriesARB] ldr x16, [x16] br x16 - .size bluegl_glGetTexGenxvOES, .-bluegl_glGetTexGenxvOES + .size bluegl_glDeleteQueriesARB, .-bluegl_glDeleteQueriesARB .align 2 - .global bluegl_glVertexP4uiv - .type bluegl_glVertexP4uiv, %function -bluegl_glVertexP4uiv: - adrp x16, :got:__blue_glCore_glVertexP4uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexP4uiv] + .global bluegl_glIsQueryARB + .type bluegl_glIsQueryARB, %function +bluegl_glIsQueryARB: + adrp x16, :got:__blue_glCore_glIsQueryARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsQueryARB] ldr x16, [x16] br x16 - .size bluegl_glVertexP4uiv, .-bluegl_glVertexP4uiv + .size bluegl_glIsQueryARB, .-bluegl_glIsQueryARB .align 2 - .global bluegl_glMapGrid1xOES - .type bluegl_glMapGrid1xOES, %function -bluegl_glMapGrid1xOES: - adrp x16, :got:__blue_glCore_glMapGrid1xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMapGrid1xOES] + .global bluegl_glBeginQueryARB + .type bluegl_glBeginQueryARB, %function +bluegl_glBeginQueryARB: + adrp x16, :got:__blue_glCore_glBeginQueryARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginQueryARB] ldr x16, [x16] br x16 - .size bluegl_glMapGrid1xOES, .-bluegl_glMapGrid1xOES + .size bluegl_glBeginQueryARB, .-bluegl_glBeginQueryARB .align 2 - .global bluegl_glProgramUniformMatrix2dv - .type bluegl_glProgramUniformMatrix2dv, %function -bluegl_glProgramUniformMatrix2dv: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix2dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2dv] + .global bluegl_glEndQueryARB + .type bluegl_glEndQueryARB, %function +bluegl_glEndQueryARB: + adrp x16, :got:__blue_glCore_glEndQueryARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glEndQueryARB] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix2dv, .-bluegl_glProgramUniformMatrix2dv + .size bluegl_glEndQueryARB, .-bluegl_glEndQueryARB .align 2 - .global bluegl_glColorMaski - .type bluegl_glColorMaski, %function -bluegl_glColorMaski: - adrp x16, :got:__blue_glCore_glColorMaski - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorMaski] + .global bluegl_glGetQueryivARB + .type bluegl_glGetQueryivARB, %function +bluegl_glGetQueryivARB: + adrp x16, :got:__blue_glCore_glGetQueryivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryivARB] ldr x16, [x16] br x16 - .size bluegl_glColorMaski, .-bluegl_glColorMaski + .size bluegl_glGetQueryivARB, .-bluegl_glGetQueryivARB .align 2 - .global bluegl_glEdgeFlagPointerListIBM - .type bluegl_glEdgeFlagPointerListIBM, %function -bluegl_glEdgeFlagPointerListIBM: - adrp x16, :got:__blue_glCore_glEdgeFlagPointerListIBM - ldr x16, [x16, #:got_lo12:__blue_glCore_glEdgeFlagPointerListIBM] + .global bluegl_glGetQueryObjectivARB + .type bluegl_glGetQueryObjectivARB, %function +bluegl_glGetQueryObjectivARB: + adrp x16, :got:__blue_glCore_glGetQueryObjectivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryObjectivARB] ldr x16, [x16] br x16 - .size bluegl_glEdgeFlagPointerListIBM, .-bluegl_glEdgeFlagPointerListIBM + .size bluegl_glGetQueryObjectivARB, .-bluegl_glGetQueryObjectivARB .align 2 - .global bluegl_glGetUniformBlockIndex - .type bluegl_glGetUniformBlockIndex, %function -bluegl_glGetUniformBlockIndex: - adrp x16, :got:__blue_glCore_glGetUniformBlockIndex - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformBlockIndex] + .global bluegl_glGetQueryObjectuivARB + .type bluegl_glGetQueryObjectuivARB, %function +bluegl_glGetQueryObjectuivARB: + adrp x16, :got:__blue_glCore_glGetQueryObjectuivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryObjectuivARB] ldr x16, [x16] br x16 - .size bluegl_glGetUniformBlockIndex, .-bluegl_glGetUniformBlockIndex + .size bluegl_glGetQueryObjectuivARB, .-bluegl_glGetQueryObjectuivARB .align 2 - .global bluegl_glClearColorxOES - .type bluegl_glClearColorxOES, %function -bluegl_glClearColorxOES: - adrp x16, :got:__blue_glCore_glClearColorxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearColorxOES] + .global bluegl_glMaxShaderCompilerThreadsARB + .type bluegl_glMaxShaderCompilerThreadsARB, %function +bluegl_glMaxShaderCompilerThreadsARB: + adrp x16, :got:__blue_glCore_glMaxShaderCompilerThreadsARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMaxShaderCompilerThreadsARB] ldr x16, [x16] br x16 - .size bluegl_glClearColorxOES, .-bluegl_glClearColorxOES + .size bluegl_glMaxShaderCompilerThreadsARB, .-bluegl_glMaxShaderCompilerThreadsARB .align 2 - .global bluegl_glPixelTransformParameteriEXT - .type bluegl_glPixelTransformParameteriEXT, %function -bluegl_glPixelTransformParameteriEXT: - adrp x16, :got:__blue_glCore_glPixelTransformParameteriEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTransformParameteriEXT] + .global bluegl_glPointParameterfARB + .type bluegl_glPointParameterfARB, %function +bluegl_glPointParameterfARB: + adrp x16, :got:__blue_glCore_glPointParameterfARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterfARB] ldr x16, [x16] br x16 - .size bluegl_glPixelTransformParameteriEXT, .-bluegl_glPixelTransformParameteriEXT + .size bluegl_glPointParameterfARB, .-bluegl_glPointParameterfARB .align 2 - .global bluegl_glNamedFramebufferTexture3DEXT - .type bluegl_glNamedFramebufferTexture3DEXT, %function -bluegl_glNamedFramebufferTexture3DEXT: - adrp x16, :got:__blue_glCore_glNamedFramebufferTexture3DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferTexture3DEXT] + .global bluegl_glPointParameterfvARB + .type bluegl_glPointParameterfvARB, %function +bluegl_glPointParameterfvARB: + adrp x16, :got:__blue_glCore_glPointParameterfvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterfvARB] ldr x16, [x16] br x16 - .size bluegl_glNamedFramebufferTexture3DEXT, .-bluegl_glNamedFramebufferTexture3DEXT + .size bluegl_glPointParameterfvARB, .-bluegl_glPointParameterfvARB .align 2 - .global bluegl_glTexCoord4xOES - .type bluegl_glTexCoord4xOES, %function -bluegl_glTexCoord4xOES: - adrp x16, :got:__blue_glCore_glTexCoord4xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord4xOES] + .global bluegl_glGetnMapdvARB + .type bluegl_glGetnMapdvARB, %function +bluegl_glGetnMapdvARB: + adrp x16, :got:__blue_glCore_glGetnMapdvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnMapdvARB] ldr x16, [x16] br x16 - .size bluegl_glTexCoord4xOES, .-bluegl_glTexCoord4xOES + .size bluegl_glGetnMapdvARB, .-bluegl_glGetnMapdvARB .align 2 - .global bluegl_glGetUniformivARB - .type bluegl_glGetUniformivARB, %function -bluegl_glGetUniformivARB: - adrp x16, :got:__blue_glCore_glGetUniformivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformivARB] + .global bluegl_glGetnMapfvARB + .type bluegl_glGetnMapfvARB, %function +bluegl_glGetnMapfvARB: + adrp x16, :got:__blue_glCore_glGetnMapfvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnMapfvARB] ldr x16, [x16] br x16 - .size bluegl_glGetUniformivARB, .-bluegl_glGetUniformivARB + .size bluegl_glGetnMapfvARB, .-bluegl_glGetnMapfvARB .align 2 - .global bluegl_glNamedFramebufferTextureEXT - .type bluegl_glNamedFramebufferTextureEXT, %function -bluegl_glNamedFramebufferTextureEXT: - adrp x16, :got:__blue_glCore_glNamedFramebufferTextureEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferTextureEXT] + .global bluegl_glGetnMapivARB + .type bluegl_glGetnMapivARB, %function +bluegl_glGetnMapivARB: + adrp x16, :got:__blue_glCore_glGetnMapivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnMapivARB] ldr x16, [x16] br x16 - .size bluegl_glNamedFramebufferTextureEXT, .-bluegl_glNamedFramebufferTextureEXT + .size bluegl_glGetnMapivARB, .-bluegl_glGetnMapivARB .align 2 - .global bluegl_glDrawBuffers - .type bluegl_glDrawBuffers, %function -bluegl_glDrawBuffers: - adrp x16, :got:__blue_glCore_glDrawBuffers - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawBuffers] + .global bluegl_glGetnPixelMapfvARB + .type bluegl_glGetnPixelMapfvARB, %function +bluegl_glGetnPixelMapfvARB: + adrp x16, :got:__blue_glCore_glGetnPixelMapfvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnPixelMapfvARB] ldr x16, [x16] br x16 - .size bluegl_glDrawBuffers, .-bluegl_glDrawBuffers + .size bluegl_glGetnPixelMapfvARB, .-bluegl_glGetnPixelMapfvARB .align 2 - .global bluegl_glWeightuivARB - .type bluegl_glWeightuivARB, %function -bluegl_glWeightuivARB: - adrp x16, :got:__blue_glCore_glWeightuivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightuivARB] + .global bluegl_glGetnPixelMapuivARB + .type bluegl_glGetnPixelMapuivARB, %function +bluegl_glGetnPixelMapuivARB: + adrp x16, :got:__blue_glCore_glGetnPixelMapuivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnPixelMapuivARB] ldr x16, [x16] br x16 - .size bluegl_glWeightuivARB, .-bluegl_glWeightuivARB + .size bluegl_glGetnPixelMapuivARB, .-bluegl_glGetnPixelMapuivARB .align 2 - .global bluegl_glMultiTexCoordP1ui - .type bluegl_glMultiTexCoordP1ui, %function -bluegl_glMultiTexCoordP1ui: - adrp x16, :got:__blue_glCore_glMultiTexCoordP1ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoordP1ui] + .global bluegl_glGetnPixelMapusvARB + .type bluegl_glGetnPixelMapusvARB, %function +bluegl_glGetnPixelMapusvARB: + adrp x16, :got:__blue_glCore_glGetnPixelMapusvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnPixelMapusvARB] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoordP1ui, .-bluegl_glMultiTexCoordP1ui + .size bluegl_glGetnPixelMapusvARB, .-bluegl_glGetnPixelMapusvARB .align 2 - .global bluegl_glCopyTexSubImage1DEXT - .type bluegl_glCopyTexSubImage1DEXT, %function -bluegl_glCopyTexSubImage1DEXT: - adrp x16, :got:__blue_glCore_glCopyTexSubImage1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexSubImage1DEXT] + .global bluegl_glGetnPolygonStippleARB + .type bluegl_glGetnPolygonStippleARB, %function +bluegl_glGetnPolygonStippleARB: + adrp x16, :got:__blue_glCore_glGetnPolygonStippleARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnPolygonStippleARB] ldr x16, [x16] br x16 - .size bluegl_glCopyTexSubImage1DEXT, .-bluegl_glCopyTexSubImage1DEXT + .size bluegl_glGetnPolygonStippleARB, .-bluegl_glGetnPolygonStippleARB .align 2 - .global bluegl_glVertexArrayAttribBinding - .type bluegl_glVertexArrayAttribBinding, %function -bluegl_glVertexArrayAttribBinding: - adrp x16, :got:__blue_glCore_glVertexArrayAttribBinding - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayAttribBinding] + .global bluegl_glGetnColorTableARB + .type bluegl_glGetnColorTableARB, %function +bluegl_glGetnColorTableARB: + adrp x16, :got:__blue_glCore_glGetnColorTableARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnColorTableARB] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayAttribBinding, .-bluegl_glVertexArrayAttribBinding + .size bluegl_glGetnColorTableARB, .-bluegl_glGetnColorTableARB .align 2 - .global bluegl_glVertexP4ui - .type bluegl_glVertexP4ui, %function -bluegl_glVertexP4ui: - adrp x16, :got:__blue_glCore_glVertexP4ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexP4ui] + .global bluegl_glGetnConvolutionFilterARB + .type bluegl_glGetnConvolutionFilterARB, %function +bluegl_glGetnConvolutionFilterARB: + adrp x16, :got:__blue_glCore_glGetnConvolutionFilterARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnConvolutionFilterARB] ldr x16, [x16] br x16 - .size bluegl_glVertexP4ui, .-bluegl_glVertexP4ui + .size bluegl_glGetnConvolutionFilterARB, .-bluegl_glGetnConvolutionFilterARB .align 2 - .global bluegl_glVertex2hvNV - .type bluegl_glVertex2hvNV, %function -bluegl_glVertex2hvNV: - adrp x16, :got:__blue_glCore_glVertex2hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex2hvNV] + .global bluegl_glGetnSeparableFilterARB + .type bluegl_glGetnSeparableFilterARB, %function +bluegl_glGetnSeparableFilterARB: + adrp x16, :got:__blue_glCore_glGetnSeparableFilterARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnSeparableFilterARB] ldr x16, [x16] br x16 - .size bluegl_glVertex2hvNV, .-bluegl_glVertex2hvNV + .size bluegl_glGetnSeparableFilterARB, .-bluegl_glGetnSeparableFilterARB .align 2 - .global bluegl_glDrawElementsInstancedBaseInstance - .type bluegl_glDrawElementsInstancedBaseInstance, %function -bluegl_glDrawElementsInstancedBaseInstance: - adrp x16, :got:__blue_glCore_glDrawElementsInstancedBaseInstance - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementsInstancedBaseInstance] + .global bluegl_glGetnHistogramARB + .type bluegl_glGetnHistogramARB, %function +bluegl_glGetnHistogramARB: + adrp x16, :got:__blue_glCore_glGetnHistogramARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnHistogramARB] ldr x16, [x16] br x16 - .size bluegl_glDrawElementsInstancedBaseInstance, .-bluegl_glDrawElementsInstancedBaseInstance + .size bluegl_glGetnHistogramARB, .-bluegl_glGetnHistogramARB .align 2 - .global bluegl_glNormalStream3sATI - .type bluegl_glNormalStream3sATI, %function -bluegl_glNormalStream3sATI: - adrp x16, :got:__blue_glCore_glNormalStream3sATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3sATI] + .global bluegl_glGetnMinmaxARB + .type bluegl_glGetnMinmaxARB, %function +bluegl_glGetnMinmaxARB: + adrp x16, :got:__blue_glCore_glGetnMinmaxARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnMinmaxARB] ldr x16, [x16] br x16 - .size bluegl_glNormalStream3sATI, .-bluegl_glNormalStream3sATI + .size bluegl_glGetnMinmaxARB, .-bluegl_glGetnMinmaxARB .align 2 - .global bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN - .type bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN, %function -bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN: - adrp x16, :got:__blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN] + .global bluegl_glFramebufferSampleLocationsfvARB + .type bluegl_glFramebufferSampleLocationsfvARB, %function +bluegl_glFramebufferSampleLocationsfvARB: + adrp x16, :got:__blue_glCore_glFramebufferSampleLocationsfvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferSampleLocationsfvARB] ldr x16, [x16] br x16 - .size bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN, .-bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN + .size bluegl_glFramebufferSampleLocationsfvARB, .-bluegl_glFramebufferSampleLocationsfvARB .align 2 - .global bluegl_glBindSamplers - .type bluegl_glBindSamplers, %function -bluegl_glBindSamplers: - adrp x16, :got:__blue_glCore_glBindSamplers - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindSamplers] + .global bluegl_glNamedFramebufferSampleLocationsfvARB + .type bluegl_glNamedFramebufferSampleLocationsfvARB, %function +bluegl_glNamedFramebufferSampleLocationsfvARB: + adrp x16, :got:__blue_glCore_glNamedFramebufferSampleLocationsfvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferSampleLocationsfvARB] ldr x16, [x16] br x16 - .size bluegl_glBindSamplers, .-bluegl_glBindSamplers + .size bluegl_glNamedFramebufferSampleLocationsfvARB, .-bluegl_glNamedFramebufferSampleLocationsfvARB .align 2 - .global bluegl_glGetCompressedMultiTexImageEXT - .type bluegl_glGetCompressedMultiTexImageEXT, %function -bluegl_glGetCompressedMultiTexImageEXT: - adrp x16, :got:__blue_glCore_glGetCompressedMultiTexImageEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCompressedMultiTexImageEXT] + .global bluegl_glEvaluateDepthValuesARB + .type bluegl_glEvaluateDepthValuesARB, %function +bluegl_glEvaluateDepthValuesARB: + adrp x16, :got:__blue_glCore_glEvaluateDepthValuesARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glEvaluateDepthValuesARB] ldr x16, [x16] br x16 - .size bluegl_glGetCompressedMultiTexImageEXT, .-bluegl_glGetCompressedMultiTexImageEXT + .size bluegl_glEvaluateDepthValuesARB, .-bluegl_glEvaluateDepthValuesARB .align 2 - .global bluegl_glGetRenderbufferParameterivEXT - .type bluegl_glGetRenderbufferParameterivEXT, %function -bluegl_glGetRenderbufferParameterivEXT: - adrp x16, :got:__blue_glCore_glGetRenderbufferParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetRenderbufferParameterivEXT] + .global bluegl_glDeleteObjectARB + .type bluegl_glDeleteObjectARB, %function +bluegl_glDeleteObjectARB: + adrp x16, :got:__blue_glCore_glDeleteObjectARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteObjectARB] ldr x16, [x16] br x16 - .size bluegl_glGetRenderbufferParameterivEXT, .-bluegl_glGetRenderbufferParameterivEXT + .size bluegl_glDeleteObjectARB, .-bluegl_glDeleteObjectARB .align 2 - .global bluegl_glUniform3dv - .type bluegl_glUniform3dv, %function -bluegl_glUniform3dv: - adrp x16, :got:__blue_glCore_glUniform3dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3dv] + .global bluegl_glGetHandleARB + .type bluegl_glGetHandleARB, %function +bluegl_glGetHandleARB: + adrp x16, :got:__blue_glCore_glGetHandleARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetHandleARB] ldr x16, [x16] br x16 - .size bluegl_glUniform3dv, .-bluegl_glUniform3dv + .size bluegl_glGetHandleARB, .-bluegl_glGetHandleARB .align 2 - .global bluegl_glFlushRasterSGIX - .type bluegl_glFlushRasterSGIX, %function -bluegl_glFlushRasterSGIX: - adrp x16, :got:__blue_glCore_glFlushRasterSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glFlushRasterSGIX] + .global bluegl_glDetachObjectARB + .type bluegl_glDetachObjectARB, %function +bluegl_glDetachObjectARB: + adrp x16, :got:__blue_glCore_glDetachObjectARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glDetachObjectARB] ldr x16, [x16] br x16 - .size bluegl_glFlushRasterSGIX, .-bluegl_glFlushRasterSGIX + .size bluegl_glDetachObjectARB, .-bluegl_glDetachObjectARB .align 2 - .global bluegl_glVertexAttribs3hvNV - .type bluegl_glVertexAttribs3hvNV, %function -bluegl_glVertexAttribs3hvNV: - adrp x16, :got:__blue_glCore_glVertexAttribs3hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs3hvNV] + .global bluegl_glCreateShaderObjectARB + .type bluegl_glCreateShaderObjectARB, %function +bluegl_glCreateShaderObjectARB: + adrp x16, :got:__blue_glCore_glCreateShaderObjectARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateShaderObjectARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribs3hvNV, .-bluegl_glVertexAttribs3hvNV + .size bluegl_glCreateShaderObjectARB, .-bluegl_glCreateShaderObjectARB .align 2 - .global bluegl_glGetnSeparableFilterARB - .type bluegl_glGetnSeparableFilterARB, %function -bluegl_glGetnSeparableFilterARB: - adrp x16, :got:__blue_glCore_glGetnSeparableFilterARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnSeparableFilterARB] + .global bluegl_glShaderSourceARB + .type bluegl_glShaderSourceARB, %function +bluegl_glShaderSourceARB: + adrp x16, :got:__blue_glCore_glShaderSourceARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glShaderSourceARB] ldr x16, [x16] br x16 - .size bluegl_glGetnSeparableFilterARB, .-bluegl_glGetnSeparableFilterARB + .size bluegl_glShaderSourceARB, .-bluegl_glShaderSourceARB .align 2 - .global bluegl_glWindowPos2sARB - .type bluegl_glWindowPos2sARB, %function -bluegl_glWindowPos2sARB: - adrp x16, :got:__blue_glCore_glWindowPos2sARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2sARB] + .global bluegl_glCompileShaderARB + .type bluegl_glCompileShaderARB, %function +bluegl_glCompileShaderARB: + adrp x16, :got:__blue_glCore_glCompileShaderARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompileShaderARB] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2sARB, .-bluegl_glWindowPos2sARB + .size bluegl_glCompileShaderARB, .-bluegl_glCompileShaderARB .align 2 - .global bluegl_glPopDebugGroup - .type bluegl_glPopDebugGroup, %function -bluegl_glPopDebugGroup: - adrp x16, :got:__blue_glCore_glPopDebugGroup - ldr x16, [x16, #:got_lo12:__blue_glCore_glPopDebugGroup] + .global bluegl_glCreateProgramObjectARB + .type bluegl_glCreateProgramObjectARB, %function +bluegl_glCreateProgramObjectARB: + adrp x16, :got:__blue_glCore_glCreateProgramObjectARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateProgramObjectARB] ldr x16, [x16] br x16 - .size bluegl_glPopDebugGroup, .-bluegl_glPopDebugGroup + .size bluegl_glCreateProgramObjectARB, .-bluegl_glCreateProgramObjectARB .align 2 - .global bluegl_glVideoCaptureNV - .type bluegl_glVideoCaptureNV, %function -bluegl_glVideoCaptureNV: - adrp x16, :got:__blue_glCore_glVideoCaptureNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVideoCaptureNV] + .global bluegl_glAttachObjectARB + .type bluegl_glAttachObjectARB, %function +bluegl_glAttachObjectARB: + adrp x16, :got:__blue_glCore_glAttachObjectARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glAttachObjectARB] ldr x16, [x16] br x16 - .size bluegl_glVideoCaptureNV, .-bluegl_glVideoCaptureNV + .size bluegl_glAttachObjectARB, .-bluegl_glAttachObjectARB .align 2 - .global bluegl_glTangent3bEXT - .type bluegl_glTangent3bEXT, %function -bluegl_glTangent3bEXT: - adrp x16, :got:__blue_glCore_glTangent3bEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3bEXT] + .global bluegl_glLinkProgramARB + .type bluegl_glLinkProgramARB, %function +bluegl_glLinkProgramARB: + adrp x16, :got:__blue_glCore_glLinkProgramARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glLinkProgramARB] + ldr x16, [x16] + br x16 + .size bluegl_glLinkProgramARB, .-bluegl_glLinkProgramARB + + .align 2 + .global bluegl_glUseProgramObjectARB + .type bluegl_glUseProgramObjectARB, %function +bluegl_glUseProgramObjectARB: + adrp x16, :got:__blue_glCore_glUseProgramObjectARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUseProgramObjectARB] ldr x16, [x16] br x16 - .size bluegl_glTangent3bEXT, .-bluegl_glTangent3bEXT + .size bluegl_glUseProgramObjectARB, .-bluegl_glUseProgramObjectARB .align 2 - .global bluegl_glLinkProgram - .type bluegl_glLinkProgram, %function -bluegl_glLinkProgram: - adrp x16, :got:__blue_glCore_glLinkProgram - ldr x16, [x16, #:got_lo12:__blue_glCore_glLinkProgram] + .global bluegl_glValidateProgramARB + .type bluegl_glValidateProgramARB, %function +bluegl_glValidateProgramARB: + adrp x16, :got:__blue_glCore_glValidateProgramARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glValidateProgramARB] ldr x16, [x16] br x16 - .size bluegl_glLinkProgram, .-bluegl_glLinkProgram + .size bluegl_glValidateProgramARB, .-bluegl_glValidateProgramARB .align 2 - .global bluegl_glFogCoordPointerListIBM - .type bluegl_glFogCoordPointerListIBM, %function -bluegl_glFogCoordPointerListIBM: - adrp x16, :got:__blue_glCore_glFogCoordPointerListIBM - ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordPointerListIBM] + .global bluegl_glUniform1fARB + .type bluegl_glUniform1fARB, %function +bluegl_glUniform1fARB: + adrp x16, :got:__blue_glCore_glUniform1fARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1fARB] ldr x16, [x16] br x16 - .size bluegl_glFogCoordPointerListIBM, .-bluegl_glFogCoordPointerListIBM + .size bluegl_glUniform1fARB, .-bluegl_glUniform1fARB .align 2 - .global bluegl_glRotatexOES - .type bluegl_glRotatexOES, %function -bluegl_glRotatexOES: - adrp x16, :got:__blue_glCore_glRotatexOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glRotatexOES] + .global bluegl_glUniform2fARB + .type bluegl_glUniform2fARB, %function +bluegl_glUniform2fARB: + adrp x16, :got:__blue_glCore_glUniform2fARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2fARB] ldr x16, [x16] br x16 - .size bluegl_glRotatexOES, .-bluegl_glRotatexOES + .size bluegl_glUniform2fARB, .-bluegl_glUniform2fARB .align 2 - .global bluegl_glPathParameterivNV - .type bluegl_glPathParameterivNV, %function -bluegl_glPathParameterivNV: - adrp x16, :got:__blue_glCore_glPathParameterivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathParameterivNV] + .global bluegl_glUniform3fARB + .type bluegl_glUniform3fARB, %function +bluegl_glUniform3fARB: + adrp x16, :got:__blue_glCore_glUniform3fARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3fARB] ldr x16, [x16] br x16 - .size bluegl_glPathParameterivNV, .-bluegl_glPathParameterivNV + .size bluegl_glUniform3fARB, .-bluegl_glUniform3fARB .align 2 - .global bluegl_glVertexAttribLPointerEXT - .type bluegl_glVertexAttribLPointerEXT, %function -bluegl_glVertexAttribLPointerEXT: - adrp x16, :got:__blue_glCore_glVertexAttribLPointerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribLPointerEXT] + .global bluegl_glUniform4fARB + .type bluegl_glUniform4fARB, %function +bluegl_glUniform4fARB: + adrp x16, :got:__blue_glCore_glUniform4fARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4fARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribLPointerEXT, .-bluegl_glVertexAttribLPointerEXT + .size bluegl_glUniform4fARB, .-bluegl_glUniform4fARB .align 2 - .global bluegl_glGetInteger64i_v - .type bluegl_glGetInteger64i_v, %function -bluegl_glGetInteger64i_v: - adrp x16, :got:__blue_glCore_glGetInteger64i_v - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInteger64i_v] + .global bluegl_glUniform1iARB + .type bluegl_glUniform1iARB, %function +bluegl_glUniform1iARB: + adrp x16, :got:__blue_glCore_glUniform1iARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1iARB] ldr x16, [x16] br x16 - .size bluegl_glGetInteger64i_v, .-bluegl_glGetInteger64i_v + .size bluegl_glUniform1iARB, .-bluegl_glUniform1iARB .align 2 - .global bluegl_glCompressedMultiTexSubImage1DEXT - .type bluegl_glCompressedMultiTexSubImage1DEXT, %function -bluegl_glCompressedMultiTexSubImage1DEXT: - adrp x16, :got:__blue_glCore_glCompressedMultiTexSubImage1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedMultiTexSubImage1DEXT] + .global bluegl_glUniform2iARB + .type bluegl_glUniform2iARB, %function +bluegl_glUniform2iARB: + adrp x16, :got:__blue_glCore_glUniform2iARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2iARB] ldr x16, [x16] br x16 - .size bluegl_glCompressedMultiTexSubImage1DEXT, .-bluegl_glCompressedMultiTexSubImage1DEXT + .size bluegl_glUniform2iARB, .-bluegl_glUniform2iARB .align 2 - .global bluegl_glConvolutionParameteriEXT - .type bluegl_glConvolutionParameteriEXT, %function -bluegl_glConvolutionParameteriEXT: - adrp x16, :got:__blue_glCore_glConvolutionParameteriEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameteriEXT] + .global bluegl_glUniform3iARB + .type bluegl_glUniform3iARB, %function +bluegl_glUniform3iARB: + adrp x16, :got:__blue_glCore_glUniform3iARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3iARB] ldr x16, [x16] br x16 - .size bluegl_glConvolutionParameteriEXT, .-bluegl_glConvolutionParameteriEXT + .size bluegl_glUniform3iARB, .-bluegl_glUniform3iARB .align 2 - .global bluegl_glNamedFramebufferTextureLayer - .type bluegl_glNamedFramebufferTextureLayer, %function -bluegl_glNamedFramebufferTextureLayer: - adrp x16, :got:__blue_glCore_glNamedFramebufferTextureLayer - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferTextureLayer] + .global bluegl_glUniform4iARB + .type bluegl_glUniform4iARB, %function +bluegl_glUniform4iARB: + adrp x16, :got:__blue_glCore_glUniform4iARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4iARB] ldr x16, [x16] br x16 - .size bluegl_glNamedFramebufferTextureLayer, .-bluegl_glNamedFramebufferTextureLayer + .size bluegl_glUniform4iARB, .-bluegl_glUniform4iARB .align 2 - .global bluegl_glWindowPos2sMESA - .type bluegl_glWindowPos2sMESA, %function -bluegl_glWindowPos2sMESA: - adrp x16, :got:__blue_glCore_glWindowPos2sMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2sMESA] + .global bluegl_glUniform1fvARB + .type bluegl_glUniform1fvARB, %function +bluegl_glUniform1fvARB: + adrp x16, :got:__blue_glCore_glUniform1fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1fvARB] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2sMESA, .-bluegl_glWindowPos2sMESA + .size bluegl_glUniform1fvARB, .-bluegl_glUniform1fvARB .align 2 - .global bluegl_glCoverStrokePathInstancedNV - .type bluegl_glCoverStrokePathInstancedNV, %function -bluegl_glCoverStrokePathInstancedNV: - adrp x16, :got:__blue_glCore_glCoverStrokePathInstancedNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCoverStrokePathInstancedNV] + .global bluegl_glUniform2fvARB + .type bluegl_glUniform2fvARB, %function +bluegl_glUniform2fvARB: + adrp x16, :got:__blue_glCore_glUniform2fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2fvARB] ldr x16, [x16] br x16 - .size bluegl_glCoverStrokePathInstancedNV, .-bluegl_glCoverStrokePathInstancedNV + .size bluegl_glUniform2fvARB, .-bluegl_glUniform2fvARB .align 2 - .global bluegl_glTexParameteri - .type bluegl_glTexParameteri, %function -bluegl_glTexParameteri: - adrp x16, :got:__blue_glCore_glTexParameteri - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameteri] + .global bluegl_glUniform3fvARB + .type bluegl_glUniform3fvARB, %function +bluegl_glUniform3fvARB: + adrp x16, :got:__blue_glCore_glUniform3fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3fvARB] ldr x16, [x16] br x16 - .size bluegl_glTexParameteri, .-bluegl_glTexParameteri + .size bluegl_glUniform3fvARB, .-bluegl_glUniform3fvARB .align 2 - .global bluegl_glUniform1uiv - .type bluegl_glUniform1uiv, %function -bluegl_glUniform1uiv: - adrp x16, :got:__blue_glCore_glUniform1uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1uiv] + .global bluegl_glUniform4fvARB + .type bluegl_glUniform4fvARB, %function +bluegl_glUniform4fvARB: + adrp x16, :got:__blue_glCore_glUniform4fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4fvARB] ldr x16, [x16] br x16 - .size bluegl_glUniform1uiv, .-bluegl_glUniform1uiv + .size bluegl_glUniform4fvARB, .-bluegl_glUniform4fvARB .align 2 - .global bluegl_glMultiTexCoord4fv - .type bluegl_glMultiTexCoord4fv, %function -bluegl_glMultiTexCoord4fv: - adrp x16, :got:__blue_glCore_glMultiTexCoord4fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4fv] + .global bluegl_glUniform1ivARB + .type bluegl_glUniform1ivARB, %function +bluegl_glUniform1ivARB: + adrp x16, :got:__blue_glCore_glUniform1ivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1ivARB] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4fv, .-bluegl_glMultiTexCoord4fv + .size bluegl_glUniform1ivARB, .-bluegl_glUniform1ivARB .align 2 - .global bluegl_glProgramParameter4fvNV - .type bluegl_glProgramParameter4fvNV, %function -bluegl_glProgramParameter4fvNV: - adrp x16, :got:__blue_glCore_glProgramParameter4fvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramParameter4fvNV] + .global bluegl_glUniform2ivARB + .type bluegl_glUniform2ivARB, %function +bluegl_glUniform2ivARB: + adrp x16, :got:__blue_glCore_glUniform2ivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2ivARB] ldr x16, [x16] br x16 - .size bluegl_glProgramParameter4fvNV, .-bluegl_glProgramParameter4fvNV + .size bluegl_glUniform2ivARB, .-bluegl_glUniform2ivARB .align 2 - .global bluegl_glDeformationMap3fSGIX - .type bluegl_glDeformationMap3fSGIX, %function -bluegl_glDeformationMap3fSGIX: - adrp x16, :got:__blue_glCore_glDeformationMap3fSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeformationMap3fSGIX] + .global bluegl_glUniform3ivARB + .type bluegl_glUniform3ivARB, %function +bluegl_glUniform3ivARB: + adrp x16, :got:__blue_glCore_glUniform3ivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3ivARB] ldr x16, [x16] br x16 - .size bluegl_glDeformationMap3fSGIX, .-bluegl_glDeformationMap3fSGIX + .size bluegl_glUniform3ivARB, .-bluegl_glUniform3ivARB .align 2 - .global bluegl_glBlendEquationiARB - .type bluegl_glBlendEquationiARB, %function -bluegl_glBlendEquationiARB: - adrp x16, :got:__blue_glCore_glBlendEquationiARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquationiARB] + .global bluegl_glUniform4ivARB + .type bluegl_glUniform4ivARB, %function +bluegl_glUniform4ivARB: + adrp x16, :got:__blue_glCore_glUniform4ivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4ivARB] ldr x16, [x16] br x16 - .size bluegl_glBlendEquationiARB, .-bluegl_glBlendEquationiARB + .size bluegl_glUniform4ivARB, .-bluegl_glUniform4ivARB .align 2 - .global bluegl_glStencilFunc - .type bluegl_glStencilFunc, %function -bluegl_glStencilFunc: - adrp x16, :got:__blue_glCore_glStencilFunc - ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilFunc] + .global bluegl_glUniformMatrix2fvARB + .type bluegl_glUniformMatrix2fvARB, %function +bluegl_glUniformMatrix2fvARB: + adrp x16, :got:__blue_glCore_glUniformMatrix2fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix2fvARB] ldr x16, [x16] br x16 - .size bluegl_glStencilFunc, .-bluegl_glStencilFunc + .size bluegl_glUniformMatrix2fvARB, .-bluegl_glUniformMatrix2fvARB .align 2 - .global bluegl_glFogCoordd - .type bluegl_glFogCoordd, %function -bluegl_glFogCoordd: - adrp x16, :got:__blue_glCore_glFogCoordd - ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordd] + .global bluegl_glUniformMatrix3fvARB + .type bluegl_glUniformMatrix3fvARB, %function +bluegl_glUniformMatrix3fvARB: + adrp x16, :got:__blue_glCore_glUniformMatrix3fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix3fvARB] ldr x16, [x16] br x16 - .size bluegl_glFogCoordd, .-bluegl_glFogCoordd + .size bluegl_glUniformMatrix3fvARB, .-bluegl_glUniformMatrix3fvARB .align 2 - .global bluegl_glUniform2iv - .type bluegl_glUniform2iv, %function -bluegl_glUniform2iv: - adrp x16, :got:__blue_glCore_glUniform2iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2iv] + .global bluegl_glUniformMatrix4fvARB + .type bluegl_glUniformMatrix4fvARB, %function +bluegl_glUniformMatrix4fvARB: + adrp x16, :got:__blue_glCore_glUniformMatrix4fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix4fvARB] ldr x16, [x16] br x16 - .size bluegl_glUniform2iv, .-bluegl_glUniform2iv + .size bluegl_glUniformMatrix4fvARB, .-bluegl_glUniformMatrix4fvARB .align 2 - .global bluegl_glUniform1i64NV - .type bluegl_glUniform1i64NV, %function -bluegl_glUniform1i64NV: - adrp x16, :got:__blue_glCore_glUniform1i64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1i64NV] + .global bluegl_glGetObjectParameterfvARB + .type bluegl_glGetObjectParameterfvARB, %function +bluegl_glGetObjectParameterfvARB: + adrp x16, :got:__blue_glCore_glGetObjectParameterfvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetObjectParameterfvARB] ldr x16, [x16] br x16 - .size bluegl_glUniform1i64NV, .-bluegl_glUniform1i64NV + .size bluegl_glGetObjectParameterfvARB, .-bluegl_glGetObjectParameterfvARB .align 2 - .global bluegl_glTextureStorage2D - .type bluegl_glTextureStorage2D, %function -bluegl_glTextureStorage2D: - adrp x16, :got:__blue_glCore_glTextureStorage2D - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage2D] + .global bluegl_glGetObjectParameterivARB + .type bluegl_glGetObjectParameterivARB, %function +bluegl_glGetObjectParameterivARB: + adrp x16, :got:__blue_glCore_glGetObjectParameterivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetObjectParameterivARB] ldr x16, [x16] br x16 - .size bluegl_glTextureStorage2D, .-bluegl_glTextureStorage2D + .size bluegl_glGetObjectParameterivARB, .-bluegl_glGetObjectParameterivARB .align 2 - .global bluegl_glTextureStorage2DMultisampleEXT - .type bluegl_glTextureStorage2DMultisampleEXT, %function -bluegl_glTextureStorage2DMultisampleEXT: - adrp x16, :got:__blue_glCore_glTextureStorage2DMultisampleEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage2DMultisampleEXT] + .global bluegl_glGetInfoLogARB + .type bluegl_glGetInfoLogARB, %function +bluegl_glGetInfoLogARB: + adrp x16, :got:__blue_glCore_glGetInfoLogARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInfoLogARB] ldr x16, [x16] br x16 - .size bluegl_glTextureStorage2DMultisampleEXT, .-bluegl_glTextureStorage2DMultisampleEXT + .size bluegl_glGetInfoLogARB, .-bluegl_glGetInfoLogARB .align 2 - .global bluegl_glCopyTexSubImage1D - .type bluegl_glCopyTexSubImage1D, %function -bluegl_glCopyTexSubImage1D: - adrp x16, :got:__blue_glCore_glCopyTexSubImage1D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexSubImage1D] + .global bluegl_glGetAttachedObjectsARB + .type bluegl_glGetAttachedObjectsARB, %function +bluegl_glGetAttachedObjectsARB: + adrp x16, :got:__blue_glCore_glGetAttachedObjectsARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetAttachedObjectsARB] ldr x16, [x16] br x16 - .size bluegl_glCopyTexSubImage1D, .-bluegl_glCopyTexSubImage1D + .size bluegl_glGetAttachedObjectsARB, .-bluegl_glGetAttachedObjectsARB .align 2 - .global bluegl_glSamplerParameterf - .type bluegl_glSamplerParameterf, %function -bluegl_glSamplerParameterf: - adrp x16, :got:__blue_glCore_glSamplerParameterf - ldr x16, [x16, #:got_lo12:__blue_glCore_glSamplerParameterf] + .global bluegl_glGetUniformLocationARB + .type bluegl_glGetUniformLocationARB, %function +bluegl_glGetUniformLocationARB: + adrp x16, :got:__blue_glCore_glGetUniformLocationARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformLocationARB] ldr x16, [x16] br x16 - .size bluegl_glSamplerParameterf, .-bluegl_glSamplerParameterf + .size bluegl_glGetUniformLocationARB, .-bluegl_glGetUniformLocationARB .align 2 - .global bluegl_glDrawArraysInstancedBaseInstance - .type bluegl_glDrawArraysInstancedBaseInstance, %function -bluegl_glDrawArraysInstancedBaseInstance: - adrp x16, :got:__blue_glCore_glDrawArraysInstancedBaseInstance - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawArraysInstancedBaseInstance] + .global bluegl_glGetActiveUniformARB + .type bluegl_glGetActiveUniformARB, %function +bluegl_glGetActiveUniformARB: + adrp x16, :got:__blue_glCore_glGetActiveUniformARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveUniformARB] ldr x16, [x16] br x16 - .size bluegl_glDrawArraysInstancedBaseInstance, .-bluegl_glDrawArraysInstancedBaseInstance + .size bluegl_glGetActiveUniformARB, .-bluegl_glGetActiveUniformARB .align 2 - .global bluegl_glVertexAttrib4uivARB - .type bluegl_glVertexAttrib4uivARB, %function -bluegl_glVertexAttrib4uivARB: - adrp x16, :got:__blue_glCore_glVertexAttrib4uivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4uivARB] + .global bluegl_glGetUniformfvARB + .type bluegl_glGetUniformfvARB, %function +bluegl_glGetUniformfvARB: + adrp x16, :got:__blue_glCore_glGetUniformfvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformfvARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4uivARB, .-bluegl_glVertexAttrib4uivARB + .size bluegl_glGetUniformfvARB, .-bluegl_glGetUniformfvARB .align 2 - .global bluegl_glVertexAttribFormatNV - .type bluegl_glVertexAttribFormatNV, %function -bluegl_glVertexAttribFormatNV: - adrp x16, :got:__blue_glCore_glVertexAttribFormatNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribFormatNV] + .global bluegl_glGetUniformivARB + .type bluegl_glGetUniformivARB, %function +bluegl_glGetUniformivARB: + adrp x16, :got:__blue_glCore_glGetUniformivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformivARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribFormatNV, .-bluegl_glVertexAttribFormatNV + .size bluegl_glGetUniformivARB, .-bluegl_glGetUniformivARB .align 2 - .global bluegl_glIsQueryARB - .type bluegl_glIsQueryARB, %function -bluegl_glIsQueryARB: - adrp x16, :got:__blue_glCore_glIsQueryARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsQueryARB] + .global bluegl_glGetShaderSourceARB + .type bluegl_glGetShaderSourceARB, %function +bluegl_glGetShaderSourceARB: + adrp x16, :got:__blue_glCore_glGetShaderSourceARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetShaderSourceARB] ldr x16, [x16] br x16 - .size bluegl_glIsQueryARB, .-bluegl_glIsQueryARB + .size bluegl_glGetShaderSourceARB, .-bluegl_glGetShaderSourceARB .align 2 - .global bluegl_glSampleCoverageARB - .type bluegl_glSampleCoverageARB, %function -bluegl_glSampleCoverageARB: - adrp x16, :got:__blue_glCore_glSampleCoverageARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glSampleCoverageARB] + .global bluegl_glTexBufferARB + .type bluegl_glTexBufferARB, %function +bluegl_glTexBufferARB: + adrp x16, :got:__blue_glCore_glTexBufferARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexBufferARB] ldr x16, [x16] br x16 - .size bluegl_glSampleCoverageARB, .-bluegl_glSampleCoverageARB + .size bluegl_glTexBufferARB, .-bluegl_glTexBufferARB .align 2 - .global bluegl_glGetnCompressedTexImageARB - .type bluegl_glGetnCompressedTexImageARB, %function -bluegl_glGetnCompressedTexImageARB: - adrp x16, :got:__blue_glCore_glGetnCompressedTexImageARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnCompressedTexImageARB] + .global bluegl_glCompressedTexImage3DARB + .type bluegl_glCompressedTexImage3DARB, %function +bluegl_glCompressedTexImage3DARB: + adrp x16, :got:__blue_glCore_glCompressedTexImage3DARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexImage3DARB] ldr x16, [x16] br x16 - .size bluegl_glGetnCompressedTexImageARB, .-bluegl_glGetnCompressedTexImageARB + .size bluegl_glCompressedTexImage3DARB, .-bluegl_glCompressedTexImage3DARB .align 2 - .global bluegl_glTexCoord3xvOES - .type bluegl_glTexCoord3xvOES, %function -bluegl_glTexCoord3xvOES: - adrp x16, :got:__blue_glCore_glTexCoord3xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord3xvOES] + .global bluegl_glCompressedTexImage2DARB + .type bluegl_glCompressedTexImage2DARB, %function +bluegl_glCompressedTexImage2DARB: + adrp x16, :got:__blue_glCore_glCompressedTexImage2DARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexImage2DARB] ldr x16, [x16] br x16 - .size bluegl_glTexCoord3xvOES, .-bluegl_glTexCoord3xvOES + .size bluegl_glCompressedTexImage2DARB, .-bluegl_glCompressedTexImage2DARB .align 2 - .global bluegl_glTexCoord2fNormal3fVertex3fSUN - .type bluegl_glTexCoord2fNormal3fVertex3fSUN, %function -bluegl_glTexCoord2fNormal3fVertex3fSUN: - adrp x16, :got:__blue_glCore_glTexCoord2fNormal3fVertex3fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fNormal3fVertex3fSUN] + .global bluegl_glCompressedTexImage1DARB + .type bluegl_glCompressedTexImage1DARB, %function +bluegl_glCompressedTexImage1DARB: + adrp x16, :got:__blue_glCore_glCompressedTexImage1DARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexImage1DARB] ldr x16, [x16] br x16 - .size bluegl_glTexCoord2fNormal3fVertex3fSUN, .-bluegl_glTexCoord2fNormal3fVertex3fSUN + .size bluegl_glCompressedTexImage1DARB, .-bluegl_glCompressedTexImage1DARB .align 2 - .global bluegl_glGetGraphicsResetStatus - .type bluegl_glGetGraphicsResetStatus, %function -bluegl_glGetGraphicsResetStatus: - adrp x16, :got:__blue_glCore_glGetGraphicsResetStatus - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetGraphicsResetStatus] + .global bluegl_glCompressedTexSubImage3DARB + .type bluegl_glCompressedTexSubImage3DARB, %function +bluegl_glCompressedTexSubImage3DARB: + adrp x16, :got:__blue_glCore_glCompressedTexSubImage3DARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexSubImage3DARB] ldr x16, [x16] br x16 - .size bluegl_glGetGraphicsResetStatus, .-bluegl_glGetGraphicsResetStatus + .size bluegl_glCompressedTexSubImage3DARB, .-bluegl_glCompressedTexSubImage3DARB .align 2 - .global bluegl_glProgramVertexLimitNV - .type bluegl_glProgramVertexLimitNV, %function -bluegl_glProgramVertexLimitNV: - adrp x16, :got:__blue_glCore_glProgramVertexLimitNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramVertexLimitNV] + .global bluegl_glCompressedTexSubImage2DARB + .type bluegl_glCompressedTexSubImage2DARB, %function +bluegl_glCompressedTexSubImage2DARB: + adrp x16, :got:__blue_glCore_glCompressedTexSubImage2DARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexSubImage2DARB] ldr x16, [x16] br x16 - .size bluegl_glProgramVertexLimitNV, .-bluegl_glProgramVertexLimitNV + .size bluegl_glCompressedTexSubImage2DARB, .-bluegl_glCompressedTexSubImage2DARB .align 2 - .global bluegl_glCopyConvolutionFilter2D - .type bluegl_glCopyConvolutionFilter2D, %function -bluegl_glCopyConvolutionFilter2D: - adrp x16, :got:__blue_glCore_glCopyConvolutionFilter2D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyConvolutionFilter2D] + .global bluegl_glCompressedTexSubImage1DARB + .type bluegl_glCompressedTexSubImage1DARB, %function +bluegl_glCompressedTexSubImage1DARB: + adrp x16, :got:__blue_glCore_glCompressedTexSubImage1DARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexSubImage1DARB] ldr x16, [x16] br x16 - .size bluegl_glCopyConvolutionFilter2D, .-bluegl_glCopyConvolutionFilter2D + .size bluegl_glCompressedTexSubImage1DARB, .-bluegl_glCompressedTexSubImage1DARB .align 2 - .global bluegl_glVertexStream4fATI - .type bluegl_glVertexStream4fATI, %function -bluegl_glVertexStream4fATI: - adrp x16, :got:__blue_glCore_glVertexStream4fATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream4fATI] + .global bluegl_glGetCompressedTexImageARB + .type bluegl_glGetCompressedTexImageARB, %function +bluegl_glGetCompressedTexImageARB: + adrp x16, :got:__blue_glCore_glGetCompressedTexImageARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCompressedTexImageARB] ldr x16, [x16] br x16 - .size bluegl_glVertexStream4fATI, .-bluegl_glVertexStream4fATI + .size bluegl_glGetCompressedTexImageARB, .-bluegl_glGetCompressedTexImageARB .align 2 - .global bluegl_glSecondaryColor3f - .type bluegl_glSecondaryColor3f, %function -bluegl_glSecondaryColor3f: - adrp x16, :got:__blue_glCore_glSecondaryColor3f - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3f] + .global bluegl_glLoadTransposeMatrixfARB + .type bluegl_glLoadTransposeMatrixfARB, %function +bluegl_glLoadTransposeMatrixfARB: + adrp x16, :got:__blue_glCore_glLoadTransposeMatrixfARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glLoadTransposeMatrixfARB] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3f, .-bluegl_glSecondaryColor3f + .size bluegl_glLoadTransposeMatrixfARB, .-bluegl_glLoadTransposeMatrixfARB .align 2 - .global bluegl_glTexCoordP1ui - .type bluegl_glTexCoordP1ui, %function -bluegl_glTexCoordP1ui: - adrp x16, :got:__blue_glCore_glTexCoordP1ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordP1ui] + .global bluegl_glLoadTransposeMatrixdARB + .type bluegl_glLoadTransposeMatrixdARB, %function +bluegl_glLoadTransposeMatrixdARB: + adrp x16, :got:__blue_glCore_glLoadTransposeMatrixdARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glLoadTransposeMatrixdARB] ldr x16, [x16] br x16 - .size bluegl_glTexCoordP1ui, .-bluegl_glTexCoordP1ui + .size bluegl_glLoadTransposeMatrixdARB, .-bluegl_glLoadTransposeMatrixdARB .align 2 - .global bluegl_glProgramBufferParametersfvNV - .type bluegl_glProgramBufferParametersfvNV, %function -bluegl_glProgramBufferParametersfvNV: - adrp x16, :got:__blue_glCore_glProgramBufferParametersfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramBufferParametersfvNV] + .global bluegl_glMultTransposeMatrixfARB + .type bluegl_glMultTransposeMatrixfARB, %function +bluegl_glMultTransposeMatrixfARB: + adrp x16, :got:__blue_glCore_glMultTransposeMatrixfARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultTransposeMatrixfARB] ldr x16, [x16] br x16 - .size bluegl_glProgramBufferParametersfvNV, .-bluegl_glProgramBufferParametersfvNV + .size bluegl_glMultTransposeMatrixfARB, .-bluegl_glMultTransposeMatrixfARB .align 2 - .global bluegl_glTexCoord1xOES - .type bluegl_glTexCoord1xOES, %function -bluegl_glTexCoord1xOES: - adrp x16, :got:__blue_glCore_glTexCoord1xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord1xOES] + .global bluegl_glMultTransposeMatrixdARB + .type bluegl_glMultTransposeMatrixdARB, %function +bluegl_glMultTransposeMatrixdARB: + adrp x16, :got:__blue_glCore_glMultTransposeMatrixdARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultTransposeMatrixdARB] ldr x16, [x16] br x16 - .size bluegl_glTexCoord1xOES, .-bluegl_glTexCoord1xOES + .size bluegl_glMultTransposeMatrixdARB, .-bluegl_glMultTransposeMatrixdARB .align 2 - .global bluegl_glFogCoordfv - .type bluegl_glFogCoordfv, %function -bluegl_glFogCoordfv: - adrp x16, :got:__blue_glCore_glFogCoordfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordfv] + .global bluegl_glWeightbvARB + .type bluegl_glWeightbvARB, %function +bluegl_glWeightbvARB: + adrp x16, :got:__blue_glCore_glWeightbvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightbvARB] + ldr x16, [x16] + br x16 + .size bluegl_glWeightbvARB, .-bluegl_glWeightbvARB + + .align 2 + .global bluegl_glWeightsvARB + .type bluegl_glWeightsvARB, %function +bluegl_glWeightsvARB: + adrp x16, :got:__blue_glCore_glWeightsvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightsvARB] ldr x16, [x16] br x16 - .size bluegl_glFogCoordfv, .-bluegl_glFogCoordfv + .size bluegl_glWeightsvARB, .-bluegl_glWeightsvARB .align 2 - .global bluegl_glMultiDrawElementsIndirectAMD - .type bluegl_glMultiDrawElementsIndirectAMD, %function -bluegl_glMultiDrawElementsIndirectAMD: - adrp x16, :got:__blue_glCore_glMultiDrawElementsIndirectAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawElementsIndirectAMD] + .global bluegl_glWeightivARB + .type bluegl_glWeightivARB, %function +bluegl_glWeightivARB: + adrp x16, :got:__blue_glCore_glWeightivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightivARB] ldr x16, [x16] br x16 - .size bluegl_glMultiDrawElementsIndirectAMD, .-bluegl_glMultiDrawElementsIndirectAMD + .size bluegl_glWeightivARB, .-bluegl_glWeightivARB .align 2 - .global bluegl_glGetnMinmaxARB - .type bluegl_glGetnMinmaxARB, %function -bluegl_glGetnMinmaxARB: - adrp x16, :got:__blue_glCore_glGetnMinmaxARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnMinmaxARB] + .global bluegl_glWeightfvARB + .type bluegl_glWeightfvARB, %function +bluegl_glWeightfvARB: + adrp x16, :got:__blue_glCore_glWeightfvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightfvARB] ldr x16, [x16] br x16 - .size bluegl_glGetnMinmaxARB, .-bluegl_glGetnMinmaxARB + .size bluegl_glWeightfvARB, .-bluegl_glWeightfvARB .align 2 - .global bluegl_glSecondaryColor3uivEXT - .type bluegl_glSecondaryColor3uivEXT, %function -bluegl_glSecondaryColor3uivEXT: - adrp x16, :got:__blue_glCore_glSecondaryColor3uivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3uivEXT] + .global bluegl_glWeightdvARB + .type bluegl_glWeightdvARB, %function +bluegl_glWeightdvARB: + adrp x16, :got:__blue_glCore_glWeightdvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightdvARB] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3uivEXT, .-bluegl_glSecondaryColor3uivEXT + .size bluegl_glWeightdvARB, .-bluegl_glWeightdvARB .align 2 - .global bluegl_glColorMask - .type bluegl_glColorMask, %function -bluegl_glColorMask: - adrp x16, :got:__blue_glCore_glColorMask - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorMask] + .global bluegl_glWeightubvARB + .type bluegl_glWeightubvARB, %function +bluegl_glWeightubvARB: + adrp x16, :got:__blue_glCore_glWeightubvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightubvARB] ldr x16, [x16] br x16 - .size bluegl_glColorMask, .-bluegl_glColorMask + .size bluegl_glWeightubvARB, .-bluegl_glWeightubvARB .align 2 - .global bluegl_glTextureImage2DMultisampleCoverageNV - .type bluegl_glTextureImage2DMultisampleCoverageNV, %function -bluegl_glTextureImage2DMultisampleCoverageNV: - adrp x16, :got:__blue_glCore_glTextureImage2DMultisampleCoverageNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureImage2DMultisampleCoverageNV] + .global bluegl_glWeightusvARB + .type bluegl_glWeightusvARB, %function +bluegl_glWeightusvARB: + adrp x16, :got:__blue_glCore_glWeightusvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightusvARB] ldr x16, [x16] br x16 - .size bluegl_glTextureImage2DMultisampleCoverageNV, .-bluegl_glTextureImage2DMultisampleCoverageNV + .size bluegl_glWeightusvARB, .-bluegl_glWeightusvARB .align 2 - .global bluegl_glMultiModeDrawElementsIBM - .type bluegl_glMultiModeDrawElementsIBM, %function -bluegl_glMultiModeDrawElementsIBM: - adrp x16, :got:__blue_glCore_glMultiModeDrawElementsIBM - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiModeDrawElementsIBM] + .global bluegl_glWeightuivARB + .type bluegl_glWeightuivARB, %function +bluegl_glWeightuivARB: + adrp x16, :got:__blue_glCore_glWeightuivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightuivARB] ldr x16, [x16] br x16 - .size bluegl_glMultiModeDrawElementsIBM, .-bluegl_glMultiModeDrawElementsIBM + .size bluegl_glWeightuivARB, .-bluegl_glWeightuivARB .align 2 - .global bluegl_glVertexArrayAttribLFormat - .type bluegl_glVertexArrayAttribLFormat, %function -bluegl_glVertexArrayAttribLFormat: - adrp x16, :got:__blue_glCore_glVertexArrayAttribLFormat - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayAttribLFormat] + .global bluegl_glWeightPointerARB + .type bluegl_glWeightPointerARB, %function +bluegl_glWeightPointerARB: + adrp x16, :got:__blue_glCore_glWeightPointerARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightPointerARB] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayAttribLFormat, .-bluegl_glVertexArrayAttribLFormat + .size bluegl_glWeightPointerARB, .-bluegl_glWeightPointerARB .align 2 - .global bluegl_glBindFragDataLocationIndexed - .type bluegl_glBindFragDataLocationIndexed, %function -bluegl_glBindFragDataLocationIndexed: - adrp x16, :got:__blue_glCore_glBindFragDataLocationIndexed - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindFragDataLocationIndexed] + .global bluegl_glVertexBlendARB + .type bluegl_glVertexBlendARB, %function +bluegl_glVertexBlendARB: + adrp x16, :got:__blue_glCore_glVertexBlendARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexBlendARB] ldr x16, [x16] br x16 - .size bluegl_glBindFragDataLocationIndexed, .-bluegl_glBindFragDataLocationIndexed + .size bluegl_glVertexBlendARB, .-bluegl_glVertexBlendARB .align 2 - .global bluegl_glGetNamedBufferParameterivEXT - .type bluegl_glGetNamedBufferParameterivEXT, %function -bluegl_glGetNamedBufferParameterivEXT: - adrp x16, :got:__blue_glCore_glGetNamedBufferParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedBufferParameterivEXT] + .global bluegl_glBindBufferARB + .type bluegl_glBindBufferARB, %function +bluegl_glBindBufferARB: + adrp x16, :got:__blue_glCore_glBindBufferARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBufferARB] ldr x16, [x16] br x16 - .size bluegl_glGetNamedBufferParameterivEXT, .-bluegl_glGetNamedBufferParameterivEXT + .size bluegl_glBindBufferARB, .-bluegl_glBindBufferARB .align 2 - .global bluegl_glSecondaryColor3bEXT - .type bluegl_glSecondaryColor3bEXT, %function -bluegl_glSecondaryColor3bEXT: - adrp x16, :got:__blue_glCore_glSecondaryColor3bEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3bEXT] + .global bluegl_glDeleteBuffersARB + .type bluegl_glDeleteBuffersARB, %function +bluegl_glDeleteBuffersARB: + adrp x16, :got:__blue_glCore_glDeleteBuffersARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteBuffersARB] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3bEXT, .-bluegl_glSecondaryColor3bEXT + .size bluegl_glDeleteBuffersARB, .-bluegl_glDeleteBuffersARB .align 2 - .global bluegl_glVertexAttrib1fNV - .type bluegl_glVertexAttrib1fNV, %function -bluegl_glVertexAttrib1fNV: - adrp x16, :got:__blue_glCore_glVertexAttrib1fNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1fNV] + .global bluegl_glGenBuffersARB + .type bluegl_glGenBuffersARB, %function +bluegl_glGenBuffersARB: + adrp x16, :got:__blue_glCore_glGenBuffersARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenBuffersARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1fNV, .-bluegl_glVertexAttrib1fNV + .size bluegl_glGenBuffersARB, .-bluegl_glGenBuffersARB .align 2 - .global bluegl_glVertexAttribI4uivEXT - .type bluegl_glVertexAttribI4uivEXT, %function -bluegl_glVertexAttribI4uivEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI4uivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4uivEXT] + .global bluegl_glIsBufferARB + .type bluegl_glIsBufferARB, %function +bluegl_glIsBufferARB: + adrp x16, :got:__blue_glCore_glIsBufferARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsBufferARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI4uivEXT, .-bluegl_glVertexAttribI4uivEXT + .size bluegl_glIsBufferARB, .-bluegl_glIsBufferARB .align 2 - .global bluegl_glGetQueryObjecti64vEXT - .type bluegl_glGetQueryObjecti64vEXT, %function -bluegl_glGetQueryObjecti64vEXT: - adrp x16, :got:__blue_glCore_glGetQueryObjecti64vEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryObjecti64vEXT] + .global bluegl_glBufferDataARB + .type bluegl_glBufferDataARB, %function +bluegl_glBufferDataARB: + adrp x16, :got:__blue_glCore_glBufferDataARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glBufferDataARB] ldr x16, [x16] br x16 - .size bluegl_glGetQueryObjecti64vEXT, .-bluegl_glGetQueryObjecti64vEXT + .size bluegl_glBufferDataARB, .-bluegl_glBufferDataARB .align 2 - .global bluegl_glNormalStream3bATI - .type bluegl_glNormalStream3bATI, %function -bluegl_glNormalStream3bATI: - adrp x16, :got:__blue_glCore_glNormalStream3bATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3bATI] + .global bluegl_glBufferSubDataARB + .type bluegl_glBufferSubDataARB, %function +bluegl_glBufferSubDataARB: + adrp x16, :got:__blue_glCore_glBufferSubDataARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glBufferSubDataARB] ldr x16, [x16] br x16 - .size bluegl_glNormalStream3bATI, .-bluegl_glNormalStream3bATI + .size bluegl_glBufferSubDataARB, .-bluegl_glBufferSubDataARB .align 2 - .global bluegl_glGetObjectParameterivAPPLE - .type bluegl_glGetObjectParameterivAPPLE, %function -bluegl_glGetObjectParameterivAPPLE: - adrp x16, :got:__blue_glCore_glGetObjectParameterivAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetObjectParameterivAPPLE] + .global bluegl_glGetBufferSubDataARB + .type bluegl_glGetBufferSubDataARB, %function +bluegl_glGetBufferSubDataARB: + adrp x16, :got:__blue_glCore_glGetBufferSubDataARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBufferSubDataARB] ldr x16, [x16] br x16 - .size bluegl_glGetObjectParameterivAPPLE, .-bluegl_glGetObjectParameterivAPPLE + .size bluegl_glGetBufferSubDataARB, .-bluegl_glGetBufferSubDataARB .align 2 - .global bluegl_glProgramUniform3uivEXT - .type bluegl_glProgramUniform3uivEXT, %function -bluegl_glProgramUniform3uivEXT: - adrp x16, :got:__blue_glCore_glProgramUniform3uivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3uivEXT] + .global bluegl_glMapBufferARB + .type bluegl_glMapBufferARB, %function +bluegl_glMapBufferARB: + adrp x16, :got:__blue_glCore_glMapBufferARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glMapBufferARB] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3uivEXT, .-bluegl_glProgramUniform3uivEXT + .size bluegl_glMapBufferARB, .-bluegl_glMapBufferARB .align 2 - .global bluegl_glProgramUniformHandleui64ARB - .type bluegl_glProgramUniformHandleui64ARB, %function -bluegl_glProgramUniformHandleui64ARB: - adrp x16, :got:__blue_glCore_glProgramUniformHandleui64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformHandleui64ARB] + .global bluegl_glUnmapBufferARB + .type bluegl_glUnmapBufferARB, %function +bluegl_glUnmapBufferARB: + adrp x16, :got:__blue_glCore_glUnmapBufferARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glUnmapBufferARB] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformHandleui64ARB, .-bluegl_glProgramUniformHandleui64ARB + .size bluegl_glUnmapBufferARB, .-bluegl_glUnmapBufferARB .align 2 - .global bluegl_glGetPointerv - .type bluegl_glGetPointerv, %function -bluegl_glGetPointerv: - adrp x16, :got:__blue_glCore_glGetPointerv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPointerv] + .global bluegl_glGetBufferParameterivARB + .type bluegl_glGetBufferParameterivARB, %function +bluegl_glGetBufferParameterivARB: + adrp x16, :got:__blue_glCore_glGetBufferParameterivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBufferParameterivARB] ldr x16, [x16] br x16 - .size bluegl_glGetPointerv, .-bluegl_glGetPointerv + .size bluegl_glGetBufferParameterivARB, .-bluegl_glGetBufferParameterivARB .align 2 - .global bluegl_glUniformMatrix4x3dv - .type bluegl_glUniformMatrix4x3dv, %function -bluegl_glUniformMatrix4x3dv: - adrp x16, :got:__blue_glCore_glUniformMatrix4x3dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix4x3dv] + .global bluegl_glGetBufferPointervARB + .type bluegl_glGetBufferPointervARB, %function +bluegl_glGetBufferPointervARB: + adrp x16, :got:__blue_glCore_glGetBufferPointervARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBufferPointervARB] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix4x3dv, .-bluegl_glUniformMatrix4x3dv + .size bluegl_glGetBufferPointervARB, .-bluegl_glGetBufferPointervARB .align 2 - .global bluegl_glTexCoordP4uiv - .type bluegl_glTexCoordP4uiv, %function -bluegl_glTexCoordP4uiv: - adrp x16, :got:__blue_glCore_glTexCoordP4uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordP4uiv] + .global bluegl_glVertexAttrib1dARB + .type bluegl_glVertexAttrib1dARB, %function +bluegl_glVertexAttrib1dARB: + adrp x16, :got:__blue_glCore_glVertexAttrib1dARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1dARB] ldr x16, [x16] br x16 - .size bluegl_glTexCoordP4uiv, .-bluegl_glTexCoordP4uiv + .size bluegl_glVertexAttrib1dARB, .-bluegl_glVertexAttrib1dARB .align 2 - .global bluegl_glVertexAttribI4sv - .type bluegl_glVertexAttribI4sv, %function -bluegl_glVertexAttribI4sv: - adrp x16, :got:__blue_glCore_glVertexAttribI4sv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4sv] + .global bluegl_glVertexAttrib1dvARB + .type bluegl_glVertexAttrib1dvARB, %function +bluegl_glVertexAttrib1dvARB: + adrp x16, :got:__blue_glCore_glVertexAttrib1dvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1dvARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI4sv, .-bluegl_glVertexAttribI4sv + .size bluegl_glVertexAttrib1dvARB, .-bluegl_glVertexAttrib1dvARB .align 2 - .global bluegl_glFlushMappedNamedBufferRangeEXT - .type bluegl_glFlushMappedNamedBufferRangeEXT, %function -bluegl_glFlushMappedNamedBufferRangeEXT: - adrp x16, :got:__blue_glCore_glFlushMappedNamedBufferRangeEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glFlushMappedNamedBufferRangeEXT] + .global bluegl_glVertexAttrib1fARB + .type bluegl_glVertexAttrib1fARB, %function +bluegl_glVertexAttrib1fARB: + adrp x16, :got:__blue_glCore_glVertexAttrib1fARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1fARB] ldr x16, [x16] br x16 - .size bluegl_glFlushMappedNamedBufferRangeEXT, .-bluegl_glFlushMappedNamedBufferRangeEXT + .size bluegl_glVertexAttrib1fARB, .-bluegl_glVertexAttrib1fARB .align 2 - .global bluegl_glDisableVertexArrayEXT - .type bluegl_glDisableVertexArrayEXT, %function -bluegl_glDisableVertexArrayEXT: - adrp x16, :got:__blue_glCore_glDisableVertexArrayEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableVertexArrayEXT] + .global bluegl_glVertexAttrib1fvARB + .type bluegl_glVertexAttrib1fvARB, %function +bluegl_glVertexAttrib1fvARB: + adrp x16, :got:__blue_glCore_glVertexAttrib1fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1fvARB] ldr x16, [x16] br x16 - .size bluegl_glDisableVertexArrayEXT, .-bluegl_glDisableVertexArrayEXT + .size bluegl_glVertexAttrib1fvARB, .-bluegl_glVertexAttrib1fvARB .align 2 - .global bluegl_glGetPathDashArrayNV - .type bluegl_glGetPathDashArrayNV, %function -bluegl_glGetPathDashArrayNV: - adrp x16, :got:__blue_glCore_glGetPathDashArrayNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathDashArrayNV] + .global bluegl_glVertexAttrib1sARB + .type bluegl_glVertexAttrib1sARB, %function +bluegl_glVertexAttrib1sARB: + adrp x16, :got:__blue_glCore_glVertexAttrib1sARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1sARB] ldr x16, [x16] br x16 - .size bluegl_glGetPathDashArrayNV, .-bluegl_glGetPathDashArrayNV + .size bluegl_glVertexAttrib1sARB, .-bluegl_glVertexAttrib1sARB .align 2 - .global bluegl_glProgramUniform2uiEXT - .type bluegl_glProgramUniform2uiEXT, %function -bluegl_glProgramUniform2uiEXT: - adrp x16, :got:__blue_glCore_glProgramUniform2uiEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2uiEXT] + .global bluegl_glVertexAttrib1svARB + .type bluegl_glVertexAttrib1svARB, %function +bluegl_glVertexAttrib1svARB: + adrp x16, :got:__blue_glCore_glVertexAttrib1svARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1svARB] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2uiEXT, .-bluegl_glProgramUniform2uiEXT + .size bluegl_glVertexAttrib1svARB, .-bluegl_glVertexAttrib1svARB .align 2 - .global bluegl_glBindImageTextures - .type bluegl_glBindImageTextures, %function -bluegl_glBindImageTextures: - adrp x16, :got:__blue_glCore_glBindImageTextures - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindImageTextures] + .global bluegl_glVertexAttrib2dARB + .type bluegl_glVertexAttrib2dARB, %function +bluegl_glVertexAttrib2dARB: + adrp x16, :got:__blue_glCore_glVertexAttrib2dARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2dARB] ldr x16, [x16] br x16 - .size bluegl_glBindImageTextures, .-bluegl_glBindImageTextures + .size bluegl_glVertexAttrib2dARB, .-bluegl_glVertexAttrib2dARB .align 2 - .global bluegl_glVertexAttrib4sNV - .type bluegl_glVertexAttrib4sNV, %function -bluegl_glVertexAttrib4sNV: - adrp x16, :got:__blue_glCore_glVertexAttrib4sNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4sNV] + .global bluegl_glVertexAttrib2dvARB + .type bluegl_glVertexAttrib2dvARB, %function +bluegl_glVertexAttrib2dvARB: + adrp x16, :got:__blue_glCore_glVertexAttrib2dvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2dvARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4sNV, .-bluegl_glVertexAttrib4sNV + .size bluegl_glVertexAttrib2dvARB, .-bluegl_glVertexAttrib2dvARB .align 2 - .global bluegl_glReplacementCodeuiNormal3fVertex3fvSUN - .type bluegl_glReplacementCodeuiNormal3fVertex3fvSUN, %function -bluegl_glReplacementCodeuiNormal3fVertex3fvSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN] + .global bluegl_glVertexAttrib2fARB + .type bluegl_glVertexAttrib2fARB, %function +bluegl_glVertexAttrib2fARB: + adrp x16, :got:__blue_glCore_glVertexAttrib2fARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2fARB] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeuiNormal3fVertex3fvSUN, .-bluegl_glReplacementCodeuiNormal3fVertex3fvSUN + .size bluegl_glVertexAttrib2fARB, .-bluegl_glVertexAttrib2fARB .align 2 - .global bluegl_glVertex3hNV - .type bluegl_glVertex3hNV, %function -bluegl_glVertex3hNV: - adrp x16, :got:__blue_glCore_glVertex3hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex3hNV] + .global bluegl_glVertexAttrib2fvARB + .type bluegl_glVertexAttrib2fvARB, %function +bluegl_glVertexAttrib2fvARB: + adrp x16, :got:__blue_glCore_glVertexAttrib2fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2fvARB] ldr x16, [x16] br x16 - .size bluegl_glVertex3hNV, .-bluegl_glVertex3hNV + .size bluegl_glVertexAttrib2fvARB, .-bluegl_glVertexAttrib2fvARB .align 2 - .global bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN - .type bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN, %function -bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN] + .global bluegl_glVertexAttrib2sARB + .type bluegl_glVertexAttrib2sARB, %function +bluegl_glVertexAttrib2sARB: + adrp x16, :got:__blue_glCore_glVertexAttrib2sARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2sARB] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN, .-bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN + .size bluegl_glVertexAttrib2sARB, .-bluegl_glVertexAttrib2sARB .align 2 - .global bluegl_glProgramUniform2i64NV - .type bluegl_glProgramUniform2i64NV, %function -bluegl_glProgramUniform2i64NV: - adrp x16, :got:__blue_glCore_glProgramUniform2i64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2i64NV] + .global bluegl_glVertexAttrib2svARB + .type bluegl_glVertexAttrib2svARB, %function +bluegl_glVertexAttrib2svARB: + adrp x16, :got:__blue_glCore_glVertexAttrib2svARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2svARB] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2i64NV, .-bluegl_glProgramUniform2i64NV + .size bluegl_glVertexAttrib2svARB, .-bluegl_glVertexAttrib2svARB .align 2 - .global bluegl_glBufferData - .type bluegl_glBufferData, %function -bluegl_glBufferData: - adrp x16, :got:__blue_glCore_glBufferData - ldr x16, [x16, #:got_lo12:__blue_glCore_glBufferData] + .global bluegl_glVertexAttrib3dARB + .type bluegl_glVertexAttrib3dARB, %function +bluegl_glVertexAttrib3dARB: + adrp x16, :got:__blue_glCore_glVertexAttrib3dARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3dARB] ldr x16, [x16] br x16 - .size bluegl_glBufferData, .-bluegl_glBufferData + .size bluegl_glVertexAttrib3dARB, .-bluegl_glVertexAttrib3dARB .align 2 - .global bluegl_glGetBufferParameteriv - .type bluegl_glGetBufferParameteriv, %function -bluegl_glGetBufferParameteriv: - adrp x16, :got:__blue_glCore_glGetBufferParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBufferParameteriv] + .global bluegl_glVertexAttrib3dvARB + .type bluegl_glVertexAttrib3dvARB, %function +bluegl_glVertexAttrib3dvARB: + adrp x16, :got:__blue_glCore_glVertexAttrib3dvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3dvARB] ldr x16, [x16] br x16 - .size bluegl_glGetBufferParameteriv, .-bluegl_glGetBufferParameteriv + .size bluegl_glVertexAttrib3dvARB, .-bluegl_glVertexAttrib3dvARB .align 2 - .global bluegl_glIsAsyncMarkerSGIX - .type bluegl_glIsAsyncMarkerSGIX, %function -bluegl_glIsAsyncMarkerSGIX: - adrp x16, :got:__blue_glCore_glIsAsyncMarkerSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsAsyncMarkerSGIX] + .global bluegl_glVertexAttrib3fARB + .type bluegl_glVertexAttrib3fARB, %function +bluegl_glVertexAttrib3fARB: + adrp x16, :got:__blue_glCore_glVertexAttrib3fARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3fARB] ldr x16, [x16] br x16 - .size bluegl_glIsAsyncMarkerSGIX, .-bluegl_glIsAsyncMarkerSGIX + .size bluegl_glVertexAttrib3fARB, .-bluegl_glVertexAttrib3fARB .align 2 - .global bluegl_glTexImage4DSGIS - .type bluegl_glTexImage4DSGIS, %function -bluegl_glTexImage4DSGIS: - adrp x16, :got:__blue_glCore_glTexImage4DSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexImage4DSGIS] + .global bluegl_glVertexAttrib3fvARB + .type bluegl_glVertexAttrib3fvARB, %function +bluegl_glVertexAttrib3fvARB: + adrp x16, :got:__blue_glCore_glVertexAttrib3fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3fvARB] ldr x16, [x16] br x16 - .size bluegl_glTexImage4DSGIS, .-bluegl_glTexImage4DSGIS + .size bluegl_glVertexAttrib3fvARB, .-bluegl_glVertexAttrib3fvARB .align 2 - .global bluegl_glGetMultiTexEnvivEXT - .type bluegl_glGetMultiTexEnvivEXT, %function -bluegl_glGetMultiTexEnvivEXT: - adrp x16, :got:__blue_glCore_glGetMultiTexEnvivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexEnvivEXT] + .global bluegl_glVertexAttrib3sARB + .type bluegl_glVertexAttrib3sARB, %function +bluegl_glVertexAttrib3sARB: + adrp x16, :got:__blue_glCore_glVertexAttrib3sARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3sARB] ldr x16, [x16] br x16 - .size bluegl_glGetMultiTexEnvivEXT, .-bluegl_glGetMultiTexEnvivEXT + .size bluegl_glVertexAttrib3sARB, .-bluegl_glVertexAttrib3sARB .align 2 - .global bluegl_glGetClipPlanexOES - .type bluegl_glGetClipPlanexOES, %function -bluegl_glGetClipPlanexOES: - adrp x16, :got:__blue_glCore_glGetClipPlanexOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetClipPlanexOES] + .global bluegl_glVertexAttrib3svARB + .type bluegl_glVertexAttrib3svARB, %function +bluegl_glVertexAttrib3svARB: + adrp x16, :got:__blue_glCore_glVertexAttrib3svARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3svARB] ldr x16, [x16] br x16 - .size bluegl_glGetClipPlanexOES, .-bluegl_glGetClipPlanexOES + .size bluegl_glVertexAttrib3svARB, .-bluegl_glVertexAttrib3svARB .align 2 - .global bluegl_glUniform3uiEXT - .type bluegl_glUniform3uiEXT, %function -bluegl_glUniform3uiEXT: - adrp x16, :got:__blue_glCore_glUniform3uiEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3uiEXT] + .global bluegl_glVertexAttrib4NbvARB + .type bluegl_glVertexAttrib4NbvARB, %function +bluegl_glVertexAttrib4NbvARB: + adrp x16, :got:__blue_glCore_glVertexAttrib4NbvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4NbvARB] ldr x16, [x16] br x16 - .size bluegl_glUniform3uiEXT, .-bluegl_glUniform3uiEXT + .size bluegl_glVertexAttrib4NbvARB, .-bluegl_glVertexAttrib4NbvARB .align 2 - .global bluegl_glMultiTexCoord3sv - .type bluegl_glMultiTexCoord3sv, %function -bluegl_glMultiTexCoord3sv: - adrp x16, :got:__blue_glCore_glMultiTexCoord3sv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3sv] + .global bluegl_glVertexAttrib4NivARB + .type bluegl_glVertexAttrib4NivARB, %function +bluegl_glVertexAttrib4NivARB: + adrp x16, :got:__blue_glCore_glVertexAttrib4NivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4NivARB] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3sv, .-bluegl_glMultiTexCoord3sv + .size bluegl_glVertexAttrib4NivARB, .-bluegl_glVertexAttrib4NivARB .align 2 - .global bluegl_glVertexAttribs1hvNV - .type bluegl_glVertexAttribs1hvNV, %function -bluegl_glVertexAttribs1hvNV: - adrp x16, :got:__blue_glCore_glVertexAttribs1hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs1hvNV] + .global bluegl_glVertexAttrib4NsvARB + .type bluegl_glVertexAttrib4NsvARB, %function +bluegl_glVertexAttrib4NsvARB: + adrp x16, :got:__blue_glCore_glVertexAttrib4NsvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4NsvARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribs1hvNV, .-bluegl_glVertexAttribs1hvNV + .size bluegl_glVertexAttrib4NsvARB, .-bluegl_glVertexAttrib4NsvARB .align 2 - .global bluegl_glGetPerfQueryInfoINTEL - .type bluegl_glGetPerfQueryInfoINTEL, %function -bluegl_glGetPerfQueryInfoINTEL: - adrp x16, :got:__blue_glCore_glGetPerfQueryInfoINTEL - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfQueryInfoINTEL] + .global bluegl_glVertexAttrib4NubARB + .type bluegl_glVertexAttrib4NubARB, %function +bluegl_glVertexAttrib4NubARB: + adrp x16, :got:__blue_glCore_glVertexAttrib4NubARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4NubARB] ldr x16, [x16] br x16 - .size bluegl_glGetPerfQueryInfoINTEL, .-bluegl_glGetPerfQueryInfoINTEL + .size bluegl_glVertexAttrib4NubARB, .-bluegl_glVertexAttrib4NubARB .align 2 - .global bluegl_glGetClipPlanefOES - .type bluegl_glGetClipPlanefOES, %function -bluegl_glGetClipPlanefOES: - adrp x16, :got:__blue_glCore_glGetClipPlanefOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetClipPlanefOES] + .global bluegl_glVertexAttrib4NubvARB + .type bluegl_glVertexAttrib4NubvARB, %function +bluegl_glVertexAttrib4NubvARB: + adrp x16, :got:__blue_glCore_glVertexAttrib4NubvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4NubvARB] ldr x16, [x16] br x16 - .size bluegl_glGetClipPlanefOES, .-bluegl_glGetClipPlanefOES + .size bluegl_glVertexAttrib4NubvARB, .-bluegl_glVertexAttrib4NubvARB .align 2 - .global bluegl_glSecondaryColor3ubEXT - .type bluegl_glSecondaryColor3ubEXT, %function -bluegl_glSecondaryColor3ubEXT: - adrp x16, :got:__blue_glCore_glSecondaryColor3ubEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3ubEXT] + .global bluegl_glVertexAttrib4NuivARB + .type bluegl_glVertexAttrib4NuivARB, %function +bluegl_glVertexAttrib4NuivARB: + adrp x16, :got:__blue_glCore_glVertexAttrib4NuivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4NuivARB] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3ubEXT, .-bluegl_glSecondaryColor3ubEXT + .size bluegl_glVertexAttrib4NuivARB, .-bluegl_glVertexAttrib4NuivARB .align 2 - .global bluegl_glSyncTextureINTEL - .type bluegl_glSyncTextureINTEL, %function -bluegl_glSyncTextureINTEL: - adrp x16, :got:__blue_glCore_glSyncTextureINTEL - ldr x16, [x16, #:got_lo12:__blue_glCore_glSyncTextureINTEL] + .global bluegl_glVertexAttrib4NusvARB + .type bluegl_glVertexAttrib4NusvARB, %function +bluegl_glVertexAttrib4NusvARB: + adrp x16, :got:__blue_glCore_glVertexAttrib4NusvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4NusvARB] ldr x16, [x16] br x16 - .size bluegl_glSyncTextureINTEL, .-bluegl_glSyncTextureINTEL + .size bluegl_glVertexAttrib4NusvARB, .-bluegl_glVertexAttrib4NusvARB .align 2 - .global bluegl_glProgramUniformMatrix3x2dv - .type bluegl_glProgramUniformMatrix3x2dv, %function -bluegl_glProgramUniformMatrix3x2dv: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix3x2dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3x2dv] + .global bluegl_glVertexAttrib4bvARB + .type bluegl_glVertexAttrib4bvARB, %function +bluegl_glVertexAttrib4bvARB: + adrp x16, :got:__blue_glCore_glVertexAttrib4bvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4bvARB] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix3x2dv, .-bluegl_glProgramUniformMatrix3x2dv + .size bluegl_glVertexAttrib4bvARB, .-bluegl_glVertexAttrib4bvARB .align 2 - .global bluegl_glUniformMatrix4x2fv - .type bluegl_glUniformMatrix4x2fv, %function -bluegl_glUniformMatrix4x2fv: - adrp x16, :got:__blue_glCore_glUniformMatrix4x2fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix4x2fv] + .global bluegl_glVertexAttrib4dARB + .type bluegl_glVertexAttrib4dARB, %function +bluegl_glVertexAttrib4dARB: + adrp x16, :got:__blue_glCore_glVertexAttrib4dARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4dARB] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix4x2fv, .-bluegl_glUniformMatrix4x2fv + .size bluegl_glVertexAttrib4dARB, .-bluegl_glVertexAttrib4dARB .align 2 - .global bluegl_glTextureBufferEXT - .type bluegl_glTextureBufferEXT, %function -bluegl_glTextureBufferEXT: - adrp x16, :got:__blue_glCore_glTextureBufferEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureBufferEXT] + .global bluegl_glVertexAttrib4dvARB + .type bluegl_glVertexAttrib4dvARB, %function +bluegl_glVertexAttrib4dvARB: + adrp x16, :got:__blue_glCore_glVertexAttrib4dvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4dvARB] ldr x16, [x16] br x16 - .size bluegl_glTextureBufferEXT, .-bluegl_glTextureBufferEXT + .size bluegl_glVertexAttrib4dvARB, .-bluegl_glVertexAttrib4dvARB .align 2 - .global bluegl_glVertexPointervINTEL - .type bluegl_glVertexPointervINTEL, %function -bluegl_glVertexPointervINTEL: - adrp x16, :got:__blue_glCore_glVertexPointervINTEL - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexPointervINTEL] + .global bluegl_glVertexAttrib4fARB + .type bluegl_glVertexAttrib4fARB, %function +bluegl_glVertexAttrib4fARB: + adrp x16, :got:__blue_glCore_glVertexAttrib4fARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4fARB] ldr x16, [x16] br x16 - .size bluegl_glVertexPointervINTEL, .-bluegl_glVertexPointervINTEL + .size bluegl_glVertexAttrib4fARB, .-bluegl_glVertexAttrib4fARB .align 2 - .global bluegl_glGetShaderPrecisionFormat - .type bluegl_glGetShaderPrecisionFormat, %function -bluegl_glGetShaderPrecisionFormat: - adrp x16, :got:__blue_glCore_glGetShaderPrecisionFormat - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetShaderPrecisionFormat] + .global bluegl_glVertexAttrib4fvARB + .type bluegl_glVertexAttrib4fvARB, %function +bluegl_glVertexAttrib4fvARB: + adrp x16, :got:__blue_glCore_glVertexAttrib4fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4fvARB] ldr x16, [x16] br x16 - .size bluegl_glGetShaderPrecisionFormat, .-bluegl_glGetShaderPrecisionFormat + .size bluegl_glVertexAttrib4fvARB, .-bluegl_glVertexAttrib4fvARB .align 2 - .global bluegl_glGetTextureImage - .type bluegl_glGetTextureImage, %function -bluegl_glGetTextureImage: - adrp x16, :got:__blue_glCore_glGetTextureImage - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureImage] + .global bluegl_glVertexAttrib4ivARB + .type bluegl_glVertexAttrib4ivARB, %function +bluegl_glVertexAttrib4ivARB: + adrp x16, :got:__blue_glCore_glVertexAttrib4ivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4ivARB] ldr x16, [x16] br x16 - .size bluegl_glGetTextureImage, .-bluegl_glGetTextureImage + .size bluegl_glVertexAttrib4ivARB, .-bluegl_glVertexAttrib4ivARB .align 2 - .global bluegl_glUniform3ivARB - .type bluegl_glUniform3ivARB, %function -bluegl_glUniform3ivARB: - adrp x16, :got:__blue_glCore_glUniform3ivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3ivARB] + .global bluegl_glVertexAttrib4sARB + .type bluegl_glVertexAttrib4sARB, %function +bluegl_glVertexAttrib4sARB: + adrp x16, :got:__blue_glCore_glVertexAttrib4sARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4sARB] ldr x16, [x16] br x16 - .size bluegl_glUniform3ivARB, .-bluegl_glUniform3ivARB + .size bluegl_glVertexAttrib4sARB, .-bluegl_glVertexAttrib4sARB .align 2 - .global bluegl_glFramebufferParameteri - .type bluegl_glFramebufferParameteri, %function -bluegl_glFramebufferParameteri: - adrp x16, :got:__blue_glCore_glFramebufferParameteri - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferParameteri] + .global bluegl_glVertexAttrib4svARB + .type bluegl_glVertexAttrib4svARB, %function +bluegl_glVertexAttrib4svARB: + adrp x16, :got:__blue_glCore_glVertexAttrib4svARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4svARB] ldr x16, [x16] br x16 - .size bluegl_glFramebufferParameteri, .-bluegl_glFramebufferParameteri + .size bluegl_glVertexAttrib4svARB, .-bluegl_glVertexAttrib4svARB .align 2 - .global bluegl_glPointParameterxvOES - .type bluegl_glPointParameterxvOES, %function -bluegl_glPointParameterxvOES: - adrp x16, :got:__blue_glCore_glPointParameterxvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterxvOES] + .global bluegl_glVertexAttrib4ubvARB + .type bluegl_glVertexAttrib4ubvARB, %function +bluegl_glVertexAttrib4ubvARB: + adrp x16, :got:__blue_glCore_glVertexAttrib4ubvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4ubvARB] ldr x16, [x16] br x16 - .size bluegl_glPointParameterxvOES, .-bluegl_glPointParameterxvOES + .size bluegl_glVertexAttrib4ubvARB, .-bluegl_glVertexAttrib4ubvARB .align 2 - .global bluegl_glBlendFunci - .type bluegl_glBlendFunci, %function -bluegl_glBlendFunci: - adrp x16, :got:__blue_glCore_glBlendFunci - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFunci] + .global bluegl_glVertexAttrib4uivARB + .type bluegl_glVertexAttrib4uivARB, %function +bluegl_glVertexAttrib4uivARB: + adrp x16, :got:__blue_glCore_glVertexAttrib4uivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4uivARB] ldr x16, [x16] br x16 - .size bluegl_glBlendFunci, .-bluegl_glBlendFunci + .size bluegl_glVertexAttrib4uivARB, .-bluegl_glVertexAttrib4uivARB .align 2 - .global bluegl_glUniformMatrix2x3dv - .type bluegl_glUniformMatrix2x3dv, %function -bluegl_glUniformMatrix2x3dv: - adrp x16, :got:__blue_glCore_glUniformMatrix2x3dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix2x3dv] + .global bluegl_glVertexAttrib4usvARB + .type bluegl_glVertexAttrib4usvARB, %function +bluegl_glVertexAttrib4usvARB: + adrp x16, :got:__blue_glCore_glVertexAttrib4usvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4usvARB] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix2x3dv, .-bluegl_glUniformMatrix2x3dv + .size bluegl_glVertexAttrib4usvARB, .-bluegl_glVertexAttrib4usvARB .align 2 - .global bluegl_glUniform2i64ARB - .type bluegl_glUniform2i64ARB, %function -bluegl_glUniform2i64ARB: - adrp x16, :got:__blue_glCore_glUniform2i64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2i64ARB] + .global bluegl_glVertexAttribPointerARB + .type bluegl_glVertexAttribPointerARB, %function +bluegl_glVertexAttribPointerARB: + adrp x16, :got:__blue_glCore_glVertexAttribPointerARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribPointerARB] ldr x16, [x16] br x16 - .size bluegl_glUniform2i64ARB, .-bluegl_glUniform2i64ARB + .size bluegl_glVertexAttribPointerARB, .-bluegl_glVertexAttribPointerARB .align 2 - .global bluegl_glProgramEnvParameterI4ivNV - .type bluegl_glProgramEnvParameterI4ivNV, %function -bluegl_glProgramEnvParameterI4ivNV: - adrp x16, :got:__blue_glCore_glProgramEnvParameterI4ivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParameterI4ivNV] + .global bluegl_glEnableVertexAttribArrayARB + .type bluegl_glEnableVertexAttribArrayARB, %function +bluegl_glEnableVertexAttribArrayARB: + adrp x16, :got:__blue_glCore_glEnableVertexAttribArrayARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableVertexAttribArrayARB] ldr x16, [x16] br x16 - .size bluegl_glProgramEnvParameterI4ivNV, .-bluegl_glProgramEnvParameterI4ivNV + .size bluegl_glEnableVertexAttribArrayARB, .-bluegl_glEnableVertexAttribArrayARB .align 2 - .global bluegl_glFragmentLightModelivSGIX - .type bluegl_glFragmentLightModelivSGIX, %function -bluegl_glFragmentLightModelivSGIX: - adrp x16, :got:__blue_glCore_glFragmentLightModelivSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentLightModelivSGIX] + .global bluegl_glDisableVertexAttribArrayARB + .type bluegl_glDisableVertexAttribArrayARB, %function +bluegl_glDisableVertexAttribArrayARB: + adrp x16, :got:__blue_glCore_glDisableVertexAttribArrayARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableVertexAttribArrayARB] ldr x16, [x16] br x16 - .size bluegl_glFragmentLightModelivSGIX, .-bluegl_glFragmentLightModelivSGIX + .size bluegl_glDisableVertexAttribArrayARB, .-bluegl_glDisableVertexAttribArrayARB .align 2 - .global bluegl_glProgramUniform4ui64vARB - .type bluegl_glProgramUniform4ui64vARB, %function -bluegl_glProgramUniform4ui64vARB: - adrp x16, :got:__blue_glCore_glProgramUniform4ui64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4ui64vARB] + .global bluegl_glGetVertexAttribdvARB + .type bluegl_glGetVertexAttribdvARB, %function +bluegl_glGetVertexAttribdvARB: + adrp x16, :got:__blue_glCore_glGetVertexAttribdvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribdvARB] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4ui64vARB, .-bluegl_glProgramUniform4ui64vARB + .size bluegl_glGetVertexAttribdvARB, .-bluegl_glGetVertexAttribdvARB .align 2 - .global bluegl_glProgramUniformMatrix2x3fvEXT - .type bluegl_glProgramUniformMatrix2x3fvEXT, %function -bluegl_glProgramUniformMatrix2x3fvEXT: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix2x3fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2x3fvEXT] + .global bluegl_glGetVertexAttribfvARB + .type bluegl_glGetVertexAttribfvARB, %function +bluegl_glGetVertexAttribfvARB: + adrp x16, :got:__blue_glCore_glGetVertexAttribfvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribfvARB] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix2x3fvEXT, .-bluegl_glProgramUniformMatrix2x3fvEXT + .size bluegl_glGetVertexAttribfvARB, .-bluegl_glGetVertexAttribfvARB .align 2 - .global bluegl_glStencilClearTagEXT - .type bluegl_glStencilClearTagEXT, %function -bluegl_glStencilClearTagEXT: - adrp x16, :got:__blue_glCore_glStencilClearTagEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilClearTagEXT] + .global bluegl_glGetVertexAttribivARB + .type bluegl_glGetVertexAttribivARB, %function +bluegl_glGetVertexAttribivARB: + adrp x16, :got:__blue_glCore_glGetVertexAttribivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribivARB] ldr x16, [x16] br x16 - .size bluegl_glStencilClearTagEXT, .-bluegl_glStencilClearTagEXT + .size bluegl_glGetVertexAttribivARB, .-bluegl_glGetVertexAttribivARB .align 2 - .global bluegl_glMultiTexCoord4s - .type bluegl_glMultiTexCoord4s, %function -bluegl_glMultiTexCoord4s: - adrp x16, :got:__blue_glCore_glMultiTexCoord4s - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4s] + .global bluegl_glGetVertexAttribPointervARB + .type bluegl_glGetVertexAttribPointervARB, %function +bluegl_glGetVertexAttribPointervARB: + adrp x16, :got:__blue_glCore_glGetVertexAttribPointervARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribPointervARB] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4s, .-bluegl_glMultiTexCoord4s + .size bluegl_glGetVertexAttribPointervARB, .-bluegl_glGetVertexAttribPointervARB .align 2 - .global bluegl_glProgramUniformMatrix4dvEXT - .type bluegl_glProgramUniformMatrix4dvEXT, %function -bluegl_glProgramUniformMatrix4dvEXT: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix4dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4dvEXT] + .global bluegl_glBindAttribLocationARB + .type bluegl_glBindAttribLocationARB, %function +bluegl_glBindAttribLocationARB: + adrp x16, :got:__blue_glCore_glBindAttribLocationARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindAttribLocationARB] + ldr x16, [x16] + br x16 + .size bluegl_glBindAttribLocationARB, .-bluegl_glBindAttribLocationARB + + .align 2 + .global bluegl_glGetActiveAttribARB + .type bluegl_glGetActiveAttribARB, %function +bluegl_glGetActiveAttribARB: + adrp x16, :got:__blue_glCore_glGetActiveAttribARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveAttribARB] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix4dvEXT, .-bluegl_glProgramUniformMatrix4dvEXT + .size bluegl_glGetActiveAttribARB, .-bluegl_glGetActiveAttribARB .align 2 - .global bluegl_glGetNamedBufferParameteri64v - .type bluegl_glGetNamedBufferParameteri64v, %function -bluegl_glGetNamedBufferParameteri64v: - adrp x16, :got:__blue_glCore_glGetNamedBufferParameteri64v - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedBufferParameteri64v] + .global bluegl_glGetAttribLocationARB + .type bluegl_glGetAttribLocationARB, %function +bluegl_glGetAttribLocationARB: + adrp x16, :got:__blue_glCore_glGetAttribLocationARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetAttribLocationARB] ldr x16, [x16] br x16 - .size bluegl_glGetNamedBufferParameteri64v, .-bluegl_glGetNamedBufferParameteri64v + .size bluegl_glGetAttribLocationARB, .-bluegl_glGetAttribLocationARB .align 2 - .global bluegl_glVertexAttribI3iEXT - .type bluegl_glVertexAttribI3iEXT, %function -bluegl_glVertexAttribI3iEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI3iEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI3iEXT] + .global bluegl_glWindowPos2dARB + .type bluegl_glWindowPos2dARB, %function +bluegl_glWindowPos2dARB: + adrp x16, :got:__blue_glCore_glWindowPos2dARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2dARB] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI3iEXT, .-bluegl_glVertexAttribI3iEXT + .size bluegl_glWindowPos2dARB, .-bluegl_glWindowPos2dARB .align 2 - .global bluegl_glReplacementCodeuivSUN - .type bluegl_glReplacementCodeuivSUN, %function -bluegl_glReplacementCodeuivSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeuivSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuivSUN] + .global bluegl_glWindowPos2dvARB + .type bluegl_glWindowPos2dvARB, %function +bluegl_glWindowPos2dvARB: + adrp x16, :got:__blue_glCore_glWindowPos2dvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2dvARB] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeuivSUN, .-bluegl_glReplacementCodeuivSUN + .size bluegl_glWindowPos2dvARB, .-bluegl_glWindowPos2dvARB .align 2 - .global bluegl_glFragmentLightModeliSGIX - .type bluegl_glFragmentLightModeliSGIX, %function -bluegl_glFragmentLightModeliSGIX: - adrp x16, :got:__blue_glCore_glFragmentLightModeliSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentLightModeliSGIX] + .global bluegl_glWindowPos2fARB + .type bluegl_glWindowPos2fARB, %function +bluegl_glWindowPos2fARB: + adrp x16, :got:__blue_glCore_glWindowPos2fARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2fARB] ldr x16, [x16] br x16 - .size bluegl_glFragmentLightModeliSGIX, .-bluegl_glFragmentLightModeliSGIX + .size bluegl_glWindowPos2fARB, .-bluegl_glWindowPos2fARB .align 2 - .global bluegl_glUniform2i64vNV - .type bluegl_glUniform2i64vNV, %function -bluegl_glUniform2i64vNV: - adrp x16, :got:__blue_glCore_glUniform2i64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2i64vNV] + .global bluegl_glWindowPos2fvARB + .type bluegl_glWindowPos2fvARB, %function +bluegl_glWindowPos2fvARB: + adrp x16, :got:__blue_glCore_glWindowPos2fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2fvARB] ldr x16, [x16] br x16 - .size bluegl_glUniform2i64vNV, .-bluegl_glUniform2i64vNV + .size bluegl_glWindowPos2fvARB, .-bluegl_glWindowPos2fvARB .align 2 - .global bluegl_glPointParameterivNV - .type bluegl_glPointParameterivNV, %function -bluegl_glPointParameterivNV: - adrp x16, :got:__blue_glCore_glPointParameterivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterivNV] + .global bluegl_glWindowPos2iARB + .type bluegl_glWindowPos2iARB, %function +bluegl_glWindowPos2iARB: + adrp x16, :got:__blue_glCore_glWindowPos2iARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2iARB] ldr x16, [x16] br x16 - .size bluegl_glPointParameterivNV, .-bluegl_glPointParameterivNV + .size bluegl_glWindowPos2iARB, .-bluegl_glWindowPos2iARB .align 2 - .global bluegl_glStencilStrokePathInstancedNV - .type bluegl_glStencilStrokePathInstancedNV, %function -bluegl_glStencilStrokePathInstancedNV: - adrp x16, :got:__blue_glCore_glStencilStrokePathInstancedNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilStrokePathInstancedNV] + .global bluegl_glWindowPos2ivARB + .type bluegl_glWindowPos2ivARB, %function +bluegl_glWindowPos2ivARB: + adrp x16, :got:__blue_glCore_glWindowPos2ivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2ivARB] ldr x16, [x16] br x16 - .size bluegl_glStencilStrokePathInstancedNV, .-bluegl_glStencilStrokePathInstancedNV + .size bluegl_glWindowPos2ivARB, .-bluegl_glWindowPos2ivARB .align 2 - .global bluegl_glInsertComponentEXT - .type bluegl_glInsertComponentEXT, %function -bluegl_glInsertComponentEXT: - adrp x16, :got:__blue_glCore_glInsertComponentEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glInsertComponentEXT] + .global bluegl_glWindowPos2sARB + .type bluegl_glWindowPos2sARB, %function +bluegl_glWindowPos2sARB: + adrp x16, :got:__blue_glCore_glWindowPos2sARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2sARB] ldr x16, [x16] br x16 - .size bluegl_glInsertComponentEXT, .-bluegl_glInsertComponentEXT + .size bluegl_glWindowPos2sARB, .-bluegl_glWindowPos2sARB .align 2 - .global bluegl_glIsEnabled - .type bluegl_glIsEnabled, %function -bluegl_glIsEnabled: - adrp x16, :got:__blue_glCore_glIsEnabled - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsEnabled] + .global bluegl_glWindowPos2svARB + .type bluegl_glWindowPos2svARB, %function +bluegl_glWindowPos2svARB: + adrp x16, :got:__blue_glCore_glWindowPos2svARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2svARB] ldr x16, [x16] br x16 - .size bluegl_glIsEnabled, .-bluegl_glIsEnabled + .size bluegl_glWindowPos2svARB, .-bluegl_glWindowPos2svARB .align 2 - .global bluegl_glWindowPos3dMESA - .type bluegl_glWindowPos3dMESA, %function -bluegl_glWindowPos3dMESA: - adrp x16, :got:__blue_glCore_glWindowPos3dMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3dMESA] + .global bluegl_glWindowPos3dARB + .type bluegl_glWindowPos3dARB, %function +bluegl_glWindowPos3dARB: + adrp x16, :got:__blue_glCore_glWindowPos3dARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3dARB] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3dMESA, .-bluegl_glWindowPos3dMESA + .size bluegl_glWindowPos3dARB, .-bluegl_glWindowPos3dARB .align 2 - .global bluegl_glGetnCompressedTexImage - .type bluegl_glGetnCompressedTexImage, %function -bluegl_glGetnCompressedTexImage: - adrp x16, :got:__blue_glCore_glGetnCompressedTexImage - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnCompressedTexImage] + .global bluegl_glWindowPos3dvARB + .type bluegl_glWindowPos3dvARB, %function +bluegl_glWindowPos3dvARB: + adrp x16, :got:__blue_glCore_glWindowPos3dvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3dvARB] ldr x16, [x16] br x16 - .size bluegl_glGetnCompressedTexImage, .-bluegl_glGetnCompressedTexImage + .size bluegl_glWindowPos3dvARB, .-bluegl_glWindowPos3dvARB .align 2 - .global bluegl_glCopyMultiTexSubImage2DEXT - .type bluegl_glCopyMultiTexSubImage2DEXT, %function -bluegl_glCopyMultiTexSubImage2DEXT: - adrp x16, :got:__blue_glCore_glCopyMultiTexSubImage2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyMultiTexSubImage2DEXT] + .global bluegl_glWindowPos3fARB + .type bluegl_glWindowPos3fARB, %function +bluegl_glWindowPos3fARB: + adrp x16, :got:__blue_glCore_glWindowPos3fARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3fARB] ldr x16, [x16] br x16 - .size bluegl_glCopyMultiTexSubImage2DEXT, .-bluegl_glCopyMultiTexSubImage2DEXT + .size bluegl_glWindowPos3fARB, .-bluegl_glWindowPos3fARB .align 2 - .global bluegl_glDisableIndexedEXT - .type bluegl_glDisableIndexedEXT, %function -bluegl_glDisableIndexedEXT: - adrp x16, :got:__blue_glCore_glDisableIndexedEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableIndexedEXT] + .global bluegl_glWindowPos3fvARB + .type bluegl_glWindowPos3fvARB, %function +bluegl_glWindowPos3fvARB: + adrp x16, :got:__blue_glCore_glWindowPos3fvARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3fvARB] ldr x16, [x16] br x16 - .size bluegl_glDisableIndexedEXT, .-bluegl_glDisableIndexedEXT + .size bluegl_glWindowPos3fvARB, .-bluegl_glWindowPos3fvARB .align 2 - .global bluegl_glWindowPos2dv - .type bluegl_glWindowPos2dv, %function -bluegl_glWindowPos2dv: - adrp x16, :got:__blue_glCore_glWindowPos2dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2dv] + .global bluegl_glWindowPos3iARB + .type bluegl_glWindowPos3iARB, %function +bluegl_glWindowPos3iARB: + adrp x16, :got:__blue_glCore_glWindowPos3iARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3iARB] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2dv, .-bluegl_glWindowPos2dv + .size bluegl_glWindowPos3iARB, .-bluegl_glWindowPos3iARB .align 2 - .global bluegl_glAlphaFuncxOES - .type bluegl_glAlphaFuncxOES, %function -bluegl_glAlphaFuncxOES: - adrp x16, :got:__blue_glCore_glAlphaFuncxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glAlphaFuncxOES] + .global bluegl_glWindowPos3ivARB + .type bluegl_glWindowPos3ivARB, %function +bluegl_glWindowPos3ivARB: + adrp x16, :got:__blue_glCore_glWindowPos3ivARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3ivARB] ldr x16, [x16] br x16 - .size bluegl_glAlphaFuncxOES, .-bluegl_glAlphaFuncxOES + .size bluegl_glWindowPos3ivARB, .-bluegl_glWindowPos3ivARB .align 2 - .global bluegl_glCreateFramebuffers - .type bluegl_glCreateFramebuffers, %function -bluegl_glCreateFramebuffers: - adrp x16, :got:__blue_glCore_glCreateFramebuffers - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateFramebuffers] + .global bluegl_glWindowPos3sARB + .type bluegl_glWindowPos3sARB, %function +bluegl_glWindowPos3sARB: + adrp x16, :got:__blue_glCore_glWindowPos3sARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3sARB] ldr x16, [x16] br x16 - .size bluegl_glCreateFramebuffers, .-bluegl_glCreateFramebuffers + .size bluegl_glWindowPos3sARB, .-bluegl_glWindowPos3sARB .align 2 - .global bluegl_glGetAttribLocationARB - .type bluegl_glGetAttribLocationARB, %function -bluegl_glGetAttribLocationARB: - adrp x16, :got:__blue_glCore_glGetAttribLocationARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetAttribLocationARB] + .global bluegl_glWindowPos3svARB + .type bluegl_glWindowPos3svARB, %function +bluegl_glWindowPos3svARB: + adrp x16, :got:__blue_glCore_glWindowPos3svARB + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3svARB] ldr x16, [x16] br x16 - .size bluegl_glGetAttribLocationARB, .-bluegl_glGetAttribLocationARB + .size bluegl_glWindowPos3svARB, .-bluegl_glWindowPos3svARB .align 2 - .global bluegl_glVertexAttrib1sARB - .type bluegl_glVertexAttrib1sARB, %function -bluegl_glVertexAttrib1sARB: - adrp x16, :got:__blue_glCore_glVertexAttrib1sARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1sARB] + .global bluegl_glBlendBarrierKHR + .type bluegl_glBlendBarrierKHR, %function +bluegl_glBlendBarrierKHR: + adrp x16, :got:__blue_glCore_glBlendBarrierKHR + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendBarrierKHR] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1sARB, .-bluegl_glVertexAttrib1sARB + .size bluegl_glBlendBarrierKHR, .-bluegl_glBlendBarrierKHR .align 2 - .global bluegl_glTexBumpParameterfvATI - .type bluegl_glTexBumpParameterfvATI, %function -bluegl_glTexBumpParameterfvATI: - adrp x16, :got:__blue_glCore_glTexBumpParameterfvATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexBumpParameterfvATI] + .global bluegl_glMultiTexCoord1bOES + .type bluegl_glMultiTexCoord1bOES, %function +bluegl_glMultiTexCoord1bOES: + adrp x16, :got:__blue_glCore_glMultiTexCoord1bOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1bOES] ldr x16, [x16] br x16 - .size bluegl_glTexBumpParameterfvATI, .-bluegl_glTexBumpParameterfvATI + .size bluegl_glMultiTexCoord1bOES, .-bluegl_glMultiTexCoord1bOES .align 2 - .global bluegl_glGetActiveSubroutineUniformiv - .type bluegl_glGetActiveSubroutineUniformiv, %function -bluegl_glGetActiveSubroutineUniformiv: - adrp x16, :got:__blue_glCore_glGetActiveSubroutineUniformiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveSubroutineUniformiv] + .global bluegl_glMultiTexCoord1bvOES + .type bluegl_glMultiTexCoord1bvOES, %function +bluegl_glMultiTexCoord1bvOES: + adrp x16, :got:__blue_glCore_glMultiTexCoord1bvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1bvOES] ldr x16, [x16] br x16 - .size bluegl_glGetActiveSubroutineUniformiv, .-bluegl_glGetActiveSubroutineUniformiv + .size bluegl_glMultiTexCoord1bvOES, .-bluegl_glMultiTexCoord1bvOES .align 2 - .global bluegl_glVertexAttrib2fARB - .type bluegl_glVertexAttrib2fARB, %function -bluegl_glVertexAttrib2fARB: - adrp x16, :got:__blue_glCore_glVertexAttrib2fARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2fARB] + .global bluegl_glMultiTexCoord2bOES + .type bluegl_glMultiTexCoord2bOES, %function +bluegl_glMultiTexCoord2bOES: + adrp x16, :got:__blue_glCore_glMultiTexCoord2bOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2bOES] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2fARB, .-bluegl_glVertexAttrib2fARB + .size bluegl_glMultiTexCoord2bOES, .-bluegl_glMultiTexCoord2bOES .align 2 - .global bluegl_glGetTransformFeedbacki64_v - .type bluegl_glGetTransformFeedbacki64_v, %function -bluegl_glGetTransformFeedbacki64_v: - adrp x16, :got:__blue_glCore_glGetTransformFeedbacki64_v - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTransformFeedbacki64_v] + .global bluegl_glMultiTexCoord2bvOES + .type bluegl_glMultiTexCoord2bvOES, %function +bluegl_glMultiTexCoord2bvOES: + adrp x16, :got:__blue_glCore_glMultiTexCoord2bvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2bvOES] ldr x16, [x16] br x16 - .size bluegl_glGetTransformFeedbacki64_v, .-bluegl_glGetTransformFeedbacki64_v + .size bluegl_glMultiTexCoord2bvOES, .-bluegl_glMultiTexCoord2bvOES .align 2 - .global bluegl_glMultiTexCoord4hvNV - .type bluegl_glMultiTexCoord4hvNV, %function -bluegl_glMultiTexCoord4hvNV: - adrp x16, :got:__blue_glCore_glMultiTexCoord4hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4hvNV] + .global bluegl_glMultiTexCoord3bOES + .type bluegl_glMultiTexCoord3bOES, %function +bluegl_glMultiTexCoord3bOES: + adrp x16, :got:__blue_glCore_glMultiTexCoord3bOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3bOES] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4hvNV, .-bluegl_glMultiTexCoord4hvNV + .size bluegl_glMultiTexCoord3bOES, .-bluegl_glMultiTexCoord3bOES .align 2 - .global bluegl_glBlendColorEXT - .type bluegl_glBlendColorEXT, %function -bluegl_glBlendColorEXT: - adrp x16, :got:__blue_glCore_glBlendColorEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendColorEXT] + .global bluegl_glMultiTexCoord3bvOES + .type bluegl_glMultiTexCoord3bvOES, %function +bluegl_glMultiTexCoord3bvOES: + adrp x16, :got:__blue_glCore_glMultiTexCoord3bvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3bvOES] ldr x16, [x16] br x16 - .size bluegl_glBlendColorEXT, .-bluegl_glBlendColorEXT + .size bluegl_glMultiTexCoord3bvOES, .-bluegl_glMultiTexCoord3bvOES .align 2 - .global bluegl_glCompressedTexSubImage3D - .type bluegl_glCompressedTexSubImage3D, %function -bluegl_glCompressedTexSubImage3D: - adrp x16, :got:__blue_glCore_glCompressedTexSubImage3D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexSubImage3D] + .global bluegl_glMultiTexCoord4bOES + .type bluegl_glMultiTexCoord4bOES, %function +bluegl_glMultiTexCoord4bOES: + adrp x16, :got:__blue_glCore_glMultiTexCoord4bOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4bOES] ldr x16, [x16] br x16 - .size bluegl_glCompressedTexSubImage3D, .-bluegl_glCompressedTexSubImage3D + .size bluegl_glMultiTexCoord4bOES, .-bluegl_glMultiTexCoord4bOES .align 2 - .global bluegl_glVertexStream4dvATI - .type bluegl_glVertexStream4dvATI, %function -bluegl_glVertexStream4dvATI: - adrp x16, :got:__blue_glCore_glVertexStream4dvATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream4dvATI] + .global bluegl_glMultiTexCoord4bvOES + .type bluegl_glMultiTexCoord4bvOES, %function +bluegl_glMultiTexCoord4bvOES: + adrp x16, :got:__blue_glCore_glMultiTexCoord4bvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4bvOES] ldr x16, [x16] br x16 - .size bluegl_glVertexStream4dvATI, .-bluegl_glVertexStream4dvATI + .size bluegl_glMultiTexCoord4bvOES, .-bluegl_glMultiTexCoord4bvOES .align 2 - .global bluegl_glMaxShaderCompilerThreadsARB - .type bluegl_glMaxShaderCompilerThreadsARB, %function -bluegl_glMaxShaderCompilerThreadsARB: - adrp x16, :got:__blue_glCore_glMaxShaderCompilerThreadsARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMaxShaderCompilerThreadsARB] + .global bluegl_glTexCoord1bOES + .type bluegl_glTexCoord1bOES, %function +bluegl_glTexCoord1bOES: + adrp x16, :got:__blue_glCore_glTexCoord1bOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord1bOES] ldr x16, [x16] br x16 - .size bluegl_glMaxShaderCompilerThreadsARB, .-bluegl_glMaxShaderCompilerThreadsARB + .size bluegl_glTexCoord1bOES, .-bluegl_glTexCoord1bOES .align 2 - .global bluegl_glGlobalAlphaFactorbSUN - .type bluegl_glGlobalAlphaFactorbSUN, %function -bluegl_glGlobalAlphaFactorbSUN: - adrp x16, :got:__blue_glCore_glGlobalAlphaFactorbSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glGlobalAlphaFactorbSUN] + .global bluegl_glTexCoord1bvOES + .type bluegl_glTexCoord1bvOES, %function +bluegl_glTexCoord1bvOES: + adrp x16, :got:__blue_glCore_glTexCoord1bvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord1bvOES] ldr x16, [x16] br x16 - .size bluegl_glGlobalAlphaFactorbSUN, .-bluegl_glGlobalAlphaFactorbSUN + .size bluegl_glTexCoord1bvOES, .-bluegl_glTexCoord1bvOES .align 2 - .global bluegl_glGlobalAlphaFactoruiSUN - .type bluegl_glGlobalAlphaFactoruiSUN, %function -bluegl_glGlobalAlphaFactoruiSUN: - adrp x16, :got:__blue_glCore_glGlobalAlphaFactoruiSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glGlobalAlphaFactoruiSUN] + .global bluegl_glTexCoord2bOES + .type bluegl_glTexCoord2bOES, %function +bluegl_glTexCoord2bOES: + adrp x16, :got:__blue_glCore_glTexCoord2bOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2bOES] ldr x16, [x16] br x16 - .size bluegl_glGlobalAlphaFactoruiSUN, .-bluegl_glGlobalAlphaFactoruiSUN + .size bluegl_glTexCoord2bOES, .-bluegl_glTexCoord2bOES .align 2 - .global bluegl_glClientActiveTextureARB - .type bluegl_glClientActiveTextureARB, %function -bluegl_glClientActiveTextureARB: - adrp x16, :got:__blue_glCore_glClientActiveTextureARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glClientActiveTextureARB] + .global bluegl_glTexCoord2bvOES + .type bluegl_glTexCoord2bvOES, %function +bluegl_glTexCoord2bvOES: + adrp x16, :got:__blue_glCore_glTexCoord2bvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2bvOES] ldr x16, [x16] br x16 - .size bluegl_glClientActiveTextureARB, .-bluegl_glClientActiveTextureARB + .size bluegl_glTexCoord2bvOES, .-bluegl_glTexCoord2bvOES .align 2 - .global bluegl_glGenProgramsARB - .type bluegl_glGenProgramsARB, %function -bluegl_glGenProgramsARB: - adrp x16, :got:__blue_glCore_glGenProgramsARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenProgramsARB] + .global bluegl_glTexCoord3bOES + .type bluegl_glTexCoord3bOES, %function +bluegl_glTexCoord3bOES: + adrp x16, :got:__blue_glCore_glTexCoord3bOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord3bOES] ldr x16, [x16] br x16 - .size bluegl_glGenProgramsARB, .-bluegl_glGenProgramsARB + .size bluegl_glTexCoord3bOES, .-bluegl_glTexCoord3bOES .align 2 - .global bluegl_glGetTexParameterPointervAPPLE - .type bluegl_glGetTexParameterPointervAPPLE, %function -bluegl_glGetTexParameterPointervAPPLE: - adrp x16, :got:__blue_glCore_glGetTexParameterPointervAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexParameterPointervAPPLE] + .global bluegl_glTexCoord3bvOES + .type bluegl_glTexCoord3bvOES, %function +bluegl_glTexCoord3bvOES: + adrp x16, :got:__blue_glCore_glTexCoord3bvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord3bvOES] ldr x16, [x16] br x16 - .size bluegl_glGetTexParameterPointervAPPLE, .-bluegl_glGetTexParameterPointervAPPLE + .size bluegl_glTexCoord3bvOES, .-bluegl_glTexCoord3bvOES .align 2 - .global bluegl_glGetBooleanv - .type bluegl_glGetBooleanv, %function -bluegl_glGetBooleanv: - adrp x16, :got:__blue_glCore_glGetBooleanv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBooleanv] + .global bluegl_glTexCoord4bOES + .type bluegl_glTexCoord4bOES, %function +bluegl_glTexCoord4bOES: + adrp x16, :got:__blue_glCore_glTexCoord4bOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord4bOES] ldr x16, [x16] br x16 - .size bluegl_glGetBooleanv, .-bluegl_glGetBooleanv + .size bluegl_glTexCoord4bOES, .-bluegl_glTexCoord4bOES .align 2 - .global bluegl_glDrawElementsBaseVertex - .type bluegl_glDrawElementsBaseVertex, %function -bluegl_glDrawElementsBaseVertex: - adrp x16, :got:__blue_glCore_glDrawElementsBaseVertex - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementsBaseVertex] + .global bluegl_glTexCoord4bvOES + .type bluegl_glTexCoord4bvOES, %function +bluegl_glTexCoord4bvOES: + adrp x16, :got:__blue_glCore_glTexCoord4bvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord4bvOES] ldr x16, [x16] br x16 - .size bluegl_glDrawElementsBaseVertex, .-bluegl_glDrawElementsBaseVertex + .size bluegl_glTexCoord4bvOES, .-bluegl_glTexCoord4bvOES .align 2 - .global bluegl_glVertexAttribL4ui64vNV - .type bluegl_glVertexAttribL4ui64vNV, %function -bluegl_glVertexAttribL4ui64vNV: - adrp x16, :got:__blue_glCore_glVertexAttribL4ui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL4ui64vNV] + .global bluegl_glVertex2bOES + .type bluegl_glVertex2bOES, %function +bluegl_glVertex2bOES: + adrp x16, :got:__blue_glCore_glVertex2bOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex2bOES] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL4ui64vNV, .-bluegl_glVertexAttribL4ui64vNV + .size bluegl_glVertex2bOES, .-bluegl_glVertex2bOES .align 2 - .global bluegl_glSecondaryColor3fvEXT - .type bluegl_glSecondaryColor3fvEXT, %function -bluegl_glSecondaryColor3fvEXT: - adrp x16, :got:__blue_glCore_glSecondaryColor3fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3fvEXT] + .global bluegl_glVertex2bvOES + .type bluegl_glVertex2bvOES, %function +bluegl_glVertex2bvOES: + adrp x16, :got:__blue_glCore_glVertex2bvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex2bvOES] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3fvEXT, .-bluegl_glSecondaryColor3fvEXT + .size bluegl_glVertex2bvOES, .-bluegl_glVertex2bvOES .align 2 - .global bluegl_glMultiTexCoord1s - .type bluegl_glMultiTexCoord1s, %function -bluegl_glMultiTexCoord1s: - adrp x16, :got:__blue_glCore_glMultiTexCoord1s - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1s] + .global bluegl_glVertex3bOES + .type bluegl_glVertex3bOES, %function +bluegl_glVertex3bOES: + adrp x16, :got:__blue_glCore_glVertex3bOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex3bOES] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1s, .-bluegl_glMultiTexCoord1s + .size bluegl_glVertex3bOES, .-bluegl_glVertex3bOES .align 2 - .global bluegl_glDeleteProgramsARB - .type bluegl_glDeleteProgramsARB, %function -bluegl_glDeleteProgramsARB: - adrp x16, :got:__blue_glCore_glDeleteProgramsARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteProgramsARB] + .global bluegl_glVertex3bvOES + .type bluegl_glVertex3bvOES, %function +bluegl_glVertex3bvOES: + adrp x16, :got:__blue_glCore_glVertex3bvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex3bvOES] ldr x16, [x16] br x16 - .size bluegl_glDeleteProgramsARB, .-bluegl_glDeleteProgramsARB + .size bluegl_glVertex3bvOES, .-bluegl_glVertex3bvOES .align 2 - .global bluegl_glDrawElementsInstancedBaseVertex - .type bluegl_glDrawElementsInstancedBaseVertex, %function -bluegl_glDrawElementsInstancedBaseVertex: - adrp x16, :got:__blue_glCore_glDrawElementsInstancedBaseVertex - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementsInstancedBaseVertex] + .global bluegl_glVertex4bOES + .type bluegl_glVertex4bOES, %function +bluegl_glVertex4bOES: + adrp x16, :got:__blue_glCore_glVertex4bOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex4bOES] ldr x16, [x16] br x16 - .size bluegl_glDrawElementsInstancedBaseVertex, .-bluegl_glDrawElementsInstancedBaseVertex + .size bluegl_glVertex4bOES, .-bluegl_glVertex4bOES .align 2 - .global bluegl_glProgramUniform4dEXT - .type bluegl_glProgramUniform4dEXT, %function -bluegl_glProgramUniform4dEXT: - adrp x16, :got:__blue_glCore_glProgramUniform4dEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4dEXT] + .global bluegl_glVertex4bvOES + .type bluegl_glVertex4bvOES, %function +bluegl_glVertex4bvOES: + adrp x16, :got:__blue_glCore_glVertex4bvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex4bvOES] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4dEXT, .-bluegl_glProgramUniform4dEXT + .size bluegl_glVertex4bvOES, .-bluegl_glVertex4bvOES .align 2 - .global bluegl_glGetPathMetricRangeNV - .type bluegl_glGetPathMetricRangeNV, %function -bluegl_glGetPathMetricRangeNV: - adrp x16, :got:__blue_glCore_glGetPathMetricRangeNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathMetricRangeNV] + .global bluegl_glAlphaFuncxOES + .type bluegl_glAlphaFuncxOES, %function +bluegl_glAlphaFuncxOES: + adrp x16, :got:__blue_glCore_glAlphaFuncxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glAlphaFuncxOES] ldr x16, [x16] br x16 - .size bluegl_glGetPathMetricRangeNV, .-bluegl_glGetPathMetricRangeNV + .size bluegl_glAlphaFuncxOES, .-bluegl_glAlphaFuncxOES .align 2 - .global bluegl_glProgramUniform3iEXT - .type bluegl_glProgramUniform3iEXT, %function -bluegl_glProgramUniform3iEXT: - adrp x16, :got:__blue_glCore_glProgramUniform3iEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3iEXT] + .global bluegl_glClearColorxOES + .type bluegl_glClearColorxOES, %function +bluegl_glClearColorxOES: + adrp x16, :got:__blue_glCore_glClearColorxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearColorxOES] + ldr x16, [x16] + br x16 + .size bluegl_glClearColorxOES, .-bluegl_glClearColorxOES + + .align 2 + .global bluegl_glClearDepthxOES + .type bluegl_glClearDepthxOES, %function +bluegl_glClearDepthxOES: + adrp x16, :got:__blue_glCore_glClearDepthxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearDepthxOES] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3iEXT, .-bluegl_glProgramUniform3iEXT + .size bluegl_glClearDepthxOES, .-bluegl_glClearDepthxOES .align 2 - .global bluegl_glDeleteBuffers - .type bluegl_glDeleteBuffers, %function -bluegl_glDeleteBuffers: - adrp x16, :got:__blue_glCore_glDeleteBuffers - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteBuffers] + .global bluegl_glClipPlanexOES + .type bluegl_glClipPlanexOES, %function +bluegl_glClipPlanexOES: + adrp x16, :got:__blue_glCore_glClipPlanexOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glClipPlanexOES] ldr x16, [x16] br x16 - .size bluegl_glDeleteBuffers, .-bluegl_glDeleteBuffers + .size bluegl_glClipPlanexOES, .-bluegl_glClipPlanexOES .align 2 - .global bluegl_glSecondaryColor3usEXT - .type bluegl_glSecondaryColor3usEXT, %function -bluegl_glSecondaryColor3usEXT: - adrp x16, :got:__blue_glCore_glSecondaryColor3usEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3usEXT] + .global bluegl_glColor4xOES + .type bluegl_glColor4xOES, %function +bluegl_glColor4xOES: + adrp x16, :got:__blue_glCore_glColor4xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4xOES] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3usEXT, .-bluegl_glSecondaryColor3usEXT + .size bluegl_glColor4xOES, .-bluegl_glColor4xOES .align 2 - .global bluegl_glDepthMask - .type bluegl_glDepthMask, %function -bluegl_glDepthMask: - adrp x16, :got:__blue_glCore_glDepthMask - ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthMask] + .global bluegl_glDepthRangexOES + .type bluegl_glDepthRangexOES, %function +bluegl_glDepthRangexOES: + adrp x16, :got:__blue_glCore_glDepthRangexOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthRangexOES] ldr x16, [x16] br x16 - .size bluegl_glDepthMask, .-bluegl_glDepthMask + .size bluegl_glDepthRangexOES, .-bluegl_glDepthRangexOES .align 2 - .global bluegl_glMultiTexCoord2dv - .type bluegl_glMultiTexCoord2dv, %function -bluegl_glMultiTexCoord2dv: - adrp x16, :got:__blue_glCore_glMultiTexCoord2dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2dv] + .global bluegl_glFogxOES + .type bluegl_glFogxOES, %function +bluegl_glFogxOES: + adrp x16, :got:__blue_glCore_glFogxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glFogxOES] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2dv, .-bluegl_glMultiTexCoord2dv + .size bluegl_glFogxOES, .-bluegl_glFogxOES .align 2 - .global bluegl_glCopyConvolutionFilter2DEXT - .type bluegl_glCopyConvolutionFilter2DEXT, %function -bluegl_glCopyConvolutionFilter2DEXT: - adrp x16, :got:__blue_glCore_glCopyConvolutionFilter2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyConvolutionFilter2DEXT] + .global bluegl_glFogxvOES + .type bluegl_glFogxvOES, %function +bluegl_glFogxvOES: + adrp x16, :got:__blue_glCore_glFogxvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glFogxvOES] ldr x16, [x16] br x16 - .size bluegl_glCopyConvolutionFilter2DEXT, .-bluegl_glCopyConvolutionFilter2DEXT + .size bluegl_glFogxvOES, .-bluegl_glFogxvOES .align 2 - .global bluegl_glLoadTransposeMatrixxOES - .type bluegl_glLoadTransposeMatrixxOES, %function -bluegl_glLoadTransposeMatrixxOES: - adrp x16, :got:__blue_glCore_glLoadTransposeMatrixxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glLoadTransposeMatrixxOES] + .global bluegl_glFrustumxOES + .type bluegl_glFrustumxOES, %function +bluegl_glFrustumxOES: + adrp x16, :got:__blue_glCore_glFrustumxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glFrustumxOES] ldr x16, [x16] br x16 - .size bluegl_glLoadTransposeMatrixxOES, .-bluegl_glLoadTransposeMatrixxOES + .size bluegl_glFrustumxOES, .-bluegl_glFrustumxOES .align 2 - .global bluegl_glPixelStoref - .type bluegl_glPixelStoref, %function -bluegl_glPixelStoref: - adrp x16, :got:__blue_glCore_glPixelStoref - ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelStoref] + .global bluegl_glGetClipPlanexOES + .type bluegl_glGetClipPlanexOES, %function +bluegl_glGetClipPlanexOES: + adrp x16, :got:__blue_glCore_glGetClipPlanexOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetClipPlanexOES] ldr x16, [x16] br x16 - .size bluegl_glPixelStoref, .-bluegl_glPixelStoref + .size bluegl_glGetClipPlanexOES, .-bluegl_glGetClipPlanexOES .align 2 - .global bluegl_glStencilOpSeparateATI - .type bluegl_glStencilOpSeparateATI, %function -bluegl_glStencilOpSeparateATI: - adrp x16, :got:__blue_glCore_glStencilOpSeparateATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilOpSeparateATI] + .global bluegl_glGetFixedvOES + .type bluegl_glGetFixedvOES, %function +bluegl_glGetFixedvOES: + adrp x16, :got:__blue_glCore_glGetFixedvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFixedvOES] ldr x16, [x16] br x16 - .size bluegl_glStencilOpSeparateATI, .-bluegl_glStencilOpSeparateATI + .size bluegl_glGetFixedvOES, .-bluegl_glGetFixedvOES .align 2 - .global bluegl_glCopyTextureSubImage1DEXT - .type bluegl_glCopyTextureSubImage1DEXT, %function -bluegl_glCopyTextureSubImage1DEXT: - adrp x16, :got:__blue_glCore_glCopyTextureSubImage1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTextureSubImage1DEXT] + .global bluegl_glGetTexEnvxvOES + .type bluegl_glGetTexEnvxvOES, %function +bluegl_glGetTexEnvxvOES: + adrp x16, :got:__blue_glCore_glGetTexEnvxvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexEnvxvOES] ldr x16, [x16] br x16 - .size bluegl_glCopyTextureSubImage1DEXT, .-bluegl_glCopyTextureSubImage1DEXT + .size bluegl_glGetTexEnvxvOES, .-bluegl_glGetTexEnvxvOES .align 2 - .global bluegl_glMatrixScaledEXT - .type bluegl_glMatrixScaledEXT, %function -bluegl_glMatrixScaledEXT: - adrp x16, :got:__blue_glCore_glMatrixScaledEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixScaledEXT] + .global bluegl_glGetTexParameterxvOES + .type bluegl_glGetTexParameterxvOES, %function +bluegl_glGetTexParameterxvOES: + adrp x16, :got:__blue_glCore_glGetTexParameterxvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexParameterxvOES] ldr x16, [x16] br x16 - .size bluegl_glMatrixScaledEXT, .-bluegl_glMatrixScaledEXT + .size bluegl_glGetTexParameterxvOES, .-bluegl_glGetTexParameterxvOES .align 2 - .global bluegl_glProgramUniform2i64ARB - .type bluegl_glProgramUniform2i64ARB, %function -bluegl_glProgramUniform2i64ARB: - adrp x16, :got:__blue_glCore_glProgramUniform2i64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2i64ARB] + .global bluegl_glLightModelxOES + .type bluegl_glLightModelxOES, %function +bluegl_glLightModelxOES: + adrp x16, :got:__blue_glCore_glLightModelxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glLightModelxOES] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2i64ARB, .-bluegl_glProgramUniform2i64ARB + .size bluegl_glLightModelxOES, .-bluegl_glLightModelxOES .align 2 - .global bluegl_glTextureParameterfEXT - .type bluegl_glTextureParameterfEXT, %function -bluegl_glTextureParameterfEXT: - adrp x16, :got:__blue_glCore_glTextureParameterfEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameterfEXT] + .global bluegl_glLightModelxvOES + .type bluegl_glLightModelxvOES, %function +bluegl_glLightModelxvOES: + adrp x16, :got:__blue_glCore_glLightModelxvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glLightModelxvOES] ldr x16, [x16] br x16 - .size bluegl_glTextureParameterfEXT, .-bluegl_glTextureParameterfEXT + .size bluegl_glLightModelxvOES, .-bluegl_glLightModelxvOES .align 2 - .global bluegl_glGetProgramLocalParameterIivNV - .type bluegl_glGetProgramLocalParameterIivNV, %function -bluegl_glGetProgramLocalParameterIivNV: - adrp x16, :got:__blue_glCore_glGetProgramLocalParameterIivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramLocalParameterIivNV] + .global bluegl_glLightxOES + .type bluegl_glLightxOES, %function +bluegl_glLightxOES: + adrp x16, :got:__blue_glCore_glLightxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glLightxOES] ldr x16, [x16] br x16 - .size bluegl_glGetProgramLocalParameterIivNV, .-bluegl_glGetProgramLocalParameterIivNV + .size bluegl_glLightxOES, .-bluegl_glLightxOES .align 2 - .global bluegl_glGetShaderInfoLog - .type bluegl_glGetShaderInfoLog, %function -bluegl_glGetShaderInfoLog: - adrp x16, :got:__blue_glCore_glGetShaderInfoLog - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetShaderInfoLog] + .global bluegl_glLightxvOES + .type bluegl_glLightxvOES, %function +bluegl_glLightxvOES: + adrp x16, :got:__blue_glCore_glLightxvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glLightxvOES] ldr x16, [x16] br x16 - .size bluegl_glGetShaderInfoLog, .-bluegl_glGetShaderInfoLog + .size bluegl_glLightxvOES, .-bluegl_glLightxvOES .align 2 - .global bluegl_glTexCoordP2uiv - .type bluegl_glTexCoordP2uiv, %function -bluegl_glTexCoordP2uiv: - adrp x16, :got:__blue_glCore_glTexCoordP2uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordP2uiv] + .global bluegl_glLineWidthxOES + .type bluegl_glLineWidthxOES, %function +bluegl_glLineWidthxOES: + adrp x16, :got:__blue_glCore_glLineWidthxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glLineWidthxOES] ldr x16, [x16] br x16 - .size bluegl_glTexCoordP2uiv, .-bluegl_glTexCoordP2uiv + .size bluegl_glLineWidthxOES, .-bluegl_glLineWidthxOES .align 2 - .global bluegl_glDebugMessageCallback - .type bluegl_glDebugMessageCallback, %function -bluegl_glDebugMessageCallback: - adrp x16, :got:__blue_glCore_glDebugMessageCallback - ldr x16, [x16, #:got_lo12:__blue_glCore_glDebugMessageCallback] + .global bluegl_glLoadMatrixxOES + .type bluegl_glLoadMatrixxOES, %function +bluegl_glLoadMatrixxOES: + adrp x16, :got:__blue_glCore_glLoadMatrixxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glLoadMatrixxOES] ldr x16, [x16] br x16 - .size bluegl_glDebugMessageCallback, .-bluegl_glDebugMessageCallback + .size bluegl_glLoadMatrixxOES, .-bluegl_glLoadMatrixxOES .align 2 - .global bluegl_glLoadTransposeMatrixfARB - .type bluegl_glLoadTransposeMatrixfARB, %function -bluegl_glLoadTransposeMatrixfARB: - adrp x16, :got:__blue_glCore_glLoadTransposeMatrixfARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glLoadTransposeMatrixfARB] + .global bluegl_glMaterialxOES + .type bluegl_glMaterialxOES, %function +bluegl_glMaterialxOES: + adrp x16, :got:__blue_glCore_glMaterialxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMaterialxOES] ldr x16, [x16] br x16 - .size bluegl_glLoadTransposeMatrixfARB, .-bluegl_glLoadTransposeMatrixfARB + .size bluegl_glMaterialxOES, .-bluegl_glMaterialxOES .align 2 - .global bluegl_glUniform1ui - .type bluegl_glUniform1ui, %function -bluegl_glUniform1ui: - adrp x16, :got:__blue_glCore_glUniform1ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1ui] + .global bluegl_glMaterialxvOES + .type bluegl_glMaterialxvOES, %function +bluegl_glMaterialxvOES: + adrp x16, :got:__blue_glCore_glMaterialxvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMaterialxvOES] ldr x16, [x16] br x16 - .size bluegl_glUniform1ui, .-bluegl_glUniform1ui + .size bluegl_glMaterialxvOES, .-bluegl_glMaterialxvOES .align 2 - .global bluegl_glVertexAttribL4dvEXT - .type bluegl_glVertexAttribL4dvEXT, %function -bluegl_glVertexAttribL4dvEXT: - adrp x16, :got:__blue_glCore_glVertexAttribL4dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL4dvEXT] + .global bluegl_glMultMatrixxOES + .type bluegl_glMultMatrixxOES, %function +bluegl_glMultMatrixxOES: + adrp x16, :got:__blue_glCore_glMultMatrixxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultMatrixxOES] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL4dvEXT, .-bluegl_glVertexAttribL4dvEXT + .size bluegl_glMultMatrixxOES, .-bluegl_glMultMatrixxOES .align 2 - .global bluegl_glVertex3bvOES - .type bluegl_glVertex3bvOES, %function -bluegl_glVertex3bvOES: - adrp x16, :got:__blue_glCore_glVertex3bvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex3bvOES] + .global bluegl_glMultiTexCoord4xOES + .type bluegl_glMultiTexCoord4xOES, %function +bluegl_glMultiTexCoord4xOES: + adrp x16, :got:__blue_glCore_glMultiTexCoord4xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4xOES] ldr x16, [x16] br x16 - .size bluegl_glVertex3bvOES, .-bluegl_glVertex3bvOES + .size bluegl_glMultiTexCoord4xOES, .-bluegl_glMultiTexCoord4xOES .align 2 - .global bluegl_glPassThroughxOES - .type bluegl_glPassThroughxOES, %function -bluegl_glPassThroughxOES: - adrp x16, :got:__blue_glCore_glPassThroughxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glPassThroughxOES] + .global bluegl_glNormal3xOES + .type bluegl_glNormal3xOES, %function +bluegl_glNormal3xOES: + adrp x16, :got:__blue_glCore_glNormal3xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormal3xOES] ldr x16, [x16] br x16 - .size bluegl_glPassThroughxOES, .-bluegl_glPassThroughxOES + .size bluegl_glNormal3xOES, .-bluegl_glNormal3xOES .align 2 - .global bluegl_glGetFloatIndexedvEXT - .type bluegl_glGetFloatIndexedvEXT, %function -bluegl_glGetFloatIndexedvEXT: - adrp x16, :got:__blue_glCore_glGetFloatIndexedvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFloatIndexedvEXT] + .global bluegl_glOrthoxOES + .type bluegl_glOrthoxOES, %function +bluegl_glOrthoxOES: + adrp x16, :got:__blue_glCore_glOrthoxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glOrthoxOES] ldr x16, [x16] br x16 - .size bluegl_glGetFloatIndexedvEXT, .-bluegl_glGetFloatIndexedvEXT + .size bluegl_glOrthoxOES, .-bluegl_glOrthoxOES .align 2 - .global bluegl_glSubpixelPrecisionBiasNV - .type bluegl_glSubpixelPrecisionBiasNV, %function -bluegl_glSubpixelPrecisionBiasNV: - adrp x16, :got:__blue_glCore_glSubpixelPrecisionBiasNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glSubpixelPrecisionBiasNV] + .global bluegl_glPointParameterxvOES + .type bluegl_glPointParameterxvOES, %function +bluegl_glPointParameterxvOES: + adrp x16, :got:__blue_glCore_glPointParameterxvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterxvOES] ldr x16, [x16] br x16 - .size bluegl_glSubpixelPrecisionBiasNV, .-bluegl_glSubpixelPrecisionBiasNV + .size bluegl_glPointParameterxvOES, .-bluegl_glPointParameterxvOES .align 2 - .global bluegl_glFinishFenceNV - .type bluegl_glFinishFenceNV, %function -bluegl_glFinishFenceNV: - adrp x16, :got:__blue_glCore_glFinishFenceNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glFinishFenceNV] + .global bluegl_glPointSizexOES + .type bluegl_glPointSizexOES, %function +bluegl_glPointSizexOES: + adrp x16, :got:__blue_glCore_glPointSizexOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glPointSizexOES] ldr x16, [x16] br x16 - .size bluegl_glFinishFenceNV, .-bluegl_glFinishFenceNV + .size bluegl_glPointSizexOES, .-bluegl_glPointSizexOES .align 2 - .global bluegl_glGetProgramBinary - .type bluegl_glGetProgramBinary, %function -bluegl_glGetProgramBinary: - adrp x16, :got:__blue_glCore_glGetProgramBinary - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramBinary] + .global bluegl_glPolygonOffsetxOES + .type bluegl_glPolygonOffsetxOES, %function +bluegl_glPolygonOffsetxOES: + adrp x16, :got:__blue_glCore_glPolygonOffsetxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glPolygonOffsetxOES] ldr x16, [x16] br x16 - .size bluegl_glGetProgramBinary, .-bluegl_glGetProgramBinary + .size bluegl_glPolygonOffsetxOES, .-bluegl_glPolygonOffsetxOES .align 2 - .global bluegl_glBlendFuncSeparateIndexedAMD - .type bluegl_glBlendFuncSeparateIndexedAMD, %function -bluegl_glBlendFuncSeparateIndexedAMD: - adrp x16, :got:__blue_glCore_glBlendFuncSeparateIndexedAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFuncSeparateIndexedAMD] + .global bluegl_glRotatexOES + .type bluegl_glRotatexOES, %function +bluegl_glRotatexOES: + adrp x16, :got:__blue_glCore_glRotatexOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glRotatexOES] ldr x16, [x16] br x16 - .size bluegl_glBlendFuncSeparateIndexedAMD, .-bluegl_glBlendFuncSeparateIndexedAMD + .size bluegl_glRotatexOES, .-bluegl_glRotatexOES .align 2 - .global bluegl_glBlendFuncSeparate - .type bluegl_glBlendFuncSeparate, %function -bluegl_glBlendFuncSeparate: - adrp x16, :got:__blue_glCore_glBlendFuncSeparate - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFuncSeparate] + .global bluegl_glScalexOES + .type bluegl_glScalexOES, %function +bluegl_glScalexOES: + adrp x16, :got:__blue_glCore_glScalexOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glScalexOES] ldr x16, [x16] br x16 - .size bluegl_glBlendFuncSeparate, .-bluegl_glBlendFuncSeparate + .size bluegl_glScalexOES, .-bluegl_glScalexOES .align 2 - .global bluegl_glIndexxvOES - .type bluegl_glIndexxvOES, %function -bluegl_glIndexxvOES: - adrp x16, :got:__blue_glCore_glIndexxvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glIndexxvOES] + .global bluegl_glTexEnvxOES + .type bluegl_glTexEnvxOES, %function +bluegl_glTexEnvxOES: + adrp x16, :got:__blue_glCore_glTexEnvxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexEnvxOES] ldr x16, [x16] br x16 - .size bluegl_glIndexxvOES, .-bluegl_glIndexxvOES + .size bluegl_glTexEnvxOES, .-bluegl_glTexEnvxOES .align 2 - .global bluegl_glVertexAttrib4NuivARB - .type bluegl_glVertexAttrib4NuivARB, %function -bluegl_glVertexAttrib4NuivARB: - adrp x16, :got:__blue_glCore_glVertexAttrib4NuivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4NuivARB] + .global bluegl_glTexEnvxvOES + .type bluegl_glTexEnvxvOES, %function +bluegl_glTexEnvxvOES: + adrp x16, :got:__blue_glCore_glTexEnvxvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexEnvxvOES] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4NuivARB, .-bluegl_glVertexAttrib4NuivARB + .size bluegl_glTexEnvxvOES, .-bluegl_glTexEnvxvOES .align 2 - .global bluegl_glUniform2ui64ARB - .type bluegl_glUniform2ui64ARB, %function -bluegl_glUniform2ui64ARB: - adrp x16, :got:__blue_glCore_glUniform2ui64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2ui64ARB] + .global bluegl_glTexParameterxOES + .type bluegl_glTexParameterxOES, %function +bluegl_glTexParameterxOES: + adrp x16, :got:__blue_glCore_glTexParameterxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameterxOES] ldr x16, [x16] br x16 - .size bluegl_glUniform2ui64ARB, .-bluegl_glUniform2ui64ARB + .size bluegl_glTexParameterxOES, .-bluegl_glTexParameterxOES .align 2 - .global bluegl_glEndPerfMonitorAMD - .type bluegl_glEndPerfMonitorAMD, %function -bluegl_glEndPerfMonitorAMD: - adrp x16, :got:__blue_glCore_glEndPerfMonitorAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glEndPerfMonitorAMD] + .global bluegl_glTexParameterxvOES + .type bluegl_glTexParameterxvOES, %function +bluegl_glTexParameterxvOES: + adrp x16, :got:__blue_glCore_glTexParameterxvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameterxvOES] ldr x16, [x16] br x16 - .size bluegl_glEndPerfMonitorAMD, .-bluegl_glEndPerfMonitorAMD + .size bluegl_glTexParameterxvOES, .-bluegl_glTexParameterxvOES .align 2 - .global bluegl_glReleaseShaderCompiler - .type bluegl_glReleaseShaderCompiler, %function -bluegl_glReleaseShaderCompiler: - adrp x16, :got:__blue_glCore_glReleaseShaderCompiler - ldr x16, [x16, #:got_lo12:__blue_glCore_glReleaseShaderCompiler] + .global bluegl_glTranslatexOES + .type bluegl_glTranslatexOES, %function +bluegl_glTranslatexOES: + adrp x16, :got:__blue_glCore_glTranslatexOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTranslatexOES] ldr x16, [x16] br x16 - .size bluegl_glReleaseShaderCompiler, .-bluegl_glReleaseShaderCompiler + .size bluegl_glTranslatexOES, .-bluegl_glTranslatexOES .align 2 - .global bluegl_glGenFramebuffersEXT - .type bluegl_glGenFramebuffersEXT, %function -bluegl_glGenFramebuffersEXT: - adrp x16, :got:__blue_glCore_glGenFramebuffersEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenFramebuffersEXT] + .global bluegl_glAccumxOES + .type bluegl_glAccumxOES, %function +bluegl_glAccumxOES: + adrp x16, :got:__blue_glCore_glAccumxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glAccumxOES] ldr x16, [x16] br x16 - .size bluegl_glGenFramebuffersEXT, .-bluegl_glGenFramebuffersEXT + .size bluegl_glAccumxOES, .-bluegl_glAccumxOES .align 2 - .global bluegl_glUniform2uiv - .type bluegl_glUniform2uiv, %function -bluegl_glUniform2uiv: - adrp x16, :got:__blue_glCore_glUniform2uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2uiv] + .global bluegl_glBitmapxOES + .type bluegl_glBitmapxOES, %function +bluegl_glBitmapxOES: + adrp x16, :got:__blue_glCore_glBitmapxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glBitmapxOES] ldr x16, [x16] br x16 - .size bluegl_glUniform2uiv, .-bluegl_glUniform2uiv + .size bluegl_glBitmapxOES, .-bluegl_glBitmapxOES .align 2 - .global bluegl_glGenSymbolsEXT - .type bluegl_glGenSymbolsEXT, %function -bluegl_glGenSymbolsEXT: - adrp x16, :got:__blue_glCore_glGenSymbolsEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenSymbolsEXT] + .global bluegl_glBlendColorxOES + .type bluegl_glBlendColorxOES, %function +bluegl_glBlendColorxOES: + adrp x16, :got:__blue_glCore_glBlendColorxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendColorxOES] ldr x16, [x16] br x16 - .size bluegl_glGenSymbolsEXT, .-bluegl_glGenSymbolsEXT + .size bluegl_glBlendColorxOES, .-bluegl_glBlendColorxOES .align 2 - .global bluegl_glVertexAttribIPointer - .type bluegl_glVertexAttribIPointer, %function -bluegl_glVertexAttribIPointer: - adrp x16, :got:__blue_glCore_glVertexAttribIPointer - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribIPointer] + .global bluegl_glClearAccumxOES + .type bluegl_glClearAccumxOES, %function +bluegl_glClearAccumxOES: + adrp x16, :got:__blue_glCore_glClearAccumxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearAccumxOES] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribIPointer, .-bluegl_glVertexAttribIPointer + .size bluegl_glClearAccumxOES, .-bluegl_glClearAccumxOES .align 2 - .global bluegl_glUniformMatrix3x4fv - .type bluegl_glUniformMatrix3x4fv, %function -bluegl_glUniformMatrix3x4fv: - adrp x16, :got:__blue_glCore_glUniformMatrix3x4fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix3x4fv] + .global bluegl_glColor3xOES + .type bluegl_glColor3xOES, %function +bluegl_glColor3xOES: + adrp x16, :got:__blue_glCore_glColor3xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glColor3xOES] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix3x4fv, .-bluegl_glUniformMatrix3x4fv + .size bluegl_glColor3xOES, .-bluegl_glColor3xOES .align 2 - .global bluegl_glTexCoord3bOES - .type bluegl_glTexCoord3bOES, %function -bluegl_glTexCoord3bOES: - adrp x16, :got:__blue_glCore_glTexCoord3bOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord3bOES] + .global bluegl_glColor3xvOES + .type bluegl_glColor3xvOES, %function +bluegl_glColor3xvOES: + adrp x16, :got:__blue_glCore_glColor3xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glColor3xvOES] ldr x16, [x16] br x16 - .size bluegl_glTexCoord3bOES, .-bluegl_glTexCoord3bOES + .size bluegl_glColor3xvOES, .-bluegl_glColor3xvOES .align 2 - .global bluegl_glVDPAUUnmapSurfacesNV - .type bluegl_glVDPAUUnmapSurfacesNV, %function -bluegl_glVDPAUUnmapSurfacesNV: - adrp x16, :got:__blue_glCore_glVDPAUUnmapSurfacesNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAUUnmapSurfacesNV] + .global bluegl_glColor4xvOES + .type bluegl_glColor4xvOES, %function +bluegl_glColor4xvOES: + adrp x16, :got:__blue_glCore_glColor4xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4xvOES] ldr x16, [x16] br x16 - .size bluegl_glVDPAUUnmapSurfacesNV, .-bluegl_glVDPAUUnmapSurfacesNV + .size bluegl_glColor4xvOES, .-bluegl_glColor4xvOES .align 2 - .global bluegl_glProgramUniform4ui64NV - .type bluegl_glProgramUniform4ui64NV, %function -bluegl_glProgramUniform4ui64NV: - adrp x16, :got:__blue_glCore_glProgramUniform4ui64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4ui64NV] + .global bluegl_glConvolutionParameterxOES + .type bluegl_glConvolutionParameterxOES, %function +bluegl_glConvolutionParameterxOES: + adrp x16, :got:__blue_glCore_glConvolutionParameterxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameterxOES] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4ui64NV, .-bluegl_glProgramUniform4ui64NV + .size bluegl_glConvolutionParameterxOES, .-bluegl_glConvolutionParameterxOES .align 2 - .global bluegl_glUniformHandleui64NV - .type bluegl_glUniformHandleui64NV, %function -bluegl_glUniformHandleui64NV: - adrp x16, :got:__blue_glCore_glUniformHandleui64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformHandleui64NV] + .global bluegl_glConvolutionParameterxvOES + .type bluegl_glConvolutionParameterxvOES, %function +bluegl_glConvolutionParameterxvOES: + adrp x16, :got:__blue_glCore_glConvolutionParameterxvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameterxvOES] ldr x16, [x16] br x16 - .size bluegl_glUniformHandleui64NV, .-bluegl_glUniformHandleui64NV + .size bluegl_glConvolutionParameterxvOES, .-bluegl_glConvolutionParameterxvOES .align 2 - .global bluegl_glGetStageIndexNV - .type bluegl_glGetStageIndexNV, %function -bluegl_glGetStageIndexNV: - adrp x16, :got:__blue_glCore_glGetStageIndexNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetStageIndexNV] + .global bluegl_glEvalCoord1xOES + .type bluegl_glEvalCoord1xOES, %function +bluegl_glEvalCoord1xOES: + adrp x16, :got:__blue_glCore_glEvalCoord1xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glEvalCoord1xOES] ldr x16, [x16] br x16 - .size bluegl_glGetStageIndexNV, .-bluegl_glGetStageIndexNV + .size bluegl_glEvalCoord1xOES, .-bluegl_glEvalCoord1xOES .align 2 - .global bluegl_glMultiTexCoord3fvARB - .type bluegl_glMultiTexCoord3fvARB, %function -bluegl_glMultiTexCoord3fvARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord3fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3fvARB] + .global bluegl_glEvalCoord1xvOES + .type bluegl_glEvalCoord1xvOES, %function +bluegl_glEvalCoord1xvOES: + adrp x16, :got:__blue_glCore_glEvalCoord1xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glEvalCoord1xvOES] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3fvARB, .-bluegl_glMultiTexCoord3fvARB + .size bluegl_glEvalCoord1xvOES, .-bluegl_glEvalCoord1xvOES .align 2 - .global bluegl_glBindBufferOffsetEXT - .type bluegl_glBindBufferOffsetEXT, %function -bluegl_glBindBufferOffsetEXT: - adrp x16, :got:__blue_glCore_glBindBufferOffsetEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBufferOffsetEXT] + .global bluegl_glEvalCoord2xOES + .type bluegl_glEvalCoord2xOES, %function +bluegl_glEvalCoord2xOES: + adrp x16, :got:__blue_glCore_glEvalCoord2xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glEvalCoord2xOES] ldr x16, [x16] br x16 - .size bluegl_glBindBufferOffsetEXT, .-bluegl_glBindBufferOffsetEXT + .size bluegl_glEvalCoord2xOES, .-bluegl_glEvalCoord2xOES .align 2 - .global bluegl_glVertexAttribL4dv - .type bluegl_glVertexAttribL4dv, %function -bluegl_glVertexAttribL4dv: - adrp x16, :got:__blue_glCore_glVertexAttribL4dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL4dv] + .global bluegl_glEvalCoord2xvOES + .type bluegl_glEvalCoord2xvOES, %function +bluegl_glEvalCoord2xvOES: + adrp x16, :got:__blue_glCore_glEvalCoord2xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glEvalCoord2xvOES] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL4dv, .-bluegl_glVertexAttribL4dv + .size bluegl_glEvalCoord2xvOES, .-bluegl_glEvalCoord2xvOES .align 2 - .global bluegl_glClearStencil - .type bluegl_glClearStencil, %function -bluegl_glClearStencil: - adrp x16, :got:__blue_glCore_glClearStencil - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearStencil] + .global bluegl_glFeedbackBufferxOES + .type bluegl_glFeedbackBufferxOES, %function +bluegl_glFeedbackBufferxOES: + adrp x16, :got:__blue_glCore_glFeedbackBufferxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glFeedbackBufferxOES] ldr x16, [x16] br x16 - .size bluegl_glClearStencil, .-bluegl_glClearStencil + .size bluegl_glFeedbackBufferxOES, .-bluegl_glFeedbackBufferxOES .align 2 - .global bluegl_glWindowPos2ivMESA - .type bluegl_glWindowPos2ivMESA, %function -bluegl_glWindowPos2ivMESA: - adrp x16, :got:__blue_glCore_glWindowPos2ivMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2ivMESA] + .global bluegl_glGetConvolutionParameterxvOES + .type bluegl_glGetConvolutionParameterxvOES, %function +bluegl_glGetConvolutionParameterxvOES: + adrp x16, :got:__blue_glCore_glGetConvolutionParameterxvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetConvolutionParameterxvOES] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2ivMESA, .-bluegl_glWindowPos2ivMESA + .size bluegl_glGetConvolutionParameterxvOES, .-bluegl_glGetConvolutionParameterxvOES .align 2 - .global bluegl_glReplacementCodeubvSUN - .type bluegl_glReplacementCodeubvSUN, %function -bluegl_glReplacementCodeubvSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeubvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeubvSUN] + .global bluegl_glGetHistogramParameterxvOES + .type bluegl_glGetHistogramParameterxvOES, %function +bluegl_glGetHistogramParameterxvOES: + adrp x16, :got:__blue_glCore_glGetHistogramParameterxvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetHistogramParameterxvOES] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeubvSUN, .-bluegl_glReplacementCodeubvSUN + .size bluegl_glGetHistogramParameterxvOES, .-bluegl_glGetHistogramParameterxvOES .align 2 - .global bluegl_glClipPlanefOES - .type bluegl_glClipPlanefOES, %function -bluegl_glClipPlanefOES: - adrp x16, :got:__blue_glCore_glClipPlanefOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glClipPlanefOES] + .global bluegl_glGetLightxOES + .type bluegl_glGetLightxOES, %function +bluegl_glGetLightxOES: + adrp x16, :got:__blue_glCore_glGetLightxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetLightxOES] ldr x16, [x16] br x16 - .size bluegl_glClipPlanefOES, .-bluegl_glClipPlanefOES + .size bluegl_glGetLightxOES, .-bluegl_glGetLightxOES .align 2 - .global bluegl_glMultiTexCoord1xOES - .type bluegl_glMultiTexCoord1xOES, %function -bluegl_glMultiTexCoord1xOES: - adrp x16, :got:__blue_glCore_glMultiTexCoord1xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1xOES] + .global bluegl_glGetMapxvOES + .type bluegl_glGetMapxvOES, %function +bluegl_glGetMapxvOES: + adrp x16, :got:__blue_glCore_glGetMapxvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMapxvOES] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1xOES, .-bluegl_glMultiTexCoord1xOES + .size bluegl_glGetMapxvOES, .-bluegl_glGetMapxvOES .align 2 - .global bluegl_glGetProgramInfoLog - .type bluegl_glGetProgramInfoLog, %function -bluegl_glGetProgramInfoLog: - adrp x16, :got:__blue_glCore_glGetProgramInfoLog - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramInfoLog] + .global bluegl_glGetMaterialxOES + .type bluegl_glGetMaterialxOES, %function +bluegl_glGetMaterialxOES: + adrp x16, :got:__blue_glCore_glGetMaterialxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMaterialxOES] ldr x16, [x16] br x16 - .size bluegl_glGetProgramInfoLog, .-bluegl_glGetProgramInfoLog + .size bluegl_glGetMaterialxOES, .-bluegl_glGetMaterialxOES .align 2 - .global bluegl_glEndFragmentShaderATI - .type bluegl_glEndFragmentShaderATI, %function -bluegl_glEndFragmentShaderATI: - adrp x16, :got:__blue_glCore_glEndFragmentShaderATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glEndFragmentShaderATI] + .global bluegl_glGetPixelMapxv + .type bluegl_glGetPixelMapxv, %function +bluegl_glGetPixelMapxv: + adrp x16, :got:__blue_glCore_glGetPixelMapxv + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPixelMapxv] ldr x16, [x16] br x16 - .size bluegl_glEndFragmentShaderATI, .-bluegl_glEndFragmentShaderATI + .size bluegl_glGetPixelMapxv, .-bluegl_glGetPixelMapxv .align 2 - .global bluegl_glGetTransformFeedbackVaryingNV - .type bluegl_glGetTransformFeedbackVaryingNV, %function -bluegl_glGetTransformFeedbackVaryingNV: - adrp x16, :got:__blue_glCore_glGetTransformFeedbackVaryingNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTransformFeedbackVaryingNV] + .global bluegl_glGetTexGenxvOES + .type bluegl_glGetTexGenxvOES, %function +bluegl_glGetTexGenxvOES: + adrp x16, :got:__blue_glCore_glGetTexGenxvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexGenxvOES] ldr x16, [x16] br x16 - .size bluegl_glGetTransformFeedbackVaryingNV, .-bluegl_glGetTransformFeedbackVaryingNV + .size bluegl_glGetTexGenxvOES, .-bluegl_glGetTexGenxvOES .align 2 - .global bluegl_glProgramUniformMatrix4x2dv - .type bluegl_glProgramUniformMatrix4x2dv, %function -bluegl_glProgramUniformMatrix4x2dv: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix4x2dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4x2dv] + .global bluegl_glGetTexLevelParameterxvOES + .type bluegl_glGetTexLevelParameterxvOES, %function +bluegl_glGetTexLevelParameterxvOES: + adrp x16, :got:__blue_glCore_glGetTexLevelParameterxvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexLevelParameterxvOES] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix4x2dv, .-bluegl_glProgramUniformMatrix4x2dv + .size bluegl_glGetTexLevelParameterxvOES, .-bluegl_glGetTexLevelParameterxvOES .align 2 - .global bluegl_glResetHistogramEXT - .type bluegl_glResetHistogramEXT, %function -bluegl_glResetHistogramEXT: - adrp x16, :got:__blue_glCore_glResetHistogramEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glResetHistogramEXT] + .global bluegl_glIndexxOES + .type bluegl_glIndexxOES, %function +bluegl_glIndexxOES: + adrp x16, :got:__blue_glCore_glIndexxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glIndexxOES] ldr x16, [x16] br x16 - .size bluegl_glResetHistogramEXT, .-bluegl_glResetHistogramEXT + .size bluegl_glIndexxOES, .-bluegl_glIndexxOES .align 2 - .global bluegl_glUniform1i64vNV - .type bluegl_glUniform1i64vNV, %function -bluegl_glUniform1i64vNV: - adrp x16, :got:__blue_glCore_glUniform1i64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1i64vNV] + .global bluegl_glIndexxvOES + .type bluegl_glIndexxvOES, %function +bluegl_glIndexxvOES: + adrp x16, :got:__blue_glCore_glIndexxvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glIndexxvOES] ldr x16, [x16] br x16 - .size bluegl_glUniform1i64vNV, .-bluegl_glUniform1i64vNV + .size bluegl_glIndexxvOES, .-bluegl_glIndexxvOES .align 2 - .global bluegl_glProgramEnvParameter4dARB - .type bluegl_glProgramEnvParameter4dARB, %function -bluegl_glProgramEnvParameter4dARB: - adrp x16, :got:__blue_glCore_glProgramEnvParameter4dARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParameter4dARB] + .global bluegl_glLoadTransposeMatrixxOES + .type bluegl_glLoadTransposeMatrixxOES, %function +bluegl_glLoadTransposeMatrixxOES: + adrp x16, :got:__blue_glCore_glLoadTransposeMatrixxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glLoadTransposeMatrixxOES] ldr x16, [x16] br x16 - .size bluegl_glProgramEnvParameter4dARB, .-bluegl_glProgramEnvParameter4dARB + .size bluegl_glLoadTransposeMatrixxOES, .-bluegl_glLoadTransposeMatrixxOES .align 2 - .global bluegl_glCopyTextureSubImage2DEXT - .type bluegl_glCopyTextureSubImage2DEXT, %function -bluegl_glCopyTextureSubImage2DEXT: - adrp x16, :got:__blue_glCore_glCopyTextureSubImage2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTextureSubImage2DEXT] + .global bluegl_glMap1xOES + .type bluegl_glMap1xOES, %function +bluegl_glMap1xOES: + adrp x16, :got:__blue_glCore_glMap1xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMap1xOES] ldr x16, [x16] br x16 - .size bluegl_glCopyTextureSubImage2DEXT, .-bluegl_glCopyTextureSubImage2DEXT + .size bluegl_glMap1xOES, .-bluegl_glMap1xOES .align 2 - .global bluegl_glGetCombinerInputParameterivNV - .type bluegl_glGetCombinerInputParameterivNV, %function -bluegl_glGetCombinerInputParameterivNV: - adrp x16, :got:__blue_glCore_glGetCombinerInputParameterivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCombinerInputParameterivNV] + .global bluegl_glMap2xOES + .type bluegl_glMap2xOES, %function +bluegl_glMap2xOES: + adrp x16, :got:__blue_glCore_glMap2xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMap2xOES] ldr x16, [x16] br x16 - .size bluegl_glGetCombinerInputParameterivNV, .-bluegl_glGetCombinerInputParameterivNV + .size bluegl_glMap2xOES, .-bluegl_glMap2xOES .align 2 - .global bluegl_glUniformMatrix4fv - .type bluegl_glUniformMatrix4fv, %function -bluegl_glUniformMatrix4fv: - adrp x16, :got:__blue_glCore_glUniformMatrix4fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix4fv] + .global bluegl_glMapGrid1xOES + .type bluegl_glMapGrid1xOES, %function +bluegl_glMapGrid1xOES: + adrp x16, :got:__blue_glCore_glMapGrid1xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMapGrid1xOES] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix4fv, .-bluegl_glUniformMatrix4fv + .size bluegl_glMapGrid1xOES, .-bluegl_glMapGrid1xOES .align 2 - .global bluegl_glGenQueriesARB - .type bluegl_glGenQueriesARB, %function -bluegl_glGenQueriesARB: - adrp x16, :got:__blue_glCore_glGenQueriesARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenQueriesARB] + .global bluegl_glMapGrid2xOES + .type bluegl_glMapGrid2xOES, %function +bluegl_glMapGrid2xOES: + adrp x16, :got:__blue_glCore_glMapGrid2xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMapGrid2xOES] ldr x16, [x16] br x16 - .size bluegl_glGenQueriesARB, .-bluegl_glGenQueriesARB + .size bluegl_glMapGrid2xOES, .-bluegl_glMapGrid2xOES .align 2 - .global bluegl_glGetnSeparableFilter - .type bluegl_glGetnSeparableFilter, %function -bluegl_glGetnSeparableFilter: - adrp x16, :got:__blue_glCore_glGetnSeparableFilter - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnSeparableFilter] + .global bluegl_glMultTransposeMatrixxOES + .type bluegl_glMultTransposeMatrixxOES, %function +bluegl_glMultTransposeMatrixxOES: + adrp x16, :got:__blue_glCore_glMultTransposeMatrixxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultTransposeMatrixxOES] ldr x16, [x16] br x16 - .size bluegl_glGetnSeparableFilter, .-bluegl_glGetnSeparableFilter + .size bluegl_glMultTransposeMatrixxOES, .-bluegl_glMultTransposeMatrixxOES .align 2 - .global bluegl_glUniform3ui64vARB - .type bluegl_glUniform3ui64vARB, %function -bluegl_glUniform3ui64vARB: - adrp x16, :got:__blue_glCore_glUniform3ui64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3ui64vARB] + .global bluegl_glMultiTexCoord1xOES + .type bluegl_glMultiTexCoord1xOES, %function +bluegl_glMultiTexCoord1xOES: + adrp x16, :got:__blue_glCore_glMultiTexCoord1xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1xOES] + ldr x16, [x16] + br x16 + .size bluegl_glMultiTexCoord1xOES, .-bluegl_glMultiTexCoord1xOES + + .align 2 + .global bluegl_glMultiTexCoord1xvOES + .type bluegl_glMultiTexCoord1xvOES, %function +bluegl_glMultiTexCoord1xvOES: + adrp x16, :got:__blue_glCore_glMultiTexCoord1xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1xvOES] ldr x16, [x16] br x16 - .size bluegl_glUniform3ui64vARB, .-bluegl_glUniform3ui64vARB + .size bluegl_glMultiTexCoord1xvOES, .-bluegl_glMultiTexCoord1xvOES .align 2 - .global bluegl_glMultiTexCoord1i - .type bluegl_glMultiTexCoord1i, %function -bluegl_glMultiTexCoord1i: - adrp x16, :got:__blue_glCore_glMultiTexCoord1i - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1i] + .global bluegl_glMultiTexCoord2xOES + .type bluegl_glMultiTexCoord2xOES, %function +bluegl_glMultiTexCoord2xOES: + adrp x16, :got:__blue_glCore_glMultiTexCoord2xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2xOES] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1i, .-bluegl_glMultiTexCoord1i + .size bluegl_glMultiTexCoord2xOES, .-bluegl_glMultiTexCoord2xOES .align 2 - .global bluegl_glColorTable - .type bluegl_glColorTable, %function -bluegl_glColorTable: - adrp x16, :got:__blue_glCore_glColorTable - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorTable] + .global bluegl_glMultiTexCoord2xvOES + .type bluegl_glMultiTexCoord2xvOES, %function +bluegl_glMultiTexCoord2xvOES: + adrp x16, :got:__blue_glCore_glMultiTexCoord2xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2xvOES] ldr x16, [x16] br x16 - .size bluegl_glColorTable, .-bluegl_glColorTable + .size bluegl_glMultiTexCoord2xvOES, .-bluegl_glMultiTexCoord2xvOES .align 2 - .global bluegl_glVertexAttribs4ubvNV - .type bluegl_glVertexAttribs4ubvNV, %function -bluegl_glVertexAttribs4ubvNV: - adrp x16, :got:__blue_glCore_glVertexAttribs4ubvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs4ubvNV] + .global bluegl_glMultiTexCoord3xOES + .type bluegl_glMultiTexCoord3xOES, %function +bluegl_glMultiTexCoord3xOES: + adrp x16, :got:__blue_glCore_glMultiTexCoord3xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3xOES] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribs4ubvNV, .-bluegl_glVertexAttribs4ubvNV + .size bluegl_glMultiTexCoord3xOES, .-bluegl_glMultiTexCoord3xOES .align 2 - .global bluegl_glProgramUniform3uiv - .type bluegl_glProgramUniform3uiv, %function -bluegl_glProgramUniform3uiv: - adrp x16, :got:__blue_glCore_glProgramUniform3uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3uiv] + .global bluegl_glMultiTexCoord3xvOES + .type bluegl_glMultiTexCoord3xvOES, %function +bluegl_glMultiTexCoord3xvOES: + adrp x16, :got:__blue_glCore_glMultiTexCoord3xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3xvOES] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3uiv, .-bluegl_glProgramUniform3uiv + .size bluegl_glMultiTexCoord3xvOES, .-bluegl_glMultiTexCoord3xvOES .align 2 - .global bluegl_glProgramUniformMatrix3x2fv - .type bluegl_glProgramUniformMatrix3x2fv, %function -bluegl_glProgramUniformMatrix3x2fv: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix3x2fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3x2fv] + .global bluegl_glMultiTexCoord4xvOES + .type bluegl_glMultiTexCoord4xvOES, %function +bluegl_glMultiTexCoord4xvOES: + adrp x16, :got:__blue_glCore_glMultiTexCoord4xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4xvOES] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix3x2fv, .-bluegl_glProgramUniformMatrix3x2fv + .size bluegl_glMultiTexCoord4xvOES, .-bluegl_glMultiTexCoord4xvOES .align 2 - .global bluegl_glUnmapBuffer - .type bluegl_glUnmapBuffer, %function -bluegl_glUnmapBuffer: - adrp x16, :got:__blue_glCore_glUnmapBuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glUnmapBuffer] + .global bluegl_glNormal3xvOES + .type bluegl_glNormal3xvOES, %function +bluegl_glNormal3xvOES: + adrp x16, :got:__blue_glCore_glNormal3xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormal3xvOES] ldr x16, [x16] br x16 - .size bluegl_glUnmapBuffer, .-bluegl_glUnmapBuffer + .size bluegl_glNormal3xvOES, .-bluegl_glNormal3xvOES .align 2 - .global bluegl_glBindTextureUnit - .type bluegl_glBindTextureUnit, %function -bluegl_glBindTextureUnit: - adrp x16, :got:__blue_glCore_glBindTextureUnit - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindTextureUnit] + .global bluegl_glPassThroughxOES + .type bluegl_glPassThroughxOES, %function +bluegl_glPassThroughxOES: + adrp x16, :got:__blue_glCore_glPassThroughxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glPassThroughxOES] ldr x16, [x16] br x16 - .size bluegl_glBindTextureUnit, .-bluegl_glBindTextureUnit + .size bluegl_glPassThroughxOES, .-bluegl_glPassThroughxOES .align 2 - .global bluegl_glTextureParameterIuivEXT - .type bluegl_glTextureParameterIuivEXT, %function -bluegl_glTextureParameterIuivEXT: - adrp x16, :got:__blue_glCore_glTextureParameterIuivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameterIuivEXT] + .global bluegl_glPixelMapx + .type bluegl_glPixelMapx, %function +bluegl_glPixelMapx: + adrp x16, :got:__blue_glCore_glPixelMapx + ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelMapx] ldr x16, [x16] br x16 - .size bluegl_glTextureParameterIuivEXT, .-bluegl_glTextureParameterIuivEXT + .size bluegl_glPixelMapx, .-bluegl_glPixelMapx .align 2 - .global bluegl_glVertexAttribDivisor - .type bluegl_glVertexAttribDivisor, %function -bluegl_glVertexAttribDivisor: - adrp x16, :got:__blue_glCore_glVertexAttribDivisor - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribDivisor] + .global bluegl_glPixelStorex + .type bluegl_glPixelStorex, %function +bluegl_glPixelStorex: + adrp x16, :got:__blue_glCore_glPixelStorex + ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelStorex] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribDivisor, .-bluegl_glVertexAttribDivisor + .size bluegl_glPixelStorex, .-bluegl_glPixelStorex .align 2 - .global bluegl_glSamplerParameterIiv - .type bluegl_glSamplerParameterIiv, %function -bluegl_glSamplerParameterIiv: - adrp x16, :got:__blue_glCore_glSamplerParameterIiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glSamplerParameterIiv] + .global bluegl_glPixelTransferxOES + .type bluegl_glPixelTransferxOES, %function +bluegl_glPixelTransferxOES: + adrp x16, :got:__blue_glCore_glPixelTransferxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTransferxOES] ldr x16, [x16] br x16 - .size bluegl_glSamplerParameterIiv, .-bluegl_glSamplerParameterIiv + .size bluegl_glPixelTransferxOES, .-bluegl_glPixelTransferxOES .align 2 - .global bluegl_glGetDebugMessageLog - .type bluegl_glGetDebugMessageLog, %function -bluegl_glGetDebugMessageLog: - adrp x16, :got:__blue_glCore_glGetDebugMessageLog - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetDebugMessageLog] + .global bluegl_glPixelZoomxOES + .type bluegl_glPixelZoomxOES, %function +bluegl_glPixelZoomxOES: + adrp x16, :got:__blue_glCore_glPixelZoomxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelZoomxOES] ldr x16, [x16] br x16 - .size bluegl_glGetDebugMessageLog, .-bluegl_glGetDebugMessageLog + .size bluegl_glPixelZoomxOES, .-bluegl_glPixelZoomxOES .align 2 - .global bluegl_glSelectPerfMonitorCountersAMD - .type bluegl_glSelectPerfMonitorCountersAMD, %function -bluegl_glSelectPerfMonitorCountersAMD: - adrp x16, :got:__blue_glCore_glSelectPerfMonitorCountersAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glSelectPerfMonitorCountersAMD] + .global bluegl_glPrioritizeTexturesxOES + .type bluegl_glPrioritizeTexturesxOES, %function +bluegl_glPrioritizeTexturesxOES: + adrp x16, :got:__blue_glCore_glPrioritizeTexturesxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glPrioritizeTexturesxOES] ldr x16, [x16] br x16 - .size bluegl_glSelectPerfMonitorCountersAMD, .-bluegl_glSelectPerfMonitorCountersAMD + .size bluegl_glPrioritizeTexturesxOES, .-bluegl_glPrioritizeTexturesxOES .align 2 - .global bluegl_glVertexAttribI2i - .type bluegl_glVertexAttribI2i, %function -bluegl_glVertexAttribI2i: - adrp x16, :got:__blue_glCore_glVertexAttribI2i - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI2i] + .global bluegl_glRasterPos2xOES + .type bluegl_glRasterPos2xOES, %function +bluegl_glRasterPos2xOES: + adrp x16, :got:__blue_glCore_glRasterPos2xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glRasterPos2xOES] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI2i, .-bluegl_glVertexAttribI2i + .size bluegl_glRasterPos2xOES, .-bluegl_glRasterPos2xOES .align 2 - .global bluegl_glDepthRangedNV - .type bluegl_glDepthRangedNV, %function -bluegl_glDepthRangedNV: - adrp x16, :got:__blue_glCore_glDepthRangedNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthRangedNV] + .global bluegl_glRasterPos2xvOES + .type bluegl_glRasterPos2xvOES, %function +bluegl_glRasterPos2xvOES: + adrp x16, :got:__blue_glCore_glRasterPos2xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glRasterPos2xvOES] ldr x16, [x16] br x16 - .size bluegl_glDepthRangedNV, .-bluegl_glDepthRangedNV + .size bluegl_glRasterPos2xvOES, .-bluegl_glRasterPos2xvOES .align 2 - .global bluegl_glTextureRangeAPPLE - .type bluegl_glTextureRangeAPPLE, %function -bluegl_glTextureRangeAPPLE: - adrp x16, :got:__blue_glCore_glTextureRangeAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureRangeAPPLE] + .global bluegl_glRasterPos3xOES + .type bluegl_glRasterPos3xOES, %function +bluegl_glRasterPos3xOES: + adrp x16, :got:__blue_glCore_glRasterPos3xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glRasterPos3xOES] ldr x16, [x16] br x16 - .size bluegl_glTextureRangeAPPLE, .-bluegl_glTextureRangeAPPLE + .size bluegl_glRasterPos3xOES, .-bluegl_glRasterPos3xOES .align 2 - .global bluegl_glEvalCoord2xOES - .type bluegl_glEvalCoord2xOES, %function -bluegl_glEvalCoord2xOES: - adrp x16, :got:__blue_glCore_glEvalCoord2xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glEvalCoord2xOES] + .global bluegl_glRasterPos3xvOES + .type bluegl_glRasterPos3xvOES, %function +bluegl_glRasterPos3xvOES: + adrp x16, :got:__blue_glCore_glRasterPos3xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glRasterPos3xvOES] ldr x16, [x16] br x16 - .size bluegl_glEvalCoord2xOES, .-bluegl_glEvalCoord2xOES + .size bluegl_glRasterPos3xvOES, .-bluegl_glRasterPos3xvOES .align 2 - .global bluegl_glCallCommandListNV - .type bluegl_glCallCommandListNV, %function -bluegl_glCallCommandListNV: - adrp x16, :got:__blue_glCore_glCallCommandListNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCallCommandListNV] + .global bluegl_glRasterPos4xOES + .type bluegl_glRasterPos4xOES, %function +bluegl_glRasterPos4xOES: + adrp x16, :got:__blue_glCore_glRasterPos4xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glRasterPos4xOES] ldr x16, [x16] br x16 - .size bluegl_glCallCommandListNV, .-bluegl_glCallCommandListNV + .size bluegl_glRasterPos4xOES, .-bluegl_glRasterPos4xOES .align 2 - .global bluegl_glVariantdvEXT - .type bluegl_glVariantdvEXT, %function -bluegl_glVariantdvEXT: - adrp x16, :got:__blue_glCore_glVariantdvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantdvEXT] + .global bluegl_glRasterPos4xvOES + .type bluegl_glRasterPos4xvOES, %function +bluegl_glRasterPos4xvOES: + adrp x16, :got:__blue_glCore_glRasterPos4xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glRasterPos4xvOES] ldr x16, [x16] br x16 - .size bluegl_glVariantdvEXT, .-bluegl_glVariantdvEXT + .size bluegl_glRasterPos4xvOES, .-bluegl_glRasterPos4xvOES .align 2 - .global bluegl_glBlendColorxOES - .type bluegl_glBlendColorxOES, %function -bluegl_glBlendColorxOES: - adrp x16, :got:__blue_glCore_glBlendColorxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendColorxOES] + .global bluegl_glRectxOES + .type bluegl_glRectxOES, %function +bluegl_glRectxOES: + adrp x16, :got:__blue_glCore_glRectxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glRectxOES] ldr x16, [x16] br x16 - .size bluegl_glBlendColorxOES, .-bluegl_glBlendColorxOES + .size bluegl_glRectxOES, .-bluegl_glRectxOES .align 2 - .global bluegl_glFramebufferTexture2DEXT - .type bluegl_glFramebufferTexture2DEXT, %function -bluegl_glFramebufferTexture2DEXT: - adrp x16, :got:__blue_glCore_glFramebufferTexture2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTexture2DEXT] + .global bluegl_glRectxvOES + .type bluegl_glRectxvOES, %function +bluegl_glRectxvOES: + adrp x16, :got:__blue_glCore_glRectxvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glRectxvOES] ldr x16, [x16] br x16 - .size bluegl_glFramebufferTexture2DEXT, .-bluegl_glFramebufferTexture2DEXT + .size bluegl_glRectxvOES, .-bluegl_glRectxvOES .align 2 - .global bluegl_glGetString - .type bluegl_glGetString, %function -bluegl_glGetString: - adrp x16, :got:__blue_glCore_glGetString - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetString] + .global bluegl_glTexCoord1xOES + .type bluegl_glTexCoord1xOES, %function +bluegl_glTexCoord1xOES: + adrp x16, :got:__blue_glCore_glTexCoord1xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord1xOES] ldr x16, [x16] br x16 - .size bluegl_glGetString, .-bluegl_glGetString + .size bluegl_glTexCoord1xOES, .-bluegl_glTexCoord1xOES .align 2 - .global bluegl_glVertexStream3iATI - .type bluegl_glVertexStream3iATI, %function -bluegl_glVertexStream3iATI: - adrp x16, :got:__blue_glCore_glVertexStream3iATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream3iATI] + .global bluegl_glTexCoord1xvOES + .type bluegl_glTexCoord1xvOES, %function +bluegl_glTexCoord1xvOES: + adrp x16, :got:__blue_glCore_glTexCoord1xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord1xvOES] ldr x16, [x16] br x16 - .size bluegl_glVertexStream3iATI, .-bluegl_glVertexStream3iATI + .size bluegl_glTexCoord1xvOES, .-bluegl_glTexCoord1xvOES .align 2 - .global bluegl_glHintPGI - .type bluegl_glHintPGI, %function -bluegl_glHintPGI: - adrp x16, :got:__blue_glCore_glHintPGI - ldr x16, [x16, #:got_lo12:__blue_glCore_glHintPGI] + .global bluegl_glTexCoord2xOES + .type bluegl_glTexCoord2xOES, %function +bluegl_glTexCoord2xOES: + adrp x16, :got:__blue_glCore_glTexCoord2xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2xOES] ldr x16, [x16] br x16 - .size bluegl_glHintPGI, .-bluegl_glHintPGI + .size bluegl_glTexCoord2xOES, .-bluegl_glTexCoord2xOES .align 2 - .global bluegl_glGenPerfMonitorsAMD - .type bluegl_glGenPerfMonitorsAMD, %function -bluegl_glGenPerfMonitorsAMD: - adrp x16, :got:__blue_glCore_glGenPerfMonitorsAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenPerfMonitorsAMD] + .global bluegl_glTexCoord2xvOES + .type bluegl_glTexCoord2xvOES, %function +bluegl_glTexCoord2xvOES: + adrp x16, :got:__blue_glCore_glTexCoord2xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2xvOES] ldr x16, [x16] br x16 - .size bluegl_glGenPerfMonitorsAMD, .-bluegl_glGenPerfMonitorsAMD + .size bluegl_glTexCoord2xvOES, .-bluegl_glTexCoord2xvOES .align 2 - .global bluegl_glTextureSubImage3DEXT - .type bluegl_glTextureSubImage3DEXT, %function -bluegl_glTextureSubImage3DEXT: - adrp x16, :got:__blue_glCore_glTextureSubImage3DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureSubImage3DEXT] + .global bluegl_glTexCoord3xOES + .type bluegl_glTexCoord3xOES, %function +bluegl_glTexCoord3xOES: + adrp x16, :got:__blue_glCore_glTexCoord3xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord3xOES] ldr x16, [x16] br x16 - .size bluegl_glTextureSubImage3DEXT, .-bluegl_glTextureSubImage3DEXT + .size bluegl_glTexCoord3xOES, .-bluegl_glTexCoord3xOES .align 2 - .global bluegl_glVertexAttrib4usvARB - .type bluegl_glVertexAttrib4usvARB, %function -bluegl_glVertexAttrib4usvARB: - adrp x16, :got:__blue_glCore_glVertexAttrib4usvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4usvARB] + .global bluegl_glTexCoord3xvOES + .type bluegl_glTexCoord3xvOES, %function +bluegl_glTexCoord3xvOES: + adrp x16, :got:__blue_glCore_glTexCoord3xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord3xvOES] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4usvARB, .-bluegl_glVertexAttrib4usvARB + .size bluegl_glTexCoord3xvOES, .-bluegl_glTexCoord3xvOES .align 2 - .global bluegl_glVertexArrayBindVertexBufferEXT - .type bluegl_glVertexArrayBindVertexBufferEXT, %function -bluegl_glVertexArrayBindVertexBufferEXT: - adrp x16, :got:__blue_glCore_glVertexArrayBindVertexBufferEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayBindVertexBufferEXT] + .global bluegl_glTexCoord4xOES + .type bluegl_glTexCoord4xOES, %function +bluegl_glTexCoord4xOES: + adrp x16, :got:__blue_glCore_glTexCoord4xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord4xOES] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayBindVertexBufferEXT, .-bluegl_glVertexArrayBindVertexBufferEXT + .size bluegl_glTexCoord4xOES, .-bluegl_glTexCoord4xOES .align 2 - .global bluegl_glMinSampleShading - .type bluegl_glMinSampleShading, %function -bluegl_glMinSampleShading: - adrp x16, :got:__blue_glCore_glMinSampleShading - ldr x16, [x16, #:got_lo12:__blue_glCore_glMinSampleShading] + .global bluegl_glTexCoord4xvOES + .type bluegl_glTexCoord4xvOES, %function +bluegl_glTexCoord4xvOES: + adrp x16, :got:__blue_glCore_glTexCoord4xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord4xvOES] ldr x16, [x16] br x16 - .size bluegl_glMinSampleShading, .-bluegl_glMinSampleShading + .size bluegl_glTexCoord4xvOES, .-bluegl_glTexCoord4xvOES .align 2 - .global bluegl_glIsPathNV - .type bluegl_glIsPathNV, %function -bluegl_glIsPathNV: - adrp x16, :got:__blue_glCore_glIsPathNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsPathNV] + .global bluegl_glTexGenxOES + .type bluegl_glTexGenxOES, %function +bluegl_glTexGenxOES: + adrp x16, :got:__blue_glCore_glTexGenxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexGenxOES] ldr x16, [x16] br x16 - .size bluegl_glIsPathNV, .-bluegl_glIsPathNV + .size bluegl_glTexGenxOES, .-bluegl_glTexGenxOES .align 2 - .global bluegl_glGetPathTexGenivNV - .type bluegl_glGetPathTexGenivNV, %function -bluegl_glGetPathTexGenivNV: - adrp x16, :got:__blue_glCore_glGetPathTexGenivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathTexGenivNV] + .global bluegl_glTexGenxvOES + .type bluegl_glTexGenxvOES, %function +bluegl_glTexGenxvOES: + adrp x16, :got:__blue_glCore_glTexGenxvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexGenxvOES] ldr x16, [x16] br x16 - .size bluegl_glGetPathTexGenivNV, .-bluegl_glGetPathTexGenivNV + .size bluegl_glTexGenxvOES, .-bluegl_glTexGenxvOES .align 2 - .global bluegl_glProgramUniform3fv - .type bluegl_glProgramUniform3fv, %function -bluegl_glProgramUniform3fv: - adrp x16, :got:__blue_glCore_glProgramUniform3fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3fv] + .global bluegl_glVertex2xOES + .type bluegl_glVertex2xOES, %function +bluegl_glVertex2xOES: + adrp x16, :got:__blue_glCore_glVertex2xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex2xOES] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3fv, .-bluegl_glProgramUniform3fv + .size bluegl_glVertex2xOES, .-bluegl_glVertex2xOES .align 2 - .global bluegl_glVertexAttrib3sv - .type bluegl_glVertexAttrib3sv, %function -bluegl_glVertexAttrib3sv: - adrp x16, :got:__blue_glCore_glVertexAttrib3sv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3sv] + .global bluegl_glVertex2xvOES + .type bluegl_glVertex2xvOES, %function +bluegl_glVertex2xvOES: + adrp x16, :got:__blue_glCore_glVertex2xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex2xvOES] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3sv, .-bluegl_glVertexAttrib3sv + .size bluegl_glVertex2xvOES, .-bluegl_glVertex2xvOES .align 2 - .global bluegl_glGetUniformuiv - .type bluegl_glGetUniformuiv, %function -bluegl_glGetUniformuiv: - adrp x16, :got:__blue_glCore_glGetUniformuiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformuiv] + .global bluegl_glVertex3xOES + .type bluegl_glVertex3xOES, %function +bluegl_glVertex3xOES: + adrp x16, :got:__blue_glCore_glVertex3xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex3xOES] ldr x16, [x16] br x16 - .size bluegl_glGetUniformuiv, .-bluegl_glGetUniformuiv + .size bluegl_glVertex3xOES, .-bluegl_glVertex3xOES .align 2 - .global bluegl_glGetPixelTransformParameterfvEXT - .type bluegl_glGetPixelTransformParameterfvEXT, %function -bluegl_glGetPixelTransformParameterfvEXT: - adrp x16, :got:__blue_glCore_glGetPixelTransformParameterfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPixelTransformParameterfvEXT] + .global bluegl_glVertex3xvOES + .type bluegl_glVertex3xvOES, %function +bluegl_glVertex3xvOES: + adrp x16, :got:__blue_glCore_glVertex3xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex3xvOES] ldr x16, [x16] br x16 - .size bluegl_glGetPixelTransformParameterfvEXT, .-bluegl_glGetPixelTransformParameterfvEXT + .size bluegl_glVertex3xvOES, .-bluegl_glVertex3xvOES .align 2 - .global bluegl_glMultiTexCoord3dv - .type bluegl_glMultiTexCoord3dv, %function -bluegl_glMultiTexCoord3dv: - adrp x16, :got:__blue_glCore_glMultiTexCoord3dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3dv] + .global bluegl_glVertex4xOES + .type bluegl_glVertex4xOES, %function +bluegl_glVertex4xOES: + adrp x16, :got:__blue_glCore_glVertex4xOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex4xOES] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3dv, .-bluegl_glMultiTexCoord3dv + .size bluegl_glVertex4xOES, .-bluegl_glVertex4xOES .align 2 - .global bluegl_glVertexAttrib3fvARB - .type bluegl_glVertexAttrib3fvARB, %function -bluegl_glVertexAttrib3fvARB: - adrp x16, :got:__blue_glCore_glVertexAttrib3fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3fvARB] + .global bluegl_glVertex4xvOES + .type bluegl_glVertex4xvOES, %function +bluegl_glVertex4xvOES: + adrp x16, :got:__blue_glCore_glVertex4xvOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex4xvOES] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3fvARB, .-bluegl_glVertexAttrib3fvARB + .size bluegl_glVertex4xvOES, .-bluegl_glVertex4xvOES .align 2 - .global bluegl_glGetProgramResourceIndex - .type bluegl_glGetProgramResourceIndex, %function -bluegl_glGetProgramResourceIndex: - adrp x16, :got:__blue_glCore_glGetProgramResourceIndex - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramResourceIndex] + .global bluegl_glQueryMatrixxOES + .type bluegl_glQueryMatrixxOES, %function +bluegl_glQueryMatrixxOES: + adrp x16, :got:__blue_glCore_glQueryMatrixxOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glQueryMatrixxOES] ldr x16, [x16] br x16 - .size bluegl_glGetProgramResourceIndex, .-bluegl_glGetProgramResourceIndex + .size bluegl_glQueryMatrixxOES, .-bluegl_glQueryMatrixxOES .align 2 - .global bluegl_glGetMinmaxParameteriv - .type bluegl_glGetMinmaxParameteriv, %function -bluegl_glGetMinmaxParameteriv: - adrp x16, :got:__blue_glCore_glGetMinmaxParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMinmaxParameteriv] + .global bluegl_glClearDepthfOES + .type bluegl_glClearDepthfOES, %function +bluegl_glClearDepthfOES: + adrp x16, :got:__blue_glCore_glClearDepthfOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearDepthfOES] ldr x16, [x16] br x16 - .size bluegl_glGetMinmaxParameteriv, .-bluegl_glGetMinmaxParameteriv + .size bluegl_glClearDepthfOES, .-bluegl_glClearDepthfOES .align 2 - .global bluegl_glConvolutionParameterfEXT - .type bluegl_glConvolutionParameterfEXT, %function -bluegl_glConvolutionParameterfEXT: - adrp x16, :got:__blue_glCore_glConvolutionParameterfEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameterfEXT] + .global bluegl_glClipPlanefOES + .type bluegl_glClipPlanefOES, %function +bluegl_glClipPlanefOES: + adrp x16, :got:__blue_glCore_glClipPlanefOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glClipPlanefOES] ldr x16, [x16] br x16 - .size bluegl_glConvolutionParameterfEXT, .-bluegl_glConvolutionParameterfEXT + .size bluegl_glClipPlanefOES, .-bluegl_glClipPlanefOES .align 2 - .global bluegl_glProgramUniform4i64NV - .type bluegl_glProgramUniform4i64NV, %function -bluegl_glProgramUniform4i64NV: - adrp x16, :got:__blue_glCore_glProgramUniform4i64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4i64NV] + .global bluegl_glDepthRangefOES + .type bluegl_glDepthRangefOES, %function +bluegl_glDepthRangefOES: + adrp x16, :got:__blue_glCore_glDepthRangefOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthRangefOES] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4i64NV, .-bluegl_glProgramUniform4i64NV + .size bluegl_glDepthRangefOES, .-bluegl_glDepthRangefOES .align 2 - .global bluegl_glProgramUniformMatrix4fvEXT - .type bluegl_glProgramUniformMatrix4fvEXT, %function -bluegl_glProgramUniformMatrix4fvEXT: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix4fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4fvEXT] + .global bluegl_glFrustumfOES + .type bluegl_glFrustumfOES, %function +bluegl_glFrustumfOES: + adrp x16, :got:__blue_glCore_glFrustumfOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glFrustumfOES] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix4fvEXT, .-bluegl_glProgramUniformMatrix4fvEXT + .size bluegl_glFrustumfOES, .-bluegl_glFrustumfOES .align 2 - .global bluegl_glMultiTexCoordP4ui - .type bluegl_glMultiTexCoordP4ui, %function -bluegl_glMultiTexCoordP4ui: - adrp x16, :got:__blue_glCore_glMultiTexCoordP4ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoordP4ui] + .global bluegl_glGetClipPlanefOES + .type bluegl_glGetClipPlanefOES, %function +bluegl_glGetClipPlanefOES: + adrp x16, :got:__blue_glCore_glGetClipPlanefOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetClipPlanefOES] + ldr x16, [x16] + br x16 + .size bluegl_glGetClipPlanefOES, .-bluegl_glGetClipPlanefOES + + .align 2 + .global bluegl_glOrthofOES + .type bluegl_glOrthofOES, %function +bluegl_glOrthofOES: + adrp x16, :got:__blue_glCore_glOrthofOES + ldr x16, [x16, #:got_lo12:__blue_glCore_glOrthofOES] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoordP4ui, .-bluegl_glMultiTexCoordP4ui + .size bluegl_glOrthofOES, .-bluegl_glOrthofOES .align 2 - .global bluegl_glEnableVertexAttribAPPLE - .type bluegl_glEnableVertexAttribAPPLE, %function -bluegl_glEnableVertexAttribAPPLE: - adrp x16, :got:__blue_glCore_glEnableVertexAttribAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableVertexAttribAPPLE] + .global bluegl_glTbufferMask3DFX + .type bluegl_glTbufferMask3DFX, %function +bluegl_glTbufferMask3DFX: + adrp x16, :got:__blue_glCore_glTbufferMask3DFX + ldr x16, [x16, #:got_lo12:__blue_glCore_glTbufferMask3DFX] ldr x16, [x16] br x16 - .size bluegl_glEnableVertexAttribAPPLE, .-bluegl_glEnableVertexAttribAPPLE + .size bluegl_glTbufferMask3DFX, .-bluegl_glTbufferMask3DFX .align 2 - .global bluegl_glTexCoordP3uiv - .type bluegl_glTexCoordP3uiv, %function -bluegl_glTexCoordP3uiv: - adrp x16, :got:__blue_glCore_glTexCoordP3uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordP3uiv] + .global bluegl_glDebugMessageEnableAMD + .type bluegl_glDebugMessageEnableAMD, %function +bluegl_glDebugMessageEnableAMD: + adrp x16, :got:__blue_glCore_glDebugMessageEnableAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glDebugMessageEnableAMD] ldr x16, [x16] br x16 - .size bluegl_glTexCoordP3uiv, .-bluegl_glTexCoordP3uiv + .size bluegl_glDebugMessageEnableAMD, .-bluegl_glDebugMessageEnableAMD .align 2 - .global bluegl_glCoverageModulationNV - .type bluegl_glCoverageModulationNV, %function -bluegl_glCoverageModulationNV: - adrp x16, :got:__blue_glCore_glCoverageModulationNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCoverageModulationNV] + .global bluegl_glDebugMessageInsertAMD + .type bluegl_glDebugMessageInsertAMD, %function +bluegl_glDebugMessageInsertAMD: + adrp x16, :got:__blue_glCore_glDebugMessageInsertAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glDebugMessageInsertAMD] ldr x16, [x16] br x16 - .size bluegl_glCoverageModulationNV, .-bluegl_glCoverageModulationNV + .size bluegl_glDebugMessageInsertAMD, .-bluegl_glDebugMessageInsertAMD .align 2 - .global bluegl_glMultiTexCoord3ivARB - .type bluegl_glMultiTexCoord3ivARB, %function -bluegl_glMultiTexCoord3ivARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord3ivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3ivARB] + .global bluegl_glDebugMessageCallbackAMD + .type bluegl_glDebugMessageCallbackAMD, %function +bluegl_glDebugMessageCallbackAMD: + adrp x16, :got:__blue_glCore_glDebugMessageCallbackAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glDebugMessageCallbackAMD] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3ivARB, .-bluegl_glMultiTexCoord3ivARB + .size bluegl_glDebugMessageCallbackAMD, .-bluegl_glDebugMessageCallbackAMD .align 2 - .global bluegl_glListParameterfvSGIX - .type bluegl_glListParameterfvSGIX, %function -bluegl_glListParameterfvSGIX: - adrp x16, :got:__blue_glCore_glListParameterfvSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glListParameterfvSGIX] + .global bluegl_glGetDebugMessageLogAMD + .type bluegl_glGetDebugMessageLogAMD, %function +bluegl_glGetDebugMessageLogAMD: + adrp x16, :got:__blue_glCore_glGetDebugMessageLogAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetDebugMessageLogAMD] ldr x16, [x16] br x16 - .size bluegl_glListParameterfvSGIX, .-bluegl_glListParameterfvSGIX + .size bluegl_glGetDebugMessageLogAMD, .-bluegl_glGetDebugMessageLogAMD .align 2 - .global bluegl_glNormal3fVertex3fvSUN - .type bluegl_glNormal3fVertex3fvSUN, %function -bluegl_glNormal3fVertex3fvSUN: - adrp x16, :got:__blue_glCore_glNormal3fVertex3fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormal3fVertex3fvSUN] + .global bluegl_glBlendFuncIndexedAMD + .type bluegl_glBlendFuncIndexedAMD, %function +bluegl_glBlendFuncIndexedAMD: + adrp x16, :got:__blue_glCore_glBlendFuncIndexedAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFuncIndexedAMD] ldr x16, [x16] br x16 - .size bluegl_glNormal3fVertex3fvSUN, .-bluegl_glNormal3fVertex3fvSUN + .size bluegl_glBlendFuncIndexedAMD, .-bluegl_glBlendFuncIndexedAMD .align 2 - .global bluegl_glVertexAttrib4bv - .type bluegl_glVertexAttrib4bv, %function -bluegl_glVertexAttrib4bv: - adrp x16, :got:__blue_glCore_glVertexAttrib4bv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4bv] + .global bluegl_glBlendFuncSeparateIndexedAMD + .type bluegl_glBlendFuncSeparateIndexedAMD, %function +bluegl_glBlendFuncSeparateIndexedAMD: + adrp x16, :got:__blue_glCore_glBlendFuncSeparateIndexedAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFuncSeparateIndexedAMD] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4bv, .-bluegl_glVertexAttrib4bv + .size bluegl_glBlendFuncSeparateIndexedAMD, .-bluegl_glBlendFuncSeparateIndexedAMD .align 2 - .global bluegl_glTexParameterIiv - .type bluegl_glTexParameterIiv, %function -bluegl_glTexParameterIiv: - adrp x16, :got:__blue_glCore_glTexParameterIiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameterIiv] + .global bluegl_glBlendEquationIndexedAMD + .type bluegl_glBlendEquationIndexedAMD, %function +bluegl_glBlendEquationIndexedAMD: + adrp x16, :got:__blue_glCore_glBlendEquationIndexedAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquationIndexedAMD] ldr x16, [x16] br x16 - .size bluegl_glTexParameterIiv, .-bluegl_glTexParameterIiv + .size bluegl_glBlendEquationIndexedAMD, .-bluegl_glBlendEquationIndexedAMD .align 2 - .global bluegl_glNamedFramebufferParameteri - .type bluegl_glNamedFramebufferParameteri, %function -bluegl_glNamedFramebufferParameteri: - adrp x16, :got:__blue_glCore_glNamedFramebufferParameteri - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferParameteri] + .global bluegl_glBlendEquationSeparateIndexedAMD + .type bluegl_glBlendEquationSeparateIndexedAMD, %function +bluegl_glBlendEquationSeparateIndexedAMD: + adrp x16, :got:__blue_glCore_glBlendEquationSeparateIndexedAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquationSeparateIndexedAMD] ldr x16, [x16] br x16 - .size bluegl_glNamedFramebufferParameteri, .-bluegl_glNamedFramebufferParameteri + .size bluegl_glBlendEquationSeparateIndexedAMD, .-bluegl_glBlendEquationSeparateIndexedAMD .align 2 - .global bluegl_glGetFramebufferParameterivEXT - .type bluegl_glGetFramebufferParameterivEXT, %function -bluegl_glGetFramebufferParameterivEXT: - adrp x16, :got:__blue_glCore_glGetFramebufferParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFramebufferParameterivEXT] + .global bluegl_glUniform1i64NV + .type bluegl_glUniform1i64NV, %function +bluegl_glUniform1i64NV: + adrp x16, :got:__blue_glCore_glUniform1i64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1i64NV] ldr x16, [x16] br x16 - .size bluegl_glGetFramebufferParameterivEXT, .-bluegl_glGetFramebufferParameterivEXT + .size bluegl_glUniform1i64NV, .-bluegl_glUniform1i64NV .align 2 - .global bluegl_glReplacementCodeubSUN - .type bluegl_glReplacementCodeubSUN, %function -bluegl_glReplacementCodeubSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeubSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeubSUN] + .global bluegl_glUniform2i64NV + .type bluegl_glUniform2i64NV, %function +bluegl_glUniform2i64NV: + adrp x16, :got:__blue_glCore_glUniform2i64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2i64NV] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeubSUN, .-bluegl_glReplacementCodeubSUN + .size bluegl_glUniform2i64NV, .-bluegl_glUniform2i64NV .align 2 - .global bluegl_glTexCoord2bvOES - .type bluegl_glTexCoord2bvOES, %function -bluegl_glTexCoord2bvOES: - adrp x16, :got:__blue_glCore_glTexCoord2bvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2bvOES] + .global bluegl_glUniform3i64NV + .type bluegl_glUniform3i64NV, %function +bluegl_glUniform3i64NV: + adrp x16, :got:__blue_glCore_glUniform3i64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3i64NV] ldr x16, [x16] br x16 - .size bluegl_glTexCoord2bvOES, .-bluegl_glTexCoord2bvOES + .size bluegl_glUniform3i64NV, .-bluegl_glUniform3i64NV .align 2 - .global bluegl_glGetVideoui64vNV - .type bluegl_glGetVideoui64vNV, %function -bluegl_glGetVideoui64vNV: - adrp x16, :got:__blue_glCore_glGetVideoui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVideoui64vNV] + .global bluegl_glUniform4i64NV + .type bluegl_glUniform4i64NV, %function +bluegl_glUniform4i64NV: + adrp x16, :got:__blue_glCore_glUniform4i64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4i64NV] ldr x16, [x16] br x16 - .size bluegl_glGetVideoui64vNV, .-bluegl_glGetVideoui64vNV + .size bluegl_glUniform4i64NV, .-bluegl_glUniform4i64NV .align 2 - .global bluegl_glTexStorage2DMultisample - .type bluegl_glTexStorage2DMultisample, %function -bluegl_glTexStorage2DMultisample: - adrp x16, :got:__blue_glCore_glTexStorage2DMultisample - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexStorage2DMultisample] + .global bluegl_glUniform1i64vNV + .type bluegl_glUniform1i64vNV, %function +bluegl_glUniform1i64vNV: + adrp x16, :got:__blue_glCore_glUniform1i64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1i64vNV] ldr x16, [x16] br x16 - .size bluegl_glTexStorage2DMultisample, .-bluegl_glTexStorage2DMultisample + .size bluegl_glUniform1i64vNV, .-bluegl_glUniform1i64vNV .align 2 - .global bluegl_glColorTableParameteriv - .type bluegl_glColorTableParameteriv, %function -bluegl_glColorTableParameteriv: - adrp x16, :got:__blue_glCore_glColorTableParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorTableParameteriv] + .global bluegl_glUniform2i64vNV + .type bluegl_glUniform2i64vNV, %function +bluegl_glUniform2i64vNV: + adrp x16, :got:__blue_glCore_glUniform2i64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2i64vNV] ldr x16, [x16] br x16 - .size bluegl_glColorTableParameteriv, .-bluegl_glColorTableParameteriv + .size bluegl_glUniform2i64vNV, .-bluegl_glUniform2i64vNV .align 2 - .global bluegl_glConvolutionFilter2DEXT - .type bluegl_glConvolutionFilter2DEXT, %function -bluegl_glConvolutionFilter2DEXT: - adrp x16, :got:__blue_glCore_glConvolutionFilter2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionFilter2DEXT] + .global bluegl_glUniform3i64vNV + .type bluegl_glUniform3i64vNV, %function +bluegl_glUniform3i64vNV: + adrp x16, :got:__blue_glCore_glUniform3i64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3i64vNV] ldr x16, [x16] br x16 - .size bluegl_glConvolutionFilter2DEXT, .-bluegl_glConvolutionFilter2DEXT + .size bluegl_glUniform3i64vNV, .-bluegl_glUniform3i64vNV .align 2 - .global bluegl_glSampleMaskEXT - .type bluegl_glSampleMaskEXT, %function -bluegl_glSampleMaskEXT: - adrp x16, :got:__blue_glCore_glSampleMaskEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSampleMaskEXT] + .global bluegl_glUniform4i64vNV + .type bluegl_glUniform4i64vNV, %function +bluegl_glUniform4i64vNV: + adrp x16, :got:__blue_glCore_glUniform4i64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4i64vNV] ldr x16, [x16] br x16 - .size bluegl_glSampleMaskEXT, .-bluegl_glSampleMaskEXT + .size bluegl_glUniform4i64vNV, .-bluegl_glUniform4i64vNV .align 2 - .global bluegl_glGlobalAlphaFactorusSUN - .type bluegl_glGlobalAlphaFactorusSUN, %function -bluegl_glGlobalAlphaFactorusSUN: - adrp x16, :got:__blue_glCore_glGlobalAlphaFactorusSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glGlobalAlphaFactorusSUN] + .global bluegl_glUniform1ui64NV + .type bluegl_glUniform1ui64NV, %function +bluegl_glUniform1ui64NV: + adrp x16, :got:__blue_glCore_glUniform1ui64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1ui64NV] ldr x16, [x16] br x16 - .size bluegl_glGlobalAlphaFactorusSUN, .-bluegl_glGlobalAlphaFactorusSUN + .size bluegl_glUniform1ui64NV, .-bluegl_glUniform1ui64NV .align 2 - .global bluegl_glBindRenderbuffer - .type bluegl_glBindRenderbuffer, %function -bluegl_glBindRenderbuffer: - adrp x16, :got:__blue_glCore_glBindRenderbuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindRenderbuffer] + .global bluegl_glUniform2ui64NV + .type bluegl_glUniform2ui64NV, %function +bluegl_glUniform2ui64NV: + adrp x16, :got:__blue_glCore_glUniform2ui64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2ui64NV] ldr x16, [x16] br x16 - .size bluegl_glBindRenderbuffer, .-bluegl_glBindRenderbuffer + .size bluegl_glUniform2ui64NV, .-bluegl_glUniform2ui64NV .align 2 - .global bluegl_glVertexAttribI1i - .type bluegl_glVertexAttribI1i, %function -bluegl_glVertexAttribI1i: - adrp x16, :got:__blue_glCore_glVertexAttribI1i - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI1i] + .global bluegl_glUniform3ui64NV + .type bluegl_glUniform3ui64NV, %function +bluegl_glUniform3ui64NV: + adrp x16, :got:__blue_glCore_glUniform3ui64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3ui64NV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI1i, .-bluegl_glVertexAttribI1i + .size bluegl_glUniform3ui64NV, .-bluegl_glUniform3ui64NV .align 2 - .global bluegl_glProgramLocalParameterI4uiNV - .type bluegl_glProgramLocalParameterI4uiNV, %function -bluegl_glProgramLocalParameterI4uiNV: - adrp x16, :got:__blue_glCore_glProgramLocalParameterI4uiNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParameterI4uiNV] + .global bluegl_glUniform4ui64NV + .type bluegl_glUniform4ui64NV, %function +bluegl_glUniform4ui64NV: + adrp x16, :got:__blue_glCore_glUniform4ui64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4ui64NV] ldr x16, [x16] br x16 - .size bluegl_glProgramLocalParameterI4uiNV, .-bluegl_glProgramLocalParameterI4uiNV + .size bluegl_glUniform4ui64NV, .-bluegl_glUniform4ui64NV .align 2 - .global bluegl_glProgramUniform4ui64ARB - .type bluegl_glProgramUniform4ui64ARB, %function -bluegl_glProgramUniform4ui64ARB: - adrp x16, :got:__blue_glCore_glProgramUniform4ui64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4ui64ARB] + .global bluegl_glUniform1ui64vNV + .type bluegl_glUniform1ui64vNV, %function +bluegl_glUniform1ui64vNV: + adrp x16, :got:__blue_glCore_glUniform1ui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1ui64vNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4ui64ARB, .-bluegl_glProgramUniform4ui64ARB + .size bluegl_glUniform1ui64vNV, .-bluegl_glUniform1ui64vNV .align 2 - .global bluegl_glObjectLabel - .type bluegl_glObjectLabel, %function -bluegl_glObjectLabel: - adrp x16, :got:__blue_glCore_glObjectLabel - ldr x16, [x16, #:got_lo12:__blue_glCore_glObjectLabel] + .global bluegl_glUniform2ui64vNV + .type bluegl_glUniform2ui64vNV, %function +bluegl_glUniform2ui64vNV: + adrp x16, :got:__blue_glCore_glUniform2ui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2ui64vNV] ldr x16, [x16] br x16 - .size bluegl_glObjectLabel, .-bluegl_glObjectLabel + .size bluegl_glUniform2ui64vNV, .-bluegl_glUniform2ui64vNV .align 2 - .global bluegl_glGetColorTableParameterivEXT - .type bluegl_glGetColorTableParameterivEXT, %function -bluegl_glGetColorTableParameterivEXT: - adrp x16, :got:__blue_glCore_glGetColorTableParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetColorTableParameterivEXT] + .global bluegl_glUniform3ui64vNV + .type bluegl_glUniform3ui64vNV, %function +bluegl_glUniform3ui64vNV: + adrp x16, :got:__blue_glCore_glUniform3ui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3ui64vNV] ldr x16, [x16] br x16 - .size bluegl_glGetColorTableParameterivEXT, .-bluegl_glGetColorTableParameterivEXT + .size bluegl_glUniform3ui64vNV, .-bluegl_glUniform3ui64vNV .align 2 - .global bluegl_glGetCombinerOutputParameterivNV - .type bluegl_glGetCombinerOutputParameterivNV, %function -bluegl_glGetCombinerOutputParameterivNV: - adrp x16, :got:__blue_glCore_glGetCombinerOutputParameterivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCombinerOutputParameterivNV] + .global bluegl_glUniform4ui64vNV + .type bluegl_glUniform4ui64vNV, %function +bluegl_glUniform4ui64vNV: + adrp x16, :got:__blue_glCore_glUniform4ui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4ui64vNV] ldr x16, [x16] br x16 - .size bluegl_glGetCombinerOutputParameterivNV, .-bluegl_glGetCombinerOutputParameterivNV + .size bluegl_glUniform4ui64vNV, .-bluegl_glUniform4ui64vNV .align 2 - .global bluegl_glDrawElementsInstancedARB - .type bluegl_glDrawElementsInstancedARB, %function -bluegl_glDrawElementsInstancedARB: - adrp x16, :got:__blue_glCore_glDrawElementsInstancedARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementsInstancedARB] + .global bluegl_glGetUniformi64vNV + .type bluegl_glGetUniformi64vNV, %function +bluegl_glGetUniformi64vNV: + adrp x16, :got:__blue_glCore_glGetUniformi64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformi64vNV] ldr x16, [x16] br x16 - .size bluegl_glDrawElementsInstancedARB, .-bluegl_glDrawElementsInstancedARB + .size bluegl_glGetUniformi64vNV, .-bluegl_glGetUniformi64vNV .align 2 - .global bluegl_glGetMinmaxParameterfv - .type bluegl_glGetMinmaxParameterfv, %function -bluegl_glGetMinmaxParameterfv: - adrp x16, :got:__blue_glCore_glGetMinmaxParameterfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMinmaxParameterfv] + .global bluegl_glGetUniformui64vNV + .type bluegl_glGetUniformui64vNV, %function +bluegl_glGetUniformui64vNV: + adrp x16, :got:__blue_glCore_glGetUniformui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformui64vNV] ldr x16, [x16] br x16 - .size bluegl_glGetMinmaxParameterfv, .-bluegl_glGetMinmaxParameterfv + .size bluegl_glGetUniformui64vNV, .-bluegl_glGetUniformui64vNV .align 2 - .global bluegl_glMatrixPushEXT - .type bluegl_glMatrixPushEXT, %function -bluegl_glMatrixPushEXT: - adrp x16, :got:__blue_glCore_glMatrixPushEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixPushEXT] + .global bluegl_glProgramUniform1i64NV + .type bluegl_glProgramUniform1i64NV, %function +bluegl_glProgramUniform1i64NV: + adrp x16, :got:__blue_glCore_glProgramUniform1i64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1i64NV] ldr x16, [x16] br x16 - .size bluegl_glMatrixPushEXT, .-bluegl_glMatrixPushEXT + .size bluegl_glProgramUniform1i64NV, .-bluegl_glProgramUniform1i64NV .align 2 - .global bluegl_glMultiTexParameterIivEXT - .type bluegl_glMultiTexParameterIivEXT, %function -bluegl_glMultiTexParameterIivEXT: - adrp x16, :got:__blue_glCore_glMultiTexParameterIivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexParameterIivEXT] + .global bluegl_glProgramUniform2i64NV + .type bluegl_glProgramUniform2i64NV, %function +bluegl_glProgramUniform2i64NV: + adrp x16, :got:__blue_glCore_glProgramUniform2i64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2i64NV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexParameterIivEXT, .-bluegl_glMultiTexParameterIivEXT + .size bluegl_glProgramUniform2i64NV, .-bluegl_glProgramUniform2i64NV .align 2 - .global bluegl_glGetPathColorGenfvNV - .type bluegl_glGetPathColorGenfvNV, %function -bluegl_glGetPathColorGenfvNV: - adrp x16, :got:__blue_glCore_glGetPathColorGenfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathColorGenfvNV] + .global bluegl_glProgramUniform3i64NV + .type bluegl_glProgramUniform3i64NV, %function +bluegl_glProgramUniform3i64NV: + adrp x16, :got:__blue_glCore_glProgramUniform3i64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3i64NV] ldr x16, [x16] br x16 - .size bluegl_glGetPathColorGenfvNV, .-bluegl_glGetPathColorGenfvNV + .size bluegl_glProgramUniform3i64NV, .-bluegl_glProgramUniform3i64NV .align 2 - .global bluegl_glBindProgramNV - .type bluegl_glBindProgramNV, %function -bluegl_glBindProgramNV: - adrp x16, :got:__blue_glCore_glBindProgramNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindProgramNV] + .global bluegl_glProgramUniform4i64NV + .type bluegl_glProgramUniform4i64NV, %function +bluegl_glProgramUniform4i64NV: + adrp x16, :got:__blue_glCore_glProgramUniform4i64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4i64NV] ldr x16, [x16] br x16 - .size bluegl_glBindProgramNV, .-bluegl_glBindProgramNV + .size bluegl_glProgramUniform4i64NV, .-bluegl_glProgramUniform4i64NV .align 2 - .global bluegl_glFramebufferReadBufferEXT - .type bluegl_glFramebufferReadBufferEXT, %function -bluegl_glFramebufferReadBufferEXT: - adrp x16, :got:__blue_glCore_glFramebufferReadBufferEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferReadBufferEXT] + .global bluegl_glProgramUniform1i64vNV + .type bluegl_glProgramUniform1i64vNV, %function +bluegl_glProgramUniform1i64vNV: + adrp x16, :got:__blue_glCore_glProgramUniform1i64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1i64vNV] ldr x16, [x16] br x16 - .size bluegl_glFramebufferReadBufferEXT, .-bluegl_glFramebufferReadBufferEXT + .size bluegl_glProgramUniform1i64vNV, .-bluegl_glProgramUniform1i64vNV .align 2 - .global bluegl_glFogCoordfEXT - .type bluegl_glFogCoordfEXT, %function -bluegl_glFogCoordfEXT: - adrp x16, :got:__blue_glCore_glFogCoordfEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordfEXT] + .global bluegl_glProgramUniform2i64vNV + .type bluegl_glProgramUniform2i64vNV, %function +bluegl_glProgramUniform2i64vNV: + adrp x16, :got:__blue_glCore_glProgramUniform2i64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2i64vNV] ldr x16, [x16] br x16 - .size bluegl_glFogCoordfEXT, .-bluegl_glFogCoordfEXT + .size bluegl_glProgramUniform2i64vNV, .-bluegl_glProgramUniform2i64vNV .align 2 - .global bluegl_glVertexArrayNormalOffsetEXT - .type bluegl_glVertexArrayNormalOffsetEXT, %function -bluegl_glVertexArrayNormalOffsetEXT: - adrp x16, :got:__blue_glCore_glVertexArrayNormalOffsetEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayNormalOffsetEXT] + .global bluegl_glProgramUniform3i64vNV + .type bluegl_glProgramUniform3i64vNV, %function +bluegl_glProgramUniform3i64vNV: + adrp x16, :got:__blue_glCore_glProgramUniform3i64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3i64vNV] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayNormalOffsetEXT, .-bluegl_glVertexArrayNormalOffsetEXT + .size bluegl_glProgramUniform3i64vNV, .-bluegl_glProgramUniform3i64vNV .align 2 - .global bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN - .type bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN, %function -bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN] + .global bluegl_glProgramUniform4i64vNV + .type bluegl_glProgramUniform4i64vNV, %function +bluegl_glProgramUniform4i64vNV: + adrp x16, :got:__blue_glCore_glProgramUniform4i64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4i64vNV] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN, .-bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN + .size bluegl_glProgramUniform4i64vNV, .-bluegl_glProgramUniform4i64vNV .align 2 - .global bluegl_glGetnUniformfv - .type bluegl_glGetnUniformfv, %function -bluegl_glGetnUniformfv: - adrp x16, :got:__blue_glCore_glGetnUniformfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformfv] + .global bluegl_glProgramUniform1ui64NV + .type bluegl_glProgramUniform1ui64NV, %function +bluegl_glProgramUniform1ui64NV: + adrp x16, :got:__blue_glCore_glProgramUniform1ui64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1ui64NV] ldr x16, [x16] br x16 - .size bluegl_glGetnUniformfv, .-bluegl_glGetnUniformfv + .size bluegl_glProgramUniform1ui64NV, .-bluegl_glProgramUniform1ui64NV .align 2 - .global bluegl_glPointParameterfEXT - .type bluegl_glPointParameterfEXT, %function -bluegl_glPointParameterfEXT: - adrp x16, :got:__blue_glCore_glPointParameterfEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterfEXT] + .global bluegl_glProgramUniform2ui64NV + .type bluegl_glProgramUniform2ui64NV, %function +bluegl_glProgramUniform2ui64NV: + adrp x16, :got:__blue_glCore_glProgramUniform2ui64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2ui64NV] ldr x16, [x16] br x16 - .size bluegl_glPointParameterfEXT, .-bluegl_glPointParameterfEXT + .size bluegl_glProgramUniform2ui64NV, .-bluegl_glProgramUniform2ui64NV .align 2 - .global bluegl_glEndVideoCaptureNV - .type bluegl_glEndVideoCaptureNV, %function -bluegl_glEndVideoCaptureNV: - adrp x16, :got:__blue_glCore_glEndVideoCaptureNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glEndVideoCaptureNV] + .global bluegl_glProgramUniform3ui64NV + .type bluegl_glProgramUniform3ui64NV, %function +bluegl_glProgramUniform3ui64NV: + adrp x16, :got:__blue_glCore_glProgramUniform3ui64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3ui64NV] ldr x16, [x16] br x16 - .size bluegl_glEndVideoCaptureNV, .-bluegl_glEndVideoCaptureNV + .size bluegl_glProgramUniform3ui64NV, .-bluegl_glProgramUniform3ui64NV .align 2 - .global bluegl_glVertexBlendARB - .type bluegl_glVertexBlendARB, %function -bluegl_glVertexBlendARB: - adrp x16, :got:__blue_glCore_glVertexBlendARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexBlendARB] + .global bluegl_glProgramUniform4ui64NV + .type bluegl_glProgramUniform4ui64NV, %function +bluegl_glProgramUniform4ui64NV: + adrp x16, :got:__blue_glCore_glProgramUniform4ui64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4ui64NV] ldr x16, [x16] br x16 - .size bluegl_glVertexBlendARB, .-bluegl_glVertexBlendARB + .size bluegl_glProgramUniform4ui64NV, .-bluegl_glProgramUniform4ui64NV .align 2 - .global bluegl_glVertexAttribL3i64vNV - .type bluegl_glVertexAttribL3i64vNV, %function -bluegl_glVertexAttribL3i64vNV: - adrp x16, :got:__blue_glCore_glVertexAttribL3i64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL3i64vNV] + .global bluegl_glProgramUniform1ui64vNV + .type bluegl_glProgramUniform1ui64vNV, %function +bluegl_glProgramUniform1ui64vNV: + adrp x16, :got:__blue_glCore_glProgramUniform1ui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1ui64vNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL3i64vNV, .-bluegl_glVertexAttribL3i64vNV + .size bluegl_glProgramUniform1ui64vNV, .-bluegl_glProgramUniform1ui64vNV .align 2 - .global bluegl_glSecondaryColor3fEXT - .type bluegl_glSecondaryColor3fEXT, %function -bluegl_glSecondaryColor3fEXT: - adrp x16, :got:__blue_glCore_glSecondaryColor3fEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3fEXT] + .global bluegl_glProgramUniform2ui64vNV + .type bluegl_glProgramUniform2ui64vNV, %function +bluegl_glProgramUniform2ui64vNV: + adrp x16, :got:__blue_glCore_glProgramUniform2ui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2ui64vNV] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3fEXT, .-bluegl_glSecondaryColor3fEXT + .size bluegl_glProgramUniform2ui64vNV, .-bluegl_glProgramUniform2ui64vNV .align 2 - .global bluegl_glStencilFuncSeparateATI - .type bluegl_glStencilFuncSeparateATI, %function -bluegl_glStencilFuncSeparateATI: - adrp x16, :got:__blue_glCore_glStencilFuncSeparateATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilFuncSeparateATI] + .global bluegl_glProgramUniform3ui64vNV + .type bluegl_glProgramUniform3ui64vNV, %function +bluegl_glProgramUniform3ui64vNV: + adrp x16, :got:__blue_glCore_glProgramUniform3ui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3ui64vNV] ldr x16, [x16] br x16 - .size bluegl_glStencilFuncSeparateATI, .-bluegl_glStencilFuncSeparateATI + .size bluegl_glProgramUniform3ui64vNV, .-bluegl_glProgramUniform3ui64vNV .align 2 - .global bluegl_glCompressedMultiTexSubImage2DEXT - .type bluegl_glCompressedMultiTexSubImage2DEXT, %function -bluegl_glCompressedMultiTexSubImage2DEXT: - adrp x16, :got:__blue_glCore_glCompressedMultiTexSubImage2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedMultiTexSubImage2DEXT] + .global bluegl_glProgramUniform4ui64vNV + .type bluegl_glProgramUniform4ui64vNV, %function +bluegl_glProgramUniform4ui64vNV: + adrp x16, :got:__blue_glCore_glProgramUniform4ui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4ui64vNV] ldr x16, [x16] br x16 - .size bluegl_glCompressedMultiTexSubImage2DEXT, .-bluegl_glCompressedMultiTexSubImage2DEXT + .size bluegl_glProgramUniform4ui64vNV, .-bluegl_glProgramUniform4ui64vNV .align 2 - .global bluegl_glTransformPathNV - .type bluegl_glTransformPathNV, %function -bluegl_glTransformPathNV: - adrp x16, :got:__blue_glCore_glTransformPathNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTransformPathNV] + .global bluegl_glVertexAttribParameteriAMD + .type bluegl_glVertexAttribParameteriAMD, %function +bluegl_glVertexAttribParameteriAMD: + adrp x16, :got:__blue_glCore_glVertexAttribParameteriAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribParameteriAMD] ldr x16, [x16] br x16 - .size bluegl_glTransformPathNV, .-bluegl_glTransformPathNV + .size bluegl_glVertexAttribParameteriAMD, .-bluegl_glVertexAttribParameteriAMD .align 2 - .global bluegl_glIsEnabledi - .type bluegl_glIsEnabledi, %function -bluegl_glIsEnabledi: - adrp x16, :got:__blue_glCore_glIsEnabledi - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsEnabledi] + .global bluegl_glMultiDrawArraysIndirectAMD + .type bluegl_glMultiDrawArraysIndirectAMD, %function +bluegl_glMultiDrawArraysIndirectAMD: + adrp x16, :got:__blue_glCore_glMultiDrawArraysIndirectAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawArraysIndirectAMD] ldr x16, [x16] br x16 - .size bluegl_glIsEnabledi, .-bluegl_glIsEnabledi + .size bluegl_glMultiDrawArraysIndirectAMD, .-bluegl_glMultiDrawArraysIndirectAMD .align 2 - .global bluegl_glExtractComponentEXT - .type bluegl_glExtractComponentEXT, %function -bluegl_glExtractComponentEXT: - adrp x16, :got:__blue_glCore_glExtractComponentEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glExtractComponentEXT] + .global bluegl_glMultiDrawElementsIndirectAMD + .type bluegl_glMultiDrawElementsIndirectAMD, %function +bluegl_glMultiDrawElementsIndirectAMD: + adrp x16, :got:__blue_glCore_glMultiDrawElementsIndirectAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawElementsIndirectAMD] ldr x16, [x16] br x16 - .size bluegl_glExtractComponentEXT, .-bluegl_glExtractComponentEXT + .size bluegl_glMultiDrawElementsIndirectAMD, .-bluegl_glMultiDrawElementsIndirectAMD .align 2 - .global bluegl_glGetFixedvOES - .type bluegl_glGetFixedvOES, %function -bluegl_glGetFixedvOES: - adrp x16, :got:__blue_glCore_glGetFixedvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFixedvOES] + .global bluegl_glGenNamesAMD + .type bluegl_glGenNamesAMD, %function +bluegl_glGenNamesAMD: + adrp x16, :got:__blue_glCore_glGenNamesAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenNamesAMD] ldr x16, [x16] br x16 - .size bluegl_glGetFixedvOES, .-bluegl_glGetFixedvOES + .size bluegl_glGenNamesAMD, .-bluegl_glGenNamesAMD .align 2 - .global bluegl_glDeleteProgramPipelines - .type bluegl_glDeleteProgramPipelines, %function -bluegl_glDeleteProgramPipelines: - adrp x16, :got:__blue_glCore_glDeleteProgramPipelines - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteProgramPipelines] + .global bluegl_glDeleteNamesAMD + .type bluegl_glDeleteNamesAMD, %function +bluegl_glDeleteNamesAMD: + adrp x16, :got:__blue_glCore_glDeleteNamesAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteNamesAMD] ldr x16, [x16] br x16 - .size bluegl_glDeleteProgramPipelines, .-bluegl_glDeleteProgramPipelines + .size bluegl_glDeleteNamesAMD, .-bluegl_glDeleteNamesAMD .align 2 - .global bluegl_glCopyMultiTexSubImage3DEXT - .type bluegl_glCopyMultiTexSubImage3DEXT, %function -bluegl_glCopyMultiTexSubImage3DEXT: - adrp x16, :got:__blue_glCore_glCopyMultiTexSubImage3DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyMultiTexSubImage3DEXT] + .global bluegl_glIsNameAMD + .type bluegl_glIsNameAMD, %function +bluegl_glIsNameAMD: + adrp x16, :got:__blue_glCore_glIsNameAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsNameAMD] ldr x16, [x16] br x16 - .size bluegl_glCopyMultiTexSubImage3DEXT, .-bluegl_glCopyMultiTexSubImage3DEXT + .size bluegl_glIsNameAMD, .-bluegl_glIsNameAMD .align 2 - .global bluegl_glCreateStatesNV - .type bluegl_glCreateStatesNV, %function -bluegl_glCreateStatesNV: - adrp x16, :got:__blue_glCore_glCreateStatesNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateStatesNV] + .global bluegl_glQueryObjectParameteruiAMD + .type bluegl_glQueryObjectParameteruiAMD, %function +bluegl_glQueryObjectParameteruiAMD: + adrp x16, :got:__blue_glCore_glQueryObjectParameteruiAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glQueryObjectParameteruiAMD] ldr x16, [x16] br x16 - .size bluegl_glCreateStatesNV, .-bluegl_glCreateStatesNV + .size bluegl_glQueryObjectParameteruiAMD, .-bluegl_glQueryObjectParameteruiAMD .align 2 - .global bluegl_glSwizzleEXT - .type bluegl_glSwizzleEXT, %function -bluegl_glSwizzleEXT: - adrp x16, :got:__blue_glCore_glSwizzleEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSwizzleEXT] + .global bluegl_glGetPerfMonitorGroupsAMD + .type bluegl_glGetPerfMonitorGroupsAMD, %function +bluegl_glGetPerfMonitorGroupsAMD: + adrp x16, :got:__blue_glCore_glGetPerfMonitorGroupsAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfMonitorGroupsAMD] ldr x16, [x16] br x16 - .size bluegl_glSwizzleEXT, .-bluegl_glSwizzleEXT + .size bluegl_glGetPerfMonitorGroupsAMD, .-bluegl_glGetPerfMonitorGroupsAMD .align 2 - .global bluegl_glVertexWeightfvEXT - .type bluegl_glVertexWeightfvEXT, %function -bluegl_glVertexWeightfvEXT: - adrp x16, :got:__blue_glCore_glVertexWeightfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexWeightfvEXT] + .global bluegl_glGetPerfMonitorCountersAMD + .type bluegl_glGetPerfMonitorCountersAMD, %function +bluegl_glGetPerfMonitorCountersAMD: + adrp x16, :got:__blue_glCore_glGetPerfMonitorCountersAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfMonitorCountersAMD] ldr x16, [x16] br x16 - .size bluegl_glVertexWeightfvEXT, .-bluegl_glVertexWeightfvEXT + .size bluegl_glGetPerfMonitorCountersAMD, .-bluegl_glGetPerfMonitorCountersAMD .align 2 - .global bluegl_glNormalPointerEXT - .type bluegl_glNormalPointerEXT, %function -bluegl_glNormalPointerEXT: - adrp x16, :got:__blue_glCore_glNormalPointerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalPointerEXT] + .global bluegl_glGetPerfMonitorGroupStringAMD + .type bluegl_glGetPerfMonitorGroupStringAMD, %function +bluegl_glGetPerfMonitorGroupStringAMD: + adrp x16, :got:__blue_glCore_glGetPerfMonitorGroupStringAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfMonitorGroupStringAMD] ldr x16, [x16] br x16 - .size bluegl_glNormalPointerEXT, .-bluegl_glNormalPointerEXT + .size bluegl_glGetPerfMonitorGroupStringAMD, .-bluegl_glGetPerfMonitorGroupStringAMD .align 2 - .global bluegl_glGetConvolutionFilterEXT - .type bluegl_glGetConvolutionFilterEXT, %function -bluegl_glGetConvolutionFilterEXT: - adrp x16, :got:__blue_glCore_glGetConvolutionFilterEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetConvolutionFilterEXT] + .global bluegl_glGetPerfMonitorCounterStringAMD + .type bluegl_glGetPerfMonitorCounterStringAMD, %function +bluegl_glGetPerfMonitorCounterStringAMD: + adrp x16, :got:__blue_glCore_glGetPerfMonitorCounterStringAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfMonitorCounterStringAMD] ldr x16, [x16] br x16 - .size bluegl_glGetConvolutionFilterEXT, .-bluegl_glGetConvolutionFilterEXT + .size bluegl_glGetPerfMonitorCounterStringAMD, .-bluegl_glGetPerfMonitorCounterStringAMD .align 2 - .global bluegl_glCurrentPaletteMatrixARB - .type bluegl_glCurrentPaletteMatrixARB, %function -bluegl_glCurrentPaletteMatrixARB: - adrp x16, :got:__blue_glCore_glCurrentPaletteMatrixARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glCurrentPaletteMatrixARB] + .global bluegl_glGetPerfMonitorCounterInfoAMD + .type bluegl_glGetPerfMonitorCounterInfoAMD, %function +bluegl_glGetPerfMonitorCounterInfoAMD: + adrp x16, :got:__blue_glCore_glGetPerfMonitorCounterInfoAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfMonitorCounterInfoAMD] ldr x16, [x16] br x16 - .size bluegl_glCurrentPaletteMatrixARB, .-bluegl_glCurrentPaletteMatrixARB + .size bluegl_glGetPerfMonitorCounterInfoAMD, .-bluegl_glGetPerfMonitorCounterInfoAMD .align 2 - .global bluegl_glVertexStream4sATI - .type bluegl_glVertexStream4sATI, %function -bluegl_glVertexStream4sATI: - adrp x16, :got:__blue_glCore_glVertexStream4sATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream4sATI] + .global bluegl_glGenPerfMonitorsAMD + .type bluegl_glGenPerfMonitorsAMD, %function +bluegl_glGenPerfMonitorsAMD: + adrp x16, :got:__blue_glCore_glGenPerfMonitorsAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenPerfMonitorsAMD] ldr x16, [x16] br x16 - .size bluegl_glVertexStream4sATI, .-bluegl_glVertexStream4sATI + .size bluegl_glGenPerfMonitorsAMD, .-bluegl_glGenPerfMonitorsAMD .align 2 - .global bluegl_glUniform3ui64ARB - .type bluegl_glUniform3ui64ARB, %function -bluegl_glUniform3ui64ARB: - adrp x16, :got:__blue_glCore_glUniform3ui64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3ui64ARB] + .global bluegl_glDeletePerfMonitorsAMD + .type bluegl_glDeletePerfMonitorsAMD, %function +bluegl_glDeletePerfMonitorsAMD: + adrp x16, :got:__blue_glCore_glDeletePerfMonitorsAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeletePerfMonitorsAMD] ldr x16, [x16] br x16 - .size bluegl_glUniform3ui64ARB, .-bluegl_glUniform3ui64ARB + .size bluegl_glDeletePerfMonitorsAMD, .-bluegl_glDeletePerfMonitorsAMD .align 2 - .global bluegl_glProgramUniform1uivEXT - .type bluegl_glProgramUniform1uivEXT, %function -bluegl_glProgramUniform1uivEXT: - adrp x16, :got:__blue_glCore_glProgramUniform1uivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1uivEXT] + .global bluegl_glSelectPerfMonitorCountersAMD + .type bluegl_glSelectPerfMonitorCountersAMD, %function +bluegl_glSelectPerfMonitorCountersAMD: + adrp x16, :got:__blue_glCore_glSelectPerfMonitorCountersAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glSelectPerfMonitorCountersAMD] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1uivEXT, .-bluegl_glProgramUniform1uivEXT + .size bluegl_glSelectPerfMonitorCountersAMD, .-bluegl_glSelectPerfMonitorCountersAMD .align 2 - .global bluegl_glVertexAttribs3dvNV - .type bluegl_glVertexAttribs3dvNV, %function -bluegl_glVertexAttribs3dvNV: - adrp x16, :got:__blue_glCore_glVertexAttribs3dvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs3dvNV] + .global bluegl_glBeginPerfMonitorAMD + .type bluegl_glBeginPerfMonitorAMD, %function +bluegl_glBeginPerfMonitorAMD: + adrp x16, :got:__blue_glCore_glBeginPerfMonitorAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginPerfMonitorAMD] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribs3dvNV, .-bluegl_glVertexAttribs3dvNV + .size bluegl_glBeginPerfMonitorAMD, .-bluegl_glBeginPerfMonitorAMD .align 2 - .global bluegl_glExecuteProgramNV - .type bluegl_glExecuteProgramNV, %function -bluegl_glExecuteProgramNV: - adrp x16, :got:__blue_glCore_glExecuteProgramNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glExecuteProgramNV] + .global bluegl_glEndPerfMonitorAMD + .type bluegl_glEndPerfMonitorAMD, %function +bluegl_glEndPerfMonitorAMD: + adrp x16, :got:__blue_glCore_glEndPerfMonitorAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glEndPerfMonitorAMD] ldr x16, [x16] br x16 - .size bluegl_glExecuteProgramNV, .-bluegl_glExecuteProgramNV + .size bluegl_glEndPerfMonitorAMD, .-bluegl_glEndPerfMonitorAMD .align 2 - .global bluegl_glFrameZoomSGIX - .type bluegl_glFrameZoomSGIX, %function -bluegl_glFrameZoomSGIX: - adrp x16, :got:__blue_glCore_glFrameZoomSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glFrameZoomSGIX] + .global bluegl_glGetPerfMonitorCounterDataAMD + .type bluegl_glGetPerfMonitorCounterDataAMD, %function +bluegl_glGetPerfMonitorCounterDataAMD: + adrp x16, :got:__blue_glCore_glGetPerfMonitorCounterDataAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfMonitorCounterDataAMD] ldr x16, [x16] br x16 - .size bluegl_glFrameZoomSGIX, .-bluegl_glFrameZoomSGIX + .size bluegl_glGetPerfMonitorCounterDataAMD, .-bluegl_glGetPerfMonitorCounterDataAMD .align 2 - .global bluegl_glFragmentMaterialfSGIX - .type bluegl_glFragmentMaterialfSGIX, %function -bluegl_glFragmentMaterialfSGIX: - adrp x16, :got:__blue_glCore_glFragmentMaterialfSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentMaterialfSGIX] + .global bluegl_glSetMultisamplefvAMD + .type bluegl_glSetMultisamplefvAMD, %function +bluegl_glSetMultisamplefvAMD: + adrp x16, :got:__blue_glCore_glSetMultisamplefvAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glSetMultisamplefvAMD] ldr x16, [x16] br x16 - .size bluegl_glFragmentMaterialfSGIX, .-bluegl_glFragmentMaterialfSGIX + .size bluegl_glSetMultisamplefvAMD, .-bluegl_glSetMultisamplefvAMD .align 2 - .global bluegl_glFramebufferTextureLayerEXT - .type bluegl_glFramebufferTextureLayerEXT, %function -bluegl_glFramebufferTextureLayerEXT: - adrp x16, :got:__blue_glCore_glFramebufferTextureLayerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTextureLayerEXT] + .global bluegl_glTexStorageSparseAMD + .type bluegl_glTexStorageSparseAMD, %function +bluegl_glTexStorageSparseAMD: + adrp x16, :got:__blue_glCore_glTexStorageSparseAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexStorageSparseAMD] + ldr x16, [x16] + br x16 + .size bluegl_glTexStorageSparseAMD, .-bluegl_glTexStorageSparseAMD + + .align 2 + .global bluegl_glTextureStorageSparseAMD + .type bluegl_glTextureStorageSparseAMD, %function +bluegl_glTextureStorageSparseAMD: + adrp x16, :got:__blue_glCore_glTextureStorageSparseAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorageSparseAMD] ldr x16, [x16] br x16 - .size bluegl_glFramebufferTextureLayerEXT, .-bluegl_glFramebufferTextureLayerEXT + .size bluegl_glTextureStorageSparseAMD, .-bluegl_glTextureStorageSparseAMD .align 2 - .global bluegl_glVertexStream1iATI - .type bluegl_glVertexStream1iATI, %function -bluegl_glVertexStream1iATI: - adrp x16, :got:__blue_glCore_glVertexStream1iATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream1iATI] + .global bluegl_glStencilOpValueAMD + .type bluegl_glStencilOpValueAMD, %function +bluegl_glStencilOpValueAMD: + adrp x16, :got:__blue_glCore_glStencilOpValueAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilOpValueAMD] ldr x16, [x16] br x16 - .size bluegl_glVertexStream1iATI, .-bluegl_glVertexStream1iATI + .size bluegl_glStencilOpValueAMD, .-bluegl_glStencilOpValueAMD .align 2 - .global bluegl_glVertexAttrib3s - .type bluegl_glVertexAttrib3s, %function -bluegl_glVertexAttrib3s: - adrp x16, :got:__blue_glCore_glVertexAttrib3s - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3s] + .global bluegl_glTessellationFactorAMD + .type bluegl_glTessellationFactorAMD, %function +bluegl_glTessellationFactorAMD: + adrp x16, :got:__blue_glCore_glTessellationFactorAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glTessellationFactorAMD] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3s, .-bluegl_glVertexAttrib3s + .size bluegl_glTessellationFactorAMD, .-bluegl_glTessellationFactorAMD .align 2 - .global bluegl_glFramebufferTextureMultiviewOVR - .type bluegl_glFramebufferTextureMultiviewOVR, %function -bluegl_glFramebufferTextureMultiviewOVR: - adrp x16, :got:__blue_glCore_glFramebufferTextureMultiviewOVR - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTextureMultiviewOVR] + .global bluegl_glTessellationModeAMD + .type bluegl_glTessellationModeAMD, %function +bluegl_glTessellationModeAMD: + adrp x16, :got:__blue_glCore_glTessellationModeAMD + ldr x16, [x16, #:got_lo12:__blue_glCore_glTessellationModeAMD] ldr x16, [x16] br x16 - .size bluegl_glFramebufferTextureMultiviewOVR, .-bluegl_glFramebufferTextureMultiviewOVR + .size bluegl_glTessellationModeAMD, .-bluegl_glTessellationModeAMD .align 2 .global bluegl_glElementPointerAPPLE @@ -13350,3054 +13169,3124 @@ bluegl_glElementPointerAPPLE: .size bluegl_glElementPointerAPPLE, .-bluegl_glElementPointerAPPLE .align 2 - .global bluegl_glWindowPos4ivMESA - .type bluegl_glWindowPos4ivMESA, %function -bluegl_glWindowPos4ivMESA: - adrp x16, :got:__blue_glCore_glWindowPos4ivMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos4ivMESA] + .global bluegl_glDrawElementArrayAPPLE + .type bluegl_glDrawElementArrayAPPLE, %function +bluegl_glDrawElementArrayAPPLE: + adrp x16, :got:__blue_glCore_glDrawElementArrayAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementArrayAPPLE] ldr x16, [x16] br x16 - .size bluegl_glWindowPos4ivMESA, .-bluegl_glWindowPos4ivMESA + .size bluegl_glDrawElementArrayAPPLE, .-bluegl_glDrawElementArrayAPPLE .align 2 - .global bluegl_glTexSubImage3D - .type bluegl_glTexSubImage3D, %function -bluegl_glTexSubImage3D: - adrp x16, :got:__blue_glCore_glTexSubImage3D - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexSubImage3D] + .global bluegl_glDrawRangeElementArrayAPPLE + .type bluegl_glDrawRangeElementArrayAPPLE, %function +bluegl_glDrawRangeElementArrayAPPLE: + adrp x16, :got:__blue_glCore_glDrawRangeElementArrayAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawRangeElementArrayAPPLE] ldr x16, [x16] br x16 - .size bluegl_glTexSubImage3D, .-bluegl_glTexSubImage3D + .size bluegl_glDrawRangeElementArrayAPPLE, .-bluegl_glDrawRangeElementArrayAPPLE .align 2 - .global bluegl_glGetFragmentMaterialfvSGIX - .type bluegl_glGetFragmentMaterialfvSGIX, %function -bluegl_glGetFragmentMaterialfvSGIX: - adrp x16, :got:__blue_glCore_glGetFragmentMaterialfvSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFragmentMaterialfvSGIX] + .global bluegl_glMultiDrawElementArrayAPPLE + .type bluegl_glMultiDrawElementArrayAPPLE, %function +bluegl_glMultiDrawElementArrayAPPLE: + adrp x16, :got:__blue_glCore_glMultiDrawElementArrayAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawElementArrayAPPLE] ldr x16, [x16] br x16 - .size bluegl_glGetFragmentMaterialfvSGIX, .-bluegl_glGetFragmentMaterialfvSGIX + .size bluegl_glMultiDrawElementArrayAPPLE, .-bluegl_glMultiDrawElementArrayAPPLE .align 2 - .global bluegl_glProgramUniform1dEXT - .type bluegl_glProgramUniform1dEXT, %function -bluegl_glProgramUniform1dEXT: - adrp x16, :got:__blue_glCore_glProgramUniform1dEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1dEXT] + .global bluegl_glMultiDrawRangeElementArrayAPPLE + .type bluegl_glMultiDrawRangeElementArrayAPPLE, %function +bluegl_glMultiDrawRangeElementArrayAPPLE: + adrp x16, :got:__blue_glCore_glMultiDrawRangeElementArrayAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawRangeElementArrayAPPLE] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1dEXT, .-bluegl_glProgramUniform1dEXT + .size bluegl_glMultiDrawRangeElementArrayAPPLE, .-bluegl_glMultiDrawRangeElementArrayAPPLE .align 2 - .global bluegl_glGetFragmentLightfvSGIX - .type bluegl_glGetFragmentLightfvSGIX, %function -bluegl_glGetFragmentLightfvSGIX: - adrp x16, :got:__blue_glCore_glGetFragmentLightfvSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFragmentLightfvSGIX] + .global bluegl_glGenFencesAPPLE + .type bluegl_glGenFencesAPPLE, %function +bluegl_glGenFencesAPPLE: + adrp x16, :got:__blue_glCore_glGenFencesAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenFencesAPPLE] ldr x16, [x16] br x16 - .size bluegl_glGetFragmentLightfvSGIX, .-bluegl_glGetFragmentLightfvSGIX + .size bluegl_glGenFencesAPPLE, .-bluegl_glGenFencesAPPLE .align 2 - .global bluegl_glTexCoord2bOES - .type bluegl_glTexCoord2bOES, %function -bluegl_glTexCoord2bOES: - adrp x16, :got:__blue_glCore_glTexCoord2bOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2bOES] + .global bluegl_glDeleteFencesAPPLE + .type bluegl_glDeleteFencesAPPLE, %function +bluegl_glDeleteFencesAPPLE: + adrp x16, :got:__blue_glCore_glDeleteFencesAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteFencesAPPLE] ldr x16, [x16] br x16 - .size bluegl_glTexCoord2bOES, .-bluegl_glTexCoord2bOES + .size bluegl_glDeleteFencesAPPLE, .-bluegl_glDeleteFencesAPPLE .align 2 - .global bluegl_glVertexAttrib3fv - .type bluegl_glVertexAttrib3fv, %function -bluegl_glVertexAttrib3fv: - adrp x16, :got:__blue_glCore_glVertexAttrib3fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3fv] + .global bluegl_glSetFenceAPPLE + .type bluegl_glSetFenceAPPLE, %function +bluegl_glSetFenceAPPLE: + adrp x16, :got:__blue_glCore_glSetFenceAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glSetFenceAPPLE] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3fv, .-bluegl_glVertexAttrib3fv + .size bluegl_glSetFenceAPPLE, .-bluegl_glSetFenceAPPLE .align 2 - .global bluegl_glMakeNamedBufferNonResidentNV - .type bluegl_glMakeNamedBufferNonResidentNV, %function -bluegl_glMakeNamedBufferNonResidentNV: - adrp x16, :got:__blue_glCore_glMakeNamedBufferNonResidentNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeNamedBufferNonResidentNV] + .global bluegl_glIsFenceAPPLE + .type bluegl_glIsFenceAPPLE, %function +bluegl_glIsFenceAPPLE: + adrp x16, :got:__blue_glCore_glIsFenceAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsFenceAPPLE] ldr x16, [x16] br x16 - .size bluegl_glMakeNamedBufferNonResidentNV, .-bluegl_glMakeNamedBufferNonResidentNV + .size bluegl_glIsFenceAPPLE, .-bluegl_glIsFenceAPPLE .align 2 - .global bluegl_glIsProgramARB - .type bluegl_glIsProgramARB, %function -bluegl_glIsProgramARB: - adrp x16, :got:__blue_glCore_glIsProgramARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsProgramARB] + .global bluegl_glTestFenceAPPLE + .type bluegl_glTestFenceAPPLE, %function +bluegl_glTestFenceAPPLE: + adrp x16, :got:__blue_glCore_glTestFenceAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glTestFenceAPPLE] ldr x16, [x16] br x16 - .size bluegl_glIsProgramARB, .-bluegl_glIsProgramARB + .size bluegl_glTestFenceAPPLE, .-bluegl_glTestFenceAPPLE .align 2 - .global bluegl_glScissorArrayv - .type bluegl_glScissorArrayv, %function -bluegl_glScissorArrayv: - adrp x16, :got:__blue_glCore_glScissorArrayv - ldr x16, [x16, #:got_lo12:__blue_glCore_glScissorArrayv] + .global bluegl_glFinishFenceAPPLE + .type bluegl_glFinishFenceAPPLE, %function +bluegl_glFinishFenceAPPLE: + adrp x16, :got:__blue_glCore_glFinishFenceAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glFinishFenceAPPLE] ldr x16, [x16] br x16 - .size bluegl_glScissorArrayv, .-bluegl_glScissorArrayv + .size bluegl_glFinishFenceAPPLE, .-bluegl_glFinishFenceAPPLE .align 2 - .global bluegl_glMultiDrawElementsIndirect - .type bluegl_glMultiDrawElementsIndirect, %function -bluegl_glMultiDrawElementsIndirect: - adrp x16, :got:__blue_glCore_glMultiDrawElementsIndirect - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawElementsIndirect] + .global bluegl_glTestObjectAPPLE + .type bluegl_glTestObjectAPPLE, %function +bluegl_glTestObjectAPPLE: + adrp x16, :got:__blue_glCore_glTestObjectAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glTestObjectAPPLE] ldr x16, [x16] br x16 - .size bluegl_glMultiDrawElementsIndirect, .-bluegl_glMultiDrawElementsIndirect + .size bluegl_glTestObjectAPPLE, .-bluegl_glTestObjectAPPLE .align 2 - .global bluegl_glGetMultiTexParameterfvEXT - .type bluegl_glGetMultiTexParameterfvEXT, %function -bluegl_glGetMultiTexParameterfvEXT: - adrp x16, :got:__blue_glCore_glGetMultiTexParameterfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexParameterfvEXT] + .global bluegl_glFinishObjectAPPLE + .type bluegl_glFinishObjectAPPLE, %function +bluegl_glFinishObjectAPPLE: + adrp x16, :got:__blue_glCore_glFinishObjectAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glFinishObjectAPPLE] ldr x16, [x16] br x16 - .size bluegl_glGetMultiTexParameterfvEXT, .-bluegl_glGetMultiTexParameterfvEXT + .size bluegl_glFinishObjectAPPLE, .-bluegl_glFinishObjectAPPLE .align 2 - .global bluegl_glWindowPos2iARB - .type bluegl_glWindowPos2iARB, %function -bluegl_glWindowPos2iARB: - adrp x16, :got:__blue_glCore_glWindowPos2iARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2iARB] + .global bluegl_glBufferParameteriAPPLE + .type bluegl_glBufferParameteriAPPLE, %function +bluegl_glBufferParameteriAPPLE: + adrp x16, :got:__blue_glCore_glBufferParameteriAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glBufferParameteriAPPLE] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2iARB, .-bluegl_glWindowPos2iARB + .size bluegl_glBufferParameteriAPPLE, .-bluegl_glBufferParameteriAPPLE .align 2 - .global bluegl_glGetProgramStringNV - .type bluegl_glGetProgramStringNV, %function -bluegl_glGetProgramStringNV: - adrp x16, :got:__blue_glCore_glGetProgramStringNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramStringNV] + .global bluegl_glFlushMappedBufferRangeAPPLE + .type bluegl_glFlushMappedBufferRangeAPPLE, %function +bluegl_glFlushMappedBufferRangeAPPLE: + adrp x16, :got:__blue_glCore_glFlushMappedBufferRangeAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glFlushMappedBufferRangeAPPLE] ldr x16, [x16] br x16 - .size bluegl_glGetProgramStringNV, .-bluegl_glGetProgramStringNV + .size bluegl_glFlushMappedBufferRangeAPPLE, .-bluegl_glFlushMappedBufferRangeAPPLE .align 2 - .global bluegl_glTranslatexOES - .type bluegl_glTranslatexOES, %function -bluegl_glTranslatexOES: - adrp x16, :got:__blue_glCore_glTranslatexOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTranslatexOES] + .global bluegl_glObjectPurgeableAPPLE + .type bluegl_glObjectPurgeableAPPLE, %function +bluegl_glObjectPurgeableAPPLE: + adrp x16, :got:__blue_glCore_glObjectPurgeableAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glObjectPurgeableAPPLE] ldr x16, [x16] br x16 - .size bluegl_glTranslatexOES, .-bluegl_glTranslatexOES + .size bluegl_glObjectPurgeableAPPLE, .-bluegl_glObjectPurgeableAPPLE .align 2 - .global bluegl_glMultiTexCoord4d - .type bluegl_glMultiTexCoord4d, %function -bluegl_glMultiTexCoord4d: - adrp x16, :got:__blue_glCore_glMultiTexCoord4d - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4d] + .global bluegl_glObjectUnpurgeableAPPLE + .type bluegl_glObjectUnpurgeableAPPLE, %function +bluegl_glObjectUnpurgeableAPPLE: + adrp x16, :got:__blue_glCore_glObjectUnpurgeableAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glObjectUnpurgeableAPPLE] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4d, .-bluegl_glMultiTexCoord4d + .size bluegl_glObjectUnpurgeableAPPLE, .-bluegl_glObjectUnpurgeableAPPLE .align 2 - .global bluegl_glColorTableParameterfvSGI - .type bluegl_glColorTableParameterfvSGI, %function -bluegl_glColorTableParameterfvSGI: - adrp x16, :got:__blue_glCore_glColorTableParameterfvSGI - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorTableParameterfvSGI] + .global bluegl_glGetObjectParameterivAPPLE + .type bluegl_glGetObjectParameterivAPPLE, %function +bluegl_glGetObjectParameterivAPPLE: + adrp x16, :got:__blue_glCore_glGetObjectParameterivAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetObjectParameterivAPPLE] + ldr x16, [x16] + br x16 + .size bluegl_glGetObjectParameterivAPPLE, .-bluegl_glGetObjectParameterivAPPLE + + .align 2 + .global bluegl_glTextureRangeAPPLE + .type bluegl_glTextureRangeAPPLE, %function +bluegl_glTextureRangeAPPLE: + adrp x16, :got:__blue_glCore_glTextureRangeAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureRangeAPPLE] ldr x16, [x16] br x16 - .size bluegl_glColorTableParameterfvSGI, .-bluegl_glColorTableParameterfvSGI + .size bluegl_glTextureRangeAPPLE, .-bluegl_glTextureRangeAPPLE .align 2 - .global bluegl_glTexCoord3bvOES - .type bluegl_glTexCoord3bvOES, %function -bluegl_glTexCoord3bvOES: - adrp x16, :got:__blue_glCore_glTexCoord3bvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord3bvOES] + .global bluegl_glGetTexParameterPointervAPPLE + .type bluegl_glGetTexParameterPointervAPPLE, %function +bluegl_glGetTexParameterPointervAPPLE: + adrp x16, :got:__blue_glCore_glGetTexParameterPointervAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexParameterPointervAPPLE] ldr x16, [x16] br x16 - .size bluegl_glTexCoord3bvOES, .-bluegl_glTexCoord3bvOES + .size bluegl_glGetTexParameterPointervAPPLE, .-bluegl_glGetTexParameterPointervAPPLE .align 2 - .global bluegl_glUniform2ui64vARB - .type bluegl_glUniform2ui64vARB, %function -bluegl_glUniform2ui64vARB: - adrp x16, :got:__blue_glCore_glUniform2ui64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2ui64vARB] + .global bluegl_glBindVertexArrayAPPLE + .type bluegl_glBindVertexArrayAPPLE, %function +bluegl_glBindVertexArrayAPPLE: + adrp x16, :got:__blue_glCore_glBindVertexArrayAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindVertexArrayAPPLE] ldr x16, [x16] br x16 - .size bluegl_glUniform2ui64vARB, .-bluegl_glUniform2ui64vARB + .size bluegl_glBindVertexArrayAPPLE, .-bluegl_glBindVertexArrayAPPLE .align 2 - .global bluegl_glMatrixIndexusvARB - .type bluegl_glMatrixIndexusvARB, %function -bluegl_glMatrixIndexusvARB: - adrp x16, :got:__blue_glCore_glMatrixIndexusvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixIndexusvARB] + .global bluegl_glDeleteVertexArraysAPPLE + .type bluegl_glDeleteVertexArraysAPPLE, %function +bluegl_glDeleteVertexArraysAPPLE: + adrp x16, :got:__blue_glCore_glDeleteVertexArraysAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteVertexArraysAPPLE] ldr x16, [x16] br x16 - .size bluegl_glMatrixIndexusvARB, .-bluegl_glMatrixIndexusvARB + .size bluegl_glDeleteVertexArraysAPPLE, .-bluegl_glDeleteVertexArraysAPPLE .align 2 - .global bluegl_glGetMultiTexGenfvEXT - .type bluegl_glGetMultiTexGenfvEXT, %function -bluegl_glGetMultiTexGenfvEXT: - adrp x16, :got:__blue_glCore_glGetMultiTexGenfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexGenfvEXT] + .global bluegl_glGenVertexArraysAPPLE + .type bluegl_glGenVertexArraysAPPLE, %function +bluegl_glGenVertexArraysAPPLE: + adrp x16, :got:__blue_glCore_glGenVertexArraysAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenVertexArraysAPPLE] ldr x16, [x16] br x16 - .size bluegl_glGetMultiTexGenfvEXT, .-bluegl_glGetMultiTexGenfvEXT + .size bluegl_glGenVertexArraysAPPLE, .-bluegl_glGenVertexArraysAPPLE .align 2 - .global bluegl_glGenerateTextureMipmapEXT - .type bluegl_glGenerateTextureMipmapEXT, %function -bluegl_glGenerateTextureMipmapEXT: - adrp x16, :got:__blue_glCore_glGenerateTextureMipmapEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenerateTextureMipmapEXT] + .global bluegl_glIsVertexArrayAPPLE + .type bluegl_glIsVertexArrayAPPLE, %function +bluegl_glIsVertexArrayAPPLE: + adrp x16, :got:__blue_glCore_glIsVertexArrayAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsVertexArrayAPPLE] ldr x16, [x16] br x16 - .size bluegl_glGenerateTextureMipmapEXT, .-bluegl_glGenerateTextureMipmapEXT + .size bluegl_glIsVertexArrayAPPLE, .-bluegl_glIsVertexArrayAPPLE .align 2 - .global bluegl_glGetMapParameterivNV - .type bluegl_glGetMapParameterivNV, %function -bluegl_glGetMapParameterivNV: - adrp x16, :got:__blue_glCore_glGetMapParameterivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMapParameterivNV] + .global bluegl_glVertexArrayRangeAPPLE + .type bluegl_glVertexArrayRangeAPPLE, %function +bluegl_glVertexArrayRangeAPPLE: + adrp x16, :got:__blue_glCore_glVertexArrayRangeAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayRangeAPPLE] ldr x16, [x16] br x16 - .size bluegl_glGetMapParameterivNV, .-bluegl_glGetMapParameterivNV + .size bluegl_glVertexArrayRangeAPPLE, .-bluegl_glVertexArrayRangeAPPLE .align 2 - .global bluegl_glGetConvolutionParameterxvOES - .type bluegl_glGetConvolutionParameterxvOES, %function -bluegl_glGetConvolutionParameterxvOES: - adrp x16, :got:__blue_glCore_glGetConvolutionParameterxvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetConvolutionParameterxvOES] + .global bluegl_glFlushVertexArrayRangeAPPLE + .type bluegl_glFlushVertexArrayRangeAPPLE, %function +bluegl_glFlushVertexArrayRangeAPPLE: + adrp x16, :got:__blue_glCore_glFlushVertexArrayRangeAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glFlushVertexArrayRangeAPPLE] ldr x16, [x16] br x16 - .size bluegl_glGetConvolutionParameterxvOES, .-bluegl_glGetConvolutionParameterxvOES + .size bluegl_glFlushVertexArrayRangeAPPLE, .-bluegl_glFlushVertexArrayRangeAPPLE .align 2 - .global bluegl_glVertexAttrib4fvNV - .type bluegl_glVertexAttrib4fvNV, %function -bluegl_glVertexAttrib4fvNV: - adrp x16, :got:__blue_glCore_glVertexAttrib4fvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4fvNV] + .global bluegl_glVertexArrayParameteriAPPLE + .type bluegl_glVertexArrayParameteriAPPLE, %function +bluegl_glVertexArrayParameteriAPPLE: + adrp x16, :got:__blue_glCore_glVertexArrayParameteriAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayParameteriAPPLE] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4fvNV, .-bluegl_glVertexAttrib4fvNV + .size bluegl_glVertexArrayParameteriAPPLE, .-bluegl_glVertexArrayParameteriAPPLE .align 2 - .global bluegl_glBufferDataARB - .type bluegl_glBufferDataARB, %function -bluegl_glBufferDataARB: - adrp x16, :got:__blue_glCore_glBufferDataARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glBufferDataARB] + .global bluegl_glEnableVertexAttribAPPLE + .type bluegl_glEnableVertexAttribAPPLE, %function +bluegl_glEnableVertexAttribAPPLE: + adrp x16, :got:__blue_glCore_glEnableVertexAttribAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableVertexAttribAPPLE] ldr x16, [x16] br x16 - .size bluegl_glBufferDataARB, .-bluegl_glBufferDataARB + .size bluegl_glEnableVertexAttribAPPLE, .-bluegl_glEnableVertexAttribAPPLE .align 2 - .global bluegl_glWindowPos4fMESA - .type bluegl_glWindowPos4fMESA, %function -bluegl_glWindowPos4fMESA: - adrp x16, :got:__blue_glCore_glWindowPos4fMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos4fMESA] + .global bluegl_glDisableVertexAttribAPPLE + .type bluegl_glDisableVertexAttribAPPLE, %function +bluegl_glDisableVertexAttribAPPLE: + adrp x16, :got:__blue_glCore_glDisableVertexAttribAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableVertexAttribAPPLE] ldr x16, [x16] br x16 - .size bluegl_glWindowPos4fMESA, .-bluegl_glWindowPos4fMESA + .size bluegl_glDisableVertexAttribAPPLE, .-bluegl_glDisableVertexAttribAPPLE .align 2 - .global bluegl_glPushDebugGroup - .type bluegl_glPushDebugGroup, %function -bluegl_glPushDebugGroup: - adrp x16, :got:__blue_glCore_glPushDebugGroup - ldr x16, [x16, #:got_lo12:__blue_glCore_glPushDebugGroup] + .global bluegl_glIsVertexAttribEnabledAPPLE + .type bluegl_glIsVertexAttribEnabledAPPLE, %function +bluegl_glIsVertexAttribEnabledAPPLE: + adrp x16, :got:__blue_glCore_glIsVertexAttribEnabledAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsVertexAttribEnabledAPPLE] ldr x16, [x16] br x16 - .size bluegl_glPushDebugGroup, .-bluegl_glPushDebugGroup + .size bluegl_glIsVertexAttribEnabledAPPLE, .-bluegl_glIsVertexAttribEnabledAPPLE .align 2 - .global bluegl_glProgramUniform2fEXT - .type bluegl_glProgramUniform2fEXT, %function -bluegl_glProgramUniform2fEXT: - adrp x16, :got:__blue_glCore_glProgramUniform2fEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2fEXT] + .global bluegl_glMapVertexAttrib1dAPPLE + .type bluegl_glMapVertexAttrib1dAPPLE, %function +bluegl_glMapVertexAttrib1dAPPLE: + adrp x16, :got:__blue_glCore_glMapVertexAttrib1dAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glMapVertexAttrib1dAPPLE] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2fEXT, .-bluegl_glProgramUniform2fEXT + .size bluegl_glMapVertexAttrib1dAPPLE, .-bluegl_glMapVertexAttrib1dAPPLE .align 2 - .global bluegl_glCopyTexImage1DEXT - .type bluegl_glCopyTexImage1DEXT, %function -bluegl_glCopyTexImage1DEXT: - adrp x16, :got:__blue_glCore_glCopyTexImage1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexImage1DEXT] + .global bluegl_glMapVertexAttrib1fAPPLE + .type bluegl_glMapVertexAttrib1fAPPLE, %function +bluegl_glMapVertexAttrib1fAPPLE: + adrp x16, :got:__blue_glCore_glMapVertexAttrib1fAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glMapVertexAttrib1fAPPLE] ldr x16, [x16] br x16 - .size bluegl_glCopyTexImage1DEXT, .-bluegl_glCopyTexImage1DEXT + .size bluegl_glMapVertexAttrib1fAPPLE, .-bluegl_glMapVertexAttrib1fAPPLE .align 2 - .global bluegl_glCompressedTexSubImage2DARB - .type bluegl_glCompressedTexSubImage2DARB, %function -bluegl_glCompressedTexSubImage2DARB: - adrp x16, :got:__blue_glCore_glCompressedTexSubImage2DARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexSubImage2DARB] + .global bluegl_glMapVertexAttrib2dAPPLE + .type bluegl_glMapVertexAttrib2dAPPLE, %function +bluegl_glMapVertexAttrib2dAPPLE: + adrp x16, :got:__blue_glCore_glMapVertexAttrib2dAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glMapVertexAttrib2dAPPLE] ldr x16, [x16] br x16 - .size bluegl_glCompressedTexSubImage2DARB, .-bluegl_glCompressedTexSubImage2DARB + .size bluegl_glMapVertexAttrib2dAPPLE, .-bluegl_glMapVertexAttrib2dAPPLE .align 2 - .global bluegl_glCopyColorSubTableEXT - .type bluegl_glCopyColorSubTableEXT, %function -bluegl_glCopyColorSubTableEXT: - adrp x16, :got:__blue_glCore_glCopyColorSubTableEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyColorSubTableEXT] + .global bluegl_glMapVertexAttrib2fAPPLE + .type bluegl_glMapVertexAttrib2fAPPLE, %function +bluegl_glMapVertexAttrib2fAPPLE: + adrp x16, :got:__blue_glCore_glMapVertexAttrib2fAPPLE + ldr x16, [x16, #:got_lo12:__blue_glCore_glMapVertexAttrib2fAPPLE] ldr x16, [x16] br x16 - .size bluegl_glCopyColorSubTableEXT, .-bluegl_glCopyColorSubTableEXT + .size bluegl_glMapVertexAttrib2fAPPLE, .-bluegl_glMapVertexAttrib2fAPPLE .align 2 - .global bluegl_glTransformFeedbackAttribsNV - .type bluegl_glTransformFeedbackAttribsNV, %function -bluegl_glTransformFeedbackAttribsNV: - adrp x16, :got:__blue_glCore_glTransformFeedbackAttribsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTransformFeedbackAttribsNV] + .global bluegl_glDrawBuffersATI + .type bluegl_glDrawBuffersATI, %function +bluegl_glDrawBuffersATI: + adrp x16, :got:__blue_glCore_glDrawBuffersATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawBuffersATI] ldr x16, [x16] br x16 - .size bluegl_glTransformFeedbackAttribsNV, .-bluegl_glTransformFeedbackAttribsNV + .size bluegl_glDrawBuffersATI, .-bluegl_glDrawBuffersATI .align 2 - .global bluegl_glMatrixFrustumEXT - .type bluegl_glMatrixFrustumEXT, %function -bluegl_glMatrixFrustumEXT: - adrp x16, :got:__blue_glCore_glMatrixFrustumEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixFrustumEXT] + .global bluegl_glElementPointerATI + .type bluegl_glElementPointerATI, %function +bluegl_glElementPointerATI: + adrp x16, :got:__blue_glCore_glElementPointerATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glElementPointerATI] ldr x16, [x16] br x16 - .size bluegl_glMatrixFrustumEXT, .-bluegl_glMatrixFrustumEXT + .size bluegl_glElementPointerATI, .-bluegl_glElementPointerATI .align 2 - .global bluegl_glIsBufferARB - .type bluegl_glIsBufferARB, %function -bluegl_glIsBufferARB: - adrp x16, :got:__blue_glCore_glIsBufferARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsBufferARB] + .global bluegl_glDrawElementArrayATI + .type bluegl_glDrawElementArrayATI, %function +bluegl_glDrawElementArrayATI: + adrp x16, :got:__blue_glCore_glDrawElementArrayATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementArrayATI] ldr x16, [x16] br x16 - .size bluegl_glIsBufferARB, .-bluegl_glIsBufferARB + .size bluegl_glDrawElementArrayATI, .-bluegl_glDrawElementArrayATI .align 2 - .global bluegl_glUniform3fvARB - .type bluegl_glUniform3fvARB, %function -bluegl_glUniform3fvARB: - adrp x16, :got:__blue_glCore_glUniform3fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3fvARB] + .global bluegl_glDrawRangeElementArrayATI + .type bluegl_glDrawRangeElementArrayATI, %function +bluegl_glDrawRangeElementArrayATI: + adrp x16, :got:__blue_glCore_glDrawRangeElementArrayATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawRangeElementArrayATI] ldr x16, [x16] br x16 - .size bluegl_glUniform3fvARB, .-bluegl_glUniform3fvARB + .size bluegl_glDrawRangeElementArrayATI, .-bluegl_glDrawRangeElementArrayATI .align 2 - .global bluegl_glMultiTexCoord3dARB - .type bluegl_glMultiTexCoord3dARB, %function -bluegl_glMultiTexCoord3dARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord3dARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3dARB] + .global bluegl_glTexBumpParameterivATI + .type bluegl_glTexBumpParameterivATI, %function +bluegl_glTexBumpParameterivATI: + adrp x16, :got:__blue_glCore_glTexBumpParameterivATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexBumpParameterivATI] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3dARB, .-bluegl_glMultiTexCoord3dARB + .size bluegl_glTexBumpParameterivATI, .-bluegl_glTexBumpParameterivATI .align 2 - .global bluegl_glIndexPointerEXT - .type bluegl_glIndexPointerEXT, %function -bluegl_glIndexPointerEXT: - adrp x16, :got:__blue_glCore_glIndexPointerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glIndexPointerEXT] + .global bluegl_glTexBumpParameterfvATI + .type bluegl_glTexBumpParameterfvATI, %function +bluegl_glTexBumpParameterfvATI: + adrp x16, :got:__blue_glCore_glTexBumpParameterfvATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexBumpParameterfvATI] + ldr x16, [x16] + br x16 + .size bluegl_glTexBumpParameterfvATI, .-bluegl_glTexBumpParameterfvATI + + .align 2 + .global bluegl_glGetTexBumpParameterivATI + .type bluegl_glGetTexBumpParameterivATI, %function +bluegl_glGetTexBumpParameterivATI: + adrp x16, :got:__blue_glCore_glGetTexBumpParameterivATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexBumpParameterivATI] ldr x16, [x16] br x16 - .size bluegl_glIndexPointerEXT, .-bluegl_glIndexPointerEXT + .size bluegl_glGetTexBumpParameterivATI, .-bluegl_glGetTexBumpParameterivATI .align 2 - .global bluegl_glMatrixLoad3x3fNV - .type bluegl_glMatrixLoad3x3fNV, %function -bluegl_glMatrixLoad3x3fNV: - adrp x16, :got:__blue_glCore_glMatrixLoad3x3fNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixLoad3x3fNV] + .global bluegl_glGetTexBumpParameterfvATI + .type bluegl_glGetTexBumpParameterfvATI, %function +bluegl_glGetTexBumpParameterfvATI: + adrp x16, :got:__blue_glCore_glGetTexBumpParameterfvATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexBumpParameterfvATI] ldr x16, [x16] br x16 - .size bluegl_glMatrixLoad3x3fNV, .-bluegl_glMatrixLoad3x3fNV + .size bluegl_glGetTexBumpParameterfvATI, .-bluegl_glGetTexBumpParameterfvATI .align 2 - .global bluegl_glUnmapNamedBufferEXT - .type bluegl_glUnmapNamedBufferEXT, %function -bluegl_glUnmapNamedBufferEXT: - adrp x16, :got:__blue_glCore_glUnmapNamedBufferEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glUnmapNamedBufferEXT] + .global bluegl_glGenFragmentShadersATI + .type bluegl_glGenFragmentShadersATI, %function +bluegl_glGenFragmentShadersATI: + adrp x16, :got:__blue_glCore_glGenFragmentShadersATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenFragmentShadersATI] ldr x16, [x16] br x16 - .size bluegl_glUnmapNamedBufferEXT, .-bluegl_glUnmapNamedBufferEXT + .size bluegl_glGenFragmentShadersATI, .-bluegl_glGenFragmentShadersATI .align 2 - .global bluegl_glCreateProgramObjectARB - .type bluegl_glCreateProgramObjectARB, %function -bluegl_glCreateProgramObjectARB: - adrp x16, :got:__blue_glCore_glCreateProgramObjectARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateProgramObjectARB] + .global bluegl_glBindFragmentShaderATI + .type bluegl_glBindFragmentShaderATI, %function +bluegl_glBindFragmentShaderATI: + adrp x16, :got:__blue_glCore_glBindFragmentShaderATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindFragmentShaderATI] ldr x16, [x16] br x16 - .size bluegl_glCreateProgramObjectARB, .-bluegl_glCreateProgramObjectARB + .size bluegl_glBindFragmentShaderATI, .-bluegl_glBindFragmentShaderATI .align 2 - .global bluegl_glMapGrid2xOES - .type bluegl_glMapGrid2xOES, %function -bluegl_glMapGrid2xOES: - adrp x16, :got:__blue_glCore_glMapGrid2xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMapGrid2xOES] + .global bluegl_glDeleteFragmentShaderATI + .type bluegl_glDeleteFragmentShaderATI, %function +bluegl_glDeleteFragmentShaderATI: + adrp x16, :got:__blue_glCore_glDeleteFragmentShaderATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteFragmentShaderATI] ldr x16, [x16] br x16 - .size bluegl_glMapGrid2xOES, .-bluegl_glMapGrid2xOES + .size bluegl_glDeleteFragmentShaderATI, .-bluegl_glDeleteFragmentShaderATI .align 2 - .global bluegl_glVertexPointerEXT - .type bluegl_glVertexPointerEXT, %function -bluegl_glVertexPointerEXT: - adrp x16, :got:__blue_glCore_glVertexPointerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexPointerEXT] + .global bluegl_glBeginFragmentShaderATI + .type bluegl_glBeginFragmentShaderATI, %function +bluegl_glBeginFragmentShaderATI: + adrp x16, :got:__blue_glCore_glBeginFragmentShaderATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginFragmentShaderATI] ldr x16, [x16] br x16 - .size bluegl_glVertexPointerEXT, .-bluegl_glVertexPointerEXT + .size bluegl_glBeginFragmentShaderATI, .-bluegl_glBeginFragmentShaderATI .align 2 - .global bluegl_glVertexStream4svATI - .type bluegl_glVertexStream4svATI, %function -bluegl_glVertexStream4svATI: - adrp x16, :got:__blue_glCore_glVertexStream4svATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream4svATI] + .global bluegl_glEndFragmentShaderATI + .type bluegl_glEndFragmentShaderATI, %function +bluegl_glEndFragmentShaderATI: + adrp x16, :got:__blue_glCore_glEndFragmentShaderATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glEndFragmentShaderATI] ldr x16, [x16] br x16 - .size bluegl_glVertexStream4svATI, .-bluegl_glVertexStream4svATI + .size bluegl_glEndFragmentShaderATI, .-bluegl_glEndFragmentShaderATI .align 2 - .global bluegl_glMultiTexCoord2hvNV - .type bluegl_glMultiTexCoord2hvNV, %function -bluegl_glMultiTexCoord2hvNV: - adrp x16, :got:__blue_glCore_glMultiTexCoord2hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2hvNV] + .global bluegl_glPassTexCoordATI + .type bluegl_glPassTexCoordATI, %function +bluegl_glPassTexCoordATI: + adrp x16, :got:__blue_glCore_glPassTexCoordATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glPassTexCoordATI] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2hvNV, .-bluegl_glMultiTexCoord2hvNV + .size bluegl_glPassTexCoordATI, .-bluegl_glPassTexCoordATI .align 2 - .global bluegl_glLabelObjectEXT - .type bluegl_glLabelObjectEXT, %function -bluegl_glLabelObjectEXT: - adrp x16, :got:__blue_glCore_glLabelObjectEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glLabelObjectEXT] + .global bluegl_glSampleMapATI + .type bluegl_glSampleMapATI, %function +bluegl_glSampleMapATI: + adrp x16, :got:__blue_glCore_glSampleMapATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glSampleMapATI] ldr x16, [x16] br x16 - .size bluegl_glLabelObjectEXT, .-bluegl_glLabelObjectEXT + .size bluegl_glSampleMapATI, .-bluegl_glSampleMapATI .align 2 - .global bluegl_glTextureImage3DMultisampleNV - .type bluegl_glTextureImage3DMultisampleNV, %function -bluegl_glTextureImage3DMultisampleNV: - adrp x16, :got:__blue_glCore_glTextureImage3DMultisampleNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureImage3DMultisampleNV] + .global bluegl_glColorFragmentOp1ATI + .type bluegl_glColorFragmentOp1ATI, %function +bluegl_glColorFragmentOp1ATI: + adrp x16, :got:__blue_glCore_glColorFragmentOp1ATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorFragmentOp1ATI] ldr x16, [x16] br x16 - .size bluegl_glTextureImage3DMultisampleNV, .-bluegl_glTextureImage3DMultisampleNV + .size bluegl_glColorFragmentOp1ATI, .-bluegl_glColorFragmentOp1ATI .align 2 - .global bluegl_glMultTransposeMatrixd - .type bluegl_glMultTransposeMatrixd, %function -bluegl_glMultTransposeMatrixd: - adrp x16, :got:__blue_glCore_glMultTransposeMatrixd - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultTransposeMatrixd] + .global bluegl_glColorFragmentOp2ATI + .type bluegl_glColorFragmentOp2ATI, %function +bluegl_glColorFragmentOp2ATI: + adrp x16, :got:__blue_glCore_glColorFragmentOp2ATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorFragmentOp2ATI] ldr x16, [x16] br x16 - .size bluegl_glMultTransposeMatrixd, .-bluegl_glMultTransposeMatrixd + .size bluegl_glColorFragmentOp2ATI, .-bluegl_glColorFragmentOp2ATI .align 2 - .global bluegl_glMultiTexCoord2fARB - .type bluegl_glMultiTexCoord2fARB, %function -bluegl_glMultiTexCoord2fARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord2fARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2fARB] + .global bluegl_glColorFragmentOp3ATI + .type bluegl_glColorFragmentOp3ATI, %function +bluegl_glColorFragmentOp3ATI: + adrp x16, :got:__blue_glCore_glColorFragmentOp3ATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorFragmentOp3ATI] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2fARB, .-bluegl_glMultiTexCoord2fARB + .size bluegl_glColorFragmentOp3ATI, .-bluegl_glColorFragmentOp3ATI .align 2 - .global bluegl_glMultiTexCoord2dARB - .type bluegl_glMultiTexCoord2dARB, %function -bluegl_glMultiTexCoord2dARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord2dARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2dARB] + .global bluegl_glAlphaFragmentOp1ATI + .type bluegl_glAlphaFragmentOp1ATI, %function +bluegl_glAlphaFragmentOp1ATI: + adrp x16, :got:__blue_glCore_glAlphaFragmentOp1ATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glAlphaFragmentOp1ATI] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2dARB, .-bluegl_glMultiTexCoord2dARB + .size bluegl_glAlphaFragmentOp1ATI, .-bluegl_glAlphaFragmentOp1ATI .align 2 - .global bluegl_glGetCombinerOutputParameterfvNV - .type bluegl_glGetCombinerOutputParameterfvNV, %function -bluegl_glGetCombinerOutputParameterfvNV: - adrp x16, :got:__blue_glCore_glGetCombinerOutputParameterfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCombinerOutputParameterfvNV] + .global bluegl_glAlphaFragmentOp2ATI + .type bluegl_glAlphaFragmentOp2ATI, %function +bluegl_glAlphaFragmentOp2ATI: + adrp x16, :got:__blue_glCore_glAlphaFragmentOp2ATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glAlphaFragmentOp2ATI] ldr x16, [x16] br x16 - .size bluegl_glGetCombinerOutputParameterfvNV, .-bluegl_glGetCombinerOutputParameterfvNV + .size bluegl_glAlphaFragmentOp2ATI, .-bluegl_glAlphaFragmentOp2ATI .align 2 - .global bluegl_glGetBufferPointerv - .type bluegl_glGetBufferPointerv, %function -bluegl_glGetBufferPointerv: - adrp x16, :got:__blue_glCore_glGetBufferPointerv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBufferPointerv] + .global bluegl_glAlphaFragmentOp3ATI + .type bluegl_glAlphaFragmentOp3ATI, %function +bluegl_glAlphaFragmentOp3ATI: + adrp x16, :got:__blue_glCore_glAlphaFragmentOp3ATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glAlphaFragmentOp3ATI] ldr x16, [x16] br x16 - .size bluegl_glGetBufferPointerv, .-bluegl_glGetBufferPointerv + .size bluegl_glAlphaFragmentOp3ATI, .-bluegl_glAlphaFragmentOp3ATI .align 2 - .global bluegl_glVertexAttrib1dNV - .type bluegl_glVertexAttrib1dNV, %function -bluegl_glVertexAttrib1dNV: - adrp x16, :got:__blue_glCore_glVertexAttrib1dNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1dNV] + .global bluegl_glSetFragmentShaderConstantATI + .type bluegl_glSetFragmentShaderConstantATI, %function +bluegl_glSetFragmentShaderConstantATI: + adrp x16, :got:__blue_glCore_glSetFragmentShaderConstantATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glSetFragmentShaderConstantATI] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1dNV, .-bluegl_glVertexAttrib1dNV + .size bluegl_glSetFragmentShaderConstantATI, .-bluegl_glSetFragmentShaderConstantATI .align 2 - .global bluegl_glTextureView - .type bluegl_glTextureView, %function -bluegl_glTextureView: - adrp x16, :got:__blue_glCore_glTextureView - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureView] + .global bluegl_glMapObjectBufferATI + .type bluegl_glMapObjectBufferATI, %function +bluegl_glMapObjectBufferATI: + adrp x16, :got:__blue_glCore_glMapObjectBufferATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glMapObjectBufferATI] ldr x16, [x16] br x16 - .size bluegl_glTextureView, .-bluegl_glTextureView + .size bluegl_glMapObjectBufferATI, .-bluegl_glMapObjectBufferATI .align 2 - .global bluegl_glBlitFramebufferEXT - .type bluegl_glBlitFramebufferEXT, %function -bluegl_glBlitFramebufferEXT: - adrp x16, :got:__blue_glCore_glBlitFramebufferEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlitFramebufferEXT] + .global bluegl_glUnmapObjectBufferATI + .type bluegl_glUnmapObjectBufferATI, %function +bluegl_glUnmapObjectBufferATI: + adrp x16, :got:__blue_glCore_glUnmapObjectBufferATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glUnmapObjectBufferATI] ldr x16, [x16] br x16 - .size bluegl_glBlitFramebufferEXT, .-bluegl_glBlitFramebufferEXT + .size bluegl_glUnmapObjectBufferATI, .-bluegl_glUnmapObjectBufferATI .align 2 - .global bluegl_glVertexWeightPointerEXT - .type bluegl_glVertexWeightPointerEXT, %function -bluegl_glVertexWeightPointerEXT: - adrp x16, :got:__blue_glCore_glVertexWeightPointerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexWeightPointerEXT] + .global bluegl_glPNTrianglesiATI + .type bluegl_glPNTrianglesiATI, %function +bluegl_glPNTrianglesiATI: + adrp x16, :got:__blue_glCore_glPNTrianglesiATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glPNTrianglesiATI] ldr x16, [x16] br x16 - .size bluegl_glVertexWeightPointerEXT, .-bluegl_glVertexWeightPointerEXT + .size bluegl_glPNTrianglesiATI, .-bluegl_glPNTrianglesiATI .align 2 - .global bluegl_glBindTextures - .type bluegl_glBindTextures, %function -bluegl_glBindTextures: - adrp x16, :got:__blue_glCore_glBindTextures - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindTextures] + .global bluegl_glPNTrianglesfATI + .type bluegl_glPNTrianglesfATI, %function +bluegl_glPNTrianglesfATI: + adrp x16, :got:__blue_glCore_glPNTrianglesfATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glPNTrianglesfATI] ldr x16, [x16] br x16 - .size bluegl_glBindTextures, .-bluegl_glBindTextures + .size bluegl_glPNTrianglesfATI, .-bluegl_glPNTrianglesfATI .align 2 - .global bluegl_glClearBufferiv - .type bluegl_glClearBufferiv, %function -bluegl_glClearBufferiv: - adrp x16, :got:__blue_glCore_glClearBufferiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearBufferiv] + .global bluegl_glStencilOpSeparateATI + .type bluegl_glStencilOpSeparateATI, %function +bluegl_glStencilOpSeparateATI: + adrp x16, :got:__blue_glCore_glStencilOpSeparateATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilOpSeparateATI] ldr x16, [x16] br x16 - .size bluegl_glClearBufferiv, .-bluegl_glClearBufferiv + .size bluegl_glStencilOpSeparateATI, .-bluegl_glStencilOpSeparateATI .align 2 - .global bluegl_glMultiTexCoord4ivARB - .type bluegl_glMultiTexCoord4ivARB, %function -bluegl_glMultiTexCoord4ivARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord4ivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4ivARB] + .global bluegl_glStencilFuncSeparateATI + .type bluegl_glStencilFuncSeparateATI, %function +bluegl_glStencilFuncSeparateATI: + adrp x16, :got:__blue_glCore_glStencilFuncSeparateATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilFuncSeparateATI] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4ivARB, .-bluegl_glMultiTexCoord4ivARB + .size bluegl_glStencilFuncSeparateATI, .-bluegl_glStencilFuncSeparateATI .align 2 - .global bluegl_glGetImageHandleNV - .type bluegl_glGetImageHandleNV, %function -bluegl_glGetImageHandleNV: - adrp x16, :got:__blue_glCore_glGetImageHandleNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetImageHandleNV] + .global bluegl_glNewObjectBufferATI + .type bluegl_glNewObjectBufferATI, %function +bluegl_glNewObjectBufferATI: + adrp x16, :got:__blue_glCore_glNewObjectBufferATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glNewObjectBufferATI] ldr x16, [x16] br x16 - .size bluegl_glGetImageHandleNV, .-bluegl_glGetImageHandleNV + .size bluegl_glNewObjectBufferATI, .-bluegl_glNewObjectBufferATI .align 2 - .global bluegl_glGetDoublei_vEXT - .type bluegl_glGetDoublei_vEXT, %function -bluegl_glGetDoublei_vEXT: - adrp x16, :got:__blue_glCore_glGetDoublei_vEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetDoublei_vEXT] + .global bluegl_glIsObjectBufferATI + .type bluegl_glIsObjectBufferATI, %function +bluegl_glIsObjectBufferATI: + adrp x16, :got:__blue_glCore_glIsObjectBufferATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsObjectBufferATI] ldr x16, [x16] br x16 - .size bluegl_glGetDoublei_vEXT, .-bluegl_glGetDoublei_vEXT + .size bluegl_glIsObjectBufferATI, .-bluegl_glIsObjectBufferATI .align 2 - .global bluegl_glProgramUniform1i64NV - .type bluegl_glProgramUniform1i64NV, %function -bluegl_glProgramUniform1i64NV: - adrp x16, :got:__blue_glCore_glProgramUniform1i64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1i64NV] + .global bluegl_glUpdateObjectBufferATI + .type bluegl_glUpdateObjectBufferATI, %function +bluegl_glUpdateObjectBufferATI: + adrp x16, :got:__blue_glCore_glUpdateObjectBufferATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glUpdateObjectBufferATI] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1i64NV, .-bluegl_glProgramUniform1i64NV + .size bluegl_glUpdateObjectBufferATI, .-bluegl_glUpdateObjectBufferATI .align 2 - .global bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN - .type bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN, %function -bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN] + .global bluegl_glGetObjectBufferfvATI + .type bluegl_glGetObjectBufferfvATI, %function +bluegl_glGetObjectBufferfvATI: + adrp x16, :got:__blue_glCore_glGetObjectBufferfvATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetObjectBufferfvATI] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN, .-bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN + .size bluegl_glGetObjectBufferfvATI, .-bluegl_glGetObjectBufferfvATI .align 2 - .global bluegl_glWindowPos3s - .type bluegl_glWindowPos3s, %function -bluegl_glWindowPos3s: - adrp x16, :got:__blue_glCore_glWindowPos3s - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3s] + .global bluegl_glGetObjectBufferivATI + .type bluegl_glGetObjectBufferivATI, %function +bluegl_glGetObjectBufferivATI: + adrp x16, :got:__blue_glCore_glGetObjectBufferivATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetObjectBufferivATI] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3s, .-bluegl_glWindowPos3s + .size bluegl_glGetObjectBufferivATI, .-bluegl_glGetObjectBufferivATI .align 2 - .global bluegl_glUniform4i64ARB - .type bluegl_glUniform4i64ARB, %function -bluegl_glUniform4i64ARB: - adrp x16, :got:__blue_glCore_glUniform4i64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4i64ARB] + .global bluegl_glFreeObjectBufferATI + .type bluegl_glFreeObjectBufferATI, %function +bluegl_glFreeObjectBufferATI: + adrp x16, :got:__blue_glCore_glFreeObjectBufferATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glFreeObjectBufferATI] ldr x16, [x16] br x16 - .size bluegl_glUniform4i64ARB, .-bluegl_glUniform4i64ARB + .size bluegl_glFreeObjectBufferATI, .-bluegl_glFreeObjectBufferATI .align 2 - .global bluegl_glProgramUniform2dvEXT - .type bluegl_glProgramUniform2dvEXT, %function -bluegl_glProgramUniform2dvEXT: - adrp x16, :got:__blue_glCore_glProgramUniform2dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2dvEXT] + .global bluegl_glArrayObjectATI + .type bluegl_glArrayObjectATI, %function +bluegl_glArrayObjectATI: + adrp x16, :got:__blue_glCore_glArrayObjectATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glArrayObjectATI] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2dvEXT, .-bluegl_glProgramUniform2dvEXT + .size bluegl_glArrayObjectATI, .-bluegl_glArrayObjectATI .align 2 - .global bluegl_glMultiTexSubImage1DEXT - .type bluegl_glMultiTexSubImage1DEXT, %function -bluegl_glMultiTexSubImage1DEXT: - adrp x16, :got:__blue_glCore_glMultiTexSubImage1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexSubImage1DEXT] + .global bluegl_glGetArrayObjectfvATI + .type bluegl_glGetArrayObjectfvATI, %function +bluegl_glGetArrayObjectfvATI: + adrp x16, :got:__blue_glCore_glGetArrayObjectfvATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetArrayObjectfvATI] ldr x16, [x16] br x16 - .size bluegl_glMultiTexSubImage1DEXT, .-bluegl_glMultiTexSubImage1DEXT + .size bluegl_glGetArrayObjectfvATI, .-bluegl_glGetArrayObjectfvATI .align 2 - .global bluegl_glHint - .type bluegl_glHint, %function -bluegl_glHint: - adrp x16, :got:__blue_glCore_glHint - ldr x16, [x16, #:got_lo12:__blue_glCore_glHint] + .global bluegl_glGetArrayObjectivATI + .type bluegl_glGetArrayObjectivATI, %function +bluegl_glGetArrayObjectivATI: + adrp x16, :got:__blue_glCore_glGetArrayObjectivATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetArrayObjectivATI] ldr x16, [x16] br x16 - .size bluegl_glHint, .-bluegl_glHint + .size bluegl_glGetArrayObjectivATI, .-bluegl_glGetArrayObjectivATI .align 2 - .global bluegl_glProgramUniformMatrix4fv - .type bluegl_glProgramUniformMatrix4fv, %function -bluegl_glProgramUniformMatrix4fv: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix4fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4fv] + .global bluegl_glVariantArrayObjectATI + .type bluegl_glVariantArrayObjectATI, %function +bluegl_glVariantArrayObjectATI: + adrp x16, :got:__blue_glCore_glVariantArrayObjectATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantArrayObjectATI] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix4fv, .-bluegl_glProgramUniformMatrix4fv + .size bluegl_glVariantArrayObjectATI, .-bluegl_glVariantArrayObjectATI .align 2 - .global bluegl_glTexCoord4bvOES - .type bluegl_glTexCoord4bvOES, %function -bluegl_glTexCoord4bvOES: - adrp x16, :got:__blue_glCore_glTexCoord4bvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord4bvOES] + .global bluegl_glGetVariantArrayObjectfvATI + .type bluegl_glGetVariantArrayObjectfvATI, %function +bluegl_glGetVariantArrayObjectfvATI: + adrp x16, :got:__blue_glCore_glGetVariantArrayObjectfvATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVariantArrayObjectfvATI] ldr x16, [x16] br x16 - .size bluegl_glTexCoord4bvOES, .-bluegl_glTexCoord4bvOES + .size bluegl_glGetVariantArrayObjectfvATI, .-bluegl_glGetVariantArrayObjectfvATI .align 2 - .global bluegl_glGetQueryObjectiv - .type bluegl_glGetQueryObjectiv, %function -bluegl_glGetQueryObjectiv: - adrp x16, :got:__blue_glCore_glGetQueryObjectiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryObjectiv] + .global bluegl_glGetVariantArrayObjectivATI + .type bluegl_glGetVariantArrayObjectivATI, %function +bluegl_glGetVariantArrayObjectivATI: + adrp x16, :got:__blue_glCore_glGetVariantArrayObjectivATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVariantArrayObjectivATI] ldr x16, [x16] br x16 - .size bluegl_glGetQueryObjectiv, .-bluegl_glGetQueryObjectiv + .size bluegl_glGetVariantArrayObjectivATI, .-bluegl_glGetVariantArrayObjectivATI .align 2 - .global bluegl_glGetQueryIndexediv - .type bluegl_glGetQueryIndexediv, %function -bluegl_glGetQueryIndexediv: - adrp x16, :got:__blue_glCore_glGetQueryIndexediv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryIndexediv] + .global bluegl_glVertexAttribArrayObjectATI + .type bluegl_glVertexAttribArrayObjectATI, %function +bluegl_glVertexAttribArrayObjectATI: + adrp x16, :got:__blue_glCore_glVertexAttribArrayObjectATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribArrayObjectATI] ldr x16, [x16] br x16 - .size bluegl_glGetQueryIndexediv, .-bluegl_glGetQueryIndexediv + .size bluegl_glVertexAttribArrayObjectATI, .-bluegl_glVertexAttribArrayObjectATI .align 2 - .global bluegl_glTexCoordP4ui - .type bluegl_glTexCoordP4ui, %function -bluegl_glTexCoordP4ui: - adrp x16, :got:__blue_glCore_glTexCoordP4ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordP4ui] + .global bluegl_glGetVertexAttribArrayObjectfvATI + .type bluegl_glGetVertexAttribArrayObjectfvATI, %function +bluegl_glGetVertexAttribArrayObjectfvATI: + adrp x16, :got:__blue_glCore_glGetVertexAttribArrayObjectfvATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribArrayObjectfvATI] ldr x16, [x16] br x16 - .size bluegl_glTexCoordP4ui, .-bluegl_glTexCoordP4ui + .size bluegl_glGetVertexAttribArrayObjectfvATI, .-bluegl_glGetVertexAttribArrayObjectfvATI .align 2 - .global bluegl_glVertexStream2fvATI - .type bluegl_glVertexStream2fvATI, %function -bluegl_glVertexStream2fvATI: - adrp x16, :got:__blue_glCore_glVertexStream2fvATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream2fvATI] + .global bluegl_glGetVertexAttribArrayObjectivATI + .type bluegl_glGetVertexAttribArrayObjectivATI, %function +bluegl_glGetVertexAttribArrayObjectivATI: + adrp x16, :got:__blue_glCore_glGetVertexAttribArrayObjectivATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribArrayObjectivATI] ldr x16, [x16] br x16 - .size bluegl_glVertexStream2fvATI, .-bluegl_glVertexStream2fvATI + .size bluegl_glGetVertexAttribArrayObjectivATI, .-bluegl_glGetVertexAttribArrayObjectivATI .align 2 - .global bluegl_glUniform3fv - .type bluegl_glUniform3fv, %function -bluegl_glUniform3fv: - adrp x16, :got:__blue_glCore_glUniform3fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3fv] + .global bluegl_glVertexStream1sATI + .type bluegl_glVertexStream1sATI, %function +bluegl_glVertexStream1sATI: + adrp x16, :got:__blue_glCore_glVertexStream1sATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream1sATI] ldr x16, [x16] br x16 - .size bluegl_glUniform3fv, .-bluegl_glUniform3fv + .size bluegl_glVertexStream1sATI, .-bluegl_glVertexStream1sATI .align 2 - .global bluegl_glUniformMatrix2dv - .type bluegl_glUniformMatrix2dv, %function -bluegl_glUniformMatrix2dv: - adrp x16, :got:__blue_glCore_glUniformMatrix2dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix2dv] + .global bluegl_glVertexStream1svATI + .type bluegl_glVertexStream1svATI, %function +bluegl_glVertexStream1svATI: + adrp x16, :got:__blue_glCore_glVertexStream1svATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream1svATI] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix2dv, .-bluegl_glUniformMatrix2dv + .size bluegl_glVertexStream1svATI, .-bluegl_glVertexStream1svATI .align 2 - .global bluegl_glIsObjectBufferATI - .type bluegl_glIsObjectBufferATI, %function -bluegl_glIsObjectBufferATI: - adrp x16, :got:__blue_glCore_glIsObjectBufferATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsObjectBufferATI] + .global bluegl_glVertexStream1iATI + .type bluegl_glVertexStream1iATI, %function +bluegl_glVertexStream1iATI: + adrp x16, :got:__blue_glCore_glVertexStream1iATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream1iATI] ldr x16, [x16] br x16 - .size bluegl_glIsObjectBufferATI, .-bluegl_glIsObjectBufferATI + .size bluegl_glVertexStream1iATI, .-bluegl_glVertexStream1iATI .align 2 - .global bluegl_glVertexAttribP2uiv - .type bluegl_glVertexAttribP2uiv, %function -bluegl_glVertexAttribP2uiv: - adrp x16, :got:__blue_glCore_glVertexAttribP2uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribP2uiv] + .global bluegl_glVertexStream1ivATI + .type bluegl_glVertexStream1ivATI, %function +bluegl_glVertexStream1ivATI: + adrp x16, :got:__blue_glCore_glVertexStream1ivATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream1ivATI] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribP2uiv, .-bluegl_glVertexAttribP2uiv + .size bluegl_glVertexStream1ivATI, .-bluegl_glVertexStream1ivATI .align 2 - .global bluegl_glCompileShader - .type bluegl_glCompileShader, %function -bluegl_glCompileShader: - adrp x16, :got:__blue_glCore_glCompileShader - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompileShader] + .global bluegl_glVertexStream1fATI + .type bluegl_glVertexStream1fATI, %function +bluegl_glVertexStream1fATI: + adrp x16, :got:__blue_glCore_glVertexStream1fATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream1fATI] ldr x16, [x16] br x16 - .size bluegl_glCompileShader, .-bluegl_glCompileShader + .size bluegl_glVertexStream1fATI, .-bluegl_glVertexStream1fATI .align 2 - .global bluegl_glMatrixScalefEXT - .type bluegl_glMatrixScalefEXT, %function -bluegl_glMatrixScalefEXT: - adrp x16, :got:__blue_glCore_glMatrixScalefEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixScalefEXT] + .global bluegl_glVertexStream1fvATI + .type bluegl_glVertexStream1fvATI, %function +bluegl_glVertexStream1fvATI: + adrp x16, :got:__blue_glCore_glVertexStream1fvATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream1fvATI] + ldr x16, [x16] + br x16 + .size bluegl_glVertexStream1fvATI, .-bluegl_glVertexStream1fvATI + + .align 2 + .global bluegl_glVertexStream1dATI + .type bluegl_glVertexStream1dATI, %function +bluegl_glVertexStream1dATI: + adrp x16, :got:__blue_glCore_glVertexStream1dATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream1dATI] ldr x16, [x16] br x16 - .size bluegl_glMatrixScalefEXT, .-bluegl_glMatrixScalefEXT + .size bluegl_glVertexStream1dATI, .-bluegl_glVertexStream1dATI .align 2 - .global bluegl_glBinormal3ivEXT - .type bluegl_glBinormal3ivEXT, %function -bluegl_glBinormal3ivEXT: - adrp x16, :got:__blue_glCore_glBinormal3ivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3ivEXT] + .global bluegl_glVertexStream1dvATI + .type bluegl_glVertexStream1dvATI, %function +bluegl_glVertexStream1dvATI: + adrp x16, :got:__blue_glCore_glVertexStream1dvATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream1dvATI] ldr x16, [x16] br x16 - .size bluegl_glBinormal3ivEXT, .-bluegl_glBinormal3ivEXT + .size bluegl_glVertexStream1dvATI, .-bluegl_glVertexStream1dvATI .align 2 - .global bluegl_glGetMapAttribParameterivNV - .type bluegl_glGetMapAttribParameterivNV, %function -bluegl_glGetMapAttribParameterivNV: - adrp x16, :got:__blue_glCore_glGetMapAttribParameterivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMapAttribParameterivNV] + .global bluegl_glVertexStream2sATI + .type bluegl_glVertexStream2sATI, %function +bluegl_glVertexStream2sATI: + adrp x16, :got:__blue_glCore_glVertexStream2sATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream2sATI] ldr x16, [x16] br x16 - .size bluegl_glGetMapAttribParameterivNV, .-bluegl_glGetMapAttribParameterivNV + .size bluegl_glVertexStream2sATI, .-bluegl_glVertexStream2sATI .align 2 - .global bluegl_glGetnPixelMapusvARB - .type bluegl_glGetnPixelMapusvARB, %function -bluegl_glGetnPixelMapusvARB: - adrp x16, :got:__blue_glCore_glGetnPixelMapusvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnPixelMapusvARB] + .global bluegl_glVertexStream2svATI + .type bluegl_glVertexStream2svATI, %function +bluegl_glVertexStream2svATI: + adrp x16, :got:__blue_glCore_glVertexStream2svATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream2svATI] ldr x16, [x16] br x16 - .size bluegl_glGetnPixelMapusvARB, .-bluegl_glGetnPixelMapusvARB + .size bluegl_glVertexStream2svATI, .-bluegl_glVertexStream2svATI .align 2 - .global bluegl_glGetPerfMonitorCounterStringAMD - .type bluegl_glGetPerfMonitorCounterStringAMD, %function -bluegl_glGetPerfMonitorCounterStringAMD: - adrp x16, :got:__blue_glCore_glGetPerfMonitorCounterStringAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfMonitorCounterStringAMD] + .global bluegl_glVertexStream2iATI + .type bluegl_glVertexStream2iATI, %function +bluegl_glVertexStream2iATI: + adrp x16, :got:__blue_glCore_glVertexStream2iATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream2iATI] ldr x16, [x16] br x16 - .size bluegl_glGetPerfMonitorCounterStringAMD, .-bluegl_glGetPerfMonitorCounterStringAMD + .size bluegl_glVertexStream2iATI, .-bluegl_glVertexStream2iATI .align 2 - .global bluegl_glIsTextureHandleResidentNV - .type bluegl_glIsTextureHandleResidentNV, %function -bluegl_glIsTextureHandleResidentNV: - adrp x16, :got:__blue_glCore_glIsTextureHandleResidentNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsTextureHandleResidentNV] + .global bluegl_glVertexStream2ivATI + .type bluegl_glVertexStream2ivATI, %function +bluegl_glVertexStream2ivATI: + adrp x16, :got:__blue_glCore_glVertexStream2ivATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream2ivATI] ldr x16, [x16] br x16 - .size bluegl_glIsTextureHandleResidentNV, .-bluegl_glIsTextureHandleResidentNV + .size bluegl_glVertexStream2ivATI, .-bluegl_glVertexStream2ivATI .align 2 - .global bluegl_glWaitSync - .type bluegl_glWaitSync, %function -bluegl_glWaitSync: - adrp x16, :got:__blue_glCore_glWaitSync - ldr x16, [x16, #:got_lo12:__blue_glCore_glWaitSync] + .global bluegl_glVertexStream2fATI + .type bluegl_glVertexStream2fATI, %function +bluegl_glVertexStream2fATI: + adrp x16, :got:__blue_glCore_glVertexStream2fATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream2fATI] ldr x16, [x16] br x16 - .size bluegl_glWaitSync, .-bluegl_glWaitSync + .size bluegl_glVertexStream2fATI, .-bluegl_glVertexStream2fATI .align 2 - .global bluegl_glGenSamplers - .type bluegl_glGenSamplers, %function -bluegl_glGenSamplers: - adrp x16, :got:__blue_glCore_glGenSamplers - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenSamplers] + .global bluegl_glVertexStream2fvATI + .type bluegl_glVertexStream2fvATI, %function +bluegl_glVertexStream2fvATI: + adrp x16, :got:__blue_glCore_glVertexStream2fvATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream2fvATI] ldr x16, [x16] br x16 - .size bluegl_glGenSamplers, .-bluegl_glGenSamplers + .size bluegl_glVertexStream2fvATI, .-bluegl_glVertexStream2fvATI .align 2 - .global bluegl_glCompressedTextureImage3DEXT - .type bluegl_glCompressedTextureImage3DEXT, %function -bluegl_glCompressedTextureImage3DEXT: - adrp x16, :got:__blue_glCore_glCompressedTextureImage3DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTextureImage3DEXT] + .global bluegl_glVertexStream2dATI + .type bluegl_glVertexStream2dATI, %function +bluegl_glVertexStream2dATI: + adrp x16, :got:__blue_glCore_glVertexStream2dATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream2dATI] ldr x16, [x16] br x16 - .size bluegl_glCompressedTextureImage3DEXT, .-bluegl_glCompressedTextureImage3DEXT + .size bluegl_glVertexStream2dATI, .-bluegl_glVertexStream2dATI .align 2 - .global bluegl_glGetPerfMonitorCounterInfoAMD - .type bluegl_glGetPerfMonitorCounterInfoAMD, %function -bluegl_glGetPerfMonitorCounterInfoAMD: - adrp x16, :got:__blue_glCore_glGetPerfMonitorCounterInfoAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfMonitorCounterInfoAMD] + .global bluegl_glVertexStream2dvATI + .type bluegl_glVertexStream2dvATI, %function +bluegl_glVertexStream2dvATI: + adrp x16, :got:__blue_glCore_glVertexStream2dvATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream2dvATI] ldr x16, [x16] br x16 - .size bluegl_glGetPerfMonitorCounterInfoAMD, .-bluegl_glGetPerfMonitorCounterInfoAMD + .size bluegl_glVertexStream2dvATI, .-bluegl_glVertexStream2dvATI .align 2 - .global bluegl_glUniform2ivARB - .type bluegl_glUniform2ivARB, %function -bluegl_glUniform2ivARB: - adrp x16, :got:__blue_glCore_glUniform2ivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2ivARB] + .global bluegl_glVertexStream3sATI + .type bluegl_glVertexStream3sATI, %function +bluegl_glVertexStream3sATI: + adrp x16, :got:__blue_glCore_glVertexStream3sATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream3sATI] ldr x16, [x16] br x16 - .size bluegl_glUniform2ivARB, .-bluegl_glUniform2ivARB + .size bluegl_glVertexStream3sATI, .-bluegl_glVertexStream3sATI .align 2 - .global bluegl_glVertexAttrib2sARB - .type bluegl_glVertexAttrib2sARB, %function -bluegl_glVertexAttrib2sARB: - adrp x16, :got:__blue_glCore_glVertexAttrib2sARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2sARB] + .global bluegl_glVertexStream3svATI + .type bluegl_glVertexStream3svATI, %function +bluegl_glVertexStream3svATI: + adrp x16, :got:__blue_glCore_glVertexStream3svATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream3svATI] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2sARB, .-bluegl_glVertexAttrib2sARB + .size bluegl_glVertexStream3svATI, .-bluegl_glVertexStream3svATI .align 2 - .global bluegl_glDrawCommandsAddressNV - .type bluegl_glDrawCommandsAddressNV, %function -bluegl_glDrawCommandsAddressNV: - adrp x16, :got:__blue_glCore_glDrawCommandsAddressNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawCommandsAddressNV] + .global bluegl_glVertexStream3iATI + .type bluegl_glVertexStream3iATI, %function +bluegl_glVertexStream3iATI: + adrp x16, :got:__blue_glCore_glVertexStream3iATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream3iATI] ldr x16, [x16] br x16 - .size bluegl_glDrawCommandsAddressNV, .-bluegl_glDrawCommandsAddressNV + .size bluegl_glVertexStream3iATI, .-bluegl_glVertexStream3iATI .align 2 - .global bluegl_glTexCoord1hNV - .type bluegl_glTexCoord1hNV, %function -bluegl_glTexCoord1hNV: - adrp x16, :got:__blue_glCore_glTexCoord1hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord1hNV] + .global bluegl_glVertexStream3ivATI + .type bluegl_glVertexStream3ivATI, %function +bluegl_glVertexStream3ivATI: + adrp x16, :got:__blue_glCore_glVertexStream3ivATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream3ivATI] ldr x16, [x16] br x16 - .size bluegl_glTexCoord1hNV, .-bluegl_glTexCoord1hNV + .size bluegl_glVertexStream3ivATI, .-bluegl_glVertexStream3ivATI .align 2 - .global bluegl_glGetFirstPerfQueryIdINTEL - .type bluegl_glGetFirstPerfQueryIdINTEL, %function -bluegl_glGetFirstPerfQueryIdINTEL: - adrp x16, :got:__blue_glCore_glGetFirstPerfQueryIdINTEL - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFirstPerfQueryIdINTEL] + .global bluegl_glVertexStream3fATI + .type bluegl_glVertexStream3fATI, %function +bluegl_glVertexStream3fATI: + adrp x16, :got:__blue_glCore_glVertexStream3fATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream3fATI] ldr x16, [x16] br x16 - .size bluegl_glGetFirstPerfQueryIdINTEL, .-bluegl_glGetFirstPerfQueryIdINTEL + .size bluegl_glVertexStream3fATI, .-bluegl_glVertexStream3fATI .align 2 - .global bluegl_glFramebufferTexture1D - .type bluegl_glFramebufferTexture1D, %function -bluegl_glFramebufferTexture1D: - adrp x16, :got:__blue_glCore_glFramebufferTexture1D - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTexture1D] + .global bluegl_glVertexStream3fvATI + .type bluegl_glVertexStream3fvATI, %function +bluegl_glVertexStream3fvATI: + adrp x16, :got:__blue_glCore_glVertexStream3fvATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream3fvATI] ldr x16, [x16] br x16 - .size bluegl_glFramebufferTexture1D, .-bluegl_glFramebufferTexture1D + .size bluegl_glVertexStream3fvATI, .-bluegl_glVertexStream3fvATI .align 2 - .global bluegl_glGetQueryObjecti64v - .type bluegl_glGetQueryObjecti64v, %function -bluegl_glGetQueryObjecti64v: - adrp x16, :got:__blue_glCore_glGetQueryObjecti64v - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryObjecti64v] + .global bluegl_glVertexStream3dATI + .type bluegl_glVertexStream3dATI, %function +bluegl_glVertexStream3dATI: + adrp x16, :got:__blue_glCore_glVertexStream3dATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream3dATI] ldr x16, [x16] br x16 - .size bluegl_glGetQueryObjecti64v, .-bluegl_glGetQueryObjecti64v + .size bluegl_glVertexStream3dATI, .-bluegl_glVertexStream3dATI .align 2 - .global bluegl_glVertexStream1dvATI - .type bluegl_glVertexStream1dvATI, %function -bluegl_glVertexStream1dvATI: - adrp x16, :got:__blue_glCore_glVertexStream1dvATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream1dvATI] + .global bluegl_glVertexStream3dvATI + .type bluegl_glVertexStream3dvATI, %function +bluegl_glVertexStream3dvATI: + adrp x16, :got:__blue_glCore_glVertexStream3dvATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream3dvATI] ldr x16, [x16] br x16 - .size bluegl_glVertexStream1dvATI, .-bluegl_glVertexStream1dvATI + .size bluegl_glVertexStream3dvATI, .-bluegl_glVertexStream3dvATI .align 2 - .global bluegl_glTexCoordPointerListIBM - .type bluegl_glTexCoordPointerListIBM, %function -bluegl_glTexCoordPointerListIBM: - adrp x16, :got:__blue_glCore_glTexCoordPointerListIBM - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordPointerListIBM] + .global bluegl_glVertexStream4sATI + .type bluegl_glVertexStream4sATI, %function +bluegl_glVertexStream4sATI: + adrp x16, :got:__blue_glCore_glVertexStream4sATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream4sATI] ldr x16, [x16] br x16 - .size bluegl_glTexCoordPointerListIBM, .-bluegl_glTexCoordPointerListIBM + .size bluegl_glVertexStream4sATI, .-bluegl_glVertexStream4sATI .align 2 - .global bluegl_glTexImage1D - .type bluegl_glTexImage1D, %function -bluegl_glTexImage1D: - adrp x16, :got:__blue_glCore_glTexImage1D - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexImage1D] + .global bluegl_glVertexStream4svATI + .type bluegl_glVertexStream4svATI, %function +bluegl_glVertexStream4svATI: + adrp x16, :got:__blue_glCore_glVertexStream4svATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream4svATI] ldr x16, [x16] br x16 - .size bluegl_glTexImage1D, .-bluegl_glTexImage1D + .size bluegl_glVertexStream4svATI, .-bluegl_glVertexStream4svATI .align 2 - .global bluegl_glWindowPos2fvMESA - .type bluegl_glWindowPos2fvMESA, %function -bluegl_glWindowPos2fvMESA: - adrp x16, :got:__blue_glCore_glWindowPos2fvMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2fvMESA] + .global bluegl_glVertexStream4iATI + .type bluegl_glVertexStream4iATI, %function +bluegl_glVertexStream4iATI: + adrp x16, :got:__blue_glCore_glVertexStream4iATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream4iATI] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2fvMESA, .-bluegl_glWindowPos2fvMESA + .size bluegl_glVertexStream4iATI, .-bluegl_glVertexStream4iATI .align 2 - .global bluegl_glIsFenceNV - .type bluegl_glIsFenceNV, %function -bluegl_glIsFenceNV: - adrp x16, :got:__blue_glCore_glIsFenceNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsFenceNV] + .global bluegl_glVertexStream4ivATI + .type bluegl_glVertexStream4ivATI, %function +bluegl_glVertexStream4ivATI: + adrp x16, :got:__blue_glCore_glVertexStream4ivATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream4ivATI] ldr x16, [x16] br x16 - .size bluegl_glIsFenceNV, .-bluegl_glIsFenceNV + .size bluegl_glVertexStream4ivATI, .-bluegl_glVertexStream4ivATI .align 2 - .global bluegl_glVariantsvEXT - .type bluegl_glVariantsvEXT, %function -bluegl_glVariantsvEXT: - adrp x16, :got:__blue_glCore_glVariantsvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantsvEXT] + .global bluegl_glVertexStream4fATI + .type bluegl_glVertexStream4fATI, %function +bluegl_glVertexStream4fATI: + adrp x16, :got:__blue_glCore_glVertexStream4fATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream4fATI] ldr x16, [x16] br x16 - .size bluegl_glVariantsvEXT, .-bluegl_glVariantsvEXT + .size bluegl_glVertexStream4fATI, .-bluegl_glVertexStream4fATI .align 2 - .global bluegl_glProgramUniform3dEXT - .type bluegl_glProgramUniform3dEXT, %function -bluegl_glProgramUniform3dEXT: - adrp x16, :got:__blue_glCore_glProgramUniform3dEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3dEXT] + .global bluegl_glVertexStream4fvATI + .type bluegl_glVertexStream4fvATI, %function +bluegl_glVertexStream4fvATI: + adrp x16, :got:__blue_glCore_glVertexStream4fvATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream4fvATI] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3dEXT, .-bluegl_glProgramUniform3dEXT + .size bluegl_glVertexStream4fvATI, .-bluegl_glVertexStream4fvATI .align 2 - .global bluegl_glUniform2iARB - .type bluegl_glUniform2iARB, %function -bluegl_glUniform2iARB: - adrp x16, :got:__blue_glCore_glUniform2iARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2iARB] + .global bluegl_glVertexStream4dATI + .type bluegl_glVertexStream4dATI, %function +bluegl_glVertexStream4dATI: + adrp x16, :got:__blue_glCore_glVertexStream4dATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream4dATI] ldr x16, [x16] br x16 - .size bluegl_glUniform2iARB, .-bluegl_glUniform2iARB + .size bluegl_glVertexStream4dATI, .-bluegl_glVertexStream4dATI .align 2 - .global bluegl_glPointParameteri - .type bluegl_glPointParameteri, %function -bluegl_glPointParameteri: - adrp x16, :got:__blue_glCore_glPointParameteri - ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameteri] + .global bluegl_glVertexStream4dvATI + .type bluegl_glVertexStream4dvATI, %function +bluegl_glVertexStream4dvATI: + adrp x16, :got:__blue_glCore_glVertexStream4dvATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream4dvATI] ldr x16, [x16] br x16 - .size bluegl_glPointParameteri, .-bluegl_glPointParameteri + .size bluegl_glVertexStream4dvATI, .-bluegl_glVertexStream4dvATI .align 2 - .global bluegl_glCreateRenderbuffers - .type bluegl_glCreateRenderbuffers, %function -bluegl_glCreateRenderbuffers: - adrp x16, :got:__blue_glCore_glCreateRenderbuffers - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateRenderbuffers] + .global bluegl_glNormalStream3bATI + .type bluegl_glNormalStream3bATI, %function +bluegl_glNormalStream3bATI: + adrp x16, :got:__blue_glCore_glNormalStream3bATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3bATI] ldr x16, [x16] br x16 - .size bluegl_glCreateRenderbuffers, .-bluegl_glCreateRenderbuffers + .size bluegl_glNormalStream3bATI, .-bluegl_glNormalStream3bATI .align 2 - .global bluegl_glUniform4i - .type bluegl_glUniform4i, %function -bluegl_glUniform4i: - adrp x16, :got:__blue_glCore_glUniform4i - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4i] + .global bluegl_glNormalStream3bvATI + .type bluegl_glNormalStream3bvATI, %function +bluegl_glNormalStream3bvATI: + adrp x16, :got:__blue_glCore_glNormalStream3bvATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3bvATI] ldr x16, [x16] br x16 - .size bluegl_glUniform4i, .-bluegl_glUniform4i + .size bluegl_glNormalStream3bvATI, .-bluegl_glNormalStream3bvATI .align 2 - .global bluegl_glDeleteCommandListsNV - .type bluegl_glDeleteCommandListsNV, %function -bluegl_glDeleteCommandListsNV: - adrp x16, :got:__blue_glCore_glDeleteCommandListsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteCommandListsNV] + .global bluegl_glNormalStream3sATI + .type bluegl_glNormalStream3sATI, %function +bluegl_glNormalStream3sATI: + adrp x16, :got:__blue_glCore_glNormalStream3sATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3sATI] ldr x16, [x16] br x16 - .size bluegl_glDeleteCommandListsNV, .-bluegl_glDeleteCommandListsNV + .size bluegl_glNormalStream3sATI, .-bluegl_glNormalStream3sATI .align 2 - .global bluegl_glRequestResidentProgramsNV - .type bluegl_glRequestResidentProgramsNV, %function -bluegl_glRequestResidentProgramsNV: - adrp x16, :got:__blue_glCore_glRequestResidentProgramsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glRequestResidentProgramsNV] + .global bluegl_glNormalStream3svATI + .type bluegl_glNormalStream3svATI, %function +bluegl_glNormalStream3svATI: + adrp x16, :got:__blue_glCore_glNormalStream3svATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3svATI] ldr x16, [x16] br x16 - .size bluegl_glRequestResidentProgramsNV, .-bluegl_glRequestResidentProgramsNV + .size bluegl_glNormalStream3svATI, .-bluegl_glNormalStream3svATI .align 2 - .global bluegl_glTextureSubImage3D - .type bluegl_glTextureSubImage3D, %function -bluegl_glTextureSubImage3D: - adrp x16, :got:__blue_glCore_glTextureSubImage3D - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureSubImage3D] + .global bluegl_glNormalStream3iATI + .type bluegl_glNormalStream3iATI, %function +bluegl_glNormalStream3iATI: + adrp x16, :got:__blue_glCore_glNormalStream3iATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3iATI] ldr x16, [x16] br x16 - .size bluegl_glTextureSubImage3D, .-bluegl_glTextureSubImage3D + .size bluegl_glNormalStream3iATI, .-bluegl_glNormalStream3iATI .align 2 - .global bluegl_glPixelStorex - .type bluegl_glPixelStorex, %function -bluegl_glPixelStorex: - adrp x16, :got:__blue_glCore_glPixelStorex - ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelStorex] + .global bluegl_glNormalStream3ivATI + .type bluegl_glNormalStream3ivATI, %function +bluegl_glNormalStream3ivATI: + adrp x16, :got:__blue_glCore_glNormalStream3ivATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3ivATI] ldr x16, [x16] br x16 - .size bluegl_glPixelStorex, .-bluegl_glPixelStorex + .size bluegl_glNormalStream3ivATI, .-bluegl_glNormalStream3ivATI .align 2 - .global bluegl_glVertexAttrib4fARB - .type bluegl_glVertexAttrib4fARB, %function -bluegl_glVertexAttrib4fARB: - adrp x16, :got:__blue_glCore_glVertexAttrib4fARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4fARB] + .global bluegl_glNormalStream3fATI + .type bluegl_glNormalStream3fATI, %function +bluegl_glNormalStream3fATI: + adrp x16, :got:__blue_glCore_glNormalStream3fATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3fATI] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4fARB, .-bluegl_glVertexAttrib4fARB + .size bluegl_glNormalStream3fATI, .-bluegl_glNormalStream3fATI .align 2 - .global bluegl_glGetVertexAttribIuiv - .type bluegl_glGetVertexAttribIuiv, %function -bluegl_glGetVertexAttribIuiv: - adrp x16, :got:__blue_glCore_glGetVertexAttribIuiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribIuiv] + .global bluegl_glNormalStream3fvATI + .type bluegl_glNormalStream3fvATI, %function +bluegl_glNormalStream3fvATI: + adrp x16, :got:__blue_glCore_glNormalStream3fvATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3fvATI] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribIuiv, .-bluegl_glGetVertexAttribIuiv + .size bluegl_glNormalStream3fvATI, .-bluegl_glNormalStream3fvATI .align 2 - .global bluegl_glVertexAttrib1s - .type bluegl_glVertexAttrib1s, %function -bluegl_glVertexAttrib1s: - adrp x16, :got:__blue_glCore_glVertexAttrib1s - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1s] + .global bluegl_glNormalStream3dATI + .type bluegl_glNormalStream3dATI, %function +bluegl_glNormalStream3dATI: + adrp x16, :got:__blue_glCore_glNormalStream3dATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3dATI] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1s, .-bluegl_glVertexAttrib1s + .size bluegl_glNormalStream3dATI, .-bluegl_glNormalStream3dATI .align 2 - .global bluegl_glProgramUniformMatrix4x3dv - .type bluegl_glProgramUniformMatrix4x3dv, %function -bluegl_glProgramUniformMatrix4x3dv: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix4x3dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4x3dv] + .global bluegl_glNormalStream3dvATI + .type bluegl_glNormalStream3dvATI, %function +bluegl_glNormalStream3dvATI: + adrp x16, :got:__blue_glCore_glNormalStream3dvATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3dvATI] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix4x3dv, .-bluegl_glProgramUniformMatrix4x3dv + .size bluegl_glNormalStream3dvATI, .-bluegl_glNormalStream3dvATI .align 2 - .global bluegl_glActiveVaryingNV - .type bluegl_glActiveVaryingNV, %function -bluegl_glActiveVaryingNV: - adrp x16, :got:__blue_glCore_glActiveVaryingNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glActiveVaryingNV] + .global bluegl_glClientActiveVertexStreamATI + .type bluegl_glClientActiveVertexStreamATI, %function +bluegl_glClientActiveVertexStreamATI: + adrp x16, :got:__blue_glCore_glClientActiveVertexStreamATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glClientActiveVertexStreamATI] ldr x16, [x16] br x16 - .size bluegl_glActiveVaryingNV, .-bluegl_glActiveVaryingNV + .size bluegl_glClientActiveVertexStreamATI, .-bluegl_glClientActiveVertexStreamATI .align 2 - .global bluegl_glTangent3sEXT - .type bluegl_glTangent3sEXT, %function -bluegl_glTangent3sEXT: - adrp x16, :got:__blue_glCore_glTangent3sEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3sEXT] + .global bluegl_glVertexBlendEnviATI + .type bluegl_glVertexBlendEnviATI, %function +bluegl_glVertexBlendEnviATI: + adrp x16, :got:__blue_glCore_glVertexBlendEnviATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexBlendEnviATI] ldr x16, [x16] br x16 - .size bluegl_glTangent3sEXT, .-bluegl_glTangent3sEXT + .size bluegl_glVertexBlendEnviATI, .-bluegl_glVertexBlendEnviATI .align 2 - .global bluegl_glConvolutionParameteriv - .type bluegl_glConvolutionParameteriv, %function -bluegl_glConvolutionParameteriv: - adrp x16, :got:__blue_glCore_glConvolutionParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameteriv] + .global bluegl_glVertexBlendEnvfATI + .type bluegl_glVertexBlendEnvfATI, %function +bluegl_glVertexBlendEnvfATI: + adrp x16, :got:__blue_glCore_glVertexBlendEnvfATI + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexBlendEnvfATI] ldr x16, [x16] br x16 - .size bluegl_glConvolutionParameteriv, .-bluegl_glConvolutionParameteriv + .size bluegl_glVertexBlendEnvfATI, .-bluegl_glVertexBlendEnvfATI .align 2 - .global bluegl_glQueryCounter - .type bluegl_glQueryCounter, %function -bluegl_glQueryCounter: - adrp x16, :got:__blue_glCore_glQueryCounter - ldr x16, [x16, #:got_lo12:__blue_glCore_glQueryCounter] + .global bluegl_glUniformBufferEXT + .type bluegl_glUniformBufferEXT, %function +bluegl_glUniformBufferEXT: + adrp x16, :got:__blue_glCore_glUniformBufferEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformBufferEXT] ldr x16, [x16] br x16 - .size bluegl_glQueryCounter, .-bluegl_glQueryCounter + .size bluegl_glUniformBufferEXT, .-bluegl_glUniformBufferEXT .align 2 - .global bluegl_glProgramUniform3d - .type bluegl_glProgramUniform3d, %function -bluegl_glProgramUniform3d: - adrp x16, :got:__blue_glCore_glProgramUniform3d - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3d] + .global bluegl_glGetUniformBufferSizeEXT + .type bluegl_glGetUniformBufferSizeEXT, %function +bluegl_glGetUniformBufferSizeEXT: + adrp x16, :got:__blue_glCore_glGetUniformBufferSizeEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformBufferSizeEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3d, .-bluegl_glProgramUniform3d + .size bluegl_glGetUniformBufferSizeEXT, .-bluegl_glGetUniformBufferSizeEXT .align 2 - .global bluegl_glGetUniformi64vARB - .type bluegl_glGetUniformi64vARB, %function -bluegl_glGetUniformi64vARB: - adrp x16, :got:__blue_glCore_glGetUniformi64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformi64vARB] + .global bluegl_glGetUniformOffsetEXT + .type bluegl_glGetUniformOffsetEXT, %function +bluegl_glGetUniformOffsetEXT: + adrp x16, :got:__blue_glCore_glGetUniformOffsetEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformOffsetEXT] ldr x16, [x16] br x16 - .size bluegl_glGetUniformi64vARB, .-bluegl_glGetUniformi64vARB + .size bluegl_glGetUniformOffsetEXT, .-bluegl_glGetUniformOffsetEXT .align 2 - .global bluegl_glGetnUniformui64vARB - .type bluegl_glGetnUniformui64vARB, %function -bluegl_glGetnUniformui64vARB: - adrp x16, :got:__blue_glCore_glGetnUniformui64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformui64vARB] + .global bluegl_glBlendColorEXT + .type bluegl_glBlendColorEXT, %function +bluegl_glBlendColorEXT: + adrp x16, :got:__blue_glCore_glBlendColorEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendColorEXT] ldr x16, [x16] br x16 - .size bluegl_glGetnUniformui64vARB, .-bluegl_glGetnUniformui64vARB + .size bluegl_glBlendColorEXT, .-bluegl_glBlendColorEXT .align 2 - .global bluegl_glNamedProgramLocalParameters4fvEXT - .type bluegl_glNamedProgramLocalParameters4fvEXT, %function -bluegl_glNamedProgramLocalParameters4fvEXT: - adrp x16, :got:__blue_glCore_glNamedProgramLocalParameters4fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParameters4fvEXT] + .global bluegl_glBlendEquationSeparateEXT + .type bluegl_glBlendEquationSeparateEXT, %function +bluegl_glBlendEquationSeparateEXT: + adrp x16, :got:__blue_glCore_glBlendEquationSeparateEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquationSeparateEXT] ldr x16, [x16] br x16 - .size bluegl_glNamedProgramLocalParameters4fvEXT, .-bluegl_glNamedProgramLocalParameters4fvEXT + .size bluegl_glBlendEquationSeparateEXT, .-bluegl_glBlendEquationSeparateEXT .align 2 - .global bluegl_glGetShaderSource - .type bluegl_glGetShaderSource, %function -bluegl_glGetShaderSource: - adrp x16, :got:__blue_glCore_glGetShaderSource - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetShaderSource] + .global bluegl_glBlendFuncSeparateEXT + .type bluegl_glBlendFuncSeparateEXT, %function +bluegl_glBlendFuncSeparateEXT: + adrp x16, :got:__blue_glCore_glBlendFuncSeparateEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFuncSeparateEXT] ldr x16, [x16] br x16 - .size bluegl_glGetShaderSource, .-bluegl_glGetShaderSource + .size bluegl_glBlendFuncSeparateEXT, .-bluegl_glBlendFuncSeparateEXT .align 2 - .global bluegl_glClearDepthdNV - .type bluegl_glClearDepthdNV, %function -bluegl_glClearDepthdNV: - adrp x16, :got:__blue_glCore_glClearDepthdNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearDepthdNV] + .global bluegl_glBlendEquationEXT + .type bluegl_glBlendEquationEXT, %function +bluegl_glBlendEquationEXT: + adrp x16, :got:__blue_glCore_glBlendEquationEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquationEXT] ldr x16, [x16] br x16 - .size bluegl_glClearDepthdNV, .-bluegl_glClearDepthdNV + .size bluegl_glBlendEquationEXT, .-bluegl_glBlendEquationEXT .align 2 - .global bluegl_glSecondaryColorP3ui - .type bluegl_glSecondaryColorP3ui, %function -bluegl_glSecondaryColorP3ui: - adrp x16, :got:__blue_glCore_glSecondaryColorP3ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColorP3ui] + .global bluegl_glColorSubTableEXT + .type bluegl_glColorSubTableEXT, %function +bluegl_glColorSubTableEXT: + adrp x16, :got:__blue_glCore_glColorSubTableEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorSubTableEXT] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColorP3ui, .-bluegl_glSecondaryColorP3ui + .size bluegl_glColorSubTableEXT, .-bluegl_glColorSubTableEXT .align 2 - .global bluegl_glMinmax - .type bluegl_glMinmax, %function -bluegl_glMinmax: - adrp x16, :got:__blue_glCore_glMinmax - ldr x16, [x16, #:got_lo12:__blue_glCore_glMinmax] + .global bluegl_glCopyColorSubTableEXT + .type bluegl_glCopyColorSubTableEXT, %function +bluegl_glCopyColorSubTableEXT: + adrp x16, :got:__blue_glCore_glCopyColorSubTableEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyColorSubTableEXT] ldr x16, [x16] br x16 - .size bluegl_glMinmax, .-bluegl_glMinmax + .size bluegl_glCopyColorSubTableEXT, .-bluegl_glCopyColorSubTableEXT .align 2 - .global bluegl_glVariantubvEXT - .type bluegl_glVariantubvEXT, %function -bluegl_glVariantubvEXT: - adrp x16, :got:__blue_glCore_glVariantubvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantubvEXT] + .global bluegl_glLockArraysEXT + .type bluegl_glLockArraysEXT, %function +bluegl_glLockArraysEXT: + adrp x16, :got:__blue_glCore_glLockArraysEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glLockArraysEXT] ldr x16, [x16] br x16 - .size bluegl_glVariantubvEXT, .-bluegl_glVariantubvEXT + .size bluegl_glLockArraysEXT, .-bluegl_glLockArraysEXT .align 2 - .global bluegl_glBinormal3sEXT - .type bluegl_glBinormal3sEXT, %function -bluegl_glBinormal3sEXT: - adrp x16, :got:__blue_glCore_glBinormal3sEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3sEXT] + .global bluegl_glUnlockArraysEXT + .type bluegl_glUnlockArraysEXT, %function +bluegl_glUnlockArraysEXT: + adrp x16, :got:__blue_glCore_glUnlockArraysEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glUnlockArraysEXT] ldr x16, [x16] br x16 - .size bluegl_glBinormal3sEXT, .-bluegl_glBinormal3sEXT + .size bluegl_glUnlockArraysEXT, .-bluegl_glUnlockArraysEXT .align 2 - .global bluegl_glVertexAttrib4d - .type bluegl_glVertexAttrib4d, %function -bluegl_glVertexAttrib4d: - adrp x16, :got:__blue_glCore_glVertexAttrib4d - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4d] + .global bluegl_glConvolutionFilter1DEXT + .type bluegl_glConvolutionFilter1DEXT, %function +bluegl_glConvolutionFilter1DEXT: + adrp x16, :got:__blue_glCore_glConvolutionFilter1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionFilter1DEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4d, .-bluegl_glVertexAttrib4d + .size bluegl_glConvolutionFilter1DEXT, .-bluegl_glConvolutionFilter1DEXT .align 2 - .global bluegl_glEndTransformFeedbackEXT - .type bluegl_glEndTransformFeedbackEXT, %function -bluegl_glEndTransformFeedbackEXT: - adrp x16, :got:__blue_glCore_glEndTransformFeedbackEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glEndTransformFeedbackEXT] + .global bluegl_glConvolutionFilter2DEXT + .type bluegl_glConvolutionFilter2DEXT, %function +bluegl_glConvolutionFilter2DEXT: + adrp x16, :got:__blue_glCore_glConvolutionFilter2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionFilter2DEXT] ldr x16, [x16] br x16 - .size bluegl_glEndTransformFeedbackEXT, .-bluegl_glEndTransformFeedbackEXT + .size bluegl_glConvolutionFilter2DEXT, .-bluegl_glConvolutionFilter2DEXT .align 2 - .global bluegl_glTexImage2DMultisample - .type bluegl_glTexImage2DMultisample, %function -bluegl_glTexImage2DMultisample: - adrp x16, :got:__blue_glCore_glTexImage2DMultisample - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexImage2DMultisample] + .global bluegl_glConvolutionParameterfEXT + .type bluegl_glConvolutionParameterfEXT, %function +bluegl_glConvolutionParameterfEXT: + adrp x16, :got:__blue_glCore_glConvolutionParameterfEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameterfEXT] ldr x16, [x16] br x16 - .size bluegl_glTexImage2DMultisample, .-bluegl_glTexImage2DMultisample + .size bluegl_glConvolutionParameterfEXT, .-bluegl_glConvolutionParameterfEXT .align 2 - .global bluegl_glLoadMatrixxOES - .type bluegl_glLoadMatrixxOES, %function -bluegl_glLoadMatrixxOES: - adrp x16, :got:__blue_glCore_glLoadMatrixxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glLoadMatrixxOES] + .global bluegl_glConvolutionParameterfvEXT + .type bluegl_glConvolutionParameterfvEXT, %function +bluegl_glConvolutionParameterfvEXT: + adrp x16, :got:__blue_glCore_glConvolutionParameterfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameterfvEXT] ldr x16, [x16] br x16 - .size bluegl_glLoadMatrixxOES, .-bluegl_glLoadMatrixxOES + .size bluegl_glConvolutionParameterfvEXT, .-bluegl_glConvolutionParameterfvEXT .align 2 - .global bluegl_glGetUniformfv - .type bluegl_glGetUniformfv, %function -bluegl_glGetUniformfv: - adrp x16, :got:__blue_glCore_glGetUniformfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformfv] + .global bluegl_glConvolutionParameteriEXT + .type bluegl_glConvolutionParameteriEXT, %function +bluegl_glConvolutionParameteriEXT: + adrp x16, :got:__blue_glCore_glConvolutionParameteriEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameteriEXT] ldr x16, [x16] br x16 - .size bluegl_glGetUniformfv, .-bluegl_glGetUniformfv + .size bluegl_glConvolutionParameteriEXT, .-bluegl_glConvolutionParameteriEXT .align 2 - .global bluegl_glStartInstrumentsSGIX - .type bluegl_glStartInstrumentsSGIX, %function -bluegl_glStartInstrumentsSGIX: - adrp x16, :got:__blue_glCore_glStartInstrumentsSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glStartInstrumentsSGIX] + .global bluegl_glConvolutionParameterivEXT + .type bluegl_glConvolutionParameterivEXT, %function +bluegl_glConvolutionParameterivEXT: + adrp x16, :got:__blue_glCore_glConvolutionParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glStartInstrumentsSGIX, .-bluegl_glStartInstrumentsSGIX + .size bluegl_glConvolutionParameterivEXT, .-bluegl_glConvolutionParameterivEXT .align 2 - .global bluegl_glColor4ubVertex3fvSUN - .type bluegl_glColor4ubVertex3fvSUN, %function -bluegl_glColor4ubVertex3fvSUN: - adrp x16, :got:__blue_glCore_glColor4ubVertex3fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4ubVertex3fvSUN] + .global bluegl_glCopyConvolutionFilter1DEXT + .type bluegl_glCopyConvolutionFilter1DEXT, %function +bluegl_glCopyConvolutionFilter1DEXT: + adrp x16, :got:__blue_glCore_glCopyConvolutionFilter1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyConvolutionFilter1DEXT] ldr x16, [x16] br x16 - .size bluegl_glColor4ubVertex3fvSUN, .-bluegl_glColor4ubVertex3fvSUN + .size bluegl_glCopyConvolutionFilter1DEXT, .-bluegl_glCopyConvolutionFilter1DEXT .align 2 - .global bluegl_glMatrixLoadTransposefEXT - .type bluegl_glMatrixLoadTransposefEXT, %function -bluegl_glMatrixLoadTransposefEXT: - adrp x16, :got:__blue_glCore_glMatrixLoadTransposefEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixLoadTransposefEXT] + .global bluegl_glCopyConvolutionFilter2DEXT + .type bluegl_glCopyConvolutionFilter2DEXT, %function +bluegl_glCopyConvolutionFilter2DEXT: + adrp x16, :got:__blue_glCore_glCopyConvolutionFilter2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyConvolutionFilter2DEXT] ldr x16, [x16] br x16 - .size bluegl_glMatrixLoadTransposefEXT, .-bluegl_glMatrixLoadTransposefEXT + .size bluegl_glCopyConvolutionFilter2DEXT, .-bluegl_glCopyConvolutionFilter2DEXT .align 2 - .global bluegl_glGetCompressedTexImage - .type bluegl_glGetCompressedTexImage, %function -bluegl_glGetCompressedTexImage: - adrp x16, :got:__blue_glCore_glGetCompressedTexImage - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCompressedTexImage] + .global bluegl_glGetConvolutionFilterEXT + .type bluegl_glGetConvolutionFilterEXT, %function +bluegl_glGetConvolutionFilterEXT: + adrp x16, :got:__blue_glCore_glGetConvolutionFilterEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetConvolutionFilterEXT] ldr x16, [x16] br x16 - .size bluegl_glGetCompressedTexImage, .-bluegl_glGetCompressedTexImage + .size bluegl_glGetConvolutionFilterEXT, .-bluegl_glGetConvolutionFilterEXT .align 2 - .global bluegl_glGetNamedProgramLocalParameterdvEXT - .type bluegl_glGetNamedProgramLocalParameterdvEXT, %function -bluegl_glGetNamedProgramLocalParameterdvEXT: - adrp x16, :got:__blue_glCore_glGetNamedProgramLocalParameterdvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedProgramLocalParameterdvEXT] + .global bluegl_glGetConvolutionParameterfvEXT + .type bluegl_glGetConvolutionParameterfvEXT, %function +bluegl_glGetConvolutionParameterfvEXT: + adrp x16, :got:__blue_glCore_glGetConvolutionParameterfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetConvolutionParameterfvEXT] ldr x16, [x16] br x16 - .size bluegl_glGetNamedProgramLocalParameterdvEXT, .-bluegl_glGetNamedProgramLocalParameterdvEXT + .size bluegl_glGetConvolutionParameterfvEXT, .-bluegl_glGetConvolutionParameterfvEXT .align 2 - .global bluegl_glColorPointerEXT - .type bluegl_glColorPointerEXT, %function -bluegl_glColorPointerEXT: - adrp x16, :got:__blue_glCore_glColorPointerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorPointerEXT] + .global bluegl_glGetConvolutionParameterivEXT + .type bluegl_glGetConvolutionParameterivEXT, %function +bluegl_glGetConvolutionParameterivEXT: + adrp x16, :got:__blue_glCore_glGetConvolutionParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetConvolutionParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glColorPointerEXT, .-bluegl_glColorPointerEXT + .size bluegl_glGetConvolutionParameterivEXT, .-bluegl_glGetConvolutionParameterivEXT .align 2 - .global bluegl_glTangent3fEXT - .type bluegl_glTangent3fEXT, %function -bluegl_glTangent3fEXT: - adrp x16, :got:__blue_glCore_glTangent3fEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3fEXT] + .global bluegl_glGetSeparableFilterEXT + .type bluegl_glGetSeparableFilterEXT, %function +bluegl_glGetSeparableFilterEXT: + adrp x16, :got:__blue_glCore_glGetSeparableFilterEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSeparableFilterEXT] ldr x16, [x16] br x16 - .size bluegl_glTangent3fEXT, .-bluegl_glTangent3fEXT + .size bluegl_glGetSeparableFilterEXT, .-bluegl_glGetSeparableFilterEXT .align 2 - .global bluegl_glWindowPos2dvARB - .type bluegl_glWindowPos2dvARB, %function -bluegl_glWindowPos2dvARB: - adrp x16, :got:__blue_glCore_glWindowPos2dvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2dvARB] + .global bluegl_glSeparableFilter2DEXT + .type bluegl_glSeparableFilter2DEXT, %function +bluegl_glSeparableFilter2DEXT: + adrp x16, :got:__blue_glCore_glSeparableFilter2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSeparableFilter2DEXT] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2dvARB, .-bluegl_glWindowPos2dvARB + .size bluegl_glSeparableFilter2DEXT, .-bluegl_glSeparableFilter2DEXT .align 2 - .global bluegl_glGetInvariantIntegervEXT - .type bluegl_glGetInvariantIntegervEXT, %function -bluegl_glGetInvariantIntegervEXT: - adrp x16, :got:__blue_glCore_glGetInvariantIntegervEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInvariantIntegervEXT] + .global bluegl_glTangent3bEXT + .type bluegl_glTangent3bEXT, %function +bluegl_glTangent3bEXT: + adrp x16, :got:__blue_glCore_glTangent3bEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3bEXT] + ldr x16, [x16] + br x16 + .size bluegl_glTangent3bEXT, .-bluegl_glTangent3bEXT + + .align 2 + .global bluegl_glTangent3bvEXT + .type bluegl_glTangent3bvEXT, %function +bluegl_glTangent3bvEXT: + adrp x16, :got:__blue_glCore_glTangent3bvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3bvEXT] ldr x16, [x16] br x16 - .size bluegl_glGetInvariantIntegervEXT, .-bluegl_glGetInvariantIntegervEXT + .size bluegl_glTangent3bvEXT, .-bluegl_glTangent3bvEXT .align 2 - .global bluegl_glProgramUniform3fEXT - .type bluegl_glProgramUniform3fEXT, %function -bluegl_glProgramUniform3fEXT: - adrp x16, :got:__blue_glCore_glProgramUniform3fEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3fEXT] + .global bluegl_glTangent3dEXT + .type bluegl_glTangent3dEXT, %function +bluegl_glTangent3dEXT: + adrp x16, :got:__blue_glCore_glTangent3dEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3dEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3fEXT, .-bluegl_glProgramUniform3fEXT + .size bluegl_glTangent3dEXT, .-bluegl_glTangent3dEXT .align 2 - .global bluegl_glPixelTexGenSGIX - .type bluegl_glPixelTexGenSGIX, %function -bluegl_glPixelTexGenSGIX: - adrp x16, :got:__blue_glCore_glPixelTexGenSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTexGenSGIX] + .global bluegl_glTangent3dvEXT + .type bluegl_glTangent3dvEXT, %function +bluegl_glTangent3dvEXT: + adrp x16, :got:__blue_glCore_glTangent3dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3dvEXT] ldr x16, [x16] br x16 - .size bluegl_glPixelTexGenSGIX, .-bluegl_glPixelTexGenSGIX + .size bluegl_glTangent3dvEXT, .-bluegl_glTangent3dvEXT .align 2 - .global bluegl_glClampColor - .type bluegl_glClampColor, %function -bluegl_glClampColor: - adrp x16, :got:__blue_glCore_glClampColor - ldr x16, [x16, #:got_lo12:__blue_glCore_glClampColor] + .global bluegl_glTangent3fEXT + .type bluegl_glTangent3fEXT, %function +bluegl_glTangent3fEXT: + adrp x16, :got:__blue_glCore_glTangent3fEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3fEXT] ldr x16, [x16] br x16 - .size bluegl_glClampColor, .-bluegl_glClampColor + .size bluegl_glTangent3fEXT, .-bluegl_glTangent3fEXT .align 2 - .global bluegl_glVertexAttribs4hvNV - .type bluegl_glVertexAttribs4hvNV, %function -bluegl_glVertexAttribs4hvNV: - adrp x16, :got:__blue_glCore_glVertexAttribs4hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs4hvNV] + .global bluegl_glTangent3fvEXT + .type bluegl_glTangent3fvEXT, %function +bluegl_glTangent3fvEXT: + adrp x16, :got:__blue_glCore_glTangent3fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3fvEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribs4hvNV, .-bluegl_glVertexAttribs4hvNV + .size bluegl_glTangent3fvEXT, .-bluegl_glTangent3fvEXT .align 2 - .global bluegl_glGetIntegeri_v - .type bluegl_glGetIntegeri_v, %function -bluegl_glGetIntegeri_v: - adrp x16, :got:__blue_glCore_glGetIntegeri_v - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetIntegeri_v] + .global bluegl_glTangent3iEXT + .type bluegl_glTangent3iEXT, %function +bluegl_glTangent3iEXT: + adrp x16, :got:__blue_glCore_glTangent3iEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3iEXT] ldr x16, [x16] br x16 - .size bluegl_glGetIntegeri_v, .-bluegl_glGetIntegeri_v + .size bluegl_glTangent3iEXT, .-bluegl_glTangent3iEXT .align 2 - .global bluegl_glDeleteVertexArraysAPPLE - .type bluegl_glDeleteVertexArraysAPPLE, %function -bluegl_glDeleteVertexArraysAPPLE: - adrp x16, :got:__blue_glCore_glDeleteVertexArraysAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteVertexArraysAPPLE] + .global bluegl_glTangent3ivEXT + .type bluegl_glTangent3ivEXT, %function +bluegl_glTangent3ivEXT: + adrp x16, :got:__blue_glCore_glTangent3ivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3ivEXT] ldr x16, [x16] br x16 - .size bluegl_glDeleteVertexArraysAPPLE, .-bluegl_glDeleteVertexArraysAPPLE + .size bluegl_glTangent3ivEXT, .-bluegl_glTangent3ivEXT .align 2 - .global bluegl_glGetAttachedShaders - .type bluegl_glGetAttachedShaders, %function -bluegl_glGetAttachedShaders: - adrp x16, :got:__blue_glCore_glGetAttachedShaders - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetAttachedShaders] + .global bluegl_glTangent3sEXT + .type bluegl_glTangent3sEXT, %function +bluegl_glTangent3sEXT: + adrp x16, :got:__blue_glCore_glTangent3sEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3sEXT] ldr x16, [x16] br x16 - .size bluegl_glGetAttachedShaders, .-bluegl_glGetAttachedShaders + .size bluegl_glTangent3sEXT, .-bluegl_glTangent3sEXT .align 2 - .global bluegl_glEndTransformFeedbackNV - .type bluegl_glEndTransformFeedbackNV, %function -bluegl_glEndTransformFeedbackNV: - adrp x16, :got:__blue_glCore_glEndTransformFeedbackNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glEndTransformFeedbackNV] + .global bluegl_glTangent3svEXT + .type bluegl_glTangent3svEXT, %function +bluegl_glTangent3svEXT: + adrp x16, :got:__blue_glCore_glTangent3svEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3svEXT] ldr x16, [x16] br x16 - .size bluegl_glEndTransformFeedbackNV, .-bluegl_glEndTransformFeedbackNV + .size bluegl_glTangent3svEXT, .-bluegl_glTangent3svEXT .align 2 - .global bluegl_glGetColorTableParameterfvSGI - .type bluegl_glGetColorTableParameterfvSGI, %function -bluegl_glGetColorTableParameterfvSGI: - adrp x16, :got:__blue_glCore_glGetColorTableParameterfvSGI - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetColorTableParameterfvSGI] + .global bluegl_glBinormal3bEXT + .type bluegl_glBinormal3bEXT, %function +bluegl_glBinormal3bEXT: + adrp x16, :got:__blue_glCore_glBinormal3bEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3bEXT] ldr x16, [x16] br x16 - .size bluegl_glGetColorTableParameterfvSGI, .-bluegl_glGetColorTableParameterfvSGI + .size bluegl_glBinormal3bEXT, .-bluegl_glBinormal3bEXT .align 2 - .global bluegl_glBindBufferBase - .type bluegl_glBindBufferBase, %function -bluegl_glBindBufferBase: - adrp x16, :got:__blue_glCore_glBindBufferBase - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBufferBase] + .global bluegl_glBinormal3bvEXT + .type bluegl_glBinormal3bvEXT, %function +bluegl_glBinormal3bvEXT: + adrp x16, :got:__blue_glCore_glBinormal3bvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3bvEXT] ldr x16, [x16] br x16 - .size bluegl_glBindBufferBase, .-bluegl_glBindBufferBase + .size bluegl_glBinormal3bvEXT, .-bluegl_glBinormal3bvEXT .align 2 - .global bluegl_glDeleteSync - .type bluegl_glDeleteSync, %function -bluegl_glDeleteSync: - adrp x16, :got:__blue_glCore_glDeleteSync - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteSync] + .global bluegl_glBinormal3dEXT + .type bluegl_glBinormal3dEXT, %function +bluegl_glBinormal3dEXT: + adrp x16, :got:__blue_glCore_glBinormal3dEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3dEXT] ldr x16, [x16] br x16 - .size bluegl_glDeleteSync, .-bluegl_glDeleteSync + .size bluegl_glBinormal3dEXT, .-bluegl_glBinormal3dEXT .align 2 - .global bluegl_glGetTransformFeedbackVarying - .type bluegl_glGetTransformFeedbackVarying, %function -bluegl_glGetTransformFeedbackVarying: - adrp x16, :got:__blue_glCore_glGetTransformFeedbackVarying - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTransformFeedbackVarying] + .global bluegl_glBinormal3dvEXT + .type bluegl_glBinormal3dvEXT, %function +bluegl_glBinormal3dvEXT: + adrp x16, :got:__blue_glCore_glBinormal3dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3dvEXT] ldr x16, [x16] br x16 - .size bluegl_glGetTransformFeedbackVarying, .-bluegl_glGetTransformFeedbackVarying + .size bluegl_glBinormal3dvEXT, .-bluegl_glBinormal3dvEXT .align 2 - .global bluegl_glVertexAttrib1svARB - .type bluegl_glVertexAttrib1svARB, %function -bluegl_glVertexAttrib1svARB: - adrp x16, :got:__blue_glCore_glVertexAttrib1svARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1svARB] + .global bluegl_glBinormal3fEXT + .type bluegl_glBinormal3fEXT, %function +bluegl_glBinormal3fEXT: + adrp x16, :got:__blue_glCore_glBinormal3fEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3fEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1svARB, .-bluegl_glVertexAttrib1svARB + .size bluegl_glBinormal3fEXT, .-bluegl_glBinormal3fEXT .align 2 - .global bluegl_glCopyPathNV - .type bluegl_glCopyPathNV, %function -bluegl_glCopyPathNV: - adrp x16, :got:__blue_glCore_glCopyPathNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyPathNV] + .global bluegl_glBinormal3fvEXT + .type bluegl_glBinormal3fvEXT, %function +bluegl_glBinormal3fvEXT: + adrp x16, :got:__blue_glCore_glBinormal3fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3fvEXT] ldr x16, [x16] br x16 - .size bluegl_glCopyPathNV, .-bluegl_glCopyPathNV + .size bluegl_glBinormal3fvEXT, .-bluegl_glBinormal3fvEXT .align 2 - .global bluegl_glBindTransformFeedback - .type bluegl_glBindTransformFeedback, %function -bluegl_glBindTransformFeedback: - adrp x16, :got:__blue_glCore_glBindTransformFeedback - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindTransformFeedback] + .global bluegl_glBinormal3iEXT + .type bluegl_glBinormal3iEXT, %function +bluegl_glBinormal3iEXT: + adrp x16, :got:__blue_glCore_glBinormal3iEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3iEXT] ldr x16, [x16] br x16 - .size bluegl_glBindTransformFeedback, .-bluegl_glBindTransformFeedback + .size bluegl_glBinormal3iEXT, .-bluegl_glBinormal3iEXT .align 2 - .global bluegl_glVertexAttrib4usv - .type bluegl_glVertexAttrib4usv, %function -bluegl_glVertexAttrib4usv: - adrp x16, :got:__blue_glCore_glVertexAttrib4usv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4usv] + .global bluegl_glBinormal3ivEXT + .type bluegl_glBinormal3ivEXT, %function +bluegl_glBinormal3ivEXT: + adrp x16, :got:__blue_glCore_glBinormal3ivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3ivEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4usv, .-bluegl_glVertexAttrib4usv + .size bluegl_glBinormal3ivEXT, .-bluegl_glBinormal3ivEXT .align 2 - .global bluegl_glCompressedMultiTexImage3DEXT - .type bluegl_glCompressedMultiTexImage3DEXT, %function -bluegl_glCompressedMultiTexImage3DEXT: - adrp x16, :got:__blue_glCore_glCompressedMultiTexImage3DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedMultiTexImage3DEXT] + .global bluegl_glBinormal3sEXT + .type bluegl_glBinormal3sEXT, %function +bluegl_glBinormal3sEXT: + adrp x16, :got:__blue_glCore_glBinormal3sEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3sEXT] ldr x16, [x16] br x16 - .size bluegl_glCompressedMultiTexImage3DEXT, .-bluegl_glCompressedMultiTexImage3DEXT + .size bluegl_glBinormal3sEXT, .-bluegl_glBinormal3sEXT .align 2 - .global bluegl_glMatrixLoadTranspose3x3fNV - .type bluegl_glMatrixLoadTranspose3x3fNV, %function -bluegl_glMatrixLoadTranspose3x3fNV: - adrp x16, :got:__blue_glCore_glMatrixLoadTranspose3x3fNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixLoadTranspose3x3fNV] + .global bluegl_glBinormal3svEXT + .type bluegl_glBinormal3svEXT, %function +bluegl_glBinormal3svEXT: + adrp x16, :got:__blue_glCore_glBinormal3svEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3svEXT] ldr x16, [x16] br x16 - .size bluegl_glMatrixLoadTranspose3x3fNV, .-bluegl_glMatrixLoadTranspose3x3fNV + .size bluegl_glBinormal3svEXT, .-bluegl_glBinormal3svEXT .align 2 - .global bluegl_glVertexStream1sATI - .type bluegl_glVertexStream1sATI, %function -bluegl_glVertexStream1sATI: - adrp x16, :got:__blue_glCore_glVertexStream1sATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream1sATI] + .global bluegl_glTangentPointerEXT + .type bluegl_glTangentPointerEXT, %function +bluegl_glTangentPointerEXT: + adrp x16, :got:__blue_glCore_glTangentPointerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTangentPointerEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexStream1sATI, .-bluegl_glVertexStream1sATI + .size bluegl_glTangentPointerEXT, .-bluegl_glTangentPointerEXT .align 2 - .global bluegl_glMultiDrawArraysIndirectBindlessNV - .type bluegl_glMultiDrawArraysIndirectBindlessNV, %function -bluegl_glMultiDrawArraysIndirectBindlessNV: - adrp x16, :got:__blue_glCore_glMultiDrawArraysIndirectBindlessNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawArraysIndirectBindlessNV] + .global bluegl_glBinormalPointerEXT + .type bluegl_glBinormalPointerEXT, %function +bluegl_glBinormalPointerEXT: + adrp x16, :got:__blue_glCore_glBinormalPointerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormalPointerEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiDrawArraysIndirectBindlessNV, .-bluegl_glMultiDrawArraysIndirectBindlessNV + .size bluegl_glBinormalPointerEXT, .-bluegl_glBinormalPointerEXT .align 2 - .global bluegl_glTexParameterIuiv - .type bluegl_glTexParameterIuiv, %function -bluegl_glTexParameterIuiv: - adrp x16, :got:__blue_glCore_glTexParameterIuiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameterIuiv] + .global bluegl_glCopyTexImage1DEXT + .type bluegl_glCopyTexImage1DEXT, %function +bluegl_glCopyTexImage1DEXT: + adrp x16, :got:__blue_glCore_glCopyTexImage1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexImage1DEXT] ldr x16, [x16] br x16 - .size bluegl_glTexParameterIuiv, .-bluegl_glTexParameterIuiv + .size bluegl_glCopyTexImage1DEXT, .-bluegl_glCopyTexImage1DEXT .align 2 - .global bluegl_glVDPAUFiniNV - .type bluegl_glVDPAUFiniNV, %function -bluegl_glVDPAUFiniNV: - adrp x16, :got:__blue_glCore_glVDPAUFiniNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAUFiniNV] + .global bluegl_glCopyTexImage2DEXT + .type bluegl_glCopyTexImage2DEXT, %function +bluegl_glCopyTexImage2DEXT: + adrp x16, :got:__blue_glCore_glCopyTexImage2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexImage2DEXT] ldr x16, [x16] br x16 - .size bluegl_glVDPAUFiniNV, .-bluegl_glVDPAUFiniNV + .size bluegl_glCopyTexImage2DEXT, .-bluegl_glCopyTexImage2DEXT .align 2 - .global bluegl_glUniform1iv - .type bluegl_glUniform1iv, %function -bluegl_glUniform1iv: - adrp x16, :got:__blue_glCore_glUniform1iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1iv] + .global bluegl_glCopyTexSubImage1DEXT + .type bluegl_glCopyTexSubImage1DEXT, %function +bluegl_glCopyTexSubImage1DEXT: + adrp x16, :got:__blue_glCore_glCopyTexSubImage1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexSubImage1DEXT] ldr x16, [x16] br x16 - .size bluegl_glUniform1iv, .-bluegl_glUniform1iv + .size bluegl_glCopyTexSubImage1DEXT, .-bluegl_glCopyTexSubImage1DEXT .align 2 - .global bluegl_glStencilThenCoverStrokePathNV - .type bluegl_glStencilThenCoverStrokePathNV, %function -bluegl_glStencilThenCoverStrokePathNV: - adrp x16, :got:__blue_glCore_glStencilThenCoverStrokePathNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilThenCoverStrokePathNV] + .global bluegl_glCopyTexSubImage2DEXT + .type bluegl_glCopyTexSubImage2DEXT, %function +bluegl_glCopyTexSubImage2DEXT: + adrp x16, :got:__blue_glCore_glCopyTexSubImage2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexSubImage2DEXT] ldr x16, [x16] br x16 - .size bluegl_glStencilThenCoverStrokePathNV, .-bluegl_glStencilThenCoverStrokePathNV + .size bluegl_glCopyTexSubImage2DEXT, .-bluegl_glCopyTexSubImage2DEXT .align 2 - .global bluegl_glUniform3i64vNV - .type bluegl_glUniform3i64vNV, %function -bluegl_glUniform3i64vNV: - adrp x16, :got:__blue_glCore_glUniform3i64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3i64vNV] + .global bluegl_glCopyTexSubImage3DEXT + .type bluegl_glCopyTexSubImage3DEXT, %function +bluegl_glCopyTexSubImage3DEXT: + adrp x16, :got:__blue_glCore_glCopyTexSubImage3DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexSubImage3DEXT] ldr x16, [x16] br x16 - .size bluegl_glUniform3i64vNV, .-bluegl_glUniform3i64vNV + .size bluegl_glCopyTexSubImage3DEXT, .-bluegl_glCopyTexSubImage3DEXT .align 2 - .global bluegl_glGetFragDataLocationEXT - .type bluegl_glGetFragDataLocationEXT, %function -bluegl_glGetFragDataLocationEXT: - adrp x16, :got:__blue_glCore_glGetFragDataLocationEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFragDataLocationEXT] + .global bluegl_glCullParameterdvEXT + .type bluegl_glCullParameterdvEXT, %function +bluegl_glCullParameterdvEXT: + adrp x16, :got:__blue_glCore_glCullParameterdvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCullParameterdvEXT] ldr x16, [x16] br x16 - .size bluegl_glGetFragDataLocationEXT, .-bluegl_glGetFragDataLocationEXT + .size bluegl_glCullParameterdvEXT, .-bluegl_glCullParameterdvEXT .align 2 - .global bluegl_glProgramUniformMatrix4dv - .type bluegl_glProgramUniformMatrix4dv, %function -bluegl_glProgramUniformMatrix4dv: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix4dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4dv] + .global bluegl_glCullParameterfvEXT + .type bluegl_glCullParameterfvEXT, %function +bluegl_glCullParameterfvEXT: + adrp x16, :got:__blue_glCore_glCullParameterfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCullParameterfvEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix4dv, .-bluegl_glProgramUniformMatrix4dv + .size bluegl_glCullParameterfvEXT, .-bluegl_glCullParameterfvEXT .align 2 - .global bluegl_glGetnUniformiv - .type bluegl_glGetnUniformiv, %function -bluegl_glGetnUniformiv: - adrp x16, :got:__blue_glCore_glGetnUniformiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformiv] + .global bluegl_glLabelObjectEXT + .type bluegl_glLabelObjectEXT, %function +bluegl_glLabelObjectEXT: + adrp x16, :got:__blue_glCore_glLabelObjectEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glLabelObjectEXT] ldr x16, [x16] br x16 - .size bluegl_glGetnUniformiv, .-bluegl_glGetnUniformiv + .size bluegl_glLabelObjectEXT, .-bluegl_glLabelObjectEXT .align 2 - .global bluegl_glMapBuffer - .type bluegl_glMapBuffer, %function -bluegl_glMapBuffer: - adrp x16, :got:__blue_glCore_glMapBuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glMapBuffer] + .global bluegl_glGetObjectLabelEXT + .type bluegl_glGetObjectLabelEXT, %function +bluegl_glGetObjectLabelEXT: + adrp x16, :got:__blue_glCore_glGetObjectLabelEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetObjectLabelEXT] ldr x16, [x16] br x16 - .size bluegl_glMapBuffer, .-bluegl_glMapBuffer + .size bluegl_glGetObjectLabelEXT, .-bluegl_glGetObjectLabelEXT .align 2 - .global bluegl_glScissorIndexed - .type bluegl_glScissorIndexed, %function -bluegl_glScissorIndexed: - adrp x16, :got:__blue_glCore_glScissorIndexed - ldr x16, [x16, #:got_lo12:__blue_glCore_glScissorIndexed] + .global bluegl_glInsertEventMarkerEXT + .type bluegl_glInsertEventMarkerEXT, %function +bluegl_glInsertEventMarkerEXT: + adrp x16, :got:__blue_glCore_glInsertEventMarkerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glInsertEventMarkerEXT] ldr x16, [x16] br x16 - .size bluegl_glScissorIndexed, .-bluegl_glScissorIndexed + .size bluegl_glInsertEventMarkerEXT, .-bluegl_glInsertEventMarkerEXT .align 2 - .global bluegl_glUniform3fARB - .type bluegl_glUniform3fARB, %function -bluegl_glUniform3fARB: - adrp x16, :got:__blue_glCore_glUniform3fARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3fARB] + .global bluegl_glPushGroupMarkerEXT + .type bluegl_glPushGroupMarkerEXT, %function +bluegl_glPushGroupMarkerEXT: + adrp x16, :got:__blue_glCore_glPushGroupMarkerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glPushGroupMarkerEXT] ldr x16, [x16] br x16 - .size bluegl_glUniform3fARB, .-bluegl_glUniform3fARB + .size bluegl_glPushGroupMarkerEXT, .-bluegl_glPushGroupMarkerEXT .align 2 - .global bluegl_glGetColorTable - .type bluegl_glGetColorTable, %function -bluegl_glGetColorTable: - adrp x16, :got:__blue_glCore_glGetColorTable - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetColorTable] + .global bluegl_glPopGroupMarkerEXT + .type bluegl_glPopGroupMarkerEXT, %function +bluegl_glPopGroupMarkerEXT: + adrp x16, :got:__blue_glCore_glPopGroupMarkerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glPopGroupMarkerEXT] ldr x16, [x16] br x16 - .size bluegl_glGetColorTable, .-bluegl_glGetColorTable + .size bluegl_glPopGroupMarkerEXT, .-bluegl_glPopGroupMarkerEXT .align 2 - .global bluegl_glFramebufferTextureFaceARB - .type bluegl_glFramebufferTextureFaceARB, %function -bluegl_glFramebufferTextureFaceARB: - adrp x16, :got:__blue_glCore_glFramebufferTextureFaceARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTextureFaceARB] + .global bluegl_glDepthBoundsEXT + .type bluegl_glDepthBoundsEXT, %function +bluegl_glDepthBoundsEXT: + adrp x16, :got:__blue_glCore_glDepthBoundsEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthBoundsEXT] ldr x16, [x16] br x16 - .size bluegl_glFramebufferTextureFaceARB, .-bluegl_glFramebufferTextureFaceARB + .size bluegl_glDepthBoundsEXT, .-bluegl_glDepthBoundsEXT .align 2 - .global bluegl_glBeginTransformFeedbackEXT - .type bluegl_glBeginTransformFeedbackEXT, %function -bluegl_glBeginTransformFeedbackEXT: - adrp x16, :got:__blue_glCore_glBeginTransformFeedbackEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginTransformFeedbackEXT] + .global bluegl_glMatrixLoadfEXT + .type bluegl_glMatrixLoadfEXT, %function +bluegl_glMatrixLoadfEXT: + adrp x16, :got:__blue_glCore_glMatrixLoadfEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixLoadfEXT] ldr x16, [x16] br x16 - .size bluegl_glBeginTransformFeedbackEXT, .-bluegl_glBeginTransformFeedbackEXT + .size bluegl_glMatrixLoadfEXT, .-bluegl_glMatrixLoadfEXT .align 2 - .global bluegl_glGenFencesNV - .type bluegl_glGenFencesNV, %function -bluegl_glGenFencesNV: - adrp x16, :got:__blue_glCore_glGenFencesNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenFencesNV] + .global bluegl_glMatrixLoaddEXT + .type bluegl_glMatrixLoaddEXT, %function +bluegl_glMatrixLoaddEXT: + adrp x16, :got:__blue_glCore_glMatrixLoaddEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixLoaddEXT] ldr x16, [x16] br x16 - .size bluegl_glGenFencesNV, .-bluegl_glGenFencesNV + .size bluegl_glMatrixLoaddEXT, .-bluegl_glMatrixLoaddEXT .align 2 - .global bluegl_glMultiTexImage2DEXT - .type bluegl_glMultiTexImage2DEXT, %function -bluegl_glMultiTexImage2DEXT: - adrp x16, :got:__blue_glCore_glMultiTexImage2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexImage2DEXT] + .global bluegl_glMatrixMultfEXT + .type bluegl_glMatrixMultfEXT, %function +bluegl_glMatrixMultfEXT: + adrp x16, :got:__blue_glCore_glMatrixMultfEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixMultfEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexImage2DEXT, .-bluegl_glMultiTexImage2DEXT + .size bluegl_glMatrixMultfEXT, .-bluegl_glMatrixMultfEXT .align 2 - .global bluegl_glVertexAttrib2hNV - .type bluegl_glVertexAttrib2hNV, %function -bluegl_glVertexAttrib2hNV: - adrp x16, :got:__blue_glCore_glVertexAttrib2hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2hNV] + .global bluegl_glMatrixMultdEXT + .type bluegl_glMatrixMultdEXT, %function +bluegl_glMatrixMultdEXT: + adrp x16, :got:__blue_glCore_glMatrixMultdEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixMultdEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2hNV, .-bluegl_glVertexAttrib2hNV + .size bluegl_glMatrixMultdEXT, .-bluegl_glMatrixMultdEXT .align 2 - .global bluegl_glFragmentLightfvSGIX - .type bluegl_glFragmentLightfvSGIX, %function -bluegl_glFragmentLightfvSGIX: - adrp x16, :got:__blue_glCore_glFragmentLightfvSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentLightfvSGIX] + .global bluegl_glMatrixLoadIdentityEXT + .type bluegl_glMatrixLoadIdentityEXT, %function +bluegl_glMatrixLoadIdentityEXT: + adrp x16, :got:__blue_glCore_glMatrixLoadIdentityEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixLoadIdentityEXT] ldr x16, [x16] br x16 - .size bluegl_glFragmentLightfvSGIX, .-bluegl_glFragmentLightfvSGIX + .size bluegl_glMatrixLoadIdentityEXT, .-bluegl_glMatrixLoadIdentityEXT .align 2 - .global bluegl_glProgramUniform2iv - .type bluegl_glProgramUniform2iv, %function -bluegl_glProgramUniform2iv: - adrp x16, :got:__blue_glCore_glProgramUniform2iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2iv] + .global bluegl_glMatrixRotatefEXT + .type bluegl_glMatrixRotatefEXT, %function +bluegl_glMatrixRotatefEXT: + adrp x16, :got:__blue_glCore_glMatrixRotatefEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixRotatefEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2iv, .-bluegl_glProgramUniform2iv + .size bluegl_glMatrixRotatefEXT, .-bluegl_glMatrixRotatefEXT .align 2 - .global bluegl_glVertexAttribL4d - .type bluegl_glVertexAttribL4d, %function -bluegl_glVertexAttribL4d: - adrp x16, :got:__blue_glCore_glVertexAttribL4d - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL4d] + .global bluegl_glMatrixRotatedEXT + .type bluegl_glMatrixRotatedEXT, %function +bluegl_glMatrixRotatedEXT: + adrp x16, :got:__blue_glCore_glMatrixRotatedEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixRotatedEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL4d, .-bluegl_glVertexAttribL4d + .size bluegl_glMatrixRotatedEXT, .-bluegl_glMatrixRotatedEXT .align 2 - .global bluegl_glMapBufferARB - .type bluegl_glMapBufferARB, %function -bluegl_glMapBufferARB: - adrp x16, :got:__blue_glCore_glMapBufferARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMapBufferARB] + .global bluegl_glMatrixScalefEXT + .type bluegl_glMatrixScalefEXT, %function +bluegl_glMatrixScalefEXT: + adrp x16, :got:__blue_glCore_glMatrixScalefEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixScalefEXT] ldr x16, [x16] br x16 - .size bluegl_glMapBufferARB, .-bluegl_glMapBufferARB + .size bluegl_glMatrixScalefEXT, .-bluegl_glMatrixScalefEXT .align 2 - .global bluegl_glBindVideoCaptureStreamTextureNV - .type bluegl_glBindVideoCaptureStreamTextureNV, %function -bluegl_glBindVideoCaptureStreamTextureNV: - adrp x16, :got:__blue_glCore_glBindVideoCaptureStreamTextureNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindVideoCaptureStreamTextureNV] + .global bluegl_glMatrixScaledEXT + .type bluegl_glMatrixScaledEXT, %function +bluegl_glMatrixScaledEXT: + adrp x16, :got:__blue_glCore_glMatrixScaledEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixScaledEXT] + ldr x16, [x16] + br x16 + .size bluegl_glMatrixScaledEXT, .-bluegl_glMatrixScaledEXT + + .align 2 + .global bluegl_glMatrixTranslatefEXT + .type bluegl_glMatrixTranslatefEXT, %function +bluegl_glMatrixTranslatefEXT: + adrp x16, :got:__blue_glCore_glMatrixTranslatefEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixTranslatefEXT] ldr x16, [x16] br x16 - .size bluegl_glBindVideoCaptureStreamTextureNV, .-bluegl_glBindVideoCaptureStreamTextureNV + .size bluegl_glMatrixTranslatefEXT, .-bluegl_glMatrixTranslatefEXT .align 2 - .global bluegl_glConvolutionParameterxvOES - .type bluegl_glConvolutionParameterxvOES, %function -bluegl_glConvolutionParameterxvOES: - adrp x16, :got:__blue_glCore_glConvolutionParameterxvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameterxvOES] + .global bluegl_glMatrixTranslatedEXT + .type bluegl_glMatrixTranslatedEXT, %function +bluegl_glMatrixTranslatedEXT: + adrp x16, :got:__blue_glCore_glMatrixTranslatedEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixTranslatedEXT] ldr x16, [x16] br x16 - .size bluegl_glConvolutionParameterxvOES, .-bluegl_glConvolutionParameterxvOES + .size bluegl_glMatrixTranslatedEXT, .-bluegl_glMatrixTranslatedEXT .align 2 - .global bluegl_glTexParameterIuivEXT - .type bluegl_glTexParameterIuivEXT, %function -bluegl_glTexParameterIuivEXT: - adrp x16, :got:__blue_glCore_glTexParameterIuivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameterIuivEXT] + .global bluegl_glMatrixFrustumEXT + .type bluegl_glMatrixFrustumEXT, %function +bluegl_glMatrixFrustumEXT: + adrp x16, :got:__blue_glCore_glMatrixFrustumEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixFrustumEXT] ldr x16, [x16] br x16 - .size bluegl_glTexParameterIuivEXT, .-bluegl_glTexParameterIuivEXT + .size bluegl_glMatrixFrustumEXT, .-bluegl_glMatrixFrustumEXT .align 2 - .global bluegl_glVertexAttribI4ubv - .type bluegl_glVertexAttribI4ubv, %function -bluegl_glVertexAttribI4ubv: - adrp x16, :got:__blue_glCore_glVertexAttribI4ubv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4ubv] + .global bluegl_glMatrixOrthoEXT + .type bluegl_glMatrixOrthoEXT, %function +bluegl_glMatrixOrthoEXT: + adrp x16, :got:__blue_glCore_glMatrixOrthoEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixOrthoEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI4ubv, .-bluegl_glVertexAttribI4ubv + .size bluegl_glMatrixOrthoEXT, .-bluegl_glMatrixOrthoEXT .align 2 - .global bluegl_glTexSubImage1DEXT - .type bluegl_glTexSubImage1DEXT, %function -bluegl_glTexSubImage1DEXT: - adrp x16, :got:__blue_glCore_glTexSubImage1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexSubImage1DEXT] + .global bluegl_glMatrixPopEXT + .type bluegl_glMatrixPopEXT, %function +bluegl_glMatrixPopEXT: + adrp x16, :got:__blue_glCore_glMatrixPopEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixPopEXT] ldr x16, [x16] br x16 - .size bluegl_glTexSubImage1DEXT, .-bluegl_glTexSubImage1DEXT + .size bluegl_glMatrixPopEXT, .-bluegl_glMatrixPopEXT .align 2 - .global bluegl_glTextureStorage2DEXT - .type bluegl_glTextureStorage2DEXT, %function -bluegl_glTextureStorage2DEXT: - adrp x16, :got:__blue_glCore_glTextureStorage2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage2DEXT] + .global bluegl_glMatrixPushEXT + .type bluegl_glMatrixPushEXT, %function +bluegl_glMatrixPushEXT: + adrp x16, :got:__blue_glCore_glMatrixPushEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixPushEXT] ldr x16, [x16] br x16 - .size bluegl_glTextureStorage2DEXT, .-bluegl_glTextureStorage2DEXT + .size bluegl_glMatrixPushEXT, .-bluegl_glMatrixPushEXT .align 2 - .global bluegl_glTexSubImage3DEXT - .type bluegl_glTexSubImage3DEXT, %function -bluegl_glTexSubImage3DEXT: - adrp x16, :got:__blue_glCore_glTexSubImage3DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexSubImage3DEXT] + .global bluegl_glClientAttribDefaultEXT + .type bluegl_glClientAttribDefaultEXT, %function +bluegl_glClientAttribDefaultEXT: + adrp x16, :got:__blue_glCore_glClientAttribDefaultEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glClientAttribDefaultEXT] ldr x16, [x16] br x16 - .size bluegl_glTexSubImage3DEXT, .-bluegl_glTexSubImage3DEXT + .size bluegl_glClientAttribDefaultEXT, .-bluegl_glClientAttribDefaultEXT .align 2 - .global bluegl_glVertex2xvOES - .type bluegl_glVertex2xvOES, %function -bluegl_glVertex2xvOES: - adrp x16, :got:__blue_glCore_glVertex2xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex2xvOES] + .global bluegl_glPushClientAttribDefaultEXT + .type bluegl_glPushClientAttribDefaultEXT, %function +bluegl_glPushClientAttribDefaultEXT: + adrp x16, :got:__blue_glCore_glPushClientAttribDefaultEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glPushClientAttribDefaultEXT] ldr x16, [x16] br x16 - .size bluegl_glVertex2xvOES, .-bluegl_glVertex2xvOES + .size bluegl_glPushClientAttribDefaultEXT, .-bluegl_glPushClientAttribDefaultEXT .align 2 - .global bluegl_glGetMultiTexImageEXT - .type bluegl_glGetMultiTexImageEXT, %function -bluegl_glGetMultiTexImageEXT: - adrp x16, :got:__blue_glCore_glGetMultiTexImageEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexImageEXT] + .global bluegl_glTextureParameterfEXT + .type bluegl_glTextureParameterfEXT, %function +bluegl_glTextureParameterfEXT: + adrp x16, :got:__blue_glCore_glTextureParameterfEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameterfEXT] ldr x16, [x16] br x16 - .size bluegl_glGetMultiTexImageEXT, .-bluegl_glGetMultiTexImageEXT + .size bluegl_glTextureParameterfEXT, .-bluegl_glTextureParameterfEXT .align 2 - .global bluegl_glNormalStream3ivATI - .type bluegl_glNormalStream3ivATI, %function -bluegl_glNormalStream3ivATI: - adrp x16, :got:__blue_glCore_glNormalStream3ivATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3ivATI] + .global bluegl_glTextureParameterfvEXT + .type bluegl_glTextureParameterfvEXT, %function +bluegl_glTextureParameterfvEXT: + adrp x16, :got:__blue_glCore_glTextureParameterfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameterfvEXT] ldr x16, [x16] br x16 - .size bluegl_glNormalStream3ivATI, .-bluegl_glNormalStream3ivATI + .size bluegl_glTextureParameterfvEXT, .-bluegl_glTextureParameterfvEXT .align 2 - .global bluegl_glGetNamedBufferPointerv - .type bluegl_glGetNamedBufferPointerv, %function -bluegl_glGetNamedBufferPointerv: - adrp x16, :got:__blue_glCore_glGetNamedBufferPointerv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedBufferPointerv] + .global bluegl_glTextureParameteriEXT + .type bluegl_glTextureParameteriEXT, %function +bluegl_glTextureParameteriEXT: + adrp x16, :got:__blue_glCore_glTextureParameteriEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameteriEXT] ldr x16, [x16] br x16 - .size bluegl_glGetNamedBufferPointerv, .-bluegl_glGetNamedBufferPointerv + .size bluegl_glTextureParameteriEXT, .-bluegl_glTextureParameteriEXT .align 2 - .global bluegl_glTexBuffer - .type bluegl_glTexBuffer, %function -bluegl_glTexBuffer: - adrp x16, :got:__blue_glCore_glTexBuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexBuffer] + .global bluegl_glTextureParameterivEXT + .type bluegl_glTextureParameterivEXT, %function +bluegl_glTextureParameterivEXT: + adrp x16, :got:__blue_glCore_glTextureParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glTexBuffer, .-bluegl_glTexBuffer + .size bluegl_glTextureParameterivEXT, .-bluegl_glTextureParameterivEXT .align 2 - .global bluegl_glCombinerInputNV - .type bluegl_glCombinerInputNV, %function -bluegl_glCombinerInputNV: - adrp x16, :got:__blue_glCore_glCombinerInputNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCombinerInputNV] + .global bluegl_glTextureImage1DEXT + .type bluegl_glTextureImage1DEXT, %function +bluegl_glTextureImage1DEXT: + adrp x16, :got:__blue_glCore_glTextureImage1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureImage1DEXT] ldr x16, [x16] br x16 - .size bluegl_glCombinerInputNV, .-bluegl_glCombinerInputNV + .size bluegl_glTextureImage1DEXT, .-bluegl_glTextureImage1DEXT .align 2 - .global bluegl_glVertexAttrib1dARB - .type bluegl_glVertexAttrib1dARB, %function -bluegl_glVertexAttrib1dARB: - adrp x16, :got:__blue_glCore_glVertexAttrib1dARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1dARB] + .global bluegl_glTextureImage2DEXT + .type bluegl_glTextureImage2DEXT, %function +bluegl_glTextureImage2DEXT: + adrp x16, :got:__blue_glCore_glTextureImage2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureImage2DEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1dARB, .-bluegl_glVertexAttrib1dARB + .size bluegl_glTextureImage2DEXT, .-bluegl_glTextureImage2DEXT .align 2 - .global bluegl_glVertexP3ui - .type bluegl_glVertexP3ui, %function -bluegl_glVertexP3ui: - adrp x16, :got:__blue_glCore_glVertexP3ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexP3ui] + .global bluegl_glTextureSubImage1DEXT + .type bluegl_glTextureSubImage1DEXT, %function +bluegl_glTextureSubImage1DEXT: + adrp x16, :got:__blue_glCore_glTextureSubImage1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureSubImage1DEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexP3ui, .-bluegl_glVertexP3ui + .size bluegl_glTextureSubImage1DEXT, .-bluegl_glTextureSubImage1DEXT .align 2 - .global bluegl_glMatrixMult3x2fNV - .type bluegl_glMatrixMult3x2fNV, %function -bluegl_glMatrixMult3x2fNV: - adrp x16, :got:__blue_glCore_glMatrixMult3x2fNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixMult3x2fNV] + .global bluegl_glTextureSubImage2DEXT + .type bluegl_glTextureSubImage2DEXT, %function +bluegl_glTextureSubImage2DEXT: + adrp x16, :got:__blue_glCore_glTextureSubImage2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureSubImage2DEXT] ldr x16, [x16] br x16 - .size bluegl_glMatrixMult3x2fNV, .-bluegl_glMatrixMult3x2fNV + .size bluegl_glTextureSubImage2DEXT, .-bluegl_glTextureSubImage2DEXT .align 2 - .global bluegl_glNamedFramebufferTexture2DEXT - .type bluegl_glNamedFramebufferTexture2DEXT, %function -bluegl_glNamedFramebufferTexture2DEXT: - adrp x16, :got:__blue_glCore_glNamedFramebufferTexture2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferTexture2DEXT] + .global bluegl_glCopyTextureImage1DEXT + .type bluegl_glCopyTextureImage1DEXT, %function +bluegl_glCopyTextureImage1DEXT: + adrp x16, :got:__blue_glCore_glCopyTextureImage1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTextureImage1DEXT] ldr x16, [x16] br x16 - .size bluegl_glNamedFramebufferTexture2DEXT, .-bluegl_glNamedFramebufferTexture2DEXT + .size bluegl_glCopyTextureImage1DEXT, .-bluegl_glCopyTextureImage1DEXT .align 2 - .global bluegl_glGetTextureLevelParameteriv - .type bluegl_glGetTextureLevelParameteriv, %function -bluegl_glGetTextureLevelParameteriv: - adrp x16, :got:__blue_glCore_glGetTextureLevelParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureLevelParameteriv] + .global bluegl_glCopyTextureImage2DEXT + .type bluegl_glCopyTextureImage2DEXT, %function +bluegl_glCopyTextureImage2DEXT: + adrp x16, :got:__blue_glCore_glCopyTextureImage2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTextureImage2DEXT] ldr x16, [x16] br x16 - .size bluegl_glGetTextureLevelParameteriv, .-bluegl_glGetTextureLevelParameteriv + .size bluegl_glCopyTextureImage2DEXT, .-bluegl_glCopyTextureImage2DEXT .align 2 - .global bluegl_glPixelMapx - .type bluegl_glPixelMapx, %function -bluegl_glPixelMapx: - adrp x16, :got:__blue_glCore_glPixelMapx - ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelMapx] + .global bluegl_glCopyTextureSubImage1DEXT + .type bluegl_glCopyTextureSubImage1DEXT, %function +bluegl_glCopyTextureSubImage1DEXT: + adrp x16, :got:__blue_glCore_glCopyTextureSubImage1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTextureSubImage1DEXT] ldr x16, [x16] br x16 - .size bluegl_glPixelMapx, .-bluegl_glPixelMapx + .size bluegl_glCopyTextureSubImage1DEXT, .-bluegl_glCopyTextureSubImage1DEXT .align 2 - .global bluegl_glBlendFuncSeparatei - .type bluegl_glBlendFuncSeparatei, %function -bluegl_glBlendFuncSeparatei: - adrp x16, :got:__blue_glCore_glBlendFuncSeparatei - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFuncSeparatei] + .global bluegl_glCopyTextureSubImage2DEXT + .type bluegl_glCopyTextureSubImage2DEXT, %function +bluegl_glCopyTextureSubImage2DEXT: + adrp x16, :got:__blue_glCore_glCopyTextureSubImage2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTextureSubImage2DEXT] ldr x16, [x16] br x16 - .size bluegl_glBlendFuncSeparatei, .-bluegl_glBlendFuncSeparatei + .size bluegl_glCopyTextureSubImage2DEXT, .-bluegl_glCopyTextureSubImage2DEXT .align 2 - .global bluegl_glTessellationModeAMD - .type bluegl_glTessellationModeAMD, %function -bluegl_glTessellationModeAMD: - adrp x16, :got:__blue_glCore_glTessellationModeAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glTessellationModeAMD] + .global bluegl_glGetTextureImageEXT + .type bluegl_glGetTextureImageEXT, %function +bluegl_glGetTextureImageEXT: + adrp x16, :got:__blue_glCore_glGetTextureImageEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureImageEXT] ldr x16, [x16] br x16 - .size bluegl_glTessellationModeAMD, .-bluegl_glTessellationModeAMD + .size bluegl_glGetTextureImageEXT, .-bluegl_glGetTextureImageEXT .align 2 - .global bluegl_glProgramEnvParametersI4uivNV - .type bluegl_glProgramEnvParametersI4uivNV, %function -bluegl_glProgramEnvParametersI4uivNV: - adrp x16, :got:__blue_glCore_glProgramEnvParametersI4uivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParametersI4uivNV] + .global bluegl_glGetTextureParameterfvEXT + .type bluegl_glGetTextureParameterfvEXT, %function +bluegl_glGetTextureParameterfvEXT: + adrp x16, :got:__blue_glCore_glGetTextureParameterfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureParameterfvEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramEnvParametersI4uivNV, .-bluegl_glProgramEnvParametersI4uivNV + .size bluegl_glGetTextureParameterfvEXT, .-bluegl_glGetTextureParameterfvEXT .align 2 - .global bluegl_glGetColorTableParameterfvEXT - .type bluegl_glGetColorTableParameterfvEXT, %function -bluegl_glGetColorTableParameterfvEXT: - adrp x16, :got:__blue_glCore_glGetColorTableParameterfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetColorTableParameterfvEXT] + .global bluegl_glGetTextureParameterivEXT + .type bluegl_glGetTextureParameterivEXT, %function +bluegl_glGetTextureParameterivEXT: + adrp x16, :got:__blue_glCore_glGetTextureParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glGetColorTableParameterfvEXT, .-bluegl_glGetColorTableParameterfvEXT + .size bluegl_glGetTextureParameterivEXT, .-bluegl_glGetTextureParameterivEXT .align 2 - .global bluegl_glVertexAttribI1uiEXT - .type bluegl_glVertexAttribI1uiEXT, %function -bluegl_glVertexAttribI1uiEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI1uiEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI1uiEXT] + .global bluegl_glGetTextureLevelParameterfvEXT + .type bluegl_glGetTextureLevelParameterfvEXT, %function +bluegl_glGetTextureLevelParameterfvEXT: + adrp x16, :got:__blue_glCore_glGetTextureLevelParameterfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureLevelParameterfvEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI1uiEXT, .-bluegl_glVertexAttribI1uiEXT + .size bluegl_glGetTextureLevelParameterfvEXT, .-bluegl_glGetTextureLevelParameterfvEXT .align 2 - .global bluegl_glPrioritizeTexturesEXT - .type bluegl_glPrioritizeTexturesEXT, %function -bluegl_glPrioritizeTexturesEXT: - adrp x16, :got:__blue_glCore_glPrioritizeTexturesEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glPrioritizeTexturesEXT] + .global bluegl_glGetTextureLevelParameterivEXT + .type bluegl_glGetTextureLevelParameterivEXT, %function +bluegl_glGetTextureLevelParameterivEXT: + adrp x16, :got:__blue_glCore_glGetTextureLevelParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureLevelParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glPrioritizeTexturesEXT, .-bluegl_glPrioritizeTexturesEXT + .size bluegl_glGetTextureLevelParameterivEXT, .-bluegl_glGetTextureLevelParameterivEXT .align 2 - .global bluegl_glProgramUniform1i64vNV - .type bluegl_glProgramUniform1i64vNV, %function -bluegl_glProgramUniform1i64vNV: - adrp x16, :got:__blue_glCore_glProgramUniform1i64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1i64vNV] + .global bluegl_glTextureImage3DEXT + .type bluegl_glTextureImage3DEXT, %function +bluegl_glTextureImage3DEXT: + adrp x16, :got:__blue_glCore_glTextureImage3DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureImage3DEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1i64vNV, .-bluegl_glProgramUniform1i64vNV + .size bluegl_glTextureImage3DEXT, .-bluegl_glTextureImage3DEXT .align 2 - .global bluegl_glGetTextureParameteriv - .type bluegl_glGetTextureParameteriv, %function -bluegl_glGetTextureParameteriv: - adrp x16, :got:__blue_glCore_glGetTextureParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureParameteriv] + .global bluegl_glTextureSubImage3DEXT + .type bluegl_glTextureSubImage3DEXT, %function +bluegl_glTextureSubImage3DEXT: + adrp x16, :got:__blue_glCore_glTextureSubImage3DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureSubImage3DEXT] ldr x16, [x16] br x16 - .size bluegl_glGetTextureParameteriv, .-bluegl_glGetTextureParameteriv + .size bluegl_glTextureSubImage3DEXT, .-bluegl_glTextureSubImage3DEXT .align 2 - .global bluegl_glGetTransformFeedbackiv - .type bluegl_glGetTransformFeedbackiv, %function -bluegl_glGetTransformFeedbackiv: - adrp x16, :got:__blue_glCore_glGetTransformFeedbackiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTransformFeedbackiv] + .global bluegl_glCopyTextureSubImage3DEXT + .type bluegl_glCopyTextureSubImage3DEXT, %function +bluegl_glCopyTextureSubImage3DEXT: + adrp x16, :got:__blue_glCore_glCopyTextureSubImage3DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTextureSubImage3DEXT] ldr x16, [x16] br x16 - .size bluegl_glGetTransformFeedbackiv, .-bluegl_glGetTransformFeedbackiv + .size bluegl_glCopyTextureSubImage3DEXT, .-bluegl_glCopyTextureSubImage3DEXT .align 2 - .global bluegl_glMultiDrawArraysIndirectBindlessCountNV - .type bluegl_glMultiDrawArraysIndirectBindlessCountNV, %function -bluegl_glMultiDrawArraysIndirectBindlessCountNV: - adrp x16, :got:__blue_glCore_glMultiDrawArraysIndirectBindlessCountNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawArraysIndirectBindlessCountNV] + .global bluegl_glBindMultiTextureEXT + .type bluegl_glBindMultiTextureEXT, %function +bluegl_glBindMultiTextureEXT: + adrp x16, :got:__blue_glCore_glBindMultiTextureEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindMultiTextureEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiDrawArraysIndirectBindlessCountNV, .-bluegl_glMultiDrawArraysIndirectBindlessCountNV + .size bluegl_glBindMultiTextureEXT, .-bluegl_glBindMultiTextureEXT .align 2 - .global bluegl_glUseShaderProgramEXT - .type bluegl_glUseShaderProgramEXT, %function -bluegl_glUseShaderProgramEXT: - adrp x16, :got:__blue_glCore_glUseShaderProgramEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glUseShaderProgramEXT] + .global bluegl_glMultiTexCoordPointerEXT + .type bluegl_glMultiTexCoordPointerEXT, %function +bluegl_glMultiTexCoordPointerEXT: + adrp x16, :got:__blue_glCore_glMultiTexCoordPointerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoordPointerEXT] ldr x16, [x16] br x16 - .size bluegl_glUseShaderProgramEXT, .-bluegl_glUseShaderProgramEXT + .size bluegl_glMultiTexCoordPointerEXT, .-bluegl_glMultiTexCoordPointerEXT .align 2 - .global bluegl_glDeleteTransformFeedbacks - .type bluegl_glDeleteTransformFeedbacks, %function -bluegl_glDeleteTransformFeedbacks: - adrp x16, :got:__blue_glCore_glDeleteTransformFeedbacks - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteTransformFeedbacks] + .global bluegl_glMultiTexEnvfEXT + .type bluegl_glMultiTexEnvfEXT, %function +bluegl_glMultiTexEnvfEXT: + adrp x16, :got:__blue_glCore_glMultiTexEnvfEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexEnvfEXT] ldr x16, [x16] br x16 - .size bluegl_glDeleteTransformFeedbacks, .-bluegl_glDeleteTransformFeedbacks + .size bluegl_glMultiTexEnvfEXT, .-bluegl_glMultiTexEnvfEXT .align 2 - .global bluegl_glCoverageModulationTableNV - .type bluegl_glCoverageModulationTableNV, %function -bluegl_glCoverageModulationTableNV: - adrp x16, :got:__blue_glCore_glCoverageModulationTableNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCoverageModulationTableNV] + .global bluegl_glMultiTexEnvfvEXT + .type bluegl_glMultiTexEnvfvEXT, %function +bluegl_glMultiTexEnvfvEXT: + adrp x16, :got:__blue_glCore_glMultiTexEnvfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexEnvfvEXT] ldr x16, [x16] br x16 - .size bluegl_glCoverageModulationTableNV, .-bluegl_glCoverageModulationTableNV + .size bluegl_glMultiTexEnvfvEXT, .-bluegl_glMultiTexEnvfvEXT .align 2 - .global bluegl_glMultiTexCoord1d - .type bluegl_glMultiTexCoord1d, %function -bluegl_glMultiTexCoord1d: - adrp x16, :got:__blue_glCore_glMultiTexCoord1d - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1d] + .global bluegl_glMultiTexEnviEXT + .type bluegl_glMultiTexEnviEXT, %function +bluegl_glMultiTexEnviEXT: + adrp x16, :got:__blue_glCore_glMultiTexEnviEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexEnviEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1d, .-bluegl_glMultiTexCoord1d + .size bluegl_glMultiTexEnviEXT, .-bluegl_glMultiTexEnviEXT .align 2 - .global bluegl_glGetTexLevelParameteriv - .type bluegl_glGetTexLevelParameteriv, %function -bluegl_glGetTexLevelParameteriv: - adrp x16, :got:__blue_glCore_glGetTexLevelParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexLevelParameteriv] + .global bluegl_glMultiTexEnvivEXT + .type bluegl_glMultiTexEnvivEXT, %function +bluegl_glMultiTexEnvivEXT: + adrp x16, :got:__blue_glCore_glMultiTexEnvivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexEnvivEXT] ldr x16, [x16] br x16 - .size bluegl_glGetTexLevelParameteriv, .-bluegl_glGetTexLevelParameteriv + .size bluegl_glMultiTexEnvivEXT, .-bluegl_glMultiTexEnvivEXT .align 2 - .global bluegl_glProgramUniform4ui - .type bluegl_glProgramUniform4ui, %function -bluegl_glProgramUniform4ui: - adrp x16, :got:__blue_glCore_glProgramUniform4ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4ui] + .global bluegl_glMultiTexGendEXT + .type bluegl_glMultiTexGendEXT, %function +bluegl_glMultiTexGendEXT: + adrp x16, :got:__blue_glCore_glMultiTexGendEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexGendEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4ui, .-bluegl_glProgramUniform4ui + .size bluegl_glMultiTexGendEXT, .-bluegl_glMultiTexGendEXT .align 2 - .global bluegl_glProgramUniform4iv - .type bluegl_glProgramUniform4iv, %function -bluegl_glProgramUniform4iv: - adrp x16, :got:__blue_glCore_glProgramUniform4iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4iv] + .global bluegl_glMultiTexGendvEXT + .type bluegl_glMultiTexGendvEXT, %function +bluegl_glMultiTexGendvEXT: + adrp x16, :got:__blue_glCore_glMultiTexGendvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexGendvEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4iv, .-bluegl_glProgramUniform4iv + .size bluegl_glMultiTexGendvEXT, .-bluegl_glMultiTexGendvEXT .align 2 - .global bluegl_glTangent3fvEXT - .type bluegl_glTangent3fvEXT, %function -bluegl_glTangent3fvEXT: - adrp x16, :got:__blue_glCore_glTangent3fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3fvEXT] + .global bluegl_glMultiTexGenfEXT + .type bluegl_glMultiTexGenfEXT, %function +bluegl_glMultiTexGenfEXT: + adrp x16, :got:__blue_glCore_glMultiTexGenfEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexGenfEXT] ldr x16, [x16] br x16 - .size bluegl_glTangent3fvEXT, .-bluegl_glTangent3fvEXT + .size bluegl_glMultiTexGenfEXT, .-bluegl_glMultiTexGenfEXT .align 2 - .global bluegl_glViewportIndexedfv - .type bluegl_glViewportIndexedfv, %function -bluegl_glViewportIndexedfv: - adrp x16, :got:__blue_glCore_glViewportIndexedfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glViewportIndexedfv] + .global bluegl_glMultiTexGenfvEXT + .type bluegl_glMultiTexGenfvEXT, %function +bluegl_glMultiTexGenfvEXT: + adrp x16, :got:__blue_glCore_glMultiTexGenfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexGenfvEXT] ldr x16, [x16] br x16 - .size bluegl_glViewportIndexedfv, .-bluegl_glViewportIndexedfv + .size bluegl_glMultiTexGenfvEXT, .-bluegl_glMultiTexGenfvEXT .align 2 - .global bluegl_glSampleMaski - .type bluegl_glSampleMaski, %function -bluegl_glSampleMaski: - adrp x16, :got:__blue_glCore_glSampleMaski - ldr x16, [x16, #:got_lo12:__blue_glCore_glSampleMaski] + .global bluegl_glMultiTexGeniEXT + .type bluegl_glMultiTexGeniEXT, %function +bluegl_glMultiTexGeniEXT: + adrp x16, :got:__blue_glCore_glMultiTexGeniEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexGeniEXT] ldr x16, [x16] br x16 - .size bluegl_glSampleMaski, .-bluegl_glSampleMaski + .size bluegl_glMultiTexGeniEXT, .-bluegl_glMultiTexGeniEXT .align 2 - .global bluegl_glProgramUniformMatrix4x3dvEXT - .type bluegl_glProgramUniformMatrix4x3dvEXT, %function -bluegl_glProgramUniformMatrix4x3dvEXT: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix4x3dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4x3dvEXT] + .global bluegl_glMultiTexGenivEXT + .type bluegl_glMultiTexGenivEXT, %function +bluegl_glMultiTexGenivEXT: + adrp x16, :got:__blue_glCore_glMultiTexGenivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexGenivEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix4x3dvEXT, .-bluegl_glProgramUniformMatrix4x3dvEXT + .size bluegl_glMultiTexGenivEXT, .-bluegl_glMultiTexGenivEXT .align 2 - .global bluegl_glCompileShaderARB - .type bluegl_glCompileShaderARB, %function -bluegl_glCompileShaderARB: - adrp x16, :got:__blue_glCore_glCompileShaderARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompileShaderARB] + .global bluegl_glGetMultiTexEnvfvEXT + .type bluegl_glGetMultiTexEnvfvEXT, %function +bluegl_glGetMultiTexEnvfvEXT: + adrp x16, :got:__blue_glCore_glGetMultiTexEnvfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexEnvfvEXT] ldr x16, [x16] br x16 - .size bluegl_glCompileShaderARB, .-bluegl_glCompileShaderARB + .size bluegl_glGetMultiTexEnvfvEXT, .-bluegl_glGetMultiTexEnvfvEXT .align 2 - .global bluegl_glUniform4ui64ARB - .type bluegl_glUniform4ui64ARB, %function -bluegl_glUniform4ui64ARB: - adrp x16, :got:__blue_glCore_glUniform4ui64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4ui64ARB] + .global bluegl_glGetMultiTexEnvivEXT + .type bluegl_glGetMultiTexEnvivEXT, %function +bluegl_glGetMultiTexEnvivEXT: + adrp x16, :got:__blue_glCore_glGetMultiTexEnvivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexEnvivEXT] ldr x16, [x16] br x16 - .size bluegl_glUniform4ui64ARB, .-bluegl_glUniform4ui64ARB + .size bluegl_glGetMultiTexEnvivEXT, .-bluegl_glGetMultiTexEnvivEXT .align 2 - .global bluegl_glTexCoord3xOES - .type bluegl_glTexCoord3xOES, %function -bluegl_glTexCoord3xOES: - adrp x16, :got:__blue_glCore_glTexCoord3xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord3xOES] + .global bluegl_glGetMultiTexGendvEXT + .type bluegl_glGetMultiTexGendvEXT, %function +bluegl_glGetMultiTexGendvEXT: + adrp x16, :got:__blue_glCore_glGetMultiTexGendvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexGendvEXT] ldr x16, [x16] br x16 - .size bluegl_glTexCoord3xOES, .-bluegl_glTexCoord3xOES + .size bluegl_glGetMultiTexGendvEXT, .-bluegl_glGetMultiTexGendvEXT .align 2 - .global bluegl_glGetInternalformativ - .type bluegl_glGetInternalformativ, %function -bluegl_glGetInternalformativ: - adrp x16, :got:__blue_glCore_glGetInternalformativ - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInternalformativ] + .global bluegl_glGetMultiTexGenfvEXT + .type bluegl_glGetMultiTexGenfvEXT, %function +bluegl_glGetMultiTexGenfvEXT: + adrp x16, :got:__blue_glCore_glGetMultiTexGenfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexGenfvEXT] ldr x16, [x16] br x16 - .size bluegl_glGetInternalformativ, .-bluegl_glGetInternalformativ + .size bluegl_glGetMultiTexGenfvEXT, .-bluegl_glGetMultiTexGenfvEXT .align 2 - .global bluegl_glObjectPtrLabel - .type bluegl_glObjectPtrLabel, %function -bluegl_glObjectPtrLabel: - adrp x16, :got:__blue_glCore_glObjectPtrLabel - ldr x16, [x16, #:got_lo12:__blue_glCore_glObjectPtrLabel] + .global bluegl_glGetMultiTexGenivEXT + .type bluegl_glGetMultiTexGenivEXT, %function +bluegl_glGetMultiTexGenivEXT: + adrp x16, :got:__blue_glCore_glGetMultiTexGenivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexGenivEXT] ldr x16, [x16] br x16 - .size bluegl_glObjectPtrLabel, .-bluegl_glObjectPtrLabel + .size bluegl_glGetMultiTexGenivEXT, .-bluegl_glGetMultiTexGenivEXT .align 2 - .global bluegl_glNormal3hvNV - .type bluegl_glNormal3hvNV, %function -bluegl_glNormal3hvNV: - adrp x16, :got:__blue_glCore_glNormal3hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormal3hvNV] + .global bluegl_glMultiTexParameteriEXT + .type bluegl_glMultiTexParameteriEXT, %function +bluegl_glMultiTexParameteriEXT: + adrp x16, :got:__blue_glCore_glMultiTexParameteriEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexParameteriEXT] ldr x16, [x16] br x16 - .size bluegl_glNormal3hvNV, .-bluegl_glNormal3hvNV + .size bluegl_glMultiTexParameteriEXT, .-bluegl_glMultiTexParameteriEXT .align 2 - .global bluegl_glProgramUniform1uiv - .type bluegl_glProgramUniform1uiv, %function -bluegl_glProgramUniform1uiv: - adrp x16, :got:__blue_glCore_glProgramUniform1uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1uiv] + .global bluegl_glMultiTexParameterivEXT + .type bluegl_glMultiTexParameterivEXT, %function +bluegl_glMultiTexParameterivEXT: + adrp x16, :got:__blue_glCore_glMultiTexParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1uiv, .-bluegl_glProgramUniform1uiv + .size bluegl_glMultiTexParameterivEXT, .-bluegl_glMultiTexParameterivEXT .align 2 - .global bluegl_glGenFragmentShadersATI - .type bluegl_glGenFragmentShadersATI, %function -bluegl_glGenFragmentShadersATI: - adrp x16, :got:__blue_glCore_glGenFragmentShadersATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenFragmentShadersATI] + .global bluegl_glMultiTexParameterfEXT + .type bluegl_glMultiTexParameterfEXT, %function +bluegl_glMultiTexParameterfEXT: + adrp x16, :got:__blue_glCore_glMultiTexParameterfEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexParameterfEXT] ldr x16, [x16] br x16 - .size bluegl_glGenFragmentShadersATI, .-bluegl_glGenFragmentShadersATI + .size bluegl_glMultiTexParameterfEXT, .-bluegl_glMultiTexParameterfEXT .align 2 - .global bluegl_glTexCoord2hvNV - .type bluegl_glTexCoord2hvNV, %function -bluegl_glTexCoord2hvNV: - adrp x16, :got:__blue_glCore_glTexCoord2hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2hvNV] + .global bluegl_glMultiTexParameterfvEXT + .type bluegl_glMultiTexParameterfvEXT, %function +bluegl_glMultiTexParameterfvEXT: + adrp x16, :got:__blue_glCore_glMultiTexParameterfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexParameterfvEXT] ldr x16, [x16] br x16 - .size bluegl_glTexCoord2hvNV, .-bluegl_glTexCoord2hvNV + .size bluegl_glMultiTexParameterfvEXT, .-bluegl_glMultiTexParameterfvEXT .align 2 - .global bluegl_glFinishAsyncSGIX - .type bluegl_glFinishAsyncSGIX, %function -bluegl_glFinishAsyncSGIX: - adrp x16, :got:__blue_glCore_glFinishAsyncSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glFinishAsyncSGIX] + .global bluegl_glMultiTexImage1DEXT + .type bluegl_glMultiTexImage1DEXT, %function +bluegl_glMultiTexImage1DEXT: + adrp x16, :got:__blue_glCore_glMultiTexImage1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexImage1DEXT] ldr x16, [x16] br x16 - .size bluegl_glFinishAsyncSGIX, .-bluegl_glFinishAsyncSGIX + .size bluegl_glMultiTexImage1DEXT, .-bluegl_glMultiTexImage1DEXT .align 2 - .global bluegl_glEnableVertexAttribArrayARB - .type bluegl_glEnableVertexAttribArrayARB, %function -bluegl_glEnableVertexAttribArrayARB: - adrp x16, :got:__blue_glCore_glEnableVertexAttribArrayARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableVertexAttribArrayARB] + .global bluegl_glMultiTexImage2DEXT + .type bluegl_glMultiTexImage2DEXT, %function +bluegl_glMultiTexImage2DEXT: + adrp x16, :got:__blue_glCore_glMultiTexImage2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexImage2DEXT] ldr x16, [x16] br x16 - .size bluegl_glEnableVertexAttribArrayARB, .-bluegl_glEnableVertexAttribArrayARB + .size bluegl_glMultiTexImage2DEXT, .-bluegl_glMultiTexImage2DEXT .align 2 - .global bluegl_glDeleteSamplers - .type bluegl_glDeleteSamplers, %function -bluegl_glDeleteSamplers: - adrp x16, :got:__blue_glCore_glDeleteSamplers - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteSamplers] + .global bluegl_glMultiTexSubImage1DEXT + .type bluegl_glMultiTexSubImage1DEXT, %function +bluegl_glMultiTexSubImage1DEXT: + adrp x16, :got:__blue_glCore_glMultiTexSubImage1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexSubImage1DEXT] ldr x16, [x16] br x16 - .size bluegl_glDeleteSamplers, .-bluegl_glDeleteSamplers + .size bluegl_glMultiTexSubImage1DEXT, .-bluegl_glMultiTexSubImage1DEXT .align 2 - .global bluegl_glVertexAttrib1fvARB - .type bluegl_glVertexAttrib1fvARB, %function -bluegl_glVertexAttrib1fvARB: - adrp x16, :got:__blue_glCore_glVertexAttrib1fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1fvARB] + .global bluegl_glMultiTexSubImage2DEXT + .type bluegl_glMultiTexSubImage2DEXT, %function +bluegl_glMultiTexSubImage2DEXT: + adrp x16, :got:__blue_glCore_glMultiTexSubImage2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexSubImage2DEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1fvARB, .-bluegl_glVertexAttrib1fvARB + .size bluegl_glMultiTexSubImage2DEXT, .-bluegl_glMultiTexSubImage2DEXT .align 2 - .global bluegl_glGetnUniformivARB - .type bluegl_glGetnUniformivARB, %function -bluegl_glGetnUniformivARB: - adrp x16, :got:__blue_glCore_glGetnUniformivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformivARB] + .global bluegl_glCopyMultiTexImage1DEXT + .type bluegl_glCopyMultiTexImage1DEXT, %function +bluegl_glCopyMultiTexImage1DEXT: + adrp x16, :got:__blue_glCore_glCopyMultiTexImage1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyMultiTexImage1DEXT] ldr x16, [x16] br x16 - .size bluegl_glGetnUniformivARB, .-bluegl_glGetnUniformivARB + .size bluegl_glCopyMultiTexImage1DEXT, .-bluegl_glCopyMultiTexImage1DEXT .align 2 - .global bluegl_glLoadTransposeMatrixd - .type bluegl_glLoadTransposeMatrixd, %function -bluegl_glLoadTransposeMatrixd: - adrp x16, :got:__blue_glCore_glLoadTransposeMatrixd - ldr x16, [x16, #:got_lo12:__blue_glCore_glLoadTransposeMatrixd] + .global bluegl_glCopyMultiTexImage2DEXT + .type bluegl_glCopyMultiTexImage2DEXT, %function +bluegl_glCopyMultiTexImage2DEXT: + adrp x16, :got:__blue_glCore_glCopyMultiTexImage2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyMultiTexImage2DEXT] ldr x16, [x16] br x16 - .size bluegl_glLoadTransposeMatrixd, .-bluegl_glLoadTransposeMatrixd + .size bluegl_glCopyMultiTexImage2DEXT, .-bluegl_glCopyMultiTexImage2DEXT .align 2 - .global bluegl_glProgramParameteri - .type bluegl_glProgramParameteri, %function -bluegl_glProgramParameteri: - adrp x16, :got:__blue_glCore_glProgramParameteri - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramParameteri] + .global bluegl_glCopyMultiTexSubImage1DEXT + .type bluegl_glCopyMultiTexSubImage1DEXT, %function +bluegl_glCopyMultiTexSubImage1DEXT: + adrp x16, :got:__blue_glCore_glCopyMultiTexSubImage1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyMultiTexSubImage1DEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramParameteri, .-bluegl_glProgramParameteri + .size bluegl_glCopyMultiTexSubImage1DEXT, .-bluegl_glCopyMultiTexSubImage1DEXT .align 2 - .global bluegl_glCreateShader - .type bluegl_glCreateShader, %function -bluegl_glCreateShader: - adrp x16, :got:__blue_glCore_glCreateShader - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateShader] + .global bluegl_glCopyMultiTexSubImage2DEXT + .type bluegl_glCopyMultiTexSubImage2DEXT, %function +bluegl_glCopyMultiTexSubImage2DEXT: + adrp x16, :got:__blue_glCore_glCopyMultiTexSubImage2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyMultiTexSubImage2DEXT] ldr x16, [x16] br x16 - .size bluegl_glCreateShader, .-bluegl_glCreateShader + .size bluegl_glCopyMultiTexSubImage2DEXT, .-bluegl_glCopyMultiTexSubImage2DEXT .align 2 - .global bluegl_glFragmentCoverageColorNV - .type bluegl_glFragmentCoverageColorNV, %function -bluegl_glFragmentCoverageColorNV: - adrp x16, :got:__blue_glCore_glFragmentCoverageColorNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentCoverageColorNV] + .global bluegl_glGetMultiTexImageEXT + .type bluegl_glGetMultiTexImageEXT, %function +bluegl_glGetMultiTexImageEXT: + adrp x16, :got:__blue_glCore_glGetMultiTexImageEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexImageEXT] ldr x16, [x16] br x16 - .size bluegl_glFragmentCoverageColorNV, .-bluegl_glFragmentCoverageColorNV + .size bluegl_glGetMultiTexImageEXT, .-bluegl_glGetMultiTexImageEXT .align 2 - .global bluegl_glVertexStream3dvATI - .type bluegl_glVertexStream3dvATI, %function -bluegl_glVertexStream3dvATI: - adrp x16, :got:__blue_glCore_glVertexStream3dvATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream3dvATI] + .global bluegl_glGetMultiTexParameterfvEXT + .type bluegl_glGetMultiTexParameterfvEXT, %function +bluegl_glGetMultiTexParameterfvEXT: + adrp x16, :got:__blue_glCore_glGetMultiTexParameterfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexParameterfvEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexStream3dvATI, .-bluegl_glVertexStream3dvATI + .size bluegl_glGetMultiTexParameterfvEXT, .-bluegl_glGetMultiTexParameterfvEXT .align 2 - .global bluegl_glUniformHandleui64ARB - .type bluegl_glUniformHandleui64ARB, %function -bluegl_glUniformHandleui64ARB: - adrp x16, :got:__blue_glCore_glUniformHandleui64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformHandleui64ARB] + .global bluegl_glGetMultiTexParameterivEXT + .type bluegl_glGetMultiTexParameterivEXT, %function +bluegl_glGetMultiTexParameterivEXT: + adrp x16, :got:__blue_glCore_glGetMultiTexParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glUniformHandleui64ARB, .-bluegl_glUniformHandleui64ARB + .size bluegl_glGetMultiTexParameterivEXT, .-bluegl_glGetMultiTexParameterivEXT .align 2 - .global bluegl_glGetVaryingLocationNV - .type bluegl_glGetVaryingLocationNV, %function -bluegl_glGetVaryingLocationNV: - adrp x16, :got:__blue_glCore_glGetVaryingLocationNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVaryingLocationNV] + .global bluegl_glGetMultiTexLevelParameterfvEXT + .type bluegl_glGetMultiTexLevelParameterfvEXT, %function +bluegl_glGetMultiTexLevelParameterfvEXT: + adrp x16, :got:__blue_glCore_glGetMultiTexLevelParameterfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexLevelParameterfvEXT] ldr x16, [x16] br x16 - .size bluegl_glGetVaryingLocationNV, .-bluegl_glGetVaryingLocationNV + .size bluegl_glGetMultiTexLevelParameterfvEXT, .-bluegl_glGetMultiTexLevelParameterfvEXT .align 2 - .global bluegl_glCompressedTextureSubImage2DEXT - .type bluegl_glCompressedTextureSubImage2DEXT, %function -bluegl_glCompressedTextureSubImage2DEXT: - adrp x16, :got:__blue_glCore_glCompressedTextureSubImage2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTextureSubImage2DEXT] + .global bluegl_glGetMultiTexLevelParameterivEXT + .type bluegl_glGetMultiTexLevelParameterivEXT, %function +bluegl_glGetMultiTexLevelParameterivEXT: + adrp x16, :got:__blue_glCore_glGetMultiTexLevelParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexLevelParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glCompressedTextureSubImage2DEXT, .-bluegl_glCompressedTextureSubImage2DEXT + .size bluegl_glGetMultiTexLevelParameterivEXT, .-bluegl_glGetMultiTexLevelParameterivEXT .align 2 - .global bluegl_glTangent3dEXT - .type bluegl_glTangent3dEXT, %function -bluegl_glTangent3dEXT: - adrp x16, :got:__blue_glCore_glTangent3dEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3dEXT] + .global bluegl_glMultiTexImage3DEXT + .type bluegl_glMultiTexImage3DEXT, %function +bluegl_glMultiTexImage3DEXT: + adrp x16, :got:__blue_glCore_glMultiTexImage3DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexImage3DEXT] ldr x16, [x16] br x16 - .size bluegl_glTangent3dEXT, .-bluegl_glTangent3dEXT + .size bluegl_glMultiTexImage3DEXT, .-bluegl_glMultiTexImage3DEXT .align 2 - .global bluegl_glGetNamedBufferPointervEXT - .type bluegl_glGetNamedBufferPointervEXT, %function -bluegl_glGetNamedBufferPointervEXT: - adrp x16, :got:__blue_glCore_glGetNamedBufferPointervEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedBufferPointervEXT] + .global bluegl_glMultiTexSubImage3DEXT + .type bluegl_glMultiTexSubImage3DEXT, %function +bluegl_glMultiTexSubImage3DEXT: + adrp x16, :got:__blue_glCore_glMultiTexSubImage3DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexSubImage3DEXT] + ldr x16, [x16] + br x16 + .size bluegl_glMultiTexSubImage3DEXT, .-bluegl_glMultiTexSubImage3DEXT + + .align 2 + .global bluegl_glCopyMultiTexSubImage3DEXT + .type bluegl_glCopyMultiTexSubImage3DEXT, %function +bluegl_glCopyMultiTexSubImage3DEXT: + adrp x16, :got:__blue_glCore_glCopyMultiTexSubImage3DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyMultiTexSubImage3DEXT] ldr x16, [x16] br x16 - .size bluegl_glGetNamedBufferPointervEXT, .-bluegl_glGetNamedBufferPointervEXT + .size bluegl_glCopyMultiTexSubImage3DEXT, .-bluegl_glCopyMultiTexSubImage3DEXT .align 2 - .global bluegl_glVertex2bvOES - .type bluegl_glVertex2bvOES, %function -bluegl_glVertex2bvOES: - adrp x16, :got:__blue_glCore_glVertex2bvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex2bvOES] + .global bluegl_glEnableClientStateIndexedEXT + .type bluegl_glEnableClientStateIndexedEXT, %function +bluegl_glEnableClientStateIndexedEXT: + adrp x16, :got:__blue_glCore_glEnableClientStateIndexedEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableClientStateIndexedEXT] ldr x16, [x16] br x16 - .size bluegl_glVertex2bvOES, .-bluegl_glVertex2bvOES + .size bluegl_glEnableClientStateIndexedEXT, .-bluegl_glEnableClientStateIndexedEXT .align 2 - .global bluegl_glProgramBufferParametersIuivNV - .type bluegl_glProgramBufferParametersIuivNV, %function -bluegl_glProgramBufferParametersIuivNV: - adrp x16, :got:__blue_glCore_glProgramBufferParametersIuivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramBufferParametersIuivNV] + .global bluegl_glDisableClientStateIndexedEXT + .type bluegl_glDisableClientStateIndexedEXT, %function +bluegl_glDisableClientStateIndexedEXT: + adrp x16, :got:__blue_glCore_glDisableClientStateIndexedEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableClientStateIndexedEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramBufferParametersIuivNV, .-bluegl_glProgramBufferParametersIuivNV + .size bluegl_glDisableClientStateIndexedEXT, .-bluegl_glDisableClientStateIndexedEXT .align 2 - .global bluegl_glGetnTexImageARB - .type bluegl_glGetnTexImageARB, %function -bluegl_glGetnTexImageARB: - adrp x16, :got:__blue_glCore_glGetnTexImageARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnTexImageARB] + .global bluegl_glGetFloatIndexedvEXT + .type bluegl_glGetFloatIndexedvEXT, %function +bluegl_glGetFloatIndexedvEXT: + adrp x16, :got:__blue_glCore_glGetFloatIndexedvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFloatIndexedvEXT] ldr x16, [x16] br x16 - .size bluegl_glGetnTexImageARB, .-bluegl_glGetnTexImageARB + .size bluegl_glGetFloatIndexedvEXT, .-bluegl_glGetFloatIndexedvEXT .align 2 - .global bluegl_glSetFenceNV - .type bluegl_glSetFenceNV, %function -bluegl_glSetFenceNV: - adrp x16, :got:__blue_glCore_glSetFenceNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glSetFenceNV] + .global bluegl_glGetDoubleIndexedvEXT + .type bluegl_glGetDoubleIndexedvEXT, %function +bluegl_glGetDoubleIndexedvEXT: + adrp x16, :got:__blue_glCore_glGetDoubleIndexedvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetDoubleIndexedvEXT] ldr x16, [x16] br x16 - .size bluegl_glSetFenceNV, .-bluegl_glSetFenceNV + .size bluegl_glGetDoubleIndexedvEXT, .-bluegl_glGetDoubleIndexedvEXT .align 2 - .global bluegl_glPathParameterfvNV - .type bluegl_glPathParameterfvNV, %function -bluegl_glPathParameterfvNV: - adrp x16, :got:__blue_glCore_glPathParameterfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathParameterfvNV] + .global bluegl_glGetPointerIndexedvEXT + .type bluegl_glGetPointerIndexedvEXT, %function +bluegl_glGetPointerIndexedvEXT: + adrp x16, :got:__blue_glCore_glGetPointerIndexedvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPointerIndexedvEXT] ldr x16, [x16] br x16 - .size bluegl_glPathParameterfvNV, .-bluegl_glPathParameterfvNV + .size bluegl_glGetPointerIndexedvEXT, .-bluegl_glGetPointerIndexedvEXT .align 2 - .global bluegl_glVertexAttribFormat - .type bluegl_glVertexAttribFormat, %function -bluegl_glVertexAttribFormat: - adrp x16, :got:__blue_glCore_glVertexAttribFormat - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribFormat] + .global bluegl_glEnableIndexedEXT + .type bluegl_glEnableIndexedEXT, %function +bluegl_glEnableIndexedEXT: + adrp x16, :got:__blue_glCore_glEnableIndexedEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableIndexedEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribFormat, .-bluegl_glVertexAttribFormat + .size bluegl_glEnableIndexedEXT, .-bluegl_glEnableIndexedEXT .align 2 - .global bluegl_glConservativeRasterParameterfNV - .type bluegl_glConservativeRasterParameterfNV, %function -bluegl_glConservativeRasterParameterfNV: - adrp x16, :got:__blue_glCore_glConservativeRasterParameterfNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glConservativeRasterParameterfNV] + .global bluegl_glDisableIndexedEXT + .type bluegl_glDisableIndexedEXT, %function +bluegl_glDisableIndexedEXT: + adrp x16, :got:__blue_glCore_glDisableIndexedEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableIndexedEXT] ldr x16, [x16] br x16 - .size bluegl_glConservativeRasterParameterfNV, .-bluegl_glConservativeRasterParameterfNV + .size bluegl_glDisableIndexedEXT, .-bluegl_glDisableIndexedEXT .align 2 - .global bluegl_glGetVertexAttribIuivEXT - .type bluegl_glGetVertexAttribIuivEXT, %function -bluegl_glGetVertexAttribIuivEXT: - adrp x16, :got:__blue_glCore_glGetVertexAttribIuivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribIuivEXT] + .global bluegl_glIsEnabledIndexedEXT + .type bluegl_glIsEnabledIndexedEXT, %function +bluegl_glIsEnabledIndexedEXT: + adrp x16, :got:__blue_glCore_glIsEnabledIndexedEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsEnabledIndexedEXT] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribIuivEXT, .-bluegl_glGetVertexAttribIuivEXT + .size bluegl_glIsEnabledIndexedEXT, .-bluegl_glIsEnabledIndexedEXT .align 2 - .global bluegl_glBindMultiTextureEXT - .type bluegl_glBindMultiTextureEXT, %function -bluegl_glBindMultiTextureEXT: - adrp x16, :got:__blue_glCore_glBindMultiTextureEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindMultiTextureEXT] + .global bluegl_glGetIntegerIndexedvEXT + .type bluegl_glGetIntegerIndexedvEXT, %function +bluegl_glGetIntegerIndexedvEXT: + adrp x16, :got:__blue_glCore_glGetIntegerIndexedvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetIntegerIndexedvEXT] ldr x16, [x16] br x16 - .size bluegl_glBindMultiTextureEXT, .-bluegl_glBindMultiTextureEXT + .size bluegl_glGetIntegerIndexedvEXT, .-bluegl_glGetIntegerIndexedvEXT .align 2 - .global bluegl_glMapControlPointsNV - .type bluegl_glMapControlPointsNV, %function -bluegl_glMapControlPointsNV: - adrp x16, :got:__blue_glCore_glMapControlPointsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMapControlPointsNV] + .global bluegl_glGetBooleanIndexedvEXT + .type bluegl_glGetBooleanIndexedvEXT, %function +bluegl_glGetBooleanIndexedvEXT: + adrp x16, :got:__blue_glCore_glGetBooleanIndexedvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBooleanIndexedvEXT] ldr x16, [x16] br x16 - .size bluegl_glMapControlPointsNV, .-bluegl_glMapControlPointsNV + .size bluegl_glGetBooleanIndexedvEXT, .-bluegl_glGetBooleanIndexedvEXT .align 2 - .global bluegl_glVertexAttrib4Nsv - .type bluegl_glVertexAttrib4Nsv, %function -bluegl_glVertexAttrib4Nsv: - adrp x16, :got:__blue_glCore_glVertexAttrib4Nsv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4Nsv] + .global bluegl_glCompressedTextureImage3DEXT + .type bluegl_glCompressedTextureImage3DEXT, %function +bluegl_glCompressedTextureImage3DEXT: + adrp x16, :got:__blue_glCore_glCompressedTextureImage3DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTextureImage3DEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4Nsv, .-bluegl_glVertexAttrib4Nsv + .size bluegl_glCompressedTextureImage3DEXT, .-bluegl_glCompressedTextureImage3DEXT .align 2 - .global bluegl_glCompressedMultiTexImage2DEXT - .type bluegl_glCompressedMultiTexImage2DEXT, %function -bluegl_glCompressedMultiTexImage2DEXT: - adrp x16, :got:__blue_glCore_glCompressedMultiTexImage2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedMultiTexImage2DEXT] + .global bluegl_glCompressedTextureImage2DEXT + .type bluegl_glCompressedTextureImage2DEXT, %function +bluegl_glCompressedTextureImage2DEXT: + adrp x16, :got:__blue_glCore_glCompressedTextureImage2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTextureImage2DEXT] ldr x16, [x16] br x16 - .size bluegl_glCompressedMultiTexImage2DEXT, .-bluegl_glCompressedMultiTexImage2DEXT + .size bluegl_glCompressedTextureImage2DEXT, .-bluegl_glCompressedTextureImage2DEXT .align 2 - .global bluegl_glIsNamedBufferResidentNV - .type bluegl_glIsNamedBufferResidentNV, %function -bluegl_glIsNamedBufferResidentNV: - adrp x16, :got:__blue_glCore_glIsNamedBufferResidentNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsNamedBufferResidentNV] + .global bluegl_glCompressedTextureImage1DEXT + .type bluegl_glCompressedTextureImage1DEXT, %function +bluegl_glCompressedTextureImage1DEXT: + adrp x16, :got:__blue_glCore_glCompressedTextureImage1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTextureImage1DEXT] ldr x16, [x16] br x16 - .size bluegl_glIsNamedBufferResidentNV, .-bluegl_glIsNamedBufferResidentNV + .size bluegl_glCompressedTextureImage1DEXT, .-bluegl_glCompressedTextureImage1DEXT .align 2 - .global bluegl_glLoadProgramNV - .type bluegl_glLoadProgramNV, %function -bluegl_glLoadProgramNV: - adrp x16, :got:__blue_glCore_glLoadProgramNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glLoadProgramNV] + .global bluegl_glCompressedTextureSubImage3DEXT + .type bluegl_glCompressedTextureSubImage3DEXT, %function +bluegl_glCompressedTextureSubImage3DEXT: + adrp x16, :got:__blue_glCore_glCompressedTextureSubImage3DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTextureSubImage3DEXT] ldr x16, [x16] br x16 - .size bluegl_glLoadProgramNV, .-bluegl_glLoadProgramNV + .size bluegl_glCompressedTextureSubImage3DEXT, .-bluegl_glCompressedTextureSubImage3DEXT .align 2 - .global bluegl_glClearColor - .type bluegl_glClearColor, %function -bluegl_glClearColor: - adrp x16, :got:__blue_glCore_glClearColor - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearColor] + .global bluegl_glCompressedTextureSubImage2DEXT + .type bluegl_glCompressedTextureSubImage2DEXT, %function +bluegl_glCompressedTextureSubImage2DEXT: + adrp x16, :got:__blue_glCore_glCompressedTextureSubImage2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTextureSubImage2DEXT] ldr x16, [x16] br x16 - .size bluegl_glClearColor, .-bluegl_glClearColor + .size bluegl_glCompressedTextureSubImage2DEXT, .-bluegl_glCompressedTextureSubImage2DEXT .align 2 - .global bluegl_glUniform2uivEXT - .type bluegl_glUniform2uivEXT, %function -bluegl_glUniform2uivEXT: - adrp x16, :got:__blue_glCore_glUniform2uivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2uivEXT] + .global bluegl_glCompressedTextureSubImage1DEXT + .type bluegl_glCompressedTextureSubImage1DEXT, %function +bluegl_glCompressedTextureSubImage1DEXT: + adrp x16, :got:__blue_glCore_glCompressedTextureSubImage1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTextureSubImage1DEXT] ldr x16, [x16] br x16 - .size bluegl_glUniform2uivEXT, .-bluegl_glUniform2uivEXT + .size bluegl_glCompressedTextureSubImage1DEXT, .-bluegl_glCompressedTextureSubImage1DEXT .align 2 - .global bluegl_glMultiTexGenfEXT - .type bluegl_glMultiTexGenfEXT, %function -bluegl_glMultiTexGenfEXT: - adrp x16, :got:__blue_glCore_glMultiTexGenfEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexGenfEXT] + .global bluegl_glGetCompressedTextureImageEXT + .type bluegl_glGetCompressedTextureImageEXT, %function +bluegl_glGetCompressedTextureImageEXT: + adrp x16, :got:__blue_glCore_glGetCompressedTextureImageEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCompressedTextureImageEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexGenfEXT, .-bluegl_glMultiTexGenfEXT + .size bluegl_glGetCompressedTextureImageEXT, .-bluegl_glGetCompressedTextureImageEXT .align 2 - .global bluegl_glGetUniformdv - .type bluegl_glGetUniformdv, %function -bluegl_glGetUniformdv: - adrp x16, :got:__blue_glCore_glGetUniformdv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformdv] + .global bluegl_glCompressedMultiTexImage3DEXT + .type bluegl_glCompressedMultiTexImage3DEXT, %function +bluegl_glCompressedMultiTexImage3DEXT: + adrp x16, :got:__blue_glCore_glCompressedMultiTexImage3DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedMultiTexImage3DEXT] ldr x16, [x16] br x16 - .size bluegl_glGetUniformdv, .-bluegl_glGetUniformdv + .size bluegl_glCompressedMultiTexImage3DEXT, .-bluegl_glCompressedMultiTexImage3DEXT .align 2 - .global bluegl_glGenRenderbuffersEXT - .type bluegl_glGenRenderbuffersEXT, %function -bluegl_glGenRenderbuffersEXT: - adrp x16, :got:__blue_glCore_glGenRenderbuffersEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenRenderbuffersEXT] + .global bluegl_glCompressedMultiTexImage2DEXT + .type bluegl_glCompressedMultiTexImage2DEXT, %function +bluegl_glCompressedMultiTexImage2DEXT: + adrp x16, :got:__blue_glCore_glCompressedMultiTexImage2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedMultiTexImage2DEXT] ldr x16, [x16] br x16 - .size bluegl_glGenRenderbuffersEXT, .-bluegl_glGenRenderbuffersEXT + .size bluegl_glCompressedMultiTexImage2DEXT, .-bluegl_glCompressedMultiTexImage2DEXT .align 2 - .global bluegl_glGetMultisamplefv - .type bluegl_glGetMultisamplefv, %function -bluegl_glGetMultisamplefv: - adrp x16, :got:__blue_glCore_glGetMultisamplefv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultisamplefv] + .global bluegl_glCompressedMultiTexImage1DEXT + .type bluegl_glCompressedMultiTexImage1DEXT, %function +bluegl_glCompressedMultiTexImage1DEXT: + adrp x16, :got:__blue_glCore_glCompressedMultiTexImage1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedMultiTexImage1DEXT] ldr x16, [x16] br x16 - .size bluegl_glGetMultisamplefv, .-bluegl_glGetMultisamplefv + .size bluegl_glCompressedMultiTexImage1DEXT, .-bluegl_glCompressedMultiTexImage1DEXT .align 2 - .global bluegl_glMapNamedBuffer - .type bluegl_glMapNamedBuffer, %function -bluegl_glMapNamedBuffer: - adrp x16, :got:__blue_glCore_glMapNamedBuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glMapNamedBuffer] + .global bluegl_glCompressedMultiTexSubImage3DEXT + .type bluegl_glCompressedMultiTexSubImage3DEXT, %function +bluegl_glCompressedMultiTexSubImage3DEXT: + adrp x16, :got:__blue_glCore_glCompressedMultiTexSubImage3DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedMultiTexSubImage3DEXT] ldr x16, [x16] br x16 - .size bluegl_glMapNamedBuffer, .-bluegl_glMapNamedBuffer + .size bluegl_glCompressedMultiTexSubImage3DEXT, .-bluegl_glCompressedMultiTexSubImage3DEXT .align 2 - .global bluegl_glDeleteFramebuffersEXT - .type bluegl_glDeleteFramebuffersEXT, %function -bluegl_glDeleteFramebuffersEXT: - adrp x16, :got:__blue_glCore_glDeleteFramebuffersEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteFramebuffersEXT] + .global bluegl_glCompressedMultiTexSubImage2DEXT + .type bluegl_glCompressedMultiTexSubImage2DEXT, %function +bluegl_glCompressedMultiTexSubImage2DEXT: + adrp x16, :got:__blue_glCore_glCompressedMultiTexSubImage2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedMultiTexSubImage2DEXT] ldr x16, [x16] br x16 - .size bluegl_glDeleteFramebuffersEXT, .-bluegl_glDeleteFramebuffersEXT + .size bluegl_glCompressedMultiTexSubImage2DEXT, .-bluegl_glCompressedMultiTexSubImage2DEXT .align 2 - .global bluegl_glVertexAttribI4usvEXT - .type bluegl_glVertexAttribI4usvEXT, %function -bluegl_glVertexAttribI4usvEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI4usvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4usvEXT] + .global bluegl_glCompressedMultiTexSubImage1DEXT + .type bluegl_glCompressedMultiTexSubImage1DEXT, %function +bluegl_glCompressedMultiTexSubImage1DEXT: + adrp x16, :got:__blue_glCore_glCompressedMultiTexSubImage1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedMultiTexSubImage1DEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI4usvEXT, .-bluegl_glVertexAttribI4usvEXT + .size bluegl_glCompressedMultiTexSubImage1DEXT, .-bluegl_glCompressedMultiTexSubImage1DEXT .align 2 - .global bluegl_glSecondaryColor3hNV - .type bluegl_glSecondaryColor3hNV, %function -bluegl_glSecondaryColor3hNV: - adrp x16, :got:__blue_glCore_glSecondaryColor3hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3hNV] + .global bluegl_glGetCompressedMultiTexImageEXT + .type bluegl_glGetCompressedMultiTexImageEXT, %function +bluegl_glGetCompressedMultiTexImageEXT: + adrp x16, :got:__blue_glCore_glGetCompressedMultiTexImageEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCompressedMultiTexImageEXT] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3hNV, .-bluegl_glSecondaryColor3hNV + .size bluegl_glGetCompressedMultiTexImageEXT, .-bluegl_glGetCompressedMultiTexImageEXT .align 2 - .global bluegl_glGenerateMipmap - .type bluegl_glGenerateMipmap, %function -bluegl_glGenerateMipmap: - adrp x16, :got:__blue_glCore_glGenerateMipmap - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenerateMipmap] + .global bluegl_glMatrixLoadTransposefEXT + .type bluegl_glMatrixLoadTransposefEXT, %function +bluegl_glMatrixLoadTransposefEXT: + adrp x16, :got:__blue_glCore_glMatrixLoadTransposefEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixLoadTransposefEXT] ldr x16, [x16] br x16 - .size bluegl_glGenerateMipmap, .-bluegl_glGenerateMipmap + .size bluegl_glMatrixLoadTransposefEXT, .-bluegl_glMatrixLoadTransposefEXT .align 2 - .global bluegl_glProgramEnvParameterI4uivNV - .type bluegl_glProgramEnvParameterI4uivNV, %function -bluegl_glProgramEnvParameterI4uivNV: - adrp x16, :got:__blue_glCore_glProgramEnvParameterI4uivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParameterI4uivNV] + .global bluegl_glMatrixLoadTransposedEXT + .type bluegl_glMatrixLoadTransposedEXT, %function +bluegl_glMatrixLoadTransposedEXT: + adrp x16, :got:__blue_glCore_glMatrixLoadTransposedEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixLoadTransposedEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramEnvParameterI4uivNV, .-bluegl_glProgramEnvParameterI4uivNV + .size bluegl_glMatrixLoadTransposedEXT, .-bluegl_glMatrixLoadTransposedEXT .align 2 - .global bluegl_glSeparableFilter2D - .type bluegl_glSeparableFilter2D, %function -bluegl_glSeparableFilter2D: - adrp x16, :got:__blue_glCore_glSeparableFilter2D - ldr x16, [x16, #:got_lo12:__blue_glCore_glSeparableFilter2D] + .global bluegl_glMatrixMultTransposefEXT + .type bluegl_glMatrixMultTransposefEXT, %function +bluegl_glMatrixMultTransposefEXT: + adrp x16, :got:__blue_glCore_glMatrixMultTransposefEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixMultTransposefEXT] ldr x16, [x16] br x16 - .size bluegl_glSeparableFilter2D, .-bluegl_glSeparableFilter2D + .size bluegl_glMatrixMultTransposefEXT, .-bluegl_glMatrixMultTransposefEXT .align 2 - .global bluegl_glFogCoorddEXT - .type bluegl_glFogCoorddEXT, %function -bluegl_glFogCoorddEXT: - adrp x16, :got:__blue_glCore_glFogCoorddEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoorddEXT] + .global bluegl_glMatrixMultTransposedEXT + .type bluegl_glMatrixMultTransposedEXT, %function +bluegl_glMatrixMultTransposedEXT: + adrp x16, :got:__blue_glCore_glMatrixMultTransposedEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixMultTransposedEXT] ldr x16, [x16] br x16 - .size bluegl_glFogCoorddEXT, .-bluegl_glFogCoorddEXT + .size bluegl_glMatrixMultTransposedEXT, .-bluegl_glMatrixMultTransposedEXT .align 2 - .global bluegl_glGetPerfCounterInfoINTEL - .type bluegl_glGetPerfCounterInfoINTEL, %function -bluegl_glGetPerfCounterInfoINTEL: - adrp x16, :got:__blue_glCore_glGetPerfCounterInfoINTEL - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfCounterInfoINTEL] + .global bluegl_glNamedBufferDataEXT + .type bluegl_glNamedBufferDataEXT, %function +bluegl_glNamedBufferDataEXT: + adrp x16, :got:__blue_glCore_glNamedBufferDataEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedBufferDataEXT] ldr x16, [x16] br x16 - .size bluegl_glGetPerfCounterInfoINTEL, .-bluegl_glGetPerfCounterInfoINTEL + .size bluegl_glNamedBufferDataEXT, .-bluegl_glNamedBufferDataEXT .align 2 - .global bluegl_glUniform4uiv - .type bluegl_glUniform4uiv, %function -bluegl_glUniform4uiv: - adrp x16, :got:__blue_glCore_glUniform4uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4uiv] + .global bluegl_glNamedBufferSubDataEXT + .type bluegl_glNamedBufferSubDataEXT, %function +bluegl_glNamedBufferSubDataEXT: + adrp x16, :got:__blue_glCore_glNamedBufferSubDataEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedBufferSubDataEXT] ldr x16, [x16] br x16 - .size bluegl_glUniform4uiv, .-bluegl_glUniform4uiv + .size bluegl_glNamedBufferSubDataEXT, .-bluegl_glNamedBufferSubDataEXT .align 2 - .global bluegl_glVertexAttribL2dv - .type bluegl_glVertexAttribL2dv, %function -bluegl_glVertexAttribL2dv: - adrp x16, :got:__blue_glCore_glVertexAttribL2dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL2dv] + .global bluegl_glMapNamedBufferEXT + .type bluegl_glMapNamedBufferEXT, %function +bluegl_glMapNamedBufferEXT: + adrp x16, :got:__blue_glCore_glMapNamedBufferEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMapNamedBufferEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL2dv, .-bluegl_glVertexAttribL2dv + .size bluegl_glMapNamedBufferEXT, .-bluegl_glMapNamedBufferEXT .align 2 - .global bluegl_glUniform1dv - .type bluegl_glUniform1dv, %function -bluegl_glUniform1dv: - adrp x16, :got:__blue_glCore_glUniform1dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1dv] + .global bluegl_glUnmapNamedBufferEXT + .type bluegl_glUnmapNamedBufferEXT, %function +bluegl_glUnmapNamedBufferEXT: + adrp x16, :got:__blue_glCore_glUnmapNamedBufferEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glUnmapNamedBufferEXT] ldr x16, [x16] br x16 - .size bluegl_glUniform1dv, .-bluegl_glUniform1dv + .size bluegl_glUnmapNamedBufferEXT, .-bluegl_glUnmapNamedBufferEXT .align 2 - .global bluegl_glVertexAttribL1ui64ARB - .type bluegl_glVertexAttribL1ui64ARB, %function -bluegl_glVertexAttribL1ui64ARB: - adrp x16, :got:__blue_glCore_glVertexAttribL1ui64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1ui64ARB] + .global bluegl_glGetNamedBufferParameterivEXT + .type bluegl_glGetNamedBufferParameterivEXT, %function +bluegl_glGetNamedBufferParameterivEXT: + adrp x16, :got:__blue_glCore_glGetNamedBufferParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedBufferParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL1ui64ARB, .-bluegl_glVertexAttribL1ui64ARB + .size bluegl_glGetNamedBufferParameterivEXT, .-bluegl_glGetNamedBufferParameterivEXT .align 2 - .global bluegl_glEndPerfQueryINTEL - .type bluegl_glEndPerfQueryINTEL, %function -bluegl_glEndPerfQueryINTEL: - adrp x16, :got:__blue_glCore_glEndPerfQueryINTEL - ldr x16, [x16, #:got_lo12:__blue_glCore_glEndPerfQueryINTEL] + .global bluegl_glGetNamedBufferPointervEXT + .type bluegl_glGetNamedBufferPointervEXT, %function +bluegl_glGetNamedBufferPointervEXT: + adrp x16, :got:__blue_glCore_glGetNamedBufferPointervEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedBufferPointervEXT] ldr x16, [x16] br x16 - .size bluegl_glEndPerfQueryINTEL, .-bluegl_glEndPerfQueryINTEL + .size bluegl_glGetNamedBufferPointervEXT, .-bluegl_glGetNamedBufferPointervEXT .align 2 - .global bluegl_glVertexArrayEdgeFlagOffsetEXT - .type bluegl_glVertexArrayEdgeFlagOffsetEXT, %function -bluegl_glVertexArrayEdgeFlagOffsetEXT: - adrp x16, :got:__blue_glCore_glVertexArrayEdgeFlagOffsetEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayEdgeFlagOffsetEXT] + .global bluegl_glGetNamedBufferSubDataEXT + .type bluegl_glGetNamedBufferSubDataEXT, %function +bluegl_glGetNamedBufferSubDataEXT: + adrp x16, :got:__blue_glCore_glGetNamedBufferSubDataEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedBufferSubDataEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayEdgeFlagOffsetEXT, .-bluegl_glVertexArrayEdgeFlagOffsetEXT + .size bluegl_glGetNamedBufferSubDataEXT, .-bluegl_glGetNamedBufferSubDataEXT .align 2 - .global bluegl_glVertexAttrib1dv - .type bluegl_glVertexAttrib1dv, %function -bluegl_glVertexAttrib1dv: - adrp x16, :got:__blue_glCore_glVertexAttrib1dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1dv] + .global bluegl_glProgramUniform1fEXT + .type bluegl_glProgramUniform1fEXT, %function +bluegl_glProgramUniform1fEXT: + adrp x16, :got:__blue_glCore_glProgramUniform1fEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1fEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1dv, .-bluegl_glVertexAttrib1dv + .size bluegl_glProgramUniform1fEXT, .-bluegl_glProgramUniform1fEXT .align 2 - .global bluegl_glProgramUniformMatrix2dvEXT - .type bluegl_glProgramUniformMatrix2dvEXT, %function -bluegl_glProgramUniformMatrix2dvEXT: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix2dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2dvEXT] + .global bluegl_glProgramUniform2fEXT + .type bluegl_glProgramUniform2fEXT, %function +bluegl_glProgramUniform2fEXT: + adrp x16, :got:__blue_glCore_glProgramUniform2fEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2fEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix2dvEXT, .-bluegl_glProgramUniformMatrix2dvEXT + .size bluegl_glProgramUniform2fEXT, .-bluegl_glProgramUniform2fEXT .align 2 - .global bluegl_glDepthRange - .type bluegl_glDepthRange, %function -bluegl_glDepthRange: - adrp x16, :got:__blue_glCore_glDepthRange - ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthRange] + .global bluegl_glProgramUniform3fEXT + .type bluegl_glProgramUniform3fEXT, %function +bluegl_glProgramUniform3fEXT: + adrp x16, :got:__blue_glCore_glProgramUniform3fEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3fEXT] ldr x16, [x16] br x16 - .size bluegl_glDepthRange, .-bluegl_glDepthRange + .size bluegl_glProgramUniform3fEXT, .-bluegl_glProgramUniform3fEXT .align 2 - .global bluegl_glCombinerParameterfNV - .type bluegl_glCombinerParameterfNV, %function -bluegl_glCombinerParameterfNV: - adrp x16, :got:__blue_glCore_glCombinerParameterfNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCombinerParameterfNV] + .global bluegl_glProgramUniform4fEXT + .type bluegl_glProgramUniform4fEXT, %function +bluegl_glProgramUniform4fEXT: + adrp x16, :got:__blue_glCore_glProgramUniform4fEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4fEXT] ldr x16, [x16] br x16 - .size bluegl_glCombinerParameterfNV, .-bluegl_glCombinerParameterfNV + .size bluegl_glProgramUniform4fEXT, .-bluegl_glProgramUniform4fEXT .align 2 - .global bluegl_glVariantArrayObjectATI - .type bluegl_glVariantArrayObjectATI, %function -bluegl_glVariantArrayObjectATI: - adrp x16, :got:__blue_glCore_glVariantArrayObjectATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantArrayObjectATI] + .global bluegl_glProgramUniform1iEXT + .type bluegl_glProgramUniform1iEXT, %function +bluegl_glProgramUniform1iEXT: + adrp x16, :got:__blue_glCore_glProgramUniform1iEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1iEXT] ldr x16, [x16] br x16 - .size bluegl_glVariantArrayObjectATI, .-bluegl_glVariantArrayObjectATI + .size bluegl_glProgramUniform1iEXT, .-bluegl_glProgramUniform1iEXT .align 2 - .global bluegl_glDeleteBuffersARB - .type bluegl_glDeleteBuffersARB, %function -bluegl_glDeleteBuffersARB: - adrp x16, :got:__blue_glCore_glDeleteBuffersARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteBuffersARB] + .global bluegl_glProgramUniform2iEXT + .type bluegl_glProgramUniform2iEXT, %function +bluegl_glProgramUniform2iEXT: + adrp x16, :got:__blue_glCore_glProgramUniform2iEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2iEXT] ldr x16, [x16] br x16 - .size bluegl_glDeleteBuffersARB, .-bluegl_glDeleteBuffersARB + .size bluegl_glProgramUniform2iEXT, .-bluegl_glProgramUniform2iEXT .align 2 - .global bluegl_glFragmentLightiSGIX - .type bluegl_glFragmentLightiSGIX, %function -bluegl_glFragmentLightiSGIX: - adrp x16, :got:__blue_glCore_glFragmentLightiSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentLightiSGIX] + .global bluegl_glProgramUniform3iEXT + .type bluegl_glProgramUniform3iEXT, %function +bluegl_glProgramUniform3iEXT: + adrp x16, :got:__blue_glCore_glProgramUniform3iEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3iEXT] + ldr x16, [x16] + br x16 + .size bluegl_glProgramUniform3iEXT, .-bluegl_glProgramUniform3iEXT + + .align 2 + .global bluegl_glProgramUniform4iEXT + .type bluegl_glProgramUniform4iEXT, %function +bluegl_glProgramUniform4iEXT: + adrp x16, :got:__blue_glCore_glProgramUniform4iEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4iEXT] ldr x16, [x16] br x16 - .size bluegl_glFragmentLightiSGIX, .-bluegl_glFragmentLightiSGIX + .size bluegl_glProgramUniform4iEXT, .-bluegl_glProgramUniform4iEXT .align 2 - .global bluegl_glGetSamplerParameterIiv - .type bluegl_glGetSamplerParameterIiv, %function -bluegl_glGetSamplerParameterIiv: - adrp x16, :got:__blue_glCore_glGetSamplerParameterIiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSamplerParameterIiv] + .global bluegl_glProgramUniform1fvEXT + .type bluegl_glProgramUniform1fvEXT, %function +bluegl_glProgramUniform1fvEXT: + adrp x16, :got:__blue_glCore_glProgramUniform1fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1fvEXT] ldr x16, [x16] br x16 - .size bluegl_glGetSamplerParameterIiv, .-bluegl_glGetSamplerParameterIiv + .size bluegl_glProgramUniform1fvEXT, .-bluegl_glProgramUniform1fvEXT .align 2 - .global bluegl_glImportSyncEXT - .type bluegl_glImportSyncEXT, %function -bluegl_glImportSyncEXT: - adrp x16, :got:__blue_glCore_glImportSyncEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glImportSyncEXT] + .global bluegl_glProgramUniform2fvEXT + .type bluegl_glProgramUniform2fvEXT, %function +bluegl_glProgramUniform2fvEXT: + adrp x16, :got:__blue_glCore_glProgramUniform2fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2fvEXT] ldr x16, [x16] br x16 - .size bluegl_glImportSyncEXT, .-bluegl_glImportSyncEXT + .size bluegl_glProgramUniform2fvEXT, .-bluegl_glProgramUniform2fvEXT .align 2 - .global bluegl_glGetVertexAttribivARB - .type bluegl_glGetVertexAttribivARB, %function -bluegl_glGetVertexAttribivARB: - adrp x16, :got:__blue_glCore_glGetVertexAttribivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribivARB] + .global bluegl_glProgramUniform3fvEXT + .type bluegl_glProgramUniform3fvEXT, %function +bluegl_glProgramUniform3fvEXT: + adrp x16, :got:__blue_glCore_glProgramUniform3fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3fvEXT] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribivARB, .-bluegl_glGetVertexAttribivARB + .size bluegl_glProgramUniform3fvEXT, .-bluegl_glProgramUniform3fvEXT .align 2 - .global bluegl_glVertexAttribI2ui - .type bluegl_glVertexAttribI2ui, %function -bluegl_glVertexAttribI2ui: - adrp x16, :got:__blue_glCore_glVertexAttribI2ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI2ui] + .global bluegl_glProgramUniform4fvEXT + .type bluegl_glProgramUniform4fvEXT, %function +bluegl_glProgramUniform4fvEXT: + adrp x16, :got:__blue_glCore_glProgramUniform4fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4fvEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI2ui, .-bluegl_glVertexAttribI2ui + .size bluegl_glProgramUniform4fvEXT, .-bluegl_glProgramUniform4fvEXT .align 2 - .global bluegl_glGetObjectParameterivARB - .type bluegl_glGetObjectParameterivARB, %function -bluegl_glGetObjectParameterivARB: - adrp x16, :got:__blue_glCore_glGetObjectParameterivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetObjectParameterivARB] + .global bluegl_glProgramUniform1ivEXT + .type bluegl_glProgramUniform1ivEXT, %function +bluegl_glProgramUniform1ivEXT: + adrp x16, :got:__blue_glCore_glProgramUniform1ivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1ivEXT] ldr x16, [x16] br x16 - .size bluegl_glGetObjectParameterivARB, .-bluegl_glGetObjectParameterivARB + .size bluegl_glProgramUniform1ivEXT, .-bluegl_glProgramUniform1ivEXT .align 2 - .global bluegl_glEnableClientStateiEXT - .type bluegl_glEnableClientStateiEXT, %function -bluegl_glEnableClientStateiEXT: - adrp x16, :got:__blue_glCore_glEnableClientStateiEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableClientStateiEXT] + .global bluegl_glProgramUniform2ivEXT + .type bluegl_glProgramUniform2ivEXT, %function +bluegl_glProgramUniform2ivEXT: + adrp x16, :got:__blue_glCore_glProgramUniform2ivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2ivEXT] ldr x16, [x16] br x16 - .size bluegl_glEnableClientStateiEXT, .-bluegl_glEnableClientStateiEXT + .size bluegl_glProgramUniform2ivEXT, .-bluegl_glProgramUniform2ivEXT .align 2 - .global bluegl_glGetnUniformi64vARB - .type bluegl_glGetnUniformi64vARB, %function -bluegl_glGetnUniformi64vARB: - adrp x16, :got:__blue_glCore_glGetnUniformi64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformi64vARB] + .global bluegl_glProgramUniform3ivEXT + .type bluegl_glProgramUniform3ivEXT, %function +bluegl_glProgramUniform3ivEXT: + adrp x16, :got:__blue_glCore_glProgramUniform3ivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3ivEXT] ldr x16, [x16] br x16 - .size bluegl_glGetnUniformi64vARB, .-bluegl_glGetnUniformi64vARB + .size bluegl_glProgramUniform3ivEXT, .-bluegl_glProgramUniform3ivEXT .align 2 - .global bluegl_glDeleteFencesAPPLE - .type bluegl_glDeleteFencesAPPLE, %function -bluegl_glDeleteFencesAPPLE: - adrp x16, :got:__blue_glCore_glDeleteFencesAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteFencesAPPLE] + .global bluegl_glProgramUniform4ivEXT + .type bluegl_glProgramUniform4ivEXT, %function +bluegl_glProgramUniform4ivEXT: + adrp x16, :got:__blue_glCore_glProgramUniform4ivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4ivEXT] ldr x16, [x16] br x16 - .size bluegl_glDeleteFencesAPPLE, .-bluegl_glDeleteFencesAPPLE + .size bluegl_glProgramUniform4ivEXT, .-bluegl_glProgramUniform4ivEXT .align 2 - .global bluegl_glTransformFeedbackBufferRange - .type bluegl_glTransformFeedbackBufferRange, %function -bluegl_glTransformFeedbackBufferRange: - adrp x16, :got:__blue_glCore_glTransformFeedbackBufferRange - ldr x16, [x16, #:got_lo12:__blue_glCore_glTransformFeedbackBufferRange] + .global bluegl_glProgramUniformMatrix2fvEXT + .type bluegl_glProgramUniformMatrix2fvEXT, %function +bluegl_glProgramUniformMatrix2fvEXT: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix2fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2fvEXT] ldr x16, [x16] br x16 - .size bluegl_glTransformFeedbackBufferRange, .-bluegl_glTransformFeedbackBufferRange + .size bluegl_glProgramUniformMatrix2fvEXT, .-bluegl_glProgramUniformMatrix2fvEXT .align 2 - .global bluegl_glProgramUniform2fvEXT - .type bluegl_glProgramUniform2fvEXT, %function -bluegl_glProgramUniform2fvEXT: - adrp x16, :got:__blue_glCore_glProgramUniform2fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2fvEXT] + .global bluegl_glProgramUniformMatrix3fvEXT + .type bluegl_glProgramUniformMatrix3fvEXT, %function +bluegl_glProgramUniformMatrix3fvEXT: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix3fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3fvEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2fvEXT, .-bluegl_glProgramUniform2fvEXT + .size bluegl_glProgramUniformMatrix3fvEXT, .-bluegl_glProgramUniformMatrix3fvEXT .align 2 - .global bluegl_glFramebufferTextureLayerARB - .type bluegl_glFramebufferTextureLayerARB, %function -bluegl_glFramebufferTextureLayerARB: - adrp x16, :got:__blue_glCore_glFramebufferTextureLayerARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTextureLayerARB] + .global bluegl_glProgramUniformMatrix4fvEXT + .type bluegl_glProgramUniformMatrix4fvEXT, %function +bluegl_glProgramUniformMatrix4fvEXT: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix4fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4fvEXT] ldr x16, [x16] br x16 - .size bluegl_glFramebufferTextureLayerARB, .-bluegl_glFramebufferTextureLayerARB + .size bluegl_glProgramUniformMatrix4fvEXT, .-bluegl_glProgramUniformMatrix4fvEXT .align 2 - .global bluegl_glVertexAttribLFormatNV - .type bluegl_glVertexAttribLFormatNV, %function -bluegl_glVertexAttribLFormatNV: - adrp x16, :got:__blue_glCore_glVertexAttribLFormatNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribLFormatNV] + .global bluegl_glProgramUniformMatrix2x3fvEXT + .type bluegl_glProgramUniformMatrix2x3fvEXT, %function +bluegl_glProgramUniformMatrix2x3fvEXT: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix2x3fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2x3fvEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribLFormatNV, .-bluegl_glVertexAttribLFormatNV + .size bluegl_glProgramUniformMatrix2x3fvEXT, .-bluegl_glProgramUniformMatrix2x3fvEXT .align 2 - .global bluegl_glVertexAttrib2fvARB - .type bluegl_glVertexAttrib2fvARB, %function -bluegl_glVertexAttrib2fvARB: - adrp x16, :got:__blue_glCore_glVertexAttrib2fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2fvARB] + .global bluegl_glProgramUniformMatrix3x2fvEXT + .type bluegl_glProgramUniformMatrix3x2fvEXT, %function +bluegl_glProgramUniformMatrix3x2fvEXT: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix3x2fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3x2fvEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2fvARB, .-bluegl_glVertexAttrib2fvARB + .size bluegl_glProgramUniformMatrix3x2fvEXT, .-bluegl_glProgramUniformMatrix3x2fvEXT .align 2 - .global bluegl_glWindowPos4fvMESA - .type bluegl_glWindowPos4fvMESA, %function -bluegl_glWindowPos4fvMESA: - adrp x16, :got:__blue_glCore_glWindowPos4fvMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos4fvMESA] + .global bluegl_glProgramUniformMatrix2x4fvEXT + .type bluegl_glProgramUniformMatrix2x4fvEXT, %function +bluegl_glProgramUniformMatrix2x4fvEXT: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix2x4fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2x4fvEXT] ldr x16, [x16] br x16 - .size bluegl_glWindowPos4fvMESA, .-bluegl_glWindowPos4fvMESA + .size bluegl_glProgramUniformMatrix2x4fvEXT, .-bluegl_glProgramUniformMatrix2x4fvEXT .align 2 - .global bluegl_glMakeNamedBufferResidentNV - .type bluegl_glMakeNamedBufferResidentNV, %function -bluegl_glMakeNamedBufferResidentNV: - adrp x16, :got:__blue_glCore_glMakeNamedBufferResidentNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeNamedBufferResidentNV] + .global bluegl_glProgramUniformMatrix4x2fvEXT + .type bluegl_glProgramUniformMatrix4x2fvEXT, %function +bluegl_glProgramUniformMatrix4x2fvEXT: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix4x2fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4x2fvEXT] ldr x16, [x16] br x16 - .size bluegl_glMakeNamedBufferResidentNV, .-bluegl_glMakeNamedBufferResidentNV + .size bluegl_glProgramUniformMatrix4x2fvEXT, .-bluegl_glProgramUniformMatrix4x2fvEXT .align 2 .global bluegl_glProgramUniformMatrix3x4fvEXT @@ -16410,1194 +16299,1204 @@ bluegl_glProgramUniformMatrix3x4fvEXT: .size bluegl_glProgramUniformMatrix3x4fvEXT, .-bluegl_glProgramUniformMatrix3x4fvEXT .align 2 - .global bluegl_glSamplePatternSGIS - .type bluegl_glSamplePatternSGIS, %function -bluegl_glSamplePatternSGIS: - adrp x16, :got:__blue_glCore_glSamplePatternSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glSamplePatternSGIS] + .global bluegl_glProgramUniformMatrix4x3fvEXT + .type bluegl_glProgramUniformMatrix4x3fvEXT, %function +bluegl_glProgramUniformMatrix4x3fvEXT: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix4x3fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4x3fvEXT] ldr x16, [x16] br x16 - .size bluegl_glSamplePatternSGIS, .-bluegl_glSamplePatternSGIS + .size bluegl_glProgramUniformMatrix4x3fvEXT, .-bluegl_glProgramUniformMatrix4x3fvEXT .align 2 - .global bluegl_glVDPAUGetSurfaceivNV - .type bluegl_glVDPAUGetSurfaceivNV, %function -bluegl_glVDPAUGetSurfaceivNV: - adrp x16, :got:__blue_glCore_glVDPAUGetSurfaceivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAUGetSurfaceivNV] + .global bluegl_glTextureBufferEXT + .type bluegl_glTextureBufferEXT, %function +bluegl_glTextureBufferEXT: + adrp x16, :got:__blue_glCore_glTextureBufferEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureBufferEXT] ldr x16, [x16] br x16 - .size bluegl_glVDPAUGetSurfaceivNV, .-bluegl_glVDPAUGetSurfaceivNV + .size bluegl_glTextureBufferEXT, .-bluegl_glTextureBufferEXT .align 2 - .global bluegl_glProgramUniformMatrix4x2fvEXT - .type bluegl_glProgramUniformMatrix4x2fvEXT, %function -bluegl_glProgramUniformMatrix4x2fvEXT: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix4x2fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4x2fvEXT] + .global bluegl_glMultiTexBufferEXT + .type bluegl_glMultiTexBufferEXT, %function +bluegl_glMultiTexBufferEXT: + adrp x16, :got:__blue_glCore_glMultiTexBufferEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexBufferEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix4x2fvEXT, .-bluegl_glProgramUniformMatrix4x2fvEXT + .size bluegl_glMultiTexBufferEXT, .-bluegl_glMultiTexBufferEXT .align 2 - .global bluegl_glReplacementCodeuiColor3fVertex3fvSUN - .type bluegl_glReplacementCodeuiColor3fVertex3fvSUN, %function -bluegl_glReplacementCodeuiColor3fVertex3fvSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN] + .global bluegl_glTextureParameterIivEXT + .type bluegl_glTextureParameterIivEXT, %function +bluegl_glTextureParameterIivEXT: + adrp x16, :got:__blue_glCore_glTextureParameterIivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameterIivEXT] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeuiColor3fVertex3fvSUN, .-bluegl_glReplacementCodeuiColor3fVertex3fvSUN + .size bluegl_glTextureParameterIivEXT, .-bluegl_glTextureParameterIivEXT .align 2 - .global bluegl_glWindowPos3sMESA - .type bluegl_glWindowPos3sMESA, %function -bluegl_glWindowPos3sMESA: - adrp x16, :got:__blue_glCore_glWindowPos3sMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3sMESA] + .global bluegl_glTextureParameterIuivEXT + .type bluegl_glTextureParameterIuivEXT, %function +bluegl_glTextureParameterIuivEXT: + adrp x16, :got:__blue_glCore_glTextureParameterIuivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameterIuivEXT] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3sMESA, .-bluegl_glWindowPos3sMESA - - .align 2 - .global bluegl_glTexGenxOES - .type bluegl_glTexGenxOES, %function -bluegl_glTexGenxOES: - adrp x16, :got:__blue_glCore_glTexGenxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexGenxOES] + .size bluegl_glTextureParameterIuivEXT, .-bluegl_glTextureParameterIuivEXT + + .align 2 + .global bluegl_glGetTextureParameterIivEXT + .type bluegl_glGetTextureParameterIivEXT, %function +bluegl_glGetTextureParameterIivEXT: + adrp x16, :got:__blue_glCore_glGetTextureParameterIivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureParameterIivEXT] ldr x16, [x16] br x16 - .size bluegl_glTexGenxOES, .-bluegl_glTexGenxOES + .size bluegl_glGetTextureParameterIivEXT, .-bluegl_glGetTextureParameterIivEXT .align 2 - .global bluegl_glVertexAttrib4dNV - .type bluegl_glVertexAttrib4dNV, %function -bluegl_glVertexAttrib4dNV: - adrp x16, :got:__blue_glCore_glVertexAttrib4dNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4dNV] + .global bluegl_glGetTextureParameterIuivEXT + .type bluegl_glGetTextureParameterIuivEXT, %function +bluegl_glGetTextureParameterIuivEXT: + adrp x16, :got:__blue_glCore_glGetTextureParameterIuivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureParameterIuivEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4dNV, .-bluegl_glVertexAttrib4dNV + .size bluegl_glGetTextureParameterIuivEXT, .-bluegl_glGetTextureParameterIuivEXT .align 2 - .global bluegl_glTangentPointerEXT - .type bluegl_glTangentPointerEXT, %function -bluegl_glTangentPointerEXT: - adrp x16, :got:__blue_glCore_glTangentPointerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTangentPointerEXT] + .global bluegl_glMultiTexParameterIivEXT + .type bluegl_glMultiTexParameterIivEXT, %function +bluegl_glMultiTexParameterIivEXT: + adrp x16, :got:__blue_glCore_glMultiTexParameterIivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexParameterIivEXT] ldr x16, [x16] br x16 - .size bluegl_glTangentPointerEXT, .-bluegl_glTangentPointerEXT + .size bluegl_glMultiTexParameterIivEXT, .-bluegl_glMultiTexParameterIivEXT .align 2 - .global bluegl_glPixelTransformParameterfvEXT - .type bluegl_glPixelTransformParameterfvEXT, %function -bluegl_glPixelTransformParameterfvEXT: - adrp x16, :got:__blue_glCore_glPixelTransformParameterfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTransformParameterfvEXT] + .global bluegl_glMultiTexParameterIuivEXT + .type bluegl_glMultiTexParameterIuivEXT, %function +bluegl_glMultiTexParameterIuivEXT: + adrp x16, :got:__blue_glCore_glMultiTexParameterIuivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexParameterIuivEXT] ldr x16, [x16] br x16 - .size bluegl_glPixelTransformParameterfvEXT, .-bluegl_glPixelTransformParameterfvEXT + .size bluegl_glMultiTexParameterIuivEXT, .-bluegl_glMultiTexParameterIuivEXT .align 2 - .global bluegl_glProgramUniform1i - .type bluegl_glProgramUniform1i, %function -bluegl_glProgramUniform1i: - adrp x16, :got:__blue_glCore_glProgramUniform1i - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1i] + .global bluegl_glGetMultiTexParameterIivEXT + .type bluegl_glGetMultiTexParameterIivEXT, %function +bluegl_glGetMultiTexParameterIivEXT: + adrp x16, :got:__blue_glCore_glGetMultiTexParameterIivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexParameterIivEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1i, .-bluegl_glProgramUniform1i + .size bluegl_glGetMultiTexParameterIivEXT, .-bluegl_glGetMultiTexParameterIivEXT .align 2 - .global bluegl_glMultiTexCoord2bOES - .type bluegl_glMultiTexCoord2bOES, %function -bluegl_glMultiTexCoord2bOES: - adrp x16, :got:__blue_glCore_glMultiTexCoord2bOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2bOES] + .global bluegl_glGetMultiTexParameterIuivEXT + .type bluegl_glGetMultiTexParameterIuivEXT, %function +bluegl_glGetMultiTexParameterIuivEXT: + adrp x16, :got:__blue_glCore_glGetMultiTexParameterIuivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexParameterIuivEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2bOES, .-bluegl_glMultiTexCoord2bOES + .size bluegl_glGetMultiTexParameterIuivEXT, .-bluegl_glGetMultiTexParameterIuivEXT .align 2 - .global bluegl_glVertexAttribI2iv - .type bluegl_glVertexAttribI2iv, %function -bluegl_glVertexAttribI2iv: - adrp x16, :got:__blue_glCore_glVertexAttribI2iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI2iv] + .global bluegl_glProgramUniform1uiEXT + .type bluegl_glProgramUniform1uiEXT, %function +bluegl_glProgramUniform1uiEXT: + adrp x16, :got:__blue_glCore_glProgramUniform1uiEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1uiEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI2iv, .-bluegl_glVertexAttribI2iv + .size bluegl_glProgramUniform1uiEXT, .-bluegl_glProgramUniform1uiEXT .align 2 - .global bluegl_glWindowPos4iMESA - .type bluegl_glWindowPos4iMESA, %function -bluegl_glWindowPos4iMESA: - adrp x16, :got:__blue_glCore_glWindowPos4iMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos4iMESA] + .global bluegl_glProgramUniform2uiEXT + .type bluegl_glProgramUniform2uiEXT, %function +bluegl_glProgramUniform2uiEXT: + adrp x16, :got:__blue_glCore_glProgramUniform2uiEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2uiEXT] ldr x16, [x16] br x16 - .size bluegl_glWindowPos4iMESA, .-bluegl_glWindowPos4iMESA + .size bluegl_glProgramUniform2uiEXT, .-bluegl_glProgramUniform2uiEXT .align 2 - .global bluegl_glTestFenceNV - .type bluegl_glTestFenceNV, %function -bluegl_glTestFenceNV: - adrp x16, :got:__blue_glCore_glTestFenceNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTestFenceNV] + .global bluegl_glProgramUniform3uiEXT + .type bluegl_glProgramUniform3uiEXT, %function +bluegl_glProgramUniform3uiEXT: + adrp x16, :got:__blue_glCore_glProgramUniform3uiEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3uiEXT] ldr x16, [x16] br x16 - .size bluegl_glTestFenceNV, .-bluegl_glTestFenceNV + .size bluegl_glProgramUniform3uiEXT, .-bluegl_glProgramUniform3uiEXT .align 2 - .global bluegl_glDispatchComputeGroupSizeARB - .type bluegl_glDispatchComputeGroupSizeARB, %function -bluegl_glDispatchComputeGroupSizeARB: - adrp x16, :got:__blue_glCore_glDispatchComputeGroupSizeARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glDispatchComputeGroupSizeARB] + .global bluegl_glProgramUniform4uiEXT + .type bluegl_glProgramUniform4uiEXT, %function +bluegl_glProgramUniform4uiEXT: + adrp x16, :got:__blue_glCore_glProgramUniform4uiEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4uiEXT] ldr x16, [x16] br x16 - .size bluegl_glDispatchComputeGroupSizeARB, .-bluegl_glDispatchComputeGroupSizeARB + .size bluegl_glProgramUniform4uiEXT, .-bluegl_glProgramUniform4uiEXT .align 2 - .global bluegl_glShaderOp3EXT - .type bluegl_glShaderOp3EXT, %function -bluegl_glShaderOp3EXT: - adrp x16, :got:__blue_glCore_glShaderOp3EXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glShaderOp3EXT] + .global bluegl_glProgramUniform1uivEXT + .type bluegl_glProgramUniform1uivEXT, %function +bluegl_glProgramUniform1uivEXT: + adrp x16, :got:__blue_glCore_glProgramUniform1uivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1uivEXT] ldr x16, [x16] br x16 - .size bluegl_glShaderOp3EXT, .-bluegl_glShaderOp3EXT + .size bluegl_glProgramUniform1uivEXT, .-bluegl_glProgramUniform1uivEXT .align 2 - .global bluegl_glSampleMaskSGIS - .type bluegl_glSampleMaskSGIS, %function -bluegl_glSampleMaskSGIS: - adrp x16, :got:__blue_glCore_glSampleMaskSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glSampleMaskSGIS] + .global bluegl_glProgramUniform2uivEXT + .type bluegl_glProgramUniform2uivEXT, %function +bluegl_glProgramUniform2uivEXT: + adrp x16, :got:__blue_glCore_glProgramUniform2uivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2uivEXT] ldr x16, [x16] br x16 - .size bluegl_glSampleMaskSGIS, .-bluegl_glSampleMaskSGIS + .size bluegl_glProgramUniform2uivEXT, .-bluegl_glProgramUniform2uivEXT .align 2 - .global bluegl_glMultiTexParameterivEXT - .type bluegl_glMultiTexParameterivEXT, %function -bluegl_glMultiTexParameterivEXT: - adrp x16, :got:__blue_glCore_glMultiTexParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexParameterivEXT] + .global bluegl_glProgramUniform3uivEXT + .type bluegl_glProgramUniform3uivEXT, %function +bluegl_glProgramUniform3uivEXT: + adrp x16, :got:__blue_glCore_glProgramUniform3uivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3uivEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexParameterivEXT, .-bluegl_glMultiTexParameterivEXT + .size bluegl_glProgramUniform3uivEXT, .-bluegl_glProgramUniform3uivEXT .align 2 - .global bluegl_glGetnMinmax - .type bluegl_glGetnMinmax, %function -bluegl_glGetnMinmax: - adrp x16, :got:__blue_glCore_glGetnMinmax - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnMinmax] + .global bluegl_glProgramUniform4uivEXT + .type bluegl_glProgramUniform4uivEXT, %function +bluegl_glProgramUniform4uivEXT: + adrp x16, :got:__blue_glCore_glProgramUniform4uivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4uivEXT] ldr x16, [x16] br x16 - .size bluegl_glGetnMinmax, .-bluegl_glGetnMinmax + .size bluegl_glProgramUniform4uivEXT, .-bluegl_glProgramUniform4uivEXT .align 2 - .global bluegl_glColorP3ui - .type bluegl_glColorP3ui, %function -bluegl_glColorP3ui: - adrp x16, :got:__blue_glCore_glColorP3ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorP3ui] + .global bluegl_glNamedProgramLocalParameters4fvEXT + .type bluegl_glNamedProgramLocalParameters4fvEXT, %function +bluegl_glNamedProgramLocalParameters4fvEXT: + adrp x16, :got:__blue_glCore_glNamedProgramLocalParameters4fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParameters4fvEXT] ldr x16, [x16] br x16 - .size bluegl_glColorP3ui, .-bluegl_glColorP3ui + .size bluegl_glNamedProgramLocalParameters4fvEXT, .-bluegl_glNamedProgramLocalParameters4fvEXT .align 2 - .global bluegl_glBeginQueryARB - .type bluegl_glBeginQueryARB, %function -bluegl_glBeginQueryARB: - adrp x16, :got:__blue_glCore_glBeginQueryARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginQueryARB] + .global bluegl_glNamedProgramLocalParameterI4iEXT + .type bluegl_glNamedProgramLocalParameterI4iEXT, %function +bluegl_glNamedProgramLocalParameterI4iEXT: + adrp x16, :got:__blue_glCore_glNamedProgramLocalParameterI4iEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParameterI4iEXT] ldr x16, [x16] br x16 - .size bluegl_glBeginQueryARB, .-bluegl_glBeginQueryARB + .size bluegl_glNamedProgramLocalParameterI4iEXT, .-bluegl_glNamedProgramLocalParameterI4iEXT .align 2 - .global bluegl_glMultiDrawArraysIndirectAMD - .type bluegl_glMultiDrawArraysIndirectAMD, %function -bluegl_glMultiDrawArraysIndirectAMD: - adrp x16, :got:__blue_glCore_glMultiDrawArraysIndirectAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawArraysIndirectAMD] + .global bluegl_glNamedProgramLocalParameterI4ivEXT + .type bluegl_glNamedProgramLocalParameterI4ivEXT, %function +bluegl_glNamedProgramLocalParameterI4ivEXT: + adrp x16, :got:__blue_glCore_glNamedProgramLocalParameterI4ivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParameterI4ivEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiDrawArraysIndirectAMD, .-bluegl_glMultiDrawArraysIndirectAMD + .size bluegl_glNamedProgramLocalParameterI4ivEXT, .-bluegl_glNamedProgramLocalParameterI4ivEXT .align 2 - .global bluegl_glRasterPos4xOES - .type bluegl_glRasterPos4xOES, %function -bluegl_glRasterPos4xOES: - adrp x16, :got:__blue_glCore_glRasterPos4xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glRasterPos4xOES] + .global bluegl_glNamedProgramLocalParametersI4ivEXT + .type bluegl_glNamedProgramLocalParametersI4ivEXT, %function +bluegl_glNamedProgramLocalParametersI4ivEXT: + adrp x16, :got:__blue_glCore_glNamedProgramLocalParametersI4ivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParametersI4ivEXT] ldr x16, [x16] br x16 - .size bluegl_glRasterPos4xOES, .-bluegl_glRasterPos4xOES + .size bluegl_glNamedProgramLocalParametersI4ivEXT, .-bluegl_glNamedProgramLocalParametersI4ivEXT .align 2 - .global bluegl_glFogCoordPointer - .type bluegl_glFogCoordPointer, %function -bluegl_glFogCoordPointer: - adrp x16, :got:__blue_glCore_glFogCoordPointer - ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordPointer] + .global bluegl_glNamedProgramLocalParameterI4uiEXT + .type bluegl_glNamedProgramLocalParameterI4uiEXT, %function +bluegl_glNamedProgramLocalParameterI4uiEXT: + adrp x16, :got:__blue_glCore_glNamedProgramLocalParameterI4uiEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParameterI4uiEXT] ldr x16, [x16] br x16 - .size bluegl_glFogCoordPointer, .-bluegl_glFogCoordPointer + .size bluegl_glNamedProgramLocalParameterI4uiEXT, .-bluegl_glNamedProgramLocalParameterI4uiEXT .align 2 - .global bluegl_glTextureLightEXT - .type bluegl_glTextureLightEXT, %function -bluegl_glTextureLightEXT: - adrp x16, :got:__blue_glCore_glTextureLightEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureLightEXT] + .global bluegl_glNamedProgramLocalParameterI4uivEXT + .type bluegl_glNamedProgramLocalParameterI4uivEXT, %function +bluegl_glNamedProgramLocalParameterI4uivEXT: + adrp x16, :got:__blue_glCore_glNamedProgramLocalParameterI4uivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParameterI4uivEXT] ldr x16, [x16] br x16 - .size bluegl_glTextureLightEXT, .-bluegl_glTextureLightEXT + .size bluegl_glNamedProgramLocalParameterI4uivEXT, .-bluegl_glNamedProgramLocalParameterI4uivEXT .align 2 - .global bluegl_glGetCombinerInputParameterfvNV - .type bluegl_glGetCombinerInputParameterfvNV, %function -bluegl_glGetCombinerInputParameterfvNV: - adrp x16, :got:__blue_glCore_glGetCombinerInputParameterfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCombinerInputParameterfvNV] + .global bluegl_glNamedProgramLocalParametersI4uivEXT + .type bluegl_glNamedProgramLocalParametersI4uivEXT, %function +bluegl_glNamedProgramLocalParametersI4uivEXT: + adrp x16, :got:__blue_glCore_glNamedProgramLocalParametersI4uivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParametersI4uivEXT] ldr x16, [x16] br x16 - .size bluegl_glGetCombinerInputParameterfvNV, .-bluegl_glGetCombinerInputParameterfvNV + .size bluegl_glNamedProgramLocalParametersI4uivEXT, .-bluegl_glNamedProgramLocalParametersI4uivEXT .align 2 - .global bluegl_glDeleteFragmentShaderATI - .type bluegl_glDeleteFragmentShaderATI, %function -bluegl_glDeleteFragmentShaderATI: - adrp x16, :got:__blue_glCore_glDeleteFragmentShaderATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteFragmentShaderATI] + .global bluegl_glGetNamedProgramLocalParameterIivEXT + .type bluegl_glGetNamedProgramLocalParameterIivEXT, %function +bluegl_glGetNamedProgramLocalParameterIivEXT: + adrp x16, :got:__blue_glCore_glGetNamedProgramLocalParameterIivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedProgramLocalParameterIivEXT] ldr x16, [x16] br x16 - .size bluegl_glDeleteFragmentShaderATI, .-bluegl_glDeleteFragmentShaderATI + .size bluegl_glGetNamedProgramLocalParameterIivEXT, .-bluegl_glGetNamedProgramLocalParameterIivEXT .align 2 - .global bluegl_glMultiTexCoord2sv - .type bluegl_glMultiTexCoord2sv, %function -bluegl_glMultiTexCoord2sv: - adrp x16, :got:__blue_glCore_glMultiTexCoord2sv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2sv] + .global bluegl_glGetNamedProgramLocalParameterIuivEXT + .type bluegl_glGetNamedProgramLocalParameterIuivEXT, %function +bluegl_glGetNamedProgramLocalParameterIuivEXT: + adrp x16, :got:__blue_glCore_glGetNamedProgramLocalParameterIuivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedProgramLocalParameterIuivEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2sv, .-bluegl_glMultiTexCoord2sv + .size bluegl_glGetNamedProgramLocalParameterIuivEXT, .-bluegl_glGetNamedProgramLocalParameterIuivEXT .align 2 - .global bluegl_glMultiTexCoord2s - .type bluegl_glMultiTexCoord2s, %function -bluegl_glMultiTexCoord2s: - adrp x16, :got:__blue_glCore_glMultiTexCoord2s - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2s] + .global bluegl_glEnableClientStateiEXT + .type bluegl_glEnableClientStateiEXT, %function +bluegl_glEnableClientStateiEXT: + adrp x16, :got:__blue_glCore_glEnableClientStateiEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableClientStateiEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2s, .-bluegl_glMultiTexCoord2s + .size bluegl_glEnableClientStateiEXT, .-bluegl_glEnableClientStateiEXT .align 2 - .global bluegl_glLightModelxvOES - .type bluegl_glLightModelxvOES, %function -bluegl_glLightModelxvOES: - adrp x16, :got:__blue_glCore_glLightModelxvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glLightModelxvOES] + .global bluegl_glDisableClientStateiEXT + .type bluegl_glDisableClientStateiEXT, %function +bluegl_glDisableClientStateiEXT: + adrp x16, :got:__blue_glCore_glDisableClientStateiEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableClientStateiEXT] ldr x16, [x16] br x16 - .size bluegl_glLightModelxvOES, .-bluegl_glLightModelxvOES + .size bluegl_glDisableClientStateiEXT, .-bluegl_glDisableClientStateiEXT .align 2 - .global bluegl_glTessellationFactorAMD - .type bluegl_glTessellationFactorAMD, %function -bluegl_glTessellationFactorAMD: - adrp x16, :got:__blue_glCore_glTessellationFactorAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glTessellationFactorAMD] + .global bluegl_glGetFloati_vEXT + .type bluegl_glGetFloati_vEXT, %function +bluegl_glGetFloati_vEXT: + adrp x16, :got:__blue_glCore_glGetFloati_vEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFloati_vEXT] ldr x16, [x16] br x16 - .size bluegl_glTessellationFactorAMD, .-bluegl_glTessellationFactorAMD + .size bluegl_glGetFloati_vEXT, .-bluegl_glGetFloati_vEXT .align 2 - .global bluegl_glVariantivEXT - .type bluegl_glVariantivEXT, %function -bluegl_glVariantivEXT: - adrp x16, :got:__blue_glCore_glVariantivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantivEXT] + .global bluegl_glGetDoublei_vEXT + .type bluegl_glGetDoublei_vEXT, %function +bluegl_glGetDoublei_vEXT: + adrp x16, :got:__blue_glCore_glGetDoublei_vEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetDoublei_vEXT] ldr x16, [x16] br x16 - .size bluegl_glVariantivEXT, .-bluegl_glVariantivEXT + .size bluegl_glGetDoublei_vEXT, .-bluegl_glGetDoublei_vEXT .align 2 - .global bluegl_glNamedFramebufferRenderbuffer - .type bluegl_glNamedFramebufferRenderbuffer, %function -bluegl_glNamedFramebufferRenderbuffer: - adrp x16, :got:__blue_glCore_glNamedFramebufferRenderbuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferRenderbuffer] + .global bluegl_glGetPointeri_vEXT + .type bluegl_glGetPointeri_vEXT, %function +bluegl_glGetPointeri_vEXT: + adrp x16, :got:__blue_glCore_glGetPointeri_vEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPointeri_vEXT] ldr x16, [x16] br x16 - .size bluegl_glNamedFramebufferRenderbuffer, .-bluegl_glNamedFramebufferRenderbuffer + .size bluegl_glGetPointeri_vEXT, .-bluegl_glGetPointeri_vEXT .align 2 - .global bluegl_glWindowPos2ivARB - .type bluegl_glWindowPos2ivARB, %function -bluegl_glWindowPos2ivARB: - adrp x16, :got:__blue_glCore_glWindowPos2ivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2ivARB] + .global bluegl_glNamedProgramStringEXT + .type bluegl_glNamedProgramStringEXT, %function +bluegl_glNamedProgramStringEXT: + adrp x16, :got:__blue_glCore_glNamedProgramStringEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramStringEXT] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2ivARB, .-bluegl_glWindowPos2ivARB + .size bluegl_glNamedProgramStringEXT, .-bluegl_glNamedProgramStringEXT .align 2 - .global bluegl_glVertexArrayFogCoordOffsetEXT - .type bluegl_glVertexArrayFogCoordOffsetEXT, %function -bluegl_glVertexArrayFogCoordOffsetEXT: - adrp x16, :got:__blue_glCore_glVertexArrayFogCoordOffsetEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayFogCoordOffsetEXT] + .global bluegl_glNamedProgramLocalParameter4dEXT + .type bluegl_glNamedProgramLocalParameter4dEXT, %function +bluegl_glNamedProgramLocalParameter4dEXT: + adrp x16, :got:__blue_glCore_glNamedProgramLocalParameter4dEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParameter4dEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayFogCoordOffsetEXT, .-bluegl_glVertexArrayFogCoordOffsetEXT + .size bluegl_glNamedProgramLocalParameter4dEXT, .-bluegl_glNamedProgramLocalParameter4dEXT .align 2 - .global bluegl_glUniform2i - .type bluegl_glUniform2i, %function -bluegl_glUniform2i: - adrp x16, :got:__blue_glCore_glUniform2i - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2i] + .global bluegl_glNamedProgramLocalParameter4dvEXT + .type bluegl_glNamedProgramLocalParameter4dvEXT, %function +bluegl_glNamedProgramLocalParameter4dvEXT: + adrp x16, :got:__blue_glCore_glNamedProgramLocalParameter4dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParameter4dvEXT] ldr x16, [x16] br x16 - .size bluegl_glUniform2i, .-bluegl_glUniform2i + .size bluegl_glNamedProgramLocalParameter4dvEXT, .-bluegl_glNamedProgramLocalParameter4dvEXT .align 2 - .global bluegl_glGetTexBumpParameterivATI - .type bluegl_glGetTexBumpParameterivATI, %function -bluegl_glGetTexBumpParameterivATI: - adrp x16, :got:__blue_glCore_glGetTexBumpParameterivATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexBumpParameterivATI] + .global bluegl_glNamedProgramLocalParameter4fEXT + .type bluegl_glNamedProgramLocalParameter4fEXT, %function +bluegl_glNamedProgramLocalParameter4fEXT: + adrp x16, :got:__blue_glCore_glNamedProgramLocalParameter4fEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParameter4fEXT] ldr x16, [x16] br x16 - .size bluegl_glGetTexBumpParameterivATI, .-bluegl_glGetTexBumpParameterivATI + .size bluegl_glNamedProgramLocalParameter4fEXT, .-bluegl_glNamedProgramLocalParameter4fEXT .align 2 - .global bluegl_glSamplerParameterIuiv - .type bluegl_glSamplerParameterIuiv, %function -bluegl_glSamplerParameterIuiv: - adrp x16, :got:__blue_glCore_glSamplerParameterIuiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glSamplerParameterIuiv] + .global bluegl_glNamedProgramLocalParameter4fvEXT + .type bluegl_glNamedProgramLocalParameter4fvEXT, %function +bluegl_glNamedProgramLocalParameter4fvEXT: + adrp x16, :got:__blue_glCore_glNamedProgramLocalParameter4fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParameter4fvEXT] ldr x16, [x16] br x16 - .size bluegl_glSamplerParameterIuiv, .-bluegl_glSamplerParameterIuiv + .size bluegl_glNamedProgramLocalParameter4fvEXT, .-bluegl_glNamedProgramLocalParameter4fvEXT .align 2 - .global bluegl_glClearBufferfv - .type bluegl_glClearBufferfv, %function -bluegl_glClearBufferfv: - adrp x16, :got:__blue_glCore_glClearBufferfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearBufferfv] + .global bluegl_glGetNamedProgramLocalParameterdvEXT + .type bluegl_glGetNamedProgramLocalParameterdvEXT, %function +bluegl_glGetNamedProgramLocalParameterdvEXT: + adrp x16, :got:__blue_glCore_glGetNamedProgramLocalParameterdvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedProgramLocalParameterdvEXT] ldr x16, [x16] br x16 - .size bluegl_glClearBufferfv, .-bluegl_glClearBufferfv + .size bluegl_glGetNamedProgramLocalParameterdvEXT, .-bluegl_glGetNamedProgramLocalParameterdvEXT .align 2 - .global bluegl_glBindTextureUnitParameterEXT - .type bluegl_glBindTextureUnitParameterEXT, %function -bluegl_glBindTextureUnitParameterEXT: - adrp x16, :got:__blue_glCore_glBindTextureUnitParameterEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindTextureUnitParameterEXT] + .global bluegl_glGetNamedProgramLocalParameterfvEXT + .type bluegl_glGetNamedProgramLocalParameterfvEXT, %function +bluegl_glGetNamedProgramLocalParameterfvEXT: + adrp x16, :got:__blue_glCore_glGetNamedProgramLocalParameterfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedProgramLocalParameterfvEXT] ldr x16, [x16] br x16 - .size bluegl_glBindTextureUnitParameterEXT, .-bluegl_glBindTextureUnitParameterEXT + .size bluegl_glGetNamedProgramLocalParameterfvEXT, .-bluegl_glGetNamedProgramLocalParameterfvEXT .align 2 - .global bluegl_glMultiTexCoord3hNV - .type bluegl_glMultiTexCoord3hNV, %function -bluegl_glMultiTexCoord3hNV: - adrp x16, :got:__blue_glCore_glMultiTexCoord3hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3hNV] + .global bluegl_glGetNamedProgramivEXT + .type bluegl_glGetNamedProgramivEXT, %function +bluegl_glGetNamedProgramivEXT: + adrp x16, :got:__blue_glCore_glGetNamedProgramivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedProgramivEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3hNV, .-bluegl_glMultiTexCoord3hNV + .size bluegl_glGetNamedProgramivEXT, .-bluegl_glGetNamedProgramivEXT .align 2 - .global bluegl_glSecondaryColor3us - .type bluegl_glSecondaryColor3us, %function -bluegl_glSecondaryColor3us: - adrp x16, :got:__blue_glCore_glSecondaryColor3us - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3us] + .global bluegl_glGetNamedProgramStringEXT + .type bluegl_glGetNamedProgramStringEXT, %function +bluegl_glGetNamedProgramStringEXT: + adrp x16, :got:__blue_glCore_glGetNamedProgramStringEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedProgramStringEXT] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3us, .-bluegl_glSecondaryColor3us + .size bluegl_glGetNamedProgramStringEXT, .-bluegl_glGetNamedProgramStringEXT .align 2 - .global bluegl_glReplacementCodeusvSUN - .type bluegl_glReplacementCodeusvSUN, %function -bluegl_glReplacementCodeusvSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeusvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeusvSUN] + .global bluegl_glNamedRenderbufferStorageEXT + .type bluegl_glNamedRenderbufferStorageEXT, %function +bluegl_glNamedRenderbufferStorageEXT: + adrp x16, :got:__blue_glCore_glNamedRenderbufferStorageEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedRenderbufferStorageEXT] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeusvSUN, .-bluegl_glReplacementCodeusvSUN + .size bluegl_glNamedRenderbufferStorageEXT, .-bluegl_glNamedRenderbufferStorageEXT .align 2 - .global bluegl_glSecondaryColor3bvEXT - .type bluegl_glSecondaryColor3bvEXT, %function -bluegl_glSecondaryColor3bvEXT: - adrp x16, :got:__blue_glCore_glSecondaryColor3bvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3bvEXT] + .global bluegl_glGetNamedRenderbufferParameterivEXT + .type bluegl_glGetNamedRenderbufferParameterivEXT, %function +bluegl_glGetNamedRenderbufferParameterivEXT: + adrp x16, :got:__blue_glCore_glGetNamedRenderbufferParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedRenderbufferParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3bvEXT, .-bluegl_glSecondaryColor3bvEXT + .size bluegl_glGetNamedRenderbufferParameterivEXT, .-bluegl_glGetNamedRenderbufferParameterivEXT .align 2 - .global bluegl_glGetProgramPipelineInfoLog - .type bluegl_glGetProgramPipelineInfoLog, %function -bluegl_glGetProgramPipelineInfoLog: - adrp x16, :got:__blue_glCore_glGetProgramPipelineInfoLog - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramPipelineInfoLog] + .global bluegl_glNamedRenderbufferStorageMultisampleEXT + .type bluegl_glNamedRenderbufferStorageMultisampleEXT, %function +bluegl_glNamedRenderbufferStorageMultisampleEXT: + adrp x16, :got:__blue_glCore_glNamedRenderbufferStorageMultisampleEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedRenderbufferStorageMultisampleEXT] ldr x16, [x16] br x16 - .size bluegl_glGetProgramPipelineInfoLog, .-bluegl_glGetProgramPipelineInfoLog + .size bluegl_glNamedRenderbufferStorageMultisampleEXT, .-bluegl_glNamedRenderbufferStorageMultisampleEXT .align 2 - .global bluegl_glGetVideoi64vNV - .type bluegl_glGetVideoi64vNV, %function -bluegl_glGetVideoi64vNV: - adrp x16, :got:__blue_glCore_glGetVideoi64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVideoi64vNV] + .global bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT + .type bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT, %function +bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT: + adrp x16, :got:__blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT] ldr x16, [x16] br x16 - .size bluegl_glGetVideoi64vNV, .-bluegl_glGetVideoi64vNV + .size bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT, .-bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT .align 2 - .global bluegl_glMultiTexCoord3iv - .type bluegl_glMultiTexCoord3iv, %function -bluegl_glMultiTexCoord3iv: - adrp x16, :got:__blue_glCore_glMultiTexCoord3iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3iv] + .global bluegl_glCheckNamedFramebufferStatusEXT + .type bluegl_glCheckNamedFramebufferStatusEXT, %function +bluegl_glCheckNamedFramebufferStatusEXT: + adrp x16, :got:__blue_glCore_glCheckNamedFramebufferStatusEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCheckNamedFramebufferStatusEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3iv, .-bluegl_glMultiTexCoord3iv + .size bluegl_glCheckNamedFramebufferStatusEXT, .-bluegl_glCheckNamedFramebufferStatusEXT .align 2 - .global bluegl_glVertexArrayTexCoordOffsetEXT - .type bluegl_glVertexArrayTexCoordOffsetEXT, %function -bluegl_glVertexArrayTexCoordOffsetEXT: - adrp x16, :got:__blue_glCore_glVertexArrayTexCoordOffsetEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayTexCoordOffsetEXT] + .global bluegl_glNamedFramebufferTexture1DEXT + .type bluegl_glNamedFramebufferTexture1DEXT, %function +bluegl_glNamedFramebufferTexture1DEXT: + adrp x16, :got:__blue_glCore_glNamedFramebufferTexture1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferTexture1DEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayTexCoordOffsetEXT, .-bluegl_glVertexArrayTexCoordOffsetEXT + .size bluegl_glNamedFramebufferTexture1DEXT, .-bluegl_glNamedFramebufferTexture1DEXT .align 2 - .global bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT - .type bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT, %function -bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT: - adrp x16, :got:__blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT] + .global bluegl_glNamedFramebufferTexture2DEXT + .type bluegl_glNamedFramebufferTexture2DEXT, %function +bluegl_glNamedFramebufferTexture2DEXT: + adrp x16, :got:__blue_glCore_glNamedFramebufferTexture2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferTexture2DEXT] ldr x16, [x16] br x16 - .size bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT, .-bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT + .size bluegl_glNamedFramebufferTexture2DEXT, .-bluegl_glNamedFramebufferTexture2DEXT .align 2 - .global bluegl_glGetSamplerParameterIuiv - .type bluegl_glGetSamplerParameterIuiv, %function -bluegl_glGetSamplerParameterIuiv: - adrp x16, :got:__blue_glCore_glGetSamplerParameterIuiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSamplerParameterIuiv] + .global bluegl_glNamedFramebufferTexture3DEXT + .type bluegl_glNamedFramebufferTexture3DEXT, %function +bluegl_glNamedFramebufferTexture3DEXT: + adrp x16, :got:__blue_glCore_glNamedFramebufferTexture3DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferTexture3DEXT] ldr x16, [x16] br x16 - .size bluegl_glGetSamplerParameterIuiv, .-bluegl_glGetSamplerParameterIuiv + .size bluegl_glNamedFramebufferTexture3DEXT, .-bluegl_glNamedFramebufferTexture3DEXT .align 2 - .global bluegl_glVertexAttrib2dARB - .type bluegl_glVertexAttrib2dARB, %function -bluegl_glVertexAttrib2dARB: - adrp x16, :got:__blue_glCore_glVertexAttrib2dARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2dARB] + .global bluegl_glNamedFramebufferRenderbufferEXT + .type bluegl_glNamedFramebufferRenderbufferEXT, %function +bluegl_glNamedFramebufferRenderbufferEXT: + adrp x16, :got:__blue_glCore_glNamedFramebufferRenderbufferEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferRenderbufferEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2dARB, .-bluegl_glVertexAttrib2dARB + .size bluegl_glNamedFramebufferRenderbufferEXT, .-bluegl_glNamedFramebufferRenderbufferEXT .align 2 - .global bluegl_glNormalStream3svATI - .type bluegl_glNormalStream3svATI, %function -bluegl_glNormalStream3svATI: - adrp x16, :got:__blue_glCore_glNormalStream3svATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3svATI] + .global bluegl_glGetNamedFramebufferAttachmentParameterivEXT + .type bluegl_glGetNamedFramebufferAttachmentParameterivEXT, %function +bluegl_glGetNamedFramebufferAttachmentParameterivEXT: + adrp x16, :got:__blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glNormalStream3svATI, .-bluegl_glNormalStream3svATI + .size bluegl_glGetNamedFramebufferAttachmentParameterivEXT, .-bluegl_glGetNamedFramebufferAttachmentParameterivEXT .align 2 - .global bluegl_glClientActiveVertexStreamATI - .type bluegl_glClientActiveVertexStreamATI, %function -bluegl_glClientActiveVertexStreamATI: - adrp x16, :got:__blue_glCore_glClientActiveVertexStreamATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glClientActiveVertexStreamATI] + .global bluegl_glGenerateTextureMipmapEXT + .type bluegl_glGenerateTextureMipmapEXT, %function +bluegl_glGenerateTextureMipmapEXT: + adrp x16, :got:__blue_glCore_glGenerateTextureMipmapEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenerateTextureMipmapEXT] ldr x16, [x16] br x16 - .size bluegl_glClientActiveVertexStreamATI, .-bluegl_glClientActiveVertexStreamATI + .size bluegl_glGenerateTextureMipmapEXT, .-bluegl_glGenerateTextureMipmapEXT .align 2 - .global bluegl_glStencilThenCoverFillPathInstancedNV - .type bluegl_glStencilThenCoverFillPathInstancedNV, %function -bluegl_glStencilThenCoverFillPathInstancedNV: - adrp x16, :got:__blue_glCore_glStencilThenCoverFillPathInstancedNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilThenCoverFillPathInstancedNV] + .global bluegl_glGenerateMultiTexMipmapEXT + .type bluegl_glGenerateMultiTexMipmapEXT, %function +bluegl_glGenerateMultiTexMipmapEXT: + adrp x16, :got:__blue_glCore_glGenerateMultiTexMipmapEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenerateMultiTexMipmapEXT] ldr x16, [x16] br x16 - .size bluegl_glStencilThenCoverFillPathInstancedNV, .-bluegl_glStencilThenCoverFillPathInstancedNV + .size bluegl_glGenerateMultiTexMipmapEXT, .-bluegl_glGenerateMultiTexMipmapEXT .align 2 - .global bluegl_glSecondaryColor3uiEXT - .type bluegl_glSecondaryColor3uiEXT, %function -bluegl_glSecondaryColor3uiEXT: - adrp x16, :got:__blue_glCore_glSecondaryColor3uiEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3uiEXT] + .global bluegl_glFramebufferDrawBufferEXT + .type bluegl_glFramebufferDrawBufferEXT, %function +bluegl_glFramebufferDrawBufferEXT: + adrp x16, :got:__blue_glCore_glFramebufferDrawBufferEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferDrawBufferEXT] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3uiEXT, .-bluegl_glSecondaryColor3uiEXT + .size bluegl_glFramebufferDrawBufferEXT, .-bluegl_glFramebufferDrawBufferEXT .align 2 - .global bluegl_glTexCoord2hNV - .type bluegl_glTexCoord2hNV, %function -bluegl_glTexCoord2hNV: - adrp x16, :got:__blue_glCore_glTexCoord2hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2hNV] + .global bluegl_glFramebufferDrawBuffersEXT + .type bluegl_glFramebufferDrawBuffersEXT, %function +bluegl_glFramebufferDrawBuffersEXT: + adrp x16, :got:__blue_glCore_glFramebufferDrawBuffersEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferDrawBuffersEXT] ldr x16, [x16] br x16 - .size bluegl_glTexCoord2hNV, .-bluegl_glTexCoord2hNV + .size bluegl_glFramebufferDrawBuffersEXT, .-bluegl_glFramebufferDrawBuffersEXT .align 2 - .global bluegl_glVertexAttrib3fARB - .type bluegl_glVertexAttrib3fARB, %function -bluegl_glVertexAttrib3fARB: - adrp x16, :got:__blue_glCore_glVertexAttrib3fARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3fARB] + .global bluegl_glFramebufferReadBufferEXT + .type bluegl_glFramebufferReadBufferEXT, %function +bluegl_glFramebufferReadBufferEXT: + adrp x16, :got:__blue_glCore_glFramebufferReadBufferEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferReadBufferEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3fARB, .-bluegl_glVertexAttrib3fARB + .size bluegl_glFramebufferReadBufferEXT, .-bluegl_glFramebufferReadBufferEXT .align 2 - .global bluegl_glGetQueryBufferObjectui64v - .type bluegl_glGetQueryBufferObjectui64v, %function -bluegl_glGetQueryBufferObjectui64v: - adrp x16, :got:__blue_glCore_glGetQueryBufferObjectui64v - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryBufferObjectui64v] + .global bluegl_glGetFramebufferParameterivEXT + .type bluegl_glGetFramebufferParameterivEXT, %function +bluegl_glGetFramebufferParameterivEXT: + adrp x16, :got:__blue_glCore_glGetFramebufferParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFramebufferParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glGetQueryBufferObjectui64v, .-bluegl_glGetQueryBufferObjectui64v + .size bluegl_glGetFramebufferParameterivEXT, .-bluegl_glGetFramebufferParameterivEXT .align 2 - .global bluegl_glGetMaterialxOES - .type bluegl_glGetMaterialxOES, %function -bluegl_glGetMaterialxOES: - adrp x16, :got:__blue_glCore_glGetMaterialxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMaterialxOES] + .global bluegl_glNamedCopyBufferSubDataEXT + .type bluegl_glNamedCopyBufferSubDataEXT, %function +bluegl_glNamedCopyBufferSubDataEXT: + adrp x16, :got:__blue_glCore_glNamedCopyBufferSubDataEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedCopyBufferSubDataEXT] ldr x16, [x16] br x16 - .size bluegl_glGetMaterialxOES, .-bluegl_glGetMaterialxOES + .size bluegl_glNamedCopyBufferSubDataEXT, .-bluegl_glNamedCopyBufferSubDataEXT .align 2 - .global bluegl_glMultiDrawArrays - .type bluegl_glMultiDrawArrays, %function -bluegl_glMultiDrawArrays: - adrp x16, :got:__blue_glCore_glMultiDrawArrays - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawArrays] + .global bluegl_glNamedFramebufferTextureEXT + .type bluegl_glNamedFramebufferTextureEXT, %function +bluegl_glNamedFramebufferTextureEXT: + adrp x16, :got:__blue_glCore_glNamedFramebufferTextureEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferTextureEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiDrawArrays, .-bluegl_glMultiDrawArrays + .size bluegl_glNamedFramebufferTextureEXT, .-bluegl_glNamedFramebufferTextureEXT .align 2 - .global bluegl_glSecondaryColor3iEXT - .type bluegl_glSecondaryColor3iEXT, %function -bluegl_glSecondaryColor3iEXT: - adrp x16, :got:__blue_glCore_glSecondaryColor3iEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3iEXT] + .global bluegl_glNamedFramebufferTextureLayerEXT + .type bluegl_glNamedFramebufferTextureLayerEXT, %function +bluegl_glNamedFramebufferTextureLayerEXT: + adrp x16, :got:__blue_glCore_glNamedFramebufferTextureLayerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferTextureLayerEXT] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3iEXT, .-bluegl_glSecondaryColor3iEXT + .size bluegl_glNamedFramebufferTextureLayerEXT, .-bluegl_glNamedFramebufferTextureLayerEXT .align 2 - .global bluegl_glProgramUniform2ui64NV - .type bluegl_glProgramUniform2ui64NV, %function -bluegl_glProgramUniform2ui64NV: - adrp x16, :got:__blue_glCore_glProgramUniform2ui64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2ui64NV] + .global bluegl_glNamedFramebufferTextureFaceEXT + .type bluegl_glNamedFramebufferTextureFaceEXT, %function +bluegl_glNamedFramebufferTextureFaceEXT: + adrp x16, :got:__blue_glCore_glNamedFramebufferTextureFaceEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferTextureFaceEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2ui64NV, .-bluegl_glProgramUniform2ui64NV + .size bluegl_glNamedFramebufferTextureFaceEXT, .-bluegl_glNamedFramebufferTextureFaceEXT .align 2 - .global bluegl_glDeleteQueries - .type bluegl_glDeleteQueries, %function -bluegl_glDeleteQueries: - adrp x16, :got:__blue_glCore_glDeleteQueries - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteQueries] + .global bluegl_glTextureRenderbufferEXT + .type bluegl_glTextureRenderbufferEXT, %function +bluegl_glTextureRenderbufferEXT: + adrp x16, :got:__blue_glCore_glTextureRenderbufferEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureRenderbufferEXT] ldr x16, [x16] br x16 - .size bluegl_glDeleteQueries, .-bluegl_glDeleteQueries + .size bluegl_glTextureRenderbufferEXT, .-bluegl_glTextureRenderbufferEXT .align 2 - .global bluegl_glDeleteRenderbuffers - .type bluegl_glDeleteRenderbuffers, %function -bluegl_glDeleteRenderbuffers: - adrp x16, :got:__blue_glCore_glDeleteRenderbuffers - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteRenderbuffers] + .global bluegl_glMultiTexRenderbufferEXT + .type bluegl_glMultiTexRenderbufferEXT, %function +bluegl_glMultiTexRenderbufferEXT: + adrp x16, :got:__blue_glCore_glMultiTexRenderbufferEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexRenderbufferEXT] ldr x16, [x16] br x16 - .size bluegl_glDeleteRenderbuffers, .-bluegl_glDeleteRenderbuffers + .size bluegl_glMultiTexRenderbufferEXT, .-bluegl_glMultiTexRenderbufferEXT .align 2 - .global bluegl_glGetProgramLocalParameterdvARB - .type bluegl_glGetProgramLocalParameterdvARB, %function -bluegl_glGetProgramLocalParameterdvARB: - adrp x16, :got:__blue_glCore_glGetProgramLocalParameterdvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramLocalParameterdvARB] + .global bluegl_glVertexArrayVertexOffsetEXT + .type bluegl_glVertexArrayVertexOffsetEXT, %function +bluegl_glVertexArrayVertexOffsetEXT: + adrp x16, :got:__blue_glCore_glVertexArrayVertexOffsetEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexOffsetEXT] ldr x16, [x16] br x16 - .size bluegl_glGetProgramLocalParameterdvARB, .-bluegl_glGetProgramLocalParameterdvARB + .size bluegl_glVertexArrayVertexOffsetEXT, .-bluegl_glVertexArrayVertexOffsetEXT .align 2 - .global bluegl_glTexCoord2xOES - .type bluegl_glTexCoord2xOES, %function -bluegl_glTexCoord2xOES: - adrp x16, :got:__blue_glCore_glTexCoord2xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2xOES] + .global bluegl_glVertexArrayColorOffsetEXT + .type bluegl_glVertexArrayColorOffsetEXT, %function +bluegl_glVertexArrayColorOffsetEXT: + adrp x16, :got:__blue_glCore_glVertexArrayColorOffsetEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayColorOffsetEXT] ldr x16, [x16] br x16 - .size bluegl_glTexCoord2xOES, .-bluegl_glTexCoord2xOES + .size bluegl_glVertexArrayColorOffsetEXT, .-bluegl_glVertexArrayColorOffsetEXT .align 2 - .global bluegl_glBindBuffer - .type bluegl_glBindBuffer, %function -bluegl_glBindBuffer: - adrp x16, :got:__blue_glCore_glBindBuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBuffer] + .global bluegl_glVertexArrayEdgeFlagOffsetEXT + .type bluegl_glVertexArrayEdgeFlagOffsetEXT, %function +bluegl_glVertexArrayEdgeFlagOffsetEXT: + adrp x16, :got:__blue_glCore_glVertexArrayEdgeFlagOffsetEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayEdgeFlagOffsetEXT] ldr x16, [x16] br x16 - .size bluegl_glBindBuffer, .-bluegl_glBindBuffer + .size bluegl_glVertexArrayEdgeFlagOffsetEXT, .-bluegl_glVertexArrayEdgeFlagOffsetEXT .align 2 - .global bluegl_glResumeTransformFeedback - .type bluegl_glResumeTransformFeedback, %function -bluegl_glResumeTransformFeedback: - adrp x16, :got:__blue_glCore_glResumeTransformFeedback - ldr x16, [x16, #:got_lo12:__blue_glCore_glResumeTransformFeedback] + .global bluegl_glVertexArrayIndexOffsetEXT + .type bluegl_glVertexArrayIndexOffsetEXT, %function +bluegl_glVertexArrayIndexOffsetEXT: + adrp x16, :got:__blue_glCore_glVertexArrayIndexOffsetEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayIndexOffsetEXT] ldr x16, [x16] br x16 - .size bluegl_glResumeTransformFeedback, .-bluegl_glResumeTransformFeedback + .size bluegl_glVertexArrayIndexOffsetEXT, .-bluegl_glVertexArrayIndexOffsetEXT .align 2 - .global bluegl_glFlushPixelDataRangeNV - .type bluegl_glFlushPixelDataRangeNV, %function -bluegl_glFlushPixelDataRangeNV: - adrp x16, :got:__blue_glCore_glFlushPixelDataRangeNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glFlushPixelDataRangeNV] + .global bluegl_glVertexArrayNormalOffsetEXT + .type bluegl_glVertexArrayNormalOffsetEXT, %function +bluegl_glVertexArrayNormalOffsetEXT: + adrp x16, :got:__blue_glCore_glVertexArrayNormalOffsetEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayNormalOffsetEXT] + ldr x16, [x16] + br x16 + .size bluegl_glVertexArrayNormalOffsetEXT, .-bluegl_glVertexArrayNormalOffsetEXT + + .align 2 + .global bluegl_glVertexArrayTexCoordOffsetEXT + .type bluegl_glVertexArrayTexCoordOffsetEXT, %function +bluegl_glVertexArrayTexCoordOffsetEXT: + adrp x16, :got:__blue_glCore_glVertexArrayTexCoordOffsetEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayTexCoordOffsetEXT] ldr x16, [x16] br x16 - .size bluegl_glFlushPixelDataRangeNV, .-bluegl_glFlushPixelDataRangeNV + .size bluegl_glVertexArrayTexCoordOffsetEXT, .-bluegl_glVertexArrayTexCoordOffsetEXT .align 2 - .global bluegl_glSecondaryColorPointer - .type bluegl_glSecondaryColorPointer, %function -bluegl_glSecondaryColorPointer: - adrp x16, :got:__blue_glCore_glSecondaryColorPointer - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColorPointer] + .global bluegl_glVertexArrayMultiTexCoordOffsetEXT + .type bluegl_glVertexArrayMultiTexCoordOffsetEXT, %function +bluegl_glVertexArrayMultiTexCoordOffsetEXT: + adrp x16, :got:__blue_glCore_glVertexArrayMultiTexCoordOffsetEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayMultiTexCoordOffsetEXT] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColorPointer, .-bluegl_glSecondaryColorPointer + .size bluegl_glVertexArrayMultiTexCoordOffsetEXT, .-bluegl_glVertexArrayMultiTexCoordOffsetEXT .align 2 - .global bluegl_glVideoCaptureStreamParameterdvNV - .type bluegl_glVideoCaptureStreamParameterdvNV, %function -bluegl_glVideoCaptureStreamParameterdvNV: - adrp x16, :got:__blue_glCore_glVideoCaptureStreamParameterdvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVideoCaptureStreamParameterdvNV] + .global bluegl_glVertexArrayFogCoordOffsetEXT + .type bluegl_glVertexArrayFogCoordOffsetEXT, %function +bluegl_glVertexArrayFogCoordOffsetEXT: + adrp x16, :got:__blue_glCore_glVertexArrayFogCoordOffsetEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayFogCoordOffsetEXT] ldr x16, [x16] br x16 - .size bluegl_glVideoCaptureStreamParameterdvNV, .-bluegl_glVideoCaptureStreamParameterdvNV + .size bluegl_glVertexArrayFogCoordOffsetEXT, .-bluegl_glVertexArrayFogCoordOffsetEXT .align 2 - .global bluegl_glTextureSubImage2DEXT - .type bluegl_glTextureSubImage2DEXT, %function -bluegl_glTextureSubImage2DEXT: - adrp x16, :got:__blue_glCore_glTextureSubImage2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureSubImage2DEXT] + .global bluegl_glVertexArraySecondaryColorOffsetEXT + .type bluegl_glVertexArraySecondaryColorOffsetEXT, %function +bluegl_glVertexArraySecondaryColorOffsetEXT: + adrp x16, :got:__blue_glCore_glVertexArraySecondaryColorOffsetEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArraySecondaryColorOffsetEXT] ldr x16, [x16] br x16 - .size bluegl_glTextureSubImage2DEXT, .-bluegl_glTextureSubImage2DEXT + .size bluegl_glVertexArraySecondaryColorOffsetEXT, .-bluegl_glVertexArraySecondaryColorOffsetEXT .align 2 - .global bluegl_glDeletePathsNV - .type bluegl_glDeletePathsNV, %function -bluegl_glDeletePathsNV: - adrp x16, :got:__blue_glCore_glDeletePathsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeletePathsNV] + .global bluegl_glVertexArrayVertexAttribOffsetEXT + .type bluegl_glVertexArrayVertexAttribOffsetEXT, %function +bluegl_glVertexArrayVertexAttribOffsetEXT: + adrp x16, :got:__blue_glCore_glVertexArrayVertexAttribOffsetEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexAttribOffsetEXT] ldr x16, [x16] br x16 - .size bluegl_glDeletePathsNV, .-bluegl_glDeletePathsNV + .size bluegl_glVertexArrayVertexAttribOffsetEXT, .-bluegl_glVertexArrayVertexAttribOffsetEXT .align 2 - .global bluegl_glGetFloatv - .type bluegl_glGetFloatv, %function -bluegl_glGetFloatv: - adrp x16, :got:__blue_glCore_glGetFloatv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFloatv] + .global bluegl_glVertexArrayVertexAttribIOffsetEXT + .type bluegl_glVertexArrayVertexAttribIOffsetEXT, %function +bluegl_glVertexArrayVertexAttribIOffsetEXT: + adrp x16, :got:__blue_glCore_glVertexArrayVertexAttribIOffsetEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexAttribIOffsetEXT] ldr x16, [x16] br x16 - .size bluegl_glGetFloatv, .-bluegl_glGetFloatv + .size bluegl_glVertexArrayVertexAttribIOffsetEXT, .-bluegl_glVertexArrayVertexAttribIOffsetEXT .align 2 - .global bluegl_glVertexAttribI3uivEXT - .type bluegl_glVertexAttribI3uivEXT, %function -bluegl_glVertexAttribI3uivEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI3uivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI3uivEXT] + .global bluegl_glEnableVertexArrayEXT + .type bluegl_glEnableVertexArrayEXT, %function +bluegl_glEnableVertexArrayEXT: + adrp x16, :got:__blue_glCore_glEnableVertexArrayEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableVertexArrayEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI3uivEXT, .-bluegl_glVertexAttribI3uivEXT + .size bluegl_glEnableVertexArrayEXT, .-bluegl_glEnableVertexArrayEXT .align 2 - .global bluegl_glGetVertexAttribdvARB - .type bluegl_glGetVertexAttribdvARB, %function -bluegl_glGetVertexAttribdvARB: - adrp x16, :got:__blue_glCore_glGetVertexAttribdvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribdvARB] + .global bluegl_glDisableVertexArrayEXT + .type bluegl_glDisableVertexArrayEXT, %function +bluegl_glDisableVertexArrayEXT: + adrp x16, :got:__blue_glCore_glDisableVertexArrayEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableVertexArrayEXT] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribdvARB, .-bluegl_glGetVertexAttribdvARB + .size bluegl_glDisableVertexArrayEXT, .-bluegl_glDisableVertexArrayEXT .align 2 - .global bluegl_glUniform4ui64NV - .type bluegl_glUniform4ui64NV, %function -bluegl_glUniform4ui64NV: - adrp x16, :got:__blue_glCore_glUniform4ui64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4ui64NV] + .global bluegl_glEnableVertexArrayAttribEXT + .type bluegl_glEnableVertexArrayAttribEXT, %function +bluegl_glEnableVertexArrayAttribEXT: + adrp x16, :got:__blue_glCore_glEnableVertexArrayAttribEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableVertexArrayAttribEXT] ldr x16, [x16] br x16 - .size bluegl_glUniform4ui64NV, .-bluegl_glUniform4ui64NV + .size bluegl_glEnableVertexArrayAttribEXT, .-bluegl_glEnableVertexArrayAttribEXT .align 2 - .global bluegl_glGetTextureLevelParameterfv - .type bluegl_glGetTextureLevelParameterfv, %function -bluegl_glGetTextureLevelParameterfv: - adrp x16, :got:__blue_glCore_glGetTextureLevelParameterfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureLevelParameterfv] + .global bluegl_glDisableVertexArrayAttribEXT + .type bluegl_glDisableVertexArrayAttribEXT, %function +bluegl_glDisableVertexArrayAttribEXT: + adrp x16, :got:__blue_glCore_glDisableVertexArrayAttribEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableVertexArrayAttribEXT] ldr x16, [x16] br x16 - .size bluegl_glGetTextureLevelParameterfv, .-bluegl_glGetTextureLevelParameterfv + .size bluegl_glDisableVertexArrayAttribEXT, .-bluegl_glDisableVertexArrayAttribEXT .align 2 - .global bluegl_glWindowPos2i - .type bluegl_glWindowPos2i, %function -bluegl_glWindowPos2i: - adrp x16, :got:__blue_glCore_glWindowPos2i - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2i] + .global bluegl_glGetVertexArrayIntegervEXT + .type bluegl_glGetVertexArrayIntegervEXT, %function +bluegl_glGetVertexArrayIntegervEXT: + adrp x16, :got:__blue_glCore_glGetVertexArrayIntegervEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexArrayIntegervEXT] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2i, .-bluegl_glWindowPos2i + .size bluegl_glGetVertexArrayIntegervEXT, .-bluegl_glGetVertexArrayIntegervEXT .align 2 - .global bluegl_glReplacementCodeuiColor4ubVertex3fSUN - .type bluegl_glReplacementCodeuiColor4ubVertex3fSUN, %function -bluegl_glReplacementCodeuiColor4ubVertex3fSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN] + .global bluegl_glGetVertexArrayPointervEXT + .type bluegl_glGetVertexArrayPointervEXT, %function +bluegl_glGetVertexArrayPointervEXT: + adrp x16, :got:__blue_glCore_glGetVertexArrayPointervEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexArrayPointervEXT] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeuiColor4ubVertex3fSUN, .-bluegl_glReplacementCodeuiColor4ubVertex3fSUN + .size bluegl_glGetVertexArrayPointervEXT, .-bluegl_glGetVertexArrayPointervEXT .align 2 - .global bluegl_glCompressedMultiTexSubImage3DEXT - .type bluegl_glCompressedMultiTexSubImage3DEXT, %function -bluegl_glCompressedMultiTexSubImage3DEXT: - adrp x16, :got:__blue_glCore_glCompressedMultiTexSubImage3DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedMultiTexSubImage3DEXT] + .global bluegl_glGetVertexArrayIntegeri_vEXT + .type bluegl_glGetVertexArrayIntegeri_vEXT, %function +bluegl_glGetVertexArrayIntegeri_vEXT: + adrp x16, :got:__blue_glCore_glGetVertexArrayIntegeri_vEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexArrayIntegeri_vEXT] ldr x16, [x16] br x16 - .size bluegl_glCompressedMultiTexSubImage3DEXT, .-bluegl_glCompressedMultiTexSubImage3DEXT + .size bluegl_glGetVertexArrayIntegeri_vEXT, .-bluegl_glGetVertexArrayIntegeri_vEXT .align 2 - .global bluegl_glGetTexParameterIivEXT - .type bluegl_glGetTexParameterIivEXT, %function -bluegl_glGetTexParameterIivEXT: - adrp x16, :got:__blue_glCore_glGetTexParameterIivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexParameterIivEXT] + .global bluegl_glGetVertexArrayPointeri_vEXT + .type bluegl_glGetVertexArrayPointeri_vEXT, %function +bluegl_glGetVertexArrayPointeri_vEXT: + adrp x16, :got:__blue_glCore_glGetVertexArrayPointeri_vEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexArrayPointeri_vEXT] ldr x16, [x16] br x16 - .size bluegl_glGetTexParameterIivEXT, .-bluegl_glGetTexParameterIivEXT + .size bluegl_glGetVertexArrayPointeri_vEXT, .-bluegl_glGetVertexArrayPointeri_vEXT .align 2 - .global bluegl_glDebugMessageCallbackARB - .type bluegl_glDebugMessageCallbackARB, %function -bluegl_glDebugMessageCallbackARB: - adrp x16, :got:__blue_glCore_glDebugMessageCallbackARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glDebugMessageCallbackARB] + .global bluegl_glMapNamedBufferRangeEXT + .type bluegl_glMapNamedBufferRangeEXT, %function +bluegl_glMapNamedBufferRangeEXT: + adrp x16, :got:__blue_glCore_glMapNamedBufferRangeEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMapNamedBufferRangeEXT] ldr x16, [x16] br x16 - .size bluegl_glDebugMessageCallbackARB, .-bluegl_glDebugMessageCallbackARB + .size bluegl_glMapNamedBufferRangeEXT, .-bluegl_glMapNamedBufferRangeEXT .align 2 - .global bluegl_glWeightPointerARB - .type bluegl_glWeightPointerARB, %function -bluegl_glWeightPointerARB: - adrp x16, :got:__blue_glCore_glWeightPointerARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightPointerARB] + .global bluegl_glFlushMappedNamedBufferRangeEXT + .type bluegl_glFlushMappedNamedBufferRangeEXT, %function +bluegl_glFlushMappedNamedBufferRangeEXT: + adrp x16, :got:__blue_glCore_glFlushMappedNamedBufferRangeEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glFlushMappedNamedBufferRangeEXT] ldr x16, [x16] br x16 - .size bluegl_glWeightPointerARB, .-bluegl_glWeightPointerARB + .size bluegl_glFlushMappedNamedBufferRangeEXT, .-bluegl_glFlushMappedNamedBufferRangeEXT .align 2 - .global bluegl_glFogxOES - .type bluegl_glFogxOES, %function -bluegl_glFogxOES: - adrp x16, :got:__blue_glCore_glFogxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glFogxOES] + .global bluegl_glNamedBufferStorageEXT + .type bluegl_glNamedBufferStorageEXT, %function +bluegl_glNamedBufferStorageEXT: + adrp x16, :got:__blue_glCore_glNamedBufferStorageEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedBufferStorageEXT] ldr x16, [x16] br x16 - .size bluegl_glFogxOES, .-bluegl_glFogxOES + .size bluegl_glNamedBufferStorageEXT, .-bluegl_glNamedBufferStorageEXT .align 2 - .global bluegl_glProgramUniformMatrix2x4fvEXT - .type bluegl_glProgramUniformMatrix2x4fvEXT, %function -bluegl_glProgramUniformMatrix2x4fvEXT: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix2x4fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2x4fvEXT] + .global bluegl_glClearNamedBufferDataEXT + .type bluegl_glClearNamedBufferDataEXT, %function +bluegl_glClearNamedBufferDataEXT: + adrp x16, :got:__blue_glCore_glClearNamedBufferDataEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearNamedBufferDataEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix2x4fvEXT, .-bluegl_glProgramUniformMatrix2x4fvEXT + .size bluegl_glClearNamedBufferDataEXT, .-bluegl_glClearNamedBufferDataEXT .align 2 - .global bluegl_glVertexAttrib4iv - .type bluegl_glVertexAttrib4iv, %function -bluegl_glVertexAttrib4iv: - adrp x16, :got:__blue_glCore_glVertexAttrib4iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4iv] + .global bluegl_glClearNamedBufferSubDataEXT + .type bluegl_glClearNamedBufferSubDataEXT, %function +bluegl_glClearNamedBufferSubDataEXT: + adrp x16, :got:__blue_glCore_glClearNamedBufferSubDataEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearNamedBufferSubDataEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4iv, .-bluegl_glVertexAttrib4iv + .size bluegl_glClearNamedBufferSubDataEXT, .-bluegl_glClearNamedBufferSubDataEXT .align 2 - .global bluegl_glProgramLocalParameterI4iNV - .type bluegl_glProgramLocalParameterI4iNV, %function -bluegl_glProgramLocalParameterI4iNV: - adrp x16, :got:__blue_glCore_glProgramLocalParameterI4iNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParameterI4iNV] + .global bluegl_glNamedFramebufferParameteriEXT + .type bluegl_glNamedFramebufferParameteriEXT, %function +bluegl_glNamedFramebufferParameteriEXT: + adrp x16, :got:__blue_glCore_glNamedFramebufferParameteriEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferParameteriEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramLocalParameterI4iNV, .-bluegl_glProgramLocalParameterI4iNV + .size bluegl_glNamedFramebufferParameteriEXT, .-bluegl_glNamedFramebufferParameteriEXT .align 2 - .global bluegl_glGetnColorTableARB - .type bluegl_glGetnColorTableARB, %function -bluegl_glGetnColorTableARB: - adrp x16, :got:__blue_glCore_glGetnColorTableARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnColorTableARB] + .global bluegl_glGetNamedFramebufferParameterivEXT + .type bluegl_glGetNamedFramebufferParameterivEXT, %function +bluegl_glGetNamedFramebufferParameterivEXT: + adrp x16, :got:__blue_glCore_glGetNamedFramebufferParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedFramebufferParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glGetnColorTableARB, .-bluegl_glGetnColorTableARB + .size bluegl_glGetNamedFramebufferParameterivEXT, .-bluegl_glGetNamedFramebufferParameterivEXT .align 2 - .global bluegl_glClearNamedBufferData - .type bluegl_glClearNamedBufferData, %function -bluegl_glClearNamedBufferData: - adrp x16, :got:__blue_glCore_glClearNamedBufferData - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearNamedBufferData] + .global bluegl_glProgramUniform1dEXT + .type bluegl_glProgramUniform1dEXT, %function +bluegl_glProgramUniform1dEXT: + adrp x16, :got:__blue_glCore_glProgramUniform1dEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1dEXT] ldr x16, [x16] br x16 - .size bluegl_glClearNamedBufferData, .-bluegl_glClearNamedBufferData + .size bluegl_glProgramUniform1dEXT, .-bluegl_glProgramUniform1dEXT .align 2 - .global bluegl_glColorMaskIndexedEXT - .type bluegl_glColorMaskIndexedEXT, %function -bluegl_glColorMaskIndexedEXT: - adrp x16, :got:__blue_glCore_glColorMaskIndexedEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorMaskIndexedEXT] + .global bluegl_glProgramUniform2dEXT + .type bluegl_glProgramUniform2dEXT, %function +bluegl_glProgramUniform2dEXT: + adrp x16, :got:__blue_glCore_glProgramUniform2dEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2dEXT] ldr x16, [x16] br x16 - .size bluegl_glColorMaskIndexedEXT, .-bluegl_glColorMaskIndexedEXT + .size bluegl_glProgramUniform2dEXT, .-bluegl_glProgramUniform2dEXT .align 2 - .global bluegl_glVertexAttribLPointer - .type bluegl_glVertexAttribLPointer, %function -bluegl_glVertexAttribLPointer: - adrp x16, :got:__blue_glCore_glVertexAttribLPointer - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribLPointer] + .global bluegl_glProgramUniform3dEXT + .type bluegl_glProgramUniform3dEXT, %function +bluegl_glProgramUniform3dEXT: + adrp x16, :got:__blue_glCore_glProgramUniform3dEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3dEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribLPointer, .-bluegl_glVertexAttribLPointer + .size bluegl_glProgramUniform3dEXT, .-bluegl_glProgramUniform3dEXT .align 2 - .global bluegl_glProgramUniform3i64vNV - .type bluegl_glProgramUniform3i64vNV, %function -bluegl_glProgramUniform3i64vNV: - adrp x16, :got:__blue_glCore_glProgramUniform3i64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3i64vNV] + .global bluegl_glProgramUniform4dEXT + .type bluegl_glProgramUniform4dEXT, %function +bluegl_glProgramUniform4dEXT: + adrp x16, :got:__blue_glCore_glProgramUniform4dEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4dEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3i64vNV, .-bluegl_glProgramUniform3i64vNV + .size bluegl_glProgramUniform4dEXT, .-bluegl_glProgramUniform4dEXT .align 2 - .global bluegl_glScissor - .type bluegl_glScissor, %function -bluegl_glScissor: - adrp x16, :got:__blue_glCore_glScissor - ldr x16, [x16, #:got_lo12:__blue_glCore_glScissor] + .global bluegl_glProgramUniform1dvEXT + .type bluegl_glProgramUniform1dvEXT, %function +bluegl_glProgramUniform1dvEXT: + adrp x16, :got:__blue_glCore_glProgramUniform1dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1dvEXT] ldr x16, [x16] br x16 - .size bluegl_glScissor, .-bluegl_glScissor + .size bluegl_glProgramUniform1dvEXT, .-bluegl_glProgramUniform1dvEXT .align 2 - .global bluegl_glSecondaryColor3fv - .type bluegl_glSecondaryColor3fv, %function -bluegl_glSecondaryColor3fv: - adrp x16, :got:__blue_glCore_glSecondaryColor3fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3fv] + .global bluegl_glProgramUniform2dvEXT + .type bluegl_glProgramUniform2dvEXT, %function +bluegl_glProgramUniform2dvEXT: + adrp x16, :got:__blue_glCore_glProgramUniform2dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2dvEXT] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3fv, .-bluegl_glSecondaryColor3fv + .size bluegl_glProgramUniform2dvEXT, .-bluegl_glProgramUniform2dvEXT .align 2 - .global bluegl_glCombinerParameterivNV - .type bluegl_glCombinerParameterivNV, %function -bluegl_glCombinerParameterivNV: - adrp x16, :got:__blue_glCore_glCombinerParameterivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCombinerParameterivNV] + .global bluegl_glProgramUniform3dvEXT + .type bluegl_glProgramUniform3dvEXT, %function +bluegl_glProgramUniform3dvEXT: + adrp x16, :got:__blue_glCore_glProgramUniform3dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3dvEXT] ldr x16, [x16] br x16 - .size bluegl_glCombinerParameterivNV, .-bluegl_glCombinerParameterivNV + .size bluegl_glProgramUniform3dvEXT, .-bluegl_glProgramUniform3dvEXT .align 2 - .global bluegl_glGetTexLevelParameterfv - .type bluegl_glGetTexLevelParameterfv, %function -bluegl_glGetTexLevelParameterfv: - adrp x16, :got:__blue_glCore_glGetTexLevelParameterfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexLevelParameterfv] + .global bluegl_glProgramUniform4dvEXT + .type bluegl_glProgramUniform4dvEXT, %function +bluegl_glProgramUniform4dvEXT: + adrp x16, :got:__blue_glCore_glProgramUniform4dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4dvEXT] ldr x16, [x16] br x16 - .size bluegl_glGetTexLevelParameterfv, .-bluegl_glGetTexLevelParameterfv + .size bluegl_glProgramUniform4dvEXT, .-bluegl_glProgramUniform4dvEXT .align 2 - .global bluegl_glDrawElementArrayATI - .type bluegl_glDrawElementArrayATI, %function -bluegl_glDrawElementArrayATI: - adrp x16, :got:__blue_glCore_glDrawElementArrayATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementArrayATI] + .global bluegl_glProgramUniformMatrix2dvEXT + .type bluegl_glProgramUniformMatrix2dvEXT, %function +bluegl_glProgramUniformMatrix2dvEXT: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix2dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2dvEXT] ldr x16, [x16] br x16 - .size bluegl_glDrawElementArrayATI, .-bluegl_glDrawElementArrayATI + .size bluegl_glProgramUniformMatrix2dvEXT, .-bluegl_glProgramUniformMatrix2dvEXT .align 2 - .global bluegl_glVertexAttrib4Nusv - .type bluegl_glVertexAttrib4Nusv, %function -bluegl_glVertexAttrib4Nusv: - adrp x16, :got:__blue_glCore_glVertexAttrib4Nusv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4Nusv] + .global bluegl_glProgramUniformMatrix3dvEXT + .type bluegl_glProgramUniformMatrix3dvEXT, %function +bluegl_glProgramUniformMatrix3dvEXT: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix3dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3dvEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4Nusv, .-bluegl_glVertexAttrib4Nusv + .size bluegl_glProgramUniformMatrix3dvEXT, .-bluegl_glProgramUniformMatrix3dvEXT .align 2 - .global bluegl_glWindowPos3dvMESA - .type bluegl_glWindowPos3dvMESA, %function -bluegl_glWindowPos3dvMESA: - adrp x16, :got:__blue_glCore_glWindowPos3dvMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3dvMESA] + .global bluegl_glProgramUniformMatrix4dvEXT + .type bluegl_glProgramUniformMatrix4dvEXT, %function +bluegl_glProgramUniformMatrix4dvEXT: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix4dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4dvEXT] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3dvMESA, .-bluegl_glWindowPos3dvMESA + .size bluegl_glProgramUniformMatrix4dvEXT, .-bluegl_glProgramUniformMatrix4dvEXT .align 2 - .global bluegl_glMakeImageHandleResidentARB - .type bluegl_glMakeImageHandleResidentARB, %function -bluegl_glMakeImageHandleResidentARB: - adrp x16, :got:__blue_glCore_glMakeImageHandleResidentARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeImageHandleResidentARB] + .global bluegl_glProgramUniformMatrix2x3dvEXT + .type bluegl_glProgramUniformMatrix2x3dvEXT, %function +bluegl_glProgramUniformMatrix2x3dvEXT: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix2x3dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2x3dvEXT] ldr x16, [x16] br x16 - .size bluegl_glMakeImageHandleResidentARB, .-bluegl_glMakeImageHandleResidentARB + .size bluegl_glProgramUniformMatrix2x3dvEXT, .-bluegl_glProgramUniformMatrix2x3dvEXT .align 2 - .global bluegl_glWindowPos3svMESA - .type bluegl_glWindowPos3svMESA, %function -bluegl_glWindowPos3svMESA: - adrp x16, :got:__blue_glCore_glWindowPos3svMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3svMESA] + .global bluegl_glProgramUniformMatrix2x4dvEXT + .type bluegl_glProgramUniformMatrix2x4dvEXT, %function +bluegl_glProgramUniformMatrix2x4dvEXT: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix2x4dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2x4dvEXT] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3svMESA, .-bluegl_glWindowPos3svMESA + .size bluegl_glProgramUniformMatrix2x4dvEXT, .-bluegl_glProgramUniformMatrix2x4dvEXT .align 2 - .global bluegl_glGetMultiTexLevelParameterfvEXT - .type bluegl_glGetMultiTexLevelParameterfvEXT, %function -bluegl_glGetMultiTexLevelParameterfvEXT: - adrp x16, :got:__blue_glCore_glGetMultiTexLevelParameterfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexLevelParameterfvEXT] + .global bluegl_glProgramUniformMatrix3x2dvEXT + .type bluegl_glProgramUniformMatrix3x2dvEXT, %function +bluegl_glProgramUniformMatrix3x2dvEXT: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix3x2dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3x2dvEXT] ldr x16, [x16] br x16 - .size bluegl_glGetMultiTexLevelParameterfvEXT, .-bluegl_glGetMultiTexLevelParameterfvEXT + .size bluegl_glProgramUniformMatrix3x2dvEXT, .-bluegl_glProgramUniformMatrix3x2dvEXT .align 2 - .global bluegl_glRasterPos3xOES - .type bluegl_glRasterPos3xOES, %function -bluegl_glRasterPos3xOES: - adrp x16, :got:__blue_glCore_glRasterPos3xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glRasterPos3xOES] + .global bluegl_glProgramUniformMatrix3x4dvEXT + .type bluegl_glProgramUniformMatrix3x4dvEXT, %function +bluegl_glProgramUniformMatrix3x4dvEXT: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix3x4dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3x4dvEXT] ldr x16, [x16] br x16 - .size bluegl_glRasterPos3xOES, .-bluegl_glRasterPos3xOES + .size bluegl_glProgramUniformMatrix3x4dvEXT, .-bluegl_glProgramUniformMatrix3x4dvEXT .align 2 - .global bluegl_glBinormal3iEXT - .type bluegl_glBinormal3iEXT, %function -bluegl_glBinormal3iEXT: - adrp x16, :got:__blue_glCore_glBinormal3iEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3iEXT] + .global bluegl_glProgramUniformMatrix4x2dvEXT + .type bluegl_glProgramUniformMatrix4x2dvEXT, %function +bluegl_glProgramUniformMatrix4x2dvEXT: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix4x2dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4x2dvEXT] ldr x16, [x16] br x16 - .size bluegl_glBinormal3iEXT, .-bluegl_glBinormal3iEXT + .size bluegl_glProgramUniformMatrix4x2dvEXT, .-bluegl_glProgramUniformMatrix4x2dvEXT .align 2 - .global bluegl_glVertexAttribP3uiv - .type bluegl_glVertexAttribP3uiv, %function -bluegl_glVertexAttribP3uiv: - adrp x16, :got:__blue_glCore_glVertexAttribP3uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribP3uiv] + .global bluegl_glProgramUniformMatrix4x3dvEXT + .type bluegl_glProgramUniformMatrix4x3dvEXT, %function +bluegl_glProgramUniformMatrix4x3dvEXT: + adrp x16, :got:__blue_glCore_glProgramUniformMatrix4x3dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4x3dvEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribP3uiv, .-bluegl_glVertexAttribP3uiv + .size bluegl_glProgramUniformMatrix4x3dvEXT, .-bluegl_glProgramUniformMatrix4x3dvEXT .align 2 - .global bluegl_glProgramUniformMatrix2x3dv - .type bluegl_glProgramUniformMatrix2x3dv, %function -bluegl_glProgramUniformMatrix2x3dv: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix2x3dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2x3dv] + .global bluegl_glTextureBufferRangeEXT + .type bluegl_glTextureBufferRangeEXT, %function +bluegl_glTextureBufferRangeEXT: + adrp x16, :got:__blue_glCore_glTextureBufferRangeEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureBufferRangeEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix2x3dv, .-bluegl_glProgramUniformMatrix2x3dv + .size bluegl_glTextureBufferRangeEXT, .-bluegl_glTextureBufferRangeEXT .align 2 - .global bluegl_glEndConditionalRender - .type bluegl_glEndConditionalRender, %function -bluegl_glEndConditionalRender: - adrp x16, :got:__blue_glCore_glEndConditionalRender - ldr x16, [x16, #:got_lo12:__blue_glCore_glEndConditionalRender] + .global bluegl_glTextureStorage1DEXT + .type bluegl_glTextureStorage1DEXT, %function +bluegl_glTextureStorage1DEXT: + adrp x16, :got:__blue_glCore_glTextureStorage1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage1DEXT] ldr x16, [x16] br x16 - .size bluegl_glEndConditionalRender, .-bluegl_glEndConditionalRender + .size bluegl_glTextureStorage1DEXT, .-bluegl_glTextureStorage1DEXT .align 2 - .global bluegl_glBindParameterEXT - .type bluegl_glBindParameterEXT, %function -bluegl_glBindParameterEXT: - adrp x16, :got:__blue_glCore_glBindParameterEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindParameterEXT] + .global bluegl_glTextureStorage2DEXT + .type bluegl_glTextureStorage2DEXT, %function +bluegl_glTextureStorage2DEXT: + adrp x16, :got:__blue_glCore_glTextureStorage2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage2DEXT] ldr x16, [x16] br x16 - .size bluegl_glBindParameterEXT, .-bluegl_glBindParameterEXT + .size bluegl_glTextureStorage2DEXT, .-bluegl_glTextureStorage2DEXT .align 2 - .global bluegl_glCompileShaderIncludeARB - .type bluegl_glCompileShaderIncludeARB, %function -bluegl_glCompileShaderIncludeARB: - adrp x16, :got:__blue_glCore_glCompileShaderIncludeARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompileShaderIncludeARB] + .global bluegl_glTextureStorage3DEXT + .type bluegl_glTextureStorage3DEXT, %function +bluegl_glTextureStorage3DEXT: + adrp x16, :got:__blue_glCore_glTextureStorage3DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage3DEXT] ldr x16, [x16] br x16 - .size bluegl_glCompileShaderIncludeARB, .-bluegl_glCompileShaderIncludeARB + .size bluegl_glTextureStorage3DEXT, .-bluegl_glTextureStorage3DEXT .align 2 - .global bluegl_glTexStorageSparseAMD - .type bluegl_glTexStorageSparseAMD, %function -bluegl_glTexStorageSparseAMD: - adrp x16, :got:__blue_glCore_glTexStorageSparseAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexStorageSparseAMD] + .global bluegl_glTextureStorage2DMultisampleEXT + .type bluegl_glTextureStorage2DMultisampleEXT, %function +bluegl_glTextureStorage2DMultisampleEXT: + adrp x16, :got:__blue_glCore_glTextureStorage2DMultisampleEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage2DMultisampleEXT] ldr x16, [x16] br x16 - .size bluegl_glTexStorageSparseAMD, .-bluegl_glTexStorageSparseAMD + .size bluegl_glTextureStorage2DMultisampleEXT, .-bluegl_glTextureStorage2DMultisampleEXT .align 2 - .global bluegl_glCreateShaderProgramEXT - .type bluegl_glCreateShaderProgramEXT, %function -bluegl_glCreateShaderProgramEXT: - adrp x16, :got:__blue_glCore_glCreateShaderProgramEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateShaderProgramEXT] + .global bluegl_glTextureStorage3DMultisampleEXT + .type bluegl_glTextureStorage3DMultisampleEXT, %function +bluegl_glTextureStorage3DMultisampleEXT: + adrp x16, :got:__blue_glCore_glTextureStorage3DMultisampleEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage3DMultisampleEXT] ldr x16, [x16] br x16 - .size bluegl_glCreateShaderProgramEXT, .-bluegl_glCreateShaderProgramEXT + .size bluegl_glTextureStorage3DMultisampleEXT, .-bluegl_glTextureStorage3DMultisampleEXT .align 2 - .global bluegl_glUniformMatrix3x2fv - .type bluegl_glUniformMatrix3x2fv, %function -bluegl_glUniformMatrix3x2fv: - adrp x16, :got:__blue_glCore_glUniformMatrix3x2fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix3x2fv] + .global bluegl_glVertexArrayBindVertexBufferEXT + .type bluegl_glVertexArrayBindVertexBufferEXT, %function +bluegl_glVertexArrayBindVertexBufferEXT: + adrp x16, :got:__blue_glCore_glVertexArrayBindVertexBufferEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayBindVertexBufferEXT] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix3x2fv, .-bluegl_glUniformMatrix3x2fv + .size bluegl_glVertexArrayBindVertexBufferEXT, .-bluegl_glVertexArrayBindVertexBufferEXT .align 2 - .global bluegl_glPrimitiveRestartIndex - .type bluegl_glPrimitiveRestartIndex, %function -bluegl_glPrimitiveRestartIndex: - adrp x16, :got:__blue_glCore_glPrimitiveRestartIndex - ldr x16, [x16, #:got_lo12:__blue_glCore_glPrimitiveRestartIndex] + .global bluegl_glVertexArrayVertexAttribFormatEXT + .type bluegl_glVertexArrayVertexAttribFormatEXT, %function +bluegl_glVertexArrayVertexAttribFormatEXT: + adrp x16, :got:__blue_glCore_glVertexArrayVertexAttribFormatEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexAttribFormatEXT] ldr x16, [x16] br x16 - .size bluegl_glPrimitiveRestartIndex, .-bluegl_glPrimitiveRestartIndex + .size bluegl_glVertexArrayVertexAttribFormatEXT, .-bluegl_glVertexArrayVertexAttribFormatEXT .align 2 - .global bluegl_glCreateProgram - .type bluegl_glCreateProgram, %function -bluegl_glCreateProgram: - adrp x16, :got:__blue_glCore_glCreateProgram - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateProgram] + .global bluegl_glVertexArrayVertexAttribIFormatEXT + .type bluegl_glVertexArrayVertexAttribIFormatEXT, %function +bluegl_glVertexArrayVertexAttribIFormatEXT: + adrp x16, :got:__blue_glCore_glVertexArrayVertexAttribIFormatEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexAttribIFormatEXT] ldr x16, [x16] br x16 - .size bluegl_glCreateProgram, .-bluegl_glCreateProgram + .size bluegl_glVertexArrayVertexAttribIFormatEXT, .-bluegl_glVertexArrayVertexAttribIFormatEXT .align 2 - .global bluegl_glMultiTexCoord3d - .type bluegl_glMultiTexCoord3d, %function -bluegl_glMultiTexCoord3d: - adrp x16, :got:__blue_glCore_glMultiTexCoord3d - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3d] + .global bluegl_glVertexArrayVertexAttribLFormatEXT + .type bluegl_glVertexArrayVertexAttribLFormatEXT, %function +bluegl_glVertexArrayVertexAttribLFormatEXT: + adrp x16, :got:__blue_glCore_glVertexArrayVertexAttribLFormatEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexAttribLFormatEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3d, .-bluegl_glMultiTexCoord3d + .size bluegl_glVertexArrayVertexAttribLFormatEXT, .-bluegl_glVertexArrayVertexAttribLFormatEXT .align 2 - .global bluegl_glGetFenceivNV - .type bluegl_glGetFenceivNV, %function -bluegl_glGetFenceivNV: - adrp x16, :got:__blue_glCore_glGetFenceivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFenceivNV] + .global bluegl_glVertexArrayVertexAttribBindingEXT + .type bluegl_glVertexArrayVertexAttribBindingEXT, %function +bluegl_glVertexArrayVertexAttribBindingEXT: + adrp x16, :got:__blue_glCore_glVertexArrayVertexAttribBindingEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexAttribBindingEXT] ldr x16, [x16] br x16 - .size bluegl_glGetFenceivNV, .-bluegl_glGetFenceivNV + .size bluegl_glVertexArrayVertexAttribBindingEXT, .-bluegl_glVertexArrayVertexAttribBindingEXT .align 2 - .global bluegl_glUniform4dv - .type bluegl_glUniform4dv, %function -bluegl_glUniform4dv: - adrp x16, :got:__blue_glCore_glUniform4dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4dv] + .global bluegl_glVertexArrayVertexBindingDivisorEXT + .type bluegl_glVertexArrayVertexBindingDivisorEXT, %function +bluegl_glVertexArrayVertexBindingDivisorEXT: + adrp x16, :got:__blue_glCore_glVertexArrayVertexBindingDivisorEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexBindingDivisorEXT] ldr x16, [x16] br x16 - .size bluegl_glUniform4dv, .-bluegl_glUniform4dv + .size bluegl_glVertexArrayVertexBindingDivisorEXT, .-bluegl_glVertexArrayVertexBindingDivisorEXT .align 2 - .global bluegl_glUniform3i64ARB - .type bluegl_glUniform3i64ARB, %function -bluegl_glUniform3i64ARB: - adrp x16, :got:__blue_glCore_glUniform3i64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3i64ARB] + .global bluegl_glVertexArrayVertexAttribLOffsetEXT + .type bluegl_glVertexArrayVertexAttribLOffsetEXT, %function +bluegl_glVertexArrayVertexAttribLOffsetEXT: + adrp x16, :got:__blue_glCore_glVertexArrayVertexAttribLOffsetEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexAttribLOffsetEXT] ldr x16, [x16] br x16 - .size bluegl_glUniform3i64ARB, .-bluegl_glUniform3i64ARB + .size bluegl_glVertexArrayVertexAttribLOffsetEXT, .-bluegl_glVertexArrayVertexAttribLOffsetEXT .align 2 .global bluegl_glTexturePageCommitmentEXT @@ -17610,344 +17509,354 @@ bluegl_glTexturePageCommitmentEXT: .size bluegl_glTexturePageCommitmentEXT, .-bluegl_glTexturePageCommitmentEXT .align 2 - .global bluegl_glColor4hNV - .type bluegl_glColor4hNV, %function -bluegl_glColor4hNV: - adrp x16, :got:__blue_glCore_glColor4hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4hNV] + .global bluegl_glVertexArrayVertexAttribDivisorEXT + .type bluegl_glVertexArrayVertexAttribDivisorEXT, %function +bluegl_glVertexArrayVertexAttribDivisorEXT: + adrp x16, :got:__blue_glCore_glVertexArrayVertexAttribDivisorEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexAttribDivisorEXT] ldr x16, [x16] br x16 - .size bluegl_glColor4hNV, .-bluegl_glColor4hNV + .size bluegl_glVertexArrayVertexAttribDivisorEXT, .-bluegl_glVertexArrayVertexAttribDivisorEXT .align 2 - .global bluegl_glVertexStream2fATI - .type bluegl_glVertexStream2fATI, %function -bluegl_glVertexStream2fATI: - adrp x16, :got:__blue_glCore_glVertexStream2fATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream2fATI] + .global bluegl_glColorMaskIndexedEXT + .type bluegl_glColorMaskIndexedEXT, %function +bluegl_glColorMaskIndexedEXT: + adrp x16, :got:__blue_glCore_glColorMaskIndexedEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorMaskIndexedEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexStream2fATI, .-bluegl_glVertexStream2fATI + .size bluegl_glColorMaskIndexedEXT, .-bluegl_glColorMaskIndexedEXT .align 2 - .global bluegl_glDisable - .type bluegl_glDisable, %function -bluegl_glDisable: - adrp x16, :got:__blue_glCore_glDisable - ldr x16, [x16, #:got_lo12:__blue_glCore_glDisable] + .global bluegl_glDrawArraysInstancedEXT + .type bluegl_glDrawArraysInstancedEXT, %function +bluegl_glDrawArraysInstancedEXT: + adrp x16, :got:__blue_glCore_glDrawArraysInstancedEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawArraysInstancedEXT] ldr x16, [x16] br x16 - .size bluegl_glDisable, .-bluegl_glDisable + .size bluegl_glDrawArraysInstancedEXT, .-bluegl_glDrawArraysInstancedEXT .align 2 - .global bluegl_glFramebufferRenderbuffer - .type bluegl_glFramebufferRenderbuffer, %function -bluegl_glFramebufferRenderbuffer: - adrp x16, :got:__blue_glCore_glFramebufferRenderbuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferRenderbuffer] + .global bluegl_glDrawElementsInstancedEXT + .type bluegl_glDrawElementsInstancedEXT, %function +bluegl_glDrawElementsInstancedEXT: + adrp x16, :got:__blue_glCore_glDrawElementsInstancedEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementsInstancedEXT] ldr x16, [x16] br x16 - .size bluegl_glFramebufferRenderbuffer, .-bluegl_glFramebufferRenderbuffer + .size bluegl_glDrawElementsInstancedEXT, .-bluegl_glDrawElementsInstancedEXT .align 2 - .global bluegl_glIsRenderbufferEXT - .type bluegl_glIsRenderbufferEXT, %function -bluegl_glIsRenderbufferEXT: - adrp x16, :got:__blue_glCore_glIsRenderbufferEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsRenderbufferEXT] + .global bluegl_glDrawRangeElementsEXT + .type bluegl_glDrawRangeElementsEXT, %function +bluegl_glDrawRangeElementsEXT: + adrp x16, :got:__blue_glCore_glDrawRangeElementsEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawRangeElementsEXT] ldr x16, [x16] br x16 - .size bluegl_glIsRenderbufferEXT, .-bluegl_glIsRenderbufferEXT + .size bluegl_glDrawRangeElementsEXT, .-bluegl_glDrawRangeElementsEXT .align 2 - .global bluegl_glGetMultiTexParameterIivEXT - .type bluegl_glGetMultiTexParameterIivEXT, %function -bluegl_glGetMultiTexParameterIivEXT: - adrp x16, :got:__blue_glCore_glGetMultiTexParameterIivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexParameterIivEXT] + .global bluegl_glFogCoordfEXT + .type bluegl_glFogCoordfEXT, %function +bluegl_glFogCoordfEXT: + adrp x16, :got:__blue_glCore_glFogCoordfEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordfEXT] ldr x16, [x16] br x16 - .size bluegl_glGetMultiTexParameterIivEXT, .-bluegl_glGetMultiTexParameterIivEXT + .size bluegl_glFogCoordfEXT, .-bluegl_glFogCoordfEXT .align 2 - .global bluegl_glVertexAttrib2fvNV - .type bluegl_glVertexAttrib2fvNV, %function -bluegl_glVertexAttrib2fvNV: - adrp x16, :got:__blue_glCore_glVertexAttrib2fvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2fvNV] + .global bluegl_glFogCoordfvEXT + .type bluegl_glFogCoordfvEXT, %function +bluegl_glFogCoordfvEXT: + adrp x16, :got:__blue_glCore_glFogCoordfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordfvEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2fvNV, .-bluegl_glVertexAttrib2fvNV + .size bluegl_glFogCoordfvEXT, .-bluegl_glFogCoordfvEXT .align 2 - .global bluegl_glReferencePlaneSGIX - .type bluegl_glReferencePlaneSGIX, %function -bluegl_glReferencePlaneSGIX: - adrp x16, :got:__blue_glCore_glReferencePlaneSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glReferencePlaneSGIX] + .global bluegl_glFogCoorddEXT + .type bluegl_glFogCoorddEXT, %function +bluegl_glFogCoorddEXT: + adrp x16, :got:__blue_glCore_glFogCoorddEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoorddEXT] ldr x16, [x16] br x16 - .size bluegl_glReferencePlaneSGIX, .-bluegl_glReferencePlaneSGIX + .size bluegl_glFogCoorddEXT, .-bluegl_glFogCoorddEXT .align 2 - .global bluegl_glUniform4fARB - .type bluegl_glUniform4fARB, %function -bluegl_glUniform4fARB: - adrp x16, :got:__blue_glCore_glUniform4fARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4fARB] + .global bluegl_glFogCoorddvEXT + .type bluegl_glFogCoorddvEXT, %function +bluegl_glFogCoorddvEXT: + adrp x16, :got:__blue_glCore_glFogCoorddvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoorddvEXT] ldr x16, [x16] br x16 - .size bluegl_glUniform4fARB, .-bluegl_glUniform4fARB + .size bluegl_glFogCoorddvEXT, .-bluegl_glFogCoorddvEXT .align 2 - .global bluegl_glClearBufferfi - .type bluegl_glClearBufferfi, %function -bluegl_glClearBufferfi: - adrp x16, :got:__blue_glCore_glClearBufferfi - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearBufferfi] + .global bluegl_glFogCoordPointerEXT + .type bluegl_glFogCoordPointerEXT, %function +bluegl_glFogCoordPointerEXT: + adrp x16, :got:__blue_glCore_glFogCoordPointerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordPointerEXT] ldr x16, [x16] br x16 - .size bluegl_glClearBufferfi, .-bluegl_glClearBufferfi + .size bluegl_glFogCoordPointerEXT, .-bluegl_glFogCoordPointerEXT .align 2 - .global bluegl_glBindFragDataLocation - .type bluegl_glBindFragDataLocation, %function -bluegl_glBindFragDataLocation: - adrp x16, :got:__blue_glCore_glBindFragDataLocation - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindFragDataLocation] + .global bluegl_glBlitFramebufferEXT + .type bluegl_glBlitFramebufferEXT, %function +bluegl_glBlitFramebufferEXT: + adrp x16, :got:__blue_glCore_glBlitFramebufferEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlitFramebufferEXT] ldr x16, [x16] br x16 - .size bluegl_glBindFragDataLocation, .-bluegl_glBindFragDataLocation + .size bluegl_glBlitFramebufferEXT, .-bluegl_glBlitFramebufferEXT .align 2 - .global bluegl_glGetIntegerv - .type bluegl_glGetIntegerv, %function -bluegl_glGetIntegerv: - adrp x16, :got:__blue_glCore_glGetIntegerv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetIntegerv] + .global bluegl_glRenderbufferStorageMultisampleEXT + .type bluegl_glRenderbufferStorageMultisampleEXT, %function +bluegl_glRenderbufferStorageMultisampleEXT: + adrp x16, :got:__blue_glCore_glRenderbufferStorageMultisampleEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glRenderbufferStorageMultisampleEXT] ldr x16, [x16] br x16 - .size bluegl_glGetIntegerv, .-bluegl_glGetIntegerv + .size bluegl_glRenderbufferStorageMultisampleEXT, .-bluegl_glRenderbufferStorageMultisampleEXT .align 2 - .global bluegl_glGetObjectLabel - .type bluegl_glGetObjectLabel, %function -bluegl_glGetObjectLabel: - adrp x16, :got:__blue_glCore_glGetObjectLabel - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetObjectLabel] + .global bluegl_glIsRenderbufferEXT + .type bluegl_glIsRenderbufferEXT, %function +bluegl_glIsRenderbufferEXT: + adrp x16, :got:__blue_glCore_glIsRenderbufferEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsRenderbufferEXT] + ldr x16, [x16] + br x16 + .size bluegl_glIsRenderbufferEXT, .-bluegl_glIsRenderbufferEXT + + .align 2 + .global bluegl_glBindRenderbufferEXT + .type bluegl_glBindRenderbufferEXT, %function +bluegl_glBindRenderbufferEXT: + adrp x16, :got:__blue_glCore_glBindRenderbufferEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindRenderbufferEXT] ldr x16, [x16] br x16 - .size bluegl_glGetObjectLabel, .-bluegl_glGetObjectLabel + .size bluegl_glBindRenderbufferEXT, .-bluegl_glBindRenderbufferEXT .align 2 - .global bluegl_glBufferPageCommitmentARB - .type bluegl_glBufferPageCommitmentARB, %function -bluegl_glBufferPageCommitmentARB: - adrp x16, :got:__blue_glCore_glBufferPageCommitmentARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glBufferPageCommitmentARB] + .global bluegl_glDeleteRenderbuffersEXT + .type bluegl_glDeleteRenderbuffersEXT, %function +bluegl_glDeleteRenderbuffersEXT: + adrp x16, :got:__blue_glCore_glDeleteRenderbuffersEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteRenderbuffersEXT] ldr x16, [x16] br x16 - .size bluegl_glBufferPageCommitmentARB, .-bluegl_glBufferPageCommitmentARB + .size bluegl_glDeleteRenderbuffersEXT, .-bluegl_glDeleteRenderbuffersEXT .align 2 - .global bluegl_glBlendFuncIndexedAMD - .type bluegl_glBlendFuncIndexedAMD, %function -bluegl_glBlendFuncIndexedAMD: - adrp x16, :got:__blue_glCore_glBlendFuncIndexedAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFuncIndexedAMD] + .global bluegl_glGenRenderbuffersEXT + .type bluegl_glGenRenderbuffersEXT, %function +bluegl_glGenRenderbuffersEXT: + adrp x16, :got:__blue_glCore_glGenRenderbuffersEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenRenderbuffersEXT] ldr x16, [x16] br x16 - .size bluegl_glBlendFuncIndexedAMD, .-bluegl_glBlendFuncIndexedAMD + .size bluegl_glGenRenderbuffersEXT, .-bluegl_glGenRenderbuffersEXT .align 2 - .global bluegl_glGetQueryObjectui64vEXT - .type bluegl_glGetQueryObjectui64vEXT, %function -bluegl_glGetQueryObjectui64vEXT: - adrp x16, :got:__blue_glCore_glGetQueryObjectui64vEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryObjectui64vEXT] + .global bluegl_glRenderbufferStorageEXT + .type bluegl_glRenderbufferStorageEXT, %function +bluegl_glRenderbufferStorageEXT: + adrp x16, :got:__blue_glCore_glRenderbufferStorageEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glRenderbufferStorageEXT] ldr x16, [x16] br x16 - .size bluegl_glGetQueryObjectui64vEXT, .-bluegl_glGetQueryObjectui64vEXT + .size bluegl_glRenderbufferStorageEXT, .-bluegl_glRenderbufferStorageEXT .align 2 - .global bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN - .type bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN, %function -bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN] + .global bluegl_glGetRenderbufferParameterivEXT + .type bluegl_glGetRenderbufferParameterivEXT, %function +bluegl_glGetRenderbufferParameterivEXT: + adrp x16, :got:__blue_glCore_glGetRenderbufferParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetRenderbufferParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN, .-bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN + .size bluegl_glGetRenderbufferParameterivEXT, .-bluegl_glGetRenderbufferParameterivEXT .align 2 - .global bluegl_glBlitFramebuffer - .type bluegl_glBlitFramebuffer, %function -bluegl_glBlitFramebuffer: - adrp x16, :got:__blue_glCore_glBlitFramebuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlitFramebuffer] + .global bluegl_glIsFramebufferEXT + .type bluegl_glIsFramebufferEXT, %function +bluegl_glIsFramebufferEXT: + adrp x16, :got:__blue_glCore_glIsFramebufferEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsFramebufferEXT] ldr x16, [x16] br x16 - .size bluegl_glBlitFramebuffer, .-bluegl_glBlitFramebuffer + .size bluegl_glIsFramebufferEXT, .-bluegl_glIsFramebufferEXT .align 2 - .global bluegl_glMultiTexCoord2f - .type bluegl_glMultiTexCoord2f, %function -bluegl_glMultiTexCoord2f: - adrp x16, :got:__blue_glCore_glMultiTexCoord2f - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2f] + .global bluegl_glBindFramebufferEXT + .type bluegl_glBindFramebufferEXT, %function +bluegl_glBindFramebufferEXT: + adrp x16, :got:__blue_glCore_glBindFramebufferEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindFramebufferEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2f, .-bluegl_glMultiTexCoord2f + .size bluegl_glBindFramebufferEXT, .-bluegl_glBindFramebufferEXT .align 2 - .global bluegl_glNamedFramebufferRenderbufferEXT - .type bluegl_glNamedFramebufferRenderbufferEXT, %function -bluegl_glNamedFramebufferRenderbufferEXT: - adrp x16, :got:__blue_glCore_glNamedFramebufferRenderbufferEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferRenderbufferEXT] + .global bluegl_glDeleteFramebuffersEXT + .type bluegl_glDeleteFramebuffersEXT, %function +bluegl_glDeleteFramebuffersEXT: + adrp x16, :got:__blue_glCore_glDeleteFramebuffersEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteFramebuffersEXT] ldr x16, [x16] br x16 - .size bluegl_glNamedFramebufferRenderbufferEXT, .-bluegl_glNamedFramebufferRenderbufferEXT + .size bluegl_glDeleteFramebuffersEXT, .-bluegl_glDeleteFramebuffersEXT .align 2 - .global bluegl_glUseProgramStages - .type bluegl_glUseProgramStages, %function -bluegl_glUseProgramStages: - adrp x16, :got:__blue_glCore_glUseProgramStages - ldr x16, [x16, #:got_lo12:__blue_glCore_glUseProgramStages] + .global bluegl_glGenFramebuffersEXT + .type bluegl_glGenFramebuffersEXT, %function +bluegl_glGenFramebuffersEXT: + adrp x16, :got:__blue_glCore_glGenFramebuffersEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenFramebuffersEXT] ldr x16, [x16] br x16 - .size bluegl_glUseProgramStages, .-bluegl_glUseProgramStages + .size bluegl_glGenFramebuffersEXT, .-bluegl_glGenFramebuffersEXT .align 2 - .global bluegl_glGetNamedStringivARB - .type bluegl_glGetNamedStringivARB, %function -bluegl_glGetNamedStringivARB: - adrp x16, :got:__blue_glCore_glGetNamedStringivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedStringivARB] + .global bluegl_glCheckFramebufferStatusEXT + .type bluegl_glCheckFramebufferStatusEXT, %function +bluegl_glCheckFramebufferStatusEXT: + adrp x16, :got:__blue_glCore_glCheckFramebufferStatusEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCheckFramebufferStatusEXT] ldr x16, [x16] br x16 - .size bluegl_glGetNamedStringivARB, .-bluegl_glGetNamedStringivARB + .size bluegl_glCheckFramebufferStatusEXT, .-bluegl_glCheckFramebufferStatusEXT .align 2 - .global bluegl_glMultiTexCoord1iARB - .type bluegl_glMultiTexCoord1iARB, %function -bluegl_glMultiTexCoord1iARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord1iARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1iARB] + .global bluegl_glFramebufferTexture1DEXT + .type bluegl_glFramebufferTexture1DEXT, %function +bluegl_glFramebufferTexture1DEXT: + adrp x16, :got:__blue_glCore_glFramebufferTexture1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTexture1DEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1iARB, .-bluegl_glMultiTexCoord1iARB + .size bluegl_glFramebufferTexture1DEXT, .-bluegl_glFramebufferTexture1DEXT .align 2 - .global bluegl_glMultiTexCoord4xvOES - .type bluegl_glMultiTexCoord4xvOES, %function -bluegl_glMultiTexCoord4xvOES: - adrp x16, :got:__blue_glCore_glMultiTexCoord4xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4xvOES] + .global bluegl_glFramebufferTexture2DEXT + .type bluegl_glFramebufferTexture2DEXT, %function +bluegl_glFramebufferTexture2DEXT: + adrp x16, :got:__blue_glCore_glFramebufferTexture2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTexture2DEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4xvOES, .-bluegl_glMultiTexCoord4xvOES + .size bluegl_glFramebufferTexture2DEXT, .-bluegl_glFramebufferTexture2DEXT .align 2 - .global bluegl_glMakeImageHandleResidentNV - .type bluegl_glMakeImageHandleResidentNV, %function -bluegl_glMakeImageHandleResidentNV: - adrp x16, :got:__blue_glCore_glMakeImageHandleResidentNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeImageHandleResidentNV] + .global bluegl_glFramebufferTexture3DEXT + .type bluegl_glFramebufferTexture3DEXT, %function +bluegl_glFramebufferTexture3DEXT: + adrp x16, :got:__blue_glCore_glFramebufferTexture3DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTexture3DEXT] ldr x16, [x16] br x16 - .size bluegl_glMakeImageHandleResidentNV, .-bluegl_glMakeImageHandleResidentNV + .size bluegl_glFramebufferTexture3DEXT, .-bluegl_glFramebufferTexture3DEXT .align 2 - .global bluegl_glVertexAttrib1fvNV - .type bluegl_glVertexAttrib1fvNV, %function -bluegl_glVertexAttrib1fvNV: - adrp x16, :got:__blue_glCore_glVertexAttrib1fvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1fvNV] + .global bluegl_glFramebufferRenderbufferEXT + .type bluegl_glFramebufferRenderbufferEXT, %function +bluegl_glFramebufferRenderbufferEXT: + adrp x16, :got:__blue_glCore_glFramebufferRenderbufferEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferRenderbufferEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1fvNV, .-bluegl_glVertexAttrib1fvNV + .size bluegl_glFramebufferRenderbufferEXT, .-bluegl_glFramebufferRenderbufferEXT .align 2 - .global bluegl_glViewportIndexedf - .type bluegl_glViewportIndexedf, %function -bluegl_glViewportIndexedf: - adrp x16, :got:__blue_glCore_glViewportIndexedf - ldr x16, [x16, #:got_lo12:__blue_glCore_glViewportIndexedf] + .global bluegl_glGetFramebufferAttachmentParameterivEXT + .type bluegl_glGetFramebufferAttachmentParameterivEXT, %function +bluegl_glGetFramebufferAttachmentParameterivEXT: + adrp x16, :got:__blue_glCore_glGetFramebufferAttachmentParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFramebufferAttachmentParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glViewportIndexedf, .-bluegl_glViewportIndexedf + .size bluegl_glGetFramebufferAttachmentParameterivEXT, .-bluegl_glGetFramebufferAttachmentParameterivEXT .align 2 - .global bluegl_glTexStorage3DMultisample - .type bluegl_glTexStorage3DMultisample, %function -bluegl_glTexStorage3DMultisample: - adrp x16, :got:__blue_glCore_glTexStorage3DMultisample - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexStorage3DMultisample] + .global bluegl_glGenerateMipmapEXT + .type bluegl_glGenerateMipmapEXT, %function +bluegl_glGenerateMipmapEXT: + adrp x16, :got:__blue_glCore_glGenerateMipmapEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenerateMipmapEXT] ldr x16, [x16] br x16 - .size bluegl_glTexStorage3DMultisample, .-bluegl_glTexStorage3DMultisample + .size bluegl_glGenerateMipmapEXT, .-bluegl_glGenerateMipmapEXT .align 2 - .global bluegl_glCreateShaderObjectARB - .type bluegl_glCreateShaderObjectARB, %function -bluegl_glCreateShaderObjectARB: - adrp x16, :got:__blue_glCore_glCreateShaderObjectARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateShaderObjectARB] + .global bluegl_glProgramParameteriEXT + .type bluegl_glProgramParameteriEXT, %function +bluegl_glProgramParameteriEXT: + adrp x16, :got:__blue_glCore_glProgramParameteriEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramParameteriEXT] ldr x16, [x16] br x16 - .size bluegl_glCreateShaderObjectARB, .-bluegl_glCreateShaderObjectARB + .size bluegl_glProgramParameteriEXT, .-bluegl_glProgramParameteriEXT .align 2 - .global bluegl_glListDrawCommandsStatesClientNV - .type bluegl_glListDrawCommandsStatesClientNV, %function -bluegl_glListDrawCommandsStatesClientNV: - adrp x16, :got:__blue_glCore_glListDrawCommandsStatesClientNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glListDrawCommandsStatesClientNV] + .global bluegl_glProgramEnvParameters4fvEXT + .type bluegl_glProgramEnvParameters4fvEXT, %function +bluegl_glProgramEnvParameters4fvEXT: + adrp x16, :got:__blue_glCore_glProgramEnvParameters4fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParameters4fvEXT] ldr x16, [x16] br x16 - .size bluegl_glListDrawCommandsStatesClientNV, .-bluegl_glListDrawCommandsStatesClientNV + .size bluegl_glProgramEnvParameters4fvEXT, .-bluegl_glProgramEnvParameters4fvEXT .align 2 - .global bluegl_glUniform1d - .type bluegl_glUniform1d, %function -bluegl_glUniform1d: - adrp x16, :got:__blue_glCore_glUniform1d - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1d] + .global bluegl_glProgramLocalParameters4fvEXT + .type bluegl_glProgramLocalParameters4fvEXT, %function +bluegl_glProgramLocalParameters4fvEXT: + adrp x16, :got:__blue_glCore_glProgramLocalParameters4fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParameters4fvEXT] ldr x16, [x16] br x16 - .size bluegl_glUniform1d, .-bluegl_glUniform1d + .size bluegl_glProgramLocalParameters4fvEXT, .-bluegl_glProgramLocalParameters4fvEXT .align 2 - .global bluegl_glGetDebugMessageLogARB - .type bluegl_glGetDebugMessageLogARB, %function -bluegl_glGetDebugMessageLogARB: - adrp x16, :got:__blue_glCore_glGetDebugMessageLogARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetDebugMessageLogARB] + .global bluegl_glGetUniformuivEXT + .type bluegl_glGetUniformuivEXT, %function +bluegl_glGetUniformuivEXT: + adrp x16, :got:__blue_glCore_glGetUniformuivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformuivEXT] ldr x16, [x16] br x16 - .size bluegl_glGetDebugMessageLogARB, .-bluegl_glGetDebugMessageLogARB + .size bluegl_glGetUniformuivEXT, .-bluegl_glGetUniformuivEXT .align 2 - .global bluegl_glBlendParameteriNV - .type bluegl_glBlendParameteriNV, %function -bluegl_glBlendParameteriNV: - adrp x16, :got:__blue_glCore_glBlendParameteriNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendParameteriNV] + .global bluegl_glBindFragDataLocationEXT + .type bluegl_glBindFragDataLocationEXT, %function +bluegl_glBindFragDataLocationEXT: + adrp x16, :got:__blue_glCore_glBindFragDataLocationEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindFragDataLocationEXT] ldr x16, [x16] br x16 - .size bluegl_glBlendParameteriNV, .-bluegl_glBlendParameteriNV + .size bluegl_glBindFragDataLocationEXT, .-bluegl_glBindFragDataLocationEXT .align 2 - .global bluegl_glMultiTexCoord4sv - .type bluegl_glMultiTexCoord4sv, %function -bluegl_glMultiTexCoord4sv: - adrp x16, :got:__blue_glCore_glMultiTexCoord4sv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4sv] + .global bluegl_glGetFragDataLocationEXT + .type bluegl_glGetFragDataLocationEXT, %function +bluegl_glGetFragDataLocationEXT: + adrp x16, :got:__blue_glCore_glGetFragDataLocationEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFragDataLocationEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4sv, .-bluegl_glMultiTexCoord4sv + .size bluegl_glGetFragDataLocationEXT, .-bluegl_glGetFragDataLocationEXT .align 2 .global bluegl_glUniform1uiEXT @@ -17960,7504 +17869,7614 @@ bluegl_glUniform1uiEXT: .size bluegl_glUniform1uiEXT, .-bluegl_glUniform1uiEXT .align 2 - .global bluegl_glDebugMessageInsertAMD - .type bluegl_glDebugMessageInsertAMD, %function -bluegl_glDebugMessageInsertAMD: - adrp x16, :got:__blue_glCore_glDebugMessageInsertAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glDebugMessageInsertAMD] - ldr x16, [x16] - br x16 - .size bluegl_glDebugMessageInsertAMD, .-bluegl_glDebugMessageInsertAMD - - .align 2 - .global bluegl_glMultiDrawArraysIndirect - .type bluegl_glMultiDrawArraysIndirect, %function -bluegl_glMultiDrawArraysIndirect: - adrp x16, :got:__blue_glCore_glMultiDrawArraysIndirect - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawArraysIndirect] - ldr x16, [x16] - br x16 - .size bluegl_glMultiDrawArraysIndirect, .-bluegl_glMultiDrawArraysIndirect - - .align 2 - .global bluegl_glProgramUniform1d - .type bluegl_glProgramUniform1d, %function -bluegl_glProgramUniform1d: - adrp x16, :got:__blue_glCore_glProgramUniform1d - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1d] + .global bluegl_glUniform2uiEXT + .type bluegl_glUniform2uiEXT, %function +bluegl_glUniform2uiEXT: + adrp x16, :got:__blue_glCore_glUniform2uiEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2uiEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1d, .-bluegl_glProgramUniform1d + .size bluegl_glUniform2uiEXT, .-bluegl_glUniform2uiEXT .align 2 - .global bluegl_glGetListParameterivSGIX - .type bluegl_glGetListParameterivSGIX, %function -bluegl_glGetListParameterivSGIX: - adrp x16, :got:__blue_glCore_glGetListParameterivSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetListParameterivSGIX] + .global bluegl_glUniform3uiEXT + .type bluegl_glUniform3uiEXT, %function +bluegl_glUniform3uiEXT: + adrp x16, :got:__blue_glCore_glUniform3uiEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3uiEXT] ldr x16, [x16] br x16 - .size bluegl_glGetListParameterivSGIX, .-bluegl_glGetListParameterivSGIX + .size bluegl_glUniform3uiEXT, .-bluegl_glUniform3uiEXT .align 2 - .global bluegl_glPointParameterfv - .type bluegl_glPointParameterfv, %function -bluegl_glPointParameterfv: - adrp x16, :got:__blue_glCore_glPointParameterfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterfv] + .global bluegl_glUniform4uiEXT + .type bluegl_glUniform4uiEXT, %function +bluegl_glUniform4uiEXT: + adrp x16, :got:__blue_glCore_glUniform4uiEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4uiEXT] ldr x16, [x16] br x16 - .size bluegl_glPointParameterfv, .-bluegl_glPointParameterfv + .size bluegl_glUniform4uiEXT, .-bluegl_glUniform4uiEXT .align 2 - .global bluegl_glCopyBufferSubData - .type bluegl_glCopyBufferSubData, %function -bluegl_glCopyBufferSubData: - adrp x16, :got:__blue_glCore_glCopyBufferSubData - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyBufferSubData] + .global bluegl_glUniform1uivEXT + .type bluegl_glUniform1uivEXT, %function +bluegl_glUniform1uivEXT: + adrp x16, :got:__blue_glCore_glUniform1uivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1uivEXT] ldr x16, [x16] br x16 - .size bluegl_glCopyBufferSubData, .-bluegl_glCopyBufferSubData + .size bluegl_glUniform1uivEXT, .-bluegl_glUniform1uivEXT .align 2 - .global bluegl_glBindProgramARB - .type bluegl_glBindProgramARB, %function -bluegl_glBindProgramARB: - adrp x16, :got:__blue_glCore_glBindProgramARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindProgramARB] + .global bluegl_glUniform2uivEXT + .type bluegl_glUniform2uivEXT, %function +bluegl_glUniform2uivEXT: + adrp x16, :got:__blue_glCore_glUniform2uivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2uivEXT] ldr x16, [x16] br x16 - .size bluegl_glBindProgramARB, .-bluegl_glBindProgramARB + .size bluegl_glUniform2uivEXT, .-bluegl_glUniform2uivEXT .align 2 - .global bluegl_glCombinerStageParameterfvNV - .type bluegl_glCombinerStageParameterfvNV, %function -bluegl_glCombinerStageParameterfvNV: - adrp x16, :got:__blue_glCore_glCombinerStageParameterfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCombinerStageParameterfvNV] + .global bluegl_glUniform3uivEXT + .type bluegl_glUniform3uivEXT, %function +bluegl_glUniform3uivEXT: + adrp x16, :got:__blue_glCore_glUniform3uivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3uivEXT] ldr x16, [x16] br x16 - .size bluegl_glCombinerStageParameterfvNV, .-bluegl_glCombinerStageParameterfvNV + .size bluegl_glUniform3uivEXT, .-bluegl_glUniform3uivEXT .align 2 - .global bluegl_glEndConditionalRenderNV - .type bluegl_glEndConditionalRenderNV, %function -bluegl_glEndConditionalRenderNV: - adrp x16, :got:__blue_glCore_glEndConditionalRenderNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glEndConditionalRenderNV] + .global bluegl_glUniform4uivEXT + .type bluegl_glUniform4uivEXT, %function +bluegl_glUniform4uivEXT: + adrp x16, :got:__blue_glCore_glUniform4uivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4uivEXT] ldr x16, [x16] br x16 - .size bluegl_glEndConditionalRenderNV, .-bluegl_glEndConditionalRenderNV + .size bluegl_glUniform4uivEXT, .-bluegl_glUniform4uivEXT .align 2 - .global bluegl_glVertexAttribL3dEXT - .type bluegl_glVertexAttribL3dEXT, %function -bluegl_glVertexAttribL3dEXT: - adrp x16, :got:__blue_glCore_glVertexAttribL3dEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL3dEXT] + .global bluegl_glGetHistogramEXT + .type bluegl_glGetHistogramEXT, %function +bluegl_glGetHistogramEXT: + adrp x16, :got:__blue_glCore_glGetHistogramEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetHistogramEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL3dEXT, .-bluegl_glVertexAttribL3dEXT + .size bluegl_glGetHistogramEXT, .-bluegl_glGetHistogramEXT .align 2 - .global bluegl_glWindowPos3iv - .type bluegl_glWindowPos3iv, %function -bluegl_glWindowPos3iv: - adrp x16, :got:__blue_glCore_glWindowPos3iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3iv] + .global bluegl_glGetHistogramParameterfvEXT + .type bluegl_glGetHistogramParameterfvEXT, %function +bluegl_glGetHistogramParameterfvEXT: + adrp x16, :got:__blue_glCore_glGetHistogramParameterfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetHistogramParameterfvEXT] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3iv, .-bluegl_glWindowPos3iv + .size bluegl_glGetHistogramParameterfvEXT, .-bluegl_glGetHistogramParameterfvEXT .align 2 - .global bluegl_glGetFogFuncSGIS - .type bluegl_glGetFogFuncSGIS, %function -bluegl_glGetFogFuncSGIS: - adrp x16, :got:__blue_glCore_glGetFogFuncSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFogFuncSGIS] + .global bluegl_glGetHistogramParameterivEXT + .type bluegl_glGetHistogramParameterivEXT, %function +bluegl_glGetHistogramParameterivEXT: + adrp x16, :got:__blue_glCore_glGetHistogramParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetHistogramParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glGetFogFuncSGIS, .-bluegl_glGetFogFuncSGIS + .size bluegl_glGetHistogramParameterivEXT, .-bluegl_glGetHistogramParameterivEXT .align 2 - .global bluegl_glCompressedTexImage2D - .type bluegl_glCompressedTexImage2D, %function -bluegl_glCompressedTexImage2D: - adrp x16, :got:__blue_glCore_glCompressedTexImage2D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexImage2D] + .global bluegl_glGetMinmaxEXT + .type bluegl_glGetMinmaxEXT, %function +bluegl_glGetMinmaxEXT: + adrp x16, :got:__blue_glCore_glGetMinmaxEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMinmaxEXT] ldr x16, [x16] br x16 - .size bluegl_glCompressedTexImage2D, .-bluegl_glCompressedTexImage2D + .size bluegl_glGetMinmaxEXT, .-bluegl_glGetMinmaxEXT .align 2 - .global bluegl_glPixelTexGenParameteriSGIS - .type bluegl_glPixelTexGenParameteriSGIS, %function -bluegl_glPixelTexGenParameteriSGIS: - adrp x16, :got:__blue_glCore_glPixelTexGenParameteriSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTexGenParameteriSGIS] + .global bluegl_glGetMinmaxParameterfvEXT + .type bluegl_glGetMinmaxParameterfvEXT, %function +bluegl_glGetMinmaxParameterfvEXT: + adrp x16, :got:__blue_glCore_glGetMinmaxParameterfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMinmaxParameterfvEXT] ldr x16, [x16] br x16 - .size bluegl_glPixelTexGenParameteriSGIS, .-bluegl_glPixelTexGenParameteriSGIS + .size bluegl_glGetMinmaxParameterfvEXT, .-bluegl_glGetMinmaxParameterfvEXT .align 2 - .global bluegl_glDebugMessageControlARB - .type bluegl_glDebugMessageControlARB, %function -bluegl_glDebugMessageControlARB: - adrp x16, :got:__blue_glCore_glDebugMessageControlARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glDebugMessageControlARB] + .global bluegl_glGetMinmaxParameterivEXT + .type bluegl_glGetMinmaxParameterivEXT, %function +bluegl_glGetMinmaxParameterivEXT: + adrp x16, :got:__blue_glCore_glGetMinmaxParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMinmaxParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glDebugMessageControlARB, .-bluegl_glDebugMessageControlARB + .size bluegl_glGetMinmaxParameterivEXT, .-bluegl_glGetMinmaxParameterivEXT .align 2 - .global bluegl_glMapBufferRange - .type bluegl_glMapBufferRange, %function -bluegl_glMapBufferRange: - adrp x16, :got:__blue_glCore_glMapBufferRange - ldr x16, [x16, #:got_lo12:__blue_glCore_glMapBufferRange] + .global bluegl_glHistogramEXT + .type bluegl_glHistogramEXT, %function +bluegl_glHistogramEXT: + adrp x16, :got:__blue_glCore_glHistogramEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glHistogramEXT] ldr x16, [x16] br x16 - .size bluegl_glMapBufferRange, .-bluegl_glMapBufferRange + .size bluegl_glHistogramEXT, .-bluegl_glHistogramEXT .align 2 - .global bluegl_glProgramUniform1fvEXT - .type bluegl_glProgramUniform1fvEXT, %function -bluegl_glProgramUniform1fvEXT: - adrp x16, :got:__blue_glCore_glProgramUniform1fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1fvEXT] + .global bluegl_glMinmaxEXT + .type bluegl_glMinmaxEXT, %function +bluegl_glMinmaxEXT: + adrp x16, :got:__blue_glCore_glMinmaxEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMinmaxEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1fvEXT, .-bluegl_glProgramUniform1fvEXT + .size bluegl_glMinmaxEXT, .-bluegl_glMinmaxEXT .align 2 - .global bluegl_glNamedRenderbufferStorageEXT - .type bluegl_glNamedRenderbufferStorageEXT, %function -bluegl_glNamedRenderbufferStorageEXT: - adrp x16, :got:__blue_glCore_glNamedRenderbufferStorageEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedRenderbufferStorageEXT] + .global bluegl_glResetHistogramEXT + .type bluegl_glResetHistogramEXT, %function +bluegl_glResetHistogramEXT: + adrp x16, :got:__blue_glCore_glResetHistogramEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glResetHistogramEXT] ldr x16, [x16] br x16 - .size bluegl_glNamedRenderbufferStorageEXT, .-bluegl_glNamedRenderbufferStorageEXT + .size bluegl_glResetHistogramEXT, .-bluegl_glResetHistogramEXT .align 2 - .global bluegl_glProgramUniformMatrix4x2fv - .type bluegl_glProgramUniformMatrix4x2fv, %function -bluegl_glProgramUniformMatrix4x2fv: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix4x2fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4x2fv] + .global bluegl_glResetMinmaxEXT + .type bluegl_glResetMinmaxEXT, %function +bluegl_glResetMinmaxEXT: + adrp x16, :got:__blue_glCore_glResetMinmaxEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glResetMinmaxEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix4x2fv, .-bluegl_glProgramUniformMatrix4x2fv + .size bluegl_glResetMinmaxEXT, .-bluegl_glResetMinmaxEXT .align 2 - .global bluegl_glNamedProgramLocalParameterI4iEXT - .type bluegl_glNamedProgramLocalParameterI4iEXT, %function -bluegl_glNamedProgramLocalParameterI4iEXT: - adrp x16, :got:__blue_glCore_glNamedProgramLocalParameterI4iEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParameterI4iEXT] + .global bluegl_glIndexFuncEXT + .type bluegl_glIndexFuncEXT, %function +bluegl_glIndexFuncEXT: + adrp x16, :got:__blue_glCore_glIndexFuncEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glIndexFuncEXT] ldr x16, [x16] br x16 - .size bluegl_glNamedProgramLocalParameterI4iEXT, .-bluegl_glNamedProgramLocalParameterI4iEXT + .size bluegl_glIndexFuncEXT, .-bluegl_glIndexFuncEXT .align 2 - .global bluegl_glClearDepth - .type bluegl_glClearDepth, %function -bluegl_glClearDepth: - adrp x16, :got:__blue_glCore_glClearDepth - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearDepth] + .global bluegl_glIndexMaterialEXT + .type bluegl_glIndexMaterialEXT, %function +bluegl_glIndexMaterialEXT: + adrp x16, :got:__blue_glCore_glIndexMaterialEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glIndexMaterialEXT] ldr x16, [x16] br x16 - .size bluegl_glClearDepth, .-bluegl_glClearDepth + .size bluegl_glIndexMaterialEXT, .-bluegl_glIndexMaterialEXT .align 2 - .global bluegl_glVertexAttribs1dvNV - .type bluegl_glVertexAttribs1dvNV, %function -bluegl_glVertexAttribs1dvNV: - adrp x16, :got:__blue_glCore_glVertexAttribs1dvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs1dvNV] + .global bluegl_glApplyTextureEXT + .type bluegl_glApplyTextureEXT, %function +bluegl_glApplyTextureEXT: + adrp x16, :got:__blue_glCore_glApplyTextureEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glApplyTextureEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribs1dvNV, .-bluegl_glVertexAttribs1dvNV + .size bluegl_glApplyTextureEXT, .-bluegl_glApplyTextureEXT .align 2 - .global bluegl_glWindowPos3f - .type bluegl_glWindowPos3f, %function -bluegl_glWindowPos3f: - adrp x16, :got:__blue_glCore_glWindowPos3f - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3f] + .global bluegl_glTextureLightEXT + .type bluegl_glTextureLightEXT, %function +bluegl_glTextureLightEXT: + adrp x16, :got:__blue_glCore_glTextureLightEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureLightEXT] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3f, .-bluegl_glWindowPos3f + .size bluegl_glTextureLightEXT, .-bluegl_glTextureLightEXT .align 2 - .global bluegl_glProvokingVertex - .type bluegl_glProvokingVertex, %function -bluegl_glProvokingVertex: - adrp x16, :got:__blue_glCore_glProvokingVertex - ldr x16, [x16, #:got_lo12:__blue_glCore_glProvokingVertex] + .global bluegl_glTextureMaterialEXT + .type bluegl_glTextureMaterialEXT, %function +bluegl_glTextureMaterialEXT: + adrp x16, :got:__blue_glCore_glTextureMaterialEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureMaterialEXT] ldr x16, [x16] br x16 - .size bluegl_glProvokingVertex, .-bluegl_glProvokingVertex + .size bluegl_glTextureMaterialEXT, .-bluegl_glTextureMaterialEXT .align 2 - .global bluegl_glIsNamedStringARB - .type bluegl_glIsNamedStringARB, %function -bluegl_glIsNamedStringARB: - adrp x16, :got:__blue_glCore_glIsNamedStringARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsNamedStringARB] + .global bluegl_glMultiDrawArraysEXT + .type bluegl_glMultiDrawArraysEXT, %function +bluegl_glMultiDrawArraysEXT: + adrp x16, :got:__blue_glCore_glMultiDrawArraysEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawArraysEXT] ldr x16, [x16] br x16 - .size bluegl_glIsNamedStringARB, .-bluegl_glIsNamedStringARB + .size bluegl_glMultiDrawArraysEXT, .-bluegl_glMultiDrawArraysEXT .align 2 - .global bluegl_glNamedBufferData - .type bluegl_glNamedBufferData, %function -bluegl_glNamedBufferData: - adrp x16, :got:__blue_glCore_glNamedBufferData - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedBufferData] + .global bluegl_glMultiDrawElementsEXT + .type bluegl_glMultiDrawElementsEXT, %function +bluegl_glMultiDrawElementsEXT: + adrp x16, :got:__blue_glCore_glMultiDrawElementsEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawElementsEXT] ldr x16, [x16] br x16 - .size bluegl_glNamedBufferData, .-bluegl_glNamedBufferData + .size bluegl_glMultiDrawElementsEXT, .-bluegl_glMultiDrawElementsEXT .align 2 - .global bluegl_glFragmentLightfSGIX - .type bluegl_glFragmentLightfSGIX, %function -bluegl_glFragmentLightfSGIX: - adrp x16, :got:__blue_glCore_glFragmentLightfSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentLightfSGIX] + .global bluegl_glSampleMaskEXT + .type bluegl_glSampleMaskEXT, %function +bluegl_glSampleMaskEXT: + adrp x16, :got:__blue_glCore_glSampleMaskEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSampleMaskEXT] ldr x16, [x16] br x16 - .size bluegl_glFragmentLightfSGIX, .-bluegl_glFragmentLightfSGIX + .size bluegl_glSampleMaskEXT, .-bluegl_glSampleMaskEXT .align 2 - .global bluegl_glProgramUniform4uiv - .type bluegl_glProgramUniform4uiv, %function -bluegl_glProgramUniform4uiv: - adrp x16, :got:__blue_glCore_glProgramUniform4uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4uiv] + .global bluegl_glSamplePatternEXT + .type bluegl_glSamplePatternEXT, %function +bluegl_glSamplePatternEXT: + adrp x16, :got:__blue_glCore_glSamplePatternEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSamplePatternEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4uiv, .-bluegl_glProgramUniform4uiv + .size bluegl_glSamplePatternEXT, .-bluegl_glSamplePatternEXT .align 2 - .global bluegl_glPointParameteriNV - .type bluegl_glPointParameteriNV, %function -bluegl_glPointParameteriNV: - adrp x16, :got:__blue_glCore_glPointParameteriNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameteriNV] + .global bluegl_glColorTableEXT + .type bluegl_glColorTableEXT, %function +bluegl_glColorTableEXT: + adrp x16, :got:__blue_glCore_glColorTableEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorTableEXT] ldr x16, [x16] br x16 - .size bluegl_glPointParameteriNV, .-bluegl_glPointParameteriNV + .size bluegl_glColorTableEXT, .-bluegl_glColorTableEXT .align 2 - .global bluegl_glNamedFramebufferReadBuffer - .type bluegl_glNamedFramebufferReadBuffer, %function -bluegl_glNamedFramebufferReadBuffer: - adrp x16, :got:__blue_glCore_glNamedFramebufferReadBuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferReadBuffer] + .global bluegl_glGetColorTableEXT + .type bluegl_glGetColorTableEXT, %function +bluegl_glGetColorTableEXT: + adrp x16, :got:__blue_glCore_glGetColorTableEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetColorTableEXT] ldr x16, [x16] br x16 - .size bluegl_glNamedFramebufferReadBuffer, .-bluegl_glNamedFramebufferReadBuffer + .size bluegl_glGetColorTableEXT, .-bluegl_glGetColorTableEXT .align 2 - .global bluegl_glPatchParameterfv - .type bluegl_glPatchParameterfv, %function -bluegl_glPatchParameterfv: - adrp x16, :got:__blue_glCore_glPatchParameterfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glPatchParameterfv] + .global bluegl_glGetColorTableParameterivEXT + .type bluegl_glGetColorTableParameterivEXT, %function +bluegl_glGetColorTableParameterivEXT: + adrp x16, :got:__blue_glCore_glGetColorTableParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetColorTableParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glPatchParameterfv, .-bluegl_glPatchParameterfv + .size bluegl_glGetColorTableParameterivEXT, .-bluegl_glGetColorTableParameterivEXT .align 2 - .global bluegl_glVertexArrayBindingDivisor - .type bluegl_glVertexArrayBindingDivisor, %function -bluegl_glVertexArrayBindingDivisor: - adrp x16, :got:__blue_glCore_glVertexArrayBindingDivisor - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayBindingDivisor] + .global bluegl_glGetColorTableParameterfvEXT + .type bluegl_glGetColorTableParameterfvEXT, %function +bluegl_glGetColorTableParameterfvEXT: + adrp x16, :got:__blue_glCore_glGetColorTableParameterfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetColorTableParameterfvEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayBindingDivisor, .-bluegl_glVertexArrayBindingDivisor + .size bluegl_glGetColorTableParameterfvEXT, .-bluegl_glGetColorTableParameterfvEXT .align 2 - .global bluegl_glDebugMessageEnableAMD - .type bluegl_glDebugMessageEnableAMD, %function -bluegl_glDebugMessageEnableAMD: - adrp x16, :got:__blue_glCore_glDebugMessageEnableAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glDebugMessageEnableAMD] + .global bluegl_glPixelTransformParameteriEXT + .type bluegl_glPixelTransformParameteriEXT, %function +bluegl_glPixelTransformParameteriEXT: + adrp x16, :got:__blue_glCore_glPixelTransformParameteriEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTransformParameteriEXT] ldr x16, [x16] br x16 - .size bluegl_glDebugMessageEnableAMD, .-bluegl_glDebugMessageEnableAMD + .size bluegl_glPixelTransformParameteriEXT, .-bluegl_glPixelTransformParameteriEXT .align 2 - .global bluegl_glGetVertexArrayIndexediv - .type bluegl_glGetVertexArrayIndexediv, %function -bluegl_glGetVertexArrayIndexediv: - adrp x16, :got:__blue_glCore_glGetVertexArrayIndexediv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexArrayIndexediv] + .global bluegl_glPixelTransformParameterfEXT + .type bluegl_glPixelTransformParameterfEXT, %function +bluegl_glPixelTransformParameterfEXT: + adrp x16, :got:__blue_glCore_glPixelTransformParameterfEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTransformParameterfEXT] ldr x16, [x16] br x16 - .size bluegl_glGetVertexArrayIndexediv, .-bluegl_glGetVertexArrayIndexediv + .size bluegl_glPixelTransformParameterfEXT, .-bluegl_glPixelTransformParameterfEXT .align 2 - .global bluegl_glGetVideoCaptureStreamdvNV - .type bluegl_glGetVideoCaptureStreamdvNV, %function -bluegl_glGetVideoCaptureStreamdvNV: - adrp x16, :got:__blue_glCore_glGetVideoCaptureStreamdvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVideoCaptureStreamdvNV] + .global bluegl_glPixelTransformParameterivEXT + .type bluegl_glPixelTransformParameterivEXT, %function +bluegl_glPixelTransformParameterivEXT: + adrp x16, :got:__blue_glCore_glPixelTransformParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTransformParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glGetVideoCaptureStreamdvNV, .-bluegl_glGetVideoCaptureStreamdvNV + .size bluegl_glPixelTransformParameterivEXT, .-bluegl_glPixelTransformParameterivEXT .align 2 - .global bluegl_glAlphaFragmentOp2ATI - .type bluegl_glAlphaFragmentOp2ATI, %function -bluegl_glAlphaFragmentOp2ATI: - adrp x16, :got:__blue_glCore_glAlphaFragmentOp2ATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glAlphaFragmentOp2ATI] + .global bluegl_glPixelTransformParameterfvEXT + .type bluegl_glPixelTransformParameterfvEXT, %function +bluegl_glPixelTransformParameterfvEXT: + adrp x16, :got:__blue_glCore_glPixelTransformParameterfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTransformParameterfvEXT] ldr x16, [x16] br x16 - .size bluegl_glAlphaFragmentOp2ATI, .-bluegl_glAlphaFragmentOp2ATI + .size bluegl_glPixelTransformParameterfvEXT, .-bluegl_glPixelTransformParameterfvEXT .align 2 - .global bluegl_glVertex2hNV - .type bluegl_glVertex2hNV, %function -bluegl_glVertex2hNV: - adrp x16, :got:__blue_glCore_glVertex2hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex2hNV] + .global bluegl_glGetPixelTransformParameterivEXT + .type bluegl_glGetPixelTransformParameterivEXT, %function +bluegl_glGetPixelTransformParameterivEXT: + adrp x16, :got:__blue_glCore_glGetPixelTransformParameterivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPixelTransformParameterivEXT] ldr x16, [x16] br x16 - .size bluegl_glVertex2hNV, .-bluegl_glVertex2hNV + .size bluegl_glGetPixelTransformParameterivEXT, .-bluegl_glGetPixelTransformParameterivEXT .align 2 - .global bluegl_glCombinerParameteriNV - .type bluegl_glCombinerParameteriNV, %function -bluegl_glCombinerParameteriNV: - adrp x16, :got:__blue_glCore_glCombinerParameteriNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCombinerParameteriNV] + .global bluegl_glGetPixelTransformParameterfvEXT + .type bluegl_glGetPixelTransformParameterfvEXT, %function +bluegl_glGetPixelTransformParameterfvEXT: + adrp x16, :got:__blue_glCore_glGetPixelTransformParameterfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPixelTransformParameterfvEXT] ldr x16, [x16] br x16 - .size bluegl_glCombinerParameteriNV, .-bluegl_glCombinerParameteriNV + .size bluegl_glGetPixelTransformParameterfvEXT, .-bluegl_glGetPixelTransformParameterfvEXT .align 2 - .global bluegl_glGetNamedFramebufferAttachmentParameterivEXT - .type bluegl_glGetNamedFramebufferAttachmentParameterivEXT, %function -bluegl_glGetNamedFramebufferAttachmentParameterivEXT: - adrp x16, :got:__blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT] + .global bluegl_glPointParameterfEXT + .type bluegl_glPointParameterfEXT, %function +bluegl_glPointParameterfEXT: + adrp x16, :got:__blue_glCore_glPointParameterfEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterfEXT] ldr x16, [x16] br x16 - .size bluegl_glGetNamedFramebufferAttachmentParameterivEXT, .-bluegl_glGetNamedFramebufferAttachmentParameterivEXT + .size bluegl_glPointParameterfEXT, .-bluegl_glPointParameterfEXT .align 2 - .global bluegl_glIsVariantEnabledEXT - .type bluegl_glIsVariantEnabledEXT, %function -bluegl_glIsVariantEnabledEXT: - adrp x16, :got:__blue_glCore_glIsVariantEnabledEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsVariantEnabledEXT] + .global bluegl_glPointParameterfvEXT + .type bluegl_glPointParameterfvEXT, %function +bluegl_glPointParameterfvEXT: + adrp x16, :got:__blue_glCore_glPointParameterfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterfvEXT] ldr x16, [x16] br x16 - .size bluegl_glIsVariantEnabledEXT, .-bluegl_glIsVariantEnabledEXT + .size bluegl_glPointParameterfvEXT, .-bluegl_glPointParameterfvEXT .align 2 - .global bluegl_glGetVertexAttribfvNV - .type bluegl_glGetVertexAttribfvNV, %function -bluegl_glGetVertexAttribfvNV: - adrp x16, :got:__blue_glCore_glGetVertexAttribfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribfvNV] + .global bluegl_glPolygonOffsetEXT + .type bluegl_glPolygonOffsetEXT, %function +bluegl_glPolygonOffsetEXT: + adrp x16, :got:__blue_glCore_glPolygonOffsetEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glPolygonOffsetEXT] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribfvNV, .-bluegl_glGetVertexAttribfvNV + .size bluegl_glPolygonOffsetEXT, .-bluegl_glPolygonOffsetEXT .align 2 - .global bluegl_glGetProgramPipelineiv - .type bluegl_glGetProgramPipelineiv, %function -bluegl_glGetProgramPipelineiv: - adrp x16, :got:__blue_glCore_glGetProgramPipelineiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramPipelineiv] + .global bluegl_glPolygonOffsetClampEXT + .type bluegl_glPolygonOffsetClampEXT, %function +bluegl_glPolygonOffsetClampEXT: + adrp x16, :got:__blue_glCore_glPolygonOffsetClampEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glPolygonOffsetClampEXT] ldr x16, [x16] br x16 - .size bluegl_glGetProgramPipelineiv, .-bluegl_glGetProgramPipelineiv + .size bluegl_glPolygonOffsetClampEXT, .-bluegl_glPolygonOffsetClampEXT .align 2 - .global bluegl_glUnmapBufferARB - .type bluegl_glUnmapBufferARB, %function -bluegl_glUnmapBufferARB: - adrp x16, :got:__blue_glCore_glUnmapBufferARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUnmapBufferARB] + .global bluegl_glProvokingVertexEXT + .type bluegl_glProvokingVertexEXT, %function +bluegl_glProvokingVertexEXT: + adrp x16, :got:__blue_glCore_glProvokingVertexEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glProvokingVertexEXT] ldr x16, [x16] br x16 - .size bluegl_glUnmapBufferARB, .-bluegl_glUnmapBufferARB + .size bluegl_glProvokingVertexEXT, .-bluegl_glProvokingVertexEXT .align 2 - .global bluegl_glVertexAttribPointerNV - .type bluegl_glVertexAttribPointerNV, %function -bluegl_glVertexAttribPointerNV: - adrp x16, :got:__blue_glCore_glVertexAttribPointerNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribPointerNV] + .global bluegl_glRasterSamplesEXT + .type bluegl_glRasterSamplesEXT, %function +bluegl_glRasterSamplesEXT: + adrp x16, :got:__blue_glCore_glRasterSamplesEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glRasterSamplesEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribPointerNV, .-bluegl_glVertexAttribPointerNV + .size bluegl_glRasterSamplesEXT, .-bluegl_glRasterSamplesEXT .align 2 - .global bluegl_glGetPathSpacingNV - .type bluegl_glGetPathSpacingNV, %function -bluegl_glGetPathSpacingNV: - adrp x16, :got:__blue_glCore_glGetPathSpacingNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathSpacingNV] + .global bluegl_glSecondaryColor3bEXT + .type bluegl_glSecondaryColor3bEXT, %function +bluegl_glSecondaryColor3bEXT: + adrp x16, :got:__blue_glCore_glSecondaryColor3bEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3bEXT] ldr x16, [x16] br x16 - .size bluegl_glGetPathSpacingNV, .-bluegl_glGetPathSpacingNV + .size bluegl_glSecondaryColor3bEXT, .-bluegl_glSecondaryColor3bEXT .align 2 - .global bluegl_glMaterialxOES - .type bluegl_glMaterialxOES, %function -bluegl_glMaterialxOES: - adrp x16, :got:__blue_glCore_glMaterialxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMaterialxOES] + .global bluegl_glSecondaryColor3bvEXT + .type bluegl_glSecondaryColor3bvEXT, %function +bluegl_glSecondaryColor3bvEXT: + adrp x16, :got:__blue_glCore_glSecondaryColor3bvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3bvEXT] ldr x16, [x16] br x16 - .size bluegl_glMaterialxOES, .-bluegl_glMaterialxOES + .size bluegl_glSecondaryColor3bvEXT, .-bluegl_glSecondaryColor3bvEXT .align 2 - .global bluegl_glVertexStream3fvATI - .type bluegl_glVertexStream3fvATI, %function -bluegl_glVertexStream3fvATI: - adrp x16, :got:__blue_glCore_glVertexStream3fvATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream3fvATI] + .global bluegl_glSecondaryColor3dEXT + .type bluegl_glSecondaryColor3dEXT, %function +bluegl_glSecondaryColor3dEXT: + adrp x16, :got:__blue_glCore_glSecondaryColor3dEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3dEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexStream3fvATI, .-bluegl_glVertexStream3fvATI + .size bluegl_glSecondaryColor3dEXT, .-bluegl_glSecondaryColor3dEXT .align 2 - .global bluegl_glVertexStream4dATI - .type bluegl_glVertexStream4dATI, %function -bluegl_glVertexStream4dATI: - adrp x16, :got:__blue_glCore_glVertexStream4dATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream4dATI] + .global bluegl_glSecondaryColor3dvEXT + .type bluegl_glSecondaryColor3dvEXT, %function +bluegl_glSecondaryColor3dvEXT: + adrp x16, :got:__blue_glCore_glSecondaryColor3dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3dvEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexStream4dATI, .-bluegl_glVertexStream4dATI + .size bluegl_glSecondaryColor3dvEXT, .-bluegl_glSecondaryColor3dvEXT .align 2 - .global bluegl_glVertexAttrib2d - .type bluegl_glVertexAttrib2d, %function -bluegl_glVertexAttrib2d: - adrp x16, :got:__blue_glCore_glVertexAttrib2d - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2d] + .global bluegl_glSecondaryColor3fEXT + .type bluegl_glSecondaryColor3fEXT, %function +bluegl_glSecondaryColor3fEXT: + adrp x16, :got:__blue_glCore_glSecondaryColor3fEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3fEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2d, .-bluegl_glVertexAttrib2d + .size bluegl_glSecondaryColor3fEXT, .-bluegl_glSecondaryColor3fEXT .align 2 - .global bluegl_glStencilMaskSeparate - .type bluegl_glStencilMaskSeparate, %function -bluegl_glStencilMaskSeparate: - adrp x16, :got:__blue_glCore_glStencilMaskSeparate - ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilMaskSeparate] + .global bluegl_glSecondaryColor3fvEXT + .type bluegl_glSecondaryColor3fvEXT, %function +bluegl_glSecondaryColor3fvEXT: + adrp x16, :got:__blue_glCore_glSecondaryColor3fvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3fvEXT] ldr x16, [x16] br x16 - .size bluegl_glStencilMaskSeparate, .-bluegl_glStencilMaskSeparate + .size bluegl_glSecondaryColor3fvEXT, .-bluegl_glSecondaryColor3fvEXT .align 2 - .global bluegl_glTestFenceAPPLE - .type bluegl_glTestFenceAPPLE, %function -bluegl_glTestFenceAPPLE: - adrp x16, :got:__blue_glCore_glTestFenceAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glTestFenceAPPLE] + .global bluegl_glSecondaryColor3iEXT + .type bluegl_glSecondaryColor3iEXT, %function +bluegl_glSecondaryColor3iEXT: + adrp x16, :got:__blue_glCore_glSecondaryColor3iEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3iEXT] ldr x16, [x16] br x16 - .size bluegl_glTestFenceAPPLE, .-bluegl_glTestFenceAPPLE + .size bluegl_glSecondaryColor3iEXT, .-bluegl_glSecondaryColor3iEXT .align 2 - .global bluegl_glBindMaterialParameterEXT - .type bluegl_glBindMaterialParameterEXT, %function -bluegl_glBindMaterialParameterEXT: - adrp x16, :got:__blue_glCore_glBindMaterialParameterEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindMaterialParameterEXT] + .global bluegl_glSecondaryColor3ivEXT + .type bluegl_glSecondaryColor3ivEXT, %function +bluegl_glSecondaryColor3ivEXT: + adrp x16, :got:__blue_glCore_glSecondaryColor3ivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3ivEXT] ldr x16, [x16] br x16 - .size bluegl_glBindMaterialParameterEXT, .-bluegl_glBindMaterialParameterEXT + .size bluegl_glSecondaryColor3ivEXT, .-bluegl_glSecondaryColor3ivEXT .align 2 - .global bluegl_glBlendEquationEXT - .type bluegl_glBlendEquationEXT, %function -bluegl_glBlendEquationEXT: - adrp x16, :got:__blue_glCore_glBlendEquationEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquationEXT] + .global bluegl_glSecondaryColor3sEXT + .type bluegl_glSecondaryColor3sEXT, %function +bluegl_glSecondaryColor3sEXT: + adrp x16, :got:__blue_glCore_glSecondaryColor3sEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3sEXT] ldr x16, [x16] br x16 - .size bluegl_glBlendEquationEXT, .-bluegl_glBlendEquationEXT + .size bluegl_glSecondaryColor3sEXT, .-bluegl_glSecondaryColor3sEXT .align 2 - .global bluegl_glMultiTexCoord4hNV - .type bluegl_glMultiTexCoord4hNV, %function -bluegl_glMultiTexCoord4hNV: - adrp x16, :got:__blue_glCore_glMultiTexCoord4hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4hNV] + .global bluegl_glSecondaryColor3svEXT + .type bluegl_glSecondaryColor3svEXT, %function +bluegl_glSecondaryColor3svEXT: + adrp x16, :got:__blue_glCore_glSecondaryColor3svEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3svEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4hNV, .-bluegl_glMultiTexCoord4hNV + .size bluegl_glSecondaryColor3svEXT, .-bluegl_glSecondaryColor3svEXT .align 2 - .global bluegl_glMultiTexCoord1fARB - .type bluegl_glMultiTexCoord1fARB, %function -bluegl_glMultiTexCoord1fARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord1fARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1fARB] + .global bluegl_glSecondaryColor3ubEXT + .type bluegl_glSecondaryColor3ubEXT, %function +bluegl_glSecondaryColor3ubEXT: + adrp x16, :got:__blue_glCore_glSecondaryColor3ubEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3ubEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1fARB, .-bluegl_glMultiTexCoord1fARB + .size bluegl_glSecondaryColor3ubEXT, .-bluegl_glSecondaryColor3ubEXT .align 2 - .global bluegl_glPrioritizeTexturesxOES - .type bluegl_glPrioritizeTexturesxOES, %function -bluegl_glPrioritizeTexturesxOES: - adrp x16, :got:__blue_glCore_glPrioritizeTexturesxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glPrioritizeTexturesxOES] + .global bluegl_glSecondaryColor3ubvEXT + .type bluegl_glSecondaryColor3ubvEXT, %function +bluegl_glSecondaryColor3ubvEXT: + adrp x16, :got:__blue_glCore_glSecondaryColor3ubvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3ubvEXT] ldr x16, [x16] br x16 - .size bluegl_glPrioritizeTexturesxOES, .-bluegl_glPrioritizeTexturesxOES + .size bluegl_glSecondaryColor3ubvEXT, .-bluegl_glSecondaryColor3ubvEXT .align 2 - .global bluegl_glVertexAttribs1fvNV - .type bluegl_glVertexAttribs1fvNV, %function -bluegl_glVertexAttribs1fvNV: - adrp x16, :got:__blue_glCore_glVertexAttribs1fvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs1fvNV] + .global bluegl_glSecondaryColor3uiEXT + .type bluegl_glSecondaryColor3uiEXT, %function +bluegl_glSecondaryColor3uiEXT: + adrp x16, :got:__blue_glCore_glSecondaryColor3uiEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3uiEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribs1fvNV, .-bluegl_glVertexAttribs1fvNV + .size bluegl_glSecondaryColor3uiEXT, .-bluegl_glSecondaryColor3uiEXT .align 2 - .global bluegl_glGetInternalformati64v - .type bluegl_glGetInternalformati64v, %function -bluegl_glGetInternalformati64v: - adrp x16, :got:__blue_glCore_glGetInternalformati64v - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInternalformati64v] + .global bluegl_glSecondaryColor3uivEXT + .type bluegl_glSecondaryColor3uivEXT, %function +bluegl_glSecondaryColor3uivEXT: + adrp x16, :got:__blue_glCore_glSecondaryColor3uivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3uivEXT] ldr x16, [x16] br x16 - .size bluegl_glGetInternalformati64v, .-bluegl_glGetInternalformati64v + .size bluegl_glSecondaryColor3uivEXT, .-bluegl_glSecondaryColor3uivEXT .align 2 - .global bluegl_glDisableVertexAttribAPPLE - .type bluegl_glDisableVertexAttribAPPLE, %function -bluegl_glDisableVertexAttribAPPLE: - adrp x16, :got:__blue_glCore_glDisableVertexAttribAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableVertexAttribAPPLE] + .global bluegl_glSecondaryColor3usEXT + .type bluegl_glSecondaryColor3usEXT, %function +bluegl_glSecondaryColor3usEXT: + adrp x16, :got:__blue_glCore_glSecondaryColor3usEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3usEXT] ldr x16, [x16] br x16 - .size bluegl_glDisableVertexAttribAPPLE, .-bluegl_glDisableVertexAttribAPPLE + .size bluegl_glSecondaryColor3usEXT, .-bluegl_glSecondaryColor3usEXT .align 2 - .global bluegl_glVertexStream3sATI - .type bluegl_glVertexStream3sATI, %function -bluegl_glVertexStream3sATI: - adrp x16, :got:__blue_glCore_glVertexStream3sATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream3sATI] + .global bluegl_glSecondaryColor3usvEXT + .type bluegl_glSecondaryColor3usvEXT, %function +bluegl_glSecondaryColor3usvEXT: + adrp x16, :got:__blue_glCore_glSecondaryColor3usvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3usvEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexStream3sATI, .-bluegl_glVertexStream3sATI + .size bluegl_glSecondaryColor3usvEXT, .-bluegl_glSecondaryColor3usvEXT .align 2 - .global bluegl_glCheckFramebufferStatusEXT - .type bluegl_glCheckFramebufferStatusEXT, %function -bluegl_glCheckFramebufferStatusEXT: - adrp x16, :got:__blue_glCore_glCheckFramebufferStatusEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCheckFramebufferStatusEXT] + .global bluegl_glSecondaryColorPointerEXT + .type bluegl_glSecondaryColorPointerEXT, %function +bluegl_glSecondaryColorPointerEXT: + adrp x16, :got:__blue_glCore_glSecondaryColorPointerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColorPointerEXT] ldr x16, [x16] br x16 - .size bluegl_glCheckFramebufferStatusEXT, .-bluegl_glCheckFramebufferStatusEXT + .size bluegl_glSecondaryColorPointerEXT, .-bluegl_glSecondaryColorPointerEXT .align 2 - .global bluegl_glGetMinmax - .type bluegl_glGetMinmax, %function -bluegl_glGetMinmax: - adrp x16, :got:__blue_glCore_glGetMinmax - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMinmax] + .global bluegl_glUseShaderProgramEXT + .type bluegl_glUseShaderProgramEXT, %function +bluegl_glUseShaderProgramEXT: + adrp x16, :got:__blue_glCore_glUseShaderProgramEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glUseShaderProgramEXT] ldr x16, [x16] br x16 - .size bluegl_glGetMinmax, .-bluegl_glGetMinmax + .size bluegl_glUseShaderProgramEXT, .-bluegl_glUseShaderProgramEXT .align 2 - .global bluegl_glCopyTexSubImage3DEXT - .type bluegl_glCopyTexSubImage3DEXT, %function -bluegl_glCopyTexSubImage3DEXT: - adrp x16, :got:__blue_glCore_glCopyTexSubImage3DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTexSubImage3DEXT] + .global bluegl_glActiveProgramEXT + .type bluegl_glActiveProgramEXT, %function +bluegl_glActiveProgramEXT: + adrp x16, :got:__blue_glCore_glActiveProgramEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glActiveProgramEXT] ldr x16, [x16] br x16 - .size bluegl_glCopyTexSubImage3DEXT, .-bluegl_glCopyTexSubImage3DEXT + .size bluegl_glActiveProgramEXT, .-bluegl_glActiveProgramEXT .align 2 - .global bluegl_glUniform1ivARB - .type bluegl_glUniform1ivARB, %function -bluegl_glUniform1ivARB: - adrp x16, :got:__blue_glCore_glUniform1ivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1ivARB] + .global bluegl_glCreateShaderProgramEXT + .type bluegl_glCreateShaderProgramEXT, %function +bluegl_glCreateShaderProgramEXT: + adrp x16, :got:__blue_glCore_glCreateShaderProgramEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateShaderProgramEXT] + ldr x16, [x16] + br x16 + .size bluegl_glCreateShaderProgramEXT, .-bluegl_glCreateShaderProgramEXT + + .align 2 + .global bluegl_glBindImageTextureEXT + .type bluegl_glBindImageTextureEXT, %function +bluegl_glBindImageTextureEXT: + adrp x16, :got:__blue_glCore_glBindImageTextureEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindImageTextureEXT] ldr x16, [x16] br x16 - .size bluegl_glUniform1ivARB, .-bluegl_glUniform1ivARB + .size bluegl_glBindImageTextureEXT, .-bluegl_glBindImageTextureEXT .align 2 - .global bluegl_glColorP4uiv - .type bluegl_glColorP4uiv, %function -bluegl_glColorP4uiv: - adrp x16, :got:__blue_glCore_glColorP4uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorP4uiv] + .global bluegl_glMemoryBarrierEXT + .type bluegl_glMemoryBarrierEXT, %function +bluegl_glMemoryBarrierEXT: + adrp x16, :got:__blue_glCore_glMemoryBarrierEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glMemoryBarrierEXT] ldr x16, [x16] br x16 - .size bluegl_glColorP4uiv, .-bluegl_glColorP4uiv + .size bluegl_glMemoryBarrierEXT, .-bluegl_glMemoryBarrierEXT .align 2 - .global bluegl_glDisableVertexAttribArrayARB - .type bluegl_glDisableVertexAttribArrayARB, %function -bluegl_glDisableVertexAttribArrayARB: - adrp x16, :got:__blue_glCore_glDisableVertexAttribArrayARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableVertexAttribArrayARB] + .global bluegl_glStencilClearTagEXT + .type bluegl_glStencilClearTagEXT, %function +bluegl_glStencilClearTagEXT: + adrp x16, :got:__blue_glCore_glStencilClearTagEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilClearTagEXT] ldr x16, [x16] br x16 - .size bluegl_glDisableVertexAttribArrayARB, .-bluegl_glDisableVertexAttribArrayARB + .size bluegl_glStencilClearTagEXT, .-bluegl_glStencilClearTagEXT .align 2 - .global bluegl_glNamedProgramLocalParameter4fvEXT - .type bluegl_glNamedProgramLocalParameter4fvEXT, %function -bluegl_glNamedProgramLocalParameter4fvEXT: - adrp x16, :got:__blue_glCore_glNamedProgramLocalParameter4fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParameter4fvEXT] + .global bluegl_glActiveStencilFaceEXT + .type bluegl_glActiveStencilFaceEXT, %function +bluegl_glActiveStencilFaceEXT: + adrp x16, :got:__blue_glCore_glActiveStencilFaceEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glActiveStencilFaceEXT] ldr x16, [x16] br x16 - .size bluegl_glNamedProgramLocalParameter4fvEXT, .-bluegl_glNamedProgramLocalParameter4fvEXT + .size bluegl_glActiveStencilFaceEXT, .-bluegl_glActiveStencilFaceEXT .align 2 - .global bluegl_glBlendFuncSeparateEXT - .type bluegl_glBlendFuncSeparateEXT, %function -bluegl_glBlendFuncSeparateEXT: - adrp x16, :got:__blue_glCore_glBlendFuncSeparateEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFuncSeparateEXT] + .global bluegl_glTexSubImage1DEXT + .type bluegl_glTexSubImage1DEXT, %function +bluegl_glTexSubImage1DEXT: + adrp x16, :got:__blue_glCore_glTexSubImage1DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexSubImage1DEXT] ldr x16, [x16] br x16 - .size bluegl_glBlendFuncSeparateEXT, .-bluegl_glBlendFuncSeparateEXT + .size bluegl_glTexSubImage1DEXT, .-bluegl_glTexSubImage1DEXT .align 2 - .global bluegl_glVertexAttribL3i64NV - .type bluegl_glVertexAttribL3i64NV, %function -bluegl_glVertexAttribL3i64NV: - adrp x16, :got:__blue_glCore_glVertexAttribL3i64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL3i64NV] + .global bluegl_glTexSubImage2DEXT + .type bluegl_glTexSubImage2DEXT, %function +bluegl_glTexSubImage2DEXT: + adrp x16, :got:__blue_glCore_glTexSubImage2DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexSubImage2DEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL3i64NV, .-bluegl_glVertexAttribL3i64NV + .size bluegl_glTexSubImage2DEXT, .-bluegl_glTexSubImage2DEXT .align 2 - .global bluegl_glBindProgramPipeline - .type bluegl_glBindProgramPipeline, %function -bluegl_glBindProgramPipeline: - adrp x16, :got:__blue_glCore_glBindProgramPipeline - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindProgramPipeline] + .global bluegl_glTexImage3DEXT + .type bluegl_glTexImage3DEXT, %function +bluegl_glTexImage3DEXT: + adrp x16, :got:__blue_glCore_glTexImage3DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexImage3DEXT] ldr x16, [x16] br x16 - .size bluegl_glBindProgramPipeline, .-bluegl_glBindProgramPipeline + .size bluegl_glTexImage3DEXT, .-bluegl_glTexImage3DEXT .align 2 - .global bluegl_glCreateProgramPipelines - .type bluegl_glCreateProgramPipelines, %function -bluegl_glCreateProgramPipelines: - adrp x16, :got:__blue_glCore_glCreateProgramPipelines - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateProgramPipelines] + .global bluegl_glTexSubImage3DEXT + .type bluegl_glTexSubImage3DEXT, %function +bluegl_glTexSubImage3DEXT: + adrp x16, :got:__blue_glCore_glTexSubImage3DEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexSubImage3DEXT] ldr x16, [x16] br x16 - .size bluegl_glCreateProgramPipelines, .-bluegl_glCreateProgramPipelines + .size bluegl_glTexSubImage3DEXT, .-bluegl_glTexSubImage3DEXT .align 2 - .global bluegl_glDeleteRenderbuffersEXT - .type bluegl_glDeleteRenderbuffersEXT, %function -bluegl_glDeleteRenderbuffersEXT: - adrp x16, :got:__blue_glCore_glDeleteRenderbuffersEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteRenderbuffersEXT] + .global bluegl_glFramebufferTextureLayerEXT + .type bluegl_glFramebufferTextureLayerEXT, %function +bluegl_glFramebufferTextureLayerEXT: + adrp x16, :got:__blue_glCore_glFramebufferTextureLayerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTextureLayerEXT] ldr x16, [x16] br x16 - .size bluegl_glDeleteRenderbuffersEXT, .-bluegl_glDeleteRenderbuffersEXT + .size bluegl_glFramebufferTextureLayerEXT, .-bluegl_glFramebufferTextureLayerEXT .align 2 - .global bluegl_glEdgeFlagFormatNV - .type bluegl_glEdgeFlagFormatNV, %function -bluegl_glEdgeFlagFormatNV: - adrp x16, :got:__blue_glCore_glEdgeFlagFormatNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glEdgeFlagFormatNV] + .global bluegl_glTexBufferEXT + .type bluegl_glTexBufferEXT, %function +bluegl_glTexBufferEXT: + adrp x16, :got:__blue_glCore_glTexBufferEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexBufferEXT] ldr x16, [x16] br x16 - .size bluegl_glEdgeFlagFormatNV, .-bluegl_glEdgeFlagFormatNV + .size bluegl_glTexBufferEXT, .-bluegl_glTexBufferEXT .align 2 - .global bluegl_glGetActiveUniformBlockiv - .type bluegl_glGetActiveUniformBlockiv, %function -bluegl_glGetActiveUniformBlockiv: - adrp x16, :got:__blue_glCore_glGetActiveUniformBlockiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveUniformBlockiv] + .global bluegl_glTexParameterIivEXT + .type bluegl_glTexParameterIivEXT, %function +bluegl_glTexParameterIivEXT: + adrp x16, :got:__blue_glCore_glTexParameterIivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameterIivEXT] ldr x16, [x16] br x16 - .size bluegl_glGetActiveUniformBlockiv, .-bluegl_glGetActiveUniformBlockiv + .size bluegl_glTexParameterIivEXT, .-bluegl_glTexParameterIivEXT .align 2 - .global bluegl_glProgramUniform3f - .type bluegl_glProgramUniform3f, %function -bluegl_glProgramUniform3f: - adrp x16, :got:__blue_glCore_glProgramUniform3f - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3f] + .global bluegl_glTexParameterIuivEXT + .type bluegl_glTexParameterIuivEXT, %function +bluegl_glTexParameterIuivEXT: + adrp x16, :got:__blue_glCore_glTexParameterIuivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameterIuivEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3f, .-bluegl_glProgramUniform3f + .size bluegl_glTexParameterIuivEXT, .-bluegl_glTexParameterIuivEXT .align 2 - .global bluegl_glDrawCommandsStatesAddressNV - .type bluegl_glDrawCommandsStatesAddressNV, %function -bluegl_glDrawCommandsStatesAddressNV: - adrp x16, :got:__blue_glCore_glDrawCommandsStatesAddressNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawCommandsStatesAddressNV] + .global bluegl_glGetTexParameterIivEXT + .type bluegl_glGetTexParameterIivEXT, %function +bluegl_glGetTexParameterIivEXT: + adrp x16, :got:__blue_glCore_glGetTexParameterIivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexParameterIivEXT] ldr x16, [x16] br x16 - .size bluegl_glDrawCommandsStatesAddressNV, .-bluegl_glDrawCommandsStatesAddressNV + .size bluegl_glGetTexParameterIivEXT, .-bluegl_glGetTexParameterIivEXT .align 2 - .global bluegl_glGetVertexAttribfv - .type bluegl_glGetVertexAttribfv, %function -bluegl_glGetVertexAttribfv: - adrp x16, :got:__blue_glCore_glGetVertexAttribfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribfv] + .global bluegl_glGetTexParameterIuivEXT + .type bluegl_glGetTexParameterIuivEXT, %function +bluegl_glGetTexParameterIuivEXT: + adrp x16, :got:__blue_glCore_glGetTexParameterIuivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexParameterIuivEXT] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribfv, .-bluegl_glGetVertexAttribfv + .size bluegl_glGetTexParameterIuivEXT, .-bluegl_glGetTexParameterIuivEXT .align 2 - .global bluegl_glGetVariantArrayObjectivATI - .type bluegl_glGetVariantArrayObjectivATI, %function -bluegl_glGetVariantArrayObjectivATI: - adrp x16, :got:__blue_glCore_glGetVariantArrayObjectivATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVariantArrayObjectivATI] + .global bluegl_glClearColorIiEXT + .type bluegl_glClearColorIiEXT, %function +bluegl_glClearColorIiEXT: + adrp x16, :got:__blue_glCore_glClearColorIiEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearColorIiEXT] ldr x16, [x16] br x16 - .size bluegl_glGetVariantArrayObjectivATI, .-bluegl_glGetVariantArrayObjectivATI + .size bluegl_glClearColorIiEXT, .-bluegl_glClearColorIiEXT .align 2 - .global bluegl_glNamedProgramLocalParameter4dEXT - .type bluegl_glNamedProgramLocalParameter4dEXT, %function -bluegl_glNamedProgramLocalParameter4dEXT: - adrp x16, :got:__blue_glCore_glNamedProgramLocalParameter4dEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParameter4dEXT] + .global bluegl_glClearColorIuiEXT + .type bluegl_glClearColorIuiEXT, %function +bluegl_glClearColorIuiEXT: + adrp x16, :got:__blue_glCore_glClearColorIuiEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearColorIuiEXT] ldr x16, [x16] br x16 - .size bluegl_glNamedProgramLocalParameter4dEXT, .-bluegl_glNamedProgramLocalParameter4dEXT + .size bluegl_glClearColorIuiEXT, .-bluegl_glClearColorIuiEXT .align 2 - .global bluegl_glGenTransformFeedbacksNV - .type bluegl_glGenTransformFeedbacksNV, %function -bluegl_glGenTransformFeedbacksNV: - adrp x16, :got:__blue_glCore_glGenTransformFeedbacksNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenTransformFeedbacksNV] + .global bluegl_glAreTexturesResidentEXT + .type bluegl_glAreTexturesResidentEXT, %function +bluegl_glAreTexturesResidentEXT: + adrp x16, :got:__blue_glCore_glAreTexturesResidentEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glAreTexturesResidentEXT] ldr x16, [x16] br x16 - .size bluegl_glGenTransformFeedbacksNV, .-bluegl_glGenTransformFeedbacksNV + .size bluegl_glAreTexturesResidentEXT, .-bluegl_glAreTexturesResidentEXT .align 2 - .global bluegl_glDrawElementArrayAPPLE - .type bluegl_glDrawElementArrayAPPLE, %function -bluegl_glDrawElementArrayAPPLE: - adrp x16, :got:__blue_glCore_glDrawElementArrayAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementArrayAPPLE] + .global bluegl_glBindTextureEXT + .type bluegl_glBindTextureEXT, %function +bluegl_glBindTextureEXT: + adrp x16, :got:__blue_glCore_glBindTextureEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindTextureEXT] ldr x16, [x16] br x16 - .size bluegl_glDrawElementArrayAPPLE, .-bluegl_glDrawElementArrayAPPLE + .size bluegl_glBindTextureEXT, .-bluegl_glBindTextureEXT .align 2 - .global bluegl_glVertexAttrib4NusvARB - .type bluegl_glVertexAttrib4NusvARB, %function -bluegl_glVertexAttrib4NusvARB: - adrp x16, :got:__blue_glCore_glVertexAttrib4NusvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4NusvARB] + .global bluegl_glDeleteTexturesEXT + .type bluegl_glDeleteTexturesEXT, %function +bluegl_glDeleteTexturesEXT: + adrp x16, :got:__blue_glCore_glDeleteTexturesEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteTexturesEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4NusvARB, .-bluegl_glVertexAttrib4NusvARB + .size bluegl_glDeleteTexturesEXT, .-bluegl_glDeleteTexturesEXT .align 2 - .global bluegl_glBindRenderbufferEXT - .type bluegl_glBindRenderbufferEXT, %function -bluegl_glBindRenderbufferEXT: - adrp x16, :got:__blue_glCore_glBindRenderbufferEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindRenderbufferEXT] + .global bluegl_glGenTexturesEXT + .type bluegl_glGenTexturesEXT, %function +bluegl_glGenTexturesEXT: + adrp x16, :got:__blue_glCore_glGenTexturesEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenTexturesEXT] ldr x16, [x16] br x16 - .size bluegl_glBindRenderbufferEXT, .-bluegl_glBindRenderbufferEXT + .size bluegl_glGenTexturesEXT, .-bluegl_glGenTexturesEXT .align 2 - .global bluegl_glUnmapTexture2DINTEL - .type bluegl_glUnmapTexture2DINTEL, %function -bluegl_glUnmapTexture2DINTEL: - adrp x16, :got:__blue_glCore_glUnmapTexture2DINTEL - ldr x16, [x16, #:got_lo12:__blue_glCore_glUnmapTexture2DINTEL] + .global bluegl_glIsTextureEXT + .type bluegl_glIsTextureEXT, %function +bluegl_glIsTextureEXT: + adrp x16, :got:__blue_glCore_glIsTextureEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsTextureEXT] ldr x16, [x16] br x16 - .size bluegl_glUnmapTexture2DINTEL, .-bluegl_glUnmapTexture2DINTEL + .size bluegl_glIsTextureEXT, .-bluegl_glIsTextureEXT .align 2 - .global bluegl_glGetProgramEnvParameterfvARB - .type bluegl_glGetProgramEnvParameterfvARB, %function -bluegl_glGetProgramEnvParameterfvARB: - adrp x16, :got:__blue_glCore_glGetProgramEnvParameterfvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramEnvParameterfvARB] + .global bluegl_glPrioritizeTexturesEXT + .type bluegl_glPrioritizeTexturesEXT, %function +bluegl_glPrioritizeTexturesEXT: + adrp x16, :got:__blue_glCore_glPrioritizeTexturesEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glPrioritizeTexturesEXT] ldr x16, [x16] br x16 - .size bluegl_glGetProgramEnvParameterfvARB, .-bluegl_glGetProgramEnvParameterfvARB + .size bluegl_glPrioritizeTexturesEXT, .-bluegl_glPrioritizeTexturesEXT .align 2 - .global bluegl_glVertexAttrib4f - .type bluegl_glVertexAttrib4f, %function -bluegl_glVertexAttrib4f: - adrp x16, :got:__blue_glCore_glVertexAttrib4f - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4f] + .global bluegl_glTextureNormalEXT + .type bluegl_glTextureNormalEXT, %function +bluegl_glTextureNormalEXT: + adrp x16, :got:__blue_glCore_glTextureNormalEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureNormalEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4f, .-bluegl_glVertexAttrib4f + .size bluegl_glTextureNormalEXT, .-bluegl_glTextureNormalEXT .align 2 - .global bluegl_glGetnPixelMapfv - .type bluegl_glGetnPixelMapfv, %function -bluegl_glGetnPixelMapfv: - adrp x16, :got:__blue_glCore_glGetnPixelMapfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnPixelMapfv] + .global bluegl_glGetQueryObjecti64vEXT + .type bluegl_glGetQueryObjecti64vEXT, %function +bluegl_glGetQueryObjecti64vEXT: + adrp x16, :got:__blue_glCore_glGetQueryObjecti64vEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryObjecti64vEXT] ldr x16, [x16] br x16 - .size bluegl_glGetnPixelMapfv, .-bluegl_glGetnPixelMapfv + .size bluegl_glGetQueryObjecti64vEXT, .-bluegl_glGetQueryObjecti64vEXT .align 2 - .global bluegl_glVertexAttrib3dv - .type bluegl_glVertexAttrib3dv, %function -bluegl_glVertexAttrib3dv: - adrp x16, :got:__blue_glCore_glVertexAttrib3dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3dv] + .global bluegl_glGetQueryObjectui64vEXT + .type bluegl_glGetQueryObjectui64vEXT, %function +bluegl_glGetQueryObjectui64vEXT: + adrp x16, :got:__blue_glCore_glGetQueryObjectui64vEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryObjectui64vEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3dv, .-bluegl_glVertexAttrib3dv + .size bluegl_glGetQueryObjectui64vEXT, .-bluegl_glGetQueryObjectui64vEXT .align 2 - .global bluegl_glFlushMappedBufferRange - .type bluegl_glFlushMappedBufferRange, %function -bluegl_glFlushMappedBufferRange: - adrp x16, :got:__blue_glCore_glFlushMappedBufferRange - ldr x16, [x16, #:got_lo12:__blue_glCore_glFlushMappedBufferRange] + .global bluegl_glBeginTransformFeedbackEXT + .type bluegl_glBeginTransformFeedbackEXT, %function +bluegl_glBeginTransformFeedbackEXT: + adrp x16, :got:__blue_glCore_glBeginTransformFeedbackEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginTransformFeedbackEXT] ldr x16, [x16] br x16 - .size bluegl_glFlushMappedBufferRange, .-bluegl_glFlushMappedBufferRange + .size bluegl_glBeginTransformFeedbackEXT, .-bluegl_glBeginTransformFeedbackEXT .align 2 - .global bluegl_glSecondaryColor3ub - .type bluegl_glSecondaryColor3ub, %function -bluegl_glSecondaryColor3ub: - adrp x16, :got:__blue_glCore_glSecondaryColor3ub - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3ub] + .global bluegl_glEndTransformFeedbackEXT + .type bluegl_glEndTransformFeedbackEXT, %function +bluegl_glEndTransformFeedbackEXT: + adrp x16, :got:__blue_glCore_glEndTransformFeedbackEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glEndTransformFeedbackEXT] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3ub, .-bluegl_glSecondaryColor3ub + .size bluegl_glEndTransformFeedbackEXT, .-bluegl_glEndTransformFeedbackEXT .align 2 - .global bluegl_glGetPerfQueryDataINTEL - .type bluegl_glGetPerfQueryDataINTEL, %function -bluegl_glGetPerfQueryDataINTEL: - adrp x16, :got:__blue_glCore_glGetPerfQueryDataINTEL - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfQueryDataINTEL] + .global bluegl_glBindBufferRangeEXT + .type bluegl_glBindBufferRangeEXT, %function +bluegl_glBindBufferRangeEXT: + adrp x16, :got:__blue_glCore_glBindBufferRangeEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBufferRangeEXT] ldr x16, [x16] br x16 - .size bluegl_glGetPerfQueryDataINTEL, .-bluegl_glGetPerfQueryDataINTEL + .size bluegl_glBindBufferRangeEXT, .-bluegl_glBindBufferRangeEXT .align 2 - .global bluegl_glGetnMapivARB - .type bluegl_glGetnMapivARB, %function -bluegl_glGetnMapivARB: - adrp x16, :got:__blue_glCore_glGetnMapivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnMapivARB] + .global bluegl_glBindBufferOffsetEXT + .type bluegl_glBindBufferOffsetEXT, %function +bluegl_glBindBufferOffsetEXT: + adrp x16, :got:__blue_glCore_glBindBufferOffsetEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBufferOffsetEXT] ldr x16, [x16] br x16 - .size bluegl_glGetnMapivARB, .-bluegl_glGetnMapivARB + .size bluegl_glBindBufferOffsetEXT, .-bluegl_glBindBufferOffsetEXT .align 2 - .global bluegl_glSeparableFilter2DEXT - .type bluegl_glSeparableFilter2DEXT, %function -bluegl_glSeparableFilter2DEXT: - adrp x16, :got:__blue_glCore_glSeparableFilter2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSeparableFilter2DEXT] + .global bluegl_glBindBufferBaseEXT + .type bluegl_glBindBufferBaseEXT, %function +bluegl_glBindBufferBaseEXT: + adrp x16, :got:__blue_glCore_glBindBufferBaseEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBufferBaseEXT] ldr x16, [x16] br x16 - .size bluegl_glSeparableFilter2DEXT, .-bluegl_glSeparableFilter2DEXT + .size bluegl_glBindBufferBaseEXT, .-bluegl_glBindBufferBaseEXT .align 2 - .global bluegl_glProgramUniformMatrix3x2fvEXT - .type bluegl_glProgramUniformMatrix3x2fvEXT, %function -bluegl_glProgramUniformMatrix3x2fvEXT: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix3x2fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3x2fvEXT] + .global bluegl_glTransformFeedbackVaryingsEXT + .type bluegl_glTransformFeedbackVaryingsEXT, %function +bluegl_glTransformFeedbackVaryingsEXT: + adrp x16, :got:__blue_glCore_glTransformFeedbackVaryingsEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTransformFeedbackVaryingsEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix3x2fvEXT, .-bluegl_glProgramUniformMatrix3x2fvEXT + .size bluegl_glTransformFeedbackVaryingsEXT, .-bluegl_glTransformFeedbackVaryingsEXT .align 2 - .global bluegl_glGenVertexArrays - .type bluegl_glGenVertexArrays, %function -bluegl_glGenVertexArrays: - adrp x16, :got:__blue_glCore_glGenVertexArrays - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenVertexArrays] + .global bluegl_glGetTransformFeedbackVaryingEXT + .type bluegl_glGetTransformFeedbackVaryingEXT, %function +bluegl_glGetTransformFeedbackVaryingEXT: + adrp x16, :got:__blue_glCore_glGetTransformFeedbackVaryingEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTransformFeedbackVaryingEXT] ldr x16, [x16] br x16 - .size bluegl_glGenVertexArrays, .-bluegl_glGenVertexArrays + .size bluegl_glGetTransformFeedbackVaryingEXT, .-bluegl_glGetTransformFeedbackVaryingEXT .align 2 - .global bluegl_glEndQueryARB - .type bluegl_glEndQueryARB, %function -bluegl_glEndQueryARB: - adrp x16, :got:__blue_glCore_glEndQueryARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glEndQueryARB] + .global bluegl_glArrayElementEXT + .type bluegl_glArrayElementEXT, %function +bluegl_glArrayElementEXT: + adrp x16, :got:__blue_glCore_glArrayElementEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glArrayElementEXT] ldr x16, [x16] br x16 - .size bluegl_glEndQueryARB, .-bluegl_glEndQueryARB + .size bluegl_glArrayElementEXT, .-bluegl_glArrayElementEXT .align 2 - .global bluegl_glVertexAttrib2fv - .type bluegl_glVertexAttrib2fv, %function -bluegl_glVertexAttrib2fv: - adrp x16, :got:__blue_glCore_glVertexAttrib2fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2fv] + .global bluegl_glColorPointerEXT + .type bluegl_glColorPointerEXT, %function +bluegl_glColorPointerEXT: + adrp x16, :got:__blue_glCore_glColorPointerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorPointerEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2fv, .-bluegl_glVertexAttrib2fv + .size bluegl_glColorPointerEXT, .-bluegl_glColorPointerEXT .align 2 - .global bluegl_glWindowPos2fv - .type bluegl_glWindowPos2fv, %function -bluegl_glWindowPos2fv: - adrp x16, :got:__blue_glCore_glWindowPos2fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2fv] + .global bluegl_glDrawArraysEXT + .type bluegl_glDrawArraysEXT, %function +bluegl_glDrawArraysEXT: + adrp x16, :got:__blue_glCore_glDrawArraysEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawArraysEXT] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2fv, .-bluegl_glWindowPos2fv + .size bluegl_glDrawArraysEXT, .-bluegl_glDrawArraysEXT .align 2 - .global bluegl_glCopyConvolutionFilter1D - .type bluegl_glCopyConvolutionFilter1D, %function -bluegl_glCopyConvolutionFilter1D: - adrp x16, :got:__blue_glCore_glCopyConvolutionFilter1D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyConvolutionFilter1D] + .global bluegl_glEdgeFlagPointerEXT + .type bluegl_glEdgeFlagPointerEXT, %function +bluegl_glEdgeFlagPointerEXT: + adrp x16, :got:__blue_glCore_glEdgeFlagPointerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glEdgeFlagPointerEXT] ldr x16, [x16] br x16 - .size bluegl_glCopyConvolutionFilter1D, .-bluegl_glCopyConvolutionFilter1D + .size bluegl_glEdgeFlagPointerEXT, .-bluegl_glEdgeFlagPointerEXT .align 2 - .global bluegl_glTexCoordFormatNV - .type bluegl_glTexCoordFormatNV, %function -bluegl_glTexCoordFormatNV: - adrp x16, :got:__blue_glCore_glTexCoordFormatNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordFormatNV] + .global bluegl_glGetPointervEXT + .type bluegl_glGetPointervEXT, %function +bluegl_glGetPointervEXT: + adrp x16, :got:__blue_glCore_glGetPointervEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPointervEXT] ldr x16, [x16] br x16 - .size bluegl_glTexCoordFormatNV, .-bluegl_glTexCoordFormatNV + .size bluegl_glGetPointervEXT, .-bluegl_glGetPointervEXT .align 2 - .global bluegl_glMultiTexCoordP2uiv - .type bluegl_glMultiTexCoordP2uiv, %function -bluegl_glMultiTexCoordP2uiv: - adrp x16, :got:__blue_glCore_glMultiTexCoordP2uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoordP2uiv] + .global bluegl_glIndexPointerEXT + .type bluegl_glIndexPointerEXT, %function +bluegl_glIndexPointerEXT: + adrp x16, :got:__blue_glCore_glIndexPointerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glIndexPointerEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoordP2uiv, .-bluegl_glMultiTexCoordP2uiv + .size bluegl_glIndexPointerEXT, .-bluegl_glIndexPointerEXT .align 2 - .global bluegl_glProgramUniform1ui64vARB - .type bluegl_glProgramUniform1ui64vARB, %function -bluegl_glProgramUniform1ui64vARB: - adrp x16, :got:__blue_glCore_glProgramUniform1ui64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1ui64vARB] + .global bluegl_glNormalPointerEXT + .type bluegl_glNormalPointerEXT, %function +bluegl_glNormalPointerEXT: + adrp x16, :got:__blue_glCore_glNormalPointerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalPointerEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1ui64vARB, .-bluegl_glProgramUniform1ui64vARB + .size bluegl_glNormalPointerEXT, .-bluegl_glNormalPointerEXT .align 2 - .global bluegl_glColorSubTable - .type bluegl_glColorSubTable, %function -bluegl_glColorSubTable: - adrp x16, :got:__blue_glCore_glColorSubTable - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorSubTable] + .global bluegl_glTexCoordPointerEXT + .type bluegl_glTexCoordPointerEXT, %function +bluegl_glTexCoordPointerEXT: + adrp x16, :got:__blue_glCore_glTexCoordPointerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordPointerEXT] ldr x16, [x16] br x16 - .size bluegl_glColorSubTable, .-bluegl_glColorSubTable + .size bluegl_glTexCoordPointerEXT, .-bluegl_glTexCoordPointerEXT .align 2 - .global bluegl_glNamedBufferSubData - .type bluegl_glNamedBufferSubData, %function -bluegl_glNamedBufferSubData: - adrp x16, :got:__blue_glCore_glNamedBufferSubData - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedBufferSubData] + .global bluegl_glVertexPointerEXT + .type bluegl_glVertexPointerEXT, %function +bluegl_glVertexPointerEXT: + adrp x16, :got:__blue_glCore_glVertexPointerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexPointerEXT] ldr x16, [x16] br x16 - .size bluegl_glNamedBufferSubData, .-bluegl_glNamedBufferSubData + .size bluegl_glVertexPointerEXT, .-bluegl_glVertexPointerEXT .align 2 - .global bluegl_glGetCompressedTextureImage - .type bluegl_glGetCompressedTextureImage, %function -bluegl_glGetCompressedTextureImage: - adrp x16, :got:__blue_glCore_glGetCompressedTextureImage - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCompressedTextureImage] + .global bluegl_glVertexAttribL1dEXT + .type bluegl_glVertexAttribL1dEXT, %function +bluegl_glVertexAttribL1dEXT: + adrp x16, :got:__blue_glCore_glVertexAttribL1dEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1dEXT] ldr x16, [x16] br x16 - .size bluegl_glGetCompressedTextureImage, .-bluegl_glGetCompressedTextureImage + .size bluegl_glVertexAttribL1dEXT, .-bluegl_glVertexAttribL1dEXT .align 2 - .global bluegl_glNamedCopyBufferSubDataEXT - .type bluegl_glNamedCopyBufferSubDataEXT, %function -bluegl_glNamedCopyBufferSubDataEXT: - adrp x16, :got:__blue_glCore_glNamedCopyBufferSubDataEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedCopyBufferSubDataEXT] + .global bluegl_glVertexAttribL2dEXT + .type bluegl_glVertexAttribL2dEXT, %function +bluegl_glVertexAttribL2dEXT: + adrp x16, :got:__blue_glCore_glVertexAttribL2dEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL2dEXT] + ldr x16, [x16] + br x16 + .size bluegl_glVertexAttribL2dEXT, .-bluegl_glVertexAttribL2dEXT + + .align 2 + .global bluegl_glVertexAttribL3dEXT + .type bluegl_glVertexAttribL3dEXT, %function +bluegl_glVertexAttribL3dEXT: + adrp x16, :got:__blue_glCore_glVertexAttribL3dEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL3dEXT] ldr x16, [x16] br x16 - .size bluegl_glNamedCopyBufferSubDataEXT, .-bluegl_glNamedCopyBufferSubDataEXT + .size bluegl_glVertexAttribL3dEXT, .-bluegl_glVertexAttribL3dEXT .align 2 - .global bluegl_glVertexAttribL1i64NV - .type bluegl_glVertexAttribL1i64NV, %function -bluegl_glVertexAttribL1i64NV: - adrp x16, :got:__blue_glCore_glVertexAttribL1i64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1i64NV] + .global bluegl_glVertexAttribL4dEXT + .type bluegl_glVertexAttribL4dEXT, %function +bluegl_glVertexAttribL4dEXT: + adrp x16, :got:__blue_glCore_glVertexAttribL4dEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL4dEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL1i64NV, .-bluegl_glVertexAttribL1i64NV + .size bluegl_glVertexAttribL4dEXT, .-bluegl_glVertexAttribL4dEXT .align 2 - .global bluegl_glVertexArrayMultiTexCoordOffsetEXT - .type bluegl_glVertexArrayMultiTexCoordOffsetEXT, %function -bluegl_glVertexArrayMultiTexCoordOffsetEXT: - adrp x16, :got:__blue_glCore_glVertexArrayMultiTexCoordOffsetEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayMultiTexCoordOffsetEXT] + .global bluegl_glVertexAttribL1dvEXT + .type bluegl_glVertexAttribL1dvEXT, %function +bluegl_glVertexAttribL1dvEXT: + adrp x16, :got:__blue_glCore_glVertexAttribL1dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1dvEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayMultiTexCoordOffsetEXT, .-bluegl_glVertexArrayMultiTexCoordOffsetEXT + .size bluegl_glVertexAttribL1dvEXT, .-bluegl_glVertexAttribL1dvEXT .align 2 - .global bluegl_glGetUniformIndices - .type bluegl_glGetUniformIndices, %function -bluegl_glGetUniformIndices: - adrp x16, :got:__blue_glCore_glGetUniformIndices - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformIndices] + .global bluegl_glVertexAttribL2dvEXT + .type bluegl_glVertexAttribL2dvEXT, %function +bluegl_glVertexAttribL2dvEXT: + adrp x16, :got:__blue_glCore_glVertexAttribL2dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL2dvEXT] ldr x16, [x16] br x16 - .size bluegl_glGetUniformIndices, .-bluegl_glGetUniformIndices + .size bluegl_glVertexAttribL2dvEXT, .-bluegl_glVertexAttribL2dvEXT .align 2 - .global bluegl_glDrawArraysInstancedARB - .type bluegl_glDrawArraysInstancedARB, %function -bluegl_glDrawArraysInstancedARB: - adrp x16, :got:__blue_glCore_glDrawArraysInstancedARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawArraysInstancedARB] + .global bluegl_glVertexAttribL3dvEXT + .type bluegl_glVertexAttribL3dvEXT, %function +bluegl_glVertexAttribL3dvEXT: + adrp x16, :got:__blue_glCore_glVertexAttribL3dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL3dvEXT] ldr x16, [x16] br x16 - .size bluegl_glDrawArraysInstancedARB, .-bluegl_glDrawArraysInstancedARB + .size bluegl_glVertexAttribL3dvEXT, .-bluegl_glVertexAttribL3dvEXT .align 2 - .global bluegl_glGetMultiTexGenivEXT - .type bluegl_glGetMultiTexGenivEXT, %function -bluegl_glGetMultiTexGenivEXT: - adrp x16, :got:__blue_glCore_glGetMultiTexGenivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexGenivEXT] + .global bluegl_glVertexAttribL4dvEXT + .type bluegl_glVertexAttribL4dvEXT, %function +bluegl_glVertexAttribL4dvEXT: + adrp x16, :got:__blue_glCore_glVertexAttribL4dvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL4dvEXT] ldr x16, [x16] br x16 - .size bluegl_glGetMultiTexGenivEXT, .-bluegl_glGetMultiTexGenivEXT + .size bluegl_glVertexAttribL4dvEXT, .-bluegl_glVertexAttribL4dvEXT .align 2 - .global bluegl_glGetVertexArrayPointervEXT - .type bluegl_glGetVertexArrayPointervEXT, %function -bluegl_glGetVertexArrayPointervEXT: - adrp x16, :got:__blue_glCore_glGetVertexArrayPointervEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexArrayPointervEXT] + .global bluegl_glVertexAttribLPointerEXT + .type bluegl_glVertexAttribLPointerEXT, %function +bluegl_glVertexAttribLPointerEXT: + adrp x16, :got:__blue_glCore_glVertexAttribLPointerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribLPointerEXT] ldr x16, [x16] br x16 - .size bluegl_glGetVertexArrayPointervEXT, .-bluegl_glGetVertexArrayPointervEXT + .size bluegl_glVertexAttribLPointerEXT, .-bluegl_glVertexAttribLPointerEXT .align 2 - .global bluegl_glBeginQuery - .type bluegl_glBeginQuery, %function -bluegl_glBeginQuery: - adrp x16, :got:__blue_glCore_glBeginQuery - ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginQuery] + .global bluegl_glGetVertexAttribLdvEXT + .type bluegl_glGetVertexAttribLdvEXT, %function +bluegl_glGetVertexAttribLdvEXT: + adrp x16, :got:__blue_glCore_glGetVertexAttribLdvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribLdvEXT] ldr x16, [x16] br x16 - .size bluegl_glBeginQuery, .-bluegl_glBeginQuery + .size bluegl_glGetVertexAttribLdvEXT, .-bluegl_glGetVertexAttribLdvEXT .align 2 - .global bluegl_glDetachObjectARB - .type bluegl_glDetachObjectARB, %function -bluegl_glDetachObjectARB: - adrp x16, :got:__blue_glCore_glDetachObjectARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glDetachObjectARB] + .global bluegl_glBeginVertexShaderEXT + .type bluegl_glBeginVertexShaderEXT, %function +bluegl_glBeginVertexShaderEXT: + adrp x16, :got:__blue_glCore_glBeginVertexShaderEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginVertexShaderEXT] ldr x16, [x16] br x16 - .size bluegl_glDetachObjectARB, .-bluegl_glDetachObjectARB + .size bluegl_glBeginVertexShaderEXT, .-bluegl_glBeginVertexShaderEXT .align 2 - .global bluegl_glUniform4iv - .type bluegl_glUniform4iv, %function -bluegl_glUniform4iv: - adrp x16, :got:__blue_glCore_glUniform4iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4iv] + .global bluegl_glEndVertexShaderEXT + .type bluegl_glEndVertexShaderEXT, %function +bluegl_glEndVertexShaderEXT: + adrp x16, :got:__blue_glCore_glEndVertexShaderEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glEndVertexShaderEXT] ldr x16, [x16] br x16 - .size bluegl_glUniform4iv, .-bluegl_glUniform4iv + .size bluegl_glEndVertexShaderEXT, .-bluegl_glEndVertexShaderEXT .align 2 - .global bluegl_glGetQueryObjectuiv - .type bluegl_glGetQueryObjectuiv, %function -bluegl_glGetQueryObjectuiv: - adrp x16, :got:__blue_glCore_glGetQueryObjectuiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryObjectuiv] + .global bluegl_glBindVertexShaderEXT + .type bluegl_glBindVertexShaderEXT, %function +bluegl_glBindVertexShaderEXT: + adrp x16, :got:__blue_glCore_glBindVertexShaderEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindVertexShaderEXT] ldr x16, [x16] br x16 - .size bluegl_glGetQueryObjectuiv, .-bluegl_glGetQueryObjectuiv + .size bluegl_glBindVertexShaderEXT, .-bluegl_glBindVertexShaderEXT .align 2 - .global bluegl_glGetObjectBufferivATI - .type bluegl_glGetObjectBufferivATI, %function -bluegl_glGetObjectBufferivATI: - adrp x16, :got:__blue_glCore_glGetObjectBufferivATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetObjectBufferivATI] + .global bluegl_glGenVertexShadersEXT + .type bluegl_glGenVertexShadersEXT, %function +bluegl_glGenVertexShadersEXT: + adrp x16, :got:__blue_glCore_glGenVertexShadersEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenVertexShadersEXT] ldr x16, [x16] br x16 - .size bluegl_glGetObjectBufferivATI, .-bluegl_glGetObjectBufferivATI + .size bluegl_glGenVertexShadersEXT, .-bluegl_glGenVertexShadersEXT .align 2 - .global bluegl_glCreateTransformFeedbacks - .type bluegl_glCreateTransformFeedbacks, %function -bluegl_glCreateTransformFeedbacks: - adrp x16, :got:__blue_glCore_glCreateTransformFeedbacks - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateTransformFeedbacks] + .global bluegl_glDeleteVertexShaderEXT + .type bluegl_glDeleteVertexShaderEXT, %function +bluegl_glDeleteVertexShaderEXT: + adrp x16, :got:__blue_glCore_glDeleteVertexShaderEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteVertexShaderEXT] ldr x16, [x16] br x16 - .size bluegl_glCreateTransformFeedbacks, .-bluegl_glCreateTransformFeedbacks + .size bluegl_glDeleteVertexShaderEXT, .-bluegl_glDeleteVertexShaderEXT .align 2 - .global bluegl_glVertexStream3dATI - .type bluegl_glVertexStream3dATI, %function -bluegl_glVertexStream3dATI: - adrp x16, :got:__blue_glCore_glVertexStream3dATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream3dATI] + .global bluegl_glShaderOp1EXT + .type bluegl_glShaderOp1EXT, %function +bluegl_glShaderOp1EXT: + adrp x16, :got:__blue_glCore_glShaderOp1EXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glShaderOp1EXT] ldr x16, [x16] br x16 - .size bluegl_glVertexStream3dATI, .-bluegl_glVertexStream3dATI + .size bluegl_glShaderOp1EXT, .-bluegl_glShaderOp1EXT .align 2 - .global bluegl_glEvalMapsNV - .type bluegl_glEvalMapsNV, %function -bluegl_glEvalMapsNV: - adrp x16, :got:__blue_glCore_glEvalMapsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glEvalMapsNV] + .global bluegl_glShaderOp2EXT + .type bluegl_glShaderOp2EXT, %function +bluegl_glShaderOp2EXT: + adrp x16, :got:__blue_glCore_glShaderOp2EXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glShaderOp2EXT] ldr x16, [x16] br x16 - .size bluegl_glEvalMapsNV, .-bluegl_glEvalMapsNV + .size bluegl_glShaderOp2EXT, .-bluegl_glShaderOp2EXT .align 2 - .global bluegl_glIsNameAMD - .type bluegl_glIsNameAMD, %function -bluegl_glIsNameAMD: - adrp x16, :got:__blue_glCore_glIsNameAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsNameAMD] + .global bluegl_glShaderOp3EXT + .type bluegl_glShaderOp3EXT, %function +bluegl_glShaderOp3EXT: + adrp x16, :got:__blue_glCore_glShaderOp3EXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glShaderOp3EXT] ldr x16, [x16] br x16 - .size bluegl_glIsNameAMD, .-bluegl_glIsNameAMD + .size bluegl_glShaderOp3EXT, .-bluegl_glShaderOp3EXT .align 2 - .global bluegl_glVertexAttrib4ivARB - .type bluegl_glVertexAttrib4ivARB, %function -bluegl_glVertexAttrib4ivARB: - adrp x16, :got:__blue_glCore_glVertexAttrib4ivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4ivARB] + .global bluegl_glSwizzleEXT + .type bluegl_glSwizzleEXT, %function +bluegl_glSwizzleEXT: + adrp x16, :got:__blue_glCore_glSwizzleEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSwizzleEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4ivARB, .-bluegl_glVertexAttrib4ivARB + .size bluegl_glSwizzleEXT, .-bluegl_glSwizzleEXT .align 2 - .global bluegl_glGetProgramSubroutineParameteruivNV - .type bluegl_glGetProgramSubroutineParameteruivNV, %function -bluegl_glGetProgramSubroutineParameteruivNV: - adrp x16, :got:__blue_glCore_glGetProgramSubroutineParameteruivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramSubroutineParameteruivNV] + .global bluegl_glWriteMaskEXT + .type bluegl_glWriteMaskEXT, %function +bluegl_glWriteMaskEXT: + adrp x16, :got:__blue_glCore_glWriteMaskEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glWriteMaskEXT] ldr x16, [x16] br x16 - .size bluegl_glGetProgramSubroutineParameteruivNV, .-bluegl_glGetProgramSubroutineParameteruivNV + .size bluegl_glWriteMaskEXT, .-bluegl_glWriteMaskEXT .align 2 - .global bluegl_glProgramUniformMatrix2x4dv - .type bluegl_glProgramUniformMatrix2x4dv, %function -bluegl_glProgramUniformMatrix2x4dv: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix2x4dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2x4dv] + .global bluegl_glInsertComponentEXT + .type bluegl_glInsertComponentEXT, %function +bluegl_glInsertComponentEXT: + adrp x16, :got:__blue_glCore_glInsertComponentEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glInsertComponentEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix2x4dv, .-bluegl_glProgramUniformMatrix2x4dv + .size bluegl_glInsertComponentEXT, .-bluegl_glInsertComponentEXT .align 2 - .global bluegl_glBeginPerfQueryINTEL - .type bluegl_glBeginPerfQueryINTEL, %function -bluegl_glBeginPerfQueryINTEL: - adrp x16, :got:__blue_glCore_glBeginPerfQueryINTEL - ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginPerfQueryINTEL] + .global bluegl_glExtractComponentEXT + .type bluegl_glExtractComponentEXT, %function +bluegl_glExtractComponentEXT: + adrp x16, :got:__blue_glCore_glExtractComponentEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glExtractComponentEXT] ldr x16, [x16] br x16 - .size bluegl_glBeginPerfQueryINTEL, .-bluegl_glBeginPerfQueryINTEL + .size bluegl_glExtractComponentEXT, .-bluegl_glExtractComponentEXT .align 2 - .global bluegl_glPathParameteriNV - .type bluegl_glPathParameteriNV, %function -bluegl_glPathParameteriNV: - adrp x16, :got:__blue_glCore_glPathParameteriNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathParameteriNV] + .global bluegl_glGenSymbolsEXT + .type bluegl_glGenSymbolsEXT, %function +bluegl_glGenSymbolsEXT: + adrp x16, :got:__blue_glCore_glGenSymbolsEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenSymbolsEXT] ldr x16, [x16] br x16 - .size bluegl_glPathParameteriNV, .-bluegl_glPathParameteriNV + .size bluegl_glGenSymbolsEXT, .-bluegl_glGenSymbolsEXT .align 2 - .global bluegl_glUniform4i64vNV - .type bluegl_glUniform4i64vNV, %function -bluegl_glUniform4i64vNV: - adrp x16, :got:__blue_glCore_glUniform4i64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4i64vNV] + .global bluegl_glSetInvariantEXT + .type bluegl_glSetInvariantEXT, %function +bluegl_glSetInvariantEXT: + adrp x16, :got:__blue_glCore_glSetInvariantEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSetInvariantEXT] ldr x16, [x16] br x16 - .size bluegl_glUniform4i64vNV, .-bluegl_glUniform4i64vNV + .size bluegl_glSetInvariantEXT, .-bluegl_glSetInvariantEXT .align 2 - .global bluegl_glStateCaptureNV - .type bluegl_glStateCaptureNV, %function -bluegl_glStateCaptureNV: - adrp x16, :got:__blue_glCore_glStateCaptureNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glStateCaptureNV] + .global bluegl_glSetLocalConstantEXT + .type bluegl_glSetLocalConstantEXT, %function +bluegl_glSetLocalConstantEXT: + adrp x16, :got:__blue_glCore_glSetLocalConstantEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glSetLocalConstantEXT] ldr x16, [x16] br x16 - .size bluegl_glStateCaptureNV, .-bluegl_glStateCaptureNV + .size bluegl_glSetLocalConstantEXT, .-bluegl_glSetLocalConstantEXT .align 2 - .global bluegl_glProgramUniform3fvEXT - .type bluegl_glProgramUniform3fvEXT, %function -bluegl_glProgramUniform3fvEXT: - adrp x16, :got:__blue_glCore_glProgramUniform3fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3fvEXT] + .global bluegl_glVariantbvEXT + .type bluegl_glVariantbvEXT, %function +bluegl_glVariantbvEXT: + adrp x16, :got:__blue_glCore_glVariantbvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantbvEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3fvEXT, .-bluegl_glProgramUniform3fvEXT + .size bluegl_glVariantbvEXT, .-bluegl_glVariantbvEXT .align 2 - .global bluegl_glVertexAttribL1d - .type bluegl_glVertexAttribL1d, %function -bluegl_glVertexAttribL1d: - adrp x16, :got:__blue_glCore_glVertexAttribL1d - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1d] + .global bluegl_glVariantsvEXT + .type bluegl_glVariantsvEXT, %function +bluegl_glVariantsvEXT: + adrp x16, :got:__blue_glCore_glVariantsvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantsvEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL1d, .-bluegl_glVertexAttribL1d + .size bluegl_glVariantsvEXT, .-bluegl_glVariantsvEXT .align 2 - .global bluegl_glMatrixLoadIdentityEXT - .type bluegl_glMatrixLoadIdentityEXT, %function -bluegl_glMatrixLoadIdentityEXT: - adrp x16, :got:__blue_glCore_glMatrixLoadIdentityEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixLoadIdentityEXT] + .global bluegl_glVariantivEXT + .type bluegl_glVariantivEXT, %function +bluegl_glVariantivEXT: + adrp x16, :got:__blue_glCore_glVariantivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantivEXT] ldr x16, [x16] br x16 - .size bluegl_glMatrixLoadIdentityEXT, .-bluegl_glMatrixLoadIdentityEXT + .size bluegl_glVariantivEXT, .-bluegl_glVariantivEXT .align 2 - .global bluegl_glBindVertexArrayAPPLE - .type bluegl_glBindVertexArrayAPPLE, %function -bluegl_glBindVertexArrayAPPLE: - adrp x16, :got:__blue_glCore_glBindVertexArrayAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindVertexArrayAPPLE] + .global bluegl_glVariantfvEXT + .type bluegl_glVariantfvEXT, %function +bluegl_glVariantfvEXT: + adrp x16, :got:__blue_glCore_glVariantfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantfvEXT] ldr x16, [x16] br x16 - .size bluegl_glBindVertexArrayAPPLE, .-bluegl_glBindVertexArrayAPPLE + .size bluegl_glVariantfvEXT, .-bluegl_glVariantfvEXT .align 2 - .global bluegl_glRasterPos2xvOES - .type bluegl_glRasterPos2xvOES, %function -bluegl_glRasterPos2xvOES: - adrp x16, :got:__blue_glCore_glRasterPos2xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glRasterPos2xvOES] + .global bluegl_glVariantdvEXT + .type bluegl_glVariantdvEXT, %function +bluegl_glVariantdvEXT: + adrp x16, :got:__blue_glCore_glVariantdvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantdvEXT] ldr x16, [x16] br x16 - .size bluegl_glRasterPos2xvOES, .-bluegl_glRasterPos2xvOES + .size bluegl_glVariantdvEXT, .-bluegl_glVariantdvEXT .align 2 - .global bluegl_glCommandListSegmentsNV - .type bluegl_glCommandListSegmentsNV, %function -bluegl_glCommandListSegmentsNV: - adrp x16, :got:__blue_glCore_glCommandListSegmentsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCommandListSegmentsNV] + .global bluegl_glVariantubvEXT + .type bluegl_glVariantubvEXT, %function +bluegl_glVariantubvEXT: + adrp x16, :got:__blue_glCore_glVariantubvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantubvEXT] ldr x16, [x16] br x16 - .size bluegl_glCommandListSegmentsNV, .-bluegl_glCommandListSegmentsNV + .size bluegl_glVariantubvEXT, .-bluegl_glVariantubvEXT .align 2 - .global bluegl_glWindowPos4svMESA - .type bluegl_glWindowPos4svMESA, %function -bluegl_glWindowPos4svMESA: - adrp x16, :got:__blue_glCore_glWindowPos4svMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos4svMESA] + .global bluegl_glVariantusvEXT + .type bluegl_glVariantusvEXT, %function +bluegl_glVariantusvEXT: + adrp x16, :got:__blue_glCore_glVariantusvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantusvEXT] ldr x16, [x16] br x16 - .size bluegl_glWindowPos4svMESA, .-bluegl_glWindowPos4svMESA + .size bluegl_glVariantusvEXT, .-bluegl_glVariantusvEXT .align 2 - .global bluegl_glProgramLocalParameter4dvARB - .type bluegl_glProgramLocalParameter4dvARB, %function -bluegl_glProgramLocalParameter4dvARB: - adrp x16, :got:__blue_glCore_glProgramLocalParameter4dvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParameter4dvARB] + .global bluegl_glVariantuivEXT + .type bluegl_glVariantuivEXT, %function +bluegl_glVariantuivEXT: + adrp x16, :got:__blue_glCore_glVariantuivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantuivEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramLocalParameter4dvARB, .-bluegl_glProgramLocalParameter4dvARB + .size bluegl_glVariantuivEXT, .-bluegl_glVariantuivEXT .align 2 - .global bluegl_glGetnPolygonStipple - .type bluegl_glGetnPolygonStipple, %function -bluegl_glGetnPolygonStipple: - adrp x16, :got:__blue_glCore_glGetnPolygonStipple - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnPolygonStipple] + .global bluegl_glVariantPointerEXT + .type bluegl_glVariantPointerEXT, %function +bluegl_glVariantPointerEXT: + adrp x16, :got:__blue_glCore_glVariantPointerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantPointerEXT] ldr x16, [x16] br x16 - .size bluegl_glGetnPolygonStipple, .-bluegl_glGetnPolygonStipple + .size bluegl_glVariantPointerEXT, .-bluegl_glVariantPointerEXT .align 2 - .global bluegl_glMultiTexCoord1svARB - .type bluegl_glMultiTexCoord1svARB, %function -bluegl_glMultiTexCoord1svARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord1svARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1svARB] + .global bluegl_glEnableVariantClientStateEXT + .type bluegl_glEnableVariantClientStateEXT, %function +bluegl_glEnableVariantClientStateEXT: + adrp x16, :got:__blue_glCore_glEnableVariantClientStateEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableVariantClientStateEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1svARB, .-bluegl_glMultiTexCoord1svARB + .size bluegl_glEnableVariantClientStateEXT, .-bluegl_glEnableVariantClientStateEXT .align 2 - .global bluegl_glNamedRenderbufferStorage - .type bluegl_glNamedRenderbufferStorage, %function -bluegl_glNamedRenderbufferStorage: - adrp x16, :got:__blue_glCore_glNamedRenderbufferStorage - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedRenderbufferStorage] + .global bluegl_glDisableVariantClientStateEXT + .type bluegl_glDisableVariantClientStateEXT, %function +bluegl_glDisableVariantClientStateEXT: + adrp x16, :got:__blue_glCore_glDisableVariantClientStateEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glDisableVariantClientStateEXT] ldr x16, [x16] br x16 - .size bluegl_glNamedRenderbufferStorage, .-bluegl_glNamedRenderbufferStorage + .size bluegl_glDisableVariantClientStateEXT, .-bluegl_glDisableVariantClientStateEXT .align 2 - .global bluegl_glProgramEnvParameterI4iNV - .type bluegl_glProgramEnvParameterI4iNV, %function -bluegl_glProgramEnvParameterI4iNV: - adrp x16, :got:__blue_glCore_glProgramEnvParameterI4iNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParameterI4iNV] + .global bluegl_glBindLightParameterEXT + .type bluegl_glBindLightParameterEXT, %function +bluegl_glBindLightParameterEXT: + adrp x16, :got:__blue_glCore_glBindLightParameterEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindLightParameterEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramEnvParameterI4iNV, .-bluegl_glProgramEnvParameterI4iNV + .size bluegl_glBindLightParameterEXT, .-bluegl_glBindLightParameterEXT .align 2 - .global bluegl_glVertexAttribIFormat - .type bluegl_glVertexAttribIFormat, %function -bluegl_glVertexAttribIFormat: - adrp x16, :got:__blue_glCore_glVertexAttribIFormat - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribIFormat] + .global bluegl_glBindMaterialParameterEXT + .type bluegl_glBindMaterialParameterEXT, %function +bluegl_glBindMaterialParameterEXT: + adrp x16, :got:__blue_glCore_glBindMaterialParameterEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindMaterialParameterEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribIFormat, .-bluegl_glVertexAttribIFormat + .size bluegl_glBindMaterialParameterEXT, .-bluegl_glBindMaterialParameterEXT .align 2 - .global bluegl_glFogCoordfvEXT - .type bluegl_glFogCoordfvEXT, %function -bluegl_glFogCoordfvEXT: - adrp x16, :got:__blue_glCore_glFogCoordfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordfvEXT] + .global bluegl_glBindTexGenParameterEXT + .type bluegl_glBindTexGenParameterEXT, %function +bluegl_glBindTexGenParameterEXT: + adrp x16, :got:__blue_glCore_glBindTexGenParameterEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindTexGenParameterEXT] ldr x16, [x16] br x16 - .size bluegl_glFogCoordfvEXT, .-bluegl_glFogCoordfvEXT + .size bluegl_glBindTexGenParameterEXT, .-bluegl_glBindTexGenParameterEXT .align 2 - .global bluegl_glEnableVertexAttribArray - .type bluegl_glEnableVertexAttribArray, %function -bluegl_glEnableVertexAttribArray: - adrp x16, :got:__blue_glCore_glEnableVertexAttribArray - ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableVertexAttribArray] + .global bluegl_glBindTextureUnitParameterEXT + .type bluegl_glBindTextureUnitParameterEXT, %function +bluegl_glBindTextureUnitParameterEXT: + adrp x16, :got:__blue_glCore_glBindTextureUnitParameterEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindTextureUnitParameterEXT] ldr x16, [x16] br x16 - .size bluegl_glEnableVertexAttribArray, .-bluegl_glEnableVertexAttribArray + .size bluegl_glBindTextureUnitParameterEXT, .-bluegl_glBindTextureUnitParameterEXT .align 2 - .global bluegl_glPolygonOffsetClampEXT - .type bluegl_glPolygonOffsetClampEXT, %function -bluegl_glPolygonOffsetClampEXT: - adrp x16, :got:__blue_glCore_glPolygonOffsetClampEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glPolygonOffsetClampEXT] + .global bluegl_glBindParameterEXT + .type bluegl_glBindParameterEXT, %function +bluegl_glBindParameterEXT: + adrp x16, :got:__blue_glCore_glBindParameterEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindParameterEXT] ldr x16, [x16] br x16 - .size bluegl_glPolygonOffsetClampEXT, .-bluegl_glPolygonOffsetClampEXT + .size bluegl_glBindParameterEXT, .-bluegl_glBindParameterEXT .align 2 - .global bluegl_glEnable - .type bluegl_glEnable, %function -bluegl_glEnable: - adrp x16, :got:__blue_glCore_glEnable - ldr x16, [x16, #:got_lo12:__blue_glCore_glEnable] + .global bluegl_glIsVariantEnabledEXT + .type bluegl_glIsVariantEnabledEXT, %function +bluegl_glIsVariantEnabledEXT: + adrp x16, :got:__blue_glCore_glIsVariantEnabledEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsVariantEnabledEXT] ldr x16, [x16] br x16 - .size bluegl_glEnable, .-bluegl_glEnable + .size bluegl_glIsVariantEnabledEXT, .-bluegl_glIsVariantEnabledEXT .align 2 - .global bluegl_glIndexFuncEXT - .type bluegl_glIndexFuncEXT, %function -bluegl_glIndexFuncEXT: - adrp x16, :got:__blue_glCore_glIndexFuncEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glIndexFuncEXT] + .global bluegl_glGetVariantBooleanvEXT + .type bluegl_glGetVariantBooleanvEXT, %function +bluegl_glGetVariantBooleanvEXT: + adrp x16, :got:__blue_glCore_glGetVariantBooleanvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVariantBooleanvEXT] ldr x16, [x16] br x16 - .size bluegl_glIndexFuncEXT, .-bluegl_glIndexFuncEXT + .size bluegl_glGetVariantBooleanvEXT, .-bluegl_glGetVariantBooleanvEXT .align 2 - .global bluegl_glDepthRangeArrayv - .type bluegl_glDepthRangeArrayv, %function -bluegl_glDepthRangeArrayv: - adrp x16, :got:__blue_glCore_glDepthRangeArrayv - ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthRangeArrayv] + .global bluegl_glGetVariantIntegervEXT + .type bluegl_glGetVariantIntegervEXT, %function +bluegl_glGetVariantIntegervEXT: + adrp x16, :got:__blue_glCore_glGetVariantIntegervEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVariantIntegervEXT] ldr x16, [x16] br x16 - .size bluegl_glDepthRangeArrayv, .-bluegl_glDepthRangeArrayv + .size bluegl_glGetVariantIntegervEXT, .-bluegl_glGetVariantIntegervEXT .align 2 - .global bluegl_glRasterPos4xvOES - .type bluegl_glRasterPos4xvOES, %function -bluegl_glRasterPos4xvOES: - adrp x16, :got:__blue_glCore_glRasterPos4xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glRasterPos4xvOES] + .global bluegl_glGetVariantFloatvEXT + .type bluegl_glGetVariantFloatvEXT, %function +bluegl_glGetVariantFloatvEXT: + adrp x16, :got:__blue_glCore_glGetVariantFloatvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVariantFloatvEXT] ldr x16, [x16] br x16 - .size bluegl_glRasterPos4xvOES, .-bluegl_glRasterPos4xvOES + .size bluegl_glGetVariantFloatvEXT, .-bluegl_glGetVariantFloatvEXT .align 2 - .global bluegl_glSpriteParameterfvSGIX - .type bluegl_glSpriteParameterfvSGIX, %function -bluegl_glSpriteParameterfvSGIX: - adrp x16, :got:__blue_glCore_glSpriteParameterfvSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glSpriteParameterfvSGIX] + .global bluegl_glGetVariantPointervEXT + .type bluegl_glGetVariantPointervEXT, %function +bluegl_glGetVariantPointervEXT: + adrp x16, :got:__blue_glCore_glGetVariantPointervEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVariantPointervEXT] ldr x16, [x16] br x16 - .size bluegl_glSpriteParameterfvSGIX, .-bluegl_glSpriteParameterfvSGIX + .size bluegl_glGetVariantPointervEXT, .-bluegl_glGetVariantPointervEXT .align 2 - .global bluegl_glGetnUniformdv - .type bluegl_glGetnUniformdv, %function -bluegl_glGetnUniformdv: - adrp x16, :got:__blue_glCore_glGetnUniformdv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnUniformdv] + .global bluegl_glGetInvariantBooleanvEXT + .type bluegl_glGetInvariantBooleanvEXT, %function +bluegl_glGetInvariantBooleanvEXT: + adrp x16, :got:__blue_glCore_glGetInvariantBooleanvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInvariantBooleanvEXT] ldr x16, [x16] br x16 - .size bluegl_glGetnUniformdv, .-bluegl_glGetnUniformdv + .size bluegl_glGetInvariantBooleanvEXT, .-bluegl_glGetInvariantBooleanvEXT .align 2 - .global bluegl_glGetHistogram - .type bluegl_glGetHistogram, %function -bluegl_glGetHistogram: - adrp x16, :got:__blue_glCore_glGetHistogram - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetHistogram] + .global bluegl_glGetInvariantIntegervEXT + .type bluegl_glGetInvariantIntegervEXT, %function +bluegl_glGetInvariantIntegervEXT: + adrp x16, :got:__blue_glCore_glGetInvariantIntegervEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInvariantIntegervEXT] ldr x16, [x16] br x16 - .size bluegl_glGetHistogram, .-bluegl_glGetHistogram + .size bluegl_glGetInvariantIntegervEXT, .-bluegl_glGetInvariantIntegervEXT .align 2 - .global bluegl_glClearColorIiEXT - .type bluegl_glClearColorIiEXT, %function -bluegl_glClearColorIiEXT: - adrp x16, :got:__blue_glCore_glClearColorIiEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearColorIiEXT] + .global bluegl_glGetInvariantFloatvEXT + .type bluegl_glGetInvariantFloatvEXT, %function +bluegl_glGetInvariantFloatvEXT: + adrp x16, :got:__blue_glCore_glGetInvariantFloatvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInvariantFloatvEXT] ldr x16, [x16] br x16 - .size bluegl_glClearColorIiEXT, .-bluegl_glClearColorIiEXT + .size bluegl_glGetInvariantFloatvEXT, .-bluegl_glGetInvariantFloatvEXT .align 2 - .global bluegl_glTbufferMask3DFX - .type bluegl_glTbufferMask3DFX, %function -bluegl_glTbufferMask3DFX: - adrp x16, :got:__blue_glCore_glTbufferMask3DFX - ldr x16, [x16, #:got_lo12:__blue_glCore_glTbufferMask3DFX] + .global bluegl_glGetLocalConstantBooleanvEXT + .type bluegl_glGetLocalConstantBooleanvEXT, %function +bluegl_glGetLocalConstantBooleanvEXT: + adrp x16, :got:__blue_glCore_glGetLocalConstantBooleanvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetLocalConstantBooleanvEXT] ldr x16, [x16] br x16 - .size bluegl_glTbufferMask3DFX, .-bluegl_glTbufferMask3DFX + .size bluegl_glGetLocalConstantBooleanvEXT, .-bluegl_glGetLocalConstantBooleanvEXT .align 2 - .global bluegl_glProgramUniform1f - .type bluegl_glProgramUniform1f, %function -bluegl_glProgramUniform1f: - adrp x16, :got:__blue_glCore_glProgramUniform1f - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1f] + .global bluegl_glGetLocalConstantIntegervEXT + .type bluegl_glGetLocalConstantIntegervEXT, %function +bluegl_glGetLocalConstantIntegervEXT: + adrp x16, :got:__blue_glCore_glGetLocalConstantIntegervEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetLocalConstantIntegervEXT] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1f, .-bluegl_glProgramUniform1f + .size bluegl_glGetLocalConstantIntegervEXT, .-bluegl_glGetLocalConstantIntegervEXT .align 2 - .global bluegl_glVertexAttrib4Niv - .type bluegl_glVertexAttrib4Niv, %function -bluegl_glVertexAttrib4Niv: - adrp x16, :got:__blue_glCore_glVertexAttrib4Niv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4Niv] + .global bluegl_glGetLocalConstantFloatvEXT + .type bluegl_glGetLocalConstantFloatvEXT, %function +bluegl_glGetLocalConstantFloatvEXT: + adrp x16, :got:__blue_glCore_glGetLocalConstantFloatvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetLocalConstantFloatvEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4Niv, .-bluegl_glVertexAttrib4Niv + .size bluegl_glGetLocalConstantFloatvEXT, .-bluegl_glGetLocalConstantFloatvEXT .align 2 - .global bluegl_glGetUniformLocationARB - .type bluegl_glGetUniformLocationARB, %function -bluegl_glGetUniformLocationARB: - adrp x16, :got:__blue_glCore_glGetUniformLocationARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformLocationARB] + .global bluegl_glVertexWeightfEXT + .type bluegl_glVertexWeightfEXT, %function +bluegl_glVertexWeightfEXT: + adrp x16, :got:__blue_glCore_glVertexWeightfEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexWeightfEXT] ldr x16, [x16] br x16 - .size bluegl_glGetUniformLocationARB, .-bluegl_glGetUniformLocationARB + .size bluegl_glVertexWeightfEXT, .-bluegl_glVertexWeightfEXT .align 2 - .global bluegl_glColor4hvNV - .type bluegl_glColor4hvNV, %function -bluegl_glColor4hvNV: - adrp x16, :got:__blue_glCore_glColor4hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4hvNV] + .global bluegl_glVertexWeightfvEXT + .type bluegl_glVertexWeightfvEXT, %function +bluegl_glVertexWeightfvEXT: + adrp x16, :got:__blue_glCore_glVertexWeightfvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexWeightfvEXT] ldr x16, [x16] br x16 - .size bluegl_glColor4hvNV, .-bluegl_glColor4hvNV + .size bluegl_glVertexWeightfvEXT, .-bluegl_glVertexWeightfvEXT .align 2 - .global bluegl_glTextureBufferRangeEXT - .type bluegl_glTextureBufferRangeEXT, %function -bluegl_glTextureBufferRangeEXT: - adrp x16, :got:__blue_glCore_glTextureBufferRangeEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureBufferRangeEXT] + .global bluegl_glVertexWeightPointerEXT + .type bluegl_glVertexWeightPointerEXT, %function +bluegl_glVertexWeightPointerEXT: + adrp x16, :got:__blue_glCore_glVertexWeightPointerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexWeightPointerEXT] ldr x16, [x16] br x16 - .size bluegl_glTextureBufferRangeEXT, .-bluegl_glTextureBufferRangeEXT + .size bluegl_glVertexWeightPointerEXT, .-bluegl_glVertexWeightPointerEXT .align 2 - .global bluegl_glGlobalAlphaFactorsSUN - .type bluegl_glGlobalAlphaFactorsSUN, %function -bluegl_glGlobalAlphaFactorsSUN: - adrp x16, :got:__blue_glCore_glGlobalAlphaFactorsSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glGlobalAlphaFactorsSUN] + .global bluegl_glImportSyncEXT + .type bluegl_glImportSyncEXT, %function +bluegl_glImportSyncEXT: + adrp x16, :got:__blue_glCore_glImportSyncEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glImportSyncEXT] ldr x16, [x16] br x16 - .size bluegl_glGlobalAlphaFactorsSUN, .-bluegl_glGlobalAlphaFactorsSUN + .size bluegl_glImportSyncEXT, .-bluegl_glImportSyncEXT .align 2 - .global bluegl_glCopyTextureSubImage2D - .type bluegl_glCopyTextureSubImage2D, %function -bluegl_glCopyTextureSubImage2D: - adrp x16, :got:__blue_glCore_glCopyTextureSubImage2D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTextureSubImage2D] + .global bluegl_glFrameTerminatorGREMEDY + .type bluegl_glFrameTerminatorGREMEDY, %function +bluegl_glFrameTerminatorGREMEDY: + adrp x16, :got:__blue_glCore_glFrameTerminatorGREMEDY + ldr x16, [x16, #:got_lo12:__blue_glCore_glFrameTerminatorGREMEDY] ldr x16, [x16] br x16 - .size bluegl_glCopyTextureSubImage2D, .-bluegl_glCopyTextureSubImage2D + .size bluegl_glFrameTerminatorGREMEDY, .-bluegl_glFrameTerminatorGREMEDY .align 2 - .global bluegl_glUniform1i64vARB - .type bluegl_glUniform1i64vARB, %function -bluegl_glUniform1i64vARB: - adrp x16, :got:__blue_glCore_glUniform1i64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1i64vARB] + .global bluegl_glStringMarkerGREMEDY + .type bluegl_glStringMarkerGREMEDY, %function +bluegl_glStringMarkerGREMEDY: + adrp x16, :got:__blue_glCore_glStringMarkerGREMEDY + ldr x16, [x16, #:got_lo12:__blue_glCore_glStringMarkerGREMEDY] ldr x16, [x16] br x16 - .size bluegl_glUniform1i64vARB, .-bluegl_glUniform1i64vARB + .size bluegl_glStringMarkerGREMEDY, .-bluegl_glStringMarkerGREMEDY .align 2 - .global bluegl_glVertexAttrib2dNV - .type bluegl_glVertexAttrib2dNV, %function -bluegl_glVertexAttrib2dNV: - adrp x16, :got:__blue_glCore_glVertexAttrib2dNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2dNV] + .global bluegl_glImageTransformParameteriHP + .type bluegl_glImageTransformParameteriHP, %function +bluegl_glImageTransformParameteriHP: + adrp x16, :got:__blue_glCore_glImageTransformParameteriHP + ldr x16, [x16, #:got_lo12:__blue_glCore_glImageTransformParameteriHP] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2dNV, .-bluegl_glVertexAttrib2dNV + .size bluegl_glImageTransformParameteriHP, .-bluegl_glImageTransformParameteriHP .align 2 - .global bluegl_glVertexAttrib4NbvARB - .type bluegl_glVertexAttrib4NbvARB, %function -bluegl_glVertexAttrib4NbvARB: - adrp x16, :got:__blue_glCore_glVertexAttrib4NbvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4NbvARB] + .global bluegl_glImageTransformParameterfHP + .type bluegl_glImageTransformParameterfHP, %function +bluegl_glImageTransformParameterfHP: + adrp x16, :got:__blue_glCore_glImageTransformParameterfHP + ldr x16, [x16, #:got_lo12:__blue_glCore_glImageTransformParameterfHP] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4NbvARB, .-bluegl_glVertexAttrib4NbvARB + .size bluegl_glImageTransformParameterfHP, .-bluegl_glImageTransformParameterfHP .align 2 - .global bluegl_glPatchParameteri - .type bluegl_glPatchParameteri, %function -bluegl_glPatchParameteri: - adrp x16, :got:__blue_glCore_glPatchParameteri - ldr x16, [x16, #:got_lo12:__blue_glCore_glPatchParameteri] + .global bluegl_glImageTransformParameterivHP + .type bluegl_glImageTransformParameterivHP, %function +bluegl_glImageTransformParameterivHP: + adrp x16, :got:__blue_glCore_glImageTransformParameterivHP + ldr x16, [x16, #:got_lo12:__blue_glCore_glImageTransformParameterivHP] ldr x16, [x16] br x16 - .size bluegl_glPatchParameteri, .-bluegl_glPatchParameteri + .size bluegl_glImageTransformParameterivHP, .-bluegl_glImageTransformParameterivHP .align 2 - .global bluegl_glGetNamedStringARB - .type bluegl_glGetNamedStringARB, %function -bluegl_glGetNamedStringARB: - adrp x16, :got:__blue_glCore_glGetNamedStringARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedStringARB] + .global bluegl_glImageTransformParameterfvHP + .type bluegl_glImageTransformParameterfvHP, %function +bluegl_glImageTransformParameterfvHP: + adrp x16, :got:__blue_glCore_glImageTransformParameterfvHP + ldr x16, [x16, #:got_lo12:__blue_glCore_glImageTransformParameterfvHP] ldr x16, [x16] br x16 - .size bluegl_glGetNamedStringARB, .-bluegl_glGetNamedStringARB + .size bluegl_glImageTransformParameterfvHP, .-bluegl_glImageTransformParameterfvHP .align 2 - .global bluegl_glGetCombinerStageParameterfvNV - .type bluegl_glGetCombinerStageParameterfvNV, %function -bluegl_glGetCombinerStageParameterfvNV: - adrp x16, :got:__blue_glCore_glGetCombinerStageParameterfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCombinerStageParameterfvNV] + .global bluegl_glGetImageTransformParameterivHP + .type bluegl_glGetImageTransformParameterivHP, %function +bluegl_glGetImageTransformParameterivHP: + adrp x16, :got:__blue_glCore_glGetImageTransformParameterivHP + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetImageTransformParameterivHP] ldr x16, [x16] br x16 - .size bluegl_glGetCombinerStageParameterfvNV, .-bluegl_glGetCombinerStageParameterfvNV + .size bluegl_glGetImageTransformParameterivHP, .-bluegl_glGetImageTransformParameterivHP .align 2 - .global bluegl_glVertexAttrib2svARB - .type bluegl_glVertexAttrib2svARB, %function -bluegl_glVertexAttrib2svARB: - adrp x16, :got:__blue_glCore_glVertexAttrib2svARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2svARB] + .global bluegl_glGetImageTransformParameterfvHP + .type bluegl_glGetImageTransformParameterfvHP, %function +bluegl_glGetImageTransformParameterfvHP: + adrp x16, :got:__blue_glCore_glGetImageTransformParameterfvHP + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetImageTransformParameterfvHP] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2svARB, .-bluegl_glVertexAttrib2svARB + .size bluegl_glGetImageTransformParameterfvHP, .-bluegl_glGetImageTransformParameterfvHP .align 2 - .global bluegl_glApplyFramebufferAttachmentCMAAINTEL - .type bluegl_glApplyFramebufferAttachmentCMAAINTEL, %function -bluegl_glApplyFramebufferAttachmentCMAAINTEL: - adrp x16, :got:__blue_glCore_glApplyFramebufferAttachmentCMAAINTEL - ldr x16, [x16, #:got_lo12:__blue_glCore_glApplyFramebufferAttachmentCMAAINTEL] + .global bluegl_glMultiModeDrawArraysIBM + .type bluegl_glMultiModeDrawArraysIBM, %function +bluegl_glMultiModeDrawArraysIBM: + adrp x16, :got:__blue_glCore_glMultiModeDrawArraysIBM + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiModeDrawArraysIBM] ldr x16, [x16] br x16 - .size bluegl_glApplyFramebufferAttachmentCMAAINTEL, .-bluegl_glApplyFramebufferAttachmentCMAAINTEL + .size bluegl_glMultiModeDrawArraysIBM, .-bluegl_glMultiModeDrawArraysIBM .align 2 - .global bluegl_glGetVideouivNV - .type bluegl_glGetVideouivNV, %function -bluegl_glGetVideouivNV: - adrp x16, :got:__blue_glCore_glGetVideouivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVideouivNV] + .global bluegl_glMultiModeDrawElementsIBM + .type bluegl_glMultiModeDrawElementsIBM, %function +bluegl_glMultiModeDrawElementsIBM: + adrp x16, :got:__blue_glCore_glMultiModeDrawElementsIBM + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiModeDrawElementsIBM] + ldr x16, [x16] + br x16 + .size bluegl_glMultiModeDrawElementsIBM, .-bluegl_glMultiModeDrawElementsIBM + + .align 2 + .global bluegl_glFlushStaticDataIBM + .type bluegl_glFlushStaticDataIBM, %function +bluegl_glFlushStaticDataIBM: + adrp x16, :got:__blue_glCore_glFlushStaticDataIBM + ldr x16, [x16, #:got_lo12:__blue_glCore_glFlushStaticDataIBM] ldr x16, [x16] br x16 - .size bluegl_glGetVideouivNV, .-bluegl_glGetVideouivNV + .size bluegl_glFlushStaticDataIBM, .-bluegl_glFlushStaticDataIBM .align 2 - .global bluegl_glMultiTexCoord3s - .type bluegl_glMultiTexCoord3s, %function -bluegl_glMultiTexCoord3s: - adrp x16, :got:__blue_glCore_glMultiTexCoord3s - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3s] + .global bluegl_glColorPointerListIBM + .type bluegl_glColorPointerListIBM, %function +bluegl_glColorPointerListIBM: + adrp x16, :got:__blue_glCore_glColorPointerListIBM + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorPointerListIBM] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3s, .-bluegl_glMultiTexCoord3s + .size bluegl_glColorPointerListIBM, .-bluegl_glColorPointerListIBM .align 2 - .global bluegl_glMultiTexCoord1sARB - .type bluegl_glMultiTexCoord1sARB, %function -bluegl_glMultiTexCoord1sARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord1sARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1sARB] + .global bluegl_glSecondaryColorPointerListIBM + .type bluegl_glSecondaryColorPointerListIBM, %function +bluegl_glSecondaryColorPointerListIBM: + adrp x16, :got:__blue_glCore_glSecondaryColorPointerListIBM + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColorPointerListIBM] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1sARB, .-bluegl_glMultiTexCoord1sARB + .size bluegl_glSecondaryColorPointerListIBM, .-bluegl_glSecondaryColorPointerListIBM .align 2 - .global bluegl_glLogicOp - .type bluegl_glLogicOp, %function -bluegl_glLogicOp: - adrp x16, :got:__blue_glCore_glLogicOp - ldr x16, [x16, #:got_lo12:__blue_glCore_glLogicOp] + .global bluegl_glEdgeFlagPointerListIBM + .type bluegl_glEdgeFlagPointerListIBM, %function +bluegl_glEdgeFlagPointerListIBM: + adrp x16, :got:__blue_glCore_glEdgeFlagPointerListIBM + ldr x16, [x16, #:got_lo12:__blue_glCore_glEdgeFlagPointerListIBM] ldr x16, [x16] br x16 - .size bluegl_glLogicOp, .-bluegl_glLogicOp + .size bluegl_glEdgeFlagPointerListIBM, .-bluegl_glEdgeFlagPointerListIBM .align 2 - .global bluegl_glFogFuncSGIS - .type bluegl_glFogFuncSGIS, %function -bluegl_glFogFuncSGIS: - adrp x16, :got:__blue_glCore_glFogFuncSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glFogFuncSGIS] + .global bluegl_glFogCoordPointerListIBM + .type bluegl_glFogCoordPointerListIBM, %function +bluegl_glFogCoordPointerListIBM: + adrp x16, :got:__blue_glCore_glFogCoordPointerListIBM + ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordPointerListIBM] ldr x16, [x16] br x16 - .size bluegl_glFogFuncSGIS, .-bluegl_glFogFuncSGIS + .size bluegl_glFogCoordPointerListIBM, .-bluegl_glFogCoordPointerListIBM .align 2 - .global bluegl_glMatrixMultfEXT - .type bluegl_glMatrixMultfEXT, %function -bluegl_glMatrixMultfEXT: - adrp x16, :got:__blue_glCore_glMatrixMultfEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixMultfEXT] + .global bluegl_glIndexPointerListIBM + .type bluegl_glIndexPointerListIBM, %function +bluegl_glIndexPointerListIBM: + adrp x16, :got:__blue_glCore_glIndexPointerListIBM + ldr x16, [x16, #:got_lo12:__blue_glCore_glIndexPointerListIBM] ldr x16, [x16] br x16 - .size bluegl_glMatrixMultfEXT, .-bluegl_glMatrixMultfEXT + .size bluegl_glIndexPointerListIBM, .-bluegl_glIndexPointerListIBM .align 2 - .global bluegl_glGetTexParameterfv - .type bluegl_glGetTexParameterfv, %function -bluegl_glGetTexParameterfv: - adrp x16, :got:__blue_glCore_glGetTexParameterfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexParameterfv] + .global bluegl_glNormalPointerListIBM + .type bluegl_glNormalPointerListIBM, %function +bluegl_glNormalPointerListIBM: + adrp x16, :got:__blue_glCore_glNormalPointerListIBM + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalPointerListIBM] ldr x16, [x16] br x16 - .size bluegl_glGetTexParameterfv, .-bluegl_glGetTexParameterfv + .size bluegl_glNormalPointerListIBM, .-bluegl_glNormalPointerListIBM .align 2 - .global bluegl_glSecondaryColorP3uiv - .type bluegl_glSecondaryColorP3uiv, %function -bluegl_glSecondaryColorP3uiv: - adrp x16, :got:__blue_glCore_glSecondaryColorP3uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColorP3uiv] + .global bluegl_glTexCoordPointerListIBM + .type bluegl_glTexCoordPointerListIBM, %function +bluegl_glTexCoordPointerListIBM: + adrp x16, :got:__blue_glCore_glTexCoordPointerListIBM + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordPointerListIBM] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColorP3uiv, .-bluegl_glSecondaryColorP3uiv + .size bluegl_glTexCoordPointerListIBM, .-bluegl_glTexCoordPointerListIBM .align 2 - .global bluegl_glMultiTexParameteriEXT - .type bluegl_glMultiTexParameteriEXT, %function -bluegl_glMultiTexParameteriEXT: - adrp x16, :got:__blue_glCore_glMultiTexParameteriEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexParameteriEXT] + .global bluegl_glVertexPointerListIBM + .type bluegl_glVertexPointerListIBM, %function +bluegl_glVertexPointerListIBM: + adrp x16, :got:__blue_glCore_glVertexPointerListIBM + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexPointerListIBM] ldr x16, [x16] br x16 - .size bluegl_glMultiTexParameteriEXT, .-bluegl_glMultiTexParameteriEXT + .size bluegl_glVertexPointerListIBM, .-bluegl_glVertexPointerListIBM .align 2 - .global bluegl_glEnableClientStateIndexedEXT - .type bluegl_glEnableClientStateIndexedEXT, %function -bluegl_glEnableClientStateIndexedEXT: - adrp x16, :got:__blue_glCore_glEnableClientStateIndexedEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableClientStateIndexedEXT] + .global bluegl_glBlendFuncSeparateINGR + .type bluegl_glBlendFuncSeparateINGR, %function +bluegl_glBlendFuncSeparateINGR: + adrp x16, :got:__blue_glCore_glBlendFuncSeparateINGR + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFuncSeparateINGR] ldr x16, [x16] br x16 - .size bluegl_glEnableClientStateIndexedEXT, .-bluegl_glEnableClientStateIndexedEXT + .size bluegl_glBlendFuncSeparateINGR, .-bluegl_glBlendFuncSeparateINGR .align 2 - .global bluegl_glGenPathsNV - .type bluegl_glGenPathsNV, %function -bluegl_glGenPathsNV: - adrp x16, :got:__blue_glCore_glGenPathsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenPathsNV] + .global bluegl_glApplyFramebufferAttachmentCMAAINTEL + .type bluegl_glApplyFramebufferAttachmentCMAAINTEL, %function +bluegl_glApplyFramebufferAttachmentCMAAINTEL: + adrp x16, :got:__blue_glCore_glApplyFramebufferAttachmentCMAAINTEL + ldr x16, [x16, #:got_lo12:__blue_glCore_glApplyFramebufferAttachmentCMAAINTEL] ldr x16, [x16] br x16 - .size bluegl_glGenPathsNV, .-bluegl_glGenPathsNV + .size bluegl_glApplyFramebufferAttachmentCMAAINTEL, .-bluegl_glApplyFramebufferAttachmentCMAAINTEL .align 2 - .global bluegl_glGetBufferSubData - .type bluegl_glGetBufferSubData, %function -bluegl_glGetBufferSubData: - adrp x16, :got:__blue_glCore_glGetBufferSubData - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBufferSubData] + .global bluegl_glSyncTextureINTEL + .type bluegl_glSyncTextureINTEL, %function +bluegl_glSyncTextureINTEL: + adrp x16, :got:__blue_glCore_glSyncTextureINTEL + ldr x16, [x16, #:got_lo12:__blue_glCore_glSyncTextureINTEL] ldr x16, [x16] br x16 - .size bluegl_glGetBufferSubData, .-bluegl_glGetBufferSubData + .size bluegl_glSyncTextureINTEL, .-bluegl_glSyncTextureINTEL .align 2 - .global bluegl_glGetDoublei_v - .type bluegl_glGetDoublei_v, %function -bluegl_glGetDoublei_v: - adrp x16, :got:__blue_glCore_glGetDoublei_v - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetDoublei_v] + .global bluegl_glUnmapTexture2DINTEL + .type bluegl_glUnmapTexture2DINTEL, %function +bluegl_glUnmapTexture2DINTEL: + adrp x16, :got:__blue_glCore_glUnmapTexture2DINTEL + ldr x16, [x16, #:got_lo12:__blue_glCore_glUnmapTexture2DINTEL] ldr x16, [x16] br x16 - .size bluegl_glGetDoublei_v, .-bluegl_glGetDoublei_v + .size bluegl_glUnmapTexture2DINTEL, .-bluegl_glUnmapTexture2DINTEL .align 2 - .global bluegl_glCoverStrokePathNV - .type bluegl_glCoverStrokePathNV, %function -bluegl_glCoverStrokePathNV: - adrp x16, :got:__blue_glCore_glCoverStrokePathNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCoverStrokePathNV] + .global bluegl_glMapTexture2DINTEL + .type bluegl_glMapTexture2DINTEL, %function +bluegl_glMapTexture2DINTEL: + adrp x16, :got:__blue_glCore_glMapTexture2DINTEL + ldr x16, [x16, #:got_lo12:__blue_glCore_glMapTexture2DINTEL] ldr x16, [x16] br x16 - .size bluegl_glCoverStrokePathNV, .-bluegl_glCoverStrokePathNV + .size bluegl_glMapTexture2DINTEL, .-bluegl_glMapTexture2DINTEL .align 2 - .global bluegl_glFrontFace - .type bluegl_glFrontFace, %function -bluegl_glFrontFace: - adrp x16, :got:__blue_glCore_glFrontFace - ldr x16, [x16, #:got_lo12:__blue_glCore_glFrontFace] + .global bluegl_glVertexPointervINTEL + .type bluegl_glVertexPointervINTEL, %function +bluegl_glVertexPointervINTEL: + adrp x16, :got:__blue_glCore_glVertexPointervINTEL + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexPointervINTEL] ldr x16, [x16] br x16 - .size bluegl_glFrontFace, .-bluegl_glFrontFace + .size bluegl_glVertexPointervINTEL, .-bluegl_glVertexPointervINTEL .align 2 - .global bluegl_glScissorIndexedv - .type bluegl_glScissorIndexedv, %function -bluegl_glScissorIndexedv: - adrp x16, :got:__blue_glCore_glScissorIndexedv - ldr x16, [x16, #:got_lo12:__blue_glCore_glScissorIndexedv] + .global bluegl_glNormalPointervINTEL + .type bluegl_glNormalPointervINTEL, %function +bluegl_glNormalPointervINTEL: + adrp x16, :got:__blue_glCore_glNormalPointervINTEL + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalPointervINTEL] ldr x16, [x16] br x16 - .size bluegl_glScissorIndexedv, .-bluegl_glScissorIndexedv + .size bluegl_glNormalPointervINTEL, .-bluegl_glNormalPointervINTEL .align 2 - .global bluegl_glTextureStorage3D - .type bluegl_glTextureStorage3D, %function -bluegl_glTextureStorage3D: - adrp x16, :got:__blue_glCore_glTextureStorage3D - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage3D] + .global bluegl_glColorPointervINTEL + .type bluegl_glColorPointervINTEL, %function +bluegl_glColorPointervINTEL: + adrp x16, :got:__blue_glCore_glColorPointervINTEL + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorPointervINTEL] ldr x16, [x16] br x16 - .size bluegl_glTextureStorage3D, .-bluegl_glTextureStorage3D + .size bluegl_glColorPointervINTEL, .-bluegl_glColorPointervINTEL .align 2 - .global bluegl_glPathFogGenNV - .type bluegl_glPathFogGenNV, %function -bluegl_glPathFogGenNV: - adrp x16, :got:__blue_glCore_glPathFogGenNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathFogGenNV] + .global bluegl_glTexCoordPointervINTEL + .type bluegl_glTexCoordPointervINTEL, %function +bluegl_glTexCoordPointervINTEL: + adrp x16, :got:__blue_glCore_glTexCoordPointervINTEL + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordPointervINTEL] ldr x16, [x16] br x16 - .size bluegl_glPathFogGenNV, .-bluegl_glPathFogGenNV + .size bluegl_glTexCoordPointervINTEL, .-bluegl_glTexCoordPointervINTEL .align 2 - .global bluegl_glPixelTexGenParameterivSGIS - .type bluegl_glPixelTexGenParameterivSGIS, %function -bluegl_glPixelTexGenParameterivSGIS: - adrp x16, :got:__blue_glCore_glPixelTexGenParameterivSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTexGenParameterivSGIS] + .global bluegl_glBeginPerfQueryINTEL + .type bluegl_glBeginPerfQueryINTEL, %function +bluegl_glBeginPerfQueryINTEL: + adrp x16, :got:__blue_glCore_glBeginPerfQueryINTEL + ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginPerfQueryINTEL] ldr x16, [x16] br x16 - .size bluegl_glPixelTexGenParameterivSGIS, .-bluegl_glPixelTexGenParameterivSGIS + .size bluegl_glBeginPerfQueryINTEL, .-bluegl_glBeginPerfQueryINTEL .align 2 - .global bluegl_glBlendEquationi - .type bluegl_glBlendEquationi, %function -bluegl_glBlendEquationi: - adrp x16, :got:__blue_glCore_glBlendEquationi - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquationi] + .global bluegl_glCreatePerfQueryINTEL + .type bluegl_glCreatePerfQueryINTEL, %function +bluegl_glCreatePerfQueryINTEL: + adrp x16, :got:__blue_glCore_glCreatePerfQueryINTEL + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreatePerfQueryINTEL] ldr x16, [x16] br x16 - .size bluegl_glBlendEquationi, .-bluegl_glBlendEquationi + .size bluegl_glCreatePerfQueryINTEL, .-bluegl_glCreatePerfQueryINTEL .align 2 - .global bluegl_glGetHistogramParameterivEXT - .type bluegl_glGetHistogramParameterivEXT, %function -bluegl_glGetHistogramParameterivEXT: - adrp x16, :got:__blue_glCore_glGetHistogramParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetHistogramParameterivEXT] + .global bluegl_glDeletePerfQueryINTEL + .type bluegl_glDeletePerfQueryINTEL, %function +bluegl_glDeletePerfQueryINTEL: + adrp x16, :got:__blue_glCore_glDeletePerfQueryINTEL + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeletePerfQueryINTEL] ldr x16, [x16] br x16 - .size bluegl_glGetHistogramParameterivEXT, .-bluegl_glGetHistogramParameterivEXT + .size bluegl_glDeletePerfQueryINTEL, .-bluegl_glDeletePerfQueryINTEL .align 2 - .global bluegl_glClearNamedFramebufferfi - .type bluegl_glClearNamedFramebufferfi, %function -bluegl_glClearNamedFramebufferfi: - adrp x16, :got:__blue_glCore_glClearNamedFramebufferfi - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearNamedFramebufferfi] + .global bluegl_glEndPerfQueryINTEL + .type bluegl_glEndPerfQueryINTEL, %function +bluegl_glEndPerfQueryINTEL: + adrp x16, :got:__blue_glCore_glEndPerfQueryINTEL + ldr x16, [x16, #:got_lo12:__blue_glCore_glEndPerfQueryINTEL] ldr x16, [x16] br x16 - .size bluegl_glClearNamedFramebufferfi, .-bluegl_glClearNamedFramebufferfi + .size bluegl_glEndPerfQueryINTEL, .-bluegl_glEndPerfQueryINTEL .align 2 - .global bluegl_glCopyColorTableSGI - .type bluegl_glCopyColorTableSGI, %function -bluegl_glCopyColorTableSGI: - adrp x16, :got:__blue_glCore_glCopyColorTableSGI - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyColorTableSGI] + .global bluegl_glGetFirstPerfQueryIdINTEL + .type bluegl_glGetFirstPerfQueryIdINTEL, %function +bluegl_glGetFirstPerfQueryIdINTEL: + adrp x16, :got:__blue_glCore_glGetFirstPerfQueryIdINTEL + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFirstPerfQueryIdINTEL] ldr x16, [x16] br x16 - .size bluegl_glCopyColorTableSGI, .-bluegl_glCopyColorTableSGI + .size bluegl_glGetFirstPerfQueryIdINTEL, .-bluegl_glGetFirstPerfQueryIdINTEL .align 2 - .global bluegl_glBinormal3dEXT - .type bluegl_glBinormal3dEXT, %function -bluegl_glBinormal3dEXT: - adrp x16, :got:__blue_glCore_glBinormal3dEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBinormal3dEXT] + .global bluegl_glGetNextPerfQueryIdINTEL + .type bluegl_glGetNextPerfQueryIdINTEL, %function +bluegl_glGetNextPerfQueryIdINTEL: + adrp x16, :got:__blue_glCore_glGetNextPerfQueryIdINTEL + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNextPerfQueryIdINTEL] ldr x16, [x16] br x16 - .size bluegl_glBinormal3dEXT, .-bluegl_glBinormal3dEXT + .size bluegl_glGetNextPerfQueryIdINTEL, .-bluegl_glGetNextPerfQueryIdINTEL .align 2 - .global bluegl_glGetBufferParameterui64vNV - .type bluegl_glGetBufferParameterui64vNV, %function -bluegl_glGetBufferParameterui64vNV: - adrp x16, :got:__blue_glCore_glGetBufferParameterui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBufferParameterui64vNV] + .global bluegl_glGetPerfCounterInfoINTEL + .type bluegl_glGetPerfCounterInfoINTEL, %function +bluegl_glGetPerfCounterInfoINTEL: + adrp x16, :got:__blue_glCore_glGetPerfCounterInfoINTEL + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfCounterInfoINTEL] ldr x16, [x16] br x16 - .size bluegl_glGetBufferParameterui64vNV, .-bluegl_glGetBufferParameterui64vNV + .size bluegl_glGetPerfCounterInfoINTEL, .-bluegl_glGetPerfCounterInfoINTEL .align 2 - .global bluegl_glTextureImage2DEXT - .type bluegl_glTextureImage2DEXT, %function -bluegl_glTextureImage2DEXT: - adrp x16, :got:__blue_glCore_glTextureImage2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureImage2DEXT] + .global bluegl_glGetPerfQueryDataINTEL + .type bluegl_glGetPerfQueryDataINTEL, %function +bluegl_glGetPerfQueryDataINTEL: + adrp x16, :got:__blue_glCore_glGetPerfQueryDataINTEL + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfQueryDataINTEL] ldr x16, [x16] br x16 - .size bluegl_glTextureImage2DEXT, .-bluegl_glTextureImage2DEXT + .size bluegl_glGetPerfQueryDataINTEL, .-bluegl_glGetPerfQueryDataINTEL .align 2 - .global bluegl_glTransformFeedbackVaryings - .type bluegl_glTransformFeedbackVaryings, %function -bluegl_glTransformFeedbackVaryings: - adrp x16, :got:__blue_glCore_glTransformFeedbackVaryings - ldr x16, [x16, #:got_lo12:__blue_glCore_glTransformFeedbackVaryings] + .global bluegl_glGetPerfQueryIdByNameINTEL + .type bluegl_glGetPerfQueryIdByNameINTEL, %function +bluegl_glGetPerfQueryIdByNameINTEL: + adrp x16, :got:__blue_glCore_glGetPerfQueryIdByNameINTEL + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfQueryIdByNameINTEL] ldr x16, [x16] br x16 - .size bluegl_glTransformFeedbackVaryings, .-bluegl_glTransformFeedbackVaryings + .size bluegl_glGetPerfQueryIdByNameINTEL, .-bluegl_glGetPerfQueryIdByNameINTEL .align 2 - .global bluegl_glNamedFramebufferSampleLocationsfvNV - .type bluegl_glNamedFramebufferSampleLocationsfvNV, %function -bluegl_glNamedFramebufferSampleLocationsfvNV: - adrp x16, :got:__blue_glCore_glNamedFramebufferSampleLocationsfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferSampleLocationsfvNV] + .global bluegl_glGetPerfQueryInfoINTEL + .type bluegl_glGetPerfQueryInfoINTEL, %function +bluegl_glGetPerfQueryInfoINTEL: + adrp x16, :got:__blue_glCore_glGetPerfQueryInfoINTEL + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfQueryInfoINTEL] ldr x16, [x16] br x16 - .size bluegl_glNamedFramebufferSampleLocationsfvNV, .-bluegl_glNamedFramebufferSampleLocationsfvNV + .size bluegl_glGetPerfQueryInfoINTEL, .-bluegl_glGetPerfQueryInfoINTEL .align 2 - .global bluegl_glMapTexture2DINTEL - .type bluegl_glMapTexture2DINTEL, %function -bluegl_glMapTexture2DINTEL: - adrp x16, :got:__blue_glCore_glMapTexture2DINTEL - ldr x16, [x16, #:got_lo12:__blue_glCore_glMapTexture2DINTEL] + .global bluegl_glResizeBuffersMESA + .type bluegl_glResizeBuffersMESA, %function +bluegl_glResizeBuffersMESA: + adrp x16, :got:__blue_glCore_glResizeBuffersMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glResizeBuffersMESA] ldr x16, [x16] br x16 - .size bluegl_glMapTexture2DINTEL, .-bluegl_glMapTexture2DINTEL + .size bluegl_glResizeBuffersMESA, .-bluegl_glResizeBuffersMESA .align 2 - .global bluegl_glMaterialxvOES - .type bluegl_glMaterialxvOES, %function -bluegl_glMaterialxvOES: - adrp x16, :got:__blue_glCore_glMaterialxvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMaterialxvOES] + .global bluegl_glWindowPos2dMESA + .type bluegl_glWindowPos2dMESA, %function +bluegl_glWindowPos2dMESA: + adrp x16, :got:__blue_glCore_glWindowPos2dMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2dMESA] ldr x16, [x16] br x16 - .size bluegl_glMaterialxvOES, .-bluegl_glMaterialxvOES + .size bluegl_glWindowPos2dMESA, .-bluegl_glWindowPos2dMESA .align 2 - .global bluegl_glGenNamesAMD - .type bluegl_glGenNamesAMD, %function -bluegl_glGenNamesAMD: - adrp x16, :got:__blue_glCore_glGenNamesAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenNamesAMD] + .global bluegl_glWindowPos2dvMESA + .type bluegl_glWindowPos2dvMESA, %function +bluegl_glWindowPos2dvMESA: + adrp x16, :got:__blue_glCore_glWindowPos2dvMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2dvMESA] ldr x16, [x16] br x16 - .size bluegl_glGenNamesAMD, .-bluegl_glGenNamesAMD + .size bluegl_glWindowPos2dvMESA, .-bluegl_glWindowPos2dvMESA .align 2 - .global bluegl_glUniform2uiEXT - .type bluegl_glUniform2uiEXT, %function -bluegl_glUniform2uiEXT: - adrp x16, :got:__blue_glCore_glUniform2uiEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2uiEXT] + .global bluegl_glWindowPos2fMESA + .type bluegl_glWindowPos2fMESA, %function +bluegl_glWindowPos2fMESA: + adrp x16, :got:__blue_glCore_glWindowPos2fMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2fMESA] ldr x16, [x16] br x16 - .size bluegl_glUniform2uiEXT, .-bluegl_glUniform2uiEXT + .size bluegl_glWindowPos2fMESA, .-bluegl_glWindowPos2fMESA .align 2 - .global bluegl_glMultiTexCoord1xvOES - .type bluegl_glMultiTexCoord1xvOES, %function -bluegl_glMultiTexCoord1xvOES: - adrp x16, :got:__blue_glCore_glMultiTexCoord1xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1xvOES] + .global bluegl_glWindowPos2fvMESA + .type bluegl_glWindowPos2fvMESA, %function +bluegl_glWindowPos2fvMESA: + adrp x16, :got:__blue_glCore_glWindowPos2fvMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2fvMESA] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1xvOES, .-bluegl_glMultiTexCoord1xvOES + .size bluegl_glWindowPos2fvMESA, .-bluegl_glWindowPos2fvMESA .align 2 - .global bluegl_glEnableIndexedEXT - .type bluegl_glEnableIndexedEXT, %function -bluegl_glEnableIndexedEXT: - adrp x16, :got:__blue_glCore_glEnableIndexedEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableIndexedEXT] + .global bluegl_glWindowPos2iMESA + .type bluegl_glWindowPos2iMESA, %function +bluegl_glWindowPos2iMESA: + adrp x16, :got:__blue_glCore_glWindowPos2iMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2iMESA] ldr x16, [x16] br x16 - .size bluegl_glEnableIndexedEXT, .-bluegl_glEnableIndexedEXT + .size bluegl_glWindowPos2iMESA, .-bluegl_glWindowPos2iMESA .align 2 - .global bluegl_glCompressedTextureImage1DEXT - .type bluegl_glCompressedTextureImage1DEXT, %function -bluegl_glCompressedTextureImage1DEXT: - adrp x16, :got:__blue_glCore_glCompressedTextureImage1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTextureImage1DEXT] + .global bluegl_glWindowPos2ivMESA + .type bluegl_glWindowPos2ivMESA, %function +bluegl_glWindowPos2ivMESA: + adrp x16, :got:__blue_glCore_glWindowPos2ivMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2ivMESA] ldr x16, [x16] br x16 - .size bluegl_glCompressedTextureImage1DEXT, .-bluegl_glCompressedTextureImage1DEXT + .size bluegl_glWindowPos2ivMESA, .-bluegl_glWindowPos2ivMESA .align 2 - .global bluegl_glMultiTexCoord3fv - .type bluegl_glMultiTexCoord3fv, %function -bluegl_glMultiTexCoord3fv: - adrp x16, :got:__blue_glCore_glMultiTexCoord3fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3fv] + .global bluegl_glWindowPos2sMESA + .type bluegl_glWindowPos2sMESA, %function +bluegl_glWindowPos2sMESA: + adrp x16, :got:__blue_glCore_glWindowPos2sMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2sMESA] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3fv, .-bluegl_glMultiTexCoord3fv + .size bluegl_glWindowPos2sMESA, .-bluegl_glWindowPos2sMESA .align 2 - .global bluegl_glGetnPolygonStippleARB - .type bluegl_glGetnPolygonStippleARB, %function -bluegl_glGetnPolygonStippleARB: - adrp x16, :got:__blue_glCore_glGetnPolygonStippleARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnPolygonStippleARB] + .global bluegl_glWindowPos2svMESA + .type bluegl_glWindowPos2svMESA, %function +bluegl_glWindowPos2svMESA: + adrp x16, :got:__blue_glCore_glWindowPos2svMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2svMESA] ldr x16, [x16] br x16 - .size bluegl_glGetnPolygonStippleARB, .-bluegl_glGetnPolygonStippleARB + .size bluegl_glWindowPos2svMESA, .-bluegl_glWindowPos2svMESA .align 2 - .global bluegl_glTexCoord2fColor3fVertex3fvSUN - .type bluegl_glTexCoord2fColor3fVertex3fvSUN, %function -bluegl_glTexCoord2fColor3fVertex3fvSUN: - adrp x16, :got:__blue_glCore_glTexCoord2fColor3fVertex3fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fColor3fVertex3fvSUN] + .global bluegl_glWindowPos3dMESA + .type bluegl_glWindowPos3dMESA, %function +bluegl_glWindowPos3dMESA: + adrp x16, :got:__blue_glCore_glWindowPos3dMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3dMESA] ldr x16, [x16] br x16 - .size bluegl_glTexCoord2fColor3fVertex3fvSUN, .-bluegl_glTexCoord2fColor3fVertex3fvSUN + .size bluegl_glWindowPos3dMESA, .-bluegl_glWindowPos3dMESA .align 2 - .global bluegl_glBindTransformFeedbackNV - .type bluegl_glBindTransformFeedbackNV, %function -bluegl_glBindTransformFeedbackNV: - adrp x16, :got:__blue_glCore_glBindTransformFeedbackNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindTransformFeedbackNV] + .global bluegl_glWindowPos3dvMESA + .type bluegl_glWindowPos3dvMESA, %function +bluegl_glWindowPos3dvMESA: + adrp x16, :got:__blue_glCore_glWindowPos3dvMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3dvMESA] ldr x16, [x16] br x16 - .size bluegl_glBindTransformFeedbackNV, .-bluegl_glBindTransformFeedbackNV + .size bluegl_glWindowPos3dvMESA, .-bluegl_glWindowPos3dvMESA .align 2 - .global bluegl_glVertexStream2svATI - .type bluegl_glVertexStream2svATI, %function -bluegl_glVertexStream2svATI: - adrp x16, :got:__blue_glCore_glVertexStream2svATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream2svATI] + .global bluegl_glWindowPos3fMESA + .type bluegl_glWindowPos3fMESA, %function +bluegl_glWindowPos3fMESA: + adrp x16, :got:__blue_glCore_glWindowPos3fMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3fMESA] ldr x16, [x16] br x16 - .size bluegl_glVertexStream2svATI, .-bluegl_glVertexStream2svATI + .size bluegl_glWindowPos3fMESA, .-bluegl_glWindowPos3fMESA .align 2 - .global bluegl_glMultiTexCoord1fvARB - .type bluegl_glMultiTexCoord1fvARB, %function -bluegl_glMultiTexCoord1fvARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord1fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1fvARB] + .global bluegl_glWindowPos3fvMESA + .type bluegl_glWindowPos3fvMESA, %function +bluegl_glWindowPos3fvMESA: + adrp x16, :got:__blue_glCore_glWindowPos3fvMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3fvMESA] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1fvARB, .-bluegl_glMultiTexCoord1fvARB + .size bluegl_glWindowPos3fvMESA, .-bluegl_glWindowPos3fvMESA .align 2 - .global bluegl_glMultiTexGendvEXT - .type bluegl_glMultiTexGendvEXT, %function -bluegl_glMultiTexGendvEXT: - adrp x16, :got:__blue_glCore_glMultiTexGendvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexGendvEXT] + .global bluegl_glWindowPos3iMESA + .type bluegl_glWindowPos3iMESA, %function +bluegl_glWindowPos3iMESA: + adrp x16, :got:__blue_glCore_glWindowPos3iMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3iMESA] ldr x16, [x16] br x16 - .size bluegl_glMultiTexGendvEXT, .-bluegl_glMultiTexGendvEXT + .size bluegl_glWindowPos3iMESA, .-bluegl_glWindowPos3iMESA .align 2 - .global bluegl_glProgramUniform2ui64vNV - .type bluegl_glProgramUniform2ui64vNV, %function -bluegl_glProgramUniform2ui64vNV: - adrp x16, :got:__blue_glCore_glProgramUniform2ui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2ui64vNV] + .global bluegl_glWindowPos3ivMESA + .type bluegl_glWindowPos3ivMESA, %function +bluegl_glWindowPos3ivMESA: + adrp x16, :got:__blue_glCore_glWindowPos3ivMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3ivMESA] + ldr x16, [x16] + br x16 + .size bluegl_glWindowPos3ivMESA, .-bluegl_glWindowPos3ivMESA + + .align 2 + .global bluegl_glWindowPos3sMESA + .type bluegl_glWindowPos3sMESA, %function +bluegl_glWindowPos3sMESA: + adrp x16, :got:__blue_glCore_glWindowPos3sMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3sMESA] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2ui64vNV, .-bluegl_glProgramUniform2ui64vNV + .size bluegl_glWindowPos3sMESA, .-bluegl_glWindowPos3sMESA .align 2 - .global bluegl_glGetNamedRenderbufferParameteriv - .type bluegl_glGetNamedRenderbufferParameteriv, %function -bluegl_glGetNamedRenderbufferParameteriv: - adrp x16, :got:__blue_glCore_glGetNamedRenderbufferParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedRenderbufferParameteriv] + .global bluegl_glWindowPos3svMESA + .type bluegl_glWindowPos3svMESA, %function +bluegl_glWindowPos3svMESA: + adrp x16, :got:__blue_glCore_glWindowPos3svMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3svMESA] ldr x16, [x16] br x16 - .size bluegl_glGetNamedRenderbufferParameteriv, .-bluegl_glGetNamedRenderbufferParameteriv + .size bluegl_glWindowPos3svMESA, .-bluegl_glWindowPos3svMESA .align 2 - .global bluegl_glBlendEquationSeparateEXT - .type bluegl_glBlendEquationSeparateEXT, %function -bluegl_glBlendEquationSeparateEXT: - adrp x16, :got:__blue_glCore_glBlendEquationSeparateEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquationSeparateEXT] + .global bluegl_glWindowPos4dMESA + .type bluegl_glWindowPos4dMESA, %function +bluegl_glWindowPos4dMESA: + adrp x16, :got:__blue_glCore_glWindowPos4dMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos4dMESA] ldr x16, [x16] br x16 - .size bluegl_glBlendEquationSeparateEXT, .-bluegl_glBlendEquationSeparateEXT + .size bluegl_glWindowPos4dMESA, .-bluegl_glWindowPos4dMESA .align 2 - .global bluegl_glInvalidateBufferData - .type bluegl_glInvalidateBufferData, %function -bluegl_glInvalidateBufferData: - adrp x16, :got:__blue_glCore_glInvalidateBufferData - ldr x16, [x16, #:got_lo12:__blue_glCore_glInvalidateBufferData] + .global bluegl_glWindowPos4dvMESA + .type bluegl_glWindowPos4dvMESA, %function +bluegl_glWindowPos4dvMESA: + adrp x16, :got:__blue_glCore_glWindowPos4dvMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos4dvMESA] ldr x16, [x16] br x16 - .size bluegl_glInvalidateBufferData, .-bluegl_glInvalidateBufferData + .size bluegl_glWindowPos4dvMESA, .-bluegl_glWindowPos4dvMESA .align 2 - .global bluegl_glFragmentLightModelfvSGIX - .type bluegl_glFragmentLightModelfvSGIX, %function -bluegl_glFragmentLightModelfvSGIX: - adrp x16, :got:__blue_glCore_glFragmentLightModelfvSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentLightModelfvSGIX] + .global bluegl_glWindowPos4fMESA + .type bluegl_glWindowPos4fMESA, %function +bluegl_glWindowPos4fMESA: + adrp x16, :got:__blue_glCore_glWindowPos4fMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos4fMESA] ldr x16, [x16] br x16 - .size bluegl_glFragmentLightModelfvSGIX, .-bluegl_glFragmentLightModelfvSGIX + .size bluegl_glWindowPos4fMESA, .-bluegl_glWindowPos4fMESA .align 2 - .global bluegl_glMakeTextureHandleNonResidentARB - .type bluegl_glMakeTextureHandleNonResidentARB, %function -bluegl_glMakeTextureHandleNonResidentARB: - adrp x16, :got:__blue_glCore_glMakeTextureHandleNonResidentARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeTextureHandleNonResidentARB] + .global bluegl_glWindowPos4fvMESA + .type bluegl_glWindowPos4fvMESA, %function +bluegl_glWindowPos4fvMESA: + adrp x16, :got:__blue_glCore_glWindowPos4fvMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos4fvMESA] ldr x16, [x16] br x16 - .size bluegl_glMakeTextureHandleNonResidentARB, .-bluegl_glMakeTextureHandleNonResidentARB + .size bluegl_glWindowPos4fvMESA, .-bluegl_glWindowPos4fvMESA .align 2 - .global bluegl_glMap2xOES - .type bluegl_glMap2xOES, %function -bluegl_glMap2xOES: - adrp x16, :got:__blue_glCore_glMap2xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMap2xOES] + .global bluegl_glWindowPos4iMESA + .type bluegl_glWindowPos4iMESA, %function +bluegl_glWindowPos4iMESA: + adrp x16, :got:__blue_glCore_glWindowPos4iMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos4iMESA] ldr x16, [x16] br x16 - .size bluegl_glMap2xOES, .-bluegl_glMap2xOES + .size bluegl_glWindowPos4iMESA, .-bluegl_glWindowPos4iMESA .align 2 - .global bluegl_glFramebufferRenderbufferEXT - .type bluegl_glFramebufferRenderbufferEXT, %function -bluegl_glFramebufferRenderbufferEXT: - adrp x16, :got:__blue_glCore_glFramebufferRenderbufferEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferRenderbufferEXT] + .global bluegl_glWindowPos4ivMESA + .type bluegl_glWindowPos4ivMESA, %function +bluegl_glWindowPos4ivMESA: + adrp x16, :got:__blue_glCore_glWindowPos4ivMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos4ivMESA] ldr x16, [x16] br x16 - .size bluegl_glFramebufferRenderbufferEXT, .-bluegl_glFramebufferRenderbufferEXT + .size bluegl_glWindowPos4ivMESA, .-bluegl_glWindowPos4ivMESA .align 2 - .global bluegl_glGetMapAttribParameterfvNV - .type bluegl_glGetMapAttribParameterfvNV, %function -bluegl_glGetMapAttribParameterfvNV: - adrp x16, :got:__blue_glCore_glGetMapAttribParameterfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMapAttribParameterfvNV] + .global bluegl_glWindowPos4sMESA + .type bluegl_glWindowPos4sMESA, %function +bluegl_glWindowPos4sMESA: + adrp x16, :got:__blue_glCore_glWindowPos4sMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos4sMESA] ldr x16, [x16] br x16 - .size bluegl_glGetMapAttribParameterfvNV, .-bluegl_glGetMapAttribParameterfvNV + .size bluegl_glWindowPos4sMESA, .-bluegl_glWindowPos4sMESA .align 2 - .global bluegl_glVertexAttrib2dvARB - .type bluegl_glVertexAttrib2dvARB, %function -bluegl_glVertexAttrib2dvARB: - adrp x16, :got:__blue_glCore_glVertexAttrib2dvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2dvARB] + .global bluegl_glWindowPos4svMESA + .type bluegl_glWindowPos4svMESA, %function +bluegl_glWindowPos4svMESA: + adrp x16, :got:__blue_glCore_glWindowPos4svMESA + ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos4svMESA] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2dvARB, .-bluegl_glVertexAttrib2dvARB + .size bluegl_glWindowPos4svMESA, .-bluegl_glWindowPos4svMESA .align 2 - .global bluegl_glInvalidateBufferSubData - .type bluegl_glInvalidateBufferSubData, %function -bluegl_glInvalidateBufferSubData: - adrp x16, :got:__blue_glCore_glInvalidateBufferSubData - ldr x16, [x16, #:got_lo12:__blue_glCore_glInvalidateBufferSubData] + .global bluegl_glBeginConditionalRenderNVX + .type bluegl_glBeginConditionalRenderNVX, %function +bluegl_glBeginConditionalRenderNVX: + adrp x16, :got:__blue_glCore_glBeginConditionalRenderNVX + ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginConditionalRenderNVX] ldr x16, [x16] br x16 - .size bluegl_glInvalidateBufferSubData, .-bluegl_glInvalidateBufferSubData + .size bluegl_glBeginConditionalRenderNVX, .-bluegl_glBeginConditionalRenderNVX .align 2 - .global bluegl_glVertexAttrib1d - .type bluegl_glVertexAttrib1d, %function -bluegl_glVertexAttrib1d: - adrp x16, :got:__blue_glCore_glVertexAttrib1d - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1d] + .global bluegl_glEndConditionalRenderNVX + .type bluegl_glEndConditionalRenderNVX, %function +bluegl_glEndConditionalRenderNVX: + adrp x16, :got:__blue_glCore_glEndConditionalRenderNVX + ldr x16, [x16, #:got_lo12:__blue_glCore_glEndConditionalRenderNVX] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1d, .-bluegl_glVertexAttrib1d + .size bluegl_glEndConditionalRenderNVX, .-bluegl_glEndConditionalRenderNVX .align 2 - .global bluegl_glDispatchComputeIndirect - .type bluegl_glDispatchComputeIndirect, %function -bluegl_glDispatchComputeIndirect: - adrp x16, :got:__blue_glCore_glDispatchComputeIndirect - ldr x16, [x16, #:got_lo12:__blue_glCore_glDispatchComputeIndirect] + .global bluegl_glMultiDrawArraysIndirectBindlessNV + .type bluegl_glMultiDrawArraysIndirectBindlessNV, %function +bluegl_glMultiDrawArraysIndirectBindlessNV: + adrp x16, :got:__blue_glCore_glMultiDrawArraysIndirectBindlessNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawArraysIndirectBindlessNV] ldr x16, [x16] br x16 - .size bluegl_glDispatchComputeIndirect, .-bluegl_glDispatchComputeIndirect + .size bluegl_glMultiDrawArraysIndirectBindlessNV, .-bluegl_glMultiDrawArraysIndirectBindlessNV .align 2 - .global bluegl_glStencilFuncSeparate - .type bluegl_glStencilFuncSeparate, %function -bluegl_glStencilFuncSeparate: - adrp x16, :got:__blue_glCore_glStencilFuncSeparate - ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilFuncSeparate] + .global bluegl_glMultiDrawElementsIndirectBindlessNV + .type bluegl_glMultiDrawElementsIndirectBindlessNV, %function +bluegl_glMultiDrawElementsIndirectBindlessNV: + adrp x16, :got:__blue_glCore_glMultiDrawElementsIndirectBindlessNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawElementsIndirectBindlessNV] ldr x16, [x16] br x16 - .size bluegl_glStencilFuncSeparate, .-bluegl_glStencilFuncSeparate + .size bluegl_glMultiDrawElementsIndirectBindlessNV, .-bluegl_glMultiDrawElementsIndirectBindlessNV .align 2 - .global bluegl_glMapVertexAttrib2fAPPLE - .type bluegl_glMapVertexAttrib2fAPPLE, %function -bluegl_glMapVertexAttrib2fAPPLE: - adrp x16, :got:__blue_glCore_glMapVertexAttrib2fAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glMapVertexAttrib2fAPPLE] + .global bluegl_glMultiDrawArraysIndirectBindlessCountNV + .type bluegl_glMultiDrawArraysIndirectBindlessCountNV, %function +bluegl_glMultiDrawArraysIndirectBindlessCountNV: + adrp x16, :got:__blue_glCore_glMultiDrawArraysIndirectBindlessCountNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawArraysIndirectBindlessCountNV] ldr x16, [x16] br x16 - .size bluegl_glMapVertexAttrib2fAPPLE, .-bluegl_glMapVertexAttrib2fAPPLE + .size bluegl_glMultiDrawArraysIndirectBindlessCountNV, .-bluegl_glMultiDrawArraysIndirectBindlessCountNV .align 2 - .global bluegl_glProgramUniformMatrix2x4fv - .type bluegl_glProgramUniformMatrix2x4fv, %function -bluegl_glProgramUniformMatrix2x4fv: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix2x4fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2x4fv] + .global bluegl_glMultiDrawElementsIndirectBindlessCountNV + .type bluegl_glMultiDrawElementsIndirectBindlessCountNV, %function +bluegl_glMultiDrawElementsIndirectBindlessCountNV: + adrp x16, :got:__blue_glCore_glMultiDrawElementsIndirectBindlessCountNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawElementsIndirectBindlessCountNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix2x4fv, .-bluegl_glProgramUniformMatrix2x4fv + .size bluegl_glMultiDrawElementsIndirectBindlessCountNV, .-bluegl_glMultiDrawElementsIndirectBindlessCountNV .align 2 - .global bluegl_glReadPixels - .type bluegl_glReadPixels, %function -bluegl_glReadPixels: - adrp x16, :got:__blue_glCore_glReadPixels - ldr x16, [x16, #:got_lo12:__blue_glCore_glReadPixels] + .global bluegl_glGetTextureHandleNV + .type bluegl_glGetTextureHandleNV, %function +bluegl_glGetTextureHandleNV: + adrp x16, :got:__blue_glCore_glGetTextureHandleNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureHandleNV] ldr x16, [x16] br x16 - .size bluegl_glReadPixels, .-bluegl_glReadPixels + .size bluegl_glGetTextureHandleNV, .-bluegl_glGetTextureHandleNV .align 2 - .global bluegl_glVertexArrayAttribIFormat - .type bluegl_glVertexArrayAttribIFormat, %function -bluegl_glVertexArrayAttribIFormat: - adrp x16, :got:__blue_glCore_glVertexArrayAttribIFormat - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayAttribIFormat] + .global bluegl_glGetTextureSamplerHandleNV + .type bluegl_glGetTextureSamplerHandleNV, %function +bluegl_glGetTextureSamplerHandleNV: + adrp x16, :got:__blue_glCore_glGetTextureSamplerHandleNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureSamplerHandleNV] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayAttribIFormat, .-bluegl_glVertexArrayAttribIFormat + .size bluegl_glGetTextureSamplerHandleNV, .-bluegl_glGetTextureSamplerHandleNV .align 2 - .global bluegl_glCopyMultiTexSubImage1DEXT - .type bluegl_glCopyMultiTexSubImage1DEXT, %function -bluegl_glCopyMultiTexSubImage1DEXT: - adrp x16, :got:__blue_glCore_glCopyMultiTexSubImage1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyMultiTexSubImage1DEXT] + .global bluegl_glMakeTextureHandleResidentNV + .type bluegl_glMakeTextureHandleResidentNV, %function +bluegl_glMakeTextureHandleResidentNV: + adrp x16, :got:__blue_glCore_glMakeTextureHandleResidentNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeTextureHandleResidentNV] ldr x16, [x16] br x16 - .size bluegl_glCopyMultiTexSubImage1DEXT, .-bluegl_glCopyMultiTexSubImage1DEXT + .size bluegl_glMakeTextureHandleResidentNV, .-bluegl_glMakeTextureHandleResidentNV .align 2 - .global bluegl_glBlendEquationSeparateIndexedAMD - .type bluegl_glBlendEquationSeparateIndexedAMD, %function -bluegl_glBlendEquationSeparateIndexedAMD: - adrp x16, :got:__blue_glCore_glBlendEquationSeparateIndexedAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquationSeparateIndexedAMD] + .global bluegl_glMakeTextureHandleNonResidentNV + .type bluegl_glMakeTextureHandleNonResidentNV, %function +bluegl_glMakeTextureHandleNonResidentNV: + adrp x16, :got:__blue_glCore_glMakeTextureHandleNonResidentNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeTextureHandleNonResidentNV] ldr x16, [x16] br x16 - .size bluegl_glBlendEquationSeparateIndexedAMD, .-bluegl_glBlendEquationSeparateIndexedAMD + .size bluegl_glMakeTextureHandleNonResidentNV, .-bluegl_glMakeTextureHandleNonResidentNV .align 2 - .global bluegl_glGetTransformFeedbackVaryingEXT - .type bluegl_glGetTransformFeedbackVaryingEXT, %function -bluegl_glGetTransformFeedbackVaryingEXT: - adrp x16, :got:__blue_glCore_glGetTransformFeedbackVaryingEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTransformFeedbackVaryingEXT] + .global bluegl_glGetImageHandleNV + .type bluegl_glGetImageHandleNV, %function +bluegl_glGetImageHandleNV: + adrp x16, :got:__blue_glCore_glGetImageHandleNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetImageHandleNV] ldr x16, [x16] br x16 - .size bluegl_glGetTransformFeedbackVaryingEXT, .-bluegl_glGetTransformFeedbackVaryingEXT + .size bluegl_glGetImageHandleNV, .-bluegl_glGetImageHandleNV .align 2 - .global bluegl_glProgramUniform2ui64ARB - .type bluegl_glProgramUniform2ui64ARB, %function -bluegl_glProgramUniform2ui64ARB: - adrp x16, :got:__blue_glCore_glProgramUniform2ui64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2ui64ARB] + .global bluegl_glMakeImageHandleResidentNV + .type bluegl_glMakeImageHandleResidentNV, %function +bluegl_glMakeImageHandleResidentNV: + adrp x16, :got:__blue_glCore_glMakeImageHandleResidentNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeImageHandleResidentNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2ui64ARB, .-bluegl_glProgramUniform2ui64ARB + .size bluegl_glMakeImageHandleResidentNV, .-bluegl_glMakeImageHandleResidentNV .align 2 - .global bluegl_glProgramUniform1i64vARB - .type bluegl_glProgramUniform1i64vARB, %function -bluegl_glProgramUniform1i64vARB: - adrp x16, :got:__blue_glCore_glProgramUniform1i64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1i64vARB] + .global bluegl_glMakeImageHandleNonResidentNV + .type bluegl_glMakeImageHandleNonResidentNV, %function +bluegl_glMakeImageHandleNonResidentNV: + adrp x16, :got:__blue_glCore_glMakeImageHandleNonResidentNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeImageHandleNonResidentNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1i64vARB, .-bluegl_glProgramUniform1i64vARB + .size bluegl_glMakeImageHandleNonResidentNV, .-bluegl_glMakeImageHandleNonResidentNV .align 2 - .global bluegl_glMultiTexCoord4iv - .type bluegl_glMultiTexCoord4iv, %function -bluegl_glMultiTexCoord4iv: - adrp x16, :got:__blue_glCore_glMultiTexCoord4iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4iv] + .global bluegl_glUniformHandleui64NV + .type bluegl_glUniformHandleui64NV, %function +bluegl_glUniformHandleui64NV: + adrp x16, :got:__blue_glCore_glUniformHandleui64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformHandleui64NV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4iv, .-bluegl_glMultiTexCoord4iv + .size bluegl_glUniformHandleui64NV, .-bluegl_glUniformHandleui64NV .align 2 - .global bluegl_glLoadIdentityDeformationMapSGIX - .type bluegl_glLoadIdentityDeformationMapSGIX, %function -bluegl_glLoadIdentityDeformationMapSGIX: - adrp x16, :got:__blue_glCore_glLoadIdentityDeformationMapSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glLoadIdentityDeformationMapSGIX] + .global bluegl_glUniformHandleui64vNV + .type bluegl_glUniformHandleui64vNV, %function +bluegl_glUniformHandleui64vNV: + adrp x16, :got:__blue_glCore_glUniformHandleui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformHandleui64vNV] ldr x16, [x16] br x16 - .size bluegl_glLoadIdentityDeformationMapSGIX, .-bluegl_glLoadIdentityDeformationMapSGIX + .size bluegl_glUniformHandleui64vNV, .-bluegl_glUniformHandleui64vNV .align 2 - .global bluegl_glGetMultiTexGendvEXT - .type bluegl_glGetMultiTexGendvEXT, %function -bluegl_glGetMultiTexGendvEXT: - adrp x16, :got:__blue_glCore_glGetMultiTexGendvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexGendvEXT] + .global bluegl_glProgramUniformHandleui64NV + .type bluegl_glProgramUniformHandleui64NV, %function +bluegl_glProgramUniformHandleui64NV: + adrp x16, :got:__blue_glCore_glProgramUniformHandleui64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformHandleui64NV] ldr x16, [x16] br x16 - .size bluegl_glGetMultiTexGendvEXT, .-bluegl_glGetMultiTexGendvEXT + .size bluegl_glProgramUniformHandleui64NV, .-bluegl_glProgramUniformHandleui64NV .align 2 - .global bluegl_glVertex4xvOES - .type bluegl_glVertex4xvOES, %function -bluegl_glVertex4xvOES: - adrp x16, :got:__blue_glCore_glVertex4xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex4xvOES] + .global bluegl_glProgramUniformHandleui64vNV + .type bluegl_glProgramUniformHandleui64vNV, %function +bluegl_glProgramUniformHandleui64vNV: + adrp x16, :got:__blue_glCore_glProgramUniformHandleui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformHandleui64vNV] ldr x16, [x16] br x16 - .size bluegl_glVertex4xvOES, .-bluegl_glVertex4xvOES + .size bluegl_glProgramUniformHandleui64vNV, .-bluegl_glProgramUniformHandleui64vNV .align 2 - .global bluegl_glVertexArrayVertexAttribOffsetEXT - .type bluegl_glVertexArrayVertexAttribOffsetEXT, %function -bluegl_glVertexArrayVertexAttribOffsetEXT: - adrp x16, :got:__blue_glCore_glVertexArrayVertexAttribOffsetEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexAttribOffsetEXT] + .global bluegl_glIsTextureHandleResidentNV + .type bluegl_glIsTextureHandleResidentNV, %function +bluegl_glIsTextureHandleResidentNV: + adrp x16, :got:__blue_glCore_glIsTextureHandleResidentNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsTextureHandleResidentNV] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayVertexAttribOffsetEXT, .-bluegl_glVertexArrayVertexAttribOffsetEXT + .size bluegl_glIsTextureHandleResidentNV, .-bluegl_glIsTextureHandleResidentNV .align 2 - .global bluegl_glNormalP3ui - .type bluegl_glNormalP3ui, %function -bluegl_glNormalP3ui: - adrp x16, :got:__blue_glCore_glNormalP3ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalP3ui] + .global bluegl_glIsImageHandleResidentNV + .type bluegl_glIsImageHandleResidentNV, %function +bluegl_glIsImageHandleResidentNV: + adrp x16, :got:__blue_glCore_glIsImageHandleResidentNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsImageHandleResidentNV] ldr x16, [x16] br x16 - .size bluegl_glNormalP3ui, .-bluegl_glNormalP3ui + .size bluegl_glIsImageHandleResidentNV, .-bluegl_glIsImageHandleResidentNV .align 2 - .global bluegl_glMapParameterivNV - .type bluegl_glMapParameterivNV, %function -bluegl_glMapParameterivNV: - adrp x16, :got:__blue_glCore_glMapParameterivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMapParameterivNV] + .global bluegl_glBlendParameteriNV + .type bluegl_glBlendParameteriNV, %function +bluegl_glBlendParameteriNV: + adrp x16, :got:__blue_glCore_glBlendParameteriNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendParameteriNV] ldr x16, [x16] br x16 - .size bluegl_glMapParameterivNV, .-bluegl_glMapParameterivNV + .size bluegl_glBlendParameteriNV, .-bluegl_glBlendParameteriNV .align 2 - .global bluegl_glColorPointervINTEL - .type bluegl_glColorPointervINTEL, %function -bluegl_glColorPointervINTEL: - adrp x16, :got:__blue_glCore_glColorPointervINTEL - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorPointervINTEL] + .global bluegl_glBlendBarrierNV + .type bluegl_glBlendBarrierNV, %function +bluegl_glBlendBarrierNV: + adrp x16, :got:__blue_glCore_glBlendBarrierNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendBarrierNV] ldr x16, [x16] br x16 - .size bluegl_glColorPointervINTEL, .-bluegl_glColorPointervINTEL + .size bluegl_glBlendBarrierNV, .-bluegl_glBlendBarrierNV .align 2 - .global bluegl_glGetQueryObjectui64v - .type bluegl_glGetQueryObjectui64v, %function -bluegl_glGetQueryObjectui64v: - adrp x16, :got:__blue_glCore_glGetQueryObjectui64v - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryObjectui64v] + .global bluegl_glCreateStatesNV + .type bluegl_glCreateStatesNV, %function +bluegl_glCreateStatesNV: + adrp x16, :got:__blue_glCore_glCreateStatesNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateStatesNV] ldr x16, [x16] br x16 - .size bluegl_glGetQueryObjectui64v, .-bluegl_glGetQueryObjectui64v + .size bluegl_glCreateStatesNV, .-bluegl_glCreateStatesNV .align 2 - .global bluegl_glGenFencesAPPLE - .type bluegl_glGenFencesAPPLE, %function -bluegl_glGenFencesAPPLE: - adrp x16, :got:__blue_glCore_glGenFencesAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenFencesAPPLE] + .global bluegl_glDeleteStatesNV + .type bluegl_glDeleteStatesNV, %function +bluegl_glDeleteStatesNV: + adrp x16, :got:__blue_glCore_glDeleteStatesNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteStatesNV] ldr x16, [x16] br x16 - .size bluegl_glGenFencesAPPLE, .-bluegl_glGenFencesAPPLE + .size bluegl_glDeleteStatesNV, .-bluegl_glDeleteStatesNV .align 2 - .global bluegl_glNamedBufferPageCommitmentEXT - .type bluegl_glNamedBufferPageCommitmentEXT, %function -bluegl_glNamedBufferPageCommitmentEXT: - adrp x16, :got:__blue_glCore_glNamedBufferPageCommitmentEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedBufferPageCommitmentEXT] + .global bluegl_glIsStateNV + .type bluegl_glIsStateNV, %function +bluegl_glIsStateNV: + adrp x16, :got:__blue_glCore_glIsStateNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsStateNV] ldr x16, [x16] br x16 - .size bluegl_glNamedBufferPageCommitmentEXT, .-bluegl_glNamedBufferPageCommitmentEXT + .size bluegl_glIsStateNV, .-bluegl_glIsStateNV .align 2 - .global bluegl_glGetShaderSourceARB - .type bluegl_glGetShaderSourceARB, %function -bluegl_glGetShaderSourceARB: - adrp x16, :got:__blue_glCore_glGetShaderSourceARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetShaderSourceARB] + .global bluegl_glStateCaptureNV + .type bluegl_glStateCaptureNV, %function +bluegl_glStateCaptureNV: + adrp x16, :got:__blue_glCore_glStateCaptureNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glStateCaptureNV] ldr x16, [x16] br x16 - .size bluegl_glGetShaderSourceARB, .-bluegl_glGetShaderSourceARB + .size bluegl_glStateCaptureNV, .-bluegl_glStateCaptureNV .align 2 - .global bluegl_glClearNamedFramebufferuiv - .type bluegl_glClearNamedFramebufferuiv, %function -bluegl_glClearNamedFramebufferuiv: - adrp x16, :got:__blue_glCore_glClearNamedFramebufferuiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearNamedFramebufferuiv] + .global bluegl_glGetCommandHeaderNV + .type bluegl_glGetCommandHeaderNV, %function +bluegl_glGetCommandHeaderNV: + adrp x16, :got:__blue_glCore_glGetCommandHeaderNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCommandHeaderNV] ldr x16, [x16] br x16 - .size bluegl_glClearNamedFramebufferuiv, .-bluegl_glClearNamedFramebufferuiv + .size bluegl_glGetCommandHeaderNV, .-bluegl_glGetCommandHeaderNV .align 2 - .global bluegl_glVDPAUIsSurfaceNV - .type bluegl_glVDPAUIsSurfaceNV, %function -bluegl_glVDPAUIsSurfaceNV: - adrp x16, :got:__blue_glCore_glVDPAUIsSurfaceNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAUIsSurfaceNV] + .global bluegl_glGetStageIndexNV + .type bluegl_glGetStageIndexNV, %function +bluegl_glGetStageIndexNV: + adrp x16, :got:__blue_glCore_glGetStageIndexNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetStageIndexNV] ldr x16, [x16] br x16 - .size bluegl_glVDPAUIsSurfaceNV, .-bluegl_glVDPAUIsSurfaceNV + .size bluegl_glGetStageIndexNV, .-bluegl_glGetStageIndexNV .align 2 - .global bluegl_glVertexAttribL2ui64NV - .type bluegl_glVertexAttribL2ui64NV, %function -bluegl_glVertexAttribL2ui64NV: - adrp x16, :got:__blue_glCore_glVertexAttribL2ui64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL2ui64NV] + .global bluegl_glDrawCommandsNV + .type bluegl_glDrawCommandsNV, %function +bluegl_glDrawCommandsNV: + adrp x16, :got:__blue_glCore_glDrawCommandsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawCommandsNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL2ui64NV, .-bluegl_glVertexAttribL2ui64NV + .size bluegl_glDrawCommandsNV, .-bluegl_glDrawCommandsNV .align 2 - .global bluegl_glColor4xvOES - .type bluegl_glColor4xvOES, %function -bluegl_glColor4xvOES: - adrp x16, :got:__blue_glCore_glColor4xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4xvOES] + .global bluegl_glDrawCommandsAddressNV + .type bluegl_glDrawCommandsAddressNV, %function +bluegl_glDrawCommandsAddressNV: + adrp x16, :got:__blue_glCore_glDrawCommandsAddressNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawCommandsAddressNV] ldr x16, [x16] br x16 - .size bluegl_glColor4xvOES, .-bluegl_glColor4xvOES + .size bluegl_glDrawCommandsAddressNV, .-bluegl_glDrawCommandsAddressNV .align 2 - .global bluegl_glUniformBlockBinding - .type bluegl_glUniformBlockBinding, %function -bluegl_glUniformBlockBinding: - adrp x16, :got:__blue_glCore_glUniformBlockBinding - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformBlockBinding] + .global bluegl_glDrawCommandsStatesNV + .type bluegl_glDrawCommandsStatesNV, %function +bluegl_glDrawCommandsStatesNV: + adrp x16, :got:__blue_glCore_glDrawCommandsStatesNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawCommandsStatesNV] ldr x16, [x16] br x16 - .size bluegl_glUniformBlockBinding, .-bluegl_glUniformBlockBinding + .size bluegl_glDrawCommandsStatesNV, .-bluegl_glDrawCommandsStatesNV .align 2 - .global bluegl_glListParameterivSGIX - .type bluegl_glListParameterivSGIX, %function -bluegl_glListParameterivSGIX: - adrp x16, :got:__blue_glCore_glListParameterivSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glListParameterivSGIX] + .global bluegl_glDrawCommandsStatesAddressNV + .type bluegl_glDrawCommandsStatesAddressNV, %function +bluegl_glDrawCommandsStatesAddressNV: + adrp x16, :got:__blue_glCore_glDrawCommandsStatesAddressNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawCommandsStatesAddressNV] ldr x16, [x16] br x16 - .size bluegl_glListParameterivSGIX, .-bluegl_glListParameterivSGIX + .size bluegl_glDrawCommandsStatesAddressNV, .-bluegl_glDrawCommandsStatesAddressNV .align 2 - .global bluegl_glPathSubCoordsNV - .type bluegl_glPathSubCoordsNV, %function -bluegl_glPathSubCoordsNV: - adrp x16, :got:__blue_glCore_glPathSubCoordsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathSubCoordsNV] + .global bluegl_glCreateCommandListsNV + .type bluegl_glCreateCommandListsNV, %function +bluegl_glCreateCommandListsNV: + adrp x16, :got:__blue_glCore_glCreateCommandListsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateCommandListsNV] ldr x16, [x16] br x16 - .size bluegl_glPathSubCoordsNV, .-bluegl_glPathSubCoordsNV + .size bluegl_glCreateCommandListsNV, .-bluegl_glCreateCommandListsNV .align 2 - .global bluegl_glGetProgramStringARB - .type bluegl_glGetProgramStringARB, %function -bluegl_glGetProgramStringARB: - adrp x16, :got:__blue_glCore_glGetProgramStringARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramStringARB] + .global bluegl_glDeleteCommandListsNV + .type bluegl_glDeleteCommandListsNV, %function +bluegl_glDeleteCommandListsNV: + adrp x16, :got:__blue_glCore_glDeleteCommandListsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteCommandListsNV] ldr x16, [x16] br x16 - .size bluegl_glGetProgramStringARB, .-bluegl_glGetProgramStringARB + .size bluegl_glDeleteCommandListsNV, .-bluegl_glDeleteCommandListsNV .align 2 - .global bluegl_glPathStencilFuncNV - .type bluegl_glPathStencilFuncNV, %function -bluegl_glPathStencilFuncNV: - adrp x16, :got:__blue_glCore_glPathStencilFuncNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathStencilFuncNV] + .global bluegl_glIsCommandListNV + .type bluegl_glIsCommandListNV, %function +bluegl_glIsCommandListNV: + adrp x16, :got:__blue_glCore_glIsCommandListNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsCommandListNV] ldr x16, [x16] br x16 - .size bluegl_glPathStencilFuncNV, .-bluegl_glPathStencilFuncNV + .size bluegl_glIsCommandListNV, .-bluegl_glIsCommandListNV .align 2 - .global bluegl_glBindVideoCaptureStreamBufferNV - .type bluegl_glBindVideoCaptureStreamBufferNV, %function -bluegl_glBindVideoCaptureStreamBufferNV: - adrp x16, :got:__blue_glCore_glBindVideoCaptureStreamBufferNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindVideoCaptureStreamBufferNV] + .global bluegl_glListDrawCommandsStatesClientNV + .type bluegl_glListDrawCommandsStatesClientNV, %function +bluegl_glListDrawCommandsStatesClientNV: + adrp x16, :got:__blue_glCore_glListDrawCommandsStatesClientNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glListDrawCommandsStatesClientNV] ldr x16, [x16] br x16 - .size bluegl_glBindVideoCaptureStreamBufferNV, .-bluegl_glBindVideoCaptureStreamBufferNV + .size bluegl_glListDrawCommandsStatesClientNV, .-bluegl_glListDrawCommandsStatesClientNV .align 2 - .global bluegl_glReadnPixelsARB - .type bluegl_glReadnPixelsARB, %function -bluegl_glReadnPixelsARB: - adrp x16, :got:__blue_glCore_glReadnPixelsARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glReadnPixelsARB] + .global bluegl_glCommandListSegmentsNV + .type bluegl_glCommandListSegmentsNV, %function +bluegl_glCommandListSegmentsNV: + adrp x16, :got:__blue_glCore_glCommandListSegmentsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCommandListSegmentsNV] ldr x16, [x16] br x16 - .size bluegl_glReadnPixelsARB, .-bluegl_glReadnPixelsARB + .size bluegl_glCommandListSegmentsNV, .-bluegl_glCommandListSegmentsNV .align 2 - .global bluegl_glTexBufferARB - .type bluegl_glTexBufferARB, %function -bluegl_glTexBufferARB: - adrp x16, :got:__blue_glCore_glTexBufferARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexBufferARB] + .global bluegl_glCompileCommandListNV + .type bluegl_glCompileCommandListNV, %function +bluegl_glCompileCommandListNV: + adrp x16, :got:__blue_glCore_glCompileCommandListNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCompileCommandListNV] ldr x16, [x16] br x16 - .size bluegl_glTexBufferARB, .-bluegl_glTexBufferARB + .size bluegl_glCompileCommandListNV, .-bluegl_glCompileCommandListNV .align 2 - .global bluegl_glVertexAttribL2ui64vNV - .type bluegl_glVertexAttribL2ui64vNV, %function -bluegl_glVertexAttribL2ui64vNV: - adrp x16, :got:__blue_glCore_glVertexAttribL2ui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL2ui64vNV] + .global bluegl_glCallCommandListNV + .type bluegl_glCallCommandListNV, %function +bluegl_glCallCommandListNV: + adrp x16, :got:__blue_glCore_glCallCommandListNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCallCommandListNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL2ui64vNV, .-bluegl_glVertexAttribL2ui64vNV + .size bluegl_glCallCommandListNV, .-bluegl_glCallCommandListNV .align 2 - .global bluegl_glCreateBuffers - .type bluegl_glCreateBuffers, %function -bluegl_glCreateBuffers: - adrp x16, :got:__blue_glCore_glCreateBuffers - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateBuffers] + .global bluegl_glBeginConditionalRenderNV + .type bluegl_glBeginConditionalRenderNV, %function +bluegl_glBeginConditionalRenderNV: + adrp x16, :got:__blue_glCore_glBeginConditionalRenderNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginConditionalRenderNV] ldr x16, [x16] br x16 - .size bluegl_glCreateBuffers, .-bluegl_glCreateBuffers + .size bluegl_glBeginConditionalRenderNV, .-bluegl_glBeginConditionalRenderNV .align 2 - .global bluegl_glImageTransformParameterfvHP - .type bluegl_glImageTransformParameterfvHP, %function -bluegl_glImageTransformParameterfvHP: - adrp x16, :got:__blue_glCore_glImageTransformParameterfvHP - ldr x16, [x16, #:got_lo12:__blue_glCore_glImageTransformParameterfvHP] + .global bluegl_glEndConditionalRenderNV + .type bluegl_glEndConditionalRenderNV, %function +bluegl_glEndConditionalRenderNV: + adrp x16, :got:__blue_glCore_glEndConditionalRenderNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glEndConditionalRenderNV] ldr x16, [x16] br x16 - .size bluegl_glImageTransformParameterfvHP, .-bluegl_glImageTransformParameterfvHP + .size bluegl_glEndConditionalRenderNV, .-bluegl_glEndConditionalRenderNV .align 2 - .global bluegl_glUniform2d - .type bluegl_glUniform2d, %function -bluegl_glUniform2d: - adrp x16, :got:__blue_glCore_glUniform2d - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2d] + .global bluegl_glSubpixelPrecisionBiasNV + .type bluegl_glSubpixelPrecisionBiasNV, %function +bluegl_glSubpixelPrecisionBiasNV: + adrp x16, :got:__blue_glCore_glSubpixelPrecisionBiasNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glSubpixelPrecisionBiasNV] ldr x16, [x16] br x16 - .size bluegl_glUniform2d, .-bluegl_glUniform2d + .size bluegl_glSubpixelPrecisionBiasNV, .-bluegl_glSubpixelPrecisionBiasNV .align 2 - .global bluegl_glBufferStorage - .type bluegl_glBufferStorage, %function -bluegl_glBufferStorage: - adrp x16, :got:__blue_glCore_glBufferStorage - ldr x16, [x16, #:got_lo12:__blue_glCore_glBufferStorage] + .global bluegl_glConservativeRasterParameterfNV + .type bluegl_glConservativeRasterParameterfNV, %function +bluegl_glConservativeRasterParameterfNV: + adrp x16, :got:__blue_glCore_glConservativeRasterParameterfNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glConservativeRasterParameterfNV] ldr x16, [x16] br x16 - .size bluegl_glBufferStorage, .-bluegl_glBufferStorage + .size bluegl_glConservativeRasterParameterfNV, .-bluegl_glConservativeRasterParameterfNV .align 2 - .global bluegl_glGetTexFilterFuncSGIS - .type bluegl_glGetTexFilterFuncSGIS, %function -bluegl_glGetTexFilterFuncSGIS: - adrp x16, :got:__blue_glCore_glGetTexFilterFuncSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexFilterFuncSGIS] + .global bluegl_glCopyImageSubDataNV + .type bluegl_glCopyImageSubDataNV, %function +bluegl_glCopyImageSubDataNV: + adrp x16, :got:__blue_glCore_glCopyImageSubDataNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyImageSubDataNV] ldr x16, [x16] br x16 - .size bluegl_glGetTexFilterFuncSGIS, .-bluegl_glGetTexFilterFuncSGIS + .size bluegl_glCopyImageSubDataNV, .-bluegl_glCopyImageSubDataNV .align 2 - .global bluegl_glGetHandleARB - .type bluegl_glGetHandleARB, %function -bluegl_glGetHandleARB: - adrp x16, :got:__blue_glCore_glGetHandleARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetHandleARB] + .global bluegl_glDepthRangedNV + .type bluegl_glDepthRangedNV, %function +bluegl_glDepthRangedNV: + adrp x16, :got:__blue_glCore_glDepthRangedNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthRangedNV] ldr x16, [x16] br x16 - .size bluegl_glGetHandleARB, .-bluegl_glGetHandleARB + .size bluegl_glDepthRangedNV, .-bluegl_glDepthRangedNV .align 2 - .global bluegl_glGetHistogramParameterxvOES - .type bluegl_glGetHistogramParameterxvOES, %function -bluegl_glGetHistogramParameterxvOES: - adrp x16, :got:__blue_glCore_glGetHistogramParameterxvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetHistogramParameterxvOES] + .global bluegl_glClearDepthdNV + .type bluegl_glClearDepthdNV, %function +bluegl_glClearDepthdNV: + adrp x16, :got:__blue_glCore_glClearDepthdNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glClearDepthdNV] ldr x16, [x16] br x16 - .size bluegl_glGetHistogramParameterxvOES, .-bluegl_glGetHistogramParameterxvOES + .size bluegl_glClearDepthdNV, .-bluegl_glClearDepthdNV .align 2 - .global bluegl_glMultiTexCoord2d - .type bluegl_glMultiTexCoord2d, %function -bluegl_glMultiTexCoord2d: - adrp x16, :got:__blue_glCore_glMultiTexCoord2d - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2d] + .global bluegl_glDepthBoundsdNV + .type bluegl_glDepthBoundsdNV, %function +bluegl_glDepthBoundsdNV: + adrp x16, :got:__blue_glCore_glDepthBoundsdNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthBoundsdNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2d, .-bluegl_glMultiTexCoord2d + .size bluegl_glDepthBoundsdNV, .-bluegl_glDepthBoundsdNV .align 2 - .global bluegl_glVertex4hNV - .type bluegl_glVertex4hNV, %function -bluegl_glVertex4hNV: - adrp x16, :got:__blue_glCore_glVertex4hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex4hNV] + .global bluegl_glDrawTextureNV + .type bluegl_glDrawTextureNV, %function +bluegl_glDrawTextureNV: + adrp x16, :got:__blue_glCore_glDrawTextureNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawTextureNV] ldr x16, [x16] br x16 - .size bluegl_glVertex4hNV, .-bluegl_glVertex4hNV + .size bluegl_glDrawTextureNV, .-bluegl_glDrawTextureNV .align 2 - .global bluegl_glGetPerfMonitorGroupStringAMD - .type bluegl_glGetPerfMonitorGroupStringAMD, %function -bluegl_glGetPerfMonitorGroupStringAMD: - adrp x16, :got:__blue_glCore_glGetPerfMonitorGroupStringAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfMonitorGroupStringAMD] + .global bluegl_glMapControlPointsNV + .type bluegl_glMapControlPointsNV, %function +bluegl_glMapControlPointsNV: + adrp x16, :got:__blue_glCore_glMapControlPointsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMapControlPointsNV] ldr x16, [x16] br x16 - .size bluegl_glGetPerfMonitorGroupStringAMD, .-bluegl_glGetPerfMonitorGroupStringAMD + .size bluegl_glMapControlPointsNV, .-bluegl_glMapControlPointsNV .align 2 - .global bluegl_glCompressedTextureSubImage1D - .type bluegl_glCompressedTextureSubImage1D, %function -bluegl_glCompressedTextureSubImage1D: - adrp x16, :got:__blue_glCore_glCompressedTextureSubImage1D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTextureSubImage1D] + .global bluegl_glMapParameterivNV + .type bluegl_glMapParameterivNV, %function +bluegl_glMapParameterivNV: + adrp x16, :got:__blue_glCore_glMapParameterivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMapParameterivNV] ldr x16, [x16] br x16 - .size bluegl_glCompressedTextureSubImage1D, .-bluegl_glCompressedTextureSubImage1D + .size bluegl_glMapParameterivNV, .-bluegl_glMapParameterivNV .align 2 - .global bluegl_glIsFramebuffer - .type bluegl_glIsFramebuffer, %function -bluegl_glIsFramebuffer: - adrp x16, :got:__blue_glCore_glIsFramebuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsFramebuffer] + .global bluegl_glMapParameterfvNV + .type bluegl_glMapParameterfvNV, %function +bluegl_glMapParameterfvNV: + adrp x16, :got:__blue_glCore_glMapParameterfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMapParameterfvNV] ldr x16, [x16] br x16 - .size bluegl_glIsFramebuffer, .-bluegl_glIsFramebuffer + .size bluegl_glMapParameterfvNV, .-bluegl_glMapParameterfvNV .align 2 - .global bluegl_glUniform2dv - .type bluegl_glUniform2dv, %function -bluegl_glUniform2dv: - adrp x16, :got:__blue_glCore_glUniform2dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2dv] + .global bluegl_glGetMapControlPointsNV + .type bluegl_glGetMapControlPointsNV, %function +bluegl_glGetMapControlPointsNV: + adrp x16, :got:__blue_glCore_glGetMapControlPointsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMapControlPointsNV] ldr x16, [x16] br x16 - .size bluegl_glUniform2dv, .-bluegl_glUniform2dv + .size bluegl_glGetMapControlPointsNV, .-bluegl_glGetMapControlPointsNV .align 2 - .global bluegl_glVertexAttrib1dvARB - .type bluegl_glVertexAttrib1dvARB, %function -bluegl_glVertexAttrib1dvARB: - adrp x16, :got:__blue_glCore_glVertexAttrib1dvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1dvARB] + .global bluegl_glGetMapParameterivNV + .type bluegl_glGetMapParameterivNV, %function +bluegl_glGetMapParameterivNV: + adrp x16, :got:__blue_glCore_glGetMapParameterivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMapParameterivNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1dvARB, .-bluegl_glVertexAttrib1dvARB + .size bluegl_glGetMapParameterivNV, .-bluegl_glGetMapParameterivNV .align 2 - .global bluegl_glClientWaitSync - .type bluegl_glClientWaitSync, %function -bluegl_glClientWaitSync: - adrp x16, :got:__blue_glCore_glClientWaitSync - ldr x16, [x16, #:got_lo12:__blue_glCore_glClientWaitSync] + .global bluegl_glGetMapParameterfvNV + .type bluegl_glGetMapParameterfvNV, %function +bluegl_glGetMapParameterfvNV: + adrp x16, :got:__blue_glCore_glGetMapParameterfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMapParameterfvNV] ldr x16, [x16] br x16 - .size bluegl_glClientWaitSync, .-bluegl_glClientWaitSync + .size bluegl_glGetMapParameterfvNV, .-bluegl_glGetMapParameterfvNV .align 2 - .global bluegl_glProgramUniform4i64vARB - .type bluegl_glProgramUniform4i64vARB, %function -bluegl_glProgramUniform4i64vARB: - adrp x16, :got:__blue_glCore_glProgramUniform4i64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4i64vARB] + .global bluegl_glGetMapAttribParameterivNV + .type bluegl_glGetMapAttribParameterivNV, %function +bluegl_glGetMapAttribParameterivNV: + adrp x16, :got:__blue_glCore_glGetMapAttribParameterivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMapAttribParameterivNV] + ldr x16, [x16] + br x16 + .size bluegl_glGetMapAttribParameterivNV, .-bluegl_glGetMapAttribParameterivNV + + .align 2 + .global bluegl_glGetMapAttribParameterfvNV + .type bluegl_glGetMapAttribParameterfvNV, %function +bluegl_glGetMapAttribParameterfvNV: + adrp x16, :got:__blue_glCore_glGetMapAttribParameterfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMapAttribParameterfvNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4i64vARB, .-bluegl_glProgramUniform4i64vARB + .size bluegl_glGetMapAttribParameterfvNV, .-bluegl_glGetMapAttribParameterfvNV .align 2 - .global bluegl_glGetActiveAttribARB - .type bluegl_glGetActiveAttribARB, %function -bluegl_glGetActiveAttribARB: - adrp x16, :got:__blue_glCore_glGetActiveAttribARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveAttribARB] + .global bluegl_glEvalMapsNV + .type bluegl_glEvalMapsNV, %function +bluegl_glEvalMapsNV: + adrp x16, :got:__blue_glCore_glEvalMapsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glEvalMapsNV] ldr x16, [x16] br x16 - .size bluegl_glGetActiveAttribARB, .-bluegl_glGetActiveAttribARB + .size bluegl_glEvalMapsNV, .-bluegl_glEvalMapsNV .align 2 - .global bluegl_glCompressedTexImage3DARB - .type bluegl_glCompressedTexImage3DARB, %function -bluegl_glCompressedTexImage3DARB: - adrp x16, :got:__blue_glCore_glCompressedTexImage3DARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexImage3DARB] + .global bluegl_glGetMultisamplefvNV + .type bluegl_glGetMultisamplefvNV, %function +bluegl_glGetMultisamplefvNV: + adrp x16, :got:__blue_glCore_glGetMultisamplefvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultisamplefvNV] ldr x16, [x16] br x16 - .size bluegl_glCompressedTexImage3DARB, .-bluegl_glCompressedTexImage3DARB + .size bluegl_glGetMultisamplefvNV, .-bluegl_glGetMultisamplefvNV .align 2 - .global bluegl_glVertexAttribI2iEXT - .type bluegl_glVertexAttribI2iEXT, %function -bluegl_glVertexAttribI2iEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI2iEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI2iEXT] + .global bluegl_glSampleMaskIndexedNV + .type bluegl_glSampleMaskIndexedNV, %function +bluegl_glSampleMaskIndexedNV: + adrp x16, :got:__blue_glCore_glSampleMaskIndexedNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glSampleMaskIndexedNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI2iEXT, .-bluegl_glVertexAttribI2iEXT + .size bluegl_glSampleMaskIndexedNV, .-bluegl_glSampleMaskIndexedNV .align 2 - .global bluegl_glProgramNamedParameter4dNV - .type bluegl_glProgramNamedParameter4dNV, %function -bluegl_glProgramNamedParameter4dNV: - adrp x16, :got:__blue_glCore_glProgramNamedParameter4dNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramNamedParameter4dNV] + .global bluegl_glTexRenderbufferNV + .type bluegl_glTexRenderbufferNV, %function +bluegl_glTexRenderbufferNV: + adrp x16, :got:__blue_glCore_glTexRenderbufferNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexRenderbufferNV] ldr x16, [x16] br x16 - .size bluegl_glProgramNamedParameter4dNV, .-bluegl_glProgramNamedParameter4dNV + .size bluegl_glTexRenderbufferNV, .-bluegl_glTexRenderbufferNV .align 2 - .global bluegl_glProgramStringARB - .type bluegl_glProgramStringARB, %function -bluegl_glProgramStringARB: - adrp x16, :got:__blue_glCore_glProgramStringARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramStringARB] + .global bluegl_glDeleteFencesNV + .type bluegl_glDeleteFencesNV, %function +bluegl_glDeleteFencesNV: + adrp x16, :got:__blue_glCore_glDeleteFencesNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteFencesNV] ldr x16, [x16] br x16 - .size bluegl_glProgramStringARB, .-bluegl_glProgramStringARB + .size bluegl_glDeleteFencesNV, .-bluegl_glDeleteFencesNV .align 2 - .global bluegl_glWindowPos3fvMESA - .type bluegl_glWindowPos3fvMESA, %function -bluegl_glWindowPos3fvMESA: - adrp x16, :got:__blue_glCore_glWindowPos3fvMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3fvMESA] + .global bluegl_glGenFencesNV + .type bluegl_glGenFencesNV, %function +bluegl_glGenFencesNV: + adrp x16, :got:__blue_glCore_glGenFencesNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenFencesNV] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3fvMESA, .-bluegl_glWindowPos3fvMESA + .size bluegl_glGenFencesNV, .-bluegl_glGenFencesNV .align 2 - .global bluegl_glBlendFunciARB - .type bluegl_glBlendFunciARB, %function -bluegl_glBlendFunciARB: - adrp x16, :got:__blue_glCore_glBlendFunciARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendFunciARB] + .global bluegl_glIsFenceNV + .type bluegl_glIsFenceNV, %function +bluegl_glIsFenceNV: + adrp x16, :got:__blue_glCore_glIsFenceNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsFenceNV] ldr x16, [x16] br x16 - .size bluegl_glBlendFunciARB, .-bluegl_glBlendFunciARB + .size bluegl_glIsFenceNV, .-bluegl_glIsFenceNV .align 2 - .global bluegl_glVertexAttrib4dvNV - .type bluegl_glVertexAttrib4dvNV, %function -bluegl_glVertexAttrib4dvNV: - adrp x16, :got:__blue_glCore_glVertexAttrib4dvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4dvNV] + .global bluegl_glTestFenceNV + .type bluegl_glTestFenceNV, %function +bluegl_glTestFenceNV: + adrp x16, :got:__blue_glCore_glTestFenceNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTestFenceNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4dvNV, .-bluegl_glVertexAttrib4dvNV + .size bluegl_glTestFenceNV, .-bluegl_glTestFenceNV .align 2 - .global bluegl_glWindowPos3dvARB - .type bluegl_glWindowPos3dvARB, %function -bluegl_glWindowPos3dvARB: - adrp x16, :got:__blue_glCore_glWindowPos3dvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3dvARB] + .global bluegl_glGetFenceivNV + .type bluegl_glGetFenceivNV, %function +bluegl_glGetFenceivNV: + adrp x16, :got:__blue_glCore_glGetFenceivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFenceivNV] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3dvARB, .-bluegl_glWindowPos3dvARB + .size bluegl_glGetFenceivNV, .-bluegl_glGetFenceivNV .align 2 - .global bluegl_glMultiTexCoord1bvOES - .type bluegl_glMultiTexCoord1bvOES, %function -bluegl_glMultiTexCoord1bvOES: - adrp x16, :got:__blue_glCore_glMultiTexCoord1bvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1bvOES] + .global bluegl_glFinishFenceNV + .type bluegl_glFinishFenceNV, %function +bluegl_glFinishFenceNV: + adrp x16, :got:__blue_glCore_glFinishFenceNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glFinishFenceNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1bvOES, .-bluegl_glMultiTexCoord1bvOES + .size bluegl_glFinishFenceNV, .-bluegl_glFinishFenceNV .align 2 - .global bluegl_glVertexAttrib4fvARB - .type bluegl_glVertexAttrib4fvARB, %function -bluegl_glVertexAttrib4fvARB: - adrp x16, :got:__blue_glCore_glVertexAttrib4fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4fvARB] + .global bluegl_glSetFenceNV + .type bluegl_glSetFenceNV, %function +bluegl_glSetFenceNV: + adrp x16, :got:__blue_glCore_glSetFenceNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glSetFenceNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4fvARB, .-bluegl_glVertexAttrib4fvARB + .size bluegl_glSetFenceNV, .-bluegl_glSetFenceNV .align 2 - .global bluegl_glPopGroupMarkerEXT - .type bluegl_glPopGroupMarkerEXT, %function -bluegl_glPopGroupMarkerEXT: - adrp x16, :got:__blue_glCore_glPopGroupMarkerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glPopGroupMarkerEXT] + .global bluegl_glFragmentCoverageColorNV + .type bluegl_glFragmentCoverageColorNV, %function +bluegl_glFragmentCoverageColorNV: + adrp x16, :got:__blue_glCore_glFragmentCoverageColorNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentCoverageColorNV] ldr x16, [x16] br x16 - .size bluegl_glPopGroupMarkerEXT, .-bluegl_glPopGroupMarkerEXT + .size bluegl_glFragmentCoverageColorNV, .-bluegl_glFragmentCoverageColorNV .align 2 - .global bluegl_glMultiDrawElements - .type bluegl_glMultiDrawElements, %function -bluegl_glMultiDrawElements: - adrp x16, :got:__blue_glCore_glMultiDrawElements - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawElements] + .global bluegl_glProgramNamedParameter4fNV + .type bluegl_glProgramNamedParameter4fNV, %function +bluegl_glProgramNamedParameter4fNV: + adrp x16, :got:__blue_glCore_glProgramNamedParameter4fNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramNamedParameter4fNV] ldr x16, [x16] br x16 - .size bluegl_glMultiDrawElements, .-bluegl_glMultiDrawElements + .size bluegl_glProgramNamedParameter4fNV, .-bluegl_glProgramNamedParameter4fNV .align 2 - .global bluegl_glGetInstrumentsSGIX - .type bluegl_glGetInstrumentsSGIX, %function -bluegl_glGetInstrumentsSGIX: - adrp x16, :got:__blue_glCore_glGetInstrumentsSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInstrumentsSGIX] + .global bluegl_glProgramNamedParameter4fvNV + .type bluegl_glProgramNamedParameter4fvNV, %function +bluegl_glProgramNamedParameter4fvNV: + adrp x16, :got:__blue_glCore_glProgramNamedParameter4fvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramNamedParameter4fvNV] ldr x16, [x16] br x16 - .size bluegl_glGetInstrumentsSGIX, .-bluegl_glGetInstrumentsSGIX + .size bluegl_glProgramNamedParameter4fvNV, .-bluegl_glProgramNamedParameter4fvNV .align 2 - .global bluegl_glProgramUniform4dv - .type bluegl_glProgramUniform4dv, %function -bluegl_glProgramUniform4dv: - adrp x16, :got:__blue_glCore_glProgramUniform4dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4dv] + .global bluegl_glProgramNamedParameter4dNV + .type bluegl_glProgramNamedParameter4dNV, %function +bluegl_glProgramNamedParameter4dNV: + adrp x16, :got:__blue_glCore_glProgramNamedParameter4dNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramNamedParameter4dNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4dv, .-bluegl_glProgramUniform4dv + .size bluegl_glProgramNamedParameter4dNV, .-bluegl_glProgramNamedParameter4dNV .align 2 - .global bluegl_glColorTableEXT - .type bluegl_glColorTableEXT, %function -bluegl_glColorTableEXT: - adrp x16, :got:__blue_glCore_glColorTableEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorTableEXT] + .global bluegl_glProgramNamedParameter4dvNV + .type bluegl_glProgramNamedParameter4dvNV, %function +bluegl_glProgramNamedParameter4dvNV: + adrp x16, :got:__blue_glCore_glProgramNamedParameter4dvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramNamedParameter4dvNV] ldr x16, [x16] br x16 - .size bluegl_glColorTableEXT, .-bluegl_glColorTableEXT + .size bluegl_glProgramNamedParameter4dvNV, .-bluegl_glProgramNamedParameter4dvNV .align 2 - .global bluegl_glTexSubImage1D - .type bluegl_glTexSubImage1D, %function -bluegl_glTexSubImage1D: - adrp x16, :got:__blue_glCore_glTexSubImage1D - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexSubImage1D] + .global bluegl_glGetProgramNamedParameterfvNV + .type bluegl_glGetProgramNamedParameterfvNV, %function +bluegl_glGetProgramNamedParameterfvNV: + adrp x16, :got:__blue_glCore_glGetProgramNamedParameterfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramNamedParameterfvNV] ldr x16, [x16] br x16 - .size bluegl_glTexSubImage1D, .-bluegl_glTexSubImage1D + .size bluegl_glGetProgramNamedParameterfvNV, .-bluegl_glGetProgramNamedParameterfvNV .align 2 - .global bluegl_glBeginPerfMonitorAMD - .type bluegl_glBeginPerfMonitorAMD, %function -bluegl_glBeginPerfMonitorAMD: - adrp x16, :got:__blue_glCore_glBeginPerfMonitorAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginPerfMonitorAMD] + .global bluegl_glGetProgramNamedParameterdvNV + .type bluegl_glGetProgramNamedParameterdvNV, %function +bluegl_glGetProgramNamedParameterdvNV: + adrp x16, :got:__blue_glCore_glGetProgramNamedParameterdvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramNamedParameterdvNV] ldr x16, [x16] br x16 - .size bluegl_glBeginPerfMonitorAMD, .-bluegl_glBeginPerfMonitorAMD + .size bluegl_glGetProgramNamedParameterdvNV, .-bluegl_glGetProgramNamedParameterdvNV .align 2 - .global bluegl_glPointParameterfvSGIS - .type bluegl_glPointParameterfvSGIS, %function -bluegl_glPointParameterfvSGIS: - adrp x16, :got:__blue_glCore_glPointParameterfvSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterfvSGIS] + .global bluegl_glCoverageModulationTableNV + .type bluegl_glCoverageModulationTableNV, %function +bluegl_glCoverageModulationTableNV: + adrp x16, :got:__blue_glCore_glCoverageModulationTableNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCoverageModulationTableNV] ldr x16, [x16] br x16 - .size bluegl_glPointParameterfvSGIS, .-bluegl_glPointParameterfvSGIS + .size bluegl_glCoverageModulationTableNV, .-bluegl_glCoverageModulationTableNV .align 2 - .global bluegl_glGetImageTransformParameterfvHP - .type bluegl_glGetImageTransformParameterfvHP, %function -bluegl_glGetImageTransformParameterfvHP: - adrp x16, :got:__blue_glCore_glGetImageTransformParameterfvHP - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetImageTransformParameterfvHP] + .global bluegl_glGetCoverageModulationTableNV + .type bluegl_glGetCoverageModulationTableNV, %function +bluegl_glGetCoverageModulationTableNV: + adrp x16, :got:__blue_glCore_glGetCoverageModulationTableNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCoverageModulationTableNV] ldr x16, [x16] br x16 - .size bluegl_glGetImageTransformParameterfvHP, .-bluegl_glGetImageTransformParameterfvHP + .size bluegl_glGetCoverageModulationTableNV, .-bluegl_glGetCoverageModulationTableNV .align 2 - .global bluegl_glVertex3hvNV - .type bluegl_glVertex3hvNV, %function -bluegl_glVertex3hvNV: - adrp x16, :got:__blue_glCore_glVertex3hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex3hvNV] + .global bluegl_glCoverageModulationNV + .type bluegl_glCoverageModulationNV, %function +bluegl_glCoverageModulationNV: + adrp x16, :got:__blue_glCore_glCoverageModulationNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCoverageModulationNV] ldr x16, [x16] br x16 - .size bluegl_glVertex3hvNV, .-bluegl_glVertex3hvNV + .size bluegl_glCoverageModulationNV, .-bluegl_glCoverageModulationNV .align 2 - .global bluegl_glTexCoord4fVertex4fvSUN - .type bluegl_glTexCoord4fVertex4fvSUN, %function -bluegl_glTexCoord4fVertex4fvSUN: - adrp x16, :got:__blue_glCore_glTexCoord4fVertex4fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord4fVertex4fvSUN] + .global bluegl_glRenderbufferStorageMultisampleCoverageNV + .type bluegl_glRenderbufferStorageMultisampleCoverageNV, %function +bluegl_glRenderbufferStorageMultisampleCoverageNV: + adrp x16, :got:__blue_glCore_glRenderbufferStorageMultisampleCoverageNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glRenderbufferStorageMultisampleCoverageNV] ldr x16, [x16] br x16 - .size bluegl_glTexCoord4fVertex4fvSUN, .-bluegl_glTexCoord4fVertex4fvSUN + .size bluegl_glRenderbufferStorageMultisampleCoverageNV, .-bluegl_glRenderbufferStorageMultisampleCoverageNV .align 2 - .global bluegl_glCompressedTexSubImage1D - .type bluegl_glCompressedTexSubImage1D, %function -bluegl_glCompressedTexSubImage1D: - adrp x16, :got:__blue_glCore_glCompressedTexSubImage1D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexSubImage1D] + .global bluegl_glProgramVertexLimitNV + .type bluegl_glProgramVertexLimitNV, %function +bluegl_glProgramVertexLimitNV: + adrp x16, :got:__blue_glCore_glProgramVertexLimitNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramVertexLimitNV] ldr x16, [x16] br x16 - .size bluegl_glCompressedTexSubImage1D, .-bluegl_glCompressedTexSubImage1D + .size bluegl_glProgramVertexLimitNV, .-bluegl_glProgramVertexLimitNV .align 2 - .global bluegl_glWindowPos2dvMESA - .type bluegl_glWindowPos2dvMESA, %function -bluegl_glWindowPos2dvMESA: - adrp x16, :got:__blue_glCore_glWindowPos2dvMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2dvMESA] + .global bluegl_glFramebufferTextureEXT + .type bluegl_glFramebufferTextureEXT, %function +bluegl_glFramebufferTextureEXT: + adrp x16, :got:__blue_glCore_glFramebufferTextureEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTextureEXT] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2dvMESA, .-bluegl_glWindowPos2dvMESA + .size bluegl_glFramebufferTextureEXT, .-bluegl_glFramebufferTextureEXT .align 2 - .global bluegl_glGetSamplerParameteriv - .type bluegl_glGetSamplerParameteriv, %function -bluegl_glGetSamplerParameteriv: - adrp x16, :got:__blue_glCore_glGetSamplerParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSamplerParameteriv] + .global bluegl_glFramebufferTextureFaceEXT + .type bluegl_glFramebufferTextureFaceEXT, %function +bluegl_glFramebufferTextureFaceEXT: + adrp x16, :got:__blue_glCore_glFramebufferTextureFaceEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTextureFaceEXT] ldr x16, [x16] br x16 - .size bluegl_glGetSamplerParameteriv, .-bluegl_glGetSamplerParameteriv + .size bluegl_glFramebufferTextureFaceEXT, .-bluegl_glFramebufferTextureFaceEXT .align 2 - .global bluegl_glColorPointerListIBM - .type bluegl_glColorPointerListIBM, %function -bluegl_glColorPointerListIBM: - adrp x16, :got:__blue_glCore_glColorPointerListIBM - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorPointerListIBM] + .global bluegl_glProgramLocalParameterI4iNV + .type bluegl_glProgramLocalParameterI4iNV, %function +bluegl_glProgramLocalParameterI4iNV: + adrp x16, :got:__blue_glCore_glProgramLocalParameterI4iNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParameterI4iNV] ldr x16, [x16] br x16 - .size bluegl_glColorPointerListIBM, .-bluegl_glColorPointerListIBM + .size bluegl_glProgramLocalParameterI4iNV, .-bluegl_glProgramLocalParameterI4iNV .align 2 - .global bluegl_glGetFinalCombinerInputParameterivNV - .type bluegl_glGetFinalCombinerInputParameterivNV, %function -bluegl_glGetFinalCombinerInputParameterivNV: - adrp x16, :got:__blue_glCore_glGetFinalCombinerInputParameterivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFinalCombinerInputParameterivNV] + .global bluegl_glProgramLocalParameterI4ivNV + .type bluegl_glProgramLocalParameterI4ivNV, %function +bluegl_glProgramLocalParameterI4ivNV: + adrp x16, :got:__blue_glCore_glProgramLocalParameterI4ivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParameterI4ivNV] ldr x16, [x16] br x16 - .size bluegl_glGetFinalCombinerInputParameterivNV, .-bluegl_glGetFinalCombinerInputParameterivNV + .size bluegl_glProgramLocalParameterI4ivNV, .-bluegl_glProgramLocalParameterI4ivNV .align 2 - .global bluegl_glGetVertexAttribiv - .type bluegl_glGetVertexAttribiv, %function -bluegl_glGetVertexAttribiv: - adrp x16, :got:__blue_glCore_glGetVertexAttribiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribiv] + .global bluegl_glProgramLocalParametersI4ivNV + .type bluegl_glProgramLocalParametersI4ivNV, %function +bluegl_glProgramLocalParametersI4ivNV: + adrp x16, :got:__blue_glCore_glProgramLocalParametersI4ivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParametersI4ivNV] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribiv, .-bluegl_glGetVertexAttribiv + .size bluegl_glProgramLocalParametersI4ivNV, .-bluegl_glProgramLocalParametersI4ivNV .align 2 - .global bluegl_glGetTexImage - .type bluegl_glGetTexImage, %function -bluegl_glGetTexImage: - adrp x16, :got:__blue_glCore_glGetTexImage - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexImage] + .global bluegl_glProgramLocalParameterI4uiNV + .type bluegl_glProgramLocalParameterI4uiNV, %function +bluegl_glProgramLocalParameterI4uiNV: + adrp x16, :got:__blue_glCore_glProgramLocalParameterI4uiNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParameterI4uiNV] ldr x16, [x16] br x16 - .size bluegl_glGetTexImage, .-bluegl_glGetTexImage + .size bluegl_glProgramLocalParameterI4uiNV, .-bluegl_glProgramLocalParameterI4uiNV .align 2 - .global bluegl_glBufferSubData - .type bluegl_glBufferSubData, %function -bluegl_glBufferSubData: - adrp x16, :got:__blue_glCore_glBufferSubData - ldr x16, [x16, #:got_lo12:__blue_glCore_glBufferSubData] + .global bluegl_glProgramLocalParameterI4uivNV + .type bluegl_glProgramLocalParameterI4uivNV, %function +bluegl_glProgramLocalParameterI4uivNV: + adrp x16, :got:__blue_glCore_glProgramLocalParameterI4uivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParameterI4uivNV] ldr x16, [x16] br x16 - .size bluegl_glBufferSubData, .-bluegl_glBufferSubData + .size bluegl_glProgramLocalParameterI4uivNV, .-bluegl_glProgramLocalParameterI4uivNV .align 2 - .global bluegl_glVertexAttrib3sARB - .type bluegl_glVertexAttrib3sARB, %function -bluegl_glVertexAttrib3sARB: - adrp x16, :got:__blue_glCore_glVertexAttrib3sARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3sARB] + .global bluegl_glProgramLocalParametersI4uivNV + .type bluegl_glProgramLocalParametersI4uivNV, %function +bluegl_glProgramLocalParametersI4uivNV: + adrp x16, :got:__blue_glCore_glProgramLocalParametersI4uivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParametersI4uivNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3sARB, .-bluegl_glVertexAttrib3sARB + .size bluegl_glProgramLocalParametersI4uivNV, .-bluegl_glProgramLocalParametersI4uivNV .align 2 - .global bluegl_glIsTextureHandleResidentARB - .type bluegl_glIsTextureHandleResidentARB, %function -bluegl_glIsTextureHandleResidentARB: - adrp x16, :got:__blue_glCore_glIsTextureHandleResidentARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsTextureHandleResidentARB] + .global bluegl_glProgramEnvParameterI4iNV + .type bluegl_glProgramEnvParameterI4iNV, %function +bluegl_glProgramEnvParameterI4iNV: + adrp x16, :got:__blue_glCore_glProgramEnvParameterI4iNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParameterI4iNV] ldr x16, [x16] br x16 - .size bluegl_glIsTextureHandleResidentARB, .-bluegl_glIsTextureHandleResidentARB + .size bluegl_glProgramEnvParameterI4iNV, .-bluegl_glProgramEnvParameterI4iNV .align 2 - .global bluegl_glMultiTexCoord3i - .type bluegl_glMultiTexCoord3i, %function -bluegl_glMultiTexCoord3i: - adrp x16, :got:__blue_glCore_glMultiTexCoord3i - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3i] + .global bluegl_glProgramEnvParameterI4ivNV + .type bluegl_glProgramEnvParameterI4ivNV, %function +bluegl_glProgramEnvParameterI4ivNV: + adrp x16, :got:__blue_glCore_glProgramEnvParameterI4ivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParameterI4ivNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3i, .-bluegl_glMultiTexCoord3i + .size bluegl_glProgramEnvParameterI4ivNV, .-bluegl_glProgramEnvParameterI4ivNV .align 2 - .global bluegl_glLinkProgramARB - .type bluegl_glLinkProgramARB, %function -bluegl_glLinkProgramARB: - adrp x16, :got:__blue_glCore_glLinkProgramARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glLinkProgramARB] + .global bluegl_glProgramEnvParametersI4ivNV + .type bluegl_glProgramEnvParametersI4ivNV, %function +bluegl_glProgramEnvParametersI4ivNV: + adrp x16, :got:__blue_glCore_glProgramEnvParametersI4ivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParametersI4ivNV] ldr x16, [x16] br x16 - .size bluegl_glLinkProgramARB, .-bluegl_glLinkProgramARB + .size bluegl_glProgramEnvParametersI4ivNV, .-bluegl_glProgramEnvParametersI4ivNV .align 2 - .global bluegl_glIsProgramNV - .type bluegl_glIsProgramNV, %function -bluegl_glIsProgramNV: - adrp x16, :got:__blue_glCore_glIsProgramNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsProgramNV] + .global bluegl_glProgramEnvParameterI4uiNV + .type bluegl_glProgramEnvParameterI4uiNV, %function +bluegl_glProgramEnvParameterI4uiNV: + adrp x16, :got:__blue_glCore_glProgramEnvParameterI4uiNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParameterI4uiNV] ldr x16, [x16] br x16 - .size bluegl_glIsProgramNV, .-bluegl_glIsProgramNV + .size bluegl_glProgramEnvParameterI4uiNV, .-bluegl_glProgramEnvParameterI4uiNV .align 2 - .global bluegl_glVertexAttribI4i - .type bluegl_glVertexAttribI4i, %function -bluegl_glVertexAttribI4i: - adrp x16, :got:__blue_glCore_glVertexAttribI4i - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4i] + .global bluegl_glProgramEnvParameterI4uivNV + .type bluegl_glProgramEnvParameterI4uivNV, %function +bluegl_glProgramEnvParameterI4uivNV: + adrp x16, :got:__blue_glCore_glProgramEnvParameterI4uivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParameterI4uivNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI4i, .-bluegl_glVertexAttribI4i + .size bluegl_glProgramEnvParameterI4uivNV, .-bluegl_glProgramEnvParameterI4uivNV .align 2 - .global bluegl_glUniform1i - .type bluegl_glUniform1i, %function -bluegl_glUniform1i: - adrp x16, :got:__blue_glCore_glUniform1i - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1i] + .global bluegl_glProgramEnvParametersI4uivNV + .type bluegl_glProgramEnvParametersI4uivNV, %function +bluegl_glProgramEnvParametersI4uivNV: + adrp x16, :got:__blue_glCore_glProgramEnvParametersI4uivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParametersI4uivNV] ldr x16, [x16] br x16 - .size bluegl_glUniform1i, .-bluegl_glUniform1i + .size bluegl_glProgramEnvParametersI4uivNV, .-bluegl_glProgramEnvParametersI4uivNV .align 2 - .global bluegl_glBindAttribLocationARB - .type bluegl_glBindAttribLocationARB, %function -bluegl_glBindAttribLocationARB: - adrp x16, :got:__blue_glCore_glBindAttribLocationARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindAttribLocationARB] + .global bluegl_glGetProgramLocalParameterIivNV + .type bluegl_glGetProgramLocalParameterIivNV, %function +bluegl_glGetProgramLocalParameterIivNV: + adrp x16, :got:__blue_glCore_glGetProgramLocalParameterIivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramLocalParameterIivNV] ldr x16, [x16] br x16 - .size bluegl_glBindAttribLocationARB, .-bluegl_glBindAttribLocationARB + .size bluegl_glGetProgramLocalParameterIivNV, .-bluegl_glGetProgramLocalParameterIivNV .align 2 - .global bluegl_glProgramUniform4i64vNV - .type bluegl_glProgramUniform4i64vNV, %function -bluegl_glProgramUniform4i64vNV: - adrp x16, :got:__blue_glCore_glProgramUniform4i64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4i64vNV] + .global bluegl_glGetProgramLocalParameterIuivNV + .type bluegl_glGetProgramLocalParameterIuivNV, %function +bluegl_glGetProgramLocalParameterIuivNV: + adrp x16, :got:__blue_glCore_glGetProgramLocalParameterIuivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramLocalParameterIuivNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4i64vNV, .-bluegl_glProgramUniform4i64vNV + .size bluegl_glGetProgramLocalParameterIuivNV, .-bluegl_glGetProgramLocalParameterIuivNV .align 2 - .global bluegl_glVertex4xOES - .type bluegl_glVertex4xOES, %function -bluegl_glVertex4xOES: - adrp x16, :got:__blue_glCore_glVertex4xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex4xOES] + .global bluegl_glGetProgramEnvParameterIivNV + .type bluegl_glGetProgramEnvParameterIivNV, %function +bluegl_glGetProgramEnvParameterIivNV: + adrp x16, :got:__blue_glCore_glGetProgramEnvParameterIivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramEnvParameterIivNV] ldr x16, [x16] br x16 - .size bluegl_glVertex4xOES, .-bluegl_glVertex4xOES + .size bluegl_glGetProgramEnvParameterIivNV, .-bluegl_glGetProgramEnvParameterIivNV .align 2 - .global bluegl_glSetLocalConstantEXT - .type bluegl_glSetLocalConstantEXT, %function -bluegl_glSetLocalConstantEXT: - adrp x16, :got:__blue_glCore_glSetLocalConstantEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSetLocalConstantEXT] + .global bluegl_glGetProgramEnvParameterIuivNV + .type bluegl_glGetProgramEnvParameterIuivNV, %function +bluegl_glGetProgramEnvParameterIuivNV: + adrp x16, :got:__blue_glCore_glGetProgramEnvParameterIuivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramEnvParameterIuivNV] ldr x16, [x16] br x16 - .size bluegl_glSetLocalConstantEXT, .-bluegl_glSetLocalConstantEXT + .size bluegl_glGetProgramEnvParameterIuivNV, .-bluegl_glGetProgramEnvParameterIuivNV .align 2 - .global bluegl_glTexSubImage2D - .type bluegl_glTexSubImage2D, %function -bluegl_glTexSubImage2D: - adrp x16, :got:__blue_glCore_glTexSubImage2D - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexSubImage2D] + .global bluegl_glProgramSubroutineParametersuivNV + .type bluegl_glProgramSubroutineParametersuivNV, %function +bluegl_glProgramSubroutineParametersuivNV: + adrp x16, :got:__blue_glCore_glProgramSubroutineParametersuivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramSubroutineParametersuivNV] + ldr x16, [x16] + br x16 + .size bluegl_glProgramSubroutineParametersuivNV, .-bluegl_glProgramSubroutineParametersuivNV + + .align 2 + .global bluegl_glGetProgramSubroutineParameteruivNV + .type bluegl_glGetProgramSubroutineParameteruivNV, %function +bluegl_glGetProgramSubroutineParameteruivNV: + adrp x16, :got:__blue_glCore_glGetProgramSubroutineParameteruivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramSubroutineParameteruivNV] ldr x16, [x16] br x16 - .size bluegl_glTexSubImage2D, .-bluegl_glTexSubImage2D + .size bluegl_glGetProgramSubroutineParameteruivNV, .-bluegl_glGetProgramSubroutineParameteruivNV .align 2 - .global bluegl_glWindowPos2f - .type bluegl_glWindowPos2f, %function -bluegl_glWindowPos2f: - adrp x16, :got:__blue_glCore_glWindowPos2f - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2f] + .global bluegl_glVertex2hNV + .type bluegl_glVertex2hNV, %function +bluegl_glVertex2hNV: + adrp x16, :got:__blue_glCore_glVertex2hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex2hNV] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2f, .-bluegl_glWindowPos2f + .size bluegl_glVertex2hNV, .-bluegl_glVertex2hNV .align 2 - .global bluegl_glVariantPointerEXT - .type bluegl_glVariantPointerEXT, %function -bluegl_glVariantPointerEXT: - adrp x16, :got:__blue_glCore_glVariantPointerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantPointerEXT] + .global bluegl_glVertex2hvNV + .type bluegl_glVertex2hvNV, %function +bluegl_glVertex2hvNV: + adrp x16, :got:__blue_glCore_glVertex2hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex2hvNV] ldr x16, [x16] br x16 - .size bluegl_glVariantPointerEXT, .-bluegl_glVariantPointerEXT + .size bluegl_glVertex2hvNV, .-bluegl_glVertex2hvNV .align 2 - .global bluegl_glNamedRenderbufferStorageMultisample - .type bluegl_glNamedRenderbufferStorageMultisample, %function -bluegl_glNamedRenderbufferStorageMultisample: - adrp x16, :got:__blue_glCore_glNamedRenderbufferStorageMultisample - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedRenderbufferStorageMultisample] + .global bluegl_glVertex3hNV + .type bluegl_glVertex3hNV, %function +bluegl_glVertex3hNV: + adrp x16, :got:__blue_glCore_glVertex3hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex3hNV] ldr x16, [x16] br x16 - .size bluegl_glNamedRenderbufferStorageMultisample, .-bluegl_glNamedRenderbufferStorageMultisample + .size bluegl_glVertex3hNV, .-bluegl_glVertex3hNV .align 2 - .global bluegl_glFogCoorddvEXT - .type bluegl_glFogCoorddvEXT, %function -bluegl_glFogCoorddvEXT: - adrp x16, :got:__blue_glCore_glFogCoorddvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoorddvEXT] + .global bluegl_glVertex3hvNV + .type bluegl_glVertex3hvNV, %function +bluegl_glVertex3hvNV: + adrp x16, :got:__blue_glCore_glVertex3hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex3hvNV] ldr x16, [x16] br x16 - .size bluegl_glFogCoorddvEXT, .-bluegl_glFogCoorddvEXT + .size bluegl_glVertex3hvNV, .-bluegl_glVertex3hvNV .align 2 - .global bluegl_glMultiModeDrawArraysIBM - .type bluegl_glMultiModeDrawArraysIBM, %function -bluegl_glMultiModeDrawArraysIBM: - adrp x16, :got:__blue_glCore_glMultiModeDrawArraysIBM - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiModeDrawArraysIBM] + .global bluegl_glVertex4hNV + .type bluegl_glVertex4hNV, %function +bluegl_glVertex4hNV: + adrp x16, :got:__blue_glCore_glVertex4hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex4hNV] ldr x16, [x16] br x16 - .size bluegl_glMultiModeDrawArraysIBM, .-bluegl_glMultiModeDrawArraysIBM + .size bluegl_glVertex4hNV, .-bluegl_glVertex4hNV .align 2 - .global bluegl_glMatrixLoaddEXT - .type bluegl_glMatrixLoaddEXT, %function -bluegl_glMatrixLoaddEXT: - adrp x16, :got:__blue_glCore_glMatrixLoaddEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixLoaddEXT] + .global bluegl_glVertex4hvNV + .type bluegl_glVertex4hvNV, %function +bluegl_glVertex4hvNV: + adrp x16, :got:__blue_glCore_glVertex4hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex4hvNV] ldr x16, [x16] br x16 - .size bluegl_glMatrixLoaddEXT, .-bluegl_glMatrixLoaddEXT + .size bluegl_glVertex4hvNV, .-bluegl_glVertex4hvNV .align 2 - .global bluegl_glDeleteQueriesARB - .type bluegl_glDeleteQueriesARB, %function -bluegl_glDeleteQueriesARB: - adrp x16, :got:__blue_glCore_glDeleteQueriesARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteQueriesARB] + .global bluegl_glNormal3hNV + .type bluegl_glNormal3hNV, %function +bluegl_glNormal3hNV: + adrp x16, :got:__blue_glCore_glNormal3hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormal3hNV] ldr x16, [x16] br x16 - .size bluegl_glDeleteQueriesARB, .-bluegl_glDeleteQueriesARB + .size bluegl_glNormal3hNV, .-bluegl_glNormal3hNV .align 2 - .global bluegl_glUniform1fvARB - .type bluegl_glUniform1fvARB, %function -bluegl_glUniform1fvARB: - adrp x16, :got:__blue_glCore_glUniform1fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1fvARB] + .global bluegl_glNormal3hvNV + .type bluegl_glNormal3hvNV, %function +bluegl_glNormal3hvNV: + adrp x16, :got:__blue_glCore_glNormal3hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormal3hvNV] ldr x16, [x16] br x16 - .size bluegl_glUniform1fvARB, .-bluegl_glUniform1fvARB + .size bluegl_glNormal3hvNV, .-bluegl_glNormal3hvNV .align 2 - .global bluegl_glDrawCommandsNV - .type bluegl_glDrawCommandsNV, %function -bluegl_glDrawCommandsNV: - adrp x16, :got:__blue_glCore_glDrawCommandsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawCommandsNV] + .global bluegl_glColor3hNV + .type bluegl_glColor3hNV, %function +bluegl_glColor3hNV: + adrp x16, :got:__blue_glCore_glColor3hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glColor3hNV] ldr x16, [x16] br x16 - .size bluegl_glDrawCommandsNV, .-bluegl_glDrawCommandsNV + .size bluegl_glColor3hNV, .-bluegl_glColor3hNV .align 2 - .global bluegl_glSecondaryColor3dvEXT - .type bluegl_glSecondaryColor3dvEXT, %function -bluegl_glSecondaryColor3dvEXT: - adrp x16, :got:__blue_glCore_glSecondaryColor3dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3dvEXT] + .global bluegl_glColor3hvNV + .type bluegl_glColor3hvNV, %function +bluegl_glColor3hvNV: + adrp x16, :got:__blue_glCore_glColor3hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glColor3hvNV] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3dvEXT, .-bluegl_glSecondaryColor3dvEXT + .size bluegl_glColor3hvNV, .-bluegl_glColor3hvNV .align 2 - .global bluegl_glFlushVertexArrayRangeAPPLE - .type bluegl_glFlushVertexArrayRangeAPPLE, %function -bluegl_glFlushVertexArrayRangeAPPLE: - adrp x16, :got:__blue_glCore_glFlushVertexArrayRangeAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glFlushVertexArrayRangeAPPLE] + .global bluegl_glColor4hNV + .type bluegl_glColor4hNV, %function +bluegl_glColor4hNV: + adrp x16, :got:__blue_glCore_glColor4hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4hNV] ldr x16, [x16] br x16 - .size bluegl_glFlushVertexArrayRangeAPPLE, .-bluegl_glFlushVertexArrayRangeAPPLE + .size bluegl_glColor4hNV, .-bluegl_glColor4hNV .align 2 - .global bluegl_glTexEnvxvOES - .type bluegl_glTexEnvxvOES, %function -bluegl_glTexEnvxvOES: - adrp x16, :got:__blue_glCore_glTexEnvxvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexEnvxvOES] + .global bluegl_glColor4hvNV + .type bluegl_glColor4hvNV, %function +bluegl_glColor4hvNV: + adrp x16, :got:__blue_glCore_glColor4hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4hvNV] ldr x16, [x16] br x16 - .size bluegl_glTexEnvxvOES, .-bluegl_glTexEnvxvOES + .size bluegl_glColor4hvNV, .-bluegl_glColor4hvNV .align 2 - .global bluegl_glGetSeparableFilterEXT - .type bluegl_glGetSeparableFilterEXT, %function -bluegl_glGetSeparableFilterEXT: - adrp x16, :got:__blue_glCore_glGetSeparableFilterEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSeparableFilterEXT] + .global bluegl_glTexCoord1hNV + .type bluegl_glTexCoord1hNV, %function +bluegl_glTexCoord1hNV: + adrp x16, :got:__blue_glCore_glTexCoord1hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord1hNV] ldr x16, [x16] br x16 - .size bluegl_glGetSeparableFilterEXT, .-bluegl_glGetSeparableFilterEXT + .size bluegl_glTexCoord1hNV, .-bluegl_glTexCoord1hNV .align 2 - .global bluegl_glVertexAttribI4bvEXT - .type bluegl_glVertexAttribI4bvEXT, %function -bluegl_glVertexAttribI4bvEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI4bvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4bvEXT] + .global bluegl_glTexCoord1hvNV + .type bluegl_glTexCoord1hvNV, %function +bluegl_glTexCoord1hvNV: + adrp x16, :got:__blue_glCore_glTexCoord1hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord1hvNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI4bvEXT, .-bluegl_glVertexAttribI4bvEXT + .size bluegl_glTexCoord1hvNV, .-bluegl_glTexCoord1hvNV .align 2 - .global bluegl_glUniform3i64NV - .type bluegl_glUniform3i64NV, %function -bluegl_glUniform3i64NV: - adrp x16, :got:__blue_glCore_glUniform3i64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3i64NV] + .global bluegl_glTexCoord2hNV + .type bluegl_glTexCoord2hNV, %function +bluegl_glTexCoord2hNV: + adrp x16, :got:__blue_glCore_glTexCoord2hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2hNV] ldr x16, [x16] br x16 - .size bluegl_glUniform3i64NV, .-bluegl_glUniform3i64NV + .size bluegl_glTexCoord2hNV, .-bluegl_glTexCoord2hNV .align 2 - .global bluegl_glBlendEquationIndexedAMD - .type bluegl_glBlendEquationIndexedAMD, %function -bluegl_glBlendEquationIndexedAMD: - adrp x16, :got:__blue_glCore_glBlendEquationIndexedAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquationIndexedAMD] + .global bluegl_glTexCoord2hvNV + .type bluegl_glTexCoord2hvNV, %function +bluegl_glTexCoord2hvNV: + adrp x16, :got:__blue_glCore_glTexCoord2hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2hvNV] ldr x16, [x16] br x16 - .size bluegl_glBlendEquationIndexedAMD, .-bluegl_glBlendEquationIndexedAMD + .size bluegl_glTexCoord2hvNV, .-bluegl_glTexCoord2hvNV .align 2 - .global bluegl_glPointParameterf - .type bluegl_glPointParameterf, %function -bluegl_glPointParameterf: - adrp x16, :got:__blue_glCore_glPointParameterf - ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterf] + .global bluegl_glTexCoord3hNV + .type bluegl_glTexCoord3hNV, %function +bluegl_glTexCoord3hNV: + adrp x16, :got:__blue_glCore_glTexCoord3hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord3hNV] ldr x16, [x16] br x16 - .size bluegl_glPointParameterf, .-bluegl_glPointParameterf + .size bluegl_glTexCoord3hNV, .-bluegl_glTexCoord3hNV .align 2 - .global bluegl_glVertex4bvOES - .type bluegl_glVertex4bvOES, %function -bluegl_glVertex4bvOES: - adrp x16, :got:__blue_glCore_glVertex4bvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex4bvOES] + .global bluegl_glTexCoord3hvNV + .type bluegl_glTexCoord3hvNV, %function +bluegl_glTexCoord3hvNV: + adrp x16, :got:__blue_glCore_glTexCoord3hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord3hvNV] ldr x16, [x16] br x16 - .size bluegl_glVertex4bvOES, .-bluegl_glVertex4bvOES + .size bluegl_glTexCoord3hvNV, .-bluegl_glTexCoord3hvNV .align 2 - .global bluegl_glStencilThenCoverFillPathNV - .type bluegl_glStencilThenCoverFillPathNV, %function -bluegl_glStencilThenCoverFillPathNV: - adrp x16, :got:__blue_glCore_glStencilThenCoverFillPathNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilThenCoverFillPathNV] + .global bluegl_glTexCoord4hNV + .type bluegl_glTexCoord4hNV, %function +bluegl_glTexCoord4hNV: + adrp x16, :got:__blue_glCore_glTexCoord4hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord4hNV] ldr x16, [x16] br x16 - .size bluegl_glStencilThenCoverFillPathNV, .-bluegl_glStencilThenCoverFillPathNV + .size bluegl_glTexCoord4hNV, .-bluegl_glTexCoord4hNV .align 2 - .global bluegl_glCompressedTextureImage2DEXT - .type bluegl_glCompressedTextureImage2DEXT, %function -bluegl_glCompressedTextureImage2DEXT: - adrp x16, :got:__blue_glCore_glCompressedTextureImage2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTextureImage2DEXT] + .global bluegl_glTexCoord4hvNV + .type bluegl_glTexCoord4hvNV, %function +bluegl_glTexCoord4hvNV: + adrp x16, :got:__blue_glCore_glTexCoord4hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord4hvNV] ldr x16, [x16] br x16 - .size bluegl_glCompressedTextureImage2DEXT, .-bluegl_glCompressedTextureImage2DEXT + .size bluegl_glTexCoord4hvNV, .-bluegl_glTexCoord4hvNV .align 2 - .global bluegl_glBlendEquationSeparate - .type bluegl_glBlendEquationSeparate, %function -bluegl_glBlendEquationSeparate: - adrp x16, :got:__blue_glCore_glBlendEquationSeparate - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlendEquationSeparate] + .global bluegl_glMultiTexCoord1hNV + .type bluegl_glMultiTexCoord1hNV, %function +bluegl_glMultiTexCoord1hNV: + adrp x16, :got:__blue_glCore_glMultiTexCoord1hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1hNV] ldr x16, [x16] br x16 - .size bluegl_glBlendEquationSeparate, .-bluegl_glBlendEquationSeparate + .size bluegl_glMultiTexCoord1hNV, .-bluegl_glMultiTexCoord1hNV .align 2 - .global bluegl_glGetNamedFramebufferParameteriv - .type bluegl_glGetNamedFramebufferParameteriv, %function -bluegl_glGetNamedFramebufferParameteriv: - adrp x16, :got:__blue_glCore_glGetNamedFramebufferParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedFramebufferParameteriv] + .global bluegl_glMultiTexCoord1hvNV + .type bluegl_glMultiTexCoord1hvNV, %function +bluegl_glMultiTexCoord1hvNV: + adrp x16, :got:__blue_glCore_glMultiTexCoord1hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1hvNV] ldr x16, [x16] br x16 - .size bluegl_glGetNamedFramebufferParameteriv, .-bluegl_glGetNamedFramebufferParameteriv + .size bluegl_glMultiTexCoord1hvNV, .-bluegl_glMultiTexCoord1hvNV .align 2 - .global bluegl_glTexImage3DEXT - .type bluegl_glTexImage3DEXT, %function -bluegl_glTexImage3DEXT: - adrp x16, :got:__blue_glCore_glTexImage3DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexImage3DEXT] + .global bluegl_glMultiTexCoord2hNV + .type bluegl_glMultiTexCoord2hNV, %function +bluegl_glMultiTexCoord2hNV: + adrp x16, :got:__blue_glCore_glMultiTexCoord2hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2hNV] ldr x16, [x16] br x16 - .size bluegl_glTexImage3DEXT, .-bluegl_glTexImage3DEXT + .size bluegl_glMultiTexCoord2hNV, .-bluegl_glMultiTexCoord2hNV .align 2 - .global bluegl_glColorFragmentOp3ATI - .type bluegl_glColorFragmentOp3ATI, %function -bluegl_glColorFragmentOp3ATI: - adrp x16, :got:__blue_glCore_glColorFragmentOp3ATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorFragmentOp3ATI] + .global bluegl_glMultiTexCoord2hvNV + .type bluegl_glMultiTexCoord2hvNV, %function +bluegl_glMultiTexCoord2hvNV: + adrp x16, :got:__blue_glCore_glMultiTexCoord2hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2hvNV] ldr x16, [x16] br x16 - .size bluegl_glColorFragmentOp3ATI, .-bluegl_glColorFragmentOp3ATI + .size bluegl_glMultiTexCoord2hvNV, .-bluegl_glMultiTexCoord2hvNV .align 2 - .global bluegl_glNormalPointerListIBM - .type bluegl_glNormalPointerListIBM, %function -bluegl_glNormalPointerListIBM: - adrp x16, :got:__blue_glCore_glNormalPointerListIBM - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalPointerListIBM] + .global bluegl_glMultiTexCoord3hNV + .type bluegl_glMultiTexCoord3hNV, %function +bluegl_glMultiTexCoord3hNV: + adrp x16, :got:__blue_glCore_glMultiTexCoord3hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3hNV] ldr x16, [x16] br x16 - .size bluegl_glNormalPointerListIBM, .-bluegl_glNormalPointerListIBM + .size bluegl_glMultiTexCoord3hNV, .-bluegl_glMultiTexCoord3hNV .align 2 - .global bluegl_glTexParameteriv - .type bluegl_glTexParameteriv, %function -bluegl_glTexParameteriv: - adrp x16, :got:__blue_glCore_glTexParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameteriv] + .global bluegl_glMultiTexCoord3hvNV + .type bluegl_glMultiTexCoord3hvNV, %function +bluegl_glMultiTexCoord3hvNV: + adrp x16, :got:__blue_glCore_glMultiTexCoord3hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3hvNV] ldr x16, [x16] br x16 - .size bluegl_glTexParameteriv, .-bluegl_glTexParameteriv + .size bluegl_glMultiTexCoord3hvNV, .-bluegl_glMultiTexCoord3hvNV .align 2 - .global bluegl_glCompressedTexSubImage2D - .type bluegl_glCompressedTexSubImage2D, %function -bluegl_glCompressedTexSubImage2D: - adrp x16, :got:__blue_glCore_glCompressedTexSubImage2D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexSubImage2D] + .global bluegl_glMultiTexCoord4hNV + .type bluegl_glMultiTexCoord4hNV, %function +bluegl_glMultiTexCoord4hNV: + adrp x16, :got:__blue_glCore_glMultiTexCoord4hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4hNV] ldr x16, [x16] br x16 - .size bluegl_glCompressedTexSubImage2D, .-bluegl_glCompressedTexSubImage2D + .size bluegl_glMultiTexCoord4hNV, .-bluegl_glMultiTexCoord4hNV .align 2 - .global bluegl_glCoverFillPathNV - .type bluegl_glCoverFillPathNV, %function -bluegl_glCoverFillPathNV: - adrp x16, :got:__blue_glCore_glCoverFillPathNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCoverFillPathNV] + .global bluegl_glMultiTexCoord4hvNV + .type bluegl_glMultiTexCoord4hvNV, %function +bluegl_glMultiTexCoord4hvNV: + adrp x16, :got:__blue_glCore_glMultiTexCoord4hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4hvNV] ldr x16, [x16] br x16 - .size bluegl_glCoverFillPathNV, .-bluegl_glCoverFillPathNV + .size bluegl_glMultiTexCoord4hvNV, .-bluegl_glMultiTexCoord4hvNV .align 2 - .global bluegl_glProgramUniformMatrix4x2dvEXT - .type bluegl_glProgramUniformMatrix4x2dvEXT, %function -bluegl_glProgramUniformMatrix4x2dvEXT: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix4x2dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4x2dvEXT] + .global bluegl_glFogCoordhNV + .type bluegl_glFogCoordhNV, %function +bluegl_glFogCoordhNV: + adrp x16, :got:__blue_glCore_glFogCoordhNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordhNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix4x2dvEXT, .-bluegl_glProgramUniformMatrix4x2dvEXT + .size bluegl_glFogCoordhNV, .-bluegl_glFogCoordhNV .align 2 - .global bluegl_glVertexAttrib1f - .type bluegl_glVertexAttrib1f, %function -bluegl_glVertexAttrib1f: - adrp x16, :got:__blue_glCore_glVertexAttrib1f - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1f] + .global bluegl_glFogCoordhvNV + .type bluegl_glFogCoordhvNV, %function +bluegl_glFogCoordhvNV: + adrp x16, :got:__blue_glCore_glFogCoordhvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordhvNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1f, .-bluegl_glVertexAttrib1f + .size bluegl_glFogCoordhvNV, .-bluegl_glFogCoordhvNV .align 2 - .global bluegl_glAlphaFragmentOp3ATI - .type bluegl_glAlphaFragmentOp3ATI, %function -bluegl_glAlphaFragmentOp3ATI: - adrp x16, :got:__blue_glCore_glAlphaFragmentOp3ATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glAlphaFragmentOp3ATI] + .global bluegl_glSecondaryColor3hNV + .type bluegl_glSecondaryColor3hNV, %function +bluegl_glSecondaryColor3hNV: + adrp x16, :got:__blue_glCore_glSecondaryColor3hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3hNV] ldr x16, [x16] br x16 - .size bluegl_glAlphaFragmentOp3ATI, .-bluegl_glAlphaFragmentOp3ATI + .size bluegl_glSecondaryColor3hNV, .-bluegl_glSecondaryColor3hNV .align 2 - .global bluegl_glBeginQueryIndexed - .type bluegl_glBeginQueryIndexed, %function -bluegl_glBeginQueryIndexed: - adrp x16, :got:__blue_glCore_glBeginQueryIndexed - ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginQueryIndexed] + .global bluegl_glSecondaryColor3hvNV + .type bluegl_glSecondaryColor3hvNV, %function +bluegl_glSecondaryColor3hvNV: + adrp x16, :got:__blue_glCore_glSecondaryColor3hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3hvNV] ldr x16, [x16] br x16 - .size bluegl_glBeginQueryIndexed, .-bluegl_glBeginQueryIndexed + .size bluegl_glSecondaryColor3hvNV, .-bluegl_glSecondaryColor3hvNV .align 2 - .global bluegl_glProgramUniformMatrix2x3fv - .type bluegl_glProgramUniformMatrix2x3fv, %function -bluegl_glProgramUniformMatrix2x3fv: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix2x3fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix2x3fv] + .global bluegl_glVertexWeighthNV + .type bluegl_glVertexWeighthNV, %function +bluegl_glVertexWeighthNV: + adrp x16, :got:__blue_glCore_glVertexWeighthNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexWeighthNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix2x3fv, .-bluegl_glProgramUniformMatrix2x3fv + .size bluegl_glVertexWeighthNV, .-bluegl_glVertexWeighthNV .align 2 - .global bluegl_glProgramUniform4ui64vNV - .type bluegl_glProgramUniform4ui64vNV, %function -bluegl_glProgramUniform4ui64vNV: - adrp x16, :got:__blue_glCore_glProgramUniform4ui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4ui64vNV] + .global bluegl_glVertexWeighthvNV + .type bluegl_glVertexWeighthvNV, %function +bluegl_glVertexWeighthvNV: + adrp x16, :got:__blue_glCore_glVertexWeighthvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexWeighthvNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4ui64vNV, .-bluegl_glProgramUniform4ui64vNV + .size bluegl_glVertexWeighthvNV, .-bluegl_glVertexWeighthvNV .align 2 - .global bluegl_glUniform1ui64NV - .type bluegl_glUniform1ui64NV, %function -bluegl_glUniform1ui64NV: - adrp x16, :got:__blue_glCore_glUniform1ui64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1ui64NV] + .global bluegl_glVertexAttrib1hNV + .type bluegl_glVertexAttrib1hNV, %function +bluegl_glVertexAttrib1hNV: + adrp x16, :got:__blue_glCore_glVertexAttrib1hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1hNV] ldr x16, [x16] br x16 - .size bluegl_glUniform1ui64NV, .-bluegl_glUniform1ui64NV + .size bluegl_glVertexAttrib1hNV, .-bluegl_glVertexAttrib1hNV .align 2 - .global bluegl_glMultiTexCoord3svARB - .type bluegl_glMultiTexCoord3svARB, %function -bluegl_glMultiTexCoord3svARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord3svARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3svARB] + .global bluegl_glVertexAttrib1hvNV + .type bluegl_glVertexAttrib1hvNV, %function +bluegl_glVertexAttrib1hvNV: + adrp x16, :got:__blue_glCore_glVertexAttrib1hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1hvNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3svARB, .-bluegl_glMultiTexCoord3svARB + .size bluegl_glVertexAttrib1hvNV, .-bluegl_glVertexAttrib1hvNV .align 2 - .global bluegl_glWeightivARB - .type bluegl_glWeightivARB, %function -bluegl_glWeightivARB: - adrp x16, :got:__blue_glCore_glWeightivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightivARB] + .global bluegl_glVertexAttrib2hNV + .type bluegl_glVertexAttrib2hNV, %function +bluegl_glVertexAttrib2hNV: + adrp x16, :got:__blue_glCore_glVertexAttrib2hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2hNV] ldr x16, [x16] br x16 - .size bluegl_glWeightivARB, .-bluegl_glWeightivARB + .size bluegl_glVertexAttrib2hNV, .-bluegl_glVertexAttrib2hNV .align 2 - .global bluegl_glMultiTexCoord4xOES - .type bluegl_glMultiTexCoord4xOES, %function -bluegl_glMultiTexCoord4xOES: - adrp x16, :got:__blue_glCore_glMultiTexCoord4xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4xOES] + .global bluegl_glVertexAttrib2hvNV + .type bluegl_glVertexAttrib2hvNV, %function +bluegl_glVertexAttrib2hvNV: + adrp x16, :got:__blue_glCore_glVertexAttrib2hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2hvNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4xOES, .-bluegl_glMultiTexCoord4xOES + .size bluegl_glVertexAttrib2hvNV, .-bluegl_glVertexAttrib2hvNV .align 2 - .global bluegl_glVertexAttribL2i64NV - .type bluegl_glVertexAttribL2i64NV, %function -bluegl_glVertexAttribL2i64NV: - adrp x16, :got:__blue_glCore_glVertexAttribL2i64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL2i64NV] + .global bluegl_glVertexAttrib3hNV + .type bluegl_glVertexAttrib3hNV, %function +bluegl_glVertexAttrib3hNV: + adrp x16, :got:__blue_glCore_glVertexAttrib3hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3hNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL2i64NV, .-bluegl_glVertexAttribL2i64NV + .size bluegl_glVertexAttrib3hNV, .-bluegl_glVertexAttrib3hNV .align 2 - .global bluegl_glProgramUniformMatrix3x4dv - .type bluegl_glProgramUniformMatrix3x4dv, %function -bluegl_glProgramUniformMatrix3x4dv: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix3x4dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix3x4dv] + .global bluegl_glVertexAttrib3hvNV + .type bluegl_glVertexAttrib3hvNV, %function +bluegl_glVertexAttrib3hvNV: + adrp x16, :got:__blue_glCore_glVertexAttrib3hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3hvNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix3x4dv, .-bluegl_glProgramUniformMatrix3x4dv + .size bluegl_glVertexAttrib3hvNV, .-bluegl_glVertexAttrib3hvNV .align 2 - .global bluegl_glProgramParameteriEXT - .type bluegl_glProgramParameteriEXT, %function -bluegl_glProgramParameteriEXT: - adrp x16, :got:__blue_glCore_glProgramParameteriEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramParameteriEXT] + .global bluegl_glVertexAttrib4hNV + .type bluegl_glVertexAttrib4hNV, %function +bluegl_glVertexAttrib4hNV: + adrp x16, :got:__blue_glCore_glVertexAttrib4hNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4hNV] ldr x16, [x16] br x16 - .size bluegl_glProgramParameteriEXT, .-bluegl_glProgramParameteriEXT + .size bluegl_glVertexAttrib4hNV, .-bluegl_glVertexAttrib4hNV .align 2 - .global bluegl_glSecondaryColor3sEXT - .type bluegl_glSecondaryColor3sEXT, %function -bluegl_glSecondaryColor3sEXT: - adrp x16, :got:__blue_glCore_glSecondaryColor3sEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3sEXT] + .global bluegl_glVertexAttrib4hvNV + .type bluegl_glVertexAttrib4hvNV, %function +bluegl_glVertexAttrib4hvNV: + adrp x16, :got:__blue_glCore_glVertexAttrib4hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4hvNV] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3sEXT, .-bluegl_glSecondaryColor3sEXT + .size bluegl_glVertexAttrib4hvNV, .-bluegl_glVertexAttrib4hvNV .align 2 - .global bluegl_glCompressedTextureSubImage3DEXT - .type bluegl_glCompressedTextureSubImage3DEXT, %function -bluegl_glCompressedTextureSubImage3DEXT: - adrp x16, :got:__blue_glCore_glCompressedTextureSubImage3DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTextureSubImage3DEXT] + .global bluegl_glVertexAttribs1hvNV + .type bluegl_glVertexAttribs1hvNV, %function +bluegl_glVertexAttribs1hvNV: + adrp x16, :got:__blue_glCore_glVertexAttribs1hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs1hvNV] ldr x16, [x16] br x16 - .size bluegl_glCompressedTextureSubImage3DEXT, .-bluegl_glCompressedTextureSubImage3DEXT + .size bluegl_glVertexAttribs1hvNV, .-bluegl_glVertexAttribs1hvNV .align 2 - .global bluegl_glGetPointervEXT - .type bluegl_glGetPointervEXT, %function -bluegl_glGetPointervEXT: - adrp x16, :got:__blue_glCore_glGetPointervEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPointervEXT] + .global bluegl_glVertexAttribs2hvNV + .type bluegl_glVertexAttribs2hvNV, %function +bluegl_glVertexAttribs2hvNV: + adrp x16, :got:__blue_glCore_glVertexAttribs2hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs2hvNV] ldr x16, [x16] br x16 - .size bluegl_glGetPointervEXT, .-bluegl_glGetPointervEXT + .size bluegl_glVertexAttribs2hvNV, .-bluegl_glVertexAttribs2hvNV .align 2 - .global bluegl_glGetMinmaxParameterfvEXT - .type bluegl_glGetMinmaxParameterfvEXT, %function -bluegl_glGetMinmaxParameterfvEXT: - adrp x16, :got:__blue_glCore_glGetMinmaxParameterfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMinmaxParameterfvEXT] + .global bluegl_glVertexAttribs3hvNV + .type bluegl_glVertexAttribs3hvNV, %function +bluegl_glVertexAttribs3hvNV: + adrp x16, :got:__blue_glCore_glVertexAttribs3hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs3hvNV] ldr x16, [x16] br x16 - .size bluegl_glGetMinmaxParameterfvEXT, .-bluegl_glGetMinmaxParameterfvEXT + .size bluegl_glVertexAttribs3hvNV, .-bluegl_glVertexAttribs3hvNV .align 2 - .global bluegl_glMultiTexCoord4sARB - .type bluegl_glMultiTexCoord4sARB, %function -bluegl_glMultiTexCoord4sARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord4sARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4sARB] + .global bluegl_glVertexAttribs4hvNV + .type bluegl_glVertexAttribs4hvNV, %function +bluegl_glVertexAttribs4hvNV: + adrp x16, :got:__blue_glCore_glVertexAttribs4hvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs4hvNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4sARB, .-bluegl_glMultiTexCoord4sARB + .size bluegl_glVertexAttribs4hvNV, .-bluegl_glVertexAttribs4hvNV .align 2 - .global bluegl_glDrawElementsInstancedBaseVertexBaseInstance - .type bluegl_glDrawElementsInstancedBaseVertexBaseInstance, %function -bluegl_glDrawElementsInstancedBaseVertexBaseInstance: - adrp x16, :got:__blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance] + .global bluegl_glGetInternalformatSampleivNV + .type bluegl_glGetInternalformatSampleivNV, %function +bluegl_glGetInternalformatSampleivNV: + adrp x16, :got:__blue_glCore_glGetInternalformatSampleivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInternalformatSampleivNV] ldr x16, [x16] br x16 - .size bluegl_glDrawElementsInstancedBaseVertexBaseInstance, .-bluegl_glDrawElementsInstancedBaseVertexBaseInstance + .size bluegl_glGetInternalformatSampleivNV, .-bluegl_glGetInternalformatSampleivNV .align 2 - .global bluegl_glVDPAUSurfaceAccessNV - .type bluegl_glVDPAUSurfaceAccessNV, %function -bluegl_glVDPAUSurfaceAccessNV: - adrp x16, :got:__blue_glCore_glVDPAUSurfaceAccessNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAUSurfaceAccessNV] + .global bluegl_glGenOcclusionQueriesNV + .type bluegl_glGenOcclusionQueriesNV, %function +bluegl_glGenOcclusionQueriesNV: + adrp x16, :got:__blue_glCore_glGenOcclusionQueriesNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenOcclusionQueriesNV] ldr x16, [x16] br x16 - .size bluegl_glVDPAUSurfaceAccessNV, .-bluegl_glVDPAUSurfaceAccessNV + .size bluegl_glGenOcclusionQueriesNV, .-bluegl_glGenOcclusionQueriesNV .align 2 - .global bluegl_glMultiTexCoord2iARB - .type bluegl_glMultiTexCoord2iARB, %function -bluegl_glMultiTexCoord2iARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord2iARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2iARB] + .global bluegl_glDeleteOcclusionQueriesNV + .type bluegl_glDeleteOcclusionQueriesNV, %function +bluegl_glDeleteOcclusionQueriesNV: + adrp x16, :got:__blue_glCore_glDeleteOcclusionQueriesNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteOcclusionQueriesNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2iARB, .-bluegl_glMultiTexCoord2iARB + .size bluegl_glDeleteOcclusionQueriesNV, .-bluegl_glDeleteOcclusionQueriesNV .align 2 - .global bluegl_glPathCommandsNV - .type bluegl_glPathCommandsNV, %function -bluegl_glPathCommandsNV: - adrp x16, :got:__blue_glCore_glPathCommandsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathCommandsNV] + .global bluegl_glIsOcclusionQueryNV + .type bluegl_glIsOcclusionQueryNV, %function +bluegl_glIsOcclusionQueryNV: + adrp x16, :got:__blue_glCore_glIsOcclusionQueryNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsOcclusionQueryNV] ldr x16, [x16] br x16 - .size bluegl_glPathCommandsNV, .-bluegl_glPathCommandsNV + .size bluegl_glIsOcclusionQueryNV, .-bluegl_glIsOcclusionQueryNV .align 2 - .global bluegl_glSetMultisamplefvAMD - .type bluegl_glSetMultisamplefvAMD, %function -bluegl_glSetMultisamplefvAMD: - adrp x16, :got:__blue_glCore_glSetMultisamplefvAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glSetMultisamplefvAMD] + .global bluegl_glBeginOcclusionQueryNV + .type bluegl_glBeginOcclusionQueryNV, %function +bluegl_glBeginOcclusionQueryNV: + adrp x16, :got:__blue_glCore_glBeginOcclusionQueryNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginOcclusionQueryNV] ldr x16, [x16] br x16 - .size bluegl_glSetMultisamplefvAMD, .-bluegl_glSetMultisamplefvAMD + .size bluegl_glBeginOcclusionQueryNV, .-bluegl_glBeginOcclusionQueryNV .align 2 - .global bluegl_glVertexStream3ivATI - .type bluegl_glVertexStream3ivATI, %function -bluegl_glVertexStream3ivATI: - adrp x16, :got:__blue_glCore_glVertexStream3ivATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream3ivATI] + .global bluegl_glEndOcclusionQueryNV + .type bluegl_glEndOcclusionQueryNV, %function +bluegl_glEndOcclusionQueryNV: + adrp x16, :got:__blue_glCore_glEndOcclusionQueryNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glEndOcclusionQueryNV] ldr x16, [x16] br x16 - .size bluegl_glVertexStream3ivATI, .-bluegl_glVertexStream3ivATI + .size bluegl_glEndOcclusionQueryNV, .-bluegl_glEndOcclusionQueryNV .align 2 - .global bluegl_glVDPAUUnregisterSurfaceNV - .type bluegl_glVDPAUUnregisterSurfaceNV, %function -bluegl_glVDPAUUnregisterSurfaceNV: - adrp x16, :got:__blue_glCore_glVDPAUUnregisterSurfaceNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAUUnregisterSurfaceNV] + .global bluegl_glGetOcclusionQueryivNV + .type bluegl_glGetOcclusionQueryivNV, %function +bluegl_glGetOcclusionQueryivNV: + adrp x16, :got:__blue_glCore_glGetOcclusionQueryivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetOcclusionQueryivNV] ldr x16, [x16] br x16 - .size bluegl_glVDPAUUnregisterSurfaceNV, .-bluegl_glVDPAUUnregisterSurfaceNV + .size bluegl_glGetOcclusionQueryivNV, .-bluegl_glGetOcclusionQueryivNV .align 2 - .global bluegl_glTextureRenderbufferEXT - .type bluegl_glTextureRenderbufferEXT, %function -bluegl_glTextureRenderbufferEXT: - adrp x16, :got:__blue_glCore_glTextureRenderbufferEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureRenderbufferEXT] + .global bluegl_glGetOcclusionQueryuivNV + .type bluegl_glGetOcclusionQueryuivNV, %function +bluegl_glGetOcclusionQueryuivNV: + adrp x16, :got:__blue_glCore_glGetOcclusionQueryuivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetOcclusionQueryuivNV] ldr x16, [x16] br x16 - .size bluegl_glTextureRenderbufferEXT, .-bluegl_glTextureRenderbufferEXT + .size bluegl_glGetOcclusionQueryuivNV, .-bluegl_glGetOcclusionQueryuivNV .align 2 - .global bluegl_glProgramLocalParameter4dARB - .type bluegl_glProgramLocalParameter4dARB, %function -bluegl_glProgramLocalParameter4dARB: - adrp x16, :got:__blue_glCore_glProgramLocalParameter4dARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParameter4dARB] + .global bluegl_glProgramBufferParametersfvNV + .type bluegl_glProgramBufferParametersfvNV, %function +bluegl_glProgramBufferParametersfvNV: + adrp x16, :got:__blue_glCore_glProgramBufferParametersfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramBufferParametersfvNV] ldr x16, [x16] br x16 - .size bluegl_glProgramLocalParameter4dARB, .-bluegl_glProgramLocalParameter4dARB + .size bluegl_glProgramBufferParametersfvNV, .-bluegl_glProgramBufferParametersfvNV .align 2 - .global bluegl_glBindVertexShaderEXT - .type bluegl_glBindVertexShaderEXT, %function -bluegl_glBindVertexShaderEXT: - adrp x16, :got:__blue_glCore_glBindVertexShaderEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindVertexShaderEXT] + .global bluegl_glProgramBufferParametersIivNV + .type bluegl_glProgramBufferParametersIivNV, %function +bluegl_glProgramBufferParametersIivNV: + adrp x16, :got:__blue_glCore_glProgramBufferParametersIivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramBufferParametersIivNV] ldr x16, [x16] br x16 - .size bluegl_glBindVertexShaderEXT, .-bluegl_glBindVertexShaderEXT + .size bluegl_glProgramBufferParametersIivNV, .-bluegl_glProgramBufferParametersIivNV .align 2 - .global bluegl_glEnableVariantClientStateEXT - .type bluegl_glEnableVariantClientStateEXT, %function -bluegl_glEnableVariantClientStateEXT: - adrp x16, :got:__blue_glCore_glEnableVariantClientStateEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableVariantClientStateEXT] + .global bluegl_glProgramBufferParametersIuivNV + .type bluegl_glProgramBufferParametersIuivNV, %function +bluegl_glProgramBufferParametersIuivNV: + adrp x16, :got:__blue_glCore_glProgramBufferParametersIuivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramBufferParametersIuivNV] ldr x16, [x16] br x16 - .size bluegl_glEnableVariantClientStateEXT, .-bluegl_glEnableVariantClientStateEXT + .size bluegl_glProgramBufferParametersIuivNV, .-bluegl_glProgramBufferParametersIuivNV .align 2 - .global bluegl_glGetPointerIndexedvEXT - .type bluegl_glGetPointerIndexedvEXT, %function -bluegl_glGetPointerIndexedvEXT: - adrp x16, :got:__blue_glCore_glGetPointerIndexedvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPointerIndexedvEXT] + .global bluegl_glGenPathsNV + .type bluegl_glGenPathsNV, %function +bluegl_glGenPathsNV: + adrp x16, :got:__blue_glCore_glGenPathsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenPathsNV] ldr x16, [x16] br x16 - .size bluegl_glGetPointerIndexedvEXT, .-bluegl_glGetPointerIndexedvEXT + .size bluegl_glGenPathsNV, .-bluegl_glGenPathsNV .align 2 - .global bluegl_glMultiTexEnvfEXT - .type bluegl_glMultiTexEnvfEXT, %function -bluegl_glMultiTexEnvfEXT: - adrp x16, :got:__blue_glCore_glMultiTexEnvfEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexEnvfEXT] + .global bluegl_glDeletePathsNV + .type bluegl_glDeletePathsNV, %function +bluegl_glDeletePathsNV: + adrp x16, :got:__blue_glCore_glDeletePathsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeletePathsNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexEnvfEXT, .-bluegl_glMultiTexEnvfEXT + .size bluegl_glDeletePathsNV, .-bluegl_glDeletePathsNV .align 2 - .global bluegl_glFrustumxOES - .type bluegl_glFrustumxOES, %function -bluegl_glFrustumxOES: - adrp x16, :got:__blue_glCore_glFrustumxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glFrustumxOES] + .global bluegl_glIsPathNV + .type bluegl_glIsPathNV, %function +bluegl_glIsPathNV: + adrp x16, :got:__blue_glCore_glIsPathNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsPathNV] ldr x16, [x16] br x16 - .size bluegl_glFrustumxOES, .-bluegl_glFrustumxOES + .size bluegl_glIsPathNV, .-bluegl_glIsPathNV .align 2 - .global bluegl_glAreProgramsResidentNV - .type bluegl_glAreProgramsResidentNV, %function -bluegl_glAreProgramsResidentNV: - adrp x16, :got:__blue_glCore_glAreProgramsResidentNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glAreProgramsResidentNV] + .global bluegl_glPathCommandsNV + .type bluegl_glPathCommandsNV, %function +bluegl_glPathCommandsNV: + adrp x16, :got:__blue_glCore_glPathCommandsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathCommandsNV] ldr x16, [x16] br x16 - .size bluegl_glAreProgramsResidentNV, .-bluegl_glAreProgramsResidentNV + .size bluegl_glPathCommandsNV, .-bluegl_glPathCommandsNV .align 2 - .global bluegl_glFramebufferSampleLocationsfvNV - .type bluegl_glFramebufferSampleLocationsfvNV, %function -bluegl_glFramebufferSampleLocationsfvNV: - adrp x16, :got:__blue_glCore_glFramebufferSampleLocationsfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferSampleLocationsfvNV] + .global bluegl_glPathCoordsNV + .type bluegl_glPathCoordsNV, %function +bluegl_glPathCoordsNV: + adrp x16, :got:__blue_glCore_glPathCoordsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathCoordsNV] ldr x16, [x16] br x16 - .size bluegl_glFramebufferSampleLocationsfvNV, .-bluegl_glFramebufferSampleLocationsfvNV + .size bluegl_glPathCoordsNV, .-bluegl_glPathCoordsNV .align 2 - .global bluegl_glVertexAttrib1sNV - .type bluegl_glVertexAttrib1sNV, %function -bluegl_glVertexAttrib1sNV: - adrp x16, :got:__blue_glCore_glVertexAttrib1sNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1sNV] + .global bluegl_glPathSubCommandsNV + .type bluegl_glPathSubCommandsNV, %function +bluegl_glPathSubCommandsNV: + adrp x16, :got:__blue_glCore_glPathSubCommandsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathSubCommandsNV] + ldr x16, [x16] + br x16 + .size bluegl_glPathSubCommandsNV, .-bluegl_glPathSubCommandsNV + + .align 2 + .global bluegl_glPathSubCoordsNV + .type bluegl_glPathSubCoordsNV, %function +bluegl_glPathSubCoordsNV: + adrp x16, :got:__blue_glCore_glPathSubCoordsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathSubCoordsNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1sNV, .-bluegl_glVertexAttrib1sNV + .size bluegl_glPathSubCoordsNV, .-bluegl_glPathSubCoordsNV .align 2 - .global bluegl_glGetActiveUniformBlockName - .type bluegl_glGetActiveUniformBlockName, %function -bluegl_glGetActiveUniformBlockName: - adrp x16, :got:__blue_glCore_glGetActiveUniformBlockName - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveUniformBlockName] + .global bluegl_glPathStringNV + .type bluegl_glPathStringNV, %function +bluegl_glPathStringNV: + adrp x16, :got:__blue_glCore_glPathStringNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathStringNV] ldr x16, [x16] br x16 - .size bluegl_glGetActiveUniformBlockName, .-bluegl_glGetActiveUniformBlockName + .size bluegl_glPathStringNV, .-bluegl_glPathStringNV .align 2 - .global bluegl_glVertex2xOES - .type bluegl_glVertex2xOES, %function -bluegl_glVertex2xOES: - adrp x16, :got:__blue_glCore_glVertex2xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex2xOES] + .global bluegl_glPathGlyphsNV + .type bluegl_glPathGlyphsNV, %function +bluegl_glPathGlyphsNV: + adrp x16, :got:__blue_glCore_glPathGlyphsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathGlyphsNV] ldr x16, [x16] br x16 - .size bluegl_glVertex2xOES, .-bluegl_glVertex2xOES + .size bluegl_glPathGlyphsNV, .-bluegl_glPathGlyphsNV .align 2 - .global bluegl_glResetMinmaxEXT - .type bluegl_glResetMinmaxEXT, %function -bluegl_glResetMinmaxEXT: - adrp x16, :got:__blue_glCore_glResetMinmaxEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glResetMinmaxEXT] + .global bluegl_glPathGlyphRangeNV + .type bluegl_glPathGlyphRangeNV, %function +bluegl_glPathGlyphRangeNV: + adrp x16, :got:__blue_glCore_glPathGlyphRangeNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathGlyphRangeNV] ldr x16, [x16] br x16 - .size bluegl_glResetMinmaxEXT, .-bluegl_glResetMinmaxEXT + .size bluegl_glPathGlyphRangeNV, .-bluegl_glPathGlyphRangeNV .align 2 - .global bluegl_glMatrixOrthoEXT - .type bluegl_glMatrixOrthoEXT, %function -bluegl_glMatrixOrthoEXT: - adrp x16, :got:__blue_glCore_glMatrixOrthoEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixOrthoEXT] + .global bluegl_glWeightPathsNV + .type bluegl_glWeightPathsNV, %function +bluegl_glWeightPathsNV: + adrp x16, :got:__blue_glCore_glWeightPathsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightPathsNV] ldr x16, [x16] br x16 - .size bluegl_glMatrixOrthoEXT, .-bluegl_glMatrixOrthoEXT + .size bluegl_glWeightPathsNV, .-bluegl_glWeightPathsNV .align 2 - .global bluegl_glUniform4ui64vNV - .type bluegl_glUniform4ui64vNV, %function -bluegl_glUniform4ui64vNV: - adrp x16, :got:__blue_glCore_glUniform4ui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4ui64vNV] + .global bluegl_glCopyPathNV + .type bluegl_glCopyPathNV, %function +bluegl_glCopyPathNV: + adrp x16, :got:__blue_glCore_glCopyPathNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyPathNV] ldr x16, [x16] br x16 - .size bluegl_glUniform4ui64vNV, .-bluegl_glUniform4ui64vNV + .size bluegl_glCopyPathNV, .-bluegl_glCopyPathNV .align 2 - .global bluegl_glProgramUniformMatrix4x3fvEXT - .type bluegl_glProgramUniformMatrix4x3fvEXT, %function -bluegl_glProgramUniformMatrix4x3fvEXT: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix4x3fvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4x3fvEXT] + .global bluegl_glInterpolatePathsNV + .type bluegl_glInterpolatePathsNV, %function +bluegl_glInterpolatePathsNV: + adrp x16, :got:__blue_glCore_glInterpolatePathsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glInterpolatePathsNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix4x3fvEXT, .-bluegl_glProgramUniformMatrix4x3fvEXT + .size bluegl_glInterpolatePathsNV, .-bluegl_glInterpolatePathsNV .align 2 - .global bluegl_glVertexAttribs1svNV - .type bluegl_glVertexAttribs1svNV, %function -bluegl_glVertexAttribs1svNV: - adrp x16, :got:__blue_glCore_glVertexAttribs1svNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs1svNV] + .global bluegl_glTransformPathNV + .type bluegl_glTransformPathNV, %function +bluegl_glTransformPathNV: + adrp x16, :got:__blue_glCore_glTransformPathNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTransformPathNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribs1svNV, .-bluegl_glVertexAttribs1svNV + .size bluegl_glTransformPathNV, .-bluegl_glTransformPathNV .align 2 - .global bluegl_glDebugMessageCallbackAMD - .type bluegl_glDebugMessageCallbackAMD, %function -bluegl_glDebugMessageCallbackAMD: - adrp x16, :got:__blue_glCore_glDebugMessageCallbackAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glDebugMessageCallbackAMD] + .global bluegl_glPathParameterivNV + .type bluegl_glPathParameterivNV, %function +bluegl_glPathParameterivNV: + adrp x16, :got:__blue_glCore_glPathParameterivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathParameterivNV] ldr x16, [x16] br x16 - .size bluegl_glDebugMessageCallbackAMD, .-bluegl_glDebugMessageCallbackAMD + .size bluegl_glPathParameterivNV, .-bluegl_glPathParameterivNV .align 2 - .global bluegl_glProgramUniform1uiEXT - .type bluegl_glProgramUniform1uiEXT, %function -bluegl_glProgramUniform1uiEXT: - adrp x16, :got:__blue_glCore_glProgramUniform1uiEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1uiEXT] + .global bluegl_glPathParameteriNV + .type bluegl_glPathParameteriNV, %function +bluegl_glPathParameteriNV: + adrp x16, :got:__blue_glCore_glPathParameteriNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathParameteriNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1uiEXT, .-bluegl_glProgramUniform1uiEXT + .size bluegl_glPathParameteriNV, .-bluegl_glPathParameteriNV .align 2 - .global bluegl_glTexBufferEXT - .type bluegl_glTexBufferEXT, %function -bluegl_glTexBufferEXT: - adrp x16, :got:__blue_glCore_glTexBufferEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexBufferEXT] + .global bluegl_glPathParameterfvNV + .type bluegl_glPathParameterfvNV, %function +bluegl_glPathParameterfvNV: + adrp x16, :got:__blue_glCore_glPathParameterfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathParameterfvNV] ldr x16, [x16] br x16 - .size bluegl_glTexBufferEXT, .-bluegl_glTexBufferEXT + .size bluegl_glPathParameterfvNV, .-bluegl_glPathParameterfvNV .align 2 - .global bluegl_glUniform4f - .type bluegl_glUniform4f, %function -bluegl_glUniform4f: - adrp x16, :got:__blue_glCore_glUniform4f - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4f] + .global bluegl_glPathParameterfNV + .type bluegl_glPathParameterfNV, %function +bluegl_glPathParameterfNV: + adrp x16, :got:__blue_glCore_glPathParameterfNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathParameterfNV] ldr x16, [x16] br x16 - .size bluegl_glUniform4f, .-bluegl_glUniform4f + .size bluegl_glPathParameterfNV, .-bluegl_glPathParameterfNV .align 2 - .global bluegl_glUpdateObjectBufferATI - .type bluegl_glUpdateObjectBufferATI, %function -bluegl_glUpdateObjectBufferATI: - adrp x16, :got:__blue_glCore_glUpdateObjectBufferATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glUpdateObjectBufferATI] + .global bluegl_glPathDashArrayNV + .type bluegl_glPathDashArrayNV, %function +bluegl_glPathDashArrayNV: + adrp x16, :got:__blue_glCore_glPathDashArrayNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathDashArrayNV] ldr x16, [x16] br x16 - .size bluegl_glUpdateObjectBufferATI, .-bluegl_glUpdateObjectBufferATI + .size bluegl_glPathDashArrayNV, .-bluegl_glPathDashArrayNV .align 2 - .global bluegl_glProgramUniform1iEXT - .type bluegl_glProgramUniform1iEXT, %function -bluegl_glProgramUniform1iEXT: - adrp x16, :got:__blue_glCore_glProgramUniform1iEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1iEXT] + .global bluegl_glPathStencilFuncNV + .type bluegl_glPathStencilFuncNV, %function +bluegl_glPathStencilFuncNV: + adrp x16, :got:__blue_glCore_glPathStencilFuncNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathStencilFuncNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1iEXT, .-bluegl_glProgramUniform1iEXT + .size bluegl_glPathStencilFuncNV, .-bluegl_glPathStencilFuncNV .align 2 - .global bluegl_glGetMultiTexEnvfvEXT - .type bluegl_glGetMultiTexEnvfvEXT, %function -bluegl_glGetMultiTexEnvfvEXT: - adrp x16, :got:__blue_glCore_glGetMultiTexEnvfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexEnvfvEXT] + .global bluegl_glPathStencilDepthOffsetNV + .type bluegl_glPathStencilDepthOffsetNV, %function +bluegl_glPathStencilDepthOffsetNV: + adrp x16, :got:__blue_glCore_glPathStencilDepthOffsetNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathStencilDepthOffsetNV] ldr x16, [x16] br x16 - .size bluegl_glGetMultiTexEnvfvEXT, .-bluegl_glGetMultiTexEnvfvEXT + .size bluegl_glPathStencilDepthOffsetNV, .-bluegl_glPathStencilDepthOffsetNV .align 2 - .global bluegl_glVertexAttribL2d - .type bluegl_glVertexAttribL2d, %function -bluegl_glVertexAttribL2d: - adrp x16, :got:__blue_glCore_glVertexAttribL2d - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL2d] + .global bluegl_glStencilFillPathNV + .type bluegl_glStencilFillPathNV, %function +bluegl_glStencilFillPathNV: + adrp x16, :got:__blue_glCore_glStencilFillPathNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilFillPathNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL2d, .-bluegl_glVertexAttribL2d + .size bluegl_glStencilFillPathNV, .-bluegl_glStencilFillPathNV .align 2 - .global bluegl_glConvolutionParameterxOES - .type bluegl_glConvolutionParameterxOES, %function -bluegl_glConvolutionParameterxOES: - adrp x16, :got:__blue_glCore_glConvolutionParameterxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameterxOES] + .global bluegl_glStencilStrokePathNV + .type bluegl_glStencilStrokePathNV, %function +bluegl_glStencilStrokePathNV: + adrp x16, :got:__blue_glCore_glStencilStrokePathNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilStrokePathNV] ldr x16, [x16] br x16 - .size bluegl_glConvolutionParameterxOES, .-bluegl_glConvolutionParameterxOES + .size bluegl_glStencilStrokePathNV, .-bluegl_glStencilStrokePathNV .align 2 - .global bluegl_glGetVertexAttribArrayObjectivATI - .type bluegl_glGetVertexAttribArrayObjectivATI, %function -bluegl_glGetVertexAttribArrayObjectivATI: - adrp x16, :got:__blue_glCore_glGetVertexAttribArrayObjectivATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribArrayObjectivATI] + .global bluegl_glStencilFillPathInstancedNV + .type bluegl_glStencilFillPathInstancedNV, %function +bluegl_glStencilFillPathInstancedNV: + adrp x16, :got:__blue_glCore_glStencilFillPathInstancedNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilFillPathInstancedNV] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribArrayObjectivATI, .-bluegl_glGetVertexAttribArrayObjectivATI + .size bluegl_glStencilFillPathInstancedNV, .-bluegl_glStencilFillPathInstancedNV .align 2 - .global bluegl_glGetListParameterfvSGIX - .type bluegl_glGetListParameterfvSGIX, %function -bluegl_glGetListParameterfvSGIX: - adrp x16, :got:__blue_glCore_glGetListParameterfvSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetListParameterfvSGIX] + .global bluegl_glStencilStrokePathInstancedNV + .type bluegl_glStencilStrokePathInstancedNV, %function +bluegl_glStencilStrokePathInstancedNV: + adrp x16, :got:__blue_glCore_glStencilStrokePathInstancedNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilStrokePathInstancedNV] ldr x16, [x16] br x16 - .size bluegl_glGetListParameterfvSGIX, .-bluegl_glGetListParameterfvSGIX + .size bluegl_glStencilStrokePathInstancedNV, .-bluegl_glStencilStrokePathInstancedNV .align 2 - .global bluegl_glInstrumentsBufferSGIX - .type bluegl_glInstrumentsBufferSGIX, %function -bluegl_glInstrumentsBufferSGIX: - adrp x16, :got:__blue_glCore_glInstrumentsBufferSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glInstrumentsBufferSGIX] + .global bluegl_glPathCoverDepthFuncNV + .type bluegl_glPathCoverDepthFuncNV, %function +bluegl_glPathCoverDepthFuncNV: + adrp x16, :got:__blue_glCore_glPathCoverDepthFuncNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathCoverDepthFuncNV] ldr x16, [x16] br x16 - .size bluegl_glInstrumentsBufferSGIX, .-bluegl_glInstrumentsBufferSGIX + .size bluegl_glPathCoverDepthFuncNV, .-bluegl_glPathCoverDepthFuncNV .align 2 - .global bluegl_glDeleteNamesAMD - .type bluegl_glDeleteNamesAMD, %function -bluegl_glDeleteNamesAMD: - adrp x16, :got:__blue_glCore_glDeleteNamesAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteNamesAMD] + .global bluegl_glCoverFillPathNV + .type bluegl_glCoverFillPathNV, %function +bluegl_glCoverFillPathNV: + adrp x16, :got:__blue_glCore_glCoverFillPathNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCoverFillPathNV] ldr x16, [x16] br x16 - .size bluegl_glDeleteNamesAMD, .-bluegl_glDeleteNamesAMD + .size bluegl_glCoverFillPathNV, .-bluegl_glCoverFillPathNV .align 2 - .global bluegl_glGetSubroutineIndex - .type bluegl_glGetSubroutineIndex, %function -bluegl_glGetSubroutineIndex: - adrp x16, :got:__blue_glCore_glGetSubroutineIndex - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSubroutineIndex] + .global bluegl_glCoverStrokePathNV + .type bluegl_glCoverStrokePathNV, %function +bluegl_glCoverStrokePathNV: + adrp x16, :got:__blue_glCore_glCoverStrokePathNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCoverStrokePathNV] ldr x16, [x16] br x16 - .size bluegl_glGetSubroutineIndex, .-bluegl_glGetSubroutineIndex + .size bluegl_glCoverStrokePathNV, .-bluegl_glCoverStrokePathNV .align 2 - .global bluegl_glVideoCaptureStreamParameterivNV - .type bluegl_glVideoCaptureStreamParameterivNV, %function -bluegl_glVideoCaptureStreamParameterivNV: - adrp x16, :got:__blue_glCore_glVideoCaptureStreamParameterivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVideoCaptureStreamParameterivNV] + .global bluegl_glCoverFillPathInstancedNV + .type bluegl_glCoverFillPathInstancedNV, %function +bluegl_glCoverFillPathInstancedNV: + adrp x16, :got:__blue_glCore_glCoverFillPathInstancedNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCoverFillPathInstancedNV] ldr x16, [x16] br x16 - .size bluegl_glVideoCaptureStreamParameterivNV, .-bluegl_glVideoCaptureStreamParameterivNV + .size bluegl_glCoverFillPathInstancedNV, .-bluegl_glCoverFillPathInstancedNV .align 2 - .global bluegl_glMultiTexCoord4i - .type bluegl_glMultiTexCoord4i, %function -bluegl_glMultiTexCoord4i: - adrp x16, :got:__blue_glCore_glMultiTexCoord4i - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4i] + .global bluegl_glCoverStrokePathInstancedNV + .type bluegl_glCoverStrokePathInstancedNV, %function +bluegl_glCoverStrokePathInstancedNV: + adrp x16, :got:__blue_glCore_glCoverStrokePathInstancedNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCoverStrokePathInstancedNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4i, .-bluegl_glMultiTexCoord4i + .size bluegl_glCoverStrokePathInstancedNV, .-bluegl_glCoverStrokePathInstancedNV .align 2 - .global bluegl_glGetFramebufferParameteriv - .type bluegl_glGetFramebufferParameteriv, %function -bluegl_glGetFramebufferParameteriv: - adrp x16, :got:__blue_glCore_glGetFramebufferParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFramebufferParameteriv] + .global bluegl_glGetPathParameterivNV + .type bluegl_glGetPathParameterivNV, %function +bluegl_glGetPathParameterivNV: + adrp x16, :got:__blue_glCore_glGetPathParameterivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathParameterivNV] ldr x16, [x16] br x16 - .size bluegl_glGetFramebufferParameteriv, .-bluegl_glGetFramebufferParameteriv + .size bluegl_glGetPathParameterivNV, .-bluegl_glGetPathParameterivNV .align 2 - .global bluegl_glVertexAttrib2hvNV - .type bluegl_glVertexAttrib2hvNV, %function -bluegl_glVertexAttrib2hvNV: - adrp x16, :got:__blue_glCore_glVertexAttrib2hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2hvNV] + .global bluegl_glGetPathParameterfvNV + .type bluegl_glGetPathParameterfvNV, %function +bluegl_glGetPathParameterfvNV: + adrp x16, :got:__blue_glCore_glGetPathParameterfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathParameterfvNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2hvNV, .-bluegl_glVertexAttrib2hvNV + .size bluegl_glGetPathParameterfvNV, .-bluegl_glGetPathParameterfvNV .align 2 - .global bluegl_glMakeBufferNonResidentNV - .type bluegl_glMakeBufferNonResidentNV, %function -bluegl_glMakeBufferNonResidentNV: - adrp x16, :got:__blue_glCore_glMakeBufferNonResidentNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeBufferNonResidentNV] + .global bluegl_glGetPathCommandsNV + .type bluegl_glGetPathCommandsNV, %function +bluegl_glGetPathCommandsNV: + adrp x16, :got:__blue_glCore_glGetPathCommandsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathCommandsNV] ldr x16, [x16] br x16 - .size bluegl_glMakeBufferNonResidentNV, .-bluegl_glMakeBufferNonResidentNV + .size bluegl_glGetPathCommandsNV, .-bluegl_glGetPathCommandsNV .align 2 - .global bluegl_glPixelDataRangeNV - .type bluegl_glPixelDataRangeNV, %function -bluegl_glPixelDataRangeNV: - adrp x16, :got:__blue_glCore_glPixelDataRangeNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelDataRangeNV] + .global bluegl_glGetPathCoordsNV + .type bluegl_glGetPathCoordsNV, %function +bluegl_glGetPathCoordsNV: + adrp x16, :got:__blue_glCore_glGetPathCoordsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathCoordsNV] ldr x16, [x16] br x16 - .size bluegl_glPixelDataRangeNV, .-bluegl_glPixelDataRangeNV + .size bluegl_glGetPathCoordsNV, .-bluegl_glGetPathCoordsNV .align 2 - .global bluegl_glNamedBufferDataEXT - .type bluegl_glNamedBufferDataEXT, %function -bluegl_glNamedBufferDataEXT: - adrp x16, :got:__blue_glCore_glNamedBufferDataEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedBufferDataEXT] + .global bluegl_glGetPathDashArrayNV + .type bluegl_glGetPathDashArrayNV, %function +bluegl_glGetPathDashArrayNV: + adrp x16, :got:__blue_glCore_glGetPathDashArrayNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathDashArrayNV] ldr x16, [x16] br x16 - .size bluegl_glNamedBufferDataEXT, .-bluegl_glNamedBufferDataEXT + .size bluegl_glGetPathDashArrayNV, .-bluegl_glGetPathDashArrayNV .align 2 - .global bluegl_glIsImageHandleResidentARB - .type bluegl_glIsImageHandleResidentARB, %function -bluegl_glIsImageHandleResidentARB: - adrp x16, :got:__blue_glCore_glIsImageHandleResidentARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsImageHandleResidentARB] + .global bluegl_glGetPathMetricsNV + .type bluegl_glGetPathMetricsNV, %function +bluegl_glGetPathMetricsNV: + adrp x16, :got:__blue_glCore_glGetPathMetricsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathMetricsNV] ldr x16, [x16] br x16 - .size bluegl_glIsImageHandleResidentARB, .-bluegl_glIsImageHandleResidentARB + .size bluegl_glGetPathMetricsNV, .-bluegl_glGetPathMetricsNV .align 2 - .global bluegl_glFrustumfOES - .type bluegl_glFrustumfOES, %function -bluegl_glFrustumfOES: - adrp x16, :got:__blue_glCore_glFrustumfOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glFrustumfOES] + .global bluegl_glGetPathMetricRangeNV + .type bluegl_glGetPathMetricRangeNV, %function +bluegl_glGetPathMetricRangeNV: + adrp x16, :got:__blue_glCore_glGetPathMetricRangeNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathMetricRangeNV] ldr x16, [x16] br x16 - .size bluegl_glFrustumfOES, .-bluegl_glFrustumfOES + .size bluegl_glGetPathMetricRangeNV, .-bluegl_glGetPathMetricRangeNV .align 2 - .global bluegl_glGetArrayObjectivATI - .type bluegl_glGetArrayObjectivATI, %function -bluegl_glGetArrayObjectivATI: - adrp x16, :got:__blue_glCore_glGetArrayObjectivATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetArrayObjectivATI] + .global bluegl_glGetPathSpacingNV + .type bluegl_glGetPathSpacingNV, %function +bluegl_glGetPathSpacingNV: + adrp x16, :got:__blue_glCore_glGetPathSpacingNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathSpacingNV] ldr x16, [x16] br x16 - .size bluegl_glGetArrayObjectivATI, .-bluegl_glGetArrayObjectivATI + .size bluegl_glGetPathSpacingNV, .-bluegl_glGetPathSpacingNV .align 2 - .global bluegl_glMultiTexParameterIuivEXT - .type bluegl_glMultiTexParameterIuivEXT, %function -bluegl_glMultiTexParameterIuivEXT: - adrp x16, :got:__blue_glCore_glMultiTexParameterIuivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexParameterIuivEXT] + .global bluegl_glIsPointInFillPathNV + .type bluegl_glIsPointInFillPathNV, %function +bluegl_glIsPointInFillPathNV: + adrp x16, :got:__blue_glCore_glIsPointInFillPathNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsPointInFillPathNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexParameterIuivEXT, .-bluegl_glMultiTexParameterIuivEXT + .size bluegl_glIsPointInFillPathNV, .-bluegl_glIsPointInFillPathNV .align 2 - .global bluegl_glGetMapParameterfvNV - .type bluegl_glGetMapParameterfvNV, %function -bluegl_glGetMapParameterfvNV: - adrp x16, :got:__blue_glCore_glGetMapParameterfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMapParameterfvNV] + .global bluegl_glIsPointInStrokePathNV + .type bluegl_glIsPointInStrokePathNV, %function +bluegl_glIsPointInStrokePathNV: + adrp x16, :got:__blue_glCore_glIsPointInStrokePathNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsPointInStrokePathNV] ldr x16, [x16] br x16 - .size bluegl_glGetMapParameterfvNV, .-bluegl_glGetMapParameterfvNV + .size bluegl_glIsPointInStrokePathNV, .-bluegl_glIsPointInStrokePathNV .align 2 - .global bluegl_glMultTransposeMatrixxOES - .type bluegl_glMultTransposeMatrixxOES, %function -bluegl_glMultTransposeMatrixxOES: - adrp x16, :got:__blue_glCore_glMultTransposeMatrixxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultTransposeMatrixxOES] + .global bluegl_glGetPathLengthNV + .type bluegl_glGetPathLengthNV, %function +bluegl_glGetPathLengthNV: + adrp x16, :got:__blue_glCore_glGetPathLengthNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathLengthNV] ldr x16, [x16] br x16 - .size bluegl_glMultTransposeMatrixxOES, .-bluegl_glMultTransposeMatrixxOES + .size bluegl_glGetPathLengthNV, .-bluegl_glGetPathLengthNV .align 2 - .global bluegl_glGetPerfMonitorCounterDataAMD - .type bluegl_glGetPerfMonitorCounterDataAMD, %function -bluegl_glGetPerfMonitorCounterDataAMD: - adrp x16, :got:__blue_glCore_glGetPerfMonitorCounterDataAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfMonitorCounterDataAMD] + .global bluegl_glPointAlongPathNV + .type bluegl_glPointAlongPathNV, %function +bluegl_glPointAlongPathNV: + adrp x16, :got:__blue_glCore_glPointAlongPathNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPointAlongPathNV] ldr x16, [x16] br x16 - .size bluegl_glGetPerfMonitorCounterDataAMD, .-bluegl_glGetPerfMonitorCounterDataAMD + .size bluegl_glPointAlongPathNV, .-bluegl_glPointAlongPathNV .align 2 - .global bluegl_glClearDepthxOES - .type bluegl_glClearDepthxOES, %function -bluegl_glClearDepthxOES: - adrp x16, :got:__blue_glCore_glClearDepthxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearDepthxOES] + .global bluegl_glMatrixLoad3x2fNV + .type bluegl_glMatrixLoad3x2fNV, %function +bluegl_glMatrixLoad3x2fNV: + adrp x16, :got:__blue_glCore_glMatrixLoad3x2fNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixLoad3x2fNV] ldr x16, [x16] br x16 - .size bluegl_glClearDepthxOES, .-bluegl_glClearDepthxOES + .size bluegl_glMatrixLoad3x2fNV, .-bluegl_glMatrixLoad3x2fNV .align 2 - .global bluegl_glColor3xvOES - .type bluegl_glColor3xvOES, %function -bluegl_glColor3xvOES: - adrp x16, :got:__blue_glCore_glColor3xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glColor3xvOES] + .global bluegl_glMatrixLoad3x3fNV + .type bluegl_glMatrixLoad3x3fNV, %function +bluegl_glMatrixLoad3x3fNV: + adrp x16, :got:__blue_glCore_glMatrixLoad3x3fNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixLoad3x3fNV] ldr x16, [x16] br x16 - .size bluegl_glColor3xvOES, .-bluegl_glColor3xvOES + .size bluegl_glMatrixLoad3x3fNV, .-bluegl_glMatrixLoad3x3fNV .align 2 - .global bluegl_glVertexAttribI4ivEXT - .type bluegl_glVertexAttribI4ivEXT, %function -bluegl_glVertexAttribI4ivEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI4ivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4ivEXT] + .global bluegl_glMatrixLoadTranspose3x3fNV + .type bluegl_glMatrixLoadTranspose3x3fNV, %function +bluegl_glMatrixLoadTranspose3x3fNV: + adrp x16, :got:__blue_glCore_glMatrixLoadTranspose3x3fNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixLoadTranspose3x3fNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI4ivEXT, .-bluegl_glVertexAttribI4ivEXT + .size bluegl_glMatrixLoadTranspose3x3fNV, .-bluegl_glMatrixLoadTranspose3x3fNV .align 2 - .global bluegl_glMultiTexCoordP4uiv - .type bluegl_glMultiTexCoordP4uiv, %function -bluegl_glMultiTexCoordP4uiv: - adrp x16, :got:__blue_glCore_glMultiTexCoordP4uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoordP4uiv] + .global bluegl_glMatrixMult3x2fNV + .type bluegl_glMatrixMult3x2fNV, %function +bluegl_glMatrixMult3x2fNV: + adrp x16, :got:__blue_glCore_glMatrixMult3x2fNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixMult3x2fNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoordP4uiv, .-bluegl_glMultiTexCoordP4uiv + .size bluegl_glMatrixMult3x2fNV, .-bluegl_glMatrixMult3x2fNV .align 2 - .global bluegl_glVertexAttribI4usv - .type bluegl_glVertexAttribI4usv, %function -bluegl_glVertexAttribI4usv: - adrp x16, :got:__blue_glCore_glVertexAttribI4usv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4usv] + .global bluegl_glMatrixMult3x3fNV + .type bluegl_glMatrixMult3x3fNV, %function +bluegl_glMatrixMult3x3fNV: + adrp x16, :got:__blue_glCore_glMatrixMult3x3fNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixMult3x3fNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI4usv, .-bluegl_glVertexAttribI4usv + .size bluegl_glMatrixMult3x3fNV, .-bluegl_glMatrixMult3x3fNV .align 2 - .global bluegl_glGetnTexImage - .type bluegl_glGetnTexImage, %function -bluegl_glGetnTexImage: - adrp x16, :got:__blue_glCore_glGetnTexImage - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnTexImage] + .global bluegl_glMatrixMultTranspose3x3fNV + .type bluegl_glMatrixMultTranspose3x3fNV, %function +bluegl_glMatrixMultTranspose3x3fNV: + adrp x16, :got:__blue_glCore_glMatrixMultTranspose3x3fNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixMultTranspose3x3fNV] ldr x16, [x16] br x16 - .size bluegl_glGetnTexImage, .-bluegl_glGetnTexImage + .size bluegl_glMatrixMultTranspose3x3fNV, .-bluegl_glMatrixMultTranspose3x3fNV .align 2 - .global bluegl_glReadBuffer - .type bluegl_glReadBuffer, %function -bluegl_glReadBuffer: - adrp x16, :got:__blue_glCore_glReadBuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glReadBuffer] + .global bluegl_glStencilThenCoverFillPathNV + .type bluegl_glStencilThenCoverFillPathNV, %function +bluegl_glStencilThenCoverFillPathNV: + adrp x16, :got:__blue_glCore_glStencilThenCoverFillPathNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilThenCoverFillPathNV] + ldr x16, [x16] + br x16 + .size bluegl_glStencilThenCoverFillPathNV, .-bluegl_glStencilThenCoverFillPathNV + + .align 2 + .global bluegl_glStencilThenCoverStrokePathNV + .type bluegl_glStencilThenCoverStrokePathNV, %function +bluegl_glStencilThenCoverStrokePathNV: + adrp x16, :got:__blue_glCore_glStencilThenCoverStrokePathNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilThenCoverStrokePathNV] ldr x16, [x16] br x16 - .size bluegl_glReadBuffer, .-bluegl_glReadBuffer + .size bluegl_glStencilThenCoverStrokePathNV, .-bluegl_glStencilThenCoverStrokePathNV .align 2 - .global bluegl_glUniform3iARB - .type bluegl_glUniform3iARB, %function -bluegl_glUniform3iARB: - adrp x16, :got:__blue_glCore_glUniform3iARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3iARB] + .global bluegl_glStencilThenCoverFillPathInstancedNV + .type bluegl_glStencilThenCoverFillPathInstancedNV, %function +bluegl_glStencilThenCoverFillPathInstancedNV: + adrp x16, :got:__blue_glCore_glStencilThenCoverFillPathInstancedNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilThenCoverFillPathInstancedNV] ldr x16, [x16] br x16 - .size bluegl_glUniform3iARB, .-bluegl_glUniform3iARB + .size bluegl_glStencilThenCoverFillPathInstancedNV, .-bluegl_glStencilThenCoverFillPathInstancedNV .align 2 - .global bluegl_glMultiTexBufferEXT - .type bluegl_glMultiTexBufferEXT, %function -bluegl_glMultiTexBufferEXT: - adrp x16, :got:__blue_glCore_glMultiTexBufferEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexBufferEXT] + .global bluegl_glStencilThenCoverStrokePathInstancedNV + .type bluegl_glStencilThenCoverStrokePathInstancedNV, %function +bluegl_glStencilThenCoverStrokePathInstancedNV: + adrp x16, :got:__blue_glCore_glStencilThenCoverStrokePathInstancedNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilThenCoverStrokePathInstancedNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexBufferEXT, .-bluegl_glMultiTexBufferEXT + .size bluegl_glStencilThenCoverStrokePathInstancedNV, .-bluegl_glStencilThenCoverStrokePathInstancedNV .align 2 - .global bluegl_glNormalStream3fvATI - .type bluegl_glNormalStream3fvATI, %function -bluegl_glNormalStream3fvATI: - adrp x16, :got:__blue_glCore_glNormalStream3fvATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3fvATI] + .global bluegl_glPathGlyphIndexRangeNV + .type bluegl_glPathGlyphIndexRangeNV, %function +bluegl_glPathGlyphIndexRangeNV: + adrp x16, :got:__blue_glCore_glPathGlyphIndexRangeNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathGlyphIndexRangeNV] ldr x16, [x16] br x16 - .size bluegl_glNormalStream3fvATI, .-bluegl_glNormalStream3fvATI + .size bluegl_glPathGlyphIndexRangeNV, .-bluegl_glPathGlyphIndexRangeNV .align 2 - .global bluegl_glDeleteVertexShaderEXT - .type bluegl_glDeleteVertexShaderEXT, %function -bluegl_glDeleteVertexShaderEXT: - adrp x16, :got:__blue_glCore_glDeleteVertexShaderEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteVertexShaderEXT] + .global bluegl_glPathGlyphIndexArrayNV + .type bluegl_glPathGlyphIndexArrayNV, %function +bluegl_glPathGlyphIndexArrayNV: + adrp x16, :got:__blue_glCore_glPathGlyphIndexArrayNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathGlyphIndexArrayNV] ldr x16, [x16] br x16 - .size bluegl_glDeleteVertexShaderEXT, .-bluegl_glDeleteVertexShaderEXT + .size bluegl_glPathGlyphIndexArrayNV, .-bluegl_glPathGlyphIndexArrayNV .align 2 - .global bluegl_glVertexAttrib3hvNV - .type bluegl_glVertexAttrib3hvNV, %function -bluegl_glVertexAttrib3hvNV: - adrp x16, :got:__blue_glCore_glVertexAttrib3hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3hvNV] + .global bluegl_glPathMemoryGlyphIndexArrayNV + .type bluegl_glPathMemoryGlyphIndexArrayNV, %function +bluegl_glPathMemoryGlyphIndexArrayNV: + adrp x16, :got:__blue_glCore_glPathMemoryGlyphIndexArrayNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathMemoryGlyphIndexArrayNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3hvNV, .-bluegl_glVertexAttrib3hvNV + .size bluegl_glPathMemoryGlyphIndexArrayNV, .-bluegl_glPathMemoryGlyphIndexArrayNV .align 2 - .global bluegl_glDrawMeshArraysSUN - .type bluegl_glDrawMeshArraysSUN, %function -bluegl_glDrawMeshArraysSUN: - adrp x16, :got:__blue_glCore_glDrawMeshArraysSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawMeshArraysSUN] + .global bluegl_glProgramPathFragmentInputGenNV + .type bluegl_glProgramPathFragmentInputGenNV, %function +bluegl_glProgramPathFragmentInputGenNV: + adrp x16, :got:__blue_glCore_glProgramPathFragmentInputGenNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramPathFragmentInputGenNV] ldr x16, [x16] br x16 - .size bluegl_glDrawMeshArraysSUN, .-bluegl_glDrawMeshArraysSUN + .size bluegl_glProgramPathFragmentInputGenNV, .-bluegl_glProgramPathFragmentInputGenNV .align 2 - .global bluegl_glVertexAttribL3dvEXT - .type bluegl_glVertexAttribL3dvEXT, %function -bluegl_glVertexAttribL3dvEXT: - adrp x16, :got:__blue_glCore_glVertexAttribL3dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL3dvEXT] + .global bluegl_glGetProgramResourcefvNV + .type bluegl_glGetProgramResourcefvNV, %function +bluegl_glGetProgramResourcefvNV: + adrp x16, :got:__blue_glCore_glGetProgramResourcefvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramResourcefvNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL3dvEXT, .-bluegl_glVertexAttribL3dvEXT + .size bluegl_glGetProgramResourcefvNV, .-bluegl_glGetProgramResourcefvNV .align 2 - .global bluegl_glReplacementCodeuiColor3fVertex3fSUN - .type bluegl_glReplacementCodeuiColor3fVertex3fSUN, %function -bluegl_glReplacementCodeuiColor3fVertex3fSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeuiColor3fVertex3fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiColor3fVertex3fSUN] + .global bluegl_glPathColorGenNV + .type bluegl_glPathColorGenNV, %function +bluegl_glPathColorGenNV: + adrp x16, :got:__blue_glCore_glPathColorGenNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathColorGenNV] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeuiColor3fVertex3fSUN, .-bluegl_glReplacementCodeuiColor3fVertex3fSUN + .size bluegl_glPathColorGenNV, .-bluegl_glPathColorGenNV .align 2 - .global bluegl_glProgramUniform1fv - .type bluegl_glProgramUniform1fv, %function -bluegl_glProgramUniform1fv: - adrp x16, :got:__blue_glCore_glProgramUniform1fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1fv] + .global bluegl_glPathTexGenNV + .type bluegl_glPathTexGenNV, %function +bluegl_glPathTexGenNV: + adrp x16, :got:__blue_glCore_glPathTexGenNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathTexGenNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1fv, .-bluegl_glProgramUniform1fv + .size bluegl_glPathTexGenNV, .-bluegl_glPathTexGenNV .align 2 - .global bluegl_glNormal3xvOES - .type bluegl_glNormal3xvOES, %function -bluegl_glNormal3xvOES: - adrp x16, :got:__blue_glCore_glNormal3xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormal3xvOES] + .global bluegl_glPathFogGenNV + .type bluegl_glPathFogGenNV, %function +bluegl_glPathFogGenNV: + adrp x16, :got:__blue_glCore_glPathFogGenNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPathFogGenNV] ldr x16, [x16] br x16 - .size bluegl_glNormal3xvOES, .-bluegl_glNormal3xvOES + .size bluegl_glPathFogGenNV, .-bluegl_glPathFogGenNV .align 2 - .global bluegl_glGetProgramStageiv - .type bluegl_glGetProgramStageiv, %function -bluegl_glGetProgramStageiv: - adrp x16, :got:__blue_glCore_glGetProgramStageiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramStageiv] + .global bluegl_glGetPathColorGenivNV + .type bluegl_glGetPathColorGenivNV, %function +bluegl_glGetPathColorGenivNV: + adrp x16, :got:__blue_glCore_glGetPathColorGenivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathColorGenivNV] ldr x16, [x16] br x16 - .size bluegl_glGetProgramStageiv, .-bluegl_glGetProgramStageiv + .size bluegl_glGetPathColorGenivNV, .-bluegl_glGetPathColorGenivNV .align 2 - .global bluegl_glUniform2ui64NV - .type bluegl_glUniform2ui64NV, %function -bluegl_glUniform2ui64NV: - adrp x16, :got:__blue_glCore_glUniform2ui64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2ui64NV] + .global bluegl_glGetPathColorGenfvNV + .type bluegl_glGetPathColorGenfvNV, %function +bluegl_glGetPathColorGenfvNV: + adrp x16, :got:__blue_glCore_glGetPathColorGenfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathColorGenfvNV] ldr x16, [x16] br x16 - .size bluegl_glUniform2ui64NV, .-bluegl_glUniform2ui64NV + .size bluegl_glGetPathColorGenfvNV, .-bluegl_glGetPathColorGenfvNV .align 2 - .global bluegl_glProgramEnvParameter4fARB - .type bluegl_glProgramEnvParameter4fARB, %function -bluegl_glProgramEnvParameter4fARB: - adrp x16, :got:__blue_glCore_glProgramEnvParameter4fARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParameter4fARB] + .global bluegl_glGetPathTexGenivNV + .type bluegl_glGetPathTexGenivNV, %function +bluegl_glGetPathTexGenivNV: + adrp x16, :got:__blue_glCore_glGetPathTexGenivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathTexGenivNV] ldr x16, [x16] br x16 - .size bluegl_glProgramEnvParameter4fARB, .-bluegl_glProgramEnvParameter4fARB + .size bluegl_glGetPathTexGenivNV, .-bluegl_glGetPathTexGenivNV .align 2 - .global bluegl_glPixelTransformParameterivEXT - .type bluegl_glPixelTransformParameterivEXT, %function -bluegl_glPixelTransformParameterivEXT: - adrp x16, :got:__blue_glCore_glPixelTransformParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTransformParameterivEXT] + .global bluegl_glGetPathTexGenfvNV + .type bluegl_glGetPathTexGenfvNV, %function +bluegl_glGetPathTexGenfvNV: + adrp x16, :got:__blue_glCore_glGetPathTexGenfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathTexGenfvNV] ldr x16, [x16] br x16 - .size bluegl_glPixelTransformParameterivEXT, .-bluegl_glPixelTransformParameterivEXT + .size bluegl_glGetPathTexGenfvNV, .-bluegl_glGetPathTexGenfvNV .align 2 - .global bluegl_glWindowPos4dvMESA - .type bluegl_glWindowPos4dvMESA, %function -bluegl_glWindowPos4dvMESA: - adrp x16, :got:__blue_glCore_glWindowPos4dvMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos4dvMESA] + .global bluegl_glPixelDataRangeNV + .type bluegl_glPixelDataRangeNV, %function +bluegl_glPixelDataRangeNV: + adrp x16, :got:__blue_glCore_glPixelDataRangeNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelDataRangeNV] ldr x16, [x16] br x16 - .size bluegl_glWindowPos4dvMESA, .-bluegl_glWindowPos4dvMESA + .size bluegl_glPixelDataRangeNV, .-bluegl_glPixelDataRangeNV .align 2 - .global bluegl_glMultiDrawElementsIndirectBindlessCountNV - .type bluegl_glMultiDrawElementsIndirectBindlessCountNV, %function -bluegl_glMultiDrawElementsIndirectBindlessCountNV: - adrp x16, :got:__blue_glCore_glMultiDrawElementsIndirectBindlessCountNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawElementsIndirectBindlessCountNV] + .global bluegl_glFlushPixelDataRangeNV + .type bluegl_glFlushPixelDataRangeNV, %function +bluegl_glFlushPixelDataRangeNV: + adrp x16, :got:__blue_glCore_glFlushPixelDataRangeNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glFlushPixelDataRangeNV] ldr x16, [x16] br x16 - .size bluegl_glMultiDrawElementsIndirectBindlessCountNV, .-bluegl_glMultiDrawElementsIndirectBindlessCountNV + .size bluegl_glFlushPixelDataRangeNV, .-bluegl_glFlushPixelDataRangeNV .align 2 - .global bluegl_glUniform3i64vARB - .type bluegl_glUniform3i64vARB, %function -bluegl_glUniform3i64vARB: - adrp x16, :got:__blue_glCore_glUniform3i64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3i64vARB] + .global bluegl_glPointParameteriNV + .type bluegl_glPointParameteriNV, %function +bluegl_glPointParameteriNV: + adrp x16, :got:__blue_glCore_glPointParameteriNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameteriNV] ldr x16, [x16] br x16 - .size bluegl_glUniform3i64vARB, .-bluegl_glUniform3i64vARB + .size bluegl_glPointParameteriNV, .-bluegl_glPointParameteriNV .align 2 - .global bluegl_glTextureStorage3DMultisample - .type bluegl_glTextureStorage3DMultisample, %function -bluegl_glTextureStorage3DMultisample: - adrp x16, :got:__blue_glCore_glTextureStorage3DMultisample - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage3DMultisample] + .global bluegl_glPointParameterivNV + .type bluegl_glPointParameterivNV, %function +bluegl_glPointParameterivNV: + adrp x16, :got:__blue_glCore_glPointParameterivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterivNV] ldr x16, [x16] br x16 - .size bluegl_glTextureStorage3DMultisample, .-bluegl_glTextureStorage3DMultisample + .size bluegl_glPointParameterivNV, .-bluegl_glPointParameterivNV .align 2 - .global bluegl_glGetNamedBufferParameterui64vNV - .type bluegl_glGetNamedBufferParameterui64vNV, %function -bluegl_glGetNamedBufferParameterui64vNV: - adrp x16, :got:__blue_glCore_glGetNamedBufferParameterui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedBufferParameterui64vNV] + .global bluegl_glPresentFrameKeyedNV + .type bluegl_glPresentFrameKeyedNV, %function +bluegl_glPresentFrameKeyedNV: + adrp x16, :got:__blue_glCore_glPresentFrameKeyedNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPresentFrameKeyedNV] ldr x16, [x16] br x16 - .size bluegl_glGetNamedBufferParameterui64vNV, .-bluegl_glGetNamedBufferParameterui64vNV + .size bluegl_glPresentFrameKeyedNV, .-bluegl_glPresentFrameKeyedNV .align 2 - .global bluegl_glEndTransformFeedback - .type bluegl_glEndTransformFeedback, %function -bluegl_glEndTransformFeedback: - adrp x16, :got:__blue_glCore_glEndTransformFeedback - ldr x16, [x16, #:got_lo12:__blue_glCore_glEndTransformFeedback] + .global bluegl_glPresentFrameDualFillNV + .type bluegl_glPresentFrameDualFillNV, %function +bluegl_glPresentFrameDualFillNV: + adrp x16, :got:__blue_glCore_glPresentFrameDualFillNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPresentFrameDualFillNV] ldr x16, [x16] br x16 - .size bluegl_glEndTransformFeedback, .-bluegl_glEndTransformFeedback + .size bluegl_glPresentFrameDualFillNV, .-bluegl_glPresentFrameDualFillNV .align 2 - .global bluegl_glVertexAttribI3ivEXT - .type bluegl_glVertexAttribI3ivEXT, %function -bluegl_glVertexAttribI3ivEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI3ivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI3ivEXT] + .global bluegl_glGetVideoivNV + .type bluegl_glGetVideoivNV, %function +bluegl_glGetVideoivNV: + adrp x16, :got:__blue_glCore_glGetVideoivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVideoivNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI3ivEXT, .-bluegl_glVertexAttribI3ivEXT + .size bluegl_glGetVideoivNV, .-bluegl_glGetVideoivNV .align 2 - .global bluegl_glUniform2f - .type bluegl_glUniform2f, %function -bluegl_glUniform2f: - adrp x16, :got:__blue_glCore_glUniform2f - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2f] + .global bluegl_glGetVideouivNV + .type bluegl_glGetVideouivNV, %function +bluegl_glGetVideouivNV: + adrp x16, :got:__blue_glCore_glGetVideouivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVideouivNV] ldr x16, [x16] br x16 - .size bluegl_glUniform2f, .-bluegl_glUniform2f + .size bluegl_glGetVideouivNV, .-bluegl_glGetVideouivNV .align 2 - .global bluegl_glMultiTexCoord1dARB - .type bluegl_glMultiTexCoord1dARB, %function -bluegl_glMultiTexCoord1dARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord1dARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1dARB] + .global bluegl_glGetVideoi64vNV + .type bluegl_glGetVideoi64vNV, %function +bluegl_glGetVideoi64vNV: + adrp x16, :got:__blue_glCore_glGetVideoi64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVideoi64vNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1dARB, .-bluegl_glMultiTexCoord1dARB + .size bluegl_glGetVideoi64vNV, .-bluegl_glGetVideoi64vNV .align 2 - .global bluegl_glGetColorTableParameterfv - .type bluegl_glGetColorTableParameterfv, %function -bluegl_glGetColorTableParameterfv: - adrp x16, :got:__blue_glCore_glGetColorTableParameterfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetColorTableParameterfv] + .global bluegl_glGetVideoui64vNV + .type bluegl_glGetVideoui64vNV, %function +bluegl_glGetVideoui64vNV: + adrp x16, :got:__blue_glCore_glGetVideoui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVideoui64vNV] ldr x16, [x16] br x16 - .size bluegl_glGetColorTableParameterfv, .-bluegl_glGetColorTableParameterfv + .size bluegl_glGetVideoui64vNV, .-bluegl_glGetVideoui64vNV .align 2 - .global bluegl_glWindowPos3d - .type bluegl_glWindowPos3d, %function -bluegl_glWindowPos3d: - adrp x16, :got:__blue_glCore_glWindowPos3d - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3d] + .global bluegl_glPrimitiveRestartNV + .type bluegl_glPrimitiveRestartNV, %function +bluegl_glPrimitiveRestartNV: + adrp x16, :got:__blue_glCore_glPrimitiveRestartNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPrimitiveRestartNV] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3d, .-bluegl_glWindowPos3d + .size bluegl_glPrimitiveRestartNV, .-bluegl_glPrimitiveRestartNV .align 2 - .global bluegl_glVertexAttribL3ui64vNV - .type bluegl_glVertexAttribL3ui64vNV, %function -bluegl_glVertexAttribL3ui64vNV: - adrp x16, :got:__blue_glCore_glVertexAttribL3ui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL3ui64vNV] + .global bluegl_glPrimitiveRestartIndexNV + .type bluegl_glPrimitiveRestartIndexNV, %function +bluegl_glPrimitiveRestartIndexNV: + adrp x16, :got:__blue_glCore_glPrimitiveRestartIndexNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPrimitiveRestartIndexNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL3ui64vNV, .-bluegl_glVertexAttribL3ui64vNV + .size bluegl_glPrimitiveRestartIndexNV, .-bluegl_glPrimitiveRestartIndexNV .align 2 - .global bluegl_glReplacementCodeuiSUN - .type bluegl_glReplacementCodeuiSUN, %function -bluegl_glReplacementCodeuiSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeuiSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiSUN] + .global bluegl_glCombinerParameterfvNV + .type bluegl_glCombinerParameterfvNV, %function +bluegl_glCombinerParameterfvNV: + adrp x16, :got:__blue_glCore_glCombinerParameterfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCombinerParameterfvNV] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeuiSUN, .-bluegl_glReplacementCodeuiSUN + .size bluegl_glCombinerParameterfvNV, .-bluegl_glCombinerParameterfvNV .align 2 - .global bluegl_glColor4ubVertex3fSUN - .type bluegl_glColor4ubVertex3fSUN, %function -bluegl_glColor4ubVertex3fSUN: - adrp x16, :got:__blue_glCore_glColor4ubVertex3fSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4ubVertex3fSUN] + .global bluegl_glCombinerParameterfNV + .type bluegl_glCombinerParameterfNV, %function +bluegl_glCombinerParameterfNV: + adrp x16, :got:__blue_glCore_glCombinerParameterfNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCombinerParameterfNV] ldr x16, [x16] br x16 - .size bluegl_glColor4ubVertex3fSUN, .-bluegl_glColor4ubVertex3fSUN + .size bluegl_glCombinerParameterfNV, .-bluegl_glCombinerParameterfNV .align 2 - .global bluegl_glDrawRangeElementsBaseVertex - .type bluegl_glDrawRangeElementsBaseVertex, %function -bluegl_glDrawRangeElementsBaseVertex: - adrp x16, :got:__blue_glCore_glDrawRangeElementsBaseVertex - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawRangeElementsBaseVertex] + .global bluegl_glCombinerParameterivNV + .type bluegl_glCombinerParameterivNV, %function +bluegl_glCombinerParameterivNV: + adrp x16, :got:__blue_glCore_glCombinerParameterivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCombinerParameterivNV] ldr x16, [x16] br x16 - .size bluegl_glDrawRangeElementsBaseVertex, .-bluegl_glDrawRangeElementsBaseVertex + .size bluegl_glCombinerParameterivNV, .-bluegl_glCombinerParameterivNV .align 2 - .global bluegl_glGetMultiTexParameterivEXT - .type bluegl_glGetMultiTexParameterivEXT, %function -bluegl_glGetMultiTexParameterivEXT: - adrp x16, :got:__blue_glCore_glGetMultiTexParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetMultiTexParameterivEXT] + .global bluegl_glCombinerParameteriNV + .type bluegl_glCombinerParameteriNV, %function +bluegl_glCombinerParameteriNV: + adrp x16, :got:__blue_glCore_glCombinerParameteriNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCombinerParameteriNV] ldr x16, [x16] br x16 - .size bluegl_glGetMultiTexParameterivEXT, .-bluegl_glGetMultiTexParameterivEXT + .size bluegl_glCombinerParameteriNV, .-bluegl_glCombinerParameteriNV .align 2 - .global bluegl_glMultiTexCoord3hvNV - .type bluegl_glMultiTexCoord3hvNV, %function -bluegl_glMultiTexCoord3hvNV: - adrp x16, :got:__blue_glCore_glMultiTexCoord3hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3hvNV] + .global bluegl_glCombinerInputNV + .type bluegl_glCombinerInputNV, %function +bluegl_glCombinerInputNV: + adrp x16, :got:__blue_glCore_glCombinerInputNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCombinerInputNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3hvNV, .-bluegl_glMultiTexCoord3hvNV + .size bluegl_glCombinerInputNV, .-bluegl_glCombinerInputNV .align 2 - .global bluegl_glGetQueryBufferObjectuiv - .type bluegl_glGetQueryBufferObjectuiv, %function -bluegl_glGetQueryBufferObjectuiv: - adrp x16, :got:__blue_glCore_glGetQueryBufferObjectuiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryBufferObjectuiv] + .global bluegl_glCombinerOutputNV + .type bluegl_glCombinerOutputNV, %function +bluegl_glCombinerOutputNV: + adrp x16, :got:__blue_glCore_glCombinerOutputNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCombinerOutputNV] ldr x16, [x16] br x16 - .size bluegl_glGetQueryBufferObjectuiv, .-bluegl_glGetQueryBufferObjectuiv + .size bluegl_glCombinerOutputNV, .-bluegl_glCombinerOutputNV .align 2 - .global bluegl_glGetPerfMonitorGroupsAMD - .type bluegl_glGetPerfMonitorGroupsAMD, %function -bluegl_glGetPerfMonitorGroupsAMD: - adrp x16, :got:__blue_glCore_glGetPerfMonitorGroupsAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPerfMonitorGroupsAMD] + .global bluegl_glFinalCombinerInputNV + .type bluegl_glFinalCombinerInputNV, %function +bluegl_glFinalCombinerInputNV: + adrp x16, :got:__blue_glCore_glFinalCombinerInputNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glFinalCombinerInputNV] ldr x16, [x16] br x16 - .size bluegl_glGetPerfMonitorGroupsAMD, .-bluegl_glGetPerfMonitorGroupsAMD + .size bluegl_glFinalCombinerInputNV, .-bluegl_glFinalCombinerInputNV .align 2 - .global bluegl_glUnlockArraysEXT - .type bluegl_glUnlockArraysEXT, %function -bluegl_glUnlockArraysEXT: - adrp x16, :got:__blue_glCore_glUnlockArraysEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glUnlockArraysEXT] + .global bluegl_glGetCombinerInputParameterfvNV + .type bluegl_glGetCombinerInputParameterfvNV, %function +bluegl_glGetCombinerInputParameterfvNV: + adrp x16, :got:__blue_glCore_glGetCombinerInputParameterfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCombinerInputParameterfvNV] ldr x16, [x16] br x16 - .size bluegl_glUnlockArraysEXT, .-bluegl_glUnlockArraysEXT + .size bluegl_glGetCombinerInputParameterfvNV, .-bluegl_glGetCombinerInputParameterfvNV .align 2 - .global bluegl_glPauseTransformFeedback - .type bluegl_glPauseTransformFeedback, %function -bluegl_glPauseTransformFeedback: - adrp x16, :got:__blue_glCore_glPauseTransformFeedback - ldr x16, [x16, #:got_lo12:__blue_glCore_glPauseTransformFeedback] + .global bluegl_glGetCombinerInputParameterivNV + .type bluegl_glGetCombinerInputParameterivNV, %function +bluegl_glGetCombinerInputParameterivNV: + adrp x16, :got:__blue_glCore_glGetCombinerInputParameterivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCombinerInputParameterivNV] ldr x16, [x16] br x16 - .size bluegl_glPauseTransformFeedback, .-bluegl_glPauseTransformFeedback + .size bluegl_glGetCombinerInputParameterivNV, .-bluegl_glGetCombinerInputParameterivNV .align 2 - .global bluegl_glGetProgramEnvParameterIivNV - .type bluegl_glGetProgramEnvParameterIivNV, %function -bluegl_glGetProgramEnvParameterIivNV: - adrp x16, :got:__blue_glCore_glGetProgramEnvParameterIivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramEnvParameterIivNV] + .global bluegl_glGetCombinerOutputParameterfvNV + .type bluegl_glGetCombinerOutputParameterfvNV, %function +bluegl_glGetCombinerOutputParameterfvNV: + adrp x16, :got:__blue_glCore_glGetCombinerOutputParameterfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCombinerOutputParameterfvNV] ldr x16, [x16] br x16 - .size bluegl_glGetProgramEnvParameterIivNV, .-bluegl_glGetProgramEnvParameterIivNV + .size bluegl_glGetCombinerOutputParameterfvNV, .-bluegl_glGetCombinerOutputParameterfvNV .align 2 - .global bluegl_glPathTexGenNV - .type bluegl_glPathTexGenNV, %function -bluegl_glPathTexGenNV: - adrp x16, :got:__blue_glCore_glPathTexGenNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathTexGenNV] + .global bluegl_glGetCombinerOutputParameterivNV + .type bluegl_glGetCombinerOutputParameterivNV, %function +bluegl_glGetCombinerOutputParameterivNV: + adrp x16, :got:__blue_glCore_glGetCombinerOutputParameterivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCombinerOutputParameterivNV] ldr x16, [x16] br x16 - .size bluegl_glPathTexGenNV, .-bluegl_glPathTexGenNV + .size bluegl_glGetCombinerOutputParameterivNV, .-bluegl_glGetCombinerOutputParameterivNV .align 2 - .global bluegl_glVertex3xOES - .type bluegl_glVertex3xOES, %function -bluegl_glVertex3xOES: - adrp x16, :got:__blue_glCore_glVertex3xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex3xOES] + .global bluegl_glGetFinalCombinerInputParameterfvNV + .type bluegl_glGetFinalCombinerInputParameterfvNV, %function +bluegl_glGetFinalCombinerInputParameterfvNV: + adrp x16, :got:__blue_glCore_glGetFinalCombinerInputParameterfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFinalCombinerInputParameterfvNV] ldr x16, [x16] br x16 - .size bluegl_glVertex3xOES, .-bluegl_glVertex3xOES + .size bluegl_glGetFinalCombinerInputParameterfvNV, .-bluegl_glGetFinalCombinerInputParameterfvNV .align 2 - .global bluegl_glEdgeFlagPointerEXT - .type bluegl_glEdgeFlagPointerEXT, %function -bluegl_glEdgeFlagPointerEXT: - adrp x16, :got:__blue_glCore_glEdgeFlagPointerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glEdgeFlagPointerEXT] + .global bluegl_glGetFinalCombinerInputParameterivNV + .type bluegl_glGetFinalCombinerInputParameterivNV, %function +bluegl_glGetFinalCombinerInputParameterivNV: + adrp x16, :got:__blue_glCore_glGetFinalCombinerInputParameterivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFinalCombinerInputParameterivNV] ldr x16, [x16] br x16 - .size bluegl_glEdgeFlagPointerEXT, .-bluegl_glEdgeFlagPointerEXT + .size bluegl_glGetFinalCombinerInputParameterivNV, .-bluegl_glGetFinalCombinerInputParameterivNV .align 2 - .global bluegl_glVertexAttribBinding - .type bluegl_glVertexAttribBinding, %function -bluegl_glVertexAttribBinding: - adrp x16, :got:__blue_glCore_glVertexAttribBinding - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribBinding] + .global bluegl_glCombinerStageParameterfvNV + .type bluegl_glCombinerStageParameterfvNV, %function +bluegl_glCombinerStageParameterfvNV: + adrp x16, :got:__blue_glCore_glCombinerStageParameterfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glCombinerStageParameterfvNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribBinding, .-bluegl_glVertexAttribBinding + .size bluegl_glCombinerStageParameterfvNV, .-bluegl_glCombinerStageParameterfvNV .align 2 - .global bluegl_glVertexAttrib3f - .type bluegl_glVertexAttrib3f, %function -bluegl_glVertexAttrib3f: - adrp x16, :got:__blue_glCore_glVertexAttrib3f - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3f] + .global bluegl_glGetCombinerStageParameterfvNV + .type bluegl_glGetCombinerStageParameterfvNV, %function +bluegl_glGetCombinerStageParameterfvNV: + adrp x16, :got:__blue_glCore_glGetCombinerStageParameterfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCombinerStageParameterfvNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3f, .-bluegl_glVertexAttrib3f + .size bluegl_glGetCombinerStageParameterfvNV, .-bluegl_glGetCombinerStageParameterfvNV .align 2 - .global bluegl_glVertexAttrib4NubARB - .type bluegl_glVertexAttrib4NubARB, %function -bluegl_glVertexAttrib4NubARB: - adrp x16, :got:__blue_glCore_glVertexAttrib4NubARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4NubARB] + .global bluegl_glFramebufferSampleLocationsfvNV + .type bluegl_glFramebufferSampleLocationsfvNV, %function +bluegl_glFramebufferSampleLocationsfvNV: + adrp x16, :got:__blue_glCore_glFramebufferSampleLocationsfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferSampleLocationsfvNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4NubARB, .-bluegl_glVertexAttrib4NubARB + .size bluegl_glFramebufferSampleLocationsfvNV, .-bluegl_glFramebufferSampleLocationsfvNV .align 2 - .global bluegl_glWindowPos2svMESA - .type bluegl_glWindowPos2svMESA, %function -bluegl_glWindowPos2svMESA: - adrp x16, :got:__blue_glCore_glWindowPos2svMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2svMESA] + .global bluegl_glNamedFramebufferSampleLocationsfvNV + .type bluegl_glNamedFramebufferSampleLocationsfvNV, %function +bluegl_glNamedFramebufferSampleLocationsfvNV: + adrp x16, :got:__blue_glCore_glNamedFramebufferSampleLocationsfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedFramebufferSampleLocationsfvNV] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2svMESA, .-bluegl_glWindowPos2svMESA + .size bluegl_glNamedFramebufferSampleLocationsfvNV, .-bluegl_glNamedFramebufferSampleLocationsfvNV .align 2 - .global bluegl_glGetUniformSubroutineuiv - .type bluegl_glGetUniformSubroutineuiv, %function -bluegl_glGetUniformSubroutineuiv: - adrp x16, :got:__blue_glCore_glGetUniformSubroutineuiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformSubroutineuiv] + .global bluegl_glResolveDepthValuesNV + .type bluegl_glResolveDepthValuesNV, %function +bluegl_glResolveDepthValuesNV: + adrp x16, :got:__blue_glCore_glResolveDepthValuesNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glResolveDepthValuesNV] ldr x16, [x16] br x16 - .size bluegl_glGetUniformSubroutineuiv, .-bluegl_glGetUniformSubroutineuiv + .size bluegl_glResolveDepthValuesNV, .-bluegl_glResolveDepthValuesNV .align 2 - .global bluegl_glMultiTexCoord2ivARB - .type bluegl_glMultiTexCoord2ivARB, %function -bluegl_glMultiTexCoord2ivARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord2ivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2ivARB] + .global bluegl_glMakeBufferResidentNV + .type bluegl_glMakeBufferResidentNV, %function +bluegl_glMakeBufferResidentNV: + adrp x16, :got:__blue_glCore_glMakeBufferResidentNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeBufferResidentNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2ivARB, .-bluegl_glMultiTexCoord2ivARB + .size bluegl_glMakeBufferResidentNV, .-bluegl_glMakeBufferResidentNV .align 2 - .global bluegl_glFragmentMaterialivSGIX - .type bluegl_glFragmentMaterialivSGIX, %function -bluegl_glFragmentMaterialivSGIX: - adrp x16, :got:__blue_glCore_glFragmentMaterialivSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentMaterialivSGIX] + .global bluegl_glMakeBufferNonResidentNV + .type bluegl_glMakeBufferNonResidentNV, %function +bluegl_glMakeBufferNonResidentNV: + adrp x16, :got:__blue_glCore_glMakeBufferNonResidentNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeBufferNonResidentNV] ldr x16, [x16] br x16 - .size bluegl_glFragmentMaterialivSGIX, .-bluegl_glFragmentMaterialivSGIX + .size bluegl_glMakeBufferNonResidentNV, .-bluegl_glMakeBufferNonResidentNV .align 2 - .global bluegl_glSamplerParameteriv - .type bluegl_glSamplerParameteriv, %function -bluegl_glSamplerParameteriv: - adrp x16, :got:__blue_glCore_glSamplerParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glSamplerParameteriv] + .global bluegl_glIsBufferResidentNV + .type bluegl_glIsBufferResidentNV, %function +bluegl_glIsBufferResidentNV: + adrp x16, :got:__blue_glCore_glIsBufferResidentNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsBufferResidentNV] ldr x16, [x16] br x16 - .size bluegl_glSamplerParameteriv, .-bluegl_glSamplerParameteriv + .size bluegl_glIsBufferResidentNV, .-bluegl_glIsBufferResidentNV .align 2 - .global bluegl_glVertexArrayColorOffsetEXT - .type bluegl_glVertexArrayColorOffsetEXT, %function -bluegl_glVertexArrayColorOffsetEXT: - adrp x16, :got:__blue_glCore_glVertexArrayColorOffsetEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayColorOffsetEXT] + .global bluegl_glMakeNamedBufferResidentNV + .type bluegl_glMakeNamedBufferResidentNV, %function +bluegl_glMakeNamedBufferResidentNV: + adrp x16, :got:__blue_glCore_glMakeNamedBufferResidentNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeNamedBufferResidentNV] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayColorOffsetEXT, .-bluegl_glVertexArrayColorOffsetEXT + .size bluegl_glMakeNamedBufferResidentNV, .-bluegl_glMakeNamedBufferResidentNV .align 2 - .global bluegl_glVertexAttrib3sNV - .type bluegl_glVertexAttrib3sNV, %function -bluegl_glVertexAttrib3sNV: - adrp x16, :got:__blue_glCore_glVertexAttrib3sNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3sNV] + .global bluegl_glMakeNamedBufferNonResidentNV + .type bluegl_glMakeNamedBufferNonResidentNV, %function +bluegl_glMakeNamedBufferNonResidentNV: + adrp x16, :got:__blue_glCore_glMakeNamedBufferNonResidentNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeNamedBufferNonResidentNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3sNV, .-bluegl_glVertexAttrib3sNV + .size bluegl_glMakeNamedBufferNonResidentNV, .-bluegl_glMakeNamedBufferNonResidentNV .align 2 - .global bluegl_glDrawElementsInstanced - .type bluegl_glDrawElementsInstanced, %function -bluegl_glDrawElementsInstanced: - adrp x16, :got:__blue_glCore_glDrawElementsInstanced - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementsInstanced] + .global bluegl_glIsNamedBufferResidentNV + .type bluegl_glIsNamedBufferResidentNV, %function +bluegl_glIsNamedBufferResidentNV: + adrp x16, :got:__blue_glCore_glIsNamedBufferResidentNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsNamedBufferResidentNV] ldr x16, [x16] br x16 - .size bluegl_glDrawElementsInstanced, .-bluegl_glDrawElementsInstanced + .size bluegl_glIsNamedBufferResidentNV, .-bluegl_glIsNamedBufferResidentNV .align 2 - .global bluegl_glCreateSyncFromCLeventARB - .type bluegl_glCreateSyncFromCLeventARB, %function -bluegl_glCreateSyncFromCLeventARB: - adrp x16, :got:__blue_glCore_glCreateSyncFromCLeventARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateSyncFromCLeventARB] + .global bluegl_glGetBufferParameterui64vNV + .type bluegl_glGetBufferParameterui64vNV, %function +bluegl_glGetBufferParameterui64vNV: + adrp x16, :got:__blue_glCore_glGetBufferParameterui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBufferParameterui64vNV] ldr x16, [x16] br x16 - .size bluegl_glCreateSyncFromCLeventARB, .-bluegl_glCreateSyncFromCLeventARB + .size bluegl_glGetBufferParameterui64vNV, .-bluegl_glGetBufferParameterui64vNV .align 2 - .global bluegl_glInsertEventMarkerEXT - .type bluegl_glInsertEventMarkerEXT, %function -bluegl_glInsertEventMarkerEXT: - adrp x16, :got:__blue_glCore_glInsertEventMarkerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glInsertEventMarkerEXT] + .global bluegl_glGetNamedBufferParameterui64vNV + .type bluegl_glGetNamedBufferParameterui64vNV, %function +bluegl_glGetNamedBufferParameterui64vNV: + adrp x16, :got:__blue_glCore_glGetNamedBufferParameterui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedBufferParameterui64vNV] ldr x16, [x16] br x16 - .size bluegl_glInsertEventMarkerEXT, .-bluegl_glInsertEventMarkerEXT + .size bluegl_glGetNamedBufferParameterui64vNV, .-bluegl_glGetNamedBufferParameterui64vNV .align 2 - .global bluegl_glGetTextureParameterfv - .type bluegl_glGetTextureParameterfv, %function -bluegl_glGetTextureParameterfv: - adrp x16, :got:__blue_glCore_glGetTextureParameterfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureParameterfv] + .global bluegl_glGetIntegerui64vNV + .type bluegl_glGetIntegerui64vNV, %function +bluegl_glGetIntegerui64vNV: + adrp x16, :got:__blue_glCore_glGetIntegerui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetIntegerui64vNV] ldr x16, [x16] br x16 - .size bluegl_glGetTextureParameterfv, .-bluegl_glGetTextureParameterfv + .size bluegl_glGetIntegerui64vNV, .-bluegl_glGetIntegerui64vNV .align 2 - .global bluegl_glCopyMultiTexImage2DEXT - .type bluegl_glCopyMultiTexImage2DEXT, %function -bluegl_glCopyMultiTexImage2DEXT: - adrp x16, :got:__blue_glCore_glCopyMultiTexImage2DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyMultiTexImage2DEXT] + .global bluegl_glUniformui64NV + .type bluegl_glUniformui64NV, %function +bluegl_glUniformui64NV: + adrp x16, :got:__blue_glCore_glUniformui64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformui64NV] ldr x16, [x16] br x16 - .size bluegl_glCopyMultiTexImage2DEXT, .-bluegl_glCopyMultiTexImage2DEXT + .size bluegl_glUniformui64NV, .-bluegl_glUniformui64NV .align 2 - .global bluegl_glVertexWeightfEXT - .type bluegl_glVertexWeightfEXT, %function -bluegl_glVertexWeightfEXT: - adrp x16, :got:__blue_glCore_glVertexWeightfEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexWeightfEXT] + .global bluegl_glUniformui64vNV + .type bluegl_glUniformui64vNV, %function +bluegl_glUniformui64vNV: + adrp x16, :got:__blue_glCore_glUniformui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformui64vNV] ldr x16, [x16] br x16 - .size bluegl_glVertexWeightfEXT, .-bluegl_glVertexWeightfEXT + .size bluegl_glUniformui64vNV, .-bluegl_glUniformui64vNV .align 2 - .global bluegl_glUniform4i64vARB - .type bluegl_glUniform4i64vARB, %function -bluegl_glUniform4i64vARB: - adrp x16, :got:__blue_glCore_glUniform4i64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4i64vARB] + .global bluegl_glProgramUniformui64NV + .type bluegl_glProgramUniformui64NV, %function +bluegl_glProgramUniformui64NV: + adrp x16, :got:__blue_glCore_glProgramUniformui64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformui64NV] ldr x16, [x16] br x16 - .size bluegl_glUniform4i64vARB, .-bluegl_glUniform4i64vARB + .size bluegl_glProgramUniformui64NV, .-bluegl_glProgramUniformui64NV .align 2 - .global bluegl_glGetPathParameterfvNV - .type bluegl_glGetPathParameterfvNV, %function -bluegl_glGetPathParameterfvNV: - adrp x16, :got:__blue_glCore_glGetPathParameterfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathParameterfvNV] + .global bluegl_glProgramUniformui64vNV + .type bluegl_glProgramUniformui64vNV, %function +bluegl_glProgramUniformui64vNV: + adrp x16, :got:__blue_glCore_glProgramUniformui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformui64vNV] ldr x16, [x16] br x16 - .size bluegl_glGetPathParameterfvNV, .-bluegl_glGetPathParameterfvNV + .size bluegl_glProgramUniformui64vNV, .-bluegl_glProgramUniformui64vNV .align 2 - .global bluegl_glBlitNamedFramebuffer - .type bluegl_glBlitNamedFramebuffer, %function -bluegl_glBlitNamedFramebuffer: - adrp x16, :got:__blue_glCore_glBlitNamedFramebuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glBlitNamedFramebuffer] + .global bluegl_glTextureBarrierNV + .type bluegl_glTextureBarrierNV, %function +bluegl_glTextureBarrierNV: + adrp x16, :got:__blue_glCore_glTextureBarrierNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureBarrierNV] ldr x16, [x16] br x16 - .size bluegl_glBlitNamedFramebuffer, .-bluegl_glBlitNamedFramebuffer + .size bluegl_glTextureBarrierNV, .-bluegl_glTextureBarrierNV .align 2 - .global bluegl_glTexCoordPointerEXT - .type bluegl_glTexCoordPointerEXT, %function -bluegl_glTexCoordPointerEXT: - adrp x16, :got:__blue_glCore_glTexCoordPointerEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordPointerEXT] + .global bluegl_glTexImage2DMultisampleCoverageNV + .type bluegl_glTexImage2DMultisampleCoverageNV, %function +bluegl_glTexImage2DMultisampleCoverageNV: + adrp x16, :got:__blue_glCore_glTexImage2DMultisampleCoverageNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexImage2DMultisampleCoverageNV] ldr x16, [x16] br x16 - .size bluegl_glTexCoordPointerEXT, .-bluegl_glTexCoordPointerEXT + .size bluegl_glTexImage2DMultisampleCoverageNV, .-bluegl_glTexImage2DMultisampleCoverageNV .align 2 - .global bluegl_glGetPathMetricsNV - .type bluegl_glGetPathMetricsNV, %function -bluegl_glGetPathMetricsNV: - adrp x16, :got:__blue_glCore_glGetPathMetricsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathMetricsNV] + .global bluegl_glTexImage3DMultisampleCoverageNV + .type bluegl_glTexImage3DMultisampleCoverageNV, %function +bluegl_glTexImage3DMultisampleCoverageNV: + adrp x16, :got:__blue_glCore_glTexImage3DMultisampleCoverageNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexImage3DMultisampleCoverageNV] ldr x16, [x16] br x16 - .size bluegl_glGetPathMetricsNV, .-bluegl_glGetPathMetricsNV + .size bluegl_glTexImage3DMultisampleCoverageNV, .-bluegl_glTexImage3DMultisampleCoverageNV .align 2 - .global bluegl_glVertexAttribL2dvEXT - .type bluegl_glVertexAttribL2dvEXT, %function -bluegl_glVertexAttribL2dvEXT: - adrp x16, :got:__blue_glCore_glVertexAttribL2dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL2dvEXT] + .global bluegl_glTextureImage2DMultisampleNV + .type bluegl_glTextureImage2DMultisampleNV, %function +bluegl_glTextureImage2DMultisampleNV: + adrp x16, :got:__blue_glCore_glTextureImage2DMultisampleNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureImage2DMultisampleNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL2dvEXT, .-bluegl_glVertexAttribL2dvEXT + .size bluegl_glTextureImage2DMultisampleNV, .-bluegl_glTextureImage2DMultisampleNV .align 2 - .global bluegl_glVariantuivEXT - .type bluegl_glVariantuivEXT, %function -bluegl_glVariantuivEXT: - adrp x16, :got:__blue_glCore_glVariantuivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVariantuivEXT] + .global bluegl_glTextureImage3DMultisampleNV + .type bluegl_glTextureImage3DMultisampleNV, %function +bluegl_glTextureImage3DMultisampleNV: + adrp x16, :got:__blue_glCore_glTextureImage3DMultisampleNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureImage3DMultisampleNV] ldr x16, [x16] br x16 - .size bluegl_glVariantuivEXT, .-bluegl_glVariantuivEXT + .size bluegl_glTextureImage3DMultisampleNV, .-bluegl_glTextureImage3DMultisampleNV .align 2 - .global bluegl_glGetVertexAttribdvNV - .type bluegl_glGetVertexAttribdvNV, %function -bluegl_glGetVertexAttribdvNV: - adrp x16, :got:__blue_glCore_glGetVertexAttribdvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribdvNV] + .global bluegl_glTextureImage2DMultisampleCoverageNV + .type bluegl_glTextureImage2DMultisampleCoverageNV, %function +bluegl_glTextureImage2DMultisampleCoverageNV: + adrp x16, :got:__blue_glCore_glTextureImage2DMultisampleCoverageNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureImage2DMultisampleCoverageNV] + ldr x16, [x16] + br x16 + .size bluegl_glTextureImage2DMultisampleCoverageNV, .-bluegl_glTextureImage2DMultisampleCoverageNV + + .align 2 + .global bluegl_glTextureImage3DMultisampleCoverageNV + .type bluegl_glTextureImage3DMultisampleCoverageNV, %function +bluegl_glTextureImage3DMultisampleCoverageNV: + adrp x16, :got:__blue_glCore_glTextureImage3DMultisampleCoverageNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureImage3DMultisampleCoverageNV] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribdvNV, .-bluegl_glGetVertexAttribdvNV + .size bluegl_glTextureImage3DMultisampleCoverageNV, .-bluegl_glTextureImage3DMultisampleCoverageNV .align 2 - .global bluegl_glFenceSync - .type bluegl_glFenceSync, %function -bluegl_glFenceSync: - adrp x16, :got:__blue_glCore_glFenceSync - ldr x16, [x16, #:got_lo12:__blue_glCore_glFenceSync] + .global bluegl_glBeginTransformFeedbackNV + .type bluegl_glBeginTransformFeedbackNV, %function +bluegl_glBeginTransformFeedbackNV: + adrp x16, :got:__blue_glCore_glBeginTransformFeedbackNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginTransformFeedbackNV] ldr x16, [x16] br x16 - .size bluegl_glFenceSync, .-bluegl_glFenceSync + .size bluegl_glBeginTransformFeedbackNV, .-bluegl_glBeginTransformFeedbackNV .align 2 - .global bluegl_glGetTextureParameterIuiv - .type bluegl_glGetTextureParameterIuiv, %function -bluegl_glGetTextureParameterIuiv: - adrp x16, :got:__blue_glCore_glGetTextureParameterIuiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureParameterIuiv] + .global bluegl_glEndTransformFeedbackNV + .type bluegl_glEndTransformFeedbackNV, %function +bluegl_glEndTransformFeedbackNV: + adrp x16, :got:__blue_glCore_glEndTransformFeedbackNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glEndTransformFeedbackNV] ldr x16, [x16] br x16 - .size bluegl_glGetTextureParameterIuiv, .-bluegl_glGetTextureParameterIuiv + .size bluegl_glEndTransformFeedbackNV, .-bluegl_glEndTransformFeedbackNV .align 2 - .global bluegl_glMultiTexCoord2sARB - .type bluegl_glMultiTexCoord2sARB, %function -bluegl_glMultiTexCoord2sARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord2sARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2sARB] + .global bluegl_glTransformFeedbackAttribsNV + .type bluegl_glTransformFeedbackAttribsNV, %function +bluegl_glTransformFeedbackAttribsNV: + adrp x16, :got:__blue_glCore_glTransformFeedbackAttribsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTransformFeedbackAttribsNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2sARB, .-bluegl_glMultiTexCoord2sARB + .size bluegl_glTransformFeedbackAttribsNV, .-bluegl_glTransformFeedbackAttribsNV .align 2 - .global bluegl_glUniform2i64NV - .type bluegl_glUniform2i64NV, %function -bluegl_glUniform2i64NV: - adrp x16, :got:__blue_glCore_glUniform2i64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2i64NV] + .global bluegl_glBindBufferRangeNV + .type bluegl_glBindBufferRangeNV, %function +bluegl_glBindBufferRangeNV: + adrp x16, :got:__blue_glCore_glBindBufferRangeNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBufferRangeNV] ldr x16, [x16] br x16 - .size bluegl_glUniform2i64NV, .-bluegl_glUniform2i64NV + .size bluegl_glBindBufferRangeNV, .-bluegl_glBindBufferRangeNV .align 2 - .global bluegl_glDeformationMap3dSGIX - .type bluegl_glDeformationMap3dSGIX, %function -bluegl_glDeformationMap3dSGIX: - adrp x16, :got:__blue_glCore_glDeformationMap3dSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeformationMap3dSGIX] + .global bluegl_glBindBufferOffsetNV + .type bluegl_glBindBufferOffsetNV, %function +bluegl_glBindBufferOffsetNV: + adrp x16, :got:__blue_glCore_glBindBufferOffsetNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBufferOffsetNV] ldr x16, [x16] br x16 - .size bluegl_glDeformationMap3dSGIX, .-bluegl_glDeformationMap3dSGIX + .size bluegl_glBindBufferOffsetNV, .-bluegl_glBindBufferOffsetNV .align 2 - .global bluegl_glDrawRangeElementArrayAPPLE - .type bluegl_glDrawRangeElementArrayAPPLE, %function -bluegl_glDrawRangeElementArrayAPPLE: - adrp x16, :got:__blue_glCore_glDrawRangeElementArrayAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawRangeElementArrayAPPLE] + .global bluegl_glBindBufferBaseNV + .type bluegl_glBindBufferBaseNV, %function +bluegl_glBindBufferBaseNV: + adrp x16, :got:__blue_glCore_glBindBufferBaseNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBufferBaseNV] ldr x16, [x16] br x16 - .size bluegl_glDrawRangeElementArrayAPPLE, .-bluegl_glDrawRangeElementArrayAPPLE + .size bluegl_glBindBufferBaseNV, .-bluegl_glBindBufferBaseNV .align 2 - .global bluegl_glDepthFunc - .type bluegl_glDepthFunc, %function -bluegl_glDepthFunc: - adrp x16, :got:__blue_glCore_glDepthFunc - ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthFunc] + .global bluegl_glTransformFeedbackVaryingsNV + .type bluegl_glTransformFeedbackVaryingsNV, %function +bluegl_glTransformFeedbackVaryingsNV: + adrp x16, :got:__blue_glCore_glTransformFeedbackVaryingsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTransformFeedbackVaryingsNV] ldr x16, [x16] br x16 - .size bluegl_glDepthFunc, .-bluegl_glDepthFunc + .size bluegl_glTransformFeedbackVaryingsNV, .-bluegl_glTransformFeedbackVaryingsNV .align 2 - .global bluegl_glProgramUniform3dvEXT - .type bluegl_glProgramUniform3dvEXT, %function -bluegl_glProgramUniform3dvEXT: - adrp x16, :got:__blue_glCore_glProgramUniform3dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3dvEXT] + .global bluegl_glActiveVaryingNV + .type bluegl_glActiveVaryingNV, %function +bluegl_glActiveVaryingNV: + adrp x16, :got:__blue_glCore_glActiveVaryingNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glActiveVaryingNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3dvEXT, .-bluegl_glProgramUniform3dvEXT + .size bluegl_glActiveVaryingNV, .-bluegl_glActiveVaryingNV .align 2 - .global bluegl_glTexCoord3hvNV - .type bluegl_glTexCoord3hvNV, %function -bluegl_glTexCoord3hvNV: - adrp x16, :got:__blue_glCore_glTexCoord3hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord3hvNV] + .global bluegl_glGetVaryingLocationNV + .type bluegl_glGetVaryingLocationNV, %function +bluegl_glGetVaryingLocationNV: + adrp x16, :got:__blue_glCore_glGetVaryingLocationNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVaryingLocationNV] ldr x16, [x16] br x16 - .size bluegl_glTexCoord3hvNV, .-bluegl_glTexCoord3hvNV + .size bluegl_glGetVaryingLocationNV, .-bluegl_glGetVaryingLocationNV .align 2 - .global bluegl_glGetPathLengthNV - .type bluegl_glGetPathLengthNV, %function -bluegl_glGetPathLengthNV: - adrp x16, :got:__blue_glCore_glGetPathLengthNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathLengthNV] + .global bluegl_glGetActiveVaryingNV + .type bluegl_glGetActiveVaryingNV, %function +bluegl_glGetActiveVaryingNV: + adrp x16, :got:__blue_glCore_glGetActiveVaryingNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveVaryingNV] ldr x16, [x16] br x16 - .size bluegl_glGetPathLengthNV, .-bluegl_glGetPathLengthNV + .size bluegl_glGetActiveVaryingNV, .-bluegl_glGetActiveVaryingNV .align 2 - .global bluegl_glUnmapObjectBufferATI - .type bluegl_glUnmapObjectBufferATI, %function -bluegl_glUnmapObjectBufferATI: - adrp x16, :got:__blue_glCore_glUnmapObjectBufferATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glUnmapObjectBufferATI] + .global bluegl_glGetTransformFeedbackVaryingNV + .type bluegl_glGetTransformFeedbackVaryingNV, %function +bluegl_glGetTransformFeedbackVaryingNV: + adrp x16, :got:__blue_glCore_glGetTransformFeedbackVaryingNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTransformFeedbackVaryingNV] ldr x16, [x16] br x16 - .size bluegl_glUnmapObjectBufferATI, .-bluegl_glUnmapObjectBufferATI + .size bluegl_glGetTransformFeedbackVaryingNV, .-bluegl_glGetTransformFeedbackVaryingNV .align 2 - .global bluegl_glValidateProgramPipeline - .type bluegl_glValidateProgramPipeline, %function -bluegl_glValidateProgramPipeline: - adrp x16, :got:__blue_glCore_glValidateProgramPipeline - ldr x16, [x16, #:got_lo12:__blue_glCore_glValidateProgramPipeline] + .global bluegl_glTransformFeedbackStreamAttribsNV + .type bluegl_glTransformFeedbackStreamAttribsNV, %function +bluegl_glTransformFeedbackStreamAttribsNV: + adrp x16, :got:__blue_glCore_glTransformFeedbackStreamAttribsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTransformFeedbackStreamAttribsNV] ldr x16, [x16] br x16 - .size bluegl_glValidateProgramPipeline, .-bluegl_glValidateProgramPipeline + .size bluegl_glTransformFeedbackStreamAttribsNV, .-bluegl_glTransformFeedbackStreamAttribsNV .align 2 - .global bluegl_glIsProgram - .type bluegl_glIsProgram, %function -bluegl_glIsProgram: - adrp x16, :got:__blue_glCore_glIsProgram - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsProgram] + .global bluegl_glBindTransformFeedbackNV + .type bluegl_glBindTransformFeedbackNV, %function +bluegl_glBindTransformFeedbackNV: + adrp x16, :got:__blue_glCore_glBindTransformFeedbackNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindTransformFeedbackNV] ldr x16, [x16] br x16 - .size bluegl_glIsProgram, .-bluegl_glIsProgram + .size bluegl_glBindTransformFeedbackNV, .-bluegl_glBindTransformFeedbackNV .align 2 - .global bluegl_glVertexAttrib4hvNV - .type bluegl_glVertexAttrib4hvNV, %function -bluegl_glVertexAttrib4hvNV: - adrp x16, :got:__blue_glCore_glVertexAttrib4hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4hvNV] + .global bluegl_glDeleteTransformFeedbacksNV + .type bluegl_glDeleteTransformFeedbacksNV, %function +bluegl_glDeleteTransformFeedbacksNV: + adrp x16, :got:__blue_glCore_glDeleteTransformFeedbacksNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteTransformFeedbacksNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4hvNV, .-bluegl_glVertexAttrib4hvNV + .size bluegl_glDeleteTransformFeedbacksNV, .-bluegl_glDeleteTransformFeedbacksNV .align 2 - .global bluegl_glLoadTransposeMatrixdARB - .type bluegl_glLoadTransposeMatrixdARB, %function -bluegl_glLoadTransposeMatrixdARB: - adrp x16, :got:__blue_glCore_glLoadTransposeMatrixdARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glLoadTransposeMatrixdARB] + .global bluegl_glGenTransformFeedbacksNV + .type bluegl_glGenTransformFeedbacksNV, %function +bluegl_glGenTransformFeedbacksNV: + adrp x16, :got:__blue_glCore_glGenTransformFeedbacksNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenTransformFeedbacksNV] ldr x16, [x16] br x16 - .size bluegl_glLoadTransposeMatrixdARB, .-bluegl_glLoadTransposeMatrixdARB + .size bluegl_glGenTransformFeedbacksNV, .-bluegl_glGenTransformFeedbacksNV .align 2 - .global bluegl_glMapVertexAttrib2dAPPLE - .type bluegl_glMapVertexAttrib2dAPPLE, %function -bluegl_glMapVertexAttrib2dAPPLE: - adrp x16, :got:__blue_glCore_glMapVertexAttrib2dAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glMapVertexAttrib2dAPPLE] + .global bluegl_glIsTransformFeedbackNV + .type bluegl_glIsTransformFeedbackNV, %function +bluegl_glIsTransformFeedbackNV: + adrp x16, :got:__blue_glCore_glIsTransformFeedbackNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsTransformFeedbackNV] ldr x16, [x16] br x16 - .size bluegl_glMapVertexAttrib2dAPPLE, .-bluegl_glMapVertexAttrib2dAPPLE + .size bluegl_glIsTransformFeedbackNV, .-bluegl_glIsTransformFeedbackNV .align 2 - .global bluegl_glProgramBinary - .type bluegl_glProgramBinary, %function -bluegl_glProgramBinary: - adrp x16, :got:__blue_glCore_glProgramBinary - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramBinary] + .global bluegl_glPauseTransformFeedbackNV + .type bluegl_glPauseTransformFeedbackNV, %function +bluegl_glPauseTransformFeedbackNV: + adrp x16, :got:__blue_glCore_glPauseTransformFeedbackNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glPauseTransformFeedbackNV] ldr x16, [x16] br x16 - .size bluegl_glProgramBinary, .-bluegl_glProgramBinary + .size bluegl_glPauseTransformFeedbackNV, .-bluegl_glPauseTransformFeedbackNV .align 2 - .global bluegl_glUniform3i - .type bluegl_glUniform3i, %function -bluegl_glUniform3i: - adrp x16, :got:__blue_glCore_glUniform3i - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3i] + .global bluegl_glResumeTransformFeedbackNV + .type bluegl_glResumeTransformFeedbackNV, %function +bluegl_glResumeTransformFeedbackNV: + adrp x16, :got:__blue_glCore_glResumeTransformFeedbackNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glResumeTransformFeedbackNV] ldr x16, [x16] br x16 - .size bluegl_glUniform3i, .-bluegl_glUniform3i + .size bluegl_glResumeTransformFeedbackNV, .-bluegl_glResumeTransformFeedbackNV .align 2 - .global bluegl_glProgramUniform2dEXT - .type bluegl_glProgramUniform2dEXT, %function -bluegl_glProgramUniform2dEXT: - adrp x16, :got:__blue_glCore_glProgramUniform2dEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2dEXT] + .global bluegl_glDrawTransformFeedbackNV + .type bluegl_glDrawTransformFeedbackNV, %function +bluegl_glDrawTransformFeedbackNV: + adrp x16, :got:__blue_glCore_glDrawTransformFeedbackNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawTransformFeedbackNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2dEXT, .-bluegl_glProgramUniform2dEXT + .size bluegl_glDrawTransformFeedbackNV, .-bluegl_glDrawTransformFeedbackNV .align 2 - .global bluegl_glDepthRangeIndexed - .type bluegl_glDepthRangeIndexed, %function -bluegl_glDepthRangeIndexed: - adrp x16, :got:__blue_glCore_glDepthRangeIndexed - ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthRangeIndexed] + .global bluegl_glVDPAUInitNV + .type bluegl_glVDPAUInitNV, %function +bluegl_glVDPAUInitNV: + adrp x16, :got:__blue_glCore_glVDPAUInitNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAUInitNV] ldr x16, [x16] br x16 - .size bluegl_glDepthRangeIndexed, .-bluegl_glDepthRangeIndexed + .size bluegl_glVDPAUInitNV, .-bluegl_glVDPAUInitNV .align 2 - .global bluegl_glEvalCoord1xOES - .type bluegl_glEvalCoord1xOES, %function -bluegl_glEvalCoord1xOES: - adrp x16, :got:__blue_glCore_glEvalCoord1xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glEvalCoord1xOES] + .global bluegl_glVDPAUFiniNV + .type bluegl_glVDPAUFiniNV, %function +bluegl_glVDPAUFiniNV: + adrp x16, :got:__blue_glCore_glVDPAUFiniNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAUFiniNV] ldr x16, [x16] br x16 - .size bluegl_glEvalCoord1xOES, .-bluegl_glEvalCoord1xOES + .size bluegl_glVDPAUFiniNV, .-bluegl_glVDPAUFiniNV .align 2 - .global bluegl_glVertexArrayRangeAPPLE - .type bluegl_glVertexArrayRangeAPPLE, %function -bluegl_glVertexArrayRangeAPPLE: - adrp x16, :got:__blue_glCore_glVertexArrayRangeAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayRangeAPPLE] + .global bluegl_glVDPAURegisterVideoSurfaceNV + .type bluegl_glVDPAURegisterVideoSurfaceNV, %function +bluegl_glVDPAURegisterVideoSurfaceNV: + adrp x16, :got:__blue_glCore_glVDPAURegisterVideoSurfaceNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAURegisterVideoSurfaceNV] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayRangeAPPLE, .-bluegl_glVertexArrayRangeAPPLE + .size bluegl_glVDPAURegisterVideoSurfaceNV, .-bluegl_glVDPAURegisterVideoSurfaceNV .align 2 - .global bluegl_glVertexStream1svATI - .type bluegl_glVertexStream1svATI, %function -bluegl_glVertexStream1svATI: - adrp x16, :got:__blue_glCore_glVertexStream1svATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream1svATI] + .global bluegl_glVDPAURegisterOutputSurfaceNV + .type bluegl_glVDPAURegisterOutputSurfaceNV, %function +bluegl_glVDPAURegisterOutputSurfaceNV: + adrp x16, :got:__blue_glCore_glVDPAURegisterOutputSurfaceNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAURegisterOutputSurfaceNV] ldr x16, [x16] br x16 - .size bluegl_glVertexStream1svATI, .-bluegl_glVertexStream1svATI + .size bluegl_glVDPAURegisterOutputSurfaceNV, .-bluegl_glVDPAURegisterOutputSurfaceNV .align 2 - .global bluegl_glNormalStream3iATI - .type bluegl_glNormalStream3iATI, %function -bluegl_glNormalStream3iATI: - adrp x16, :got:__blue_glCore_glNormalStream3iATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalStream3iATI] + .global bluegl_glVDPAUIsSurfaceNV + .type bluegl_glVDPAUIsSurfaceNV, %function +bluegl_glVDPAUIsSurfaceNV: + adrp x16, :got:__blue_glCore_glVDPAUIsSurfaceNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAUIsSurfaceNV] ldr x16, [x16] br x16 - .size bluegl_glNormalStream3iATI, .-bluegl_glNormalStream3iATI + .size bluegl_glVDPAUIsSurfaceNV, .-bluegl_glVDPAUIsSurfaceNV .align 2 - .global bluegl_glProgramUniform4f - .type bluegl_glProgramUniform4f, %function -bluegl_glProgramUniform4f: - adrp x16, :got:__blue_glCore_glProgramUniform4f - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4f] + .global bluegl_glVDPAUUnregisterSurfaceNV + .type bluegl_glVDPAUUnregisterSurfaceNV, %function +bluegl_glVDPAUUnregisterSurfaceNV: + adrp x16, :got:__blue_glCore_glVDPAUUnregisterSurfaceNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAUUnregisterSurfaceNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4f, .-bluegl_glProgramUniform4f + .size bluegl_glVDPAUUnregisterSurfaceNV, .-bluegl_glVDPAUUnregisterSurfaceNV .align 2 - .global bluegl_glScalexOES - .type bluegl_glScalexOES, %function -bluegl_glScalexOES: - adrp x16, :got:__blue_glCore_glScalexOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glScalexOES] + .global bluegl_glVDPAUGetSurfaceivNV + .type bluegl_glVDPAUGetSurfaceivNV, %function +bluegl_glVDPAUGetSurfaceivNV: + adrp x16, :got:__blue_glCore_glVDPAUGetSurfaceivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAUGetSurfaceivNV] ldr x16, [x16] br x16 - .size bluegl_glScalexOES, .-bluegl_glScalexOES + .size bluegl_glVDPAUGetSurfaceivNV, .-bluegl_glVDPAUGetSurfaceivNV .align 2 - .global bluegl_glUniform1fv - .type bluegl_glUniform1fv, %function -bluegl_glUniform1fv: - adrp x16, :got:__blue_glCore_glUniform1fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1fv] + .global bluegl_glVDPAUSurfaceAccessNV + .type bluegl_glVDPAUSurfaceAccessNV, %function +bluegl_glVDPAUSurfaceAccessNV: + adrp x16, :got:__blue_glCore_glVDPAUSurfaceAccessNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAUSurfaceAccessNV] ldr x16, [x16] br x16 - .size bluegl_glUniform1fv, .-bluegl_glUniform1fv + .size bluegl_glVDPAUSurfaceAccessNV, .-bluegl_glVDPAUSurfaceAccessNV .align 2 - .global bluegl_glGetActiveUniform - .type bluegl_glGetActiveUniform, %function -bluegl_glGetActiveUniform: - adrp x16, :got:__blue_glCore_glGetActiveUniform - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveUniform] + .global bluegl_glVDPAUMapSurfacesNV + .type bluegl_glVDPAUMapSurfacesNV, %function +bluegl_glVDPAUMapSurfacesNV: + adrp x16, :got:__blue_glCore_glVDPAUMapSurfacesNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAUMapSurfacesNV] ldr x16, [x16] br x16 - .size bluegl_glGetActiveUniform, .-bluegl_glGetActiveUniform + .size bluegl_glVDPAUMapSurfacesNV, .-bluegl_glVDPAUMapSurfacesNV .align 2 - .global bluegl_glProgramUniformMatrix4x3fv - .type bluegl_glProgramUniformMatrix4x3fv, %function -bluegl_glProgramUniformMatrix4x3fv: - adrp x16, :got:__blue_glCore_glProgramUniformMatrix4x3fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformMatrix4x3fv] + .global bluegl_glVDPAUUnmapSurfacesNV + .type bluegl_glVDPAUUnmapSurfacesNV, %function +bluegl_glVDPAUUnmapSurfacesNV: + adrp x16, :got:__blue_glCore_glVDPAUUnmapSurfacesNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAUUnmapSurfacesNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformMatrix4x3fv, .-bluegl_glProgramUniformMatrix4x3fv + .size bluegl_glVDPAUUnmapSurfacesNV, .-bluegl_glVDPAUUnmapSurfacesNV .align 2 - .global bluegl_glCreateVertexArrays - .type bluegl_glCreateVertexArrays, %function -bluegl_glCreateVertexArrays: - adrp x16, :got:__blue_glCore_glCreateVertexArrays - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateVertexArrays] + .global bluegl_glFlushVertexArrayRangeNV + .type bluegl_glFlushVertexArrayRangeNV, %function +bluegl_glFlushVertexArrayRangeNV: + adrp x16, :got:__blue_glCore_glFlushVertexArrayRangeNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glFlushVertexArrayRangeNV] ldr x16, [x16] br x16 - .size bluegl_glCreateVertexArrays, .-bluegl_glCreateVertexArrays + .size bluegl_glFlushVertexArrayRangeNV, .-bluegl_glFlushVertexArrayRangeNV .align 2 - .global bluegl_glWindowPos3dv - .type bluegl_glWindowPos3dv, %function -bluegl_glWindowPos3dv: - adrp x16, :got:__blue_glCore_glWindowPos3dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3dv] + .global bluegl_glVertexArrayRangeNV + .type bluegl_glVertexArrayRangeNV, %function +bluegl_glVertexArrayRangeNV: + adrp x16, :got:__blue_glCore_glVertexArrayRangeNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayRangeNV] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3dv, .-bluegl_glWindowPos3dv + .size bluegl_glVertexArrayRangeNV, .-bluegl_glVertexArrayRangeNV .align 2 - .global bluegl_glUniform1fARB - .type bluegl_glUniform1fARB, %function -bluegl_glUniform1fARB: - adrp x16, :got:__blue_glCore_glUniform1fARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1fARB] + .global bluegl_glVertexAttribL1i64NV + .type bluegl_glVertexAttribL1i64NV, %function +bluegl_glVertexAttribL1i64NV: + adrp x16, :got:__blue_glCore_glVertexAttribL1i64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1i64NV] ldr x16, [x16] br x16 - .size bluegl_glUniform1fARB, .-bluegl_glUniform1fARB + .size bluegl_glVertexAttribL1i64NV, .-bluegl_glVertexAttribL1i64NV .align 2 - .global bluegl_glFragmentMaterialiSGIX - .type bluegl_glFragmentMaterialiSGIX, %function -bluegl_glFragmentMaterialiSGIX: - adrp x16, :got:__blue_glCore_glFragmentMaterialiSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentMaterialiSGIX] + .global bluegl_glVertexAttribL2i64NV + .type bluegl_glVertexAttribL2i64NV, %function +bluegl_glVertexAttribL2i64NV: + adrp x16, :got:__blue_glCore_glVertexAttribL2i64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL2i64NV] ldr x16, [x16] br x16 - .size bluegl_glFragmentMaterialiSGIX, .-bluegl_glFragmentMaterialiSGIX + .size bluegl_glVertexAttribL2i64NV, .-bluegl_glVertexAttribL2i64NV .align 2 - .global bluegl_glGetVertexAttribArrayObjectfvATI - .type bluegl_glGetVertexAttribArrayObjectfvATI, %function -bluegl_glGetVertexAttribArrayObjectfvATI: - adrp x16, :got:__blue_glCore_glGetVertexAttribArrayObjectfvATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribArrayObjectfvATI] + .global bluegl_glVertexAttribL3i64NV + .type bluegl_glVertexAttribL3i64NV, %function +bluegl_glVertexAttribL3i64NV: + adrp x16, :got:__blue_glCore_glVertexAttribL3i64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL3i64NV] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribArrayObjectfvATI, .-bluegl_glGetVertexAttribArrayObjectfvATI + .size bluegl_glVertexAttribL3i64NV, .-bluegl_glVertexAttribL3i64NV .align 2 - .global bluegl_glClearAccumxOES - .type bluegl_glClearAccumxOES, %function -bluegl_glClearAccumxOES: - adrp x16, :got:__blue_glCore_glClearAccumxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearAccumxOES] + .global bluegl_glVertexAttribL4i64NV + .type bluegl_glVertexAttribL4i64NV, %function +bluegl_glVertexAttribL4i64NV: + adrp x16, :got:__blue_glCore_glVertexAttribL4i64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL4i64NV] ldr x16, [x16] br x16 - .size bluegl_glClearAccumxOES, .-bluegl_glClearAccumxOES + .size bluegl_glVertexAttribL4i64NV, .-bluegl_glVertexAttribL4i64NV .align 2 - .global bluegl_glBindFragDataLocationEXT - .type bluegl_glBindFragDataLocationEXT, %function -bluegl_glBindFragDataLocationEXT: - adrp x16, :got:__blue_glCore_glBindFragDataLocationEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindFragDataLocationEXT] + .global bluegl_glVertexAttribL1i64vNV + .type bluegl_glVertexAttribL1i64vNV, %function +bluegl_glVertexAttribL1i64vNV: + adrp x16, :got:__blue_glCore_glVertexAttribL1i64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1i64vNV] ldr x16, [x16] br x16 - .size bluegl_glBindFragDataLocationEXT, .-bluegl_glBindFragDataLocationEXT + .size bluegl_glVertexAttribL1i64vNV, .-bluegl_glVertexAttribL1i64vNV .align 2 - .global bluegl_glMultiTexCoord4dARB - .type bluegl_glMultiTexCoord4dARB, %function -bluegl_glMultiTexCoord4dARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord4dARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4dARB] + .global bluegl_glVertexAttribL2i64vNV + .type bluegl_glVertexAttribL2i64vNV, %function +bluegl_glVertexAttribL2i64vNV: + adrp x16, :got:__blue_glCore_glVertexAttribL2i64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL2i64vNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4dARB, .-bluegl_glMultiTexCoord4dARB + .size bluegl_glVertexAttribL2i64vNV, .-bluegl_glVertexAttribL2i64vNV .align 2 - .global bluegl_glConvolutionParameterfv - .type bluegl_glConvolutionParameterfv, %function -bluegl_glConvolutionParameterfv: - adrp x16, :got:__blue_glCore_glConvolutionParameterfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glConvolutionParameterfv] + .global bluegl_glVertexAttribL3i64vNV + .type bluegl_glVertexAttribL3i64vNV, %function +bluegl_glVertexAttribL3i64vNV: + adrp x16, :got:__blue_glCore_glVertexAttribL3i64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL3i64vNV] ldr x16, [x16] br x16 - .size bluegl_glConvolutionParameterfv, .-bluegl_glConvolutionParameterfv + .size bluegl_glVertexAttribL3i64vNV, .-bluegl_glVertexAttribL3i64vNV .align 2 - .global bluegl_glFragmentColorMaterialSGIX - .type bluegl_glFragmentColorMaterialSGIX, %function -bluegl_glFragmentColorMaterialSGIX: - adrp x16, :got:__blue_glCore_glFragmentColorMaterialSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentColorMaterialSGIX] + .global bluegl_glVertexAttribL4i64vNV + .type bluegl_glVertexAttribL4i64vNV, %function +bluegl_glVertexAttribL4i64vNV: + adrp x16, :got:__blue_glCore_glVertexAttribL4i64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL4i64vNV] ldr x16, [x16] br x16 - .size bluegl_glFragmentColorMaterialSGIX, .-bluegl_glFragmentColorMaterialSGIX + .size bluegl_glVertexAttribL4i64vNV, .-bluegl_glVertexAttribL4i64vNV .align 2 - .global bluegl_glUniformMatrix3dv - .type bluegl_glUniformMatrix3dv, %function -bluegl_glUniformMatrix3dv: - adrp x16, :got:__blue_glCore_glUniformMatrix3dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix3dv] + .global bluegl_glVertexAttribL1ui64NV + .type bluegl_glVertexAttribL1ui64NV, %function +bluegl_glVertexAttribL1ui64NV: + adrp x16, :got:__blue_glCore_glVertexAttribL1ui64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1ui64NV] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix3dv, .-bluegl_glUniformMatrix3dv + .size bluegl_glVertexAttribL1ui64NV, .-bluegl_glVertexAttribL1ui64NV .align 2 - .global bluegl_glGetnPixelMapusv - .type bluegl_glGetnPixelMapusv, %function -bluegl_glGetnPixelMapusv: - adrp x16, :got:__blue_glCore_glGetnPixelMapusv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnPixelMapusv] + .global bluegl_glVertexAttribL2ui64NV + .type bluegl_glVertexAttribL2ui64NV, %function +bluegl_glVertexAttribL2ui64NV: + adrp x16, :got:__blue_glCore_glVertexAttribL2ui64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL2ui64NV] ldr x16, [x16] br x16 - .size bluegl_glGetnPixelMapusv, .-bluegl_glGetnPixelMapusv + .size bluegl_glVertexAttribL2ui64NV, .-bluegl_glVertexAttribL2ui64NV .align 2 - .global bluegl_glFramebufferTextureLayer - .type bluegl_glFramebufferTextureLayer, %function -bluegl_glFramebufferTextureLayer: - adrp x16, :got:__blue_glCore_glFramebufferTextureLayer - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTextureLayer] + .global bluegl_glVertexAttribL3ui64NV + .type bluegl_glVertexAttribL3ui64NV, %function +bluegl_glVertexAttribL3ui64NV: + adrp x16, :got:__blue_glCore_glVertexAttribL3ui64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL3ui64NV] + ldr x16, [x16] + br x16 + .size bluegl_glVertexAttribL3ui64NV, .-bluegl_glVertexAttribL3ui64NV + + .align 2 + .global bluegl_glVertexAttribL4ui64NV + .type bluegl_glVertexAttribL4ui64NV, %function +bluegl_glVertexAttribL4ui64NV: + adrp x16, :got:__blue_glCore_glVertexAttribL4ui64NV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL4ui64NV] ldr x16, [x16] br x16 - .size bluegl_glFramebufferTextureLayer, .-bluegl_glFramebufferTextureLayer + .size bluegl_glVertexAttribL4ui64NV, .-bluegl_glVertexAttribL4ui64NV .align 2 - .global bluegl_glStencilThenCoverStrokePathInstancedNV - .type bluegl_glStencilThenCoverStrokePathInstancedNV, %function -bluegl_glStencilThenCoverStrokePathInstancedNV: - adrp x16, :got:__blue_glCore_glStencilThenCoverStrokePathInstancedNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilThenCoverStrokePathInstancedNV] + .global bluegl_glVertexAttribL1ui64vNV + .type bluegl_glVertexAttribL1ui64vNV, %function +bluegl_glVertexAttribL1ui64vNV: + adrp x16, :got:__blue_glCore_glVertexAttribL1ui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1ui64vNV] ldr x16, [x16] br x16 - .size bluegl_glStencilThenCoverStrokePathInstancedNV, .-bluegl_glStencilThenCoverStrokePathInstancedNV + .size bluegl_glVertexAttribL1ui64vNV, .-bluegl_glVertexAttribL1ui64vNV .align 2 - .global bluegl_glVDPAURegisterOutputSurfaceNV - .type bluegl_glVDPAURegisterOutputSurfaceNV, %function -bluegl_glVDPAURegisterOutputSurfaceNV: - adrp x16, :got:__blue_glCore_glVDPAURegisterOutputSurfaceNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAURegisterOutputSurfaceNV] + .global bluegl_glVertexAttribL2ui64vNV + .type bluegl_glVertexAttribL2ui64vNV, %function +bluegl_glVertexAttribL2ui64vNV: + adrp x16, :got:__blue_glCore_glVertexAttribL2ui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL2ui64vNV] ldr x16, [x16] br x16 - .size bluegl_glVDPAURegisterOutputSurfaceNV, .-bluegl_glVDPAURegisterOutputSurfaceNV + .size bluegl_glVertexAttribL2ui64vNV, .-bluegl_glVertexAttribL2ui64vNV .align 2 - .global bluegl_glMultiTexCoord4dvARB - .type bluegl_glMultiTexCoord4dvARB, %function -bluegl_glMultiTexCoord4dvARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord4dvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4dvARB] + .global bluegl_glVertexAttribL3ui64vNV + .type bluegl_glVertexAttribL3ui64vNV, %function +bluegl_glVertexAttribL3ui64vNV: + adrp x16, :got:__blue_glCore_glVertexAttribL3ui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL3ui64vNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4dvARB, .-bluegl_glMultiTexCoord4dvARB + .size bluegl_glVertexAttribL3ui64vNV, .-bluegl_glVertexAttribL3ui64vNV .align 2 - .global bluegl_glCopyTextureSubImage3D - .type bluegl_glCopyTextureSubImage3D, %function -bluegl_glCopyTextureSubImage3D: - adrp x16, :got:__blue_glCore_glCopyTextureSubImage3D - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyTextureSubImage3D] + .global bluegl_glVertexAttribL4ui64vNV + .type bluegl_glVertexAttribL4ui64vNV, %function +bluegl_glVertexAttribL4ui64vNV: + adrp x16, :got:__blue_glCore_glVertexAttribL4ui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL4ui64vNV] ldr x16, [x16] br x16 - .size bluegl_glCopyTextureSubImage3D, .-bluegl_glCopyTextureSubImage3D + .size bluegl_glVertexAttribL4ui64vNV, .-bluegl_glVertexAttribL4ui64vNV .align 2 - .global bluegl_glGetVariantIntegervEXT - .type bluegl_glGetVariantIntegervEXT, %function -bluegl_glGetVariantIntegervEXT: - adrp x16, :got:__blue_glCore_glGetVariantIntegervEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVariantIntegervEXT] + .global bluegl_glGetVertexAttribLi64vNV + .type bluegl_glGetVertexAttribLi64vNV, %function +bluegl_glGetVertexAttribLi64vNV: + adrp x16, :got:__blue_glCore_glGetVertexAttribLi64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribLi64vNV] ldr x16, [x16] br x16 - .size bluegl_glGetVariantIntegervEXT, .-bluegl_glGetVariantIntegervEXT + .size bluegl_glGetVertexAttribLi64vNV, .-bluegl_glGetVertexAttribLi64vNV .align 2 - .global bluegl_glGetTexEnvxvOES - .type bluegl_glGetTexEnvxvOES, %function -bluegl_glGetTexEnvxvOES: - adrp x16, :got:__blue_glCore_glGetTexEnvxvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexEnvxvOES] + .global bluegl_glGetVertexAttribLui64vNV + .type bluegl_glGetVertexAttribLui64vNV, %function +bluegl_glGetVertexAttribLui64vNV: + adrp x16, :got:__blue_glCore_glGetVertexAttribLui64vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribLui64vNV] ldr x16, [x16] br x16 - .size bluegl_glGetTexEnvxvOES, .-bluegl_glGetTexEnvxvOES + .size bluegl_glGetVertexAttribLui64vNV, .-bluegl_glGetVertexAttribLui64vNV .align 2 - .global bluegl_glGetFloati_vEXT - .type bluegl_glGetFloati_vEXT, %function -bluegl_glGetFloati_vEXT: - adrp x16, :got:__blue_glCore_glGetFloati_vEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFloati_vEXT] + .global bluegl_glVertexAttribLFormatNV + .type bluegl_glVertexAttribLFormatNV, %function +bluegl_glVertexAttribLFormatNV: + adrp x16, :got:__blue_glCore_glVertexAttribLFormatNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribLFormatNV] ldr x16, [x16] br x16 - .size bluegl_glGetFloati_vEXT, .-bluegl_glGetFloati_vEXT + .size bluegl_glVertexAttribLFormatNV, .-bluegl_glVertexAttribLFormatNV .align 2 - .global bluegl_glAsyncMarkerSGIX - .type bluegl_glAsyncMarkerSGIX, %function -bluegl_glAsyncMarkerSGIX: - adrp x16, :got:__blue_glCore_glAsyncMarkerSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glAsyncMarkerSGIX] + .global bluegl_glBufferAddressRangeNV + .type bluegl_glBufferAddressRangeNV, %function +bluegl_glBufferAddressRangeNV: + adrp x16, :got:__blue_glCore_glBufferAddressRangeNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glBufferAddressRangeNV] ldr x16, [x16] br x16 - .size bluegl_glAsyncMarkerSGIX, .-bluegl_glAsyncMarkerSGIX + .size bluegl_glBufferAddressRangeNV, .-bluegl_glBufferAddressRangeNV .align 2 - .global bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN - .type bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN, %function -bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN: - adrp x16, :got:__blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN] + .global bluegl_glVertexFormatNV + .type bluegl_glVertexFormatNV, %function +bluegl_glVertexFormatNV: + adrp x16, :got:__blue_glCore_glVertexFormatNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexFormatNV] ldr x16, [x16] br x16 - .size bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN, .-bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN + .size bluegl_glVertexFormatNV, .-bluegl_glVertexFormatNV .align 2 - .global bluegl_glTexRenderbufferNV - .type bluegl_glTexRenderbufferNV, %function -bluegl_glTexRenderbufferNV: - adrp x16, :got:__blue_glCore_glTexRenderbufferNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexRenderbufferNV] + .global bluegl_glNormalFormatNV + .type bluegl_glNormalFormatNV, %function +bluegl_glNormalFormatNV: + adrp x16, :got:__blue_glCore_glNormalFormatNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalFormatNV] ldr x16, [x16] br x16 - .size bluegl_glTexRenderbufferNV, .-bluegl_glTexRenderbufferNV + .size bluegl_glNormalFormatNV, .-bluegl_glNormalFormatNV .align 2 - .global bluegl_glGetConvolutionParameterfvEXT - .type bluegl_glGetConvolutionParameterfvEXT, %function -bluegl_glGetConvolutionParameterfvEXT: - adrp x16, :got:__blue_glCore_glGetConvolutionParameterfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetConvolutionParameterfvEXT] + .global bluegl_glColorFormatNV + .type bluegl_glColorFormatNV, %function +bluegl_glColorFormatNV: + adrp x16, :got:__blue_glCore_glColorFormatNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorFormatNV] ldr x16, [x16] br x16 - .size bluegl_glGetConvolutionParameterfvEXT, .-bluegl_glGetConvolutionParameterfvEXT + .size bluegl_glColorFormatNV, .-bluegl_glColorFormatNV .align 2 - .global bluegl_glLightxvOES - .type bluegl_glLightxvOES, %function -bluegl_glLightxvOES: - adrp x16, :got:__blue_glCore_glLightxvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glLightxvOES] + .global bluegl_glIndexFormatNV + .type bluegl_glIndexFormatNV, %function +bluegl_glIndexFormatNV: + adrp x16, :got:__blue_glCore_glIndexFormatNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glIndexFormatNV] ldr x16, [x16] br x16 - .size bluegl_glLightxvOES, .-bluegl_glLightxvOES + .size bluegl_glIndexFormatNV, .-bluegl_glIndexFormatNV .align 2 - .global bluegl_glDeleteNamedStringARB - .type bluegl_glDeleteNamedStringARB, %function -bluegl_glDeleteNamedStringARB: - adrp x16, :got:__blue_glCore_glDeleteNamedStringARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteNamedStringARB] + .global bluegl_glTexCoordFormatNV + .type bluegl_glTexCoordFormatNV, %function +bluegl_glTexCoordFormatNV: + adrp x16, :got:__blue_glCore_glTexCoordFormatNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordFormatNV] ldr x16, [x16] br x16 - .size bluegl_glDeleteNamedStringARB, .-bluegl_glDeleteNamedStringARB + .size bluegl_glTexCoordFormatNV, .-bluegl_glTexCoordFormatNV .align 2 - .global bluegl_glColor3hvNV - .type bluegl_glColor3hvNV, %function -bluegl_glColor3hvNV: - adrp x16, :got:__blue_glCore_glColor3hvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glColor3hvNV] + .global bluegl_glEdgeFlagFormatNV + .type bluegl_glEdgeFlagFormatNV, %function +bluegl_glEdgeFlagFormatNV: + adrp x16, :got:__blue_glCore_glEdgeFlagFormatNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glEdgeFlagFormatNV] ldr x16, [x16] br x16 - .size bluegl_glColor3hvNV, .-bluegl_glColor3hvNV + .size bluegl_glEdgeFlagFormatNV, .-bluegl_glEdgeFlagFormatNV .align 2 - .global bluegl_glUniformMatrix4dv - .type bluegl_glUniformMatrix4dv, %function -bluegl_glUniformMatrix4dv: - adrp x16, :got:__blue_glCore_glUniformMatrix4dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix4dv] + .global bluegl_glSecondaryColorFormatNV + .type bluegl_glSecondaryColorFormatNV, %function +bluegl_glSecondaryColorFormatNV: + adrp x16, :got:__blue_glCore_glSecondaryColorFormatNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColorFormatNV] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix4dv, .-bluegl_glUniformMatrix4dv + .size bluegl_glSecondaryColorFormatNV, .-bluegl_glSecondaryColorFormatNV .align 2 - .global bluegl_glCompressedTexImage2DARB - .type bluegl_glCompressedTexImage2DARB, %function -bluegl_glCompressedTexImage2DARB: - adrp x16, :got:__blue_glCore_glCompressedTexImage2DARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexImage2DARB] + .global bluegl_glFogCoordFormatNV + .type bluegl_glFogCoordFormatNV, %function +bluegl_glFogCoordFormatNV: + adrp x16, :got:__blue_glCore_glFogCoordFormatNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glFogCoordFormatNV] ldr x16, [x16] br x16 - .size bluegl_glCompressedTexImage2DARB, .-bluegl_glCompressedTexImage2DARB + .size bluegl_glFogCoordFormatNV, .-bluegl_glFogCoordFormatNV .align 2 - .global bluegl_glGenTexturesEXT - .type bluegl_glGenTexturesEXT, %function -bluegl_glGenTexturesEXT: - adrp x16, :got:__blue_glCore_glGenTexturesEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenTexturesEXT] + .global bluegl_glVertexAttribFormatNV + .type bluegl_glVertexAttribFormatNV, %function +bluegl_glVertexAttribFormatNV: + adrp x16, :got:__blue_glCore_glVertexAttribFormatNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribFormatNV] ldr x16, [x16] br x16 - .size bluegl_glGenTexturesEXT, .-bluegl_glGenTexturesEXT + .size bluegl_glVertexAttribFormatNV, .-bluegl_glVertexAttribFormatNV .align 2 - .global bluegl_glPathMemoryGlyphIndexArrayNV - .type bluegl_glPathMemoryGlyphIndexArrayNV, %function -bluegl_glPathMemoryGlyphIndexArrayNV: - adrp x16, :got:__blue_glCore_glPathMemoryGlyphIndexArrayNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathMemoryGlyphIndexArrayNV] + .global bluegl_glVertexAttribIFormatNV + .type bluegl_glVertexAttribIFormatNV, %function +bluegl_glVertexAttribIFormatNV: + adrp x16, :got:__blue_glCore_glVertexAttribIFormatNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribIFormatNV] ldr x16, [x16] br x16 - .size bluegl_glPathMemoryGlyphIndexArrayNV, .-bluegl_glPathMemoryGlyphIndexArrayNV + .size bluegl_glVertexAttribIFormatNV, .-bluegl_glVertexAttribIFormatNV .align 2 - .global bluegl_glGetBufferSubDataARB - .type bluegl_glGetBufferSubDataARB, %function -bluegl_glGetBufferSubDataARB: - adrp x16, :got:__blue_glCore_glGetBufferSubDataARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBufferSubDataARB] + .global bluegl_glGetIntegerui64i_vNV + .type bluegl_glGetIntegerui64i_vNV, %function +bluegl_glGetIntegerui64i_vNV: + adrp x16, :got:__blue_glCore_glGetIntegerui64i_vNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetIntegerui64i_vNV] ldr x16, [x16] br x16 - .size bluegl_glGetBufferSubDataARB, .-bluegl_glGetBufferSubDataARB + .size bluegl_glGetIntegerui64i_vNV, .-bluegl_glGetIntegerui64i_vNV .align 2 - .global bluegl_glFinishObjectAPPLE - .type bluegl_glFinishObjectAPPLE, %function -bluegl_glFinishObjectAPPLE: - adrp x16, :got:__blue_glCore_glFinishObjectAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glFinishObjectAPPLE] + .global bluegl_glAreProgramsResidentNV + .type bluegl_glAreProgramsResidentNV, %function +bluegl_glAreProgramsResidentNV: + adrp x16, :got:__blue_glCore_glAreProgramsResidentNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glAreProgramsResidentNV] ldr x16, [x16] br x16 - .size bluegl_glFinishObjectAPPLE, .-bluegl_glFinishObjectAPPLE + .size bluegl_glAreProgramsResidentNV, .-bluegl_glAreProgramsResidentNV .align 2 - .global bluegl_glDetachShader - .type bluegl_glDetachShader, %function -bluegl_glDetachShader: - adrp x16, :got:__blue_glCore_glDetachShader - ldr x16, [x16, #:got_lo12:__blue_glCore_glDetachShader] + .global bluegl_glBindProgramNV + .type bluegl_glBindProgramNV, %function +bluegl_glBindProgramNV: + adrp x16, :got:__blue_glCore_glBindProgramNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindProgramNV] ldr x16, [x16] br x16 - .size bluegl_glDetachShader, .-bluegl_glDetachShader + .size bluegl_glBindProgramNV, .-bluegl_glBindProgramNV .align 2 - .global bluegl_glBindTexture - .type bluegl_glBindTexture, %function -bluegl_glBindTexture: - adrp x16, :got:__blue_glCore_glBindTexture - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindTexture] + .global bluegl_glDeleteProgramsNV + .type bluegl_glDeleteProgramsNV, %function +bluegl_glDeleteProgramsNV: + adrp x16, :got:__blue_glCore_glDeleteProgramsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteProgramsNV] ldr x16, [x16] br x16 - .size bluegl_glBindTexture, .-bluegl_glBindTexture + .size bluegl_glDeleteProgramsNV, .-bluegl_glDeleteProgramsNV .align 2 - .global bluegl_glGetProgramResourcefvNV - .type bluegl_glGetProgramResourcefvNV, %function -bluegl_glGetProgramResourcefvNV: - adrp x16, :got:__blue_glCore_glGetProgramResourcefvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramResourcefvNV] + .global bluegl_glExecuteProgramNV + .type bluegl_glExecuteProgramNV, %function +bluegl_glExecuteProgramNV: + adrp x16, :got:__blue_glCore_glExecuteProgramNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glExecuteProgramNV] ldr x16, [x16] br x16 - .size bluegl_glGetProgramResourcefvNV, .-bluegl_glGetProgramResourcefvNV + .size bluegl_glExecuteProgramNV, .-bluegl_glExecuteProgramNV .align 2 - .global bluegl_glTexCoord2fColor4ubVertex3fvSUN - .type bluegl_glTexCoord2fColor4ubVertex3fvSUN, %function -bluegl_glTexCoord2fColor4ubVertex3fvSUN: - adrp x16, :got:__blue_glCore_glTexCoord2fColor4ubVertex3fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fColor4ubVertex3fvSUN] + .global bluegl_glGenProgramsNV + .type bluegl_glGenProgramsNV, %function +bluegl_glGenProgramsNV: + adrp x16, :got:__blue_glCore_glGenProgramsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenProgramsNV] ldr x16, [x16] br x16 - .size bluegl_glTexCoord2fColor4ubVertex3fvSUN, .-bluegl_glTexCoord2fColor4ubVertex3fvSUN + .size bluegl_glGenProgramsNV, .-bluegl_glGenProgramsNV .align 2 - .global bluegl_glMultiTexCoord4dv - .type bluegl_glMultiTexCoord4dv, %function -bluegl_glMultiTexCoord4dv: - adrp x16, :got:__blue_glCore_glMultiTexCoord4dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4dv] + .global bluegl_glGetProgramParameterdvNV + .type bluegl_glGetProgramParameterdvNV, %function +bluegl_glGetProgramParameterdvNV: + adrp x16, :got:__blue_glCore_glGetProgramParameterdvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramParameterdvNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4dv, .-bluegl_glMultiTexCoord4dv + .size bluegl_glGetProgramParameterdvNV, .-bluegl_glGetProgramParameterdvNV .align 2 - .global bluegl_glIsPointInFillPathNV - .type bluegl_glIsPointInFillPathNV, %function -bluegl_glIsPointInFillPathNV: - adrp x16, :got:__blue_glCore_glIsPointInFillPathNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsPointInFillPathNV] + .global bluegl_glGetProgramParameterfvNV + .type bluegl_glGetProgramParameterfvNV, %function +bluegl_glGetProgramParameterfvNV: + adrp x16, :got:__blue_glCore_glGetProgramParameterfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramParameterfvNV] ldr x16, [x16] br x16 - .size bluegl_glIsPointInFillPathNV, .-bluegl_glIsPointInFillPathNV + .size bluegl_glGetProgramParameterfvNV, .-bluegl_glGetProgramParameterfvNV .align 2 - .global bluegl_glDrawTransformFeedbackInstanced - .type bluegl_glDrawTransformFeedbackInstanced, %function -bluegl_glDrawTransformFeedbackInstanced: - adrp x16, :got:__blue_glCore_glDrawTransformFeedbackInstanced - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawTransformFeedbackInstanced] + .global bluegl_glGetProgramivNV + .type bluegl_glGetProgramivNV, %function +bluegl_glGetProgramivNV: + adrp x16, :got:__blue_glCore_glGetProgramivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramivNV] ldr x16, [x16] br x16 - .size bluegl_glDrawTransformFeedbackInstanced, .-bluegl_glDrawTransformFeedbackInstanced + .size bluegl_glGetProgramivNV, .-bluegl_glGetProgramivNV .align 2 - .global bluegl_glProgramParameteriARB - .type bluegl_glProgramParameteriARB, %function -bluegl_glProgramParameteriARB: - adrp x16, :got:__blue_glCore_glProgramParameteriARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramParameteriARB] + .global bluegl_glGetProgramStringNV + .type bluegl_glGetProgramStringNV, %function +bluegl_glGetProgramStringNV: + adrp x16, :got:__blue_glCore_glGetProgramStringNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramStringNV] ldr x16, [x16] br x16 - .size bluegl_glProgramParameteriARB, .-bluegl_glProgramParameteriARB + .size bluegl_glGetProgramStringNV, .-bluegl_glGetProgramStringNV .align 2 - .global bluegl_glVertexAttrib3fvNV - .type bluegl_glVertexAttrib3fvNV, %function -bluegl_glVertexAttrib3fvNV: - adrp x16, :got:__blue_glCore_glVertexAttrib3fvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3fvNV] + .global bluegl_glGetTrackMatrixivNV + .type bluegl_glGetTrackMatrixivNV, %function +bluegl_glGetTrackMatrixivNV: + adrp x16, :got:__blue_glCore_glGetTrackMatrixivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTrackMatrixivNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3fvNV, .-bluegl_glVertexAttrib3fvNV + .size bluegl_glGetTrackMatrixivNV, .-bluegl_glGetTrackMatrixivNV .align 2 - .global bluegl_glEnableVertexArrayAttrib - .type bluegl_glEnableVertexArrayAttrib, %function -bluegl_glEnableVertexArrayAttrib: - adrp x16, :got:__blue_glCore_glEnableVertexArrayAttrib - ldr x16, [x16, #:got_lo12:__blue_glCore_glEnableVertexArrayAttrib] + .global bluegl_glGetVertexAttribdvNV + .type bluegl_glGetVertexAttribdvNV, %function +bluegl_glGetVertexAttribdvNV: + adrp x16, :got:__blue_glCore_glGetVertexAttribdvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribdvNV] ldr x16, [x16] br x16 - .size bluegl_glEnableVertexArrayAttrib, .-bluegl_glEnableVertexArrayAttrib + .size bluegl_glGetVertexAttribdvNV, .-bluegl_glGetVertexAttribdvNV .align 2 - .global bluegl_glUniform3ui64vNV - .type bluegl_glUniform3ui64vNV, %function -bluegl_glUniform3ui64vNV: - adrp x16, :got:__blue_glCore_glUniform3ui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3ui64vNV] + .global bluegl_glGetVertexAttribfvNV + .type bluegl_glGetVertexAttribfvNV, %function +bluegl_glGetVertexAttribfvNV: + adrp x16, :got:__blue_glCore_glGetVertexAttribfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribfvNV] ldr x16, [x16] br x16 - .size bluegl_glUniform3ui64vNV, .-bluegl_glUniform3ui64vNV + .size bluegl_glGetVertexAttribfvNV, .-bluegl_glGetVertexAttribfvNV .align 2 - .global bluegl_glVertexAttribs4fvNV - .type bluegl_glVertexAttribs4fvNV, %function -bluegl_glVertexAttribs4fvNV: - adrp x16, :got:__blue_glCore_glVertexAttribs4fvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs4fvNV] + .global bluegl_glGetVertexAttribivNV + .type bluegl_glGetVertexAttribivNV, %function +bluegl_glGetVertexAttribivNV: + adrp x16, :got:__blue_glCore_glGetVertexAttribivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribivNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribs4fvNV, .-bluegl_glVertexAttribs4fvNV + .size bluegl_glGetVertexAttribivNV, .-bluegl_glGetVertexAttribivNV .align 2 - .global bluegl_glGetCompressedTextureImageEXT - .type bluegl_glGetCompressedTextureImageEXT, %function -bluegl_glGetCompressedTextureImageEXT: - adrp x16, :got:__blue_glCore_glGetCompressedTextureImageEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCompressedTextureImageEXT] + .global bluegl_glGetVertexAttribPointervNV + .type bluegl_glGetVertexAttribPointervNV, %function +bluegl_glGetVertexAttribPointervNV: + adrp x16, :got:__blue_glCore_glGetVertexAttribPointervNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribPointervNV] ldr x16, [x16] br x16 - .size bluegl_glGetCompressedTextureImageEXT, .-bluegl_glGetCompressedTextureImageEXT + .size bluegl_glGetVertexAttribPointervNV, .-bluegl_glGetVertexAttribPointervNV .align 2 - .global bluegl_glVertex3bOES - .type bluegl_glVertex3bOES, %function -bluegl_glVertex3bOES: - adrp x16, :got:__blue_glCore_glVertex3bOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertex3bOES] + .global bluegl_glIsProgramNV + .type bluegl_glIsProgramNV, %function +bluegl_glIsProgramNV: + adrp x16, :got:__blue_glCore_glIsProgramNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsProgramNV] ldr x16, [x16] br x16 - .size bluegl_glVertex3bOES, .-bluegl_glVertex3bOES + .size bluegl_glIsProgramNV, .-bluegl_glIsProgramNV .align 2 - .global bluegl_glProgramLocalParameterI4ivNV - .type bluegl_glProgramLocalParameterI4ivNV, %function -bluegl_glProgramLocalParameterI4ivNV: - adrp x16, :got:__blue_glCore_glProgramLocalParameterI4ivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParameterI4ivNV] + .global bluegl_glLoadProgramNV + .type bluegl_glLoadProgramNV, %function +bluegl_glLoadProgramNV: + adrp x16, :got:__blue_glCore_glLoadProgramNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glLoadProgramNV] ldr x16, [x16] br x16 - .size bluegl_glProgramLocalParameterI4ivNV, .-bluegl_glProgramLocalParameterI4ivNV + .size bluegl_glLoadProgramNV, .-bluegl_glLoadProgramNV .align 2 - .global bluegl_glWindowPos2fMESA - .type bluegl_glWindowPos2fMESA, %function -bluegl_glWindowPos2fMESA: - adrp x16, :got:__blue_glCore_glWindowPos2fMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2fMESA] + .global bluegl_glProgramParameter4dNV + .type bluegl_glProgramParameter4dNV, %function +bluegl_glProgramParameter4dNV: + adrp x16, :got:__blue_glCore_glProgramParameter4dNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramParameter4dNV] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2fMESA, .-bluegl_glWindowPos2fMESA + .size bluegl_glProgramParameter4dNV, .-bluegl_glProgramParameter4dNV .align 2 - .global bluegl_glWeightusvARB - .type bluegl_glWeightusvARB, %function -bluegl_glWeightusvARB: - adrp x16, :got:__blue_glCore_glWeightusvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightusvARB] + .global bluegl_glProgramParameter4dvNV + .type bluegl_glProgramParameter4dvNV, %function +bluegl_glProgramParameter4dvNV: + adrp x16, :got:__blue_glCore_glProgramParameter4dvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramParameter4dvNV] ldr x16, [x16] br x16 - .size bluegl_glWeightusvARB, .-bluegl_glWeightusvARB + .size bluegl_glProgramParameter4dvNV, .-bluegl_glProgramParameter4dvNV .align 2 - .global bluegl_glGenOcclusionQueriesNV - .type bluegl_glGenOcclusionQueriesNV, %function -bluegl_glGenOcclusionQueriesNV: - adrp x16, :got:__blue_glCore_glGenOcclusionQueriesNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenOcclusionQueriesNV] + .global bluegl_glProgramParameter4fNV + .type bluegl_glProgramParameter4fNV, %function +bluegl_glProgramParameter4fNV: + adrp x16, :got:__blue_glCore_glProgramParameter4fNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramParameter4fNV] ldr x16, [x16] br x16 - .size bluegl_glGenOcclusionQueriesNV, .-bluegl_glGenOcclusionQueriesNV + .size bluegl_glProgramParameter4fNV, .-bluegl_glProgramParameter4fNV .align 2 - .global bluegl_glTexCoordPointervINTEL - .type bluegl_glTexCoordPointervINTEL, %function -bluegl_glTexCoordPointervINTEL: - adrp x16, :got:__blue_glCore_glTexCoordPointervINTEL - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordPointervINTEL] + .global bluegl_glProgramParameter4fvNV + .type bluegl_glProgramParameter4fvNV, %function +bluegl_glProgramParameter4fvNV: + adrp x16, :got:__blue_glCore_glProgramParameter4fvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramParameter4fvNV] ldr x16, [x16] br x16 - .size bluegl_glTexCoordPointervINTEL, .-bluegl_glTexCoordPointervINTEL + .size bluegl_glProgramParameter4fvNV, .-bluegl_glProgramParameter4fvNV .align 2 - .global bluegl_glGetTextureParameterIivEXT - .type bluegl_glGetTextureParameterIivEXT, %function -bluegl_glGetTextureParameterIivEXT: - adrp x16, :got:__blue_glCore_glGetTextureParameterIivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureParameterIivEXT] + .global bluegl_glProgramParameters4dvNV + .type bluegl_glProgramParameters4dvNV, %function +bluegl_glProgramParameters4dvNV: + adrp x16, :got:__blue_glCore_glProgramParameters4dvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramParameters4dvNV] ldr x16, [x16] br x16 - .size bluegl_glGetTextureParameterIivEXT, .-bluegl_glGetTextureParameterIivEXT + .size bluegl_glProgramParameters4dvNV, .-bluegl_glProgramParameters4dvNV .align 2 - .global bluegl_glDeleteStatesNV - .type bluegl_glDeleteStatesNV, %function -bluegl_glDeleteStatesNV: - adrp x16, :got:__blue_glCore_glDeleteStatesNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteStatesNV] + .global bluegl_glProgramParameters4fvNV + .type bluegl_glProgramParameters4fvNV, %function +bluegl_glProgramParameters4fvNV: + adrp x16, :got:__blue_glCore_glProgramParameters4fvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramParameters4fvNV] ldr x16, [x16] br x16 - .size bluegl_glDeleteStatesNV, .-bluegl_glDeleteStatesNV + .size bluegl_glProgramParameters4fvNV, .-bluegl_glProgramParameters4fvNV .align 2 - .global bluegl_glProgramLocalParameter4fvARB - .type bluegl_glProgramLocalParameter4fvARB, %function -bluegl_glProgramLocalParameter4fvARB: - adrp x16, :got:__blue_glCore_glProgramLocalParameter4fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParameter4fvARB] + .global bluegl_glRequestResidentProgramsNV + .type bluegl_glRequestResidentProgramsNV, %function +bluegl_glRequestResidentProgramsNV: + adrp x16, :got:__blue_glCore_glRequestResidentProgramsNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glRequestResidentProgramsNV] ldr x16, [x16] br x16 - .size bluegl_glProgramLocalParameter4fvARB, .-bluegl_glProgramLocalParameter4fvARB + .size bluegl_glRequestResidentProgramsNV, .-bluegl_glRequestResidentProgramsNV .align 2 - .global bluegl_glCoverFillPathInstancedNV - .type bluegl_glCoverFillPathInstancedNV, %function -bluegl_glCoverFillPathInstancedNV: - adrp x16, :got:__blue_glCore_glCoverFillPathInstancedNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCoverFillPathInstancedNV] + .global bluegl_glTrackMatrixNV + .type bluegl_glTrackMatrixNV, %function +bluegl_glTrackMatrixNV: + adrp x16, :got:__blue_glCore_glTrackMatrixNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glTrackMatrixNV] ldr x16, [x16] br x16 - .size bluegl_glCoverFillPathInstancedNV, .-bluegl_glCoverFillPathInstancedNV + .size bluegl_glTrackMatrixNV, .-bluegl_glTrackMatrixNV .align 2 - .global bluegl_glBeginConditionalRenderNVX - .type bluegl_glBeginConditionalRenderNVX, %function -bluegl_glBeginConditionalRenderNVX: - adrp x16, :got:__blue_glCore_glBeginConditionalRenderNVX - ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginConditionalRenderNVX] + .global bluegl_glVertexAttribPointerNV + .type bluegl_glVertexAttribPointerNV, %function +bluegl_glVertexAttribPointerNV: + adrp x16, :got:__blue_glCore_glVertexAttribPointerNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribPointerNV] ldr x16, [x16] br x16 - .size bluegl_glBeginConditionalRenderNVX, .-bluegl_glBeginConditionalRenderNVX + .size bluegl_glVertexAttribPointerNV, .-bluegl_glVertexAttribPointerNV .align 2 - .global bluegl_glPathDashArrayNV - .type bluegl_glPathDashArrayNV, %function -bluegl_glPathDashArrayNV: - adrp x16, :got:__blue_glCore_glPathDashArrayNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathDashArrayNV] + .global bluegl_glVertexAttrib1dNV + .type bluegl_glVertexAttrib1dNV, %function +bluegl_glVertexAttrib1dNV: + adrp x16, :got:__blue_glCore_glVertexAttrib1dNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1dNV] ldr x16, [x16] br x16 - .size bluegl_glPathDashArrayNV, .-bluegl_glPathDashArrayNV + .size bluegl_glVertexAttrib1dNV, .-bluegl_glVertexAttrib1dNV .align 2 - .global bluegl_glSpriteParameteriSGIX - .type bluegl_glSpriteParameteriSGIX, %function -bluegl_glSpriteParameteriSGIX: - adrp x16, :got:__blue_glCore_glSpriteParameteriSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glSpriteParameteriSGIX] + .global bluegl_glVertexAttrib1dvNV + .type bluegl_glVertexAttrib1dvNV, %function +bluegl_glVertexAttrib1dvNV: + adrp x16, :got:__blue_glCore_glVertexAttrib1dvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1dvNV] ldr x16, [x16] br x16 - .size bluegl_glSpriteParameteriSGIX, .-bluegl_glSpriteParameteriSGIX + .size bluegl_glVertexAttrib1dvNV, .-bluegl_glVertexAttrib1dvNV .align 2 - .global bluegl_glGetNamedProgramStringEXT - .type bluegl_glGetNamedProgramStringEXT, %function -bluegl_glGetNamedProgramStringEXT: - adrp x16, :got:__blue_glCore_glGetNamedProgramStringEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedProgramStringEXT] + .global bluegl_glVertexAttrib1fNV + .type bluegl_glVertexAttrib1fNV, %function +bluegl_glVertexAttrib1fNV: + adrp x16, :got:__blue_glCore_glVertexAttrib1fNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1fNV] ldr x16, [x16] br x16 - .size bluegl_glGetNamedProgramStringEXT, .-bluegl_glGetNamedProgramStringEXT + .size bluegl_glVertexAttrib1fNV, .-bluegl_glVertexAttrib1fNV .align 2 - .global bluegl_glCombinerParameterfvNV - .type bluegl_glCombinerParameterfvNV, %function -bluegl_glCombinerParameterfvNV: - adrp x16, :got:__blue_glCore_glCombinerParameterfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCombinerParameterfvNV] + .global bluegl_glVertexAttrib1fvNV + .type bluegl_glVertexAttrib1fvNV, %function +bluegl_glVertexAttrib1fvNV: + adrp x16, :got:__blue_glCore_glVertexAttrib1fvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1fvNV] ldr x16, [x16] br x16 - .size bluegl_glCombinerParameterfvNV, .-bluegl_glCombinerParameterfvNV + .size bluegl_glVertexAttrib1fvNV, .-bluegl_glVertexAttrib1fvNV .align 2 - .global bluegl_glTexParameterxvOES - .type bluegl_glTexParameterxvOES, %function -bluegl_glTexParameterxvOES: - adrp x16, :got:__blue_glCore_glTexParameterxvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameterxvOES] + .global bluegl_glVertexAttrib1sNV + .type bluegl_glVertexAttrib1sNV, %function +bluegl_glVertexAttrib1sNV: + adrp x16, :got:__blue_glCore_glVertexAttrib1sNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1sNV] ldr x16, [x16] br x16 - .size bluegl_glTexParameterxvOES, .-bluegl_glTexParameterxvOES + .size bluegl_glVertexAttrib1sNV, .-bluegl_glVertexAttrib1sNV .align 2 - .global bluegl_glVertexArrayVertexAttribDivisorEXT - .type bluegl_glVertexArrayVertexAttribDivisorEXT, %function -bluegl_glVertexArrayVertexAttribDivisorEXT: - adrp x16, :got:__blue_glCore_glVertexArrayVertexAttribDivisorEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexAttribDivisorEXT] + .global bluegl_glVertexAttrib1svNV + .type bluegl_glVertexAttrib1svNV, %function +bluegl_glVertexAttrib1svNV: + adrp x16, :got:__blue_glCore_glVertexAttrib1svNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1svNV] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayVertexAttribDivisorEXT, .-bluegl_glVertexArrayVertexAttribDivisorEXT + .size bluegl_glVertexAttrib1svNV, .-bluegl_glVertexAttrib1svNV .align 2 - .global bluegl_glProgramSubroutineParametersuivNV - .type bluegl_glProgramSubroutineParametersuivNV, %function -bluegl_glProgramSubroutineParametersuivNV: - adrp x16, :got:__blue_glCore_glProgramSubroutineParametersuivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramSubroutineParametersuivNV] + .global bluegl_glVertexAttrib2dNV + .type bluegl_glVertexAttrib2dNV, %function +bluegl_glVertexAttrib2dNV: + adrp x16, :got:__blue_glCore_glVertexAttrib2dNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2dNV] ldr x16, [x16] br x16 - .size bluegl_glProgramSubroutineParametersuivNV, .-bluegl_glProgramSubroutineParametersuivNV + .size bluegl_glVertexAttrib2dNV, .-bluegl_glVertexAttrib2dNV .align 2 - .global bluegl_glDeleteObjectARB - .type bluegl_glDeleteObjectARB, %function -bluegl_glDeleteObjectARB: - adrp x16, :got:__blue_glCore_glDeleteObjectARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteObjectARB] + .global bluegl_glVertexAttrib2dvNV + .type bluegl_glVertexAttrib2dvNV, %function +bluegl_glVertexAttrib2dvNV: + adrp x16, :got:__blue_glCore_glVertexAttrib2dvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2dvNV] ldr x16, [x16] br x16 - .size bluegl_glDeleteObjectARB, .-bluegl_glDeleteObjectARB + .size bluegl_glVertexAttrib2dvNV, .-bluegl_glVertexAttrib2dvNV .align 2 - .global bluegl_glProgramUniform1i64ARB - .type bluegl_glProgramUniform1i64ARB, %function -bluegl_glProgramUniform1i64ARB: - adrp x16, :got:__blue_glCore_glProgramUniform1i64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1i64ARB] + .global bluegl_glVertexAttrib2fNV + .type bluegl_glVertexAttrib2fNV, %function +bluegl_glVertexAttrib2fNV: + adrp x16, :got:__blue_glCore_glVertexAttrib2fNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2fNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1i64ARB, .-bluegl_glProgramUniform1i64ARB + .size bluegl_glVertexAttrib2fNV, .-bluegl_glVertexAttrib2fNV .align 2 - .global bluegl_glFramebufferTextureARB - .type bluegl_glFramebufferTextureARB, %function -bluegl_glFramebufferTextureARB: - adrp x16, :got:__blue_glCore_glFramebufferTextureARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTextureARB] + .global bluegl_glVertexAttrib2fvNV + .type bluegl_glVertexAttrib2fvNV, %function +bluegl_glVertexAttrib2fvNV: + adrp x16, :got:__blue_glCore_glVertexAttrib2fvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2fvNV] ldr x16, [x16] br x16 - .size bluegl_glFramebufferTextureARB, .-bluegl_glFramebufferTextureARB + .size bluegl_glVertexAttrib2fvNV, .-bluegl_glVertexAttrib2fvNV .align 2 - .global bluegl_glElementPointerATI - .type bluegl_glElementPointerATI, %function -bluegl_glElementPointerATI: - adrp x16, :got:__blue_glCore_glElementPointerATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glElementPointerATI] + .global bluegl_glVertexAttrib2sNV + .type bluegl_glVertexAttrib2sNV, %function +bluegl_glVertexAttrib2sNV: + adrp x16, :got:__blue_glCore_glVertexAttrib2sNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2sNV] ldr x16, [x16] br x16 - .size bluegl_glElementPointerATI, .-bluegl_glElementPointerATI + .size bluegl_glVertexAttrib2sNV, .-bluegl_glVertexAttrib2sNV .align 2 - .global bluegl_glUniform2i64vARB - .type bluegl_glUniform2i64vARB, %function -bluegl_glUniform2i64vARB: - adrp x16, :got:__blue_glCore_glUniform2i64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform2i64vARB] + .global bluegl_glVertexAttrib2svNV + .type bluegl_glVertexAttrib2svNV, %function +bluegl_glVertexAttrib2svNV: + adrp x16, :got:__blue_glCore_glVertexAttrib2svNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2svNV] ldr x16, [x16] br x16 - .size bluegl_glUniform2i64vARB, .-bluegl_glUniform2i64vARB + .size bluegl_glVertexAttrib2svNV, .-bluegl_glVertexAttrib2svNV .align 2 - .global bluegl_glGetBooleanIndexedvEXT - .type bluegl_glGetBooleanIndexedvEXT, %function -bluegl_glGetBooleanIndexedvEXT: - adrp x16, :got:__blue_glCore_glGetBooleanIndexedvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBooleanIndexedvEXT] + .global bluegl_glVertexAttrib3dNV + .type bluegl_glVertexAttrib3dNV, %function +bluegl_glVertexAttrib3dNV: + adrp x16, :got:__blue_glCore_glVertexAttrib3dNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3dNV] ldr x16, [x16] br x16 - .size bluegl_glGetBooleanIndexedvEXT, .-bluegl_glGetBooleanIndexedvEXT + .size bluegl_glVertexAttrib3dNV, .-bluegl_glVertexAttrib3dNV .align 2 - .global bluegl_glVertexAttribP1uiv - .type bluegl_glVertexAttribP1uiv, %function -bluegl_glVertexAttribP1uiv: - adrp x16, :got:__blue_glCore_glVertexAttribP1uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribP1uiv] + .global bluegl_glVertexAttrib3dvNV + .type bluegl_glVertexAttrib3dvNV, %function +bluegl_glVertexAttrib3dvNV: + adrp x16, :got:__blue_glCore_glVertexAttrib3dvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3dvNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribP1uiv, .-bluegl_glVertexAttribP1uiv + .size bluegl_glVertexAttrib3dvNV, .-bluegl_glVertexAttrib3dvNV .align 2 - .global bluegl_glGetDoubleIndexedvEXT - .type bluegl_glGetDoubleIndexedvEXT, %function -bluegl_glGetDoubleIndexedvEXT: - adrp x16, :got:__blue_glCore_glGetDoubleIndexedvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetDoubleIndexedvEXT] + .global bluegl_glVertexAttrib3fNV + .type bluegl_glVertexAttrib3fNV, %function +bluegl_glVertexAttrib3fNV: + adrp x16, :got:__blue_glCore_glVertexAttrib3fNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3fNV] ldr x16, [x16] br x16 - .size bluegl_glGetDoubleIndexedvEXT, .-bluegl_glGetDoubleIndexedvEXT + .size bluegl_glVertexAttrib3fNV, .-bluegl_glVertexAttrib3fNV .align 2 - .global bluegl_glGetUniformiv - .type bluegl_glGetUniformiv, %function -bluegl_glGetUniformiv: - adrp x16, :got:__blue_glCore_glGetUniformiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformiv] + .global bluegl_glVertexAttrib3fvNV + .type bluegl_glVertexAttrib3fvNV, %function +bluegl_glVertexAttrib3fvNV: + adrp x16, :got:__blue_glCore_glVertexAttrib3fvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3fvNV] ldr x16, [x16] br x16 - .size bluegl_glGetUniformiv, .-bluegl_glGetUniformiv + .size bluegl_glVertexAttrib3fvNV, .-bluegl_glVertexAttrib3fvNV .align 2 - .global bluegl_glVertexAttribArrayObjectATI - .type bluegl_glVertexAttribArrayObjectATI, %function -bluegl_glVertexAttribArrayObjectATI: - adrp x16, :got:__blue_glCore_glVertexAttribArrayObjectATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribArrayObjectATI] + .global bluegl_glVertexAttrib3sNV + .type bluegl_glVertexAttrib3sNV, %function +bluegl_glVertexAttrib3sNV: + adrp x16, :got:__blue_glCore_glVertexAttrib3sNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3sNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribArrayObjectATI, .-bluegl_glVertexAttribArrayObjectATI + .size bluegl_glVertexAttrib3sNV, .-bluegl_glVertexAttrib3sNV .align 2 - .global bluegl_glBufferSubDataARB - .type bluegl_glBufferSubDataARB, %function -bluegl_glBufferSubDataARB: - adrp x16, :got:__blue_glCore_glBufferSubDataARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glBufferSubDataARB] + .global bluegl_glVertexAttrib3svNV + .type bluegl_glVertexAttrib3svNV, %function +bluegl_glVertexAttrib3svNV: + adrp x16, :got:__blue_glCore_glVertexAttrib3svNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3svNV] ldr x16, [x16] br x16 - .size bluegl_glBufferSubDataARB, .-bluegl_glBufferSubDataARB + .size bluegl_glVertexAttrib3svNV, .-bluegl_glVertexAttrib3svNV .align 2 - .global bluegl_glWindowPos2fARB - .type bluegl_glWindowPos2fARB, %function -bluegl_glWindowPos2fARB: - adrp x16, :got:__blue_glCore_glWindowPos2fARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2fARB] + .global bluegl_glVertexAttrib4dNV + .type bluegl_glVertexAttrib4dNV, %function +bluegl_glVertexAttrib4dNV: + adrp x16, :got:__blue_glCore_glVertexAttrib4dNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4dNV] + ldr x16, [x16] + br x16 + .size bluegl_glVertexAttrib4dNV, .-bluegl_glVertexAttrib4dNV + + .align 2 + .global bluegl_glVertexAttrib4dvNV + .type bluegl_glVertexAttrib4dvNV, %function +bluegl_glVertexAttrib4dvNV: + adrp x16, :got:__blue_glCore_glVertexAttrib4dvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4dvNV] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2fARB, .-bluegl_glWindowPos2fARB + .size bluegl_glVertexAttrib4dvNV, .-bluegl_glVertexAttrib4dvNV .align 2 - .global bluegl_glMultiTexCoord2bvOES - .type bluegl_glMultiTexCoord2bvOES, %function -bluegl_glMultiTexCoord2bvOES: - adrp x16, :got:__blue_glCore_glMultiTexCoord2bvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord2bvOES] + .global bluegl_glVertexAttrib4fNV + .type bluegl_glVertexAttrib4fNV, %function +bluegl_glVertexAttrib4fNV: + adrp x16, :got:__blue_glCore_glVertexAttrib4fNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4fNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord2bvOES, .-bluegl_glMultiTexCoord2bvOES + .size bluegl_glVertexAttrib4fNV, .-bluegl_glVertexAttrib4fNV .align 2 - .global bluegl_glProgramUniform2i64vARB - .type bluegl_glProgramUniform2i64vARB, %function -bluegl_glProgramUniform2i64vARB: - adrp x16, :got:__blue_glCore_glProgramUniform2i64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform2i64vARB] + .global bluegl_glVertexAttrib4fvNV + .type bluegl_glVertexAttrib4fvNV, %function +bluegl_glVertexAttrib4fvNV: + adrp x16, :got:__blue_glCore_glVertexAttrib4fvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4fvNV] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform2i64vARB, .-bluegl_glProgramUniform2i64vARB + .size bluegl_glVertexAttrib4fvNV, .-bluegl_glVertexAttrib4fvNV .align 2 - .global bluegl_glTexEnvxOES - .type bluegl_glTexEnvxOES, %function -bluegl_glTexEnvxOES: - adrp x16, :got:__blue_glCore_glTexEnvxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexEnvxOES] + .global bluegl_glVertexAttrib4sNV + .type bluegl_glVertexAttrib4sNV, %function +bluegl_glVertexAttrib4sNV: + adrp x16, :got:__blue_glCore_glVertexAttrib4sNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4sNV] ldr x16, [x16] br x16 - .size bluegl_glTexEnvxOES, .-bluegl_glTexEnvxOES + .size bluegl_glVertexAttrib4sNV, .-bluegl_glVertexAttrib4sNV .align 2 - .global bluegl_glStencilOpValueAMD - .type bluegl_glStencilOpValueAMD, %function -bluegl_glStencilOpValueAMD: - adrp x16, :got:__blue_glCore_glStencilOpValueAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glStencilOpValueAMD] + .global bluegl_glVertexAttrib4svNV + .type bluegl_glVertexAttrib4svNV, %function +bluegl_glVertexAttrib4svNV: + adrp x16, :got:__blue_glCore_glVertexAttrib4svNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4svNV] ldr x16, [x16] br x16 - .size bluegl_glStencilOpValueAMD, .-bluegl_glStencilOpValueAMD + .size bluegl_glVertexAttrib4svNV, .-bluegl_glVertexAttrib4svNV .align 2 - .global bluegl_glUniform4ui64vARB - .type bluegl_glUniform4ui64vARB, %function -bluegl_glUniform4ui64vARB: - adrp x16, :got:__blue_glCore_glUniform4ui64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4ui64vARB] + .global bluegl_glVertexAttrib4ubNV + .type bluegl_glVertexAttrib4ubNV, %function +bluegl_glVertexAttrib4ubNV: + adrp x16, :got:__blue_glCore_glVertexAttrib4ubNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4ubNV] ldr x16, [x16] br x16 - .size bluegl_glUniform4ui64vARB, .-bluegl_glUniform4ui64vARB + .size bluegl_glVertexAttrib4ubNV, .-bluegl_glVertexAttrib4ubNV .align 2 - .global bluegl_glTangent3iEXT - .type bluegl_glTangent3iEXT, %function -bluegl_glTangent3iEXT: - adrp x16, :got:__blue_glCore_glTangent3iEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTangent3iEXT] + .global bluegl_glVertexAttrib4ubvNV + .type bluegl_glVertexAttrib4ubvNV, %function +bluegl_glVertexAttrib4ubvNV: + adrp x16, :got:__blue_glCore_glVertexAttrib4ubvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4ubvNV] ldr x16, [x16] br x16 - .size bluegl_glTangent3iEXT, .-bluegl_glTangent3iEXT + .size bluegl_glVertexAttrib4ubvNV, .-bluegl_glVertexAttrib4ubvNV .align 2 - .global bluegl_glGetVertexAttribLdvEXT - .type bluegl_glGetVertexAttribLdvEXT, %function -bluegl_glGetVertexAttribLdvEXT: - adrp x16, :got:__blue_glCore_glGetVertexAttribLdvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribLdvEXT] + .global bluegl_glVertexAttribs1dvNV + .type bluegl_glVertexAttribs1dvNV, %function +bluegl_glVertexAttribs1dvNV: + adrp x16, :got:__blue_glCore_glVertexAttribs1dvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs1dvNV] ldr x16, [x16] br x16 - .size bluegl_glGetVertexAttribLdvEXT, .-bluegl_glGetVertexAttribLdvEXT + .size bluegl_glVertexAttribs1dvNV, .-bluegl_glVertexAttribs1dvNV .align 2 - .global bluegl_glGetCoverageModulationTableNV - .type bluegl_glGetCoverageModulationTableNV, %function -bluegl_glGetCoverageModulationTableNV: - adrp x16, :got:__blue_glCore_glGetCoverageModulationTableNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetCoverageModulationTableNV] + .global bluegl_glVertexAttribs1fvNV + .type bluegl_glVertexAttribs1fvNV, %function +bluegl_glVertexAttribs1fvNV: + adrp x16, :got:__blue_glCore_glVertexAttribs1fvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs1fvNV] ldr x16, [x16] br x16 - .size bluegl_glGetCoverageModulationTableNV, .-bluegl_glGetCoverageModulationTableNV + .size bluegl_glVertexAttribs1fvNV, .-bluegl_glVertexAttribs1fvNV .align 2 - .global bluegl_glVertexWeighthvNV - .type bluegl_glVertexWeighthvNV, %function -bluegl_glVertexWeighthvNV: - adrp x16, :got:__blue_glCore_glVertexWeighthvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexWeighthvNV] + .global bluegl_glVertexAttribs1svNV + .type bluegl_glVertexAttribs1svNV, %function +bluegl_glVertexAttribs1svNV: + adrp x16, :got:__blue_glCore_glVertexAttribs1svNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs1svNV] ldr x16, [x16] br x16 - .size bluegl_glVertexWeighthvNV, .-bluegl_glVertexWeighthvNV + .size bluegl_glVertexAttribs1svNV, .-bluegl_glVertexAttribs1svNV .align 2 - .global bluegl_glWindowPos3iARB - .type bluegl_glWindowPos3iARB, %function -bluegl_glWindowPos3iARB: - adrp x16, :got:__blue_glCore_glWindowPos3iARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3iARB] + .global bluegl_glVertexAttribs2dvNV + .type bluegl_glVertexAttribs2dvNV, %function +bluegl_glVertexAttribs2dvNV: + adrp x16, :got:__blue_glCore_glVertexAttribs2dvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs2dvNV] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3iARB, .-bluegl_glWindowPos3iARB + .size bluegl_glVertexAttribs2dvNV, .-bluegl_glVertexAttribs2dvNV .align 2 - .global bluegl_glVertexAttribI1iv - .type bluegl_glVertexAttribI1iv, %function -bluegl_glVertexAttribI1iv: - adrp x16, :got:__blue_glCore_glVertexAttribI1iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI1iv] + .global bluegl_glVertexAttribs2fvNV + .type bluegl_glVertexAttribs2fvNV, %function +bluegl_glVertexAttribs2fvNV: + adrp x16, :got:__blue_glCore_glVertexAttribs2fvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs2fvNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI1iv, .-bluegl_glVertexAttribI1iv + .size bluegl_glVertexAttribs2fvNV, .-bluegl_glVertexAttribs2fvNV .align 2 - .global bluegl_glWindowPos3fv - .type bluegl_glWindowPos3fv, %function -bluegl_glWindowPos3fv: - adrp x16, :got:__blue_glCore_glWindowPos3fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3fv] + .global bluegl_glVertexAttribs2svNV + .type bluegl_glVertexAttribs2svNV, %function +bluegl_glVertexAttribs2svNV: + adrp x16, :got:__blue_glCore_glVertexAttribs2svNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs2svNV] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3fv, .-bluegl_glWindowPos3fv + .size bluegl_glVertexAttribs2svNV, .-bluegl_glVertexAttribs2svNV .align 2 - .global bluegl_glVertexStream4ivATI - .type bluegl_glVertexStream4ivATI, %function -bluegl_glVertexStream4ivATI: - adrp x16, :got:__blue_glCore_glVertexStream4ivATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream4ivATI] + .global bluegl_glVertexAttribs3dvNV + .type bluegl_glVertexAttribs3dvNV, %function +bluegl_glVertexAttribs3dvNV: + adrp x16, :got:__blue_glCore_glVertexAttribs3dvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs3dvNV] ldr x16, [x16] br x16 - .size bluegl_glVertexStream4ivATI, .-bluegl_glVertexStream4ivATI + .size bluegl_glVertexAttribs3dvNV, .-bluegl_glVertexAttribs3dvNV .align 2 - .global bluegl_glTextureImage3DMultisampleCoverageNV - .type bluegl_glTextureImage3DMultisampleCoverageNV, %function -bluegl_glTextureImage3DMultisampleCoverageNV: - adrp x16, :got:__blue_glCore_glTextureImage3DMultisampleCoverageNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureImage3DMultisampleCoverageNV] + .global bluegl_glVertexAttribs3fvNV + .type bluegl_glVertexAttribs3fvNV, %function +bluegl_glVertexAttribs3fvNV: + adrp x16, :got:__blue_glCore_glVertexAttribs3fvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs3fvNV] ldr x16, [x16] br x16 - .size bluegl_glTextureImage3DMultisampleCoverageNV, .-bluegl_glTextureImage3DMultisampleCoverageNV + .size bluegl_glVertexAttribs3fvNV, .-bluegl_glVertexAttribs3fvNV .align 2 - .global bluegl_glUniform3f - .type bluegl_glUniform3f, %function -bluegl_glUniform3f: - adrp x16, :got:__blue_glCore_glUniform3f - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform3f] + .global bluegl_glVertexAttribs3svNV + .type bluegl_glVertexAttribs3svNV, %function +bluegl_glVertexAttribs3svNV: + adrp x16, :got:__blue_glCore_glVertexAttribs3svNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs3svNV] ldr x16, [x16] br x16 - .size bluegl_glUniform3f, .-bluegl_glUniform3f + .size bluegl_glVertexAttribs3svNV, .-bluegl_glVertexAttribs3svNV .align 2 - .global bluegl_glAccumxOES - .type bluegl_glAccumxOES, %function -bluegl_glAccumxOES: - adrp x16, :got:__blue_glCore_glAccumxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glAccumxOES] + .global bluegl_glVertexAttribs4dvNV + .type bluegl_glVertexAttribs4dvNV, %function +bluegl_glVertexAttribs4dvNV: + adrp x16, :got:__blue_glCore_glVertexAttribs4dvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs4dvNV] ldr x16, [x16] br x16 - .size bluegl_glAccumxOES, .-bluegl_glAccumxOES + .size bluegl_glVertexAttribs4dvNV, .-bluegl_glVertexAttribs4dvNV .align 2 - .global bluegl_glTexStorage3D - .type bluegl_glTexStorage3D, %function -bluegl_glTexStorage3D: - adrp x16, :got:__blue_glCore_glTexStorage3D - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexStorage3D] + .global bluegl_glVertexAttribs4fvNV + .type bluegl_glVertexAttribs4fvNV, %function +bluegl_glVertexAttribs4fvNV: + adrp x16, :got:__blue_glCore_glVertexAttribs4fvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs4fvNV] ldr x16, [x16] br x16 - .size bluegl_glTexStorage3D, .-bluegl_glTexStorage3D + .size bluegl_glVertexAttribs4fvNV, .-bluegl_glVertexAttribs4fvNV .align 2 - .global bluegl_glDrawArrays - .type bluegl_glDrawArrays, %function -bluegl_glDrawArrays: - adrp x16, :got:__blue_glCore_glDrawArrays - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawArrays] + .global bluegl_glVertexAttribs4svNV + .type bluegl_glVertexAttribs4svNV, %function +bluegl_glVertexAttribs4svNV: + adrp x16, :got:__blue_glCore_glVertexAttribs4svNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs4svNV] ldr x16, [x16] br x16 - .size bluegl_glDrawArrays, .-bluegl_glDrawArrays + .size bluegl_glVertexAttribs4svNV, .-bluegl_glVertexAttribs4svNV .align 2 - .global bluegl_glSamplePatternEXT - .type bluegl_glSamplePatternEXT, %function -bluegl_glSamplePatternEXT: - adrp x16, :got:__blue_glCore_glSamplePatternEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSamplePatternEXT] + .global bluegl_glVertexAttribs4ubvNV + .type bluegl_glVertexAttribs4ubvNV, %function +bluegl_glVertexAttribs4ubvNV: + adrp x16, :got:__blue_glCore_glVertexAttribs4ubvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs4ubvNV] ldr x16, [x16] br x16 - .size bluegl_glSamplePatternEXT, .-bluegl_glSamplePatternEXT + .size bluegl_glVertexAttribs4ubvNV, .-bluegl_glVertexAttribs4ubvNV .align 2 - .global bluegl_glNormalPointervINTEL - .type bluegl_glNormalPointervINTEL, %function -bluegl_glNormalPointervINTEL: - adrp x16, :got:__blue_glCore_glNormalPointervINTEL - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormalPointervINTEL] + .global bluegl_glVertexAttribI1iEXT + .type bluegl_glVertexAttribI1iEXT, %function +bluegl_glVertexAttribI1iEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI1iEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI1iEXT] ldr x16, [x16] br x16 - .size bluegl_glNormalPointervINTEL, .-bluegl_glNormalPointervINTEL + .size bluegl_glVertexAttribI1iEXT, .-bluegl_glVertexAttribI1iEXT .align 2 - .global bluegl_glWeightubvARB - .type bluegl_glWeightubvARB, %function -bluegl_glWeightubvARB: - adrp x16, :got:__blue_glCore_glWeightubvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightubvARB] + .global bluegl_glVertexAttribI2iEXT + .type bluegl_glVertexAttribI2iEXT, %function +bluegl_glVertexAttribI2iEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI2iEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI2iEXT] ldr x16, [x16] br x16 - .size bluegl_glWeightubvARB, .-bluegl_glWeightubvARB + .size bluegl_glVertexAttribI2iEXT, .-bluegl_glVertexAttribI2iEXT .align 2 - .global bluegl_glGenProgramsNV - .type bluegl_glGenProgramsNV, %function -bluegl_glGenProgramsNV: - adrp x16, :got:__blue_glCore_glGenProgramsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenProgramsNV] + .global bluegl_glVertexAttribI3iEXT + .type bluegl_glVertexAttribI3iEXT, %function +bluegl_glVertexAttribI3iEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI3iEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI3iEXT] ldr x16, [x16] br x16 - .size bluegl_glGenProgramsNV, .-bluegl_glGenProgramsNV + .size bluegl_glVertexAttribI3iEXT, .-bluegl_glVertexAttribI3iEXT .align 2 - .global bluegl_glDepthRangef - .type bluegl_glDepthRangef, %function -bluegl_glDepthRangef: - adrp x16, :got:__blue_glCore_glDepthRangef - ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthRangef] + .global bluegl_glVertexAttribI4iEXT + .type bluegl_glVertexAttribI4iEXT, %function +bluegl_glVertexAttribI4iEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI4iEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4iEXT] ldr x16, [x16] br x16 - .size bluegl_glDepthRangef, .-bluegl_glDepthRangef + .size bluegl_glVertexAttribI4iEXT, .-bluegl_glVertexAttribI4iEXT .align 2 - .global bluegl_glGetProgramParameterdvNV - .type bluegl_glGetProgramParameterdvNV, %function -bluegl_glGetProgramParameterdvNV: - adrp x16, :got:__blue_glCore_glGetProgramParameterdvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramParameterdvNV] + .global bluegl_glVertexAttribI1uiEXT + .type bluegl_glVertexAttribI1uiEXT, %function +bluegl_glVertexAttribI1uiEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI1uiEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI1uiEXT] ldr x16, [x16] br x16 - .size bluegl_glGetProgramParameterdvNV, .-bluegl_glGetProgramParameterdvNV + .size bluegl_glVertexAttribI1uiEXT, .-bluegl_glVertexAttribI1uiEXT .align 2 - .global bluegl_glPollInstrumentsSGIX - .type bluegl_glPollInstrumentsSGIX, %function -bluegl_glPollInstrumentsSGIX: - adrp x16, :got:__blue_glCore_glPollInstrumentsSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glPollInstrumentsSGIX] + .global bluegl_glVertexAttribI2uiEXT + .type bluegl_glVertexAttribI2uiEXT, %function +bluegl_glVertexAttribI2uiEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI2uiEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI2uiEXT] ldr x16, [x16] br x16 - .size bluegl_glPollInstrumentsSGIX, .-bluegl_glPollInstrumentsSGIX + .size bluegl_glVertexAttribI2uiEXT, .-bluegl_glVertexAttribI2uiEXT .align 2 - .global bluegl_glMultiTexCoord1hNV - .type bluegl_glMultiTexCoord1hNV, %function -bluegl_glMultiTexCoord1hNV: - adrp x16, :got:__blue_glCore_glMultiTexCoord1hNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1hNV] + .global bluegl_glVertexAttribI3uiEXT + .type bluegl_glVertexAttribI3uiEXT, %function +bluegl_glVertexAttribI3uiEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI3uiEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI3uiEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1hNV, .-bluegl_glMultiTexCoord1hNV + .size bluegl_glVertexAttribI3uiEXT, .-bluegl_glVertexAttribI3uiEXT .align 2 - .global bluegl_glSecondaryColor3s - .type bluegl_glSecondaryColor3s, %function -bluegl_glSecondaryColor3s: - adrp x16, :got:__blue_glCore_glSecondaryColor3s - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3s] + .global bluegl_glVertexAttribI4uiEXT + .type bluegl_glVertexAttribI4uiEXT, %function +bluegl_glVertexAttribI4uiEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI4uiEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4uiEXT] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3s, .-bluegl_glSecondaryColor3s + .size bluegl_glVertexAttribI4uiEXT, .-bluegl_glVertexAttribI4uiEXT .align 2 - .global bluegl_glTexCoordP1uiv - .type bluegl_glTexCoordP1uiv, %function -bluegl_glTexCoordP1uiv: - adrp x16, :got:__blue_glCore_glTexCoordP1uiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoordP1uiv] + .global bluegl_glVertexAttribI1ivEXT + .type bluegl_glVertexAttribI1ivEXT, %function +bluegl_glVertexAttribI1ivEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI1ivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI1ivEXT] ldr x16, [x16] br x16 - .size bluegl_glTexCoordP1uiv, .-bluegl_glTexCoordP1uiv + .size bluegl_glVertexAttribI1ivEXT, .-bluegl_glVertexAttribI1ivEXT .align 2 - .global bluegl_glStopInstrumentsSGIX - .type bluegl_glStopInstrumentsSGIX, %function -bluegl_glStopInstrumentsSGIX: - adrp x16, :got:__blue_glCore_glStopInstrumentsSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glStopInstrumentsSGIX] + .global bluegl_glVertexAttribI2ivEXT + .type bluegl_glVertexAttribI2ivEXT, %function +bluegl_glVertexAttribI2ivEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI2ivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI2ivEXT] ldr x16, [x16] br x16 - .size bluegl_glStopInstrumentsSGIX, .-bluegl_glStopInstrumentsSGIX + .size bluegl_glVertexAttribI2ivEXT, .-bluegl_glVertexAttribI2ivEXT .align 2 - .global bluegl_glActiveTexture - .type bluegl_glActiveTexture, %function -bluegl_glActiveTexture: - adrp x16, :got:__blue_glCore_glActiveTexture - ldr x16, [x16, #:got_lo12:__blue_glCore_glActiveTexture] + .global bluegl_glVertexAttribI3ivEXT + .type bluegl_glVertexAttribI3ivEXT, %function +bluegl_glVertexAttribI3ivEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI3ivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI3ivEXT] ldr x16, [x16] br x16 - .size bluegl_glActiveTexture, .-bluegl_glActiveTexture + .size bluegl_glVertexAttribI3ivEXT, .-bluegl_glVertexAttribI3ivEXT .align 2 - .global bluegl_glVertexAttribs2svNV - .type bluegl_glVertexAttribs2svNV, %function -bluegl_glVertexAttribs2svNV: - adrp x16, :got:__blue_glCore_glVertexAttribs2svNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribs2svNV] + .global bluegl_glVertexAttribI4ivEXT + .type bluegl_glVertexAttribI4ivEXT, %function +bluegl_glVertexAttribI4ivEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI4ivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4ivEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribs2svNV, .-bluegl_glVertexAttribs2svNV + .size bluegl_glVertexAttribI4ivEXT, .-bluegl_glVertexAttribI4ivEXT .align 2 - .global bluegl_glGetActiveAtomicCounterBufferiv - .type bluegl_glGetActiveAtomicCounterBufferiv, %function -bluegl_glGetActiveAtomicCounterBufferiv: - adrp x16, :got:__blue_glCore_glGetActiveAtomicCounterBufferiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveAtomicCounterBufferiv] + .global bluegl_glVertexAttribI1uivEXT + .type bluegl_glVertexAttribI1uivEXT, %function +bluegl_glVertexAttribI1uivEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI1uivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI1uivEXT] ldr x16, [x16] br x16 - .size bluegl_glGetActiveAtomicCounterBufferiv, .-bluegl_glGetActiveAtomicCounterBufferiv + .size bluegl_glVertexAttribI1uivEXT, .-bluegl_glVertexAttribI1uivEXT .align 2 - .global bluegl_glEndConditionalRenderNVX - .type bluegl_glEndConditionalRenderNVX, %function -bluegl_glEndConditionalRenderNVX: - adrp x16, :got:__blue_glCore_glEndConditionalRenderNVX - ldr x16, [x16, #:got_lo12:__blue_glCore_glEndConditionalRenderNVX] + .global bluegl_glVertexAttribI2uivEXT + .type bluegl_glVertexAttribI2uivEXT, %function +bluegl_glVertexAttribI2uivEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI2uivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI2uivEXT] ldr x16, [x16] br x16 - .size bluegl_glEndConditionalRenderNVX, .-bluegl_glEndConditionalRenderNVX + .size bluegl_glVertexAttribI2uivEXT, .-bluegl_glVertexAttribI2uivEXT .align 2 - .global bluegl_glDrawRangeElementArrayATI - .type bluegl_glDrawRangeElementArrayATI, %function -bluegl_glDrawRangeElementArrayATI: - adrp x16, :got:__blue_glCore_glDrawRangeElementArrayATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawRangeElementArrayATI] + .global bluegl_glVertexAttribI3uivEXT + .type bluegl_glVertexAttribI3uivEXT, %function +bluegl_glVertexAttribI3uivEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI3uivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI3uivEXT] ldr x16, [x16] br x16 - .size bluegl_glDrawRangeElementArrayATI, .-bluegl_glDrawRangeElementArrayATI + .size bluegl_glVertexAttribI3uivEXT, .-bluegl_glVertexAttribI3uivEXT .align 2 - .global bluegl_glCopyMultiTexImage1DEXT - .type bluegl_glCopyMultiTexImage1DEXT, %function -bluegl_glCopyMultiTexImage1DEXT: - adrp x16, :got:__blue_glCore_glCopyMultiTexImage1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyMultiTexImage1DEXT] + .global bluegl_glVertexAttribI4uivEXT + .type bluegl_glVertexAttribI4uivEXT, %function +bluegl_glVertexAttribI4uivEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI4uivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4uivEXT] ldr x16, [x16] br x16 - .size bluegl_glCopyMultiTexImage1DEXT, .-bluegl_glCopyMultiTexImage1DEXT + .size bluegl_glVertexAttribI4uivEXT, .-bluegl_glVertexAttribI4uivEXT .align 2 - .global bluegl_glReplacementCodeusSUN - .type bluegl_glReplacementCodeusSUN, %function -bluegl_glReplacementCodeusSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeusSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeusSUN] + .global bluegl_glVertexAttribI4bvEXT + .type bluegl_glVertexAttribI4bvEXT, %function +bluegl_glVertexAttribI4bvEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI4bvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4bvEXT] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeusSUN, .-bluegl_glReplacementCodeusSUN + .size bluegl_glVertexAttribI4bvEXT, .-bluegl_glVertexAttribI4bvEXT .align 2 - .global bluegl_glMultiTexGendEXT - .type bluegl_glMultiTexGendEXT, %function -bluegl_glMultiTexGendEXT: - adrp x16, :got:__blue_glCore_glMultiTexGendEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexGendEXT] + .global bluegl_glVertexAttribI4svEXT + .type bluegl_glVertexAttribI4svEXT, %function +bluegl_glVertexAttribI4svEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI4svEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4svEXT] ldr x16, [x16] br x16 - .size bluegl_glMultiTexGendEXT, .-bluegl_glMultiTexGendEXT + .size bluegl_glVertexAttribI4svEXT, .-bluegl_glVertexAttribI4svEXT .align 2 - .global bluegl_glMatrixRotatefEXT - .type bluegl_glMatrixRotatefEXT, %function -bluegl_glMatrixRotatefEXT: - adrp x16, :got:__blue_glCore_glMatrixRotatefEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixRotatefEXT] + .global bluegl_glVertexAttribI4ubvEXT + .type bluegl_glVertexAttribI4ubvEXT, %function +bluegl_glVertexAttribI4ubvEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI4ubvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4ubvEXT] ldr x16, [x16] br x16 - .size bluegl_glMatrixRotatefEXT, .-bluegl_glMatrixRotatefEXT + .size bluegl_glVertexAttribI4ubvEXT, .-bluegl_glVertexAttribI4ubvEXT .align 2 - .global bluegl_glBindBufferOffsetNV - .type bluegl_glBindBufferOffsetNV, %function -bluegl_glBindBufferOffsetNV: - adrp x16, :got:__blue_glCore_glBindBufferOffsetNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBufferOffsetNV] + .global bluegl_glVertexAttribI4usvEXT + .type bluegl_glVertexAttribI4usvEXT, %function +bluegl_glVertexAttribI4usvEXT: + adrp x16, :got:__blue_glCore_glVertexAttribI4usvEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4usvEXT] ldr x16, [x16] br x16 - .size bluegl_glBindBufferOffsetNV, .-bluegl_glBindBufferOffsetNV + .size bluegl_glVertexAttribI4usvEXT, .-bluegl_glVertexAttribI4usvEXT .align 2 - .global bluegl_glVertexAttribI1ui - .type bluegl_glVertexAttribI1ui, %function -bluegl_glVertexAttribI1ui: - adrp x16, :got:__blue_glCore_glVertexAttribI1ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI1ui] + .global bluegl_glVertexAttribIPointerEXT + .type bluegl_glVertexAttribIPointerEXT, %function +bluegl_glVertexAttribIPointerEXT: + adrp x16, :got:__blue_glCore_glVertexAttribIPointerEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribIPointerEXT] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI1ui, .-bluegl_glVertexAttribI1ui + .size bluegl_glVertexAttribIPointerEXT, .-bluegl_glVertexAttribIPointerEXT .align 2 - .global bluegl_glMakeImageHandleNonResidentARB - .type bluegl_glMakeImageHandleNonResidentARB, %function -bluegl_glMakeImageHandleNonResidentARB: - adrp x16, :got:__blue_glCore_glMakeImageHandleNonResidentARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeImageHandleNonResidentARB] + .global bluegl_glGetVertexAttribIivEXT + .type bluegl_glGetVertexAttribIivEXT, %function +bluegl_glGetVertexAttribIivEXT: + adrp x16, :got:__blue_glCore_glGetVertexAttribIivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribIivEXT] ldr x16, [x16] br x16 - .size bluegl_glMakeImageHandleNonResidentARB, .-bluegl_glMakeImageHandleNonResidentARB + .size bluegl_glGetVertexAttribIivEXT, .-bluegl_glGetVertexAttribIivEXT .align 2 - .global bluegl_glTextureParameteriEXT - .type bluegl_glTextureParameteriEXT, %function -bluegl_glTextureParameteriEXT: - adrp x16, :got:__blue_glCore_glTextureParameteriEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameteriEXT] + .global bluegl_glGetVertexAttribIuivEXT + .type bluegl_glGetVertexAttribIuivEXT, %function +bluegl_glGetVertexAttribIuivEXT: + adrp x16, :got:__blue_glCore_glGetVertexAttribIuivEXT + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexAttribIuivEXT] + ldr x16, [x16] + br x16 + .size bluegl_glGetVertexAttribIuivEXT, .-bluegl_glGetVertexAttribIuivEXT + + .align 2 + .global bluegl_glBeginVideoCaptureNV + .type bluegl_glBeginVideoCaptureNV, %function +bluegl_glBeginVideoCaptureNV: + adrp x16, :got:__blue_glCore_glBeginVideoCaptureNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginVideoCaptureNV] ldr x16, [x16] br x16 - .size bluegl_glTextureParameteriEXT, .-bluegl_glTextureParameteriEXT + .size bluegl_glBeginVideoCaptureNV, .-bluegl_glBeginVideoCaptureNV .align 2 - .global bluegl_glDebugMessageInsertARB - .type bluegl_glDebugMessageInsertARB, %function -bluegl_glDebugMessageInsertARB: - adrp x16, :got:__blue_glCore_glDebugMessageInsertARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glDebugMessageInsertARB] + .global bluegl_glBindVideoCaptureStreamBufferNV + .type bluegl_glBindVideoCaptureStreamBufferNV, %function +bluegl_glBindVideoCaptureStreamBufferNV: + adrp x16, :got:__blue_glCore_glBindVideoCaptureStreamBufferNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindVideoCaptureStreamBufferNV] ldr x16, [x16] br x16 - .size bluegl_glDebugMessageInsertARB, .-bluegl_glDebugMessageInsertARB + .size bluegl_glBindVideoCaptureStreamBufferNV, .-bluegl_glBindVideoCaptureStreamBufferNV .align 2 - .global bluegl_glVertexAttrib4NubvARB - .type bluegl_glVertexAttrib4NubvARB, %function -bluegl_glVertexAttrib4NubvARB: - adrp x16, :got:__blue_glCore_glVertexAttrib4NubvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4NubvARB] + .global bluegl_glBindVideoCaptureStreamTextureNV + .type bluegl_glBindVideoCaptureStreamTextureNV, %function +bluegl_glBindVideoCaptureStreamTextureNV: + adrp x16, :got:__blue_glCore_glBindVideoCaptureStreamTextureNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glBindVideoCaptureStreamTextureNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4NubvARB, .-bluegl_glVertexAttrib4NubvARB + .size bluegl_glBindVideoCaptureStreamTextureNV, .-bluegl_glBindVideoCaptureStreamTextureNV .align 2 - .global bluegl_glDeleteTexturesEXT - .type bluegl_glDeleteTexturesEXT, %function -bluegl_glDeleteTexturesEXT: - adrp x16, :got:__blue_glCore_glDeleteTexturesEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteTexturesEXT] + .global bluegl_glEndVideoCaptureNV + .type bluegl_glEndVideoCaptureNV, %function +bluegl_glEndVideoCaptureNV: + adrp x16, :got:__blue_glCore_glEndVideoCaptureNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glEndVideoCaptureNV] ldr x16, [x16] br x16 - .size bluegl_glDeleteTexturesEXT, .-bluegl_glDeleteTexturesEXT + .size bluegl_glEndVideoCaptureNV, .-bluegl_glEndVideoCaptureNV .align 2 - .global bluegl_glWindowPos3svARB - .type bluegl_glWindowPos3svARB, %function -bluegl_glWindowPos3svARB: - adrp x16, :got:__blue_glCore_glWindowPos3svARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3svARB] + .global bluegl_glGetVideoCaptureivNV + .type bluegl_glGetVideoCaptureivNV, %function +bluegl_glGetVideoCaptureivNV: + adrp x16, :got:__blue_glCore_glGetVideoCaptureivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVideoCaptureivNV] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3svARB, .-bluegl_glWindowPos3svARB + .size bluegl_glGetVideoCaptureivNV, .-bluegl_glGetVideoCaptureivNV .align 2 - .global bluegl_glTexParameterxOES - .type bluegl_glTexParameterxOES, %function -bluegl_glTexParameterxOES: - adrp x16, :got:__blue_glCore_glTexParameterxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameterxOES] + .global bluegl_glGetVideoCaptureStreamivNV + .type bluegl_glGetVideoCaptureStreamivNV, %function +bluegl_glGetVideoCaptureStreamivNV: + adrp x16, :got:__blue_glCore_glGetVideoCaptureStreamivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVideoCaptureStreamivNV] ldr x16, [x16] br x16 - .size bluegl_glTexParameterxOES, .-bluegl_glTexParameterxOES + .size bluegl_glGetVideoCaptureStreamivNV, .-bluegl_glGetVideoCaptureStreamivNV .align 2 - .global bluegl_glVertexStream3fATI - .type bluegl_glVertexStream3fATI, %function -bluegl_glVertexStream3fATI: - adrp x16, :got:__blue_glCore_glVertexStream3fATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream3fATI] + .global bluegl_glGetVideoCaptureStreamfvNV + .type bluegl_glGetVideoCaptureStreamfvNV, %function +bluegl_glGetVideoCaptureStreamfvNV: + adrp x16, :got:__blue_glCore_glGetVideoCaptureStreamfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVideoCaptureStreamfvNV] ldr x16, [x16] br x16 - .size bluegl_glVertexStream3fATI, .-bluegl_glVertexStream3fATI + .size bluegl_glGetVideoCaptureStreamfvNV, .-bluegl_glGetVideoCaptureStreamfvNV .align 2 - .global bluegl_glNormal3xOES - .type bluegl_glNormal3xOES, %function -bluegl_glNormal3xOES: - adrp x16, :got:__blue_glCore_glNormal3xOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glNormal3xOES] + .global bluegl_glGetVideoCaptureStreamdvNV + .type bluegl_glGetVideoCaptureStreamdvNV, %function +bluegl_glGetVideoCaptureStreamdvNV: + adrp x16, :got:__blue_glCore_glGetVideoCaptureStreamdvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVideoCaptureStreamdvNV] ldr x16, [x16] br x16 - .size bluegl_glNormal3xOES, .-bluegl_glNormal3xOES + .size bluegl_glGetVideoCaptureStreamdvNV, .-bluegl_glGetVideoCaptureStreamdvNV .align 2 - .global bluegl_glMultiTexCoord4bvOES - .type bluegl_glMultiTexCoord4bvOES, %function -bluegl_glMultiTexCoord4bvOES: - adrp x16, :got:__blue_glCore_glMultiTexCoord4bvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4bvOES] + .global bluegl_glVideoCaptureNV + .type bluegl_glVideoCaptureNV, %function +bluegl_glVideoCaptureNV: + adrp x16, :got:__blue_glCore_glVideoCaptureNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVideoCaptureNV] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4bvOES, .-bluegl_glMultiTexCoord4bvOES + .size bluegl_glVideoCaptureNV, .-bluegl_glVideoCaptureNV .align 2 - .global bluegl_glVertexAttribL1dv - .type bluegl_glVertexAttribL1dv, %function -bluegl_glVertexAttribL1dv: - adrp x16, :got:__blue_glCore_glVertexAttribL1dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1dv] + .global bluegl_glVideoCaptureStreamParameterivNV + .type bluegl_glVideoCaptureStreamParameterivNV, %function +bluegl_glVideoCaptureStreamParameterivNV: + adrp x16, :got:__blue_glCore_glVideoCaptureStreamParameterivNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVideoCaptureStreamParameterivNV] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL1dv, .-bluegl_glVertexAttribL1dv + .size bluegl_glVideoCaptureStreamParameterivNV, .-bluegl_glVideoCaptureStreamParameterivNV .align 2 - .global bluegl_glGetImageTransformParameterivHP - .type bluegl_glGetImageTransformParameterivHP, %function -bluegl_glGetImageTransformParameterivHP: - adrp x16, :got:__blue_glCore_glGetImageTransformParameterivHP - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetImageTransformParameterivHP] + .global bluegl_glVideoCaptureStreamParameterfvNV + .type bluegl_glVideoCaptureStreamParameterfvNV, %function +bluegl_glVideoCaptureStreamParameterfvNV: + adrp x16, :got:__blue_glCore_glVideoCaptureStreamParameterfvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVideoCaptureStreamParameterfvNV] ldr x16, [x16] br x16 - .size bluegl_glGetImageTransformParameterivHP, .-bluegl_glGetImageTransformParameterivHP + .size bluegl_glVideoCaptureStreamParameterfvNV, .-bluegl_glVideoCaptureStreamParameterfvNV .align 2 - .global bluegl_glGetSubroutineUniformLocation - .type bluegl_glGetSubroutineUniformLocation, %function -bluegl_glGetSubroutineUniformLocation: - adrp x16, :got:__blue_glCore_glGetSubroutineUniformLocation - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSubroutineUniformLocation] + .global bluegl_glVideoCaptureStreamParameterdvNV + .type bluegl_glVideoCaptureStreamParameterdvNV, %function +bluegl_glVideoCaptureStreamParameterdvNV: + adrp x16, :got:__blue_glCore_glVideoCaptureStreamParameterdvNV + ldr x16, [x16, #:got_lo12:__blue_glCore_glVideoCaptureStreamParameterdvNV] ldr x16, [x16] br x16 - .size bluegl_glGetSubroutineUniformLocation, .-bluegl_glGetSubroutineUniformLocation + .size bluegl_glVideoCaptureStreamParameterdvNV, .-bluegl_glVideoCaptureStreamParameterdvNV .align 2 - .global bluegl_glProgramEnvParameter4fvARB - .type bluegl_glProgramEnvParameter4fvARB, %function -bluegl_glProgramEnvParameter4fvARB: - adrp x16, :got:__blue_glCore_glProgramEnvParameter4fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParameter4fvARB] + .global bluegl_glFramebufferTextureMultiviewOVR + .type bluegl_glFramebufferTextureMultiviewOVR, %function +bluegl_glFramebufferTextureMultiviewOVR: + adrp x16, :got:__blue_glCore_glFramebufferTextureMultiviewOVR + ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTextureMultiviewOVR] ldr x16, [x16] br x16 - .size bluegl_glProgramEnvParameter4fvARB, .-bluegl_glProgramEnvParameter4fvARB + .size bluegl_glFramebufferTextureMultiviewOVR, .-bluegl_glFramebufferTextureMultiviewOVR .align 2 - .global bluegl_glGetTextureImageEXT - .type bluegl_glGetTextureImageEXT, %function -bluegl_glGetTextureImageEXT: - adrp x16, :got:__blue_glCore_glGetTextureImageEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureImageEXT] + .global bluegl_glHintPGI + .type bluegl_glHintPGI, %function +bluegl_glHintPGI: + adrp x16, :got:__blue_glCore_glHintPGI + ldr x16, [x16, #:got_lo12:__blue_glCore_glHintPGI] ldr x16, [x16] br x16 - .size bluegl_glGetTextureImageEXT, .-bluegl_glGetTextureImageEXT + .size bluegl_glHintPGI, .-bluegl_glHintPGI .align 2 - .global bluegl_glBindTexGenParameterEXT - .type bluegl_glBindTexGenParameterEXT, %function -bluegl_glBindTexGenParameterEXT: - adrp x16, :got:__blue_glCore_glBindTexGenParameterEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindTexGenParameterEXT] + .global bluegl_glDetailTexFuncSGIS + .type bluegl_glDetailTexFuncSGIS, %function +bluegl_glDetailTexFuncSGIS: + adrp x16, :got:__blue_glCore_glDetailTexFuncSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glDetailTexFuncSGIS] ldr x16, [x16] br x16 - .size bluegl_glBindTexGenParameterEXT, .-bluegl_glBindTexGenParameterEXT + .size bluegl_glDetailTexFuncSGIS, .-bluegl_glDetailTexFuncSGIS .align 2 - .global bluegl_glMinSampleShadingARB - .type bluegl_glMinSampleShadingARB, %function -bluegl_glMinSampleShadingARB: - adrp x16, :got:__blue_glCore_glMinSampleShadingARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMinSampleShadingARB] + .global bluegl_glGetDetailTexFuncSGIS + .type bluegl_glGetDetailTexFuncSGIS, %function +bluegl_glGetDetailTexFuncSGIS: + adrp x16, :got:__blue_glCore_glGetDetailTexFuncSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetDetailTexFuncSGIS] ldr x16, [x16] br x16 - .size bluegl_glMinSampleShadingARB, .-bluegl_glMinSampleShadingARB + .size bluegl_glGetDetailTexFuncSGIS, .-bluegl_glGetDetailTexFuncSGIS .align 2 - .global bluegl_glGetAttachedObjectsARB - .type bluegl_glGetAttachedObjectsARB, %function -bluegl_glGetAttachedObjectsARB: - adrp x16, :got:__blue_glCore_glGetAttachedObjectsARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetAttachedObjectsARB] + .global bluegl_glFogFuncSGIS + .type bluegl_glFogFuncSGIS, %function +bluegl_glFogFuncSGIS: + adrp x16, :got:__blue_glCore_glFogFuncSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glFogFuncSGIS] ldr x16, [x16] br x16 - .size bluegl_glGetAttachedObjectsARB, .-bluegl_glGetAttachedObjectsARB + .size bluegl_glFogFuncSGIS, .-bluegl_glFogFuncSGIS .align 2 - .global bluegl_glGetVertexArrayiv - .type bluegl_glGetVertexArrayiv, %function -bluegl_glGetVertexArrayiv: - adrp x16, :got:__blue_glCore_glGetVertexArrayiv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexArrayiv] + .global bluegl_glGetFogFuncSGIS + .type bluegl_glGetFogFuncSGIS, %function +bluegl_glGetFogFuncSGIS: + adrp x16, :got:__blue_glCore_glGetFogFuncSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFogFuncSGIS] ldr x16, [x16] br x16 - .size bluegl_glGetVertexArrayiv, .-bluegl_glGetVertexArrayiv + .size bluegl_glGetFogFuncSGIS, .-bluegl_glGetFogFuncSGIS .align 2 - .global bluegl_glWeightfvARB - .type bluegl_glWeightfvARB, %function -bluegl_glWeightfvARB: - adrp x16, :got:__blue_glCore_glWeightfvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWeightfvARB] + .global bluegl_glSampleMaskSGIS + .type bluegl_glSampleMaskSGIS, %function +bluegl_glSampleMaskSGIS: + adrp x16, :got:__blue_glCore_glSampleMaskSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glSampleMaskSGIS] ldr x16, [x16] br x16 - .size bluegl_glWeightfvARB, .-bluegl_glWeightfvARB + .size bluegl_glSampleMaskSGIS, .-bluegl_glSampleMaskSGIS .align 2 - .global bluegl_glGetPathCommandsNV - .type bluegl_glGetPathCommandsNV, %function -bluegl_glGetPathCommandsNV: - adrp x16, :got:__blue_glCore_glGetPathCommandsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPathCommandsNV] + .global bluegl_glSamplePatternSGIS + .type bluegl_glSamplePatternSGIS, %function +bluegl_glSamplePatternSGIS: + adrp x16, :got:__blue_glCore_glSamplePatternSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glSamplePatternSGIS] ldr x16, [x16] br x16 - .size bluegl_glGetPathCommandsNV, .-bluegl_glGetPathCommandsNV + .size bluegl_glSamplePatternSGIS, .-bluegl_glSamplePatternSGIS .align 2 - .global bluegl_glGetColorTableParameterivSGI - .type bluegl_glGetColorTableParameterivSGI, %function -bluegl_glGetColorTableParameterivSGI: - adrp x16, :got:__blue_glCore_glGetColorTableParameterivSGI - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetColorTableParameterivSGI] + .global bluegl_glPixelTexGenParameteriSGIS + .type bluegl_glPixelTexGenParameteriSGIS, %function +bluegl_glPixelTexGenParameteriSGIS: + adrp x16, :got:__blue_glCore_glPixelTexGenParameteriSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTexGenParameteriSGIS] ldr x16, [x16] br x16 - .size bluegl_glGetColorTableParameterivSGI, .-bluegl_glGetColorTableParameterivSGI + .size bluegl_glPixelTexGenParameteriSGIS, .-bluegl_glPixelTexGenParameteriSGIS .align 2 - .global bluegl_glGetNamedProgramivEXT - .type bluegl_glGetNamedProgramivEXT, %function -bluegl_glGetNamedProgramivEXT: - adrp x16, :got:__blue_glCore_glGetNamedProgramivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedProgramivEXT] + .global bluegl_glPixelTexGenParameterivSGIS + .type bluegl_glPixelTexGenParameterivSGIS, %function +bluegl_glPixelTexGenParameterivSGIS: + adrp x16, :got:__blue_glCore_glPixelTexGenParameterivSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTexGenParameterivSGIS] ldr x16, [x16] br x16 - .size bluegl_glGetNamedProgramivEXT, .-bluegl_glGetNamedProgramivEXT + .size bluegl_glPixelTexGenParameterivSGIS, .-bluegl_glPixelTexGenParameterivSGIS .align 2 - .global bluegl_glSecondaryColor3ubvEXT - .type bluegl_glSecondaryColor3ubvEXT, %function -bluegl_glSecondaryColor3ubvEXT: - adrp x16, :got:__blue_glCore_glSecondaryColor3ubvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glSecondaryColor3ubvEXT] + .global bluegl_glPixelTexGenParameterfSGIS + .type bluegl_glPixelTexGenParameterfSGIS, %function +bluegl_glPixelTexGenParameterfSGIS: + adrp x16, :got:__blue_glCore_glPixelTexGenParameterfSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTexGenParameterfSGIS] ldr x16, [x16] br x16 - .size bluegl_glSecondaryColor3ubvEXT, .-bluegl_glSecondaryColor3ubvEXT + .size bluegl_glPixelTexGenParameterfSGIS, .-bluegl_glPixelTexGenParameterfSGIS .align 2 - .global bluegl_glVDPAURegisterVideoSurfaceNV - .type bluegl_glVDPAURegisterVideoSurfaceNV, %function -bluegl_glVDPAURegisterVideoSurfaceNV: - adrp x16, :got:__blue_glCore_glVDPAURegisterVideoSurfaceNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAURegisterVideoSurfaceNV] + .global bluegl_glPixelTexGenParameterfvSGIS + .type bluegl_glPixelTexGenParameterfvSGIS, %function +bluegl_glPixelTexGenParameterfvSGIS: + adrp x16, :got:__blue_glCore_glPixelTexGenParameterfvSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTexGenParameterfvSGIS] ldr x16, [x16] br x16 - .size bluegl_glVDPAURegisterVideoSurfaceNV, .-bluegl_glVDPAURegisterVideoSurfaceNV + .size bluegl_glPixelTexGenParameterfvSGIS, .-bluegl_glPixelTexGenParameterfvSGIS .align 2 - .global bluegl_glTexParameterf - .type bluegl_glTexParameterf, %function -bluegl_glTexParameterf: - adrp x16, :got:__blue_glCore_glTexParameterf - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexParameterf] + .global bluegl_glGetPixelTexGenParameterivSGIS + .type bluegl_glGetPixelTexGenParameterivSGIS, %function +bluegl_glGetPixelTexGenParameterivSGIS: + adrp x16, :got:__blue_glCore_glGetPixelTexGenParameterivSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPixelTexGenParameterivSGIS] ldr x16, [x16] br x16 - .size bluegl_glTexParameterf, .-bluegl_glTexParameterf + .size bluegl_glGetPixelTexGenParameterivSGIS, .-bluegl_glGetPixelTexGenParameterivSGIS .align 2 - .global bluegl_glVertexAttribL4i64NV - .type bluegl_glVertexAttribL4i64NV, %function -bluegl_glVertexAttribL4i64NV: - adrp x16, :got:__blue_glCore_glVertexAttribL4i64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL4i64NV] + .global bluegl_glGetPixelTexGenParameterfvSGIS + .type bluegl_glGetPixelTexGenParameterfvSGIS, %function +bluegl_glGetPixelTexGenParameterfvSGIS: + adrp x16, :got:__blue_glCore_glGetPixelTexGenParameterfvSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPixelTexGenParameterfvSGIS] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL4i64NV, .-bluegl_glVertexAttribL4i64NV + .size bluegl_glGetPixelTexGenParameterfvSGIS, .-bluegl_glGetPixelTexGenParameterfvSGIS .align 2 - .global bluegl_glPollAsyncSGIX - .type bluegl_glPollAsyncSGIX, %function -bluegl_glPollAsyncSGIX: - adrp x16, :got:__blue_glCore_glPollAsyncSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glPollAsyncSGIX] + .global bluegl_glPointParameterfSGIS + .type bluegl_glPointParameterfSGIS, %function +bluegl_glPointParameterfSGIS: + adrp x16, :got:__blue_glCore_glPointParameterfSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterfSGIS] ldr x16, [x16] br x16 - .size bluegl_glPollAsyncSGIX, .-bluegl_glPollAsyncSGIX + .size bluegl_glPointParameterfSGIS, .-bluegl_glPointParameterfSGIS .align 2 - .global bluegl_glBufferParameteriAPPLE - .type bluegl_glBufferParameteriAPPLE, %function -bluegl_glBufferParameteriAPPLE: - adrp x16, :got:__blue_glCore_glBufferParameteriAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glBufferParameteriAPPLE] + .global bluegl_glPointParameterfvSGIS + .type bluegl_glPointParameterfvSGIS, %function +bluegl_glPointParameterfvSGIS: + adrp x16, :got:__blue_glCore_glPointParameterfvSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterfvSGIS] ldr x16, [x16] br x16 - .size bluegl_glBufferParameteriAPPLE, .-bluegl_glBufferParameteriAPPLE + .size bluegl_glPointParameterfvSGIS, .-bluegl_glPointParameterfvSGIS .align 2 - .global bluegl_glApplyTextureEXT - .type bluegl_glApplyTextureEXT, %function -bluegl_glApplyTextureEXT: - adrp x16, :got:__blue_glCore_glApplyTextureEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glApplyTextureEXT] + .global bluegl_glSharpenTexFuncSGIS + .type bluegl_glSharpenTexFuncSGIS, %function +bluegl_glSharpenTexFuncSGIS: + adrp x16, :got:__blue_glCore_glSharpenTexFuncSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glSharpenTexFuncSGIS] ldr x16, [x16] br x16 - .size bluegl_glApplyTextureEXT, .-bluegl_glApplyTextureEXT + .size bluegl_glSharpenTexFuncSGIS, .-bluegl_glSharpenTexFuncSGIS .align 2 - .global bluegl_glGenVertexShadersEXT - .type bluegl_glGenVertexShadersEXT, %function -bluegl_glGenVertexShadersEXT: - adrp x16, :got:__blue_glCore_glGenVertexShadersEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenVertexShadersEXT] + .global bluegl_glGetSharpenTexFuncSGIS + .type bluegl_glGetSharpenTexFuncSGIS, %function +bluegl_glGetSharpenTexFuncSGIS: + adrp x16, :got:__blue_glCore_glGetSharpenTexFuncSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetSharpenTexFuncSGIS] ldr x16, [x16] br x16 - .size bluegl_glGenVertexShadersEXT, .-bluegl_glGenVertexShadersEXT + .size bluegl_glGetSharpenTexFuncSGIS, .-bluegl_glGetSharpenTexFuncSGIS .align 2 - .global bluegl_glTexImage2DMultisampleCoverageNV - .type bluegl_glTexImage2DMultisampleCoverageNV, %function -bluegl_glTexImage2DMultisampleCoverageNV: - adrp x16, :got:__blue_glCore_glTexImage2DMultisampleCoverageNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexImage2DMultisampleCoverageNV] + .global bluegl_glTexImage4DSGIS + .type bluegl_glTexImage4DSGIS, %function +bluegl_glTexImage4DSGIS: + adrp x16, :got:__blue_glCore_glTexImage4DSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexImage4DSGIS] ldr x16, [x16] br x16 - .size bluegl_glTexImage2DMultisampleCoverageNV, .-bluegl_glTexImage2DMultisampleCoverageNV + .size bluegl_glTexImage4DSGIS, .-bluegl_glTexImage4DSGIS .align 2 - .global bluegl_glObjectUnpurgeableAPPLE - .type bluegl_glObjectUnpurgeableAPPLE, %function -bluegl_glObjectUnpurgeableAPPLE: - adrp x16, :got:__blue_glCore_glObjectUnpurgeableAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glObjectUnpurgeableAPPLE] + .global bluegl_glTexSubImage4DSGIS + .type bluegl_glTexSubImage4DSGIS, %function +bluegl_glTexSubImage4DSGIS: + adrp x16, :got:__blue_glCore_glTexSubImage4DSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexSubImage4DSGIS] ldr x16, [x16] br x16 - .size bluegl_glObjectUnpurgeableAPPLE, .-bluegl_glObjectUnpurgeableAPPLE + .size bluegl_glTexSubImage4DSGIS, .-bluegl_glTexSubImage4DSGIS .align 2 - .global bluegl_glCopyNamedBufferSubData - .type bluegl_glCopyNamedBufferSubData, %function -bluegl_glCopyNamedBufferSubData: - adrp x16, :got:__blue_glCore_glCopyNamedBufferSubData - ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyNamedBufferSubData] + .global bluegl_glTextureColorMaskSGIS + .type bluegl_glTextureColorMaskSGIS, %function +bluegl_glTextureColorMaskSGIS: + adrp x16, :got:__blue_glCore_glTextureColorMaskSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureColorMaskSGIS] ldr x16, [x16] br x16 - .size bluegl_glCopyNamedBufferSubData, .-bluegl_glCopyNamedBufferSubData + .size bluegl_glTextureColorMaskSGIS, .-bluegl_glTextureColorMaskSGIS .align 2 - .global bluegl_glVertexAttrib4dv - .type bluegl_glVertexAttrib4dv, %function -bluegl_glVertexAttrib4dv: - adrp x16, :got:__blue_glCore_glVertexAttrib4dv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4dv] + .global bluegl_glGetTexFilterFuncSGIS + .type bluegl_glGetTexFilterFuncSGIS, %function +bluegl_glGetTexFilterFuncSGIS: + adrp x16, :got:__blue_glCore_glGetTexFilterFuncSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexFilterFuncSGIS] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4dv, .-bluegl_glVertexAttrib4dv + .size bluegl_glGetTexFilterFuncSGIS, .-bluegl_glGetTexFilterFuncSGIS .align 2 - .global bluegl_glClearTexSubImage - .type bluegl_glClearTexSubImage, %function -bluegl_glClearTexSubImage: - adrp x16, :got:__blue_glCore_glClearTexSubImage - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearTexSubImage] + .global bluegl_glTexFilterFuncSGIS + .type bluegl_glTexFilterFuncSGIS, %function +bluegl_glTexFilterFuncSGIS: + adrp x16, :got:__blue_glCore_glTexFilterFuncSGIS + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexFilterFuncSGIS] ldr x16, [x16] br x16 - .size bluegl_glClearTexSubImage, .-bluegl_glClearTexSubImage + .size bluegl_glTexFilterFuncSGIS, .-bluegl_glTexFilterFuncSGIS .align 2 - .global bluegl_glPointAlongPathNV - .type bluegl_glPointAlongPathNV, %function -bluegl_glPointAlongPathNV: - adrp x16, :got:__blue_glCore_glPointAlongPathNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPointAlongPathNV] + .global bluegl_glAsyncMarkerSGIX + .type bluegl_glAsyncMarkerSGIX, %function +bluegl_glAsyncMarkerSGIX: + adrp x16, :got:__blue_glCore_glAsyncMarkerSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glAsyncMarkerSGIX] ldr x16, [x16] br x16 - .size bluegl_glPointAlongPathNV, .-bluegl_glPointAlongPathNV + .size bluegl_glAsyncMarkerSGIX, .-bluegl_glAsyncMarkerSGIX .align 2 - .global bluegl_glFramebufferTexture1DEXT - .type bluegl_glFramebufferTexture1DEXT, %function -bluegl_glFramebufferTexture1DEXT: - adrp x16, :got:__blue_glCore_glFramebufferTexture1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTexture1DEXT] + .global bluegl_glFinishAsyncSGIX + .type bluegl_glFinishAsyncSGIX, %function +bluegl_glFinishAsyncSGIX: + adrp x16, :got:__blue_glCore_glFinishAsyncSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glFinishAsyncSGIX] ldr x16, [x16] br x16 - .size bluegl_glFramebufferTexture1DEXT, .-bluegl_glFramebufferTexture1DEXT + .size bluegl_glFinishAsyncSGIX, .-bluegl_glFinishAsyncSGIX .align 2 - .global bluegl_glMatrixLoad3x2fNV - .type bluegl_glMatrixLoad3x2fNV, %function -bluegl_glMatrixLoad3x2fNV: - adrp x16, :got:__blue_glCore_glMatrixLoad3x2fNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixLoad3x2fNV] + .global bluegl_glPollAsyncSGIX + .type bluegl_glPollAsyncSGIX, %function +bluegl_glPollAsyncSGIX: + adrp x16, :got:__blue_glCore_glPollAsyncSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glPollAsyncSGIX] ldr x16, [x16] br x16 - .size bluegl_glMatrixLoad3x2fNV, .-bluegl_glMatrixLoad3x2fNV + .size bluegl_glPollAsyncSGIX, .-bluegl_glPollAsyncSGIX .align 2 - .global bluegl_glGetUniformui64vARB - .type bluegl_glGetUniformui64vARB, %function -bluegl_glGetUniformui64vARB: - adrp x16, :got:__blue_glCore_glGetUniformui64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformui64vARB] + .global bluegl_glGenAsyncMarkersSGIX + .type bluegl_glGenAsyncMarkersSGIX, %function +bluegl_glGenAsyncMarkersSGIX: + adrp x16, :got:__blue_glCore_glGenAsyncMarkersSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glGenAsyncMarkersSGIX] ldr x16, [x16] br x16 - .size bluegl_glGetUniformui64vARB, .-bluegl_glGetUniformui64vARB + .size bluegl_glGenAsyncMarkersSGIX, .-bluegl_glGenAsyncMarkersSGIX .align 2 - .global bluegl_glTextureStorage3DMultisampleEXT - .type bluegl_glTextureStorage3DMultisampleEXT, %function -bluegl_glTextureStorage3DMultisampleEXT: - adrp x16, :got:__blue_glCore_glTextureStorage3DMultisampleEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage3DMultisampleEXT] + .global bluegl_glDeleteAsyncMarkersSGIX + .type bluegl_glDeleteAsyncMarkersSGIX, %function +bluegl_glDeleteAsyncMarkersSGIX: + adrp x16, :got:__blue_glCore_glDeleteAsyncMarkersSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteAsyncMarkersSGIX] ldr x16, [x16] br x16 - .size bluegl_glTextureStorage3DMultisampleEXT, .-bluegl_glTextureStorage3DMultisampleEXT + .size bluegl_glDeleteAsyncMarkersSGIX, .-bluegl_glDeleteAsyncMarkersSGIX .align 2 - .global bluegl_glTexCoord1bvOES - .type bluegl_glTexCoord1bvOES, %function -bluegl_glTexCoord1bvOES: - adrp x16, :got:__blue_glCore_glTexCoord1bvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord1bvOES] + .global bluegl_glIsAsyncMarkerSGIX + .type bluegl_glIsAsyncMarkerSGIX, %function +bluegl_glIsAsyncMarkerSGIX: + adrp x16, :got:__blue_glCore_glIsAsyncMarkerSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glIsAsyncMarkerSGIX] ldr x16, [x16] br x16 - .size bluegl_glTexCoord1bvOES, .-bluegl_glTexCoord1bvOES + .size bluegl_glIsAsyncMarkerSGIX, .-bluegl_glIsAsyncMarkerSGIX .align 2 - .global bluegl_glGetBufferParameteri64v - .type bluegl_glGetBufferParameteri64v, %function -bluegl_glGetBufferParameteri64v: - adrp x16, :got:__blue_glCore_glGetBufferParameteri64v - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetBufferParameteri64v] + .global bluegl_glFlushRasterSGIX + .type bluegl_glFlushRasterSGIX, %function +bluegl_glFlushRasterSGIX: + adrp x16, :got:__blue_glCore_glFlushRasterSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glFlushRasterSGIX] ldr x16, [x16] br x16 - .size bluegl_glGetBufferParameteri64v, .-bluegl_glGetBufferParameteri64v + .size bluegl_glFlushRasterSGIX, .-bluegl_glFlushRasterSGIX .align 2 - .global bluegl_glQueryMatrixxOES - .type bluegl_glQueryMatrixxOES, %function -bluegl_glQueryMatrixxOES: - adrp x16, :got:__blue_glCore_glQueryMatrixxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glQueryMatrixxOES] + .global bluegl_glFragmentColorMaterialSGIX + .type bluegl_glFragmentColorMaterialSGIX, %function +bluegl_glFragmentColorMaterialSGIX: + adrp x16, :got:__blue_glCore_glFragmentColorMaterialSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentColorMaterialSGIX] ldr x16, [x16] br x16 - .size bluegl_glQueryMatrixxOES, .-bluegl_glQueryMatrixxOES + .size bluegl_glFragmentColorMaterialSGIX, .-bluegl_glFragmentColorMaterialSGIX .align 2 - .global bluegl_glVertexAttrib1fv - .type bluegl_glVertexAttrib1fv, %function -bluegl_glVertexAttrib1fv: - adrp x16, :got:__blue_glCore_glVertexAttrib1fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib1fv] + .global bluegl_glFragmentLightfSGIX + .type bluegl_glFragmentLightfSGIX, %function +bluegl_glFragmentLightfSGIX: + adrp x16, :got:__blue_glCore_glFragmentLightfSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentLightfSGIX] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib1fv, .-bluegl_glVertexAttrib1fv + .size bluegl_glFragmentLightfSGIX, .-bluegl_glFragmentLightfSGIX .align 2 - .global bluegl_glVertexAttribP3ui - .type bluegl_glVertexAttribP3ui, %function -bluegl_glVertexAttribP3ui: - adrp x16, :got:__blue_glCore_glVertexAttribP3ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribP3ui] + .global bluegl_glFragmentLightfvSGIX + .type bluegl_glFragmentLightfvSGIX, %function +bluegl_glFragmentLightfvSGIX: + adrp x16, :got:__blue_glCore_glFragmentLightfvSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentLightfvSGIX] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribP3ui, .-bluegl_glVertexAttribP3ui + .size bluegl_glFragmentLightfvSGIX, .-bluegl_glFragmentLightfvSGIX .align 2 - .global bluegl_glVDPAUInitNV - .type bluegl_glVDPAUInitNV, %function -bluegl_glVDPAUInitNV: - adrp x16, :got:__blue_glCore_glVDPAUInitNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVDPAUInitNV] + .global bluegl_glFragmentLightiSGIX + .type bluegl_glFragmentLightiSGIX, %function +bluegl_glFragmentLightiSGIX: + adrp x16, :got:__blue_glCore_glFragmentLightiSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentLightiSGIX] ldr x16, [x16] br x16 - .size bluegl_glVDPAUInitNV, .-bluegl_glVDPAUInitNV + .size bluegl_glFragmentLightiSGIX, .-bluegl_glFragmentLightiSGIX .align 2 - .global bluegl_glPathStencilDepthOffsetNV - .type bluegl_glPathStencilDepthOffsetNV, %function -bluegl_glPathStencilDepthOffsetNV: - adrp x16, :got:__blue_glCore_glPathStencilDepthOffsetNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glPathStencilDepthOffsetNV] + .global bluegl_glFragmentLightivSGIX + .type bluegl_glFragmentLightivSGIX, %function +bluegl_glFragmentLightivSGIX: + adrp x16, :got:__blue_glCore_glFragmentLightivSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentLightivSGIX] ldr x16, [x16] br x16 - .size bluegl_glPathStencilDepthOffsetNV, .-bluegl_glPathStencilDepthOffsetNV + .size bluegl_glFragmentLightivSGIX, .-bluegl_glFragmentLightivSGIX .align 2 - .global bluegl_glLightxOES - .type bluegl_glLightxOES, %function -bluegl_glLightxOES: - adrp x16, :got:__blue_glCore_glLightxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glLightxOES] + .global bluegl_glFragmentLightModelfSGIX + .type bluegl_glFragmentLightModelfSGIX, %function +bluegl_glFragmentLightModelfSGIX: + adrp x16, :got:__blue_glCore_glFragmentLightModelfSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentLightModelfSGIX] ldr x16, [x16] br x16 - .size bluegl_glLightxOES, .-bluegl_glLightxOES + .size bluegl_glFragmentLightModelfSGIX, .-bluegl_glFragmentLightModelfSGIX .align 2 - .global bluegl_glVertexAttribI3i - .type bluegl_glVertexAttribI3i, %function -bluegl_glVertexAttribI3i: - adrp x16, :got:__blue_glCore_glVertexAttribI3i - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI3i] + .global bluegl_glFragmentLightModelfvSGIX + .type bluegl_glFragmentLightModelfvSGIX, %function +bluegl_glFragmentLightModelfvSGIX: + adrp x16, :got:__blue_glCore_glFragmentLightModelfvSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentLightModelfvSGIX] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI3i, .-bluegl_glVertexAttribI3i + .size bluegl_glFragmentLightModelfvSGIX, .-bluegl_glFragmentLightModelfvSGIX .align 2 - .global bluegl_glProgramUniformHandleui64vARB - .type bluegl_glProgramUniformHandleui64vARB, %function -bluegl_glProgramUniformHandleui64vARB: - adrp x16, :got:__blue_glCore_glProgramUniformHandleui64vARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformHandleui64vARB] + .global bluegl_glFragmentLightModeliSGIX + .type bluegl_glFragmentLightModeliSGIX, %function +bluegl_glFragmentLightModeliSGIX: + adrp x16, :got:__blue_glCore_glFragmentLightModeliSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentLightModeliSGIX] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformHandleui64vARB, .-bluegl_glProgramUniformHandleui64vARB + .size bluegl_glFragmentLightModeliSGIX, .-bluegl_glFragmentLightModeliSGIX .align 2 - .global bluegl_glTextureParameteriv - .type bluegl_glTextureParameteriv, %function -bluegl_glTextureParameteriv: - adrp x16, :got:__blue_glCore_glTextureParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureParameteriv] + .global bluegl_glFragmentLightModelivSGIX + .type bluegl_glFragmentLightModelivSGIX, %function +bluegl_glFragmentLightModelivSGIX: + adrp x16, :got:__blue_glCore_glFragmentLightModelivSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentLightModelivSGIX] ldr x16, [x16] br x16 - .size bluegl_glTextureParameteriv, .-bluegl_glTextureParameteriv + .size bluegl_glFragmentLightModelivSGIX, .-bluegl_glFragmentLightModelivSGIX .align 2 - .global bluegl_glProgramUniformHandleui64NV - .type bluegl_glProgramUniformHandleui64NV, %function -bluegl_glProgramUniformHandleui64NV: - adrp x16, :got:__blue_glCore_glProgramUniformHandleui64NV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniformHandleui64NV] + .global bluegl_glFragmentMaterialfSGIX + .type bluegl_glFragmentMaterialfSGIX, %function +bluegl_glFragmentMaterialfSGIX: + adrp x16, :got:__blue_glCore_glFragmentMaterialfSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentMaterialfSGIX] ldr x16, [x16] br x16 - .size bluegl_glProgramUniformHandleui64NV, .-bluegl_glProgramUniformHandleui64NV + .size bluegl_glFragmentMaterialfSGIX, .-bluegl_glFragmentMaterialfSGIX .align 2 - .global bluegl_glGetVertexArrayIntegervEXT - .type bluegl_glGetVertexArrayIntegervEXT, %function -bluegl_glGetVertexArrayIntegervEXT: - adrp x16, :got:__blue_glCore_glGetVertexArrayIntegervEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetVertexArrayIntegervEXT] + .global bluegl_glFragmentMaterialfvSGIX + .type bluegl_glFragmentMaterialfvSGIX, %function +bluegl_glFragmentMaterialfvSGIX: + adrp x16, :got:__blue_glCore_glFragmentMaterialfvSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentMaterialfvSGIX] ldr x16, [x16] br x16 - .size bluegl_glGetVertexArrayIntegervEXT, .-bluegl_glGetVertexArrayIntegervEXT + .size bluegl_glFragmentMaterialfvSGIX, .-bluegl_glFragmentMaterialfvSGIX .align 2 - .global bluegl_glDrawElements - .type bluegl_glDrawElements, %function -bluegl_glDrawElements: - adrp x16, :got:__blue_glCore_glDrawElements - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElements] + .global bluegl_glFragmentMaterialiSGIX + .type bluegl_glFragmentMaterialiSGIX, %function +bluegl_glFragmentMaterialiSGIX: + adrp x16, :got:__blue_glCore_glFragmentMaterialiSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentMaterialiSGIX] ldr x16, [x16] br x16 - .size bluegl_glDrawElements, .-bluegl_glDrawElements + .size bluegl_glFragmentMaterialiSGIX, .-bluegl_glFragmentMaterialiSGIX .align 2 - .global bluegl_glProgramUniform3i64ARB - .type bluegl_glProgramUniform3i64ARB, %function -bluegl_glProgramUniform3i64ARB: - adrp x16, :got:__blue_glCore_glProgramUniform3i64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform3i64ARB] + .global bluegl_glFragmentMaterialivSGIX + .type bluegl_glFragmentMaterialivSGIX, %function +bluegl_glFragmentMaterialivSGIX: + adrp x16, :got:__blue_glCore_glFragmentMaterialivSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glFragmentMaterialivSGIX] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform3i64ARB, .-bluegl_glProgramUniform3i64ARB + .size bluegl_glFragmentMaterialivSGIX, .-bluegl_glFragmentMaterialivSGIX .align 2 - .global bluegl_glDeleteAsyncMarkersSGIX - .type bluegl_glDeleteAsyncMarkersSGIX, %function -bluegl_glDeleteAsyncMarkersSGIX: - adrp x16, :got:__blue_glCore_glDeleteAsyncMarkersSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteAsyncMarkersSGIX] + .global bluegl_glGetFragmentLightfvSGIX + .type bluegl_glGetFragmentLightfvSGIX, %function +bluegl_glGetFragmentLightfvSGIX: + adrp x16, :got:__blue_glCore_glGetFragmentLightfvSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFragmentLightfvSGIX] ldr x16, [x16] br x16 - .size bluegl_glDeleteAsyncMarkersSGIX, .-bluegl_glDeleteAsyncMarkersSGIX + .size bluegl_glGetFragmentLightfvSGIX, .-bluegl_glGetFragmentLightfvSGIX .align 2 - .global bluegl_glGetLightxOES - .type bluegl_glGetLightxOES, %function -bluegl_glGetLightxOES: - adrp x16, :got:__blue_glCore_glGetLightxOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetLightxOES] + .global bluegl_glGetFragmentLightivSGIX + .type bluegl_glGetFragmentLightivSGIX, %function +bluegl_glGetFragmentLightivSGIX: + adrp x16, :got:__blue_glCore_glGetFragmentLightivSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFragmentLightivSGIX] ldr x16, [x16] br x16 - .size bluegl_glGetLightxOES, .-bluegl_glGetLightxOES + .size bluegl_glGetFragmentLightivSGIX, .-bluegl_glGetFragmentLightivSGIX .align 2 - .global bluegl_glCreateCommandListsNV - .type bluegl_glCreateCommandListsNV, %function -bluegl_glCreateCommandListsNV: - adrp x16, :got:__blue_glCore_glCreateCommandListsNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateCommandListsNV] + .global bluegl_glGetFragmentMaterialfvSGIX + .type bluegl_glGetFragmentMaterialfvSGIX, %function +bluegl_glGetFragmentMaterialfvSGIX: + adrp x16, :got:__blue_glCore_glGetFragmentMaterialfvSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFragmentMaterialfvSGIX] ldr x16, [x16] br x16 - .size bluegl_glCreateCommandListsNV, .-bluegl_glCreateCommandListsNV + .size bluegl_glGetFragmentMaterialfvSGIX, .-bluegl_glGetFragmentMaterialfvSGIX .align 2 - .global bluegl_glClear - .type bluegl_glClear, %function -bluegl_glClear: - adrp x16, :got:__blue_glCore_glClear - ldr x16, [x16, #:got_lo12:__blue_glCore_glClear] + .global bluegl_glGetFragmentMaterialivSGIX + .type bluegl_glGetFragmentMaterialivSGIX, %function +bluegl_glGetFragmentMaterialivSGIX: + adrp x16, :got:__blue_glCore_glGetFragmentMaterialivSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetFragmentMaterialivSGIX] ldr x16, [x16] br x16 - .size bluegl_glClear, .-bluegl_glClear + .size bluegl_glGetFragmentMaterialivSGIX, .-bluegl_glGetFragmentMaterialivSGIX .align 2 - .global bluegl_glUniformui64vNV - .type bluegl_glUniformui64vNV, %function -bluegl_glUniformui64vNV: - adrp x16, :got:__blue_glCore_glUniformui64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformui64vNV] + .global bluegl_glLightEnviSGIX + .type bluegl_glLightEnviSGIX, %function +bluegl_glLightEnviSGIX: + adrp x16, :got:__blue_glCore_glLightEnviSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glLightEnviSGIX] ldr x16, [x16] br x16 - .size bluegl_glUniformui64vNV, .-bluegl_glUniformui64vNV + .size bluegl_glLightEnviSGIX, .-bluegl_glLightEnviSGIX .align 2 - .global bluegl_glVertexAttrib2dvNV - .type bluegl_glVertexAttrib2dvNV, %function -bluegl_glVertexAttrib2dvNV: - adrp x16, :got:__blue_glCore_glVertexAttrib2dvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2dvNV] + .global bluegl_glFrameZoomSGIX + .type bluegl_glFrameZoomSGIX, %function +bluegl_glFrameZoomSGIX: + adrp x16, :got:__blue_glCore_glFrameZoomSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glFrameZoomSGIX] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2dvNV, .-bluegl_glVertexAttrib2dvNV + .size bluegl_glFrameZoomSGIX, .-bluegl_glFrameZoomSGIX .align 2 - .global bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN - .type bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN, %function -bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN] + .global bluegl_glIglooInterfaceSGIX + .type bluegl_glIglooInterfaceSGIX, %function +bluegl_glIglooInterfaceSGIX: + adrp x16, :got:__blue_glCore_glIglooInterfaceSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glIglooInterfaceSGIX] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN, .-bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN + .size bluegl_glIglooInterfaceSGIX, .-bluegl_glIglooInterfaceSGIX .align 2 - .global bluegl_glWindowPos3sARB - .type bluegl_glWindowPos3sARB, %function -bluegl_glWindowPos3sARB: - adrp x16, :got:__blue_glCore_glWindowPos3sARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos3sARB] + .global bluegl_glGetInstrumentsSGIX + .type bluegl_glGetInstrumentsSGIX, %function +bluegl_glGetInstrumentsSGIX: + adrp x16, :got:__blue_glCore_glGetInstrumentsSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetInstrumentsSGIX] ldr x16, [x16] br x16 - .size bluegl_glWindowPos3sARB, .-bluegl_glWindowPos3sARB + .size bluegl_glGetInstrumentsSGIX, .-bluegl_glGetInstrumentsSGIX .align 2 - .global bluegl_glDrawTextureNV - .type bluegl_glDrawTextureNV, %function -bluegl_glDrawTextureNV: - adrp x16, :got:__blue_glCore_glDrawTextureNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawTextureNV] + .global bluegl_glInstrumentsBufferSGIX + .type bluegl_glInstrumentsBufferSGIX, %function +bluegl_glInstrumentsBufferSGIX: + adrp x16, :got:__blue_glCore_glInstrumentsBufferSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glInstrumentsBufferSGIX] + ldr x16, [x16] + br x16 + .size bluegl_glInstrumentsBufferSGIX, .-bluegl_glInstrumentsBufferSGIX + + .align 2 + .global bluegl_glPollInstrumentsSGIX + .type bluegl_glPollInstrumentsSGIX, %function +bluegl_glPollInstrumentsSGIX: + adrp x16, :got:__blue_glCore_glPollInstrumentsSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glPollInstrumentsSGIX] ldr x16, [x16] br x16 - .size bluegl_glDrawTextureNV, .-bluegl_glDrawTextureNV + .size bluegl_glPollInstrumentsSGIX, .-bluegl_glPollInstrumentsSGIX .align 2 - .global bluegl_glIsSync - .type bluegl_glIsSync, %function -bluegl_glIsSync: - adrp x16, :got:__blue_glCore_glIsSync - ldr x16, [x16, #:got_lo12:__blue_glCore_glIsSync] + .global bluegl_glReadInstrumentsSGIX + .type bluegl_glReadInstrumentsSGIX, %function +bluegl_glReadInstrumentsSGIX: + adrp x16, :got:__blue_glCore_glReadInstrumentsSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glReadInstrumentsSGIX] ldr x16, [x16] br x16 - .size bluegl_glIsSync, .-bluegl_glIsSync + .size bluegl_glReadInstrumentsSGIX, .-bluegl_glReadInstrumentsSGIX .align 2 - .global bluegl_glMatrixTranslatedEXT - .type bluegl_glMatrixTranslatedEXT, %function -bluegl_glMatrixTranslatedEXT: - adrp x16, :got:__blue_glCore_glMatrixTranslatedEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMatrixTranslatedEXT] + .global bluegl_glStartInstrumentsSGIX + .type bluegl_glStartInstrumentsSGIX, %function +bluegl_glStartInstrumentsSGIX: + adrp x16, :got:__blue_glCore_glStartInstrumentsSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glStartInstrumentsSGIX] ldr x16, [x16] br x16 - .size bluegl_glMatrixTranslatedEXT, .-bluegl_glMatrixTranslatedEXT + .size bluegl_glStartInstrumentsSGIX, .-bluegl_glStartInstrumentsSGIX .align 2 - .global bluegl_glGetActiveVaryingNV - .type bluegl_glGetActiveVaryingNV, %function -bluegl_glGetActiveVaryingNV: - adrp x16, :got:__blue_glCore_glGetActiveVaryingNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetActiveVaryingNV] + .global bluegl_glStopInstrumentsSGIX + .type bluegl_glStopInstrumentsSGIX, %function +bluegl_glStopInstrumentsSGIX: + adrp x16, :got:__blue_glCore_glStopInstrumentsSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glStopInstrumentsSGIX] ldr x16, [x16] br x16 - .size bluegl_glGetActiveVaryingNV, .-bluegl_glGetActiveVaryingNV + .size bluegl_glStopInstrumentsSGIX, .-bluegl_glStopInstrumentsSGIX .align 2 - .global bluegl_glCreateQueries - .type bluegl_glCreateQueries, %function -bluegl_glCreateQueries: - adrp x16, :got:__blue_glCore_glCreateQueries - ldr x16, [x16, #:got_lo12:__blue_glCore_glCreateQueries] + .global bluegl_glGetListParameterfvSGIX + .type bluegl_glGetListParameterfvSGIX, %function +bluegl_glGetListParameterfvSGIX: + adrp x16, :got:__blue_glCore_glGetListParameterfvSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetListParameterfvSGIX] ldr x16, [x16] br x16 - .size bluegl_glCreateQueries, .-bluegl_glCreateQueries + .size bluegl_glGetListParameterfvSGIX, .-bluegl_glGetListParameterfvSGIX .align 2 - .global bluegl_glGetProgramEnvParameterdvARB - .type bluegl_glGetProgramEnvParameterdvARB, %function -bluegl_glGetProgramEnvParameterdvARB: - adrp x16, :got:__blue_glCore_glGetProgramEnvParameterdvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramEnvParameterdvARB] + .global bluegl_glGetListParameterivSGIX + .type bluegl_glGetListParameterivSGIX, %function +bluegl_glGetListParameterivSGIX: + adrp x16, :got:__blue_glCore_glGetListParameterivSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetListParameterivSGIX] ldr x16, [x16] br x16 - .size bluegl_glGetProgramEnvParameterdvARB, .-bluegl_glGetProgramEnvParameterdvARB + .size bluegl_glGetListParameterivSGIX, .-bluegl_glGetListParameterivSGIX .align 2 - .global bluegl_glVertexArrayVertexAttribIOffsetEXT - .type bluegl_glVertexArrayVertexAttribIOffsetEXT, %function -bluegl_glVertexArrayVertexAttribIOffsetEXT: - adrp x16, :got:__blue_glCore_glVertexArrayVertexAttribIOffsetEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayVertexAttribIOffsetEXT] + .global bluegl_glListParameterfSGIX + .type bluegl_glListParameterfSGIX, %function +bluegl_glListParameterfSGIX: + adrp x16, :got:__blue_glCore_glListParameterfSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glListParameterfSGIX] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayVertexAttribIOffsetEXT, .-bluegl_glVertexArrayVertexAttribIOffsetEXT + .size bluegl_glListParameterfSGIX, .-bluegl_glListParameterfSGIX .align 2 - .global bluegl_glGetLocalConstantBooleanvEXT - .type bluegl_glGetLocalConstantBooleanvEXT, %function -bluegl_glGetLocalConstantBooleanvEXT: - adrp x16, :got:__blue_glCore_glGetLocalConstantBooleanvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetLocalConstantBooleanvEXT] + .global bluegl_glListParameterfvSGIX + .type bluegl_glListParameterfvSGIX, %function +bluegl_glListParameterfvSGIX: + adrp x16, :got:__blue_glCore_glListParameterfvSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glListParameterfvSGIX] ldr x16, [x16] br x16 - .size bluegl_glGetLocalConstantBooleanvEXT, .-bluegl_glGetLocalConstantBooleanvEXT + .size bluegl_glListParameterfvSGIX, .-bluegl_glListParameterfvSGIX .align 2 - .global bluegl_glGetProgramParameterfvNV - .type bluegl_glGetProgramParameterfvNV, %function -bluegl_glGetProgramParameterfvNV: - adrp x16, :got:__blue_glCore_glGetProgramParameterfvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetProgramParameterfvNV] + .global bluegl_glListParameteriSGIX + .type bluegl_glListParameteriSGIX, %function +bluegl_glListParameteriSGIX: + adrp x16, :got:__blue_glCore_glListParameteriSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glListParameteriSGIX] ldr x16, [x16] br x16 - .size bluegl_glGetProgramParameterfvNV, .-bluegl_glGetProgramParameterfvNV + .size bluegl_glListParameteriSGIX, .-bluegl_glListParameteriSGIX .align 2 - .global bluegl_glSpriteParameterivSGIX - .type bluegl_glSpriteParameterivSGIX, %function -bluegl_glSpriteParameterivSGIX: - adrp x16, :got:__blue_glCore_glSpriteParameterivSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glSpriteParameterivSGIX] + .global bluegl_glListParameterivSGIX + .type bluegl_glListParameterivSGIX, %function +bluegl_glListParameterivSGIX: + adrp x16, :got:__blue_glCore_glListParameterivSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glListParameterivSGIX] ldr x16, [x16] br x16 - .size bluegl_glSpriteParameterivSGIX, .-bluegl_glSpriteParameterivSGIX + .size bluegl_glListParameterivSGIX, .-bluegl_glListParameterivSGIX .align 2 - .global bluegl_glMultiTexCoord3xvOES - .type bluegl_glMultiTexCoord3xvOES, %function -bluegl_glMultiTexCoord3xvOES: - adrp x16, :got:__blue_glCore_glMultiTexCoord3xvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3xvOES] + .global bluegl_glPixelTexGenSGIX + .type bluegl_glPixelTexGenSGIX, %function +bluegl_glPixelTexGenSGIX: + adrp x16, :got:__blue_glCore_glPixelTexGenSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glPixelTexGenSGIX] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3xvOES, .-bluegl_glMultiTexCoord3xvOES + .size bluegl_glPixelTexGenSGIX, .-bluegl_glPixelTexGenSGIX .align 2 - .global bluegl_glBindBufferRangeNV - .type bluegl_glBindBufferRangeNV, %function -bluegl_glBindBufferRangeNV: - adrp x16, :got:__blue_glCore_glBindBufferRangeNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBufferRangeNV] + .global bluegl_glDeformationMap3dSGIX + .type bluegl_glDeformationMap3dSGIX, %function +bluegl_glDeformationMap3dSGIX: + adrp x16, :got:__blue_glCore_glDeformationMap3dSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeformationMap3dSGIX] ldr x16, [x16] br x16 - .size bluegl_glBindBufferRangeNV, .-bluegl_glBindBufferRangeNV + .size bluegl_glDeformationMap3dSGIX, .-bluegl_glDeformationMap3dSGIX .align 2 - .global bluegl_glMultiTexCoord1sv - .type bluegl_glMultiTexCoord1sv, %function -bluegl_glMultiTexCoord1sv: - adrp x16, :got:__blue_glCore_glMultiTexCoord1sv - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1sv] + .global bluegl_glDeformationMap3fSGIX + .type bluegl_glDeformationMap3fSGIX, %function +bluegl_glDeformationMap3fSGIX: + adrp x16, :got:__blue_glCore_glDeformationMap3fSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeformationMap3fSGIX] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1sv, .-bluegl_glMultiTexCoord1sv + .size bluegl_glDeformationMap3fSGIX, .-bluegl_glDeformationMap3fSGIX .align 2 - .global bluegl_glVertexStream1ivATI - .type bluegl_glVertexStream1ivATI, %function -bluegl_glVertexStream1ivATI: - adrp x16, :got:__blue_glCore_glVertexStream1ivATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream1ivATI] + .global bluegl_glDeformSGIX + .type bluegl_glDeformSGIX, %function +bluegl_glDeformSGIX: + adrp x16, :got:__blue_glCore_glDeformSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glDeformSGIX] ldr x16, [x16] br x16 - .size bluegl_glVertexStream1ivATI, .-bluegl_glVertexStream1ivATI + .size bluegl_glDeformSGIX, .-bluegl_glDeformSGIX .align 2 - .global bluegl_glGetQueryObjectivARB - .type bluegl_glGetQueryObjectivARB, %function -bluegl_glGetQueryObjectivARB: - adrp x16, :got:__blue_glCore_glGetQueryObjectivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetQueryObjectivARB] + .global bluegl_glLoadIdentityDeformationMapSGIX + .type bluegl_glLoadIdentityDeformationMapSGIX, %function +bluegl_glLoadIdentityDeformationMapSGIX: + adrp x16, :got:__blue_glCore_glLoadIdentityDeformationMapSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glLoadIdentityDeformationMapSGIX] ldr x16, [x16] br x16 - .size bluegl_glGetQueryObjectivARB, .-bluegl_glGetQueryObjectivARB + .size bluegl_glLoadIdentityDeformationMapSGIX, .-bluegl_glLoadIdentityDeformationMapSGIX .align 2 - .global bluegl_glReplacementCodeuiColor4ubVertex3fvSUN - .type bluegl_glReplacementCodeuiColor4ubVertex3fvSUN, %function -bluegl_glReplacementCodeuiColor4ubVertex3fvSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN] + .global bluegl_glReferencePlaneSGIX + .type bluegl_glReferencePlaneSGIX, %function +bluegl_glReferencePlaneSGIX: + adrp x16, :got:__blue_glCore_glReferencePlaneSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glReferencePlaneSGIX] ldr x16, [x16] br x16 - .size bluegl_glReplacementCodeuiColor4ubVertex3fvSUN, .-bluegl_glReplacementCodeuiColor4ubVertex3fvSUN + .size bluegl_glReferencePlaneSGIX, .-bluegl_glReferencePlaneSGIX .align 2 - .global bluegl_glFlushMappedNamedBufferRange - .type bluegl_glFlushMappedNamedBufferRange, %function -bluegl_glFlushMappedNamedBufferRange: - adrp x16, :got:__blue_glCore_glFlushMappedNamedBufferRange - ldr x16, [x16, #:got_lo12:__blue_glCore_glFlushMappedNamedBufferRange] + .global bluegl_glSpriteParameterfSGIX + .type bluegl_glSpriteParameterfSGIX, %function +bluegl_glSpriteParameterfSGIX: + adrp x16, :got:__blue_glCore_glSpriteParameterfSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glSpriteParameterfSGIX] ldr x16, [x16] br x16 - .size bluegl_glFlushMappedNamedBufferRange, .-bluegl_glFlushMappedNamedBufferRange + .size bluegl_glSpriteParameterfSGIX, .-bluegl_glSpriteParameterfSGIX .align 2 - .global bluegl_glPointParameteriv - .type bluegl_glPointParameteriv, %function -bluegl_glPointParameteriv: - adrp x16, :got:__blue_glCore_glPointParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameteriv] + .global bluegl_glSpriteParameterfvSGIX + .type bluegl_glSpriteParameterfvSGIX, %function +bluegl_glSpriteParameterfvSGIX: + adrp x16, :got:__blue_glCore_glSpriteParameterfvSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glSpriteParameterfvSGIX] ldr x16, [x16] br x16 - .size bluegl_glPointParameteriv, .-bluegl_glPointParameteriv + .size bluegl_glSpriteParameterfvSGIX, .-bluegl_glSpriteParameterfvSGIX .align 2 - .global bluegl_glGetTextureLevelParameterivEXT - .type bluegl_glGetTextureLevelParameterivEXT, %function -bluegl_glGetTextureLevelParameterivEXT: - adrp x16, :got:__blue_glCore_glGetTextureLevelParameterivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTextureLevelParameterivEXT] + .global bluegl_glSpriteParameteriSGIX + .type bluegl_glSpriteParameteriSGIX, %function +bluegl_glSpriteParameteriSGIX: + adrp x16, :got:__blue_glCore_glSpriteParameteriSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glSpriteParameteriSGIX] ldr x16, [x16] br x16 - .size bluegl_glGetTextureLevelParameterivEXT, .-bluegl_glGetTextureLevelParameterivEXT + .size bluegl_glSpriteParameteriSGIX, .-bluegl_glSpriteParameteriSGIX .align 2 - .global bluegl_glMultiTexEnviEXT - .type bluegl_glMultiTexEnviEXT, %function -bluegl_glMultiTexEnviEXT: - adrp x16, :got:__blue_glCore_glMultiTexEnviEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexEnviEXT] + .global bluegl_glSpriteParameterivSGIX + .type bluegl_glSpriteParameterivSGIX, %function +bluegl_glSpriteParameterivSGIX: + adrp x16, :got:__blue_glCore_glSpriteParameterivSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glSpriteParameterivSGIX] ldr x16, [x16] br x16 - .size bluegl_glMultiTexEnviEXT, .-bluegl_glMultiTexEnviEXT + .size bluegl_glSpriteParameterivSGIX, .-bluegl_glSpriteParameterivSGIX .align 2 - .global bluegl_glPolygonOffset - .type bluegl_glPolygonOffset, %function -bluegl_glPolygonOffset: - adrp x16, :got:__blue_glCore_glPolygonOffset - ldr x16, [x16, #:got_lo12:__blue_glCore_glPolygonOffset] + .global bluegl_glTagSampleBufferSGIX + .type bluegl_glTagSampleBufferSGIX, %function +bluegl_glTagSampleBufferSGIX: + adrp x16, :got:__blue_glCore_glTagSampleBufferSGIX + ldr x16, [x16, #:got_lo12:__blue_glCore_glTagSampleBufferSGIX] ldr x16, [x16] br x16 - .size bluegl_glPolygonOffset, .-bluegl_glPolygonOffset + .size bluegl_glTagSampleBufferSGIX, .-bluegl_glTagSampleBufferSGIX .align 2 - .global bluegl_glUniform1ui64ARB - .type bluegl_glUniform1ui64ARB, %function -bluegl_glUniform1ui64ARB: - adrp x16, :got:__blue_glCore_glUniform1ui64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1ui64ARB] + .global bluegl_glColorTableSGI + .type bluegl_glColorTableSGI, %function +bluegl_glColorTableSGI: + adrp x16, :got:__blue_glCore_glColorTableSGI + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorTableSGI] ldr x16, [x16] br x16 - .size bluegl_glUniform1ui64ARB, .-bluegl_glUniform1ui64ARB + .size bluegl_glColorTableSGI, .-bluegl_glColorTableSGI .align 2 - .global bluegl_glDeleteVertexArrays - .type bluegl_glDeleteVertexArrays, %function -bluegl_glDeleteVertexArrays: - adrp x16, :got:__blue_glCore_glDeleteVertexArrays - ldr x16, [x16, #:got_lo12:__blue_glCore_glDeleteVertexArrays] + .global bluegl_glColorTableParameterfvSGI + .type bluegl_glColorTableParameterfvSGI, %function +bluegl_glColorTableParameterfvSGI: + adrp x16, :got:__blue_glCore_glColorTableParameterfvSGI + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorTableParameterfvSGI] ldr x16, [x16] br x16 - .size bluegl_glDeleteVertexArrays, .-bluegl_glDeleteVertexArrays + .size bluegl_glColorTableParameterfvSGI, .-bluegl_glColorTableParameterfvSGI .align 2 - .global bluegl_glGetUniformi64vNV - .type bluegl_glGetUniformi64vNV, %function -bluegl_glGetUniformi64vNV: - adrp x16, :got:__blue_glCore_glGetUniformi64vNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetUniformi64vNV] + .global bluegl_glColorTableParameterivSGI + .type bluegl_glColorTableParameterivSGI, %function +bluegl_glColorTableParameterivSGI: + adrp x16, :got:__blue_glCore_glColorTableParameterivSGI + ldr x16, [x16, #:got_lo12:__blue_glCore_glColorTableParameterivSGI] ldr x16, [x16] br x16 - .size bluegl_glGetUniformi64vNV, .-bluegl_glGetUniformi64vNV + .size bluegl_glColorTableParameterivSGI, .-bluegl_glColorTableParameterivSGI .align 2 - .global bluegl_glVertexAttribI3iv - .type bluegl_glVertexAttribI3iv, %function -bluegl_glVertexAttribI3iv: - adrp x16, :got:__blue_glCore_glVertexAttribI3iv - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI3iv] + .global bluegl_glCopyColorTableSGI + .type bluegl_glCopyColorTableSGI, %function +bluegl_glCopyColorTableSGI: + adrp x16, :got:__blue_glCore_glCopyColorTableSGI + ldr x16, [x16, #:got_lo12:__blue_glCore_glCopyColorTableSGI] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI3iv, .-bluegl_glVertexAttribI3iv + .size bluegl_glCopyColorTableSGI, .-bluegl_glCopyColorTableSGI .align 2 - .global bluegl_glEndQueryIndexed - .type bluegl_glEndQueryIndexed, %function -bluegl_glEndQueryIndexed: - adrp x16, :got:__blue_glCore_glEndQueryIndexed - ldr x16, [x16, #:got_lo12:__blue_glCore_glEndQueryIndexed] + .global bluegl_glGetColorTableSGI + .type bluegl_glGetColorTableSGI, %function +bluegl_glGetColorTableSGI: + adrp x16, :got:__blue_glCore_glGetColorTableSGI + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetColorTableSGI] ldr x16, [x16] br x16 - .size bluegl_glEndQueryIndexed, .-bluegl_glEndQueryIndexed + .size bluegl_glGetColorTableSGI, .-bluegl_glGetColorTableSGI .align 2 - .global bluegl_glTextureSubImage1DEXT - .type bluegl_glTextureSubImage1DEXT, %function -bluegl_glTextureSubImage1DEXT: - adrp x16, :got:__blue_glCore_glTextureSubImage1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureSubImage1DEXT] + .global bluegl_glGetColorTableParameterfvSGI + .type bluegl_glGetColorTableParameterfvSGI, %function +bluegl_glGetColorTableParameterfvSGI: + adrp x16, :got:__blue_glCore_glGetColorTableParameterfvSGI + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetColorTableParameterfvSGI] ldr x16, [x16] br x16 - .size bluegl_glTextureSubImage1DEXT, .-bluegl_glTextureSubImage1DEXT + .size bluegl_glGetColorTableParameterfvSGI, .-bluegl_glGetColorTableParameterfvSGI .align 2 - .global bluegl_glVertexAttribI4ubvEXT - .type bluegl_glVertexAttribI4ubvEXT, %function -bluegl_glVertexAttribI4ubvEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI4ubvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4ubvEXT] + .global bluegl_glGetColorTableParameterivSGI + .type bluegl_glGetColorTableParameterivSGI, %function +bluegl_glGetColorTableParameterivSGI: + adrp x16, :got:__blue_glCore_glGetColorTableParameterivSGI + ldr x16, [x16, #:got_lo12:__blue_glCore_glGetColorTableParameterivSGI] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI4ubvEXT, .-bluegl_glVertexAttribI4ubvEXT + .size bluegl_glGetColorTableParameterivSGI, .-bluegl_glGetColorTableParameterivSGI .align 2 - .global bluegl_glVertexAttribP4ui - .type bluegl_glVertexAttribP4ui, %function -bluegl_glVertexAttribP4ui: - adrp x16, :got:__blue_glCore_glVertexAttribP4ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribP4ui] + .global bluegl_glFinishTextureSUNX + .type bluegl_glFinishTextureSUNX, %function +bluegl_glFinishTextureSUNX: + adrp x16, :got:__blue_glCore_glFinishTextureSUNX + ldr x16, [x16, #:got_lo12:__blue_glCore_glFinishTextureSUNX] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribP4ui, .-bluegl_glVertexAttribP4ui + .size bluegl_glFinishTextureSUNX, .-bluegl_glFinishTextureSUNX .align 2 - .global bluegl_glNamedProgramLocalParameter4dvEXT - .type bluegl_glNamedProgramLocalParameter4dvEXT, %function -bluegl_glNamedProgramLocalParameter4dvEXT: - adrp x16, :got:__blue_glCore_glNamedProgramLocalParameter4dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glNamedProgramLocalParameter4dvEXT] + .global bluegl_glGlobalAlphaFactorbSUN + .type bluegl_glGlobalAlphaFactorbSUN, %function +bluegl_glGlobalAlphaFactorbSUN: + adrp x16, :got:__blue_glCore_glGlobalAlphaFactorbSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glGlobalAlphaFactorbSUN] ldr x16, [x16] br x16 - .size bluegl_glNamedProgramLocalParameter4dvEXT, .-bluegl_glNamedProgramLocalParameter4dvEXT + .size bluegl_glGlobalAlphaFactorbSUN, .-bluegl_glGlobalAlphaFactorbSUN .align 2 - .global bluegl_glGetNamedProgramLocalParameterIuivEXT - .type bluegl_glGetNamedProgramLocalParameterIuivEXT, %function -bluegl_glGetNamedProgramLocalParameterIuivEXT: - adrp x16, :got:__blue_glCore_glGetNamedProgramLocalParameterIuivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedProgramLocalParameterIuivEXT] + .global bluegl_glGlobalAlphaFactorsSUN + .type bluegl_glGlobalAlphaFactorsSUN, %function +bluegl_glGlobalAlphaFactorsSUN: + adrp x16, :got:__blue_glCore_glGlobalAlphaFactorsSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glGlobalAlphaFactorsSUN] ldr x16, [x16] br x16 - .size bluegl_glGetNamedProgramLocalParameterIuivEXT, .-bluegl_glGetNamedProgramLocalParameterIuivEXT + .size bluegl_glGlobalAlphaFactorsSUN, .-bluegl_glGlobalAlphaFactorsSUN .align 2 - .global bluegl_glGetPixelTexGenParameterivSGIS - .type bluegl_glGetPixelTexGenParameterivSGIS, %function -bluegl_glGetPixelTexGenParameterivSGIS: - adrp x16, :got:__blue_glCore_glGetPixelTexGenParameterivSGIS - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPixelTexGenParameterivSGIS] + .global bluegl_glGlobalAlphaFactoriSUN + .type bluegl_glGlobalAlphaFactoriSUN, %function +bluegl_glGlobalAlphaFactoriSUN: + adrp x16, :got:__blue_glCore_glGlobalAlphaFactoriSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glGlobalAlphaFactoriSUN] ldr x16, [x16] br x16 - .size bluegl_glGetPixelTexGenParameterivSGIS, .-bluegl_glGetPixelTexGenParameterivSGIS + .size bluegl_glGlobalAlphaFactoriSUN, .-bluegl_glGlobalAlphaFactoriSUN .align 2 - .global bluegl_glGetnMapdv - .type bluegl_glGetnMapdv, %function -bluegl_glGetnMapdv: - adrp x16, :got:__blue_glCore_glGetnMapdv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnMapdv] + .global bluegl_glGlobalAlphaFactorfSUN + .type bluegl_glGlobalAlphaFactorfSUN, %function +bluegl_glGlobalAlphaFactorfSUN: + adrp x16, :got:__blue_glCore_glGlobalAlphaFactorfSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glGlobalAlphaFactorfSUN] ldr x16, [x16] br x16 - .size bluegl_glGetnMapdv, .-bluegl_glGetnMapdv + .size bluegl_glGlobalAlphaFactorfSUN, .-bluegl_glGlobalAlphaFactorfSUN .align 2 - .global bluegl_glMultiTexCoord4svARB - .type bluegl_glMultiTexCoord4svARB, %function -bluegl_glMultiTexCoord4svARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord4svARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord4svARB] + .global bluegl_glGlobalAlphaFactordSUN + .type bluegl_glGlobalAlphaFactordSUN, %function +bluegl_glGlobalAlphaFactordSUN: + adrp x16, :got:__blue_glCore_glGlobalAlphaFactordSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glGlobalAlphaFactordSUN] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord4svARB, .-bluegl_glMultiTexCoord4svARB + .size bluegl_glGlobalAlphaFactordSUN, .-bluegl_glGlobalAlphaFactordSUN .align 2 - .global bluegl_glVertexStream2ivATI - .type bluegl_glVertexStream2ivATI, %function -bluegl_glVertexStream2ivATI: - adrp x16, :got:__blue_glCore_glVertexStream2ivATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexStream2ivATI] + .global bluegl_glGlobalAlphaFactorubSUN + .type bluegl_glGlobalAlphaFactorubSUN, %function +bluegl_glGlobalAlphaFactorubSUN: + adrp x16, :got:__blue_glCore_glGlobalAlphaFactorubSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glGlobalAlphaFactorubSUN] ldr x16, [x16] br x16 - .size bluegl_glVertexStream2ivATI, .-bluegl_glVertexStream2ivATI + .size bluegl_glGlobalAlphaFactorubSUN, .-bluegl_glGlobalAlphaFactorubSUN .align 2 - .global bluegl_glUniform4uivEXT - .type bluegl_glUniform4uivEXT, %function -bluegl_glUniform4uivEXT: - adrp x16, :got:__blue_glCore_glUniform4uivEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4uivEXT] + .global bluegl_glGlobalAlphaFactorusSUN + .type bluegl_glGlobalAlphaFactorusSUN, %function +bluegl_glGlobalAlphaFactorusSUN: + adrp x16, :got:__blue_glCore_glGlobalAlphaFactorusSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glGlobalAlphaFactorusSUN] ldr x16, [x16] br x16 - .size bluegl_glUniform4uivEXT, .-bluegl_glUniform4uivEXT + .size bluegl_glGlobalAlphaFactorusSUN, .-bluegl_glGlobalAlphaFactorusSUN .align 2 - .global bluegl_glGetPointeri_vEXT - .type bluegl_glGetPointeri_vEXT, %function -bluegl_glGetPointeri_vEXT: - adrp x16, :got:__blue_glCore_glGetPointeri_vEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetPointeri_vEXT] + .global bluegl_glGlobalAlphaFactoruiSUN + .type bluegl_glGlobalAlphaFactoruiSUN, %function +bluegl_glGlobalAlphaFactoruiSUN: + adrp x16, :got:__blue_glCore_glGlobalAlphaFactoruiSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glGlobalAlphaFactoruiSUN] ldr x16, [x16] br x16 - .size bluegl_glGetPointeri_vEXT, .-bluegl_glGetPointeri_vEXT + .size bluegl_glGlobalAlphaFactoruiSUN, .-bluegl_glGlobalAlphaFactoruiSUN .align 2 - .global bluegl_glClearTexImage - .type bluegl_glClearTexImage, %function -bluegl_glClearTexImage: - adrp x16, :got:__blue_glCore_glClearTexImage - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearTexImage] + .global bluegl_glDrawMeshArraysSUN + .type bluegl_glDrawMeshArraysSUN, %function +bluegl_glDrawMeshArraysSUN: + adrp x16, :got:__blue_glCore_glDrawMeshArraysSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawMeshArraysSUN] ldr x16, [x16] br x16 - .size bluegl_glClearTexImage, .-bluegl_glClearTexImage + .size bluegl_glDrawMeshArraysSUN, .-bluegl_glDrawMeshArraysSUN .align 2 - .global bluegl_glVertexAttribP1ui - .type bluegl_glVertexAttribP1ui, %function -bluegl_glVertexAttribP1ui: - adrp x16, :got:__blue_glCore_glVertexAttribP1ui - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribP1ui] + .global bluegl_glReplacementCodeuiSUN + .type bluegl_glReplacementCodeuiSUN, %function +bluegl_glReplacementCodeuiSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeuiSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiSUN] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribP1ui, .-bluegl_glVertexAttribP1ui + .size bluegl_glReplacementCodeuiSUN, .-bluegl_glReplacementCodeuiSUN .align 2 - .global bluegl_glCompressedTexImage1DARB - .type bluegl_glCompressedTexImage1DARB, %function -bluegl_glCompressedTexImage1DARB: - adrp x16, :got:__blue_glCore_glCompressedTexImage1DARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glCompressedTexImage1DARB] + .global bluegl_glReplacementCodeusSUN + .type bluegl_glReplacementCodeusSUN, %function +bluegl_glReplacementCodeusSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeusSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeusSUN] ldr x16, [x16] br x16 - .size bluegl_glCompressedTexImage1DARB, .-bluegl_glCompressedTexImage1DARB + .size bluegl_glReplacementCodeusSUN, .-bluegl_glReplacementCodeusSUN .align 2 - .global bluegl_glTextureStorage1DEXT - .type bluegl_glTextureStorage1DEXT, %function -bluegl_glTextureStorage1DEXT: - adrp x16, :got:__blue_glCore_glTextureStorage1DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glTextureStorage1DEXT] + .global bluegl_glReplacementCodeubSUN + .type bluegl_glReplacementCodeubSUN, %function +bluegl_glReplacementCodeubSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeubSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeubSUN] ldr x16, [x16] br x16 - .size bluegl_glTextureStorage1DEXT, .-bluegl_glTextureStorage1DEXT + .size bluegl_glReplacementCodeubSUN, .-bluegl_glReplacementCodeubSUN .align 2 - .global bluegl_glUniform4fvARB - .type bluegl_glUniform4fvARB, %function -bluegl_glUniform4fvARB: - adrp x16, :got:__blue_glCore_glUniform4fvARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform4fvARB] + .global bluegl_glReplacementCodeuivSUN + .type bluegl_glReplacementCodeuivSUN, %function +bluegl_glReplacementCodeuivSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeuivSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuivSUN] ldr x16, [x16] br x16 - .size bluegl_glUniform4fvARB, .-bluegl_glUniform4fvARB + .size bluegl_glReplacementCodeuivSUN, .-bluegl_glReplacementCodeuivSUN .align 2 - .global bluegl_glFramebufferTexture3DEXT - .type bluegl_glFramebufferTexture3DEXT, %function -bluegl_glFramebufferTexture3DEXT: - adrp x16, :got:__blue_glCore_glFramebufferTexture3DEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glFramebufferTexture3DEXT] + .global bluegl_glReplacementCodeusvSUN + .type bluegl_glReplacementCodeusvSUN, %function +bluegl_glReplacementCodeusvSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeusvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeusvSUN] ldr x16, [x16] br x16 - .size bluegl_glFramebufferTexture3DEXT, .-bluegl_glFramebufferTexture3DEXT + .size bluegl_glReplacementCodeusvSUN, .-bluegl_glReplacementCodeusvSUN .align 2 - .global bluegl_glDrawElementsIndirect - .type bluegl_glDrawElementsIndirect, %function -bluegl_glDrawElementsIndirect: - adrp x16, :got:__blue_glCore_glDrawElementsIndirect - ldr x16, [x16, #:got_lo12:__blue_glCore_glDrawElementsIndirect] + .global bluegl_glReplacementCodeubvSUN + .type bluegl_glReplacementCodeubvSUN, %function +bluegl_glReplacementCodeubvSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeubvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeubvSUN] ldr x16, [x16] br x16 - .size bluegl_glDrawElementsIndirect, .-bluegl_glDrawElementsIndirect + .size bluegl_glReplacementCodeubvSUN, .-bluegl_glReplacementCodeubvSUN .align 2 - .global bluegl_glBindBufferBaseEXT - .type bluegl_glBindBufferBaseEXT, %function -bluegl_glBindBufferBaseEXT: - adrp x16, :got:__blue_glCore_glBindBufferBaseEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBufferBaseEXT] + .global bluegl_glReplacementCodePointerSUN + .type bluegl_glReplacementCodePointerSUN, %function +bluegl_glReplacementCodePointerSUN: + adrp x16, :got:__blue_glCore_glReplacementCodePointerSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodePointerSUN] ldr x16, [x16] br x16 - .size bluegl_glBindBufferBaseEXT, .-bluegl_glBindBufferBaseEXT + .size bluegl_glReplacementCodePointerSUN, .-bluegl_glReplacementCodePointerSUN .align 2 - .global bluegl_glIglooInterfaceSGIX - .type bluegl_glIglooInterfaceSGIX, %function -bluegl_glIglooInterfaceSGIX: - adrp x16, :got:__blue_glCore_glIglooInterfaceSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glIglooInterfaceSGIX] + .global bluegl_glColor4ubVertex2fSUN + .type bluegl_glColor4ubVertex2fSUN, %function +bluegl_glColor4ubVertex2fSUN: + adrp x16, :got:__blue_glCore_glColor4ubVertex2fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4ubVertex2fSUN] ldr x16, [x16] br x16 - .size bluegl_glIglooInterfaceSGIX, .-bluegl_glIglooInterfaceSGIX + .size bluegl_glColor4ubVertex2fSUN, .-bluegl_glColor4ubVertex2fSUN .align 2 - .global bluegl_glMinmaxEXT - .type bluegl_glMinmaxEXT, %function -bluegl_glMinmaxEXT: - adrp x16, :got:__blue_glCore_glMinmaxEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMinmaxEXT] + .global bluegl_glColor4ubVertex2fvSUN + .type bluegl_glColor4ubVertex2fvSUN, %function +bluegl_glColor4ubVertex2fvSUN: + adrp x16, :got:__blue_glCore_glColor4ubVertex2fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4ubVertex2fvSUN] ldr x16, [x16] br x16 - .size bluegl_glMinmaxEXT, .-bluegl_glMinmaxEXT + .size bluegl_glColor4ubVertex2fvSUN, .-bluegl_glColor4ubVertex2fvSUN .align 2 - .global bluegl_glClearDepthf - .type bluegl_glClearDepthf, %function -bluegl_glClearDepthf: - adrp x16, :got:__blue_glCore_glClearDepthf - ldr x16, [x16, #:got_lo12:__blue_glCore_glClearDepthf] + .global bluegl_glColor4ubVertex3fSUN + .type bluegl_glColor4ubVertex3fSUN, %function +bluegl_glColor4ubVertex3fSUN: + adrp x16, :got:__blue_glCore_glColor4ubVertex3fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4ubVertex3fSUN] ldr x16, [x16] br x16 - .size bluegl_glClearDepthf, .-bluegl_glClearDepthf + .size bluegl_glColor4ubVertex3fSUN, .-bluegl_glColor4ubVertex3fSUN .align 2 - .global bluegl_glReadnPixels - .type bluegl_glReadnPixels, %function -bluegl_glReadnPixels: - adrp x16, :got:__blue_glCore_glReadnPixels - ldr x16, [x16, #:got_lo12:__blue_glCore_glReadnPixels] + .global bluegl_glColor4ubVertex3fvSUN + .type bluegl_glColor4ubVertex3fvSUN, %function +bluegl_glColor4ubVertex3fvSUN: + adrp x16, :got:__blue_glCore_glColor4ubVertex3fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4ubVertex3fvSUN] ldr x16, [x16] br x16 - .size bluegl_glReadnPixels, .-bluegl_glReadnPixels + .size bluegl_glColor4ubVertex3fvSUN, .-bluegl_glColor4ubVertex3fvSUN .align 2 - .global bluegl_glGenerateTextureMipmap - .type bluegl_glGenerateTextureMipmap, %function -bluegl_glGenerateTextureMipmap: - adrp x16, :got:__blue_glCore_glGenerateTextureMipmap - ldr x16, [x16, #:got_lo12:__blue_glCore_glGenerateTextureMipmap] + .global bluegl_glColor3fVertex3fSUN + .type bluegl_glColor3fVertex3fSUN, %function +bluegl_glColor3fVertex3fSUN: + adrp x16, :got:__blue_glCore_glColor3fVertex3fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glColor3fVertex3fSUN] ldr x16, [x16] br x16 - .size bluegl_glGenerateTextureMipmap, .-bluegl_glGenerateTextureMipmap + .size bluegl_glColor3fVertex3fSUN, .-bluegl_glColor3fVertex3fSUN .align 2 - .global bluegl_glGetnPixelMapuivARB - .type bluegl_glGetnPixelMapuivARB, %function -bluegl_glGetnPixelMapuivARB: - adrp x16, :got:__blue_glCore_glGetnPixelMapuivARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnPixelMapuivARB] + .global bluegl_glColor3fVertex3fvSUN + .type bluegl_glColor3fVertex3fvSUN, %function +bluegl_glColor3fVertex3fvSUN: + adrp x16, :got:__blue_glCore_glColor3fVertex3fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glColor3fVertex3fvSUN] ldr x16, [x16] br x16 - .size bluegl_glGetnPixelMapuivARB, .-bluegl_glGetnPixelMapuivARB + .size bluegl_glColor3fVertex3fvSUN, .-bluegl_glColor3fVertex3fvSUN .align 2 - .global bluegl_glProgramLocalParameter4fARB - .type bluegl_glProgramLocalParameter4fARB, %function -bluegl_glProgramLocalParameter4fARB: - adrp x16, :got:__blue_glCore_glProgramLocalParameter4fARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramLocalParameter4fARB] + .global bluegl_glNormal3fVertex3fSUN + .type bluegl_glNormal3fVertex3fSUN, %function +bluegl_glNormal3fVertex3fSUN: + adrp x16, :got:__blue_glCore_glNormal3fVertex3fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormal3fVertex3fSUN] ldr x16, [x16] br x16 - .size bluegl_glProgramLocalParameter4fARB, .-bluegl_glProgramLocalParameter4fARB + .size bluegl_glNormal3fVertex3fSUN, .-bluegl_glNormal3fVertex3fSUN .align 2 - .global bluegl_glVertexAttribL1dvEXT - .type bluegl_glVertexAttribL1dvEXT, %function -bluegl_glVertexAttribL1dvEXT: - adrp x16, :got:__blue_glCore_glVertexAttribL1dvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribL1dvEXT] + .global bluegl_glNormal3fVertex3fvSUN + .type bluegl_glNormal3fVertex3fvSUN, %function +bluegl_glNormal3fVertex3fvSUN: + adrp x16, :got:__blue_glCore_glNormal3fVertex3fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glNormal3fVertex3fvSUN] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribL1dvEXT, .-bluegl_glVertexAttribL1dvEXT + .size bluegl_glNormal3fVertex3fvSUN, .-bluegl_glNormal3fVertex3fvSUN .align 2 - .global bluegl_glBeginTransformFeedback - .type bluegl_glBeginTransformFeedback, %function -bluegl_glBeginTransformFeedback: - adrp x16, :got:__blue_glCore_glBeginTransformFeedback - ldr x16, [x16, #:got_lo12:__blue_glCore_glBeginTransformFeedback] + .global bluegl_glColor4fNormal3fVertex3fSUN + .type bluegl_glColor4fNormal3fVertex3fSUN, %function +bluegl_glColor4fNormal3fVertex3fSUN: + adrp x16, :got:__blue_glCore_glColor4fNormal3fVertex3fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4fNormal3fVertex3fSUN] ldr x16, [x16] br x16 - .size bluegl_glBeginTransformFeedback, .-bluegl_glBeginTransformFeedback + .size bluegl_glColor4fNormal3fVertex3fSUN, .-bluegl_glColor4fNormal3fVertex3fSUN .align 2 - .global bluegl_glDepthBoundsEXT - .type bluegl_glDepthBoundsEXT, %function -bluegl_glDepthBoundsEXT: - adrp x16, :got:__blue_glCore_glDepthBoundsEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glDepthBoundsEXT] + .global bluegl_glColor4fNormal3fVertex3fvSUN + .type bluegl_glColor4fNormal3fVertex3fvSUN, %function +bluegl_glColor4fNormal3fVertex3fvSUN: + adrp x16, :got:__blue_glCore_glColor4fNormal3fVertex3fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glColor4fNormal3fVertex3fvSUN] ldr x16, [x16] br x16 - .size bluegl_glDepthBoundsEXT, .-bluegl_glDepthBoundsEXT + .size bluegl_glColor4fNormal3fVertex3fvSUN, .-bluegl_glColor4fNormal3fVertex3fvSUN .align 2 - .global bluegl_glVertexAttrib2f - .type bluegl_glVertexAttrib2f, %function -bluegl_glVertexAttrib2f: - adrp x16, :got:__blue_glCore_glVertexAttrib2f - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib2f] + .global bluegl_glTexCoord2fVertex3fSUN + .type bluegl_glTexCoord2fVertex3fSUN, %function +bluegl_glTexCoord2fVertex3fSUN: + adrp x16, :got:__blue_glCore_glTexCoord2fVertex3fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fVertex3fSUN] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib2f, .-bluegl_glVertexAttrib2f + .size bluegl_glTexCoord2fVertex3fSUN, .-bluegl_glTexCoord2fVertex3fSUN .align 2 - .global bluegl_glProgramEnvParametersI4ivNV - .type bluegl_glProgramEnvParametersI4ivNV, %function -bluegl_glProgramEnvParametersI4ivNV: - adrp x16, :got:__blue_glCore_glProgramEnvParametersI4ivNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramEnvParametersI4ivNV] + .global bluegl_glTexCoord2fVertex3fvSUN + .type bluegl_glTexCoord2fVertex3fvSUN, %function +bluegl_glTexCoord2fVertex3fvSUN: + adrp x16, :got:__blue_glCore_glTexCoord2fVertex3fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fVertex3fvSUN] ldr x16, [x16] br x16 - .size bluegl_glProgramEnvParametersI4ivNV, .-bluegl_glProgramEnvParametersI4ivNV + .size bluegl_glTexCoord2fVertex3fvSUN, .-bluegl_glTexCoord2fVertex3fvSUN .align 2 .global bluegl_glTexCoord4fVertex4fSUN @@ -25470,291 +25489,271 @@ bluegl_glTexCoord4fVertex4fSUN: .size bluegl_glTexCoord4fVertex4fSUN, .-bluegl_glTexCoord4fVertex4fSUN .align 2 - .global bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN - .type bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN, %function -bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN: - adrp x16, :got:__blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN - ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN] - ldr x16, [x16] - br x16 - .size bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN, .-bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN - - .align 2 - .global bluegl_glGetNamedProgramLocalParameterfvEXT - .type bluegl_glGetNamedProgramLocalParameterfvEXT, %function -bluegl_glGetNamedProgramLocalParameterfvEXT: - adrp x16, :got:__blue_glCore_glGetNamedProgramLocalParameterfvEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedProgramLocalParameterfvEXT] - ldr x16, [x16] - br x16 - .size bluegl_glGetNamedProgramLocalParameterfvEXT, .-bluegl_glGetNamedProgramLocalParameterfvEXT - - .align 2 - .global bluegl_glProgramUniform1ui64ARB - .type bluegl_glProgramUniform1ui64ARB, %function -bluegl_glProgramUniform1ui64ARB: - adrp x16, :got:__blue_glCore_glProgramUniform1ui64ARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform1ui64ARB] + .global bluegl_glTexCoord4fVertex4fvSUN + .type bluegl_glTexCoord4fVertex4fvSUN, %function +bluegl_glTexCoord4fVertex4fvSUN: + adrp x16, :got:__blue_glCore_glTexCoord4fVertex4fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord4fVertex4fvSUN] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform1ui64ARB, .-bluegl_glProgramUniform1ui64ARB + .size bluegl_glTexCoord4fVertex4fvSUN, .-bluegl_glTexCoord4fVertex4fvSUN .align 2 - .global bluegl_glReadInstrumentsSGIX - .type bluegl_glReadInstrumentsSGIX, %function -bluegl_glReadInstrumentsSGIX: - adrp x16, :got:__blue_glCore_glReadInstrumentsSGIX - ldr x16, [x16, #:got_lo12:__blue_glCore_glReadInstrumentsSGIX] + .global bluegl_glTexCoord2fColor4ubVertex3fSUN + .type bluegl_glTexCoord2fColor4ubVertex3fSUN, %function +bluegl_glTexCoord2fColor4ubVertex3fSUN: + adrp x16, :got:__blue_glCore_glTexCoord2fColor4ubVertex3fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fColor4ubVertex3fSUN] ldr x16, [x16] br x16 - .size bluegl_glReadInstrumentsSGIX, .-bluegl_glReadInstrumentsSGIX + .size bluegl_glTexCoord2fColor4ubVertex3fSUN, .-bluegl_glTexCoord2fColor4ubVertex3fSUN .align 2 - .global bluegl_glVertexAttrib3dNV - .type bluegl_glVertexAttrib3dNV, %function -bluegl_glVertexAttrib3dNV: - adrp x16, :got:__blue_glCore_glVertexAttrib3dNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib3dNV] + .global bluegl_glTexCoord2fColor4ubVertex3fvSUN + .type bluegl_glTexCoord2fColor4ubVertex3fvSUN, %function +bluegl_glTexCoord2fColor4ubVertex3fvSUN: + adrp x16, :got:__blue_glCore_glTexCoord2fColor4ubVertex3fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fColor4ubVertex3fvSUN] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib3dNV, .-bluegl_glVertexAttrib3dNV + .size bluegl_glTexCoord2fColor4ubVertex3fvSUN, .-bluegl_glTexCoord2fColor4ubVertex3fvSUN .align 2 - .global bluegl_glProgramParameter4dvNV - .type bluegl_glProgramParameter4dvNV, %function -bluegl_glProgramParameter4dvNV: - adrp x16, :got:__blue_glCore_glProgramParameter4dvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramParameter4dvNV] + .global bluegl_glTexCoord2fColor3fVertex3fSUN + .type bluegl_glTexCoord2fColor3fVertex3fSUN, %function +bluegl_glTexCoord2fColor3fVertex3fSUN: + adrp x16, :got:__blue_glCore_glTexCoord2fColor3fVertex3fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fColor3fVertex3fSUN] ldr x16, [x16] br x16 - .size bluegl_glProgramParameter4dvNV, .-bluegl_glProgramParameter4dvNV + .size bluegl_glTexCoord2fColor3fVertex3fSUN, .-bluegl_glTexCoord2fColor3fVertex3fSUN .align 2 - .global bluegl_glColorTableParameterivSGI - .type bluegl_glColorTableParameterivSGI, %function -bluegl_glColorTableParameterivSGI: - adrp x16, :got:__blue_glCore_glColorTableParameterivSGI - ldr x16, [x16, #:got_lo12:__blue_glCore_glColorTableParameterivSGI] + .global bluegl_glTexCoord2fColor3fVertex3fvSUN + .type bluegl_glTexCoord2fColor3fVertex3fvSUN, %function +bluegl_glTexCoord2fColor3fVertex3fvSUN: + adrp x16, :got:__blue_glCore_glTexCoord2fColor3fVertex3fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fColor3fVertex3fvSUN] ldr x16, [x16] br x16 - .size bluegl_glColorTableParameterivSGI, .-bluegl_glColorTableParameterivSGI + .size bluegl_glTexCoord2fColor3fVertex3fvSUN, .-bluegl_glTexCoord2fColor3fVertex3fvSUN .align 2 - .global bluegl_glUniform1f - .type bluegl_glUniform1f, %function -bluegl_glUniform1f: - adrp x16, :got:__blue_glCore_glUniform1f - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniform1f] + .global bluegl_glTexCoord2fNormal3fVertex3fSUN + .type bluegl_glTexCoord2fNormal3fVertex3fSUN, %function +bluegl_glTexCoord2fNormal3fVertex3fSUN: + adrp x16, :got:__blue_glCore_glTexCoord2fNormal3fVertex3fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fNormal3fVertex3fSUN] ldr x16, [x16] br x16 - .size bluegl_glUniform1f, .-bluegl_glUniform1f + .size bluegl_glTexCoord2fNormal3fVertex3fSUN, .-bluegl_glTexCoord2fNormal3fVertex3fSUN .align 2 - .global bluegl_glMultiTexRenderbufferEXT - .type bluegl_glMultiTexRenderbufferEXT, %function -bluegl_glMultiTexRenderbufferEXT: - adrp x16, :got:__blue_glCore_glMultiTexRenderbufferEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexRenderbufferEXT] + .global bluegl_glTexCoord2fNormal3fVertex3fvSUN + .type bluegl_glTexCoord2fNormal3fVertex3fvSUN, %function +bluegl_glTexCoord2fNormal3fVertex3fvSUN: + adrp x16, :got:__blue_glCore_glTexCoord2fNormal3fVertex3fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fNormal3fVertex3fvSUN] ldr x16, [x16] br x16 - .size bluegl_glMultiTexRenderbufferEXT, .-bluegl_glMultiTexRenderbufferEXT + .size bluegl_glTexCoord2fNormal3fVertex3fvSUN, .-bluegl_glTexCoord2fNormal3fVertex3fvSUN .align 2 - .global bluegl_glVertexAttribI4uiEXT - .type bluegl_glVertexAttribI4uiEXT, %function -bluegl_glVertexAttribI4uiEXT: - adrp x16, :got:__blue_glCore_glVertexAttribI4uiEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribI4uiEXT] + .global bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN + .type bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN, %function +bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN: + adrp x16, :got:__blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribI4uiEXT, .-bluegl_glVertexAttribI4uiEXT + .size bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN, .-bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN .align 2 - .global bluegl_glGetConvolutionParameterfv - .type bluegl_glGetConvolutionParameterfv, %function -bluegl_glGetConvolutionParameterfv: - adrp x16, :got:__blue_glCore_glGetConvolutionParameterfv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetConvolutionParameterfv] + .global bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN + .type bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN, %function +bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN: + adrp x16, :got:__blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN] ldr x16, [x16] br x16 - .size bluegl_glGetConvolutionParameterfv, .-bluegl_glGetConvolutionParameterfv + .size bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN, .-bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN .align 2 - .global bluegl_glMultiTexCoord3sARB - .type bluegl_glMultiTexCoord3sARB, %function -bluegl_glMultiTexCoord3sARB: - adrp x16, :got:__blue_glCore_glMultiTexCoord3sARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord3sARB] + .global bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN + .type bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN, %function +bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN: + adrp x16, :got:__blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord3sARB, .-bluegl_glMultiTexCoord3sARB + .size bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN, .-bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN .align 2 - .global bluegl_glGetTexParameterxvOES - .type bluegl_glGetTexParameterxvOES, %function -bluegl_glGetTexParameterxvOES: - adrp x16, :got:__blue_glCore_glGetTexParameterxvOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetTexParameterxvOES] + .global bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN + .type bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN, %function +bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN: + adrp x16, :got:__blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN] ldr x16, [x16] br x16 - .size bluegl_glGetTexParameterxvOES, .-bluegl_glGetTexParameterxvOES + .size bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN, .-bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN .align 2 - .global bluegl_glGetNamedBufferParameteriv - .type bluegl_glGetNamedBufferParameteriv, %function -bluegl_glGetNamedBufferParameteriv: - adrp x16, :got:__blue_glCore_glGetNamedBufferParameteriv - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetNamedBufferParameteriv] + .global bluegl_glReplacementCodeuiVertex3fSUN + .type bluegl_glReplacementCodeuiVertex3fSUN, %function +bluegl_glReplacementCodeuiVertex3fSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeuiVertex3fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiVertex3fSUN] ldr x16, [x16] br x16 - .size bluegl_glGetNamedBufferParameteriv, .-bluegl_glGetNamedBufferParameteriv + .size bluegl_glReplacementCodeuiVertex3fSUN, .-bluegl_glReplacementCodeuiVertex3fSUN .align 2 - .global bluegl_glMultiDrawElementArrayAPPLE - .type bluegl_glMultiDrawElementArrayAPPLE, %function -bluegl_glMultiDrawElementArrayAPPLE: - adrp x16, :got:__blue_glCore_glMultiDrawElementArrayAPPLE - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiDrawElementArrayAPPLE] + .global bluegl_glReplacementCodeuiVertex3fvSUN + .type bluegl_glReplacementCodeuiVertex3fvSUN, %function +bluegl_glReplacementCodeuiVertex3fvSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeuiVertex3fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiVertex3fvSUN] ldr x16, [x16] br x16 - .size bluegl_glMultiDrawElementArrayAPPLE, .-bluegl_glMultiDrawElementArrayAPPLE + .size bluegl_glReplacementCodeuiVertex3fvSUN, .-bluegl_glReplacementCodeuiVertex3fvSUN .align 2 - .global bluegl_glGetnConvolutionFilter - .type bluegl_glGetnConvolutionFilter, %function -bluegl_glGetnConvolutionFilter: - adrp x16, :got:__blue_glCore_glGetnConvolutionFilter - ldr x16, [x16, #:got_lo12:__blue_glCore_glGetnConvolutionFilter] + .global bluegl_glReplacementCodeuiColor4ubVertex3fSUN + .type bluegl_glReplacementCodeuiColor4ubVertex3fSUN, %function +bluegl_glReplacementCodeuiColor4ubVertex3fSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN] ldr x16, [x16] br x16 - .size bluegl_glGetnConvolutionFilter, .-bluegl_glGetnConvolutionFilter + .size bluegl_glReplacementCodeuiColor4ubVertex3fSUN, .-bluegl_glReplacementCodeuiColor4ubVertex3fSUN .align 2 - .global bluegl_glUniformMatrix2x3fv - .type bluegl_glUniformMatrix2x3fv, %function -bluegl_glUniformMatrix2x3fv: - adrp x16, :got:__blue_glCore_glUniformMatrix2x3fv - ldr x16, [x16, #:got_lo12:__blue_glCore_glUniformMatrix2x3fv] + .global bluegl_glReplacementCodeuiColor4ubVertex3fvSUN + .type bluegl_glReplacementCodeuiColor4ubVertex3fvSUN, %function +bluegl_glReplacementCodeuiColor4ubVertex3fvSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN] ldr x16, [x16] br x16 - .size bluegl_glUniformMatrix2x3fv, .-bluegl_glUniformMatrix2x3fv + .size bluegl_glReplacementCodeuiColor4ubVertex3fvSUN, .-bluegl_glReplacementCodeuiColor4ubVertex3fvSUN .align 2 - .global bluegl_glBindBuffersRange - .type bluegl_glBindBuffersRange, %function -bluegl_glBindBuffersRange: - adrp x16, :got:__blue_glCore_glBindBuffersRange - ldr x16, [x16, #:got_lo12:__blue_glCore_glBindBuffersRange] + .global bluegl_glReplacementCodeuiColor3fVertex3fSUN + .type bluegl_glReplacementCodeuiColor3fVertex3fSUN, %function +bluegl_glReplacementCodeuiColor3fVertex3fSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeuiColor3fVertex3fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiColor3fVertex3fSUN] ldr x16, [x16] br x16 - .size bluegl_glBindBuffersRange, .-bluegl_glBindBuffersRange + .size bluegl_glReplacementCodeuiColor3fVertex3fSUN, .-bluegl_glReplacementCodeuiColor3fVertex3fSUN .align 2 - .global bluegl_glMakeImageHandleNonResidentNV - .type bluegl_glMakeImageHandleNonResidentNV, %function -bluegl_glMakeImageHandleNonResidentNV: - adrp x16, :got:__blue_glCore_glMakeImageHandleNonResidentNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glMakeImageHandleNonResidentNV] + .global bluegl_glReplacementCodeuiColor3fVertex3fvSUN + .type bluegl_glReplacementCodeuiColor3fVertex3fvSUN, %function +bluegl_glReplacementCodeuiColor3fVertex3fvSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN] ldr x16, [x16] br x16 - .size bluegl_glMakeImageHandleNonResidentNV, .-bluegl_glMakeImageHandleNonResidentNV + .size bluegl_glReplacementCodeuiColor3fVertex3fvSUN, .-bluegl_glReplacementCodeuiColor3fVertex3fvSUN .align 2 - .global bluegl_glFinalCombinerInputNV - .type bluegl_glFinalCombinerInputNV, %function -bluegl_glFinalCombinerInputNV: - adrp x16, :got:__blue_glCore_glFinalCombinerInputNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glFinalCombinerInputNV] + .global bluegl_glReplacementCodeuiNormal3fVertex3fSUN + .type bluegl_glReplacementCodeuiNormal3fVertex3fSUN, %function +bluegl_glReplacementCodeuiNormal3fVertex3fSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN] ldr x16, [x16] br x16 - .size bluegl_glFinalCombinerInputNV, .-bluegl_glFinalCombinerInputNV + .size bluegl_glReplacementCodeuiNormal3fVertex3fSUN, .-bluegl_glReplacementCodeuiNormal3fVertex3fSUN .align 2 - .global bluegl_glFlush - .type bluegl_glFlush, %function -bluegl_glFlush: - adrp x16, :got:__blue_glCore_glFlush - ldr x16, [x16, #:got_lo12:__blue_glCore_glFlush] + .global bluegl_glReplacementCodeuiNormal3fVertex3fvSUN + .type bluegl_glReplacementCodeuiNormal3fVertex3fvSUN, %function +bluegl_glReplacementCodeuiNormal3fVertex3fvSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN] ldr x16, [x16] br x16 - .size bluegl_glFlush, .-bluegl_glFlush + .size bluegl_glReplacementCodeuiNormal3fVertex3fvSUN, .-bluegl_glReplacementCodeuiNormal3fVertex3fvSUN .align 2 - .global bluegl_glVertexArrayElementBuffer - .type bluegl_glVertexArrayElementBuffer, %function -bluegl_glVertexArrayElementBuffer: - adrp x16, :got:__blue_glCore_glVertexArrayElementBuffer - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexArrayElementBuffer] + .global bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN + .type bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN, %function +bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN] ldr x16, [x16] br x16 - .size bluegl_glVertexArrayElementBuffer, .-bluegl_glVertexArrayElementBuffer + .size bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN, .-bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN .align 2 - .global bluegl_glProgramUniform4uiEXT - .type bluegl_glProgramUniform4uiEXT, %function -bluegl_glProgramUniform4uiEXT: - adrp x16, :got:__blue_glCore_glProgramUniform4uiEXT - ldr x16, [x16, #:got_lo12:__blue_glCore_glProgramUniform4uiEXT] + .global bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN + .type bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN, %function +bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN] ldr x16, [x16] br x16 - .size bluegl_glProgramUniform4uiEXT, .-bluegl_glProgramUniform4uiEXT + .size bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN, .-bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN .align 2 - .global bluegl_glVertexAttrib4ubvNV - .type bluegl_glVertexAttrib4ubvNV, %function -bluegl_glVertexAttrib4ubvNV: - adrp x16, :got:__blue_glCore_glVertexAttrib4ubvNV - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttrib4ubvNV] + .global bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN + .type bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN, %function +bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN] ldr x16, [x16] br x16 - .size bluegl_glVertexAttrib4ubvNV, .-bluegl_glVertexAttrib4ubvNV + .size bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN, .-bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN .align 2 - .global bluegl_glSampleMapATI - .type bluegl_glSampleMapATI, %function -bluegl_glSampleMapATI: - adrp x16, :got:__blue_glCore_glSampleMapATI - ldr x16, [x16, #:got_lo12:__blue_glCore_glSampleMapATI] + .global bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN + .type bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN, %function +bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN] ldr x16, [x16] br x16 - .size bluegl_glSampleMapATI, .-bluegl_glSampleMapATI + .size bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN, .-bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN .align 2 - .global bluegl_glMultiTexCoord1bOES - .type bluegl_glMultiTexCoord1bOES, %function -bluegl_glMultiTexCoord1bOES: - adrp x16, :got:__blue_glCore_glMultiTexCoord1bOES - ldr x16, [x16, #:got_lo12:__blue_glCore_glMultiTexCoord1bOES] + .global bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN + .type bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN, %function +bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN] ldr x16, [x16] br x16 - .size bluegl_glMultiTexCoord1bOES, .-bluegl_glMultiTexCoord1bOES + .size bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN, .-bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN .align 2 - .global bluegl_glVertexAttribParameteriAMD - .type bluegl_glVertexAttribParameteriAMD, %function -bluegl_glVertexAttribParameteriAMD: - adrp x16, :got:__blue_glCore_glVertexAttribParameteriAMD - ldr x16, [x16, #:got_lo12:__blue_glCore_glVertexAttribParameteriAMD] + .global bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN + .type bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN, %function +bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN] ldr x16, [x16] br x16 - .size bluegl_glVertexAttribParameteriAMD, .-bluegl_glVertexAttribParameteriAMD + .size bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN, .-bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN .align 2 - .global bluegl_glPointParameterfARB - .type bluegl_glPointParameterfARB, %function -bluegl_glPointParameterfARB: - adrp x16, :got:__blue_glCore_glPointParameterfARB - ldr x16, [x16, #:got_lo12:__blue_glCore_glPointParameterfARB] + .global bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN + .type bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN, %function +bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN] ldr x16, [x16] br x16 - .size bluegl_glPointParameterfARB, .-bluegl_glPointParameterfARB + .size bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN, .-bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN .align 2 - .global bluegl_glWindowPos2dMESA - .type bluegl_glWindowPos2dMESA, %function -bluegl_glWindowPos2dMESA: - adrp x16, :got:__blue_glCore_glWindowPos2dMESA - ldr x16, [x16, #:got_lo12:__blue_glCore_glWindowPos2dMESA] + .global bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN + .type bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN, %function +bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN: + adrp x16, :got:__blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN + ldr x16, [x16, #:got_lo12:__blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN] ldr x16, [x16] br x16 - .size bluegl_glWindowPos2dMESA, .-bluegl_glWindowPos2dMESA + .size bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN, .-bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN diff --git a/libs/bluegl/src/BlueGLCoreLinuxImpl.S b/libs/bluegl/src/BlueGLCoreLinuxImpl.S index 8c2ddd4c8d9..aa3081a78e8 100644 --- a/libs/bluegl/src/BlueGLCoreLinuxImpl.S +++ b/libs/bluegl/src/BlueGLCoreLinuxImpl.S @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,76 +13,81 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - /********************************************************************************************** * Generated by bluegl/bluegl-gen.py * DO NOT EDIT **********************************************************************************************/ -.global bluegl_glVertexAttrib4dARB -.type bluegl_glVertexAttrib4dARB, %function -bluegl_glVertexAttrib4dARB: - mov __blue_glCore_glVertexAttrib4dARB@GOTPCREL(%rip), %r11 +.global bluegl_glCullFace +.type bluegl_glCullFace, %function +bluegl_glCullFace: + mov __blue_glCore_glCullFace@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultMatrixxOES -.type bluegl_glMultMatrixxOES, %function -bluegl_glMultMatrixxOES: - mov __blue_glCore_glMultMatrixxOES@GOTPCREL(%rip), %r11 +.global bluegl_glFrontFace +.type bluegl_glFrontFace, %function +bluegl_glFrontFace: + mov __blue_glCore_glFrontFace@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramParameters4fvNV -.type bluegl_glProgramParameters4fvNV, %function -bluegl_glProgramParameters4fvNV: - mov __blue_glCore_glProgramParameters4fvNV@GOTPCREL(%rip), %r11 +.global bluegl_glHint +.type bluegl_glHint, %function +bluegl_glHint: + mov __blue_glCore_glHint@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenProgramPipelines -.type bluegl_glGenProgramPipelines, %function -bluegl_glGenProgramPipelines: - mov __blue_glCore_glGenProgramPipelines@GOTPCREL(%rip), %r11 +.global bluegl_glLineWidth +.type bluegl_glLineWidth, %function +bluegl_glLineWidth: + mov __blue_glCore_glLineWidth@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoordP3uiv -.type bluegl_glMultiTexCoordP3uiv, %function -bluegl_glMultiTexCoordP3uiv: - mov __blue_glCore_glMultiTexCoordP3uiv@GOTPCREL(%rip), %r11 +.global bluegl_glPointSize +.type bluegl_glPointSize, %function +bluegl_glPointSize: + mov __blue_glCore_glPointSize@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3usv -.type bluegl_glSecondaryColor3usv, %function -bluegl_glSecondaryColor3usv: - mov __blue_glCore_glSecondaryColor3usv@GOTPCREL(%rip), %r11 +.global bluegl_glPolygonMode +.type bluegl_glPolygonMode, %function +bluegl_glPolygonMode: + mov __blue_glCore_glPolygonMode@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetHistogramParameteriv -.type bluegl_glGetHistogramParameteriv, %function -bluegl_glGetHistogramParameteriv: - mov __blue_glCore_glGetHistogramParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glScissor +.type bluegl_glScissor, %function +bluegl_glScissor: + mov __blue_glCore_glScissor@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glRenderbufferStorageEXT -.type bluegl_glRenderbufferStorageEXT, %function -bluegl_glRenderbufferStorageEXT: - mov __blue_glCore_glRenderbufferStorageEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexParameterf +.type bluegl_glTexParameterf, %function +bluegl_glTexParameterf: + mov __blue_glCore_glTexParameterf@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPathParameterivNV -.type bluegl_glGetPathParameterivNV, %function -bluegl_glGetPathParameterivNV: - mov __blue_glCore_glGetPathParameterivNV@GOTPCREL(%rip), %r11 +.global bluegl_glTexParameterfv +.type bluegl_glTexParameterfv, %function +bluegl_glTexParameterfv: + mov __blue_glCore_glTexParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLineWidthxOES -.type bluegl_glLineWidthxOES, %function -bluegl_glLineWidthxOES: - mov __blue_glCore_glLineWidthxOES@GOTPCREL(%rip), %r11 +.global bluegl_glTexParameteri +.type bluegl_glTexParameteri, %function +bluegl_glTexParameteri: + mov __blue_glCore_glTexParameteri@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGlobalAlphaFactordSUN -.type bluegl_glGlobalAlphaFactordSUN, %function -bluegl_glGlobalAlphaFactordSUN: - mov __blue_glCore_glGlobalAlphaFactordSUN@GOTPCREL(%rip), %r11 +.global bluegl_glTexParameteriv +.type bluegl_glTexParameteriv, %function +bluegl_glTexParameteriv: + mov __blue_glCore_glTexParameteriv@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glTexImage1D +.type bluegl_glTexImage1D, %function +bluegl_glTexImage1D: + mov __blue_glCore_glTexImage1D@GOTPCREL(%rip), %r11 jmp *(%r11) .global bluegl_glTexImage2D @@ -91,3454 +96,3388 @@ bluegl_glTexImage2D: mov __blue_glCore_glTexImage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGlobalAlphaFactorfSUN -.type bluegl_glGlobalAlphaFactorfSUN, %function -bluegl_glGlobalAlphaFactorfSUN: - mov __blue_glCore_glGlobalAlphaFactorfSUN@GOTPCREL(%rip), %r11 +.global bluegl_glDrawBuffer +.type bluegl_glDrawBuffer, %function +bluegl_glDrawBuffer: + mov __blue_glCore_glDrawBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormalP3uiv -.type bluegl_glNormalP3uiv, %function -bluegl_glNormalP3uiv: - mov __blue_glCore_glNormalP3uiv@GOTPCREL(%rip), %r11 +.global bluegl_glClear +.type bluegl_glClear, %function +bluegl_glClear: + mov __blue_glCore_glClear@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColor4fNormal3fVertex3fSUN -.type bluegl_glColor4fNormal3fVertex3fSUN, %function -bluegl_glColor4fNormal3fVertex3fSUN: - mov __blue_glCore_glColor4fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glClearColor +.type bluegl_glClearColor, %function +bluegl_glClearColor: + mov __blue_glCore_glClearColor@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMapVertexAttrib1fAPPLE -.type bluegl_glMapVertexAttrib1fAPPLE, %function -bluegl_glMapVertexAttrib1fAPPLE: - mov __blue_glCore_glMapVertexAttrib1fAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glClearStencil +.type bluegl_glClearStencil, %function +bluegl_glClearStencil: + mov __blue_glCore_glClearStencil@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord2fNormal3fVertex3fvSUN -.type bluegl_glTexCoord2fNormal3fVertex3fvSUN, %function -bluegl_glTexCoord2fNormal3fVertex3fvSUN: - mov __blue_glCore_glTexCoord2fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glClearDepth +.type bluegl_glClearDepth, %function +bluegl_glClearDepth: + mov __blue_glCore_glClearDepth@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayVertexBuffers -.type bluegl_glVertexArrayVertexBuffers, %function -bluegl_glVertexArrayVertexBuffers: - mov __blue_glCore_glVertexArrayVertexBuffers@GOTPCREL(%rip), %r11 +.global bluegl_glStencilMask +.type bluegl_glStencilMask, %function +bluegl_glStencilMask: + mov __blue_glCore_glStencilMask@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glShaderSource -.type bluegl_glShaderSource, %function -bluegl_glShaderSource: - mov __blue_glCore_glShaderSource@GOTPCREL(%rip), %r11 +.global bluegl_glColorMask +.type bluegl_glColorMask, %function +bluegl_glColorMask: + mov __blue_glCore_glColorMask@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glConvolutionFilter1D -.type bluegl_glConvolutionFilter1D, %function -bluegl_glConvolutionFilter1D: - mov __blue_glCore_glConvolutionFilter1D@GOTPCREL(%rip), %r11 +.global bluegl_glDepthMask +.type bluegl_glDepthMask, %function +bluegl_glDepthMask: + mov __blue_glCore_glDepthMask@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsFenceAPPLE -.type bluegl_glIsFenceAPPLE, %function -bluegl_glIsFenceAPPLE: - mov __blue_glCore_glIsFenceAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glDisable +.type bluegl_glDisable, %function +bluegl_glDisable: + mov __blue_glCore_glDisable@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2s -.type bluegl_glWindowPos2s, %function -bluegl_glWindowPos2s: - mov __blue_glCore_glWindowPos2s@GOTPCREL(%rip), %r11 +.global bluegl_glEnable +.type bluegl_glEnable, %function +bluegl_glEnable: + mov __blue_glCore_glEnable@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEvaluateDepthValuesARB -.type bluegl_glEvaluateDepthValuesARB, %function -bluegl_glEvaluateDepthValuesARB: - mov __blue_glCore_glEvaluateDepthValuesARB@GOTPCREL(%rip), %r11 +.global bluegl_glFinish +.type bluegl_glFinish, %function +bluegl_glFinish: + mov __blue_glCore_glFinish@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glInterpolatePathsNV -.type bluegl_glInterpolatePathsNV, %function -bluegl_glInterpolatePathsNV: - mov __blue_glCore_glInterpolatePathsNV@GOTPCREL(%rip), %r11 +.global bluegl_glFlush +.type bluegl_glFlush, %function +bluegl_glFlush: + mov __blue_glCore_glFlush@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureParameterivEXT -.type bluegl_glTextureParameterivEXT, %function -bluegl_glTextureParameterivEXT: - mov __blue_glCore_glTextureParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBlendFunc +.type bluegl_glBlendFunc, %function +bluegl_glBlendFunc: + mov __blue_glCore_glBlendFunc@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteOcclusionQueriesNV -.type bluegl_glDeleteOcclusionQueriesNV, %function -bluegl_glDeleteOcclusionQueriesNV: - mov __blue_glCore_glDeleteOcclusionQueriesNV@GOTPCREL(%rip), %r11 +.global bluegl_glLogicOp +.type bluegl_glLogicOp, %function +bluegl_glLogicOp: + mov __blue_glCore_glLogicOp@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMakeTextureHandleResidentARB -.type bluegl_glMakeTextureHandleResidentARB, %function -bluegl_glMakeTextureHandleResidentARB: - mov __blue_glCore_glMakeTextureHandleResidentARB@GOTPCREL(%rip), %r11 +.global bluegl_glStencilFunc +.type bluegl_glStencilFunc, %function +bluegl_glStencilFunc: + mov __blue_glCore_glStencilFunc@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyImageSubDataNV -.type bluegl_glCopyImageSubDataNV, %function -bluegl_glCopyImageSubDataNV: - mov __blue_glCore_glCopyImageSubDataNV@GOTPCREL(%rip), %r11 +.global bluegl_glStencilOp +.type bluegl_glStencilOp, %function +bluegl_glStencilOp: + mov __blue_glCore_glStencilOp@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL3d -.type bluegl_glVertexAttribL3d, %function -bluegl_glVertexAttribL3d: - mov __blue_glCore_glVertexAttribL3d@GOTPCREL(%rip), %r11 +.global bluegl_glDepthFunc +.type bluegl_glDepthFunc, %function +bluegl_glDepthFunc: + mov __blue_glCore_glDepthFunc@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureSamplerHandleNV -.type bluegl_glGetTextureSamplerHandleNV, %function -bluegl_glGetTextureSamplerHandleNV: - mov __blue_glCore_glGetTextureSamplerHandleNV@GOTPCREL(%rip), %r11 +.global bluegl_glPixelStoref +.type bluegl_glPixelStoref, %function +bluegl_glPixelStoref: + mov __blue_glCore_glPixelStoref@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMakeTextureHandleResidentNV -.type bluegl_glMakeTextureHandleResidentNV, %function -bluegl_glMakeTextureHandleResidentNV: - mov __blue_glCore_glMakeTextureHandleResidentNV@GOTPCREL(%rip), %r11 +.global bluegl_glPixelStorei +.type bluegl_glPixelStorei, %function +bluegl_glPixelStorei: + mov __blue_glCore_glPixelStorei@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPolygonOffsetxOES -.type bluegl_glPolygonOffsetxOES, %function -bluegl_glPolygonOffsetxOES: - mov __blue_glCore_glPolygonOffsetxOES@GOTPCREL(%rip), %r11 +.global bluegl_glReadBuffer +.type bluegl_glReadBuffer, %function +bluegl_glReadBuffer: + mov __blue_glCore_glReadBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix2fv -.type bluegl_glUniformMatrix2fv, %function -bluegl_glUniformMatrix2fv: - mov __blue_glCore_glUniformMatrix2fv@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glMultiDrawElementsEXT -.type bluegl_glMultiDrawElementsEXT, %function -bluegl_glMultiDrawElementsEXT: - mov __blue_glCore_glMultiDrawElementsEXT@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glVertexAttribI1uiv -.type bluegl_glVertexAttribI1uiv, %function -bluegl_glVertexAttribI1uiv: - mov __blue_glCore_glVertexAttribI1uiv@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glPathCoordsNV -.type bluegl_glPathCoordsNV, %function -bluegl_glPathCoordsNV: - mov __blue_glCore_glPathCoordsNV@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glVertexArrayVertexBindingDivisorEXT -.type bluegl_glVertexArrayVertexBindingDivisorEXT, %function -bluegl_glVertexArrayVertexBindingDivisorEXT: - mov __blue_glCore_glVertexArrayVertexBindingDivisorEXT@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glVertexAttrib2dv -.type bluegl_glVertexAttrib2dv, %function -bluegl_glVertexAttrib2dv: - mov __blue_glCore_glVertexAttrib2dv@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glFinish -.type bluegl_glFinish, %function -bluegl_glFinish: - mov __blue_glCore_glFinish@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glVertexAttribs2dvNV -.type bluegl_glVertexAttribs2dvNV, %function -bluegl_glVertexAttribs2dvNV: - mov __blue_glCore_glVertexAttribs2dvNV@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glVertexAttribI1ivEXT -.type bluegl_glVertexAttribI1ivEXT, %function -bluegl_glVertexAttribI1ivEXT: - mov __blue_glCore_glVertexAttribI1ivEXT@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glVertexAttrib2sNV -.type bluegl_glVertexAttrib2sNV, %function -bluegl_glVertexAttrib2sNV: - mov __blue_glCore_glVertexAttrib2sNV@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glMultiTexCoord1iv -.type bluegl_glMultiTexCoord1iv, %function -bluegl_glMultiTexCoord1iv: - mov __blue_glCore_glMultiTexCoord1iv@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glGetnMapiv -.type bluegl_glGetnMapiv, %function -bluegl_glGetnMapiv: - mov __blue_glCore_glGetnMapiv@GOTPCREL(%rip), %r11 +.global bluegl_glReadPixels +.type bluegl_glReadPixels, %function +bluegl_glReadPixels: + mov __blue_glCore_glReadPixels@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTexSubImage1DARB -.type bluegl_glCompressedTexSubImage1DARB, %function -bluegl_glCompressedTexSubImage1DARB: - mov __blue_glCore_glCompressedTexSubImage1DARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetBooleanv +.type bluegl_glGetBooleanv, %function +bluegl_glGetBooleanv: + mov __blue_glCore_glGetBooleanv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFogCoordPointerEXT -.type bluegl_glFogCoordPointerEXT, %function -bluegl_glFogCoordPointerEXT: - mov __blue_glCore_glFogCoordPointerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetDoublev +.type bluegl_glGetDoublev, %function +bluegl_glGetDoublev: + mov __blue_glCore_glGetDoublev@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedMultiTexImage1DEXT -.type bluegl_glCompressedMultiTexImage1DEXT, %function -bluegl_glCompressedMultiTexImage1DEXT: - mov __blue_glCore_glCompressedMultiTexImage1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetError +.type bluegl_glGetError, %function +bluegl_glGetError: + mov __blue_glCore_glGetError@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3d -.type bluegl_glVertexAttrib3d, %function -bluegl_glVertexAttrib3d: - mov __blue_glCore_glVertexAttrib3d@GOTPCREL(%rip), %r11 +.global bluegl_glGetFloatv +.type bluegl_glGetFloatv, %function +bluegl_glGetFloatv: + mov __blue_glCore_glGetFloatv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLineWidth -.type bluegl_glLineWidth, %function -bluegl_glLineWidth: - mov __blue_glCore_glLineWidth@GOTPCREL(%rip), %r11 +.global bluegl_glGetIntegerv +.type bluegl_glGetIntegerv, %function +bluegl_glGetIntegerv: + mov __blue_glCore_glGetIntegerv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetShaderiv -.type bluegl_glGetShaderiv, %function -bluegl_glGetShaderiv: - mov __blue_glCore_glGetShaderiv@GOTPCREL(%rip), %r11 +.global bluegl_glGetString +.type bluegl_glGetString, %function +bluegl_glGetString: + mov __blue_glCore_glGetString@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1dv -.type bluegl_glProgramUniform1dv, %function -bluegl_glProgramUniform1dv: - mov __blue_glCore_glProgramUniform1dv@GOTPCREL(%rip), %r11 +.global bluegl_glGetTexImage +.type bluegl_glGetTexImage, %function +bluegl_glGetTexImage: + mov __blue_glCore_glGetTexImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribLui64vNV -.type bluegl_glGetVertexAttribLui64vNV, %function -bluegl_glGetVertexAttribLui64vNV: - mov __blue_glCore_glGetVertexAttribLui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetTexParameterfv +.type bluegl_glGetTexParameterfv, %function +bluegl_glGetTexParameterfv: + mov __blue_glCore_glGetTexParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1ui64vNV -.type bluegl_glProgramUniform1ui64vNV, %function -bluegl_glProgramUniform1ui64vNV: - mov __blue_glCore_glProgramUniform1ui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetTexParameteriv +.type bluegl_glGetTexParameteriv, %function +bluegl_glGetTexParameteriv: + mov __blue_glCore_glGetTexParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetRenderbufferParameteriv -.type bluegl_glGetRenderbufferParameteriv, %function -bluegl_glGetRenderbufferParameteriv: - mov __blue_glCore_glGetRenderbufferParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glGetTexLevelParameterfv +.type bluegl_glGetTexLevelParameterfv, %function +bluegl_glGetTexLevelParameterfv: + mov __blue_glCore_glGetTexLevelParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetOcclusionQueryivNV -.type bluegl_glGetOcclusionQueryivNV, %function -bluegl_glGetOcclusionQueryivNV: - mov __blue_glCore_glGetOcclusionQueryivNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetTexLevelParameteriv +.type bluegl_glGetTexLevelParameteriv, %function +bluegl_glGetTexLevelParameteriv: + mov __blue_glCore_glGetTexLevelParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix2x4dv -.type bluegl_glUniformMatrix2x4dv, %function -bluegl_glUniformMatrix2x4dv: - mov __blue_glCore_glUniformMatrix2x4dv@GOTPCREL(%rip), %r11 +.global bluegl_glIsEnabled +.type bluegl_glIsEnabled, %function +bluegl_glIsEnabled: + mov __blue_glCore_glIsEnabled@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribPointervNV -.type bluegl_glGetVertexAttribPointervNV, %function -bluegl_glGetVertexAttribPointervNV: - mov __blue_glCore_glGetVertexAttribPointervNV@GOTPCREL(%rip), %r11 +.global bluegl_glDepthRange +.type bluegl_glDepthRange, %function +bluegl_glDepthRange: + mov __blue_glCore_glDepthRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2fv -.type bluegl_glUniform2fv, %function -bluegl_glUniform2fv: - mov __blue_glCore_glUniform2fv@GOTPCREL(%rip), %r11 +.global bluegl_glViewport +.type bluegl_glViewport, %function +bluegl_glViewport: + mov __blue_glCore_glViewport@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glRasterPos2xOES -.type bluegl_glRasterPos2xOES, %function -bluegl_glRasterPos2xOES: - mov __blue_glCore_glRasterPos2xOES@GOTPCREL(%rip), %r11 +.global bluegl_glDrawArrays +.type bluegl_glDrawArrays, %function +bluegl_glDrawArrays: + mov __blue_glCore_glDrawArrays@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetCommandHeaderNV -.type bluegl_glGetCommandHeaderNV, %function -bluegl_glGetCommandHeaderNV: - mov __blue_glCore_glGetCommandHeaderNV@GOTPCREL(%rip), %r11 +.global bluegl_glDrawElements +.type bluegl_glDrawElements, %function +bluegl_glDrawElements: + mov __blue_glCore_glDrawElements@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformSubroutinesuiv -.type bluegl_glUniformSubroutinesuiv, %function -bluegl_glUniformSubroutinesuiv: - mov __blue_glCore_glUniformSubroutinesuiv@GOTPCREL(%rip), %r11 +.global bluegl_glGetPointerv +.type bluegl_glGetPointerv, %function +bluegl_glGetPointerv: + mov __blue_glCore_glGetPointerv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPixelTransformParameterivEXT -.type bluegl_glGetPixelTransformParameterivEXT, %function -bluegl_glGetPixelTransformParameterivEXT: - mov __blue_glCore_glGetPixelTransformParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPolygonOffset +.type bluegl_glPolygonOffset, %function +bluegl_glPolygonOffset: + mov __blue_glCore_glPolygonOffset@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFragDataLocation -.type bluegl_glGetFragDataLocation, %function -bluegl_glGetFragDataLocation: - mov __blue_glCore_glGetFragDataLocation@GOTPCREL(%rip), %r11 +.global bluegl_glCopyTexImage1D +.type bluegl_glCopyTexImage1D, %function +bluegl_glCopyTexImage1D: + mov __blue_glCore_glCopyTexImage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord2fColor3fVertex3fSUN -.type bluegl_glTexCoord2fColor3fVertex3fSUN, %function -bluegl_glTexCoord2fColor3fVertex3fSUN: - mov __blue_glCore_glTexCoord2fColor3fVertex3fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glCopyTexImage2D +.type bluegl_glCopyTexImage2D, %function +bluegl_glCopyTexImage2D: + mov __blue_glCore_glCopyTexImage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3uiv -.type bluegl_glSecondaryColor3uiv, %function -bluegl_glSecondaryColor3uiv: - mov __blue_glCore_glSecondaryColor3uiv@GOTPCREL(%rip), %r11 +.global bluegl_glCopyTexSubImage1D +.type bluegl_glCopyTexSubImage1D, %function +bluegl_glCopyTexSubImage1D: + mov __blue_glCore_glCopyTexSubImage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEnableVertexArrayAttribEXT -.type bluegl_glEnableVertexArrayAttribEXT, %function -bluegl_glEnableVertexArrayAttribEXT: - mov __blue_glCore_glEnableVertexArrayAttribEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCopyTexSubImage2D +.type bluegl_glCopyTexSubImage2D, %function +bluegl_glCopyTexSubImage2D: + mov __blue_glCore_glCopyTexSubImage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPixelTexGenParameterfvSGIS -.type bluegl_glPixelTexGenParameterfvSGIS, %function -bluegl_glPixelTexGenParameterfvSGIS: - mov __blue_glCore_glPixelTexGenParameterfvSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glTexSubImage1D +.type bluegl_glTexSubImage1D, %function +bluegl_glTexSubImage1D: + mov __blue_glCore_glTexSubImage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix3x4dvEXT -.type bluegl_glProgramUniformMatrix3x4dvEXT, %function -bluegl_glProgramUniformMatrix3x4dvEXT: - mov __blue_glCore_glProgramUniformMatrix3x4dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexSubImage2D +.type bluegl_glTexSubImage2D, %function +bluegl_glTexSubImage2D: + mov __blue_glCore_glTexSubImage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2fvARB -.type bluegl_glMultiTexCoord2fvARB, %function -bluegl_glMultiTexCoord2fvARB: - mov __blue_glCore_glMultiTexCoord2fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glBindTexture +.type bluegl_glBindTexture, %function +bluegl_glBindTexture: + mov __blue_glCore_glBindTexture@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glHistogram -.type bluegl_glHistogram, %function -bluegl_glHistogram: - mov __blue_glCore_glHistogram@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteTextures +.type bluegl_glDeleteTextures, %function +bluegl_glDeleteTextures: + mov __blue_glCore_glDeleteTextures@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetSynciv -.type bluegl_glGetSynciv, %function -bluegl_glGetSynciv: - mov __blue_glCore_glGetSynciv@GOTPCREL(%rip), %r11 +.global bluegl_glGenTextures +.type bluegl_glGenTextures, %function +bluegl_glGenTextures: + mov __blue_glCore_glGenTextures@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBitmapxOES -.type bluegl_glBitmapxOES, %function -bluegl_glBitmapxOES: - mov __blue_glCore_glBitmapxOES@GOTPCREL(%rip), %r11 +.global bluegl_glIsTexture +.type bluegl_glIsTexture, %function +bluegl_glIsTexture: + mov __blue_glCore_glIsTexture@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnColorTable -.type bluegl_glGetnColorTable, %function -bluegl_glGetnColorTable: - mov __blue_glCore_glGetnColorTable@GOTPCREL(%rip), %r11 +.global bluegl_glDrawRangeElements +.type bluegl_glDrawRangeElements, %function +bluegl_glDrawRangeElements: + mov __blue_glCore_glDrawRangeElements@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenerateMultiTexMipmapEXT -.type bluegl_glGenerateMultiTexMipmapEXT, %function -bluegl_glGenerateMultiTexMipmapEXT: - mov __blue_glCore_glGenerateMultiTexMipmapEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexImage3D +.type bluegl_glTexImage3D, %function +bluegl_glTexImage3D: + mov __blue_glCore_glTexImage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream4fvATI -.type bluegl_glVertexStream4fvATI, %function -bluegl_glVertexStream4fvATI: - mov __blue_glCore_glVertexStream4fvATI@GOTPCREL(%rip), %r11 +.global bluegl_glTexSubImage3D +.type bluegl_glTexSubImage3D, %function +bluegl_glTexSubImage3D: + mov __blue_glCore_glTexSubImage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColorPointerEXT -.type bluegl_glSecondaryColorPointerEXT, %function -bluegl_glSecondaryColorPointerEXT: - mov __blue_glCore_glSecondaryColorPointerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCopyTexSubImage3D +.type bluegl_glCopyTexSubImage3D, %function +bluegl_glCopyTexSubImage3D: + mov __blue_glCore_glCopyTexSubImage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribIPointerEXT -.type bluegl_glVertexAttribIPointerEXT, %function -bluegl_glVertexAttribIPointerEXT: - mov __blue_glCore_glVertexAttribIPointerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glActiveTexture +.type bluegl_glActiveTexture, %function +bluegl_glActiveTexture: + mov __blue_glCore_glActiveTexture@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEvalCoord2xvOES -.type bluegl_glEvalCoord2xvOES, %function -bluegl_glEvalCoord2xvOES: - mov __blue_glCore_glEvalCoord2xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glSampleCoverage +.type bluegl_glSampleCoverage, %function +bluegl_glSampleCoverage: + mov __blue_glCore_glSampleCoverage@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteFencesNV -.type bluegl_glDeleteFencesNV, %function -bluegl_glDeleteFencesNV: - mov __blue_glCore_glDeleteFencesNV@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTexImage3D +.type bluegl_glCompressedTexImage3D, %function +bluegl_glCompressedTexImage3D: + mov __blue_glCore_glCompressedTexImage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glAlphaFragmentOp1ATI -.type bluegl_glAlphaFragmentOp1ATI, %function -bluegl_glAlphaFragmentOp1ATI: - mov __blue_glCore_glAlphaFragmentOp1ATI@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTexImage2D +.type bluegl_glCompressedTexImage2D, %function +bluegl_glCompressedTexImage2D: + mov __blue_glCore_glCompressedTexImage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetActiveUniformName -.type bluegl_glGetActiveUniformName, %function -bluegl_glGetActiveUniformName: - mov __blue_glCore_glGetActiveUniformName@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTexImage1D +.type bluegl_glCompressedTexImage1D, %function +bluegl_glCompressedTexImage1D: + mov __blue_glCore_glCompressedTexImage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetCompressedTextureSubImage -.type bluegl_glGetCompressedTextureSubImage, %function -bluegl_glGetCompressedTextureSubImage: - mov __blue_glCore_glGetCompressedTextureSubImage@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTexSubImage3D +.type bluegl_glCompressedTexSubImage3D, %function +bluegl_glCompressedTexSubImage3D: + mov __blue_glCore_glCompressedTexSubImage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureParameterfvEXT -.type bluegl_glGetTextureParameterfvEXT, %function -bluegl_glGetTextureParameterfvEXT: - mov __blue_glCore_glGetTextureParameterfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTexSubImage2D +.type bluegl_glCompressedTexSubImage2D, %function +bluegl_glCompressedTexSubImage2D: + mov __blue_glCore_glCompressedTexSubImage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteShader -.type bluegl_glDeleteShader, %function -bluegl_glDeleteShader: - mov __blue_glCore_glDeleteShader@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTexSubImage1D +.type bluegl_glCompressedTexSubImage1D, %function +bluegl_glCompressedTexSubImage1D: + mov __blue_glCore_glCompressedTexSubImage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glRenderbufferStorageMultisample -.type bluegl_glRenderbufferStorageMultisample, %function -bluegl_glRenderbufferStorageMultisample: - mov __blue_glCore_glRenderbufferStorageMultisample@GOTPCREL(%rip), %r11 +.global bluegl_glGetCompressedTexImage +.type bluegl_glGetCompressedTexImage, %function +bluegl_glGetCompressedTexImage: + mov __blue_glCore_glGetCompressedTexImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord2fVertex3fSUN -.type bluegl_glTexCoord2fVertex3fSUN, %function -bluegl_glTexCoord2fVertex3fSUN: - mov __blue_glCore_glTexCoord2fVertex3fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glBlendFuncSeparate +.type bluegl_glBlendFuncSeparate, %function +bluegl_glBlendFuncSeparate: + mov __blue_glCore_glBlendFuncSeparate@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetActiveSubroutineUniformName -.type bluegl_glGetActiveSubroutineUniformName, %function -bluegl_glGetActiveSubroutineUniformName: - mov __blue_glCore_glGetActiveSubroutineUniformName@GOTPCREL(%rip), %r11 +.global bluegl_glMultiDrawArrays +.type bluegl_glMultiDrawArrays, %function +bluegl_glMultiDrawArrays: + mov __blue_glCore_glMultiDrawArrays@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVideoCaptureStreamfvNV -.type bluegl_glGetVideoCaptureStreamfvNV, %function -bluegl_glGetVideoCaptureStreamfvNV: - mov __blue_glCore_glGetVideoCaptureStreamfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiDrawElements +.type bluegl_glMultiDrawElements, %function +bluegl_glMultiDrawElements: + mov __blue_glCore_glMultiDrawElements@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glInvalidateSubFramebuffer -.type bluegl_glInvalidateSubFramebuffer, %function -bluegl_glInvalidateSubFramebuffer: - mov __blue_glCore_glInvalidateSubFramebuffer@GOTPCREL(%rip), %r11 +.global bluegl_glPointParameterf +.type bluegl_glPointParameterf, %function +bluegl_glPointParameterf: + mov __blue_glCore_glPointParameterf@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIndexFormatNV -.type bluegl_glIndexFormatNV, %function -bluegl_glIndexFormatNV: - mov __blue_glCore_glIndexFormatNV@GOTPCREL(%rip), %r11 +.global bluegl_glPointParameterfv +.type bluegl_glPointParameterfv, %function +bluegl_glPointParameterfv: + mov __blue_glCore_glPointParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexEnvfvEXT -.type bluegl_glMultiTexEnvfvEXT, %function -bluegl_glMultiTexEnvfvEXT: - mov __blue_glCore_glMultiTexEnvfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPointParameteri +.type bluegl_glPointParameteri, %function +bluegl_glPointParameteri: + mov __blue_glCore_glPointParameteri@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformBufferEXT -.type bluegl_glUniformBufferEXT, %function -bluegl_glUniformBufferEXT: - mov __blue_glCore_glUniformBufferEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPointParameteriv +.type bluegl_glPointParameteriv, %function +bluegl_glPointParameteriv: + mov __blue_glCore_glPointParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedProgramLocalParametersI4uivEXT -.type bluegl_glNamedProgramLocalParametersI4uivEXT, %function -bluegl_glNamedProgramLocalParametersI4uivEXT: - mov __blue_glCore_glNamedProgramLocalParametersI4uivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBlendColor +.type bluegl_glBlendColor, %function +bluegl_glBlendColor: + mov __blue_glCore_glBlendColor@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWeightPathsNV -.type bluegl_glWeightPathsNV, %function -bluegl_glWeightPathsNV: - mov __blue_glCore_glWeightPathsNV@GOTPCREL(%rip), %r11 +.global bluegl_glBlendEquation +.type bluegl_glBlendEquation, %function +bluegl_glBlendEquation: + mov __blue_glCore_glBlendEquation@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnHistogram -.type bluegl_glGetnHistogram, %function -bluegl_glGetnHistogram: - mov __blue_glCore_glGetnHistogram@GOTPCREL(%rip), %r11 +.global bluegl_glGenQueries +.type bluegl_glGenQueries, %function +bluegl_glGenQueries: + mov __blue_glCore_glGenQueries@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord1bOES -.type bluegl_glTexCoord1bOES, %function -bluegl_glTexCoord1bOES: - mov __blue_glCore_glTexCoord1bOES@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteQueries +.type bluegl_glDeleteQueries, %function +bluegl_glDeleteQueries: + mov __blue_glCore_glDeleteQueries@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSetFragmentShaderConstantATI -.type bluegl_glSetFragmentShaderConstantATI, %function -bluegl_glSetFragmentShaderConstantATI: - mov __blue_glCore_glSetFragmentShaderConstantATI@GOTPCREL(%rip), %r11 +.global bluegl_glIsQuery +.type bluegl_glIsQuery, %function +bluegl_glIsQuery: + mov __blue_glCore_glIsQuery@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glRasterPos3xvOES -.type bluegl_glRasterPos3xvOES, %function -bluegl_glRasterPos3xvOES: - mov __blue_glCore_glRasterPos3xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glBeginQuery +.type bluegl_glBeginQuery, %function +bluegl_glBeginQuery: + mov __blue_glCore_glBeginQuery@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyConvolutionFilter1DEXT -.type bluegl_glCopyConvolutionFilter1DEXT, %function -bluegl_glCopyConvolutionFilter1DEXT: - mov __blue_glCore_glCopyConvolutionFilter1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glEndQuery +.type bluegl_glEndQuery, %function +bluegl_glEndQuery: + mov __blue_glCore_glEndQuery@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glArrayElementEXT -.type bluegl_glArrayElementEXT, %function -bluegl_glArrayElementEXT: - mov __blue_glCore_glArrayElementEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetQueryiv +.type bluegl_glGetQueryiv, %function +bluegl_glGetQueryiv: + mov __blue_glCore_glGetQueryiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyTextureImage2DEXT -.type bluegl_glCopyTextureImage2DEXT, %function -bluegl_glCopyTextureImage2DEXT: - mov __blue_glCore_glCopyTextureImage2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetQueryObjectiv +.type bluegl_glGetQueryObjectiv, %function +bluegl_glGetQueryObjectiv: + mov __blue_glCore_glGetQueryObjectiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedProgramLocalParameterI4uivEXT -.type bluegl_glNamedProgramLocalParameterI4uivEXT, %function -bluegl_glNamedProgramLocalParameterI4uivEXT: - mov __blue_glCore_glNamedProgramLocalParameterI4uivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetQueryObjectuiv +.type bluegl_glGetQueryObjectuiv, %function +bluegl_glGetQueryObjectuiv: + mov __blue_glCore_glGetQueryObjectuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiDrawElementsIndirectBindlessNV -.type bluegl_glMultiDrawElementsIndirectBindlessNV, %function -bluegl_glMultiDrawElementsIndirectBindlessNV: - mov __blue_glCore_glMultiDrawElementsIndirectBindlessNV@GOTPCREL(%rip), %r11 +.global bluegl_glBindBuffer +.type bluegl_glBindBuffer, %function +bluegl_glBindBuffer: + mov __blue_glCore_glBindBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearColorIuiEXT -.type bluegl_glClearColorIuiEXT, %function -bluegl_glClearColorIuiEXT: - mov __blue_glCore_glClearColorIuiEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteBuffers +.type bluegl_glDeleteBuffers, %function +bluegl_glDeleteBuffers: + mov __blue_glCore_glDeleteBuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexParameterfEXT -.type bluegl_glMultiTexParameterfEXT, %function -bluegl_glMultiTexParameterfEXT: - mov __blue_glCore_glMultiTexParameterfEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGenBuffers +.type bluegl_glGenBuffers, %function +bluegl_glGenBuffers: + mov __blue_glCore_glGenBuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayVertexAttribIFormatEXT -.type bluegl_glVertexArrayVertexAttribIFormatEXT, %function -bluegl_glVertexArrayVertexAttribIFormatEXT: - mov __blue_glCore_glVertexArrayVertexAttribIFormatEXT@GOTPCREL(%rip), %r11 +.global bluegl_glIsBuffer +.type bluegl_glIsBuffer, %function +bluegl_glIsBuffer: + mov __blue_glCore_glIsBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1sv -.type bluegl_glVertexAttrib1sv, %function -bluegl_glVertexAttrib1sv: - mov __blue_glCore_glVertexAttrib1sv@GOTPCREL(%rip), %r11 +.global bluegl_glBufferData +.type bluegl_glBufferData, %function +bluegl_glBufferData: + mov __blue_glCore_glBufferData@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream2dvATI -.type bluegl_glVertexStream2dvATI, %function -bluegl_glVertexStream2dvATI: - mov __blue_glCore_glVertexStream2dvATI@GOTPCREL(%rip), %r11 +.global bluegl_glBufferSubData +.type bluegl_glBufferSubData, %function +bluegl_glBufferSubData: + mov __blue_glCore_glBufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4iARB -.type bluegl_glUniform4iARB, %function -bluegl_glUniform4iARB: - mov __blue_glCore_glUniform4iARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetBufferSubData +.type bluegl_glGetBufferSubData, %function +bluegl_glGetBufferSubData: + mov __blue_glCore_glGetBufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribs4svNV -.type bluegl_glVertexAttribs4svNV, %function -bluegl_glVertexAttribs4svNV: - mov __blue_glCore_glVertexAttribs4svNV@GOTPCREL(%rip), %r11 +.global bluegl_glMapBuffer +.type bluegl_glMapBuffer, %function +bluegl_glMapBuffer: + mov __blue_glCore_glMapBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix3x2dvEXT -.type bluegl_glProgramUniformMatrix3x2dvEXT, %function -bluegl_glProgramUniformMatrix3x2dvEXT: - mov __blue_glCore_glProgramUniformMatrix3x2dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUnmapBuffer +.type bluegl_glUnmapBuffer, %function +bluegl_glUnmapBuffer: + mov __blue_glCore_glUnmapBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1ui -.type bluegl_glProgramUniform1ui, %function -bluegl_glProgramUniform1ui: - mov __blue_glCore_glProgramUniform1ui@GOTPCREL(%rip), %r11 +.global bluegl_glGetBufferParameteriv +.type bluegl_glGetBufferParameteriv, %function +bluegl_glGetBufferParameteriv: + mov __blue_glCore_glGetBufferParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribIFormatNV -.type bluegl_glVertexAttribIFormatNV, %function -bluegl_glVertexAttribIFormatNV: - mov __blue_glCore_glVertexAttribIFormatNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetBufferPointerv +.type bluegl_glGetBufferPointerv, %function +bluegl_glGetBufferPointerv: + mov __blue_glCore_glGetBufferPointerv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFragmentLightModelfSGIX -.type bluegl_glFragmentLightModelfSGIX, %function -bluegl_glFragmentLightModelfSGIX: - mov __blue_glCore_glFragmentLightModelfSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glBlendEquationSeparate +.type bluegl_glBlendEquationSeparate, %function +bluegl_glBlendEquationSeparate: + mov __blue_glCore_glBlendEquationSeparate@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetActiveSubroutineName -.type bluegl_glGetActiveSubroutineName, %function -bluegl_glGetActiveSubroutineName: - mov __blue_glCore_glGetActiveSubroutineName@GOTPCREL(%rip), %r11 +.global bluegl_glDrawBuffers +.type bluegl_glDrawBuffers, %function +bluegl_glDrawBuffers: + mov __blue_glCore_glDrawBuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glConvolutionParameteri -.type bluegl_glConvolutionParameteri, %function -bluegl_glConvolutionParameteri: - mov __blue_glCore_glConvolutionParameteri@GOTPCREL(%rip), %r11 +.global bluegl_glStencilOpSeparate +.type bluegl_glStencilOpSeparate, %function +bluegl_glStencilOpSeparate: + mov __blue_glCore_glStencilOpSeparate@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4f -.type bluegl_glMultiTexCoord4f, %function -bluegl_glMultiTexCoord4f: - mov __blue_glCore_glMultiTexCoord4f@GOTPCREL(%rip), %r11 +.global bluegl_glStencilFuncSeparate +.type bluegl_glStencilFuncSeparate, %function +bluegl_glStencilFuncSeparate: + mov __blue_glCore_glStencilFuncSeparate@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord1xvOES -.type bluegl_glTexCoord1xvOES, %function -bluegl_glTexCoord1xvOES: - mov __blue_glCore_glTexCoord1xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glStencilMaskSeparate +.type bluegl_glStencilMaskSeparate, %function +bluegl_glStencilMaskSeparate: + mov __blue_glCore_glStencilMaskSeparate@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsTransformFeedback -.type bluegl_glIsTransformFeedback, %function -bluegl_glIsTransformFeedback: - mov __blue_glCore_glIsTransformFeedback@GOTPCREL(%rip), %r11 +.global bluegl_glAttachShader +.type bluegl_glAttachShader, %function +bluegl_glAttachShader: + mov __blue_glCore_glAttachShader@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendBarrierKHR -.type bluegl_glBlendBarrierKHR, %function -bluegl_glBlendBarrierKHR: - mov __blue_glCore_glBlendBarrierKHR@GOTPCREL(%rip), %r11 +.global bluegl_glBindAttribLocation +.type bluegl_glBindAttribLocation, %function +bluegl_glBindAttribLocation: + mov __blue_glCore_glBindAttribLocation@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindBufferRangeEXT -.type bluegl_glBindBufferRangeEXT, %function -bluegl_glBindBufferRangeEXT: - mov __blue_glCore_glBindBufferRangeEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCompileShader +.type bluegl_glCompileShader, %function +bluegl_glCompileShader: + mov __blue_glCore_glCompileShader@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathColorGenNV -.type bluegl_glPathColorGenNV, %function -bluegl_glPathColorGenNV: - mov __blue_glCore_glPathColorGenNV@GOTPCREL(%rip), %r11 +.global bluegl_glCreateProgram +.type bluegl_glCreateProgram, %function +bluegl_glCreateProgram: + mov __blue_glCore_glCreateProgram@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEndQuery -.type bluegl_glEndQuery, %function -bluegl_glEndQuery: - mov __blue_glCore_glEndQuery@GOTPCREL(%rip), %r11 +.global bluegl_glCreateShader +.type bluegl_glCreateShader, %function +bluegl_glCreateShader: + mov __blue_glCore_glCreateShader@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix2x4fv -.type bluegl_glUniformMatrix2x4fv, %function -bluegl_glUniformMatrix2x4fv: - mov __blue_glCore_glUniformMatrix2x4fv@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteProgram +.type bluegl_glDeleteProgram, %function +bluegl_glDeleteProgram: + mov __blue_glCore_glDeleteProgram@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenRenderbuffers -.type bluegl_glGenRenderbuffers, %function -bluegl_glGenRenderbuffers: - mov __blue_glCore_glGenRenderbuffers@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteShader +.type bluegl_glDeleteShader, %function +bluegl_glDeleteShader: + mov __blue_glCore_glDeleteShader@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glShaderOp2EXT -.type bluegl_glShaderOp2EXT, %function -bluegl_glShaderOp2EXT: - mov __blue_glCore_glShaderOp2EXT@GOTPCREL(%rip), %r11 +.global bluegl_glDetachShader +.type bluegl_glDetachShader, %function +bluegl_glDetachShader: + mov __blue_glCore_glDetachShader@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawTransformFeedback -.type bluegl_glDrawTransformFeedback, %function -bluegl_glDrawTransformFeedback: - mov __blue_glCore_glDrawTransformFeedback@GOTPCREL(%rip), %r11 +.global bluegl_glDisableVertexAttribArray +.type bluegl_glDisableVertexAttribArray, %function +bluegl_glDisableVertexAttribArray: + mov __blue_glCore_glDisableVertexAttribArray@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3ui64vNV -.type bluegl_glProgramUniform3ui64vNV, %function -bluegl_glProgramUniform3ui64vNV: - mov __blue_glCore_glProgramUniform3ui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glEnableVertexAttribArray +.type bluegl_glEnableVertexAttribArray, %function +bluegl_glEnableVertexAttribArray: + mov __blue_glCore_glEnableVertexAttribArray@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedBufferStorage -.type bluegl_glNamedBufferStorage, %function -bluegl_glNamedBufferStorage: - mov __blue_glCore_glNamedBufferStorage@GOTPCREL(%rip), %r11 +.global bluegl_glGetActiveAttrib +.type bluegl_glGetActiveAttrib, %function +bluegl_glGetActiveAttrib: + mov __blue_glCore_glGetActiveAttrib@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glOrthoxOES -.type bluegl_glOrthoxOES, %function -bluegl_glOrthoxOES: - mov __blue_glCore_glOrthoxOES@GOTPCREL(%rip), %r11 +.global bluegl_glGetActiveUniform +.type bluegl_glGetActiveUniform, %function +bluegl_glGetActiveUniform: + mov __blue_glCore_glGetActiveUniform@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4ubvARB -.type bluegl_glVertexAttrib4ubvARB, %function -bluegl_glVertexAttrib4ubvARB: - mov __blue_glCore_glVertexAttrib4ubvARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetAttachedShaders +.type bluegl_glGetAttachedShaders, %function +bluegl_glGetAttachedShaders: + mov __blue_glCore_glGetAttachedShaders@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStencilOp -.type bluegl_glStencilOp, %function -bluegl_glStencilOp: - mov __blue_glCore_glStencilOp@GOTPCREL(%rip), %r11 +.global bluegl_glGetAttribLocation +.type bluegl_glGetAttribLocation, %function +bluegl_glGetAttribLocation: + mov __blue_glCore_glGetAttribLocation@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramLocalParametersI4ivNV -.type bluegl_glProgramLocalParametersI4ivNV, %function -bluegl_glProgramLocalParametersI4ivNV: - mov __blue_glCore_glProgramLocalParametersI4ivNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramiv +.type bluegl_glGetProgramiv, %function +bluegl_glGetProgramiv: + mov __blue_glCore_glGetProgramiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream2iATI -.type bluegl_glVertexStream2iATI, %function -bluegl_glVertexStream2iATI: - mov __blue_glCore_glVertexStream2iATI@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramInfoLog +.type bluegl_glGetProgramInfoLog, %function +bluegl_glGetProgramInfoLog: + mov __blue_glCore_glGetProgramInfoLog@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWeightdvARB -.type bluegl_glWeightdvARB, %function -bluegl_glWeightdvARB: - mov __blue_glCore_glWeightdvARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetShaderiv +.type bluegl_glGetShaderiv, %function +bluegl_glGetShaderiv: + mov __blue_glCore_glGetShaderiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1fARB -.type bluegl_glVertexAttrib1fARB, %function -bluegl_glVertexAttrib1fARB: - mov __blue_glCore_glVertexAttrib1fARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetShaderInfoLog +.type bluegl_glGetShaderInfoLog, %function +bluegl_glGetShaderInfoLog: + mov __blue_glCore_glGetShaderInfoLog@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorFragmentOp2ATI -.type bluegl_glColorFragmentOp2ATI, %function -bluegl_glColorFragmentOp2ATI: - mov __blue_glCore_glColorFragmentOp2ATI@GOTPCREL(%rip), %r11 +.global bluegl_glGetShaderSource +.type bluegl_glGetShaderSource, %function +bluegl_glGetShaderSource: + mov __blue_glCore_glGetShaderSource@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetBufferPointervARB -.type bluegl_glGetBufferPointervARB, %function -bluegl_glGetBufferPointervARB: - mov __blue_glCore_glGetBufferPointervARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetUniformLocation +.type bluegl_glGetUniformLocation, %function +bluegl_glGetUniformLocation: + mov __blue_glCore_glGetUniformLocation@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedFramebufferTexture1DEXT -.type bluegl_glNamedFramebufferTexture1DEXT, %function -bluegl_glNamedFramebufferTexture1DEXT: - mov __blue_glCore_glNamedFramebufferTexture1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetUniformfv +.type bluegl_glGetUniformfv, %function +bluegl_glGetUniformfv: + mov __blue_glCore_glGetUniformfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib2fNV -.type bluegl_glVertexAttrib2fNV, %function -bluegl_glVertexAttrib2fNV: - mov __blue_glCore_glVertexAttrib2fNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetUniformiv +.type bluegl_glGetUniformiv, %function +bluegl_glGetUniformiv: + mov __blue_glCore_glGetUniformiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDisableVertexAttribArray -.type bluegl_glDisableVertexAttribArray, %function -bluegl_glDisableVertexAttribArray: - mov __blue_glCore_glDisableVertexAttribArray@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribdv +.type bluegl_glGetVertexAttribdv, %function +bluegl_glGetVertexAttribdv: + mov __blue_glCore_glGetVertexAttribdv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureParameterf -.type bluegl_glTextureParameterf, %function -bluegl_glTextureParameterf: - mov __blue_glCore_glTextureParameterf@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribfv +.type bluegl_glGetVertexAttribfv, %function +bluegl_glGetVertexAttribfv: + mov __blue_glCore_glGetVertexAttribfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN -.type bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN, %function -bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN: - mov __blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribiv +.type bluegl_glGetVertexAttribiv, %function +bluegl_glGetVertexAttribiv: + mov __blue_glCore_glGetVertexAttribiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormal3fVertex3fSUN -.type bluegl_glNormal3fVertex3fSUN, %function -bluegl_glNormal3fVertex3fSUN: - mov __blue_glCore_glNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribPointerv +.type bluegl_glGetVertexAttribPointerv, %function +bluegl_glGetVertexAttribPointerv: + mov __blue_glCore_glGetVertexAttribPointerv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTexBumpParameterfvATI -.type bluegl_glGetTexBumpParameterfvATI, %function -bluegl_glGetTexBumpParameterfvATI: - mov __blue_glCore_glGetTexBumpParameterfvATI@GOTPCREL(%rip), %r11 +.global bluegl_glIsProgram +.type bluegl_glIsProgram, %function +bluegl_glIsProgram: + mov __blue_glCore_glIsProgram@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3fARB -.type bluegl_glMultiTexCoord3fARB, %function -bluegl_glMultiTexCoord3fARB: - mov __blue_glCore_glMultiTexCoord3fARB@GOTPCREL(%rip), %r11 +.global bluegl_glIsShader +.type bluegl_glIsShader, %function +bluegl_glIsShader: + mov __blue_glCore_glIsShader@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureParameterfv -.type bluegl_glTextureParameterfv, %function -bluegl_glTextureParameterfv: - mov __blue_glCore_glTextureParameterfv@GOTPCREL(%rip), %r11 +.global bluegl_glLinkProgram +.type bluegl_glLinkProgram, %function +bluegl_glLinkProgram: + mov __blue_glCore_glLinkProgram@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexBumpParameterivATI -.type bluegl_glTexBumpParameterivATI, %function -bluegl_glTexBumpParameterivATI: - mov __blue_glCore_glTexBumpParameterivATI@GOTPCREL(%rip), %r11 +.global bluegl_glShaderSource +.type bluegl_glShaderSource, %function +bluegl_glShaderSource: + mov __blue_glCore_glShaderSource@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLockArraysEXT -.type bluegl_glLockArraysEXT, %function -bluegl_glLockArraysEXT: - mov __blue_glCore_glLockArraysEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUseProgram +.type bluegl_glUseProgram, %function +bluegl_glUseProgram: + mov __blue_glCore_glUseProgram@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsEnabledIndexedEXT -.type bluegl_glIsEnabledIndexedEXT, %function -bluegl_glIsEnabledIndexedEXT: - mov __blue_glCore_glIsEnabledIndexedEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1f +.type bluegl_glUniform1f, %function +bluegl_glUniform1f: + mov __blue_glCore_glUniform1f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenerateMipmapEXT -.type bluegl_glGenerateMipmapEXT, %function -bluegl_glGenerateMipmapEXT: - mov __blue_glCore_glGenerateMipmapEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2f +.type bluegl_glUniform2f, %function +bluegl_glUniform2f: + mov __blue_glCore_glUniform2f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexP3uiv -.type bluegl_glVertexP3uiv, %function -bluegl_glVertexP3uiv: - mov __blue_glCore_glVertexP3uiv@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3f +.type bluegl_glUniform3f, %function +bluegl_glUniform3f: + mov __blue_glCore_glUniform3f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearNamedBufferSubData -.type bluegl_glClearNamedBufferSubData, %function -bluegl_glClearNamedBufferSubData: - mov __blue_glCore_glClearNamedBufferSubData@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4f +.type bluegl_glUniform4f, %function +bluegl_glUniform4f: + mov __blue_glCore_glUniform4f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glInvalidateTexImage -.type bluegl_glInvalidateTexImage, %function -bluegl_glInvalidateTexImage: - mov __blue_glCore_glInvalidateTexImage@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1i +.type bluegl_glUniform1i, %function +bluegl_glUniform1i: + mov __blue_glCore_glUniform1i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindFramebuffer -.type bluegl_glBindFramebuffer, %function -bluegl_glBindFramebuffer: - mov __blue_glCore_glBindFramebuffer@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2i +.type bluegl_glUniform2i, %function +bluegl_glUniform2i: + mov __blue_glCore_glUniform2i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawArraysIndirect -.type bluegl_glDrawArraysIndirect, %function -bluegl_glDrawArraysIndirect: - mov __blue_glCore_glDrawArraysIndirect@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3i +.type bluegl_glUniform3i, %function +bluegl_glUniform3i: + mov __blue_glCore_glUniform3i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClipPlanexOES -.type bluegl_glClipPlanexOES, %function -bluegl_glClipPlanexOES: - mov __blue_glCore_glClipPlanexOES@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4i +.type bluegl_glUniform4i, %function +bluegl_glUniform4i: + mov __blue_glCore_glUniform4i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFloati_v -.type bluegl_glGetFloati_v, %function -bluegl_glGetFloati_v: - mov __blue_glCore_glGetFloati_v@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1fv +.type bluegl_glUniform1fv, %function +bluegl_glUniform1fv: + mov __blue_glCore_glUniform1fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTransformFeedbackVaryingsEXT -.type bluegl_glTransformFeedbackVaryingsEXT, %function -bluegl_glTransformFeedbackVaryingsEXT: - mov __blue_glCore_glTransformFeedbackVaryingsEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2fv +.type bluegl_glUniform2fv, %function +bluegl_glUniform2fv: + mov __blue_glCore_glUniform2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetColorTableParameteriv -.type bluegl_glGetColorTableParameteriv, %function -bluegl_glGetColorTableParameteriv: - mov __blue_glCore_glGetColorTableParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3fv +.type bluegl_glUniform3fv, %function +bluegl_glUniform3fv: + mov __blue_glCore_glUniform3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexBufferRange -.type bluegl_glTexBufferRange, %function -bluegl_glTexBufferRange: - mov __blue_glCore_glTexBufferRange@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4fv +.type bluegl_glUniform4fv, %function +bluegl_glUniform4fv: + mov __blue_glCore_glUniform4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI1uivEXT -.type bluegl_glVertexAttribI1uivEXT, %function -bluegl_glVertexAttribI1uivEXT: - mov __blue_glCore_glVertexAttribI1uivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1iv +.type bluegl_glUniform1iv, %function +bluegl_glUniform1iv: + mov __blue_glCore_glUniform1iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glShaderBinary -.type bluegl_glShaderBinary, %function -bluegl_glShaderBinary: - mov __blue_glCore_glShaderBinary@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2iv +.type bluegl_glUniform2iv, %function +bluegl_glUniform2iv: + mov __blue_glCore_glUniform2iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribLi64vNV -.type bluegl_glGetVertexAttribLi64vNV, %function -bluegl_glGetVertexAttribLi64vNV: - mov __blue_glCore_glGetVertexAttribLi64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3iv +.type bluegl_glUniform3iv, %function +bluegl_glUniform3iv: + mov __blue_glCore_glUniform3iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedBufferSubDataEXT -.type bluegl_glGetNamedBufferSubDataEXT, %function -bluegl_glGetNamedBufferSubDataEXT: - mov __blue_glCore_glGetNamedBufferSubDataEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4iv +.type bluegl_glUniform4iv, %function +bluegl_glUniform4iv: + mov __blue_glCore_glUniform4iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3uivEXT -.type bluegl_glUniform3uivEXT, %function -bluegl_glUniform3uivEXT: - mov __blue_glCore_glUniform3uivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix2fv +.type bluegl_glUniformMatrix2fv, %function +bluegl_glUniformMatrix2fv: + mov __blue_glCore_glUniformMatrix2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixTranslatefEXT -.type bluegl_glMatrixTranslatefEXT, %function -bluegl_glMatrixTranslatefEXT: - mov __blue_glCore_glMatrixTranslatefEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix3fv +.type bluegl_glUniformMatrix3fv, %function +bluegl_glUniformMatrix3fv: + mov __blue_glCore_glUniformMatrix3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribs2hvNV -.type bluegl_glVertexAttribs2hvNV, %function -bluegl_glVertexAttribs2hvNV: - mov __blue_glCore_glVertexAttribs2hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix4fv +.type bluegl_glUniformMatrix4fv, %function +bluegl_glUniformMatrix4fv: + mov __blue_glCore_glUniformMatrix4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearBufferSubData -.type bluegl_glClearBufferSubData, %function -bluegl_glClearBufferSubData: - mov __blue_glCore_glClearBufferSubData@GOTPCREL(%rip), %r11 +.global bluegl_glValidateProgram +.type bluegl_glValidateProgram, %function +bluegl_glValidateProgram: + mov __blue_glCore_glValidateProgram@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenFramebuffers -.type bluegl_glGenFramebuffers, %function -bluegl_glGenFramebuffers: - mov __blue_glCore_glGenFramebuffers@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1d +.type bluegl_glVertexAttrib1d, %function +bluegl_glVertexAttrib1d: + mov __blue_glCore_glVertexAttrib1d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayAttribFormat -.type bluegl_glVertexArrayAttribFormat, %function -bluegl_glVertexArrayAttribFormat: - mov __blue_glCore_glVertexArrayAttribFormat@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1dv +.type bluegl_glVertexAttrib1dv, %function +bluegl_glVertexAttrib1dv: + mov __blue_glCore_glVertexAttrib1dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetActiveUniformsiv -.type bluegl_glGetActiveUniformsiv, %function -bluegl_glGetActiveUniformsiv: - mov __blue_glCore_glGetActiveUniformsiv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1f +.type bluegl_glVertexAttrib1f, %function +bluegl_glVertexAttrib1f: + mov __blue_glCore_glVertexAttrib1f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTextureSubImage1DEXT -.type bluegl_glCompressedTextureSubImage1DEXT, %function -bluegl_glCompressedTextureSubImage1DEXT: - mov __blue_glCore_glCompressedTextureSubImage1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1fv +.type bluegl_glVertexAttrib1fv, %function +bluegl_glVertexAttrib1fv: + mov __blue_glCore_glVertexAttrib1fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsRenderbuffer -.type bluegl_glIsRenderbuffer, %function -bluegl_glIsRenderbuffer: - mov __blue_glCore_glIsRenderbuffer@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1s +.type bluegl_glVertexAttrib1s, %function +bluegl_glVertexAttrib1s: + mov __blue_glCore_glVertexAttrib1s@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPresentFrameKeyedNV -.type bluegl_glPresentFrameKeyedNV, %function -bluegl_glPresentFrameKeyedNV: - mov __blue_glCore_glPresentFrameKeyedNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1sv +.type bluegl_glVertexAttrib1sv, %function +bluegl_glVertexAttrib1sv: + mov __blue_glCore_glVertexAttrib1sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix3fvEXT -.type bluegl_glProgramUniformMatrix3fvEXT, %function -bluegl_glProgramUniformMatrix3fvEXT: - mov __blue_glCore_glProgramUniformMatrix3fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2d +.type bluegl_glVertexAttrib2d, %function +bluegl_glVertexAttrib2d: + mov __blue_glCore_glVertexAttrib2d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL2i64vNV -.type bluegl_glVertexAttribL2i64vNV, %function -bluegl_glVertexAttribL2i64vNV: - mov __blue_glCore_glVertexAttribL2i64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2dv +.type bluegl_glVertexAttrib2dv, %function +bluegl_glVertexAttrib2dv: + mov __blue_glCore_glVertexAttrib2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFogCoordhvNV -.type bluegl_glFogCoordhvNV, %function -bluegl_glFogCoordhvNV: - mov __blue_glCore_glFogCoordhvNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2f +.type bluegl_glVertexAttrib2f, %function +bluegl_glVertexAttrib2f: + mov __blue_glCore_glVertexAttrib2f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4ubv -.type bluegl_glVertexAttrib4ubv, %function -bluegl_glVertexAttrib4ubv: - mov __blue_glCore_glVertexAttrib4ubv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2fv +.type bluegl_glVertexAttrib2fv, %function +bluegl_glVertexAttrib2fv: + mov __blue_glCore_glVertexAttrib2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPushClientAttribDefaultEXT -.type bluegl_glPushClientAttribDefaultEXT, %function -bluegl_glPushClientAttribDefaultEXT: - mov __blue_glCore_glPushClientAttribDefaultEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2s +.type bluegl_glVertexAttrib2s, %function +bluegl_glVertexAttrib2s: + mov __blue_glCore_glVertexAttrib2s@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3ivMESA -.type bluegl_glWindowPos3ivMESA, %function -bluegl_glWindowPos3ivMESA: - mov __blue_glCore_glWindowPos3ivMESA@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2sv +.type bluegl_glVertexAttrib2sv, %function +bluegl_glVertexAttrib2sv: + mov __blue_glCore_glVertexAttrib2sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPrimitiveRestartIndexNV -.type bluegl_glPrimitiveRestartIndexNV, %function -bluegl_glPrimitiveRestartIndexNV: - mov __blue_glCore_glPrimitiveRestartIndexNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3d +.type bluegl_glVertexAttrib3d, %function +bluegl_glVertexAttrib3d: + mov __blue_glCore_glVertexAttrib3d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreatePerfQueryINTEL -.type bluegl_glCreatePerfQueryINTEL, %function -bluegl_glCreatePerfQueryINTEL: - mov __blue_glCore_glCreatePerfQueryINTEL@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3dv +.type bluegl_glVertexAttrib3dv, %function +bluegl_glVertexAttrib3dv: + mov __blue_glCore_glVertexAttrib3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramLocalParameterIuivNV -.type bluegl_glGetProgramLocalParameterIuivNV, %function -bluegl_glGetProgramLocalParameterIuivNV: - mov __blue_glCore_glGetProgramLocalParameterIuivNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3f +.type bluegl_glVertexAttrib3f, %function +bluegl_glVertexAttrib3f: + mov __blue_glCore_glVertexAttrib3f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glResizeBuffersMESA -.type bluegl_glResizeBuffersMESA, %function -bluegl_glResizeBuffersMESA: - mov __blue_glCore_glResizeBuffersMESA@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3fv +.type bluegl_glVertexAttrib3fv, %function +bluegl_glVertexAttrib3fv: + mov __blue_glCore_glVertexAttrib3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream1fATI -.type bluegl_glVertexStream1fATI, %function -bluegl_glVertexStream1fATI: - mov __blue_glCore_glVertexStream1fATI@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3s +.type bluegl_glVertexAttrib3s, %function +bluegl_glVertexAttrib3s: + mov __blue_glCore_glVertexAttrib3s@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2ui -.type bluegl_glProgramUniform2ui, %function -bluegl_glProgramUniform2ui: - mov __blue_glCore_glProgramUniform2ui@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3sv +.type bluegl_glVertexAttrib3sv, %function +bluegl_glVertexAttrib3sv: + mov __blue_glCore_glVertexAttrib3sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3iv -.type bluegl_glSecondaryColor3iv, %function -bluegl_glSecondaryColor3iv: - mov __blue_glCore_glSecondaryColor3iv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4Nbv +.type bluegl_glVertexAttrib4Nbv, %function +bluegl_glVertexAttrib4Nbv: + mov __blue_glCore_glVertexAttrib4Nbv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramParameters4dvNV -.type bluegl_glProgramParameters4dvNV, %function -bluegl_glProgramParameters4dvNV: - mov __blue_glCore_glProgramParameters4dvNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4Niv +.type bluegl_glVertexAttrib4Niv, %function +bluegl_glVertexAttrib4Niv: + mov __blue_glCore_glVertexAttrib4Niv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3i -.type bluegl_glWindowPos3i, %function -bluegl_glWindowPos3i: - mov __blue_glCore_glWindowPos3i@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4Nsv +.type bluegl_glVertexAttrib4Nsv, %function +bluegl_glVertexAttrib4Nsv: + mov __blue_glCore_glVertexAttrib4Nsv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glRectxvOES -.type bluegl_glRectxvOES, %function -bluegl_glRectxvOES: - mov __blue_glCore_glRectxvOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4Nub +.type bluegl_glVertexAttrib4Nub, %function +bluegl_glVertexAttrib4Nub: + mov __blue_glCore_glVertexAttrib4Nub@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4iARB -.type bluegl_glMultiTexCoord4iARB, %function -bluegl_glMultiTexCoord4iARB: - mov __blue_glCore_glMultiTexCoord4iARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4Nubv +.type bluegl_glVertexAttrib4Nubv, %function +bluegl_glVertexAttrib4Nubv: + mov __blue_glCore_glVertexAttrib4Nubv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBeginConditionalRender -.type bluegl_glBeginConditionalRender, %function -bluegl_glBeginConditionalRender: - mov __blue_glCore_glBeginConditionalRender@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4Nuiv +.type bluegl_glVertexAttrib4Nuiv, %function +bluegl_glVertexAttrib4Nuiv: + mov __blue_glCore_glVertexAttrib4Nuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFreeObjectBufferATI -.type bluegl_glFreeObjectBufferATI, %function -bluegl_glFreeObjectBufferATI: - mov __blue_glCore_glFreeObjectBufferATI@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4Nusv +.type bluegl_glVertexAttrib4Nusv, %function +bluegl_glVertexAttrib4Nusv: + mov __blue_glCore_glVertexAttrib4Nusv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetOcclusionQueryuivNV -.type bluegl_glGetOcclusionQueryuivNV, %function -bluegl_glGetOcclusionQueryuivNV: - mov __blue_glCore_glGetOcclusionQueryuivNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4bv +.type bluegl_glVertexAttrib4bv, %function +bluegl_glVertexAttrib4bv: + mov __blue_glCore_glVertexAttrib4bv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorP4ui -.type bluegl_glColorP4ui, %function -bluegl_glColorP4ui: - mov __blue_glCore_glColorP4ui@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4d +.type bluegl_glVertexAttrib4d, %function +bluegl_glVertexAttrib4d: + mov __blue_glCore_glVertexAttrib4d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPathColorGenivNV -.type bluegl_glGetPathColorGenivNV, %function -bluegl_glGetPathColorGenivNV: - mov __blue_glCore_glGetPathColorGenivNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4dv +.type bluegl_glVertexAttrib4dv, %function +bluegl_glVertexAttrib4dv: + mov __blue_glCore_glVertexAttrib4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetQueryiv -.type bluegl_glGetQueryiv, %function -bluegl_glGetQueryiv: - mov __blue_glCore_glGetQueryiv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4f +.type bluegl_glVertexAttrib4f, %function +bluegl_glVertexAttrib4f: + mov __blue_glCore_glVertexAttrib4f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI2uiv -.type bluegl_glVertexAttribI2uiv, %function -bluegl_glVertexAttribI2uiv: - mov __blue_glCore_glVertexAttribI2uiv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4fv +.type bluegl_glVertexAttrib4fv, %function +bluegl_glVertexAttrib4fv: + mov __blue_glCore_glVertexAttrib4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexArrayPointeri_vEXT -.type bluegl_glGetVertexArrayPointeri_vEXT, %function -bluegl_glGetVertexArrayPointeri_vEXT: - mov __blue_glCore_glGetVertexArrayPointeri_vEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4iv +.type bluegl_glVertexAttrib4iv, %function +bluegl_glVertexAttrib4iv: + mov __blue_glCore_glVertexAttrib4iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSamplerParameteri -.type bluegl_glSamplerParameteri, %function -bluegl_glSamplerParameteri: - mov __blue_glCore_glSamplerParameteri@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4s +.type bluegl_glVertexAttrib4s, %function +bluegl_glVertexAttrib4s: + mov __blue_glCore_glVertexAttrib4s@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glResumeTransformFeedbackNV -.type bluegl_glResumeTransformFeedbackNV, %function -bluegl_glResumeTransformFeedbackNV: - mov __blue_glCore_glResumeTransformFeedbackNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4sv +.type bluegl_glVertexAttrib4sv, %function +bluegl_glVertexAttrib4sv: + mov __blue_glCore_glVertexAttrib4sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL1ui64vNV -.type bluegl_glVertexAttribL1ui64vNV, %function -bluegl_glVertexAttribL1ui64vNV: - mov __blue_glCore_glVertexAttribL1ui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4ubv +.type bluegl_glVertexAttrib4ubv, %function +bluegl_glVertexAttrib4ubv: + mov __blue_glCore_glVertexAttrib4ubv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPauseTransformFeedbackNV -.type bluegl_glPauseTransformFeedbackNV, %function -bluegl_glPauseTransformFeedbackNV: - mov __blue_glCore_glPauseTransformFeedbackNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4uiv +.type bluegl_glVertexAttrib4uiv, %function +bluegl_glVertexAttrib4uiv: + mov __blue_glCore_glVertexAttrib4uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribs2fvNV -.type bluegl_glVertexAttribs2fvNV, %function -bluegl_glVertexAttribs2fvNV: - mov __blue_glCore_glVertexAttribs2fvNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4usv +.type bluegl_glVertexAttrib4usv, %function +bluegl_glVertexAttrib4usv: + mov __blue_glCore_glVertexAttrib4usv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1iv -.type bluegl_glProgramUniform1iv, %function -bluegl_glProgramUniform1iv: - mov __blue_glCore_glProgramUniform1iv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribPointer +.type bluegl_glVertexAttribPointer, %function +bluegl_glVertexAttribPointer: + mov __blue_glCore_glVertexAttribPointer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetColorTableSGI -.type bluegl_glGetColorTableSGI, %function -bluegl_glGetColorTableSGI: - mov __blue_glCore_glGetColorTableSGI@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix2x3fv +.type bluegl_glUniformMatrix2x3fv, %function +bluegl_glUniformMatrix2x3fv: + mov __blue_glCore_glUniformMatrix2x3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetActiveAttrib -.type bluegl_glGetActiveAttrib, %function -bluegl_glGetActiveAttrib: - mov __blue_glCore_glGetActiveAttrib@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix3x2fv +.type bluegl_glUniformMatrix3x2fv, %function +bluegl_glUniformMatrix3x2fv: + mov __blue_glCore_glUniformMatrix3x2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glResetMinmax -.type bluegl_glResetMinmax, %function -bluegl_glResetMinmax: - mov __blue_glCore_glResetMinmax@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix2x4fv +.type bluegl_glUniformMatrix2x4fv, %function +bluegl_glUniformMatrix2x4fv: + mov __blue_glCore_glUniformMatrix2x4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBinormal3svEXT -.type bluegl_glBinormal3svEXT, %function -bluegl_glBinormal3svEXT: - mov __blue_glCore_glBinormal3svEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix4x2fv +.type bluegl_glUniformMatrix4x2fv, %function +bluegl_glUniformMatrix4x2fv: + mov __blue_glCore_glUniformMatrix4x2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4fv -.type bluegl_glVertexAttrib4fv, %function -bluegl_glVertexAttrib4fv: - mov __blue_glCore_glVertexAttrib4fv@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix3x4fv +.type bluegl_glUniformMatrix3x4fv, %function +bluegl_glUniformMatrix3x4fv: + mov __blue_glCore_glUniformMatrix3x4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIndexxOES -.type bluegl_glIndexxOES, %function -bluegl_glIndexxOES: - mov __blue_glCore_glIndexxOES@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix4x3fv +.type bluegl_glUniformMatrix4x3fv, %function +bluegl_glUniformMatrix4x3fv: + mov __blue_glCore_glUniformMatrix4x3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixMultTransposefEXT -.type bluegl_glMatrixMultTransposefEXT, %function -bluegl_glMatrixMultTransposefEXT: - mov __blue_glCore_glMatrixMultTransposefEXT@GOTPCREL(%rip), %r11 +.global bluegl_glColorMaski +.type bluegl_glColorMaski, %function +bluegl_glColorMaski: + mov __blue_glCore_glColorMaski@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedFramebufferTexture -.type bluegl_glNamedFramebufferTexture, %function -bluegl_glNamedFramebufferTexture: - mov __blue_glCore_glNamedFramebufferTexture@GOTPCREL(%rip), %r11 +.global bluegl_glGetBooleani_v +.type bluegl_glGetBooleani_v, %function +bluegl_glGetBooleani_v: + mov __blue_glCore_glGetBooleani_v@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexP2uiv -.type bluegl_glVertexP2uiv, %function -bluegl_glVertexP2uiv: - mov __blue_glCore_glVertexP2uiv@GOTPCREL(%rip), %r11 +.global bluegl_glGetIntegeri_v +.type bluegl_glGetIntegeri_v, %function +bluegl_glGetIntegeri_v: + mov __blue_glCore_glGetIntegeri_v@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMemoryBarrier -.type bluegl_glMemoryBarrier, %function -bluegl_glMemoryBarrier: - mov __blue_glCore_glMemoryBarrier@GOTPCREL(%rip), %r11 +.global bluegl_glEnablei +.type bluegl_glEnablei, %function +bluegl_glEnablei: + mov __blue_glCore_glEnablei@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetGraphicsResetStatusARB -.type bluegl_glGetGraphicsResetStatusARB, %function -bluegl_glGetGraphicsResetStatusARB: - mov __blue_glCore_glGetGraphicsResetStatusARB@GOTPCREL(%rip), %r11 +.global bluegl_glDisablei +.type bluegl_glDisablei, %function +bluegl_glDisablei: + mov __blue_glCore_glDisablei@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindAttribLocation -.type bluegl_glBindAttribLocation, %function -bluegl_glBindAttribLocation: - mov __blue_glCore_glBindAttribLocation@GOTPCREL(%rip), %r11 +.global bluegl_glIsEnabledi +.type bluegl_glIsEnabledi, %function +bluegl_glIsEnabledi: + mov __blue_glCore_glIsEnabledi@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexBlendEnviATI -.type bluegl_glVertexBlendEnviATI, %function -bluegl_glVertexBlendEnviATI: - mov __blue_glCore_glVertexBlendEnviATI@GOTPCREL(%rip), %r11 +.global bluegl_glBeginTransformFeedback +.type bluegl_glBeginTransformFeedback, %function +bluegl_glBeginTransformFeedback: + mov __blue_glCore_glBeginTransformFeedback@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glAttachObjectARB -.type bluegl_glAttachObjectARB, %function -bluegl_glAttachObjectARB: - mov __blue_glCore_glAttachObjectARB@GOTPCREL(%rip), %r11 +.global bluegl_glEndTransformFeedback +.type bluegl_glEndTransformFeedback, %function +bluegl_glEndTransformFeedback: + mov __blue_glCore_glEndTransformFeedback@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormalStream3bvATI -.type bluegl_glNormalStream3bvATI, %function -bluegl_glNormalStream3bvATI: - mov __blue_glCore_glNormalStream3bvATI@GOTPCREL(%rip), %r11 +.global bluegl_glBindBufferRange +.type bluegl_glBindBufferRange, %function +bluegl_glBindBufferRange: + mov __blue_glCore_glBindBufferRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedFramebufferTextureFaceEXT -.type bluegl_glNamedFramebufferTextureFaceEXT, %function -bluegl_glNamedFramebufferTextureFaceEXT: - mov __blue_glCore_glNamedFramebufferTextureFaceEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBindBufferBase +.type bluegl_glBindBufferBase, %function +bluegl_glBindBufferBase: + mov __blue_glCore_glBindBufferBase@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetConvolutionParameterivEXT -.type bluegl_glGetConvolutionParameterivEXT, %function -bluegl_glGetConvolutionParameterivEXT: - mov __blue_glCore_glGetConvolutionParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTransformFeedbackVaryings +.type bluegl_glTransformFeedbackVaryings, %function +bluegl_glTransformFeedbackVaryings: + mov __blue_glCore_glTransformFeedbackVaryings@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramPathFragmentInputGenNV -.type bluegl_glProgramPathFragmentInputGenNV, %function -bluegl_glProgramPathFragmentInputGenNV: - mov __blue_glCore_glProgramPathFragmentInputGenNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetTransformFeedbackVarying +.type bluegl_glGetTransformFeedbackVarying, %function +bluegl_glGetTransformFeedbackVarying: + mov __blue_glCore_glGetTransformFeedbackVarying@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsFramebufferEXT -.type bluegl_glIsFramebufferEXT, %function -bluegl_glIsFramebufferEXT: - mov __blue_glCore_glIsFramebufferEXT@GOTPCREL(%rip), %r11 +.global bluegl_glClampColor +.type bluegl_glClampColor, %function +bluegl_glClampColor: + mov __blue_glCore_glClampColor@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsVertexArray -.type bluegl_glIsVertexArray, %function -bluegl_glIsVertexArray: - mov __blue_glCore_glIsVertexArray@GOTPCREL(%rip), %r11 +.global bluegl_glBeginConditionalRender +.type bluegl_glBeginConditionalRender, %function +bluegl_glBeginConditionalRender: + mov __blue_glCore_glBeginConditionalRender@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribIivEXT -.type bluegl_glGetVertexAttribIivEXT, %function -bluegl_glGetVertexAttribIivEXT: - mov __blue_glCore_glGetVertexAttribIivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glEndConditionalRender +.type bluegl_glEndConditionalRender, %function +bluegl_glEndConditionalRender: + mov __blue_glCore_glEndConditionalRender@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureParameterIivEXT -.type bluegl_glTextureParameterIivEXT, %function -bluegl_glTextureParameterIivEXT: - mov __blue_glCore_glTextureParameterIivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribIPointer +.type bluegl_glVertexAttribIPointer, %function +bluegl_glVertexAttribIPointer: + mov __blue_glCore_glVertexAttribIPointer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnPixelMapuiv -.type bluegl_glGetnPixelMapuiv, %function -bluegl_glGetnPixelMapuiv: - mov __blue_glCore_glGetnPixelMapuiv@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribIiv +.type bluegl_glGetVertexAttribIiv, %function +bluegl_glGetVertexAttribIiv: + mov __blue_glCore_glGetVertexAttribIiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetInvariantFloatvEXT -.type bluegl_glGetInvariantFloatvEXT, %function -bluegl_glGetInvariantFloatvEXT: - mov __blue_glCore_glGetInvariantFloatvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribIuiv +.type bluegl_glGetVertexAttribIuiv, %function +bluegl_glGetVertexAttribIuiv: + mov __blue_glCore_glGetVertexAttribIuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glAttachShader -.type bluegl_glAttachShader, %function -bluegl_glAttachShader: - mov __blue_glCore_glAttachShader@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI1i +.type bluegl_glVertexAttribI1i, %function +bluegl_glVertexAttribI1i: + mov __blue_glCore_glVertexAttribI1i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3i -.type bluegl_glSecondaryColor3i, %function -bluegl_glSecondaryColor3i: - mov __blue_glCore_glSecondaryColor3i@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI2i +.type bluegl_glVertexAttribI2i, %function +bluegl_glVertexAttribI2i: + mov __blue_glCore_glVertexAttribI2i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord4hvNV -.type bluegl_glTexCoord4hvNV, %function -bluegl_glTexCoord4hvNV: - mov __blue_glCore_glTexCoord4hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI3i +.type bluegl_glVertexAttribI3i, %function +bluegl_glVertexAttribI3i: + mov __blue_glCore_glVertexAttribI3i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorTableSGI -.type bluegl_glColorTableSGI, %function -bluegl_glColorTableSGI: - mov __blue_glCore_glColorTableSGI@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI4i +.type bluegl_glVertexAttribI4i, %function +bluegl_glVertexAttribI4i: + mov __blue_glCore_glVertexAttribI4i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4uivEXT -.type bluegl_glProgramUniform4uivEXT, %function -bluegl_glProgramUniform4uivEXT: - mov __blue_glCore_glProgramUniform4uivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI1ui +.type bluegl_glVertexAttribI1ui, %function +bluegl_glVertexAttribI1ui: + mov __blue_glCore_glVertexAttribI1ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPointSizexOES -.type bluegl_glPointSizexOES, %function -bluegl_glPointSizexOES: - mov __blue_glCore_glPointSizexOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI2ui +.type bluegl_glVertexAttribI2ui, %function +bluegl_glVertexAttribI2ui: + mov __blue_glCore_glVertexAttribI2ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTrackMatrixNV -.type bluegl_glTrackMatrixNV, %function -bluegl_glTrackMatrixNV: - mov __blue_glCore_glTrackMatrixNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI3ui +.type bluegl_glVertexAttribI3ui, %function +bluegl_glVertexAttribI3ui: + mov __blue_glCore_glVertexAttribI3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1fv -.type bluegl_glMultiTexCoord1fv, %function -bluegl_glMultiTexCoord1fv: - mov __blue_glCore_glMultiTexCoord1fv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI4ui +.type bluegl_glVertexAttribI4ui, %function +bluegl_glVertexAttribI4ui: + mov __blue_glCore_glVertexAttribI4ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColorPointerListIBM -.type bluegl_glSecondaryColorPointerListIBM, %function -bluegl_glSecondaryColorPointerListIBM: - mov __blue_glCore_glSecondaryColorPointerListIBM@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI1iv +.type bluegl_glVertexAttribI1iv, %function +bluegl_glVertexAttribI1iv: + mov __blue_glCore_glVertexAttribI1iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenBuffersARB -.type bluegl_glGenBuffersARB, %function -bluegl_glGenBuffersARB: - mov __blue_glCore_glGenBuffersARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI2iv +.type bluegl_glVertexAttribI2iv, %function +bluegl_glVertexAttribI2iv: + mov __blue_glCore_glVertexAttribI2iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN -.type bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN, %function -bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN: - mov __blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI3iv +.type bluegl_glVertexAttribI3iv, %function +bluegl_glVertexAttribI3iv: + mov __blue_glCore_glVertexAttribI3iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyColorTable -.type bluegl_glCopyColorTable, %function -bluegl_glCopyColorTable: - mov __blue_glCore_glCopyColorTable@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI4iv +.type bluegl_glVertexAttribI4iv, %function +bluegl_glVertexAttribI4iv: + mov __blue_glCore_glVertexAttribI4iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexPageCommitmentARB -.type bluegl_glTexPageCommitmentARB, %function -bluegl_glTexPageCommitmentARB: - mov __blue_glCore_glTexPageCommitmentARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI1uiv +.type bluegl_glVertexAttribI1uiv, %function +bluegl_glVertexAttribI1uiv: + mov __blue_glCore_glVertexAttribI1uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSetFenceAPPLE -.type bluegl_glSetFenceAPPLE, %function -bluegl_glSetFenceAPPLE: - mov __blue_glCore_glSetFenceAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI2uiv +.type bluegl_glVertexAttribI2uiv, %function +bluegl_glVertexAttribI2uiv: + mov __blue_glCore_glVertexAttribI2uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2dvARB -.type bluegl_glMultiTexCoord2dvARB, %function -bluegl_glMultiTexCoord2dvARB: - mov __blue_glCore_glMultiTexCoord2dvARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI3uiv +.type bluegl_glVertexAttribI3uiv, %function +bluegl_glVertexAttribI3uiv: + mov __blue_glCore_glVertexAttribI3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertex4hvNV -.type bluegl_glVertex4hvNV, %function -bluegl_glVertex4hvNV: - mov __blue_glCore_glVertex4hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI4uiv +.type bluegl_glVertexAttribI4uiv, %function +bluegl_glVertexAttribI4uiv: + mov __blue_glCore_glVertexAttribI4uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindVertexBuffer -.type bluegl_glBindVertexBuffer, %function -bluegl_glBindVertexBuffer: - mov __blue_glCore_glBindVertexBuffer@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI4bv +.type bluegl_glVertexAttribI4bv, %function +bluegl_glVertexAttribI4bv: + mov __blue_glCore_glVertexAttribI4bv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertex3xvOES -.type bluegl_glVertex3xvOES, %function -bluegl_glVertex3xvOES: - mov __blue_glCore_glVertex3xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI4sv +.type bluegl_glVertexAttribI4sv, %function +bluegl_glVertexAttribI4sv: + mov __blue_glCore_glVertexAttribI4sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glConvolutionParameterivEXT -.type bluegl_glConvolutionParameterivEXT, %function -bluegl_glConvolutionParameterivEXT: - mov __blue_glCore_glConvolutionParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI4ubv +.type bluegl_glVertexAttribI4ubv, %function +bluegl_glVertexAttribI4ubv: + mov __blue_glCore_glVertexAttribI4ubv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3ui64vARB -.type bluegl_glProgramUniform3ui64vARB, %function -bluegl_glProgramUniform3ui64vARB: - mov __blue_glCore_glProgramUniform3ui64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI4usv +.type bluegl_glVertexAttribI4usv, %function +bluegl_glVertexAttribI4usv: + mov __blue_glCore_glVertexAttribI4usv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2dv -.type bluegl_glProgramUniform2dv, %function -bluegl_glProgramUniform2dv: - mov __blue_glCore_glProgramUniform2dv@GOTPCREL(%rip), %r11 +.global bluegl_glGetUniformuiv +.type bluegl_glGetUniformuiv, %function +bluegl_glGetUniformuiv: + mov __blue_glCore_glGetUniformuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos4sMESA -.type bluegl_glWindowPos4sMESA, %function -bluegl_glWindowPos4sMESA: - mov __blue_glCore_glWindowPos4sMESA@GOTPCREL(%rip), %r11 +.global bluegl_glBindFragDataLocation +.type bluegl_glBindFragDataLocation, %function +bluegl_glBindFragDataLocation: + mov __blue_glCore_glBindFragDataLocation@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexImage1DEXT -.type bluegl_glMultiTexImage1DEXT, %function -bluegl_glMultiTexImage1DEXT: - mov __blue_glCore_glMultiTexImage1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetFragDataLocation +.type bluegl_glGetFragDataLocation, %function +bluegl_glGetFragDataLocation: + mov __blue_glCore_glGetFragDataLocation@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glRenderbufferStorage -.type bluegl_glRenderbufferStorage, %function -bluegl_glRenderbufferStorage: - mov __blue_glCore_glRenderbufferStorage@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1ui +.type bluegl_glUniform1ui, %function +bluegl_glUniform1ui: + mov __blue_glCore_glUniform1ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glConvolutionFilter2D -.type bluegl_glConvolutionFilter2D, %function -bluegl_glConvolutionFilter2D: - mov __blue_glCore_glConvolutionFilter2D@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2ui +.type bluegl_glUniform2ui, %function +bluegl_glUniform2ui: + mov __blue_glCore_glUniform2ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBinormal3bEXT -.type bluegl_glBinormal3bEXT, %function -bluegl_glBinormal3bEXT: - mov __blue_glCore_glBinormal3bEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3ui +.type bluegl_glUniform3ui, %function +bluegl_glUniform3ui: + mov __blue_glCore_glUniform3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFragmentLightivSGIX -.type bluegl_glFragmentLightivSGIX, %function -bluegl_glFragmentLightivSGIX: - mov __blue_glCore_glFragmentLightivSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4ui +.type bluegl_glUniform4ui, %function +bluegl_glUniform4ui: + mov __blue_glCore_glUniform4ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3iv -.type bluegl_glProgramUniform3iv, %function -bluegl_glProgramUniform3iv: - mov __blue_glCore_glProgramUniform3iv@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1uiv +.type bluegl_glUniform1uiv, %function +bluegl_glUniform1uiv: + mov __blue_glCore_glUniform1uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsQuery -.type bluegl_glIsQuery, %function -bluegl_glIsQuery: - mov __blue_glCore_glIsQuery@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2uiv +.type bluegl_glUniform2uiv, %function +bluegl_glUniform2uiv: + mov __blue_glCore_glUniform2uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream2sATI -.type bluegl_glVertexStream2sATI, %function -bluegl_glVertexStream2sATI: - mov __blue_glCore_glVertexStream2sATI@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3uiv +.type bluegl_glUniform3uiv, %function +bluegl_glUniform3uiv: + mov __blue_glCore_glUniform3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4iEXT -.type bluegl_glProgramUniform4iEXT, %function -bluegl_glProgramUniform4iEXT: - mov __blue_glCore_glProgramUniform4iEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4uiv +.type bluegl_glUniform4uiv, %function +bluegl_glUniform4uiv: + mov __blue_glCore_glUniform4uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetInvariantBooleanvEXT -.type bluegl_glGetInvariantBooleanvEXT, %function -bluegl_glGetInvariantBooleanvEXT: - mov __blue_glCore_glGetInvariantBooleanvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexParameterIiv +.type bluegl_glTexParameterIiv, %function +bluegl_glTexParameterIiv: + mov __blue_glCore_glTexParameterIiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColorFormatNV -.type bluegl_glSecondaryColorFormatNV, %function -bluegl_glSecondaryColorFormatNV: - mov __blue_glCore_glSecondaryColorFormatNV@GOTPCREL(%rip), %r11 +.global bluegl_glTexParameterIuiv +.type bluegl_glTexParameterIuiv, %function +bluegl_glTexParameterIuiv: + mov __blue_glCore_glTexParameterIuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4fNV -.type bluegl_glVertexAttrib4fNV, %function -bluegl_glVertexAttrib4fNV: - mov __blue_glCore_glVertexAttrib4fNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetTexParameterIiv +.type bluegl_glGetTexParameterIiv, %function +bluegl_glGetTexParameterIiv: + mov __blue_glCore_glGetTexParameterIiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorFragmentOp1ATI -.type bluegl_glColorFragmentOp1ATI, %function -bluegl_glColorFragmentOp1ATI: - mov __blue_glCore_glColorFragmentOp1ATI@GOTPCREL(%rip), %r11 +.global bluegl_glGetTexParameterIuiv +.type bluegl_glGetTexParameterIuiv, %function +bluegl_glGetTexParameterIuiv: + mov __blue_glCore_glGetTexParameterIuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTransformFeedbackBufferBase -.type bluegl_glTransformFeedbackBufferBase, %function -bluegl_glTransformFeedbackBufferBase: - mov __blue_glCore_glTransformFeedbackBufferBase@GOTPCREL(%rip), %r11 +.global bluegl_glClearBufferiv +.type bluegl_glClearBufferiv, %function +bluegl_glClearBufferiv: + mov __blue_glCore_glClearBufferiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTexParameteriv -.type bluegl_glGetTexParameteriv, %function -bluegl_glGetTexParameteriv: - mov __blue_glCore_glGetTexParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glClearBufferuiv +.type bluegl_glClearBufferuiv, %function +bluegl_glClearBufferuiv: + mov __blue_glCore_glClearBufferuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribIiv -.type bluegl_glGetVertexAttribIiv, %function -bluegl_glGetVertexAttribIiv: - mov __blue_glCore_glGetVertexAttribIiv@GOTPCREL(%rip), %r11 +.global bluegl_glClearBufferfv +.type bluegl_glClearBufferfv, %function +bluegl_glClearBufferfv: + mov __blue_glCore_glClearBufferfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEndOcclusionQueryNV -.type bluegl_glEndOcclusionQueryNV, %function -bluegl_glEndOcclusionQueryNV: - mov __blue_glCore_glEndOcclusionQueryNV@GOTPCREL(%rip), %r11 +.global bluegl_glClearBufferfi +.type bluegl_glClearBufferfi, %function +bluegl_glClearBufferfi: + mov __blue_glCore_glClearBufferfi@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTransformFeedbackStreamAttribsNV -.type bluegl_glTransformFeedbackStreamAttribsNV, %function -bluegl_glTransformFeedbackStreamAttribsNV: - mov __blue_glCore_glTransformFeedbackStreamAttribsNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetStringi +.type bluegl_glGetStringi, %function +bluegl_glGetStringi: + mov __blue_glCore_glGetStringi@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetQueryBufferObjecti64v -.type bluegl_glGetQueryBufferObjecti64v, %function -bluegl_glGetQueryBufferObjecti64v: - mov __blue_glCore_glGetQueryBufferObjecti64v@GOTPCREL(%rip), %r11 +.global bluegl_glIsRenderbuffer +.type bluegl_glIsRenderbuffer, %function +bluegl_glIsRenderbuffer: + mov __blue_glCore_glIsRenderbuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStencilFillPathInstancedNV -.type bluegl_glStencilFillPathInstancedNV, %function -bluegl_glStencilFillPathInstancedNV: - mov __blue_glCore_glStencilFillPathInstancedNV@GOTPCREL(%rip), %r11 +.global bluegl_glBindRenderbuffer +.type bluegl_glBindRenderbuffer, %function +bluegl_glBindRenderbuffer: + mov __blue_glCore_glBindRenderbuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawCommandsStatesNV -.type bluegl_glDrawCommandsStatesNV, %function -bluegl_glDrawCommandsStatesNV: - mov __blue_glCore_glDrawCommandsStatesNV@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteRenderbuffers +.type bluegl_glDeleteRenderbuffers, %function +bluegl_glDeleteRenderbuffers: + mov __blue_glCore_glDeleteRenderbuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetSamplerParameterfv -.type bluegl_glGetSamplerParameterfv, %function -bluegl_glGetSamplerParameterfv: - mov __blue_glCore_glGetSamplerParameterfv@GOTPCREL(%rip), %r11 +.global bluegl_glGenRenderbuffers +.type bluegl_glGenRenderbuffers, %function +bluegl_glGenRenderbuffers: + mov __blue_glCore_glGenRenderbuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4fARB -.type bluegl_glMultiTexCoord4fARB, %function -bluegl_glMultiTexCoord4fARB: - mov __blue_glCore_glMultiTexCoord4fARB@GOTPCREL(%rip), %r11 +.global bluegl_glRenderbufferStorage +.type bluegl_glRenderbufferStorage, %function +bluegl_glRenderbufferStorage: + mov __blue_glCore_glRenderbufferStorage@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3ui64NV -.type bluegl_glUniform3ui64NV, %function -bluegl_glUniform3ui64NV: - mov __blue_glCore_glUniform3ui64NV@GOTPCREL(%rip), %r11 +.global bluegl_glGetRenderbufferParameteriv +.type bluegl_glGetRenderbufferParameteriv, %function +bluegl_glGetRenderbufferParameteriv: + mov __blue_glCore_glGetRenderbufferParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexWeighthNV -.type bluegl_glVertexWeighthNV, %function -bluegl_glVertexWeighthNV: - mov __blue_glCore_glVertexWeighthNV@GOTPCREL(%rip), %r11 +.global bluegl_glIsFramebuffer +.type bluegl_glIsFramebuffer, %function +bluegl_glIsFramebuffer: + mov __blue_glCore_glIsFramebuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3ivARB -.type bluegl_glWindowPos3ivARB, %function -bluegl_glWindowPos3ivARB: - mov __blue_glCore_glWindowPos3ivARB@GOTPCREL(%rip), %r11 +.global bluegl_glBindFramebuffer +.type bluegl_glBindFramebuffer, %function +bluegl_glBindFramebuffer: + mov __blue_glCore_glBindFramebuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3ivEXT -.type bluegl_glSecondaryColor3ivEXT, %function -bluegl_glSecondaryColor3ivEXT: - mov __blue_glCore_glSecondaryColor3ivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteFramebuffers +.type bluegl_glDeleteFramebuffers, %function +bluegl_glDeleteFramebuffers: + mov __blue_glCore_glDeleteFramebuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindVertexArray -.type bluegl_glBindVertexArray, %function -bluegl_glBindVertexArray: - mov __blue_glCore_glBindVertexArray@GOTPCREL(%rip), %r11 +.global bluegl_glGenFramebuffers +.type bluegl_glGenFramebuffers, %function +bluegl_glGenFramebuffers: + mov __blue_glCore_glGenFramebuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribLui64vARB -.type bluegl_glGetVertexAttribLui64vARB, %function -bluegl_glGetVertexAttribLui64vARB: - mov __blue_glCore_glGetVertexAttribLui64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glCheckFramebufferStatus +.type bluegl_glCheckFramebufferStatus, %function +bluegl_glCheckFramebufferStatus: + mov __blue_glCore_glCheckFramebufferStatus@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4i64NV -.type bluegl_glUniform4i64NV, %function -bluegl_glUniform4i64NV: - mov __blue_glCore_glUniform4i64NV@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferTexture1D +.type bluegl_glFramebufferTexture1D, %function +bluegl_glFramebufferTexture1D: + mov __blue_glCore_glFramebufferTexture1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendBarrierNV -.type bluegl_glBlendBarrierNV, %function -bluegl_glBlendBarrierNV: - mov __blue_glCore_glBlendBarrierNV@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferTexture2D +.type bluegl_glFramebufferTexture2D, %function +bluegl_glFramebufferTexture2D: + mov __blue_glCore_glFramebufferTexture2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3fvARB -.type bluegl_glWindowPos3fvARB, %function -bluegl_glWindowPos3fvARB: - mov __blue_glCore_glWindowPos3fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferTexture3D +.type bluegl_glFramebufferTexture3D, %function +bluegl_glFramebufferTexture3D: + mov __blue_glCore_glFramebufferTexture3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendEquationSeparateiARB -.type bluegl_glBlendEquationSeparateiARB, %function -bluegl_glBlendEquationSeparateiARB: - mov __blue_glCore_glBlendEquationSeparateiARB@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferRenderbuffer +.type bluegl_glFramebufferRenderbuffer, %function +bluegl_glFramebufferRenderbuffer: + mov __blue_glCore_glFramebufferRenderbuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVariantFloatvEXT -.type bluegl_glGetVariantFloatvEXT, %function -bluegl_glGetVariantFloatvEXT: - mov __blue_glCore_glGetVariantFloatvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetFramebufferAttachmentParameteriv +.type bluegl_glGetFramebufferAttachmentParameteriv, %function +bluegl_glGetFramebufferAttachmentParameteriv: + mov __blue_glCore_glGetFramebufferAttachmentParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorSubTableEXT -.type bluegl_glColorSubTableEXT, %function -bluegl_glColorSubTableEXT: - mov __blue_glCore_glColorSubTableEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGenerateMipmap +.type bluegl_glGenerateMipmap, %function +bluegl_glGenerateMipmap: + mov __blue_glCore_glGenerateMipmap@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN -.type bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN, %function -bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN: - mov __blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glBlitFramebuffer +.type bluegl_glBlitFramebuffer, %function +bluegl_glBlitFramebuffer: + mov __blue_glCore_glBlitFramebuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramResourceiv -.type bluegl_glGetProgramResourceiv, %function -bluegl_glGetProgramResourceiv: - mov __blue_glCore_glGetProgramResourceiv@GOTPCREL(%rip), %r11 +.global bluegl_glRenderbufferStorageMultisample +.type bluegl_glRenderbufferStorageMultisample, %function +bluegl_glRenderbufferStorageMultisample: + mov __blue_glCore_glRenderbufferStorageMultisample@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1f -.type bluegl_glMultiTexCoord1f, %function -bluegl_glMultiTexCoord1f: - mov __blue_glCore_glMultiTexCoord1f@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferTextureLayer +.type bluegl_glFramebufferTextureLayer, %function +bluegl_glFramebufferTextureLayer: + mov __blue_glCore_glFramebufferTextureLayer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedFramebufferAttachmentParameteriv -.type bluegl_glGetNamedFramebufferAttachmentParameteriv, %function -bluegl_glGetNamedFramebufferAttachmentParameteriv: - mov __blue_glCore_glGetNamedFramebufferAttachmentParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glMapBufferRange +.type bluegl_glMapBufferRange, %function +bluegl_glMapBufferRange: + mov __blue_glCore_glMapBufferRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteProgramsNV -.type bluegl_glDeleteProgramsNV, %function -bluegl_glDeleteProgramsNV: - mov __blue_glCore_glDeleteProgramsNV@GOTPCREL(%rip), %r11 +.global bluegl_glFlushMappedBufferRange +.type bluegl_glFlushMappedBufferRange, %function +bluegl_glFlushMappedBufferRange: + mov __blue_glCore_glFlushMappedBufferRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGlobalAlphaFactoriSUN -.type bluegl_glGlobalAlphaFactoriSUN, %function -bluegl_glGlobalAlphaFactoriSUN: - mov __blue_glCore_glGlobalAlphaFactoriSUN@GOTPCREL(%rip), %r11 +.global bluegl_glBindVertexArray +.type bluegl_glBindVertexArray, %function +bluegl_glBindVertexArray: + mov __blue_glCore_glBindVertexArray@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFinalCombinerInputParameterfvNV -.type bluegl_glGetFinalCombinerInputParameterfvNV, %function -bluegl_glGetFinalCombinerInputParameterfvNV: - mov __blue_glCore_glGetFinalCombinerInputParameterfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteVertexArrays +.type bluegl_glDeleteVertexArrays, %function +bluegl_glDeleteVertexArrays: + mov __blue_glCore_glDeleteVertexArrays@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormalStream3dATI -.type bluegl_glNormalStream3dATI, %function -bluegl_glNormalStream3dATI: - mov __blue_glCore_glNormalStream3dATI@GOTPCREL(%rip), %r11 +.global bluegl_glGenVertexArrays +.type bluegl_glGenVertexArrays, %function +bluegl_glGenVertexArrays: + mov __blue_glCore_glGenVertexArrays@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexEnvivEXT -.type bluegl_glMultiTexEnvivEXT, %function -bluegl_glMultiTexEnvivEXT: - mov __blue_glCore_glMultiTexEnvivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glIsVertexArray +.type bluegl_glIsVertexArray, %function +bluegl_glIsVertexArray: + mov __blue_glCore_glIsVertexArray@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord4xvOES -.type bluegl_glTexCoord4xvOES, %function -bluegl_glTexCoord4xvOES: - mov __blue_glCore_glTexCoord4xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glDrawArraysInstanced +.type bluegl_glDrawArraysInstanced, %function +bluegl_glDrawArraysInstanced: + mov __blue_glCore_glDrawArraysInstanced@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4dvEXT -.type bluegl_glProgramUniform4dvEXT, %function -bluegl_glProgramUniform4dvEXT: - mov __blue_glCore_glProgramUniform4dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDrawElementsInstanced +.type bluegl_glDrawElementsInstanced, %function +bluegl_glDrawElementsInstanced: + mov __blue_glCore_glDrawElementsInstanced@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2ui64vARB -.type bluegl_glProgramUniform2ui64vARB, %function -bluegl_glProgramUniform2ui64vARB: - mov __blue_glCore_glProgramUniform2ui64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glTexBuffer +.type bluegl_glTexBuffer, %function +bluegl_glTexBuffer: + mov __blue_glCore_glTexBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindBufferBaseNV -.type bluegl_glBindBufferBaseNV, %function -bluegl_glBindBufferBaseNV: - mov __blue_glCore_glBindBufferBaseNV@GOTPCREL(%rip), %r11 +.global bluegl_glPrimitiveRestartIndex +.type bluegl_glPrimitiveRestartIndex, %function +bluegl_glPrimitiveRestartIndex: + mov __blue_glCore_glPrimitiveRestartIndex@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4s -.type bluegl_glVertexAttrib4s, %function -bluegl_glVertexAttrib4s: - mov __blue_glCore_glVertexAttrib4s@GOTPCREL(%rip), %r11 +.global bluegl_glCopyBufferSubData +.type bluegl_glCopyBufferSubData, %function +bluegl_glCopyBufferSubData: + mov __blue_glCore_glCopyBufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord2fVertex3fvSUN -.type bluegl_glTexCoord2fVertex3fvSUN, %function -bluegl_glTexCoord2fVertex3fvSUN: - mov __blue_glCore_glTexCoord2fVertex3fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glGetUniformIndices +.type bluegl_glGetUniformIndices, %function +bluegl_glGetUniformIndices: + mov __blue_glCore_glGetUniformIndices@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixMultdEXT -.type bluegl_glMatrixMultdEXT, %function -bluegl_glMatrixMultdEXT: - mov __blue_glCore_glMatrixMultdEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetActiveUniformsiv +.type bluegl_glGetActiveUniformsiv, %function +bluegl_glGetActiveUniformsiv: + mov __blue_glCore_glGetActiveUniformsiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnMapdvARB -.type bluegl_glGetnMapdvARB, %function -bluegl_glGetnMapdvARB: - mov __blue_glCore_glGetnMapdvARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetActiveUniformName +.type bluegl_glGetActiveUniformName, %function +bluegl_glGetActiveUniformName: + mov __blue_glCore_glGetActiveUniformName@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEnableVertexArrayEXT -.type bluegl_glEnableVertexArrayEXT, %function -bluegl_glEnableVertexArrayEXT: - mov __blue_glCore_glEnableVertexArrayEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetUniformBlockIndex +.type bluegl_glGetUniformBlockIndex, %function +bluegl_glGetUniformBlockIndex: + mov __blue_glCore_glGetUniformBlockIndex@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glConvolutionFilter1DEXT -.type bluegl_glConvolutionFilter1DEXT, %function -bluegl_glConvolutionFilter1DEXT: - mov __blue_glCore_glConvolutionFilter1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetActiveUniformBlockiv +.type bluegl_glGetActiveUniformBlockiv, %function +bluegl_glGetActiveUniformBlockiv: + mov __blue_glCore_glGetActiveUniformBlockiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMemoryBarrierEXT -.type bluegl_glMemoryBarrierEXT, %function -bluegl_glMemoryBarrierEXT: - mov __blue_glCore_glMemoryBarrierEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetActiveUniformBlockName +.type bluegl_glGetActiveUniformBlockName, %function +bluegl_glGetActiveUniformBlockName: + mov __blue_glCore_glGetActiveUniformBlockName@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNewObjectBufferATI -.type bluegl_glNewObjectBufferATI, %function -bluegl_glNewObjectBufferATI: - mov __blue_glCore_glNewObjectBufferATI@GOTPCREL(%rip), %r11 +.global bluegl_glUniformBlockBinding +.type bluegl_glUniformBlockBinding, %function +bluegl_glUniformBlockBinding: + mov __blue_glCore_glUniformBlockBinding@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2fv -.type bluegl_glProgramUniform2fv, %function -bluegl_glProgramUniform2fv: - mov __blue_glCore_glProgramUniform2fv@GOTPCREL(%rip), %r11 +.global bluegl_glDrawElementsBaseVertex +.type bluegl_glDrawElementsBaseVertex, %function +bluegl_glDrawElementsBaseVertex: + mov __blue_glCore_glDrawElementsBaseVertex@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix4x3fv -.type bluegl_glUniformMatrix4x3fv, %function -bluegl_glUniformMatrix4x3fv: - mov __blue_glCore_glUniformMatrix4x3fv@GOTPCREL(%rip), %r11 +.global bluegl_glDrawRangeElementsBaseVertex +.type bluegl_glDrawRangeElementsBaseVertex, %function +bluegl_glDrawRangeElementsBaseVertex: + mov __blue_glCore_glDrawRangeElementsBaseVertex@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetHistogramParameterfv -.type bluegl_glGetHistogramParameterfv, %function -bluegl_glGetHistogramParameterfv: - mov __blue_glCore_glGetHistogramParameterfv@GOTPCREL(%rip), %r11 +.global bluegl_glDrawElementsInstancedBaseVertex +.type bluegl_glDrawElementsInstancedBaseVertex, %function +bluegl_glDrawElementsInstancedBaseVertex: + mov __blue_glCore_glDrawElementsInstancedBaseVertex@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFrameTerminatorGREMEDY -.type bluegl_glFrameTerminatorGREMEDY, %function -bluegl_glFrameTerminatorGREMEDY: - mov __blue_glCore_glFrameTerminatorGREMEDY@GOTPCREL(%rip), %r11 +.global bluegl_glMultiDrawElementsBaseVertex +.type bluegl_glMultiDrawElementsBaseVertex, %function +bluegl_glMultiDrawElementsBaseVertex: + mov __blue_glCore_glMultiDrawElementsBaseVertex@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramLocalParameterfvARB -.type bluegl_glGetProgramLocalParameterfvARB, %function -bluegl_glGetProgramLocalParameterfvARB: - mov __blue_glCore_glGetProgramLocalParameterfvARB@GOTPCREL(%rip), %r11 +.global bluegl_glProvokingVertex +.type bluegl_glProvokingVertex, %function +bluegl_glProvokingVertex: + mov __blue_glCore_glProvokingVertex@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUnmapNamedBuffer -.type bluegl_glUnmapNamedBuffer, %function -bluegl_glUnmapNamedBuffer: - mov __blue_glCore_glUnmapNamedBuffer@GOTPCREL(%rip), %r11 +.global bluegl_glFenceSync +.type bluegl_glFenceSync, %function +bluegl_glFenceSync: + mov __blue_glCore_glFenceSync@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2svARB -.type bluegl_glWindowPos2svARB, %function -bluegl_glWindowPos2svARB: - mov __blue_glCore_glWindowPos2svARB@GOTPCREL(%rip), %r11 +.global bluegl_glIsSync +.type bluegl_glIsSync, %function +bluegl_glIsSync: + mov __blue_glCore_glIsSync@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindTextureEXT -.type bluegl_glBindTextureEXT, %function -bluegl_glBindTextureEXT: - mov __blue_glCore_glBindTextureEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteSync +.type bluegl_glDeleteSync, %function +bluegl_glDeleteSync: + mov __blue_glCore_glDeleteSync@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4svNV -.type bluegl_glVertexAttrib4svNV, %function -bluegl_glVertexAttrib4svNV: - mov __blue_glCore_glVertexAttrib4svNV@GOTPCREL(%rip), %r11 +.global bluegl_glClientWaitSync +.type bluegl_glClientWaitSync, %function +bluegl_glClientWaitSync: + mov __blue_glCore_glClientWaitSync@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPointParameterfSGIS -.type bluegl_glPointParameterfSGIS, %function -bluegl_glPointParameterfSGIS: - mov __blue_glCore_glPointParameterfSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glWaitSync +.type bluegl_glWaitSync, %function +bluegl_glWaitSync: + mov __blue_glCore_glWaitSync@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3hvNV -.type bluegl_glSecondaryColor3hvNV, %function -bluegl_glSecondaryColor3hvNV: - mov __blue_glCore_glSecondaryColor3hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetInteger64v +.type bluegl_glGetInteger64v, %function +bluegl_glGetInteger64v: + mov __blue_glCore_glGetInteger64v@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorTableParameterfv -.type bluegl_glColorTableParameterfv, %function -bluegl_glColorTableParameterfv: - mov __blue_glCore_glColorTableParameterfv@GOTPCREL(%rip), %r11 +.global bluegl_glGetSynciv +.type bluegl_glGetSynciv, %function +bluegl_glGetSynciv: + mov __blue_glCore_glGetSynciv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedProgramLocalParameter4fEXT -.type bluegl_glNamedProgramLocalParameter4fEXT, %function -bluegl_glNamedProgramLocalParameter4fEXT: - mov __blue_glCore_glNamedProgramLocalParameter4fEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetInteger64i_v +.type bluegl_glGetInteger64i_v, %function +bluegl_glGetInteger64i_v: + mov __blue_glCore_glGetInteger64i_v@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureParameterivEXT -.type bluegl_glGetTextureParameterivEXT, %function -bluegl_glGetTextureParameterivEXT: - mov __blue_glCore_glGetTextureParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetBufferParameteri64v +.type bluegl_glGetBufferParameteri64v, %function +bluegl_glGetBufferParameteri64v: + mov __blue_glCore_glGetBufferParameteri64v@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTestObjectAPPLE -.type bluegl_glTestObjectAPPLE, %function -bluegl_glTestObjectAPPLE: - mov __blue_glCore_glTestObjectAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferTexture +.type bluegl_glFramebufferTexture, %function +bluegl_glFramebufferTexture: + mov __blue_glCore_glFramebufferTexture@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetIntegerui64vNV -.type bluegl_glGetIntegerui64vNV, %function -bluegl_glGetIntegerui64vNV: - mov __blue_glCore_glGetIntegerui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glTexImage2DMultisample +.type bluegl_glTexImage2DMultisample, %function +bluegl_glTexImage2DMultisample: + mov __blue_glCore_glTexImage2DMultisample@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsVertexAttribEnabledAPPLE -.type bluegl_glIsVertexAttribEnabledAPPLE, %function -bluegl_glIsVertexAttribEnabledAPPLE: - mov __blue_glCore_glIsVertexAttribEnabledAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glTexImage3DMultisample +.type bluegl_glTexImage3DMultisample, %function +bluegl_glTexImage3DMultisample: + mov __blue_glCore_glTexImage3DMultisample@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glActiveTextureARB -.type bluegl_glActiveTextureARB, %function -bluegl_glActiveTextureARB: - mov __blue_glCore_glActiveTextureARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetMultisamplefv +.type bluegl_glGetMultisamplefv, %function +bluegl_glGetMultisamplefv: + mov __blue_glCore_glGetMultisamplefv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3dARB -.type bluegl_glVertexAttrib3dARB, %function -bluegl_glVertexAttrib3dARB: - mov __blue_glCore_glVertexAttrib3dARB@GOTPCREL(%rip), %r11 +.global bluegl_glSampleMaski +.type bluegl_glSampleMaski, %function +bluegl_glSampleMaski: + mov __blue_glCore_glSampleMaski@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureHandleARB -.type bluegl_glGetTextureHandleARB, %function -bluegl_glGetTextureHandleARB: - mov __blue_glCore_glGetTextureHandleARB@GOTPCREL(%rip), %r11 +.global bluegl_glBindFragDataLocationIndexed +.type bluegl_glBindFragDataLocationIndexed, %function +bluegl_glBindFragDataLocationIndexed: + mov __blue_glCore_glBindFragDataLocationIndexed@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetColorTableEXT -.type bluegl_glGetColorTableEXT, %function -bluegl_glGetColorTableEXT: - mov __blue_glCore_glGetColorTableEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetFragDataIndex +.type bluegl_glGetFragDataIndex, %function +bluegl_glGetFragDataIndex: + mov __blue_glCore_glGetFragDataIndex@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawArraysEXT -.type bluegl_glDrawArraysEXT, %function -bluegl_glDrawArraysEXT: - mov __blue_glCore_glDrawArraysEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGenSamplers +.type bluegl_glGenSamplers, %function +bluegl_glGenSamplers: + mov __blue_glCore_glGenSamplers@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glImageTransformParameterfHP -.type bluegl_glImageTransformParameterfHP, %function -bluegl_glImageTransformParameterfHP: - mov __blue_glCore_glImageTransformParameterfHP@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteSamplers +.type bluegl_glDeleteSamplers, %function +bluegl_glDeleteSamplers: + mov __blue_glCore_glDeleteSamplers@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glActiveStencilFaceEXT -.type bluegl_glActiveStencilFaceEXT, %function -bluegl_glActiveStencilFaceEXT: - mov __blue_glCore_glActiveStencilFaceEXT@GOTPCREL(%rip), %r11 +.global bluegl_glIsSampler +.type bluegl_glIsSampler, %function +bluegl_glIsSampler: + mov __blue_glCore_glIsSampler@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix3x4dv -.type bluegl_glUniformMatrix3x4dv, %function -bluegl_glUniformMatrix3x4dv: - mov __blue_glCore_glUniformMatrix3x4dv@GOTPCREL(%rip), %r11 +.global bluegl_glBindSampler +.type bluegl_glBindSampler, %function +bluegl_glBindSampler: + mov __blue_glCore_glBindSampler@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4i64ARB -.type bluegl_glProgramUniform4i64ARB, %function -bluegl_glProgramUniform4i64ARB: - mov __blue_glCore_glProgramUniform4i64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glSamplerParameteri +.type bluegl_glSamplerParameteri, %function +bluegl_glSamplerParameteri: + mov __blue_glCore_glSamplerParameteri@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3iv -.type bluegl_glUniform3iv, %function -bluegl_glUniform3iv: - mov __blue_glCore_glUniform3iv@GOTPCREL(%rip), %r11 +.global bluegl_glSamplerParameteriv +.type bluegl_glSamplerParameteriv, %function +bluegl_glSamplerParameteriv: + mov __blue_glCore_glSamplerParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPerfMonitorCountersAMD -.type bluegl_glGetPerfMonitorCountersAMD, %function -bluegl_glGetPerfMonitorCountersAMD: - mov __blue_glCore_glGetPerfMonitorCountersAMD@GOTPCREL(%rip), %r11 +.global bluegl_glSamplerParameterf +.type bluegl_glSamplerParameterf, %function +bluegl_glSamplerParameterf: + mov __blue_glCore_glSamplerParameterf@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFinishFenceAPPLE -.type bluegl_glFinishFenceAPPLE, %function -bluegl_glFinishFenceAPPLE: - mov __blue_glCore_glFinishFenceAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glSamplerParameterfv +.type bluegl_glSamplerParameterfv, %function +bluegl_glSamplerParameterfv: + mov __blue_glCore_glSamplerParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4ivARB -.type bluegl_glUniform4ivARB, %function -bluegl_glUniform4ivARB: - mov __blue_glCore_glUniform4ivARB@GOTPCREL(%rip), %r11 +.global bluegl_glSamplerParameterIiv +.type bluegl_glSamplerParameterIiv, %function +bluegl_glSamplerParameterIiv: + mov __blue_glCore_glSamplerParameterIiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glRenderbufferStorageMultisampleEXT -.type bluegl_glRenderbufferStorageMultisampleEXT, %function -bluegl_glRenderbufferStorageMultisampleEXT: - mov __blue_glCore_glRenderbufferStorageMultisampleEXT@GOTPCREL(%rip), %r11 +.global bluegl_glSamplerParameterIuiv +.type bluegl_glSamplerParameterIuiv, %function +bluegl_glSamplerParameterIuiv: + mov __blue_glCore_glSamplerParameterIuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPointParameterfvARB -.type bluegl_glPointParameterfvARB, %function -bluegl_glPointParameterfvARB: - mov __blue_glCore_glPointParameterfvARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetSamplerParameteriv +.type bluegl_glGetSamplerParameteriv, %function +bluegl_glGetSamplerParameteriv: + mov __blue_glCore_glGetSamplerParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramLocalParameterI4uivNV -.type bluegl_glProgramLocalParameterI4uivNV, %function -bluegl_glProgramLocalParameterI4uivNV: - mov __blue_glCore_glProgramLocalParameterI4uivNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetSamplerParameterIiv +.type bluegl_glGetSamplerParameterIiv, %function +bluegl_glGetSamplerParameterIiv: + mov __blue_glCore_glGetSamplerParameterIiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeformSGIX -.type bluegl_glDeformSGIX, %function -bluegl_glDeformSGIX: - mov __blue_glCore_glDeformSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glGetSamplerParameterfv +.type bluegl_glGetSamplerParameterfv, %function +bluegl_glGetSamplerParameterfv: + mov __blue_glCore_glGetSamplerParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformHandleui64vNV -.type bluegl_glProgramUniformHandleui64vNV, %function -bluegl_glProgramUniformHandleui64vNV: - mov __blue_glCore_glProgramUniformHandleui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetSamplerParameterIuiv +.type bluegl_glGetSamplerParameterIuiv, %function +bluegl_glGetSamplerParameterIuiv: + mov __blue_glCore_glGetSamplerParameterIuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiDrawRangeElementArrayAPPLE -.type bluegl_glMultiDrawRangeElementArrayAPPLE, %function -bluegl_glMultiDrawRangeElementArrayAPPLE: - mov __blue_glCore_glMultiDrawRangeElementArrayAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glQueryCounter +.type bluegl_glQueryCounter, %function +bluegl_glQueryCounter: + mov __blue_glCore_glQueryCounter@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnUniformfvARB -.type bluegl_glGetnUniformfvARB, %function -bluegl_glGetnUniformfvARB: - mov __blue_glCore_glGetnUniformfvARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetQueryObjecti64v +.type bluegl_glGetQueryObjecti64v, %function +bluegl_glGetQueryObjecti64v: + mov __blue_glCore_glGetQueryObjecti64v@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribs3svNV -.type bluegl_glVertexAttribs3svNV, %function -bluegl_glVertexAttribs3svNV: - mov __blue_glCore_glVertexAttribs3svNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetQueryObjectui64v +.type bluegl_glGetQueryObjectui64v, %function +bluegl_glGetQueryObjectui64v: + mov __blue_glCore_glGetQueryObjectui64v@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1dvNV -.type bluegl_glVertexAttrib1dvNV, %function -bluegl_glVertexAttrib1dvNV: - mov __blue_glCore_glVertexAttrib1dvNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribDivisor +.type bluegl_glVertexAttribDivisor, %function +bluegl_glVertexAttribDivisor: + mov __blue_glCore_glVertexAttribDivisor@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream1fvATI -.type bluegl_glVertexStream1fvATI, %function -bluegl_glVertexStream1fvATI: - mov __blue_glCore_glVertexStream1fvATI@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribP1ui +.type bluegl_glVertexAttribP1ui, %function +bluegl_glVertexAttribP1ui: + mov __blue_glCore_glVertexAttribP1ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsProgramPipeline -.type bluegl_glIsProgramPipeline, %function -bluegl_glIsProgramPipeline: - mov __blue_glCore_glIsProgramPipeline@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribP1uiv +.type bluegl_glVertexAttribP1uiv, %function +bluegl_glVertexAttribP1uiv: + mov __blue_glCore_glVertexAttribP1uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetObjectBufferfvATI -.type bluegl_glGetObjectBufferfvATI, %function -bluegl_glGetObjectBufferfvATI: - mov __blue_glCore_glGetObjectBufferfvATI@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribP2ui +.type bluegl_glVertexAttribP2ui, %function +bluegl_glVertexAttribP2ui: + mov __blue_glCore_glVertexAttribP2ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBeginVertexShaderEXT -.type bluegl_glBeginVertexShaderEXT, %function -bluegl_glBeginVertexShaderEXT: - mov __blue_glCore_glBeginVertexShaderEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribP2uiv +.type bluegl_glVertexAttribP2uiv, %function +bluegl_glVertexAttribP2uiv: + mov __blue_glCore_glVertexAttribP2uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4svARB -.type bluegl_glVertexAttrib4svARB, %function -bluegl_glVertexAttrib4svARB: - mov __blue_glCore_glVertexAttrib4svARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribP3ui +.type bluegl_glVertexAttribP3ui, %function +bluegl_glVertexAttribP3ui: + mov __blue_glCore_glVertexAttribP3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2d -.type bluegl_glWindowPos2d, %function -bluegl_glWindowPos2d: - mov __blue_glCore_glWindowPos2d@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribP3uiv +.type bluegl_glVertexAttribP3uiv, %function +bluegl_glVertexAttribP3uiv: + mov __blue_glCore_glVertexAttribP3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWriteMaskEXT -.type bluegl_glWriteMaskEXT, %function -bluegl_glWriteMaskEXT: - mov __blue_glCore_glWriteMaskEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribP4ui +.type bluegl_glVertexAttribP4ui, %function +bluegl_glVertexAttribP4ui: + mov __blue_glCore_glVertexAttribP4ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawRangeElements -.type bluegl_glDrawRangeElements, %function -bluegl_glDrawRangeElements: - mov __blue_glCore_glDrawRangeElements@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribP4uiv +.type bluegl_glVertexAttribP4uiv, %function +bluegl_glVertexAttribP4uiv: + mov __blue_glCore_glVertexAttribP4uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFragDataIndex -.type bluegl_glGetFragDataIndex, %function -bluegl_glGetFragDataIndex: - mov __blue_glCore_glGetFragDataIndex@GOTPCREL(%rip), %r11 +.global bluegl_glMinSampleShading +.type bluegl_glMinSampleShading, %function +bluegl_glMinSampleShading: + mov __blue_glCore_glMinSampleShading@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteTransformFeedbacksNV -.type bluegl_glDeleteTransformFeedbacksNV, %function -bluegl_glDeleteTransformFeedbacksNV: - mov __blue_glCore_glDeleteTransformFeedbacksNV@GOTPCREL(%rip), %r11 +.global bluegl_glBlendEquationi +.type bluegl_glBlendEquationi, %function +bluegl_glBlendEquationi: + mov __blue_glCore_glBlendEquationi@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix2fvEXT -.type bluegl_glProgramUniformMatrix2fvEXT, %function -bluegl_glProgramUniformMatrix2fvEXT: - mov __blue_glCore_glProgramUniformMatrix2fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBlendEquationSeparatei +.type bluegl_glBlendEquationSeparatei, %function +bluegl_glBlendEquationSeparatei: + mov __blue_glCore_glBlendEquationSeparatei@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3ui -.type bluegl_glProgramUniform3ui, %function -bluegl_glProgramUniform3ui: - mov __blue_glCore_glProgramUniform3ui@GOTPCREL(%rip), %r11 +.global bluegl_glBlendFunci +.type bluegl_glBlendFunci, %function +bluegl_glBlendFunci: + mov __blue_glCore_glBlendFunci@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTransformFeedbacki_v -.type bluegl_glGetTransformFeedbacki_v, %function -bluegl_glGetTransformFeedbacki_v: - mov __blue_glCore_glGetTransformFeedbacki_v@GOTPCREL(%rip), %r11 +.global bluegl_glBlendFuncSeparatei +.type bluegl_glBlendFuncSeparatei, %function +bluegl_glBlendFuncSeparatei: + mov __blue_glCore_glBlendFuncSeparatei@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix3x2dv -.type bluegl_glUniformMatrix3x2dv, %function -bluegl_glUniformMatrix3x2dv: - mov __blue_glCore_glUniformMatrix3x2dv@GOTPCREL(%rip), %r11 +.global bluegl_glDrawArraysIndirect +.type bluegl_glDrawArraysIndirect, %function +bluegl_glDrawArraysIndirect: + mov __blue_glCore_glDrawArraysIndirect@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMapxvOES -.type bluegl_glGetMapxvOES, %function -bluegl_glGetMapxvOES: - mov __blue_glCore_glGetMapxvOES@GOTPCREL(%rip), %r11 +.global bluegl_glDrawElementsIndirect +.type bluegl_glDrawElementsIndirect, %function +bluegl_glDrawElementsIndirect: + mov __blue_glCore_glDrawElementsIndirect@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMemoryBarrierByRegion -.type bluegl_glMemoryBarrierByRegion, %function -bluegl_glMemoryBarrierByRegion: - mov __blue_glCore_glMemoryBarrierByRegion@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1d +.type bluegl_glUniform1d, %function +bluegl_glUniform1d: + mov __blue_glCore_glUniform1d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedFramebufferDrawBuffer -.type bluegl_glNamedFramebufferDrawBuffer, %function -bluegl_glNamedFramebufferDrawBuffer: - mov __blue_glCore_glNamedFramebufferDrawBuffer@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2d +.type bluegl_glUniform2d, %function +bluegl_glUniform2d: + mov __blue_glCore_glUniform2d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsBufferResidentNV -.type bluegl_glIsBufferResidentNV, %function -bluegl_glIsBufferResidentNV: - mov __blue_glCore_glIsBufferResidentNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3d +.type bluegl_glUniform3d, %function +bluegl_glUniform3d: + mov __blue_glCore_glUniform3d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStencilOpSeparate -.type bluegl_glStencilOpSeparate, %function -bluegl_glStencilOpSeparate: - mov __blue_glCore_glStencilOpSeparate@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4d +.type bluegl_glUniform4d, %function +bluegl_glUniform4d: + mov __blue_glCore_glUniform4d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glInvalidateNamedFramebufferSubData -.type bluegl_glInvalidateNamedFramebufferSubData, %function -bluegl_glInvalidateNamedFramebufferSubData: - mov __blue_glCore_glInvalidateNamedFramebufferSubData@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1dv +.type bluegl_glUniform1dv, %function +bluegl_glUniform1dv: + mov __blue_glCore_glUniform1dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColor3hNV -.type bluegl_glColor3hNV, %function -bluegl_glColor3hNV: - mov __blue_glCore_glColor3hNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2dv +.type bluegl_glUniform2dv, %function +bluegl_glUniform2dv: + mov __blue_glCore_glUniform2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureMaterialEXT -.type bluegl_glTextureMaterialEXT, %function -bluegl_glTextureMaterialEXT: - mov __blue_glCore_glTextureMaterialEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3dv +.type bluegl_glUniform3dv, %function +bluegl_glUniform3dv: + mov __blue_glCore_glUniform3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTextureSubImage2D -.type bluegl_glCompressedTextureSubImage2D, %function -bluegl_glCompressedTextureSubImage2D: - mov __blue_glCore_glCompressedTextureSubImage2D@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4dv +.type bluegl_glUniform4dv, %function +bluegl_glUniform4dv: + mov __blue_glCore_glUniform4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexGeniEXT -.type bluegl_glMultiTexGeniEXT, %function -bluegl_glMultiTexGeniEXT: - mov __blue_glCore_glMultiTexGeniEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix2dv +.type bluegl_glUniformMatrix2dv, %function +bluegl_glUniformMatrix2dv: + mov __blue_glCore_glUniformMatrix2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3usvEXT -.type bluegl_glSecondaryColor3usvEXT, %function -bluegl_glSecondaryColor3usvEXT: - mov __blue_glCore_glSecondaryColor3usvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix3dv +.type bluegl_glUniformMatrix3dv, %function +bluegl_glUniformMatrix3dv: + mov __blue_glCore_glUniformMatrix3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramResourceName -.type bluegl_glGetProgramResourceName, %function -bluegl_glGetProgramResourceName: - mov __blue_glCore_glGetProgramResourceName@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix4dv +.type bluegl_glUniformMatrix4dv, %function +bluegl_glUniformMatrix4dv: + mov __blue_glCore_glUniformMatrix4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureStorageSparseAMD -.type bluegl_glTextureStorageSparseAMD, %function -bluegl_glTextureStorageSparseAMD: - mov __blue_glCore_glTextureStorageSparseAMD@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix2x3dv +.type bluegl_glUniformMatrix2x3dv, %function +bluegl_glUniformMatrix2x3dv: + mov __blue_glCore_glUniformMatrix2x3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPixelStorei -.type bluegl_glPixelStorei, %function -bluegl_glPixelStorei: - mov __blue_glCore_glPixelStorei@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix2x4dv +.type bluegl_glUniformMatrix2x4dv, %function +bluegl_glUniformMatrix2x4dv: + mov __blue_glCore_glUniformMatrix2x4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetBooleani_v -.type bluegl_glGetBooleani_v, %function -bluegl_glGetBooleani_v: - mov __blue_glCore_glGetBooleani_v@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix3x2dv +.type bluegl_glUniformMatrix3x2dv, %function +bluegl_glUniformMatrix3x2dv: + mov __blue_glCore_glUniformMatrix3x2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPathCoordsNV -.type bluegl_glGetPathCoordsNV, %function -bluegl_glGetPathCoordsNV: - mov __blue_glCore_glGetPathCoordsNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix3x4dv +.type bluegl_glUniformMatrix3x4dv, %function +bluegl_glUniformMatrix3x4dv: + mov __blue_glCore_glUniformMatrix3x4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3svNV -.type bluegl_glVertexAttrib3svNV, %function -bluegl_glVertexAttrib3svNV: - mov __blue_glCore_glVertexAttrib3svNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix4x2dv +.type bluegl_glUniformMatrix4x2dv, %function +bluegl_glUniformMatrix4x2dv: + mov __blue_glCore_glUniformMatrix4x2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformui64NV -.type bluegl_glUniformui64NV, %function -bluegl_glUniformui64NV: - mov __blue_glCore_glUniformui64NV@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix4x3dv +.type bluegl_glUniformMatrix4x3dv, %function +bluegl_glUniformMatrix4x3dv: + mov __blue_glCore_glUniformMatrix4x3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsImageHandleResidentNV -.type bluegl_glIsImageHandleResidentNV, %function -bluegl_glIsImageHandleResidentNV: - mov __blue_glCore_glIsImageHandleResidentNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetUniformdv +.type bluegl_glGetUniformdv, %function +bluegl_glGetUniformdv: + mov __blue_glCore_glGetUniformdv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBeginConditionalRenderNV -.type bluegl_glBeginConditionalRenderNV, %function -bluegl_glBeginConditionalRenderNV: - mov __blue_glCore_glBeginConditionalRenderNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetSubroutineUniformLocation +.type bluegl_glGetSubroutineUniformLocation, %function +bluegl_glGetSubroutineUniformLocation: + mov __blue_glCore_glGetSubroutineUniformLocation@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedFramebufferParameteriEXT -.type bluegl_glNamedFramebufferParameteriEXT, %function -bluegl_glNamedFramebufferParameteriEXT: - mov __blue_glCore_glNamedFramebufferParameteriEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetSubroutineIndex +.type bluegl_glGetSubroutineIndex, %function +bluegl_glGetSubroutineIndex: + mov __blue_glCore_glGetSubroutineIndex@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsVertexArrayAPPLE -.type bluegl_glIsVertexArrayAPPLE, %function -bluegl_glIsVertexArrayAPPLE: - mov __blue_glCore_glIsVertexArrayAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glGetActiveSubroutineUniformiv +.type bluegl_glGetActiveSubroutineUniformiv, %function +bluegl_glGetActiveSubroutineUniformiv: + mov __blue_glCore_glGetActiveSubroutineUniformiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPointParameterfvEXT -.type bluegl_glPointParameterfvEXT, %function -bluegl_glPointParameterfvEXT: - mov __blue_glCore_glPointParameterfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetActiveSubroutineUniformName +.type bluegl_glGetActiveSubroutineUniformName, %function +bluegl_glGetActiveSubroutineUniformName: + mov __blue_glCore_glGetActiveSubroutineUniformName@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnMapfvARB -.type bluegl_glGetnMapfvARB, %function -bluegl_glGetnMapfvARB: - mov __blue_glCore_glGetnMapfvARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetActiveSubroutineName +.type bluegl_glGetActiveSubroutineName, %function +bluegl_glGetActiveSubroutineName: + mov __blue_glCore_glGetActiveSubroutineName@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyColorSubTable -.type bluegl_glCopyColorSubTable, %function -bluegl_glCopyColorSubTable: - mov __blue_glCore_glCopyColorSubTable@GOTPCREL(%rip), %r11 +.global bluegl_glUniformSubroutinesuiv +.type bluegl_glUniformSubroutinesuiv, %function +bluegl_glUniformSubroutinesuiv: + mov __blue_glCore_glUniformSubroutinesuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVariantbvEXT -.type bluegl_glVariantbvEXT, %function -bluegl_glVariantbvEXT: - mov __blue_glCore_glVariantbvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetUniformSubroutineuiv +.type bluegl_glGetUniformSubroutineuiv, %function +bluegl_glGetUniformSubroutineuiv: + mov __blue_glCore_glGetUniformSubroutineuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureParameterIuiv -.type bluegl_glTextureParameterIuiv, %function -bluegl_glTextureParameterIuiv: - mov __blue_glCore_glTextureParameterIuiv@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramStageiv +.type bluegl_glGetProgramStageiv, %function +bluegl_glGetProgramStageiv: + mov __blue_glCore_glGetProgramStageiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPNTrianglesiATI -.type bluegl_glPNTrianglesiATI, %function -bluegl_glPNTrianglesiATI: - mov __blue_glCore_glPNTrianglesiATI@GOTPCREL(%rip), %r11 +.global bluegl_glPatchParameteri +.type bluegl_glPatchParameteri, %function +bluegl_glPatchParameteri: + mov __blue_glCore_glPatchParameteri@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendFunc -.type bluegl_glBlendFunc, %function -bluegl_glBlendFunc: - mov __blue_glCore_glBlendFunc@GOTPCREL(%rip), %r11 +.global bluegl_glPatchParameterfv +.type bluegl_glPatchParameterfv, %function +bluegl_glPatchParameterfv: + mov __blue_glCore_glPatchParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4uiv -.type bluegl_glVertexAttrib4uiv, %function -bluegl_glVertexAttrib4uiv: - mov __blue_glCore_glVertexAttrib4uiv@GOTPCREL(%rip), %r11 +.global bluegl_glBindTransformFeedback +.type bluegl_glBindTransformFeedback, %function +bluegl_glBindTransformFeedback: + mov __blue_glCore_glBindTransformFeedback@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2ui -.type bluegl_glUniform2ui, %function -bluegl_glUniform2ui: - mov __blue_glCore_glUniform2ui@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteTransformFeedbacks +.type bluegl_glDeleteTransformFeedbacks, %function +bluegl_glDeleteTransformFeedbacks: + mov __blue_glCore_glDeleteTransformFeedbacks@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendColor -.type bluegl_glBlendColor, %function -bluegl_glBlendColor: - mov __blue_glCore_glBlendColor@GOTPCREL(%rip), %r11 +.global bluegl_glGenTransformFeedbacks +.type bluegl_glGenTransformFeedbacks, %function +bluegl_glGenTransformFeedbacks: + mov __blue_glCore_glGenTransformFeedbacks@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glViewport -.type bluegl_glViewport, %function -bluegl_glViewport: - mov __blue_glCore_glViewport@GOTPCREL(%rip), %r11 +.global bluegl_glIsTransformFeedback +.type bluegl_glIsTransformFeedback, %function +bluegl_glIsTransformFeedback: + mov __blue_glCore_glIsTransformFeedback@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2fvARB -.type bluegl_glWindowPos2fvARB, %function -bluegl_glWindowPos2fvARB: - mov __blue_glCore_glWindowPos2fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glPauseTransformFeedback +.type bluegl_glPauseTransformFeedback, %function +bluegl_glPauseTransformFeedback: + mov __blue_glCore_glPauseTransformFeedback@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSampleCoverage -.type bluegl_glSampleCoverage, %function -bluegl_glSampleCoverage: - mov __blue_glCore_glSampleCoverage@GOTPCREL(%rip), %r11 +.global bluegl_glResumeTransformFeedback +.type bluegl_glResumeTransformFeedback, %function +bluegl_glResumeTransformFeedback: + mov __blue_glCore_glResumeTransformFeedback@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3ubv -.type bluegl_glSecondaryColor3ubv, %function -bluegl_glSecondaryColor3ubv: - mov __blue_glCore_glSecondaryColor3ubv@GOTPCREL(%rip), %r11 +.global bluegl_glDrawTransformFeedback +.type bluegl_glDrawTransformFeedback, %function +bluegl_glDrawTransformFeedback: + mov __blue_glCore_glDrawTransformFeedback@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColor4xOES -.type bluegl_glColor4xOES, %function -bluegl_glColor4xOES: - mov __blue_glCore_glColor4xOES@GOTPCREL(%rip), %r11 +.global bluegl_glDrawTransformFeedbackStream +.type bluegl_glDrawTransformFeedbackStream, %function +bluegl_glDrawTransformFeedbackStream: + mov __blue_glCore_glDrawTransformFeedbackStream@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL1dEXT -.type bluegl_glVertexAttribL1dEXT, %function -bluegl_glVertexAttribL1dEXT: - mov __blue_glCore_glVertexAttribL1dEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBeginQueryIndexed +.type bluegl_glBeginQueryIndexed, %function +bluegl_glBeginQueryIndexed: + mov __blue_glCore_glBeginQueryIndexed@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultTransposeMatrixf -.type bluegl_glMultTransposeMatrixf, %function -bluegl_glMultTransposeMatrixf: - mov __blue_glCore_glMultTransposeMatrixf@GOTPCREL(%rip), %r11 +.global bluegl_glEndQueryIndexed +.type bluegl_glEndQueryIndexed, %function +bluegl_glEndQueryIndexed: + mov __blue_glCore_glEndQueryIndexed@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexArrayIntegeri_vEXT -.type bluegl_glGetVertexArrayIntegeri_vEXT, %function -bluegl_glGetVertexArrayIntegeri_vEXT: - mov __blue_glCore_glGetVertexArrayIntegeri_vEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetQueryIndexediv +.type bluegl_glGetQueryIndexediv, %function +bluegl_glGetQueryIndexediv: + mov __blue_glCore_glGetQueryIndexediv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCullParameterfvEXT -.type bluegl_glCullParameterfvEXT, %function -bluegl_glCullParameterfvEXT: - mov __blue_glCore_glCullParameterfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glReleaseShaderCompiler +.type bluegl_glReleaseShaderCompiler, %function +bluegl_glReleaseShaderCompiler: + mov __blue_glCore_glReleaseShaderCompiler@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMapNamedBufferRangeEXT -.type bluegl_glMapNamedBufferRangeEXT, %function -bluegl_glMapNamedBufferRangeEXT: - mov __blue_glCore_glMapNamedBufferRangeEXT@GOTPCREL(%rip), %r11 +.global bluegl_glShaderBinary +.type bluegl_glShaderBinary, %function +bluegl_glShaderBinary: + mov __blue_glCore_glShaderBinary@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureImage3DEXT -.type bluegl_glTextureImage3DEXT, %function -bluegl_glTextureImage3DEXT: - mov __blue_glCore_glTextureImage3DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetShaderPrecisionFormat +.type bluegl_glGetShaderPrecisionFormat, %function +bluegl_glGetShaderPrecisionFormat: + mov __blue_glCore_glGetShaderPrecisionFormat@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBufferAddressRangeNV -.type bluegl_glBufferAddressRangeNV, %function -bluegl_glBufferAddressRangeNV: - mov __blue_glCore_glBufferAddressRangeNV@GOTPCREL(%rip), %r11 +.global bluegl_glDepthRangef +.type bluegl_glDepthRangef, %function +bluegl_glDepthRangef: + mov __blue_glCore_glDepthRangef@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribdv -.type bluegl_glGetVertexAttribdv, %function -bluegl_glGetVertexAttribdv: - mov __blue_glCore_glGetVertexAttribdv@GOTPCREL(%rip), %r11 +.global bluegl_glClearDepthf +.type bluegl_glClearDepthf, %function +bluegl_glClearDepthf: + mov __blue_glCore_glClearDepthf@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedFramebufferSampleLocationsfvARB -.type bluegl_glNamedFramebufferSampleLocationsfvARB, %function -bluegl_glNamedFramebufferSampleLocationsfvARB: - mov __blue_glCore_glNamedFramebufferSampleLocationsfvARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramBinary +.type bluegl_glGetProgramBinary, %function +bluegl_glGetProgramBinary: + mov __blue_glCore_glGetProgramBinary@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2i -.type bluegl_glMultiTexCoord2i, %function -bluegl_glMultiTexCoord2i: - mov __blue_glCore_glMultiTexCoord2i@GOTPCREL(%rip), %r11 +.global bluegl_glProgramBinary +.type bluegl_glProgramBinary, %function +bluegl_glProgramBinary: + mov __blue_glCore_glProgramBinary@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindFramebufferEXT -.type bluegl_glBindFramebufferEXT, %function -bluegl_glBindFramebufferEXT: - mov __blue_glCore_glBindFramebufferEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramParameteri +.type bluegl_glProgramParameteri, %function +bluegl_glProgramParameteri: + mov __blue_glCore_glProgramParameteri@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexParameterfv -.type bluegl_glTexParameterfv, %function -bluegl_glTexParameterfv: - mov __blue_glCore_glTexParameterfv@GOTPCREL(%rip), %r11 +.global bluegl_glUseProgramStages +.type bluegl_glUseProgramStages, %function +bluegl_glUseProgramStages: + mov __blue_glCore_glUseProgramStages@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramNamedParameterfvNV -.type bluegl_glGetProgramNamedParameterfvNV, %function -bluegl_glGetProgramNamedParameterfvNV: - mov __blue_glCore_glGetProgramNamedParameterfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glActiveShaderProgram +.type bluegl_glActiveShaderProgram, %function +bluegl_glActiveShaderProgram: + mov __blue_glCore_glActiveShaderProgram@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureStorage3DEXT -.type bluegl_glTextureStorage3DEXT, %function -bluegl_glTextureStorage3DEXT: - mov __blue_glCore_glTextureStorage3DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCreateShaderProgramv +.type bluegl_glCreateShaderProgramv, %function +bluegl_glCreateShaderProgramv: + mov __blue_glCore_glCreateShaderProgramv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetDebugMessageLogAMD -.type bluegl_glGetDebugMessageLogAMD, %function -bluegl_glGetDebugMessageLogAMD: - mov __blue_glCore_glGetDebugMessageLogAMD@GOTPCREL(%rip), %r11 +.global bluegl_glBindProgramPipeline +.type bluegl_glBindProgramPipeline, %function +bluegl_glBindProgramPipeline: + mov __blue_glCore_glBindProgramPipeline@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord1hvNV -.type bluegl_glTexCoord1hvNV, %function -bluegl_glTexCoord1hvNV: - mov __blue_glCore_glTexCoord1hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteProgramPipelines +.type bluegl_glDeleteProgramPipelines, %function +bluegl_glDeleteProgramPipelines: + mov __blue_glCore_glDeleteProgramPipelines@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glRenderbufferStorageMultisampleCoverageNV -.type bluegl_glRenderbufferStorageMultisampleCoverageNV, %function -bluegl_glRenderbufferStorageMultisampleCoverageNV: - mov __blue_glCore_glRenderbufferStorageMultisampleCoverageNV@GOTPCREL(%rip), %r11 +.global bluegl_glGenProgramPipelines +.type bluegl_glGenProgramPipelines, %function +bluegl_glGenProgramPipelines: + mov __blue_glCore_glGenProgramPipelines@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3i64vARB -.type bluegl_glProgramUniform3i64vARB, %function -bluegl_glProgramUniform3i64vARB: - mov __blue_glCore_glProgramUniform3i64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glIsProgramPipeline +.type bluegl_glIsProgramPipeline, %function +bluegl_glIsProgramPipeline: + mov __blue_glCore_glIsProgramPipeline@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFragmentMaterialfvSGIX -.type bluegl_glFragmentMaterialfvSGIX, %function -bluegl_glFragmentMaterialfvSGIX: - mov __blue_glCore_glFragmentMaterialfvSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramPipelineiv +.type bluegl_glGetProgramPipelineiv, %function +bluegl_glGetProgramPipelineiv: + mov __blue_glCore_glGetProgramPipelineiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetImageHandleARB -.type bluegl_glGetImageHandleARB, %function -bluegl_glGetImageHandleARB: - mov __blue_glCore_glGetImageHandleARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1i +.type bluegl_glProgramUniform1i, %function +bluegl_glProgramUniform1i: + mov __blue_glCore_glProgramUniform1i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribs3fvNV -.type bluegl_glVertexAttribs3fvNV, %function -bluegl_glVertexAttribs3fvNV: - mov __blue_glCore_glVertexAttribs3fvNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1iv +.type bluegl_glProgramUniform1iv, %function +bluegl_glProgramUniform1iv: + mov __blue_glCore_glProgramUniform1iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexSubImage4DSGIS -.type bluegl_glTexSubImage4DSGIS, %function -bluegl_glTexSubImage4DSGIS: - mov __blue_glCore_glTexSubImage4DSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1f +.type bluegl_glProgramUniform1f, %function +bluegl_glProgramUniform1f: + mov __blue_glCore_glProgramUniform1f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glListParameteriSGIX -.type bluegl_glListParameteriSGIX, %function -bluegl_glListParameteriSGIX: - mov __blue_glCore_glListParameteriSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1fv +.type bluegl_glProgramUniform1fv, %function +bluegl_glProgramUniform1fv: + mov __blue_glCore_glProgramUniform1fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPixelTransformParameterfEXT -.type bluegl_glPixelTransformParameterfEXT, %function -bluegl_glPixelTransformParameterfEXT: - mov __blue_glCore_glPixelTransformParameterfEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1d +.type bluegl_glProgramUniform1d, %function +bluegl_glProgramUniform1d: + mov __blue_glCore_glProgramUniform1d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMapParameterfvNV -.type bluegl_glMapParameterfvNV, %function -bluegl_glMapParameterfvNV: - mov __blue_glCore_glMapParameterfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1dv +.type bluegl_glProgramUniform1dv, %function +bluegl_glProgramUniform1dv: + mov __blue_glCore_glProgramUniform1dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3dv -.type bluegl_glProgramUniform3dv, %function -bluegl_glProgramUniform3dv: - mov __blue_glCore_glProgramUniform3dv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1ui +.type bluegl_glProgramUniform1ui, %function +bluegl_glProgramUniform1ui: + mov __blue_glCore_glProgramUniform1ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix3fv -.type bluegl_glUniformMatrix3fv, %function -bluegl_glUniformMatrix3fv: - mov __blue_glCore_glUniformMatrix3fv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1uiv +.type bluegl_glProgramUniform1uiv, %function +bluegl_glProgramUniform1uiv: + mov __blue_glCore_glProgramUniform1uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4fEXT -.type bluegl_glProgramUniform4fEXT, %function -bluegl_glProgramUniform4fEXT: - mov __blue_glCore_glProgramUniform4fEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2i +.type bluegl_glProgramUniform2i, %function +bluegl_glProgramUniform2i: + mov __blue_glCore_glProgramUniform2i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2hNV -.type bluegl_glMultiTexCoord2hNV, %function -bluegl_glMultiTexCoord2hNV: - mov __blue_glCore_glMultiTexCoord2hNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2iv +.type bluegl_glProgramUniform2iv, %function +bluegl_glProgramUniform2iv: + mov __blue_glCore_glProgramUniform2iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI4uiv -.type bluegl_glVertexAttribI4uiv, %function -bluegl_glVertexAttribI4uiv: - mov __blue_glCore_glVertexAttribI4uiv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2f +.type bluegl_glProgramUniform2f, %function +bluegl_glProgramUniform2f: + mov __blue_glCore_glProgramUniform2f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3b -.type bluegl_glSecondaryColor3b, %function -bluegl_glSecondaryColor3b: - mov __blue_glCore_glSecondaryColor3b@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2fv +.type bluegl_glProgramUniform2fv, %function +bluegl_glProgramUniform2fv: + mov __blue_glCore_glProgramUniform2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFogxvOES -.type bluegl_glFogxvOES, %function -bluegl_glFogxvOES: - mov __blue_glCore_glFogxvOES@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2d +.type bluegl_glProgramUniform2d, %function +bluegl_glProgramUniform2d: + mov __blue_glCore_glProgramUniform2d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGlobalAlphaFactorubSUN -.type bluegl_glGlobalAlphaFactorubSUN, %function -bluegl_glGlobalAlphaFactorubSUN: - mov __blue_glCore_glGlobalAlphaFactorubSUN@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2dv +.type bluegl_glProgramUniform2dv, %function +bluegl_glProgramUniform2dv: + mov __blue_glCore_glProgramUniform2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI4svEXT -.type bluegl_glVertexAttribI4svEXT, %function -bluegl_glVertexAttribI4svEXT: - mov __blue_glCore_glVertexAttribI4svEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2ui +.type bluegl_glProgramUniform2ui, %function +bluegl_glProgramUniform2ui: + mov __blue_glCore_glProgramUniform2ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3sv -.type bluegl_glSecondaryColor3sv, %function -bluegl_glSecondaryColor3sv: - mov __blue_glCore_glSecondaryColor3sv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2uiv +.type bluegl_glProgramUniform2uiv, %function +bluegl_glProgramUniform2uiv: + mov __blue_glCore_glProgramUniform2uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix2x3dvEXT -.type bluegl_glProgramUniformMatrix2x3dvEXT, %function -bluegl_glProgramUniformMatrix2x3dvEXT: - mov __blue_glCore_glProgramUniformMatrix2x3dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3i +.type bluegl_glProgramUniform3i, %function +bluegl_glProgramUniform3i: + mov __blue_glCore_glProgramUniform3i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureBarrier -.type bluegl_glTextureBarrier, %function -bluegl_glTextureBarrier: - mov __blue_glCore_glTextureBarrier@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3iv +.type bluegl_glProgramUniform3iv, %function +bluegl_glProgramUniform3iv: + mov __blue_glCore_glProgramUniform3iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreateSamplers -.type bluegl_glCreateSamplers, %function -bluegl_glCreateSamplers: - mov __blue_glCore_glCreateSamplers@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3f +.type bluegl_glProgramUniform3f, %function +bluegl_glProgramUniform3f: + mov __blue_glCore_glProgramUniform3f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribP2ui -.type bluegl_glVertexAttribP2ui, %function -bluegl_glVertexAttribP2ui: - mov __blue_glCore_glVertexAttribP2ui@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3fv +.type bluegl_glProgramUniform3fv, %function +bluegl_glProgramUniform3fv: + mov __blue_glCore_glProgramUniform3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTexParameterIiv -.type bluegl_glGetTexParameterIiv, %function -bluegl_glGetTexParameterIiv: - mov __blue_glCore_glGetTexParameterIiv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3d +.type bluegl_glProgramUniform3d, %function +bluegl_glProgramUniform3d: + mov __blue_glCore_glProgramUniform3d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glConvolutionParameterfvEXT -.type bluegl_glConvolutionParameterfvEXT, %function -bluegl_glConvolutionParameterfvEXT: - mov __blue_glCore_glConvolutionParameterfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3dv +.type bluegl_glProgramUniform3dv, %function +bluegl_glProgramUniform3dv: + mov __blue_glCore_glProgramUniform3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathGlyphIndexArrayNV -.type bluegl_glPathGlyphIndexArrayNV, %function -bluegl_glPathGlyphIndexArrayNV: - mov __blue_glCore_glPathGlyphIndexArrayNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3ui +.type bluegl_glProgramUniform3ui, %function +bluegl_glProgramUniform3ui: + mov __blue_glCore_glProgramUniform3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyTexSubImage2D -.type bluegl_glCopyTexSubImage2D, %function -bluegl_glCopyTexSubImage2D: - mov __blue_glCore_glCopyTexSubImage2D@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3uiv +.type bluegl_glProgramUniform3uiv, %function +bluegl_glProgramUniform3uiv: + mov __blue_glCore_glProgramUniform3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayParameteriAPPLE -.type bluegl_glVertexArrayParameteriAPPLE, %function -bluegl_glVertexArrayParameteriAPPLE: - mov __blue_glCore_glVertexArrayParameteriAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4i +.type bluegl_glProgramUniform4i, %function +bluegl_glProgramUniform4i: + mov __blue_glCore_glProgramUniform4i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnConvolutionFilterARB -.type bluegl_glGetnConvolutionFilterARB, %function -bluegl_glGetnConvolutionFilterARB: - mov __blue_glCore_glGetnConvolutionFilterARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4iv +.type bluegl_glProgramUniform4iv, %function +bluegl_glProgramUniform4iv: + mov __blue_glCore_glProgramUniform4iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVariantfvEXT -.type bluegl_glVariantfvEXT, %function -bluegl_glVariantfvEXT: - mov __blue_glCore_glVariantfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4f +.type bluegl_glProgramUniform4f, %function +bluegl_glProgramUniform4f: + mov __blue_glCore_glProgramUniform4f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMultisamplefvNV -.type bluegl_glGetMultisamplefvNV, %function -bluegl_glGetMultisamplefvNV: - mov __blue_glCore_glGetMultisamplefvNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4fv +.type bluegl_glProgramUniform4fv, %function +bluegl_glProgramUniform4fv: + mov __blue_glCore_glProgramUniform4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glQueryObjectParameteruiAMD -.type bluegl_glQueryObjectParameteruiAMD, %function -bluegl_glQueryObjectParameteruiAMD: - mov __blue_glCore_glQueryObjectParameteruiAMD@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4d +.type bluegl_glProgramUniform4d, %function +bluegl_glProgramUniform4d: + mov __blue_glCore_glProgramUniform4d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixIndexPointerARB -.type bluegl_glMatrixIndexPointerARB, %function -bluegl_glMatrixIndexPointerARB: - mov __blue_glCore_glMatrixIndexPointerARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4dv +.type bluegl_glProgramUniform4dv, %function +bluegl_glProgramUniform4dv: + mov __blue_glCore_glProgramUniform4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetQueryObjectuivARB -.type bluegl_glGetQueryObjectuivARB, %function -bluegl_glGetQueryObjectuivARB: - mov __blue_glCore_glGetQueryObjectuivARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4ui +.type bluegl_glProgramUniform4ui, %function +bluegl_glProgramUniform4ui: + mov __blue_glCore_glProgramUniform4ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorFormatNV -.type bluegl_glColorFormatNV, %function -bluegl_glColorFormatNV: - mov __blue_glCore_glColorFormatNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4uiv +.type bluegl_glProgramUniform4uiv, %function +bluegl_glProgramUniform4uiv: + mov __blue_glCore_glProgramUniform4uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexGenfvEXT -.type bluegl_glMultiTexGenfvEXT, %function -bluegl_glMultiTexGenfvEXT: - mov __blue_glCore_glMultiTexGenfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix2fv +.type bluegl_glProgramUniformMatrix2fv, %function +bluegl_glProgramUniformMatrix2fv: + mov __blue_glCore_glProgramUniformMatrix2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetUniformfvARB -.type bluegl_glGetUniformfvARB, %function -bluegl_glGetUniformfvARB: - mov __blue_glCore_glGetUniformfvARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix3fv +.type bluegl_glProgramUniformMatrix3fv, %function +bluegl_glProgramUniformMatrix3fv: + mov __blue_glCore_glProgramUniformMatrix3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord3hNV -.type bluegl_glTexCoord3hNV, %function -bluegl_glTexCoord3hNV: - mov __blue_glCore_glTexCoord3hNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix4fv +.type bluegl_glProgramUniformMatrix4fv, %function +bluegl_glProgramUniformMatrix4fv: + mov __blue_glCore_glProgramUniformMatrix4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathGlyphRangeNV -.type bluegl_glPathGlyphRangeNV, %function -bluegl_glPathGlyphRangeNV: - mov __blue_glCore_glPathGlyphRangeNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix2dv +.type bluegl_glProgramUniformMatrix2dv, %function +bluegl_glProgramUniformMatrix2dv: + mov __blue_glCore_glProgramUniformMatrix2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyTextureSubImage3DEXT -.type bluegl_glCopyTextureSubImage3DEXT, %function -bluegl_glCopyTextureSubImage3DEXT: - mov __blue_glCore_glCopyTextureSubImage3DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix3dv +.type bluegl_glProgramUniformMatrix3dv, %function +bluegl_glProgramUniformMatrix3dv: + mov __blue_glCore_glProgramUniformMatrix3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColor3xOES -.type bluegl_glColor3xOES, %function -bluegl_glColor3xOES: - mov __blue_glCore_glColor3xOES@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix4dv +.type bluegl_glProgramUniformMatrix4dv, %function +bluegl_glProgramUniformMatrix4dv: + mov __blue_glCore_glProgramUniformMatrix4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4hNV -.type bluegl_glVertexAttrib4hNV, %function -bluegl_glVertexAttrib4hNV: - mov __blue_glCore_glVertexAttrib4hNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix2x3fv +.type bluegl_glProgramUniformMatrix2x3fv, %function +bluegl_glProgramUniformMatrix2x3fv: + mov __blue_glCore_glProgramUniformMatrix2x3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformui64NV -.type bluegl_glProgramUniformui64NV, %function -bluegl_glProgramUniformui64NV: - mov __blue_glCore_glProgramUniformui64NV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix3x2fv +.type bluegl_glProgramUniformMatrix3x2fv, %function +bluegl_glProgramUniformMatrix3x2fv: + mov __blue_glCore_glProgramUniformMatrix3x2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayVertexAttribLFormatEXT -.type bluegl_glVertexArrayVertexAttribLFormatEXT, %function -bluegl_glVertexArrayVertexAttribLFormatEXT: - mov __blue_glCore_glVertexArrayVertexAttribLFormatEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix2x4fv +.type bluegl_glProgramUniformMatrix2x4fv, %function +bluegl_glProgramUniformMatrix2x4fv: + mov __blue_glCore_glProgramUniformMatrix2x4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMinmaxParameterivEXT -.type bluegl_glGetMinmaxParameterivEXT, %function -bluegl_glGetMinmaxParameterivEXT: - mov __blue_glCore_glGetMinmaxParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix4x2fv +.type bluegl_glProgramUniformMatrix4x2fv, %function +bluegl_glProgramUniformMatrix4x2fv: + mov __blue_glCore_glProgramUniformMatrix4x2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3iMESA -.type bluegl_glWindowPos3iMESA, %function -bluegl_glWindowPos3iMESA: - mov __blue_glCore_glWindowPos3iMESA@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix3x4fv +.type bluegl_glProgramUniformMatrix3x4fv, %function +bluegl_glProgramUniformMatrix3x4fv: + mov __blue_glCore_glProgramUniformMatrix3x4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribLFormat -.type bluegl_glVertexAttribLFormat, %function -bluegl_glVertexAttribLFormat: - mov __blue_glCore_glVertexAttribLFormat@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix4x3fv +.type bluegl_glProgramUniformMatrix4x3fv, %function +bluegl_glProgramUniformMatrix4x3fv: + mov __blue_glCore_glProgramUniformMatrix4x3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetObjectParameterfvARB -.type bluegl_glGetObjectParameterfvARB, %function -bluegl_glGetObjectParameterfvARB: - mov __blue_glCore_glGetObjectParameterfvARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix2x3dv +.type bluegl_glProgramUniformMatrix2x3dv, %function +bluegl_glProgramUniformMatrix2x3dv: + mov __blue_glCore_glProgramUniformMatrix2x3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStencilFillPathNV -.type bluegl_glStencilFillPathNV, %function -bluegl_glStencilFillPathNV: - mov __blue_glCore_glStencilFillPathNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix3x2dv +.type bluegl_glProgramUniformMatrix3x2dv, %function +bluegl_glProgramUniformMatrix3x2dv: + mov __blue_glCore_glProgramUniformMatrix3x2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEvalCoord1xvOES -.type bluegl_glEvalCoord1xvOES, %function -bluegl_glEvalCoord1xvOES: - mov __blue_glCore_glEvalCoord1xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix2x4dv +.type bluegl_glProgramUniformMatrix2x4dv, %function +bluegl_glProgramUniformMatrix2x4dv: + mov __blue_glCore_glProgramUniformMatrix2x4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4d -.type bluegl_glUniform4d, %function -bluegl_glUniform4d: - mov __blue_glCore_glUniform4d@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix4x2dv +.type bluegl_glProgramUniformMatrix4x2dv, %function +bluegl_glProgramUniformMatrix4x2dv: + mov __blue_glCore_glProgramUniformMatrix4x2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureHandleNV -.type bluegl_glGetTextureHandleNV, %function -bluegl_glGetTextureHandleNV: - mov __blue_glCore_glGetTextureHandleNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix3x4dv +.type bluegl_glProgramUniformMatrix3x4dv, %function +bluegl_glProgramUniformMatrix3x4dv: + mov __blue_glCore_glProgramUniformMatrix3x4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetUniformuivEXT -.type bluegl_glGetUniformuivEXT, %function -bluegl_glGetUniformuivEXT: - mov __blue_glCore_glGetUniformuivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix4x3dv +.type bluegl_glProgramUniformMatrix4x3dv, %function +bluegl_glProgramUniformMatrix4x3dv: + mov __blue_glCore_glProgramUniformMatrix4x3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsTextureEXT -.type bluegl_glIsTextureEXT, %function -bluegl_glIsTextureEXT: - mov __blue_glCore_glIsTextureEXT@GOTPCREL(%rip), %r11 +.global bluegl_glValidateProgramPipeline +.type bluegl_glValidateProgramPipeline, %function +bluegl_glValidateProgramPipeline: + mov __blue_glCore_glValidateProgramPipeline@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2d -.type bluegl_glProgramUniform2d, %function -bluegl_glProgramUniform2d: - mov __blue_glCore_glProgramUniform2d@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramPipelineInfoLog +.type bluegl_glGetProgramPipelineInfoLog, %function +bluegl_glGetProgramPipelineInfoLog: + mov __blue_glCore_glGetProgramPipelineInfoLog@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnUniformuivARB -.type bluegl_glGetnUniformuivARB, %function -bluegl_glGetnUniformuivARB: - mov __blue_glCore_glGetnUniformuivARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL1d +.type bluegl_glVertexAttribL1d, %function +bluegl_glVertexAttribL1d: + mov __blue_glCore_glVertexAttribL1d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsShader -.type bluegl_glIsShader, %function -bluegl_glIsShader: - mov __blue_glCore_glIsShader@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL2d +.type bluegl_glVertexAttribL2d, %function +bluegl_glVertexAttribL2d: + mov __blue_glCore_glVertexAttribL2d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexArrayIndexed64iv -.type bluegl_glGetVertexArrayIndexed64iv, %function -bluegl_glGetVertexArrayIndexed64iv: - mov __blue_glCore_glGetVertexArrayIndexed64iv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL3d +.type bluegl_glVertexAttribL3d, %function +bluegl_glVertexAttribL3d: + mov __blue_glCore_glVertexAttribL3d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnHistogramARB -.type bluegl_glGetnHistogramARB, %function -bluegl_glGetnHistogramARB: - mov __blue_glCore_glGetnHistogramARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL4d +.type bluegl_glVertexAttribL4d, %function +bluegl_glVertexAttribL4d: + mov __blue_glCore_glVertexAttribL4d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN -.type bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN, %function -bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN: - mov __blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL1dv +.type bluegl_glVertexAttribL1dv, %function +bluegl_glVertexAttribL1dv: + mov __blue_glCore_glVertexAttribL1dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI2ivEXT -.type bluegl_glVertexAttribI2ivEXT, %function -bluegl_glVertexAttribI2ivEXT: - mov __blue_glCore_glVertexAttribI2ivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL2dv +.type bluegl_glVertexAttribL2dv, %function +bluegl_glVertexAttribL2dv: + mov __blue_glCore_glVertexAttribL2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexSubImage2DEXT -.type bluegl_glTexSubImage2DEXT, %function -bluegl_glTexSubImage2DEXT: - mov __blue_glCore_glTexSubImage2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL3dv +.type bluegl_glVertexAttribL3dv, %function +bluegl_glVertexAttribL3dv: + mov __blue_glCore_glVertexAttribL3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFragmentMaterialivSGIX -.type bluegl_glGetFragmentMaterialivSGIX, %function -bluegl_glGetFragmentMaterialivSGIX: - mov __blue_glCore_glGetFragmentMaterialivSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL4dv +.type bluegl_glVertexAttribL4dv, %function +bluegl_glVertexAttribL4dv: + mov __blue_glCore_glVertexAttribL4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearNamedFramebufferiv -.type bluegl_glClearNamedFramebufferiv, %function -bluegl_glClearNamedFramebufferiv: - mov __blue_glCore_glClearNamedFramebufferiv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribLPointer +.type bluegl_glVertexAttribLPointer, %function +bluegl_glVertexAttribLPointer: + mov __blue_glCore_glVertexAttribLPointer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixMult3x3fNV -.type bluegl_glMatrixMult3x3fNV, %function -bluegl_glMatrixMult3x3fNV: - mov __blue_glCore_glMatrixMult3x3fNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribLdv +.type bluegl_glGetVertexAttribLdv, %function +bluegl_glGetVertexAttribLdv: + mov __blue_glCore_glGetVertexAttribLdv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetQueryBufferObjectiv -.type bluegl_glGetQueryBufferObjectiv, %function -bluegl_glGetQueryBufferObjectiv: - mov __blue_glCore_glGetQueryBufferObjectiv@GOTPCREL(%rip), %r11 +.global bluegl_glViewportArrayv +.type bluegl_glViewportArrayv, %function +bluegl_glViewportArrayv: + mov __blue_glCore_glViewportArrayv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVideoCaptureStreamParameterfvNV -.type bluegl_glVideoCaptureStreamParameterfvNV, %function -bluegl_glVideoCaptureStreamParameterfvNV: - mov __blue_glCore_glVideoCaptureStreamParameterfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glViewportIndexedf +.type bluegl_glViewportIndexedf, %function +bluegl_glViewportIndexedf: + mov __blue_glCore_glViewportIndexedf@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexImage3DMultisample -.type bluegl_glTexImage3DMultisample, %function -bluegl_glTexImage3DMultisample: - mov __blue_glCore_glTexImage3DMultisample@GOTPCREL(%rip), %r11 +.global bluegl_glViewportIndexedfv +.type bluegl_glViewportIndexedfv, %function +bluegl_glViewportIndexedfv: + mov __blue_glCore_glViewportIndexedfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArraySecondaryColorOffsetEXT -.type bluegl_glVertexArraySecondaryColorOffsetEXT, %function -bluegl_glVertexArraySecondaryColorOffsetEXT: - mov __blue_glCore_glVertexArraySecondaryColorOffsetEXT@GOTPCREL(%rip), %r11 +.global bluegl_glScissorArrayv +.type bluegl_glScissorArrayv, %function +bluegl_glScissorArrayv: + mov __blue_glCore_glScissorArrayv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVariantusvEXT -.type bluegl_glVariantusvEXT, %function -bluegl_glVariantusvEXT: - mov __blue_glCore_glVariantusvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glScissorIndexed +.type bluegl_glScissorIndexed, %function +bluegl_glScissorIndexed: + mov __blue_glCore_glScissorIndexed@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawArraysInstanced -.type bluegl_glDrawArraysInstanced, %function -bluegl_glDrawArraysInstanced: - mov __blue_glCore_glDrawArraysInstanced@GOTPCREL(%rip), %r11 +.global bluegl_glScissorIndexedv +.type bluegl_glScissorIndexedv, %function +bluegl_glScissorIndexedv: + mov __blue_glCore_glScissorIndexedv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix2x4dvEXT -.type bluegl_glProgramUniformMatrix2x4dvEXT, %function -bluegl_glProgramUniformMatrix2x4dvEXT: - mov __blue_glCore_glProgramUniformMatrix2x4dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDepthRangeArrayv +.type bluegl_glDepthRangeArrayv, %function +bluegl_glDepthRangeArrayv: + mov __blue_glCore_glDepthRangeArrayv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramBufferParametersIivNV -.type bluegl_glProgramBufferParametersIivNV, %function -bluegl_glProgramBufferParametersIivNV: - mov __blue_glCore_glProgramBufferParametersIivNV@GOTPCREL(%rip), %r11 +.global bluegl_glDepthRangeIndexed +.type bluegl_glDepthRangeIndexed, %function +bluegl_glDepthRangeIndexed: + mov __blue_glCore_glDepthRangeIndexed@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glViewportArrayv -.type bluegl_glViewportArrayv, %function -bluegl_glViewportArrayv: - mov __blue_glCore_glViewportArrayv@GOTPCREL(%rip), %r11 +.global bluegl_glGetFloati_v +.type bluegl_glGetFloati_v, %function +bluegl_glGetFloati_v: + mov __blue_glCore_glGetFloati_v@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTangent3svEXT -.type bluegl_glTangent3svEXT, %function -bluegl_glTangent3svEXT: - mov __blue_glCore_glTangent3svEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetDoublei_v +.type bluegl_glGetDoublei_v, %function +bluegl_glGetDoublei_v: + mov __blue_glCore_glGetDoublei_v@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeuiVertex3fSUN -.type bluegl_glReplacementCodeuiVertex3fSUN, %function -bluegl_glReplacementCodeuiVertex3fSUN: - mov __blue_glCore_glReplacementCodeuiVertex3fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glDrawArraysInstancedBaseInstance +.type bluegl_glDrawArraysInstancedBaseInstance, %function +bluegl_glDrawArraysInstancedBaseInstance: + mov __blue_glCore_glDrawArraysInstancedBaseInstance@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSharpenTexFuncSGIS -.type bluegl_glSharpenTexFuncSGIS, %function -bluegl_glSharpenTexFuncSGIS: - mov __blue_glCore_glSharpenTexFuncSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glDrawElementsInstancedBaseInstance +.type bluegl_glDrawElementsInstancedBaseInstance, %function +bluegl_glDrawElementsInstancedBaseInstance: + mov __blue_glCore_glDrawElementsInstancedBaseInstance@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormalFormatNV -.type bluegl_glNormalFormatNV, %function -bluegl_glNormalFormatNV: - mov __blue_glCore_glNormalFormatNV@GOTPCREL(%rip), %r11 +.global bluegl_glDrawElementsInstancedBaseVertexBaseInstance +.type bluegl_glDrawElementsInstancedBaseVertexBaseInstance, %function +bluegl_glDrawElementsInstancedBaseVertexBaseInstance: + mov __blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL3dv -.type bluegl_glVertexAttribL3dv, %function -bluegl_glVertexAttribL3dv: - mov __blue_glCore_glVertexAttribL3dv@GOTPCREL(%rip), %r11 +.global bluegl_glGetInternalformativ +.type bluegl_glGetInternalformativ, %function +bluegl_glGetInternalformativ: + mov __blue_glCore_glGetInternalformativ@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedStringARB -.type bluegl_glNamedStringARB, %function -bluegl_glNamedStringARB: - mov __blue_glCore_glNamedStringARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetActiveAtomicCounterBufferiv +.type bluegl_glGetActiveAtomicCounterBufferiv, %function +bluegl_glGetActiveAtomicCounterBufferiv: + mov __blue_glCore_glGetActiveAtomicCounterBufferiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayVertexAttribFormatEXT -.type bluegl_glVertexArrayVertexAttribFormatEXT, %function -bluegl_glVertexArrayVertexAttribFormatEXT: - mov __blue_glCore_glVertexArrayVertexAttribFormatEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBindImageTexture +.type bluegl_glBindImageTexture, %function +bluegl_glBindImageTexture: + mov __blue_glCore_glBindImageTexture@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoordP3ui -.type bluegl_glMultiTexCoordP3ui, %function -bluegl_glMultiTexCoordP3ui: - mov __blue_glCore_glMultiTexCoordP3ui@GOTPCREL(%rip), %r11 +.global bluegl_glMemoryBarrier +.type bluegl_glMemoryBarrier, %function +bluegl_glMemoryBarrier: + mov __blue_glCore_glMemoryBarrier@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexSubImage3DEXT -.type bluegl_glMultiTexSubImage3DEXT, %function -bluegl_glMultiTexSubImage3DEXT: - mov __blue_glCore_glMultiTexSubImage3DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexStorage1D +.type bluegl_glTexStorage1D, %function +bluegl_glTexStorage1D: + mov __blue_glCore_glTexStorage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2fvARB -.type bluegl_glUniform2fvARB, %function -bluegl_glUniform2fvARB: - mov __blue_glCore_glUniform2fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glTexStorage2D +.type bluegl_glTexStorage2D, %function +bluegl_glTexStorage2D: + mov __blue_glCore_glTexStorage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPixelMapxv -.type bluegl_glGetPixelMapxv, %function -bluegl_glGetPixelMapxv: - mov __blue_glCore_glGetPixelMapxv@GOTPCREL(%rip), %r11 +.global bluegl_glTexStorage3D +.type bluegl_glTexStorage3D, %function +bluegl_glTexStorage3D: + mov __blue_glCore_glTexStorage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTangent3ivEXT -.type bluegl_glTangent3ivEXT, %function -bluegl_glTangent3ivEXT: - mov __blue_glCore_glTangent3ivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDrawTransformFeedbackInstanced +.type bluegl_glDrawTransformFeedbackInstanced, %function +bluegl_glDrawTransformFeedbackInstanced: + mov __blue_glCore_glDrawTransformFeedbackInstanced@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetLocalConstantIntegervEXT -.type bluegl_glGetLocalConstantIntegervEXT, %function -bluegl_glGetLocalConstantIntegervEXT: - mov __blue_glCore_glGetLocalConstantIntegervEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDrawTransformFeedbackStreamInstanced +.type bluegl_glDrawTransformFeedbackStreamInstanced, %function +bluegl_glDrawTransformFeedbackStreamInstanced: + mov __blue_glCore_glDrawTransformFeedbackStreamInstanced@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPresentFrameDualFillNV -.type bluegl_glPresentFrameDualFillNV, %function -bluegl_glPresentFrameDualFillNV: - mov __blue_glCore_glPresentFrameDualFillNV@GOTPCREL(%rip), %r11 +.global bluegl_glClearBufferData +.type bluegl_glClearBufferData, %function +bluegl_glClearBufferData: + mov __blue_glCore_glClearBufferData@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEndVertexShaderEXT -.type bluegl_glEndVertexShaderEXT, %function -bluegl_glEndVertexShaderEXT: - mov __blue_glCore_glEndVertexShaderEXT@GOTPCREL(%rip), %r11 +.global bluegl_glClearBufferSubData +.type bluegl_glClearBufferSubData, %function +bluegl_glClearBufferSubData: + mov __blue_glCore_glClearBufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayVertexBuffer -.type bluegl_glVertexArrayVertexBuffer, %function -bluegl_glVertexArrayVertexBuffer: - mov __blue_glCore_glVertexArrayVertexBuffer@GOTPCREL(%rip), %r11 +.global bluegl_glDispatchCompute +.type bluegl_glDispatchCompute, %function +bluegl_glDispatchCompute: + mov __blue_glCore_glDispatchCompute@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMakeTextureHandleNonResidentNV -.type bluegl_glMakeTextureHandleNonResidentNV, %function -bluegl_glMakeTextureHandleNonResidentNV: - mov __blue_glCore_glMakeTextureHandleNonResidentNV@GOTPCREL(%rip), %r11 +.global bluegl_glDispatchComputeIndirect +.type bluegl_glDispatchComputeIndirect, %function +bluegl_glDispatchComputeIndirect: + mov __blue_glCore_glDispatchComputeIndirect@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI3uiEXT -.type bluegl_glVertexAttribI3uiEXT, %function -bluegl_glVertexAttribI3uiEXT: - mov __blue_glCore_glVertexAttribI3uiEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCopyImageSubData +.type bluegl_glCopyImageSubData, %function +bluegl_glCopyImageSubData: + mov __blue_glCore_glCopyImageSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBinormal3bvEXT -.type bluegl_glBinormal3bvEXT, %function -bluegl_glBinormal3bvEXT: - mov __blue_glCore_glBinormal3bvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferParameteri +.type bluegl_glFramebufferParameteri, %function +bluegl_glFramebufferParameteri: + mov __blue_glCore_glFramebufferParameteri@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPixelTexGenParameterfSGIS -.type bluegl_glPixelTexGenParameterfSGIS, %function -bluegl_glPixelTexGenParameterfSGIS: - mov __blue_glCore_glPixelTexGenParameterfSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glGetFramebufferParameteriv +.type bluegl_glGetFramebufferParameteriv, %function +bluegl_glGetFramebufferParameteriv: + mov __blue_glCore_glGetFramebufferParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexGenivEXT -.type bluegl_glMultiTexGenivEXT, %function -bluegl_glMultiTexGenivEXT: - mov __blue_glCore_glMultiTexGenivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetInternalformati64v +.type bluegl_glGetInternalformati64v, %function +bluegl_glGetInternalformati64v: + mov __blue_glCore_glGetInternalformati64v@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVideoivNV -.type bluegl_glGetVideoivNV, %function -bluegl_glGetVideoivNV: - mov __blue_glCore_glGetVideoivNV@GOTPCREL(%rip), %r11 +.global bluegl_glInvalidateTexSubImage +.type bluegl_glInvalidateTexSubImage, %function +bluegl_glInvalidateTexSubImage: + mov __blue_glCore_glInvalidateTexSubImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoordP2ui -.type bluegl_glMultiTexCoordP2ui, %function -bluegl_glMultiTexCoordP2ui: - mov __blue_glCore_glMultiTexCoordP2ui@GOTPCREL(%rip), %r11 +.global bluegl_glInvalidateTexImage +.type bluegl_glInvalidateTexImage, %function +bluegl_glInvalidateTexImage: + mov __blue_glCore_glInvalidateTexImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeletePerfQueryINTEL -.type bluegl_glDeletePerfQueryINTEL, %function -bluegl_glDeletePerfQueryINTEL: - mov __blue_glCore_glDeletePerfQueryINTEL@GOTPCREL(%rip), %r11 +.global bluegl_glInvalidateBufferSubData +.type bluegl_glInvalidateBufferSubData, %function +bluegl_glInvalidateBufferSubData: + mov __blue_glCore_glInvalidateBufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDepthBoundsdNV -.type bluegl_glDepthBoundsdNV, %function -bluegl_glDepthBoundsdNV: - mov __blue_glCore_glDepthBoundsdNV@GOTPCREL(%rip), %r11 +.global bluegl_glInvalidateBufferData +.type bluegl_glInvalidateBufferData, %function +bluegl_glInvalidateBufferData: + mov __blue_glCore_glInvalidateBufferData@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPixelTransferxOES -.type bluegl_glPixelTransferxOES, %function -bluegl_glPixelTransferxOES: - mov __blue_glCore_glPixelTransferxOES@GOTPCREL(%rip), %r11 +.global bluegl_glInvalidateFramebuffer +.type bluegl_glInvalidateFramebuffer, %function +bluegl_glInvalidateFramebuffer: + mov __blue_glCore_glInvalidateFramebuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCombinerOutputNV -.type bluegl_glCombinerOutputNV, %function -bluegl_glCombinerOutputNV: - mov __blue_glCore_glCombinerOutputNV@GOTPCREL(%rip), %r11 +.global bluegl_glInvalidateSubFramebuffer +.type bluegl_glInvalidateSubFramebuffer, %function +bluegl_glInvalidateSubFramebuffer: + mov __blue_glCore_glInvalidateSubFramebuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyTextureSubImage1D -.type bluegl_glCopyTextureSubImage1D, %function -bluegl_glCopyTextureSubImage1D: - mov __blue_glCore_glCopyTextureSubImage1D@GOTPCREL(%rip), %r11 +.global bluegl_glMultiDrawArraysIndirect +.type bluegl_glMultiDrawArraysIndirect, %function +bluegl_glMultiDrawArraysIndirect: + mov __blue_glCore_glMultiDrawArraysIndirect@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI4iv -.type bluegl_glVertexAttribI4iv, %function -bluegl_glVertexAttribI4iv: - mov __blue_glCore_glVertexAttribI4iv@GOTPCREL(%rip), %r11 +.global bluegl_glMultiDrawElementsIndirect +.type bluegl_glMultiDrawElementsIndirect, %function +bluegl_glMultiDrawElementsIndirect: + mov __blue_glCore_glMultiDrawElementsIndirect@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyTexImage2DEXT -.type bluegl_glCopyTexImage2DEXT, %function -bluegl_glCopyTexImage2DEXT: - mov __blue_glCore_glCopyTexImage2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramInterfaceiv +.type bluegl_glGetProgramInterfaceiv, %function +bluegl_glGetProgramInterfaceiv: + mov __blue_glCore_glGetProgramInterfaceiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindLightParameterEXT -.type bluegl_glBindLightParameterEXT, %function -bluegl_glBindLightParameterEXT: - mov __blue_glCore_glBindLightParameterEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramResourceIndex +.type bluegl_glGetProgramResourceIndex, %function +bluegl_glGetProgramResourceIndex: + mov __blue_glCore_glGetProgramResourceIndex@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiDrawElementsBaseVertex -.type bluegl_glMultiDrawElementsBaseVertex, %function -bluegl_glMultiDrawElementsBaseVertex: - mov __blue_glCore_glMultiDrawElementsBaseVertex@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramResourceName +.type bluegl_glGetProgramResourceName, %function +bluegl_glGetProgramResourceName: + mov __blue_glCore_glGetProgramResourceName@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2uivEXT -.type bluegl_glProgramUniform2uivEXT, %function -bluegl_glProgramUniform2uivEXT: - mov __blue_glCore_glProgramUniform2uivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramResourceiv +.type bluegl_glGetProgramResourceiv, %function +bluegl_glGetProgramResourceiv: + mov __blue_glCore_glGetProgramResourceiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeletePerfMonitorsAMD -.type bluegl_glDeletePerfMonitorsAMD, %function -bluegl_glDeletePerfMonitorsAMD: - mov __blue_glCore_glDeletePerfMonitorsAMD@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramResourceLocation +.type bluegl_glGetProgramResourceLocation, %function +bluegl_glGetProgramResourceLocation: + mov __blue_glCore_glGetProgramResourceLocation@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyImageSubData -.type bluegl_glCopyImageSubData, %function -bluegl_glCopyImageSubData: - mov __blue_glCore_glCopyImageSubData@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramResourceLocationIndex +.type bluegl_glGetProgramResourceLocationIndex, %function +bluegl_glGetProgramResourceLocationIndex: + mov __blue_glCore_glGetProgramResourceLocationIndex@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathCoverDepthFuncNV -.type bluegl_glPathCoverDepthFuncNV, %function -bluegl_glPathCoverDepthFuncNV: - mov __blue_glCore_glPathCoverDepthFuncNV@GOTPCREL(%rip), %r11 +.global bluegl_glShaderStorageBlockBinding +.type bluegl_glShaderStorageBlockBinding, %function +bluegl_glShaderStorageBlockBinding: + mov __blue_glCore_glShaderStorageBlockBinding@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFramebufferAttachmentParameteriv -.type bluegl_glGetFramebufferAttachmentParameteriv, %function -bluegl_glGetFramebufferAttachmentParameteriv: - mov __blue_glCore_glGetFramebufferAttachmentParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glTexBufferRange +.type bluegl_glTexBufferRange, %function +bluegl_glTexBufferRange: + mov __blue_glCore_glTexBufferRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glRectxOES -.type bluegl_glRectxOES, %function -bluegl_glRectxOES: - mov __blue_glCore_glRectxOES@GOTPCREL(%rip), %r11 +.global bluegl_glTexStorage2DMultisample +.type bluegl_glTexStorage2DMultisample, %function +bluegl_glTexStorage2DMultisample: + mov __blue_glCore_glTexStorage2DMultisample@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTagSampleBufferSGIX -.type bluegl_glTagSampleBufferSGIX, %function -bluegl_glTagSampleBufferSGIX: - mov __blue_glCore_glTagSampleBufferSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glTexStorage3DMultisample +.type bluegl_glTexStorage3DMultisample, %function +bluegl_glTexStorage3DMultisample: + mov __blue_glCore_glTexStorage3DMultisample@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream3svATI -.type bluegl_glVertexStream3svATI, %function -bluegl_glVertexStream3svATI: - mov __blue_glCore_glVertexStream3svATI@GOTPCREL(%rip), %r11 +.global bluegl_glTextureView +.type bluegl_glTextureView, %function +bluegl_glTextureView: + mov __blue_glCore_glTextureView@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPathTexGenfvNV -.type bluegl_glGetPathTexGenfvNV, %function -bluegl_glGetPathTexGenfvNV: - mov __blue_glCore_glGetPathTexGenfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glBindVertexBuffer +.type bluegl_glBindVertexBuffer, %function +bluegl_glBindVertexBuffer: + mov __blue_glCore_glBindVertexBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glOrthofOES -.type bluegl_glOrthofOES, %function -bluegl_glOrthofOES: - mov __blue_glCore_glOrthofOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribFormat +.type bluegl_glVertexAttribFormat, %function +bluegl_glVertexAttribFormat: + mov __blue_glCore_glVertexAttribFormat@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyTexImage2D -.type bluegl_glCopyTexImage2D, %function -bluegl_glCopyTexImage2D: - mov __blue_glCore_glCopyTexImage2D@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribIFormat +.type bluegl_glVertexAttribIFormat, %function +bluegl_glVertexAttribIFormat: + mov __blue_glCore_glVertexAttribIFormat@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord2fColor4ubVertex3fSUN -.type bluegl_glTexCoord2fColor4ubVertex3fSUN, %function -bluegl_glTexCoord2fColor4ubVertex3fSUN: - mov __blue_glCore_glTexCoord2fColor4ubVertex3fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribLFormat +.type bluegl_glVertexAttribLFormat, %function +bluegl_glVertexAttribLFormat: + mov __blue_glCore_glVertexAttribLFormat@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultTransposeMatrixdARB -.type bluegl_glMultTransposeMatrixdARB, %function -bluegl_glMultTransposeMatrixdARB: - mov __blue_glCore_glMultTransposeMatrixdARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribBinding +.type bluegl_glVertexAttribBinding, %function +bluegl_glVertexAttribBinding: + mov __blue_glCore_glVertexAttribBinding@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3i -.type bluegl_glProgramUniform3i, %function -bluegl_glProgramUniform3i: - mov __blue_glCore_glProgramUniform3i@GOTPCREL(%rip), %r11 +.global bluegl_glVertexBindingDivisor +.type bluegl_glVertexBindingDivisor, %function +bluegl_glVertexBindingDivisor: + mov __blue_glCore_glVertexBindingDivisor@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glArrayObjectATI -.type bluegl_glArrayObjectATI, %function -bluegl_glArrayObjectATI: - mov __blue_glCore_glArrayObjectATI@GOTPCREL(%rip), %r11 +.global bluegl_glDebugMessageControl +.type bluegl_glDebugMessageControl, %function +bluegl_glDebugMessageControl: + mov __blue_glCore_glDebugMessageControl@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixRotatedEXT -.type bluegl_glMatrixRotatedEXT, %function -bluegl_glMatrixRotatedEXT: - mov __blue_glCore_glMatrixRotatedEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDebugMessageInsert +.type bluegl_glDebugMessageInsert, %function +bluegl_glDebugMessageInsert: + mov __blue_glCore_glDebugMessageInsert@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoordP2ui -.type bluegl_glTexCoordP2ui, %function -bluegl_glTexCoordP2ui: - mov __blue_glCore_glTexCoordP2ui@GOTPCREL(%rip), %r11 +.global bluegl_glDebugMessageCallback +.type bluegl_glDebugMessageCallback, %function +bluegl_glDebugMessageCallback: + mov __blue_glCore_glDebugMessageCallback@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPassTexCoordATI -.type bluegl_glPassTexCoordATI, %function -bluegl_glPassTexCoordATI: - mov __blue_glCore_glPassTexCoordATI@GOTPCREL(%rip), %r11 +.global bluegl_glGetDebugMessageLog +.type bluegl_glGetDebugMessageLog, %function +bluegl_glGetDebugMessageLog: + mov __blue_glCore_glGetDebugMessageLog@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsTexture -.type bluegl_glIsTexture, %function -bluegl_glIsTexture: - mov __blue_glCore_glIsTexture@GOTPCREL(%rip), %r11 +.global bluegl_glPushDebugGroup +.type bluegl_glPushDebugGroup, %function +bluegl_glPushDebugGroup: + mov __blue_glCore_glPushDebugGroup@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTexSubImage3DARB -.type bluegl_glCompressedTexSubImage3DARB, %function -bluegl_glCompressedTexSubImage3DARB: - mov __blue_glCore_glCompressedTexSubImage3DARB@GOTPCREL(%rip), %r11 +.global bluegl_glPopDebugGroup +.type bluegl_glPopDebugGroup, %function +bluegl_glPopDebugGroup: + mov __blue_glCore_glPopDebugGroup@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDepthRangexOES -.type bluegl_glDepthRangexOES, %function -bluegl_glDepthRangexOES: - mov __blue_glCore_glDepthRangexOES@GOTPCREL(%rip), %r11 +.global bluegl_glObjectLabel +.type bluegl_glObjectLabel, %function +bluegl_glObjectLabel: + mov __blue_glCore_glObjectLabel@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glImageTransformParameterivHP -.type bluegl_glImageTransformParameterivHP, %function -bluegl_glImageTransformParameterivHP: - mov __blue_glCore_glImageTransformParameterivHP@GOTPCREL(%rip), %r11 +.global bluegl_glGetObjectLabel +.type bluegl_glGetObjectLabel, %function +bluegl_glGetObjectLabel: + mov __blue_glCore_glGetObjectLabel@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultTransposeMatrixfARB -.type bluegl_glMultTransposeMatrixfARB, %function -bluegl_glMultTransposeMatrixfARB: - mov __blue_glCore_glMultTransposeMatrixfARB@GOTPCREL(%rip), %r11 +.global bluegl_glObjectPtrLabel +.type bluegl_glObjectPtrLabel, %function +bluegl_glObjectPtrLabel: + mov __blue_glCore_glObjectPtrLabel@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformHandleui64vARB -.type bluegl_glUniformHandleui64vARB, %function -bluegl_glUniformHandleui64vARB: - mov __blue_glCore_glUniformHandleui64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetObjectPtrLabel +.type bluegl_glGetObjectPtrLabel, %function +bluegl_glGetObjectPtrLabel: + mov __blue_glCore_glGetObjectPtrLabel@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenTransformFeedbacks -.type bluegl_glGenTransformFeedbacks, %function -bluegl_glGenTransformFeedbacks: - mov __blue_glCore_glGenTransformFeedbacks@GOTPCREL(%rip), %r11 +.global bluegl_glBufferStorage +.type bluegl_glBufferStorage, %function +bluegl_glBufferStorage: + mov __blue_glCore_glBufferStorage@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureStorage1D -.type bluegl_glTextureStorage1D, %function -bluegl_glTextureStorage1D: - mov __blue_glCore_glTextureStorage1D@GOTPCREL(%rip), %r11 +.global bluegl_glClearTexImage +.type bluegl_glClearTexImage, %function +bluegl_glClearTexImage: + mov __blue_glCore_glClearTexImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribivNV -.type bluegl_glGetVertexAttribivNV, %function -bluegl_glGetVertexAttribivNV: - mov __blue_glCore_glGetVertexAttribivNV@GOTPCREL(%rip), %r11 +.global bluegl_glClearTexSubImage +.type bluegl_glClearTexSubImage, %function +bluegl_glClearTexSubImage: + mov __blue_glCore_glClearTexSubImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodePointerSUN -.type bluegl_glReplacementCodePointerSUN, %function -bluegl_glReplacementCodePointerSUN: - mov __blue_glCore_glReplacementCodePointerSUN@GOTPCREL(%rip), %r11 +.global bluegl_glBindBuffersBase +.type bluegl_glBindBuffersBase, %function +bluegl_glBindBuffersBase: + mov __blue_glCore_glBindBuffersBase@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI3uiv -.type bluegl_glVertexAttribI3uiv, %function -bluegl_glVertexAttribI3uiv: - mov __blue_glCore_glVertexAttribI3uiv@GOTPCREL(%rip), %r11 +.global bluegl_glBindBuffersRange +.type bluegl_glBindBuffersRange, %function +bluegl_glBindBuffersRange: + mov __blue_glCore_glBindBuffersRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeuiNormal3fVertex3fSUN -.type bluegl_glReplacementCodeuiNormal3fVertex3fSUN, %function -bluegl_glReplacementCodeuiNormal3fVertex3fSUN: - mov __blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glBindTextures +.type bluegl_glBindTextures, %function +bluegl_glBindTextures: + mov __blue_glCore_glBindTextures@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL2dEXT -.type bluegl_glVertexAttribL2dEXT, %function -bluegl_glVertexAttribL2dEXT: - mov __blue_glCore_glVertexAttribL2dEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBindSamplers +.type bluegl_glBindSamplers, %function +bluegl_glBindSamplers: + mov __blue_glCore_glBindSamplers@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3ui64NV -.type bluegl_glProgramUniform3ui64NV, %function -bluegl_glProgramUniform3ui64NV: - mov __blue_glCore_glProgramUniform3ui64NV@GOTPCREL(%rip), %r11 +.global bluegl_glBindImageTextures +.type bluegl_glBindImageTextures, %function +bluegl_glBindImageTextures: + mov __blue_glCore_glBindImageTextures@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3i64NV -.type bluegl_glProgramUniform3i64NV, %function -bluegl_glProgramUniform3i64NV: - mov __blue_glCore_glProgramUniform3i64NV@GOTPCREL(%rip), %r11 +.global bluegl_glBindVertexBuffers +.type bluegl_glBindVertexBuffers, %function +bluegl_glBindVertexBuffers: + mov __blue_glCore_glBindVertexBuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedRenderbufferParameterivEXT -.type bluegl_glGetNamedRenderbufferParameterivEXT, %function -bluegl_glGetNamedRenderbufferParameterivEXT: - mov __blue_glCore_glGetNamedRenderbufferParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glClipControl +.type bluegl_glClipControl, %function +bluegl_glClipControl: + mov __blue_glCore_glClipControl@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTangent3bvEXT -.type bluegl_glTangent3bvEXT, %function -bluegl_glTangent3bvEXT: - mov __blue_glCore_glTangent3bvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCreateTransformFeedbacks +.type bluegl_glCreateTransformFeedbacks, %function +bluegl_glCreateTransformFeedbacks: + mov __blue_glCore_glCreateTransformFeedbacks@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1dvEXT -.type bluegl_glProgramUniform1dvEXT, %function -bluegl_glProgramUniform1dvEXT: - mov __blue_glCore_glProgramUniform1dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTransformFeedbackBufferBase +.type bluegl_glTransformFeedbackBufferBase, %function +bluegl_glTransformFeedbackBufferBase: + mov __blue_glCore_glTransformFeedbackBufferBase@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixLoadTransposedEXT -.type bluegl_glMatrixLoadTransposedEXT, %function -bluegl_glMatrixLoadTransposedEXT: - mov __blue_glCore_glMatrixLoadTransposedEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTransformFeedbackBufferRange +.type bluegl_glTransformFeedbackBufferRange, %function +bluegl_glTransformFeedbackBufferRange: + mov __blue_glCore_glTransformFeedbackBufferRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribLdv -.type bluegl_glGetVertexAttribLdv, %function -bluegl_glGetVertexAttribLdv: - mov __blue_glCore_glGetVertexAttribLdv@GOTPCREL(%rip), %r11 +.global bluegl_glGetTransformFeedbackiv +.type bluegl_glGetTransformFeedbackiv, %function +bluegl_glGetTransformFeedbackiv: + mov __blue_glCore_glGetTransformFeedbackiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream2dATI -.type bluegl_glVertexStream2dATI, %function -bluegl_glVertexStream2dATI: - mov __blue_glCore_glVertexStream2dATI@GOTPCREL(%rip), %r11 +.global bluegl_glGetTransformFeedbacki_v +.type bluegl_glGetTransformFeedbacki_v, %function +bluegl_glGetTransformFeedbacki_v: + mov __blue_glCore_glGetTransformFeedbacki_v@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFragmentLightivSGIX -.type bluegl_glGetFragmentLightivSGIX, %function -bluegl_glGetFragmentLightivSGIX: - mov __blue_glCore_glGetFragmentLightivSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glGetTransformFeedbacki64_v +.type bluegl_glGetTransformFeedbacki64_v, %function +bluegl_glGetTransformFeedbacki64_v: + mov __blue_glCore_glGetTransformFeedbacki64_v@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMinmaxEXT -.type bluegl_glGetMinmaxEXT, %function -bluegl_glGetMinmaxEXT: - mov __blue_glCore_glGetMinmaxEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCreateBuffers +.type bluegl_glCreateBuffers, %function +bluegl_glCreateBuffers: + mov __blue_glCore_glCreateBuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFlushStaticDataIBM -.type bluegl_glFlushStaticDataIBM, %function -bluegl_glFlushStaticDataIBM: - mov __blue_glCore_glFlushStaticDataIBM@GOTPCREL(%rip), %r11 +.global bluegl_glNamedBufferStorage +.type bluegl_glNamedBufferStorage, %function +bluegl_glNamedBufferStorage: + mov __blue_glCore_glNamedBufferStorage@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glShaderOp1EXT -.type bluegl_glShaderOp1EXT, %function -bluegl_glShaderOp1EXT: - mov __blue_glCore_glShaderOp1EXT@GOTPCREL(%rip), %r11 +.global bluegl_glNamedBufferData +.type bluegl_glNamedBufferData, %function +bluegl_glNamedBufferData: + mov __blue_glCore_glNamedBufferData@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsStateNV -.type bluegl_glIsStateNV, %function -bluegl_glIsStateNV: - mov __blue_glCore_glIsStateNV@GOTPCREL(%rip), %r11 +.global bluegl_glNamedBufferSubData +.type bluegl_glNamedBufferSubData, %function +bluegl_glNamedBufferSubData: + mov __blue_glCore_glNamedBufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramEnvParameterIuivNV -.type bluegl_glGetProgramEnvParameterIuivNV, %function -bluegl_glGetProgramEnvParameterIuivNV: - mov __blue_glCore_glGetProgramEnvParameterIuivNV@GOTPCREL(%rip), %r11 +.global bluegl_glCopyNamedBufferSubData +.type bluegl_glCopyNamedBufferSubData, %function +bluegl_glCopyNamedBufferSubData: + mov __blue_glCore_glCopyNamedBufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVideoCaptureivNV -.type bluegl_glGetVideoCaptureivNV, %function -bluegl_glGetVideoCaptureivNV: - mov __blue_glCore_glGetVideoCaptureivNV@GOTPCREL(%rip), %r11 +.global bluegl_glClearNamedBufferData +.type bluegl_glClearNamedBufferData, %function +bluegl_glClearNamedBufferData: + mov __blue_glCore_glClearNamedBufferData@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathStringNV -.type bluegl_glPathStringNV, %function -bluegl_glPathStringNV: - mov __blue_glCore_glPathStringNV@GOTPCREL(%rip), %r11 +.global bluegl_glClearNamedBufferSubData +.type bluegl_glClearNamedBufferSubData, %function +bluegl_glClearNamedBufferSubData: + mov __blue_glCore_glClearNamedBufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glListParameterfSGIX -.type bluegl_glListParameterfSGIX, %function -bluegl_glListParameterfSGIX: - mov __blue_glCore_glListParameterfSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glMapNamedBuffer +.type bluegl_glMapNamedBuffer, %function +bluegl_glMapNamedBuffer: + mov __blue_glCore_glMapNamedBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFeedbackBufferxOES -.type bluegl_glFeedbackBufferxOES, %function -bluegl_glFeedbackBufferxOES: - mov __blue_glCore_glFeedbackBufferxOES@GOTPCREL(%rip), %r11 +.global bluegl_glMapNamedBufferRange +.type bluegl_glMapNamedBufferRange, %function +bluegl_glMapNamedBufferRange: + mov __blue_glCore_glMapNamedBufferRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNextPerfQueryIdINTEL -.type bluegl_glGetNextPerfQueryIdINTEL, %function -bluegl_glGetNextPerfQueryIdINTEL: - mov __blue_glCore_glGetNextPerfQueryIdINTEL@GOTPCREL(%rip), %r11 +.global bluegl_glUnmapNamedBuffer +.type bluegl_glUnmapNamedBuffer, %function +bluegl_glUnmapNamedBuffer: + mov __blue_glCore_glUnmapNamedBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVariantArrayObjectfvATI -.type bluegl_glGetVariantArrayObjectfvATI, %function -bluegl_glGetVariantArrayObjectfvATI: - mov __blue_glCore_glGetVariantArrayObjectfvATI@GOTPCREL(%rip), %r11 +.global bluegl_glFlushMappedNamedBufferRange +.type bluegl_glFlushMappedNamedBufferRange, %function +bluegl_glFlushMappedNamedBufferRange: + mov __blue_glCore_glFlushMappedNamedBufferRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3d -.type bluegl_glUniform3d, %function -bluegl_glUniform3d: - mov __blue_glCore_glUniform3d@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedBufferParameteriv +.type bluegl_glGetNamedBufferParameteriv, %function +bluegl_glGetNamedBufferParameteriv: + mov __blue_glCore_glGetNamedBufferParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexParameterfvEXT -.type bluegl_glMultiTexParameterfvEXT, %function -bluegl_glMultiTexParameterfvEXT: - mov __blue_glCore_glMultiTexParameterfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedBufferParameteri64v +.type bluegl_glGetNamedBufferParameteri64v, %function +bluegl_glGetNamedBufferParameteri64v: + mov __blue_glCore_glGetNamedBufferParameteri64v@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetLocalConstantFloatvEXT -.type bluegl_glGetLocalConstantFloatvEXT, %function -bluegl_glGetLocalConstantFloatvEXT: - mov __blue_glCore_glGetLocalConstantFloatvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedBufferPointerv +.type bluegl_glGetNamedBufferPointerv, %function +bluegl_glGetNamedBufferPointerv: + mov __blue_glCore_glGetNamedBufferPointerv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexImage3DEXT -.type bluegl_glMultiTexImage3DEXT, %function -bluegl_glMultiTexImage3DEXT: - mov __blue_glCore_glMultiTexImage3DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedBufferSubData +.type bluegl_glGetNamedBufferSubData, %function +bluegl_glGetNamedBufferSubData: + mov __blue_glCore_glGetNamedBufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3fMESA -.type bluegl_glWindowPos3fMESA, %function -bluegl_glWindowPos3fMESA: - mov __blue_glCore_glWindowPos3fMESA@GOTPCREL(%rip), %r11 +.global bluegl_glCreateFramebuffers +.type bluegl_glCreateFramebuffers, %function +bluegl_glCreateFramebuffers: + mov __blue_glCore_glCreateFramebuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCullParameterdvEXT -.type bluegl_glCullParameterdvEXT, %function -bluegl_glCullParameterdvEXT: - mov __blue_glCore_glCullParameterdvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glNamedFramebufferRenderbuffer +.type bluegl_glNamedFramebufferRenderbuffer, %function +bluegl_glNamedFramebufferRenderbuffer: + mov __blue_glCore_glNamedFramebufferRenderbuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTrackMatrixivNV -.type bluegl_glGetTrackMatrixivNV, %function -bluegl_glGetTrackMatrixivNV: - mov __blue_glCore_glGetTrackMatrixivNV@GOTPCREL(%rip), %r11 +.global bluegl_glNamedFramebufferParameteri +.type bluegl_glNamedFramebufferParameteri, %function +bluegl_glNamedFramebufferParameteri: + mov __blue_glCore_glNamedFramebufferParameteri@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendFuncSeparateINGR -.type bluegl_glBlendFuncSeparateINGR, %function -bluegl_glBlendFuncSeparateINGR: - mov __blue_glCore_glBlendFuncSeparateINGR@GOTPCREL(%rip), %r11 +.global bluegl_glNamedFramebufferTexture +.type bluegl_glNamedFramebufferTexture, %function +bluegl_glNamedFramebufferTexture: + mov __blue_glCore_glNamedFramebufferTexture@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix2fvARB -.type bluegl_glUniformMatrix2fvARB, %function -bluegl_glUniformMatrix2fvARB: - mov __blue_glCore_glUniformMatrix2fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glNamedFramebufferTextureLayer +.type bluegl_glNamedFramebufferTextureLayer, %function +bluegl_glNamedFramebufferTextureLayer: + mov __blue_glCore_glNamedFramebufferTextureLayer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawArraysInstancedEXT -.type bluegl_glDrawArraysInstancedEXT, %function -bluegl_glDrawArraysInstancedEXT: - mov __blue_glCore_glDrawArraysInstancedEXT@GOTPCREL(%rip), %r11 +.global bluegl_glNamedFramebufferDrawBuffer +.type bluegl_glNamedFramebufferDrawBuffer, %function +bluegl_glNamedFramebufferDrawBuffer: + mov __blue_glCore_glNamedFramebufferDrawBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3iARB -.type bluegl_glMultiTexCoord3iARB, %function -bluegl_glMultiTexCoord3iARB: - mov __blue_glCore_glMultiTexCoord3iARB@GOTPCREL(%rip), %r11 +.global bluegl_glNamedFramebufferDrawBuffers +.type bluegl_glNamedFramebufferDrawBuffers, %function +bluegl_glNamedFramebufferDrawBuffers: + mov __blue_glCore_glNamedFramebufferDrawBuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedFramebufferParameterivEXT -.type bluegl_glGetNamedFramebufferParameterivEXT, %function -bluegl_glGetNamedFramebufferParameterivEXT: - mov __blue_glCore_glGetNamedFramebufferParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glNamedFramebufferReadBuffer +.type bluegl_glNamedFramebufferReadBuffer, %function +bluegl_glNamedFramebufferReadBuffer: + mov __blue_glCore_glNamedFramebufferReadBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenTextures -.type bluegl_glGenTextures, %function -bluegl_glGenTextures: - mov __blue_glCore_glGenTextures@GOTPCREL(%rip), %r11 +.global bluegl_glInvalidateNamedFramebufferData +.type bluegl_glInvalidateNamedFramebufferData, %function +bluegl_glInvalidateNamedFramebufferData: + mov __blue_glCore_glInvalidateNamedFramebufferData@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsPointInStrokePathNV -.type bluegl_glIsPointInStrokePathNV, %function -bluegl_glIsPointInStrokePathNV: - mov __blue_glCore_glIsPointInStrokePathNV@GOTPCREL(%rip), %r11 +.global bluegl_glInvalidateNamedFramebufferSubData +.type bluegl_glInvalidateNamedFramebufferSubData, %function +bluegl_glInvalidateNamedFramebufferSubData: + mov __blue_glCore_glInvalidateNamedFramebufferSubData@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawTransformFeedbackNV -.type bluegl_glDrawTransformFeedbackNV, %function -bluegl_glDrawTransformFeedbackNV: - mov __blue_glCore_glDrawTransformFeedbackNV@GOTPCREL(%rip), %r11 +.global bluegl_glClearNamedFramebufferiv +.type bluegl_glClearNamedFramebufferiv, %function +bluegl_glClearNamedFramebufferiv: + mov __blue_glCore_glClearNamedFramebufferiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetActiveUniformARB -.type bluegl_glGetActiveUniformARB, %function -bluegl_glGetActiveUniformARB: - mov __blue_glCore_glGetActiveUniformARB@GOTPCREL(%rip), %r11 +.global bluegl_glClearNamedFramebufferuiv +.type bluegl_glClearNamedFramebufferuiv, %function +bluegl_glClearNamedFramebufferuiv: + mov __blue_glCore_glClearNamedFramebufferuiv@GOTPCREL(%rip), %r11 jmp *(%r11) .global bluegl_glClearNamedFramebufferfv @@ -3547,76 +3486,70 @@ bluegl_glClearNamedFramebufferfv: mov __blue_glCore_glClearNamedFramebufferfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBeginVideoCaptureNV -.type bluegl_glBeginVideoCaptureNV, %function -bluegl_glBeginVideoCaptureNV: - mov __blue_glCore_glBeginVideoCaptureNV@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glCopyTexImage1D -.type bluegl_glCopyTexImage1D, %function -bluegl_glCopyTexImage1D: - mov __blue_glCore_glCopyTexImage1D@GOTPCREL(%rip), %r11 +.global bluegl_glClearNamedFramebufferfi +.type bluegl_glClearNamedFramebufferfi, %function +bluegl_glClearNamedFramebufferfi: + mov __blue_glCore_glClearNamedFramebufferfi@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexStorage1D -.type bluegl_glTexStorage1D, %function -bluegl_glTexStorage1D: - mov __blue_glCore_glTexStorage1D@GOTPCREL(%rip), %r11 +.global bluegl_glBlitNamedFramebuffer +.type bluegl_glBlitNamedFramebuffer, %function +bluegl_glBlitNamedFramebuffer: + mov __blue_glCore_glBlitNamedFramebuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3ui64ARB -.type bluegl_glProgramUniform3ui64ARB, %function -bluegl_glProgramUniform3ui64ARB: - mov __blue_glCore_glProgramUniform3ui64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glCheckNamedFramebufferStatus +.type bluegl_glCheckNamedFramebufferStatus, %function +bluegl_glCheckNamedFramebufferStatus: + mov __blue_glCore_glCheckNamedFramebufferStatus@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureSubImage2D -.type bluegl_glTextureSubImage2D, %function -bluegl_glTextureSubImage2D: - mov __blue_glCore_glTextureSubImage2D@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedFramebufferParameteriv +.type bluegl_glGetNamedFramebufferParameteriv, %function +bluegl_glGetNamedFramebufferParameteriv: + mov __blue_glCore_glGetNamedFramebufferParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4bOES -.type bluegl_glMultiTexCoord4bOES, %function -bluegl_glMultiTexCoord4bOES: - mov __blue_glCore_glMultiTexCoord4bOES@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedFramebufferAttachmentParameteriv +.type bluegl_glGetNamedFramebufferAttachmentParameteriv, %function +bluegl_glGetNamedFramebufferAttachmentParameteriv: + mov __blue_glCore_glGetNamedFramebufferAttachmentParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiDrawArraysIndirectCountARB -.type bluegl_glMultiDrawArraysIndirectCountARB, %function -bluegl_glMultiDrawArraysIndirectCountARB: - mov __blue_glCore_glMultiDrawArraysIndirectCountARB@GOTPCREL(%rip), %r11 +.global bluegl_glCreateRenderbuffers +.type bluegl_glCreateRenderbuffers, %function +bluegl_glCreateRenderbuffers: + mov __blue_glCore_glCreateRenderbuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix3dvEXT -.type bluegl_glProgramUniformMatrix3dvEXT, %function -bluegl_glProgramUniformMatrix3dvEXT: - mov __blue_glCore_glProgramUniformMatrix3dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glNamedRenderbufferStorage +.type bluegl_glNamedRenderbufferStorage, %function +bluegl_glNamedRenderbufferStorage: + mov __blue_glCore_glNamedRenderbufferStorage@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib2s -.type bluegl_glVertexAttrib2s, %function -bluegl_glVertexAttrib2s: - mov __blue_glCore_glVertexAttrib2s@GOTPCREL(%rip), %r11 +.global bluegl_glNamedRenderbufferStorageMultisample +.type bluegl_glNamedRenderbufferStorageMultisample, %function +bluegl_glNamedRenderbufferStorageMultisample: + mov __blue_glCore_glNamedRenderbufferStorageMultisample@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetDoublev -.type bluegl_glGetDoublev, %function -bluegl_glGetDoublev: - mov __blue_glCore_glGetDoublev@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedRenderbufferParameteriv +.type bluegl_glGetNamedRenderbufferParameteriv, %function +bluegl_glGetNamedRenderbufferParameteriv: + mov __blue_glCore_glGetNamedRenderbufferParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3svARB -.type bluegl_glVertexAttrib3svARB, %function -bluegl_glVertexAttrib3svARB: - mov __blue_glCore_glVertexAttrib3svARB@GOTPCREL(%rip), %r11 +.global bluegl_glCreateTextures +.type bluegl_glCreateTextures, %function +bluegl_glCreateTextures: + mov __blue_glCore_glCreateTextures@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramNamedParameter4dvNV -.type bluegl_glProgramNamedParameter4dvNV, %function -bluegl_glProgramNamedParameter4dvNV: - mov __blue_glCore_glProgramNamedParameter4dvNV@GOTPCREL(%rip), %r11 +.global bluegl_glTextureBuffer +.type bluegl_glTextureBuffer, %function +bluegl_glTextureBuffer: + mov __blue_glCore_glTextureBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) .global bluegl_glTextureBufferRange @@ -3625,3658 +3558,3676 @@ bluegl_glTextureBufferRange: mov __blue_glCore_glTextureBufferRange@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferTextureFaceEXT -.type bluegl_glFramebufferTextureFaceEXT, %function -bluegl_glFramebufferTextureFaceEXT: - mov __blue_glCore_glFramebufferTextureFaceEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTextureStorage1D +.type bluegl_glTextureStorage1D, %function +bluegl_glTextureStorage1D: + mov __blue_glCore_glTextureStorage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindBufferRange -.type bluegl_glBindBufferRange, %function -bluegl_glBindBufferRange: - mov __blue_glCore_glBindBufferRange@GOTPCREL(%rip), %r11 +.global bluegl_glTextureStorage2D +.type bluegl_glTextureStorage2D, %function +bluegl_glTextureStorage2D: + mov __blue_glCore_glTextureStorage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEnablei -.type bluegl_glEnablei, %function -bluegl_glEnablei: - mov __blue_glCore_glEnablei@GOTPCREL(%rip), %r11 +.global bluegl_glTextureStorage3D +.type bluegl_glTextureStorage3D, %function +bluegl_glTextureStorage3D: + mov __blue_glCore_glTextureStorage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureParameterIuivEXT -.type bluegl_glGetTextureParameterIuivEXT, %function -bluegl_glGetTextureParameterIuivEXT: - mov __blue_glCore_glGetTextureParameterIuivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTextureStorage2DMultisample +.type bluegl_glTextureStorage2DMultisample, %function +bluegl_glTextureStorage2DMultisample: + mov __blue_glCore_glTextureStorage2DMultisample@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramInterfaceiv -.type bluegl_glGetProgramInterfaceiv, %function -bluegl_glGetProgramInterfaceiv: - mov __blue_glCore_glGetProgramInterfaceiv@GOTPCREL(%rip), %r11 +.global bluegl_glTextureStorage3DMultisample +.type bluegl_glTextureStorage3DMultisample, %function +bluegl_glTextureStorage3DMultisample: + mov __blue_glCore_glTextureStorage3DMultisample@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClientAttribDefaultEXT -.type bluegl_glClientAttribDefaultEXT, %function -bluegl_glClientAttribDefaultEXT: - mov __blue_glCore_glClientAttribDefaultEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTextureSubImage1D +.type bluegl_glTextureSubImage1D, %function +bluegl_glTextureSubImage1D: + mov __blue_glCore_glTextureSubImage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL3ui64NV -.type bluegl_glVertexAttribL3ui64NV, %function -bluegl_glVertexAttribL3ui64NV: - mov __blue_glCore_glVertexAttribL3ui64NV@GOTPCREL(%rip), %r11 +.global bluegl_glTextureSubImage2D +.type bluegl_glTextureSubImage2D, %function +bluegl_glTextureSubImage2D: + mov __blue_glCore_glTextureSubImage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2dARB -.type bluegl_glWindowPos2dARB, %function -bluegl_glWindowPos2dARB: - mov __blue_glCore_glWindowPos2dARB@GOTPCREL(%rip), %r11 +.global bluegl_glTextureSubImage3D +.type bluegl_glTextureSubImage3D, %function +bluegl_glTextureSubImage3D: + mov __blue_glCore_glTextureSubImage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI2uiEXT -.type bluegl_glVertexAttribI2uiEXT, %function -bluegl_glVertexAttribI2uiEXT: - mov __blue_glCore_glVertexAttribI2uiEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTextureSubImage1D +.type bluegl_glCompressedTextureSubImage1D, %function +bluegl_glCompressedTextureSubImage1D: + mov __blue_glCore_glCompressedTextureSubImage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindVertexBuffers -.type bluegl_glBindVertexBuffers, %function -bluegl_glBindVertexBuffers: - mov __blue_glCore_glBindVertexBuffers@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTextureSubImage2D +.type bluegl_glCompressedTextureSubImage2D, %function +bluegl_glCompressedTextureSubImage2D: + mov __blue_glCore_glCompressedTextureSubImage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix3x4fv -.type bluegl_glProgramUniformMatrix3x4fv, %function -bluegl_glProgramUniformMatrix3x4fv: - mov __blue_glCore_glProgramUniformMatrix3x4fv@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTextureSubImage3D +.type bluegl_glCompressedTextureSubImage3D, %function +bluegl_glCompressedTextureSubImage3D: + mov __blue_glCore_glCompressedTextureSubImage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTexLevelParameterxvOES -.type bluegl_glGetTexLevelParameterxvOES, %function -bluegl_glGetTexLevelParameterxvOES: - mov __blue_glCore_glGetTexLevelParameterxvOES@GOTPCREL(%rip), %r11 +.global bluegl_glCopyTextureSubImage1D +.type bluegl_glCopyTextureSubImage1D, %function +bluegl_glCopyTextureSubImage1D: + mov __blue_glCore_glCopyTextureSubImage1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribPointer -.type bluegl_glVertexAttribPointer, %function -bluegl_glVertexAttribPointer: - mov __blue_glCore_glVertexAttribPointer@GOTPCREL(%rip), %r11 +.global bluegl_glCopyTextureSubImage2D +.type bluegl_glCopyTextureSubImage2D, %function +bluegl_glCopyTextureSubImage2D: + mov __blue_glCore_glCopyTextureSubImage2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureImage1DEXT -.type bluegl_glTextureImage1DEXT, %function -bluegl_glTextureImage1DEXT: - mov __blue_glCore_glTextureImage1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCopyTextureSubImage3D +.type bluegl_glCopyTextureSubImage3D, %function +bluegl_glCopyTextureSubImage3D: + mov __blue_glCore_glCopyTextureSubImage3D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribs4dvNV -.type bluegl_glVertexAttribs4dvNV, %function -bluegl_glVertexAttribs4dvNV: - mov __blue_glCore_glVertexAttribs4dvNV@GOTPCREL(%rip), %r11 +.global bluegl_glTextureParameterf +.type bluegl_glTextureParameterf, %function +bluegl_glTextureParameterf: + mov __blue_glCore_glTextureParameterf@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3svEXT -.type bluegl_glSecondaryColor3svEXT, %function -bluegl_glSecondaryColor3svEXT: - mov __blue_glCore_glSecondaryColor3svEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTextureParameterfv +.type bluegl_glTextureParameterfv, %function +bluegl_glTextureParameterfv: + mov __blue_glCore_glTextureParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetQueryivARB -.type bluegl_glGetQueryivARB, %function -bluegl_glGetQueryivARB: - mov __blue_glCore_glGetQueryivARB@GOTPCREL(%rip), %r11 +.global bluegl_glTextureParameteri +.type bluegl_glTextureParameteri, %function +bluegl_glTextureParameteri: + mov __blue_glCore_glTextureParameteri@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord4bOES -.type bluegl_glTexCoord4bOES, %function -bluegl_glTexCoord4bOES: - mov __blue_glCore_glTexCoord4bOES@GOTPCREL(%rip), %r11 +.global bluegl_glTextureParameterIiv +.type bluegl_glTextureParameterIiv, %function +bluegl_glTextureParameterIiv: + mov __blue_glCore_glTextureParameterIiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1fEXT -.type bluegl_glProgramUniform1fEXT, %function -bluegl_glProgramUniform1fEXT: - mov __blue_glCore_glProgramUniform1fEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTextureParameterIuiv +.type bluegl_glTextureParameterIuiv, %function +bluegl_glTextureParameterIuiv: + mov __blue_glCore_glTextureParameterIuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexP2ui -.type bluegl_glVertexP2ui, %function -bluegl_glVertexP2ui: - mov __blue_glCore_glVertexP2ui@GOTPCREL(%rip), %r11 +.global bluegl_glTextureParameteriv +.type bluegl_glTextureParameteriv, %function +bluegl_glTextureParameteriv: + mov __blue_glCore_glTextureParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSetInvariantEXT -.type bluegl_glSetInvariantEXT, %function -bluegl_glSetInvariantEXT: - mov __blue_glCore_glSetInvariantEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGenerateTextureMipmap +.type bluegl_glGenerateTextureMipmap, %function +bluegl_glGenerateTextureMipmap: + mov __blue_glCore_glGenerateTextureMipmap@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glActiveShaderProgram -.type bluegl_glActiveShaderProgram, %function -bluegl_glActiveShaderProgram: - mov __blue_glCore_glActiveShaderProgram@GOTPCREL(%rip), %r11 +.global bluegl_glBindTextureUnit +.type bluegl_glBindTextureUnit, %function +bluegl_glBindTextureUnit: + mov __blue_glCore_glBindTextureUnit@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL1ui64NV -.type bluegl_glVertexAttribL1ui64NV, %function -bluegl_glVertexAttribL1ui64NV: - mov __blue_glCore_glVertexAttribL1ui64NV@GOTPCREL(%rip), %r11 +.global bluegl_glGetTextureImage +.type bluegl_glGetTextureImage, %function +bluegl_glGetTextureImage: + mov __blue_glCore_glGetTextureImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVariantBooleanvEXT -.type bluegl_glGetVariantBooleanvEXT, %function -bluegl_glGetVariantBooleanvEXT: - mov __blue_glCore_glGetVariantBooleanvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetCompressedTextureImage +.type bluegl_glGetCompressedTextureImage, %function +bluegl_glGetCompressedTextureImage: + mov __blue_glCore_glGetCompressedTextureImage@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glGetTextureLevelParameterfv +.type bluegl_glGetTextureLevelParameterfv, %function +bluegl_glGetTextureLevelParameterfv: + mov __blue_glCore_glGetTextureLevelParameterfv@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glGetTextureLevelParameteriv +.type bluegl_glGetTextureLevelParameteriv, %function +bluegl_glGetTextureLevelParameteriv: + mov __blue_glCore_glGetTextureLevelParameteriv@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glGetTextureParameterfv +.type bluegl_glGetTextureParameterfv, %function +bluegl_glGetTextureParameterfv: + mov __blue_glCore_glGetTextureParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glAreTexturesResidentEXT -.type bluegl_glAreTexturesResidentEXT, %function -bluegl_glAreTexturesResidentEXT: - mov __blue_glCore_glAreTexturesResidentEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetTextureParameterIiv +.type bluegl_glGetTextureParameterIiv, %function +bluegl_glGetTextureParameterIiv: + mov __blue_glCore_glGetTextureParameterIiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixMultTranspose3x3fNV -.type bluegl_glMatrixMultTranspose3x3fNV, %function -bluegl_glMatrixMultTranspose3x3fNV: - mov __blue_glCore_glMatrixMultTranspose3x3fNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetTextureParameterIuiv +.type bluegl_glGetTextureParameterIuiv, %function +bluegl_glGetTextureParameterIuiv: + mov __blue_glCore_glGetTextureParameterIuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2f -.type bluegl_glProgramUniform2f, %function -bluegl_glProgramUniform2f: - mov __blue_glCore_glProgramUniform2f@GOTPCREL(%rip), %r11 +.global bluegl_glGetTextureParameteriv +.type bluegl_glGetTextureParameteriv, %function +bluegl_glGetTextureParameteriv: + mov __blue_glCore_glGetTextureParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearNamedBufferDataEXT -.type bluegl_glClearNamedBufferDataEXT, %function -bluegl_glClearNamedBufferDataEXT: - mov __blue_glCore_glClearNamedBufferDataEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCreateVertexArrays +.type bluegl_glCreateVertexArrays, %function +bluegl_glCreateVertexArrays: + mov __blue_glCore_glCreateVertexArrays@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsOcclusionQueryNV -.type bluegl_glIsOcclusionQueryNV, %function -bluegl_glIsOcclusionQueryNV: - mov __blue_glCore_glIsOcclusionQueryNV@GOTPCREL(%rip), %r11 +.global bluegl_glDisableVertexArrayAttrib +.type bluegl_glDisableVertexArrayAttrib, %function +bluegl_glDisableVertexArrayAttrib: + mov __blue_glCore_glDisableVertexArrayAttrib@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI4bv -.type bluegl_glVertexAttribI4bv, %function -bluegl_glVertexAttribI4bv: - mov __blue_glCore_glVertexAttribI4bv@GOTPCREL(%rip), %r11 +.global bluegl_glEnableVertexArrayAttrib +.type bluegl_glEnableVertexArrayAttrib, %function +bluegl_glEnableVertexArrayAttrib: + mov __blue_glCore_glEnableVertexArrayAttrib@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord2xvOES -.type bluegl_glTexCoord2xvOES, %function -bluegl_glTexCoord2xvOES: - mov __blue_glCore_glTexCoord2xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayElementBuffer +.type bluegl_glVertexArrayElementBuffer, %function +bluegl_glVertexArrayElementBuffer: + mov __blue_glCore_glVertexArrayElementBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4Nubv -.type bluegl_glVertexAttrib4Nubv, %function -bluegl_glVertexAttrib4Nubv: - mov __blue_glCore_glVertexAttrib4Nubv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayVertexBuffer +.type bluegl_glVertexArrayVertexBuffer, %function +bluegl_glVertexArrayVertexBuffer: + mov __blue_glCore_glVertexArrayVertexBuffer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3hNV -.type bluegl_glVertexAttrib3hNV, %function -bluegl_glVertexAttrib3hNV: - mov __blue_glCore_glVertexAttrib3hNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayVertexBuffers +.type bluegl_glVertexArrayVertexBuffers, %function +bluegl_glVertexArrayVertexBuffers: + mov __blue_glCore_glVertexArrayVertexBuffers@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2xvOES -.type bluegl_glMultiTexCoord2xvOES, %function -bluegl_glMultiTexCoord2xvOES: - mov __blue_glCore_glMultiTexCoord2xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayAttribBinding +.type bluegl_glVertexArrayAttribBinding, %function +bluegl_glVertexArrayAttribBinding: + mov __blue_glCore_glVertexArrayAttribBinding@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferTextureEXT -.type bluegl_glFramebufferTextureEXT, %function -bluegl_glFramebufferTextureEXT: - mov __blue_glCore_glFramebufferTextureEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayAttribFormat +.type bluegl_glVertexArrayAttribFormat, %function +bluegl_glVertexArrayAttribFormat: + mov __blue_glCore_glVertexArrayAttribFormat@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix3fv -.type bluegl_glProgramUniformMatrix3fv, %function -bluegl_glProgramUniformMatrix3fv: - mov __blue_glCore_glProgramUniformMatrix3fv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayAttribIFormat +.type bluegl_glVertexArrayAttribIFormat, %function +bluegl_glVertexArrayAttribIFormat: + mov __blue_glCore_glVertexArrayAttribIFormat@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetInternalformatSampleivNV -.type bluegl_glGetInternalformatSampleivNV, %function -bluegl_glGetInternalformatSampleivNV: - mov __blue_glCore_glGetInternalformatSampleivNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayAttribLFormat +.type bluegl_glVertexArrayAttribLFormat, %function +bluegl_glVertexArrayAttribLFormat: + mov __blue_glCore_glVertexArrayAttribLFormat@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathSubCommandsNV -.type bluegl_glPathSubCommandsNV, %function -bluegl_glPathSubCommandsNV: - mov __blue_glCore_glPathSubCommandsNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayBindingDivisor +.type bluegl_glVertexArrayBindingDivisor, %function +bluegl_glVertexArrayBindingDivisor: + mov __blue_glCore_glVertexArrayBindingDivisor@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStencilStrokePathNV -.type bluegl_glStencilStrokePathNV, %function -bluegl_glStencilStrokePathNV: - mov __blue_glCore_glStencilStrokePathNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexArrayiv +.type bluegl_glGetVertexArrayiv, %function +bluegl_glGetVertexArrayiv: + mov __blue_glCore_glGetVertexArrayiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathParameterfNV -.type bluegl_glPathParameterfNV, %function -bluegl_glPathParameterfNV: - mov __blue_glCore_glPathParameterfNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexArrayIndexediv +.type bluegl_glGetVertexArrayIndexediv, %function +bluegl_glGetVertexArrayIndexediv: + mov __blue_glCore_glGetVertexArrayIndexediv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glActiveProgramEXT -.type bluegl_glActiveProgramEXT, %function -bluegl_glActiveProgramEXT: - mov __blue_glCore_glActiveProgramEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexArrayIndexed64iv +.type bluegl_glGetVertexArrayIndexed64iv, %function +bluegl_glGetVertexArrayIndexed64iv: + mov __blue_glCore_glGetVertexArrayIndexed64iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClampColorARB -.type bluegl_glClampColorARB, %function -bluegl_glClampColorARB: - mov __blue_glCore_glClampColorARB@GOTPCREL(%rip), %r11 +.global bluegl_glCreateSamplers +.type bluegl_glCreateSamplers, %function +bluegl_glCreateSamplers: + mov __blue_glCore_glCreateSamplers@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI2uivEXT -.type bluegl_glVertexAttribI2uivEXT, %function -bluegl_glVertexAttribI2uivEXT: - mov __blue_glCore_glVertexAttribI2uivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCreateProgramPipelines +.type bluegl_glCreateProgramPipelines, %function +bluegl_glCreateProgramPipelines: + mov __blue_glCore_glCreateProgramPipelines@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL1ui64vARB -.type bluegl_glVertexAttribL1ui64vARB, %function -bluegl_glVertexAttribL1ui64vARB: - mov __blue_glCore_glVertexAttribL1ui64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glCreateQueries +.type bluegl_glCreateQueries, %function +bluegl_glCreateQueries: + mov __blue_glCore_glCreateQueries@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glValidateProgram -.type bluegl_glValidateProgram, %function -bluegl_glValidateProgram: - mov __blue_glCore_glValidateProgram@GOTPCREL(%rip), %r11 +.global bluegl_glGetQueryBufferObjecti64v +.type bluegl_glGetQueryBufferObjecti64v, %function +bluegl_glGetQueryBufferObjecti64v: + mov __blue_glCore_glGetQueryBufferObjecti64v@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2xOES -.type bluegl_glMultiTexCoord2xOES, %function -bluegl_glMultiTexCoord2xOES: - mov __blue_glCore_glMultiTexCoord2xOES@GOTPCREL(%rip), %r11 +.global bluegl_glGetQueryBufferObjectiv +.type bluegl_glGetQueryBufferObjectiv, %function +bluegl_glGetQueryBufferObjectiv: + mov __blue_glCore_glGetQueryBufferObjectiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFogCoordf -.type bluegl_glFogCoordf, %function -bluegl_glFogCoordf: - mov __blue_glCore_glFogCoordf@GOTPCREL(%rip), %r11 +.global bluegl_glGetQueryBufferObjectui64v +.type bluegl_glGetQueryBufferObjectui64v, %function +bluegl_glGetQueryBufferObjectui64v: + mov __blue_glCore_glGetQueryBufferObjectui64v@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetError -.type bluegl_glGetError, %function -bluegl_glGetError: - mov __blue_glCore_glGetError@GOTPCREL(%rip), %r11 +.global bluegl_glGetQueryBufferObjectuiv +.type bluegl_glGetQueryBufferObjectuiv, %function +bluegl_glGetQueryBufferObjectuiv: + mov __blue_glCore_glGetQueryBufferObjectuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSpriteParameterfSGIX -.type bluegl_glSpriteParameterfSGIX, %function -bluegl_glSpriteParameterfSGIX: - mov __blue_glCore_glSpriteParameterfSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glMemoryBarrierByRegion +.type bluegl_glMemoryBarrierByRegion, %function +bluegl_glMemoryBarrierByRegion: + mov __blue_glCore_glMemoryBarrierByRegion@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3dvNV -.type bluegl_glVertexAttrib3dvNV, %function -bluegl_glVertexAttrib3dvNV: - mov __blue_glCore_glVertexAttrib3dvNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetTextureSubImage +.type bluegl_glGetTextureSubImage, %function +bluegl_glGetTextureSubImage: + mov __blue_glCore_glGetTextureSubImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3bOES -.type bluegl_glMultiTexCoord3bOES, %function -bluegl_glMultiTexCoord3bOES: - mov __blue_glCore_glMultiTexCoord3bOES@GOTPCREL(%rip), %r11 +.global bluegl_glGetCompressedTextureSubImage +.type bluegl_glGetCompressedTextureSubImage, %function +bluegl_glGetCompressedTextureSubImage: + mov __blue_glCore_glGetCompressedTextureSubImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTexParameterIuivEXT -.type bluegl_glGetTexParameterIuivEXT, %function -bluegl_glGetTexParameterIuivEXT: - mov __blue_glCore_glGetTexParameterIuivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetGraphicsResetStatus +.type bluegl_glGetGraphicsResetStatus, %function +bluegl_glGetGraphicsResetStatus: + mov __blue_glCore_glGetGraphicsResetStatus@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIndexMaterialEXT -.type bluegl_glIndexMaterialEXT, %function -bluegl_glIndexMaterialEXT: - mov __blue_glCore_glIndexMaterialEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetnCompressedTexImage +.type bluegl_glGetnCompressedTexImage, %function +bluegl_glGetnCompressedTexImage: + mov __blue_glCore_glGetnCompressedTexImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1iARB -.type bluegl_glUniform1iARB, %function -bluegl_glUniform1iARB: - mov __blue_glCore_glUniform1iARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetnTexImage +.type bluegl_glGetnTexImage, %function +bluegl_glGetnTexImage: + mov __blue_glCore_glGetnTexImage@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4NivARB -.type bluegl_glVertexAttrib4NivARB, %function -bluegl_glVertexAttrib4NivARB: - mov __blue_glCore_glVertexAttrib4NivARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetnUniformdv +.type bluegl_glGetnUniformdv, %function +bluegl_glGetnUniformdv: + mov __blue_glCore_glGetnUniformdv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureParameteri -.type bluegl_glTextureParameteri, %function -bluegl_glTextureParameteri: - mov __blue_glCore_glTextureParameteri@GOTPCREL(%rip), %r11 +.global bluegl_glGetnUniformfv +.type bluegl_glGetnUniformfv, %function +bluegl_glGetnUniformfv: + mov __blue_glCore_glGetnUniformfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3d -.type bluegl_glSecondaryColor3d, %function -bluegl_glSecondaryColor3d: - mov __blue_glCore_glSecondaryColor3d@GOTPCREL(%rip), %r11 +.global bluegl_glGetnUniformiv +.type bluegl_glGetnUniformiv, %function +bluegl_glGetnUniformiv: + mov __blue_glCore_glGetnUniformiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2sv -.type bluegl_glWindowPos2sv, %function -bluegl_glWindowPos2sv: - mov __blue_glCore_glWindowPos2sv@GOTPCREL(%rip), %r11 +.global bluegl_glGetnUniformuiv +.type bluegl_glGetnUniformuiv, %function +bluegl_glGetnUniformuiv: + mov __blue_glCore_glGetnUniformuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawBuffersARB -.type bluegl_glDrawBuffersARB, %function -bluegl_glDrawBuffersARB: - mov __blue_glCore_glDrawBuffersARB@GOTPCREL(%rip), %r11 +.global bluegl_glReadnPixels +.type bluegl_glReadnPixels, %function +bluegl_glReadnPixels: + mov __blue_glCore_glReadnPixels@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMultiTexParameterIuivEXT -.type bluegl_glGetMultiTexParameterIuivEXT, %function -bluegl_glGetMultiTexParameterIuivEXT: - mov __blue_glCore_glGetMultiTexParameterIuivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTextureBarrier +.type bluegl_glTextureBarrier, %function +bluegl_glTextureBarrier: + mov __blue_glCore_glTextureBarrier@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetConvolutionFilter -.type bluegl_glGetConvolutionFilter, %function -bluegl_glGetConvolutionFilter: - mov __blue_glCore_glGetConvolutionFilter@GOTPCREL(%rip), %r11 +.global bluegl_glGetTextureHandleARB +.type bluegl_glGetTextureHandleARB, %function +bluegl_glGetTextureHandleARB: + mov __blue_glCore_glGetTextureHandleARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDisableVertexArrayAttrib -.type bluegl_glDisableVertexArrayAttrib, %function -bluegl_glDisableVertexArrayAttrib: - mov __blue_glCore_glDisableVertexArrayAttrib@GOTPCREL(%rip), %r11 +.global bluegl_glGetTextureSamplerHandleARB +.type bluegl_glGetTextureSamplerHandleARB, %function +bluegl_glGetTextureSamplerHandleARB: + mov __blue_glCore_glGetTextureSamplerHandleARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4i -.type bluegl_glProgramUniform4i, %function -bluegl_glProgramUniform4i: - mov __blue_glCore_glProgramUniform4i@GOTPCREL(%rip), %r11 +.global bluegl_glMakeTextureHandleResidentARB +.type bluegl_glMakeTextureHandleResidentARB, %function +bluegl_glMakeTextureHandleResidentARB: + mov __blue_glCore_glMakeTextureHandleResidentARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCheckNamedFramebufferStatusEXT -.type bluegl_glCheckNamedFramebufferStatusEXT, %function -bluegl_glCheckNamedFramebufferStatusEXT: - mov __blue_glCore_glCheckNamedFramebufferStatusEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMakeTextureHandleNonResidentARB +.type bluegl_glMakeTextureHandleNonResidentARB, %function +bluegl_glMakeTextureHandleNonResidentARB: + mov __blue_glCore_glMakeTextureHandleNonResidentARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3xOES -.type bluegl_glMultiTexCoord3xOES, %function -bluegl_glMultiTexCoord3xOES: - mov __blue_glCore_glMultiTexCoord3xOES@GOTPCREL(%rip), %r11 +.global bluegl_glGetImageHandleARB +.type bluegl_glGetImageHandleARB, %function +bluegl_glGetImageHandleARB: + mov __blue_glCore_glGetImageHandleARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawElementsInstancedEXT -.type bluegl_glDrawElementsInstancedEXT, %function -bluegl_glDrawElementsInstancedEXT: - mov __blue_glCore_glDrawElementsInstancedEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMakeImageHandleResidentARB +.type bluegl_glMakeImageHandleResidentARB, %function +bluegl_glMakeImageHandleResidentARB: + mov __blue_glCore_glMakeImageHandleResidentARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColor4fNormal3fVertex3fvSUN -.type bluegl_glColor4fNormal3fVertex3fvSUN, %function -bluegl_glColor4fNormal3fVertex3fvSUN: - mov __blue_glCore_glColor4fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glMakeImageHandleNonResidentARB +.type bluegl_glMakeImageHandleNonResidentARB, %function +bluegl_glMakeImageHandleNonResidentARB: + mov __blue_glCore_glMakeImageHandleNonResidentARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsTransformFeedbackNV -.type bluegl_glIsTransformFeedbackNV, %function -bluegl_glIsTransformFeedbackNV: - mov __blue_glCore_glIsTransformFeedbackNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniformHandleui64ARB +.type bluegl_glUniformHandleui64ARB, %function +bluegl_glUniformHandleui64ARB: + mov __blue_glCore_glUniformHandleui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawTransformFeedbackStreamInstanced -.type bluegl_glDrawTransformFeedbackStreamInstanced, %function -bluegl_glDrawTransformFeedbackStreamInstanced: - mov __blue_glCore_glDrawTransformFeedbackStreamInstanced@GOTPCREL(%rip), %r11 +.global bluegl_glUniformHandleui64vARB +.type bluegl_glUniformHandleui64vARB, %function +bluegl_glUniformHandleui64vARB: + mov __blue_glCore_glUniformHandleui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMapNamedBufferEXT -.type bluegl_glMapNamedBufferEXT, %function -bluegl_glMapNamedBufferEXT: - mov __blue_glCore_glMapNamedBufferEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformHandleui64ARB +.type bluegl_glProgramUniformHandleui64ARB, %function +bluegl_glProgramUniformHandleui64ARB: + mov __blue_glCore_glProgramUniformHandleui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayIndexOffsetEXT -.type bluegl_glVertexArrayIndexOffsetEXT, %function -bluegl_glVertexArrayIndexOffsetEXT: - mov __blue_glCore_glVertexArrayIndexOffsetEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformHandleui64vARB +.type bluegl_glProgramUniformHandleui64vARB, %function +bluegl_glProgramUniformHandleui64vARB: + mov __blue_glCore_glProgramUniformHandleui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPolygonMode -.type bluegl_glPolygonMode, %function -bluegl_glPolygonMode: - mov __blue_glCore_glPolygonMode@GOTPCREL(%rip), %r11 +.global bluegl_glIsTextureHandleResidentARB +.type bluegl_glIsTextureHandleResidentARB, %function +bluegl_glIsTextureHandleResidentARB: + mov __blue_glCore_glIsTextureHandleResidentARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetDetailTexFuncSGIS -.type bluegl_glGetDetailTexFuncSGIS, %function -bluegl_glGetDetailTexFuncSGIS: - mov __blue_glCore_glGetDetailTexFuncSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glIsImageHandleResidentARB +.type bluegl_glIsImageHandleResidentARB, %function +bluegl_glIsImageHandleResidentARB: + mov __blue_glCore_glIsImageHandleResidentARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2iv -.type bluegl_glMultiTexCoord2iv, %function -bluegl_glMultiTexCoord2iv: - mov __blue_glCore_glMultiTexCoord2iv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL1ui64ARB +.type bluegl_glVertexAttribL1ui64ARB, %function +bluegl_glVertexAttribL1ui64ARB: + mov __blue_glCore_glVertexAttribL1ui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetHistogramParameterfvEXT -.type bluegl_glGetHistogramParameterfvEXT, %function -bluegl_glGetHistogramParameterfvEXT: - mov __blue_glCore_glGetHistogramParameterfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL1ui64vARB +.type bluegl_glVertexAttribL1ui64vARB, %function +bluegl_glVertexAttribL1ui64vARB: + mov __blue_glCore_glVertexAttribL1ui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4fvEXT -.type bluegl_glProgramUniform4fvEXT, %function -bluegl_glProgramUniform4fvEXT: - mov __blue_glCore_glProgramUniform4fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribLui64vARB +.type bluegl_glGetVertexAttribLui64vARB, %function +bluegl_glGetVertexAttribLui64vARB: + mov __blue_glCore_glGetVertexAttribLui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDetailTexFuncSGIS -.type bluegl_glDetailTexFuncSGIS, %function -bluegl_glDetailTexFuncSGIS: - mov __blue_glCore_glDetailTexFuncSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glCreateSyncFromCLeventARB +.type bluegl_glCreateSyncFromCLeventARB, %function +bluegl_glCreateSyncFromCLeventARB: + mov __blue_glCore_glCreateSyncFromCLeventARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexParameterIivEXT -.type bluegl_glTexParameterIivEXT, %function -bluegl_glTexParameterIivEXT: - mov __blue_glCore_glTexParameterIivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDispatchComputeGroupSizeARB +.type bluegl_glDispatchComputeGroupSizeARB, %function +bluegl_glDispatchComputeGroupSizeARB: + mov __blue_glCore_glDispatchComputeGroupSizeARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedFramebufferTextureLayerEXT -.type bluegl_glNamedFramebufferTextureLayerEXT, %function -bluegl_glNamedFramebufferTextureLayerEXT: - mov __blue_glCore_glNamedFramebufferTextureLayerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDebugMessageControlARB +.type bluegl_glDebugMessageControlARB, %function +bluegl_glDebugMessageControlARB: + mov __blue_glCore_glDebugMessageControlARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDisablei -.type bluegl_glDisablei, %function -bluegl_glDisablei: - mov __blue_glCore_glDisablei@GOTPCREL(%rip), %r11 +.global bluegl_glDebugMessageInsertARB +.type bluegl_glDebugMessageInsertARB, %function +bluegl_glDebugMessageInsertARB: + mov __blue_glCore_glDebugMessageInsertARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4fv -.type bluegl_glUniform4fv, %function -bluegl_glUniform4fv: - mov __blue_glCore_glUniform4fv@GOTPCREL(%rip), %r11 +.global bluegl_glDebugMessageCallbackARB +.type bluegl_glDebugMessageCallbackARB, %function +bluegl_glDebugMessageCallbackARB: + mov __blue_glCore_glDebugMessageCallbackARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1hNV -.type bluegl_glVertexAttrib1hNV, %function -bluegl_glVertexAttrib1hNV: - mov __blue_glCore_glVertexAttrib1hNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetDebugMessageLogARB +.type bluegl_glGetDebugMessageLogARB, %function +bluegl_glGetDebugMessageLogARB: + mov __blue_glCore_glGetDebugMessageLogARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWeightsvARB -.type bluegl_glWeightsvARB, %function -bluegl_glWeightsvARB: - mov __blue_glCore_glWeightsvARB@GOTPCREL(%rip), %r11 +.global bluegl_glBlendEquationiARB +.type bluegl_glBlendEquationiARB, %function +bluegl_glBlendEquationiARB: + mov __blue_glCore_glBlendEquationiARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSampleMaskIndexedNV -.type bluegl_glSampleMaskIndexedNV, %function -bluegl_glSampleMaskIndexedNV: - mov __blue_glCore_glSampleMaskIndexedNV@GOTPCREL(%rip), %r11 +.global bluegl_glBlendEquationSeparateiARB +.type bluegl_glBlendEquationSeparateiARB, %function +bluegl_glBlendEquationSeparateiARB: + mov __blue_glCore_glBlendEquationSeparateiARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4dvARB -.type bluegl_glVertexAttrib4dvARB, %function -bluegl_glVertexAttrib4dvARB: - mov __blue_glCore_glVertexAttrib4dvARB@GOTPCREL(%rip), %r11 +.global bluegl_glBlendFunciARB +.type bluegl_glBlendFunciARB, %function +bluegl_glBlendFunciARB: + mov __blue_glCore_glBlendFunciARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBeginFragmentShaderATI -.type bluegl_glBeginFragmentShaderATI, %function -bluegl_glBeginFragmentShaderATI: - mov __blue_glCore_glBeginFragmentShaderATI@GOTPCREL(%rip), %r11 +.global bluegl_glBlendFuncSeparateiARB +.type bluegl_glBlendFuncSeparateiARB, %function +bluegl_glBlendFuncSeparateiARB: + mov __blue_glCore_glBlendFuncSeparateiARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedProgramLocalParameterI4ivEXT -.type bluegl_glNamedProgramLocalParameterI4ivEXT, %function -bluegl_glNamedProgramLocalParameterI4ivEXT: - mov __blue_glCore_glNamedProgramLocalParameterI4ivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiDrawArraysIndirectCountARB +.type bluegl_glMultiDrawArraysIndirectCountARB, %function +bluegl_glMultiDrawArraysIndirectCountARB: + mov __blue_glCore_glMultiDrawArraysIndirectCountARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetConvolutionParameteriv -.type bluegl_glGetConvolutionParameteriv, %function -bluegl_glGetConvolutionParameteriv: - mov __blue_glCore_glGetConvolutionParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glMultiDrawElementsIndirectCountARB +.type bluegl_glMultiDrawElementsIndirectCountARB, %function +bluegl_glMultiDrawElementsIndirectCountARB: + mov __blue_glCore_glMultiDrawElementsIndirectCountARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClipControl -.type bluegl_glClipControl, %function -bluegl_glClipControl: - mov __blue_glCore_glClipControl@GOTPCREL(%rip), %r11 +.global bluegl_glGetGraphicsResetStatusARB +.type bluegl_glGetGraphicsResetStatusARB, %function +bluegl_glGetGraphicsResetStatusARB: + mov __blue_glCore_glGetGraphicsResetStatusARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBinormal3fEXT -.type bluegl_glBinormal3fEXT, %function -bluegl_glBinormal3fEXT: - mov __blue_glCore_glBinormal3fEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetnTexImageARB +.type bluegl_glGetnTexImageARB, %function +bluegl_glGetnTexImageARB: + mov __blue_glCore_glGetnTexImageARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColor4ubVertex2fSUN -.type bluegl_glColor4ubVertex2fSUN, %function -bluegl_glColor4ubVertex2fSUN: - mov __blue_glCore_glColor4ubVertex2fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glReadnPixelsARB +.type bluegl_glReadnPixelsARB, %function +bluegl_glReadnPixelsARB: + mov __blue_glCore_glReadnPixelsARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTexImage3D -.type bluegl_glCompressedTexImage3D, %function -bluegl_glCompressedTexImage3D: - mov __blue_glCore_glCompressedTexImage3D@GOTPCREL(%rip), %r11 +.global bluegl_glGetnCompressedTexImageARB +.type bluegl_glGetnCompressedTexImageARB, %function +bluegl_glGetnCompressedTexImageARB: + mov __blue_glCore_glGetnCompressedTexImageARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureSamplerHandleARB -.type bluegl_glGetTextureSamplerHandleARB, %function -bluegl_glGetTextureSamplerHandleARB: - mov __blue_glCore_glGetTextureSamplerHandleARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetnUniformfvARB +.type bluegl_glGetnUniformfvARB, %function +bluegl_glGetnUniformfvARB: + mov __blue_glCore_glGetnUniformfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3uiv -.type bluegl_glUniform3uiv, %function -bluegl_glUniform3uiv: - mov __blue_glCore_glUniform3uiv@GOTPCREL(%rip), %r11 +.global bluegl_glGetnUniformivARB +.type bluegl_glGetnUniformivARB, %function +bluegl_glGetnUniformivARB: + mov __blue_glCore_glGetnUniformivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribPointerv -.type bluegl_glGetVertexAttribPointerv, %function -bluegl_glGetVertexAttribPointerv: - mov __blue_glCore_glGetVertexAttribPointerv@GOTPCREL(%rip), %r11 +.global bluegl_glGetnUniformuivARB +.type bluegl_glGetnUniformuivARB, %function +bluegl_glGetnUniformuivARB: + mov __blue_glCore_glGetnUniformuivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenBuffers -.type bluegl_glGenBuffers, %function -bluegl_glGenBuffers: - mov __blue_glCore_glGenBuffers@GOTPCREL(%rip), %r11 +.global bluegl_glGetnUniformdvARB +.type bluegl_glGetnUniformdvARB, %function +bluegl_glGetnUniformdvARB: + mov __blue_glCore_glGetnUniformdvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3dvARB -.type bluegl_glVertexAttrib3dvARB, %function -bluegl_glVertexAttrib3dvARB: - mov __blue_glCore_glVertexAttrib3dvARB@GOTPCREL(%rip), %r11 +.global bluegl_glMinSampleShadingARB +.type bluegl_glMinSampleShadingARB, %function +bluegl_glMinSampleShadingARB: + mov __blue_glCore_glMinSampleShadingARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFlushVertexArrayRangeNV -.type bluegl_glFlushVertexArrayRangeNV, %function -bluegl_glFlushVertexArrayRangeNV: - mov __blue_glCore_glFlushVertexArrayRangeNV@GOTPCREL(%rip), %r11 +.global bluegl_glNamedStringARB +.type bluegl_glNamedStringARB, %function +bluegl_glNamedStringARB: + mov __blue_glCore_glNamedStringARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramNamedParameterdvNV -.type bluegl_glGetProgramNamedParameterdvNV, %function -bluegl_glGetProgramNamedParameterdvNV: - mov __blue_glCore_glGetProgramNamedParameterdvNV@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteNamedStringARB +.type bluegl_glDeleteNamedStringARB, %function +bluegl_glDeleteNamedStringARB: + mov __blue_glCore_glDeleteNamedStringARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glConvolutionParameterf -.type bluegl_glConvolutionParameterf, %function -bluegl_glConvolutionParameterf: - mov __blue_glCore_glConvolutionParameterf@GOTPCREL(%rip), %r11 +.global bluegl_glCompileShaderIncludeARB +.type bluegl_glCompileShaderIncludeARB, %function +bluegl_glCompileShaderIncludeARB: + mov __blue_glCore_glCompileShaderIncludeARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertex2bOES -.type bluegl_glVertex2bOES, %function -bluegl_glVertex2bOES: - mov __blue_glCore_glVertex2bOES@GOTPCREL(%rip), %r11 +.global bluegl_glIsNamedStringARB +.type bluegl_glIsNamedStringARB, %function +bluegl_glIsNamedStringARB: + mov __blue_glCore_glIsNamedStringARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetObjectPtrLabel -.type bluegl_glGetObjectPtrLabel, %function -bluegl_glGetObjectPtrLabel: - mov __blue_glCore_glGetObjectPtrLabel@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedStringARB +.type bluegl_glGetNamedStringARB, %function +bluegl_glGetNamedStringARB: + mov __blue_glCore_glGetNamedStringARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBeginTransformFeedbackNV -.type bluegl_glBeginTransformFeedbackNV, %function -bluegl_glBeginTransformFeedbackNV: - mov __blue_glCore_glBeginTransformFeedbackNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedStringivARB +.type bluegl_glGetNamedStringivARB, %function +bluegl_glGetNamedStringivARB: + mov __blue_glCore_glGetNamedStringivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureSubImage -.type bluegl_glGetTextureSubImage, %function -bluegl_glGetTextureSubImage: - mov __blue_glCore_glGetTextureSubImage@GOTPCREL(%rip), %r11 +.global bluegl_glBufferPageCommitmentARB +.type bluegl_glBufferPageCommitmentARB, %function +bluegl_glBufferPageCommitmentARB: + mov __blue_glCore_glBufferPageCommitmentARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFramebufferAttachmentParameterivEXT -.type bluegl_glGetFramebufferAttachmentParameterivEXT, %function -bluegl_glGetFramebufferAttachmentParameterivEXT: - mov __blue_glCore_glGetFramebufferAttachmentParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glNamedBufferPageCommitmentEXT +.type bluegl_glNamedBufferPageCommitmentEXT, %function +bluegl_glNamedBufferPageCommitmentEXT: + mov __blue_glCore_glNamedBufferPageCommitmentEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetInteger64v -.type bluegl_glGetInteger64v, %function -bluegl_glGetInteger64v: - mov __blue_glCore_glGetInteger64v@GOTPCREL(%rip), %r11 +.global bluegl_glNamedBufferPageCommitmentARB +.type bluegl_glNamedBufferPageCommitmentARB, %function +bluegl_glNamedBufferPageCommitmentARB: + mov __blue_glCore_glNamedBufferPageCommitmentARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetUniformLocation -.type bluegl_glGetUniformLocation, %function -bluegl_glGetUniformLocation: - mov __blue_glCore_glGetUniformLocation@GOTPCREL(%rip), %r11 +.global bluegl_glTexPageCommitmentARB +.type bluegl_glTexPageCommitmentARB, %function +bluegl_glTexPageCommitmentARB: + mov __blue_glCore_glTexPageCommitmentARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2fv -.type bluegl_glMultiTexCoord2fv, %function -bluegl_glMultiTexCoord2fv: - mov __blue_glCore_glMultiTexCoord2fv@GOTPCREL(%rip), %r11 +.global bluegl_glClientActiveTexture +.type bluegl_glClientActiveTexture, %function +bluegl_glClientActiveTexture: + mov __blue_glCore_glClientActiveTexture@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2uiv -.type bluegl_glProgramUniform2uiv, %function -bluegl_glProgramUniform2uiv: - mov __blue_glCore_glProgramUniform2uiv@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1d +.type bluegl_glMultiTexCoord1d, %function +bluegl_glMultiTexCoord1d: + mov __blue_glCore_glMultiTexCoord1d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTexParameterIuiv -.type bluegl_glGetTexParameterIuiv, %function -bluegl_glGetTexParameterIuiv: - mov __blue_glCore_glGetTexParameterIuiv@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1dv +.type bluegl_glMultiTexCoord1dv, %function +bluegl_glMultiTexCoord1dv: + mov __blue_glCore_glMultiTexCoord1dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI4ui -.type bluegl_glVertexAttribI4ui, %function -bluegl_glVertexAttribI4ui: - mov __blue_glCore_glVertexAttribI4ui@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1f +.type bluegl_glMultiTexCoord1f, %function +bluegl_glMultiTexCoord1f: + mov __blue_glCore_glMultiTexCoord1f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexGenxvOES -.type bluegl_glTexGenxvOES, %function -bluegl_glTexGenxvOES: - mov __blue_glCore_glTexGenxvOES@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1fv +.type bluegl_glMultiTexCoord1fv, %function +bluegl_glMultiTexCoord1fv: + mov __blue_glCore_glMultiTexCoord1fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertex4bOES -.type bluegl_glVertex4bOES, %function -bluegl_glVertex4bOES: - mov __blue_glCore_glVertex4bOES@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1i +.type bluegl_glMultiTexCoord1i, %function +bluegl_glMultiTexCoord1i: + mov __blue_glCore_glMultiTexCoord1i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyTexSubImage2DEXT -.type bluegl_glCopyTexSubImage2DEXT, %function -bluegl_glCopyTexSubImage2DEXT: - mov __blue_glCore_glCopyTexSubImage2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1iv +.type bluegl_glMultiTexCoord1iv, %function +bluegl_glMultiTexCoord1iv: + mov __blue_glCore_glMultiTexCoord1iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawBuffersATI -.type bluegl_glDrawBuffersATI, %function -bluegl_glDrawBuffersATI: - mov __blue_glCore_glDrawBuffersATI@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1s +.type bluegl_glMultiTexCoord1s, %function +bluegl_glMultiTexCoord1s: + mov __blue_glCore_glMultiTexCoord1s@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathGlyphsNV -.type bluegl_glPathGlyphsNV, %function -bluegl_glPathGlyphsNV: - mov __blue_glCore_glPathGlyphsNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1sv +.type bluegl_glMultiTexCoord1sv, %function +bluegl_glMultiTexCoord1sv: + mov __blue_glCore_glMultiTexCoord1sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixIndexuivARB -.type bluegl_glMatrixIndexuivARB, %function -bluegl_glMatrixIndexuivARB: - mov __blue_glCore_glMatrixIndexuivARB@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2d +.type bluegl_glMultiTexCoord2d, %function +bluegl_glMultiTexCoord2d: + mov __blue_glCore_glMultiTexCoord2d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedProgramLocalParameterI4uiEXT -.type bluegl_glNamedProgramLocalParameterI4uiEXT, %function -bluegl_glNamedProgramLocalParameterI4uiEXT: - mov __blue_glCore_glNamedProgramLocalParameterI4uiEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2dv +.type bluegl_glMultiTexCoord2dv, %function +bluegl_glMultiTexCoord2dv: + mov __blue_glCore_glMultiTexCoord2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2iv -.type bluegl_glWindowPos2iv, %function -bluegl_glWindowPos2iv: - mov __blue_glCore_glWindowPos2iv@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2f +.type bluegl_glMultiTexCoord2f, %function +bluegl_glMultiTexCoord2f: + mov __blue_glCore_glMultiTexCoord2f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLightModelxOES -.type bluegl_glLightModelxOES, %function -bluegl_glLightModelxOES: - mov __blue_glCore_glLightModelxOES@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2fv +.type bluegl_glMultiTexCoord2fv, %function +bluegl_glMultiTexCoord2fv: + mov __blue_glCore_glMultiTexCoord2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindFragmentShaderATI -.type bluegl_glBindFragmentShaderATI, %function -bluegl_glBindFragmentShaderATI: - mov __blue_glCore_glBindFragmentShaderATI@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2i +.type bluegl_glMultiTexCoord2i, %function +bluegl_glMultiTexCoord2i: + mov __blue_glCore_glMultiTexCoord2i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glInvalidateTexSubImage -.type bluegl_glInvalidateTexSubImage, %function -bluegl_glInvalidateTexSubImage: - mov __blue_glCore_glInvalidateTexSubImage@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2iv +.type bluegl_glMultiTexCoord2iv, %function +bluegl_glMultiTexCoord2iv: + mov __blue_glCore_glMultiTexCoord2iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4sARB -.type bluegl_glVertexAttrib4sARB, %function -bluegl_glVertexAttrib4sARB: - mov __blue_glCore_glVertexAttrib4sARB@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2s +.type bluegl_glMultiTexCoord2s, %function +bluegl_glMultiTexCoord2s: + mov __blue_glCore_glMultiTexCoord2s@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramiv -.type bluegl_glGetProgramiv, %function -bluegl_glGetProgramiv: - mov __blue_glCore_glGetProgramiv@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2sv +.type bluegl_glMultiTexCoord2sv, %function +bluegl_glMultiTexCoord2sv: + mov __blue_glCore_glMultiTexCoord2sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVideoCaptureStreamivNV -.type bluegl_glGetVideoCaptureStreamivNV, %function -bluegl_glGetVideoCaptureStreamivNV: - mov __blue_glCore_glGetVideoCaptureStreamivNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3d +.type bluegl_glMultiTexCoord3d, %function +bluegl_glMultiTexCoord3d: + mov __blue_glCore_glMultiTexCoord3d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureParameterfvEXT -.type bluegl_glTextureParameterfvEXT, %function -bluegl_glTextureParameterfvEXT: - mov __blue_glCore_glTextureParameterfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3dv +.type bluegl_glMultiTexCoord3dv, %function +bluegl_glMultiTexCoord3dv: + mov __blue_glCore_glMultiTexCoord3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPNTrianglesfATI -.type bluegl_glPNTrianglesfATI, %function -bluegl_glPNTrianglesfATI: - mov __blue_glCore_glPNTrianglesfATI@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3f +.type bluegl_glMultiTexCoord3f, %function +bluegl_glMultiTexCoord3f: + mov __blue_glCore_glMultiTexCoord3f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCheckNamedFramebufferStatus -.type bluegl_glCheckNamedFramebufferStatus, %function -bluegl_glCheckNamedFramebufferStatus: - mov __blue_glCore_glCheckNamedFramebufferStatus@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3fv +.type bluegl_glMultiTexCoord3fv, %function +bluegl_glMultiTexCoord3fv: + mov __blue_glCore_glMultiTexCoord3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4uiEXT -.type bluegl_glUniform4uiEXT, %function -bluegl_glUniform4uiEXT: - mov __blue_glCore_glUniform4uiEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3i +.type bluegl_glMultiTexCoord3i, %function +bluegl_glMultiTexCoord3i: + mov __blue_glCore_glMultiTexCoord3i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib2sv -.type bluegl_glVertexAttrib2sv, %function -bluegl_glVertexAttrib2sv: - mov __blue_glCore_glVertexAttrib2sv@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3iv +.type bluegl_glMultiTexCoord3iv, %function +bluegl_glMultiTexCoord3iv: + mov __blue_glCore_glMultiTexCoord3iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearBufferData -.type bluegl_glClearBufferData, %function -bluegl_glClearBufferData: - mov __blue_glCore_glClearBufferData@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3s +.type bluegl_glMultiTexCoord3s, %function +bluegl_glMultiTexCoord3s: + mov __blue_glCore_glMultiTexCoord3s@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glShaderSourceARB -.type bluegl_glShaderSourceARB, %function -bluegl_glShaderSourceARB: - mov __blue_glCore_glShaderSourceARB@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3sv +.type bluegl_glMultiTexCoord3sv, %function +bluegl_glMultiTexCoord3sv: + mov __blue_glCore_glMultiTexCoord3sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glObjectPurgeableAPPLE -.type bluegl_glObjectPurgeableAPPLE, %function -bluegl_glObjectPurgeableAPPLE: - mov __blue_glCore_glObjectPurgeableAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4d +.type bluegl_glMultiTexCoord4d, %function +bluegl_glMultiTexCoord4d: + mov __blue_glCore_glMultiTexCoord4d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2iEXT -.type bluegl_glProgramUniform2iEXT, %function -bluegl_glProgramUniform2iEXT: - mov __blue_glCore_glProgramUniform2iEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4dv +.type bluegl_glMultiTexCoord4dv, %function +bluegl_glMultiTexCoord4dv: + mov __blue_glCore_glMultiTexCoord4dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetStringi -.type bluegl_glGetStringi, %function -bluegl_glGetStringi: - mov __blue_glCore_glGetStringi@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4f +.type bluegl_glMultiTexCoord4f, %function +bluegl_glMultiTexCoord4f: + mov __blue_glCore_glMultiTexCoord4f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexFilterFuncSGIS -.type bluegl_glTexFilterFuncSGIS, %function -bluegl_glTexFilterFuncSGIS: - mov __blue_glCore_glTexFilterFuncSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4fv +.type bluegl_glMultiTexCoord4fv, %function +bluegl_glMultiTexCoord4fv: + mov __blue_glCore_glMultiTexCoord4fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayVertexAttribLOffsetEXT -.type bluegl_glVertexArrayVertexAttribLOffsetEXT, %function -bluegl_glVertexArrayVertexAttribLOffsetEXT: - mov __blue_glCore_glVertexArrayVertexAttribLOffsetEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4i +.type bluegl_glMultiTexCoord4i, %function +bluegl_glMultiTexCoord4i: + mov __blue_glCore_glMultiTexCoord4i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramLocalParametersI4uivNV -.type bluegl_glProgramLocalParametersI4uivNV, %function -bluegl_glProgramLocalParametersI4uivNV: - mov __blue_glCore_glProgramLocalParametersI4uivNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4iv +.type bluegl_glMultiTexCoord4iv, %function +bluegl_glMultiTexCoord4iv: + mov __blue_glCore_glMultiTexCoord4iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetHistogramEXT -.type bluegl_glGetHistogramEXT, %function -bluegl_glGetHistogramEXT: - mov __blue_glCore_glGetHistogramEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4s +.type bluegl_glMultiTexCoord4s, %function +bluegl_glMultiTexCoord4s: + mov __blue_glCore_glMultiTexCoord4s@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedBufferPageCommitmentARB -.type bluegl_glNamedBufferPageCommitmentARB, %function -bluegl_glNamedBufferPageCommitmentARB: - mov __blue_glCore_glNamedBufferPageCommitmentARB@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4sv +.type bluegl_glMultiTexCoord4sv, %function +bluegl_glMultiTexCoord4sv: + mov __blue_glCore_glMultiTexCoord4sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMakeBufferResidentNV -.type bluegl_glMakeBufferResidentNV, %function -bluegl_glMakeBufferResidentNV: - mov __blue_glCore_glMakeBufferResidentNV@GOTPCREL(%rip), %r11 +.global bluegl_glLoadTransposeMatrixf +.type bluegl_glLoadTransposeMatrixf, %function +bluegl_glLoadTransposeMatrixf: + mov __blue_glCore_glLoadTransposeMatrixf@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedFramebufferDrawBuffers -.type bluegl_glNamedFramebufferDrawBuffers, %function -bluegl_glNamedFramebufferDrawBuffers: - mov __blue_glCore_glNamedFramebufferDrawBuffers@GOTPCREL(%rip), %r11 +.global bluegl_glLoadTransposeMatrixd +.type bluegl_glLoadTransposeMatrixd, %function +bluegl_glLoadTransposeMatrixd: + mov __blue_glCore_glLoadTransposeMatrixd@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexPointerListIBM -.type bluegl_glVertexPointerListIBM, %function -bluegl_glVertexPointerListIBM: - mov __blue_glCore_glVertexPointerListIBM@GOTPCREL(%rip), %r11 +.global bluegl_glMultTransposeMatrixf +.type bluegl_glMultTransposeMatrixf, %function +bluegl_glMultTransposeMatrixf: + mov __blue_glCore_glMultTransposeMatrixf@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetUniformui64vNV -.type bluegl_glGetUniformui64vNV, %function -bluegl_glGetUniformui64vNV: - mov __blue_glCore_glGetUniformui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultTransposeMatrixd +.type bluegl_glMultTransposeMatrixd, %function +bluegl_glMultTransposeMatrixd: + mov __blue_glCore_glMultTransposeMatrixd@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearDepthfOES -.type bluegl_glClearDepthfOES, %function -bluegl_glClearDepthfOES: - mov __blue_glCore_glClearDepthfOES@GOTPCREL(%rip), %r11 +.global bluegl_glFogCoordf +.type bluegl_glFogCoordf, %function +bluegl_glFogCoordf: + mov __blue_glCore_glFogCoordf@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2iMESA -.type bluegl_glWindowPos2iMESA, %function -bluegl_glWindowPos2iMESA: - mov __blue_glCore_glWindowPos2iMESA@GOTPCREL(%rip), %r11 +.global bluegl_glFogCoordfv +.type bluegl_glFogCoordfv, %function +bluegl_glFogCoordfv: + mov __blue_glCore_glFogCoordfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyTextureImage1DEXT -.type bluegl_glCopyTextureImage1DEXT, %function -bluegl_glCopyTextureImage1DEXT: - mov __blue_glCore_glCopyTextureImage1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glFogCoordd +.type bluegl_glFogCoordd, %function +bluegl_glFogCoordd: + mov __blue_glCore_glFogCoordd@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBeginOcclusionQueryNV -.type bluegl_glBeginOcclusionQueryNV, %function -bluegl_glBeginOcclusionQueryNV: - mov __blue_glCore_glBeginOcclusionQueryNV@GOTPCREL(%rip), %r11 +.global bluegl_glFogCoorddv +.type bluegl_glFogCoorddv, %function +bluegl_glFogCoorddv: + mov __blue_glCore_glFogCoorddv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLoadTransposeMatrixf -.type bluegl_glLoadTransposeMatrixf, %function -bluegl_glLoadTransposeMatrixf: - mov __blue_glCore_glLoadTransposeMatrixf@GOTPCREL(%rip), %r11 +.global bluegl_glFogCoordPointer +.type bluegl_glFogCoordPointer, %function +bluegl_glFogCoordPointer: + mov __blue_glCore_glFogCoordPointer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedRenderbufferStorageMultisampleEXT -.type bluegl_glNamedRenderbufferStorageMultisampleEXT, %function -bluegl_glNamedRenderbufferStorageMultisampleEXT: - mov __blue_glCore_glNamedRenderbufferStorageMultisampleEXT@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3b +.type bluegl_glSecondaryColor3b, %function +bluegl_glSecondaryColor3b: + mov __blue_glCore_glSecondaryColor3b@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormalStream3fATI -.type bluegl_glNormalStream3fATI, %function -bluegl_glNormalStream3fATI: - mov __blue_glCore_glNormalStream3fATI@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3bv +.type bluegl_glSecondaryColor3bv, %function +bluegl_glSecondaryColor3bv: + mov __blue_glCore_glSecondaryColor3bv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormal3hNV -.type bluegl_glNormal3hNV, %function -bluegl_glNormal3hNV: - mov __blue_glCore_glNormal3hNV@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3d +.type bluegl_glSecondaryColor3d, %function +bluegl_glSecondaryColor3d: + mov __blue_glCore_glSecondaryColor3d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUseProgram -.type bluegl_glUseProgram, %function -bluegl_glUseProgram: - mov __blue_glCore_glUseProgram@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3dv +.type bluegl_glSecondaryColor3dv, %function +bluegl_glSecondaryColor3dv: + mov __blue_glCore_glSecondaryColor3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPushGroupMarkerEXT -.type bluegl_glPushGroupMarkerEXT, %function -bluegl_glPushGroupMarkerEXT: - mov __blue_glCore_glPushGroupMarkerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3f +.type bluegl_glSecondaryColor3f, %function +bluegl_glSecondaryColor3f: + mov __blue_glCore_glSecondaryColor3f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexSubImage2DEXT -.type bluegl_glMultiTexSubImage2DEXT, %function -bluegl_glMultiTexSubImage2DEXT: - mov __blue_glCore_glMultiTexSubImage2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3fv +.type bluegl_glSecondaryColor3fv, %function +bluegl_glSecondaryColor3fv: + mov __blue_glCore_glSecondaryColor3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayRangeNV -.type bluegl_glVertexArrayRangeNV, %function -bluegl_glVertexArrayRangeNV: - mov __blue_glCore_glVertexArrayRangeNV@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3i +.type bluegl_glSecondaryColor3i, %function +bluegl_glSecondaryColor3i: + mov __blue_glCore_glSecondaryColor3i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMultiTexLevelParameterivEXT -.type bluegl_glGetMultiTexLevelParameterivEXT, %function -bluegl_glGetMultiTexLevelParameterivEXT: - mov __blue_glCore_glGetMultiTexLevelParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3iv +.type bluegl_glSecondaryColor3iv, %function +bluegl_glSecondaryColor3iv: + mov __blue_glCore_glSecondaryColor3iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiDrawArraysEXT -.type bluegl_glMultiDrawArraysEXT, %function -bluegl_glMultiDrawArraysEXT: - mov __blue_glCore_glMultiDrawArraysEXT@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3s +.type bluegl_glSecondaryColor3s, %function +bluegl_glSecondaryColor3s: + mov __blue_glCore_glSecondaryColor3s@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL4ui64NV -.type bluegl_glVertexAttribL4ui64NV, %function -bluegl_glVertexAttribL4ui64NV: - mov __blue_glCore_glVertexAttribL4ui64NV@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3sv +.type bluegl_glSecondaryColor3sv, %function +bluegl_glSecondaryColor3sv: + mov __blue_glCore_glSecondaryColor3sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4Nub -.type bluegl_glVertexAttrib4Nub, %function -bluegl_glVertexAttrib4Nub: - mov __blue_glCore_glVertexAttrib4Nub@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3ub +.type bluegl_glSecondaryColor3ub, %function +bluegl_glSecondaryColor3ub: + mov __blue_glCore_glSecondaryColor3ub@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFogCoordhNV -.type bluegl_glFogCoordhNV, %function -bluegl_glFogCoordhNV: - mov __blue_glCore_glFogCoordhNV@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3ubv +.type bluegl_glSecondaryColor3ubv, %function +bluegl_glSecondaryColor3ubv: + mov __blue_glCore_glSecondaryColor3ubv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI3ui -.type bluegl_glVertexAttribI3ui, %function -bluegl_glVertexAttribI3ui: - mov __blue_glCore_glVertexAttribI3ui@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3ui +.type bluegl_glSecondaryColor3ui, %function +bluegl_glSecondaryColor3ui: + mov __blue_glCore_glSecondaryColor3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexImage3DMultisampleCoverageNV -.type bluegl_glTexImage3DMultisampleCoverageNV, %function -bluegl_glTexImage3DMultisampleCoverageNV: - mov __blue_glCore_glTexImage3DMultisampleCoverageNV@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3uiv +.type bluegl_glSecondaryColor3uiv, %function +bluegl_glSecondaryColor3uiv: + mov __blue_glCore_glSecondaryColor3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetUniformBufferSizeEXT -.type bluegl_glGetUniformBufferSizeEXT, %function -bluegl_glGetUniformBufferSizeEXT: - mov __blue_glCore_glGetUniformBufferSizeEXT@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3us +.type bluegl_glSecondaryColor3us, %function +bluegl_glSecondaryColor3us: + mov __blue_glCore_glSecondaryColor3us@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompileCommandListNV -.type bluegl_glCompileCommandListNV, %function -bluegl_glCompileCommandListNV: - mov __blue_glCore_glCompileCommandListNV@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3usv +.type bluegl_glSecondaryColor3usv, %function +bluegl_glSecondaryColor3usv: + mov __blue_glCore_glSecondaryColor3usv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayVertexAttribBindingEXT -.type bluegl_glVertexArrayVertexAttribBindingEXT, %function -bluegl_glVertexArrayVertexAttribBindingEXT: - mov __blue_glCore_glVertexArrayVertexAttribBindingEXT@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColorPointer +.type bluegl_glSecondaryColorPointer, %function +bluegl_glSecondaryColorPointer: + mov __blue_glCore_glSecondaryColorPointer@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendEquation -.type bluegl_glBlendEquation, %function -bluegl_glBlendEquation: - mov __blue_glCore_glBlendEquation@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2d +.type bluegl_glWindowPos2d, %function +bluegl_glWindowPos2d: + mov __blue_glCore_glWindowPos2d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBinormal3dvEXT -.type bluegl_glBinormal3dvEXT, %function -bluegl_glBinormal3dvEXT: - mov __blue_glCore_glBinormal3dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2dv +.type bluegl_glWindowPos2dv, %function +bluegl_glWindowPos2dv: + mov __blue_glCore_glWindowPos2dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexFormatNV -.type bluegl_glVertexFormatNV, %function -bluegl_glVertexFormatNV: - mov __blue_glCore_glVertexFormatNV@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2f +.type bluegl_glWindowPos2f, %function +bluegl_glWindowPos2f: + mov __blue_glCore_glWindowPos2f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4fv -.type bluegl_glProgramUniform4fv, %function -bluegl_glProgramUniform4fv: - mov __blue_glCore_glProgramUniform4fv@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2fv +.type bluegl_glWindowPos2fv, %function +bluegl_glWindowPos2fv: + mov __blue_glCore_glWindowPos2fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureStorage2DMultisample -.type bluegl_glTextureStorage2DMultisample, %function -bluegl_glTextureStorage2DMultisample: - mov __blue_glCore_glTextureStorage2DMultisample@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2i +.type bluegl_glWindowPos2i, %function +bluegl_glWindowPos2i: + mov __blue_glCore_glWindowPos2i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3uiEXT -.type bluegl_glProgramUniform3uiEXT, %function -bluegl_glProgramUniform3uiEXT: - mov __blue_glCore_glProgramUniform3uiEXT@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2iv +.type bluegl_glWindowPos2iv, %function +bluegl_glWindowPos2iv: + mov __blue_glCore_glWindowPos2iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferDrawBufferEXT -.type bluegl_glFramebufferDrawBufferEXT, %function -bluegl_glFramebufferDrawBufferEXT: - mov __blue_glCore_glFramebufferDrawBufferEXT@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2s +.type bluegl_glWindowPos2s, %function +bluegl_glWindowPos2s: + mov __blue_glCore_glWindowPos2s@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreateTextures -.type bluegl_glCreateTextures, %function -bluegl_glCreateTextures: - mov __blue_glCore_glCreateTextures@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2sv +.type bluegl_glWindowPos2sv, %function +bluegl_glWindowPos2sv: + mov __blue_glCore_glWindowPos2sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixPopEXT -.type bluegl_glMatrixPopEXT, %function -bluegl_glMatrixPopEXT: - mov __blue_glCore_glMatrixPopEXT@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3d +.type bluegl_glWindowPos3d, %function +bluegl_glWindowPos3d: + mov __blue_glCore_glWindowPos3d@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformui64vNV -.type bluegl_glProgramUniformui64vNV, %function -bluegl_glProgramUniformui64vNV: - mov __blue_glCore_glProgramUniformui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3dv +.type bluegl_glWindowPos3dv, %function +bluegl_glWindowPos3dv: + mov __blue_glCore_glWindowPos3dv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferTexture2D -.type bluegl_glFramebufferTexture2D, %function -bluegl_glFramebufferTexture2D: - mov __blue_glCore_glFramebufferTexture2D@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3f +.type bluegl_glWindowPos3f, %function +bluegl_glWindowPos3f: + mov __blue_glCore_glWindowPos3f@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetAttribLocation -.type bluegl_glGetAttribLocation, %function -bluegl_glGetAttribLocation: - mov __blue_glCore_glGetAttribLocation@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3fv +.type bluegl_glWindowPos3fv, %function +bluegl_glWindowPos3fv: + mov __blue_glCore_glWindowPos3fv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2fARB -.type bluegl_glUniform2fARB, %function -bluegl_glUniform2fARB: - mov __blue_glCore_glUniform2fARB@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3i +.type bluegl_glWindowPos3i, %function +bluegl_glWindowPos3i: + mov __blue_glCore_glWindowPos3i@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDisableVertexArrayAttribEXT -.type bluegl_glDisableVertexArrayAttribEXT, %function -bluegl_glDisableVertexArrayAttribEXT: - mov __blue_glCore_glDisableVertexArrayAttribEXT@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3iv +.type bluegl_glWindowPos3iv, %function +bluegl_glWindowPos3iv: + mov __blue_glCore_glWindowPos3iv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexStorage2D -.type bluegl_glTexStorage2D, %function -bluegl_glTexStorage2D: - mov __blue_glCore_glTexStorage2D@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3s +.type bluegl_glWindowPos3s, %function +bluegl_glWindowPos3s: + mov __blue_glCore_glWindowPos3s@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI1iEXT -.type bluegl_glVertexAttribI1iEXT, %function -bluegl_glVertexAttribI1iEXT: - mov __blue_glCore_glVertexAttribI1iEXT@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3sv +.type bluegl_glWindowPos3sv, %function +bluegl_glWindowPos3sv: + mov __blue_glCore_glWindowPos3sv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4ui -.type bluegl_glUniform4ui, %function -bluegl_glUniform4ui: - mov __blue_glCore_glUniform4ui@GOTPCREL(%rip), %r11 +.global bluegl_glVertexP2ui +.type bluegl_glVertexP2ui, %function +bluegl_glVertexP2ui: + mov __blue_glCore_glVertexP2ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoordP1uiv -.type bluegl_glMultiTexCoordP1uiv, %function -bluegl_glMultiTexCoordP1uiv: - mov __blue_glCore_glMultiTexCoordP1uiv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexP2uiv +.type bluegl_glVertexP2uiv, %function +bluegl_glVertexP2uiv: + mov __blue_glCore_glVertexP2uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedProgramLocalParametersI4ivEXT -.type bluegl_glNamedProgramLocalParametersI4ivEXT, %function -bluegl_glNamedProgramLocalParametersI4ivEXT: - mov __blue_glCore_glNamedProgramLocalParametersI4ivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexP3ui +.type bluegl_glVertexP3ui, %function +bluegl_glVertexP3ui: + mov __blue_glCore_glVertexP3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glImageTransformParameteriHP -.type bluegl_glImageTransformParameteriHP, %function -bluegl_glImageTransformParameteriHP: - mov __blue_glCore_glImageTransformParameteriHP@GOTPCREL(%rip), %r11 +.global bluegl_glVertexP3uiv +.type bluegl_glVertexP3uiv, %function +bluegl_glVertexP3uiv: + mov __blue_glCore_glVertexP3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsBuffer -.type bluegl_glIsBuffer, %function -bluegl_glIsBuffer: - mov __blue_glCore_glIsBuffer@GOTPCREL(%rip), %r11 +.global bluegl_glVertexP4ui +.type bluegl_glVertexP4ui, %function +bluegl_glVertexP4ui: + mov __blue_glCore_glVertexP4ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFogCoorddv -.type bluegl_glFogCoorddv, %function -bluegl_glFogCoorddv: - mov __blue_glCore_glFogCoorddv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexP4uiv +.type bluegl_glVertexP4uiv, %function +bluegl_glVertexP4uiv: + mov __blue_glCore_glVertexP4uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClientActiveTexture -.type bluegl_glClientActiveTexture, %function -bluegl_glClientActiveTexture: - mov __blue_glCore_glClientActiveTexture@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoordP1ui +.type bluegl_glTexCoordP1ui, %function +bluegl_glTexCoordP1ui: + mov __blue_glCore_glTexCoordP1ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformHandleui64vNV -.type bluegl_glUniformHandleui64vNV, %function -bluegl_glUniformHandleui64vNV: - mov __blue_glCore_glUniformHandleui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoordP1uiv +.type bluegl_glTexCoordP1uiv, %function +bluegl_glTexCoordP1uiv: + mov __blue_glCore_glTexCoordP1uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3fARB -.type bluegl_glWindowPos3fARB, %function -bluegl_glWindowPos3fARB: - mov __blue_glCore_glWindowPos3fARB@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoordP2ui +.type bluegl_glTexCoordP2ui, %function +bluegl_glTexCoordP2ui: + mov __blue_glCore_glTexCoordP2ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribfvARB -.type bluegl_glGetVertexAttribfvARB, %function -bluegl_glGetVertexAttribfvARB: - mov __blue_glCore_glGetVertexAttribfvARB@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoordP2uiv +.type bluegl_glTexCoordP2uiv, %function +bluegl_glTexCoordP2uiv: + mov __blue_glCore_glTexCoordP2uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSamplerParameterfv -.type bluegl_glSamplerParameterfv, %function -bluegl_glSamplerParameterfv: - mov __blue_glCore_glSamplerParameterfv@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoordP3ui +.type bluegl_glTexCoordP3ui, %function +bluegl_glTexCoordP3ui: + mov __blue_glCore_glTexCoordP3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4NsvARB -.type bluegl_glVertexAttrib4NsvARB, %function -bluegl_glVertexAttrib4NsvARB: - mov __blue_glCore_glVertexAttrib4NsvARB@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoordP3uiv +.type bluegl_glTexCoordP3uiv, %function +bluegl_glTexCoordP3uiv: + mov __blue_glCore_glTexCoordP3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2ivEXT -.type bluegl_glProgramUniform2ivEXT, %function -bluegl_glProgramUniform2ivEXT: - mov __blue_glCore_glProgramUniform2ivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoordP4ui +.type bluegl_glTexCoordP4ui, %function +bluegl_glTexCoordP4ui: + mov __blue_glCore_glTexCoordP4ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedProgramStringEXT -.type bluegl_glNamedProgramStringEXT, %function -bluegl_glNamedProgramStringEXT: - mov __blue_glCore_glNamedProgramStringEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoordP4uiv +.type bluegl_glTexCoordP4uiv, %function +bluegl_glTexCoordP4uiv: + mov __blue_glCore_glTexCoordP4uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPointSize -.type bluegl_glPointSize, %function -bluegl_glPointSize: - mov __blue_glCore_glPointSize@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoordP1ui +.type bluegl_glMultiTexCoordP1ui, %function +bluegl_glMultiTexCoordP1ui: + mov __blue_glCore_glMultiTexCoordP1ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord4hNV -.type bluegl_glTexCoord4hNV, %function -bluegl_glTexCoord4hNV: - mov __blue_glCore_glTexCoord4hNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoordP1uiv +.type bluegl_glMultiTexCoordP1uiv, %function +bluegl_glMultiTexCoordP1uiv: + mov __blue_glCore_glMultiTexCoordP1uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetIntegerIndexedvEXT -.type bluegl_glGetIntegerIndexedvEXT, %function -bluegl_glGetIntegerIndexedvEXT: - mov __blue_glCore_glGetIntegerIndexedvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoordP2ui +.type bluegl_glMultiTexCoordP2ui, %function +bluegl_glMultiTexCoordP2ui: + mov __blue_glCore_glMultiTexCoordP2ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPrimitiveBoundingBoxARB -.type bluegl_glPrimitiveBoundingBoxARB, %function -bluegl_glPrimitiveBoundingBoxARB: - mov __blue_glCore_glPrimitiveBoundingBoxARB@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoordP2uiv +.type bluegl_glMultiTexCoordP2uiv, %function +bluegl_glMultiTexCoordP2uiv: + mov __blue_glCore_glMultiTexCoordP2uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDebugMessageInsert -.type bluegl_glDebugMessageInsert, %function -bluegl_glDebugMessageInsert: - mov __blue_glCore_glDebugMessageInsert@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoordP3ui +.type bluegl_glMultiTexCoordP3ui, %function +bluegl_glMultiTexCoordP3ui: + mov __blue_glCore_glMultiTexCoordP3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3bvOES -.type bluegl_glMultiTexCoord3bvOES, %function -bluegl_glMultiTexCoord3bvOES: - mov __blue_glCore_glMultiTexCoord3bvOES@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoordP3uiv +.type bluegl_glMultiTexCoordP3uiv, %function +bluegl_glMultiTexCoordP3uiv: + mov __blue_glCore_glMultiTexCoordP3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL1i64vNV -.type bluegl_glVertexAttribL1i64vNV, %function -bluegl_glVertexAttribL1i64vNV: - mov __blue_glCore_glVertexAttribL1i64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoordP4ui +.type bluegl_glMultiTexCoordP4ui, %function +bluegl_glMultiTexCoordP4ui: + mov __blue_glCore_glMultiTexCoordP4ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureBuffer -.type bluegl_glTextureBuffer, %function -bluegl_glTextureBuffer: - mov __blue_glCore_glTextureBuffer@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoordP4uiv +.type bluegl_glMultiTexCoordP4uiv, %function +bluegl_glMultiTexCoordP4uiv: + mov __blue_glCore_glMultiTexCoordP4uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureParameterIiv -.type bluegl_glGetTextureParameterIiv, %function -bluegl_glGetTextureParameterIiv: - mov __blue_glCore_glGetTextureParameterIiv@GOTPCREL(%rip), %r11 +.global bluegl_glNormalP3ui +.type bluegl_glNormalP3ui, %function +bluegl_glNormalP3ui: + mov __blue_glCore_glNormalP3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferTexture -.type bluegl_glFramebufferTexture, %function -bluegl_glFramebufferTexture: - mov __blue_glCore_glFramebufferTexture@GOTPCREL(%rip), %r11 +.global bluegl_glNormalP3uiv +.type bluegl_glNormalP3uiv, %function +bluegl_glNormalP3uiv: + mov __blue_glCore_glNormalP3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramivARB -.type bluegl_glGetProgramivARB, %function -bluegl_glGetProgramivARB: - mov __blue_glCore_glGetProgramivARB@GOTPCREL(%rip), %r11 +.global bluegl_glColorP3ui +.type bluegl_glColorP3ui, %function +bluegl_glColorP3ui: + mov __blue_glCore_glColorP3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribPointerARB -.type bluegl_glVertexAttribPointerARB, %function -bluegl_glVertexAttribPointerARB: - mov __blue_glCore_glVertexAttribPointerARB@GOTPCREL(%rip), %r11 +.global bluegl_glColorP3uiv +.type bluegl_glColorP3uiv, %function +bluegl_glColorP3uiv: + mov __blue_glCore_glColorP3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsCommandListNV -.type bluegl_glIsCommandListNV, %function -bluegl_glIsCommandListNV: - mov __blue_glCore_glIsCommandListNV@GOTPCREL(%rip), %r11 +.global bluegl_glColorP4ui +.type bluegl_glColorP4ui, %function +bluegl_glColorP4ui: + mov __blue_glCore_glColorP4ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1uivEXT -.type bluegl_glUniform1uivEXT, %function -bluegl_glUniform1uivEXT: - mov __blue_glCore_glUniform1uivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glColorP4uiv +.type bluegl_glColorP4uiv, %function +bluegl_glColorP4uiv: + mov __blue_glCore_glColorP4uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2i -.type bluegl_glProgramUniform2i, %function -bluegl_glProgramUniform2i: - mov __blue_glCore_glProgramUniform2i@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColorP3ui +.type bluegl_glSecondaryColorP3ui, %function +bluegl_glSecondaryColorP3ui: + mov __blue_glCore_glSecondaryColorP3ui@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribDivisorARB -.type bluegl_glVertexAttribDivisorARB, %function -bluegl_glVertexAttribDivisorARB: - mov __blue_glCore_glVertexAttribDivisorARB@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColorP3uiv +.type bluegl_glSecondaryColorP3uiv, %function +bluegl_glSecondaryColorP3uiv: + mov __blue_glCore_glSecondaryColorP3uiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribPointervARB -.type bluegl_glGetVertexAttribPointervARB, %function -bluegl_glGetVertexAttribPointervARB: - mov __blue_glCore_glGetVertexAttribPointervARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetnMapdv +.type bluegl_glGetnMapdv, %function +bluegl_glGetnMapdv: + mov __blue_glCore_glGetnMapdv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureImage2DMultisampleNV -.type bluegl_glTextureImage2DMultisampleNV, %function -bluegl_glTextureImage2DMultisampleNV: - mov __blue_glCore_glTextureImage2DMultisampleNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetnMapfv +.type bluegl_glGetnMapfv, %function +bluegl_glGetnMapfv: + mov __blue_glCore_glGetnMapfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVariantPointervEXT -.type bluegl_glGetVariantPointervEXT, %function -bluegl_glGetVariantPointervEXT: - mov __blue_glCore_glGetVariantPointervEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetnMapiv +.type bluegl_glGetnMapiv, %function +bluegl_glGetnMapiv: + mov __blue_glCore_glGetnMapiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCheckFramebufferStatus -.type bluegl_glCheckFramebufferStatus, %function -bluegl_glCheckFramebufferStatus: - mov __blue_glCore_glCheckFramebufferStatus@GOTPCREL(%rip), %r11 +.global bluegl_glGetnPixelMapfv +.type bluegl_glGetnPixelMapfv, %function +bluegl_glGetnPixelMapfv: + mov __blue_glCore_glGetnPixelMapfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMap1xOES -.type bluegl_glMap1xOES, %function -bluegl_glMap1xOES: - mov __blue_glCore_glMap1xOES@GOTPCREL(%rip), %r11 +.global bluegl_glGetnPixelMapuiv +.type bluegl_glGetnPixelMapuiv, %function +bluegl_glGetnPixelMapuiv: + mov __blue_glCore_glGetnPixelMapuiv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindSampler -.type bluegl_glBindSampler, %function -bluegl_glBindSampler: - mov __blue_glCore_glBindSampler@GOTPCREL(%rip), %r11 +.global bluegl_glGetnPixelMapusv +.type bluegl_glGetnPixelMapusv, %function +bluegl_glGetnPixelMapusv: + mov __blue_glCore_glGetnPixelMapusv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathGlyphIndexRangeNV -.type bluegl_glPathGlyphIndexRangeNV, %function -bluegl_glPathGlyphIndexRangeNV: - mov __blue_glCore_glPathGlyphIndexRangeNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetnPolygonStipple +.type bluegl_glGetnPolygonStipple, %function +bluegl_glGetnPolygonStipple: + mov __blue_glCore_glGetnPolygonStipple@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramEnvParameters4fvEXT -.type bluegl_glProgramEnvParameters4fvEXT, %function -bluegl_glProgramEnvParameters4fvEXT: - mov __blue_glCore_glProgramEnvParameters4fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetnColorTable +.type bluegl_glGetnColorTable, %function +bluegl_glGetnColorTable: + mov __blue_glCore_glGetnColorTable@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3fNV -.type bluegl_glVertexAttrib3fNV, %function -bluegl_glVertexAttrib3fNV: - mov __blue_glCore_glVertexAttrib3fNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetnConvolutionFilter +.type bluegl_glGetnConvolutionFilter, %function +bluegl_glGetnConvolutionFilter: + mov __blue_glCore_glGetnConvolutionFilter@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindBuffersBase -.type bluegl_glBindBuffersBase, %function -bluegl_glBindBuffersBase: - mov __blue_glCore_glBindBuffersBase@GOTPCREL(%rip), %r11 +.global bluegl_glGetnSeparableFilter +.type bluegl_glGetnSeparableFilter, %function +bluegl_glGetnSeparableFilter: + mov __blue_glCore_glGetnSeparableFilter@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedProgramLocalParameterIivEXT -.type bluegl_glGetNamedProgramLocalParameterIivEXT, %function -bluegl_glGetNamedProgramLocalParameterIivEXT: - mov __blue_glCore_glGetNamedProgramLocalParameterIivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetnHistogram +.type bluegl_glGetnHistogram, %function +bluegl_glGetnHistogram: + mov __blue_glCore_glGetnHistogram@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4d -.type bluegl_glProgramUniform4d, %function -bluegl_glProgramUniform4d: - mov __blue_glCore_glProgramUniform4d@GOTPCREL(%rip), %r11 +.global bluegl_glGetnMinmax +.type bluegl_glGetnMinmax, %function +bluegl_glGetnMinmax: + mov __blue_glCore_glGetnMinmax@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3f -.type bluegl_glMultiTexCoord3f, %function -bluegl_glMultiTexCoord3f: - mov __blue_glCore_glMultiTexCoord3f@GOTPCREL(%rip), %r11 +.global bluegl_glPrimitiveBoundingBoxARB +.type bluegl_glPrimitiveBoundingBoxARB, %function +bluegl_glPrimitiveBoundingBoxARB: + mov __blue_glCore_glPrimitiveBoundingBoxARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteProgram -.type bluegl_glDeleteProgram, %function -bluegl_glDeleteProgram: - mov __blue_glCore_glDeleteProgram@GOTPCREL(%rip), %r11 +.global bluegl_glClampColorARB +.type bluegl_glClampColorARB, %function +bluegl_glClampColorARB: + mov __blue_glCore_glClampColorARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeuiVertex3fvSUN -.type bluegl_glReplacementCodeuiVertex3fvSUN, %function -bluegl_glReplacementCodeuiVertex3fvSUN: - mov __blue_glCore_glReplacementCodeuiVertex3fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glDrawBuffersARB +.type bluegl_glDrawBuffersARB, %function +bluegl_glDrawBuffersARB: + mov __blue_glCore_glDrawBuffersARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMapNamedBufferRange -.type bluegl_glMapNamedBufferRange, %function -bluegl_glMapNamedBufferRange: - mov __blue_glCore_glMapNamedBufferRange@GOTPCREL(%rip), %r11 +.global bluegl_glDrawArraysInstancedARB +.type bluegl_glDrawArraysInstancedARB, %function +bluegl_glDrawArraysInstancedARB: + mov __blue_glCore_glDrawArraysInstancedARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferSampleLocationsfvARB -.type bluegl_glFramebufferSampleLocationsfvARB, %function -bluegl_glFramebufferSampleLocationsfvARB: - mov __blue_glCore_glFramebufferSampleLocationsfvARB@GOTPCREL(%rip), %r11 +.global bluegl_glDrawElementsInstancedARB +.type bluegl_glDrawElementsInstancedARB, %function +bluegl_glDrawElementsInstancedARB: + mov __blue_glCore_glDrawElementsInstancedARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1dvARB -.type bluegl_glMultiTexCoord1dvARB, %function -bluegl_glMultiTexCoord1dvARB: - mov __blue_glCore_glMultiTexCoord1dvARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramStringARB +.type bluegl_glProgramStringARB, %function +bluegl_glProgramStringARB: + mov __blue_glCore_glProgramStringARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearBufferuiv -.type bluegl_glClearBufferuiv, %function -bluegl_glClearBufferuiv: - mov __blue_glCore_glClearBufferuiv@GOTPCREL(%rip), %r11 +.global bluegl_glBindProgramARB +.type bluegl_glBindProgramARB, %function +bluegl_glBindProgramARB: + mov __blue_glCore_glBindProgramARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawRangeElementsEXT -.type bluegl_glDrawRangeElementsEXT, %function -bluegl_glDrawRangeElementsEXT: - mov __blue_glCore_glDrawRangeElementsEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteProgramsARB +.type bluegl_glDeleteProgramsARB, %function +bluegl_glDeleteProgramsARB: + mov __blue_glCore_glDeleteProgramsARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1hvNV -.type bluegl_glVertexAttrib1hvNV, %function -bluegl_glVertexAttrib1hvNV: - mov __blue_glCore_glVertexAttrib1hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glGenProgramsARB +.type bluegl_glGenProgramsARB, %function +bluegl_glGenProgramsARB: + mov __blue_glCore_glGenProgramsARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3bv -.type bluegl_glSecondaryColor3bv, %function -bluegl_glSecondaryColor3bv: - mov __blue_glCore_glSecondaryColor3bv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramEnvParameter4dARB +.type bluegl_glProgramEnvParameter4dARB, %function +bluegl_glProgramEnvParameter4dARB: + mov __blue_glCore_glProgramEnvParameter4dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVDPAUMapSurfacesNV -.type bluegl_glVDPAUMapSurfacesNV, %function -bluegl_glVDPAUMapSurfacesNV: - mov __blue_glCore_glVDPAUMapSurfacesNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramEnvParameter4dvARB +.type bluegl_glProgramEnvParameter4dvARB, %function +bluegl_glProgramEnvParameter4dvARB: + mov __blue_glCore_glProgramEnvParameter4dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStencilMask -.type bluegl_glStencilMask, %function -bluegl_glStencilMask: - mov __blue_glCore_glStencilMask@GOTPCREL(%rip), %r11 +.global bluegl_glProgramEnvParameter4fARB +.type bluegl_glProgramEnvParameter4fARB, %function +bluegl_glProgramEnvParameter4fARB: + mov __blue_glCore_glProgramEnvParameter4fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramResourceLocationIndex -.type bluegl_glGetProgramResourceLocationIndex, %function -bluegl_glGetProgramResourceLocationIndex: - mov __blue_glCore_glGetProgramResourceLocationIndex@GOTPCREL(%rip), %r11 +.global bluegl_glProgramEnvParameter4fvARB +.type bluegl_glProgramEnvParameter4fvARB, %function +bluegl_glProgramEnvParameter4fvARB: + mov __blue_glCore_glProgramEnvParameter4fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetIntegerui64i_vNV -.type bluegl_glGetIntegerui64i_vNV, %function -bluegl_glGetIntegerui64i_vNV: - mov __blue_glCore_glGetIntegerui64i_vNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramLocalParameter4dARB +.type bluegl_glProgramLocalParameter4dARB, %function +bluegl_glProgramLocalParameter4dARB: + mov __blue_glCore_glProgramLocalParameter4dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureLevelParameterfvEXT -.type bluegl_glGetTextureLevelParameterfvEXT, %function -bluegl_glGetTextureLevelParameterfvEXT: - mov __blue_glCore_glGetTextureLevelParameterfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramLocalParameter4dvARB +.type bluegl_glProgramLocalParameter4dvARB, %function +bluegl_glProgramLocalParameter4dvARB: + mov __blue_glCore_glProgramLocalParameter4dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3sv -.type bluegl_glWindowPos3sv, %function -bluegl_glWindowPos3sv: - mov __blue_glCore_glWindowPos3sv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramLocalParameter4fARB +.type bluegl_glProgramLocalParameter4fARB, %function +bluegl_glProgramLocalParameter4fARB: + mov __blue_glCore_glProgramLocalParameter4fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendEquationSeparatei -.type bluegl_glBlendEquationSeparatei, %function -bluegl_glBlendEquationSeparatei: - mov __blue_glCore_glBlendEquationSeparatei@GOTPCREL(%rip), %r11 +.global bluegl_glProgramLocalParameter4fvARB +.type bluegl_glProgramLocalParameter4fvARB, %function +bluegl_glProgramLocalParameter4fvARB: + mov __blue_glCore_glProgramLocalParameter4fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetInfoLogARB -.type bluegl_glGetInfoLogARB, %function -bluegl_glGetInfoLogARB: - mov __blue_glCore_glGetInfoLogARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramEnvParameterdvARB +.type bluegl_glGetProgramEnvParameterdvARB, %function +bluegl_glGetProgramEnvParameterdvARB: + mov __blue_glCore_glGetProgramEnvParameterdvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramNamedParameter4fNV -.type bluegl_glProgramNamedParameter4fNV, %function -bluegl_glProgramNamedParameter4fNV: - mov __blue_glCore_glProgramNamedParameter4fNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramEnvParameterfvARB +.type bluegl_glGetProgramEnvParameterfvARB, %function +bluegl_glGetProgramEnvParameterfvARB: + mov __blue_glCore_glGetProgramEnvParameterfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramParameter4fNV -.type bluegl_glProgramParameter4fNV, %function -bluegl_glProgramParameter4fNV: - mov __blue_glCore_glProgramParameter4fNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramLocalParameterdvARB +.type bluegl_glGetProgramLocalParameterdvARB, %function +bluegl_glGetProgramLocalParameterdvARB: + mov __blue_glCore_glGetProgramLocalParameterdvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteTextures -.type bluegl_glDeleteTextures, %function -bluegl_glDeleteTextures: - mov __blue_glCore_glDeleteTextures@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramLocalParameterfvARB +.type bluegl_glGetProgramLocalParameterfvARB, %function +bluegl_glGetProgramLocalParameterfvARB: + mov __blue_glCore_glGetProgramLocalParameterfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferDrawBuffersEXT -.type bluegl_glFramebufferDrawBuffersEXT, %function -bluegl_glFramebufferDrawBuffersEXT: - mov __blue_glCore_glFramebufferDrawBuffersEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramivARB +.type bluegl_glGetProgramivARB, %function +bluegl_glGetProgramivARB: + mov __blue_glCore_glGetProgramivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetObjectLabelEXT -.type bluegl_glGetObjectLabelEXT, %function -bluegl_glGetObjectLabelEXT: - mov __blue_glCore_glGetObjectLabelEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramStringARB +.type bluegl_glGetProgramStringARB, %function +bluegl_glGetProgramStringARB: + mov __blue_glCore_glGetProgramStringARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3ivEXT -.type bluegl_glProgramUniform3ivEXT, %function -bluegl_glProgramUniform3ivEXT: - mov __blue_glCore_glProgramUniform3ivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glIsProgramARB +.type bluegl_glIsProgramARB, %function +bluegl_glIsProgramARB: + mov __blue_glCore_glIsProgramARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureParameterIiv -.type bluegl_glTextureParameterIiv, %function -bluegl_glTextureParameterIiv: - mov __blue_glCore_glTextureParameterIiv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramParameteriARB +.type bluegl_glProgramParameteriARB, %function +bluegl_glProgramParameteriARB: + mov __blue_glCore_glProgramParameteriARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnUniformuiv -.type bluegl_glGetnUniformuiv, %function -bluegl_glGetnUniformuiv: - mov __blue_glCore_glGetnUniformuiv@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferTextureARB +.type bluegl_glFramebufferTextureARB, %function +bluegl_glFramebufferTextureARB: + mov __blue_glCore_glFramebufferTextureARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMapObjectBufferATI -.type bluegl_glMapObjectBufferATI, %function -bluegl_glMapObjectBufferATI: - mov __blue_glCore_glMapObjectBufferATI@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferTextureLayerARB +.type bluegl_glFramebufferTextureLayerARB, %function +bluegl_glFramebufferTextureLayerARB: + mov __blue_glCore_glFramebufferTextureLayerARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTangent3dvEXT -.type bluegl_glTangent3dvEXT, %function -bluegl_glTangent3dvEXT: - mov __blue_glCore_glTangent3dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferTextureFaceARB +.type bluegl_glFramebufferTextureFaceARB, %function +bluegl_glFramebufferTextureFaceARB: + mov __blue_glCore_glFramebufferTextureFaceARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramParameter4dNV -.type bluegl_glProgramParameter4dNV, %function -bluegl_glProgramParameter4dNV: - mov __blue_glCore_glProgramParameter4dNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1i64ARB +.type bluegl_glUniform1i64ARB, %function +bluegl_glUniform1i64ARB: + mov __blue_glCore_glUniform1i64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenVertexArraysAPPLE -.type bluegl_glGenVertexArraysAPPLE, %function -bluegl_glGenVertexArraysAPPLE: - mov __blue_glCore_glGenVertexArraysAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2i64ARB +.type bluegl_glUniform2i64ARB, %function +bluegl_glUniform2i64ARB: + mov __blue_glCore_glUniform2i64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4bvARB -.type bluegl_glVertexAttrib4bvARB, %function -bluegl_glVertexAttrib4bvARB: - mov __blue_glCore_glVertexAttrib4bvARB@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3i64ARB +.type bluegl_glUniform3i64ARB, %function +bluegl_glUniform3i64ARB: + mov __blue_glCore_glUniform3i64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream1dATI -.type bluegl_glVertexStream1dATI, %function -bluegl_glVertexStream1dATI: - mov __blue_glCore_glVertexStream1dATI@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4i64ARB +.type bluegl_glUniform4i64ARB, %function +bluegl_glUniform4i64ARB: + mov __blue_glCore_glUniform4i64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2svARB -.type bluegl_glMultiTexCoord2svARB, %function -bluegl_glMultiTexCoord2svARB: - mov __blue_glCore_glMultiTexCoord2svARB@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1i64vARB +.type bluegl_glUniform1i64vARB, %function +bluegl_glUniform1i64vARB: + mov __blue_glCore_glUniform1i64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearNamedBufferSubDataEXT -.type bluegl_glClearNamedBufferSubDataEXT, %function -bluegl_glClearNamedBufferSubDataEXT: - mov __blue_glCore_glClearNamedBufferSubDataEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2i64vARB +.type bluegl_glUniform2i64vARB, %function +bluegl_glUniform2i64vARB: + mov __blue_glCore_glUniform2i64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTextureSubImage3D -.type bluegl_glCompressedTextureSubImage3D, %function -bluegl_glCompressedTextureSubImage3D: - mov __blue_glCore_glCompressedTextureSubImage3D@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3i64vARB +.type bluegl_glUniform3i64vARB, %function +bluegl_glUniform3i64vARB: + mov __blue_glCore_glUniform3i64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI4iEXT -.type bluegl_glVertexAttribI4iEXT, %function -bluegl_glVertexAttribI4iEXT: - mov __blue_glCore_glVertexAttribI4iEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4i64vARB +.type bluegl_glUniform4i64vARB, %function +bluegl_glUniform4i64vARB: + mov __blue_glCore_glUniform4i64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnPixelMapfvARB -.type bluegl_glGetnPixelMapfvARB, %function -bluegl_glGetnPixelMapfvARB: - mov __blue_glCore_glGetnPixelMapfvARB@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1ui64ARB +.type bluegl_glUniform1ui64ARB, %function +bluegl_glUniform1ui64ARB: + mov __blue_glCore_glUniform1ui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream4iATI -.type bluegl_glVertexStream4iATI, %function -bluegl_glVertexStream4iATI: - mov __blue_glCore_glVertexStream4iATI@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2ui64ARB +.type bluegl_glUniform2ui64ARB, %function +bluegl_glUniform2ui64ARB: + mov __blue_glCore_glUniform2ui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixMultTransposedEXT -.type bluegl_glMatrixMultTransposedEXT, %function -bluegl_glMatrixMultTransposedEXT: - mov __blue_glCore_glMatrixMultTransposedEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3ui64ARB +.type bluegl_glUniform3ui64ARB, %function +bluegl_glUniform3ui64ARB: + mov __blue_glCore_glUniform3ui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDisableVariantClientStateEXT -.type bluegl_glDisableVariantClientStateEXT, %function -bluegl_glDisableVariantClientStateEXT: - mov __blue_glCore_glDisableVariantClientStateEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4ui64ARB +.type bluegl_glUniform4ui64ARB, %function +bluegl_glUniform4ui64ARB: + mov __blue_glCore_glUniform4ui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPrimitiveRestartNV -.type bluegl_glPrimitiveRestartNV, %function -bluegl_glPrimitiveRestartNV: - mov __blue_glCore_glPrimitiveRestartNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1ui64vARB +.type bluegl_glUniform1ui64vARB, %function +bluegl_glUniform1ui64vARB: + mov __blue_glCore_glUniform1ui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribP4uiv -.type bluegl_glVertexAttribP4uiv, %function -bluegl_glVertexAttribP4uiv: - mov __blue_glCore_glVertexAttribP4uiv@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2ui64vARB +.type bluegl_glUniform2ui64vARB, %function +bluegl_glUniform2ui64vARB: + mov __blue_glCore_glUniform2ui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix2fv -.type bluegl_glProgramUniformMatrix2fv, %function -bluegl_glProgramUniformMatrix2fv: - mov __blue_glCore_glProgramUniformMatrix2fv@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3ui64vARB +.type bluegl_glUniform3ui64vARB, %function +bluegl_glUniform3ui64vARB: + mov __blue_glCore_glUniform3ui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPolygonOffsetEXT -.type bluegl_glPolygonOffsetEXT, %function -bluegl_glPolygonOffsetEXT: - mov __blue_glCore_glPolygonOffsetEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4ui64vARB +.type bluegl_glUniform4ui64vARB, %function +bluegl_glUniform4ui64vARB: + mov __blue_glCore_glUniform4ui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUseProgramObjectARB -.type bluegl_glUseProgramObjectARB, %function -bluegl_glUseProgramObjectARB: - mov __blue_glCore_glUseProgramObjectARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetUniformi64vARB +.type bluegl_glGetUniformi64vARB, %function +bluegl_glGetUniformi64vARB: + mov __blue_glCore_glGetUniformi64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixLoadfEXT -.type bluegl_glMatrixLoadfEXT, %function -bluegl_glMatrixLoadfEXT: - mov __blue_glCore_glMatrixLoadfEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetUniformui64vARB +.type bluegl_glGetUniformui64vARB, %function +bluegl_glGetUniformui64vARB: + mov __blue_glCore_glGetUniformui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureSubImage1D -.type bluegl_glTextureSubImage1D, %function -bluegl_glTextureSubImage1D: - mov __blue_glCore_glTextureSubImage1D@GOTPCREL(%rip), %r11 +.global bluegl_glGetnUniformi64vARB +.type bluegl_glGetnUniformi64vARB, %function +bluegl_glGetnUniformi64vARB: + mov __blue_glCore_glGetnUniformi64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glHistogramEXT -.type bluegl_glHistogramEXT, %function -bluegl_glHistogramEXT: - mov __blue_glCore_glHistogramEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetnUniformui64vARB +.type bluegl_glGetnUniformui64vARB, %function +bluegl_glGetnUniformui64vARB: + mov __blue_glCore_glGetnUniformui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1ivEXT -.type bluegl_glProgramUniform1ivEXT, %function -bluegl_glProgramUniform1ivEXT: - mov __blue_glCore_glProgramUniform1ivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1i64ARB +.type bluegl_glProgramUniform1i64ARB, %function +bluegl_glProgramUniform1i64ARB: + mov __blue_glCore_glProgramUniform1i64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetBufferParameterivARB -.type bluegl_glGetBufferParameterivARB, %function -bluegl_glGetBufferParameterivARB: - mov __blue_glCore_glGetBufferParameterivARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2i64ARB +.type bluegl_glProgramUniform2i64ARB, %function +bluegl_glProgramUniform2i64ARB: + mov __blue_glCore_glProgramUniform2i64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStringMarkerGREMEDY -.type bluegl_glStringMarkerGREMEDY, %function -bluegl_glStringMarkerGREMEDY: - mov __blue_glCore_glStringMarkerGREMEDY@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3i64ARB +.type bluegl_glProgramUniform3i64ARB, %function +bluegl_glProgramUniform3i64ARB: + mov __blue_glCore_glProgramUniform3i64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnMapfv -.type bluegl_glGetnMapfv, %function -bluegl_glGetnMapfv: - mov __blue_glCore_glGetnMapfv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4i64ARB +.type bluegl_glProgramUniform4i64ARB, %function +bluegl_glProgramUniform4i64ARB: + mov __blue_glCore_glProgramUniform4i64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3dvARB -.type bluegl_glMultiTexCoord3dvARB, %function -bluegl_glMultiTexCoord3dvARB: - mov __blue_glCore_glMultiTexCoord3dvARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1i64vARB +.type bluegl_glProgramUniform1i64vARB, %function +bluegl_glProgramUniform1i64vARB: + mov __blue_glCore_glProgramUniform1i64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFinishTextureSUNX -.type bluegl_glFinishTextureSUNX, %function -bluegl_glFinishTextureSUNX: - mov __blue_glCore_glFinishTextureSUNX@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2i64vARB +.type bluegl_glProgramUniform2i64vARB, %function +bluegl_glProgramUniform2i64vARB: + mov __blue_glCore_glProgramUniform2i64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3dARB -.type bluegl_glWindowPos3dARB, %function -bluegl_glWindowPos3dARB: - mov __blue_glCore_glWindowPos3dARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3i64vARB +.type bluegl_glProgramUniform3i64vARB, %function +bluegl_glProgramUniform3i64vARB: + mov __blue_glCore_glProgramUniform3i64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedBufferStorageEXT -.type bluegl_glNamedBufferStorageEXT, %function -bluegl_glNamedBufferStorageEXT: - mov __blue_glCore_glNamedBufferStorageEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4i64vARB +.type bluegl_glProgramUniform4i64vARB, %function +bluegl_glProgramUniform4i64vARB: + mov __blue_glCore_glProgramUniform4i64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIndexPointerListIBM -.type bluegl_glIndexPointerListIBM, %function -bluegl_glIndexPointerListIBM: - mov __blue_glCore_glIndexPointerListIBM@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1ui64ARB +.type bluegl_glProgramUniform1ui64ARB, %function +bluegl_glProgramUniform1ui64ARB: + mov __blue_glCore_glProgramUniform1ui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColor3fVertex3fSUN -.type bluegl_glColor3fVertex3fSUN, %function -bluegl_glColor3fVertex3fSUN: - mov __blue_glCore_glColor3fVertex3fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2ui64ARB +.type bluegl_glProgramUniform2ui64ARB, %function +bluegl_glProgramUniform2ui64ARB: + mov __blue_glCore_glProgramUniform2ui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDepthRangefOES -.type bluegl_glDepthRangefOES, %function -bluegl_glDepthRangefOES: - mov __blue_glCore_glDepthRangefOES@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3ui64ARB +.type bluegl_glProgramUniform3ui64ARB, %function +bluegl_glProgramUniform3ui64ARB: + mov __blue_glCore_glProgramUniform3ui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexBlendEnvfATI -.type bluegl_glVertexBlendEnvfATI, %function -bluegl_glVertexBlendEnvfATI: - mov __blue_glCore_glVertexBlendEnvfATI@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4ui64ARB +.type bluegl_glProgramUniform4ui64ARB, %function +bluegl_glProgramUniform4ui64ARB: + mov __blue_glCore_glProgramUniform4ui64ARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1hvNV -.type bluegl_glMultiTexCoord1hvNV, %function -bluegl_glMultiTexCoord1hvNV: - mov __blue_glCore_glMultiTexCoord1hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1ui64vARB +.type bluegl_glProgramUniform1ui64vARB, %function +bluegl_glProgramUniform1ui64vARB: + mov __blue_glCore_glProgramUniform1ui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPixelTexGenParameterfvSGIS -.type bluegl_glGetPixelTexGenParameterfvSGIS, %function -bluegl_glGetPixelTexGenParameterfvSGIS: - mov __blue_glCore_glGetPixelTexGenParameterfvSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2ui64vARB +.type bluegl_glProgramUniform2ui64vARB, %function +bluegl_glProgramUniform2ui64vARB: + mov __blue_glCore_glProgramUniform2ui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDisableClientStateIndexedEXT -.type bluegl_glDisableClientStateIndexedEXT, %function -bluegl_glDisableClientStateIndexedEXT: - mov __blue_glCore_glDisableClientStateIndexedEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3ui64vARB +.type bluegl_glProgramUniform3ui64vARB, %function +bluegl_glProgramUniform3ui64vARB: + mov __blue_glCore_glProgramUniform3ui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1ui64NV -.type bluegl_glProgramUniform1ui64NV, %function -bluegl_glProgramUniform1ui64NV: - mov __blue_glCore_glProgramUniform1ui64NV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4ui64vARB +.type bluegl_glProgramUniform4ui64vARB, %function +bluegl_glProgramUniform4ui64vARB: + mov __blue_glCore_glProgramUniform4ui64vARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1dv -.type bluegl_glMultiTexCoord1dv, %function -bluegl_glMultiTexCoord1dv: - mov __blue_glCore_glMultiTexCoord1dv@GOTPCREL(%rip), %r11 +.global bluegl_glColorTable +.type bluegl_glColorTable, %function +bluegl_glColorTable: + mov __blue_glCore_glColorTable@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1ivARB -.type bluegl_glMultiTexCoord1ivARB, %function -bluegl_glMultiTexCoord1ivARB: - mov __blue_glCore_glMultiTexCoord1ivARB@GOTPCREL(%rip), %r11 +.global bluegl_glColorTableParameterfv +.type bluegl_glColorTableParameterfv, %function +bluegl_glColorTableParameterfv: + mov __blue_glCore_glColorTableParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMapVertexAttrib1dAPPLE -.type bluegl_glMapVertexAttrib1dAPPLE, %function -bluegl_glMapVertexAttrib1dAPPLE: - mov __blue_glCore_glMapVertexAttrib1dAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glColorTableParameteriv +.type bluegl_glColorTableParameteriv, %function +bluegl_glColorTableParameteriv: + mov __blue_glCore_glColorTableParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPerfQueryIdByNameINTEL -.type bluegl_glGetPerfQueryIdByNameINTEL, %function -bluegl_glGetPerfQueryIdByNameINTEL: - mov __blue_glCore_glGetPerfQueryIdByNameINTEL@GOTPCREL(%rip), %r11 +.global bluegl_glCopyColorTable +.type bluegl_glCopyColorTable, %function +bluegl_glCopyColorTable: + mov __blue_glCore_glCopyColorTable@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2ui64vNV -.type bluegl_glUniform2ui64vNV, %function -bluegl_glUniform2ui64vNV: - mov __blue_glCore_glUniform2ui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetColorTable +.type bluegl_glGetColorTable, %function +bluegl_glGetColorTable: + mov __blue_glCore_glGetColorTable@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetSharpenTexFuncSGIS -.type bluegl_glGetSharpenTexFuncSGIS, %function -bluegl_glGetSharpenTexFuncSGIS: - mov __blue_glCore_glGetSharpenTexFuncSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glGetColorTableParameterfv +.type bluegl_glGetColorTableParameterfv, %function +bluegl_glGetColorTableParameterfv: + mov __blue_glCore_glGetColorTableParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindImageTexture -.type bluegl_glBindImageTexture, %function -bluegl_glBindImageTexture: - mov __blue_glCore_glBindImageTexture@GOTPCREL(%rip), %r11 +.global bluegl_glGetColorTableParameteriv +.type bluegl_glGetColorTableParameteriv, %function +bluegl_glGetColorTableParameteriv: + mov __blue_glCore_glGetColorTableParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramEnvParameter4dvARB -.type bluegl_glProgramEnvParameter4dvARB, %function -bluegl_glProgramEnvParameter4dvARB: - mov __blue_glCore_glProgramEnvParameter4dvARB@GOTPCREL(%rip), %r11 +.global bluegl_glColorSubTable +.type bluegl_glColorSubTable, %function +bluegl_glColorSubTable: + mov __blue_glCore_glColorSubTable@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteFramebuffers -.type bluegl_glDeleteFramebuffers, %function -bluegl_glDeleteFramebuffers: - mov __blue_glCore_glDeleteFramebuffers@GOTPCREL(%rip), %r11 +.global bluegl_glCopyColorSubTable +.type bluegl_glCopyColorSubTable, %function +bluegl_glCopyColorSubTable: + mov __blue_glCore_glCopyColorSubTable@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayVertexOffsetEXT -.type bluegl_glVertexArrayVertexOffsetEXT, %function -bluegl_glVertexArrayVertexOffsetEXT: - mov __blue_glCore_glVertexArrayVertexOffsetEXT@GOTPCREL(%rip), %r11 +.global bluegl_glConvolutionFilter1D +.type bluegl_glConvolutionFilter1D, %function +bluegl_glConvolutionFilter1D: + mov __blue_glCore_glConvolutionFilter1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramLocalParameters4fvEXT -.type bluegl_glProgramLocalParameters4fvEXT, %function -bluegl_glProgramLocalParameters4fvEXT: - mov __blue_glCore_glProgramLocalParameters4fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glConvolutionFilter2D +.type bluegl_glConvolutionFilter2D, %function +bluegl_glConvolutionFilter2D: + mov __blue_glCore_glConvolutionFilter2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFogCoordFormatNV -.type bluegl_glFogCoordFormatNV, %function -bluegl_glFogCoordFormatNV: - mov __blue_glCore_glFogCoordFormatNV@GOTPCREL(%rip), %r11 +.global bluegl_glConvolutionParameterf +.type bluegl_glConvolutionParameterf, %function +bluegl_glConvolutionParameterf: + mov __blue_glCore_glConvolutionParameterf@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenQueries -.type bluegl_glGenQueries, %function -bluegl_glGenQueries: - mov __blue_glCore_glGenQueries@GOTPCREL(%rip), %r11 +.global bluegl_glConvolutionParameterfv +.type bluegl_glConvolutionParameterfv, %function +bluegl_glConvolutionParameterfv: + mov __blue_glCore_glConvolutionParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL4dEXT -.type bluegl_glVertexAttribL4dEXT, %function -bluegl_glVertexAttribL4dEXT: - mov __blue_glCore_glVertexAttribL4dEXT@GOTPCREL(%rip), %r11 +.global bluegl_glConvolutionParameteri +.type bluegl_glConvolutionParameteri, %function +bluegl_glConvolutionParameteri: + mov __blue_glCore_glConvolutionParameteri@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4fvARB -.type bluegl_glMultiTexCoord4fvARB, %function -bluegl_glMultiTexCoord4fvARB: - mov __blue_glCore_glMultiTexCoord4fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glConvolutionParameteriv +.type bluegl_glConvolutionParameteriv, %function +bluegl_glConvolutionParameteriv: + mov __blue_glCore_glConvolutionParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPixelZoomxOES -.type bluegl_glPixelZoomxOES, %function -bluegl_glPixelZoomxOES: - mov __blue_glCore_glPixelZoomxOES@GOTPCREL(%rip), %r11 +.global bluegl_glCopyConvolutionFilter1D +.type bluegl_glCopyConvolutionFilter1D, %function +bluegl_glCopyConvolutionFilter1D: + mov __blue_glCore_glCopyConvolutionFilter1D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyTexSubImage3D -.type bluegl_glCopyTexSubImage3D, %function -bluegl_glCopyTexSubImage3D: - mov __blue_glCore_glCopyTexSubImage3D@GOTPCREL(%rip), %r11 +.global bluegl_glCopyConvolutionFilter2D +.type bluegl_glCopyConvolutionFilter2D, %function +bluegl_glCopyConvolutionFilter2D: + mov __blue_glCore_glCopyConvolutionFilter2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1ui64vARB -.type bluegl_glUniform1ui64vARB, %function -bluegl_glUniform1ui64vARB: - mov __blue_glCore_glUniform1ui64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetConvolutionFilter +.type bluegl_glGetConvolutionFilter, %function +bluegl_glGetConvolutionFilter: + mov __blue_glCore_glGetConvolutionFilter@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMapControlPointsNV -.type bluegl_glGetMapControlPointsNV, %function -bluegl_glGetMapControlPointsNV: - mov __blue_glCore_glGetMapControlPointsNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetConvolutionParameterfv +.type bluegl_glGetConvolutionParameterfv, %function +bluegl_glGetConvolutionParameterfv: + mov __blue_glCore_glGetConvolutionParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLightEnviSGIX -.type bluegl_glLightEnviSGIX, %function -bluegl_glLightEnviSGIX: - mov __blue_glCore_glLightEnviSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glGetConvolutionParameteriv +.type bluegl_glGetConvolutionParameteriv, %function +bluegl_glGetConvolutionParameteriv: + mov __blue_glCore_glGetConvolutionParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4Nbv -.type bluegl_glVertexAttrib4Nbv, %function -bluegl_glVertexAttrib4Nbv: - mov __blue_glCore_glVertexAttrib4Nbv@GOTPCREL(%rip), %r11 +.global bluegl_glGetSeparableFilter +.type bluegl_glGetSeparableFilter, %function +bluegl_glGetSeparableFilter: + mov __blue_glCore_glGetSeparableFilter@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawBuffer -.type bluegl_glDrawBuffer, %function -bluegl_glDrawBuffer: - mov __blue_glCore_glDrawBuffer@GOTPCREL(%rip), %r11 +.global bluegl_glSeparableFilter2D +.type bluegl_glSeparableFilter2D, %function +bluegl_glSeparableFilter2D: + mov __blue_glCore_glSeparableFilter2D@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawTransformFeedbackStream -.type bluegl_glDrawTransformFeedbackStream, %function -bluegl_glDrawTransformFeedbackStream: - mov __blue_glCore_glDrawTransformFeedbackStream@GOTPCREL(%rip), %r11 +.global bluegl_glGetHistogram +.type bluegl_glGetHistogram, %function +bluegl_glGetHistogram: + mov __blue_glCore_glGetHistogram@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDisableClientStateiEXT -.type bluegl_glDisableClientStateiEXT, %function -bluegl_glDisableClientStateiEXT: - mov __blue_glCore_glDisableClientStateiEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetHistogramParameterfv +.type bluegl_glGetHistogramParameterfv, %function +bluegl_glGetHistogramParameterfv: + mov __blue_glCore_glGetHistogramParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferTexture3D -.type bluegl_glFramebufferTexture3D, %function -bluegl_glFramebufferTexture3D: - mov __blue_glCore_glFramebufferTexture3D@GOTPCREL(%rip), %r11 +.global bluegl_glGetHistogramParameteriv +.type bluegl_glGetHistogramParameteriv, %function +bluegl_glGetHistogramParameteriv: + mov __blue_glCore_glGetHistogramParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureColorMaskSGIS -.type bluegl_glTextureColorMaskSGIS, %function -bluegl_glTextureColorMaskSGIS: - mov __blue_glCore_glTextureColorMaskSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glGetMinmax +.type bluegl_glGetMinmax, %function +bluegl_glGetMinmax: + mov __blue_glCore_glGetMinmax@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCullFace -.type bluegl_glCullFace, %function -bluegl_glCullFace: - mov __blue_glCore_glCullFace@GOTPCREL(%rip), %r11 +.global bluegl_glGetMinmaxParameterfv +.type bluegl_glGetMinmaxParameterfv, %function +bluegl_glGetMinmaxParameterfv: + mov __blue_glCore_glGetMinmaxParameterfv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedBufferSubData -.type bluegl_glGetNamedBufferSubData, %function -bluegl_glGetNamedBufferSubData: - mov __blue_glCore_glGetNamedBufferSubData@GOTPCREL(%rip), %r11 +.global bluegl_glGetMinmaxParameteriv +.type bluegl_glGetMinmaxParameteriv, %function +bluegl_glGetMinmaxParameteriv: + mov __blue_glCore_glGetMinmaxParameteriv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDispatchCompute -.type bluegl_glDispatchCompute, %function -bluegl_glDispatchCompute: - mov __blue_glCore_glDispatchCompute@GOTPCREL(%rip), %r11 +.global bluegl_glHistogram +.type bluegl_glHistogram, %function +bluegl_glHistogram: + mov __blue_glCore_glHistogram@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glInvalidateFramebuffer -.type bluegl_glInvalidateFramebuffer, %function -bluegl_glInvalidateFramebuffer: - mov __blue_glCore_glInvalidateFramebuffer@GOTPCREL(%rip), %r11 +.global bluegl_glMinmax +.type bluegl_glMinmax, %function +bluegl_glMinmax: + mov __blue_glCore_glMinmax@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDebugMessageControl -.type bluegl_glDebugMessageControl, %function -bluegl_glDebugMessageControl: - mov __blue_glCore_glDebugMessageControl@GOTPCREL(%rip), %r11 +.global bluegl_glResetHistogram +.type bluegl_glResetHistogram, %function +bluegl_glResetHistogram: + mov __blue_glCore_glResetHistogram@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix3dv -.type bluegl_glProgramUniformMatrix3dv, %function -bluegl_glProgramUniformMatrix3dv: - mov __blue_glCore_glProgramUniformMatrix3dv@GOTPCREL(%rip), %r11 +.global bluegl_glResetMinmax +.type bluegl_glResetMinmax, %function +bluegl_glResetMinmax: + mov __blue_glCore_glResetMinmax@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3ui -.type bluegl_glSecondaryColor3ui, %function -bluegl_glSecondaryColor3ui: - mov __blue_glCore_glSecondaryColor3ui@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribDivisorARB +.type bluegl_glVertexAttribDivisorARB, %function +bluegl_glVertexAttribDivisorARB: + mov __blue_glCore_glVertexAttribDivisorARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glShaderStorageBlockBinding -.type bluegl_glShaderStorageBlockBinding, %function -bluegl_glShaderStorageBlockBinding: - mov __blue_glCore_glShaderStorageBlockBinding@GOTPCREL(%rip), %r11 +.global bluegl_glCurrentPaletteMatrixARB +.type bluegl_glCurrentPaletteMatrixARB, %function +bluegl_glCurrentPaletteMatrixARB: + mov __blue_glCore_glCurrentPaletteMatrixARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix3fvARB -.type bluegl_glUniformMatrix3fvARB, %function -bluegl_glUniformMatrix3fvARB: - mov __blue_glCore_glUniformMatrix3fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixIndexubvARB +.type bluegl_glMatrixIndexubvARB, %function +bluegl_glMatrixIndexubvARB: + mov __blue_glCore_glMatrixIndexubvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetUniformOffsetEXT -.type bluegl_glGetUniformOffsetEXT, %function -bluegl_glGetUniformOffsetEXT: - mov __blue_glCore_glGetUniformOffsetEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixIndexusvARB +.type bluegl_glMatrixIndexusvARB, %function +bluegl_glMatrixIndexusvARB: + mov __blue_glCore_glMatrixIndexusvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBinormal3fvEXT -.type bluegl_glBinormal3fvEXT, %function -bluegl_glBinormal3fvEXT: - mov __blue_glCore_glBinormal3fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixIndexuivARB +.type bluegl_glMatrixIndexuivARB, %function +bluegl_glMatrixIndexuivARB: + mov __blue_glCore_glMatrixIndexuivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoordPointerEXT -.type bluegl_glMultiTexCoordPointerEXT, %function -bluegl_glMultiTexCoordPointerEXT: - mov __blue_glCore_glMultiTexCoordPointerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixIndexPointerARB +.type bluegl_glMatrixIndexPointerARB, %function +bluegl_glMatrixIndexPointerARB: + mov __blue_glCore_glMatrixIndexPointerARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4sv -.type bluegl_glVertexAttrib4sv, %function -bluegl_glVertexAttrib4sv: - mov __blue_glCore_glVertexAttrib4sv@GOTPCREL(%rip), %r11 +.global bluegl_glSampleCoverageARB +.type bluegl_glSampleCoverageARB, %function +bluegl_glSampleCoverageARB: + mov __blue_glCore_glSampleCoverageARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixIndexubvARB -.type bluegl_glMatrixIndexubvARB, %function -bluegl_glMatrixIndexubvARB: - mov __blue_glCore_glMatrixIndexubvARB@GOTPCREL(%rip), %r11 +.global bluegl_glActiveTextureARB +.type bluegl_glActiveTextureARB, %function +bluegl_glActiveTextureARB: + mov __blue_glCore_glActiveTextureARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4ivEXT -.type bluegl_glProgramUniform4ivEXT, %function -bluegl_glProgramUniform4ivEXT: - mov __blue_glCore_glProgramUniform4ivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glClientActiveTextureARB +.type bluegl_glClientActiveTextureARB, %function +bluegl_glClientActiveTextureARB: + mov __blue_glCore_glClientActiveTextureARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos4dMESA -.type bluegl_glWindowPos4dMESA, %function -bluegl_glWindowPos4dMESA: - mov __blue_glCore_glWindowPos4dMESA@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1dARB +.type bluegl_glMultiTexCoord1dARB, %function +bluegl_glMultiTexCoord1dARB: + mov __blue_glCore_glMultiTexCoord1dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiDrawElementsIndirectCountARB -.type bluegl_glMultiDrawElementsIndirectCountARB, %function -bluegl_glMultiDrawElementsIndirectCountARB: - mov __blue_glCore_glMultiDrawElementsIndirectCountARB@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1dvARB +.type bluegl_glMultiTexCoord1dvARB, %function +bluegl_glMultiTexCoord1dvARB: + mov __blue_glCore_glMultiTexCoord1dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix4fvARB -.type bluegl_glUniformMatrix4fvARB, %function -bluegl_glUniformMatrix4fvARB: - mov __blue_glCore_glUniformMatrix4fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1fARB +.type bluegl_glMultiTexCoord1fARB, %function +bluegl_glMultiTexCoord1fARB: + mov __blue_glCore_glMultiTexCoord1fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindImageTextureEXT -.type bluegl_glBindImageTextureEXT, %function -bluegl_glBindImageTextureEXT: - mov __blue_glCore_glBindImageTextureEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1fvARB +.type bluegl_glMultiTexCoord1fvARB, %function +bluegl_glMultiTexCoord1fvARB: + mov __blue_glCore_glMultiTexCoord1fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glResolveDepthValuesNV -.type bluegl_glResolveDepthValuesNV, %function -bluegl_glResolveDepthValuesNV: - mov __blue_glCore_glResolveDepthValuesNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1iARB +.type bluegl_glMultiTexCoord1iARB, %function +bluegl_glMultiTexCoord1iARB: + mov __blue_glCore_glMultiTexCoord1iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColor3fVertex3fvSUN -.type bluegl_glColor3fVertex3fvSUN, %function -bluegl_glColor3fVertex3fvSUN: - mov __blue_glCore_glColor3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1ivARB +.type bluegl_glMultiTexCoord1ivARB, %function +bluegl_glMultiTexCoord1ivARB: + mov __blue_glCore_glMultiTexCoord1ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTexImage1D -.type bluegl_glCompressedTexImage1D, %function -bluegl_glCompressedTexImage1D: - mov __blue_glCore_glCompressedTexImage1D@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1sARB +.type bluegl_glMultiTexCoord1sARB, %function +bluegl_glMultiTexCoord1sARB: + mov __blue_glCore_glMultiTexCoord1sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnUniformdvARB -.type bluegl_glGetnUniformdvARB, %function -bluegl_glGetnUniformdvARB: - mov __blue_glCore_glGetnUniformdvARB@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1svARB +.type bluegl_glMultiTexCoord1svARB, %function +bluegl_glMultiTexCoord1svARB: + mov __blue_glCore_glMultiTexCoord1svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1ui64vNV -.type bluegl_glUniform1ui64vNV, %function -bluegl_glUniform1ui64vNV: - mov __blue_glCore_glUniform1ui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2dARB +.type bluegl_glMultiTexCoord2dARB, %function +bluegl_glMultiTexCoord2dARB: + mov __blue_glCore_glMultiTexCoord2dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramEnvParameterI4uiNV -.type bluegl_glProgramEnvParameterI4uiNV, %function -bluegl_glProgramEnvParameterI4uiNV: - mov __blue_glCore_glProgramEnvParameterI4uiNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2dvARB +.type bluegl_glMultiTexCoord2dvARB, %function +bluegl_glMultiTexCoord2dvARB: + mov __blue_glCore_glMultiTexCoord2dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4ubNV -.type bluegl_glVertexAttrib4ubNV, %function -bluegl_glVertexAttrib4ubNV: - mov __blue_glCore_glVertexAttrib4ubNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2fARB +.type bluegl_glMultiTexCoord2fARB, %function +bluegl_glMultiTexCoord2fARB: + mov __blue_glCore_glMultiTexCoord2fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenAsyncMarkersSGIX -.type bluegl_glGenAsyncMarkersSGIX, %function -bluegl_glGenAsyncMarkersSGIX: - mov __blue_glCore_glGenAsyncMarkersSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2fvARB +.type bluegl_glMultiTexCoord2fvARB, %function +bluegl_glMultiTexCoord2fvARB: + mov __blue_glCore_glMultiTexCoord2fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexBindingDivisor -.type bluegl_glVertexBindingDivisor, %function -bluegl_glVertexBindingDivisor: - mov __blue_glCore_glVertexBindingDivisor@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2iARB +.type bluegl_glMultiTexCoord2iARB, %function +bluegl_glMultiTexCoord2iARB: + mov __blue_glCore_glMultiTexCoord2iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreateShaderProgramv -.type bluegl_glCreateShaderProgramv, %function -bluegl_glCreateShaderProgramv: - mov __blue_glCore_glCreateShaderProgramv@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2ivARB +.type bluegl_glMultiTexCoord2ivARB, %function +bluegl_glMultiTexCoord2ivARB: + mov __blue_glCore_glMultiTexCoord2ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindBufferARB -.type bluegl_glBindBufferARB, %function -bluegl_glBindBufferARB: - mov __blue_glCore_glBindBufferARB@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2sARB +.type bluegl_glMultiTexCoord2sARB, %function +bluegl_glMultiTexCoord2sARB: + mov __blue_glCore_glMultiTexCoord2sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColor4ubVertex2fvSUN -.type bluegl_glColor4ubVertex2fvSUN, %function -bluegl_glColor4ubVertex2fvSUN: - mov __blue_glCore_glColor4ubVertex2fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2svARB +.type bluegl_glMultiTexCoord2svARB, %function +bluegl_glMultiTexCoord2svARB: + mov __blue_glCore_glMultiTexCoord2svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glResetHistogram -.type bluegl_glResetHistogram, %function -bluegl_glResetHistogram: - mov __blue_glCore_glResetHistogram@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3dARB +.type bluegl_glMultiTexCoord3dARB, %function +bluegl_glMultiTexCoord3dARB: + mov __blue_glCore_glMultiTexCoord3dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramResourceLocation -.type bluegl_glGetProgramResourceLocation, %function -bluegl_glGetProgramResourceLocation: - mov __blue_glCore_glGetProgramResourceLocation@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3dvARB +.type bluegl_glMultiTexCoord3dvARB, %function +bluegl_glMultiTexCoord3dvARB: + mov __blue_glCore_glMultiTexCoord3dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendFuncSeparateiARB -.type bluegl_glBlendFuncSeparateiARB, %function -bluegl_glBlendFuncSeparateiARB: - mov __blue_glCore_glBlendFuncSeparateiARB@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3fARB +.type bluegl_glMultiTexCoord3fARB, %function +bluegl_glMultiTexCoord3fARB: + mov __blue_glCore_glMultiTexCoord3fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBinormalPointerEXT -.type bluegl_glBinormalPointerEXT, %function -bluegl_glBinormalPointerEXT: - mov __blue_glCore_glBinormalPointerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3fvARB +.type bluegl_glMultiTexCoord3fvARB, %function +bluegl_glMultiTexCoord3fvARB: + mov __blue_glCore_glMultiTexCoord3fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib2svNV -.type bluegl_glVertexAttrib2svNV, %function -bluegl_glVertexAttrib2svNV: - mov __blue_glCore_glVertexAttrib2svNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3iARB +.type bluegl_glMultiTexCoord3iARB, %function +bluegl_glMultiTexCoord3iARB: + mov __blue_glCore_glMultiTexCoord3iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2i64vNV -.type bluegl_glProgramUniform2i64vNV, %function -bluegl_glProgramUniform2i64vNV: - mov __blue_glCore_glProgramUniform2i64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3ivARB +.type bluegl_glMultiTexCoord3ivARB, %function +bluegl_glMultiTexCoord3ivARB: + mov __blue_glCore_glMultiTexCoord3ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureNormalEXT -.type bluegl_glTextureNormalEXT, %function -bluegl_glTextureNormalEXT: - mov __blue_glCore_glTextureNormalEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3sARB +.type bluegl_glMultiTexCoord3sARB, %function +bluegl_glMultiTexCoord3sARB: + mov __blue_glCore_glMultiTexCoord3sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFlushMappedBufferRangeAPPLE -.type bluegl_glFlushMappedBufferRangeAPPLE, %function -bluegl_glFlushMappedBufferRangeAPPLE: - mov __blue_glCore_glFlushMappedBufferRangeAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3svARB +.type bluegl_glMultiTexCoord3svARB, %function +bluegl_glMultiTexCoord3svARB: + mov __blue_glCore_glMultiTexCoord3svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3dv -.type bluegl_glSecondaryColor3dv, %function -bluegl_glSecondaryColor3dv: - mov __blue_glCore_glSecondaryColor3dv@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4dARB +.type bluegl_glMultiTexCoord4dARB, %function +bluegl_glMultiTexCoord4dARB: + mov __blue_glCore_glMultiTexCoord4dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorP3uiv -.type bluegl_glColorP3uiv, %function -bluegl_glColorP3uiv: - mov __blue_glCore_glColorP3uiv@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4dvARB +.type bluegl_glMultiTexCoord4dvARB, %function +bluegl_glMultiTexCoord4dvARB: + mov __blue_glCore_glMultiTexCoord4dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix4x2dv -.type bluegl_glUniformMatrix4x2dv, %function -bluegl_glUniformMatrix4x2dv: - mov __blue_glCore_glUniformMatrix4x2dv@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4fARB +.type bluegl_glMultiTexCoord4fARB, %function +bluegl_glMultiTexCoord4fARB: + mov __blue_glCore_glMultiTexCoord4fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoordP3ui -.type bluegl_glTexCoordP3ui, %function -bluegl_glTexCoordP3ui: - mov __blue_glCore_glTexCoordP3ui@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4fvARB +.type bluegl_glMultiTexCoord4fvARB, %function +bluegl_glMultiTexCoord4fvARB: + mov __blue_glCore_glMultiTexCoord4fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedBufferSubDataEXT -.type bluegl_glNamedBufferSubDataEXT, %function -bluegl_glNamedBufferSubDataEXT: - mov __blue_glCore_glNamedBufferSubDataEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4iARB +.type bluegl_glMultiTexCoord4iARB, %function +bluegl_glMultiTexCoord4iARB: + mov __blue_glCore_glMultiTexCoord4iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProvokingVertexEXT -.type bluegl_glProvokingVertexEXT, %function -bluegl_glProvokingVertexEXT: - mov __blue_glCore_glProvokingVertexEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4ivARB +.type bluegl_glMultiTexCoord4ivARB, %function +bluegl_glMultiTexCoord4ivARB: + mov __blue_glCore_glMultiTexCoord4ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWeightbvARB -.type bluegl_glWeightbvARB, %function -bluegl_glWeightbvARB: - mov __blue_glCore_glWeightbvARB@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4sARB +.type bluegl_glMultiTexCoord4sARB, %function +bluegl_glMultiTexCoord4sARB: + mov __blue_glCore_glMultiTexCoord4sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glInvalidateNamedFramebufferData -.type bluegl_glInvalidateNamedFramebufferData, %function -bluegl_glInvalidateNamedFramebufferData: - mov __blue_glCore_glInvalidateNamedFramebufferData@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4svARB +.type bluegl_glMultiTexCoord4svARB, %function +bluegl_glMultiTexCoord4svARB: + mov __blue_glCore_glMultiTexCoord4svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetArrayObjectfvATI -.type bluegl_glGetArrayObjectfvATI, %function -bluegl_glGetArrayObjectfvATI: - mov __blue_glCore_glGetArrayObjectfvATI@GOTPCREL(%rip), %r11 +.global bluegl_glGenQueriesARB +.type bluegl_glGenQueriesARB, %function +bluegl_glGenQueriesARB: + mov __blue_glCore_glGenQueriesARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsSampler -.type bluegl_glIsSampler, %function -bluegl_glIsSampler: - mov __blue_glCore_glIsSampler@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteQueriesARB +.type bluegl_glDeleteQueriesARB, %function +bluegl_glDeleteQueriesARB: + mov __blue_glCore_glDeleteQueriesARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormalStream3dvATI -.type bluegl_glNormalStream3dvATI, %function -bluegl_glNormalStream3dvATI: - mov __blue_glCore_glNormalStream3dvATI@GOTPCREL(%rip), %r11 +.global bluegl_glIsQueryARB +.type bluegl_glIsQueryARB, %function +bluegl_glIsQueryARB: + mov __blue_glCore_glIsQueryARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL4i64vNV -.type bluegl_glVertexAttribL4i64vNV, %function -bluegl_glVertexAttribL4i64vNV: - mov __blue_glCore_glVertexAttribL4i64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glBeginQueryARB +.type bluegl_glBeginQueryARB, %function +bluegl_glBeginQueryARB: + mov __blue_glCore_glBeginQueryARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glValidateProgramARB -.type bluegl_glValidateProgramARB, %function -bluegl_glValidateProgramARB: - mov __blue_glCore_glValidateProgramARB@GOTPCREL(%rip), %r11 +.global bluegl_glEndQueryARB +.type bluegl_glEndQueryARB, %function +bluegl_glEndQueryARB: + mov __blue_glCore_glEndQueryARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3ui -.type bluegl_glUniform3ui, %function -bluegl_glUniform3ui: - mov __blue_glCore_glUniform3ui@GOTPCREL(%rip), %r11 +.global bluegl_glGetQueryivARB +.type bluegl_glGetQueryivARB, %function +bluegl_glGetQueryivARB: + mov __blue_glCore_glGetQueryivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTransformFeedbackVaryingsNV -.type bluegl_glTransformFeedbackVaryingsNV, %function -bluegl_glTransformFeedbackVaryingsNV: - mov __blue_glCore_glTransformFeedbackVaryingsNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetQueryObjectivARB +.type bluegl_glGetQueryObjectivARB, %function +bluegl_glGetQueryObjectivARB: + mov __blue_glCore_glGetQueryObjectivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetSeparableFilter -.type bluegl_glGetSeparableFilter, %function -bluegl_glGetSeparableFilter: - mov __blue_glCore_glGetSeparableFilter@GOTPCREL(%rip), %r11 +.global bluegl_glGetQueryObjectuivARB +.type bluegl_glGetQueryObjectuivARB, %function +bluegl_glGetQueryObjectuivARB: + mov __blue_glCore_glGetQueryObjectuivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetCompressedTexImageARB -.type bluegl_glGetCompressedTexImageARB, %function -bluegl_glGetCompressedTexImageARB: - mov __blue_glCore_glGetCompressedTexImageARB@GOTPCREL(%rip), %r11 +.global bluegl_glMaxShaderCompilerThreadsARB +.type bluegl_glMaxShaderCompilerThreadsARB, %function +bluegl_glMaxShaderCompilerThreadsARB: + mov __blue_glCore_glMaxShaderCompilerThreadsARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramNamedParameter4fvNV -.type bluegl_glProgramNamedParameter4fvNV, %function -bluegl_glProgramNamedParameter4fvNV: - mov __blue_glCore_glProgramNamedParameter4fvNV@GOTPCREL(%rip), %r11 +.global bluegl_glPointParameterfARB +.type bluegl_glPointParameterfARB, %function +bluegl_glPointParameterfARB: + mov __blue_glCore_glPointParameterfARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureBarrierNV -.type bluegl_glTextureBarrierNV, %function -bluegl_glTextureBarrierNV: - mov __blue_glCore_glTextureBarrierNV@GOTPCREL(%rip), %r11 +.global bluegl_glPointParameterfvARB +.type bluegl_glPointParameterfvARB, %function +bluegl_glPointParameterfvARB: + mov __blue_glCore_glPointParameterfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glRasterSamplesEXT -.type bluegl_glRasterSamplesEXT, %function -bluegl_glRasterSamplesEXT: - mov __blue_glCore_glRasterSamplesEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetnMapdvARB +.type bluegl_glGetnMapdvARB, %function +bluegl_glGetnMapdvARB: + mov __blue_glCore_glGetnMapdvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3dEXT -.type bluegl_glSecondaryColor3dEXT, %function -bluegl_glSecondaryColor3dEXT: - mov __blue_glCore_glSecondaryColor3dEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetnMapfvARB +.type bluegl_glGetnMapfvARB, %function +bluegl_glGetnMapfvARB: + mov __blue_glCore_glGetnMapfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1svNV -.type bluegl_glVertexAttrib1svNV, %function -bluegl_glVertexAttrib1svNV: - mov __blue_glCore_glVertexAttrib1svNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetnMapivARB +.type bluegl_glGetnMapivARB, %function +bluegl_glGetnMapivARB: + mov __blue_glCore_glGetnMapivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexImage3D -.type bluegl_glTexImage3D, %function -bluegl_glTexImage3D: - mov __blue_glCore_glTexImage3D@GOTPCREL(%rip), %r11 +.global bluegl_glGetnPixelMapfvARB +.type bluegl_glGetnPixelMapfvARB, %function +bluegl_glGetnPixelMapfvARB: + mov __blue_glCore_glGetnPixelMapfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1i64ARB -.type bluegl_glUniform1i64ARB, %function -bluegl_glUniform1i64ARB: - mov __blue_glCore_glUniform1i64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetnPixelMapuivARB +.type bluegl_glGetnPixelMapuivARB, %function +bluegl_glGetnPixelMapuivARB: + mov __blue_glCore_glGetnPixelMapuivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4Nuiv -.type bluegl_glVertexAttrib4Nuiv, %function -bluegl_glVertexAttrib4Nuiv: - mov __blue_glCore_glVertexAttrib4Nuiv@GOTPCREL(%rip), %r11 +.global bluegl_glGetnPixelMapusvARB +.type bluegl_glGetnPixelMapusvARB, %function +bluegl_glGetnPixelMapusvARB: + mov __blue_glCore_glGetnPixelMapusvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramivNV -.type bluegl_glGetProgramivNV, %function -bluegl_glGetProgramivNV: - mov __blue_glCore_glGetProgramivNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetnPolygonStippleARB +.type bluegl_glGetnPolygonStippleARB, %function +bluegl_glGetnPolygonStippleARB: + mov __blue_glCore_glGetnPolygonStippleARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTexGenxvOES -.type bluegl_glGetTexGenxvOES, %function -bluegl_glGetTexGenxvOES: - mov __blue_glCore_glGetTexGenxvOES@GOTPCREL(%rip), %r11 +.global bluegl_glGetnColorTableARB +.type bluegl_glGetnColorTableARB, %function +bluegl_glGetnColorTableARB: + mov __blue_glCore_glGetnColorTableARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexP4uiv -.type bluegl_glVertexP4uiv, %function -bluegl_glVertexP4uiv: - mov __blue_glCore_glVertexP4uiv@GOTPCREL(%rip), %r11 +.global bluegl_glGetnConvolutionFilterARB +.type bluegl_glGetnConvolutionFilterARB, %function +bluegl_glGetnConvolutionFilterARB: + mov __blue_glCore_glGetnConvolutionFilterARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMapGrid1xOES -.type bluegl_glMapGrid1xOES, %function -bluegl_glMapGrid1xOES: - mov __blue_glCore_glMapGrid1xOES@GOTPCREL(%rip), %r11 +.global bluegl_glGetnSeparableFilterARB +.type bluegl_glGetnSeparableFilterARB, %function +bluegl_glGetnSeparableFilterARB: + mov __blue_glCore_glGetnSeparableFilterARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix2dv -.type bluegl_glProgramUniformMatrix2dv, %function -bluegl_glProgramUniformMatrix2dv: - mov __blue_glCore_glProgramUniformMatrix2dv@GOTPCREL(%rip), %r11 +.global bluegl_glGetnHistogramARB +.type bluegl_glGetnHistogramARB, %function +bluegl_glGetnHistogramARB: + mov __blue_glCore_glGetnHistogramARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorMaski -.type bluegl_glColorMaski, %function -bluegl_glColorMaski: - mov __blue_glCore_glColorMaski@GOTPCREL(%rip), %r11 +.global bluegl_glGetnMinmaxARB +.type bluegl_glGetnMinmaxARB, %function +bluegl_glGetnMinmaxARB: + mov __blue_glCore_glGetnMinmaxARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEdgeFlagPointerListIBM -.type bluegl_glEdgeFlagPointerListIBM, %function -bluegl_glEdgeFlagPointerListIBM: - mov __blue_glCore_glEdgeFlagPointerListIBM@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferSampleLocationsfvARB +.type bluegl_glFramebufferSampleLocationsfvARB, %function +bluegl_glFramebufferSampleLocationsfvARB: + mov __blue_glCore_glFramebufferSampleLocationsfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetUniformBlockIndex -.type bluegl_glGetUniformBlockIndex, %function -bluegl_glGetUniformBlockIndex: - mov __blue_glCore_glGetUniformBlockIndex@GOTPCREL(%rip), %r11 +.global bluegl_glNamedFramebufferSampleLocationsfvARB +.type bluegl_glNamedFramebufferSampleLocationsfvARB, %function +bluegl_glNamedFramebufferSampleLocationsfvARB: + mov __blue_glCore_glNamedFramebufferSampleLocationsfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearColorxOES -.type bluegl_glClearColorxOES, %function -bluegl_glClearColorxOES: - mov __blue_glCore_glClearColorxOES@GOTPCREL(%rip), %r11 +.global bluegl_glEvaluateDepthValuesARB +.type bluegl_glEvaluateDepthValuesARB, %function +bluegl_glEvaluateDepthValuesARB: + mov __blue_glCore_glEvaluateDepthValuesARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPixelTransformParameteriEXT -.type bluegl_glPixelTransformParameteriEXT, %function -bluegl_glPixelTransformParameteriEXT: - mov __blue_glCore_glPixelTransformParameteriEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteObjectARB +.type bluegl_glDeleteObjectARB, %function +bluegl_glDeleteObjectARB: + mov __blue_glCore_glDeleteObjectARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedFramebufferTexture3DEXT -.type bluegl_glNamedFramebufferTexture3DEXT, %function -bluegl_glNamedFramebufferTexture3DEXT: - mov __blue_glCore_glNamedFramebufferTexture3DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetHandleARB +.type bluegl_glGetHandleARB, %function +bluegl_glGetHandleARB: + mov __blue_glCore_glGetHandleARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord4xOES -.type bluegl_glTexCoord4xOES, %function -bluegl_glTexCoord4xOES: - mov __blue_glCore_glTexCoord4xOES@GOTPCREL(%rip), %r11 +.global bluegl_glDetachObjectARB +.type bluegl_glDetachObjectARB, %function +bluegl_glDetachObjectARB: + mov __blue_glCore_glDetachObjectARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetUniformivARB -.type bluegl_glGetUniformivARB, %function -bluegl_glGetUniformivARB: - mov __blue_glCore_glGetUniformivARB@GOTPCREL(%rip), %r11 +.global bluegl_glCreateShaderObjectARB +.type bluegl_glCreateShaderObjectARB, %function +bluegl_glCreateShaderObjectARB: + mov __blue_glCore_glCreateShaderObjectARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedFramebufferTextureEXT -.type bluegl_glNamedFramebufferTextureEXT, %function -bluegl_glNamedFramebufferTextureEXT: - mov __blue_glCore_glNamedFramebufferTextureEXT@GOTPCREL(%rip), %r11 +.global bluegl_glShaderSourceARB +.type bluegl_glShaderSourceARB, %function +bluegl_glShaderSourceARB: + mov __blue_glCore_glShaderSourceARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawBuffers -.type bluegl_glDrawBuffers, %function -bluegl_glDrawBuffers: - mov __blue_glCore_glDrawBuffers@GOTPCREL(%rip), %r11 +.global bluegl_glCompileShaderARB +.type bluegl_glCompileShaderARB, %function +bluegl_glCompileShaderARB: + mov __blue_glCore_glCompileShaderARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWeightuivARB -.type bluegl_glWeightuivARB, %function -bluegl_glWeightuivARB: - mov __blue_glCore_glWeightuivARB@GOTPCREL(%rip), %r11 +.global bluegl_glCreateProgramObjectARB +.type bluegl_glCreateProgramObjectARB, %function +bluegl_glCreateProgramObjectARB: + mov __blue_glCore_glCreateProgramObjectARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoordP1ui -.type bluegl_glMultiTexCoordP1ui, %function -bluegl_glMultiTexCoordP1ui: - mov __blue_glCore_glMultiTexCoordP1ui@GOTPCREL(%rip), %r11 +.global bluegl_glAttachObjectARB +.type bluegl_glAttachObjectARB, %function +bluegl_glAttachObjectARB: + mov __blue_glCore_glAttachObjectARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyTexSubImage1DEXT -.type bluegl_glCopyTexSubImage1DEXT, %function -bluegl_glCopyTexSubImage1DEXT: - mov __blue_glCore_glCopyTexSubImage1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glLinkProgramARB +.type bluegl_glLinkProgramARB, %function +bluegl_glLinkProgramARB: + mov __blue_glCore_glLinkProgramARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayAttribBinding -.type bluegl_glVertexArrayAttribBinding, %function -bluegl_glVertexArrayAttribBinding: - mov __blue_glCore_glVertexArrayAttribBinding@GOTPCREL(%rip), %r11 +.global bluegl_glUseProgramObjectARB +.type bluegl_glUseProgramObjectARB, %function +bluegl_glUseProgramObjectARB: + mov __blue_glCore_glUseProgramObjectARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexP4ui -.type bluegl_glVertexP4ui, %function -bluegl_glVertexP4ui: - mov __blue_glCore_glVertexP4ui@GOTPCREL(%rip), %r11 +.global bluegl_glValidateProgramARB +.type bluegl_glValidateProgramARB, %function +bluegl_glValidateProgramARB: + mov __blue_glCore_glValidateProgramARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertex2hvNV -.type bluegl_glVertex2hvNV, %function -bluegl_glVertex2hvNV: - mov __blue_glCore_glVertex2hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1fARB +.type bluegl_glUniform1fARB, %function +bluegl_glUniform1fARB: + mov __blue_glCore_glUniform1fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawElementsInstancedBaseInstance -.type bluegl_glDrawElementsInstancedBaseInstance, %function -bluegl_glDrawElementsInstancedBaseInstance: - mov __blue_glCore_glDrawElementsInstancedBaseInstance@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2fARB +.type bluegl_glUniform2fARB, %function +bluegl_glUniform2fARB: + mov __blue_glCore_glUniform2fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormalStream3sATI -.type bluegl_glNormalStream3sATI, %function -bluegl_glNormalStream3sATI: - mov __blue_glCore_glNormalStream3sATI@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3fARB +.type bluegl_glUniform3fARB, %function +bluegl_glUniform3fARB: + mov __blue_glCore_glUniform3fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN -.type bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN, %function -bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN: - mov __blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4fARB +.type bluegl_glUniform4fARB, %function +bluegl_glUniform4fARB: + mov __blue_glCore_glUniform4fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindSamplers -.type bluegl_glBindSamplers, %function -bluegl_glBindSamplers: - mov __blue_glCore_glBindSamplers@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1iARB +.type bluegl_glUniform1iARB, %function +bluegl_glUniform1iARB: + mov __blue_glCore_glUniform1iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetCompressedMultiTexImageEXT -.type bluegl_glGetCompressedMultiTexImageEXT, %function -bluegl_glGetCompressedMultiTexImageEXT: - mov __blue_glCore_glGetCompressedMultiTexImageEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2iARB +.type bluegl_glUniform2iARB, %function +bluegl_glUniform2iARB: + mov __blue_glCore_glUniform2iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetRenderbufferParameterivEXT -.type bluegl_glGetRenderbufferParameterivEXT, %function -bluegl_glGetRenderbufferParameterivEXT: - mov __blue_glCore_glGetRenderbufferParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3iARB +.type bluegl_glUniform3iARB, %function +bluegl_glUniform3iARB: + mov __blue_glCore_glUniform3iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3dv -.type bluegl_glUniform3dv, %function -bluegl_glUniform3dv: - mov __blue_glCore_glUniform3dv@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4iARB +.type bluegl_glUniform4iARB, %function +bluegl_glUniform4iARB: + mov __blue_glCore_glUniform4iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFlushRasterSGIX -.type bluegl_glFlushRasterSGIX, %function -bluegl_glFlushRasterSGIX: - mov __blue_glCore_glFlushRasterSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1fvARB +.type bluegl_glUniform1fvARB, %function +bluegl_glUniform1fvARB: + mov __blue_glCore_glUniform1fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribs3hvNV -.type bluegl_glVertexAttribs3hvNV, %function -bluegl_glVertexAttribs3hvNV: - mov __blue_glCore_glVertexAttribs3hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2fvARB +.type bluegl_glUniform2fvARB, %function +bluegl_glUniform2fvARB: + mov __blue_glCore_glUniform2fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnSeparableFilterARB -.type bluegl_glGetnSeparableFilterARB, %function -bluegl_glGetnSeparableFilterARB: - mov __blue_glCore_glGetnSeparableFilterARB@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3fvARB +.type bluegl_glUniform3fvARB, %function +bluegl_glUniform3fvARB: + mov __blue_glCore_glUniform3fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2sARB -.type bluegl_glWindowPos2sARB, %function -bluegl_glWindowPos2sARB: - mov __blue_glCore_glWindowPos2sARB@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4fvARB +.type bluegl_glUniform4fvARB, %function +bluegl_glUniform4fvARB: + mov __blue_glCore_glUniform4fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPopDebugGroup -.type bluegl_glPopDebugGroup, %function -bluegl_glPopDebugGroup: - mov __blue_glCore_glPopDebugGroup@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1ivARB +.type bluegl_glUniform1ivARB, %function +bluegl_glUniform1ivARB: + mov __blue_glCore_glUniform1ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVideoCaptureNV -.type bluegl_glVideoCaptureNV, %function -bluegl_glVideoCaptureNV: - mov __blue_glCore_glVideoCaptureNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2ivARB +.type bluegl_glUniform2ivARB, %function +bluegl_glUniform2ivARB: + mov __blue_glCore_glUniform2ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTangent3bEXT -.type bluegl_glTangent3bEXT, %function -bluegl_glTangent3bEXT: - mov __blue_glCore_glTangent3bEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3ivARB +.type bluegl_glUniform3ivARB, %function +bluegl_glUniform3ivARB: + mov __blue_glCore_glUniform3ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLinkProgram -.type bluegl_glLinkProgram, %function -bluegl_glLinkProgram: - mov __blue_glCore_glLinkProgram@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4ivARB +.type bluegl_glUniform4ivARB, %function +bluegl_glUniform4ivARB: + mov __blue_glCore_glUniform4ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFogCoordPointerListIBM -.type bluegl_glFogCoordPointerListIBM, %function -bluegl_glFogCoordPointerListIBM: - mov __blue_glCore_glFogCoordPointerListIBM@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix2fvARB +.type bluegl_glUniformMatrix2fvARB, %function +bluegl_glUniformMatrix2fvARB: + mov __blue_glCore_glUniformMatrix2fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glRotatexOES -.type bluegl_glRotatexOES, %function -bluegl_glRotatexOES: - mov __blue_glCore_glRotatexOES@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix3fvARB +.type bluegl_glUniformMatrix3fvARB, %function +bluegl_glUniformMatrix3fvARB: + mov __blue_glCore_glUniformMatrix3fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathParameterivNV -.type bluegl_glPathParameterivNV, %function -bluegl_glPathParameterivNV: - mov __blue_glCore_glPathParameterivNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniformMatrix4fvARB +.type bluegl_glUniformMatrix4fvARB, %function +bluegl_glUniformMatrix4fvARB: + mov __blue_glCore_glUniformMatrix4fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribLPointerEXT -.type bluegl_glVertexAttribLPointerEXT, %function -bluegl_glVertexAttribLPointerEXT: - mov __blue_glCore_glVertexAttribLPointerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetObjectParameterfvARB +.type bluegl_glGetObjectParameterfvARB, %function +bluegl_glGetObjectParameterfvARB: + mov __blue_glCore_glGetObjectParameterfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetInteger64i_v -.type bluegl_glGetInteger64i_v, %function -bluegl_glGetInteger64i_v: - mov __blue_glCore_glGetInteger64i_v@GOTPCREL(%rip), %r11 +.global bluegl_glGetObjectParameterivARB +.type bluegl_glGetObjectParameterivARB, %function +bluegl_glGetObjectParameterivARB: + mov __blue_glCore_glGetObjectParameterivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedMultiTexSubImage1DEXT -.type bluegl_glCompressedMultiTexSubImage1DEXT, %function -bluegl_glCompressedMultiTexSubImage1DEXT: - mov __blue_glCore_glCompressedMultiTexSubImage1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetInfoLogARB +.type bluegl_glGetInfoLogARB, %function +bluegl_glGetInfoLogARB: + mov __blue_glCore_glGetInfoLogARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glConvolutionParameteriEXT -.type bluegl_glConvolutionParameteriEXT, %function -bluegl_glConvolutionParameteriEXT: - mov __blue_glCore_glConvolutionParameteriEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetAttachedObjectsARB +.type bluegl_glGetAttachedObjectsARB, %function +bluegl_glGetAttachedObjectsARB: + mov __blue_glCore_glGetAttachedObjectsARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedFramebufferTextureLayer -.type bluegl_glNamedFramebufferTextureLayer, %function -bluegl_glNamedFramebufferTextureLayer: - mov __blue_glCore_glNamedFramebufferTextureLayer@GOTPCREL(%rip), %r11 +.global bluegl_glGetUniformLocationARB +.type bluegl_glGetUniformLocationARB, %function +bluegl_glGetUniformLocationARB: + mov __blue_glCore_glGetUniformLocationARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2sMESA -.type bluegl_glWindowPos2sMESA, %function -bluegl_glWindowPos2sMESA: - mov __blue_glCore_glWindowPos2sMESA@GOTPCREL(%rip), %r11 +.global bluegl_glGetActiveUniformARB +.type bluegl_glGetActiveUniformARB, %function +bluegl_glGetActiveUniformARB: + mov __blue_glCore_glGetActiveUniformARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCoverStrokePathInstancedNV -.type bluegl_glCoverStrokePathInstancedNV, %function -bluegl_glCoverStrokePathInstancedNV: - mov __blue_glCore_glCoverStrokePathInstancedNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetUniformfvARB +.type bluegl_glGetUniformfvARB, %function +bluegl_glGetUniformfvARB: + mov __blue_glCore_glGetUniformfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexParameteri -.type bluegl_glTexParameteri, %function -bluegl_glTexParameteri: - mov __blue_glCore_glTexParameteri@GOTPCREL(%rip), %r11 +.global bluegl_glGetUniformivARB +.type bluegl_glGetUniformivARB, %function +bluegl_glGetUniformivARB: + mov __blue_glCore_glGetUniformivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1uiv -.type bluegl_glUniform1uiv, %function -bluegl_glUniform1uiv: - mov __blue_glCore_glUniform1uiv@GOTPCREL(%rip), %r11 +.global bluegl_glGetShaderSourceARB +.type bluegl_glGetShaderSourceARB, %function +bluegl_glGetShaderSourceARB: + mov __blue_glCore_glGetShaderSourceARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4fv -.type bluegl_glMultiTexCoord4fv, %function -bluegl_glMultiTexCoord4fv: - mov __blue_glCore_glMultiTexCoord4fv@GOTPCREL(%rip), %r11 +.global bluegl_glTexBufferARB +.type bluegl_glTexBufferARB, %function +bluegl_glTexBufferARB: + mov __blue_glCore_glTexBufferARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramParameter4fvNV -.type bluegl_glProgramParameter4fvNV, %function -bluegl_glProgramParameter4fvNV: - mov __blue_glCore_glProgramParameter4fvNV@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTexImage3DARB +.type bluegl_glCompressedTexImage3DARB, %function +bluegl_glCompressedTexImage3DARB: + mov __blue_glCore_glCompressedTexImage3DARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeformationMap3fSGIX -.type bluegl_glDeformationMap3fSGIX, %function -bluegl_glDeformationMap3fSGIX: - mov __blue_glCore_glDeformationMap3fSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTexImage2DARB +.type bluegl_glCompressedTexImage2DARB, %function +bluegl_glCompressedTexImage2DARB: + mov __blue_glCore_glCompressedTexImage2DARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendEquationiARB -.type bluegl_glBlendEquationiARB, %function -bluegl_glBlendEquationiARB: - mov __blue_glCore_glBlendEquationiARB@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTexImage1DARB +.type bluegl_glCompressedTexImage1DARB, %function +bluegl_glCompressedTexImage1DARB: + mov __blue_glCore_glCompressedTexImage1DARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStencilFunc -.type bluegl_glStencilFunc, %function -bluegl_glStencilFunc: - mov __blue_glCore_glStencilFunc@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTexSubImage3DARB +.type bluegl_glCompressedTexSubImage3DARB, %function +bluegl_glCompressedTexSubImage3DARB: + mov __blue_glCore_glCompressedTexSubImage3DARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFogCoordd -.type bluegl_glFogCoordd, %function -bluegl_glFogCoordd: - mov __blue_glCore_glFogCoordd@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTexSubImage2DARB +.type bluegl_glCompressedTexSubImage2DARB, %function +bluegl_glCompressedTexSubImage2DARB: + mov __blue_glCore_glCompressedTexSubImage2DARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2iv -.type bluegl_glUniform2iv, %function -bluegl_glUniform2iv: - mov __blue_glCore_glUniform2iv@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTexSubImage1DARB +.type bluegl_glCompressedTexSubImage1DARB, %function +bluegl_glCompressedTexSubImage1DARB: + mov __blue_glCore_glCompressedTexSubImage1DARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1i64NV -.type bluegl_glUniform1i64NV, %function -bluegl_glUniform1i64NV: - mov __blue_glCore_glUniform1i64NV@GOTPCREL(%rip), %r11 +.global bluegl_glGetCompressedTexImageARB +.type bluegl_glGetCompressedTexImageARB, %function +bluegl_glGetCompressedTexImageARB: + mov __blue_glCore_glGetCompressedTexImageARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureStorage2D -.type bluegl_glTextureStorage2D, %function -bluegl_glTextureStorage2D: - mov __blue_glCore_glTextureStorage2D@GOTPCREL(%rip), %r11 +.global bluegl_glLoadTransposeMatrixfARB +.type bluegl_glLoadTransposeMatrixfARB, %function +bluegl_glLoadTransposeMatrixfARB: + mov __blue_glCore_glLoadTransposeMatrixfARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureStorage2DMultisampleEXT -.type bluegl_glTextureStorage2DMultisampleEXT, %function -bluegl_glTextureStorage2DMultisampleEXT: - mov __blue_glCore_glTextureStorage2DMultisampleEXT@GOTPCREL(%rip), %r11 +.global bluegl_glLoadTransposeMatrixdARB +.type bluegl_glLoadTransposeMatrixdARB, %function +bluegl_glLoadTransposeMatrixdARB: + mov __blue_glCore_glLoadTransposeMatrixdARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyTexSubImage1D -.type bluegl_glCopyTexSubImage1D, %function -bluegl_glCopyTexSubImage1D: - mov __blue_glCore_glCopyTexSubImage1D@GOTPCREL(%rip), %r11 +.global bluegl_glMultTransposeMatrixfARB +.type bluegl_glMultTransposeMatrixfARB, %function +bluegl_glMultTransposeMatrixfARB: + mov __blue_glCore_glMultTransposeMatrixfARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSamplerParameterf -.type bluegl_glSamplerParameterf, %function -bluegl_glSamplerParameterf: - mov __blue_glCore_glSamplerParameterf@GOTPCREL(%rip), %r11 +.global bluegl_glMultTransposeMatrixdARB +.type bluegl_glMultTransposeMatrixdARB, %function +bluegl_glMultTransposeMatrixdARB: + mov __blue_glCore_glMultTransposeMatrixdARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawArraysInstancedBaseInstance -.type bluegl_glDrawArraysInstancedBaseInstance, %function -bluegl_glDrawArraysInstancedBaseInstance: - mov __blue_glCore_glDrawArraysInstancedBaseInstance@GOTPCREL(%rip), %r11 +.global bluegl_glWeightbvARB +.type bluegl_glWeightbvARB, %function +bluegl_glWeightbvARB: + mov __blue_glCore_glWeightbvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4uivARB -.type bluegl_glVertexAttrib4uivARB, %function -bluegl_glVertexAttrib4uivARB: - mov __blue_glCore_glVertexAttrib4uivARB@GOTPCREL(%rip), %r11 +.global bluegl_glWeightsvARB +.type bluegl_glWeightsvARB, %function +bluegl_glWeightsvARB: + mov __blue_glCore_glWeightsvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribFormatNV -.type bluegl_glVertexAttribFormatNV, %function -bluegl_glVertexAttribFormatNV: - mov __blue_glCore_glVertexAttribFormatNV@GOTPCREL(%rip), %r11 +.global bluegl_glWeightivARB +.type bluegl_glWeightivARB, %function +bluegl_glWeightivARB: + mov __blue_glCore_glWeightivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsQueryARB -.type bluegl_glIsQueryARB, %function -bluegl_glIsQueryARB: - mov __blue_glCore_glIsQueryARB@GOTPCREL(%rip), %r11 +.global bluegl_glWeightfvARB +.type bluegl_glWeightfvARB, %function +bluegl_glWeightfvARB: + mov __blue_glCore_glWeightfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSampleCoverageARB -.type bluegl_glSampleCoverageARB, %function -bluegl_glSampleCoverageARB: - mov __blue_glCore_glSampleCoverageARB@GOTPCREL(%rip), %r11 +.global bluegl_glWeightdvARB +.type bluegl_glWeightdvARB, %function +bluegl_glWeightdvARB: + mov __blue_glCore_glWeightdvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnCompressedTexImageARB -.type bluegl_glGetnCompressedTexImageARB, %function -bluegl_glGetnCompressedTexImageARB: - mov __blue_glCore_glGetnCompressedTexImageARB@GOTPCREL(%rip), %r11 +.global bluegl_glWeightubvARB +.type bluegl_glWeightubvARB, %function +bluegl_glWeightubvARB: + mov __blue_glCore_glWeightubvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord3xvOES -.type bluegl_glTexCoord3xvOES, %function -bluegl_glTexCoord3xvOES: - mov __blue_glCore_glTexCoord3xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glWeightusvARB +.type bluegl_glWeightusvARB, %function +bluegl_glWeightusvARB: + mov __blue_glCore_glWeightusvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord2fNormal3fVertex3fSUN -.type bluegl_glTexCoord2fNormal3fVertex3fSUN, %function -bluegl_glTexCoord2fNormal3fVertex3fSUN: - mov __blue_glCore_glTexCoord2fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glWeightuivARB +.type bluegl_glWeightuivARB, %function +bluegl_glWeightuivARB: + mov __blue_glCore_glWeightuivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetGraphicsResetStatus -.type bluegl_glGetGraphicsResetStatus, %function -bluegl_glGetGraphicsResetStatus: - mov __blue_glCore_glGetGraphicsResetStatus@GOTPCREL(%rip), %r11 +.global bluegl_glWeightPointerARB +.type bluegl_glWeightPointerARB, %function +bluegl_glWeightPointerARB: + mov __blue_glCore_glWeightPointerARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramVertexLimitNV -.type bluegl_glProgramVertexLimitNV, %function -bluegl_glProgramVertexLimitNV: - mov __blue_glCore_glProgramVertexLimitNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexBlendARB +.type bluegl_glVertexBlendARB, %function +bluegl_glVertexBlendARB: + mov __blue_glCore_glVertexBlendARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyConvolutionFilter2D -.type bluegl_glCopyConvolutionFilter2D, %function -bluegl_glCopyConvolutionFilter2D: - mov __blue_glCore_glCopyConvolutionFilter2D@GOTPCREL(%rip), %r11 +.global bluegl_glBindBufferARB +.type bluegl_glBindBufferARB, %function +bluegl_glBindBufferARB: + mov __blue_glCore_glBindBufferARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream4fATI -.type bluegl_glVertexStream4fATI, %function -bluegl_glVertexStream4fATI: - mov __blue_glCore_glVertexStream4fATI@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteBuffersARB +.type bluegl_glDeleteBuffersARB, %function +bluegl_glDeleteBuffersARB: + mov __blue_glCore_glDeleteBuffersARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3f -.type bluegl_glSecondaryColor3f, %function -bluegl_glSecondaryColor3f: - mov __blue_glCore_glSecondaryColor3f@GOTPCREL(%rip), %r11 +.global bluegl_glGenBuffersARB +.type bluegl_glGenBuffersARB, %function +bluegl_glGenBuffersARB: + mov __blue_glCore_glGenBuffersARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoordP1ui -.type bluegl_glTexCoordP1ui, %function -bluegl_glTexCoordP1ui: - mov __blue_glCore_glTexCoordP1ui@GOTPCREL(%rip), %r11 +.global bluegl_glIsBufferARB +.type bluegl_glIsBufferARB, %function +bluegl_glIsBufferARB: + mov __blue_glCore_glIsBufferARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramBufferParametersfvNV -.type bluegl_glProgramBufferParametersfvNV, %function -bluegl_glProgramBufferParametersfvNV: - mov __blue_glCore_glProgramBufferParametersfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glBufferDataARB +.type bluegl_glBufferDataARB, %function +bluegl_glBufferDataARB: + mov __blue_glCore_glBufferDataARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord1xOES -.type bluegl_glTexCoord1xOES, %function -bluegl_glTexCoord1xOES: - mov __blue_glCore_glTexCoord1xOES@GOTPCREL(%rip), %r11 +.global bluegl_glBufferSubDataARB +.type bluegl_glBufferSubDataARB, %function +bluegl_glBufferSubDataARB: + mov __blue_glCore_glBufferSubDataARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFogCoordfv -.type bluegl_glFogCoordfv, %function -bluegl_glFogCoordfv: - mov __blue_glCore_glFogCoordfv@GOTPCREL(%rip), %r11 +.global bluegl_glGetBufferSubDataARB +.type bluegl_glGetBufferSubDataARB, %function +bluegl_glGetBufferSubDataARB: + mov __blue_glCore_glGetBufferSubDataARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiDrawElementsIndirectAMD -.type bluegl_glMultiDrawElementsIndirectAMD, %function -bluegl_glMultiDrawElementsIndirectAMD: - mov __blue_glCore_glMultiDrawElementsIndirectAMD@GOTPCREL(%rip), %r11 +.global bluegl_glMapBufferARB +.type bluegl_glMapBufferARB, %function +bluegl_glMapBufferARB: + mov __blue_glCore_glMapBufferARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnMinmaxARB -.type bluegl_glGetnMinmaxARB, %function -bluegl_glGetnMinmaxARB: - mov __blue_glCore_glGetnMinmaxARB@GOTPCREL(%rip), %r11 +.global bluegl_glUnmapBufferARB +.type bluegl_glUnmapBufferARB, %function +bluegl_glUnmapBufferARB: + mov __blue_glCore_glUnmapBufferARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3uivEXT -.type bluegl_glSecondaryColor3uivEXT, %function -bluegl_glSecondaryColor3uivEXT: - mov __blue_glCore_glSecondaryColor3uivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetBufferParameterivARB +.type bluegl_glGetBufferParameterivARB, %function +bluegl_glGetBufferParameterivARB: + mov __blue_glCore_glGetBufferParameterivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorMask -.type bluegl_glColorMask, %function -bluegl_glColorMask: - mov __blue_glCore_glColorMask@GOTPCREL(%rip), %r11 +.global bluegl_glGetBufferPointervARB +.type bluegl_glGetBufferPointervARB, %function +bluegl_glGetBufferPointervARB: + mov __blue_glCore_glGetBufferPointervARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureImage2DMultisampleCoverageNV -.type bluegl_glTextureImage2DMultisampleCoverageNV, %function -bluegl_glTextureImage2DMultisampleCoverageNV: - mov __blue_glCore_glTextureImage2DMultisampleCoverageNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1dARB +.type bluegl_glVertexAttrib1dARB, %function +bluegl_glVertexAttrib1dARB: + mov __blue_glCore_glVertexAttrib1dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiModeDrawElementsIBM -.type bluegl_glMultiModeDrawElementsIBM, %function -bluegl_glMultiModeDrawElementsIBM: - mov __blue_glCore_glMultiModeDrawElementsIBM@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1dvARB +.type bluegl_glVertexAttrib1dvARB, %function +bluegl_glVertexAttrib1dvARB: + mov __blue_glCore_glVertexAttrib1dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayAttribLFormat -.type bluegl_glVertexArrayAttribLFormat, %function -bluegl_glVertexArrayAttribLFormat: - mov __blue_glCore_glVertexArrayAttribLFormat@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1fARB +.type bluegl_glVertexAttrib1fARB, %function +bluegl_glVertexAttrib1fARB: + mov __blue_glCore_glVertexAttrib1fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindFragDataLocationIndexed -.type bluegl_glBindFragDataLocationIndexed, %function -bluegl_glBindFragDataLocationIndexed: - mov __blue_glCore_glBindFragDataLocationIndexed@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1fvARB +.type bluegl_glVertexAttrib1fvARB, %function +bluegl_glVertexAttrib1fvARB: + mov __blue_glCore_glVertexAttrib1fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedBufferParameterivEXT -.type bluegl_glGetNamedBufferParameterivEXT, %function -bluegl_glGetNamedBufferParameterivEXT: - mov __blue_glCore_glGetNamedBufferParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1sARB +.type bluegl_glVertexAttrib1sARB, %function +bluegl_glVertexAttrib1sARB: + mov __blue_glCore_glVertexAttrib1sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3bEXT -.type bluegl_glSecondaryColor3bEXT, %function -bluegl_glSecondaryColor3bEXT: - mov __blue_glCore_glSecondaryColor3bEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1svARB +.type bluegl_glVertexAttrib1svARB, %function +bluegl_glVertexAttrib1svARB: + mov __blue_glCore_glVertexAttrib1svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1fNV -.type bluegl_glVertexAttrib1fNV, %function -bluegl_glVertexAttrib1fNV: - mov __blue_glCore_glVertexAttrib1fNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2dARB +.type bluegl_glVertexAttrib2dARB, %function +bluegl_glVertexAttrib2dARB: + mov __blue_glCore_glVertexAttrib2dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI4uivEXT -.type bluegl_glVertexAttribI4uivEXT, %function -bluegl_glVertexAttribI4uivEXT: - mov __blue_glCore_glVertexAttribI4uivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2dvARB +.type bluegl_glVertexAttrib2dvARB, %function +bluegl_glVertexAttrib2dvARB: + mov __blue_glCore_glVertexAttrib2dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetQueryObjecti64vEXT -.type bluegl_glGetQueryObjecti64vEXT, %function -bluegl_glGetQueryObjecti64vEXT: - mov __blue_glCore_glGetQueryObjecti64vEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2fARB +.type bluegl_glVertexAttrib2fARB, %function +bluegl_glVertexAttrib2fARB: + mov __blue_glCore_glVertexAttrib2fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormalStream3bATI -.type bluegl_glNormalStream3bATI, %function -bluegl_glNormalStream3bATI: - mov __blue_glCore_glNormalStream3bATI@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2fvARB +.type bluegl_glVertexAttrib2fvARB, %function +bluegl_glVertexAttrib2fvARB: + mov __blue_glCore_glVertexAttrib2fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetObjectParameterivAPPLE -.type bluegl_glGetObjectParameterivAPPLE, %function -bluegl_glGetObjectParameterivAPPLE: - mov __blue_glCore_glGetObjectParameterivAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2sARB +.type bluegl_glVertexAttrib2sARB, %function +bluegl_glVertexAttrib2sARB: + mov __blue_glCore_glVertexAttrib2sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3uivEXT -.type bluegl_glProgramUniform3uivEXT, %function -bluegl_glProgramUniform3uivEXT: - mov __blue_glCore_glProgramUniform3uivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2svARB +.type bluegl_glVertexAttrib2svARB, %function +bluegl_glVertexAttrib2svARB: + mov __blue_glCore_glVertexAttrib2svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformHandleui64ARB -.type bluegl_glProgramUniformHandleui64ARB, %function -bluegl_glProgramUniformHandleui64ARB: - mov __blue_glCore_glProgramUniformHandleui64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3dARB +.type bluegl_glVertexAttrib3dARB, %function +bluegl_glVertexAttrib3dARB: + mov __blue_glCore_glVertexAttrib3dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPointerv -.type bluegl_glGetPointerv, %function -bluegl_glGetPointerv: - mov __blue_glCore_glGetPointerv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3dvARB +.type bluegl_glVertexAttrib3dvARB, %function +bluegl_glVertexAttrib3dvARB: + mov __blue_glCore_glVertexAttrib3dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix4x3dv -.type bluegl_glUniformMatrix4x3dv, %function -bluegl_glUniformMatrix4x3dv: - mov __blue_glCore_glUniformMatrix4x3dv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3fARB +.type bluegl_glVertexAttrib3fARB, %function +bluegl_glVertexAttrib3fARB: + mov __blue_glCore_glVertexAttrib3fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoordP4uiv -.type bluegl_glTexCoordP4uiv, %function -bluegl_glTexCoordP4uiv: - mov __blue_glCore_glTexCoordP4uiv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3fvARB +.type bluegl_glVertexAttrib3fvARB, %function +bluegl_glVertexAttrib3fvARB: + mov __blue_glCore_glVertexAttrib3fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI4sv -.type bluegl_glVertexAttribI4sv, %function -bluegl_glVertexAttribI4sv: - mov __blue_glCore_glVertexAttribI4sv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3sARB +.type bluegl_glVertexAttrib3sARB, %function +bluegl_glVertexAttrib3sARB: + mov __blue_glCore_glVertexAttrib3sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFlushMappedNamedBufferRangeEXT -.type bluegl_glFlushMappedNamedBufferRangeEXT, %function -bluegl_glFlushMappedNamedBufferRangeEXT: - mov __blue_glCore_glFlushMappedNamedBufferRangeEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3svARB +.type bluegl_glVertexAttrib3svARB, %function +bluegl_glVertexAttrib3svARB: + mov __blue_glCore_glVertexAttrib3svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDisableVertexArrayEXT -.type bluegl_glDisableVertexArrayEXT, %function -bluegl_glDisableVertexArrayEXT: - mov __blue_glCore_glDisableVertexArrayEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4NbvARB +.type bluegl_glVertexAttrib4NbvARB, %function +bluegl_glVertexAttrib4NbvARB: + mov __blue_glCore_glVertexAttrib4NbvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPathDashArrayNV -.type bluegl_glGetPathDashArrayNV, %function -bluegl_glGetPathDashArrayNV: - mov __blue_glCore_glGetPathDashArrayNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4NivARB +.type bluegl_glVertexAttrib4NivARB, %function +bluegl_glVertexAttrib4NivARB: + mov __blue_glCore_glVertexAttrib4NivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2uiEXT -.type bluegl_glProgramUniform2uiEXT, %function -bluegl_glProgramUniform2uiEXT: - mov __blue_glCore_glProgramUniform2uiEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4NsvARB +.type bluegl_glVertexAttrib4NsvARB, %function +bluegl_glVertexAttrib4NsvARB: + mov __blue_glCore_glVertexAttrib4NsvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindImageTextures -.type bluegl_glBindImageTextures, %function -bluegl_glBindImageTextures: - mov __blue_glCore_glBindImageTextures@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4NubARB +.type bluegl_glVertexAttrib4NubARB, %function +bluegl_glVertexAttrib4NubARB: + mov __blue_glCore_glVertexAttrib4NubARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4sNV -.type bluegl_glVertexAttrib4sNV, %function -bluegl_glVertexAttrib4sNV: - mov __blue_glCore_glVertexAttrib4sNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4NubvARB +.type bluegl_glVertexAttrib4NubvARB, %function +bluegl_glVertexAttrib4NubvARB: + mov __blue_glCore_glVertexAttrib4NubvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeuiNormal3fVertex3fvSUN -.type bluegl_glReplacementCodeuiNormal3fVertex3fvSUN, %function -bluegl_glReplacementCodeuiNormal3fVertex3fvSUN: - mov __blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4NuivARB +.type bluegl_glVertexAttrib4NuivARB, %function +bluegl_glVertexAttrib4NuivARB: + mov __blue_glCore_glVertexAttrib4NuivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertex3hNV -.type bluegl_glVertex3hNV, %function -bluegl_glVertex3hNV: - mov __blue_glCore_glVertex3hNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4NusvARB +.type bluegl_glVertexAttrib4NusvARB, %function +bluegl_glVertexAttrib4NusvARB: + mov __blue_glCore_glVertexAttrib4NusvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN -.type bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN, %function -bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN: - mov __blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4bvARB +.type bluegl_glVertexAttrib4bvARB, %function +bluegl_glVertexAttrib4bvARB: + mov __blue_glCore_glVertexAttrib4bvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2i64NV -.type bluegl_glProgramUniform2i64NV, %function -bluegl_glProgramUniform2i64NV: - mov __blue_glCore_glProgramUniform2i64NV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4dARB +.type bluegl_glVertexAttrib4dARB, %function +bluegl_glVertexAttrib4dARB: + mov __blue_glCore_glVertexAttrib4dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBufferData -.type bluegl_glBufferData, %function -bluegl_glBufferData: - mov __blue_glCore_glBufferData@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4dvARB +.type bluegl_glVertexAttrib4dvARB, %function +bluegl_glVertexAttrib4dvARB: + mov __blue_glCore_glVertexAttrib4dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetBufferParameteriv -.type bluegl_glGetBufferParameteriv, %function -bluegl_glGetBufferParameteriv: - mov __blue_glCore_glGetBufferParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4fARB +.type bluegl_glVertexAttrib4fARB, %function +bluegl_glVertexAttrib4fARB: + mov __blue_glCore_glVertexAttrib4fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsAsyncMarkerSGIX -.type bluegl_glIsAsyncMarkerSGIX, %function -bluegl_glIsAsyncMarkerSGIX: - mov __blue_glCore_glIsAsyncMarkerSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4fvARB +.type bluegl_glVertexAttrib4fvARB, %function +bluegl_glVertexAttrib4fvARB: + mov __blue_glCore_glVertexAttrib4fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexImage4DSGIS -.type bluegl_glTexImage4DSGIS, %function -bluegl_glTexImage4DSGIS: - mov __blue_glCore_glTexImage4DSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4ivARB +.type bluegl_glVertexAttrib4ivARB, %function +bluegl_glVertexAttrib4ivARB: + mov __blue_glCore_glVertexAttrib4ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMultiTexEnvivEXT -.type bluegl_glGetMultiTexEnvivEXT, %function -bluegl_glGetMultiTexEnvivEXT: - mov __blue_glCore_glGetMultiTexEnvivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4sARB +.type bluegl_glVertexAttrib4sARB, %function +bluegl_glVertexAttrib4sARB: + mov __blue_glCore_glVertexAttrib4sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetClipPlanexOES -.type bluegl_glGetClipPlanexOES, %function -bluegl_glGetClipPlanexOES: - mov __blue_glCore_glGetClipPlanexOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4svARB +.type bluegl_glVertexAttrib4svARB, %function +bluegl_glVertexAttrib4svARB: + mov __blue_glCore_glVertexAttrib4svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3uiEXT -.type bluegl_glUniform3uiEXT, %function -bluegl_glUniform3uiEXT: - mov __blue_glCore_glUniform3uiEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4ubvARB +.type bluegl_glVertexAttrib4ubvARB, %function +bluegl_glVertexAttrib4ubvARB: + mov __blue_glCore_glVertexAttrib4ubvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3sv -.type bluegl_glMultiTexCoord3sv, %function -bluegl_glMultiTexCoord3sv: - mov __blue_glCore_glMultiTexCoord3sv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4uivARB +.type bluegl_glVertexAttrib4uivARB, %function +bluegl_glVertexAttrib4uivARB: + mov __blue_glCore_glVertexAttrib4uivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribs1hvNV -.type bluegl_glVertexAttribs1hvNV, %function -bluegl_glVertexAttribs1hvNV: - mov __blue_glCore_glVertexAttribs1hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4usvARB +.type bluegl_glVertexAttrib4usvARB, %function +bluegl_glVertexAttrib4usvARB: + mov __blue_glCore_glVertexAttrib4usvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPerfQueryInfoINTEL -.type bluegl_glGetPerfQueryInfoINTEL, %function -bluegl_glGetPerfQueryInfoINTEL: - mov __blue_glCore_glGetPerfQueryInfoINTEL@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribPointerARB +.type bluegl_glVertexAttribPointerARB, %function +bluegl_glVertexAttribPointerARB: + mov __blue_glCore_glVertexAttribPointerARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetClipPlanefOES -.type bluegl_glGetClipPlanefOES, %function -bluegl_glGetClipPlanefOES: - mov __blue_glCore_glGetClipPlanefOES@GOTPCREL(%rip), %r11 +.global bluegl_glEnableVertexAttribArrayARB +.type bluegl_glEnableVertexAttribArrayARB, %function +bluegl_glEnableVertexAttribArrayARB: + mov __blue_glCore_glEnableVertexAttribArrayARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3ubEXT -.type bluegl_glSecondaryColor3ubEXT, %function -bluegl_glSecondaryColor3ubEXT: - mov __blue_glCore_glSecondaryColor3ubEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDisableVertexAttribArrayARB +.type bluegl_glDisableVertexAttribArrayARB, %function +bluegl_glDisableVertexAttribArrayARB: + mov __blue_glCore_glDisableVertexAttribArrayARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSyncTextureINTEL -.type bluegl_glSyncTextureINTEL, %function -bluegl_glSyncTextureINTEL: - mov __blue_glCore_glSyncTextureINTEL@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribdvARB +.type bluegl_glGetVertexAttribdvARB, %function +bluegl_glGetVertexAttribdvARB: + mov __blue_glCore_glGetVertexAttribdvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix3x2dv -.type bluegl_glProgramUniformMatrix3x2dv, %function -bluegl_glProgramUniformMatrix3x2dv: - mov __blue_glCore_glProgramUniformMatrix3x2dv@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribfvARB +.type bluegl_glGetVertexAttribfvARB, %function +bluegl_glGetVertexAttribfvARB: + mov __blue_glCore_glGetVertexAttribfvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix4x2fv -.type bluegl_glUniformMatrix4x2fv, %function -bluegl_glUniformMatrix4x2fv: - mov __blue_glCore_glUniformMatrix4x2fv@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribivARB +.type bluegl_glGetVertexAttribivARB, %function +bluegl_glGetVertexAttribivARB: + mov __blue_glCore_glGetVertexAttribivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureBufferEXT -.type bluegl_glTextureBufferEXT, %function -bluegl_glTextureBufferEXT: - mov __blue_glCore_glTextureBufferEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribPointervARB +.type bluegl_glGetVertexAttribPointervARB, %function +bluegl_glGetVertexAttribPointervARB: + mov __blue_glCore_glGetVertexAttribPointervARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexPointervINTEL -.type bluegl_glVertexPointervINTEL, %function -bluegl_glVertexPointervINTEL: - mov __blue_glCore_glVertexPointervINTEL@GOTPCREL(%rip), %r11 +.global bluegl_glBindAttribLocationARB +.type bluegl_glBindAttribLocationARB, %function +bluegl_glBindAttribLocationARB: + mov __blue_glCore_glBindAttribLocationARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetShaderPrecisionFormat -.type bluegl_glGetShaderPrecisionFormat, %function -bluegl_glGetShaderPrecisionFormat: - mov __blue_glCore_glGetShaderPrecisionFormat@GOTPCREL(%rip), %r11 +.global bluegl_glGetActiveAttribARB +.type bluegl_glGetActiveAttribARB, %function +bluegl_glGetActiveAttribARB: + mov __blue_glCore_glGetActiveAttribARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureImage -.type bluegl_glGetTextureImage, %function -bluegl_glGetTextureImage: - mov __blue_glCore_glGetTextureImage@GOTPCREL(%rip), %r11 +.global bluegl_glGetAttribLocationARB +.type bluegl_glGetAttribLocationARB, %function +bluegl_glGetAttribLocationARB: + mov __blue_glCore_glGetAttribLocationARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3ivARB -.type bluegl_glUniform3ivARB, %function -bluegl_glUniform3ivARB: - mov __blue_glCore_glUniform3ivARB@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2dARB +.type bluegl_glWindowPos2dARB, %function +bluegl_glWindowPos2dARB: + mov __blue_glCore_glWindowPos2dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferParameteri -.type bluegl_glFramebufferParameteri, %function -bluegl_glFramebufferParameteri: - mov __blue_glCore_glFramebufferParameteri@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2dvARB +.type bluegl_glWindowPos2dvARB, %function +bluegl_glWindowPos2dvARB: + mov __blue_glCore_glWindowPos2dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPointParameterxvOES -.type bluegl_glPointParameterxvOES, %function -bluegl_glPointParameterxvOES: - mov __blue_glCore_glPointParameterxvOES@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2fARB +.type bluegl_glWindowPos2fARB, %function +bluegl_glWindowPos2fARB: + mov __blue_glCore_glWindowPos2fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendFunci -.type bluegl_glBlendFunci, %function -bluegl_glBlendFunci: - mov __blue_glCore_glBlendFunci@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2fvARB +.type bluegl_glWindowPos2fvARB, %function +bluegl_glWindowPos2fvARB: + mov __blue_glCore_glWindowPos2fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix2x3dv -.type bluegl_glUniformMatrix2x3dv, %function -bluegl_glUniformMatrix2x3dv: - mov __blue_glCore_glUniformMatrix2x3dv@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2iARB +.type bluegl_glWindowPos2iARB, %function +bluegl_glWindowPos2iARB: + mov __blue_glCore_glWindowPos2iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2i64ARB -.type bluegl_glUniform2i64ARB, %function -bluegl_glUniform2i64ARB: - mov __blue_glCore_glUniform2i64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2ivARB +.type bluegl_glWindowPos2ivARB, %function +bluegl_glWindowPos2ivARB: + mov __blue_glCore_glWindowPos2ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramEnvParameterI4ivNV -.type bluegl_glProgramEnvParameterI4ivNV, %function -bluegl_glProgramEnvParameterI4ivNV: - mov __blue_glCore_glProgramEnvParameterI4ivNV@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2sARB +.type bluegl_glWindowPos2sARB, %function +bluegl_glWindowPos2sARB: + mov __blue_glCore_glWindowPos2sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFragmentLightModelivSGIX -.type bluegl_glFragmentLightModelivSGIX, %function -bluegl_glFragmentLightModelivSGIX: - mov __blue_glCore_glFragmentLightModelivSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2svARB +.type bluegl_glWindowPos2svARB, %function +bluegl_glWindowPos2svARB: + mov __blue_glCore_glWindowPos2svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4ui64vARB -.type bluegl_glProgramUniform4ui64vARB, %function -bluegl_glProgramUniform4ui64vARB: - mov __blue_glCore_glProgramUniform4ui64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3dARB +.type bluegl_glWindowPos3dARB, %function +bluegl_glWindowPos3dARB: + mov __blue_glCore_glWindowPos3dARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix2x3fvEXT -.type bluegl_glProgramUniformMatrix2x3fvEXT, %function -bluegl_glProgramUniformMatrix2x3fvEXT: - mov __blue_glCore_glProgramUniformMatrix2x3fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3dvARB +.type bluegl_glWindowPos3dvARB, %function +bluegl_glWindowPos3dvARB: + mov __blue_glCore_glWindowPos3dvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStencilClearTagEXT -.type bluegl_glStencilClearTagEXT, %function -bluegl_glStencilClearTagEXT: - mov __blue_glCore_glStencilClearTagEXT@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3fARB +.type bluegl_glWindowPos3fARB, %function +bluegl_glWindowPos3fARB: + mov __blue_glCore_glWindowPos3fARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4s -.type bluegl_glMultiTexCoord4s, %function -bluegl_glMultiTexCoord4s: - mov __blue_glCore_glMultiTexCoord4s@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3fvARB +.type bluegl_glWindowPos3fvARB, %function +bluegl_glWindowPos3fvARB: + mov __blue_glCore_glWindowPos3fvARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix4dvEXT -.type bluegl_glProgramUniformMatrix4dvEXT, %function -bluegl_glProgramUniformMatrix4dvEXT: - mov __blue_glCore_glProgramUniformMatrix4dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3iARB +.type bluegl_glWindowPos3iARB, %function +bluegl_glWindowPos3iARB: + mov __blue_glCore_glWindowPos3iARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedBufferParameteri64v -.type bluegl_glGetNamedBufferParameteri64v, %function -bluegl_glGetNamedBufferParameteri64v: - mov __blue_glCore_glGetNamedBufferParameteri64v@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3ivARB +.type bluegl_glWindowPos3ivARB, %function +bluegl_glWindowPos3ivARB: + mov __blue_glCore_glWindowPos3ivARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI3iEXT -.type bluegl_glVertexAttribI3iEXT, %function -bluegl_glVertexAttribI3iEXT: - mov __blue_glCore_glVertexAttribI3iEXT@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3sARB +.type bluegl_glWindowPos3sARB, %function +bluegl_glWindowPos3sARB: + mov __blue_glCore_glWindowPos3sARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeuivSUN -.type bluegl_glReplacementCodeuivSUN, %function -bluegl_glReplacementCodeuivSUN: - mov __blue_glCore_glReplacementCodeuivSUN@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3svARB +.type bluegl_glWindowPos3svARB, %function +bluegl_glWindowPos3svARB: + mov __blue_glCore_glWindowPos3svARB@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFragmentLightModeliSGIX -.type bluegl_glFragmentLightModeliSGIX, %function -bluegl_glFragmentLightModeliSGIX: - mov __blue_glCore_glFragmentLightModeliSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glBlendBarrierKHR +.type bluegl_glBlendBarrierKHR, %function +bluegl_glBlendBarrierKHR: + mov __blue_glCore_glBlendBarrierKHR@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2i64vNV -.type bluegl_glUniform2i64vNV, %function -bluegl_glUniform2i64vNV: - mov __blue_glCore_glUniform2i64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1bOES +.type bluegl_glMultiTexCoord1bOES, %function +bluegl_glMultiTexCoord1bOES: + mov __blue_glCore_glMultiTexCoord1bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPointParameterivNV -.type bluegl_glPointParameterivNV, %function -bluegl_glPointParameterivNV: - mov __blue_glCore_glPointParameterivNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1bvOES +.type bluegl_glMultiTexCoord1bvOES, %function +bluegl_glMultiTexCoord1bvOES: + mov __blue_glCore_glMultiTexCoord1bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStencilStrokePathInstancedNV -.type bluegl_glStencilStrokePathInstancedNV, %function -bluegl_glStencilStrokePathInstancedNV: - mov __blue_glCore_glStencilStrokePathInstancedNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2bOES +.type bluegl_glMultiTexCoord2bOES, %function +bluegl_glMultiTexCoord2bOES: + mov __blue_glCore_glMultiTexCoord2bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glInsertComponentEXT -.type bluegl_glInsertComponentEXT, %function -bluegl_glInsertComponentEXT: - mov __blue_glCore_glInsertComponentEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2bvOES +.type bluegl_glMultiTexCoord2bvOES, %function +bluegl_glMultiTexCoord2bvOES: + mov __blue_glCore_glMultiTexCoord2bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsEnabled -.type bluegl_glIsEnabled, %function -bluegl_glIsEnabled: - mov __blue_glCore_glIsEnabled@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3bOES +.type bluegl_glMultiTexCoord3bOES, %function +bluegl_glMultiTexCoord3bOES: + mov __blue_glCore_glMultiTexCoord3bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3dMESA -.type bluegl_glWindowPos3dMESA, %function -bluegl_glWindowPos3dMESA: - mov __blue_glCore_glWindowPos3dMESA@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3bvOES +.type bluegl_glMultiTexCoord3bvOES, %function +bluegl_glMultiTexCoord3bvOES: + mov __blue_glCore_glMultiTexCoord3bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnCompressedTexImage -.type bluegl_glGetnCompressedTexImage, %function -bluegl_glGetnCompressedTexImage: - mov __blue_glCore_glGetnCompressedTexImage@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4bOES +.type bluegl_glMultiTexCoord4bOES, %function +bluegl_glMultiTexCoord4bOES: + mov __blue_glCore_glMultiTexCoord4bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyMultiTexSubImage2DEXT -.type bluegl_glCopyMultiTexSubImage2DEXT, %function -bluegl_glCopyMultiTexSubImage2DEXT: - mov __blue_glCore_glCopyMultiTexSubImage2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4bvOES +.type bluegl_glMultiTexCoord4bvOES, %function +bluegl_glMultiTexCoord4bvOES: + mov __blue_glCore_glMultiTexCoord4bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDisableIndexedEXT -.type bluegl_glDisableIndexedEXT, %function -bluegl_glDisableIndexedEXT: - mov __blue_glCore_glDisableIndexedEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord1bOES +.type bluegl_glTexCoord1bOES, %function +bluegl_glTexCoord1bOES: + mov __blue_glCore_glTexCoord1bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2dv -.type bluegl_glWindowPos2dv, %function -bluegl_glWindowPos2dv: - mov __blue_glCore_glWindowPos2dv@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord1bvOES +.type bluegl_glTexCoord1bvOES, %function +bluegl_glTexCoord1bvOES: + mov __blue_glCore_glTexCoord1bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glAlphaFuncxOES -.type bluegl_glAlphaFuncxOES, %function -bluegl_glAlphaFuncxOES: - mov __blue_glCore_glAlphaFuncxOES@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord2bOES +.type bluegl_glTexCoord2bOES, %function +bluegl_glTexCoord2bOES: + mov __blue_glCore_glTexCoord2bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreateFramebuffers -.type bluegl_glCreateFramebuffers, %function -bluegl_glCreateFramebuffers: - mov __blue_glCore_glCreateFramebuffers@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord2bvOES +.type bluegl_glTexCoord2bvOES, %function +bluegl_glTexCoord2bvOES: + mov __blue_glCore_glTexCoord2bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetAttribLocationARB -.type bluegl_glGetAttribLocationARB, %function -bluegl_glGetAttribLocationARB: - mov __blue_glCore_glGetAttribLocationARB@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord3bOES +.type bluegl_glTexCoord3bOES, %function +bluegl_glTexCoord3bOES: + mov __blue_glCore_glTexCoord3bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1sARB -.type bluegl_glVertexAttrib1sARB, %function -bluegl_glVertexAttrib1sARB: - mov __blue_glCore_glVertexAttrib1sARB@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord3bvOES +.type bluegl_glTexCoord3bvOES, %function +bluegl_glTexCoord3bvOES: + mov __blue_glCore_glTexCoord3bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexBumpParameterfvATI -.type bluegl_glTexBumpParameterfvATI, %function -bluegl_glTexBumpParameterfvATI: - mov __blue_glCore_glTexBumpParameterfvATI@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord4bOES +.type bluegl_glTexCoord4bOES, %function +bluegl_glTexCoord4bOES: + mov __blue_glCore_glTexCoord4bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetActiveSubroutineUniformiv -.type bluegl_glGetActiveSubroutineUniformiv, %function -bluegl_glGetActiveSubroutineUniformiv: - mov __blue_glCore_glGetActiveSubroutineUniformiv@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord4bvOES +.type bluegl_glTexCoord4bvOES, %function +bluegl_glTexCoord4bvOES: + mov __blue_glCore_glTexCoord4bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib2fARB -.type bluegl_glVertexAttrib2fARB, %function -bluegl_glVertexAttrib2fARB: - mov __blue_glCore_glVertexAttrib2fARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertex2bOES +.type bluegl_glVertex2bOES, %function +bluegl_glVertex2bOES: + mov __blue_glCore_glVertex2bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTransformFeedbacki64_v -.type bluegl_glGetTransformFeedbacki64_v, %function -bluegl_glGetTransformFeedbacki64_v: - mov __blue_glCore_glGetTransformFeedbacki64_v@GOTPCREL(%rip), %r11 +.global bluegl_glVertex2bvOES +.type bluegl_glVertex2bvOES, %function +bluegl_glVertex2bvOES: + mov __blue_glCore_glVertex2bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4hvNV -.type bluegl_glMultiTexCoord4hvNV, %function -bluegl_glMultiTexCoord4hvNV: - mov __blue_glCore_glMultiTexCoord4hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertex3bOES +.type bluegl_glVertex3bOES, %function +bluegl_glVertex3bOES: + mov __blue_glCore_glVertex3bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendColorEXT -.type bluegl_glBlendColorEXT, %function -bluegl_glBlendColorEXT: - mov __blue_glCore_glBlendColorEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertex3bvOES +.type bluegl_glVertex3bvOES, %function +bluegl_glVertex3bvOES: + mov __blue_glCore_glVertex3bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTexSubImage3D -.type bluegl_glCompressedTexSubImage3D, %function -bluegl_glCompressedTexSubImage3D: - mov __blue_glCore_glCompressedTexSubImage3D@GOTPCREL(%rip), %r11 +.global bluegl_glVertex4bOES +.type bluegl_glVertex4bOES, %function +bluegl_glVertex4bOES: + mov __blue_glCore_glVertex4bOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream4dvATI -.type bluegl_glVertexStream4dvATI, %function -bluegl_glVertexStream4dvATI: - mov __blue_glCore_glVertexStream4dvATI@GOTPCREL(%rip), %r11 +.global bluegl_glVertex4bvOES +.type bluegl_glVertex4bvOES, %function +bluegl_glVertex4bvOES: + mov __blue_glCore_glVertex4bvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMaxShaderCompilerThreadsARB -.type bluegl_glMaxShaderCompilerThreadsARB, %function -bluegl_glMaxShaderCompilerThreadsARB: - mov __blue_glCore_glMaxShaderCompilerThreadsARB@GOTPCREL(%rip), %r11 +.global bluegl_glAlphaFuncxOES +.type bluegl_glAlphaFuncxOES, %function +bluegl_glAlphaFuncxOES: + mov __blue_glCore_glAlphaFuncxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGlobalAlphaFactorbSUN -.type bluegl_glGlobalAlphaFactorbSUN, %function -bluegl_glGlobalAlphaFactorbSUN: - mov __blue_glCore_glGlobalAlphaFactorbSUN@GOTPCREL(%rip), %r11 +.global bluegl_glClearColorxOES +.type bluegl_glClearColorxOES, %function +bluegl_glClearColorxOES: + mov __blue_glCore_glClearColorxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGlobalAlphaFactoruiSUN -.type bluegl_glGlobalAlphaFactoruiSUN, %function -bluegl_glGlobalAlphaFactoruiSUN: - mov __blue_glCore_glGlobalAlphaFactoruiSUN@GOTPCREL(%rip), %r11 +.global bluegl_glClearDepthxOES +.type bluegl_glClearDepthxOES, %function +bluegl_glClearDepthxOES: + mov __blue_glCore_glClearDepthxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClientActiveTextureARB -.type bluegl_glClientActiveTextureARB, %function -bluegl_glClientActiveTextureARB: - mov __blue_glCore_glClientActiveTextureARB@GOTPCREL(%rip), %r11 +.global bluegl_glClipPlanexOES +.type bluegl_glClipPlanexOES, %function +bluegl_glClipPlanexOES: + mov __blue_glCore_glClipPlanexOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenProgramsARB -.type bluegl_glGenProgramsARB, %function -bluegl_glGenProgramsARB: - mov __blue_glCore_glGenProgramsARB@GOTPCREL(%rip), %r11 +.global bluegl_glColor4xOES +.type bluegl_glColor4xOES, %function +bluegl_glColor4xOES: + mov __blue_glCore_glColor4xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTexParameterPointervAPPLE -.type bluegl_glGetTexParameterPointervAPPLE, %function -bluegl_glGetTexParameterPointervAPPLE: - mov __blue_glCore_glGetTexParameterPointervAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glDepthRangexOES +.type bluegl_glDepthRangexOES, %function +bluegl_glDepthRangexOES: + mov __blue_glCore_glDepthRangexOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetBooleanv -.type bluegl_glGetBooleanv, %function -bluegl_glGetBooleanv: - mov __blue_glCore_glGetBooleanv@GOTPCREL(%rip), %r11 +.global bluegl_glFogxOES +.type bluegl_glFogxOES, %function +bluegl_glFogxOES: + mov __blue_glCore_glFogxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawElementsBaseVertex -.type bluegl_glDrawElementsBaseVertex, %function -bluegl_glDrawElementsBaseVertex: - mov __blue_glCore_glDrawElementsBaseVertex@GOTPCREL(%rip), %r11 +.global bluegl_glFogxvOES +.type bluegl_glFogxvOES, %function +bluegl_glFogxvOES: + mov __blue_glCore_glFogxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL4ui64vNV -.type bluegl_glVertexAttribL4ui64vNV, %function -bluegl_glVertexAttribL4ui64vNV: - mov __blue_glCore_glVertexAttribL4ui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glFrustumxOES +.type bluegl_glFrustumxOES, %function +bluegl_glFrustumxOES: + mov __blue_glCore_glFrustumxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3fvEXT -.type bluegl_glSecondaryColor3fvEXT, %function -bluegl_glSecondaryColor3fvEXT: - mov __blue_glCore_glSecondaryColor3fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetClipPlanexOES +.type bluegl_glGetClipPlanexOES, %function +bluegl_glGetClipPlanexOES: + mov __blue_glCore_glGetClipPlanexOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1s -.type bluegl_glMultiTexCoord1s, %function -bluegl_glMultiTexCoord1s: - mov __blue_glCore_glMultiTexCoord1s@GOTPCREL(%rip), %r11 +.global bluegl_glGetFixedvOES +.type bluegl_glGetFixedvOES, %function +bluegl_glGetFixedvOES: + mov __blue_glCore_glGetFixedvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteProgramsARB -.type bluegl_glDeleteProgramsARB, %function -bluegl_glDeleteProgramsARB: - mov __blue_glCore_glDeleteProgramsARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetTexEnvxvOES +.type bluegl_glGetTexEnvxvOES, %function +bluegl_glGetTexEnvxvOES: + mov __blue_glCore_glGetTexEnvxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawElementsInstancedBaseVertex -.type bluegl_glDrawElementsInstancedBaseVertex, %function -bluegl_glDrawElementsInstancedBaseVertex: - mov __blue_glCore_glDrawElementsInstancedBaseVertex@GOTPCREL(%rip), %r11 +.global bluegl_glGetTexParameterxvOES +.type bluegl_glGetTexParameterxvOES, %function +bluegl_glGetTexParameterxvOES: + mov __blue_glCore_glGetTexParameterxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4dEXT -.type bluegl_glProgramUniform4dEXT, %function -bluegl_glProgramUniform4dEXT: - mov __blue_glCore_glProgramUniform4dEXT@GOTPCREL(%rip), %r11 +.global bluegl_glLightModelxOES +.type bluegl_glLightModelxOES, %function +bluegl_glLightModelxOES: + mov __blue_glCore_glLightModelxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPathMetricRangeNV -.type bluegl_glGetPathMetricRangeNV, %function -bluegl_glGetPathMetricRangeNV: - mov __blue_glCore_glGetPathMetricRangeNV@GOTPCREL(%rip), %r11 +.global bluegl_glLightModelxvOES +.type bluegl_glLightModelxvOES, %function +bluegl_glLightModelxvOES: + mov __blue_glCore_glLightModelxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3iEXT -.type bluegl_glProgramUniform3iEXT, %function -bluegl_glProgramUniform3iEXT: - mov __blue_glCore_glProgramUniform3iEXT@GOTPCREL(%rip), %r11 +.global bluegl_glLightxOES +.type bluegl_glLightxOES, %function +bluegl_glLightxOES: + mov __blue_glCore_glLightxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteBuffers -.type bluegl_glDeleteBuffers, %function -bluegl_glDeleteBuffers: - mov __blue_glCore_glDeleteBuffers@GOTPCREL(%rip), %r11 +.global bluegl_glLightxvOES +.type bluegl_glLightxvOES, %function +bluegl_glLightxvOES: + mov __blue_glCore_glLightxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3usEXT -.type bluegl_glSecondaryColor3usEXT, %function -bluegl_glSecondaryColor3usEXT: - mov __blue_glCore_glSecondaryColor3usEXT@GOTPCREL(%rip), %r11 +.global bluegl_glLineWidthxOES +.type bluegl_glLineWidthxOES, %function +bluegl_glLineWidthxOES: + mov __blue_glCore_glLineWidthxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDepthMask -.type bluegl_glDepthMask, %function -bluegl_glDepthMask: - mov __blue_glCore_glDepthMask@GOTPCREL(%rip), %r11 +.global bluegl_glLoadMatrixxOES +.type bluegl_glLoadMatrixxOES, %function +bluegl_glLoadMatrixxOES: + mov __blue_glCore_glLoadMatrixxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2dv -.type bluegl_glMultiTexCoord2dv, %function -bluegl_glMultiTexCoord2dv: - mov __blue_glCore_glMultiTexCoord2dv@GOTPCREL(%rip), %r11 +.global bluegl_glMaterialxOES +.type bluegl_glMaterialxOES, %function +bluegl_glMaterialxOES: + mov __blue_glCore_glMaterialxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyConvolutionFilter2DEXT -.type bluegl_glCopyConvolutionFilter2DEXT, %function -bluegl_glCopyConvolutionFilter2DEXT: - mov __blue_glCore_glCopyConvolutionFilter2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMaterialxvOES +.type bluegl_glMaterialxvOES, %function +bluegl_glMaterialxvOES: + mov __blue_glCore_glMaterialxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLoadTransposeMatrixxOES -.type bluegl_glLoadTransposeMatrixxOES, %function -bluegl_glLoadTransposeMatrixxOES: - mov __blue_glCore_glLoadTransposeMatrixxOES@GOTPCREL(%rip), %r11 +.global bluegl_glMultMatrixxOES +.type bluegl_glMultMatrixxOES, %function +bluegl_glMultMatrixxOES: + mov __blue_glCore_glMultMatrixxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPixelStoref -.type bluegl_glPixelStoref, %function -bluegl_glPixelStoref: - mov __blue_glCore_glPixelStoref@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4xOES +.type bluegl_glMultiTexCoord4xOES, %function +bluegl_glMultiTexCoord4xOES: + mov __blue_glCore_glMultiTexCoord4xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStencilOpSeparateATI -.type bluegl_glStencilOpSeparateATI, %function -bluegl_glStencilOpSeparateATI: - mov __blue_glCore_glStencilOpSeparateATI@GOTPCREL(%rip), %r11 +.global bluegl_glNormal3xOES +.type bluegl_glNormal3xOES, %function +bluegl_glNormal3xOES: + mov __blue_glCore_glNormal3xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyTextureSubImage1DEXT -.type bluegl_glCopyTextureSubImage1DEXT, %function -bluegl_glCopyTextureSubImage1DEXT: - mov __blue_glCore_glCopyTextureSubImage1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glOrthoxOES +.type bluegl_glOrthoxOES, %function +bluegl_glOrthoxOES: + mov __blue_glCore_glOrthoxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixScaledEXT -.type bluegl_glMatrixScaledEXT, %function -bluegl_glMatrixScaledEXT: - mov __blue_glCore_glMatrixScaledEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPointParameterxvOES +.type bluegl_glPointParameterxvOES, %function +bluegl_glPointParameterxvOES: + mov __blue_glCore_glPointParameterxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2i64ARB -.type bluegl_glProgramUniform2i64ARB, %function -bluegl_glProgramUniform2i64ARB: - mov __blue_glCore_glProgramUniform2i64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glPointSizexOES +.type bluegl_glPointSizexOES, %function +bluegl_glPointSizexOES: + mov __blue_glCore_glPointSizexOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureParameterfEXT -.type bluegl_glTextureParameterfEXT, %function -bluegl_glTextureParameterfEXT: - mov __blue_glCore_glTextureParameterfEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPolygonOffsetxOES +.type bluegl_glPolygonOffsetxOES, %function +bluegl_glPolygonOffsetxOES: + mov __blue_glCore_glPolygonOffsetxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramLocalParameterIivNV -.type bluegl_glGetProgramLocalParameterIivNV, %function -bluegl_glGetProgramLocalParameterIivNV: - mov __blue_glCore_glGetProgramLocalParameterIivNV@GOTPCREL(%rip), %r11 +.global bluegl_glRotatexOES +.type bluegl_glRotatexOES, %function +bluegl_glRotatexOES: + mov __blue_glCore_glRotatexOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetShaderInfoLog -.type bluegl_glGetShaderInfoLog, %function -bluegl_glGetShaderInfoLog: - mov __blue_glCore_glGetShaderInfoLog@GOTPCREL(%rip), %r11 +.global bluegl_glScalexOES +.type bluegl_glScalexOES, %function +bluegl_glScalexOES: + mov __blue_glCore_glScalexOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoordP2uiv -.type bluegl_glTexCoordP2uiv, %function -bluegl_glTexCoordP2uiv: - mov __blue_glCore_glTexCoordP2uiv@GOTPCREL(%rip), %r11 +.global bluegl_glTexEnvxOES +.type bluegl_glTexEnvxOES, %function +bluegl_glTexEnvxOES: + mov __blue_glCore_glTexEnvxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDebugMessageCallback -.type bluegl_glDebugMessageCallback, %function -bluegl_glDebugMessageCallback: - mov __blue_glCore_glDebugMessageCallback@GOTPCREL(%rip), %r11 +.global bluegl_glTexEnvxvOES +.type bluegl_glTexEnvxvOES, %function +bluegl_glTexEnvxvOES: + mov __blue_glCore_glTexEnvxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLoadTransposeMatrixfARB -.type bluegl_glLoadTransposeMatrixfARB, %function -bluegl_glLoadTransposeMatrixfARB: - mov __blue_glCore_glLoadTransposeMatrixfARB@GOTPCREL(%rip), %r11 +.global bluegl_glTexParameterxOES +.type bluegl_glTexParameterxOES, %function +bluegl_glTexParameterxOES: + mov __blue_glCore_glTexParameterxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1ui -.type bluegl_glUniform1ui, %function -bluegl_glUniform1ui: - mov __blue_glCore_glUniform1ui@GOTPCREL(%rip), %r11 +.global bluegl_glTexParameterxvOES +.type bluegl_glTexParameterxvOES, %function +bluegl_glTexParameterxvOES: + mov __blue_glCore_glTexParameterxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL4dvEXT -.type bluegl_glVertexAttribL4dvEXT, %function -bluegl_glVertexAttribL4dvEXT: - mov __blue_glCore_glVertexAttribL4dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTranslatexOES +.type bluegl_glTranslatexOES, %function +bluegl_glTranslatexOES: + mov __blue_glCore_glTranslatexOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertex3bvOES -.type bluegl_glVertex3bvOES, %function -bluegl_glVertex3bvOES: - mov __blue_glCore_glVertex3bvOES@GOTPCREL(%rip), %r11 +.global bluegl_glAccumxOES +.type bluegl_glAccumxOES, %function +bluegl_glAccumxOES: + mov __blue_glCore_glAccumxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPassThroughxOES -.type bluegl_glPassThroughxOES, %function -bluegl_glPassThroughxOES: - mov __blue_glCore_glPassThroughxOES@GOTPCREL(%rip), %r11 +.global bluegl_glBitmapxOES +.type bluegl_glBitmapxOES, %function +bluegl_glBitmapxOES: + mov __blue_glCore_glBitmapxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFloatIndexedvEXT -.type bluegl_glGetFloatIndexedvEXT, %function -bluegl_glGetFloatIndexedvEXT: - mov __blue_glCore_glGetFloatIndexedvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBlendColorxOES +.type bluegl_glBlendColorxOES, %function +bluegl_glBlendColorxOES: + mov __blue_glCore_glBlendColorxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSubpixelPrecisionBiasNV -.type bluegl_glSubpixelPrecisionBiasNV, %function -bluegl_glSubpixelPrecisionBiasNV: - mov __blue_glCore_glSubpixelPrecisionBiasNV@GOTPCREL(%rip), %r11 +.global bluegl_glClearAccumxOES +.type bluegl_glClearAccumxOES, %function +bluegl_glClearAccumxOES: + mov __blue_glCore_glClearAccumxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFinishFenceNV -.type bluegl_glFinishFenceNV, %function -bluegl_glFinishFenceNV: - mov __blue_glCore_glFinishFenceNV@GOTPCREL(%rip), %r11 +.global bluegl_glColor3xOES +.type bluegl_glColor3xOES, %function +bluegl_glColor3xOES: + mov __blue_glCore_glColor3xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramBinary -.type bluegl_glGetProgramBinary, %function -bluegl_glGetProgramBinary: - mov __blue_glCore_glGetProgramBinary@GOTPCREL(%rip), %r11 +.global bluegl_glColor3xvOES +.type bluegl_glColor3xvOES, %function +bluegl_glColor3xvOES: + mov __blue_glCore_glColor3xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendFuncSeparateIndexedAMD -.type bluegl_glBlendFuncSeparateIndexedAMD, %function -bluegl_glBlendFuncSeparateIndexedAMD: - mov __blue_glCore_glBlendFuncSeparateIndexedAMD@GOTPCREL(%rip), %r11 +.global bluegl_glColor4xvOES +.type bluegl_glColor4xvOES, %function +bluegl_glColor4xvOES: + mov __blue_glCore_glColor4xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendFuncSeparate -.type bluegl_glBlendFuncSeparate, %function -bluegl_glBlendFuncSeparate: - mov __blue_glCore_glBlendFuncSeparate@GOTPCREL(%rip), %r11 +.global bluegl_glConvolutionParameterxOES +.type bluegl_glConvolutionParameterxOES, %function +bluegl_glConvolutionParameterxOES: + mov __blue_glCore_glConvolutionParameterxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIndexxvOES -.type bluegl_glIndexxvOES, %function -bluegl_glIndexxvOES: - mov __blue_glCore_glIndexxvOES@GOTPCREL(%rip), %r11 +.global bluegl_glConvolutionParameterxvOES +.type bluegl_glConvolutionParameterxvOES, %function +bluegl_glConvolutionParameterxvOES: + mov __blue_glCore_glConvolutionParameterxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4NuivARB -.type bluegl_glVertexAttrib4NuivARB, %function -bluegl_glVertexAttrib4NuivARB: - mov __blue_glCore_glVertexAttrib4NuivARB@GOTPCREL(%rip), %r11 +.global bluegl_glEvalCoord1xOES +.type bluegl_glEvalCoord1xOES, %function +bluegl_glEvalCoord1xOES: + mov __blue_glCore_glEvalCoord1xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2ui64ARB -.type bluegl_glUniform2ui64ARB, %function -bluegl_glUniform2ui64ARB: - mov __blue_glCore_glUniform2ui64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glEvalCoord1xvOES +.type bluegl_glEvalCoord1xvOES, %function +bluegl_glEvalCoord1xvOES: + mov __blue_glCore_glEvalCoord1xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEndPerfMonitorAMD -.type bluegl_glEndPerfMonitorAMD, %function -bluegl_glEndPerfMonitorAMD: - mov __blue_glCore_glEndPerfMonitorAMD@GOTPCREL(%rip), %r11 +.global bluegl_glEvalCoord2xOES +.type bluegl_glEvalCoord2xOES, %function +bluegl_glEvalCoord2xOES: + mov __blue_glCore_glEvalCoord2xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReleaseShaderCompiler -.type bluegl_glReleaseShaderCompiler, %function -bluegl_glReleaseShaderCompiler: - mov __blue_glCore_glReleaseShaderCompiler@GOTPCREL(%rip), %r11 +.global bluegl_glEvalCoord2xvOES +.type bluegl_glEvalCoord2xvOES, %function +bluegl_glEvalCoord2xvOES: + mov __blue_glCore_glEvalCoord2xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenFramebuffersEXT -.type bluegl_glGenFramebuffersEXT, %function -bluegl_glGenFramebuffersEXT: - mov __blue_glCore_glGenFramebuffersEXT@GOTPCREL(%rip), %r11 +.global bluegl_glFeedbackBufferxOES +.type bluegl_glFeedbackBufferxOES, %function +bluegl_glFeedbackBufferxOES: + mov __blue_glCore_glFeedbackBufferxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2uiv -.type bluegl_glUniform2uiv, %function -bluegl_glUniform2uiv: - mov __blue_glCore_glUniform2uiv@GOTPCREL(%rip), %r11 +.global bluegl_glGetConvolutionParameterxvOES +.type bluegl_glGetConvolutionParameterxvOES, %function +bluegl_glGetConvolutionParameterxvOES: + mov __blue_glCore_glGetConvolutionParameterxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenSymbolsEXT -.type bluegl_glGenSymbolsEXT, %function -bluegl_glGenSymbolsEXT: - mov __blue_glCore_glGenSymbolsEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetHistogramParameterxvOES +.type bluegl_glGetHistogramParameterxvOES, %function +bluegl_glGetHistogramParameterxvOES: + mov __blue_glCore_glGetHistogramParameterxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribIPointer -.type bluegl_glVertexAttribIPointer, %function -bluegl_glVertexAttribIPointer: - mov __blue_glCore_glVertexAttribIPointer@GOTPCREL(%rip), %r11 +.global bluegl_glGetLightxOES +.type bluegl_glGetLightxOES, %function +bluegl_glGetLightxOES: + mov __blue_glCore_glGetLightxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix3x4fv -.type bluegl_glUniformMatrix3x4fv, %function -bluegl_glUniformMatrix3x4fv: - mov __blue_glCore_glUniformMatrix3x4fv@GOTPCREL(%rip), %r11 +.global bluegl_glGetMapxvOES +.type bluegl_glGetMapxvOES, %function +bluegl_glGetMapxvOES: + mov __blue_glCore_glGetMapxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord3bOES -.type bluegl_glTexCoord3bOES, %function -bluegl_glTexCoord3bOES: - mov __blue_glCore_glTexCoord3bOES@GOTPCREL(%rip), %r11 +.global bluegl_glGetMaterialxOES +.type bluegl_glGetMaterialxOES, %function +bluegl_glGetMaterialxOES: + mov __blue_glCore_glGetMaterialxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVDPAUUnmapSurfacesNV -.type bluegl_glVDPAUUnmapSurfacesNV, %function -bluegl_glVDPAUUnmapSurfacesNV: - mov __blue_glCore_glVDPAUUnmapSurfacesNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetPixelMapxv +.type bluegl_glGetPixelMapxv, %function +bluegl_glGetPixelMapxv: + mov __blue_glCore_glGetPixelMapxv@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4ui64NV -.type bluegl_glProgramUniform4ui64NV, %function -bluegl_glProgramUniform4ui64NV: - mov __blue_glCore_glProgramUniform4ui64NV@GOTPCREL(%rip), %r11 +.global bluegl_glGetTexGenxvOES +.type bluegl_glGetTexGenxvOES, %function +bluegl_glGetTexGenxvOES: + mov __blue_glCore_glGetTexGenxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformHandleui64NV -.type bluegl_glUniformHandleui64NV, %function -bluegl_glUniformHandleui64NV: - mov __blue_glCore_glUniformHandleui64NV@GOTPCREL(%rip), %r11 +.global bluegl_glGetTexLevelParameterxvOES +.type bluegl_glGetTexLevelParameterxvOES, %function +bluegl_glGetTexLevelParameterxvOES: + mov __blue_glCore_glGetTexLevelParameterxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetStageIndexNV -.type bluegl_glGetStageIndexNV, %function -bluegl_glGetStageIndexNV: - mov __blue_glCore_glGetStageIndexNV@GOTPCREL(%rip), %r11 +.global bluegl_glIndexxOES +.type bluegl_glIndexxOES, %function +bluegl_glIndexxOES: + mov __blue_glCore_glIndexxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3fvARB -.type bluegl_glMultiTexCoord3fvARB, %function -bluegl_glMultiTexCoord3fvARB: - mov __blue_glCore_glMultiTexCoord3fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glIndexxvOES +.type bluegl_glIndexxvOES, %function +bluegl_glIndexxvOES: + mov __blue_glCore_glIndexxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindBufferOffsetEXT -.type bluegl_glBindBufferOffsetEXT, %function -bluegl_glBindBufferOffsetEXT: - mov __blue_glCore_glBindBufferOffsetEXT@GOTPCREL(%rip), %r11 +.global bluegl_glLoadTransposeMatrixxOES +.type bluegl_glLoadTransposeMatrixxOES, %function +bluegl_glLoadTransposeMatrixxOES: + mov __blue_glCore_glLoadTransposeMatrixxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL4dv -.type bluegl_glVertexAttribL4dv, %function -bluegl_glVertexAttribL4dv: - mov __blue_glCore_glVertexAttribL4dv@GOTPCREL(%rip), %r11 +.global bluegl_glMap1xOES +.type bluegl_glMap1xOES, %function +bluegl_glMap1xOES: + mov __blue_glCore_glMap1xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearStencil -.type bluegl_glClearStencil, %function -bluegl_glClearStencil: - mov __blue_glCore_glClearStencil@GOTPCREL(%rip), %r11 +.global bluegl_glMap2xOES +.type bluegl_glMap2xOES, %function +bluegl_glMap2xOES: + mov __blue_glCore_glMap2xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2ivMESA -.type bluegl_glWindowPos2ivMESA, %function -bluegl_glWindowPos2ivMESA: - mov __blue_glCore_glWindowPos2ivMESA@GOTPCREL(%rip), %r11 +.global bluegl_glMapGrid1xOES +.type bluegl_glMapGrid1xOES, %function +bluegl_glMapGrid1xOES: + mov __blue_glCore_glMapGrid1xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeubvSUN -.type bluegl_glReplacementCodeubvSUN, %function -bluegl_glReplacementCodeubvSUN: - mov __blue_glCore_glReplacementCodeubvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glMapGrid2xOES +.type bluegl_glMapGrid2xOES, %function +bluegl_glMapGrid2xOES: + mov __blue_glCore_glMapGrid2xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClipPlanefOES -.type bluegl_glClipPlanefOES, %function -bluegl_glClipPlanefOES: - mov __blue_glCore_glClipPlanefOES@GOTPCREL(%rip), %r11 +.global bluegl_glMultTransposeMatrixxOES +.type bluegl_glMultTransposeMatrixxOES, %function +bluegl_glMultTransposeMatrixxOES: + mov __blue_glCore_glMultTransposeMatrixxOES@GOTPCREL(%rip), %r11 jmp *(%r11) .global bluegl_glMultiTexCoord1xOES @@ -7285,1576 +7236,1570 @@ bluegl_glMultiTexCoord1xOES: mov __blue_glCore_glMultiTexCoord1xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramInfoLog -.type bluegl_glGetProgramInfoLog, %function -bluegl_glGetProgramInfoLog: - mov __blue_glCore_glGetProgramInfoLog@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glEndFragmentShaderATI -.type bluegl_glEndFragmentShaderATI, %function -bluegl_glEndFragmentShaderATI: - mov __blue_glCore_glEndFragmentShaderATI@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glGetTransformFeedbackVaryingNV -.type bluegl_glGetTransformFeedbackVaryingNV, %function -bluegl_glGetTransformFeedbackVaryingNV: - mov __blue_glCore_glGetTransformFeedbackVaryingNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1xvOES +.type bluegl_glMultiTexCoord1xvOES, %function +bluegl_glMultiTexCoord1xvOES: + mov __blue_glCore_glMultiTexCoord1xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix4x2dv -.type bluegl_glProgramUniformMatrix4x2dv, %function -bluegl_glProgramUniformMatrix4x2dv: - mov __blue_glCore_glProgramUniformMatrix4x2dv@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2xOES +.type bluegl_glMultiTexCoord2xOES, %function +bluegl_glMultiTexCoord2xOES: + mov __blue_glCore_glMultiTexCoord2xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glResetHistogramEXT -.type bluegl_glResetHistogramEXT, %function -bluegl_glResetHistogramEXT: - mov __blue_glCore_glResetHistogramEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2xvOES +.type bluegl_glMultiTexCoord2xvOES, %function +bluegl_glMultiTexCoord2xvOES: + mov __blue_glCore_glMultiTexCoord2xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1i64vNV -.type bluegl_glUniform1i64vNV, %function -bluegl_glUniform1i64vNV: - mov __blue_glCore_glUniform1i64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3xOES +.type bluegl_glMultiTexCoord3xOES, %function +bluegl_glMultiTexCoord3xOES: + mov __blue_glCore_glMultiTexCoord3xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramEnvParameter4dARB -.type bluegl_glProgramEnvParameter4dARB, %function -bluegl_glProgramEnvParameter4dARB: - mov __blue_glCore_glProgramEnvParameter4dARB@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3xvOES +.type bluegl_glMultiTexCoord3xvOES, %function +bluegl_glMultiTexCoord3xvOES: + mov __blue_glCore_glMultiTexCoord3xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyTextureSubImage2DEXT -.type bluegl_glCopyTextureSubImage2DEXT, %function -bluegl_glCopyTextureSubImage2DEXT: - mov __blue_glCore_glCopyTextureSubImage2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4xvOES +.type bluegl_glMultiTexCoord4xvOES, %function +bluegl_glMultiTexCoord4xvOES: + mov __blue_glCore_glMultiTexCoord4xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetCombinerInputParameterivNV -.type bluegl_glGetCombinerInputParameterivNV, %function -bluegl_glGetCombinerInputParameterivNV: - mov __blue_glCore_glGetCombinerInputParameterivNV@GOTPCREL(%rip), %r11 +.global bluegl_glNormal3xvOES +.type bluegl_glNormal3xvOES, %function +bluegl_glNormal3xvOES: + mov __blue_glCore_glNormal3xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix4fv -.type bluegl_glUniformMatrix4fv, %function -bluegl_glUniformMatrix4fv: - mov __blue_glCore_glUniformMatrix4fv@GOTPCREL(%rip), %r11 +.global bluegl_glPassThroughxOES +.type bluegl_glPassThroughxOES, %function +bluegl_glPassThroughxOES: + mov __blue_glCore_glPassThroughxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenQueriesARB -.type bluegl_glGenQueriesARB, %function -bluegl_glGenQueriesARB: - mov __blue_glCore_glGenQueriesARB@GOTPCREL(%rip), %r11 +.global bluegl_glPixelMapx +.type bluegl_glPixelMapx, %function +bluegl_glPixelMapx: + mov __blue_glCore_glPixelMapx@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnSeparableFilter -.type bluegl_glGetnSeparableFilter, %function -bluegl_glGetnSeparableFilter: - mov __blue_glCore_glGetnSeparableFilter@GOTPCREL(%rip), %r11 +.global bluegl_glPixelStorex +.type bluegl_glPixelStorex, %function +bluegl_glPixelStorex: + mov __blue_glCore_glPixelStorex@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3ui64vARB -.type bluegl_glUniform3ui64vARB, %function -bluegl_glUniform3ui64vARB: - mov __blue_glCore_glUniform3ui64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glPixelTransferxOES +.type bluegl_glPixelTransferxOES, %function +bluegl_glPixelTransferxOES: + mov __blue_glCore_glPixelTransferxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1i -.type bluegl_glMultiTexCoord1i, %function -bluegl_glMultiTexCoord1i: - mov __blue_glCore_glMultiTexCoord1i@GOTPCREL(%rip), %r11 +.global bluegl_glPixelZoomxOES +.type bluegl_glPixelZoomxOES, %function +bluegl_glPixelZoomxOES: + mov __blue_glCore_glPixelZoomxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorTable -.type bluegl_glColorTable, %function -bluegl_glColorTable: - mov __blue_glCore_glColorTable@GOTPCREL(%rip), %r11 +.global bluegl_glPrioritizeTexturesxOES +.type bluegl_glPrioritizeTexturesxOES, %function +bluegl_glPrioritizeTexturesxOES: + mov __blue_glCore_glPrioritizeTexturesxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribs4ubvNV -.type bluegl_glVertexAttribs4ubvNV, %function -bluegl_glVertexAttribs4ubvNV: - mov __blue_glCore_glVertexAttribs4ubvNV@GOTPCREL(%rip), %r11 +.global bluegl_glRasterPos2xOES +.type bluegl_glRasterPos2xOES, %function +bluegl_glRasterPos2xOES: + mov __blue_glCore_glRasterPos2xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3uiv -.type bluegl_glProgramUniform3uiv, %function -bluegl_glProgramUniform3uiv: - mov __blue_glCore_glProgramUniform3uiv@GOTPCREL(%rip), %r11 +.global bluegl_glRasterPos2xvOES +.type bluegl_glRasterPos2xvOES, %function +bluegl_glRasterPos2xvOES: + mov __blue_glCore_glRasterPos2xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix3x2fv -.type bluegl_glProgramUniformMatrix3x2fv, %function -bluegl_glProgramUniformMatrix3x2fv: - mov __blue_glCore_glProgramUniformMatrix3x2fv@GOTPCREL(%rip), %r11 +.global bluegl_glRasterPos3xOES +.type bluegl_glRasterPos3xOES, %function +bluegl_glRasterPos3xOES: + mov __blue_glCore_glRasterPos3xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUnmapBuffer -.type bluegl_glUnmapBuffer, %function -bluegl_glUnmapBuffer: - mov __blue_glCore_glUnmapBuffer@GOTPCREL(%rip), %r11 +.global bluegl_glRasterPos3xvOES +.type bluegl_glRasterPos3xvOES, %function +bluegl_glRasterPos3xvOES: + mov __blue_glCore_glRasterPos3xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindTextureUnit -.type bluegl_glBindTextureUnit, %function -bluegl_glBindTextureUnit: - mov __blue_glCore_glBindTextureUnit@GOTPCREL(%rip), %r11 +.global bluegl_glRasterPos4xOES +.type bluegl_glRasterPos4xOES, %function +bluegl_glRasterPos4xOES: + mov __blue_glCore_glRasterPos4xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureParameterIuivEXT -.type bluegl_glTextureParameterIuivEXT, %function -bluegl_glTextureParameterIuivEXT: - mov __blue_glCore_glTextureParameterIuivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glRasterPos4xvOES +.type bluegl_glRasterPos4xvOES, %function +bluegl_glRasterPos4xvOES: + mov __blue_glCore_glRasterPos4xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribDivisor -.type bluegl_glVertexAttribDivisor, %function -bluegl_glVertexAttribDivisor: - mov __blue_glCore_glVertexAttribDivisor@GOTPCREL(%rip), %r11 +.global bluegl_glRectxOES +.type bluegl_glRectxOES, %function +bluegl_glRectxOES: + mov __blue_glCore_glRectxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSamplerParameterIiv -.type bluegl_glSamplerParameterIiv, %function -bluegl_glSamplerParameterIiv: - mov __blue_glCore_glSamplerParameterIiv@GOTPCREL(%rip), %r11 +.global bluegl_glRectxvOES +.type bluegl_glRectxvOES, %function +bluegl_glRectxvOES: + mov __blue_glCore_glRectxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetDebugMessageLog -.type bluegl_glGetDebugMessageLog, %function -bluegl_glGetDebugMessageLog: - mov __blue_glCore_glGetDebugMessageLog@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord1xOES +.type bluegl_glTexCoord1xOES, %function +bluegl_glTexCoord1xOES: + mov __blue_glCore_glTexCoord1xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSelectPerfMonitorCountersAMD -.type bluegl_glSelectPerfMonitorCountersAMD, %function -bluegl_glSelectPerfMonitorCountersAMD: - mov __blue_glCore_glSelectPerfMonitorCountersAMD@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord1xvOES +.type bluegl_glTexCoord1xvOES, %function +bluegl_glTexCoord1xvOES: + mov __blue_glCore_glTexCoord1xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI2i -.type bluegl_glVertexAttribI2i, %function -bluegl_glVertexAttribI2i: - mov __blue_glCore_glVertexAttribI2i@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord2xOES +.type bluegl_glTexCoord2xOES, %function +bluegl_glTexCoord2xOES: + mov __blue_glCore_glTexCoord2xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDepthRangedNV -.type bluegl_glDepthRangedNV, %function -bluegl_glDepthRangedNV: - mov __blue_glCore_glDepthRangedNV@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord2xvOES +.type bluegl_glTexCoord2xvOES, %function +bluegl_glTexCoord2xvOES: + mov __blue_glCore_glTexCoord2xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureRangeAPPLE -.type bluegl_glTextureRangeAPPLE, %function -bluegl_glTextureRangeAPPLE: - mov __blue_glCore_glTextureRangeAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord3xOES +.type bluegl_glTexCoord3xOES, %function +bluegl_glTexCoord3xOES: + mov __blue_glCore_glTexCoord3xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEvalCoord2xOES -.type bluegl_glEvalCoord2xOES, %function -bluegl_glEvalCoord2xOES: - mov __blue_glCore_glEvalCoord2xOES@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord3xvOES +.type bluegl_glTexCoord3xvOES, %function +bluegl_glTexCoord3xvOES: + mov __blue_glCore_glTexCoord3xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCallCommandListNV -.type bluegl_glCallCommandListNV, %function -bluegl_glCallCommandListNV: - mov __blue_glCore_glCallCommandListNV@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord4xOES +.type bluegl_glTexCoord4xOES, %function +bluegl_glTexCoord4xOES: + mov __blue_glCore_glTexCoord4xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVariantdvEXT -.type bluegl_glVariantdvEXT, %function -bluegl_glVariantdvEXT: - mov __blue_glCore_glVariantdvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord4xvOES +.type bluegl_glTexCoord4xvOES, %function +bluegl_glTexCoord4xvOES: + mov __blue_glCore_glTexCoord4xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendColorxOES -.type bluegl_glBlendColorxOES, %function -bluegl_glBlendColorxOES: - mov __blue_glCore_glBlendColorxOES@GOTPCREL(%rip), %r11 +.global bluegl_glTexGenxOES +.type bluegl_glTexGenxOES, %function +bluegl_glTexGenxOES: + mov __blue_glCore_glTexGenxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferTexture2DEXT -.type bluegl_glFramebufferTexture2DEXT, %function -bluegl_glFramebufferTexture2DEXT: - mov __blue_glCore_glFramebufferTexture2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexGenxvOES +.type bluegl_glTexGenxvOES, %function +bluegl_glTexGenxvOES: + mov __blue_glCore_glTexGenxvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetString -.type bluegl_glGetString, %function -bluegl_glGetString: - mov __blue_glCore_glGetString@GOTPCREL(%rip), %r11 +.global bluegl_glVertex2xOES +.type bluegl_glVertex2xOES, %function +bluegl_glVertex2xOES: + mov __blue_glCore_glVertex2xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream3iATI -.type bluegl_glVertexStream3iATI, %function -bluegl_glVertexStream3iATI: - mov __blue_glCore_glVertexStream3iATI@GOTPCREL(%rip), %r11 +.global bluegl_glVertex2xvOES +.type bluegl_glVertex2xvOES, %function +bluegl_glVertex2xvOES: + mov __blue_glCore_glVertex2xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glHintPGI -.type bluegl_glHintPGI, %function -bluegl_glHintPGI: - mov __blue_glCore_glHintPGI@GOTPCREL(%rip), %r11 +.global bluegl_glVertex3xOES +.type bluegl_glVertex3xOES, %function +bluegl_glVertex3xOES: + mov __blue_glCore_glVertex3xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenPerfMonitorsAMD -.type bluegl_glGenPerfMonitorsAMD, %function -bluegl_glGenPerfMonitorsAMD: - mov __blue_glCore_glGenPerfMonitorsAMD@GOTPCREL(%rip), %r11 +.global bluegl_glVertex3xvOES +.type bluegl_glVertex3xvOES, %function +bluegl_glVertex3xvOES: + mov __blue_glCore_glVertex3xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureSubImage3DEXT -.type bluegl_glTextureSubImage3DEXT, %function -bluegl_glTextureSubImage3DEXT: - mov __blue_glCore_glTextureSubImage3DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertex4xOES +.type bluegl_glVertex4xOES, %function +bluegl_glVertex4xOES: + mov __blue_glCore_glVertex4xOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4usvARB -.type bluegl_glVertexAttrib4usvARB, %function -bluegl_glVertexAttrib4usvARB: - mov __blue_glCore_glVertexAttrib4usvARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertex4xvOES +.type bluegl_glVertex4xvOES, %function +bluegl_glVertex4xvOES: + mov __blue_glCore_glVertex4xvOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayBindVertexBufferEXT -.type bluegl_glVertexArrayBindVertexBufferEXT, %function -bluegl_glVertexArrayBindVertexBufferEXT: - mov __blue_glCore_glVertexArrayBindVertexBufferEXT@GOTPCREL(%rip), %r11 +.global bluegl_glQueryMatrixxOES +.type bluegl_glQueryMatrixxOES, %function +bluegl_glQueryMatrixxOES: + mov __blue_glCore_glQueryMatrixxOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMinSampleShading -.type bluegl_glMinSampleShading, %function -bluegl_glMinSampleShading: - mov __blue_glCore_glMinSampleShading@GOTPCREL(%rip), %r11 +.global bluegl_glClearDepthfOES +.type bluegl_glClearDepthfOES, %function +bluegl_glClearDepthfOES: + mov __blue_glCore_glClearDepthfOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsPathNV -.type bluegl_glIsPathNV, %function -bluegl_glIsPathNV: - mov __blue_glCore_glIsPathNV@GOTPCREL(%rip), %r11 +.global bluegl_glClipPlanefOES +.type bluegl_glClipPlanefOES, %function +bluegl_glClipPlanefOES: + mov __blue_glCore_glClipPlanefOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPathTexGenivNV -.type bluegl_glGetPathTexGenivNV, %function -bluegl_glGetPathTexGenivNV: - mov __blue_glCore_glGetPathTexGenivNV@GOTPCREL(%rip), %r11 +.global bluegl_glDepthRangefOES +.type bluegl_glDepthRangefOES, %function +bluegl_glDepthRangefOES: + mov __blue_glCore_glDepthRangefOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3fv -.type bluegl_glProgramUniform3fv, %function -bluegl_glProgramUniform3fv: - mov __blue_glCore_glProgramUniform3fv@GOTPCREL(%rip), %r11 +.global bluegl_glFrustumfOES +.type bluegl_glFrustumfOES, %function +bluegl_glFrustumfOES: + mov __blue_glCore_glFrustumfOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3sv -.type bluegl_glVertexAttrib3sv, %function -bluegl_glVertexAttrib3sv: - mov __blue_glCore_glVertexAttrib3sv@GOTPCREL(%rip), %r11 +.global bluegl_glGetClipPlanefOES +.type bluegl_glGetClipPlanefOES, %function +bluegl_glGetClipPlanefOES: + mov __blue_glCore_glGetClipPlanefOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetUniformuiv -.type bluegl_glGetUniformuiv, %function -bluegl_glGetUniformuiv: - mov __blue_glCore_glGetUniformuiv@GOTPCREL(%rip), %r11 +.global bluegl_glOrthofOES +.type bluegl_glOrthofOES, %function +bluegl_glOrthofOES: + mov __blue_glCore_glOrthofOES@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPixelTransformParameterfvEXT -.type bluegl_glGetPixelTransformParameterfvEXT, %function -bluegl_glGetPixelTransformParameterfvEXT: - mov __blue_glCore_glGetPixelTransformParameterfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTbufferMask3DFX +.type bluegl_glTbufferMask3DFX, %function +bluegl_glTbufferMask3DFX: + mov __blue_glCore_glTbufferMask3DFX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3dv -.type bluegl_glMultiTexCoord3dv, %function -bluegl_glMultiTexCoord3dv: - mov __blue_glCore_glMultiTexCoord3dv@GOTPCREL(%rip), %r11 +.global bluegl_glDebugMessageEnableAMD +.type bluegl_glDebugMessageEnableAMD, %function +bluegl_glDebugMessageEnableAMD: + mov __blue_glCore_glDebugMessageEnableAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3fvARB -.type bluegl_glVertexAttrib3fvARB, %function -bluegl_glVertexAttrib3fvARB: - mov __blue_glCore_glVertexAttrib3fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glDebugMessageInsertAMD +.type bluegl_glDebugMessageInsertAMD, %function +bluegl_glDebugMessageInsertAMD: + mov __blue_glCore_glDebugMessageInsertAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramResourceIndex -.type bluegl_glGetProgramResourceIndex, %function -bluegl_glGetProgramResourceIndex: - mov __blue_glCore_glGetProgramResourceIndex@GOTPCREL(%rip), %r11 +.global bluegl_glDebugMessageCallbackAMD +.type bluegl_glDebugMessageCallbackAMD, %function +bluegl_glDebugMessageCallbackAMD: + mov __blue_glCore_glDebugMessageCallbackAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMinmaxParameteriv -.type bluegl_glGetMinmaxParameteriv, %function -bluegl_glGetMinmaxParameteriv: - mov __blue_glCore_glGetMinmaxParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glGetDebugMessageLogAMD +.type bluegl_glGetDebugMessageLogAMD, %function +bluegl_glGetDebugMessageLogAMD: + mov __blue_glCore_glGetDebugMessageLogAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glConvolutionParameterfEXT -.type bluegl_glConvolutionParameterfEXT, %function -bluegl_glConvolutionParameterfEXT: - mov __blue_glCore_glConvolutionParameterfEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBlendFuncIndexedAMD +.type bluegl_glBlendFuncIndexedAMD, %function +bluegl_glBlendFuncIndexedAMD: + mov __blue_glCore_glBlendFuncIndexedAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4i64NV -.type bluegl_glProgramUniform4i64NV, %function -bluegl_glProgramUniform4i64NV: - mov __blue_glCore_glProgramUniform4i64NV@GOTPCREL(%rip), %r11 +.global bluegl_glBlendFuncSeparateIndexedAMD +.type bluegl_glBlendFuncSeparateIndexedAMD, %function +bluegl_glBlendFuncSeparateIndexedAMD: + mov __blue_glCore_glBlendFuncSeparateIndexedAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix4fvEXT -.type bluegl_glProgramUniformMatrix4fvEXT, %function -bluegl_glProgramUniformMatrix4fvEXT: - mov __blue_glCore_glProgramUniformMatrix4fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBlendEquationIndexedAMD +.type bluegl_glBlendEquationIndexedAMD, %function +bluegl_glBlendEquationIndexedAMD: + mov __blue_glCore_glBlendEquationIndexedAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoordP4ui -.type bluegl_glMultiTexCoordP4ui, %function -bluegl_glMultiTexCoordP4ui: - mov __blue_glCore_glMultiTexCoordP4ui@GOTPCREL(%rip), %r11 +.global bluegl_glBlendEquationSeparateIndexedAMD +.type bluegl_glBlendEquationSeparateIndexedAMD, %function +bluegl_glBlendEquationSeparateIndexedAMD: + mov __blue_glCore_glBlendEquationSeparateIndexedAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEnableVertexAttribAPPLE -.type bluegl_glEnableVertexAttribAPPLE, %function -bluegl_glEnableVertexAttribAPPLE: - mov __blue_glCore_glEnableVertexAttribAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1i64NV +.type bluegl_glUniform1i64NV, %function +bluegl_glUniform1i64NV: + mov __blue_glCore_glUniform1i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoordP3uiv -.type bluegl_glTexCoordP3uiv, %function -bluegl_glTexCoordP3uiv: - mov __blue_glCore_glTexCoordP3uiv@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2i64NV +.type bluegl_glUniform2i64NV, %function +bluegl_glUniform2i64NV: + mov __blue_glCore_glUniform2i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCoverageModulationNV -.type bluegl_glCoverageModulationNV, %function -bluegl_glCoverageModulationNV: - mov __blue_glCore_glCoverageModulationNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3i64NV +.type bluegl_glUniform3i64NV, %function +bluegl_glUniform3i64NV: + mov __blue_glCore_glUniform3i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3ivARB -.type bluegl_glMultiTexCoord3ivARB, %function -bluegl_glMultiTexCoord3ivARB: - mov __blue_glCore_glMultiTexCoord3ivARB@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4i64NV +.type bluegl_glUniform4i64NV, %function +bluegl_glUniform4i64NV: + mov __blue_glCore_glUniform4i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glListParameterfvSGIX -.type bluegl_glListParameterfvSGIX, %function -bluegl_glListParameterfvSGIX: - mov __blue_glCore_glListParameterfvSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1i64vNV +.type bluegl_glUniform1i64vNV, %function +bluegl_glUniform1i64vNV: + mov __blue_glCore_glUniform1i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormal3fVertex3fvSUN -.type bluegl_glNormal3fVertex3fvSUN, %function -bluegl_glNormal3fVertex3fvSUN: - mov __blue_glCore_glNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2i64vNV +.type bluegl_glUniform2i64vNV, %function +bluegl_glUniform2i64vNV: + mov __blue_glCore_glUniform2i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4bv -.type bluegl_glVertexAttrib4bv, %function -bluegl_glVertexAttrib4bv: - mov __blue_glCore_glVertexAttrib4bv@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3i64vNV +.type bluegl_glUniform3i64vNV, %function +bluegl_glUniform3i64vNV: + mov __blue_glCore_glUniform3i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexParameterIiv -.type bluegl_glTexParameterIiv, %function -bluegl_glTexParameterIiv: - mov __blue_glCore_glTexParameterIiv@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4i64vNV +.type bluegl_glUniform4i64vNV, %function +bluegl_glUniform4i64vNV: + mov __blue_glCore_glUniform4i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedFramebufferParameteri -.type bluegl_glNamedFramebufferParameteri, %function -bluegl_glNamedFramebufferParameteri: - mov __blue_glCore_glNamedFramebufferParameteri@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1ui64NV +.type bluegl_glUniform1ui64NV, %function +bluegl_glUniform1ui64NV: + mov __blue_glCore_glUniform1ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFramebufferParameterivEXT -.type bluegl_glGetFramebufferParameterivEXT, %function -bluegl_glGetFramebufferParameterivEXT: - mov __blue_glCore_glGetFramebufferParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2ui64NV +.type bluegl_glUniform2ui64NV, %function +bluegl_glUniform2ui64NV: + mov __blue_glCore_glUniform2ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeubSUN -.type bluegl_glReplacementCodeubSUN, %function -bluegl_glReplacementCodeubSUN: - mov __blue_glCore_glReplacementCodeubSUN@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3ui64NV +.type bluegl_glUniform3ui64NV, %function +bluegl_glUniform3ui64NV: + mov __blue_glCore_glUniform3ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord2bvOES -.type bluegl_glTexCoord2bvOES, %function -bluegl_glTexCoord2bvOES: - mov __blue_glCore_glTexCoord2bvOES@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4ui64NV +.type bluegl_glUniform4ui64NV, %function +bluegl_glUniform4ui64NV: + mov __blue_glCore_glUniform4ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVideoui64vNV -.type bluegl_glGetVideoui64vNV, %function -bluegl_glGetVideoui64vNV: - mov __blue_glCore_glGetVideoui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1ui64vNV +.type bluegl_glUniform1ui64vNV, %function +bluegl_glUniform1ui64vNV: + mov __blue_glCore_glUniform1ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexStorage2DMultisample -.type bluegl_glTexStorage2DMultisample, %function -bluegl_glTexStorage2DMultisample: - mov __blue_glCore_glTexStorage2DMultisample@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2ui64vNV +.type bluegl_glUniform2ui64vNV, %function +bluegl_glUniform2ui64vNV: + mov __blue_glCore_glUniform2ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorTableParameteriv -.type bluegl_glColorTableParameteriv, %function -bluegl_glColorTableParameteriv: - mov __blue_glCore_glColorTableParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3ui64vNV +.type bluegl_glUniform3ui64vNV, %function +bluegl_glUniform3ui64vNV: + mov __blue_glCore_glUniform3ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glConvolutionFilter2DEXT -.type bluegl_glConvolutionFilter2DEXT, %function -bluegl_glConvolutionFilter2DEXT: - mov __blue_glCore_glConvolutionFilter2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4ui64vNV +.type bluegl_glUniform4ui64vNV, %function +bluegl_glUniform4ui64vNV: + mov __blue_glCore_glUniform4ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSampleMaskEXT -.type bluegl_glSampleMaskEXT, %function -bluegl_glSampleMaskEXT: - mov __blue_glCore_glSampleMaskEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetUniformi64vNV +.type bluegl_glGetUniformi64vNV, %function +bluegl_glGetUniformi64vNV: + mov __blue_glCore_glGetUniformi64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGlobalAlphaFactorusSUN -.type bluegl_glGlobalAlphaFactorusSUN, %function -bluegl_glGlobalAlphaFactorusSUN: - mov __blue_glCore_glGlobalAlphaFactorusSUN@GOTPCREL(%rip), %r11 +.global bluegl_glGetUniformui64vNV +.type bluegl_glGetUniformui64vNV, %function +bluegl_glGetUniformui64vNV: + mov __blue_glCore_glGetUniformui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindRenderbuffer -.type bluegl_glBindRenderbuffer, %function -bluegl_glBindRenderbuffer: - mov __blue_glCore_glBindRenderbuffer@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1i64NV +.type bluegl_glProgramUniform1i64NV, %function +bluegl_glProgramUniform1i64NV: + mov __blue_glCore_glProgramUniform1i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI1i -.type bluegl_glVertexAttribI1i, %function -bluegl_glVertexAttribI1i: - mov __blue_glCore_glVertexAttribI1i@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2i64NV +.type bluegl_glProgramUniform2i64NV, %function +bluegl_glProgramUniform2i64NV: + mov __blue_glCore_glProgramUniform2i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramLocalParameterI4uiNV -.type bluegl_glProgramLocalParameterI4uiNV, %function -bluegl_glProgramLocalParameterI4uiNV: - mov __blue_glCore_glProgramLocalParameterI4uiNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3i64NV +.type bluegl_glProgramUniform3i64NV, %function +bluegl_glProgramUniform3i64NV: + mov __blue_glCore_glProgramUniform3i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4ui64ARB -.type bluegl_glProgramUniform4ui64ARB, %function -bluegl_glProgramUniform4ui64ARB: - mov __blue_glCore_glProgramUniform4ui64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4i64NV +.type bluegl_glProgramUniform4i64NV, %function +bluegl_glProgramUniform4i64NV: + mov __blue_glCore_glProgramUniform4i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glObjectLabel -.type bluegl_glObjectLabel, %function -bluegl_glObjectLabel: - mov __blue_glCore_glObjectLabel@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1i64vNV +.type bluegl_glProgramUniform1i64vNV, %function +bluegl_glProgramUniform1i64vNV: + mov __blue_glCore_glProgramUniform1i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetColorTableParameterivEXT -.type bluegl_glGetColorTableParameterivEXT, %function -bluegl_glGetColorTableParameterivEXT: - mov __blue_glCore_glGetColorTableParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2i64vNV +.type bluegl_glProgramUniform2i64vNV, %function +bluegl_glProgramUniform2i64vNV: + mov __blue_glCore_glProgramUniform2i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetCombinerOutputParameterivNV -.type bluegl_glGetCombinerOutputParameterivNV, %function -bluegl_glGetCombinerOutputParameterivNV: - mov __blue_glCore_glGetCombinerOutputParameterivNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3i64vNV +.type bluegl_glProgramUniform3i64vNV, %function +bluegl_glProgramUniform3i64vNV: + mov __blue_glCore_glProgramUniform3i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawElementsInstancedARB -.type bluegl_glDrawElementsInstancedARB, %function -bluegl_glDrawElementsInstancedARB: - mov __blue_glCore_glDrawElementsInstancedARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4i64vNV +.type bluegl_glProgramUniform4i64vNV, %function +bluegl_glProgramUniform4i64vNV: + mov __blue_glCore_glProgramUniform4i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMinmaxParameterfv -.type bluegl_glGetMinmaxParameterfv, %function -bluegl_glGetMinmaxParameterfv: - mov __blue_glCore_glGetMinmaxParameterfv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1ui64NV +.type bluegl_glProgramUniform1ui64NV, %function +bluegl_glProgramUniform1ui64NV: + mov __blue_glCore_glProgramUniform1ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixPushEXT -.type bluegl_glMatrixPushEXT, %function -bluegl_glMatrixPushEXT: - mov __blue_glCore_glMatrixPushEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2ui64NV +.type bluegl_glProgramUniform2ui64NV, %function +bluegl_glProgramUniform2ui64NV: + mov __blue_glCore_glProgramUniform2ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexParameterIivEXT -.type bluegl_glMultiTexParameterIivEXT, %function -bluegl_glMultiTexParameterIivEXT: - mov __blue_glCore_glMultiTexParameterIivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3ui64NV +.type bluegl_glProgramUniform3ui64NV, %function +bluegl_glProgramUniform3ui64NV: + mov __blue_glCore_glProgramUniform3ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPathColorGenfvNV -.type bluegl_glGetPathColorGenfvNV, %function -bluegl_glGetPathColorGenfvNV: - mov __blue_glCore_glGetPathColorGenfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4ui64NV +.type bluegl_glProgramUniform4ui64NV, %function +bluegl_glProgramUniform4ui64NV: + mov __blue_glCore_glProgramUniform4ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindProgramNV -.type bluegl_glBindProgramNV, %function -bluegl_glBindProgramNV: - mov __blue_glCore_glBindProgramNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1ui64vNV +.type bluegl_glProgramUniform1ui64vNV, %function +bluegl_glProgramUniform1ui64vNV: + mov __blue_glCore_glProgramUniform1ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferReadBufferEXT -.type bluegl_glFramebufferReadBufferEXT, %function -bluegl_glFramebufferReadBufferEXT: - mov __blue_glCore_glFramebufferReadBufferEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2ui64vNV +.type bluegl_glProgramUniform2ui64vNV, %function +bluegl_glProgramUniform2ui64vNV: + mov __blue_glCore_glProgramUniform2ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFogCoordfEXT -.type bluegl_glFogCoordfEXT, %function -bluegl_glFogCoordfEXT: - mov __blue_glCore_glFogCoordfEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3ui64vNV +.type bluegl_glProgramUniform3ui64vNV, %function +bluegl_glProgramUniform3ui64vNV: + mov __blue_glCore_glProgramUniform3ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayNormalOffsetEXT -.type bluegl_glVertexArrayNormalOffsetEXT, %function -bluegl_glVertexArrayNormalOffsetEXT: - mov __blue_glCore_glVertexArrayNormalOffsetEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4ui64vNV +.type bluegl_glProgramUniform4ui64vNV, %function +bluegl_glProgramUniform4ui64vNV: + mov __blue_glCore_glProgramUniform4ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN -.type bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN, %function -bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN: - mov __blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribParameteriAMD +.type bluegl_glVertexAttribParameteriAMD, %function +bluegl_glVertexAttribParameteriAMD: + mov __blue_glCore_glVertexAttribParameteriAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnUniformfv -.type bluegl_glGetnUniformfv, %function -bluegl_glGetnUniformfv: - mov __blue_glCore_glGetnUniformfv@GOTPCREL(%rip), %r11 +.global bluegl_glMultiDrawArraysIndirectAMD +.type bluegl_glMultiDrawArraysIndirectAMD, %function +bluegl_glMultiDrawArraysIndirectAMD: + mov __blue_glCore_glMultiDrawArraysIndirectAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPointParameterfEXT -.type bluegl_glPointParameterfEXT, %function -bluegl_glPointParameterfEXT: - mov __blue_glCore_glPointParameterfEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiDrawElementsIndirectAMD +.type bluegl_glMultiDrawElementsIndirectAMD, %function +bluegl_glMultiDrawElementsIndirectAMD: + mov __blue_glCore_glMultiDrawElementsIndirectAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEndVideoCaptureNV -.type bluegl_glEndVideoCaptureNV, %function -bluegl_glEndVideoCaptureNV: - mov __blue_glCore_glEndVideoCaptureNV@GOTPCREL(%rip), %r11 +.global bluegl_glGenNamesAMD +.type bluegl_glGenNamesAMD, %function +bluegl_glGenNamesAMD: + mov __blue_glCore_glGenNamesAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexBlendARB -.type bluegl_glVertexBlendARB, %function -bluegl_glVertexBlendARB: - mov __blue_glCore_glVertexBlendARB@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteNamesAMD +.type bluegl_glDeleteNamesAMD, %function +bluegl_glDeleteNamesAMD: + mov __blue_glCore_glDeleteNamesAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL3i64vNV -.type bluegl_glVertexAttribL3i64vNV, %function -bluegl_glVertexAttribL3i64vNV: - mov __blue_glCore_glVertexAttribL3i64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glIsNameAMD +.type bluegl_glIsNameAMD, %function +bluegl_glIsNameAMD: + mov __blue_glCore_glIsNameAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3fEXT -.type bluegl_glSecondaryColor3fEXT, %function -bluegl_glSecondaryColor3fEXT: - mov __blue_glCore_glSecondaryColor3fEXT@GOTPCREL(%rip), %r11 +.global bluegl_glQueryObjectParameteruiAMD +.type bluegl_glQueryObjectParameteruiAMD, %function +bluegl_glQueryObjectParameteruiAMD: + mov __blue_glCore_glQueryObjectParameteruiAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStencilFuncSeparateATI -.type bluegl_glStencilFuncSeparateATI, %function -bluegl_glStencilFuncSeparateATI: - mov __blue_glCore_glStencilFuncSeparateATI@GOTPCREL(%rip), %r11 +.global bluegl_glGetPerfMonitorGroupsAMD +.type bluegl_glGetPerfMonitorGroupsAMD, %function +bluegl_glGetPerfMonitorGroupsAMD: + mov __blue_glCore_glGetPerfMonitorGroupsAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedMultiTexSubImage2DEXT -.type bluegl_glCompressedMultiTexSubImage2DEXT, %function -bluegl_glCompressedMultiTexSubImage2DEXT: - mov __blue_glCore_glCompressedMultiTexSubImage2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetPerfMonitorCountersAMD +.type bluegl_glGetPerfMonitorCountersAMD, %function +bluegl_glGetPerfMonitorCountersAMD: + mov __blue_glCore_glGetPerfMonitorCountersAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTransformPathNV -.type bluegl_glTransformPathNV, %function -bluegl_glTransformPathNV: - mov __blue_glCore_glTransformPathNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetPerfMonitorGroupStringAMD +.type bluegl_glGetPerfMonitorGroupStringAMD, %function +bluegl_glGetPerfMonitorGroupStringAMD: + mov __blue_glCore_glGetPerfMonitorGroupStringAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsEnabledi -.type bluegl_glIsEnabledi, %function -bluegl_glIsEnabledi: - mov __blue_glCore_glIsEnabledi@GOTPCREL(%rip), %r11 +.global bluegl_glGetPerfMonitorCounterStringAMD +.type bluegl_glGetPerfMonitorCounterStringAMD, %function +bluegl_glGetPerfMonitorCounterStringAMD: + mov __blue_glCore_glGetPerfMonitorCounterStringAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glExtractComponentEXT -.type bluegl_glExtractComponentEXT, %function -bluegl_glExtractComponentEXT: - mov __blue_glCore_glExtractComponentEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetPerfMonitorCounterInfoAMD +.type bluegl_glGetPerfMonitorCounterInfoAMD, %function +bluegl_glGetPerfMonitorCounterInfoAMD: + mov __blue_glCore_glGetPerfMonitorCounterInfoAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFixedvOES -.type bluegl_glGetFixedvOES, %function -bluegl_glGetFixedvOES: - mov __blue_glCore_glGetFixedvOES@GOTPCREL(%rip), %r11 +.global bluegl_glGenPerfMonitorsAMD +.type bluegl_glGenPerfMonitorsAMD, %function +bluegl_glGenPerfMonitorsAMD: + mov __blue_glCore_glGenPerfMonitorsAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteProgramPipelines -.type bluegl_glDeleteProgramPipelines, %function -bluegl_glDeleteProgramPipelines: - mov __blue_glCore_glDeleteProgramPipelines@GOTPCREL(%rip), %r11 +.global bluegl_glDeletePerfMonitorsAMD +.type bluegl_glDeletePerfMonitorsAMD, %function +bluegl_glDeletePerfMonitorsAMD: + mov __blue_glCore_glDeletePerfMonitorsAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyMultiTexSubImage3DEXT -.type bluegl_glCopyMultiTexSubImage3DEXT, %function -bluegl_glCopyMultiTexSubImage3DEXT: - mov __blue_glCore_glCopyMultiTexSubImage3DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glSelectPerfMonitorCountersAMD +.type bluegl_glSelectPerfMonitorCountersAMD, %function +bluegl_glSelectPerfMonitorCountersAMD: + mov __blue_glCore_glSelectPerfMonitorCountersAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreateStatesNV -.type bluegl_glCreateStatesNV, %function -bluegl_glCreateStatesNV: - mov __blue_glCore_glCreateStatesNV@GOTPCREL(%rip), %r11 +.global bluegl_glBeginPerfMonitorAMD +.type bluegl_glBeginPerfMonitorAMD, %function +bluegl_glBeginPerfMonitorAMD: + mov __blue_glCore_glBeginPerfMonitorAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSwizzleEXT -.type bluegl_glSwizzleEXT, %function -bluegl_glSwizzleEXT: - mov __blue_glCore_glSwizzleEXT@GOTPCREL(%rip), %r11 +.global bluegl_glEndPerfMonitorAMD +.type bluegl_glEndPerfMonitorAMD, %function +bluegl_glEndPerfMonitorAMD: + mov __blue_glCore_glEndPerfMonitorAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexWeightfvEXT -.type bluegl_glVertexWeightfvEXT, %function -bluegl_glVertexWeightfvEXT: - mov __blue_glCore_glVertexWeightfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetPerfMonitorCounterDataAMD +.type bluegl_glGetPerfMonitorCounterDataAMD, %function +bluegl_glGetPerfMonitorCounterDataAMD: + mov __blue_glCore_glGetPerfMonitorCounterDataAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormalPointerEXT -.type bluegl_glNormalPointerEXT, %function -bluegl_glNormalPointerEXT: - mov __blue_glCore_glNormalPointerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glSetMultisamplefvAMD +.type bluegl_glSetMultisamplefvAMD, %function +bluegl_glSetMultisamplefvAMD: + mov __blue_glCore_glSetMultisamplefvAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetConvolutionFilterEXT -.type bluegl_glGetConvolutionFilterEXT, %function -bluegl_glGetConvolutionFilterEXT: - mov __blue_glCore_glGetConvolutionFilterEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexStorageSparseAMD +.type bluegl_glTexStorageSparseAMD, %function +bluegl_glTexStorageSparseAMD: + mov __blue_glCore_glTexStorageSparseAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCurrentPaletteMatrixARB -.type bluegl_glCurrentPaletteMatrixARB, %function -bluegl_glCurrentPaletteMatrixARB: - mov __blue_glCore_glCurrentPaletteMatrixARB@GOTPCREL(%rip), %r11 +.global bluegl_glTextureStorageSparseAMD +.type bluegl_glTextureStorageSparseAMD, %function +bluegl_glTextureStorageSparseAMD: + mov __blue_glCore_glTextureStorageSparseAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream4sATI -.type bluegl_glVertexStream4sATI, %function -bluegl_glVertexStream4sATI: - mov __blue_glCore_glVertexStream4sATI@GOTPCREL(%rip), %r11 +.global bluegl_glStencilOpValueAMD +.type bluegl_glStencilOpValueAMD, %function +bluegl_glStencilOpValueAMD: + mov __blue_glCore_glStencilOpValueAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3ui64ARB -.type bluegl_glUniform3ui64ARB, %function -bluegl_glUniform3ui64ARB: - mov __blue_glCore_glUniform3ui64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glTessellationFactorAMD +.type bluegl_glTessellationFactorAMD, %function +bluegl_glTessellationFactorAMD: + mov __blue_glCore_glTessellationFactorAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1uivEXT -.type bluegl_glProgramUniform1uivEXT, %function -bluegl_glProgramUniform1uivEXT: - mov __blue_glCore_glProgramUniform1uivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTessellationModeAMD +.type bluegl_glTessellationModeAMD, %function +bluegl_glTessellationModeAMD: + mov __blue_glCore_glTessellationModeAMD@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribs3dvNV -.type bluegl_glVertexAttribs3dvNV, %function -bluegl_glVertexAttribs3dvNV: - mov __blue_glCore_glVertexAttribs3dvNV@GOTPCREL(%rip), %r11 +.global bluegl_glElementPointerAPPLE +.type bluegl_glElementPointerAPPLE, %function +bluegl_glElementPointerAPPLE: + mov __blue_glCore_glElementPointerAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glExecuteProgramNV -.type bluegl_glExecuteProgramNV, %function -bluegl_glExecuteProgramNV: - mov __blue_glCore_glExecuteProgramNV@GOTPCREL(%rip), %r11 +.global bluegl_glDrawElementArrayAPPLE +.type bluegl_glDrawElementArrayAPPLE, %function +bluegl_glDrawElementArrayAPPLE: + mov __blue_glCore_glDrawElementArrayAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFrameZoomSGIX -.type bluegl_glFrameZoomSGIX, %function -bluegl_glFrameZoomSGIX: - mov __blue_glCore_glFrameZoomSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glDrawRangeElementArrayAPPLE +.type bluegl_glDrawRangeElementArrayAPPLE, %function +bluegl_glDrawRangeElementArrayAPPLE: + mov __blue_glCore_glDrawRangeElementArrayAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFragmentMaterialfSGIX -.type bluegl_glFragmentMaterialfSGIX, %function -bluegl_glFragmentMaterialfSGIX: - mov __blue_glCore_glFragmentMaterialfSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glMultiDrawElementArrayAPPLE +.type bluegl_glMultiDrawElementArrayAPPLE, %function +bluegl_glMultiDrawElementArrayAPPLE: + mov __blue_glCore_glMultiDrawElementArrayAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferTextureLayerEXT -.type bluegl_glFramebufferTextureLayerEXT, %function -bluegl_glFramebufferTextureLayerEXT: - mov __blue_glCore_glFramebufferTextureLayerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiDrawRangeElementArrayAPPLE +.type bluegl_glMultiDrawRangeElementArrayAPPLE, %function +bluegl_glMultiDrawRangeElementArrayAPPLE: + mov __blue_glCore_glMultiDrawRangeElementArrayAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream1iATI -.type bluegl_glVertexStream1iATI, %function -bluegl_glVertexStream1iATI: - mov __blue_glCore_glVertexStream1iATI@GOTPCREL(%rip), %r11 +.global bluegl_glGenFencesAPPLE +.type bluegl_glGenFencesAPPLE, %function +bluegl_glGenFencesAPPLE: + mov __blue_glCore_glGenFencesAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3s -.type bluegl_glVertexAttrib3s, %function -bluegl_glVertexAttrib3s: - mov __blue_glCore_glVertexAttrib3s@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteFencesAPPLE +.type bluegl_glDeleteFencesAPPLE, %function +bluegl_glDeleteFencesAPPLE: + mov __blue_glCore_glDeleteFencesAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferTextureMultiviewOVR -.type bluegl_glFramebufferTextureMultiviewOVR, %function -bluegl_glFramebufferTextureMultiviewOVR: - mov __blue_glCore_glFramebufferTextureMultiviewOVR@GOTPCREL(%rip), %r11 +.global bluegl_glSetFenceAPPLE +.type bluegl_glSetFenceAPPLE, %function +bluegl_glSetFenceAPPLE: + mov __blue_glCore_glSetFenceAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glElementPointerAPPLE -.type bluegl_glElementPointerAPPLE, %function -bluegl_glElementPointerAPPLE: - mov __blue_glCore_glElementPointerAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glIsFenceAPPLE +.type bluegl_glIsFenceAPPLE, %function +bluegl_glIsFenceAPPLE: + mov __blue_glCore_glIsFenceAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos4ivMESA -.type bluegl_glWindowPos4ivMESA, %function -bluegl_glWindowPos4ivMESA: - mov __blue_glCore_glWindowPos4ivMESA@GOTPCREL(%rip), %r11 +.global bluegl_glTestFenceAPPLE +.type bluegl_glTestFenceAPPLE, %function +bluegl_glTestFenceAPPLE: + mov __blue_glCore_glTestFenceAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexSubImage3D -.type bluegl_glTexSubImage3D, %function -bluegl_glTexSubImage3D: - mov __blue_glCore_glTexSubImage3D@GOTPCREL(%rip), %r11 +.global bluegl_glFinishFenceAPPLE +.type bluegl_glFinishFenceAPPLE, %function +bluegl_glFinishFenceAPPLE: + mov __blue_glCore_glFinishFenceAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFragmentMaterialfvSGIX -.type bluegl_glGetFragmentMaterialfvSGIX, %function -bluegl_glGetFragmentMaterialfvSGIX: - mov __blue_glCore_glGetFragmentMaterialfvSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glTestObjectAPPLE +.type bluegl_glTestObjectAPPLE, %function +bluegl_glTestObjectAPPLE: + mov __blue_glCore_glTestObjectAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1dEXT -.type bluegl_glProgramUniform1dEXT, %function -bluegl_glProgramUniform1dEXT: - mov __blue_glCore_glProgramUniform1dEXT@GOTPCREL(%rip), %r11 +.global bluegl_glFinishObjectAPPLE +.type bluegl_glFinishObjectAPPLE, %function +bluegl_glFinishObjectAPPLE: + mov __blue_glCore_glFinishObjectAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFragmentLightfvSGIX -.type bluegl_glGetFragmentLightfvSGIX, %function -bluegl_glGetFragmentLightfvSGIX: - mov __blue_glCore_glGetFragmentLightfvSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glBufferParameteriAPPLE +.type bluegl_glBufferParameteriAPPLE, %function +bluegl_glBufferParameteriAPPLE: + mov __blue_glCore_glBufferParameteriAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord2bOES -.type bluegl_glTexCoord2bOES, %function -bluegl_glTexCoord2bOES: - mov __blue_glCore_glTexCoord2bOES@GOTPCREL(%rip), %r11 +.global bluegl_glFlushMappedBufferRangeAPPLE +.type bluegl_glFlushMappedBufferRangeAPPLE, %function +bluegl_glFlushMappedBufferRangeAPPLE: + mov __blue_glCore_glFlushMappedBufferRangeAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3fv -.type bluegl_glVertexAttrib3fv, %function -bluegl_glVertexAttrib3fv: - mov __blue_glCore_glVertexAttrib3fv@GOTPCREL(%rip), %r11 +.global bluegl_glObjectPurgeableAPPLE +.type bluegl_glObjectPurgeableAPPLE, %function +bluegl_glObjectPurgeableAPPLE: + mov __blue_glCore_glObjectPurgeableAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMakeNamedBufferNonResidentNV -.type bluegl_glMakeNamedBufferNonResidentNV, %function -bluegl_glMakeNamedBufferNonResidentNV: - mov __blue_glCore_glMakeNamedBufferNonResidentNV@GOTPCREL(%rip), %r11 +.global bluegl_glObjectUnpurgeableAPPLE +.type bluegl_glObjectUnpurgeableAPPLE, %function +bluegl_glObjectUnpurgeableAPPLE: + mov __blue_glCore_glObjectUnpurgeableAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsProgramARB -.type bluegl_glIsProgramARB, %function -bluegl_glIsProgramARB: - mov __blue_glCore_glIsProgramARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetObjectParameterivAPPLE +.type bluegl_glGetObjectParameterivAPPLE, %function +bluegl_glGetObjectParameterivAPPLE: + mov __blue_glCore_glGetObjectParameterivAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glScissorArrayv -.type bluegl_glScissorArrayv, %function -bluegl_glScissorArrayv: - mov __blue_glCore_glScissorArrayv@GOTPCREL(%rip), %r11 +.global bluegl_glTextureRangeAPPLE +.type bluegl_glTextureRangeAPPLE, %function +bluegl_glTextureRangeAPPLE: + mov __blue_glCore_glTextureRangeAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiDrawElementsIndirect -.type bluegl_glMultiDrawElementsIndirect, %function -bluegl_glMultiDrawElementsIndirect: - mov __blue_glCore_glMultiDrawElementsIndirect@GOTPCREL(%rip), %r11 +.global bluegl_glGetTexParameterPointervAPPLE +.type bluegl_glGetTexParameterPointervAPPLE, %function +bluegl_glGetTexParameterPointervAPPLE: + mov __blue_glCore_glGetTexParameterPointervAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMultiTexParameterfvEXT -.type bluegl_glGetMultiTexParameterfvEXT, %function -bluegl_glGetMultiTexParameterfvEXT: - mov __blue_glCore_glGetMultiTexParameterfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBindVertexArrayAPPLE +.type bluegl_glBindVertexArrayAPPLE, %function +bluegl_glBindVertexArrayAPPLE: + mov __blue_glCore_glBindVertexArrayAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2iARB -.type bluegl_glWindowPos2iARB, %function -bluegl_glWindowPos2iARB: - mov __blue_glCore_glWindowPos2iARB@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteVertexArraysAPPLE +.type bluegl_glDeleteVertexArraysAPPLE, %function +bluegl_glDeleteVertexArraysAPPLE: + mov __blue_glCore_glDeleteVertexArraysAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramStringNV -.type bluegl_glGetProgramStringNV, %function -bluegl_glGetProgramStringNV: - mov __blue_glCore_glGetProgramStringNV@GOTPCREL(%rip), %r11 +.global bluegl_glGenVertexArraysAPPLE +.type bluegl_glGenVertexArraysAPPLE, %function +bluegl_glGenVertexArraysAPPLE: + mov __blue_glCore_glGenVertexArraysAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTranslatexOES -.type bluegl_glTranslatexOES, %function -bluegl_glTranslatexOES: - mov __blue_glCore_glTranslatexOES@GOTPCREL(%rip), %r11 +.global bluegl_glIsVertexArrayAPPLE +.type bluegl_glIsVertexArrayAPPLE, %function +bluegl_glIsVertexArrayAPPLE: + mov __blue_glCore_glIsVertexArrayAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4d -.type bluegl_glMultiTexCoord4d, %function -bluegl_glMultiTexCoord4d: - mov __blue_glCore_glMultiTexCoord4d@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayRangeAPPLE +.type bluegl_glVertexArrayRangeAPPLE, %function +bluegl_glVertexArrayRangeAPPLE: + mov __blue_glCore_glVertexArrayRangeAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorTableParameterfvSGI -.type bluegl_glColorTableParameterfvSGI, %function -bluegl_glColorTableParameterfvSGI: - mov __blue_glCore_glColorTableParameterfvSGI@GOTPCREL(%rip), %r11 +.global bluegl_glFlushVertexArrayRangeAPPLE +.type bluegl_glFlushVertexArrayRangeAPPLE, %function +bluegl_glFlushVertexArrayRangeAPPLE: + mov __blue_glCore_glFlushVertexArrayRangeAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord3bvOES -.type bluegl_glTexCoord3bvOES, %function -bluegl_glTexCoord3bvOES: - mov __blue_glCore_glTexCoord3bvOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayParameteriAPPLE +.type bluegl_glVertexArrayParameteriAPPLE, %function +bluegl_glVertexArrayParameteriAPPLE: + mov __blue_glCore_glVertexArrayParameteriAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2ui64vARB -.type bluegl_glUniform2ui64vARB, %function -bluegl_glUniform2ui64vARB: - mov __blue_glCore_glUniform2ui64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glEnableVertexAttribAPPLE +.type bluegl_glEnableVertexAttribAPPLE, %function +bluegl_glEnableVertexAttribAPPLE: + mov __blue_glCore_glEnableVertexAttribAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixIndexusvARB -.type bluegl_glMatrixIndexusvARB, %function -bluegl_glMatrixIndexusvARB: - mov __blue_glCore_glMatrixIndexusvARB@GOTPCREL(%rip), %r11 +.global bluegl_glDisableVertexAttribAPPLE +.type bluegl_glDisableVertexAttribAPPLE, %function +bluegl_glDisableVertexAttribAPPLE: + mov __blue_glCore_glDisableVertexAttribAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMultiTexGenfvEXT -.type bluegl_glGetMultiTexGenfvEXT, %function -bluegl_glGetMultiTexGenfvEXT: - mov __blue_glCore_glGetMultiTexGenfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glIsVertexAttribEnabledAPPLE +.type bluegl_glIsVertexAttribEnabledAPPLE, %function +bluegl_glIsVertexAttribEnabledAPPLE: + mov __blue_glCore_glIsVertexAttribEnabledAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenerateTextureMipmapEXT -.type bluegl_glGenerateTextureMipmapEXT, %function -bluegl_glGenerateTextureMipmapEXT: - mov __blue_glCore_glGenerateTextureMipmapEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMapVertexAttrib1dAPPLE +.type bluegl_glMapVertexAttrib1dAPPLE, %function +bluegl_glMapVertexAttrib1dAPPLE: + mov __blue_glCore_glMapVertexAttrib1dAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMapParameterivNV -.type bluegl_glGetMapParameterivNV, %function -bluegl_glGetMapParameterivNV: - mov __blue_glCore_glGetMapParameterivNV@GOTPCREL(%rip), %r11 +.global bluegl_glMapVertexAttrib1fAPPLE +.type bluegl_glMapVertexAttrib1fAPPLE, %function +bluegl_glMapVertexAttrib1fAPPLE: + mov __blue_glCore_glMapVertexAttrib1fAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetConvolutionParameterxvOES -.type bluegl_glGetConvolutionParameterxvOES, %function -bluegl_glGetConvolutionParameterxvOES: - mov __blue_glCore_glGetConvolutionParameterxvOES@GOTPCREL(%rip), %r11 +.global bluegl_glMapVertexAttrib2dAPPLE +.type bluegl_glMapVertexAttrib2dAPPLE, %function +bluegl_glMapVertexAttrib2dAPPLE: + mov __blue_glCore_glMapVertexAttrib2dAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4fvNV -.type bluegl_glVertexAttrib4fvNV, %function -bluegl_glVertexAttrib4fvNV: - mov __blue_glCore_glVertexAttrib4fvNV@GOTPCREL(%rip), %r11 +.global bluegl_glMapVertexAttrib2fAPPLE +.type bluegl_glMapVertexAttrib2fAPPLE, %function +bluegl_glMapVertexAttrib2fAPPLE: + mov __blue_glCore_glMapVertexAttrib2fAPPLE@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBufferDataARB -.type bluegl_glBufferDataARB, %function -bluegl_glBufferDataARB: - mov __blue_glCore_glBufferDataARB@GOTPCREL(%rip), %r11 +.global bluegl_glDrawBuffersATI +.type bluegl_glDrawBuffersATI, %function +bluegl_glDrawBuffersATI: + mov __blue_glCore_glDrawBuffersATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos4fMESA -.type bluegl_glWindowPos4fMESA, %function -bluegl_glWindowPos4fMESA: - mov __blue_glCore_glWindowPos4fMESA@GOTPCREL(%rip), %r11 +.global bluegl_glElementPointerATI +.type bluegl_glElementPointerATI, %function +bluegl_glElementPointerATI: + mov __blue_glCore_glElementPointerATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPushDebugGroup -.type bluegl_glPushDebugGroup, %function -bluegl_glPushDebugGroup: - mov __blue_glCore_glPushDebugGroup@GOTPCREL(%rip), %r11 +.global bluegl_glDrawElementArrayATI +.type bluegl_glDrawElementArrayATI, %function +bluegl_glDrawElementArrayATI: + mov __blue_glCore_glDrawElementArrayATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2fEXT -.type bluegl_glProgramUniform2fEXT, %function -bluegl_glProgramUniform2fEXT: - mov __blue_glCore_glProgramUniform2fEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDrawRangeElementArrayATI +.type bluegl_glDrawRangeElementArrayATI, %function +bluegl_glDrawRangeElementArrayATI: + mov __blue_glCore_glDrawRangeElementArrayATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyTexImage1DEXT -.type bluegl_glCopyTexImage1DEXT, %function -bluegl_glCopyTexImage1DEXT: - mov __blue_glCore_glCopyTexImage1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexBumpParameterivATI +.type bluegl_glTexBumpParameterivATI, %function +bluegl_glTexBumpParameterivATI: + mov __blue_glCore_glTexBumpParameterivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTexSubImage2DARB -.type bluegl_glCompressedTexSubImage2DARB, %function -bluegl_glCompressedTexSubImage2DARB: - mov __blue_glCore_glCompressedTexSubImage2DARB@GOTPCREL(%rip), %r11 +.global bluegl_glTexBumpParameterfvATI +.type bluegl_glTexBumpParameterfvATI, %function +bluegl_glTexBumpParameterfvATI: + mov __blue_glCore_glTexBumpParameterfvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyColorSubTableEXT -.type bluegl_glCopyColorSubTableEXT, %function -bluegl_glCopyColorSubTableEXT: - mov __blue_glCore_glCopyColorSubTableEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetTexBumpParameterivATI +.type bluegl_glGetTexBumpParameterivATI, %function +bluegl_glGetTexBumpParameterivATI: + mov __blue_glCore_glGetTexBumpParameterivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTransformFeedbackAttribsNV -.type bluegl_glTransformFeedbackAttribsNV, %function -bluegl_glTransformFeedbackAttribsNV: - mov __blue_glCore_glTransformFeedbackAttribsNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetTexBumpParameterfvATI +.type bluegl_glGetTexBumpParameterfvATI, %function +bluegl_glGetTexBumpParameterfvATI: + mov __blue_glCore_glGetTexBumpParameterfvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixFrustumEXT -.type bluegl_glMatrixFrustumEXT, %function -bluegl_glMatrixFrustumEXT: - mov __blue_glCore_glMatrixFrustumEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGenFragmentShadersATI +.type bluegl_glGenFragmentShadersATI, %function +bluegl_glGenFragmentShadersATI: + mov __blue_glCore_glGenFragmentShadersATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsBufferARB -.type bluegl_glIsBufferARB, %function -bluegl_glIsBufferARB: - mov __blue_glCore_glIsBufferARB@GOTPCREL(%rip), %r11 +.global bluegl_glBindFragmentShaderATI +.type bluegl_glBindFragmentShaderATI, %function +bluegl_glBindFragmentShaderATI: + mov __blue_glCore_glBindFragmentShaderATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3fvARB -.type bluegl_glUniform3fvARB, %function -bluegl_glUniform3fvARB: - mov __blue_glCore_glUniform3fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteFragmentShaderATI +.type bluegl_glDeleteFragmentShaderATI, %function +bluegl_glDeleteFragmentShaderATI: + mov __blue_glCore_glDeleteFragmentShaderATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3dARB -.type bluegl_glMultiTexCoord3dARB, %function -bluegl_glMultiTexCoord3dARB: - mov __blue_glCore_glMultiTexCoord3dARB@GOTPCREL(%rip), %r11 +.global bluegl_glBeginFragmentShaderATI +.type bluegl_glBeginFragmentShaderATI, %function +bluegl_glBeginFragmentShaderATI: + mov __blue_glCore_glBeginFragmentShaderATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIndexPointerEXT -.type bluegl_glIndexPointerEXT, %function -bluegl_glIndexPointerEXT: - mov __blue_glCore_glIndexPointerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glEndFragmentShaderATI +.type bluegl_glEndFragmentShaderATI, %function +bluegl_glEndFragmentShaderATI: + mov __blue_glCore_glEndFragmentShaderATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixLoad3x3fNV -.type bluegl_glMatrixLoad3x3fNV, %function -bluegl_glMatrixLoad3x3fNV: - mov __blue_glCore_glMatrixLoad3x3fNV@GOTPCREL(%rip), %r11 +.global bluegl_glPassTexCoordATI +.type bluegl_glPassTexCoordATI, %function +bluegl_glPassTexCoordATI: + mov __blue_glCore_glPassTexCoordATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUnmapNamedBufferEXT -.type bluegl_glUnmapNamedBufferEXT, %function -bluegl_glUnmapNamedBufferEXT: - mov __blue_glCore_glUnmapNamedBufferEXT@GOTPCREL(%rip), %r11 +.global bluegl_glSampleMapATI +.type bluegl_glSampleMapATI, %function +bluegl_glSampleMapATI: + mov __blue_glCore_glSampleMapATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreateProgramObjectARB -.type bluegl_glCreateProgramObjectARB, %function -bluegl_glCreateProgramObjectARB: - mov __blue_glCore_glCreateProgramObjectARB@GOTPCREL(%rip), %r11 +.global bluegl_glColorFragmentOp1ATI +.type bluegl_glColorFragmentOp1ATI, %function +bluegl_glColorFragmentOp1ATI: + mov __blue_glCore_glColorFragmentOp1ATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMapGrid2xOES -.type bluegl_glMapGrid2xOES, %function -bluegl_glMapGrid2xOES: - mov __blue_glCore_glMapGrid2xOES@GOTPCREL(%rip), %r11 +.global bluegl_glColorFragmentOp2ATI +.type bluegl_glColorFragmentOp2ATI, %function +bluegl_glColorFragmentOp2ATI: + mov __blue_glCore_glColorFragmentOp2ATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexPointerEXT -.type bluegl_glVertexPointerEXT, %function -bluegl_glVertexPointerEXT: - mov __blue_glCore_glVertexPointerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glColorFragmentOp3ATI +.type bluegl_glColorFragmentOp3ATI, %function +bluegl_glColorFragmentOp3ATI: + mov __blue_glCore_glColorFragmentOp3ATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream4svATI -.type bluegl_glVertexStream4svATI, %function -bluegl_glVertexStream4svATI: - mov __blue_glCore_glVertexStream4svATI@GOTPCREL(%rip), %r11 +.global bluegl_glAlphaFragmentOp1ATI +.type bluegl_glAlphaFragmentOp1ATI, %function +bluegl_glAlphaFragmentOp1ATI: + mov __blue_glCore_glAlphaFragmentOp1ATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2hvNV -.type bluegl_glMultiTexCoord2hvNV, %function -bluegl_glMultiTexCoord2hvNV: - mov __blue_glCore_glMultiTexCoord2hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glAlphaFragmentOp2ATI +.type bluegl_glAlphaFragmentOp2ATI, %function +bluegl_glAlphaFragmentOp2ATI: + mov __blue_glCore_glAlphaFragmentOp2ATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLabelObjectEXT -.type bluegl_glLabelObjectEXT, %function -bluegl_glLabelObjectEXT: - mov __blue_glCore_glLabelObjectEXT@GOTPCREL(%rip), %r11 +.global bluegl_glAlphaFragmentOp3ATI +.type bluegl_glAlphaFragmentOp3ATI, %function +bluegl_glAlphaFragmentOp3ATI: + mov __blue_glCore_glAlphaFragmentOp3ATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureImage3DMultisampleNV -.type bluegl_glTextureImage3DMultisampleNV, %function -bluegl_glTextureImage3DMultisampleNV: - mov __blue_glCore_glTextureImage3DMultisampleNV@GOTPCREL(%rip), %r11 +.global bluegl_glSetFragmentShaderConstantATI +.type bluegl_glSetFragmentShaderConstantATI, %function +bluegl_glSetFragmentShaderConstantATI: + mov __blue_glCore_glSetFragmentShaderConstantATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultTransposeMatrixd -.type bluegl_glMultTransposeMatrixd, %function -bluegl_glMultTransposeMatrixd: - mov __blue_glCore_glMultTransposeMatrixd@GOTPCREL(%rip), %r11 +.global bluegl_glMapObjectBufferATI +.type bluegl_glMapObjectBufferATI, %function +bluegl_glMapObjectBufferATI: + mov __blue_glCore_glMapObjectBufferATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2fARB -.type bluegl_glMultiTexCoord2fARB, %function -bluegl_glMultiTexCoord2fARB: - mov __blue_glCore_glMultiTexCoord2fARB@GOTPCREL(%rip), %r11 +.global bluegl_glUnmapObjectBufferATI +.type bluegl_glUnmapObjectBufferATI, %function +bluegl_glUnmapObjectBufferATI: + mov __blue_glCore_glUnmapObjectBufferATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2dARB -.type bluegl_glMultiTexCoord2dARB, %function -bluegl_glMultiTexCoord2dARB: - mov __blue_glCore_glMultiTexCoord2dARB@GOTPCREL(%rip), %r11 +.global bluegl_glPNTrianglesiATI +.type bluegl_glPNTrianglesiATI, %function +bluegl_glPNTrianglesiATI: + mov __blue_glCore_glPNTrianglesiATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetCombinerOutputParameterfvNV -.type bluegl_glGetCombinerOutputParameterfvNV, %function -bluegl_glGetCombinerOutputParameterfvNV: - mov __blue_glCore_glGetCombinerOutputParameterfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glPNTrianglesfATI +.type bluegl_glPNTrianglesfATI, %function +bluegl_glPNTrianglesfATI: + mov __blue_glCore_glPNTrianglesfATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetBufferPointerv -.type bluegl_glGetBufferPointerv, %function -bluegl_glGetBufferPointerv: - mov __blue_glCore_glGetBufferPointerv@GOTPCREL(%rip), %r11 +.global bluegl_glStencilOpSeparateATI +.type bluegl_glStencilOpSeparateATI, %function +bluegl_glStencilOpSeparateATI: + mov __blue_glCore_glStencilOpSeparateATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1dNV -.type bluegl_glVertexAttrib1dNV, %function -bluegl_glVertexAttrib1dNV: - mov __blue_glCore_glVertexAttrib1dNV@GOTPCREL(%rip), %r11 +.global bluegl_glStencilFuncSeparateATI +.type bluegl_glStencilFuncSeparateATI, %function +bluegl_glStencilFuncSeparateATI: + mov __blue_glCore_glStencilFuncSeparateATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureView -.type bluegl_glTextureView, %function -bluegl_glTextureView: - mov __blue_glCore_glTextureView@GOTPCREL(%rip), %r11 +.global bluegl_glNewObjectBufferATI +.type bluegl_glNewObjectBufferATI, %function +bluegl_glNewObjectBufferATI: + mov __blue_glCore_glNewObjectBufferATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlitFramebufferEXT -.type bluegl_glBlitFramebufferEXT, %function -bluegl_glBlitFramebufferEXT: - mov __blue_glCore_glBlitFramebufferEXT@GOTPCREL(%rip), %r11 +.global bluegl_glIsObjectBufferATI +.type bluegl_glIsObjectBufferATI, %function +bluegl_glIsObjectBufferATI: + mov __blue_glCore_glIsObjectBufferATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexWeightPointerEXT -.type bluegl_glVertexWeightPointerEXT, %function -bluegl_glVertexWeightPointerEXT: - mov __blue_glCore_glVertexWeightPointerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glUpdateObjectBufferATI +.type bluegl_glUpdateObjectBufferATI, %function +bluegl_glUpdateObjectBufferATI: + mov __blue_glCore_glUpdateObjectBufferATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindTextures -.type bluegl_glBindTextures, %function -bluegl_glBindTextures: - mov __blue_glCore_glBindTextures@GOTPCREL(%rip), %r11 +.global bluegl_glGetObjectBufferfvATI +.type bluegl_glGetObjectBufferfvATI, %function +bluegl_glGetObjectBufferfvATI: + mov __blue_glCore_glGetObjectBufferfvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearBufferiv -.type bluegl_glClearBufferiv, %function -bluegl_glClearBufferiv: - mov __blue_glCore_glClearBufferiv@GOTPCREL(%rip), %r11 +.global bluegl_glGetObjectBufferivATI +.type bluegl_glGetObjectBufferivATI, %function +bluegl_glGetObjectBufferivATI: + mov __blue_glCore_glGetObjectBufferivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4ivARB -.type bluegl_glMultiTexCoord4ivARB, %function -bluegl_glMultiTexCoord4ivARB: - mov __blue_glCore_glMultiTexCoord4ivARB@GOTPCREL(%rip), %r11 +.global bluegl_glFreeObjectBufferATI +.type bluegl_glFreeObjectBufferATI, %function +bluegl_glFreeObjectBufferATI: + mov __blue_glCore_glFreeObjectBufferATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetImageHandleNV -.type bluegl_glGetImageHandleNV, %function -bluegl_glGetImageHandleNV: - mov __blue_glCore_glGetImageHandleNV@GOTPCREL(%rip), %r11 +.global bluegl_glArrayObjectATI +.type bluegl_glArrayObjectATI, %function +bluegl_glArrayObjectATI: + mov __blue_glCore_glArrayObjectATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetDoublei_vEXT -.type bluegl_glGetDoublei_vEXT, %function -bluegl_glGetDoublei_vEXT: - mov __blue_glCore_glGetDoublei_vEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetArrayObjectfvATI +.type bluegl_glGetArrayObjectfvATI, %function +bluegl_glGetArrayObjectfvATI: + mov __blue_glCore_glGetArrayObjectfvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1i64NV -.type bluegl_glProgramUniform1i64NV, %function -bluegl_glProgramUniform1i64NV: - mov __blue_glCore_glProgramUniform1i64NV@GOTPCREL(%rip), %r11 +.global bluegl_glGetArrayObjectivATI +.type bluegl_glGetArrayObjectivATI, %function +bluegl_glGetArrayObjectivATI: + mov __blue_glCore_glGetArrayObjectivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN -.type bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN, %function -bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN: - mov __blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glVariantArrayObjectATI +.type bluegl_glVariantArrayObjectATI, %function +bluegl_glVariantArrayObjectATI: + mov __blue_glCore_glVariantArrayObjectATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3s -.type bluegl_glWindowPos3s, %function -bluegl_glWindowPos3s: - mov __blue_glCore_glWindowPos3s@GOTPCREL(%rip), %r11 +.global bluegl_glGetVariantArrayObjectfvATI +.type bluegl_glGetVariantArrayObjectfvATI, %function +bluegl_glGetVariantArrayObjectfvATI: + mov __blue_glCore_glGetVariantArrayObjectfvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4i64ARB -.type bluegl_glUniform4i64ARB, %function -bluegl_glUniform4i64ARB: - mov __blue_glCore_glUniform4i64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetVariantArrayObjectivATI +.type bluegl_glGetVariantArrayObjectivATI, %function +bluegl_glGetVariantArrayObjectivATI: + mov __blue_glCore_glGetVariantArrayObjectivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2dvEXT -.type bluegl_glProgramUniform2dvEXT, %function -bluegl_glProgramUniform2dvEXT: - mov __blue_glCore_glProgramUniform2dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribArrayObjectATI +.type bluegl_glVertexAttribArrayObjectATI, %function +bluegl_glVertexAttribArrayObjectATI: + mov __blue_glCore_glVertexAttribArrayObjectATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexSubImage1DEXT -.type bluegl_glMultiTexSubImage1DEXT, %function -bluegl_glMultiTexSubImage1DEXT: - mov __blue_glCore_glMultiTexSubImage1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribArrayObjectfvATI +.type bluegl_glGetVertexAttribArrayObjectfvATI, %function +bluegl_glGetVertexAttribArrayObjectfvATI: + mov __blue_glCore_glGetVertexAttribArrayObjectfvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glHint -.type bluegl_glHint, %function -bluegl_glHint: - mov __blue_glCore_glHint@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribArrayObjectivATI +.type bluegl_glGetVertexAttribArrayObjectivATI, %function +bluegl_glGetVertexAttribArrayObjectivATI: + mov __blue_glCore_glGetVertexAttribArrayObjectivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix4fv -.type bluegl_glProgramUniformMatrix4fv, %function -bluegl_glProgramUniformMatrix4fv: - mov __blue_glCore_glProgramUniformMatrix4fv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream1sATI +.type bluegl_glVertexStream1sATI, %function +bluegl_glVertexStream1sATI: + mov __blue_glCore_glVertexStream1sATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord4bvOES -.type bluegl_glTexCoord4bvOES, %function -bluegl_glTexCoord4bvOES: - mov __blue_glCore_glTexCoord4bvOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream1svATI +.type bluegl_glVertexStream1svATI, %function +bluegl_glVertexStream1svATI: + mov __blue_glCore_glVertexStream1svATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetQueryObjectiv -.type bluegl_glGetQueryObjectiv, %function -bluegl_glGetQueryObjectiv: - mov __blue_glCore_glGetQueryObjectiv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream1iATI +.type bluegl_glVertexStream1iATI, %function +bluegl_glVertexStream1iATI: + mov __blue_glCore_glVertexStream1iATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetQueryIndexediv -.type bluegl_glGetQueryIndexediv, %function -bluegl_glGetQueryIndexediv: - mov __blue_glCore_glGetQueryIndexediv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream1ivATI +.type bluegl_glVertexStream1ivATI, %function +bluegl_glVertexStream1ivATI: + mov __blue_glCore_glVertexStream1ivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoordP4ui -.type bluegl_glTexCoordP4ui, %function -bluegl_glTexCoordP4ui: - mov __blue_glCore_glTexCoordP4ui@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream1fATI +.type bluegl_glVertexStream1fATI, %function +bluegl_glVertexStream1fATI: + mov __blue_glCore_glVertexStream1fATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream2fvATI -.type bluegl_glVertexStream2fvATI, %function -bluegl_glVertexStream2fvATI: - mov __blue_glCore_glVertexStream2fvATI@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream1fvATI +.type bluegl_glVertexStream1fvATI, %function +bluegl_glVertexStream1fvATI: + mov __blue_glCore_glVertexStream1fvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3fv -.type bluegl_glUniform3fv, %function -bluegl_glUniform3fv: - mov __blue_glCore_glUniform3fv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream1dATI +.type bluegl_glVertexStream1dATI, %function +bluegl_glVertexStream1dATI: + mov __blue_glCore_glVertexStream1dATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix2dv -.type bluegl_glUniformMatrix2dv, %function -bluegl_glUniformMatrix2dv: - mov __blue_glCore_glUniformMatrix2dv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream1dvATI +.type bluegl_glVertexStream1dvATI, %function +bluegl_glVertexStream1dvATI: + mov __blue_glCore_glVertexStream1dvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsObjectBufferATI -.type bluegl_glIsObjectBufferATI, %function -bluegl_glIsObjectBufferATI: - mov __blue_glCore_glIsObjectBufferATI@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream2sATI +.type bluegl_glVertexStream2sATI, %function +bluegl_glVertexStream2sATI: + mov __blue_glCore_glVertexStream2sATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribP2uiv -.type bluegl_glVertexAttribP2uiv, %function -bluegl_glVertexAttribP2uiv: - mov __blue_glCore_glVertexAttribP2uiv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream2svATI +.type bluegl_glVertexStream2svATI, %function +bluegl_glVertexStream2svATI: + mov __blue_glCore_glVertexStream2svATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompileShader -.type bluegl_glCompileShader, %function -bluegl_glCompileShader: - mov __blue_glCore_glCompileShader@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream2iATI +.type bluegl_glVertexStream2iATI, %function +bluegl_glVertexStream2iATI: + mov __blue_glCore_glVertexStream2iATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixScalefEXT -.type bluegl_glMatrixScalefEXT, %function -bluegl_glMatrixScalefEXT: - mov __blue_glCore_glMatrixScalefEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream2ivATI +.type bluegl_glVertexStream2ivATI, %function +bluegl_glVertexStream2ivATI: + mov __blue_glCore_glVertexStream2ivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBinormal3ivEXT -.type bluegl_glBinormal3ivEXT, %function -bluegl_glBinormal3ivEXT: - mov __blue_glCore_glBinormal3ivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream2fATI +.type bluegl_glVertexStream2fATI, %function +bluegl_glVertexStream2fATI: + mov __blue_glCore_glVertexStream2fATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMapAttribParameterivNV -.type bluegl_glGetMapAttribParameterivNV, %function -bluegl_glGetMapAttribParameterivNV: - mov __blue_glCore_glGetMapAttribParameterivNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream2fvATI +.type bluegl_glVertexStream2fvATI, %function +bluegl_glVertexStream2fvATI: + mov __blue_glCore_glVertexStream2fvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnPixelMapusvARB -.type bluegl_glGetnPixelMapusvARB, %function -bluegl_glGetnPixelMapusvARB: - mov __blue_glCore_glGetnPixelMapusvARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream2dATI +.type bluegl_glVertexStream2dATI, %function +bluegl_glVertexStream2dATI: + mov __blue_glCore_glVertexStream2dATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPerfMonitorCounterStringAMD -.type bluegl_glGetPerfMonitorCounterStringAMD, %function -bluegl_glGetPerfMonitorCounterStringAMD: - mov __blue_glCore_glGetPerfMonitorCounterStringAMD@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream2dvATI +.type bluegl_glVertexStream2dvATI, %function +bluegl_glVertexStream2dvATI: + mov __blue_glCore_glVertexStream2dvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsTextureHandleResidentNV -.type bluegl_glIsTextureHandleResidentNV, %function -bluegl_glIsTextureHandleResidentNV: - mov __blue_glCore_glIsTextureHandleResidentNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream3sATI +.type bluegl_glVertexStream3sATI, %function +bluegl_glVertexStream3sATI: + mov __blue_glCore_glVertexStream3sATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWaitSync -.type bluegl_glWaitSync, %function -bluegl_glWaitSync: - mov __blue_glCore_glWaitSync@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream3svATI +.type bluegl_glVertexStream3svATI, %function +bluegl_glVertexStream3svATI: + mov __blue_glCore_glVertexStream3svATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenSamplers -.type bluegl_glGenSamplers, %function -bluegl_glGenSamplers: - mov __blue_glCore_glGenSamplers@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream3iATI +.type bluegl_glVertexStream3iATI, %function +bluegl_glVertexStream3iATI: + mov __blue_glCore_glVertexStream3iATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTextureImage3DEXT -.type bluegl_glCompressedTextureImage3DEXT, %function -bluegl_glCompressedTextureImage3DEXT: - mov __blue_glCore_glCompressedTextureImage3DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream3ivATI +.type bluegl_glVertexStream3ivATI, %function +bluegl_glVertexStream3ivATI: + mov __blue_glCore_glVertexStream3ivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPerfMonitorCounterInfoAMD -.type bluegl_glGetPerfMonitorCounterInfoAMD, %function -bluegl_glGetPerfMonitorCounterInfoAMD: - mov __blue_glCore_glGetPerfMonitorCounterInfoAMD@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream3fATI +.type bluegl_glVertexStream3fATI, %function +bluegl_glVertexStream3fATI: + mov __blue_glCore_glVertexStream3fATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2ivARB -.type bluegl_glUniform2ivARB, %function -bluegl_glUniform2ivARB: - mov __blue_glCore_glUniform2ivARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream3fvATI +.type bluegl_glVertexStream3fvATI, %function +bluegl_glVertexStream3fvATI: + mov __blue_glCore_glVertexStream3fvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib2sARB -.type bluegl_glVertexAttrib2sARB, %function -bluegl_glVertexAttrib2sARB: - mov __blue_glCore_glVertexAttrib2sARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream3dATI +.type bluegl_glVertexStream3dATI, %function +bluegl_glVertexStream3dATI: + mov __blue_glCore_glVertexStream3dATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawCommandsAddressNV -.type bluegl_glDrawCommandsAddressNV, %function -bluegl_glDrawCommandsAddressNV: - mov __blue_glCore_glDrawCommandsAddressNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream3dvATI +.type bluegl_glVertexStream3dvATI, %function +bluegl_glVertexStream3dvATI: + mov __blue_glCore_glVertexStream3dvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord1hNV -.type bluegl_glTexCoord1hNV, %function -bluegl_glTexCoord1hNV: - mov __blue_glCore_glTexCoord1hNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream4sATI +.type bluegl_glVertexStream4sATI, %function +bluegl_glVertexStream4sATI: + mov __blue_glCore_glVertexStream4sATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFirstPerfQueryIdINTEL -.type bluegl_glGetFirstPerfQueryIdINTEL, %function -bluegl_glGetFirstPerfQueryIdINTEL: - mov __blue_glCore_glGetFirstPerfQueryIdINTEL@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream4svATI +.type bluegl_glVertexStream4svATI, %function +bluegl_glVertexStream4svATI: + mov __blue_glCore_glVertexStream4svATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferTexture1D -.type bluegl_glFramebufferTexture1D, %function -bluegl_glFramebufferTexture1D: - mov __blue_glCore_glFramebufferTexture1D@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream4iATI +.type bluegl_glVertexStream4iATI, %function +bluegl_glVertexStream4iATI: + mov __blue_glCore_glVertexStream4iATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetQueryObjecti64v -.type bluegl_glGetQueryObjecti64v, %function -bluegl_glGetQueryObjecti64v: - mov __blue_glCore_glGetQueryObjecti64v@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream4ivATI +.type bluegl_glVertexStream4ivATI, %function +bluegl_glVertexStream4ivATI: + mov __blue_glCore_glVertexStream4ivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream1dvATI -.type bluegl_glVertexStream1dvATI, %function -bluegl_glVertexStream1dvATI: - mov __blue_glCore_glVertexStream1dvATI@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream4fATI +.type bluegl_glVertexStream4fATI, %function +bluegl_glVertexStream4fATI: + mov __blue_glCore_glVertexStream4fATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoordPointerListIBM -.type bluegl_glTexCoordPointerListIBM, %function -bluegl_glTexCoordPointerListIBM: - mov __blue_glCore_glTexCoordPointerListIBM@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream4fvATI +.type bluegl_glVertexStream4fvATI, %function +bluegl_glVertexStream4fvATI: + mov __blue_glCore_glVertexStream4fvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexImage1D -.type bluegl_glTexImage1D, %function -bluegl_glTexImage1D: - mov __blue_glCore_glTexImage1D@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream4dATI +.type bluegl_glVertexStream4dATI, %function +bluegl_glVertexStream4dATI: + mov __blue_glCore_glVertexStream4dATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2fvMESA -.type bluegl_glWindowPos2fvMESA, %function -bluegl_glWindowPos2fvMESA: - mov __blue_glCore_glWindowPos2fvMESA@GOTPCREL(%rip), %r11 +.global bluegl_glVertexStream4dvATI +.type bluegl_glVertexStream4dvATI, %function +bluegl_glVertexStream4dvATI: + mov __blue_glCore_glVertexStream4dvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsFenceNV -.type bluegl_glIsFenceNV, %function -bluegl_glIsFenceNV: - mov __blue_glCore_glIsFenceNV@GOTPCREL(%rip), %r11 +.global bluegl_glNormalStream3bATI +.type bluegl_glNormalStream3bATI, %function +bluegl_glNormalStream3bATI: + mov __blue_glCore_glNormalStream3bATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVariantsvEXT -.type bluegl_glVariantsvEXT, %function -bluegl_glVariantsvEXT: - mov __blue_glCore_glVariantsvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glNormalStream3bvATI +.type bluegl_glNormalStream3bvATI, %function +bluegl_glNormalStream3bvATI: + mov __blue_glCore_glNormalStream3bvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3dEXT -.type bluegl_glProgramUniform3dEXT, %function -bluegl_glProgramUniform3dEXT: - mov __blue_glCore_glProgramUniform3dEXT@GOTPCREL(%rip), %r11 +.global bluegl_glNormalStream3sATI +.type bluegl_glNormalStream3sATI, %function +bluegl_glNormalStream3sATI: + mov __blue_glCore_glNormalStream3sATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2iARB -.type bluegl_glUniform2iARB, %function -bluegl_glUniform2iARB: - mov __blue_glCore_glUniform2iARB@GOTPCREL(%rip), %r11 +.global bluegl_glNormalStream3svATI +.type bluegl_glNormalStream3svATI, %function +bluegl_glNormalStream3svATI: + mov __blue_glCore_glNormalStream3svATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPointParameteri -.type bluegl_glPointParameteri, %function -bluegl_glPointParameteri: - mov __blue_glCore_glPointParameteri@GOTPCREL(%rip), %r11 +.global bluegl_glNormalStream3iATI +.type bluegl_glNormalStream3iATI, %function +bluegl_glNormalStream3iATI: + mov __blue_glCore_glNormalStream3iATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreateRenderbuffers -.type bluegl_glCreateRenderbuffers, %function -bluegl_glCreateRenderbuffers: - mov __blue_glCore_glCreateRenderbuffers@GOTPCREL(%rip), %r11 +.global bluegl_glNormalStream3ivATI +.type bluegl_glNormalStream3ivATI, %function +bluegl_glNormalStream3ivATI: + mov __blue_glCore_glNormalStream3ivATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4i -.type bluegl_glUniform4i, %function -bluegl_glUniform4i: - mov __blue_glCore_glUniform4i@GOTPCREL(%rip), %r11 +.global bluegl_glNormalStream3fATI +.type bluegl_glNormalStream3fATI, %function +bluegl_glNormalStream3fATI: + mov __blue_glCore_glNormalStream3fATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteCommandListsNV -.type bluegl_glDeleteCommandListsNV, %function -bluegl_glDeleteCommandListsNV: - mov __blue_glCore_glDeleteCommandListsNV@GOTPCREL(%rip), %r11 +.global bluegl_glNormalStream3fvATI +.type bluegl_glNormalStream3fvATI, %function +bluegl_glNormalStream3fvATI: + mov __blue_glCore_glNormalStream3fvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glRequestResidentProgramsNV -.type bluegl_glRequestResidentProgramsNV, %function -bluegl_glRequestResidentProgramsNV: - mov __blue_glCore_glRequestResidentProgramsNV@GOTPCREL(%rip), %r11 +.global bluegl_glNormalStream3dATI +.type bluegl_glNormalStream3dATI, %function +bluegl_glNormalStream3dATI: + mov __blue_glCore_glNormalStream3dATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureSubImage3D -.type bluegl_glTextureSubImage3D, %function -bluegl_glTextureSubImage3D: - mov __blue_glCore_glTextureSubImage3D@GOTPCREL(%rip), %r11 +.global bluegl_glNormalStream3dvATI +.type bluegl_glNormalStream3dvATI, %function +bluegl_glNormalStream3dvATI: + mov __blue_glCore_glNormalStream3dvATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPixelStorex -.type bluegl_glPixelStorex, %function -bluegl_glPixelStorex: - mov __blue_glCore_glPixelStorex@GOTPCREL(%rip), %r11 +.global bluegl_glClientActiveVertexStreamATI +.type bluegl_glClientActiveVertexStreamATI, %function +bluegl_glClientActiveVertexStreamATI: + mov __blue_glCore_glClientActiveVertexStreamATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4fARB -.type bluegl_glVertexAttrib4fARB, %function -bluegl_glVertexAttrib4fARB: - mov __blue_glCore_glVertexAttrib4fARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexBlendEnviATI +.type bluegl_glVertexBlendEnviATI, %function +bluegl_glVertexBlendEnviATI: + mov __blue_glCore_glVertexBlendEnviATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribIuiv -.type bluegl_glGetVertexAttribIuiv, %function -bluegl_glGetVertexAttribIuiv: - mov __blue_glCore_glGetVertexAttribIuiv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexBlendEnvfATI +.type bluegl_glVertexBlendEnvfATI, %function +bluegl_glVertexBlendEnvfATI: + mov __blue_glCore_glVertexBlendEnvfATI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1s -.type bluegl_glVertexAttrib1s, %function -bluegl_glVertexAttrib1s: - mov __blue_glCore_glVertexAttrib1s@GOTPCREL(%rip), %r11 +.global bluegl_glUniformBufferEXT +.type bluegl_glUniformBufferEXT, %function +bluegl_glUniformBufferEXT: + mov __blue_glCore_glUniformBufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix4x3dv -.type bluegl_glProgramUniformMatrix4x3dv, %function -bluegl_glProgramUniformMatrix4x3dv: - mov __blue_glCore_glProgramUniformMatrix4x3dv@GOTPCREL(%rip), %r11 +.global bluegl_glGetUniformBufferSizeEXT +.type bluegl_glGetUniformBufferSizeEXT, %function +bluegl_glGetUniformBufferSizeEXT: + mov __blue_glCore_glGetUniformBufferSizeEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glActiveVaryingNV -.type bluegl_glActiveVaryingNV, %function -bluegl_glActiveVaryingNV: - mov __blue_glCore_glActiveVaryingNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetUniformOffsetEXT +.type bluegl_glGetUniformOffsetEXT, %function +bluegl_glGetUniformOffsetEXT: + mov __blue_glCore_glGetUniformOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTangent3sEXT -.type bluegl_glTangent3sEXT, %function -bluegl_glTangent3sEXT: - mov __blue_glCore_glTangent3sEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBlendColorEXT +.type bluegl_glBlendColorEXT, %function +bluegl_glBlendColorEXT: + mov __blue_glCore_glBlendColorEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glConvolutionParameteriv -.type bluegl_glConvolutionParameteriv, %function -bluegl_glConvolutionParameteriv: - mov __blue_glCore_glConvolutionParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glBlendEquationSeparateEXT +.type bluegl_glBlendEquationSeparateEXT, %function +bluegl_glBlendEquationSeparateEXT: + mov __blue_glCore_glBlendEquationSeparateEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glQueryCounter -.type bluegl_glQueryCounter, %function -bluegl_glQueryCounter: - mov __blue_glCore_glQueryCounter@GOTPCREL(%rip), %r11 +.global bluegl_glBlendFuncSeparateEXT +.type bluegl_glBlendFuncSeparateEXT, %function +bluegl_glBlendFuncSeparateEXT: + mov __blue_glCore_glBlendFuncSeparateEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3d -.type bluegl_glProgramUniform3d, %function -bluegl_glProgramUniform3d: - mov __blue_glCore_glProgramUniform3d@GOTPCREL(%rip), %r11 +.global bluegl_glBlendEquationEXT +.type bluegl_glBlendEquationEXT, %function +bluegl_glBlendEquationEXT: + mov __blue_glCore_glBlendEquationEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetUniformi64vARB -.type bluegl_glGetUniformi64vARB, %function -bluegl_glGetUniformi64vARB: - mov __blue_glCore_glGetUniformi64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glColorSubTableEXT +.type bluegl_glColorSubTableEXT, %function +bluegl_glColorSubTableEXT: + mov __blue_glCore_glColorSubTableEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnUniformui64vARB -.type bluegl_glGetnUniformui64vARB, %function -bluegl_glGetnUniformui64vARB: - mov __blue_glCore_glGetnUniformui64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glCopyColorSubTableEXT +.type bluegl_glCopyColorSubTableEXT, %function +bluegl_glCopyColorSubTableEXT: + mov __blue_glCore_glCopyColorSubTableEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedProgramLocalParameters4fvEXT -.type bluegl_glNamedProgramLocalParameters4fvEXT, %function -bluegl_glNamedProgramLocalParameters4fvEXT: - mov __blue_glCore_glNamedProgramLocalParameters4fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glLockArraysEXT +.type bluegl_glLockArraysEXT, %function +bluegl_glLockArraysEXT: + mov __blue_glCore_glLockArraysEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetShaderSource -.type bluegl_glGetShaderSource, %function -bluegl_glGetShaderSource: - mov __blue_glCore_glGetShaderSource@GOTPCREL(%rip), %r11 +.global bluegl_glUnlockArraysEXT +.type bluegl_glUnlockArraysEXT, %function +bluegl_glUnlockArraysEXT: + mov __blue_glCore_glUnlockArraysEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearDepthdNV -.type bluegl_glClearDepthdNV, %function -bluegl_glClearDepthdNV: - mov __blue_glCore_glClearDepthdNV@GOTPCREL(%rip), %r11 +.global bluegl_glConvolutionFilter1DEXT +.type bluegl_glConvolutionFilter1DEXT, %function +bluegl_glConvolutionFilter1DEXT: + mov __blue_glCore_glConvolutionFilter1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColorP3ui -.type bluegl_glSecondaryColorP3ui, %function -bluegl_glSecondaryColorP3ui: - mov __blue_glCore_glSecondaryColorP3ui@GOTPCREL(%rip), %r11 +.global bluegl_glConvolutionFilter2DEXT +.type bluegl_glConvolutionFilter2DEXT, %function +bluegl_glConvolutionFilter2DEXT: + mov __blue_glCore_glConvolutionFilter2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMinmax -.type bluegl_glMinmax, %function -bluegl_glMinmax: - mov __blue_glCore_glMinmax@GOTPCREL(%rip), %r11 +.global bluegl_glConvolutionParameterfEXT +.type bluegl_glConvolutionParameterfEXT, %function +bluegl_glConvolutionParameterfEXT: + mov __blue_glCore_glConvolutionParameterfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVariantubvEXT -.type bluegl_glVariantubvEXT, %function -bluegl_glVariantubvEXT: - mov __blue_glCore_glVariantubvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glConvolutionParameterfvEXT +.type bluegl_glConvolutionParameterfvEXT, %function +bluegl_glConvolutionParameterfvEXT: + mov __blue_glCore_glConvolutionParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBinormal3sEXT -.type bluegl_glBinormal3sEXT, %function -bluegl_glBinormal3sEXT: - mov __blue_glCore_glBinormal3sEXT@GOTPCREL(%rip), %r11 +.global bluegl_glConvolutionParameteriEXT +.type bluegl_glConvolutionParameteriEXT, %function +bluegl_glConvolutionParameteriEXT: + mov __blue_glCore_glConvolutionParameteriEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4d -.type bluegl_glVertexAttrib4d, %function -bluegl_glVertexAttrib4d: - mov __blue_glCore_glVertexAttrib4d@GOTPCREL(%rip), %r11 +.global bluegl_glConvolutionParameterivEXT +.type bluegl_glConvolutionParameterivEXT, %function +bluegl_glConvolutionParameterivEXT: + mov __blue_glCore_glConvolutionParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEndTransformFeedbackEXT -.type bluegl_glEndTransformFeedbackEXT, %function -bluegl_glEndTransformFeedbackEXT: - mov __blue_glCore_glEndTransformFeedbackEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCopyConvolutionFilter1DEXT +.type bluegl_glCopyConvolutionFilter1DEXT, %function +bluegl_glCopyConvolutionFilter1DEXT: + mov __blue_glCore_glCopyConvolutionFilter1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexImage2DMultisample -.type bluegl_glTexImage2DMultisample, %function -bluegl_glTexImage2DMultisample: - mov __blue_glCore_glTexImage2DMultisample@GOTPCREL(%rip), %r11 +.global bluegl_glCopyConvolutionFilter2DEXT +.type bluegl_glCopyConvolutionFilter2DEXT, %function +bluegl_glCopyConvolutionFilter2DEXT: + mov __blue_glCore_glCopyConvolutionFilter2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLoadMatrixxOES -.type bluegl_glLoadMatrixxOES, %function -bluegl_glLoadMatrixxOES: - mov __blue_glCore_glLoadMatrixxOES@GOTPCREL(%rip), %r11 +.global bluegl_glGetConvolutionFilterEXT +.type bluegl_glGetConvolutionFilterEXT, %function +bluegl_glGetConvolutionFilterEXT: + mov __blue_glCore_glGetConvolutionFilterEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetUniformfv -.type bluegl_glGetUniformfv, %function -bluegl_glGetUniformfv: - mov __blue_glCore_glGetUniformfv@GOTPCREL(%rip), %r11 +.global bluegl_glGetConvolutionParameterfvEXT +.type bluegl_glGetConvolutionParameterfvEXT, %function +bluegl_glGetConvolutionParameterfvEXT: + mov __blue_glCore_glGetConvolutionParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStartInstrumentsSGIX -.type bluegl_glStartInstrumentsSGIX, %function -bluegl_glStartInstrumentsSGIX: - mov __blue_glCore_glStartInstrumentsSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glGetConvolutionParameterivEXT +.type bluegl_glGetConvolutionParameterivEXT, %function +bluegl_glGetConvolutionParameterivEXT: + mov __blue_glCore_glGetConvolutionParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColor4ubVertex3fvSUN -.type bluegl_glColor4ubVertex3fvSUN, %function -bluegl_glColor4ubVertex3fvSUN: - mov __blue_glCore_glColor4ubVertex3fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glGetSeparableFilterEXT +.type bluegl_glGetSeparableFilterEXT, %function +bluegl_glGetSeparableFilterEXT: + mov __blue_glCore_glGetSeparableFilterEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixLoadTransposefEXT -.type bluegl_glMatrixLoadTransposefEXT, %function -bluegl_glMatrixLoadTransposefEXT: - mov __blue_glCore_glMatrixLoadTransposefEXT@GOTPCREL(%rip), %r11 +.global bluegl_glSeparableFilter2DEXT +.type bluegl_glSeparableFilter2DEXT, %function +bluegl_glSeparableFilter2DEXT: + mov __blue_glCore_glSeparableFilter2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetCompressedTexImage -.type bluegl_glGetCompressedTexImage, %function -bluegl_glGetCompressedTexImage: - mov __blue_glCore_glGetCompressedTexImage@GOTPCREL(%rip), %r11 +.global bluegl_glTangent3bEXT +.type bluegl_glTangent3bEXT, %function +bluegl_glTangent3bEXT: + mov __blue_glCore_glTangent3bEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedProgramLocalParameterdvEXT -.type bluegl_glGetNamedProgramLocalParameterdvEXT, %function -bluegl_glGetNamedProgramLocalParameterdvEXT: - mov __blue_glCore_glGetNamedProgramLocalParameterdvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTangent3bvEXT +.type bluegl_glTangent3bvEXT, %function +bluegl_glTangent3bvEXT: + mov __blue_glCore_glTangent3bvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorPointerEXT -.type bluegl_glColorPointerEXT, %function -bluegl_glColorPointerEXT: - mov __blue_glCore_glColorPointerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTangent3dEXT +.type bluegl_glTangent3dEXT, %function +bluegl_glTangent3dEXT: + mov __blue_glCore_glTangent3dEXT@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glTangent3dvEXT +.type bluegl_glTangent3dvEXT, %function +bluegl_glTangent3dvEXT: + mov __blue_glCore_glTangent3dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) .global bluegl_glTangent3fEXT @@ -8863,712 +8808,736 @@ bluegl_glTangent3fEXT: mov __blue_glCore_glTangent3fEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2dvARB -.type bluegl_glWindowPos2dvARB, %function -bluegl_glWindowPos2dvARB: - mov __blue_glCore_glWindowPos2dvARB@GOTPCREL(%rip), %r11 +.global bluegl_glTangent3fvEXT +.type bluegl_glTangent3fvEXT, %function +bluegl_glTangent3fvEXT: + mov __blue_glCore_glTangent3fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetInvariantIntegervEXT -.type bluegl_glGetInvariantIntegervEXT, %function -bluegl_glGetInvariantIntegervEXT: - mov __blue_glCore_glGetInvariantIntegervEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTangent3iEXT +.type bluegl_glTangent3iEXT, %function +bluegl_glTangent3iEXT: + mov __blue_glCore_glTangent3iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3fEXT -.type bluegl_glProgramUniform3fEXT, %function -bluegl_glProgramUniform3fEXT: - mov __blue_glCore_glProgramUniform3fEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTangent3ivEXT +.type bluegl_glTangent3ivEXT, %function +bluegl_glTangent3ivEXT: + mov __blue_glCore_glTangent3ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPixelTexGenSGIX -.type bluegl_glPixelTexGenSGIX, %function -bluegl_glPixelTexGenSGIX: - mov __blue_glCore_glPixelTexGenSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glTangent3sEXT +.type bluegl_glTangent3sEXT, %function +bluegl_glTangent3sEXT: + mov __blue_glCore_glTangent3sEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClampColor -.type bluegl_glClampColor, %function -bluegl_glClampColor: - mov __blue_glCore_glClampColor@GOTPCREL(%rip), %r11 +.global bluegl_glTangent3svEXT +.type bluegl_glTangent3svEXT, %function +bluegl_glTangent3svEXT: + mov __blue_glCore_glTangent3svEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribs4hvNV -.type bluegl_glVertexAttribs4hvNV, %function -bluegl_glVertexAttribs4hvNV: - mov __blue_glCore_glVertexAttribs4hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glBinormal3bEXT +.type bluegl_glBinormal3bEXT, %function +bluegl_glBinormal3bEXT: + mov __blue_glCore_glBinormal3bEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetIntegeri_v -.type bluegl_glGetIntegeri_v, %function -bluegl_glGetIntegeri_v: - mov __blue_glCore_glGetIntegeri_v@GOTPCREL(%rip), %r11 +.global bluegl_glBinormal3bvEXT +.type bluegl_glBinormal3bvEXT, %function +bluegl_glBinormal3bvEXT: + mov __blue_glCore_glBinormal3bvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteVertexArraysAPPLE -.type bluegl_glDeleteVertexArraysAPPLE, %function -bluegl_glDeleteVertexArraysAPPLE: - mov __blue_glCore_glDeleteVertexArraysAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glBinormal3dEXT +.type bluegl_glBinormal3dEXT, %function +bluegl_glBinormal3dEXT: + mov __blue_glCore_glBinormal3dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetAttachedShaders -.type bluegl_glGetAttachedShaders, %function -bluegl_glGetAttachedShaders: - mov __blue_glCore_glGetAttachedShaders@GOTPCREL(%rip), %r11 +.global bluegl_glBinormal3dvEXT +.type bluegl_glBinormal3dvEXT, %function +bluegl_glBinormal3dvEXT: + mov __blue_glCore_glBinormal3dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEndTransformFeedbackNV -.type bluegl_glEndTransformFeedbackNV, %function -bluegl_glEndTransformFeedbackNV: - mov __blue_glCore_glEndTransformFeedbackNV@GOTPCREL(%rip), %r11 +.global bluegl_glBinormal3fEXT +.type bluegl_glBinormal3fEXT, %function +bluegl_glBinormal3fEXT: + mov __blue_glCore_glBinormal3fEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetColorTableParameterfvSGI -.type bluegl_glGetColorTableParameterfvSGI, %function -bluegl_glGetColorTableParameterfvSGI: - mov __blue_glCore_glGetColorTableParameterfvSGI@GOTPCREL(%rip), %r11 +.global bluegl_glBinormal3fvEXT +.type bluegl_glBinormal3fvEXT, %function +bluegl_glBinormal3fvEXT: + mov __blue_glCore_glBinormal3fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindBufferBase -.type bluegl_glBindBufferBase, %function -bluegl_glBindBufferBase: - mov __blue_glCore_glBindBufferBase@GOTPCREL(%rip), %r11 +.global bluegl_glBinormal3iEXT +.type bluegl_glBinormal3iEXT, %function +bluegl_glBinormal3iEXT: + mov __blue_glCore_glBinormal3iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteSync -.type bluegl_glDeleteSync, %function -bluegl_glDeleteSync: - mov __blue_glCore_glDeleteSync@GOTPCREL(%rip), %r11 +.global bluegl_glBinormal3ivEXT +.type bluegl_glBinormal3ivEXT, %function +bluegl_glBinormal3ivEXT: + mov __blue_glCore_glBinormal3ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTransformFeedbackVarying -.type bluegl_glGetTransformFeedbackVarying, %function -bluegl_glGetTransformFeedbackVarying: - mov __blue_glCore_glGetTransformFeedbackVarying@GOTPCREL(%rip), %r11 +.global bluegl_glBinormal3sEXT +.type bluegl_glBinormal3sEXT, %function +bluegl_glBinormal3sEXT: + mov __blue_glCore_glBinormal3sEXT@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glBinormal3svEXT +.type bluegl_glBinormal3svEXT, %function +bluegl_glBinormal3svEXT: + mov __blue_glCore_glBinormal3svEXT@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glTangentPointerEXT +.type bluegl_glTangentPointerEXT, %function +bluegl_glTangentPointerEXT: + mov __blue_glCore_glTangentPointerEXT@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glBinormalPointerEXT +.type bluegl_glBinormalPointerEXT, %function +bluegl_glBinormalPointerEXT: + mov __blue_glCore_glBinormalPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1svARB -.type bluegl_glVertexAttrib1svARB, %function -bluegl_glVertexAttrib1svARB: - mov __blue_glCore_glVertexAttrib1svARB@GOTPCREL(%rip), %r11 +.global bluegl_glCopyTexImage1DEXT +.type bluegl_glCopyTexImage1DEXT, %function +bluegl_glCopyTexImage1DEXT: + mov __blue_glCore_glCopyTexImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyPathNV -.type bluegl_glCopyPathNV, %function -bluegl_glCopyPathNV: - mov __blue_glCore_glCopyPathNV@GOTPCREL(%rip), %r11 +.global bluegl_glCopyTexImage2DEXT +.type bluegl_glCopyTexImage2DEXT, %function +bluegl_glCopyTexImage2DEXT: + mov __blue_glCore_glCopyTexImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindTransformFeedback -.type bluegl_glBindTransformFeedback, %function -bluegl_glBindTransformFeedback: - mov __blue_glCore_glBindTransformFeedback@GOTPCREL(%rip), %r11 +.global bluegl_glCopyTexSubImage1DEXT +.type bluegl_glCopyTexSubImage1DEXT, %function +bluegl_glCopyTexSubImage1DEXT: + mov __blue_glCore_glCopyTexSubImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4usv -.type bluegl_glVertexAttrib4usv, %function -bluegl_glVertexAttrib4usv: - mov __blue_glCore_glVertexAttrib4usv@GOTPCREL(%rip), %r11 +.global bluegl_glCopyTexSubImage2DEXT +.type bluegl_glCopyTexSubImage2DEXT, %function +bluegl_glCopyTexSubImage2DEXT: + mov __blue_glCore_glCopyTexSubImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedMultiTexImage3DEXT -.type bluegl_glCompressedMultiTexImage3DEXT, %function -bluegl_glCompressedMultiTexImage3DEXT: - mov __blue_glCore_glCompressedMultiTexImage3DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCopyTexSubImage3DEXT +.type bluegl_glCopyTexSubImage3DEXT, %function +bluegl_glCopyTexSubImage3DEXT: + mov __blue_glCore_glCopyTexSubImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixLoadTranspose3x3fNV -.type bluegl_glMatrixLoadTranspose3x3fNV, %function -bluegl_glMatrixLoadTranspose3x3fNV: - mov __blue_glCore_glMatrixLoadTranspose3x3fNV@GOTPCREL(%rip), %r11 +.global bluegl_glCullParameterdvEXT +.type bluegl_glCullParameterdvEXT, %function +bluegl_glCullParameterdvEXT: + mov __blue_glCore_glCullParameterdvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream1sATI -.type bluegl_glVertexStream1sATI, %function -bluegl_glVertexStream1sATI: - mov __blue_glCore_glVertexStream1sATI@GOTPCREL(%rip), %r11 +.global bluegl_glCullParameterfvEXT +.type bluegl_glCullParameterfvEXT, %function +bluegl_glCullParameterfvEXT: + mov __blue_glCore_glCullParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiDrawArraysIndirectBindlessNV -.type bluegl_glMultiDrawArraysIndirectBindlessNV, %function -bluegl_glMultiDrawArraysIndirectBindlessNV: - mov __blue_glCore_glMultiDrawArraysIndirectBindlessNV@GOTPCREL(%rip), %r11 +.global bluegl_glLabelObjectEXT +.type bluegl_glLabelObjectEXT, %function +bluegl_glLabelObjectEXT: + mov __blue_glCore_glLabelObjectEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexParameterIuiv -.type bluegl_glTexParameterIuiv, %function -bluegl_glTexParameterIuiv: - mov __blue_glCore_glTexParameterIuiv@GOTPCREL(%rip), %r11 +.global bluegl_glGetObjectLabelEXT +.type bluegl_glGetObjectLabelEXT, %function +bluegl_glGetObjectLabelEXT: + mov __blue_glCore_glGetObjectLabelEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVDPAUFiniNV -.type bluegl_glVDPAUFiniNV, %function -bluegl_glVDPAUFiniNV: - mov __blue_glCore_glVDPAUFiniNV@GOTPCREL(%rip), %r11 +.global bluegl_glInsertEventMarkerEXT +.type bluegl_glInsertEventMarkerEXT, %function +bluegl_glInsertEventMarkerEXT: + mov __blue_glCore_glInsertEventMarkerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1iv -.type bluegl_glUniform1iv, %function -bluegl_glUniform1iv: - mov __blue_glCore_glUniform1iv@GOTPCREL(%rip), %r11 +.global bluegl_glPushGroupMarkerEXT +.type bluegl_glPushGroupMarkerEXT, %function +bluegl_glPushGroupMarkerEXT: + mov __blue_glCore_glPushGroupMarkerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStencilThenCoverStrokePathNV -.type bluegl_glStencilThenCoverStrokePathNV, %function -bluegl_glStencilThenCoverStrokePathNV: - mov __blue_glCore_glStencilThenCoverStrokePathNV@GOTPCREL(%rip), %r11 +.global bluegl_glPopGroupMarkerEXT +.type bluegl_glPopGroupMarkerEXT, %function +bluegl_glPopGroupMarkerEXT: + mov __blue_glCore_glPopGroupMarkerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3i64vNV -.type bluegl_glUniform3i64vNV, %function -bluegl_glUniform3i64vNV: - mov __blue_glCore_glUniform3i64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glDepthBoundsEXT +.type bluegl_glDepthBoundsEXT, %function +bluegl_glDepthBoundsEXT: + mov __blue_glCore_glDepthBoundsEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFragDataLocationEXT -.type bluegl_glGetFragDataLocationEXT, %function -bluegl_glGetFragDataLocationEXT: - mov __blue_glCore_glGetFragDataLocationEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixLoadfEXT +.type bluegl_glMatrixLoadfEXT, %function +bluegl_glMatrixLoadfEXT: + mov __blue_glCore_glMatrixLoadfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix4dv -.type bluegl_glProgramUniformMatrix4dv, %function -bluegl_glProgramUniformMatrix4dv: - mov __blue_glCore_glProgramUniformMatrix4dv@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixLoaddEXT +.type bluegl_glMatrixLoaddEXT, %function +bluegl_glMatrixLoaddEXT: + mov __blue_glCore_glMatrixLoaddEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnUniformiv -.type bluegl_glGetnUniformiv, %function -bluegl_glGetnUniformiv: - mov __blue_glCore_glGetnUniformiv@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixMultfEXT +.type bluegl_glMatrixMultfEXT, %function +bluegl_glMatrixMultfEXT: + mov __blue_glCore_glMatrixMultfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMapBuffer -.type bluegl_glMapBuffer, %function -bluegl_glMapBuffer: - mov __blue_glCore_glMapBuffer@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixMultdEXT +.type bluegl_glMatrixMultdEXT, %function +bluegl_glMatrixMultdEXT: + mov __blue_glCore_glMatrixMultdEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glScissorIndexed -.type bluegl_glScissorIndexed, %function -bluegl_glScissorIndexed: - mov __blue_glCore_glScissorIndexed@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixLoadIdentityEXT +.type bluegl_glMatrixLoadIdentityEXT, %function +bluegl_glMatrixLoadIdentityEXT: + mov __blue_glCore_glMatrixLoadIdentityEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3fARB -.type bluegl_glUniform3fARB, %function -bluegl_glUniform3fARB: - mov __blue_glCore_glUniform3fARB@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixRotatefEXT +.type bluegl_glMatrixRotatefEXT, %function +bluegl_glMatrixRotatefEXT: + mov __blue_glCore_glMatrixRotatefEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetColorTable -.type bluegl_glGetColorTable, %function -bluegl_glGetColorTable: - mov __blue_glCore_glGetColorTable@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixRotatedEXT +.type bluegl_glMatrixRotatedEXT, %function +bluegl_glMatrixRotatedEXT: + mov __blue_glCore_glMatrixRotatedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferTextureFaceARB -.type bluegl_glFramebufferTextureFaceARB, %function -bluegl_glFramebufferTextureFaceARB: - mov __blue_glCore_glFramebufferTextureFaceARB@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixScalefEXT +.type bluegl_glMatrixScalefEXT, %function +bluegl_glMatrixScalefEXT: + mov __blue_glCore_glMatrixScalefEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBeginTransformFeedbackEXT -.type bluegl_glBeginTransformFeedbackEXT, %function -bluegl_glBeginTransformFeedbackEXT: - mov __blue_glCore_glBeginTransformFeedbackEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixScaledEXT +.type bluegl_glMatrixScaledEXT, %function +bluegl_glMatrixScaledEXT: + mov __blue_glCore_glMatrixScaledEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenFencesNV -.type bluegl_glGenFencesNV, %function -bluegl_glGenFencesNV: - mov __blue_glCore_glGenFencesNV@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixTranslatefEXT +.type bluegl_glMatrixTranslatefEXT, %function +bluegl_glMatrixTranslatefEXT: + mov __blue_glCore_glMatrixTranslatefEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexImage2DEXT -.type bluegl_glMultiTexImage2DEXT, %function -bluegl_glMultiTexImage2DEXT: - mov __blue_glCore_glMultiTexImage2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixTranslatedEXT +.type bluegl_glMatrixTranslatedEXT, %function +bluegl_glMatrixTranslatedEXT: + mov __blue_glCore_glMatrixTranslatedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib2hNV -.type bluegl_glVertexAttrib2hNV, %function -bluegl_glVertexAttrib2hNV: - mov __blue_glCore_glVertexAttrib2hNV@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixFrustumEXT +.type bluegl_glMatrixFrustumEXT, %function +bluegl_glMatrixFrustumEXT: + mov __blue_glCore_glMatrixFrustumEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFragmentLightfvSGIX -.type bluegl_glFragmentLightfvSGIX, %function -bluegl_glFragmentLightfvSGIX: - mov __blue_glCore_glFragmentLightfvSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixOrthoEXT +.type bluegl_glMatrixOrthoEXT, %function +bluegl_glMatrixOrthoEXT: + mov __blue_glCore_glMatrixOrthoEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2iv -.type bluegl_glProgramUniform2iv, %function -bluegl_glProgramUniform2iv: - mov __blue_glCore_glProgramUniform2iv@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixPopEXT +.type bluegl_glMatrixPopEXT, %function +bluegl_glMatrixPopEXT: + mov __blue_glCore_glMatrixPopEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL4d -.type bluegl_glVertexAttribL4d, %function -bluegl_glVertexAttribL4d: - mov __blue_glCore_glVertexAttribL4d@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixPushEXT +.type bluegl_glMatrixPushEXT, %function +bluegl_glMatrixPushEXT: + mov __blue_glCore_glMatrixPushEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMapBufferARB -.type bluegl_glMapBufferARB, %function -bluegl_glMapBufferARB: - mov __blue_glCore_glMapBufferARB@GOTPCREL(%rip), %r11 +.global bluegl_glClientAttribDefaultEXT +.type bluegl_glClientAttribDefaultEXT, %function +bluegl_glClientAttribDefaultEXT: + mov __blue_glCore_glClientAttribDefaultEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindVideoCaptureStreamTextureNV -.type bluegl_glBindVideoCaptureStreamTextureNV, %function -bluegl_glBindVideoCaptureStreamTextureNV: - mov __blue_glCore_glBindVideoCaptureStreamTextureNV@GOTPCREL(%rip), %r11 +.global bluegl_glPushClientAttribDefaultEXT +.type bluegl_glPushClientAttribDefaultEXT, %function +bluegl_glPushClientAttribDefaultEXT: + mov __blue_glCore_glPushClientAttribDefaultEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glConvolutionParameterxvOES -.type bluegl_glConvolutionParameterxvOES, %function -bluegl_glConvolutionParameterxvOES: - mov __blue_glCore_glConvolutionParameterxvOES@GOTPCREL(%rip), %r11 +.global bluegl_glTextureParameterfEXT +.type bluegl_glTextureParameterfEXT, %function +bluegl_glTextureParameterfEXT: + mov __blue_glCore_glTextureParameterfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexParameterIuivEXT -.type bluegl_glTexParameterIuivEXT, %function -bluegl_glTexParameterIuivEXT: - mov __blue_glCore_glTexParameterIuivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTextureParameterfvEXT +.type bluegl_glTextureParameterfvEXT, %function +bluegl_glTextureParameterfvEXT: + mov __blue_glCore_glTextureParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI4ubv -.type bluegl_glVertexAttribI4ubv, %function -bluegl_glVertexAttribI4ubv: - mov __blue_glCore_glVertexAttribI4ubv@GOTPCREL(%rip), %r11 +.global bluegl_glTextureParameteriEXT +.type bluegl_glTextureParameteriEXT, %function +bluegl_glTextureParameteriEXT: + mov __blue_glCore_glTextureParameteriEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexSubImage1DEXT -.type bluegl_glTexSubImage1DEXT, %function -bluegl_glTexSubImage1DEXT: - mov __blue_glCore_glTexSubImage1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTextureParameterivEXT +.type bluegl_glTextureParameterivEXT, %function +bluegl_glTextureParameterivEXT: + mov __blue_glCore_glTextureParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureStorage2DEXT -.type bluegl_glTextureStorage2DEXT, %function -bluegl_glTextureStorage2DEXT: - mov __blue_glCore_glTextureStorage2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTextureImage1DEXT +.type bluegl_glTextureImage1DEXT, %function +bluegl_glTextureImage1DEXT: + mov __blue_glCore_glTextureImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexSubImage3DEXT -.type bluegl_glTexSubImage3DEXT, %function -bluegl_glTexSubImage3DEXT: - mov __blue_glCore_glTexSubImage3DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTextureImage2DEXT +.type bluegl_glTextureImage2DEXT, %function +bluegl_glTextureImage2DEXT: + mov __blue_glCore_glTextureImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertex2xvOES -.type bluegl_glVertex2xvOES, %function -bluegl_glVertex2xvOES: - mov __blue_glCore_glVertex2xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glTextureSubImage1DEXT +.type bluegl_glTextureSubImage1DEXT, %function +bluegl_glTextureSubImage1DEXT: + mov __blue_glCore_glTextureSubImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMultiTexImageEXT -.type bluegl_glGetMultiTexImageEXT, %function -bluegl_glGetMultiTexImageEXT: - mov __blue_glCore_glGetMultiTexImageEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTextureSubImage2DEXT +.type bluegl_glTextureSubImage2DEXT, %function +bluegl_glTextureSubImage2DEXT: + mov __blue_glCore_glTextureSubImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormalStream3ivATI -.type bluegl_glNormalStream3ivATI, %function -bluegl_glNormalStream3ivATI: - mov __blue_glCore_glNormalStream3ivATI@GOTPCREL(%rip), %r11 +.global bluegl_glCopyTextureImage1DEXT +.type bluegl_glCopyTextureImage1DEXT, %function +bluegl_glCopyTextureImage1DEXT: + mov __blue_glCore_glCopyTextureImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedBufferPointerv -.type bluegl_glGetNamedBufferPointerv, %function -bluegl_glGetNamedBufferPointerv: - mov __blue_glCore_glGetNamedBufferPointerv@GOTPCREL(%rip), %r11 +.global bluegl_glCopyTextureImage2DEXT +.type bluegl_glCopyTextureImage2DEXT, %function +bluegl_glCopyTextureImage2DEXT: + mov __blue_glCore_glCopyTextureImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexBuffer -.type bluegl_glTexBuffer, %function -bluegl_glTexBuffer: - mov __blue_glCore_glTexBuffer@GOTPCREL(%rip), %r11 +.global bluegl_glCopyTextureSubImage1DEXT +.type bluegl_glCopyTextureSubImage1DEXT, %function +bluegl_glCopyTextureSubImage1DEXT: + mov __blue_glCore_glCopyTextureSubImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCombinerInputNV -.type bluegl_glCombinerInputNV, %function -bluegl_glCombinerInputNV: - mov __blue_glCore_glCombinerInputNV@GOTPCREL(%rip), %r11 +.global bluegl_glCopyTextureSubImage2DEXT +.type bluegl_glCopyTextureSubImage2DEXT, %function +bluegl_glCopyTextureSubImage2DEXT: + mov __blue_glCore_glCopyTextureSubImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1dARB -.type bluegl_glVertexAttrib1dARB, %function -bluegl_glVertexAttrib1dARB: - mov __blue_glCore_glVertexAttrib1dARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetTextureImageEXT +.type bluegl_glGetTextureImageEXT, %function +bluegl_glGetTextureImageEXT: + mov __blue_glCore_glGetTextureImageEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexP3ui -.type bluegl_glVertexP3ui, %function -bluegl_glVertexP3ui: - mov __blue_glCore_glVertexP3ui@GOTPCREL(%rip), %r11 +.global bluegl_glGetTextureParameterfvEXT +.type bluegl_glGetTextureParameterfvEXT, %function +bluegl_glGetTextureParameterfvEXT: + mov __blue_glCore_glGetTextureParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixMult3x2fNV -.type bluegl_glMatrixMult3x2fNV, %function -bluegl_glMatrixMult3x2fNV: - mov __blue_glCore_glMatrixMult3x2fNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetTextureParameterivEXT +.type bluegl_glGetTextureParameterivEXT, %function +bluegl_glGetTextureParameterivEXT: + mov __blue_glCore_glGetTextureParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedFramebufferTexture2DEXT -.type bluegl_glNamedFramebufferTexture2DEXT, %function -bluegl_glNamedFramebufferTexture2DEXT: - mov __blue_glCore_glNamedFramebufferTexture2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetTextureLevelParameterfvEXT +.type bluegl_glGetTextureLevelParameterfvEXT, %function +bluegl_glGetTextureLevelParameterfvEXT: + mov __blue_glCore_glGetTextureLevelParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureLevelParameteriv -.type bluegl_glGetTextureLevelParameteriv, %function -bluegl_glGetTextureLevelParameteriv: - mov __blue_glCore_glGetTextureLevelParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glGetTextureLevelParameterivEXT +.type bluegl_glGetTextureLevelParameterivEXT, %function +bluegl_glGetTextureLevelParameterivEXT: + mov __blue_glCore_glGetTextureLevelParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPixelMapx -.type bluegl_glPixelMapx, %function -bluegl_glPixelMapx: - mov __blue_glCore_glPixelMapx@GOTPCREL(%rip), %r11 +.global bluegl_glTextureImage3DEXT +.type bluegl_glTextureImage3DEXT, %function +bluegl_glTextureImage3DEXT: + mov __blue_glCore_glTextureImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendFuncSeparatei -.type bluegl_glBlendFuncSeparatei, %function -bluegl_glBlendFuncSeparatei: - mov __blue_glCore_glBlendFuncSeparatei@GOTPCREL(%rip), %r11 +.global bluegl_glTextureSubImage3DEXT +.type bluegl_glTextureSubImage3DEXT, %function +bluegl_glTextureSubImage3DEXT: + mov __blue_glCore_glTextureSubImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTessellationModeAMD -.type bluegl_glTessellationModeAMD, %function -bluegl_glTessellationModeAMD: - mov __blue_glCore_glTessellationModeAMD@GOTPCREL(%rip), %r11 +.global bluegl_glCopyTextureSubImage3DEXT +.type bluegl_glCopyTextureSubImage3DEXT, %function +bluegl_glCopyTextureSubImage3DEXT: + mov __blue_glCore_glCopyTextureSubImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramEnvParametersI4uivNV -.type bluegl_glProgramEnvParametersI4uivNV, %function -bluegl_glProgramEnvParametersI4uivNV: - mov __blue_glCore_glProgramEnvParametersI4uivNV@GOTPCREL(%rip), %r11 +.global bluegl_glBindMultiTextureEXT +.type bluegl_glBindMultiTextureEXT, %function +bluegl_glBindMultiTextureEXT: + mov __blue_glCore_glBindMultiTextureEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetColorTableParameterfvEXT -.type bluegl_glGetColorTableParameterfvEXT, %function -bluegl_glGetColorTableParameterfvEXT: - mov __blue_glCore_glGetColorTableParameterfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoordPointerEXT +.type bluegl_glMultiTexCoordPointerEXT, %function +bluegl_glMultiTexCoordPointerEXT: + mov __blue_glCore_glMultiTexCoordPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI1uiEXT -.type bluegl_glVertexAttribI1uiEXT, %function -bluegl_glVertexAttribI1uiEXT: - mov __blue_glCore_glVertexAttribI1uiEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexEnvfEXT +.type bluegl_glMultiTexEnvfEXT, %function +bluegl_glMultiTexEnvfEXT: + mov __blue_glCore_glMultiTexEnvfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPrioritizeTexturesEXT -.type bluegl_glPrioritizeTexturesEXT, %function -bluegl_glPrioritizeTexturesEXT: - mov __blue_glCore_glPrioritizeTexturesEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexEnvfvEXT +.type bluegl_glMultiTexEnvfvEXT, %function +bluegl_glMultiTexEnvfvEXT: + mov __blue_glCore_glMultiTexEnvfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1i64vNV -.type bluegl_glProgramUniform1i64vNV, %function -bluegl_glProgramUniform1i64vNV: - mov __blue_glCore_glProgramUniform1i64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexEnviEXT +.type bluegl_glMultiTexEnviEXT, %function +bluegl_glMultiTexEnviEXT: + mov __blue_glCore_glMultiTexEnviEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureParameteriv -.type bluegl_glGetTextureParameteriv, %function -bluegl_glGetTextureParameteriv: - mov __blue_glCore_glGetTextureParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexEnvivEXT +.type bluegl_glMultiTexEnvivEXT, %function +bluegl_glMultiTexEnvivEXT: + mov __blue_glCore_glMultiTexEnvivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTransformFeedbackiv -.type bluegl_glGetTransformFeedbackiv, %function -bluegl_glGetTransformFeedbackiv: - mov __blue_glCore_glGetTransformFeedbackiv@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexGendEXT +.type bluegl_glMultiTexGendEXT, %function +bluegl_glMultiTexGendEXT: + mov __blue_glCore_glMultiTexGendEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiDrawArraysIndirectBindlessCountNV -.type bluegl_glMultiDrawArraysIndirectBindlessCountNV, %function -bluegl_glMultiDrawArraysIndirectBindlessCountNV: - mov __blue_glCore_glMultiDrawArraysIndirectBindlessCountNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexGendvEXT +.type bluegl_glMultiTexGendvEXT, %function +bluegl_glMultiTexGendvEXT: + mov __blue_glCore_glMultiTexGendvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUseShaderProgramEXT -.type bluegl_glUseShaderProgramEXT, %function -bluegl_glUseShaderProgramEXT: - mov __blue_glCore_glUseShaderProgramEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexGenfEXT +.type bluegl_glMultiTexGenfEXT, %function +bluegl_glMultiTexGenfEXT: + mov __blue_glCore_glMultiTexGenfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteTransformFeedbacks -.type bluegl_glDeleteTransformFeedbacks, %function -bluegl_glDeleteTransformFeedbacks: - mov __blue_glCore_glDeleteTransformFeedbacks@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexGenfvEXT +.type bluegl_glMultiTexGenfvEXT, %function +bluegl_glMultiTexGenfvEXT: + mov __blue_glCore_glMultiTexGenfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCoverageModulationTableNV -.type bluegl_glCoverageModulationTableNV, %function -bluegl_glCoverageModulationTableNV: - mov __blue_glCore_glCoverageModulationTableNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexGeniEXT +.type bluegl_glMultiTexGeniEXT, %function +bluegl_glMultiTexGeniEXT: + mov __blue_glCore_glMultiTexGeniEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1d -.type bluegl_glMultiTexCoord1d, %function -bluegl_glMultiTexCoord1d: - mov __blue_glCore_glMultiTexCoord1d@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexGenivEXT +.type bluegl_glMultiTexGenivEXT, %function +bluegl_glMultiTexGenivEXT: + mov __blue_glCore_glMultiTexGenivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTexLevelParameteriv -.type bluegl_glGetTexLevelParameteriv, %function -bluegl_glGetTexLevelParameteriv: - mov __blue_glCore_glGetTexLevelParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glGetMultiTexEnvfvEXT +.type bluegl_glGetMultiTexEnvfvEXT, %function +bluegl_glGetMultiTexEnvfvEXT: + mov __blue_glCore_glGetMultiTexEnvfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4ui -.type bluegl_glProgramUniform4ui, %function -bluegl_glProgramUniform4ui: - mov __blue_glCore_glProgramUniform4ui@GOTPCREL(%rip), %r11 +.global bluegl_glGetMultiTexEnvivEXT +.type bluegl_glGetMultiTexEnvivEXT, %function +bluegl_glGetMultiTexEnvivEXT: + mov __blue_glCore_glGetMultiTexEnvivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4iv -.type bluegl_glProgramUniform4iv, %function -bluegl_glProgramUniform4iv: - mov __blue_glCore_glProgramUniform4iv@GOTPCREL(%rip), %r11 +.global bluegl_glGetMultiTexGendvEXT +.type bluegl_glGetMultiTexGendvEXT, %function +bluegl_glGetMultiTexGendvEXT: + mov __blue_glCore_glGetMultiTexGendvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTangent3fvEXT -.type bluegl_glTangent3fvEXT, %function -bluegl_glTangent3fvEXT: - mov __blue_glCore_glTangent3fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetMultiTexGenfvEXT +.type bluegl_glGetMultiTexGenfvEXT, %function +bluegl_glGetMultiTexGenfvEXT: + mov __blue_glCore_glGetMultiTexGenfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glViewportIndexedfv -.type bluegl_glViewportIndexedfv, %function -bluegl_glViewportIndexedfv: - mov __blue_glCore_glViewportIndexedfv@GOTPCREL(%rip), %r11 +.global bluegl_glGetMultiTexGenivEXT +.type bluegl_glGetMultiTexGenivEXT, %function +bluegl_glGetMultiTexGenivEXT: + mov __blue_glCore_glGetMultiTexGenivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSampleMaski -.type bluegl_glSampleMaski, %function -bluegl_glSampleMaski: - mov __blue_glCore_glSampleMaski@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexParameteriEXT +.type bluegl_glMultiTexParameteriEXT, %function +bluegl_glMultiTexParameteriEXT: + mov __blue_glCore_glMultiTexParameteriEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix4x3dvEXT -.type bluegl_glProgramUniformMatrix4x3dvEXT, %function -bluegl_glProgramUniformMatrix4x3dvEXT: - mov __blue_glCore_glProgramUniformMatrix4x3dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexParameterivEXT +.type bluegl_glMultiTexParameterivEXT, %function +bluegl_glMultiTexParameterivEXT: + mov __blue_glCore_glMultiTexParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompileShaderARB -.type bluegl_glCompileShaderARB, %function -bluegl_glCompileShaderARB: - mov __blue_glCore_glCompileShaderARB@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexParameterfEXT +.type bluegl_glMultiTexParameterfEXT, %function +bluegl_glMultiTexParameterfEXT: + mov __blue_glCore_glMultiTexParameterfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4ui64ARB -.type bluegl_glUniform4ui64ARB, %function -bluegl_glUniform4ui64ARB: - mov __blue_glCore_glUniform4ui64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexParameterfvEXT +.type bluegl_glMultiTexParameterfvEXT, %function +bluegl_glMultiTexParameterfvEXT: + mov __blue_glCore_glMultiTexParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord3xOES -.type bluegl_glTexCoord3xOES, %function -bluegl_glTexCoord3xOES: - mov __blue_glCore_glTexCoord3xOES@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexImage1DEXT +.type bluegl_glMultiTexImage1DEXT, %function +bluegl_glMultiTexImage1DEXT: + mov __blue_glCore_glMultiTexImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetInternalformativ -.type bluegl_glGetInternalformativ, %function -bluegl_glGetInternalformativ: - mov __blue_glCore_glGetInternalformativ@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexImage2DEXT +.type bluegl_glMultiTexImage2DEXT, %function +bluegl_glMultiTexImage2DEXT: + mov __blue_glCore_glMultiTexImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glObjectPtrLabel -.type bluegl_glObjectPtrLabel, %function -bluegl_glObjectPtrLabel: - mov __blue_glCore_glObjectPtrLabel@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexSubImage1DEXT +.type bluegl_glMultiTexSubImage1DEXT, %function +bluegl_glMultiTexSubImage1DEXT: + mov __blue_glCore_glMultiTexSubImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormal3hvNV -.type bluegl_glNormal3hvNV, %function -bluegl_glNormal3hvNV: - mov __blue_glCore_glNormal3hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexSubImage2DEXT +.type bluegl_glMultiTexSubImage2DEXT, %function +bluegl_glMultiTexSubImage2DEXT: + mov __blue_glCore_glMultiTexSubImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1uiv -.type bluegl_glProgramUniform1uiv, %function -bluegl_glProgramUniform1uiv: - mov __blue_glCore_glProgramUniform1uiv@GOTPCREL(%rip), %r11 +.global bluegl_glCopyMultiTexImage1DEXT +.type bluegl_glCopyMultiTexImage1DEXT, %function +bluegl_glCopyMultiTexImage1DEXT: + mov __blue_glCore_glCopyMultiTexImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenFragmentShadersATI -.type bluegl_glGenFragmentShadersATI, %function -bluegl_glGenFragmentShadersATI: - mov __blue_glCore_glGenFragmentShadersATI@GOTPCREL(%rip), %r11 +.global bluegl_glCopyMultiTexImage2DEXT +.type bluegl_glCopyMultiTexImage2DEXT, %function +bluegl_glCopyMultiTexImage2DEXT: + mov __blue_glCore_glCopyMultiTexImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord2hvNV -.type bluegl_glTexCoord2hvNV, %function -bluegl_glTexCoord2hvNV: - mov __blue_glCore_glTexCoord2hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glCopyMultiTexSubImage1DEXT +.type bluegl_glCopyMultiTexSubImage1DEXT, %function +bluegl_glCopyMultiTexSubImage1DEXT: + mov __blue_glCore_glCopyMultiTexSubImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFinishAsyncSGIX -.type bluegl_glFinishAsyncSGIX, %function -bluegl_glFinishAsyncSGIX: - mov __blue_glCore_glFinishAsyncSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glCopyMultiTexSubImage2DEXT +.type bluegl_glCopyMultiTexSubImage2DEXT, %function +bluegl_glCopyMultiTexSubImage2DEXT: + mov __blue_glCore_glCopyMultiTexSubImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEnableVertexAttribArrayARB -.type bluegl_glEnableVertexAttribArrayARB, %function -bluegl_glEnableVertexAttribArrayARB: - mov __blue_glCore_glEnableVertexAttribArrayARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetMultiTexImageEXT +.type bluegl_glGetMultiTexImageEXT, %function +bluegl_glGetMultiTexImageEXT: + mov __blue_glCore_glGetMultiTexImageEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteSamplers -.type bluegl_glDeleteSamplers, %function -bluegl_glDeleteSamplers: - mov __blue_glCore_glDeleteSamplers@GOTPCREL(%rip), %r11 +.global bluegl_glGetMultiTexParameterfvEXT +.type bluegl_glGetMultiTexParameterfvEXT, %function +bluegl_glGetMultiTexParameterfvEXT: + mov __blue_glCore_glGetMultiTexParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1fvARB -.type bluegl_glVertexAttrib1fvARB, %function -bluegl_glVertexAttrib1fvARB: - mov __blue_glCore_glVertexAttrib1fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetMultiTexParameterivEXT +.type bluegl_glGetMultiTexParameterivEXT, %function +bluegl_glGetMultiTexParameterivEXT: + mov __blue_glCore_glGetMultiTexParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnUniformivARB -.type bluegl_glGetnUniformivARB, %function -bluegl_glGetnUniformivARB: - mov __blue_glCore_glGetnUniformivARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetMultiTexLevelParameterfvEXT +.type bluegl_glGetMultiTexLevelParameterfvEXT, %function +bluegl_glGetMultiTexLevelParameterfvEXT: + mov __blue_glCore_glGetMultiTexLevelParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLoadTransposeMatrixd -.type bluegl_glLoadTransposeMatrixd, %function -bluegl_glLoadTransposeMatrixd: - mov __blue_glCore_glLoadTransposeMatrixd@GOTPCREL(%rip), %r11 +.global bluegl_glGetMultiTexLevelParameterivEXT +.type bluegl_glGetMultiTexLevelParameterivEXT, %function +bluegl_glGetMultiTexLevelParameterivEXT: + mov __blue_glCore_glGetMultiTexLevelParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramParameteri -.type bluegl_glProgramParameteri, %function -bluegl_glProgramParameteri: - mov __blue_glCore_glProgramParameteri@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexImage3DEXT +.type bluegl_glMultiTexImage3DEXT, %function +bluegl_glMultiTexImage3DEXT: + mov __blue_glCore_glMultiTexImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreateShader -.type bluegl_glCreateShader, %function -bluegl_glCreateShader: - mov __blue_glCore_glCreateShader@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexSubImage3DEXT +.type bluegl_glMultiTexSubImage3DEXT, %function +bluegl_glMultiTexSubImage3DEXT: + mov __blue_glCore_glMultiTexSubImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFragmentCoverageColorNV -.type bluegl_glFragmentCoverageColorNV, %function -bluegl_glFragmentCoverageColorNV: - mov __blue_glCore_glFragmentCoverageColorNV@GOTPCREL(%rip), %r11 +.global bluegl_glCopyMultiTexSubImage3DEXT +.type bluegl_glCopyMultiTexSubImage3DEXT, %function +bluegl_glCopyMultiTexSubImage3DEXT: + mov __blue_glCore_glCopyMultiTexSubImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream3dvATI -.type bluegl_glVertexStream3dvATI, %function -bluegl_glVertexStream3dvATI: - mov __blue_glCore_glVertexStream3dvATI@GOTPCREL(%rip), %r11 +.global bluegl_glEnableClientStateIndexedEXT +.type bluegl_glEnableClientStateIndexedEXT, %function +bluegl_glEnableClientStateIndexedEXT: + mov __blue_glCore_glEnableClientStateIndexedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformHandleui64ARB -.type bluegl_glUniformHandleui64ARB, %function -bluegl_glUniformHandleui64ARB: - mov __blue_glCore_glUniformHandleui64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glDisableClientStateIndexedEXT +.type bluegl_glDisableClientStateIndexedEXT, %function +bluegl_glDisableClientStateIndexedEXT: + mov __blue_glCore_glDisableClientStateIndexedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVaryingLocationNV -.type bluegl_glGetVaryingLocationNV, %function -bluegl_glGetVaryingLocationNV: - mov __blue_glCore_glGetVaryingLocationNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetFloatIndexedvEXT +.type bluegl_glGetFloatIndexedvEXT, %function +bluegl_glGetFloatIndexedvEXT: + mov __blue_glCore_glGetFloatIndexedvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTextureSubImage2DEXT -.type bluegl_glCompressedTextureSubImage2DEXT, %function -bluegl_glCompressedTextureSubImage2DEXT: - mov __blue_glCore_glCompressedTextureSubImage2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetDoubleIndexedvEXT +.type bluegl_glGetDoubleIndexedvEXT, %function +bluegl_glGetDoubleIndexedvEXT: + mov __blue_glCore_glGetDoubleIndexedvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTangent3dEXT -.type bluegl_glTangent3dEXT, %function -bluegl_glTangent3dEXT: - mov __blue_glCore_glTangent3dEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetPointerIndexedvEXT +.type bluegl_glGetPointerIndexedvEXT, %function +bluegl_glGetPointerIndexedvEXT: + mov __blue_glCore_glGetPointerIndexedvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedBufferPointervEXT -.type bluegl_glGetNamedBufferPointervEXT, %function -bluegl_glGetNamedBufferPointervEXT: - mov __blue_glCore_glGetNamedBufferPointervEXT@GOTPCREL(%rip), %r11 +.global bluegl_glEnableIndexedEXT +.type bluegl_glEnableIndexedEXT, %function +bluegl_glEnableIndexedEXT: + mov __blue_glCore_glEnableIndexedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertex2bvOES -.type bluegl_glVertex2bvOES, %function -bluegl_glVertex2bvOES: - mov __blue_glCore_glVertex2bvOES@GOTPCREL(%rip), %r11 +.global bluegl_glDisableIndexedEXT +.type bluegl_glDisableIndexedEXT, %function +bluegl_glDisableIndexedEXT: + mov __blue_glCore_glDisableIndexedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramBufferParametersIuivNV -.type bluegl_glProgramBufferParametersIuivNV, %function -bluegl_glProgramBufferParametersIuivNV: - mov __blue_glCore_glProgramBufferParametersIuivNV@GOTPCREL(%rip), %r11 +.global bluegl_glIsEnabledIndexedEXT +.type bluegl_glIsEnabledIndexedEXT, %function +bluegl_glIsEnabledIndexedEXT: + mov __blue_glCore_glIsEnabledIndexedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnTexImageARB -.type bluegl_glGetnTexImageARB, %function -bluegl_glGetnTexImageARB: - mov __blue_glCore_glGetnTexImageARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetIntegerIndexedvEXT +.type bluegl_glGetIntegerIndexedvEXT, %function +bluegl_glGetIntegerIndexedvEXT: + mov __blue_glCore_glGetIntegerIndexedvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSetFenceNV -.type bluegl_glSetFenceNV, %function -bluegl_glSetFenceNV: - mov __blue_glCore_glSetFenceNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetBooleanIndexedvEXT +.type bluegl_glGetBooleanIndexedvEXT, %function +bluegl_glGetBooleanIndexedvEXT: + mov __blue_glCore_glGetBooleanIndexedvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathParameterfvNV -.type bluegl_glPathParameterfvNV, %function -bluegl_glPathParameterfvNV: - mov __blue_glCore_glPathParameterfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTextureImage3DEXT +.type bluegl_glCompressedTextureImage3DEXT, %function +bluegl_glCompressedTextureImage3DEXT: + mov __blue_glCore_glCompressedTextureImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribFormat -.type bluegl_glVertexAttribFormat, %function -bluegl_glVertexAttribFormat: - mov __blue_glCore_glVertexAttribFormat@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTextureImage2DEXT +.type bluegl_glCompressedTextureImage2DEXT, %function +bluegl_glCompressedTextureImage2DEXT: + mov __blue_glCore_glCompressedTextureImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glConservativeRasterParameterfNV -.type bluegl_glConservativeRasterParameterfNV, %function -bluegl_glConservativeRasterParameterfNV: - mov __blue_glCore_glConservativeRasterParameterfNV@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTextureImage1DEXT +.type bluegl_glCompressedTextureImage1DEXT, %function +bluegl_glCompressedTextureImage1DEXT: + mov __blue_glCore_glCompressedTextureImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribIuivEXT -.type bluegl_glGetVertexAttribIuivEXT, %function -bluegl_glGetVertexAttribIuivEXT: - mov __blue_glCore_glGetVertexAttribIuivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTextureSubImage3DEXT +.type bluegl_glCompressedTextureSubImage3DEXT, %function +bluegl_glCompressedTextureSubImage3DEXT: + mov __blue_glCore_glCompressedTextureSubImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindMultiTextureEXT -.type bluegl_glBindMultiTextureEXT, %function -bluegl_glBindMultiTextureEXT: - mov __blue_glCore_glBindMultiTextureEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTextureSubImage2DEXT +.type bluegl_glCompressedTextureSubImage2DEXT, %function +bluegl_glCompressedTextureSubImage2DEXT: + mov __blue_glCore_glCompressedTextureSubImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMapControlPointsNV -.type bluegl_glMapControlPointsNV, %function -bluegl_glMapControlPointsNV: - mov __blue_glCore_glMapControlPointsNV@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedTextureSubImage1DEXT +.type bluegl_glCompressedTextureSubImage1DEXT, %function +bluegl_glCompressedTextureSubImage1DEXT: + mov __blue_glCore_glCompressedTextureSubImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4Nsv -.type bluegl_glVertexAttrib4Nsv, %function -bluegl_glVertexAttrib4Nsv: - mov __blue_glCore_glVertexAttrib4Nsv@GOTPCREL(%rip), %r11 +.global bluegl_glGetCompressedTextureImageEXT +.type bluegl_glGetCompressedTextureImageEXT, %function +bluegl_glGetCompressedTextureImageEXT: + mov __blue_glCore_glGetCompressedTextureImageEXT@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glCompressedMultiTexImage3DEXT +.type bluegl_glCompressedMultiTexImage3DEXT, %function +bluegl_glCompressedMultiTexImage3DEXT: + mov __blue_glCore_glCompressedMultiTexImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) .global bluegl_glCompressedMultiTexImage2DEXT @@ -9577,1024 +9546,1042 @@ bluegl_glCompressedMultiTexImage2DEXT: mov __blue_glCore_glCompressedMultiTexImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsNamedBufferResidentNV -.type bluegl_glIsNamedBufferResidentNV, %function -bluegl_glIsNamedBufferResidentNV: - mov __blue_glCore_glIsNamedBufferResidentNV@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedMultiTexImage1DEXT +.type bluegl_glCompressedMultiTexImage1DEXT, %function +bluegl_glCompressedMultiTexImage1DEXT: + mov __blue_glCore_glCompressedMultiTexImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLoadProgramNV -.type bluegl_glLoadProgramNV, %function -bluegl_glLoadProgramNV: - mov __blue_glCore_glLoadProgramNV@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedMultiTexSubImage3DEXT +.type bluegl_glCompressedMultiTexSubImage3DEXT, %function +bluegl_glCompressedMultiTexSubImage3DEXT: + mov __blue_glCore_glCompressedMultiTexSubImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearColor -.type bluegl_glClearColor, %function -bluegl_glClearColor: - mov __blue_glCore_glClearColor@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedMultiTexSubImage2DEXT +.type bluegl_glCompressedMultiTexSubImage2DEXT, %function +bluegl_glCompressedMultiTexSubImage2DEXT: + mov __blue_glCore_glCompressedMultiTexSubImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2uivEXT -.type bluegl_glUniform2uivEXT, %function -bluegl_glUniform2uivEXT: - mov __blue_glCore_glUniform2uivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCompressedMultiTexSubImage1DEXT +.type bluegl_glCompressedMultiTexSubImage1DEXT, %function +bluegl_glCompressedMultiTexSubImage1DEXT: + mov __blue_glCore_glCompressedMultiTexSubImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexGenfEXT -.type bluegl_glMultiTexGenfEXT, %function -bluegl_glMultiTexGenfEXT: - mov __blue_glCore_glMultiTexGenfEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetCompressedMultiTexImageEXT +.type bluegl_glGetCompressedMultiTexImageEXT, %function +bluegl_glGetCompressedMultiTexImageEXT: + mov __blue_glCore_glGetCompressedMultiTexImageEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetUniformdv -.type bluegl_glGetUniformdv, %function -bluegl_glGetUniformdv: - mov __blue_glCore_glGetUniformdv@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixLoadTransposefEXT +.type bluegl_glMatrixLoadTransposefEXT, %function +bluegl_glMatrixLoadTransposefEXT: + mov __blue_glCore_glMatrixLoadTransposefEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenRenderbuffersEXT -.type bluegl_glGenRenderbuffersEXT, %function -bluegl_glGenRenderbuffersEXT: - mov __blue_glCore_glGenRenderbuffersEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixLoadTransposedEXT +.type bluegl_glMatrixLoadTransposedEXT, %function +bluegl_glMatrixLoadTransposedEXT: + mov __blue_glCore_glMatrixLoadTransposedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMultisamplefv -.type bluegl_glGetMultisamplefv, %function -bluegl_glGetMultisamplefv: - mov __blue_glCore_glGetMultisamplefv@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixMultTransposefEXT +.type bluegl_glMatrixMultTransposefEXT, %function +bluegl_glMatrixMultTransposefEXT: + mov __blue_glCore_glMatrixMultTransposefEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMapNamedBuffer -.type bluegl_glMapNamedBuffer, %function -bluegl_glMapNamedBuffer: - mov __blue_glCore_glMapNamedBuffer@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixMultTransposedEXT +.type bluegl_glMatrixMultTransposedEXT, %function +bluegl_glMatrixMultTransposedEXT: + mov __blue_glCore_glMatrixMultTransposedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteFramebuffersEXT -.type bluegl_glDeleteFramebuffersEXT, %function -bluegl_glDeleteFramebuffersEXT: - mov __blue_glCore_glDeleteFramebuffersEXT@GOTPCREL(%rip), %r11 +.global bluegl_glNamedBufferDataEXT +.type bluegl_glNamedBufferDataEXT, %function +bluegl_glNamedBufferDataEXT: + mov __blue_glCore_glNamedBufferDataEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI4usvEXT -.type bluegl_glVertexAttribI4usvEXT, %function -bluegl_glVertexAttribI4usvEXT: - mov __blue_glCore_glVertexAttribI4usvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glNamedBufferSubDataEXT +.type bluegl_glNamedBufferSubDataEXT, %function +bluegl_glNamedBufferSubDataEXT: + mov __blue_glCore_glNamedBufferSubDataEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3hNV -.type bluegl_glSecondaryColor3hNV, %function -bluegl_glSecondaryColor3hNV: - mov __blue_glCore_glSecondaryColor3hNV@GOTPCREL(%rip), %r11 +.global bluegl_glMapNamedBufferEXT +.type bluegl_glMapNamedBufferEXT, %function +bluegl_glMapNamedBufferEXT: + mov __blue_glCore_glMapNamedBufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenerateMipmap -.type bluegl_glGenerateMipmap, %function -bluegl_glGenerateMipmap: - mov __blue_glCore_glGenerateMipmap@GOTPCREL(%rip), %r11 +.global bluegl_glUnmapNamedBufferEXT +.type bluegl_glUnmapNamedBufferEXT, %function +bluegl_glUnmapNamedBufferEXT: + mov __blue_glCore_glUnmapNamedBufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramEnvParameterI4uivNV -.type bluegl_glProgramEnvParameterI4uivNV, %function -bluegl_glProgramEnvParameterI4uivNV: - mov __blue_glCore_glProgramEnvParameterI4uivNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedBufferParameterivEXT +.type bluegl_glGetNamedBufferParameterivEXT, %function +bluegl_glGetNamedBufferParameterivEXT: + mov __blue_glCore_glGetNamedBufferParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSeparableFilter2D -.type bluegl_glSeparableFilter2D, %function -bluegl_glSeparableFilter2D: - mov __blue_glCore_glSeparableFilter2D@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedBufferPointervEXT +.type bluegl_glGetNamedBufferPointervEXT, %function +bluegl_glGetNamedBufferPointervEXT: + mov __blue_glCore_glGetNamedBufferPointervEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFogCoorddEXT -.type bluegl_glFogCoorddEXT, %function -bluegl_glFogCoorddEXT: - mov __blue_glCore_glFogCoorddEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedBufferSubDataEXT +.type bluegl_glGetNamedBufferSubDataEXT, %function +bluegl_glGetNamedBufferSubDataEXT: + mov __blue_glCore_glGetNamedBufferSubDataEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPerfCounterInfoINTEL -.type bluegl_glGetPerfCounterInfoINTEL, %function -bluegl_glGetPerfCounterInfoINTEL: - mov __blue_glCore_glGetPerfCounterInfoINTEL@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1fEXT +.type bluegl_glProgramUniform1fEXT, %function +bluegl_glProgramUniform1fEXT: + mov __blue_glCore_glProgramUniform1fEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4uiv -.type bluegl_glUniform4uiv, %function -bluegl_glUniform4uiv: - mov __blue_glCore_glUniform4uiv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2fEXT +.type bluegl_glProgramUniform2fEXT, %function +bluegl_glProgramUniform2fEXT: + mov __blue_glCore_glProgramUniform2fEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL2dv -.type bluegl_glVertexAttribL2dv, %function -bluegl_glVertexAttribL2dv: - mov __blue_glCore_glVertexAttribL2dv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3fEXT +.type bluegl_glProgramUniform3fEXT, %function +bluegl_glProgramUniform3fEXT: + mov __blue_glCore_glProgramUniform3fEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1dv -.type bluegl_glUniform1dv, %function -bluegl_glUniform1dv: - mov __blue_glCore_glUniform1dv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4fEXT +.type bluegl_glProgramUniform4fEXT, %function +bluegl_glProgramUniform4fEXT: + mov __blue_glCore_glProgramUniform4fEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL1ui64ARB -.type bluegl_glVertexAttribL1ui64ARB, %function -bluegl_glVertexAttribL1ui64ARB: - mov __blue_glCore_glVertexAttribL1ui64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1iEXT +.type bluegl_glProgramUniform1iEXT, %function +bluegl_glProgramUniform1iEXT: + mov __blue_glCore_glProgramUniform1iEXT@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glProgramUniform2iEXT +.type bluegl_glProgramUniform2iEXT, %function +bluegl_glProgramUniform2iEXT: + mov __blue_glCore_glProgramUniform2iEXT@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glProgramUniform3iEXT +.type bluegl_glProgramUniform3iEXT, %function +bluegl_glProgramUniform3iEXT: + mov __blue_glCore_glProgramUniform3iEXT@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glProgramUniform4iEXT +.type bluegl_glProgramUniform4iEXT, %function +bluegl_glProgramUniform4iEXT: + mov __blue_glCore_glProgramUniform4iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEndPerfQueryINTEL -.type bluegl_glEndPerfQueryINTEL, %function -bluegl_glEndPerfQueryINTEL: - mov __blue_glCore_glEndPerfQueryINTEL@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1fvEXT +.type bluegl_glProgramUniform1fvEXT, %function +bluegl_glProgramUniform1fvEXT: + mov __blue_glCore_glProgramUniform1fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayEdgeFlagOffsetEXT -.type bluegl_glVertexArrayEdgeFlagOffsetEXT, %function -bluegl_glVertexArrayEdgeFlagOffsetEXT: - mov __blue_glCore_glVertexArrayEdgeFlagOffsetEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2fvEXT +.type bluegl_glProgramUniform2fvEXT, %function +bluegl_glProgramUniform2fvEXT: + mov __blue_glCore_glProgramUniform2fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1dv -.type bluegl_glVertexAttrib1dv, %function -bluegl_glVertexAttrib1dv: - mov __blue_glCore_glVertexAttrib1dv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3fvEXT +.type bluegl_glProgramUniform3fvEXT, %function +bluegl_glProgramUniform3fvEXT: + mov __blue_glCore_glProgramUniform3fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix2dvEXT -.type bluegl_glProgramUniformMatrix2dvEXT, %function -bluegl_glProgramUniformMatrix2dvEXT: - mov __blue_glCore_glProgramUniformMatrix2dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4fvEXT +.type bluegl_glProgramUniform4fvEXT, %function +bluegl_glProgramUniform4fvEXT: + mov __blue_glCore_glProgramUniform4fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDepthRange -.type bluegl_glDepthRange, %function -bluegl_glDepthRange: - mov __blue_glCore_glDepthRange@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1ivEXT +.type bluegl_glProgramUniform1ivEXT, %function +bluegl_glProgramUniform1ivEXT: + mov __blue_glCore_glProgramUniform1ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCombinerParameterfNV -.type bluegl_glCombinerParameterfNV, %function -bluegl_glCombinerParameterfNV: - mov __blue_glCore_glCombinerParameterfNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2ivEXT +.type bluegl_glProgramUniform2ivEXT, %function +bluegl_glProgramUniform2ivEXT: + mov __blue_glCore_glProgramUniform2ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVariantArrayObjectATI -.type bluegl_glVariantArrayObjectATI, %function -bluegl_glVariantArrayObjectATI: - mov __blue_glCore_glVariantArrayObjectATI@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3ivEXT +.type bluegl_glProgramUniform3ivEXT, %function +bluegl_glProgramUniform3ivEXT: + mov __blue_glCore_glProgramUniform3ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteBuffersARB -.type bluegl_glDeleteBuffersARB, %function -bluegl_glDeleteBuffersARB: - mov __blue_glCore_glDeleteBuffersARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4ivEXT +.type bluegl_glProgramUniform4ivEXT, %function +bluegl_glProgramUniform4ivEXT: + mov __blue_glCore_glProgramUniform4ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFragmentLightiSGIX -.type bluegl_glFragmentLightiSGIX, %function -bluegl_glFragmentLightiSGIX: - mov __blue_glCore_glFragmentLightiSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix2fvEXT +.type bluegl_glProgramUniformMatrix2fvEXT, %function +bluegl_glProgramUniformMatrix2fvEXT: + mov __blue_glCore_glProgramUniformMatrix2fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetSamplerParameterIiv -.type bluegl_glGetSamplerParameterIiv, %function -bluegl_glGetSamplerParameterIiv: - mov __blue_glCore_glGetSamplerParameterIiv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix3fvEXT +.type bluegl_glProgramUniformMatrix3fvEXT, %function +bluegl_glProgramUniformMatrix3fvEXT: + mov __blue_glCore_glProgramUniformMatrix3fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glImportSyncEXT -.type bluegl_glImportSyncEXT, %function -bluegl_glImportSyncEXT: - mov __blue_glCore_glImportSyncEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix4fvEXT +.type bluegl_glProgramUniformMatrix4fvEXT, %function +bluegl_glProgramUniformMatrix4fvEXT: + mov __blue_glCore_glProgramUniformMatrix4fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribivARB -.type bluegl_glGetVertexAttribivARB, %function -bluegl_glGetVertexAttribivARB: - mov __blue_glCore_glGetVertexAttribivARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix2x3fvEXT +.type bluegl_glProgramUniformMatrix2x3fvEXT, %function +bluegl_glProgramUniformMatrix2x3fvEXT: + mov __blue_glCore_glProgramUniformMatrix2x3fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI2ui -.type bluegl_glVertexAttribI2ui, %function -bluegl_glVertexAttribI2ui: - mov __blue_glCore_glVertexAttribI2ui@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix3x2fvEXT +.type bluegl_glProgramUniformMatrix3x2fvEXT, %function +bluegl_glProgramUniformMatrix3x2fvEXT: + mov __blue_glCore_glProgramUniformMatrix3x2fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetObjectParameterivARB -.type bluegl_glGetObjectParameterivARB, %function -bluegl_glGetObjectParameterivARB: - mov __blue_glCore_glGetObjectParameterivARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix2x4fvEXT +.type bluegl_glProgramUniformMatrix2x4fvEXT, %function +bluegl_glProgramUniformMatrix2x4fvEXT: + mov __blue_glCore_glProgramUniformMatrix2x4fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEnableClientStateiEXT -.type bluegl_glEnableClientStateiEXT, %function -bluegl_glEnableClientStateiEXT: - mov __blue_glCore_glEnableClientStateiEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix4x2fvEXT +.type bluegl_glProgramUniformMatrix4x2fvEXT, %function +bluegl_glProgramUniformMatrix4x2fvEXT: + mov __blue_glCore_glProgramUniformMatrix4x2fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnUniformi64vARB -.type bluegl_glGetnUniformi64vARB, %function -bluegl_glGetnUniformi64vARB: - mov __blue_glCore_glGetnUniformi64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix3x4fvEXT +.type bluegl_glProgramUniformMatrix3x4fvEXT, %function +bluegl_glProgramUniformMatrix3x4fvEXT: + mov __blue_glCore_glProgramUniformMatrix3x4fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteFencesAPPLE -.type bluegl_glDeleteFencesAPPLE, %function -bluegl_glDeleteFencesAPPLE: - mov __blue_glCore_glDeleteFencesAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix4x3fvEXT +.type bluegl_glProgramUniformMatrix4x3fvEXT, %function +bluegl_glProgramUniformMatrix4x3fvEXT: + mov __blue_glCore_glProgramUniformMatrix4x3fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTransformFeedbackBufferRange -.type bluegl_glTransformFeedbackBufferRange, %function -bluegl_glTransformFeedbackBufferRange: - mov __blue_glCore_glTransformFeedbackBufferRange@GOTPCREL(%rip), %r11 +.global bluegl_glTextureBufferEXT +.type bluegl_glTextureBufferEXT, %function +bluegl_glTextureBufferEXT: + mov __blue_glCore_glTextureBufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2fvEXT -.type bluegl_glProgramUniform2fvEXT, %function -bluegl_glProgramUniform2fvEXT: - mov __blue_glCore_glProgramUniform2fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexBufferEXT +.type bluegl_glMultiTexBufferEXT, %function +bluegl_glMultiTexBufferEXT: + mov __blue_glCore_glMultiTexBufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferTextureLayerARB -.type bluegl_glFramebufferTextureLayerARB, %function -bluegl_glFramebufferTextureLayerARB: - mov __blue_glCore_glFramebufferTextureLayerARB@GOTPCREL(%rip), %r11 +.global bluegl_glTextureParameterIivEXT +.type bluegl_glTextureParameterIivEXT, %function +bluegl_glTextureParameterIivEXT: + mov __blue_glCore_glTextureParameterIivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribLFormatNV -.type bluegl_glVertexAttribLFormatNV, %function -bluegl_glVertexAttribLFormatNV: - mov __blue_glCore_glVertexAttribLFormatNV@GOTPCREL(%rip), %r11 +.global bluegl_glTextureParameterIuivEXT +.type bluegl_glTextureParameterIuivEXT, %function +bluegl_glTextureParameterIuivEXT: + mov __blue_glCore_glTextureParameterIuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib2fvARB -.type bluegl_glVertexAttrib2fvARB, %function -bluegl_glVertexAttrib2fvARB: - mov __blue_glCore_glVertexAttrib2fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetTextureParameterIivEXT +.type bluegl_glGetTextureParameterIivEXT, %function +bluegl_glGetTextureParameterIivEXT: + mov __blue_glCore_glGetTextureParameterIivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos4fvMESA -.type bluegl_glWindowPos4fvMESA, %function -bluegl_glWindowPos4fvMESA: - mov __blue_glCore_glWindowPos4fvMESA@GOTPCREL(%rip), %r11 +.global bluegl_glGetTextureParameterIuivEXT +.type bluegl_glGetTextureParameterIuivEXT, %function +bluegl_glGetTextureParameterIuivEXT: + mov __blue_glCore_glGetTextureParameterIuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMakeNamedBufferResidentNV -.type bluegl_glMakeNamedBufferResidentNV, %function -bluegl_glMakeNamedBufferResidentNV: - mov __blue_glCore_glMakeNamedBufferResidentNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexParameterIivEXT +.type bluegl_glMultiTexParameterIivEXT, %function +bluegl_glMultiTexParameterIivEXT: + mov __blue_glCore_glMultiTexParameterIivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix3x4fvEXT -.type bluegl_glProgramUniformMatrix3x4fvEXT, %function -bluegl_glProgramUniformMatrix3x4fvEXT: - mov __blue_glCore_glProgramUniformMatrix3x4fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexParameterIuivEXT +.type bluegl_glMultiTexParameterIuivEXT, %function +bluegl_glMultiTexParameterIuivEXT: + mov __blue_glCore_glMultiTexParameterIuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSamplePatternSGIS -.type bluegl_glSamplePatternSGIS, %function -bluegl_glSamplePatternSGIS: - mov __blue_glCore_glSamplePatternSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glGetMultiTexParameterIivEXT +.type bluegl_glGetMultiTexParameterIivEXT, %function +bluegl_glGetMultiTexParameterIivEXT: + mov __blue_glCore_glGetMultiTexParameterIivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVDPAUGetSurfaceivNV -.type bluegl_glVDPAUGetSurfaceivNV, %function -bluegl_glVDPAUGetSurfaceivNV: - mov __blue_glCore_glVDPAUGetSurfaceivNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetMultiTexParameterIuivEXT +.type bluegl_glGetMultiTexParameterIuivEXT, %function +bluegl_glGetMultiTexParameterIuivEXT: + mov __blue_glCore_glGetMultiTexParameterIuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix4x2fvEXT -.type bluegl_glProgramUniformMatrix4x2fvEXT, %function -bluegl_glProgramUniformMatrix4x2fvEXT: - mov __blue_glCore_glProgramUniformMatrix4x2fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1uiEXT +.type bluegl_glProgramUniform1uiEXT, %function +bluegl_glProgramUniform1uiEXT: + mov __blue_glCore_glProgramUniform1uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeuiColor3fVertex3fvSUN -.type bluegl_glReplacementCodeuiColor3fVertex3fvSUN, %function -bluegl_glReplacementCodeuiColor3fVertex3fvSUN: - mov __blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2uiEXT +.type bluegl_glProgramUniform2uiEXT, %function +bluegl_glProgramUniform2uiEXT: + mov __blue_glCore_glProgramUniform2uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3sMESA -.type bluegl_glWindowPos3sMESA, %function -bluegl_glWindowPos3sMESA: - mov __blue_glCore_glWindowPos3sMESA@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3uiEXT +.type bluegl_glProgramUniform3uiEXT, %function +bluegl_glProgramUniform3uiEXT: + mov __blue_glCore_glProgramUniform3uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexGenxOES -.type bluegl_glTexGenxOES, %function -bluegl_glTexGenxOES: - mov __blue_glCore_glTexGenxOES@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4uiEXT +.type bluegl_glProgramUniform4uiEXT, %function +bluegl_glProgramUniform4uiEXT: + mov __blue_glCore_glProgramUniform4uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4dNV -.type bluegl_glVertexAttrib4dNV, %function -bluegl_glVertexAttrib4dNV: - mov __blue_glCore_glVertexAttrib4dNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1uivEXT +.type bluegl_glProgramUniform1uivEXT, %function +bluegl_glProgramUniform1uivEXT: + mov __blue_glCore_glProgramUniform1uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTangentPointerEXT -.type bluegl_glTangentPointerEXT, %function -bluegl_glTangentPointerEXT: - mov __blue_glCore_glTangentPointerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2uivEXT +.type bluegl_glProgramUniform2uivEXT, %function +bluegl_glProgramUniform2uivEXT: + mov __blue_glCore_glProgramUniform2uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPixelTransformParameterfvEXT -.type bluegl_glPixelTransformParameterfvEXT, %function -bluegl_glPixelTransformParameterfvEXT: - mov __blue_glCore_glPixelTransformParameterfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3uivEXT +.type bluegl_glProgramUniform3uivEXT, %function +bluegl_glProgramUniform3uivEXT: + mov __blue_glCore_glProgramUniform3uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1i -.type bluegl_glProgramUniform1i, %function -bluegl_glProgramUniform1i: - mov __blue_glCore_glProgramUniform1i@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4uivEXT +.type bluegl_glProgramUniform4uivEXT, %function +bluegl_glProgramUniform4uivEXT: + mov __blue_glCore_glProgramUniform4uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2bOES -.type bluegl_glMultiTexCoord2bOES, %function -bluegl_glMultiTexCoord2bOES: - mov __blue_glCore_glMultiTexCoord2bOES@GOTPCREL(%rip), %r11 +.global bluegl_glNamedProgramLocalParameters4fvEXT +.type bluegl_glNamedProgramLocalParameters4fvEXT, %function +bluegl_glNamedProgramLocalParameters4fvEXT: + mov __blue_glCore_glNamedProgramLocalParameters4fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI2iv -.type bluegl_glVertexAttribI2iv, %function -bluegl_glVertexAttribI2iv: - mov __blue_glCore_glVertexAttribI2iv@GOTPCREL(%rip), %r11 +.global bluegl_glNamedProgramLocalParameterI4iEXT +.type bluegl_glNamedProgramLocalParameterI4iEXT, %function +bluegl_glNamedProgramLocalParameterI4iEXT: + mov __blue_glCore_glNamedProgramLocalParameterI4iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos4iMESA -.type bluegl_glWindowPos4iMESA, %function -bluegl_glWindowPos4iMESA: - mov __blue_glCore_glWindowPos4iMESA@GOTPCREL(%rip), %r11 +.global bluegl_glNamedProgramLocalParameterI4ivEXT +.type bluegl_glNamedProgramLocalParameterI4ivEXT, %function +bluegl_glNamedProgramLocalParameterI4ivEXT: + mov __blue_glCore_glNamedProgramLocalParameterI4ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTestFenceNV -.type bluegl_glTestFenceNV, %function -bluegl_glTestFenceNV: - mov __blue_glCore_glTestFenceNV@GOTPCREL(%rip), %r11 +.global bluegl_glNamedProgramLocalParametersI4ivEXT +.type bluegl_glNamedProgramLocalParametersI4ivEXT, %function +bluegl_glNamedProgramLocalParametersI4ivEXT: + mov __blue_glCore_glNamedProgramLocalParametersI4ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDispatchComputeGroupSizeARB -.type bluegl_glDispatchComputeGroupSizeARB, %function -bluegl_glDispatchComputeGroupSizeARB: - mov __blue_glCore_glDispatchComputeGroupSizeARB@GOTPCREL(%rip), %r11 +.global bluegl_glNamedProgramLocalParameterI4uiEXT +.type bluegl_glNamedProgramLocalParameterI4uiEXT, %function +bluegl_glNamedProgramLocalParameterI4uiEXT: + mov __blue_glCore_glNamedProgramLocalParameterI4uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glShaderOp3EXT -.type bluegl_glShaderOp3EXT, %function -bluegl_glShaderOp3EXT: - mov __blue_glCore_glShaderOp3EXT@GOTPCREL(%rip), %r11 +.global bluegl_glNamedProgramLocalParameterI4uivEXT +.type bluegl_glNamedProgramLocalParameterI4uivEXT, %function +bluegl_glNamedProgramLocalParameterI4uivEXT: + mov __blue_glCore_glNamedProgramLocalParameterI4uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSampleMaskSGIS -.type bluegl_glSampleMaskSGIS, %function -bluegl_glSampleMaskSGIS: - mov __blue_glCore_glSampleMaskSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glNamedProgramLocalParametersI4uivEXT +.type bluegl_glNamedProgramLocalParametersI4uivEXT, %function +bluegl_glNamedProgramLocalParametersI4uivEXT: + mov __blue_glCore_glNamedProgramLocalParametersI4uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexParameterivEXT -.type bluegl_glMultiTexParameterivEXT, %function -bluegl_glMultiTexParameterivEXT: - mov __blue_glCore_glMultiTexParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedProgramLocalParameterIivEXT +.type bluegl_glGetNamedProgramLocalParameterIivEXT, %function +bluegl_glGetNamedProgramLocalParameterIivEXT: + mov __blue_glCore_glGetNamedProgramLocalParameterIivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnMinmax -.type bluegl_glGetnMinmax, %function -bluegl_glGetnMinmax: - mov __blue_glCore_glGetnMinmax@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedProgramLocalParameterIuivEXT +.type bluegl_glGetNamedProgramLocalParameterIuivEXT, %function +bluegl_glGetNamedProgramLocalParameterIuivEXT: + mov __blue_glCore_glGetNamedProgramLocalParameterIuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorP3ui -.type bluegl_glColorP3ui, %function -bluegl_glColorP3ui: - mov __blue_glCore_glColorP3ui@GOTPCREL(%rip), %r11 +.global bluegl_glEnableClientStateiEXT +.type bluegl_glEnableClientStateiEXT, %function +bluegl_glEnableClientStateiEXT: + mov __blue_glCore_glEnableClientStateiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBeginQueryARB -.type bluegl_glBeginQueryARB, %function -bluegl_glBeginQueryARB: - mov __blue_glCore_glBeginQueryARB@GOTPCREL(%rip), %r11 +.global bluegl_glDisableClientStateiEXT +.type bluegl_glDisableClientStateiEXT, %function +bluegl_glDisableClientStateiEXT: + mov __blue_glCore_glDisableClientStateiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiDrawArraysIndirectAMD -.type bluegl_glMultiDrawArraysIndirectAMD, %function -bluegl_glMultiDrawArraysIndirectAMD: - mov __blue_glCore_glMultiDrawArraysIndirectAMD@GOTPCREL(%rip), %r11 +.global bluegl_glGetFloati_vEXT +.type bluegl_glGetFloati_vEXT, %function +bluegl_glGetFloati_vEXT: + mov __blue_glCore_glGetFloati_vEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glRasterPos4xOES -.type bluegl_glRasterPos4xOES, %function -bluegl_glRasterPos4xOES: - mov __blue_glCore_glRasterPos4xOES@GOTPCREL(%rip), %r11 +.global bluegl_glGetDoublei_vEXT +.type bluegl_glGetDoublei_vEXT, %function +bluegl_glGetDoublei_vEXT: + mov __blue_glCore_glGetDoublei_vEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFogCoordPointer -.type bluegl_glFogCoordPointer, %function -bluegl_glFogCoordPointer: - mov __blue_glCore_glFogCoordPointer@GOTPCREL(%rip), %r11 +.global bluegl_glGetPointeri_vEXT +.type bluegl_glGetPointeri_vEXT, %function +bluegl_glGetPointeri_vEXT: + mov __blue_glCore_glGetPointeri_vEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureLightEXT -.type bluegl_glTextureLightEXT, %function -bluegl_glTextureLightEXT: - mov __blue_glCore_glTextureLightEXT@GOTPCREL(%rip), %r11 +.global bluegl_glNamedProgramStringEXT +.type bluegl_glNamedProgramStringEXT, %function +bluegl_glNamedProgramStringEXT: + mov __blue_glCore_glNamedProgramStringEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetCombinerInputParameterfvNV -.type bluegl_glGetCombinerInputParameterfvNV, %function -bluegl_glGetCombinerInputParameterfvNV: - mov __blue_glCore_glGetCombinerInputParameterfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glNamedProgramLocalParameter4dEXT +.type bluegl_glNamedProgramLocalParameter4dEXT, %function +bluegl_glNamedProgramLocalParameter4dEXT: + mov __blue_glCore_glNamedProgramLocalParameter4dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteFragmentShaderATI -.type bluegl_glDeleteFragmentShaderATI, %function -bluegl_glDeleteFragmentShaderATI: - mov __blue_glCore_glDeleteFragmentShaderATI@GOTPCREL(%rip), %r11 +.global bluegl_glNamedProgramLocalParameter4dvEXT +.type bluegl_glNamedProgramLocalParameter4dvEXT, %function +bluegl_glNamedProgramLocalParameter4dvEXT: + mov __blue_glCore_glNamedProgramLocalParameter4dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2sv -.type bluegl_glMultiTexCoord2sv, %function -bluegl_glMultiTexCoord2sv: - mov __blue_glCore_glMultiTexCoord2sv@GOTPCREL(%rip), %r11 +.global bluegl_glNamedProgramLocalParameter4fEXT +.type bluegl_glNamedProgramLocalParameter4fEXT, %function +bluegl_glNamedProgramLocalParameter4fEXT: + mov __blue_glCore_glNamedProgramLocalParameter4fEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2s -.type bluegl_glMultiTexCoord2s, %function -bluegl_glMultiTexCoord2s: - mov __blue_glCore_glMultiTexCoord2s@GOTPCREL(%rip), %r11 +.global bluegl_glNamedProgramLocalParameter4fvEXT +.type bluegl_glNamedProgramLocalParameter4fvEXT, %function +bluegl_glNamedProgramLocalParameter4fvEXT: + mov __blue_glCore_glNamedProgramLocalParameter4fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLightModelxvOES -.type bluegl_glLightModelxvOES, %function -bluegl_glLightModelxvOES: - mov __blue_glCore_glLightModelxvOES@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedProgramLocalParameterdvEXT +.type bluegl_glGetNamedProgramLocalParameterdvEXT, %function +bluegl_glGetNamedProgramLocalParameterdvEXT: + mov __blue_glCore_glGetNamedProgramLocalParameterdvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTessellationFactorAMD -.type bluegl_glTessellationFactorAMD, %function -bluegl_glTessellationFactorAMD: - mov __blue_glCore_glTessellationFactorAMD@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedProgramLocalParameterfvEXT +.type bluegl_glGetNamedProgramLocalParameterfvEXT, %function +bluegl_glGetNamedProgramLocalParameterfvEXT: + mov __blue_glCore_glGetNamedProgramLocalParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVariantivEXT -.type bluegl_glVariantivEXT, %function -bluegl_glVariantivEXT: - mov __blue_glCore_glVariantivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedProgramivEXT +.type bluegl_glGetNamedProgramivEXT, %function +bluegl_glGetNamedProgramivEXT: + mov __blue_glCore_glGetNamedProgramivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedFramebufferRenderbuffer -.type bluegl_glNamedFramebufferRenderbuffer, %function -bluegl_glNamedFramebufferRenderbuffer: - mov __blue_glCore_glNamedFramebufferRenderbuffer@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedProgramStringEXT +.type bluegl_glGetNamedProgramStringEXT, %function +bluegl_glGetNamedProgramStringEXT: + mov __blue_glCore_glGetNamedProgramStringEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2ivARB -.type bluegl_glWindowPos2ivARB, %function -bluegl_glWindowPos2ivARB: - mov __blue_glCore_glWindowPos2ivARB@GOTPCREL(%rip), %r11 +.global bluegl_glNamedRenderbufferStorageEXT +.type bluegl_glNamedRenderbufferStorageEXT, %function +bluegl_glNamedRenderbufferStorageEXT: + mov __blue_glCore_glNamedRenderbufferStorageEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayFogCoordOffsetEXT -.type bluegl_glVertexArrayFogCoordOffsetEXT, %function -bluegl_glVertexArrayFogCoordOffsetEXT: - mov __blue_glCore_glVertexArrayFogCoordOffsetEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedRenderbufferParameterivEXT +.type bluegl_glGetNamedRenderbufferParameterivEXT, %function +bluegl_glGetNamedRenderbufferParameterivEXT: + mov __blue_glCore_glGetNamedRenderbufferParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2i -.type bluegl_glUniform2i, %function -bluegl_glUniform2i: - mov __blue_glCore_glUniform2i@GOTPCREL(%rip), %r11 +.global bluegl_glNamedRenderbufferStorageMultisampleEXT +.type bluegl_glNamedRenderbufferStorageMultisampleEXT, %function +bluegl_glNamedRenderbufferStorageMultisampleEXT: + mov __blue_glCore_glNamedRenderbufferStorageMultisampleEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTexBumpParameterivATI -.type bluegl_glGetTexBumpParameterivATI, %function -bluegl_glGetTexBumpParameterivATI: - mov __blue_glCore_glGetTexBumpParameterivATI@GOTPCREL(%rip), %r11 +.global bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT +.type bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT, %function +bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT: + mov __blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSamplerParameterIuiv -.type bluegl_glSamplerParameterIuiv, %function -bluegl_glSamplerParameterIuiv: - mov __blue_glCore_glSamplerParameterIuiv@GOTPCREL(%rip), %r11 +.global bluegl_glCheckNamedFramebufferStatusEXT +.type bluegl_glCheckNamedFramebufferStatusEXT, %function +bluegl_glCheckNamedFramebufferStatusEXT: + mov __blue_glCore_glCheckNamedFramebufferStatusEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearBufferfv -.type bluegl_glClearBufferfv, %function -bluegl_glClearBufferfv: - mov __blue_glCore_glClearBufferfv@GOTPCREL(%rip), %r11 +.global bluegl_glNamedFramebufferTexture1DEXT +.type bluegl_glNamedFramebufferTexture1DEXT, %function +bluegl_glNamedFramebufferTexture1DEXT: + mov __blue_glCore_glNamedFramebufferTexture1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindTextureUnitParameterEXT -.type bluegl_glBindTextureUnitParameterEXT, %function -bluegl_glBindTextureUnitParameterEXT: - mov __blue_glCore_glBindTextureUnitParameterEXT@GOTPCREL(%rip), %r11 +.global bluegl_glNamedFramebufferTexture2DEXT +.type bluegl_glNamedFramebufferTexture2DEXT, %function +bluegl_glNamedFramebufferTexture2DEXT: + mov __blue_glCore_glNamedFramebufferTexture2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3hNV -.type bluegl_glMultiTexCoord3hNV, %function -bluegl_glMultiTexCoord3hNV: - mov __blue_glCore_glMultiTexCoord3hNV@GOTPCREL(%rip), %r11 +.global bluegl_glNamedFramebufferTexture3DEXT +.type bluegl_glNamedFramebufferTexture3DEXT, %function +bluegl_glNamedFramebufferTexture3DEXT: + mov __blue_glCore_glNamedFramebufferTexture3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3us -.type bluegl_glSecondaryColor3us, %function -bluegl_glSecondaryColor3us: - mov __blue_glCore_glSecondaryColor3us@GOTPCREL(%rip), %r11 +.global bluegl_glNamedFramebufferRenderbufferEXT +.type bluegl_glNamedFramebufferRenderbufferEXT, %function +bluegl_glNamedFramebufferRenderbufferEXT: + mov __blue_glCore_glNamedFramebufferRenderbufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeusvSUN -.type bluegl_glReplacementCodeusvSUN, %function -bluegl_glReplacementCodeusvSUN: - mov __blue_glCore_glReplacementCodeusvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedFramebufferAttachmentParameterivEXT +.type bluegl_glGetNamedFramebufferAttachmentParameterivEXT, %function +bluegl_glGetNamedFramebufferAttachmentParameterivEXT: + mov __blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3bvEXT -.type bluegl_glSecondaryColor3bvEXT, %function -bluegl_glSecondaryColor3bvEXT: - mov __blue_glCore_glSecondaryColor3bvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGenerateTextureMipmapEXT +.type bluegl_glGenerateTextureMipmapEXT, %function +bluegl_glGenerateTextureMipmapEXT: + mov __blue_glCore_glGenerateTextureMipmapEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramPipelineInfoLog -.type bluegl_glGetProgramPipelineInfoLog, %function -bluegl_glGetProgramPipelineInfoLog: - mov __blue_glCore_glGetProgramPipelineInfoLog@GOTPCREL(%rip), %r11 +.global bluegl_glGenerateMultiTexMipmapEXT +.type bluegl_glGenerateMultiTexMipmapEXT, %function +bluegl_glGenerateMultiTexMipmapEXT: + mov __blue_glCore_glGenerateMultiTexMipmapEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVideoi64vNV -.type bluegl_glGetVideoi64vNV, %function -bluegl_glGetVideoi64vNV: - mov __blue_glCore_glGetVideoi64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferDrawBufferEXT +.type bluegl_glFramebufferDrawBufferEXT, %function +bluegl_glFramebufferDrawBufferEXT: + mov __blue_glCore_glFramebufferDrawBufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3iv -.type bluegl_glMultiTexCoord3iv, %function -bluegl_glMultiTexCoord3iv: - mov __blue_glCore_glMultiTexCoord3iv@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferDrawBuffersEXT +.type bluegl_glFramebufferDrawBuffersEXT, %function +bluegl_glFramebufferDrawBuffersEXT: + mov __blue_glCore_glFramebufferDrawBuffersEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayTexCoordOffsetEXT -.type bluegl_glVertexArrayTexCoordOffsetEXT, %function -bluegl_glVertexArrayTexCoordOffsetEXT: - mov __blue_glCore_glVertexArrayTexCoordOffsetEXT@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferReadBufferEXT +.type bluegl_glFramebufferReadBufferEXT, %function +bluegl_glFramebufferReadBufferEXT: + mov __blue_glCore_glFramebufferReadBufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT -.type bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT, %function -bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT: - mov __blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetFramebufferParameterivEXT +.type bluegl_glGetFramebufferParameterivEXT, %function +bluegl_glGetFramebufferParameterivEXT: + mov __blue_glCore_glGetFramebufferParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetSamplerParameterIuiv -.type bluegl_glGetSamplerParameterIuiv, %function -bluegl_glGetSamplerParameterIuiv: - mov __blue_glCore_glGetSamplerParameterIuiv@GOTPCREL(%rip), %r11 +.global bluegl_glNamedCopyBufferSubDataEXT +.type bluegl_glNamedCopyBufferSubDataEXT, %function +bluegl_glNamedCopyBufferSubDataEXT: + mov __blue_glCore_glNamedCopyBufferSubDataEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib2dARB -.type bluegl_glVertexAttrib2dARB, %function -bluegl_glVertexAttrib2dARB: - mov __blue_glCore_glVertexAttrib2dARB@GOTPCREL(%rip), %r11 +.global bluegl_glNamedFramebufferTextureEXT +.type bluegl_glNamedFramebufferTextureEXT, %function +bluegl_glNamedFramebufferTextureEXT: + mov __blue_glCore_glNamedFramebufferTextureEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormalStream3svATI -.type bluegl_glNormalStream3svATI, %function -bluegl_glNormalStream3svATI: - mov __blue_glCore_glNormalStream3svATI@GOTPCREL(%rip), %r11 +.global bluegl_glNamedFramebufferTextureLayerEXT +.type bluegl_glNamedFramebufferTextureLayerEXT, %function +bluegl_glNamedFramebufferTextureLayerEXT: + mov __blue_glCore_glNamedFramebufferTextureLayerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClientActiveVertexStreamATI -.type bluegl_glClientActiveVertexStreamATI, %function -bluegl_glClientActiveVertexStreamATI: - mov __blue_glCore_glClientActiveVertexStreamATI@GOTPCREL(%rip), %r11 +.global bluegl_glNamedFramebufferTextureFaceEXT +.type bluegl_glNamedFramebufferTextureFaceEXT, %function +bluegl_glNamedFramebufferTextureFaceEXT: + mov __blue_glCore_glNamedFramebufferTextureFaceEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStencilThenCoverFillPathInstancedNV -.type bluegl_glStencilThenCoverFillPathInstancedNV, %function -bluegl_glStencilThenCoverFillPathInstancedNV: - mov __blue_glCore_glStencilThenCoverFillPathInstancedNV@GOTPCREL(%rip), %r11 +.global bluegl_glTextureRenderbufferEXT +.type bluegl_glTextureRenderbufferEXT, %function +bluegl_glTextureRenderbufferEXT: + mov __blue_glCore_glTextureRenderbufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3uiEXT -.type bluegl_glSecondaryColor3uiEXT, %function -bluegl_glSecondaryColor3uiEXT: - mov __blue_glCore_glSecondaryColor3uiEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexRenderbufferEXT +.type bluegl_glMultiTexRenderbufferEXT, %function +bluegl_glMultiTexRenderbufferEXT: + mov __blue_glCore_glMultiTexRenderbufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord2hNV -.type bluegl_glTexCoord2hNV, %function -bluegl_glTexCoord2hNV: - mov __blue_glCore_glTexCoord2hNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayVertexOffsetEXT +.type bluegl_glVertexArrayVertexOffsetEXT, %function +bluegl_glVertexArrayVertexOffsetEXT: + mov __blue_glCore_glVertexArrayVertexOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3fARB -.type bluegl_glVertexAttrib3fARB, %function -bluegl_glVertexAttrib3fARB: - mov __blue_glCore_glVertexAttrib3fARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayColorOffsetEXT +.type bluegl_glVertexArrayColorOffsetEXT, %function +bluegl_glVertexArrayColorOffsetEXT: + mov __blue_glCore_glVertexArrayColorOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetQueryBufferObjectui64v -.type bluegl_glGetQueryBufferObjectui64v, %function -bluegl_glGetQueryBufferObjectui64v: - mov __blue_glCore_glGetQueryBufferObjectui64v@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayEdgeFlagOffsetEXT +.type bluegl_glVertexArrayEdgeFlagOffsetEXT, %function +bluegl_glVertexArrayEdgeFlagOffsetEXT: + mov __blue_glCore_glVertexArrayEdgeFlagOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMaterialxOES -.type bluegl_glGetMaterialxOES, %function -bluegl_glGetMaterialxOES: - mov __blue_glCore_glGetMaterialxOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayIndexOffsetEXT +.type bluegl_glVertexArrayIndexOffsetEXT, %function +bluegl_glVertexArrayIndexOffsetEXT: + mov __blue_glCore_glVertexArrayIndexOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiDrawArrays -.type bluegl_glMultiDrawArrays, %function -bluegl_glMultiDrawArrays: - mov __blue_glCore_glMultiDrawArrays@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayNormalOffsetEXT +.type bluegl_glVertexArrayNormalOffsetEXT, %function +bluegl_glVertexArrayNormalOffsetEXT: + mov __blue_glCore_glVertexArrayNormalOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3iEXT -.type bluegl_glSecondaryColor3iEXT, %function -bluegl_glSecondaryColor3iEXT: - mov __blue_glCore_glSecondaryColor3iEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayTexCoordOffsetEXT +.type bluegl_glVertexArrayTexCoordOffsetEXT, %function +bluegl_glVertexArrayTexCoordOffsetEXT: + mov __blue_glCore_glVertexArrayTexCoordOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2ui64NV -.type bluegl_glProgramUniform2ui64NV, %function -bluegl_glProgramUniform2ui64NV: - mov __blue_glCore_glProgramUniform2ui64NV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayMultiTexCoordOffsetEXT +.type bluegl_glVertexArrayMultiTexCoordOffsetEXT, %function +bluegl_glVertexArrayMultiTexCoordOffsetEXT: + mov __blue_glCore_glVertexArrayMultiTexCoordOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteQueries -.type bluegl_glDeleteQueries, %function -bluegl_glDeleteQueries: - mov __blue_glCore_glDeleteQueries@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayFogCoordOffsetEXT +.type bluegl_glVertexArrayFogCoordOffsetEXT, %function +bluegl_glVertexArrayFogCoordOffsetEXT: + mov __blue_glCore_glVertexArrayFogCoordOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteRenderbuffers -.type bluegl_glDeleteRenderbuffers, %function -bluegl_glDeleteRenderbuffers: - mov __blue_glCore_glDeleteRenderbuffers@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArraySecondaryColorOffsetEXT +.type bluegl_glVertexArraySecondaryColorOffsetEXT, %function +bluegl_glVertexArraySecondaryColorOffsetEXT: + mov __blue_glCore_glVertexArraySecondaryColorOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramLocalParameterdvARB -.type bluegl_glGetProgramLocalParameterdvARB, %function -bluegl_glGetProgramLocalParameterdvARB: - mov __blue_glCore_glGetProgramLocalParameterdvARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayVertexAttribOffsetEXT +.type bluegl_glVertexArrayVertexAttribOffsetEXT, %function +bluegl_glVertexArrayVertexAttribOffsetEXT: + mov __blue_glCore_glVertexArrayVertexAttribOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord2xOES -.type bluegl_glTexCoord2xOES, %function -bluegl_glTexCoord2xOES: - mov __blue_glCore_glTexCoord2xOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayVertexAttribIOffsetEXT +.type bluegl_glVertexArrayVertexAttribIOffsetEXT, %function +bluegl_glVertexArrayVertexAttribIOffsetEXT: + mov __blue_glCore_glVertexArrayVertexAttribIOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindBuffer -.type bluegl_glBindBuffer, %function -bluegl_glBindBuffer: - mov __blue_glCore_glBindBuffer@GOTPCREL(%rip), %r11 +.global bluegl_glEnableVertexArrayEXT +.type bluegl_glEnableVertexArrayEXT, %function +bluegl_glEnableVertexArrayEXT: + mov __blue_glCore_glEnableVertexArrayEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glResumeTransformFeedback -.type bluegl_glResumeTransformFeedback, %function -bluegl_glResumeTransformFeedback: - mov __blue_glCore_glResumeTransformFeedback@GOTPCREL(%rip), %r11 +.global bluegl_glDisableVertexArrayEXT +.type bluegl_glDisableVertexArrayEXT, %function +bluegl_glDisableVertexArrayEXT: + mov __blue_glCore_glDisableVertexArrayEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFlushPixelDataRangeNV -.type bluegl_glFlushPixelDataRangeNV, %function -bluegl_glFlushPixelDataRangeNV: - mov __blue_glCore_glFlushPixelDataRangeNV@GOTPCREL(%rip), %r11 +.global bluegl_glEnableVertexArrayAttribEXT +.type bluegl_glEnableVertexArrayAttribEXT, %function +bluegl_glEnableVertexArrayAttribEXT: + mov __blue_glCore_glEnableVertexArrayAttribEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColorPointer -.type bluegl_glSecondaryColorPointer, %function -bluegl_glSecondaryColorPointer: - mov __blue_glCore_glSecondaryColorPointer@GOTPCREL(%rip), %r11 +.global bluegl_glDisableVertexArrayAttribEXT +.type bluegl_glDisableVertexArrayAttribEXT, %function +bluegl_glDisableVertexArrayAttribEXT: + mov __blue_glCore_glDisableVertexArrayAttribEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVideoCaptureStreamParameterdvNV -.type bluegl_glVideoCaptureStreamParameterdvNV, %function -bluegl_glVideoCaptureStreamParameterdvNV: - mov __blue_glCore_glVideoCaptureStreamParameterdvNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexArrayIntegervEXT +.type bluegl_glGetVertexArrayIntegervEXT, %function +bluegl_glGetVertexArrayIntegervEXT: + mov __blue_glCore_glGetVertexArrayIntegervEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureSubImage2DEXT -.type bluegl_glTextureSubImage2DEXT, %function -bluegl_glTextureSubImage2DEXT: - mov __blue_glCore_glTextureSubImage2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexArrayPointervEXT +.type bluegl_glGetVertexArrayPointervEXT, %function +bluegl_glGetVertexArrayPointervEXT: + mov __blue_glCore_glGetVertexArrayPointervEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeletePathsNV -.type bluegl_glDeletePathsNV, %function -bluegl_glDeletePathsNV: - mov __blue_glCore_glDeletePathsNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexArrayIntegeri_vEXT +.type bluegl_glGetVertexArrayIntegeri_vEXT, %function +bluegl_glGetVertexArrayIntegeri_vEXT: + mov __blue_glCore_glGetVertexArrayIntegeri_vEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFloatv -.type bluegl_glGetFloatv, %function -bluegl_glGetFloatv: - mov __blue_glCore_glGetFloatv@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexArrayPointeri_vEXT +.type bluegl_glGetVertexArrayPointeri_vEXT, %function +bluegl_glGetVertexArrayPointeri_vEXT: + mov __blue_glCore_glGetVertexArrayPointeri_vEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI3uivEXT -.type bluegl_glVertexAttribI3uivEXT, %function -bluegl_glVertexAttribI3uivEXT: - mov __blue_glCore_glVertexAttribI3uivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMapNamedBufferRangeEXT +.type bluegl_glMapNamedBufferRangeEXT, %function +bluegl_glMapNamedBufferRangeEXT: + mov __blue_glCore_glMapNamedBufferRangeEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribdvARB -.type bluegl_glGetVertexAttribdvARB, %function -bluegl_glGetVertexAttribdvARB: - mov __blue_glCore_glGetVertexAttribdvARB@GOTPCREL(%rip), %r11 +.global bluegl_glFlushMappedNamedBufferRangeEXT +.type bluegl_glFlushMappedNamedBufferRangeEXT, %function +bluegl_glFlushMappedNamedBufferRangeEXT: + mov __blue_glCore_glFlushMappedNamedBufferRangeEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4ui64NV -.type bluegl_glUniform4ui64NV, %function -bluegl_glUniform4ui64NV: - mov __blue_glCore_glUniform4ui64NV@GOTPCREL(%rip), %r11 +.global bluegl_glNamedBufferStorageEXT +.type bluegl_glNamedBufferStorageEXT, %function +bluegl_glNamedBufferStorageEXT: + mov __blue_glCore_glNamedBufferStorageEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureLevelParameterfv -.type bluegl_glGetTextureLevelParameterfv, %function -bluegl_glGetTextureLevelParameterfv: - mov __blue_glCore_glGetTextureLevelParameterfv@GOTPCREL(%rip), %r11 +.global bluegl_glClearNamedBufferDataEXT +.type bluegl_glClearNamedBufferDataEXT, %function +bluegl_glClearNamedBufferDataEXT: + mov __blue_glCore_glClearNamedBufferDataEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2i -.type bluegl_glWindowPos2i, %function -bluegl_glWindowPos2i: - mov __blue_glCore_glWindowPos2i@GOTPCREL(%rip), %r11 +.global bluegl_glClearNamedBufferSubDataEXT +.type bluegl_glClearNamedBufferSubDataEXT, %function +bluegl_glClearNamedBufferSubDataEXT: + mov __blue_glCore_glClearNamedBufferSubDataEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeuiColor4ubVertex3fSUN -.type bluegl_glReplacementCodeuiColor4ubVertex3fSUN, %function -bluegl_glReplacementCodeuiColor4ubVertex3fSUN: - mov __blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glNamedFramebufferParameteriEXT +.type bluegl_glNamedFramebufferParameteriEXT, %function +bluegl_glNamedFramebufferParameteriEXT: + mov __blue_glCore_glNamedFramebufferParameteriEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedMultiTexSubImage3DEXT -.type bluegl_glCompressedMultiTexSubImage3DEXT, %function -bluegl_glCompressedMultiTexSubImage3DEXT: - mov __blue_glCore_glCompressedMultiTexSubImage3DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedFramebufferParameterivEXT +.type bluegl_glGetNamedFramebufferParameterivEXT, %function +bluegl_glGetNamedFramebufferParameterivEXT: + mov __blue_glCore_glGetNamedFramebufferParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTexParameterIivEXT -.type bluegl_glGetTexParameterIivEXT, %function -bluegl_glGetTexParameterIivEXT: - mov __blue_glCore_glGetTexParameterIivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1dEXT +.type bluegl_glProgramUniform1dEXT, %function +bluegl_glProgramUniform1dEXT: + mov __blue_glCore_glProgramUniform1dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDebugMessageCallbackARB -.type bluegl_glDebugMessageCallbackARB, %function -bluegl_glDebugMessageCallbackARB: - mov __blue_glCore_glDebugMessageCallbackARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2dEXT +.type bluegl_glProgramUniform2dEXT, %function +bluegl_glProgramUniform2dEXT: + mov __blue_glCore_glProgramUniform2dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWeightPointerARB -.type bluegl_glWeightPointerARB, %function -bluegl_glWeightPointerARB: - mov __blue_glCore_glWeightPointerARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3dEXT +.type bluegl_glProgramUniform3dEXT, %function +bluegl_glProgramUniform3dEXT: + mov __blue_glCore_glProgramUniform3dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFogxOES -.type bluegl_glFogxOES, %function -bluegl_glFogxOES: - mov __blue_glCore_glFogxOES@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4dEXT +.type bluegl_glProgramUniform4dEXT, %function +bluegl_glProgramUniform4dEXT: + mov __blue_glCore_glProgramUniform4dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix2x4fvEXT -.type bluegl_glProgramUniformMatrix2x4fvEXT, %function -bluegl_glProgramUniformMatrix2x4fvEXT: - mov __blue_glCore_glProgramUniformMatrix2x4fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform1dvEXT +.type bluegl_glProgramUniform1dvEXT, %function +bluegl_glProgramUniform1dvEXT: + mov __blue_glCore_glProgramUniform1dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4iv -.type bluegl_glVertexAttrib4iv, %function -bluegl_glVertexAttrib4iv: - mov __blue_glCore_glVertexAttrib4iv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform2dvEXT +.type bluegl_glProgramUniform2dvEXT, %function +bluegl_glProgramUniform2dvEXT: + mov __blue_glCore_glProgramUniform2dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramLocalParameterI4iNV -.type bluegl_glProgramLocalParameterI4iNV, %function -bluegl_glProgramLocalParameterI4iNV: - mov __blue_glCore_glProgramLocalParameterI4iNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform3dvEXT +.type bluegl_glProgramUniform3dvEXT, %function +bluegl_glProgramUniform3dvEXT: + mov __blue_glCore_glProgramUniform3dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnColorTableARB -.type bluegl_glGetnColorTableARB, %function -bluegl_glGetnColorTableARB: - mov __blue_glCore_glGetnColorTableARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniform4dvEXT +.type bluegl_glProgramUniform4dvEXT, %function +bluegl_glProgramUniform4dvEXT: + mov __blue_glCore_glProgramUniform4dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearNamedBufferData -.type bluegl_glClearNamedBufferData, %function -bluegl_glClearNamedBufferData: - mov __blue_glCore_glClearNamedBufferData@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix2dvEXT +.type bluegl_glProgramUniformMatrix2dvEXT, %function +bluegl_glProgramUniformMatrix2dvEXT: + mov __blue_glCore_glProgramUniformMatrix2dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorMaskIndexedEXT -.type bluegl_glColorMaskIndexedEXT, %function -bluegl_glColorMaskIndexedEXT: - mov __blue_glCore_glColorMaskIndexedEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix3dvEXT +.type bluegl_glProgramUniformMatrix3dvEXT, %function +bluegl_glProgramUniformMatrix3dvEXT: + mov __blue_glCore_glProgramUniformMatrix3dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribLPointer -.type bluegl_glVertexAttribLPointer, %function -bluegl_glVertexAttribLPointer: - mov __blue_glCore_glVertexAttribLPointer@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix4dvEXT +.type bluegl_glProgramUniformMatrix4dvEXT, %function +bluegl_glProgramUniformMatrix4dvEXT: + mov __blue_glCore_glProgramUniformMatrix4dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3i64vNV -.type bluegl_glProgramUniform3i64vNV, %function -bluegl_glProgramUniform3i64vNV: - mov __blue_glCore_glProgramUniform3i64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix2x3dvEXT +.type bluegl_glProgramUniformMatrix2x3dvEXT, %function +bluegl_glProgramUniformMatrix2x3dvEXT: + mov __blue_glCore_glProgramUniformMatrix2x3dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glScissor -.type bluegl_glScissor, %function -bluegl_glScissor: - mov __blue_glCore_glScissor@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix2x4dvEXT +.type bluegl_glProgramUniformMatrix2x4dvEXT, %function +bluegl_glProgramUniformMatrix2x4dvEXT: + mov __blue_glCore_glProgramUniformMatrix2x4dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3fv -.type bluegl_glSecondaryColor3fv, %function -bluegl_glSecondaryColor3fv: - mov __blue_glCore_glSecondaryColor3fv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix3x2dvEXT +.type bluegl_glProgramUniformMatrix3x2dvEXT, %function +bluegl_glProgramUniformMatrix3x2dvEXT: + mov __blue_glCore_glProgramUniformMatrix3x2dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCombinerParameterivNV -.type bluegl_glCombinerParameterivNV, %function -bluegl_glCombinerParameterivNV: - mov __blue_glCore_glCombinerParameterivNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix3x4dvEXT +.type bluegl_glProgramUniformMatrix3x4dvEXT, %function +bluegl_glProgramUniformMatrix3x4dvEXT: + mov __blue_glCore_glProgramUniformMatrix3x4dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTexLevelParameterfv -.type bluegl_glGetTexLevelParameterfv, %function -bluegl_glGetTexLevelParameterfv: - mov __blue_glCore_glGetTexLevelParameterfv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix4x2dvEXT +.type bluegl_glProgramUniformMatrix4x2dvEXT, %function +bluegl_glProgramUniformMatrix4x2dvEXT: + mov __blue_glCore_glProgramUniformMatrix4x2dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawElementArrayATI -.type bluegl_glDrawElementArrayATI, %function -bluegl_glDrawElementArrayATI: - mov __blue_glCore_glDrawElementArrayATI@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformMatrix4x3dvEXT +.type bluegl_glProgramUniformMatrix4x3dvEXT, %function +bluegl_glProgramUniformMatrix4x3dvEXT: + mov __blue_glCore_glProgramUniformMatrix4x3dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4Nusv -.type bluegl_glVertexAttrib4Nusv, %function -bluegl_glVertexAttrib4Nusv: - mov __blue_glCore_glVertexAttrib4Nusv@GOTPCREL(%rip), %r11 +.global bluegl_glTextureBufferRangeEXT +.type bluegl_glTextureBufferRangeEXT, %function +bluegl_glTextureBufferRangeEXT: + mov __blue_glCore_glTextureBufferRangeEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3dvMESA -.type bluegl_glWindowPos3dvMESA, %function -bluegl_glWindowPos3dvMESA: - mov __blue_glCore_glWindowPos3dvMESA@GOTPCREL(%rip), %r11 +.global bluegl_glTextureStorage1DEXT +.type bluegl_glTextureStorage1DEXT, %function +bluegl_glTextureStorage1DEXT: + mov __blue_glCore_glTextureStorage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMakeImageHandleResidentARB -.type bluegl_glMakeImageHandleResidentARB, %function -bluegl_glMakeImageHandleResidentARB: - mov __blue_glCore_glMakeImageHandleResidentARB@GOTPCREL(%rip), %r11 +.global bluegl_glTextureStorage2DEXT +.type bluegl_glTextureStorage2DEXT, %function +bluegl_glTextureStorage2DEXT: + mov __blue_glCore_glTextureStorage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3svMESA -.type bluegl_glWindowPos3svMESA, %function -bluegl_glWindowPos3svMESA: - mov __blue_glCore_glWindowPos3svMESA@GOTPCREL(%rip), %r11 +.global bluegl_glTextureStorage3DEXT +.type bluegl_glTextureStorage3DEXT, %function +bluegl_glTextureStorage3DEXT: + mov __blue_glCore_glTextureStorage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMultiTexLevelParameterfvEXT -.type bluegl_glGetMultiTexLevelParameterfvEXT, %function -bluegl_glGetMultiTexLevelParameterfvEXT: - mov __blue_glCore_glGetMultiTexLevelParameterfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTextureStorage2DMultisampleEXT +.type bluegl_glTextureStorage2DMultisampleEXT, %function +bluegl_glTextureStorage2DMultisampleEXT: + mov __blue_glCore_glTextureStorage2DMultisampleEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glRasterPos3xOES -.type bluegl_glRasterPos3xOES, %function -bluegl_glRasterPos3xOES: - mov __blue_glCore_glRasterPos3xOES@GOTPCREL(%rip), %r11 +.global bluegl_glTextureStorage3DMultisampleEXT +.type bluegl_glTextureStorage3DMultisampleEXT, %function +bluegl_glTextureStorage3DMultisampleEXT: + mov __blue_glCore_glTextureStorage3DMultisampleEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBinormal3iEXT -.type bluegl_glBinormal3iEXT, %function -bluegl_glBinormal3iEXT: - mov __blue_glCore_glBinormal3iEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayBindVertexBufferEXT +.type bluegl_glVertexArrayBindVertexBufferEXT, %function +bluegl_glVertexArrayBindVertexBufferEXT: + mov __blue_glCore_glVertexArrayBindVertexBufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribP3uiv -.type bluegl_glVertexAttribP3uiv, %function -bluegl_glVertexAttribP3uiv: - mov __blue_glCore_glVertexAttribP3uiv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayVertexAttribFormatEXT +.type bluegl_glVertexArrayVertexAttribFormatEXT, %function +bluegl_glVertexArrayVertexAttribFormatEXT: + mov __blue_glCore_glVertexArrayVertexAttribFormatEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix2x3dv -.type bluegl_glProgramUniformMatrix2x3dv, %function -bluegl_glProgramUniformMatrix2x3dv: - mov __blue_glCore_glProgramUniformMatrix2x3dv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayVertexAttribIFormatEXT +.type bluegl_glVertexArrayVertexAttribIFormatEXT, %function +bluegl_glVertexArrayVertexAttribIFormatEXT: + mov __blue_glCore_glVertexArrayVertexAttribIFormatEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEndConditionalRender -.type bluegl_glEndConditionalRender, %function -bluegl_glEndConditionalRender: - mov __blue_glCore_glEndConditionalRender@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayVertexAttribLFormatEXT +.type bluegl_glVertexArrayVertexAttribLFormatEXT, %function +bluegl_glVertexArrayVertexAttribLFormatEXT: + mov __blue_glCore_glVertexArrayVertexAttribLFormatEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindParameterEXT -.type bluegl_glBindParameterEXT, %function -bluegl_glBindParameterEXT: - mov __blue_glCore_glBindParameterEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayVertexAttribBindingEXT +.type bluegl_glVertexArrayVertexAttribBindingEXT, %function +bluegl_glVertexArrayVertexAttribBindingEXT: + mov __blue_glCore_glVertexArrayVertexAttribBindingEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompileShaderIncludeARB -.type bluegl_glCompileShaderIncludeARB, %function -bluegl_glCompileShaderIncludeARB: - mov __blue_glCore_glCompileShaderIncludeARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayVertexBindingDivisorEXT +.type bluegl_glVertexArrayVertexBindingDivisorEXT, %function +bluegl_glVertexArrayVertexBindingDivisorEXT: + mov __blue_glCore_glVertexArrayVertexBindingDivisorEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexStorageSparseAMD -.type bluegl_glTexStorageSparseAMD, %function -bluegl_glTexStorageSparseAMD: - mov __blue_glCore_glTexStorageSparseAMD@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayVertexAttribLOffsetEXT +.type bluegl_glVertexArrayVertexAttribLOffsetEXT, %function +bluegl_glVertexArrayVertexAttribLOffsetEXT: + mov __blue_glCore_glVertexArrayVertexAttribLOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreateShaderProgramEXT -.type bluegl_glCreateShaderProgramEXT, %function -bluegl_glCreateShaderProgramEXT: - mov __blue_glCore_glCreateShaderProgramEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexturePageCommitmentEXT +.type bluegl_glTexturePageCommitmentEXT, %function +bluegl_glTexturePageCommitmentEXT: + mov __blue_glCore_glTexturePageCommitmentEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix3x2fv -.type bluegl_glUniformMatrix3x2fv, %function -bluegl_glUniformMatrix3x2fv: - mov __blue_glCore_glUniformMatrix3x2fv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayVertexAttribDivisorEXT +.type bluegl_glVertexArrayVertexAttribDivisorEXT, %function +bluegl_glVertexArrayVertexAttribDivisorEXT: + mov __blue_glCore_glVertexArrayVertexAttribDivisorEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPrimitiveRestartIndex -.type bluegl_glPrimitiveRestartIndex, %function -bluegl_glPrimitiveRestartIndex: - mov __blue_glCore_glPrimitiveRestartIndex@GOTPCREL(%rip), %r11 +.global bluegl_glColorMaskIndexedEXT +.type bluegl_glColorMaskIndexedEXT, %function +bluegl_glColorMaskIndexedEXT: + mov __blue_glCore_glColorMaskIndexedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreateProgram -.type bluegl_glCreateProgram, %function -bluegl_glCreateProgram: - mov __blue_glCore_glCreateProgram@GOTPCREL(%rip), %r11 +.global bluegl_glDrawArraysInstancedEXT +.type bluegl_glDrawArraysInstancedEXT, %function +bluegl_glDrawArraysInstancedEXT: + mov __blue_glCore_glDrawArraysInstancedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3d -.type bluegl_glMultiTexCoord3d, %function -bluegl_glMultiTexCoord3d: - mov __blue_glCore_glMultiTexCoord3d@GOTPCREL(%rip), %r11 +.global bluegl_glDrawElementsInstancedEXT +.type bluegl_glDrawElementsInstancedEXT, %function +bluegl_glDrawElementsInstancedEXT: + mov __blue_glCore_glDrawElementsInstancedEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFenceivNV -.type bluegl_glGetFenceivNV, %function -bluegl_glGetFenceivNV: - mov __blue_glCore_glGetFenceivNV@GOTPCREL(%rip), %r11 +.global bluegl_glDrawRangeElementsEXT +.type bluegl_glDrawRangeElementsEXT, %function +bluegl_glDrawRangeElementsEXT: + mov __blue_glCore_glDrawRangeElementsEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4dv -.type bluegl_glUniform4dv, %function -bluegl_glUniform4dv: - mov __blue_glCore_glUniform4dv@GOTPCREL(%rip), %r11 +.global bluegl_glFogCoordfEXT +.type bluegl_glFogCoordfEXT, %function +bluegl_glFogCoordfEXT: + mov __blue_glCore_glFogCoordfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3i64ARB -.type bluegl_glUniform3i64ARB, %function -bluegl_glUniform3i64ARB: - mov __blue_glCore_glUniform3i64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glFogCoordfvEXT +.type bluegl_glFogCoordfvEXT, %function +bluegl_glFogCoordfvEXT: + mov __blue_glCore_glFogCoordfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexturePageCommitmentEXT -.type bluegl_glTexturePageCommitmentEXT, %function -bluegl_glTexturePageCommitmentEXT: - mov __blue_glCore_glTexturePageCommitmentEXT@GOTPCREL(%rip), %r11 +.global bluegl_glFogCoorddEXT +.type bluegl_glFogCoorddEXT, %function +bluegl_glFogCoorddEXT: + mov __blue_glCore_glFogCoorddEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColor4hNV -.type bluegl_glColor4hNV, %function -bluegl_glColor4hNV: - mov __blue_glCore_glColor4hNV@GOTPCREL(%rip), %r11 +.global bluegl_glFogCoorddvEXT +.type bluegl_glFogCoorddvEXT, %function +bluegl_glFogCoorddvEXT: + mov __blue_glCore_glFogCoorddvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream2fATI -.type bluegl_glVertexStream2fATI, %function -bluegl_glVertexStream2fATI: - mov __blue_glCore_glVertexStream2fATI@GOTPCREL(%rip), %r11 +.global bluegl_glFogCoordPointerEXT +.type bluegl_glFogCoordPointerEXT, %function +bluegl_glFogCoordPointerEXT: + mov __blue_glCore_glFogCoordPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDisable -.type bluegl_glDisable, %function -bluegl_glDisable: - mov __blue_glCore_glDisable@GOTPCREL(%rip), %r11 +.global bluegl_glBlitFramebufferEXT +.type bluegl_glBlitFramebufferEXT, %function +bluegl_glBlitFramebufferEXT: + mov __blue_glCore_glBlitFramebufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferRenderbuffer -.type bluegl_glFramebufferRenderbuffer, %function -bluegl_glFramebufferRenderbuffer: - mov __blue_glCore_glFramebufferRenderbuffer@GOTPCREL(%rip), %r11 +.global bluegl_glRenderbufferStorageMultisampleEXT +.type bluegl_glRenderbufferStorageMultisampleEXT, %function +bluegl_glRenderbufferStorageMultisampleEXT: + mov __blue_glCore_glRenderbufferStorageMultisampleEXT@GOTPCREL(%rip), %r11 jmp *(%r11) .global bluegl_glIsRenderbufferEXT @@ -10603,1186 +10590,1216 @@ bluegl_glIsRenderbufferEXT: mov __blue_glCore_glIsRenderbufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMultiTexParameterIivEXT -.type bluegl_glGetMultiTexParameterIivEXT, %function -bluegl_glGetMultiTexParameterIivEXT: - mov __blue_glCore_glGetMultiTexParameterIivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBindRenderbufferEXT +.type bluegl_glBindRenderbufferEXT, %function +bluegl_glBindRenderbufferEXT: + mov __blue_glCore_glBindRenderbufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib2fvNV -.type bluegl_glVertexAttrib2fvNV, %function -bluegl_glVertexAttrib2fvNV: - mov __blue_glCore_glVertexAttrib2fvNV@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteRenderbuffersEXT +.type bluegl_glDeleteRenderbuffersEXT, %function +bluegl_glDeleteRenderbuffersEXT: + mov __blue_glCore_glDeleteRenderbuffersEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReferencePlaneSGIX -.type bluegl_glReferencePlaneSGIX, %function -bluegl_glReferencePlaneSGIX: - mov __blue_glCore_glReferencePlaneSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glGenRenderbuffersEXT +.type bluegl_glGenRenderbuffersEXT, %function +bluegl_glGenRenderbuffersEXT: + mov __blue_glCore_glGenRenderbuffersEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4fARB -.type bluegl_glUniform4fARB, %function -bluegl_glUniform4fARB: - mov __blue_glCore_glUniform4fARB@GOTPCREL(%rip), %r11 +.global bluegl_glRenderbufferStorageEXT +.type bluegl_glRenderbufferStorageEXT, %function +bluegl_glRenderbufferStorageEXT: + mov __blue_glCore_glRenderbufferStorageEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearBufferfi -.type bluegl_glClearBufferfi, %function -bluegl_glClearBufferfi: - mov __blue_glCore_glClearBufferfi@GOTPCREL(%rip), %r11 +.global bluegl_glGetRenderbufferParameterivEXT +.type bluegl_glGetRenderbufferParameterivEXT, %function +bluegl_glGetRenderbufferParameterivEXT: + mov __blue_glCore_glGetRenderbufferParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindFragDataLocation -.type bluegl_glBindFragDataLocation, %function -bluegl_glBindFragDataLocation: - mov __blue_glCore_glBindFragDataLocation@GOTPCREL(%rip), %r11 +.global bluegl_glIsFramebufferEXT +.type bluegl_glIsFramebufferEXT, %function +bluegl_glIsFramebufferEXT: + mov __blue_glCore_glIsFramebufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetIntegerv -.type bluegl_glGetIntegerv, %function -bluegl_glGetIntegerv: - mov __blue_glCore_glGetIntegerv@GOTPCREL(%rip), %r11 +.global bluegl_glBindFramebufferEXT +.type bluegl_glBindFramebufferEXT, %function +bluegl_glBindFramebufferEXT: + mov __blue_glCore_glBindFramebufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetObjectLabel -.type bluegl_glGetObjectLabel, %function -bluegl_glGetObjectLabel: - mov __blue_glCore_glGetObjectLabel@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteFramebuffersEXT +.type bluegl_glDeleteFramebuffersEXT, %function +bluegl_glDeleteFramebuffersEXT: + mov __blue_glCore_glDeleteFramebuffersEXT@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glGenFramebuffersEXT +.type bluegl_glGenFramebuffersEXT, %function +bluegl_glGenFramebuffersEXT: + mov __blue_glCore_glGenFramebuffersEXT@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glCheckFramebufferStatusEXT +.type bluegl_glCheckFramebufferStatusEXT, %function +bluegl_glCheckFramebufferStatusEXT: + mov __blue_glCore_glCheckFramebufferStatusEXT@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glFramebufferTexture1DEXT +.type bluegl_glFramebufferTexture1DEXT, %function +bluegl_glFramebufferTexture1DEXT: + mov __blue_glCore_glFramebufferTexture1DEXT@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glFramebufferTexture2DEXT +.type bluegl_glFramebufferTexture2DEXT, %function +bluegl_glFramebufferTexture2DEXT: + mov __blue_glCore_glFramebufferTexture2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBufferPageCommitmentARB -.type bluegl_glBufferPageCommitmentARB, %function -bluegl_glBufferPageCommitmentARB: - mov __blue_glCore_glBufferPageCommitmentARB@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferTexture3DEXT +.type bluegl_glFramebufferTexture3DEXT, %function +bluegl_glFramebufferTexture3DEXT: + mov __blue_glCore_glFramebufferTexture3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendFuncIndexedAMD -.type bluegl_glBlendFuncIndexedAMD, %function -bluegl_glBlendFuncIndexedAMD: - mov __blue_glCore_glBlendFuncIndexedAMD@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferRenderbufferEXT +.type bluegl_glFramebufferRenderbufferEXT, %function +bluegl_glFramebufferRenderbufferEXT: + mov __blue_glCore_glFramebufferRenderbufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetQueryObjectui64vEXT -.type bluegl_glGetQueryObjectui64vEXT, %function -bluegl_glGetQueryObjectui64vEXT: - mov __blue_glCore_glGetQueryObjectui64vEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetFramebufferAttachmentParameterivEXT +.type bluegl_glGetFramebufferAttachmentParameterivEXT, %function +bluegl_glGetFramebufferAttachmentParameterivEXT: + mov __blue_glCore_glGetFramebufferAttachmentParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN -.type bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN, %function -bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN: - mov __blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glGenerateMipmapEXT +.type bluegl_glGenerateMipmapEXT, %function +bluegl_glGenerateMipmapEXT: + mov __blue_glCore_glGenerateMipmapEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlitFramebuffer -.type bluegl_glBlitFramebuffer, %function -bluegl_glBlitFramebuffer: - mov __blue_glCore_glBlitFramebuffer@GOTPCREL(%rip), %r11 +.global bluegl_glProgramParameteriEXT +.type bluegl_glProgramParameteriEXT, %function +bluegl_glProgramParameteriEXT: + mov __blue_glCore_glProgramParameteriEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2f -.type bluegl_glMultiTexCoord2f, %function -bluegl_glMultiTexCoord2f: - mov __blue_glCore_glMultiTexCoord2f@GOTPCREL(%rip), %r11 +.global bluegl_glProgramEnvParameters4fvEXT +.type bluegl_glProgramEnvParameters4fvEXT, %function +bluegl_glProgramEnvParameters4fvEXT: + mov __blue_glCore_glProgramEnvParameters4fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedFramebufferRenderbufferEXT -.type bluegl_glNamedFramebufferRenderbufferEXT, %function -bluegl_glNamedFramebufferRenderbufferEXT: - mov __blue_glCore_glNamedFramebufferRenderbufferEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramLocalParameters4fvEXT +.type bluegl_glProgramLocalParameters4fvEXT, %function +bluegl_glProgramLocalParameters4fvEXT: + mov __blue_glCore_glProgramLocalParameters4fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUseProgramStages -.type bluegl_glUseProgramStages, %function -bluegl_glUseProgramStages: - mov __blue_glCore_glUseProgramStages@GOTPCREL(%rip), %r11 +.global bluegl_glGetUniformuivEXT +.type bluegl_glGetUniformuivEXT, %function +bluegl_glGetUniformuivEXT: + mov __blue_glCore_glGetUniformuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedStringivARB -.type bluegl_glGetNamedStringivARB, %function -bluegl_glGetNamedStringivARB: - mov __blue_glCore_glGetNamedStringivARB@GOTPCREL(%rip), %r11 +.global bluegl_glBindFragDataLocationEXT +.type bluegl_glBindFragDataLocationEXT, %function +bluegl_glBindFragDataLocationEXT: + mov __blue_glCore_glBindFragDataLocationEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1iARB -.type bluegl_glMultiTexCoord1iARB, %function -bluegl_glMultiTexCoord1iARB: - mov __blue_glCore_glMultiTexCoord1iARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetFragDataLocationEXT +.type bluegl_glGetFragDataLocationEXT, %function +bluegl_glGetFragDataLocationEXT: + mov __blue_glCore_glGetFragDataLocationEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4xvOES -.type bluegl_glMultiTexCoord4xvOES, %function -bluegl_glMultiTexCoord4xvOES: - mov __blue_glCore_glMultiTexCoord4xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1uiEXT +.type bluegl_glUniform1uiEXT, %function +bluegl_glUniform1uiEXT: + mov __blue_glCore_glUniform1uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMakeImageHandleResidentNV -.type bluegl_glMakeImageHandleResidentNV, %function -bluegl_glMakeImageHandleResidentNV: - mov __blue_glCore_glMakeImageHandleResidentNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2uiEXT +.type bluegl_glUniform2uiEXT, %function +bluegl_glUniform2uiEXT: + mov __blue_glCore_glUniform2uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1fvNV -.type bluegl_glVertexAttrib1fvNV, %function -bluegl_glVertexAttrib1fvNV: - mov __blue_glCore_glVertexAttrib1fvNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3uiEXT +.type bluegl_glUniform3uiEXT, %function +bluegl_glUniform3uiEXT: + mov __blue_glCore_glUniform3uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glViewportIndexedf -.type bluegl_glViewportIndexedf, %function -bluegl_glViewportIndexedf: - mov __blue_glCore_glViewportIndexedf@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4uiEXT +.type bluegl_glUniform4uiEXT, %function +bluegl_glUniform4uiEXT: + mov __blue_glCore_glUniform4uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexStorage3DMultisample -.type bluegl_glTexStorage3DMultisample, %function -bluegl_glTexStorage3DMultisample: - mov __blue_glCore_glTexStorage3DMultisample@GOTPCREL(%rip), %r11 +.global bluegl_glUniform1uivEXT +.type bluegl_glUniform1uivEXT, %function +bluegl_glUniform1uivEXT: + mov __blue_glCore_glUniform1uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreateShaderObjectARB -.type bluegl_glCreateShaderObjectARB, %function -bluegl_glCreateShaderObjectARB: - mov __blue_glCore_glCreateShaderObjectARB@GOTPCREL(%rip), %r11 +.global bluegl_glUniform2uivEXT +.type bluegl_glUniform2uivEXT, %function +bluegl_glUniform2uivEXT: + mov __blue_glCore_glUniform2uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glListDrawCommandsStatesClientNV -.type bluegl_glListDrawCommandsStatesClientNV, %function -bluegl_glListDrawCommandsStatesClientNV: - mov __blue_glCore_glListDrawCommandsStatesClientNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniform3uivEXT +.type bluegl_glUniform3uivEXT, %function +bluegl_glUniform3uivEXT: + mov __blue_glCore_glUniform3uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1d -.type bluegl_glUniform1d, %function -bluegl_glUniform1d: - mov __blue_glCore_glUniform1d@GOTPCREL(%rip), %r11 +.global bluegl_glUniform4uivEXT +.type bluegl_glUniform4uivEXT, %function +bluegl_glUniform4uivEXT: + mov __blue_glCore_glUniform4uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetDebugMessageLogARB -.type bluegl_glGetDebugMessageLogARB, %function -bluegl_glGetDebugMessageLogARB: - mov __blue_glCore_glGetDebugMessageLogARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetHistogramEXT +.type bluegl_glGetHistogramEXT, %function +bluegl_glGetHistogramEXT: + mov __blue_glCore_glGetHistogramEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendParameteriNV -.type bluegl_glBlendParameteriNV, %function -bluegl_glBlendParameteriNV: - mov __blue_glCore_glBlendParameteriNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetHistogramParameterfvEXT +.type bluegl_glGetHistogramParameterfvEXT, %function +bluegl_glGetHistogramParameterfvEXT: + mov __blue_glCore_glGetHistogramParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4sv -.type bluegl_glMultiTexCoord4sv, %function -bluegl_glMultiTexCoord4sv: - mov __blue_glCore_glMultiTexCoord4sv@GOTPCREL(%rip), %r11 +.global bluegl_glGetHistogramParameterivEXT +.type bluegl_glGetHistogramParameterivEXT, %function +bluegl_glGetHistogramParameterivEXT: + mov __blue_glCore_glGetHistogramParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1uiEXT -.type bluegl_glUniform1uiEXT, %function -bluegl_glUniform1uiEXT: - mov __blue_glCore_glUniform1uiEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetMinmaxEXT +.type bluegl_glGetMinmaxEXT, %function +bluegl_glGetMinmaxEXT: + mov __blue_glCore_glGetMinmaxEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDebugMessageInsertAMD -.type bluegl_glDebugMessageInsertAMD, %function -bluegl_glDebugMessageInsertAMD: - mov __blue_glCore_glDebugMessageInsertAMD@GOTPCREL(%rip), %r11 +.global bluegl_glGetMinmaxParameterfvEXT +.type bluegl_glGetMinmaxParameterfvEXT, %function +bluegl_glGetMinmaxParameterfvEXT: + mov __blue_glCore_glGetMinmaxParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiDrawArraysIndirect -.type bluegl_glMultiDrawArraysIndirect, %function -bluegl_glMultiDrawArraysIndirect: - mov __blue_glCore_glMultiDrawArraysIndirect@GOTPCREL(%rip), %r11 +.global bluegl_glGetMinmaxParameterivEXT +.type bluegl_glGetMinmaxParameterivEXT, %function +bluegl_glGetMinmaxParameterivEXT: + mov __blue_glCore_glGetMinmaxParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1d -.type bluegl_glProgramUniform1d, %function -bluegl_glProgramUniform1d: - mov __blue_glCore_glProgramUniform1d@GOTPCREL(%rip), %r11 +.global bluegl_glHistogramEXT +.type bluegl_glHistogramEXT, %function +bluegl_glHistogramEXT: + mov __blue_glCore_glHistogramEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetListParameterivSGIX -.type bluegl_glGetListParameterivSGIX, %function -bluegl_glGetListParameterivSGIX: - mov __blue_glCore_glGetListParameterivSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glMinmaxEXT +.type bluegl_glMinmaxEXT, %function +bluegl_glMinmaxEXT: + mov __blue_glCore_glMinmaxEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPointParameterfv -.type bluegl_glPointParameterfv, %function -bluegl_glPointParameterfv: - mov __blue_glCore_glPointParameterfv@GOTPCREL(%rip), %r11 +.global bluegl_glResetHistogramEXT +.type bluegl_glResetHistogramEXT, %function +bluegl_glResetHistogramEXT: + mov __blue_glCore_glResetHistogramEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyBufferSubData -.type bluegl_glCopyBufferSubData, %function -bluegl_glCopyBufferSubData: - mov __blue_glCore_glCopyBufferSubData@GOTPCREL(%rip), %r11 +.global bluegl_glResetMinmaxEXT +.type bluegl_glResetMinmaxEXT, %function +bluegl_glResetMinmaxEXT: + mov __blue_glCore_glResetMinmaxEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindProgramARB -.type bluegl_glBindProgramARB, %function -bluegl_glBindProgramARB: - mov __blue_glCore_glBindProgramARB@GOTPCREL(%rip), %r11 +.global bluegl_glIndexFuncEXT +.type bluegl_glIndexFuncEXT, %function +bluegl_glIndexFuncEXT: + mov __blue_glCore_glIndexFuncEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCombinerStageParameterfvNV -.type bluegl_glCombinerStageParameterfvNV, %function -bluegl_glCombinerStageParameterfvNV: - mov __blue_glCore_glCombinerStageParameterfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glIndexMaterialEXT +.type bluegl_glIndexMaterialEXT, %function +bluegl_glIndexMaterialEXT: + mov __blue_glCore_glIndexMaterialEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEndConditionalRenderNV -.type bluegl_glEndConditionalRenderNV, %function -bluegl_glEndConditionalRenderNV: - mov __blue_glCore_glEndConditionalRenderNV@GOTPCREL(%rip), %r11 +.global bluegl_glApplyTextureEXT +.type bluegl_glApplyTextureEXT, %function +bluegl_glApplyTextureEXT: + mov __blue_glCore_glApplyTextureEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL3dEXT -.type bluegl_glVertexAttribL3dEXT, %function -bluegl_glVertexAttribL3dEXT: - mov __blue_glCore_glVertexAttribL3dEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTextureLightEXT +.type bluegl_glTextureLightEXT, %function +bluegl_glTextureLightEXT: + mov __blue_glCore_glTextureLightEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3iv -.type bluegl_glWindowPos3iv, %function -bluegl_glWindowPos3iv: - mov __blue_glCore_glWindowPos3iv@GOTPCREL(%rip), %r11 +.global bluegl_glTextureMaterialEXT +.type bluegl_glTextureMaterialEXT, %function +bluegl_glTextureMaterialEXT: + mov __blue_glCore_glTextureMaterialEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFogFuncSGIS -.type bluegl_glGetFogFuncSGIS, %function -bluegl_glGetFogFuncSGIS: - mov __blue_glCore_glGetFogFuncSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glMultiDrawArraysEXT +.type bluegl_glMultiDrawArraysEXT, %function +bluegl_glMultiDrawArraysEXT: + mov __blue_glCore_glMultiDrawArraysEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTexImage2D -.type bluegl_glCompressedTexImage2D, %function -bluegl_glCompressedTexImage2D: - mov __blue_glCore_glCompressedTexImage2D@GOTPCREL(%rip), %r11 +.global bluegl_glMultiDrawElementsEXT +.type bluegl_glMultiDrawElementsEXT, %function +bluegl_glMultiDrawElementsEXT: + mov __blue_glCore_glMultiDrawElementsEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPixelTexGenParameteriSGIS -.type bluegl_glPixelTexGenParameteriSGIS, %function -bluegl_glPixelTexGenParameteriSGIS: - mov __blue_glCore_glPixelTexGenParameteriSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glSampleMaskEXT +.type bluegl_glSampleMaskEXT, %function +bluegl_glSampleMaskEXT: + mov __blue_glCore_glSampleMaskEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDebugMessageControlARB -.type bluegl_glDebugMessageControlARB, %function -bluegl_glDebugMessageControlARB: - mov __blue_glCore_glDebugMessageControlARB@GOTPCREL(%rip), %r11 +.global bluegl_glSamplePatternEXT +.type bluegl_glSamplePatternEXT, %function +bluegl_glSamplePatternEXT: + mov __blue_glCore_glSamplePatternEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMapBufferRange -.type bluegl_glMapBufferRange, %function -bluegl_glMapBufferRange: - mov __blue_glCore_glMapBufferRange@GOTPCREL(%rip), %r11 +.global bluegl_glColorTableEXT +.type bluegl_glColorTableEXT, %function +bluegl_glColorTableEXT: + mov __blue_glCore_glColorTableEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1fvEXT -.type bluegl_glProgramUniform1fvEXT, %function -bluegl_glProgramUniform1fvEXT: - mov __blue_glCore_glProgramUniform1fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetColorTableEXT +.type bluegl_glGetColorTableEXT, %function +bluegl_glGetColorTableEXT: + mov __blue_glCore_glGetColorTableEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedRenderbufferStorageEXT -.type bluegl_glNamedRenderbufferStorageEXT, %function -bluegl_glNamedRenderbufferStorageEXT: - mov __blue_glCore_glNamedRenderbufferStorageEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetColorTableParameterivEXT +.type bluegl_glGetColorTableParameterivEXT, %function +bluegl_glGetColorTableParameterivEXT: + mov __blue_glCore_glGetColorTableParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix4x2fv -.type bluegl_glProgramUniformMatrix4x2fv, %function -bluegl_glProgramUniformMatrix4x2fv: - mov __blue_glCore_glProgramUniformMatrix4x2fv@GOTPCREL(%rip), %r11 +.global bluegl_glGetColorTableParameterfvEXT +.type bluegl_glGetColorTableParameterfvEXT, %function +bluegl_glGetColorTableParameterfvEXT: + mov __blue_glCore_glGetColorTableParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedProgramLocalParameterI4iEXT -.type bluegl_glNamedProgramLocalParameterI4iEXT, %function -bluegl_glNamedProgramLocalParameterI4iEXT: - mov __blue_glCore_glNamedProgramLocalParameterI4iEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPixelTransformParameteriEXT +.type bluegl_glPixelTransformParameteriEXT, %function +bluegl_glPixelTransformParameteriEXT: + mov __blue_glCore_glPixelTransformParameteriEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearDepth -.type bluegl_glClearDepth, %function -bluegl_glClearDepth: - mov __blue_glCore_glClearDepth@GOTPCREL(%rip), %r11 +.global bluegl_glPixelTransformParameterfEXT +.type bluegl_glPixelTransformParameterfEXT, %function +bluegl_glPixelTransformParameterfEXT: + mov __blue_glCore_glPixelTransformParameterfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribs1dvNV -.type bluegl_glVertexAttribs1dvNV, %function -bluegl_glVertexAttribs1dvNV: - mov __blue_glCore_glVertexAttribs1dvNV@GOTPCREL(%rip), %r11 +.global bluegl_glPixelTransformParameterivEXT +.type bluegl_glPixelTransformParameterivEXT, %function +bluegl_glPixelTransformParameterivEXT: + mov __blue_glCore_glPixelTransformParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3f -.type bluegl_glWindowPos3f, %function -bluegl_glWindowPos3f: - mov __blue_glCore_glWindowPos3f@GOTPCREL(%rip), %r11 +.global bluegl_glPixelTransformParameterfvEXT +.type bluegl_glPixelTransformParameterfvEXT, %function +bluegl_glPixelTransformParameterfvEXT: + mov __blue_glCore_glPixelTransformParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProvokingVertex -.type bluegl_glProvokingVertex, %function -bluegl_glProvokingVertex: - mov __blue_glCore_glProvokingVertex@GOTPCREL(%rip), %r11 +.global bluegl_glGetPixelTransformParameterivEXT +.type bluegl_glGetPixelTransformParameterivEXT, %function +bluegl_glGetPixelTransformParameterivEXT: + mov __blue_glCore_glGetPixelTransformParameterivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsNamedStringARB -.type bluegl_glIsNamedStringARB, %function -bluegl_glIsNamedStringARB: - mov __blue_glCore_glIsNamedStringARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetPixelTransformParameterfvEXT +.type bluegl_glGetPixelTransformParameterfvEXT, %function +bluegl_glGetPixelTransformParameterfvEXT: + mov __blue_glCore_glGetPixelTransformParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedBufferData -.type bluegl_glNamedBufferData, %function -bluegl_glNamedBufferData: - mov __blue_glCore_glNamedBufferData@GOTPCREL(%rip), %r11 +.global bluegl_glPointParameterfEXT +.type bluegl_glPointParameterfEXT, %function +bluegl_glPointParameterfEXT: + mov __blue_glCore_glPointParameterfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFragmentLightfSGIX -.type bluegl_glFragmentLightfSGIX, %function -bluegl_glFragmentLightfSGIX: - mov __blue_glCore_glFragmentLightfSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glPointParameterfvEXT +.type bluegl_glPointParameterfvEXT, %function +bluegl_glPointParameterfvEXT: + mov __blue_glCore_glPointParameterfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4uiv -.type bluegl_glProgramUniform4uiv, %function -bluegl_glProgramUniform4uiv: - mov __blue_glCore_glProgramUniform4uiv@GOTPCREL(%rip), %r11 +.global bluegl_glPolygonOffsetEXT +.type bluegl_glPolygonOffsetEXT, %function +bluegl_glPolygonOffsetEXT: + mov __blue_glCore_glPolygonOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPointParameteriNV -.type bluegl_glPointParameteriNV, %function -bluegl_glPointParameteriNV: - mov __blue_glCore_glPointParameteriNV@GOTPCREL(%rip), %r11 +.global bluegl_glPolygonOffsetClampEXT +.type bluegl_glPolygonOffsetClampEXT, %function +bluegl_glPolygonOffsetClampEXT: + mov __blue_glCore_glPolygonOffsetClampEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedFramebufferReadBuffer -.type bluegl_glNamedFramebufferReadBuffer, %function -bluegl_glNamedFramebufferReadBuffer: - mov __blue_glCore_glNamedFramebufferReadBuffer@GOTPCREL(%rip), %r11 +.global bluegl_glProvokingVertexEXT +.type bluegl_glProvokingVertexEXT, %function +bluegl_glProvokingVertexEXT: + mov __blue_glCore_glProvokingVertexEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPatchParameterfv -.type bluegl_glPatchParameterfv, %function -bluegl_glPatchParameterfv: - mov __blue_glCore_glPatchParameterfv@GOTPCREL(%rip), %r11 +.global bluegl_glRasterSamplesEXT +.type bluegl_glRasterSamplesEXT, %function +bluegl_glRasterSamplesEXT: + mov __blue_glCore_glRasterSamplesEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayBindingDivisor -.type bluegl_glVertexArrayBindingDivisor, %function -bluegl_glVertexArrayBindingDivisor: - mov __blue_glCore_glVertexArrayBindingDivisor@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3bEXT +.type bluegl_glSecondaryColor3bEXT, %function +bluegl_glSecondaryColor3bEXT: + mov __blue_glCore_glSecondaryColor3bEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDebugMessageEnableAMD -.type bluegl_glDebugMessageEnableAMD, %function -bluegl_glDebugMessageEnableAMD: - mov __blue_glCore_glDebugMessageEnableAMD@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3bvEXT +.type bluegl_glSecondaryColor3bvEXT, %function +bluegl_glSecondaryColor3bvEXT: + mov __blue_glCore_glSecondaryColor3bvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexArrayIndexediv -.type bluegl_glGetVertexArrayIndexediv, %function -bluegl_glGetVertexArrayIndexediv: - mov __blue_glCore_glGetVertexArrayIndexediv@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3dEXT +.type bluegl_glSecondaryColor3dEXT, %function +bluegl_glSecondaryColor3dEXT: + mov __blue_glCore_glSecondaryColor3dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVideoCaptureStreamdvNV -.type bluegl_glGetVideoCaptureStreamdvNV, %function -bluegl_glGetVideoCaptureStreamdvNV: - mov __blue_glCore_glGetVideoCaptureStreamdvNV@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3dvEXT +.type bluegl_glSecondaryColor3dvEXT, %function +bluegl_glSecondaryColor3dvEXT: + mov __blue_glCore_glSecondaryColor3dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glAlphaFragmentOp2ATI -.type bluegl_glAlphaFragmentOp2ATI, %function -bluegl_glAlphaFragmentOp2ATI: - mov __blue_glCore_glAlphaFragmentOp2ATI@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3fEXT +.type bluegl_glSecondaryColor3fEXT, %function +bluegl_glSecondaryColor3fEXT: + mov __blue_glCore_glSecondaryColor3fEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertex2hNV -.type bluegl_glVertex2hNV, %function -bluegl_glVertex2hNV: - mov __blue_glCore_glVertex2hNV@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3fvEXT +.type bluegl_glSecondaryColor3fvEXT, %function +bluegl_glSecondaryColor3fvEXT: + mov __blue_glCore_glSecondaryColor3fvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCombinerParameteriNV -.type bluegl_glCombinerParameteriNV, %function -bluegl_glCombinerParameteriNV: - mov __blue_glCore_glCombinerParameteriNV@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3iEXT +.type bluegl_glSecondaryColor3iEXT, %function +bluegl_glSecondaryColor3iEXT: + mov __blue_glCore_glSecondaryColor3iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedFramebufferAttachmentParameterivEXT -.type bluegl_glGetNamedFramebufferAttachmentParameterivEXT, %function -bluegl_glGetNamedFramebufferAttachmentParameterivEXT: - mov __blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3ivEXT +.type bluegl_glSecondaryColor3ivEXT, %function +bluegl_glSecondaryColor3ivEXT: + mov __blue_glCore_glSecondaryColor3ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsVariantEnabledEXT -.type bluegl_glIsVariantEnabledEXT, %function -bluegl_glIsVariantEnabledEXT: - mov __blue_glCore_glIsVariantEnabledEXT@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3sEXT +.type bluegl_glSecondaryColor3sEXT, %function +bluegl_glSecondaryColor3sEXT: + mov __blue_glCore_glSecondaryColor3sEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribfvNV -.type bluegl_glGetVertexAttribfvNV, %function -bluegl_glGetVertexAttribfvNV: - mov __blue_glCore_glGetVertexAttribfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3svEXT +.type bluegl_glSecondaryColor3svEXT, %function +bluegl_glSecondaryColor3svEXT: + mov __blue_glCore_glSecondaryColor3svEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramPipelineiv -.type bluegl_glGetProgramPipelineiv, %function -bluegl_glGetProgramPipelineiv: - mov __blue_glCore_glGetProgramPipelineiv@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3ubEXT +.type bluegl_glSecondaryColor3ubEXT, %function +bluegl_glSecondaryColor3ubEXT: + mov __blue_glCore_glSecondaryColor3ubEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUnmapBufferARB -.type bluegl_glUnmapBufferARB, %function -bluegl_glUnmapBufferARB: - mov __blue_glCore_glUnmapBufferARB@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3ubvEXT +.type bluegl_glSecondaryColor3ubvEXT, %function +bluegl_glSecondaryColor3ubvEXT: + mov __blue_glCore_glSecondaryColor3ubvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribPointerNV -.type bluegl_glVertexAttribPointerNV, %function -bluegl_glVertexAttribPointerNV: - mov __blue_glCore_glVertexAttribPointerNV@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3uiEXT +.type bluegl_glSecondaryColor3uiEXT, %function +bluegl_glSecondaryColor3uiEXT: + mov __blue_glCore_glSecondaryColor3uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPathSpacingNV -.type bluegl_glGetPathSpacingNV, %function -bluegl_glGetPathSpacingNV: - mov __blue_glCore_glGetPathSpacingNV@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3uivEXT +.type bluegl_glSecondaryColor3uivEXT, %function +bluegl_glSecondaryColor3uivEXT: + mov __blue_glCore_glSecondaryColor3uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMaterialxOES -.type bluegl_glMaterialxOES, %function -bluegl_glMaterialxOES: - mov __blue_glCore_glMaterialxOES@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3usEXT +.type bluegl_glSecondaryColor3usEXT, %function +bluegl_glSecondaryColor3usEXT: + mov __blue_glCore_glSecondaryColor3usEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream3fvATI -.type bluegl_glVertexStream3fvATI, %function -bluegl_glVertexStream3fvATI: - mov __blue_glCore_glVertexStream3fvATI@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3usvEXT +.type bluegl_glSecondaryColor3usvEXT, %function +bluegl_glSecondaryColor3usvEXT: + mov __blue_glCore_glSecondaryColor3usvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream4dATI -.type bluegl_glVertexStream4dATI, %function -bluegl_glVertexStream4dATI: - mov __blue_glCore_glVertexStream4dATI@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColorPointerEXT +.type bluegl_glSecondaryColorPointerEXT, %function +bluegl_glSecondaryColorPointerEXT: + mov __blue_glCore_glSecondaryColorPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib2d -.type bluegl_glVertexAttrib2d, %function -bluegl_glVertexAttrib2d: - mov __blue_glCore_glVertexAttrib2d@GOTPCREL(%rip), %r11 +.global bluegl_glUseShaderProgramEXT +.type bluegl_glUseShaderProgramEXT, %function +bluegl_glUseShaderProgramEXT: + mov __blue_glCore_glUseShaderProgramEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStencilMaskSeparate -.type bluegl_glStencilMaskSeparate, %function -bluegl_glStencilMaskSeparate: - mov __blue_glCore_glStencilMaskSeparate@GOTPCREL(%rip), %r11 +.global bluegl_glActiveProgramEXT +.type bluegl_glActiveProgramEXT, %function +bluegl_glActiveProgramEXT: + mov __blue_glCore_glActiveProgramEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTestFenceAPPLE -.type bluegl_glTestFenceAPPLE, %function -bluegl_glTestFenceAPPLE: - mov __blue_glCore_glTestFenceAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glCreateShaderProgramEXT +.type bluegl_glCreateShaderProgramEXT, %function +bluegl_glCreateShaderProgramEXT: + mov __blue_glCore_glCreateShaderProgramEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindMaterialParameterEXT -.type bluegl_glBindMaterialParameterEXT, %function -bluegl_glBindMaterialParameterEXT: - mov __blue_glCore_glBindMaterialParameterEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBindImageTextureEXT +.type bluegl_glBindImageTextureEXT, %function +bluegl_glBindImageTextureEXT: + mov __blue_glCore_glBindImageTextureEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendEquationEXT -.type bluegl_glBlendEquationEXT, %function -bluegl_glBlendEquationEXT: - mov __blue_glCore_glBlendEquationEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMemoryBarrierEXT +.type bluegl_glMemoryBarrierEXT, %function +bluegl_glMemoryBarrierEXT: + mov __blue_glCore_glMemoryBarrierEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4hNV -.type bluegl_glMultiTexCoord4hNV, %function -bluegl_glMultiTexCoord4hNV: - mov __blue_glCore_glMultiTexCoord4hNV@GOTPCREL(%rip), %r11 +.global bluegl_glStencilClearTagEXT +.type bluegl_glStencilClearTagEXT, %function +bluegl_glStencilClearTagEXT: + mov __blue_glCore_glStencilClearTagEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1fARB -.type bluegl_glMultiTexCoord1fARB, %function -bluegl_glMultiTexCoord1fARB: - mov __blue_glCore_glMultiTexCoord1fARB@GOTPCREL(%rip), %r11 +.global bluegl_glActiveStencilFaceEXT +.type bluegl_glActiveStencilFaceEXT, %function +bluegl_glActiveStencilFaceEXT: + mov __blue_glCore_glActiveStencilFaceEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPrioritizeTexturesxOES -.type bluegl_glPrioritizeTexturesxOES, %function -bluegl_glPrioritizeTexturesxOES: - mov __blue_glCore_glPrioritizeTexturesxOES@GOTPCREL(%rip), %r11 +.global bluegl_glTexSubImage1DEXT +.type bluegl_glTexSubImage1DEXT, %function +bluegl_glTexSubImage1DEXT: + mov __blue_glCore_glTexSubImage1DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribs1fvNV -.type bluegl_glVertexAttribs1fvNV, %function -bluegl_glVertexAttribs1fvNV: - mov __blue_glCore_glVertexAttribs1fvNV@GOTPCREL(%rip), %r11 +.global bluegl_glTexSubImage2DEXT +.type bluegl_glTexSubImage2DEXT, %function +bluegl_glTexSubImage2DEXT: + mov __blue_glCore_glTexSubImage2DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetInternalformati64v -.type bluegl_glGetInternalformati64v, %function -bluegl_glGetInternalformati64v: - mov __blue_glCore_glGetInternalformati64v@GOTPCREL(%rip), %r11 +.global bluegl_glTexImage3DEXT +.type bluegl_glTexImage3DEXT, %function +bluegl_glTexImage3DEXT: + mov __blue_glCore_glTexImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDisableVertexAttribAPPLE -.type bluegl_glDisableVertexAttribAPPLE, %function -bluegl_glDisableVertexAttribAPPLE: - mov __blue_glCore_glDisableVertexAttribAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glTexSubImage3DEXT +.type bluegl_glTexSubImage3DEXT, %function +bluegl_glTexSubImage3DEXT: + mov __blue_glCore_glTexSubImage3DEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream3sATI -.type bluegl_glVertexStream3sATI, %function -bluegl_glVertexStream3sATI: - mov __blue_glCore_glVertexStream3sATI@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferTextureLayerEXT +.type bluegl_glFramebufferTextureLayerEXT, %function +bluegl_glFramebufferTextureLayerEXT: + mov __blue_glCore_glFramebufferTextureLayerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCheckFramebufferStatusEXT -.type bluegl_glCheckFramebufferStatusEXT, %function -bluegl_glCheckFramebufferStatusEXT: - mov __blue_glCore_glCheckFramebufferStatusEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexBufferEXT +.type bluegl_glTexBufferEXT, %function +bluegl_glTexBufferEXT: + mov __blue_glCore_glTexBufferEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMinmax -.type bluegl_glGetMinmax, %function -bluegl_glGetMinmax: - mov __blue_glCore_glGetMinmax@GOTPCREL(%rip), %r11 +.global bluegl_glTexParameterIivEXT +.type bluegl_glTexParameterIivEXT, %function +bluegl_glTexParameterIivEXT: + mov __blue_glCore_glTexParameterIivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyTexSubImage3DEXT -.type bluegl_glCopyTexSubImage3DEXT, %function -bluegl_glCopyTexSubImage3DEXT: - mov __blue_glCore_glCopyTexSubImage3DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexParameterIuivEXT +.type bluegl_glTexParameterIuivEXT, %function +bluegl_glTexParameterIuivEXT: + mov __blue_glCore_glTexParameterIuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1ivARB -.type bluegl_glUniform1ivARB, %function -bluegl_glUniform1ivARB: - mov __blue_glCore_glUniform1ivARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetTexParameterIivEXT +.type bluegl_glGetTexParameterIivEXT, %function +bluegl_glGetTexParameterIivEXT: + mov __blue_glCore_glGetTexParameterIivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorP4uiv -.type bluegl_glColorP4uiv, %function -bluegl_glColorP4uiv: - mov __blue_glCore_glColorP4uiv@GOTPCREL(%rip), %r11 +.global bluegl_glGetTexParameterIuivEXT +.type bluegl_glGetTexParameterIuivEXT, %function +bluegl_glGetTexParameterIuivEXT: + mov __blue_glCore_glGetTexParameterIuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDisableVertexAttribArrayARB -.type bluegl_glDisableVertexAttribArrayARB, %function -bluegl_glDisableVertexAttribArrayARB: - mov __blue_glCore_glDisableVertexAttribArrayARB@GOTPCREL(%rip), %r11 +.global bluegl_glClearColorIiEXT +.type bluegl_glClearColorIiEXT, %function +bluegl_glClearColorIiEXT: + mov __blue_glCore_glClearColorIiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedProgramLocalParameter4fvEXT -.type bluegl_glNamedProgramLocalParameter4fvEXT, %function -bluegl_glNamedProgramLocalParameter4fvEXT: - mov __blue_glCore_glNamedProgramLocalParameter4fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glClearColorIuiEXT +.type bluegl_glClearColorIuiEXT, %function +bluegl_glClearColorIuiEXT: + mov __blue_glCore_glClearColorIuiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendFuncSeparateEXT -.type bluegl_glBlendFuncSeparateEXT, %function -bluegl_glBlendFuncSeparateEXT: - mov __blue_glCore_glBlendFuncSeparateEXT@GOTPCREL(%rip), %r11 +.global bluegl_glAreTexturesResidentEXT +.type bluegl_glAreTexturesResidentEXT, %function +bluegl_glAreTexturesResidentEXT: + mov __blue_glCore_glAreTexturesResidentEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL3i64NV -.type bluegl_glVertexAttribL3i64NV, %function -bluegl_glVertexAttribL3i64NV: - mov __blue_glCore_glVertexAttribL3i64NV@GOTPCREL(%rip), %r11 +.global bluegl_glBindTextureEXT +.type bluegl_glBindTextureEXT, %function +bluegl_glBindTextureEXT: + mov __blue_glCore_glBindTextureEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindProgramPipeline -.type bluegl_glBindProgramPipeline, %function -bluegl_glBindProgramPipeline: - mov __blue_glCore_glBindProgramPipeline@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteTexturesEXT +.type bluegl_glDeleteTexturesEXT, %function +bluegl_glDeleteTexturesEXT: + mov __blue_glCore_glDeleteTexturesEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreateProgramPipelines -.type bluegl_glCreateProgramPipelines, %function -bluegl_glCreateProgramPipelines: - mov __blue_glCore_glCreateProgramPipelines@GOTPCREL(%rip), %r11 +.global bluegl_glGenTexturesEXT +.type bluegl_glGenTexturesEXT, %function +bluegl_glGenTexturesEXT: + mov __blue_glCore_glGenTexturesEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteRenderbuffersEXT -.type bluegl_glDeleteRenderbuffersEXT, %function -bluegl_glDeleteRenderbuffersEXT: - mov __blue_glCore_glDeleteRenderbuffersEXT@GOTPCREL(%rip), %r11 +.global bluegl_glIsTextureEXT +.type bluegl_glIsTextureEXT, %function +bluegl_glIsTextureEXT: + mov __blue_glCore_glIsTextureEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEdgeFlagFormatNV -.type bluegl_glEdgeFlagFormatNV, %function -bluegl_glEdgeFlagFormatNV: - mov __blue_glCore_glEdgeFlagFormatNV@GOTPCREL(%rip), %r11 +.global bluegl_glPrioritizeTexturesEXT +.type bluegl_glPrioritizeTexturesEXT, %function +bluegl_glPrioritizeTexturesEXT: + mov __blue_glCore_glPrioritizeTexturesEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetActiveUniformBlockiv -.type bluegl_glGetActiveUniformBlockiv, %function -bluegl_glGetActiveUniformBlockiv: - mov __blue_glCore_glGetActiveUniformBlockiv@GOTPCREL(%rip), %r11 +.global bluegl_glTextureNormalEXT +.type bluegl_glTextureNormalEXT, %function +bluegl_glTextureNormalEXT: + mov __blue_glCore_glTextureNormalEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3f -.type bluegl_glProgramUniform3f, %function -bluegl_glProgramUniform3f: - mov __blue_glCore_glProgramUniform3f@GOTPCREL(%rip), %r11 +.global bluegl_glGetQueryObjecti64vEXT +.type bluegl_glGetQueryObjecti64vEXT, %function +bluegl_glGetQueryObjecti64vEXT: + mov __blue_glCore_glGetQueryObjecti64vEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawCommandsStatesAddressNV -.type bluegl_glDrawCommandsStatesAddressNV, %function -bluegl_glDrawCommandsStatesAddressNV: - mov __blue_glCore_glDrawCommandsStatesAddressNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetQueryObjectui64vEXT +.type bluegl_glGetQueryObjectui64vEXT, %function +bluegl_glGetQueryObjectui64vEXT: + mov __blue_glCore_glGetQueryObjectui64vEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribfv -.type bluegl_glGetVertexAttribfv, %function -bluegl_glGetVertexAttribfv: - mov __blue_glCore_glGetVertexAttribfv@GOTPCREL(%rip), %r11 +.global bluegl_glBeginTransformFeedbackEXT +.type bluegl_glBeginTransformFeedbackEXT, %function +bluegl_glBeginTransformFeedbackEXT: + mov __blue_glCore_glBeginTransformFeedbackEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVariantArrayObjectivATI -.type bluegl_glGetVariantArrayObjectivATI, %function -bluegl_glGetVariantArrayObjectivATI: - mov __blue_glCore_glGetVariantArrayObjectivATI@GOTPCREL(%rip), %r11 +.global bluegl_glEndTransformFeedbackEXT +.type bluegl_glEndTransformFeedbackEXT, %function +bluegl_glEndTransformFeedbackEXT: + mov __blue_glCore_glEndTransformFeedbackEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedProgramLocalParameter4dEXT -.type bluegl_glNamedProgramLocalParameter4dEXT, %function -bluegl_glNamedProgramLocalParameter4dEXT: - mov __blue_glCore_glNamedProgramLocalParameter4dEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBindBufferRangeEXT +.type bluegl_glBindBufferRangeEXT, %function +bluegl_glBindBufferRangeEXT: + mov __blue_glCore_glBindBufferRangeEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenTransformFeedbacksNV -.type bluegl_glGenTransformFeedbacksNV, %function -bluegl_glGenTransformFeedbacksNV: - mov __blue_glCore_glGenTransformFeedbacksNV@GOTPCREL(%rip), %r11 +.global bluegl_glBindBufferOffsetEXT +.type bluegl_glBindBufferOffsetEXT, %function +bluegl_glBindBufferOffsetEXT: + mov __blue_glCore_glBindBufferOffsetEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawElementArrayAPPLE -.type bluegl_glDrawElementArrayAPPLE, %function -bluegl_glDrawElementArrayAPPLE: - mov __blue_glCore_glDrawElementArrayAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glBindBufferBaseEXT +.type bluegl_glBindBufferBaseEXT, %function +bluegl_glBindBufferBaseEXT: + mov __blue_glCore_glBindBufferBaseEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4NusvARB -.type bluegl_glVertexAttrib4NusvARB, %function -bluegl_glVertexAttrib4NusvARB: - mov __blue_glCore_glVertexAttrib4NusvARB@GOTPCREL(%rip), %r11 +.global bluegl_glTransformFeedbackVaryingsEXT +.type bluegl_glTransformFeedbackVaryingsEXT, %function +bluegl_glTransformFeedbackVaryingsEXT: + mov __blue_glCore_glTransformFeedbackVaryingsEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindRenderbufferEXT -.type bluegl_glBindRenderbufferEXT, %function -bluegl_glBindRenderbufferEXT: - mov __blue_glCore_glBindRenderbufferEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetTransformFeedbackVaryingEXT +.type bluegl_glGetTransformFeedbackVaryingEXT, %function +bluegl_glGetTransformFeedbackVaryingEXT: + mov __blue_glCore_glGetTransformFeedbackVaryingEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUnmapTexture2DINTEL -.type bluegl_glUnmapTexture2DINTEL, %function -bluegl_glUnmapTexture2DINTEL: - mov __blue_glCore_glUnmapTexture2DINTEL@GOTPCREL(%rip), %r11 +.global bluegl_glArrayElementEXT +.type bluegl_glArrayElementEXT, %function +bluegl_glArrayElementEXT: + mov __blue_glCore_glArrayElementEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramEnvParameterfvARB -.type bluegl_glGetProgramEnvParameterfvARB, %function -bluegl_glGetProgramEnvParameterfvARB: - mov __blue_glCore_glGetProgramEnvParameterfvARB@GOTPCREL(%rip), %r11 +.global bluegl_glColorPointerEXT +.type bluegl_glColorPointerEXT, %function +bluegl_glColorPointerEXT: + mov __blue_glCore_glColorPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4f -.type bluegl_glVertexAttrib4f, %function -bluegl_glVertexAttrib4f: - mov __blue_glCore_glVertexAttrib4f@GOTPCREL(%rip), %r11 +.global bluegl_glDrawArraysEXT +.type bluegl_glDrawArraysEXT, %function +bluegl_glDrawArraysEXT: + mov __blue_glCore_glDrawArraysEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnPixelMapfv -.type bluegl_glGetnPixelMapfv, %function -bluegl_glGetnPixelMapfv: - mov __blue_glCore_glGetnPixelMapfv@GOTPCREL(%rip), %r11 +.global bluegl_glEdgeFlagPointerEXT +.type bluegl_glEdgeFlagPointerEXT, %function +bluegl_glEdgeFlagPointerEXT: + mov __blue_glCore_glEdgeFlagPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3dv -.type bluegl_glVertexAttrib3dv, %function -bluegl_glVertexAttrib3dv: - mov __blue_glCore_glVertexAttrib3dv@GOTPCREL(%rip), %r11 +.global bluegl_glGetPointervEXT +.type bluegl_glGetPointervEXT, %function +bluegl_glGetPointervEXT: + mov __blue_glCore_glGetPointervEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFlushMappedBufferRange -.type bluegl_glFlushMappedBufferRange, %function -bluegl_glFlushMappedBufferRange: - mov __blue_glCore_glFlushMappedBufferRange@GOTPCREL(%rip), %r11 +.global bluegl_glIndexPointerEXT +.type bluegl_glIndexPointerEXT, %function +bluegl_glIndexPointerEXT: + mov __blue_glCore_glIndexPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3ub -.type bluegl_glSecondaryColor3ub, %function -bluegl_glSecondaryColor3ub: - mov __blue_glCore_glSecondaryColor3ub@GOTPCREL(%rip), %r11 +.global bluegl_glNormalPointerEXT +.type bluegl_glNormalPointerEXT, %function +bluegl_glNormalPointerEXT: + mov __blue_glCore_glNormalPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPerfQueryDataINTEL -.type bluegl_glGetPerfQueryDataINTEL, %function -bluegl_glGetPerfQueryDataINTEL: - mov __blue_glCore_glGetPerfQueryDataINTEL@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoordPointerEXT +.type bluegl_glTexCoordPointerEXT, %function +bluegl_glTexCoordPointerEXT: + mov __blue_glCore_glTexCoordPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnMapivARB -.type bluegl_glGetnMapivARB, %function -bluegl_glGetnMapivARB: - mov __blue_glCore_glGetnMapivARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexPointerEXT +.type bluegl_glVertexPointerEXT, %function +bluegl_glVertexPointerEXT: + mov __blue_glCore_glVertexPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSeparableFilter2DEXT -.type bluegl_glSeparableFilter2DEXT, %function -bluegl_glSeparableFilter2DEXT: - mov __blue_glCore_glSeparableFilter2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL1dEXT +.type bluegl_glVertexAttribL1dEXT, %function +bluegl_glVertexAttribL1dEXT: + mov __blue_glCore_glVertexAttribL1dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix3x2fvEXT -.type bluegl_glProgramUniformMatrix3x2fvEXT, %function -bluegl_glProgramUniformMatrix3x2fvEXT: - mov __blue_glCore_glProgramUniformMatrix3x2fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL2dEXT +.type bluegl_glVertexAttribL2dEXT, %function +bluegl_glVertexAttribL2dEXT: + mov __blue_glCore_glVertexAttribL2dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenVertexArrays -.type bluegl_glGenVertexArrays, %function -bluegl_glGenVertexArrays: - mov __blue_glCore_glGenVertexArrays@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL3dEXT +.type bluegl_glVertexAttribL3dEXT, %function +bluegl_glVertexAttribL3dEXT: + mov __blue_glCore_glVertexAttribL3dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEndQueryARB -.type bluegl_glEndQueryARB, %function -bluegl_glEndQueryARB: - mov __blue_glCore_glEndQueryARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL4dEXT +.type bluegl_glVertexAttribL4dEXT, %function +bluegl_glVertexAttribL4dEXT: + mov __blue_glCore_glVertexAttribL4dEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib2fv -.type bluegl_glVertexAttrib2fv, %function -bluegl_glVertexAttrib2fv: - mov __blue_glCore_glVertexAttrib2fv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL1dvEXT +.type bluegl_glVertexAttribL1dvEXT, %function +bluegl_glVertexAttribL1dvEXT: + mov __blue_glCore_glVertexAttribL1dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2fv -.type bluegl_glWindowPos2fv, %function -bluegl_glWindowPos2fv: - mov __blue_glCore_glWindowPos2fv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL2dvEXT +.type bluegl_glVertexAttribL2dvEXT, %function +bluegl_glVertexAttribL2dvEXT: + mov __blue_glCore_glVertexAttribL2dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyConvolutionFilter1D -.type bluegl_glCopyConvolutionFilter1D, %function -bluegl_glCopyConvolutionFilter1D: - mov __blue_glCore_glCopyConvolutionFilter1D@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL3dvEXT +.type bluegl_glVertexAttribL3dvEXT, %function +bluegl_glVertexAttribL3dvEXT: + mov __blue_glCore_glVertexAttribL3dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoordFormatNV -.type bluegl_glTexCoordFormatNV, %function -bluegl_glTexCoordFormatNV: - mov __blue_glCore_glTexCoordFormatNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL4dvEXT +.type bluegl_glVertexAttribL4dvEXT, %function +bluegl_glVertexAttribL4dvEXT: + mov __blue_glCore_glVertexAttribL4dvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoordP2uiv -.type bluegl_glMultiTexCoordP2uiv, %function -bluegl_glMultiTexCoordP2uiv: - mov __blue_glCore_glMultiTexCoordP2uiv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribLPointerEXT +.type bluegl_glVertexAttribLPointerEXT, %function +bluegl_glVertexAttribLPointerEXT: + mov __blue_glCore_glVertexAttribLPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1ui64vARB -.type bluegl_glProgramUniform1ui64vARB, %function -bluegl_glProgramUniform1ui64vARB: - mov __blue_glCore_glProgramUniform1ui64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribLdvEXT +.type bluegl_glGetVertexAttribLdvEXT, %function +bluegl_glGetVertexAttribLdvEXT: + mov __blue_glCore_glGetVertexAttribLdvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorSubTable -.type bluegl_glColorSubTable, %function -bluegl_glColorSubTable: - mov __blue_glCore_glColorSubTable@GOTPCREL(%rip), %r11 +.global bluegl_glBeginVertexShaderEXT +.type bluegl_glBeginVertexShaderEXT, %function +bluegl_glBeginVertexShaderEXT: + mov __blue_glCore_glBeginVertexShaderEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedBufferSubData -.type bluegl_glNamedBufferSubData, %function -bluegl_glNamedBufferSubData: - mov __blue_glCore_glNamedBufferSubData@GOTPCREL(%rip), %r11 +.global bluegl_glEndVertexShaderEXT +.type bluegl_glEndVertexShaderEXT, %function +bluegl_glEndVertexShaderEXT: + mov __blue_glCore_glEndVertexShaderEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetCompressedTextureImage -.type bluegl_glGetCompressedTextureImage, %function -bluegl_glGetCompressedTextureImage: - mov __blue_glCore_glGetCompressedTextureImage@GOTPCREL(%rip), %r11 +.global bluegl_glBindVertexShaderEXT +.type bluegl_glBindVertexShaderEXT, %function +bluegl_glBindVertexShaderEXT: + mov __blue_glCore_glBindVertexShaderEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedCopyBufferSubDataEXT -.type bluegl_glNamedCopyBufferSubDataEXT, %function -bluegl_glNamedCopyBufferSubDataEXT: - mov __blue_glCore_glNamedCopyBufferSubDataEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGenVertexShadersEXT +.type bluegl_glGenVertexShadersEXT, %function +bluegl_glGenVertexShadersEXT: + mov __blue_glCore_glGenVertexShadersEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL1i64NV -.type bluegl_glVertexAttribL1i64NV, %function -bluegl_glVertexAttribL1i64NV: - mov __blue_glCore_glVertexAttribL1i64NV@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteVertexShaderEXT +.type bluegl_glDeleteVertexShaderEXT, %function +bluegl_glDeleteVertexShaderEXT: + mov __blue_glCore_glDeleteVertexShaderEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayMultiTexCoordOffsetEXT -.type bluegl_glVertexArrayMultiTexCoordOffsetEXT, %function -bluegl_glVertexArrayMultiTexCoordOffsetEXT: - mov __blue_glCore_glVertexArrayMultiTexCoordOffsetEXT@GOTPCREL(%rip), %r11 +.global bluegl_glShaderOp1EXT +.type bluegl_glShaderOp1EXT, %function +bluegl_glShaderOp1EXT: + mov __blue_glCore_glShaderOp1EXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetUniformIndices -.type bluegl_glGetUniformIndices, %function -bluegl_glGetUniformIndices: - mov __blue_glCore_glGetUniformIndices@GOTPCREL(%rip), %r11 +.global bluegl_glShaderOp2EXT +.type bluegl_glShaderOp2EXT, %function +bluegl_glShaderOp2EXT: + mov __blue_glCore_glShaderOp2EXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawArraysInstancedARB -.type bluegl_glDrawArraysInstancedARB, %function -bluegl_glDrawArraysInstancedARB: - mov __blue_glCore_glDrawArraysInstancedARB@GOTPCREL(%rip), %r11 +.global bluegl_glShaderOp3EXT +.type bluegl_glShaderOp3EXT, %function +bluegl_glShaderOp3EXT: + mov __blue_glCore_glShaderOp3EXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMultiTexGenivEXT -.type bluegl_glGetMultiTexGenivEXT, %function -bluegl_glGetMultiTexGenivEXT: - mov __blue_glCore_glGetMultiTexGenivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glSwizzleEXT +.type bluegl_glSwizzleEXT, %function +bluegl_glSwizzleEXT: + mov __blue_glCore_glSwizzleEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexArrayPointervEXT -.type bluegl_glGetVertexArrayPointervEXT, %function -bluegl_glGetVertexArrayPointervEXT: - mov __blue_glCore_glGetVertexArrayPointervEXT@GOTPCREL(%rip), %r11 +.global bluegl_glWriteMaskEXT +.type bluegl_glWriteMaskEXT, %function +bluegl_glWriteMaskEXT: + mov __blue_glCore_glWriteMaskEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBeginQuery -.type bluegl_glBeginQuery, %function -bluegl_glBeginQuery: - mov __blue_glCore_glBeginQuery@GOTPCREL(%rip), %r11 +.global bluegl_glInsertComponentEXT +.type bluegl_glInsertComponentEXT, %function +bluegl_glInsertComponentEXT: + mov __blue_glCore_glInsertComponentEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDetachObjectARB -.type bluegl_glDetachObjectARB, %function -bluegl_glDetachObjectARB: - mov __blue_glCore_glDetachObjectARB@GOTPCREL(%rip), %r11 +.global bluegl_glExtractComponentEXT +.type bluegl_glExtractComponentEXT, %function +bluegl_glExtractComponentEXT: + mov __blue_glCore_glExtractComponentEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4iv -.type bluegl_glUniform4iv, %function -bluegl_glUniform4iv: - mov __blue_glCore_glUniform4iv@GOTPCREL(%rip), %r11 +.global bluegl_glGenSymbolsEXT +.type bluegl_glGenSymbolsEXT, %function +bluegl_glGenSymbolsEXT: + mov __blue_glCore_glGenSymbolsEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetQueryObjectuiv -.type bluegl_glGetQueryObjectuiv, %function -bluegl_glGetQueryObjectuiv: - mov __blue_glCore_glGetQueryObjectuiv@GOTPCREL(%rip), %r11 +.global bluegl_glSetInvariantEXT +.type bluegl_glSetInvariantEXT, %function +bluegl_glSetInvariantEXT: + mov __blue_glCore_glSetInvariantEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetObjectBufferivATI -.type bluegl_glGetObjectBufferivATI, %function -bluegl_glGetObjectBufferivATI: - mov __blue_glCore_glGetObjectBufferivATI@GOTPCREL(%rip), %r11 +.global bluegl_glSetLocalConstantEXT +.type bluegl_glSetLocalConstantEXT, %function +bluegl_glSetLocalConstantEXT: + mov __blue_glCore_glSetLocalConstantEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreateTransformFeedbacks -.type bluegl_glCreateTransformFeedbacks, %function -bluegl_glCreateTransformFeedbacks: - mov __blue_glCore_glCreateTransformFeedbacks@GOTPCREL(%rip), %r11 +.global bluegl_glVariantbvEXT +.type bluegl_glVariantbvEXT, %function +bluegl_glVariantbvEXT: + mov __blue_glCore_glVariantbvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream3dATI -.type bluegl_glVertexStream3dATI, %function -bluegl_glVertexStream3dATI: - mov __blue_glCore_glVertexStream3dATI@GOTPCREL(%rip), %r11 +.global bluegl_glVariantsvEXT +.type bluegl_glVariantsvEXT, %function +bluegl_glVariantsvEXT: + mov __blue_glCore_glVariantsvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEvalMapsNV -.type bluegl_glEvalMapsNV, %function -bluegl_glEvalMapsNV: - mov __blue_glCore_glEvalMapsNV@GOTPCREL(%rip), %r11 +.global bluegl_glVariantivEXT +.type bluegl_glVariantivEXT, %function +bluegl_glVariantivEXT: + mov __blue_glCore_glVariantivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsNameAMD -.type bluegl_glIsNameAMD, %function -bluegl_glIsNameAMD: - mov __blue_glCore_glIsNameAMD@GOTPCREL(%rip), %r11 +.global bluegl_glVariantfvEXT +.type bluegl_glVariantfvEXT, %function +bluegl_glVariantfvEXT: + mov __blue_glCore_glVariantfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4ivARB -.type bluegl_glVertexAttrib4ivARB, %function -bluegl_glVertexAttrib4ivARB: - mov __blue_glCore_glVertexAttrib4ivARB@GOTPCREL(%rip), %r11 +.global bluegl_glVariantdvEXT +.type bluegl_glVariantdvEXT, %function +bluegl_glVariantdvEXT: + mov __blue_glCore_glVariantdvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramSubroutineParameteruivNV -.type bluegl_glGetProgramSubroutineParameteruivNV, %function -bluegl_glGetProgramSubroutineParameteruivNV: - mov __blue_glCore_glGetProgramSubroutineParameteruivNV@GOTPCREL(%rip), %r11 +.global bluegl_glVariantubvEXT +.type bluegl_glVariantubvEXT, %function +bluegl_glVariantubvEXT: + mov __blue_glCore_glVariantubvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix2x4dv -.type bluegl_glProgramUniformMatrix2x4dv, %function -bluegl_glProgramUniformMatrix2x4dv: - mov __blue_glCore_glProgramUniformMatrix2x4dv@GOTPCREL(%rip), %r11 +.global bluegl_glVariantusvEXT +.type bluegl_glVariantusvEXT, %function +bluegl_glVariantusvEXT: + mov __blue_glCore_glVariantusvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBeginPerfQueryINTEL -.type bluegl_glBeginPerfQueryINTEL, %function -bluegl_glBeginPerfQueryINTEL: - mov __blue_glCore_glBeginPerfQueryINTEL@GOTPCREL(%rip), %r11 +.global bluegl_glVariantuivEXT +.type bluegl_glVariantuivEXT, %function +bluegl_glVariantuivEXT: + mov __blue_glCore_glVariantuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathParameteriNV -.type bluegl_glPathParameteriNV, %function -bluegl_glPathParameteriNV: - mov __blue_glCore_glPathParameteriNV@GOTPCREL(%rip), %r11 +.global bluegl_glVariantPointerEXT +.type bluegl_glVariantPointerEXT, %function +bluegl_glVariantPointerEXT: + mov __blue_glCore_glVariantPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4i64vNV -.type bluegl_glUniform4i64vNV, %function -bluegl_glUniform4i64vNV: - mov __blue_glCore_glUniform4i64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glEnableVariantClientStateEXT +.type bluegl_glEnableVariantClientStateEXT, %function +bluegl_glEnableVariantClientStateEXT: + mov __blue_glCore_glEnableVariantClientStateEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStateCaptureNV -.type bluegl_glStateCaptureNV, %function -bluegl_glStateCaptureNV: - mov __blue_glCore_glStateCaptureNV@GOTPCREL(%rip), %r11 +.global bluegl_glDisableVariantClientStateEXT +.type bluegl_glDisableVariantClientStateEXT, %function +bluegl_glDisableVariantClientStateEXT: + mov __blue_glCore_glDisableVariantClientStateEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3fvEXT -.type bluegl_glProgramUniform3fvEXT, %function -bluegl_glProgramUniform3fvEXT: - mov __blue_glCore_glProgramUniform3fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBindLightParameterEXT +.type bluegl_glBindLightParameterEXT, %function +bluegl_glBindLightParameterEXT: + mov __blue_glCore_glBindLightParameterEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL1d -.type bluegl_glVertexAttribL1d, %function -bluegl_glVertexAttribL1d: - mov __blue_glCore_glVertexAttribL1d@GOTPCREL(%rip), %r11 +.global bluegl_glBindMaterialParameterEXT +.type bluegl_glBindMaterialParameterEXT, %function +bluegl_glBindMaterialParameterEXT: + mov __blue_glCore_glBindMaterialParameterEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixLoadIdentityEXT -.type bluegl_glMatrixLoadIdentityEXT, %function -bluegl_glMatrixLoadIdentityEXT: - mov __blue_glCore_glMatrixLoadIdentityEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBindTexGenParameterEXT +.type bluegl_glBindTexGenParameterEXT, %function +bluegl_glBindTexGenParameterEXT: + mov __blue_glCore_glBindTexGenParameterEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindVertexArrayAPPLE -.type bluegl_glBindVertexArrayAPPLE, %function -bluegl_glBindVertexArrayAPPLE: - mov __blue_glCore_glBindVertexArrayAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glBindTextureUnitParameterEXT +.type bluegl_glBindTextureUnitParameterEXT, %function +bluegl_glBindTextureUnitParameterEXT: + mov __blue_glCore_glBindTextureUnitParameterEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glRasterPos2xvOES -.type bluegl_glRasterPos2xvOES, %function -bluegl_glRasterPos2xvOES: - mov __blue_glCore_glRasterPos2xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glBindParameterEXT +.type bluegl_glBindParameterEXT, %function +bluegl_glBindParameterEXT: + mov __blue_glCore_glBindParameterEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCommandListSegmentsNV -.type bluegl_glCommandListSegmentsNV, %function -bluegl_glCommandListSegmentsNV: - mov __blue_glCore_glCommandListSegmentsNV@GOTPCREL(%rip), %r11 +.global bluegl_glIsVariantEnabledEXT +.type bluegl_glIsVariantEnabledEXT, %function +bluegl_glIsVariantEnabledEXT: + mov __blue_glCore_glIsVariantEnabledEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos4svMESA -.type bluegl_glWindowPos4svMESA, %function -bluegl_glWindowPos4svMESA: - mov __blue_glCore_glWindowPos4svMESA@GOTPCREL(%rip), %r11 +.global bluegl_glGetVariantBooleanvEXT +.type bluegl_glGetVariantBooleanvEXT, %function +bluegl_glGetVariantBooleanvEXT: + mov __blue_glCore_glGetVariantBooleanvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramLocalParameter4dvARB -.type bluegl_glProgramLocalParameter4dvARB, %function -bluegl_glProgramLocalParameter4dvARB: - mov __blue_glCore_glProgramLocalParameter4dvARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetVariantIntegervEXT +.type bluegl_glGetVariantIntegervEXT, %function +bluegl_glGetVariantIntegervEXT: + mov __blue_glCore_glGetVariantIntegervEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnPolygonStipple -.type bluegl_glGetnPolygonStipple, %function -bluegl_glGetnPolygonStipple: - mov __blue_glCore_glGetnPolygonStipple@GOTPCREL(%rip), %r11 +.global bluegl_glGetVariantFloatvEXT +.type bluegl_glGetVariantFloatvEXT, %function +bluegl_glGetVariantFloatvEXT: + mov __blue_glCore_glGetVariantFloatvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1svARB -.type bluegl_glMultiTexCoord1svARB, %function -bluegl_glMultiTexCoord1svARB: - mov __blue_glCore_glMultiTexCoord1svARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetVariantPointervEXT +.type bluegl_glGetVariantPointervEXT, %function +bluegl_glGetVariantPointervEXT: + mov __blue_glCore_glGetVariantPointervEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedRenderbufferStorage -.type bluegl_glNamedRenderbufferStorage, %function -bluegl_glNamedRenderbufferStorage: - mov __blue_glCore_glNamedRenderbufferStorage@GOTPCREL(%rip), %r11 +.global bluegl_glGetInvariantBooleanvEXT +.type bluegl_glGetInvariantBooleanvEXT, %function +bluegl_glGetInvariantBooleanvEXT: + mov __blue_glCore_glGetInvariantBooleanvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramEnvParameterI4iNV -.type bluegl_glProgramEnvParameterI4iNV, %function -bluegl_glProgramEnvParameterI4iNV: - mov __blue_glCore_glProgramEnvParameterI4iNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetInvariantIntegervEXT +.type bluegl_glGetInvariantIntegervEXT, %function +bluegl_glGetInvariantIntegervEXT: + mov __blue_glCore_glGetInvariantIntegervEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribIFormat -.type bluegl_glVertexAttribIFormat, %function -bluegl_glVertexAttribIFormat: - mov __blue_glCore_glVertexAttribIFormat@GOTPCREL(%rip), %r11 +.global bluegl_glGetInvariantFloatvEXT +.type bluegl_glGetInvariantFloatvEXT, %function +bluegl_glGetInvariantFloatvEXT: + mov __blue_glCore_glGetInvariantFloatvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFogCoordfvEXT -.type bluegl_glFogCoordfvEXT, %function -bluegl_glFogCoordfvEXT: - mov __blue_glCore_glFogCoordfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetLocalConstantBooleanvEXT +.type bluegl_glGetLocalConstantBooleanvEXT, %function +bluegl_glGetLocalConstantBooleanvEXT: + mov __blue_glCore_glGetLocalConstantBooleanvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEnableVertexAttribArray -.type bluegl_glEnableVertexAttribArray, %function -bluegl_glEnableVertexAttribArray: - mov __blue_glCore_glEnableVertexAttribArray@GOTPCREL(%rip), %r11 +.global bluegl_glGetLocalConstantIntegervEXT +.type bluegl_glGetLocalConstantIntegervEXT, %function +bluegl_glGetLocalConstantIntegervEXT: + mov __blue_glCore_glGetLocalConstantIntegervEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPolygonOffsetClampEXT -.type bluegl_glPolygonOffsetClampEXT, %function -bluegl_glPolygonOffsetClampEXT: - mov __blue_glCore_glPolygonOffsetClampEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetLocalConstantFloatvEXT +.type bluegl_glGetLocalConstantFloatvEXT, %function +bluegl_glGetLocalConstantFloatvEXT: + mov __blue_glCore_glGetLocalConstantFloatvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEnable -.type bluegl_glEnable, %function -bluegl_glEnable: - mov __blue_glCore_glEnable@GOTPCREL(%rip), %r11 +.global bluegl_glVertexWeightfEXT +.type bluegl_glVertexWeightfEXT, %function +bluegl_glVertexWeightfEXT: + mov __blue_glCore_glVertexWeightfEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIndexFuncEXT -.type bluegl_glIndexFuncEXT, %function -bluegl_glIndexFuncEXT: - mov __blue_glCore_glIndexFuncEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexWeightfvEXT +.type bluegl_glVertexWeightfvEXT, %function +bluegl_glVertexWeightfvEXT: + mov __blue_glCore_glVertexWeightfvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDepthRangeArrayv -.type bluegl_glDepthRangeArrayv, %function -bluegl_glDepthRangeArrayv: - mov __blue_glCore_glDepthRangeArrayv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexWeightPointerEXT +.type bluegl_glVertexWeightPointerEXT, %function +bluegl_glVertexWeightPointerEXT: + mov __blue_glCore_glVertexWeightPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glRasterPos4xvOES -.type bluegl_glRasterPos4xvOES, %function -bluegl_glRasterPos4xvOES: - mov __blue_glCore_glRasterPos4xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glImportSyncEXT +.type bluegl_glImportSyncEXT, %function +bluegl_glImportSyncEXT: + mov __blue_glCore_glImportSyncEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSpriteParameterfvSGIX -.type bluegl_glSpriteParameterfvSGIX, %function -bluegl_glSpriteParameterfvSGIX: - mov __blue_glCore_glSpriteParameterfvSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glFrameTerminatorGREMEDY +.type bluegl_glFrameTerminatorGREMEDY, %function +bluegl_glFrameTerminatorGREMEDY: + mov __blue_glCore_glFrameTerminatorGREMEDY@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnUniformdv -.type bluegl_glGetnUniformdv, %function -bluegl_glGetnUniformdv: - mov __blue_glCore_glGetnUniformdv@GOTPCREL(%rip), %r11 +.global bluegl_glStringMarkerGREMEDY +.type bluegl_glStringMarkerGREMEDY, %function +bluegl_glStringMarkerGREMEDY: + mov __blue_glCore_glStringMarkerGREMEDY@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetHistogram -.type bluegl_glGetHistogram, %function -bluegl_glGetHistogram: - mov __blue_glCore_glGetHistogram@GOTPCREL(%rip), %r11 +.global bluegl_glImageTransformParameteriHP +.type bluegl_glImageTransformParameteriHP, %function +bluegl_glImageTransformParameteriHP: + mov __blue_glCore_glImageTransformParameteriHP@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearColorIiEXT -.type bluegl_glClearColorIiEXT, %function -bluegl_glClearColorIiEXT: - mov __blue_glCore_glClearColorIiEXT@GOTPCREL(%rip), %r11 +.global bluegl_glImageTransformParameterfHP +.type bluegl_glImageTransformParameterfHP, %function +bluegl_glImageTransformParameterfHP: + mov __blue_glCore_glImageTransformParameterfHP@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTbufferMask3DFX -.type bluegl_glTbufferMask3DFX, %function -bluegl_glTbufferMask3DFX: - mov __blue_glCore_glTbufferMask3DFX@GOTPCREL(%rip), %r11 +.global bluegl_glImageTransformParameterivHP +.type bluegl_glImageTransformParameterivHP, %function +bluegl_glImageTransformParameterivHP: + mov __blue_glCore_glImageTransformParameterivHP@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1f -.type bluegl_glProgramUniform1f, %function -bluegl_glProgramUniform1f: - mov __blue_glCore_glProgramUniform1f@GOTPCREL(%rip), %r11 +.global bluegl_glImageTransformParameterfvHP +.type bluegl_glImageTransformParameterfvHP, %function +bluegl_glImageTransformParameterfvHP: + mov __blue_glCore_glImageTransformParameterfvHP@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4Niv -.type bluegl_glVertexAttrib4Niv, %function -bluegl_glVertexAttrib4Niv: - mov __blue_glCore_glVertexAttrib4Niv@GOTPCREL(%rip), %r11 +.global bluegl_glGetImageTransformParameterivHP +.type bluegl_glGetImageTransformParameterivHP, %function +bluegl_glGetImageTransformParameterivHP: + mov __blue_glCore_glGetImageTransformParameterivHP@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetUniformLocationARB -.type bluegl_glGetUniformLocationARB, %function -bluegl_glGetUniformLocationARB: - mov __blue_glCore_glGetUniformLocationARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetImageTransformParameterfvHP +.type bluegl_glGetImageTransformParameterfvHP, %function +bluegl_glGetImageTransformParameterfvHP: + mov __blue_glCore_glGetImageTransformParameterfvHP@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColor4hvNV -.type bluegl_glColor4hvNV, %function -bluegl_glColor4hvNV: - mov __blue_glCore_glColor4hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiModeDrawArraysIBM +.type bluegl_glMultiModeDrawArraysIBM, %function +bluegl_glMultiModeDrawArraysIBM: + mov __blue_glCore_glMultiModeDrawArraysIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureBufferRangeEXT -.type bluegl_glTextureBufferRangeEXT, %function -bluegl_glTextureBufferRangeEXT: - mov __blue_glCore_glTextureBufferRangeEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiModeDrawElementsIBM +.type bluegl_glMultiModeDrawElementsIBM, %function +bluegl_glMultiModeDrawElementsIBM: + mov __blue_glCore_glMultiModeDrawElementsIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGlobalAlphaFactorsSUN -.type bluegl_glGlobalAlphaFactorsSUN, %function -bluegl_glGlobalAlphaFactorsSUN: - mov __blue_glCore_glGlobalAlphaFactorsSUN@GOTPCREL(%rip), %r11 +.global bluegl_glFlushStaticDataIBM +.type bluegl_glFlushStaticDataIBM, %function +bluegl_glFlushStaticDataIBM: + mov __blue_glCore_glFlushStaticDataIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyTextureSubImage2D -.type bluegl_glCopyTextureSubImage2D, %function -bluegl_glCopyTextureSubImage2D: - mov __blue_glCore_glCopyTextureSubImage2D@GOTPCREL(%rip), %r11 +.global bluegl_glColorPointerListIBM +.type bluegl_glColorPointerListIBM, %function +bluegl_glColorPointerListIBM: + mov __blue_glCore_glColorPointerListIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1i64vARB -.type bluegl_glUniform1i64vARB, %function -bluegl_glUniform1i64vARB: - mov __blue_glCore_glUniform1i64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColorPointerListIBM +.type bluegl_glSecondaryColorPointerListIBM, %function +bluegl_glSecondaryColorPointerListIBM: + mov __blue_glCore_glSecondaryColorPointerListIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib2dNV -.type bluegl_glVertexAttrib2dNV, %function -bluegl_glVertexAttrib2dNV: - mov __blue_glCore_glVertexAttrib2dNV@GOTPCREL(%rip), %r11 +.global bluegl_glEdgeFlagPointerListIBM +.type bluegl_glEdgeFlagPointerListIBM, %function +bluegl_glEdgeFlagPointerListIBM: + mov __blue_glCore_glEdgeFlagPointerListIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4NbvARB -.type bluegl_glVertexAttrib4NbvARB, %function -bluegl_glVertexAttrib4NbvARB: - mov __blue_glCore_glVertexAttrib4NbvARB@GOTPCREL(%rip), %r11 +.global bluegl_glFogCoordPointerListIBM +.type bluegl_glFogCoordPointerListIBM, %function +bluegl_glFogCoordPointerListIBM: + mov __blue_glCore_glFogCoordPointerListIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPatchParameteri -.type bluegl_glPatchParameteri, %function -bluegl_glPatchParameteri: - mov __blue_glCore_glPatchParameteri@GOTPCREL(%rip), %r11 +.global bluegl_glIndexPointerListIBM +.type bluegl_glIndexPointerListIBM, %function +bluegl_glIndexPointerListIBM: + mov __blue_glCore_glIndexPointerListIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedStringARB -.type bluegl_glGetNamedStringARB, %function -bluegl_glGetNamedStringARB: - mov __blue_glCore_glGetNamedStringARB@GOTPCREL(%rip), %r11 +.global bluegl_glNormalPointerListIBM +.type bluegl_glNormalPointerListIBM, %function +bluegl_glNormalPointerListIBM: + mov __blue_glCore_glNormalPointerListIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetCombinerStageParameterfvNV -.type bluegl_glGetCombinerStageParameterfvNV, %function -bluegl_glGetCombinerStageParameterfvNV: - mov __blue_glCore_glGetCombinerStageParameterfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoordPointerListIBM +.type bluegl_glTexCoordPointerListIBM, %function +bluegl_glTexCoordPointerListIBM: + mov __blue_glCore_glTexCoordPointerListIBM@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib2svARB -.type bluegl_glVertexAttrib2svARB, %function -bluegl_glVertexAttrib2svARB: - mov __blue_glCore_glVertexAttrib2svARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexPointerListIBM +.type bluegl_glVertexPointerListIBM, %function +bluegl_glVertexPointerListIBM: + mov __blue_glCore_glVertexPointerListIBM@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glBlendFuncSeparateINGR +.type bluegl_glBlendFuncSeparateINGR, %function +bluegl_glBlendFuncSeparateINGR: + mov __blue_glCore_glBlendFuncSeparateINGR@GOTPCREL(%rip), %r11 jmp *(%r11) .global bluegl_glApplyFramebufferAttachmentCMAAINTEL @@ -11791,658 +11808,670 @@ bluegl_glApplyFramebufferAttachmentCMAAINTEL: mov __blue_glCore_glApplyFramebufferAttachmentCMAAINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVideouivNV -.type bluegl_glGetVideouivNV, %function -bluegl_glGetVideouivNV: - mov __blue_glCore_glGetVideouivNV@GOTPCREL(%rip), %r11 +.global bluegl_glSyncTextureINTEL +.type bluegl_glSyncTextureINTEL, %function +bluegl_glSyncTextureINTEL: + mov __blue_glCore_glSyncTextureINTEL@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glUnmapTexture2DINTEL +.type bluegl_glUnmapTexture2DINTEL, %function +bluegl_glUnmapTexture2DINTEL: + mov __blue_glCore_glUnmapTexture2DINTEL@GOTPCREL(%rip), %r11 + jmp *(%r11) + +.global bluegl_glMapTexture2DINTEL +.type bluegl_glMapTexture2DINTEL, %function +bluegl_glMapTexture2DINTEL: + mov __blue_glCore_glMapTexture2DINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3s -.type bluegl_glMultiTexCoord3s, %function -bluegl_glMultiTexCoord3s: - mov __blue_glCore_glMultiTexCoord3s@GOTPCREL(%rip), %r11 +.global bluegl_glVertexPointervINTEL +.type bluegl_glVertexPointervINTEL, %function +bluegl_glVertexPointervINTEL: + mov __blue_glCore_glVertexPointervINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1sARB -.type bluegl_glMultiTexCoord1sARB, %function -bluegl_glMultiTexCoord1sARB: - mov __blue_glCore_glMultiTexCoord1sARB@GOTPCREL(%rip), %r11 +.global bluegl_glNormalPointervINTEL +.type bluegl_glNormalPointervINTEL, %function +bluegl_glNormalPointervINTEL: + mov __blue_glCore_glNormalPointervINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLogicOp -.type bluegl_glLogicOp, %function -bluegl_glLogicOp: - mov __blue_glCore_glLogicOp@GOTPCREL(%rip), %r11 +.global bluegl_glColorPointervINTEL +.type bluegl_glColorPointervINTEL, %function +bluegl_glColorPointervINTEL: + mov __blue_glCore_glColorPointervINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFogFuncSGIS -.type bluegl_glFogFuncSGIS, %function -bluegl_glFogFuncSGIS: - mov __blue_glCore_glFogFuncSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoordPointervINTEL +.type bluegl_glTexCoordPointervINTEL, %function +bluegl_glTexCoordPointervINTEL: + mov __blue_glCore_glTexCoordPointervINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixMultfEXT -.type bluegl_glMatrixMultfEXT, %function -bluegl_glMatrixMultfEXT: - mov __blue_glCore_glMatrixMultfEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBeginPerfQueryINTEL +.type bluegl_glBeginPerfQueryINTEL, %function +bluegl_glBeginPerfQueryINTEL: + mov __blue_glCore_glBeginPerfQueryINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTexParameterfv -.type bluegl_glGetTexParameterfv, %function -bluegl_glGetTexParameterfv: - mov __blue_glCore_glGetTexParameterfv@GOTPCREL(%rip), %r11 +.global bluegl_glCreatePerfQueryINTEL +.type bluegl_glCreatePerfQueryINTEL, %function +bluegl_glCreatePerfQueryINTEL: + mov __blue_glCore_glCreatePerfQueryINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColorP3uiv -.type bluegl_glSecondaryColorP3uiv, %function -bluegl_glSecondaryColorP3uiv: - mov __blue_glCore_glSecondaryColorP3uiv@GOTPCREL(%rip), %r11 +.global bluegl_glDeletePerfQueryINTEL +.type bluegl_glDeletePerfQueryINTEL, %function +bluegl_glDeletePerfQueryINTEL: + mov __blue_glCore_glDeletePerfQueryINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexParameteriEXT -.type bluegl_glMultiTexParameteriEXT, %function -bluegl_glMultiTexParameteriEXT: - mov __blue_glCore_glMultiTexParameteriEXT@GOTPCREL(%rip), %r11 +.global bluegl_glEndPerfQueryINTEL +.type bluegl_glEndPerfQueryINTEL, %function +bluegl_glEndPerfQueryINTEL: + mov __blue_glCore_glEndPerfQueryINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEnableClientStateIndexedEXT -.type bluegl_glEnableClientStateIndexedEXT, %function -bluegl_glEnableClientStateIndexedEXT: - mov __blue_glCore_glEnableClientStateIndexedEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetFirstPerfQueryIdINTEL +.type bluegl_glGetFirstPerfQueryIdINTEL, %function +bluegl_glGetFirstPerfQueryIdINTEL: + mov __blue_glCore_glGetFirstPerfQueryIdINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenPathsNV -.type bluegl_glGenPathsNV, %function -bluegl_glGenPathsNV: - mov __blue_glCore_glGenPathsNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetNextPerfQueryIdINTEL +.type bluegl_glGetNextPerfQueryIdINTEL, %function +bluegl_glGetNextPerfQueryIdINTEL: + mov __blue_glCore_glGetNextPerfQueryIdINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetBufferSubData -.type bluegl_glGetBufferSubData, %function -bluegl_glGetBufferSubData: - mov __blue_glCore_glGetBufferSubData@GOTPCREL(%rip), %r11 +.global bluegl_glGetPerfCounterInfoINTEL +.type bluegl_glGetPerfCounterInfoINTEL, %function +bluegl_glGetPerfCounterInfoINTEL: + mov __blue_glCore_glGetPerfCounterInfoINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetDoublei_v -.type bluegl_glGetDoublei_v, %function -bluegl_glGetDoublei_v: - mov __blue_glCore_glGetDoublei_v@GOTPCREL(%rip), %r11 +.global bluegl_glGetPerfQueryDataINTEL +.type bluegl_glGetPerfQueryDataINTEL, %function +bluegl_glGetPerfQueryDataINTEL: + mov __blue_glCore_glGetPerfQueryDataINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCoverStrokePathNV -.type bluegl_glCoverStrokePathNV, %function -bluegl_glCoverStrokePathNV: - mov __blue_glCore_glCoverStrokePathNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetPerfQueryIdByNameINTEL +.type bluegl_glGetPerfQueryIdByNameINTEL, %function +bluegl_glGetPerfQueryIdByNameINTEL: + mov __blue_glCore_glGetPerfQueryIdByNameINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFrontFace -.type bluegl_glFrontFace, %function -bluegl_glFrontFace: - mov __blue_glCore_glFrontFace@GOTPCREL(%rip), %r11 +.global bluegl_glGetPerfQueryInfoINTEL +.type bluegl_glGetPerfQueryInfoINTEL, %function +bluegl_glGetPerfQueryInfoINTEL: + mov __blue_glCore_glGetPerfQueryInfoINTEL@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glScissorIndexedv -.type bluegl_glScissorIndexedv, %function -bluegl_glScissorIndexedv: - mov __blue_glCore_glScissorIndexedv@GOTPCREL(%rip), %r11 +.global bluegl_glResizeBuffersMESA +.type bluegl_glResizeBuffersMESA, %function +bluegl_glResizeBuffersMESA: + mov __blue_glCore_glResizeBuffersMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureStorage3D -.type bluegl_glTextureStorage3D, %function -bluegl_glTextureStorage3D: - mov __blue_glCore_glTextureStorage3D@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2dMESA +.type bluegl_glWindowPos2dMESA, %function +bluegl_glWindowPos2dMESA: + mov __blue_glCore_glWindowPos2dMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathFogGenNV -.type bluegl_glPathFogGenNV, %function -bluegl_glPathFogGenNV: - mov __blue_glCore_glPathFogGenNV@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2dvMESA +.type bluegl_glWindowPos2dvMESA, %function +bluegl_glWindowPos2dvMESA: + mov __blue_glCore_glWindowPos2dvMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPixelTexGenParameterivSGIS -.type bluegl_glPixelTexGenParameterivSGIS, %function -bluegl_glPixelTexGenParameterivSGIS: - mov __blue_glCore_glPixelTexGenParameterivSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2fMESA +.type bluegl_glWindowPos2fMESA, %function +bluegl_glWindowPos2fMESA: + mov __blue_glCore_glWindowPos2fMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendEquationi -.type bluegl_glBlendEquationi, %function -bluegl_glBlendEquationi: - mov __blue_glCore_glBlendEquationi@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2fvMESA +.type bluegl_glWindowPos2fvMESA, %function +bluegl_glWindowPos2fvMESA: + mov __blue_glCore_glWindowPos2fvMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetHistogramParameterivEXT -.type bluegl_glGetHistogramParameterivEXT, %function -bluegl_glGetHistogramParameterivEXT: - mov __blue_glCore_glGetHistogramParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2iMESA +.type bluegl_glWindowPos2iMESA, %function +bluegl_glWindowPos2iMESA: + mov __blue_glCore_glWindowPos2iMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearNamedFramebufferfi -.type bluegl_glClearNamedFramebufferfi, %function -bluegl_glClearNamedFramebufferfi: - mov __blue_glCore_glClearNamedFramebufferfi@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2ivMESA +.type bluegl_glWindowPos2ivMESA, %function +bluegl_glWindowPos2ivMESA: + mov __blue_glCore_glWindowPos2ivMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyColorTableSGI -.type bluegl_glCopyColorTableSGI, %function -bluegl_glCopyColorTableSGI: - mov __blue_glCore_glCopyColorTableSGI@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2sMESA +.type bluegl_glWindowPos2sMESA, %function +bluegl_glWindowPos2sMESA: + mov __blue_glCore_glWindowPos2sMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBinormal3dEXT -.type bluegl_glBinormal3dEXT, %function -bluegl_glBinormal3dEXT: - mov __blue_glCore_glBinormal3dEXT@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos2svMESA +.type bluegl_glWindowPos2svMESA, %function +bluegl_glWindowPos2svMESA: + mov __blue_glCore_glWindowPos2svMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetBufferParameterui64vNV -.type bluegl_glGetBufferParameterui64vNV, %function -bluegl_glGetBufferParameterui64vNV: - mov __blue_glCore_glGetBufferParameterui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3dMESA +.type bluegl_glWindowPos3dMESA, %function +bluegl_glWindowPos3dMESA: + mov __blue_glCore_glWindowPos3dMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureImage2DEXT -.type bluegl_glTextureImage2DEXT, %function -bluegl_glTextureImage2DEXT: - mov __blue_glCore_glTextureImage2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3dvMESA +.type bluegl_glWindowPos3dvMESA, %function +bluegl_glWindowPos3dvMESA: + mov __blue_glCore_glWindowPos3dvMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTransformFeedbackVaryings -.type bluegl_glTransformFeedbackVaryings, %function -bluegl_glTransformFeedbackVaryings: - mov __blue_glCore_glTransformFeedbackVaryings@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3fMESA +.type bluegl_glWindowPos3fMESA, %function +bluegl_glWindowPos3fMESA: + mov __blue_glCore_glWindowPos3fMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedFramebufferSampleLocationsfvNV -.type bluegl_glNamedFramebufferSampleLocationsfvNV, %function -bluegl_glNamedFramebufferSampleLocationsfvNV: - mov __blue_glCore_glNamedFramebufferSampleLocationsfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3fvMESA +.type bluegl_glWindowPos3fvMESA, %function +bluegl_glWindowPos3fvMESA: + mov __blue_glCore_glWindowPos3fvMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMapTexture2DINTEL -.type bluegl_glMapTexture2DINTEL, %function -bluegl_glMapTexture2DINTEL: - mov __blue_glCore_glMapTexture2DINTEL@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3iMESA +.type bluegl_glWindowPos3iMESA, %function +bluegl_glWindowPos3iMESA: + mov __blue_glCore_glWindowPos3iMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMaterialxvOES -.type bluegl_glMaterialxvOES, %function -bluegl_glMaterialxvOES: - mov __blue_glCore_glMaterialxvOES@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3ivMESA +.type bluegl_glWindowPos3ivMESA, %function +bluegl_glWindowPos3ivMESA: + mov __blue_glCore_glWindowPos3ivMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenNamesAMD -.type bluegl_glGenNamesAMD, %function -bluegl_glGenNamesAMD: - mov __blue_glCore_glGenNamesAMD@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3sMESA +.type bluegl_glWindowPos3sMESA, %function +bluegl_glWindowPos3sMESA: + mov __blue_glCore_glWindowPos3sMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2uiEXT -.type bluegl_glUniform2uiEXT, %function -bluegl_glUniform2uiEXT: - mov __blue_glCore_glUniform2uiEXT@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos3svMESA +.type bluegl_glWindowPos3svMESA, %function +bluegl_glWindowPos3svMESA: + mov __blue_glCore_glWindowPos3svMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1xvOES -.type bluegl_glMultiTexCoord1xvOES, %function -bluegl_glMultiTexCoord1xvOES: - mov __blue_glCore_glMultiTexCoord1xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos4dMESA +.type bluegl_glWindowPos4dMESA, %function +bluegl_glWindowPos4dMESA: + mov __blue_glCore_glWindowPos4dMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEnableIndexedEXT -.type bluegl_glEnableIndexedEXT, %function -bluegl_glEnableIndexedEXT: - mov __blue_glCore_glEnableIndexedEXT@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos4dvMESA +.type bluegl_glWindowPos4dvMESA, %function +bluegl_glWindowPos4dvMESA: + mov __blue_glCore_glWindowPos4dvMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTextureImage1DEXT -.type bluegl_glCompressedTextureImage1DEXT, %function -bluegl_glCompressedTextureImage1DEXT: - mov __blue_glCore_glCompressedTextureImage1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos4fMESA +.type bluegl_glWindowPos4fMESA, %function +bluegl_glWindowPos4fMESA: + mov __blue_glCore_glWindowPos4fMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3fv -.type bluegl_glMultiTexCoord3fv, %function -bluegl_glMultiTexCoord3fv: - mov __blue_glCore_glMultiTexCoord3fv@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos4fvMESA +.type bluegl_glWindowPos4fvMESA, %function +bluegl_glWindowPos4fvMESA: + mov __blue_glCore_glWindowPos4fvMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnPolygonStippleARB -.type bluegl_glGetnPolygonStippleARB, %function -bluegl_glGetnPolygonStippleARB: - mov __blue_glCore_glGetnPolygonStippleARB@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos4iMESA +.type bluegl_glWindowPos4iMESA, %function +bluegl_glWindowPos4iMESA: + mov __blue_glCore_glWindowPos4iMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord2fColor3fVertex3fvSUN -.type bluegl_glTexCoord2fColor3fVertex3fvSUN, %function -bluegl_glTexCoord2fColor3fVertex3fvSUN: - mov __blue_glCore_glTexCoord2fColor3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos4ivMESA +.type bluegl_glWindowPos4ivMESA, %function +bluegl_glWindowPos4ivMESA: + mov __blue_glCore_glWindowPos4ivMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindTransformFeedbackNV -.type bluegl_glBindTransformFeedbackNV, %function -bluegl_glBindTransformFeedbackNV: - mov __blue_glCore_glBindTransformFeedbackNV@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos4sMESA +.type bluegl_glWindowPos4sMESA, %function +bluegl_glWindowPos4sMESA: + mov __blue_glCore_glWindowPos4sMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream2svATI -.type bluegl_glVertexStream2svATI, %function -bluegl_glVertexStream2svATI: - mov __blue_glCore_glVertexStream2svATI@GOTPCREL(%rip), %r11 +.global bluegl_glWindowPos4svMESA +.type bluegl_glWindowPos4svMESA, %function +bluegl_glWindowPos4svMESA: + mov __blue_glCore_glWindowPos4svMESA@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1fvARB -.type bluegl_glMultiTexCoord1fvARB, %function -bluegl_glMultiTexCoord1fvARB: - mov __blue_glCore_glMultiTexCoord1fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glBeginConditionalRenderNVX +.type bluegl_glBeginConditionalRenderNVX, %function +bluegl_glBeginConditionalRenderNVX: + mov __blue_glCore_glBeginConditionalRenderNVX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexGendvEXT -.type bluegl_glMultiTexGendvEXT, %function -bluegl_glMultiTexGendvEXT: - mov __blue_glCore_glMultiTexGendvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glEndConditionalRenderNVX +.type bluegl_glEndConditionalRenderNVX, %function +bluegl_glEndConditionalRenderNVX: + mov __blue_glCore_glEndConditionalRenderNVX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2ui64vNV -.type bluegl_glProgramUniform2ui64vNV, %function -bluegl_glProgramUniform2ui64vNV: - mov __blue_glCore_glProgramUniform2ui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiDrawArraysIndirectBindlessNV +.type bluegl_glMultiDrawArraysIndirectBindlessNV, %function +bluegl_glMultiDrawArraysIndirectBindlessNV: + mov __blue_glCore_glMultiDrawArraysIndirectBindlessNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedRenderbufferParameteriv -.type bluegl_glGetNamedRenderbufferParameteriv, %function -bluegl_glGetNamedRenderbufferParameteriv: - mov __blue_glCore_glGetNamedRenderbufferParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glMultiDrawElementsIndirectBindlessNV +.type bluegl_glMultiDrawElementsIndirectBindlessNV, %function +bluegl_glMultiDrawElementsIndirectBindlessNV: + mov __blue_glCore_glMultiDrawElementsIndirectBindlessNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendEquationSeparateEXT -.type bluegl_glBlendEquationSeparateEXT, %function -bluegl_glBlendEquationSeparateEXT: - mov __blue_glCore_glBlendEquationSeparateEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiDrawArraysIndirectBindlessCountNV +.type bluegl_glMultiDrawArraysIndirectBindlessCountNV, %function +bluegl_glMultiDrawArraysIndirectBindlessCountNV: + mov __blue_glCore_glMultiDrawArraysIndirectBindlessCountNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glInvalidateBufferData -.type bluegl_glInvalidateBufferData, %function -bluegl_glInvalidateBufferData: - mov __blue_glCore_glInvalidateBufferData@GOTPCREL(%rip), %r11 +.global bluegl_glMultiDrawElementsIndirectBindlessCountNV +.type bluegl_glMultiDrawElementsIndirectBindlessCountNV, %function +bluegl_glMultiDrawElementsIndirectBindlessCountNV: + mov __blue_glCore_glMultiDrawElementsIndirectBindlessCountNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFragmentLightModelfvSGIX -.type bluegl_glFragmentLightModelfvSGIX, %function -bluegl_glFragmentLightModelfvSGIX: - mov __blue_glCore_glFragmentLightModelfvSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glGetTextureHandleNV +.type bluegl_glGetTextureHandleNV, %function +bluegl_glGetTextureHandleNV: + mov __blue_glCore_glGetTextureHandleNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMakeTextureHandleNonResidentARB -.type bluegl_glMakeTextureHandleNonResidentARB, %function -bluegl_glMakeTextureHandleNonResidentARB: - mov __blue_glCore_glMakeTextureHandleNonResidentARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetTextureSamplerHandleNV +.type bluegl_glGetTextureSamplerHandleNV, %function +bluegl_glGetTextureSamplerHandleNV: + mov __blue_glCore_glGetTextureSamplerHandleNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMap2xOES -.type bluegl_glMap2xOES, %function -bluegl_glMap2xOES: - mov __blue_glCore_glMap2xOES@GOTPCREL(%rip), %r11 +.global bluegl_glMakeTextureHandleResidentNV +.type bluegl_glMakeTextureHandleResidentNV, %function +bluegl_glMakeTextureHandleResidentNV: + mov __blue_glCore_glMakeTextureHandleResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferRenderbufferEXT -.type bluegl_glFramebufferRenderbufferEXT, %function -bluegl_glFramebufferRenderbufferEXT: - mov __blue_glCore_glFramebufferRenderbufferEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMakeTextureHandleNonResidentNV +.type bluegl_glMakeTextureHandleNonResidentNV, %function +bluegl_glMakeTextureHandleNonResidentNV: + mov __blue_glCore_glMakeTextureHandleNonResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMapAttribParameterfvNV -.type bluegl_glGetMapAttribParameterfvNV, %function -bluegl_glGetMapAttribParameterfvNV: - mov __blue_glCore_glGetMapAttribParameterfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetImageHandleNV +.type bluegl_glGetImageHandleNV, %function +bluegl_glGetImageHandleNV: + mov __blue_glCore_glGetImageHandleNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib2dvARB -.type bluegl_glVertexAttrib2dvARB, %function -bluegl_glVertexAttrib2dvARB: - mov __blue_glCore_glVertexAttrib2dvARB@GOTPCREL(%rip), %r11 +.global bluegl_glMakeImageHandleResidentNV +.type bluegl_glMakeImageHandleResidentNV, %function +bluegl_glMakeImageHandleResidentNV: + mov __blue_glCore_glMakeImageHandleResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glInvalidateBufferSubData -.type bluegl_glInvalidateBufferSubData, %function -bluegl_glInvalidateBufferSubData: - mov __blue_glCore_glInvalidateBufferSubData@GOTPCREL(%rip), %r11 +.global bluegl_glMakeImageHandleNonResidentNV +.type bluegl_glMakeImageHandleNonResidentNV, %function +bluegl_glMakeImageHandleNonResidentNV: + mov __blue_glCore_glMakeImageHandleNonResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1d -.type bluegl_glVertexAttrib1d, %function -bluegl_glVertexAttrib1d: - mov __blue_glCore_glVertexAttrib1d@GOTPCREL(%rip), %r11 +.global bluegl_glUniformHandleui64NV +.type bluegl_glUniformHandleui64NV, %function +bluegl_glUniformHandleui64NV: + mov __blue_glCore_glUniformHandleui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDispatchComputeIndirect -.type bluegl_glDispatchComputeIndirect, %function -bluegl_glDispatchComputeIndirect: - mov __blue_glCore_glDispatchComputeIndirect@GOTPCREL(%rip), %r11 +.global bluegl_glUniformHandleui64vNV +.type bluegl_glUniformHandleui64vNV, %function +bluegl_glUniformHandleui64vNV: + mov __blue_glCore_glUniformHandleui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStencilFuncSeparate -.type bluegl_glStencilFuncSeparate, %function -bluegl_glStencilFuncSeparate: - mov __blue_glCore_glStencilFuncSeparate@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformHandleui64NV +.type bluegl_glProgramUniformHandleui64NV, %function +bluegl_glProgramUniformHandleui64NV: + mov __blue_glCore_glProgramUniformHandleui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMapVertexAttrib2fAPPLE -.type bluegl_glMapVertexAttrib2fAPPLE, %function -bluegl_glMapVertexAttrib2fAPPLE: - mov __blue_glCore_glMapVertexAttrib2fAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformHandleui64vNV +.type bluegl_glProgramUniformHandleui64vNV, %function +bluegl_glProgramUniformHandleui64vNV: + mov __blue_glCore_glProgramUniformHandleui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix2x4fv -.type bluegl_glProgramUniformMatrix2x4fv, %function -bluegl_glProgramUniformMatrix2x4fv: - mov __blue_glCore_glProgramUniformMatrix2x4fv@GOTPCREL(%rip), %r11 +.global bluegl_glIsTextureHandleResidentNV +.type bluegl_glIsTextureHandleResidentNV, %function +bluegl_glIsTextureHandleResidentNV: + mov __blue_glCore_glIsTextureHandleResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReadPixels -.type bluegl_glReadPixels, %function -bluegl_glReadPixels: - mov __blue_glCore_glReadPixels@GOTPCREL(%rip), %r11 +.global bluegl_glIsImageHandleResidentNV +.type bluegl_glIsImageHandleResidentNV, %function +bluegl_glIsImageHandleResidentNV: + mov __blue_glCore_glIsImageHandleResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayAttribIFormat -.type bluegl_glVertexArrayAttribIFormat, %function -bluegl_glVertexArrayAttribIFormat: - mov __blue_glCore_glVertexArrayAttribIFormat@GOTPCREL(%rip), %r11 +.global bluegl_glBlendParameteriNV +.type bluegl_glBlendParameteriNV, %function +bluegl_glBlendParameteriNV: + mov __blue_glCore_glBlendParameteriNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyMultiTexSubImage1DEXT -.type bluegl_glCopyMultiTexSubImage1DEXT, %function -bluegl_glCopyMultiTexSubImage1DEXT: - mov __blue_glCore_glCopyMultiTexSubImage1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBlendBarrierNV +.type bluegl_glBlendBarrierNV, %function +bluegl_glBlendBarrierNV: + mov __blue_glCore_glBlendBarrierNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendEquationSeparateIndexedAMD -.type bluegl_glBlendEquationSeparateIndexedAMD, %function -bluegl_glBlendEquationSeparateIndexedAMD: - mov __blue_glCore_glBlendEquationSeparateIndexedAMD@GOTPCREL(%rip), %r11 +.global bluegl_glCreateStatesNV +.type bluegl_glCreateStatesNV, %function +bluegl_glCreateStatesNV: + mov __blue_glCore_glCreateStatesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTransformFeedbackVaryingEXT -.type bluegl_glGetTransformFeedbackVaryingEXT, %function -bluegl_glGetTransformFeedbackVaryingEXT: - mov __blue_glCore_glGetTransformFeedbackVaryingEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteStatesNV +.type bluegl_glDeleteStatesNV, %function +bluegl_glDeleteStatesNV: + mov __blue_glCore_glDeleteStatesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2ui64ARB -.type bluegl_glProgramUniform2ui64ARB, %function -bluegl_glProgramUniform2ui64ARB: - mov __blue_glCore_glProgramUniform2ui64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glIsStateNV +.type bluegl_glIsStateNV, %function +bluegl_glIsStateNV: + mov __blue_glCore_glIsStateNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1i64vARB -.type bluegl_glProgramUniform1i64vARB, %function -bluegl_glProgramUniform1i64vARB: - mov __blue_glCore_glProgramUniform1i64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glStateCaptureNV +.type bluegl_glStateCaptureNV, %function +bluegl_glStateCaptureNV: + mov __blue_glCore_glStateCaptureNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4iv -.type bluegl_glMultiTexCoord4iv, %function -bluegl_glMultiTexCoord4iv: - mov __blue_glCore_glMultiTexCoord4iv@GOTPCREL(%rip), %r11 +.global bluegl_glGetCommandHeaderNV +.type bluegl_glGetCommandHeaderNV, %function +bluegl_glGetCommandHeaderNV: + mov __blue_glCore_glGetCommandHeaderNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLoadIdentityDeformationMapSGIX -.type bluegl_glLoadIdentityDeformationMapSGIX, %function -bluegl_glLoadIdentityDeformationMapSGIX: - mov __blue_glCore_glLoadIdentityDeformationMapSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glGetStageIndexNV +.type bluegl_glGetStageIndexNV, %function +bluegl_glGetStageIndexNV: + mov __blue_glCore_glGetStageIndexNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMultiTexGendvEXT -.type bluegl_glGetMultiTexGendvEXT, %function -bluegl_glGetMultiTexGendvEXT: - mov __blue_glCore_glGetMultiTexGendvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDrawCommandsNV +.type bluegl_glDrawCommandsNV, %function +bluegl_glDrawCommandsNV: + mov __blue_glCore_glDrawCommandsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertex4xvOES -.type bluegl_glVertex4xvOES, %function -bluegl_glVertex4xvOES: - mov __blue_glCore_glVertex4xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glDrawCommandsAddressNV +.type bluegl_glDrawCommandsAddressNV, %function +bluegl_glDrawCommandsAddressNV: + mov __blue_glCore_glDrawCommandsAddressNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayVertexAttribOffsetEXT -.type bluegl_glVertexArrayVertexAttribOffsetEXT, %function -bluegl_glVertexArrayVertexAttribOffsetEXT: - mov __blue_glCore_glVertexArrayVertexAttribOffsetEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDrawCommandsStatesNV +.type bluegl_glDrawCommandsStatesNV, %function +bluegl_glDrawCommandsStatesNV: + mov __blue_glCore_glDrawCommandsStatesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormalP3ui -.type bluegl_glNormalP3ui, %function -bluegl_glNormalP3ui: - mov __blue_glCore_glNormalP3ui@GOTPCREL(%rip), %r11 +.global bluegl_glDrawCommandsStatesAddressNV +.type bluegl_glDrawCommandsStatesAddressNV, %function +bluegl_glDrawCommandsStatesAddressNV: + mov __blue_glCore_glDrawCommandsStatesAddressNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMapParameterivNV -.type bluegl_glMapParameterivNV, %function -bluegl_glMapParameterivNV: - mov __blue_glCore_glMapParameterivNV@GOTPCREL(%rip), %r11 +.global bluegl_glCreateCommandListsNV +.type bluegl_glCreateCommandListsNV, %function +bluegl_glCreateCommandListsNV: + mov __blue_glCore_glCreateCommandListsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorPointervINTEL -.type bluegl_glColorPointervINTEL, %function -bluegl_glColorPointervINTEL: - mov __blue_glCore_glColorPointervINTEL@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteCommandListsNV +.type bluegl_glDeleteCommandListsNV, %function +bluegl_glDeleteCommandListsNV: + mov __blue_glCore_glDeleteCommandListsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetQueryObjectui64v -.type bluegl_glGetQueryObjectui64v, %function -bluegl_glGetQueryObjectui64v: - mov __blue_glCore_glGetQueryObjectui64v@GOTPCREL(%rip), %r11 +.global bluegl_glIsCommandListNV +.type bluegl_glIsCommandListNV, %function +bluegl_glIsCommandListNV: + mov __blue_glCore_glIsCommandListNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenFencesAPPLE -.type bluegl_glGenFencesAPPLE, %function -bluegl_glGenFencesAPPLE: - mov __blue_glCore_glGenFencesAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glListDrawCommandsStatesClientNV +.type bluegl_glListDrawCommandsStatesClientNV, %function +bluegl_glListDrawCommandsStatesClientNV: + mov __blue_glCore_glListDrawCommandsStatesClientNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedBufferPageCommitmentEXT -.type bluegl_glNamedBufferPageCommitmentEXT, %function -bluegl_glNamedBufferPageCommitmentEXT: - mov __blue_glCore_glNamedBufferPageCommitmentEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCommandListSegmentsNV +.type bluegl_glCommandListSegmentsNV, %function +bluegl_glCommandListSegmentsNV: + mov __blue_glCore_glCommandListSegmentsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetShaderSourceARB -.type bluegl_glGetShaderSourceARB, %function -bluegl_glGetShaderSourceARB: - mov __blue_glCore_glGetShaderSourceARB@GOTPCREL(%rip), %r11 +.global bluegl_glCompileCommandListNV +.type bluegl_glCompileCommandListNV, %function +bluegl_glCompileCommandListNV: + mov __blue_glCore_glCompileCommandListNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearNamedFramebufferuiv -.type bluegl_glClearNamedFramebufferuiv, %function -bluegl_glClearNamedFramebufferuiv: - mov __blue_glCore_glClearNamedFramebufferuiv@GOTPCREL(%rip), %r11 +.global bluegl_glCallCommandListNV +.type bluegl_glCallCommandListNV, %function +bluegl_glCallCommandListNV: + mov __blue_glCore_glCallCommandListNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVDPAUIsSurfaceNV -.type bluegl_glVDPAUIsSurfaceNV, %function -bluegl_glVDPAUIsSurfaceNV: - mov __blue_glCore_glVDPAUIsSurfaceNV@GOTPCREL(%rip), %r11 +.global bluegl_glBeginConditionalRenderNV +.type bluegl_glBeginConditionalRenderNV, %function +bluegl_glBeginConditionalRenderNV: + mov __blue_glCore_glBeginConditionalRenderNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL2ui64NV -.type bluegl_glVertexAttribL2ui64NV, %function -bluegl_glVertexAttribL2ui64NV: - mov __blue_glCore_glVertexAttribL2ui64NV@GOTPCREL(%rip), %r11 +.global bluegl_glEndConditionalRenderNV +.type bluegl_glEndConditionalRenderNV, %function +bluegl_glEndConditionalRenderNV: + mov __blue_glCore_glEndConditionalRenderNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColor4xvOES -.type bluegl_glColor4xvOES, %function -bluegl_glColor4xvOES: - mov __blue_glCore_glColor4xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glSubpixelPrecisionBiasNV +.type bluegl_glSubpixelPrecisionBiasNV, %function +bluegl_glSubpixelPrecisionBiasNV: + mov __blue_glCore_glSubpixelPrecisionBiasNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformBlockBinding -.type bluegl_glUniformBlockBinding, %function -bluegl_glUniformBlockBinding: - mov __blue_glCore_glUniformBlockBinding@GOTPCREL(%rip), %r11 +.global bluegl_glConservativeRasterParameterfNV +.type bluegl_glConservativeRasterParameterfNV, %function +bluegl_glConservativeRasterParameterfNV: + mov __blue_glCore_glConservativeRasterParameterfNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glListParameterivSGIX -.type bluegl_glListParameterivSGIX, %function -bluegl_glListParameterivSGIX: - mov __blue_glCore_glListParameterivSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glCopyImageSubDataNV +.type bluegl_glCopyImageSubDataNV, %function +bluegl_glCopyImageSubDataNV: + mov __blue_glCore_glCopyImageSubDataNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathSubCoordsNV -.type bluegl_glPathSubCoordsNV, %function -bluegl_glPathSubCoordsNV: - mov __blue_glCore_glPathSubCoordsNV@GOTPCREL(%rip), %r11 +.global bluegl_glDepthRangedNV +.type bluegl_glDepthRangedNV, %function +bluegl_glDepthRangedNV: + mov __blue_glCore_glDepthRangedNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramStringARB -.type bluegl_glGetProgramStringARB, %function -bluegl_glGetProgramStringARB: - mov __blue_glCore_glGetProgramStringARB@GOTPCREL(%rip), %r11 +.global bluegl_glClearDepthdNV +.type bluegl_glClearDepthdNV, %function +bluegl_glClearDepthdNV: + mov __blue_glCore_glClearDepthdNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathStencilFuncNV -.type bluegl_glPathStencilFuncNV, %function -bluegl_glPathStencilFuncNV: - mov __blue_glCore_glPathStencilFuncNV@GOTPCREL(%rip), %r11 +.global bluegl_glDepthBoundsdNV +.type bluegl_glDepthBoundsdNV, %function +bluegl_glDepthBoundsdNV: + mov __blue_glCore_glDepthBoundsdNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindVideoCaptureStreamBufferNV -.type bluegl_glBindVideoCaptureStreamBufferNV, %function -bluegl_glBindVideoCaptureStreamBufferNV: - mov __blue_glCore_glBindVideoCaptureStreamBufferNV@GOTPCREL(%rip), %r11 +.global bluegl_glDrawTextureNV +.type bluegl_glDrawTextureNV, %function +bluegl_glDrawTextureNV: + mov __blue_glCore_glDrawTextureNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReadnPixelsARB -.type bluegl_glReadnPixelsARB, %function -bluegl_glReadnPixelsARB: - mov __blue_glCore_glReadnPixelsARB@GOTPCREL(%rip), %r11 +.global bluegl_glMapControlPointsNV +.type bluegl_glMapControlPointsNV, %function +bluegl_glMapControlPointsNV: + mov __blue_glCore_glMapControlPointsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexBufferARB -.type bluegl_glTexBufferARB, %function -bluegl_glTexBufferARB: - mov __blue_glCore_glTexBufferARB@GOTPCREL(%rip), %r11 +.global bluegl_glMapParameterivNV +.type bluegl_glMapParameterivNV, %function +bluegl_glMapParameterivNV: + mov __blue_glCore_glMapParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL2ui64vNV -.type bluegl_glVertexAttribL2ui64vNV, %function -bluegl_glVertexAttribL2ui64vNV: - mov __blue_glCore_glVertexAttribL2ui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glMapParameterfvNV +.type bluegl_glMapParameterfvNV, %function +bluegl_glMapParameterfvNV: + mov __blue_glCore_glMapParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreateBuffers -.type bluegl_glCreateBuffers, %function -bluegl_glCreateBuffers: - mov __blue_glCore_glCreateBuffers@GOTPCREL(%rip), %r11 +.global bluegl_glGetMapControlPointsNV +.type bluegl_glGetMapControlPointsNV, %function +bluegl_glGetMapControlPointsNV: + mov __blue_glCore_glGetMapControlPointsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glImageTransformParameterfvHP -.type bluegl_glImageTransformParameterfvHP, %function -bluegl_glImageTransformParameterfvHP: - mov __blue_glCore_glImageTransformParameterfvHP@GOTPCREL(%rip), %r11 +.global bluegl_glGetMapParameterivNV +.type bluegl_glGetMapParameterivNV, %function +bluegl_glGetMapParameterivNV: + mov __blue_glCore_glGetMapParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2d -.type bluegl_glUniform2d, %function -bluegl_glUniform2d: - mov __blue_glCore_glUniform2d@GOTPCREL(%rip), %r11 +.global bluegl_glGetMapParameterfvNV +.type bluegl_glGetMapParameterfvNV, %function +bluegl_glGetMapParameterfvNV: + mov __blue_glCore_glGetMapParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBufferStorage -.type bluegl_glBufferStorage, %function -bluegl_glBufferStorage: - mov __blue_glCore_glBufferStorage@GOTPCREL(%rip), %r11 +.global bluegl_glGetMapAttribParameterivNV +.type bluegl_glGetMapAttribParameterivNV, %function +bluegl_glGetMapAttribParameterivNV: + mov __blue_glCore_glGetMapAttribParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTexFilterFuncSGIS -.type bluegl_glGetTexFilterFuncSGIS, %function -bluegl_glGetTexFilterFuncSGIS: - mov __blue_glCore_glGetTexFilterFuncSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glGetMapAttribParameterfvNV +.type bluegl_glGetMapAttribParameterfvNV, %function +bluegl_glGetMapAttribParameterfvNV: + mov __blue_glCore_glGetMapAttribParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetHandleARB -.type bluegl_glGetHandleARB, %function -bluegl_glGetHandleARB: - mov __blue_glCore_glGetHandleARB@GOTPCREL(%rip), %r11 +.global bluegl_glEvalMapsNV +.type bluegl_glEvalMapsNV, %function +bluegl_glEvalMapsNV: + mov __blue_glCore_glEvalMapsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetHistogramParameterxvOES -.type bluegl_glGetHistogramParameterxvOES, %function -bluegl_glGetHistogramParameterxvOES: - mov __blue_glCore_glGetHistogramParameterxvOES@GOTPCREL(%rip), %r11 +.global bluegl_glGetMultisamplefvNV +.type bluegl_glGetMultisamplefvNV, %function +bluegl_glGetMultisamplefvNV: + mov __blue_glCore_glGetMultisamplefvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2d -.type bluegl_glMultiTexCoord2d, %function -bluegl_glMultiTexCoord2d: - mov __blue_glCore_glMultiTexCoord2d@GOTPCREL(%rip), %r11 +.global bluegl_glSampleMaskIndexedNV +.type bluegl_glSampleMaskIndexedNV, %function +bluegl_glSampleMaskIndexedNV: + mov __blue_glCore_glSampleMaskIndexedNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertex4hNV -.type bluegl_glVertex4hNV, %function -bluegl_glVertex4hNV: - mov __blue_glCore_glVertex4hNV@GOTPCREL(%rip), %r11 +.global bluegl_glTexRenderbufferNV +.type bluegl_glTexRenderbufferNV, %function +bluegl_glTexRenderbufferNV: + mov __blue_glCore_glTexRenderbufferNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPerfMonitorGroupStringAMD -.type bluegl_glGetPerfMonitorGroupStringAMD, %function -bluegl_glGetPerfMonitorGroupStringAMD: - mov __blue_glCore_glGetPerfMonitorGroupStringAMD@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteFencesNV +.type bluegl_glDeleteFencesNV, %function +bluegl_glDeleteFencesNV: + mov __blue_glCore_glDeleteFencesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTextureSubImage1D -.type bluegl_glCompressedTextureSubImage1D, %function -bluegl_glCompressedTextureSubImage1D: - mov __blue_glCore_glCompressedTextureSubImage1D@GOTPCREL(%rip), %r11 +.global bluegl_glGenFencesNV +.type bluegl_glGenFencesNV, %function +bluegl_glGenFencesNV: + mov __blue_glCore_glGenFencesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsFramebuffer -.type bluegl_glIsFramebuffer, %function -bluegl_glIsFramebuffer: - mov __blue_glCore_glIsFramebuffer@GOTPCREL(%rip), %r11 +.global bluegl_glIsFenceNV +.type bluegl_glIsFenceNV, %function +bluegl_glIsFenceNV: + mov __blue_glCore_glIsFenceNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2dv -.type bluegl_glUniform2dv, %function -bluegl_glUniform2dv: - mov __blue_glCore_glUniform2dv@GOTPCREL(%rip), %r11 +.global bluegl_glTestFenceNV +.type bluegl_glTestFenceNV, %function +bluegl_glTestFenceNV: + mov __blue_glCore_glTestFenceNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1dvARB -.type bluegl_glVertexAttrib1dvARB, %function -bluegl_glVertexAttrib1dvARB: - mov __blue_glCore_glVertexAttrib1dvARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetFenceivNV +.type bluegl_glGetFenceivNV, %function +bluegl_glGetFenceivNV: + mov __blue_glCore_glGetFenceivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClientWaitSync -.type bluegl_glClientWaitSync, %function -bluegl_glClientWaitSync: - mov __blue_glCore_glClientWaitSync@GOTPCREL(%rip), %r11 +.global bluegl_glFinishFenceNV +.type bluegl_glFinishFenceNV, %function +bluegl_glFinishFenceNV: + mov __blue_glCore_glFinishFenceNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4i64vARB -.type bluegl_glProgramUniform4i64vARB, %function -bluegl_glProgramUniform4i64vARB: - mov __blue_glCore_glProgramUniform4i64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glSetFenceNV +.type bluegl_glSetFenceNV, %function +bluegl_glSetFenceNV: + mov __blue_glCore_glSetFenceNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetActiveAttribARB -.type bluegl_glGetActiveAttribARB, %function -bluegl_glGetActiveAttribARB: - mov __blue_glCore_glGetActiveAttribARB@GOTPCREL(%rip), %r11 +.global bluegl_glFragmentCoverageColorNV +.type bluegl_glFragmentCoverageColorNV, %function +bluegl_glFragmentCoverageColorNV: + mov __blue_glCore_glFragmentCoverageColorNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTexImage3DARB -.type bluegl_glCompressedTexImage3DARB, %function -bluegl_glCompressedTexImage3DARB: - mov __blue_glCore_glCompressedTexImage3DARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramNamedParameter4fNV +.type bluegl_glProgramNamedParameter4fNV, %function +bluegl_glProgramNamedParameter4fNV: + mov __blue_glCore_glProgramNamedParameter4fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI2iEXT -.type bluegl_glVertexAttribI2iEXT, %function -bluegl_glVertexAttribI2iEXT: - mov __blue_glCore_glVertexAttribI2iEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramNamedParameter4fvNV +.type bluegl_glProgramNamedParameter4fvNV, %function +bluegl_glProgramNamedParameter4fvNV: + mov __blue_glCore_glProgramNamedParameter4fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) .global bluegl_glProgramNamedParameter4dNV @@ -12451,2836 +12480,2818 @@ bluegl_glProgramNamedParameter4dNV: mov __blue_glCore_glProgramNamedParameter4dNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramStringARB -.type bluegl_glProgramStringARB, %function -bluegl_glProgramStringARB: - mov __blue_glCore_glProgramStringARB@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glWindowPos3fvMESA -.type bluegl_glWindowPos3fvMESA, %function -bluegl_glWindowPos3fvMESA: - mov __blue_glCore_glWindowPos3fvMESA@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glBlendFunciARB -.type bluegl_glBlendFunciARB, %function -bluegl_glBlendFunciARB: - mov __blue_glCore_glBlendFunciARB@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glVertexAttrib4dvNV -.type bluegl_glVertexAttrib4dvNV, %function -bluegl_glVertexAttrib4dvNV: - mov __blue_glCore_glVertexAttrib4dvNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramNamedParameter4dvNV +.type bluegl_glProgramNamedParameter4dvNV, %function +bluegl_glProgramNamedParameter4dvNV: + mov __blue_glCore_glProgramNamedParameter4dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3dvARB -.type bluegl_glWindowPos3dvARB, %function -bluegl_glWindowPos3dvARB: - mov __blue_glCore_glWindowPos3dvARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramNamedParameterfvNV +.type bluegl_glGetProgramNamedParameterfvNV, %function +bluegl_glGetProgramNamedParameterfvNV: + mov __blue_glCore_glGetProgramNamedParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1bvOES -.type bluegl_glMultiTexCoord1bvOES, %function -bluegl_glMultiTexCoord1bvOES: - mov __blue_glCore_glMultiTexCoord1bvOES@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramNamedParameterdvNV +.type bluegl_glGetProgramNamedParameterdvNV, %function +bluegl_glGetProgramNamedParameterdvNV: + mov __blue_glCore_glGetProgramNamedParameterdvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4fvARB -.type bluegl_glVertexAttrib4fvARB, %function -bluegl_glVertexAttrib4fvARB: - mov __blue_glCore_glVertexAttrib4fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glCoverageModulationTableNV +.type bluegl_glCoverageModulationTableNV, %function +bluegl_glCoverageModulationTableNV: + mov __blue_glCore_glCoverageModulationTableNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPopGroupMarkerEXT -.type bluegl_glPopGroupMarkerEXT, %function -bluegl_glPopGroupMarkerEXT: - mov __blue_glCore_glPopGroupMarkerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetCoverageModulationTableNV +.type bluegl_glGetCoverageModulationTableNV, %function +bluegl_glGetCoverageModulationTableNV: + mov __blue_glCore_glGetCoverageModulationTableNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiDrawElements -.type bluegl_glMultiDrawElements, %function -bluegl_glMultiDrawElements: - mov __blue_glCore_glMultiDrawElements@GOTPCREL(%rip), %r11 +.global bluegl_glCoverageModulationNV +.type bluegl_glCoverageModulationNV, %function +bluegl_glCoverageModulationNV: + mov __blue_glCore_glCoverageModulationNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetInstrumentsSGIX -.type bluegl_glGetInstrumentsSGIX, %function -bluegl_glGetInstrumentsSGIX: - mov __blue_glCore_glGetInstrumentsSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glRenderbufferStorageMultisampleCoverageNV +.type bluegl_glRenderbufferStorageMultisampleCoverageNV, %function +bluegl_glRenderbufferStorageMultisampleCoverageNV: + mov __blue_glCore_glRenderbufferStorageMultisampleCoverageNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4dv -.type bluegl_glProgramUniform4dv, %function -bluegl_glProgramUniform4dv: - mov __blue_glCore_glProgramUniform4dv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramVertexLimitNV +.type bluegl_glProgramVertexLimitNV, %function +bluegl_glProgramVertexLimitNV: + mov __blue_glCore_glProgramVertexLimitNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorTableEXT -.type bluegl_glColorTableEXT, %function -bluegl_glColorTableEXT: - mov __blue_glCore_glColorTableEXT@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferTextureEXT +.type bluegl_glFramebufferTextureEXT, %function +bluegl_glFramebufferTextureEXT: + mov __blue_glCore_glFramebufferTextureEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexSubImage1D -.type bluegl_glTexSubImage1D, %function -bluegl_glTexSubImage1D: - mov __blue_glCore_glTexSubImage1D@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferTextureFaceEXT +.type bluegl_glFramebufferTextureFaceEXT, %function +bluegl_glFramebufferTextureFaceEXT: + mov __blue_glCore_glFramebufferTextureFaceEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBeginPerfMonitorAMD -.type bluegl_glBeginPerfMonitorAMD, %function -bluegl_glBeginPerfMonitorAMD: - mov __blue_glCore_glBeginPerfMonitorAMD@GOTPCREL(%rip), %r11 +.global bluegl_glProgramLocalParameterI4iNV +.type bluegl_glProgramLocalParameterI4iNV, %function +bluegl_glProgramLocalParameterI4iNV: + mov __blue_glCore_glProgramLocalParameterI4iNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPointParameterfvSGIS -.type bluegl_glPointParameterfvSGIS, %function -bluegl_glPointParameterfvSGIS: - mov __blue_glCore_glPointParameterfvSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glProgramLocalParameterI4ivNV +.type bluegl_glProgramLocalParameterI4ivNV, %function +bluegl_glProgramLocalParameterI4ivNV: + mov __blue_glCore_glProgramLocalParameterI4ivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetImageTransformParameterfvHP -.type bluegl_glGetImageTransformParameterfvHP, %function -bluegl_glGetImageTransformParameterfvHP: - mov __blue_glCore_glGetImageTransformParameterfvHP@GOTPCREL(%rip), %r11 +.global bluegl_glProgramLocalParametersI4ivNV +.type bluegl_glProgramLocalParametersI4ivNV, %function +bluegl_glProgramLocalParametersI4ivNV: + mov __blue_glCore_glProgramLocalParametersI4ivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertex3hvNV -.type bluegl_glVertex3hvNV, %function -bluegl_glVertex3hvNV: - mov __blue_glCore_glVertex3hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramLocalParameterI4uiNV +.type bluegl_glProgramLocalParameterI4uiNV, %function +bluegl_glProgramLocalParameterI4uiNV: + mov __blue_glCore_glProgramLocalParameterI4uiNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord4fVertex4fvSUN -.type bluegl_glTexCoord4fVertex4fvSUN, %function -bluegl_glTexCoord4fVertex4fvSUN: - mov __blue_glCore_glTexCoord4fVertex4fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glProgramLocalParameterI4uivNV +.type bluegl_glProgramLocalParameterI4uivNV, %function +bluegl_glProgramLocalParameterI4uivNV: + mov __blue_glCore_glProgramLocalParameterI4uivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTexSubImage1D -.type bluegl_glCompressedTexSubImage1D, %function -bluegl_glCompressedTexSubImage1D: - mov __blue_glCore_glCompressedTexSubImage1D@GOTPCREL(%rip), %r11 +.global bluegl_glProgramLocalParametersI4uivNV +.type bluegl_glProgramLocalParametersI4uivNV, %function +bluegl_glProgramLocalParametersI4uivNV: + mov __blue_glCore_glProgramLocalParametersI4uivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2dvMESA -.type bluegl_glWindowPos2dvMESA, %function -bluegl_glWindowPos2dvMESA: - mov __blue_glCore_glWindowPos2dvMESA@GOTPCREL(%rip), %r11 +.global bluegl_glProgramEnvParameterI4iNV +.type bluegl_glProgramEnvParameterI4iNV, %function +bluegl_glProgramEnvParameterI4iNV: + mov __blue_glCore_glProgramEnvParameterI4iNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetSamplerParameteriv -.type bluegl_glGetSamplerParameteriv, %function -bluegl_glGetSamplerParameteriv: - mov __blue_glCore_glGetSamplerParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramEnvParameterI4ivNV +.type bluegl_glProgramEnvParameterI4ivNV, %function +bluegl_glProgramEnvParameterI4ivNV: + mov __blue_glCore_glProgramEnvParameterI4ivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorPointerListIBM -.type bluegl_glColorPointerListIBM, %function -bluegl_glColorPointerListIBM: - mov __blue_glCore_glColorPointerListIBM@GOTPCREL(%rip), %r11 +.global bluegl_glProgramEnvParametersI4ivNV +.type bluegl_glProgramEnvParametersI4ivNV, %function +bluegl_glProgramEnvParametersI4ivNV: + mov __blue_glCore_glProgramEnvParametersI4ivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFinalCombinerInputParameterivNV -.type bluegl_glGetFinalCombinerInputParameterivNV, %function -bluegl_glGetFinalCombinerInputParameterivNV: - mov __blue_glCore_glGetFinalCombinerInputParameterivNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramEnvParameterI4uiNV +.type bluegl_glProgramEnvParameterI4uiNV, %function +bluegl_glProgramEnvParameterI4uiNV: + mov __blue_glCore_glProgramEnvParameterI4uiNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribiv -.type bluegl_glGetVertexAttribiv, %function -bluegl_glGetVertexAttribiv: - mov __blue_glCore_glGetVertexAttribiv@GOTPCREL(%rip), %r11 +.global bluegl_glProgramEnvParameterI4uivNV +.type bluegl_glProgramEnvParameterI4uivNV, %function +bluegl_glProgramEnvParameterI4uivNV: + mov __blue_glCore_glProgramEnvParameterI4uivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTexImage -.type bluegl_glGetTexImage, %function -bluegl_glGetTexImage: - mov __blue_glCore_glGetTexImage@GOTPCREL(%rip), %r11 +.global bluegl_glProgramEnvParametersI4uivNV +.type bluegl_glProgramEnvParametersI4uivNV, %function +bluegl_glProgramEnvParametersI4uivNV: + mov __blue_glCore_glProgramEnvParametersI4uivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBufferSubData -.type bluegl_glBufferSubData, %function -bluegl_glBufferSubData: - mov __blue_glCore_glBufferSubData@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramLocalParameterIivNV +.type bluegl_glGetProgramLocalParameterIivNV, %function +bluegl_glGetProgramLocalParameterIivNV: + mov __blue_glCore_glGetProgramLocalParameterIivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3sARB -.type bluegl_glVertexAttrib3sARB, %function -bluegl_glVertexAttrib3sARB: - mov __blue_glCore_glVertexAttrib3sARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramLocalParameterIuivNV +.type bluegl_glGetProgramLocalParameterIuivNV, %function +bluegl_glGetProgramLocalParameterIuivNV: + mov __blue_glCore_glGetProgramLocalParameterIuivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsTextureHandleResidentARB -.type bluegl_glIsTextureHandleResidentARB, %function -bluegl_glIsTextureHandleResidentARB: - mov __blue_glCore_glIsTextureHandleResidentARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramEnvParameterIivNV +.type bluegl_glGetProgramEnvParameterIivNV, %function +bluegl_glGetProgramEnvParameterIivNV: + mov __blue_glCore_glGetProgramEnvParameterIivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3i -.type bluegl_glMultiTexCoord3i, %function -bluegl_glMultiTexCoord3i: - mov __blue_glCore_glMultiTexCoord3i@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramEnvParameterIuivNV +.type bluegl_glGetProgramEnvParameterIuivNV, %function +bluegl_glGetProgramEnvParameterIuivNV: + mov __blue_glCore_glGetProgramEnvParameterIuivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLinkProgramARB -.type bluegl_glLinkProgramARB, %function -bluegl_glLinkProgramARB: - mov __blue_glCore_glLinkProgramARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramSubroutineParametersuivNV +.type bluegl_glProgramSubroutineParametersuivNV, %function +bluegl_glProgramSubroutineParametersuivNV: + mov __blue_glCore_glProgramSubroutineParametersuivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsProgramNV -.type bluegl_glIsProgramNV, %function -bluegl_glIsProgramNV: - mov __blue_glCore_glIsProgramNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramSubroutineParameteruivNV +.type bluegl_glGetProgramSubroutineParameteruivNV, %function +bluegl_glGetProgramSubroutineParameteruivNV: + mov __blue_glCore_glGetProgramSubroutineParameteruivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI4i -.type bluegl_glVertexAttribI4i, %function -bluegl_glVertexAttribI4i: - mov __blue_glCore_glVertexAttribI4i@GOTPCREL(%rip), %r11 +.global bluegl_glVertex2hNV +.type bluegl_glVertex2hNV, %function +bluegl_glVertex2hNV: + mov __blue_glCore_glVertex2hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1i -.type bluegl_glUniform1i, %function -bluegl_glUniform1i: - mov __blue_glCore_glUniform1i@GOTPCREL(%rip), %r11 +.global bluegl_glVertex2hvNV +.type bluegl_glVertex2hvNV, %function +bluegl_glVertex2hvNV: + mov __blue_glCore_glVertex2hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindAttribLocationARB -.type bluegl_glBindAttribLocationARB, %function -bluegl_glBindAttribLocationARB: - mov __blue_glCore_glBindAttribLocationARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertex3hNV +.type bluegl_glVertex3hNV, %function +bluegl_glVertex3hNV: + mov __blue_glCore_glVertex3hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4i64vNV -.type bluegl_glProgramUniform4i64vNV, %function -bluegl_glProgramUniform4i64vNV: - mov __blue_glCore_glProgramUniform4i64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertex3hvNV +.type bluegl_glVertex3hvNV, %function +bluegl_glVertex3hvNV: + mov __blue_glCore_glVertex3hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertex4xOES -.type bluegl_glVertex4xOES, %function -bluegl_glVertex4xOES: - mov __blue_glCore_glVertex4xOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertex4hNV +.type bluegl_glVertex4hNV, %function +bluegl_glVertex4hNV: + mov __blue_glCore_glVertex4hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSetLocalConstantEXT -.type bluegl_glSetLocalConstantEXT, %function -bluegl_glSetLocalConstantEXT: - mov __blue_glCore_glSetLocalConstantEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertex4hvNV +.type bluegl_glVertex4hvNV, %function +bluegl_glVertex4hvNV: + mov __blue_glCore_glVertex4hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexSubImage2D -.type bluegl_glTexSubImage2D, %function -bluegl_glTexSubImage2D: - mov __blue_glCore_glTexSubImage2D@GOTPCREL(%rip), %r11 +.global bluegl_glNormal3hNV +.type bluegl_glNormal3hNV, %function +bluegl_glNormal3hNV: + mov __blue_glCore_glNormal3hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2f -.type bluegl_glWindowPos2f, %function -bluegl_glWindowPos2f: - mov __blue_glCore_glWindowPos2f@GOTPCREL(%rip), %r11 +.global bluegl_glNormal3hvNV +.type bluegl_glNormal3hvNV, %function +bluegl_glNormal3hvNV: + mov __blue_glCore_glNormal3hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVariantPointerEXT -.type bluegl_glVariantPointerEXT, %function -bluegl_glVariantPointerEXT: - mov __blue_glCore_glVariantPointerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glColor3hNV +.type bluegl_glColor3hNV, %function +bluegl_glColor3hNV: + mov __blue_glCore_glColor3hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedRenderbufferStorageMultisample -.type bluegl_glNamedRenderbufferStorageMultisample, %function -bluegl_glNamedRenderbufferStorageMultisample: - mov __blue_glCore_glNamedRenderbufferStorageMultisample@GOTPCREL(%rip), %r11 +.global bluegl_glColor3hvNV +.type bluegl_glColor3hvNV, %function +bluegl_glColor3hvNV: + mov __blue_glCore_glColor3hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFogCoorddvEXT -.type bluegl_glFogCoorddvEXT, %function -bluegl_glFogCoorddvEXT: - mov __blue_glCore_glFogCoorddvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glColor4hNV +.type bluegl_glColor4hNV, %function +bluegl_glColor4hNV: + mov __blue_glCore_glColor4hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiModeDrawArraysIBM -.type bluegl_glMultiModeDrawArraysIBM, %function -bluegl_glMultiModeDrawArraysIBM: - mov __blue_glCore_glMultiModeDrawArraysIBM@GOTPCREL(%rip), %r11 +.global bluegl_glColor4hvNV +.type bluegl_glColor4hvNV, %function +bluegl_glColor4hvNV: + mov __blue_glCore_glColor4hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixLoaddEXT -.type bluegl_glMatrixLoaddEXT, %function -bluegl_glMatrixLoaddEXT: - mov __blue_glCore_glMatrixLoaddEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord1hNV +.type bluegl_glTexCoord1hNV, %function +bluegl_glTexCoord1hNV: + mov __blue_glCore_glTexCoord1hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteQueriesARB -.type bluegl_glDeleteQueriesARB, %function -bluegl_glDeleteQueriesARB: - mov __blue_glCore_glDeleteQueriesARB@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord1hvNV +.type bluegl_glTexCoord1hvNV, %function +bluegl_glTexCoord1hvNV: + mov __blue_glCore_glTexCoord1hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1fvARB -.type bluegl_glUniform1fvARB, %function -bluegl_glUniform1fvARB: - mov __blue_glCore_glUniform1fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord2hNV +.type bluegl_glTexCoord2hNV, %function +bluegl_glTexCoord2hNV: + mov __blue_glCore_glTexCoord2hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawCommandsNV -.type bluegl_glDrawCommandsNV, %function -bluegl_glDrawCommandsNV: - mov __blue_glCore_glDrawCommandsNV@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord2hvNV +.type bluegl_glTexCoord2hvNV, %function +bluegl_glTexCoord2hvNV: + mov __blue_glCore_glTexCoord2hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3dvEXT -.type bluegl_glSecondaryColor3dvEXT, %function -bluegl_glSecondaryColor3dvEXT: - mov __blue_glCore_glSecondaryColor3dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord3hNV +.type bluegl_glTexCoord3hNV, %function +bluegl_glTexCoord3hNV: + mov __blue_glCore_glTexCoord3hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFlushVertexArrayRangeAPPLE -.type bluegl_glFlushVertexArrayRangeAPPLE, %function -bluegl_glFlushVertexArrayRangeAPPLE: - mov __blue_glCore_glFlushVertexArrayRangeAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord3hvNV +.type bluegl_glTexCoord3hvNV, %function +bluegl_glTexCoord3hvNV: + mov __blue_glCore_glTexCoord3hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexEnvxvOES -.type bluegl_glTexEnvxvOES, %function -bluegl_glTexEnvxvOES: - mov __blue_glCore_glTexEnvxvOES@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord4hNV +.type bluegl_glTexCoord4hNV, %function +bluegl_glTexCoord4hNV: + mov __blue_glCore_glTexCoord4hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetSeparableFilterEXT -.type bluegl_glGetSeparableFilterEXT, %function -bluegl_glGetSeparableFilterEXT: - mov __blue_glCore_glGetSeparableFilterEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord4hvNV +.type bluegl_glTexCoord4hvNV, %function +bluegl_glTexCoord4hvNV: + mov __blue_glCore_glTexCoord4hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI4bvEXT -.type bluegl_glVertexAttribI4bvEXT, %function -bluegl_glVertexAttribI4bvEXT: - mov __blue_glCore_glVertexAttribI4bvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1hNV +.type bluegl_glMultiTexCoord1hNV, %function +bluegl_glMultiTexCoord1hNV: + mov __blue_glCore_glMultiTexCoord1hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3i64NV -.type bluegl_glUniform3i64NV, %function -bluegl_glUniform3i64NV: - mov __blue_glCore_glUniform3i64NV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord1hvNV +.type bluegl_glMultiTexCoord1hvNV, %function +bluegl_glMultiTexCoord1hvNV: + mov __blue_glCore_glMultiTexCoord1hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendEquationIndexedAMD -.type bluegl_glBlendEquationIndexedAMD, %function -bluegl_glBlendEquationIndexedAMD: - mov __blue_glCore_glBlendEquationIndexedAMD@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2hNV +.type bluegl_glMultiTexCoord2hNV, %function +bluegl_glMultiTexCoord2hNV: + mov __blue_glCore_glMultiTexCoord2hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPointParameterf -.type bluegl_glPointParameterf, %function -bluegl_glPointParameterf: - mov __blue_glCore_glPointParameterf@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord2hvNV +.type bluegl_glMultiTexCoord2hvNV, %function +bluegl_glMultiTexCoord2hvNV: + mov __blue_glCore_glMultiTexCoord2hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertex4bvOES -.type bluegl_glVertex4bvOES, %function -bluegl_glVertex4bvOES: - mov __blue_glCore_glVertex4bvOES@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3hNV +.type bluegl_glMultiTexCoord3hNV, %function +bluegl_glMultiTexCoord3hNV: + mov __blue_glCore_glMultiTexCoord3hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStencilThenCoverFillPathNV -.type bluegl_glStencilThenCoverFillPathNV, %function -bluegl_glStencilThenCoverFillPathNV: - mov __blue_glCore_glStencilThenCoverFillPathNV@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord3hvNV +.type bluegl_glMultiTexCoord3hvNV, %function +bluegl_glMultiTexCoord3hvNV: + mov __blue_glCore_glMultiTexCoord3hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTextureImage2DEXT -.type bluegl_glCompressedTextureImage2DEXT, %function -bluegl_glCompressedTextureImage2DEXT: - mov __blue_glCore_glCompressedTextureImage2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4hNV +.type bluegl_glMultiTexCoord4hNV, %function +bluegl_glMultiTexCoord4hNV: + mov __blue_glCore_glMultiTexCoord4hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlendEquationSeparate -.type bluegl_glBlendEquationSeparate, %function -bluegl_glBlendEquationSeparate: - mov __blue_glCore_glBlendEquationSeparate@GOTPCREL(%rip), %r11 +.global bluegl_glMultiTexCoord4hvNV +.type bluegl_glMultiTexCoord4hvNV, %function +bluegl_glMultiTexCoord4hvNV: + mov __blue_glCore_glMultiTexCoord4hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedFramebufferParameteriv -.type bluegl_glGetNamedFramebufferParameteriv, %function -bluegl_glGetNamedFramebufferParameteriv: - mov __blue_glCore_glGetNamedFramebufferParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glFogCoordhNV +.type bluegl_glFogCoordhNV, %function +bluegl_glFogCoordhNV: + mov __blue_glCore_glFogCoordhNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexImage3DEXT -.type bluegl_glTexImage3DEXT, %function -bluegl_glTexImage3DEXT: - mov __blue_glCore_glTexImage3DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glFogCoordhvNV +.type bluegl_glFogCoordhvNV, %function +bluegl_glFogCoordhvNV: + mov __blue_glCore_glFogCoordhvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorFragmentOp3ATI -.type bluegl_glColorFragmentOp3ATI, %function -bluegl_glColorFragmentOp3ATI: - mov __blue_glCore_glColorFragmentOp3ATI@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3hNV +.type bluegl_glSecondaryColor3hNV, %function +bluegl_glSecondaryColor3hNV: + mov __blue_glCore_glSecondaryColor3hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormalPointerListIBM -.type bluegl_glNormalPointerListIBM, %function -bluegl_glNormalPointerListIBM: - mov __blue_glCore_glNormalPointerListIBM@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColor3hvNV +.type bluegl_glSecondaryColor3hvNV, %function +bluegl_glSecondaryColor3hvNV: + mov __blue_glCore_glSecondaryColor3hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexParameteriv -.type bluegl_glTexParameteriv, %function -bluegl_glTexParameteriv: - mov __blue_glCore_glTexParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexWeighthNV +.type bluegl_glVertexWeighthNV, %function +bluegl_glVertexWeighthNV: + mov __blue_glCore_glVertexWeighthNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTexSubImage2D -.type bluegl_glCompressedTexSubImage2D, %function -bluegl_glCompressedTexSubImage2D: - mov __blue_glCore_glCompressedTexSubImage2D@GOTPCREL(%rip), %r11 +.global bluegl_glVertexWeighthvNV +.type bluegl_glVertexWeighthvNV, %function +bluegl_glVertexWeighthvNV: + mov __blue_glCore_glVertexWeighthvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCoverFillPathNV -.type bluegl_glCoverFillPathNV, %function -bluegl_glCoverFillPathNV: - mov __blue_glCore_glCoverFillPathNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1hNV +.type bluegl_glVertexAttrib1hNV, %function +bluegl_glVertexAttrib1hNV: + mov __blue_glCore_glVertexAttrib1hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix4x2dvEXT -.type bluegl_glProgramUniformMatrix4x2dvEXT, %function -bluegl_glProgramUniformMatrix4x2dvEXT: - mov __blue_glCore_glProgramUniformMatrix4x2dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1hvNV +.type bluegl_glVertexAttrib1hvNV, %function +bluegl_glVertexAttrib1hvNV: + mov __blue_glCore_glVertexAttrib1hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1f -.type bluegl_glVertexAttrib1f, %function -bluegl_glVertexAttrib1f: - mov __blue_glCore_glVertexAttrib1f@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2hNV +.type bluegl_glVertexAttrib2hNV, %function +bluegl_glVertexAttrib2hNV: + mov __blue_glCore_glVertexAttrib2hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glAlphaFragmentOp3ATI -.type bluegl_glAlphaFragmentOp3ATI, %function -bluegl_glAlphaFragmentOp3ATI: - mov __blue_glCore_glAlphaFragmentOp3ATI@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2hvNV +.type bluegl_glVertexAttrib2hvNV, %function +bluegl_glVertexAttrib2hvNV: + mov __blue_glCore_glVertexAttrib2hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBeginQueryIndexed -.type bluegl_glBeginQueryIndexed, %function -bluegl_glBeginQueryIndexed: - mov __blue_glCore_glBeginQueryIndexed@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3hNV +.type bluegl_glVertexAttrib3hNV, %function +bluegl_glVertexAttrib3hNV: + mov __blue_glCore_glVertexAttrib3hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix2x3fv -.type bluegl_glProgramUniformMatrix2x3fv, %function -bluegl_glProgramUniformMatrix2x3fv: - mov __blue_glCore_glProgramUniformMatrix2x3fv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3hvNV +.type bluegl_glVertexAttrib3hvNV, %function +bluegl_glVertexAttrib3hvNV: + mov __blue_glCore_glVertexAttrib3hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4ui64vNV -.type bluegl_glProgramUniform4ui64vNV, %function -bluegl_glProgramUniform4ui64vNV: - mov __blue_glCore_glProgramUniform4ui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4hNV +.type bluegl_glVertexAttrib4hNV, %function +bluegl_glVertexAttrib4hNV: + mov __blue_glCore_glVertexAttrib4hNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1ui64NV -.type bluegl_glUniform1ui64NV, %function -bluegl_glUniform1ui64NV: - mov __blue_glCore_glUniform1ui64NV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4hvNV +.type bluegl_glVertexAttrib4hvNV, %function +bluegl_glVertexAttrib4hvNV: + mov __blue_glCore_glVertexAttrib4hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3svARB -.type bluegl_glMultiTexCoord3svARB, %function -bluegl_glMultiTexCoord3svARB: - mov __blue_glCore_glMultiTexCoord3svARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribs1hvNV +.type bluegl_glVertexAttribs1hvNV, %function +bluegl_glVertexAttribs1hvNV: + mov __blue_glCore_glVertexAttribs1hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWeightivARB -.type bluegl_glWeightivARB, %function -bluegl_glWeightivARB: - mov __blue_glCore_glWeightivARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribs2hvNV +.type bluegl_glVertexAttribs2hvNV, %function +bluegl_glVertexAttribs2hvNV: + mov __blue_glCore_glVertexAttribs2hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4xOES -.type bluegl_glMultiTexCoord4xOES, %function -bluegl_glMultiTexCoord4xOES: - mov __blue_glCore_glMultiTexCoord4xOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribs3hvNV +.type bluegl_glVertexAttribs3hvNV, %function +bluegl_glVertexAttribs3hvNV: + mov __blue_glCore_glVertexAttribs3hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL2i64NV -.type bluegl_glVertexAttribL2i64NV, %function -bluegl_glVertexAttribL2i64NV: - mov __blue_glCore_glVertexAttribL2i64NV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribs4hvNV +.type bluegl_glVertexAttribs4hvNV, %function +bluegl_glVertexAttribs4hvNV: + mov __blue_glCore_glVertexAttribs4hvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix3x4dv -.type bluegl_glProgramUniformMatrix3x4dv, %function -bluegl_glProgramUniformMatrix3x4dv: - mov __blue_glCore_glProgramUniformMatrix3x4dv@GOTPCREL(%rip), %r11 +.global bluegl_glGetInternalformatSampleivNV +.type bluegl_glGetInternalformatSampleivNV, %function +bluegl_glGetInternalformatSampleivNV: + mov __blue_glCore_glGetInternalformatSampleivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramParameteriEXT -.type bluegl_glProgramParameteriEXT, %function -bluegl_glProgramParameteriEXT: - mov __blue_glCore_glProgramParameteriEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGenOcclusionQueriesNV +.type bluegl_glGenOcclusionQueriesNV, %function +bluegl_glGenOcclusionQueriesNV: + mov __blue_glCore_glGenOcclusionQueriesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3sEXT -.type bluegl_glSecondaryColor3sEXT, %function -bluegl_glSecondaryColor3sEXT: - mov __blue_glCore_glSecondaryColor3sEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteOcclusionQueriesNV +.type bluegl_glDeleteOcclusionQueriesNV, %function +bluegl_glDeleteOcclusionQueriesNV: + mov __blue_glCore_glDeleteOcclusionQueriesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTextureSubImage3DEXT -.type bluegl_glCompressedTextureSubImage3DEXT, %function -bluegl_glCompressedTextureSubImage3DEXT: - mov __blue_glCore_glCompressedTextureSubImage3DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glIsOcclusionQueryNV +.type bluegl_glIsOcclusionQueryNV, %function +bluegl_glIsOcclusionQueryNV: + mov __blue_glCore_glIsOcclusionQueryNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPointervEXT -.type bluegl_glGetPointervEXT, %function -bluegl_glGetPointervEXT: - mov __blue_glCore_glGetPointervEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBeginOcclusionQueryNV +.type bluegl_glBeginOcclusionQueryNV, %function +bluegl_glBeginOcclusionQueryNV: + mov __blue_glCore_glBeginOcclusionQueryNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMinmaxParameterfvEXT -.type bluegl_glGetMinmaxParameterfvEXT, %function -bluegl_glGetMinmaxParameterfvEXT: - mov __blue_glCore_glGetMinmaxParameterfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glEndOcclusionQueryNV +.type bluegl_glEndOcclusionQueryNV, %function +bluegl_glEndOcclusionQueryNV: + mov __blue_glCore_glEndOcclusionQueryNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4sARB -.type bluegl_glMultiTexCoord4sARB, %function -bluegl_glMultiTexCoord4sARB: - mov __blue_glCore_glMultiTexCoord4sARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetOcclusionQueryivNV +.type bluegl_glGetOcclusionQueryivNV, %function +bluegl_glGetOcclusionQueryivNV: + mov __blue_glCore_glGetOcclusionQueryivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawElementsInstancedBaseVertexBaseInstance -.type bluegl_glDrawElementsInstancedBaseVertexBaseInstance, %function -bluegl_glDrawElementsInstancedBaseVertexBaseInstance: - mov __blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance@GOTPCREL(%rip), %r11 +.global bluegl_glGetOcclusionQueryuivNV +.type bluegl_glGetOcclusionQueryuivNV, %function +bluegl_glGetOcclusionQueryuivNV: + mov __blue_glCore_glGetOcclusionQueryuivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVDPAUSurfaceAccessNV -.type bluegl_glVDPAUSurfaceAccessNV, %function -bluegl_glVDPAUSurfaceAccessNV: - mov __blue_glCore_glVDPAUSurfaceAccessNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramBufferParametersfvNV +.type bluegl_glProgramBufferParametersfvNV, %function +bluegl_glProgramBufferParametersfvNV: + mov __blue_glCore_glProgramBufferParametersfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2iARB -.type bluegl_glMultiTexCoord2iARB, %function -bluegl_glMultiTexCoord2iARB: - mov __blue_glCore_glMultiTexCoord2iARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramBufferParametersIivNV +.type bluegl_glProgramBufferParametersIivNV, %function +bluegl_glProgramBufferParametersIivNV: + mov __blue_glCore_glProgramBufferParametersIivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathCommandsNV -.type bluegl_glPathCommandsNV, %function -bluegl_glPathCommandsNV: - mov __blue_glCore_glPathCommandsNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramBufferParametersIuivNV +.type bluegl_glProgramBufferParametersIuivNV, %function +bluegl_glProgramBufferParametersIuivNV: + mov __blue_glCore_glProgramBufferParametersIuivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSetMultisamplefvAMD -.type bluegl_glSetMultisamplefvAMD, %function -bluegl_glSetMultisamplefvAMD: - mov __blue_glCore_glSetMultisamplefvAMD@GOTPCREL(%rip), %r11 +.global bluegl_glGenPathsNV +.type bluegl_glGenPathsNV, %function +bluegl_glGenPathsNV: + mov __blue_glCore_glGenPathsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream3ivATI -.type bluegl_glVertexStream3ivATI, %function -bluegl_glVertexStream3ivATI: - mov __blue_glCore_glVertexStream3ivATI@GOTPCREL(%rip), %r11 +.global bluegl_glDeletePathsNV +.type bluegl_glDeletePathsNV, %function +bluegl_glDeletePathsNV: + mov __blue_glCore_glDeletePathsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVDPAUUnregisterSurfaceNV -.type bluegl_glVDPAUUnregisterSurfaceNV, %function -bluegl_glVDPAUUnregisterSurfaceNV: - mov __blue_glCore_glVDPAUUnregisterSurfaceNV@GOTPCREL(%rip), %r11 +.global bluegl_glIsPathNV +.type bluegl_glIsPathNV, %function +bluegl_glIsPathNV: + mov __blue_glCore_glIsPathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureRenderbufferEXT -.type bluegl_glTextureRenderbufferEXT, %function -bluegl_glTextureRenderbufferEXT: - mov __blue_glCore_glTextureRenderbufferEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPathCommandsNV +.type bluegl_glPathCommandsNV, %function +bluegl_glPathCommandsNV: + mov __blue_glCore_glPathCommandsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramLocalParameter4dARB -.type bluegl_glProgramLocalParameter4dARB, %function -bluegl_glProgramLocalParameter4dARB: - mov __blue_glCore_glProgramLocalParameter4dARB@GOTPCREL(%rip), %r11 +.global bluegl_glPathCoordsNV +.type bluegl_glPathCoordsNV, %function +bluegl_glPathCoordsNV: + mov __blue_glCore_glPathCoordsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindVertexShaderEXT -.type bluegl_glBindVertexShaderEXT, %function -bluegl_glBindVertexShaderEXT: - mov __blue_glCore_glBindVertexShaderEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPathSubCommandsNV +.type bluegl_glPathSubCommandsNV, %function +bluegl_glPathSubCommandsNV: + mov __blue_glCore_glPathSubCommandsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEnableVariantClientStateEXT -.type bluegl_glEnableVariantClientStateEXT, %function -bluegl_glEnableVariantClientStateEXT: - mov __blue_glCore_glEnableVariantClientStateEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPathSubCoordsNV +.type bluegl_glPathSubCoordsNV, %function +bluegl_glPathSubCoordsNV: + mov __blue_glCore_glPathSubCoordsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPointerIndexedvEXT -.type bluegl_glGetPointerIndexedvEXT, %function -bluegl_glGetPointerIndexedvEXT: - mov __blue_glCore_glGetPointerIndexedvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPathStringNV +.type bluegl_glPathStringNV, %function +bluegl_glPathStringNV: + mov __blue_glCore_glPathStringNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexEnvfEXT -.type bluegl_glMultiTexEnvfEXT, %function -bluegl_glMultiTexEnvfEXT: - mov __blue_glCore_glMultiTexEnvfEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPathGlyphsNV +.type bluegl_glPathGlyphsNV, %function +bluegl_glPathGlyphsNV: + mov __blue_glCore_glPathGlyphsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFrustumxOES -.type bluegl_glFrustumxOES, %function -bluegl_glFrustumxOES: - mov __blue_glCore_glFrustumxOES@GOTPCREL(%rip), %r11 +.global bluegl_glPathGlyphRangeNV +.type bluegl_glPathGlyphRangeNV, %function +bluegl_glPathGlyphRangeNV: + mov __blue_glCore_glPathGlyphRangeNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glAreProgramsResidentNV -.type bluegl_glAreProgramsResidentNV, %function -bluegl_glAreProgramsResidentNV: - mov __blue_glCore_glAreProgramsResidentNV@GOTPCREL(%rip), %r11 +.global bluegl_glWeightPathsNV +.type bluegl_glWeightPathsNV, %function +bluegl_glWeightPathsNV: + mov __blue_glCore_glWeightPathsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferSampleLocationsfvNV -.type bluegl_glFramebufferSampleLocationsfvNV, %function -bluegl_glFramebufferSampleLocationsfvNV: - mov __blue_glCore_glFramebufferSampleLocationsfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glCopyPathNV +.type bluegl_glCopyPathNV, %function +bluegl_glCopyPathNV: + mov __blue_glCore_glCopyPathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1sNV -.type bluegl_glVertexAttrib1sNV, %function -bluegl_glVertexAttrib1sNV: - mov __blue_glCore_glVertexAttrib1sNV@GOTPCREL(%rip), %r11 +.global bluegl_glInterpolatePathsNV +.type bluegl_glInterpolatePathsNV, %function +bluegl_glInterpolatePathsNV: + mov __blue_glCore_glInterpolatePathsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetActiveUniformBlockName -.type bluegl_glGetActiveUniformBlockName, %function -bluegl_glGetActiveUniformBlockName: - mov __blue_glCore_glGetActiveUniformBlockName@GOTPCREL(%rip), %r11 +.global bluegl_glTransformPathNV +.type bluegl_glTransformPathNV, %function +bluegl_glTransformPathNV: + mov __blue_glCore_glTransformPathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertex2xOES -.type bluegl_glVertex2xOES, %function -bluegl_glVertex2xOES: - mov __blue_glCore_glVertex2xOES@GOTPCREL(%rip), %r11 +.global bluegl_glPathParameterivNV +.type bluegl_glPathParameterivNV, %function +bluegl_glPathParameterivNV: + mov __blue_glCore_glPathParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glResetMinmaxEXT -.type bluegl_glResetMinmaxEXT, %function -bluegl_glResetMinmaxEXT: - mov __blue_glCore_glResetMinmaxEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPathParameteriNV +.type bluegl_glPathParameteriNV, %function +bluegl_glPathParameteriNV: + mov __blue_glCore_glPathParameteriNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixOrthoEXT -.type bluegl_glMatrixOrthoEXT, %function -bluegl_glMatrixOrthoEXT: - mov __blue_glCore_glMatrixOrthoEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPathParameterfvNV +.type bluegl_glPathParameterfvNV, %function +bluegl_glPathParameterfvNV: + mov __blue_glCore_glPathParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4ui64vNV -.type bluegl_glUniform4ui64vNV, %function -bluegl_glUniform4ui64vNV: - mov __blue_glCore_glUniform4ui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glPathParameterfNV +.type bluegl_glPathParameterfNV, %function +bluegl_glPathParameterfNV: + mov __blue_glCore_glPathParameterfNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix4x3fvEXT -.type bluegl_glProgramUniformMatrix4x3fvEXT, %function -bluegl_glProgramUniformMatrix4x3fvEXT: - mov __blue_glCore_glProgramUniformMatrix4x3fvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPathDashArrayNV +.type bluegl_glPathDashArrayNV, %function +bluegl_glPathDashArrayNV: + mov __blue_glCore_glPathDashArrayNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribs1svNV -.type bluegl_glVertexAttribs1svNV, %function -bluegl_glVertexAttribs1svNV: - mov __blue_glCore_glVertexAttribs1svNV@GOTPCREL(%rip), %r11 +.global bluegl_glPathStencilFuncNV +.type bluegl_glPathStencilFuncNV, %function +bluegl_glPathStencilFuncNV: + mov __blue_glCore_glPathStencilFuncNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDebugMessageCallbackAMD -.type bluegl_glDebugMessageCallbackAMD, %function -bluegl_glDebugMessageCallbackAMD: - mov __blue_glCore_glDebugMessageCallbackAMD@GOTPCREL(%rip), %r11 +.global bluegl_glPathStencilDepthOffsetNV +.type bluegl_glPathStencilDepthOffsetNV, %function +bluegl_glPathStencilDepthOffsetNV: + mov __blue_glCore_glPathStencilDepthOffsetNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1uiEXT -.type bluegl_glProgramUniform1uiEXT, %function -bluegl_glProgramUniform1uiEXT: - mov __blue_glCore_glProgramUniform1uiEXT@GOTPCREL(%rip), %r11 +.global bluegl_glStencilFillPathNV +.type bluegl_glStencilFillPathNV, %function +bluegl_glStencilFillPathNV: + mov __blue_glCore_glStencilFillPathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexBufferEXT -.type bluegl_glTexBufferEXT, %function -bluegl_glTexBufferEXT: - mov __blue_glCore_glTexBufferEXT@GOTPCREL(%rip), %r11 +.global bluegl_glStencilStrokePathNV +.type bluegl_glStencilStrokePathNV, %function +bluegl_glStencilStrokePathNV: + mov __blue_glCore_glStencilStrokePathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4f -.type bluegl_glUniform4f, %function -bluegl_glUniform4f: - mov __blue_glCore_glUniform4f@GOTPCREL(%rip), %r11 +.global bluegl_glStencilFillPathInstancedNV +.type bluegl_glStencilFillPathInstancedNV, %function +bluegl_glStencilFillPathInstancedNV: + mov __blue_glCore_glStencilFillPathInstancedNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUpdateObjectBufferATI -.type bluegl_glUpdateObjectBufferATI, %function -bluegl_glUpdateObjectBufferATI: - mov __blue_glCore_glUpdateObjectBufferATI@GOTPCREL(%rip), %r11 +.global bluegl_glStencilStrokePathInstancedNV +.type bluegl_glStencilStrokePathInstancedNV, %function +bluegl_glStencilStrokePathInstancedNV: + mov __blue_glCore_glStencilStrokePathInstancedNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1iEXT -.type bluegl_glProgramUniform1iEXT, %function -bluegl_glProgramUniform1iEXT: - mov __blue_glCore_glProgramUniform1iEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPathCoverDepthFuncNV +.type bluegl_glPathCoverDepthFuncNV, %function +bluegl_glPathCoverDepthFuncNV: + mov __blue_glCore_glPathCoverDepthFuncNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMultiTexEnvfvEXT -.type bluegl_glGetMultiTexEnvfvEXT, %function -bluegl_glGetMultiTexEnvfvEXT: - mov __blue_glCore_glGetMultiTexEnvfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glCoverFillPathNV +.type bluegl_glCoverFillPathNV, %function +bluegl_glCoverFillPathNV: + mov __blue_glCore_glCoverFillPathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL2d -.type bluegl_glVertexAttribL2d, %function -bluegl_glVertexAttribL2d: - mov __blue_glCore_glVertexAttribL2d@GOTPCREL(%rip), %r11 +.global bluegl_glCoverStrokePathNV +.type bluegl_glCoverStrokePathNV, %function +bluegl_glCoverStrokePathNV: + mov __blue_glCore_glCoverStrokePathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glConvolutionParameterxOES -.type bluegl_glConvolutionParameterxOES, %function -bluegl_glConvolutionParameterxOES: - mov __blue_glCore_glConvolutionParameterxOES@GOTPCREL(%rip), %r11 +.global bluegl_glCoverFillPathInstancedNV +.type bluegl_glCoverFillPathInstancedNV, %function +bluegl_glCoverFillPathInstancedNV: + mov __blue_glCore_glCoverFillPathInstancedNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribArrayObjectivATI -.type bluegl_glGetVertexAttribArrayObjectivATI, %function -bluegl_glGetVertexAttribArrayObjectivATI: - mov __blue_glCore_glGetVertexAttribArrayObjectivATI@GOTPCREL(%rip), %r11 +.global bluegl_glCoverStrokePathInstancedNV +.type bluegl_glCoverStrokePathInstancedNV, %function +bluegl_glCoverStrokePathInstancedNV: + mov __blue_glCore_glCoverStrokePathInstancedNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetListParameterfvSGIX -.type bluegl_glGetListParameterfvSGIX, %function -bluegl_glGetListParameterfvSGIX: - mov __blue_glCore_glGetListParameterfvSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glGetPathParameterivNV +.type bluegl_glGetPathParameterivNV, %function +bluegl_glGetPathParameterivNV: + mov __blue_glCore_glGetPathParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glInstrumentsBufferSGIX -.type bluegl_glInstrumentsBufferSGIX, %function -bluegl_glInstrumentsBufferSGIX: - mov __blue_glCore_glInstrumentsBufferSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glGetPathParameterfvNV +.type bluegl_glGetPathParameterfvNV, %function +bluegl_glGetPathParameterfvNV: + mov __blue_glCore_glGetPathParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteNamesAMD -.type bluegl_glDeleteNamesAMD, %function -bluegl_glDeleteNamesAMD: - mov __blue_glCore_glDeleteNamesAMD@GOTPCREL(%rip), %r11 +.global bluegl_glGetPathCommandsNV +.type bluegl_glGetPathCommandsNV, %function +bluegl_glGetPathCommandsNV: + mov __blue_glCore_glGetPathCommandsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetSubroutineIndex -.type bluegl_glGetSubroutineIndex, %function -bluegl_glGetSubroutineIndex: - mov __blue_glCore_glGetSubroutineIndex@GOTPCREL(%rip), %r11 +.global bluegl_glGetPathCoordsNV +.type bluegl_glGetPathCoordsNV, %function +bluegl_glGetPathCoordsNV: + mov __blue_glCore_glGetPathCoordsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVideoCaptureStreamParameterivNV -.type bluegl_glVideoCaptureStreamParameterivNV, %function -bluegl_glVideoCaptureStreamParameterivNV: - mov __blue_glCore_glVideoCaptureStreamParameterivNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetPathDashArrayNV +.type bluegl_glGetPathDashArrayNV, %function +bluegl_glGetPathDashArrayNV: + mov __blue_glCore_glGetPathDashArrayNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4i -.type bluegl_glMultiTexCoord4i, %function -bluegl_glMultiTexCoord4i: - mov __blue_glCore_glMultiTexCoord4i@GOTPCREL(%rip), %r11 +.global bluegl_glGetPathMetricsNV +.type bluegl_glGetPathMetricsNV, %function +bluegl_glGetPathMetricsNV: + mov __blue_glCore_glGetPathMetricsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFramebufferParameteriv -.type bluegl_glGetFramebufferParameteriv, %function -bluegl_glGetFramebufferParameteriv: - mov __blue_glCore_glGetFramebufferParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glGetPathMetricRangeNV +.type bluegl_glGetPathMetricRangeNV, %function +bluegl_glGetPathMetricRangeNV: + mov __blue_glCore_glGetPathMetricRangeNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib2hvNV -.type bluegl_glVertexAttrib2hvNV, %function -bluegl_glVertexAttrib2hvNV: - mov __blue_glCore_glVertexAttrib2hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetPathSpacingNV +.type bluegl_glGetPathSpacingNV, %function +bluegl_glGetPathSpacingNV: + mov __blue_glCore_glGetPathSpacingNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMakeBufferNonResidentNV -.type bluegl_glMakeBufferNonResidentNV, %function -bluegl_glMakeBufferNonResidentNV: - mov __blue_glCore_glMakeBufferNonResidentNV@GOTPCREL(%rip), %r11 +.global bluegl_glIsPointInFillPathNV +.type bluegl_glIsPointInFillPathNV, %function +bluegl_glIsPointInFillPathNV: + mov __blue_glCore_glIsPointInFillPathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPixelDataRangeNV -.type bluegl_glPixelDataRangeNV, %function -bluegl_glPixelDataRangeNV: - mov __blue_glCore_glPixelDataRangeNV@GOTPCREL(%rip), %r11 +.global bluegl_glIsPointInStrokePathNV +.type bluegl_glIsPointInStrokePathNV, %function +bluegl_glIsPointInStrokePathNV: + mov __blue_glCore_glIsPointInStrokePathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedBufferDataEXT -.type bluegl_glNamedBufferDataEXT, %function -bluegl_glNamedBufferDataEXT: - mov __blue_glCore_glNamedBufferDataEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetPathLengthNV +.type bluegl_glGetPathLengthNV, %function +bluegl_glGetPathLengthNV: + mov __blue_glCore_glGetPathLengthNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsImageHandleResidentARB -.type bluegl_glIsImageHandleResidentARB, %function -bluegl_glIsImageHandleResidentARB: - mov __blue_glCore_glIsImageHandleResidentARB@GOTPCREL(%rip), %r11 +.global bluegl_glPointAlongPathNV +.type bluegl_glPointAlongPathNV, %function +bluegl_glPointAlongPathNV: + mov __blue_glCore_glPointAlongPathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFrustumfOES -.type bluegl_glFrustumfOES, %function -bluegl_glFrustumfOES: - mov __blue_glCore_glFrustumfOES@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixLoad3x2fNV +.type bluegl_glMatrixLoad3x2fNV, %function +bluegl_glMatrixLoad3x2fNV: + mov __blue_glCore_glMatrixLoad3x2fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetArrayObjectivATI -.type bluegl_glGetArrayObjectivATI, %function -bluegl_glGetArrayObjectivATI: - mov __blue_glCore_glGetArrayObjectivATI@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixLoad3x3fNV +.type bluegl_glMatrixLoad3x3fNV, %function +bluegl_glMatrixLoad3x3fNV: + mov __blue_glCore_glMatrixLoad3x3fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexParameterIuivEXT -.type bluegl_glMultiTexParameterIuivEXT, %function -bluegl_glMultiTexParameterIuivEXT: - mov __blue_glCore_glMultiTexParameterIuivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixLoadTranspose3x3fNV +.type bluegl_glMatrixLoadTranspose3x3fNV, %function +bluegl_glMatrixLoadTranspose3x3fNV: + mov __blue_glCore_glMatrixLoadTranspose3x3fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMapParameterfvNV -.type bluegl_glGetMapParameterfvNV, %function -bluegl_glGetMapParameterfvNV: - mov __blue_glCore_glGetMapParameterfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixMult3x2fNV +.type bluegl_glMatrixMult3x2fNV, %function +bluegl_glMatrixMult3x2fNV: + mov __blue_glCore_glMatrixMult3x2fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultTransposeMatrixxOES -.type bluegl_glMultTransposeMatrixxOES, %function -bluegl_glMultTransposeMatrixxOES: - mov __blue_glCore_glMultTransposeMatrixxOES@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixMult3x3fNV +.type bluegl_glMatrixMult3x3fNV, %function +bluegl_glMatrixMult3x3fNV: + mov __blue_glCore_glMatrixMult3x3fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPerfMonitorCounterDataAMD -.type bluegl_glGetPerfMonitorCounterDataAMD, %function -bluegl_glGetPerfMonitorCounterDataAMD: - mov __blue_glCore_glGetPerfMonitorCounterDataAMD@GOTPCREL(%rip), %r11 +.global bluegl_glMatrixMultTranspose3x3fNV +.type bluegl_glMatrixMultTranspose3x3fNV, %function +bluegl_glMatrixMultTranspose3x3fNV: + mov __blue_glCore_glMatrixMultTranspose3x3fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearDepthxOES -.type bluegl_glClearDepthxOES, %function -bluegl_glClearDepthxOES: - mov __blue_glCore_glClearDepthxOES@GOTPCREL(%rip), %r11 +.global bluegl_glStencilThenCoverFillPathNV +.type bluegl_glStencilThenCoverFillPathNV, %function +bluegl_glStencilThenCoverFillPathNV: + mov __blue_glCore_glStencilThenCoverFillPathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColor3xvOES -.type bluegl_glColor3xvOES, %function -bluegl_glColor3xvOES: - mov __blue_glCore_glColor3xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glStencilThenCoverStrokePathNV +.type bluegl_glStencilThenCoverStrokePathNV, %function +bluegl_glStencilThenCoverStrokePathNV: + mov __blue_glCore_glStencilThenCoverStrokePathNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI4ivEXT -.type bluegl_glVertexAttribI4ivEXT, %function -bluegl_glVertexAttribI4ivEXT: - mov __blue_glCore_glVertexAttribI4ivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glStencilThenCoverFillPathInstancedNV +.type bluegl_glStencilThenCoverFillPathInstancedNV, %function +bluegl_glStencilThenCoverFillPathInstancedNV: + mov __blue_glCore_glStencilThenCoverFillPathInstancedNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoordP4uiv -.type bluegl_glMultiTexCoordP4uiv, %function -bluegl_glMultiTexCoordP4uiv: - mov __blue_glCore_glMultiTexCoordP4uiv@GOTPCREL(%rip), %r11 +.global bluegl_glStencilThenCoverStrokePathInstancedNV +.type bluegl_glStencilThenCoverStrokePathInstancedNV, %function +bluegl_glStencilThenCoverStrokePathInstancedNV: + mov __blue_glCore_glStencilThenCoverStrokePathInstancedNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI4usv -.type bluegl_glVertexAttribI4usv, %function -bluegl_glVertexAttribI4usv: - mov __blue_glCore_glVertexAttribI4usv@GOTPCREL(%rip), %r11 +.global bluegl_glPathGlyphIndexRangeNV +.type bluegl_glPathGlyphIndexRangeNV, %function +bluegl_glPathGlyphIndexRangeNV: + mov __blue_glCore_glPathGlyphIndexRangeNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnTexImage -.type bluegl_glGetnTexImage, %function -bluegl_glGetnTexImage: - mov __blue_glCore_glGetnTexImage@GOTPCREL(%rip), %r11 +.global bluegl_glPathGlyphIndexArrayNV +.type bluegl_glPathGlyphIndexArrayNV, %function +bluegl_glPathGlyphIndexArrayNV: + mov __blue_glCore_glPathGlyphIndexArrayNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReadBuffer -.type bluegl_glReadBuffer, %function -bluegl_glReadBuffer: - mov __blue_glCore_glReadBuffer@GOTPCREL(%rip), %r11 +.global bluegl_glPathMemoryGlyphIndexArrayNV +.type bluegl_glPathMemoryGlyphIndexArrayNV, %function +bluegl_glPathMemoryGlyphIndexArrayNV: + mov __blue_glCore_glPathMemoryGlyphIndexArrayNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3iARB -.type bluegl_glUniform3iARB, %function -bluegl_glUniform3iARB: - mov __blue_glCore_glUniform3iARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramPathFragmentInputGenNV +.type bluegl_glProgramPathFragmentInputGenNV, %function +bluegl_glProgramPathFragmentInputGenNV: + mov __blue_glCore_glProgramPathFragmentInputGenNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexBufferEXT -.type bluegl_glMultiTexBufferEXT, %function -bluegl_glMultiTexBufferEXT: - mov __blue_glCore_glMultiTexBufferEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramResourcefvNV +.type bluegl_glGetProgramResourcefvNV, %function +bluegl_glGetProgramResourcefvNV: + mov __blue_glCore_glGetProgramResourcefvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormalStream3fvATI -.type bluegl_glNormalStream3fvATI, %function -bluegl_glNormalStream3fvATI: - mov __blue_glCore_glNormalStream3fvATI@GOTPCREL(%rip), %r11 +.global bluegl_glPathColorGenNV +.type bluegl_glPathColorGenNV, %function +bluegl_glPathColorGenNV: + mov __blue_glCore_glPathColorGenNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteVertexShaderEXT -.type bluegl_glDeleteVertexShaderEXT, %function -bluegl_glDeleteVertexShaderEXT: - mov __blue_glCore_glDeleteVertexShaderEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPathTexGenNV +.type bluegl_glPathTexGenNV, %function +bluegl_glPathTexGenNV: + mov __blue_glCore_glPathTexGenNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3hvNV -.type bluegl_glVertexAttrib3hvNV, %function -bluegl_glVertexAttrib3hvNV: - mov __blue_glCore_glVertexAttrib3hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glPathFogGenNV +.type bluegl_glPathFogGenNV, %function +bluegl_glPathFogGenNV: + mov __blue_glCore_glPathFogGenNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawMeshArraysSUN -.type bluegl_glDrawMeshArraysSUN, %function -bluegl_glDrawMeshArraysSUN: - mov __blue_glCore_glDrawMeshArraysSUN@GOTPCREL(%rip), %r11 +.global bluegl_glGetPathColorGenivNV +.type bluegl_glGetPathColorGenivNV, %function +bluegl_glGetPathColorGenivNV: + mov __blue_glCore_glGetPathColorGenivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL3dvEXT -.type bluegl_glVertexAttribL3dvEXT, %function -bluegl_glVertexAttribL3dvEXT: - mov __blue_glCore_glVertexAttribL3dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetPathColorGenfvNV +.type bluegl_glGetPathColorGenfvNV, %function +bluegl_glGetPathColorGenfvNV: + mov __blue_glCore_glGetPathColorGenfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeuiColor3fVertex3fSUN -.type bluegl_glReplacementCodeuiColor3fVertex3fSUN, %function -bluegl_glReplacementCodeuiColor3fVertex3fSUN: - mov __blue_glCore_glReplacementCodeuiColor3fVertex3fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glGetPathTexGenivNV +.type bluegl_glGetPathTexGenivNV, %function +bluegl_glGetPathTexGenivNV: + mov __blue_glCore_glGetPathTexGenivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1fv -.type bluegl_glProgramUniform1fv, %function -bluegl_glProgramUniform1fv: - mov __blue_glCore_glProgramUniform1fv@GOTPCREL(%rip), %r11 +.global bluegl_glGetPathTexGenfvNV +.type bluegl_glGetPathTexGenfvNV, %function +bluegl_glGetPathTexGenfvNV: + mov __blue_glCore_glGetPathTexGenfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormal3xvOES -.type bluegl_glNormal3xvOES, %function -bluegl_glNormal3xvOES: - mov __blue_glCore_glNormal3xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glPixelDataRangeNV +.type bluegl_glPixelDataRangeNV, %function +bluegl_glPixelDataRangeNV: + mov __blue_glCore_glPixelDataRangeNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramStageiv -.type bluegl_glGetProgramStageiv, %function -bluegl_glGetProgramStageiv: - mov __blue_glCore_glGetProgramStageiv@GOTPCREL(%rip), %r11 +.global bluegl_glFlushPixelDataRangeNV +.type bluegl_glFlushPixelDataRangeNV, %function +bluegl_glFlushPixelDataRangeNV: + mov __blue_glCore_glFlushPixelDataRangeNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2ui64NV -.type bluegl_glUniform2ui64NV, %function -bluegl_glUniform2ui64NV: - mov __blue_glCore_glUniform2ui64NV@GOTPCREL(%rip), %r11 +.global bluegl_glPointParameteriNV +.type bluegl_glPointParameteriNV, %function +bluegl_glPointParameteriNV: + mov __blue_glCore_glPointParameteriNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramEnvParameter4fARB -.type bluegl_glProgramEnvParameter4fARB, %function -bluegl_glProgramEnvParameter4fARB: - mov __blue_glCore_glProgramEnvParameter4fARB@GOTPCREL(%rip), %r11 +.global bluegl_glPointParameterivNV +.type bluegl_glPointParameterivNV, %function +bluegl_glPointParameterivNV: + mov __blue_glCore_glPointParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPixelTransformParameterivEXT -.type bluegl_glPixelTransformParameterivEXT, %function -bluegl_glPixelTransformParameterivEXT: - mov __blue_glCore_glPixelTransformParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPresentFrameKeyedNV +.type bluegl_glPresentFrameKeyedNV, %function +bluegl_glPresentFrameKeyedNV: + mov __blue_glCore_glPresentFrameKeyedNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos4dvMESA -.type bluegl_glWindowPos4dvMESA, %function -bluegl_glWindowPos4dvMESA: - mov __blue_glCore_glWindowPos4dvMESA@GOTPCREL(%rip), %r11 +.global bluegl_glPresentFrameDualFillNV +.type bluegl_glPresentFrameDualFillNV, %function +bluegl_glPresentFrameDualFillNV: + mov __blue_glCore_glPresentFrameDualFillNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiDrawElementsIndirectBindlessCountNV -.type bluegl_glMultiDrawElementsIndirectBindlessCountNV, %function -bluegl_glMultiDrawElementsIndirectBindlessCountNV: - mov __blue_glCore_glMultiDrawElementsIndirectBindlessCountNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetVideoivNV +.type bluegl_glGetVideoivNV, %function +bluegl_glGetVideoivNV: + mov __blue_glCore_glGetVideoivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3i64vARB -.type bluegl_glUniform3i64vARB, %function -bluegl_glUniform3i64vARB: - mov __blue_glCore_glUniform3i64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetVideouivNV +.type bluegl_glGetVideouivNV, %function +bluegl_glGetVideouivNV: + mov __blue_glCore_glGetVideouivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureStorage3DMultisample -.type bluegl_glTextureStorage3DMultisample, %function -bluegl_glTextureStorage3DMultisample: - mov __blue_glCore_glTextureStorage3DMultisample@GOTPCREL(%rip), %r11 +.global bluegl_glGetVideoi64vNV +.type bluegl_glGetVideoi64vNV, %function +bluegl_glGetVideoi64vNV: + mov __blue_glCore_glGetVideoi64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedBufferParameterui64vNV -.type bluegl_glGetNamedBufferParameterui64vNV, %function -bluegl_glGetNamedBufferParameterui64vNV: - mov __blue_glCore_glGetNamedBufferParameterui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetVideoui64vNV +.type bluegl_glGetVideoui64vNV, %function +bluegl_glGetVideoui64vNV: + mov __blue_glCore_glGetVideoui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEndTransformFeedback -.type bluegl_glEndTransformFeedback, %function -bluegl_glEndTransformFeedback: - mov __blue_glCore_glEndTransformFeedback@GOTPCREL(%rip), %r11 +.global bluegl_glPrimitiveRestartNV +.type bluegl_glPrimitiveRestartNV, %function +bluegl_glPrimitiveRestartNV: + mov __blue_glCore_glPrimitiveRestartNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI3ivEXT -.type bluegl_glVertexAttribI3ivEXT, %function -bluegl_glVertexAttribI3ivEXT: - mov __blue_glCore_glVertexAttribI3ivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPrimitiveRestartIndexNV +.type bluegl_glPrimitiveRestartIndexNV, %function +bluegl_glPrimitiveRestartIndexNV: + mov __blue_glCore_glPrimitiveRestartIndexNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2f -.type bluegl_glUniform2f, %function -bluegl_glUniform2f: - mov __blue_glCore_glUniform2f@GOTPCREL(%rip), %r11 +.global bluegl_glCombinerParameterfvNV +.type bluegl_glCombinerParameterfvNV, %function +bluegl_glCombinerParameterfvNV: + mov __blue_glCore_glCombinerParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1dARB -.type bluegl_glMultiTexCoord1dARB, %function -bluegl_glMultiTexCoord1dARB: - mov __blue_glCore_glMultiTexCoord1dARB@GOTPCREL(%rip), %r11 +.global bluegl_glCombinerParameterfNV +.type bluegl_glCombinerParameterfNV, %function +bluegl_glCombinerParameterfNV: + mov __blue_glCore_glCombinerParameterfNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetColorTableParameterfv -.type bluegl_glGetColorTableParameterfv, %function -bluegl_glGetColorTableParameterfv: - mov __blue_glCore_glGetColorTableParameterfv@GOTPCREL(%rip), %r11 +.global bluegl_glCombinerParameterivNV +.type bluegl_glCombinerParameterivNV, %function +bluegl_glCombinerParameterivNV: + mov __blue_glCore_glCombinerParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3d -.type bluegl_glWindowPos3d, %function -bluegl_glWindowPos3d: - mov __blue_glCore_glWindowPos3d@GOTPCREL(%rip), %r11 +.global bluegl_glCombinerParameteriNV +.type bluegl_glCombinerParameteriNV, %function +bluegl_glCombinerParameteriNV: + mov __blue_glCore_glCombinerParameteriNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL3ui64vNV -.type bluegl_glVertexAttribL3ui64vNV, %function -bluegl_glVertexAttribL3ui64vNV: - mov __blue_glCore_glVertexAttribL3ui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glCombinerInputNV +.type bluegl_glCombinerInputNV, %function +bluegl_glCombinerInputNV: + mov __blue_glCore_glCombinerInputNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeuiSUN -.type bluegl_glReplacementCodeuiSUN, %function -bluegl_glReplacementCodeuiSUN: - mov __blue_glCore_glReplacementCodeuiSUN@GOTPCREL(%rip), %r11 +.global bluegl_glCombinerOutputNV +.type bluegl_glCombinerOutputNV, %function +bluegl_glCombinerOutputNV: + mov __blue_glCore_glCombinerOutputNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColor4ubVertex3fSUN -.type bluegl_glColor4ubVertex3fSUN, %function -bluegl_glColor4ubVertex3fSUN: - mov __blue_glCore_glColor4ubVertex3fSUN@GOTPCREL(%rip), %r11 +.global bluegl_glFinalCombinerInputNV +.type bluegl_glFinalCombinerInputNV, %function +bluegl_glFinalCombinerInputNV: + mov __blue_glCore_glFinalCombinerInputNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawRangeElementsBaseVertex -.type bluegl_glDrawRangeElementsBaseVertex, %function -bluegl_glDrawRangeElementsBaseVertex: - mov __blue_glCore_glDrawRangeElementsBaseVertex@GOTPCREL(%rip), %r11 +.global bluegl_glGetCombinerInputParameterfvNV +.type bluegl_glGetCombinerInputParameterfvNV, %function +bluegl_glGetCombinerInputParameterfvNV: + mov __blue_glCore_glGetCombinerInputParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetMultiTexParameterivEXT -.type bluegl_glGetMultiTexParameterivEXT, %function -bluegl_glGetMultiTexParameterivEXT: - mov __blue_glCore_glGetMultiTexParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetCombinerInputParameterivNV +.type bluegl_glGetCombinerInputParameterivNV, %function +bluegl_glGetCombinerInputParameterivNV: + mov __blue_glCore_glGetCombinerInputParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3hvNV -.type bluegl_glMultiTexCoord3hvNV, %function -bluegl_glMultiTexCoord3hvNV: - mov __blue_glCore_glMultiTexCoord3hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetCombinerOutputParameterfvNV +.type bluegl_glGetCombinerOutputParameterfvNV, %function +bluegl_glGetCombinerOutputParameterfvNV: + mov __blue_glCore_glGetCombinerOutputParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetQueryBufferObjectuiv -.type bluegl_glGetQueryBufferObjectuiv, %function -bluegl_glGetQueryBufferObjectuiv: - mov __blue_glCore_glGetQueryBufferObjectuiv@GOTPCREL(%rip), %r11 +.global bluegl_glGetCombinerOutputParameterivNV +.type bluegl_glGetCombinerOutputParameterivNV, %function +bluegl_glGetCombinerOutputParameterivNV: + mov __blue_glCore_glGetCombinerOutputParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPerfMonitorGroupsAMD -.type bluegl_glGetPerfMonitorGroupsAMD, %function -bluegl_glGetPerfMonitorGroupsAMD: - mov __blue_glCore_glGetPerfMonitorGroupsAMD@GOTPCREL(%rip), %r11 +.global bluegl_glGetFinalCombinerInputParameterfvNV +.type bluegl_glGetFinalCombinerInputParameterfvNV, %function +bluegl_glGetFinalCombinerInputParameterfvNV: + mov __blue_glCore_glGetFinalCombinerInputParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUnlockArraysEXT -.type bluegl_glUnlockArraysEXT, %function -bluegl_glUnlockArraysEXT: - mov __blue_glCore_glUnlockArraysEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetFinalCombinerInputParameterivNV +.type bluegl_glGetFinalCombinerInputParameterivNV, %function +bluegl_glGetFinalCombinerInputParameterivNV: + mov __blue_glCore_glGetFinalCombinerInputParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPauseTransformFeedback -.type bluegl_glPauseTransformFeedback, %function -bluegl_glPauseTransformFeedback: - mov __blue_glCore_glPauseTransformFeedback@GOTPCREL(%rip), %r11 +.global bluegl_glCombinerStageParameterfvNV +.type bluegl_glCombinerStageParameterfvNV, %function +bluegl_glCombinerStageParameterfvNV: + mov __blue_glCore_glCombinerStageParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramEnvParameterIivNV -.type bluegl_glGetProgramEnvParameterIivNV, %function -bluegl_glGetProgramEnvParameterIivNV: - mov __blue_glCore_glGetProgramEnvParameterIivNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetCombinerStageParameterfvNV +.type bluegl_glGetCombinerStageParameterfvNV, %function +bluegl_glGetCombinerStageParameterfvNV: + mov __blue_glCore_glGetCombinerStageParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathTexGenNV -.type bluegl_glPathTexGenNV, %function -bluegl_glPathTexGenNV: - mov __blue_glCore_glPathTexGenNV@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferSampleLocationsfvNV +.type bluegl_glFramebufferSampleLocationsfvNV, %function +bluegl_glFramebufferSampleLocationsfvNV: + mov __blue_glCore_glFramebufferSampleLocationsfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertex3xOES -.type bluegl_glVertex3xOES, %function -bluegl_glVertex3xOES: - mov __blue_glCore_glVertex3xOES@GOTPCREL(%rip), %r11 +.global bluegl_glNamedFramebufferSampleLocationsfvNV +.type bluegl_glNamedFramebufferSampleLocationsfvNV, %function +bluegl_glNamedFramebufferSampleLocationsfvNV: + mov __blue_glCore_glNamedFramebufferSampleLocationsfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEdgeFlagPointerEXT -.type bluegl_glEdgeFlagPointerEXT, %function -bluegl_glEdgeFlagPointerEXT: - mov __blue_glCore_glEdgeFlagPointerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glResolveDepthValuesNV +.type bluegl_glResolveDepthValuesNV, %function +bluegl_glResolveDepthValuesNV: + mov __blue_glCore_glResolveDepthValuesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribBinding -.type bluegl_glVertexAttribBinding, %function -bluegl_glVertexAttribBinding: - mov __blue_glCore_glVertexAttribBinding@GOTPCREL(%rip), %r11 +.global bluegl_glMakeBufferResidentNV +.type bluegl_glMakeBufferResidentNV, %function +bluegl_glMakeBufferResidentNV: + mov __blue_glCore_glMakeBufferResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3f -.type bluegl_glVertexAttrib3f, %function -bluegl_glVertexAttrib3f: - mov __blue_glCore_glVertexAttrib3f@GOTPCREL(%rip), %r11 +.global bluegl_glMakeBufferNonResidentNV +.type bluegl_glMakeBufferNonResidentNV, %function +bluegl_glMakeBufferNonResidentNV: + mov __blue_glCore_glMakeBufferNonResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4NubARB -.type bluegl_glVertexAttrib4NubARB, %function -bluegl_glVertexAttrib4NubARB: - mov __blue_glCore_glVertexAttrib4NubARB@GOTPCREL(%rip), %r11 +.global bluegl_glIsBufferResidentNV +.type bluegl_glIsBufferResidentNV, %function +bluegl_glIsBufferResidentNV: + mov __blue_glCore_glIsBufferResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2svMESA -.type bluegl_glWindowPos2svMESA, %function -bluegl_glWindowPos2svMESA: - mov __blue_glCore_glWindowPos2svMESA@GOTPCREL(%rip), %r11 +.global bluegl_glMakeNamedBufferResidentNV +.type bluegl_glMakeNamedBufferResidentNV, %function +bluegl_glMakeNamedBufferResidentNV: + mov __blue_glCore_glMakeNamedBufferResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetUniformSubroutineuiv -.type bluegl_glGetUniformSubroutineuiv, %function -bluegl_glGetUniformSubroutineuiv: - mov __blue_glCore_glGetUniformSubroutineuiv@GOTPCREL(%rip), %r11 +.global bluegl_glMakeNamedBufferNonResidentNV +.type bluegl_glMakeNamedBufferNonResidentNV, %function +bluegl_glMakeNamedBufferNonResidentNV: + mov __blue_glCore_glMakeNamedBufferNonResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2ivARB -.type bluegl_glMultiTexCoord2ivARB, %function -bluegl_glMultiTexCoord2ivARB: - mov __blue_glCore_glMultiTexCoord2ivARB@GOTPCREL(%rip), %r11 +.global bluegl_glIsNamedBufferResidentNV +.type bluegl_glIsNamedBufferResidentNV, %function +bluegl_glIsNamedBufferResidentNV: + mov __blue_glCore_glIsNamedBufferResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFragmentMaterialivSGIX -.type bluegl_glFragmentMaterialivSGIX, %function -bluegl_glFragmentMaterialivSGIX: - mov __blue_glCore_glFragmentMaterialivSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glGetBufferParameterui64vNV +.type bluegl_glGetBufferParameterui64vNV, %function +bluegl_glGetBufferParameterui64vNV: + mov __blue_glCore_glGetBufferParameterui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSamplerParameteriv -.type bluegl_glSamplerParameteriv, %function -bluegl_glSamplerParameteriv: - mov __blue_glCore_glSamplerParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glGetNamedBufferParameterui64vNV +.type bluegl_glGetNamedBufferParameterui64vNV, %function +bluegl_glGetNamedBufferParameterui64vNV: + mov __blue_glCore_glGetNamedBufferParameterui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayColorOffsetEXT -.type bluegl_glVertexArrayColorOffsetEXT, %function -bluegl_glVertexArrayColorOffsetEXT: - mov __blue_glCore_glVertexArrayColorOffsetEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetIntegerui64vNV +.type bluegl_glGetIntegerui64vNV, %function +bluegl_glGetIntegerui64vNV: + mov __blue_glCore_glGetIntegerui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3sNV -.type bluegl_glVertexAttrib3sNV, %function -bluegl_glVertexAttrib3sNV: - mov __blue_glCore_glVertexAttrib3sNV@GOTPCREL(%rip), %r11 +.global bluegl_glUniformui64NV +.type bluegl_glUniformui64NV, %function +bluegl_glUniformui64NV: + mov __blue_glCore_glUniformui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawElementsInstanced -.type bluegl_glDrawElementsInstanced, %function -bluegl_glDrawElementsInstanced: - mov __blue_glCore_glDrawElementsInstanced@GOTPCREL(%rip), %r11 +.global bluegl_glUniformui64vNV +.type bluegl_glUniformui64vNV, %function +bluegl_glUniformui64vNV: + mov __blue_glCore_glUniformui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreateSyncFromCLeventARB -.type bluegl_glCreateSyncFromCLeventARB, %function -bluegl_glCreateSyncFromCLeventARB: - mov __blue_glCore_glCreateSyncFromCLeventARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformui64NV +.type bluegl_glProgramUniformui64NV, %function +bluegl_glProgramUniformui64NV: + mov __blue_glCore_glProgramUniformui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glInsertEventMarkerEXT -.type bluegl_glInsertEventMarkerEXT, %function -bluegl_glInsertEventMarkerEXT: - mov __blue_glCore_glInsertEventMarkerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramUniformui64vNV +.type bluegl_glProgramUniformui64vNV, %function +bluegl_glProgramUniformui64vNV: + mov __blue_glCore_glProgramUniformui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureParameterfv -.type bluegl_glGetTextureParameterfv, %function -bluegl_glGetTextureParameterfv: - mov __blue_glCore_glGetTextureParameterfv@GOTPCREL(%rip), %r11 +.global bluegl_glTextureBarrierNV +.type bluegl_glTextureBarrierNV, %function +bluegl_glTextureBarrierNV: + mov __blue_glCore_glTextureBarrierNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyMultiTexImage2DEXT -.type bluegl_glCopyMultiTexImage2DEXT, %function -bluegl_glCopyMultiTexImage2DEXT: - mov __blue_glCore_glCopyMultiTexImage2DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexImage2DMultisampleCoverageNV +.type bluegl_glTexImage2DMultisampleCoverageNV, %function +bluegl_glTexImage2DMultisampleCoverageNV: + mov __blue_glCore_glTexImage2DMultisampleCoverageNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexWeightfEXT -.type bluegl_glVertexWeightfEXT, %function -bluegl_glVertexWeightfEXT: - mov __blue_glCore_glVertexWeightfEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexImage3DMultisampleCoverageNV +.type bluegl_glTexImage3DMultisampleCoverageNV, %function +bluegl_glTexImage3DMultisampleCoverageNV: + mov __blue_glCore_glTexImage3DMultisampleCoverageNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4i64vARB -.type bluegl_glUniform4i64vARB, %function -bluegl_glUniform4i64vARB: - mov __blue_glCore_glUniform4i64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glTextureImage2DMultisampleNV +.type bluegl_glTextureImage2DMultisampleNV, %function +bluegl_glTextureImage2DMultisampleNV: + mov __blue_glCore_glTextureImage2DMultisampleNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPathParameterfvNV -.type bluegl_glGetPathParameterfvNV, %function -bluegl_glGetPathParameterfvNV: - mov __blue_glCore_glGetPathParameterfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glTextureImage3DMultisampleNV +.type bluegl_glTextureImage3DMultisampleNV, %function +bluegl_glTextureImage3DMultisampleNV: + mov __blue_glCore_glTextureImage3DMultisampleNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBlitNamedFramebuffer -.type bluegl_glBlitNamedFramebuffer, %function -bluegl_glBlitNamedFramebuffer: - mov __blue_glCore_glBlitNamedFramebuffer@GOTPCREL(%rip), %r11 +.global bluegl_glTextureImage2DMultisampleCoverageNV +.type bluegl_glTextureImage2DMultisampleCoverageNV, %function +bluegl_glTextureImage2DMultisampleCoverageNV: + mov __blue_glCore_glTextureImage2DMultisampleCoverageNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoordPointerEXT -.type bluegl_glTexCoordPointerEXT, %function -bluegl_glTexCoordPointerEXT: - mov __blue_glCore_glTexCoordPointerEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTextureImage3DMultisampleCoverageNV +.type bluegl_glTextureImage3DMultisampleCoverageNV, %function +bluegl_glTextureImage3DMultisampleCoverageNV: + mov __blue_glCore_glTextureImage3DMultisampleCoverageNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPathMetricsNV -.type bluegl_glGetPathMetricsNV, %function -bluegl_glGetPathMetricsNV: - mov __blue_glCore_glGetPathMetricsNV@GOTPCREL(%rip), %r11 +.global bluegl_glBeginTransformFeedbackNV +.type bluegl_glBeginTransformFeedbackNV, %function +bluegl_glBeginTransformFeedbackNV: + mov __blue_glCore_glBeginTransformFeedbackNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL2dvEXT -.type bluegl_glVertexAttribL2dvEXT, %function -bluegl_glVertexAttribL2dvEXT: - mov __blue_glCore_glVertexAttribL2dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glEndTransformFeedbackNV +.type bluegl_glEndTransformFeedbackNV, %function +bluegl_glEndTransformFeedbackNV: + mov __blue_glCore_glEndTransformFeedbackNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVariantuivEXT -.type bluegl_glVariantuivEXT, %function -bluegl_glVariantuivEXT: - mov __blue_glCore_glVariantuivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTransformFeedbackAttribsNV +.type bluegl_glTransformFeedbackAttribsNV, %function +bluegl_glTransformFeedbackAttribsNV: + mov __blue_glCore_glTransformFeedbackAttribsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribdvNV -.type bluegl_glGetVertexAttribdvNV, %function -bluegl_glGetVertexAttribdvNV: - mov __blue_glCore_glGetVertexAttribdvNV@GOTPCREL(%rip), %r11 +.global bluegl_glBindBufferRangeNV +.type bluegl_glBindBufferRangeNV, %function +bluegl_glBindBufferRangeNV: + mov __blue_glCore_glBindBufferRangeNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFenceSync -.type bluegl_glFenceSync, %function -bluegl_glFenceSync: - mov __blue_glCore_glFenceSync@GOTPCREL(%rip), %r11 +.global bluegl_glBindBufferOffsetNV +.type bluegl_glBindBufferOffsetNV, %function +bluegl_glBindBufferOffsetNV: + mov __blue_glCore_glBindBufferOffsetNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureParameterIuiv -.type bluegl_glGetTextureParameterIuiv, %function -bluegl_glGetTextureParameterIuiv: - mov __blue_glCore_glGetTextureParameterIuiv@GOTPCREL(%rip), %r11 +.global bluegl_glBindBufferBaseNV +.type bluegl_glBindBufferBaseNV, %function +bluegl_glBindBufferBaseNV: + mov __blue_glCore_glBindBufferBaseNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2sARB -.type bluegl_glMultiTexCoord2sARB, %function -bluegl_glMultiTexCoord2sARB: - mov __blue_glCore_glMultiTexCoord2sARB@GOTPCREL(%rip), %r11 +.global bluegl_glTransformFeedbackVaryingsNV +.type bluegl_glTransformFeedbackVaryingsNV, %function +bluegl_glTransformFeedbackVaryingsNV: + mov __blue_glCore_glTransformFeedbackVaryingsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2i64NV -.type bluegl_glUniform2i64NV, %function -bluegl_glUniform2i64NV: - mov __blue_glCore_glUniform2i64NV@GOTPCREL(%rip), %r11 +.global bluegl_glActiveVaryingNV +.type bluegl_glActiveVaryingNV, %function +bluegl_glActiveVaryingNV: + mov __blue_glCore_glActiveVaryingNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeformationMap3dSGIX -.type bluegl_glDeformationMap3dSGIX, %function -bluegl_glDeformationMap3dSGIX: - mov __blue_glCore_glDeformationMap3dSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glGetVaryingLocationNV +.type bluegl_glGetVaryingLocationNV, %function +bluegl_glGetVaryingLocationNV: + mov __blue_glCore_glGetVaryingLocationNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawRangeElementArrayAPPLE -.type bluegl_glDrawRangeElementArrayAPPLE, %function -bluegl_glDrawRangeElementArrayAPPLE: - mov __blue_glCore_glDrawRangeElementArrayAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glGetActiveVaryingNV +.type bluegl_glGetActiveVaryingNV, %function +bluegl_glGetActiveVaryingNV: + mov __blue_glCore_glGetActiveVaryingNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDepthFunc -.type bluegl_glDepthFunc, %function -bluegl_glDepthFunc: - mov __blue_glCore_glDepthFunc@GOTPCREL(%rip), %r11 +.global bluegl_glGetTransformFeedbackVaryingNV +.type bluegl_glGetTransformFeedbackVaryingNV, %function +bluegl_glGetTransformFeedbackVaryingNV: + mov __blue_glCore_glGetTransformFeedbackVaryingNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3dvEXT -.type bluegl_glProgramUniform3dvEXT, %function -bluegl_glProgramUniform3dvEXT: - mov __blue_glCore_glProgramUniform3dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTransformFeedbackStreamAttribsNV +.type bluegl_glTransformFeedbackStreamAttribsNV, %function +bluegl_glTransformFeedbackStreamAttribsNV: + mov __blue_glCore_glTransformFeedbackStreamAttribsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord3hvNV -.type bluegl_glTexCoord3hvNV, %function -bluegl_glTexCoord3hvNV: - mov __blue_glCore_glTexCoord3hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glBindTransformFeedbackNV +.type bluegl_glBindTransformFeedbackNV, %function +bluegl_glBindTransformFeedbackNV: + mov __blue_glCore_glBindTransformFeedbackNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPathLengthNV -.type bluegl_glGetPathLengthNV, %function -bluegl_glGetPathLengthNV: - mov __blue_glCore_glGetPathLengthNV@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteTransformFeedbacksNV +.type bluegl_glDeleteTransformFeedbacksNV, %function +bluegl_glDeleteTransformFeedbacksNV: + mov __blue_glCore_glDeleteTransformFeedbacksNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUnmapObjectBufferATI -.type bluegl_glUnmapObjectBufferATI, %function -bluegl_glUnmapObjectBufferATI: - mov __blue_glCore_glUnmapObjectBufferATI@GOTPCREL(%rip), %r11 +.global bluegl_glGenTransformFeedbacksNV +.type bluegl_glGenTransformFeedbacksNV, %function +bluegl_glGenTransformFeedbacksNV: + mov __blue_glCore_glGenTransformFeedbacksNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glValidateProgramPipeline -.type bluegl_glValidateProgramPipeline, %function -bluegl_glValidateProgramPipeline: - mov __blue_glCore_glValidateProgramPipeline@GOTPCREL(%rip), %r11 +.global bluegl_glIsTransformFeedbackNV +.type bluegl_glIsTransformFeedbackNV, %function +bluegl_glIsTransformFeedbackNV: + mov __blue_glCore_glIsTransformFeedbackNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsProgram -.type bluegl_glIsProgram, %function -bluegl_glIsProgram: - mov __blue_glCore_glIsProgram@GOTPCREL(%rip), %r11 +.global bluegl_glPauseTransformFeedbackNV +.type bluegl_glPauseTransformFeedbackNV, %function +bluegl_glPauseTransformFeedbackNV: + mov __blue_glCore_glPauseTransformFeedbackNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4hvNV -.type bluegl_glVertexAttrib4hvNV, %function -bluegl_glVertexAttrib4hvNV: - mov __blue_glCore_glVertexAttrib4hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glResumeTransformFeedbackNV +.type bluegl_glResumeTransformFeedbackNV, %function +bluegl_glResumeTransformFeedbackNV: + mov __blue_glCore_glResumeTransformFeedbackNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLoadTransposeMatrixdARB -.type bluegl_glLoadTransposeMatrixdARB, %function -bluegl_glLoadTransposeMatrixdARB: - mov __blue_glCore_glLoadTransposeMatrixdARB@GOTPCREL(%rip), %r11 +.global bluegl_glDrawTransformFeedbackNV +.type bluegl_glDrawTransformFeedbackNV, %function +bluegl_glDrawTransformFeedbackNV: + mov __blue_glCore_glDrawTransformFeedbackNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMapVertexAttrib2dAPPLE -.type bluegl_glMapVertexAttrib2dAPPLE, %function -bluegl_glMapVertexAttrib2dAPPLE: - mov __blue_glCore_glMapVertexAttrib2dAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glVDPAUInitNV +.type bluegl_glVDPAUInitNV, %function +bluegl_glVDPAUInitNV: + mov __blue_glCore_glVDPAUInitNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramBinary -.type bluegl_glProgramBinary, %function -bluegl_glProgramBinary: - mov __blue_glCore_glProgramBinary@GOTPCREL(%rip), %r11 +.global bluegl_glVDPAUFiniNV +.type bluegl_glVDPAUFiniNV, %function +bluegl_glVDPAUFiniNV: + mov __blue_glCore_glVDPAUFiniNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3i -.type bluegl_glUniform3i, %function -bluegl_glUniform3i: - mov __blue_glCore_glUniform3i@GOTPCREL(%rip), %r11 +.global bluegl_glVDPAURegisterVideoSurfaceNV +.type bluegl_glVDPAURegisterVideoSurfaceNV, %function +bluegl_glVDPAURegisterVideoSurfaceNV: + mov __blue_glCore_glVDPAURegisterVideoSurfaceNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2dEXT -.type bluegl_glProgramUniform2dEXT, %function -bluegl_glProgramUniform2dEXT: - mov __blue_glCore_glProgramUniform2dEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVDPAURegisterOutputSurfaceNV +.type bluegl_glVDPAURegisterOutputSurfaceNV, %function +bluegl_glVDPAURegisterOutputSurfaceNV: + mov __blue_glCore_glVDPAURegisterOutputSurfaceNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDepthRangeIndexed -.type bluegl_glDepthRangeIndexed, %function -bluegl_glDepthRangeIndexed: - mov __blue_glCore_glDepthRangeIndexed@GOTPCREL(%rip), %r11 +.global bluegl_glVDPAUIsSurfaceNV +.type bluegl_glVDPAUIsSurfaceNV, %function +bluegl_glVDPAUIsSurfaceNV: + mov __blue_glCore_glVDPAUIsSurfaceNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEvalCoord1xOES -.type bluegl_glEvalCoord1xOES, %function -bluegl_glEvalCoord1xOES: - mov __blue_glCore_glEvalCoord1xOES@GOTPCREL(%rip), %r11 +.global bluegl_glVDPAUUnregisterSurfaceNV +.type bluegl_glVDPAUUnregisterSurfaceNV, %function +bluegl_glVDPAUUnregisterSurfaceNV: + mov __blue_glCore_glVDPAUUnregisterSurfaceNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayRangeAPPLE -.type bluegl_glVertexArrayRangeAPPLE, %function -bluegl_glVertexArrayRangeAPPLE: - mov __blue_glCore_glVertexArrayRangeAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glVDPAUGetSurfaceivNV +.type bluegl_glVDPAUGetSurfaceivNV, %function +bluegl_glVDPAUGetSurfaceivNV: + mov __blue_glCore_glVDPAUGetSurfaceivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream1svATI -.type bluegl_glVertexStream1svATI, %function -bluegl_glVertexStream1svATI: - mov __blue_glCore_glVertexStream1svATI@GOTPCREL(%rip), %r11 +.global bluegl_glVDPAUSurfaceAccessNV +.type bluegl_glVDPAUSurfaceAccessNV, %function +bluegl_glVDPAUSurfaceAccessNV: + mov __blue_glCore_glVDPAUSurfaceAccessNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormalStream3iATI -.type bluegl_glNormalStream3iATI, %function -bluegl_glNormalStream3iATI: - mov __blue_glCore_glNormalStream3iATI@GOTPCREL(%rip), %r11 +.global bluegl_glVDPAUMapSurfacesNV +.type bluegl_glVDPAUMapSurfacesNV, %function +bluegl_glVDPAUMapSurfacesNV: + mov __blue_glCore_glVDPAUMapSurfacesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4f -.type bluegl_glProgramUniform4f, %function -bluegl_glProgramUniform4f: - mov __blue_glCore_glProgramUniform4f@GOTPCREL(%rip), %r11 +.global bluegl_glVDPAUUnmapSurfacesNV +.type bluegl_glVDPAUUnmapSurfacesNV, %function +bluegl_glVDPAUUnmapSurfacesNV: + mov __blue_glCore_glVDPAUUnmapSurfacesNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glScalexOES -.type bluegl_glScalexOES, %function -bluegl_glScalexOES: - mov __blue_glCore_glScalexOES@GOTPCREL(%rip), %r11 +.global bluegl_glFlushVertexArrayRangeNV +.type bluegl_glFlushVertexArrayRangeNV, %function +bluegl_glFlushVertexArrayRangeNV: + mov __blue_glCore_glFlushVertexArrayRangeNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1fv -.type bluegl_glUniform1fv, %function -bluegl_glUniform1fv: - mov __blue_glCore_glUniform1fv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexArrayRangeNV +.type bluegl_glVertexArrayRangeNV, %function +bluegl_glVertexArrayRangeNV: + mov __blue_glCore_glVertexArrayRangeNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetActiveUniform -.type bluegl_glGetActiveUniform, %function -bluegl_glGetActiveUniform: - mov __blue_glCore_glGetActiveUniform@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL1i64NV +.type bluegl_glVertexAttribL1i64NV, %function +bluegl_glVertexAttribL1i64NV: + mov __blue_glCore_glVertexAttribL1i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformMatrix4x3fv -.type bluegl_glProgramUniformMatrix4x3fv, %function -bluegl_glProgramUniformMatrix4x3fv: - mov __blue_glCore_glProgramUniformMatrix4x3fv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL2i64NV +.type bluegl_glVertexAttribL2i64NV, %function +bluegl_glVertexAttribL2i64NV: + mov __blue_glCore_glVertexAttribL2i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreateVertexArrays -.type bluegl_glCreateVertexArrays, %function -bluegl_glCreateVertexArrays: - mov __blue_glCore_glCreateVertexArrays@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL3i64NV +.type bluegl_glVertexAttribL3i64NV, %function +bluegl_glVertexAttribL3i64NV: + mov __blue_glCore_glVertexAttribL3i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3dv -.type bluegl_glWindowPos3dv, %function -bluegl_glWindowPos3dv: - mov __blue_glCore_glWindowPos3dv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL4i64NV +.type bluegl_glVertexAttribL4i64NV, %function +bluegl_glVertexAttribL4i64NV: + mov __blue_glCore_glVertexAttribL4i64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1fARB -.type bluegl_glUniform1fARB, %function -bluegl_glUniform1fARB: - mov __blue_glCore_glUniform1fARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL1i64vNV +.type bluegl_glVertexAttribL1i64vNV, %function +bluegl_glVertexAttribL1i64vNV: + mov __blue_glCore_glVertexAttribL1i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFragmentMaterialiSGIX -.type bluegl_glFragmentMaterialiSGIX, %function -bluegl_glFragmentMaterialiSGIX: - mov __blue_glCore_glFragmentMaterialiSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL2i64vNV +.type bluegl_glVertexAttribL2i64vNV, %function +bluegl_glVertexAttribL2i64vNV: + mov __blue_glCore_glVertexAttribL2i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribArrayObjectfvATI -.type bluegl_glGetVertexAttribArrayObjectfvATI, %function -bluegl_glGetVertexAttribArrayObjectfvATI: - mov __blue_glCore_glGetVertexAttribArrayObjectfvATI@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL3i64vNV +.type bluegl_glVertexAttribL3i64vNV, %function +bluegl_glVertexAttribL3i64vNV: + mov __blue_glCore_glVertexAttribL3i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearAccumxOES -.type bluegl_glClearAccumxOES, %function -bluegl_glClearAccumxOES: - mov __blue_glCore_glClearAccumxOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL4i64vNV +.type bluegl_glVertexAttribL4i64vNV, %function +bluegl_glVertexAttribL4i64vNV: + mov __blue_glCore_glVertexAttribL4i64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindFragDataLocationEXT -.type bluegl_glBindFragDataLocationEXT, %function -bluegl_glBindFragDataLocationEXT: - mov __blue_glCore_glBindFragDataLocationEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL1ui64NV +.type bluegl_glVertexAttribL1ui64NV, %function +bluegl_glVertexAttribL1ui64NV: + mov __blue_glCore_glVertexAttribL1ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4dARB -.type bluegl_glMultiTexCoord4dARB, %function -bluegl_glMultiTexCoord4dARB: - mov __blue_glCore_glMultiTexCoord4dARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL2ui64NV +.type bluegl_glVertexAttribL2ui64NV, %function +bluegl_glVertexAttribL2ui64NV: + mov __blue_glCore_glVertexAttribL2ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glConvolutionParameterfv -.type bluegl_glConvolutionParameterfv, %function -bluegl_glConvolutionParameterfv: - mov __blue_glCore_glConvolutionParameterfv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL3ui64NV +.type bluegl_glVertexAttribL3ui64NV, %function +bluegl_glVertexAttribL3ui64NV: + mov __blue_glCore_glVertexAttribL3ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFragmentColorMaterialSGIX -.type bluegl_glFragmentColorMaterialSGIX, %function -bluegl_glFragmentColorMaterialSGIX: - mov __blue_glCore_glFragmentColorMaterialSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL4ui64NV +.type bluegl_glVertexAttribL4ui64NV, %function +bluegl_glVertexAttribL4ui64NV: + mov __blue_glCore_glVertexAttribL4ui64NV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix3dv -.type bluegl_glUniformMatrix3dv, %function -bluegl_glUniformMatrix3dv: - mov __blue_glCore_glUniformMatrix3dv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL1ui64vNV +.type bluegl_glVertexAttribL1ui64vNV, %function +bluegl_glVertexAttribL1ui64vNV: + mov __blue_glCore_glVertexAttribL1ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnPixelMapusv -.type bluegl_glGetnPixelMapusv, %function -bluegl_glGetnPixelMapusv: - mov __blue_glCore_glGetnPixelMapusv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL2ui64vNV +.type bluegl_glVertexAttribL2ui64vNV, %function +bluegl_glVertexAttribL2ui64vNV: + mov __blue_glCore_glVertexAttribL2ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferTextureLayer -.type bluegl_glFramebufferTextureLayer, %function -bluegl_glFramebufferTextureLayer: - mov __blue_glCore_glFramebufferTextureLayer@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL3ui64vNV +.type bluegl_glVertexAttribL3ui64vNV, %function +bluegl_glVertexAttribL3ui64vNV: + mov __blue_glCore_glVertexAttribL3ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStencilThenCoverStrokePathInstancedNV -.type bluegl_glStencilThenCoverStrokePathInstancedNV, %function -bluegl_glStencilThenCoverStrokePathInstancedNV: - mov __blue_glCore_glStencilThenCoverStrokePathInstancedNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribL4ui64vNV +.type bluegl_glVertexAttribL4ui64vNV, %function +bluegl_glVertexAttribL4ui64vNV: + mov __blue_glCore_glVertexAttribL4ui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVDPAURegisterOutputSurfaceNV -.type bluegl_glVDPAURegisterOutputSurfaceNV, %function -bluegl_glVDPAURegisterOutputSurfaceNV: - mov __blue_glCore_glVDPAURegisterOutputSurfaceNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribLi64vNV +.type bluegl_glGetVertexAttribLi64vNV, %function +bluegl_glGetVertexAttribLi64vNV: + mov __blue_glCore_glGetVertexAttribLi64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4dvARB -.type bluegl_glMultiTexCoord4dvARB, %function -bluegl_glMultiTexCoord4dvARB: - mov __blue_glCore_glMultiTexCoord4dvARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribLui64vNV +.type bluegl_glGetVertexAttribLui64vNV, %function +bluegl_glGetVertexAttribLui64vNV: + mov __blue_glCore_glGetVertexAttribLui64vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyTextureSubImage3D -.type bluegl_glCopyTextureSubImage3D, %function -bluegl_glCopyTextureSubImage3D: - mov __blue_glCore_glCopyTextureSubImage3D@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribLFormatNV +.type bluegl_glVertexAttribLFormatNV, %function +bluegl_glVertexAttribLFormatNV: + mov __blue_glCore_glVertexAttribLFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVariantIntegervEXT -.type bluegl_glGetVariantIntegervEXT, %function -bluegl_glGetVariantIntegervEXT: - mov __blue_glCore_glGetVariantIntegervEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBufferAddressRangeNV +.type bluegl_glBufferAddressRangeNV, %function +bluegl_glBufferAddressRangeNV: + mov __blue_glCore_glBufferAddressRangeNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTexEnvxvOES -.type bluegl_glGetTexEnvxvOES, %function -bluegl_glGetTexEnvxvOES: - mov __blue_glCore_glGetTexEnvxvOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertexFormatNV +.type bluegl_glVertexFormatNV, %function +bluegl_glVertexFormatNV: + mov __blue_glCore_glVertexFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetFloati_vEXT -.type bluegl_glGetFloati_vEXT, %function -bluegl_glGetFloati_vEXT: - mov __blue_glCore_glGetFloati_vEXT@GOTPCREL(%rip), %r11 +.global bluegl_glNormalFormatNV +.type bluegl_glNormalFormatNV, %function +bluegl_glNormalFormatNV: + mov __blue_glCore_glNormalFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glAsyncMarkerSGIX -.type bluegl_glAsyncMarkerSGIX, %function -bluegl_glAsyncMarkerSGIX: - mov __blue_glCore_glAsyncMarkerSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glColorFormatNV +.type bluegl_glColorFormatNV, %function +bluegl_glColorFormatNV: + mov __blue_glCore_glColorFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN -.type bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN, %function -bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN: - mov __blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glIndexFormatNV +.type bluegl_glIndexFormatNV, %function +bluegl_glIndexFormatNV: + mov __blue_glCore_glIndexFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexRenderbufferNV -.type bluegl_glTexRenderbufferNV, %function -bluegl_glTexRenderbufferNV: - mov __blue_glCore_glTexRenderbufferNV@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoordFormatNV +.type bluegl_glTexCoordFormatNV, %function +bluegl_glTexCoordFormatNV: + mov __blue_glCore_glTexCoordFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetConvolutionParameterfvEXT -.type bluegl_glGetConvolutionParameterfvEXT, %function -bluegl_glGetConvolutionParameterfvEXT: - mov __blue_glCore_glGetConvolutionParameterfvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glEdgeFlagFormatNV +.type bluegl_glEdgeFlagFormatNV, %function +bluegl_glEdgeFlagFormatNV: + mov __blue_glCore_glEdgeFlagFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLightxvOES -.type bluegl_glLightxvOES, %function -bluegl_glLightxvOES: - mov __blue_glCore_glLightxvOES@GOTPCREL(%rip), %r11 +.global bluegl_glSecondaryColorFormatNV +.type bluegl_glSecondaryColorFormatNV, %function +bluegl_glSecondaryColorFormatNV: + mov __blue_glCore_glSecondaryColorFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteNamedStringARB -.type bluegl_glDeleteNamedStringARB, %function -bluegl_glDeleteNamedStringARB: - mov __blue_glCore_glDeleteNamedStringARB@GOTPCREL(%rip), %r11 +.global bluegl_glFogCoordFormatNV +.type bluegl_glFogCoordFormatNV, %function +bluegl_glFogCoordFormatNV: + mov __blue_glCore_glFogCoordFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColor3hvNV -.type bluegl_glColor3hvNV, %function -bluegl_glColor3hvNV: - mov __blue_glCore_glColor3hvNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribFormatNV +.type bluegl_glVertexAttribFormatNV, %function +bluegl_glVertexAttribFormatNV: + mov __blue_glCore_glVertexAttribFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix4dv -.type bluegl_glUniformMatrix4dv, %function -bluegl_glUniformMatrix4dv: - mov __blue_glCore_glUniformMatrix4dv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribIFormatNV +.type bluegl_glVertexAttribIFormatNV, %function +bluegl_glVertexAttribIFormatNV: + mov __blue_glCore_glVertexAttribIFormatNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTexImage2DARB -.type bluegl_glCompressedTexImage2DARB, %function -bluegl_glCompressedTexImage2DARB: - mov __blue_glCore_glCompressedTexImage2DARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetIntegerui64i_vNV +.type bluegl_glGetIntegerui64i_vNV, %function +bluegl_glGetIntegerui64i_vNV: + mov __blue_glCore_glGetIntegerui64i_vNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenTexturesEXT -.type bluegl_glGenTexturesEXT, %function -bluegl_glGenTexturesEXT: - mov __blue_glCore_glGenTexturesEXT@GOTPCREL(%rip), %r11 +.global bluegl_glAreProgramsResidentNV +.type bluegl_glAreProgramsResidentNV, %function +bluegl_glAreProgramsResidentNV: + mov __blue_glCore_glAreProgramsResidentNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathMemoryGlyphIndexArrayNV -.type bluegl_glPathMemoryGlyphIndexArrayNV, %function -bluegl_glPathMemoryGlyphIndexArrayNV: - mov __blue_glCore_glPathMemoryGlyphIndexArrayNV@GOTPCREL(%rip), %r11 +.global bluegl_glBindProgramNV +.type bluegl_glBindProgramNV, %function +bluegl_glBindProgramNV: + mov __blue_glCore_glBindProgramNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetBufferSubDataARB -.type bluegl_glGetBufferSubDataARB, %function -bluegl_glGetBufferSubDataARB: - mov __blue_glCore_glGetBufferSubDataARB@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteProgramsNV +.type bluegl_glDeleteProgramsNV, %function +bluegl_glDeleteProgramsNV: + mov __blue_glCore_glDeleteProgramsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFinishObjectAPPLE -.type bluegl_glFinishObjectAPPLE, %function -bluegl_glFinishObjectAPPLE: - mov __blue_glCore_glFinishObjectAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glExecuteProgramNV +.type bluegl_glExecuteProgramNV, %function +bluegl_glExecuteProgramNV: + mov __blue_glCore_glExecuteProgramNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDetachShader -.type bluegl_glDetachShader, %function -bluegl_glDetachShader: - mov __blue_glCore_glDetachShader@GOTPCREL(%rip), %r11 +.global bluegl_glGenProgramsNV +.type bluegl_glGenProgramsNV, %function +bluegl_glGenProgramsNV: + mov __blue_glCore_glGenProgramsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindTexture -.type bluegl_glBindTexture, %function -bluegl_glBindTexture: - mov __blue_glCore_glBindTexture@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramParameterdvNV +.type bluegl_glGetProgramParameterdvNV, %function +bluegl_glGetProgramParameterdvNV: + mov __blue_glCore_glGetProgramParameterdvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramResourcefvNV -.type bluegl_glGetProgramResourcefvNV, %function -bluegl_glGetProgramResourcefvNV: - mov __blue_glCore_glGetProgramResourcefvNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramParameterfvNV +.type bluegl_glGetProgramParameterfvNV, %function +bluegl_glGetProgramParameterfvNV: + mov __blue_glCore_glGetProgramParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord2fColor4ubVertex3fvSUN -.type bluegl_glTexCoord2fColor4ubVertex3fvSUN, %function -bluegl_glTexCoord2fColor4ubVertex3fvSUN: - mov __blue_glCore_glTexCoord2fColor4ubVertex3fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramivNV +.type bluegl_glGetProgramivNV, %function +bluegl_glGetProgramivNV: + mov __blue_glCore_glGetProgramivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4dv -.type bluegl_glMultiTexCoord4dv, %function -bluegl_glMultiTexCoord4dv: - mov __blue_glCore_glMultiTexCoord4dv@GOTPCREL(%rip), %r11 +.global bluegl_glGetProgramStringNV +.type bluegl_glGetProgramStringNV, %function +bluegl_glGetProgramStringNV: + mov __blue_glCore_glGetProgramStringNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsPointInFillPathNV -.type bluegl_glIsPointInFillPathNV, %function -bluegl_glIsPointInFillPathNV: - mov __blue_glCore_glIsPointInFillPathNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetTrackMatrixivNV +.type bluegl_glGetTrackMatrixivNV, %function +bluegl_glGetTrackMatrixivNV: + mov __blue_glCore_glGetTrackMatrixivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawTransformFeedbackInstanced -.type bluegl_glDrawTransformFeedbackInstanced, %function -bluegl_glDrawTransformFeedbackInstanced: - mov __blue_glCore_glDrawTransformFeedbackInstanced@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribdvNV +.type bluegl_glGetVertexAttribdvNV, %function +bluegl_glGetVertexAttribdvNV: + mov __blue_glCore_glGetVertexAttribdvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramParameteriARB -.type bluegl_glProgramParameteriARB, %function -bluegl_glProgramParameteriARB: - mov __blue_glCore_glProgramParameteriARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribfvNV +.type bluegl_glGetVertexAttribfvNV, %function +bluegl_glGetVertexAttribfvNV: + mov __blue_glCore_glGetVertexAttribfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3fvNV -.type bluegl_glVertexAttrib3fvNV, %function -bluegl_glVertexAttrib3fvNV: - mov __blue_glCore_glVertexAttrib3fvNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribivNV +.type bluegl_glGetVertexAttribivNV, %function +bluegl_glGetVertexAttribivNV: + mov __blue_glCore_glGetVertexAttribivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEnableVertexArrayAttrib -.type bluegl_glEnableVertexArrayAttrib, %function -bluegl_glEnableVertexArrayAttrib: - mov __blue_glCore_glEnableVertexArrayAttrib@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribPointervNV +.type bluegl_glGetVertexAttribPointervNV, %function +bluegl_glGetVertexAttribPointervNV: + mov __blue_glCore_glGetVertexAttribPointervNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3ui64vNV -.type bluegl_glUniform3ui64vNV, %function -bluegl_glUniform3ui64vNV: - mov __blue_glCore_glUniform3ui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glIsProgramNV +.type bluegl_glIsProgramNV, %function +bluegl_glIsProgramNV: + mov __blue_glCore_glIsProgramNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribs4fvNV -.type bluegl_glVertexAttribs4fvNV, %function -bluegl_glVertexAttribs4fvNV: - mov __blue_glCore_glVertexAttribs4fvNV@GOTPCREL(%rip), %r11 +.global bluegl_glLoadProgramNV +.type bluegl_glLoadProgramNV, %function +bluegl_glLoadProgramNV: + mov __blue_glCore_glLoadProgramNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetCompressedTextureImageEXT -.type bluegl_glGetCompressedTextureImageEXT, %function -bluegl_glGetCompressedTextureImageEXT: - mov __blue_glCore_glGetCompressedTextureImageEXT@GOTPCREL(%rip), %r11 +.global bluegl_glProgramParameter4dNV +.type bluegl_glProgramParameter4dNV, %function +bluegl_glProgramParameter4dNV: + mov __blue_glCore_glProgramParameter4dNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertex3bOES -.type bluegl_glVertex3bOES, %function -bluegl_glVertex3bOES: - mov __blue_glCore_glVertex3bOES@GOTPCREL(%rip), %r11 +.global bluegl_glProgramParameter4dvNV +.type bluegl_glProgramParameter4dvNV, %function +bluegl_glProgramParameter4dvNV: + mov __blue_glCore_glProgramParameter4dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramLocalParameterI4ivNV -.type bluegl_glProgramLocalParameterI4ivNV, %function -bluegl_glProgramLocalParameterI4ivNV: - mov __blue_glCore_glProgramLocalParameterI4ivNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramParameter4fNV +.type bluegl_glProgramParameter4fNV, %function +bluegl_glProgramParameter4fNV: + mov __blue_glCore_glProgramParameter4fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2fMESA -.type bluegl_glWindowPos2fMESA, %function -bluegl_glWindowPos2fMESA: - mov __blue_glCore_glWindowPos2fMESA@GOTPCREL(%rip), %r11 +.global bluegl_glProgramParameter4fvNV +.type bluegl_glProgramParameter4fvNV, %function +bluegl_glProgramParameter4fvNV: + mov __blue_glCore_glProgramParameter4fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWeightusvARB -.type bluegl_glWeightusvARB, %function -bluegl_glWeightusvARB: - mov __blue_glCore_glWeightusvARB@GOTPCREL(%rip), %r11 +.global bluegl_glProgramParameters4dvNV +.type bluegl_glProgramParameters4dvNV, %function +bluegl_glProgramParameters4dvNV: + mov __blue_glCore_glProgramParameters4dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenOcclusionQueriesNV -.type bluegl_glGenOcclusionQueriesNV, %function -bluegl_glGenOcclusionQueriesNV: - mov __blue_glCore_glGenOcclusionQueriesNV@GOTPCREL(%rip), %r11 +.global bluegl_glProgramParameters4fvNV +.type bluegl_glProgramParameters4fvNV, %function +bluegl_glProgramParameters4fvNV: + mov __blue_glCore_glProgramParameters4fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoordPointervINTEL -.type bluegl_glTexCoordPointervINTEL, %function -bluegl_glTexCoordPointervINTEL: - mov __blue_glCore_glTexCoordPointervINTEL@GOTPCREL(%rip), %r11 +.global bluegl_glRequestResidentProgramsNV +.type bluegl_glRequestResidentProgramsNV, %function +bluegl_glRequestResidentProgramsNV: + mov __blue_glCore_glRequestResidentProgramsNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureParameterIivEXT -.type bluegl_glGetTextureParameterIivEXT, %function -bluegl_glGetTextureParameterIivEXT: - mov __blue_glCore_glGetTextureParameterIivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTrackMatrixNV +.type bluegl_glTrackMatrixNV, %function +bluegl_glTrackMatrixNV: + mov __blue_glCore_glTrackMatrixNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteStatesNV -.type bluegl_glDeleteStatesNV, %function -bluegl_glDeleteStatesNV: - mov __blue_glCore_glDeleteStatesNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribPointerNV +.type bluegl_glVertexAttribPointerNV, %function +bluegl_glVertexAttribPointerNV: + mov __blue_glCore_glVertexAttribPointerNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramLocalParameter4fvARB -.type bluegl_glProgramLocalParameter4fvARB, %function -bluegl_glProgramLocalParameter4fvARB: - mov __blue_glCore_glProgramLocalParameter4fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1dNV +.type bluegl_glVertexAttrib1dNV, %function +bluegl_glVertexAttrib1dNV: + mov __blue_glCore_glVertexAttrib1dNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCoverFillPathInstancedNV -.type bluegl_glCoverFillPathInstancedNV, %function -bluegl_glCoverFillPathInstancedNV: - mov __blue_glCore_glCoverFillPathInstancedNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1dvNV +.type bluegl_glVertexAttrib1dvNV, %function +bluegl_glVertexAttrib1dvNV: + mov __blue_glCore_glVertexAttrib1dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBeginConditionalRenderNVX -.type bluegl_glBeginConditionalRenderNVX, %function -bluegl_glBeginConditionalRenderNVX: - mov __blue_glCore_glBeginConditionalRenderNVX@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1fNV +.type bluegl_glVertexAttrib1fNV, %function +bluegl_glVertexAttrib1fNV: + mov __blue_glCore_glVertexAttrib1fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathDashArrayNV -.type bluegl_glPathDashArrayNV, %function -bluegl_glPathDashArrayNV: - mov __blue_glCore_glPathDashArrayNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1fvNV +.type bluegl_glVertexAttrib1fvNV, %function +bluegl_glVertexAttrib1fvNV: + mov __blue_glCore_glVertexAttrib1fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSpriteParameteriSGIX -.type bluegl_glSpriteParameteriSGIX, %function -bluegl_glSpriteParameteriSGIX: - mov __blue_glCore_glSpriteParameteriSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1sNV +.type bluegl_glVertexAttrib1sNV, %function +bluegl_glVertexAttrib1sNV: + mov __blue_glCore_glVertexAttrib1sNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedProgramStringEXT -.type bluegl_glGetNamedProgramStringEXT, %function -bluegl_glGetNamedProgramStringEXT: - mov __blue_glCore_glGetNamedProgramStringEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib1svNV +.type bluegl_glVertexAttrib1svNV, %function +bluegl_glVertexAttrib1svNV: + mov __blue_glCore_glVertexAttrib1svNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCombinerParameterfvNV -.type bluegl_glCombinerParameterfvNV, %function -bluegl_glCombinerParameterfvNV: - mov __blue_glCore_glCombinerParameterfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2dNV +.type bluegl_glVertexAttrib2dNV, %function +bluegl_glVertexAttrib2dNV: + mov __blue_glCore_glVertexAttrib2dNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexParameterxvOES -.type bluegl_glTexParameterxvOES, %function -bluegl_glTexParameterxvOES: - mov __blue_glCore_glTexParameterxvOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2dvNV +.type bluegl_glVertexAttrib2dvNV, %function +bluegl_glVertexAttrib2dvNV: + mov __blue_glCore_glVertexAttrib2dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayVertexAttribDivisorEXT -.type bluegl_glVertexArrayVertexAttribDivisorEXT, %function -bluegl_glVertexArrayVertexAttribDivisorEXT: - mov __blue_glCore_glVertexArrayVertexAttribDivisorEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2fNV +.type bluegl_glVertexAttrib2fNV, %function +bluegl_glVertexAttrib2fNV: + mov __blue_glCore_glVertexAttrib2fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramSubroutineParametersuivNV -.type bluegl_glProgramSubroutineParametersuivNV, %function -bluegl_glProgramSubroutineParametersuivNV: - mov __blue_glCore_glProgramSubroutineParametersuivNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2fvNV +.type bluegl_glVertexAttrib2fvNV, %function +bluegl_glVertexAttrib2fvNV: + mov __blue_glCore_glVertexAttrib2fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteObjectARB -.type bluegl_glDeleteObjectARB, %function -bluegl_glDeleteObjectARB: - mov __blue_glCore_glDeleteObjectARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2sNV +.type bluegl_glVertexAttrib2sNV, %function +bluegl_glVertexAttrib2sNV: + mov __blue_glCore_glVertexAttrib2sNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform1i64ARB -.type bluegl_glProgramUniform1i64ARB, %function -bluegl_glProgramUniform1i64ARB: - mov __blue_glCore_glProgramUniform1i64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib2svNV +.type bluegl_glVertexAttrib2svNV, %function +bluegl_glVertexAttrib2svNV: + mov __blue_glCore_glVertexAttrib2svNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferTextureARB -.type bluegl_glFramebufferTextureARB, %function -bluegl_glFramebufferTextureARB: - mov __blue_glCore_glFramebufferTextureARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3dNV +.type bluegl_glVertexAttrib3dNV, %function +bluegl_glVertexAttrib3dNV: + mov __blue_glCore_glVertexAttrib3dNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glElementPointerATI -.type bluegl_glElementPointerATI, %function -bluegl_glElementPointerATI: - mov __blue_glCore_glElementPointerATI@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3dvNV +.type bluegl_glVertexAttrib3dvNV, %function +bluegl_glVertexAttrib3dvNV: + mov __blue_glCore_glVertexAttrib3dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform2i64vARB -.type bluegl_glUniform2i64vARB, %function -bluegl_glUniform2i64vARB: - mov __blue_glCore_glUniform2i64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3fNV +.type bluegl_glVertexAttrib3fNV, %function +bluegl_glVertexAttrib3fNV: + mov __blue_glCore_glVertexAttrib3fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetBooleanIndexedvEXT -.type bluegl_glGetBooleanIndexedvEXT, %function -bluegl_glGetBooleanIndexedvEXT: - mov __blue_glCore_glGetBooleanIndexedvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3fvNV +.type bluegl_glVertexAttrib3fvNV, %function +bluegl_glVertexAttrib3fvNV: + mov __blue_glCore_glVertexAttrib3fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribP1uiv -.type bluegl_glVertexAttribP1uiv, %function -bluegl_glVertexAttribP1uiv: - mov __blue_glCore_glVertexAttribP1uiv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3sNV +.type bluegl_glVertexAttrib3sNV, %function +bluegl_glVertexAttrib3sNV: + mov __blue_glCore_glVertexAttrib3sNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetDoubleIndexedvEXT -.type bluegl_glGetDoubleIndexedvEXT, %function -bluegl_glGetDoubleIndexedvEXT: - mov __blue_glCore_glGetDoubleIndexedvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib3svNV +.type bluegl_glVertexAttrib3svNV, %function +bluegl_glVertexAttrib3svNV: + mov __blue_glCore_glVertexAttrib3svNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetUniformiv -.type bluegl_glGetUniformiv, %function -bluegl_glGetUniformiv: - mov __blue_glCore_glGetUniformiv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4dNV +.type bluegl_glVertexAttrib4dNV, %function +bluegl_glVertexAttrib4dNV: + mov __blue_glCore_glVertexAttrib4dNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribArrayObjectATI -.type bluegl_glVertexAttribArrayObjectATI, %function -bluegl_glVertexAttribArrayObjectATI: - mov __blue_glCore_glVertexAttribArrayObjectATI@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4dvNV +.type bluegl_glVertexAttrib4dvNV, %function +bluegl_glVertexAttrib4dvNV: + mov __blue_glCore_glVertexAttrib4dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBufferSubDataARB -.type bluegl_glBufferSubDataARB, %function -bluegl_glBufferSubDataARB: - mov __blue_glCore_glBufferSubDataARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4fNV +.type bluegl_glVertexAttrib4fNV, %function +bluegl_glVertexAttrib4fNV: + mov __blue_glCore_glVertexAttrib4fNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2fARB -.type bluegl_glWindowPos2fARB, %function -bluegl_glWindowPos2fARB: - mov __blue_glCore_glWindowPos2fARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4fvNV +.type bluegl_glVertexAttrib4fvNV, %function +bluegl_glVertexAttrib4fvNV: + mov __blue_glCore_glVertexAttrib4fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord2bvOES -.type bluegl_glMultiTexCoord2bvOES, %function -bluegl_glMultiTexCoord2bvOES: - mov __blue_glCore_glMultiTexCoord2bvOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4sNV +.type bluegl_glVertexAttrib4sNV, %function +bluegl_glVertexAttrib4sNV: + mov __blue_glCore_glVertexAttrib4sNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform2i64vARB -.type bluegl_glProgramUniform2i64vARB, %function -bluegl_glProgramUniform2i64vARB: - mov __blue_glCore_glProgramUniform2i64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4svNV +.type bluegl_glVertexAttrib4svNV, %function +bluegl_glVertexAttrib4svNV: + mov __blue_glCore_glVertexAttrib4svNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexEnvxOES -.type bluegl_glTexEnvxOES, %function -bluegl_glTexEnvxOES: - mov __blue_glCore_glTexEnvxOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4ubNV +.type bluegl_glVertexAttrib4ubNV, %function +bluegl_glVertexAttrib4ubNV: + mov __blue_glCore_glVertexAttrib4ubNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStencilOpValueAMD -.type bluegl_glStencilOpValueAMD, %function -bluegl_glStencilOpValueAMD: - mov __blue_glCore_glStencilOpValueAMD@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttrib4ubvNV +.type bluegl_glVertexAttrib4ubvNV, %function +bluegl_glVertexAttrib4ubvNV: + mov __blue_glCore_glVertexAttrib4ubvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4ui64vARB -.type bluegl_glUniform4ui64vARB, %function -bluegl_glUniform4ui64vARB: - mov __blue_glCore_glUniform4ui64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribs1dvNV +.type bluegl_glVertexAttribs1dvNV, %function +bluegl_glVertexAttribs1dvNV: + mov __blue_glCore_glVertexAttribs1dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTangent3iEXT -.type bluegl_glTangent3iEXT, %function -bluegl_glTangent3iEXT: - mov __blue_glCore_glTangent3iEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribs1fvNV +.type bluegl_glVertexAttribs1fvNV, %function +bluegl_glVertexAttribs1fvNV: + mov __blue_glCore_glVertexAttribs1fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexAttribLdvEXT -.type bluegl_glGetVertexAttribLdvEXT, %function -bluegl_glGetVertexAttribLdvEXT: - mov __blue_glCore_glGetVertexAttribLdvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribs1svNV +.type bluegl_glVertexAttribs1svNV, %function +bluegl_glVertexAttribs1svNV: + mov __blue_glCore_glVertexAttribs1svNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetCoverageModulationTableNV -.type bluegl_glGetCoverageModulationTableNV, %function -bluegl_glGetCoverageModulationTableNV: - mov __blue_glCore_glGetCoverageModulationTableNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribs2dvNV +.type bluegl_glVertexAttribs2dvNV, %function +bluegl_glVertexAttribs2dvNV: + mov __blue_glCore_glVertexAttribs2dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexWeighthvNV -.type bluegl_glVertexWeighthvNV, %function -bluegl_glVertexWeighthvNV: - mov __blue_glCore_glVertexWeighthvNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribs2fvNV +.type bluegl_glVertexAttribs2fvNV, %function +bluegl_glVertexAttribs2fvNV: + mov __blue_glCore_glVertexAttribs2fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3iARB -.type bluegl_glWindowPos3iARB, %function -bluegl_glWindowPos3iARB: - mov __blue_glCore_glWindowPos3iARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribs2svNV +.type bluegl_glVertexAttribs2svNV, %function +bluegl_glVertexAttribs2svNV: + mov __blue_glCore_glVertexAttribs2svNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI1iv -.type bluegl_glVertexAttribI1iv, %function -bluegl_glVertexAttribI1iv: - mov __blue_glCore_glVertexAttribI1iv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribs3dvNV +.type bluegl_glVertexAttribs3dvNV, %function +bluegl_glVertexAttribs3dvNV: + mov __blue_glCore_glVertexAttribs3dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3fv -.type bluegl_glWindowPos3fv, %function -bluegl_glWindowPos3fv: - mov __blue_glCore_glWindowPos3fv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribs3fvNV +.type bluegl_glVertexAttribs3fvNV, %function +bluegl_glVertexAttribs3fvNV: + mov __blue_glCore_glVertexAttribs3fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream4ivATI -.type bluegl_glVertexStream4ivATI, %function -bluegl_glVertexStream4ivATI: - mov __blue_glCore_glVertexStream4ivATI@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribs3svNV +.type bluegl_glVertexAttribs3svNV, %function +bluegl_glVertexAttribs3svNV: + mov __blue_glCore_glVertexAttribs3svNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureImage3DMultisampleCoverageNV -.type bluegl_glTextureImage3DMultisampleCoverageNV, %function -bluegl_glTextureImage3DMultisampleCoverageNV: - mov __blue_glCore_glTextureImage3DMultisampleCoverageNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribs4dvNV +.type bluegl_glVertexAttribs4dvNV, %function +bluegl_glVertexAttribs4dvNV: + mov __blue_glCore_glVertexAttribs4dvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform3f -.type bluegl_glUniform3f, %function -bluegl_glUniform3f: - mov __blue_glCore_glUniform3f@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribs4fvNV +.type bluegl_glVertexAttribs4fvNV, %function +bluegl_glVertexAttribs4fvNV: + mov __blue_glCore_glVertexAttribs4fvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glAccumxOES -.type bluegl_glAccumxOES, %function -bluegl_glAccumxOES: - mov __blue_glCore_glAccumxOES@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribs4svNV +.type bluegl_glVertexAttribs4svNV, %function +bluegl_glVertexAttribs4svNV: + mov __blue_glCore_glVertexAttribs4svNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexStorage3D -.type bluegl_glTexStorage3D, %function -bluegl_glTexStorage3D: - mov __blue_glCore_glTexStorage3D@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribs4ubvNV +.type bluegl_glVertexAttribs4ubvNV, %function +bluegl_glVertexAttribs4ubvNV: + mov __blue_glCore_glVertexAttribs4ubvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawArrays -.type bluegl_glDrawArrays, %function -bluegl_glDrawArrays: - mov __blue_glCore_glDrawArrays@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI1iEXT +.type bluegl_glVertexAttribI1iEXT, %function +bluegl_glVertexAttribI1iEXT: + mov __blue_glCore_glVertexAttribI1iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSamplePatternEXT -.type bluegl_glSamplePatternEXT, %function -bluegl_glSamplePatternEXT: - mov __blue_glCore_glSamplePatternEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI2iEXT +.type bluegl_glVertexAttribI2iEXT, %function +bluegl_glVertexAttribI2iEXT: + mov __blue_glCore_glVertexAttribI2iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormalPointervINTEL -.type bluegl_glNormalPointervINTEL, %function -bluegl_glNormalPointervINTEL: - mov __blue_glCore_glNormalPointervINTEL@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI3iEXT +.type bluegl_glVertexAttribI3iEXT, %function +bluegl_glVertexAttribI3iEXT: + mov __blue_glCore_glVertexAttribI3iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWeightubvARB -.type bluegl_glWeightubvARB, %function -bluegl_glWeightubvARB: - mov __blue_glCore_glWeightubvARB@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI4iEXT +.type bluegl_glVertexAttribI4iEXT, %function +bluegl_glVertexAttribI4iEXT: + mov __blue_glCore_glVertexAttribI4iEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenProgramsNV -.type bluegl_glGenProgramsNV, %function -bluegl_glGenProgramsNV: - mov __blue_glCore_glGenProgramsNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI1uiEXT +.type bluegl_glVertexAttribI1uiEXT, %function +bluegl_glVertexAttribI1uiEXT: + mov __blue_glCore_glVertexAttribI1uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDepthRangef -.type bluegl_glDepthRangef, %function -bluegl_glDepthRangef: - mov __blue_glCore_glDepthRangef@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI2uiEXT +.type bluegl_glVertexAttribI2uiEXT, %function +bluegl_glVertexAttribI2uiEXT: + mov __blue_glCore_glVertexAttribI2uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramParameterdvNV -.type bluegl_glGetProgramParameterdvNV, %function -bluegl_glGetProgramParameterdvNV: - mov __blue_glCore_glGetProgramParameterdvNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI3uiEXT +.type bluegl_glVertexAttribI3uiEXT, %function +bluegl_glVertexAttribI3uiEXT: + mov __blue_glCore_glVertexAttribI3uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPollInstrumentsSGIX -.type bluegl_glPollInstrumentsSGIX, %function -bluegl_glPollInstrumentsSGIX: - mov __blue_glCore_glPollInstrumentsSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI4uiEXT +.type bluegl_glVertexAttribI4uiEXT, %function +bluegl_glVertexAttribI4uiEXT: + mov __blue_glCore_glVertexAttribI4uiEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1hNV -.type bluegl_glMultiTexCoord1hNV, %function -bluegl_glMultiTexCoord1hNV: - mov __blue_glCore_glMultiTexCoord1hNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI1ivEXT +.type bluegl_glVertexAttribI1ivEXT, %function +bluegl_glVertexAttribI1ivEXT: + mov __blue_glCore_glVertexAttribI1ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3s -.type bluegl_glSecondaryColor3s, %function -bluegl_glSecondaryColor3s: - mov __blue_glCore_glSecondaryColor3s@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI2ivEXT +.type bluegl_glVertexAttribI2ivEXT, %function +bluegl_glVertexAttribI2ivEXT: + mov __blue_glCore_glVertexAttribI2ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoordP1uiv -.type bluegl_glTexCoordP1uiv, %function -bluegl_glTexCoordP1uiv: - mov __blue_glCore_glTexCoordP1uiv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI3ivEXT +.type bluegl_glVertexAttribI3ivEXT, %function +bluegl_glVertexAttribI3ivEXT: + mov __blue_glCore_glVertexAttribI3ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glStopInstrumentsSGIX -.type bluegl_glStopInstrumentsSGIX, %function -bluegl_glStopInstrumentsSGIX: - mov __blue_glCore_glStopInstrumentsSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI4ivEXT +.type bluegl_glVertexAttribI4ivEXT, %function +bluegl_glVertexAttribI4ivEXT: + mov __blue_glCore_glVertexAttribI4ivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glActiveTexture -.type bluegl_glActiveTexture, %function -bluegl_glActiveTexture: - mov __blue_glCore_glActiveTexture@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI1uivEXT +.type bluegl_glVertexAttribI1uivEXT, %function +bluegl_glVertexAttribI1uivEXT: + mov __blue_glCore_glVertexAttribI1uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribs2svNV -.type bluegl_glVertexAttribs2svNV, %function -bluegl_glVertexAttribs2svNV: - mov __blue_glCore_glVertexAttribs2svNV@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI2uivEXT +.type bluegl_glVertexAttribI2uivEXT, %function +bluegl_glVertexAttribI2uivEXT: + mov __blue_glCore_glVertexAttribI2uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetActiveAtomicCounterBufferiv -.type bluegl_glGetActiveAtomicCounterBufferiv, %function -bluegl_glGetActiveAtomicCounterBufferiv: - mov __blue_glCore_glGetActiveAtomicCounterBufferiv@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI3uivEXT +.type bluegl_glVertexAttribI3uivEXT, %function +bluegl_glVertexAttribI3uivEXT: + mov __blue_glCore_glVertexAttribI3uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEndConditionalRenderNVX -.type bluegl_glEndConditionalRenderNVX, %function -bluegl_glEndConditionalRenderNVX: - mov __blue_glCore_glEndConditionalRenderNVX@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI4uivEXT +.type bluegl_glVertexAttribI4uivEXT, %function +bluegl_glVertexAttribI4uivEXT: + mov __blue_glCore_glVertexAttribI4uivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawRangeElementArrayATI -.type bluegl_glDrawRangeElementArrayATI, %function -bluegl_glDrawRangeElementArrayATI: - mov __blue_glCore_glDrawRangeElementArrayATI@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI4bvEXT +.type bluegl_glVertexAttribI4bvEXT, %function +bluegl_glVertexAttribI4bvEXT: + mov __blue_glCore_glVertexAttribI4bvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyMultiTexImage1DEXT -.type bluegl_glCopyMultiTexImage1DEXT, %function -bluegl_glCopyMultiTexImage1DEXT: - mov __blue_glCore_glCopyMultiTexImage1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI4svEXT +.type bluegl_glVertexAttribI4svEXT, %function +bluegl_glVertexAttribI4svEXT: + mov __blue_glCore_glVertexAttribI4svEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeusSUN -.type bluegl_glReplacementCodeusSUN, %function -bluegl_glReplacementCodeusSUN: - mov __blue_glCore_glReplacementCodeusSUN@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI4ubvEXT +.type bluegl_glVertexAttribI4ubvEXT, %function +bluegl_glVertexAttribI4ubvEXT: + mov __blue_glCore_glVertexAttribI4ubvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexGendEXT -.type bluegl_glMultiTexGendEXT, %function -bluegl_glMultiTexGendEXT: - mov __blue_glCore_glMultiTexGendEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribI4usvEXT +.type bluegl_glVertexAttribI4usvEXT, %function +bluegl_glVertexAttribI4usvEXT: + mov __blue_glCore_glVertexAttribI4usvEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixRotatefEXT -.type bluegl_glMatrixRotatefEXT, %function -bluegl_glMatrixRotatefEXT: - mov __blue_glCore_glMatrixRotatefEXT@GOTPCREL(%rip), %r11 +.global bluegl_glVertexAttribIPointerEXT +.type bluegl_glVertexAttribIPointerEXT, %function +bluegl_glVertexAttribIPointerEXT: + mov __blue_glCore_glVertexAttribIPointerEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindBufferOffsetNV -.type bluegl_glBindBufferOffsetNV, %function -bluegl_glBindBufferOffsetNV: - mov __blue_glCore_glBindBufferOffsetNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribIivEXT +.type bluegl_glGetVertexAttribIivEXT, %function +bluegl_glGetVertexAttribIivEXT: + mov __blue_glCore_glGetVertexAttribIivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI1ui -.type bluegl_glVertexAttribI1ui, %function -bluegl_glVertexAttribI1ui: - mov __blue_glCore_glVertexAttribI1ui@GOTPCREL(%rip), %r11 +.global bluegl_glGetVertexAttribIuivEXT +.type bluegl_glGetVertexAttribIuivEXT, %function +bluegl_glGetVertexAttribIuivEXT: + mov __blue_glCore_glGetVertexAttribIuivEXT@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMakeImageHandleNonResidentARB -.type bluegl_glMakeImageHandleNonResidentARB, %function -bluegl_glMakeImageHandleNonResidentARB: - mov __blue_glCore_glMakeImageHandleNonResidentARB@GOTPCREL(%rip), %r11 +.global bluegl_glBeginVideoCaptureNV +.type bluegl_glBeginVideoCaptureNV, %function +bluegl_glBeginVideoCaptureNV: + mov __blue_glCore_glBeginVideoCaptureNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureParameteriEXT -.type bluegl_glTextureParameteriEXT, %function -bluegl_glTextureParameteriEXT: - mov __blue_glCore_glTextureParameteriEXT@GOTPCREL(%rip), %r11 +.global bluegl_glBindVideoCaptureStreamBufferNV +.type bluegl_glBindVideoCaptureStreamBufferNV, %function +bluegl_glBindVideoCaptureStreamBufferNV: + mov __blue_glCore_glBindVideoCaptureStreamBufferNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDebugMessageInsertARB -.type bluegl_glDebugMessageInsertARB, %function -bluegl_glDebugMessageInsertARB: - mov __blue_glCore_glDebugMessageInsertARB@GOTPCREL(%rip), %r11 +.global bluegl_glBindVideoCaptureStreamTextureNV +.type bluegl_glBindVideoCaptureStreamTextureNV, %function +bluegl_glBindVideoCaptureStreamTextureNV: + mov __blue_glCore_glBindVideoCaptureStreamTextureNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4NubvARB -.type bluegl_glVertexAttrib4NubvARB, %function -bluegl_glVertexAttrib4NubvARB: - mov __blue_glCore_glVertexAttrib4NubvARB@GOTPCREL(%rip), %r11 +.global bluegl_glEndVideoCaptureNV +.type bluegl_glEndVideoCaptureNV, %function +bluegl_glEndVideoCaptureNV: + mov __blue_glCore_glEndVideoCaptureNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteTexturesEXT -.type bluegl_glDeleteTexturesEXT, %function -bluegl_glDeleteTexturesEXT: - mov __blue_glCore_glDeleteTexturesEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetVideoCaptureivNV +.type bluegl_glGetVideoCaptureivNV, %function +bluegl_glGetVideoCaptureivNV: + mov __blue_glCore_glGetVideoCaptureivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3svARB -.type bluegl_glWindowPos3svARB, %function -bluegl_glWindowPos3svARB: - mov __blue_glCore_glWindowPos3svARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetVideoCaptureStreamivNV +.type bluegl_glGetVideoCaptureStreamivNV, %function +bluegl_glGetVideoCaptureStreamivNV: + mov __blue_glCore_glGetVideoCaptureStreamivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexParameterxOES -.type bluegl_glTexParameterxOES, %function -bluegl_glTexParameterxOES: - mov __blue_glCore_glTexParameterxOES@GOTPCREL(%rip), %r11 +.global bluegl_glGetVideoCaptureStreamfvNV +.type bluegl_glGetVideoCaptureStreamfvNV, %function +bluegl_glGetVideoCaptureStreamfvNV: + mov __blue_glCore_glGetVideoCaptureStreamfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream3fATI -.type bluegl_glVertexStream3fATI, %function -bluegl_glVertexStream3fATI: - mov __blue_glCore_glVertexStream3fATI@GOTPCREL(%rip), %r11 +.global bluegl_glGetVideoCaptureStreamdvNV +.type bluegl_glGetVideoCaptureStreamdvNV, %function +bluegl_glGetVideoCaptureStreamdvNV: + mov __blue_glCore_glGetVideoCaptureStreamdvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNormal3xOES -.type bluegl_glNormal3xOES, %function -bluegl_glNormal3xOES: - mov __blue_glCore_glNormal3xOES@GOTPCREL(%rip), %r11 +.global bluegl_glVideoCaptureNV +.type bluegl_glVideoCaptureNV, %function +bluegl_glVideoCaptureNV: + mov __blue_glCore_glVideoCaptureNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4bvOES -.type bluegl_glMultiTexCoord4bvOES, %function -bluegl_glMultiTexCoord4bvOES: - mov __blue_glCore_glMultiTexCoord4bvOES@GOTPCREL(%rip), %r11 +.global bluegl_glVideoCaptureStreamParameterivNV +.type bluegl_glVideoCaptureStreamParameterivNV, %function +bluegl_glVideoCaptureStreamParameterivNV: + mov __blue_glCore_glVideoCaptureStreamParameterivNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL1dv -.type bluegl_glVertexAttribL1dv, %function -bluegl_glVertexAttribL1dv: - mov __blue_glCore_glVertexAttribL1dv@GOTPCREL(%rip), %r11 +.global bluegl_glVideoCaptureStreamParameterfvNV +.type bluegl_glVideoCaptureStreamParameterfvNV, %function +bluegl_glVideoCaptureStreamParameterfvNV: + mov __blue_glCore_glVideoCaptureStreamParameterfvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetImageTransformParameterivHP -.type bluegl_glGetImageTransformParameterivHP, %function -bluegl_glGetImageTransformParameterivHP: - mov __blue_glCore_glGetImageTransformParameterivHP@GOTPCREL(%rip), %r11 +.global bluegl_glVideoCaptureStreamParameterdvNV +.type bluegl_glVideoCaptureStreamParameterdvNV, %function +bluegl_glVideoCaptureStreamParameterdvNV: + mov __blue_glCore_glVideoCaptureStreamParameterdvNV@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetSubroutineUniformLocation -.type bluegl_glGetSubroutineUniformLocation, %function -bluegl_glGetSubroutineUniformLocation: - mov __blue_glCore_glGetSubroutineUniformLocation@GOTPCREL(%rip), %r11 +.global bluegl_glFramebufferTextureMultiviewOVR +.type bluegl_glFramebufferTextureMultiviewOVR, %function +bluegl_glFramebufferTextureMultiviewOVR: + mov __blue_glCore_glFramebufferTextureMultiviewOVR@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramEnvParameter4fvARB -.type bluegl_glProgramEnvParameter4fvARB, %function -bluegl_glProgramEnvParameter4fvARB: - mov __blue_glCore_glProgramEnvParameter4fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glHintPGI +.type bluegl_glHintPGI, %function +bluegl_glHintPGI: + mov __blue_glCore_glHintPGI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureImageEXT -.type bluegl_glGetTextureImageEXT, %function -bluegl_glGetTextureImageEXT: - mov __blue_glCore_glGetTextureImageEXT@GOTPCREL(%rip), %r11 +.global bluegl_glDetailTexFuncSGIS +.type bluegl_glDetailTexFuncSGIS, %function +bluegl_glDetailTexFuncSGIS: + mov __blue_glCore_glDetailTexFuncSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindTexGenParameterEXT -.type bluegl_glBindTexGenParameterEXT, %function -bluegl_glBindTexGenParameterEXT: - mov __blue_glCore_glBindTexGenParameterEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetDetailTexFuncSGIS +.type bluegl_glGetDetailTexFuncSGIS, %function +bluegl_glGetDetailTexFuncSGIS: + mov __blue_glCore_glGetDetailTexFuncSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMinSampleShadingARB -.type bluegl_glMinSampleShadingARB, %function -bluegl_glMinSampleShadingARB: - mov __blue_glCore_glMinSampleShadingARB@GOTPCREL(%rip), %r11 +.global bluegl_glFogFuncSGIS +.type bluegl_glFogFuncSGIS, %function +bluegl_glFogFuncSGIS: + mov __blue_glCore_glFogFuncSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetAttachedObjectsARB -.type bluegl_glGetAttachedObjectsARB, %function -bluegl_glGetAttachedObjectsARB: - mov __blue_glCore_glGetAttachedObjectsARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetFogFuncSGIS +.type bluegl_glGetFogFuncSGIS, %function +bluegl_glGetFogFuncSGIS: + mov __blue_glCore_glGetFogFuncSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexArrayiv -.type bluegl_glGetVertexArrayiv, %function -bluegl_glGetVertexArrayiv: - mov __blue_glCore_glGetVertexArrayiv@GOTPCREL(%rip), %r11 +.global bluegl_glSampleMaskSGIS +.type bluegl_glSampleMaskSGIS, %function +bluegl_glSampleMaskSGIS: + mov __blue_glCore_glSampleMaskSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWeightfvARB -.type bluegl_glWeightfvARB, %function -bluegl_glWeightfvARB: - mov __blue_glCore_glWeightfvARB@GOTPCREL(%rip), %r11 +.global bluegl_glSamplePatternSGIS +.type bluegl_glSamplePatternSGIS, %function +bluegl_glSamplePatternSGIS: + mov __blue_glCore_glSamplePatternSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPathCommandsNV -.type bluegl_glGetPathCommandsNV, %function -bluegl_glGetPathCommandsNV: - mov __blue_glCore_glGetPathCommandsNV@GOTPCREL(%rip), %r11 +.global bluegl_glPixelTexGenParameteriSGIS +.type bluegl_glPixelTexGenParameteriSGIS, %function +bluegl_glPixelTexGenParameteriSGIS: + mov __blue_glCore_glPixelTexGenParameteriSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetColorTableParameterivSGI -.type bluegl_glGetColorTableParameterivSGI, %function -bluegl_glGetColorTableParameterivSGI: - mov __blue_glCore_glGetColorTableParameterivSGI@GOTPCREL(%rip), %r11 +.global bluegl_glPixelTexGenParameterivSGIS +.type bluegl_glPixelTexGenParameterivSGIS, %function +bluegl_glPixelTexGenParameterivSGIS: + mov __blue_glCore_glPixelTexGenParameterivSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedProgramivEXT -.type bluegl_glGetNamedProgramivEXT, %function -bluegl_glGetNamedProgramivEXT: - mov __blue_glCore_glGetNamedProgramivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPixelTexGenParameterfSGIS +.type bluegl_glPixelTexGenParameterfSGIS, %function +bluegl_glPixelTexGenParameterfSGIS: + mov __blue_glCore_glPixelTexGenParameterfSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSecondaryColor3ubvEXT -.type bluegl_glSecondaryColor3ubvEXT, %function -bluegl_glSecondaryColor3ubvEXT: - mov __blue_glCore_glSecondaryColor3ubvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPixelTexGenParameterfvSGIS +.type bluegl_glPixelTexGenParameterfvSGIS, %function +bluegl_glPixelTexGenParameterfvSGIS: + mov __blue_glCore_glPixelTexGenParameterfvSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVDPAURegisterVideoSurfaceNV -.type bluegl_glVDPAURegisterVideoSurfaceNV, %function -bluegl_glVDPAURegisterVideoSurfaceNV: - mov __blue_glCore_glVDPAURegisterVideoSurfaceNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetPixelTexGenParameterivSGIS +.type bluegl_glGetPixelTexGenParameterivSGIS, %function +bluegl_glGetPixelTexGenParameterivSGIS: + mov __blue_glCore_glGetPixelTexGenParameterivSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexParameterf -.type bluegl_glTexParameterf, %function -bluegl_glTexParameterf: - mov __blue_glCore_glTexParameterf@GOTPCREL(%rip), %r11 +.global bluegl_glGetPixelTexGenParameterfvSGIS +.type bluegl_glGetPixelTexGenParameterfvSGIS, %function +bluegl_glGetPixelTexGenParameterfvSGIS: + mov __blue_glCore_glGetPixelTexGenParameterfvSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL4i64NV -.type bluegl_glVertexAttribL4i64NV, %function -bluegl_glVertexAttribL4i64NV: - mov __blue_glCore_glVertexAttribL4i64NV@GOTPCREL(%rip), %r11 +.global bluegl_glPointParameterfSGIS +.type bluegl_glPointParameterfSGIS, %function +bluegl_glPointParameterfSGIS: + mov __blue_glCore_glPointParameterfSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPollAsyncSGIX -.type bluegl_glPollAsyncSGIX, %function -bluegl_glPollAsyncSGIX: - mov __blue_glCore_glPollAsyncSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glPointParameterfvSGIS +.type bluegl_glPointParameterfvSGIS, %function +bluegl_glPointParameterfvSGIS: + mov __blue_glCore_glPointParameterfvSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBufferParameteriAPPLE -.type bluegl_glBufferParameteriAPPLE, %function -bluegl_glBufferParameteriAPPLE: - mov __blue_glCore_glBufferParameteriAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glSharpenTexFuncSGIS +.type bluegl_glSharpenTexFuncSGIS, %function +bluegl_glSharpenTexFuncSGIS: + mov __blue_glCore_glSharpenTexFuncSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glApplyTextureEXT -.type bluegl_glApplyTextureEXT, %function -bluegl_glApplyTextureEXT: - mov __blue_glCore_glApplyTextureEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetSharpenTexFuncSGIS +.type bluegl_glGetSharpenTexFuncSGIS, %function +bluegl_glGetSharpenTexFuncSGIS: + mov __blue_glCore_glGetSharpenTexFuncSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenVertexShadersEXT -.type bluegl_glGenVertexShadersEXT, %function -bluegl_glGenVertexShadersEXT: - mov __blue_glCore_glGenVertexShadersEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexImage4DSGIS +.type bluegl_glTexImage4DSGIS, %function +bluegl_glTexImage4DSGIS: + mov __blue_glCore_glTexImage4DSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexImage2DMultisampleCoverageNV -.type bluegl_glTexImage2DMultisampleCoverageNV, %function -bluegl_glTexImage2DMultisampleCoverageNV: - mov __blue_glCore_glTexImage2DMultisampleCoverageNV@GOTPCREL(%rip), %r11 +.global bluegl_glTexSubImage4DSGIS +.type bluegl_glTexSubImage4DSGIS, %function +bluegl_glTexSubImage4DSGIS: + mov __blue_glCore_glTexSubImage4DSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glObjectUnpurgeableAPPLE -.type bluegl_glObjectUnpurgeableAPPLE, %function -bluegl_glObjectUnpurgeableAPPLE: - mov __blue_glCore_glObjectUnpurgeableAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glTextureColorMaskSGIS +.type bluegl_glTextureColorMaskSGIS, %function +bluegl_glTextureColorMaskSGIS: + mov __blue_glCore_glTextureColorMaskSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCopyNamedBufferSubData -.type bluegl_glCopyNamedBufferSubData, %function -bluegl_glCopyNamedBufferSubData: - mov __blue_glCore_glCopyNamedBufferSubData@GOTPCREL(%rip), %r11 +.global bluegl_glGetTexFilterFuncSGIS +.type bluegl_glGetTexFilterFuncSGIS, %function +bluegl_glGetTexFilterFuncSGIS: + mov __blue_glCore_glGetTexFilterFuncSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4dv -.type bluegl_glVertexAttrib4dv, %function -bluegl_glVertexAttrib4dv: - mov __blue_glCore_glVertexAttrib4dv@GOTPCREL(%rip), %r11 +.global bluegl_glTexFilterFuncSGIS +.type bluegl_glTexFilterFuncSGIS, %function +bluegl_glTexFilterFuncSGIS: + mov __blue_glCore_glTexFilterFuncSGIS@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearTexSubImage -.type bluegl_glClearTexSubImage, %function -bluegl_glClearTexSubImage: - mov __blue_glCore_glClearTexSubImage@GOTPCREL(%rip), %r11 +.global bluegl_glAsyncMarkerSGIX +.type bluegl_glAsyncMarkerSGIX, %function +bluegl_glAsyncMarkerSGIX: + mov __blue_glCore_glAsyncMarkerSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPointAlongPathNV -.type bluegl_glPointAlongPathNV, %function -bluegl_glPointAlongPathNV: - mov __blue_glCore_glPointAlongPathNV@GOTPCREL(%rip), %r11 +.global bluegl_glFinishAsyncSGIX +.type bluegl_glFinishAsyncSGIX, %function +bluegl_glFinishAsyncSGIX: + mov __blue_glCore_glFinishAsyncSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferTexture1DEXT -.type bluegl_glFramebufferTexture1DEXT, %function -bluegl_glFramebufferTexture1DEXT: - mov __blue_glCore_glFramebufferTexture1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glPollAsyncSGIX +.type bluegl_glPollAsyncSGIX, %function +bluegl_glPollAsyncSGIX: + mov __blue_glCore_glPollAsyncSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixLoad3x2fNV -.type bluegl_glMatrixLoad3x2fNV, %function -bluegl_glMatrixLoad3x2fNV: - mov __blue_glCore_glMatrixLoad3x2fNV@GOTPCREL(%rip), %r11 +.global bluegl_glGenAsyncMarkersSGIX +.type bluegl_glGenAsyncMarkersSGIX, %function +bluegl_glGenAsyncMarkersSGIX: + mov __blue_glCore_glGenAsyncMarkersSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetUniformui64vARB -.type bluegl_glGetUniformui64vARB, %function -bluegl_glGetUniformui64vARB: - mov __blue_glCore_glGetUniformui64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glDeleteAsyncMarkersSGIX +.type bluegl_glDeleteAsyncMarkersSGIX, %function +bluegl_glDeleteAsyncMarkersSGIX: + mov __blue_glCore_glDeleteAsyncMarkersSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureStorage3DMultisampleEXT -.type bluegl_glTextureStorage3DMultisampleEXT, %function -bluegl_glTextureStorage3DMultisampleEXT: - mov __blue_glCore_glTextureStorage3DMultisampleEXT@GOTPCREL(%rip), %r11 +.global bluegl_glIsAsyncMarkerSGIX +.type bluegl_glIsAsyncMarkerSGIX, %function +bluegl_glIsAsyncMarkerSGIX: + mov __blue_glCore_glIsAsyncMarkerSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTexCoord1bvOES -.type bluegl_glTexCoord1bvOES, %function -bluegl_glTexCoord1bvOES: - mov __blue_glCore_glTexCoord1bvOES@GOTPCREL(%rip), %r11 +.global bluegl_glFlushRasterSGIX +.type bluegl_glFlushRasterSGIX, %function +bluegl_glFlushRasterSGIX: + mov __blue_glCore_glFlushRasterSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetBufferParameteri64v -.type bluegl_glGetBufferParameteri64v, %function -bluegl_glGetBufferParameteri64v: - mov __blue_glCore_glGetBufferParameteri64v@GOTPCREL(%rip), %r11 +.global bluegl_glFragmentColorMaterialSGIX +.type bluegl_glFragmentColorMaterialSGIX, %function +bluegl_glFragmentColorMaterialSGIX: + mov __blue_glCore_glFragmentColorMaterialSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glQueryMatrixxOES -.type bluegl_glQueryMatrixxOES, %function -bluegl_glQueryMatrixxOES: - mov __blue_glCore_glQueryMatrixxOES@GOTPCREL(%rip), %r11 +.global bluegl_glFragmentLightfSGIX +.type bluegl_glFragmentLightfSGIX, %function +bluegl_glFragmentLightfSGIX: + mov __blue_glCore_glFragmentLightfSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib1fv -.type bluegl_glVertexAttrib1fv, %function -bluegl_glVertexAttrib1fv: - mov __blue_glCore_glVertexAttrib1fv@GOTPCREL(%rip), %r11 +.global bluegl_glFragmentLightfvSGIX +.type bluegl_glFragmentLightfvSGIX, %function +bluegl_glFragmentLightfvSGIX: + mov __blue_glCore_glFragmentLightfvSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribP3ui -.type bluegl_glVertexAttribP3ui, %function -bluegl_glVertexAttribP3ui: - mov __blue_glCore_glVertexAttribP3ui@GOTPCREL(%rip), %r11 +.global bluegl_glFragmentLightiSGIX +.type bluegl_glFragmentLightiSGIX, %function +bluegl_glFragmentLightiSGIX: + mov __blue_glCore_glFragmentLightiSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVDPAUInitNV -.type bluegl_glVDPAUInitNV, %function -bluegl_glVDPAUInitNV: - mov __blue_glCore_glVDPAUInitNV@GOTPCREL(%rip), %r11 +.global bluegl_glFragmentLightivSGIX +.type bluegl_glFragmentLightivSGIX, %function +bluegl_glFragmentLightivSGIX: + mov __blue_glCore_glFragmentLightivSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPathStencilDepthOffsetNV -.type bluegl_glPathStencilDepthOffsetNV, %function -bluegl_glPathStencilDepthOffsetNV: - mov __blue_glCore_glPathStencilDepthOffsetNV@GOTPCREL(%rip), %r11 +.global bluegl_glFragmentLightModelfSGIX +.type bluegl_glFragmentLightModelfSGIX, %function +bluegl_glFragmentLightModelfSGIX: + mov __blue_glCore_glFragmentLightModelfSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glLightxOES -.type bluegl_glLightxOES, %function -bluegl_glLightxOES: - mov __blue_glCore_glLightxOES@GOTPCREL(%rip), %r11 +.global bluegl_glFragmentLightModelfvSGIX +.type bluegl_glFragmentLightModelfvSGIX, %function +bluegl_glFragmentLightModelfvSGIX: + mov __blue_glCore_glFragmentLightModelfvSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI3i -.type bluegl_glVertexAttribI3i, %function -bluegl_glVertexAttribI3i: - mov __blue_glCore_glVertexAttribI3i@GOTPCREL(%rip), %r11 +.global bluegl_glFragmentLightModeliSGIX +.type bluegl_glFragmentLightModeliSGIX, %function +bluegl_glFragmentLightModeliSGIX: + mov __blue_glCore_glFragmentLightModeliSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformHandleui64vARB -.type bluegl_glProgramUniformHandleui64vARB, %function -bluegl_glProgramUniformHandleui64vARB: - mov __blue_glCore_glProgramUniformHandleui64vARB@GOTPCREL(%rip), %r11 +.global bluegl_glFragmentLightModelivSGIX +.type bluegl_glFragmentLightModelivSGIX, %function +bluegl_glFragmentLightModelivSGIX: + mov __blue_glCore_glFragmentLightModelivSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureParameteriv -.type bluegl_glTextureParameteriv, %function -bluegl_glTextureParameteriv: - mov __blue_glCore_glTextureParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glFragmentMaterialfSGIX +.type bluegl_glFragmentMaterialfSGIX, %function +bluegl_glFragmentMaterialfSGIX: + mov __blue_glCore_glFragmentMaterialfSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniformHandleui64NV -.type bluegl_glProgramUniformHandleui64NV, %function -bluegl_glProgramUniformHandleui64NV: - mov __blue_glCore_glProgramUniformHandleui64NV@GOTPCREL(%rip), %r11 +.global bluegl_glFragmentMaterialfvSGIX +.type bluegl_glFragmentMaterialfvSGIX, %function +bluegl_glFragmentMaterialfvSGIX: + mov __blue_glCore_glFragmentMaterialfvSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetVertexArrayIntegervEXT -.type bluegl_glGetVertexArrayIntegervEXT, %function -bluegl_glGetVertexArrayIntegervEXT: - mov __blue_glCore_glGetVertexArrayIntegervEXT@GOTPCREL(%rip), %r11 +.global bluegl_glFragmentMaterialiSGIX +.type bluegl_glFragmentMaterialiSGIX, %function +bluegl_glFragmentMaterialiSGIX: + mov __blue_glCore_glFragmentMaterialiSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawElements -.type bluegl_glDrawElements, %function -bluegl_glDrawElements: - mov __blue_glCore_glDrawElements@GOTPCREL(%rip), %r11 +.global bluegl_glFragmentMaterialivSGIX +.type bluegl_glFragmentMaterialivSGIX, %function +bluegl_glFragmentMaterialivSGIX: + mov __blue_glCore_glFragmentMaterialivSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform3i64ARB -.type bluegl_glProgramUniform3i64ARB, %function -bluegl_glProgramUniform3i64ARB: - mov __blue_glCore_glProgramUniform3i64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetFragmentLightfvSGIX +.type bluegl_glGetFragmentLightfvSGIX, %function +bluegl_glGetFragmentLightfvSGIX: + mov __blue_glCore_glGetFragmentLightfvSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteAsyncMarkersSGIX -.type bluegl_glDeleteAsyncMarkersSGIX, %function -bluegl_glDeleteAsyncMarkersSGIX: - mov __blue_glCore_glDeleteAsyncMarkersSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glGetFragmentLightivSGIX +.type bluegl_glGetFragmentLightivSGIX, %function +bluegl_glGetFragmentLightivSGIX: + mov __blue_glCore_glGetFragmentLightivSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetLightxOES -.type bluegl_glGetLightxOES, %function -bluegl_glGetLightxOES: - mov __blue_glCore_glGetLightxOES@GOTPCREL(%rip), %r11 +.global bluegl_glGetFragmentMaterialfvSGIX +.type bluegl_glGetFragmentMaterialfvSGIX, %function +bluegl_glGetFragmentMaterialfvSGIX: + mov __blue_glCore_glGetFragmentMaterialfvSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreateCommandListsNV -.type bluegl_glCreateCommandListsNV, %function -bluegl_glCreateCommandListsNV: - mov __blue_glCore_glCreateCommandListsNV@GOTPCREL(%rip), %r11 +.global bluegl_glGetFragmentMaterialivSGIX +.type bluegl_glGetFragmentMaterialivSGIX, %function +bluegl_glGetFragmentMaterialivSGIX: + mov __blue_glCore_glGetFragmentMaterialivSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClear -.type bluegl_glClear, %function -bluegl_glClear: - mov __blue_glCore_glClear@GOTPCREL(%rip), %r11 +.global bluegl_glLightEnviSGIX +.type bluegl_glLightEnviSGIX, %function +bluegl_glLightEnviSGIX: + mov __blue_glCore_glLightEnviSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformui64vNV -.type bluegl_glUniformui64vNV, %function -bluegl_glUniformui64vNV: - mov __blue_glCore_glUniformui64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glFrameZoomSGIX +.type bluegl_glFrameZoomSGIX, %function +bluegl_glFrameZoomSGIX: + mov __blue_glCore_glFrameZoomSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib2dvNV -.type bluegl_glVertexAttrib2dvNV, %function -bluegl_glVertexAttrib2dvNV: - mov __blue_glCore_glVertexAttrib2dvNV@GOTPCREL(%rip), %r11 +.global bluegl_glIglooInterfaceSGIX +.type bluegl_glIglooInterfaceSGIX, %function +bluegl_glIglooInterfaceSGIX: + mov __blue_glCore_glIglooInterfaceSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN -.type bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN, %function -bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN: - mov __blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glGetInstrumentsSGIX +.type bluegl_glGetInstrumentsSGIX, %function +bluegl_glGetInstrumentsSGIX: + mov __blue_glCore_glGetInstrumentsSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos3sARB -.type bluegl_glWindowPos3sARB, %function -bluegl_glWindowPos3sARB: - mov __blue_glCore_glWindowPos3sARB@GOTPCREL(%rip), %r11 +.global bluegl_glInstrumentsBufferSGIX +.type bluegl_glInstrumentsBufferSGIX, %function +bluegl_glInstrumentsBufferSGIX: + mov __blue_glCore_glInstrumentsBufferSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawTextureNV -.type bluegl_glDrawTextureNV, %function -bluegl_glDrawTextureNV: - mov __blue_glCore_glDrawTextureNV@GOTPCREL(%rip), %r11 +.global bluegl_glPollInstrumentsSGIX +.type bluegl_glPollInstrumentsSGIX, %function +bluegl_glPollInstrumentsSGIX: + mov __blue_glCore_glPollInstrumentsSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIsSync -.type bluegl_glIsSync, %function -bluegl_glIsSync: - mov __blue_glCore_glIsSync@GOTPCREL(%rip), %r11 +.global bluegl_glReadInstrumentsSGIX +.type bluegl_glReadInstrumentsSGIX, %function +bluegl_glReadInstrumentsSGIX: + mov __blue_glCore_glReadInstrumentsSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMatrixTranslatedEXT -.type bluegl_glMatrixTranslatedEXT, %function -bluegl_glMatrixTranslatedEXT: - mov __blue_glCore_glMatrixTranslatedEXT@GOTPCREL(%rip), %r11 +.global bluegl_glStartInstrumentsSGIX +.type bluegl_glStartInstrumentsSGIX, %function +bluegl_glStartInstrumentsSGIX: + mov __blue_glCore_glStartInstrumentsSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetActiveVaryingNV -.type bluegl_glGetActiveVaryingNV, %function -bluegl_glGetActiveVaryingNV: - mov __blue_glCore_glGetActiveVaryingNV@GOTPCREL(%rip), %r11 +.global bluegl_glStopInstrumentsSGIX +.type bluegl_glStopInstrumentsSGIX, %function +bluegl_glStopInstrumentsSGIX: + mov __blue_glCore_glStopInstrumentsSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCreateQueries -.type bluegl_glCreateQueries, %function -bluegl_glCreateQueries: - mov __blue_glCore_glCreateQueries@GOTPCREL(%rip), %r11 +.global bluegl_glGetListParameterfvSGIX +.type bluegl_glGetListParameterfvSGIX, %function +bluegl_glGetListParameterfvSGIX: + mov __blue_glCore_glGetListParameterfvSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramEnvParameterdvARB -.type bluegl_glGetProgramEnvParameterdvARB, %function -bluegl_glGetProgramEnvParameterdvARB: - mov __blue_glCore_glGetProgramEnvParameterdvARB@GOTPCREL(%rip), %r11 +.global bluegl_glGetListParameterivSGIX +.type bluegl_glGetListParameterivSGIX, %function +bluegl_glGetListParameterivSGIX: + mov __blue_glCore_glGetListParameterivSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayVertexAttribIOffsetEXT -.type bluegl_glVertexArrayVertexAttribIOffsetEXT, %function -bluegl_glVertexArrayVertexAttribIOffsetEXT: - mov __blue_glCore_glVertexArrayVertexAttribIOffsetEXT@GOTPCREL(%rip), %r11 +.global bluegl_glListParameterfSGIX +.type bluegl_glListParameterfSGIX, %function +bluegl_glListParameterfSGIX: + mov __blue_glCore_glListParameterfSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetLocalConstantBooleanvEXT -.type bluegl_glGetLocalConstantBooleanvEXT, %function -bluegl_glGetLocalConstantBooleanvEXT: - mov __blue_glCore_glGetLocalConstantBooleanvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glListParameterfvSGIX +.type bluegl_glListParameterfvSGIX, %function +bluegl_glListParameterfvSGIX: + mov __blue_glCore_glListParameterfvSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetProgramParameterfvNV -.type bluegl_glGetProgramParameterfvNV, %function -bluegl_glGetProgramParameterfvNV: - mov __blue_glCore_glGetProgramParameterfvNV@GOTPCREL(%rip), %r11 +.global bluegl_glListParameteriSGIX +.type bluegl_glListParameteriSGIX, %function +bluegl_glListParameteriSGIX: + mov __blue_glCore_glListParameteriSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSpriteParameterivSGIX -.type bluegl_glSpriteParameterivSGIX, %function -bluegl_glSpriteParameterivSGIX: - mov __blue_glCore_glSpriteParameterivSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glListParameterivSGIX +.type bluegl_glListParameterivSGIX, %function +bluegl_glListParameterivSGIX: + mov __blue_glCore_glListParameterivSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3xvOES -.type bluegl_glMultiTexCoord3xvOES, %function -bluegl_glMultiTexCoord3xvOES: - mov __blue_glCore_glMultiTexCoord3xvOES@GOTPCREL(%rip), %r11 +.global bluegl_glPixelTexGenSGIX +.type bluegl_glPixelTexGenSGIX, %function +bluegl_glPixelTexGenSGIX: + mov __blue_glCore_glPixelTexGenSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindBufferRangeNV -.type bluegl_glBindBufferRangeNV, %function -bluegl_glBindBufferRangeNV: - mov __blue_glCore_glBindBufferRangeNV@GOTPCREL(%rip), %r11 +.global bluegl_glDeformationMap3dSGIX +.type bluegl_glDeformationMap3dSGIX, %function +bluegl_glDeformationMap3dSGIX: + mov __blue_glCore_glDeformationMap3dSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1sv -.type bluegl_glMultiTexCoord1sv, %function -bluegl_glMultiTexCoord1sv: - mov __blue_glCore_glMultiTexCoord1sv@GOTPCREL(%rip), %r11 +.global bluegl_glDeformationMap3fSGIX +.type bluegl_glDeformationMap3fSGIX, %function +bluegl_glDeformationMap3fSGIX: + mov __blue_glCore_glDeformationMap3fSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream1ivATI -.type bluegl_glVertexStream1ivATI, %function -bluegl_glVertexStream1ivATI: - mov __blue_glCore_glVertexStream1ivATI@GOTPCREL(%rip), %r11 +.global bluegl_glDeformSGIX +.type bluegl_glDeformSGIX, %function +bluegl_glDeformSGIX: + mov __blue_glCore_glDeformSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetQueryObjectivARB -.type bluegl_glGetQueryObjectivARB, %function -bluegl_glGetQueryObjectivARB: - mov __blue_glCore_glGetQueryObjectivARB@GOTPCREL(%rip), %r11 +.global bluegl_glLoadIdentityDeformationMapSGIX +.type bluegl_glLoadIdentityDeformationMapSGIX, %function +bluegl_glLoadIdentityDeformationMapSGIX: + mov __blue_glCore_glLoadIdentityDeformationMapSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeuiColor4ubVertex3fvSUN -.type bluegl_glReplacementCodeuiColor4ubVertex3fvSUN, %function -bluegl_glReplacementCodeuiColor4ubVertex3fvSUN: - mov __blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN@GOTPCREL(%rip), %r11 +.global bluegl_glReferencePlaneSGIX +.type bluegl_glReferencePlaneSGIX, %function +bluegl_glReferencePlaneSGIX: + mov __blue_glCore_glReferencePlaneSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFlushMappedNamedBufferRange -.type bluegl_glFlushMappedNamedBufferRange, %function -bluegl_glFlushMappedNamedBufferRange: - mov __blue_glCore_glFlushMappedNamedBufferRange@GOTPCREL(%rip), %r11 +.global bluegl_glSpriteParameterfSGIX +.type bluegl_glSpriteParameterfSGIX, %function +bluegl_glSpriteParameterfSGIX: + mov __blue_glCore_glSpriteParameterfSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPointParameteriv -.type bluegl_glPointParameteriv, %function -bluegl_glPointParameteriv: - mov __blue_glCore_glPointParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glSpriteParameterfvSGIX +.type bluegl_glSpriteParameterfvSGIX, %function +bluegl_glSpriteParameterfvSGIX: + mov __blue_glCore_glSpriteParameterfvSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTextureLevelParameterivEXT -.type bluegl_glGetTextureLevelParameterivEXT, %function -bluegl_glGetTextureLevelParameterivEXT: - mov __blue_glCore_glGetTextureLevelParameterivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glSpriteParameteriSGIX +.type bluegl_glSpriteParameteriSGIX, %function +bluegl_glSpriteParameteriSGIX: + mov __blue_glCore_glSpriteParameteriSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexEnviEXT -.type bluegl_glMultiTexEnviEXT, %function -bluegl_glMultiTexEnviEXT: - mov __blue_glCore_glMultiTexEnviEXT@GOTPCREL(%rip), %r11 +.global bluegl_glSpriteParameterivSGIX +.type bluegl_glSpriteParameterivSGIX, %function +bluegl_glSpriteParameterivSGIX: + mov __blue_glCore_glSpriteParameterivSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPolygonOffset -.type bluegl_glPolygonOffset, %function -bluegl_glPolygonOffset: - mov __blue_glCore_glPolygonOffset@GOTPCREL(%rip), %r11 +.global bluegl_glTagSampleBufferSGIX +.type bluegl_glTagSampleBufferSGIX, %function +bluegl_glTagSampleBufferSGIX: + mov __blue_glCore_glTagSampleBufferSGIX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1ui64ARB -.type bluegl_glUniform1ui64ARB, %function -bluegl_glUniform1ui64ARB: - mov __blue_glCore_glUniform1ui64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glColorTableSGI +.type bluegl_glColorTableSGI, %function +bluegl_glColorTableSGI: + mov __blue_glCore_glColorTableSGI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDeleteVertexArrays -.type bluegl_glDeleteVertexArrays, %function -bluegl_glDeleteVertexArrays: - mov __blue_glCore_glDeleteVertexArrays@GOTPCREL(%rip), %r11 +.global bluegl_glColorTableParameterfvSGI +.type bluegl_glColorTableParameterfvSGI, %function +bluegl_glColorTableParameterfvSGI: + mov __blue_glCore_glColorTableParameterfvSGI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetUniformi64vNV -.type bluegl_glGetUniformi64vNV, %function -bluegl_glGetUniformi64vNV: - mov __blue_glCore_glGetUniformi64vNV@GOTPCREL(%rip), %r11 +.global bluegl_glColorTableParameterivSGI +.type bluegl_glColorTableParameterivSGI, %function +bluegl_glColorTableParameterivSGI: + mov __blue_glCore_glColorTableParameterivSGI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI3iv -.type bluegl_glVertexAttribI3iv, %function -bluegl_glVertexAttribI3iv: - mov __blue_glCore_glVertexAttribI3iv@GOTPCREL(%rip), %r11 +.global bluegl_glCopyColorTableSGI +.type bluegl_glCopyColorTableSGI, %function +bluegl_glCopyColorTableSGI: + mov __blue_glCore_glCopyColorTableSGI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glEndQueryIndexed -.type bluegl_glEndQueryIndexed, %function -bluegl_glEndQueryIndexed: - mov __blue_glCore_glEndQueryIndexed@GOTPCREL(%rip), %r11 +.global bluegl_glGetColorTableSGI +.type bluegl_glGetColorTableSGI, %function +bluegl_glGetColorTableSGI: + mov __blue_glCore_glGetColorTableSGI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureSubImage1DEXT -.type bluegl_glTextureSubImage1DEXT, %function -bluegl_glTextureSubImage1DEXT: - mov __blue_glCore_glTextureSubImage1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetColorTableParameterfvSGI +.type bluegl_glGetColorTableParameterfvSGI, %function +bluegl_glGetColorTableParameterfvSGI: + mov __blue_glCore_glGetColorTableParameterfvSGI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI4ubvEXT -.type bluegl_glVertexAttribI4ubvEXT, %function -bluegl_glVertexAttribI4ubvEXT: - mov __blue_glCore_glVertexAttribI4ubvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGetColorTableParameterivSGI +.type bluegl_glGetColorTableParameterivSGI, %function +bluegl_glGetColorTableParameterivSGI: + mov __blue_glCore_glGetColorTableParameterivSGI@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribP4ui -.type bluegl_glVertexAttribP4ui, %function -bluegl_glVertexAttribP4ui: - mov __blue_glCore_glVertexAttribP4ui@GOTPCREL(%rip), %r11 +.global bluegl_glFinishTextureSUNX +.type bluegl_glFinishTextureSUNX, %function +bluegl_glFinishTextureSUNX: + mov __blue_glCore_glFinishTextureSUNX@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glNamedProgramLocalParameter4dvEXT -.type bluegl_glNamedProgramLocalParameter4dvEXT, %function -bluegl_glNamedProgramLocalParameter4dvEXT: - mov __blue_glCore_glNamedProgramLocalParameter4dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGlobalAlphaFactorbSUN +.type bluegl_glGlobalAlphaFactorbSUN, %function +bluegl_glGlobalAlphaFactorbSUN: + mov __blue_glCore_glGlobalAlphaFactorbSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedProgramLocalParameterIuivEXT -.type bluegl_glGetNamedProgramLocalParameterIuivEXT, %function -bluegl_glGetNamedProgramLocalParameterIuivEXT: - mov __blue_glCore_glGetNamedProgramLocalParameterIuivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGlobalAlphaFactorsSUN +.type bluegl_glGlobalAlphaFactorsSUN, %function +bluegl_glGlobalAlphaFactorsSUN: + mov __blue_glCore_glGlobalAlphaFactorsSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPixelTexGenParameterivSGIS -.type bluegl_glGetPixelTexGenParameterivSGIS, %function -bluegl_glGetPixelTexGenParameterivSGIS: - mov __blue_glCore_glGetPixelTexGenParameterivSGIS@GOTPCREL(%rip), %r11 +.global bluegl_glGlobalAlphaFactoriSUN +.type bluegl_glGlobalAlphaFactoriSUN, %function +bluegl_glGlobalAlphaFactoriSUN: + mov __blue_glCore_glGlobalAlphaFactoriSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnMapdv -.type bluegl_glGetnMapdv, %function -bluegl_glGetnMapdv: - mov __blue_glCore_glGetnMapdv@GOTPCREL(%rip), %r11 +.global bluegl_glGlobalAlphaFactorfSUN +.type bluegl_glGlobalAlphaFactorfSUN, %function +bluegl_glGlobalAlphaFactorfSUN: + mov __blue_glCore_glGlobalAlphaFactorfSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord4svARB -.type bluegl_glMultiTexCoord4svARB, %function -bluegl_glMultiTexCoord4svARB: - mov __blue_glCore_glMultiTexCoord4svARB@GOTPCREL(%rip), %r11 +.global bluegl_glGlobalAlphaFactordSUN +.type bluegl_glGlobalAlphaFactordSUN, %function +bluegl_glGlobalAlphaFactordSUN: + mov __blue_glCore_glGlobalAlphaFactordSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexStream2ivATI -.type bluegl_glVertexStream2ivATI, %function -bluegl_glVertexStream2ivATI: - mov __blue_glCore_glVertexStream2ivATI@GOTPCREL(%rip), %r11 +.global bluegl_glGlobalAlphaFactorubSUN +.type bluegl_glGlobalAlphaFactorubSUN, %function +bluegl_glGlobalAlphaFactorubSUN: + mov __blue_glCore_glGlobalAlphaFactorubSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4uivEXT -.type bluegl_glUniform4uivEXT, %function -bluegl_glUniform4uivEXT: - mov __blue_glCore_glUniform4uivEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGlobalAlphaFactorusSUN +.type bluegl_glGlobalAlphaFactorusSUN, %function +bluegl_glGlobalAlphaFactorusSUN: + mov __blue_glCore_glGlobalAlphaFactorusSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetPointeri_vEXT -.type bluegl_glGetPointeri_vEXT, %function -bluegl_glGetPointeri_vEXT: - mov __blue_glCore_glGetPointeri_vEXT@GOTPCREL(%rip), %r11 +.global bluegl_glGlobalAlphaFactoruiSUN +.type bluegl_glGlobalAlphaFactoruiSUN, %function +bluegl_glGlobalAlphaFactoruiSUN: + mov __blue_glCore_glGlobalAlphaFactoruiSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearTexImage -.type bluegl_glClearTexImage, %function -bluegl_glClearTexImage: - mov __blue_glCore_glClearTexImage@GOTPCREL(%rip), %r11 +.global bluegl_glDrawMeshArraysSUN +.type bluegl_glDrawMeshArraysSUN, %function +bluegl_glDrawMeshArraysSUN: + mov __blue_glCore_glDrawMeshArraysSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribP1ui -.type bluegl_glVertexAttribP1ui, %function -bluegl_glVertexAttribP1ui: - mov __blue_glCore_glVertexAttribP1ui@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeuiSUN +.type bluegl_glReplacementCodeuiSUN, %function +bluegl_glReplacementCodeuiSUN: + mov __blue_glCore_glReplacementCodeuiSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glCompressedTexImage1DARB -.type bluegl_glCompressedTexImage1DARB, %function -bluegl_glCompressedTexImage1DARB: - mov __blue_glCore_glCompressedTexImage1DARB@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeusSUN +.type bluegl_glReplacementCodeusSUN, %function +bluegl_glReplacementCodeusSUN: + mov __blue_glCore_glReplacementCodeusSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glTextureStorage1DEXT -.type bluegl_glTextureStorage1DEXT, %function -bluegl_glTextureStorage1DEXT: - mov __blue_glCore_glTextureStorage1DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeubSUN +.type bluegl_glReplacementCodeubSUN, %function +bluegl_glReplacementCodeubSUN: + mov __blue_glCore_glReplacementCodeubSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform4fvARB -.type bluegl_glUniform4fvARB, %function -bluegl_glUniform4fvARB: - mov __blue_glCore_glUniform4fvARB@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeuivSUN +.type bluegl_glReplacementCodeuivSUN, %function +bluegl_glReplacementCodeuivSUN: + mov __blue_glCore_glReplacementCodeuivSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFramebufferTexture3DEXT -.type bluegl_glFramebufferTexture3DEXT, %function -bluegl_glFramebufferTexture3DEXT: - mov __blue_glCore_glFramebufferTexture3DEXT@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeusvSUN +.type bluegl_glReplacementCodeusvSUN, %function +bluegl_glReplacementCodeusvSUN: + mov __blue_glCore_glReplacementCodeusvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDrawElementsIndirect -.type bluegl_glDrawElementsIndirect, %function -bluegl_glDrawElementsIndirect: - mov __blue_glCore_glDrawElementsIndirect@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeubvSUN +.type bluegl_glReplacementCodeubvSUN, %function +bluegl_glReplacementCodeubvSUN: + mov __blue_glCore_glReplacementCodeubvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindBufferBaseEXT -.type bluegl_glBindBufferBaseEXT, %function -bluegl_glBindBufferBaseEXT: - mov __blue_glCore_glBindBufferBaseEXT@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodePointerSUN +.type bluegl_glReplacementCodePointerSUN, %function +bluegl_glReplacementCodePointerSUN: + mov __blue_glCore_glReplacementCodePointerSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glIglooInterfaceSGIX -.type bluegl_glIglooInterfaceSGIX, %function -bluegl_glIglooInterfaceSGIX: - mov __blue_glCore_glIglooInterfaceSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glColor4ubVertex2fSUN +.type bluegl_glColor4ubVertex2fSUN, %function +bluegl_glColor4ubVertex2fSUN: + mov __blue_glCore_glColor4ubVertex2fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMinmaxEXT -.type bluegl_glMinmaxEXT, %function -bluegl_glMinmaxEXT: - mov __blue_glCore_glMinmaxEXT@GOTPCREL(%rip), %r11 +.global bluegl_glColor4ubVertex2fvSUN +.type bluegl_glColor4ubVertex2fvSUN, %function +bluegl_glColor4ubVertex2fvSUN: + mov __blue_glCore_glColor4ubVertex2fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glClearDepthf -.type bluegl_glClearDepthf, %function -bluegl_glClearDepthf: - mov __blue_glCore_glClearDepthf@GOTPCREL(%rip), %r11 +.global bluegl_glColor4ubVertex3fSUN +.type bluegl_glColor4ubVertex3fSUN, %function +bluegl_glColor4ubVertex3fSUN: + mov __blue_glCore_glColor4ubVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReadnPixels -.type bluegl_glReadnPixels, %function -bluegl_glReadnPixels: - mov __blue_glCore_glReadnPixels@GOTPCREL(%rip), %r11 +.global bluegl_glColor4ubVertex3fvSUN +.type bluegl_glColor4ubVertex3fvSUN, %function +bluegl_glColor4ubVertex3fvSUN: + mov __blue_glCore_glColor4ubVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGenerateTextureMipmap -.type bluegl_glGenerateTextureMipmap, %function -bluegl_glGenerateTextureMipmap: - mov __blue_glCore_glGenerateTextureMipmap@GOTPCREL(%rip), %r11 +.global bluegl_glColor3fVertex3fSUN +.type bluegl_glColor3fVertex3fSUN, %function +bluegl_glColor3fVertex3fSUN: + mov __blue_glCore_glColor3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnPixelMapuivARB -.type bluegl_glGetnPixelMapuivARB, %function -bluegl_glGetnPixelMapuivARB: - mov __blue_glCore_glGetnPixelMapuivARB@GOTPCREL(%rip), %r11 +.global bluegl_glColor3fVertex3fvSUN +.type bluegl_glColor3fVertex3fvSUN, %function +bluegl_glColor3fVertex3fvSUN: + mov __blue_glCore_glColor3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramLocalParameter4fARB -.type bluegl_glProgramLocalParameter4fARB, %function -bluegl_glProgramLocalParameter4fARB: - mov __blue_glCore_glProgramLocalParameter4fARB@GOTPCREL(%rip), %r11 +.global bluegl_glNormal3fVertex3fSUN +.type bluegl_glNormal3fVertex3fSUN, %function +bluegl_glNormal3fVertex3fSUN: + mov __blue_glCore_glNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribL1dvEXT -.type bluegl_glVertexAttribL1dvEXT, %function -bluegl_glVertexAttribL1dvEXT: - mov __blue_glCore_glVertexAttribL1dvEXT@GOTPCREL(%rip), %r11 +.global bluegl_glNormal3fVertex3fvSUN +.type bluegl_glNormal3fVertex3fvSUN, %function +bluegl_glNormal3fVertex3fvSUN: + mov __blue_glCore_glNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBeginTransformFeedback -.type bluegl_glBeginTransformFeedback, %function -bluegl_glBeginTransformFeedback: - mov __blue_glCore_glBeginTransformFeedback@GOTPCREL(%rip), %r11 +.global bluegl_glColor4fNormal3fVertex3fSUN +.type bluegl_glColor4fNormal3fVertex3fSUN, %function +bluegl_glColor4fNormal3fVertex3fSUN: + mov __blue_glCore_glColor4fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glDepthBoundsEXT -.type bluegl_glDepthBoundsEXT, %function -bluegl_glDepthBoundsEXT: - mov __blue_glCore_glDepthBoundsEXT@GOTPCREL(%rip), %r11 +.global bluegl_glColor4fNormal3fVertex3fvSUN +.type bluegl_glColor4fNormal3fVertex3fvSUN, %function +bluegl_glColor4fNormal3fVertex3fvSUN: + mov __blue_glCore_glColor4fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib2f -.type bluegl_glVertexAttrib2f, %function -bluegl_glVertexAttrib2f: - mov __blue_glCore_glVertexAttrib2f@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord2fVertex3fSUN +.type bluegl_glTexCoord2fVertex3fSUN, %function +bluegl_glTexCoord2fVertex3fSUN: + mov __blue_glCore_glTexCoord2fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramEnvParametersI4ivNV -.type bluegl_glProgramEnvParametersI4ivNV, %function -bluegl_glProgramEnvParametersI4ivNV: - mov __blue_glCore_glProgramEnvParametersI4ivNV@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord2fVertex3fvSUN +.type bluegl_glTexCoord2fVertex3fvSUN, %function +bluegl_glTexCoord2fVertex3fvSUN: + mov __blue_glCore_glTexCoord2fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) .global bluegl_glTexCoord4fVertex4fSUN @@ -15289,176 +15300,164 @@ bluegl_glTexCoord4fVertex4fSUN: mov __blue_glCore_glTexCoord4fVertex4fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN -.type bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN, %function -bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN: - mov __blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glGetNamedProgramLocalParameterfvEXT -.type bluegl_glGetNamedProgramLocalParameterfvEXT, %function -bluegl_glGetNamedProgramLocalParameterfvEXT: - mov __blue_glCore_glGetNamedProgramLocalParameterfvEXT@GOTPCREL(%rip), %r11 - jmp *(%r11) - -.global bluegl_glProgramUniform1ui64ARB -.type bluegl_glProgramUniform1ui64ARB, %function -bluegl_glProgramUniform1ui64ARB: - mov __blue_glCore_glProgramUniform1ui64ARB@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord4fVertex4fvSUN +.type bluegl_glTexCoord4fVertex4fvSUN, %function +bluegl_glTexCoord4fVertex4fvSUN: + mov __blue_glCore_glTexCoord4fVertex4fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glReadInstrumentsSGIX -.type bluegl_glReadInstrumentsSGIX, %function -bluegl_glReadInstrumentsSGIX: - mov __blue_glCore_glReadInstrumentsSGIX@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord2fColor4ubVertex3fSUN +.type bluegl_glTexCoord2fColor4ubVertex3fSUN, %function +bluegl_glTexCoord2fColor4ubVertex3fSUN: + mov __blue_glCore_glTexCoord2fColor4ubVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib3dNV -.type bluegl_glVertexAttrib3dNV, %function -bluegl_glVertexAttrib3dNV: - mov __blue_glCore_glVertexAttrib3dNV@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord2fColor4ubVertex3fvSUN +.type bluegl_glTexCoord2fColor4ubVertex3fvSUN, %function +bluegl_glTexCoord2fColor4ubVertex3fvSUN: + mov __blue_glCore_glTexCoord2fColor4ubVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramParameter4dvNV -.type bluegl_glProgramParameter4dvNV, %function -bluegl_glProgramParameter4dvNV: - mov __blue_glCore_glProgramParameter4dvNV@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord2fColor3fVertex3fSUN +.type bluegl_glTexCoord2fColor3fVertex3fSUN, %function +bluegl_glTexCoord2fColor3fVertex3fSUN: + mov __blue_glCore_glTexCoord2fColor3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glColorTableParameterivSGI -.type bluegl_glColorTableParameterivSGI, %function -bluegl_glColorTableParameterivSGI: - mov __blue_glCore_glColorTableParameterivSGI@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord2fColor3fVertex3fvSUN +.type bluegl_glTexCoord2fColor3fVertex3fvSUN, %function +bluegl_glTexCoord2fColor3fVertex3fvSUN: + mov __blue_glCore_glTexCoord2fColor3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniform1f -.type bluegl_glUniform1f, %function -bluegl_glUniform1f: - mov __blue_glCore_glUniform1f@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord2fNormal3fVertex3fSUN +.type bluegl_glTexCoord2fNormal3fVertex3fSUN, %function +bluegl_glTexCoord2fNormal3fVertex3fSUN: + mov __blue_glCore_glTexCoord2fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexRenderbufferEXT -.type bluegl_glMultiTexRenderbufferEXT, %function -bluegl_glMultiTexRenderbufferEXT: - mov __blue_glCore_glMultiTexRenderbufferEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord2fNormal3fVertex3fvSUN +.type bluegl_glTexCoord2fNormal3fVertex3fvSUN, %function +bluegl_glTexCoord2fNormal3fVertex3fvSUN: + mov __blue_glCore_glTexCoord2fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribI4uiEXT -.type bluegl_glVertexAttribI4uiEXT, %function -bluegl_glVertexAttribI4uiEXT: - mov __blue_glCore_glVertexAttribI4uiEXT@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN +.type bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN, %function +bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN: + mov __blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetConvolutionParameterfv -.type bluegl_glGetConvolutionParameterfv, %function -bluegl_glGetConvolutionParameterfv: - mov __blue_glCore_glGetConvolutionParameterfv@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN +.type bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN, %function +bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN: + mov __blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord3sARB -.type bluegl_glMultiTexCoord3sARB, %function -bluegl_glMultiTexCoord3sARB: - mov __blue_glCore_glMultiTexCoord3sARB@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN +.type bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN, %function +bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN: + mov __blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetTexParameterxvOES -.type bluegl_glGetTexParameterxvOES, %function -bluegl_glGetTexParameterxvOES: - mov __blue_glCore_glGetTexParameterxvOES@GOTPCREL(%rip), %r11 +.global bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN +.type bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN, %function +bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN: + mov __blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetNamedBufferParameteriv -.type bluegl_glGetNamedBufferParameteriv, %function -bluegl_glGetNamedBufferParameteriv: - mov __blue_glCore_glGetNamedBufferParameteriv@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeuiVertex3fSUN +.type bluegl_glReplacementCodeuiVertex3fSUN, %function +bluegl_glReplacementCodeuiVertex3fSUN: + mov __blue_glCore_glReplacementCodeuiVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiDrawElementArrayAPPLE -.type bluegl_glMultiDrawElementArrayAPPLE, %function -bluegl_glMultiDrawElementArrayAPPLE: - mov __blue_glCore_glMultiDrawElementArrayAPPLE@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeuiVertex3fvSUN +.type bluegl_glReplacementCodeuiVertex3fvSUN, %function +bluegl_glReplacementCodeuiVertex3fvSUN: + mov __blue_glCore_glReplacementCodeuiVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glGetnConvolutionFilter -.type bluegl_glGetnConvolutionFilter, %function -bluegl_glGetnConvolutionFilter: - mov __blue_glCore_glGetnConvolutionFilter@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeuiColor4ubVertex3fSUN +.type bluegl_glReplacementCodeuiColor4ubVertex3fSUN, %function +bluegl_glReplacementCodeuiColor4ubVertex3fSUN: + mov __blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glUniformMatrix2x3fv -.type bluegl_glUniformMatrix2x3fv, %function -bluegl_glUniformMatrix2x3fv: - mov __blue_glCore_glUniformMatrix2x3fv@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeuiColor4ubVertex3fvSUN +.type bluegl_glReplacementCodeuiColor4ubVertex3fvSUN, %function +bluegl_glReplacementCodeuiColor4ubVertex3fvSUN: + mov __blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glBindBuffersRange -.type bluegl_glBindBuffersRange, %function -bluegl_glBindBuffersRange: - mov __blue_glCore_glBindBuffersRange@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeuiColor3fVertex3fSUN +.type bluegl_glReplacementCodeuiColor3fVertex3fSUN, %function +bluegl_glReplacementCodeuiColor3fVertex3fSUN: + mov __blue_glCore_glReplacementCodeuiColor3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMakeImageHandleNonResidentNV -.type bluegl_glMakeImageHandleNonResidentNV, %function -bluegl_glMakeImageHandleNonResidentNV: - mov __blue_glCore_glMakeImageHandleNonResidentNV@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeuiColor3fVertex3fvSUN +.type bluegl_glReplacementCodeuiColor3fVertex3fvSUN, %function +bluegl_glReplacementCodeuiColor3fVertex3fvSUN: + mov __blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFinalCombinerInputNV -.type bluegl_glFinalCombinerInputNV, %function -bluegl_glFinalCombinerInputNV: - mov __blue_glCore_glFinalCombinerInputNV@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeuiNormal3fVertex3fSUN +.type bluegl_glReplacementCodeuiNormal3fVertex3fSUN, %function +bluegl_glReplacementCodeuiNormal3fVertex3fSUN: + mov __blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glFlush -.type bluegl_glFlush, %function -bluegl_glFlush: - mov __blue_glCore_glFlush@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeuiNormal3fVertex3fvSUN +.type bluegl_glReplacementCodeuiNormal3fVertex3fvSUN, %function +bluegl_glReplacementCodeuiNormal3fVertex3fvSUN: + mov __blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexArrayElementBuffer -.type bluegl_glVertexArrayElementBuffer, %function -bluegl_glVertexArrayElementBuffer: - mov __blue_glCore_glVertexArrayElementBuffer@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN +.type bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN, %function +bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN: + mov __blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glProgramUniform4uiEXT -.type bluegl_glProgramUniform4uiEXT, %function -bluegl_glProgramUniform4uiEXT: - mov __blue_glCore_glProgramUniform4uiEXT@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN +.type bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN, %function +bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN: + mov __blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttrib4ubvNV -.type bluegl_glVertexAttrib4ubvNV, %function -bluegl_glVertexAttrib4ubvNV: - mov __blue_glCore_glVertexAttrib4ubvNV@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN +.type bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN, %function +bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN: + mov __blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glSampleMapATI -.type bluegl_glSampleMapATI, %function -bluegl_glSampleMapATI: - mov __blue_glCore_glSampleMapATI@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN +.type bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN, %function +bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN: + mov __blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glMultiTexCoord1bOES -.type bluegl_glMultiTexCoord1bOES, %function -bluegl_glMultiTexCoord1bOES: - mov __blue_glCore_glMultiTexCoord1bOES@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN +.type bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN, %function +bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN: + mov __blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glVertexAttribParameteriAMD -.type bluegl_glVertexAttribParameteriAMD, %function -bluegl_glVertexAttribParameteriAMD: - mov __blue_glCore_glVertexAttribParameteriAMD@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN +.type bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN, %function +bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN: + mov __blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glPointParameterfARB -.type bluegl_glPointParameterfARB, %function -bluegl_glPointParameterfARB: - mov __blue_glCore_glPointParameterfARB@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN +.type bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN, %function +bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN: + mov __blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN@GOTPCREL(%rip), %r11 jmp *(%r11) -.global bluegl_glWindowPos2dMESA -.type bluegl_glWindowPos2dMESA, %function -bluegl_glWindowPos2dMESA: - mov __blue_glCore_glWindowPos2dMESA@GOTPCREL(%rip), %r11 +.global bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN +.type bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN, %function +bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN: + mov __blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN@GOTPCREL(%rip), %r11 jmp *(%r11) diff --git a/libs/bluegl/src/BlueGLCoreWindows32Impl.cpp b/libs/bluegl/src/BlueGLCoreWindows32Impl.cpp new file mode 100644 index 00000000000..e001ff537d9 --- /dev/null +++ b/libs/bluegl/src/BlueGLCoreWindows32Impl.cpp @@ -0,0 +1,15474 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/********************************************************************************************** + * Generated by bluegl/bluegl-gen.py + * DO NOT EDIT + **********************************************************************************************/ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern void* __blue_glCore_glCullFace; +void APIENTRY bluegl_glCullFace (GLenum mode) { + typedef void (APIENTRYP PFN_glCullFace) (GLenum mode); + return ((PFN_glCullFace)__blue_glCore_glCullFace)(mode); +} + +extern void* __blue_glCore_glFrontFace; +void APIENTRY bluegl_glFrontFace (GLenum mode) { + typedef void (APIENTRYP PFN_glFrontFace) (GLenum mode); + return ((PFN_glFrontFace)__blue_glCore_glFrontFace)(mode); +} + +extern void* __blue_glCore_glHint; +void APIENTRY bluegl_glHint (GLenum target, GLenum mode) { + typedef void (APIENTRYP PFN_glHint) (GLenum target, GLenum mode); + return ((PFN_glHint)__blue_glCore_glHint)(target, mode); +} + +extern void* __blue_glCore_glLineWidth; +void APIENTRY bluegl_glLineWidth (GLfloat width) { + typedef void (APIENTRYP PFN_glLineWidth) (GLfloat width); + return ((PFN_glLineWidth)__blue_glCore_glLineWidth)(width); +} + +extern void* __blue_glCore_glPointSize; +void APIENTRY bluegl_glPointSize (GLfloat size) { + typedef void (APIENTRYP PFN_glPointSize) (GLfloat size); + return ((PFN_glPointSize)__blue_glCore_glPointSize)(size); +} + +extern void* __blue_glCore_glPolygonMode; +void APIENTRY bluegl_glPolygonMode (GLenum face, GLenum mode) { + typedef void (APIENTRYP PFN_glPolygonMode) (GLenum face, GLenum mode); + return ((PFN_glPolygonMode)__blue_glCore_glPolygonMode)(face, mode); +} + +extern void* __blue_glCore_glScissor; +void APIENTRY bluegl_glScissor (GLint x, GLint y, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glScissor) (GLint x, GLint y, GLsizei width, GLsizei height); + return ((PFN_glScissor)__blue_glCore_glScissor)(x, y, width, height); +} + +extern void* __blue_glCore_glTexParameterf; +void APIENTRY bluegl_glTexParameterf (GLenum target, GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glTexParameterf) (GLenum target, GLenum pname, GLfloat param); + return ((PFN_glTexParameterf)__blue_glCore_glTexParameterf)(target, pname, param); +} + +extern void* __blue_glCore_glTexParameterfv; +void APIENTRY bluegl_glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glTexParameterfv) (GLenum target, GLenum pname, const GLfloat *params); + return ((PFN_glTexParameterfv)__blue_glCore_glTexParameterfv)(target, pname, params); +} + +extern void* __blue_glCore_glTexParameteri; +void APIENTRY bluegl_glTexParameteri (GLenum target, GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glTexParameteri) (GLenum target, GLenum pname, GLint param); + return ((PFN_glTexParameteri)__blue_glCore_glTexParameteri)(target, pname, param); +} + +extern void* __blue_glCore_glTexParameteriv; +void APIENTRY bluegl_glTexParameteriv (GLenum target, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glTexParameteriv) (GLenum target, GLenum pname, const GLint *params); + return ((PFN_glTexParameteriv)__blue_glCore_glTexParameteriv)(target, pname, params); +} + +extern void* __blue_glCore_glTexImage1D; +void APIENTRY bluegl_glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels) { + typedef void (APIENTRYP PFN_glTexImage1D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTexImage1D)__blue_glCore_glTexImage1D)(target, level, internalformat, width, border, format, type, pixels); +} + +extern void* __blue_glCore_glTexImage2D; +void APIENTRY bluegl_glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels) { + typedef void (APIENTRYP PFN_glTexImage2D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTexImage2D)__blue_glCore_glTexImage2D)(target, level, internalformat, width, height, border, format, type, pixels); +} + +extern void* __blue_glCore_glDrawBuffer; +void APIENTRY bluegl_glDrawBuffer (GLenum buf) { + typedef void (APIENTRYP PFN_glDrawBuffer) (GLenum buf); + return ((PFN_glDrawBuffer)__blue_glCore_glDrawBuffer)(buf); +} + +extern void* __blue_glCore_glClear; +void APIENTRY bluegl_glClear (GLbitfield mask) { + typedef void (APIENTRYP PFN_glClear) (GLbitfield mask); + return ((PFN_glClear)__blue_glCore_glClear)(mask); +} + +extern void* __blue_glCore_glClearColor; +void APIENTRY bluegl_glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { + typedef void (APIENTRYP PFN_glClearColor) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); + return ((PFN_glClearColor)__blue_glCore_glClearColor)(red, green, blue, alpha); +} + +extern void* __blue_glCore_glClearStencil; +void APIENTRY bluegl_glClearStencil (GLint s) { + typedef void (APIENTRYP PFN_glClearStencil) (GLint s); + return ((PFN_glClearStencil)__blue_glCore_glClearStencil)(s); +} + +extern void* __blue_glCore_glClearDepth; +void APIENTRY bluegl_glClearDepth (GLdouble depth) { + typedef void (APIENTRYP PFN_glClearDepth) (GLdouble depth); + return ((PFN_glClearDepth)__blue_glCore_glClearDepth)(depth); +} + +extern void* __blue_glCore_glStencilMask; +void APIENTRY bluegl_glStencilMask (GLuint mask) { + typedef void (APIENTRYP PFN_glStencilMask) (GLuint mask); + return ((PFN_glStencilMask)__blue_glCore_glStencilMask)(mask); +} + +extern void* __blue_glCore_glColorMask; +void APIENTRY bluegl_glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) { + typedef void (APIENTRYP PFN_glColorMask) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); + return ((PFN_glColorMask)__blue_glCore_glColorMask)(red, green, blue, alpha); +} + +extern void* __blue_glCore_glDepthMask; +void APIENTRY bluegl_glDepthMask (GLboolean flag) { + typedef void (APIENTRYP PFN_glDepthMask) (GLboolean flag); + return ((PFN_glDepthMask)__blue_glCore_glDepthMask)(flag); +} + +extern void* __blue_glCore_glDisable; +void APIENTRY bluegl_glDisable (GLenum cap) { + typedef void (APIENTRYP PFN_glDisable) (GLenum cap); + return ((PFN_glDisable)__blue_glCore_glDisable)(cap); +} + +extern void* __blue_glCore_glEnable; +void APIENTRY bluegl_glEnable (GLenum cap) { + typedef void (APIENTRYP PFN_glEnable) (GLenum cap); + return ((PFN_glEnable)__blue_glCore_glEnable)(cap); +} + +extern void* __blue_glCore_glFinish; +void APIENTRY bluegl_glFinish (void) { + typedef void (APIENTRYP PFN_glFinish) (void); + return ((PFN_glFinish)__blue_glCore_glFinish)(); +} + +extern void* __blue_glCore_glFlush; +void APIENTRY bluegl_glFlush (void) { + typedef void (APIENTRYP PFN_glFlush) (void); + return ((PFN_glFlush)__blue_glCore_glFlush)(); +} + +extern void* __blue_glCore_glBlendFunc; +void APIENTRY bluegl_glBlendFunc (GLenum sfactor, GLenum dfactor) { + typedef void (APIENTRYP PFN_glBlendFunc) (GLenum sfactor, GLenum dfactor); + return ((PFN_glBlendFunc)__blue_glCore_glBlendFunc)(sfactor, dfactor); +} + +extern void* __blue_glCore_glLogicOp; +void APIENTRY bluegl_glLogicOp (GLenum opcode) { + typedef void (APIENTRYP PFN_glLogicOp) (GLenum opcode); + return ((PFN_glLogicOp)__blue_glCore_glLogicOp)(opcode); +} + +extern void* __blue_glCore_glStencilFunc; +void APIENTRY bluegl_glStencilFunc (GLenum func, GLint ref, GLuint mask) { + typedef void (APIENTRYP PFN_glStencilFunc) (GLenum func, GLint ref, GLuint mask); + return ((PFN_glStencilFunc)__blue_glCore_glStencilFunc)(func, ref, mask); +} + +extern void* __blue_glCore_glStencilOp; +void APIENTRY bluegl_glStencilOp (GLenum fail, GLenum zfail, GLenum zpass) { + typedef void (APIENTRYP PFN_glStencilOp) (GLenum fail, GLenum zfail, GLenum zpass); + return ((PFN_glStencilOp)__blue_glCore_glStencilOp)(fail, zfail, zpass); +} + +extern void* __blue_glCore_glDepthFunc; +void APIENTRY bluegl_glDepthFunc (GLenum func) { + typedef void (APIENTRYP PFN_glDepthFunc) (GLenum func); + return ((PFN_glDepthFunc)__blue_glCore_glDepthFunc)(func); +} + +extern void* __blue_glCore_glPixelStoref; +void APIENTRY bluegl_glPixelStoref (GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glPixelStoref) (GLenum pname, GLfloat param); + return ((PFN_glPixelStoref)__blue_glCore_glPixelStoref)(pname, param); +} + +extern void* __blue_glCore_glPixelStorei; +void APIENTRY bluegl_glPixelStorei (GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glPixelStorei) (GLenum pname, GLint param); + return ((PFN_glPixelStorei)__blue_glCore_glPixelStorei)(pname, param); +} + +extern void* __blue_glCore_glReadBuffer; +void APIENTRY bluegl_glReadBuffer (GLenum src) { + typedef void (APIENTRYP PFN_glReadBuffer) (GLenum src); + return ((PFN_glReadBuffer)__blue_glCore_glReadBuffer)(src); +} + +extern void* __blue_glCore_glReadPixels; +void APIENTRY bluegl_glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels) { + typedef void (APIENTRYP PFN_glReadPixels) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); + return ((PFN_glReadPixels)__blue_glCore_glReadPixels)(x, y, width, height, format, type, pixels); +} + +extern void* __blue_glCore_glGetBooleanv; +void APIENTRY bluegl_glGetBooleanv (GLenum pname, GLboolean *data) { + typedef void (APIENTRYP PFN_glGetBooleanv) (GLenum pname, GLboolean *data); + return ((PFN_glGetBooleanv)__blue_glCore_glGetBooleanv)(pname, data); +} + +extern void* __blue_glCore_glGetDoublev; +void APIENTRY bluegl_glGetDoublev (GLenum pname, GLdouble *data) { + typedef void (APIENTRYP PFN_glGetDoublev) (GLenum pname, GLdouble *data); + return ((PFN_glGetDoublev)__blue_glCore_glGetDoublev)(pname, data); +} + +extern void* __blue_glCore_glGetError; +GLenum APIENTRY bluegl_glGetError (void) { + typedef GLenum (APIENTRYP PFN_glGetError) (void); + return ((PFN_glGetError)__blue_glCore_glGetError)(); +} + +extern void* __blue_glCore_glGetFloatv; +void APIENTRY bluegl_glGetFloatv (GLenum pname, GLfloat *data) { + typedef void (APIENTRYP PFN_glGetFloatv) (GLenum pname, GLfloat *data); + return ((PFN_glGetFloatv)__blue_glCore_glGetFloatv)(pname, data); +} + +extern void* __blue_glCore_glGetIntegerv; +void APIENTRY bluegl_glGetIntegerv (GLenum pname, GLint *data) { + typedef void (APIENTRYP PFN_glGetIntegerv) (GLenum pname, GLint *data); + return ((PFN_glGetIntegerv)__blue_glCore_glGetIntegerv)(pname, data); +} + +extern void* __blue_glCore_glGetString; +const GLubyte *APIENTRY bluegl_glGetString (GLenum name) { + typedef const GLubyte *(APIENTRYP PFN_glGetString) (GLenum name); + return ((PFN_glGetString)__blue_glCore_glGetString)(name); +} + +extern void* __blue_glCore_glGetTexImage; +void APIENTRY bluegl_glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, void *pixels) { + typedef void (APIENTRYP PFN_glGetTexImage) (GLenum target, GLint level, GLenum format, GLenum type, void *pixels); + return ((PFN_glGetTexImage)__blue_glCore_glGetTexImage)(target, level, format, type, pixels); +} + +extern void* __blue_glCore_glGetTexParameterfv; +void APIENTRY bluegl_glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetTexParameterfv) (GLenum target, GLenum pname, GLfloat *params); + return ((PFN_glGetTexParameterfv)__blue_glCore_glGetTexParameterfv)(target, pname, params); +} + +extern void* __blue_glCore_glGetTexParameteriv; +void APIENTRY bluegl_glGetTexParameteriv (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetTexParameteriv) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetTexParameteriv)__blue_glCore_glGetTexParameteriv)(target, pname, params); +} + +extern void* __blue_glCore_glGetTexLevelParameterfv; +void APIENTRY bluegl_glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetTexLevelParameterfv) (GLenum target, GLint level, GLenum pname, GLfloat *params); + return ((PFN_glGetTexLevelParameterfv)__blue_glCore_glGetTexLevelParameterfv)(target, level, pname, params); +} + +extern void* __blue_glCore_glGetTexLevelParameteriv; +void APIENTRY bluegl_glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetTexLevelParameteriv) (GLenum target, GLint level, GLenum pname, GLint *params); + return ((PFN_glGetTexLevelParameteriv)__blue_glCore_glGetTexLevelParameteriv)(target, level, pname, params); +} + +extern void* __blue_glCore_glIsEnabled; +GLboolean APIENTRY bluegl_glIsEnabled (GLenum cap) { + typedef GLboolean (APIENTRYP PFN_glIsEnabled) (GLenum cap); + return ((PFN_glIsEnabled)__blue_glCore_glIsEnabled)(cap); +} + +extern void* __blue_glCore_glDepthRange; +void APIENTRY bluegl_glDepthRange (GLdouble near, GLdouble far) { + typedef void (APIENTRYP PFN_glDepthRange) (GLdouble near, GLdouble far); + return ((PFN_glDepthRange)__blue_glCore_glDepthRange)(near, far); +} + +extern void* __blue_glCore_glViewport; +void APIENTRY bluegl_glViewport (GLint x, GLint y, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glViewport) (GLint x, GLint y, GLsizei width, GLsizei height); + return ((PFN_glViewport)__blue_glCore_glViewport)(x, y, width, height); +} + +extern void* __blue_glCore_glDrawArrays; +void APIENTRY bluegl_glDrawArrays (GLenum mode, GLint first, GLsizei count) { + typedef void (APIENTRYP PFN_glDrawArrays) (GLenum mode, GLint first, GLsizei count); + return ((PFN_glDrawArrays)__blue_glCore_glDrawArrays)(mode, first, count); +} + +extern void* __blue_glCore_glDrawElements; +void APIENTRY bluegl_glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices) { + typedef void (APIENTRYP PFN_glDrawElements) (GLenum mode, GLsizei count, GLenum type, const void *indices); + return ((PFN_glDrawElements)__blue_glCore_glDrawElements)(mode, count, type, indices); +} + +extern void* __blue_glCore_glGetPointerv; +void APIENTRY bluegl_glGetPointerv (GLenum pname, void **params) { + typedef void (APIENTRYP PFN_glGetPointerv) (GLenum pname, void **params); + return ((PFN_glGetPointerv)__blue_glCore_glGetPointerv)(pname, params); +} + +extern void* __blue_glCore_glPolygonOffset; +void APIENTRY bluegl_glPolygonOffset (GLfloat factor, GLfloat units) { + typedef void (APIENTRYP PFN_glPolygonOffset) (GLfloat factor, GLfloat units); + return ((PFN_glPolygonOffset)__blue_glCore_glPolygonOffset)(factor, units); +} + +extern void* __blue_glCore_glCopyTexImage1D; +void APIENTRY bluegl_glCopyTexImage1D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) { + typedef void (APIENTRYP PFN_glCopyTexImage1D) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); + return ((PFN_glCopyTexImage1D)__blue_glCore_glCopyTexImage1D)(target, level, internalformat, x, y, width, border); +} + +extern void* __blue_glCore_glCopyTexImage2D; +void APIENTRY bluegl_glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { + typedef void (APIENTRYP PFN_glCopyTexImage2D) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); + return ((PFN_glCopyTexImage2D)__blue_glCore_glCopyTexImage2D)(target, level, internalformat, x, y, width, height, border); +} + +extern void* __blue_glCore_glCopyTexSubImage1D; +void APIENTRY bluegl_glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { + typedef void (APIENTRYP PFN_glCopyTexSubImage1D) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); + return ((PFN_glCopyTexSubImage1D)__blue_glCore_glCopyTexSubImage1D)(target, level, xoffset, x, y, width); +} + +extern void* __blue_glCore_glCopyTexSubImage2D; +void APIENTRY bluegl_glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glCopyTexSubImage2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); + return ((PFN_glCopyTexSubImage2D)__blue_glCore_glCopyTexSubImage2D)(target, level, xoffset, yoffset, x, y, width, height); +} + +extern void* __blue_glCore_glTexSubImage1D; +void APIENTRY bluegl_glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels) { + typedef void (APIENTRYP PFN_glTexSubImage1D) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTexSubImage1D)__blue_glCore_glTexSubImage1D)(target, level, xoffset, width, format, type, pixels); +} + +extern void* __blue_glCore_glTexSubImage2D; +void APIENTRY bluegl_glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) { + typedef void (APIENTRYP PFN_glTexSubImage2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTexSubImage2D)__blue_glCore_glTexSubImage2D)(target, level, xoffset, yoffset, width, height, format, type, pixels); +} + +extern void* __blue_glCore_glBindTexture; +void APIENTRY bluegl_glBindTexture (GLenum target, GLuint texture) { + typedef void (APIENTRYP PFN_glBindTexture) (GLenum target, GLuint texture); + return ((PFN_glBindTexture)__blue_glCore_glBindTexture)(target, texture); +} + +extern void* __blue_glCore_glDeleteTextures; +void APIENTRY bluegl_glDeleteTextures (GLsizei n, const GLuint *textures) { + typedef void (APIENTRYP PFN_glDeleteTextures) (GLsizei n, const GLuint *textures); + return ((PFN_glDeleteTextures)__blue_glCore_glDeleteTextures)(n, textures); +} + +extern void* __blue_glCore_glGenTextures; +void APIENTRY bluegl_glGenTextures (GLsizei n, GLuint *textures) { + typedef void (APIENTRYP PFN_glGenTextures) (GLsizei n, GLuint *textures); + return ((PFN_glGenTextures)__blue_glCore_glGenTextures)(n, textures); +} + +extern void* __blue_glCore_glIsTexture; +GLboolean APIENTRY bluegl_glIsTexture (GLuint texture) { + typedef GLboolean (APIENTRYP PFN_glIsTexture) (GLuint texture); + return ((PFN_glIsTexture)__blue_glCore_glIsTexture)(texture); +} + +extern void* __blue_glCore_glDrawRangeElements; +void APIENTRY bluegl_glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices) { + typedef void (APIENTRYP PFN_glDrawRangeElements) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); + return ((PFN_glDrawRangeElements)__blue_glCore_glDrawRangeElements)(mode, start, end, count, type, indices); +} + +extern void* __blue_glCore_glTexImage3D; +void APIENTRY bluegl_glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels) { + typedef void (APIENTRYP PFN_glTexImage3D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTexImage3D)__blue_glCore_glTexImage3D)(target, level, internalformat, width, height, depth, border, format, type, pixels); +} + +extern void* __blue_glCore_glTexSubImage3D; +void APIENTRY bluegl_glTexSubImage3D (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 PFN_glTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTexSubImage3D)__blue_glCore_glTexSubImage3D)(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); +} + +extern void* __blue_glCore_glCopyTexSubImage3D; +void APIENTRY bluegl_glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glCopyTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + return ((PFN_glCopyTexSubImage3D)__blue_glCore_glCopyTexSubImage3D)(target, level, xoffset, yoffset, zoffset, x, y, width, height); +} + +extern void* __blue_glCore_glActiveTexture; +void APIENTRY bluegl_glActiveTexture (GLenum texture) { + typedef void (APIENTRYP PFN_glActiveTexture) (GLenum texture); + return ((PFN_glActiveTexture)__blue_glCore_glActiveTexture)(texture); +} + +extern void* __blue_glCore_glSampleCoverage; +void APIENTRY bluegl_glSampleCoverage (GLfloat value, GLboolean invert) { + typedef void (APIENTRYP PFN_glSampleCoverage) (GLfloat value, GLboolean invert); + return ((PFN_glSampleCoverage)__blue_glCore_glSampleCoverage)(value, invert); +} + +extern void* __blue_glCore_glCompressedTexImage3D; +void APIENTRY bluegl_glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data) { + typedef void (APIENTRYP PFN_glCompressedTexImage3D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); + return ((PFN_glCompressedTexImage3D)__blue_glCore_glCompressedTexImage3D)(target, level, internalformat, width, height, depth, border, imageSize, data); +} + +extern void* __blue_glCore_glCompressedTexImage2D; +void APIENTRY bluegl_glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data) { + typedef void (APIENTRYP PFN_glCompressedTexImage2D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); + return ((PFN_glCompressedTexImage2D)__blue_glCore_glCompressedTexImage2D)(target, level, internalformat, width, height, border, imageSize, data); +} + +extern void* __blue_glCore_glCompressedTexImage1D; +void APIENTRY bluegl_glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data) { + typedef void (APIENTRYP PFN_glCompressedTexImage1D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); + return ((PFN_glCompressedTexImage1D)__blue_glCore_glCompressedTexImage1D)(target, level, internalformat, width, border, imageSize, data); +} + +extern void* __blue_glCore_glCompressedTexSubImage3D; +void APIENTRY bluegl_glCompressedTexSubImage3D (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 PFN_glCompressedTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); + return ((PFN_glCompressedTexSubImage3D)__blue_glCore_glCompressedTexSubImage3D)(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); +} + +extern void* __blue_glCore_glCompressedTexSubImage2D; +void APIENTRY bluegl_glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data) { + typedef void (APIENTRYP PFN_glCompressedTexSubImage2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); + return ((PFN_glCompressedTexSubImage2D)__blue_glCore_glCompressedTexSubImage2D)(target, level, xoffset, yoffset, width, height, format, imageSize, data); +} + +extern void* __blue_glCore_glCompressedTexSubImage1D; +void APIENTRY bluegl_glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data) { + typedef void (APIENTRYP PFN_glCompressedTexSubImage1D) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); + return ((PFN_glCompressedTexSubImage1D)__blue_glCore_glCompressedTexSubImage1D)(target, level, xoffset, width, format, imageSize, data); +} + +extern void* __blue_glCore_glGetCompressedTexImage; +void APIENTRY bluegl_glGetCompressedTexImage (GLenum target, GLint level, void *img) { + typedef void (APIENTRYP PFN_glGetCompressedTexImage) (GLenum target, GLint level, void *img); + return ((PFN_glGetCompressedTexImage)__blue_glCore_glGetCompressedTexImage)(target, level, img); +} + +extern void* __blue_glCore_glBlendFuncSeparate; +void APIENTRY bluegl_glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) { + typedef void (APIENTRYP PFN_glBlendFuncSeparate) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + return ((PFN_glBlendFuncSeparate)__blue_glCore_glBlendFuncSeparate)(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); +} + +extern void* __blue_glCore_glMultiDrawArrays; +void APIENTRY bluegl_glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount) { + typedef void (APIENTRYP PFN_glMultiDrawArrays) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); + return ((PFN_glMultiDrawArrays)__blue_glCore_glMultiDrawArrays)(mode, first, count, drawcount); +} + +extern void* __blue_glCore_glMultiDrawElements; +void APIENTRY bluegl_glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount) { + typedef void (APIENTRYP PFN_glMultiDrawElements) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); + return ((PFN_glMultiDrawElements)__blue_glCore_glMultiDrawElements)(mode, count, type, indices, drawcount); +} + +extern void* __blue_glCore_glPointParameterf; +void APIENTRY bluegl_glPointParameterf (GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glPointParameterf) (GLenum pname, GLfloat param); + return ((PFN_glPointParameterf)__blue_glCore_glPointParameterf)(pname, param); +} + +extern void* __blue_glCore_glPointParameterfv; +void APIENTRY bluegl_glPointParameterfv (GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glPointParameterfv) (GLenum pname, const GLfloat *params); + return ((PFN_glPointParameterfv)__blue_glCore_glPointParameterfv)(pname, params); +} + +extern void* __blue_glCore_glPointParameteri; +void APIENTRY bluegl_glPointParameteri (GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glPointParameteri) (GLenum pname, GLint param); + return ((PFN_glPointParameteri)__blue_glCore_glPointParameteri)(pname, param); +} + +extern void* __blue_glCore_glPointParameteriv; +void APIENTRY bluegl_glPointParameteriv (GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glPointParameteriv) (GLenum pname, const GLint *params); + return ((PFN_glPointParameteriv)__blue_glCore_glPointParameteriv)(pname, params); +} + +extern void* __blue_glCore_glBlendColor; +void APIENTRY bluegl_glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { + typedef void (APIENTRYP PFN_glBlendColor) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); + return ((PFN_glBlendColor)__blue_glCore_glBlendColor)(red, green, blue, alpha); +} + +extern void* __blue_glCore_glBlendEquation; +void APIENTRY bluegl_glBlendEquation (GLenum mode) { + typedef void (APIENTRYP PFN_glBlendEquation) (GLenum mode); + return ((PFN_glBlendEquation)__blue_glCore_glBlendEquation)(mode); +} + +extern void* __blue_glCore_glGenQueries; +void APIENTRY bluegl_glGenQueries (GLsizei n, GLuint *ids) { + typedef void (APIENTRYP PFN_glGenQueries) (GLsizei n, GLuint *ids); + return ((PFN_glGenQueries)__blue_glCore_glGenQueries)(n, ids); +} + +extern void* __blue_glCore_glDeleteQueries; +void APIENTRY bluegl_glDeleteQueries (GLsizei n, const GLuint *ids) { + typedef void (APIENTRYP PFN_glDeleteQueries) (GLsizei n, const GLuint *ids); + return ((PFN_glDeleteQueries)__blue_glCore_glDeleteQueries)(n, ids); +} + +extern void* __blue_glCore_glIsQuery; +GLboolean APIENTRY bluegl_glIsQuery (GLuint id) { + typedef GLboolean (APIENTRYP PFN_glIsQuery) (GLuint id); + return ((PFN_glIsQuery)__blue_glCore_glIsQuery)(id); +} + +extern void* __blue_glCore_glBeginQuery; +void APIENTRY bluegl_glBeginQuery (GLenum target, GLuint id) { + typedef void (APIENTRYP PFN_glBeginQuery) (GLenum target, GLuint id); + return ((PFN_glBeginQuery)__blue_glCore_glBeginQuery)(target, id); +} + +extern void* __blue_glCore_glEndQuery; +void APIENTRY bluegl_glEndQuery (GLenum target) { + typedef void (APIENTRYP PFN_glEndQuery) (GLenum target); + return ((PFN_glEndQuery)__blue_glCore_glEndQuery)(target); +} + +extern void* __blue_glCore_glGetQueryiv; +void APIENTRY bluegl_glGetQueryiv (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetQueryiv) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetQueryiv)__blue_glCore_glGetQueryiv)(target, pname, params); +} + +extern void* __blue_glCore_glGetQueryObjectiv; +void APIENTRY bluegl_glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetQueryObjectiv) (GLuint id, GLenum pname, GLint *params); + return ((PFN_glGetQueryObjectiv)__blue_glCore_glGetQueryObjectiv)(id, pname, params); +} + +extern void* __blue_glCore_glGetQueryObjectuiv; +void APIENTRY bluegl_glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params) { + typedef void (APIENTRYP PFN_glGetQueryObjectuiv) (GLuint id, GLenum pname, GLuint *params); + return ((PFN_glGetQueryObjectuiv)__blue_glCore_glGetQueryObjectuiv)(id, pname, params); +} + +extern void* __blue_glCore_glBindBuffer; +void APIENTRY bluegl_glBindBuffer (GLenum target, GLuint buffer) { + typedef void (APIENTRYP PFN_glBindBuffer) (GLenum target, GLuint buffer); + return ((PFN_glBindBuffer)__blue_glCore_glBindBuffer)(target, buffer); +} + +extern void* __blue_glCore_glDeleteBuffers; +void APIENTRY bluegl_glDeleteBuffers (GLsizei n, const GLuint *buffers) { + typedef void (APIENTRYP PFN_glDeleteBuffers) (GLsizei n, const GLuint *buffers); + return ((PFN_glDeleteBuffers)__blue_glCore_glDeleteBuffers)(n, buffers); +} + +extern void* __blue_glCore_glGenBuffers; +void APIENTRY bluegl_glGenBuffers (GLsizei n, GLuint *buffers) { + typedef void (APIENTRYP PFN_glGenBuffers) (GLsizei n, GLuint *buffers); + return ((PFN_glGenBuffers)__blue_glCore_glGenBuffers)(n, buffers); +} + +extern void* __blue_glCore_glIsBuffer; +GLboolean APIENTRY bluegl_glIsBuffer (GLuint buffer) { + typedef GLboolean (APIENTRYP PFN_glIsBuffer) (GLuint buffer); + return ((PFN_glIsBuffer)__blue_glCore_glIsBuffer)(buffer); +} + +extern void* __blue_glCore_glBufferData; +void APIENTRY bluegl_glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage) { + typedef void (APIENTRYP PFN_glBufferData) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); + return ((PFN_glBufferData)__blue_glCore_glBufferData)(target, size, data, usage); +} + +extern void* __blue_glCore_glBufferSubData; +void APIENTRY bluegl_glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data) { + typedef void (APIENTRYP PFN_glBufferSubData) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); + return ((PFN_glBufferSubData)__blue_glCore_glBufferSubData)(target, offset, size, data); +} + +extern void* __blue_glCore_glGetBufferSubData; +void APIENTRY bluegl_glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, void *data) { + typedef void (APIENTRYP PFN_glGetBufferSubData) (GLenum target, GLintptr offset, GLsizeiptr size, void *data); + return ((PFN_glGetBufferSubData)__blue_glCore_glGetBufferSubData)(target, offset, size, data); +} + +extern void* __blue_glCore_glMapBuffer; +void *APIENTRY bluegl_glMapBuffer (GLenum target, GLenum access) { + typedef void *(APIENTRYP PFN_glMapBuffer) (GLenum target, GLenum access); + return ((PFN_glMapBuffer)__blue_glCore_glMapBuffer)(target, access); +} + +extern void* __blue_glCore_glUnmapBuffer; +GLboolean APIENTRY bluegl_glUnmapBuffer (GLenum target) { + typedef GLboolean (APIENTRYP PFN_glUnmapBuffer) (GLenum target); + return ((PFN_glUnmapBuffer)__blue_glCore_glUnmapBuffer)(target); +} + +extern void* __blue_glCore_glGetBufferParameteriv; +void APIENTRY bluegl_glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetBufferParameteriv) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetBufferParameteriv)__blue_glCore_glGetBufferParameteriv)(target, pname, params); +} + +extern void* __blue_glCore_glGetBufferPointerv; +void APIENTRY bluegl_glGetBufferPointerv (GLenum target, GLenum pname, void **params) { + typedef void (APIENTRYP PFN_glGetBufferPointerv) (GLenum target, GLenum pname, void **params); + return ((PFN_glGetBufferPointerv)__blue_glCore_glGetBufferPointerv)(target, pname, params); +} + +extern void* __blue_glCore_glBlendEquationSeparate; +void APIENTRY bluegl_glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha) { + typedef void (APIENTRYP PFN_glBlendEquationSeparate) (GLenum modeRGB, GLenum modeAlpha); + return ((PFN_glBlendEquationSeparate)__blue_glCore_glBlendEquationSeparate)(modeRGB, modeAlpha); +} + +extern void* __blue_glCore_glDrawBuffers; +void APIENTRY bluegl_glDrawBuffers (GLsizei n, const GLenum *bufs) { + typedef void (APIENTRYP PFN_glDrawBuffers) (GLsizei n, const GLenum *bufs); + return ((PFN_glDrawBuffers)__blue_glCore_glDrawBuffers)(n, bufs); +} + +extern void* __blue_glCore_glStencilOpSeparate; +void APIENTRY bluegl_glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) { + typedef void (APIENTRYP PFN_glStencilOpSeparate) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); + return ((PFN_glStencilOpSeparate)__blue_glCore_glStencilOpSeparate)(face, sfail, dpfail, dppass); +} + +extern void* __blue_glCore_glStencilFuncSeparate; +void APIENTRY bluegl_glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask) { + typedef void (APIENTRYP PFN_glStencilFuncSeparate) (GLenum face, GLenum func, GLint ref, GLuint mask); + return ((PFN_glStencilFuncSeparate)__blue_glCore_glStencilFuncSeparate)(face, func, ref, mask); +} + +extern void* __blue_glCore_glStencilMaskSeparate; +void APIENTRY bluegl_glStencilMaskSeparate (GLenum face, GLuint mask) { + typedef void (APIENTRYP PFN_glStencilMaskSeparate) (GLenum face, GLuint mask); + return ((PFN_glStencilMaskSeparate)__blue_glCore_glStencilMaskSeparate)(face, mask); +} + +extern void* __blue_glCore_glAttachShader; +void APIENTRY bluegl_glAttachShader (GLuint program, GLuint shader) { + typedef void (APIENTRYP PFN_glAttachShader) (GLuint program, GLuint shader); + return ((PFN_glAttachShader)__blue_glCore_glAttachShader)(program, shader); +} + +extern void* __blue_glCore_glBindAttribLocation; +void APIENTRY bluegl_glBindAttribLocation (GLuint program, GLuint index, const GLchar *name) { + typedef void (APIENTRYP PFN_glBindAttribLocation) (GLuint program, GLuint index, const GLchar *name); + return ((PFN_glBindAttribLocation)__blue_glCore_glBindAttribLocation)(program, index, name); +} + +extern void* __blue_glCore_glCompileShader; +void APIENTRY bluegl_glCompileShader (GLuint shader) { + typedef void (APIENTRYP PFN_glCompileShader) (GLuint shader); + return ((PFN_glCompileShader)__blue_glCore_glCompileShader)(shader); +} + +extern void* __blue_glCore_glCreateProgram; +GLuint APIENTRY bluegl_glCreateProgram (void) { + typedef GLuint (APIENTRYP PFN_glCreateProgram) (void); + return ((PFN_glCreateProgram)__blue_glCore_glCreateProgram)(); +} + +extern void* __blue_glCore_glCreateShader; +GLuint APIENTRY bluegl_glCreateShader (GLenum type) { + typedef GLuint (APIENTRYP PFN_glCreateShader) (GLenum type); + return ((PFN_glCreateShader)__blue_glCore_glCreateShader)(type); +} + +extern void* __blue_glCore_glDeleteProgram; +void APIENTRY bluegl_glDeleteProgram (GLuint program) { + typedef void (APIENTRYP PFN_glDeleteProgram) (GLuint program); + return ((PFN_glDeleteProgram)__blue_glCore_glDeleteProgram)(program); +} + +extern void* __blue_glCore_glDeleteShader; +void APIENTRY bluegl_glDeleteShader (GLuint shader) { + typedef void (APIENTRYP PFN_glDeleteShader) (GLuint shader); + return ((PFN_glDeleteShader)__blue_glCore_glDeleteShader)(shader); +} + +extern void* __blue_glCore_glDetachShader; +void APIENTRY bluegl_glDetachShader (GLuint program, GLuint shader) { + typedef void (APIENTRYP PFN_glDetachShader) (GLuint program, GLuint shader); + return ((PFN_glDetachShader)__blue_glCore_glDetachShader)(program, shader); +} + +extern void* __blue_glCore_glDisableVertexAttribArray; +void APIENTRY bluegl_glDisableVertexAttribArray (GLuint index) { + typedef void (APIENTRYP PFN_glDisableVertexAttribArray) (GLuint index); + return ((PFN_glDisableVertexAttribArray)__blue_glCore_glDisableVertexAttribArray)(index); +} + +extern void* __blue_glCore_glEnableVertexAttribArray; +void APIENTRY bluegl_glEnableVertexAttribArray (GLuint index) { + typedef void (APIENTRYP PFN_glEnableVertexAttribArray) (GLuint index); + return ((PFN_glEnableVertexAttribArray)__blue_glCore_glEnableVertexAttribArray)(index); +} + +extern void* __blue_glCore_glGetActiveAttrib; +void APIENTRY bluegl_glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) { + typedef void (APIENTRYP PFN_glGetActiveAttrib) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); + return ((PFN_glGetActiveAttrib)__blue_glCore_glGetActiveAttrib)(program, index, bufSize, length, size, type, name); +} + +extern void* __blue_glCore_glGetActiveUniform; +void APIENTRY bluegl_glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) { + typedef void (APIENTRYP PFN_glGetActiveUniform) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); + return ((PFN_glGetActiveUniform)__blue_glCore_glGetActiveUniform)(program, index, bufSize, length, size, type, name); +} + +extern void* __blue_glCore_glGetAttachedShaders; +void APIENTRY bluegl_glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders) { + typedef void (APIENTRYP PFN_glGetAttachedShaders) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); + return ((PFN_glGetAttachedShaders)__blue_glCore_glGetAttachedShaders)(program, maxCount, count, shaders); +} + +extern void* __blue_glCore_glGetAttribLocation; +GLint APIENTRY bluegl_glGetAttribLocation (GLuint program, const GLchar *name) { + typedef GLint (APIENTRYP PFN_glGetAttribLocation) (GLuint program, const GLchar *name); + return ((PFN_glGetAttribLocation)__blue_glCore_glGetAttribLocation)(program, name); +} + +extern void* __blue_glCore_glGetProgramiv; +void APIENTRY bluegl_glGetProgramiv (GLuint program, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetProgramiv) (GLuint program, GLenum pname, GLint *params); + return ((PFN_glGetProgramiv)__blue_glCore_glGetProgramiv)(program, pname, params); +} + +extern void* __blue_glCore_glGetProgramInfoLog; +void APIENTRY bluegl_glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog) { + typedef void (APIENTRYP PFN_glGetProgramInfoLog) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); + return ((PFN_glGetProgramInfoLog)__blue_glCore_glGetProgramInfoLog)(program, bufSize, length, infoLog); +} + +extern void* __blue_glCore_glGetShaderiv; +void APIENTRY bluegl_glGetShaderiv (GLuint shader, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetShaderiv) (GLuint shader, GLenum pname, GLint *params); + return ((PFN_glGetShaderiv)__blue_glCore_glGetShaderiv)(shader, pname, params); +} + +extern void* __blue_glCore_glGetShaderInfoLog; +void APIENTRY bluegl_glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog) { + typedef void (APIENTRYP PFN_glGetShaderInfoLog) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); + return ((PFN_glGetShaderInfoLog)__blue_glCore_glGetShaderInfoLog)(shader, bufSize, length, infoLog); +} + +extern void* __blue_glCore_glGetShaderSource; +void APIENTRY bluegl_glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source) { + typedef void (APIENTRYP PFN_glGetShaderSource) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); + return ((PFN_glGetShaderSource)__blue_glCore_glGetShaderSource)(shader, bufSize, length, source); +} + +extern void* __blue_glCore_glGetUniformLocation; +GLint APIENTRY bluegl_glGetUniformLocation (GLuint program, const GLchar *name) { + typedef GLint (APIENTRYP PFN_glGetUniformLocation) (GLuint program, const GLchar *name); + return ((PFN_glGetUniformLocation)__blue_glCore_glGetUniformLocation)(program, name); +} + +extern void* __blue_glCore_glGetUniformfv; +void APIENTRY bluegl_glGetUniformfv (GLuint program, GLint location, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetUniformfv) (GLuint program, GLint location, GLfloat *params); + return ((PFN_glGetUniformfv)__blue_glCore_glGetUniformfv)(program, location, params); +} + +extern void* __blue_glCore_glGetUniformiv; +void APIENTRY bluegl_glGetUniformiv (GLuint program, GLint location, GLint *params) { + typedef void (APIENTRYP PFN_glGetUniformiv) (GLuint program, GLint location, GLint *params); + return ((PFN_glGetUniformiv)__blue_glCore_glGetUniformiv)(program, location, params); +} + +extern void* __blue_glCore_glGetVertexAttribdv; +void APIENTRY bluegl_glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribdv) (GLuint index, GLenum pname, GLdouble *params); + return ((PFN_glGetVertexAttribdv)__blue_glCore_glGetVertexAttribdv)(index, pname, params); +} + +extern void* __blue_glCore_glGetVertexAttribfv; +void APIENTRY bluegl_glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribfv) (GLuint index, GLenum pname, GLfloat *params); + return ((PFN_glGetVertexAttribfv)__blue_glCore_glGetVertexAttribfv)(index, pname, params); +} + +extern void* __blue_glCore_glGetVertexAttribiv; +void APIENTRY bluegl_glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribiv) (GLuint index, GLenum pname, GLint *params); + return ((PFN_glGetVertexAttribiv)__blue_glCore_glGetVertexAttribiv)(index, pname, params); +} + +extern void* __blue_glCore_glGetVertexAttribPointerv; +void APIENTRY bluegl_glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer) { + typedef void (APIENTRYP PFN_glGetVertexAttribPointerv) (GLuint index, GLenum pname, void **pointer); + return ((PFN_glGetVertexAttribPointerv)__blue_glCore_glGetVertexAttribPointerv)(index, pname, pointer); +} + +extern void* __blue_glCore_glIsProgram; +GLboolean APIENTRY bluegl_glIsProgram (GLuint program) { + typedef GLboolean (APIENTRYP PFN_glIsProgram) (GLuint program); + return ((PFN_glIsProgram)__blue_glCore_glIsProgram)(program); +} + +extern void* __blue_glCore_glIsShader; +GLboolean APIENTRY bluegl_glIsShader (GLuint shader) { + typedef GLboolean (APIENTRYP PFN_glIsShader) (GLuint shader); + return ((PFN_glIsShader)__blue_glCore_glIsShader)(shader); +} + +extern void* __blue_glCore_glLinkProgram; +void APIENTRY bluegl_glLinkProgram (GLuint program) { + typedef void (APIENTRYP PFN_glLinkProgram) (GLuint program); + return ((PFN_glLinkProgram)__blue_glCore_glLinkProgram)(program); +} + +extern void* __blue_glCore_glShaderSource; +void APIENTRY bluegl_glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length) { + typedef void (APIENTRYP PFN_glShaderSource) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); + return ((PFN_glShaderSource)__blue_glCore_glShaderSource)(shader, count, string, length); +} + +extern void* __blue_glCore_glUseProgram; +void APIENTRY bluegl_glUseProgram (GLuint program) { + typedef void (APIENTRYP PFN_glUseProgram) (GLuint program); + return ((PFN_glUseProgram)__blue_glCore_glUseProgram)(program); +} + +extern void* __blue_glCore_glUniform1f; +void APIENTRY bluegl_glUniform1f (GLint location, GLfloat v0) { + typedef void (APIENTRYP PFN_glUniform1f) (GLint location, GLfloat v0); + return ((PFN_glUniform1f)__blue_glCore_glUniform1f)(location, v0); +} + +extern void* __blue_glCore_glUniform2f; +void APIENTRY bluegl_glUniform2f (GLint location, GLfloat v0, GLfloat v1) { + typedef void (APIENTRYP PFN_glUniform2f) (GLint location, GLfloat v0, GLfloat v1); + return ((PFN_glUniform2f)__blue_glCore_glUniform2f)(location, v0, v1); +} + +extern void* __blue_glCore_glUniform3f; +void APIENTRY bluegl_glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2) { + typedef void (APIENTRYP PFN_glUniform3f) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); + return ((PFN_glUniform3f)__blue_glCore_glUniform3f)(location, v0, v1, v2); +} + +extern void* __blue_glCore_glUniform4f; +void APIENTRY bluegl_glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) { + typedef void (APIENTRYP PFN_glUniform4f) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); + return ((PFN_glUniform4f)__blue_glCore_glUniform4f)(location, v0, v1, v2, v3); +} + +extern void* __blue_glCore_glUniform1i; +void APIENTRY bluegl_glUniform1i (GLint location, GLint v0) { + typedef void (APIENTRYP PFN_glUniform1i) (GLint location, GLint v0); + return ((PFN_glUniform1i)__blue_glCore_glUniform1i)(location, v0); +} + +extern void* __blue_glCore_glUniform2i; +void APIENTRY bluegl_glUniform2i (GLint location, GLint v0, GLint v1) { + typedef void (APIENTRYP PFN_glUniform2i) (GLint location, GLint v0, GLint v1); + return ((PFN_glUniform2i)__blue_glCore_glUniform2i)(location, v0, v1); +} + +extern void* __blue_glCore_glUniform3i; +void APIENTRY bluegl_glUniform3i (GLint location, GLint v0, GLint v1, GLint v2) { + typedef void (APIENTRYP PFN_glUniform3i) (GLint location, GLint v0, GLint v1, GLint v2); + return ((PFN_glUniform3i)__blue_glCore_glUniform3i)(location, v0, v1, v2); +} + +extern void* __blue_glCore_glUniform4i; +void APIENTRY bluegl_glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3) { + typedef void (APIENTRYP PFN_glUniform4i) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); + return ((PFN_glUniform4i)__blue_glCore_glUniform4i)(location, v0, v1, v2, v3); +} + +extern void* __blue_glCore_glUniform1fv; +void APIENTRY bluegl_glUniform1fv (GLint location, GLsizei count, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniform1fv) (GLint location, GLsizei count, const GLfloat *value); + return ((PFN_glUniform1fv)__blue_glCore_glUniform1fv)(location, count, value); +} + +extern void* __blue_glCore_glUniform2fv; +void APIENTRY bluegl_glUniform2fv (GLint location, GLsizei count, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniform2fv) (GLint location, GLsizei count, const GLfloat *value); + return ((PFN_glUniform2fv)__blue_glCore_glUniform2fv)(location, count, value); +} + +extern void* __blue_glCore_glUniform3fv; +void APIENTRY bluegl_glUniform3fv (GLint location, GLsizei count, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniform3fv) (GLint location, GLsizei count, const GLfloat *value); + return ((PFN_glUniform3fv)__blue_glCore_glUniform3fv)(location, count, value); +} + +extern void* __blue_glCore_glUniform4fv; +void APIENTRY bluegl_glUniform4fv (GLint location, GLsizei count, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniform4fv) (GLint location, GLsizei count, const GLfloat *value); + return ((PFN_glUniform4fv)__blue_glCore_glUniform4fv)(location, count, value); +} + +extern void* __blue_glCore_glUniform1iv; +void APIENTRY bluegl_glUniform1iv (GLint location, GLsizei count, const GLint *value) { + typedef void (APIENTRYP PFN_glUniform1iv) (GLint location, GLsizei count, const GLint *value); + return ((PFN_glUniform1iv)__blue_glCore_glUniform1iv)(location, count, value); +} + +extern void* __blue_glCore_glUniform2iv; +void APIENTRY bluegl_glUniform2iv (GLint location, GLsizei count, const GLint *value) { + typedef void (APIENTRYP PFN_glUniform2iv) (GLint location, GLsizei count, const GLint *value); + return ((PFN_glUniform2iv)__blue_glCore_glUniform2iv)(location, count, value); +} + +extern void* __blue_glCore_glUniform3iv; +void APIENTRY bluegl_glUniform3iv (GLint location, GLsizei count, const GLint *value) { + typedef void (APIENTRYP PFN_glUniform3iv) (GLint location, GLsizei count, const GLint *value); + return ((PFN_glUniform3iv)__blue_glCore_glUniform3iv)(location, count, value); +} + +extern void* __blue_glCore_glUniform4iv; +void APIENTRY bluegl_glUniform4iv (GLint location, GLsizei count, const GLint *value) { + typedef void (APIENTRYP PFN_glUniform4iv) (GLint location, GLsizei count, const GLint *value); + return ((PFN_glUniform4iv)__blue_glCore_glUniform4iv)(location, count, value); +} + +extern void* __blue_glCore_glUniformMatrix2fv; +void APIENTRY bluegl_glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniformMatrix2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glUniformMatrix2fv)__blue_glCore_glUniformMatrix2fv)(location, count, transpose, value); +} + +extern void* __blue_glCore_glUniformMatrix3fv; +void APIENTRY bluegl_glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniformMatrix3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glUniformMatrix3fv)__blue_glCore_glUniformMatrix3fv)(location, count, transpose, value); +} + +extern void* __blue_glCore_glUniformMatrix4fv; +void APIENTRY bluegl_glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniformMatrix4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glUniformMatrix4fv)__blue_glCore_glUniformMatrix4fv)(location, count, transpose, value); +} + +extern void* __blue_glCore_glValidateProgram; +void APIENTRY bluegl_glValidateProgram (GLuint program) { + typedef void (APIENTRYP PFN_glValidateProgram) (GLuint program); + return ((PFN_glValidateProgram)__blue_glCore_glValidateProgram)(program); +} + +extern void* __blue_glCore_glVertexAttrib1d; +void APIENTRY bluegl_glVertexAttrib1d (GLuint index, GLdouble x) { + typedef void (APIENTRYP PFN_glVertexAttrib1d) (GLuint index, GLdouble x); + return ((PFN_glVertexAttrib1d)__blue_glCore_glVertexAttrib1d)(index, x); +} + +extern void* __blue_glCore_glVertexAttrib1dv; +void APIENTRY bluegl_glVertexAttrib1dv (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttrib1dv) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttrib1dv)__blue_glCore_glVertexAttrib1dv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib1f; +void APIENTRY bluegl_glVertexAttrib1f (GLuint index, GLfloat x) { + typedef void (APIENTRYP PFN_glVertexAttrib1f) (GLuint index, GLfloat x); + return ((PFN_glVertexAttrib1f)__blue_glCore_glVertexAttrib1f)(index, x); +} + +extern void* __blue_glCore_glVertexAttrib1fv; +void APIENTRY bluegl_glVertexAttrib1fv (GLuint index, const GLfloat *v) { + typedef void (APIENTRYP PFN_glVertexAttrib1fv) (GLuint index, const GLfloat *v); + return ((PFN_glVertexAttrib1fv)__blue_glCore_glVertexAttrib1fv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib1s; +void APIENTRY bluegl_glVertexAttrib1s (GLuint index, GLshort x) { + typedef void (APIENTRYP PFN_glVertexAttrib1s) (GLuint index, GLshort x); + return ((PFN_glVertexAttrib1s)__blue_glCore_glVertexAttrib1s)(index, x); +} + +extern void* __blue_glCore_glVertexAttrib1sv; +void APIENTRY bluegl_glVertexAttrib1sv (GLuint index, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttrib1sv) (GLuint index, const GLshort *v); + return ((PFN_glVertexAttrib1sv)__blue_glCore_glVertexAttrib1sv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib2d; +void APIENTRY bluegl_glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y) { + typedef void (APIENTRYP PFN_glVertexAttrib2d) (GLuint index, GLdouble x, GLdouble y); + return ((PFN_glVertexAttrib2d)__blue_glCore_glVertexAttrib2d)(index, x, y); +} + +extern void* __blue_glCore_glVertexAttrib2dv; +void APIENTRY bluegl_glVertexAttrib2dv (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttrib2dv) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttrib2dv)__blue_glCore_glVertexAttrib2dv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib2f; +void APIENTRY bluegl_glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y) { + typedef void (APIENTRYP PFN_glVertexAttrib2f) (GLuint index, GLfloat x, GLfloat y); + return ((PFN_glVertexAttrib2f)__blue_glCore_glVertexAttrib2f)(index, x, y); +} + +extern void* __blue_glCore_glVertexAttrib2fv; +void APIENTRY bluegl_glVertexAttrib2fv (GLuint index, const GLfloat *v) { + typedef void (APIENTRYP PFN_glVertexAttrib2fv) (GLuint index, const GLfloat *v); + return ((PFN_glVertexAttrib2fv)__blue_glCore_glVertexAttrib2fv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib2s; +void APIENTRY bluegl_glVertexAttrib2s (GLuint index, GLshort x, GLshort y) { + typedef void (APIENTRYP PFN_glVertexAttrib2s) (GLuint index, GLshort x, GLshort y); + return ((PFN_glVertexAttrib2s)__blue_glCore_glVertexAttrib2s)(index, x, y); +} + +extern void* __blue_glCore_glVertexAttrib2sv; +void APIENTRY bluegl_glVertexAttrib2sv (GLuint index, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttrib2sv) (GLuint index, const GLshort *v); + return ((PFN_glVertexAttrib2sv)__blue_glCore_glVertexAttrib2sv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib3d; +void APIENTRY bluegl_glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z) { + typedef void (APIENTRYP PFN_glVertexAttrib3d) (GLuint index, GLdouble x, GLdouble y, GLdouble z); + return ((PFN_glVertexAttrib3d)__blue_glCore_glVertexAttrib3d)(index, x, y, z); +} + +extern void* __blue_glCore_glVertexAttrib3dv; +void APIENTRY bluegl_glVertexAttrib3dv (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttrib3dv) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttrib3dv)__blue_glCore_glVertexAttrib3dv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib3f; +void APIENTRY bluegl_glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glVertexAttrib3f) (GLuint index, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glVertexAttrib3f)__blue_glCore_glVertexAttrib3f)(index, x, y, z); +} + +extern void* __blue_glCore_glVertexAttrib3fv; +void APIENTRY bluegl_glVertexAttrib3fv (GLuint index, const GLfloat *v) { + typedef void (APIENTRYP PFN_glVertexAttrib3fv) (GLuint index, const GLfloat *v); + return ((PFN_glVertexAttrib3fv)__blue_glCore_glVertexAttrib3fv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib3s; +void APIENTRY bluegl_glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z) { + typedef void (APIENTRYP PFN_glVertexAttrib3s) (GLuint index, GLshort x, GLshort y, GLshort z); + return ((PFN_glVertexAttrib3s)__blue_glCore_glVertexAttrib3s)(index, x, y, z); +} + +extern void* __blue_glCore_glVertexAttrib3sv; +void APIENTRY bluegl_glVertexAttrib3sv (GLuint index, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttrib3sv) (GLuint index, const GLshort *v); + return ((PFN_glVertexAttrib3sv)__blue_glCore_glVertexAttrib3sv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4Nbv; +void APIENTRY bluegl_glVertexAttrib4Nbv (GLuint index, const GLbyte *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4Nbv) (GLuint index, const GLbyte *v); + return ((PFN_glVertexAttrib4Nbv)__blue_glCore_glVertexAttrib4Nbv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4Niv; +void APIENTRY bluegl_glVertexAttrib4Niv (GLuint index, const GLint *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4Niv) (GLuint index, const GLint *v); + return ((PFN_glVertexAttrib4Niv)__blue_glCore_glVertexAttrib4Niv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4Nsv; +void APIENTRY bluegl_glVertexAttrib4Nsv (GLuint index, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4Nsv) (GLuint index, const GLshort *v); + return ((PFN_glVertexAttrib4Nsv)__blue_glCore_glVertexAttrib4Nsv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4Nub; +void APIENTRY bluegl_glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) { + typedef void (APIENTRYP PFN_glVertexAttrib4Nub) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); + return ((PFN_glVertexAttrib4Nub)__blue_glCore_glVertexAttrib4Nub)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttrib4Nubv; +void APIENTRY bluegl_glVertexAttrib4Nubv (GLuint index, const GLubyte *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4Nubv) (GLuint index, const GLubyte *v); + return ((PFN_glVertexAttrib4Nubv)__blue_glCore_glVertexAttrib4Nubv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4Nuiv; +void APIENTRY bluegl_glVertexAttrib4Nuiv (GLuint index, const GLuint *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4Nuiv) (GLuint index, const GLuint *v); + return ((PFN_glVertexAttrib4Nuiv)__blue_glCore_glVertexAttrib4Nuiv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4Nusv; +void APIENTRY bluegl_glVertexAttrib4Nusv (GLuint index, const GLushort *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4Nusv) (GLuint index, const GLushort *v); + return ((PFN_glVertexAttrib4Nusv)__blue_glCore_glVertexAttrib4Nusv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4bv; +void APIENTRY bluegl_glVertexAttrib4bv (GLuint index, const GLbyte *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4bv) (GLuint index, const GLbyte *v); + return ((PFN_glVertexAttrib4bv)__blue_glCore_glVertexAttrib4bv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4d; +void APIENTRY bluegl_glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { + typedef void (APIENTRYP PFN_glVertexAttrib4d) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + return ((PFN_glVertexAttrib4d)__blue_glCore_glVertexAttrib4d)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttrib4dv; +void APIENTRY bluegl_glVertexAttrib4dv (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4dv) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttrib4dv)__blue_glCore_glVertexAttrib4dv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4f; +void APIENTRY bluegl_glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { + typedef void (APIENTRYP PFN_glVertexAttrib4f) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + return ((PFN_glVertexAttrib4f)__blue_glCore_glVertexAttrib4f)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttrib4fv; +void APIENTRY bluegl_glVertexAttrib4fv (GLuint index, const GLfloat *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4fv) (GLuint index, const GLfloat *v); + return ((PFN_glVertexAttrib4fv)__blue_glCore_glVertexAttrib4fv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4iv; +void APIENTRY bluegl_glVertexAttrib4iv (GLuint index, const GLint *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4iv) (GLuint index, const GLint *v); + return ((PFN_glVertexAttrib4iv)__blue_glCore_glVertexAttrib4iv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4s; +void APIENTRY bluegl_glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) { + typedef void (APIENTRYP PFN_glVertexAttrib4s) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); + return ((PFN_glVertexAttrib4s)__blue_glCore_glVertexAttrib4s)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttrib4sv; +void APIENTRY bluegl_glVertexAttrib4sv (GLuint index, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4sv) (GLuint index, const GLshort *v); + return ((PFN_glVertexAttrib4sv)__blue_glCore_glVertexAttrib4sv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4ubv; +void APIENTRY bluegl_glVertexAttrib4ubv (GLuint index, const GLubyte *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4ubv) (GLuint index, const GLubyte *v); + return ((PFN_glVertexAttrib4ubv)__blue_glCore_glVertexAttrib4ubv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4uiv; +void APIENTRY bluegl_glVertexAttrib4uiv (GLuint index, const GLuint *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4uiv) (GLuint index, const GLuint *v); + return ((PFN_glVertexAttrib4uiv)__blue_glCore_glVertexAttrib4uiv)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4usv; +void APIENTRY bluegl_glVertexAttrib4usv (GLuint index, const GLushort *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4usv) (GLuint index, const GLushort *v); + return ((PFN_glVertexAttrib4usv)__blue_glCore_glVertexAttrib4usv)(index, v); +} + +extern void* __blue_glCore_glVertexAttribPointer; +void APIENTRY bluegl_glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer) { + typedef void (APIENTRYP PFN_glVertexAttribPointer) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); + return ((PFN_glVertexAttribPointer)__blue_glCore_glVertexAttribPointer)(index, size, type, normalized, stride, pointer); +} + +extern void* __blue_glCore_glUniformMatrix2x3fv; +void APIENTRY bluegl_glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniformMatrix2x3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glUniformMatrix2x3fv)__blue_glCore_glUniformMatrix2x3fv)(location, count, transpose, value); +} + +extern void* __blue_glCore_glUniformMatrix3x2fv; +void APIENTRY bluegl_glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniformMatrix3x2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glUniformMatrix3x2fv)__blue_glCore_glUniformMatrix3x2fv)(location, count, transpose, value); +} + +extern void* __blue_glCore_glUniformMatrix2x4fv; +void APIENTRY bluegl_glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniformMatrix2x4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glUniformMatrix2x4fv)__blue_glCore_glUniformMatrix2x4fv)(location, count, transpose, value); +} + +extern void* __blue_glCore_glUniformMatrix4x2fv; +void APIENTRY bluegl_glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniformMatrix4x2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glUniformMatrix4x2fv)__blue_glCore_glUniformMatrix4x2fv)(location, count, transpose, value); +} + +extern void* __blue_glCore_glUniformMatrix3x4fv; +void APIENTRY bluegl_glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniformMatrix3x4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glUniformMatrix3x4fv)__blue_glCore_glUniformMatrix3x4fv)(location, count, transpose, value); +} + +extern void* __blue_glCore_glUniformMatrix4x3fv; +void APIENTRY bluegl_glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniformMatrix4x3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glUniformMatrix4x3fv)__blue_glCore_glUniformMatrix4x3fv)(location, count, transpose, value); +} + +extern void* __blue_glCore_glColorMaski; +void APIENTRY bluegl_glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) { + typedef void (APIENTRYP PFN_glColorMaski) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); + return ((PFN_glColorMaski)__blue_glCore_glColorMaski)(index, r, g, b, a); +} + +extern void* __blue_glCore_glGetBooleani_v; +void APIENTRY bluegl_glGetBooleani_v (GLenum target, GLuint index, GLboolean *data) { + typedef void (APIENTRYP PFN_glGetBooleani_v) (GLenum target, GLuint index, GLboolean *data); + return ((PFN_glGetBooleani_v)__blue_glCore_glGetBooleani_v)(target, index, data); +} + +extern void* __blue_glCore_glGetIntegeri_v; +void APIENTRY bluegl_glGetIntegeri_v (GLenum target, GLuint index, GLint *data) { + typedef void (APIENTRYP PFN_glGetIntegeri_v) (GLenum target, GLuint index, GLint *data); + return ((PFN_glGetIntegeri_v)__blue_glCore_glGetIntegeri_v)(target, index, data); +} + +extern void* __blue_glCore_glEnablei; +void APIENTRY bluegl_glEnablei (GLenum target, GLuint index) { + typedef void (APIENTRYP PFN_glEnablei) (GLenum target, GLuint index); + return ((PFN_glEnablei)__blue_glCore_glEnablei)(target, index); +} + +extern void* __blue_glCore_glDisablei; +void APIENTRY bluegl_glDisablei (GLenum target, GLuint index) { + typedef void (APIENTRYP PFN_glDisablei) (GLenum target, GLuint index); + return ((PFN_glDisablei)__blue_glCore_glDisablei)(target, index); +} + +extern void* __blue_glCore_glIsEnabledi; +GLboolean APIENTRY bluegl_glIsEnabledi (GLenum target, GLuint index) { + typedef GLboolean (APIENTRYP PFN_glIsEnabledi) (GLenum target, GLuint index); + return ((PFN_glIsEnabledi)__blue_glCore_glIsEnabledi)(target, index); +} + +extern void* __blue_glCore_glBeginTransformFeedback; +void APIENTRY bluegl_glBeginTransformFeedback (GLenum primitiveMode) { + typedef void (APIENTRYP PFN_glBeginTransformFeedback) (GLenum primitiveMode); + return ((PFN_glBeginTransformFeedback)__blue_glCore_glBeginTransformFeedback)(primitiveMode); +} + +extern void* __blue_glCore_glEndTransformFeedback; +void APIENTRY bluegl_glEndTransformFeedback (void) { + typedef void (APIENTRYP PFN_glEndTransformFeedback) (void); + return ((PFN_glEndTransformFeedback)__blue_glCore_glEndTransformFeedback)(); +} + +extern void* __blue_glCore_glBindBufferRange; +void APIENTRY bluegl_glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { + typedef void (APIENTRYP PFN_glBindBufferRange) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); + return ((PFN_glBindBufferRange)__blue_glCore_glBindBufferRange)(target, index, buffer, offset, size); +} + +extern void* __blue_glCore_glBindBufferBase; +void APIENTRY bluegl_glBindBufferBase (GLenum target, GLuint index, GLuint buffer) { + typedef void (APIENTRYP PFN_glBindBufferBase) (GLenum target, GLuint index, GLuint buffer); + return ((PFN_glBindBufferBase)__blue_glCore_glBindBufferBase)(target, index, buffer); +} + +extern void* __blue_glCore_glTransformFeedbackVaryings; +void APIENTRY bluegl_glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode) { + typedef void (APIENTRYP PFN_glTransformFeedbackVaryings) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); + return ((PFN_glTransformFeedbackVaryings)__blue_glCore_glTransformFeedbackVaryings)(program, count, varyings, bufferMode); +} + +extern void* __blue_glCore_glGetTransformFeedbackVarying; +void APIENTRY bluegl_glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name) { + typedef void (APIENTRYP PFN_glGetTransformFeedbackVarying) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); + return ((PFN_glGetTransformFeedbackVarying)__blue_glCore_glGetTransformFeedbackVarying)(program, index, bufSize, length, size, type, name); +} + +extern void* __blue_glCore_glClampColor; +void APIENTRY bluegl_glClampColor (GLenum target, GLenum clamp) { + typedef void (APIENTRYP PFN_glClampColor) (GLenum target, GLenum clamp); + return ((PFN_glClampColor)__blue_glCore_glClampColor)(target, clamp); +} + +extern void* __blue_glCore_glBeginConditionalRender; +void APIENTRY bluegl_glBeginConditionalRender (GLuint id, GLenum mode) { + typedef void (APIENTRYP PFN_glBeginConditionalRender) (GLuint id, GLenum mode); + return ((PFN_glBeginConditionalRender)__blue_glCore_glBeginConditionalRender)(id, mode); +} + +extern void* __blue_glCore_glEndConditionalRender; +void APIENTRY bluegl_glEndConditionalRender (void) { + typedef void (APIENTRYP PFN_glEndConditionalRender) (void); + return ((PFN_glEndConditionalRender)__blue_glCore_glEndConditionalRender)(); +} + +extern void* __blue_glCore_glVertexAttribIPointer; +void APIENTRY bluegl_glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer) { + typedef void (APIENTRYP PFN_glVertexAttribIPointer) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); + return ((PFN_glVertexAttribIPointer)__blue_glCore_glVertexAttribIPointer)(index, size, type, stride, pointer); +} + +extern void* __blue_glCore_glGetVertexAttribIiv; +void APIENTRY bluegl_glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribIiv) (GLuint index, GLenum pname, GLint *params); + return ((PFN_glGetVertexAttribIiv)__blue_glCore_glGetVertexAttribIiv)(index, pname, params); +} + +extern void* __blue_glCore_glGetVertexAttribIuiv; +void APIENTRY bluegl_glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribIuiv) (GLuint index, GLenum pname, GLuint *params); + return ((PFN_glGetVertexAttribIuiv)__blue_glCore_glGetVertexAttribIuiv)(index, pname, params); +} + +extern void* __blue_glCore_glVertexAttribI1i; +void APIENTRY bluegl_glVertexAttribI1i (GLuint index, GLint x) { + typedef void (APIENTRYP PFN_glVertexAttribI1i) (GLuint index, GLint x); + return ((PFN_glVertexAttribI1i)__blue_glCore_glVertexAttribI1i)(index, x); +} + +extern void* __blue_glCore_glVertexAttribI2i; +void APIENTRY bluegl_glVertexAttribI2i (GLuint index, GLint x, GLint y) { + typedef void (APIENTRYP PFN_glVertexAttribI2i) (GLuint index, GLint x, GLint y); + return ((PFN_glVertexAttribI2i)__blue_glCore_glVertexAttribI2i)(index, x, y); +} + +extern void* __blue_glCore_glVertexAttribI3i; +void APIENTRY bluegl_glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z) { + typedef void (APIENTRYP PFN_glVertexAttribI3i) (GLuint index, GLint x, GLint y, GLint z); + return ((PFN_glVertexAttribI3i)__blue_glCore_glVertexAttribI3i)(index, x, y, z); +} + +extern void* __blue_glCore_glVertexAttribI4i; +void APIENTRY bluegl_glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w) { + typedef void (APIENTRYP PFN_glVertexAttribI4i) (GLuint index, GLint x, GLint y, GLint z, GLint w); + return ((PFN_glVertexAttribI4i)__blue_glCore_glVertexAttribI4i)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttribI1ui; +void APIENTRY bluegl_glVertexAttribI1ui (GLuint index, GLuint x) { + typedef void (APIENTRYP PFN_glVertexAttribI1ui) (GLuint index, GLuint x); + return ((PFN_glVertexAttribI1ui)__blue_glCore_glVertexAttribI1ui)(index, x); +} + +extern void* __blue_glCore_glVertexAttribI2ui; +void APIENTRY bluegl_glVertexAttribI2ui (GLuint index, GLuint x, GLuint y) { + typedef void (APIENTRYP PFN_glVertexAttribI2ui) (GLuint index, GLuint x, GLuint y); + return ((PFN_glVertexAttribI2ui)__blue_glCore_glVertexAttribI2ui)(index, x, y); +} + +extern void* __blue_glCore_glVertexAttribI3ui; +void APIENTRY bluegl_glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z) { + typedef void (APIENTRYP PFN_glVertexAttribI3ui) (GLuint index, GLuint x, GLuint y, GLuint z); + return ((PFN_glVertexAttribI3ui)__blue_glCore_glVertexAttribI3ui)(index, x, y, z); +} + +extern void* __blue_glCore_glVertexAttribI4ui; +void APIENTRY bluegl_glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) { + typedef void (APIENTRYP PFN_glVertexAttribI4ui) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); + return ((PFN_glVertexAttribI4ui)__blue_glCore_glVertexAttribI4ui)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttribI1iv; +void APIENTRY bluegl_glVertexAttribI1iv (GLuint index, const GLint *v) { + typedef void (APIENTRYP PFN_glVertexAttribI1iv) (GLuint index, const GLint *v); + return ((PFN_glVertexAttribI1iv)__blue_glCore_glVertexAttribI1iv)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI2iv; +void APIENTRY bluegl_glVertexAttribI2iv (GLuint index, const GLint *v) { + typedef void (APIENTRYP PFN_glVertexAttribI2iv) (GLuint index, const GLint *v); + return ((PFN_glVertexAttribI2iv)__blue_glCore_glVertexAttribI2iv)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI3iv; +void APIENTRY bluegl_glVertexAttribI3iv (GLuint index, const GLint *v) { + typedef void (APIENTRYP PFN_glVertexAttribI3iv) (GLuint index, const GLint *v); + return ((PFN_glVertexAttribI3iv)__blue_glCore_glVertexAttribI3iv)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI4iv; +void APIENTRY bluegl_glVertexAttribI4iv (GLuint index, const GLint *v) { + typedef void (APIENTRYP PFN_glVertexAttribI4iv) (GLuint index, const GLint *v); + return ((PFN_glVertexAttribI4iv)__blue_glCore_glVertexAttribI4iv)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI1uiv; +void APIENTRY bluegl_glVertexAttribI1uiv (GLuint index, const GLuint *v) { + typedef void (APIENTRYP PFN_glVertexAttribI1uiv) (GLuint index, const GLuint *v); + return ((PFN_glVertexAttribI1uiv)__blue_glCore_glVertexAttribI1uiv)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI2uiv; +void APIENTRY bluegl_glVertexAttribI2uiv (GLuint index, const GLuint *v) { + typedef void (APIENTRYP PFN_glVertexAttribI2uiv) (GLuint index, const GLuint *v); + return ((PFN_glVertexAttribI2uiv)__blue_glCore_glVertexAttribI2uiv)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI3uiv; +void APIENTRY bluegl_glVertexAttribI3uiv (GLuint index, const GLuint *v) { + typedef void (APIENTRYP PFN_glVertexAttribI3uiv) (GLuint index, const GLuint *v); + return ((PFN_glVertexAttribI3uiv)__blue_glCore_glVertexAttribI3uiv)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI4uiv; +void APIENTRY bluegl_glVertexAttribI4uiv (GLuint index, const GLuint *v) { + typedef void (APIENTRYP PFN_glVertexAttribI4uiv) (GLuint index, const GLuint *v); + return ((PFN_glVertexAttribI4uiv)__blue_glCore_glVertexAttribI4uiv)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI4bv; +void APIENTRY bluegl_glVertexAttribI4bv (GLuint index, const GLbyte *v) { + typedef void (APIENTRYP PFN_glVertexAttribI4bv) (GLuint index, const GLbyte *v); + return ((PFN_glVertexAttribI4bv)__blue_glCore_glVertexAttribI4bv)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI4sv; +void APIENTRY bluegl_glVertexAttribI4sv (GLuint index, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttribI4sv) (GLuint index, const GLshort *v); + return ((PFN_glVertexAttribI4sv)__blue_glCore_glVertexAttribI4sv)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI4ubv; +void APIENTRY bluegl_glVertexAttribI4ubv (GLuint index, const GLubyte *v) { + typedef void (APIENTRYP PFN_glVertexAttribI4ubv) (GLuint index, const GLubyte *v); + return ((PFN_glVertexAttribI4ubv)__blue_glCore_glVertexAttribI4ubv)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI4usv; +void APIENTRY bluegl_glVertexAttribI4usv (GLuint index, const GLushort *v) { + typedef void (APIENTRYP PFN_glVertexAttribI4usv) (GLuint index, const GLushort *v); + return ((PFN_glVertexAttribI4usv)__blue_glCore_glVertexAttribI4usv)(index, v); +} + +extern void* __blue_glCore_glGetUniformuiv; +void APIENTRY bluegl_glGetUniformuiv (GLuint program, GLint location, GLuint *params) { + typedef void (APIENTRYP PFN_glGetUniformuiv) (GLuint program, GLint location, GLuint *params); + return ((PFN_glGetUniformuiv)__blue_glCore_glGetUniformuiv)(program, location, params); +} + +extern void* __blue_glCore_glBindFragDataLocation; +void APIENTRY bluegl_glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name) { + typedef void (APIENTRYP PFN_glBindFragDataLocation) (GLuint program, GLuint color, const GLchar *name); + return ((PFN_glBindFragDataLocation)__blue_glCore_glBindFragDataLocation)(program, color, name); +} + +extern void* __blue_glCore_glGetFragDataLocation; +GLint APIENTRY bluegl_glGetFragDataLocation (GLuint program, const GLchar *name) { + typedef GLint (APIENTRYP PFN_glGetFragDataLocation) (GLuint program, const GLchar *name); + return ((PFN_glGetFragDataLocation)__blue_glCore_glGetFragDataLocation)(program, name); +} + +extern void* __blue_glCore_glUniform1ui; +void APIENTRY bluegl_glUniform1ui (GLint location, GLuint v0) { + typedef void (APIENTRYP PFN_glUniform1ui) (GLint location, GLuint v0); + return ((PFN_glUniform1ui)__blue_glCore_glUniform1ui)(location, v0); +} + +extern void* __blue_glCore_glUniform2ui; +void APIENTRY bluegl_glUniform2ui (GLint location, GLuint v0, GLuint v1) { + typedef void (APIENTRYP PFN_glUniform2ui) (GLint location, GLuint v0, GLuint v1); + return ((PFN_glUniform2ui)__blue_glCore_glUniform2ui)(location, v0, v1); +} + +extern void* __blue_glCore_glUniform3ui; +void APIENTRY bluegl_glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2) { + typedef void (APIENTRYP PFN_glUniform3ui) (GLint location, GLuint v0, GLuint v1, GLuint v2); + return ((PFN_glUniform3ui)__blue_glCore_glUniform3ui)(location, v0, v1, v2); +} + +extern void* __blue_glCore_glUniform4ui; +void APIENTRY bluegl_glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) { + typedef void (APIENTRYP PFN_glUniform4ui) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); + return ((PFN_glUniform4ui)__blue_glCore_glUniform4ui)(location, v0, v1, v2, v3); +} + +extern void* __blue_glCore_glUniform1uiv; +void APIENTRY bluegl_glUniform1uiv (GLint location, GLsizei count, const GLuint *value) { + typedef void (APIENTRYP PFN_glUniform1uiv) (GLint location, GLsizei count, const GLuint *value); + return ((PFN_glUniform1uiv)__blue_glCore_glUniform1uiv)(location, count, value); +} + +extern void* __blue_glCore_glUniform2uiv; +void APIENTRY bluegl_glUniform2uiv (GLint location, GLsizei count, const GLuint *value) { + typedef void (APIENTRYP PFN_glUniform2uiv) (GLint location, GLsizei count, const GLuint *value); + return ((PFN_glUniform2uiv)__blue_glCore_glUniform2uiv)(location, count, value); +} + +extern void* __blue_glCore_glUniform3uiv; +void APIENTRY bluegl_glUniform3uiv (GLint location, GLsizei count, const GLuint *value) { + typedef void (APIENTRYP PFN_glUniform3uiv) (GLint location, GLsizei count, const GLuint *value); + return ((PFN_glUniform3uiv)__blue_glCore_glUniform3uiv)(location, count, value); +} + +extern void* __blue_glCore_glUniform4uiv; +void APIENTRY bluegl_glUniform4uiv (GLint location, GLsizei count, const GLuint *value) { + typedef void (APIENTRYP PFN_glUniform4uiv) (GLint location, GLsizei count, const GLuint *value); + return ((PFN_glUniform4uiv)__blue_glCore_glUniform4uiv)(location, count, value); +} + +extern void* __blue_glCore_glTexParameterIiv; +void APIENTRY bluegl_glTexParameterIiv (GLenum target, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glTexParameterIiv) (GLenum target, GLenum pname, const GLint *params); + return ((PFN_glTexParameterIiv)__blue_glCore_glTexParameterIiv)(target, pname, params); +} + +extern void* __blue_glCore_glTexParameterIuiv; +void APIENTRY bluegl_glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params) { + typedef void (APIENTRYP PFN_glTexParameterIuiv) (GLenum target, GLenum pname, const GLuint *params); + return ((PFN_glTexParameterIuiv)__blue_glCore_glTexParameterIuiv)(target, pname, params); +} + +extern void* __blue_glCore_glGetTexParameterIiv; +void APIENTRY bluegl_glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetTexParameterIiv) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetTexParameterIiv)__blue_glCore_glGetTexParameterIiv)(target, pname, params); +} + +extern void* __blue_glCore_glGetTexParameterIuiv; +void APIENTRY bluegl_glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params) { + typedef void (APIENTRYP PFN_glGetTexParameterIuiv) (GLenum target, GLenum pname, GLuint *params); + return ((PFN_glGetTexParameterIuiv)__blue_glCore_glGetTexParameterIuiv)(target, pname, params); +} + +extern void* __blue_glCore_glClearBufferiv; +void APIENTRY bluegl_glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value) { + typedef void (APIENTRYP PFN_glClearBufferiv) (GLenum buffer, GLint drawbuffer, const GLint *value); + return ((PFN_glClearBufferiv)__blue_glCore_glClearBufferiv)(buffer, drawbuffer, value); +} + +extern void* __blue_glCore_glClearBufferuiv; +void APIENTRY bluegl_glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value) { + typedef void (APIENTRYP PFN_glClearBufferuiv) (GLenum buffer, GLint drawbuffer, const GLuint *value); + return ((PFN_glClearBufferuiv)__blue_glCore_glClearBufferuiv)(buffer, drawbuffer, value); +} + +extern void* __blue_glCore_glClearBufferfv; +void APIENTRY bluegl_glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value) { + typedef void (APIENTRYP PFN_glClearBufferfv) (GLenum buffer, GLint drawbuffer, const GLfloat *value); + return ((PFN_glClearBufferfv)__blue_glCore_glClearBufferfv)(buffer, drawbuffer, value); +} + +extern void* __blue_glCore_glClearBufferfi; +void APIENTRY bluegl_glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) { + typedef void (APIENTRYP PFN_glClearBufferfi) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); + return ((PFN_glClearBufferfi)__blue_glCore_glClearBufferfi)(buffer, drawbuffer, depth, stencil); +} + +extern void* __blue_glCore_glGetStringi; +const GLubyte *APIENTRY bluegl_glGetStringi (GLenum name, GLuint index) { + typedef const GLubyte *(APIENTRYP PFN_glGetStringi) (GLenum name, GLuint index); + return ((PFN_glGetStringi)__blue_glCore_glGetStringi)(name, index); +} + +extern void* __blue_glCore_glIsRenderbuffer; +GLboolean APIENTRY bluegl_glIsRenderbuffer (GLuint renderbuffer) { + typedef GLboolean (APIENTRYP PFN_glIsRenderbuffer) (GLuint renderbuffer); + return ((PFN_glIsRenderbuffer)__blue_glCore_glIsRenderbuffer)(renderbuffer); +} + +extern void* __blue_glCore_glBindRenderbuffer; +void APIENTRY bluegl_glBindRenderbuffer (GLenum target, GLuint renderbuffer) { + typedef void (APIENTRYP PFN_glBindRenderbuffer) (GLenum target, GLuint renderbuffer); + return ((PFN_glBindRenderbuffer)__blue_glCore_glBindRenderbuffer)(target, renderbuffer); +} + +extern void* __blue_glCore_glDeleteRenderbuffers; +void APIENTRY bluegl_glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers) { + typedef void (APIENTRYP PFN_glDeleteRenderbuffers) (GLsizei n, const GLuint *renderbuffers); + return ((PFN_glDeleteRenderbuffers)__blue_glCore_glDeleteRenderbuffers)(n, renderbuffers); +} + +extern void* __blue_glCore_glGenRenderbuffers; +void APIENTRY bluegl_glGenRenderbuffers (GLsizei n, GLuint *renderbuffers) { + typedef void (APIENTRYP PFN_glGenRenderbuffers) (GLsizei n, GLuint *renderbuffers); + return ((PFN_glGenRenderbuffers)__blue_glCore_glGenRenderbuffers)(n, renderbuffers); +} + +extern void* __blue_glCore_glRenderbufferStorage; +void APIENTRY bluegl_glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glRenderbufferStorage) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); + return ((PFN_glRenderbufferStorage)__blue_glCore_glRenderbufferStorage)(target, internalformat, width, height); +} + +extern void* __blue_glCore_glGetRenderbufferParameteriv; +void APIENTRY bluegl_glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetRenderbufferParameteriv) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetRenderbufferParameteriv)__blue_glCore_glGetRenderbufferParameteriv)(target, pname, params); +} + +extern void* __blue_glCore_glIsFramebuffer; +GLboolean APIENTRY bluegl_glIsFramebuffer (GLuint framebuffer) { + typedef GLboolean (APIENTRYP PFN_glIsFramebuffer) (GLuint framebuffer); + return ((PFN_glIsFramebuffer)__blue_glCore_glIsFramebuffer)(framebuffer); +} + +extern void* __blue_glCore_glBindFramebuffer; +void APIENTRY bluegl_glBindFramebuffer (GLenum target, GLuint framebuffer) { + typedef void (APIENTRYP PFN_glBindFramebuffer) (GLenum target, GLuint framebuffer); + return ((PFN_glBindFramebuffer)__blue_glCore_glBindFramebuffer)(target, framebuffer); +} + +extern void* __blue_glCore_glDeleteFramebuffers; +void APIENTRY bluegl_glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers) { + typedef void (APIENTRYP PFN_glDeleteFramebuffers) (GLsizei n, const GLuint *framebuffers); + return ((PFN_glDeleteFramebuffers)__blue_glCore_glDeleteFramebuffers)(n, framebuffers); +} + +extern void* __blue_glCore_glGenFramebuffers; +void APIENTRY bluegl_glGenFramebuffers (GLsizei n, GLuint *framebuffers) { + typedef void (APIENTRYP PFN_glGenFramebuffers) (GLsizei n, GLuint *framebuffers); + return ((PFN_glGenFramebuffers)__blue_glCore_glGenFramebuffers)(n, framebuffers); +} + +extern void* __blue_glCore_glCheckFramebufferStatus; +GLenum APIENTRY bluegl_glCheckFramebufferStatus (GLenum target) { + typedef GLenum (APIENTRYP PFN_glCheckFramebufferStatus) (GLenum target); + return ((PFN_glCheckFramebufferStatus)__blue_glCore_glCheckFramebufferStatus)(target); +} + +extern void* __blue_glCore_glFramebufferTexture1D; +void APIENTRY bluegl_glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { + typedef void (APIENTRYP PFN_glFramebufferTexture1D) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + return ((PFN_glFramebufferTexture1D)__blue_glCore_glFramebufferTexture1D)(target, attachment, textarget, texture, level); +} + +extern void* __blue_glCore_glFramebufferTexture2D; +void APIENTRY bluegl_glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { + typedef void (APIENTRYP PFN_glFramebufferTexture2D) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + return ((PFN_glFramebufferTexture2D)__blue_glCore_glFramebufferTexture2D)(target, attachment, textarget, texture, level); +} + +extern void* __blue_glCore_glFramebufferTexture3D; +void APIENTRY bluegl_glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) { + typedef void (APIENTRYP PFN_glFramebufferTexture3D) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); + return ((PFN_glFramebufferTexture3D)__blue_glCore_glFramebufferTexture3D)(target, attachment, textarget, texture, level, zoffset); +} + +extern void* __blue_glCore_glFramebufferRenderbuffer; +void APIENTRY bluegl_glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) { + typedef void (APIENTRYP PFN_glFramebufferRenderbuffer) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); + return ((PFN_glFramebufferRenderbuffer)__blue_glCore_glFramebufferRenderbuffer)(target, attachment, renderbuffertarget, renderbuffer); +} + +extern void* __blue_glCore_glGetFramebufferAttachmentParameteriv; +void APIENTRY bluegl_glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetFramebufferAttachmentParameteriv) (GLenum target, GLenum attachment, GLenum pname, GLint *params); + return ((PFN_glGetFramebufferAttachmentParameteriv)__blue_glCore_glGetFramebufferAttachmentParameteriv)(target, attachment, pname, params); +} + +extern void* __blue_glCore_glGenerateMipmap; +void APIENTRY bluegl_glGenerateMipmap (GLenum target) { + typedef void (APIENTRYP PFN_glGenerateMipmap) (GLenum target); + return ((PFN_glGenerateMipmap)__blue_glCore_glGenerateMipmap)(target); +} + +extern void* __blue_glCore_glBlitFramebuffer; +void APIENTRY bluegl_glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { + typedef void (APIENTRYP PFN_glBlitFramebuffer) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + return ((PFN_glBlitFramebuffer)__blue_glCore_glBlitFramebuffer)(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); +} + +extern void* __blue_glCore_glRenderbufferStorageMultisample; +void APIENTRY bluegl_glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glRenderbufferStorageMultisample) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + return ((PFN_glRenderbufferStorageMultisample)__blue_glCore_glRenderbufferStorageMultisample)(target, samples, internalformat, width, height); +} + +extern void* __blue_glCore_glFramebufferTextureLayer; +void APIENTRY bluegl_glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) { + typedef void (APIENTRYP PFN_glFramebufferTextureLayer) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); + return ((PFN_glFramebufferTextureLayer)__blue_glCore_glFramebufferTextureLayer)(target, attachment, texture, level, layer); +} + +extern void* __blue_glCore_glMapBufferRange; +void *APIENTRY bluegl_glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) { + typedef void *(APIENTRYP PFN_glMapBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); + return ((PFN_glMapBufferRange)__blue_glCore_glMapBufferRange)(target, offset, length, access); +} + +extern void* __blue_glCore_glFlushMappedBufferRange; +void APIENTRY bluegl_glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length) { + typedef void (APIENTRYP PFN_glFlushMappedBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length); + return ((PFN_glFlushMappedBufferRange)__blue_glCore_glFlushMappedBufferRange)(target, offset, length); +} + +extern void* __blue_glCore_glBindVertexArray; +void APIENTRY bluegl_glBindVertexArray (GLuint array) { + typedef void (APIENTRYP PFN_glBindVertexArray) (GLuint array); + return ((PFN_glBindVertexArray)__blue_glCore_glBindVertexArray)(array); +} + +extern void* __blue_glCore_glDeleteVertexArrays; +void APIENTRY bluegl_glDeleteVertexArrays (GLsizei n, const GLuint *arrays) { + typedef void (APIENTRYP PFN_glDeleteVertexArrays) (GLsizei n, const GLuint *arrays); + return ((PFN_glDeleteVertexArrays)__blue_glCore_glDeleteVertexArrays)(n, arrays); +} + +extern void* __blue_glCore_glGenVertexArrays; +void APIENTRY bluegl_glGenVertexArrays (GLsizei n, GLuint *arrays) { + typedef void (APIENTRYP PFN_glGenVertexArrays) (GLsizei n, GLuint *arrays); + return ((PFN_glGenVertexArrays)__blue_glCore_glGenVertexArrays)(n, arrays); +} + +extern void* __blue_glCore_glIsVertexArray; +GLboolean APIENTRY bluegl_glIsVertexArray (GLuint array) { + typedef GLboolean (APIENTRYP PFN_glIsVertexArray) (GLuint array); + return ((PFN_glIsVertexArray)__blue_glCore_glIsVertexArray)(array); +} + +extern void* __blue_glCore_glDrawArraysInstanced; +void APIENTRY bluegl_glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount) { + typedef void (APIENTRYP PFN_glDrawArraysInstanced) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); + return ((PFN_glDrawArraysInstanced)__blue_glCore_glDrawArraysInstanced)(mode, first, count, instancecount); +} + +extern void* __blue_glCore_glDrawElementsInstanced; +void APIENTRY bluegl_glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount) { + typedef void (APIENTRYP PFN_glDrawElementsInstanced) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); + return ((PFN_glDrawElementsInstanced)__blue_glCore_glDrawElementsInstanced)(mode, count, type, indices, instancecount); +} + +extern void* __blue_glCore_glTexBuffer; +void APIENTRY bluegl_glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer) { + typedef void (APIENTRYP PFN_glTexBuffer) (GLenum target, GLenum internalformat, GLuint buffer); + return ((PFN_glTexBuffer)__blue_glCore_glTexBuffer)(target, internalformat, buffer); +} + +extern void* __blue_glCore_glPrimitiveRestartIndex; +void APIENTRY bluegl_glPrimitiveRestartIndex (GLuint index) { + typedef void (APIENTRYP PFN_glPrimitiveRestartIndex) (GLuint index); + return ((PFN_glPrimitiveRestartIndex)__blue_glCore_glPrimitiveRestartIndex)(index); +} + +extern void* __blue_glCore_glCopyBufferSubData; +void APIENTRY bluegl_glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) { + typedef void (APIENTRYP PFN_glCopyBufferSubData) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); + return ((PFN_glCopyBufferSubData)__blue_glCore_glCopyBufferSubData)(readTarget, writeTarget, readOffset, writeOffset, size); +} + +extern void* __blue_glCore_glGetUniformIndices; +void APIENTRY bluegl_glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices) { + typedef void (APIENTRYP PFN_glGetUniformIndices) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); + return ((PFN_glGetUniformIndices)__blue_glCore_glGetUniformIndices)(program, uniformCount, uniformNames, uniformIndices); +} + +extern void* __blue_glCore_glGetActiveUniformsiv; +void APIENTRY bluegl_glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetActiveUniformsiv) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); + return ((PFN_glGetActiveUniformsiv)__blue_glCore_glGetActiveUniformsiv)(program, uniformCount, uniformIndices, pname, params); +} + +extern void* __blue_glCore_glGetActiveUniformName; +void APIENTRY bluegl_glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName) { + typedef void (APIENTRYP PFN_glGetActiveUniformName) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); + return ((PFN_glGetActiveUniformName)__blue_glCore_glGetActiveUniformName)(program, uniformIndex, bufSize, length, uniformName); +} + +extern void* __blue_glCore_glGetUniformBlockIndex; +GLuint APIENTRY bluegl_glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName) { + typedef GLuint (APIENTRYP PFN_glGetUniformBlockIndex) (GLuint program, const GLchar *uniformBlockName); + return ((PFN_glGetUniformBlockIndex)__blue_glCore_glGetUniformBlockIndex)(program, uniformBlockName); +} + +extern void* __blue_glCore_glGetActiveUniformBlockiv; +void APIENTRY bluegl_glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetActiveUniformBlockiv) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); + return ((PFN_glGetActiveUniformBlockiv)__blue_glCore_glGetActiveUniformBlockiv)(program, uniformBlockIndex, pname, params); +} + +extern void* __blue_glCore_glGetActiveUniformBlockName; +void APIENTRY bluegl_glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) { + typedef void (APIENTRYP PFN_glGetActiveUniformBlockName) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); + return ((PFN_glGetActiveUniformBlockName)__blue_glCore_glGetActiveUniformBlockName)(program, uniformBlockIndex, bufSize, length, uniformBlockName); +} + +extern void* __blue_glCore_glUniformBlockBinding; +void APIENTRY bluegl_glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) { + typedef void (APIENTRYP PFN_glUniformBlockBinding) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); + return ((PFN_glUniformBlockBinding)__blue_glCore_glUniformBlockBinding)(program, uniformBlockIndex, uniformBlockBinding); +} + +extern void* __blue_glCore_glDrawElementsBaseVertex; +void APIENTRY bluegl_glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex) { + typedef void (APIENTRYP PFN_glDrawElementsBaseVertex) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); + return ((PFN_glDrawElementsBaseVertex)__blue_glCore_glDrawElementsBaseVertex)(mode, count, type, indices, basevertex); +} + +extern void* __blue_glCore_glDrawRangeElementsBaseVertex; +void APIENTRY bluegl_glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex) { + typedef void (APIENTRYP PFN_glDrawRangeElementsBaseVertex) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); + return ((PFN_glDrawRangeElementsBaseVertex)__blue_glCore_glDrawRangeElementsBaseVertex)(mode, start, end, count, type, indices, basevertex); +} + +extern void* __blue_glCore_glDrawElementsInstancedBaseVertex; +void APIENTRY bluegl_glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex) { + typedef void (APIENTRYP PFN_glDrawElementsInstancedBaseVertex) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); + return ((PFN_glDrawElementsInstancedBaseVertex)__blue_glCore_glDrawElementsInstancedBaseVertex)(mode, count, type, indices, instancecount, basevertex); +} + +extern void* __blue_glCore_glMultiDrawElementsBaseVertex; +void APIENTRY bluegl_glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex) { + typedef void (APIENTRYP PFN_glMultiDrawElementsBaseVertex) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); + return ((PFN_glMultiDrawElementsBaseVertex)__blue_glCore_glMultiDrawElementsBaseVertex)(mode, count, type, indices, drawcount, basevertex); +} + +extern void* __blue_glCore_glProvokingVertex; +void APIENTRY bluegl_glProvokingVertex (GLenum mode) { + typedef void (APIENTRYP PFN_glProvokingVertex) (GLenum mode); + return ((PFN_glProvokingVertex)__blue_glCore_glProvokingVertex)(mode); +} + +extern void* __blue_glCore_glFenceSync; +GLsync APIENTRY bluegl_glFenceSync (GLenum condition, GLbitfield flags) { + typedef GLsync (APIENTRYP PFN_glFenceSync) (GLenum condition, GLbitfield flags); + return ((PFN_glFenceSync)__blue_glCore_glFenceSync)(condition, flags); +} + +extern void* __blue_glCore_glIsSync; +GLboolean APIENTRY bluegl_glIsSync (GLsync sync) { + typedef GLboolean (APIENTRYP PFN_glIsSync) (GLsync sync); + return ((PFN_glIsSync)__blue_glCore_glIsSync)(sync); +} + +extern void* __blue_glCore_glDeleteSync; +void APIENTRY bluegl_glDeleteSync (GLsync sync) { + typedef void (APIENTRYP PFN_glDeleteSync) (GLsync sync); + return ((PFN_glDeleteSync)__blue_glCore_glDeleteSync)(sync); +} + +extern void* __blue_glCore_glClientWaitSync; +GLenum APIENTRY bluegl_glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout) { + typedef GLenum (APIENTRYP PFN_glClientWaitSync) (GLsync sync, GLbitfield flags, GLuint64 timeout); + return ((PFN_glClientWaitSync)__blue_glCore_glClientWaitSync)(sync, flags, timeout); +} + +extern void* __blue_glCore_glWaitSync; +void APIENTRY bluegl_glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout) { + typedef void (APIENTRYP PFN_glWaitSync) (GLsync sync, GLbitfield flags, GLuint64 timeout); + return ((PFN_glWaitSync)__blue_glCore_glWaitSync)(sync, flags, timeout); +} + +extern void* __blue_glCore_glGetInteger64v; +void APIENTRY bluegl_glGetInteger64v (GLenum pname, GLint64 *data) { + typedef void (APIENTRYP PFN_glGetInteger64v) (GLenum pname, GLint64 *data); + return ((PFN_glGetInteger64v)__blue_glCore_glGetInteger64v)(pname, data); +} + +extern void* __blue_glCore_glGetSynciv; +void APIENTRY bluegl_glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values) { + typedef void (APIENTRYP PFN_glGetSynciv) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); + return ((PFN_glGetSynciv)__blue_glCore_glGetSynciv)(sync, pname, bufSize, length, values); +} + +extern void* __blue_glCore_glGetInteger64i_v; +void APIENTRY bluegl_glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data) { + typedef void (APIENTRYP PFN_glGetInteger64i_v) (GLenum target, GLuint index, GLint64 *data); + return ((PFN_glGetInteger64i_v)__blue_glCore_glGetInteger64i_v)(target, index, data); +} + +extern void* __blue_glCore_glGetBufferParameteri64v; +void APIENTRY bluegl_glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params) { + typedef void (APIENTRYP PFN_glGetBufferParameteri64v) (GLenum target, GLenum pname, GLint64 *params); + return ((PFN_glGetBufferParameteri64v)__blue_glCore_glGetBufferParameteri64v)(target, pname, params); +} + +extern void* __blue_glCore_glFramebufferTexture; +void APIENTRY bluegl_glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level) { + typedef void (APIENTRYP PFN_glFramebufferTexture) (GLenum target, GLenum attachment, GLuint texture, GLint level); + return ((PFN_glFramebufferTexture)__blue_glCore_glFramebufferTexture)(target, attachment, texture, level); +} + +extern void* __blue_glCore_glTexImage2DMultisample; +void APIENTRY bluegl_glTexImage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) { + typedef void (APIENTRYP PFN_glTexImage2DMultisample) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); + return ((PFN_glTexImage2DMultisample)__blue_glCore_glTexImage2DMultisample)(target, samples, internalformat, width, height, fixedsamplelocations); +} + +extern void* __blue_glCore_glTexImage3DMultisample; +void APIENTRY bluegl_glTexImage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { + typedef void (APIENTRYP PFN_glTexImage3DMultisample) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); + return ((PFN_glTexImage3DMultisample)__blue_glCore_glTexImage3DMultisample)(target, samples, internalformat, width, height, depth, fixedsamplelocations); +} + +extern void* __blue_glCore_glGetMultisamplefv; +void APIENTRY bluegl_glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val) { + typedef void (APIENTRYP PFN_glGetMultisamplefv) (GLenum pname, GLuint index, GLfloat *val); + return ((PFN_glGetMultisamplefv)__blue_glCore_glGetMultisamplefv)(pname, index, val); +} + +extern void* __blue_glCore_glSampleMaski; +void APIENTRY bluegl_glSampleMaski (GLuint maskNumber, GLbitfield mask) { + typedef void (APIENTRYP PFN_glSampleMaski) (GLuint maskNumber, GLbitfield mask); + return ((PFN_glSampleMaski)__blue_glCore_glSampleMaski)(maskNumber, mask); +} + +extern void* __blue_glCore_glBindFragDataLocationIndexed; +void APIENTRY bluegl_glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name) { + typedef void (APIENTRYP PFN_glBindFragDataLocationIndexed) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); + return ((PFN_glBindFragDataLocationIndexed)__blue_glCore_glBindFragDataLocationIndexed)(program, colorNumber, index, name); +} + +extern void* __blue_glCore_glGetFragDataIndex; +GLint APIENTRY bluegl_glGetFragDataIndex (GLuint program, const GLchar *name) { + typedef GLint (APIENTRYP PFN_glGetFragDataIndex) (GLuint program, const GLchar *name); + return ((PFN_glGetFragDataIndex)__blue_glCore_glGetFragDataIndex)(program, name); +} + +extern void* __blue_glCore_glGenSamplers; +void APIENTRY bluegl_glGenSamplers (GLsizei count, GLuint *samplers) { + typedef void (APIENTRYP PFN_glGenSamplers) (GLsizei count, GLuint *samplers); + return ((PFN_glGenSamplers)__blue_glCore_glGenSamplers)(count, samplers); +} + +extern void* __blue_glCore_glDeleteSamplers; +void APIENTRY bluegl_glDeleteSamplers (GLsizei count, const GLuint *samplers) { + typedef void (APIENTRYP PFN_glDeleteSamplers) (GLsizei count, const GLuint *samplers); + return ((PFN_glDeleteSamplers)__blue_glCore_glDeleteSamplers)(count, samplers); +} + +extern void* __blue_glCore_glIsSampler; +GLboolean APIENTRY bluegl_glIsSampler (GLuint sampler) { + typedef GLboolean (APIENTRYP PFN_glIsSampler) (GLuint sampler); + return ((PFN_glIsSampler)__blue_glCore_glIsSampler)(sampler); +} + +extern void* __blue_glCore_glBindSampler; +void APIENTRY bluegl_glBindSampler (GLuint unit, GLuint sampler) { + typedef void (APIENTRYP PFN_glBindSampler) (GLuint unit, GLuint sampler); + return ((PFN_glBindSampler)__blue_glCore_glBindSampler)(unit, sampler); +} + +extern void* __blue_glCore_glSamplerParameteri; +void APIENTRY bluegl_glSamplerParameteri (GLuint sampler, GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glSamplerParameteri) (GLuint sampler, GLenum pname, GLint param); + return ((PFN_glSamplerParameteri)__blue_glCore_glSamplerParameteri)(sampler, pname, param); +} + +extern void* __blue_glCore_glSamplerParameteriv; +void APIENTRY bluegl_glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param) { + typedef void (APIENTRYP PFN_glSamplerParameteriv) (GLuint sampler, GLenum pname, const GLint *param); + return ((PFN_glSamplerParameteriv)__blue_glCore_glSamplerParameteriv)(sampler, pname, param); +} + +extern void* __blue_glCore_glSamplerParameterf; +void APIENTRY bluegl_glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glSamplerParameterf) (GLuint sampler, GLenum pname, GLfloat param); + return ((PFN_glSamplerParameterf)__blue_glCore_glSamplerParameterf)(sampler, pname, param); +} + +extern void* __blue_glCore_glSamplerParameterfv; +void APIENTRY bluegl_glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param) { + typedef void (APIENTRYP PFN_glSamplerParameterfv) (GLuint sampler, GLenum pname, const GLfloat *param); + return ((PFN_glSamplerParameterfv)__blue_glCore_glSamplerParameterfv)(sampler, pname, param); +} + +extern void* __blue_glCore_glSamplerParameterIiv; +void APIENTRY bluegl_glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param) { + typedef void (APIENTRYP PFN_glSamplerParameterIiv) (GLuint sampler, GLenum pname, const GLint *param); + return ((PFN_glSamplerParameterIiv)__blue_glCore_glSamplerParameterIiv)(sampler, pname, param); +} + +extern void* __blue_glCore_glSamplerParameterIuiv; +void APIENTRY bluegl_glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param) { + typedef void (APIENTRYP PFN_glSamplerParameterIuiv) (GLuint sampler, GLenum pname, const GLuint *param); + return ((PFN_glSamplerParameterIuiv)__blue_glCore_glSamplerParameterIuiv)(sampler, pname, param); +} + +extern void* __blue_glCore_glGetSamplerParameteriv; +void APIENTRY bluegl_glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetSamplerParameteriv) (GLuint sampler, GLenum pname, GLint *params); + return ((PFN_glGetSamplerParameteriv)__blue_glCore_glGetSamplerParameteriv)(sampler, pname, params); +} + +extern void* __blue_glCore_glGetSamplerParameterIiv; +void APIENTRY bluegl_glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetSamplerParameterIiv) (GLuint sampler, GLenum pname, GLint *params); + return ((PFN_glGetSamplerParameterIiv)__blue_glCore_glGetSamplerParameterIiv)(sampler, pname, params); +} + +extern void* __blue_glCore_glGetSamplerParameterfv; +void APIENTRY bluegl_glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetSamplerParameterfv) (GLuint sampler, GLenum pname, GLfloat *params); + return ((PFN_glGetSamplerParameterfv)__blue_glCore_glGetSamplerParameterfv)(sampler, pname, params); +} + +extern void* __blue_glCore_glGetSamplerParameterIuiv; +void APIENTRY bluegl_glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params) { + typedef void (APIENTRYP PFN_glGetSamplerParameterIuiv) (GLuint sampler, GLenum pname, GLuint *params); + return ((PFN_glGetSamplerParameterIuiv)__blue_glCore_glGetSamplerParameterIuiv)(sampler, pname, params); +} + +extern void* __blue_glCore_glQueryCounter; +void APIENTRY bluegl_glQueryCounter (GLuint id, GLenum target) { + typedef void (APIENTRYP PFN_glQueryCounter) (GLuint id, GLenum target); + return ((PFN_glQueryCounter)__blue_glCore_glQueryCounter)(id, target); +} + +extern void* __blue_glCore_glGetQueryObjecti64v; +void APIENTRY bluegl_glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params) { + typedef void (APIENTRYP PFN_glGetQueryObjecti64v) (GLuint id, GLenum pname, GLint64 *params); + return ((PFN_glGetQueryObjecti64v)__blue_glCore_glGetQueryObjecti64v)(id, pname, params); +} + +extern void* __blue_glCore_glGetQueryObjectui64v; +void APIENTRY bluegl_glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params) { + typedef void (APIENTRYP PFN_glGetQueryObjectui64v) (GLuint id, GLenum pname, GLuint64 *params); + return ((PFN_glGetQueryObjectui64v)__blue_glCore_glGetQueryObjectui64v)(id, pname, params); +} + +extern void* __blue_glCore_glVertexAttribDivisor; +void APIENTRY bluegl_glVertexAttribDivisor (GLuint index, GLuint divisor) { + typedef void (APIENTRYP PFN_glVertexAttribDivisor) (GLuint index, GLuint divisor); + return ((PFN_glVertexAttribDivisor)__blue_glCore_glVertexAttribDivisor)(index, divisor); +} + +extern void* __blue_glCore_glVertexAttribP1ui; +void APIENTRY bluegl_glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value) { + typedef void (APIENTRYP PFN_glVertexAttribP1ui) (GLuint index, GLenum type, GLboolean normalized, GLuint value); + return ((PFN_glVertexAttribP1ui)__blue_glCore_glVertexAttribP1ui)(index, type, normalized, value); +} + +extern void* __blue_glCore_glVertexAttribP1uiv; +void APIENTRY bluegl_glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value) { + typedef void (APIENTRYP PFN_glVertexAttribP1uiv) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); + return ((PFN_glVertexAttribP1uiv)__blue_glCore_glVertexAttribP1uiv)(index, type, normalized, value); +} + +extern void* __blue_glCore_glVertexAttribP2ui; +void APIENTRY bluegl_glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value) { + typedef void (APIENTRYP PFN_glVertexAttribP2ui) (GLuint index, GLenum type, GLboolean normalized, GLuint value); + return ((PFN_glVertexAttribP2ui)__blue_glCore_glVertexAttribP2ui)(index, type, normalized, value); +} + +extern void* __blue_glCore_glVertexAttribP2uiv; +void APIENTRY bluegl_glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value) { + typedef void (APIENTRYP PFN_glVertexAttribP2uiv) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); + return ((PFN_glVertexAttribP2uiv)__blue_glCore_glVertexAttribP2uiv)(index, type, normalized, value); +} + +extern void* __blue_glCore_glVertexAttribP3ui; +void APIENTRY bluegl_glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value) { + typedef void (APIENTRYP PFN_glVertexAttribP3ui) (GLuint index, GLenum type, GLboolean normalized, GLuint value); + return ((PFN_glVertexAttribP3ui)__blue_glCore_glVertexAttribP3ui)(index, type, normalized, value); +} + +extern void* __blue_glCore_glVertexAttribP3uiv; +void APIENTRY bluegl_glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value) { + typedef void (APIENTRYP PFN_glVertexAttribP3uiv) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); + return ((PFN_glVertexAttribP3uiv)__blue_glCore_glVertexAttribP3uiv)(index, type, normalized, value); +} + +extern void* __blue_glCore_glVertexAttribP4ui; +void APIENTRY bluegl_glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value) { + typedef void (APIENTRYP PFN_glVertexAttribP4ui) (GLuint index, GLenum type, GLboolean normalized, GLuint value); + return ((PFN_glVertexAttribP4ui)__blue_glCore_glVertexAttribP4ui)(index, type, normalized, value); +} + +extern void* __blue_glCore_glVertexAttribP4uiv; +void APIENTRY bluegl_glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value) { + typedef void (APIENTRYP PFN_glVertexAttribP4uiv) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); + return ((PFN_glVertexAttribP4uiv)__blue_glCore_glVertexAttribP4uiv)(index, type, normalized, value); +} + +extern void* __blue_glCore_glMinSampleShading; +void APIENTRY bluegl_glMinSampleShading (GLfloat value) { + typedef void (APIENTRYP PFN_glMinSampleShading) (GLfloat value); + return ((PFN_glMinSampleShading)__blue_glCore_glMinSampleShading)(value); +} + +extern void* __blue_glCore_glBlendEquationi; +void APIENTRY bluegl_glBlendEquationi (GLuint buf, GLenum mode) { + typedef void (APIENTRYP PFN_glBlendEquationi) (GLuint buf, GLenum mode); + return ((PFN_glBlendEquationi)__blue_glCore_glBlendEquationi)(buf, mode); +} + +extern void* __blue_glCore_glBlendEquationSeparatei; +void APIENTRY bluegl_glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha) { + typedef void (APIENTRYP PFN_glBlendEquationSeparatei) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); + return ((PFN_glBlendEquationSeparatei)__blue_glCore_glBlendEquationSeparatei)(buf, modeRGB, modeAlpha); +} + +extern void* __blue_glCore_glBlendFunci; +void APIENTRY bluegl_glBlendFunci (GLuint buf, GLenum src, GLenum dst) { + typedef void (APIENTRYP PFN_glBlendFunci) (GLuint buf, GLenum src, GLenum dst); + return ((PFN_glBlendFunci)__blue_glCore_glBlendFunci)(buf, src, dst); +} + +extern void* __blue_glCore_glBlendFuncSeparatei; +void APIENTRY bluegl_glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { + typedef void (APIENTRYP PFN_glBlendFuncSeparatei) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); + return ((PFN_glBlendFuncSeparatei)__blue_glCore_glBlendFuncSeparatei)(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); +} + +extern void* __blue_glCore_glDrawArraysIndirect; +void APIENTRY bluegl_glDrawArraysIndirect (GLenum mode, const void *indirect) { + typedef void (APIENTRYP PFN_glDrawArraysIndirect) (GLenum mode, const void *indirect); + return ((PFN_glDrawArraysIndirect)__blue_glCore_glDrawArraysIndirect)(mode, indirect); +} + +extern void* __blue_glCore_glDrawElementsIndirect; +void APIENTRY bluegl_glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect) { + typedef void (APIENTRYP PFN_glDrawElementsIndirect) (GLenum mode, GLenum type, const void *indirect); + return ((PFN_glDrawElementsIndirect)__blue_glCore_glDrawElementsIndirect)(mode, type, indirect); +} + +extern void* __blue_glCore_glUniform1d; +void APIENTRY bluegl_glUniform1d (GLint location, GLdouble x) { + typedef void (APIENTRYP PFN_glUniform1d) (GLint location, GLdouble x); + return ((PFN_glUniform1d)__blue_glCore_glUniform1d)(location, x); +} + +extern void* __blue_glCore_glUniform2d; +void APIENTRY bluegl_glUniform2d (GLint location, GLdouble x, GLdouble y) { + typedef void (APIENTRYP PFN_glUniform2d) (GLint location, GLdouble x, GLdouble y); + return ((PFN_glUniform2d)__blue_glCore_glUniform2d)(location, x, y); +} + +extern void* __blue_glCore_glUniform3d; +void APIENTRY bluegl_glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z) { + typedef void (APIENTRYP PFN_glUniform3d) (GLint location, GLdouble x, GLdouble y, GLdouble z); + return ((PFN_glUniform3d)__blue_glCore_glUniform3d)(location, x, y, z); +} + +extern void* __blue_glCore_glUniform4d; +void APIENTRY bluegl_glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { + typedef void (APIENTRYP PFN_glUniform4d) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + return ((PFN_glUniform4d)__blue_glCore_glUniform4d)(location, x, y, z, w); +} + +extern void* __blue_glCore_glUniform1dv; +void APIENTRY bluegl_glUniform1dv (GLint location, GLsizei count, const GLdouble *value) { + typedef void (APIENTRYP PFN_glUniform1dv) (GLint location, GLsizei count, const GLdouble *value); + return ((PFN_glUniform1dv)__blue_glCore_glUniform1dv)(location, count, value); +} + +extern void* __blue_glCore_glUniform2dv; +void APIENTRY bluegl_glUniform2dv (GLint location, GLsizei count, const GLdouble *value) { + typedef void (APIENTRYP PFN_glUniform2dv) (GLint location, GLsizei count, const GLdouble *value); + return ((PFN_glUniform2dv)__blue_glCore_glUniform2dv)(location, count, value); +} + +extern void* __blue_glCore_glUniform3dv; +void APIENTRY bluegl_glUniform3dv (GLint location, GLsizei count, const GLdouble *value) { + typedef void (APIENTRYP PFN_glUniform3dv) (GLint location, GLsizei count, const GLdouble *value); + return ((PFN_glUniform3dv)__blue_glCore_glUniform3dv)(location, count, value); +} + +extern void* __blue_glCore_glUniform4dv; +void APIENTRY bluegl_glUniform4dv (GLint location, GLsizei count, const GLdouble *value) { + typedef void (APIENTRYP PFN_glUniform4dv) (GLint location, GLsizei count, const GLdouble *value); + return ((PFN_glUniform4dv)__blue_glCore_glUniform4dv)(location, count, value); +} + +extern void* __blue_glCore_glUniformMatrix2dv; +void APIENTRY bluegl_glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glUniformMatrix2dv) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glUniformMatrix2dv)__blue_glCore_glUniformMatrix2dv)(location, count, transpose, value); +} + +extern void* __blue_glCore_glUniformMatrix3dv; +void APIENTRY bluegl_glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glUniformMatrix3dv) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glUniformMatrix3dv)__blue_glCore_glUniformMatrix3dv)(location, count, transpose, value); +} + +extern void* __blue_glCore_glUniformMatrix4dv; +void APIENTRY bluegl_glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glUniformMatrix4dv) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glUniformMatrix4dv)__blue_glCore_glUniformMatrix4dv)(location, count, transpose, value); +} + +extern void* __blue_glCore_glUniformMatrix2x3dv; +void APIENTRY bluegl_glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glUniformMatrix2x3dv) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glUniformMatrix2x3dv)__blue_glCore_glUniformMatrix2x3dv)(location, count, transpose, value); +} + +extern void* __blue_glCore_glUniformMatrix2x4dv; +void APIENTRY bluegl_glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glUniformMatrix2x4dv) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glUniformMatrix2x4dv)__blue_glCore_glUniformMatrix2x4dv)(location, count, transpose, value); +} + +extern void* __blue_glCore_glUniformMatrix3x2dv; +void APIENTRY bluegl_glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glUniformMatrix3x2dv) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glUniformMatrix3x2dv)__blue_glCore_glUniformMatrix3x2dv)(location, count, transpose, value); +} + +extern void* __blue_glCore_glUniformMatrix3x4dv; +void APIENTRY bluegl_glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glUniformMatrix3x4dv) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glUniformMatrix3x4dv)__blue_glCore_glUniformMatrix3x4dv)(location, count, transpose, value); +} + +extern void* __blue_glCore_glUniformMatrix4x2dv; +void APIENTRY bluegl_glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glUniformMatrix4x2dv) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glUniformMatrix4x2dv)__blue_glCore_glUniformMatrix4x2dv)(location, count, transpose, value); +} + +extern void* __blue_glCore_glUniformMatrix4x3dv; +void APIENTRY bluegl_glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glUniformMatrix4x3dv) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glUniformMatrix4x3dv)__blue_glCore_glUniformMatrix4x3dv)(location, count, transpose, value); +} + +extern void* __blue_glCore_glGetUniformdv; +void APIENTRY bluegl_glGetUniformdv (GLuint program, GLint location, GLdouble *params) { + typedef void (APIENTRYP PFN_glGetUniformdv) (GLuint program, GLint location, GLdouble *params); + return ((PFN_glGetUniformdv)__blue_glCore_glGetUniformdv)(program, location, params); +} + +extern void* __blue_glCore_glGetSubroutineUniformLocation; +GLint APIENTRY bluegl_glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name) { + typedef GLint (APIENTRYP PFN_glGetSubroutineUniformLocation) (GLuint program, GLenum shadertype, const GLchar *name); + return ((PFN_glGetSubroutineUniformLocation)__blue_glCore_glGetSubroutineUniformLocation)(program, shadertype, name); +} + +extern void* __blue_glCore_glGetSubroutineIndex; +GLuint APIENTRY bluegl_glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name) { + typedef GLuint (APIENTRYP PFN_glGetSubroutineIndex) (GLuint program, GLenum shadertype, const GLchar *name); + return ((PFN_glGetSubroutineIndex)__blue_glCore_glGetSubroutineIndex)(program, shadertype, name); +} + +extern void* __blue_glCore_glGetActiveSubroutineUniformiv; +void APIENTRY bluegl_glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values) { + typedef void (APIENTRYP PFN_glGetActiveSubroutineUniformiv) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); + return ((PFN_glGetActiveSubroutineUniformiv)__blue_glCore_glGetActiveSubroutineUniformiv)(program, shadertype, index, pname, values); +} + +extern void* __blue_glCore_glGetActiveSubroutineUniformName; +void APIENTRY bluegl_glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name) { + typedef void (APIENTRYP PFN_glGetActiveSubroutineUniformName) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); + return ((PFN_glGetActiveSubroutineUniformName)__blue_glCore_glGetActiveSubroutineUniformName)(program, shadertype, index, bufsize, length, name); +} + +extern void* __blue_glCore_glGetActiveSubroutineName; +void APIENTRY bluegl_glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name) { + typedef void (APIENTRYP PFN_glGetActiveSubroutineName) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); + return ((PFN_glGetActiveSubroutineName)__blue_glCore_glGetActiveSubroutineName)(program, shadertype, index, bufsize, length, name); +} + +extern void* __blue_glCore_glUniformSubroutinesuiv; +void APIENTRY bluegl_glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices) { + typedef void (APIENTRYP PFN_glUniformSubroutinesuiv) (GLenum shadertype, GLsizei count, const GLuint *indices); + return ((PFN_glUniformSubroutinesuiv)__blue_glCore_glUniformSubroutinesuiv)(shadertype, count, indices); +} + +extern void* __blue_glCore_glGetUniformSubroutineuiv; +void APIENTRY bluegl_glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params) { + typedef void (APIENTRYP PFN_glGetUniformSubroutineuiv) (GLenum shadertype, GLint location, GLuint *params); + return ((PFN_glGetUniformSubroutineuiv)__blue_glCore_glGetUniformSubroutineuiv)(shadertype, location, params); +} + +extern void* __blue_glCore_glGetProgramStageiv; +void APIENTRY bluegl_glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values) { + typedef void (APIENTRYP PFN_glGetProgramStageiv) (GLuint program, GLenum shadertype, GLenum pname, GLint *values); + return ((PFN_glGetProgramStageiv)__blue_glCore_glGetProgramStageiv)(program, shadertype, pname, values); +} + +extern void* __blue_glCore_glPatchParameteri; +void APIENTRY bluegl_glPatchParameteri (GLenum pname, GLint value) { + typedef void (APIENTRYP PFN_glPatchParameteri) (GLenum pname, GLint value); + return ((PFN_glPatchParameteri)__blue_glCore_glPatchParameteri)(pname, value); +} + +extern void* __blue_glCore_glPatchParameterfv; +void APIENTRY bluegl_glPatchParameterfv (GLenum pname, const GLfloat *values) { + typedef void (APIENTRYP PFN_glPatchParameterfv) (GLenum pname, const GLfloat *values); + return ((PFN_glPatchParameterfv)__blue_glCore_glPatchParameterfv)(pname, values); +} + +extern void* __blue_glCore_glBindTransformFeedback; +void APIENTRY bluegl_glBindTransformFeedback (GLenum target, GLuint id) { + typedef void (APIENTRYP PFN_glBindTransformFeedback) (GLenum target, GLuint id); + return ((PFN_glBindTransformFeedback)__blue_glCore_glBindTransformFeedback)(target, id); +} + +extern void* __blue_glCore_glDeleteTransformFeedbacks; +void APIENTRY bluegl_glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids) { + typedef void (APIENTRYP PFN_glDeleteTransformFeedbacks) (GLsizei n, const GLuint *ids); + return ((PFN_glDeleteTransformFeedbacks)__blue_glCore_glDeleteTransformFeedbacks)(n, ids); +} + +extern void* __blue_glCore_glGenTransformFeedbacks; +void APIENTRY bluegl_glGenTransformFeedbacks (GLsizei n, GLuint *ids) { + typedef void (APIENTRYP PFN_glGenTransformFeedbacks) (GLsizei n, GLuint *ids); + return ((PFN_glGenTransformFeedbacks)__blue_glCore_glGenTransformFeedbacks)(n, ids); +} + +extern void* __blue_glCore_glIsTransformFeedback; +GLboolean APIENTRY bluegl_glIsTransformFeedback (GLuint id) { + typedef GLboolean (APIENTRYP PFN_glIsTransformFeedback) (GLuint id); + return ((PFN_glIsTransformFeedback)__blue_glCore_glIsTransformFeedback)(id); +} + +extern void* __blue_glCore_glPauseTransformFeedback; +void APIENTRY bluegl_glPauseTransformFeedback (void) { + typedef void (APIENTRYP PFN_glPauseTransformFeedback) (void); + return ((PFN_glPauseTransformFeedback)__blue_glCore_glPauseTransformFeedback)(); +} + +extern void* __blue_glCore_glResumeTransformFeedback; +void APIENTRY bluegl_glResumeTransformFeedback (void) { + typedef void (APIENTRYP PFN_glResumeTransformFeedback) (void); + return ((PFN_glResumeTransformFeedback)__blue_glCore_glResumeTransformFeedback)(); +} + +extern void* __blue_glCore_glDrawTransformFeedback; +void APIENTRY bluegl_glDrawTransformFeedback (GLenum mode, GLuint id) { + typedef void (APIENTRYP PFN_glDrawTransformFeedback) (GLenum mode, GLuint id); + return ((PFN_glDrawTransformFeedback)__blue_glCore_glDrawTransformFeedback)(mode, id); +} + +extern void* __blue_glCore_glDrawTransformFeedbackStream; +void APIENTRY bluegl_glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream) { + typedef void (APIENTRYP PFN_glDrawTransformFeedbackStream) (GLenum mode, GLuint id, GLuint stream); + return ((PFN_glDrawTransformFeedbackStream)__blue_glCore_glDrawTransformFeedbackStream)(mode, id, stream); +} + +extern void* __blue_glCore_glBeginQueryIndexed; +void APIENTRY bluegl_glBeginQueryIndexed (GLenum target, GLuint index, GLuint id) { + typedef void (APIENTRYP PFN_glBeginQueryIndexed) (GLenum target, GLuint index, GLuint id); + return ((PFN_glBeginQueryIndexed)__blue_glCore_glBeginQueryIndexed)(target, index, id); +} + +extern void* __blue_glCore_glEndQueryIndexed; +void APIENTRY bluegl_glEndQueryIndexed (GLenum target, GLuint index) { + typedef void (APIENTRYP PFN_glEndQueryIndexed) (GLenum target, GLuint index); + return ((PFN_glEndQueryIndexed)__blue_glCore_glEndQueryIndexed)(target, index); +} + +extern void* __blue_glCore_glGetQueryIndexediv; +void APIENTRY bluegl_glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetQueryIndexediv) (GLenum target, GLuint index, GLenum pname, GLint *params); + return ((PFN_glGetQueryIndexediv)__blue_glCore_glGetQueryIndexediv)(target, index, pname, params); +} + +extern void* __blue_glCore_glReleaseShaderCompiler; +void APIENTRY bluegl_glReleaseShaderCompiler (void) { + typedef void (APIENTRYP PFN_glReleaseShaderCompiler) (void); + return ((PFN_glReleaseShaderCompiler)__blue_glCore_glReleaseShaderCompiler)(); +} + +extern void* __blue_glCore_glShaderBinary; +void APIENTRY bluegl_glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length) { + typedef void (APIENTRYP PFN_glShaderBinary) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); + return ((PFN_glShaderBinary)__blue_glCore_glShaderBinary)(count, shaders, binaryformat, binary, length); +} + +extern void* __blue_glCore_glGetShaderPrecisionFormat; +void APIENTRY bluegl_glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision) { + typedef void (APIENTRYP PFN_glGetShaderPrecisionFormat) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); + return ((PFN_glGetShaderPrecisionFormat)__blue_glCore_glGetShaderPrecisionFormat)(shadertype, precisiontype, range, precision); +} + +extern void* __blue_glCore_glDepthRangef; +void APIENTRY bluegl_glDepthRangef (GLfloat n, GLfloat f) { + typedef void (APIENTRYP PFN_glDepthRangef) (GLfloat n, GLfloat f); + return ((PFN_glDepthRangef)__blue_glCore_glDepthRangef)(n, f); +} + +extern void* __blue_glCore_glClearDepthf; +void APIENTRY bluegl_glClearDepthf (GLfloat d) { + typedef void (APIENTRYP PFN_glClearDepthf) (GLfloat d); + return ((PFN_glClearDepthf)__blue_glCore_glClearDepthf)(d); +} + +extern void* __blue_glCore_glGetProgramBinary; +void APIENTRY bluegl_glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary) { + typedef void (APIENTRYP PFN_glGetProgramBinary) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); + return ((PFN_glGetProgramBinary)__blue_glCore_glGetProgramBinary)(program, bufSize, length, binaryFormat, binary); +} + +extern void* __blue_glCore_glProgramBinary; +void APIENTRY bluegl_glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length) { + typedef void (APIENTRYP PFN_glProgramBinary) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); + return ((PFN_glProgramBinary)__blue_glCore_glProgramBinary)(program, binaryFormat, binary, length); +} + +extern void* __blue_glCore_glProgramParameteri; +void APIENTRY bluegl_glProgramParameteri (GLuint program, GLenum pname, GLint value) { + typedef void (APIENTRYP PFN_glProgramParameteri) (GLuint program, GLenum pname, GLint value); + return ((PFN_glProgramParameteri)__blue_glCore_glProgramParameteri)(program, pname, value); +} + +extern void* __blue_glCore_glUseProgramStages; +void APIENTRY bluegl_glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program) { + typedef void (APIENTRYP PFN_glUseProgramStages) (GLuint pipeline, GLbitfield stages, GLuint program); + return ((PFN_glUseProgramStages)__blue_glCore_glUseProgramStages)(pipeline, stages, program); +} + +extern void* __blue_glCore_glActiveShaderProgram; +void APIENTRY bluegl_glActiveShaderProgram (GLuint pipeline, GLuint program) { + typedef void (APIENTRYP PFN_glActiveShaderProgram) (GLuint pipeline, GLuint program); + return ((PFN_glActiveShaderProgram)__blue_glCore_glActiveShaderProgram)(pipeline, program); +} + +extern void* __blue_glCore_glCreateShaderProgramv; +GLuint APIENTRY bluegl_glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings) { + typedef GLuint (APIENTRYP PFN_glCreateShaderProgramv) (GLenum type, GLsizei count, const GLchar *const*strings); + return ((PFN_glCreateShaderProgramv)__blue_glCore_glCreateShaderProgramv)(type, count, strings); +} + +extern void* __blue_glCore_glBindProgramPipeline; +void APIENTRY bluegl_glBindProgramPipeline (GLuint pipeline) { + typedef void (APIENTRYP PFN_glBindProgramPipeline) (GLuint pipeline); + return ((PFN_glBindProgramPipeline)__blue_glCore_glBindProgramPipeline)(pipeline); +} + +extern void* __blue_glCore_glDeleteProgramPipelines; +void APIENTRY bluegl_glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines) { + typedef void (APIENTRYP PFN_glDeleteProgramPipelines) (GLsizei n, const GLuint *pipelines); + return ((PFN_glDeleteProgramPipelines)__blue_glCore_glDeleteProgramPipelines)(n, pipelines); +} + +extern void* __blue_glCore_glGenProgramPipelines; +void APIENTRY bluegl_glGenProgramPipelines (GLsizei n, GLuint *pipelines) { + typedef void (APIENTRYP PFN_glGenProgramPipelines) (GLsizei n, GLuint *pipelines); + return ((PFN_glGenProgramPipelines)__blue_glCore_glGenProgramPipelines)(n, pipelines); +} + +extern void* __blue_glCore_glIsProgramPipeline; +GLboolean APIENTRY bluegl_glIsProgramPipeline (GLuint pipeline) { + typedef GLboolean (APIENTRYP PFN_glIsProgramPipeline) (GLuint pipeline); + return ((PFN_glIsProgramPipeline)__blue_glCore_glIsProgramPipeline)(pipeline); +} + +extern void* __blue_glCore_glGetProgramPipelineiv; +void APIENTRY bluegl_glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetProgramPipelineiv) (GLuint pipeline, GLenum pname, GLint *params); + return ((PFN_glGetProgramPipelineiv)__blue_glCore_glGetProgramPipelineiv)(pipeline, pname, params); +} + +extern void* __blue_glCore_glProgramUniform1i; +void APIENTRY bluegl_glProgramUniform1i (GLuint program, GLint location, GLint v0) { + typedef void (APIENTRYP PFN_glProgramUniform1i) (GLuint program, GLint location, GLint v0); + return ((PFN_glProgramUniform1i)__blue_glCore_glProgramUniform1i)(program, location, v0); +} + +extern void* __blue_glCore_glProgramUniform1iv; +void APIENTRY bluegl_glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value) { + typedef void (APIENTRYP PFN_glProgramUniform1iv) (GLuint program, GLint location, GLsizei count, const GLint *value); + return ((PFN_glProgramUniform1iv)__blue_glCore_glProgramUniform1iv)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform1f; +void APIENTRY bluegl_glProgramUniform1f (GLuint program, GLint location, GLfloat v0) { + typedef void (APIENTRYP PFN_glProgramUniform1f) (GLuint program, GLint location, GLfloat v0); + return ((PFN_glProgramUniform1f)__blue_glCore_glProgramUniform1f)(program, location, v0); +} + +extern void* __blue_glCore_glProgramUniform1fv; +void APIENTRY bluegl_glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniform1fv) (GLuint program, GLint location, GLsizei count, const GLfloat *value); + return ((PFN_glProgramUniform1fv)__blue_glCore_glProgramUniform1fv)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform1d; +void APIENTRY bluegl_glProgramUniform1d (GLuint program, GLint location, GLdouble v0) { + typedef void (APIENTRYP PFN_glProgramUniform1d) (GLuint program, GLint location, GLdouble v0); + return ((PFN_glProgramUniform1d)__blue_glCore_glProgramUniform1d)(program, location, v0); +} + +extern void* __blue_glCore_glProgramUniform1dv; +void APIENTRY bluegl_glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniform1dv) (GLuint program, GLint location, GLsizei count, const GLdouble *value); + return ((PFN_glProgramUniform1dv)__blue_glCore_glProgramUniform1dv)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform1ui; +void APIENTRY bluegl_glProgramUniform1ui (GLuint program, GLint location, GLuint v0) { + typedef void (APIENTRYP PFN_glProgramUniform1ui) (GLuint program, GLint location, GLuint v0); + return ((PFN_glProgramUniform1ui)__blue_glCore_glProgramUniform1ui)(program, location, v0); +} + +extern void* __blue_glCore_glProgramUniform1uiv; +void APIENTRY bluegl_glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value) { + typedef void (APIENTRYP PFN_glProgramUniform1uiv) (GLuint program, GLint location, GLsizei count, const GLuint *value); + return ((PFN_glProgramUniform1uiv)__blue_glCore_glProgramUniform1uiv)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform2i; +void APIENTRY bluegl_glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1) { + typedef void (APIENTRYP PFN_glProgramUniform2i) (GLuint program, GLint location, GLint v0, GLint v1); + return ((PFN_glProgramUniform2i)__blue_glCore_glProgramUniform2i)(program, location, v0, v1); +} + +extern void* __blue_glCore_glProgramUniform2iv; +void APIENTRY bluegl_glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value) { + typedef void (APIENTRYP PFN_glProgramUniform2iv) (GLuint program, GLint location, GLsizei count, const GLint *value); + return ((PFN_glProgramUniform2iv)__blue_glCore_glProgramUniform2iv)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform2f; +void APIENTRY bluegl_glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1) { + typedef void (APIENTRYP PFN_glProgramUniform2f) (GLuint program, GLint location, GLfloat v0, GLfloat v1); + return ((PFN_glProgramUniform2f)__blue_glCore_glProgramUniform2f)(program, location, v0, v1); +} + +extern void* __blue_glCore_glProgramUniform2fv; +void APIENTRY bluegl_glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniform2fv) (GLuint program, GLint location, GLsizei count, const GLfloat *value); + return ((PFN_glProgramUniform2fv)__blue_glCore_glProgramUniform2fv)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform2d; +void APIENTRY bluegl_glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1) { + typedef void (APIENTRYP PFN_glProgramUniform2d) (GLuint program, GLint location, GLdouble v0, GLdouble v1); + return ((PFN_glProgramUniform2d)__blue_glCore_glProgramUniform2d)(program, location, v0, v1); +} + +extern void* __blue_glCore_glProgramUniform2dv; +void APIENTRY bluegl_glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniform2dv) (GLuint program, GLint location, GLsizei count, const GLdouble *value); + return ((PFN_glProgramUniform2dv)__blue_glCore_glProgramUniform2dv)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform2ui; +void APIENTRY bluegl_glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1) { + typedef void (APIENTRYP PFN_glProgramUniform2ui) (GLuint program, GLint location, GLuint v0, GLuint v1); + return ((PFN_glProgramUniform2ui)__blue_glCore_glProgramUniform2ui)(program, location, v0, v1); +} + +extern void* __blue_glCore_glProgramUniform2uiv; +void APIENTRY bluegl_glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value) { + typedef void (APIENTRYP PFN_glProgramUniform2uiv) (GLuint program, GLint location, GLsizei count, const GLuint *value); + return ((PFN_glProgramUniform2uiv)__blue_glCore_glProgramUniform2uiv)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform3i; +void APIENTRY bluegl_glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2) { + typedef void (APIENTRYP PFN_glProgramUniform3i) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); + return ((PFN_glProgramUniform3i)__blue_glCore_glProgramUniform3i)(program, location, v0, v1, v2); +} + +extern void* __blue_glCore_glProgramUniform3iv; +void APIENTRY bluegl_glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value) { + typedef void (APIENTRYP PFN_glProgramUniform3iv) (GLuint program, GLint location, GLsizei count, const GLint *value); + return ((PFN_glProgramUniform3iv)__blue_glCore_glProgramUniform3iv)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform3f; +void APIENTRY bluegl_glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) { + typedef void (APIENTRYP PFN_glProgramUniform3f) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); + return ((PFN_glProgramUniform3f)__blue_glCore_glProgramUniform3f)(program, location, v0, v1, v2); +} + +extern void* __blue_glCore_glProgramUniform3fv; +void APIENTRY bluegl_glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniform3fv) (GLuint program, GLint location, GLsizei count, const GLfloat *value); + return ((PFN_glProgramUniform3fv)__blue_glCore_glProgramUniform3fv)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform3d; +void APIENTRY bluegl_glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2) { + typedef void (APIENTRYP PFN_glProgramUniform3d) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); + return ((PFN_glProgramUniform3d)__blue_glCore_glProgramUniform3d)(program, location, v0, v1, v2); +} + +extern void* __blue_glCore_glProgramUniform3dv; +void APIENTRY bluegl_glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniform3dv) (GLuint program, GLint location, GLsizei count, const GLdouble *value); + return ((PFN_glProgramUniform3dv)__blue_glCore_glProgramUniform3dv)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform3ui; +void APIENTRY bluegl_glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2) { + typedef void (APIENTRYP PFN_glProgramUniform3ui) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); + return ((PFN_glProgramUniform3ui)__blue_glCore_glProgramUniform3ui)(program, location, v0, v1, v2); +} + +extern void* __blue_glCore_glProgramUniform3uiv; +void APIENTRY bluegl_glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value) { + typedef void (APIENTRYP PFN_glProgramUniform3uiv) (GLuint program, GLint location, GLsizei count, const GLuint *value); + return ((PFN_glProgramUniform3uiv)__blue_glCore_glProgramUniform3uiv)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform4i; +void APIENTRY bluegl_glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3) { + typedef void (APIENTRYP PFN_glProgramUniform4i) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); + return ((PFN_glProgramUniform4i)__blue_glCore_glProgramUniform4i)(program, location, v0, v1, v2, v3); +} + +extern void* __blue_glCore_glProgramUniform4iv; +void APIENTRY bluegl_glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value) { + typedef void (APIENTRYP PFN_glProgramUniform4iv) (GLuint program, GLint location, GLsizei count, const GLint *value); + return ((PFN_glProgramUniform4iv)__blue_glCore_glProgramUniform4iv)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform4f; +void APIENTRY bluegl_glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) { + typedef void (APIENTRYP PFN_glProgramUniform4f) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); + return ((PFN_glProgramUniform4f)__blue_glCore_glProgramUniform4f)(program, location, v0, v1, v2, v3); +} + +extern void* __blue_glCore_glProgramUniform4fv; +void APIENTRY bluegl_glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniform4fv) (GLuint program, GLint location, GLsizei count, const GLfloat *value); + return ((PFN_glProgramUniform4fv)__blue_glCore_glProgramUniform4fv)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform4d; +void APIENTRY bluegl_glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3) { + typedef void (APIENTRYP PFN_glProgramUniform4d) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); + return ((PFN_glProgramUniform4d)__blue_glCore_glProgramUniform4d)(program, location, v0, v1, v2, v3); +} + +extern void* __blue_glCore_glProgramUniform4dv; +void APIENTRY bluegl_glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniform4dv) (GLuint program, GLint location, GLsizei count, const GLdouble *value); + return ((PFN_glProgramUniform4dv)__blue_glCore_glProgramUniform4dv)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform4ui; +void APIENTRY bluegl_glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) { + typedef void (APIENTRYP PFN_glProgramUniform4ui) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); + return ((PFN_glProgramUniform4ui)__blue_glCore_glProgramUniform4ui)(program, location, v0, v1, v2, v3); +} + +extern void* __blue_glCore_glProgramUniform4uiv; +void APIENTRY bluegl_glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value) { + typedef void (APIENTRYP PFN_glProgramUniform4uiv) (GLuint program, GLint location, GLsizei count, const GLuint *value); + return ((PFN_glProgramUniform4uiv)__blue_glCore_glProgramUniform4uiv)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix2fv; +void APIENTRY bluegl_glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix2fv) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glProgramUniformMatrix2fv)__blue_glCore_glProgramUniformMatrix2fv)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix3fv; +void APIENTRY bluegl_glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix3fv) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glProgramUniformMatrix3fv)__blue_glCore_glProgramUniformMatrix3fv)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix4fv; +void APIENTRY bluegl_glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix4fv) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glProgramUniformMatrix4fv)__blue_glCore_glProgramUniformMatrix4fv)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix2dv; +void APIENTRY bluegl_glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix2dv) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glProgramUniformMatrix2dv)__blue_glCore_glProgramUniformMatrix2dv)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix3dv; +void APIENTRY bluegl_glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix3dv) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glProgramUniformMatrix3dv)__blue_glCore_glProgramUniformMatrix3dv)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix4dv; +void APIENTRY bluegl_glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix4dv) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glProgramUniformMatrix4dv)__blue_glCore_glProgramUniformMatrix4dv)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix2x3fv; +void APIENTRY bluegl_glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix2x3fv) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glProgramUniformMatrix2x3fv)__blue_glCore_glProgramUniformMatrix2x3fv)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix3x2fv; +void APIENTRY bluegl_glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix3x2fv) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glProgramUniformMatrix3x2fv)__blue_glCore_glProgramUniformMatrix3x2fv)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix2x4fv; +void APIENTRY bluegl_glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix2x4fv) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glProgramUniformMatrix2x4fv)__blue_glCore_glProgramUniformMatrix2x4fv)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix4x2fv; +void APIENTRY bluegl_glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix4x2fv) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glProgramUniformMatrix4x2fv)__blue_glCore_glProgramUniformMatrix4x2fv)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix3x4fv; +void APIENTRY bluegl_glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix3x4fv) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glProgramUniformMatrix3x4fv)__blue_glCore_glProgramUniformMatrix3x4fv)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix4x3fv; +void APIENTRY bluegl_glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix4x3fv) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glProgramUniformMatrix4x3fv)__blue_glCore_glProgramUniformMatrix4x3fv)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix2x3dv; +void APIENTRY bluegl_glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix2x3dv) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glProgramUniformMatrix2x3dv)__blue_glCore_glProgramUniformMatrix2x3dv)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix3x2dv; +void APIENTRY bluegl_glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix3x2dv) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glProgramUniformMatrix3x2dv)__blue_glCore_glProgramUniformMatrix3x2dv)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix2x4dv; +void APIENTRY bluegl_glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix2x4dv) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glProgramUniformMatrix2x4dv)__blue_glCore_glProgramUniformMatrix2x4dv)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix4x2dv; +void APIENTRY bluegl_glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix4x2dv) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glProgramUniformMatrix4x2dv)__blue_glCore_glProgramUniformMatrix4x2dv)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix3x4dv; +void APIENTRY bluegl_glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix3x4dv) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glProgramUniformMatrix3x4dv)__blue_glCore_glProgramUniformMatrix3x4dv)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix4x3dv; +void APIENTRY bluegl_glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix4x3dv) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glProgramUniformMatrix4x3dv)__blue_glCore_glProgramUniformMatrix4x3dv)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glValidateProgramPipeline; +void APIENTRY bluegl_glValidateProgramPipeline (GLuint pipeline) { + typedef void (APIENTRYP PFN_glValidateProgramPipeline) (GLuint pipeline); + return ((PFN_glValidateProgramPipeline)__blue_glCore_glValidateProgramPipeline)(pipeline); +} + +extern void* __blue_glCore_glGetProgramPipelineInfoLog; +void APIENTRY bluegl_glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog) { + typedef void (APIENTRYP PFN_glGetProgramPipelineInfoLog) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); + return ((PFN_glGetProgramPipelineInfoLog)__blue_glCore_glGetProgramPipelineInfoLog)(pipeline, bufSize, length, infoLog); +} + +extern void* __blue_glCore_glVertexAttribL1d; +void APIENTRY bluegl_glVertexAttribL1d (GLuint index, GLdouble x) { + typedef void (APIENTRYP PFN_glVertexAttribL1d) (GLuint index, GLdouble x); + return ((PFN_glVertexAttribL1d)__blue_glCore_glVertexAttribL1d)(index, x); +} + +extern void* __blue_glCore_glVertexAttribL2d; +void APIENTRY bluegl_glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y) { + typedef void (APIENTRYP PFN_glVertexAttribL2d) (GLuint index, GLdouble x, GLdouble y); + return ((PFN_glVertexAttribL2d)__blue_glCore_glVertexAttribL2d)(index, x, y); +} + +extern void* __blue_glCore_glVertexAttribL3d; +void APIENTRY bluegl_glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z) { + typedef void (APIENTRYP PFN_glVertexAttribL3d) (GLuint index, GLdouble x, GLdouble y, GLdouble z); + return ((PFN_glVertexAttribL3d)__blue_glCore_glVertexAttribL3d)(index, x, y, z); +} + +extern void* __blue_glCore_glVertexAttribL4d; +void APIENTRY bluegl_glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { + typedef void (APIENTRYP PFN_glVertexAttribL4d) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + return ((PFN_glVertexAttribL4d)__blue_glCore_glVertexAttribL4d)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttribL1dv; +void APIENTRY bluegl_glVertexAttribL1dv (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttribL1dv) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttribL1dv)__blue_glCore_glVertexAttribL1dv)(index, v); +} + +extern void* __blue_glCore_glVertexAttribL2dv; +void APIENTRY bluegl_glVertexAttribL2dv (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttribL2dv) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttribL2dv)__blue_glCore_glVertexAttribL2dv)(index, v); +} + +extern void* __blue_glCore_glVertexAttribL3dv; +void APIENTRY bluegl_glVertexAttribL3dv (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttribL3dv) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttribL3dv)__blue_glCore_glVertexAttribL3dv)(index, v); +} + +extern void* __blue_glCore_glVertexAttribL4dv; +void APIENTRY bluegl_glVertexAttribL4dv (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttribL4dv) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttribL4dv)__blue_glCore_glVertexAttribL4dv)(index, v); +} + +extern void* __blue_glCore_glVertexAttribLPointer; +void APIENTRY bluegl_glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer) { + typedef void (APIENTRYP PFN_glVertexAttribLPointer) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); + return ((PFN_glVertexAttribLPointer)__blue_glCore_glVertexAttribLPointer)(index, size, type, stride, pointer); +} + +extern void* __blue_glCore_glGetVertexAttribLdv; +void APIENTRY bluegl_glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribLdv) (GLuint index, GLenum pname, GLdouble *params); + return ((PFN_glGetVertexAttribLdv)__blue_glCore_glGetVertexAttribLdv)(index, pname, params); +} + +extern void* __blue_glCore_glViewportArrayv; +void APIENTRY bluegl_glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v) { + typedef void (APIENTRYP PFN_glViewportArrayv) (GLuint first, GLsizei count, const GLfloat *v); + return ((PFN_glViewportArrayv)__blue_glCore_glViewportArrayv)(first, count, v); +} + +extern void* __blue_glCore_glViewportIndexedf; +void APIENTRY bluegl_glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h) { + typedef void (APIENTRYP PFN_glViewportIndexedf) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); + return ((PFN_glViewportIndexedf)__blue_glCore_glViewportIndexedf)(index, x, y, w, h); +} + +extern void* __blue_glCore_glViewportIndexedfv; +void APIENTRY bluegl_glViewportIndexedfv (GLuint index, const GLfloat *v) { + typedef void (APIENTRYP PFN_glViewportIndexedfv) (GLuint index, const GLfloat *v); + return ((PFN_glViewportIndexedfv)__blue_glCore_glViewportIndexedfv)(index, v); +} + +extern void* __blue_glCore_glScissorArrayv; +void APIENTRY bluegl_glScissorArrayv (GLuint first, GLsizei count, const GLint *v) { + typedef void (APIENTRYP PFN_glScissorArrayv) (GLuint first, GLsizei count, const GLint *v); + return ((PFN_glScissorArrayv)__blue_glCore_glScissorArrayv)(first, count, v); +} + +extern void* __blue_glCore_glScissorIndexed; +void APIENTRY bluegl_glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glScissorIndexed) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); + return ((PFN_glScissorIndexed)__blue_glCore_glScissorIndexed)(index, left, bottom, width, height); +} + +extern void* __blue_glCore_glScissorIndexedv; +void APIENTRY bluegl_glScissorIndexedv (GLuint index, const GLint *v) { + typedef void (APIENTRYP PFN_glScissorIndexedv) (GLuint index, const GLint *v); + return ((PFN_glScissorIndexedv)__blue_glCore_glScissorIndexedv)(index, v); +} + +extern void* __blue_glCore_glDepthRangeArrayv; +void APIENTRY bluegl_glDepthRangeArrayv (GLuint first, GLsizei count, const GLdouble *v) { + typedef void (APIENTRYP PFN_glDepthRangeArrayv) (GLuint first, GLsizei count, const GLdouble *v); + return ((PFN_glDepthRangeArrayv)__blue_glCore_glDepthRangeArrayv)(first, count, v); +} + +extern void* __blue_glCore_glDepthRangeIndexed; +void APIENTRY bluegl_glDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f) { + typedef void (APIENTRYP PFN_glDepthRangeIndexed) (GLuint index, GLdouble n, GLdouble f); + return ((PFN_glDepthRangeIndexed)__blue_glCore_glDepthRangeIndexed)(index, n, f); +} + +extern void* __blue_glCore_glGetFloati_v; +void APIENTRY bluegl_glGetFloati_v (GLenum target, GLuint index, GLfloat *data) { + typedef void (APIENTRYP PFN_glGetFloati_v) (GLenum target, GLuint index, GLfloat *data); + return ((PFN_glGetFloati_v)__blue_glCore_glGetFloati_v)(target, index, data); +} + +extern void* __blue_glCore_glGetDoublei_v; +void APIENTRY bluegl_glGetDoublei_v (GLenum target, GLuint index, GLdouble *data) { + typedef void (APIENTRYP PFN_glGetDoublei_v) (GLenum target, GLuint index, GLdouble *data); + return ((PFN_glGetDoublei_v)__blue_glCore_glGetDoublei_v)(target, index, data); +} + +extern void* __blue_glCore_glDrawArraysInstancedBaseInstance; +void APIENTRY bluegl_glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance) { + typedef void (APIENTRYP PFN_glDrawArraysInstancedBaseInstance) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); + return ((PFN_glDrawArraysInstancedBaseInstance)__blue_glCore_glDrawArraysInstancedBaseInstance)(mode, first, count, instancecount, baseinstance); +} + +extern void* __blue_glCore_glDrawElementsInstancedBaseInstance; +void APIENTRY bluegl_glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance) { + typedef void (APIENTRYP PFN_glDrawElementsInstancedBaseInstance) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); + return ((PFN_glDrawElementsInstancedBaseInstance)__blue_glCore_glDrawElementsInstancedBaseInstance)(mode, count, type, indices, instancecount, baseinstance); +} + +extern void* __blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance; +void APIENTRY bluegl_glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance) { + typedef void (APIENTRYP PFN_glDrawElementsInstancedBaseVertexBaseInstance) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); + return ((PFN_glDrawElementsInstancedBaseVertexBaseInstance)__blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance)(mode, count, type, indices, instancecount, basevertex, baseinstance); +} + +extern void* __blue_glCore_glGetInternalformativ; +void APIENTRY bluegl_glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params) { + typedef void (APIENTRYP PFN_glGetInternalformativ) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); + return ((PFN_glGetInternalformativ)__blue_glCore_glGetInternalformativ)(target, internalformat, pname, bufSize, params); +} + +extern void* __blue_glCore_glGetActiveAtomicCounterBufferiv; +void APIENTRY bluegl_glGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetActiveAtomicCounterBufferiv) (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); + return ((PFN_glGetActiveAtomicCounterBufferiv)__blue_glCore_glGetActiveAtomicCounterBufferiv)(program, bufferIndex, pname, params); +} + +extern void* __blue_glCore_glBindImageTexture; +void APIENTRY bluegl_glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format) { + typedef void (APIENTRYP PFN_glBindImageTexture) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); + return ((PFN_glBindImageTexture)__blue_glCore_glBindImageTexture)(unit, texture, level, layered, layer, access, format); +} + +extern void* __blue_glCore_glMemoryBarrier; +void APIENTRY bluegl_glMemoryBarrier (GLbitfield barriers) { + typedef void (APIENTRYP PFN_glMemoryBarrier) (GLbitfield barriers); + return ((PFN_glMemoryBarrier)__blue_glCore_glMemoryBarrier)(barriers); +} + +extern void* __blue_glCore_glTexStorage1D; +void APIENTRY bluegl_glTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width) { + typedef void (APIENTRYP PFN_glTexStorage1D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); + return ((PFN_glTexStorage1D)__blue_glCore_glTexStorage1D)(target, levels, internalformat, width); +} + +extern void* __blue_glCore_glTexStorage2D; +void APIENTRY bluegl_glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glTexStorage2D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); + return ((PFN_glTexStorage2D)__blue_glCore_glTexStorage2D)(target, levels, internalformat, width, height); +} + +extern void* __blue_glCore_glTexStorage3D; +void APIENTRY bluegl_glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { + typedef void (APIENTRYP PFN_glTexStorage3D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); + return ((PFN_glTexStorage3D)__blue_glCore_glTexStorage3D)(target, levels, internalformat, width, height, depth); +} + +extern void* __blue_glCore_glDrawTransformFeedbackInstanced; +void APIENTRY bluegl_glDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount) { + typedef void (APIENTRYP PFN_glDrawTransformFeedbackInstanced) (GLenum mode, GLuint id, GLsizei instancecount); + return ((PFN_glDrawTransformFeedbackInstanced)__blue_glCore_glDrawTransformFeedbackInstanced)(mode, id, instancecount); +} + +extern void* __blue_glCore_glDrawTransformFeedbackStreamInstanced; +void APIENTRY bluegl_glDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount) { + typedef void (APIENTRYP PFN_glDrawTransformFeedbackStreamInstanced) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); + return ((PFN_glDrawTransformFeedbackStreamInstanced)__blue_glCore_glDrawTransformFeedbackStreamInstanced)(mode, id, stream, instancecount); +} + +extern void* __blue_glCore_glClearBufferData; +void APIENTRY bluegl_glClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data) { + typedef void (APIENTRYP PFN_glClearBufferData) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); + return ((PFN_glClearBufferData)__blue_glCore_glClearBufferData)(target, internalformat, format, type, data); +} + +extern void* __blue_glCore_glClearBufferSubData; +void APIENTRY bluegl_glClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data) { + typedef void (APIENTRYP PFN_glClearBufferSubData) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); + return ((PFN_glClearBufferSubData)__blue_glCore_glClearBufferSubData)(target, internalformat, offset, size, format, type, data); +} + +extern void* __blue_glCore_glDispatchCompute; +void APIENTRY bluegl_glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z) { + typedef void (APIENTRYP PFN_glDispatchCompute) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); + return ((PFN_glDispatchCompute)__blue_glCore_glDispatchCompute)(num_groups_x, num_groups_y, num_groups_z); +} + +extern void* __blue_glCore_glDispatchComputeIndirect; +void APIENTRY bluegl_glDispatchComputeIndirect (GLintptr indirect) { + typedef void (APIENTRYP PFN_glDispatchComputeIndirect) (GLintptr indirect); + return ((PFN_glDispatchComputeIndirect)__blue_glCore_glDispatchComputeIndirect)(indirect); +} + +extern void* __blue_glCore_glCopyImageSubData; +void APIENTRY bluegl_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) { + typedef void (APIENTRYP PFN_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); + return ((PFN_glCopyImageSubData)__blue_glCore_glCopyImageSubData)(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth); +} + +extern void* __blue_glCore_glFramebufferParameteri; +void APIENTRY bluegl_glFramebufferParameteri (GLenum target, GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glFramebufferParameteri) (GLenum target, GLenum pname, GLint param); + return ((PFN_glFramebufferParameteri)__blue_glCore_glFramebufferParameteri)(target, pname, param); +} + +extern void* __blue_glCore_glGetFramebufferParameteriv; +void APIENTRY bluegl_glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetFramebufferParameteriv) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetFramebufferParameteriv)__blue_glCore_glGetFramebufferParameteriv)(target, pname, params); +} + +extern void* __blue_glCore_glGetInternalformati64v; +void APIENTRY bluegl_glGetInternalformati64v (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params) { + typedef void (APIENTRYP PFN_glGetInternalformati64v) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); + return ((PFN_glGetInternalformati64v)__blue_glCore_glGetInternalformati64v)(target, internalformat, pname, bufSize, params); +} + +extern void* __blue_glCore_glInvalidateTexSubImage; +void APIENTRY bluegl_glInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth) { + typedef void (APIENTRYP PFN_glInvalidateTexSubImage) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); + return ((PFN_glInvalidateTexSubImage)__blue_glCore_glInvalidateTexSubImage)(texture, level, xoffset, yoffset, zoffset, width, height, depth); +} + +extern void* __blue_glCore_glInvalidateTexImage; +void APIENTRY bluegl_glInvalidateTexImage (GLuint texture, GLint level) { + typedef void (APIENTRYP PFN_glInvalidateTexImage) (GLuint texture, GLint level); + return ((PFN_glInvalidateTexImage)__blue_glCore_glInvalidateTexImage)(texture, level); +} + +extern void* __blue_glCore_glInvalidateBufferSubData; +void APIENTRY bluegl_glInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length) { + typedef void (APIENTRYP PFN_glInvalidateBufferSubData) (GLuint buffer, GLintptr offset, GLsizeiptr length); + return ((PFN_glInvalidateBufferSubData)__blue_glCore_glInvalidateBufferSubData)(buffer, offset, length); +} + +extern void* __blue_glCore_glInvalidateBufferData; +void APIENTRY bluegl_glInvalidateBufferData (GLuint buffer) { + typedef void (APIENTRYP PFN_glInvalidateBufferData) (GLuint buffer); + return ((PFN_glInvalidateBufferData)__blue_glCore_glInvalidateBufferData)(buffer); +} + +extern void* __blue_glCore_glInvalidateFramebuffer; +void APIENTRY bluegl_glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments) { + typedef void (APIENTRYP PFN_glInvalidateFramebuffer) (GLenum target, GLsizei numAttachments, const GLenum *attachments); + return ((PFN_glInvalidateFramebuffer)__blue_glCore_glInvalidateFramebuffer)(target, numAttachments, attachments); +} + +extern void* __blue_glCore_glInvalidateSubFramebuffer; +void APIENTRY bluegl_glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glInvalidateSubFramebuffer) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); + return ((PFN_glInvalidateSubFramebuffer)__blue_glCore_glInvalidateSubFramebuffer)(target, numAttachments, attachments, x, y, width, height); +} + +extern void* __blue_glCore_glMultiDrawArraysIndirect; +void APIENTRY bluegl_glMultiDrawArraysIndirect (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride) { + typedef void (APIENTRYP PFN_glMultiDrawArraysIndirect) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); + return ((PFN_glMultiDrawArraysIndirect)__blue_glCore_glMultiDrawArraysIndirect)(mode, indirect, drawcount, stride); +} + +extern void* __blue_glCore_glMultiDrawElementsIndirect; +void APIENTRY bluegl_glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride) { + typedef void (APIENTRYP PFN_glMultiDrawElementsIndirect) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); + return ((PFN_glMultiDrawElementsIndirect)__blue_glCore_glMultiDrawElementsIndirect)(mode, type, indirect, drawcount, stride); +} + +extern void* __blue_glCore_glGetProgramInterfaceiv; +void APIENTRY bluegl_glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetProgramInterfaceiv) (GLuint program, GLenum programInterface, GLenum pname, GLint *params); + return ((PFN_glGetProgramInterfaceiv)__blue_glCore_glGetProgramInterfaceiv)(program, programInterface, pname, params); +} + +extern void* __blue_glCore_glGetProgramResourceIndex; +GLuint APIENTRY bluegl_glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name) { + typedef GLuint (APIENTRYP PFN_glGetProgramResourceIndex) (GLuint program, GLenum programInterface, const GLchar *name); + return ((PFN_glGetProgramResourceIndex)__blue_glCore_glGetProgramResourceIndex)(program, programInterface, name); +} + +extern void* __blue_glCore_glGetProgramResourceName; +void APIENTRY bluegl_glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name) { + typedef void (APIENTRYP PFN_glGetProgramResourceName) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); + return ((PFN_glGetProgramResourceName)__blue_glCore_glGetProgramResourceName)(program, programInterface, index, bufSize, length, name); +} + +extern void* __blue_glCore_glGetProgramResourceiv; +void APIENTRY bluegl_glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params) { + typedef void (APIENTRYP PFN_glGetProgramResourceiv) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); + return ((PFN_glGetProgramResourceiv)__blue_glCore_glGetProgramResourceiv)(program, programInterface, index, propCount, props, bufSize, length, params); +} + +extern void* __blue_glCore_glGetProgramResourceLocation; +GLint APIENTRY bluegl_glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name) { + typedef GLint (APIENTRYP PFN_glGetProgramResourceLocation) (GLuint program, GLenum programInterface, const GLchar *name); + return ((PFN_glGetProgramResourceLocation)__blue_glCore_glGetProgramResourceLocation)(program, programInterface, name); +} + +extern void* __blue_glCore_glGetProgramResourceLocationIndex; +GLint APIENTRY bluegl_glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name) { + typedef GLint (APIENTRYP PFN_glGetProgramResourceLocationIndex) (GLuint program, GLenum programInterface, const GLchar *name); + return ((PFN_glGetProgramResourceLocationIndex)__blue_glCore_glGetProgramResourceLocationIndex)(program, programInterface, name); +} + +extern void* __blue_glCore_glShaderStorageBlockBinding; +void APIENTRY bluegl_glShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding) { + typedef void (APIENTRYP PFN_glShaderStorageBlockBinding) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); + return ((PFN_glShaderStorageBlockBinding)__blue_glCore_glShaderStorageBlockBinding)(program, storageBlockIndex, storageBlockBinding); +} + +extern void* __blue_glCore_glTexBufferRange; +void APIENTRY bluegl_glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) { + typedef void (APIENTRYP PFN_glTexBufferRange) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); + return ((PFN_glTexBufferRange)__blue_glCore_glTexBufferRange)(target, internalformat, buffer, offset, size); +} + +extern void* __blue_glCore_glTexStorage2DMultisample; +void APIENTRY bluegl_glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) { + typedef void (APIENTRYP PFN_glTexStorage2DMultisample) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); + return ((PFN_glTexStorage2DMultisample)__blue_glCore_glTexStorage2DMultisample)(target, samples, internalformat, width, height, fixedsamplelocations); +} + +extern void* __blue_glCore_glTexStorage3DMultisample; +void APIENTRY bluegl_glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { + typedef void (APIENTRYP PFN_glTexStorage3DMultisample) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); + return ((PFN_glTexStorage3DMultisample)__blue_glCore_glTexStorage3DMultisample)(target, samples, internalformat, width, height, depth, fixedsamplelocations); +} + +extern void* __blue_glCore_glTextureView; +void APIENTRY bluegl_glTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers) { + typedef void (APIENTRYP PFN_glTextureView) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); + return ((PFN_glTextureView)__blue_glCore_glTextureView)(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers); +} + +extern void* __blue_glCore_glBindVertexBuffer; +void APIENTRY bluegl_glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride) { + typedef void (APIENTRYP PFN_glBindVertexBuffer) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); + return ((PFN_glBindVertexBuffer)__blue_glCore_glBindVertexBuffer)(bindingindex, buffer, offset, stride); +} + +extern void* __blue_glCore_glVertexAttribFormat; +void APIENTRY bluegl_glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset) { + typedef void (APIENTRYP PFN_glVertexAttribFormat) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); + return ((PFN_glVertexAttribFormat)__blue_glCore_glVertexAttribFormat)(attribindex, size, type, normalized, relativeoffset); +} + +extern void* __blue_glCore_glVertexAttribIFormat; +void APIENTRY bluegl_glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { + typedef void (APIENTRYP PFN_glVertexAttribIFormat) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); + return ((PFN_glVertexAttribIFormat)__blue_glCore_glVertexAttribIFormat)(attribindex, size, type, relativeoffset); +} + +extern void* __blue_glCore_glVertexAttribLFormat; +void APIENTRY bluegl_glVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { + typedef void (APIENTRYP PFN_glVertexAttribLFormat) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); + return ((PFN_glVertexAttribLFormat)__blue_glCore_glVertexAttribLFormat)(attribindex, size, type, relativeoffset); +} + +extern void* __blue_glCore_glVertexAttribBinding; +void APIENTRY bluegl_glVertexAttribBinding (GLuint attribindex, GLuint bindingindex) { + typedef void (APIENTRYP PFN_glVertexAttribBinding) (GLuint attribindex, GLuint bindingindex); + return ((PFN_glVertexAttribBinding)__blue_glCore_glVertexAttribBinding)(attribindex, bindingindex); +} + +extern void* __blue_glCore_glVertexBindingDivisor; +void APIENTRY bluegl_glVertexBindingDivisor (GLuint bindingindex, GLuint divisor) { + typedef void (APIENTRYP PFN_glVertexBindingDivisor) (GLuint bindingindex, GLuint divisor); + return ((PFN_glVertexBindingDivisor)__blue_glCore_glVertexBindingDivisor)(bindingindex, divisor); +} + +extern void* __blue_glCore_glDebugMessageControl; +void APIENTRY bluegl_glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled) { + typedef void (APIENTRYP PFN_glDebugMessageControl) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); + return ((PFN_glDebugMessageControl)__blue_glCore_glDebugMessageControl)(source, type, severity, count, ids, enabled); +} + +extern void* __blue_glCore_glDebugMessageInsert; +void APIENTRY bluegl_glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf) { + typedef void (APIENTRYP PFN_glDebugMessageInsert) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); + return ((PFN_glDebugMessageInsert)__blue_glCore_glDebugMessageInsert)(source, type, id, severity, length, buf); +} + +extern void* __blue_glCore_glDebugMessageCallback; +void APIENTRY bluegl_glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam) { + typedef void (APIENTRYP PFN_glDebugMessageCallback) (GLDEBUGPROC callback, const void *userParam); + return ((PFN_glDebugMessageCallback)__blue_glCore_glDebugMessageCallback)(callback, userParam); +} + +extern void* __blue_glCore_glGetDebugMessageLog; +GLuint APIENTRY bluegl_glGetDebugMessageLog (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog) { + typedef GLuint (APIENTRYP PFN_glGetDebugMessageLog) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); + return ((PFN_glGetDebugMessageLog)__blue_glCore_glGetDebugMessageLog)(count, bufSize, sources, types, ids, severities, lengths, messageLog); +} + +extern void* __blue_glCore_glPushDebugGroup; +void APIENTRY bluegl_glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message) { + typedef void (APIENTRYP PFN_glPushDebugGroup) (GLenum source, GLuint id, GLsizei length, const GLchar *message); + return ((PFN_glPushDebugGroup)__blue_glCore_glPushDebugGroup)(source, id, length, message); +} + +extern void* __blue_glCore_glPopDebugGroup; +void APIENTRY bluegl_glPopDebugGroup (void) { + typedef void (APIENTRYP PFN_glPopDebugGroup) (void); + return ((PFN_glPopDebugGroup)__blue_glCore_glPopDebugGroup)(); +} + +extern void* __blue_glCore_glObjectLabel; +void APIENTRY bluegl_glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label) { + typedef void (APIENTRYP PFN_glObjectLabel) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); + return ((PFN_glObjectLabel)__blue_glCore_glObjectLabel)(identifier, name, length, label); +} + +extern void* __blue_glCore_glGetObjectLabel; +void APIENTRY bluegl_glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label) { + typedef void (APIENTRYP PFN_glGetObjectLabel) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); + return ((PFN_glGetObjectLabel)__blue_glCore_glGetObjectLabel)(identifier, name, bufSize, length, label); +} + +extern void* __blue_glCore_glObjectPtrLabel; +void APIENTRY bluegl_glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label) { + typedef void (APIENTRYP PFN_glObjectPtrLabel) (const void *ptr, GLsizei length, const GLchar *label); + return ((PFN_glObjectPtrLabel)__blue_glCore_glObjectPtrLabel)(ptr, length, label); +} + +extern void* __blue_glCore_glGetObjectPtrLabel; +void APIENTRY bluegl_glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label) { + typedef void (APIENTRYP PFN_glGetObjectPtrLabel) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); + return ((PFN_glGetObjectPtrLabel)__blue_glCore_glGetObjectPtrLabel)(ptr, bufSize, length, label); +} + +extern void* __blue_glCore_glBufferStorage; +void APIENTRY bluegl_glBufferStorage (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags) { + typedef void (APIENTRYP PFN_glBufferStorage) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); + return ((PFN_glBufferStorage)__blue_glCore_glBufferStorage)(target, size, data, flags); +} + +extern void* __blue_glCore_glClearTexImage; +void APIENTRY bluegl_glClearTexImage (GLuint texture, GLint level, GLenum format, GLenum type, const void *data) { + typedef void (APIENTRYP PFN_glClearTexImage) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); + return ((PFN_glClearTexImage)__blue_glCore_glClearTexImage)(texture, level, format, type, data); +} + +extern void* __blue_glCore_glClearTexSubImage; +void APIENTRY bluegl_glClearTexSubImage (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 PFN_glClearTexSubImage) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); + return ((PFN_glClearTexSubImage)__blue_glCore_glClearTexSubImage)(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); +} + +extern void* __blue_glCore_glBindBuffersBase; +void APIENTRY bluegl_glBindBuffersBase (GLenum target, GLuint first, GLsizei count, const GLuint *buffers) { + typedef void (APIENTRYP PFN_glBindBuffersBase) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); + return ((PFN_glBindBuffersBase)__blue_glCore_glBindBuffersBase)(target, first, count, buffers); +} + +extern void* __blue_glCore_glBindBuffersRange; +void APIENTRY bluegl_glBindBuffersRange (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes) { + typedef void (APIENTRYP PFN_glBindBuffersRange) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); + return ((PFN_glBindBuffersRange)__blue_glCore_glBindBuffersRange)(target, first, count, buffers, offsets, sizes); +} + +extern void* __blue_glCore_glBindTextures; +void APIENTRY bluegl_glBindTextures (GLuint first, GLsizei count, const GLuint *textures) { + typedef void (APIENTRYP PFN_glBindTextures) (GLuint first, GLsizei count, const GLuint *textures); + return ((PFN_glBindTextures)__blue_glCore_glBindTextures)(first, count, textures); +} + +extern void* __blue_glCore_glBindSamplers; +void APIENTRY bluegl_glBindSamplers (GLuint first, GLsizei count, const GLuint *samplers) { + typedef void (APIENTRYP PFN_glBindSamplers) (GLuint first, GLsizei count, const GLuint *samplers); + return ((PFN_glBindSamplers)__blue_glCore_glBindSamplers)(first, count, samplers); +} + +extern void* __blue_glCore_glBindImageTextures; +void APIENTRY bluegl_glBindImageTextures (GLuint first, GLsizei count, const GLuint *textures) { + typedef void (APIENTRYP PFN_glBindImageTextures) (GLuint first, GLsizei count, const GLuint *textures); + return ((PFN_glBindImageTextures)__blue_glCore_glBindImageTextures)(first, count, textures); +} + +extern void* __blue_glCore_glBindVertexBuffers; +void APIENTRY bluegl_glBindVertexBuffers (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides) { + typedef void (APIENTRYP PFN_glBindVertexBuffers) (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); + return ((PFN_glBindVertexBuffers)__blue_glCore_glBindVertexBuffers)(first, count, buffers, offsets, strides); +} + +extern void* __blue_glCore_glClipControl; +void APIENTRY bluegl_glClipControl (GLenum origin, GLenum depth) { + typedef void (APIENTRYP PFN_glClipControl) (GLenum origin, GLenum depth); + return ((PFN_glClipControl)__blue_glCore_glClipControl)(origin, depth); +} + +extern void* __blue_glCore_glCreateTransformFeedbacks; +void APIENTRY bluegl_glCreateTransformFeedbacks (GLsizei n, GLuint *ids) { + typedef void (APIENTRYP PFN_glCreateTransformFeedbacks) (GLsizei n, GLuint *ids); + return ((PFN_glCreateTransformFeedbacks)__blue_glCore_glCreateTransformFeedbacks)(n, ids); +} + +extern void* __blue_glCore_glTransformFeedbackBufferBase; +void APIENTRY bluegl_glTransformFeedbackBufferBase (GLuint xfb, GLuint index, GLuint buffer) { + typedef void (APIENTRYP PFN_glTransformFeedbackBufferBase) (GLuint xfb, GLuint index, GLuint buffer); + return ((PFN_glTransformFeedbackBufferBase)__blue_glCore_glTransformFeedbackBufferBase)(xfb, index, buffer); +} + +extern void* __blue_glCore_glTransformFeedbackBufferRange; +void APIENTRY bluegl_glTransformFeedbackBufferRange (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { + typedef void (APIENTRYP PFN_glTransformFeedbackBufferRange) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); + return ((PFN_glTransformFeedbackBufferRange)__blue_glCore_glTransformFeedbackBufferRange)(xfb, index, buffer, offset, size); +} + +extern void* __blue_glCore_glGetTransformFeedbackiv; +void APIENTRY bluegl_glGetTransformFeedbackiv (GLuint xfb, GLenum pname, GLint *param) { + typedef void (APIENTRYP PFN_glGetTransformFeedbackiv) (GLuint xfb, GLenum pname, GLint *param); + return ((PFN_glGetTransformFeedbackiv)__blue_glCore_glGetTransformFeedbackiv)(xfb, pname, param); +} + +extern void* __blue_glCore_glGetTransformFeedbacki_v; +void APIENTRY bluegl_glGetTransformFeedbacki_v (GLuint xfb, GLenum pname, GLuint index, GLint *param) { + typedef void (APIENTRYP PFN_glGetTransformFeedbacki_v) (GLuint xfb, GLenum pname, GLuint index, GLint *param); + return ((PFN_glGetTransformFeedbacki_v)__blue_glCore_glGetTransformFeedbacki_v)(xfb, pname, index, param); +} + +extern void* __blue_glCore_glGetTransformFeedbacki64_v; +void APIENTRY bluegl_glGetTransformFeedbacki64_v (GLuint xfb, GLenum pname, GLuint index, GLint64 *param) { + typedef void (APIENTRYP PFN_glGetTransformFeedbacki64_v) (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); + return ((PFN_glGetTransformFeedbacki64_v)__blue_glCore_glGetTransformFeedbacki64_v)(xfb, pname, index, param); +} + +extern void* __blue_glCore_glCreateBuffers; +void APIENTRY bluegl_glCreateBuffers (GLsizei n, GLuint *buffers) { + typedef void (APIENTRYP PFN_glCreateBuffers) (GLsizei n, GLuint *buffers); + return ((PFN_glCreateBuffers)__blue_glCore_glCreateBuffers)(n, buffers); +} + +extern void* __blue_glCore_glNamedBufferStorage; +void APIENTRY bluegl_glNamedBufferStorage (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags) { + typedef void (APIENTRYP PFN_glNamedBufferStorage) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); + return ((PFN_glNamedBufferStorage)__blue_glCore_glNamedBufferStorage)(buffer, size, data, flags); +} + +extern void* __blue_glCore_glNamedBufferData; +void APIENTRY bluegl_glNamedBufferData (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage) { + typedef void (APIENTRYP PFN_glNamedBufferData) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); + return ((PFN_glNamedBufferData)__blue_glCore_glNamedBufferData)(buffer, size, data, usage); +} + +extern void* __blue_glCore_glNamedBufferSubData; +void APIENTRY bluegl_glNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data) { + typedef void (APIENTRYP PFN_glNamedBufferSubData) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); + return ((PFN_glNamedBufferSubData)__blue_glCore_glNamedBufferSubData)(buffer, offset, size, data); +} + +extern void* __blue_glCore_glCopyNamedBufferSubData; +void APIENTRY bluegl_glCopyNamedBufferSubData (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) { + typedef void (APIENTRYP PFN_glCopyNamedBufferSubData) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); + return ((PFN_glCopyNamedBufferSubData)__blue_glCore_glCopyNamedBufferSubData)(readBuffer, writeBuffer, readOffset, writeOffset, size); +} + +extern void* __blue_glCore_glClearNamedBufferData; +void APIENTRY bluegl_glClearNamedBufferData (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data) { + typedef void (APIENTRYP PFN_glClearNamedBufferData) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); + return ((PFN_glClearNamedBufferData)__blue_glCore_glClearNamedBufferData)(buffer, internalformat, format, type, data); +} + +extern void* __blue_glCore_glClearNamedBufferSubData; +void APIENTRY bluegl_glClearNamedBufferSubData (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data) { + typedef void (APIENTRYP PFN_glClearNamedBufferSubData) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); + return ((PFN_glClearNamedBufferSubData)__blue_glCore_glClearNamedBufferSubData)(buffer, internalformat, offset, size, format, type, data); +} + +extern void* __blue_glCore_glMapNamedBuffer; +void *APIENTRY bluegl_glMapNamedBuffer (GLuint buffer, GLenum access) { + typedef void *(APIENTRYP PFN_glMapNamedBuffer) (GLuint buffer, GLenum access); + return ((PFN_glMapNamedBuffer)__blue_glCore_glMapNamedBuffer)(buffer, access); +} + +extern void* __blue_glCore_glMapNamedBufferRange; +void *APIENTRY bluegl_glMapNamedBufferRange (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access) { + typedef void *(APIENTRYP PFN_glMapNamedBufferRange) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); + return ((PFN_glMapNamedBufferRange)__blue_glCore_glMapNamedBufferRange)(buffer, offset, length, access); +} + +extern void* __blue_glCore_glUnmapNamedBuffer; +GLboolean APIENTRY bluegl_glUnmapNamedBuffer (GLuint buffer) { + typedef GLboolean (APIENTRYP PFN_glUnmapNamedBuffer) (GLuint buffer); + return ((PFN_glUnmapNamedBuffer)__blue_glCore_glUnmapNamedBuffer)(buffer); +} + +extern void* __blue_glCore_glFlushMappedNamedBufferRange; +void APIENTRY bluegl_glFlushMappedNamedBufferRange (GLuint buffer, GLintptr offset, GLsizeiptr length) { + typedef void (APIENTRYP PFN_glFlushMappedNamedBufferRange) (GLuint buffer, GLintptr offset, GLsizeiptr length); + return ((PFN_glFlushMappedNamedBufferRange)__blue_glCore_glFlushMappedNamedBufferRange)(buffer, offset, length); +} + +extern void* __blue_glCore_glGetNamedBufferParameteriv; +void APIENTRY bluegl_glGetNamedBufferParameteriv (GLuint buffer, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetNamedBufferParameteriv) (GLuint buffer, GLenum pname, GLint *params); + return ((PFN_glGetNamedBufferParameteriv)__blue_glCore_glGetNamedBufferParameteriv)(buffer, pname, params); +} + +extern void* __blue_glCore_glGetNamedBufferParameteri64v; +void APIENTRY bluegl_glGetNamedBufferParameteri64v (GLuint buffer, GLenum pname, GLint64 *params) { + typedef void (APIENTRYP PFN_glGetNamedBufferParameteri64v) (GLuint buffer, GLenum pname, GLint64 *params); + return ((PFN_glGetNamedBufferParameteri64v)__blue_glCore_glGetNamedBufferParameteri64v)(buffer, pname, params); +} + +extern void* __blue_glCore_glGetNamedBufferPointerv; +void APIENTRY bluegl_glGetNamedBufferPointerv (GLuint buffer, GLenum pname, void **params) { + typedef void (APIENTRYP PFN_glGetNamedBufferPointerv) (GLuint buffer, GLenum pname, void **params); + return ((PFN_glGetNamedBufferPointerv)__blue_glCore_glGetNamedBufferPointerv)(buffer, pname, params); +} + +extern void* __blue_glCore_glGetNamedBufferSubData; +void APIENTRY bluegl_glGetNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data) { + typedef void (APIENTRYP PFN_glGetNamedBufferSubData) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); + return ((PFN_glGetNamedBufferSubData)__blue_glCore_glGetNamedBufferSubData)(buffer, offset, size, data); +} + +extern void* __blue_glCore_glCreateFramebuffers; +void APIENTRY bluegl_glCreateFramebuffers (GLsizei n, GLuint *framebuffers) { + typedef void (APIENTRYP PFN_glCreateFramebuffers) (GLsizei n, GLuint *framebuffers); + return ((PFN_glCreateFramebuffers)__blue_glCore_glCreateFramebuffers)(n, framebuffers); +} + +extern void* __blue_glCore_glNamedFramebufferRenderbuffer; +void APIENTRY bluegl_glNamedFramebufferRenderbuffer (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) { + typedef void (APIENTRYP PFN_glNamedFramebufferRenderbuffer) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); + return ((PFN_glNamedFramebufferRenderbuffer)__blue_glCore_glNamedFramebufferRenderbuffer)(framebuffer, attachment, renderbuffertarget, renderbuffer); +} + +extern void* __blue_glCore_glNamedFramebufferParameteri; +void APIENTRY bluegl_glNamedFramebufferParameteri (GLuint framebuffer, GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glNamedFramebufferParameteri) (GLuint framebuffer, GLenum pname, GLint param); + return ((PFN_glNamedFramebufferParameteri)__blue_glCore_glNamedFramebufferParameteri)(framebuffer, pname, param); +} + +extern void* __blue_glCore_glNamedFramebufferTexture; +void APIENTRY bluegl_glNamedFramebufferTexture (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level) { + typedef void (APIENTRYP PFN_glNamedFramebufferTexture) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); + return ((PFN_glNamedFramebufferTexture)__blue_glCore_glNamedFramebufferTexture)(framebuffer, attachment, texture, level); +} + +extern void* __blue_glCore_glNamedFramebufferTextureLayer; +void APIENTRY bluegl_glNamedFramebufferTextureLayer (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer) { + typedef void (APIENTRYP PFN_glNamedFramebufferTextureLayer) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); + return ((PFN_glNamedFramebufferTextureLayer)__blue_glCore_glNamedFramebufferTextureLayer)(framebuffer, attachment, texture, level, layer); +} + +extern void* __blue_glCore_glNamedFramebufferDrawBuffer; +void APIENTRY bluegl_glNamedFramebufferDrawBuffer (GLuint framebuffer, GLenum buf) { + typedef void (APIENTRYP PFN_glNamedFramebufferDrawBuffer) (GLuint framebuffer, GLenum buf); + return ((PFN_glNamedFramebufferDrawBuffer)__blue_glCore_glNamedFramebufferDrawBuffer)(framebuffer, buf); +} + +extern void* __blue_glCore_glNamedFramebufferDrawBuffers; +void APIENTRY bluegl_glNamedFramebufferDrawBuffers (GLuint framebuffer, GLsizei n, const GLenum *bufs) { + typedef void (APIENTRYP PFN_glNamedFramebufferDrawBuffers) (GLuint framebuffer, GLsizei n, const GLenum *bufs); + return ((PFN_glNamedFramebufferDrawBuffers)__blue_glCore_glNamedFramebufferDrawBuffers)(framebuffer, n, bufs); +} + +extern void* __blue_glCore_glNamedFramebufferReadBuffer; +void APIENTRY bluegl_glNamedFramebufferReadBuffer (GLuint framebuffer, GLenum src) { + typedef void (APIENTRYP PFN_glNamedFramebufferReadBuffer) (GLuint framebuffer, GLenum src); + return ((PFN_glNamedFramebufferReadBuffer)__blue_glCore_glNamedFramebufferReadBuffer)(framebuffer, src); +} + +extern void* __blue_glCore_glInvalidateNamedFramebufferData; +void APIENTRY bluegl_glInvalidateNamedFramebufferData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments) { + typedef void (APIENTRYP PFN_glInvalidateNamedFramebufferData) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments); + return ((PFN_glInvalidateNamedFramebufferData)__blue_glCore_glInvalidateNamedFramebufferData)(framebuffer, numAttachments, attachments); +} + +extern void* __blue_glCore_glInvalidateNamedFramebufferSubData; +void APIENTRY bluegl_glInvalidateNamedFramebufferSubData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glInvalidateNamedFramebufferSubData) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); + return ((PFN_glInvalidateNamedFramebufferSubData)__blue_glCore_glInvalidateNamedFramebufferSubData)(framebuffer, numAttachments, attachments, x, y, width, height); +} + +extern void* __blue_glCore_glClearNamedFramebufferiv; +void APIENTRY bluegl_glClearNamedFramebufferiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value) { + typedef void (APIENTRYP PFN_glClearNamedFramebufferiv) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value); + return ((PFN_glClearNamedFramebufferiv)__blue_glCore_glClearNamedFramebufferiv)(framebuffer, buffer, drawbuffer, value); +} + +extern void* __blue_glCore_glClearNamedFramebufferuiv; +void APIENTRY bluegl_glClearNamedFramebufferuiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value) { + typedef void (APIENTRYP PFN_glClearNamedFramebufferuiv) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value); + return ((PFN_glClearNamedFramebufferuiv)__blue_glCore_glClearNamedFramebufferuiv)(framebuffer, buffer, drawbuffer, value); +} + +extern void* __blue_glCore_glClearNamedFramebufferfv; +void APIENTRY bluegl_glClearNamedFramebufferfv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value) { + typedef void (APIENTRYP PFN_glClearNamedFramebufferfv) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value); + return ((PFN_glClearNamedFramebufferfv)__blue_glCore_glClearNamedFramebufferfv)(framebuffer, buffer, drawbuffer, value); +} + +extern void* __blue_glCore_glClearNamedFramebufferfi; +void APIENTRY bluegl_glClearNamedFramebufferfi (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) { + typedef void (APIENTRYP PFN_glClearNamedFramebufferfi) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); + return ((PFN_glClearNamedFramebufferfi)__blue_glCore_glClearNamedFramebufferfi)(framebuffer, buffer, drawbuffer, depth, stencil); +} + +extern void* __blue_glCore_glBlitNamedFramebuffer; +void APIENTRY bluegl_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) { + typedef void (APIENTRYP PFN_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); + return ((PFN_glBlitNamedFramebuffer)__blue_glCore_glBlitNamedFramebuffer)(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); +} + +extern void* __blue_glCore_glCheckNamedFramebufferStatus; +GLenum APIENTRY bluegl_glCheckNamedFramebufferStatus (GLuint framebuffer, GLenum target) { + typedef GLenum (APIENTRYP PFN_glCheckNamedFramebufferStatus) (GLuint framebuffer, GLenum target); + return ((PFN_glCheckNamedFramebufferStatus)__blue_glCore_glCheckNamedFramebufferStatus)(framebuffer, target); +} + +extern void* __blue_glCore_glGetNamedFramebufferParameteriv; +void APIENTRY bluegl_glGetNamedFramebufferParameteriv (GLuint framebuffer, GLenum pname, GLint *param) { + typedef void (APIENTRYP PFN_glGetNamedFramebufferParameteriv) (GLuint framebuffer, GLenum pname, GLint *param); + return ((PFN_glGetNamedFramebufferParameteriv)__blue_glCore_glGetNamedFramebufferParameteriv)(framebuffer, pname, param); +} + +extern void* __blue_glCore_glGetNamedFramebufferAttachmentParameteriv; +void APIENTRY bluegl_glGetNamedFramebufferAttachmentParameteriv (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetNamedFramebufferAttachmentParameteriv) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); + return ((PFN_glGetNamedFramebufferAttachmentParameteriv)__blue_glCore_glGetNamedFramebufferAttachmentParameteriv)(framebuffer, attachment, pname, params); +} + +extern void* __blue_glCore_glCreateRenderbuffers; +void APIENTRY bluegl_glCreateRenderbuffers (GLsizei n, GLuint *renderbuffers) { + typedef void (APIENTRYP PFN_glCreateRenderbuffers) (GLsizei n, GLuint *renderbuffers); + return ((PFN_glCreateRenderbuffers)__blue_glCore_glCreateRenderbuffers)(n, renderbuffers); +} + +extern void* __blue_glCore_glNamedRenderbufferStorage; +void APIENTRY bluegl_glNamedRenderbufferStorage (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glNamedRenderbufferStorage) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); + return ((PFN_glNamedRenderbufferStorage)__blue_glCore_glNamedRenderbufferStorage)(renderbuffer, internalformat, width, height); +} + +extern void* __blue_glCore_glNamedRenderbufferStorageMultisample; +void APIENTRY bluegl_glNamedRenderbufferStorageMultisample (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glNamedRenderbufferStorageMultisample) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + return ((PFN_glNamedRenderbufferStorageMultisample)__blue_glCore_glNamedRenderbufferStorageMultisample)(renderbuffer, samples, internalformat, width, height); +} + +extern void* __blue_glCore_glGetNamedRenderbufferParameteriv; +void APIENTRY bluegl_glGetNamedRenderbufferParameteriv (GLuint renderbuffer, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetNamedRenderbufferParameteriv) (GLuint renderbuffer, GLenum pname, GLint *params); + return ((PFN_glGetNamedRenderbufferParameteriv)__blue_glCore_glGetNamedRenderbufferParameteriv)(renderbuffer, pname, params); +} + +extern void* __blue_glCore_glCreateTextures; +void APIENTRY bluegl_glCreateTextures (GLenum target, GLsizei n, GLuint *textures) { + typedef void (APIENTRYP PFN_glCreateTextures) (GLenum target, GLsizei n, GLuint *textures); + return ((PFN_glCreateTextures)__blue_glCore_glCreateTextures)(target, n, textures); +} + +extern void* __blue_glCore_glTextureBuffer; +void APIENTRY bluegl_glTextureBuffer (GLuint texture, GLenum internalformat, GLuint buffer) { + typedef void (APIENTRYP PFN_glTextureBuffer) (GLuint texture, GLenum internalformat, GLuint buffer); + return ((PFN_glTextureBuffer)__blue_glCore_glTextureBuffer)(texture, internalformat, buffer); +} + +extern void* __blue_glCore_glTextureBufferRange; +void APIENTRY bluegl_glTextureBufferRange (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) { + typedef void (APIENTRYP PFN_glTextureBufferRange) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); + return ((PFN_glTextureBufferRange)__blue_glCore_glTextureBufferRange)(texture, internalformat, buffer, offset, size); +} + +extern void* __blue_glCore_glTextureStorage1D; +void APIENTRY bluegl_glTextureStorage1D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width) { + typedef void (APIENTRYP PFN_glTextureStorage1D) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); + return ((PFN_glTextureStorage1D)__blue_glCore_glTextureStorage1D)(texture, levels, internalformat, width); +} + +extern void* __blue_glCore_glTextureStorage2D; +void APIENTRY bluegl_glTextureStorage2D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glTextureStorage2D) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); + return ((PFN_glTextureStorage2D)__blue_glCore_glTextureStorage2D)(texture, levels, internalformat, width, height); +} + +extern void* __blue_glCore_glTextureStorage3D; +void APIENTRY bluegl_glTextureStorage3D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { + typedef void (APIENTRYP PFN_glTextureStorage3D) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); + return ((PFN_glTextureStorage3D)__blue_glCore_glTextureStorage3D)(texture, levels, internalformat, width, height, depth); +} + +extern void* __blue_glCore_glTextureStorage2DMultisample; +void APIENTRY bluegl_glTextureStorage2DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) { + typedef void (APIENTRYP PFN_glTextureStorage2DMultisample) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); + return ((PFN_glTextureStorage2DMultisample)__blue_glCore_glTextureStorage2DMultisample)(texture, samples, internalformat, width, height, fixedsamplelocations); +} + +extern void* __blue_glCore_glTextureStorage3DMultisample; +void APIENTRY bluegl_glTextureStorage3DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { + typedef void (APIENTRYP PFN_glTextureStorage3DMultisample) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); + return ((PFN_glTextureStorage3DMultisample)__blue_glCore_glTextureStorage3DMultisample)(texture, samples, internalformat, width, height, depth, fixedsamplelocations); +} + +extern void* __blue_glCore_glTextureSubImage1D; +void APIENTRY bluegl_glTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels) { + typedef void (APIENTRYP PFN_glTextureSubImage1D) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTextureSubImage1D)__blue_glCore_glTextureSubImage1D)(texture, level, xoffset, width, format, type, pixels); +} + +extern void* __blue_glCore_glTextureSubImage2D; +void APIENTRY bluegl_glTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) { + typedef void (APIENTRYP PFN_glTextureSubImage2D) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTextureSubImage2D)__blue_glCore_glTextureSubImage2D)(texture, level, xoffset, yoffset, width, height, format, type, pixels); +} + +extern void* __blue_glCore_glTextureSubImage3D; +void APIENTRY bluegl_glTextureSubImage3D (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 PFN_glTextureSubImage3D) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTextureSubImage3D)__blue_glCore_glTextureSubImage3D)(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); +} + +extern void* __blue_glCore_glCompressedTextureSubImage1D; +void APIENTRY bluegl_glCompressedTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data) { + typedef void (APIENTRYP PFN_glCompressedTextureSubImage1D) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); + return ((PFN_glCompressedTextureSubImage1D)__blue_glCore_glCompressedTextureSubImage1D)(texture, level, xoffset, width, format, imageSize, data); +} + +extern void* __blue_glCore_glCompressedTextureSubImage2D; +void APIENTRY bluegl_glCompressedTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data) { + typedef void (APIENTRYP PFN_glCompressedTextureSubImage2D) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); + return ((PFN_glCompressedTextureSubImage2D)__blue_glCore_glCompressedTextureSubImage2D)(texture, level, xoffset, yoffset, width, height, format, imageSize, data); +} + +extern void* __blue_glCore_glCompressedTextureSubImage3D; +void APIENTRY bluegl_glCompressedTextureSubImage3D (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 PFN_glCompressedTextureSubImage3D) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); + return ((PFN_glCompressedTextureSubImage3D)__blue_glCore_glCompressedTextureSubImage3D)(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); +} + +extern void* __blue_glCore_glCopyTextureSubImage1D; +void APIENTRY bluegl_glCopyTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { + typedef void (APIENTRYP PFN_glCopyTextureSubImage1D) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); + return ((PFN_glCopyTextureSubImage1D)__blue_glCore_glCopyTextureSubImage1D)(texture, level, xoffset, x, y, width); +} + +extern void* __blue_glCore_glCopyTextureSubImage2D; +void APIENTRY bluegl_glCopyTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glCopyTextureSubImage2D) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); + return ((PFN_glCopyTextureSubImage2D)__blue_glCore_glCopyTextureSubImage2D)(texture, level, xoffset, yoffset, x, y, width, height); +} + +extern void* __blue_glCore_glCopyTextureSubImage3D; +void APIENTRY bluegl_glCopyTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glCopyTextureSubImage3D) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + return ((PFN_glCopyTextureSubImage3D)__blue_glCore_glCopyTextureSubImage3D)(texture, level, xoffset, yoffset, zoffset, x, y, width, height); +} + +extern void* __blue_glCore_glTextureParameterf; +void APIENTRY bluegl_glTextureParameterf (GLuint texture, GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glTextureParameterf) (GLuint texture, GLenum pname, GLfloat param); + return ((PFN_glTextureParameterf)__blue_glCore_glTextureParameterf)(texture, pname, param); +} + +extern void* __blue_glCore_glTextureParameterfv; +void APIENTRY bluegl_glTextureParameterfv (GLuint texture, GLenum pname, const GLfloat *param) { + typedef void (APIENTRYP PFN_glTextureParameterfv) (GLuint texture, GLenum pname, const GLfloat *param); + return ((PFN_glTextureParameterfv)__blue_glCore_glTextureParameterfv)(texture, pname, param); +} + +extern void* __blue_glCore_glTextureParameteri; +void APIENTRY bluegl_glTextureParameteri (GLuint texture, GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glTextureParameteri) (GLuint texture, GLenum pname, GLint param); + return ((PFN_glTextureParameteri)__blue_glCore_glTextureParameteri)(texture, pname, param); +} + +extern void* __blue_glCore_glTextureParameterIiv; +void APIENTRY bluegl_glTextureParameterIiv (GLuint texture, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glTextureParameterIiv) (GLuint texture, GLenum pname, const GLint *params); + return ((PFN_glTextureParameterIiv)__blue_glCore_glTextureParameterIiv)(texture, pname, params); +} + +extern void* __blue_glCore_glTextureParameterIuiv; +void APIENTRY bluegl_glTextureParameterIuiv (GLuint texture, GLenum pname, const GLuint *params) { + typedef void (APIENTRYP PFN_glTextureParameterIuiv) (GLuint texture, GLenum pname, const GLuint *params); + return ((PFN_glTextureParameterIuiv)__blue_glCore_glTextureParameterIuiv)(texture, pname, params); +} + +extern void* __blue_glCore_glTextureParameteriv; +void APIENTRY bluegl_glTextureParameteriv (GLuint texture, GLenum pname, const GLint *param) { + typedef void (APIENTRYP PFN_glTextureParameteriv) (GLuint texture, GLenum pname, const GLint *param); + return ((PFN_glTextureParameteriv)__blue_glCore_glTextureParameteriv)(texture, pname, param); +} + +extern void* __blue_glCore_glGenerateTextureMipmap; +void APIENTRY bluegl_glGenerateTextureMipmap (GLuint texture) { + typedef void (APIENTRYP PFN_glGenerateTextureMipmap) (GLuint texture); + return ((PFN_glGenerateTextureMipmap)__blue_glCore_glGenerateTextureMipmap)(texture); +} + +extern void* __blue_glCore_glBindTextureUnit; +void APIENTRY bluegl_glBindTextureUnit (GLuint unit, GLuint texture) { + typedef void (APIENTRYP PFN_glBindTextureUnit) (GLuint unit, GLuint texture); + return ((PFN_glBindTextureUnit)__blue_glCore_glBindTextureUnit)(unit, texture); +} + +extern void* __blue_glCore_glGetTextureImage; +void APIENTRY bluegl_glGetTextureImage (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels) { + typedef void (APIENTRYP PFN_glGetTextureImage) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); + return ((PFN_glGetTextureImage)__blue_glCore_glGetTextureImage)(texture, level, format, type, bufSize, pixels); +} + +extern void* __blue_glCore_glGetCompressedTextureImage; +void APIENTRY bluegl_glGetCompressedTextureImage (GLuint texture, GLint level, GLsizei bufSize, void *pixels) { + typedef void (APIENTRYP PFN_glGetCompressedTextureImage) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); + return ((PFN_glGetCompressedTextureImage)__blue_glCore_glGetCompressedTextureImage)(texture, level, bufSize, pixels); +} + +extern void* __blue_glCore_glGetTextureLevelParameterfv; +void APIENTRY bluegl_glGetTextureLevelParameterfv (GLuint texture, GLint level, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetTextureLevelParameterfv) (GLuint texture, GLint level, GLenum pname, GLfloat *params); + return ((PFN_glGetTextureLevelParameterfv)__blue_glCore_glGetTextureLevelParameterfv)(texture, level, pname, params); +} + +extern void* __blue_glCore_glGetTextureLevelParameteriv; +void APIENTRY bluegl_glGetTextureLevelParameteriv (GLuint texture, GLint level, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetTextureLevelParameteriv) (GLuint texture, GLint level, GLenum pname, GLint *params); + return ((PFN_glGetTextureLevelParameteriv)__blue_glCore_glGetTextureLevelParameteriv)(texture, level, pname, params); +} + +extern void* __blue_glCore_glGetTextureParameterfv; +void APIENTRY bluegl_glGetTextureParameterfv (GLuint texture, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetTextureParameterfv) (GLuint texture, GLenum pname, GLfloat *params); + return ((PFN_glGetTextureParameterfv)__blue_glCore_glGetTextureParameterfv)(texture, pname, params); +} + +extern void* __blue_glCore_glGetTextureParameterIiv; +void APIENTRY bluegl_glGetTextureParameterIiv (GLuint texture, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetTextureParameterIiv) (GLuint texture, GLenum pname, GLint *params); + return ((PFN_glGetTextureParameterIiv)__blue_glCore_glGetTextureParameterIiv)(texture, pname, params); +} + +extern void* __blue_glCore_glGetTextureParameterIuiv; +void APIENTRY bluegl_glGetTextureParameterIuiv (GLuint texture, GLenum pname, GLuint *params) { + typedef void (APIENTRYP PFN_glGetTextureParameterIuiv) (GLuint texture, GLenum pname, GLuint *params); + return ((PFN_glGetTextureParameterIuiv)__blue_glCore_glGetTextureParameterIuiv)(texture, pname, params); +} + +extern void* __blue_glCore_glGetTextureParameteriv; +void APIENTRY bluegl_glGetTextureParameteriv (GLuint texture, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetTextureParameteriv) (GLuint texture, GLenum pname, GLint *params); + return ((PFN_glGetTextureParameteriv)__blue_glCore_glGetTextureParameteriv)(texture, pname, params); +} + +extern void* __blue_glCore_glCreateVertexArrays; +void APIENTRY bluegl_glCreateVertexArrays (GLsizei n, GLuint *arrays) { + typedef void (APIENTRYP PFN_glCreateVertexArrays) (GLsizei n, GLuint *arrays); + return ((PFN_glCreateVertexArrays)__blue_glCore_glCreateVertexArrays)(n, arrays); +} + +extern void* __blue_glCore_glDisableVertexArrayAttrib; +void APIENTRY bluegl_glDisableVertexArrayAttrib (GLuint vaobj, GLuint index) { + typedef void (APIENTRYP PFN_glDisableVertexArrayAttrib) (GLuint vaobj, GLuint index); + return ((PFN_glDisableVertexArrayAttrib)__blue_glCore_glDisableVertexArrayAttrib)(vaobj, index); +} + +extern void* __blue_glCore_glEnableVertexArrayAttrib; +void APIENTRY bluegl_glEnableVertexArrayAttrib (GLuint vaobj, GLuint index) { + typedef void (APIENTRYP PFN_glEnableVertexArrayAttrib) (GLuint vaobj, GLuint index); + return ((PFN_glEnableVertexArrayAttrib)__blue_glCore_glEnableVertexArrayAttrib)(vaobj, index); +} + +extern void* __blue_glCore_glVertexArrayElementBuffer; +void APIENTRY bluegl_glVertexArrayElementBuffer (GLuint vaobj, GLuint buffer) { + typedef void (APIENTRYP PFN_glVertexArrayElementBuffer) (GLuint vaobj, GLuint buffer); + return ((PFN_glVertexArrayElementBuffer)__blue_glCore_glVertexArrayElementBuffer)(vaobj, buffer); +} + +extern void* __blue_glCore_glVertexArrayVertexBuffer; +void APIENTRY bluegl_glVertexArrayVertexBuffer (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride) { + typedef void (APIENTRYP PFN_glVertexArrayVertexBuffer) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); + return ((PFN_glVertexArrayVertexBuffer)__blue_glCore_glVertexArrayVertexBuffer)(vaobj, bindingindex, buffer, offset, stride); +} + +extern void* __blue_glCore_glVertexArrayVertexBuffers; +void APIENTRY bluegl_glVertexArrayVertexBuffers (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides) { + typedef void (APIENTRYP PFN_glVertexArrayVertexBuffers) (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); + return ((PFN_glVertexArrayVertexBuffers)__blue_glCore_glVertexArrayVertexBuffers)(vaobj, first, count, buffers, offsets, strides); +} + +extern void* __blue_glCore_glVertexArrayAttribBinding; +void APIENTRY bluegl_glVertexArrayAttribBinding (GLuint vaobj, GLuint attribindex, GLuint bindingindex) { + typedef void (APIENTRYP PFN_glVertexArrayAttribBinding) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); + return ((PFN_glVertexArrayAttribBinding)__blue_glCore_glVertexArrayAttribBinding)(vaobj, attribindex, bindingindex); +} + +extern void* __blue_glCore_glVertexArrayAttribFormat; +void APIENTRY bluegl_glVertexArrayAttribFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset) { + typedef void (APIENTRYP PFN_glVertexArrayAttribFormat) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); + return ((PFN_glVertexArrayAttribFormat)__blue_glCore_glVertexArrayAttribFormat)(vaobj, attribindex, size, type, normalized, relativeoffset); +} + +extern void* __blue_glCore_glVertexArrayAttribIFormat; +void APIENTRY bluegl_glVertexArrayAttribIFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { + typedef void (APIENTRYP PFN_glVertexArrayAttribIFormat) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); + return ((PFN_glVertexArrayAttribIFormat)__blue_glCore_glVertexArrayAttribIFormat)(vaobj, attribindex, size, type, relativeoffset); +} + +extern void* __blue_glCore_glVertexArrayAttribLFormat; +void APIENTRY bluegl_glVertexArrayAttribLFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { + typedef void (APIENTRYP PFN_glVertexArrayAttribLFormat) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); + return ((PFN_glVertexArrayAttribLFormat)__blue_glCore_glVertexArrayAttribLFormat)(vaobj, attribindex, size, type, relativeoffset); +} + +extern void* __blue_glCore_glVertexArrayBindingDivisor; +void APIENTRY bluegl_glVertexArrayBindingDivisor (GLuint vaobj, GLuint bindingindex, GLuint divisor) { + typedef void (APIENTRYP PFN_glVertexArrayBindingDivisor) (GLuint vaobj, GLuint bindingindex, GLuint divisor); + return ((PFN_glVertexArrayBindingDivisor)__blue_glCore_glVertexArrayBindingDivisor)(vaobj, bindingindex, divisor); +} + +extern void* __blue_glCore_glGetVertexArrayiv; +void APIENTRY bluegl_glGetVertexArrayiv (GLuint vaobj, GLenum pname, GLint *param) { + typedef void (APIENTRYP PFN_glGetVertexArrayiv) (GLuint vaobj, GLenum pname, GLint *param); + return ((PFN_glGetVertexArrayiv)__blue_glCore_glGetVertexArrayiv)(vaobj, pname, param); +} + +extern void* __blue_glCore_glGetVertexArrayIndexediv; +void APIENTRY bluegl_glGetVertexArrayIndexediv (GLuint vaobj, GLuint index, GLenum pname, GLint *param) { + typedef void (APIENTRYP PFN_glGetVertexArrayIndexediv) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); + return ((PFN_glGetVertexArrayIndexediv)__blue_glCore_glGetVertexArrayIndexediv)(vaobj, index, pname, param); +} + +extern void* __blue_glCore_glGetVertexArrayIndexed64iv; +void APIENTRY bluegl_glGetVertexArrayIndexed64iv (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param) { + typedef void (APIENTRYP PFN_glGetVertexArrayIndexed64iv) (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param); + return ((PFN_glGetVertexArrayIndexed64iv)__blue_glCore_glGetVertexArrayIndexed64iv)(vaobj, index, pname, param); +} + +extern void* __blue_glCore_glCreateSamplers; +void APIENTRY bluegl_glCreateSamplers (GLsizei n, GLuint *samplers) { + typedef void (APIENTRYP PFN_glCreateSamplers) (GLsizei n, GLuint *samplers); + return ((PFN_glCreateSamplers)__blue_glCore_glCreateSamplers)(n, samplers); +} + +extern void* __blue_glCore_glCreateProgramPipelines; +void APIENTRY bluegl_glCreateProgramPipelines (GLsizei n, GLuint *pipelines) { + typedef void (APIENTRYP PFN_glCreateProgramPipelines) (GLsizei n, GLuint *pipelines); + return ((PFN_glCreateProgramPipelines)__blue_glCore_glCreateProgramPipelines)(n, pipelines); +} + +extern void* __blue_glCore_glCreateQueries; +void APIENTRY bluegl_glCreateQueries (GLenum target, GLsizei n, GLuint *ids) { + typedef void (APIENTRYP PFN_glCreateQueries) (GLenum target, GLsizei n, GLuint *ids); + return ((PFN_glCreateQueries)__blue_glCore_glCreateQueries)(target, n, ids); +} + +extern void* __blue_glCore_glGetQueryBufferObjecti64v; +void APIENTRY bluegl_glGetQueryBufferObjecti64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset) { + typedef void (APIENTRYP PFN_glGetQueryBufferObjecti64v) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); + return ((PFN_glGetQueryBufferObjecti64v)__blue_glCore_glGetQueryBufferObjecti64v)(id, buffer, pname, offset); +} + +extern void* __blue_glCore_glGetQueryBufferObjectiv; +void APIENTRY bluegl_glGetQueryBufferObjectiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset) { + typedef void (APIENTRYP PFN_glGetQueryBufferObjectiv) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); + return ((PFN_glGetQueryBufferObjectiv)__blue_glCore_glGetQueryBufferObjectiv)(id, buffer, pname, offset); +} + +extern void* __blue_glCore_glGetQueryBufferObjectui64v; +void APIENTRY bluegl_glGetQueryBufferObjectui64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset) { + typedef void (APIENTRYP PFN_glGetQueryBufferObjectui64v) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); + return ((PFN_glGetQueryBufferObjectui64v)__blue_glCore_glGetQueryBufferObjectui64v)(id, buffer, pname, offset); +} + +extern void* __blue_glCore_glGetQueryBufferObjectuiv; +void APIENTRY bluegl_glGetQueryBufferObjectuiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset) { + typedef void (APIENTRYP PFN_glGetQueryBufferObjectuiv) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); + return ((PFN_glGetQueryBufferObjectuiv)__blue_glCore_glGetQueryBufferObjectuiv)(id, buffer, pname, offset); +} + +extern void* __blue_glCore_glMemoryBarrierByRegion; +void APIENTRY bluegl_glMemoryBarrierByRegion (GLbitfield barriers) { + typedef void (APIENTRYP PFN_glMemoryBarrierByRegion) (GLbitfield barriers); + return ((PFN_glMemoryBarrierByRegion)__blue_glCore_glMemoryBarrierByRegion)(barriers); +} + +extern void* __blue_glCore_glGetTextureSubImage; +void APIENTRY bluegl_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) { + typedef void (APIENTRYP PFN_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); + return ((PFN_glGetTextureSubImage)__blue_glCore_glGetTextureSubImage)(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bufSize, pixels); +} + +extern void* __blue_glCore_glGetCompressedTextureSubImage; +void APIENTRY bluegl_glGetCompressedTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels) { + typedef void (APIENTRYP PFN_glGetCompressedTextureSubImage) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); + return ((PFN_glGetCompressedTextureSubImage)__blue_glCore_glGetCompressedTextureSubImage)(texture, level, xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels); +} + +extern void* __blue_glCore_glGetGraphicsResetStatus; +GLenum APIENTRY bluegl_glGetGraphicsResetStatus (void) { + typedef GLenum (APIENTRYP PFN_glGetGraphicsResetStatus) (void); + return ((PFN_glGetGraphicsResetStatus)__blue_glCore_glGetGraphicsResetStatus)(); +} + +extern void* __blue_glCore_glGetnCompressedTexImage; +void APIENTRY bluegl_glGetnCompressedTexImage (GLenum target, GLint lod, GLsizei bufSize, void *pixels) { + typedef void (APIENTRYP PFN_glGetnCompressedTexImage) (GLenum target, GLint lod, GLsizei bufSize, void *pixels); + return ((PFN_glGetnCompressedTexImage)__blue_glCore_glGetnCompressedTexImage)(target, lod, bufSize, pixels); +} + +extern void* __blue_glCore_glGetnTexImage; +void APIENTRY bluegl_glGetnTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels) { + typedef void (APIENTRYP PFN_glGetnTexImage) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); + return ((PFN_glGetnTexImage)__blue_glCore_glGetnTexImage)(target, level, format, type, bufSize, pixels); +} + +extern void* __blue_glCore_glGetnUniformdv; +void APIENTRY bluegl_glGetnUniformdv (GLuint program, GLint location, GLsizei bufSize, GLdouble *params) { + typedef void (APIENTRYP PFN_glGetnUniformdv) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); + return ((PFN_glGetnUniformdv)__blue_glCore_glGetnUniformdv)(program, location, bufSize, params); +} + +extern void* __blue_glCore_glGetnUniformfv; +void APIENTRY bluegl_glGetnUniformfv (GLuint program, GLint location, GLsizei bufSize, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetnUniformfv) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); + return ((PFN_glGetnUniformfv)__blue_glCore_glGetnUniformfv)(program, location, bufSize, params); +} + +extern void* __blue_glCore_glGetnUniformiv; +void APIENTRY bluegl_glGetnUniformiv (GLuint program, GLint location, GLsizei bufSize, GLint *params) { + typedef void (APIENTRYP PFN_glGetnUniformiv) (GLuint program, GLint location, GLsizei bufSize, GLint *params); + return ((PFN_glGetnUniformiv)__blue_glCore_glGetnUniformiv)(program, location, bufSize, params); +} + +extern void* __blue_glCore_glGetnUniformuiv; +void APIENTRY bluegl_glGetnUniformuiv (GLuint program, GLint location, GLsizei bufSize, GLuint *params) { + typedef void (APIENTRYP PFN_glGetnUniformuiv) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); + return ((PFN_glGetnUniformuiv)__blue_glCore_glGetnUniformuiv)(program, location, bufSize, params); +} + +extern void* __blue_glCore_glReadnPixels; +void APIENTRY bluegl_glReadnPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data) { + typedef void (APIENTRYP PFN_glReadnPixels) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); + return ((PFN_glReadnPixels)__blue_glCore_glReadnPixels)(x, y, width, height, format, type, bufSize, data); +} + +extern void* __blue_glCore_glTextureBarrier; +void APIENTRY bluegl_glTextureBarrier (void) { + typedef void (APIENTRYP PFN_glTextureBarrier) (void); + return ((PFN_glTextureBarrier)__blue_glCore_glTextureBarrier)(); +} + +extern void* __blue_glCore_glGetTextureHandleARB; +GLuint64 APIENTRY bluegl_glGetTextureHandleARB (GLuint texture) { + typedef GLuint64 (APIENTRYP PFN_glGetTextureHandleARB) (GLuint texture); + return ((PFN_glGetTextureHandleARB)__blue_glCore_glGetTextureHandleARB)(texture); +} + +extern void* __blue_glCore_glGetTextureSamplerHandleARB; +GLuint64 APIENTRY bluegl_glGetTextureSamplerHandleARB (GLuint texture, GLuint sampler) { + typedef GLuint64 (APIENTRYP PFN_glGetTextureSamplerHandleARB) (GLuint texture, GLuint sampler); + return ((PFN_glGetTextureSamplerHandleARB)__blue_glCore_glGetTextureSamplerHandleARB)(texture, sampler); +} + +extern void* __blue_glCore_glMakeTextureHandleResidentARB; +void APIENTRY bluegl_glMakeTextureHandleResidentARB (GLuint64 handle) { + typedef void (APIENTRYP PFN_glMakeTextureHandleResidentARB) (GLuint64 handle); + return ((PFN_glMakeTextureHandleResidentARB)__blue_glCore_glMakeTextureHandleResidentARB)(handle); +} + +extern void* __blue_glCore_glMakeTextureHandleNonResidentARB; +void APIENTRY bluegl_glMakeTextureHandleNonResidentARB (GLuint64 handle) { + typedef void (APIENTRYP PFN_glMakeTextureHandleNonResidentARB) (GLuint64 handle); + return ((PFN_glMakeTextureHandleNonResidentARB)__blue_glCore_glMakeTextureHandleNonResidentARB)(handle); +} + +extern void* __blue_glCore_glGetImageHandleARB; +GLuint64 APIENTRY bluegl_glGetImageHandleARB (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format) { + typedef GLuint64 (APIENTRYP PFN_glGetImageHandleARB) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); + return ((PFN_glGetImageHandleARB)__blue_glCore_glGetImageHandleARB)(texture, level, layered, layer, format); +} + +extern void* __blue_glCore_glMakeImageHandleResidentARB; +void APIENTRY bluegl_glMakeImageHandleResidentARB (GLuint64 handle, GLenum access) { + typedef void (APIENTRYP PFN_glMakeImageHandleResidentARB) (GLuint64 handle, GLenum access); + return ((PFN_glMakeImageHandleResidentARB)__blue_glCore_glMakeImageHandleResidentARB)(handle, access); +} + +extern void* __blue_glCore_glMakeImageHandleNonResidentARB; +void APIENTRY bluegl_glMakeImageHandleNonResidentARB (GLuint64 handle) { + typedef void (APIENTRYP PFN_glMakeImageHandleNonResidentARB) (GLuint64 handle); + return ((PFN_glMakeImageHandleNonResidentARB)__blue_glCore_glMakeImageHandleNonResidentARB)(handle); +} + +extern void* __blue_glCore_glUniformHandleui64ARB; +void APIENTRY bluegl_glUniformHandleui64ARB (GLint location, GLuint64 value) { + typedef void (APIENTRYP PFN_glUniformHandleui64ARB) (GLint location, GLuint64 value); + return ((PFN_glUniformHandleui64ARB)__blue_glCore_glUniformHandleui64ARB)(location, value); +} + +extern void* __blue_glCore_glUniformHandleui64vARB; +void APIENTRY bluegl_glUniformHandleui64vARB (GLint location, GLsizei count, const GLuint64 *value) { + typedef void (APIENTRYP PFN_glUniformHandleui64vARB) (GLint location, GLsizei count, const GLuint64 *value); + return ((PFN_glUniformHandleui64vARB)__blue_glCore_glUniformHandleui64vARB)(location, count, value); +} + +extern void* __blue_glCore_glProgramUniformHandleui64ARB; +void APIENTRY bluegl_glProgramUniformHandleui64ARB (GLuint program, GLint location, GLuint64 value) { + typedef void (APIENTRYP PFN_glProgramUniformHandleui64ARB) (GLuint program, GLint location, GLuint64 value); + return ((PFN_glProgramUniformHandleui64ARB)__blue_glCore_glProgramUniformHandleui64ARB)(program, location, value); +} + +extern void* __blue_glCore_glProgramUniformHandleui64vARB; +void APIENTRY bluegl_glProgramUniformHandleui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *values) { + typedef void (APIENTRYP PFN_glProgramUniformHandleui64vARB) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); + return ((PFN_glProgramUniformHandleui64vARB)__blue_glCore_glProgramUniformHandleui64vARB)(program, location, count, values); +} + +extern void* __blue_glCore_glIsTextureHandleResidentARB; +GLboolean APIENTRY bluegl_glIsTextureHandleResidentARB (GLuint64 handle) { + typedef GLboolean (APIENTRYP PFN_glIsTextureHandleResidentARB) (GLuint64 handle); + return ((PFN_glIsTextureHandleResidentARB)__blue_glCore_glIsTextureHandleResidentARB)(handle); +} + +extern void* __blue_glCore_glIsImageHandleResidentARB; +GLboolean APIENTRY bluegl_glIsImageHandleResidentARB (GLuint64 handle) { + typedef GLboolean (APIENTRYP PFN_glIsImageHandleResidentARB) (GLuint64 handle); + return ((PFN_glIsImageHandleResidentARB)__blue_glCore_glIsImageHandleResidentARB)(handle); +} + +extern void* __blue_glCore_glVertexAttribL1ui64ARB; +void APIENTRY bluegl_glVertexAttribL1ui64ARB (GLuint index, GLuint64EXT x) { + typedef void (APIENTRYP PFN_glVertexAttribL1ui64ARB) (GLuint index, GLuint64EXT x); + return ((PFN_glVertexAttribL1ui64ARB)__blue_glCore_glVertexAttribL1ui64ARB)(index, x); +} + +extern void* __blue_glCore_glVertexAttribL1ui64vARB; +void APIENTRY bluegl_glVertexAttribL1ui64vARB (GLuint index, const GLuint64EXT *v) { + typedef void (APIENTRYP PFN_glVertexAttribL1ui64vARB) (GLuint index, const GLuint64EXT *v); + return ((PFN_glVertexAttribL1ui64vARB)__blue_glCore_glVertexAttribL1ui64vARB)(index, v); +} + +extern void* __blue_glCore_glGetVertexAttribLui64vARB; +void APIENTRY bluegl_glGetVertexAttribLui64vARB (GLuint index, GLenum pname, GLuint64EXT *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribLui64vARB) (GLuint index, GLenum pname, GLuint64EXT *params); + return ((PFN_glGetVertexAttribLui64vARB)__blue_glCore_glGetVertexAttribLui64vARB)(index, pname, params); +} + +extern void* __blue_glCore_glCreateSyncFromCLeventARB; +GLsync APIENTRY bluegl_glCreateSyncFromCLeventARB (struct _cl_context *context, struct _cl_event *event, GLbitfield flags) { + typedef GLsync (APIENTRYP PFN_glCreateSyncFromCLeventARB) (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); + return ((PFN_glCreateSyncFromCLeventARB)__blue_glCore_glCreateSyncFromCLeventARB)(context, event, flags); +} + +extern void* __blue_glCore_glDispatchComputeGroupSizeARB; +void APIENTRY bluegl_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) { + typedef void (APIENTRYP PFN_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); + return ((PFN_glDispatchComputeGroupSizeARB)__blue_glCore_glDispatchComputeGroupSizeARB)(num_groups_x, num_groups_y, num_groups_z, group_size_x, group_size_y, group_size_z); +} + +extern void* __blue_glCore_glDebugMessageControlARB; +void APIENTRY bluegl_glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled) { + typedef void (APIENTRYP PFN_glDebugMessageControlARB) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); + return ((PFN_glDebugMessageControlARB)__blue_glCore_glDebugMessageControlARB)(source, type, severity, count, ids, enabled); +} + +extern void* __blue_glCore_glDebugMessageInsertARB; +void APIENTRY bluegl_glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf) { + typedef void (APIENTRYP PFN_glDebugMessageInsertARB) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); + return ((PFN_glDebugMessageInsertARB)__blue_glCore_glDebugMessageInsertARB)(source, type, id, severity, length, buf); +} + +extern void* __blue_glCore_glDebugMessageCallbackARB; +void APIENTRY bluegl_glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const void *userParam) { + typedef void (APIENTRYP PFN_glDebugMessageCallbackARB) (GLDEBUGPROCARB callback, const void *userParam); + return ((PFN_glDebugMessageCallbackARB)__blue_glCore_glDebugMessageCallbackARB)(callback, userParam); +} + +extern void* __blue_glCore_glGetDebugMessageLogARB; +GLuint APIENTRY bluegl_glGetDebugMessageLogARB (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog) { + typedef GLuint (APIENTRYP PFN_glGetDebugMessageLogARB) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); + return ((PFN_glGetDebugMessageLogARB)__blue_glCore_glGetDebugMessageLogARB)(count, bufSize, sources, types, ids, severities, lengths, messageLog); +} + +extern void* __blue_glCore_glBlendEquationiARB; +void APIENTRY bluegl_glBlendEquationiARB (GLuint buf, GLenum mode) { + typedef void (APIENTRYP PFN_glBlendEquationiARB) (GLuint buf, GLenum mode); + return ((PFN_glBlendEquationiARB)__blue_glCore_glBlendEquationiARB)(buf, mode); +} + +extern void* __blue_glCore_glBlendEquationSeparateiARB; +void APIENTRY bluegl_glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha) { + typedef void (APIENTRYP PFN_glBlendEquationSeparateiARB) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); + return ((PFN_glBlendEquationSeparateiARB)__blue_glCore_glBlendEquationSeparateiARB)(buf, modeRGB, modeAlpha); +} + +extern void* __blue_glCore_glBlendFunciARB; +void APIENTRY bluegl_glBlendFunciARB (GLuint buf, GLenum src, GLenum dst) { + typedef void (APIENTRYP PFN_glBlendFunciARB) (GLuint buf, GLenum src, GLenum dst); + return ((PFN_glBlendFunciARB)__blue_glCore_glBlendFunciARB)(buf, src, dst); +} + +extern void* __blue_glCore_glBlendFuncSeparateiARB; +void APIENTRY bluegl_glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { + typedef void (APIENTRYP PFN_glBlendFuncSeparateiARB) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); + return ((PFN_glBlendFuncSeparateiARB)__blue_glCore_glBlendFuncSeparateiARB)(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); +} + +extern void* __blue_glCore_glMultiDrawArraysIndirectCountARB; +void APIENTRY bluegl_glMultiDrawArraysIndirectCountARB (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride) { + typedef void (APIENTRYP PFN_glMultiDrawArraysIndirectCountARB) (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); + return ((PFN_glMultiDrawArraysIndirectCountARB)__blue_glCore_glMultiDrawArraysIndirectCountARB)(mode, indirect, drawcount, maxdrawcount, stride); +} + +extern void* __blue_glCore_glMultiDrawElementsIndirectCountARB; +void APIENTRY bluegl_glMultiDrawElementsIndirectCountARB (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride) { + typedef void (APIENTRYP PFN_glMultiDrawElementsIndirectCountARB) (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); + return ((PFN_glMultiDrawElementsIndirectCountARB)__blue_glCore_glMultiDrawElementsIndirectCountARB)(mode, type, indirect, drawcount, maxdrawcount, stride); +} + +extern void* __blue_glCore_glGetGraphicsResetStatusARB; +GLenum APIENTRY bluegl_glGetGraphicsResetStatusARB (void) { + typedef GLenum (APIENTRYP PFN_glGetGraphicsResetStatusARB) (void); + return ((PFN_glGetGraphicsResetStatusARB)__blue_glCore_glGetGraphicsResetStatusARB)(); +} + +extern void* __blue_glCore_glGetnTexImageARB; +void APIENTRY bluegl_glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img) { + typedef void (APIENTRYP PFN_glGetnTexImageARB) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); + return ((PFN_glGetnTexImageARB)__blue_glCore_glGetnTexImageARB)(target, level, format, type, bufSize, img); +} + +extern void* __blue_glCore_glReadnPixelsARB; +void APIENTRY bluegl_glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data) { + typedef void (APIENTRYP PFN_glReadnPixelsARB) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); + return ((PFN_glReadnPixelsARB)__blue_glCore_glReadnPixelsARB)(x, y, width, height, format, type, bufSize, data); +} + +extern void* __blue_glCore_glGetnCompressedTexImageARB; +void APIENTRY bluegl_glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, void *img) { + typedef void (APIENTRYP PFN_glGetnCompressedTexImageARB) (GLenum target, GLint lod, GLsizei bufSize, void *img); + return ((PFN_glGetnCompressedTexImageARB)__blue_glCore_glGetnCompressedTexImageARB)(target, lod, bufSize, img); +} + +extern void* __blue_glCore_glGetnUniformfvARB; +void APIENTRY bluegl_glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetnUniformfvARB) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); + return ((PFN_glGetnUniformfvARB)__blue_glCore_glGetnUniformfvARB)(program, location, bufSize, params); +} + +extern void* __blue_glCore_glGetnUniformivARB; +void APIENTRY bluegl_glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params) { + typedef void (APIENTRYP PFN_glGetnUniformivARB) (GLuint program, GLint location, GLsizei bufSize, GLint *params); + return ((PFN_glGetnUniformivARB)__blue_glCore_glGetnUniformivARB)(program, location, bufSize, params); +} + +extern void* __blue_glCore_glGetnUniformuivARB; +void APIENTRY bluegl_glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params) { + typedef void (APIENTRYP PFN_glGetnUniformuivARB) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); + return ((PFN_glGetnUniformuivARB)__blue_glCore_glGetnUniformuivARB)(program, location, bufSize, params); +} + +extern void* __blue_glCore_glGetnUniformdvARB; +void APIENTRY bluegl_glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params) { + typedef void (APIENTRYP PFN_glGetnUniformdvARB) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); + return ((PFN_glGetnUniformdvARB)__blue_glCore_glGetnUniformdvARB)(program, location, bufSize, params); +} + +extern void* __blue_glCore_glMinSampleShadingARB; +void APIENTRY bluegl_glMinSampleShadingARB (GLfloat value) { + typedef void (APIENTRYP PFN_glMinSampleShadingARB) (GLfloat value); + return ((PFN_glMinSampleShadingARB)__blue_glCore_glMinSampleShadingARB)(value); +} + +extern void* __blue_glCore_glNamedStringARB; +void APIENTRY bluegl_glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string) { + typedef void (APIENTRYP PFN_glNamedStringARB) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); + return ((PFN_glNamedStringARB)__blue_glCore_glNamedStringARB)(type, namelen, name, stringlen, string); +} + +extern void* __blue_glCore_glDeleteNamedStringARB; +void APIENTRY bluegl_glDeleteNamedStringARB (GLint namelen, const GLchar *name) { + typedef void (APIENTRYP PFN_glDeleteNamedStringARB) (GLint namelen, const GLchar *name); + return ((PFN_glDeleteNamedStringARB)__blue_glCore_glDeleteNamedStringARB)(namelen, name); +} + +extern void* __blue_glCore_glCompileShaderIncludeARB; +void APIENTRY bluegl_glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length) { + typedef void (APIENTRYP PFN_glCompileShaderIncludeARB) (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); + return ((PFN_glCompileShaderIncludeARB)__blue_glCore_glCompileShaderIncludeARB)(shader, count, path, length); +} + +extern void* __blue_glCore_glIsNamedStringARB; +GLboolean APIENTRY bluegl_glIsNamedStringARB (GLint namelen, const GLchar *name) { + typedef GLboolean (APIENTRYP PFN_glIsNamedStringARB) (GLint namelen, const GLchar *name); + return ((PFN_glIsNamedStringARB)__blue_glCore_glIsNamedStringARB)(namelen, name); +} + +extern void* __blue_glCore_glGetNamedStringARB; +void APIENTRY bluegl_glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string) { + typedef void (APIENTRYP PFN_glGetNamedStringARB) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); + return ((PFN_glGetNamedStringARB)__blue_glCore_glGetNamedStringARB)(namelen, name, bufSize, stringlen, string); +} + +extern void* __blue_glCore_glGetNamedStringivARB; +void APIENTRY bluegl_glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetNamedStringivARB) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); + return ((PFN_glGetNamedStringivARB)__blue_glCore_glGetNamedStringivARB)(namelen, name, pname, params); +} + +extern void* __blue_glCore_glBufferPageCommitmentARB; +void APIENTRY bluegl_glBufferPageCommitmentARB (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit) { + typedef void (APIENTRYP PFN_glBufferPageCommitmentARB) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); + return ((PFN_glBufferPageCommitmentARB)__blue_glCore_glBufferPageCommitmentARB)(target, offset, size, commit); +} + +extern void* __blue_glCore_glNamedBufferPageCommitmentEXT; +void APIENTRY bluegl_glNamedBufferPageCommitmentEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit) { + typedef void (APIENTRYP PFN_glNamedBufferPageCommitmentEXT) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); + return ((PFN_glNamedBufferPageCommitmentEXT)__blue_glCore_glNamedBufferPageCommitmentEXT)(buffer, offset, size, commit); +} + +extern void* __blue_glCore_glNamedBufferPageCommitmentARB; +void APIENTRY bluegl_glNamedBufferPageCommitmentARB (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit) { + typedef void (APIENTRYP PFN_glNamedBufferPageCommitmentARB) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); + return ((PFN_glNamedBufferPageCommitmentARB)__blue_glCore_glNamedBufferPageCommitmentARB)(buffer, offset, size, commit); +} + +extern void* __blue_glCore_glTexPageCommitmentARB; +void APIENTRY bluegl_glTexPageCommitmentARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit) { + typedef void (APIENTRYP PFN_glTexPageCommitmentARB) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); + return ((PFN_glTexPageCommitmentARB)__blue_glCore_glTexPageCommitmentARB)(target, level, xoffset, yoffset, zoffset, width, height, depth, commit); +} + +extern void* __blue_glCore_glClientActiveTexture; +void APIENTRY bluegl_glClientActiveTexture (GLenum texture) { + typedef void (APIENTRYP PFN_glClientActiveTexture) (GLenum texture); + return ((PFN_glClientActiveTexture)__blue_glCore_glClientActiveTexture)(texture); +} + +extern void* __blue_glCore_glMultiTexCoord1d; +void APIENTRY bluegl_glMultiTexCoord1d (GLenum target, GLdouble s) { + typedef void (APIENTRYP PFN_glMultiTexCoord1d) (GLenum target, GLdouble s); + return ((PFN_glMultiTexCoord1d)__blue_glCore_glMultiTexCoord1d)(target, s); +} + +extern void* __blue_glCore_glMultiTexCoord1dv; +void APIENTRY bluegl_glMultiTexCoord1dv (GLenum target, const GLdouble *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord1dv) (GLenum target, const GLdouble *v); + return ((PFN_glMultiTexCoord1dv)__blue_glCore_glMultiTexCoord1dv)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord1f; +void APIENTRY bluegl_glMultiTexCoord1f (GLenum target, GLfloat s) { + typedef void (APIENTRYP PFN_glMultiTexCoord1f) (GLenum target, GLfloat s); + return ((PFN_glMultiTexCoord1f)__blue_glCore_glMultiTexCoord1f)(target, s); +} + +extern void* __blue_glCore_glMultiTexCoord1fv; +void APIENTRY bluegl_glMultiTexCoord1fv (GLenum target, const GLfloat *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord1fv) (GLenum target, const GLfloat *v); + return ((PFN_glMultiTexCoord1fv)__blue_glCore_glMultiTexCoord1fv)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord1i; +void APIENTRY bluegl_glMultiTexCoord1i (GLenum target, GLint s) { + typedef void (APIENTRYP PFN_glMultiTexCoord1i) (GLenum target, GLint s); + return ((PFN_glMultiTexCoord1i)__blue_glCore_glMultiTexCoord1i)(target, s); +} + +extern void* __blue_glCore_glMultiTexCoord1iv; +void APIENTRY bluegl_glMultiTexCoord1iv (GLenum target, const GLint *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord1iv) (GLenum target, const GLint *v); + return ((PFN_glMultiTexCoord1iv)__blue_glCore_glMultiTexCoord1iv)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord1s; +void APIENTRY bluegl_glMultiTexCoord1s (GLenum target, GLshort s) { + typedef void (APIENTRYP PFN_glMultiTexCoord1s) (GLenum target, GLshort s); + return ((PFN_glMultiTexCoord1s)__blue_glCore_glMultiTexCoord1s)(target, s); +} + +extern void* __blue_glCore_glMultiTexCoord1sv; +void APIENTRY bluegl_glMultiTexCoord1sv (GLenum target, const GLshort *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord1sv) (GLenum target, const GLshort *v); + return ((PFN_glMultiTexCoord1sv)__blue_glCore_glMultiTexCoord1sv)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord2d; +void APIENTRY bluegl_glMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t) { + typedef void (APIENTRYP PFN_glMultiTexCoord2d) (GLenum target, GLdouble s, GLdouble t); + return ((PFN_glMultiTexCoord2d)__blue_glCore_glMultiTexCoord2d)(target, s, t); +} + +extern void* __blue_glCore_glMultiTexCoord2dv; +void APIENTRY bluegl_glMultiTexCoord2dv (GLenum target, const GLdouble *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord2dv) (GLenum target, const GLdouble *v); + return ((PFN_glMultiTexCoord2dv)__blue_glCore_glMultiTexCoord2dv)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord2f; +void APIENTRY bluegl_glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t) { + typedef void (APIENTRYP PFN_glMultiTexCoord2f) (GLenum target, GLfloat s, GLfloat t); + return ((PFN_glMultiTexCoord2f)__blue_glCore_glMultiTexCoord2f)(target, s, t); +} + +extern void* __blue_glCore_glMultiTexCoord2fv; +void APIENTRY bluegl_glMultiTexCoord2fv (GLenum target, const GLfloat *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord2fv) (GLenum target, const GLfloat *v); + return ((PFN_glMultiTexCoord2fv)__blue_glCore_glMultiTexCoord2fv)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord2i; +void APIENTRY bluegl_glMultiTexCoord2i (GLenum target, GLint s, GLint t) { + typedef void (APIENTRYP PFN_glMultiTexCoord2i) (GLenum target, GLint s, GLint t); + return ((PFN_glMultiTexCoord2i)__blue_glCore_glMultiTexCoord2i)(target, s, t); +} + +extern void* __blue_glCore_glMultiTexCoord2iv; +void APIENTRY bluegl_glMultiTexCoord2iv (GLenum target, const GLint *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord2iv) (GLenum target, const GLint *v); + return ((PFN_glMultiTexCoord2iv)__blue_glCore_glMultiTexCoord2iv)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord2s; +void APIENTRY bluegl_glMultiTexCoord2s (GLenum target, GLshort s, GLshort t) { + typedef void (APIENTRYP PFN_glMultiTexCoord2s) (GLenum target, GLshort s, GLshort t); + return ((PFN_glMultiTexCoord2s)__blue_glCore_glMultiTexCoord2s)(target, s, t); +} + +extern void* __blue_glCore_glMultiTexCoord2sv; +void APIENTRY bluegl_glMultiTexCoord2sv (GLenum target, const GLshort *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord2sv) (GLenum target, const GLshort *v); + return ((PFN_glMultiTexCoord2sv)__blue_glCore_glMultiTexCoord2sv)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord3d; +void APIENTRY bluegl_glMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r) { + typedef void (APIENTRYP PFN_glMultiTexCoord3d) (GLenum target, GLdouble s, GLdouble t, GLdouble r); + return ((PFN_glMultiTexCoord3d)__blue_glCore_glMultiTexCoord3d)(target, s, t, r); +} + +extern void* __blue_glCore_glMultiTexCoord3dv; +void APIENTRY bluegl_glMultiTexCoord3dv (GLenum target, const GLdouble *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord3dv) (GLenum target, const GLdouble *v); + return ((PFN_glMultiTexCoord3dv)__blue_glCore_glMultiTexCoord3dv)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord3f; +void APIENTRY bluegl_glMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r) { + typedef void (APIENTRYP PFN_glMultiTexCoord3f) (GLenum target, GLfloat s, GLfloat t, GLfloat r); + return ((PFN_glMultiTexCoord3f)__blue_glCore_glMultiTexCoord3f)(target, s, t, r); +} + +extern void* __blue_glCore_glMultiTexCoord3fv; +void APIENTRY bluegl_glMultiTexCoord3fv (GLenum target, const GLfloat *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord3fv) (GLenum target, const GLfloat *v); + return ((PFN_glMultiTexCoord3fv)__blue_glCore_glMultiTexCoord3fv)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord3i; +void APIENTRY bluegl_glMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r) { + typedef void (APIENTRYP PFN_glMultiTexCoord3i) (GLenum target, GLint s, GLint t, GLint r); + return ((PFN_glMultiTexCoord3i)__blue_glCore_glMultiTexCoord3i)(target, s, t, r); +} + +extern void* __blue_glCore_glMultiTexCoord3iv; +void APIENTRY bluegl_glMultiTexCoord3iv (GLenum target, const GLint *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord3iv) (GLenum target, const GLint *v); + return ((PFN_glMultiTexCoord3iv)__blue_glCore_glMultiTexCoord3iv)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord3s; +void APIENTRY bluegl_glMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r) { + typedef void (APIENTRYP PFN_glMultiTexCoord3s) (GLenum target, GLshort s, GLshort t, GLshort r); + return ((PFN_glMultiTexCoord3s)__blue_glCore_glMultiTexCoord3s)(target, s, t, r); +} + +extern void* __blue_glCore_glMultiTexCoord3sv; +void APIENTRY bluegl_glMultiTexCoord3sv (GLenum target, const GLshort *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord3sv) (GLenum target, const GLshort *v); + return ((PFN_glMultiTexCoord3sv)__blue_glCore_glMultiTexCoord3sv)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord4d; +void APIENTRY bluegl_glMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q) { + typedef void (APIENTRYP PFN_glMultiTexCoord4d) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); + return ((PFN_glMultiTexCoord4d)__blue_glCore_glMultiTexCoord4d)(target, s, t, r, q); +} + +extern void* __blue_glCore_glMultiTexCoord4dv; +void APIENTRY bluegl_glMultiTexCoord4dv (GLenum target, const GLdouble *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord4dv) (GLenum target, const GLdouble *v); + return ((PFN_glMultiTexCoord4dv)__blue_glCore_glMultiTexCoord4dv)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord4f; +void APIENTRY bluegl_glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) { + typedef void (APIENTRYP PFN_glMultiTexCoord4f) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); + return ((PFN_glMultiTexCoord4f)__blue_glCore_glMultiTexCoord4f)(target, s, t, r, q); +} + +extern void* __blue_glCore_glMultiTexCoord4fv; +void APIENTRY bluegl_glMultiTexCoord4fv (GLenum target, const GLfloat *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord4fv) (GLenum target, const GLfloat *v); + return ((PFN_glMultiTexCoord4fv)__blue_glCore_glMultiTexCoord4fv)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord4i; +void APIENTRY bluegl_glMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q) { + typedef void (APIENTRYP PFN_glMultiTexCoord4i) (GLenum target, GLint s, GLint t, GLint r, GLint q); + return ((PFN_glMultiTexCoord4i)__blue_glCore_glMultiTexCoord4i)(target, s, t, r, q); +} + +extern void* __blue_glCore_glMultiTexCoord4iv; +void APIENTRY bluegl_glMultiTexCoord4iv (GLenum target, const GLint *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord4iv) (GLenum target, const GLint *v); + return ((PFN_glMultiTexCoord4iv)__blue_glCore_glMultiTexCoord4iv)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord4s; +void APIENTRY bluegl_glMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q) { + typedef void (APIENTRYP PFN_glMultiTexCoord4s) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); + return ((PFN_glMultiTexCoord4s)__blue_glCore_glMultiTexCoord4s)(target, s, t, r, q); +} + +extern void* __blue_glCore_glMultiTexCoord4sv; +void APIENTRY bluegl_glMultiTexCoord4sv (GLenum target, const GLshort *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord4sv) (GLenum target, const GLshort *v); + return ((PFN_glMultiTexCoord4sv)__blue_glCore_glMultiTexCoord4sv)(target, v); +} + +extern void* __blue_glCore_glLoadTransposeMatrixf; +void APIENTRY bluegl_glLoadTransposeMatrixf (const GLfloat *m) { + typedef void (APIENTRYP PFN_glLoadTransposeMatrixf) (const GLfloat *m); + return ((PFN_glLoadTransposeMatrixf)__blue_glCore_glLoadTransposeMatrixf)(m); +} + +extern void* __blue_glCore_glLoadTransposeMatrixd; +void APIENTRY bluegl_glLoadTransposeMatrixd (const GLdouble *m) { + typedef void (APIENTRYP PFN_glLoadTransposeMatrixd) (const GLdouble *m); + return ((PFN_glLoadTransposeMatrixd)__blue_glCore_glLoadTransposeMatrixd)(m); +} + +extern void* __blue_glCore_glMultTransposeMatrixf; +void APIENTRY bluegl_glMultTransposeMatrixf (const GLfloat *m) { + typedef void (APIENTRYP PFN_glMultTransposeMatrixf) (const GLfloat *m); + return ((PFN_glMultTransposeMatrixf)__blue_glCore_glMultTransposeMatrixf)(m); +} + +extern void* __blue_glCore_glMultTransposeMatrixd; +void APIENTRY bluegl_glMultTransposeMatrixd (const GLdouble *m) { + typedef void (APIENTRYP PFN_glMultTransposeMatrixd) (const GLdouble *m); + return ((PFN_glMultTransposeMatrixd)__blue_glCore_glMultTransposeMatrixd)(m); +} + +extern void* __blue_glCore_glFogCoordf; +void APIENTRY bluegl_glFogCoordf (GLfloat coord) { + typedef void (APIENTRYP PFN_glFogCoordf) (GLfloat coord); + return ((PFN_glFogCoordf)__blue_glCore_glFogCoordf)(coord); +} + +extern void* __blue_glCore_glFogCoordfv; +void APIENTRY bluegl_glFogCoordfv (const GLfloat *coord) { + typedef void (APIENTRYP PFN_glFogCoordfv) (const GLfloat *coord); + return ((PFN_glFogCoordfv)__blue_glCore_glFogCoordfv)(coord); +} + +extern void* __blue_glCore_glFogCoordd; +void APIENTRY bluegl_glFogCoordd (GLdouble coord) { + typedef void (APIENTRYP PFN_glFogCoordd) (GLdouble coord); + return ((PFN_glFogCoordd)__blue_glCore_glFogCoordd)(coord); +} + +extern void* __blue_glCore_glFogCoorddv; +void APIENTRY bluegl_glFogCoorddv (const GLdouble *coord) { + typedef void (APIENTRYP PFN_glFogCoorddv) (const GLdouble *coord); + return ((PFN_glFogCoorddv)__blue_glCore_glFogCoorddv)(coord); +} + +extern void* __blue_glCore_glFogCoordPointer; +void APIENTRY bluegl_glFogCoordPointer (GLenum type, GLsizei stride, const void *pointer) { + typedef void (APIENTRYP PFN_glFogCoordPointer) (GLenum type, GLsizei stride, const void *pointer); + return ((PFN_glFogCoordPointer)__blue_glCore_glFogCoordPointer)(type, stride, pointer); +} + +extern void* __blue_glCore_glSecondaryColor3b; +void APIENTRY bluegl_glSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue) { + typedef void (APIENTRYP PFN_glSecondaryColor3b) (GLbyte red, GLbyte green, GLbyte blue); + return ((PFN_glSecondaryColor3b)__blue_glCore_glSecondaryColor3b)(red, green, blue); +} + +extern void* __blue_glCore_glSecondaryColor3bv; +void APIENTRY bluegl_glSecondaryColor3bv (const GLbyte *v) { + typedef void (APIENTRYP PFN_glSecondaryColor3bv) (const GLbyte *v); + return ((PFN_glSecondaryColor3bv)__blue_glCore_glSecondaryColor3bv)(v); +} + +extern void* __blue_glCore_glSecondaryColor3d; +void APIENTRY bluegl_glSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue) { + typedef void (APIENTRYP PFN_glSecondaryColor3d) (GLdouble red, GLdouble green, GLdouble blue); + return ((PFN_glSecondaryColor3d)__blue_glCore_glSecondaryColor3d)(red, green, blue); +} + +extern void* __blue_glCore_glSecondaryColor3dv; +void APIENTRY bluegl_glSecondaryColor3dv (const GLdouble *v) { + typedef void (APIENTRYP PFN_glSecondaryColor3dv) (const GLdouble *v); + return ((PFN_glSecondaryColor3dv)__blue_glCore_glSecondaryColor3dv)(v); +} + +extern void* __blue_glCore_glSecondaryColor3f; +void APIENTRY bluegl_glSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue) { + typedef void (APIENTRYP PFN_glSecondaryColor3f) (GLfloat red, GLfloat green, GLfloat blue); + return ((PFN_glSecondaryColor3f)__blue_glCore_glSecondaryColor3f)(red, green, blue); +} + +extern void* __blue_glCore_glSecondaryColor3fv; +void APIENTRY bluegl_glSecondaryColor3fv (const GLfloat *v) { + typedef void (APIENTRYP PFN_glSecondaryColor3fv) (const GLfloat *v); + return ((PFN_glSecondaryColor3fv)__blue_glCore_glSecondaryColor3fv)(v); +} + +extern void* __blue_glCore_glSecondaryColor3i; +void APIENTRY bluegl_glSecondaryColor3i (GLint red, GLint green, GLint blue) { + typedef void (APIENTRYP PFN_glSecondaryColor3i) (GLint red, GLint green, GLint blue); + return ((PFN_glSecondaryColor3i)__blue_glCore_glSecondaryColor3i)(red, green, blue); +} + +extern void* __blue_glCore_glSecondaryColor3iv; +void APIENTRY bluegl_glSecondaryColor3iv (const GLint *v) { + typedef void (APIENTRYP PFN_glSecondaryColor3iv) (const GLint *v); + return ((PFN_glSecondaryColor3iv)__blue_glCore_glSecondaryColor3iv)(v); +} + +extern void* __blue_glCore_glSecondaryColor3s; +void APIENTRY bluegl_glSecondaryColor3s (GLshort red, GLshort green, GLshort blue) { + typedef void (APIENTRYP PFN_glSecondaryColor3s) (GLshort red, GLshort green, GLshort blue); + return ((PFN_glSecondaryColor3s)__blue_glCore_glSecondaryColor3s)(red, green, blue); +} + +extern void* __blue_glCore_glSecondaryColor3sv; +void APIENTRY bluegl_glSecondaryColor3sv (const GLshort *v) { + typedef void (APIENTRYP PFN_glSecondaryColor3sv) (const GLshort *v); + return ((PFN_glSecondaryColor3sv)__blue_glCore_glSecondaryColor3sv)(v); +} + +extern void* __blue_glCore_glSecondaryColor3ub; +void APIENTRY bluegl_glSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue) { + typedef void (APIENTRYP PFN_glSecondaryColor3ub) (GLubyte red, GLubyte green, GLubyte blue); + return ((PFN_glSecondaryColor3ub)__blue_glCore_glSecondaryColor3ub)(red, green, blue); +} + +extern void* __blue_glCore_glSecondaryColor3ubv; +void APIENTRY bluegl_glSecondaryColor3ubv (const GLubyte *v) { + typedef void (APIENTRYP PFN_glSecondaryColor3ubv) (const GLubyte *v); + return ((PFN_glSecondaryColor3ubv)__blue_glCore_glSecondaryColor3ubv)(v); +} + +extern void* __blue_glCore_glSecondaryColor3ui; +void APIENTRY bluegl_glSecondaryColor3ui (GLuint red, GLuint green, GLuint blue) { + typedef void (APIENTRYP PFN_glSecondaryColor3ui) (GLuint red, GLuint green, GLuint blue); + return ((PFN_glSecondaryColor3ui)__blue_glCore_glSecondaryColor3ui)(red, green, blue); +} + +extern void* __blue_glCore_glSecondaryColor3uiv; +void APIENTRY bluegl_glSecondaryColor3uiv (const GLuint *v) { + typedef void (APIENTRYP PFN_glSecondaryColor3uiv) (const GLuint *v); + return ((PFN_glSecondaryColor3uiv)__blue_glCore_glSecondaryColor3uiv)(v); +} + +extern void* __blue_glCore_glSecondaryColor3us; +void APIENTRY bluegl_glSecondaryColor3us (GLushort red, GLushort green, GLushort blue) { + typedef void (APIENTRYP PFN_glSecondaryColor3us) (GLushort red, GLushort green, GLushort blue); + return ((PFN_glSecondaryColor3us)__blue_glCore_glSecondaryColor3us)(red, green, blue); +} + +extern void* __blue_glCore_glSecondaryColor3usv; +void APIENTRY bluegl_glSecondaryColor3usv (const GLushort *v) { + typedef void (APIENTRYP PFN_glSecondaryColor3usv) (const GLushort *v); + return ((PFN_glSecondaryColor3usv)__blue_glCore_glSecondaryColor3usv)(v); +} + +extern void* __blue_glCore_glSecondaryColorPointer; +void APIENTRY bluegl_glSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer) { + typedef void (APIENTRYP PFN_glSecondaryColorPointer) (GLint size, GLenum type, GLsizei stride, const void *pointer); + return ((PFN_glSecondaryColorPointer)__blue_glCore_glSecondaryColorPointer)(size, type, stride, pointer); +} + +extern void* __blue_glCore_glWindowPos2d; +void APIENTRY bluegl_glWindowPos2d (GLdouble x, GLdouble y) { + typedef void (APIENTRYP PFN_glWindowPos2d) (GLdouble x, GLdouble y); + return ((PFN_glWindowPos2d)__blue_glCore_glWindowPos2d)(x, y); +} + +extern void* __blue_glCore_glWindowPos2dv; +void APIENTRY bluegl_glWindowPos2dv (const GLdouble *v) { + typedef void (APIENTRYP PFN_glWindowPos2dv) (const GLdouble *v); + return ((PFN_glWindowPos2dv)__blue_glCore_glWindowPos2dv)(v); +} + +extern void* __blue_glCore_glWindowPos2f; +void APIENTRY bluegl_glWindowPos2f (GLfloat x, GLfloat y) { + typedef void (APIENTRYP PFN_glWindowPos2f) (GLfloat x, GLfloat y); + return ((PFN_glWindowPos2f)__blue_glCore_glWindowPos2f)(x, y); +} + +extern void* __blue_glCore_glWindowPos2fv; +void APIENTRY bluegl_glWindowPos2fv (const GLfloat *v) { + typedef void (APIENTRYP PFN_glWindowPos2fv) (const GLfloat *v); + return ((PFN_glWindowPos2fv)__blue_glCore_glWindowPos2fv)(v); +} + +extern void* __blue_glCore_glWindowPos2i; +void APIENTRY bluegl_glWindowPos2i (GLint x, GLint y) { + typedef void (APIENTRYP PFN_glWindowPos2i) (GLint x, GLint y); + return ((PFN_glWindowPos2i)__blue_glCore_glWindowPos2i)(x, y); +} + +extern void* __blue_glCore_glWindowPos2iv; +void APIENTRY bluegl_glWindowPos2iv (const GLint *v) { + typedef void (APIENTRYP PFN_glWindowPos2iv) (const GLint *v); + return ((PFN_glWindowPos2iv)__blue_glCore_glWindowPos2iv)(v); +} + +extern void* __blue_glCore_glWindowPos2s; +void APIENTRY bluegl_glWindowPos2s (GLshort x, GLshort y) { + typedef void (APIENTRYP PFN_glWindowPos2s) (GLshort x, GLshort y); + return ((PFN_glWindowPos2s)__blue_glCore_glWindowPos2s)(x, y); +} + +extern void* __blue_glCore_glWindowPos2sv; +void APIENTRY bluegl_glWindowPos2sv (const GLshort *v) { + typedef void (APIENTRYP PFN_glWindowPos2sv) (const GLshort *v); + return ((PFN_glWindowPos2sv)__blue_glCore_glWindowPos2sv)(v); +} + +extern void* __blue_glCore_glWindowPos3d; +void APIENTRY bluegl_glWindowPos3d (GLdouble x, GLdouble y, GLdouble z) { + typedef void (APIENTRYP PFN_glWindowPos3d) (GLdouble x, GLdouble y, GLdouble z); + return ((PFN_glWindowPos3d)__blue_glCore_glWindowPos3d)(x, y, z); +} + +extern void* __blue_glCore_glWindowPos3dv; +void APIENTRY bluegl_glWindowPos3dv (const GLdouble *v) { + typedef void (APIENTRYP PFN_glWindowPos3dv) (const GLdouble *v); + return ((PFN_glWindowPos3dv)__blue_glCore_glWindowPos3dv)(v); +} + +extern void* __blue_glCore_glWindowPos3f; +void APIENTRY bluegl_glWindowPos3f (GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glWindowPos3f) (GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glWindowPos3f)__blue_glCore_glWindowPos3f)(x, y, z); +} + +extern void* __blue_glCore_glWindowPos3fv; +void APIENTRY bluegl_glWindowPos3fv (const GLfloat *v) { + typedef void (APIENTRYP PFN_glWindowPos3fv) (const GLfloat *v); + return ((PFN_glWindowPos3fv)__blue_glCore_glWindowPos3fv)(v); +} + +extern void* __blue_glCore_glWindowPos3i; +void APIENTRY bluegl_glWindowPos3i (GLint x, GLint y, GLint z) { + typedef void (APIENTRYP PFN_glWindowPos3i) (GLint x, GLint y, GLint z); + return ((PFN_glWindowPos3i)__blue_glCore_glWindowPos3i)(x, y, z); +} + +extern void* __blue_glCore_glWindowPos3iv; +void APIENTRY bluegl_glWindowPos3iv (const GLint *v) { + typedef void (APIENTRYP PFN_glWindowPos3iv) (const GLint *v); + return ((PFN_glWindowPos3iv)__blue_glCore_glWindowPos3iv)(v); +} + +extern void* __blue_glCore_glWindowPos3s; +void APIENTRY bluegl_glWindowPos3s (GLshort x, GLshort y, GLshort z) { + typedef void (APIENTRYP PFN_glWindowPos3s) (GLshort x, GLshort y, GLshort z); + return ((PFN_glWindowPos3s)__blue_glCore_glWindowPos3s)(x, y, z); +} + +extern void* __blue_glCore_glWindowPos3sv; +void APIENTRY bluegl_glWindowPos3sv (const GLshort *v) { + typedef void (APIENTRYP PFN_glWindowPos3sv) (const GLshort *v); + return ((PFN_glWindowPos3sv)__blue_glCore_glWindowPos3sv)(v); +} + +extern void* __blue_glCore_glVertexP2ui; +void APIENTRY bluegl_glVertexP2ui (GLenum type, GLuint value) { + typedef void (APIENTRYP PFN_glVertexP2ui) (GLenum type, GLuint value); + return ((PFN_glVertexP2ui)__blue_glCore_glVertexP2ui)(type, value); +} + +extern void* __blue_glCore_glVertexP2uiv; +void APIENTRY bluegl_glVertexP2uiv (GLenum type, const GLuint *value) { + typedef void (APIENTRYP PFN_glVertexP2uiv) (GLenum type, const GLuint *value); + return ((PFN_glVertexP2uiv)__blue_glCore_glVertexP2uiv)(type, value); +} + +extern void* __blue_glCore_glVertexP3ui; +void APIENTRY bluegl_glVertexP3ui (GLenum type, GLuint value) { + typedef void (APIENTRYP PFN_glVertexP3ui) (GLenum type, GLuint value); + return ((PFN_glVertexP3ui)__blue_glCore_glVertexP3ui)(type, value); +} + +extern void* __blue_glCore_glVertexP3uiv; +void APIENTRY bluegl_glVertexP3uiv (GLenum type, const GLuint *value) { + typedef void (APIENTRYP PFN_glVertexP3uiv) (GLenum type, const GLuint *value); + return ((PFN_glVertexP3uiv)__blue_glCore_glVertexP3uiv)(type, value); +} + +extern void* __blue_glCore_glVertexP4ui; +void APIENTRY bluegl_glVertexP4ui (GLenum type, GLuint value) { + typedef void (APIENTRYP PFN_glVertexP4ui) (GLenum type, GLuint value); + return ((PFN_glVertexP4ui)__blue_glCore_glVertexP4ui)(type, value); +} + +extern void* __blue_glCore_glVertexP4uiv; +void APIENTRY bluegl_glVertexP4uiv (GLenum type, const GLuint *value) { + typedef void (APIENTRYP PFN_glVertexP4uiv) (GLenum type, const GLuint *value); + return ((PFN_glVertexP4uiv)__blue_glCore_glVertexP4uiv)(type, value); +} + +extern void* __blue_glCore_glTexCoordP1ui; +void APIENTRY bluegl_glTexCoordP1ui (GLenum type, GLuint coords) { + typedef void (APIENTRYP PFN_glTexCoordP1ui) (GLenum type, GLuint coords); + return ((PFN_glTexCoordP1ui)__blue_glCore_glTexCoordP1ui)(type, coords); +} + +extern void* __blue_glCore_glTexCoordP1uiv; +void APIENTRY bluegl_glTexCoordP1uiv (GLenum type, const GLuint *coords) { + typedef void (APIENTRYP PFN_glTexCoordP1uiv) (GLenum type, const GLuint *coords); + return ((PFN_glTexCoordP1uiv)__blue_glCore_glTexCoordP1uiv)(type, coords); +} + +extern void* __blue_glCore_glTexCoordP2ui; +void APIENTRY bluegl_glTexCoordP2ui (GLenum type, GLuint coords) { + typedef void (APIENTRYP PFN_glTexCoordP2ui) (GLenum type, GLuint coords); + return ((PFN_glTexCoordP2ui)__blue_glCore_glTexCoordP2ui)(type, coords); +} + +extern void* __blue_glCore_glTexCoordP2uiv; +void APIENTRY bluegl_glTexCoordP2uiv (GLenum type, const GLuint *coords) { + typedef void (APIENTRYP PFN_glTexCoordP2uiv) (GLenum type, const GLuint *coords); + return ((PFN_glTexCoordP2uiv)__blue_glCore_glTexCoordP2uiv)(type, coords); +} + +extern void* __blue_glCore_glTexCoordP3ui; +void APIENTRY bluegl_glTexCoordP3ui (GLenum type, GLuint coords) { + typedef void (APIENTRYP PFN_glTexCoordP3ui) (GLenum type, GLuint coords); + return ((PFN_glTexCoordP3ui)__blue_glCore_glTexCoordP3ui)(type, coords); +} + +extern void* __blue_glCore_glTexCoordP3uiv; +void APIENTRY bluegl_glTexCoordP3uiv (GLenum type, const GLuint *coords) { + typedef void (APIENTRYP PFN_glTexCoordP3uiv) (GLenum type, const GLuint *coords); + return ((PFN_glTexCoordP3uiv)__blue_glCore_glTexCoordP3uiv)(type, coords); +} + +extern void* __blue_glCore_glTexCoordP4ui; +void APIENTRY bluegl_glTexCoordP4ui (GLenum type, GLuint coords) { + typedef void (APIENTRYP PFN_glTexCoordP4ui) (GLenum type, GLuint coords); + return ((PFN_glTexCoordP4ui)__blue_glCore_glTexCoordP4ui)(type, coords); +} + +extern void* __blue_glCore_glTexCoordP4uiv; +void APIENTRY bluegl_glTexCoordP4uiv (GLenum type, const GLuint *coords) { + typedef void (APIENTRYP PFN_glTexCoordP4uiv) (GLenum type, const GLuint *coords); + return ((PFN_glTexCoordP4uiv)__blue_glCore_glTexCoordP4uiv)(type, coords); +} + +extern void* __blue_glCore_glMultiTexCoordP1ui; +void APIENTRY bluegl_glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords) { + typedef void (APIENTRYP PFN_glMultiTexCoordP1ui) (GLenum texture, GLenum type, GLuint coords); + return ((PFN_glMultiTexCoordP1ui)__blue_glCore_glMultiTexCoordP1ui)(texture, type, coords); +} + +extern void* __blue_glCore_glMultiTexCoordP1uiv; +void APIENTRY bluegl_glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords) { + typedef void (APIENTRYP PFN_glMultiTexCoordP1uiv) (GLenum texture, GLenum type, const GLuint *coords); + return ((PFN_glMultiTexCoordP1uiv)__blue_glCore_glMultiTexCoordP1uiv)(texture, type, coords); +} + +extern void* __blue_glCore_glMultiTexCoordP2ui; +void APIENTRY bluegl_glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords) { + typedef void (APIENTRYP PFN_glMultiTexCoordP2ui) (GLenum texture, GLenum type, GLuint coords); + return ((PFN_glMultiTexCoordP2ui)__blue_glCore_glMultiTexCoordP2ui)(texture, type, coords); +} + +extern void* __blue_glCore_glMultiTexCoordP2uiv; +void APIENTRY bluegl_glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords) { + typedef void (APIENTRYP PFN_glMultiTexCoordP2uiv) (GLenum texture, GLenum type, const GLuint *coords); + return ((PFN_glMultiTexCoordP2uiv)__blue_glCore_glMultiTexCoordP2uiv)(texture, type, coords); +} + +extern void* __blue_glCore_glMultiTexCoordP3ui; +void APIENTRY bluegl_glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords) { + typedef void (APIENTRYP PFN_glMultiTexCoordP3ui) (GLenum texture, GLenum type, GLuint coords); + return ((PFN_glMultiTexCoordP3ui)__blue_glCore_glMultiTexCoordP3ui)(texture, type, coords); +} + +extern void* __blue_glCore_glMultiTexCoordP3uiv; +void APIENTRY bluegl_glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords) { + typedef void (APIENTRYP PFN_glMultiTexCoordP3uiv) (GLenum texture, GLenum type, const GLuint *coords); + return ((PFN_glMultiTexCoordP3uiv)__blue_glCore_glMultiTexCoordP3uiv)(texture, type, coords); +} + +extern void* __blue_glCore_glMultiTexCoordP4ui; +void APIENTRY bluegl_glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords) { + typedef void (APIENTRYP PFN_glMultiTexCoordP4ui) (GLenum texture, GLenum type, GLuint coords); + return ((PFN_glMultiTexCoordP4ui)__blue_glCore_glMultiTexCoordP4ui)(texture, type, coords); +} + +extern void* __blue_glCore_glMultiTexCoordP4uiv; +void APIENTRY bluegl_glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords) { + typedef void (APIENTRYP PFN_glMultiTexCoordP4uiv) (GLenum texture, GLenum type, const GLuint *coords); + return ((PFN_glMultiTexCoordP4uiv)__blue_glCore_glMultiTexCoordP4uiv)(texture, type, coords); +} + +extern void* __blue_glCore_glNormalP3ui; +void APIENTRY bluegl_glNormalP3ui (GLenum type, GLuint coords) { + typedef void (APIENTRYP PFN_glNormalP3ui) (GLenum type, GLuint coords); + return ((PFN_glNormalP3ui)__blue_glCore_glNormalP3ui)(type, coords); +} + +extern void* __blue_glCore_glNormalP3uiv; +void APIENTRY bluegl_glNormalP3uiv (GLenum type, const GLuint *coords) { + typedef void (APIENTRYP PFN_glNormalP3uiv) (GLenum type, const GLuint *coords); + return ((PFN_glNormalP3uiv)__blue_glCore_glNormalP3uiv)(type, coords); +} + +extern void* __blue_glCore_glColorP3ui; +void APIENTRY bluegl_glColorP3ui (GLenum type, GLuint color) { + typedef void (APIENTRYP PFN_glColorP3ui) (GLenum type, GLuint color); + return ((PFN_glColorP3ui)__blue_glCore_glColorP3ui)(type, color); +} + +extern void* __blue_glCore_glColorP3uiv; +void APIENTRY bluegl_glColorP3uiv (GLenum type, const GLuint *color) { + typedef void (APIENTRYP PFN_glColorP3uiv) (GLenum type, const GLuint *color); + return ((PFN_glColorP3uiv)__blue_glCore_glColorP3uiv)(type, color); +} + +extern void* __blue_glCore_glColorP4ui; +void APIENTRY bluegl_glColorP4ui (GLenum type, GLuint color) { + typedef void (APIENTRYP PFN_glColorP4ui) (GLenum type, GLuint color); + return ((PFN_glColorP4ui)__blue_glCore_glColorP4ui)(type, color); +} + +extern void* __blue_glCore_glColorP4uiv; +void APIENTRY bluegl_glColorP4uiv (GLenum type, const GLuint *color) { + typedef void (APIENTRYP PFN_glColorP4uiv) (GLenum type, const GLuint *color); + return ((PFN_glColorP4uiv)__blue_glCore_glColorP4uiv)(type, color); +} + +extern void* __blue_glCore_glSecondaryColorP3ui; +void APIENTRY bluegl_glSecondaryColorP3ui (GLenum type, GLuint color) { + typedef void (APIENTRYP PFN_glSecondaryColorP3ui) (GLenum type, GLuint color); + return ((PFN_glSecondaryColorP3ui)__blue_glCore_glSecondaryColorP3ui)(type, color); +} + +extern void* __blue_glCore_glSecondaryColorP3uiv; +void APIENTRY bluegl_glSecondaryColorP3uiv (GLenum type, const GLuint *color) { + typedef void (APIENTRYP PFN_glSecondaryColorP3uiv) (GLenum type, const GLuint *color); + return ((PFN_glSecondaryColorP3uiv)__blue_glCore_glSecondaryColorP3uiv)(type, color); +} + +extern void* __blue_glCore_glGetnMapdv; +void APIENTRY bluegl_glGetnMapdv (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v) { + typedef void (APIENTRYP PFN_glGetnMapdv) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); + return ((PFN_glGetnMapdv)__blue_glCore_glGetnMapdv)(target, query, bufSize, v); +} + +extern void* __blue_glCore_glGetnMapfv; +void APIENTRY bluegl_glGetnMapfv (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v) { + typedef void (APIENTRYP PFN_glGetnMapfv) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); + return ((PFN_glGetnMapfv)__blue_glCore_glGetnMapfv)(target, query, bufSize, v); +} + +extern void* __blue_glCore_glGetnMapiv; +void APIENTRY bluegl_glGetnMapiv (GLenum target, GLenum query, GLsizei bufSize, GLint *v) { + typedef void (APIENTRYP PFN_glGetnMapiv) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); + return ((PFN_glGetnMapiv)__blue_glCore_glGetnMapiv)(target, query, bufSize, v); +} + +extern void* __blue_glCore_glGetnPixelMapfv; +void APIENTRY bluegl_glGetnPixelMapfv (GLenum map, GLsizei bufSize, GLfloat *values) { + typedef void (APIENTRYP PFN_glGetnPixelMapfv) (GLenum map, GLsizei bufSize, GLfloat *values); + return ((PFN_glGetnPixelMapfv)__blue_glCore_glGetnPixelMapfv)(map, bufSize, values); +} + +extern void* __blue_glCore_glGetnPixelMapuiv; +void APIENTRY bluegl_glGetnPixelMapuiv (GLenum map, GLsizei bufSize, GLuint *values) { + typedef void (APIENTRYP PFN_glGetnPixelMapuiv) (GLenum map, GLsizei bufSize, GLuint *values); + return ((PFN_glGetnPixelMapuiv)__blue_glCore_glGetnPixelMapuiv)(map, bufSize, values); +} + +extern void* __blue_glCore_glGetnPixelMapusv; +void APIENTRY bluegl_glGetnPixelMapusv (GLenum map, GLsizei bufSize, GLushort *values) { + typedef void (APIENTRYP PFN_glGetnPixelMapusv) (GLenum map, GLsizei bufSize, GLushort *values); + return ((PFN_glGetnPixelMapusv)__blue_glCore_glGetnPixelMapusv)(map, bufSize, values); +} + +extern void* __blue_glCore_glGetnPolygonStipple; +void APIENTRY bluegl_glGetnPolygonStipple (GLsizei bufSize, GLubyte *pattern) { + typedef void (APIENTRYP PFN_glGetnPolygonStipple) (GLsizei bufSize, GLubyte *pattern); + return ((PFN_glGetnPolygonStipple)__blue_glCore_glGetnPolygonStipple)(bufSize, pattern); +} + +extern void* __blue_glCore_glGetnColorTable; +void APIENTRY bluegl_glGetnColorTable (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table) { + typedef void (APIENTRYP PFN_glGetnColorTable) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); + return ((PFN_glGetnColorTable)__blue_glCore_glGetnColorTable)(target, format, type, bufSize, table); +} + +extern void* __blue_glCore_glGetnConvolutionFilter; +void APIENTRY bluegl_glGetnConvolutionFilter (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image) { + typedef void (APIENTRYP PFN_glGetnConvolutionFilter) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); + return ((PFN_glGetnConvolutionFilter)__blue_glCore_glGetnConvolutionFilter)(target, format, type, bufSize, image); +} + +extern void* __blue_glCore_glGetnSeparableFilter; +void APIENTRY bluegl_glGetnSeparableFilter (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span) { + typedef void (APIENTRYP PFN_glGetnSeparableFilter) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); + return ((PFN_glGetnSeparableFilter)__blue_glCore_glGetnSeparableFilter)(target, format, type, rowBufSize, row, columnBufSize, column, span); +} + +extern void* __blue_glCore_glGetnHistogram; +void APIENTRY bluegl_glGetnHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values) { + typedef void (APIENTRYP PFN_glGetnHistogram) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); + return ((PFN_glGetnHistogram)__blue_glCore_glGetnHistogram)(target, reset, format, type, bufSize, values); +} + +extern void* __blue_glCore_glGetnMinmax; +void APIENTRY bluegl_glGetnMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values) { + typedef void (APIENTRYP PFN_glGetnMinmax) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); + return ((PFN_glGetnMinmax)__blue_glCore_glGetnMinmax)(target, reset, format, type, bufSize, values); +} + +extern void* __blue_glCore_glPrimitiveBoundingBoxARB; +void APIENTRY bluegl_glPrimitiveBoundingBoxARB (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW) { + typedef void (APIENTRYP PFN_glPrimitiveBoundingBoxARB) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); + return ((PFN_glPrimitiveBoundingBoxARB)__blue_glCore_glPrimitiveBoundingBoxARB)(minX, minY, minZ, minW, maxX, maxY, maxZ, maxW); +} + +extern void* __blue_glCore_glClampColorARB; +void APIENTRY bluegl_glClampColorARB (GLenum target, GLenum clamp) { + typedef void (APIENTRYP PFN_glClampColorARB) (GLenum target, GLenum clamp); + return ((PFN_glClampColorARB)__blue_glCore_glClampColorARB)(target, clamp); +} + +extern void* __blue_glCore_glDrawBuffersARB; +void APIENTRY bluegl_glDrawBuffersARB (GLsizei n, const GLenum *bufs) { + typedef void (APIENTRYP PFN_glDrawBuffersARB) (GLsizei n, const GLenum *bufs); + return ((PFN_glDrawBuffersARB)__blue_glCore_glDrawBuffersARB)(n, bufs); +} + +extern void* __blue_glCore_glDrawArraysInstancedARB; +void APIENTRY bluegl_glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count, GLsizei primcount) { + typedef void (APIENTRYP PFN_glDrawArraysInstancedARB) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); + return ((PFN_glDrawArraysInstancedARB)__blue_glCore_glDrawArraysInstancedARB)(mode, first, count, primcount); +} + +extern void* __blue_glCore_glDrawElementsInstancedARB; +void APIENTRY bluegl_glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount) { + typedef void (APIENTRYP PFN_glDrawElementsInstancedARB) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); + return ((PFN_glDrawElementsInstancedARB)__blue_glCore_glDrawElementsInstancedARB)(mode, count, type, indices, primcount); +} + +extern void* __blue_glCore_glProgramStringARB; +void APIENTRY bluegl_glProgramStringARB (GLenum target, GLenum format, GLsizei len, const void *string) { + typedef void (APIENTRYP PFN_glProgramStringARB) (GLenum target, GLenum format, GLsizei len, const void *string); + return ((PFN_glProgramStringARB)__blue_glCore_glProgramStringARB)(target, format, len, string); +} + +extern void* __blue_glCore_glBindProgramARB; +void APIENTRY bluegl_glBindProgramARB (GLenum target, GLuint program) { + typedef void (APIENTRYP PFN_glBindProgramARB) (GLenum target, GLuint program); + return ((PFN_glBindProgramARB)__blue_glCore_glBindProgramARB)(target, program); +} + +extern void* __blue_glCore_glDeleteProgramsARB; +void APIENTRY bluegl_glDeleteProgramsARB (GLsizei n, const GLuint *programs) { + typedef void (APIENTRYP PFN_glDeleteProgramsARB) (GLsizei n, const GLuint *programs); + return ((PFN_glDeleteProgramsARB)__blue_glCore_glDeleteProgramsARB)(n, programs); +} + +extern void* __blue_glCore_glGenProgramsARB; +void APIENTRY bluegl_glGenProgramsARB (GLsizei n, GLuint *programs) { + typedef void (APIENTRYP PFN_glGenProgramsARB) (GLsizei n, GLuint *programs); + return ((PFN_glGenProgramsARB)__blue_glCore_glGenProgramsARB)(n, programs); +} + +extern void* __blue_glCore_glProgramEnvParameter4dARB; +void APIENTRY bluegl_glProgramEnvParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { + typedef void (APIENTRYP PFN_glProgramEnvParameter4dARB) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + return ((PFN_glProgramEnvParameter4dARB)__blue_glCore_glProgramEnvParameter4dARB)(target, index, x, y, z, w); +} + +extern void* __blue_glCore_glProgramEnvParameter4dvARB; +void APIENTRY bluegl_glProgramEnvParameter4dvARB (GLenum target, GLuint index, const GLdouble *params) { + typedef void (APIENTRYP PFN_glProgramEnvParameter4dvARB) (GLenum target, GLuint index, const GLdouble *params); + return ((PFN_glProgramEnvParameter4dvARB)__blue_glCore_glProgramEnvParameter4dvARB)(target, index, params); +} + +extern void* __blue_glCore_glProgramEnvParameter4fARB; +void APIENTRY bluegl_glProgramEnvParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { + typedef void (APIENTRYP PFN_glProgramEnvParameter4fARB) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + return ((PFN_glProgramEnvParameter4fARB)__blue_glCore_glProgramEnvParameter4fARB)(target, index, x, y, z, w); +} + +extern void* __blue_glCore_glProgramEnvParameter4fvARB; +void APIENTRY bluegl_glProgramEnvParameter4fvARB (GLenum target, GLuint index, const GLfloat *params) { + typedef void (APIENTRYP PFN_glProgramEnvParameter4fvARB) (GLenum target, GLuint index, const GLfloat *params); + return ((PFN_glProgramEnvParameter4fvARB)__blue_glCore_glProgramEnvParameter4fvARB)(target, index, params); +} + +extern void* __blue_glCore_glProgramLocalParameter4dARB; +void APIENTRY bluegl_glProgramLocalParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { + typedef void (APIENTRYP PFN_glProgramLocalParameter4dARB) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + return ((PFN_glProgramLocalParameter4dARB)__blue_glCore_glProgramLocalParameter4dARB)(target, index, x, y, z, w); +} + +extern void* __blue_glCore_glProgramLocalParameter4dvARB; +void APIENTRY bluegl_glProgramLocalParameter4dvARB (GLenum target, GLuint index, const GLdouble *params) { + typedef void (APIENTRYP PFN_glProgramLocalParameter4dvARB) (GLenum target, GLuint index, const GLdouble *params); + return ((PFN_glProgramLocalParameter4dvARB)__blue_glCore_glProgramLocalParameter4dvARB)(target, index, params); +} + +extern void* __blue_glCore_glProgramLocalParameter4fARB; +void APIENTRY bluegl_glProgramLocalParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { + typedef void (APIENTRYP PFN_glProgramLocalParameter4fARB) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + return ((PFN_glProgramLocalParameter4fARB)__blue_glCore_glProgramLocalParameter4fARB)(target, index, x, y, z, w); +} + +extern void* __blue_glCore_glProgramLocalParameter4fvARB; +void APIENTRY bluegl_glProgramLocalParameter4fvARB (GLenum target, GLuint index, const GLfloat *params) { + typedef void (APIENTRYP PFN_glProgramLocalParameter4fvARB) (GLenum target, GLuint index, const GLfloat *params); + return ((PFN_glProgramLocalParameter4fvARB)__blue_glCore_glProgramLocalParameter4fvARB)(target, index, params); +} + +extern void* __blue_glCore_glGetProgramEnvParameterdvARB; +void APIENTRY bluegl_glGetProgramEnvParameterdvARB (GLenum target, GLuint index, GLdouble *params) { + typedef void (APIENTRYP PFN_glGetProgramEnvParameterdvARB) (GLenum target, GLuint index, GLdouble *params); + return ((PFN_glGetProgramEnvParameterdvARB)__blue_glCore_glGetProgramEnvParameterdvARB)(target, index, params); +} + +extern void* __blue_glCore_glGetProgramEnvParameterfvARB; +void APIENTRY bluegl_glGetProgramEnvParameterfvARB (GLenum target, GLuint index, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetProgramEnvParameterfvARB) (GLenum target, GLuint index, GLfloat *params); + return ((PFN_glGetProgramEnvParameterfvARB)__blue_glCore_glGetProgramEnvParameterfvARB)(target, index, params); +} + +extern void* __blue_glCore_glGetProgramLocalParameterdvARB; +void APIENTRY bluegl_glGetProgramLocalParameterdvARB (GLenum target, GLuint index, GLdouble *params) { + typedef void (APIENTRYP PFN_glGetProgramLocalParameterdvARB) (GLenum target, GLuint index, GLdouble *params); + return ((PFN_glGetProgramLocalParameterdvARB)__blue_glCore_glGetProgramLocalParameterdvARB)(target, index, params); +} + +extern void* __blue_glCore_glGetProgramLocalParameterfvARB; +void APIENTRY bluegl_glGetProgramLocalParameterfvARB (GLenum target, GLuint index, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetProgramLocalParameterfvARB) (GLenum target, GLuint index, GLfloat *params); + return ((PFN_glGetProgramLocalParameterfvARB)__blue_glCore_glGetProgramLocalParameterfvARB)(target, index, params); +} + +extern void* __blue_glCore_glGetProgramivARB; +void APIENTRY bluegl_glGetProgramivARB (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetProgramivARB) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetProgramivARB)__blue_glCore_glGetProgramivARB)(target, pname, params); +} + +extern void* __blue_glCore_glGetProgramStringARB; +void APIENTRY bluegl_glGetProgramStringARB (GLenum target, GLenum pname, void *string) { + typedef void (APIENTRYP PFN_glGetProgramStringARB) (GLenum target, GLenum pname, void *string); + return ((PFN_glGetProgramStringARB)__blue_glCore_glGetProgramStringARB)(target, pname, string); +} + +extern void* __blue_glCore_glIsProgramARB; +GLboolean APIENTRY bluegl_glIsProgramARB (GLuint program) { + typedef GLboolean (APIENTRYP PFN_glIsProgramARB) (GLuint program); + return ((PFN_glIsProgramARB)__blue_glCore_glIsProgramARB)(program); +} + +extern void* __blue_glCore_glProgramParameteriARB; +void APIENTRY bluegl_glProgramParameteriARB (GLuint program, GLenum pname, GLint value) { + typedef void (APIENTRYP PFN_glProgramParameteriARB) (GLuint program, GLenum pname, GLint value); + return ((PFN_glProgramParameteriARB)__blue_glCore_glProgramParameteriARB)(program, pname, value); +} + +extern void* __blue_glCore_glFramebufferTextureARB; +void APIENTRY bluegl_glFramebufferTextureARB (GLenum target, GLenum attachment, GLuint texture, GLint level) { + typedef void (APIENTRYP PFN_glFramebufferTextureARB) (GLenum target, GLenum attachment, GLuint texture, GLint level); + return ((PFN_glFramebufferTextureARB)__blue_glCore_glFramebufferTextureARB)(target, attachment, texture, level); +} + +extern void* __blue_glCore_glFramebufferTextureLayerARB; +void APIENTRY bluegl_glFramebufferTextureLayerARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) { + typedef void (APIENTRYP PFN_glFramebufferTextureLayerARB) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); + return ((PFN_glFramebufferTextureLayerARB)__blue_glCore_glFramebufferTextureLayerARB)(target, attachment, texture, level, layer); +} + +extern void* __blue_glCore_glFramebufferTextureFaceARB; +void APIENTRY bluegl_glFramebufferTextureFaceARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face) { + typedef void (APIENTRYP PFN_glFramebufferTextureFaceARB) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); + return ((PFN_glFramebufferTextureFaceARB)__blue_glCore_glFramebufferTextureFaceARB)(target, attachment, texture, level, face); +} + +extern void* __blue_glCore_glUniform1i64ARB; +void APIENTRY bluegl_glUniform1i64ARB (GLint location, GLint64 x) { + typedef void (APIENTRYP PFN_glUniform1i64ARB) (GLint location, GLint64 x); + return ((PFN_glUniform1i64ARB)__blue_glCore_glUniform1i64ARB)(location, x); +} + +extern void* __blue_glCore_glUniform2i64ARB; +void APIENTRY bluegl_glUniform2i64ARB (GLint location, GLint64 x, GLint64 y) { + typedef void (APIENTRYP PFN_glUniform2i64ARB) (GLint location, GLint64 x, GLint64 y); + return ((PFN_glUniform2i64ARB)__blue_glCore_glUniform2i64ARB)(location, x, y); +} + +extern void* __blue_glCore_glUniform3i64ARB; +void APIENTRY bluegl_glUniform3i64ARB (GLint location, GLint64 x, GLint64 y, GLint64 z) { + typedef void (APIENTRYP PFN_glUniform3i64ARB) (GLint location, GLint64 x, GLint64 y, GLint64 z); + return ((PFN_glUniform3i64ARB)__blue_glCore_glUniform3i64ARB)(location, x, y, z); +} + +extern void* __blue_glCore_glUniform4i64ARB; +void APIENTRY bluegl_glUniform4i64ARB (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w) { + typedef void (APIENTRYP PFN_glUniform4i64ARB) (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); + return ((PFN_glUniform4i64ARB)__blue_glCore_glUniform4i64ARB)(location, x, y, z, w); +} + +extern void* __blue_glCore_glUniform1i64vARB; +void APIENTRY bluegl_glUniform1i64vARB (GLint location, GLsizei count, const GLint64 *value) { + typedef void (APIENTRYP PFN_glUniform1i64vARB) (GLint location, GLsizei count, const GLint64 *value); + return ((PFN_glUniform1i64vARB)__blue_glCore_glUniform1i64vARB)(location, count, value); +} + +extern void* __blue_glCore_glUniform2i64vARB; +void APIENTRY bluegl_glUniform2i64vARB (GLint location, GLsizei count, const GLint64 *value) { + typedef void (APIENTRYP PFN_glUniform2i64vARB) (GLint location, GLsizei count, const GLint64 *value); + return ((PFN_glUniform2i64vARB)__blue_glCore_glUniform2i64vARB)(location, count, value); +} + +extern void* __blue_glCore_glUniform3i64vARB; +void APIENTRY bluegl_glUniform3i64vARB (GLint location, GLsizei count, const GLint64 *value) { + typedef void (APIENTRYP PFN_glUniform3i64vARB) (GLint location, GLsizei count, const GLint64 *value); + return ((PFN_glUniform3i64vARB)__blue_glCore_glUniform3i64vARB)(location, count, value); +} + +extern void* __blue_glCore_glUniform4i64vARB; +void APIENTRY bluegl_glUniform4i64vARB (GLint location, GLsizei count, const GLint64 *value) { + typedef void (APIENTRYP PFN_glUniform4i64vARB) (GLint location, GLsizei count, const GLint64 *value); + return ((PFN_glUniform4i64vARB)__blue_glCore_glUniform4i64vARB)(location, count, value); +} + +extern void* __blue_glCore_glUniform1ui64ARB; +void APIENTRY bluegl_glUniform1ui64ARB (GLint location, GLuint64 x) { + typedef void (APIENTRYP PFN_glUniform1ui64ARB) (GLint location, GLuint64 x); + return ((PFN_glUniform1ui64ARB)__blue_glCore_glUniform1ui64ARB)(location, x); +} + +extern void* __blue_glCore_glUniform2ui64ARB; +void APIENTRY bluegl_glUniform2ui64ARB (GLint location, GLuint64 x, GLuint64 y) { + typedef void (APIENTRYP PFN_glUniform2ui64ARB) (GLint location, GLuint64 x, GLuint64 y); + return ((PFN_glUniform2ui64ARB)__blue_glCore_glUniform2ui64ARB)(location, x, y); +} + +extern void* __blue_glCore_glUniform3ui64ARB; +void APIENTRY bluegl_glUniform3ui64ARB (GLint location, GLuint64 x, GLuint64 y, GLuint64 z) { + typedef void (APIENTRYP PFN_glUniform3ui64ARB) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); + return ((PFN_glUniform3ui64ARB)__blue_glCore_glUniform3ui64ARB)(location, x, y, z); +} + +extern void* __blue_glCore_glUniform4ui64ARB; +void APIENTRY bluegl_glUniform4ui64ARB (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w) { + typedef void (APIENTRYP PFN_glUniform4ui64ARB) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); + return ((PFN_glUniform4ui64ARB)__blue_glCore_glUniform4ui64ARB)(location, x, y, z, w); +} + +extern void* __blue_glCore_glUniform1ui64vARB; +void APIENTRY bluegl_glUniform1ui64vARB (GLint location, GLsizei count, const GLuint64 *value) { + typedef void (APIENTRYP PFN_glUniform1ui64vARB) (GLint location, GLsizei count, const GLuint64 *value); + return ((PFN_glUniform1ui64vARB)__blue_glCore_glUniform1ui64vARB)(location, count, value); +} + +extern void* __blue_glCore_glUniform2ui64vARB; +void APIENTRY bluegl_glUniform2ui64vARB (GLint location, GLsizei count, const GLuint64 *value) { + typedef void (APIENTRYP PFN_glUniform2ui64vARB) (GLint location, GLsizei count, const GLuint64 *value); + return ((PFN_glUniform2ui64vARB)__blue_glCore_glUniform2ui64vARB)(location, count, value); +} + +extern void* __blue_glCore_glUniform3ui64vARB; +void APIENTRY bluegl_glUniform3ui64vARB (GLint location, GLsizei count, const GLuint64 *value) { + typedef void (APIENTRYP PFN_glUniform3ui64vARB) (GLint location, GLsizei count, const GLuint64 *value); + return ((PFN_glUniform3ui64vARB)__blue_glCore_glUniform3ui64vARB)(location, count, value); +} + +extern void* __blue_glCore_glUniform4ui64vARB; +void APIENTRY bluegl_glUniform4ui64vARB (GLint location, GLsizei count, const GLuint64 *value) { + typedef void (APIENTRYP PFN_glUniform4ui64vARB) (GLint location, GLsizei count, const GLuint64 *value); + return ((PFN_glUniform4ui64vARB)__blue_glCore_glUniform4ui64vARB)(location, count, value); +} + +extern void* __blue_glCore_glGetUniformi64vARB; +void APIENTRY bluegl_glGetUniformi64vARB (GLuint program, GLint location, GLint64 *params) { + typedef void (APIENTRYP PFN_glGetUniformi64vARB) (GLuint program, GLint location, GLint64 *params); + return ((PFN_glGetUniformi64vARB)__blue_glCore_glGetUniformi64vARB)(program, location, params); +} + +extern void* __blue_glCore_glGetUniformui64vARB; +void APIENTRY bluegl_glGetUniformui64vARB (GLuint program, GLint location, GLuint64 *params) { + typedef void (APIENTRYP PFN_glGetUniformui64vARB) (GLuint program, GLint location, GLuint64 *params); + return ((PFN_glGetUniformui64vARB)__blue_glCore_glGetUniformui64vARB)(program, location, params); +} + +extern void* __blue_glCore_glGetnUniformi64vARB; +void APIENTRY bluegl_glGetnUniformi64vARB (GLuint program, GLint location, GLsizei bufSize, GLint64 *params) { + typedef void (APIENTRYP PFN_glGetnUniformi64vARB) (GLuint program, GLint location, GLsizei bufSize, GLint64 *params); + return ((PFN_glGetnUniformi64vARB)__blue_glCore_glGetnUniformi64vARB)(program, location, bufSize, params); +} + +extern void* __blue_glCore_glGetnUniformui64vARB; +void APIENTRY bluegl_glGetnUniformui64vARB (GLuint program, GLint location, GLsizei bufSize, GLuint64 *params) { + typedef void (APIENTRYP PFN_glGetnUniformui64vARB) (GLuint program, GLint location, GLsizei bufSize, GLuint64 *params); + return ((PFN_glGetnUniformui64vARB)__blue_glCore_glGetnUniformui64vARB)(program, location, bufSize, params); +} + +extern void* __blue_glCore_glProgramUniform1i64ARB; +void APIENTRY bluegl_glProgramUniform1i64ARB (GLuint program, GLint location, GLint64 x) { + typedef void (APIENTRYP PFN_glProgramUniform1i64ARB) (GLuint program, GLint location, GLint64 x); + return ((PFN_glProgramUniform1i64ARB)__blue_glCore_glProgramUniform1i64ARB)(program, location, x); +} + +extern void* __blue_glCore_glProgramUniform2i64ARB; +void APIENTRY bluegl_glProgramUniform2i64ARB (GLuint program, GLint location, GLint64 x, GLint64 y) { + typedef void (APIENTRYP PFN_glProgramUniform2i64ARB) (GLuint program, GLint location, GLint64 x, GLint64 y); + return ((PFN_glProgramUniform2i64ARB)__blue_glCore_glProgramUniform2i64ARB)(program, location, x, y); +} + +extern void* __blue_glCore_glProgramUniform3i64ARB; +void APIENTRY bluegl_glProgramUniform3i64ARB (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z) { + typedef void (APIENTRYP PFN_glProgramUniform3i64ARB) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); + return ((PFN_glProgramUniform3i64ARB)__blue_glCore_glProgramUniform3i64ARB)(program, location, x, y, z); +} + +extern void* __blue_glCore_glProgramUniform4i64ARB; +void APIENTRY bluegl_glProgramUniform4i64ARB (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w) { + typedef void (APIENTRYP PFN_glProgramUniform4i64ARB) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); + return ((PFN_glProgramUniform4i64ARB)__blue_glCore_glProgramUniform4i64ARB)(program, location, x, y, z, w); +} + +extern void* __blue_glCore_glProgramUniform1i64vARB; +void APIENTRY bluegl_glProgramUniform1i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value) { + typedef void (APIENTRYP PFN_glProgramUniform1i64vARB) (GLuint program, GLint location, GLsizei count, const GLint64 *value); + return ((PFN_glProgramUniform1i64vARB)__blue_glCore_glProgramUniform1i64vARB)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform2i64vARB; +void APIENTRY bluegl_glProgramUniform2i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value) { + typedef void (APIENTRYP PFN_glProgramUniform2i64vARB) (GLuint program, GLint location, GLsizei count, const GLint64 *value); + return ((PFN_glProgramUniform2i64vARB)__blue_glCore_glProgramUniform2i64vARB)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform3i64vARB; +void APIENTRY bluegl_glProgramUniform3i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value) { + typedef void (APIENTRYP PFN_glProgramUniform3i64vARB) (GLuint program, GLint location, GLsizei count, const GLint64 *value); + return ((PFN_glProgramUniform3i64vARB)__blue_glCore_glProgramUniform3i64vARB)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform4i64vARB; +void APIENTRY bluegl_glProgramUniform4i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value) { + typedef void (APIENTRYP PFN_glProgramUniform4i64vARB) (GLuint program, GLint location, GLsizei count, const GLint64 *value); + return ((PFN_glProgramUniform4i64vARB)__blue_glCore_glProgramUniform4i64vARB)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform1ui64ARB; +void APIENTRY bluegl_glProgramUniform1ui64ARB (GLuint program, GLint location, GLuint64 x) { + typedef void (APIENTRYP PFN_glProgramUniform1ui64ARB) (GLuint program, GLint location, GLuint64 x); + return ((PFN_glProgramUniform1ui64ARB)__blue_glCore_glProgramUniform1ui64ARB)(program, location, x); +} + +extern void* __blue_glCore_glProgramUniform2ui64ARB; +void APIENTRY bluegl_glProgramUniform2ui64ARB (GLuint program, GLint location, GLuint64 x, GLuint64 y) { + typedef void (APIENTRYP PFN_glProgramUniform2ui64ARB) (GLuint program, GLint location, GLuint64 x, GLuint64 y); + return ((PFN_glProgramUniform2ui64ARB)__blue_glCore_glProgramUniform2ui64ARB)(program, location, x, y); +} + +extern void* __blue_glCore_glProgramUniform3ui64ARB; +void APIENTRY bluegl_glProgramUniform3ui64ARB (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z) { + typedef void (APIENTRYP PFN_glProgramUniform3ui64ARB) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); + return ((PFN_glProgramUniform3ui64ARB)__blue_glCore_glProgramUniform3ui64ARB)(program, location, x, y, z); +} + +extern void* __blue_glCore_glProgramUniform4ui64ARB; +void APIENTRY bluegl_glProgramUniform4ui64ARB (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w) { + typedef void (APIENTRYP PFN_glProgramUniform4ui64ARB) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); + return ((PFN_glProgramUniform4ui64ARB)__blue_glCore_glProgramUniform4ui64ARB)(program, location, x, y, z, w); +} + +extern void* __blue_glCore_glProgramUniform1ui64vARB; +void APIENTRY bluegl_glProgramUniform1ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value) { + typedef void (APIENTRYP PFN_glProgramUniform1ui64vARB) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); + return ((PFN_glProgramUniform1ui64vARB)__blue_glCore_glProgramUniform1ui64vARB)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform2ui64vARB; +void APIENTRY bluegl_glProgramUniform2ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value) { + typedef void (APIENTRYP PFN_glProgramUniform2ui64vARB) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); + return ((PFN_glProgramUniform2ui64vARB)__blue_glCore_glProgramUniform2ui64vARB)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform3ui64vARB; +void APIENTRY bluegl_glProgramUniform3ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value) { + typedef void (APIENTRYP PFN_glProgramUniform3ui64vARB) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); + return ((PFN_glProgramUniform3ui64vARB)__blue_glCore_glProgramUniform3ui64vARB)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform4ui64vARB; +void APIENTRY bluegl_glProgramUniform4ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value) { + typedef void (APIENTRYP PFN_glProgramUniform4ui64vARB) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); + return ((PFN_glProgramUniform4ui64vARB)__blue_glCore_glProgramUniform4ui64vARB)(program, location, count, value); +} + +extern void* __blue_glCore_glColorTable; +void APIENTRY bluegl_glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table) { + typedef void (APIENTRYP PFN_glColorTable) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); + return ((PFN_glColorTable)__blue_glCore_glColorTable)(target, internalformat, width, format, type, table); +} + +extern void* __blue_glCore_glColorTableParameterfv; +void APIENTRY bluegl_glColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glColorTableParameterfv) (GLenum target, GLenum pname, const GLfloat *params); + return ((PFN_glColorTableParameterfv)__blue_glCore_glColorTableParameterfv)(target, pname, params); +} + +extern void* __blue_glCore_glColorTableParameteriv; +void APIENTRY bluegl_glColorTableParameteriv (GLenum target, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glColorTableParameteriv) (GLenum target, GLenum pname, const GLint *params); + return ((PFN_glColorTableParameteriv)__blue_glCore_glColorTableParameteriv)(target, pname, params); +} + +extern void* __blue_glCore_glCopyColorTable; +void APIENTRY bluegl_glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) { + typedef void (APIENTRYP PFN_glCopyColorTable) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); + return ((PFN_glCopyColorTable)__blue_glCore_glCopyColorTable)(target, internalformat, x, y, width); +} + +extern void* __blue_glCore_glGetColorTable; +void APIENTRY bluegl_glGetColorTable (GLenum target, GLenum format, GLenum type, void *table) { + typedef void (APIENTRYP PFN_glGetColorTable) (GLenum target, GLenum format, GLenum type, void *table); + return ((PFN_glGetColorTable)__blue_glCore_glGetColorTable)(target, format, type, table); +} + +extern void* __blue_glCore_glGetColorTableParameterfv; +void APIENTRY bluegl_glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetColorTableParameterfv) (GLenum target, GLenum pname, GLfloat *params); + return ((PFN_glGetColorTableParameterfv)__blue_glCore_glGetColorTableParameterfv)(target, pname, params); +} + +extern void* __blue_glCore_glGetColorTableParameteriv; +void APIENTRY bluegl_glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetColorTableParameteriv) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetColorTableParameteriv)__blue_glCore_glGetColorTableParameteriv)(target, pname, params); +} + +extern void* __blue_glCore_glColorSubTable; +void APIENTRY bluegl_glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data) { + typedef void (APIENTRYP PFN_glColorSubTable) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); + return ((PFN_glColorSubTable)__blue_glCore_glColorSubTable)(target, start, count, format, type, data); +} + +extern void* __blue_glCore_glCopyColorSubTable; +void APIENTRY bluegl_glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width) { + typedef void (APIENTRYP PFN_glCopyColorSubTable) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); + return ((PFN_glCopyColorSubTable)__blue_glCore_glCopyColorSubTable)(target, start, x, y, width); +} + +extern void* __blue_glCore_glConvolutionFilter1D; +void APIENTRY bluegl_glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image) { + typedef void (APIENTRYP PFN_glConvolutionFilter1D) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); + return ((PFN_glConvolutionFilter1D)__blue_glCore_glConvolutionFilter1D)(target, internalformat, width, format, type, image); +} + +extern void* __blue_glCore_glConvolutionFilter2D; +void APIENTRY bluegl_glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image) { + typedef void (APIENTRYP PFN_glConvolutionFilter2D) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); + return ((PFN_glConvolutionFilter2D)__blue_glCore_glConvolutionFilter2D)(target, internalformat, width, height, format, type, image); +} + +extern void* __blue_glCore_glConvolutionParameterf; +void APIENTRY bluegl_glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params) { + typedef void (APIENTRYP PFN_glConvolutionParameterf) (GLenum target, GLenum pname, GLfloat params); + return ((PFN_glConvolutionParameterf)__blue_glCore_glConvolutionParameterf)(target, pname, params); +} + +extern void* __blue_glCore_glConvolutionParameterfv; +void APIENTRY bluegl_glConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glConvolutionParameterfv) (GLenum target, GLenum pname, const GLfloat *params); + return ((PFN_glConvolutionParameterfv)__blue_glCore_glConvolutionParameterfv)(target, pname, params); +} + +extern void* __blue_glCore_glConvolutionParameteri; +void APIENTRY bluegl_glConvolutionParameteri (GLenum target, GLenum pname, GLint params) { + typedef void (APIENTRYP PFN_glConvolutionParameteri) (GLenum target, GLenum pname, GLint params); + return ((PFN_glConvolutionParameteri)__blue_glCore_glConvolutionParameteri)(target, pname, params); +} + +extern void* __blue_glCore_glConvolutionParameteriv; +void APIENTRY bluegl_glConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glConvolutionParameteriv) (GLenum target, GLenum pname, const GLint *params); + return ((PFN_glConvolutionParameteriv)__blue_glCore_glConvolutionParameteriv)(target, pname, params); +} + +extern void* __blue_glCore_glCopyConvolutionFilter1D; +void APIENTRY bluegl_glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) { + typedef void (APIENTRYP PFN_glCopyConvolutionFilter1D) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); + return ((PFN_glCopyConvolutionFilter1D)__blue_glCore_glCopyConvolutionFilter1D)(target, internalformat, x, y, width); +} + +extern void* __blue_glCore_glCopyConvolutionFilter2D; +void APIENTRY bluegl_glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glCopyConvolutionFilter2D) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); + return ((PFN_glCopyConvolutionFilter2D)__blue_glCore_glCopyConvolutionFilter2D)(target, internalformat, x, y, width, height); +} + +extern void* __blue_glCore_glGetConvolutionFilter; +void APIENTRY bluegl_glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, void *image) { + typedef void (APIENTRYP PFN_glGetConvolutionFilter) (GLenum target, GLenum format, GLenum type, void *image); + return ((PFN_glGetConvolutionFilter)__blue_glCore_glGetConvolutionFilter)(target, format, type, image); +} + +extern void* __blue_glCore_glGetConvolutionParameterfv; +void APIENTRY bluegl_glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetConvolutionParameterfv) (GLenum target, GLenum pname, GLfloat *params); + return ((PFN_glGetConvolutionParameterfv)__blue_glCore_glGetConvolutionParameterfv)(target, pname, params); +} + +extern void* __blue_glCore_glGetConvolutionParameteriv; +void APIENTRY bluegl_glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetConvolutionParameteriv) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetConvolutionParameteriv)__blue_glCore_glGetConvolutionParameteriv)(target, pname, params); +} + +extern void* __blue_glCore_glGetSeparableFilter; +void APIENTRY bluegl_glGetSeparableFilter (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span) { + typedef void (APIENTRYP PFN_glGetSeparableFilter) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); + return ((PFN_glGetSeparableFilter)__blue_glCore_glGetSeparableFilter)(target, format, type, row, column, span); +} + +extern void* __blue_glCore_glSeparableFilter2D; +void APIENTRY bluegl_glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column) { + typedef void (APIENTRYP PFN_glSeparableFilter2D) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); + return ((PFN_glSeparableFilter2D)__blue_glCore_glSeparableFilter2D)(target, internalformat, width, height, format, type, row, column); +} + +extern void* __blue_glCore_glGetHistogram; +void APIENTRY bluegl_glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values) { + typedef void (APIENTRYP PFN_glGetHistogram) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); + return ((PFN_glGetHistogram)__blue_glCore_glGetHistogram)(target, reset, format, type, values); +} + +extern void* __blue_glCore_glGetHistogramParameterfv; +void APIENTRY bluegl_glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetHistogramParameterfv) (GLenum target, GLenum pname, GLfloat *params); + return ((PFN_glGetHistogramParameterfv)__blue_glCore_glGetHistogramParameterfv)(target, pname, params); +} + +extern void* __blue_glCore_glGetHistogramParameteriv; +void APIENTRY bluegl_glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetHistogramParameteriv) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetHistogramParameteriv)__blue_glCore_glGetHistogramParameteriv)(target, pname, params); +} + +extern void* __blue_glCore_glGetMinmax; +void APIENTRY bluegl_glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values) { + typedef void (APIENTRYP PFN_glGetMinmax) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); + return ((PFN_glGetMinmax)__blue_glCore_glGetMinmax)(target, reset, format, type, values); +} + +extern void* __blue_glCore_glGetMinmaxParameterfv; +void APIENTRY bluegl_glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetMinmaxParameterfv) (GLenum target, GLenum pname, GLfloat *params); + return ((PFN_glGetMinmaxParameterfv)__blue_glCore_glGetMinmaxParameterfv)(target, pname, params); +} + +extern void* __blue_glCore_glGetMinmaxParameteriv; +void APIENTRY bluegl_glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetMinmaxParameteriv) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetMinmaxParameteriv)__blue_glCore_glGetMinmaxParameteriv)(target, pname, params); +} + +extern void* __blue_glCore_glHistogram; +void APIENTRY bluegl_glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink) { + typedef void (APIENTRYP PFN_glHistogram) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); + return ((PFN_glHistogram)__blue_glCore_glHistogram)(target, width, internalformat, sink); +} + +extern void* __blue_glCore_glMinmax; +void APIENTRY bluegl_glMinmax (GLenum target, GLenum internalformat, GLboolean sink) { + typedef void (APIENTRYP PFN_glMinmax) (GLenum target, GLenum internalformat, GLboolean sink); + return ((PFN_glMinmax)__blue_glCore_glMinmax)(target, internalformat, sink); +} + +extern void* __blue_glCore_glResetHistogram; +void APIENTRY bluegl_glResetHistogram (GLenum target) { + typedef void (APIENTRYP PFN_glResetHistogram) (GLenum target); + return ((PFN_glResetHistogram)__blue_glCore_glResetHistogram)(target); +} + +extern void* __blue_glCore_glResetMinmax; +void APIENTRY bluegl_glResetMinmax (GLenum target) { + typedef void (APIENTRYP PFN_glResetMinmax) (GLenum target); + return ((PFN_glResetMinmax)__blue_glCore_glResetMinmax)(target); +} + +extern void* __blue_glCore_glVertexAttribDivisorARB; +void APIENTRY bluegl_glVertexAttribDivisorARB (GLuint index, GLuint divisor) { + typedef void (APIENTRYP PFN_glVertexAttribDivisorARB) (GLuint index, GLuint divisor); + return ((PFN_glVertexAttribDivisorARB)__blue_glCore_glVertexAttribDivisorARB)(index, divisor); +} + +extern void* __blue_glCore_glCurrentPaletteMatrixARB; +void APIENTRY bluegl_glCurrentPaletteMatrixARB (GLint index) { + typedef void (APIENTRYP PFN_glCurrentPaletteMatrixARB) (GLint index); + return ((PFN_glCurrentPaletteMatrixARB)__blue_glCore_glCurrentPaletteMatrixARB)(index); +} + +extern void* __blue_glCore_glMatrixIndexubvARB; +void APIENTRY bluegl_glMatrixIndexubvARB (GLint size, const GLubyte *indices) { + typedef void (APIENTRYP PFN_glMatrixIndexubvARB) (GLint size, const GLubyte *indices); + return ((PFN_glMatrixIndexubvARB)__blue_glCore_glMatrixIndexubvARB)(size, indices); +} + +extern void* __blue_glCore_glMatrixIndexusvARB; +void APIENTRY bluegl_glMatrixIndexusvARB (GLint size, const GLushort *indices) { + typedef void (APIENTRYP PFN_glMatrixIndexusvARB) (GLint size, const GLushort *indices); + return ((PFN_glMatrixIndexusvARB)__blue_glCore_glMatrixIndexusvARB)(size, indices); +} + +extern void* __blue_glCore_glMatrixIndexuivARB; +void APIENTRY bluegl_glMatrixIndexuivARB (GLint size, const GLuint *indices) { + typedef void (APIENTRYP PFN_glMatrixIndexuivARB) (GLint size, const GLuint *indices); + return ((PFN_glMatrixIndexuivARB)__blue_glCore_glMatrixIndexuivARB)(size, indices); +} + +extern void* __blue_glCore_glMatrixIndexPointerARB; +void APIENTRY bluegl_glMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer) { + typedef void (APIENTRYP PFN_glMatrixIndexPointerARB) (GLint size, GLenum type, GLsizei stride, const void *pointer); + return ((PFN_glMatrixIndexPointerARB)__blue_glCore_glMatrixIndexPointerARB)(size, type, stride, pointer); +} + +extern void* __blue_glCore_glSampleCoverageARB; +void APIENTRY bluegl_glSampleCoverageARB (GLfloat value, GLboolean invert) { + typedef void (APIENTRYP PFN_glSampleCoverageARB) (GLfloat value, GLboolean invert); + return ((PFN_glSampleCoverageARB)__blue_glCore_glSampleCoverageARB)(value, invert); +} + +extern void* __blue_glCore_glActiveTextureARB; +void APIENTRY bluegl_glActiveTextureARB (GLenum texture) { + typedef void (APIENTRYP PFN_glActiveTextureARB) (GLenum texture); + return ((PFN_glActiveTextureARB)__blue_glCore_glActiveTextureARB)(texture); +} + +extern void* __blue_glCore_glClientActiveTextureARB; +void APIENTRY bluegl_glClientActiveTextureARB (GLenum texture) { + typedef void (APIENTRYP PFN_glClientActiveTextureARB) (GLenum texture); + return ((PFN_glClientActiveTextureARB)__blue_glCore_glClientActiveTextureARB)(texture); +} + +extern void* __blue_glCore_glMultiTexCoord1dARB; +void APIENTRY bluegl_glMultiTexCoord1dARB (GLenum target, GLdouble s) { + typedef void (APIENTRYP PFN_glMultiTexCoord1dARB) (GLenum target, GLdouble s); + return ((PFN_glMultiTexCoord1dARB)__blue_glCore_glMultiTexCoord1dARB)(target, s); +} + +extern void* __blue_glCore_glMultiTexCoord1dvARB; +void APIENTRY bluegl_glMultiTexCoord1dvARB (GLenum target, const GLdouble *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord1dvARB) (GLenum target, const GLdouble *v); + return ((PFN_glMultiTexCoord1dvARB)__blue_glCore_glMultiTexCoord1dvARB)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord1fARB; +void APIENTRY bluegl_glMultiTexCoord1fARB (GLenum target, GLfloat s) { + typedef void (APIENTRYP PFN_glMultiTexCoord1fARB) (GLenum target, GLfloat s); + return ((PFN_glMultiTexCoord1fARB)__blue_glCore_glMultiTexCoord1fARB)(target, s); +} + +extern void* __blue_glCore_glMultiTexCoord1fvARB; +void APIENTRY bluegl_glMultiTexCoord1fvARB (GLenum target, const GLfloat *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord1fvARB) (GLenum target, const GLfloat *v); + return ((PFN_glMultiTexCoord1fvARB)__blue_glCore_glMultiTexCoord1fvARB)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord1iARB; +void APIENTRY bluegl_glMultiTexCoord1iARB (GLenum target, GLint s) { + typedef void (APIENTRYP PFN_glMultiTexCoord1iARB) (GLenum target, GLint s); + return ((PFN_glMultiTexCoord1iARB)__blue_glCore_glMultiTexCoord1iARB)(target, s); +} + +extern void* __blue_glCore_glMultiTexCoord1ivARB; +void APIENTRY bluegl_glMultiTexCoord1ivARB (GLenum target, const GLint *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord1ivARB) (GLenum target, const GLint *v); + return ((PFN_glMultiTexCoord1ivARB)__blue_glCore_glMultiTexCoord1ivARB)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord1sARB; +void APIENTRY bluegl_glMultiTexCoord1sARB (GLenum target, GLshort s) { + typedef void (APIENTRYP PFN_glMultiTexCoord1sARB) (GLenum target, GLshort s); + return ((PFN_glMultiTexCoord1sARB)__blue_glCore_glMultiTexCoord1sARB)(target, s); +} + +extern void* __blue_glCore_glMultiTexCoord1svARB; +void APIENTRY bluegl_glMultiTexCoord1svARB (GLenum target, const GLshort *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord1svARB) (GLenum target, const GLshort *v); + return ((PFN_glMultiTexCoord1svARB)__blue_glCore_glMultiTexCoord1svARB)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord2dARB; +void APIENTRY bluegl_glMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t) { + typedef void (APIENTRYP PFN_glMultiTexCoord2dARB) (GLenum target, GLdouble s, GLdouble t); + return ((PFN_glMultiTexCoord2dARB)__blue_glCore_glMultiTexCoord2dARB)(target, s, t); +} + +extern void* __blue_glCore_glMultiTexCoord2dvARB; +void APIENTRY bluegl_glMultiTexCoord2dvARB (GLenum target, const GLdouble *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord2dvARB) (GLenum target, const GLdouble *v); + return ((PFN_glMultiTexCoord2dvARB)__blue_glCore_glMultiTexCoord2dvARB)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord2fARB; +void APIENTRY bluegl_glMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t) { + typedef void (APIENTRYP PFN_glMultiTexCoord2fARB) (GLenum target, GLfloat s, GLfloat t); + return ((PFN_glMultiTexCoord2fARB)__blue_glCore_glMultiTexCoord2fARB)(target, s, t); +} + +extern void* __blue_glCore_glMultiTexCoord2fvARB; +void APIENTRY bluegl_glMultiTexCoord2fvARB (GLenum target, const GLfloat *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord2fvARB) (GLenum target, const GLfloat *v); + return ((PFN_glMultiTexCoord2fvARB)__blue_glCore_glMultiTexCoord2fvARB)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord2iARB; +void APIENTRY bluegl_glMultiTexCoord2iARB (GLenum target, GLint s, GLint t) { + typedef void (APIENTRYP PFN_glMultiTexCoord2iARB) (GLenum target, GLint s, GLint t); + return ((PFN_glMultiTexCoord2iARB)__blue_glCore_glMultiTexCoord2iARB)(target, s, t); +} + +extern void* __blue_glCore_glMultiTexCoord2ivARB; +void APIENTRY bluegl_glMultiTexCoord2ivARB (GLenum target, const GLint *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord2ivARB) (GLenum target, const GLint *v); + return ((PFN_glMultiTexCoord2ivARB)__blue_glCore_glMultiTexCoord2ivARB)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord2sARB; +void APIENTRY bluegl_glMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t) { + typedef void (APIENTRYP PFN_glMultiTexCoord2sARB) (GLenum target, GLshort s, GLshort t); + return ((PFN_glMultiTexCoord2sARB)__blue_glCore_glMultiTexCoord2sARB)(target, s, t); +} + +extern void* __blue_glCore_glMultiTexCoord2svARB; +void APIENTRY bluegl_glMultiTexCoord2svARB (GLenum target, const GLshort *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord2svARB) (GLenum target, const GLshort *v); + return ((PFN_glMultiTexCoord2svARB)__blue_glCore_glMultiTexCoord2svARB)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord3dARB; +void APIENTRY bluegl_glMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r) { + typedef void (APIENTRYP PFN_glMultiTexCoord3dARB) (GLenum target, GLdouble s, GLdouble t, GLdouble r); + return ((PFN_glMultiTexCoord3dARB)__blue_glCore_glMultiTexCoord3dARB)(target, s, t, r); +} + +extern void* __blue_glCore_glMultiTexCoord3dvARB; +void APIENTRY bluegl_glMultiTexCoord3dvARB (GLenum target, const GLdouble *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord3dvARB) (GLenum target, const GLdouble *v); + return ((PFN_glMultiTexCoord3dvARB)__blue_glCore_glMultiTexCoord3dvARB)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord3fARB; +void APIENTRY bluegl_glMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r) { + typedef void (APIENTRYP PFN_glMultiTexCoord3fARB) (GLenum target, GLfloat s, GLfloat t, GLfloat r); + return ((PFN_glMultiTexCoord3fARB)__blue_glCore_glMultiTexCoord3fARB)(target, s, t, r); +} + +extern void* __blue_glCore_glMultiTexCoord3fvARB; +void APIENTRY bluegl_glMultiTexCoord3fvARB (GLenum target, const GLfloat *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord3fvARB) (GLenum target, const GLfloat *v); + return ((PFN_glMultiTexCoord3fvARB)__blue_glCore_glMultiTexCoord3fvARB)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord3iARB; +void APIENTRY bluegl_glMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r) { + typedef void (APIENTRYP PFN_glMultiTexCoord3iARB) (GLenum target, GLint s, GLint t, GLint r); + return ((PFN_glMultiTexCoord3iARB)__blue_glCore_glMultiTexCoord3iARB)(target, s, t, r); +} + +extern void* __blue_glCore_glMultiTexCoord3ivARB; +void APIENTRY bluegl_glMultiTexCoord3ivARB (GLenum target, const GLint *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord3ivARB) (GLenum target, const GLint *v); + return ((PFN_glMultiTexCoord3ivARB)__blue_glCore_glMultiTexCoord3ivARB)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord3sARB; +void APIENTRY bluegl_glMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r) { + typedef void (APIENTRYP PFN_glMultiTexCoord3sARB) (GLenum target, GLshort s, GLshort t, GLshort r); + return ((PFN_glMultiTexCoord3sARB)__blue_glCore_glMultiTexCoord3sARB)(target, s, t, r); +} + +extern void* __blue_glCore_glMultiTexCoord3svARB; +void APIENTRY bluegl_glMultiTexCoord3svARB (GLenum target, const GLshort *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord3svARB) (GLenum target, const GLshort *v); + return ((PFN_glMultiTexCoord3svARB)__blue_glCore_glMultiTexCoord3svARB)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord4dARB; +void APIENTRY bluegl_glMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q) { + typedef void (APIENTRYP PFN_glMultiTexCoord4dARB) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); + return ((PFN_glMultiTexCoord4dARB)__blue_glCore_glMultiTexCoord4dARB)(target, s, t, r, q); +} + +extern void* __blue_glCore_glMultiTexCoord4dvARB; +void APIENTRY bluegl_glMultiTexCoord4dvARB (GLenum target, const GLdouble *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord4dvARB) (GLenum target, const GLdouble *v); + return ((PFN_glMultiTexCoord4dvARB)__blue_glCore_glMultiTexCoord4dvARB)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord4fARB; +void APIENTRY bluegl_glMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) { + typedef void (APIENTRYP PFN_glMultiTexCoord4fARB) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); + return ((PFN_glMultiTexCoord4fARB)__blue_glCore_glMultiTexCoord4fARB)(target, s, t, r, q); +} + +extern void* __blue_glCore_glMultiTexCoord4fvARB; +void APIENTRY bluegl_glMultiTexCoord4fvARB (GLenum target, const GLfloat *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord4fvARB) (GLenum target, const GLfloat *v); + return ((PFN_glMultiTexCoord4fvARB)__blue_glCore_glMultiTexCoord4fvARB)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord4iARB; +void APIENTRY bluegl_glMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q) { + typedef void (APIENTRYP PFN_glMultiTexCoord4iARB) (GLenum target, GLint s, GLint t, GLint r, GLint q); + return ((PFN_glMultiTexCoord4iARB)__blue_glCore_glMultiTexCoord4iARB)(target, s, t, r, q); +} + +extern void* __blue_glCore_glMultiTexCoord4ivARB; +void APIENTRY bluegl_glMultiTexCoord4ivARB (GLenum target, const GLint *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord4ivARB) (GLenum target, const GLint *v); + return ((PFN_glMultiTexCoord4ivARB)__blue_glCore_glMultiTexCoord4ivARB)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord4sARB; +void APIENTRY bluegl_glMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q) { + typedef void (APIENTRYP PFN_glMultiTexCoord4sARB) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); + return ((PFN_glMultiTexCoord4sARB)__blue_glCore_glMultiTexCoord4sARB)(target, s, t, r, q); +} + +extern void* __blue_glCore_glMultiTexCoord4svARB; +void APIENTRY bluegl_glMultiTexCoord4svARB (GLenum target, const GLshort *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord4svARB) (GLenum target, const GLshort *v); + return ((PFN_glMultiTexCoord4svARB)__blue_glCore_glMultiTexCoord4svARB)(target, v); +} + +extern void* __blue_glCore_glGenQueriesARB; +void APIENTRY bluegl_glGenQueriesARB (GLsizei n, GLuint *ids) { + typedef void (APIENTRYP PFN_glGenQueriesARB) (GLsizei n, GLuint *ids); + return ((PFN_glGenQueriesARB)__blue_glCore_glGenQueriesARB)(n, ids); +} + +extern void* __blue_glCore_glDeleteQueriesARB; +void APIENTRY bluegl_glDeleteQueriesARB (GLsizei n, const GLuint *ids) { + typedef void (APIENTRYP PFN_glDeleteQueriesARB) (GLsizei n, const GLuint *ids); + return ((PFN_glDeleteQueriesARB)__blue_glCore_glDeleteQueriesARB)(n, ids); +} + +extern void* __blue_glCore_glIsQueryARB; +GLboolean APIENTRY bluegl_glIsQueryARB (GLuint id) { + typedef GLboolean (APIENTRYP PFN_glIsQueryARB) (GLuint id); + return ((PFN_glIsQueryARB)__blue_glCore_glIsQueryARB)(id); +} + +extern void* __blue_glCore_glBeginQueryARB; +void APIENTRY bluegl_glBeginQueryARB (GLenum target, GLuint id) { + typedef void (APIENTRYP PFN_glBeginQueryARB) (GLenum target, GLuint id); + return ((PFN_glBeginQueryARB)__blue_glCore_glBeginQueryARB)(target, id); +} + +extern void* __blue_glCore_glEndQueryARB; +void APIENTRY bluegl_glEndQueryARB (GLenum target) { + typedef void (APIENTRYP PFN_glEndQueryARB) (GLenum target); + return ((PFN_glEndQueryARB)__blue_glCore_glEndQueryARB)(target); +} + +extern void* __blue_glCore_glGetQueryivARB; +void APIENTRY bluegl_glGetQueryivARB (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetQueryivARB) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetQueryivARB)__blue_glCore_glGetQueryivARB)(target, pname, params); +} + +extern void* __blue_glCore_glGetQueryObjectivARB; +void APIENTRY bluegl_glGetQueryObjectivARB (GLuint id, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetQueryObjectivARB) (GLuint id, GLenum pname, GLint *params); + return ((PFN_glGetQueryObjectivARB)__blue_glCore_glGetQueryObjectivARB)(id, pname, params); +} + +extern void* __blue_glCore_glGetQueryObjectuivARB; +void APIENTRY bluegl_glGetQueryObjectuivARB (GLuint id, GLenum pname, GLuint *params) { + typedef void (APIENTRYP PFN_glGetQueryObjectuivARB) (GLuint id, GLenum pname, GLuint *params); + return ((PFN_glGetQueryObjectuivARB)__blue_glCore_glGetQueryObjectuivARB)(id, pname, params); +} + +extern void* __blue_glCore_glMaxShaderCompilerThreadsARB; +void APIENTRY bluegl_glMaxShaderCompilerThreadsARB (GLuint count) { + typedef void (APIENTRYP PFN_glMaxShaderCompilerThreadsARB) (GLuint count); + return ((PFN_glMaxShaderCompilerThreadsARB)__blue_glCore_glMaxShaderCompilerThreadsARB)(count); +} + +extern void* __blue_glCore_glPointParameterfARB; +void APIENTRY bluegl_glPointParameterfARB (GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glPointParameterfARB) (GLenum pname, GLfloat param); + return ((PFN_glPointParameterfARB)__blue_glCore_glPointParameterfARB)(pname, param); +} + +extern void* __blue_glCore_glPointParameterfvARB; +void APIENTRY bluegl_glPointParameterfvARB (GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glPointParameterfvARB) (GLenum pname, const GLfloat *params); + return ((PFN_glPointParameterfvARB)__blue_glCore_glPointParameterfvARB)(pname, params); +} + +extern void* __blue_glCore_glGetnMapdvARB; +void APIENTRY bluegl_glGetnMapdvARB (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v) { + typedef void (APIENTRYP PFN_glGetnMapdvARB) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); + return ((PFN_glGetnMapdvARB)__blue_glCore_glGetnMapdvARB)(target, query, bufSize, v); +} + +extern void* __blue_glCore_glGetnMapfvARB; +void APIENTRY bluegl_glGetnMapfvARB (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v) { + typedef void (APIENTRYP PFN_glGetnMapfvARB) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); + return ((PFN_glGetnMapfvARB)__blue_glCore_glGetnMapfvARB)(target, query, bufSize, v); +} + +extern void* __blue_glCore_glGetnMapivARB; +void APIENTRY bluegl_glGetnMapivARB (GLenum target, GLenum query, GLsizei bufSize, GLint *v) { + typedef void (APIENTRYP PFN_glGetnMapivARB) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); + return ((PFN_glGetnMapivARB)__blue_glCore_glGetnMapivARB)(target, query, bufSize, v); +} + +extern void* __blue_glCore_glGetnPixelMapfvARB; +void APIENTRY bluegl_glGetnPixelMapfvARB (GLenum map, GLsizei bufSize, GLfloat *values) { + typedef void (APIENTRYP PFN_glGetnPixelMapfvARB) (GLenum map, GLsizei bufSize, GLfloat *values); + return ((PFN_glGetnPixelMapfvARB)__blue_glCore_glGetnPixelMapfvARB)(map, bufSize, values); +} + +extern void* __blue_glCore_glGetnPixelMapuivARB; +void APIENTRY bluegl_glGetnPixelMapuivARB (GLenum map, GLsizei bufSize, GLuint *values) { + typedef void (APIENTRYP PFN_glGetnPixelMapuivARB) (GLenum map, GLsizei bufSize, GLuint *values); + return ((PFN_glGetnPixelMapuivARB)__blue_glCore_glGetnPixelMapuivARB)(map, bufSize, values); +} + +extern void* __blue_glCore_glGetnPixelMapusvARB; +void APIENTRY bluegl_glGetnPixelMapusvARB (GLenum map, GLsizei bufSize, GLushort *values) { + typedef void (APIENTRYP PFN_glGetnPixelMapusvARB) (GLenum map, GLsizei bufSize, GLushort *values); + return ((PFN_glGetnPixelMapusvARB)__blue_glCore_glGetnPixelMapusvARB)(map, bufSize, values); +} + +extern void* __blue_glCore_glGetnPolygonStippleARB; +void APIENTRY bluegl_glGetnPolygonStippleARB (GLsizei bufSize, GLubyte *pattern) { + typedef void (APIENTRYP PFN_glGetnPolygonStippleARB) (GLsizei bufSize, GLubyte *pattern); + return ((PFN_glGetnPolygonStippleARB)__blue_glCore_glGetnPolygonStippleARB)(bufSize, pattern); +} + +extern void* __blue_glCore_glGetnColorTableARB; +void APIENTRY bluegl_glGetnColorTableARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table) { + typedef void (APIENTRYP PFN_glGetnColorTableARB) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); + return ((PFN_glGetnColorTableARB)__blue_glCore_glGetnColorTableARB)(target, format, type, bufSize, table); +} + +extern void* __blue_glCore_glGetnConvolutionFilterARB; +void APIENTRY bluegl_glGetnConvolutionFilterARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image) { + typedef void (APIENTRYP PFN_glGetnConvolutionFilterARB) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); + return ((PFN_glGetnConvolutionFilterARB)__blue_glCore_glGetnConvolutionFilterARB)(target, format, type, bufSize, image); +} + +extern void* __blue_glCore_glGetnSeparableFilterARB; +void APIENTRY bluegl_glGetnSeparableFilterARB (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span) { + typedef void (APIENTRYP PFN_glGetnSeparableFilterARB) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); + return ((PFN_glGetnSeparableFilterARB)__blue_glCore_glGetnSeparableFilterARB)(target, format, type, rowBufSize, row, columnBufSize, column, span); +} + +extern void* __blue_glCore_glGetnHistogramARB; +void APIENTRY bluegl_glGetnHistogramARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values) { + typedef void (APIENTRYP PFN_glGetnHistogramARB) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); + return ((PFN_glGetnHistogramARB)__blue_glCore_glGetnHistogramARB)(target, reset, format, type, bufSize, values); +} + +extern void* __blue_glCore_glGetnMinmaxARB; +void APIENTRY bluegl_glGetnMinmaxARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values) { + typedef void (APIENTRYP PFN_glGetnMinmaxARB) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); + return ((PFN_glGetnMinmaxARB)__blue_glCore_glGetnMinmaxARB)(target, reset, format, type, bufSize, values); +} + +extern void* __blue_glCore_glFramebufferSampleLocationsfvARB; +void APIENTRY bluegl_glFramebufferSampleLocationsfvARB (GLenum target, GLuint start, GLsizei count, const GLfloat *v) { + typedef void (APIENTRYP PFN_glFramebufferSampleLocationsfvARB) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); + return ((PFN_glFramebufferSampleLocationsfvARB)__blue_glCore_glFramebufferSampleLocationsfvARB)(target, start, count, v); +} + +extern void* __blue_glCore_glNamedFramebufferSampleLocationsfvARB; +void APIENTRY bluegl_glNamedFramebufferSampleLocationsfvARB (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v) { + typedef void (APIENTRYP PFN_glNamedFramebufferSampleLocationsfvARB) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); + return ((PFN_glNamedFramebufferSampleLocationsfvARB)__blue_glCore_glNamedFramebufferSampleLocationsfvARB)(framebuffer, start, count, v); +} + +extern void* __blue_glCore_glEvaluateDepthValuesARB; +void APIENTRY bluegl_glEvaluateDepthValuesARB (void) { + typedef void (APIENTRYP PFN_glEvaluateDepthValuesARB) (void); + return ((PFN_glEvaluateDepthValuesARB)__blue_glCore_glEvaluateDepthValuesARB)(); +} + +extern void* __blue_glCore_glDeleteObjectARB; +void APIENTRY bluegl_glDeleteObjectARB (GLhandleARB obj) { + typedef void (APIENTRYP PFN_glDeleteObjectARB) (GLhandleARB obj); + return ((PFN_glDeleteObjectARB)__blue_glCore_glDeleteObjectARB)(obj); +} + +extern void* __blue_glCore_glGetHandleARB; +GLhandleARB APIENTRY bluegl_glGetHandleARB (GLenum pname) { + typedef GLhandleARB (APIENTRYP PFN_glGetHandleARB) (GLenum pname); + return ((PFN_glGetHandleARB)__blue_glCore_glGetHandleARB)(pname); +} + +extern void* __blue_glCore_glDetachObjectARB; +void APIENTRY bluegl_glDetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj) { + typedef void (APIENTRYP PFN_glDetachObjectARB) (GLhandleARB containerObj, GLhandleARB attachedObj); + return ((PFN_glDetachObjectARB)__blue_glCore_glDetachObjectARB)(containerObj, attachedObj); +} + +extern void* __blue_glCore_glCreateShaderObjectARB; +GLhandleARB APIENTRY bluegl_glCreateShaderObjectARB (GLenum shaderType) { + typedef GLhandleARB (APIENTRYP PFN_glCreateShaderObjectARB) (GLenum shaderType); + return ((PFN_glCreateShaderObjectARB)__blue_glCore_glCreateShaderObjectARB)(shaderType); +} + +extern void* __blue_glCore_glShaderSourceARB; +void APIENTRY bluegl_glShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length) { + typedef void (APIENTRYP PFN_glShaderSourceARB) (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); + return ((PFN_glShaderSourceARB)__blue_glCore_glShaderSourceARB)(shaderObj, count, string, length); +} + +extern void* __blue_glCore_glCompileShaderARB; +void APIENTRY bluegl_glCompileShaderARB (GLhandleARB shaderObj) { + typedef void (APIENTRYP PFN_glCompileShaderARB) (GLhandleARB shaderObj); + return ((PFN_glCompileShaderARB)__blue_glCore_glCompileShaderARB)(shaderObj); +} + +extern void* __blue_glCore_glCreateProgramObjectARB; +GLhandleARB APIENTRY bluegl_glCreateProgramObjectARB (void) { + typedef GLhandleARB (APIENTRYP PFN_glCreateProgramObjectARB) (void); + return ((PFN_glCreateProgramObjectARB)__blue_glCore_glCreateProgramObjectARB)(); +} + +extern void* __blue_glCore_glAttachObjectARB; +void APIENTRY bluegl_glAttachObjectARB (GLhandleARB containerObj, GLhandleARB obj) { + typedef void (APIENTRYP PFN_glAttachObjectARB) (GLhandleARB containerObj, GLhandleARB obj); + return ((PFN_glAttachObjectARB)__blue_glCore_glAttachObjectARB)(containerObj, obj); +} + +extern void* __blue_glCore_glLinkProgramARB; +void APIENTRY bluegl_glLinkProgramARB (GLhandleARB programObj) { + typedef void (APIENTRYP PFN_glLinkProgramARB) (GLhandleARB programObj); + return ((PFN_glLinkProgramARB)__blue_glCore_glLinkProgramARB)(programObj); +} + +extern void* __blue_glCore_glUseProgramObjectARB; +void APIENTRY bluegl_glUseProgramObjectARB (GLhandleARB programObj) { + typedef void (APIENTRYP PFN_glUseProgramObjectARB) (GLhandleARB programObj); + return ((PFN_glUseProgramObjectARB)__blue_glCore_glUseProgramObjectARB)(programObj); +} + +extern void* __blue_glCore_glValidateProgramARB; +void APIENTRY bluegl_glValidateProgramARB (GLhandleARB programObj) { + typedef void (APIENTRYP PFN_glValidateProgramARB) (GLhandleARB programObj); + return ((PFN_glValidateProgramARB)__blue_glCore_glValidateProgramARB)(programObj); +} + +extern void* __blue_glCore_glUniform1fARB; +void APIENTRY bluegl_glUniform1fARB (GLint location, GLfloat v0) { + typedef void (APIENTRYP PFN_glUniform1fARB) (GLint location, GLfloat v0); + return ((PFN_glUniform1fARB)__blue_glCore_glUniform1fARB)(location, v0); +} + +extern void* __blue_glCore_glUniform2fARB; +void APIENTRY bluegl_glUniform2fARB (GLint location, GLfloat v0, GLfloat v1) { + typedef void (APIENTRYP PFN_glUniform2fARB) (GLint location, GLfloat v0, GLfloat v1); + return ((PFN_glUniform2fARB)__blue_glCore_glUniform2fARB)(location, v0, v1); +} + +extern void* __blue_glCore_glUniform3fARB; +void APIENTRY bluegl_glUniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2) { + typedef void (APIENTRYP PFN_glUniform3fARB) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); + return ((PFN_glUniform3fARB)__blue_glCore_glUniform3fARB)(location, v0, v1, v2); +} + +extern void* __blue_glCore_glUniform4fARB; +void APIENTRY bluegl_glUniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) { + typedef void (APIENTRYP PFN_glUniform4fARB) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); + return ((PFN_glUniform4fARB)__blue_glCore_glUniform4fARB)(location, v0, v1, v2, v3); +} + +extern void* __blue_glCore_glUniform1iARB; +void APIENTRY bluegl_glUniform1iARB (GLint location, GLint v0) { + typedef void (APIENTRYP PFN_glUniform1iARB) (GLint location, GLint v0); + return ((PFN_glUniform1iARB)__blue_glCore_glUniform1iARB)(location, v0); +} + +extern void* __blue_glCore_glUniform2iARB; +void APIENTRY bluegl_glUniform2iARB (GLint location, GLint v0, GLint v1) { + typedef void (APIENTRYP PFN_glUniform2iARB) (GLint location, GLint v0, GLint v1); + return ((PFN_glUniform2iARB)__blue_glCore_glUniform2iARB)(location, v0, v1); +} + +extern void* __blue_glCore_glUniform3iARB; +void APIENTRY bluegl_glUniform3iARB (GLint location, GLint v0, GLint v1, GLint v2) { + typedef void (APIENTRYP PFN_glUniform3iARB) (GLint location, GLint v0, GLint v1, GLint v2); + return ((PFN_glUniform3iARB)__blue_glCore_glUniform3iARB)(location, v0, v1, v2); +} + +extern void* __blue_glCore_glUniform4iARB; +void APIENTRY bluegl_glUniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3) { + typedef void (APIENTRYP PFN_glUniform4iARB) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); + return ((PFN_glUniform4iARB)__blue_glCore_glUniform4iARB)(location, v0, v1, v2, v3); +} + +extern void* __blue_glCore_glUniform1fvARB; +void APIENTRY bluegl_glUniform1fvARB (GLint location, GLsizei count, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniform1fvARB) (GLint location, GLsizei count, const GLfloat *value); + return ((PFN_glUniform1fvARB)__blue_glCore_glUniform1fvARB)(location, count, value); +} + +extern void* __blue_glCore_glUniform2fvARB; +void APIENTRY bluegl_glUniform2fvARB (GLint location, GLsizei count, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniform2fvARB) (GLint location, GLsizei count, const GLfloat *value); + return ((PFN_glUniform2fvARB)__blue_glCore_glUniform2fvARB)(location, count, value); +} + +extern void* __blue_glCore_glUniform3fvARB; +void APIENTRY bluegl_glUniform3fvARB (GLint location, GLsizei count, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniform3fvARB) (GLint location, GLsizei count, const GLfloat *value); + return ((PFN_glUniform3fvARB)__blue_glCore_glUniform3fvARB)(location, count, value); +} + +extern void* __blue_glCore_glUniform4fvARB; +void APIENTRY bluegl_glUniform4fvARB (GLint location, GLsizei count, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniform4fvARB) (GLint location, GLsizei count, const GLfloat *value); + return ((PFN_glUniform4fvARB)__blue_glCore_glUniform4fvARB)(location, count, value); +} + +extern void* __blue_glCore_glUniform1ivARB; +void APIENTRY bluegl_glUniform1ivARB (GLint location, GLsizei count, const GLint *value) { + typedef void (APIENTRYP PFN_glUniform1ivARB) (GLint location, GLsizei count, const GLint *value); + return ((PFN_glUniform1ivARB)__blue_glCore_glUniform1ivARB)(location, count, value); +} + +extern void* __blue_glCore_glUniform2ivARB; +void APIENTRY bluegl_glUniform2ivARB (GLint location, GLsizei count, const GLint *value) { + typedef void (APIENTRYP PFN_glUniform2ivARB) (GLint location, GLsizei count, const GLint *value); + return ((PFN_glUniform2ivARB)__blue_glCore_glUniform2ivARB)(location, count, value); +} + +extern void* __blue_glCore_glUniform3ivARB; +void APIENTRY bluegl_glUniform3ivARB (GLint location, GLsizei count, const GLint *value) { + typedef void (APIENTRYP PFN_glUniform3ivARB) (GLint location, GLsizei count, const GLint *value); + return ((PFN_glUniform3ivARB)__blue_glCore_glUniform3ivARB)(location, count, value); +} + +extern void* __blue_glCore_glUniform4ivARB; +void APIENTRY bluegl_glUniform4ivARB (GLint location, GLsizei count, const GLint *value) { + typedef void (APIENTRYP PFN_glUniform4ivARB) (GLint location, GLsizei count, const GLint *value); + return ((PFN_glUniform4ivARB)__blue_glCore_glUniform4ivARB)(location, count, value); +} + +extern void* __blue_glCore_glUniformMatrix2fvARB; +void APIENTRY bluegl_glUniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniformMatrix2fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glUniformMatrix2fvARB)__blue_glCore_glUniformMatrix2fvARB)(location, count, transpose, value); +} + +extern void* __blue_glCore_glUniformMatrix3fvARB; +void APIENTRY bluegl_glUniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniformMatrix3fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glUniformMatrix3fvARB)__blue_glCore_glUniformMatrix3fvARB)(location, count, transpose, value); +} + +extern void* __blue_glCore_glUniformMatrix4fvARB; +void APIENTRY bluegl_glUniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glUniformMatrix4fvARB) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glUniformMatrix4fvARB)__blue_glCore_glUniformMatrix4fvARB)(location, count, transpose, value); +} + +extern void* __blue_glCore_glGetObjectParameterfvARB; +void APIENTRY bluegl_glGetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetObjectParameterfvARB) (GLhandleARB obj, GLenum pname, GLfloat *params); + return ((PFN_glGetObjectParameterfvARB)__blue_glCore_glGetObjectParameterfvARB)(obj, pname, params); +} + +extern void* __blue_glCore_glGetObjectParameterivARB; +void APIENTRY bluegl_glGetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetObjectParameterivARB) (GLhandleARB obj, GLenum pname, GLint *params); + return ((PFN_glGetObjectParameterivARB)__blue_glCore_glGetObjectParameterivARB)(obj, pname, params); +} + +extern void* __blue_glCore_glGetInfoLogARB; +void APIENTRY bluegl_glGetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog) { + typedef void (APIENTRYP PFN_glGetInfoLogARB) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); + return ((PFN_glGetInfoLogARB)__blue_glCore_glGetInfoLogARB)(obj, maxLength, length, infoLog); +} + +extern void* __blue_glCore_glGetAttachedObjectsARB; +void APIENTRY bluegl_glGetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj) { + typedef void (APIENTRYP PFN_glGetAttachedObjectsARB) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); + return ((PFN_glGetAttachedObjectsARB)__blue_glCore_glGetAttachedObjectsARB)(containerObj, maxCount, count, obj); +} + +extern void* __blue_glCore_glGetUniformLocationARB; +GLint APIENTRY bluegl_glGetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name) { + typedef GLint (APIENTRYP PFN_glGetUniformLocationARB) (GLhandleARB programObj, const GLcharARB *name); + return ((PFN_glGetUniformLocationARB)__blue_glCore_glGetUniformLocationARB)(programObj, name); +} + +extern void* __blue_glCore_glGetActiveUniformARB; +void APIENTRY bluegl_glGetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name) { + typedef void (APIENTRYP PFN_glGetActiveUniformARB) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); + return ((PFN_glGetActiveUniformARB)__blue_glCore_glGetActiveUniformARB)(programObj, index, maxLength, length, size, type, name); +} + +extern void* __blue_glCore_glGetUniformfvARB; +void APIENTRY bluegl_glGetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetUniformfvARB) (GLhandleARB programObj, GLint location, GLfloat *params); + return ((PFN_glGetUniformfvARB)__blue_glCore_glGetUniformfvARB)(programObj, location, params); +} + +extern void* __blue_glCore_glGetUniformivARB; +void APIENTRY bluegl_glGetUniformivARB (GLhandleARB programObj, GLint location, GLint *params) { + typedef void (APIENTRYP PFN_glGetUniformivARB) (GLhandleARB programObj, GLint location, GLint *params); + return ((PFN_glGetUniformivARB)__blue_glCore_glGetUniformivARB)(programObj, location, params); +} + +extern void* __blue_glCore_glGetShaderSourceARB; +void APIENTRY bluegl_glGetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source) { + typedef void (APIENTRYP PFN_glGetShaderSourceARB) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); + return ((PFN_glGetShaderSourceARB)__blue_glCore_glGetShaderSourceARB)(obj, maxLength, length, source); +} + +extern void* __blue_glCore_glTexBufferARB; +void APIENTRY bluegl_glTexBufferARB (GLenum target, GLenum internalformat, GLuint buffer) { + typedef void (APIENTRYP PFN_glTexBufferARB) (GLenum target, GLenum internalformat, GLuint buffer); + return ((PFN_glTexBufferARB)__blue_glCore_glTexBufferARB)(target, internalformat, buffer); +} + +extern void* __blue_glCore_glCompressedTexImage3DARB; +void APIENTRY bluegl_glCompressedTexImage3DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data) { + typedef void (APIENTRYP PFN_glCompressedTexImage3DARB) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); + return ((PFN_glCompressedTexImage3DARB)__blue_glCore_glCompressedTexImage3DARB)(target, level, internalformat, width, height, depth, border, imageSize, data); +} + +extern void* __blue_glCore_glCompressedTexImage2DARB; +void APIENTRY bluegl_glCompressedTexImage2DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data) { + typedef void (APIENTRYP PFN_glCompressedTexImage2DARB) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); + return ((PFN_glCompressedTexImage2DARB)__blue_glCore_glCompressedTexImage2DARB)(target, level, internalformat, width, height, border, imageSize, data); +} + +extern void* __blue_glCore_glCompressedTexImage1DARB; +void APIENTRY bluegl_glCompressedTexImage1DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data) { + typedef void (APIENTRYP PFN_glCompressedTexImage1DARB) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); + return ((PFN_glCompressedTexImage1DARB)__blue_glCore_glCompressedTexImage1DARB)(target, level, internalformat, width, border, imageSize, data); +} + +extern void* __blue_glCore_glCompressedTexSubImage3DARB; +void APIENTRY bluegl_glCompressedTexSubImage3DARB (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 PFN_glCompressedTexSubImage3DARB) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); + return ((PFN_glCompressedTexSubImage3DARB)__blue_glCore_glCompressedTexSubImage3DARB)(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); +} + +extern void* __blue_glCore_glCompressedTexSubImage2DARB; +void APIENTRY bluegl_glCompressedTexSubImage2DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data) { + typedef void (APIENTRYP PFN_glCompressedTexSubImage2DARB) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); + return ((PFN_glCompressedTexSubImage2DARB)__blue_glCore_glCompressedTexSubImage2DARB)(target, level, xoffset, yoffset, width, height, format, imageSize, data); +} + +extern void* __blue_glCore_glCompressedTexSubImage1DARB; +void APIENTRY bluegl_glCompressedTexSubImage1DARB (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data) { + typedef void (APIENTRYP PFN_glCompressedTexSubImage1DARB) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); + return ((PFN_glCompressedTexSubImage1DARB)__blue_glCore_glCompressedTexSubImage1DARB)(target, level, xoffset, width, format, imageSize, data); +} + +extern void* __blue_glCore_glGetCompressedTexImageARB; +void APIENTRY bluegl_glGetCompressedTexImageARB (GLenum target, GLint level, void *img) { + typedef void (APIENTRYP PFN_glGetCompressedTexImageARB) (GLenum target, GLint level, void *img); + return ((PFN_glGetCompressedTexImageARB)__blue_glCore_glGetCompressedTexImageARB)(target, level, img); +} + +extern void* __blue_glCore_glLoadTransposeMatrixfARB; +void APIENTRY bluegl_glLoadTransposeMatrixfARB (const GLfloat *m) { + typedef void (APIENTRYP PFN_glLoadTransposeMatrixfARB) (const GLfloat *m); + return ((PFN_glLoadTransposeMatrixfARB)__blue_glCore_glLoadTransposeMatrixfARB)(m); +} + +extern void* __blue_glCore_glLoadTransposeMatrixdARB; +void APIENTRY bluegl_glLoadTransposeMatrixdARB (const GLdouble *m) { + typedef void (APIENTRYP PFN_glLoadTransposeMatrixdARB) (const GLdouble *m); + return ((PFN_glLoadTransposeMatrixdARB)__blue_glCore_glLoadTransposeMatrixdARB)(m); +} + +extern void* __blue_glCore_glMultTransposeMatrixfARB; +void APIENTRY bluegl_glMultTransposeMatrixfARB (const GLfloat *m) { + typedef void (APIENTRYP PFN_glMultTransposeMatrixfARB) (const GLfloat *m); + return ((PFN_glMultTransposeMatrixfARB)__blue_glCore_glMultTransposeMatrixfARB)(m); +} + +extern void* __blue_glCore_glMultTransposeMatrixdARB; +void APIENTRY bluegl_glMultTransposeMatrixdARB (const GLdouble *m) { + typedef void (APIENTRYP PFN_glMultTransposeMatrixdARB) (const GLdouble *m); + return ((PFN_glMultTransposeMatrixdARB)__blue_glCore_glMultTransposeMatrixdARB)(m); +} + +extern void* __blue_glCore_glWeightbvARB; +void APIENTRY bluegl_glWeightbvARB (GLint size, const GLbyte *weights) { + typedef void (APIENTRYP PFN_glWeightbvARB) (GLint size, const GLbyte *weights); + return ((PFN_glWeightbvARB)__blue_glCore_glWeightbvARB)(size, weights); +} + +extern void* __blue_glCore_glWeightsvARB; +void APIENTRY bluegl_glWeightsvARB (GLint size, const GLshort *weights) { + typedef void (APIENTRYP PFN_glWeightsvARB) (GLint size, const GLshort *weights); + return ((PFN_glWeightsvARB)__blue_glCore_glWeightsvARB)(size, weights); +} + +extern void* __blue_glCore_glWeightivARB; +void APIENTRY bluegl_glWeightivARB (GLint size, const GLint *weights) { + typedef void (APIENTRYP PFN_glWeightivARB) (GLint size, const GLint *weights); + return ((PFN_glWeightivARB)__blue_glCore_glWeightivARB)(size, weights); +} + +extern void* __blue_glCore_glWeightfvARB; +void APIENTRY bluegl_glWeightfvARB (GLint size, const GLfloat *weights) { + typedef void (APIENTRYP PFN_glWeightfvARB) (GLint size, const GLfloat *weights); + return ((PFN_glWeightfvARB)__blue_glCore_glWeightfvARB)(size, weights); +} + +extern void* __blue_glCore_glWeightdvARB; +void APIENTRY bluegl_glWeightdvARB (GLint size, const GLdouble *weights) { + typedef void (APIENTRYP PFN_glWeightdvARB) (GLint size, const GLdouble *weights); + return ((PFN_glWeightdvARB)__blue_glCore_glWeightdvARB)(size, weights); +} + +extern void* __blue_glCore_glWeightubvARB; +void APIENTRY bluegl_glWeightubvARB (GLint size, const GLubyte *weights) { + typedef void (APIENTRYP PFN_glWeightubvARB) (GLint size, const GLubyte *weights); + return ((PFN_glWeightubvARB)__blue_glCore_glWeightubvARB)(size, weights); +} + +extern void* __blue_glCore_glWeightusvARB; +void APIENTRY bluegl_glWeightusvARB (GLint size, const GLushort *weights) { + typedef void (APIENTRYP PFN_glWeightusvARB) (GLint size, const GLushort *weights); + return ((PFN_glWeightusvARB)__blue_glCore_glWeightusvARB)(size, weights); +} + +extern void* __blue_glCore_glWeightuivARB; +void APIENTRY bluegl_glWeightuivARB (GLint size, const GLuint *weights) { + typedef void (APIENTRYP PFN_glWeightuivARB) (GLint size, const GLuint *weights); + return ((PFN_glWeightuivARB)__blue_glCore_glWeightuivARB)(size, weights); +} + +extern void* __blue_glCore_glWeightPointerARB; +void APIENTRY bluegl_glWeightPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer) { + typedef void (APIENTRYP PFN_glWeightPointerARB) (GLint size, GLenum type, GLsizei stride, const void *pointer); + return ((PFN_glWeightPointerARB)__blue_glCore_glWeightPointerARB)(size, type, stride, pointer); +} + +extern void* __blue_glCore_glVertexBlendARB; +void APIENTRY bluegl_glVertexBlendARB (GLint count) { + typedef void (APIENTRYP PFN_glVertexBlendARB) (GLint count); + return ((PFN_glVertexBlendARB)__blue_glCore_glVertexBlendARB)(count); +} + +extern void* __blue_glCore_glBindBufferARB; +void APIENTRY bluegl_glBindBufferARB (GLenum target, GLuint buffer) { + typedef void (APIENTRYP PFN_glBindBufferARB) (GLenum target, GLuint buffer); + return ((PFN_glBindBufferARB)__blue_glCore_glBindBufferARB)(target, buffer); +} + +extern void* __blue_glCore_glDeleteBuffersARB; +void APIENTRY bluegl_glDeleteBuffersARB (GLsizei n, const GLuint *buffers) { + typedef void (APIENTRYP PFN_glDeleteBuffersARB) (GLsizei n, const GLuint *buffers); + return ((PFN_glDeleteBuffersARB)__blue_glCore_glDeleteBuffersARB)(n, buffers); +} + +extern void* __blue_glCore_glGenBuffersARB; +void APIENTRY bluegl_glGenBuffersARB (GLsizei n, GLuint *buffers) { + typedef void (APIENTRYP PFN_glGenBuffersARB) (GLsizei n, GLuint *buffers); + return ((PFN_glGenBuffersARB)__blue_glCore_glGenBuffersARB)(n, buffers); +} + +extern void* __blue_glCore_glIsBufferARB; +GLboolean APIENTRY bluegl_glIsBufferARB (GLuint buffer) { + typedef GLboolean (APIENTRYP PFN_glIsBufferARB) (GLuint buffer); + return ((PFN_glIsBufferARB)__blue_glCore_glIsBufferARB)(buffer); +} + +extern void* __blue_glCore_glBufferDataARB; +void APIENTRY bluegl_glBufferDataARB (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage) { + typedef void (APIENTRYP PFN_glBufferDataARB) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); + return ((PFN_glBufferDataARB)__blue_glCore_glBufferDataARB)(target, size, data, usage); +} + +extern void* __blue_glCore_glBufferSubDataARB; +void APIENTRY bluegl_glBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data) { + typedef void (APIENTRYP PFN_glBufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); + return ((PFN_glBufferSubDataARB)__blue_glCore_glBufferSubDataARB)(target, offset, size, data); +} + +extern void* __blue_glCore_glGetBufferSubDataARB; +void APIENTRY bluegl_glGetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data) { + typedef void (APIENTRYP PFN_glGetBufferSubDataARB) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); + return ((PFN_glGetBufferSubDataARB)__blue_glCore_glGetBufferSubDataARB)(target, offset, size, data); +} + +extern void* __blue_glCore_glMapBufferARB; +void *APIENTRY bluegl_glMapBufferARB (GLenum target, GLenum access) { + typedef void *(APIENTRYP PFN_glMapBufferARB) (GLenum target, GLenum access); + return ((PFN_glMapBufferARB)__blue_glCore_glMapBufferARB)(target, access); +} + +extern void* __blue_glCore_glUnmapBufferARB; +GLboolean APIENTRY bluegl_glUnmapBufferARB (GLenum target) { + typedef GLboolean (APIENTRYP PFN_glUnmapBufferARB) (GLenum target); + return ((PFN_glUnmapBufferARB)__blue_glCore_glUnmapBufferARB)(target); +} + +extern void* __blue_glCore_glGetBufferParameterivARB; +void APIENTRY bluegl_glGetBufferParameterivARB (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetBufferParameterivARB) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetBufferParameterivARB)__blue_glCore_glGetBufferParameterivARB)(target, pname, params); +} + +extern void* __blue_glCore_glGetBufferPointervARB; +void APIENTRY bluegl_glGetBufferPointervARB (GLenum target, GLenum pname, void **params) { + typedef void (APIENTRYP PFN_glGetBufferPointervARB) (GLenum target, GLenum pname, void **params); + return ((PFN_glGetBufferPointervARB)__blue_glCore_glGetBufferPointervARB)(target, pname, params); +} + +extern void* __blue_glCore_glVertexAttrib1dARB; +void APIENTRY bluegl_glVertexAttrib1dARB (GLuint index, GLdouble x) { + typedef void (APIENTRYP PFN_glVertexAttrib1dARB) (GLuint index, GLdouble x); + return ((PFN_glVertexAttrib1dARB)__blue_glCore_glVertexAttrib1dARB)(index, x); +} + +extern void* __blue_glCore_glVertexAttrib1dvARB; +void APIENTRY bluegl_glVertexAttrib1dvARB (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttrib1dvARB) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttrib1dvARB)__blue_glCore_glVertexAttrib1dvARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib1fARB; +void APIENTRY bluegl_glVertexAttrib1fARB (GLuint index, GLfloat x) { + typedef void (APIENTRYP PFN_glVertexAttrib1fARB) (GLuint index, GLfloat x); + return ((PFN_glVertexAttrib1fARB)__blue_glCore_glVertexAttrib1fARB)(index, x); +} + +extern void* __blue_glCore_glVertexAttrib1fvARB; +void APIENTRY bluegl_glVertexAttrib1fvARB (GLuint index, const GLfloat *v) { + typedef void (APIENTRYP PFN_glVertexAttrib1fvARB) (GLuint index, const GLfloat *v); + return ((PFN_glVertexAttrib1fvARB)__blue_glCore_glVertexAttrib1fvARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib1sARB; +void APIENTRY bluegl_glVertexAttrib1sARB (GLuint index, GLshort x) { + typedef void (APIENTRYP PFN_glVertexAttrib1sARB) (GLuint index, GLshort x); + return ((PFN_glVertexAttrib1sARB)__blue_glCore_glVertexAttrib1sARB)(index, x); +} + +extern void* __blue_glCore_glVertexAttrib1svARB; +void APIENTRY bluegl_glVertexAttrib1svARB (GLuint index, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttrib1svARB) (GLuint index, const GLshort *v); + return ((PFN_glVertexAttrib1svARB)__blue_glCore_glVertexAttrib1svARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib2dARB; +void APIENTRY bluegl_glVertexAttrib2dARB (GLuint index, GLdouble x, GLdouble y) { + typedef void (APIENTRYP PFN_glVertexAttrib2dARB) (GLuint index, GLdouble x, GLdouble y); + return ((PFN_glVertexAttrib2dARB)__blue_glCore_glVertexAttrib2dARB)(index, x, y); +} + +extern void* __blue_glCore_glVertexAttrib2dvARB; +void APIENTRY bluegl_glVertexAttrib2dvARB (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttrib2dvARB) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttrib2dvARB)__blue_glCore_glVertexAttrib2dvARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib2fARB; +void APIENTRY bluegl_glVertexAttrib2fARB (GLuint index, GLfloat x, GLfloat y) { + typedef void (APIENTRYP PFN_glVertexAttrib2fARB) (GLuint index, GLfloat x, GLfloat y); + return ((PFN_glVertexAttrib2fARB)__blue_glCore_glVertexAttrib2fARB)(index, x, y); +} + +extern void* __blue_glCore_glVertexAttrib2fvARB; +void APIENTRY bluegl_glVertexAttrib2fvARB (GLuint index, const GLfloat *v) { + typedef void (APIENTRYP PFN_glVertexAttrib2fvARB) (GLuint index, const GLfloat *v); + return ((PFN_glVertexAttrib2fvARB)__blue_glCore_glVertexAttrib2fvARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib2sARB; +void APIENTRY bluegl_glVertexAttrib2sARB (GLuint index, GLshort x, GLshort y) { + typedef void (APIENTRYP PFN_glVertexAttrib2sARB) (GLuint index, GLshort x, GLshort y); + return ((PFN_glVertexAttrib2sARB)__blue_glCore_glVertexAttrib2sARB)(index, x, y); +} + +extern void* __blue_glCore_glVertexAttrib2svARB; +void APIENTRY bluegl_glVertexAttrib2svARB (GLuint index, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttrib2svARB) (GLuint index, const GLshort *v); + return ((PFN_glVertexAttrib2svARB)__blue_glCore_glVertexAttrib2svARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib3dARB; +void APIENTRY bluegl_glVertexAttrib3dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z) { + typedef void (APIENTRYP PFN_glVertexAttrib3dARB) (GLuint index, GLdouble x, GLdouble y, GLdouble z); + return ((PFN_glVertexAttrib3dARB)__blue_glCore_glVertexAttrib3dARB)(index, x, y, z); +} + +extern void* __blue_glCore_glVertexAttrib3dvARB; +void APIENTRY bluegl_glVertexAttrib3dvARB (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttrib3dvARB) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttrib3dvARB)__blue_glCore_glVertexAttrib3dvARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib3fARB; +void APIENTRY bluegl_glVertexAttrib3fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glVertexAttrib3fARB) (GLuint index, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glVertexAttrib3fARB)__blue_glCore_glVertexAttrib3fARB)(index, x, y, z); +} + +extern void* __blue_glCore_glVertexAttrib3fvARB; +void APIENTRY bluegl_glVertexAttrib3fvARB (GLuint index, const GLfloat *v) { + typedef void (APIENTRYP PFN_glVertexAttrib3fvARB) (GLuint index, const GLfloat *v); + return ((PFN_glVertexAttrib3fvARB)__blue_glCore_glVertexAttrib3fvARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib3sARB; +void APIENTRY bluegl_glVertexAttrib3sARB (GLuint index, GLshort x, GLshort y, GLshort z) { + typedef void (APIENTRYP PFN_glVertexAttrib3sARB) (GLuint index, GLshort x, GLshort y, GLshort z); + return ((PFN_glVertexAttrib3sARB)__blue_glCore_glVertexAttrib3sARB)(index, x, y, z); +} + +extern void* __blue_glCore_glVertexAttrib3svARB; +void APIENTRY bluegl_glVertexAttrib3svARB (GLuint index, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttrib3svARB) (GLuint index, const GLshort *v); + return ((PFN_glVertexAttrib3svARB)__blue_glCore_glVertexAttrib3svARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4NbvARB; +void APIENTRY bluegl_glVertexAttrib4NbvARB (GLuint index, const GLbyte *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4NbvARB) (GLuint index, const GLbyte *v); + return ((PFN_glVertexAttrib4NbvARB)__blue_glCore_glVertexAttrib4NbvARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4NivARB; +void APIENTRY bluegl_glVertexAttrib4NivARB (GLuint index, const GLint *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4NivARB) (GLuint index, const GLint *v); + return ((PFN_glVertexAttrib4NivARB)__blue_glCore_glVertexAttrib4NivARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4NsvARB; +void APIENTRY bluegl_glVertexAttrib4NsvARB (GLuint index, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4NsvARB) (GLuint index, const GLshort *v); + return ((PFN_glVertexAttrib4NsvARB)__blue_glCore_glVertexAttrib4NsvARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4NubARB; +void APIENTRY bluegl_glVertexAttrib4NubARB (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) { + typedef void (APIENTRYP PFN_glVertexAttrib4NubARB) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); + return ((PFN_glVertexAttrib4NubARB)__blue_glCore_glVertexAttrib4NubARB)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttrib4NubvARB; +void APIENTRY bluegl_glVertexAttrib4NubvARB (GLuint index, const GLubyte *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4NubvARB) (GLuint index, const GLubyte *v); + return ((PFN_glVertexAttrib4NubvARB)__blue_glCore_glVertexAttrib4NubvARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4NuivARB; +void APIENTRY bluegl_glVertexAttrib4NuivARB (GLuint index, const GLuint *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4NuivARB) (GLuint index, const GLuint *v); + return ((PFN_glVertexAttrib4NuivARB)__blue_glCore_glVertexAttrib4NuivARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4NusvARB; +void APIENTRY bluegl_glVertexAttrib4NusvARB (GLuint index, const GLushort *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4NusvARB) (GLuint index, const GLushort *v); + return ((PFN_glVertexAttrib4NusvARB)__blue_glCore_glVertexAttrib4NusvARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4bvARB; +void APIENTRY bluegl_glVertexAttrib4bvARB (GLuint index, const GLbyte *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4bvARB) (GLuint index, const GLbyte *v); + return ((PFN_glVertexAttrib4bvARB)__blue_glCore_glVertexAttrib4bvARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4dARB; +void APIENTRY bluegl_glVertexAttrib4dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { + typedef void (APIENTRYP PFN_glVertexAttrib4dARB) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + return ((PFN_glVertexAttrib4dARB)__blue_glCore_glVertexAttrib4dARB)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttrib4dvARB; +void APIENTRY bluegl_glVertexAttrib4dvARB (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4dvARB) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttrib4dvARB)__blue_glCore_glVertexAttrib4dvARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4fARB; +void APIENTRY bluegl_glVertexAttrib4fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { + typedef void (APIENTRYP PFN_glVertexAttrib4fARB) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + return ((PFN_glVertexAttrib4fARB)__blue_glCore_glVertexAttrib4fARB)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttrib4fvARB; +void APIENTRY bluegl_glVertexAttrib4fvARB (GLuint index, const GLfloat *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4fvARB) (GLuint index, const GLfloat *v); + return ((PFN_glVertexAttrib4fvARB)__blue_glCore_glVertexAttrib4fvARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4ivARB; +void APIENTRY bluegl_glVertexAttrib4ivARB (GLuint index, const GLint *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4ivARB) (GLuint index, const GLint *v); + return ((PFN_glVertexAttrib4ivARB)__blue_glCore_glVertexAttrib4ivARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4sARB; +void APIENTRY bluegl_glVertexAttrib4sARB (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) { + typedef void (APIENTRYP PFN_glVertexAttrib4sARB) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); + return ((PFN_glVertexAttrib4sARB)__blue_glCore_glVertexAttrib4sARB)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttrib4svARB; +void APIENTRY bluegl_glVertexAttrib4svARB (GLuint index, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4svARB) (GLuint index, const GLshort *v); + return ((PFN_glVertexAttrib4svARB)__blue_glCore_glVertexAttrib4svARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4ubvARB; +void APIENTRY bluegl_glVertexAttrib4ubvARB (GLuint index, const GLubyte *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4ubvARB) (GLuint index, const GLubyte *v); + return ((PFN_glVertexAttrib4ubvARB)__blue_glCore_glVertexAttrib4ubvARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4uivARB; +void APIENTRY bluegl_glVertexAttrib4uivARB (GLuint index, const GLuint *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4uivARB) (GLuint index, const GLuint *v); + return ((PFN_glVertexAttrib4uivARB)__blue_glCore_glVertexAttrib4uivARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4usvARB; +void APIENTRY bluegl_glVertexAttrib4usvARB (GLuint index, const GLushort *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4usvARB) (GLuint index, const GLushort *v); + return ((PFN_glVertexAttrib4usvARB)__blue_glCore_glVertexAttrib4usvARB)(index, v); +} + +extern void* __blue_glCore_glVertexAttribPointerARB; +void APIENTRY bluegl_glVertexAttribPointerARB (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer) { + typedef void (APIENTRYP PFN_glVertexAttribPointerARB) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); + return ((PFN_glVertexAttribPointerARB)__blue_glCore_glVertexAttribPointerARB)(index, size, type, normalized, stride, pointer); +} + +extern void* __blue_glCore_glEnableVertexAttribArrayARB; +void APIENTRY bluegl_glEnableVertexAttribArrayARB (GLuint index) { + typedef void (APIENTRYP PFN_glEnableVertexAttribArrayARB) (GLuint index); + return ((PFN_glEnableVertexAttribArrayARB)__blue_glCore_glEnableVertexAttribArrayARB)(index); +} + +extern void* __blue_glCore_glDisableVertexAttribArrayARB; +void APIENTRY bluegl_glDisableVertexAttribArrayARB (GLuint index) { + typedef void (APIENTRYP PFN_glDisableVertexAttribArrayARB) (GLuint index); + return ((PFN_glDisableVertexAttribArrayARB)__blue_glCore_glDisableVertexAttribArrayARB)(index); +} + +extern void* __blue_glCore_glGetVertexAttribdvARB; +void APIENTRY bluegl_glGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribdvARB) (GLuint index, GLenum pname, GLdouble *params); + return ((PFN_glGetVertexAttribdvARB)__blue_glCore_glGetVertexAttribdvARB)(index, pname, params); +} + +extern void* __blue_glCore_glGetVertexAttribfvARB; +void APIENTRY bluegl_glGetVertexAttribfvARB (GLuint index, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribfvARB) (GLuint index, GLenum pname, GLfloat *params); + return ((PFN_glGetVertexAttribfvARB)__blue_glCore_glGetVertexAttribfvARB)(index, pname, params); +} + +extern void* __blue_glCore_glGetVertexAttribivARB; +void APIENTRY bluegl_glGetVertexAttribivARB (GLuint index, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribivARB) (GLuint index, GLenum pname, GLint *params); + return ((PFN_glGetVertexAttribivARB)__blue_glCore_glGetVertexAttribivARB)(index, pname, params); +} + +extern void* __blue_glCore_glGetVertexAttribPointervARB; +void APIENTRY bluegl_glGetVertexAttribPointervARB (GLuint index, GLenum pname, void **pointer) { + typedef void (APIENTRYP PFN_glGetVertexAttribPointervARB) (GLuint index, GLenum pname, void **pointer); + return ((PFN_glGetVertexAttribPointervARB)__blue_glCore_glGetVertexAttribPointervARB)(index, pname, pointer); +} + +extern void* __blue_glCore_glBindAttribLocationARB; +void APIENTRY bluegl_glBindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name) { + typedef void (APIENTRYP PFN_glBindAttribLocationARB) (GLhandleARB programObj, GLuint index, const GLcharARB *name); + return ((PFN_glBindAttribLocationARB)__blue_glCore_glBindAttribLocationARB)(programObj, index, name); +} + +extern void* __blue_glCore_glGetActiveAttribARB; +void APIENTRY bluegl_glGetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name) { + typedef void (APIENTRYP PFN_glGetActiveAttribARB) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); + return ((PFN_glGetActiveAttribARB)__blue_glCore_glGetActiveAttribARB)(programObj, index, maxLength, length, size, type, name); +} + +extern void* __blue_glCore_glGetAttribLocationARB; +GLint APIENTRY bluegl_glGetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name) { + typedef GLint (APIENTRYP PFN_glGetAttribLocationARB) (GLhandleARB programObj, const GLcharARB *name); + return ((PFN_glGetAttribLocationARB)__blue_glCore_glGetAttribLocationARB)(programObj, name); +} + +extern void* __blue_glCore_glWindowPos2dARB; +void APIENTRY bluegl_glWindowPos2dARB (GLdouble x, GLdouble y) { + typedef void (APIENTRYP PFN_glWindowPos2dARB) (GLdouble x, GLdouble y); + return ((PFN_glWindowPos2dARB)__blue_glCore_glWindowPos2dARB)(x, y); +} + +extern void* __blue_glCore_glWindowPos2dvARB; +void APIENTRY bluegl_glWindowPos2dvARB (const GLdouble *v) { + typedef void (APIENTRYP PFN_glWindowPos2dvARB) (const GLdouble *v); + return ((PFN_glWindowPos2dvARB)__blue_glCore_glWindowPos2dvARB)(v); +} + +extern void* __blue_glCore_glWindowPos2fARB; +void APIENTRY bluegl_glWindowPos2fARB (GLfloat x, GLfloat y) { + typedef void (APIENTRYP PFN_glWindowPos2fARB) (GLfloat x, GLfloat y); + return ((PFN_glWindowPos2fARB)__blue_glCore_glWindowPos2fARB)(x, y); +} + +extern void* __blue_glCore_glWindowPos2fvARB; +void APIENTRY bluegl_glWindowPos2fvARB (const GLfloat *v) { + typedef void (APIENTRYP PFN_glWindowPos2fvARB) (const GLfloat *v); + return ((PFN_glWindowPos2fvARB)__blue_glCore_glWindowPos2fvARB)(v); +} + +extern void* __blue_glCore_glWindowPos2iARB; +void APIENTRY bluegl_glWindowPos2iARB (GLint x, GLint y) { + typedef void (APIENTRYP PFN_glWindowPos2iARB) (GLint x, GLint y); + return ((PFN_glWindowPos2iARB)__blue_glCore_glWindowPos2iARB)(x, y); +} + +extern void* __blue_glCore_glWindowPos2ivARB; +void APIENTRY bluegl_glWindowPos2ivARB (const GLint *v) { + typedef void (APIENTRYP PFN_glWindowPos2ivARB) (const GLint *v); + return ((PFN_glWindowPos2ivARB)__blue_glCore_glWindowPos2ivARB)(v); +} + +extern void* __blue_glCore_glWindowPos2sARB; +void APIENTRY bluegl_glWindowPos2sARB (GLshort x, GLshort y) { + typedef void (APIENTRYP PFN_glWindowPos2sARB) (GLshort x, GLshort y); + return ((PFN_glWindowPos2sARB)__blue_glCore_glWindowPos2sARB)(x, y); +} + +extern void* __blue_glCore_glWindowPos2svARB; +void APIENTRY bluegl_glWindowPos2svARB (const GLshort *v) { + typedef void (APIENTRYP PFN_glWindowPos2svARB) (const GLshort *v); + return ((PFN_glWindowPos2svARB)__blue_glCore_glWindowPos2svARB)(v); +} + +extern void* __blue_glCore_glWindowPos3dARB; +void APIENTRY bluegl_glWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z) { + typedef void (APIENTRYP PFN_glWindowPos3dARB) (GLdouble x, GLdouble y, GLdouble z); + return ((PFN_glWindowPos3dARB)__blue_glCore_glWindowPos3dARB)(x, y, z); +} + +extern void* __blue_glCore_glWindowPos3dvARB; +void APIENTRY bluegl_glWindowPos3dvARB (const GLdouble *v) { + typedef void (APIENTRYP PFN_glWindowPos3dvARB) (const GLdouble *v); + return ((PFN_glWindowPos3dvARB)__blue_glCore_glWindowPos3dvARB)(v); +} + +extern void* __blue_glCore_glWindowPos3fARB; +void APIENTRY bluegl_glWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glWindowPos3fARB) (GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glWindowPos3fARB)__blue_glCore_glWindowPos3fARB)(x, y, z); +} + +extern void* __blue_glCore_glWindowPos3fvARB; +void APIENTRY bluegl_glWindowPos3fvARB (const GLfloat *v) { + typedef void (APIENTRYP PFN_glWindowPos3fvARB) (const GLfloat *v); + return ((PFN_glWindowPos3fvARB)__blue_glCore_glWindowPos3fvARB)(v); +} + +extern void* __blue_glCore_glWindowPos3iARB; +void APIENTRY bluegl_glWindowPos3iARB (GLint x, GLint y, GLint z) { + typedef void (APIENTRYP PFN_glWindowPos3iARB) (GLint x, GLint y, GLint z); + return ((PFN_glWindowPos3iARB)__blue_glCore_glWindowPos3iARB)(x, y, z); +} + +extern void* __blue_glCore_glWindowPos3ivARB; +void APIENTRY bluegl_glWindowPos3ivARB (const GLint *v) { + typedef void (APIENTRYP PFN_glWindowPos3ivARB) (const GLint *v); + return ((PFN_glWindowPos3ivARB)__blue_glCore_glWindowPos3ivARB)(v); +} + +extern void* __blue_glCore_glWindowPos3sARB; +void APIENTRY bluegl_glWindowPos3sARB (GLshort x, GLshort y, GLshort z) { + typedef void (APIENTRYP PFN_glWindowPos3sARB) (GLshort x, GLshort y, GLshort z); + return ((PFN_glWindowPos3sARB)__blue_glCore_glWindowPos3sARB)(x, y, z); +} + +extern void* __blue_glCore_glWindowPos3svARB; +void APIENTRY bluegl_glWindowPos3svARB (const GLshort *v) { + typedef void (APIENTRYP PFN_glWindowPos3svARB) (const GLshort *v); + return ((PFN_glWindowPos3svARB)__blue_glCore_glWindowPos3svARB)(v); +} + +extern void* __blue_glCore_glBlendBarrierKHR; +void APIENTRY bluegl_glBlendBarrierKHR (void) { + typedef void (APIENTRYP PFN_glBlendBarrierKHR) (void); + return ((PFN_glBlendBarrierKHR)__blue_glCore_glBlendBarrierKHR)(); +} + +extern void* __blue_glCore_glMultiTexCoord1bOES; +void APIENTRY bluegl_glMultiTexCoord1bOES (GLenum texture, GLbyte s) { + typedef void (APIENTRYP PFN_glMultiTexCoord1bOES) (GLenum texture, GLbyte s); + return ((PFN_glMultiTexCoord1bOES)__blue_glCore_glMultiTexCoord1bOES)(texture, s); +} + +extern void* __blue_glCore_glMultiTexCoord1bvOES; +void APIENTRY bluegl_glMultiTexCoord1bvOES (GLenum texture, const GLbyte *coords) { + typedef void (APIENTRYP PFN_glMultiTexCoord1bvOES) (GLenum texture, const GLbyte *coords); + return ((PFN_glMultiTexCoord1bvOES)__blue_glCore_glMultiTexCoord1bvOES)(texture, coords); +} + +extern void* __blue_glCore_glMultiTexCoord2bOES; +void APIENTRY bluegl_glMultiTexCoord2bOES (GLenum texture, GLbyte s, GLbyte t) { + typedef void (APIENTRYP PFN_glMultiTexCoord2bOES) (GLenum texture, GLbyte s, GLbyte t); + return ((PFN_glMultiTexCoord2bOES)__blue_glCore_glMultiTexCoord2bOES)(texture, s, t); +} + +extern void* __blue_glCore_glMultiTexCoord2bvOES; +void APIENTRY bluegl_glMultiTexCoord2bvOES (GLenum texture, const GLbyte *coords) { + typedef void (APIENTRYP PFN_glMultiTexCoord2bvOES) (GLenum texture, const GLbyte *coords); + return ((PFN_glMultiTexCoord2bvOES)__blue_glCore_glMultiTexCoord2bvOES)(texture, coords); +} + +extern void* __blue_glCore_glMultiTexCoord3bOES; +void APIENTRY bluegl_glMultiTexCoord3bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r) { + typedef void (APIENTRYP PFN_glMultiTexCoord3bOES) (GLenum texture, GLbyte s, GLbyte t, GLbyte r); + return ((PFN_glMultiTexCoord3bOES)__blue_glCore_glMultiTexCoord3bOES)(texture, s, t, r); +} + +extern void* __blue_glCore_glMultiTexCoord3bvOES; +void APIENTRY bluegl_glMultiTexCoord3bvOES (GLenum texture, const GLbyte *coords) { + typedef void (APIENTRYP PFN_glMultiTexCoord3bvOES) (GLenum texture, const GLbyte *coords); + return ((PFN_glMultiTexCoord3bvOES)__blue_glCore_glMultiTexCoord3bvOES)(texture, coords); +} + +extern void* __blue_glCore_glMultiTexCoord4bOES; +void APIENTRY bluegl_glMultiTexCoord4bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q) { + typedef void (APIENTRYP PFN_glMultiTexCoord4bOES) (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); + return ((PFN_glMultiTexCoord4bOES)__blue_glCore_glMultiTexCoord4bOES)(texture, s, t, r, q); +} + +extern void* __blue_glCore_glMultiTexCoord4bvOES; +void APIENTRY bluegl_glMultiTexCoord4bvOES (GLenum texture, const GLbyte *coords) { + typedef void (APIENTRYP PFN_glMultiTexCoord4bvOES) (GLenum texture, const GLbyte *coords); + return ((PFN_glMultiTexCoord4bvOES)__blue_glCore_glMultiTexCoord4bvOES)(texture, coords); +} + +extern void* __blue_glCore_glTexCoord1bOES; +void APIENTRY bluegl_glTexCoord1bOES (GLbyte s) { + typedef void (APIENTRYP PFN_glTexCoord1bOES) (GLbyte s); + return ((PFN_glTexCoord1bOES)__blue_glCore_glTexCoord1bOES)(s); +} + +extern void* __blue_glCore_glTexCoord1bvOES; +void APIENTRY bluegl_glTexCoord1bvOES (const GLbyte *coords) { + typedef void (APIENTRYP PFN_glTexCoord1bvOES) (const GLbyte *coords); + return ((PFN_glTexCoord1bvOES)__blue_glCore_glTexCoord1bvOES)(coords); +} + +extern void* __blue_glCore_glTexCoord2bOES; +void APIENTRY bluegl_glTexCoord2bOES (GLbyte s, GLbyte t) { + typedef void (APIENTRYP PFN_glTexCoord2bOES) (GLbyte s, GLbyte t); + return ((PFN_glTexCoord2bOES)__blue_glCore_glTexCoord2bOES)(s, t); +} + +extern void* __blue_glCore_glTexCoord2bvOES; +void APIENTRY bluegl_glTexCoord2bvOES (const GLbyte *coords) { + typedef void (APIENTRYP PFN_glTexCoord2bvOES) (const GLbyte *coords); + return ((PFN_glTexCoord2bvOES)__blue_glCore_glTexCoord2bvOES)(coords); +} + +extern void* __blue_glCore_glTexCoord3bOES; +void APIENTRY bluegl_glTexCoord3bOES (GLbyte s, GLbyte t, GLbyte r) { + typedef void (APIENTRYP PFN_glTexCoord3bOES) (GLbyte s, GLbyte t, GLbyte r); + return ((PFN_glTexCoord3bOES)__blue_glCore_glTexCoord3bOES)(s, t, r); +} + +extern void* __blue_glCore_glTexCoord3bvOES; +void APIENTRY bluegl_glTexCoord3bvOES (const GLbyte *coords) { + typedef void (APIENTRYP PFN_glTexCoord3bvOES) (const GLbyte *coords); + return ((PFN_glTexCoord3bvOES)__blue_glCore_glTexCoord3bvOES)(coords); +} + +extern void* __blue_glCore_glTexCoord4bOES; +void APIENTRY bluegl_glTexCoord4bOES (GLbyte s, GLbyte t, GLbyte r, GLbyte q) { + typedef void (APIENTRYP PFN_glTexCoord4bOES) (GLbyte s, GLbyte t, GLbyte r, GLbyte q); + return ((PFN_glTexCoord4bOES)__blue_glCore_glTexCoord4bOES)(s, t, r, q); +} + +extern void* __blue_glCore_glTexCoord4bvOES; +void APIENTRY bluegl_glTexCoord4bvOES (const GLbyte *coords) { + typedef void (APIENTRYP PFN_glTexCoord4bvOES) (const GLbyte *coords); + return ((PFN_glTexCoord4bvOES)__blue_glCore_glTexCoord4bvOES)(coords); +} + +extern void* __blue_glCore_glVertex2bOES; +void APIENTRY bluegl_glVertex2bOES (GLbyte x, GLbyte y) { + typedef void (APIENTRYP PFN_glVertex2bOES) (GLbyte x, GLbyte y); + return ((PFN_glVertex2bOES)__blue_glCore_glVertex2bOES)(x, y); +} + +extern void* __blue_glCore_glVertex2bvOES; +void APIENTRY bluegl_glVertex2bvOES (const GLbyte *coords) { + typedef void (APIENTRYP PFN_glVertex2bvOES) (const GLbyte *coords); + return ((PFN_glVertex2bvOES)__blue_glCore_glVertex2bvOES)(coords); +} + +extern void* __blue_glCore_glVertex3bOES; +void APIENTRY bluegl_glVertex3bOES (GLbyte x, GLbyte y, GLbyte z) { + typedef void (APIENTRYP PFN_glVertex3bOES) (GLbyte x, GLbyte y, GLbyte z); + return ((PFN_glVertex3bOES)__blue_glCore_glVertex3bOES)(x, y, z); +} + +extern void* __blue_glCore_glVertex3bvOES; +void APIENTRY bluegl_glVertex3bvOES (const GLbyte *coords) { + typedef void (APIENTRYP PFN_glVertex3bvOES) (const GLbyte *coords); + return ((PFN_glVertex3bvOES)__blue_glCore_glVertex3bvOES)(coords); +} + +extern void* __blue_glCore_glVertex4bOES; +void APIENTRY bluegl_glVertex4bOES (GLbyte x, GLbyte y, GLbyte z, GLbyte w) { + typedef void (APIENTRYP PFN_glVertex4bOES) (GLbyte x, GLbyte y, GLbyte z, GLbyte w); + return ((PFN_glVertex4bOES)__blue_glCore_glVertex4bOES)(x, y, z, w); +} + +extern void* __blue_glCore_glVertex4bvOES; +void APIENTRY bluegl_glVertex4bvOES (const GLbyte *coords) { + typedef void (APIENTRYP PFN_glVertex4bvOES) (const GLbyte *coords); + return ((PFN_glVertex4bvOES)__blue_glCore_glVertex4bvOES)(coords); +} + +extern void* __blue_glCore_glAlphaFuncxOES; +void APIENTRY bluegl_glAlphaFuncxOES (GLenum func, GLfixed ref) { + typedef void (APIENTRYP PFN_glAlphaFuncxOES) (GLenum func, GLfixed ref); + return ((PFN_glAlphaFuncxOES)__blue_glCore_glAlphaFuncxOES)(func, ref); +} + +extern void* __blue_glCore_glClearColorxOES; +void APIENTRY bluegl_glClearColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) { + typedef void (APIENTRYP PFN_glClearColorxOES) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); + return ((PFN_glClearColorxOES)__blue_glCore_glClearColorxOES)(red, green, blue, alpha); +} + +extern void* __blue_glCore_glClearDepthxOES; +void APIENTRY bluegl_glClearDepthxOES (GLfixed depth) { + typedef void (APIENTRYP PFN_glClearDepthxOES) (GLfixed depth); + return ((PFN_glClearDepthxOES)__blue_glCore_glClearDepthxOES)(depth); +} + +extern void* __blue_glCore_glClipPlanexOES; +void APIENTRY bluegl_glClipPlanexOES (GLenum plane, const GLfixed *equation) { + typedef void (APIENTRYP PFN_glClipPlanexOES) (GLenum plane, const GLfixed *equation); + return ((PFN_glClipPlanexOES)__blue_glCore_glClipPlanexOES)(plane, equation); +} + +extern void* __blue_glCore_glColor4xOES; +void APIENTRY bluegl_glColor4xOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) { + typedef void (APIENTRYP PFN_glColor4xOES) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); + return ((PFN_glColor4xOES)__blue_glCore_glColor4xOES)(red, green, blue, alpha); +} + +extern void* __blue_glCore_glDepthRangexOES; +void APIENTRY bluegl_glDepthRangexOES (GLfixed n, GLfixed f) { + typedef void (APIENTRYP PFN_glDepthRangexOES) (GLfixed n, GLfixed f); + return ((PFN_glDepthRangexOES)__blue_glCore_glDepthRangexOES)(n, f); +} + +extern void* __blue_glCore_glFogxOES; +void APIENTRY bluegl_glFogxOES (GLenum pname, GLfixed param) { + typedef void (APIENTRYP PFN_glFogxOES) (GLenum pname, GLfixed param); + return ((PFN_glFogxOES)__blue_glCore_glFogxOES)(pname, param); +} + +extern void* __blue_glCore_glFogxvOES; +void APIENTRY bluegl_glFogxvOES (GLenum pname, const GLfixed *param) { + typedef void (APIENTRYP PFN_glFogxvOES) (GLenum pname, const GLfixed *param); + return ((PFN_glFogxvOES)__blue_glCore_glFogxvOES)(pname, param); +} + +extern void* __blue_glCore_glFrustumxOES; +void APIENTRY bluegl_glFrustumxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f) { + typedef void (APIENTRYP PFN_glFrustumxOES) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); + return ((PFN_glFrustumxOES)__blue_glCore_glFrustumxOES)(l, r, b, t, n, f); +} + +extern void* __blue_glCore_glGetClipPlanexOES; +void APIENTRY bluegl_glGetClipPlanexOES (GLenum plane, GLfixed *equation) { + typedef void (APIENTRYP PFN_glGetClipPlanexOES) (GLenum plane, GLfixed *equation); + return ((PFN_glGetClipPlanexOES)__blue_glCore_glGetClipPlanexOES)(plane, equation); +} + +extern void* __blue_glCore_glGetFixedvOES; +void APIENTRY bluegl_glGetFixedvOES (GLenum pname, GLfixed *params) { + typedef void (APIENTRYP PFN_glGetFixedvOES) (GLenum pname, GLfixed *params); + return ((PFN_glGetFixedvOES)__blue_glCore_glGetFixedvOES)(pname, params); +} + +extern void* __blue_glCore_glGetTexEnvxvOES; +void APIENTRY bluegl_glGetTexEnvxvOES (GLenum target, GLenum pname, GLfixed *params) { + typedef void (APIENTRYP PFN_glGetTexEnvxvOES) (GLenum target, GLenum pname, GLfixed *params); + return ((PFN_glGetTexEnvxvOES)__blue_glCore_glGetTexEnvxvOES)(target, pname, params); +} + +extern void* __blue_glCore_glGetTexParameterxvOES; +void APIENTRY bluegl_glGetTexParameterxvOES (GLenum target, GLenum pname, GLfixed *params) { + typedef void (APIENTRYP PFN_glGetTexParameterxvOES) (GLenum target, GLenum pname, GLfixed *params); + return ((PFN_glGetTexParameterxvOES)__blue_glCore_glGetTexParameterxvOES)(target, pname, params); +} + +extern void* __blue_glCore_glLightModelxOES; +void APIENTRY bluegl_glLightModelxOES (GLenum pname, GLfixed param) { + typedef void (APIENTRYP PFN_glLightModelxOES) (GLenum pname, GLfixed param); + return ((PFN_glLightModelxOES)__blue_glCore_glLightModelxOES)(pname, param); +} + +extern void* __blue_glCore_glLightModelxvOES; +void APIENTRY bluegl_glLightModelxvOES (GLenum pname, const GLfixed *param) { + typedef void (APIENTRYP PFN_glLightModelxvOES) (GLenum pname, const GLfixed *param); + return ((PFN_glLightModelxvOES)__blue_glCore_glLightModelxvOES)(pname, param); +} + +extern void* __blue_glCore_glLightxOES; +void APIENTRY bluegl_glLightxOES (GLenum light, GLenum pname, GLfixed param) { + typedef void (APIENTRYP PFN_glLightxOES) (GLenum light, GLenum pname, GLfixed param); + return ((PFN_glLightxOES)__blue_glCore_glLightxOES)(light, pname, param); +} + +extern void* __blue_glCore_glLightxvOES; +void APIENTRY bluegl_glLightxvOES (GLenum light, GLenum pname, const GLfixed *params) { + typedef void (APIENTRYP PFN_glLightxvOES) (GLenum light, GLenum pname, const GLfixed *params); + return ((PFN_glLightxvOES)__blue_glCore_glLightxvOES)(light, pname, params); +} + +extern void* __blue_glCore_glLineWidthxOES; +void APIENTRY bluegl_glLineWidthxOES (GLfixed width) { + typedef void (APIENTRYP PFN_glLineWidthxOES) (GLfixed width); + return ((PFN_glLineWidthxOES)__blue_glCore_glLineWidthxOES)(width); +} + +extern void* __blue_glCore_glLoadMatrixxOES; +void APIENTRY bluegl_glLoadMatrixxOES (const GLfixed *m) { + typedef void (APIENTRYP PFN_glLoadMatrixxOES) (const GLfixed *m); + return ((PFN_glLoadMatrixxOES)__blue_glCore_glLoadMatrixxOES)(m); +} + +extern void* __blue_glCore_glMaterialxOES; +void APIENTRY bluegl_glMaterialxOES (GLenum face, GLenum pname, GLfixed param) { + typedef void (APIENTRYP PFN_glMaterialxOES) (GLenum face, GLenum pname, GLfixed param); + return ((PFN_glMaterialxOES)__blue_glCore_glMaterialxOES)(face, pname, param); +} + +extern void* __blue_glCore_glMaterialxvOES; +void APIENTRY bluegl_glMaterialxvOES (GLenum face, GLenum pname, const GLfixed *param) { + typedef void (APIENTRYP PFN_glMaterialxvOES) (GLenum face, GLenum pname, const GLfixed *param); + return ((PFN_glMaterialxvOES)__blue_glCore_glMaterialxvOES)(face, pname, param); +} + +extern void* __blue_glCore_glMultMatrixxOES; +void APIENTRY bluegl_glMultMatrixxOES (const GLfixed *m) { + typedef void (APIENTRYP PFN_glMultMatrixxOES) (const GLfixed *m); + return ((PFN_glMultMatrixxOES)__blue_glCore_glMultMatrixxOES)(m); +} + +extern void* __blue_glCore_glMultiTexCoord4xOES; +void APIENTRY bluegl_glMultiTexCoord4xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q) { + typedef void (APIENTRYP PFN_glMultiTexCoord4xOES) (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); + return ((PFN_glMultiTexCoord4xOES)__blue_glCore_glMultiTexCoord4xOES)(texture, s, t, r, q); +} + +extern void* __blue_glCore_glNormal3xOES; +void APIENTRY bluegl_glNormal3xOES (GLfixed nx, GLfixed ny, GLfixed nz) { + typedef void (APIENTRYP PFN_glNormal3xOES) (GLfixed nx, GLfixed ny, GLfixed nz); + return ((PFN_glNormal3xOES)__blue_glCore_glNormal3xOES)(nx, ny, nz); +} + +extern void* __blue_glCore_glOrthoxOES; +void APIENTRY bluegl_glOrthoxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f) { + typedef void (APIENTRYP PFN_glOrthoxOES) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); + return ((PFN_glOrthoxOES)__blue_glCore_glOrthoxOES)(l, r, b, t, n, f); +} + +extern void* __blue_glCore_glPointParameterxvOES; +void APIENTRY bluegl_glPointParameterxvOES (GLenum pname, const GLfixed *params) { + typedef void (APIENTRYP PFN_glPointParameterxvOES) (GLenum pname, const GLfixed *params); + return ((PFN_glPointParameterxvOES)__blue_glCore_glPointParameterxvOES)(pname, params); +} + +extern void* __blue_glCore_glPointSizexOES; +void APIENTRY bluegl_glPointSizexOES (GLfixed size) { + typedef void (APIENTRYP PFN_glPointSizexOES) (GLfixed size); + return ((PFN_glPointSizexOES)__blue_glCore_glPointSizexOES)(size); +} + +extern void* __blue_glCore_glPolygonOffsetxOES; +void APIENTRY bluegl_glPolygonOffsetxOES (GLfixed factor, GLfixed units) { + typedef void (APIENTRYP PFN_glPolygonOffsetxOES) (GLfixed factor, GLfixed units); + return ((PFN_glPolygonOffsetxOES)__blue_glCore_glPolygonOffsetxOES)(factor, units); +} + +extern void* __blue_glCore_glRotatexOES; +void APIENTRY bluegl_glRotatexOES (GLfixed angle, GLfixed x, GLfixed y, GLfixed z) { + typedef void (APIENTRYP PFN_glRotatexOES) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); + return ((PFN_glRotatexOES)__blue_glCore_glRotatexOES)(angle, x, y, z); +} + +extern void* __blue_glCore_glScalexOES; +void APIENTRY bluegl_glScalexOES (GLfixed x, GLfixed y, GLfixed z) { + typedef void (APIENTRYP PFN_glScalexOES) (GLfixed x, GLfixed y, GLfixed z); + return ((PFN_glScalexOES)__blue_glCore_glScalexOES)(x, y, z); +} + +extern void* __blue_glCore_glTexEnvxOES; +void APIENTRY bluegl_glTexEnvxOES (GLenum target, GLenum pname, GLfixed param) { + typedef void (APIENTRYP PFN_glTexEnvxOES) (GLenum target, GLenum pname, GLfixed param); + return ((PFN_glTexEnvxOES)__blue_glCore_glTexEnvxOES)(target, pname, param); +} + +extern void* __blue_glCore_glTexEnvxvOES; +void APIENTRY bluegl_glTexEnvxvOES (GLenum target, GLenum pname, const GLfixed *params) { + typedef void (APIENTRYP PFN_glTexEnvxvOES) (GLenum target, GLenum pname, const GLfixed *params); + return ((PFN_glTexEnvxvOES)__blue_glCore_glTexEnvxvOES)(target, pname, params); +} + +extern void* __blue_glCore_glTexParameterxOES; +void APIENTRY bluegl_glTexParameterxOES (GLenum target, GLenum pname, GLfixed param) { + typedef void (APIENTRYP PFN_glTexParameterxOES) (GLenum target, GLenum pname, GLfixed param); + return ((PFN_glTexParameterxOES)__blue_glCore_glTexParameterxOES)(target, pname, param); +} + +extern void* __blue_glCore_glTexParameterxvOES; +void APIENTRY bluegl_glTexParameterxvOES (GLenum target, GLenum pname, const GLfixed *params) { + typedef void (APIENTRYP PFN_glTexParameterxvOES) (GLenum target, GLenum pname, const GLfixed *params); + return ((PFN_glTexParameterxvOES)__blue_glCore_glTexParameterxvOES)(target, pname, params); +} + +extern void* __blue_glCore_glTranslatexOES; +void APIENTRY bluegl_glTranslatexOES (GLfixed x, GLfixed y, GLfixed z) { + typedef void (APIENTRYP PFN_glTranslatexOES) (GLfixed x, GLfixed y, GLfixed z); + return ((PFN_glTranslatexOES)__blue_glCore_glTranslatexOES)(x, y, z); +} + +extern void* __blue_glCore_glAccumxOES; +void APIENTRY bluegl_glAccumxOES (GLenum op, GLfixed value) { + typedef void (APIENTRYP PFN_glAccumxOES) (GLenum op, GLfixed value); + return ((PFN_glAccumxOES)__blue_glCore_glAccumxOES)(op, value); +} + +extern void* __blue_glCore_glBitmapxOES; +void APIENTRY bluegl_glBitmapxOES (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap) { + typedef void (APIENTRYP PFN_glBitmapxOES) (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); + return ((PFN_glBitmapxOES)__blue_glCore_glBitmapxOES)(width, height, xorig, yorig, xmove, ymove, bitmap); +} + +extern void* __blue_glCore_glBlendColorxOES; +void APIENTRY bluegl_glBlendColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) { + typedef void (APIENTRYP PFN_glBlendColorxOES) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); + return ((PFN_glBlendColorxOES)__blue_glCore_glBlendColorxOES)(red, green, blue, alpha); +} + +extern void* __blue_glCore_glClearAccumxOES; +void APIENTRY bluegl_glClearAccumxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) { + typedef void (APIENTRYP PFN_glClearAccumxOES) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); + return ((PFN_glClearAccumxOES)__blue_glCore_glClearAccumxOES)(red, green, blue, alpha); +} + +extern void* __blue_glCore_glColor3xOES; +void APIENTRY bluegl_glColor3xOES (GLfixed red, GLfixed green, GLfixed blue) { + typedef void (APIENTRYP PFN_glColor3xOES) (GLfixed red, GLfixed green, GLfixed blue); + return ((PFN_glColor3xOES)__blue_glCore_glColor3xOES)(red, green, blue); +} + +extern void* __blue_glCore_glColor3xvOES; +void APIENTRY bluegl_glColor3xvOES (const GLfixed *components) { + typedef void (APIENTRYP PFN_glColor3xvOES) (const GLfixed *components); + return ((PFN_glColor3xvOES)__blue_glCore_glColor3xvOES)(components); +} + +extern void* __blue_glCore_glColor4xvOES; +void APIENTRY bluegl_glColor4xvOES (const GLfixed *components) { + typedef void (APIENTRYP PFN_glColor4xvOES) (const GLfixed *components); + return ((PFN_glColor4xvOES)__blue_glCore_glColor4xvOES)(components); +} + +extern void* __blue_glCore_glConvolutionParameterxOES; +void APIENTRY bluegl_glConvolutionParameterxOES (GLenum target, GLenum pname, GLfixed param) { + typedef void (APIENTRYP PFN_glConvolutionParameterxOES) (GLenum target, GLenum pname, GLfixed param); + return ((PFN_glConvolutionParameterxOES)__blue_glCore_glConvolutionParameterxOES)(target, pname, param); +} + +extern void* __blue_glCore_glConvolutionParameterxvOES; +void APIENTRY bluegl_glConvolutionParameterxvOES (GLenum target, GLenum pname, const GLfixed *params) { + typedef void (APIENTRYP PFN_glConvolutionParameterxvOES) (GLenum target, GLenum pname, const GLfixed *params); + return ((PFN_glConvolutionParameterxvOES)__blue_glCore_glConvolutionParameterxvOES)(target, pname, params); +} + +extern void* __blue_glCore_glEvalCoord1xOES; +void APIENTRY bluegl_glEvalCoord1xOES (GLfixed u) { + typedef void (APIENTRYP PFN_glEvalCoord1xOES) (GLfixed u); + return ((PFN_glEvalCoord1xOES)__blue_glCore_glEvalCoord1xOES)(u); +} + +extern void* __blue_glCore_glEvalCoord1xvOES; +void APIENTRY bluegl_glEvalCoord1xvOES (const GLfixed *coords) { + typedef void (APIENTRYP PFN_glEvalCoord1xvOES) (const GLfixed *coords); + return ((PFN_glEvalCoord1xvOES)__blue_glCore_glEvalCoord1xvOES)(coords); +} + +extern void* __blue_glCore_glEvalCoord2xOES; +void APIENTRY bluegl_glEvalCoord2xOES (GLfixed u, GLfixed v) { + typedef void (APIENTRYP PFN_glEvalCoord2xOES) (GLfixed u, GLfixed v); + return ((PFN_glEvalCoord2xOES)__blue_glCore_glEvalCoord2xOES)(u, v); +} + +extern void* __blue_glCore_glEvalCoord2xvOES; +void APIENTRY bluegl_glEvalCoord2xvOES (const GLfixed *coords) { + typedef void (APIENTRYP PFN_glEvalCoord2xvOES) (const GLfixed *coords); + return ((PFN_glEvalCoord2xvOES)__blue_glCore_glEvalCoord2xvOES)(coords); +} + +extern void* __blue_glCore_glFeedbackBufferxOES; +void APIENTRY bluegl_glFeedbackBufferxOES (GLsizei n, GLenum type, const GLfixed *buffer) { + typedef void (APIENTRYP PFN_glFeedbackBufferxOES) (GLsizei n, GLenum type, const GLfixed *buffer); + return ((PFN_glFeedbackBufferxOES)__blue_glCore_glFeedbackBufferxOES)(n, type, buffer); +} + +extern void* __blue_glCore_glGetConvolutionParameterxvOES; +void APIENTRY bluegl_glGetConvolutionParameterxvOES (GLenum target, GLenum pname, GLfixed *params) { + typedef void (APIENTRYP PFN_glGetConvolutionParameterxvOES) (GLenum target, GLenum pname, GLfixed *params); + return ((PFN_glGetConvolutionParameterxvOES)__blue_glCore_glGetConvolutionParameterxvOES)(target, pname, params); +} + +extern void* __blue_glCore_glGetHistogramParameterxvOES; +void APIENTRY bluegl_glGetHistogramParameterxvOES (GLenum target, GLenum pname, GLfixed *params) { + typedef void (APIENTRYP PFN_glGetHistogramParameterxvOES) (GLenum target, GLenum pname, GLfixed *params); + return ((PFN_glGetHistogramParameterxvOES)__blue_glCore_glGetHistogramParameterxvOES)(target, pname, params); +} + +extern void* __blue_glCore_glGetLightxOES; +void APIENTRY bluegl_glGetLightxOES (GLenum light, GLenum pname, GLfixed *params) { + typedef void (APIENTRYP PFN_glGetLightxOES) (GLenum light, GLenum pname, GLfixed *params); + return ((PFN_glGetLightxOES)__blue_glCore_glGetLightxOES)(light, pname, params); +} + +extern void* __blue_glCore_glGetMapxvOES; +void APIENTRY bluegl_glGetMapxvOES (GLenum target, GLenum query, GLfixed *v) { + typedef void (APIENTRYP PFN_glGetMapxvOES) (GLenum target, GLenum query, GLfixed *v); + return ((PFN_glGetMapxvOES)__blue_glCore_glGetMapxvOES)(target, query, v); +} + +extern void* __blue_glCore_glGetMaterialxOES; +void APIENTRY bluegl_glGetMaterialxOES (GLenum face, GLenum pname, GLfixed param) { + typedef void (APIENTRYP PFN_glGetMaterialxOES) (GLenum face, GLenum pname, GLfixed param); + return ((PFN_glGetMaterialxOES)__blue_glCore_glGetMaterialxOES)(face, pname, param); +} + +extern void* __blue_glCore_glGetPixelMapxv; +void APIENTRY bluegl_glGetPixelMapxv (GLenum map, GLint size, GLfixed *values) { + typedef void (APIENTRYP PFN_glGetPixelMapxv) (GLenum map, GLint size, GLfixed *values); + return ((PFN_glGetPixelMapxv)__blue_glCore_glGetPixelMapxv)(map, size, values); +} + +extern void* __blue_glCore_glGetTexGenxvOES; +void APIENTRY bluegl_glGetTexGenxvOES (GLenum coord, GLenum pname, GLfixed *params) { + typedef void (APIENTRYP PFN_glGetTexGenxvOES) (GLenum coord, GLenum pname, GLfixed *params); + return ((PFN_glGetTexGenxvOES)__blue_glCore_glGetTexGenxvOES)(coord, pname, params); +} + +extern void* __blue_glCore_glGetTexLevelParameterxvOES; +void APIENTRY bluegl_glGetTexLevelParameterxvOES (GLenum target, GLint level, GLenum pname, GLfixed *params) { + typedef void (APIENTRYP PFN_glGetTexLevelParameterxvOES) (GLenum target, GLint level, GLenum pname, GLfixed *params); + return ((PFN_glGetTexLevelParameterxvOES)__blue_glCore_glGetTexLevelParameterxvOES)(target, level, pname, params); +} + +extern void* __blue_glCore_glIndexxOES; +void APIENTRY bluegl_glIndexxOES (GLfixed component) { + typedef void (APIENTRYP PFN_glIndexxOES) (GLfixed component); + return ((PFN_glIndexxOES)__blue_glCore_glIndexxOES)(component); +} + +extern void* __blue_glCore_glIndexxvOES; +void APIENTRY bluegl_glIndexxvOES (const GLfixed *component) { + typedef void (APIENTRYP PFN_glIndexxvOES) (const GLfixed *component); + return ((PFN_glIndexxvOES)__blue_glCore_glIndexxvOES)(component); +} + +extern void* __blue_glCore_glLoadTransposeMatrixxOES; +void APIENTRY bluegl_glLoadTransposeMatrixxOES (const GLfixed *m) { + typedef void (APIENTRYP PFN_glLoadTransposeMatrixxOES) (const GLfixed *m); + return ((PFN_glLoadTransposeMatrixxOES)__blue_glCore_glLoadTransposeMatrixxOES)(m); +} + +extern void* __blue_glCore_glMap1xOES; +void APIENTRY bluegl_glMap1xOES (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points) { + typedef void (APIENTRYP PFN_glMap1xOES) (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); + return ((PFN_glMap1xOES)__blue_glCore_glMap1xOES)(target, u1, u2, stride, order, points); +} + +extern void* __blue_glCore_glMap2xOES; +void APIENTRY bluegl_glMap2xOES (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points) { + typedef void (APIENTRYP PFN_glMap2xOES) (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); + return ((PFN_glMap2xOES)__blue_glCore_glMap2xOES)(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); +} + +extern void* __blue_glCore_glMapGrid1xOES; +void APIENTRY bluegl_glMapGrid1xOES (GLint n, GLfixed u1, GLfixed u2) { + typedef void (APIENTRYP PFN_glMapGrid1xOES) (GLint n, GLfixed u1, GLfixed u2); + return ((PFN_glMapGrid1xOES)__blue_glCore_glMapGrid1xOES)(n, u1, u2); +} + +extern void* __blue_glCore_glMapGrid2xOES; +void APIENTRY bluegl_glMapGrid2xOES (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2) { + typedef void (APIENTRYP PFN_glMapGrid2xOES) (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); + return ((PFN_glMapGrid2xOES)__blue_glCore_glMapGrid2xOES)(n, u1, u2, v1, v2); +} + +extern void* __blue_glCore_glMultTransposeMatrixxOES; +void APIENTRY bluegl_glMultTransposeMatrixxOES (const GLfixed *m) { + typedef void (APIENTRYP PFN_glMultTransposeMatrixxOES) (const GLfixed *m); + return ((PFN_glMultTransposeMatrixxOES)__blue_glCore_glMultTransposeMatrixxOES)(m); +} + +extern void* __blue_glCore_glMultiTexCoord1xOES; +void APIENTRY bluegl_glMultiTexCoord1xOES (GLenum texture, GLfixed s) { + typedef void (APIENTRYP PFN_glMultiTexCoord1xOES) (GLenum texture, GLfixed s); + return ((PFN_glMultiTexCoord1xOES)__blue_glCore_glMultiTexCoord1xOES)(texture, s); +} + +extern void* __blue_glCore_glMultiTexCoord1xvOES; +void APIENTRY bluegl_glMultiTexCoord1xvOES (GLenum texture, const GLfixed *coords) { + typedef void (APIENTRYP PFN_glMultiTexCoord1xvOES) (GLenum texture, const GLfixed *coords); + return ((PFN_glMultiTexCoord1xvOES)__blue_glCore_glMultiTexCoord1xvOES)(texture, coords); +} + +extern void* __blue_glCore_glMultiTexCoord2xOES; +void APIENTRY bluegl_glMultiTexCoord2xOES (GLenum texture, GLfixed s, GLfixed t) { + typedef void (APIENTRYP PFN_glMultiTexCoord2xOES) (GLenum texture, GLfixed s, GLfixed t); + return ((PFN_glMultiTexCoord2xOES)__blue_glCore_glMultiTexCoord2xOES)(texture, s, t); +} + +extern void* __blue_glCore_glMultiTexCoord2xvOES; +void APIENTRY bluegl_glMultiTexCoord2xvOES (GLenum texture, const GLfixed *coords) { + typedef void (APIENTRYP PFN_glMultiTexCoord2xvOES) (GLenum texture, const GLfixed *coords); + return ((PFN_glMultiTexCoord2xvOES)__blue_glCore_glMultiTexCoord2xvOES)(texture, coords); +} + +extern void* __blue_glCore_glMultiTexCoord3xOES; +void APIENTRY bluegl_glMultiTexCoord3xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r) { + typedef void (APIENTRYP PFN_glMultiTexCoord3xOES) (GLenum texture, GLfixed s, GLfixed t, GLfixed r); + return ((PFN_glMultiTexCoord3xOES)__blue_glCore_glMultiTexCoord3xOES)(texture, s, t, r); +} + +extern void* __blue_glCore_glMultiTexCoord3xvOES; +void APIENTRY bluegl_glMultiTexCoord3xvOES (GLenum texture, const GLfixed *coords) { + typedef void (APIENTRYP PFN_glMultiTexCoord3xvOES) (GLenum texture, const GLfixed *coords); + return ((PFN_glMultiTexCoord3xvOES)__blue_glCore_glMultiTexCoord3xvOES)(texture, coords); +} + +extern void* __blue_glCore_glMultiTexCoord4xvOES; +void APIENTRY bluegl_glMultiTexCoord4xvOES (GLenum texture, const GLfixed *coords) { + typedef void (APIENTRYP PFN_glMultiTexCoord4xvOES) (GLenum texture, const GLfixed *coords); + return ((PFN_glMultiTexCoord4xvOES)__blue_glCore_glMultiTexCoord4xvOES)(texture, coords); +} + +extern void* __blue_glCore_glNormal3xvOES; +void APIENTRY bluegl_glNormal3xvOES (const GLfixed *coords) { + typedef void (APIENTRYP PFN_glNormal3xvOES) (const GLfixed *coords); + return ((PFN_glNormal3xvOES)__blue_glCore_glNormal3xvOES)(coords); +} + +extern void* __blue_glCore_glPassThroughxOES; +void APIENTRY bluegl_glPassThroughxOES (GLfixed token) { + typedef void (APIENTRYP PFN_glPassThroughxOES) (GLfixed token); + return ((PFN_glPassThroughxOES)__blue_glCore_glPassThroughxOES)(token); +} + +extern void* __blue_glCore_glPixelMapx; +void APIENTRY bluegl_glPixelMapx (GLenum map, GLint size, const GLfixed *values) { + typedef void (APIENTRYP PFN_glPixelMapx) (GLenum map, GLint size, const GLfixed *values); + return ((PFN_glPixelMapx)__blue_glCore_glPixelMapx)(map, size, values); +} + +extern void* __blue_glCore_glPixelStorex; +void APIENTRY bluegl_glPixelStorex (GLenum pname, GLfixed param) { + typedef void (APIENTRYP PFN_glPixelStorex) (GLenum pname, GLfixed param); + return ((PFN_glPixelStorex)__blue_glCore_glPixelStorex)(pname, param); +} + +extern void* __blue_glCore_glPixelTransferxOES; +void APIENTRY bluegl_glPixelTransferxOES (GLenum pname, GLfixed param) { + typedef void (APIENTRYP PFN_glPixelTransferxOES) (GLenum pname, GLfixed param); + return ((PFN_glPixelTransferxOES)__blue_glCore_glPixelTransferxOES)(pname, param); +} + +extern void* __blue_glCore_glPixelZoomxOES; +void APIENTRY bluegl_glPixelZoomxOES (GLfixed xfactor, GLfixed yfactor) { + typedef void (APIENTRYP PFN_glPixelZoomxOES) (GLfixed xfactor, GLfixed yfactor); + return ((PFN_glPixelZoomxOES)__blue_glCore_glPixelZoomxOES)(xfactor, yfactor); +} + +extern void* __blue_glCore_glPrioritizeTexturesxOES; +void APIENTRY bluegl_glPrioritizeTexturesxOES (GLsizei n, const GLuint *textures, const GLfixed *priorities) { + typedef void (APIENTRYP PFN_glPrioritizeTexturesxOES) (GLsizei n, const GLuint *textures, const GLfixed *priorities); + return ((PFN_glPrioritizeTexturesxOES)__blue_glCore_glPrioritizeTexturesxOES)(n, textures, priorities); +} + +extern void* __blue_glCore_glRasterPos2xOES; +void APIENTRY bluegl_glRasterPos2xOES (GLfixed x, GLfixed y) { + typedef void (APIENTRYP PFN_glRasterPos2xOES) (GLfixed x, GLfixed y); + return ((PFN_glRasterPos2xOES)__blue_glCore_glRasterPos2xOES)(x, y); +} + +extern void* __blue_glCore_glRasterPos2xvOES; +void APIENTRY bluegl_glRasterPos2xvOES (const GLfixed *coords) { + typedef void (APIENTRYP PFN_glRasterPos2xvOES) (const GLfixed *coords); + return ((PFN_glRasterPos2xvOES)__blue_glCore_glRasterPos2xvOES)(coords); +} + +extern void* __blue_glCore_glRasterPos3xOES; +void APIENTRY bluegl_glRasterPos3xOES (GLfixed x, GLfixed y, GLfixed z) { + typedef void (APIENTRYP PFN_glRasterPos3xOES) (GLfixed x, GLfixed y, GLfixed z); + return ((PFN_glRasterPos3xOES)__blue_glCore_glRasterPos3xOES)(x, y, z); +} + +extern void* __blue_glCore_glRasterPos3xvOES; +void APIENTRY bluegl_glRasterPos3xvOES (const GLfixed *coords) { + typedef void (APIENTRYP PFN_glRasterPos3xvOES) (const GLfixed *coords); + return ((PFN_glRasterPos3xvOES)__blue_glCore_glRasterPos3xvOES)(coords); +} + +extern void* __blue_glCore_glRasterPos4xOES; +void APIENTRY bluegl_glRasterPos4xOES (GLfixed x, GLfixed y, GLfixed z, GLfixed w) { + typedef void (APIENTRYP PFN_glRasterPos4xOES) (GLfixed x, GLfixed y, GLfixed z, GLfixed w); + return ((PFN_glRasterPos4xOES)__blue_glCore_glRasterPos4xOES)(x, y, z, w); +} + +extern void* __blue_glCore_glRasterPos4xvOES; +void APIENTRY bluegl_glRasterPos4xvOES (const GLfixed *coords) { + typedef void (APIENTRYP PFN_glRasterPos4xvOES) (const GLfixed *coords); + return ((PFN_glRasterPos4xvOES)__blue_glCore_glRasterPos4xvOES)(coords); +} + +extern void* __blue_glCore_glRectxOES; +void APIENTRY bluegl_glRectxOES (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2) { + typedef void (APIENTRYP PFN_glRectxOES) (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); + return ((PFN_glRectxOES)__blue_glCore_glRectxOES)(x1, y1, x2, y2); +} + +extern void* __blue_glCore_glRectxvOES; +void APIENTRY bluegl_glRectxvOES (const GLfixed *v1, const GLfixed *v2) { + typedef void (APIENTRYP PFN_glRectxvOES) (const GLfixed *v1, const GLfixed *v2); + return ((PFN_glRectxvOES)__blue_glCore_glRectxvOES)(v1, v2); +} + +extern void* __blue_glCore_glTexCoord1xOES; +void APIENTRY bluegl_glTexCoord1xOES (GLfixed s) { + typedef void (APIENTRYP PFN_glTexCoord1xOES) (GLfixed s); + return ((PFN_glTexCoord1xOES)__blue_glCore_glTexCoord1xOES)(s); +} + +extern void* __blue_glCore_glTexCoord1xvOES; +void APIENTRY bluegl_glTexCoord1xvOES (const GLfixed *coords) { + typedef void (APIENTRYP PFN_glTexCoord1xvOES) (const GLfixed *coords); + return ((PFN_glTexCoord1xvOES)__blue_glCore_glTexCoord1xvOES)(coords); +} + +extern void* __blue_glCore_glTexCoord2xOES; +void APIENTRY bluegl_glTexCoord2xOES (GLfixed s, GLfixed t) { + typedef void (APIENTRYP PFN_glTexCoord2xOES) (GLfixed s, GLfixed t); + return ((PFN_glTexCoord2xOES)__blue_glCore_glTexCoord2xOES)(s, t); +} + +extern void* __blue_glCore_glTexCoord2xvOES; +void APIENTRY bluegl_glTexCoord2xvOES (const GLfixed *coords) { + typedef void (APIENTRYP PFN_glTexCoord2xvOES) (const GLfixed *coords); + return ((PFN_glTexCoord2xvOES)__blue_glCore_glTexCoord2xvOES)(coords); +} + +extern void* __blue_glCore_glTexCoord3xOES; +void APIENTRY bluegl_glTexCoord3xOES (GLfixed s, GLfixed t, GLfixed r) { + typedef void (APIENTRYP PFN_glTexCoord3xOES) (GLfixed s, GLfixed t, GLfixed r); + return ((PFN_glTexCoord3xOES)__blue_glCore_glTexCoord3xOES)(s, t, r); +} + +extern void* __blue_glCore_glTexCoord3xvOES; +void APIENTRY bluegl_glTexCoord3xvOES (const GLfixed *coords) { + typedef void (APIENTRYP PFN_glTexCoord3xvOES) (const GLfixed *coords); + return ((PFN_glTexCoord3xvOES)__blue_glCore_glTexCoord3xvOES)(coords); +} + +extern void* __blue_glCore_glTexCoord4xOES; +void APIENTRY bluegl_glTexCoord4xOES (GLfixed s, GLfixed t, GLfixed r, GLfixed q) { + typedef void (APIENTRYP PFN_glTexCoord4xOES) (GLfixed s, GLfixed t, GLfixed r, GLfixed q); + return ((PFN_glTexCoord4xOES)__blue_glCore_glTexCoord4xOES)(s, t, r, q); +} + +extern void* __blue_glCore_glTexCoord4xvOES; +void APIENTRY bluegl_glTexCoord4xvOES (const GLfixed *coords) { + typedef void (APIENTRYP PFN_glTexCoord4xvOES) (const GLfixed *coords); + return ((PFN_glTexCoord4xvOES)__blue_glCore_glTexCoord4xvOES)(coords); +} + +extern void* __blue_glCore_glTexGenxOES; +void APIENTRY bluegl_glTexGenxOES (GLenum coord, GLenum pname, GLfixed param) { + typedef void (APIENTRYP PFN_glTexGenxOES) (GLenum coord, GLenum pname, GLfixed param); + return ((PFN_glTexGenxOES)__blue_glCore_glTexGenxOES)(coord, pname, param); +} + +extern void* __blue_glCore_glTexGenxvOES; +void APIENTRY bluegl_glTexGenxvOES (GLenum coord, GLenum pname, const GLfixed *params) { + typedef void (APIENTRYP PFN_glTexGenxvOES) (GLenum coord, GLenum pname, const GLfixed *params); + return ((PFN_glTexGenxvOES)__blue_glCore_glTexGenxvOES)(coord, pname, params); +} + +extern void* __blue_glCore_glVertex2xOES; +void APIENTRY bluegl_glVertex2xOES (GLfixed x) { + typedef void (APIENTRYP PFN_glVertex2xOES) (GLfixed x); + return ((PFN_glVertex2xOES)__blue_glCore_glVertex2xOES)(x); +} + +extern void* __blue_glCore_glVertex2xvOES; +void APIENTRY bluegl_glVertex2xvOES (const GLfixed *coords) { + typedef void (APIENTRYP PFN_glVertex2xvOES) (const GLfixed *coords); + return ((PFN_glVertex2xvOES)__blue_glCore_glVertex2xvOES)(coords); +} + +extern void* __blue_glCore_glVertex3xOES; +void APIENTRY bluegl_glVertex3xOES (GLfixed x, GLfixed y) { + typedef void (APIENTRYP PFN_glVertex3xOES) (GLfixed x, GLfixed y); + return ((PFN_glVertex3xOES)__blue_glCore_glVertex3xOES)(x, y); +} + +extern void* __blue_glCore_glVertex3xvOES; +void APIENTRY bluegl_glVertex3xvOES (const GLfixed *coords) { + typedef void (APIENTRYP PFN_glVertex3xvOES) (const GLfixed *coords); + return ((PFN_glVertex3xvOES)__blue_glCore_glVertex3xvOES)(coords); +} + +extern void* __blue_glCore_glVertex4xOES; +void APIENTRY bluegl_glVertex4xOES (GLfixed x, GLfixed y, GLfixed z) { + typedef void (APIENTRYP PFN_glVertex4xOES) (GLfixed x, GLfixed y, GLfixed z); + return ((PFN_glVertex4xOES)__blue_glCore_glVertex4xOES)(x, y, z); +} + +extern void* __blue_glCore_glVertex4xvOES; +void APIENTRY bluegl_glVertex4xvOES (const GLfixed *coords) { + typedef void (APIENTRYP PFN_glVertex4xvOES) (const GLfixed *coords); + return ((PFN_glVertex4xvOES)__blue_glCore_glVertex4xvOES)(coords); +} + +extern void* __blue_glCore_glQueryMatrixxOES; +GLbitfield APIENTRY bluegl_glQueryMatrixxOES (GLfixed *mantissa, GLint *exponent) { + typedef GLbitfield (APIENTRYP PFN_glQueryMatrixxOES) (GLfixed *mantissa, GLint *exponent); + return ((PFN_glQueryMatrixxOES)__blue_glCore_glQueryMatrixxOES)(mantissa, exponent); +} + +extern void* __blue_glCore_glClearDepthfOES; +void APIENTRY bluegl_glClearDepthfOES (GLclampf depth) { + typedef void (APIENTRYP PFN_glClearDepthfOES) (GLclampf depth); + return ((PFN_glClearDepthfOES)__blue_glCore_glClearDepthfOES)(depth); +} + +extern void* __blue_glCore_glClipPlanefOES; +void APIENTRY bluegl_glClipPlanefOES (GLenum plane, const GLfloat *equation) { + typedef void (APIENTRYP PFN_glClipPlanefOES) (GLenum plane, const GLfloat *equation); + return ((PFN_glClipPlanefOES)__blue_glCore_glClipPlanefOES)(plane, equation); +} + +extern void* __blue_glCore_glDepthRangefOES; +void APIENTRY bluegl_glDepthRangefOES (GLclampf n, GLclampf f) { + typedef void (APIENTRYP PFN_glDepthRangefOES) (GLclampf n, GLclampf f); + return ((PFN_glDepthRangefOES)__blue_glCore_glDepthRangefOES)(n, f); +} + +extern void* __blue_glCore_glFrustumfOES; +void APIENTRY bluegl_glFrustumfOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f) { + typedef void (APIENTRYP PFN_glFrustumfOES) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); + return ((PFN_glFrustumfOES)__blue_glCore_glFrustumfOES)(l, r, b, t, n, f); +} + +extern void* __blue_glCore_glGetClipPlanefOES; +void APIENTRY bluegl_glGetClipPlanefOES (GLenum plane, GLfloat *equation) { + typedef void (APIENTRYP PFN_glGetClipPlanefOES) (GLenum plane, GLfloat *equation); + return ((PFN_glGetClipPlanefOES)__blue_glCore_glGetClipPlanefOES)(plane, equation); +} + +extern void* __blue_glCore_glOrthofOES; +void APIENTRY bluegl_glOrthofOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f) { + typedef void (APIENTRYP PFN_glOrthofOES) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); + return ((PFN_glOrthofOES)__blue_glCore_glOrthofOES)(l, r, b, t, n, f); +} + +extern void* __blue_glCore_glTbufferMask3DFX; +void APIENTRY bluegl_glTbufferMask3DFX (GLuint mask) { + typedef void (APIENTRYP PFN_glTbufferMask3DFX) (GLuint mask); + return ((PFN_glTbufferMask3DFX)__blue_glCore_glTbufferMask3DFX)(mask); +} + +extern void* __blue_glCore_glDebugMessageEnableAMD; +void APIENTRY bluegl_glDebugMessageEnableAMD (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled) { + typedef void (APIENTRYP PFN_glDebugMessageEnableAMD) (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); + return ((PFN_glDebugMessageEnableAMD)__blue_glCore_glDebugMessageEnableAMD)(category, severity, count, ids, enabled); +} + +extern void* __blue_glCore_glDebugMessageInsertAMD; +void APIENTRY bluegl_glDebugMessageInsertAMD (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf) { + typedef void (APIENTRYP PFN_glDebugMessageInsertAMD) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); + return ((PFN_glDebugMessageInsertAMD)__blue_glCore_glDebugMessageInsertAMD)(category, severity, id, length, buf); +} + +extern void* __blue_glCore_glDebugMessageCallbackAMD; +void APIENTRY bluegl_glDebugMessageCallbackAMD (GLDEBUGPROCAMD callback, void *userParam) { + typedef void (APIENTRYP PFN_glDebugMessageCallbackAMD) (GLDEBUGPROCAMD callback, void *userParam); + return ((PFN_glDebugMessageCallbackAMD)__blue_glCore_glDebugMessageCallbackAMD)(callback, userParam); +} + +extern void* __blue_glCore_glGetDebugMessageLogAMD; +GLuint APIENTRY bluegl_glGetDebugMessageLogAMD (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message) { + typedef GLuint (APIENTRYP PFN_glGetDebugMessageLogAMD) (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); + return ((PFN_glGetDebugMessageLogAMD)__blue_glCore_glGetDebugMessageLogAMD)(count, bufsize, categories, severities, ids, lengths, message); +} + +extern void* __blue_glCore_glBlendFuncIndexedAMD; +void APIENTRY bluegl_glBlendFuncIndexedAMD (GLuint buf, GLenum src, GLenum dst) { + typedef void (APIENTRYP PFN_glBlendFuncIndexedAMD) (GLuint buf, GLenum src, GLenum dst); + return ((PFN_glBlendFuncIndexedAMD)__blue_glCore_glBlendFuncIndexedAMD)(buf, src, dst); +} + +extern void* __blue_glCore_glBlendFuncSeparateIndexedAMD; +void APIENTRY bluegl_glBlendFuncSeparateIndexedAMD (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { + typedef void (APIENTRYP PFN_glBlendFuncSeparateIndexedAMD) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); + return ((PFN_glBlendFuncSeparateIndexedAMD)__blue_glCore_glBlendFuncSeparateIndexedAMD)(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); +} + +extern void* __blue_glCore_glBlendEquationIndexedAMD; +void APIENTRY bluegl_glBlendEquationIndexedAMD (GLuint buf, GLenum mode) { + typedef void (APIENTRYP PFN_glBlendEquationIndexedAMD) (GLuint buf, GLenum mode); + return ((PFN_glBlendEquationIndexedAMD)__blue_glCore_glBlendEquationIndexedAMD)(buf, mode); +} + +extern void* __blue_glCore_glBlendEquationSeparateIndexedAMD; +void APIENTRY bluegl_glBlendEquationSeparateIndexedAMD (GLuint buf, GLenum modeRGB, GLenum modeAlpha) { + typedef void (APIENTRYP PFN_glBlendEquationSeparateIndexedAMD) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); + return ((PFN_glBlendEquationSeparateIndexedAMD)__blue_glCore_glBlendEquationSeparateIndexedAMD)(buf, modeRGB, modeAlpha); +} + +extern void* __blue_glCore_glUniform1i64NV; +void APIENTRY bluegl_glUniform1i64NV (GLint location, GLint64EXT x) { + typedef void (APIENTRYP PFN_glUniform1i64NV) (GLint location, GLint64EXT x); + return ((PFN_glUniform1i64NV)__blue_glCore_glUniform1i64NV)(location, x); +} + +extern void* __blue_glCore_glUniform2i64NV; +void APIENTRY bluegl_glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y) { + typedef void (APIENTRYP PFN_glUniform2i64NV) (GLint location, GLint64EXT x, GLint64EXT y); + return ((PFN_glUniform2i64NV)__blue_glCore_glUniform2i64NV)(location, x, y); +} + +extern void* __blue_glCore_glUniform3i64NV; +void APIENTRY bluegl_glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z) { + typedef void (APIENTRYP PFN_glUniform3i64NV) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); + return ((PFN_glUniform3i64NV)__blue_glCore_glUniform3i64NV)(location, x, y, z); +} + +extern void* __blue_glCore_glUniform4i64NV; +void APIENTRY bluegl_glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w) { + typedef void (APIENTRYP PFN_glUniform4i64NV) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); + return ((PFN_glUniform4i64NV)__blue_glCore_glUniform4i64NV)(location, x, y, z, w); +} + +extern void* __blue_glCore_glUniform1i64vNV; +void APIENTRY bluegl_glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value) { + typedef void (APIENTRYP PFN_glUniform1i64vNV) (GLint location, GLsizei count, const GLint64EXT *value); + return ((PFN_glUniform1i64vNV)__blue_glCore_glUniform1i64vNV)(location, count, value); +} + +extern void* __blue_glCore_glUniform2i64vNV; +void APIENTRY bluegl_glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value) { + typedef void (APIENTRYP PFN_glUniform2i64vNV) (GLint location, GLsizei count, const GLint64EXT *value); + return ((PFN_glUniform2i64vNV)__blue_glCore_glUniform2i64vNV)(location, count, value); +} + +extern void* __blue_glCore_glUniform3i64vNV; +void APIENTRY bluegl_glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value) { + typedef void (APIENTRYP PFN_glUniform3i64vNV) (GLint location, GLsizei count, const GLint64EXT *value); + return ((PFN_glUniform3i64vNV)__blue_glCore_glUniform3i64vNV)(location, count, value); +} + +extern void* __blue_glCore_glUniform4i64vNV; +void APIENTRY bluegl_glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value) { + typedef void (APIENTRYP PFN_glUniform4i64vNV) (GLint location, GLsizei count, const GLint64EXT *value); + return ((PFN_glUniform4i64vNV)__blue_glCore_glUniform4i64vNV)(location, count, value); +} + +extern void* __blue_glCore_glUniform1ui64NV; +void APIENTRY bluegl_glUniform1ui64NV (GLint location, GLuint64EXT x) { + typedef void (APIENTRYP PFN_glUniform1ui64NV) (GLint location, GLuint64EXT x); + return ((PFN_glUniform1ui64NV)__blue_glCore_glUniform1ui64NV)(location, x); +} + +extern void* __blue_glCore_glUniform2ui64NV; +void APIENTRY bluegl_glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y) { + typedef void (APIENTRYP PFN_glUniform2ui64NV) (GLint location, GLuint64EXT x, GLuint64EXT y); + return ((PFN_glUniform2ui64NV)__blue_glCore_glUniform2ui64NV)(location, x, y); +} + +extern void* __blue_glCore_glUniform3ui64NV; +void APIENTRY bluegl_glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z) { + typedef void (APIENTRYP PFN_glUniform3ui64NV) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); + return ((PFN_glUniform3ui64NV)__blue_glCore_glUniform3ui64NV)(location, x, y, z); +} + +extern void* __blue_glCore_glUniform4ui64NV; +void APIENTRY bluegl_glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w) { + typedef void (APIENTRYP PFN_glUniform4ui64NV) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); + return ((PFN_glUniform4ui64NV)__blue_glCore_glUniform4ui64NV)(location, x, y, z, w); +} + +extern void* __blue_glCore_glUniform1ui64vNV; +void APIENTRY bluegl_glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value) { + typedef void (APIENTRYP PFN_glUniform1ui64vNV) (GLint location, GLsizei count, const GLuint64EXT *value); + return ((PFN_glUniform1ui64vNV)__blue_glCore_glUniform1ui64vNV)(location, count, value); +} + +extern void* __blue_glCore_glUniform2ui64vNV; +void APIENTRY bluegl_glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value) { + typedef void (APIENTRYP PFN_glUniform2ui64vNV) (GLint location, GLsizei count, const GLuint64EXT *value); + return ((PFN_glUniform2ui64vNV)__blue_glCore_glUniform2ui64vNV)(location, count, value); +} + +extern void* __blue_glCore_glUniform3ui64vNV; +void APIENTRY bluegl_glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value) { + typedef void (APIENTRYP PFN_glUniform3ui64vNV) (GLint location, GLsizei count, const GLuint64EXT *value); + return ((PFN_glUniform3ui64vNV)__blue_glCore_glUniform3ui64vNV)(location, count, value); +} + +extern void* __blue_glCore_glUniform4ui64vNV; +void APIENTRY bluegl_glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value) { + typedef void (APIENTRYP PFN_glUniform4ui64vNV) (GLint location, GLsizei count, const GLuint64EXT *value); + return ((PFN_glUniform4ui64vNV)__blue_glCore_glUniform4ui64vNV)(location, count, value); +} + +extern void* __blue_glCore_glGetUniformi64vNV; +void APIENTRY bluegl_glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params) { + typedef void (APIENTRYP PFN_glGetUniformi64vNV) (GLuint program, GLint location, GLint64EXT *params); + return ((PFN_glGetUniformi64vNV)__blue_glCore_glGetUniformi64vNV)(program, location, params); +} + +extern void* __blue_glCore_glGetUniformui64vNV; +void APIENTRY bluegl_glGetUniformui64vNV (GLuint program, GLint location, GLuint64EXT *params) { + typedef void (APIENTRYP PFN_glGetUniformui64vNV) (GLuint program, GLint location, GLuint64EXT *params); + return ((PFN_glGetUniformui64vNV)__blue_glCore_glGetUniformui64vNV)(program, location, params); +} + +extern void* __blue_glCore_glProgramUniform1i64NV; +void APIENTRY bluegl_glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x) { + typedef void (APIENTRYP PFN_glProgramUniform1i64NV) (GLuint program, GLint location, GLint64EXT x); + return ((PFN_glProgramUniform1i64NV)__blue_glCore_glProgramUniform1i64NV)(program, location, x); +} + +extern void* __blue_glCore_glProgramUniform2i64NV; +void APIENTRY bluegl_glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y) { + typedef void (APIENTRYP PFN_glProgramUniform2i64NV) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); + return ((PFN_glProgramUniform2i64NV)__blue_glCore_glProgramUniform2i64NV)(program, location, x, y); +} + +extern void* __blue_glCore_glProgramUniform3i64NV; +void APIENTRY bluegl_glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z) { + typedef void (APIENTRYP PFN_glProgramUniform3i64NV) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); + return ((PFN_glProgramUniform3i64NV)__blue_glCore_glProgramUniform3i64NV)(program, location, x, y, z); +} + +extern void* __blue_glCore_glProgramUniform4i64NV; +void APIENTRY bluegl_glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w) { + typedef void (APIENTRYP PFN_glProgramUniform4i64NV) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); + return ((PFN_glProgramUniform4i64NV)__blue_glCore_glProgramUniform4i64NV)(program, location, x, y, z, w); +} + +extern void* __blue_glCore_glProgramUniform1i64vNV; +void APIENTRY bluegl_glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value) { + typedef void (APIENTRYP PFN_glProgramUniform1i64vNV) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); + return ((PFN_glProgramUniform1i64vNV)__blue_glCore_glProgramUniform1i64vNV)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform2i64vNV; +void APIENTRY bluegl_glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value) { + typedef void (APIENTRYP PFN_glProgramUniform2i64vNV) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); + return ((PFN_glProgramUniform2i64vNV)__blue_glCore_glProgramUniform2i64vNV)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform3i64vNV; +void APIENTRY bluegl_glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value) { + typedef void (APIENTRYP PFN_glProgramUniform3i64vNV) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); + return ((PFN_glProgramUniform3i64vNV)__blue_glCore_glProgramUniform3i64vNV)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform4i64vNV; +void APIENTRY bluegl_glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value) { + typedef void (APIENTRYP PFN_glProgramUniform4i64vNV) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); + return ((PFN_glProgramUniform4i64vNV)__blue_glCore_glProgramUniform4i64vNV)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform1ui64NV; +void APIENTRY bluegl_glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x) { + typedef void (APIENTRYP PFN_glProgramUniform1ui64NV) (GLuint program, GLint location, GLuint64EXT x); + return ((PFN_glProgramUniform1ui64NV)__blue_glCore_glProgramUniform1ui64NV)(program, location, x); +} + +extern void* __blue_glCore_glProgramUniform2ui64NV; +void APIENTRY bluegl_glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y) { + typedef void (APIENTRYP PFN_glProgramUniform2ui64NV) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); + return ((PFN_glProgramUniform2ui64NV)__blue_glCore_glProgramUniform2ui64NV)(program, location, x, y); +} + +extern void* __blue_glCore_glProgramUniform3ui64NV; +void APIENTRY bluegl_glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z) { + typedef void (APIENTRYP PFN_glProgramUniform3ui64NV) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); + return ((PFN_glProgramUniform3ui64NV)__blue_glCore_glProgramUniform3ui64NV)(program, location, x, y, z); +} + +extern void* __blue_glCore_glProgramUniform4ui64NV; +void APIENTRY bluegl_glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w) { + typedef void (APIENTRYP PFN_glProgramUniform4ui64NV) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); + return ((PFN_glProgramUniform4ui64NV)__blue_glCore_glProgramUniform4ui64NV)(program, location, x, y, z, w); +} + +extern void* __blue_glCore_glProgramUniform1ui64vNV; +void APIENTRY bluegl_glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value) { + typedef void (APIENTRYP PFN_glProgramUniform1ui64vNV) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); + return ((PFN_glProgramUniform1ui64vNV)__blue_glCore_glProgramUniform1ui64vNV)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform2ui64vNV; +void APIENTRY bluegl_glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value) { + typedef void (APIENTRYP PFN_glProgramUniform2ui64vNV) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); + return ((PFN_glProgramUniform2ui64vNV)__blue_glCore_glProgramUniform2ui64vNV)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform3ui64vNV; +void APIENTRY bluegl_glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value) { + typedef void (APIENTRYP PFN_glProgramUniform3ui64vNV) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); + return ((PFN_glProgramUniform3ui64vNV)__blue_glCore_glProgramUniform3ui64vNV)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform4ui64vNV; +void APIENTRY bluegl_glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value) { + typedef void (APIENTRYP PFN_glProgramUniform4ui64vNV) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); + return ((PFN_glProgramUniform4ui64vNV)__blue_glCore_glProgramUniform4ui64vNV)(program, location, count, value); +} + +extern void* __blue_glCore_glVertexAttribParameteriAMD; +void APIENTRY bluegl_glVertexAttribParameteriAMD (GLuint index, GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glVertexAttribParameteriAMD) (GLuint index, GLenum pname, GLint param); + return ((PFN_glVertexAttribParameteriAMD)__blue_glCore_glVertexAttribParameteriAMD)(index, pname, param); +} + +extern void* __blue_glCore_glMultiDrawArraysIndirectAMD; +void APIENTRY bluegl_glMultiDrawArraysIndirectAMD (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride) { + typedef void (APIENTRYP PFN_glMultiDrawArraysIndirectAMD) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); + return ((PFN_glMultiDrawArraysIndirectAMD)__blue_glCore_glMultiDrawArraysIndirectAMD)(mode, indirect, primcount, stride); +} + +extern void* __blue_glCore_glMultiDrawElementsIndirectAMD; +void APIENTRY bluegl_glMultiDrawElementsIndirectAMD (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride) { + typedef void (APIENTRYP PFN_glMultiDrawElementsIndirectAMD) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); + return ((PFN_glMultiDrawElementsIndirectAMD)__blue_glCore_glMultiDrawElementsIndirectAMD)(mode, type, indirect, primcount, stride); +} + +extern void* __blue_glCore_glGenNamesAMD; +void APIENTRY bluegl_glGenNamesAMD (GLenum identifier, GLuint num, GLuint *names) { + typedef void (APIENTRYP PFN_glGenNamesAMD) (GLenum identifier, GLuint num, GLuint *names); + return ((PFN_glGenNamesAMD)__blue_glCore_glGenNamesAMD)(identifier, num, names); +} + +extern void* __blue_glCore_glDeleteNamesAMD; +void APIENTRY bluegl_glDeleteNamesAMD (GLenum identifier, GLuint num, const GLuint *names) { + typedef void (APIENTRYP PFN_glDeleteNamesAMD) (GLenum identifier, GLuint num, const GLuint *names); + return ((PFN_glDeleteNamesAMD)__blue_glCore_glDeleteNamesAMD)(identifier, num, names); +} + +extern void* __blue_glCore_glIsNameAMD; +GLboolean APIENTRY bluegl_glIsNameAMD (GLenum identifier, GLuint name) { + typedef GLboolean (APIENTRYP PFN_glIsNameAMD) (GLenum identifier, GLuint name); + return ((PFN_glIsNameAMD)__blue_glCore_glIsNameAMD)(identifier, name); +} + +extern void* __blue_glCore_glQueryObjectParameteruiAMD; +void APIENTRY bluegl_glQueryObjectParameteruiAMD (GLenum target, GLuint id, GLenum pname, GLuint param) { + typedef void (APIENTRYP PFN_glQueryObjectParameteruiAMD) (GLenum target, GLuint id, GLenum pname, GLuint param); + return ((PFN_glQueryObjectParameteruiAMD)__blue_glCore_glQueryObjectParameteruiAMD)(target, id, pname, param); +} + +extern void* __blue_glCore_glGetPerfMonitorGroupsAMD; +void APIENTRY bluegl_glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups) { + typedef void (APIENTRYP PFN_glGetPerfMonitorGroupsAMD) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); + return ((PFN_glGetPerfMonitorGroupsAMD)__blue_glCore_glGetPerfMonitorGroupsAMD)(numGroups, groupsSize, groups); +} + +extern void* __blue_glCore_glGetPerfMonitorCountersAMD; +void APIENTRY bluegl_glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters) { + typedef void (APIENTRYP PFN_glGetPerfMonitorCountersAMD) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); + return ((PFN_glGetPerfMonitorCountersAMD)__blue_glCore_glGetPerfMonitorCountersAMD)(group, numCounters, maxActiveCounters, counterSize, counters); +} + +extern void* __blue_glCore_glGetPerfMonitorGroupStringAMD; +void APIENTRY bluegl_glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString) { + typedef void (APIENTRYP PFN_glGetPerfMonitorGroupStringAMD) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); + return ((PFN_glGetPerfMonitorGroupStringAMD)__blue_glCore_glGetPerfMonitorGroupStringAMD)(group, bufSize, length, groupString); +} + +extern void* __blue_glCore_glGetPerfMonitorCounterStringAMD; +void APIENTRY bluegl_glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString) { + typedef void (APIENTRYP PFN_glGetPerfMonitorCounterStringAMD) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); + return ((PFN_glGetPerfMonitorCounterStringAMD)__blue_glCore_glGetPerfMonitorCounterStringAMD)(group, counter, bufSize, length, counterString); +} + +extern void* __blue_glCore_glGetPerfMonitorCounterInfoAMD; +void APIENTRY bluegl_glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data) { + typedef void (APIENTRYP PFN_glGetPerfMonitorCounterInfoAMD) (GLuint group, GLuint counter, GLenum pname, void *data); + return ((PFN_glGetPerfMonitorCounterInfoAMD)__blue_glCore_glGetPerfMonitorCounterInfoAMD)(group, counter, pname, data); +} + +extern void* __blue_glCore_glGenPerfMonitorsAMD; +void APIENTRY bluegl_glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors) { + typedef void (APIENTRYP PFN_glGenPerfMonitorsAMD) (GLsizei n, GLuint *monitors); + return ((PFN_glGenPerfMonitorsAMD)__blue_glCore_glGenPerfMonitorsAMD)(n, monitors); +} + +extern void* __blue_glCore_glDeletePerfMonitorsAMD; +void APIENTRY bluegl_glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors) { + typedef void (APIENTRYP PFN_glDeletePerfMonitorsAMD) (GLsizei n, GLuint *monitors); + return ((PFN_glDeletePerfMonitorsAMD)__blue_glCore_glDeletePerfMonitorsAMD)(n, monitors); +} + +extern void* __blue_glCore_glSelectPerfMonitorCountersAMD; +void APIENTRY bluegl_glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList) { + typedef void (APIENTRYP PFN_glSelectPerfMonitorCountersAMD) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); + return ((PFN_glSelectPerfMonitorCountersAMD)__blue_glCore_glSelectPerfMonitorCountersAMD)(monitor, enable, group, numCounters, counterList); +} + +extern void* __blue_glCore_glBeginPerfMonitorAMD; +void APIENTRY bluegl_glBeginPerfMonitorAMD (GLuint monitor) { + typedef void (APIENTRYP PFN_glBeginPerfMonitorAMD) (GLuint monitor); + return ((PFN_glBeginPerfMonitorAMD)__blue_glCore_glBeginPerfMonitorAMD)(monitor); +} + +extern void* __blue_glCore_glEndPerfMonitorAMD; +void APIENTRY bluegl_glEndPerfMonitorAMD (GLuint monitor) { + typedef void (APIENTRYP PFN_glEndPerfMonitorAMD) (GLuint monitor); + return ((PFN_glEndPerfMonitorAMD)__blue_glCore_glEndPerfMonitorAMD)(monitor); +} + +extern void* __blue_glCore_glGetPerfMonitorCounterDataAMD; +void APIENTRY bluegl_glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten) { + typedef void (APIENTRYP PFN_glGetPerfMonitorCounterDataAMD) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); + return ((PFN_glGetPerfMonitorCounterDataAMD)__blue_glCore_glGetPerfMonitorCounterDataAMD)(monitor, pname, dataSize, data, bytesWritten); +} + +extern void* __blue_glCore_glSetMultisamplefvAMD; +void APIENTRY bluegl_glSetMultisamplefvAMD (GLenum pname, GLuint index, const GLfloat *val) { + typedef void (APIENTRYP PFN_glSetMultisamplefvAMD) (GLenum pname, GLuint index, const GLfloat *val); + return ((PFN_glSetMultisamplefvAMD)__blue_glCore_glSetMultisamplefvAMD)(pname, index, val); +} + +extern void* __blue_glCore_glTexStorageSparseAMD; +void APIENTRY bluegl_glTexStorageSparseAMD (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags) { + typedef void (APIENTRYP PFN_glTexStorageSparseAMD) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); + return ((PFN_glTexStorageSparseAMD)__blue_glCore_glTexStorageSparseAMD)(target, internalFormat, width, height, depth, layers, flags); +} + +extern void* __blue_glCore_glTextureStorageSparseAMD; +void APIENTRY bluegl_glTextureStorageSparseAMD (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags) { + typedef void (APIENTRYP PFN_glTextureStorageSparseAMD) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); + return ((PFN_glTextureStorageSparseAMD)__blue_glCore_glTextureStorageSparseAMD)(texture, target, internalFormat, width, height, depth, layers, flags); +} + +extern void* __blue_glCore_glStencilOpValueAMD; +void APIENTRY bluegl_glStencilOpValueAMD (GLenum face, GLuint value) { + typedef void (APIENTRYP PFN_glStencilOpValueAMD) (GLenum face, GLuint value); + return ((PFN_glStencilOpValueAMD)__blue_glCore_glStencilOpValueAMD)(face, value); +} + +extern void* __blue_glCore_glTessellationFactorAMD; +void APIENTRY bluegl_glTessellationFactorAMD (GLfloat factor) { + typedef void (APIENTRYP PFN_glTessellationFactorAMD) (GLfloat factor); + return ((PFN_glTessellationFactorAMD)__blue_glCore_glTessellationFactorAMD)(factor); +} + +extern void* __blue_glCore_glTessellationModeAMD; +void APIENTRY bluegl_glTessellationModeAMD (GLenum mode) { + typedef void (APIENTRYP PFN_glTessellationModeAMD) (GLenum mode); + return ((PFN_glTessellationModeAMD)__blue_glCore_glTessellationModeAMD)(mode); +} + +extern void* __blue_glCore_glElementPointerAPPLE; +void APIENTRY bluegl_glElementPointerAPPLE (GLenum type, const void *pointer) { + typedef void (APIENTRYP PFN_glElementPointerAPPLE) (GLenum type, const void *pointer); + return ((PFN_glElementPointerAPPLE)__blue_glCore_glElementPointerAPPLE)(type, pointer); +} + +extern void* __blue_glCore_glDrawElementArrayAPPLE; +void APIENTRY bluegl_glDrawElementArrayAPPLE (GLenum mode, GLint first, GLsizei count) { + typedef void (APIENTRYP PFN_glDrawElementArrayAPPLE) (GLenum mode, GLint first, GLsizei count); + return ((PFN_glDrawElementArrayAPPLE)__blue_glCore_glDrawElementArrayAPPLE)(mode, first, count); +} + +extern void* __blue_glCore_glDrawRangeElementArrayAPPLE; +void APIENTRY bluegl_glDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count) { + typedef void (APIENTRYP PFN_glDrawRangeElementArrayAPPLE) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); + return ((PFN_glDrawRangeElementArrayAPPLE)__blue_glCore_glDrawRangeElementArrayAPPLE)(mode, start, end, first, count); +} + +extern void* __blue_glCore_glMultiDrawElementArrayAPPLE; +void APIENTRY bluegl_glMultiDrawElementArrayAPPLE (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount) { + typedef void (APIENTRYP PFN_glMultiDrawElementArrayAPPLE) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); + return ((PFN_glMultiDrawElementArrayAPPLE)__blue_glCore_glMultiDrawElementArrayAPPLE)(mode, first, count, primcount); +} + +extern void* __blue_glCore_glMultiDrawRangeElementArrayAPPLE; +void APIENTRY bluegl_glMultiDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount) { + typedef void (APIENTRYP PFN_glMultiDrawRangeElementArrayAPPLE) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); + return ((PFN_glMultiDrawRangeElementArrayAPPLE)__blue_glCore_glMultiDrawRangeElementArrayAPPLE)(mode, start, end, first, count, primcount); +} + +extern void* __blue_glCore_glGenFencesAPPLE; +void APIENTRY bluegl_glGenFencesAPPLE (GLsizei n, GLuint *fences) { + typedef void (APIENTRYP PFN_glGenFencesAPPLE) (GLsizei n, GLuint *fences); + return ((PFN_glGenFencesAPPLE)__blue_glCore_glGenFencesAPPLE)(n, fences); +} + +extern void* __blue_glCore_glDeleteFencesAPPLE; +void APIENTRY bluegl_glDeleteFencesAPPLE (GLsizei n, const GLuint *fences) { + typedef void (APIENTRYP PFN_glDeleteFencesAPPLE) (GLsizei n, const GLuint *fences); + return ((PFN_glDeleteFencesAPPLE)__blue_glCore_glDeleteFencesAPPLE)(n, fences); +} + +extern void* __blue_glCore_glSetFenceAPPLE; +void APIENTRY bluegl_glSetFenceAPPLE (GLuint fence) { + typedef void (APIENTRYP PFN_glSetFenceAPPLE) (GLuint fence); + return ((PFN_glSetFenceAPPLE)__blue_glCore_glSetFenceAPPLE)(fence); +} + +extern void* __blue_glCore_glIsFenceAPPLE; +GLboolean APIENTRY bluegl_glIsFenceAPPLE (GLuint fence) { + typedef GLboolean (APIENTRYP PFN_glIsFenceAPPLE) (GLuint fence); + return ((PFN_glIsFenceAPPLE)__blue_glCore_glIsFenceAPPLE)(fence); +} + +extern void* __blue_glCore_glTestFenceAPPLE; +GLboolean APIENTRY bluegl_glTestFenceAPPLE (GLuint fence) { + typedef GLboolean (APIENTRYP PFN_glTestFenceAPPLE) (GLuint fence); + return ((PFN_glTestFenceAPPLE)__blue_glCore_glTestFenceAPPLE)(fence); +} + +extern void* __blue_glCore_glFinishFenceAPPLE; +void APIENTRY bluegl_glFinishFenceAPPLE (GLuint fence) { + typedef void (APIENTRYP PFN_glFinishFenceAPPLE) (GLuint fence); + return ((PFN_glFinishFenceAPPLE)__blue_glCore_glFinishFenceAPPLE)(fence); +} + +extern void* __blue_glCore_glTestObjectAPPLE; +GLboolean APIENTRY bluegl_glTestObjectAPPLE (GLenum object, GLuint name) { + typedef GLboolean (APIENTRYP PFN_glTestObjectAPPLE) (GLenum object, GLuint name); + return ((PFN_glTestObjectAPPLE)__blue_glCore_glTestObjectAPPLE)(object, name); +} + +extern void* __blue_glCore_glFinishObjectAPPLE; +void APIENTRY bluegl_glFinishObjectAPPLE (GLenum object, GLint name) { + typedef void (APIENTRYP PFN_glFinishObjectAPPLE) (GLenum object, GLint name); + return ((PFN_glFinishObjectAPPLE)__blue_glCore_glFinishObjectAPPLE)(object, name); +} + +extern void* __blue_glCore_glBufferParameteriAPPLE; +void APIENTRY bluegl_glBufferParameteriAPPLE (GLenum target, GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glBufferParameteriAPPLE) (GLenum target, GLenum pname, GLint param); + return ((PFN_glBufferParameteriAPPLE)__blue_glCore_glBufferParameteriAPPLE)(target, pname, param); +} + +extern void* __blue_glCore_glFlushMappedBufferRangeAPPLE; +void APIENTRY bluegl_glFlushMappedBufferRangeAPPLE (GLenum target, GLintptr offset, GLsizeiptr size) { + typedef void (APIENTRYP PFN_glFlushMappedBufferRangeAPPLE) (GLenum target, GLintptr offset, GLsizeiptr size); + return ((PFN_glFlushMappedBufferRangeAPPLE)__blue_glCore_glFlushMappedBufferRangeAPPLE)(target, offset, size); +} + +extern void* __blue_glCore_glObjectPurgeableAPPLE; +GLenum APIENTRY bluegl_glObjectPurgeableAPPLE (GLenum objectType, GLuint name, GLenum option) { + typedef GLenum (APIENTRYP PFN_glObjectPurgeableAPPLE) (GLenum objectType, GLuint name, GLenum option); + return ((PFN_glObjectPurgeableAPPLE)__blue_glCore_glObjectPurgeableAPPLE)(objectType, name, option); +} + +extern void* __blue_glCore_glObjectUnpurgeableAPPLE; +GLenum APIENTRY bluegl_glObjectUnpurgeableAPPLE (GLenum objectType, GLuint name, GLenum option) { + typedef GLenum (APIENTRYP PFN_glObjectUnpurgeableAPPLE) (GLenum objectType, GLuint name, GLenum option); + return ((PFN_glObjectUnpurgeableAPPLE)__blue_glCore_glObjectUnpurgeableAPPLE)(objectType, name, option); +} + +extern void* __blue_glCore_glGetObjectParameterivAPPLE; +void APIENTRY bluegl_glGetObjectParameterivAPPLE (GLenum objectType, GLuint name, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetObjectParameterivAPPLE) (GLenum objectType, GLuint name, GLenum pname, GLint *params); + return ((PFN_glGetObjectParameterivAPPLE)__blue_glCore_glGetObjectParameterivAPPLE)(objectType, name, pname, params); +} + +extern void* __blue_glCore_glTextureRangeAPPLE; +void APIENTRY bluegl_glTextureRangeAPPLE (GLenum target, GLsizei length, const void *pointer) { + typedef void (APIENTRYP PFN_glTextureRangeAPPLE) (GLenum target, GLsizei length, const void *pointer); + return ((PFN_glTextureRangeAPPLE)__blue_glCore_glTextureRangeAPPLE)(target, length, pointer); +} + +extern void* __blue_glCore_glGetTexParameterPointervAPPLE; +void APIENTRY bluegl_glGetTexParameterPointervAPPLE (GLenum target, GLenum pname, void **params) { + typedef void (APIENTRYP PFN_glGetTexParameterPointervAPPLE) (GLenum target, GLenum pname, void **params); + return ((PFN_glGetTexParameterPointervAPPLE)__blue_glCore_glGetTexParameterPointervAPPLE)(target, pname, params); +} + +extern void* __blue_glCore_glBindVertexArrayAPPLE; +void APIENTRY bluegl_glBindVertexArrayAPPLE (GLuint array) { + typedef void (APIENTRYP PFN_glBindVertexArrayAPPLE) (GLuint array); + return ((PFN_glBindVertexArrayAPPLE)__blue_glCore_glBindVertexArrayAPPLE)(array); +} + +extern void* __blue_glCore_glDeleteVertexArraysAPPLE; +void APIENTRY bluegl_glDeleteVertexArraysAPPLE (GLsizei n, const GLuint *arrays) { + typedef void (APIENTRYP PFN_glDeleteVertexArraysAPPLE) (GLsizei n, const GLuint *arrays); + return ((PFN_glDeleteVertexArraysAPPLE)__blue_glCore_glDeleteVertexArraysAPPLE)(n, arrays); +} + +extern void* __blue_glCore_glGenVertexArraysAPPLE; +void APIENTRY bluegl_glGenVertexArraysAPPLE (GLsizei n, GLuint *arrays) { + typedef void (APIENTRYP PFN_glGenVertexArraysAPPLE) (GLsizei n, GLuint *arrays); + return ((PFN_glGenVertexArraysAPPLE)__blue_glCore_glGenVertexArraysAPPLE)(n, arrays); +} + +extern void* __blue_glCore_glIsVertexArrayAPPLE; +GLboolean APIENTRY bluegl_glIsVertexArrayAPPLE (GLuint array) { + typedef GLboolean (APIENTRYP PFN_glIsVertexArrayAPPLE) (GLuint array); + return ((PFN_glIsVertexArrayAPPLE)__blue_glCore_glIsVertexArrayAPPLE)(array); +} + +extern void* __blue_glCore_glVertexArrayRangeAPPLE; +void APIENTRY bluegl_glVertexArrayRangeAPPLE (GLsizei length, void *pointer) { + typedef void (APIENTRYP PFN_glVertexArrayRangeAPPLE) (GLsizei length, void *pointer); + return ((PFN_glVertexArrayRangeAPPLE)__blue_glCore_glVertexArrayRangeAPPLE)(length, pointer); +} + +extern void* __blue_glCore_glFlushVertexArrayRangeAPPLE; +void APIENTRY bluegl_glFlushVertexArrayRangeAPPLE (GLsizei length, void *pointer) { + typedef void (APIENTRYP PFN_glFlushVertexArrayRangeAPPLE) (GLsizei length, void *pointer); + return ((PFN_glFlushVertexArrayRangeAPPLE)__blue_glCore_glFlushVertexArrayRangeAPPLE)(length, pointer); +} + +extern void* __blue_glCore_glVertexArrayParameteriAPPLE; +void APIENTRY bluegl_glVertexArrayParameteriAPPLE (GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glVertexArrayParameteriAPPLE) (GLenum pname, GLint param); + return ((PFN_glVertexArrayParameteriAPPLE)__blue_glCore_glVertexArrayParameteriAPPLE)(pname, param); +} + +extern void* __blue_glCore_glEnableVertexAttribAPPLE; +void APIENTRY bluegl_glEnableVertexAttribAPPLE (GLuint index, GLenum pname) { + typedef void (APIENTRYP PFN_glEnableVertexAttribAPPLE) (GLuint index, GLenum pname); + return ((PFN_glEnableVertexAttribAPPLE)__blue_glCore_glEnableVertexAttribAPPLE)(index, pname); +} + +extern void* __blue_glCore_glDisableVertexAttribAPPLE; +void APIENTRY bluegl_glDisableVertexAttribAPPLE (GLuint index, GLenum pname) { + typedef void (APIENTRYP PFN_glDisableVertexAttribAPPLE) (GLuint index, GLenum pname); + return ((PFN_glDisableVertexAttribAPPLE)__blue_glCore_glDisableVertexAttribAPPLE)(index, pname); +} + +extern void* __blue_glCore_glIsVertexAttribEnabledAPPLE; +GLboolean APIENTRY bluegl_glIsVertexAttribEnabledAPPLE (GLuint index, GLenum pname) { + typedef GLboolean (APIENTRYP PFN_glIsVertexAttribEnabledAPPLE) (GLuint index, GLenum pname); + return ((PFN_glIsVertexAttribEnabledAPPLE)__blue_glCore_glIsVertexAttribEnabledAPPLE)(index, pname); +} + +extern void* __blue_glCore_glMapVertexAttrib1dAPPLE; +void APIENTRY bluegl_glMapVertexAttrib1dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points) { + typedef void (APIENTRYP PFN_glMapVertexAttrib1dAPPLE) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); + return ((PFN_glMapVertexAttrib1dAPPLE)__blue_glCore_glMapVertexAttrib1dAPPLE)(index, size, u1, u2, stride, order, points); +} + +extern void* __blue_glCore_glMapVertexAttrib1fAPPLE; +void APIENTRY bluegl_glMapVertexAttrib1fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points) { + typedef void (APIENTRYP PFN_glMapVertexAttrib1fAPPLE) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); + return ((PFN_glMapVertexAttrib1fAPPLE)__blue_glCore_glMapVertexAttrib1fAPPLE)(index, size, u1, u2, stride, order, points); +} + +extern void* __blue_glCore_glMapVertexAttrib2dAPPLE; +void APIENTRY bluegl_glMapVertexAttrib2dAPPLE (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 PFN_glMapVertexAttrib2dAPPLE) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); + return ((PFN_glMapVertexAttrib2dAPPLE)__blue_glCore_glMapVertexAttrib2dAPPLE)(index, size, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); +} + +extern void* __blue_glCore_glMapVertexAttrib2fAPPLE; +void APIENTRY bluegl_glMapVertexAttrib2fAPPLE (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 (APIENTRYP PFN_glMapVertexAttrib2fAPPLE) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); + return ((PFN_glMapVertexAttrib2fAPPLE)__blue_glCore_glMapVertexAttrib2fAPPLE)(index, size, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); +} + +extern void* __blue_glCore_glDrawBuffersATI; +void APIENTRY bluegl_glDrawBuffersATI (GLsizei n, const GLenum *bufs) { + typedef void (APIENTRYP PFN_glDrawBuffersATI) (GLsizei n, const GLenum *bufs); + return ((PFN_glDrawBuffersATI)__blue_glCore_glDrawBuffersATI)(n, bufs); +} + +extern void* __blue_glCore_glElementPointerATI; +void APIENTRY bluegl_glElementPointerATI (GLenum type, const void *pointer) { + typedef void (APIENTRYP PFN_glElementPointerATI) (GLenum type, const void *pointer); + return ((PFN_glElementPointerATI)__blue_glCore_glElementPointerATI)(type, pointer); +} + +extern void* __blue_glCore_glDrawElementArrayATI; +void APIENTRY bluegl_glDrawElementArrayATI (GLenum mode, GLsizei count) { + typedef void (APIENTRYP PFN_glDrawElementArrayATI) (GLenum mode, GLsizei count); + return ((PFN_glDrawElementArrayATI)__blue_glCore_glDrawElementArrayATI)(mode, count); +} + +extern void* __blue_glCore_glDrawRangeElementArrayATI; +void APIENTRY bluegl_glDrawRangeElementArrayATI (GLenum mode, GLuint start, GLuint end, GLsizei count) { + typedef void (APIENTRYP PFN_glDrawRangeElementArrayATI) (GLenum mode, GLuint start, GLuint end, GLsizei count); + return ((PFN_glDrawRangeElementArrayATI)__blue_glCore_glDrawRangeElementArrayATI)(mode, start, end, count); +} + +extern void* __blue_glCore_glTexBumpParameterivATI; +void APIENTRY bluegl_glTexBumpParameterivATI (GLenum pname, const GLint *param) { + typedef void (APIENTRYP PFN_glTexBumpParameterivATI) (GLenum pname, const GLint *param); + return ((PFN_glTexBumpParameterivATI)__blue_glCore_glTexBumpParameterivATI)(pname, param); +} + +extern void* __blue_glCore_glTexBumpParameterfvATI; +void APIENTRY bluegl_glTexBumpParameterfvATI (GLenum pname, const GLfloat *param) { + typedef void (APIENTRYP PFN_glTexBumpParameterfvATI) (GLenum pname, const GLfloat *param); + return ((PFN_glTexBumpParameterfvATI)__blue_glCore_glTexBumpParameterfvATI)(pname, param); +} + +extern void* __blue_glCore_glGetTexBumpParameterivATI; +void APIENTRY bluegl_glGetTexBumpParameterivATI (GLenum pname, GLint *param) { + typedef void (APIENTRYP PFN_glGetTexBumpParameterivATI) (GLenum pname, GLint *param); + return ((PFN_glGetTexBumpParameterivATI)__blue_glCore_glGetTexBumpParameterivATI)(pname, param); +} + +extern void* __blue_glCore_glGetTexBumpParameterfvATI; +void APIENTRY bluegl_glGetTexBumpParameterfvATI (GLenum pname, GLfloat *param) { + typedef void (APIENTRYP PFN_glGetTexBumpParameterfvATI) (GLenum pname, GLfloat *param); + return ((PFN_glGetTexBumpParameterfvATI)__blue_glCore_glGetTexBumpParameterfvATI)(pname, param); +} + +extern void* __blue_glCore_glGenFragmentShadersATI; +GLuint APIENTRY bluegl_glGenFragmentShadersATI (GLuint range) { + typedef GLuint (APIENTRYP PFN_glGenFragmentShadersATI) (GLuint range); + return ((PFN_glGenFragmentShadersATI)__blue_glCore_glGenFragmentShadersATI)(range); +} + +extern void* __blue_glCore_glBindFragmentShaderATI; +void APIENTRY bluegl_glBindFragmentShaderATI (GLuint id) { + typedef void (APIENTRYP PFN_glBindFragmentShaderATI) (GLuint id); + return ((PFN_glBindFragmentShaderATI)__blue_glCore_glBindFragmentShaderATI)(id); +} + +extern void* __blue_glCore_glDeleteFragmentShaderATI; +void APIENTRY bluegl_glDeleteFragmentShaderATI (GLuint id) { + typedef void (APIENTRYP PFN_glDeleteFragmentShaderATI) (GLuint id); + return ((PFN_glDeleteFragmentShaderATI)__blue_glCore_glDeleteFragmentShaderATI)(id); +} + +extern void* __blue_glCore_glBeginFragmentShaderATI; +void APIENTRY bluegl_glBeginFragmentShaderATI (void) { + typedef void (APIENTRYP PFN_glBeginFragmentShaderATI) (void); + return ((PFN_glBeginFragmentShaderATI)__blue_glCore_glBeginFragmentShaderATI)(); +} + +extern void* __blue_glCore_glEndFragmentShaderATI; +void APIENTRY bluegl_glEndFragmentShaderATI (void) { + typedef void (APIENTRYP PFN_glEndFragmentShaderATI) (void); + return ((PFN_glEndFragmentShaderATI)__blue_glCore_glEndFragmentShaderATI)(); +} + +extern void* __blue_glCore_glPassTexCoordATI; +void APIENTRY bluegl_glPassTexCoordATI (GLuint dst, GLuint coord, GLenum swizzle) { + typedef void (APIENTRYP PFN_glPassTexCoordATI) (GLuint dst, GLuint coord, GLenum swizzle); + return ((PFN_glPassTexCoordATI)__blue_glCore_glPassTexCoordATI)(dst, coord, swizzle); +} + +extern void* __blue_glCore_glSampleMapATI; +void APIENTRY bluegl_glSampleMapATI (GLuint dst, GLuint interp, GLenum swizzle) { + typedef void (APIENTRYP PFN_glSampleMapATI) (GLuint dst, GLuint interp, GLenum swizzle); + return ((PFN_glSampleMapATI)__blue_glCore_glSampleMapATI)(dst, interp, swizzle); +} + +extern void* __blue_glCore_glColorFragmentOp1ATI; +void APIENTRY bluegl_glColorFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod) { + typedef void (APIENTRYP PFN_glColorFragmentOp1ATI) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); + return ((PFN_glColorFragmentOp1ATI)__blue_glCore_glColorFragmentOp1ATI)(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod); +} + +extern void* __blue_glCore_glColorFragmentOp2ATI; +void APIENTRY bluegl_glColorFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod) { + typedef void (APIENTRYP PFN_glColorFragmentOp2ATI) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); + return ((PFN_glColorFragmentOp2ATI)__blue_glCore_glColorFragmentOp2ATI)(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod); +} + +extern void* __blue_glCore_glColorFragmentOp3ATI; +void APIENTRY bluegl_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) { + typedef void (APIENTRYP PFN_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); + return ((PFN_glColorFragmentOp3ATI)__blue_glCore_glColorFragmentOp3ATI)(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod); +} + +extern void* __blue_glCore_glAlphaFragmentOp1ATI; +void APIENTRY bluegl_glAlphaFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod) { + typedef void (APIENTRYP PFN_glAlphaFragmentOp1ATI) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); + return ((PFN_glAlphaFragmentOp1ATI)__blue_glCore_glAlphaFragmentOp1ATI)(op, dst, dstMod, arg1, arg1Rep, arg1Mod); +} + +extern void* __blue_glCore_glAlphaFragmentOp2ATI; +void APIENTRY bluegl_glAlphaFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod) { + typedef void (APIENTRYP PFN_glAlphaFragmentOp2ATI) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); + return ((PFN_glAlphaFragmentOp2ATI)__blue_glCore_glAlphaFragmentOp2ATI)(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod); +} + +extern void* __blue_glCore_glAlphaFragmentOp3ATI; +void APIENTRY bluegl_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) { + typedef void (APIENTRYP PFN_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); + return ((PFN_glAlphaFragmentOp3ATI)__blue_glCore_glAlphaFragmentOp3ATI)(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod); +} + +extern void* __blue_glCore_glSetFragmentShaderConstantATI; +void APIENTRY bluegl_glSetFragmentShaderConstantATI (GLuint dst, const GLfloat *value) { + typedef void (APIENTRYP PFN_glSetFragmentShaderConstantATI) (GLuint dst, const GLfloat *value); + return ((PFN_glSetFragmentShaderConstantATI)__blue_glCore_glSetFragmentShaderConstantATI)(dst, value); +} + +extern void* __blue_glCore_glMapObjectBufferATI; +void *APIENTRY bluegl_glMapObjectBufferATI (GLuint buffer) { + typedef void *(APIENTRYP PFN_glMapObjectBufferATI) (GLuint buffer); + return ((PFN_glMapObjectBufferATI)__blue_glCore_glMapObjectBufferATI)(buffer); +} + +extern void* __blue_glCore_glUnmapObjectBufferATI; +void APIENTRY bluegl_glUnmapObjectBufferATI (GLuint buffer) { + typedef void (APIENTRYP PFN_glUnmapObjectBufferATI) (GLuint buffer); + return ((PFN_glUnmapObjectBufferATI)__blue_glCore_glUnmapObjectBufferATI)(buffer); +} + +extern void* __blue_glCore_glPNTrianglesiATI; +void APIENTRY bluegl_glPNTrianglesiATI (GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glPNTrianglesiATI) (GLenum pname, GLint param); + return ((PFN_glPNTrianglesiATI)__blue_glCore_glPNTrianglesiATI)(pname, param); +} + +extern void* __blue_glCore_glPNTrianglesfATI; +void APIENTRY bluegl_glPNTrianglesfATI (GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glPNTrianglesfATI) (GLenum pname, GLfloat param); + return ((PFN_glPNTrianglesfATI)__blue_glCore_glPNTrianglesfATI)(pname, param); +} + +extern void* __blue_glCore_glStencilOpSeparateATI; +void APIENTRY bluegl_glStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) { + typedef void (APIENTRYP PFN_glStencilOpSeparateATI) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); + return ((PFN_glStencilOpSeparateATI)__blue_glCore_glStencilOpSeparateATI)(face, sfail, dpfail, dppass); +} + +extern void* __blue_glCore_glStencilFuncSeparateATI; +void APIENTRY bluegl_glStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask) { + typedef void (APIENTRYP PFN_glStencilFuncSeparateATI) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); + return ((PFN_glStencilFuncSeparateATI)__blue_glCore_glStencilFuncSeparateATI)(frontfunc, backfunc, ref, mask); +} + +extern void* __blue_glCore_glNewObjectBufferATI; +GLuint APIENTRY bluegl_glNewObjectBufferATI (GLsizei size, const void *pointer, GLenum usage) { + typedef GLuint (APIENTRYP PFN_glNewObjectBufferATI) (GLsizei size, const void *pointer, GLenum usage); + return ((PFN_glNewObjectBufferATI)__blue_glCore_glNewObjectBufferATI)(size, pointer, usage); +} + +extern void* __blue_glCore_glIsObjectBufferATI; +GLboolean APIENTRY bluegl_glIsObjectBufferATI (GLuint buffer) { + typedef GLboolean (APIENTRYP PFN_glIsObjectBufferATI) (GLuint buffer); + return ((PFN_glIsObjectBufferATI)__blue_glCore_glIsObjectBufferATI)(buffer); +} + +extern void* __blue_glCore_glUpdateObjectBufferATI; +void APIENTRY bluegl_glUpdateObjectBufferATI (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve) { + typedef void (APIENTRYP PFN_glUpdateObjectBufferATI) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); + return ((PFN_glUpdateObjectBufferATI)__blue_glCore_glUpdateObjectBufferATI)(buffer, offset, size, pointer, preserve); +} + +extern void* __blue_glCore_glGetObjectBufferfvATI; +void APIENTRY bluegl_glGetObjectBufferfvATI (GLuint buffer, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetObjectBufferfvATI) (GLuint buffer, GLenum pname, GLfloat *params); + return ((PFN_glGetObjectBufferfvATI)__blue_glCore_glGetObjectBufferfvATI)(buffer, pname, params); +} + +extern void* __blue_glCore_glGetObjectBufferivATI; +void APIENTRY bluegl_glGetObjectBufferivATI (GLuint buffer, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetObjectBufferivATI) (GLuint buffer, GLenum pname, GLint *params); + return ((PFN_glGetObjectBufferivATI)__blue_glCore_glGetObjectBufferivATI)(buffer, pname, params); +} + +extern void* __blue_glCore_glFreeObjectBufferATI; +void APIENTRY bluegl_glFreeObjectBufferATI (GLuint buffer) { + typedef void (APIENTRYP PFN_glFreeObjectBufferATI) (GLuint buffer); + return ((PFN_glFreeObjectBufferATI)__blue_glCore_glFreeObjectBufferATI)(buffer); +} + +extern void* __blue_glCore_glArrayObjectATI; +void APIENTRY bluegl_glArrayObjectATI (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset) { + typedef void (APIENTRYP PFN_glArrayObjectATI) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); + return ((PFN_glArrayObjectATI)__blue_glCore_glArrayObjectATI)(array, size, type, stride, buffer, offset); +} + +extern void* __blue_glCore_glGetArrayObjectfvATI; +void APIENTRY bluegl_glGetArrayObjectfvATI (GLenum array, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetArrayObjectfvATI) (GLenum array, GLenum pname, GLfloat *params); + return ((PFN_glGetArrayObjectfvATI)__blue_glCore_glGetArrayObjectfvATI)(array, pname, params); +} + +extern void* __blue_glCore_glGetArrayObjectivATI; +void APIENTRY bluegl_glGetArrayObjectivATI (GLenum array, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetArrayObjectivATI) (GLenum array, GLenum pname, GLint *params); + return ((PFN_glGetArrayObjectivATI)__blue_glCore_glGetArrayObjectivATI)(array, pname, params); +} + +extern void* __blue_glCore_glVariantArrayObjectATI; +void APIENTRY bluegl_glVariantArrayObjectATI (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset) { + typedef void (APIENTRYP PFN_glVariantArrayObjectATI) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); + return ((PFN_glVariantArrayObjectATI)__blue_glCore_glVariantArrayObjectATI)(id, type, stride, buffer, offset); +} + +extern void* __blue_glCore_glGetVariantArrayObjectfvATI; +void APIENTRY bluegl_glGetVariantArrayObjectfvATI (GLuint id, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetVariantArrayObjectfvATI) (GLuint id, GLenum pname, GLfloat *params); + return ((PFN_glGetVariantArrayObjectfvATI)__blue_glCore_glGetVariantArrayObjectfvATI)(id, pname, params); +} + +extern void* __blue_glCore_glGetVariantArrayObjectivATI; +void APIENTRY bluegl_glGetVariantArrayObjectivATI (GLuint id, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetVariantArrayObjectivATI) (GLuint id, GLenum pname, GLint *params); + return ((PFN_glGetVariantArrayObjectivATI)__blue_glCore_glGetVariantArrayObjectivATI)(id, pname, params); +} + +extern void* __blue_glCore_glVertexAttribArrayObjectATI; +void APIENTRY bluegl_glVertexAttribArrayObjectATI (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset) { + typedef void (APIENTRYP PFN_glVertexAttribArrayObjectATI) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); + return ((PFN_glVertexAttribArrayObjectATI)__blue_glCore_glVertexAttribArrayObjectATI)(index, size, type, normalized, stride, buffer, offset); +} + +extern void* __blue_glCore_glGetVertexAttribArrayObjectfvATI; +void APIENTRY bluegl_glGetVertexAttribArrayObjectfvATI (GLuint index, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribArrayObjectfvATI) (GLuint index, GLenum pname, GLfloat *params); + return ((PFN_glGetVertexAttribArrayObjectfvATI)__blue_glCore_glGetVertexAttribArrayObjectfvATI)(index, pname, params); +} + +extern void* __blue_glCore_glGetVertexAttribArrayObjectivATI; +void APIENTRY bluegl_glGetVertexAttribArrayObjectivATI (GLuint index, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribArrayObjectivATI) (GLuint index, GLenum pname, GLint *params); + return ((PFN_glGetVertexAttribArrayObjectivATI)__blue_glCore_glGetVertexAttribArrayObjectivATI)(index, pname, params); +} + +extern void* __blue_glCore_glVertexStream1sATI; +void APIENTRY bluegl_glVertexStream1sATI (GLenum stream, GLshort x) { + typedef void (APIENTRYP PFN_glVertexStream1sATI) (GLenum stream, GLshort x); + return ((PFN_glVertexStream1sATI)__blue_glCore_glVertexStream1sATI)(stream, x); +} + +extern void* __blue_glCore_glVertexStream1svATI; +void APIENTRY bluegl_glVertexStream1svATI (GLenum stream, const GLshort *coords) { + typedef void (APIENTRYP PFN_glVertexStream1svATI) (GLenum stream, const GLshort *coords); + return ((PFN_glVertexStream1svATI)__blue_glCore_glVertexStream1svATI)(stream, coords); +} + +extern void* __blue_glCore_glVertexStream1iATI; +void APIENTRY bluegl_glVertexStream1iATI (GLenum stream, GLint x) { + typedef void (APIENTRYP PFN_glVertexStream1iATI) (GLenum stream, GLint x); + return ((PFN_glVertexStream1iATI)__blue_glCore_glVertexStream1iATI)(stream, x); +} + +extern void* __blue_glCore_glVertexStream1ivATI; +void APIENTRY bluegl_glVertexStream1ivATI (GLenum stream, const GLint *coords) { + typedef void (APIENTRYP PFN_glVertexStream1ivATI) (GLenum stream, const GLint *coords); + return ((PFN_glVertexStream1ivATI)__blue_glCore_glVertexStream1ivATI)(stream, coords); +} + +extern void* __blue_glCore_glVertexStream1fATI; +void APIENTRY bluegl_glVertexStream1fATI (GLenum stream, GLfloat x) { + typedef void (APIENTRYP PFN_glVertexStream1fATI) (GLenum stream, GLfloat x); + return ((PFN_glVertexStream1fATI)__blue_glCore_glVertexStream1fATI)(stream, x); +} + +extern void* __blue_glCore_glVertexStream1fvATI; +void APIENTRY bluegl_glVertexStream1fvATI (GLenum stream, const GLfloat *coords) { + typedef void (APIENTRYP PFN_glVertexStream1fvATI) (GLenum stream, const GLfloat *coords); + return ((PFN_glVertexStream1fvATI)__blue_glCore_glVertexStream1fvATI)(stream, coords); +} + +extern void* __blue_glCore_glVertexStream1dATI; +void APIENTRY bluegl_glVertexStream1dATI (GLenum stream, GLdouble x) { + typedef void (APIENTRYP PFN_glVertexStream1dATI) (GLenum stream, GLdouble x); + return ((PFN_glVertexStream1dATI)__blue_glCore_glVertexStream1dATI)(stream, x); +} + +extern void* __blue_glCore_glVertexStream1dvATI; +void APIENTRY bluegl_glVertexStream1dvATI (GLenum stream, const GLdouble *coords) { + typedef void (APIENTRYP PFN_glVertexStream1dvATI) (GLenum stream, const GLdouble *coords); + return ((PFN_glVertexStream1dvATI)__blue_glCore_glVertexStream1dvATI)(stream, coords); +} + +extern void* __blue_glCore_glVertexStream2sATI; +void APIENTRY bluegl_glVertexStream2sATI (GLenum stream, GLshort x, GLshort y) { + typedef void (APIENTRYP PFN_glVertexStream2sATI) (GLenum stream, GLshort x, GLshort y); + return ((PFN_glVertexStream2sATI)__blue_glCore_glVertexStream2sATI)(stream, x, y); +} + +extern void* __blue_glCore_glVertexStream2svATI; +void APIENTRY bluegl_glVertexStream2svATI (GLenum stream, const GLshort *coords) { + typedef void (APIENTRYP PFN_glVertexStream2svATI) (GLenum stream, const GLshort *coords); + return ((PFN_glVertexStream2svATI)__blue_glCore_glVertexStream2svATI)(stream, coords); +} + +extern void* __blue_glCore_glVertexStream2iATI; +void APIENTRY bluegl_glVertexStream2iATI (GLenum stream, GLint x, GLint y) { + typedef void (APIENTRYP PFN_glVertexStream2iATI) (GLenum stream, GLint x, GLint y); + return ((PFN_glVertexStream2iATI)__blue_glCore_glVertexStream2iATI)(stream, x, y); +} + +extern void* __blue_glCore_glVertexStream2ivATI; +void APIENTRY bluegl_glVertexStream2ivATI (GLenum stream, const GLint *coords) { + typedef void (APIENTRYP PFN_glVertexStream2ivATI) (GLenum stream, const GLint *coords); + return ((PFN_glVertexStream2ivATI)__blue_glCore_glVertexStream2ivATI)(stream, coords); +} + +extern void* __blue_glCore_glVertexStream2fATI; +void APIENTRY bluegl_glVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y) { + typedef void (APIENTRYP PFN_glVertexStream2fATI) (GLenum stream, GLfloat x, GLfloat y); + return ((PFN_glVertexStream2fATI)__blue_glCore_glVertexStream2fATI)(stream, x, y); +} + +extern void* __blue_glCore_glVertexStream2fvATI; +void APIENTRY bluegl_glVertexStream2fvATI (GLenum stream, const GLfloat *coords) { + typedef void (APIENTRYP PFN_glVertexStream2fvATI) (GLenum stream, const GLfloat *coords); + return ((PFN_glVertexStream2fvATI)__blue_glCore_glVertexStream2fvATI)(stream, coords); +} + +extern void* __blue_glCore_glVertexStream2dATI; +void APIENTRY bluegl_glVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y) { + typedef void (APIENTRYP PFN_glVertexStream2dATI) (GLenum stream, GLdouble x, GLdouble y); + return ((PFN_glVertexStream2dATI)__blue_glCore_glVertexStream2dATI)(stream, x, y); +} + +extern void* __blue_glCore_glVertexStream2dvATI; +void APIENTRY bluegl_glVertexStream2dvATI (GLenum stream, const GLdouble *coords) { + typedef void (APIENTRYP PFN_glVertexStream2dvATI) (GLenum stream, const GLdouble *coords); + return ((PFN_glVertexStream2dvATI)__blue_glCore_glVertexStream2dvATI)(stream, coords); +} + +extern void* __blue_glCore_glVertexStream3sATI; +void APIENTRY bluegl_glVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z) { + typedef void (APIENTRYP PFN_glVertexStream3sATI) (GLenum stream, GLshort x, GLshort y, GLshort z); + return ((PFN_glVertexStream3sATI)__blue_glCore_glVertexStream3sATI)(stream, x, y, z); +} + +extern void* __blue_glCore_glVertexStream3svATI; +void APIENTRY bluegl_glVertexStream3svATI (GLenum stream, const GLshort *coords) { + typedef void (APIENTRYP PFN_glVertexStream3svATI) (GLenum stream, const GLshort *coords); + return ((PFN_glVertexStream3svATI)__blue_glCore_glVertexStream3svATI)(stream, coords); +} + +extern void* __blue_glCore_glVertexStream3iATI; +void APIENTRY bluegl_glVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z) { + typedef void (APIENTRYP PFN_glVertexStream3iATI) (GLenum stream, GLint x, GLint y, GLint z); + return ((PFN_glVertexStream3iATI)__blue_glCore_glVertexStream3iATI)(stream, x, y, z); +} + +extern void* __blue_glCore_glVertexStream3ivATI; +void APIENTRY bluegl_glVertexStream3ivATI (GLenum stream, const GLint *coords) { + typedef void (APIENTRYP PFN_glVertexStream3ivATI) (GLenum stream, const GLint *coords); + return ((PFN_glVertexStream3ivATI)__blue_glCore_glVertexStream3ivATI)(stream, coords); +} + +extern void* __blue_glCore_glVertexStream3fATI; +void APIENTRY bluegl_glVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glVertexStream3fATI) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glVertexStream3fATI)__blue_glCore_glVertexStream3fATI)(stream, x, y, z); +} + +extern void* __blue_glCore_glVertexStream3fvATI; +void APIENTRY bluegl_glVertexStream3fvATI (GLenum stream, const GLfloat *coords) { + typedef void (APIENTRYP PFN_glVertexStream3fvATI) (GLenum stream, const GLfloat *coords); + return ((PFN_glVertexStream3fvATI)__blue_glCore_glVertexStream3fvATI)(stream, coords); +} + +extern void* __blue_glCore_glVertexStream3dATI; +void APIENTRY bluegl_glVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z) { + typedef void (APIENTRYP PFN_glVertexStream3dATI) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); + return ((PFN_glVertexStream3dATI)__blue_glCore_glVertexStream3dATI)(stream, x, y, z); +} + +extern void* __blue_glCore_glVertexStream3dvATI; +void APIENTRY bluegl_glVertexStream3dvATI (GLenum stream, const GLdouble *coords) { + typedef void (APIENTRYP PFN_glVertexStream3dvATI) (GLenum stream, const GLdouble *coords); + return ((PFN_glVertexStream3dvATI)__blue_glCore_glVertexStream3dvATI)(stream, coords); +} + +extern void* __blue_glCore_glVertexStream4sATI; +void APIENTRY bluegl_glVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w) { + typedef void (APIENTRYP PFN_glVertexStream4sATI) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); + return ((PFN_glVertexStream4sATI)__blue_glCore_glVertexStream4sATI)(stream, x, y, z, w); +} + +extern void* __blue_glCore_glVertexStream4svATI; +void APIENTRY bluegl_glVertexStream4svATI (GLenum stream, const GLshort *coords) { + typedef void (APIENTRYP PFN_glVertexStream4svATI) (GLenum stream, const GLshort *coords); + return ((PFN_glVertexStream4svATI)__blue_glCore_glVertexStream4svATI)(stream, coords); +} + +extern void* __blue_glCore_glVertexStream4iATI; +void APIENTRY bluegl_glVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w) { + typedef void (APIENTRYP PFN_glVertexStream4iATI) (GLenum stream, GLint x, GLint y, GLint z, GLint w); + return ((PFN_glVertexStream4iATI)__blue_glCore_glVertexStream4iATI)(stream, x, y, z, w); +} + +extern void* __blue_glCore_glVertexStream4ivATI; +void APIENTRY bluegl_glVertexStream4ivATI (GLenum stream, const GLint *coords) { + typedef void (APIENTRYP PFN_glVertexStream4ivATI) (GLenum stream, const GLint *coords); + return ((PFN_glVertexStream4ivATI)__blue_glCore_glVertexStream4ivATI)(stream, coords); +} + +extern void* __blue_glCore_glVertexStream4fATI; +void APIENTRY bluegl_glVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { + typedef void (APIENTRYP PFN_glVertexStream4fATI) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + return ((PFN_glVertexStream4fATI)__blue_glCore_glVertexStream4fATI)(stream, x, y, z, w); +} + +extern void* __blue_glCore_glVertexStream4fvATI; +void APIENTRY bluegl_glVertexStream4fvATI (GLenum stream, const GLfloat *coords) { + typedef void (APIENTRYP PFN_glVertexStream4fvATI) (GLenum stream, const GLfloat *coords); + return ((PFN_glVertexStream4fvATI)__blue_glCore_glVertexStream4fvATI)(stream, coords); +} + +extern void* __blue_glCore_glVertexStream4dATI; +void APIENTRY bluegl_glVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { + typedef void (APIENTRYP PFN_glVertexStream4dATI) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + return ((PFN_glVertexStream4dATI)__blue_glCore_glVertexStream4dATI)(stream, x, y, z, w); +} + +extern void* __blue_glCore_glVertexStream4dvATI; +void APIENTRY bluegl_glVertexStream4dvATI (GLenum stream, const GLdouble *coords) { + typedef void (APIENTRYP PFN_glVertexStream4dvATI) (GLenum stream, const GLdouble *coords); + return ((PFN_glVertexStream4dvATI)__blue_glCore_glVertexStream4dvATI)(stream, coords); +} + +extern void* __blue_glCore_glNormalStream3bATI; +void APIENTRY bluegl_glNormalStream3bATI (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz) { + typedef void (APIENTRYP PFN_glNormalStream3bATI) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); + return ((PFN_glNormalStream3bATI)__blue_glCore_glNormalStream3bATI)(stream, nx, ny, nz); +} + +extern void* __blue_glCore_glNormalStream3bvATI; +void APIENTRY bluegl_glNormalStream3bvATI (GLenum stream, const GLbyte *coords) { + typedef void (APIENTRYP PFN_glNormalStream3bvATI) (GLenum stream, const GLbyte *coords); + return ((PFN_glNormalStream3bvATI)__blue_glCore_glNormalStream3bvATI)(stream, coords); +} + +extern void* __blue_glCore_glNormalStream3sATI; +void APIENTRY bluegl_glNormalStream3sATI (GLenum stream, GLshort nx, GLshort ny, GLshort nz) { + typedef void (APIENTRYP PFN_glNormalStream3sATI) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); + return ((PFN_glNormalStream3sATI)__blue_glCore_glNormalStream3sATI)(stream, nx, ny, nz); +} + +extern void* __blue_glCore_glNormalStream3svATI; +void APIENTRY bluegl_glNormalStream3svATI (GLenum stream, const GLshort *coords) { + typedef void (APIENTRYP PFN_glNormalStream3svATI) (GLenum stream, const GLshort *coords); + return ((PFN_glNormalStream3svATI)__blue_glCore_glNormalStream3svATI)(stream, coords); +} + +extern void* __blue_glCore_glNormalStream3iATI; +void APIENTRY bluegl_glNormalStream3iATI (GLenum stream, GLint nx, GLint ny, GLint nz) { + typedef void (APIENTRYP PFN_glNormalStream3iATI) (GLenum stream, GLint nx, GLint ny, GLint nz); + return ((PFN_glNormalStream3iATI)__blue_glCore_glNormalStream3iATI)(stream, nx, ny, nz); +} + +extern void* __blue_glCore_glNormalStream3ivATI; +void APIENTRY bluegl_glNormalStream3ivATI (GLenum stream, const GLint *coords) { + typedef void (APIENTRYP PFN_glNormalStream3ivATI) (GLenum stream, const GLint *coords); + return ((PFN_glNormalStream3ivATI)__blue_glCore_glNormalStream3ivATI)(stream, coords); +} + +extern void* __blue_glCore_glNormalStream3fATI; +void APIENTRY bluegl_glNormalStream3fATI (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz) { + typedef void (APIENTRYP PFN_glNormalStream3fATI) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); + return ((PFN_glNormalStream3fATI)__blue_glCore_glNormalStream3fATI)(stream, nx, ny, nz); +} + +extern void* __blue_glCore_glNormalStream3fvATI; +void APIENTRY bluegl_glNormalStream3fvATI (GLenum stream, const GLfloat *coords) { + typedef void (APIENTRYP PFN_glNormalStream3fvATI) (GLenum stream, const GLfloat *coords); + return ((PFN_glNormalStream3fvATI)__blue_glCore_glNormalStream3fvATI)(stream, coords); +} + +extern void* __blue_glCore_glNormalStream3dATI; +void APIENTRY bluegl_glNormalStream3dATI (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz) { + typedef void (APIENTRYP PFN_glNormalStream3dATI) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); + return ((PFN_glNormalStream3dATI)__blue_glCore_glNormalStream3dATI)(stream, nx, ny, nz); +} + +extern void* __blue_glCore_glNormalStream3dvATI; +void APIENTRY bluegl_glNormalStream3dvATI (GLenum stream, const GLdouble *coords) { + typedef void (APIENTRYP PFN_glNormalStream3dvATI) (GLenum stream, const GLdouble *coords); + return ((PFN_glNormalStream3dvATI)__blue_glCore_glNormalStream3dvATI)(stream, coords); +} + +extern void* __blue_glCore_glClientActiveVertexStreamATI; +void APIENTRY bluegl_glClientActiveVertexStreamATI (GLenum stream) { + typedef void (APIENTRYP PFN_glClientActiveVertexStreamATI) (GLenum stream); + return ((PFN_glClientActiveVertexStreamATI)__blue_glCore_glClientActiveVertexStreamATI)(stream); +} + +extern void* __blue_glCore_glVertexBlendEnviATI; +void APIENTRY bluegl_glVertexBlendEnviATI (GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glVertexBlendEnviATI) (GLenum pname, GLint param); + return ((PFN_glVertexBlendEnviATI)__blue_glCore_glVertexBlendEnviATI)(pname, param); +} + +extern void* __blue_glCore_glVertexBlendEnvfATI; +void APIENTRY bluegl_glVertexBlendEnvfATI (GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glVertexBlendEnvfATI) (GLenum pname, GLfloat param); + return ((PFN_glVertexBlendEnvfATI)__blue_glCore_glVertexBlendEnvfATI)(pname, param); +} + +extern void* __blue_glCore_glUniformBufferEXT; +void APIENTRY bluegl_glUniformBufferEXT (GLuint program, GLint location, GLuint buffer) { + typedef void (APIENTRYP PFN_glUniformBufferEXT) (GLuint program, GLint location, GLuint buffer); + return ((PFN_glUniformBufferEXT)__blue_glCore_glUniformBufferEXT)(program, location, buffer); +} + +extern void* __blue_glCore_glGetUniformBufferSizeEXT; +GLint APIENTRY bluegl_glGetUniformBufferSizeEXT (GLuint program, GLint location) { + typedef GLint (APIENTRYP PFN_glGetUniformBufferSizeEXT) (GLuint program, GLint location); + return ((PFN_glGetUniformBufferSizeEXT)__blue_glCore_glGetUniformBufferSizeEXT)(program, location); +} + +extern void* __blue_glCore_glGetUniformOffsetEXT; +GLintptr APIENTRY bluegl_glGetUniformOffsetEXT (GLuint program, GLint location) { + typedef GLintptr (APIENTRYP PFN_glGetUniformOffsetEXT) (GLuint program, GLint location); + return ((PFN_glGetUniformOffsetEXT)__blue_glCore_glGetUniformOffsetEXT)(program, location); +} + +extern void* __blue_glCore_glBlendColorEXT; +void APIENTRY bluegl_glBlendColorEXT (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { + typedef void (APIENTRYP PFN_glBlendColorEXT) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); + return ((PFN_glBlendColorEXT)__blue_glCore_glBlendColorEXT)(red, green, blue, alpha); +} + +extern void* __blue_glCore_glBlendEquationSeparateEXT; +void APIENTRY bluegl_glBlendEquationSeparateEXT (GLenum modeRGB, GLenum modeAlpha) { + typedef void (APIENTRYP PFN_glBlendEquationSeparateEXT) (GLenum modeRGB, GLenum modeAlpha); + return ((PFN_glBlendEquationSeparateEXT)__blue_glCore_glBlendEquationSeparateEXT)(modeRGB, modeAlpha); +} + +extern void* __blue_glCore_glBlendFuncSeparateEXT; +void APIENTRY bluegl_glBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) { + typedef void (APIENTRYP PFN_glBlendFuncSeparateEXT) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + return ((PFN_glBlendFuncSeparateEXT)__blue_glCore_glBlendFuncSeparateEXT)(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); +} + +extern void* __blue_glCore_glBlendEquationEXT; +void APIENTRY bluegl_glBlendEquationEXT (GLenum mode) { + typedef void (APIENTRYP PFN_glBlendEquationEXT) (GLenum mode); + return ((PFN_glBlendEquationEXT)__blue_glCore_glBlendEquationEXT)(mode); +} + +extern void* __blue_glCore_glColorSubTableEXT; +void APIENTRY bluegl_glColorSubTableEXT (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data) { + typedef void (APIENTRYP PFN_glColorSubTableEXT) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); + return ((PFN_glColorSubTableEXT)__blue_glCore_glColorSubTableEXT)(target, start, count, format, type, data); +} + +extern void* __blue_glCore_glCopyColorSubTableEXT; +void APIENTRY bluegl_glCopyColorSubTableEXT (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width) { + typedef void (APIENTRYP PFN_glCopyColorSubTableEXT) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); + return ((PFN_glCopyColorSubTableEXT)__blue_glCore_glCopyColorSubTableEXT)(target, start, x, y, width); +} + +extern void* __blue_glCore_glLockArraysEXT; +void APIENTRY bluegl_glLockArraysEXT (GLint first, GLsizei count) { + typedef void (APIENTRYP PFN_glLockArraysEXT) (GLint first, GLsizei count); + return ((PFN_glLockArraysEXT)__blue_glCore_glLockArraysEXT)(first, count); +} + +extern void* __blue_glCore_glUnlockArraysEXT; +void APIENTRY bluegl_glUnlockArraysEXT (void) { + typedef void (APIENTRYP PFN_glUnlockArraysEXT) (void); + return ((PFN_glUnlockArraysEXT)__blue_glCore_glUnlockArraysEXT)(); +} + +extern void* __blue_glCore_glConvolutionFilter1DEXT; +void APIENTRY bluegl_glConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image) { + typedef void (APIENTRYP PFN_glConvolutionFilter1DEXT) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); + return ((PFN_glConvolutionFilter1DEXT)__blue_glCore_glConvolutionFilter1DEXT)(target, internalformat, width, format, type, image); +} + +extern void* __blue_glCore_glConvolutionFilter2DEXT; +void APIENTRY bluegl_glConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image) { + typedef void (APIENTRYP PFN_glConvolutionFilter2DEXT) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); + return ((PFN_glConvolutionFilter2DEXT)__blue_glCore_glConvolutionFilter2DEXT)(target, internalformat, width, height, format, type, image); +} + +extern void* __blue_glCore_glConvolutionParameterfEXT; +void APIENTRY bluegl_glConvolutionParameterfEXT (GLenum target, GLenum pname, GLfloat params) { + typedef void (APIENTRYP PFN_glConvolutionParameterfEXT) (GLenum target, GLenum pname, GLfloat params); + return ((PFN_glConvolutionParameterfEXT)__blue_glCore_glConvolutionParameterfEXT)(target, pname, params); +} + +extern void* __blue_glCore_glConvolutionParameterfvEXT; +void APIENTRY bluegl_glConvolutionParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glConvolutionParameterfvEXT) (GLenum target, GLenum pname, const GLfloat *params); + return ((PFN_glConvolutionParameterfvEXT)__blue_glCore_glConvolutionParameterfvEXT)(target, pname, params); +} + +extern void* __blue_glCore_glConvolutionParameteriEXT; +void APIENTRY bluegl_glConvolutionParameteriEXT (GLenum target, GLenum pname, GLint params) { + typedef void (APIENTRYP PFN_glConvolutionParameteriEXT) (GLenum target, GLenum pname, GLint params); + return ((PFN_glConvolutionParameteriEXT)__blue_glCore_glConvolutionParameteriEXT)(target, pname, params); +} + +extern void* __blue_glCore_glConvolutionParameterivEXT; +void APIENTRY bluegl_glConvolutionParameterivEXT (GLenum target, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glConvolutionParameterivEXT) (GLenum target, GLenum pname, const GLint *params); + return ((PFN_glConvolutionParameterivEXT)__blue_glCore_glConvolutionParameterivEXT)(target, pname, params); +} + +extern void* __blue_glCore_glCopyConvolutionFilter1DEXT; +void APIENTRY bluegl_glCopyConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) { + typedef void (APIENTRYP PFN_glCopyConvolutionFilter1DEXT) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); + return ((PFN_glCopyConvolutionFilter1DEXT)__blue_glCore_glCopyConvolutionFilter1DEXT)(target, internalformat, x, y, width); +} + +extern void* __blue_glCore_glCopyConvolutionFilter2DEXT; +void APIENTRY bluegl_glCopyConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glCopyConvolutionFilter2DEXT) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); + return ((PFN_glCopyConvolutionFilter2DEXT)__blue_glCore_glCopyConvolutionFilter2DEXT)(target, internalformat, x, y, width, height); +} + +extern void* __blue_glCore_glGetConvolutionFilterEXT; +void APIENTRY bluegl_glGetConvolutionFilterEXT (GLenum target, GLenum format, GLenum type, void *image) { + typedef void (APIENTRYP PFN_glGetConvolutionFilterEXT) (GLenum target, GLenum format, GLenum type, void *image); + return ((PFN_glGetConvolutionFilterEXT)__blue_glCore_glGetConvolutionFilterEXT)(target, format, type, image); +} + +extern void* __blue_glCore_glGetConvolutionParameterfvEXT; +void APIENTRY bluegl_glGetConvolutionParameterfvEXT (GLenum target, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetConvolutionParameterfvEXT) (GLenum target, GLenum pname, GLfloat *params); + return ((PFN_glGetConvolutionParameterfvEXT)__blue_glCore_glGetConvolutionParameterfvEXT)(target, pname, params); +} + +extern void* __blue_glCore_glGetConvolutionParameterivEXT; +void APIENTRY bluegl_glGetConvolutionParameterivEXT (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetConvolutionParameterivEXT) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetConvolutionParameterivEXT)__blue_glCore_glGetConvolutionParameterivEXT)(target, pname, params); +} + +extern void* __blue_glCore_glGetSeparableFilterEXT; +void APIENTRY bluegl_glGetSeparableFilterEXT (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span) { + typedef void (APIENTRYP PFN_glGetSeparableFilterEXT) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); + return ((PFN_glGetSeparableFilterEXT)__blue_glCore_glGetSeparableFilterEXT)(target, format, type, row, column, span); +} + +extern void* __blue_glCore_glSeparableFilter2DEXT; +void APIENTRY bluegl_glSeparableFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column) { + typedef void (APIENTRYP PFN_glSeparableFilter2DEXT) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); + return ((PFN_glSeparableFilter2DEXT)__blue_glCore_glSeparableFilter2DEXT)(target, internalformat, width, height, format, type, row, column); +} + +extern void* __blue_glCore_glTangent3bEXT; +void APIENTRY bluegl_glTangent3bEXT (GLbyte tx, GLbyte ty, GLbyte tz) { + typedef void (APIENTRYP PFN_glTangent3bEXT) (GLbyte tx, GLbyte ty, GLbyte tz); + return ((PFN_glTangent3bEXT)__blue_glCore_glTangent3bEXT)(tx, ty, tz); +} + +extern void* __blue_glCore_glTangent3bvEXT; +void APIENTRY bluegl_glTangent3bvEXT (const GLbyte *v) { + typedef void (APIENTRYP PFN_glTangent3bvEXT) (const GLbyte *v); + return ((PFN_glTangent3bvEXT)__blue_glCore_glTangent3bvEXT)(v); +} + +extern void* __blue_glCore_glTangent3dEXT; +void APIENTRY bluegl_glTangent3dEXT (GLdouble tx, GLdouble ty, GLdouble tz) { + typedef void (APIENTRYP PFN_glTangent3dEXT) (GLdouble tx, GLdouble ty, GLdouble tz); + return ((PFN_glTangent3dEXT)__blue_glCore_glTangent3dEXT)(tx, ty, tz); +} + +extern void* __blue_glCore_glTangent3dvEXT; +void APIENTRY bluegl_glTangent3dvEXT (const GLdouble *v) { + typedef void (APIENTRYP PFN_glTangent3dvEXT) (const GLdouble *v); + return ((PFN_glTangent3dvEXT)__blue_glCore_glTangent3dvEXT)(v); +} + +extern void* __blue_glCore_glTangent3fEXT; +void APIENTRY bluegl_glTangent3fEXT (GLfloat tx, GLfloat ty, GLfloat tz) { + typedef void (APIENTRYP PFN_glTangent3fEXT) (GLfloat tx, GLfloat ty, GLfloat tz); + return ((PFN_glTangent3fEXT)__blue_glCore_glTangent3fEXT)(tx, ty, tz); +} + +extern void* __blue_glCore_glTangent3fvEXT; +void APIENTRY bluegl_glTangent3fvEXT (const GLfloat *v) { + typedef void (APIENTRYP PFN_glTangent3fvEXT) (const GLfloat *v); + return ((PFN_glTangent3fvEXT)__blue_glCore_glTangent3fvEXT)(v); +} + +extern void* __blue_glCore_glTangent3iEXT; +void APIENTRY bluegl_glTangent3iEXT (GLint tx, GLint ty, GLint tz) { + typedef void (APIENTRYP PFN_glTangent3iEXT) (GLint tx, GLint ty, GLint tz); + return ((PFN_glTangent3iEXT)__blue_glCore_glTangent3iEXT)(tx, ty, tz); +} + +extern void* __blue_glCore_glTangent3ivEXT; +void APIENTRY bluegl_glTangent3ivEXT (const GLint *v) { + typedef void (APIENTRYP PFN_glTangent3ivEXT) (const GLint *v); + return ((PFN_glTangent3ivEXT)__blue_glCore_glTangent3ivEXT)(v); +} + +extern void* __blue_glCore_glTangent3sEXT; +void APIENTRY bluegl_glTangent3sEXT (GLshort tx, GLshort ty, GLshort tz) { + typedef void (APIENTRYP PFN_glTangent3sEXT) (GLshort tx, GLshort ty, GLshort tz); + return ((PFN_glTangent3sEXT)__blue_glCore_glTangent3sEXT)(tx, ty, tz); +} + +extern void* __blue_glCore_glTangent3svEXT; +void APIENTRY bluegl_glTangent3svEXT (const GLshort *v) { + typedef void (APIENTRYP PFN_glTangent3svEXT) (const GLshort *v); + return ((PFN_glTangent3svEXT)__blue_glCore_glTangent3svEXT)(v); +} + +extern void* __blue_glCore_glBinormal3bEXT; +void APIENTRY bluegl_glBinormal3bEXT (GLbyte bx, GLbyte by, GLbyte bz) { + typedef void (APIENTRYP PFN_glBinormal3bEXT) (GLbyte bx, GLbyte by, GLbyte bz); + return ((PFN_glBinormal3bEXT)__blue_glCore_glBinormal3bEXT)(bx, by, bz); +} + +extern void* __blue_glCore_glBinormal3bvEXT; +void APIENTRY bluegl_glBinormal3bvEXT (const GLbyte *v) { + typedef void (APIENTRYP PFN_glBinormal3bvEXT) (const GLbyte *v); + return ((PFN_glBinormal3bvEXT)__blue_glCore_glBinormal3bvEXT)(v); +} + +extern void* __blue_glCore_glBinormal3dEXT; +void APIENTRY bluegl_glBinormal3dEXT (GLdouble bx, GLdouble by, GLdouble bz) { + typedef void (APIENTRYP PFN_glBinormal3dEXT) (GLdouble bx, GLdouble by, GLdouble bz); + return ((PFN_glBinormal3dEXT)__blue_glCore_glBinormal3dEXT)(bx, by, bz); +} + +extern void* __blue_glCore_glBinormal3dvEXT; +void APIENTRY bluegl_glBinormal3dvEXT (const GLdouble *v) { + typedef void (APIENTRYP PFN_glBinormal3dvEXT) (const GLdouble *v); + return ((PFN_glBinormal3dvEXT)__blue_glCore_glBinormal3dvEXT)(v); +} + +extern void* __blue_glCore_glBinormal3fEXT; +void APIENTRY bluegl_glBinormal3fEXT (GLfloat bx, GLfloat by, GLfloat bz) { + typedef void (APIENTRYP PFN_glBinormal3fEXT) (GLfloat bx, GLfloat by, GLfloat bz); + return ((PFN_glBinormal3fEXT)__blue_glCore_glBinormal3fEXT)(bx, by, bz); +} + +extern void* __blue_glCore_glBinormal3fvEXT; +void APIENTRY bluegl_glBinormal3fvEXT (const GLfloat *v) { + typedef void (APIENTRYP PFN_glBinormal3fvEXT) (const GLfloat *v); + return ((PFN_glBinormal3fvEXT)__blue_glCore_glBinormal3fvEXT)(v); +} + +extern void* __blue_glCore_glBinormal3iEXT; +void APIENTRY bluegl_glBinormal3iEXT (GLint bx, GLint by, GLint bz) { + typedef void (APIENTRYP PFN_glBinormal3iEXT) (GLint bx, GLint by, GLint bz); + return ((PFN_glBinormal3iEXT)__blue_glCore_glBinormal3iEXT)(bx, by, bz); +} + +extern void* __blue_glCore_glBinormal3ivEXT; +void APIENTRY bluegl_glBinormal3ivEXT (const GLint *v) { + typedef void (APIENTRYP PFN_glBinormal3ivEXT) (const GLint *v); + return ((PFN_glBinormal3ivEXT)__blue_glCore_glBinormal3ivEXT)(v); +} + +extern void* __blue_glCore_glBinormal3sEXT; +void APIENTRY bluegl_glBinormal3sEXT (GLshort bx, GLshort by, GLshort bz) { + typedef void (APIENTRYP PFN_glBinormal3sEXT) (GLshort bx, GLshort by, GLshort bz); + return ((PFN_glBinormal3sEXT)__blue_glCore_glBinormal3sEXT)(bx, by, bz); +} + +extern void* __blue_glCore_glBinormal3svEXT; +void APIENTRY bluegl_glBinormal3svEXT (const GLshort *v) { + typedef void (APIENTRYP PFN_glBinormal3svEXT) (const GLshort *v); + return ((PFN_glBinormal3svEXT)__blue_glCore_glBinormal3svEXT)(v); +} + +extern void* __blue_glCore_glTangentPointerEXT; +void APIENTRY bluegl_glTangentPointerEXT (GLenum type, GLsizei stride, const void *pointer) { + typedef void (APIENTRYP PFN_glTangentPointerEXT) (GLenum type, GLsizei stride, const void *pointer); + return ((PFN_glTangentPointerEXT)__blue_glCore_glTangentPointerEXT)(type, stride, pointer); +} + +extern void* __blue_glCore_glBinormalPointerEXT; +void APIENTRY bluegl_glBinormalPointerEXT (GLenum type, GLsizei stride, const void *pointer) { + typedef void (APIENTRYP PFN_glBinormalPointerEXT) (GLenum type, GLsizei stride, const void *pointer); + return ((PFN_glBinormalPointerEXT)__blue_glCore_glBinormalPointerEXT)(type, stride, pointer); +} + +extern void* __blue_glCore_glCopyTexImage1DEXT; +void APIENTRY bluegl_glCopyTexImage1DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) { + typedef void (APIENTRYP PFN_glCopyTexImage1DEXT) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); + return ((PFN_glCopyTexImage1DEXT)__blue_glCore_glCopyTexImage1DEXT)(target, level, internalformat, x, y, width, border); +} + +extern void* __blue_glCore_glCopyTexImage2DEXT; +void APIENTRY bluegl_glCopyTexImage2DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { + typedef void (APIENTRYP PFN_glCopyTexImage2DEXT) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); + return ((PFN_glCopyTexImage2DEXT)__blue_glCore_glCopyTexImage2DEXT)(target, level, internalformat, x, y, width, height, border); +} + +extern void* __blue_glCore_glCopyTexSubImage1DEXT; +void APIENTRY bluegl_glCopyTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { + typedef void (APIENTRYP PFN_glCopyTexSubImage1DEXT) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); + return ((PFN_glCopyTexSubImage1DEXT)__blue_glCore_glCopyTexSubImage1DEXT)(target, level, xoffset, x, y, width); +} + +extern void* __blue_glCore_glCopyTexSubImage2DEXT; +void APIENTRY bluegl_glCopyTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glCopyTexSubImage2DEXT) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); + return ((PFN_glCopyTexSubImage2DEXT)__blue_glCore_glCopyTexSubImage2DEXT)(target, level, xoffset, yoffset, x, y, width, height); +} + +extern void* __blue_glCore_glCopyTexSubImage3DEXT; +void APIENTRY bluegl_glCopyTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glCopyTexSubImage3DEXT) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + return ((PFN_glCopyTexSubImage3DEXT)__blue_glCore_glCopyTexSubImage3DEXT)(target, level, xoffset, yoffset, zoffset, x, y, width, height); +} + +extern void* __blue_glCore_glCullParameterdvEXT; +void APIENTRY bluegl_glCullParameterdvEXT (GLenum pname, GLdouble *params) { + typedef void (APIENTRYP PFN_glCullParameterdvEXT) (GLenum pname, GLdouble *params); + return ((PFN_glCullParameterdvEXT)__blue_glCore_glCullParameterdvEXT)(pname, params); +} + +extern void* __blue_glCore_glCullParameterfvEXT; +void APIENTRY bluegl_glCullParameterfvEXT (GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glCullParameterfvEXT) (GLenum pname, GLfloat *params); + return ((PFN_glCullParameterfvEXT)__blue_glCore_glCullParameterfvEXT)(pname, params); +} + +extern void* __blue_glCore_glLabelObjectEXT; +void APIENTRY bluegl_glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label) { + typedef void (APIENTRYP PFN_glLabelObjectEXT) (GLenum type, GLuint object, GLsizei length, const GLchar *label); + return ((PFN_glLabelObjectEXT)__blue_glCore_glLabelObjectEXT)(type, object, length, label); +} + +extern void* __blue_glCore_glGetObjectLabelEXT; +void APIENTRY bluegl_glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label) { + typedef void (APIENTRYP PFN_glGetObjectLabelEXT) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); + return ((PFN_glGetObjectLabelEXT)__blue_glCore_glGetObjectLabelEXT)(type, object, bufSize, length, label); +} + +extern void* __blue_glCore_glInsertEventMarkerEXT; +void APIENTRY bluegl_glInsertEventMarkerEXT (GLsizei length, const GLchar *marker) { + typedef void (APIENTRYP PFN_glInsertEventMarkerEXT) (GLsizei length, const GLchar *marker); + return ((PFN_glInsertEventMarkerEXT)__blue_glCore_glInsertEventMarkerEXT)(length, marker); +} + +extern void* __blue_glCore_glPushGroupMarkerEXT; +void APIENTRY bluegl_glPushGroupMarkerEXT (GLsizei length, const GLchar *marker) { + typedef void (APIENTRYP PFN_glPushGroupMarkerEXT) (GLsizei length, const GLchar *marker); + return ((PFN_glPushGroupMarkerEXT)__blue_glCore_glPushGroupMarkerEXT)(length, marker); +} + +extern void* __blue_glCore_glPopGroupMarkerEXT; +void APIENTRY bluegl_glPopGroupMarkerEXT (void) { + typedef void (APIENTRYP PFN_glPopGroupMarkerEXT) (void); + return ((PFN_glPopGroupMarkerEXT)__blue_glCore_glPopGroupMarkerEXT)(); +} + +extern void* __blue_glCore_glDepthBoundsEXT; +void APIENTRY bluegl_glDepthBoundsEXT (GLclampd zmin, GLclampd zmax) { + typedef void (APIENTRYP PFN_glDepthBoundsEXT) (GLclampd zmin, GLclampd zmax); + return ((PFN_glDepthBoundsEXT)__blue_glCore_glDepthBoundsEXT)(zmin, zmax); +} + +extern void* __blue_glCore_glMatrixLoadfEXT; +void APIENTRY bluegl_glMatrixLoadfEXT (GLenum mode, const GLfloat *m) { + typedef void (APIENTRYP PFN_glMatrixLoadfEXT) (GLenum mode, const GLfloat *m); + return ((PFN_glMatrixLoadfEXT)__blue_glCore_glMatrixLoadfEXT)(mode, m); +} + +extern void* __blue_glCore_glMatrixLoaddEXT; +void APIENTRY bluegl_glMatrixLoaddEXT (GLenum mode, const GLdouble *m) { + typedef void (APIENTRYP PFN_glMatrixLoaddEXT) (GLenum mode, const GLdouble *m); + return ((PFN_glMatrixLoaddEXT)__blue_glCore_glMatrixLoaddEXT)(mode, m); +} + +extern void* __blue_glCore_glMatrixMultfEXT; +void APIENTRY bluegl_glMatrixMultfEXT (GLenum mode, const GLfloat *m) { + typedef void (APIENTRYP PFN_glMatrixMultfEXT) (GLenum mode, const GLfloat *m); + return ((PFN_glMatrixMultfEXT)__blue_glCore_glMatrixMultfEXT)(mode, m); +} + +extern void* __blue_glCore_glMatrixMultdEXT; +void APIENTRY bluegl_glMatrixMultdEXT (GLenum mode, const GLdouble *m) { + typedef void (APIENTRYP PFN_glMatrixMultdEXT) (GLenum mode, const GLdouble *m); + return ((PFN_glMatrixMultdEXT)__blue_glCore_glMatrixMultdEXT)(mode, m); +} + +extern void* __blue_glCore_glMatrixLoadIdentityEXT; +void APIENTRY bluegl_glMatrixLoadIdentityEXT (GLenum mode) { + typedef void (APIENTRYP PFN_glMatrixLoadIdentityEXT) (GLenum mode); + return ((PFN_glMatrixLoadIdentityEXT)__blue_glCore_glMatrixLoadIdentityEXT)(mode); +} + +extern void* __blue_glCore_glMatrixRotatefEXT; +void APIENTRY bluegl_glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glMatrixRotatefEXT) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glMatrixRotatefEXT)__blue_glCore_glMatrixRotatefEXT)(mode, angle, x, y, z); +} + +extern void* __blue_glCore_glMatrixRotatedEXT; +void APIENTRY bluegl_glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z) { + typedef void (APIENTRYP PFN_glMatrixRotatedEXT) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); + return ((PFN_glMatrixRotatedEXT)__blue_glCore_glMatrixRotatedEXT)(mode, angle, x, y, z); +} + +extern void* __blue_glCore_glMatrixScalefEXT; +void APIENTRY bluegl_glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glMatrixScalefEXT) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glMatrixScalefEXT)__blue_glCore_glMatrixScalefEXT)(mode, x, y, z); +} + +extern void* __blue_glCore_glMatrixScaledEXT; +void APIENTRY bluegl_glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z) { + typedef void (APIENTRYP PFN_glMatrixScaledEXT) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); + return ((PFN_glMatrixScaledEXT)__blue_glCore_glMatrixScaledEXT)(mode, x, y, z); +} + +extern void* __blue_glCore_glMatrixTranslatefEXT; +void APIENTRY bluegl_glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glMatrixTranslatefEXT) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glMatrixTranslatefEXT)__blue_glCore_glMatrixTranslatefEXT)(mode, x, y, z); +} + +extern void* __blue_glCore_glMatrixTranslatedEXT; +void APIENTRY bluegl_glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z) { + typedef void (APIENTRYP PFN_glMatrixTranslatedEXT) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); + return ((PFN_glMatrixTranslatedEXT)__blue_glCore_glMatrixTranslatedEXT)(mode, x, y, z); +} + +extern void* __blue_glCore_glMatrixFrustumEXT; +void APIENTRY bluegl_glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { + typedef void (APIENTRYP PFN_glMatrixFrustumEXT) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); + return ((PFN_glMatrixFrustumEXT)__blue_glCore_glMatrixFrustumEXT)(mode, left, right, bottom, top, zNear, zFar); +} + +extern void* __blue_glCore_glMatrixOrthoEXT; +void APIENTRY bluegl_glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { + typedef void (APIENTRYP PFN_glMatrixOrthoEXT) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); + return ((PFN_glMatrixOrthoEXT)__blue_glCore_glMatrixOrthoEXT)(mode, left, right, bottom, top, zNear, zFar); +} + +extern void* __blue_glCore_glMatrixPopEXT; +void APIENTRY bluegl_glMatrixPopEXT (GLenum mode) { + typedef void (APIENTRYP PFN_glMatrixPopEXT) (GLenum mode); + return ((PFN_glMatrixPopEXT)__blue_glCore_glMatrixPopEXT)(mode); +} + +extern void* __blue_glCore_glMatrixPushEXT; +void APIENTRY bluegl_glMatrixPushEXT (GLenum mode) { + typedef void (APIENTRYP PFN_glMatrixPushEXT) (GLenum mode); + return ((PFN_glMatrixPushEXT)__blue_glCore_glMatrixPushEXT)(mode); +} + +extern void* __blue_glCore_glClientAttribDefaultEXT; +void APIENTRY bluegl_glClientAttribDefaultEXT (GLbitfield mask) { + typedef void (APIENTRYP PFN_glClientAttribDefaultEXT) (GLbitfield mask); + return ((PFN_glClientAttribDefaultEXT)__blue_glCore_glClientAttribDefaultEXT)(mask); +} + +extern void* __blue_glCore_glPushClientAttribDefaultEXT; +void APIENTRY bluegl_glPushClientAttribDefaultEXT (GLbitfield mask) { + typedef void (APIENTRYP PFN_glPushClientAttribDefaultEXT) (GLbitfield mask); + return ((PFN_glPushClientAttribDefaultEXT)__blue_glCore_glPushClientAttribDefaultEXT)(mask); +} + +extern void* __blue_glCore_glTextureParameterfEXT; +void APIENTRY bluegl_glTextureParameterfEXT (GLuint texture, GLenum target, GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glTextureParameterfEXT) (GLuint texture, GLenum target, GLenum pname, GLfloat param); + return ((PFN_glTextureParameterfEXT)__blue_glCore_glTextureParameterfEXT)(texture, target, pname, param); +} + +extern void* __blue_glCore_glTextureParameterfvEXT; +void APIENTRY bluegl_glTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glTextureParameterfvEXT) (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); + return ((PFN_glTextureParameterfvEXT)__blue_glCore_glTextureParameterfvEXT)(texture, target, pname, params); +} + +extern void* __blue_glCore_glTextureParameteriEXT; +void APIENTRY bluegl_glTextureParameteriEXT (GLuint texture, GLenum target, GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glTextureParameteriEXT) (GLuint texture, GLenum target, GLenum pname, GLint param); + return ((PFN_glTextureParameteriEXT)__blue_glCore_glTextureParameteriEXT)(texture, target, pname, param); +} + +extern void* __blue_glCore_glTextureParameterivEXT; +void APIENTRY bluegl_glTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glTextureParameterivEXT) (GLuint texture, GLenum target, GLenum pname, const GLint *params); + return ((PFN_glTextureParameterivEXT)__blue_glCore_glTextureParameterivEXT)(texture, target, pname, params); +} + +extern void* __blue_glCore_glTextureImage1DEXT; +void APIENTRY bluegl_glTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels) { + typedef void (APIENTRYP PFN_glTextureImage1DEXT) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTextureImage1DEXT)__blue_glCore_glTextureImage1DEXT)(texture, target, level, internalformat, width, border, format, type, pixels); +} + +extern void* __blue_glCore_glTextureImage2DEXT; +void APIENTRY bluegl_glTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels) { + typedef void (APIENTRYP PFN_glTextureImage2DEXT) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTextureImage2DEXT)__blue_glCore_glTextureImage2DEXT)(texture, target, level, internalformat, width, height, border, format, type, pixels); +} + +extern void* __blue_glCore_glTextureSubImage1DEXT; +void APIENTRY bluegl_glTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels) { + typedef void (APIENTRYP PFN_glTextureSubImage1DEXT) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTextureSubImage1DEXT)__blue_glCore_glTextureSubImage1DEXT)(texture, target, level, xoffset, width, format, type, pixels); +} + +extern void* __blue_glCore_glTextureSubImage2DEXT; +void APIENTRY bluegl_glTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) { + typedef void (APIENTRYP PFN_glTextureSubImage2DEXT) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTextureSubImage2DEXT)__blue_glCore_glTextureSubImage2DEXT)(texture, target, level, xoffset, yoffset, width, height, format, type, pixels); +} + +extern void* __blue_glCore_glCopyTextureImage1DEXT; +void APIENTRY bluegl_glCopyTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) { + typedef void (APIENTRYP PFN_glCopyTextureImage1DEXT) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); + return ((PFN_glCopyTextureImage1DEXT)__blue_glCore_glCopyTextureImage1DEXT)(texture, target, level, internalformat, x, y, width, border); +} + +extern void* __blue_glCore_glCopyTextureImage2DEXT; +void APIENTRY bluegl_glCopyTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { + typedef void (APIENTRYP PFN_glCopyTextureImage2DEXT) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); + return ((PFN_glCopyTextureImage2DEXT)__blue_glCore_glCopyTextureImage2DEXT)(texture, target, level, internalformat, x, y, width, height, border); +} + +extern void* __blue_glCore_glCopyTextureSubImage1DEXT; +void APIENTRY bluegl_glCopyTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { + typedef void (APIENTRYP PFN_glCopyTextureSubImage1DEXT) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); + return ((PFN_glCopyTextureSubImage1DEXT)__blue_glCore_glCopyTextureSubImage1DEXT)(texture, target, level, xoffset, x, y, width); +} + +extern void* __blue_glCore_glCopyTextureSubImage2DEXT; +void APIENTRY bluegl_glCopyTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glCopyTextureSubImage2DEXT) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); + return ((PFN_glCopyTextureSubImage2DEXT)__blue_glCore_glCopyTextureSubImage2DEXT)(texture, target, level, xoffset, yoffset, x, y, width, height); +} + +extern void* __blue_glCore_glGetTextureImageEXT; +void APIENTRY bluegl_glGetTextureImageEXT (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels) { + typedef void (APIENTRYP PFN_glGetTextureImageEXT) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); + return ((PFN_glGetTextureImageEXT)__blue_glCore_glGetTextureImageEXT)(texture, target, level, format, type, pixels); +} + +extern void* __blue_glCore_glGetTextureParameterfvEXT; +void APIENTRY bluegl_glGetTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetTextureParameterfvEXT) (GLuint texture, GLenum target, GLenum pname, GLfloat *params); + return ((PFN_glGetTextureParameterfvEXT)__blue_glCore_glGetTextureParameterfvEXT)(texture, target, pname, params); +} + +extern void* __blue_glCore_glGetTextureParameterivEXT; +void APIENTRY bluegl_glGetTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetTextureParameterivEXT) (GLuint texture, GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetTextureParameterivEXT)__blue_glCore_glGetTextureParameterivEXT)(texture, target, pname, params); +} + +extern void* __blue_glCore_glGetTextureLevelParameterfvEXT; +void APIENTRY bluegl_glGetTextureLevelParameterfvEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetTextureLevelParameterfvEXT) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); + return ((PFN_glGetTextureLevelParameterfvEXT)__blue_glCore_glGetTextureLevelParameterfvEXT)(texture, target, level, pname, params); +} + +extern void* __blue_glCore_glGetTextureLevelParameterivEXT; +void APIENTRY bluegl_glGetTextureLevelParameterivEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetTextureLevelParameterivEXT) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); + return ((PFN_glGetTextureLevelParameterivEXT)__blue_glCore_glGetTextureLevelParameterivEXT)(texture, target, level, pname, params); +} + +extern void* __blue_glCore_glTextureImage3DEXT; +void APIENTRY bluegl_glTextureImage3DEXT (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 PFN_glTextureImage3DEXT) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTextureImage3DEXT)__blue_glCore_glTextureImage3DEXT)(texture, target, level, internalformat, width, height, depth, border, format, type, pixels); +} + +extern void* __blue_glCore_glTextureSubImage3DEXT; +void APIENTRY bluegl_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) { + typedef void (APIENTRYP PFN_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); + return ((PFN_glTextureSubImage3DEXT)__blue_glCore_glTextureSubImage3DEXT)(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); +} + +extern void* __blue_glCore_glCopyTextureSubImage3DEXT; +void APIENTRY bluegl_glCopyTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glCopyTextureSubImage3DEXT) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + return ((PFN_glCopyTextureSubImage3DEXT)__blue_glCore_glCopyTextureSubImage3DEXT)(texture, target, level, xoffset, yoffset, zoffset, x, y, width, height); +} + +extern void* __blue_glCore_glBindMultiTextureEXT; +void APIENTRY bluegl_glBindMultiTextureEXT (GLenum texunit, GLenum target, GLuint texture) { + typedef void (APIENTRYP PFN_glBindMultiTextureEXT) (GLenum texunit, GLenum target, GLuint texture); + return ((PFN_glBindMultiTextureEXT)__blue_glCore_glBindMultiTextureEXT)(texunit, target, texture); +} + +extern void* __blue_glCore_glMultiTexCoordPointerEXT; +void APIENTRY bluegl_glMultiTexCoordPointerEXT (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer) { + typedef void (APIENTRYP PFN_glMultiTexCoordPointerEXT) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); + return ((PFN_glMultiTexCoordPointerEXT)__blue_glCore_glMultiTexCoordPointerEXT)(texunit, size, type, stride, pointer); +} + +extern void* __blue_glCore_glMultiTexEnvfEXT; +void APIENTRY bluegl_glMultiTexEnvfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glMultiTexEnvfEXT) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); + return ((PFN_glMultiTexEnvfEXT)__blue_glCore_glMultiTexEnvfEXT)(texunit, target, pname, param); +} + +extern void* __blue_glCore_glMultiTexEnvfvEXT; +void APIENTRY bluegl_glMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glMultiTexEnvfvEXT) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); + return ((PFN_glMultiTexEnvfvEXT)__blue_glCore_glMultiTexEnvfvEXT)(texunit, target, pname, params); +} + +extern void* __blue_glCore_glMultiTexEnviEXT; +void APIENTRY bluegl_glMultiTexEnviEXT (GLenum texunit, GLenum target, GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glMultiTexEnviEXT) (GLenum texunit, GLenum target, GLenum pname, GLint param); + return ((PFN_glMultiTexEnviEXT)__blue_glCore_glMultiTexEnviEXT)(texunit, target, pname, param); +} + +extern void* __blue_glCore_glMultiTexEnvivEXT; +void APIENTRY bluegl_glMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glMultiTexEnvivEXT) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); + return ((PFN_glMultiTexEnvivEXT)__blue_glCore_glMultiTexEnvivEXT)(texunit, target, pname, params); +} + +extern void* __blue_glCore_glMultiTexGendEXT; +void APIENTRY bluegl_glMultiTexGendEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble param) { + typedef void (APIENTRYP PFN_glMultiTexGendEXT) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); + return ((PFN_glMultiTexGendEXT)__blue_glCore_glMultiTexGendEXT)(texunit, coord, pname, param); +} + +extern void* __blue_glCore_glMultiTexGendvEXT; +void APIENTRY bluegl_glMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params) { + typedef void (APIENTRYP PFN_glMultiTexGendvEXT) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); + return ((PFN_glMultiTexGendvEXT)__blue_glCore_glMultiTexGendvEXT)(texunit, coord, pname, params); +} + +extern void* __blue_glCore_glMultiTexGenfEXT; +void APIENTRY bluegl_glMultiTexGenfEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glMultiTexGenfEXT) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); + return ((PFN_glMultiTexGenfEXT)__blue_glCore_glMultiTexGenfEXT)(texunit, coord, pname, param); +} + +extern void* __blue_glCore_glMultiTexGenfvEXT; +void APIENTRY bluegl_glMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glMultiTexGenfvEXT) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); + return ((PFN_glMultiTexGenfvEXT)__blue_glCore_glMultiTexGenfvEXT)(texunit, coord, pname, params); +} + +extern void* __blue_glCore_glMultiTexGeniEXT; +void APIENTRY bluegl_glMultiTexGeniEXT (GLenum texunit, GLenum coord, GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glMultiTexGeniEXT) (GLenum texunit, GLenum coord, GLenum pname, GLint param); + return ((PFN_glMultiTexGeniEXT)__blue_glCore_glMultiTexGeniEXT)(texunit, coord, pname, param); +} + +extern void* __blue_glCore_glMultiTexGenivEXT; +void APIENTRY bluegl_glMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glMultiTexGenivEXT) (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); + return ((PFN_glMultiTexGenivEXT)__blue_glCore_glMultiTexGenivEXT)(texunit, coord, pname, params); +} + +extern void* __blue_glCore_glGetMultiTexEnvfvEXT; +void APIENTRY bluegl_glGetMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetMultiTexEnvfvEXT) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); + return ((PFN_glGetMultiTexEnvfvEXT)__blue_glCore_glGetMultiTexEnvfvEXT)(texunit, target, pname, params); +} + +extern void* __blue_glCore_glGetMultiTexEnvivEXT; +void APIENTRY bluegl_glGetMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetMultiTexEnvivEXT) (GLenum texunit, GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetMultiTexEnvivEXT)__blue_glCore_glGetMultiTexEnvivEXT)(texunit, target, pname, params); +} + +extern void* __blue_glCore_glGetMultiTexGendvEXT; +void APIENTRY bluegl_glGetMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params) { + typedef void (APIENTRYP PFN_glGetMultiTexGendvEXT) (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); + return ((PFN_glGetMultiTexGendvEXT)__blue_glCore_glGetMultiTexGendvEXT)(texunit, coord, pname, params); +} + +extern void* __blue_glCore_glGetMultiTexGenfvEXT; +void APIENTRY bluegl_glGetMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetMultiTexGenfvEXT) (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); + return ((PFN_glGetMultiTexGenfvEXT)__blue_glCore_glGetMultiTexGenfvEXT)(texunit, coord, pname, params); +} + +extern void* __blue_glCore_glGetMultiTexGenivEXT; +void APIENTRY bluegl_glGetMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetMultiTexGenivEXT) (GLenum texunit, GLenum coord, GLenum pname, GLint *params); + return ((PFN_glGetMultiTexGenivEXT)__blue_glCore_glGetMultiTexGenivEXT)(texunit, coord, pname, params); +} + +extern void* __blue_glCore_glMultiTexParameteriEXT; +void APIENTRY bluegl_glMultiTexParameteriEXT (GLenum texunit, GLenum target, GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glMultiTexParameteriEXT) (GLenum texunit, GLenum target, GLenum pname, GLint param); + return ((PFN_glMultiTexParameteriEXT)__blue_glCore_glMultiTexParameteriEXT)(texunit, target, pname, param); +} + +extern void* __blue_glCore_glMultiTexParameterivEXT; +void APIENTRY bluegl_glMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glMultiTexParameterivEXT) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); + return ((PFN_glMultiTexParameterivEXT)__blue_glCore_glMultiTexParameterivEXT)(texunit, target, pname, params); +} + +extern void* __blue_glCore_glMultiTexParameterfEXT; +void APIENTRY bluegl_glMultiTexParameterfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glMultiTexParameterfEXT) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); + return ((PFN_glMultiTexParameterfEXT)__blue_glCore_glMultiTexParameterfEXT)(texunit, target, pname, param); +} + +extern void* __blue_glCore_glMultiTexParameterfvEXT; +void APIENTRY bluegl_glMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glMultiTexParameterfvEXT) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); + return ((PFN_glMultiTexParameterfvEXT)__blue_glCore_glMultiTexParameterfvEXT)(texunit, target, pname, params); +} + +extern void* __blue_glCore_glMultiTexImage1DEXT; +void APIENTRY bluegl_glMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels) { + typedef void (APIENTRYP PFN_glMultiTexImage1DEXT) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); + return ((PFN_glMultiTexImage1DEXT)__blue_glCore_glMultiTexImage1DEXT)(texunit, target, level, internalformat, width, border, format, type, pixels); +} + +extern void* __blue_glCore_glMultiTexImage2DEXT; +void APIENTRY bluegl_glMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels) { + typedef void (APIENTRYP PFN_glMultiTexImage2DEXT) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); + return ((PFN_glMultiTexImage2DEXT)__blue_glCore_glMultiTexImage2DEXT)(texunit, target, level, internalformat, width, height, border, format, type, pixels); +} + +extern void* __blue_glCore_glMultiTexSubImage1DEXT; +void APIENTRY bluegl_glMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels) { + typedef void (APIENTRYP PFN_glMultiTexSubImage1DEXT) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); + return ((PFN_glMultiTexSubImage1DEXT)__blue_glCore_glMultiTexSubImage1DEXT)(texunit, target, level, xoffset, width, format, type, pixels); +} + +extern void* __blue_glCore_glMultiTexSubImage2DEXT; +void APIENTRY bluegl_glMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) { + typedef void (APIENTRYP PFN_glMultiTexSubImage2DEXT) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); + return ((PFN_glMultiTexSubImage2DEXT)__blue_glCore_glMultiTexSubImage2DEXT)(texunit, target, level, xoffset, yoffset, width, height, format, type, pixels); +} + +extern void* __blue_glCore_glCopyMultiTexImage1DEXT; +void APIENTRY bluegl_glCopyMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) { + typedef void (APIENTRYP PFN_glCopyMultiTexImage1DEXT) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); + return ((PFN_glCopyMultiTexImage1DEXT)__blue_glCore_glCopyMultiTexImage1DEXT)(texunit, target, level, internalformat, x, y, width, border); +} + +extern void* __blue_glCore_glCopyMultiTexImage2DEXT; +void APIENTRY bluegl_glCopyMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { + typedef void (APIENTRYP PFN_glCopyMultiTexImage2DEXT) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); + return ((PFN_glCopyMultiTexImage2DEXT)__blue_glCore_glCopyMultiTexImage2DEXT)(texunit, target, level, internalformat, x, y, width, height, border); +} + +extern void* __blue_glCore_glCopyMultiTexSubImage1DEXT; +void APIENTRY bluegl_glCopyMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { + typedef void (APIENTRYP PFN_glCopyMultiTexSubImage1DEXT) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); + return ((PFN_glCopyMultiTexSubImage1DEXT)__blue_glCore_glCopyMultiTexSubImage1DEXT)(texunit, target, level, xoffset, x, y, width); +} + +extern void* __blue_glCore_glCopyMultiTexSubImage2DEXT; +void APIENTRY bluegl_glCopyMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glCopyMultiTexSubImage2DEXT) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); + return ((PFN_glCopyMultiTexSubImage2DEXT)__blue_glCore_glCopyMultiTexSubImage2DEXT)(texunit, target, level, xoffset, yoffset, x, y, width, height); +} + +extern void* __blue_glCore_glGetMultiTexImageEXT; +void APIENTRY bluegl_glGetMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels) { + typedef void (APIENTRYP PFN_glGetMultiTexImageEXT) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); + return ((PFN_glGetMultiTexImageEXT)__blue_glCore_glGetMultiTexImageEXT)(texunit, target, level, format, type, pixels); +} + +extern void* __blue_glCore_glGetMultiTexParameterfvEXT; +void APIENTRY bluegl_glGetMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetMultiTexParameterfvEXT) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); + return ((PFN_glGetMultiTexParameterfvEXT)__blue_glCore_glGetMultiTexParameterfvEXT)(texunit, target, pname, params); +} + +extern void* __blue_glCore_glGetMultiTexParameterivEXT; +void APIENTRY bluegl_glGetMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetMultiTexParameterivEXT) (GLenum texunit, GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetMultiTexParameterivEXT)__blue_glCore_glGetMultiTexParameterivEXT)(texunit, target, pname, params); +} + +extern void* __blue_glCore_glGetMultiTexLevelParameterfvEXT; +void APIENTRY bluegl_glGetMultiTexLevelParameterfvEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetMultiTexLevelParameterfvEXT) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); + return ((PFN_glGetMultiTexLevelParameterfvEXT)__blue_glCore_glGetMultiTexLevelParameterfvEXT)(texunit, target, level, pname, params); +} + +extern void* __blue_glCore_glGetMultiTexLevelParameterivEXT; +void APIENTRY bluegl_glGetMultiTexLevelParameterivEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetMultiTexLevelParameterivEXT) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); + return ((PFN_glGetMultiTexLevelParameterivEXT)__blue_glCore_glGetMultiTexLevelParameterivEXT)(texunit, target, level, pname, params); +} + +extern void* __blue_glCore_glMultiTexImage3DEXT; +void APIENTRY bluegl_glMultiTexImage3DEXT (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 PFN_glMultiTexImage3DEXT) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); + return ((PFN_glMultiTexImage3DEXT)__blue_glCore_glMultiTexImage3DEXT)(texunit, target, level, internalformat, width, height, depth, border, format, type, pixels); +} + +extern void* __blue_glCore_glMultiTexSubImage3DEXT; +void APIENTRY bluegl_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) { + typedef void (APIENTRYP PFN_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); + return ((PFN_glMultiTexSubImage3DEXT)__blue_glCore_glMultiTexSubImage3DEXT)(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); +} + +extern void* __blue_glCore_glCopyMultiTexSubImage3DEXT; +void APIENTRY bluegl_glCopyMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glCopyMultiTexSubImage3DEXT) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + return ((PFN_glCopyMultiTexSubImage3DEXT)__blue_glCore_glCopyMultiTexSubImage3DEXT)(texunit, target, level, xoffset, yoffset, zoffset, x, y, width, height); +} + +extern void* __blue_glCore_glEnableClientStateIndexedEXT; +void APIENTRY bluegl_glEnableClientStateIndexedEXT (GLenum array, GLuint index) { + typedef void (APIENTRYP PFN_glEnableClientStateIndexedEXT) (GLenum array, GLuint index); + return ((PFN_glEnableClientStateIndexedEXT)__blue_glCore_glEnableClientStateIndexedEXT)(array, index); +} + +extern void* __blue_glCore_glDisableClientStateIndexedEXT; +void APIENTRY bluegl_glDisableClientStateIndexedEXT (GLenum array, GLuint index) { + typedef void (APIENTRYP PFN_glDisableClientStateIndexedEXT) (GLenum array, GLuint index); + return ((PFN_glDisableClientStateIndexedEXT)__blue_glCore_glDisableClientStateIndexedEXT)(array, index); +} + +extern void* __blue_glCore_glGetFloatIndexedvEXT; +void APIENTRY bluegl_glGetFloatIndexedvEXT (GLenum target, GLuint index, GLfloat *data) { + typedef void (APIENTRYP PFN_glGetFloatIndexedvEXT) (GLenum target, GLuint index, GLfloat *data); + return ((PFN_glGetFloatIndexedvEXT)__blue_glCore_glGetFloatIndexedvEXT)(target, index, data); +} + +extern void* __blue_glCore_glGetDoubleIndexedvEXT; +void APIENTRY bluegl_glGetDoubleIndexedvEXT (GLenum target, GLuint index, GLdouble *data) { + typedef void (APIENTRYP PFN_glGetDoubleIndexedvEXT) (GLenum target, GLuint index, GLdouble *data); + return ((PFN_glGetDoubleIndexedvEXT)__blue_glCore_glGetDoubleIndexedvEXT)(target, index, data); +} + +extern void* __blue_glCore_glGetPointerIndexedvEXT; +void APIENTRY bluegl_glGetPointerIndexedvEXT (GLenum target, GLuint index, void **data) { + typedef void (APIENTRYP PFN_glGetPointerIndexedvEXT) (GLenum target, GLuint index, void **data); + return ((PFN_glGetPointerIndexedvEXT)__blue_glCore_glGetPointerIndexedvEXT)(target, index, data); +} + +extern void* __blue_glCore_glEnableIndexedEXT; +void APIENTRY bluegl_glEnableIndexedEXT (GLenum target, GLuint index) { + typedef void (APIENTRYP PFN_glEnableIndexedEXT) (GLenum target, GLuint index); + return ((PFN_glEnableIndexedEXT)__blue_glCore_glEnableIndexedEXT)(target, index); +} + +extern void* __blue_glCore_glDisableIndexedEXT; +void APIENTRY bluegl_glDisableIndexedEXT (GLenum target, GLuint index) { + typedef void (APIENTRYP PFN_glDisableIndexedEXT) (GLenum target, GLuint index); + return ((PFN_glDisableIndexedEXT)__blue_glCore_glDisableIndexedEXT)(target, index); +} + +extern void* __blue_glCore_glIsEnabledIndexedEXT; +GLboolean APIENTRY bluegl_glIsEnabledIndexedEXT (GLenum target, GLuint index) { + typedef GLboolean (APIENTRYP PFN_glIsEnabledIndexedEXT) (GLenum target, GLuint index); + return ((PFN_glIsEnabledIndexedEXT)__blue_glCore_glIsEnabledIndexedEXT)(target, index); +} + +extern void* __blue_glCore_glGetIntegerIndexedvEXT; +void APIENTRY bluegl_glGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data) { + typedef void (APIENTRYP PFN_glGetIntegerIndexedvEXT) (GLenum target, GLuint index, GLint *data); + return ((PFN_glGetIntegerIndexedvEXT)__blue_glCore_glGetIntegerIndexedvEXT)(target, index, data); +} + +extern void* __blue_glCore_glGetBooleanIndexedvEXT; +void APIENTRY bluegl_glGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data) { + typedef void (APIENTRYP PFN_glGetBooleanIndexedvEXT) (GLenum target, GLuint index, GLboolean *data); + return ((PFN_glGetBooleanIndexedvEXT)__blue_glCore_glGetBooleanIndexedvEXT)(target, index, data); +} + +extern void* __blue_glCore_glCompressedTextureImage3DEXT; +void APIENTRY bluegl_glCompressedTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits) { + typedef void (APIENTRYP PFN_glCompressedTextureImage3DEXT) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); + return ((PFN_glCompressedTextureImage3DEXT)__blue_glCore_glCompressedTextureImage3DEXT)(texture, target, level, internalformat, width, height, depth, border, imageSize, bits); +} + +extern void* __blue_glCore_glCompressedTextureImage2DEXT; +void APIENTRY bluegl_glCompressedTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits) { + typedef void (APIENTRYP PFN_glCompressedTextureImage2DEXT) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); + return ((PFN_glCompressedTextureImage2DEXT)__blue_glCore_glCompressedTextureImage2DEXT)(texture, target, level, internalformat, width, height, border, imageSize, bits); +} + +extern void* __blue_glCore_glCompressedTextureImage1DEXT; +void APIENTRY bluegl_glCompressedTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits) { + typedef void (APIENTRYP PFN_glCompressedTextureImage1DEXT) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); + return ((PFN_glCompressedTextureImage1DEXT)__blue_glCore_glCompressedTextureImage1DEXT)(texture, target, level, internalformat, width, border, imageSize, bits); +} + +extern void* __blue_glCore_glCompressedTextureSubImage3DEXT; +void APIENTRY bluegl_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) { + typedef void (APIENTRYP PFN_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); + return ((PFN_glCompressedTextureSubImage3DEXT)__blue_glCore_glCompressedTextureSubImage3DEXT)(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits); +} + +extern void* __blue_glCore_glCompressedTextureSubImage2DEXT; +void APIENTRY bluegl_glCompressedTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits) { + typedef void (APIENTRYP PFN_glCompressedTextureSubImage2DEXT) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); + return ((PFN_glCompressedTextureSubImage2DEXT)__blue_glCore_glCompressedTextureSubImage2DEXT)(texture, target, level, xoffset, yoffset, width, height, format, imageSize, bits); +} + +extern void* __blue_glCore_glCompressedTextureSubImage1DEXT; +void APIENTRY bluegl_glCompressedTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits) { + typedef void (APIENTRYP PFN_glCompressedTextureSubImage1DEXT) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); + return ((PFN_glCompressedTextureSubImage1DEXT)__blue_glCore_glCompressedTextureSubImage1DEXT)(texture, target, level, xoffset, width, format, imageSize, bits); +} + +extern void* __blue_glCore_glGetCompressedTextureImageEXT; +void APIENTRY bluegl_glGetCompressedTextureImageEXT (GLuint texture, GLenum target, GLint lod, void *img) { + typedef void (APIENTRYP PFN_glGetCompressedTextureImageEXT) (GLuint texture, GLenum target, GLint lod, void *img); + return ((PFN_glGetCompressedTextureImageEXT)__blue_glCore_glGetCompressedTextureImageEXT)(texture, target, lod, img); +} + +extern void* __blue_glCore_glCompressedMultiTexImage3DEXT; +void APIENTRY bluegl_glCompressedMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits) { + typedef void (APIENTRYP PFN_glCompressedMultiTexImage3DEXT) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); + return ((PFN_glCompressedMultiTexImage3DEXT)__blue_glCore_glCompressedMultiTexImage3DEXT)(texunit, target, level, internalformat, width, height, depth, border, imageSize, bits); +} + +extern void* __blue_glCore_glCompressedMultiTexImage2DEXT; +void APIENTRY bluegl_glCompressedMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits) { + typedef void (APIENTRYP PFN_glCompressedMultiTexImage2DEXT) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); + return ((PFN_glCompressedMultiTexImage2DEXT)__blue_glCore_glCompressedMultiTexImage2DEXT)(texunit, target, level, internalformat, width, height, border, imageSize, bits); +} + +extern void* __blue_glCore_glCompressedMultiTexImage1DEXT; +void APIENTRY bluegl_glCompressedMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits) { + typedef void (APIENTRYP PFN_glCompressedMultiTexImage1DEXT) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); + return ((PFN_glCompressedMultiTexImage1DEXT)__blue_glCore_glCompressedMultiTexImage1DEXT)(texunit, target, level, internalformat, width, border, imageSize, bits); +} + +extern void* __blue_glCore_glCompressedMultiTexSubImage3DEXT; +void APIENTRY bluegl_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) { + typedef void (APIENTRYP PFN_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); + return ((PFN_glCompressedMultiTexSubImage3DEXT)__blue_glCore_glCompressedMultiTexSubImage3DEXT)(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits); +} + +extern void* __blue_glCore_glCompressedMultiTexSubImage2DEXT; +void APIENTRY bluegl_glCompressedMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits) { + typedef void (APIENTRYP PFN_glCompressedMultiTexSubImage2DEXT) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); + return ((PFN_glCompressedMultiTexSubImage2DEXT)__blue_glCore_glCompressedMultiTexSubImage2DEXT)(texunit, target, level, xoffset, yoffset, width, height, format, imageSize, bits); +} + +extern void* __blue_glCore_glCompressedMultiTexSubImage1DEXT; +void APIENTRY bluegl_glCompressedMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits) { + typedef void (APIENTRYP PFN_glCompressedMultiTexSubImage1DEXT) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); + return ((PFN_glCompressedMultiTexSubImage1DEXT)__blue_glCore_glCompressedMultiTexSubImage1DEXT)(texunit, target, level, xoffset, width, format, imageSize, bits); +} + +extern void* __blue_glCore_glGetCompressedMultiTexImageEXT; +void APIENTRY bluegl_glGetCompressedMultiTexImageEXT (GLenum texunit, GLenum target, GLint lod, void *img) { + typedef void (APIENTRYP PFN_glGetCompressedMultiTexImageEXT) (GLenum texunit, GLenum target, GLint lod, void *img); + return ((PFN_glGetCompressedMultiTexImageEXT)__blue_glCore_glGetCompressedMultiTexImageEXT)(texunit, target, lod, img); +} + +extern void* __blue_glCore_glMatrixLoadTransposefEXT; +void APIENTRY bluegl_glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m) { + typedef void (APIENTRYP PFN_glMatrixLoadTransposefEXT) (GLenum mode, const GLfloat *m); + return ((PFN_glMatrixLoadTransposefEXT)__blue_glCore_glMatrixLoadTransposefEXT)(mode, m); +} + +extern void* __blue_glCore_glMatrixLoadTransposedEXT; +void APIENTRY bluegl_glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m) { + typedef void (APIENTRYP PFN_glMatrixLoadTransposedEXT) (GLenum mode, const GLdouble *m); + return ((PFN_glMatrixLoadTransposedEXT)__blue_glCore_glMatrixLoadTransposedEXT)(mode, m); +} + +extern void* __blue_glCore_glMatrixMultTransposefEXT; +void APIENTRY bluegl_glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m) { + typedef void (APIENTRYP PFN_glMatrixMultTransposefEXT) (GLenum mode, const GLfloat *m); + return ((PFN_glMatrixMultTransposefEXT)__blue_glCore_glMatrixMultTransposefEXT)(mode, m); +} + +extern void* __blue_glCore_glMatrixMultTransposedEXT; +void APIENTRY bluegl_glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m) { + typedef void (APIENTRYP PFN_glMatrixMultTransposedEXT) (GLenum mode, const GLdouble *m); + return ((PFN_glMatrixMultTransposedEXT)__blue_glCore_glMatrixMultTransposedEXT)(mode, m); +} + +extern void* __blue_glCore_glNamedBufferDataEXT; +void APIENTRY bluegl_glNamedBufferDataEXT (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage) { + typedef void (APIENTRYP PFN_glNamedBufferDataEXT) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); + return ((PFN_glNamedBufferDataEXT)__blue_glCore_glNamedBufferDataEXT)(buffer, size, data, usage); +} + +extern void* __blue_glCore_glNamedBufferSubDataEXT; +void APIENTRY bluegl_glNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data) { + typedef void (APIENTRYP PFN_glNamedBufferSubDataEXT) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); + return ((PFN_glNamedBufferSubDataEXT)__blue_glCore_glNamedBufferSubDataEXT)(buffer, offset, size, data); +} + +extern void* __blue_glCore_glMapNamedBufferEXT; +void *APIENTRY bluegl_glMapNamedBufferEXT (GLuint buffer, GLenum access) { + typedef void *(APIENTRYP PFN_glMapNamedBufferEXT) (GLuint buffer, GLenum access); + return ((PFN_glMapNamedBufferEXT)__blue_glCore_glMapNamedBufferEXT)(buffer, access); +} + +extern void* __blue_glCore_glUnmapNamedBufferEXT; +GLboolean APIENTRY bluegl_glUnmapNamedBufferEXT (GLuint buffer) { + typedef GLboolean (APIENTRYP PFN_glUnmapNamedBufferEXT) (GLuint buffer); + return ((PFN_glUnmapNamedBufferEXT)__blue_glCore_glUnmapNamedBufferEXT)(buffer); +} + +extern void* __blue_glCore_glGetNamedBufferParameterivEXT; +void APIENTRY bluegl_glGetNamedBufferParameterivEXT (GLuint buffer, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetNamedBufferParameterivEXT) (GLuint buffer, GLenum pname, GLint *params); + return ((PFN_glGetNamedBufferParameterivEXT)__blue_glCore_glGetNamedBufferParameterivEXT)(buffer, pname, params); +} + +extern void* __blue_glCore_glGetNamedBufferPointervEXT; +void APIENTRY bluegl_glGetNamedBufferPointervEXT (GLuint buffer, GLenum pname, void **params) { + typedef void (APIENTRYP PFN_glGetNamedBufferPointervEXT) (GLuint buffer, GLenum pname, void **params); + return ((PFN_glGetNamedBufferPointervEXT)__blue_glCore_glGetNamedBufferPointervEXT)(buffer, pname, params); +} + +extern void* __blue_glCore_glGetNamedBufferSubDataEXT; +void APIENTRY bluegl_glGetNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data) { + typedef void (APIENTRYP PFN_glGetNamedBufferSubDataEXT) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); + return ((PFN_glGetNamedBufferSubDataEXT)__blue_glCore_glGetNamedBufferSubDataEXT)(buffer, offset, size, data); +} + +extern void* __blue_glCore_glProgramUniform1fEXT; +void APIENTRY bluegl_glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0) { + typedef void (APIENTRYP PFN_glProgramUniform1fEXT) (GLuint program, GLint location, GLfloat v0); + return ((PFN_glProgramUniform1fEXT)__blue_glCore_glProgramUniform1fEXT)(program, location, v0); +} + +extern void* __blue_glCore_glProgramUniform2fEXT; +void APIENTRY bluegl_glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1) { + typedef void (APIENTRYP PFN_glProgramUniform2fEXT) (GLuint program, GLint location, GLfloat v0, GLfloat v1); + return ((PFN_glProgramUniform2fEXT)__blue_glCore_glProgramUniform2fEXT)(program, location, v0, v1); +} + +extern void* __blue_glCore_glProgramUniform3fEXT; +void APIENTRY bluegl_glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) { + typedef void (APIENTRYP PFN_glProgramUniform3fEXT) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); + return ((PFN_glProgramUniform3fEXT)__blue_glCore_glProgramUniform3fEXT)(program, location, v0, v1, v2); +} + +extern void* __blue_glCore_glProgramUniform4fEXT; +void APIENTRY bluegl_glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) { + typedef void (APIENTRYP PFN_glProgramUniform4fEXT) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); + return ((PFN_glProgramUniform4fEXT)__blue_glCore_glProgramUniform4fEXT)(program, location, v0, v1, v2, v3); +} + +extern void* __blue_glCore_glProgramUniform1iEXT; +void APIENTRY bluegl_glProgramUniform1iEXT (GLuint program, GLint location, GLint v0) { + typedef void (APIENTRYP PFN_glProgramUniform1iEXT) (GLuint program, GLint location, GLint v0); + return ((PFN_glProgramUniform1iEXT)__blue_glCore_glProgramUniform1iEXT)(program, location, v0); +} + +extern void* __blue_glCore_glProgramUniform2iEXT; +void APIENTRY bluegl_glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1) { + typedef void (APIENTRYP PFN_glProgramUniform2iEXT) (GLuint program, GLint location, GLint v0, GLint v1); + return ((PFN_glProgramUniform2iEXT)__blue_glCore_glProgramUniform2iEXT)(program, location, v0, v1); +} + +extern void* __blue_glCore_glProgramUniform3iEXT; +void APIENTRY bluegl_glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2) { + typedef void (APIENTRYP PFN_glProgramUniform3iEXT) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); + return ((PFN_glProgramUniform3iEXT)__blue_glCore_glProgramUniform3iEXT)(program, location, v0, v1, v2); +} + +extern void* __blue_glCore_glProgramUniform4iEXT; +void APIENTRY bluegl_glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3) { + typedef void (APIENTRYP PFN_glProgramUniform4iEXT) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); + return ((PFN_glProgramUniform4iEXT)__blue_glCore_glProgramUniform4iEXT)(program, location, v0, v1, v2, v3); +} + +extern void* __blue_glCore_glProgramUniform1fvEXT; +void APIENTRY bluegl_glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniform1fvEXT) (GLuint program, GLint location, GLsizei count, const GLfloat *value); + return ((PFN_glProgramUniform1fvEXT)__blue_glCore_glProgramUniform1fvEXT)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform2fvEXT; +void APIENTRY bluegl_glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniform2fvEXT) (GLuint program, GLint location, GLsizei count, const GLfloat *value); + return ((PFN_glProgramUniform2fvEXT)__blue_glCore_glProgramUniform2fvEXT)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform3fvEXT; +void APIENTRY bluegl_glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniform3fvEXT) (GLuint program, GLint location, GLsizei count, const GLfloat *value); + return ((PFN_glProgramUniform3fvEXT)__blue_glCore_glProgramUniform3fvEXT)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform4fvEXT; +void APIENTRY bluegl_glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniform4fvEXT) (GLuint program, GLint location, GLsizei count, const GLfloat *value); + return ((PFN_glProgramUniform4fvEXT)__blue_glCore_glProgramUniform4fvEXT)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform1ivEXT; +void APIENTRY bluegl_glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value) { + typedef void (APIENTRYP PFN_glProgramUniform1ivEXT) (GLuint program, GLint location, GLsizei count, const GLint *value); + return ((PFN_glProgramUniform1ivEXT)__blue_glCore_glProgramUniform1ivEXT)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform2ivEXT; +void APIENTRY bluegl_glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value) { + typedef void (APIENTRYP PFN_glProgramUniform2ivEXT) (GLuint program, GLint location, GLsizei count, const GLint *value); + return ((PFN_glProgramUniform2ivEXT)__blue_glCore_glProgramUniform2ivEXT)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform3ivEXT; +void APIENTRY bluegl_glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value) { + typedef void (APIENTRYP PFN_glProgramUniform3ivEXT) (GLuint program, GLint location, GLsizei count, const GLint *value); + return ((PFN_glProgramUniform3ivEXT)__blue_glCore_glProgramUniform3ivEXT)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform4ivEXT; +void APIENTRY bluegl_glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value) { + typedef void (APIENTRYP PFN_glProgramUniform4ivEXT) (GLuint program, GLint location, GLsizei count, const GLint *value); + return ((PFN_glProgramUniform4ivEXT)__blue_glCore_glProgramUniform4ivEXT)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix2fvEXT; +void APIENTRY bluegl_glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix2fvEXT) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glProgramUniformMatrix2fvEXT)__blue_glCore_glProgramUniformMatrix2fvEXT)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix3fvEXT; +void APIENTRY bluegl_glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix3fvEXT) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glProgramUniformMatrix3fvEXT)__blue_glCore_glProgramUniformMatrix3fvEXT)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix4fvEXT; +void APIENTRY bluegl_glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix4fvEXT) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glProgramUniformMatrix4fvEXT)__blue_glCore_glProgramUniformMatrix4fvEXT)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix2x3fvEXT; +void APIENTRY bluegl_glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix2x3fvEXT) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glProgramUniformMatrix2x3fvEXT)__blue_glCore_glProgramUniformMatrix2x3fvEXT)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix3x2fvEXT; +void APIENTRY bluegl_glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix3x2fvEXT) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glProgramUniformMatrix3x2fvEXT)__blue_glCore_glProgramUniformMatrix3x2fvEXT)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix2x4fvEXT; +void APIENTRY bluegl_glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix2x4fvEXT) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glProgramUniformMatrix2x4fvEXT)__blue_glCore_glProgramUniformMatrix2x4fvEXT)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix4x2fvEXT; +void APIENTRY bluegl_glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix4x2fvEXT) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glProgramUniformMatrix4x2fvEXT)__blue_glCore_glProgramUniformMatrix4x2fvEXT)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix3x4fvEXT; +void APIENTRY bluegl_glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix3x4fvEXT) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glProgramUniformMatrix3x4fvEXT)__blue_glCore_glProgramUniformMatrix3x4fvEXT)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix4x3fvEXT; +void APIENTRY bluegl_glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix4x3fvEXT) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + return ((PFN_glProgramUniformMatrix4x3fvEXT)__blue_glCore_glProgramUniformMatrix4x3fvEXT)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glTextureBufferEXT; +void APIENTRY bluegl_glTextureBufferEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer) { + typedef void (APIENTRYP PFN_glTextureBufferEXT) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); + return ((PFN_glTextureBufferEXT)__blue_glCore_glTextureBufferEXT)(texture, target, internalformat, buffer); +} + +extern void* __blue_glCore_glMultiTexBufferEXT; +void APIENTRY bluegl_glMultiTexBufferEXT (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer) { + typedef void (APIENTRYP PFN_glMultiTexBufferEXT) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); + return ((PFN_glMultiTexBufferEXT)__blue_glCore_glMultiTexBufferEXT)(texunit, target, internalformat, buffer); +} + +extern void* __blue_glCore_glTextureParameterIivEXT; +void APIENTRY bluegl_glTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glTextureParameterIivEXT) (GLuint texture, GLenum target, GLenum pname, const GLint *params); + return ((PFN_glTextureParameterIivEXT)__blue_glCore_glTextureParameterIivEXT)(texture, target, pname, params); +} + +extern void* __blue_glCore_glTextureParameterIuivEXT; +void APIENTRY bluegl_glTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, const GLuint *params) { + typedef void (APIENTRYP PFN_glTextureParameterIuivEXT) (GLuint texture, GLenum target, GLenum pname, const GLuint *params); + return ((PFN_glTextureParameterIuivEXT)__blue_glCore_glTextureParameterIuivEXT)(texture, target, pname, params); +} + +extern void* __blue_glCore_glGetTextureParameterIivEXT; +void APIENTRY bluegl_glGetTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetTextureParameterIivEXT) (GLuint texture, GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetTextureParameterIivEXT)__blue_glCore_glGetTextureParameterIivEXT)(texture, target, pname, params); +} + +extern void* __blue_glCore_glGetTextureParameterIuivEXT; +void APIENTRY bluegl_glGetTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, GLuint *params) { + typedef void (APIENTRYP PFN_glGetTextureParameterIuivEXT) (GLuint texture, GLenum target, GLenum pname, GLuint *params); + return ((PFN_glGetTextureParameterIuivEXT)__blue_glCore_glGetTextureParameterIuivEXT)(texture, target, pname, params); +} + +extern void* __blue_glCore_glMultiTexParameterIivEXT; +void APIENTRY bluegl_glMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glMultiTexParameterIivEXT) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); + return ((PFN_glMultiTexParameterIivEXT)__blue_glCore_glMultiTexParameterIivEXT)(texunit, target, pname, params); +} + +extern void* __blue_glCore_glMultiTexParameterIuivEXT; +void APIENTRY bluegl_glMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, const GLuint *params) { + typedef void (APIENTRYP PFN_glMultiTexParameterIuivEXT) (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); + return ((PFN_glMultiTexParameterIuivEXT)__blue_glCore_glMultiTexParameterIuivEXT)(texunit, target, pname, params); +} + +extern void* __blue_glCore_glGetMultiTexParameterIivEXT; +void APIENTRY bluegl_glGetMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetMultiTexParameterIivEXT) (GLenum texunit, GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetMultiTexParameterIivEXT)__blue_glCore_glGetMultiTexParameterIivEXT)(texunit, target, pname, params); +} + +extern void* __blue_glCore_glGetMultiTexParameterIuivEXT; +void APIENTRY bluegl_glGetMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, GLuint *params) { + typedef void (APIENTRYP PFN_glGetMultiTexParameterIuivEXT) (GLenum texunit, GLenum target, GLenum pname, GLuint *params); + return ((PFN_glGetMultiTexParameterIuivEXT)__blue_glCore_glGetMultiTexParameterIuivEXT)(texunit, target, pname, params); +} + +extern void* __blue_glCore_glProgramUniform1uiEXT; +void APIENTRY bluegl_glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0) { + typedef void (APIENTRYP PFN_glProgramUniform1uiEXT) (GLuint program, GLint location, GLuint v0); + return ((PFN_glProgramUniform1uiEXT)__blue_glCore_glProgramUniform1uiEXT)(program, location, v0); +} + +extern void* __blue_glCore_glProgramUniform2uiEXT; +void APIENTRY bluegl_glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1) { + typedef void (APIENTRYP PFN_glProgramUniform2uiEXT) (GLuint program, GLint location, GLuint v0, GLuint v1); + return ((PFN_glProgramUniform2uiEXT)__blue_glCore_glProgramUniform2uiEXT)(program, location, v0, v1); +} + +extern void* __blue_glCore_glProgramUniform3uiEXT; +void APIENTRY bluegl_glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2) { + typedef void (APIENTRYP PFN_glProgramUniform3uiEXT) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); + return ((PFN_glProgramUniform3uiEXT)__blue_glCore_glProgramUniform3uiEXT)(program, location, v0, v1, v2); +} + +extern void* __blue_glCore_glProgramUniform4uiEXT; +void APIENTRY bluegl_glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) { + typedef void (APIENTRYP PFN_glProgramUniform4uiEXT) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); + return ((PFN_glProgramUniform4uiEXT)__blue_glCore_glProgramUniform4uiEXT)(program, location, v0, v1, v2, v3); +} + +extern void* __blue_glCore_glProgramUniform1uivEXT; +void APIENTRY bluegl_glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value) { + typedef void (APIENTRYP PFN_glProgramUniform1uivEXT) (GLuint program, GLint location, GLsizei count, const GLuint *value); + return ((PFN_glProgramUniform1uivEXT)__blue_glCore_glProgramUniform1uivEXT)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform2uivEXT; +void APIENTRY bluegl_glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value) { + typedef void (APIENTRYP PFN_glProgramUniform2uivEXT) (GLuint program, GLint location, GLsizei count, const GLuint *value); + return ((PFN_glProgramUniform2uivEXT)__blue_glCore_glProgramUniform2uivEXT)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform3uivEXT; +void APIENTRY bluegl_glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value) { + typedef void (APIENTRYP PFN_glProgramUniform3uivEXT) (GLuint program, GLint location, GLsizei count, const GLuint *value); + return ((PFN_glProgramUniform3uivEXT)__blue_glCore_glProgramUniform3uivEXT)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform4uivEXT; +void APIENTRY bluegl_glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value) { + typedef void (APIENTRYP PFN_glProgramUniform4uivEXT) (GLuint program, GLint location, GLsizei count, const GLuint *value); + return ((PFN_glProgramUniform4uivEXT)__blue_glCore_glProgramUniform4uivEXT)(program, location, count, value); +} + +extern void* __blue_glCore_glNamedProgramLocalParameters4fvEXT; +void APIENTRY bluegl_glNamedProgramLocalParameters4fvEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params) { + typedef void (APIENTRYP PFN_glNamedProgramLocalParameters4fvEXT) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); + return ((PFN_glNamedProgramLocalParameters4fvEXT)__blue_glCore_glNamedProgramLocalParameters4fvEXT)(program, target, index, count, params); +} + +extern void* __blue_glCore_glNamedProgramLocalParameterI4iEXT; +void APIENTRY bluegl_glNamedProgramLocalParameterI4iEXT (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w) { + typedef void (APIENTRYP PFN_glNamedProgramLocalParameterI4iEXT) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); + return ((PFN_glNamedProgramLocalParameterI4iEXT)__blue_glCore_glNamedProgramLocalParameterI4iEXT)(program, target, index, x, y, z, w); +} + +extern void* __blue_glCore_glNamedProgramLocalParameterI4ivEXT; +void APIENTRY bluegl_glNamedProgramLocalParameterI4ivEXT (GLuint program, GLenum target, GLuint index, const GLint *params) { + typedef void (APIENTRYP PFN_glNamedProgramLocalParameterI4ivEXT) (GLuint program, GLenum target, GLuint index, const GLint *params); + return ((PFN_glNamedProgramLocalParameterI4ivEXT)__blue_glCore_glNamedProgramLocalParameterI4ivEXT)(program, target, index, params); +} + +extern void* __blue_glCore_glNamedProgramLocalParametersI4ivEXT; +void APIENTRY bluegl_glNamedProgramLocalParametersI4ivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params) { + typedef void (APIENTRYP PFN_glNamedProgramLocalParametersI4ivEXT) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); + return ((PFN_glNamedProgramLocalParametersI4ivEXT)__blue_glCore_glNamedProgramLocalParametersI4ivEXT)(program, target, index, count, params); +} + +extern void* __blue_glCore_glNamedProgramLocalParameterI4uiEXT; +void APIENTRY bluegl_glNamedProgramLocalParameterI4uiEXT (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) { + typedef void (APIENTRYP PFN_glNamedProgramLocalParameterI4uiEXT) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); + return ((PFN_glNamedProgramLocalParameterI4uiEXT)__blue_glCore_glNamedProgramLocalParameterI4uiEXT)(program, target, index, x, y, z, w); +} + +extern void* __blue_glCore_glNamedProgramLocalParameterI4uivEXT; +void APIENTRY bluegl_glNamedProgramLocalParameterI4uivEXT (GLuint program, GLenum target, GLuint index, const GLuint *params) { + typedef void (APIENTRYP PFN_glNamedProgramLocalParameterI4uivEXT) (GLuint program, GLenum target, GLuint index, const GLuint *params); + return ((PFN_glNamedProgramLocalParameterI4uivEXT)__blue_glCore_glNamedProgramLocalParameterI4uivEXT)(program, target, index, params); +} + +extern void* __blue_glCore_glNamedProgramLocalParametersI4uivEXT; +void APIENTRY bluegl_glNamedProgramLocalParametersI4uivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params) { + typedef void (APIENTRYP PFN_glNamedProgramLocalParametersI4uivEXT) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); + return ((PFN_glNamedProgramLocalParametersI4uivEXT)__blue_glCore_glNamedProgramLocalParametersI4uivEXT)(program, target, index, count, params); +} + +extern void* __blue_glCore_glGetNamedProgramLocalParameterIivEXT; +void APIENTRY bluegl_glGetNamedProgramLocalParameterIivEXT (GLuint program, GLenum target, GLuint index, GLint *params) { + typedef void (APIENTRYP PFN_glGetNamedProgramLocalParameterIivEXT) (GLuint program, GLenum target, GLuint index, GLint *params); + return ((PFN_glGetNamedProgramLocalParameterIivEXT)__blue_glCore_glGetNamedProgramLocalParameterIivEXT)(program, target, index, params); +} + +extern void* __blue_glCore_glGetNamedProgramLocalParameterIuivEXT; +void APIENTRY bluegl_glGetNamedProgramLocalParameterIuivEXT (GLuint program, GLenum target, GLuint index, GLuint *params) { + typedef void (APIENTRYP PFN_glGetNamedProgramLocalParameterIuivEXT) (GLuint program, GLenum target, GLuint index, GLuint *params); + return ((PFN_glGetNamedProgramLocalParameterIuivEXT)__blue_glCore_glGetNamedProgramLocalParameterIuivEXT)(program, target, index, params); +} + +extern void* __blue_glCore_glEnableClientStateiEXT; +void APIENTRY bluegl_glEnableClientStateiEXT (GLenum array, GLuint index) { + typedef void (APIENTRYP PFN_glEnableClientStateiEXT) (GLenum array, GLuint index); + return ((PFN_glEnableClientStateiEXT)__blue_glCore_glEnableClientStateiEXT)(array, index); +} + +extern void* __blue_glCore_glDisableClientStateiEXT; +void APIENTRY bluegl_glDisableClientStateiEXT (GLenum array, GLuint index) { + typedef void (APIENTRYP PFN_glDisableClientStateiEXT) (GLenum array, GLuint index); + return ((PFN_glDisableClientStateiEXT)__blue_glCore_glDisableClientStateiEXT)(array, index); +} + +extern void* __blue_glCore_glGetFloati_vEXT; +void APIENTRY bluegl_glGetFloati_vEXT (GLenum pname, GLuint index, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetFloati_vEXT) (GLenum pname, GLuint index, GLfloat *params); + return ((PFN_glGetFloati_vEXT)__blue_glCore_glGetFloati_vEXT)(pname, index, params); +} + +extern void* __blue_glCore_glGetDoublei_vEXT; +void APIENTRY bluegl_glGetDoublei_vEXT (GLenum pname, GLuint index, GLdouble *params) { + typedef void (APIENTRYP PFN_glGetDoublei_vEXT) (GLenum pname, GLuint index, GLdouble *params); + return ((PFN_glGetDoublei_vEXT)__blue_glCore_glGetDoublei_vEXT)(pname, index, params); +} + +extern void* __blue_glCore_glGetPointeri_vEXT; +void APIENTRY bluegl_glGetPointeri_vEXT (GLenum pname, GLuint index, void **params) { + typedef void (APIENTRYP PFN_glGetPointeri_vEXT) (GLenum pname, GLuint index, void **params); + return ((PFN_glGetPointeri_vEXT)__blue_glCore_glGetPointeri_vEXT)(pname, index, params); +} + +extern void* __blue_glCore_glNamedProgramStringEXT; +void APIENTRY bluegl_glNamedProgramStringEXT (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string) { + typedef void (APIENTRYP PFN_glNamedProgramStringEXT) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); + return ((PFN_glNamedProgramStringEXT)__blue_glCore_glNamedProgramStringEXT)(program, target, format, len, string); +} + +extern void* __blue_glCore_glNamedProgramLocalParameter4dEXT; +void APIENTRY bluegl_glNamedProgramLocalParameter4dEXT (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { + typedef void (APIENTRYP PFN_glNamedProgramLocalParameter4dEXT) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + return ((PFN_glNamedProgramLocalParameter4dEXT)__blue_glCore_glNamedProgramLocalParameter4dEXT)(program, target, index, x, y, z, w); +} + +extern void* __blue_glCore_glNamedProgramLocalParameter4dvEXT; +void APIENTRY bluegl_glNamedProgramLocalParameter4dvEXT (GLuint program, GLenum target, GLuint index, const GLdouble *params) { + typedef void (APIENTRYP PFN_glNamedProgramLocalParameter4dvEXT) (GLuint program, GLenum target, GLuint index, const GLdouble *params); + return ((PFN_glNamedProgramLocalParameter4dvEXT)__blue_glCore_glNamedProgramLocalParameter4dvEXT)(program, target, index, params); +} + +extern void* __blue_glCore_glNamedProgramLocalParameter4fEXT; +void APIENTRY bluegl_glNamedProgramLocalParameter4fEXT (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { + typedef void (APIENTRYP PFN_glNamedProgramLocalParameter4fEXT) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + return ((PFN_glNamedProgramLocalParameter4fEXT)__blue_glCore_glNamedProgramLocalParameter4fEXT)(program, target, index, x, y, z, w); +} + +extern void* __blue_glCore_glNamedProgramLocalParameter4fvEXT; +void APIENTRY bluegl_glNamedProgramLocalParameter4fvEXT (GLuint program, GLenum target, GLuint index, const GLfloat *params) { + typedef void (APIENTRYP PFN_glNamedProgramLocalParameter4fvEXT) (GLuint program, GLenum target, GLuint index, const GLfloat *params); + return ((PFN_glNamedProgramLocalParameter4fvEXT)__blue_glCore_glNamedProgramLocalParameter4fvEXT)(program, target, index, params); +} + +extern void* __blue_glCore_glGetNamedProgramLocalParameterdvEXT; +void APIENTRY bluegl_glGetNamedProgramLocalParameterdvEXT (GLuint program, GLenum target, GLuint index, GLdouble *params) { + typedef void (APIENTRYP PFN_glGetNamedProgramLocalParameterdvEXT) (GLuint program, GLenum target, GLuint index, GLdouble *params); + return ((PFN_glGetNamedProgramLocalParameterdvEXT)__blue_glCore_glGetNamedProgramLocalParameterdvEXT)(program, target, index, params); +} + +extern void* __blue_glCore_glGetNamedProgramLocalParameterfvEXT; +void APIENTRY bluegl_glGetNamedProgramLocalParameterfvEXT (GLuint program, GLenum target, GLuint index, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetNamedProgramLocalParameterfvEXT) (GLuint program, GLenum target, GLuint index, GLfloat *params); + return ((PFN_glGetNamedProgramLocalParameterfvEXT)__blue_glCore_glGetNamedProgramLocalParameterfvEXT)(program, target, index, params); +} + +extern void* __blue_glCore_glGetNamedProgramivEXT; +void APIENTRY bluegl_glGetNamedProgramivEXT (GLuint program, GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetNamedProgramivEXT) (GLuint program, GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetNamedProgramivEXT)__blue_glCore_glGetNamedProgramivEXT)(program, target, pname, params); +} + +extern void* __blue_glCore_glGetNamedProgramStringEXT; +void APIENTRY bluegl_glGetNamedProgramStringEXT (GLuint program, GLenum target, GLenum pname, void *string) { + typedef void (APIENTRYP PFN_glGetNamedProgramStringEXT) (GLuint program, GLenum target, GLenum pname, void *string); + return ((PFN_glGetNamedProgramStringEXT)__blue_glCore_glGetNamedProgramStringEXT)(program, target, pname, string); +} + +extern void* __blue_glCore_glNamedRenderbufferStorageEXT; +void APIENTRY bluegl_glNamedRenderbufferStorageEXT (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glNamedRenderbufferStorageEXT) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); + return ((PFN_glNamedRenderbufferStorageEXT)__blue_glCore_glNamedRenderbufferStorageEXT)(renderbuffer, internalformat, width, height); +} + +extern void* __blue_glCore_glGetNamedRenderbufferParameterivEXT; +void APIENTRY bluegl_glGetNamedRenderbufferParameterivEXT (GLuint renderbuffer, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetNamedRenderbufferParameterivEXT) (GLuint renderbuffer, GLenum pname, GLint *params); + return ((PFN_glGetNamedRenderbufferParameterivEXT)__blue_glCore_glGetNamedRenderbufferParameterivEXT)(renderbuffer, pname, params); +} + +extern void* __blue_glCore_glNamedRenderbufferStorageMultisampleEXT; +void APIENTRY bluegl_glNamedRenderbufferStorageMultisampleEXT (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glNamedRenderbufferStorageMultisampleEXT) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + return ((PFN_glNamedRenderbufferStorageMultisampleEXT)__blue_glCore_glNamedRenderbufferStorageMultisampleEXT)(renderbuffer, samples, internalformat, width, height); +} + +extern void* __blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT; +void APIENTRY bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glNamedRenderbufferStorageMultisampleCoverageEXT) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); + return ((PFN_glNamedRenderbufferStorageMultisampleCoverageEXT)__blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT)(renderbuffer, coverageSamples, colorSamples, internalformat, width, height); +} + +extern void* __blue_glCore_glCheckNamedFramebufferStatusEXT; +GLenum APIENTRY bluegl_glCheckNamedFramebufferStatusEXT (GLuint framebuffer, GLenum target) { + typedef GLenum (APIENTRYP PFN_glCheckNamedFramebufferStatusEXT) (GLuint framebuffer, GLenum target); + return ((PFN_glCheckNamedFramebufferStatusEXT)__blue_glCore_glCheckNamedFramebufferStatusEXT)(framebuffer, target); +} + +extern void* __blue_glCore_glNamedFramebufferTexture1DEXT; +void APIENTRY bluegl_glNamedFramebufferTexture1DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { + typedef void (APIENTRYP PFN_glNamedFramebufferTexture1DEXT) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + return ((PFN_glNamedFramebufferTexture1DEXT)__blue_glCore_glNamedFramebufferTexture1DEXT)(framebuffer, attachment, textarget, texture, level); +} + +extern void* __blue_glCore_glNamedFramebufferTexture2DEXT; +void APIENTRY bluegl_glNamedFramebufferTexture2DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { + typedef void (APIENTRYP PFN_glNamedFramebufferTexture2DEXT) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + return ((PFN_glNamedFramebufferTexture2DEXT)__blue_glCore_glNamedFramebufferTexture2DEXT)(framebuffer, attachment, textarget, texture, level); +} + +extern void* __blue_glCore_glNamedFramebufferTexture3DEXT; +void APIENTRY bluegl_glNamedFramebufferTexture3DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) { + typedef void (APIENTRYP PFN_glNamedFramebufferTexture3DEXT) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); + return ((PFN_glNamedFramebufferTexture3DEXT)__blue_glCore_glNamedFramebufferTexture3DEXT)(framebuffer, attachment, textarget, texture, level, zoffset); +} + +extern void* __blue_glCore_glNamedFramebufferRenderbufferEXT; +void APIENTRY bluegl_glNamedFramebufferRenderbufferEXT (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) { + typedef void (APIENTRYP PFN_glNamedFramebufferRenderbufferEXT) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); + return ((PFN_glNamedFramebufferRenderbufferEXT)__blue_glCore_glNamedFramebufferRenderbufferEXT)(framebuffer, attachment, renderbuffertarget, renderbuffer); +} + +extern void* __blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT; +void APIENTRY bluegl_glGetNamedFramebufferAttachmentParameterivEXT (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetNamedFramebufferAttachmentParameterivEXT) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); + return ((PFN_glGetNamedFramebufferAttachmentParameterivEXT)__blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT)(framebuffer, attachment, pname, params); +} + +extern void* __blue_glCore_glGenerateTextureMipmapEXT; +void APIENTRY bluegl_glGenerateTextureMipmapEXT (GLuint texture, GLenum target) { + typedef void (APIENTRYP PFN_glGenerateTextureMipmapEXT) (GLuint texture, GLenum target); + return ((PFN_glGenerateTextureMipmapEXT)__blue_glCore_glGenerateTextureMipmapEXT)(texture, target); +} + +extern void* __blue_glCore_glGenerateMultiTexMipmapEXT; +void APIENTRY bluegl_glGenerateMultiTexMipmapEXT (GLenum texunit, GLenum target) { + typedef void (APIENTRYP PFN_glGenerateMultiTexMipmapEXT) (GLenum texunit, GLenum target); + return ((PFN_glGenerateMultiTexMipmapEXT)__blue_glCore_glGenerateMultiTexMipmapEXT)(texunit, target); +} + +extern void* __blue_glCore_glFramebufferDrawBufferEXT; +void APIENTRY bluegl_glFramebufferDrawBufferEXT (GLuint framebuffer, GLenum mode) { + typedef void (APIENTRYP PFN_glFramebufferDrawBufferEXT) (GLuint framebuffer, GLenum mode); + return ((PFN_glFramebufferDrawBufferEXT)__blue_glCore_glFramebufferDrawBufferEXT)(framebuffer, mode); +} + +extern void* __blue_glCore_glFramebufferDrawBuffersEXT; +void APIENTRY bluegl_glFramebufferDrawBuffersEXT (GLuint framebuffer, GLsizei n, const GLenum *bufs) { + typedef void (APIENTRYP PFN_glFramebufferDrawBuffersEXT) (GLuint framebuffer, GLsizei n, const GLenum *bufs); + return ((PFN_glFramebufferDrawBuffersEXT)__blue_glCore_glFramebufferDrawBuffersEXT)(framebuffer, n, bufs); +} + +extern void* __blue_glCore_glFramebufferReadBufferEXT; +void APIENTRY bluegl_glFramebufferReadBufferEXT (GLuint framebuffer, GLenum mode) { + typedef void (APIENTRYP PFN_glFramebufferReadBufferEXT) (GLuint framebuffer, GLenum mode); + return ((PFN_glFramebufferReadBufferEXT)__blue_glCore_glFramebufferReadBufferEXT)(framebuffer, mode); +} + +extern void* __blue_glCore_glGetFramebufferParameterivEXT; +void APIENTRY bluegl_glGetFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetFramebufferParameterivEXT) (GLuint framebuffer, GLenum pname, GLint *params); + return ((PFN_glGetFramebufferParameterivEXT)__blue_glCore_glGetFramebufferParameterivEXT)(framebuffer, pname, params); +} + +extern void* __blue_glCore_glNamedCopyBufferSubDataEXT; +void APIENTRY bluegl_glNamedCopyBufferSubDataEXT (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) { + typedef void (APIENTRYP PFN_glNamedCopyBufferSubDataEXT) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); + return ((PFN_glNamedCopyBufferSubDataEXT)__blue_glCore_glNamedCopyBufferSubDataEXT)(readBuffer, writeBuffer, readOffset, writeOffset, size); +} + +extern void* __blue_glCore_glNamedFramebufferTextureEXT; +void APIENTRY bluegl_glNamedFramebufferTextureEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level) { + typedef void (APIENTRYP PFN_glNamedFramebufferTextureEXT) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); + return ((PFN_glNamedFramebufferTextureEXT)__blue_glCore_glNamedFramebufferTextureEXT)(framebuffer, attachment, texture, level); +} + +extern void* __blue_glCore_glNamedFramebufferTextureLayerEXT; +void APIENTRY bluegl_glNamedFramebufferTextureLayerEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer) { + typedef void (APIENTRYP PFN_glNamedFramebufferTextureLayerEXT) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); + return ((PFN_glNamedFramebufferTextureLayerEXT)__blue_glCore_glNamedFramebufferTextureLayerEXT)(framebuffer, attachment, texture, level, layer); +} + +extern void* __blue_glCore_glNamedFramebufferTextureFaceEXT; +void APIENTRY bluegl_glNamedFramebufferTextureFaceEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face) { + typedef void (APIENTRYP PFN_glNamedFramebufferTextureFaceEXT) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); + return ((PFN_glNamedFramebufferTextureFaceEXT)__blue_glCore_glNamedFramebufferTextureFaceEXT)(framebuffer, attachment, texture, level, face); +} + +extern void* __blue_glCore_glTextureRenderbufferEXT; +void APIENTRY bluegl_glTextureRenderbufferEXT (GLuint texture, GLenum target, GLuint renderbuffer) { + typedef void (APIENTRYP PFN_glTextureRenderbufferEXT) (GLuint texture, GLenum target, GLuint renderbuffer); + return ((PFN_glTextureRenderbufferEXT)__blue_glCore_glTextureRenderbufferEXT)(texture, target, renderbuffer); +} + +extern void* __blue_glCore_glMultiTexRenderbufferEXT; +void APIENTRY bluegl_glMultiTexRenderbufferEXT (GLenum texunit, GLenum target, GLuint renderbuffer) { + typedef void (APIENTRYP PFN_glMultiTexRenderbufferEXT) (GLenum texunit, GLenum target, GLuint renderbuffer); + return ((PFN_glMultiTexRenderbufferEXT)__blue_glCore_glMultiTexRenderbufferEXT)(texunit, target, renderbuffer); +} + +extern void* __blue_glCore_glVertexArrayVertexOffsetEXT; +void APIENTRY bluegl_glVertexArrayVertexOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset) { + typedef void (APIENTRYP PFN_glVertexArrayVertexOffsetEXT) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); + return ((PFN_glVertexArrayVertexOffsetEXT)__blue_glCore_glVertexArrayVertexOffsetEXT)(vaobj, buffer, size, type, stride, offset); +} + +extern void* __blue_glCore_glVertexArrayColorOffsetEXT; +void APIENTRY bluegl_glVertexArrayColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset) { + typedef void (APIENTRYP PFN_glVertexArrayColorOffsetEXT) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); + return ((PFN_glVertexArrayColorOffsetEXT)__blue_glCore_glVertexArrayColorOffsetEXT)(vaobj, buffer, size, type, stride, offset); +} + +extern void* __blue_glCore_glVertexArrayEdgeFlagOffsetEXT; +void APIENTRY bluegl_glVertexArrayEdgeFlagOffsetEXT (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset) { + typedef void (APIENTRYP PFN_glVertexArrayEdgeFlagOffsetEXT) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); + return ((PFN_glVertexArrayEdgeFlagOffsetEXT)__blue_glCore_glVertexArrayEdgeFlagOffsetEXT)(vaobj, buffer, stride, offset); +} + +extern void* __blue_glCore_glVertexArrayIndexOffsetEXT; +void APIENTRY bluegl_glVertexArrayIndexOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset) { + typedef void (APIENTRYP PFN_glVertexArrayIndexOffsetEXT) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); + return ((PFN_glVertexArrayIndexOffsetEXT)__blue_glCore_glVertexArrayIndexOffsetEXT)(vaobj, buffer, type, stride, offset); +} + +extern void* __blue_glCore_glVertexArrayNormalOffsetEXT; +void APIENTRY bluegl_glVertexArrayNormalOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset) { + typedef void (APIENTRYP PFN_glVertexArrayNormalOffsetEXT) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); + return ((PFN_glVertexArrayNormalOffsetEXT)__blue_glCore_glVertexArrayNormalOffsetEXT)(vaobj, buffer, type, stride, offset); +} + +extern void* __blue_glCore_glVertexArrayTexCoordOffsetEXT; +void APIENTRY bluegl_glVertexArrayTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset) { + typedef void (APIENTRYP PFN_glVertexArrayTexCoordOffsetEXT) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); + return ((PFN_glVertexArrayTexCoordOffsetEXT)__blue_glCore_glVertexArrayTexCoordOffsetEXT)(vaobj, buffer, size, type, stride, offset); +} + +extern void* __blue_glCore_glVertexArrayMultiTexCoordOffsetEXT; +void APIENTRY bluegl_glVertexArrayMultiTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset) { + typedef void (APIENTRYP PFN_glVertexArrayMultiTexCoordOffsetEXT) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); + return ((PFN_glVertexArrayMultiTexCoordOffsetEXT)__blue_glCore_glVertexArrayMultiTexCoordOffsetEXT)(vaobj, buffer, texunit, size, type, stride, offset); +} + +extern void* __blue_glCore_glVertexArrayFogCoordOffsetEXT; +void APIENTRY bluegl_glVertexArrayFogCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset) { + typedef void (APIENTRYP PFN_glVertexArrayFogCoordOffsetEXT) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); + return ((PFN_glVertexArrayFogCoordOffsetEXT)__blue_glCore_glVertexArrayFogCoordOffsetEXT)(vaobj, buffer, type, stride, offset); +} + +extern void* __blue_glCore_glVertexArraySecondaryColorOffsetEXT; +void APIENTRY bluegl_glVertexArraySecondaryColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset) { + typedef void (APIENTRYP PFN_glVertexArraySecondaryColorOffsetEXT) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); + return ((PFN_glVertexArraySecondaryColorOffsetEXT)__blue_glCore_glVertexArraySecondaryColorOffsetEXT)(vaobj, buffer, size, type, stride, offset); +} + +extern void* __blue_glCore_glVertexArrayVertexAttribOffsetEXT; +void APIENTRY bluegl_glVertexArrayVertexAttribOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset) { + typedef void (APIENTRYP PFN_glVertexArrayVertexAttribOffsetEXT) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); + return ((PFN_glVertexArrayVertexAttribOffsetEXT)__blue_glCore_glVertexArrayVertexAttribOffsetEXT)(vaobj, buffer, index, size, type, normalized, stride, offset); +} + +extern void* __blue_glCore_glVertexArrayVertexAttribIOffsetEXT; +void APIENTRY bluegl_glVertexArrayVertexAttribIOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset) { + typedef void (APIENTRYP PFN_glVertexArrayVertexAttribIOffsetEXT) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); + return ((PFN_glVertexArrayVertexAttribIOffsetEXT)__blue_glCore_glVertexArrayVertexAttribIOffsetEXT)(vaobj, buffer, index, size, type, stride, offset); +} + +extern void* __blue_glCore_glEnableVertexArrayEXT; +void APIENTRY bluegl_glEnableVertexArrayEXT (GLuint vaobj, GLenum array) { + typedef void (APIENTRYP PFN_glEnableVertexArrayEXT) (GLuint vaobj, GLenum array); + return ((PFN_glEnableVertexArrayEXT)__blue_glCore_glEnableVertexArrayEXT)(vaobj, array); +} + +extern void* __blue_glCore_glDisableVertexArrayEXT; +void APIENTRY bluegl_glDisableVertexArrayEXT (GLuint vaobj, GLenum array) { + typedef void (APIENTRYP PFN_glDisableVertexArrayEXT) (GLuint vaobj, GLenum array); + return ((PFN_glDisableVertexArrayEXT)__blue_glCore_glDisableVertexArrayEXT)(vaobj, array); +} + +extern void* __blue_glCore_glEnableVertexArrayAttribEXT; +void APIENTRY bluegl_glEnableVertexArrayAttribEXT (GLuint vaobj, GLuint index) { + typedef void (APIENTRYP PFN_glEnableVertexArrayAttribEXT) (GLuint vaobj, GLuint index); + return ((PFN_glEnableVertexArrayAttribEXT)__blue_glCore_glEnableVertexArrayAttribEXT)(vaobj, index); +} + +extern void* __blue_glCore_glDisableVertexArrayAttribEXT; +void APIENTRY bluegl_glDisableVertexArrayAttribEXT (GLuint vaobj, GLuint index) { + typedef void (APIENTRYP PFN_glDisableVertexArrayAttribEXT) (GLuint vaobj, GLuint index); + return ((PFN_glDisableVertexArrayAttribEXT)__blue_glCore_glDisableVertexArrayAttribEXT)(vaobj, index); +} + +extern void* __blue_glCore_glGetVertexArrayIntegervEXT; +void APIENTRY bluegl_glGetVertexArrayIntegervEXT (GLuint vaobj, GLenum pname, GLint *param) { + typedef void (APIENTRYP PFN_glGetVertexArrayIntegervEXT) (GLuint vaobj, GLenum pname, GLint *param); + return ((PFN_glGetVertexArrayIntegervEXT)__blue_glCore_glGetVertexArrayIntegervEXT)(vaobj, pname, param); +} + +extern void* __blue_glCore_glGetVertexArrayPointervEXT; +void APIENTRY bluegl_glGetVertexArrayPointervEXT (GLuint vaobj, GLenum pname, void **param) { + typedef void (APIENTRYP PFN_glGetVertexArrayPointervEXT) (GLuint vaobj, GLenum pname, void **param); + return ((PFN_glGetVertexArrayPointervEXT)__blue_glCore_glGetVertexArrayPointervEXT)(vaobj, pname, param); +} + +extern void* __blue_glCore_glGetVertexArrayIntegeri_vEXT; +void APIENTRY bluegl_glGetVertexArrayIntegeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, GLint *param) { + typedef void (APIENTRYP PFN_glGetVertexArrayIntegeri_vEXT) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); + return ((PFN_glGetVertexArrayIntegeri_vEXT)__blue_glCore_glGetVertexArrayIntegeri_vEXT)(vaobj, index, pname, param); +} + +extern void* __blue_glCore_glGetVertexArrayPointeri_vEXT; +void APIENTRY bluegl_glGetVertexArrayPointeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, void **param) { + typedef void (APIENTRYP PFN_glGetVertexArrayPointeri_vEXT) (GLuint vaobj, GLuint index, GLenum pname, void **param); + return ((PFN_glGetVertexArrayPointeri_vEXT)__blue_glCore_glGetVertexArrayPointeri_vEXT)(vaobj, index, pname, param); +} + +extern void* __blue_glCore_glMapNamedBufferRangeEXT; +void *APIENTRY bluegl_glMapNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access) { + typedef void *(APIENTRYP PFN_glMapNamedBufferRangeEXT) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); + return ((PFN_glMapNamedBufferRangeEXT)__blue_glCore_glMapNamedBufferRangeEXT)(buffer, offset, length, access); +} + +extern void* __blue_glCore_glFlushMappedNamedBufferRangeEXT; +void APIENTRY bluegl_glFlushMappedNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length) { + typedef void (APIENTRYP PFN_glFlushMappedNamedBufferRangeEXT) (GLuint buffer, GLintptr offset, GLsizeiptr length); + return ((PFN_glFlushMappedNamedBufferRangeEXT)__blue_glCore_glFlushMappedNamedBufferRangeEXT)(buffer, offset, length); +} + +extern void* __blue_glCore_glNamedBufferStorageEXT; +void APIENTRY bluegl_glNamedBufferStorageEXT (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags) { + typedef void (APIENTRYP PFN_glNamedBufferStorageEXT) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); + return ((PFN_glNamedBufferStorageEXT)__blue_glCore_glNamedBufferStorageEXT)(buffer, size, data, flags); +} + +extern void* __blue_glCore_glClearNamedBufferDataEXT; +void APIENTRY bluegl_glClearNamedBufferDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data) { + typedef void (APIENTRYP PFN_glClearNamedBufferDataEXT) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); + return ((PFN_glClearNamedBufferDataEXT)__blue_glCore_glClearNamedBufferDataEXT)(buffer, internalformat, format, type, data); +} + +extern void* __blue_glCore_glClearNamedBufferSubDataEXT; +void APIENTRY bluegl_glClearNamedBufferSubDataEXT (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data) { + typedef void (APIENTRYP PFN_glClearNamedBufferSubDataEXT) (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); + return ((PFN_glClearNamedBufferSubDataEXT)__blue_glCore_glClearNamedBufferSubDataEXT)(buffer, internalformat, offset, size, format, type, data); +} + +extern void* __blue_glCore_glNamedFramebufferParameteriEXT; +void APIENTRY bluegl_glNamedFramebufferParameteriEXT (GLuint framebuffer, GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glNamedFramebufferParameteriEXT) (GLuint framebuffer, GLenum pname, GLint param); + return ((PFN_glNamedFramebufferParameteriEXT)__blue_glCore_glNamedFramebufferParameteriEXT)(framebuffer, pname, param); +} + +extern void* __blue_glCore_glGetNamedFramebufferParameterivEXT; +void APIENTRY bluegl_glGetNamedFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetNamedFramebufferParameterivEXT) (GLuint framebuffer, GLenum pname, GLint *params); + return ((PFN_glGetNamedFramebufferParameterivEXT)__blue_glCore_glGetNamedFramebufferParameterivEXT)(framebuffer, pname, params); +} + +extern void* __blue_glCore_glProgramUniform1dEXT; +void APIENTRY bluegl_glProgramUniform1dEXT (GLuint program, GLint location, GLdouble x) { + typedef void (APIENTRYP PFN_glProgramUniform1dEXT) (GLuint program, GLint location, GLdouble x); + return ((PFN_glProgramUniform1dEXT)__blue_glCore_glProgramUniform1dEXT)(program, location, x); +} + +extern void* __blue_glCore_glProgramUniform2dEXT; +void APIENTRY bluegl_glProgramUniform2dEXT (GLuint program, GLint location, GLdouble x, GLdouble y) { + typedef void (APIENTRYP PFN_glProgramUniform2dEXT) (GLuint program, GLint location, GLdouble x, GLdouble y); + return ((PFN_glProgramUniform2dEXT)__blue_glCore_glProgramUniform2dEXT)(program, location, x, y); +} + +extern void* __blue_glCore_glProgramUniform3dEXT; +void APIENTRY bluegl_glProgramUniform3dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z) { + typedef void (APIENTRYP PFN_glProgramUniform3dEXT) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); + return ((PFN_glProgramUniform3dEXT)__blue_glCore_glProgramUniform3dEXT)(program, location, x, y, z); +} + +extern void* __blue_glCore_glProgramUniform4dEXT; +void APIENTRY bluegl_glProgramUniform4dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { + typedef void (APIENTRYP PFN_glProgramUniform4dEXT) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + return ((PFN_glProgramUniform4dEXT)__blue_glCore_glProgramUniform4dEXT)(program, location, x, y, z, w); +} + +extern void* __blue_glCore_glProgramUniform1dvEXT; +void APIENTRY bluegl_glProgramUniform1dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniform1dvEXT) (GLuint program, GLint location, GLsizei count, const GLdouble *value); + return ((PFN_glProgramUniform1dvEXT)__blue_glCore_glProgramUniform1dvEXT)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform2dvEXT; +void APIENTRY bluegl_glProgramUniform2dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniform2dvEXT) (GLuint program, GLint location, GLsizei count, const GLdouble *value); + return ((PFN_glProgramUniform2dvEXT)__blue_glCore_glProgramUniform2dvEXT)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform3dvEXT; +void APIENTRY bluegl_glProgramUniform3dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniform3dvEXT) (GLuint program, GLint location, GLsizei count, const GLdouble *value); + return ((PFN_glProgramUniform3dvEXT)__blue_glCore_glProgramUniform3dvEXT)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniform4dvEXT; +void APIENTRY bluegl_glProgramUniform4dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniform4dvEXT) (GLuint program, GLint location, GLsizei count, const GLdouble *value); + return ((PFN_glProgramUniform4dvEXT)__blue_glCore_glProgramUniform4dvEXT)(program, location, count, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix2dvEXT; +void APIENTRY bluegl_glProgramUniformMatrix2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix2dvEXT) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glProgramUniformMatrix2dvEXT)__blue_glCore_glProgramUniformMatrix2dvEXT)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix3dvEXT; +void APIENTRY bluegl_glProgramUniformMatrix3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix3dvEXT) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glProgramUniformMatrix3dvEXT)__blue_glCore_glProgramUniformMatrix3dvEXT)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix4dvEXT; +void APIENTRY bluegl_glProgramUniformMatrix4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix4dvEXT) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glProgramUniformMatrix4dvEXT)__blue_glCore_glProgramUniformMatrix4dvEXT)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix2x3dvEXT; +void APIENTRY bluegl_glProgramUniformMatrix2x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix2x3dvEXT) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glProgramUniformMatrix2x3dvEXT)__blue_glCore_glProgramUniformMatrix2x3dvEXT)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix2x4dvEXT; +void APIENTRY bluegl_glProgramUniformMatrix2x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix2x4dvEXT) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glProgramUniformMatrix2x4dvEXT)__blue_glCore_glProgramUniformMatrix2x4dvEXT)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix3x2dvEXT; +void APIENTRY bluegl_glProgramUniformMatrix3x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix3x2dvEXT) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glProgramUniformMatrix3x2dvEXT)__blue_glCore_glProgramUniformMatrix3x2dvEXT)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix3x4dvEXT; +void APIENTRY bluegl_glProgramUniformMatrix3x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix3x4dvEXT) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glProgramUniformMatrix3x4dvEXT)__blue_glCore_glProgramUniformMatrix3x4dvEXT)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix4x2dvEXT; +void APIENTRY bluegl_glProgramUniformMatrix4x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix4x2dvEXT) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glProgramUniformMatrix4x2dvEXT)__blue_glCore_glProgramUniformMatrix4x2dvEXT)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glProgramUniformMatrix4x3dvEXT; +void APIENTRY bluegl_glProgramUniformMatrix4x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value) { + typedef void (APIENTRYP PFN_glProgramUniformMatrix4x3dvEXT) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); + return ((PFN_glProgramUniformMatrix4x3dvEXT)__blue_glCore_glProgramUniformMatrix4x3dvEXT)(program, location, count, transpose, value); +} + +extern void* __blue_glCore_glTextureBufferRangeEXT; +void APIENTRY bluegl_glTextureBufferRangeEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) { + typedef void (APIENTRYP PFN_glTextureBufferRangeEXT) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); + return ((PFN_glTextureBufferRangeEXT)__blue_glCore_glTextureBufferRangeEXT)(texture, target, internalformat, buffer, offset, size); +} + +extern void* __blue_glCore_glTextureStorage1DEXT; +void APIENTRY bluegl_glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width) { + typedef void (APIENTRYP PFN_glTextureStorage1DEXT) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); + return ((PFN_glTextureStorage1DEXT)__blue_glCore_glTextureStorage1DEXT)(texture, target, levels, internalformat, width); +} + +extern void* __blue_glCore_glTextureStorage2DEXT; +void APIENTRY bluegl_glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glTextureStorage2DEXT) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); + return ((PFN_glTextureStorage2DEXT)__blue_glCore_glTextureStorage2DEXT)(texture, target, levels, internalformat, width, height); +} + +extern void* __blue_glCore_glTextureStorage3DEXT; +void APIENTRY bluegl_glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { + typedef void (APIENTRYP PFN_glTextureStorage3DEXT) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); + return ((PFN_glTextureStorage3DEXT)__blue_glCore_glTextureStorage3DEXT)(texture, target, levels, internalformat, width, height, depth); +} + +extern void* __blue_glCore_glTextureStorage2DMultisampleEXT; +void APIENTRY bluegl_glTextureStorage2DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) { + typedef void (APIENTRYP PFN_glTextureStorage2DMultisampleEXT) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); + return ((PFN_glTextureStorage2DMultisampleEXT)__blue_glCore_glTextureStorage2DMultisampleEXT)(texture, target, samples, internalformat, width, height, fixedsamplelocations); +} + +extern void* __blue_glCore_glTextureStorage3DMultisampleEXT; +void APIENTRY bluegl_glTextureStorage3DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { + typedef void (APIENTRYP PFN_glTextureStorage3DMultisampleEXT) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); + return ((PFN_glTextureStorage3DMultisampleEXT)__blue_glCore_glTextureStorage3DMultisampleEXT)(texture, target, samples, internalformat, width, height, depth, fixedsamplelocations); +} + +extern void* __blue_glCore_glVertexArrayBindVertexBufferEXT; +void APIENTRY bluegl_glVertexArrayBindVertexBufferEXT (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride) { + typedef void (APIENTRYP PFN_glVertexArrayBindVertexBufferEXT) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); + return ((PFN_glVertexArrayBindVertexBufferEXT)__blue_glCore_glVertexArrayBindVertexBufferEXT)(vaobj, bindingindex, buffer, offset, stride); +} + +extern void* __blue_glCore_glVertexArrayVertexAttribFormatEXT; +void APIENTRY bluegl_glVertexArrayVertexAttribFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset) { + typedef void (APIENTRYP PFN_glVertexArrayVertexAttribFormatEXT) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); + return ((PFN_glVertexArrayVertexAttribFormatEXT)__blue_glCore_glVertexArrayVertexAttribFormatEXT)(vaobj, attribindex, size, type, normalized, relativeoffset); +} + +extern void* __blue_glCore_glVertexArrayVertexAttribIFormatEXT; +void APIENTRY bluegl_glVertexArrayVertexAttribIFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { + typedef void (APIENTRYP PFN_glVertexArrayVertexAttribIFormatEXT) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); + return ((PFN_glVertexArrayVertexAttribIFormatEXT)__blue_glCore_glVertexArrayVertexAttribIFormatEXT)(vaobj, attribindex, size, type, relativeoffset); +} + +extern void* __blue_glCore_glVertexArrayVertexAttribLFormatEXT; +void APIENTRY bluegl_glVertexArrayVertexAttribLFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { + typedef void (APIENTRYP PFN_glVertexArrayVertexAttribLFormatEXT) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); + return ((PFN_glVertexArrayVertexAttribLFormatEXT)__blue_glCore_glVertexArrayVertexAttribLFormatEXT)(vaobj, attribindex, size, type, relativeoffset); +} + +extern void* __blue_glCore_glVertexArrayVertexAttribBindingEXT; +void APIENTRY bluegl_glVertexArrayVertexAttribBindingEXT (GLuint vaobj, GLuint attribindex, GLuint bindingindex) { + typedef void (APIENTRYP PFN_glVertexArrayVertexAttribBindingEXT) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); + return ((PFN_glVertexArrayVertexAttribBindingEXT)__blue_glCore_glVertexArrayVertexAttribBindingEXT)(vaobj, attribindex, bindingindex); +} + +extern void* __blue_glCore_glVertexArrayVertexBindingDivisorEXT; +void APIENTRY bluegl_glVertexArrayVertexBindingDivisorEXT (GLuint vaobj, GLuint bindingindex, GLuint divisor) { + typedef void (APIENTRYP PFN_glVertexArrayVertexBindingDivisorEXT) (GLuint vaobj, GLuint bindingindex, GLuint divisor); + return ((PFN_glVertexArrayVertexBindingDivisorEXT)__blue_glCore_glVertexArrayVertexBindingDivisorEXT)(vaobj, bindingindex, divisor); +} + +extern void* __blue_glCore_glVertexArrayVertexAttribLOffsetEXT; +void APIENTRY bluegl_glVertexArrayVertexAttribLOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset) { + typedef void (APIENTRYP PFN_glVertexArrayVertexAttribLOffsetEXT) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); + return ((PFN_glVertexArrayVertexAttribLOffsetEXT)__blue_glCore_glVertexArrayVertexAttribLOffsetEXT)(vaobj, buffer, index, size, type, stride, offset); +} + +extern void* __blue_glCore_glTexturePageCommitmentEXT; +void APIENTRY bluegl_glTexturePageCommitmentEXT (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit) { + typedef void (APIENTRYP PFN_glTexturePageCommitmentEXT) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); + return ((PFN_glTexturePageCommitmentEXT)__blue_glCore_glTexturePageCommitmentEXT)(texture, level, xoffset, yoffset, zoffset, width, height, depth, commit); +} + +extern void* __blue_glCore_glVertexArrayVertexAttribDivisorEXT; +void APIENTRY bluegl_glVertexArrayVertexAttribDivisorEXT (GLuint vaobj, GLuint index, GLuint divisor) { + typedef void (APIENTRYP PFN_glVertexArrayVertexAttribDivisorEXT) (GLuint vaobj, GLuint index, GLuint divisor); + return ((PFN_glVertexArrayVertexAttribDivisorEXT)__blue_glCore_glVertexArrayVertexAttribDivisorEXT)(vaobj, index, divisor); +} + +extern void* __blue_glCore_glColorMaskIndexedEXT; +void APIENTRY bluegl_glColorMaskIndexedEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) { + typedef void (APIENTRYP PFN_glColorMaskIndexedEXT) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); + return ((PFN_glColorMaskIndexedEXT)__blue_glCore_glColorMaskIndexedEXT)(index, r, g, b, a); +} + +extern void* __blue_glCore_glDrawArraysInstancedEXT; +void APIENTRY bluegl_glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount) { + typedef void (APIENTRYP PFN_glDrawArraysInstancedEXT) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); + return ((PFN_glDrawArraysInstancedEXT)__blue_glCore_glDrawArraysInstancedEXT)(mode, start, count, primcount); +} + +extern void* __blue_glCore_glDrawElementsInstancedEXT; +void APIENTRY bluegl_glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount) { + typedef void (APIENTRYP PFN_glDrawElementsInstancedEXT) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); + return ((PFN_glDrawElementsInstancedEXT)__blue_glCore_glDrawElementsInstancedEXT)(mode, count, type, indices, primcount); +} + +extern void* __blue_glCore_glDrawRangeElementsEXT; +void APIENTRY bluegl_glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices) { + typedef void (APIENTRYP PFN_glDrawRangeElementsEXT) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); + return ((PFN_glDrawRangeElementsEXT)__blue_glCore_glDrawRangeElementsEXT)(mode, start, end, count, type, indices); +} + +extern void* __blue_glCore_glFogCoordfEXT; +void APIENTRY bluegl_glFogCoordfEXT (GLfloat coord) { + typedef void (APIENTRYP PFN_glFogCoordfEXT) (GLfloat coord); + return ((PFN_glFogCoordfEXT)__blue_glCore_glFogCoordfEXT)(coord); +} + +extern void* __blue_glCore_glFogCoordfvEXT; +void APIENTRY bluegl_glFogCoordfvEXT (const GLfloat *coord) { + typedef void (APIENTRYP PFN_glFogCoordfvEXT) (const GLfloat *coord); + return ((PFN_glFogCoordfvEXT)__blue_glCore_glFogCoordfvEXT)(coord); +} + +extern void* __blue_glCore_glFogCoorddEXT; +void APIENTRY bluegl_glFogCoorddEXT (GLdouble coord) { + typedef void (APIENTRYP PFN_glFogCoorddEXT) (GLdouble coord); + return ((PFN_glFogCoorddEXT)__blue_glCore_glFogCoorddEXT)(coord); +} + +extern void* __blue_glCore_glFogCoorddvEXT; +void APIENTRY bluegl_glFogCoorddvEXT (const GLdouble *coord) { + typedef void (APIENTRYP PFN_glFogCoorddvEXT) (const GLdouble *coord); + return ((PFN_glFogCoorddvEXT)__blue_glCore_glFogCoorddvEXT)(coord); +} + +extern void* __blue_glCore_glFogCoordPointerEXT; +void APIENTRY bluegl_glFogCoordPointerEXT (GLenum type, GLsizei stride, const void *pointer) { + typedef void (APIENTRYP PFN_glFogCoordPointerEXT) (GLenum type, GLsizei stride, const void *pointer); + return ((PFN_glFogCoordPointerEXT)__blue_glCore_glFogCoordPointerEXT)(type, stride, pointer); +} + +extern void* __blue_glCore_glBlitFramebufferEXT; +void APIENTRY bluegl_glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { + typedef void (APIENTRYP PFN_glBlitFramebufferEXT) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + return ((PFN_glBlitFramebufferEXT)__blue_glCore_glBlitFramebufferEXT)(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); +} + +extern void* __blue_glCore_glRenderbufferStorageMultisampleEXT; +void APIENTRY bluegl_glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glRenderbufferStorageMultisampleEXT) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + return ((PFN_glRenderbufferStorageMultisampleEXT)__blue_glCore_glRenderbufferStorageMultisampleEXT)(target, samples, internalformat, width, height); +} + +extern void* __blue_glCore_glIsRenderbufferEXT; +GLboolean APIENTRY bluegl_glIsRenderbufferEXT (GLuint renderbuffer) { + typedef GLboolean (APIENTRYP PFN_glIsRenderbufferEXT) (GLuint renderbuffer); + return ((PFN_glIsRenderbufferEXT)__blue_glCore_glIsRenderbufferEXT)(renderbuffer); +} + +extern void* __blue_glCore_glBindRenderbufferEXT; +void APIENTRY bluegl_glBindRenderbufferEXT (GLenum target, GLuint renderbuffer) { + typedef void (APIENTRYP PFN_glBindRenderbufferEXT) (GLenum target, GLuint renderbuffer); + return ((PFN_glBindRenderbufferEXT)__blue_glCore_glBindRenderbufferEXT)(target, renderbuffer); +} + +extern void* __blue_glCore_glDeleteRenderbuffersEXT; +void APIENTRY bluegl_glDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers) { + typedef void (APIENTRYP PFN_glDeleteRenderbuffersEXT) (GLsizei n, const GLuint *renderbuffers); + return ((PFN_glDeleteRenderbuffersEXT)__blue_glCore_glDeleteRenderbuffersEXT)(n, renderbuffers); +} + +extern void* __blue_glCore_glGenRenderbuffersEXT; +void APIENTRY bluegl_glGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers) { + typedef void (APIENTRYP PFN_glGenRenderbuffersEXT) (GLsizei n, GLuint *renderbuffers); + return ((PFN_glGenRenderbuffersEXT)__blue_glCore_glGenRenderbuffersEXT)(n, renderbuffers); +} + +extern void* __blue_glCore_glRenderbufferStorageEXT; +void APIENTRY bluegl_glRenderbufferStorageEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glRenderbufferStorageEXT) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); + return ((PFN_glRenderbufferStorageEXT)__blue_glCore_glRenderbufferStorageEXT)(target, internalformat, width, height); +} + +extern void* __blue_glCore_glGetRenderbufferParameterivEXT; +void APIENTRY bluegl_glGetRenderbufferParameterivEXT (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetRenderbufferParameterivEXT) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetRenderbufferParameterivEXT)__blue_glCore_glGetRenderbufferParameterivEXT)(target, pname, params); +} + +extern void* __blue_glCore_glIsFramebufferEXT; +GLboolean APIENTRY bluegl_glIsFramebufferEXT (GLuint framebuffer) { + typedef GLboolean (APIENTRYP PFN_glIsFramebufferEXT) (GLuint framebuffer); + return ((PFN_glIsFramebufferEXT)__blue_glCore_glIsFramebufferEXT)(framebuffer); +} + +extern void* __blue_glCore_glBindFramebufferEXT; +void APIENTRY bluegl_glBindFramebufferEXT (GLenum target, GLuint framebuffer) { + typedef void (APIENTRYP PFN_glBindFramebufferEXT) (GLenum target, GLuint framebuffer); + return ((PFN_glBindFramebufferEXT)__blue_glCore_glBindFramebufferEXT)(target, framebuffer); +} + +extern void* __blue_glCore_glDeleteFramebuffersEXT; +void APIENTRY bluegl_glDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers) { + typedef void (APIENTRYP PFN_glDeleteFramebuffersEXT) (GLsizei n, const GLuint *framebuffers); + return ((PFN_glDeleteFramebuffersEXT)__blue_glCore_glDeleteFramebuffersEXT)(n, framebuffers); +} + +extern void* __blue_glCore_glGenFramebuffersEXT; +void APIENTRY bluegl_glGenFramebuffersEXT (GLsizei n, GLuint *framebuffers) { + typedef void (APIENTRYP PFN_glGenFramebuffersEXT) (GLsizei n, GLuint *framebuffers); + return ((PFN_glGenFramebuffersEXT)__blue_glCore_glGenFramebuffersEXT)(n, framebuffers); +} + +extern void* __blue_glCore_glCheckFramebufferStatusEXT; +GLenum APIENTRY bluegl_glCheckFramebufferStatusEXT (GLenum target) { + typedef GLenum (APIENTRYP PFN_glCheckFramebufferStatusEXT) (GLenum target); + return ((PFN_glCheckFramebufferStatusEXT)__blue_glCore_glCheckFramebufferStatusEXT)(target); +} + +extern void* __blue_glCore_glFramebufferTexture1DEXT; +void APIENTRY bluegl_glFramebufferTexture1DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { + typedef void (APIENTRYP PFN_glFramebufferTexture1DEXT) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + return ((PFN_glFramebufferTexture1DEXT)__blue_glCore_glFramebufferTexture1DEXT)(target, attachment, textarget, texture, level); +} + +extern void* __blue_glCore_glFramebufferTexture2DEXT; +void APIENTRY bluegl_glFramebufferTexture2DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { + typedef void (APIENTRYP PFN_glFramebufferTexture2DEXT) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + return ((PFN_glFramebufferTexture2DEXT)__blue_glCore_glFramebufferTexture2DEXT)(target, attachment, textarget, texture, level); +} + +extern void* __blue_glCore_glFramebufferTexture3DEXT; +void APIENTRY bluegl_glFramebufferTexture3DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) { + typedef void (APIENTRYP PFN_glFramebufferTexture3DEXT) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); + return ((PFN_glFramebufferTexture3DEXT)__blue_glCore_glFramebufferTexture3DEXT)(target, attachment, textarget, texture, level, zoffset); +} + +extern void* __blue_glCore_glFramebufferRenderbufferEXT; +void APIENTRY bluegl_glFramebufferRenderbufferEXT (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) { + typedef void (APIENTRYP PFN_glFramebufferRenderbufferEXT) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); + return ((PFN_glFramebufferRenderbufferEXT)__blue_glCore_glFramebufferRenderbufferEXT)(target, attachment, renderbuffertarget, renderbuffer); +} + +extern void* __blue_glCore_glGetFramebufferAttachmentParameterivEXT; +void APIENTRY bluegl_glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum attachment, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetFramebufferAttachmentParameterivEXT) (GLenum target, GLenum attachment, GLenum pname, GLint *params); + return ((PFN_glGetFramebufferAttachmentParameterivEXT)__blue_glCore_glGetFramebufferAttachmentParameterivEXT)(target, attachment, pname, params); +} + +extern void* __blue_glCore_glGenerateMipmapEXT; +void APIENTRY bluegl_glGenerateMipmapEXT (GLenum target) { + typedef void (APIENTRYP PFN_glGenerateMipmapEXT) (GLenum target); + return ((PFN_glGenerateMipmapEXT)__blue_glCore_glGenerateMipmapEXT)(target); +} + +extern void* __blue_glCore_glProgramParameteriEXT; +void APIENTRY bluegl_glProgramParameteriEXT (GLuint program, GLenum pname, GLint value) { + typedef void (APIENTRYP PFN_glProgramParameteriEXT) (GLuint program, GLenum pname, GLint value); + return ((PFN_glProgramParameteriEXT)__blue_glCore_glProgramParameteriEXT)(program, pname, value); +} + +extern void* __blue_glCore_glProgramEnvParameters4fvEXT; +void APIENTRY bluegl_glProgramEnvParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params) { + typedef void (APIENTRYP PFN_glProgramEnvParameters4fvEXT) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); + return ((PFN_glProgramEnvParameters4fvEXT)__blue_glCore_glProgramEnvParameters4fvEXT)(target, index, count, params); +} + +extern void* __blue_glCore_glProgramLocalParameters4fvEXT; +void APIENTRY bluegl_glProgramLocalParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params) { + typedef void (APIENTRYP PFN_glProgramLocalParameters4fvEXT) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); + return ((PFN_glProgramLocalParameters4fvEXT)__blue_glCore_glProgramLocalParameters4fvEXT)(target, index, count, params); +} + +extern void* __blue_glCore_glGetUniformuivEXT; +void APIENTRY bluegl_glGetUniformuivEXT (GLuint program, GLint location, GLuint *params) { + typedef void (APIENTRYP PFN_glGetUniformuivEXT) (GLuint program, GLint location, GLuint *params); + return ((PFN_glGetUniformuivEXT)__blue_glCore_glGetUniformuivEXT)(program, location, params); +} + +extern void* __blue_glCore_glBindFragDataLocationEXT; +void APIENTRY bluegl_glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name) { + typedef void (APIENTRYP PFN_glBindFragDataLocationEXT) (GLuint program, GLuint color, const GLchar *name); + return ((PFN_glBindFragDataLocationEXT)__blue_glCore_glBindFragDataLocationEXT)(program, color, name); +} + +extern void* __blue_glCore_glGetFragDataLocationEXT; +GLint APIENTRY bluegl_glGetFragDataLocationEXT (GLuint program, const GLchar *name) { + typedef GLint (APIENTRYP PFN_glGetFragDataLocationEXT) (GLuint program, const GLchar *name); + return ((PFN_glGetFragDataLocationEXT)__blue_glCore_glGetFragDataLocationEXT)(program, name); +} + +extern void* __blue_glCore_glUniform1uiEXT; +void APIENTRY bluegl_glUniform1uiEXT (GLint location, GLuint v0) { + typedef void (APIENTRYP PFN_glUniform1uiEXT) (GLint location, GLuint v0); + return ((PFN_glUniform1uiEXT)__blue_glCore_glUniform1uiEXT)(location, v0); +} + +extern void* __blue_glCore_glUniform2uiEXT; +void APIENTRY bluegl_glUniform2uiEXT (GLint location, GLuint v0, GLuint v1) { + typedef void (APIENTRYP PFN_glUniform2uiEXT) (GLint location, GLuint v0, GLuint v1); + return ((PFN_glUniform2uiEXT)__blue_glCore_glUniform2uiEXT)(location, v0, v1); +} + +extern void* __blue_glCore_glUniform3uiEXT; +void APIENTRY bluegl_glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2) { + typedef void (APIENTRYP PFN_glUniform3uiEXT) (GLint location, GLuint v0, GLuint v1, GLuint v2); + return ((PFN_glUniform3uiEXT)__blue_glCore_glUniform3uiEXT)(location, v0, v1, v2); +} + +extern void* __blue_glCore_glUniform4uiEXT; +void APIENTRY bluegl_glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) { + typedef void (APIENTRYP PFN_glUniform4uiEXT) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); + return ((PFN_glUniform4uiEXT)__blue_glCore_glUniform4uiEXT)(location, v0, v1, v2, v3); +} + +extern void* __blue_glCore_glUniform1uivEXT; +void APIENTRY bluegl_glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value) { + typedef void (APIENTRYP PFN_glUniform1uivEXT) (GLint location, GLsizei count, const GLuint *value); + return ((PFN_glUniform1uivEXT)__blue_glCore_glUniform1uivEXT)(location, count, value); +} + +extern void* __blue_glCore_glUniform2uivEXT; +void APIENTRY bluegl_glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value) { + typedef void (APIENTRYP PFN_glUniform2uivEXT) (GLint location, GLsizei count, const GLuint *value); + return ((PFN_glUniform2uivEXT)__blue_glCore_glUniform2uivEXT)(location, count, value); +} + +extern void* __blue_glCore_glUniform3uivEXT; +void APIENTRY bluegl_glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value) { + typedef void (APIENTRYP PFN_glUniform3uivEXT) (GLint location, GLsizei count, const GLuint *value); + return ((PFN_glUniform3uivEXT)__blue_glCore_glUniform3uivEXT)(location, count, value); +} + +extern void* __blue_glCore_glUniform4uivEXT; +void APIENTRY bluegl_glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value) { + typedef void (APIENTRYP PFN_glUniform4uivEXT) (GLint location, GLsizei count, const GLuint *value); + return ((PFN_glUniform4uivEXT)__blue_glCore_glUniform4uivEXT)(location, count, value); +} + +extern void* __blue_glCore_glGetHistogramEXT; +void APIENTRY bluegl_glGetHistogramEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values) { + typedef void (APIENTRYP PFN_glGetHistogramEXT) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); + return ((PFN_glGetHistogramEXT)__blue_glCore_glGetHistogramEXT)(target, reset, format, type, values); +} + +extern void* __blue_glCore_glGetHistogramParameterfvEXT; +void APIENTRY bluegl_glGetHistogramParameterfvEXT (GLenum target, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetHistogramParameterfvEXT) (GLenum target, GLenum pname, GLfloat *params); + return ((PFN_glGetHistogramParameterfvEXT)__blue_glCore_glGetHistogramParameterfvEXT)(target, pname, params); +} + +extern void* __blue_glCore_glGetHistogramParameterivEXT; +void APIENTRY bluegl_glGetHistogramParameterivEXT (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetHistogramParameterivEXT) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetHistogramParameterivEXT)__blue_glCore_glGetHistogramParameterivEXT)(target, pname, params); +} + +extern void* __blue_glCore_glGetMinmaxEXT; +void APIENTRY bluegl_glGetMinmaxEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values) { + typedef void (APIENTRYP PFN_glGetMinmaxEXT) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); + return ((PFN_glGetMinmaxEXT)__blue_glCore_glGetMinmaxEXT)(target, reset, format, type, values); +} + +extern void* __blue_glCore_glGetMinmaxParameterfvEXT; +void APIENTRY bluegl_glGetMinmaxParameterfvEXT (GLenum target, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetMinmaxParameterfvEXT) (GLenum target, GLenum pname, GLfloat *params); + return ((PFN_glGetMinmaxParameterfvEXT)__blue_glCore_glGetMinmaxParameterfvEXT)(target, pname, params); +} + +extern void* __blue_glCore_glGetMinmaxParameterivEXT; +void APIENTRY bluegl_glGetMinmaxParameterivEXT (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetMinmaxParameterivEXT) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetMinmaxParameterivEXT)__blue_glCore_glGetMinmaxParameterivEXT)(target, pname, params); +} + +extern void* __blue_glCore_glHistogramEXT; +void APIENTRY bluegl_glHistogramEXT (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink) { + typedef void (APIENTRYP PFN_glHistogramEXT) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); + return ((PFN_glHistogramEXT)__blue_glCore_glHistogramEXT)(target, width, internalformat, sink); +} + +extern void* __blue_glCore_glMinmaxEXT; +void APIENTRY bluegl_glMinmaxEXT (GLenum target, GLenum internalformat, GLboolean sink) { + typedef void (APIENTRYP PFN_glMinmaxEXT) (GLenum target, GLenum internalformat, GLboolean sink); + return ((PFN_glMinmaxEXT)__blue_glCore_glMinmaxEXT)(target, internalformat, sink); +} + +extern void* __blue_glCore_glResetHistogramEXT; +void APIENTRY bluegl_glResetHistogramEXT (GLenum target) { + typedef void (APIENTRYP PFN_glResetHistogramEXT) (GLenum target); + return ((PFN_glResetHistogramEXT)__blue_glCore_glResetHistogramEXT)(target); +} + +extern void* __blue_glCore_glResetMinmaxEXT; +void APIENTRY bluegl_glResetMinmaxEXT (GLenum target) { + typedef void (APIENTRYP PFN_glResetMinmaxEXT) (GLenum target); + return ((PFN_glResetMinmaxEXT)__blue_glCore_glResetMinmaxEXT)(target); +} + +extern void* __blue_glCore_glIndexFuncEXT; +void APIENTRY bluegl_glIndexFuncEXT (GLenum func, GLclampf ref) { + typedef void (APIENTRYP PFN_glIndexFuncEXT) (GLenum func, GLclampf ref); + return ((PFN_glIndexFuncEXT)__blue_glCore_glIndexFuncEXT)(func, ref); +} + +extern void* __blue_glCore_glIndexMaterialEXT; +void APIENTRY bluegl_glIndexMaterialEXT (GLenum face, GLenum mode) { + typedef void (APIENTRYP PFN_glIndexMaterialEXT) (GLenum face, GLenum mode); + return ((PFN_glIndexMaterialEXT)__blue_glCore_glIndexMaterialEXT)(face, mode); +} + +extern void* __blue_glCore_glApplyTextureEXT; +void APIENTRY bluegl_glApplyTextureEXT (GLenum mode) { + typedef void (APIENTRYP PFN_glApplyTextureEXT) (GLenum mode); + return ((PFN_glApplyTextureEXT)__blue_glCore_glApplyTextureEXT)(mode); +} + +extern void* __blue_glCore_glTextureLightEXT; +void APIENTRY bluegl_glTextureLightEXT (GLenum pname) { + typedef void (APIENTRYP PFN_glTextureLightEXT) (GLenum pname); + return ((PFN_glTextureLightEXT)__blue_glCore_glTextureLightEXT)(pname); +} + +extern void* __blue_glCore_glTextureMaterialEXT; +void APIENTRY bluegl_glTextureMaterialEXT (GLenum face, GLenum mode) { + typedef void (APIENTRYP PFN_glTextureMaterialEXT) (GLenum face, GLenum mode); + return ((PFN_glTextureMaterialEXT)__blue_glCore_glTextureMaterialEXT)(face, mode); +} + +extern void* __blue_glCore_glMultiDrawArraysEXT; +void APIENTRY bluegl_glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount) { + typedef void (APIENTRYP PFN_glMultiDrawArraysEXT) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); + return ((PFN_glMultiDrawArraysEXT)__blue_glCore_glMultiDrawArraysEXT)(mode, first, count, primcount); +} + +extern void* __blue_glCore_glMultiDrawElementsEXT; +void APIENTRY bluegl_glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount) { + typedef void (APIENTRYP PFN_glMultiDrawElementsEXT) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); + return ((PFN_glMultiDrawElementsEXT)__blue_glCore_glMultiDrawElementsEXT)(mode, count, type, indices, primcount); +} + +extern void* __blue_glCore_glSampleMaskEXT; +void APIENTRY bluegl_glSampleMaskEXT (GLclampf value, GLboolean invert) { + typedef void (APIENTRYP PFN_glSampleMaskEXT) (GLclampf value, GLboolean invert); + return ((PFN_glSampleMaskEXT)__blue_glCore_glSampleMaskEXT)(value, invert); +} + +extern void* __blue_glCore_glSamplePatternEXT; +void APIENTRY bluegl_glSamplePatternEXT (GLenum pattern) { + typedef void (APIENTRYP PFN_glSamplePatternEXT) (GLenum pattern); + return ((PFN_glSamplePatternEXT)__blue_glCore_glSamplePatternEXT)(pattern); +} + +extern void* __blue_glCore_glColorTableEXT; +void APIENTRY bluegl_glColorTableEXT (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table) { + typedef void (APIENTRYP PFN_glColorTableEXT) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table); + return ((PFN_glColorTableEXT)__blue_glCore_glColorTableEXT)(target, internalFormat, width, format, type, table); +} + +extern void* __blue_glCore_glGetColorTableEXT; +void APIENTRY bluegl_glGetColorTableEXT (GLenum target, GLenum format, GLenum type, void *data) { + typedef void (APIENTRYP PFN_glGetColorTableEXT) (GLenum target, GLenum format, GLenum type, void *data); + return ((PFN_glGetColorTableEXT)__blue_glCore_glGetColorTableEXT)(target, format, type, data); +} + +extern void* __blue_glCore_glGetColorTableParameterivEXT; +void APIENTRY bluegl_glGetColorTableParameterivEXT (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetColorTableParameterivEXT) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetColorTableParameterivEXT)__blue_glCore_glGetColorTableParameterivEXT)(target, pname, params); +} + +extern void* __blue_glCore_glGetColorTableParameterfvEXT; +void APIENTRY bluegl_glGetColorTableParameterfvEXT (GLenum target, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetColorTableParameterfvEXT) (GLenum target, GLenum pname, GLfloat *params); + return ((PFN_glGetColorTableParameterfvEXT)__blue_glCore_glGetColorTableParameterfvEXT)(target, pname, params); +} + +extern void* __blue_glCore_glPixelTransformParameteriEXT; +void APIENTRY bluegl_glPixelTransformParameteriEXT (GLenum target, GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glPixelTransformParameteriEXT) (GLenum target, GLenum pname, GLint param); + return ((PFN_glPixelTransformParameteriEXT)__blue_glCore_glPixelTransformParameteriEXT)(target, pname, param); +} + +extern void* __blue_glCore_glPixelTransformParameterfEXT; +void APIENTRY bluegl_glPixelTransformParameterfEXT (GLenum target, GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glPixelTransformParameterfEXT) (GLenum target, GLenum pname, GLfloat param); + return ((PFN_glPixelTransformParameterfEXT)__blue_glCore_glPixelTransformParameterfEXT)(target, pname, param); +} + +extern void* __blue_glCore_glPixelTransformParameterivEXT; +void APIENTRY bluegl_glPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glPixelTransformParameterivEXT) (GLenum target, GLenum pname, const GLint *params); + return ((PFN_glPixelTransformParameterivEXT)__blue_glCore_glPixelTransformParameterivEXT)(target, pname, params); +} + +extern void* __blue_glCore_glPixelTransformParameterfvEXT; +void APIENTRY bluegl_glPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glPixelTransformParameterfvEXT) (GLenum target, GLenum pname, const GLfloat *params); + return ((PFN_glPixelTransformParameterfvEXT)__blue_glCore_glPixelTransformParameterfvEXT)(target, pname, params); +} + +extern void* __blue_glCore_glGetPixelTransformParameterivEXT; +void APIENTRY bluegl_glGetPixelTransformParameterivEXT (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetPixelTransformParameterivEXT) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetPixelTransformParameterivEXT)__blue_glCore_glGetPixelTransformParameterivEXT)(target, pname, params); +} + +extern void* __blue_glCore_glGetPixelTransformParameterfvEXT; +void APIENTRY bluegl_glGetPixelTransformParameterfvEXT (GLenum target, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetPixelTransformParameterfvEXT) (GLenum target, GLenum pname, GLfloat *params); + return ((PFN_glGetPixelTransformParameterfvEXT)__blue_glCore_glGetPixelTransformParameterfvEXT)(target, pname, params); +} + +extern void* __blue_glCore_glPointParameterfEXT; +void APIENTRY bluegl_glPointParameterfEXT (GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glPointParameterfEXT) (GLenum pname, GLfloat param); + return ((PFN_glPointParameterfEXT)__blue_glCore_glPointParameterfEXT)(pname, param); +} + +extern void* __blue_glCore_glPointParameterfvEXT; +void APIENTRY bluegl_glPointParameterfvEXT (GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glPointParameterfvEXT) (GLenum pname, const GLfloat *params); + return ((PFN_glPointParameterfvEXT)__blue_glCore_glPointParameterfvEXT)(pname, params); +} + +extern void* __blue_glCore_glPolygonOffsetEXT; +void APIENTRY bluegl_glPolygonOffsetEXT (GLfloat factor, GLfloat bias) { + typedef void (APIENTRYP PFN_glPolygonOffsetEXT) (GLfloat factor, GLfloat bias); + return ((PFN_glPolygonOffsetEXT)__blue_glCore_glPolygonOffsetEXT)(factor, bias); +} + +extern void* __blue_glCore_glPolygonOffsetClampEXT; +void APIENTRY bluegl_glPolygonOffsetClampEXT (GLfloat factor, GLfloat units, GLfloat clamp) { + typedef void (APIENTRYP PFN_glPolygonOffsetClampEXT) (GLfloat factor, GLfloat units, GLfloat clamp); + return ((PFN_glPolygonOffsetClampEXT)__blue_glCore_glPolygonOffsetClampEXT)(factor, units, clamp); +} + +extern void* __blue_glCore_glProvokingVertexEXT; +void APIENTRY bluegl_glProvokingVertexEXT (GLenum mode) { + typedef void (APIENTRYP PFN_glProvokingVertexEXT) (GLenum mode); + return ((PFN_glProvokingVertexEXT)__blue_glCore_glProvokingVertexEXT)(mode); +} + +extern void* __blue_glCore_glRasterSamplesEXT; +void APIENTRY bluegl_glRasterSamplesEXT (GLuint samples, GLboolean fixedsamplelocations) { + typedef void (APIENTRYP PFN_glRasterSamplesEXT) (GLuint samples, GLboolean fixedsamplelocations); + return ((PFN_glRasterSamplesEXT)__blue_glCore_glRasterSamplesEXT)(samples, fixedsamplelocations); +} + +extern void* __blue_glCore_glSecondaryColor3bEXT; +void APIENTRY bluegl_glSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue) { + typedef void (APIENTRYP PFN_glSecondaryColor3bEXT) (GLbyte red, GLbyte green, GLbyte blue); + return ((PFN_glSecondaryColor3bEXT)__blue_glCore_glSecondaryColor3bEXT)(red, green, blue); +} + +extern void* __blue_glCore_glSecondaryColor3bvEXT; +void APIENTRY bluegl_glSecondaryColor3bvEXT (const GLbyte *v) { + typedef void (APIENTRYP PFN_glSecondaryColor3bvEXT) (const GLbyte *v); + return ((PFN_glSecondaryColor3bvEXT)__blue_glCore_glSecondaryColor3bvEXT)(v); +} + +extern void* __blue_glCore_glSecondaryColor3dEXT; +void APIENTRY bluegl_glSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue) { + typedef void (APIENTRYP PFN_glSecondaryColor3dEXT) (GLdouble red, GLdouble green, GLdouble blue); + return ((PFN_glSecondaryColor3dEXT)__blue_glCore_glSecondaryColor3dEXT)(red, green, blue); +} + +extern void* __blue_glCore_glSecondaryColor3dvEXT; +void APIENTRY bluegl_glSecondaryColor3dvEXT (const GLdouble *v) { + typedef void (APIENTRYP PFN_glSecondaryColor3dvEXT) (const GLdouble *v); + return ((PFN_glSecondaryColor3dvEXT)__blue_glCore_glSecondaryColor3dvEXT)(v); +} + +extern void* __blue_glCore_glSecondaryColor3fEXT; +void APIENTRY bluegl_glSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue) { + typedef void (APIENTRYP PFN_glSecondaryColor3fEXT) (GLfloat red, GLfloat green, GLfloat blue); + return ((PFN_glSecondaryColor3fEXT)__blue_glCore_glSecondaryColor3fEXT)(red, green, blue); +} + +extern void* __blue_glCore_glSecondaryColor3fvEXT; +void APIENTRY bluegl_glSecondaryColor3fvEXT (const GLfloat *v) { + typedef void (APIENTRYP PFN_glSecondaryColor3fvEXT) (const GLfloat *v); + return ((PFN_glSecondaryColor3fvEXT)__blue_glCore_glSecondaryColor3fvEXT)(v); +} + +extern void* __blue_glCore_glSecondaryColor3iEXT; +void APIENTRY bluegl_glSecondaryColor3iEXT (GLint red, GLint green, GLint blue) { + typedef void (APIENTRYP PFN_glSecondaryColor3iEXT) (GLint red, GLint green, GLint blue); + return ((PFN_glSecondaryColor3iEXT)__blue_glCore_glSecondaryColor3iEXT)(red, green, blue); +} + +extern void* __blue_glCore_glSecondaryColor3ivEXT; +void APIENTRY bluegl_glSecondaryColor3ivEXT (const GLint *v) { + typedef void (APIENTRYP PFN_glSecondaryColor3ivEXT) (const GLint *v); + return ((PFN_glSecondaryColor3ivEXT)__blue_glCore_glSecondaryColor3ivEXT)(v); +} + +extern void* __blue_glCore_glSecondaryColor3sEXT; +void APIENTRY bluegl_glSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue) { + typedef void (APIENTRYP PFN_glSecondaryColor3sEXT) (GLshort red, GLshort green, GLshort blue); + return ((PFN_glSecondaryColor3sEXT)__blue_glCore_glSecondaryColor3sEXT)(red, green, blue); +} + +extern void* __blue_glCore_glSecondaryColor3svEXT; +void APIENTRY bluegl_glSecondaryColor3svEXT (const GLshort *v) { + typedef void (APIENTRYP PFN_glSecondaryColor3svEXT) (const GLshort *v); + return ((PFN_glSecondaryColor3svEXT)__blue_glCore_glSecondaryColor3svEXT)(v); +} + +extern void* __blue_glCore_glSecondaryColor3ubEXT; +void APIENTRY bluegl_glSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue) { + typedef void (APIENTRYP PFN_glSecondaryColor3ubEXT) (GLubyte red, GLubyte green, GLubyte blue); + return ((PFN_glSecondaryColor3ubEXT)__blue_glCore_glSecondaryColor3ubEXT)(red, green, blue); +} + +extern void* __blue_glCore_glSecondaryColor3ubvEXT; +void APIENTRY bluegl_glSecondaryColor3ubvEXT (const GLubyte *v) { + typedef void (APIENTRYP PFN_glSecondaryColor3ubvEXT) (const GLubyte *v); + return ((PFN_glSecondaryColor3ubvEXT)__blue_glCore_glSecondaryColor3ubvEXT)(v); +} + +extern void* __blue_glCore_glSecondaryColor3uiEXT; +void APIENTRY bluegl_glSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue) { + typedef void (APIENTRYP PFN_glSecondaryColor3uiEXT) (GLuint red, GLuint green, GLuint blue); + return ((PFN_glSecondaryColor3uiEXT)__blue_glCore_glSecondaryColor3uiEXT)(red, green, blue); +} + +extern void* __blue_glCore_glSecondaryColor3uivEXT; +void APIENTRY bluegl_glSecondaryColor3uivEXT (const GLuint *v) { + typedef void (APIENTRYP PFN_glSecondaryColor3uivEXT) (const GLuint *v); + return ((PFN_glSecondaryColor3uivEXT)__blue_glCore_glSecondaryColor3uivEXT)(v); +} + +extern void* __blue_glCore_glSecondaryColor3usEXT; +void APIENTRY bluegl_glSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue) { + typedef void (APIENTRYP PFN_glSecondaryColor3usEXT) (GLushort red, GLushort green, GLushort blue); + return ((PFN_glSecondaryColor3usEXT)__blue_glCore_glSecondaryColor3usEXT)(red, green, blue); +} + +extern void* __blue_glCore_glSecondaryColor3usvEXT; +void APIENTRY bluegl_glSecondaryColor3usvEXT (const GLushort *v) { + typedef void (APIENTRYP PFN_glSecondaryColor3usvEXT) (const GLushort *v); + return ((PFN_glSecondaryColor3usvEXT)__blue_glCore_glSecondaryColor3usvEXT)(v); +} + +extern void* __blue_glCore_glSecondaryColorPointerEXT; +void APIENTRY bluegl_glSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer) { + typedef void (APIENTRYP PFN_glSecondaryColorPointerEXT) (GLint size, GLenum type, GLsizei stride, const void *pointer); + return ((PFN_glSecondaryColorPointerEXT)__blue_glCore_glSecondaryColorPointerEXT)(size, type, stride, pointer); +} + +extern void* __blue_glCore_glUseShaderProgramEXT; +void APIENTRY bluegl_glUseShaderProgramEXT (GLenum type, GLuint program) { + typedef void (APIENTRYP PFN_glUseShaderProgramEXT) (GLenum type, GLuint program); + return ((PFN_glUseShaderProgramEXT)__blue_glCore_glUseShaderProgramEXT)(type, program); +} + +extern void* __blue_glCore_glActiveProgramEXT; +void APIENTRY bluegl_glActiveProgramEXT (GLuint program) { + typedef void (APIENTRYP PFN_glActiveProgramEXT) (GLuint program); + return ((PFN_glActiveProgramEXT)__blue_glCore_glActiveProgramEXT)(program); +} + +extern void* __blue_glCore_glCreateShaderProgramEXT; +GLuint APIENTRY bluegl_glCreateShaderProgramEXT (GLenum type, const GLchar *string) { + typedef GLuint (APIENTRYP PFN_glCreateShaderProgramEXT) (GLenum type, const GLchar *string); + return ((PFN_glCreateShaderProgramEXT)__blue_glCore_glCreateShaderProgramEXT)(type, string); +} + +extern void* __blue_glCore_glBindImageTextureEXT; +void APIENTRY bluegl_glBindImageTextureEXT (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format) { + typedef void (APIENTRYP PFN_glBindImageTextureEXT) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); + return ((PFN_glBindImageTextureEXT)__blue_glCore_glBindImageTextureEXT)(index, texture, level, layered, layer, access, format); +} + +extern void* __blue_glCore_glMemoryBarrierEXT; +void APIENTRY bluegl_glMemoryBarrierEXT (GLbitfield barriers) { + typedef void (APIENTRYP PFN_glMemoryBarrierEXT) (GLbitfield barriers); + return ((PFN_glMemoryBarrierEXT)__blue_glCore_glMemoryBarrierEXT)(barriers); +} + +extern void* __blue_glCore_glStencilClearTagEXT; +void APIENTRY bluegl_glStencilClearTagEXT (GLsizei stencilTagBits, GLuint stencilClearTag) { + typedef void (APIENTRYP PFN_glStencilClearTagEXT) (GLsizei stencilTagBits, GLuint stencilClearTag); + return ((PFN_glStencilClearTagEXT)__blue_glCore_glStencilClearTagEXT)(stencilTagBits, stencilClearTag); +} + +extern void* __blue_glCore_glActiveStencilFaceEXT; +void APIENTRY bluegl_glActiveStencilFaceEXT (GLenum face) { + typedef void (APIENTRYP PFN_glActiveStencilFaceEXT) (GLenum face); + return ((PFN_glActiveStencilFaceEXT)__blue_glCore_glActiveStencilFaceEXT)(face); +} + +extern void* __blue_glCore_glTexSubImage1DEXT; +void APIENTRY bluegl_glTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels) { + typedef void (APIENTRYP PFN_glTexSubImage1DEXT) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTexSubImage1DEXT)__blue_glCore_glTexSubImage1DEXT)(target, level, xoffset, width, format, type, pixels); +} + +extern void* __blue_glCore_glTexSubImage2DEXT; +void APIENTRY bluegl_glTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) { + typedef void (APIENTRYP PFN_glTexSubImage2DEXT) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTexSubImage2DEXT)__blue_glCore_glTexSubImage2DEXT)(target, level, xoffset, yoffset, width, height, format, type, pixels); +} + +extern void* __blue_glCore_glTexImage3DEXT; +void APIENTRY bluegl_glTexImage3DEXT (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels) { + typedef void (APIENTRYP PFN_glTexImage3DEXT) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTexImage3DEXT)__blue_glCore_glTexImage3DEXT)(target, level, internalformat, width, height, depth, border, format, type, pixels); +} + +extern void* __blue_glCore_glTexSubImage3DEXT; +void APIENTRY bluegl_glTexSubImage3DEXT (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 PFN_glTexSubImage3DEXT) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTexSubImage3DEXT)__blue_glCore_glTexSubImage3DEXT)(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); +} + +extern void* __blue_glCore_glFramebufferTextureLayerEXT; +void APIENTRY bluegl_glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) { + typedef void (APIENTRYP PFN_glFramebufferTextureLayerEXT) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); + return ((PFN_glFramebufferTextureLayerEXT)__blue_glCore_glFramebufferTextureLayerEXT)(target, attachment, texture, level, layer); +} + +extern void* __blue_glCore_glTexBufferEXT; +void APIENTRY bluegl_glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer) { + typedef void (APIENTRYP PFN_glTexBufferEXT) (GLenum target, GLenum internalformat, GLuint buffer); + return ((PFN_glTexBufferEXT)__blue_glCore_glTexBufferEXT)(target, internalformat, buffer); +} + +extern void* __blue_glCore_glTexParameterIivEXT; +void APIENTRY bluegl_glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glTexParameterIivEXT) (GLenum target, GLenum pname, const GLint *params); + return ((PFN_glTexParameterIivEXT)__blue_glCore_glTexParameterIivEXT)(target, pname, params); +} + +extern void* __blue_glCore_glTexParameterIuivEXT; +void APIENTRY bluegl_glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params) { + typedef void (APIENTRYP PFN_glTexParameterIuivEXT) (GLenum target, GLenum pname, const GLuint *params); + return ((PFN_glTexParameterIuivEXT)__blue_glCore_glTexParameterIuivEXT)(target, pname, params); +} + +extern void* __blue_glCore_glGetTexParameterIivEXT; +void APIENTRY bluegl_glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetTexParameterIivEXT) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetTexParameterIivEXT)__blue_glCore_glGetTexParameterIivEXT)(target, pname, params); +} + +extern void* __blue_glCore_glGetTexParameterIuivEXT; +void APIENTRY bluegl_glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params) { + typedef void (APIENTRYP PFN_glGetTexParameterIuivEXT) (GLenum target, GLenum pname, GLuint *params); + return ((PFN_glGetTexParameterIuivEXT)__blue_glCore_glGetTexParameterIuivEXT)(target, pname, params); +} + +extern void* __blue_glCore_glClearColorIiEXT; +void APIENTRY bluegl_glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha) { + typedef void (APIENTRYP PFN_glClearColorIiEXT) (GLint red, GLint green, GLint blue, GLint alpha); + return ((PFN_glClearColorIiEXT)__blue_glCore_glClearColorIiEXT)(red, green, blue, alpha); +} + +extern void* __blue_glCore_glClearColorIuiEXT; +void APIENTRY bluegl_glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha) { + typedef void (APIENTRYP PFN_glClearColorIuiEXT) (GLuint red, GLuint green, GLuint blue, GLuint alpha); + return ((PFN_glClearColorIuiEXT)__blue_glCore_glClearColorIuiEXT)(red, green, blue, alpha); +} + +extern void* __blue_glCore_glAreTexturesResidentEXT; +GLboolean APIENTRY bluegl_glAreTexturesResidentEXT (GLsizei n, const GLuint *textures, GLboolean *residences) { + typedef GLboolean (APIENTRYP PFN_glAreTexturesResidentEXT) (GLsizei n, const GLuint *textures, GLboolean *residences); + return ((PFN_glAreTexturesResidentEXT)__blue_glCore_glAreTexturesResidentEXT)(n, textures, residences); +} + +extern void* __blue_glCore_glBindTextureEXT; +void APIENTRY bluegl_glBindTextureEXT (GLenum target, GLuint texture) { + typedef void (APIENTRYP PFN_glBindTextureEXT) (GLenum target, GLuint texture); + return ((PFN_glBindTextureEXT)__blue_glCore_glBindTextureEXT)(target, texture); +} + +extern void* __blue_glCore_glDeleteTexturesEXT; +void APIENTRY bluegl_glDeleteTexturesEXT (GLsizei n, const GLuint *textures) { + typedef void (APIENTRYP PFN_glDeleteTexturesEXT) (GLsizei n, const GLuint *textures); + return ((PFN_glDeleteTexturesEXT)__blue_glCore_glDeleteTexturesEXT)(n, textures); +} + +extern void* __blue_glCore_glGenTexturesEXT; +void APIENTRY bluegl_glGenTexturesEXT (GLsizei n, GLuint *textures) { + typedef void (APIENTRYP PFN_glGenTexturesEXT) (GLsizei n, GLuint *textures); + return ((PFN_glGenTexturesEXT)__blue_glCore_glGenTexturesEXT)(n, textures); +} + +extern void* __blue_glCore_glIsTextureEXT; +GLboolean APIENTRY bluegl_glIsTextureEXT (GLuint texture) { + typedef GLboolean (APIENTRYP PFN_glIsTextureEXT) (GLuint texture); + return ((PFN_glIsTextureEXT)__blue_glCore_glIsTextureEXT)(texture); +} + +extern void* __blue_glCore_glPrioritizeTexturesEXT; +void APIENTRY bluegl_glPrioritizeTexturesEXT (GLsizei n, const GLuint *textures, const GLclampf *priorities) { + typedef void (APIENTRYP PFN_glPrioritizeTexturesEXT) (GLsizei n, const GLuint *textures, const GLclampf *priorities); + return ((PFN_glPrioritizeTexturesEXT)__blue_glCore_glPrioritizeTexturesEXT)(n, textures, priorities); +} + +extern void* __blue_glCore_glTextureNormalEXT; +void APIENTRY bluegl_glTextureNormalEXT (GLenum mode) { + typedef void (APIENTRYP PFN_glTextureNormalEXT) (GLenum mode); + return ((PFN_glTextureNormalEXT)__blue_glCore_glTextureNormalEXT)(mode); +} + +extern void* __blue_glCore_glGetQueryObjecti64vEXT; +void APIENTRY bluegl_glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params) { + typedef void (APIENTRYP PFN_glGetQueryObjecti64vEXT) (GLuint id, GLenum pname, GLint64 *params); + return ((PFN_glGetQueryObjecti64vEXT)__blue_glCore_glGetQueryObjecti64vEXT)(id, pname, params); +} + +extern void* __blue_glCore_glGetQueryObjectui64vEXT; +void APIENTRY bluegl_glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params) { + typedef void (APIENTRYP PFN_glGetQueryObjectui64vEXT) (GLuint id, GLenum pname, GLuint64 *params); + return ((PFN_glGetQueryObjectui64vEXT)__blue_glCore_glGetQueryObjectui64vEXT)(id, pname, params); +} + +extern void* __blue_glCore_glBeginTransformFeedbackEXT; +void APIENTRY bluegl_glBeginTransformFeedbackEXT (GLenum primitiveMode) { + typedef void (APIENTRYP PFN_glBeginTransformFeedbackEXT) (GLenum primitiveMode); + return ((PFN_glBeginTransformFeedbackEXT)__blue_glCore_glBeginTransformFeedbackEXT)(primitiveMode); +} + +extern void* __blue_glCore_glEndTransformFeedbackEXT; +void APIENTRY bluegl_glEndTransformFeedbackEXT (void) { + typedef void (APIENTRYP PFN_glEndTransformFeedbackEXT) (void); + return ((PFN_glEndTransformFeedbackEXT)__blue_glCore_glEndTransformFeedbackEXT)(); +} + +extern void* __blue_glCore_glBindBufferRangeEXT; +void APIENTRY bluegl_glBindBufferRangeEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { + typedef void (APIENTRYP PFN_glBindBufferRangeEXT) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); + return ((PFN_glBindBufferRangeEXT)__blue_glCore_glBindBufferRangeEXT)(target, index, buffer, offset, size); +} + +extern void* __blue_glCore_glBindBufferOffsetEXT; +void APIENTRY bluegl_glBindBufferOffsetEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset) { + typedef void (APIENTRYP PFN_glBindBufferOffsetEXT) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); + return ((PFN_glBindBufferOffsetEXT)__blue_glCore_glBindBufferOffsetEXT)(target, index, buffer, offset); +} + +extern void* __blue_glCore_glBindBufferBaseEXT; +void APIENTRY bluegl_glBindBufferBaseEXT (GLenum target, GLuint index, GLuint buffer) { + typedef void (APIENTRYP PFN_glBindBufferBaseEXT) (GLenum target, GLuint index, GLuint buffer); + return ((PFN_glBindBufferBaseEXT)__blue_glCore_glBindBufferBaseEXT)(target, index, buffer); +} + +extern void* __blue_glCore_glTransformFeedbackVaryingsEXT; +void APIENTRY bluegl_glTransformFeedbackVaryingsEXT (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode) { + typedef void (APIENTRYP PFN_glTransformFeedbackVaryingsEXT) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); + return ((PFN_glTransformFeedbackVaryingsEXT)__blue_glCore_glTransformFeedbackVaryingsEXT)(program, count, varyings, bufferMode); +} + +extern void* __blue_glCore_glGetTransformFeedbackVaryingEXT; +void APIENTRY bluegl_glGetTransformFeedbackVaryingEXT (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name) { + typedef void (APIENTRYP PFN_glGetTransformFeedbackVaryingEXT) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); + return ((PFN_glGetTransformFeedbackVaryingEXT)__blue_glCore_glGetTransformFeedbackVaryingEXT)(program, index, bufSize, length, size, type, name); +} + +extern void* __blue_glCore_glArrayElementEXT; +void APIENTRY bluegl_glArrayElementEXT (GLint i) { + typedef void (APIENTRYP PFN_glArrayElementEXT) (GLint i); + return ((PFN_glArrayElementEXT)__blue_glCore_glArrayElementEXT)(i); +} + +extern void* __blue_glCore_glColorPointerEXT; +void APIENTRY bluegl_glColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer) { + typedef void (APIENTRYP PFN_glColorPointerEXT) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); + return ((PFN_glColorPointerEXT)__blue_glCore_glColorPointerEXT)(size, type, stride, count, pointer); +} + +extern void* __blue_glCore_glDrawArraysEXT; +void APIENTRY bluegl_glDrawArraysEXT (GLenum mode, GLint first, GLsizei count) { + typedef void (APIENTRYP PFN_glDrawArraysEXT) (GLenum mode, GLint first, GLsizei count); + return ((PFN_glDrawArraysEXT)__blue_glCore_glDrawArraysEXT)(mode, first, count); +} + +extern void* __blue_glCore_glEdgeFlagPointerEXT; +void APIENTRY bluegl_glEdgeFlagPointerEXT (GLsizei stride, GLsizei count, const GLboolean *pointer) { + typedef void (APIENTRYP PFN_glEdgeFlagPointerEXT) (GLsizei stride, GLsizei count, const GLboolean *pointer); + return ((PFN_glEdgeFlagPointerEXT)__blue_glCore_glEdgeFlagPointerEXT)(stride, count, pointer); +} + +extern void* __blue_glCore_glGetPointervEXT; +void APIENTRY bluegl_glGetPointervEXT (GLenum pname, void **params) { + typedef void (APIENTRYP PFN_glGetPointervEXT) (GLenum pname, void **params); + return ((PFN_glGetPointervEXT)__blue_glCore_glGetPointervEXT)(pname, params); +} + +extern void* __blue_glCore_glIndexPointerEXT; +void APIENTRY bluegl_glIndexPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer) { + typedef void (APIENTRYP PFN_glIndexPointerEXT) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); + return ((PFN_glIndexPointerEXT)__blue_glCore_glIndexPointerEXT)(type, stride, count, pointer); +} + +extern void* __blue_glCore_glNormalPointerEXT; +void APIENTRY bluegl_glNormalPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer) { + typedef void (APIENTRYP PFN_glNormalPointerEXT) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); + return ((PFN_glNormalPointerEXT)__blue_glCore_glNormalPointerEXT)(type, stride, count, pointer); +} + +extern void* __blue_glCore_glTexCoordPointerEXT; +void APIENTRY bluegl_glTexCoordPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer) { + typedef void (APIENTRYP PFN_glTexCoordPointerEXT) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); + return ((PFN_glTexCoordPointerEXT)__blue_glCore_glTexCoordPointerEXT)(size, type, stride, count, pointer); +} + +extern void* __blue_glCore_glVertexPointerEXT; +void APIENTRY bluegl_glVertexPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer) { + typedef void (APIENTRYP PFN_glVertexPointerEXT) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); + return ((PFN_glVertexPointerEXT)__blue_glCore_glVertexPointerEXT)(size, type, stride, count, pointer); +} + +extern void* __blue_glCore_glVertexAttribL1dEXT; +void APIENTRY bluegl_glVertexAttribL1dEXT (GLuint index, GLdouble x) { + typedef void (APIENTRYP PFN_glVertexAttribL1dEXT) (GLuint index, GLdouble x); + return ((PFN_glVertexAttribL1dEXT)__blue_glCore_glVertexAttribL1dEXT)(index, x); +} + +extern void* __blue_glCore_glVertexAttribL2dEXT; +void APIENTRY bluegl_glVertexAttribL2dEXT (GLuint index, GLdouble x, GLdouble y) { + typedef void (APIENTRYP PFN_glVertexAttribL2dEXT) (GLuint index, GLdouble x, GLdouble y); + return ((PFN_glVertexAttribL2dEXT)__blue_glCore_glVertexAttribL2dEXT)(index, x, y); +} + +extern void* __blue_glCore_glVertexAttribL3dEXT; +void APIENTRY bluegl_glVertexAttribL3dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z) { + typedef void (APIENTRYP PFN_glVertexAttribL3dEXT) (GLuint index, GLdouble x, GLdouble y, GLdouble z); + return ((PFN_glVertexAttribL3dEXT)__blue_glCore_glVertexAttribL3dEXT)(index, x, y, z); +} + +extern void* __blue_glCore_glVertexAttribL4dEXT; +void APIENTRY bluegl_glVertexAttribL4dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { + typedef void (APIENTRYP PFN_glVertexAttribL4dEXT) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + return ((PFN_glVertexAttribL4dEXT)__blue_glCore_glVertexAttribL4dEXT)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttribL1dvEXT; +void APIENTRY bluegl_glVertexAttribL1dvEXT (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttribL1dvEXT) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttribL1dvEXT)__blue_glCore_glVertexAttribL1dvEXT)(index, v); +} + +extern void* __blue_glCore_glVertexAttribL2dvEXT; +void APIENTRY bluegl_glVertexAttribL2dvEXT (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttribL2dvEXT) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttribL2dvEXT)__blue_glCore_glVertexAttribL2dvEXT)(index, v); +} + +extern void* __blue_glCore_glVertexAttribL3dvEXT; +void APIENTRY bluegl_glVertexAttribL3dvEXT (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttribL3dvEXT) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttribL3dvEXT)__blue_glCore_glVertexAttribL3dvEXT)(index, v); +} + +extern void* __blue_glCore_glVertexAttribL4dvEXT; +void APIENTRY bluegl_glVertexAttribL4dvEXT (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttribL4dvEXT) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttribL4dvEXT)__blue_glCore_glVertexAttribL4dvEXT)(index, v); +} + +extern void* __blue_glCore_glVertexAttribLPointerEXT; +void APIENTRY bluegl_glVertexAttribLPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer) { + typedef void (APIENTRYP PFN_glVertexAttribLPointerEXT) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); + return ((PFN_glVertexAttribLPointerEXT)__blue_glCore_glVertexAttribLPointerEXT)(index, size, type, stride, pointer); +} + +extern void* __blue_glCore_glGetVertexAttribLdvEXT; +void APIENTRY bluegl_glGetVertexAttribLdvEXT (GLuint index, GLenum pname, GLdouble *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribLdvEXT) (GLuint index, GLenum pname, GLdouble *params); + return ((PFN_glGetVertexAttribLdvEXT)__blue_glCore_glGetVertexAttribLdvEXT)(index, pname, params); +} + +extern void* __blue_glCore_glBeginVertexShaderEXT; +void APIENTRY bluegl_glBeginVertexShaderEXT (void) { + typedef void (APIENTRYP PFN_glBeginVertexShaderEXT) (void); + return ((PFN_glBeginVertexShaderEXT)__blue_glCore_glBeginVertexShaderEXT)(); +} + +extern void* __blue_glCore_glEndVertexShaderEXT; +void APIENTRY bluegl_glEndVertexShaderEXT (void) { + typedef void (APIENTRYP PFN_glEndVertexShaderEXT) (void); + return ((PFN_glEndVertexShaderEXT)__blue_glCore_glEndVertexShaderEXT)(); +} + +extern void* __blue_glCore_glBindVertexShaderEXT; +void APIENTRY bluegl_glBindVertexShaderEXT (GLuint id) { + typedef void (APIENTRYP PFN_glBindVertexShaderEXT) (GLuint id); + return ((PFN_glBindVertexShaderEXT)__blue_glCore_glBindVertexShaderEXT)(id); +} + +extern void* __blue_glCore_glGenVertexShadersEXT; +GLuint APIENTRY bluegl_glGenVertexShadersEXT (GLuint range) { + typedef GLuint (APIENTRYP PFN_glGenVertexShadersEXT) (GLuint range); + return ((PFN_glGenVertexShadersEXT)__blue_glCore_glGenVertexShadersEXT)(range); +} + +extern void* __blue_glCore_glDeleteVertexShaderEXT; +void APIENTRY bluegl_glDeleteVertexShaderEXT (GLuint id) { + typedef void (APIENTRYP PFN_glDeleteVertexShaderEXT) (GLuint id); + return ((PFN_glDeleteVertexShaderEXT)__blue_glCore_glDeleteVertexShaderEXT)(id); +} + +extern void* __blue_glCore_glShaderOp1EXT; +void APIENTRY bluegl_glShaderOp1EXT (GLenum op, GLuint res, GLuint arg1) { + typedef void (APIENTRYP PFN_glShaderOp1EXT) (GLenum op, GLuint res, GLuint arg1); + return ((PFN_glShaderOp1EXT)__blue_glCore_glShaderOp1EXT)(op, res, arg1); +} + +extern void* __blue_glCore_glShaderOp2EXT; +void APIENTRY bluegl_glShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2) { + typedef void (APIENTRYP PFN_glShaderOp2EXT) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); + return ((PFN_glShaderOp2EXT)__blue_glCore_glShaderOp2EXT)(op, res, arg1, arg2); +} + +extern void* __blue_glCore_glShaderOp3EXT; +void APIENTRY bluegl_glShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3) { + typedef void (APIENTRYP PFN_glShaderOp3EXT) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); + return ((PFN_glShaderOp3EXT)__blue_glCore_glShaderOp3EXT)(op, res, arg1, arg2, arg3); +} + +extern void* __blue_glCore_glSwizzleEXT; +void APIENTRY bluegl_glSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW) { + typedef void (APIENTRYP PFN_glSwizzleEXT) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); + return ((PFN_glSwizzleEXT)__blue_glCore_glSwizzleEXT)(res, in, outX, outY, outZ, outW); +} + +extern void* __blue_glCore_glWriteMaskEXT; +void APIENTRY bluegl_glWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW) { + typedef void (APIENTRYP PFN_glWriteMaskEXT) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); + return ((PFN_glWriteMaskEXT)__blue_glCore_glWriteMaskEXT)(res, in, outX, outY, outZ, outW); +} + +extern void* __blue_glCore_glInsertComponentEXT; +void APIENTRY bluegl_glInsertComponentEXT (GLuint res, GLuint src, GLuint num) { + typedef void (APIENTRYP PFN_glInsertComponentEXT) (GLuint res, GLuint src, GLuint num); + return ((PFN_glInsertComponentEXT)__blue_glCore_glInsertComponentEXT)(res, src, num); +} + +extern void* __blue_glCore_glExtractComponentEXT; +void APIENTRY bluegl_glExtractComponentEXT (GLuint res, GLuint src, GLuint num) { + typedef void (APIENTRYP PFN_glExtractComponentEXT) (GLuint res, GLuint src, GLuint num); + return ((PFN_glExtractComponentEXT)__blue_glCore_glExtractComponentEXT)(res, src, num); +} + +extern void* __blue_glCore_glGenSymbolsEXT; +GLuint APIENTRY bluegl_glGenSymbolsEXT (GLenum datatype, GLenum storagetype, GLenum range, GLuint components) { + typedef GLuint (APIENTRYP PFN_glGenSymbolsEXT) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); + return ((PFN_glGenSymbolsEXT)__blue_glCore_glGenSymbolsEXT)(datatype, storagetype, range, components); +} + +extern void* __blue_glCore_glSetInvariantEXT; +void APIENTRY bluegl_glSetInvariantEXT (GLuint id, GLenum type, const void *addr) { + typedef void (APIENTRYP PFN_glSetInvariantEXT) (GLuint id, GLenum type, const void *addr); + return ((PFN_glSetInvariantEXT)__blue_glCore_glSetInvariantEXT)(id, type, addr); +} + +extern void* __blue_glCore_glSetLocalConstantEXT; +void APIENTRY bluegl_glSetLocalConstantEXT (GLuint id, GLenum type, const void *addr) { + typedef void (APIENTRYP PFN_glSetLocalConstantEXT) (GLuint id, GLenum type, const void *addr); + return ((PFN_glSetLocalConstantEXT)__blue_glCore_glSetLocalConstantEXT)(id, type, addr); +} + +extern void* __blue_glCore_glVariantbvEXT; +void APIENTRY bluegl_glVariantbvEXT (GLuint id, const GLbyte *addr) { + typedef void (APIENTRYP PFN_glVariantbvEXT) (GLuint id, const GLbyte *addr); + return ((PFN_glVariantbvEXT)__blue_glCore_glVariantbvEXT)(id, addr); +} + +extern void* __blue_glCore_glVariantsvEXT; +void APIENTRY bluegl_glVariantsvEXT (GLuint id, const GLshort *addr) { + typedef void (APIENTRYP PFN_glVariantsvEXT) (GLuint id, const GLshort *addr); + return ((PFN_glVariantsvEXT)__blue_glCore_glVariantsvEXT)(id, addr); +} + +extern void* __blue_glCore_glVariantivEXT; +void APIENTRY bluegl_glVariantivEXT (GLuint id, const GLint *addr) { + typedef void (APIENTRYP PFN_glVariantivEXT) (GLuint id, const GLint *addr); + return ((PFN_glVariantivEXT)__blue_glCore_glVariantivEXT)(id, addr); +} + +extern void* __blue_glCore_glVariantfvEXT; +void APIENTRY bluegl_glVariantfvEXT (GLuint id, const GLfloat *addr) { + typedef void (APIENTRYP PFN_glVariantfvEXT) (GLuint id, const GLfloat *addr); + return ((PFN_glVariantfvEXT)__blue_glCore_glVariantfvEXT)(id, addr); +} + +extern void* __blue_glCore_glVariantdvEXT; +void APIENTRY bluegl_glVariantdvEXT (GLuint id, const GLdouble *addr) { + typedef void (APIENTRYP PFN_glVariantdvEXT) (GLuint id, const GLdouble *addr); + return ((PFN_glVariantdvEXT)__blue_glCore_glVariantdvEXT)(id, addr); +} + +extern void* __blue_glCore_glVariantubvEXT; +void APIENTRY bluegl_glVariantubvEXT (GLuint id, const GLubyte *addr) { + typedef void (APIENTRYP PFN_glVariantubvEXT) (GLuint id, const GLubyte *addr); + return ((PFN_glVariantubvEXT)__blue_glCore_glVariantubvEXT)(id, addr); +} + +extern void* __blue_glCore_glVariantusvEXT; +void APIENTRY bluegl_glVariantusvEXT (GLuint id, const GLushort *addr) { + typedef void (APIENTRYP PFN_glVariantusvEXT) (GLuint id, const GLushort *addr); + return ((PFN_glVariantusvEXT)__blue_glCore_glVariantusvEXT)(id, addr); +} + +extern void* __blue_glCore_glVariantuivEXT; +void APIENTRY bluegl_glVariantuivEXT (GLuint id, const GLuint *addr) { + typedef void (APIENTRYP PFN_glVariantuivEXT) (GLuint id, const GLuint *addr); + return ((PFN_glVariantuivEXT)__blue_glCore_glVariantuivEXT)(id, addr); +} + +extern void* __blue_glCore_glVariantPointerEXT; +void APIENTRY bluegl_glVariantPointerEXT (GLuint id, GLenum type, GLuint stride, const void *addr) { + typedef void (APIENTRYP PFN_glVariantPointerEXT) (GLuint id, GLenum type, GLuint stride, const void *addr); + return ((PFN_glVariantPointerEXT)__blue_glCore_glVariantPointerEXT)(id, type, stride, addr); +} + +extern void* __blue_glCore_glEnableVariantClientStateEXT; +void APIENTRY bluegl_glEnableVariantClientStateEXT (GLuint id) { + typedef void (APIENTRYP PFN_glEnableVariantClientStateEXT) (GLuint id); + return ((PFN_glEnableVariantClientStateEXT)__blue_glCore_glEnableVariantClientStateEXT)(id); +} + +extern void* __blue_glCore_glDisableVariantClientStateEXT; +void APIENTRY bluegl_glDisableVariantClientStateEXT (GLuint id) { + typedef void (APIENTRYP PFN_glDisableVariantClientStateEXT) (GLuint id); + return ((PFN_glDisableVariantClientStateEXT)__blue_glCore_glDisableVariantClientStateEXT)(id); +} + +extern void* __blue_glCore_glBindLightParameterEXT; +GLuint APIENTRY bluegl_glBindLightParameterEXT (GLenum light, GLenum value) { + typedef GLuint (APIENTRYP PFN_glBindLightParameterEXT) (GLenum light, GLenum value); + return ((PFN_glBindLightParameterEXT)__blue_glCore_glBindLightParameterEXT)(light, value); +} + +extern void* __blue_glCore_glBindMaterialParameterEXT; +GLuint APIENTRY bluegl_glBindMaterialParameterEXT (GLenum face, GLenum value) { + typedef GLuint (APIENTRYP PFN_glBindMaterialParameterEXT) (GLenum face, GLenum value); + return ((PFN_glBindMaterialParameterEXT)__blue_glCore_glBindMaterialParameterEXT)(face, value); +} + +extern void* __blue_glCore_glBindTexGenParameterEXT; +GLuint APIENTRY bluegl_glBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value) { + typedef GLuint (APIENTRYP PFN_glBindTexGenParameterEXT) (GLenum unit, GLenum coord, GLenum value); + return ((PFN_glBindTexGenParameterEXT)__blue_glCore_glBindTexGenParameterEXT)(unit, coord, value); +} + +extern void* __blue_glCore_glBindTextureUnitParameterEXT; +GLuint APIENTRY bluegl_glBindTextureUnitParameterEXT (GLenum unit, GLenum value) { + typedef GLuint (APIENTRYP PFN_glBindTextureUnitParameterEXT) (GLenum unit, GLenum value); + return ((PFN_glBindTextureUnitParameterEXT)__blue_glCore_glBindTextureUnitParameterEXT)(unit, value); +} + +extern void* __blue_glCore_glBindParameterEXT; +GLuint APIENTRY bluegl_glBindParameterEXT (GLenum value) { + typedef GLuint (APIENTRYP PFN_glBindParameterEXT) (GLenum value); + return ((PFN_glBindParameterEXT)__blue_glCore_glBindParameterEXT)(value); +} + +extern void* __blue_glCore_glIsVariantEnabledEXT; +GLboolean APIENTRY bluegl_glIsVariantEnabledEXT (GLuint id, GLenum cap) { + typedef GLboolean (APIENTRYP PFN_glIsVariantEnabledEXT) (GLuint id, GLenum cap); + return ((PFN_glIsVariantEnabledEXT)__blue_glCore_glIsVariantEnabledEXT)(id, cap); +} + +extern void* __blue_glCore_glGetVariantBooleanvEXT; +void APIENTRY bluegl_glGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data) { + typedef void (APIENTRYP PFN_glGetVariantBooleanvEXT) (GLuint id, GLenum value, GLboolean *data); + return ((PFN_glGetVariantBooleanvEXT)__blue_glCore_glGetVariantBooleanvEXT)(id, value, data); +} + +extern void* __blue_glCore_glGetVariantIntegervEXT; +void APIENTRY bluegl_glGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data) { + typedef void (APIENTRYP PFN_glGetVariantIntegervEXT) (GLuint id, GLenum value, GLint *data); + return ((PFN_glGetVariantIntegervEXT)__blue_glCore_glGetVariantIntegervEXT)(id, value, data); +} + +extern void* __blue_glCore_glGetVariantFloatvEXT; +void APIENTRY bluegl_glGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data) { + typedef void (APIENTRYP PFN_glGetVariantFloatvEXT) (GLuint id, GLenum value, GLfloat *data); + return ((PFN_glGetVariantFloatvEXT)__blue_glCore_glGetVariantFloatvEXT)(id, value, data); +} + +extern void* __blue_glCore_glGetVariantPointervEXT; +void APIENTRY bluegl_glGetVariantPointervEXT (GLuint id, GLenum value, void **data) { + typedef void (APIENTRYP PFN_glGetVariantPointervEXT) (GLuint id, GLenum value, void **data); + return ((PFN_glGetVariantPointervEXT)__blue_glCore_glGetVariantPointervEXT)(id, value, data); +} + +extern void* __blue_glCore_glGetInvariantBooleanvEXT; +void APIENTRY bluegl_glGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data) { + typedef void (APIENTRYP PFN_glGetInvariantBooleanvEXT) (GLuint id, GLenum value, GLboolean *data); + return ((PFN_glGetInvariantBooleanvEXT)__blue_glCore_glGetInvariantBooleanvEXT)(id, value, data); +} + +extern void* __blue_glCore_glGetInvariantIntegervEXT; +void APIENTRY bluegl_glGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data) { + typedef void (APIENTRYP PFN_glGetInvariantIntegervEXT) (GLuint id, GLenum value, GLint *data); + return ((PFN_glGetInvariantIntegervEXT)__blue_glCore_glGetInvariantIntegervEXT)(id, value, data); +} + +extern void* __blue_glCore_glGetInvariantFloatvEXT; +void APIENTRY bluegl_glGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data) { + typedef void (APIENTRYP PFN_glGetInvariantFloatvEXT) (GLuint id, GLenum value, GLfloat *data); + return ((PFN_glGetInvariantFloatvEXT)__blue_glCore_glGetInvariantFloatvEXT)(id, value, data); +} + +extern void* __blue_glCore_glGetLocalConstantBooleanvEXT; +void APIENTRY bluegl_glGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data) { + typedef void (APIENTRYP PFN_glGetLocalConstantBooleanvEXT) (GLuint id, GLenum value, GLboolean *data); + return ((PFN_glGetLocalConstantBooleanvEXT)__blue_glCore_glGetLocalConstantBooleanvEXT)(id, value, data); +} + +extern void* __blue_glCore_glGetLocalConstantIntegervEXT; +void APIENTRY bluegl_glGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data) { + typedef void (APIENTRYP PFN_glGetLocalConstantIntegervEXT) (GLuint id, GLenum value, GLint *data); + return ((PFN_glGetLocalConstantIntegervEXT)__blue_glCore_glGetLocalConstantIntegervEXT)(id, value, data); +} + +extern void* __blue_glCore_glGetLocalConstantFloatvEXT; +void APIENTRY bluegl_glGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data) { + typedef void (APIENTRYP PFN_glGetLocalConstantFloatvEXT) (GLuint id, GLenum value, GLfloat *data); + return ((PFN_glGetLocalConstantFloatvEXT)__blue_glCore_glGetLocalConstantFloatvEXT)(id, value, data); +} + +extern void* __blue_glCore_glVertexWeightfEXT; +void APIENTRY bluegl_glVertexWeightfEXT (GLfloat weight) { + typedef void (APIENTRYP PFN_glVertexWeightfEXT) (GLfloat weight); + return ((PFN_glVertexWeightfEXT)__blue_glCore_glVertexWeightfEXT)(weight); +} + +extern void* __blue_glCore_glVertexWeightfvEXT; +void APIENTRY bluegl_glVertexWeightfvEXT (const GLfloat *weight) { + typedef void (APIENTRYP PFN_glVertexWeightfvEXT) (const GLfloat *weight); + return ((PFN_glVertexWeightfvEXT)__blue_glCore_glVertexWeightfvEXT)(weight); +} + +extern void* __blue_glCore_glVertexWeightPointerEXT; +void APIENTRY bluegl_glVertexWeightPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer) { + typedef void (APIENTRYP PFN_glVertexWeightPointerEXT) (GLint size, GLenum type, GLsizei stride, const void *pointer); + return ((PFN_glVertexWeightPointerEXT)__blue_glCore_glVertexWeightPointerEXT)(size, type, stride, pointer); +} + +extern void* __blue_glCore_glImportSyncEXT; +GLsync APIENTRY bluegl_glImportSyncEXT (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags) { + typedef GLsync (APIENTRYP PFN_glImportSyncEXT) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); + return ((PFN_glImportSyncEXT)__blue_glCore_glImportSyncEXT)(external_sync_type, external_sync, flags); +} + +extern void* __blue_glCore_glFrameTerminatorGREMEDY; +void APIENTRY bluegl_glFrameTerminatorGREMEDY (void) { + typedef void (APIENTRYP PFN_glFrameTerminatorGREMEDY) (void); + return ((PFN_glFrameTerminatorGREMEDY)__blue_glCore_glFrameTerminatorGREMEDY)(); +} + +extern void* __blue_glCore_glStringMarkerGREMEDY; +void APIENTRY bluegl_glStringMarkerGREMEDY (GLsizei len, const void *string) { + typedef void (APIENTRYP PFN_glStringMarkerGREMEDY) (GLsizei len, const void *string); + return ((PFN_glStringMarkerGREMEDY)__blue_glCore_glStringMarkerGREMEDY)(len, string); +} + +extern void* __blue_glCore_glImageTransformParameteriHP; +void APIENTRY bluegl_glImageTransformParameteriHP (GLenum target, GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glImageTransformParameteriHP) (GLenum target, GLenum pname, GLint param); + return ((PFN_glImageTransformParameteriHP)__blue_glCore_glImageTransformParameteriHP)(target, pname, param); +} + +extern void* __blue_glCore_glImageTransformParameterfHP; +void APIENTRY bluegl_glImageTransformParameterfHP (GLenum target, GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glImageTransformParameterfHP) (GLenum target, GLenum pname, GLfloat param); + return ((PFN_glImageTransformParameterfHP)__blue_glCore_glImageTransformParameterfHP)(target, pname, param); +} + +extern void* __blue_glCore_glImageTransformParameterivHP; +void APIENTRY bluegl_glImageTransformParameterivHP (GLenum target, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glImageTransformParameterivHP) (GLenum target, GLenum pname, const GLint *params); + return ((PFN_glImageTransformParameterivHP)__blue_glCore_glImageTransformParameterivHP)(target, pname, params); +} + +extern void* __blue_glCore_glImageTransformParameterfvHP; +void APIENTRY bluegl_glImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glImageTransformParameterfvHP) (GLenum target, GLenum pname, const GLfloat *params); + return ((PFN_glImageTransformParameterfvHP)__blue_glCore_glImageTransformParameterfvHP)(target, pname, params); +} + +extern void* __blue_glCore_glGetImageTransformParameterivHP; +void APIENTRY bluegl_glGetImageTransformParameterivHP (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetImageTransformParameterivHP) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetImageTransformParameterivHP)__blue_glCore_glGetImageTransformParameterivHP)(target, pname, params); +} + +extern void* __blue_glCore_glGetImageTransformParameterfvHP; +void APIENTRY bluegl_glGetImageTransformParameterfvHP (GLenum target, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetImageTransformParameterfvHP) (GLenum target, GLenum pname, GLfloat *params); + return ((PFN_glGetImageTransformParameterfvHP)__blue_glCore_glGetImageTransformParameterfvHP)(target, pname, params); +} + +extern void* __blue_glCore_glMultiModeDrawArraysIBM; +void APIENTRY bluegl_glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride) { + typedef void (APIENTRYP PFN_glMultiModeDrawArraysIBM) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); + return ((PFN_glMultiModeDrawArraysIBM)__blue_glCore_glMultiModeDrawArraysIBM)(mode, first, count, primcount, modestride); +} + +extern void* __blue_glCore_glMultiModeDrawElementsIBM; +void APIENTRY bluegl_glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride) { + typedef void (APIENTRYP PFN_glMultiModeDrawElementsIBM) (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride); + return ((PFN_glMultiModeDrawElementsIBM)__blue_glCore_glMultiModeDrawElementsIBM)(mode, count, type, indices, primcount, modestride); +} + +extern void* __blue_glCore_glFlushStaticDataIBM; +void APIENTRY bluegl_glFlushStaticDataIBM (GLenum target) { + typedef void (APIENTRYP PFN_glFlushStaticDataIBM) (GLenum target); + return ((PFN_glFlushStaticDataIBM)__blue_glCore_glFlushStaticDataIBM)(target); +} + +extern void* __blue_glCore_glColorPointerListIBM; +void APIENTRY bluegl_glColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride) { + typedef void (APIENTRYP PFN_glColorPointerListIBM) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); + return ((PFN_glColorPointerListIBM)__blue_glCore_glColorPointerListIBM)(size, type, stride, pointer, ptrstride); +} + +extern void* __blue_glCore_glSecondaryColorPointerListIBM; +void APIENTRY bluegl_glSecondaryColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride) { + typedef void (APIENTRYP PFN_glSecondaryColorPointerListIBM) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); + return ((PFN_glSecondaryColorPointerListIBM)__blue_glCore_glSecondaryColorPointerListIBM)(size, type, stride, pointer, ptrstride); +} + +extern void* __blue_glCore_glEdgeFlagPointerListIBM; +void APIENTRY bluegl_glEdgeFlagPointerListIBM (GLint stride, const GLboolean **pointer, GLint ptrstride) { + typedef void (APIENTRYP PFN_glEdgeFlagPointerListIBM) (GLint stride, const GLboolean **pointer, GLint ptrstride); + return ((PFN_glEdgeFlagPointerListIBM)__blue_glCore_glEdgeFlagPointerListIBM)(stride, pointer, ptrstride); +} + +extern void* __blue_glCore_glFogCoordPointerListIBM; +void APIENTRY bluegl_glFogCoordPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride) { + typedef void (APIENTRYP PFN_glFogCoordPointerListIBM) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); + return ((PFN_glFogCoordPointerListIBM)__blue_glCore_glFogCoordPointerListIBM)(type, stride, pointer, ptrstride); +} + +extern void* __blue_glCore_glIndexPointerListIBM; +void APIENTRY bluegl_glIndexPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride) { + typedef void (APIENTRYP PFN_glIndexPointerListIBM) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); + return ((PFN_glIndexPointerListIBM)__blue_glCore_glIndexPointerListIBM)(type, stride, pointer, ptrstride); +} + +extern void* __blue_glCore_glNormalPointerListIBM; +void APIENTRY bluegl_glNormalPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride) { + typedef void (APIENTRYP PFN_glNormalPointerListIBM) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); + return ((PFN_glNormalPointerListIBM)__blue_glCore_glNormalPointerListIBM)(type, stride, pointer, ptrstride); +} + +extern void* __blue_glCore_glTexCoordPointerListIBM; +void APIENTRY bluegl_glTexCoordPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride) { + typedef void (APIENTRYP PFN_glTexCoordPointerListIBM) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); + return ((PFN_glTexCoordPointerListIBM)__blue_glCore_glTexCoordPointerListIBM)(size, type, stride, pointer, ptrstride); +} + +extern void* __blue_glCore_glVertexPointerListIBM; +void APIENTRY bluegl_glVertexPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride) { + typedef void (APIENTRYP PFN_glVertexPointerListIBM) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); + return ((PFN_glVertexPointerListIBM)__blue_glCore_glVertexPointerListIBM)(size, type, stride, pointer, ptrstride); +} + +extern void* __blue_glCore_glBlendFuncSeparateINGR; +void APIENTRY bluegl_glBlendFuncSeparateINGR (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) { + typedef void (APIENTRYP PFN_glBlendFuncSeparateINGR) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + return ((PFN_glBlendFuncSeparateINGR)__blue_glCore_glBlendFuncSeparateINGR)(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); +} + +extern void* __blue_glCore_glApplyFramebufferAttachmentCMAAINTEL; +void APIENTRY bluegl_glApplyFramebufferAttachmentCMAAINTEL (void) { + typedef void (APIENTRYP PFN_glApplyFramebufferAttachmentCMAAINTEL) (void); + return ((PFN_glApplyFramebufferAttachmentCMAAINTEL)__blue_glCore_glApplyFramebufferAttachmentCMAAINTEL)(); +} + +extern void* __blue_glCore_glSyncTextureINTEL; +void APIENTRY bluegl_glSyncTextureINTEL (GLuint texture) { + typedef void (APIENTRYP PFN_glSyncTextureINTEL) (GLuint texture); + return ((PFN_glSyncTextureINTEL)__blue_glCore_glSyncTextureINTEL)(texture); +} + +extern void* __blue_glCore_glUnmapTexture2DINTEL; +void APIENTRY bluegl_glUnmapTexture2DINTEL (GLuint texture, GLint level) { + typedef void (APIENTRYP PFN_glUnmapTexture2DINTEL) (GLuint texture, GLint level); + return ((PFN_glUnmapTexture2DINTEL)__blue_glCore_glUnmapTexture2DINTEL)(texture, level); +} + +extern void* __blue_glCore_glMapTexture2DINTEL; +void *APIENTRY bluegl_glMapTexture2DINTEL (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout) { + typedef void *(APIENTRYP PFN_glMapTexture2DINTEL) (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout); + return ((PFN_glMapTexture2DINTEL)__blue_glCore_glMapTexture2DINTEL)(texture, level, access, stride, layout); +} + +extern void* __blue_glCore_glVertexPointervINTEL; +void APIENTRY bluegl_glVertexPointervINTEL (GLint size, GLenum type, const void **pointer) { + typedef void (APIENTRYP PFN_glVertexPointervINTEL) (GLint size, GLenum type, const void **pointer); + return ((PFN_glVertexPointervINTEL)__blue_glCore_glVertexPointervINTEL)(size, type, pointer); +} + +extern void* __blue_glCore_glNormalPointervINTEL; +void APIENTRY bluegl_glNormalPointervINTEL (GLenum type, const void **pointer) { + typedef void (APIENTRYP PFN_glNormalPointervINTEL) (GLenum type, const void **pointer); + return ((PFN_glNormalPointervINTEL)__blue_glCore_glNormalPointervINTEL)(type, pointer); +} + +extern void* __blue_glCore_glColorPointervINTEL; +void APIENTRY bluegl_glColorPointervINTEL (GLint size, GLenum type, const void **pointer) { + typedef void (APIENTRYP PFN_glColorPointervINTEL) (GLint size, GLenum type, const void **pointer); + return ((PFN_glColorPointervINTEL)__blue_glCore_glColorPointervINTEL)(size, type, pointer); +} + +extern void* __blue_glCore_glTexCoordPointervINTEL; +void APIENTRY bluegl_glTexCoordPointervINTEL (GLint size, GLenum type, const void **pointer) { + typedef void (APIENTRYP PFN_glTexCoordPointervINTEL) (GLint size, GLenum type, const void **pointer); + return ((PFN_glTexCoordPointervINTEL)__blue_glCore_glTexCoordPointervINTEL)(size, type, pointer); +} + +extern void* __blue_glCore_glBeginPerfQueryINTEL; +void APIENTRY bluegl_glBeginPerfQueryINTEL (GLuint queryHandle) { + typedef void (APIENTRYP PFN_glBeginPerfQueryINTEL) (GLuint queryHandle); + return ((PFN_glBeginPerfQueryINTEL)__blue_glCore_glBeginPerfQueryINTEL)(queryHandle); +} + +extern void* __blue_glCore_glCreatePerfQueryINTEL; +void APIENTRY bluegl_glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle) { + typedef void (APIENTRYP PFN_glCreatePerfQueryINTEL) (GLuint queryId, GLuint *queryHandle); + return ((PFN_glCreatePerfQueryINTEL)__blue_glCore_glCreatePerfQueryINTEL)(queryId, queryHandle); +} + +extern void* __blue_glCore_glDeletePerfQueryINTEL; +void APIENTRY bluegl_glDeletePerfQueryINTEL (GLuint queryHandle) { + typedef void (APIENTRYP PFN_glDeletePerfQueryINTEL) (GLuint queryHandle); + return ((PFN_glDeletePerfQueryINTEL)__blue_glCore_glDeletePerfQueryINTEL)(queryHandle); +} + +extern void* __blue_glCore_glEndPerfQueryINTEL; +void APIENTRY bluegl_glEndPerfQueryINTEL (GLuint queryHandle) { + typedef void (APIENTRYP PFN_glEndPerfQueryINTEL) (GLuint queryHandle); + return ((PFN_glEndPerfQueryINTEL)__blue_glCore_glEndPerfQueryINTEL)(queryHandle); +} + +extern void* __blue_glCore_glGetFirstPerfQueryIdINTEL; +void APIENTRY bluegl_glGetFirstPerfQueryIdINTEL (GLuint *queryId) { + typedef void (APIENTRYP PFN_glGetFirstPerfQueryIdINTEL) (GLuint *queryId); + return ((PFN_glGetFirstPerfQueryIdINTEL)__blue_glCore_glGetFirstPerfQueryIdINTEL)(queryId); +} + +extern void* __blue_glCore_glGetNextPerfQueryIdINTEL; +void APIENTRY bluegl_glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId) { + typedef void (APIENTRYP PFN_glGetNextPerfQueryIdINTEL) (GLuint queryId, GLuint *nextQueryId); + return ((PFN_glGetNextPerfQueryIdINTEL)__blue_glCore_glGetNextPerfQueryIdINTEL)(queryId, nextQueryId); +} + +extern void* __blue_glCore_glGetPerfCounterInfoINTEL; +void APIENTRY bluegl_glGetPerfCounterInfoINTEL (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 PFN_glGetPerfCounterInfoINTEL) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); + return ((PFN_glGetPerfCounterInfoINTEL)__blue_glCore_glGetPerfCounterInfoINTEL)(queryId, counterId, counterNameLength, counterName, counterDescLength, counterDesc, counterOffset, counterDataSize, counterTypeEnum, counterDataTypeEnum, rawCounterMaxValue); +} + +extern void* __blue_glCore_glGetPerfQueryDataINTEL; +void APIENTRY bluegl_glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten) { + typedef void (APIENTRYP PFN_glGetPerfQueryDataINTEL) (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); + return ((PFN_glGetPerfQueryDataINTEL)__blue_glCore_glGetPerfQueryDataINTEL)(queryHandle, flags, dataSize, data, bytesWritten); +} + +extern void* __blue_glCore_glGetPerfQueryIdByNameINTEL; +void APIENTRY bluegl_glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId) { + typedef void (APIENTRYP PFN_glGetPerfQueryIdByNameINTEL) (GLchar *queryName, GLuint *queryId); + return ((PFN_glGetPerfQueryIdByNameINTEL)__blue_glCore_glGetPerfQueryIdByNameINTEL)(queryName, queryId); +} + +extern void* __blue_glCore_glGetPerfQueryInfoINTEL; +void APIENTRY bluegl_glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask) { + typedef void (APIENTRYP PFN_glGetPerfQueryInfoINTEL) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); + return ((PFN_glGetPerfQueryInfoINTEL)__blue_glCore_glGetPerfQueryInfoINTEL)(queryId, queryNameLength, queryName, dataSize, noCounters, noInstances, capsMask); +} + +extern void* __blue_glCore_glResizeBuffersMESA; +void APIENTRY bluegl_glResizeBuffersMESA (void) { + typedef void (APIENTRYP PFN_glResizeBuffersMESA) (void); + return ((PFN_glResizeBuffersMESA)__blue_glCore_glResizeBuffersMESA)(); +} + +extern void* __blue_glCore_glWindowPos2dMESA; +void APIENTRY bluegl_glWindowPos2dMESA (GLdouble x, GLdouble y) { + typedef void (APIENTRYP PFN_glWindowPos2dMESA) (GLdouble x, GLdouble y); + return ((PFN_glWindowPos2dMESA)__blue_glCore_glWindowPos2dMESA)(x, y); +} + +extern void* __blue_glCore_glWindowPos2dvMESA; +void APIENTRY bluegl_glWindowPos2dvMESA (const GLdouble *v) { + typedef void (APIENTRYP PFN_glWindowPos2dvMESA) (const GLdouble *v); + return ((PFN_glWindowPos2dvMESA)__blue_glCore_glWindowPos2dvMESA)(v); +} + +extern void* __blue_glCore_glWindowPos2fMESA; +void APIENTRY bluegl_glWindowPos2fMESA (GLfloat x, GLfloat y) { + typedef void (APIENTRYP PFN_glWindowPos2fMESA) (GLfloat x, GLfloat y); + return ((PFN_glWindowPos2fMESA)__blue_glCore_glWindowPos2fMESA)(x, y); +} + +extern void* __blue_glCore_glWindowPos2fvMESA; +void APIENTRY bluegl_glWindowPos2fvMESA (const GLfloat *v) { + typedef void (APIENTRYP PFN_glWindowPos2fvMESA) (const GLfloat *v); + return ((PFN_glWindowPos2fvMESA)__blue_glCore_glWindowPos2fvMESA)(v); +} + +extern void* __blue_glCore_glWindowPos2iMESA; +void APIENTRY bluegl_glWindowPos2iMESA (GLint x, GLint y) { + typedef void (APIENTRYP PFN_glWindowPos2iMESA) (GLint x, GLint y); + return ((PFN_glWindowPos2iMESA)__blue_glCore_glWindowPos2iMESA)(x, y); +} + +extern void* __blue_glCore_glWindowPos2ivMESA; +void APIENTRY bluegl_glWindowPos2ivMESA (const GLint *v) { + typedef void (APIENTRYP PFN_glWindowPos2ivMESA) (const GLint *v); + return ((PFN_glWindowPos2ivMESA)__blue_glCore_glWindowPos2ivMESA)(v); +} + +extern void* __blue_glCore_glWindowPos2sMESA; +void APIENTRY bluegl_glWindowPos2sMESA (GLshort x, GLshort y) { + typedef void (APIENTRYP PFN_glWindowPos2sMESA) (GLshort x, GLshort y); + return ((PFN_glWindowPos2sMESA)__blue_glCore_glWindowPos2sMESA)(x, y); +} + +extern void* __blue_glCore_glWindowPos2svMESA; +void APIENTRY bluegl_glWindowPos2svMESA (const GLshort *v) { + typedef void (APIENTRYP PFN_glWindowPos2svMESA) (const GLshort *v); + return ((PFN_glWindowPos2svMESA)__blue_glCore_glWindowPos2svMESA)(v); +} + +extern void* __blue_glCore_glWindowPos3dMESA; +void APIENTRY bluegl_glWindowPos3dMESA (GLdouble x, GLdouble y, GLdouble z) { + typedef void (APIENTRYP PFN_glWindowPos3dMESA) (GLdouble x, GLdouble y, GLdouble z); + return ((PFN_glWindowPos3dMESA)__blue_glCore_glWindowPos3dMESA)(x, y, z); +} + +extern void* __blue_glCore_glWindowPos3dvMESA; +void APIENTRY bluegl_glWindowPos3dvMESA (const GLdouble *v) { + typedef void (APIENTRYP PFN_glWindowPos3dvMESA) (const GLdouble *v); + return ((PFN_glWindowPos3dvMESA)__blue_glCore_glWindowPos3dvMESA)(v); +} + +extern void* __blue_glCore_glWindowPos3fMESA; +void APIENTRY bluegl_glWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glWindowPos3fMESA) (GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glWindowPos3fMESA)__blue_glCore_glWindowPos3fMESA)(x, y, z); +} + +extern void* __blue_glCore_glWindowPos3fvMESA; +void APIENTRY bluegl_glWindowPos3fvMESA (const GLfloat *v) { + typedef void (APIENTRYP PFN_glWindowPos3fvMESA) (const GLfloat *v); + return ((PFN_glWindowPos3fvMESA)__blue_glCore_glWindowPos3fvMESA)(v); +} + +extern void* __blue_glCore_glWindowPos3iMESA; +void APIENTRY bluegl_glWindowPos3iMESA (GLint x, GLint y, GLint z) { + typedef void (APIENTRYP PFN_glWindowPos3iMESA) (GLint x, GLint y, GLint z); + return ((PFN_glWindowPos3iMESA)__blue_glCore_glWindowPos3iMESA)(x, y, z); +} + +extern void* __blue_glCore_glWindowPos3ivMESA; +void APIENTRY bluegl_glWindowPos3ivMESA (const GLint *v) { + typedef void (APIENTRYP PFN_glWindowPos3ivMESA) (const GLint *v); + return ((PFN_glWindowPos3ivMESA)__blue_glCore_glWindowPos3ivMESA)(v); +} + +extern void* __blue_glCore_glWindowPos3sMESA; +void APIENTRY bluegl_glWindowPos3sMESA (GLshort x, GLshort y, GLshort z) { + typedef void (APIENTRYP PFN_glWindowPos3sMESA) (GLshort x, GLshort y, GLshort z); + return ((PFN_glWindowPos3sMESA)__blue_glCore_glWindowPos3sMESA)(x, y, z); +} + +extern void* __blue_glCore_glWindowPos3svMESA; +void APIENTRY bluegl_glWindowPos3svMESA (const GLshort *v) { + typedef void (APIENTRYP PFN_glWindowPos3svMESA) (const GLshort *v); + return ((PFN_glWindowPos3svMESA)__blue_glCore_glWindowPos3svMESA)(v); +} + +extern void* __blue_glCore_glWindowPos4dMESA; +void APIENTRY bluegl_glWindowPos4dMESA (GLdouble x, GLdouble y, GLdouble z, GLdouble w) { + typedef void (APIENTRYP PFN_glWindowPos4dMESA) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); + return ((PFN_glWindowPos4dMESA)__blue_glCore_glWindowPos4dMESA)(x, y, z, w); +} + +extern void* __blue_glCore_glWindowPos4dvMESA; +void APIENTRY bluegl_glWindowPos4dvMESA (const GLdouble *v) { + typedef void (APIENTRYP PFN_glWindowPos4dvMESA) (const GLdouble *v); + return ((PFN_glWindowPos4dvMESA)__blue_glCore_glWindowPos4dvMESA)(v); +} + +extern void* __blue_glCore_glWindowPos4fMESA; +void APIENTRY bluegl_glWindowPos4fMESA (GLfloat x, GLfloat y, GLfloat z, GLfloat w) { + typedef void (APIENTRYP PFN_glWindowPos4fMESA) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); + return ((PFN_glWindowPos4fMESA)__blue_glCore_glWindowPos4fMESA)(x, y, z, w); +} + +extern void* __blue_glCore_glWindowPos4fvMESA; +void APIENTRY bluegl_glWindowPos4fvMESA (const GLfloat *v) { + typedef void (APIENTRYP PFN_glWindowPos4fvMESA) (const GLfloat *v); + return ((PFN_glWindowPos4fvMESA)__blue_glCore_glWindowPos4fvMESA)(v); +} + +extern void* __blue_glCore_glWindowPos4iMESA; +void APIENTRY bluegl_glWindowPos4iMESA (GLint x, GLint y, GLint z, GLint w) { + typedef void (APIENTRYP PFN_glWindowPos4iMESA) (GLint x, GLint y, GLint z, GLint w); + return ((PFN_glWindowPos4iMESA)__blue_glCore_glWindowPos4iMESA)(x, y, z, w); +} + +extern void* __blue_glCore_glWindowPos4ivMESA; +void APIENTRY bluegl_glWindowPos4ivMESA (const GLint *v) { + typedef void (APIENTRYP PFN_glWindowPos4ivMESA) (const GLint *v); + return ((PFN_glWindowPos4ivMESA)__blue_glCore_glWindowPos4ivMESA)(v); +} + +extern void* __blue_glCore_glWindowPos4sMESA; +void APIENTRY bluegl_glWindowPos4sMESA (GLshort x, GLshort y, GLshort z, GLshort w) { + typedef void (APIENTRYP PFN_glWindowPos4sMESA) (GLshort x, GLshort y, GLshort z, GLshort w); + return ((PFN_glWindowPos4sMESA)__blue_glCore_glWindowPos4sMESA)(x, y, z, w); +} + +extern void* __blue_glCore_glWindowPos4svMESA; +void APIENTRY bluegl_glWindowPos4svMESA (const GLshort *v) { + typedef void (APIENTRYP PFN_glWindowPos4svMESA) (const GLshort *v); + return ((PFN_glWindowPos4svMESA)__blue_glCore_glWindowPos4svMESA)(v); +} + +extern void* __blue_glCore_glBeginConditionalRenderNVX; +void APIENTRY bluegl_glBeginConditionalRenderNVX (GLuint id) { + typedef void (APIENTRYP PFN_glBeginConditionalRenderNVX) (GLuint id); + return ((PFN_glBeginConditionalRenderNVX)__blue_glCore_glBeginConditionalRenderNVX)(id); +} + +extern void* __blue_glCore_glEndConditionalRenderNVX; +void APIENTRY bluegl_glEndConditionalRenderNVX (void) { + typedef void (APIENTRYP PFN_glEndConditionalRenderNVX) (void); + return ((PFN_glEndConditionalRenderNVX)__blue_glCore_glEndConditionalRenderNVX)(); +} + +extern void* __blue_glCore_glMultiDrawArraysIndirectBindlessNV; +void APIENTRY bluegl_glMultiDrawArraysIndirectBindlessNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount) { + typedef void (APIENTRYP PFN_glMultiDrawArraysIndirectBindlessNV) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); + return ((PFN_glMultiDrawArraysIndirectBindlessNV)__blue_glCore_glMultiDrawArraysIndirectBindlessNV)(mode, indirect, drawCount, stride, vertexBufferCount); +} + +extern void* __blue_glCore_glMultiDrawElementsIndirectBindlessNV; +void APIENTRY bluegl_glMultiDrawElementsIndirectBindlessNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount) { + typedef void (APIENTRYP PFN_glMultiDrawElementsIndirectBindlessNV) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); + return ((PFN_glMultiDrawElementsIndirectBindlessNV)__blue_glCore_glMultiDrawElementsIndirectBindlessNV)(mode, type, indirect, drawCount, stride, vertexBufferCount); +} + +extern void* __blue_glCore_glMultiDrawArraysIndirectBindlessCountNV; +void APIENTRY bluegl_glMultiDrawArraysIndirectBindlessCountNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount) { + typedef void (APIENTRYP PFN_glMultiDrawArraysIndirectBindlessCountNV) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); + return ((PFN_glMultiDrawArraysIndirectBindlessCountNV)__blue_glCore_glMultiDrawArraysIndirectBindlessCountNV)(mode, indirect, drawCount, maxDrawCount, stride, vertexBufferCount); +} + +extern void* __blue_glCore_glMultiDrawElementsIndirectBindlessCountNV; +void APIENTRY bluegl_glMultiDrawElementsIndirectBindlessCountNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount) { + typedef void (APIENTRYP PFN_glMultiDrawElementsIndirectBindlessCountNV) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); + return ((PFN_glMultiDrawElementsIndirectBindlessCountNV)__blue_glCore_glMultiDrawElementsIndirectBindlessCountNV)(mode, type, indirect, drawCount, maxDrawCount, stride, vertexBufferCount); +} + +extern void* __blue_glCore_glGetTextureHandleNV; +GLuint64 APIENTRY bluegl_glGetTextureHandleNV (GLuint texture) { + typedef GLuint64 (APIENTRYP PFN_glGetTextureHandleNV) (GLuint texture); + return ((PFN_glGetTextureHandleNV)__blue_glCore_glGetTextureHandleNV)(texture); +} + +extern void* __blue_glCore_glGetTextureSamplerHandleNV; +GLuint64 APIENTRY bluegl_glGetTextureSamplerHandleNV (GLuint texture, GLuint sampler) { + typedef GLuint64 (APIENTRYP PFN_glGetTextureSamplerHandleNV) (GLuint texture, GLuint sampler); + return ((PFN_glGetTextureSamplerHandleNV)__blue_glCore_glGetTextureSamplerHandleNV)(texture, sampler); +} + +extern void* __blue_glCore_glMakeTextureHandleResidentNV; +void APIENTRY bluegl_glMakeTextureHandleResidentNV (GLuint64 handle) { + typedef void (APIENTRYP PFN_glMakeTextureHandleResidentNV) (GLuint64 handle); + return ((PFN_glMakeTextureHandleResidentNV)__blue_glCore_glMakeTextureHandleResidentNV)(handle); +} + +extern void* __blue_glCore_glMakeTextureHandleNonResidentNV; +void APIENTRY bluegl_glMakeTextureHandleNonResidentNV (GLuint64 handle) { + typedef void (APIENTRYP PFN_glMakeTextureHandleNonResidentNV) (GLuint64 handle); + return ((PFN_glMakeTextureHandleNonResidentNV)__blue_glCore_glMakeTextureHandleNonResidentNV)(handle); +} + +extern void* __blue_glCore_glGetImageHandleNV; +GLuint64 APIENTRY bluegl_glGetImageHandleNV (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format) { + typedef GLuint64 (APIENTRYP PFN_glGetImageHandleNV) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); + return ((PFN_glGetImageHandleNV)__blue_glCore_glGetImageHandleNV)(texture, level, layered, layer, format); +} + +extern void* __blue_glCore_glMakeImageHandleResidentNV; +void APIENTRY bluegl_glMakeImageHandleResidentNV (GLuint64 handle, GLenum access) { + typedef void (APIENTRYP PFN_glMakeImageHandleResidentNV) (GLuint64 handle, GLenum access); + return ((PFN_glMakeImageHandleResidentNV)__blue_glCore_glMakeImageHandleResidentNV)(handle, access); +} + +extern void* __blue_glCore_glMakeImageHandleNonResidentNV; +void APIENTRY bluegl_glMakeImageHandleNonResidentNV (GLuint64 handle) { + typedef void (APIENTRYP PFN_glMakeImageHandleNonResidentNV) (GLuint64 handle); + return ((PFN_glMakeImageHandleNonResidentNV)__blue_glCore_glMakeImageHandleNonResidentNV)(handle); +} + +extern void* __blue_glCore_glUniformHandleui64NV; +void APIENTRY bluegl_glUniformHandleui64NV (GLint location, GLuint64 value) { + typedef void (APIENTRYP PFN_glUniformHandleui64NV) (GLint location, GLuint64 value); + return ((PFN_glUniformHandleui64NV)__blue_glCore_glUniformHandleui64NV)(location, value); +} + +extern void* __blue_glCore_glUniformHandleui64vNV; +void APIENTRY bluegl_glUniformHandleui64vNV (GLint location, GLsizei count, const GLuint64 *value) { + typedef void (APIENTRYP PFN_glUniformHandleui64vNV) (GLint location, GLsizei count, const GLuint64 *value); + return ((PFN_glUniformHandleui64vNV)__blue_glCore_glUniformHandleui64vNV)(location, count, value); +} + +extern void* __blue_glCore_glProgramUniformHandleui64NV; +void APIENTRY bluegl_glProgramUniformHandleui64NV (GLuint program, GLint location, GLuint64 value) { + typedef void (APIENTRYP PFN_glProgramUniformHandleui64NV) (GLuint program, GLint location, GLuint64 value); + return ((PFN_glProgramUniformHandleui64NV)__blue_glCore_glProgramUniformHandleui64NV)(program, location, value); +} + +extern void* __blue_glCore_glProgramUniformHandleui64vNV; +void APIENTRY bluegl_glProgramUniformHandleui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64 *values) { + typedef void (APIENTRYP PFN_glProgramUniformHandleui64vNV) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); + return ((PFN_glProgramUniformHandleui64vNV)__blue_glCore_glProgramUniformHandleui64vNV)(program, location, count, values); +} + +extern void* __blue_glCore_glIsTextureHandleResidentNV; +GLboolean APIENTRY bluegl_glIsTextureHandleResidentNV (GLuint64 handle) { + typedef GLboolean (APIENTRYP PFN_glIsTextureHandleResidentNV) (GLuint64 handle); + return ((PFN_glIsTextureHandleResidentNV)__blue_glCore_glIsTextureHandleResidentNV)(handle); +} + +extern void* __blue_glCore_glIsImageHandleResidentNV; +GLboolean APIENTRY bluegl_glIsImageHandleResidentNV (GLuint64 handle) { + typedef GLboolean (APIENTRYP PFN_glIsImageHandleResidentNV) (GLuint64 handle); + return ((PFN_glIsImageHandleResidentNV)__blue_glCore_glIsImageHandleResidentNV)(handle); +} + +extern void* __blue_glCore_glBlendParameteriNV; +void APIENTRY bluegl_glBlendParameteriNV (GLenum pname, GLint value) { + typedef void (APIENTRYP PFN_glBlendParameteriNV) (GLenum pname, GLint value); + return ((PFN_glBlendParameteriNV)__blue_glCore_glBlendParameteriNV)(pname, value); +} + +extern void* __blue_glCore_glBlendBarrierNV; +void APIENTRY bluegl_glBlendBarrierNV (void) { + typedef void (APIENTRYP PFN_glBlendBarrierNV) (void); + return ((PFN_glBlendBarrierNV)__blue_glCore_glBlendBarrierNV)(); +} + +extern void* __blue_glCore_glCreateStatesNV; +void APIENTRY bluegl_glCreateStatesNV (GLsizei n, GLuint *states) { + typedef void (APIENTRYP PFN_glCreateStatesNV) (GLsizei n, GLuint *states); + return ((PFN_glCreateStatesNV)__blue_glCore_glCreateStatesNV)(n, states); +} + +extern void* __blue_glCore_glDeleteStatesNV; +void APIENTRY bluegl_glDeleteStatesNV (GLsizei n, const GLuint *states) { + typedef void (APIENTRYP PFN_glDeleteStatesNV) (GLsizei n, const GLuint *states); + return ((PFN_glDeleteStatesNV)__blue_glCore_glDeleteStatesNV)(n, states); +} + +extern void* __blue_glCore_glIsStateNV; +GLboolean APIENTRY bluegl_glIsStateNV (GLuint state) { + typedef GLboolean (APIENTRYP PFN_glIsStateNV) (GLuint state); + return ((PFN_glIsStateNV)__blue_glCore_glIsStateNV)(state); +} + +extern void* __blue_glCore_glStateCaptureNV; +void APIENTRY bluegl_glStateCaptureNV (GLuint state, GLenum mode) { + typedef void (APIENTRYP PFN_glStateCaptureNV) (GLuint state, GLenum mode); + return ((PFN_glStateCaptureNV)__blue_glCore_glStateCaptureNV)(state, mode); +} + +extern void* __blue_glCore_glGetCommandHeaderNV; +GLuint APIENTRY bluegl_glGetCommandHeaderNV (GLenum tokenID, GLuint size) { + typedef GLuint (APIENTRYP PFN_glGetCommandHeaderNV) (GLenum tokenID, GLuint size); + return ((PFN_glGetCommandHeaderNV)__blue_glCore_glGetCommandHeaderNV)(tokenID, size); +} + +extern void* __blue_glCore_glGetStageIndexNV; +GLushort APIENTRY bluegl_glGetStageIndexNV (GLenum shadertype) { + typedef GLushort (APIENTRYP PFN_glGetStageIndexNV) (GLenum shadertype); + return ((PFN_glGetStageIndexNV)__blue_glCore_glGetStageIndexNV)(shadertype); +} + +extern void* __blue_glCore_glDrawCommandsNV; +void APIENTRY bluegl_glDrawCommandsNV (GLenum primitiveMode, GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, GLuint count) { + typedef void (APIENTRYP PFN_glDrawCommandsNV) (GLenum primitiveMode, GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, GLuint count); + return ((PFN_glDrawCommandsNV)__blue_glCore_glDrawCommandsNV)(primitiveMode, buffer, indirects, sizes, count); +} + +extern void* __blue_glCore_glDrawCommandsAddressNV; +void APIENTRY bluegl_glDrawCommandsAddressNV (GLenum primitiveMode, const GLuint64 *indirects, const GLsizei *sizes, GLuint count) { + typedef void (APIENTRYP PFN_glDrawCommandsAddressNV) (GLenum primitiveMode, const GLuint64 *indirects, const GLsizei *sizes, GLuint count); + return ((PFN_glDrawCommandsAddressNV)__blue_glCore_glDrawCommandsAddressNV)(primitiveMode, indirects, sizes, count); +} + +extern void* __blue_glCore_glDrawCommandsStatesNV; +void APIENTRY bluegl_glDrawCommandsStatesNV (GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count) { + typedef void (APIENTRYP PFN_glDrawCommandsStatesNV) (GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); + return ((PFN_glDrawCommandsStatesNV)__blue_glCore_glDrawCommandsStatesNV)(buffer, indirects, sizes, states, fbos, count); +} + +extern void* __blue_glCore_glDrawCommandsStatesAddressNV; +void APIENTRY bluegl_glDrawCommandsStatesAddressNV (const GLuint64 *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count) { + typedef void (APIENTRYP PFN_glDrawCommandsStatesAddressNV) (const GLuint64 *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); + return ((PFN_glDrawCommandsStatesAddressNV)__blue_glCore_glDrawCommandsStatesAddressNV)(indirects, sizes, states, fbos, count); +} + +extern void* __blue_glCore_glCreateCommandListsNV; +void APIENTRY bluegl_glCreateCommandListsNV (GLsizei n, GLuint *lists) { + typedef void (APIENTRYP PFN_glCreateCommandListsNV) (GLsizei n, GLuint *lists); + return ((PFN_glCreateCommandListsNV)__blue_glCore_glCreateCommandListsNV)(n, lists); +} + +extern void* __blue_glCore_glDeleteCommandListsNV; +void APIENTRY bluegl_glDeleteCommandListsNV (GLsizei n, const GLuint *lists) { + typedef void (APIENTRYP PFN_glDeleteCommandListsNV) (GLsizei n, const GLuint *lists); + return ((PFN_glDeleteCommandListsNV)__blue_glCore_glDeleteCommandListsNV)(n, lists); +} + +extern void* __blue_glCore_glIsCommandListNV; +GLboolean APIENTRY bluegl_glIsCommandListNV (GLuint list) { + typedef GLboolean (APIENTRYP PFN_glIsCommandListNV) (GLuint list); + return ((PFN_glIsCommandListNV)__blue_glCore_glIsCommandListNV)(list); +} + +extern void* __blue_glCore_glListDrawCommandsStatesClientNV; +void APIENTRY bluegl_glListDrawCommandsStatesClientNV (GLuint list, GLuint segment, const void **indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count) { + typedef void (APIENTRYP PFN_glListDrawCommandsStatesClientNV) (GLuint list, GLuint segment, const void **indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); + return ((PFN_glListDrawCommandsStatesClientNV)__blue_glCore_glListDrawCommandsStatesClientNV)(list, segment, indirects, sizes, states, fbos, count); +} + +extern void* __blue_glCore_glCommandListSegmentsNV; +void APIENTRY bluegl_glCommandListSegmentsNV (GLuint list, GLuint segments) { + typedef void (APIENTRYP PFN_glCommandListSegmentsNV) (GLuint list, GLuint segments); + return ((PFN_glCommandListSegmentsNV)__blue_glCore_glCommandListSegmentsNV)(list, segments); +} + +extern void* __blue_glCore_glCompileCommandListNV; +void APIENTRY bluegl_glCompileCommandListNV (GLuint list) { + typedef void (APIENTRYP PFN_glCompileCommandListNV) (GLuint list); + return ((PFN_glCompileCommandListNV)__blue_glCore_glCompileCommandListNV)(list); +} + +extern void* __blue_glCore_glCallCommandListNV; +void APIENTRY bluegl_glCallCommandListNV (GLuint list) { + typedef void (APIENTRYP PFN_glCallCommandListNV) (GLuint list); + return ((PFN_glCallCommandListNV)__blue_glCore_glCallCommandListNV)(list); +} + +extern void* __blue_glCore_glBeginConditionalRenderNV; +void APIENTRY bluegl_glBeginConditionalRenderNV (GLuint id, GLenum mode) { + typedef void (APIENTRYP PFN_glBeginConditionalRenderNV) (GLuint id, GLenum mode); + return ((PFN_glBeginConditionalRenderNV)__blue_glCore_glBeginConditionalRenderNV)(id, mode); +} + +extern void* __blue_glCore_glEndConditionalRenderNV; +void APIENTRY bluegl_glEndConditionalRenderNV (void) { + typedef void (APIENTRYP PFN_glEndConditionalRenderNV) (void); + return ((PFN_glEndConditionalRenderNV)__blue_glCore_glEndConditionalRenderNV)(); +} + +extern void* __blue_glCore_glSubpixelPrecisionBiasNV; +void APIENTRY bluegl_glSubpixelPrecisionBiasNV (GLuint xbits, GLuint ybits) { + typedef void (APIENTRYP PFN_glSubpixelPrecisionBiasNV) (GLuint xbits, GLuint ybits); + return ((PFN_glSubpixelPrecisionBiasNV)__blue_glCore_glSubpixelPrecisionBiasNV)(xbits, ybits); +} + +extern void* __blue_glCore_glConservativeRasterParameterfNV; +void APIENTRY bluegl_glConservativeRasterParameterfNV (GLenum pname, GLfloat value) { + typedef void (APIENTRYP PFN_glConservativeRasterParameterfNV) (GLenum pname, GLfloat value); + return ((PFN_glConservativeRasterParameterfNV)__blue_glCore_glConservativeRasterParameterfNV)(pname, value); +} + +extern void* __blue_glCore_glCopyImageSubDataNV; +void APIENTRY bluegl_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) { + typedef void (APIENTRYP PFN_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); + return ((PFN_glCopyImageSubDataNV)__blue_glCore_glCopyImageSubDataNV)(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, width, height, depth); +} + +extern void* __blue_glCore_glDepthRangedNV; +void APIENTRY bluegl_glDepthRangedNV (GLdouble zNear, GLdouble zFar) { + typedef void (APIENTRYP PFN_glDepthRangedNV) (GLdouble zNear, GLdouble zFar); + return ((PFN_glDepthRangedNV)__blue_glCore_glDepthRangedNV)(zNear, zFar); +} + +extern void* __blue_glCore_glClearDepthdNV; +void APIENTRY bluegl_glClearDepthdNV (GLdouble depth) { + typedef void (APIENTRYP PFN_glClearDepthdNV) (GLdouble depth); + return ((PFN_glClearDepthdNV)__blue_glCore_glClearDepthdNV)(depth); +} + +extern void* __blue_glCore_glDepthBoundsdNV; +void APIENTRY bluegl_glDepthBoundsdNV (GLdouble zmin, GLdouble zmax) { + typedef void (APIENTRYP PFN_glDepthBoundsdNV) (GLdouble zmin, GLdouble zmax); + return ((PFN_glDepthBoundsdNV)__blue_glCore_glDepthBoundsdNV)(zmin, zmax); +} + +extern void* __blue_glCore_glDrawTextureNV; +void APIENTRY bluegl_glDrawTextureNV (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1) { + typedef void (APIENTRYP PFN_glDrawTextureNV) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); + return ((PFN_glDrawTextureNV)__blue_glCore_glDrawTextureNV)(texture, sampler, x0, y0, x1, y1, z, s0, t0, s1, t1); +} + +extern void* __blue_glCore_glMapControlPointsNV; +void APIENTRY bluegl_glMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points) { + typedef void (APIENTRYP PFN_glMapControlPointsNV) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); + return ((PFN_glMapControlPointsNV)__blue_glCore_glMapControlPointsNV)(target, index, type, ustride, vstride, uorder, vorder, packed, points); +} + +extern void* __blue_glCore_glMapParameterivNV; +void APIENTRY bluegl_glMapParameterivNV (GLenum target, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glMapParameterivNV) (GLenum target, GLenum pname, const GLint *params); + return ((PFN_glMapParameterivNV)__blue_glCore_glMapParameterivNV)(target, pname, params); +} + +extern void* __blue_glCore_glMapParameterfvNV; +void APIENTRY bluegl_glMapParameterfvNV (GLenum target, GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glMapParameterfvNV) (GLenum target, GLenum pname, const GLfloat *params); + return ((PFN_glMapParameterfvNV)__blue_glCore_glMapParameterfvNV)(target, pname, params); +} + +extern void* __blue_glCore_glGetMapControlPointsNV; +void APIENTRY bluegl_glGetMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points) { + typedef void (APIENTRYP PFN_glGetMapControlPointsNV) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); + return ((PFN_glGetMapControlPointsNV)__blue_glCore_glGetMapControlPointsNV)(target, index, type, ustride, vstride, packed, points); +} + +extern void* __blue_glCore_glGetMapParameterivNV; +void APIENTRY bluegl_glGetMapParameterivNV (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetMapParameterivNV) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetMapParameterivNV)__blue_glCore_glGetMapParameterivNV)(target, pname, params); +} + +extern void* __blue_glCore_glGetMapParameterfvNV; +void APIENTRY bluegl_glGetMapParameterfvNV (GLenum target, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetMapParameterfvNV) (GLenum target, GLenum pname, GLfloat *params); + return ((PFN_glGetMapParameterfvNV)__blue_glCore_glGetMapParameterfvNV)(target, pname, params); +} + +extern void* __blue_glCore_glGetMapAttribParameterivNV; +void APIENTRY bluegl_glGetMapAttribParameterivNV (GLenum target, GLuint index, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetMapAttribParameterivNV) (GLenum target, GLuint index, GLenum pname, GLint *params); + return ((PFN_glGetMapAttribParameterivNV)__blue_glCore_glGetMapAttribParameterivNV)(target, index, pname, params); +} + +extern void* __blue_glCore_glGetMapAttribParameterfvNV; +void APIENTRY bluegl_glGetMapAttribParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetMapAttribParameterfvNV) (GLenum target, GLuint index, GLenum pname, GLfloat *params); + return ((PFN_glGetMapAttribParameterfvNV)__blue_glCore_glGetMapAttribParameterfvNV)(target, index, pname, params); +} + +extern void* __blue_glCore_glEvalMapsNV; +void APIENTRY bluegl_glEvalMapsNV (GLenum target, GLenum mode) { + typedef void (APIENTRYP PFN_glEvalMapsNV) (GLenum target, GLenum mode); + return ((PFN_glEvalMapsNV)__blue_glCore_glEvalMapsNV)(target, mode); +} + +extern void* __blue_glCore_glGetMultisamplefvNV; +void APIENTRY bluegl_glGetMultisamplefvNV (GLenum pname, GLuint index, GLfloat *val) { + typedef void (APIENTRYP PFN_glGetMultisamplefvNV) (GLenum pname, GLuint index, GLfloat *val); + return ((PFN_glGetMultisamplefvNV)__blue_glCore_glGetMultisamplefvNV)(pname, index, val); +} + +extern void* __blue_glCore_glSampleMaskIndexedNV; +void APIENTRY bluegl_glSampleMaskIndexedNV (GLuint index, GLbitfield mask) { + typedef void (APIENTRYP PFN_glSampleMaskIndexedNV) (GLuint index, GLbitfield mask); + return ((PFN_glSampleMaskIndexedNV)__blue_glCore_glSampleMaskIndexedNV)(index, mask); +} + +extern void* __blue_glCore_glTexRenderbufferNV; +void APIENTRY bluegl_glTexRenderbufferNV (GLenum target, GLuint renderbuffer) { + typedef void (APIENTRYP PFN_glTexRenderbufferNV) (GLenum target, GLuint renderbuffer); + return ((PFN_glTexRenderbufferNV)__blue_glCore_glTexRenderbufferNV)(target, renderbuffer); +} + +extern void* __blue_glCore_glDeleteFencesNV; +void APIENTRY bluegl_glDeleteFencesNV (GLsizei n, const GLuint *fences) { + typedef void (APIENTRYP PFN_glDeleteFencesNV) (GLsizei n, const GLuint *fences); + return ((PFN_glDeleteFencesNV)__blue_glCore_glDeleteFencesNV)(n, fences); +} + +extern void* __blue_glCore_glGenFencesNV; +void APIENTRY bluegl_glGenFencesNV (GLsizei n, GLuint *fences) { + typedef void (APIENTRYP PFN_glGenFencesNV) (GLsizei n, GLuint *fences); + return ((PFN_glGenFencesNV)__blue_glCore_glGenFencesNV)(n, fences); +} + +extern void* __blue_glCore_glIsFenceNV; +GLboolean APIENTRY bluegl_glIsFenceNV (GLuint fence) { + typedef GLboolean (APIENTRYP PFN_glIsFenceNV) (GLuint fence); + return ((PFN_glIsFenceNV)__blue_glCore_glIsFenceNV)(fence); +} + +extern void* __blue_glCore_glTestFenceNV; +GLboolean APIENTRY bluegl_glTestFenceNV (GLuint fence) { + typedef GLboolean (APIENTRYP PFN_glTestFenceNV) (GLuint fence); + return ((PFN_glTestFenceNV)__blue_glCore_glTestFenceNV)(fence); +} + +extern void* __blue_glCore_glGetFenceivNV; +void APIENTRY bluegl_glGetFenceivNV (GLuint fence, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetFenceivNV) (GLuint fence, GLenum pname, GLint *params); + return ((PFN_glGetFenceivNV)__blue_glCore_glGetFenceivNV)(fence, pname, params); +} + +extern void* __blue_glCore_glFinishFenceNV; +void APIENTRY bluegl_glFinishFenceNV (GLuint fence) { + typedef void (APIENTRYP PFN_glFinishFenceNV) (GLuint fence); + return ((PFN_glFinishFenceNV)__blue_glCore_glFinishFenceNV)(fence); +} + +extern void* __blue_glCore_glSetFenceNV; +void APIENTRY bluegl_glSetFenceNV (GLuint fence, GLenum condition) { + typedef void (APIENTRYP PFN_glSetFenceNV) (GLuint fence, GLenum condition); + return ((PFN_glSetFenceNV)__blue_glCore_glSetFenceNV)(fence, condition); +} + +extern void* __blue_glCore_glFragmentCoverageColorNV; +void APIENTRY bluegl_glFragmentCoverageColorNV (GLuint color) { + typedef void (APIENTRYP PFN_glFragmentCoverageColorNV) (GLuint color); + return ((PFN_glFragmentCoverageColorNV)__blue_glCore_glFragmentCoverageColorNV)(color); +} + +extern void* __blue_glCore_glProgramNamedParameter4fNV; +void APIENTRY bluegl_glProgramNamedParameter4fNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { + typedef void (APIENTRYP PFN_glProgramNamedParameter4fNV) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + return ((PFN_glProgramNamedParameter4fNV)__blue_glCore_glProgramNamedParameter4fNV)(id, len, name, x, y, z, w); +} + +extern void* __blue_glCore_glProgramNamedParameter4fvNV; +void APIENTRY bluegl_glProgramNamedParameter4fvNV (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v) { + typedef void (APIENTRYP PFN_glProgramNamedParameter4fvNV) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); + return ((PFN_glProgramNamedParameter4fvNV)__blue_glCore_glProgramNamedParameter4fvNV)(id, len, name, v); +} + +extern void* __blue_glCore_glProgramNamedParameter4dNV; +void APIENTRY bluegl_glProgramNamedParameter4dNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { + typedef void (APIENTRYP PFN_glProgramNamedParameter4dNV) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + return ((PFN_glProgramNamedParameter4dNV)__blue_glCore_glProgramNamedParameter4dNV)(id, len, name, x, y, z, w); +} + +extern void* __blue_glCore_glProgramNamedParameter4dvNV; +void APIENTRY bluegl_glProgramNamedParameter4dvNV (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v) { + typedef void (APIENTRYP PFN_glProgramNamedParameter4dvNV) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); + return ((PFN_glProgramNamedParameter4dvNV)__blue_glCore_glProgramNamedParameter4dvNV)(id, len, name, v); +} + +extern void* __blue_glCore_glGetProgramNamedParameterfvNV; +void APIENTRY bluegl_glGetProgramNamedParameterfvNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetProgramNamedParameterfvNV) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); + return ((PFN_glGetProgramNamedParameterfvNV)__blue_glCore_glGetProgramNamedParameterfvNV)(id, len, name, params); +} + +extern void* __blue_glCore_glGetProgramNamedParameterdvNV; +void APIENTRY bluegl_glGetProgramNamedParameterdvNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params) { + typedef void (APIENTRYP PFN_glGetProgramNamedParameterdvNV) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); + return ((PFN_glGetProgramNamedParameterdvNV)__blue_glCore_glGetProgramNamedParameterdvNV)(id, len, name, params); +} + +extern void* __blue_glCore_glCoverageModulationTableNV; +void APIENTRY bluegl_glCoverageModulationTableNV (GLsizei n, const GLfloat *v) { + typedef void (APIENTRYP PFN_glCoverageModulationTableNV) (GLsizei n, const GLfloat *v); + return ((PFN_glCoverageModulationTableNV)__blue_glCore_glCoverageModulationTableNV)(n, v); +} + +extern void* __blue_glCore_glGetCoverageModulationTableNV; +void APIENTRY bluegl_glGetCoverageModulationTableNV (GLsizei bufsize, GLfloat *v) { + typedef void (APIENTRYP PFN_glGetCoverageModulationTableNV) (GLsizei bufsize, GLfloat *v); + return ((PFN_glGetCoverageModulationTableNV)__blue_glCore_glGetCoverageModulationTableNV)(bufsize, v); +} + +extern void* __blue_glCore_glCoverageModulationNV; +void APIENTRY bluegl_glCoverageModulationNV (GLenum components) { + typedef void (APIENTRYP PFN_glCoverageModulationNV) (GLenum components); + return ((PFN_glCoverageModulationNV)__blue_glCore_glCoverageModulationNV)(components); +} + +extern void* __blue_glCore_glRenderbufferStorageMultisampleCoverageNV; +void APIENTRY bluegl_glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height) { + typedef void (APIENTRYP PFN_glRenderbufferStorageMultisampleCoverageNV) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); + return ((PFN_glRenderbufferStorageMultisampleCoverageNV)__blue_glCore_glRenderbufferStorageMultisampleCoverageNV)(target, coverageSamples, colorSamples, internalformat, width, height); +} + +extern void* __blue_glCore_glProgramVertexLimitNV; +void APIENTRY bluegl_glProgramVertexLimitNV (GLenum target, GLint limit) { + typedef void (APIENTRYP PFN_glProgramVertexLimitNV) (GLenum target, GLint limit); + return ((PFN_glProgramVertexLimitNV)__blue_glCore_glProgramVertexLimitNV)(target, limit); +} + +extern void* __blue_glCore_glFramebufferTextureEXT; +void APIENTRY bluegl_glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level) { + typedef void (APIENTRYP PFN_glFramebufferTextureEXT) (GLenum target, GLenum attachment, GLuint texture, GLint level); + return ((PFN_glFramebufferTextureEXT)__blue_glCore_glFramebufferTextureEXT)(target, attachment, texture, level); +} + +extern void* __blue_glCore_glFramebufferTextureFaceEXT; +void APIENTRY bluegl_glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face) { + typedef void (APIENTRYP PFN_glFramebufferTextureFaceEXT) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); + return ((PFN_glFramebufferTextureFaceEXT)__blue_glCore_glFramebufferTextureFaceEXT)(target, attachment, texture, level, face); +} + +extern void* __blue_glCore_glProgramLocalParameterI4iNV; +void APIENTRY bluegl_glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w) { + typedef void (APIENTRYP PFN_glProgramLocalParameterI4iNV) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); + return ((PFN_glProgramLocalParameterI4iNV)__blue_glCore_glProgramLocalParameterI4iNV)(target, index, x, y, z, w); +} + +extern void* __blue_glCore_glProgramLocalParameterI4ivNV; +void APIENTRY bluegl_glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params) { + typedef void (APIENTRYP PFN_glProgramLocalParameterI4ivNV) (GLenum target, GLuint index, const GLint *params); + return ((PFN_glProgramLocalParameterI4ivNV)__blue_glCore_glProgramLocalParameterI4ivNV)(target, index, params); +} + +extern void* __blue_glCore_glProgramLocalParametersI4ivNV; +void APIENTRY bluegl_glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params) { + typedef void (APIENTRYP PFN_glProgramLocalParametersI4ivNV) (GLenum target, GLuint index, GLsizei count, const GLint *params); + return ((PFN_glProgramLocalParametersI4ivNV)__blue_glCore_glProgramLocalParametersI4ivNV)(target, index, count, params); +} + +extern void* __blue_glCore_glProgramLocalParameterI4uiNV; +void APIENTRY bluegl_glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) { + typedef void (APIENTRYP PFN_glProgramLocalParameterI4uiNV) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); + return ((PFN_glProgramLocalParameterI4uiNV)__blue_glCore_glProgramLocalParameterI4uiNV)(target, index, x, y, z, w); +} + +extern void* __blue_glCore_glProgramLocalParameterI4uivNV; +void APIENTRY bluegl_glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params) { + typedef void (APIENTRYP PFN_glProgramLocalParameterI4uivNV) (GLenum target, GLuint index, const GLuint *params); + return ((PFN_glProgramLocalParameterI4uivNV)__blue_glCore_glProgramLocalParameterI4uivNV)(target, index, params); +} + +extern void* __blue_glCore_glProgramLocalParametersI4uivNV; +void APIENTRY bluegl_glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params) { + typedef void (APIENTRYP PFN_glProgramLocalParametersI4uivNV) (GLenum target, GLuint index, GLsizei count, const GLuint *params); + return ((PFN_glProgramLocalParametersI4uivNV)__blue_glCore_glProgramLocalParametersI4uivNV)(target, index, count, params); +} + +extern void* __blue_glCore_glProgramEnvParameterI4iNV; +void APIENTRY bluegl_glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w) { + typedef void (APIENTRYP PFN_glProgramEnvParameterI4iNV) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); + return ((PFN_glProgramEnvParameterI4iNV)__blue_glCore_glProgramEnvParameterI4iNV)(target, index, x, y, z, w); +} + +extern void* __blue_glCore_glProgramEnvParameterI4ivNV; +void APIENTRY bluegl_glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params) { + typedef void (APIENTRYP PFN_glProgramEnvParameterI4ivNV) (GLenum target, GLuint index, const GLint *params); + return ((PFN_glProgramEnvParameterI4ivNV)__blue_glCore_glProgramEnvParameterI4ivNV)(target, index, params); +} + +extern void* __blue_glCore_glProgramEnvParametersI4ivNV; +void APIENTRY bluegl_glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params) { + typedef void (APIENTRYP PFN_glProgramEnvParametersI4ivNV) (GLenum target, GLuint index, GLsizei count, const GLint *params); + return ((PFN_glProgramEnvParametersI4ivNV)__blue_glCore_glProgramEnvParametersI4ivNV)(target, index, count, params); +} + +extern void* __blue_glCore_glProgramEnvParameterI4uiNV; +void APIENTRY bluegl_glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) { + typedef void (APIENTRYP PFN_glProgramEnvParameterI4uiNV) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); + return ((PFN_glProgramEnvParameterI4uiNV)__blue_glCore_glProgramEnvParameterI4uiNV)(target, index, x, y, z, w); +} + +extern void* __blue_glCore_glProgramEnvParameterI4uivNV; +void APIENTRY bluegl_glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params) { + typedef void (APIENTRYP PFN_glProgramEnvParameterI4uivNV) (GLenum target, GLuint index, const GLuint *params); + return ((PFN_glProgramEnvParameterI4uivNV)__blue_glCore_glProgramEnvParameterI4uivNV)(target, index, params); +} + +extern void* __blue_glCore_glProgramEnvParametersI4uivNV; +void APIENTRY bluegl_glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params) { + typedef void (APIENTRYP PFN_glProgramEnvParametersI4uivNV) (GLenum target, GLuint index, GLsizei count, const GLuint *params); + return ((PFN_glProgramEnvParametersI4uivNV)__blue_glCore_glProgramEnvParametersI4uivNV)(target, index, count, params); +} + +extern void* __blue_glCore_glGetProgramLocalParameterIivNV; +void APIENTRY bluegl_glGetProgramLocalParameterIivNV (GLenum target, GLuint index, GLint *params) { + typedef void (APIENTRYP PFN_glGetProgramLocalParameterIivNV) (GLenum target, GLuint index, GLint *params); + return ((PFN_glGetProgramLocalParameterIivNV)__blue_glCore_glGetProgramLocalParameterIivNV)(target, index, params); +} + +extern void* __blue_glCore_glGetProgramLocalParameterIuivNV; +void APIENTRY bluegl_glGetProgramLocalParameterIuivNV (GLenum target, GLuint index, GLuint *params) { + typedef void (APIENTRYP PFN_glGetProgramLocalParameterIuivNV) (GLenum target, GLuint index, GLuint *params); + return ((PFN_glGetProgramLocalParameterIuivNV)__blue_glCore_glGetProgramLocalParameterIuivNV)(target, index, params); +} + +extern void* __blue_glCore_glGetProgramEnvParameterIivNV; +void APIENTRY bluegl_glGetProgramEnvParameterIivNV (GLenum target, GLuint index, GLint *params) { + typedef void (APIENTRYP PFN_glGetProgramEnvParameterIivNV) (GLenum target, GLuint index, GLint *params); + return ((PFN_glGetProgramEnvParameterIivNV)__blue_glCore_glGetProgramEnvParameterIivNV)(target, index, params); +} + +extern void* __blue_glCore_glGetProgramEnvParameterIuivNV; +void APIENTRY bluegl_glGetProgramEnvParameterIuivNV (GLenum target, GLuint index, GLuint *params) { + typedef void (APIENTRYP PFN_glGetProgramEnvParameterIuivNV) (GLenum target, GLuint index, GLuint *params); + return ((PFN_glGetProgramEnvParameterIuivNV)__blue_glCore_glGetProgramEnvParameterIuivNV)(target, index, params); +} + +extern void* __blue_glCore_glProgramSubroutineParametersuivNV; +void APIENTRY bluegl_glProgramSubroutineParametersuivNV (GLenum target, GLsizei count, const GLuint *params) { + typedef void (APIENTRYP PFN_glProgramSubroutineParametersuivNV) (GLenum target, GLsizei count, const GLuint *params); + return ((PFN_glProgramSubroutineParametersuivNV)__blue_glCore_glProgramSubroutineParametersuivNV)(target, count, params); +} + +extern void* __blue_glCore_glGetProgramSubroutineParameteruivNV; +void APIENTRY bluegl_glGetProgramSubroutineParameteruivNV (GLenum target, GLuint index, GLuint *param) { + typedef void (APIENTRYP PFN_glGetProgramSubroutineParameteruivNV) (GLenum target, GLuint index, GLuint *param); + return ((PFN_glGetProgramSubroutineParameteruivNV)__blue_glCore_glGetProgramSubroutineParameteruivNV)(target, index, param); +} + +extern void* __blue_glCore_glVertex2hNV; +void APIENTRY bluegl_glVertex2hNV (GLhalfNV x, GLhalfNV y) { + typedef void (APIENTRYP PFN_glVertex2hNV) (GLhalfNV x, GLhalfNV y); + return ((PFN_glVertex2hNV)__blue_glCore_glVertex2hNV)(x, y); +} + +extern void* __blue_glCore_glVertex2hvNV; +void APIENTRY bluegl_glVertex2hvNV (const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glVertex2hvNV) (const GLhalfNV *v); + return ((PFN_glVertex2hvNV)__blue_glCore_glVertex2hvNV)(v); +} + +extern void* __blue_glCore_glVertex3hNV; +void APIENTRY bluegl_glVertex3hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z) { + typedef void (APIENTRYP PFN_glVertex3hNV) (GLhalfNV x, GLhalfNV y, GLhalfNV z); + return ((PFN_glVertex3hNV)__blue_glCore_glVertex3hNV)(x, y, z); +} + +extern void* __blue_glCore_glVertex3hvNV; +void APIENTRY bluegl_glVertex3hvNV (const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glVertex3hvNV) (const GLhalfNV *v); + return ((PFN_glVertex3hvNV)__blue_glCore_glVertex3hvNV)(v); +} + +extern void* __blue_glCore_glVertex4hNV; +void APIENTRY bluegl_glVertex4hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w) { + typedef void (APIENTRYP PFN_glVertex4hNV) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); + return ((PFN_glVertex4hNV)__blue_glCore_glVertex4hNV)(x, y, z, w); +} + +extern void* __blue_glCore_glVertex4hvNV; +void APIENTRY bluegl_glVertex4hvNV (const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glVertex4hvNV) (const GLhalfNV *v); + return ((PFN_glVertex4hvNV)__blue_glCore_glVertex4hvNV)(v); +} + +extern void* __blue_glCore_glNormal3hNV; +void APIENTRY bluegl_glNormal3hNV (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz) { + typedef void (APIENTRYP PFN_glNormal3hNV) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); + return ((PFN_glNormal3hNV)__blue_glCore_glNormal3hNV)(nx, ny, nz); +} + +extern void* __blue_glCore_glNormal3hvNV; +void APIENTRY bluegl_glNormal3hvNV (const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glNormal3hvNV) (const GLhalfNV *v); + return ((PFN_glNormal3hvNV)__blue_glCore_glNormal3hvNV)(v); +} + +extern void* __blue_glCore_glColor3hNV; +void APIENTRY bluegl_glColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue) { + typedef void (APIENTRYP PFN_glColor3hNV) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); + return ((PFN_glColor3hNV)__blue_glCore_glColor3hNV)(red, green, blue); +} + +extern void* __blue_glCore_glColor3hvNV; +void APIENTRY bluegl_glColor3hvNV (const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glColor3hvNV) (const GLhalfNV *v); + return ((PFN_glColor3hvNV)__blue_glCore_glColor3hvNV)(v); +} + +extern void* __blue_glCore_glColor4hNV; +void APIENTRY bluegl_glColor4hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha) { + typedef void (APIENTRYP PFN_glColor4hNV) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); + return ((PFN_glColor4hNV)__blue_glCore_glColor4hNV)(red, green, blue, alpha); +} + +extern void* __blue_glCore_glColor4hvNV; +void APIENTRY bluegl_glColor4hvNV (const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glColor4hvNV) (const GLhalfNV *v); + return ((PFN_glColor4hvNV)__blue_glCore_glColor4hvNV)(v); +} + +extern void* __blue_glCore_glTexCoord1hNV; +void APIENTRY bluegl_glTexCoord1hNV (GLhalfNV s) { + typedef void (APIENTRYP PFN_glTexCoord1hNV) (GLhalfNV s); + return ((PFN_glTexCoord1hNV)__blue_glCore_glTexCoord1hNV)(s); +} + +extern void* __blue_glCore_glTexCoord1hvNV; +void APIENTRY bluegl_glTexCoord1hvNV (const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glTexCoord1hvNV) (const GLhalfNV *v); + return ((PFN_glTexCoord1hvNV)__blue_glCore_glTexCoord1hvNV)(v); +} + +extern void* __blue_glCore_glTexCoord2hNV; +void APIENTRY bluegl_glTexCoord2hNV (GLhalfNV s, GLhalfNV t) { + typedef void (APIENTRYP PFN_glTexCoord2hNV) (GLhalfNV s, GLhalfNV t); + return ((PFN_glTexCoord2hNV)__blue_glCore_glTexCoord2hNV)(s, t); +} + +extern void* __blue_glCore_glTexCoord2hvNV; +void APIENTRY bluegl_glTexCoord2hvNV (const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glTexCoord2hvNV) (const GLhalfNV *v); + return ((PFN_glTexCoord2hvNV)__blue_glCore_glTexCoord2hvNV)(v); +} + +extern void* __blue_glCore_glTexCoord3hNV; +void APIENTRY bluegl_glTexCoord3hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r) { + typedef void (APIENTRYP PFN_glTexCoord3hNV) (GLhalfNV s, GLhalfNV t, GLhalfNV r); + return ((PFN_glTexCoord3hNV)__blue_glCore_glTexCoord3hNV)(s, t, r); +} + +extern void* __blue_glCore_glTexCoord3hvNV; +void APIENTRY bluegl_glTexCoord3hvNV (const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glTexCoord3hvNV) (const GLhalfNV *v); + return ((PFN_glTexCoord3hvNV)__blue_glCore_glTexCoord3hvNV)(v); +} + +extern void* __blue_glCore_glTexCoord4hNV; +void APIENTRY bluegl_glTexCoord4hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q) { + typedef void (APIENTRYP PFN_glTexCoord4hNV) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); + return ((PFN_glTexCoord4hNV)__blue_glCore_glTexCoord4hNV)(s, t, r, q); +} + +extern void* __blue_glCore_glTexCoord4hvNV; +void APIENTRY bluegl_glTexCoord4hvNV (const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glTexCoord4hvNV) (const GLhalfNV *v); + return ((PFN_glTexCoord4hvNV)__blue_glCore_glTexCoord4hvNV)(v); +} + +extern void* __blue_glCore_glMultiTexCoord1hNV; +void APIENTRY bluegl_glMultiTexCoord1hNV (GLenum target, GLhalfNV s) { + typedef void (APIENTRYP PFN_glMultiTexCoord1hNV) (GLenum target, GLhalfNV s); + return ((PFN_glMultiTexCoord1hNV)__blue_glCore_glMultiTexCoord1hNV)(target, s); +} + +extern void* __blue_glCore_glMultiTexCoord1hvNV; +void APIENTRY bluegl_glMultiTexCoord1hvNV (GLenum target, const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord1hvNV) (GLenum target, const GLhalfNV *v); + return ((PFN_glMultiTexCoord1hvNV)__blue_glCore_glMultiTexCoord1hvNV)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord2hNV; +void APIENTRY bluegl_glMultiTexCoord2hNV (GLenum target, GLhalfNV s, GLhalfNV t) { + typedef void (APIENTRYP PFN_glMultiTexCoord2hNV) (GLenum target, GLhalfNV s, GLhalfNV t); + return ((PFN_glMultiTexCoord2hNV)__blue_glCore_glMultiTexCoord2hNV)(target, s, t); +} + +extern void* __blue_glCore_glMultiTexCoord2hvNV; +void APIENTRY bluegl_glMultiTexCoord2hvNV (GLenum target, const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord2hvNV) (GLenum target, const GLhalfNV *v); + return ((PFN_glMultiTexCoord2hvNV)__blue_glCore_glMultiTexCoord2hvNV)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord3hNV; +void APIENTRY bluegl_glMultiTexCoord3hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r) { + typedef void (APIENTRYP PFN_glMultiTexCoord3hNV) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); + return ((PFN_glMultiTexCoord3hNV)__blue_glCore_glMultiTexCoord3hNV)(target, s, t, r); +} + +extern void* __blue_glCore_glMultiTexCoord3hvNV; +void APIENTRY bluegl_glMultiTexCoord3hvNV (GLenum target, const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord3hvNV) (GLenum target, const GLhalfNV *v); + return ((PFN_glMultiTexCoord3hvNV)__blue_glCore_glMultiTexCoord3hvNV)(target, v); +} + +extern void* __blue_glCore_glMultiTexCoord4hNV; +void APIENTRY bluegl_glMultiTexCoord4hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q) { + typedef void (APIENTRYP PFN_glMultiTexCoord4hNV) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); + return ((PFN_glMultiTexCoord4hNV)__blue_glCore_glMultiTexCoord4hNV)(target, s, t, r, q); +} + +extern void* __blue_glCore_glMultiTexCoord4hvNV; +void APIENTRY bluegl_glMultiTexCoord4hvNV (GLenum target, const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glMultiTexCoord4hvNV) (GLenum target, const GLhalfNV *v); + return ((PFN_glMultiTexCoord4hvNV)__blue_glCore_glMultiTexCoord4hvNV)(target, v); +} + +extern void* __blue_glCore_glFogCoordhNV; +void APIENTRY bluegl_glFogCoordhNV (GLhalfNV fog) { + typedef void (APIENTRYP PFN_glFogCoordhNV) (GLhalfNV fog); + return ((PFN_glFogCoordhNV)__blue_glCore_glFogCoordhNV)(fog); +} + +extern void* __blue_glCore_glFogCoordhvNV; +void APIENTRY bluegl_glFogCoordhvNV (const GLhalfNV *fog) { + typedef void (APIENTRYP PFN_glFogCoordhvNV) (const GLhalfNV *fog); + return ((PFN_glFogCoordhvNV)__blue_glCore_glFogCoordhvNV)(fog); +} + +extern void* __blue_glCore_glSecondaryColor3hNV; +void APIENTRY bluegl_glSecondaryColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue) { + typedef void (APIENTRYP PFN_glSecondaryColor3hNV) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); + return ((PFN_glSecondaryColor3hNV)__blue_glCore_glSecondaryColor3hNV)(red, green, blue); +} + +extern void* __blue_glCore_glSecondaryColor3hvNV; +void APIENTRY bluegl_glSecondaryColor3hvNV (const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glSecondaryColor3hvNV) (const GLhalfNV *v); + return ((PFN_glSecondaryColor3hvNV)__blue_glCore_glSecondaryColor3hvNV)(v); +} + +extern void* __blue_glCore_glVertexWeighthNV; +void APIENTRY bluegl_glVertexWeighthNV (GLhalfNV weight) { + typedef void (APIENTRYP PFN_glVertexWeighthNV) (GLhalfNV weight); + return ((PFN_glVertexWeighthNV)__blue_glCore_glVertexWeighthNV)(weight); +} + +extern void* __blue_glCore_glVertexWeighthvNV; +void APIENTRY bluegl_glVertexWeighthvNV (const GLhalfNV *weight) { + typedef void (APIENTRYP PFN_glVertexWeighthvNV) (const GLhalfNV *weight); + return ((PFN_glVertexWeighthvNV)__blue_glCore_glVertexWeighthvNV)(weight); +} + +extern void* __blue_glCore_glVertexAttrib1hNV; +void APIENTRY bluegl_glVertexAttrib1hNV (GLuint index, GLhalfNV x) { + typedef void (APIENTRYP PFN_glVertexAttrib1hNV) (GLuint index, GLhalfNV x); + return ((PFN_glVertexAttrib1hNV)__blue_glCore_glVertexAttrib1hNV)(index, x); +} + +extern void* __blue_glCore_glVertexAttrib1hvNV; +void APIENTRY bluegl_glVertexAttrib1hvNV (GLuint index, const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glVertexAttrib1hvNV) (GLuint index, const GLhalfNV *v); + return ((PFN_glVertexAttrib1hvNV)__blue_glCore_glVertexAttrib1hvNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib2hNV; +void APIENTRY bluegl_glVertexAttrib2hNV (GLuint index, GLhalfNV x, GLhalfNV y) { + typedef void (APIENTRYP PFN_glVertexAttrib2hNV) (GLuint index, GLhalfNV x, GLhalfNV y); + return ((PFN_glVertexAttrib2hNV)__blue_glCore_glVertexAttrib2hNV)(index, x, y); +} + +extern void* __blue_glCore_glVertexAttrib2hvNV; +void APIENTRY bluegl_glVertexAttrib2hvNV (GLuint index, const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glVertexAttrib2hvNV) (GLuint index, const GLhalfNV *v); + return ((PFN_glVertexAttrib2hvNV)__blue_glCore_glVertexAttrib2hvNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib3hNV; +void APIENTRY bluegl_glVertexAttrib3hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z) { + typedef void (APIENTRYP PFN_glVertexAttrib3hNV) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); + return ((PFN_glVertexAttrib3hNV)__blue_glCore_glVertexAttrib3hNV)(index, x, y, z); +} + +extern void* __blue_glCore_glVertexAttrib3hvNV; +void APIENTRY bluegl_glVertexAttrib3hvNV (GLuint index, const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glVertexAttrib3hvNV) (GLuint index, const GLhalfNV *v); + return ((PFN_glVertexAttrib3hvNV)__blue_glCore_glVertexAttrib3hvNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4hNV; +void APIENTRY bluegl_glVertexAttrib4hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w) { + typedef void (APIENTRYP PFN_glVertexAttrib4hNV) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); + return ((PFN_glVertexAttrib4hNV)__blue_glCore_glVertexAttrib4hNV)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttrib4hvNV; +void APIENTRY bluegl_glVertexAttrib4hvNV (GLuint index, const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4hvNV) (GLuint index, const GLhalfNV *v); + return ((PFN_glVertexAttrib4hvNV)__blue_glCore_glVertexAttrib4hvNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttribs1hvNV; +void APIENTRY bluegl_glVertexAttribs1hvNV (GLuint index, GLsizei n, const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glVertexAttribs1hvNV) (GLuint index, GLsizei n, const GLhalfNV *v); + return ((PFN_glVertexAttribs1hvNV)__blue_glCore_glVertexAttribs1hvNV)(index, n, v); +} + +extern void* __blue_glCore_glVertexAttribs2hvNV; +void APIENTRY bluegl_glVertexAttribs2hvNV (GLuint index, GLsizei n, const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glVertexAttribs2hvNV) (GLuint index, GLsizei n, const GLhalfNV *v); + return ((PFN_glVertexAttribs2hvNV)__blue_glCore_glVertexAttribs2hvNV)(index, n, v); +} + +extern void* __blue_glCore_glVertexAttribs3hvNV; +void APIENTRY bluegl_glVertexAttribs3hvNV (GLuint index, GLsizei n, const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glVertexAttribs3hvNV) (GLuint index, GLsizei n, const GLhalfNV *v); + return ((PFN_glVertexAttribs3hvNV)__blue_glCore_glVertexAttribs3hvNV)(index, n, v); +} + +extern void* __blue_glCore_glVertexAttribs4hvNV; +void APIENTRY bluegl_glVertexAttribs4hvNV (GLuint index, GLsizei n, const GLhalfNV *v) { + typedef void (APIENTRYP PFN_glVertexAttribs4hvNV) (GLuint index, GLsizei n, const GLhalfNV *v); + return ((PFN_glVertexAttribs4hvNV)__blue_glCore_glVertexAttribs4hvNV)(index, n, v); +} + +extern void* __blue_glCore_glGetInternalformatSampleivNV; +void APIENTRY bluegl_glGetInternalformatSampleivNV (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params) { + typedef void (APIENTRYP PFN_glGetInternalformatSampleivNV) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params); + return ((PFN_glGetInternalformatSampleivNV)__blue_glCore_glGetInternalformatSampleivNV)(target, internalformat, samples, pname, bufSize, params); +} + +extern void* __blue_glCore_glGenOcclusionQueriesNV; +void APIENTRY bluegl_glGenOcclusionQueriesNV (GLsizei n, GLuint *ids) { + typedef void (APIENTRYP PFN_glGenOcclusionQueriesNV) (GLsizei n, GLuint *ids); + return ((PFN_glGenOcclusionQueriesNV)__blue_glCore_glGenOcclusionQueriesNV)(n, ids); +} + +extern void* __blue_glCore_glDeleteOcclusionQueriesNV; +void APIENTRY bluegl_glDeleteOcclusionQueriesNV (GLsizei n, const GLuint *ids) { + typedef void (APIENTRYP PFN_glDeleteOcclusionQueriesNV) (GLsizei n, const GLuint *ids); + return ((PFN_glDeleteOcclusionQueriesNV)__blue_glCore_glDeleteOcclusionQueriesNV)(n, ids); +} + +extern void* __blue_glCore_glIsOcclusionQueryNV; +GLboolean APIENTRY bluegl_glIsOcclusionQueryNV (GLuint id) { + typedef GLboolean (APIENTRYP PFN_glIsOcclusionQueryNV) (GLuint id); + return ((PFN_glIsOcclusionQueryNV)__blue_glCore_glIsOcclusionQueryNV)(id); +} + +extern void* __blue_glCore_glBeginOcclusionQueryNV; +void APIENTRY bluegl_glBeginOcclusionQueryNV (GLuint id) { + typedef void (APIENTRYP PFN_glBeginOcclusionQueryNV) (GLuint id); + return ((PFN_glBeginOcclusionQueryNV)__blue_glCore_glBeginOcclusionQueryNV)(id); +} + +extern void* __blue_glCore_glEndOcclusionQueryNV; +void APIENTRY bluegl_glEndOcclusionQueryNV (void) { + typedef void (APIENTRYP PFN_glEndOcclusionQueryNV) (void); + return ((PFN_glEndOcclusionQueryNV)__blue_glCore_glEndOcclusionQueryNV)(); +} + +extern void* __blue_glCore_glGetOcclusionQueryivNV; +void APIENTRY bluegl_glGetOcclusionQueryivNV (GLuint id, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetOcclusionQueryivNV) (GLuint id, GLenum pname, GLint *params); + return ((PFN_glGetOcclusionQueryivNV)__blue_glCore_glGetOcclusionQueryivNV)(id, pname, params); +} + +extern void* __blue_glCore_glGetOcclusionQueryuivNV; +void APIENTRY bluegl_glGetOcclusionQueryuivNV (GLuint id, GLenum pname, GLuint *params) { + typedef void (APIENTRYP PFN_glGetOcclusionQueryuivNV) (GLuint id, GLenum pname, GLuint *params); + return ((PFN_glGetOcclusionQueryuivNV)__blue_glCore_glGetOcclusionQueryuivNV)(id, pname, params); +} + +extern void* __blue_glCore_glProgramBufferParametersfvNV; +void APIENTRY bluegl_glProgramBufferParametersfvNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params) { + typedef void (APIENTRYP PFN_glProgramBufferParametersfvNV) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); + return ((PFN_glProgramBufferParametersfvNV)__blue_glCore_glProgramBufferParametersfvNV)(target, bindingIndex, wordIndex, count, params); +} + +extern void* __blue_glCore_glProgramBufferParametersIivNV; +void APIENTRY bluegl_glProgramBufferParametersIivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params) { + typedef void (APIENTRYP PFN_glProgramBufferParametersIivNV) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); + return ((PFN_glProgramBufferParametersIivNV)__blue_glCore_glProgramBufferParametersIivNV)(target, bindingIndex, wordIndex, count, params); +} + +extern void* __blue_glCore_glProgramBufferParametersIuivNV; +void APIENTRY bluegl_glProgramBufferParametersIuivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params) { + typedef void (APIENTRYP PFN_glProgramBufferParametersIuivNV) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); + return ((PFN_glProgramBufferParametersIuivNV)__blue_glCore_glProgramBufferParametersIuivNV)(target, bindingIndex, wordIndex, count, params); +} + +extern void* __blue_glCore_glGenPathsNV; +GLuint APIENTRY bluegl_glGenPathsNV (GLsizei range) { + typedef GLuint (APIENTRYP PFN_glGenPathsNV) (GLsizei range); + return ((PFN_glGenPathsNV)__blue_glCore_glGenPathsNV)(range); +} + +extern void* __blue_glCore_glDeletePathsNV; +void APIENTRY bluegl_glDeletePathsNV (GLuint path, GLsizei range) { + typedef void (APIENTRYP PFN_glDeletePathsNV) (GLuint path, GLsizei range); + return ((PFN_glDeletePathsNV)__blue_glCore_glDeletePathsNV)(path, range); +} + +extern void* __blue_glCore_glIsPathNV; +GLboolean APIENTRY bluegl_glIsPathNV (GLuint path) { + typedef GLboolean (APIENTRYP PFN_glIsPathNV) (GLuint path); + return ((PFN_glIsPathNV)__blue_glCore_glIsPathNV)(path); +} + +extern void* __blue_glCore_glPathCommandsNV; +void APIENTRY bluegl_glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords) { + typedef void (APIENTRYP PFN_glPathCommandsNV) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); + return ((PFN_glPathCommandsNV)__blue_glCore_glPathCommandsNV)(path, numCommands, commands, numCoords, coordType, coords); +} + +extern void* __blue_glCore_glPathCoordsNV; +void APIENTRY bluegl_glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords) { + typedef void (APIENTRYP PFN_glPathCoordsNV) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); + return ((PFN_glPathCoordsNV)__blue_glCore_glPathCoordsNV)(path, numCoords, coordType, coords); +} + +extern void* __blue_glCore_glPathSubCommandsNV; +void APIENTRY bluegl_glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords) { + typedef void (APIENTRYP PFN_glPathSubCommandsNV) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); + return ((PFN_glPathSubCommandsNV)__blue_glCore_glPathSubCommandsNV)(path, commandStart, commandsToDelete, numCommands, commands, numCoords, coordType, coords); +} + +extern void* __blue_glCore_glPathSubCoordsNV; +void APIENTRY bluegl_glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords) { + typedef void (APIENTRYP PFN_glPathSubCoordsNV) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); + return ((PFN_glPathSubCoordsNV)__blue_glCore_glPathSubCoordsNV)(path, coordStart, numCoords, coordType, coords); +} + +extern void* __blue_glCore_glPathStringNV; +void APIENTRY bluegl_glPathStringNV (GLuint path, GLenum format, GLsizei length, const void *pathString) { + typedef void (APIENTRYP PFN_glPathStringNV) (GLuint path, GLenum format, GLsizei length, const void *pathString); + return ((PFN_glPathStringNV)__blue_glCore_glPathStringNV)(path, format, length, pathString); +} + +extern void* __blue_glCore_glPathGlyphsNV; +void APIENTRY bluegl_glPathGlyphsNV (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 PFN_glPathGlyphsNV) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); + return ((PFN_glPathGlyphsNV)__blue_glCore_glPathGlyphsNV)(firstPathName, fontTarget, fontName, fontStyle, numGlyphs, type, charcodes, handleMissingGlyphs, pathParameterTemplate, emScale); +} + +extern void* __blue_glCore_glPathGlyphRangeNV; +void APIENTRY bluegl_glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale) { + typedef void (APIENTRYP PFN_glPathGlyphRangeNV) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); + return ((PFN_glPathGlyphRangeNV)__blue_glCore_glPathGlyphRangeNV)(firstPathName, fontTarget, fontName, fontStyle, firstGlyph, numGlyphs, handleMissingGlyphs, pathParameterTemplate, emScale); +} + +extern void* __blue_glCore_glWeightPathsNV; +void APIENTRY bluegl_glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights) { + typedef void (APIENTRYP PFN_glWeightPathsNV) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); + return ((PFN_glWeightPathsNV)__blue_glCore_glWeightPathsNV)(resultPath, numPaths, paths, weights); +} + +extern void* __blue_glCore_glCopyPathNV; +void APIENTRY bluegl_glCopyPathNV (GLuint resultPath, GLuint srcPath) { + typedef void (APIENTRYP PFN_glCopyPathNV) (GLuint resultPath, GLuint srcPath); + return ((PFN_glCopyPathNV)__blue_glCore_glCopyPathNV)(resultPath, srcPath); +} + +extern void* __blue_glCore_glInterpolatePathsNV; +void APIENTRY bluegl_glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight) { + typedef void (APIENTRYP PFN_glInterpolatePathsNV) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); + return ((PFN_glInterpolatePathsNV)__blue_glCore_glInterpolatePathsNV)(resultPath, pathA, pathB, weight); +} + +extern void* __blue_glCore_glTransformPathNV; +void APIENTRY bluegl_glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues) { + typedef void (APIENTRYP PFN_glTransformPathNV) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); + return ((PFN_glTransformPathNV)__blue_glCore_glTransformPathNV)(resultPath, srcPath, transformType, transformValues); +} + +extern void* __blue_glCore_glPathParameterivNV; +void APIENTRY bluegl_glPathParameterivNV (GLuint path, GLenum pname, const GLint *value) { + typedef void (APIENTRYP PFN_glPathParameterivNV) (GLuint path, GLenum pname, const GLint *value); + return ((PFN_glPathParameterivNV)__blue_glCore_glPathParameterivNV)(path, pname, value); +} + +extern void* __blue_glCore_glPathParameteriNV; +void APIENTRY bluegl_glPathParameteriNV (GLuint path, GLenum pname, GLint value) { + typedef void (APIENTRYP PFN_glPathParameteriNV) (GLuint path, GLenum pname, GLint value); + return ((PFN_glPathParameteriNV)__blue_glCore_glPathParameteriNV)(path, pname, value); +} + +extern void* __blue_glCore_glPathParameterfvNV; +void APIENTRY bluegl_glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value) { + typedef void (APIENTRYP PFN_glPathParameterfvNV) (GLuint path, GLenum pname, const GLfloat *value); + return ((PFN_glPathParameterfvNV)__blue_glCore_glPathParameterfvNV)(path, pname, value); +} + +extern void* __blue_glCore_glPathParameterfNV; +void APIENTRY bluegl_glPathParameterfNV (GLuint path, GLenum pname, GLfloat value) { + typedef void (APIENTRYP PFN_glPathParameterfNV) (GLuint path, GLenum pname, GLfloat value); + return ((PFN_glPathParameterfNV)__blue_glCore_glPathParameterfNV)(path, pname, value); +} + +extern void* __blue_glCore_glPathDashArrayNV; +void APIENTRY bluegl_glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray) { + typedef void (APIENTRYP PFN_glPathDashArrayNV) (GLuint path, GLsizei dashCount, const GLfloat *dashArray); + return ((PFN_glPathDashArrayNV)__blue_glCore_glPathDashArrayNV)(path, dashCount, dashArray); +} + +extern void* __blue_glCore_glPathStencilFuncNV; +void APIENTRY bluegl_glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask) { + typedef void (APIENTRYP PFN_glPathStencilFuncNV) (GLenum func, GLint ref, GLuint mask); + return ((PFN_glPathStencilFuncNV)__blue_glCore_glPathStencilFuncNV)(func, ref, mask); +} + +extern void* __blue_glCore_glPathStencilDepthOffsetNV; +void APIENTRY bluegl_glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units) { + typedef void (APIENTRYP PFN_glPathStencilDepthOffsetNV) (GLfloat factor, GLfloat units); + return ((PFN_glPathStencilDepthOffsetNV)__blue_glCore_glPathStencilDepthOffsetNV)(factor, units); +} + +extern void* __blue_glCore_glStencilFillPathNV; +void APIENTRY bluegl_glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask) { + typedef void (APIENTRYP PFN_glStencilFillPathNV) (GLuint path, GLenum fillMode, GLuint mask); + return ((PFN_glStencilFillPathNV)__blue_glCore_glStencilFillPathNV)(path, fillMode, mask); +} + +extern void* __blue_glCore_glStencilStrokePathNV; +void APIENTRY bluegl_glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask) { + typedef void (APIENTRYP PFN_glStencilStrokePathNV) (GLuint path, GLint reference, GLuint mask); + return ((PFN_glStencilStrokePathNV)__blue_glCore_glStencilStrokePathNV)(path, reference, mask); +} + +extern void* __blue_glCore_glStencilFillPathInstancedNV; +void APIENTRY bluegl_glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues) { + typedef void (APIENTRYP PFN_glStencilFillPathInstancedNV) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); + return ((PFN_glStencilFillPathInstancedNV)__blue_glCore_glStencilFillPathInstancedNV)(numPaths, pathNameType, paths, pathBase, fillMode, mask, transformType, transformValues); +} + +extern void* __blue_glCore_glStencilStrokePathInstancedNV; +void APIENTRY bluegl_glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues) { + typedef void (APIENTRYP PFN_glStencilStrokePathInstancedNV) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); + return ((PFN_glStencilStrokePathInstancedNV)__blue_glCore_glStencilStrokePathInstancedNV)(numPaths, pathNameType, paths, pathBase, reference, mask, transformType, transformValues); +} + +extern void* __blue_glCore_glPathCoverDepthFuncNV; +void APIENTRY bluegl_glPathCoverDepthFuncNV (GLenum func) { + typedef void (APIENTRYP PFN_glPathCoverDepthFuncNV) (GLenum func); + return ((PFN_glPathCoverDepthFuncNV)__blue_glCore_glPathCoverDepthFuncNV)(func); +} + +extern void* __blue_glCore_glCoverFillPathNV; +void APIENTRY bluegl_glCoverFillPathNV (GLuint path, GLenum coverMode) { + typedef void (APIENTRYP PFN_glCoverFillPathNV) (GLuint path, GLenum coverMode); + return ((PFN_glCoverFillPathNV)__blue_glCore_glCoverFillPathNV)(path, coverMode); +} + +extern void* __blue_glCore_glCoverStrokePathNV; +void APIENTRY bluegl_glCoverStrokePathNV (GLuint path, GLenum coverMode) { + typedef void (APIENTRYP PFN_glCoverStrokePathNV) (GLuint path, GLenum coverMode); + return ((PFN_glCoverStrokePathNV)__blue_glCore_glCoverStrokePathNV)(path, coverMode); +} + +extern void* __blue_glCore_glCoverFillPathInstancedNV; +void APIENTRY bluegl_glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues) { + typedef void (APIENTRYP PFN_glCoverFillPathInstancedNV) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); + return ((PFN_glCoverFillPathInstancedNV)__blue_glCore_glCoverFillPathInstancedNV)(numPaths, pathNameType, paths, pathBase, coverMode, transformType, transformValues); +} + +extern void* __blue_glCore_glCoverStrokePathInstancedNV; +void APIENTRY bluegl_glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues) { + typedef void (APIENTRYP PFN_glCoverStrokePathInstancedNV) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); + return ((PFN_glCoverStrokePathInstancedNV)__blue_glCore_glCoverStrokePathInstancedNV)(numPaths, pathNameType, paths, pathBase, coverMode, transformType, transformValues); +} + +extern void* __blue_glCore_glGetPathParameterivNV; +void APIENTRY bluegl_glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value) { + typedef void (APIENTRYP PFN_glGetPathParameterivNV) (GLuint path, GLenum pname, GLint *value); + return ((PFN_glGetPathParameterivNV)__blue_glCore_glGetPathParameterivNV)(path, pname, value); +} + +extern void* __blue_glCore_glGetPathParameterfvNV; +void APIENTRY bluegl_glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value) { + typedef void (APIENTRYP PFN_glGetPathParameterfvNV) (GLuint path, GLenum pname, GLfloat *value); + return ((PFN_glGetPathParameterfvNV)__blue_glCore_glGetPathParameterfvNV)(path, pname, value); +} + +extern void* __blue_glCore_glGetPathCommandsNV; +void APIENTRY bluegl_glGetPathCommandsNV (GLuint path, GLubyte *commands) { + typedef void (APIENTRYP PFN_glGetPathCommandsNV) (GLuint path, GLubyte *commands); + return ((PFN_glGetPathCommandsNV)__blue_glCore_glGetPathCommandsNV)(path, commands); +} + +extern void* __blue_glCore_glGetPathCoordsNV; +void APIENTRY bluegl_glGetPathCoordsNV (GLuint path, GLfloat *coords) { + typedef void (APIENTRYP PFN_glGetPathCoordsNV) (GLuint path, GLfloat *coords); + return ((PFN_glGetPathCoordsNV)__blue_glCore_glGetPathCoordsNV)(path, coords); +} + +extern void* __blue_glCore_glGetPathDashArrayNV; +void APIENTRY bluegl_glGetPathDashArrayNV (GLuint path, GLfloat *dashArray) { + typedef void (APIENTRYP PFN_glGetPathDashArrayNV) (GLuint path, GLfloat *dashArray); + return ((PFN_glGetPathDashArrayNV)__blue_glCore_glGetPathDashArrayNV)(path, dashArray); +} + +extern void* __blue_glCore_glGetPathMetricsNV; +void APIENTRY bluegl_glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics) { + typedef void (APIENTRYP PFN_glGetPathMetricsNV) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); + return ((PFN_glGetPathMetricsNV)__blue_glCore_glGetPathMetricsNV)(metricQueryMask, numPaths, pathNameType, paths, pathBase, stride, metrics); +} + +extern void* __blue_glCore_glGetPathMetricRangeNV; +void APIENTRY bluegl_glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics) { + typedef void (APIENTRYP PFN_glGetPathMetricRangeNV) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); + return ((PFN_glGetPathMetricRangeNV)__blue_glCore_glGetPathMetricRangeNV)(metricQueryMask, firstPathName, numPaths, stride, metrics); +} + +extern void* __blue_glCore_glGetPathSpacingNV; +void APIENTRY bluegl_glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing) { + typedef void (APIENTRYP PFN_glGetPathSpacingNV) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); + return ((PFN_glGetPathSpacingNV)__blue_glCore_glGetPathSpacingNV)(pathListMode, numPaths, pathNameType, paths, pathBase, advanceScale, kerningScale, transformType, returnedSpacing); +} + +extern void* __blue_glCore_glIsPointInFillPathNV; +GLboolean APIENTRY bluegl_glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y) { + typedef GLboolean (APIENTRYP PFN_glIsPointInFillPathNV) (GLuint path, GLuint mask, GLfloat x, GLfloat y); + return ((PFN_glIsPointInFillPathNV)__blue_glCore_glIsPointInFillPathNV)(path, mask, x, y); +} + +extern void* __blue_glCore_glIsPointInStrokePathNV; +GLboolean APIENTRY bluegl_glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y) { + typedef GLboolean (APIENTRYP PFN_glIsPointInStrokePathNV) (GLuint path, GLfloat x, GLfloat y); + return ((PFN_glIsPointInStrokePathNV)__blue_glCore_glIsPointInStrokePathNV)(path, x, y); +} + +extern void* __blue_glCore_glGetPathLengthNV; +GLfloat APIENTRY bluegl_glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments) { + typedef GLfloat (APIENTRYP PFN_glGetPathLengthNV) (GLuint path, GLsizei startSegment, GLsizei numSegments); + return ((PFN_glGetPathLengthNV)__blue_glCore_glGetPathLengthNV)(path, startSegment, numSegments); +} + +extern void* __blue_glCore_glPointAlongPathNV; +GLboolean APIENTRY bluegl_glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY) { + typedef GLboolean (APIENTRYP PFN_glPointAlongPathNV) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); + return ((PFN_glPointAlongPathNV)__blue_glCore_glPointAlongPathNV)(path, startSegment, numSegments, distance, x, y, tangentX, tangentY); +} + +extern void* __blue_glCore_glMatrixLoad3x2fNV; +void APIENTRY bluegl_glMatrixLoad3x2fNV (GLenum matrixMode, const GLfloat *m) { + typedef void (APIENTRYP PFN_glMatrixLoad3x2fNV) (GLenum matrixMode, const GLfloat *m); + return ((PFN_glMatrixLoad3x2fNV)__blue_glCore_glMatrixLoad3x2fNV)(matrixMode, m); +} + +extern void* __blue_glCore_glMatrixLoad3x3fNV; +void APIENTRY bluegl_glMatrixLoad3x3fNV (GLenum matrixMode, const GLfloat *m) { + typedef void (APIENTRYP PFN_glMatrixLoad3x3fNV) (GLenum matrixMode, const GLfloat *m); + return ((PFN_glMatrixLoad3x3fNV)__blue_glCore_glMatrixLoad3x3fNV)(matrixMode, m); +} + +extern void* __blue_glCore_glMatrixLoadTranspose3x3fNV; +void APIENTRY bluegl_glMatrixLoadTranspose3x3fNV (GLenum matrixMode, const GLfloat *m) { + typedef void (APIENTRYP PFN_glMatrixLoadTranspose3x3fNV) (GLenum matrixMode, const GLfloat *m); + return ((PFN_glMatrixLoadTranspose3x3fNV)__blue_glCore_glMatrixLoadTranspose3x3fNV)(matrixMode, m); +} + +extern void* __blue_glCore_glMatrixMult3x2fNV; +void APIENTRY bluegl_glMatrixMult3x2fNV (GLenum matrixMode, const GLfloat *m) { + typedef void (APIENTRYP PFN_glMatrixMult3x2fNV) (GLenum matrixMode, const GLfloat *m); + return ((PFN_glMatrixMult3x2fNV)__blue_glCore_glMatrixMult3x2fNV)(matrixMode, m); +} + +extern void* __blue_glCore_glMatrixMult3x3fNV; +void APIENTRY bluegl_glMatrixMult3x3fNV (GLenum matrixMode, const GLfloat *m) { + typedef void (APIENTRYP PFN_glMatrixMult3x3fNV) (GLenum matrixMode, const GLfloat *m); + return ((PFN_glMatrixMult3x3fNV)__blue_glCore_glMatrixMult3x3fNV)(matrixMode, m); +} + +extern void* __blue_glCore_glMatrixMultTranspose3x3fNV; +void APIENTRY bluegl_glMatrixMultTranspose3x3fNV (GLenum matrixMode, const GLfloat *m) { + typedef void (APIENTRYP PFN_glMatrixMultTranspose3x3fNV) (GLenum matrixMode, const GLfloat *m); + return ((PFN_glMatrixMultTranspose3x3fNV)__blue_glCore_glMatrixMultTranspose3x3fNV)(matrixMode, m); +} + +extern void* __blue_glCore_glStencilThenCoverFillPathNV; +void APIENTRY bluegl_glStencilThenCoverFillPathNV (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode) { + typedef void (APIENTRYP PFN_glStencilThenCoverFillPathNV) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); + return ((PFN_glStencilThenCoverFillPathNV)__blue_glCore_glStencilThenCoverFillPathNV)(path, fillMode, mask, coverMode); +} + +extern void* __blue_glCore_glStencilThenCoverStrokePathNV; +void APIENTRY bluegl_glStencilThenCoverStrokePathNV (GLuint path, GLint reference, GLuint mask, GLenum coverMode) { + typedef void (APIENTRYP PFN_glStencilThenCoverStrokePathNV) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); + return ((PFN_glStencilThenCoverStrokePathNV)__blue_glCore_glStencilThenCoverStrokePathNV)(path, reference, mask, coverMode); +} + +extern void* __blue_glCore_glStencilThenCoverFillPathInstancedNV; +void APIENTRY bluegl_glStencilThenCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues) { + typedef void (APIENTRYP PFN_glStencilThenCoverFillPathInstancedNV) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); + return ((PFN_glStencilThenCoverFillPathInstancedNV)__blue_glCore_glStencilThenCoverFillPathInstancedNV)(numPaths, pathNameType, paths, pathBase, fillMode, mask, coverMode, transformType, transformValues); +} + +extern void* __blue_glCore_glStencilThenCoverStrokePathInstancedNV; +void APIENTRY bluegl_glStencilThenCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues) { + typedef void (APIENTRYP PFN_glStencilThenCoverStrokePathInstancedNV) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); + return ((PFN_glStencilThenCoverStrokePathInstancedNV)__blue_glCore_glStencilThenCoverStrokePathInstancedNV)(numPaths, pathNameType, paths, pathBase, reference, mask, coverMode, transformType, transformValues); +} + +extern void* __blue_glCore_glPathGlyphIndexRangeNV; +GLenum APIENTRY bluegl_glPathGlyphIndexRangeNV (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]) { + typedef GLenum (APIENTRYP PFN_glPathGlyphIndexRangeNV) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); + return ((PFN_glPathGlyphIndexRangeNV)__blue_glCore_glPathGlyphIndexRangeNV)(fontTarget, fontName, fontStyle, pathParameterTemplate, emScale, baseAndCount); +} + +extern void* __blue_glCore_glPathGlyphIndexArrayNV; +GLenum APIENTRY bluegl_glPathGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale) { + typedef GLenum (APIENTRYP PFN_glPathGlyphIndexArrayNV) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); + return ((PFN_glPathGlyphIndexArrayNV)__blue_glCore_glPathGlyphIndexArrayNV)(firstPathName, fontTarget, fontName, fontStyle, firstGlyphIndex, numGlyphs, pathParameterTemplate, emScale); +} + +extern void* __blue_glCore_glPathMemoryGlyphIndexArrayNV; +GLenum APIENTRY bluegl_glPathMemoryGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale) { + typedef GLenum (APIENTRYP PFN_glPathMemoryGlyphIndexArrayNV) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); + return ((PFN_glPathMemoryGlyphIndexArrayNV)__blue_glCore_glPathMemoryGlyphIndexArrayNV)(firstPathName, fontTarget, fontSize, fontData, faceIndex, firstGlyphIndex, numGlyphs, pathParameterTemplate, emScale); +} + +extern void* __blue_glCore_glProgramPathFragmentInputGenNV; +void APIENTRY bluegl_glProgramPathFragmentInputGenNV (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs) { + typedef void (APIENTRYP PFN_glProgramPathFragmentInputGenNV) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); + return ((PFN_glProgramPathFragmentInputGenNV)__blue_glCore_glProgramPathFragmentInputGenNV)(program, location, genMode, components, coeffs); +} + +extern void* __blue_glCore_glGetProgramResourcefvNV; +void APIENTRY bluegl_glGetProgramResourcefvNV (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetProgramResourcefvNV) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); + return ((PFN_glGetProgramResourcefvNV)__blue_glCore_glGetProgramResourcefvNV)(program, programInterface, index, propCount, props, bufSize, length, params); +} + +extern void* __blue_glCore_glPathColorGenNV; +void APIENTRY bluegl_glPathColorGenNV (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs) { + typedef void (APIENTRYP PFN_glPathColorGenNV) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); + return ((PFN_glPathColorGenNV)__blue_glCore_glPathColorGenNV)(color, genMode, colorFormat, coeffs); +} + +extern void* __blue_glCore_glPathTexGenNV; +void APIENTRY bluegl_glPathTexGenNV (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs) { + typedef void (APIENTRYP PFN_glPathTexGenNV) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); + return ((PFN_glPathTexGenNV)__blue_glCore_glPathTexGenNV)(texCoordSet, genMode, components, coeffs); +} + +extern void* __blue_glCore_glPathFogGenNV; +void APIENTRY bluegl_glPathFogGenNV (GLenum genMode) { + typedef void (APIENTRYP PFN_glPathFogGenNV) (GLenum genMode); + return ((PFN_glPathFogGenNV)__blue_glCore_glPathFogGenNV)(genMode); +} + +extern void* __blue_glCore_glGetPathColorGenivNV; +void APIENTRY bluegl_glGetPathColorGenivNV (GLenum color, GLenum pname, GLint *value) { + typedef void (APIENTRYP PFN_glGetPathColorGenivNV) (GLenum color, GLenum pname, GLint *value); + return ((PFN_glGetPathColorGenivNV)__blue_glCore_glGetPathColorGenivNV)(color, pname, value); +} + +extern void* __blue_glCore_glGetPathColorGenfvNV; +void APIENTRY bluegl_glGetPathColorGenfvNV (GLenum color, GLenum pname, GLfloat *value) { + typedef void (APIENTRYP PFN_glGetPathColorGenfvNV) (GLenum color, GLenum pname, GLfloat *value); + return ((PFN_glGetPathColorGenfvNV)__blue_glCore_glGetPathColorGenfvNV)(color, pname, value); +} + +extern void* __blue_glCore_glGetPathTexGenivNV; +void APIENTRY bluegl_glGetPathTexGenivNV (GLenum texCoordSet, GLenum pname, GLint *value) { + typedef void (APIENTRYP PFN_glGetPathTexGenivNV) (GLenum texCoordSet, GLenum pname, GLint *value); + return ((PFN_glGetPathTexGenivNV)__blue_glCore_glGetPathTexGenivNV)(texCoordSet, pname, value); +} + +extern void* __blue_glCore_glGetPathTexGenfvNV; +void APIENTRY bluegl_glGetPathTexGenfvNV (GLenum texCoordSet, GLenum pname, GLfloat *value) { + typedef void (APIENTRYP PFN_glGetPathTexGenfvNV) (GLenum texCoordSet, GLenum pname, GLfloat *value); + return ((PFN_glGetPathTexGenfvNV)__blue_glCore_glGetPathTexGenfvNV)(texCoordSet, pname, value); +} + +extern void* __blue_glCore_glPixelDataRangeNV; +void APIENTRY bluegl_glPixelDataRangeNV (GLenum target, GLsizei length, const void *pointer) { + typedef void (APIENTRYP PFN_glPixelDataRangeNV) (GLenum target, GLsizei length, const void *pointer); + return ((PFN_glPixelDataRangeNV)__blue_glCore_glPixelDataRangeNV)(target, length, pointer); +} + +extern void* __blue_glCore_glFlushPixelDataRangeNV; +void APIENTRY bluegl_glFlushPixelDataRangeNV (GLenum target) { + typedef void (APIENTRYP PFN_glFlushPixelDataRangeNV) (GLenum target); + return ((PFN_glFlushPixelDataRangeNV)__blue_glCore_glFlushPixelDataRangeNV)(target); +} + +extern void* __blue_glCore_glPointParameteriNV; +void APIENTRY bluegl_glPointParameteriNV (GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glPointParameteriNV) (GLenum pname, GLint param); + return ((PFN_glPointParameteriNV)__blue_glCore_glPointParameteriNV)(pname, param); +} + +extern void* __blue_glCore_glPointParameterivNV; +void APIENTRY bluegl_glPointParameterivNV (GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glPointParameterivNV) (GLenum pname, const GLint *params); + return ((PFN_glPointParameterivNV)__blue_glCore_glPointParameterivNV)(pname, params); +} + +extern void* __blue_glCore_glPresentFrameKeyedNV; +void APIENTRY bluegl_glPresentFrameKeyedNV (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 PFN_glPresentFrameKeyedNV) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); + return ((PFN_glPresentFrameKeyedNV)__blue_glCore_glPresentFrameKeyedNV)(video_slot, minPresentTime, beginPresentTimeId, presentDurationId, type, target0, fill0, key0, target1, fill1, key1); +} + +extern void* __blue_glCore_glPresentFrameDualFillNV; +void APIENTRY bluegl_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) { + typedef void (APIENTRYP PFN_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); + return ((PFN_glPresentFrameDualFillNV)__blue_glCore_glPresentFrameDualFillNV)(video_slot, minPresentTime, beginPresentTimeId, presentDurationId, type, target0, fill0, target1, fill1, target2, fill2, target3, fill3); +} + +extern void* __blue_glCore_glGetVideoivNV; +void APIENTRY bluegl_glGetVideoivNV (GLuint video_slot, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetVideoivNV) (GLuint video_slot, GLenum pname, GLint *params); + return ((PFN_glGetVideoivNV)__blue_glCore_glGetVideoivNV)(video_slot, pname, params); +} + +extern void* __blue_glCore_glGetVideouivNV; +void APIENTRY bluegl_glGetVideouivNV (GLuint video_slot, GLenum pname, GLuint *params) { + typedef void (APIENTRYP PFN_glGetVideouivNV) (GLuint video_slot, GLenum pname, GLuint *params); + return ((PFN_glGetVideouivNV)__blue_glCore_glGetVideouivNV)(video_slot, pname, params); +} + +extern void* __blue_glCore_glGetVideoi64vNV; +void APIENTRY bluegl_glGetVideoi64vNV (GLuint video_slot, GLenum pname, GLint64EXT *params) { + typedef void (APIENTRYP PFN_glGetVideoi64vNV) (GLuint video_slot, GLenum pname, GLint64EXT *params); + return ((PFN_glGetVideoi64vNV)__blue_glCore_glGetVideoi64vNV)(video_slot, pname, params); +} + +extern void* __blue_glCore_glGetVideoui64vNV; +void APIENTRY bluegl_glGetVideoui64vNV (GLuint video_slot, GLenum pname, GLuint64EXT *params) { + typedef void (APIENTRYP PFN_glGetVideoui64vNV) (GLuint video_slot, GLenum pname, GLuint64EXT *params); + return ((PFN_glGetVideoui64vNV)__blue_glCore_glGetVideoui64vNV)(video_slot, pname, params); +} + +extern void* __blue_glCore_glPrimitiveRestartNV; +void APIENTRY bluegl_glPrimitiveRestartNV (void) { + typedef void (APIENTRYP PFN_glPrimitiveRestartNV) (void); + return ((PFN_glPrimitiveRestartNV)__blue_glCore_glPrimitiveRestartNV)(); +} + +extern void* __blue_glCore_glPrimitiveRestartIndexNV; +void APIENTRY bluegl_glPrimitiveRestartIndexNV (GLuint index) { + typedef void (APIENTRYP PFN_glPrimitiveRestartIndexNV) (GLuint index); + return ((PFN_glPrimitiveRestartIndexNV)__blue_glCore_glPrimitiveRestartIndexNV)(index); +} + +extern void* __blue_glCore_glCombinerParameterfvNV; +void APIENTRY bluegl_glCombinerParameterfvNV (GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glCombinerParameterfvNV) (GLenum pname, const GLfloat *params); + return ((PFN_glCombinerParameterfvNV)__blue_glCore_glCombinerParameterfvNV)(pname, params); +} + +extern void* __blue_glCore_glCombinerParameterfNV; +void APIENTRY bluegl_glCombinerParameterfNV (GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glCombinerParameterfNV) (GLenum pname, GLfloat param); + return ((PFN_glCombinerParameterfNV)__blue_glCore_glCombinerParameterfNV)(pname, param); +} + +extern void* __blue_glCore_glCombinerParameterivNV; +void APIENTRY bluegl_glCombinerParameterivNV (GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glCombinerParameterivNV) (GLenum pname, const GLint *params); + return ((PFN_glCombinerParameterivNV)__blue_glCore_glCombinerParameterivNV)(pname, params); +} + +extern void* __blue_glCore_glCombinerParameteriNV; +void APIENTRY bluegl_glCombinerParameteriNV (GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glCombinerParameteriNV) (GLenum pname, GLint param); + return ((PFN_glCombinerParameteriNV)__blue_glCore_glCombinerParameteriNV)(pname, param); +} + +extern void* __blue_glCore_glCombinerInputNV; +void APIENTRY bluegl_glCombinerInputNV (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage) { + typedef void (APIENTRYP PFN_glCombinerInputNV) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); + return ((PFN_glCombinerInputNV)__blue_glCore_glCombinerInputNV)(stage, portion, variable, input, mapping, componentUsage); +} + +extern void* __blue_glCore_glCombinerOutputNV; +void APIENTRY bluegl_glCombinerOutputNV (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum) { + typedef void (APIENTRYP PFN_glCombinerOutputNV) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); + return ((PFN_glCombinerOutputNV)__blue_glCore_glCombinerOutputNV)(stage, portion, abOutput, cdOutput, sumOutput, scale, bias, abDotProduct, cdDotProduct, muxSum); +} + +extern void* __blue_glCore_glFinalCombinerInputNV; +void APIENTRY bluegl_glFinalCombinerInputNV (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage) { + typedef void (APIENTRYP PFN_glFinalCombinerInputNV) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); + return ((PFN_glFinalCombinerInputNV)__blue_glCore_glFinalCombinerInputNV)(variable, input, mapping, componentUsage); +} + +extern void* __blue_glCore_glGetCombinerInputParameterfvNV; +void APIENTRY bluegl_glGetCombinerInputParameterfvNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetCombinerInputParameterfvNV) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); + return ((PFN_glGetCombinerInputParameterfvNV)__blue_glCore_glGetCombinerInputParameterfvNV)(stage, portion, variable, pname, params); +} + +extern void* __blue_glCore_glGetCombinerInputParameterivNV; +void APIENTRY bluegl_glGetCombinerInputParameterivNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetCombinerInputParameterivNV) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); + return ((PFN_glGetCombinerInputParameterivNV)__blue_glCore_glGetCombinerInputParameterivNV)(stage, portion, variable, pname, params); +} + +extern void* __blue_glCore_glGetCombinerOutputParameterfvNV; +void APIENTRY bluegl_glGetCombinerOutputParameterfvNV (GLenum stage, GLenum portion, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetCombinerOutputParameterfvNV) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); + return ((PFN_glGetCombinerOutputParameterfvNV)__blue_glCore_glGetCombinerOutputParameterfvNV)(stage, portion, pname, params); +} + +extern void* __blue_glCore_glGetCombinerOutputParameterivNV; +void APIENTRY bluegl_glGetCombinerOutputParameterivNV (GLenum stage, GLenum portion, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetCombinerOutputParameterivNV) (GLenum stage, GLenum portion, GLenum pname, GLint *params); + return ((PFN_glGetCombinerOutputParameterivNV)__blue_glCore_glGetCombinerOutputParameterivNV)(stage, portion, pname, params); +} + +extern void* __blue_glCore_glGetFinalCombinerInputParameterfvNV; +void APIENTRY bluegl_glGetFinalCombinerInputParameterfvNV (GLenum variable, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetFinalCombinerInputParameterfvNV) (GLenum variable, GLenum pname, GLfloat *params); + return ((PFN_glGetFinalCombinerInputParameterfvNV)__blue_glCore_glGetFinalCombinerInputParameterfvNV)(variable, pname, params); +} + +extern void* __blue_glCore_glGetFinalCombinerInputParameterivNV; +void APIENTRY bluegl_glGetFinalCombinerInputParameterivNV (GLenum variable, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetFinalCombinerInputParameterivNV) (GLenum variable, GLenum pname, GLint *params); + return ((PFN_glGetFinalCombinerInputParameterivNV)__blue_glCore_glGetFinalCombinerInputParameterivNV)(variable, pname, params); +} + +extern void* __blue_glCore_glCombinerStageParameterfvNV; +void APIENTRY bluegl_glCombinerStageParameterfvNV (GLenum stage, GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glCombinerStageParameterfvNV) (GLenum stage, GLenum pname, const GLfloat *params); + return ((PFN_glCombinerStageParameterfvNV)__blue_glCore_glCombinerStageParameterfvNV)(stage, pname, params); +} + +extern void* __blue_glCore_glGetCombinerStageParameterfvNV; +void APIENTRY bluegl_glGetCombinerStageParameterfvNV (GLenum stage, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetCombinerStageParameterfvNV) (GLenum stage, GLenum pname, GLfloat *params); + return ((PFN_glGetCombinerStageParameterfvNV)__blue_glCore_glGetCombinerStageParameterfvNV)(stage, pname, params); +} + +extern void* __blue_glCore_glFramebufferSampleLocationsfvNV; +void APIENTRY bluegl_glFramebufferSampleLocationsfvNV (GLenum target, GLuint start, GLsizei count, const GLfloat *v) { + typedef void (APIENTRYP PFN_glFramebufferSampleLocationsfvNV) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); + return ((PFN_glFramebufferSampleLocationsfvNV)__blue_glCore_glFramebufferSampleLocationsfvNV)(target, start, count, v); +} + +extern void* __blue_glCore_glNamedFramebufferSampleLocationsfvNV; +void APIENTRY bluegl_glNamedFramebufferSampleLocationsfvNV (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v) { + typedef void (APIENTRYP PFN_glNamedFramebufferSampleLocationsfvNV) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); + return ((PFN_glNamedFramebufferSampleLocationsfvNV)__blue_glCore_glNamedFramebufferSampleLocationsfvNV)(framebuffer, start, count, v); +} + +extern void* __blue_glCore_glResolveDepthValuesNV; +void APIENTRY bluegl_glResolveDepthValuesNV (void) { + typedef void (APIENTRYP PFN_glResolveDepthValuesNV) (void); + return ((PFN_glResolveDepthValuesNV)__blue_glCore_glResolveDepthValuesNV)(); +} + +extern void* __blue_glCore_glMakeBufferResidentNV; +void APIENTRY bluegl_glMakeBufferResidentNV (GLenum target, GLenum access) { + typedef void (APIENTRYP PFN_glMakeBufferResidentNV) (GLenum target, GLenum access); + return ((PFN_glMakeBufferResidentNV)__blue_glCore_glMakeBufferResidentNV)(target, access); +} + +extern void* __blue_glCore_glMakeBufferNonResidentNV; +void APIENTRY bluegl_glMakeBufferNonResidentNV (GLenum target) { + typedef void (APIENTRYP PFN_glMakeBufferNonResidentNV) (GLenum target); + return ((PFN_glMakeBufferNonResidentNV)__blue_glCore_glMakeBufferNonResidentNV)(target); +} + +extern void* __blue_glCore_glIsBufferResidentNV; +GLboolean APIENTRY bluegl_glIsBufferResidentNV (GLenum target) { + typedef GLboolean (APIENTRYP PFN_glIsBufferResidentNV) (GLenum target); + return ((PFN_glIsBufferResidentNV)__blue_glCore_glIsBufferResidentNV)(target); +} + +extern void* __blue_glCore_glMakeNamedBufferResidentNV; +void APIENTRY bluegl_glMakeNamedBufferResidentNV (GLuint buffer, GLenum access) { + typedef void (APIENTRYP PFN_glMakeNamedBufferResidentNV) (GLuint buffer, GLenum access); + return ((PFN_glMakeNamedBufferResidentNV)__blue_glCore_glMakeNamedBufferResidentNV)(buffer, access); +} + +extern void* __blue_glCore_glMakeNamedBufferNonResidentNV; +void APIENTRY bluegl_glMakeNamedBufferNonResidentNV (GLuint buffer) { + typedef void (APIENTRYP PFN_glMakeNamedBufferNonResidentNV) (GLuint buffer); + return ((PFN_glMakeNamedBufferNonResidentNV)__blue_glCore_glMakeNamedBufferNonResidentNV)(buffer); +} + +extern void* __blue_glCore_glIsNamedBufferResidentNV; +GLboolean APIENTRY bluegl_glIsNamedBufferResidentNV (GLuint buffer) { + typedef GLboolean (APIENTRYP PFN_glIsNamedBufferResidentNV) (GLuint buffer); + return ((PFN_glIsNamedBufferResidentNV)__blue_glCore_glIsNamedBufferResidentNV)(buffer); +} + +extern void* __blue_glCore_glGetBufferParameterui64vNV; +void APIENTRY bluegl_glGetBufferParameterui64vNV (GLenum target, GLenum pname, GLuint64EXT *params) { + typedef void (APIENTRYP PFN_glGetBufferParameterui64vNV) (GLenum target, GLenum pname, GLuint64EXT *params); + return ((PFN_glGetBufferParameterui64vNV)__blue_glCore_glGetBufferParameterui64vNV)(target, pname, params); +} + +extern void* __blue_glCore_glGetNamedBufferParameterui64vNV; +void APIENTRY bluegl_glGetNamedBufferParameterui64vNV (GLuint buffer, GLenum pname, GLuint64EXT *params) { + typedef void (APIENTRYP PFN_glGetNamedBufferParameterui64vNV) (GLuint buffer, GLenum pname, GLuint64EXT *params); + return ((PFN_glGetNamedBufferParameterui64vNV)__blue_glCore_glGetNamedBufferParameterui64vNV)(buffer, pname, params); +} + +extern void* __blue_glCore_glGetIntegerui64vNV; +void APIENTRY bluegl_glGetIntegerui64vNV (GLenum value, GLuint64EXT *result) { + typedef void (APIENTRYP PFN_glGetIntegerui64vNV) (GLenum value, GLuint64EXT *result); + return ((PFN_glGetIntegerui64vNV)__blue_glCore_glGetIntegerui64vNV)(value, result); +} + +extern void* __blue_glCore_glUniformui64NV; +void APIENTRY bluegl_glUniformui64NV (GLint location, GLuint64EXT value) { + typedef void (APIENTRYP PFN_glUniformui64NV) (GLint location, GLuint64EXT value); + return ((PFN_glUniformui64NV)__blue_glCore_glUniformui64NV)(location, value); +} + +extern void* __blue_glCore_glUniformui64vNV; +void APIENTRY bluegl_glUniformui64vNV (GLint location, GLsizei count, const GLuint64EXT *value) { + typedef void (APIENTRYP PFN_glUniformui64vNV) (GLint location, GLsizei count, const GLuint64EXT *value); + return ((PFN_glUniformui64vNV)__blue_glCore_glUniformui64vNV)(location, count, value); +} + +extern void* __blue_glCore_glProgramUniformui64NV; +void APIENTRY bluegl_glProgramUniformui64NV (GLuint program, GLint location, GLuint64EXT value) { + typedef void (APIENTRYP PFN_glProgramUniformui64NV) (GLuint program, GLint location, GLuint64EXT value); + return ((PFN_glProgramUniformui64NV)__blue_glCore_glProgramUniformui64NV)(program, location, value); +} + +extern void* __blue_glCore_glProgramUniformui64vNV; +void APIENTRY bluegl_glProgramUniformui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value) { + typedef void (APIENTRYP PFN_glProgramUniformui64vNV) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); + return ((PFN_glProgramUniformui64vNV)__blue_glCore_glProgramUniformui64vNV)(program, location, count, value); +} + +extern void* __blue_glCore_glTextureBarrierNV; +void APIENTRY bluegl_glTextureBarrierNV (void) { + typedef void (APIENTRYP PFN_glTextureBarrierNV) (void); + return ((PFN_glTextureBarrierNV)__blue_glCore_glTextureBarrierNV)(); +} + +extern void* __blue_glCore_glTexImage2DMultisampleCoverageNV; +void APIENTRY bluegl_glTexImage2DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations) { + typedef void (APIENTRYP PFN_glTexImage2DMultisampleCoverageNV) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); + return ((PFN_glTexImage2DMultisampleCoverageNV)__blue_glCore_glTexImage2DMultisampleCoverageNV)(target, coverageSamples, colorSamples, internalFormat, width, height, fixedSampleLocations); +} + +extern void* __blue_glCore_glTexImage3DMultisampleCoverageNV; +void APIENTRY bluegl_glTexImage3DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations) { + typedef void (APIENTRYP PFN_glTexImage3DMultisampleCoverageNV) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); + return ((PFN_glTexImage3DMultisampleCoverageNV)__blue_glCore_glTexImage3DMultisampleCoverageNV)(target, coverageSamples, colorSamples, internalFormat, width, height, depth, fixedSampleLocations); +} + +extern void* __blue_glCore_glTextureImage2DMultisampleNV; +void APIENTRY bluegl_glTextureImage2DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations) { + typedef void (APIENTRYP PFN_glTextureImage2DMultisampleNV) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); + return ((PFN_glTextureImage2DMultisampleNV)__blue_glCore_glTextureImage2DMultisampleNV)(texture, target, samples, internalFormat, width, height, fixedSampleLocations); +} + +extern void* __blue_glCore_glTextureImage3DMultisampleNV; +void APIENTRY bluegl_glTextureImage3DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations) { + typedef void (APIENTRYP PFN_glTextureImage3DMultisampleNV) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); + return ((PFN_glTextureImage3DMultisampleNV)__blue_glCore_glTextureImage3DMultisampleNV)(texture, target, samples, internalFormat, width, height, depth, fixedSampleLocations); +} + +extern void* __blue_glCore_glTextureImage2DMultisampleCoverageNV; +void APIENTRY bluegl_glTextureImage2DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations) { + typedef void (APIENTRYP PFN_glTextureImage2DMultisampleCoverageNV) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); + return ((PFN_glTextureImage2DMultisampleCoverageNV)__blue_glCore_glTextureImage2DMultisampleCoverageNV)(texture, target, coverageSamples, colorSamples, internalFormat, width, height, fixedSampleLocations); +} + +extern void* __blue_glCore_glTextureImage3DMultisampleCoverageNV; +void APIENTRY bluegl_glTextureImage3DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations) { + typedef void (APIENTRYP PFN_glTextureImage3DMultisampleCoverageNV) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); + return ((PFN_glTextureImage3DMultisampleCoverageNV)__blue_glCore_glTextureImage3DMultisampleCoverageNV)(texture, target, coverageSamples, colorSamples, internalFormat, width, height, depth, fixedSampleLocations); +} + +extern void* __blue_glCore_glBeginTransformFeedbackNV; +void APIENTRY bluegl_glBeginTransformFeedbackNV (GLenum primitiveMode) { + typedef void (APIENTRYP PFN_glBeginTransformFeedbackNV) (GLenum primitiveMode); + return ((PFN_glBeginTransformFeedbackNV)__blue_glCore_glBeginTransformFeedbackNV)(primitiveMode); +} + +extern void* __blue_glCore_glEndTransformFeedbackNV; +void APIENTRY bluegl_glEndTransformFeedbackNV (void) { + typedef void (APIENTRYP PFN_glEndTransformFeedbackNV) (void); + return ((PFN_glEndTransformFeedbackNV)__blue_glCore_glEndTransformFeedbackNV)(); +} + +extern void* __blue_glCore_glTransformFeedbackAttribsNV; +void APIENTRY bluegl_glTransformFeedbackAttribsNV (GLsizei count, const GLint *attribs, GLenum bufferMode) { + typedef void (APIENTRYP PFN_glTransformFeedbackAttribsNV) (GLsizei count, const GLint *attribs, GLenum bufferMode); + return ((PFN_glTransformFeedbackAttribsNV)__blue_glCore_glTransformFeedbackAttribsNV)(count, attribs, bufferMode); +} + +extern void* __blue_glCore_glBindBufferRangeNV; +void APIENTRY bluegl_glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { + typedef void (APIENTRYP PFN_glBindBufferRangeNV) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); + return ((PFN_glBindBufferRangeNV)__blue_glCore_glBindBufferRangeNV)(target, index, buffer, offset, size); +} + +extern void* __blue_glCore_glBindBufferOffsetNV; +void APIENTRY bluegl_glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset) { + typedef void (APIENTRYP PFN_glBindBufferOffsetNV) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); + return ((PFN_glBindBufferOffsetNV)__blue_glCore_glBindBufferOffsetNV)(target, index, buffer, offset); +} + +extern void* __blue_glCore_glBindBufferBaseNV; +void APIENTRY bluegl_glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer) { + typedef void (APIENTRYP PFN_glBindBufferBaseNV) (GLenum target, GLuint index, GLuint buffer); + return ((PFN_glBindBufferBaseNV)__blue_glCore_glBindBufferBaseNV)(target, index, buffer); +} + +extern void* __blue_glCore_glTransformFeedbackVaryingsNV; +void APIENTRY bluegl_glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode) { + typedef void (APIENTRYP PFN_glTransformFeedbackVaryingsNV) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); + return ((PFN_glTransformFeedbackVaryingsNV)__blue_glCore_glTransformFeedbackVaryingsNV)(program, count, locations, bufferMode); +} + +extern void* __blue_glCore_glActiveVaryingNV; +void APIENTRY bluegl_glActiveVaryingNV (GLuint program, const GLchar *name) { + typedef void (APIENTRYP PFN_glActiveVaryingNV) (GLuint program, const GLchar *name); + return ((PFN_glActiveVaryingNV)__blue_glCore_glActiveVaryingNV)(program, name); +} + +extern void* __blue_glCore_glGetVaryingLocationNV; +GLint APIENTRY bluegl_glGetVaryingLocationNV (GLuint program, const GLchar *name) { + typedef GLint (APIENTRYP PFN_glGetVaryingLocationNV) (GLuint program, const GLchar *name); + return ((PFN_glGetVaryingLocationNV)__blue_glCore_glGetVaryingLocationNV)(program, name); +} + +extern void* __blue_glCore_glGetActiveVaryingNV; +void APIENTRY bluegl_glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name) { + typedef void (APIENTRYP PFN_glGetActiveVaryingNV) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); + return ((PFN_glGetActiveVaryingNV)__blue_glCore_glGetActiveVaryingNV)(program, index, bufSize, length, size, type, name); +} + +extern void* __blue_glCore_glGetTransformFeedbackVaryingNV; +void APIENTRY bluegl_glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location) { + typedef void (APIENTRYP PFN_glGetTransformFeedbackVaryingNV) (GLuint program, GLuint index, GLint *location); + return ((PFN_glGetTransformFeedbackVaryingNV)__blue_glCore_glGetTransformFeedbackVaryingNV)(program, index, location); +} + +extern void* __blue_glCore_glTransformFeedbackStreamAttribsNV; +void APIENTRY bluegl_glTransformFeedbackStreamAttribsNV (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode) { + typedef void (APIENTRYP PFN_glTransformFeedbackStreamAttribsNV) (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); + return ((PFN_glTransformFeedbackStreamAttribsNV)__blue_glCore_glTransformFeedbackStreamAttribsNV)(count, attribs, nbuffers, bufstreams, bufferMode); +} + +extern void* __blue_glCore_glBindTransformFeedbackNV; +void APIENTRY bluegl_glBindTransformFeedbackNV (GLenum target, GLuint id) { + typedef void (APIENTRYP PFN_glBindTransformFeedbackNV) (GLenum target, GLuint id); + return ((PFN_glBindTransformFeedbackNV)__blue_glCore_glBindTransformFeedbackNV)(target, id); +} + +extern void* __blue_glCore_glDeleteTransformFeedbacksNV; +void APIENTRY bluegl_glDeleteTransformFeedbacksNV (GLsizei n, const GLuint *ids) { + typedef void (APIENTRYP PFN_glDeleteTransformFeedbacksNV) (GLsizei n, const GLuint *ids); + return ((PFN_glDeleteTransformFeedbacksNV)__blue_glCore_glDeleteTransformFeedbacksNV)(n, ids); +} + +extern void* __blue_glCore_glGenTransformFeedbacksNV; +void APIENTRY bluegl_glGenTransformFeedbacksNV (GLsizei n, GLuint *ids) { + typedef void (APIENTRYP PFN_glGenTransformFeedbacksNV) (GLsizei n, GLuint *ids); + return ((PFN_glGenTransformFeedbacksNV)__blue_glCore_glGenTransformFeedbacksNV)(n, ids); +} + +extern void* __blue_glCore_glIsTransformFeedbackNV; +GLboolean APIENTRY bluegl_glIsTransformFeedbackNV (GLuint id) { + typedef GLboolean (APIENTRYP PFN_glIsTransformFeedbackNV) (GLuint id); + return ((PFN_glIsTransformFeedbackNV)__blue_glCore_glIsTransformFeedbackNV)(id); +} + +extern void* __blue_glCore_glPauseTransformFeedbackNV; +void APIENTRY bluegl_glPauseTransformFeedbackNV (void) { + typedef void (APIENTRYP PFN_glPauseTransformFeedbackNV) (void); + return ((PFN_glPauseTransformFeedbackNV)__blue_glCore_glPauseTransformFeedbackNV)(); +} + +extern void* __blue_glCore_glResumeTransformFeedbackNV; +void APIENTRY bluegl_glResumeTransformFeedbackNV (void) { + typedef void (APIENTRYP PFN_glResumeTransformFeedbackNV) (void); + return ((PFN_glResumeTransformFeedbackNV)__blue_glCore_glResumeTransformFeedbackNV)(); +} + +extern void* __blue_glCore_glDrawTransformFeedbackNV; +void APIENTRY bluegl_glDrawTransformFeedbackNV (GLenum mode, GLuint id) { + typedef void (APIENTRYP PFN_glDrawTransformFeedbackNV) (GLenum mode, GLuint id); + return ((PFN_glDrawTransformFeedbackNV)__blue_glCore_glDrawTransformFeedbackNV)(mode, id); +} + +extern void* __blue_glCore_glVDPAUInitNV; +void APIENTRY bluegl_glVDPAUInitNV (const void *vdpDevice, const void *getProcAddress) { + typedef void (APIENTRYP PFN_glVDPAUInitNV) (const void *vdpDevice, const void *getProcAddress); + return ((PFN_glVDPAUInitNV)__blue_glCore_glVDPAUInitNV)(vdpDevice, getProcAddress); +} + +extern void* __blue_glCore_glVDPAUFiniNV; +void APIENTRY bluegl_glVDPAUFiniNV (void) { + typedef void (APIENTRYP PFN_glVDPAUFiniNV) (void); + return ((PFN_glVDPAUFiniNV)__blue_glCore_glVDPAUFiniNV)(); +} + +extern void* __blue_glCore_glVDPAURegisterVideoSurfaceNV; +GLvdpauSurfaceNV APIENTRY bluegl_glVDPAURegisterVideoSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames) { + typedef GLvdpauSurfaceNV (APIENTRYP PFN_glVDPAURegisterVideoSurfaceNV) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); + return ((PFN_glVDPAURegisterVideoSurfaceNV)__blue_glCore_glVDPAURegisterVideoSurfaceNV)(vdpSurface, target, numTextureNames, textureNames); +} + +extern void* __blue_glCore_glVDPAURegisterOutputSurfaceNV; +GLvdpauSurfaceNV APIENTRY bluegl_glVDPAURegisterOutputSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames) { + typedef GLvdpauSurfaceNV (APIENTRYP PFN_glVDPAURegisterOutputSurfaceNV) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); + return ((PFN_glVDPAURegisterOutputSurfaceNV)__blue_glCore_glVDPAURegisterOutputSurfaceNV)(vdpSurface, target, numTextureNames, textureNames); +} + +extern void* __blue_glCore_glVDPAUIsSurfaceNV; +GLboolean APIENTRY bluegl_glVDPAUIsSurfaceNV (GLvdpauSurfaceNV surface) { + typedef GLboolean (APIENTRYP PFN_glVDPAUIsSurfaceNV) (GLvdpauSurfaceNV surface); + return ((PFN_glVDPAUIsSurfaceNV)__blue_glCore_glVDPAUIsSurfaceNV)(surface); +} + +extern void* __blue_glCore_glVDPAUUnregisterSurfaceNV; +void APIENTRY bluegl_glVDPAUUnregisterSurfaceNV (GLvdpauSurfaceNV surface) { + typedef void (APIENTRYP PFN_glVDPAUUnregisterSurfaceNV) (GLvdpauSurfaceNV surface); + return ((PFN_glVDPAUUnregisterSurfaceNV)__blue_glCore_glVDPAUUnregisterSurfaceNV)(surface); +} + +extern void* __blue_glCore_glVDPAUGetSurfaceivNV; +void APIENTRY bluegl_glVDPAUGetSurfaceivNV (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values) { + typedef void (APIENTRYP PFN_glVDPAUGetSurfaceivNV) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); + return ((PFN_glVDPAUGetSurfaceivNV)__blue_glCore_glVDPAUGetSurfaceivNV)(surface, pname, bufSize, length, values); +} + +extern void* __blue_glCore_glVDPAUSurfaceAccessNV; +void APIENTRY bluegl_glVDPAUSurfaceAccessNV (GLvdpauSurfaceNV surface, GLenum access) { + typedef void (APIENTRYP PFN_glVDPAUSurfaceAccessNV) (GLvdpauSurfaceNV surface, GLenum access); + return ((PFN_glVDPAUSurfaceAccessNV)__blue_glCore_glVDPAUSurfaceAccessNV)(surface, access); +} + +extern void* __blue_glCore_glVDPAUMapSurfacesNV; +void APIENTRY bluegl_glVDPAUMapSurfacesNV (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces) { + typedef void (APIENTRYP PFN_glVDPAUMapSurfacesNV) (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); + return ((PFN_glVDPAUMapSurfacesNV)__blue_glCore_glVDPAUMapSurfacesNV)(numSurfaces, surfaces); +} + +extern void* __blue_glCore_glVDPAUUnmapSurfacesNV; +void APIENTRY bluegl_glVDPAUUnmapSurfacesNV (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces) { + typedef void (APIENTRYP PFN_glVDPAUUnmapSurfacesNV) (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); + return ((PFN_glVDPAUUnmapSurfacesNV)__blue_glCore_glVDPAUUnmapSurfacesNV)(numSurface, surfaces); +} + +extern void* __blue_glCore_glFlushVertexArrayRangeNV; +void APIENTRY bluegl_glFlushVertexArrayRangeNV (void) { + typedef void (APIENTRYP PFN_glFlushVertexArrayRangeNV) (void); + return ((PFN_glFlushVertexArrayRangeNV)__blue_glCore_glFlushVertexArrayRangeNV)(); +} + +extern void* __blue_glCore_glVertexArrayRangeNV; +void APIENTRY bluegl_glVertexArrayRangeNV (GLsizei length, const void *pointer) { + typedef void (APIENTRYP PFN_glVertexArrayRangeNV) (GLsizei length, const void *pointer); + return ((PFN_glVertexArrayRangeNV)__blue_glCore_glVertexArrayRangeNV)(length, pointer); +} + +extern void* __blue_glCore_glVertexAttribL1i64NV; +void APIENTRY bluegl_glVertexAttribL1i64NV (GLuint index, GLint64EXT x) { + typedef void (APIENTRYP PFN_glVertexAttribL1i64NV) (GLuint index, GLint64EXT x); + return ((PFN_glVertexAttribL1i64NV)__blue_glCore_glVertexAttribL1i64NV)(index, x); +} + +extern void* __blue_glCore_glVertexAttribL2i64NV; +void APIENTRY bluegl_glVertexAttribL2i64NV (GLuint index, GLint64EXT x, GLint64EXT y) { + typedef void (APIENTRYP PFN_glVertexAttribL2i64NV) (GLuint index, GLint64EXT x, GLint64EXT y); + return ((PFN_glVertexAttribL2i64NV)__blue_glCore_glVertexAttribL2i64NV)(index, x, y); +} + +extern void* __blue_glCore_glVertexAttribL3i64NV; +void APIENTRY bluegl_glVertexAttribL3i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z) { + typedef void (APIENTRYP PFN_glVertexAttribL3i64NV) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); + return ((PFN_glVertexAttribL3i64NV)__blue_glCore_glVertexAttribL3i64NV)(index, x, y, z); +} + +extern void* __blue_glCore_glVertexAttribL4i64NV; +void APIENTRY bluegl_glVertexAttribL4i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w) { + typedef void (APIENTRYP PFN_glVertexAttribL4i64NV) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); + return ((PFN_glVertexAttribL4i64NV)__blue_glCore_glVertexAttribL4i64NV)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttribL1i64vNV; +void APIENTRY bluegl_glVertexAttribL1i64vNV (GLuint index, const GLint64EXT *v) { + typedef void (APIENTRYP PFN_glVertexAttribL1i64vNV) (GLuint index, const GLint64EXT *v); + return ((PFN_glVertexAttribL1i64vNV)__blue_glCore_glVertexAttribL1i64vNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttribL2i64vNV; +void APIENTRY bluegl_glVertexAttribL2i64vNV (GLuint index, const GLint64EXT *v) { + typedef void (APIENTRYP PFN_glVertexAttribL2i64vNV) (GLuint index, const GLint64EXT *v); + return ((PFN_glVertexAttribL2i64vNV)__blue_glCore_glVertexAttribL2i64vNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttribL3i64vNV; +void APIENTRY bluegl_glVertexAttribL3i64vNV (GLuint index, const GLint64EXT *v) { + typedef void (APIENTRYP PFN_glVertexAttribL3i64vNV) (GLuint index, const GLint64EXT *v); + return ((PFN_glVertexAttribL3i64vNV)__blue_glCore_glVertexAttribL3i64vNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttribL4i64vNV; +void APIENTRY bluegl_glVertexAttribL4i64vNV (GLuint index, const GLint64EXT *v) { + typedef void (APIENTRYP PFN_glVertexAttribL4i64vNV) (GLuint index, const GLint64EXT *v); + return ((PFN_glVertexAttribL4i64vNV)__blue_glCore_glVertexAttribL4i64vNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttribL1ui64NV; +void APIENTRY bluegl_glVertexAttribL1ui64NV (GLuint index, GLuint64EXT x) { + typedef void (APIENTRYP PFN_glVertexAttribL1ui64NV) (GLuint index, GLuint64EXT x); + return ((PFN_glVertexAttribL1ui64NV)__blue_glCore_glVertexAttribL1ui64NV)(index, x); +} + +extern void* __blue_glCore_glVertexAttribL2ui64NV; +void APIENTRY bluegl_glVertexAttribL2ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y) { + typedef void (APIENTRYP PFN_glVertexAttribL2ui64NV) (GLuint index, GLuint64EXT x, GLuint64EXT y); + return ((PFN_glVertexAttribL2ui64NV)__blue_glCore_glVertexAttribL2ui64NV)(index, x, y); +} + +extern void* __blue_glCore_glVertexAttribL3ui64NV; +void APIENTRY bluegl_glVertexAttribL3ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z) { + typedef void (APIENTRYP PFN_glVertexAttribL3ui64NV) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); + return ((PFN_glVertexAttribL3ui64NV)__blue_glCore_glVertexAttribL3ui64NV)(index, x, y, z); +} + +extern void* __blue_glCore_glVertexAttribL4ui64NV; +void APIENTRY bluegl_glVertexAttribL4ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w) { + typedef void (APIENTRYP PFN_glVertexAttribL4ui64NV) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); + return ((PFN_glVertexAttribL4ui64NV)__blue_glCore_glVertexAttribL4ui64NV)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttribL1ui64vNV; +void APIENTRY bluegl_glVertexAttribL1ui64vNV (GLuint index, const GLuint64EXT *v) { + typedef void (APIENTRYP PFN_glVertexAttribL1ui64vNV) (GLuint index, const GLuint64EXT *v); + return ((PFN_glVertexAttribL1ui64vNV)__blue_glCore_glVertexAttribL1ui64vNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttribL2ui64vNV; +void APIENTRY bluegl_glVertexAttribL2ui64vNV (GLuint index, const GLuint64EXT *v) { + typedef void (APIENTRYP PFN_glVertexAttribL2ui64vNV) (GLuint index, const GLuint64EXT *v); + return ((PFN_glVertexAttribL2ui64vNV)__blue_glCore_glVertexAttribL2ui64vNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttribL3ui64vNV; +void APIENTRY bluegl_glVertexAttribL3ui64vNV (GLuint index, const GLuint64EXT *v) { + typedef void (APIENTRYP PFN_glVertexAttribL3ui64vNV) (GLuint index, const GLuint64EXT *v); + return ((PFN_glVertexAttribL3ui64vNV)__blue_glCore_glVertexAttribL3ui64vNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttribL4ui64vNV; +void APIENTRY bluegl_glVertexAttribL4ui64vNV (GLuint index, const GLuint64EXT *v) { + typedef void (APIENTRYP PFN_glVertexAttribL4ui64vNV) (GLuint index, const GLuint64EXT *v); + return ((PFN_glVertexAttribL4ui64vNV)__blue_glCore_glVertexAttribL4ui64vNV)(index, v); +} + +extern void* __blue_glCore_glGetVertexAttribLi64vNV; +void APIENTRY bluegl_glGetVertexAttribLi64vNV (GLuint index, GLenum pname, GLint64EXT *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribLi64vNV) (GLuint index, GLenum pname, GLint64EXT *params); + return ((PFN_glGetVertexAttribLi64vNV)__blue_glCore_glGetVertexAttribLi64vNV)(index, pname, params); +} + +extern void* __blue_glCore_glGetVertexAttribLui64vNV; +void APIENTRY bluegl_glGetVertexAttribLui64vNV (GLuint index, GLenum pname, GLuint64EXT *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribLui64vNV) (GLuint index, GLenum pname, GLuint64EXT *params); + return ((PFN_glGetVertexAttribLui64vNV)__blue_glCore_glGetVertexAttribLui64vNV)(index, pname, params); +} + +extern void* __blue_glCore_glVertexAttribLFormatNV; +void APIENTRY bluegl_glVertexAttribLFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride) { + typedef void (APIENTRYP PFN_glVertexAttribLFormatNV) (GLuint index, GLint size, GLenum type, GLsizei stride); + return ((PFN_glVertexAttribLFormatNV)__blue_glCore_glVertexAttribLFormatNV)(index, size, type, stride); +} + +extern void* __blue_glCore_glBufferAddressRangeNV; +void APIENTRY bluegl_glBufferAddressRangeNV (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length) { + typedef void (APIENTRYP PFN_glBufferAddressRangeNV) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); + return ((PFN_glBufferAddressRangeNV)__blue_glCore_glBufferAddressRangeNV)(pname, index, address, length); +} + +extern void* __blue_glCore_glVertexFormatNV; +void APIENTRY bluegl_glVertexFormatNV (GLint size, GLenum type, GLsizei stride) { + typedef void (APIENTRYP PFN_glVertexFormatNV) (GLint size, GLenum type, GLsizei stride); + return ((PFN_glVertexFormatNV)__blue_glCore_glVertexFormatNV)(size, type, stride); +} + +extern void* __blue_glCore_glNormalFormatNV; +void APIENTRY bluegl_glNormalFormatNV (GLenum type, GLsizei stride) { + typedef void (APIENTRYP PFN_glNormalFormatNV) (GLenum type, GLsizei stride); + return ((PFN_glNormalFormatNV)__blue_glCore_glNormalFormatNV)(type, stride); +} + +extern void* __blue_glCore_glColorFormatNV; +void APIENTRY bluegl_glColorFormatNV (GLint size, GLenum type, GLsizei stride) { + typedef void (APIENTRYP PFN_glColorFormatNV) (GLint size, GLenum type, GLsizei stride); + return ((PFN_glColorFormatNV)__blue_glCore_glColorFormatNV)(size, type, stride); +} + +extern void* __blue_glCore_glIndexFormatNV; +void APIENTRY bluegl_glIndexFormatNV (GLenum type, GLsizei stride) { + typedef void (APIENTRYP PFN_glIndexFormatNV) (GLenum type, GLsizei stride); + return ((PFN_glIndexFormatNV)__blue_glCore_glIndexFormatNV)(type, stride); +} + +extern void* __blue_glCore_glTexCoordFormatNV; +void APIENTRY bluegl_glTexCoordFormatNV (GLint size, GLenum type, GLsizei stride) { + typedef void (APIENTRYP PFN_glTexCoordFormatNV) (GLint size, GLenum type, GLsizei stride); + return ((PFN_glTexCoordFormatNV)__blue_glCore_glTexCoordFormatNV)(size, type, stride); +} + +extern void* __blue_glCore_glEdgeFlagFormatNV; +void APIENTRY bluegl_glEdgeFlagFormatNV (GLsizei stride) { + typedef void (APIENTRYP PFN_glEdgeFlagFormatNV) (GLsizei stride); + return ((PFN_glEdgeFlagFormatNV)__blue_glCore_glEdgeFlagFormatNV)(stride); +} + +extern void* __blue_glCore_glSecondaryColorFormatNV; +void APIENTRY bluegl_glSecondaryColorFormatNV (GLint size, GLenum type, GLsizei stride) { + typedef void (APIENTRYP PFN_glSecondaryColorFormatNV) (GLint size, GLenum type, GLsizei stride); + return ((PFN_glSecondaryColorFormatNV)__blue_glCore_glSecondaryColorFormatNV)(size, type, stride); +} + +extern void* __blue_glCore_glFogCoordFormatNV; +void APIENTRY bluegl_glFogCoordFormatNV (GLenum type, GLsizei stride) { + typedef void (APIENTRYP PFN_glFogCoordFormatNV) (GLenum type, GLsizei stride); + return ((PFN_glFogCoordFormatNV)__blue_glCore_glFogCoordFormatNV)(type, stride); +} + +extern void* __blue_glCore_glVertexAttribFormatNV; +void APIENTRY bluegl_glVertexAttribFormatNV (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride) { + typedef void (APIENTRYP PFN_glVertexAttribFormatNV) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); + return ((PFN_glVertexAttribFormatNV)__blue_glCore_glVertexAttribFormatNV)(index, size, type, normalized, stride); +} + +extern void* __blue_glCore_glVertexAttribIFormatNV; +void APIENTRY bluegl_glVertexAttribIFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride) { + typedef void (APIENTRYP PFN_glVertexAttribIFormatNV) (GLuint index, GLint size, GLenum type, GLsizei stride); + return ((PFN_glVertexAttribIFormatNV)__blue_glCore_glVertexAttribIFormatNV)(index, size, type, stride); +} + +extern void* __blue_glCore_glGetIntegerui64i_vNV; +void APIENTRY bluegl_glGetIntegerui64i_vNV (GLenum value, GLuint index, GLuint64EXT *result) { + typedef void (APIENTRYP PFN_glGetIntegerui64i_vNV) (GLenum value, GLuint index, GLuint64EXT *result); + return ((PFN_glGetIntegerui64i_vNV)__blue_glCore_glGetIntegerui64i_vNV)(value, index, result); +} + +extern void* __blue_glCore_glAreProgramsResidentNV; +GLboolean APIENTRY bluegl_glAreProgramsResidentNV (GLsizei n, const GLuint *programs, GLboolean *residences) { + typedef GLboolean (APIENTRYP PFN_glAreProgramsResidentNV) (GLsizei n, const GLuint *programs, GLboolean *residences); + return ((PFN_glAreProgramsResidentNV)__blue_glCore_glAreProgramsResidentNV)(n, programs, residences); +} + +extern void* __blue_glCore_glBindProgramNV; +void APIENTRY bluegl_glBindProgramNV (GLenum target, GLuint id) { + typedef void (APIENTRYP PFN_glBindProgramNV) (GLenum target, GLuint id); + return ((PFN_glBindProgramNV)__blue_glCore_glBindProgramNV)(target, id); +} + +extern void* __blue_glCore_glDeleteProgramsNV; +void APIENTRY bluegl_glDeleteProgramsNV (GLsizei n, const GLuint *programs) { + typedef void (APIENTRYP PFN_glDeleteProgramsNV) (GLsizei n, const GLuint *programs); + return ((PFN_glDeleteProgramsNV)__blue_glCore_glDeleteProgramsNV)(n, programs); +} + +extern void* __blue_glCore_glExecuteProgramNV; +void APIENTRY bluegl_glExecuteProgramNV (GLenum target, GLuint id, const GLfloat *params) { + typedef void (APIENTRYP PFN_glExecuteProgramNV) (GLenum target, GLuint id, const GLfloat *params); + return ((PFN_glExecuteProgramNV)__blue_glCore_glExecuteProgramNV)(target, id, params); +} + +extern void* __blue_glCore_glGenProgramsNV; +void APIENTRY bluegl_glGenProgramsNV (GLsizei n, GLuint *programs) { + typedef void (APIENTRYP PFN_glGenProgramsNV) (GLsizei n, GLuint *programs); + return ((PFN_glGenProgramsNV)__blue_glCore_glGenProgramsNV)(n, programs); +} + +extern void* __blue_glCore_glGetProgramParameterdvNV; +void APIENTRY bluegl_glGetProgramParameterdvNV (GLenum target, GLuint index, GLenum pname, GLdouble *params) { + typedef void (APIENTRYP PFN_glGetProgramParameterdvNV) (GLenum target, GLuint index, GLenum pname, GLdouble *params); + return ((PFN_glGetProgramParameterdvNV)__blue_glCore_glGetProgramParameterdvNV)(target, index, pname, params); +} + +extern void* __blue_glCore_glGetProgramParameterfvNV; +void APIENTRY bluegl_glGetProgramParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetProgramParameterfvNV) (GLenum target, GLuint index, GLenum pname, GLfloat *params); + return ((PFN_glGetProgramParameterfvNV)__blue_glCore_glGetProgramParameterfvNV)(target, index, pname, params); +} + +extern void* __blue_glCore_glGetProgramivNV; +void APIENTRY bluegl_glGetProgramivNV (GLuint id, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetProgramivNV) (GLuint id, GLenum pname, GLint *params); + return ((PFN_glGetProgramivNV)__blue_glCore_glGetProgramivNV)(id, pname, params); +} + +extern void* __blue_glCore_glGetProgramStringNV; +void APIENTRY bluegl_glGetProgramStringNV (GLuint id, GLenum pname, GLubyte *program) { + typedef void (APIENTRYP PFN_glGetProgramStringNV) (GLuint id, GLenum pname, GLubyte *program); + return ((PFN_glGetProgramStringNV)__blue_glCore_glGetProgramStringNV)(id, pname, program); +} + +extern void* __blue_glCore_glGetTrackMatrixivNV; +void APIENTRY bluegl_glGetTrackMatrixivNV (GLenum target, GLuint address, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetTrackMatrixivNV) (GLenum target, GLuint address, GLenum pname, GLint *params); + return ((PFN_glGetTrackMatrixivNV)__blue_glCore_glGetTrackMatrixivNV)(target, address, pname, params); +} + +extern void* __blue_glCore_glGetVertexAttribdvNV; +void APIENTRY bluegl_glGetVertexAttribdvNV (GLuint index, GLenum pname, GLdouble *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribdvNV) (GLuint index, GLenum pname, GLdouble *params); + return ((PFN_glGetVertexAttribdvNV)__blue_glCore_glGetVertexAttribdvNV)(index, pname, params); +} + +extern void* __blue_glCore_glGetVertexAttribfvNV; +void APIENTRY bluegl_glGetVertexAttribfvNV (GLuint index, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribfvNV) (GLuint index, GLenum pname, GLfloat *params); + return ((PFN_glGetVertexAttribfvNV)__blue_glCore_glGetVertexAttribfvNV)(index, pname, params); +} + +extern void* __blue_glCore_glGetVertexAttribivNV; +void APIENTRY bluegl_glGetVertexAttribivNV (GLuint index, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribivNV) (GLuint index, GLenum pname, GLint *params); + return ((PFN_glGetVertexAttribivNV)__blue_glCore_glGetVertexAttribivNV)(index, pname, params); +} + +extern void* __blue_glCore_glGetVertexAttribPointervNV; +void APIENTRY bluegl_glGetVertexAttribPointervNV (GLuint index, GLenum pname, void **pointer) { + typedef void (APIENTRYP PFN_glGetVertexAttribPointervNV) (GLuint index, GLenum pname, void **pointer); + return ((PFN_glGetVertexAttribPointervNV)__blue_glCore_glGetVertexAttribPointervNV)(index, pname, pointer); +} + +extern void* __blue_glCore_glIsProgramNV; +GLboolean APIENTRY bluegl_glIsProgramNV (GLuint id) { + typedef GLboolean (APIENTRYP PFN_glIsProgramNV) (GLuint id); + return ((PFN_glIsProgramNV)__blue_glCore_glIsProgramNV)(id); +} + +extern void* __blue_glCore_glLoadProgramNV; +void APIENTRY bluegl_glLoadProgramNV (GLenum target, GLuint id, GLsizei len, const GLubyte *program) { + typedef void (APIENTRYP PFN_glLoadProgramNV) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); + return ((PFN_glLoadProgramNV)__blue_glCore_glLoadProgramNV)(target, id, len, program); +} + +extern void* __blue_glCore_glProgramParameter4dNV; +void APIENTRY bluegl_glProgramParameter4dNV (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { + typedef void (APIENTRYP PFN_glProgramParameter4dNV) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + return ((PFN_glProgramParameter4dNV)__blue_glCore_glProgramParameter4dNV)(target, index, x, y, z, w); +} + +extern void* __blue_glCore_glProgramParameter4dvNV; +void APIENTRY bluegl_glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glProgramParameter4dvNV) (GLenum target, GLuint index, const GLdouble *v); + return ((PFN_glProgramParameter4dvNV)__blue_glCore_glProgramParameter4dvNV)(target, index, v); +} + +extern void* __blue_glCore_glProgramParameter4fNV; +void APIENTRY bluegl_glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { + typedef void (APIENTRYP PFN_glProgramParameter4fNV) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + return ((PFN_glProgramParameter4fNV)__blue_glCore_glProgramParameter4fNV)(target, index, x, y, z, w); +} + +extern void* __blue_glCore_glProgramParameter4fvNV; +void APIENTRY bluegl_glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v) { + typedef void (APIENTRYP PFN_glProgramParameter4fvNV) (GLenum target, GLuint index, const GLfloat *v); + return ((PFN_glProgramParameter4fvNV)__blue_glCore_glProgramParameter4fvNV)(target, index, v); +} + +extern void* __blue_glCore_glProgramParameters4dvNV; +void APIENTRY bluegl_glProgramParameters4dvNV (GLenum target, GLuint index, GLsizei count, const GLdouble *v) { + typedef void (APIENTRYP PFN_glProgramParameters4dvNV) (GLenum target, GLuint index, GLsizei count, const GLdouble *v); + return ((PFN_glProgramParameters4dvNV)__blue_glCore_glProgramParameters4dvNV)(target, index, count, v); +} + +extern void* __blue_glCore_glProgramParameters4fvNV; +void APIENTRY bluegl_glProgramParameters4fvNV (GLenum target, GLuint index, GLsizei count, const GLfloat *v) { + typedef void (APIENTRYP PFN_glProgramParameters4fvNV) (GLenum target, GLuint index, GLsizei count, const GLfloat *v); + return ((PFN_glProgramParameters4fvNV)__blue_glCore_glProgramParameters4fvNV)(target, index, count, v); +} + +extern void* __blue_glCore_glRequestResidentProgramsNV; +void APIENTRY bluegl_glRequestResidentProgramsNV (GLsizei n, const GLuint *programs) { + typedef void (APIENTRYP PFN_glRequestResidentProgramsNV) (GLsizei n, const GLuint *programs); + return ((PFN_glRequestResidentProgramsNV)__blue_glCore_glRequestResidentProgramsNV)(n, programs); +} + +extern void* __blue_glCore_glTrackMatrixNV; +void APIENTRY bluegl_glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform) { + typedef void (APIENTRYP PFN_glTrackMatrixNV) (GLenum target, GLuint address, GLenum matrix, GLenum transform); + return ((PFN_glTrackMatrixNV)__blue_glCore_glTrackMatrixNV)(target, address, matrix, transform); +} + +extern void* __blue_glCore_glVertexAttribPointerNV; +void APIENTRY bluegl_glVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer) { + typedef void (APIENTRYP PFN_glVertexAttribPointerNV) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer); + return ((PFN_glVertexAttribPointerNV)__blue_glCore_glVertexAttribPointerNV)(index, fsize, type, stride, pointer); +} + +extern void* __blue_glCore_glVertexAttrib1dNV; +void APIENTRY bluegl_glVertexAttrib1dNV (GLuint index, GLdouble x) { + typedef void (APIENTRYP PFN_glVertexAttrib1dNV) (GLuint index, GLdouble x); + return ((PFN_glVertexAttrib1dNV)__blue_glCore_glVertexAttrib1dNV)(index, x); +} + +extern void* __blue_glCore_glVertexAttrib1dvNV; +void APIENTRY bluegl_glVertexAttrib1dvNV (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttrib1dvNV) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttrib1dvNV)__blue_glCore_glVertexAttrib1dvNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib1fNV; +void APIENTRY bluegl_glVertexAttrib1fNV (GLuint index, GLfloat x) { + typedef void (APIENTRYP PFN_glVertexAttrib1fNV) (GLuint index, GLfloat x); + return ((PFN_glVertexAttrib1fNV)__blue_glCore_glVertexAttrib1fNV)(index, x); +} + +extern void* __blue_glCore_glVertexAttrib1fvNV; +void APIENTRY bluegl_glVertexAttrib1fvNV (GLuint index, const GLfloat *v) { + typedef void (APIENTRYP PFN_glVertexAttrib1fvNV) (GLuint index, const GLfloat *v); + return ((PFN_glVertexAttrib1fvNV)__blue_glCore_glVertexAttrib1fvNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib1sNV; +void APIENTRY bluegl_glVertexAttrib1sNV (GLuint index, GLshort x) { + typedef void (APIENTRYP PFN_glVertexAttrib1sNV) (GLuint index, GLshort x); + return ((PFN_glVertexAttrib1sNV)__blue_glCore_glVertexAttrib1sNV)(index, x); +} + +extern void* __blue_glCore_glVertexAttrib1svNV; +void APIENTRY bluegl_glVertexAttrib1svNV (GLuint index, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttrib1svNV) (GLuint index, const GLshort *v); + return ((PFN_glVertexAttrib1svNV)__blue_glCore_glVertexAttrib1svNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib2dNV; +void APIENTRY bluegl_glVertexAttrib2dNV (GLuint index, GLdouble x, GLdouble y) { + typedef void (APIENTRYP PFN_glVertexAttrib2dNV) (GLuint index, GLdouble x, GLdouble y); + return ((PFN_glVertexAttrib2dNV)__blue_glCore_glVertexAttrib2dNV)(index, x, y); +} + +extern void* __blue_glCore_glVertexAttrib2dvNV; +void APIENTRY bluegl_glVertexAttrib2dvNV (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttrib2dvNV) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttrib2dvNV)__blue_glCore_glVertexAttrib2dvNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib2fNV; +void APIENTRY bluegl_glVertexAttrib2fNV (GLuint index, GLfloat x, GLfloat y) { + typedef void (APIENTRYP PFN_glVertexAttrib2fNV) (GLuint index, GLfloat x, GLfloat y); + return ((PFN_glVertexAttrib2fNV)__blue_glCore_glVertexAttrib2fNV)(index, x, y); +} + +extern void* __blue_glCore_glVertexAttrib2fvNV; +void APIENTRY bluegl_glVertexAttrib2fvNV (GLuint index, const GLfloat *v) { + typedef void (APIENTRYP PFN_glVertexAttrib2fvNV) (GLuint index, const GLfloat *v); + return ((PFN_glVertexAttrib2fvNV)__blue_glCore_glVertexAttrib2fvNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib2sNV; +void APIENTRY bluegl_glVertexAttrib2sNV (GLuint index, GLshort x, GLshort y) { + typedef void (APIENTRYP PFN_glVertexAttrib2sNV) (GLuint index, GLshort x, GLshort y); + return ((PFN_glVertexAttrib2sNV)__blue_glCore_glVertexAttrib2sNV)(index, x, y); +} + +extern void* __blue_glCore_glVertexAttrib2svNV; +void APIENTRY bluegl_glVertexAttrib2svNV (GLuint index, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttrib2svNV) (GLuint index, const GLshort *v); + return ((PFN_glVertexAttrib2svNV)__blue_glCore_glVertexAttrib2svNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib3dNV; +void APIENTRY bluegl_glVertexAttrib3dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z) { + typedef void (APIENTRYP PFN_glVertexAttrib3dNV) (GLuint index, GLdouble x, GLdouble y, GLdouble z); + return ((PFN_glVertexAttrib3dNV)__blue_glCore_glVertexAttrib3dNV)(index, x, y, z); +} + +extern void* __blue_glCore_glVertexAttrib3dvNV; +void APIENTRY bluegl_glVertexAttrib3dvNV (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttrib3dvNV) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttrib3dvNV)__blue_glCore_glVertexAttrib3dvNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib3fNV; +void APIENTRY bluegl_glVertexAttrib3fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glVertexAttrib3fNV) (GLuint index, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glVertexAttrib3fNV)__blue_glCore_glVertexAttrib3fNV)(index, x, y, z); +} + +extern void* __blue_glCore_glVertexAttrib3fvNV; +void APIENTRY bluegl_glVertexAttrib3fvNV (GLuint index, const GLfloat *v) { + typedef void (APIENTRYP PFN_glVertexAttrib3fvNV) (GLuint index, const GLfloat *v); + return ((PFN_glVertexAttrib3fvNV)__blue_glCore_glVertexAttrib3fvNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib3sNV; +void APIENTRY bluegl_glVertexAttrib3sNV (GLuint index, GLshort x, GLshort y, GLshort z) { + typedef void (APIENTRYP PFN_glVertexAttrib3sNV) (GLuint index, GLshort x, GLshort y, GLshort z); + return ((PFN_glVertexAttrib3sNV)__blue_glCore_glVertexAttrib3sNV)(index, x, y, z); +} + +extern void* __blue_glCore_glVertexAttrib3svNV; +void APIENTRY bluegl_glVertexAttrib3svNV (GLuint index, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttrib3svNV) (GLuint index, const GLshort *v); + return ((PFN_glVertexAttrib3svNV)__blue_glCore_glVertexAttrib3svNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4dNV; +void APIENTRY bluegl_glVertexAttrib4dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { + typedef void (APIENTRYP PFN_glVertexAttrib4dNV) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); + return ((PFN_glVertexAttrib4dNV)__blue_glCore_glVertexAttrib4dNV)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttrib4dvNV; +void APIENTRY bluegl_glVertexAttrib4dvNV (GLuint index, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4dvNV) (GLuint index, const GLdouble *v); + return ((PFN_glVertexAttrib4dvNV)__blue_glCore_glVertexAttrib4dvNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4fNV; +void APIENTRY bluegl_glVertexAttrib4fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { + typedef void (APIENTRYP PFN_glVertexAttrib4fNV) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + return ((PFN_glVertexAttrib4fNV)__blue_glCore_glVertexAttrib4fNV)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttrib4fvNV; +void APIENTRY bluegl_glVertexAttrib4fvNV (GLuint index, const GLfloat *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4fvNV) (GLuint index, const GLfloat *v); + return ((PFN_glVertexAttrib4fvNV)__blue_glCore_glVertexAttrib4fvNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4sNV; +void APIENTRY bluegl_glVertexAttrib4sNV (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) { + typedef void (APIENTRYP PFN_glVertexAttrib4sNV) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); + return ((PFN_glVertexAttrib4sNV)__blue_glCore_glVertexAttrib4sNV)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttrib4svNV; +void APIENTRY bluegl_glVertexAttrib4svNV (GLuint index, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4svNV) (GLuint index, const GLshort *v); + return ((PFN_glVertexAttrib4svNV)__blue_glCore_glVertexAttrib4svNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttrib4ubNV; +void APIENTRY bluegl_glVertexAttrib4ubNV (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) { + typedef void (APIENTRYP PFN_glVertexAttrib4ubNV) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); + return ((PFN_glVertexAttrib4ubNV)__blue_glCore_glVertexAttrib4ubNV)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttrib4ubvNV; +void APIENTRY bluegl_glVertexAttrib4ubvNV (GLuint index, const GLubyte *v) { + typedef void (APIENTRYP PFN_glVertexAttrib4ubvNV) (GLuint index, const GLubyte *v); + return ((PFN_glVertexAttrib4ubvNV)__blue_glCore_glVertexAttrib4ubvNV)(index, v); +} + +extern void* __blue_glCore_glVertexAttribs1dvNV; +void APIENTRY bluegl_glVertexAttribs1dvNV (GLuint index, GLsizei count, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttribs1dvNV) (GLuint index, GLsizei count, const GLdouble *v); + return ((PFN_glVertexAttribs1dvNV)__blue_glCore_glVertexAttribs1dvNV)(index, count, v); +} + +extern void* __blue_glCore_glVertexAttribs1fvNV; +void APIENTRY bluegl_glVertexAttribs1fvNV (GLuint index, GLsizei count, const GLfloat *v) { + typedef void (APIENTRYP PFN_glVertexAttribs1fvNV) (GLuint index, GLsizei count, const GLfloat *v); + return ((PFN_glVertexAttribs1fvNV)__blue_glCore_glVertexAttribs1fvNV)(index, count, v); +} + +extern void* __blue_glCore_glVertexAttribs1svNV; +void APIENTRY bluegl_glVertexAttribs1svNV (GLuint index, GLsizei count, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttribs1svNV) (GLuint index, GLsizei count, const GLshort *v); + return ((PFN_glVertexAttribs1svNV)__blue_glCore_glVertexAttribs1svNV)(index, count, v); +} + +extern void* __blue_glCore_glVertexAttribs2dvNV; +void APIENTRY bluegl_glVertexAttribs2dvNV (GLuint index, GLsizei count, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttribs2dvNV) (GLuint index, GLsizei count, const GLdouble *v); + return ((PFN_glVertexAttribs2dvNV)__blue_glCore_glVertexAttribs2dvNV)(index, count, v); +} + +extern void* __blue_glCore_glVertexAttribs2fvNV; +void APIENTRY bluegl_glVertexAttribs2fvNV (GLuint index, GLsizei count, const GLfloat *v) { + typedef void (APIENTRYP PFN_glVertexAttribs2fvNV) (GLuint index, GLsizei count, const GLfloat *v); + return ((PFN_glVertexAttribs2fvNV)__blue_glCore_glVertexAttribs2fvNV)(index, count, v); +} + +extern void* __blue_glCore_glVertexAttribs2svNV; +void APIENTRY bluegl_glVertexAttribs2svNV (GLuint index, GLsizei count, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttribs2svNV) (GLuint index, GLsizei count, const GLshort *v); + return ((PFN_glVertexAttribs2svNV)__blue_glCore_glVertexAttribs2svNV)(index, count, v); +} + +extern void* __blue_glCore_glVertexAttribs3dvNV; +void APIENTRY bluegl_glVertexAttribs3dvNV (GLuint index, GLsizei count, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttribs3dvNV) (GLuint index, GLsizei count, const GLdouble *v); + return ((PFN_glVertexAttribs3dvNV)__blue_glCore_glVertexAttribs3dvNV)(index, count, v); +} + +extern void* __blue_glCore_glVertexAttribs3fvNV; +void APIENTRY bluegl_glVertexAttribs3fvNV (GLuint index, GLsizei count, const GLfloat *v) { + typedef void (APIENTRYP PFN_glVertexAttribs3fvNV) (GLuint index, GLsizei count, const GLfloat *v); + return ((PFN_glVertexAttribs3fvNV)__blue_glCore_glVertexAttribs3fvNV)(index, count, v); +} + +extern void* __blue_glCore_glVertexAttribs3svNV; +void APIENTRY bluegl_glVertexAttribs3svNV (GLuint index, GLsizei count, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttribs3svNV) (GLuint index, GLsizei count, const GLshort *v); + return ((PFN_glVertexAttribs3svNV)__blue_glCore_glVertexAttribs3svNV)(index, count, v); +} + +extern void* __blue_glCore_glVertexAttribs4dvNV; +void APIENTRY bluegl_glVertexAttribs4dvNV (GLuint index, GLsizei count, const GLdouble *v) { + typedef void (APIENTRYP PFN_glVertexAttribs4dvNV) (GLuint index, GLsizei count, const GLdouble *v); + return ((PFN_glVertexAttribs4dvNV)__blue_glCore_glVertexAttribs4dvNV)(index, count, v); +} + +extern void* __blue_glCore_glVertexAttribs4fvNV; +void APIENTRY bluegl_glVertexAttribs4fvNV (GLuint index, GLsizei count, const GLfloat *v) { + typedef void (APIENTRYP PFN_glVertexAttribs4fvNV) (GLuint index, GLsizei count, const GLfloat *v); + return ((PFN_glVertexAttribs4fvNV)__blue_glCore_glVertexAttribs4fvNV)(index, count, v); +} + +extern void* __blue_glCore_glVertexAttribs4svNV; +void APIENTRY bluegl_glVertexAttribs4svNV (GLuint index, GLsizei count, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttribs4svNV) (GLuint index, GLsizei count, const GLshort *v); + return ((PFN_glVertexAttribs4svNV)__blue_glCore_glVertexAttribs4svNV)(index, count, v); +} + +extern void* __blue_glCore_glVertexAttribs4ubvNV; +void APIENTRY bluegl_glVertexAttribs4ubvNV (GLuint index, GLsizei count, const GLubyte *v) { + typedef void (APIENTRYP PFN_glVertexAttribs4ubvNV) (GLuint index, GLsizei count, const GLubyte *v); + return ((PFN_glVertexAttribs4ubvNV)__blue_glCore_glVertexAttribs4ubvNV)(index, count, v); +} + +extern void* __blue_glCore_glVertexAttribI1iEXT; +void APIENTRY bluegl_glVertexAttribI1iEXT (GLuint index, GLint x) { + typedef void (APIENTRYP PFN_glVertexAttribI1iEXT) (GLuint index, GLint x); + return ((PFN_glVertexAttribI1iEXT)__blue_glCore_glVertexAttribI1iEXT)(index, x); +} + +extern void* __blue_glCore_glVertexAttribI2iEXT; +void APIENTRY bluegl_glVertexAttribI2iEXT (GLuint index, GLint x, GLint y) { + typedef void (APIENTRYP PFN_glVertexAttribI2iEXT) (GLuint index, GLint x, GLint y); + return ((PFN_glVertexAttribI2iEXT)__blue_glCore_glVertexAttribI2iEXT)(index, x, y); +} + +extern void* __blue_glCore_glVertexAttribI3iEXT; +void APIENTRY bluegl_glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z) { + typedef void (APIENTRYP PFN_glVertexAttribI3iEXT) (GLuint index, GLint x, GLint y, GLint z); + return ((PFN_glVertexAttribI3iEXT)__blue_glCore_glVertexAttribI3iEXT)(index, x, y, z); +} + +extern void* __blue_glCore_glVertexAttribI4iEXT; +void APIENTRY bluegl_glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w) { + typedef void (APIENTRYP PFN_glVertexAttribI4iEXT) (GLuint index, GLint x, GLint y, GLint z, GLint w); + return ((PFN_glVertexAttribI4iEXT)__blue_glCore_glVertexAttribI4iEXT)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttribI1uiEXT; +void APIENTRY bluegl_glVertexAttribI1uiEXT (GLuint index, GLuint x) { + typedef void (APIENTRYP PFN_glVertexAttribI1uiEXT) (GLuint index, GLuint x); + return ((PFN_glVertexAttribI1uiEXT)__blue_glCore_glVertexAttribI1uiEXT)(index, x); +} + +extern void* __blue_glCore_glVertexAttribI2uiEXT; +void APIENTRY bluegl_glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y) { + typedef void (APIENTRYP PFN_glVertexAttribI2uiEXT) (GLuint index, GLuint x, GLuint y); + return ((PFN_glVertexAttribI2uiEXT)__blue_glCore_glVertexAttribI2uiEXT)(index, x, y); +} + +extern void* __blue_glCore_glVertexAttribI3uiEXT; +void APIENTRY bluegl_glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z) { + typedef void (APIENTRYP PFN_glVertexAttribI3uiEXT) (GLuint index, GLuint x, GLuint y, GLuint z); + return ((PFN_glVertexAttribI3uiEXT)__blue_glCore_glVertexAttribI3uiEXT)(index, x, y, z); +} + +extern void* __blue_glCore_glVertexAttribI4uiEXT; +void APIENTRY bluegl_glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) { + typedef void (APIENTRYP PFN_glVertexAttribI4uiEXT) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); + return ((PFN_glVertexAttribI4uiEXT)__blue_glCore_glVertexAttribI4uiEXT)(index, x, y, z, w); +} + +extern void* __blue_glCore_glVertexAttribI1ivEXT; +void APIENTRY bluegl_glVertexAttribI1ivEXT (GLuint index, const GLint *v) { + typedef void (APIENTRYP PFN_glVertexAttribI1ivEXT) (GLuint index, const GLint *v); + return ((PFN_glVertexAttribI1ivEXT)__blue_glCore_glVertexAttribI1ivEXT)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI2ivEXT; +void APIENTRY bluegl_glVertexAttribI2ivEXT (GLuint index, const GLint *v) { + typedef void (APIENTRYP PFN_glVertexAttribI2ivEXT) (GLuint index, const GLint *v); + return ((PFN_glVertexAttribI2ivEXT)__blue_glCore_glVertexAttribI2ivEXT)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI3ivEXT; +void APIENTRY bluegl_glVertexAttribI3ivEXT (GLuint index, const GLint *v) { + typedef void (APIENTRYP PFN_glVertexAttribI3ivEXT) (GLuint index, const GLint *v); + return ((PFN_glVertexAttribI3ivEXT)__blue_glCore_glVertexAttribI3ivEXT)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI4ivEXT; +void APIENTRY bluegl_glVertexAttribI4ivEXT (GLuint index, const GLint *v) { + typedef void (APIENTRYP PFN_glVertexAttribI4ivEXT) (GLuint index, const GLint *v); + return ((PFN_glVertexAttribI4ivEXT)__blue_glCore_glVertexAttribI4ivEXT)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI1uivEXT; +void APIENTRY bluegl_glVertexAttribI1uivEXT (GLuint index, const GLuint *v) { + typedef void (APIENTRYP PFN_glVertexAttribI1uivEXT) (GLuint index, const GLuint *v); + return ((PFN_glVertexAttribI1uivEXT)__blue_glCore_glVertexAttribI1uivEXT)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI2uivEXT; +void APIENTRY bluegl_glVertexAttribI2uivEXT (GLuint index, const GLuint *v) { + typedef void (APIENTRYP PFN_glVertexAttribI2uivEXT) (GLuint index, const GLuint *v); + return ((PFN_glVertexAttribI2uivEXT)__blue_glCore_glVertexAttribI2uivEXT)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI3uivEXT; +void APIENTRY bluegl_glVertexAttribI3uivEXT (GLuint index, const GLuint *v) { + typedef void (APIENTRYP PFN_glVertexAttribI3uivEXT) (GLuint index, const GLuint *v); + return ((PFN_glVertexAttribI3uivEXT)__blue_glCore_glVertexAttribI3uivEXT)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI4uivEXT; +void APIENTRY bluegl_glVertexAttribI4uivEXT (GLuint index, const GLuint *v) { + typedef void (APIENTRYP PFN_glVertexAttribI4uivEXT) (GLuint index, const GLuint *v); + return ((PFN_glVertexAttribI4uivEXT)__blue_glCore_glVertexAttribI4uivEXT)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI4bvEXT; +void APIENTRY bluegl_glVertexAttribI4bvEXT (GLuint index, const GLbyte *v) { + typedef void (APIENTRYP PFN_glVertexAttribI4bvEXT) (GLuint index, const GLbyte *v); + return ((PFN_glVertexAttribI4bvEXT)__blue_glCore_glVertexAttribI4bvEXT)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI4svEXT; +void APIENTRY bluegl_glVertexAttribI4svEXT (GLuint index, const GLshort *v) { + typedef void (APIENTRYP PFN_glVertexAttribI4svEXT) (GLuint index, const GLshort *v); + return ((PFN_glVertexAttribI4svEXT)__blue_glCore_glVertexAttribI4svEXT)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI4ubvEXT; +void APIENTRY bluegl_glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v) { + typedef void (APIENTRYP PFN_glVertexAttribI4ubvEXT) (GLuint index, const GLubyte *v); + return ((PFN_glVertexAttribI4ubvEXT)__blue_glCore_glVertexAttribI4ubvEXT)(index, v); +} + +extern void* __blue_glCore_glVertexAttribI4usvEXT; +void APIENTRY bluegl_glVertexAttribI4usvEXT (GLuint index, const GLushort *v) { + typedef void (APIENTRYP PFN_glVertexAttribI4usvEXT) (GLuint index, const GLushort *v); + return ((PFN_glVertexAttribI4usvEXT)__blue_glCore_glVertexAttribI4usvEXT)(index, v); +} + +extern void* __blue_glCore_glVertexAttribIPointerEXT; +void APIENTRY bluegl_glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer) { + typedef void (APIENTRYP PFN_glVertexAttribIPointerEXT) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); + return ((PFN_glVertexAttribIPointerEXT)__blue_glCore_glVertexAttribIPointerEXT)(index, size, type, stride, pointer); +} + +extern void* __blue_glCore_glGetVertexAttribIivEXT; +void APIENTRY bluegl_glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribIivEXT) (GLuint index, GLenum pname, GLint *params); + return ((PFN_glGetVertexAttribIivEXT)__blue_glCore_glGetVertexAttribIivEXT)(index, pname, params); +} + +extern void* __blue_glCore_glGetVertexAttribIuivEXT; +void APIENTRY bluegl_glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params) { + typedef void (APIENTRYP PFN_glGetVertexAttribIuivEXT) (GLuint index, GLenum pname, GLuint *params); + return ((PFN_glGetVertexAttribIuivEXT)__blue_glCore_glGetVertexAttribIuivEXT)(index, pname, params); +} + +extern void* __blue_glCore_glBeginVideoCaptureNV; +void APIENTRY bluegl_glBeginVideoCaptureNV (GLuint video_capture_slot) { + typedef void (APIENTRYP PFN_glBeginVideoCaptureNV) (GLuint video_capture_slot); + return ((PFN_glBeginVideoCaptureNV)__blue_glCore_glBeginVideoCaptureNV)(video_capture_slot); +} + +extern void* __blue_glCore_glBindVideoCaptureStreamBufferNV; +void APIENTRY bluegl_glBindVideoCaptureStreamBufferNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset) { + typedef void (APIENTRYP PFN_glBindVideoCaptureStreamBufferNV) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); + return ((PFN_glBindVideoCaptureStreamBufferNV)__blue_glCore_glBindVideoCaptureStreamBufferNV)(video_capture_slot, stream, frame_region, offset); +} + +extern void* __blue_glCore_glBindVideoCaptureStreamTextureNV; +void APIENTRY bluegl_glBindVideoCaptureStreamTextureNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture) { + typedef void (APIENTRYP PFN_glBindVideoCaptureStreamTextureNV) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); + return ((PFN_glBindVideoCaptureStreamTextureNV)__blue_glCore_glBindVideoCaptureStreamTextureNV)(video_capture_slot, stream, frame_region, target, texture); +} + +extern void* __blue_glCore_glEndVideoCaptureNV; +void APIENTRY bluegl_glEndVideoCaptureNV (GLuint video_capture_slot) { + typedef void (APIENTRYP PFN_glEndVideoCaptureNV) (GLuint video_capture_slot); + return ((PFN_glEndVideoCaptureNV)__blue_glCore_glEndVideoCaptureNV)(video_capture_slot); +} + +extern void* __blue_glCore_glGetVideoCaptureivNV; +void APIENTRY bluegl_glGetVideoCaptureivNV (GLuint video_capture_slot, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetVideoCaptureivNV) (GLuint video_capture_slot, GLenum pname, GLint *params); + return ((PFN_glGetVideoCaptureivNV)__blue_glCore_glGetVideoCaptureivNV)(video_capture_slot, pname, params); +} + +extern void* __blue_glCore_glGetVideoCaptureStreamivNV; +void APIENTRY bluegl_glGetVideoCaptureStreamivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetVideoCaptureStreamivNV) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); + return ((PFN_glGetVideoCaptureStreamivNV)__blue_glCore_glGetVideoCaptureStreamivNV)(video_capture_slot, stream, pname, params); +} + +extern void* __blue_glCore_glGetVideoCaptureStreamfvNV; +void APIENTRY bluegl_glGetVideoCaptureStreamfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetVideoCaptureStreamfvNV) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); + return ((PFN_glGetVideoCaptureStreamfvNV)__blue_glCore_glGetVideoCaptureStreamfvNV)(video_capture_slot, stream, pname, params); +} + +extern void* __blue_glCore_glGetVideoCaptureStreamdvNV; +void APIENTRY bluegl_glGetVideoCaptureStreamdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params) { + typedef void (APIENTRYP PFN_glGetVideoCaptureStreamdvNV) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); + return ((PFN_glGetVideoCaptureStreamdvNV)__blue_glCore_glGetVideoCaptureStreamdvNV)(video_capture_slot, stream, pname, params); +} + +extern void* __blue_glCore_glVideoCaptureNV; +GLenum APIENTRY bluegl_glVideoCaptureNV (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time) { + typedef GLenum (APIENTRYP PFN_glVideoCaptureNV) (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); + return ((PFN_glVideoCaptureNV)__blue_glCore_glVideoCaptureNV)(video_capture_slot, sequence_num, capture_time); +} + +extern void* __blue_glCore_glVideoCaptureStreamParameterivNV; +void APIENTRY bluegl_glVideoCaptureStreamParameterivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glVideoCaptureStreamParameterivNV) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); + return ((PFN_glVideoCaptureStreamParameterivNV)__blue_glCore_glVideoCaptureStreamParameterivNV)(video_capture_slot, stream, pname, params); +} + +extern void* __blue_glCore_glVideoCaptureStreamParameterfvNV; +void APIENTRY bluegl_glVideoCaptureStreamParameterfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glVideoCaptureStreamParameterfvNV) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); + return ((PFN_glVideoCaptureStreamParameterfvNV)__blue_glCore_glVideoCaptureStreamParameterfvNV)(video_capture_slot, stream, pname, params); +} + +extern void* __blue_glCore_glVideoCaptureStreamParameterdvNV; +void APIENTRY bluegl_glVideoCaptureStreamParameterdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params) { + typedef void (APIENTRYP PFN_glVideoCaptureStreamParameterdvNV) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); + return ((PFN_glVideoCaptureStreamParameterdvNV)__blue_glCore_glVideoCaptureStreamParameterdvNV)(video_capture_slot, stream, pname, params); +} + +extern void* __blue_glCore_glFramebufferTextureMultiviewOVR; +void APIENTRY bluegl_glFramebufferTextureMultiviewOVR (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews) { + typedef void (APIENTRYP PFN_glFramebufferTextureMultiviewOVR) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); + return ((PFN_glFramebufferTextureMultiviewOVR)__blue_glCore_glFramebufferTextureMultiviewOVR)(target, attachment, texture, level, baseViewIndex, numViews); +} + +extern void* __blue_glCore_glHintPGI; +void APIENTRY bluegl_glHintPGI (GLenum target, GLint mode) { + typedef void (APIENTRYP PFN_glHintPGI) (GLenum target, GLint mode); + return ((PFN_glHintPGI)__blue_glCore_glHintPGI)(target, mode); +} + +extern void* __blue_glCore_glDetailTexFuncSGIS; +void APIENTRY bluegl_glDetailTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points) { + typedef void (APIENTRYP PFN_glDetailTexFuncSGIS) (GLenum target, GLsizei n, const GLfloat *points); + return ((PFN_glDetailTexFuncSGIS)__blue_glCore_glDetailTexFuncSGIS)(target, n, points); +} + +extern void* __blue_glCore_glGetDetailTexFuncSGIS; +void APIENTRY bluegl_glGetDetailTexFuncSGIS (GLenum target, GLfloat *points) { + typedef void (APIENTRYP PFN_glGetDetailTexFuncSGIS) (GLenum target, GLfloat *points); + return ((PFN_glGetDetailTexFuncSGIS)__blue_glCore_glGetDetailTexFuncSGIS)(target, points); +} + +extern void* __blue_glCore_glFogFuncSGIS; +void APIENTRY bluegl_glFogFuncSGIS (GLsizei n, const GLfloat *points) { + typedef void (APIENTRYP PFN_glFogFuncSGIS) (GLsizei n, const GLfloat *points); + return ((PFN_glFogFuncSGIS)__blue_glCore_glFogFuncSGIS)(n, points); +} + +extern void* __blue_glCore_glGetFogFuncSGIS; +void APIENTRY bluegl_glGetFogFuncSGIS (GLfloat *points) { + typedef void (APIENTRYP PFN_glGetFogFuncSGIS) (GLfloat *points); + return ((PFN_glGetFogFuncSGIS)__blue_glCore_glGetFogFuncSGIS)(points); +} + +extern void* __blue_glCore_glSampleMaskSGIS; +void APIENTRY bluegl_glSampleMaskSGIS (GLclampf value, GLboolean invert) { + typedef void (APIENTRYP PFN_glSampleMaskSGIS) (GLclampf value, GLboolean invert); + return ((PFN_glSampleMaskSGIS)__blue_glCore_glSampleMaskSGIS)(value, invert); +} + +extern void* __blue_glCore_glSamplePatternSGIS; +void APIENTRY bluegl_glSamplePatternSGIS (GLenum pattern) { + typedef void (APIENTRYP PFN_glSamplePatternSGIS) (GLenum pattern); + return ((PFN_glSamplePatternSGIS)__blue_glCore_glSamplePatternSGIS)(pattern); +} + +extern void* __blue_glCore_glPixelTexGenParameteriSGIS; +void APIENTRY bluegl_glPixelTexGenParameteriSGIS (GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glPixelTexGenParameteriSGIS) (GLenum pname, GLint param); + return ((PFN_glPixelTexGenParameteriSGIS)__blue_glCore_glPixelTexGenParameteriSGIS)(pname, param); +} + +extern void* __blue_glCore_glPixelTexGenParameterivSGIS; +void APIENTRY bluegl_glPixelTexGenParameterivSGIS (GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glPixelTexGenParameterivSGIS) (GLenum pname, const GLint *params); + return ((PFN_glPixelTexGenParameterivSGIS)__blue_glCore_glPixelTexGenParameterivSGIS)(pname, params); +} + +extern void* __blue_glCore_glPixelTexGenParameterfSGIS; +void APIENTRY bluegl_glPixelTexGenParameterfSGIS (GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glPixelTexGenParameterfSGIS) (GLenum pname, GLfloat param); + return ((PFN_glPixelTexGenParameterfSGIS)__blue_glCore_glPixelTexGenParameterfSGIS)(pname, param); +} + +extern void* __blue_glCore_glPixelTexGenParameterfvSGIS; +void APIENTRY bluegl_glPixelTexGenParameterfvSGIS (GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glPixelTexGenParameterfvSGIS) (GLenum pname, const GLfloat *params); + return ((PFN_glPixelTexGenParameterfvSGIS)__blue_glCore_glPixelTexGenParameterfvSGIS)(pname, params); +} + +extern void* __blue_glCore_glGetPixelTexGenParameterivSGIS; +void APIENTRY bluegl_glGetPixelTexGenParameterivSGIS (GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetPixelTexGenParameterivSGIS) (GLenum pname, GLint *params); + return ((PFN_glGetPixelTexGenParameterivSGIS)__blue_glCore_glGetPixelTexGenParameterivSGIS)(pname, params); +} + +extern void* __blue_glCore_glGetPixelTexGenParameterfvSGIS; +void APIENTRY bluegl_glGetPixelTexGenParameterfvSGIS (GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetPixelTexGenParameterfvSGIS) (GLenum pname, GLfloat *params); + return ((PFN_glGetPixelTexGenParameterfvSGIS)__blue_glCore_glGetPixelTexGenParameterfvSGIS)(pname, params); +} + +extern void* __blue_glCore_glPointParameterfSGIS; +void APIENTRY bluegl_glPointParameterfSGIS (GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glPointParameterfSGIS) (GLenum pname, GLfloat param); + return ((PFN_glPointParameterfSGIS)__blue_glCore_glPointParameterfSGIS)(pname, param); +} + +extern void* __blue_glCore_glPointParameterfvSGIS; +void APIENTRY bluegl_glPointParameterfvSGIS (GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glPointParameterfvSGIS) (GLenum pname, const GLfloat *params); + return ((PFN_glPointParameterfvSGIS)__blue_glCore_glPointParameterfvSGIS)(pname, params); +} + +extern void* __blue_glCore_glSharpenTexFuncSGIS; +void APIENTRY bluegl_glSharpenTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points) { + typedef void (APIENTRYP PFN_glSharpenTexFuncSGIS) (GLenum target, GLsizei n, const GLfloat *points); + return ((PFN_glSharpenTexFuncSGIS)__blue_glCore_glSharpenTexFuncSGIS)(target, n, points); +} + +extern void* __blue_glCore_glGetSharpenTexFuncSGIS; +void APIENTRY bluegl_glGetSharpenTexFuncSGIS (GLenum target, GLfloat *points) { + typedef void (APIENTRYP PFN_glGetSharpenTexFuncSGIS) (GLenum target, GLfloat *points); + return ((PFN_glGetSharpenTexFuncSGIS)__blue_glCore_glGetSharpenTexFuncSGIS)(target, points); +} + +extern void* __blue_glCore_glTexImage4DSGIS; +void APIENTRY bluegl_glTexImage4DSGIS (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 PFN_glTexImage4DSGIS) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels); + return ((PFN_glTexImage4DSGIS)__blue_glCore_glTexImage4DSGIS)(target, level, internalformat, width, height, depth, size4d, border, format, type, pixels); +} + +extern void* __blue_glCore_glTexSubImage4DSGIS; +void APIENTRY bluegl_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) { + typedef void (APIENTRYP PFN_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); + return ((PFN_glTexSubImage4DSGIS)__blue_glCore_glTexSubImage4DSGIS)(target, level, xoffset, yoffset, zoffset, woffset, width, height, depth, size4d, format, type, pixels); +} + +extern void* __blue_glCore_glTextureColorMaskSGIS; +void APIENTRY bluegl_glTextureColorMaskSGIS (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) { + typedef void (APIENTRYP PFN_glTextureColorMaskSGIS) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); + return ((PFN_glTextureColorMaskSGIS)__blue_glCore_glTextureColorMaskSGIS)(red, green, blue, alpha); +} + +extern void* __blue_glCore_glGetTexFilterFuncSGIS; +void APIENTRY bluegl_glGetTexFilterFuncSGIS (GLenum target, GLenum filter, GLfloat *weights) { + typedef void (APIENTRYP PFN_glGetTexFilterFuncSGIS) (GLenum target, GLenum filter, GLfloat *weights); + return ((PFN_glGetTexFilterFuncSGIS)__blue_glCore_glGetTexFilterFuncSGIS)(target, filter, weights); +} + +extern void* __blue_glCore_glTexFilterFuncSGIS; +void APIENTRY bluegl_glTexFilterFuncSGIS (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights) { + typedef void (APIENTRYP PFN_glTexFilterFuncSGIS) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); + return ((PFN_glTexFilterFuncSGIS)__blue_glCore_glTexFilterFuncSGIS)(target, filter, n, weights); +} + +extern void* __blue_glCore_glAsyncMarkerSGIX; +void APIENTRY bluegl_glAsyncMarkerSGIX (GLuint marker) { + typedef void (APIENTRYP PFN_glAsyncMarkerSGIX) (GLuint marker); + return ((PFN_glAsyncMarkerSGIX)__blue_glCore_glAsyncMarkerSGIX)(marker); +} + +extern void* __blue_glCore_glFinishAsyncSGIX; +GLint APIENTRY bluegl_glFinishAsyncSGIX (GLuint *markerp) { + typedef GLint (APIENTRYP PFN_glFinishAsyncSGIX) (GLuint *markerp); + return ((PFN_glFinishAsyncSGIX)__blue_glCore_glFinishAsyncSGIX)(markerp); +} + +extern void* __blue_glCore_glPollAsyncSGIX; +GLint APIENTRY bluegl_glPollAsyncSGIX (GLuint *markerp) { + typedef GLint (APIENTRYP PFN_glPollAsyncSGIX) (GLuint *markerp); + return ((PFN_glPollAsyncSGIX)__blue_glCore_glPollAsyncSGIX)(markerp); +} + +extern void* __blue_glCore_glGenAsyncMarkersSGIX; +GLuint APIENTRY bluegl_glGenAsyncMarkersSGIX (GLsizei range) { + typedef GLuint (APIENTRYP PFN_glGenAsyncMarkersSGIX) (GLsizei range); + return ((PFN_glGenAsyncMarkersSGIX)__blue_glCore_glGenAsyncMarkersSGIX)(range); +} + +extern void* __blue_glCore_glDeleteAsyncMarkersSGIX; +void APIENTRY bluegl_glDeleteAsyncMarkersSGIX (GLuint marker, GLsizei range) { + typedef void (APIENTRYP PFN_glDeleteAsyncMarkersSGIX) (GLuint marker, GLsizei range); + return ((PFN_glDeleteAsyncMarkersSGIX)__blue_glCore_glDeleteAsyncMarkersSGIX)(marker, range); +} + +extern void* __blue_glCore_glIsAsyncMarkerSGIX; +GLboolean APIENTRY bluegl_glIsAsyncMarkerSGIX (GLuint marker) { + typedef GLboolean (APIENTRYP PFN_glIsAsyncMarkerSGIX) (GLuint marker); + return ((PFN_glIsAsyncMarkerSGIX)__blue_glCore_glIsAsyncMarkerSGIX)(marker); +} + +extern void* __blue_glCore_glFlushRasterSGIX; +void APIENTRY bluegl_glFlushRasterSGIX (void) { + typedef void (APIENTRYP PFN_glFlushRasterSGIX) (void); + return ((PFN_glFlushRasterSGIX)__blue_glCore_glFlushRasterSGIX)(); +} + +extern void* __blue_glCore_glFragmentColorMaterialSGIX; +void APIENTRY bluegl_glFragmentColorMaterialSGIX (GLenum face, GLenum mode) { + typedef void (APIENTRYP PFN_glFragmentColorMaterialSGIX) (GLenum face, GLenum mode); + return ((PFN_glFragmentColorMaterialSGIX)__blue_glCore_glFragmentColorMaterialSGIX)(face, mode); +} + +extern void* __blue_glCore_glFragmentLightfSGIX; +void APIENTRY bluegl_glFragmentLightfSGIX (GLenum light, GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glFragmentLightfSGIX) (GLenum light, GLenum pname, GLfloat param); + return ((PFN_glFragmentLightfSGIX)__blue_glCore_glFragmentLightfSGIX)(light, pname, param); +} + +extern void* __blue_glCore_glFragmentLightfvSGIX; +void APIENTRY bluegl_glFragmentLightfvSGIX (GLenum light, GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glFragmentLightfvSGIX) (GLenum light, GLenum pname, const GLfloat *params); + return ((PFN_glFragmentLightfvSGIX)__blue_glCore_glFragmentLightfvSGIX)(light, pname, params); +} + +extern void* __blue_glCore_glFragmentLightiSGIX; +void APIENTRY bluegl_glFragmentLightiSGIX (GLenum light, GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glFragmentLightiSGIX) (GLenum light, GLenum pname, GLint param); + return ((PFN_glFragmentLightiSGIX)__blue_glCore_glFragmentLightiSGIX)(light, pname, param); +} + +extern void* __blue_glCore_glFragmentLightivSGIX; +void APIENTRY bluegl_glFragmentLightivSGIX (GLenum light, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glFragmentLightivSGIX) (GLenum light, GLenum pname, const GLint *params); + return ((PFN_glFragmentLightivSGIX)__blue_glCore_glFragmentLightivSGIX)(light, pname, params); +} + +extern void* __blue_glCore_glFragmentLightModelfSGIX; +void APIENTRY bluegl_glFragmentLightModelfSGIX (GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glFragmentLightModelfSGIX) (GLenum pname, GLfloat param); + return ((PFN_glFragmentLightModelfSGIX)__blue_glCore_glFragmentLightModelfSGIX)(pname, param); +} + +extern void* __blue_glCore_glFragmentLightModelfvSGIX; +void APIENTRY bluegl_glFragmentLightModelfvSGIX (GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glFragmentLightModelfvSGIX) (GLenum pname, const GLfloat *params); + return ((PFN_glFragmentLightModelfvSGIX)__blue_glCore_glFragmentLightModelfvSGIX)(pname, params); +} + +extern void* __blue_glCore_glFragmentLightModeliSGIX; +void APIENTRY bluegl_glFragmentLightModeliSGIX (GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glFragmentLightModeliSGIX) (GLenum pname, GLint param); + return ((PFN_glFragmentLightModeliSGIX)__blue_glCore_glFragmentLightModeliSGIX)(pname, param); +} + +extern void* __blue_glCore_glFragmentLightModelivSGIX; +void APIENTRY bluegl_glFragmentLightModelivSGIX (GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glFragmentLightModelivSGIX) (GLenum pname, const GLint *params); + return ((PFN_glFragmentLightModelivSGIX)__blue_glCore_glFragmentLightModelivSGIX)(pname, params); +} + +extern void* __blue_glCore_glFragmentMaterialfSGIX; +void APIENTRY bluegl_glFragmentMaterialfSGIX (GLenum face, GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glFragmentMaterialfSGIX) (GLenum face, GLenum pname, GLfloat param); + return ((PFN_glFragmentMaterialfSGIX)__blue_glCore_glFragmentMaterialfSGIX)(face, pname, param); +} + +extern void* __blue_glCore_glFragmentMaterialfvSGIX; +void APIENTRY bluegl_glFragmentMaterialfvSGIX (GLenum face, GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glFragmentMaterialfvSGIX) (GLenum face, GLenum pname, const GLfloat *params); + return ((PFN_glFragmentMaterialfvSGIX)__blue_glCore_glFragmentMaterialfvSGIX)(face, pname, params); +} + +extern void* __blue_glCore_glFragmentMaterialiSGIX; +void APIENTRY bluegl_glFragmentMaterialiSGIX (GLenum face, GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glFragmentMaterialiSGIX) (GLenum face, GLenum pname, GLint param); + return ((PFN_glFragmentMaterialiSGIX)__blue_glCore_glFragmentMaterialiSGIX)(face, pname, param); +} + +extern void* __blue_glCore_glFragmentMaterialivSGIX; +void APIENTRY bluegl_glFragmentMaterialivSGIX (GLenum face, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glFragmentMaterialivSGIX) (GLenum face, GLenum pname, const GLint *params); + return ((PFN_glFragmentMaterialivSGIX)__blue_glCore_glFragmentMaterialivSGIX)(face, pname, params); +} + +extern void* __blue_glCore_glGetFragmentLightfvSGIX; +void APIENTRY bluegl_glGetFragmentLightfvSGIX (GLenum light, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetFragmentLightfvSGIX) (GLenum light, GLenum pname, GLfloat *params); + return ((PFN_glGetFragmentLightfvSGIX)__blue_glCore_glGetFragmentLightfvSGIX)(light, pname, params); +} + +extern void* __blue_glCore_glGetFragmentLightivSGIX; +void APIENTRY bluegl_glGetFragmentLightivSGIX (GLenum light, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetFragmentLightivSGIX) (GLenum light, GLenum pname, GLint *params); + return ((PFN_glGetFragmentLightivSGIX)__blue_glCore_glGetFragmentLightivSGIX)(light, pname, params); +} + +extern void* __blue_glCore_glGetFragmentMaterialfvSGIX; +void APIENTRY bluegl_glGetFragmentMaterialfvSGIX (GLenum face, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetFragmentMaterialfvSGIX) (GLenum face, GLenum pname, GLfloat *params); + return ((PFN_glGetFragmentMaterialfvSGIX)__blue_glCore_glGetFragmentMaterialfvSGIX)(face, pname, params); +} + +extern void* __blue_glCore_glGetFragmentMaterialivSGIX; +void APIENTRY bluegl_glGetFragmentMaterialivSGIX (GLenum face, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetFragmentMaterialivSGIX) (GLenum face, GLenum pname, GLint *params); + return ((PFN_glGetFragmentMaterialivSGIX)__blue_glCore_glGetFragmentMaterialivSGIX)(face, pname, params); +} + +extern void* __blue_glCore_glLightEnviSGIX; +void APIENTRY bluegl_glLightEnviSGIX (GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glLightEnviSGIX) (GLenum pname, GLint param); + return ((PFN_glLightEnviSGIX)__blue_glCore_glLightEnviSGIX)(pname, param); +} + +extern void* __blue_glCore_glFrameZoomSGIX; +void APIENTRY bluegl_glFrameZoomSGIX (GLint factor) { + typedef void (APIENTRYP PFN_glFrameZoomSGIX) (GLint factor); + return ((PFN_glFrameZoomSGIX)__blue_glCore_glFrameZoomSGIX)(factor); +} + +extern void* __blue_glCore_glIglooInterfaceSGIX; +void APIENTRY bluegl_glIglooInterfaceSGIX (GLenum pname, const void *params) { + typedef void (APIENTRYP PFN_glIglooInterfaceSGIX) (GLenum pname, const void *params); + return ((PFN_glIglooInterfaceSGIX)__blue_glCore_glIglooInterfaceSGIX)(pname, params); +} + +extern void* __blue_glCore_glGetInstrumentsSGIX; +GLint APIENTRY bluegl_glGetInstrumentsSGIX (void) { + typedef GLint (APIENTRYP PFN_glGetInstrumentsSGIX) (void); + return ((PFN_glGetInstrumentsSGIX)__blue_glCore_glGetInstrumentsSGIX)(); +} + +extern void* __blue_glCore_glInstrumentsBufferSGIX; +void APIENTRY bluegl_glInstrumentsBufferSGIX (GLsizei size, GLint *buffer) { + typedef void (APIENTRYP PFN_glInstrumentsBufferSGIX) (GLsizei size, GLint *buffer); + return ((PFN_glInstrumentsBufferSGIX)__blue_glCore_glInstrumentsBufferSGIX)(size, buffer); +} + +extern void* __blue_glCore_glPollInstrumentsSGIX; +GLint APIENTRY bluegl_glPollInstrumentsSGIX (GLint *marker_p) { + typedef GLint (APIENTRYP PFN_glPollInstrumentsSGIX) (GLint *marker_p); + return ((PFN_glPollInstrumentsSGIX)__blue_glCore_glPollInstrumentsSGIX)(marker_p); +} + +extern void* __blue_glCore_glReadInstrumentsSGIX; +void APIENTRY bluegl_glReadInstrumentsSGIX (GLint marker) { + typedef void (APIENTRYP PFN_glReadInstrumentsSGIX) (GLint marker); + return ((PFN_glReadInstrumentsSGIX)__blue_glCore_glReadInstrumentsSGIX)(marker); +} + +extern void* __blue_glCore_glStartInstrumentsSGIX; +void APIENTRY bluegl_glStartInstrumentsSGIX (void) { + typedef void (APIENTRYP PFN_glStartInstrumentsSGIX) (void); + return ((PFN_glStartInstrumentsSGIX)__blue_glCore_glStartInstrumentsSGIX)(); +} + +extern void* __blue_glCore_glStopInstrumentsSGIX; +void APIENTRY bluegl_glStopInstrumentsSGIX (GLint marker) { + typedef void (APIENTRYP PFN_glStopInstrumentsSGIX) (GLint marker); + return ((PFN_glStopInstrumentsSGIX)__blue_glCore_glStopInstrumentsSGIX)(marker); +} + +extern void* __blue_glCore_glGetListParameterfvSGIX; +void APIENTRY bluegl_glGetListParameterfvSGIX (GLuint list, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetListParameterfvSGIX) (GLuint list, GLenum pname, GLfloat *params); + return ((PFN_glGetListParameterfvSGIX)__blue_glCore_glGetListParameterfvSGIX)(list, pname, params); +} + +extern void* __blue_glCore_glGetListParameterivSGIX; +void APIENTRY bluegl_glGetListParameterivSGIX (GLuint list, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetListParameterivSGIX) (GLuint list, GLenum pname, GLint *params); + return ((PFN_glGetListParameterivSGIX)__blue_glCore_glGetListParameterivSGIX)(list, pname, params); +} + +extern void* __blue_glCore_glListParameterfSGIX; +void APIENTRY bluegl_glListParameterfSGIX (GLuint list, GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glListParameterfSGIX) (GLuint list, GLenum pname, GLfloat param); + return ((PFN_glListParameterfSGIX)__blue_glCore_glListParameterfSGIX)(list, pname, param); +} + +extern void* __blue_glCore_glListParameterfvSGIX; +void APIENTRY bluegl_glListParameterfvSGIX (GLuint list, GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glListParameterfvSGIX) (GLuint list, GLenum pname, const GLfloat *params); + return ((PFN_glListParameterfvSGIX)__blue_glCore_glListParameterfvSGIX)(list, pname, params); +} + +extern void* __blue_glCore_glListParameteriSGIX; +void APIENTRY bluegl_glListParameteriSGIX (GLuint list, GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glListParameteriSGIX) (GLuint list, GLenum pname, GLint param); + return ((PFN_glListParameteriSGIX)__blue_glCore_glListParameteriSGIX)(list, pname, param); +} + +extern void* __blue_glCore_glListParameterivSGIX; +void APIENTRY bluegl_glListParameterivSGIX (GLuint list, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glListParameterivSGIX) (GLuint list, GLenum pname, const GLint *params); + return ((PFN_glListParameterivSGIX)__blue_glCore_glListParameterivSGIX)(list, pname, params); +} + +extern void* __blue_glCore_glPixelTexGenSGIX; +void APIENTRY bluegl_glPixelTexGenSGIX (GLenum mode) { + typedef void (APIENTRYP PFN_glPixelTexGenSGIX) (GLenum mode); + return ((PFN_glPixelTexGenSGIX)__blue_glCore_glPixelTexGenSGIX)(mode); +} + +extern void* __blue_glCore_glDeformationMap3dSGIX; +void APIENTRY bluegl_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) { + typedef void (APIENTRYP PFN_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); + return ((PFN_glDeformationMap3dSGIX)__blue_glCore_glDeformationMap3dSGIX)(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, w1, w2, wstride, worder, points); +} + +extern void* __blue_glCore_glDeformationMap3fSGIX; +void APIENTRY bluegl_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) { + typedef void (APIENTRYP PFN_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); + return ((PFN_glDeformationMap3fSGIX)__blue_glCore_glDeformationMap3fSGIX)(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, w1, w2, wstride, worder, points); +} + +extern void* __blue_glCore_glDeformSGIX; +void APIENTRY bluegl_glDeformSGIX (GLbitfield mask) { + typedef void (APIENTRYP PFN_glDeformSGIX) (GLbitfield mask); + return ((PFN_glDeformSGIX)__blue_glCore_glDeformSGIX)(mask); +} + +extern void* __blue_glCore_glLoadIdentityDeformationMapSGIX; +void APIENTRY bluegl_glLoadIdentityDeformationMapSGIX (GLbitfield mask) { + typedef void (APIENTRYP PFN_glLoadIdentityDeformationMapSGIX) (GLbitfield mask); + return ((PFN_glLoadIdentityDeformationMapSGIX)__blue_glCore_glLoadIdentityDeformationMapSGIX)(mask); +} + +extern void* __blue_glCore_glReferencePlaneSGIX; +void APIENTRY bluegl_glReferencePlaneSGIX (const GLdouble *equation) { + typedef void (APIENTRYP PFN_glReferencePlaneSGIX) (const GLdouble *equation); + return ((PFN_glReferencePlaneSGIX)__blue_glCore_glReferencePlaneSGIX)(equation); +} + +extern void* __blue_glCore_glSpriteParameterfSGIX; +void APIENTRY bluegl_glSpriteParameterfSGIX (GLenum pname, GLfloat param) { + typedef void (APIENTRYP PFN_glSpriteParameterfSGIX) (GLenum pname, GLfloat param); + return ((PFN_glSpriteParameterfSGIX)__blue_glCore_glSpriteParameterfSGIX)(pname, param); +} + +extern void* __blue_glCore_glSpriteParameterfvSGIX; +void APIENTRY bluegl_glSpriteParameterfvSGIX (GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glSpriteParameterfvSGIX) (GLenum pname, const GLfloat *params); + return ((PFN_glSpriteParameterfvSGIX)__blue_glCore_glSpriteParameterfvSGIX)(pname, params); +} + +extern void* __blue_glCore_glSpriteParameteriSGIX; +void APIENTRY bluegl_glSpriteParameteriSGIX (GLenum pname, GLint param) { + typedef void (APIENTRYP PFN_glSpriteParameteriSGIX) (GLenum pname, GLint param); + return ((PFN_glSpriteParameteriSGIX)__blue_glCore_glSpriteParameteriSGIX)(pname, param); +} + +extern void* __blue_glCore_glSpriteParameterivSGIX; +void APIENTRY bluegl_glSpriteParameterivSGIX (GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glSpriteParameterivSGIX) (GLenum pname, const GLint *params); + return ((PFN_glSpriteParameterivSGIX)__blue_glCore_glSpriteParameterivSGIX)(pname, params); +} + +extern void* __blue_glCore_glTagSampleBufferSGIX; +void APIENTRY bluegl_glTagSampleBufferSGIX (void) { + typedef void (APIENTRYP PFN_glTagSampleBufferSGIX) (void); + return ((PFN_glTagSampleBufferSGIX)__blue_glCore_glTagSampleBufferSGIX)(); +} + +extern void* __blue_glCore_glColorTableSGI; +void APIENTRY bluegl_glColorTableSGI (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table) { + typedef void (APIENTRYP PFN_glColorTableSGI) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); + return ((PFN_glColorTableSGI)__blue_glCore_glColorTableSGI)(target, internalformat, width, format, type, table); +} + +extern void* __blue_glCore_glColorTableParameterfvSGI; +void APIENTRY bluegl_glColorTableParameterfvSGI (GLenum target, GLenum pname, const GLfloat *params) { + typedef void (APIENTRYP PFN_glColorTableParameterfvSGI) (GLenum target, GLenum pname, const GLfloat *params); + return ((PFN_glColorTableParameterfvSGI)__blue_glCore_glColorTableParameterfvSGI)(target, pname, params); +} + +extern void* __blue_glCore_glColorTableParameterivSGI; +void APIENTRY bluegl_glColorTableParameterivSGI (GLenum target, GLenum pname, const GLint *params) { + typedef void (APIENTRYP PFN_glColorTableParameterivSGI) (GLenum target, GLenum pname, const GLint *params); + return ((PFN_glColorTableParameterivSGI)__blue_glCore_glColorTableParameterivSGI)(target, pname, params); +} + +extern void* __blue_glCore_glCopyColorTableSGI; +void APIENTRY bluegl_glCopyColorTableSGI (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) { + typedef void (APIENTRYP PFN_glCopyColorTableSGI) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); + return ((PFN_glCopyColorTableSGI)__blue_glCore_glCopyColorTableSGI)(target, internalformat, x, y, width); +} + +extern void* __blue_glCore_glGetColorTableSGI; +void APIENTRY bluegl_glGetColorTableSGI (GLenum target, GLenum format, GLenum type, void *table) { + typedef void (APIENTRYP PFN_glGetColorTableSGI) (GLenum target, GLenum format, GLenum type, void *table); + return ((PFN_glGetColorTableSGI)__blue_glCore_glGetColorTableSGI)(target, format, type, table); +} + +extern void* __blue_glCore_glGetColorTableParameterfvSGI; +void APIENTRY bluegl_glGetColorTableParameterfvSGI (GLenum target, GLenum pname, GLfloat *params) { + typedef void (APIENTRYP PFN_glGetColorTableParameterfvSGI) (GLenum target, GLenum pname, GLfloat *params); + return ((PFN_glGetColorTableParameterfvSGI)__blue_glCore_glGetColorTableParameterfvSGI)(target, pname, params); +} + +extern void* __blue_glCore_glGetColorTableParameterivSGI; +void APIENTRY bluegl_glGetColorTableParameterivSGI (GLenum target, GLenum pname, GLint *params) { + typedef void (APIENTRYP PFN_glGetColorTableParameterivSGI) (GLenum target, GLenum pname, GLint *params); + return ((PFN_glGetColorTableParameterivSGI)__blue_glCore_glGetColorTableParameterivSGI)(target, pname, params); +} + +extern void* __blue_glCore_glFinishTextureSUNX; +void APIENTRY bluegl_glFinishTextureSUNX (void) { + typedef void (APIENTRYP PFN_glFinishTextureSUNX) (void); + return ((PFN_glFinishTextureSUNX)__blue_glCore_glFinishTextureSUNX)(); +} + +extern void* __blue_glCore_glGlobalAlphaFactorbSUN; +void APIENTRY bluegl_glGlobalAlphaFactorbSUN (GLbyte factor) { + typedef void (APIENTRYP PFN_glGlobalAlphaFactorbSUN) (GLbyte factor); + return ((PFN_glGlobalAlphaFactorbSUN)__blue_glCore_glGlobalAlphaFactorbSUN)(factor); +} + +extern void* __blue_glCore_glGlobalAlphaFactorsSUN; +void APIENTRY bluegl_glGlobalAlphaFactorsSUN (GLshort factor) { + typedef void (APIENTRYP PFN_glGlobalAlphaFactorsSUN) (GLshort factor); + return ((PFN_glGlobalAlphaFactorsSUN)__blue_glCore_glGlobalAlphaFactorsSUN)(factor); +} + +extern void* __blue_glCore_glGlobalAlphaFactoriSUN; +void APIENTRY bluegl_glGlobalAlphaFactoriSUN (GLint factor) { + typedef void (APIENTRYP PFN_glGlobalAlphaFactoriSUN) (GLint factor); + return ((PFN_glGlobalAlphaFactoriSUN)__blue_glCore_glGlobalAlphaFactoriSUN)(factor); +} + +extern void* __blue_glCore_glGlobalAlphaFactorfSUN; +void APIENTRY bluegl_glGlobalAlphaFactorfSUN (GLfloat factor) { + typedef void (APIENTRYP PFN_glGlobalAlphaFactorfSUN) (GLfloat factor); + return ((PFN_glGlobalAlphaFactorfSUN)__blue_glCore_glGlobalAlphaFactorfSUN)(factor); +} + +extern void* __blue_glCore_glGlobalAlphaFactordSUN; +void APIENTRY bluegl_glGlobalAlphaFactordSUN (GLdouble factor) { + typedef void (APIENTRYP PFN_glGlobalAlphaFactordSUN) (GLdouble factor); + return ((PFN_glGlobalAlphaFactordSUN)__blue_glCore_glGlobalAlphaFactordSUN)(factor); +} + +extern void* __blue_glCore_glGlobalAlphaFactorubSUN; +void APIENTRY bluegl_glGlobalAlphaFactorubSUN (GLubyte factor) { + typedef void (APIENTRYP PFN_glGlobalAlphaFactorubSUN) (GLubyte factor); + return ((PFN_glGlobalAlphaFactorubSUN)__blue_glCore_glGlobalAlphaFactorubSUN)(factor); +} + +extern void* __blue_glCore_glGlobalAlphaFactorusSUN; +void APIENTRY bluegl_glGlobalAlphaFactorusSUN (GLushort factor) { + typedef void (APIENTRYP PFN_glGlobalAlphaFactorusSUN) (GLushort factor); + return ((PFN_glGlobalAlphaFactorusSUN)__blue_glCore_glGlobalAlphaFactorusSUN)(factor); +} + +extern void* __blue_glCore_glGlobalAlphaFactoruiSUN; +void APIENTRY bluegl_glGlobalAlphaFactoruiSUN (GLuint factor) { + typedef void (APIENTRYP PFN_glGlobalAlphaFactoruiSUN) (GLuint factor); + return ((PFN_glGlobalAlphaFactoruiSUN)__blue_glCore_glGlobalAlphaFactoruiSUN)(factor); +} + +extern void* __blue_glCore_glDrawMeshArraysSUN; +void APIENTRY bluegl_glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width) { + typedef void (APIENTRYP PFN_glDrawMeshArraysSUN) (GLenum mode, GLint first, GLsizei count, GLsizei width); + return ((PFN_glDrawMeshArraysSUN)__blue_glCore_glDrawMeshArraysSUN)(mode, first, count, width); +} + +extern void* __blue_glCore_glReplacementCodeuiSUN; +void APIENTRY bluegl_glReplacementCodeuiSUN (GLuint code) { + typedef void (APIENTRYP PFN_glReplacementCodeuiSUN) (GLuint code); + return ((PFN_glReplacementCodeuiSUN)__blue_glCore_glReplacementCodeuiSUN)(code); +} + +extern void* __blue_glCore_glReplacementCodeusSUN; +void APIENTRY bluegl_glReplacementCodeusSUN (GLushort code) { + typedef void (APIENTRYP PFN_glReplacementCodeusSUN) (GLushort code); + return ((PFN_glReplacementCodeusSUN)__blue_glCore_glReplacementCodeusSUN)(code); +} + +extern void* __blue_glCore_glReplacementCodeubSUN; +void APIENTRY bluegl_glReplacementCodeubSUN (GLubyte code) { + typedef void (APIENTRYP PFN_glReplacementCodeubSUN) (GLubyte code); + return ((PFN_glReplacementCodeubSUN)__blue_glCore_glReplacementCodeubSUN)(code); +} + +extern void* __blue_glCore_glReplacementCodeuivSUN; +void APIENTRY bluegl_glReplacementCodeuivSUN (const GLuint *code) { + typedef void (APIENTRYP PFN_glReplacementCodeuivSUN) (const GLuint *code); + return ((PFN_glReplacementCodeuivSUN)__blue_glCore_glReplacementCodeuivSUN)(code); +} + +extern void* __blue_glCore_glReplacementCodeusvSUN; +void APIENTRY bluegl_glReplacementCodeusvSUN (const GLushort *code) { + typedef void (APIENTRYP PFN_glReplacementCodeusvSUN) (const GLushort *code); + return ((PFN_glReplacementCodeusvSUN)__blue_glCore_glReplacementCodeusvSUN)(code); +} + +extern void* __blue_glCore_glReplacementCodeubvSUN; +void APIENTRY bluegl_glReplacementCodeubvSUN (const GLubyte *code) { + typedef void (APIENTRYP PFN_glReplacementCodeubvSUN) (const GLubyte *code); + return ((PFN_glReplacementCodeubvSUN)__blue_glCore_glReplacementCodeubvSUN)(code); +} + +extern void* __blue_glCore_glReplacementCodePointerSUN; +void APIENTRY bluegl_glReplacementCodePointerSUN (GLenum type, GLsizei stride, const void **pointer) { + typedef void (APIENTRYP PFN_glReplacementCodePointerSUN) (GLenum type, GLsizei stride, const void **pointer); + return ((PFN_glReplacementCodePointerSUN)__blue_glCore_glReplacementCodePointerSUN)(type, stride, pointer); +} + +extern void* __blue_glCore_glColor4ubVertex2fSUN; +void APIENTRY bluegl_glColor4ubVertex2fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y) { + typedef void (APIENTRYP PFN_glColor4ubVertex2fSUN) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); + return ((PFN_glColor4ubVertex2fSUN)__blue_glCore_glColor4ubVertex2fSUN)(r, g, b, a, x, y); +} + +extern void* __blue_glCore_glColor4ubVertex2fvSUN; +void APIENTRY bluegl_glColor4ubVertex2fvSUN (const GLubyte *c, const GLfloat *v) { + typedef void (APIENTRYP PFN_glColor4ubVertex2fvSUN) (const GLubyte *c, const GLfloat *v); + return ((PFN_glColor4ubVertex2fvSUN)__blue_glCore_glColor4ubVertex2fvSUN)(c, v); +} + +extern void* __blue_glCore_glColor4ubVertex3fSUN; +void APIENTRY bluegl_glColor4ubVertex3fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glColor4ubVertex3fSUN) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glColor4ubVertex3fSUN)__blue_glCore_glColor4ubVertex3fSUN)(r, g, b, a, x, y, z); +} + +extern void* __blue_glCore_glColor4ubVertex3fvSUN; +void APIENTRY bluegl_glColor4ubVertex3fvSUN (const GLubyte *c, const GLfloat *v) { + typedef void (APIENTRYP PFN_glColor4ubVertex3fvSUN) (const GLubyte *c, const GLfloat *v); + return ((PFN_glColor4ubVertex3fvSUN)__blue_glCore_glColor4ubVertex3fvSUN)(c, v); +} + +extern void* __blue_glCore_glColor3fVertex3fSUN; +void APIENTRY bluegl_glColor3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glColor3fVertex3fSUN) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glColor3fVertex3fSUN)__blue_glCore_glColor3fVertex3fSUN)(r, g, b, x, y, z); +} + +extern void* __blue_glCore_glColor3fVertex3fvSUN; +void APIENTRY bluegl_glColor3fVertex3fvSUN (const GLfloat *c, const GLfloat *v) { + typedef void (APIENTRYP PFN_glColor3fVertex3fvSUN) (const GLfloat *c, const GLfloat *v); + return ((PFN_glColor3fVertex3fvSUN)__blue_glCore_glColor3fVertex3fvSUN)(c, v); +} + +extern void* __blue_glCore_glNormal3fVertex3fSUN; +void APIENTRY bluegl_glNormal3fVertex3fSUN (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glNormal3fVertex3fSUN) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glNormal3fVertex3fSUN)__blue_glCore_glNormal3fVertex3fSUN)(nx, ny, nz, x, y, z); +} + +extern void* __blue_glCore_glNormal3fVertex3fvSUN; +void APIENTRY bluegl_glNormal3fVertex3fvSUN (const GLfloat *n, const GLfloat *v) { + typedef void (APIENTRYP PFN_glNormal3fVertex3fvSUN) (const GLfloat *n, const GLfloat *v); + return ((PFN_glNormal3fVertex3fvSUN)__blue_glCore_glNormal3fVertex3fvSUN)(n, v); +} + +extern void* __blue_glCore_glColor4fNormal3fVertex3fSUN; +void APIENTRY bluegl_glColor4fNormal3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glColor4fNormal3fVertex3fSUN) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glColor4fNormal3fVertex3fSUN)__blue_glCore_glColor4fNormal3fVertex3fSUN)(r, g, b, a, nx, ny, nz, x, y, z); +} + +extern void* __blue_glCore_glColor4fNormal3fVertex3fvSUN; +void APIENTRY bluegl_glColor4fNormal3fVertex3fvSUN (const GLfloat *c, const GLfloat *n, const GLfloat *v) { + typedef void (APIENTRYP PFN_glColor4fNormal3fVertex3fvSUN) (const GLfloat *c, const GLfloat *n, const GLfloat *v); + return ((PFN_glColor4fNormal3fVertex3fvSUN)__blue_glCore_glColor4fNormal3fVertex3fvSUN)(c, n, v); +} + +extern void* __blue_glCore_glTexCoord2fVertex3fSUN; +void APIENTRY bluegl_glTexCoord2fVertex3fSUN (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glTexCoord2fVertex3fSUN) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glTexCoord2fVertex3fSUN)__blue_glCore_glTexCoord2fVertex3fSUN)(s, t, x, y, z); +} + +extern void* __blue_glCore_glTexCoord2fVertex3fvSUN; +void APIENTRY bluegl_glTexCoord2fVertex3fvSUN (const GLfloat *tc, const GLfloat *v) { + typedef void (APIENTRYP PFN_glTexCoord2fVertex3fvSUN) (const GLfloat *tc, const GLfloat *v); + return ((PFN_glTexCoord2fVertex3fvSUN)__blue_glCore_glTexCoord2fVertex3fvSUN)(tc, v); +} + +extern void* __blue_glCore_glTexCoord4fVertex4fSUN; +void APIENTRY bluegl_glTexCoord4fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { + typedef void (APIENTRYP PFN_glTexCoord4fVertex4fSUN) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + return ((PFN_glTexCoord4fVertex4fSUN)__blue_glCore_glTexCoord4fVertex4fSUN)(s, t, p, q, x, y, z, w); +} + +extern void* __blue_glCore_glTexCoord4fVertex4fvSUN; +void APIENTRY bluegl_glTexCoord4fVertex4fvSUN (const GLfloat *tc, const GLfloat *v) { + typedef void (APIENTRYP PFN_glTexCoord4fVertex4fvSUN) (const GLfloat *tc, const GLfloat *v); + return ((PFN_glTexCoord4fVertex4fvSUN)__blue_glCore_glTexCoord4fVertex4fvSUN)(tc, v); +} + +extern void* __blue_glCore_glTexCoord2fColor4ubVertex3fSUN; +void APIENTRY bluegl_glTexCoord2fColor4ubVertex3fSUN (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glTexCoord2fColor4ubVertex3fSUN) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glTexCoord2fColor4ubVertex3fSUN)__blue_glCore_glTexCoord2fColor4ubVertex3fSUN)(s, t, r, g, b, a, x, y, z); +} + +extern void* __blue_glCore_glTexCoord2fColor4ubVertex3fvSUN; +void APIENTRY bluegl_glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *tc, const GLubyte *c, const GLfloat *v) { + typedef void (APIENTRYP PFN_glTexCoord2fColor4ubVertex3fvSUN) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); + return ((PFN_glTexCoord2fColor4ubVertex3fvSUN)__blue_glCore_glTexCoord2fColor4ubVertex3fvSUN)(tc, c, v); +} + +extern void* __blue_glCore_glTexCoord2fColor3fVertex3fSUN; +void APIENTRY bluegl_glTexCoord2fColor3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glTexCoord2fColor3fVertex3fSUN) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glTexCoord2fColor3fVertex3fSUN)__blue_glCore_glTexCoord2fColor3fVertex3fSUN)(s, t, r, g, b, x, y, z); +} + +extern void* __blue_glCore_glTexCoord2fColor3fVertex3fvSUN; +void APIENTRY bluegl_glTexCoord2fColor3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *v) { + typedef void (APIENTRYP PFN_glTexCoord2fColor3fVertex3fvSUN) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); + return ((PFN_glTexCoord2fColor3fVertex3fvSUN)__blue_glCore_glTexCoord2fColor3fVertex3fvSUN)(tc, c, v); +} + +extern void* __blue_glCore_glTexCoord2fNormal3fVertex3fSUN; +void APIENTRY bluegl_glTexCoord2fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glTexCoord2fNormal3fVertex3fSUN) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glTexCoord2fNormal3fVertex3fSUN)__blue_glCore_glTexCoord2fNormal3fVertex3fSUN)(s, t, nx, ny, nz, x, y, z); +} + +extern void* __blue_glCore_glTexCoord2fNormal3fVertex3fvSUN; +void APIENTRY bluegl_glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *n, const GLfloat *v) { + typedef void (APIENTRYP PFN_glTexCoord2fNormal3fVertex3fvSUN) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); + return ((PFN_glTexCoord2fNormal3fVertex3fvSUN)__blue_glCore_glTexCoord2fNormal3fVertex3fvSUN)(tc, n, v); +} + +extern void* __blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN; +void APIENTRY bluegl_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) { + typedef void (APIENTRYP PFN_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); + return ((PFN_glTexCoord2fColor4fNormal3fVertex3fSUN)__blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN)(s, t, r, g, b, a, nx, ny, nz, x, y, z); +} + +extern void* __blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN; +void APIENTRY bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v) { + typedef void (APIENTRYP PFN_glTexCoord2fColor4fNormal3fVertex3fvSUN) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); + return ((PFN_glTexCoord2fColor4fNormal3fVertex3fvSUN)__blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN)(tc, c, n, v); +} + +extern void* __blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN; +void APIENTRY bluegl_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) { + typedef void (APIENTRYP PFN_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); + return ((PFN_glTexCoord4fColor4fNormal3fVertex4fSUN)__blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN)(s, t, p, q, r, g, b, a, nx, ny, nz, x, y, z, w); +} + +extern void* __blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN; +void APIENTRY bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v) { + typedef void (APIENTRYP PFN_glTexCoord4fColor4fNormal3fVertex4fvSUN) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); + return ((PFN_glTexCoord4fColor4fNormal3fVertex4fvSUN)__blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN)(tc, c, n, v); +} + +extern void* __blue_glCore_glReplacementCodeuiVertex3fSUN; +void APIENTRY bluegl_glReplacementCodeuiVertex3fSUN (GLuint rc, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glReplacementCodeuiVertex3fSUN) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glReplacementCodeuiVertex3fSUN)__blue_glCore_glReplacementCodeuiVertex3fSUN)(rc, x, y, z); +} + +extern void* __blue_glCore_glReplacementCodeuiVertex3fvSUN; +void APIENTRY bluegl_glReplacementCodeuiVertex3fvSUN (const GLuint *rc, const GLfloat *v) { + typedef void (APIENTRYP PFN_glReplacementCodeuiVertex3fvSUN) (const GLuint *rc, const GLfloat *v); + return ((PFN_glReplacementCodeuiVertex3fvSUN)__blue_glCore_glReplacementCodeuiVertex3fvSUN)(rc, v); +} + +extern void* __blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN; +void APIENTRY bluegl_glReplacementCodeuiColor4ubVertex3fSUN (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glReplacementCodeuiColor4ubVertex3fSUN) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glReplacementCodeuiColor4ubVertex3fSUN)__blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN)(rc, r, g, b, a, x, y, z); +} + +extern void* __blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN; +void APIENTRY bluegl_glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *rc, const GLubyte *c, const GLfloat *v) { + typedef void (APIENTRYP PFN_glReplacementCodeuiColor4ubVertex3fvSUN) (const GLuint *rc, const GLubyte *c, const GLfloat *v); + return ((PFN_glReplacementCodeuiColor4ubVertex3fvSUN)__blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN)(rc, c, v); +} + +extern void* __blue_glCore_glReplacementCodeuiColor3fVertex3fSUN; +void APIENTRY bluegl_glReplacementCodeuiColor3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glReplacementCodeuiColor3fVertex3fSUN) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glReplacementCodeuiColor3fVertex3fSUN)__blue_glCore_glReplacementCodeuiColor3fVertex3fSUN)(rc, r, g, b, x, y, z); +} + +extern void* __blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN; +void APIENTRY bluegl_glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *v) { + typedef void (APIENTRYP PFN_glReplacementCodeuiColor3fVertex3fvSUN) (const GLuint *rc, const GLfloat *c, const GLfloat *v); + return ((PFN_glReplacementCodeuiColor3fVertex3fvSUN)__blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN)(rc, c, v); +} + +extern void* __blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN; +void APIENTRY bluegl_glReplacementCodeuiNormal3fVertex3fSUN (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glReplacementCodeuiNormal3fVertex3fSUN) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glReplacementCodeuiNormal3fVertex3fSUN)__blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN)(rc, nx, ny, nz, x, y, z); +} + +extern void* __blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN; +void APIENTRY bluegl_glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *n, const GLfloat *v) { + typedef void (APIENTRYP PFN_glReplacementCodeuiNormal3fVertex3fvSUN) (const GLuint *rc, const GLfloat *n, const GLfloat *v); + return ((PFN_glReplacementCodeuiNormal3fVertex3fvSUN)__blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN)(rc, n, v); +} + +extern void* __blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN; +void APIENTRY bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN (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 PFN_glReplacementCodeuiColor4fNormal3fVertex3fSUN) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glReplacementCodeuiColor4fNormal3fVertex3fSUN)__blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN)(rc, r, g, b, a, nx, ny, nz, x, y, z); +} + +extern void* __blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN; +void APIENTRY bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v) { + typedef void (APIENTRYP PFN_glReplacementCodeuiColor4fNormal3fVertex3fvSUN) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); + return ((PFN_glReplacementCodeuiColor4fNormal3fVertex3fvSUN)__blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN)(rc, c, n, v); +} + +extern void* __blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN; +void APIENTRY bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glReplacementCodeuiTexCoord2fVertex3fSUN) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glReplacementCodeuiTexCoord2fVertex3fSUN)__blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN)(rc, s, t, x, y, z); +} + +extern void* __blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN; +void APIENTRY bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *v) { + typedef void (APIENTRYP PFN_glReplacementCodeuiTexCoord2fVertex3fvSUN) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); + return ((PFN_glReplacementCodeuiTexCoord2fVertex3fvSUN)__blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN)(rc, tc, v); +} + +extern void* __blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; +void APIENTRY bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z) { + typedef void (APIENTRYP PFN_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); + return ((PFN_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN)__blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN)(rc, s, t, nx, ny, nz, x, y, z); +} + +extern void* __blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; +void APIENTRY bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v) { + typedef void (APIENTRYP PFN_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); + return ((PFN_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN)__blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN)(rc, tc, n, v); +} + +extern void* __blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; +void APIENTRY bluegl_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) { + typedef void (APIENTRYP PFN_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); + return ((PFN_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN)__blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN)(rc, s, t, r, g, b, a, nx, ny, nz, x, y, z); +} + +extern void* __blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; +void APIENTRY bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v) { + typedef void (APIENTRYP PFN_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); + return ((PFN_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN)__blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN)(rc, tc, c, n, v); +} + +#ifdef __cplusplus +} +#endif diff --git a/libs/bluegl/src/BlueGLCoreWindowsImpl.S b/libs/bluegl/src/BlueGLCoreWindowsImpl.S index e28c1be28d2..4b35e3443cf 100644 --- a/libs/bluegl/src/BlueGLCoreWindowsImpl.S +++ b/libs/bluegl/src/BlueGLCoreWindowsImpl.S @@ -1,5 +1,5 @@ ; -; Copyright (C) 2022 The Android Open Source Project +; Copyright (C) 2023 The Android Open Source Project ; ; Licensed under the Apache License, Version 2.0 (the "License"); ; you may not use this file except in compliance with the License. @@ -13,79 +13,83 @@ ; See the License for the specific language governing permissions and ; limitations under the License. ; - ; ; Generated by bluegl/bluegl-gen.py ; DO NOT EDIT ; - .code -extrn __blue_glCore_glVertexAttrib4dARB: qword -bluegl_glVertexAttrib4dARB proc - mov r11, __blue_glCore_glVertexAttrib4dARB +extrn __blue_glCore_glCullFace: qword +bluegl_glCullFace proc + mov r11, __blue_glCore_glCullFace jmp r11 -bluegl_glVertexAttrib4dARB endp +bluegl_glCullFace endp -extrn __blue_glCore_glMultMatrixxOES: qword -bluegl_glMultMatrixxOES proc - mov r11, __blue_glCore_glMultMatrixxOES +extrn __blue_glCore_glFrontFace: qword +bluegl_glFrontFace proc + mov r11, __blue_glCore_glFrontFace jmp r11 -bluegl_glMultMatrixxOES endp +bluegl_glFrontFace endp -extrn __blue_glCore_glProgramParameters4fvNV: qword -bluegl_glProgramParameters4fvNV proc - mov r11, __blue_glCore_glProgramParameters4fvNV +extrn __blue_glCore_glHint: qword +bluegl_glHint proc + mov r11, __blue_glCore_glHint jmp r11 -bluegl_glProgramParameters4fvNV endp +bluegl_glHint endp -extrn __blue_glCore_glGenProgramPipelines: qword -bluegl_glGenProgramPipelines proc - mov r11, __blue_glCore_glGenProgramPipelines +extrn __blue_glCore_glLineWidth: qword +bluegl_glLineWidth proc + mov r11, __blue_glCore_glLineWidth jmp r11 -bluegl_glGenProgramPipelines endp +bluegl_glLineWidth endp -extrn __blue_glCore_glMultiTexCoordP3uiv: qword -bluegl_glMultiTexCoordP3uiv proc - mov r11, __blue_glCore_glMultiTexCoordP3uiv +extrn __blue_glCore_glPointSize: qword +bluegl_glPointSize proc + mov r11, __blue_glCore_glPointSize jmp r11 -bluegl_glMultiTexCoordP3uiv endp +bluegl_glPointSize endp -extrn __blue_glCore_glSecondaryColor3usv: qword -bluegl_glSecondaryColor3usv proc - mov r11, __blue_glCore_glSecondaryColor3usv +extrn __blue_glCore_glPolygonMode: qword +bluegl_glPolygonMode proc + mov r11, __blue_glCore_glPolygonMode jmp r11 -bluegl_glSecondaryColor3usv endp +bluegl_glPolygonMode endp -extrn __blue_glCore_glGetHistogramParameteriv: qword -bluegl_glGetHistogramParameteriv proc - mov r11, __blue_glCore_glGetHistogramParameteriv +extrn __blue_glCore_glScissor: qword +bluegl_glScissor proc + mov r11, __blue_glCore_glScissor jmp r11 -bluegl_glGetHistogramParameteriv endp +bluegl_glScissor endp -extrn __blue_glCore_glRenderbufferStorageEXT: qword -bluegl_glRenderbufferStorageEXT proc - mov r11, __blue_glCore_glRenderbufferStorageEXT +extrn __blue_glCore_glTexParameterf: qword +bluegl_glTexParameterf proc + mov r11, __blue_glCore_glTexParameterf jmp r11 -bluegl_glRenderbufferStorageEXT endp +bluegl_glTexParameterf endp -extrn __blue_glCore_glGetPathParameterivNV: qword -bluegl_glGetPathParameterivNV proc - mov r11, __blue_glCore_glGetPathParameterivNV +extrn __blue_glCore_glTexParameterfv: qword +bluegl_glTexParameterfv proc + mov r11, __blue_glCore_glTexParameterfv jmp r11 -bluegl_glGetPathParameterivNV endp +bluegl_glTexParameterfv endp -extrn __blue_glCore_glLineWidthxOES: qword -bluegl_glLineWidthxOES proc - mov r11, __blue_glCore_glLineWidthxOES +extrn __blue_glCore_glTexParameteri: qword +bluegl_glTexParameteri proc + mov r11, __blue_glCore_glTexParameteri jmp r11 -bluegl_glLineWidthxOES endp +bluegl_glTexParameteri endp -extrn __blue_glCore_glGlobalAlphaFactordSUN: qword -bluegl_glGlobalAlphaFactordSUN proc - mov r11, __blue_glCore_glGlobalAlphaFactordSUN +extrn __blue_glCore_glTexParameteriv: qword +bluegl_glTexParameteriv proc + mov r11, __blue_glCore_glTexParameteriv jmp r11 -bluegl_glGlobalAlphaFactordSUN endp +bluegl_glTexParameteriv endp + +extrn __blue_glCore_glTexImage1D: qword +bluegl_glTexImage1D proc + mov r11, __blue_glCore_glTexImage1D + jmp r11 +bluegl_glTexImage1D endp extrn __blue_glCore_glTexImage2D: qword bluegl_glTexImage2D proc @@ -93,1607 +97,1619 @@ bluegl_glTexImage2D proc jmp r11 bluegl_glTexImage2D endp -extrn __blue_glCore_glGlobalAlphaFactorfSUN: qword -bluegl_glGlobalAlphaFactorfSUN proc - mov r11, __blue_glCore_glGlobalAlphaFactorfSUN +extrn __blue_glCore_glDrawBuffer: qword +bluegl_glDrawBuffer proc + mov r11, __blue_glCore_glDrawBuffer jmp r11 -bluegl_glGlobalAlphaFactorfSUN endp +bluegl_glDrawBuffer endp -extrn __blue_glCore_glNormalP3uiv: qword -bluegl_glNormalP3uiv proc - mov r11, __blue_glCore_glNormalP3uiv +extrn __blue_glCore_glClear: qword +bluegl_glClear proc + mov r11, __blue_glCore_glClear jmp r11 -bluegl_glNormalP3uiv endp +bluegl_glClear endp -extrn __blue_glCore_glColor4fNormal3fVertex3fSUN: qword -bluegl_glColor4fNormal3fVertex3fSUN proc - mov r11, __blue_glCore_glColor4fNormal3fVertex3fSUN +extrn __blue_glCore_glClearColor: qword +bluegl_glClearColor proc + mov r11, __blue_glCore_glClearColor jmp r11 -bluegl_glColor4fNormal3fVertex3fSUN endp +bluegl_glClearColor endp -extrn __blue_glCore_glMapVertexAttrib1fAPPLE: qword -bluegl_glMapVertexAttrib1fAPPLE proc - mov r11, __blue_glCore_glMapVertexAttrib1fAPPLE +extrn __blue_glCore_glClearStencil: qword +bluegl_glClearStencil proc + mov r11, __blue_glCore_glClearStencil jmp r11 -bluegl_glMapVertexAttrib1fAPPLE endp +bluegl_glClearStencil endp -extrn __blue_glCore_glTexCoord2fNormal3fVertex3fvSUN: qword -bluegl_glTexCoord2fNormal3fVertex3fvSUN proc - mov r11, __blue_glCore_glTexCoord2fNormal3fVertex3fvSUN +extrn __blue_glCore_glClearDepth: qword +bluegl_glClearDepth proc + mov r11, __blue_glCore_glClearDepth jmp r11 -bluegl_glTexCoord2fNormal3fVertex3fvSUN endp +bluegl_glClearDepth endp -extrn __blue_glCore_glVertexArrayVertexBuffers: qword -bluegl_glVertexArrayVertexBuffers proc - mov r11, __blue_glCore_glVertexArrayVertexBuffers +extrn __blue_glCore_glStencilMask: qword +bluegl_glStencilMask proc + mov r11, __blue_glCore_glStencilMask jmp r11 -bluegl_glVertexArrayVertexBuffers endp +bluegl_glStencilMask endp -extrn __blue_glCore_glShaderSource: qword -bluegl_glShaderSource proc - mov r11, __blue_glCore_glShaderSource +extrn __blue_glCore_glColorMask: qword +bluegl_glColorMask proc + mov r11, __blue_glCore_glColorMask jmp r11 -bluegl_glShaderSource endp +bluegl_glColorMask endp -extrn __blue_glCore_glConvolutionFilter1D: qword -bluegl_glConvolutionFilter1D proc - mov r11, __blue_glCore_glConvolutionFilter1D +extrn __blue_glCore_glDepthMask: qword +bluegl_glDepthMask proc + mov r11, __blue_glCore_glDepthMask jmp r11 -bluegl_glConvolutionFilter1D endp +bluegl_glDepthMask endp -extrn __blue_glCore_glIsFenceAPPLE: qword -bluegl_glIsFenceAPPLE proc - mov r11, __blue_glCore_glIsFenceAPPLE +extrn __blue_glCore_glDisable: qword +bluegl_glDisable proc + mov r11, __blue_glCore_glDisable jmp r11 -bluegl_glIsFenceAPPLE endp +bluegl_glDisable endp -extrn __blue_glCore_glWindowPos2s: qword -bluegl_glWindowPos2s proc - mov r11, __blue_glCore_glWindowPos2s +extrn __blue_glCore_glEnable: qword +bluegl_glEnable proc + mov r11, __blue_glCore_glEnable jmp r11 -bluegl_glWindowPos2s endp +bluegl_glEnable endp -extrn __blue_glCore_glEvaluateDepthValuesARB: qword -bluegl_glEvaluateDepthValuesARB proc - mov r11, __blue_glCore_glEvaluateDepthValuesARB +extrn __blue_glCore_glFinish: qword +bluegl_glFinish proc + mov r11, __blue_glCore_glFinish jmp r11 -bluegl_glEvaluateDepthValuesARB endp +bluegl_glFinish endp -extrn __blue_glCore_glInterpolatePathsNV: qword -bluegl_glInterpolatePathsNV proc - mov r11, __blue_glCore_glInterpolatePathsNV +extrn __blue_glCore_glFlush: qword +bluegl_glFlush proc + mov r11, __blue_glCore_glFlush jmp r11 -bluegl_glInterpolatePathsNV endp +bluegl_glFlush endp -extrn __blue_glCore_glTextureParameterivEXT: qword -bluegl_glTextureParameterivEXT proc - mov r11, __blue_glCore_glTextureParameterivEXT +extrn __blue_glCore_glBlendFunc: qword +bluegl_glBlendFunc proc + mov r11, __blue_glCore_glBlendFunc jmp r11 -bluegl_glTextureParameterivEXT endp +bluegl_glBlendFunc endp -extrn __blue_glCore_glDeleteOcclusionQueriesNV: qword -bluegl_glDeleteOcclusionQueriesNV proc - mov r11, __blue_glCore_glDeleteOcclusionQueriesNV +extrn __blue_glCore_glLogicOp: qword +bluegl_glLogicOp proc + mov r11, __blue_glCore_glLogicOp jmp r11 -bluegl_glDeleteOcclusionQueriesNV endp +bluegl_glLogicOp endp -extrn __blue_glCore_glMakeTextureHandleResidentARB: qword -bluegl_glMakeTextureHandleResidentARB proc - mov r11, __blue_glCore_glMakeTextureHandleResidentARB +extrn __blue_glCore_glStencilFunc: qword +bluegl_glStencilFunc proc + mov r11, __blue_glCore_glStencilFunc jmp r11 -bluegl_glMakeTextureHandleResidentARB endp +bluegl_glStencilFunc endp -extrn __blue_glCore_glCopyImageSubDataNV: qword -bluegl_glCopyImageSubDataNV proc - mov r11, __blue_glCore_glCopyImageSubDataNV +extrn __blue_glCore_glStencilOp: qword +bluegl_glStencilOp proc + mov r11, __blue_glCore_glStencilOp jmp r11 -bluegl_glCopyImageSubDataNV endp +bluegl_glStencilOp endp -extrn __blue_glCore_glVertexAttribL3d: qword -bluegl_glVertexAttribL3d proc - mov r11, __blue_glCore_glVertexAttribL3d +extrn __blue_glCore_glDepthFunc: qword +bluegl_glDepthFunc proc + mov r11, __blue_glCore_glDepthFunc jmp r11 -bluegl_glVertexAttribL3d endp +bluegl_glDepthFunc endp -extrn __blue_glCore_glGetTextureSamplerHandleNV: qword -bluegl_glGetTextureSamplerHandleNV proc - mov r11, __blue_glCore_glGetTextureSamplerHandleNV +extrn __blue_glCore_glPixelStoref: qword +bluegl_glPixelStoref proc + mov r11, __blue_glCore_glPixelStoref jmp r11 -bluegl_glGetTextureSamplerHandleNV endp +bluegl_glPixelStoref endp -extrn __blue_glCore_glMakeTextureHandleResidentNV: qword -bluegl_glMakeTextureHandleResidentNV proc - mov r11, __blue_glCore_glMakeTextureHandleResidentNV +extrn __blue_glCore_glPixelStorei: qword +bluegl_glPixelStorei proc + mov r11, __blue_glCore_glPixelStorei jmp r11 -bluegl_glMakeTextureHandleResidentNV endp +bluegl_glPixelStorei endp -extrn __blue_glCore_glPolygonOffsetxOES: qword -bluegl_glPolygonOffsetxOES proc - mov r11, __blue_glCore_glPolygonOffsetxOES +extrn __blue_glCore_glReadBuffer: qword +bluegl_glReadBuffer proc + mov r11, __blue_glCore_glReadBuffer jmp r11 -bluegl_glPolygonOffsetxOES endp +bluegl_glReadBuffer endp -extrn __blue_glCore_glUniformMatrix2fv: qword -bluegl_glUniformMatrix2fv proc - mov r11, __blue_glCore_glUniformMatrix2fv +extrn __blue_glCore_glReadPixels: qword +bluegl_glReadPixels proc + mov r11, __blue_glCore_glReadPixels jmp r11 -bluegl_glUniformMatrix2fv endp +bluegl_glReadPixels endp -extrn __blue_glCore_glMultiDrawElementsEXT: qword -bluegl_glMultiDrawElementsEXT proc - mov r11, __blue_glCore_glMultiDrawElementsEXT +extrn __blue_glCore_glGetBooleanv: qword +bluegl_glGetBooleanv proc + mov r11, __blue_glCore_glGetBooleanv jmp r11 -bluegl_glMultiDrawElementsEXT endp +bluegl_glGetBooleanv endp -extrn __blue_glCore_glVertexAttribI1uiv: qword -bluegl_glVertexAttribI1uiv proc - mov r11, __blue_glCore_glVertexAttribI1uiv +extrn __blue_glCore_glGetDoublev: qword +bluegl_glGetDoublev proc + mov r11, __blue_glCore_glGetDoublev jmp r11 -bluegl_glVertexAttribI1uiv endp +bluegl_glGetDoublev endp -extrn __blue_glCore_glPathCoordsNV: qword -bluegl_glPathCoordsNV proc - mov r11, __blue_glCore_glPathCoordsNV +extrn __blue_glCore_glGetError: qword +bluegl_glGetError proc + mov r11, __blue_glCore_glGetError jmp r11 -bluegl_glPathCoordsNV endp +bluegl_glGetError endp -extrn __blue_glCore_glVertexArrayVertexBindingDivisorEXT: qword -bluegl_glVertexArrayVertexBindingDivisorEXT proc - mov r11, __blue_glCore_glVertexArrayVertexBindingDivisorEXT +extrn __blue_glCore_glGetFloatv: qword +bluegl_glGetFloatv proc + mov r11, __blue_glCore_glGetFloatv jmp r11 -bluegl_glVertexArrayVertexBindingDivisorEXT endp +bluegl_glGetFloatv endp -extrn __blue_glCore_glVertexAttrib2dv: qword -bluegl_glVertexAttrib2dv proc - mov r11, __blue_glCore_glVertexAttrib2dv +extrn __blue_glCore_glGetIntegerv: qword +bluegl_glGetIntegerv proc + mov r11, __blue_glCore_glGetIntegerv jmp r11 -bluegl_glVertexAttrib2dv endp +bluegl_glGetIntegerv endp -extrn __blue_glCore_glFinish: qword -bluegl_glFinish proc - mov r11, __blue_glCore_glFinish +extrn __blue_glCore_glGetString: qword +bluegl_glGetString proc + mov r11, __blue_glCore_glGetString jmp r11 -bluegl_glFinish endp +bluegl_glGetString endp -extrn __blue_glCore_glVertexAttribs2dvNV: qword -bluegl_glVertexAttribs2dvNV proc - mov r11, __blue_glCore_glVertexAttribs2dvNV +extrn __blue_glCore_glGetTexImage: qword +bluegl_glGetTexImage proc + mov r11, __blue_glCore_glGetTexImage jmp r11 -bluegl_glVertexAttribs2dvNV endp +bluegl_glGetTexImage endp -extrn __blue_glCore_glVertexAttribI1ivEXT: qword -bluegl_glVertexAttribI1ivEXT proc - mov r11, __blue_glCore_glVertexAttribI1ivEXT +extrn __blue_glCore_glGetTexParameterfv: qword +bluegl_glGetTexParameterfv proc + mov r11, __blue_glCore_glGetTexParameterfv jmp r11 -bluegl_glVertexAttribI1ivEXT endp +bluegl_glGetTexParameterfv endp -extrn __blue_glCore_glVertexAttrib2sNV: qword -bluegl_glVertexAttrib2sNV proc - mov r11, __blue_glCore_glVertexAttrib2sNV +extrn __blue_glCore_glGetTexParameteriv: qword +bluegl_glGetTexParameteriv proc + mov r11, __blue_glCore_glGetTexParameteriv jmp r11 -bluegl_glVertexAttrib2sNV endp +bluegl_glGetTexParameteriv endp -extrn __blue_glCore_glMultiTexCoord1iv: qword -bluegl_glMultiTexCoord1iv proc - mov r11, __blue_glCore_glMultiTexCoord1iv +extrn __blue_glCore_glGetTexLevelParameterfv: qword +bluegl_glGetTexLevelParameterfv proc + mov r11, __blue_glCore_glGetTexLevelParameterfv jmp r11 -bluegl_glMultiTexCoord1iv endp +bluegl_glGetTexLevelParameterfv endp -extrn __blue_glCore_glGetnMapiv: qword -bluegl_glGetnMapiv proc - mov r11, __blue_glCore_glGetnMapiv +extrn __blue_glCore_glGetTexLevelParameteriv: qword +bluegl_glGetTexLevelParameteriv proc + mov r11, __blue_glCore_glGetTexLevelParameteriv jmp r11 -bluegl_glGetnMapiv endp +bluegl_glGetTexLevelParameteriv endp -extrn __blue_glCore_glCompressedTexSubImage1DARB: qword -bluegl_glCompressedTexSubImage1DARB proc - mov r11, __blue_glCore_glCompressedTexSubImage1DARB +extrn __blue_glCore_glIsEnabled: qword +bluegl_glIsEnabled proc + mov r11, __blue_glCore_glIsEnabled jmp r11 -bluegl_glCompressedTexSubImage1DARB endp +bluegl_glIsEnabled endp -extrn __blue_glCore_glFogCoordPointerEXT: qword -bluegl_glFogCoordPointerEXT proc - mov r11, __blue_glCore_glFogCoordPointerEXT +extrn __blue_glCore_glDepthRange: qword +bluegl_glDepthRange proc + mov r11, __blue_glCore_glDepthRange jmp r11 -bluegl_glFogCoordPointerEXT endp +bluegl_glDepthRange endp -extrn __blue_glCore_glCompressedMultiTexImage1DEXT: qword -bluegl_glCompressedMultiTexImage1DEXT proc - mov r11, __blue_glCore_glCompressedMultiTexImage1DEXT +extrn __blue_glCore_glViewport: qword +bluegl_glViewport proc + mov r11, __blue_glCore_glViewport jmp r11 -bluegl_glCompressedMultiTexImage1DEXT endp +bluegl_glViewport endp -extrn __blue_glCore_glVertexAttrib3d: qword -bluegl_glVertexAttrib3d proc - mov r11, __blue_glCore_glVertexAttrib3d +extrn __blue_glCore_glDrawArrays: qword +bluegl_glDrawArrays proc + mov r11, __blue_glCore_glDrawArrays jmp r11 -bluegl_glVertexAttrib3d endp +bluegl_glDrawArrays endp -extrn __blue_glCore_glLineWidth: qword -bluegl_glLineWidth proc - mov r11, __blue_glCore_glLineWidth +extrn __blue_glCore_glDrawElements: qword +bluegl_glDrawElements proc + mov r11, __blue_glCore_glDrawElements jmp r11 -bluegl_glLineWidth endp +bluegl_glDrawElements endp -extrn __blue_glCore_glGetShaderiv: qword -bluegl_glGetShaderiv proc - mov r11, __blue_glCore_glGetShaderiv +extrn __blue_glCore_glGetPointerv: qword +bluegl_glGetPointerv proc + mov r11, __blue_glCore_glGetPointerv jmp r11 -bluegl_glGetShaderiv endp +bluegl_glGetPointerv endp -extrn __blue_glCore_glProgramUniform1dv: qword -bluegl_glProgramUniform1dv proc - mov r11, __blue_glCore_glProgramUniform1dv +extrn __blue_glCore_glPolygonOffset: qword +bluegl_glPolygonOffset proc + mov r11, __blue_glCore_glPolygonOffset jmp r11 -bluegl_glProgramUniform1dv endp +bluegl_glPolygonOffset endp -extrn __blue_glCore_glGetVertexAttribLui64vNV: qword -bluegl_glGetVertexAttribLui64vNV proc - mov r11, __blue_glCore_glGetVertexAttribLui64vNV +extrn __blue_glCore_glCopyTexImage1D: qword +bluegl_glCopyTexImage1D proc + mov r11, __blue_glCore_glCopyTexImage1D jmp r11 -bluegl_glGetVertexAttribLui64vNV endp +bluegl_glCopyTexImage1D endp -extrn __blue_glCore_glProgramUniform1ui64vNV: qword -bluegl_glProgramUniform1ui64vNV proc - mov r11, __blue_glCore_glProgramUniform1ui64vNV +extrn __blue_glCore_glCopyTexImage2D: qword +bluegl_glCopyTexImage2D proc + mov r11, __blue_glCore_glCopyTexImage2D jmp r11 -bluegl_glProgramUniform1ui64vNV endp +bluegl_glCopyTexImage2D endp -extrn __blue_glCore_glGetRenderbufferParameteriv: qword -bluegl_glGetRenderbufferParameteriv proc - mov r11, __blue_glCore_glGetRenderbufferParameteriv +extrn __blue_glCore_glCopyTexSubImage1D: qword +bluegl_glCopyTexSubImage1D proc + mov r11, __blue_glCore_glCopyTexSubImage1D jmp r11 -bluegl_glGetRenderbufferParameteriv endp +bluegl_glCopyTexSubImage1D endp -extrn __blue_glCore_glGetOcclusionQueryivNV: qword -bluegl_glGetOcclusionQueryivNV proc - mov r11, __blue_glCore_glGetOcclusionQueryivNV +extrn __blue_glCore_glCopyTexSubImage2D: qword +bluegl_glCopyTexSubImage2D proc + mov r11, __blue_glCore_glCopyTexSubImage2D jmp r11 -bluegl_glGetOcclusionQueryivNV endp +bluegl_glCopyTexSubImage2D endp -extrn __blue_glCore_glUniformMatrix2x4dv: qword -bluegl_glUniformMatrix2x4dv proc - mov r11, __blue_glCore_glUniformMatrix2x4dv +extrn __blue_glCore_glTexSubImage1D: qword +bluegl_glTexSubImage1D proc + mov r11, __blue_glCore_glTexSubImage1D jmp r11 -bluegl_glUniformMatrix2x4dv endp +bluegl_glTexSubImage1D endp -extrn __blue_glCore_glGetVertexAttribPointervNV: qword -bluegl_glGetVertexAttribPointervNV proc - mov r11, __blue_glCore_glGetVertexAttribPointervNV +extrn __blue_glCore_glTexSubImage2D: qword +bluegl_glTexSubImage2D proc + mov r11, __blue_glCore_glTexSubImage2D jmp r11 -bluegl_glGetVertexAttribPointervNV endp +bluegl_glTexSubImage2D endp -extrn __blue_glCore_glUniform2fv: qword -bluegl_glUniform2fv proc - mov r11, __blue_glCore_glUniform2fv +extrn __blue_glCore_glBindTexture: qword +bluegl_glBindTexture proc + mov r11, __blue_glCore_glBindTexture jmp r11 -bluegl_glUniform2fv endp +bluegl_glBindTexture endp -extrn __blue_glCore_glRasterPos2xOES: qword -bluegl_glRasterPos2xOES proc - mov r11, __blue_glCore_glRasterPos2xOES +extrn __blue_glCore_glDeleteTextures: qword +bluegl_glDeleteTextures proc + mov r11, __blue_glCore_glDeleteTextures jmp r11 -bluegl_glRasterPos2xOES endp +bluegl_glDeleteTextures endp -extrn __blue_glCore_glGetCommandHeaderNV: qword -bluegl_glGetCommandHeaderNV proc - mov r11, __blue_glCore_glGetCommandHeaderNV +extrn __blue_glCore_glGenTextures: qword +bluegl_glGenTextures proc + mov r11, __blue_glCore_glGenTextures jmp r11 -bluegl_glGetCommandHeaderNV endp +bluegl_glGenTextures endp -extrn __blue_glCore_glUniformSubroutinesuiv: qword -bluegl_glUniformSubroutinesuiv proc - mov r11, __blue_glCore_glUniformSubroutinesuiv +extrn __blue_glCore_glIsTexture: qword +bluegl_glIsTexture proc + mov r11, __blue_glCore_glIsTexture jmp r11 -bluegl_glUniformSubroutinesuiv endp +bluegl_glIsTexture endp -extrn __blue_glCore_glGetPixelTransformParameterivEXT: qword -bluegl_glGetPixelTransformParameterivEXT proc - mov r11, __blue_glCore_glGetPixelTransformParameterivEXT +extrn __blue_glCore_glDrawRangeElements: qword +bluegl_glDrawRangeElements proc + mov r11, __blue_glCore_glDrawRangeElements jmp r11 -bluegl_glGetPixelTransformParameterivEXT endp +bluegl_glDrawRangeElements endp -extrn __blue_glCore_glGetFragDataLocation: qword -bluegl_glGetFragDataLocation proc - mov r11, __blue_glCore_glGetFragDataLocation +extrn __blue_glCore_glTexImage3D: qword +bluegl_glTexImage3D proc + mov r11, __blue_glCore_glTexImage3D jmp r11 -bluegl_glGetFragDataLocation endp +bluegl_glTexImage3D endp -extrn __blue_glCore_glTexCoord2fColor3fVertex3fSUN: qword -bluegl_glTexCoord2fColor3fVertex3fSUN proc - mov r11, __blue_glCore_glTexCoord2fColor3fVertex3fSUN +extrn __blue_glCore_glTexSubImage3D: qword +bluegl_glTexSubImage3D proc + mov r11, __blue_glCore_glTexSubImage3D jmp r11 -bluegl_glTexCoord2fColor3fVertex3fSUN endp +bluegl_glTexSubImage3D endp -extrn __blue_glCore_glSecondaryColor3uiv: qword -bluegl_glSecondaryColor3uiv proc - mov r11, __blue_glCore_glSecondaryColor3uiv +extrn __blue_glCore_glCopyTexSubImage3D: qword +bluegl_glCopyTexSubImage3D proc + mov r11, __blue_glCore_glCopyTexSubImage3D jmp r11 -bluegl_glSecondaryColor3uiv endp +bluegl_glCopyTexSubImage3D endp -extrn __blue_glCore_glEnableVertexArrayAttribEXT: qword -bluegl_glEnableVertexArrayAttribEXT proc - mov r11, __blue_glCore_glEnableVertexArrayAttribEXT +extrn __blue_glCore_glActiveTexture: qword +bluegl_glActiveTexture proc + mov r11, __blue_glCore_glActiveTexture jmp r11 -bluegl_glEnableVertexArrayAttribEXT endp +bluegl_glActiveTexture endp -extrn __blue_glCore_glPixelTexGenParameterfvSGIS: qword -bluegl_glPixelTexGenParameterfvSGIS proc - mov r11, __blue_glCore_glPixelTexGenParameterfvSGIS +extrn __blue_glCore_glSampleCoverage: qword +bluegl_glSampleCoverage proc + mov r11, __blue_glCore_glSampleCoverage jmp r11 -bluegl_glPixelTexGenParameterfvSGIS endp +bluegl_glSampleCoverage endp -extrn __blue_glCore_glProgramUniformMatrix3x4dvEXT: qword -bluegl_glProgramUniformMatrix3x4dvEXT proc - mov r11, __blue_glCore_glProgramUniformMatrix3x4dvEXT +extrn __blue_glCore_glCompressedTexImage3D: qword +bluegl_glCompressedTexImage3D proc + mov r11, __blue_glCore_glCompressedTexImage3D jmp r11 -bluegl_glProgramUniformMatrix3x4dvEXT endp +bluegl_glCompressedTexImage3D endp -extrn __blue_glCore_glMultiTexCoord2fvARB: qword -bluegl_glMultiTexCoord2fvARB proc - mov r11, __blue_glCore_glMultiTexCoord2fvARB +extrn __blue_glCore_glCompressedTexImage2D: qword +bluegl_glCompressedTexImage2D proc + mov r11, __blue_glCore_glCompressedTexImage2D jmp r11 -bluegl_glMultiTexCoord2fvARB endp +bluegl_glCompressedTexImage2D endp -extrn __blue_glCore_glHistogram: qword -bluegl_glHistogram proc - mov r11, __blue_glCore_glHistogram +extrn __blue_glCore_glCompressedTexImage1D: qword +bluegl_glCompressedTexImage1D proc + mov r11, __blue_glCore_glCompressedTexImage1D jmp r11 -bluegl_glHistogram endp +bluegl_glCompressedTexImage1D endp -extrn __blue_glCore_glGetSynciv: qword -bluegl_glGetSynciv proc - mov r11, __blue_glCore_glGetSynciv +extrn __blue_glCore_glCompressedTexSubImage3D: qword +bluegl_glCompressedTexSubImage3D proc + mov r11, __blue_glCore_glCompressedTexSubImage3D jmp r11 -bluegl_glGetSynciv endp +bluegl_glCompressedTexSubImage3D endp -extrn __blue_glCore_glBitmapxOES: qword -bluegl_glBitmapxOES proc - mov r11, __blue_glCore_glBitmapxOES +extrn __blue_glCore_glCompressedTexSubImage2D: qword +bluegl_glCompressedTexSubImage2D proc + mov r11, __blue_glCore_glCompressedTexSubImage2D jmp r11 -bluegl_glBitmapxOES endp +bluegl_glCompressedTexSubImage2D endp -extrn __blue_glCore_glGetnColorTable: qword -bluegl_glGetnColorTable proc - mov r11, __blue_glCore_glGetnColorTable +extrn __blue_glCore_glCompressedTexSubImage1D: qword +bluegl_glCompressedTexSubImage1D proc + mov r11, __blue_glCore_glCompressedTexSubImage1D jmp r11 -bluegl_glGetnColorTable endp +bluegl_glCompressedTexSubImage1D endp -extrn __blue_glCore_glGenerateMultiTexMipmapEXT: qword -bluegl_glGenerateMultiTexMipmapEXT proc - mov r11, __blue_glCore_glGenerateMultiTexMipmapEXT +extrn __blue_glCore_glGetCompressedTexImage: qword +bluegl_glGetCompressedTexImage proc + mov r11, __blue_glCore_glGetCompressedTexImage jmp r11 -bluegl_glGenerateMultiTexMipmapEXT endp +bluegl_glGetCompressedTexImage endp -extrn __blue_glCore_glVertexStream4fvATI: qword -bluegl_glVertexStream4fvATI proc - mov r11, __blue_glCore_glVertexStream4fvATI +extrn __blue_glCore_glBlendFuncSeparate: qword +bluegl_glBlendFuncSeparate proc + mov r11, __blue_glCore_glBlendFuncSeparate jmp r11 -bluegl_glVertexStream4fvATI endp +bluegl_glBlendFuncSeparate endp -extrn __blue_glCore_glSecondaryColorPointerEXT: qword -bluegl_glSecondaryColorPointerEXT proc - mov r11, __blue_glCore_glSecondaryColorPointerEXT +extrn __blue_glCore_glMultiDrawArrays: qword +bluegl_glMultiDrawArrays proc + mov r11, __blue_glCore_glMultiDrawArrays jmp r11 -bluegl_glSecondaryColorPointerEXT endp +bluegl_glMultiDrawArrays endp -extrn __blue_glCore_glVertexAttribIPointerEXT: qword -bluegl_glVertexAttribIPointerEXT proc - mov r11, __blue_glCore_glVertexAttribIPointerEXT +extrn __blue_glCore_glMultiDrawElements: qword +bluegl_glMultiDrawElements proc + mov r11, __blue_glCore_glMultiDrawElements jmp r11 -bluegl_glVertexAttribIPointerEXT endp +bluegl_glMultiDrawElements endp -extrn __blue_glCore_glEvalCoord2xvOES: qword -bluegl_glEvalCoord2xvOES proc - mov r11, __blue_glCore_glEvalCoord2xvOES +extrn __blue_glCore_glPointParameterf: qword +bluegl_glPointParameterf proc + mov r11, __blue_glCore_glPointParameterf jmp r11 -bluegl_glEvalCoord2xvOES endp +bluegl_glPointParameterf endp -extrn __blue_glCore_glDeleteFencesNV: qword -bluegl_glDeleteFencesNV proc - mov r11, __blue_glCore_glDeleteFencesNV +extrn __blue_glCore_glPointParameterfv: qword +bluegl_glPointParameterfv proc + mov r11, __blue_glCore_glPointParameterfv jmp r11 -bluegl_glDeleteFencesNV endp +bluegl_glPointParameterfv endp -extrn __blue_glCore_glAlphaFragmentOp1ATI: qword -bluegl_glAlphaFragmentOp1ATI proc - mov r11, __blue_glCore_glAlphaFragmentOp1ATI +extrn __blue_glCore_glPointParameteri: qword +bluegl_glPointParameteri proc + mov r11, __blue_glCore_glPointParameteri jmp r11 -bluegl_glAlphaFragmentOp1ATI endp +bluegl_glPointParameteri endp -extrn __blue_glCore_glGetActiveUniformName: qword -bluegl_glGetActiveUniformName proc - mov r11, __blue_glCore_glGetActiveUniformName +extrn __blue_glCore_glPointParameteriv: qword +bluegl_glPointParameteriv proc + mov r11, __blue_glCore_glPointParameteriv jmp r11 -bluegl_glGetActiveUniformName endp +bluegl_glPointParameteriv endp -extrn __blue_glCore_glGetCompressedTextureSubImage: qword -bluegl_glGetCompressedTextureSubImage proc - mov r11, __blue_glCore_glGetCompressedTextureSubImage +extrn __blue_glCore_glBlendColor: qword +bluegl_glBlendColor proc + mov r11, __blue_glCore_glBlendColor jmp r11 -bluegl_glGetCompressedTextureSubImage endp +bluegl_glBlendColor endp -extrn __blue_glCore_glGetTextureParameterfvEXT: qword -bluegl_glGetTextureParameterfvEXT proc - mov r11, __blue_glCore_glGetTextureParameterfvEXT +extrn __blue_glCore_glBlendEquation: qword +bluegl_glBlendEquation proc + mov r11, __blue_glCore_glBlendEquation jmp r11 -bluegl_glGetTextureParameterfvEXT endp +bluegl_glBlendEquation endp -extrn __blue_glCore_glDeleteShader: qword -bluegl_glDeleteShader proc - mov r11, __blue_glCore_glDeleteShader +extrn __blue_glCore_glGenQueries: qword +bluegl_glGenQueries proc + mov r11, __blue_glCore_glGenQueries jmp r11 -bluegl_glDeleteShader endp +bluegl_glGenQueries endp -extrn __blue_glCore_glRenderbufferStorageMultisample: qword -bluegl_glRenderbufferStorageMultisample proc - mov r11, __blue_glCore_glRenderbufferStorageMultisample +extrn __blue_glCore_glDeleteQueries: qword +bluegl_glDeleteQueries proc + mov r11, __blue_glCore_glDeleteQueries jmp r11 -bluegl_glRenderbufferStorageMultisample endp +bluegl_glDeleteQueries endp -extrn __blue_glCore_glTexCoord2fVertex3fSUN: qword -bluegl_glTexCoord2fVertex3fSUN proc - mov r11, __blue_glCore_glTexCoord2fVertex3fSUN +extrn __blue_glCore_glIsQuery: qword +bluegl_glIsQuery proc + mov r11, __blue_glCore_glIsQuery jmp r11 -bluegl_glTexCoord2fVertex3fSUN endp +bluegl_glIsQuery endp -extrn __blue_glCore_glGetActiveSubroutineUniformName: qword -bluegl_glGetActiveSubroutineUniformName proc - mov r11, __blue_glCore_glGetActiveSubroutineUniformName +extrn __blue_glCore_glBeginQuery: qword +bluegl_glBeginQuery proc + mov r11, __blue_glCore_glBeginQuery jmp r11 -bluegl_glGetActiveSubroutineUniformName endp +bluegl_glBeginQuery endp -extrn __blue_glCore_glGetVideoCaptureStreamfvNV: qword -bluegl_glGetVideoCaptureStreamfvNV proc - mov r11, __blue_glCore_glGetVideoCaptureStreamfvNV +extrn __blue_glCore_glEndQuery: qword +bluegl_glEndQuery proc + mov r11, __blue_glCore_glEndQuery jmp r11 -bluegl_glGetVideoCaptureStreamfvNV endp +bluegl_glEndQuery endp -extrn __blue_glCore_glInvalidateSubFramebuffer: qword -bluegl_glInvalidateSubFramebuffer proc - mov r11, __blue_glCore_glInvalidateSubFramebuffer +extrn __blue_glCore_glGetQueryiv: qword +bluegl_glGetQueryiv proc + mov r11, __blue_glCore_glGetQueryiv jmp r11 -bluegl_glInvalidateSubFramebuffer endp +bluegl_glGetQueryiv endp -extrn __blue_glCore_glIndexFormatNV: qword -bluegl_glIndexFormatNV proc - mov r11, __blue_glCore_glIndexFormatNV +extrn __blue_glCore_glGetQueryObjectiv: qword +bluegl_glGetQueryObjectiv proc + mov r11, __blue_glCore_glGetQueryObjectiv jmp r11 -bluegl_glIndexFormatNV endp +bluegl_glGetQueryObjectiv endp -extrn __blue_glCore_glMultiTexEnvfvEXT: qword -bluegl_glMultiTexEnvfvEXT proc - mov r11, __blue_glCore_glMultiTexEnvfvEXT +extrn __blue_glCore_glGetQueryObjectuiv: qword +bluegl_glGetQueryObjectuiv proc + mov r11, __blue_glCore_glGetQueryObjectuiv jmp r11 -bluegl_glMultiTexEnvfvEXT endp +bluegl_glGetQueryObjectuiv endp -extrn __blue_glCore_glUniformBufferEXT: qword -bluegl_glUniformBufferEXT proc - mov r11, __blue_glCore_glUniformBufferEXT +extrn __blue_glCore_glBindBuffer: qword +bluegl_glBindBuffer proc + mov r11, __blue_glCore_glBindBuffer jmp r11 -bluegl_glUniformBufferEXT endp +bluegl_glBindBuffer endp -extrn __blue_glCore_glNamedProgramLocalParametersI4uivEXT: qword -bluegl_glNamedProgramLocalParametersI4uivEXT proc - mov r11, __blue_glCore_glNamedProgramLocalParametersI4uivEXT +extrn __blue_glCore_glDeleteBuffers: qword +bluegl_glDeleteBuffers proc + mov r11, __blue_glCore_glDeleteBuffers jmp r11 -bluegl_glNamedProgramLocalParametersI4uivEXT endp +bluegl_glDeleteBuffers endp -extrn __blue_glCore_glWeightPathsNV: qword -bluegl_glWeightPathsNV proc - mov r11, __blue_glCore_glWeightPathsNV +extrn __blue_glCore_glGenBuffers: qword +bluegl_glGenBuffers proc + mov r11, __blue_glCore_glGenBuffers jmp r11 -bluegl_glWeightPathsNV endp +bluegl_glGenBuffers endp -extrn __blue_glCore_glGetnHistogram: qword -bluegl_glGetnHistogram proc - mov r11, __blue_glCore_glGetnHistogram +extrn __blue_glCore_glIsBuffer: qword +bluegl_glIsBuffer proc + mov r11, __blue_glCore_glIsBuffer jmp r11 -bluegl_glGetnHistogram endp +bluegl_glIsBuffer endp -extrn __blue_glCore_glTexCoord1bOES: qword -bluegl_glTexCoord1bOES proc - mov r11, __blue_glCore_glTexCoord1bOES +extrn __blue_glCore_glBufferData: qword +bluegl_glBufferData proc + mov r11, __blue_glCore_glBufferData jmp r11 -bluegl_glTexCoord1bOES endp +bluegl_glBufferData endp -extrn __blue_glCore_glSetFragmentShaderConstantATI: qword -bluegl_glSetFragmentShaderConstantATI proc - mov r11, __blue_glCore_glSetFragmentShaderConstantATI +extrn __blue_glCore_glBufferSubData: qword +bluegl_glBufferSubData proc + mov r11, __blue_glCore_glBufferSubData jmp r11 -bluegl_glSetFragmentShaderConstantATI endp +bluegl_glBufferSubData endp -extrn __blue_glCore_glRasterPos3xvOES: qword -bluegl_glRasterPos3xvOES proc - mov r11, __blue_glCore_glRasterPos3xvOES +extrn __blue_glCore_glGetBufferSubData: qword +bluegl_glGetBufferSubData proc + mov r11, __blue_glCore_glGetBufferSubData jmp r11 -bluegl_glRasterPos3xvOES endp +bluegl_glGetBufferSubData endp -extrn __blue_glCore_glCopyConvolutionFilter1DEXT: qword -bluegl_glCopyConvolutionFilter1DEXT proc - mov r11, __blue_glCore_glCopyConvolutionFilter1DEXT +extrn __blue_glCore_glMapBuffer: qword +bluegl_glMapBuffer proc + mov r11, __blue_glCore_glMapBuffer jmp r11 -bluegl_glCopyConvolutionFilter1DEXT endp +bluegl_glMapBuffer endp -extrn __blue_glCore_glArrayElementEXT: qword -bluegl_glArrayElementEXT proc - mov r11, __blue_glCore_glArrayElementEXT +extrn __blue_glCore_glUnmapBuffer: qword +bluegl_glUnmapBuffer proc + mov r11, __blue_glCore_glUnmapBuffer jmp r11 -bluegl_glArrayElementEXT endp +bluegl_glUnmapBuffer endp -extrn __blue_glCore_glCopyTextureImage2DEXT: qword -bluegl_glCopyTextureImage2DEXT proc - mov r11, __blue_glCore_glCopyTextureImage2DEXT +extrn __blue_glCore_glGetBufferParameteriv: qword +bluegl_glGetBufferParameteriv proc + mov r11, __blue_glCore_glGetBufferParameteriv jmp r11 -bluegl_glCopyTextureImage2DEXT endp +bluegl_glGetBufferParameteriv endp -extrn __blue_glCore_glNamedProgramLocalParameterI4uivEXT: qword -bluegl_glNamedProgramLocalParameterI4uivEXT proc - mov r11, __blue_glCore_glNamedProgramLocalParameterI4uivEXT +extrn __blue_glCore_glGetBufferPointerv: qword +bluegl_glGetBufferPointerv proc + mov r11, __blue_glCore_glGetBufferPointerv jmp r11 -bluegl_glNamedProgramLocalParameterI4uivEXT endp +bluegl_glGetBufferPointerv endp -extrn __blue_glCore_glMultiDrawElementsIndirectBindlessNV: qword -bluegl_glMultiDrawElementsIndirectBindlessNV proc - mov r11, __blue_glCore_glMultiDrawElementsIndirectBindlessNV +extrn __blue_glCore_glBlendEquationSeparate: qword +bluegl_glBlendEquationSeparate proc + mov r11, __blue_glCore_glBlendEquationSeparate jmp r11 -bluegl_glMultiDrawElementsIndirectBindlessNV endp +bluegl_glBlendEquationSeparate endp -extrn __blue_glCore_glClearColorIuiEXT: qword -bluegl_glClearColorIuiEXT proc - mov r11, __blue_glCore_glClearColorIuiEXT +extrn __blue_glCore_glDrawBuffers: qword +bluegl_glDrawBuffers proc + mov r11, __blue_glCore_glDrawBuffers jmp r11 -bluegl_glClearColorIuiEXT endp +bluegl_glDrawBuffers endp -extrn __blue_glCore_glMultiTexParameterfEXT: qword -bluegl_glMultiTexParameterfEXT proc - mov r11, __blue_glCore_glMultiTexParameterfEXT +extrn __blue_glCore_glStencilOpSeparate: qword +bluegl_glStencilOpSeparate proc + mov r11, __blue_glCore_glStencilOpSeparate jmp r11 -bluegl_glMultiTexParameterfEXT endp +bluegl_glStencilOpSeparate endp -extrn __blue_glCore_glVertexArrayVertexAttribIFormatEXT: qword -bluegl_glVertexArrayVertexAttribIFormatEXT proc - mov r11, __blue_glCore_glVertexArrayVertexAttribIFormatEXT +extrn __blue_glCore_glStencilFuncSeparate: qword +bluegl_glStencilFuncSeparate proc + mov r11, __blue_glCore_glStencilFuncSeparate jmp r11 -bluegl_glVertexArrayVertexAttribIFormatEXT endp +bluegl_glStencilFuncSeparate endp -extrn __blue_glCore_glVertexAttrib1sv: qword -bluegl_glVertexAttrib1sv proc - mov r11, __blue_glCore_glVertexAttrib1sv +extrn __blue_glCore_glStencilMaskSeparate: qword +bluegl_glStencilMaskSeparate proc + mov r11, __blue_glCore_glStencilMaskSeparate jmp r11 -bluegl_glVertexAttrib1sv endp +bluegl_glStencilMaskSeparate endp -extrn __blue_glCore_glVertexStream2dvATI: qword -bluegl_glVertexStream2dvATI proc - mov r11, __blue_glCore_glVertexStream2dvATI +extrn __blue_glCore_glAttachShader: qword +bluegl_glAttachShader proc + mov r11, __blue_glCore_glAttachShader jmp r11 -bluegl_glVertexStream2dvATI endp +bluegl_glAttachShader endp -extrn __blue_glCore_glUniform4iARB: qword -bluegl_glUniform4iARB proc - mov r11, __blue_glCore_glUniform4iARB +extrn __blue_glCore_glBindAttribLocation: qword +bluegl_glBindAttribLocation proc + mov r11, __blue_glCore_glBindAttribLocation jmp r11 -bluegl_glUniform4iARB endp +bluegl_glBindAttribLocation endp -extrn __blue_glCore_glVertexAttribs4svNV: qword -bluegl_glVertexAttribs4svNV proc - mov r11, __blue_glCore_glVertexAttribs4svNV +extrn __blue_glCore_glCompileShader: qword +bluegl_glCompileShader proc + mov r11, __blue_glCore_glCompileShader jmp r11 -bluegl_glVertexAttribs4svNV endp +bluegl_glCompileShader endp -extrn __blue_glCore_glProgramUniformMatrix3x2dvEXT: qword -bluegl_glProgramUniformMatrix3x2dvEXT proc - mov r11, __blue_glCore_glProgramUniformMatrix3x2dvEXT +extrn __blue_glCore_glCreateProgram: qword +bluegl_glCreateProgram proc + mov r11, __blue_glCore_glCreateProgram jmp r11 -bluegl_glProgramUniformMatrix3x2dvEXT endp +bluegl_glCreateProgram endp -extrn __blue_glCore_glProgramUniform1ui: qword -bluegl_glProgramUniform1ui proc - mov r11, __blue_glCore_glProgramUniform1ui +extrn __blue_glCore_glCreateShader: qword +bluegl_glCreateShader proc + mov r11, __blue_glCore_glCreateShader jmp r11 -bluegl_glProgramUniform1ui endp +bluegl_glCreateShader endp -extrn __blue_glCore_glVertexAttribIFormatNV: qword -bluegl_glVertexAttribIFormatNV proc - mov r11, __blue_glCore_glVertexAttribIFormatNV +extrn __blue_glCore_glDeleteProgram: qword +bluegl_glDeleteProgram proc + mov r11, __blue_glCore_glDeleteProgram jmp r11 -bluegl_glVertexAttribIFormatNV endp +bluegl_glDeleteProgram endp -extrn __blue_glCore_glFragmentLightModelfSGIX: qword -bluegl_glFragmentLightModelfSGIX proc - mov r11, __blue_glCore_glFragmentLightModelfSGIX +extrn __blue_glCore_glDeleteShader: qword +bluegl_glDeleteShader proc + mov r11, __blue_glCore_glDeleteShader jmp r11 -bluegl_glFragmentLightModelfSGIX endp +bluegl_glDeleteShader endp -extrn __blue_glCore_glGetActiveSubroutineName: qword -bluegl_glGetActiveSubroutineName proc - mov r11, __blue_glCore_glGetActiveSubroutineName +extrn __blue_glCore_glDetachShader: qword +bluegl_glDetachShader proc + mov r11, __blue_glCore_glDetachShader jmp r11 -bluegl_glGetActiveSubroutineName endp +bluegl_glDetachShader endp -extrn __blue_glCore_glConvolutionParameteri: qword -bluegl_glConvolutionParameteri proc - mov r11, __blue_glCore_glConvolutionParameteri +extrn __blue_glCore_glDisableVertexAttribArray: qword +bluegl_glDisableVertexAttribArray proc + mov r11, __blue_glCore_glDisableVertexAttribArray jmp r11 -bluegl_glConvolutionParameteri endp +bluegl_glDisableVertexAttribArray endp -extrn __blue_glCore_glMultiTexCoord4f: qword -bluegl_glMultiTexCoord4f proc - mov r11, __blue_glCore_glMultiTexCoord4f +extrn __blue_glCore_glEnableVertexAttribArray: qword +bluegl_glEnableVertexAttribArray proc + mov r11, __blue_glCore_glEnableVertexAttribArray jmp r11 -bluegl_glMultiTexCoord4f endp +bluegl_glEnableVertexAttribArray endp -extrn __blue_glCore_glTexCoord1xvOES: qword -bluegl_glTexCoord1xvOES proc - mov r11, __blue_glCore_glTexCoord1xvOES +extrn __blue_glCore_glGetActiveAttrib: qword +bluegl_glGetActiveAttrib proc + mov r11, __blue_glCore_glGetActiveAttrib jmp r11 -bluegl_glTexCoord1xvOES endp +bluegl_glGetActiveAttrib endp -extrn __blue_glCore_glIsTransformFeedback: qword -bluegl_glIsTransformFeedback proc - mov r11, __blue_glCore_glIsTransformFeedback +extrn __blue_glCore_glGetActiveUniform: qword +bluegl_glGetActiveUniform proc + mov r11, __blue_glCore_glGetActiveUniform jmp r11 -bluegl_glIsTransformFeedback endp +bluegl_glGetActiveUniform endp -extrn __blue_glCore_glBlendBarrierKHR: qword -bluegl_glBlendBarrierKHR proc - mov r11, __blue_glCore_glBlendBarrierKHR +extrn __blue_glCore_glGetAttachedShaders: qword +bluegl_glGetAttachedShaders proc + mov r11, __blue_glCore_glGetAttachedShaders jmp r11 -bluegl_glBlendBarrierKHR endp +bluegl_glGetAttachedShaders endp -extrn __blue_glCore_glBindBufferRangeEXT: qword -bluegl_glBindBufferRangeEXT proc - mov r11, __blue_glCore_glBindBufferRangeEXT +extrn __blue_glCore_glGetAttribLocation: qword +bluegl_glGetAttribLocation proc + mov r11, __blue_glCore_glGetAttribLocation jmp r11 -bluegl_glBindBufferRangeEXT endp +bluegl_glGetAttribLocation endp -extrn __blue_glCore_glPathColorGenNV: qword -bluegl_glPathColorGenNV proc - mov r11, __blue_glCore_glPathColorGenNV +extrn __blue_glCore_glGetProgramiv: qword +bluegl_glGetProgramiv proc + mov r11, __blue_glCore_glGetProgramiv jmp r11 -bluegl_glPathColorGenNV endp +bluegl_glGetProgramiv endp -extrn __blue_glCore_glEndQuery: qword -bluegl_glEndQuery proc - mov r11, __blue_glCore_glEndQuery +extrn __blue_glCore_glGetProgramInfoLog: qword +bluegl_glGetProgramInfoLog proc + mov r11, __blue_glCore_glGetProgramInfoLog jmp r11 -bluegl_glEndQuery endp +bluegl_glGetProgramInfoLog endp -extrn __blue_glCore_glUniformMatrix2x4fv: qword -bluegl_glUniformMatrix2x4fv proc - mov r11, __blue_glCore_glUniformMatrix2x4fv +extrn __blue_glCore_glGetShaderiv: qword +bluegl_glGetShaderiv proc + mov r11, __blue_glCore_glGetShaderiv jmp r11 -bluegl_glUniformMatrix2x4fv endp +bluegl_glGetShaderiv endp -extrn __blue_glCore_glGenRenderbuffers: qword -bluegl_glGenRenderbuffers proc - mov r11, __blue_glCore_glGenRenderbuffers +extrn __blue_glCore_glGetShaderInfoLog: qword +bluegl_glGetShaderInfoLog proc + mov r11, __blue_glCore_glGetShaderInfoLog jmp r11 -bluegl_glGenRenderbuffers endp +bluegl_glGetShaderInfoLog endp -extrn __blue_glCore_glShaderOp2EXT: qword -bluegl_glShaderOp2EXT proc - mov r11, __blue_glCore_glShaderOp2EXT +extrn __blue_glCore_glGetShaderSource: qword +bluegl_glGetShaderSource proc + mov r11, __blue_glCore_glGetShaderSource jmp r11 -bluegl_glShaderOp2EXT endp +bluegl_glGetShaderSource endp -extrn __blue_glCore_glDrawTransformFeedback: qword -bluegl_glDrawTransformFeedback proc - mov r11, __blue_glCore_glDrawTransformFeedback +extrn __blue_glCore_glGetUniformLocation: qword +bluegl_glGetUniformLocation proc + mov r11, __blue_glCore_glGetUniformLocation jmp r11 -bluegl_glDrawTransformFeedback endp +bluegl_glGetUniformLocation endp -extrn __blue_glCore_glProgramUniform3ui64vNV: qword -bluegl_glProgramUniform3ui64vNV proc - mov r11, __blue_glCore_glProgramUniform3ui64vNV +extrn __blue_glCore_glGetUniformfv: qword +bluegl_glGetUniformfv proc + mov r11, __blue_glCore_glGetUniformfv jmp r11 -bluegl_glProgramUniform3ui64vNV endp +bluegl_glGetUniformfv endp -extrn __blue_glCore_glNamedBufferStorage: qword -bluegl_glNamedBufferStorage proc - mov r11, __blue_glCore_glNamedBufferStorage +extrn __blue_glCore_glGetUniformiv: qword +bluegl_glGetUniformiv proc + mov r11, __blue_glCore_glGetUniformiv jmp r11 -bluegl_glNamedBufferStorage endp +bluegl_glGetUniformiv endp -extrn __blue_glCore_glOrthoxOES: qword -bluegl_glOrthoxOES proc - mov r11, __blue_glCore_glOrthoxOES +extrn __blue_glCore_glGetVertexAttribdv: qword +bluegl_glGetVertexAttribdv proc + mov r11, __blue_glCore_glGetVertexAttribdv jmp r11 -bluegl_glOrthoxOES endp +bluegl_glGetVertexAttribdv endp -extrn __blue_glCore_glVertexAttrib4ubvARB: qword -bluegl_glVertexAttrib4ubvARB proc - mov r11, __blue_glCore_glVertexAttrib4ubvARB +extrn __blue_glCore_glGetVertexAttribfv: qword +bluegl_glGetVertexAttribfv proc + mov r11, __blue_glCore_glGetVertexAttribfv jmp r11 -bluegl_glVertexAttrib4ubvARB endp +bluegl_glGetVertexAttribfv endp -extrn __blue_glCore_glStencilOp: qword -bluegl_glStencilOp proc - mov r11, __blue_glCore_glStencilOp +extrn __blue_glCore_glGetVertexAttribiv: qword +bluegl_glGetVertexAttribiv proc + mov r11, __blue_glCore_glGetVertexAttribiv jmp r11 -bluegl_glStencilOp endp +bluegl_glGetVertexAttribiv endp -extrn __blue_glCore_glProgramLocalParametersI4ivNV: qword -bluegl_glProgramLocalParametersI4ivNV proc - mov r11, __blue_glCore_glProgramLocalParametersI4ivNV +extrn __blue_glCore_glGetVertexAttribPointerv: qword +bluegl_glGetVertexAttribPointerv proc + mov r11, __blue_glCore_glGetVertexAttribPointerv jmp r11 -bluegl_glProgramLocalParametersI4ivNV endp +bluegl_glGetVertexAttribPointerv endp -extrn __blue_glCore_glVertexStream2iATI: qword -bluegl_glVertexStream2iATI proc - mov r11, __blue_glCore_glVertexStream2iATI +extrn __blue_glCore_glIsProgram: qword +bluegl_glIsProgram proc + mov r11, __blue_glCore_glIsProgram jmp r11 -bluegl_glVertexStream2iATI endp +bluegl_glIsProgram endp -extrn __blue_glCore_glWeightdvARB: qword -bluegl_glWeightdvARB proc - mov r11, __blue_glCore_glWeightdvARB +extrn __blue_glCore_glIsShader: qword +bluegl_glIsShader proc + mov r11, __blue_glCore_glIsShader jmp r11 -bluegl_glWeightdvARB endp +bluegl_glIsShader endp -extrn __blue_glCore_glVertexAttrib1fARB: qword -bluegl_glVertexAttrib1fARB proc - mov r11, __blue_glCore_glVertexAttrib1fARB +extrn __blue_glCore_glLinkProgram: qword +bluegl_glLinkProgram proc + mov r11, __blue_glCore_glLinkProgram jmp r11 -bluegl_glVertexAttrib1fARB endp +bluegl_glLinkProgram endp -extrn __blue_glCore_glColorFragmentOp2ATI: qword -bluegl_glColorFragmentOp2ATI proc - mov r11, __blue_glCore_glColorFragmentOp2ATI +extrn __blue_glCore_glShaderSource: qword +bluegl_glShaderSource proc + mov r11, __blue_glCore_glShaderSource jmp r11 -bluegl_glColorFragmentOp2ATI endp +bluegl_glShaderSource endp -extrn __blue_glCore_glGetBufferPointervARB: qword -bluegl_glGetBufferPointervARB proc - mov r11, __blue_glCore_glGetBufferPointervARB +extrn __blue_glCore_glUseProgram: qword +bluegl_glUseProgram proc + mov r11, __blue_glCore_glUseProgram jmp r11 -bluegl_glGetBufferPointervARB endp +bluegl_glUseProgram endp -extrn __blue_glCore_glNamedFramebufferTexture1DEXT: qword -bluegl_glNamedFramebufferTexture1DEXT proc - mov r11, __blue_glCore_glNamedFramebufferTexture1DEXT +extrn __blue_glCore_glUniform1f: qword +bluegl_glUniform1f proc + mov r11, __blue_glCore_glUniform1f jmp r11 -bluegl_glNamedFramebufferTexture1DEXT endp +bluegl_glUniform1f endp -extrn __blue_glCore_glVertexAttrib2fNV: qword -bluegl_glVertexAttrib2fNV proc - mov r11, __blue_glCore_glVertexAttrib2fNV +extrn __blue_glCore_glUniform2f: qword +bluegl_glUniform2f proc + mov r11, __blue_glCore_glUniform2f jmp r11 -bluegl_glVertexAttrib2fNV endp +bluegl_glUniform2f endp -extrn __blue_glCore_glDisableVertexAttribArray: qword -bluegl_glDisableVertexAttribArray proc - mov r11, __blue_glCore_glDisableVertexAttribArray +extrn __blue_glCore_glUniform3f: qword +bluegl_glUniform3f proc + mov r11, __blue_glCore_glUniform3f jmp r11 -bluegl_glDisableVertexAttribArray endp +bluegl_glUniform3f endp -extrn __blue_glCore_glTextureParameterf: qword -bluegl_glTextureParameterf proc - mov r11, __blue_glCore_glTextureParameterf +extrn __blue_glCore_glUniform4f: qword +bluegl_glUniform4f proc + mov r11, __blue_glCore_glUniform4f jmp r11 -bluegl_glTextureParameterf endp +bluegl_glUniform4f endp -extrn __blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN: qword -bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN proc - mov r11, __blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN +extrn __blue_glCore_glUniform1i: qword +bluegl_glUniform1i proc + mov r11, __blue_glCore_glUniform1i jmp r11 -bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN endp +bluegl_glUniform1i endp -extrn __blue_glCore_glNormal3fVertex3fSUN: qword -bluegl_glNormal3fVertex3fSUN proc - mov r11, __blue_glCore_glNormal3fVertex3fSUN +extrn __blue_glCore_glUniform2i: qword +bluegl_glUniform2i proc + mov r11, __blue_glCore_glUniform2i jmp r11 -bluegl_glNormal3fVertex3fSUN endp +bluegl_glUniform2i endp -extrn __blue_glCore_glGetTexBumpParameterfvATI: qword -bluegl_glGetTexBumpParameterfvATI proc - mov r11, __blue_glCore_glGetTexBumpParameterfvATI +extrn __blue_glCore_glUniform3i: qword +bluegl_glUniform3i proc + mov r11, __blue_glCore_glUniform3i jmp r11 -bluegl_glGetTexBumpParameterfvATI endp +bluegl_glUniform3i endp -extrn __blue_glCore_glMultiTexCoord3fARB: qword -bluegl_glMultiTexCoord3fARB proc - mov r11, __blue_glCore_glMultiTexCoord3fARB +extrn __blue_glCore_glUniform4i: qword +bluegl_glUniform4i proc + mov r11, __blue_glCore_glUniform4i jmp r11 -bluegl_glMultiTexCoord3fARB endp +bluegl_glUniform4i endp -extrn __blue_glCore_glTextureParameterfv: qword -bluegl_glTextureParameterfv proc - mov r11, __blue_glCore_glTextureParameterfv +extrn __blue_glCore_glUniform1fv: qword +bluegl_glUniform1fv proc + mov r11, __blue_glCore_glUniform1fv jmp r11 -bluegl_glTextureParameterfv endp +bluegl_glUniform1fv endp -extrn __blue_glCore_glTexBumpParameterivATI: qword -bluegl_glTexBumpParameterivATI proc - mov r11, __blue_glCore_glTexBumpParameterivATI +extrn __blue_glCore_glUniform2fv: qword +bluegl_glUniform2fv proc + mov r11, __blue_glCore_glUniform2fv jmp r11 -bluegl_glTexBumpParameterivATI endp +bluegl_glUniform2fv endp -extrn __blue_glCore_glLockArraysEXT: qword -bluegl_glLockArraysEXT proc - mov r11, __blue_glCore_glLockArraysEXT +extrn __blue_glCore_glUniform3fv: qword +bluegl_glUniform3fv proc + mov r11, __blue_glCore_glUniform3fv jmp r11 -bluegl_glLockArraysEXT endp +bluegl_glUniform3fv endp -extrn __blue_glCore_glIsEnabledIndexedEXT: qword -bluegl_glIsEnabledIndexedEXT proc - mov r11, __blue_glCore_glIsEnabledIndexedEXT +extrn __blue_glCore_glUniform4fv: qword +bluegl_glUniform4fv proc + mov r11, __blue_glCore_glUniform4fv jmp r11 -bluegl_glIsEnabledIndexedEXT endp +bluegl_glUniform4fv endp -extrn __blue_glCore_glGenerateMipmapEXT: qword -bluegl_glGenerateMipmapEXT proc - mov r11, __blue_glCore_glGenerateMipmapEXT +extrn __blue_glCore_glUniform1iv: qword +bluegl_glUniform1iv proc + mov r11, __blue_glCore_glUniform1iv jmp r11 -bluegl_glGenerateMipmapEXT endp +bluegl_glUniform1iv endp -extrn __blue_glCore_glVertexP3uiv: qword -bluegl_glVertexP3uiv proc - mov r11, __blue_glCore_glVertexP3uiv +extrn __blue_glCore_glUniform2iv: qword +bluegl_glUniform2iv proc + mov r11, __blue_glCore_glUniform2iv jmp r11 -bluegl_glVertexP3uiv endp +bluegl_glUniform2iv endp -extrn __blue_glCore_glClearNamedBufferSubData: qword -bluegl_glClearNamedBufferSubData proc - mov r11, __blue_glCore_glClearNamedBufferSubData +extrn __blue_glCore_glUniform3iv: qword +bluegl_glUniform3iv proc + mov r11, __blue_glCore_glUniform3iv jmp r11 -bluegl_glClearNamedBufferSubData endp +bluegl_glUniform3iv endp -extrn __blue_glCore_glInvalidateTexImage: qword -bluegl_glInvalidateTexImage proc - mov r11, __blue_glCore_glInvalidateTexImage +extrn __blue_glCore_glUniform4iv: qword +bluegl_glUniform4iv proc + mov r11, __blue_glCore_glUniform4iv jmp r11 -bluegl_glInvalidateTexImage endp +bluegl_glUniform4iv endp -extrn __blue_glCore_glBindFramebuffer: qword -bluegl_glBindFramebuffer proc - mov r11, __blue_glCore_glBindFramebuffer +extrn __blue_glCore_glUniformMatrix2fv: qword +bluegl_glUniformMatrix2fv proc + mov r11, __blue_glCore_glUniformMatrix2fv jmp r11 -bluegl_glBindFramebuffer endp +bluegl_glUniformMatrix2fv endp -extrn __blue_glCore_glDrawArraysIndirect: qword -bluegl_glDrawArraysIndirect proc - mov r11, __blue_glCore_glDrawArraysIndirect +extrn __blue_glCore_glUniformMatrix3fv: qword +bluegl_glUniformMatrix3fv proc + mov r11, __blue_glCore_glUniformMatrix3fv jmp r11 -bluegl_glDrawArraysIndirect endp +bluegl_glUniformMatrix3fv endp -extrn __blue_glCore_glClipPlanexOES: qword -bluegl_glClipPlanexOES proc - mov r11, __blue_glCore_glClipPlanexOES +extrn __blue_glCore_glUniformMatrix4fv: qword +bluegl_glUniformMatrix4fv proc + mov r11, __blue_glCore_glUniformMatrix4fv jmp r11 -bluegl_glClipPlanexOES endp +bluegl_glUniformMatrix4fv endp -extrn __blue_glCore_glGetFloati_v: qword -bluegl_glGetFloati_v proc - mov r11, __blue_glCore_glGetFloati_v +extrn __blue_glCore_glValidateProgram: qword +bluegl_glValidateProgram proc + mov r11, __blue_glCore_glValidateProgram jmp r11 -bluegl_glGetFloati_v endp +bluegl_glValidateProgram endp -extrn __blue_glCore_glTransformFeedbackVaryingsEXT: qword -bluegl_glTransformFeedbackVaryingsEXT proc - mov r11, __blue_glCore_glTransformFeedbackVaryingsEXT +extrn __blue_glCore_glVertexAttrib1d: qword +bluegl_glVertexAttrib1d proc + mov r11, __blue_glCore_glVertexAttrib1d jmp r11 -bluegl_glTransformFeedbackVaryingsEXT endp +bluegl_glVertexAttrib1d endp -extrn __blue_glCore_glGetColorTableParameteriv: qword -bluegl_glGetColorTableParameteriv proc - mov r11, __blue_glCore_glGetColorTableParameteriv +extrn __blue_glCore_glVertexAttrib1dv: qword +bluegl_glVertexAttrib1dv proc + mov r11, __blue_glCore_glVertexAttrib1dv jmp r11 -bluegl_glGetColorTableParameteriv endp +bluegl_glVertexAttrib1dv endp -extrn __blue_glCore_glTexBufferRange: qword -bluegl_glTexBufferRange proc - mov r11, __blue_glCore_glTexBufferRange +extrn __blue_glCore_glVertexAttrib1f: qword +bluegl_glVertexAttrib1f proc + mov r11, __blue_glCore_glVertexAttrib1f jmp r11 -bluegl_glTexBufferRange endp +bluegl_glVertexAttrib1f endp -extrn __blue_glCore_glVertexAttribI1uivEXT: qword -bluegl_glVertexAttribI1uivEXT proc - mov r11, __blue_glCore_glVertexAttribI1uivEXT +extrn __blue_glCore_glVertexAttrib1fv: qword +bluegl_glVertexAttrib1fv proc + mov r11, __blue_glCore_glVertexAttrib1fv jmp r11 -bluegl_glVertexAttribI1uivEXT endp +bluegl_glVertexAttrib1fv endp -extrn __blue_glCore_glShaderBinary: qword -bluegl_glShaderBinary proc - mov r11, __blue_glCore_glShaderBinary +extrn __blue_glCore_glVertexAttrib1s: qword +bluegl_glVertexAttrib1s proc + mov r11, __blue_glCore_glVertexAttrib1s jmp r11 -bluegl_glShaderBinary endp +bluegl_glVertexAttrib1s endp -extrn __blue_glCore_glGetVertexAttribLi64vNV: qword -bluegl_glGetVertexAttribLi64vNV proc - mov r11, __blue_glCore_glGetVertexAttribLi64vNV +extrn __blue_glCore_glVertexAttrib1sv: qword +bluegl_glVertexAttrib1sv proc + mov r11, __blue_glCore_glVertexAttrib1sv jmp r11 -bluegl_glGetVertexAttribLi64vNV endp +bluegl_glVertexAttrib1sv endp -extrn __blue_glCore_glGetNamedBufferSubDataEXT: qword -bluegl_glGetNamedBufferSubDataEXT proc - mov r11, __blue_glCore_glGetNamedBufferSubDataEXT +extrn __blue_glCore_glVertexAttrib2d: qword +bluegl_glVertexAttrib2d proc + mov r11, __blue_glCore_glVertexAttrib2d jmp r11 -bluegl_glGetNamedBufferSubDataEXT endp +bluegl_glVertexAttrib2d endp -extrn __blue_glCore_glUniform3uivEXT: qword -bluegl_glUniform3uivEXT proc - mov r11, __blue_glCore_glUniform3uivEXT +extrn __blue_glCore_glVertexAttrib2dv: qword +bluegl_glVertexAttrib2dv proc + mov r11, __blue_glCore_glVertexAttrib2dv jmp r11 -bluegl_glUniform3uivEXT endp +bluegl_glVertexAttrib2dv endp -extrn __blue_glCore_glMatrixTranslatefEXT: qword -bluegl_glMatrixTranslatefEXT proc - mov r11, __blue_glCore_glMatrixTranslatefEXT +extrn __blue_glCore_glVertexAttrib2f: qword +bluegl_glVertexAttrib2f proc + mov r11, __blue_glCore_glVertexAttrib2f jmp r11 -bluegl_glMatrixTranslatefEXT endp +bluegl_glVertexAttrib2f endp -extrn __blue_glCore_glVertexAttribs2hvNV: qword -bluegl_glVertexAttribs2hvNV proc - mov r11, __blue_glCore_glVertexAttribs2hvNV +extrn __blue_glCore_glVertexAttrib2fv: qword +bluegl_glVertexAttrib2fv proc + mov r11, __blue_glCore_glVertexAttrib2fv jmp r11 -bluegl_glVertexAttribs2hvNV endp +bluegl_glVertexAttrib2fv endp -extrn __blue_glCore_glClearBufferSubData: qword -bluegl_glClearBufferSubData proc - mov r11, __blue_glCore_glClearBufferSubData +extrn __blue_glCore_glVertexAttrib2s: qword +bluegl_glVertexAttrib2s proc + mov r11, __blue_glCore_glVertexAttrib2s jmp r11 -bluegl_glClearBufferSubData endp +bluegl_glVertexAttrib2s endp -extrn __blue_glCore_glGenFramebuffers: qword -bluegl_glGenFramebuffers proc - mov r11, __blue_glCore_glGenFramebuffers +extrn __blue_glCore_glVertexAttrib2sv: qword +bluegl_glVertexAttrib2sv proc + mov r11, __blue_glCore_glVertexAttrib2sv jmp r11 -bluegl_glGenFramebuffers endp +bluegl_glVertexAttrib2sv endp -extrn __blue_glCore_glVertexArrayAttribFormat: qword -bluegl_glVertexArrayAttribFormat proc - mov r11, __blue_glCore_glVertexArrayAttribFormat +extrn __blue_glCore_glVertexAttrib3d: qword +bluegl_glVertexAttrib3d proc + mov r11, __blue_glCore_glVertexAttrib3d jmp r11 -bluegl_glVertexArrayAttribFormat endp +bluegl_glVertexAttrib3d endp -extrn __blue_glCore_glGetActiveUniformsiv: qword -bluegl_glGetActiveUniformsiv proc - mov r11, __blue_glCore_glGetActiveUniformsiv +extrn __blue_glCore_glVertexAttrib3dv: qword +bluegl_glVertexAttrib3dv proc + mov r11, __blue_glCore_glVertexAttrib3dv jmp r11 -bluegl_glGetActiveUniformsiv endp +bluegl_glVertexAttrib3dv endp -extrn __blue_glCore_glCompressedTextureSubImage1DEXT: qword -bluegl_glCompressedTextureSubImage1DEXT proc - mov r11, __blue_glCore_glCompressedTextureSubImage1DEXT +extrn __blue_glCore_glVertexAttrib3f: qword +bluegl_glVertexAttrib3f proc + mov r11, __blue_glCore_glVertexAttrib3f jmp r11 -bluegl_glCompressedTextureSubImage1DEXT endp +bluegl_glVertexAttrib3f endp -extrn __blue_glCore_glIsRenderbuffer: qword -bluegl_glIsRenderbuffer proc - mov r11, __blue_glCore_glIsRenderbuffer +extrn __blue_glCore_glVertexAttrib3fv: qword +bluegl_glVertexAttrib3fv proc + mov r11, __blue_glCore_glVertexAttrib3fv jmp r11 -bluegl_glIsRenderbuffer endp +bluegl_glVertexAttrib3fv endp -extrn __blue_glCore_glPresentFrameKeyedNV: qword -bluegl_glPresentFrameKeyedNV proc - mov r11, __blue_glCore_glPresentFrameKeyedNV +extrn __blue_glCore_glVertexAttrib3s: qword +bluegl_glVertexAttrib3s proc + mov r11, __blue_glCore_glVertexAttrib3s jmp r11 -bluegl_glPresentFrameKeyedNV endp +bluegl_glVertexAttrib3s endp -extrn __blue_glCore_glProgramUniformMatrix3fvEXT: qword -bluegl_glProgramUniformMatrix3fvEXT proc - mov r11, __blue_glCore_glProgramUniformMatrix3fvEXT +extrn __blue_glCore_glVertexAttrib3sv: qword +bluegl_glVertexAttrib3sv proc + mov r11, __blue_glCore_glVertexAttrib3sv jmp r11 -bluegl_glProgramUniformMatrix3fvEXT endp +bluegl_glVertexAttrib3sv endp -extrn __blue_glCore_glVertexAttribL2i64vNV: qword -bluegl_glVertexAttribL2i64vNV proc - mov r11, __blue_glCore_glVertexAttribL2i64vNV +extrn __blue_glCore_glVertexAttrib4Nbv: qword +bluegl_glVertexAttrib4Nbv proc + mov r11, __blue_glCore_glVertexAttrib4Nbv jmp r11 -bluegl_glVertexAttribL2i64vNV endp +bluegl_glVertexAttrib4Nbv endp -extrn __blue_glCore_glFogCoordhvNV: qword -bluegl_glFogCoordhvNV proc - mov r11, __blue_glCore_glFogCoordhvNV +extrn __blue_glCore_glVertexAttrib4Niv: qword +bluegl_glVertexAttrib4Niv proc + mov r11, __blue_glCore_glVertexAttrib4Niv jmp r11 -bluegl_glFogCoordhvNV endp +bluegl_glVertexAttrib4Niv endp -extrn __blue_glCore_glVertexAttrib4ubv: qword -bluegl_glVertexAttrib4ubv proc - mov r11, __blue_glCore_glVertexAttrib4ubv +extrn __blue_glCore_glVertexAttrib4Nsv: qword +bluegl_glVertexAttrib4Nsv proc + mov r11, __blue_glCore_glVertexAttrib4Nsv jmp r11 -bluegl_glVertexAttrib4ubv endp +bluegl_glVertexAttrib4Nsv endp -extrn __blue_glCore_glPushClientAttribDefaultEXT: qword -bluegl_glPushClientAttribDefaultEXT proc - mov r11, __blue_glCore_glPushClientAttribDefaultEXT +extrn __blue_glCore_glVertexAttrib4Nub: qword +bluegl_glVertexAttrib4Nub proc + mov r11, __blue_glCore_glVertexAttrib4Nub jmp r11 -bluegl_glPushClientAttribDefaultEXT endp +bluegl_glVertexAttrib4Nub endp -extrn __blue_glCore_glWindowPos3ivMESA: qword -bluegl_glWindowPos3ivMESA proc - mov r11, __blue_glCore_glWindowPos3ivMESA +extrn __blue_glCore_glVertexAttrib4Nubv: qword +bluegl_glVertexAttrib4Nubv proc + mov r11, __blue_glCore_glVertexAttrib4Nubv jmp r11 -bluegl_glWindowPos3ivMESA endp +bluegl_glVertexAttrib4Nubv endp -extrn __blue_glCore_glPrimitiveRestartIndexNV: qword -bluegl_glPrimitiveRestartIndexNV proc - mov r11, __blue_glCore_glPrimitiveRestartIndexNV +extrn __blue_glCore_glVertexAttrib4Nuiv: qword +bluegl_glVertexAttrib4Nuiv proc + mov r11, __blue_glCore_glVertexAttrib4Nuiv jmp r11 -bluegl_glPrimitiveRestartIndexNV endp +bluegl_glVertexAttrib4Nuiv endp -extrn __blue_glCore_glCreatePerfQueryINTEL: qword -bluegl_glCreatePerfQueryINTEL proc - mov r11, __blue_glCore_glCreatePerfQueryINTEL +extrn __blue_glCore_glVertexAttrib4Nusv: qword +bluegl_glVertexAttrib4Nusv proc + mov r11, __blue_glCore_glVertexAttrib4Nusv jmp r11 -bluegl_glCreatePerfQueryINTEL endp +bluegl_glVertexAttrib4Nusv endp -extrn __blue_glCore_glGetProgramLocalParameterIuivNV: qword -bluegl_glGetProgramLocalParameterIuivNV proc - mov r11, __blue_glCore_glGetProgramLocalParameterIuivNV +extrn __blue_glCore_glVertexAttrib4bv: qword +bluegl_glVertexAttrib4bv proc + mov r11, __blue_glCore_glVertexAttrib4bv jmp r11 -bluegl_glGetProgramLocalParameterIuivNV endp +bluegl_glVertexAttrib4bv endp -extrn __blue_glCore_glResizeBuffersMESA: qword -bluegl_glResizeBuffersMESA proc - mov r11, __blue_glCore_glResizeBuffersMESA +extrn __blue_glCore_glVertexAttrib4d: qword +bluegl_glVertexAttrib4d proc + mov r11, __blue_glCore_glVertexAttrib4d jmp r11 -bluegl_glResizeBuffersMESA endp +bluegl_glVertexAttrib4d endp -extrn __blue_glCore_glVertexStream1fATI: qword -bluegl_glVertexStream1fATI proc - mov r11, __blue_glCore_glVertexStream1fATI +extrn __blue_glCore_glVertexAttrib4dv: qword +bluegl_glVertexAttrib4dv proc + mov r11, __blue_glCore_glVertexAttrib4dv jmp r11 -bluegl_glVertexStream1fATI endp +bluegl_glVertexAttrib4dv endp -extrn __blue_glCore_glProgramUniform2ui: qword -bluegl_glProgramUniform2ui proc - mov r11, __blue_glCore_glProgramUniform2ui +extrn __blue_glCore_glVertexAttrib4f: qword +bluegl_glVertexAttrib4f proc + mov r11, __blue_glCore_glVertexAttrib4f jmp r11 -bluegl_glProgramUniform2ui endp +bluegl_glVertexAttrib4f endp -extrn __blue_glCore_glSecondaryColor3iv: qword -bluegl_glSecondaryColor3iv proc - mov r11, __blue_glCore_glSecondaryColor3iv +extrn __blue_glCore_glVertexAttrib4fv: qword +bluegl_glVertexAttrib4fv proc + mov r11, __blue_glCore_glVertexAttrib4fv jmp r11 -bluegl_glSecondaryColor3iv endp +bluegl_glVertexAttrib4fv endp -extrn __blue_glCore_glProgramParameters4dvNV: qword -bluegl_glProgramParameters4dvNV proc - mov r11, __blue_glCore_glProgramParameters4dvNV +extrn __blue_glCore_glVertexAttrib4iv: qword +bluegl_glVertexAttrib4iv proc + mov r11, __blue_glCore_glVertexAttrib4iv jmp r11 -bluegl_glProgramParameters4dvNV endp +bluegl_glVertexAttrib4iv endp -extrn __blue_glCore_glWindowPos3i: qword -bluegl_glWindowPos3i proc - mov r11, __blue_glCore_glWindowPos3i +extrn __blue_glCore_glVertexAttrib4s: qword +bluegl_glVertexAttrib4s proc + mov r11, __blue_glCore_glVertexAttrib4s jmp r11 -bluegl_glWindowPos3i endp +bluegl_glVertexAttrib4s endp -extrn __blue_glCore_glRectxvOES: qword -bluegl_glRectxvOES proc - mov r11, __blue_glCore_glRectxvOES +extrn __blue_glCore_glVertexAttrib4sv: qword +bluegl_glVertexAttrib4sv proc + mov r11, __blue_glCore_glVertexAttrib4sv jmp r11 -bluegl_glRectxvOES endp +bluegl_glVertexAttrib4sv endp -extrn __blue_glCore_glMultiTexCoord4iARB: qword -bluegl_glMultiTexCoord4iARB proc - mov r11, __blue_glCore_glMultiTexCoord4iARB +extrn __blue_glCore_glVertexAttrib4ubv: qword +bluegl_glVertexAttrib4ubv proc + mov r11, __blue_glCore_glVertexAttrib4ubv jmp r11 -bluegl_glMultiTexCoord4iARB endp +bluegl_glVertexAttrib4ubv endp -extrn __blue_glCore_glBeginConditionalRender: qword -bluegl_glBeginConditionalRender proc - mov r11, __blue_glCore_glBeginConditionalRender +extrn __blue_glCore_glVertexAttrib4uiv: qword +bluegl_glVertexAttrib4uiv proc + mov r11, __blue_glCore_glVertexAttrib4uiv jmp r11 -bluegl_glBeginConditionalRender endp +bluegl_glVertexAttrib4uiv endp -extrn __blue_glCore_glFreeObjectBufferATI: qword -bluegl_glFreeObjectBufferATI proc - mov r11, __blue_glCore_glFreeObjectBufferATI +extrn __blue_glCore_glVertexAttrib4usv: qword +bluegl_glVertexAttrib4usv proc + mov r11, __blue_glCore_glVertexAttrib4usv jmp r11 -bluegl_glFreeObjectBufferATI endp +bluegl_glVertexAttrib4usv endp -extrn __blue_glCore_glGetOcclusionQueryuivNV: qword -bluegl_glGetOcclusionQueryuivNV proc - mov r11, __blue_glCore_glGetOcclusionQueryuivNV +extrn __blue_glCore_glVertexAttribPointer: qword +bluegl_glVertexAttribPointer proc + mov r11, __blue_glCore_glVertexAttribPointer jmp r11 -bluegl_glGetOcclusionQueryuivNV endp +bluegl_glVertexAttribPointer endp -extrn __blue_glCore_glColorP4ui: qword -bluegl_glColorP4ui proc - mov r11, __blue_glCore_glColorP4ui +extrn __blue_glCore_glUniformMatrix2x3fv: qword +bluegl_glUniformMatrix2x3fv proc + mov r11, __blue_glCore_glUniformMatrix2x3fv jmp r11 -bluegl_glColorP4ui endp +bluegl_glUniformMatrix2x3fv endp -extrn __blue_glCore_glGetPathColorGenivNV: qword -bluegl_glGetPathColorGenivNV proc - mov r11, __blue_glCore_glGetPathColorGenivNV +extrn __blue_glCore_glUniformMatrix3x2fv: qword +bluegl_glUniformMatrix3x2fv proc + mov r11, __blue_glCore_glUniformMatrix3x2fv jmp r11 -bluegl_glGetPathColorGenivNV endp +bluegl_glUniformMatrix3x2fv endp -extrn __blue_glCore_glGetQueryiv: qword -bluegl_glGetQueryiv proc - mov r11, __blue_glCore_glGetQueryiv +extrn __blue_glCore_glUniformMatrix2x4fv: qword +bluegl_glUniformMatrix2x4fv proc + mov r11, __blue_glCore_glUniformMatrix2x4fv jmp r11 -bluegl_glGetQueryiv endp +bluegl_glUniformMatrix2x4fv endp -extrn __blue_glCore_glVertexAttribI2uiv: qword -bluegl_glVertexAttribI2uiv proc - mov r11, __blue_glCore_glVertexAttribI2uiv +extrn __blue_glCore_glUniformMatrix4x2fv: qword +bluegl_glUniformMatrix4x2fv proc + mov r11, __blue_glCore_glUniformMatrix4x2fv jmp r11 -bluegl_glVertexAttribI2uiv endp +bluegl_glUniformMatrix4x2fv endp -extrn __blue_glCore_glGetVertexArrayPointeri_vEXT: qword -bluegl_glGetVertexArrayPointeri_vEXT proc - mov r11, __blue_glCore_glGetVertexArrayPointeri_vEXT +extrn __blue_glCore_glUniformMatrix3x4fv: qword +bluegl_glUniformMatrix3x4fv proc + mov r11, __blue_glCore_glUniformMatrix3x4fv jmp r11 -bluegl_glGetVertexArrayPointeri_vEXT endp +bluegl_glUniformMatrix3x4fv endp -extrn __blue_glCore_glSamplerParameteri: qword -bluegl_glSamplerParameteri proc - mov r11, __blue_glCore_glSamplerParameteri +extrn __blue_glCore_glUniformMatrix4x3fv: qword +bluegl_glUniformMatrix4x3fv proc + mov r11, __blue_glCore_glUniformMatrix4x3fv jmp r11 -bluegl_glSamplerParameteri endp +bluegl_glUniformMatrix4x3fv endp -extrn __blue_glCore_glResumeTransformFeedbackNV: qword -bluegl_glResumeTransformFeedbackNV proc - mov r11, __blue_glCore_glResumeTransformFeedbackNV +extrn __blue_glCore_glColorMaski: qword +bluegl_glColorMaski proc + mov r11, __blue_glCore_glColorMaski jmp r11 -bluegl_glResumeTransformFeedbackNV endp +bluegl_glColorMaski endp -extrn __blue_glCore_glVertexAttribL1ui64vNV: qword -bluegl_glVertexAttribL1ui64vNV proc - mov r11, __blue_glCore_glVertexAttribL1ui64vNV +extrn __blue_glCore_glGetBooleani_v: qword +bluegl_glGetBooleani_v proc + mov r11, __blue_glCore_glGetBooleani_v jmp r11 -bluegl_glVertexAttribL1ui64vNV endp +bluegl_glGetBooleani_v endp -extrn __blue_glCore_glPauseTransformFeedbackNV: qword -bluegl_glPauseTransformFeedbackNV proc - mov r11, __blue_glCore_glPauseTransformFeedbackNV +extrn __blue_glCore_glGetIntegeri_v: qword +bluegl_glGetIntegeri_v proc + mov r11, __blue_glCore_glGetIntegeri_v jmp r11 -bluegl_glPauseTransformFeedbackNV endp +bluegl_glGetIntegeri_v endp -extrn __blue_glCore_glVertexAttribs2fvNV: qword -bluegl_glVertexAttribs2fvNV proc - mov r11, __blue_glCore_glVertexAttribs2fvNV +extrn __blue_glCore_glEnablei: qword +bluegl_glEnablei proc + mov r11, __blue_glCore_glEnablei jmp r11 -bluegl_glVertexAttribs2fvNV endp +bluegl_glEnablei endp -extrn __blue_glCore_glProgramUniform1iv: qword -bluegl_glProgramUniform1iv proc - mov r11, __blue_glCore_glProgramUniform1iv +extrn __blue_glCore_glDisablei: qword +bluegl_glDisablei proc + mov r11, __blue_glCore_glDisablei jmp r11 -bluegl_glProgramUniform1iv endp +bluegl_glDisablei endp -extrn __blue_glCore_glGetColorTableSGI: qword -bluegl_glGetColorTableSGI proc - mov r11, __blue_glCore_glGetColorTableSGI +extrn __blue_glCore_glIsEnabledi: qword +bluegl_glIsEnabledi proc + mov r11, __blue_glCore_glIsEnabledi jmp r11 -bluegl_glGetColorTableSGI endp +bluegl_glIsEnabledi endp -extrn __blue_glCore_glGetActiveAttrib: qword -bluegl_glGetActiveAttrib proc - mov r11, __blue_glCore_glGetActiveAttrib +extrn __blue_glCore_glBeginTransformFeedback: qword +bluegl_glBeginTransformFeedback proc + mov r11, __blue_glCore_glBeginTransformFeedback jmp r11 -bluegl_glGetActiveAttrib endp +bluegl_glBeginTransformFeedback endp -extrn __blue_glCore_glResetMinmax: qword -bluegl_glResetMinmax proc - mov r11, __blue_glCore_glResetMinmax +extrn __blue_glCore_glEndTransformFeedback: qword +bluegl_glEndTransformFeedback proc + mov r11, __blue_glCore_glEndTransformFeedback jmp r11 -bluegl_glResetMinmax endp +bluegl_glEndTransformFeedback endp -extrn __blue_glCore_glBinormal3svEXT: qword -bluegl_glBinormal3svEXT proc - mov r11, __blue_glCore_glBinormal3svEXT +extrn __blue_glCore_glBindBufferRange: qword +bluegl_glBindBufferRange proc + mov r11, __blue_glCore_glBindBufferRange jmp r11 -bluegl_glBinormal3svEXT endp +bluegl_glBindBufferRange endp -extrn __blue_glCore_glVertexAttrib4fv: qword -bluegl_glVertexAttrib4fv proc - mov r11, __blue_glCore_glVertexAttrib4fv +extrn __blue_glCore_glBindBufferBase: qword +bluegl_glBindBufferBase proc + mov r11, __blue_glCore_glBindBufferBase jmp r11 -bluegl_glVertexAttrib4fv endp +bluegl_glBindBufferBase endp -extrn __blue_glCore_glIndexxOES: qword -bluegl_glIndexxOES proc - mov r11, __blue_glCore_glIndexxOES +extrn __blue_glCore_glTransformFeedbackVaryings: qword +bluegl_glTransformFeedbackVaryings proc + mov r11, __blue_glCore_glTransformFeedbackVaryings jmp r11 -bluegl_glIndexxOES endp +bluegl_glTransformFeedbackVaryings endp -extrn __blue_glCore_glMatrixMultTransposefEXT: qword -bluegl_glMatrixMultTransposefEXT proc - mov r11, __blue_glCore_glMatrixMultTransposefEXT +extrn __blue_glCore_glGetTransformFeedbackVarying: qword +bluegl_glGetTransformFeedbackVarying proc + mov r11, __blue_glCore_glGetTransformFeedbackVarying jmp r11 -bluegl_glMatrixMultTransposefEXT endp +bluegl_glGetTransformFeedbackVarying endp -extrn __blue_glCore_glNamedFramebufferTexture: qword -bluegl_glNamedFramebufferTexture proc - mov r11, __blue_glCore_glNamedFramebufferTexture +extrn __blue_glCore_glClampColor: qword +bluegl_glClampColor proc + mov r11, __blue_glCore_glClampColor jmp r11 -bluegl_glNamedFramebufferTexture endp +bluegl_glClampColor endp -extrn __blue_glCore_glVertexP2uiv: qword -bluegl_glVertexP2uiv proc - mov r11, __blue_glCore_glVertexP2uiv +extrn __blue_glCore_glBeginConditionalRender: qword +bluegl_glBeginConditionalRender proc + mov r11, __blue_glCore_glBeginConditionalRender jmp r11 -bluegl_glVertexP2uiv endp +bluegl_glBeginConditionalRender endp -extrn __blue_glCore_glMemoryBarrier: qword -bluegl_glMemoryBarrier proc - mov r11, __blue_glCore_glMemoryBarrier +extrn __blue_glCore_glEndConditionalRender: qword +bluegl_glEndConditionalRender proc + mov r11, __blue_glCore_glEndConditionalRender jmp r11 -bluegl_glMemoryBarrier endp +bluegl_glEndConditionalRender endp -extrn __blue_glCore_glGetGraphicsResetStatusARB: qword -bluegl_glGetGraphicsResetStatusARB proc - mov r11, __blue_glCore_glGetGraphicsResetStatusARB +extrn __blue_glCore_glVertexAttribIPointer: qword +bluegl_glVertexAttribIPointer proc + mov r11, __blue_glCore_glVertexAttribIPointer jmp r11 -bluegl_glGetGraphicsResetStatusARB endp +bluegl_glVertexAttribIPointer endp -extrn __blue_glCore_glBindAttribLocation: qword -bluegl_glBindAttribLocation proc - mov r11, __blue_glCore_glBindAttribLocation +extrn __blue_glCore_glGetVertexAttribIiv: qword +bluegl_glGetVertexAttribIiv proc + mov r11, __blue_glCore_glGetVertexAttribIiv jmp r11 -bluegl_glBindAttribLocation endp +bluegl_glGetVertexAttribIiv endp -extrn __blue_glCore_glVertexBlendEnviATI: qword -bluegl_glVertexBlendEnviATI proc - mov r11, __blue_glCore_glVertexBlendEnviATI +extrn __blue_glCore_glGetVertexAttribIuiv: qword +bluegl_glGetVertexAttribIuiv proc + mov r11, __blue_glCore_glGetVertexAttribIuiv jmp r11 -bluegl_glVertexBlendEnviATI endp +bluegl_glGetVertexAttribIuiv endp -extrn __blue_glCore_glAttachObjectARB: qword -bluegl_glAttachObjectARB proc - mov r11, __blue_glCore_glAttachObjectARB +extrn __blue_glCore_glVertexAttribI1i: qword +bluegl_glVertexAttribI1i proc + mov r11, __blue_glCore_glVertexAttribI1i jmp r11 -bluegl_glAttachObjectARB endp +bluegl_glVertexAttribI1i endp -extrn __blue_glCore_glNormalStream3bvATI: qword -bluegl_glNormalStream3bvATI proc - mov r11, __blue_glCore_glNormalStream3bvATI +extrn __blue_glCore_glVertexAttribI2i: qword +bluegl_glVertexAttribI2i proc + mov r11, __blue_glCore_glVertexAttribI2i jmp r11 -bluegl_glNormalStream3bvATI endp +bluegl_glVertexAttribI2i endp -extrn __blue_glCore_glNamedFramebufferTextureFaceEXT: qword -bluegl_glNamedFramebufferTextureFaceEXT proc - mov r11, __blue_glCore_glNamedFramebufferTextureFaceEXT +extrn __blue_glCore_glVertexAttribI3i: qword +bluegl_glVertexAttribI3i proc + mov r11, __blue_glCore_glVertexAttribI3i jmp r11 -bluegl_glNamedFramebufferTextureFaceEXT endp +bluegl_glVertexAttribI3i endp -extrn __blue_glCore_glGetConvolutionParameterivEXT: qword -bluegl_glGetConvolutionParameterivEXT proc - mov r11, __blue_glCore_glGetConvolutionParameterivEXT +extrn __blue_glCore_glVertexAttribI4i: qword +bluegl_glVertexAttribI4i proc + mov r11, __blue_glCore_glVertexAttribI4i jmp r11 -bluegl_glGetConvolutionParameterivEXT endp +bluegl_glVertexAttribI4i endp -extrn __blue_glCore_glProgramPathFragmentInputGenNV: qword -bluegl_glProgramPathFragmentInputGenNV proc - mov r11, __blue_glCore_glProgramPathFragmentInputGenNV +extrn __blue_glCore_glVertexAttribI1ui: qword +bluegl_glVertexAttribI1ui proc + mov r11, __blue_glCore_glVertexAttribI1ui jmp r11 -bluegl_glProgramPathFragmentInputGenNV endp +bluegl_glVertexAttribI1ui endp -extrn __blue_glCore_glIsFramebufferEXT: qword -bluegl_glIsFramebufferEXT proc - mov r11, __blue_glCore_glIsFramebufferEXT +extrn __blue_glCore_glVertexAttribI2ui: qword +bluegl_glVertexAttribI2ui proc + mov r11, __blue_glCore_glVertexAttribI2ui jmp r11 -bluegl_glIsFramebufferEXT endp +bluegl_glVertexAttribI2ui endp -extrn __blue_glCore_glIsVertexArray: qword -bluegl_glIsVertexArray proc - mov r11, __blue_glCore_glIsVertexArray +extrn __blue_glCore_glVertexAttribI3ui: qword +bluegl_glVertexAttribI3ui proc + mov r11, __blue_glCore_glVertexAttribI3ui jmp r11 -bluegl_glIsVertexArray endp +bluegl_glVertexAttribI3ui endp -extrn __blue_glCore_glGetVertexAttribIivEXT: qword -bluegl_glGetVertexAttribIivEXT proc - mov r11, __blue_glCore_glGetVertexAttribIivEXT +extrn __blue_glCore_glVertexAttribI4ui: qword +bluegl_glVertexAttribI4ui proc + mov r11, __blue_glCore_glVertexAttribI4ui jmp r11 -bluegl_glGetVertexAttribIivEXT endp +bluegl_glVertexAttribI4ui endp -extrn __blue_glCore_glTextureParameterIivEXT: qword -bluegl_glTextureParameterIivEXT proc - mov r11, __blue_glCore_glTextureParameterIivEXT +extrn __blue_glCore_glVertexAttribI1iv: qword +bluegl_glVertexAttribI1iv proc + mov r11, __blue_glCore_glVertexAttribI1iv jmp r11 -bluegl_glTextureParameterIivEXT endp +bluegl_glVertexAttribI1iv endp -extrn __blue_glCore_glGetnPixelMapuiv: qword -bluegl_glGetnPixelMapuiv proc - mov r11, __blue_glCore_glGetnPixelMapuiv +extrn __blue_glCore_glVertexAttribI2iv: qword +bluegl_glVertexAttribI2iv proc + mov r11, __blue_glCore_glVertexAttribI2iv jmp r11 -bluegl_glGetnPixelMapuiv endp +bluegl_glVertexAttribI2iv endp -extrn __blue_glCore_glGetInvariantFloatvEXT: qword -bluegl_glGetInvariantFloatvEXT proc - mov r11, __blue_glCore_glGetInvariantFloatvEXT +extrn __blue_glCore_glVertexAttribI3iv: qword +bluegl_glVertexAttribI3iv proc + mov r11, __blue_glCore_glVertexAttribI3iv jmp r11 -bluegl_glGetInvariantFloatvEXT endp +bluegl_glVertexAttribI3iv endp -extrn __blue_glCore_glAttachShader: qword -bluegl_glAttachShader proc - mov r11, __blue_glCore_glAttachShader +extrn __blue_glCore_glVertexAttribI4iv: qword +bluegl_glVertexAttribI4iv proc + mov r11, __blue_glCore_glVertexAttribI4iv jmp r11 -bluegl_glAttachShader endp +bluegl_glVertexAttribI4iv endp -extrn __blue_glCore_glSecondaryColor3i: qword -bluegl_glSecondaryColor3i proc - mov r11, __blue_glCore_glSecondaryColor3i +extrn __blue_glCore_glVertexAttribI1uiv: qword +bluegl_glVertexAttribI1uiv proc + mov r11, __blue_glCore_glVertexAttribI1uiv jmp r11 -bluegl_glSecondaryColor3i endp +bluegl_glVertexAttribI1uiv endp -extrn __blue_glCore_glTexCoord4hvNV: qword -bluegl_glTexCoord4hvNV proc - mov r11, __blue_glCore_glTexCoord4hvNV +extrn __blue_glCore_glVertexAttribI2uiv: qword +bluegl_glVertexAttribI2uiv proc + mov r11, __blue_glCore_glVertexAttribI2uiv jmp r11 -bluegl_glTexCoord4hvNV endp +bluegl_glVertexAttribI2uiv endp -extrn __blue_glCore_glColorTableSGI: qword -bluegl_glColorTableSGI proc - mov r11, __blue_glCore_glColorTableSGI +extrn __blue_glCore_glVertexAttribI3uiv: qword +bluegl_glVertexAttribI3uiv proc + mov r11, __blue_glCore_glVertexAttribI3uiv jmp r11 -bluegl_glColorTableSGI endp +bluegl_glVertexAttribI3uiv endp -extrn __blue_glCore_glProgramUniform4uivEXT: qword -bluegl_glProgramUniform4uivEXT proc - mov r11, __blue_glCore_glProgramUniform4uivEXT +extrn __blue_glCore_glVertexAttribI4uiv: qword +bluegl_glVertexAttribI4uiv proc + mov r11, __blue_glCore_glVertexAttribI4uiv jmp r11 -bluegl_glProgramUniform4uivEXT endp +bluegl_glVertexAttribI4uiv endp -extrn __blue_glCore_glPointSizexOES: qword -bluegl_glPointSizexOES proc - mov r11, __blue_glCore_glPointSizexOES +extrn __blue_glCore_glVertexAttribI4bv: qword +bluegl_glVertexAttribI4bv proc + mov r11, __blue_glCore_glVertexAttribI4bv jmp r11 -bluegl_glPointSizexOES endp +bluegl_glVertexAttribI4bv endp -extrn __blue_glCore_glTrackMatrixNV: qword -bluegl_glTrackMatrixNV proc - mov r11, __blue_glCore_glTrackMatrixNV +extrn __blue_glCore_glVertexAttribI4sv: qword +bluegl_glVertexAttribI4sv proc + mov r11, __blue_glCore_glVertexAttribI4sv jmp r11 -bluegl_glTrackMatrixNV endp +bluegl_glVertexAttribI4sv endp -extrn __blue_glCore_glMultiTexCoord1fv: qword -bluegl_glMultiTexCoord1fv proc - mov r11, __blue_glCore_glMultiTexCoord1fv +extrn __blue_glCore_glVertexAttribI4ubv: qword +bluegl_glVertexAttribI4ubv proc + mov r11, __blue_glCore_glVertexAttribI4ubv jmp r11 -bluegl_glMultiTexCoord1fv endp +bluegl_glVertexAttribI4ubv endp -extrn __blue_glCore_glSecondaryColorPointerListIBM: qword -bluegl_glSecondaryColorPointerListIBM proc - mov r11, __blue_glCore_glSecondaryColorPointerListIBM +extrn __blue_glCore_glVertexAttribI4usv: qword +bluegl_glVertexAttribI4usv proc + mov r11, __blue_glCore_glVertexAttribI4usv jmp r11 -bluegl_glSecondaryColorPointerListIBM endp +bluegl_glVertexAttribI4usv endp -extrn __blue_glCore_glGenBuffersARB: qword -bluegl_glGenBuffersARB proc - mov r11, __blue_glCore_glGenBuffersARB +extrn __blue_glCore_glGetUniformuiv: qword +bluegl_glGetUniformuiv proc + mov r11, __blue_glCore_glGetUniformuiv jmp r11 -bluegl_glGenBuffersARB endp +bluegl_glGetUniformuiv endp -extrn __blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN: qword -bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN proc - mov r11, __blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN +extrn __blue_glCore_glBindFragDataLocation: qword +bluegl_glBindFragDataLocation proc + mov r11, __blue_glCore_glBindFragDataLocation jmp r11 -bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN endp +bluegl_glBindFragDataLocation endp -extrn __blue_glCore_glCopyColorTable: qword -bluegl_glCopyColorTable proc - mov r11, __blue_glCore_glCopyColorTable +extrn __blue_glCore_glGetFragDataLocation: qword +bluegl_glGetFragDataLocation proc + mov r11, __blue_glCore_glGetFragDataLocation jmp r11 -bluegl_glCopyColorTable endp +bluegl_glGetFragDataLocation endp -extrn __blue_glCore_glTexPageCommitmentARB: qword -bluegl_glTexPageCommitmentARB proc - mov r11, __blue_glCore_glTexPageCommitmentARB +extrn __blue_glCore_glUniform1ui: qword +bluegl_glUniform1ui proc + mov r11, __blue_glCore_glUniform1ui jmp r11 -bluegl_glTexPageCommitmentARB endp +bluegl_glUniform1ui endp -extrn __blue_glCore_glSetFenceAPPLE: qword -bluegl_glSetFenceAPPLE proc - mov r11, __blue_glCore_glSetFenceAPPLE +extrn __blue_glCore_glUniform2ui: qword +bluegl_glUniform2ui proc + mov r11, __blue_glCore_glUniform2ui jmp r11 -bluegl_glSetFenceAPPLE endp +bluegl_glUniform2ui endp -extrn __blue_glCore_glMultiTexCoord2dvARB: qword -bluegl_glMultiTexCoord2dvARB proc - mov r11, __blue_glCore_glMultiTexCoord2dvARB +extrn __blue_glCore_glUniform3ui: qword +bluegl_glUniform3ui proc + mov r11, __blue_glCore_glUniform3ui jmp r11 -bluegl_glMultiTexCoord2dvARB endp +bluegl_glUniform3ui endp -extrn __blue_glCore_glVertex4hvNV: qword -bluegl_glVertex4hvNV proc - mov r11, __blue_glCore_glVertex4hvNV +extrn __blue_glCore_glUniform4ui: qword +bluegl_glUniform4ui proc + mov r11, __blue_glCore_glUniform4ui jmp r11 -bluegl_glVertex4hvNV endp +bluegl_glUniform4ui endp -extrn __blue_glCore_glBindVertexBuffer: qword -bluegl_glBindVertexBuffer proc - mov r11, __blue_glCore_glBindVertexBuffer +extrn __blue_glCore_glUniform1uiv: qword +bluegl_glUniform1uiv proc + mov r11, __blue_glCore_glUniform1uiv jmp r11 -bluegl_glBindVertexBuffer endp +bluegl_glUniform1uiv endp -extrn __blue_glCore_glVertex3xvOES: qword -bluegl_glVertex3xvOES proc - mov r11, __blue_glCore_glVertex3xvOES +extrn __blue_glCore_glUniform2uiv: qword +bluegl_glUniform2uiv proc + mov r11, __blue_glCore_glUniform2uiv jmp r11 -bluegl_glVertex3xvOES endp +bluegl_glUniform2uiv endp -extrn __blue_glCore_glConvolutionParameterivEXT: qword -bluegl_glConvolutionParameterivEXT proc - mov r11, __blue_glCore_glConvolutionParameterivEXT +extrn __blue_glCore_glUniform3uiv: qword +bluegl_glUniform3uiv proc + mov r11, __blue_glCore_glUniform3uiv jmp r11 -bluegl_glConvolutionParameterivEXT endp +bluegl_glUniform3uiv endp -extrn __blue_glCore_glProgramUniform3ui64vARB: qword -bluegl_glProgramUniform3ui64vARB proc - mov r11, __blue_glCore_glProgramUniform3ui64vARB +extrn __blue_glCore_glUniform4uiv: qword +bluegl_glUniform4uiv proc + mov r11, __blue_glCore_glUniform4uiv jmp r11 -bluegl_glProgramUniform3ui64vARB endp +bluegl_glUniform4uiv endp -extrn __blue_glCore_glProgramUniform2dv: qword -bluegl_glProgramUniform2dv proc - mov r11, __blue_glCore_glProgramUniform2dv +extrn __blue_glCore_glTexParameterIiv: qword +bluegl_glTexParameterIiv proc + mov r11, __blue_glCore_glTexParameterIiv jmp r11 -bluegl_glProgramUniform2dv endp +bluegl_glTexParameterIiv endp -extrn __blue_glCore_glWindowPos4sMESA: qword -bluegl_glWindowPos4sMESA proc - mov r11, __blue_glCore_glWindowPos4sMESA +extrn __blue_glCore_glTexParameterIuiv: qword +bluegl_glTexParameterIuiv proc + mov r11, __blue_glCore_glTexParameterIuiv jmp r11 -bluegl_glWindowPos4sMESA endp +bluegl_glTexParameterIuiv endp -extrn __blue_glCore_glMultiTexImage1DEXT: qword -bluegl_glMultiTexImage1DEXT proc - mov r11, __blue_glCore_glMultiTexImage1DEXT +extrn __blue_glCore_glGetTexParameterIiv: qword +bluegl_glGetTexParameterIiv proc + mov r11, __blue_glCore_glGetTexParameterIiv jmp r11 -bluegl_glMultiTexImage1DEXT endp +bluegl_glGetTexParameterIiv endp -extrn __blue_glCore_glRenderbufferStorage: qword -bluegl_glRenderbufferStorage proc - mov r11, __blue_glCore_glRenderbufferStorage +extrn __blue_glCore_glGetTexParameterIuiv: qword +bluegl_glGetTexParameterIuiv proc + mov r11, __blue_glCore_glGetTexParameterIuiv jmp r11 -bluegl_glRenderbufferStorage endp +bluegl_glGetTexParameterIuiv endp -extrn __blue_glCore_glConvolutionFilter2D: qword -bluegl_glConvolutionFilter2D proc - mov r11, __blue_glCore_glConvolutionFilter2D +extrn __blue_glCore_glClearBufferiv: qword +bluegl_glClearBufferiv proc + mov r11, __blue_glCore_glClearBufferiv jmp r11 -bluegl_glConvolutionFilter2D endp +bluegl_glClearBufferiv endp -extrn __blue_glCore_glBinormal3bEXT: qword -bluegl_glBinormal3bEXT proc - mov r11, __blue_glCore_glBinormal3bEXT +extrn __blue_glCore_glClearBufferuiv: qword +bluegl_glClearBufferuiv proc + mov r11, __blue_glCore_glClearBufferuiv jmp r11 -bluegl_glBinormal3bEXT endp +bluegl_glClearBufferuiv endp -extrn __blue_glCore_glFragmentLightivSGIX: qword -bluegl_glFragmentLightivSGIX proc - mov r11, __blue_glCore_glFragmentLightivSGIX +extrn __blue_glCore_glClearBufferfv: qword +bluegl_glClearBufferfv proc + mov r11, __blue_glCore_glClearBufferfv jmp r11 -bluegl_glFragmentLightivSGIX endp +bluegl_glClearBufferfv endp -extrn __blue_glCore_glProgramUniform3iv: qword -bluegl_glProgramUniform3iv proc - mov r11, __blue_glCore_glProgramUniform3iv +extrn __blue_glCore_glClearBufferfi: qword +bluegl_glClearBufferfi proc + mov r11, __blue_glCore_glClearBufferfi jmp r11 -bluegl_glProgramUniform3iv endp +bluegl_glClearBufferfi endp -extrn __blue_glCore_glIsQuery: qword -bluegl_glIsQuery proc - mov r11, __blue_glCore_glIsQuery +extrn __blue_glCore_glGetStringi: qword +bluegl_glGetStringi proc + mov r11, __blue_glCore_glGetStringi jmp r11 -bluegl_glIsQuery endp +bluegl_glGetStringi endp -extrn __blue_glCore_glVertexStream2sATI: qword -bluegl_glVertexStream2sATI proc - mov r11, __blue_glCore_glVertexStream2sATI +extrn __blue_glCore_glIsRenderbuffer: qword +bluegl_glIsRenderbuffer proc + mov r11, __blue_glCore_glIsRenderbuffer jmp r11 -bluegl_glVertexStream2sATI endp +bluegl_glIsRenderbuffer endp -extrn __blue_glCore_glProgramUniform4iEXT: qword -bluegl_glProgramUniform4iEXT proc - mov r11, __blue_glCore_glProgramUniform4iEXT +extrn __blue_glCore_glBindRenderbuffer: qword +bluegl_glBindRenderbuffer proc + mov r11, __blue_glCore_glBindRenderbuffer jmp r11 -bluegl_glProgramUniform4iEXT endp +bluegl_glBindRenderbuffer endp -extrn __blue_glCore_glGetInvariantBooleanvEXT: qword -bluegl_glGetInvariantBooleanvEXT proc - mov r11, __blue_glCore_glGetInvariantBooleanvEXT +extrn __blue_glCore_glDeleteRenderbuffers: qword +bluegl_glDeleteRenderbuffers proc + mov r11, __blue_glCore_glDeleteRenderbuffers jmp r11 -bluegl_glGetInvariantBooleanvEXT endp +bluegl_glDeleteRenderbuffers endp -extrn __blue_glCore_glSecondaryColorFormatNV: qword -bluegl_glSecondaryColorFormatNV proc - mov r11, __blue_glCore_glSecondaryColorFormatNV +extrn __blue_glCore_glGenRenderbuffers: qword +bluegl_glGenRenderbuffers proc + mov r11, __blue_glCore_glGenRenderbuffers jmp r11 -bluegl_glSecondaryColorFormatNV endp +bluegl_glGenRenderbuffers endp -extrn __blue_glCore_glVertexAttrib4fNV: qword -bluegl_glVertexAttrib4fNV proc - mov r11, __blue_glCore_glVertexAttrib4fNV +extrn __blue_glCore_glRenderbufferStorage: qword +bluegl_glRenderbufferStorage proc + mov r11, __blue_glCore_glRenderbufferStorage jmp r11 -bluegl_glVertexAttrib4fNV endp +bluegl_glRenderbufferStorage endp -extrn __blue_glCore_glColorFragmentOp1ATI: qword -bluegl_glColorFragmentOp1ATI proc - mov r11, __blue_glCore_glColorFragmentOp1ATI +extrn __blue_glCore_glGetRenderbufferParameteriv: qword +bluegl_glGetRenderbufferParameteriv proc + mov r11, __blue_glCore_glGetRenderbufferParameteriv jmp r11 -bluegl_glColorFragmentOp1ATI endp +bluegl_glGetRenderbufferParameteriv endp -extrn __blue_glCore_glTransformFeedbackBufferBase: qword -bluegl_glTransformFeedbackBufferBase proc - mov r11, __blue_glCore_glTransformFeedbackBufferBase +extrn __blue_glCore_glIsFramebuffer: qword +bluegl_glIsFramebuffer proc + mov r11, __blue_glCore_glIsFramebuffer jmp r11 -bluegl_glTransformFeedbackBufferBase endp +bluegl_glIsFramebuffer endp -extrn __blue_glCore_glGetTexParameteriv: qword -bluegl_glGetTexParameteriv proc - mov r11, __blue_glCore_glGetTexParameteriv +extrn __blue_glCore_glBindFramebuffer: qword +bluegl_glBindFramebuffer proc + mov r11, __blue_glCore_glBindFramebuffer jmp r11 -bluegl_glGetTexParameteriv endp +bluegl_glBindFramebuffer endp -extrn __blue_glCore_glGetVertexAttribIiv: qword -bluegl_glGetVertexAttribIiv proc - mov r11, __blue_glCore_glGetVertexAttribIiv +extrn __blue_glCore_glDeleteFramebuffers: qword +bluegl_glDeleteFramebuffers proc + mov r11, __blue_glCore_glDeleteFramebuffers jmp r11 -bluegl_glGetVertexAttribIiv endp +bluegl_glDeleteFramebuffers endp -extrn __blue_glCore_glEndOcclusionQueryNV: qword -bluegl_glEndOcclusionQueryNV proc - mov r11, __blue_glCore_glEndOcclusionQueryNV +extrn __blue_glCore_glGenFramebuffers: qword +bluegl_glGenFramebuffers proc + mov r11, __blue_glCore_glGenFramebuffers jmp r11 -bluegl_glEndOcclusionQueryNV endp +bluegl_glGenFramebuffers endp -extrn __blue_glCore_glTransformFeedbackStreamAttribsNV: qword -bluegl_glTransformFeedbackStreamAttribsNV proc - mov r11, __blue_glCore_glTransformFeedbackStreamAttribsNV +extrn __blue_glCore_glCheckFramebufferStatus: qword +bluegl_glCheckFramebufferStatus proc + mov r11, __blue_glCore_glCheckFramebufferStatus jmp r11 -bluegl_glTransformFeedbackStreamAttribsNV endp +bluegl_glCheckFramebufferStatus endp -extrn __blue_glCore_glGetQueryBufferObjecti64v: qword -bluegl_glGetQueryBufferObjecti64v proc - mov r11, __blue_glCore_glGetQueryBufferObjecti64v +extrn __blue_glCore_glFramebufferTexture1D: qword +bluegl_glFramebufferTexture1D proc + mov r11, __blue_glCore_glFramebufferTexture1D jmp r11 -bluegl_glGetQueryBufferObjecti64v endp +bluegl_glFramebufferTexture1D endp -extrn __blue_glCore_glStencilFillPathInstancedNV: qword -bluegl_glStencilFillPathInstancedNV proc - mov r11, __blue_glCore_glStencilFillPathInstancedNV +extrn __blue_glCore_glFramebufferTexture2D: qword +bluegl_glFramebufferTexture2D proc + mov r11, __blue_glCore_glFramebufferTexture2D jmp r11 -bluegl_glStencilFillPathInstancedNV endp +bluegl_glFramebufferTexture2D endp -extrn __blue_glCore_glDrawCommandsStatesNV: qword -bluegl_glDrawCommandsStatesNV proc - mov r11, __blue_glCore_glDrawCommandsStatesNV +extrn __blue_glCore_glFramebufferTexture3D: qword +bluegl_glFramebufferTexture3D proc + mov r11, __blue_glCore_glFramebufferTexture3D jmp r11 -bluegl_glDrawCommandsStatesNV endp +bluegl_glFramebufferTexture3D endp -extrn __blue_glCore_glGetSamplerParameterfv: qword -bluegl_glGetSamplerParameterfv proc - mov r11, __blue_glCore_glGetSamplerParameterfv +extrn __blue_glCore_glFramebufferRenderbuffer: qword +bluegl_glFramebufferRenderbuffer proc + mov r11, __blue_glCore_glFramebufferRenderbuffer jmp r11 -bluegl_glGetSamplerParameterfv endp +bluegl_glFramebufferRenderbuffer endp -extrn __blue_glCore_glMultiTexCoord4fARB: qword -bluegl_glMultiTexCoord4fARB proc - mov r11, __blue_glCore_glMultiTexCoord4fARB +extrn __blue_glCore_glGetFramebufferAttachmentParameteriv: qword +bluegl_glGetFramebufferAttachmentParameteriv proc + mov r11, __blue_glCore_glGetFramebufferAttachmentParameteriv jmp r11 -bluegl_glMultiTexCoord4fARB endp +bluegl_glGetFramebufferAttachmentParameteriv endp -extrn __blue_glCore_glUniform3ui64NV: qword -bluegl_glUniform3ui64NV proc - mov r11, __blue_glCore_glUniform3ui64NV +extrn __blue_glCore_glGenerateMipmap: qword +bluegl_glGenerateMipmap proc + mov r11, __blue_glCore_glGenerateMipmap jmp r11 -bluegl_glUniform3ui64NV endp +bluegl_glGenerateMipmap endp -extrn __blue_glCore_glVertexWeighthNV: qword -bluegl_glVertexWeighthNV proc - mov r11, __blue_glCore_glVertexWeighthNV +extrn __blue_glCore_glBlitFramebuffer: qword +bluegl_glBlitFramebuffer proc + mov r11, __blue_glCore_glBlitFramebuffer jmp r11 -bluegl_glVertexWeighthNV endp +bluegl_glBlitFramebuffer endp -extrn __blue_glCore_glWindowPos3ivARB: qword -bluegl_glWindowPos3ivARB proc - mov r11, __blue_glCore_glWindowPos3ivARB +extrn __blue_glCore_glRenderbufferStorageMultisample: qword +bluegl_glRenderbufferStorageMultisample proc + mov r11, __blue_glCore_glRenderbufferStorageMultisample jmp r11 -bluegl_glWindowPos3ivARB endp +bluegl_glRenderbufferStorageMultisample endp -extrn __blue_glCore_glSecondaryColor3ivEXT: qword -bluegl_glSecondaryColor3ivEXT proc - mov r11, __blue_glCore_glSecondaryColor3ivEXT +extrn __blue_glCore_glFramebufferTextureLayer: qword +bluegl_glFramebufferTextureLayer proc + mov r11, __blue_glCore_glFramebufferTextureLayer jmp r11 -bluegl_glSecondaryColor3ivEXT endp +bluegl_glFramebufferTextureLayer endp + +extrn __blue_glCore_glMapBufferRange: qword +bluegl_glMapBufferRange proc + mov r11, __blue_glCore_glMapBufferRange + jmp r11 +bluegl_glMapBufferRange endp + +extrn __blue_glCore_glFlushMappedBufferRange: qword +bluegl_glFlushMappedBufferRange proc + mov r11, __blue_glCore_glFlushMappedBufferRange + jmp r11 +bluegl_glFlushMappedBufferRange endp extrn __blue_glCore_glBindVertexArray: qword bluegl_glBindVertexArray proc @@ -1701,1847 +1717,1769 @@ bluegl_glBindVertexArray proc jmp r11 bluegl_glBindVertexArray endp -extrn __blue_glCore_glGetVertexAttribLui64vARB: qword -bluegl_glGetVertexAttribLui64vARB proc - mov r11, __blue_glCore_glGetVertexAttribLui64vARB +extrn __blue_glCore_glDeleteVertexArrays: qword +bluegl_glDeleteVertexArrays proc + mov r11, __blue_glCore_glDeleteVertexArrays jmp r11 -bluegl_glGetVertexAttribLui64vARB endp +bluegl_glDeleteVertexArrays endp -extrn __blue_glCore_glUniform4i64NV: qword -bluegl_glUniform4i64NV proc - mov r11, __blue_glCore_glUniform4i64NV +extrn __blue_glCore_glGenVertexArrays: qword +bluegl_glGenVertexArrays proc + mov r11, __blue_glCore_glGenVertexArrays jmp r11 -bluegl_glUniform4i64NV endp +bluegl_glGenVertexArrays endp -extrn __blue_glCore_glBlendBarrierNV: qword -bluegl_glBlendBarrierNV proc - mov r11, __blue_glCore_glBlendBarrierNV +extrn __blue_glCore_glIsVertexArray: qword +bluegl_glIsVertexArray proc + mov r11, __blue_glCore_glIsVertexArray jmp r11 -bluegl_glBlendBarrierNV endp +bluegl_glIsVertexArray endp -extrn __blue_glCore_glWindowPos3fvARB: qword -bluegl_glWindowPos3fvARB proc - mov r11, __blue_glCore_glWindowPos3fvARB +extrn __blue_glCore_glDrawArraysInstanced: qword +bluegl_glDrawArraysInstanced proc + mov r11, __blue_glCore_glDrawArraysInstanced jmp r11 -bluegl_glWindowPos3fvARB endp +bluegl_glDrawArraysInstanced endp -extrn __blue_glCore_glBlendEquationSeparateiARB: qword -bluegl_glBlendEquationSeparateiARB proc - mov r11, __blue_glCore_glBlendEquationSeparateiARB +extrn __blue_glCore_glDrawElementsInstanced: qword +bluegl_glDrawElementsInstanced proc + mov r11, __blue_glCore_glDrawElementsInstanced jmp r11 -bluegl_glBlendEquationSeparateiARB endp +bluegl_glDrawElementsInstanced endp -extrn __blue_glCore_glGetVariantFloatvEXT: qword -bluegl_glGetVariantFloatvEXT proc - mov r11, __blue_glCore_glGetVariantFloatvEXT +extrn __blue_glCore_glTexBuffer: qword +bluegl_glTexBuffer proc + mov r11, __blue_glCore_glTexBuffer jmp r11 -bluegl_glGetVariantFloatvEXT endp +bluegl_glTexBuffer endp -extrn __blue_glCore_glColorSubTableEXT: qword -bluegl_glColorSubTableEXT proc - mov r11, __blue_glCore_glColorSubTableEXT +extrn __blue_glCore_glPrimitiveRestartIndex: qword +bluegl_glPrimitiveRestartIndex proc + mov r11, __blue_glCore_glPrimitiveRestartIndex jmp r11 -bluegl_glColorSubTableEXT endp +bluegl_glPrimitiveRestartIndex endp -extrn __blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN: qword -bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN proc - mov r11, __blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN - jmp r11 -bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN endp - -extrn __blue_glCore_glGetProgramResourceiv: qword -bluegl_glGetProgramResourceiv proc - mov r11, __blue_glCore_glGetProgramResourceiv - jmp r11 -bluegl_glGetProgramResourceiv endp - -extrn __blue_glCore_glMultiTexCoord1f: qword -bluegl_glMultiTexCoord1f proc - mov r11, __blue_glCore_glMultiTexCoord1f - jmp r11 -bluegl_glMultiTexCoord1f endp - -extrn __blue_glCore_glGetNamedFramebufferAttachmentParameteriv: qword -bluegl_glGetNamedFramebufferAttachmentParameteriv proc - mov r11, __blue_glCore_glGetNamedFramebufferAttachmentParameteriv - jmp r11 -bluegl_glGetNamedFramebufferAttachmentParameteriv endp - -extrn __blue_glCore_glDeleteProgramsNV: qword -bluegl_glDeleteProgramsNV proc - mov r11, __blue_glCore_glDeleteProgramsNV - jmp r11 -bluegl_glDeleteProgramsNV endp - -extrn __blue_glCore_glGlobalAlphaFactoriSUN: qword -bluegl_glGlobalAlphaFactoriSUN proc - mov r11, __blue_glCore_glGlobalAlphaFactoriSUN - jmp r11 -bluegl_glGlobalAlphaFactoriSUN endp - -extrn __blue_glCore_glGetFinalCombinerInputParameterfvNV: qword -bluegl_glGetFinalCombinerInputParameterfvNV proc - mov r11, __blue_glCore_glGetFinalCombinerInputParameterfvNV - jmp r11 -bluegl_glGetFinalCombinerInputParameterfvNV endp - -extrn __blue_glCore_glNormalStream3dATI: qword -bluegl_glNormalStream3dATI proc - mov r11, __blue_glCore_glNormalStream3dATI - jmp r11 -bluegl_glNormalStream3dATI endp - -extrn __blue_glCore_glMultiTexEnvivEXT: qword -bluegl_glMultiTexEnvivEXT proc - mov r11, __blue_glCore_glMultiTexEnvivEXT - jmp r11 -bluegl_glMultiTexEnvivEXT endp - -extrn __blue_glCore_glTexCoord4xvOES: qword -bluegl_glTexCoord4xvOES proc - mov r11, __blue_glCore_glTexCoord4xvOES - jmp r11 -bluegl_glTexCoord4xvOES endp - -extrn __blue_glCore_glProgramUniform4dvEXT: qword -bluegl_glProgramUniform4dvEXT proc - mov r11, __blue_glCore_glProgramUniform4dvEXT - jmp r11 -bluegl_glProgramUniform4dvEXT endp - -extrn __blue_glCore_glProgramUniform2ui64vARB: qword -bluegl_glProgramUniform2ui64vARB proc - mov r11, __blue_glCore_glProgramUniform2ui64vARB - jmp r11 -bluegl_glProgramUniform2ui64vARB endp - -extrn __blue_glCore_glBindBufferBaseNV: qword -bluegl_glBindBufferBaseNV proc - mov r11, __blue_glCore_glBindBufferBaseNV - jmp r11 -bluegl_glBindBufferBaseNV endp - -extrn __blue_glCore_glVertexAttrib4s: qword -bluegl_glVertexAttrib4s proc - mov r11, __blue_glCore_glVertexAttrib4s +extrn __blue_glCore_glCopyBufferSubData: qword +bluegl_glCopyBufferSubData proc + mov r11, __blue_glCore_glCopyBufferSubData jmp r11 -bluegl_glVertexAttrib4s endp +bluegl_glCopyBufferSubData endp -extrn __blue_glCore_glTexCoord2fVertex3fvSUN: qword -bluegl_glTexCoord2fVertex3fvSUN proc - mov r11, __blue_glCore_glTexCoord2fVertex3fvSUN +extrn __blue_glCore_glGetUniformIndices: qword +bluegl_glGetUniformIndices proc + mov r11, __blue_glCore_glGetUniformIndices jmp r11 -bluegl_glTexCoord2fVertex3fvSUN endp +bluegl_glGetUniformIndices endp -extrn __blue_glCore_glMatrixMultdEXT: qword -bluegl_glMatrixMultdEXT proc - mov r11, __blue_glCore_glMatrixMultdEXT +extrn __blue_glCore_glGetActiveUniformsiv: qword +bluegl_glGetActiveUniformsiv proc + mov r11, __blue_glCore_glGetActiveUniformsiv jmp r11 -bluegl_glMatrixMultdEXT endp +bluegl_glGetActiveUniformsiv endp -extrn __blue_glCore_glGetnMapdvARB: qword -bluegl_glGetnMapdvARB proc - mov r11, __blue_glCore_glGetnMapdvARB +extrn __blue_glCore_glGetActiveUniformName: qword +bluegl_glGetActiveUniformName proc + mov r11, __blue_glCore_glGetActiveUniformName jmp r11 -bluegl_glGetnMapdvARB endp +bluegl_glGetActiveUniformName endp -extrn __blue_glCore_glEnableVertexArrayEXT: qword -bluegl_glEnableVertexArrayEXT proc - mov r11, __blue_glCore_glEnableVertexArrayEXT +extrn __blue_glCore_glGetUniformBlockIndex: qword +bluegl_glGetUniformBlockIndex proc + mov r11, __blue_glCore_glGetUniformBlockIndex jmp r11 -bluegl_glEnableVertexArrayEXT endp +bluegl_glGetUniformBlockIndex endp -extrn __blue_glCore_glConvolutionFilter1DEXT: qword -bluegl_glConvolutionFilter1DEXT proc - mov r11, __blue_glCore_glConvolutionFilter1DEXT +extrn __blue_glCore_glGetActiveUniformBlockiv: qword +bluegl_glGetActiveUniformBlockiv proc + mov r11, __blue_glCore_glGetActiveUniformBlockiv jmp r11 -bluegl_glConvolutionFilter1DEXT endp +bluegl_glGetActiveUniformBlockiv endp -extrn __blue_glCore_glMemoryBarrierEXT: qword -bluegl_glMemoryBarrierEXT proc - mov r11, __blue_glCore_glMemoryBarrierEXT +extrn __blue_glCore_glGetActiveUniformBlockName: qword +bluegl_glGetActiveUniformBlockName proc + mov r11, __blue_glCore_glGetActiveUniformBlockName jmp r11 -bluegl_glMemoryBarrierEXT endp +bluegl_glGetActiveUniformBlockName endp -extrn __blue_glCore_glNewObjectBufferATI: qword -bluegl_glNewObjectBufferATI proc - mov r11, __blue_glCore_glNewObjectBufferATI +extrn __blue_glCore_glUniformBlockBinding: qword +bluegl_glUniformBlockBinding proc + mov r11, __blue_glCore_glUniformBlockBinding jmp r11 -bluegl_glNewObjectBufferATI endp +bluegl_glUniformBlockBinding endp -extrn __blue_glCore_glProgramUniform2fv: qword -bluegl_glProgramUniform2fv proc - mov r11, __blue_glCore_glProgramUniform2fv +extrn __blue_glCore_glDrawElementsBaseVertex: qword +bluegl_glDrawElementsBaseVertex proc + mov r11, __blue_glCore_glDrawElementsBaseVertex jmp r11 -bluegl_glProgramUniform2fv endp +bluegl_glDrawElementsBaseVertex endp -extrn __blue_glCore_glUniformMatrix4x3fv: qword -bluegl_glUniformMatrix4x3fv proc - mov r11, __blue_glCore_glUniformMatrix4x3fv +extrn __blue_glCore_glDrawRangeElementsBaseVertex: qword +bluegl_glDrawRangeElementsBaseVertex proc + mov r11, __blue_glCore_glDrawRangeElementsBaseVertex jmp r11 -bluegl_glUniformMatrix4x3fv endp +bluegl_glDrawRangeElementsBaseVertex endp -extrn __blue_glCore_glGetHistogramParameterfv: qword -bluegl_glGetHistogramParameterfv proc - mov r11, __blue_glCore_glGetHistogramParameterfv +extrn __blue_glCore_glDrawElementsInstancedBaseVertex: qword +bluegl_glDrawElementsInstancedBaseVertex proc + mov r11, __blue_glCore_glDrawElementsInstancedBaseVertex jmp r11 -bluegl_glGetHistogramParameterfv endp +bluegl_glDrawElementsInstancedBaseVertex endp -extrn __blue_glCore_glFrameTerminatorGREMEDY: qword -bluegl_glFrameTerminatorGREMEDY proc - mov r11, __blue_glCore_glFrameTerminatorGREMEDY +extrn __blue_glCore_glMultiDrawElementsBaseVertex: qword +bluegl_glMultiDrawElementsBaseVertex proc + mov r11, __blue_glCore_glMultiDrawElementsBaseVertex jmp r11 -bluegl_glFrameTerminatorGREMEDY endp +bluegl_glMultiDrawElementsBaseVertex endp -extrn __blue_glCore_glGetProgramLocalParameterfvARB: qword -bluegl_glGetProgramLocalParameterfvARB proc - mov r11, __blue_glCore_glGetProgramLocalParameterfvARB +extrn __blue_glCore_glProvokingVertex: qword +bluegl_glProvokingVertex proc + mov r11, __blue_glCore_glProvokingVertex jmp r11 -bluegl_glGetProgramLocalParameterfvARB endp +bluegl_glProvokingVertex endp -extrn __blue_glCore_glUnmapNamedBuffer: qword -bluegl_glUnmapNamedBuffer proc - mov r11, __blue_glCore_glUnmapNamedBuffer +extrn __blue_glCore_glFenceSync: qword +bluegl_glFenceSync proc + mov r11, __blue_glCore_glFenceSync jmp r11 -bluegl_glUnmapNamedBuffer endp +bluegl_glFenceSync endp -extrn __blue_glCore_glWindowPos2svARB: qword -bluegl_glWindowPos2svARB proc - mov r11, __blue_glCore_glWindowPos2svARB +extrn __blue_glCore_glIsSync: qword +bluegl_glIsSync proc + mov r11, __blue_glCore_glIsSync jmp r11 -bluegl_glWindowPos2svARB endp +bluegl_glIsSync endp -extrn __blue_glCore_glBindTextureEXT: qword -bluegl_glBindTextureEXT proc - mov r11, __blue_glCore_glBindTextureEXT +extrn __blue_glCore_glDeleteSync: qword +bluegl_glDeleteSync proc + mov r11, __blue_glCore_glDeleteSync jmp r11 -bluegl_glBindTextureEXT endp +bluegl_glDeleteSync endp -extrn __blue_glCore_glVertexAttrib4svNV: qword -bluegl_glVertexAttrib4svNV proc - mov r11, __blue_glCore_glVertexAttrib4svNV +extrn __blue_glCore_glClientWaitSync: qword +bluegl_glClientWaitSync proc + mov r11, __blue_glCore_glClientWaitSync jmp r11 -bluegl_glVertexAttrib4svNV endp +bluegl_glClientWaitSync endp -extrn __blue_glCore_glPointParameterfSGIS: qword -bluegl_glPointParameterfSGIS proc - mov r11, __blue_glCore_glPointParameterfSGIS +extrn __blue_glCore_glWaitSync: qword +bluegl_glWaitSync proc + mov r11, __blue_glCore_glWaitSync jmp r11 -bluegl_glPointParameterfSGIS endp +bluegl_glWaitSync endp -extrn __blue_glCore_glSecondaryColor3hvNV: qword -bluegl_glSecondaryColor3hvNV proc - mov r11, __blue_glCore_glSecondaryColor3hvNV +extrn __blue_glCore_glGetInteger64v: qword +bluegl_glGetInteger64v proc + mov r11, __blue_glCore_glGetInteger64v jmp r11 -bluegl_glSecondaryColor3hvNV endp +bluegl_glGetInteger64v endp -extrn __blue_glCore_glColorTableParameterfv: qword -bluegl_glColorTableParameterfv proc - mov r11, __blue_glCore_glColorTableParameterfv +extrn __blue_glCore_glGetSynciv: qword +bluegl_glGetSynciv proc + mov r11, __blue_glCore_glGetSynciv jmp r11 -bluegl_glColorTableParameterfv endp +bluegl_glGetSynciv endp -extrn __blue_glCore_glNamedProgramLocalParameter4fEXT: qword -bluegl_glNamedProgramLocalParameter4fEXT proc - mov r11, __blue_glCore_glNamedProgramLocalParameter4fEXT +extrn __blue_glCore_glGetInteger64i_v: qword +bluegl_glGetInteger64i_v proc + mov r11, __blue_glCore_glGetInteger64i_v jmp r11 -bluegl_glNamedProgramLocalParameter4fEXT endp +bluegl_glGetInteger64i_v endp -extrn __blue_glCore_glGetTextureParameterivEXT: qword -bluegl_glGetTextureParameterivEXT proc - mov r11, __blue_glCore_glGetTextureParameterivEXT +extrn __blue_glCore_glGetBufferParameteri64v: qword +bluegl_glGetBufferParameteri64v proc + mov r11, __blue_glCore_glGetBufferParameteri64v jmp r11 -bluegl_glGetTextureParameterivEXT endp +bluegl_glGetBufferParameteri64v endp -extrn __blue_glCore_glTestObjectAPPLE: qword -bluegl_glTestObjectAPPLE proc - mov r11, __blue_glCore_glTestObjectAPPLE +extrn __blue_glCore_glFramebufferTexture: qword +bluegl_glFramebufferTexture proc + mov r11, __blue_glCore_glFramebufferTexture jmp r11 -bluegl_glTestObjectAPPLE endp +bluegl_glFramebufferTexture endp -extrn __blue_glCore_glGetIntegerui64vNV: qword -bluegl_glGetIntegerui64vNV proc - mov r11, __blue_glCore_glGetIntegerui64vNV +extrn __blue_glCore_glTexImage2DMultisample: qword +bluegl_glTexImage2DMultisample proc + mov r11, __blue_glCore_glTexImage2DMultisample jmp r11 -bluegl_glGetIntegerui64vNV endp +bluegl_glTexImage2DMultisample endp -extrn __blue_glCore_glIsVertexAttribEnabledAPPLE: qword -bluegl_glIsVertexAttribEnabledAPPLE proc - mov r11, __blue_glCore_glIsVertexAttribEnabledAPPLE +extrn __blue_glCore_glTexImage3DMultisample: qword +bluegl_glTexImage3DMultisample proc + mov r11, __blue_glCore_glTexImage3DMultisample jmp r11 -bluegl_glIsVertexAttribEnabledAPPLE endp +bluegl_glTexImage3DMultisample endp -extrn __blue_glCore_glActiveTextureARB: qword -bluegl_glActiveTextureARB proc - mov r11, __blue_glCore_glActiveTextureARB +extrn __blue_glCore_glGetMultisamplefv: qword +bluegl_glGetMultisamplefv proc + mov r11, __blue_glCore_glGetMultisamplefv jmp r11 -bluegl_glActiveTextureARB endp +bluegl_glGetMultisamplefv endp -extrn __blue_glCore_glVertexAttrib3dARB: qword -bluegl_glVertexAttrib3dARB proc - mov r11, __blue_glCore_glVertexAttrib3dARB +extrn __blue_glCore_glSampleMaski: qword +bluegl_glSampleMaski proc + mov r11, __blue_glCore_glSampleMaski jmp r11 -bluegl_glVertexAttrib3dARB endp +bluegl_glSampleMaski endp -extrn __blue_glCore_glGetTextureHandleARB: qword -bluegl_glGetTextureHandleARB proc - mov r11, __blue_glCore_glGetTextureHandleARB +extrn __blue_glCore_glBindFragDataLocationIndexed: qword +bluegl_glBindFragDataLocationIndexed proc + mov r11, __blue_glCore_glBindFragDataLocationIndexed jmp r11 -bluegl_glGetTextureHandleARB endp +bluegl_glBindFragDataLocationIndexed endp -extrn __blue_glCore_glGetColorTableEXT: qword -bluegl_glGetColorTableEXT proc - mov r11, __blue_glCore_glGetColorTableEXT +extrn __blue_glCore_glGetFragDataIndex: qword +bluegl_glGetFragDataIndex proc + mov r11, __blue_glCore_glGetFragDataIndex jmp r11 -bluegl_glGetColorTableEXT endp +bluegl_glGetFragDataIndex endp -extrn __blue_glCore_glDrawArraysEXT: qword -bluegl_glDrawArraysEXT proc - mov r11, __blue_glCore_glDrawArraysEXT +extrn __blue_glCore_glGenSamplers: qword +bluegl_glGenSamplers proc + mov r11, __blue_glCore_glGenSamplers jmp r11 -bluegl_glDrawArraysEXT endp +bluegl_glGenSamplers endp -extrn __blue_glCore_glImageTransformParameterfHP: qword -bluegl_glImageTransformParameterfHP proc - mov r11, __blue_glCore_glImageTransformParameterfHP +extrn __blue_glCore_glDeleteSamplers: qword +bluegl_glDeleteSamplers proc + mov r11, __blue_glCore_glDeleteSamplers jmp r11 -bluegl_glImageTransformParameterfHP endp +bluegl_glDeleteSamplers endp -extrn __blue_glCore_glActiveStencilFaceEXT: qword -bluegl_glActiveStencilFaceEXT proc - mov r11, __blue_glCore_glActiveStencilFaceEXT +extrn __blue_glCore_glIsSampler: qword +bluegl_glIsSampler proc + mov r11, __blue_glCore_glIsSampler jmp r11 -bluegl_glActiveStencilFaceEXT endp +bluegl_glIsSampler endp -extrn __blue_glCore_glUniformMatrix3x4dv: qword -bluegl_glUniformMatrix3x4dv proc - mov r11, __blue_glCore_glUniformMatrix3x4dv +extrn __blue_glCore_glBindSampler: qword +bluegl_glBindSampler proc + mov r11, __blue_glCore_glBindSampler jmp r11 -bluegl_glUniformMatrix3x4dv endp +bluegl_glBindSampler endp -extrn __blue_glCore_glProgramUniform4i64ARB: qword -bluegl_glProgramUniform4i64ARB proc - mov r11, __blue_glCore_glProgramUniform4i64ARB +extrn __blue_glCore_glSamplerParameteri: qword +bluegl_glSamplerParameteri proc + mov r11, __blue_glCore_glSamplerParameteri jmp r11 -bluegl_glProgramUniform4i64ARB endp +bluegl_glSamplerParameteri endp -extrn __blue_glCore_glUniform3iv: qword -bluegl_glUniform3iv proc - mov r11, __blue_glCore_glUniform3iv +extrn __blue_glCore_glSamplerParameteriv: qword +bluegl_glSamplerParameteriv proc + mov r11, __blue_glCore_glSamplerParameteriv jmp r11 -bluegl_glUniform3iv endp +bluegl_glSamplerParameteriv endp -extrn __blue_glCore_glGetPerfMonitorCountersAMD: qword -bluegl_glGetPerfMonitorCountersAMD proc - mov r11, __blue_glCore_glGetPerfMonitorCountersAMD +extrn __blue_glCore_glSamplerParameterf: qword +bluegl_glSamplerParameterf proc + mov r11, __blue_glCore_glSamplerParameterf jmp r11 -bluegl_glGetPerfMonitorCountersAMD endp +bluegl_glSamplerParameterf endp -extrn __blue_glCore_glFinishFenceAPPLE: qword -bluegl_glFinishFenceAPPLE proc - mov r11, __blue_glCore_glFinishFenceAPPLE +extrn __blue_glCore_glSamplerParameterfv: qword +bluegl_glSamplerParameterfv proc + mov r11, __blue_glCore_glSamplerParameterfv jmp r11 -bluegl_glFinishFenceAPPLE endp +bluegl_glSamplerParameterfv endp -extrn __blue_glCore_glUniform4ivARB: qword -bluegl_glUniform4ivARB proc - mov r11, __blue_glCore_glUniform4ivARB +extrn __blue_glCore_glSamplerParameterIiv: qword +bluegl_glSamplerParameterIiv proc + mov r11, __blue_glCore_glSamplerParameterIiv jmp r11 -bluegl_glUniform4ivARB endp +bluegl_glSamplerParameterIiv endp -extrn __blue_glCore_glRenderbufferStorageMultisampleEXT: qword -bluegl_glRenderbufferStorageMultisampleEXT proc - mov r11, __blue_glCore_glRenderbufferStorageMultisampleEXT +extrn __blue_glCore_glSamplerParameterIuiv: qword +bluegl_glSamplerParameterIuiv proc + mov r11, __blue_glCore_glSamplerParameterIuiv jmp r11 -bluegl_glRenderbufferStorageMultisampleEXT endp +bluegl_glSamplerParameterIuiv endp -extrn __blue_glCore_glPointParameterfvARB: qword -bluegl_glPointParameterfvARB proc - mov r11, __blue_glCore_glPointParameterfvARB +extrn __blue_glCore_glGetSamplerParameteriv: qword +bluegl_glGetSamplerParameteriv proc + mov r11, __blue_glCore_glGetSamplerParameteriv jmp r11 -bluegl_glPointParameterfvARB endp +bluegl_glGetSamplerParameteriv endp -extrn __blue_glCore_glProgramLocalParameterI4uivNV: qword -bluegl_glProgramLocalParameterI4uivNV proc - mov r11, __blue_glCore_glProgramLocalParameterI4uivNV +extrn __blue_glCore_glGetSamplerParameterIiv: qword +bluegl_glGetSamplerParameterIiv proc + mov r11, __blue_glCore_glGetSamplerParameterIiv jmp r11 -bluegl_glProgramLocalParameterI4uivNV endp +bluegl_glGetSamplerParameterIiv endp -extrn __blue_glCore_glDeformSGIX: qword -bluegl_glDeformSGIX proc - mov r11, __blue_glCore_glDeformSGIX +extrn __blue_glCore_glGetSamplerParameterfv: qword +bluegl_glGetSamplerParameterfv proc + mov r11, __blue_glCore_glGetSamplerParameterfv jmp r11 -bluegl_glDeformSGIX endp +bluegl_glGetSamplerParameterfv endp -extrn __blue_glCore_glProgramUniformHandleui64vNV: qword -bluegl_glProgramUniformHandleui64vNV proc - mov r11, __blue_glCore_glProgramUniformHandleui64vNV +extrn __blue_glCore_glGetSamplerParameterIuiv: qword +bluegl_glGetSamplerParameterIuiv proc + mov r11, __blue_glCore_glGetSamplerParameterIuiv jmp r11 -bluegl_glProgramUniformHandleui64vNV endp +bluegl_glGetSamplerParameterIuiv endp -extrn __blue_glCore_glMultiDrawRangeElementArrayAPPLE: qword -bluegl_glMultiDrawRangeElementArrayAPPLE proc - mov r11, __blue_glCore_glMultiDrawRangeElementArrayAPPLE +extrn __blue_glCore_glQueryCounter: qword +bluegl_glQueryCounter proc + mov r11, __blue_glCore_glQueryCounter jmp r11 -bluegl_glMultiDrawRangeElementArrayAPPLE endp +bluegl_glQueryCounter endp -extrn __blue_glCore_glGetnUniformfvARB: qword -bluegl_glGetnUniformfvARB proc - mov r11, __blue_glCore_glGetnUniformfvARB +extrn __blue_glCore_glGetQueryObjecti64v: qword +bluegl_glGetQueryObjecti64v proc + mov r11, __blue_glCore_glGetQueryObjecti64v jmp r11 -bluegl_glGetnUniformfvARB endp +bluegl_glGetQueryObjecti64v endp -extrn __blue_glCore_glVertexAttribs3svNV: qword -bluegl_glVertexAttribs3svNV proc - mov r11, __blue_glCore_glVertexAttribs3svNV +extrn __blue_glCore_glGetQueryObjectui64v: qword +bluegl_glGetQueryObjectui64v proc + mov r11, __blue_glCore_glGetQueryObjectui64v jmp r11 -bluegl_glVertexAttribs3svNV endp +bluegl_glGetQueryObjectui64v endp -extrn __blue_glCore_glVertexAttrib1dvNV: qword -bluegl_glVertexAttrib1dvNV proc - mov r11, __blue_glCore_glVertexAttrib1dvNV +extrn __blue_glCore_glVertexAttribDivisor: qword +bluegl_glVertexAttribDivisor proc + mov r11, __blue_glCore_glVertexAttribDivisor jmp r11 -bluegl_glVertexAttrib1dvNV endp +bluegl_glVertexAttribDivisor endp -extrn __blue_glCore_glVertexStream1fvATI: qword -bluegl_glVertexStream1fvATI proc - mov r11, __blue_glCore_glVertexStream1fvATI +extrn __blue_glCore_glVertexAttribP1ui: qword +bluegl_glVertexAttribP1ui proc + mov r11, __blue_glCore_glVertexAttribP1ui jmp r11 -bluegl_glVertexStream1fvATI endp +bluegl_glVertexAttribP1ui endp -extrn __blue_glCore_glIsProgramPipeline: qword -bluegl_glIsProgramPipeline proc - mov r11, __blue_glCore_glIsProgramPipeline +extrn __blue_glCore_glVertexAttribP1uiv: qword +bluegl_glVertexAttribP1uiv proc + mov r11, __blue_glCore_glVertexAttribP1uiv jmp r11 -bluegl_glIsProgramPipeline endp +bluegl_glVertexAttribP1uiv endp -extrn __blue_glCore_glGetObjectBufferfvATI: qword -bluegl_glGetObjectBufferfvATI proc - mov r11, __blue_glCore_glGetObjectBufferfvATI +extrn __blue_glCore_glVertexAttribP2ui: qword +bluegl_glVertexAttribP2ui proc + mov r11, __blue_glCore_glVertexAttribP2ui jmp r11 -bluegl_glGetObjectBufferfvATI endp +bluegl_glVertexAttribP2ui endp -extrn __blue_glCore_glBeginVertexShaderEXT: qword -bluegl_glBeginVertexShaderEXT proc - mov r11, __blue_glCore_glBeginVertexShaderEXT +extrn __blue_glCore_glVertexAttribP2uiv: qword +bluegl_glVertexAttribP2uiv proc + mov r11, __blue_glCore_glVertexAttribP2uiv jmp r11 -bluegl_glBeginVertexShaderEXT endp +bluegl_glVertexAttribP2uiv endp -extrn __blue_glCore_glVertexAttrib4svARB: qword -bluegl_glVertexAttrib4svARB proc - mov r11, __blue_glCore_glVertexAttrib4svARB +extrn __blue_glCore_glVertexAttribP3ui: qword +bluegl_glVertexAttribP3ui proc + mov r11, __blue_glCore_glVertexAttribP3ui jmp r11 -bluegl_glVertexAttrib4svARB endp +bluegl_glVertexAttribP3ui endp -extrn __blue_glCore_glWindowPos2d: qword -bluegl_glWindowPos2d proc - mov r11, __blue_glCore_glWindowPos2d +extrn __blue_glCore_glVertexAttribP3uiv: qword +bluegl_glVertexAttribP3uiv proc + mov r11, __blue_glCore_glVertexAttribP3uiv jmp r11 -bluegl_glWindowPos2d endp +bluegl_glVertexAttribP3uiv endp -extrn __blue_glCore_glWriteMaskEXT: qword -bluegl_glWriteMaskEXT proc - mov r11, __blue_glCore_glWriteMaskEXT +extrn __blue_glCore_glVertexAttribP4ui: qword +bluegl_glVertexAttribP4ui proc + mov r11, __blue_glCore_glVertexAttribP4ui jmp r11 -bluegl_glWriteMaskEXT endp +bluegl_glVertexAttribP4ui endp -extrn __blue_glCore_glDrawRangeElements: qword -bluegl_glDrawRangeElements proc - mov r11, __blue_glCore_glDrawRangeElements +extrn __blue_glCore_glVertexAttribP4uiv: qword +bluegl_glVertexAttribP4uiv proc + mov r11, __blue_glCore_glVertexAttribP4uiv jmp r11 -bluegl_glDrawRangeElements endp +bluegl_glVertexAttribP4uiv endp -extrn __blue_glCore_glGetFragDataIndex: qword -bluegl_glGetFragDataIndex proc - mov r11, __blue_glCore_glGetFragDataIndex +extrn __blue_glCore_glMinSampleShading: qword +bluegl_glMinSampleShading proc + mov r11, __blue_glCore_glMinSampleShading jmp r11 -bluegl_glGetFragDataIndex endp +bluegl_glMinSampleShading endp -extrn __blue_glCore_glDeleteTransformFeedbacksNV: qword -bluegl_glDeleteTransformFeedbacksNV proc - mov r11, __blue_glCore_glDeleteTransformFeedbacksNV +extrn __blue_glCore_glBlendEquationi: qword +bluegl_glBlendEquationi proc + mov r11, __blue_glCore_glBlendEquationi jmp r11 -bluegl_glDeleteTransformFeedbacksNV endp +bluegl_glBlendEquationi endp -extrn __blue_glCore_glProgramUniformMatrix2fvEXT: qword -bluegl_glProgramUniformMatrix2fvEXT proc - mov r11, __blue_glCore_glProgramUniformMatrix2fvEXT +extrn __blue_glCore_glBlendEquationSeparatei: qword +bluegl_glBlendEquationSeparatei proc + mov r11, __blue_glCore_glBlendEquationSeparatei jmp r11 -bluegl_glProgramUniformMatrix2fvEXT endp +bluegl_glBlendEquationSeparatei endp -extrn __blue_glCore_glProgramUniform3ui: qword -bluegl_glProgramUniform3ui proc - mov r11, __blue_glCore_glProgramUniform3ui +extrn __blue_glCore_glBlendFunci: qword +bluegl_glBlendFunci proc + mov r11, __blue_glCore_glBlendFunci jmp r11 -bluegl_glProgramUniform3ui endp +bluegl_glBlendFunci endp -extrn __blue_glCore_glGetTransformFeedbacki_v: qword -bluegl_glGetTransformFeedbacki_v proc - mov r11, __blue_glCore_glGetTransformFeedbacki_v +extrn __blue_glCore_glBlendFuncSeparatei: qword +bluegl_glBlendFuncSeparatei proc + mov r11, __blue_glCore_glBlendFuncSeparatei jmp r11 -bluegl_glGetTransformFeedbacki_v endp +bluegl_glBlendFuncSeparatei endp -extrn __blue_glCore_glUniformMatrix3x2dv: qword -bluegl_glUniformMatrix3x2dv proc - mov r11, __blue_glCore_glUniformMatrix3x2dv +extrn __blue_glCore_glDrawArraysIndirect: qword +bluegl_glDrawArraysIndirect proc + mov r11, __blue_glCore_glDrawArraysIndirect jmp r11 -bluegl_glUniformMatrix3x2dv endp +bluegl_glDrawArraysIndirect endp -extrn __blue_glCore_glGetMapxvOES: qword -bluegl_glGetMapxvOES proc - mov r11, __blue_glCore_glGetMapxvOES +extrn __blue_glCore_glDrawElementsIndirect: qword +bluegl_glDrawElementsIndirect proc + mov r11, __blue_glCore_glDrawElementsIndirect jmp r11 -bluegl_glGetMapxvOES endp +bluegl_glDrawElementsIndirect endp -extrn __blue_glCore_glMemoryBarrierByRegion: qword -bluegl_glMemoryBarrierByRegion proc - mov r11, __blue_glCore_glMemoryBarrierByRegion +extrn __blue_glCore_glUniform1d: qword +bluegl_glUniform1d proc + mov r11, __blue_glCore_glUniform1d jmp r11 -bluegl_glMemoryBarrierByRegion endp +bluegl_glUniform1d endp -extrn __blue_glCore_glNamedFramebufferDrawBuffer: qword -bluegl_glNamedFramebufferDrawBuffer proc - mov r11, __blue_glCore_glNamedFramebufferDrawBuffer +extrn __blue_glCore_glUniform2d: qword +bluegl_glUniform2d proc + mov r11, __blue_glCore_glUniform2d jmp r11 -bluegl_glNamedFramebufferDrawBuffer endp +bluegl_glUniform2d endp -extrn __blue_glCore_glIsBufferResidentNV: qword -bluegl_glIsBufferResidentNV proc - mov r11, __blue_glCore_glIsBufferResidentNV +extrn __blue_glCore_glUniform3d: qword +bluegl_glUniform3d proc + mov r11, __blue_glCore_glUniform3d jmp r11 -bluegl_glIsBufferResidentNV endp +bluegl_glUniform3d endp -extrn __blue_glCore_glStencilOpSeparate: qword -bluegl_glStencilOpSeparate proc - mov r11, __blue_glCore_glStencilOpSeparate +extrn __blue_glCore_glUniform4d: qword +bluegl_glUniform4d proc + mov r11, __blue_glCore_glUniform4d jmp r11 -bluegl_glStencilOpSeparate endp +bluegl_glUniform4d endp -extrn __blue_glCore_glInvalidateNamedFramebufferSubData: qword -bluegl_glInvalidateNamedFramebufferSubData proc - mov r11, __blue_glCore_glInvalidateNamedFramebufferSubData +extrn __blue_glCore_glUniform1dv: qword +bluegl_glUniform1dv proc + mov r11, __blue_glCore_glUniform1dv jmp r11 -bluegl_glInvalidateNamedFramebufferSubData endp +bluegl_glUniform1dv endp -extrn __blue_glCore_glColor3hNV: qword -bluegl_glColor3hNV proc - mov r11, __blue_glCore_glColor3hNV +extrn __blue_glCore_glUniform2dv: qword +bluegl_glUniform2dv proc + mov r11, __blue_glCore_glUniform2dv jmp r11 -bluegl_glColor3hNV endp +bluegl_glUniform2dv endp -extrn __blue_glCore_glTextureMaterialEXT: qword -bluegl_glTextureMaterialEXT proc - mov r11, __blue_glCore_glTextureMaterialEXT +extrn __blue_glCore_glUniform3dv: qword +bluegl_glUniform3dv proc + mov r11, __blue_glCore_glUniform3dv jmp r11 -bluegl_glTextureMaterialEXT endp +bluegl_glUniform3dv endp -extrn __blue_glCore_glCompressedTextureSubImage2D: qword -bluegl_glCompressedTextureSubImage2D proc - mov r11, __blue_glCore_glCompressedTextureSubImage2D +extrn __blue_glCore_glUniform4dv: qword +bluegl_glUniform4dv proc + mov r11, __blue_glCore_glUniform4dv jmp r11 -bluegl_glCompressedTextureSubImage2D endp +bluegl_glUniform4dv endp -extrn __blue_glCore_glMultiTexGeniEXT: qword -bluegl_glMultiTexGeniEXT proc - mov r11, __blue_glCore_glMultiTexGeniEXT +extrn __blue_glCore_glUniformMatrix2dv: qword +bluegl_glUniformMatrix2dv proc + mov r11, __blue_glCore_glUniformMatrix2dv jmp r11 -bluegl_glMultiTexGeniEXT endp +bluegl_glUniformMatrix2dv endp -extrn __blue_glCore_glSecondaryColor3usvEXT: qword -bluegl_glSecondaryColor3usvEXT proc - mov r11, __blue_glCore_glSecondaryColor3usvEXT +extrn __blue_glCore_glUniformMatrix3dv: qword +bluegl_glUniformMatrix3dv proc + mov r11, __blue_glCore_glUniformMatrix3dv jmp r11 -bluegl_glSecondaryColor3usvEXT endp +bluegl_glUniformMatrix3dv endp -extrn __blue_glCore_glGetProgramResourceName: qword -bluegl_glGetProgramResourceName proc - mov r11, __blue_glCore_glGetProgramResourceName +extrn __blue_glCore_glUniformMatrix4dv: qword +bluegl_glUniformMatrix4dv proc + mov r11, __blue_glCore_glUniformMatrix4dv jmp r11 -bluegl_glGetProgramResourceName endp +bluegl_glUniformMatrix4dv endp -extrn __blue_glCore_glTextureStorageSparseAMD: qword -bluegl_glTextureStorageSparseAMD proc - mov r11, __blue_glCore_glTextureStorageSparseAMD +extrn __blue_glCore_glUniformMatrix2x3dv: qword +bluegl_glUniformMatrix2x3dv proc + mov r11, __blue_glCore_glUniformMatrix2x3dv jmp r11 -bluegl_glTextureStorageSparseAMD endp +bluegl_glUniformMatrix2x3dv endp -extrn __blue_glCore_glPixelStorei: qword -bluegl_glPixelStorei proc - mov r11, __blue_glCore_glPixelStorei +extrn __blue_glCore_glUniformMatrix2x4dv: qword +bluegl_glUniformMatrix2x4dv proc + mov r11, __blue_glCore_glUniformMatrix2x4dv jmp r11 -bluegl_glPixelStorei endp +bluegl_glUniformMatrix2x4dv endp -extrn __blue_glCore_glGetBooleani_v: qword -bluegl_glGetBooleani_v proc - mov r11, __blue_glCore_glGetBooleani_v +extrn __blue_glCore_glUniformMatrix3x2dv: qword +bluegl_glUniformMatrix3x2dv proc + mov r11, __blue_glCore_glUniformMatrix3x2dv jmp r11 -bluegl_glGetBooleani_v endp +bluegl_glUniformMatrix3x2dv endp -extrn __blue_glCore_glGetPathCoordsNV: qword -bluegl_glGetPathCoordsNV proc - mov r11, __blue_glCore_glGetPathCoordsNV +extrn __blue_glCore_glUniformMatrix3x4dv: qword +bluegl_glUniformMatrix3x4dv proc + mov r11, __blue_glCore_glUniformMatrix3x4dv jmp r11 -bluegl_glGetPathCoordsNV endp +bluegl_glUniformMatrix3x4dv endp -extrn __blue_glCore_glVertexAttrib3svNV: qword -bluegl_glVertexAttrib3svNV proc - mov r11, __blue_glCore_glVertexAttrib3svNV +extrn __blue_glCore_glUniformMatrix4x2dv: qword +bluegl_glUniformMatrix4x2dv proc + mov r11, __blue_glCore_glUniformMatrix4x2dv jmp r11 -bluegl_glVertexAttrib3svNV endp +bluegl_glUniformMatrix4x2dv endp -extrn __blue_glCore_glUniformui64NV: qword -bluegl_glUniformui64NV proc - mov r11, __blue_glCore_glUniformui64NV +extrn __blue_glCore_glUniformMatrix4x3dv: qword +bluegl_glUniformMatrix4x3dv proc + mov r11, __blue_glCore_glUniformMatrix4x3dv jmp r11 -bluegl_glUniformui64NV endp +bluegl_glUniformMatrix4x3dv endp -extrn __blue_glCore_glIsImageHandleResidentNV: qword -bluegl_glIsImageHandleResidentNV proc - mov r11, __blue_glCore_glIsImageHandleResidentNV +extrn __blue_glCore_glGetUniformdv: qword +bluegl_glGetUniformdv proc + mov r11, __blue_glCore_glGetUniformdv jmp r11 -bluegl_glIsImageHandleResidentNV endp +bluegl_glGetUniformdv endp -extrn __blue_glCore_glBeginConditionalRenderNV: qword -bluegl_glBeginConditionalRenderNV proc - mov r11, __blue_glCore_glBeginConditionalRenderNV +extrn __blue_glCore_glGetSubroutineUniformLocation: qword +bluegl_glGetSubroutineUniformLocation proc + mov r11, __blue_glCore_glGetSubroutineUniformLocation jmp r11 -bluegl_glBeginConditionalRenderNV endp +bluegl_glGetSubroutineUniformLocation endp -extrn __blue_glCore_glNamedFramebufferParameteriEXT: qword -bluegl_glNamedFramebufferParameteriEXT proc - mov r11, __blue_glCore_glNamedFramebufferParameteriEXT +extrn __blue_glCore_glGetSubroutineIndex: qword +bluegl_glGetSubroutineIndex proc + mov r11, __blue_glCore_glGetSubroutineIndex jmp r11 -bluegl_glNamedFramebufferParameteriEXT endp +bluegl_glGetSubroutineIndex endp -extrn __blue_glCore_glIsVertexArrayAPPLE: qword -bluegl_glIsVertexArrayAPPLE proc - mov r11, __blue_glCore_glIsVertexArrayAPPLE +extrn __blue_glCore_glGetActiveSubroutineUniformiv: qword +bluegl_glGetActiveSubroutineUniformiv proc + mov r11, __blue_glCore_glGetActiveSubroutineUniformiv jmp r11 -bluegl_glIsVertexArrayAPPLE endp +bluegl_glGetActiveSubroutineUniformiv endp -extrn __blue_glCore_glPointParameterfvEXT: qword -bluegl_glPointParameterfvEXT proc - mov r11, __blue_glCore_glPointParameterfvEXT +extrn __blue_glCore_glGetActiveSubroutineUniformName: qword +bluegl_glGetActiveSubroutineUniformName proc + mov r11, __blue_glCore_glGetActiveSubroutineUniformName jmp r11 -bluegl_glPointParameterfvEXT endp +bluegl_glGetActiveSubroutineUniformName endp -extrn __blue_glCore_glGetnMapfvARB: qword -bluegl_glGetnMapfvARB proc - mov r11, __blue_glCore_glGetnMapfvARB +extrn __blue_glCore_glGetActiveSubroutineName: qword +bluegl_glGetActiveSubroutineName proc + mov r11, __blue_glCore_glGetActiveSubroutineName jmp r11 -bluegl_glGetnMapfvARB endp +bluegl_glGetActiveSubroutineName endp -extrn __blue_glCore_glCopyColorSubTable: qword -bluegl_glCopyColorSubTable proc - mov r11, __blue_glCore_glCopyColorSubTable +extrn __blue_glCore_glUniformSubroutinesuiv: qword +bluegl_glUniformSubroutinesuiv proc + mov r11, __blue_glCore_glUniformSubroutinesuiv jmp r11 -bluegl_glCopyColorSubTable endp +bluegl_glUniformSubroutinesuiv endp -extrn __blue_glCore_glVariantbvEXT: qword -bluegl_glVariantbvEXT proc - mov r11, __blue_glCore_glVariantbvEXT +extrn __blue_glCore_glGetUniformSubroutineuiv: qword +bluegl_glGetUniformSubroutineuiv proc + mov r11, __blue_glCore_glGetUniformSubroutineuiv jmp r11 -bluegl_glVariantbvEXT endp +bluegl_glGetUniformSubroutineuiv endp -extrn __blue_glCore_glTextureParameterIuiv: qword -bluegl_glTextureParameterIuiv proc - mov r11, __blue_glCore_glTextureParameterIuiv +extrn __blue_glCore_glGetProgramStageiv: qword +bluegl_glGetProgramStageiv proc + mov r11, __blue_glCore_glGetProgramStageiv jmp r11 -bluegl_glTextureParameterIuiv endp +bluegl_glGetProgramStageiv endp -extrn __blue_glCore_glPNTrianglesiATI: qword -bluegl_glPNTrianglesiATI proc - mov r11, __blue_glCore_glPNTrianglesiATI +extrn __blue_glCore_glPatchParameteri: qword +bluegl_glPatchParameteri proc + mov r11, __blue_glCore_glPatchParameteri jmp r11 -bluegl_glPNTrianglesiATI endp +bluegl_glPatchParameteri endp -extrn __blue_glCore_glBlendFunc: qword -bluegl_glBlendFunc proc - mov r11, __blue_glCore_glBlendFunc +extrn __blue_glCore_glPatchParameterfv: qword +bluegl_glPatchParameterfv proc + mov r11, __blue_glCore_glPatchParameterfv jmp r11 -bluegl_glBlendFunc endp +bluegl_glPatchParameterfv endp -extrn __blue_glCore_glVertexAttrib4uiv: qword -bluegl_glVertexAttrib4uiv proc - mov r11, __blue_glCore_glVertexAttrib4uiv +extrn __blue_glCore_glBindTransformFeedback: qword +bluegl_glBindTransformFeedback proc + mov r11, __blue_glCore_glBindTransformFeedback jmp r11 -bluegl_glVertexAttrib4uiv endp +bluegl_glBindTransformFeedback endp -extrn __blue_glCore_glUniform2ui: qword -bluegl_glUniform2ui proc - mov r11, __blue_glCore_glUniform2ui +extrn __blue_glCore_glDeleteTransformFeedbacks: qword +bluegl_glDeleteTransformFeedbacks proc + mov r11, __blue_glCore_glDeleteTransformFeedbacks jmp r11 -bluegl_glUniform2ui endp +bluegl_glDeleteTransformFeedbacks endp -extrn __blue_glCore_glBlendColor: qword -bluegl_glBlendColor proc - mov r11, __blue_glCore_glBlendColor +extrn __blue_glCore_glGenTransformFeedbacks: qword +bluegl_glGenTransformFeedbacks proc + mov r11, __blue_glCore_glGenTransformFeedbacks jmp r11 -bluegl_glBlendColor endp +bluegl_glGenTransformFeedbacks endp -extrn __blue_glCore_glViewport: qword -bluegl_glViewport proc - mov r11, __blue_glCore_glViewport +extrn __blue_glCore_glIsTransformFeedback: qword +bluegl_glIsTransformFeedback proc + mov r11, __blue_glCore_glIsTransformFeedback jmp r11 -bluegl_glViewport endp +bluegl_glIsTransformFeedback endp -extrn __blue_glCore_glWindowPos2fvARB: qword -bluegl_glWindowPos2fvARB proc - mov r11, __blue_glCore_glWindowPos2fvARB +extrn __blue_glCore_glPauseTransformFeedback: qword +bluegl_glPauseTransformFeedback proc + mov r11, __blue_glCore_glPauseTransformFeedback jmp r11 -bluegl_glWindowPos2fvARB endp +bluegl_glPauseTransformFeedback endp -extrn __blue_glCore_glSampleCoverage: qword -bluegl_glSampleCoverage proc - mov r11, __blue_glCore_glSampleCoverage +extrn __blue_glCore_glResumeTransformFeedback: qword +bluegl_glResumeTransformFeedback proc + mov r11, __blue_glCore_glResumeTransformFeedback jmp r11 -bluegl_glSampleCoverage endp +bluegl_glResumeTransformFeedback endp -extrn __blue_glCore_glSecondaryColor3ubv: qword -bluegl_glSecondaryColor3ubv proc - mov r11, __blue_glCore_glSecondaryColor3ubv +extrn __blue_glCore_glDrawTransformFeedback: qword +bluegl_glDrawTransformFeedback proc + mov r11, __blue_glCore_glDrawTransformFeedback jmp r11 -bluegl_glSecondaryColor3ubv endp +bluegl_glDrawTransformFeedback endp -extrn __blue_glCore_glColor4xOES: qword -bluegl_glColor4xOES proc - mov r11, __blue_glCore_glColor4xOES +extrn __blue_glCore_glDrawTransformFeedbackStream: qword +bluegl_glDrawTransformFeedbackStream proc + mov r11, __blue_glCore_glDrawTransformFeedbackStream jmp r11 -bluegl_glColor4xOES endp +bluegl_glDrawTransformFeedbackStream endp -extrn __blue_glCore_glVertexAttribL1dEXT: qword -bluegl_glVertexAttribL1dEXT proc - mov r11, __blue_glCore_glVertexAttribL1dEXT +extrn __blue_glCore_glBeginQueryIndexed: qword +bluegl_glBeginQueryIndexed proc + mov r11, __blue_glCore_glBeginQueryIndexed jmp r11 -bluegl_glVertexAttribL1dEXT endp +bluegl_glBeginQueryIndexed endp -extrn __blue_glCore_glMultTransposeMatrixf: qword -bluegl_glMultTransposeMatrixf proc - mov r11, __blue_glCore_glMultTransposeMatrixf +extrn __blue_glCore_glEndQueryIndexed: qword +bluegl_glEndQueryIndexed proc + mov r11, __blue_glCore_glEndQueryIndexed jmp r11 -bluegl_glMultTransposeMatrixf endp +bluegl_glEndQueryIndexed endp -extrn __blue_glCore_glGetVertexArrayIntegeri_vEXT: qword -bluegl_glGetVertexArrayIntegeri_vEXT proc - mov r11, __blue_glCore_glGetVertexArrayIntegeri_vEXT +extrn __blue_glCore_glGetQueryIndexediv: qword +bluegl_glGetQueryIndexediv proc + mov r11, __blue_glCore_glGetQueryIndexediv jmp r11 -bluegl_glGetVertexArrayIntegeri_vEXT endp +bluegl_glGetQueryIndexediv endp -extrn __blue_glCore_glCullParameterfvEXT: qword -bluegl_glCullParameterfvEXT proc - mov r11, __blue_glCore_glCullParameterfvEXT +extrn __blue_glCore_glReleaseShaderCompiler: qword +bluegl_glReleaseShaderCompiler proc + mov r11, __blue_glCore_glReleaseShaderCompiler jmp r11 -bluegl_glCullParameterfvEXT endp +bluegl_glReleaseShaderCompiler endp -extrn __blue_glCore_glMapNamedBufferRangeEXT: qword -bluegl_glMapNamedBufferRangeEXT proc - mov r11, __blue_glCore_glMapNamedBufferRangeEXT +extrn __blue_glCore_glShaderBinary: qword +bluegl_glShaderBinary proc + mov r11, __blue_glCore_glShaderBinary jmp r11 -bluegl_glMapNamedBufferRangeEXT endp +bluegl_glShaderBinary endp -extrn __blue_glCore_glTextureImage3DEXT: qword -bluegl_glTextureImage3DEXT proc - mov r11, __blue_glCore_glTextureImage3DEXT +extrn __blue_glCore_glGetShaderPrecisionFormat: qword +bluegl_glGetShaderPrecisionFormat proc + mov r11, __blue_glCore_glGetShaderPrecisionFormat jmp r11 -bluegl_glTextureImage3DEXT endp +bluegl_glGetShaderPrecisionFormat endp -extrn __blue_glCore_glBufferAddressRangeNV: qword -bluegl_glBufferAddressRangeNV proc - mov r11, __blue_glCore_glBufferAddressRangeNV +extrn __blue_glCore_glDepthRangef: qword +bluegl_glDepthRangef proc + mov r11, __blue_glCore_glDepthRangef jmp r11 -bluegl_glBufferAddressRangeNV endp +bluegl_glDepthRangef endp -extrn __blue_glCore_glGetVertexAttribdv: qword -bluegl_glGetVertexAttribdv proc - mov r11, __blue_glCore_glGetVertexAttribdv +extrn __blue_glCore_glClearDepthf: qword +bluegl_glClearDepthf proc + mov r11, __blue_glCore_glClearDepthf jmp r11 -bluegl_glGetVertexAttribdv endp +bluegl_glClearDepthf endp -extrn __blue_glCore_glNamedFramebufferSampleLocationsfvARB: qword -bluegl_glNamedFramebufferSampleLocationsfvARB proc - mov r11, __blue_glCore_glNamedFramebufferSampleLocationsfvARB +extrn __blue_glCore_glGetProgramBinary: qword +bluegl_glGetProgramBinary proc + mov r11, __blue_glCore_glGetProgramBinary jmp r11 -bluegl_glNamedFramebufferSampleLocationsfvARB endp +bluegl_glGetProgramBinary endp -extrn __blue_glCore_glMultiTexCoord2i: qword -bluegl_glMultiTexCoord2i proc - mov r11, __blue_glCore_glMultiTexCoord2i +extrn __blue_glCore_glProgramBinary: qword +bluegl_glProgramBinary proc + mov r11, __blue_glCore_glProgramBinary jmp r11 -bluegl_glMultiTexCoord2i endp +bluegl_glProgramBinary endp -extrn __blue_glCore_glBindFramebufferEXT: qword -bluegl_glBindFramebufferEXT proc - mov r11, __blue_glCore_glBindFramebufferEXT +extrn __blue_glCore_glProgramParameteri: qword +bluegl_glProgramParameteri proc + mov r11, __blue_glCore_glProgramParameteri jmp r11 -bluegl_glBindFramebufferEXT endp +bluegl_glProgramParameteri endp -extrn __blue_glCore_glTexParameterfv: qword -bluegl_glTexParameterfv proc - mov r11, __blue_glCore_glTexParameterfv +extrn __blue_glCore_glUseProgramStages: qword +bluegl_glUseProgramStages proc + mov r11, __blue_glCore_glUseProgramStages jmp r11 -bluegl_glTexParameterfv endp +bluegl_glUseProgramStages endp -extrn __blue_glCore_glGetProgramNamedParameterfvNV: qword -bluegl_glGetProgramNamedParameterfvNV proc - mov r11, __blue_glCore_glGetProgramNamedParameterfvNV +extrn __blue_glCore_glActiveShaderProgram: qword +bluegl_glActiveShaderProgram proc + mov r11, __blue_glCore_glActiveShaderProgram jmp r11 -bluegl_glGetProgramNamedParameterfvNV endp +bluegl_glActiveShaderProgram endp -extrn __blue_glCore_glTextureStorage3DEXT: qword -bluegl_glTextureStorage3DEXT proc - mov r11, __blue_glCore_glTextureStorage3DEXT +extrn __blue_glCore_glCreateShaderProgramv: qword +bluegl_glCreateShaderProgramv proc + mov r11, __blue_glCore_glCreateShaderProgramv jmp r11 -bluegl_glTextureStorage3DEXT endp +bluegl_glCreateShaderProgramv endp -extrn __blue_glCore_glGetDebugMessageLogAMD: qword -bluegl_glGetDebugMessageLogAMD proc - mov r11, __blue_glCore_glGetDebugMessageLogAMD +extrn __blue_glCore_glBindProgramPipeline: qword +bluegl_glBindProgramPipeline proc + mov r11, __blue_glCore_glBindProgramPipeline jmp r11 -bluegl_glGetDebugMessageLogAMD endp +bluegl_glBindProgramPipeline endp -extrn __blue_glCore_glTexCoord1hvNV: qword -bluegl_glTexCoord1hvNV proc - mov r11, __blue_glCore_glTexCoord1hvNV +extrn __blue_glCore_glDeleteProgramPipelines: qword +bluegl_glDeleteProgramPipelines proc + mov r11, __blue_glCore_glDeleteProgramPipelines jmp r11 -bluegl_glTexCoord1hvNV endp +bluegl_glDeleteProgramPipelines endp -extrn __blue_glCore_glRenderbufferStorageMultisampleCoverageNV: qword -bluegl_glRenderbufferStorageMultisampleCoverageNV proc - mov r11, __blue_glCore_glRenderbufferStorageMultisampleCoverageNV +extrn __blue_glCore_glGenProgramPipelines: qword +bluegl_glGenProgramPipelines proc + mov r11, __blue_glCore_glGenProgramPipelines jmp r11 -bluegl_glRenderbufferStorageMultisampleCoverageNV endp +bluegl_glGenProgramPipelines endp -extrn __blue_glCore_glProgramUniform3i64vARB: qword -bluegl_glProgramUniform3i64vARB proc - mov r11, __blue_glCore_glProgramUniform3i64vARB +extrn __blue_glCore_glIsProgramPipeline: qword +bluegl_glIsProgramPipeline proc + mov r11, __blue_glCore_glIsProgramPipeline jmp r11 -bluegl_glProgramUniform3i64vARB endp +bluegl_glIsProgramPipeline endp -extrn __blue_glCore_glFragmentMaterialfvSGIX: qword -bluegl_glFragmentMaterialfvSGIX proc - mov r11, __blue_glCore_glFragmentMaterialfvSGIX +extrn __blue_glCore_glGetProgramPipelineiv: qword +bluegl_glGetProgramPipelineiv proc + mov r11, __blue_glCore_glGetProgramPipelineiv jmp r11 -bluegl_glFragmentMaterialfvSGIX endp +bluegl_glGetProgramPipelineiv endp -extrn __blue_glCore_glGetImageHandleARB: qword -bluegl_glGetImageHandleARB proc - mov r11, __blue_glCore_glGetImageHandleARB +extrn __blue_glCore_glProgramUniform1i: qword +bluegl_glProgramUniform1i proc + mov r11, __blue_glCore_glProgramUniform1i jmp r11 -bluegl_glGetImageHandleARB endp +bluegl_glProgramUniform1i endp -extrn __blue_glCore_glVertexAttribs3fvNV: qword -bluegl_glVertexAttribs3fvNV proc - mov r11, __blue_glCore_glVertexAttribs3fvNV +extrn __blue_glCore_glProgramUniform1iv: qword +bluegl_glProgramUniform1iv proc + mov r11, __blue_glCore_glProgramUniform1iv jmp r11 -bluegl_glVertexAttribs3fvNV endp +bluegl_glProgramUniform1iv endp -extrn __blue_glCore_glTexSubImage4DSGIS: qword -bluegl_glTexSubImage4DSGIS proc - mov r11, __blue_glCore_glTexSubImage4DSGIS +extrn __blue_glCore_glProgramUniform1f: qword +bluegl_glProgramUniform1f proc + mov r11, __blue_glCore_glProgramUniform1f jmp r11 -bluegl_glTexSubImage4DSGIS endp +bluegl_glProgramUniform1f endp -extrn __blue_glCore_glListParameteriSGIX: qword -bluegl_glListParameteriSGIX proc - mov r11, __blue_glCore_glListParameteriSGIX +extrn __blue_glCore_glProgramUniform1fv: qword +bluegl_glProgramUniform1fv proc + mov r11, __blue_glCore_glProgramUniform1fv jmp r11 -bluegl_glListParameteriSGIX endp +bluegl_glProgramUniform1fv endp -extrn __blue_glCore_glPixelTransformParameterfEXT: qword -bluegl_glPixelTransformParameterfEXT proc - mov r11, __blue_glCore_glPixelTransformParameterfEXT +extrn __blue_glCore_glProgramUniform1d: qword +bluegl_glProgramUniform1d proc + mov r11, __blue_glCore_glProgramUniform1d jmp r11 -bluegl_glPixelTransformParameterfEXT endp +bluegl_glProgramUniform1d endp -extrn __blue_glCore_glMapParameterfvNV: qword -bluegl_glMapParameterfvNV proc - mov r11, __blue_glCore_glMapParameterfvNV +extrn __blue_glCore_glProgramUniform1dv: qword +bluegl_glProgramUniform1dv proc + mov r11, __blue_glCore_glProgramUniform1dv jmp r11 -bluegl_glMapParameterfvNV endp +bluegl_glProgramUniform1dv endp -extrn __blue_glCore_glProgramUniform3dv: qword -bluegl_glProgramUniform3dv proc - mov r11, __blue_glCore_glProgramUniform3dv +extrn __blue_glCore_glProgramUniform1ui: qword +bluegl_glProgramUniform1ui proc + mov r11, __blue_glCore_glProgramUniform1ui jmp r11 -bluegl_glProgramUniform3dv endp +bluegl_glProgramUniform1ui endp -extrn __blue_glCore_glUniformMatrix3fv: qword -bluegl_glUniformMatrix3fv proc - mov r11, __blue_glCore_glUniformMatrix3fv +extrn __blue_glCore_glProgramUniform1uiv: qword +bluegl_glProgramUniform1uiv proc + mov r11, __blue_glCore_glProgramUniform1uiv jmp r11 -bluegl_glUniformMatrix3fv endp +bluegl_glProgramUniform1uiv endp -extrn __blue_glCore_glProgramUniform4fEXT: qword -bluegl_glProgramUniform4fEXT proc - mov r11, __blue_glCore_glProgramUniform4fEXT +extrn __blue_glCore_glProgramUniform2i: qword +bluegl_glProgramUniform2i proc + mov r11, __blue_glCore_glProgramUniform2i jmp r11 -bluegl_glProgramUniform4fEXT endp +bluegl_glProgramUniform2i endp -extrn __blue_glCore_glMultiTexCoord2hNV: qword -bluegl_glMultiTexCoord2hNV proc - mov r11, __blue_glCore_glMultiTexCoord2hNV +extrn __blue_glCore_glProgramUniform2iv: qword +bluegl_glProgramUniform2iv proc + mov r11, __blue_glCore_glProgramUniform2iv jmp r11 -bluegl_glMultiTexCoord2hNV endp +bluegl_glProgramUniform2iv endp -extrn __blue_glCore_glVertexAttribI4uiv: qword -bluegl_glVertexAttribI4uiv proc - mov r11, __blue_glCore_glVertexAttribI4uiv +extrn __blue_glCore_glProgramUniform2f: qword +bluegl_glProgramUniform2f proc + mov r11, __blue_glCore_glProgramUniform2f jmp r11 -bluegl_glVertexAttribI4uiv endp +bluegl_glProgramUniform2f endp -extrn __blue_glCore_glSecondaryColor3b: qword -bluegl_glSecondaryColor3b proc - mov r11, __blue_glCore_glSecondaryColor3b +extrn __blue_glCore_glProgramUniform2fv: qword +bluegl_glProgramUniform2fv proc + mov r11, __blue_glCore_glProgramUniform2fv jmp r11 -bluegl_glSecondaryColor3b endp +bluegl_glProgramUniform2fv endp -extrn __blue_glCore_glFogxvOES: qword -bluegl_glFogxvOES proc - mov r11, __blue_glCore_glFogxvOES +extrn __blue_glCore_glProgramUniform2d: qword +bluegl_glProgramUniform2d proc + mov r11, __blue_glCore_glProgramUniform2d jmp r11 -bluegl_glFogxvOES endp +bluegl_glProgramUniform2d endp -extrn __blue_glCore_glGlobalAlphaFactorubSUN: qword -bluegl_glGlobalAlphaFactorubSUN proc - mov r11, __blue_glCore_glGlobalAlphaFactorubSUN +extrn __blue_glCore_glProgramUniform2dv: qword +bluegl_glProgramUniform2dv proc + mov r11, __blue_glCore_glProgramUniform2dv jmp r11 -bluegl_glGlobalAlphaFactorubSUN endp +bluegl_glProgramUniform2dv endp -extrn __blue_glCore_glVertexAttribI4svEXT: qword -bluegl_glVertexAttribI4svEXT proc - mov r11, __blue_glCore_glVertexAttribI4svEXT +extrn __blue_glCore_glProgramUniform2ui: qword +bluegl_glProgramUniform2ui proc + mov r11, __blue_glCore_glProgramUniform2ui jmp r11 -bluegl_glVertexAttribI4svEXT endp +bluegl_glProgramUniform2ui endp -extrn __blue_glCore_glSecondaryColor3sv: qword -bluegl_glSecondaryColor3sv proc - mov r11, __blue_glCore_glSecondaryColor3sv +extrn __blue_glCore_glProgramUniform2uiv: qword +bluegl_glProgramUniform2uiv proc + mov r11, __blue_glCore_glProgramUniform2uiv jmp r11 -bluegl_glSecondaryColor3sv endp +bluegl_glProgramUniform2uiv endp -extrn __blue_glCore_glProgramUniformMatrix2x3dvEXT: qword -bluegl_glProgramUniformMatrix2x3dvEXT proc - mov r11, __blue_glCore_glProgramUniformMatrix2x3dvEXT +extrn __blue_glCore_glProgramUniform3i: qword +bluegl_glProgramUniform3i proc + mov r11, __blue_glCore_glProgramUniform3i jmp r11 -bluegl_glProgramUniformMatrix2x3dvEXT endp +bluegl_glProgramUniform3i endp -extrn __blue_glCore_glTextureBarrier: qword -bluegl_glTextureBarrier proc - mov r11, __blue_glCore_glTextureBarrier +extrn __blue_glCore_glProgramUniform3iv: qword +bluegl_glProgramUniform3iv proc + mov r11, __blue_glCore_glProgramUniform3iv jmp r11 -bluegl_glTextureBarrier endp +bluegl_glProgramUniform3iv endp -extrn __blue_glCore_glCreateSamplers: qword -bluegl_glCreateSamplers proc - mov r11, __blue_glCore_glCreateSamplers +extrn __blue_glCore_glProgramUniform3f: qword +bluegl_glProgramUniform3f proc + mov r11, __blue_glCore_glProgramUniform3f jmp r11 -bluegl_glCreateSamplers endp +bluegl_glProgramUniform3f endp -extrn __blue_glCore_glVertexAttribP2ui: qword -bluegl_glVertexAttribP2ui proc - mov r11, __blue_glCore_glVertexAttribP2ui +extrn __blue_glCore_glProgramUniform3fv: qword +bluegl_glProgramUniform3fv proc + mov r11, __blue_glCore_glProgramUniform3fv jmp r11 -bluegl_glVertexAttribP2ui endp +bluegl_glProgramUniform3fv endp -extrn __blue_glCore_glGetTexParameterIiv: qword -bluegl_glGetTexParameterIiv proc - mov r11, __blue_glCore_glGetTexParameterIiv +extrn __blue_glCore_glProgramUniform3d: qword +bluegl_glProgramUniform3d proc + mov r11, __blue_glCore_glProgramUniform3d jmp r11 -bluegl_glGetTexParameterIiv endp +bluegl_glProgramUniform3d endp -extrn __blue_glCore_glConvolutionParameterfvEXT: qword -bluegl_glConvolutionParameterfvEXT proc - mov r11, __blue_glCore_glConvolutionParameterfvEXT +extrn __blue_glCore_glProgramUniform3dv: qword +bluegl_glProgramUniform3dv proc + mov r11, __blue_glCore_glProgramUniform3dv jmp r11 -bluegl_glConvolutionParameterfvEXT endp +bluegl_glProgramUniform3dv endp -extrn __blue_glCore_glPathGlyphIndexArrayNV: qword -bluegl_glPathGlyphIndexArrayNV proc - mov r11, __blue_glCore_glPathGlyphIndexArrayNV +extrn __blue_glCore_glProgramUniform3ui: qword +bluegl_glProgramUniform3ui proc + mov r11, __blue_glCore_glProgramUniform3ui jmp r11 -bluegl_glPathGlyphIndexArrayNV endp +bluegl_glProgramUniform3ui endp -extrn __blue_glCore_glCopyTexSubImage2D: qword -bluegl_glCopyTexSubImage2D proc - mov r11, __blue_glCore_glCopyTexSubImage2D +extrn __blue_glCore_glProgramUniform3uiv: qword +bluegl_glProgramUniform3uiv proc + mov r11, __blue_glCore_glProgramUniform3uiv jmp r11 -bluegl_glCopyTexSubImage2D endp +bluegl_glProgramUniform3uiv endp -extrn __blue_glCore_glVertexArrayParameteriAPPLE: qword -bluegl_glVertexArrayParameteriAPPLE proc - mov r11, __blue_glCore_glVertexArrayParameteriAPPLE +extrn __blue_glCore_glProgramUniform4i: qword +bluegl_glProgramUniform4i proc + mov r11, __blue_glCore_glProgramUniform4i jmp r11 -bluegl_glVertexArrayParameteriAPPLE endp +bluegl_glProgramUniform4i endp -extrn __blue_glCore_glGetnConvolutionFilterARB: qword -bluegl_glGetnConvolutionFilterARB proc - mov r11, __blue_glCore_glGetnConvolutionFilterARB +extrn __blue_glCore_glProgramUniform4iv: qword +bluegl_glProgramUniform4iv proc + mov r11, __blue_glCore_glProgramUniform4iv jmp r11 -bluegl_glGetnConvolutionFilterARB endp +bluegl_glProgramUniform4iv endp -extrn __blue_glCore_glVariantfvEXT: qword -bluegl_glVariantfvEXT proc - mov r11, __blue_glCore_glVariantfvEXT +extrn __blue_glCore_glProgramUniform4f: qword +bluegl_glProgramUniform4f proc + mov r11, __blue_glCore_glProgramUniform4f jmp r11 -bluegl_glVariantfvEXT endp +bluegl_glProgramUniform4f endp -extrn __blue_glCore_glGetMultisamplefvNV: qword -bluegl_glGetMultisamplefvNV proc - mov r11, __blue_glCore_glGetMultisamplefvNV +extrn __blue_glCore_glProgramUniform4fv: qword +bluegl_glProgramUniform4fv proc + mov r11, __blue_glCore_glProgramUniform4fv jmp r11 -bluegl_glGetMultisamplefvNV endp +bluegl_glProgramUniform4fv endp -extrn __blue_glCore_glQueryObjectParameteruiAMD: qword -bluegl_glQueryObjectParameteruiAMD proc - mov r11, __blue_glCore_glQueryObjectParameteruiAMD +extrn __blue_glCore_glProgramUniform4d: qword +bluegl_glProgramUniform4d proc + mov r11, __blue_glCore_glProgramUniform4d jmp r11 -bluegl_glQueryObjectParameteruiAMD endp +bluegl_glProgramUniform4d endp -extrn __blue_glCore_glMatrixIndexPointerARB: qword -bluegl_glMatrixIndexPointerARB proc - mov r11, __blue_glCore_glMatrixIndexPointerARB +extrn __blue_glCore_glProgramUniform4dv: qword +bluegl_glProgramUniform4dv proc + mov r11, __blue_glCore_glProgramUniform4dv jmp r11 -bluegl_glMatrixIndexPointerARB endp +bluegl_glProgramUniform4dv endp -extrn __blue_glCore_glGetQueryObjectuivARB: qword -bluegl_glGetQueryObjectuivARB proc - mov r11, __blue_glCore_glGetQueryObjectuivARB +extrn __blue_glCore_glProgramUniform4ui: qword +bluegl_glProgramUniform4ui proc + mov r11, __blue_glCore_glProgramUniform4ui jmp r11 -bluegl_glGetQueryObjectuivARB endp +bluegl_glProgramUniform4ui endp -extrn __blue_glCore_glColorFormatNV: qword -bluegl_glColorFormatNV proc - mov r11, __blue_glCore_glColorFormatNV +extrn __blue_glCore_glProgramUniform4uiv: qword +bluegl_glProgramUniform4uiv proc + mov r11, __blue_glCore_glProgramUniform4uiv jmp r11 -bluegl_glColorFormatNV endp +bluegl_glProgramUniform4uiv endp -extrn __blue_glCore_glMultiTexGenfvEXT: qword -bluegl_glMultiTexGenfvEXT proc - mov r11, __blue_glCore_glMultiTexGenfvEXT +extrn __blue_glCore_glProgramUniformMatrix2fv: qword +bluegl_glProgramUniformMatrix2fv proc + mov r11, __blue_glCore_glProgramUniformMatrix2fv jmp r11 -bluegl_glMultiTexGenfvEXT endp +bluegl_glProgramUniformMatrix2fv endp -extrn __blue_glCore_glGetUniformfvARB: qword -bluegl_glGetUniformfvARB proc - mov r11, __blue_glCore_glGetUniformfvARB +extrn __blue_glCore_glProgramUniformMatrix3fv: qword +bluegl_glProgramUniformMatrix3fv proc + mov r11, __blue_glCore_glProgramUniformMatrix3fv jmp r11 -bluegl_glGetUniformfvARB endp +bluegl_glProgramUniformMatrix3fv endp -extrn __blue_glCore_glTexCoord3hNV: qword -bluegl_glTexCoord3hNV proc - mov r11, __blue_glCore_glTexCoord3hNV +extrn __blue_glCore_glProgramUniformMatrix4fv: qword +bluegl_glProgramUniformMatrix4fv proc + mov r11, __blue_glCore_glProgramUniformMatrix4fv jmp r11 -bluegl_glTexCoord3hNV endp +bluegl_glProgramUniformMatrix4fv endp -extrn __blue_glCore_glPathGlyphRangeNV: qword -bluegl_glPathGlyphRangeNV proc - mov r11, __blue_glCore_glPathGlyphRangeNV +extrn __blue_glCore_glProgramUniformMatrix2dv: qword +bluegl_glProgramUniformMatrix2dv proc + mov r11, __blue_glCore_glProgramUniformMatrix2dv jmp r11 -bluegl_glPathGlyphRangeNV endp +bluegl_glProgramUniformMatrix2dv endp -extrn __blue_glCore_glCopyTextureSubImage3DEXT: qword -bluegl_glCopyTextureSubImage3DEXT proc - mov r11, __blue_glCore_glCopyTextureSubImage3DEXT +extrn __blue_glCore_glProgramUniformMatrix3dv: qword +bluegl_glProgramUniformMatrix3dv proc + mov r11, __blue_glCore_glProgramUniformMatrix3dv jmp r11 -bluegl_glCopyTextureSubImage3DEXT endp +bluegl_glProgramUniformMatrix3dv endp -extrn __blue_glCore_glColor3xOES: qword -bluegl_glColor3xOES proc - mov r11, __blue_glCore_glColor3xOES +extrn __blue_glCore_glProgramUniformMatrix4dv: qword +bluegl_glProgramUniformMatrix4dv proc + mov r11, __blue_glCore_glProgramUniformMatrix4dv jmp r11 -bluegl_glColor3xOES endp +bluegl_glProgramUniformMatrix4dv endp -extrn __blue_glCore_glVertexAttrib4hNV: qword -bluegl_glVertexAttrib4hNV proc - mov r11, __blue_glCore_glVertexAttrib4hNV +extrn __blue_glCore_glProgramUniformMatrix2x3fv: qword +bluegl_glProgramUniformMatrix2x3fv proc + mov r11, __blue_glCore_glProgramUniformMatrix2x3fv jmp r11 -bluegl_glVertexAttrib4hNV endp +bluegl_glProgramUniformMatrix2x3fv endp -extrn __blue_glCore_glProgramUniformui64NV: qword -bluegl_glProgramUniformui64NV proc - mov r11, __blue_glCore_glProgramUniformui64NV +extrn __blue_glCore_glProgramUniformMatrix3x2fv: qword +bluegl_glProgramUniformMatrix3x2fv proc + mov r11, __blue_glCore_glProgramUniformMatrix3x2fv jmp r11 -bluegl_glProgramUniformui64NV endp +bluegl_glProgramUniformMatrix3x2fv endp -extrn __blue_glCore_glVertexArrayVertexAttribLFormatEXT: qword -bluegl_glVertexArrayVertexAttribLFormatEXT proc - mov r11, __blue_glCore_glVertexArrayVertexAttribLFormatEXT +extrn __blue_glCore_glProgramUniformMatrix2x4fv: qword +bluegl_glProgramUniformMatrix2x4fv proc + mov r11, __blue_glCore_glProgramUniformMatrix2x4fv jmp r11 -bluegl_glVertexArrayVertexAttribLFormatEXT endp +bluegl_glProgramUniformMatrix2x4fv endp -extrn __blue_glCore_glGetMinmaxParameterivEXT: qword -bluegl_glGetMinmaxParameterivEXT proc - mov r11, __blue_glCore_glGetMinmaxParameterivEXT +extrn __blue_glCore_glProgramUniformMatrix4x2fv: qword +bluegl_glProgramUniformMatrix4x2fv proc + mov r11, __blue_glCore_glProgramUniformMatrix4x2fv jmp r11 -bluegl_glGetMinmaxParameterivEXT endp +bluegl_glProgramUniformMatrix4x2fv endp -extrn __blue_glCore_glWindowPos3iMESA: qword -bluegl_glWindowPos3iMESA proc - mov r11, __blue_glCore_glWindowPos3iMESA +extrn __blue_glCore_glProgramUniformMatrix3x4fv: qword +bluegl_glProgramUniformMatrix3x4fv proc + mov r11, __blue_glCore_glProgramUniformMatrix3x4fv jmp r11 -bluegl_glWindowPos3iMESA endp +bluegl_glProgramUniformMatrix3x4fv endp -extrn __blue_glCore_glVertexAttribLFormat: qword -bluegl_glVertexAttribLFormat proc - mov r11, __blue_glCore_glVertexAttribLFormat +extrn __blue_glCore_glProgramUniformMatrix4x3fv: qword +bluegl_glProgramUniformMatrix4x3fv proc + mov r11, __blue_glCore_glProgramUniformMatrix4x3fv jmp r11 -bluegl_glVertexAttribLFormat endp +bluegl_glProgramUniformMatrix4x3fv endp -extrn __blue_glCore_glGetObjectParameterfvARB: qword -bluegl_glGetObjectParameterfvARB proc - mov r11, __blue_glCore_glGetObjectParameterfvARB +extrn __blue_glCore_glProgramUniformMatrix2x3dv: qword +bluegl_glProgramUniformMatrix2x3dv proc + mov r11, __blue_glCore_glProgramUniformMatrix2x3dv jmp r11 -bluegl_glGetObjectParameterfvARB endp +bluegl_glProgramUniformMatrix2x3dv endp -extrn __blue_glCore_glStencilFillPathNV: qword -bluegl_glStencilFillPathNV proc - mov r11, __blue_glCore_glStencilFillPathNV +extrn __blue_glCore_glProgramUniformMatrix3x2dv: qword +bluegl_glProgramUniformMatrix3x2dv proc + mov r11, __blue_glCore_glProgramUniformMatrix3x2dv jmp r11 -bluegl_glStencilFillPathNV endp +bluegl_glProgramUniformMatrix3x2dv endp -extrn __blue_glCore_glEvalCoord1xvOES: qword -bluegl_glEvalCoord1xvOES proc - mov r11, __blue_glCore_glEvalCoord1xvOES +extrn __blue_glCore_glProgramUniformMatrix2x4dv: qword +bluegl_glProgramUniformMatrix2x4dv proc + mov r11, __blue_glCore_glProgramUniformMatrix2x4dv jmp r11 -bluegl_glEvalCoord1xvOES endp +bluegl_glProgramUniformMatrix2x4dv endp -extrn __blue_glCore_glUniform4d: qword -bluegl_glUniform4d proc - mov r11, __blue_glCore_glUniform4d +extrn __blue_glCore_glProgramUniformMatrix4x2dv: qword +bluegl_glProgramUniformMatrix4x2dv proc + mov r11, __blue_glCore_glProgramUniformMatrix4x2dv jmp r11 -bluegl_glUniform4d endp +bluegl_glProgramUniformMatrix4x2dv endp -extrn __blue_glCore_glGetTextureHandleNV: qword -bluegl_glGetTextureHandleNV proc - mov r11, __blue_glCore_glGetTextureHandleNV +extrn __blue_glCore_glProgramUniformMatrix3x4dv: qword +bluegl_glProgramUniformMatrix3x4dv proc + mov r11, __blue_glCore_glProgramUniformMatrix3x4dv jmp r11 -bluegl_glGetTextureHandleNV endp +bluegl_glProgramUniformMatrix3x4dv endp -extrn __blue_glCore_glGetUniformuivEXT: qword -bluegl_glGetUniformuivEXT proc - mov r11, __blue_glCore_glGetUniformuivEXT +extrn __blue_glCore_glProgramUniformMatrix4x3dv: qword +bluegl_glProgramUniformMatrix4x3dv proc + mov r11, __blue_glCore_glProgramUniformMatrix4x3dv jmp r11 -bluegl_glGetUniformuivEXT endp +bluegl_glProgramUniformMatrix4x3dv endp -extrn __blue_glCore_glIsTextureEXT: qword -bluegl_glIsTextureEXT proc - mov r11, __blue_glCore_glIsTextureEXT +extrn __blue_glCore_glValidateProgramPipeline: qword +bluegl_glValidateProgramPipeline proc + mov r11, __blue_glCore_glValidateProgramPipeline jmp r11 -bluegl_glIsTextureEXT endp +bluegl_glValidateProgramPipeline endp -extrn __blue_glCore_glProgramUniform2d: qword -bluegl_glProgramUniform2d proc - mov r11, __blue_glCore_glProgramUniform2d +extrn __blue_glCore_glGetProgramPipelineInfoLog: qword +bluegl_glGetProgramPipelineInfoLog proc + mov r11, __blue_glCore_glGetProgramPipelineInfoLog jmp r11 -bluegl_glProgramUniform2d endp +bluegl_glGetProgramPipelineInfoLog endp -extrn __blue_glCore_glGetnUniformuivARB: qword -bluegl_glGetnUniformuivARB proc - mov r11, __blue_glCore_glGetnUniformuivARB +extrn __blue_glCore_glVertexAttribL1d: qword +bluegl_glVertexAttribL1d proc + mov r11, __blue_glCore_glVertexAttribL1d jmp r11 -bluegl_glGetnUniformuivARB endp +bluegl_glVertexAttribL1d endp -extrn __blue_glCore_glIsShader: qword -bluegl_glIsShader proc - mov r11, __blue_glCore_glIsShader +extrn __blue_glCore_glVertexAttribL2d: qword +bluegl_glVertexAttribL2d proc + mov r11, __blue_glCore_glVertexAttribL2d jmp r11 -bluegl_glIsShader endp +bluegl_glVertexAttribL2d endp -extrn __blue_glCore_glGetVertexArrayIndexed64iv: qword -bluegl_glGetVertexArrayIndexed64iv proc - mov r11, __blue_glCore_glGetVertexArrayIndexed64iv +extrn __blue_glCore_glVertexAttribL3d: qword +bluegl_glVertexAttribL3d proc + mov r11, __blue_glCore_glVertexAttribL3d jmp r11 -bluegl_glGetVertexArrayIndexed64iv endp +bluegl_glVertexAttribL3d endp -extrn __blue_glCore_glGetnHistogramARB: qword -bluegl_glGetnHistogramARB proc - mov r11, __blue_glCore_glGetnHistogramARB +extrn __blue_glCore_glVertexAttribL4d: qword +bluegl_glVertexAttribL4d proc + mov r11, __blue_glCore_glVertexAttribL4d jmp r11 -bluegl_glGetnHistogramARB endp +bluegl_glVertexAttribL4d endp -extrn __blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN: qword -bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN proc - mov r11, __blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN +extrn __blue_glCore_glVertexAttribL1dv: qword +bluegl_glVertexAttribL1dv proc + mov r11, __blue_glCore_glVertexAttribL1dv jmp r11 -bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN endp +bluegl_glVertexAttribL1dv endp -extrn __blue_glCore_glVertexAttribI2ivEXT: qword -bluegl_glVertexAttribI2ivEXT proc - mov r11, __blue_glCore_glVertexAttribI2ivEXT +extrn __blue_glCore_glVertexAttribL2dv: qword +bluegl_glVertexAttribL2dv proc + mov r11, __blue_glCore_glVertexAttribL2dv jmp r11 -bluegl_glVertexAttribI2ivEXT endp +bluegl_glVertexAttribL2dv endp -extrn __blue_glCore_glTexSubImage2DEXT: qword -bluegl_glTexSubImage2DEXT proc - mov r11, __blue_glCore_glTexSubImage2DEXT +extrn __blue_glCore_glVertexAttribL3dv: qword +bluegl_glVertexAttribL3dv proc + mov r11, __blue_glCore_glVertexAttribL3dv jmp r11 -bluegl_glTexSubImage2DEXT endp +bluegl_glVertexAttribL3dv endp -extrn __blue_glCore_glGetFragmentMaterialivSGIX: qword -bluegl_glGetFragmentMaterialivSGIX proc - mov r11, __blue_glCore_glGetFragmentMaterialivSGIX +extrn __blue_glCore_glVertexAttribL4dv: qword +bluegl_glVertexAttribL4dv proc + mov r11, __blue_glCore_glVertexAttribL4dv jmp r11 -bluegl_glGetFragmentMaterialivSGIX endp +bluegl_glVertexAttribL4dv endp -extrn __blue_glCore_glClearNamedFramebufferiv: qword -bluegl_glClearNamedFramebufferiv proc - mov r11, __blue_glCore_glClearNamedFramebufferiv +extrn __blue_glCore_glVertexAttribLPointer: qword +bluegl_glVertexAttribLPointer proc + mov r11, __blue_glCore_glVertexAttribLPointer jmp r11 -bluegl_glClearNamedFramebufferiv endp +bluegl_glVertexAttribLPointer endp -extrn __blue_glCore_glMatrixMult3x3fNV: qword -bluegl_glMatrixMult3x3fNV proc - mov r11, __blue_glCore_glMatrixMult3x3fNV +extrn __blue_glCore_glGetVertexAttribLdv: qword +bluegl_glGetVertexAttribLdv proc + mov r11, __blue_glCore_glGetVertexAttribLdv jmp r11 -bluegl_glMatrixMult3x3fNV endp +bluegl_glGetVertexAttribLdv endp -extrn __blue_glCore_glGetQueryBufferObjectiv: qword -bluegl_glGetQueryBufferObjectiv proc - mov r11, __blue_glCore_glGetQueryBufferObjectiv +extrn __blue_glCore_glViewportArrayv: qword +bluegl_glViewportArrayv proc + mov r11, __blue_glCore_glViewportArrayv jmp r11 -bluegl_glGetQueryBufferObjectiv endp +bluegl_glViewportArrayv endp -extrn __blue_glCore_glVideoCaptureStreamParameterfvNV: qword -bluegl_glVideoCaptureStreamParameterfvNV proc - mov r11, __blue_glCore_glVideoCaptureStreamParameterfvNV +extrn __blue_glCore_glViewportIndexedf: qword +bluegl_glViewportIndexedf proc + mov r11, __blue_glCore_glViewportIndexedf jmp r11 -bluegl_glVideoCaptureStreamParameterfvNV endp +bluegl_glViewportIndexedf endp -extrn __blue_glCore_glTexImage3DMultisample: qword -bluegl_glTexImage3DMultisample proc - mov r11, __blue_glCore_glTexImage3DMultisample +extrn __blue_glCore_glViewportIndexedfv: qword +bluegl_glViewportIndexedfv proc + mov r11, __blue_glCore_glViewportIndexedfv jmp r11 -bluegl_glTexImage3DMultisample endp +bluegl_glViewportIndexedfv endp -extrn __blue_glCore_glVertexArraySecondaryColorOffsetEXT: qword -bluegl_glVertexArraySecondaryColorOffsetEXT proc - mov r11, __blue_glCore_glVertexArraySecondaryColorOffsetEXT +extrn __blue_glCore_glScissorArrayv: qword +bluegl_glScissorArrayv proc + mov r11, __blue_glCore_glScissorArrayv jmp r11 -bluegl_glVertexArraySecondaryColorOffsetEXT endp +bluegl_glScissorArrayv endp -extrn __blue_glCore_glVariantusvEXT: qword -bluegl_glVariantusvEXT proc - mov r11, __blue_glCore_glVariantusvEXT +extrn __blue_glCore_glScissorIndexed: qword +bluegl_glScissorIndexed proc + mov r11, __blue_glCore_glScissorIndexed jmp r11 -bluegl_glVariantusvEXT endp +bluegl_glScissorIndexed endp -extrn __blue_glCore_glDrawArraysInstanced: qword -bluegl_glDrawArraysInstanced proc - mov r11, __blue_glCore_glDrawArraysInstanced +extrn __blue_glCore_glScissorIndexedv: qword +bluegl_glScissorIndexedv proc + mov r11, __blue_glCore_glScissorIndexedv jmp r11 -bluegl_glDrawArraysInstanced endp +bluegl_glScissorIndexedv endp -extrn __blue_glCore_glProgramUniformMatrix2x4dvEXT: qword -bluegl_glProgramUniformMatrix2x4dvEXT proc - mov r11, __blue_glCore_glProgramUniformMatrix2x4dvEXT +extrn __blue_glCore_glDepthRangeArrayv: qword +bluegl_glDepthRangeArrayv proc + mov r11, __blue_glCore_glDepthRangeArrayv jmp r11 -bluegl_glProgramUniformMatrix2x4dvEXT endp +bluegl_glDepthRangeArrayv endp -extrn __blue_glCore_glProgramBufferParametersIivNV: qword -bluegl_glProgramBufferParametersIivNV proc - mov r11, __blue_glCore_glProgramBufferParametersIivNV +extrn __blue_glCore_glDepthRangeIndexed: qword +bluegl_glDepthRangeIndexed proc + mov r11, __blue_glCore_glDepthRangeIndexed jmp r11 -bluegl_glProgramBufferParametersIivNV endp +bluegl_glDepthRangeIndexed endp -extrn __blue_glCore_glViewportArrayv: qword -bluegl_glViewportArrayv proc - mov r11, __blue_glCore_glViewportArrayv +extrn __blue_glCore_glGetFloati_v: qword +bluegl_glGetFloati_v proc + mov r11, __blue_glCore_glGetFloati_v jmp r11 -bluegl_glViewportArrayv endp +bluegl_glGetFloati_v endp -extrn __blue_glCore_glTangent3svEXT: qword -bluegl_glTangent3svEXT proc - mov r11, __blue_glCore_glTangent3svEXT +extrn __blue_glCore_glGetDoublei_v: qword +bluegl_glGetDoublei_v proc + mov r11, __blue_glCore_glGetDoublei_v jmp r11 -bluegl_glTangent3svEXT endp +bluegl_glGetDoublei_v endp -extrn __blue_glCore_glReplacementCodeuiVertex3fSUN: qword -bluegl_glReplacementCodeuiVertex3fSUN proc - mov r11, __blue_glCore_glReplacementCodeuiVertex3fSUN +extrn __blue_glCore_glDrawArraysInstancedBaseInstance: qword +bluegl_glDrawArraysInstancedBaseInstance proc + mov r11, __blue_glCore_glDrawArraysInstancedBaseInstance jmp r11 -bluegl_glReplacementCodeuiVertex3fSUN endp +bluegl_glDrawArraysInstancedBaseInstance endp -extrn __blue_glCore_glSharpenTexFuncSGIS: qword -bluegl_glSharpenTexFuncSGIS proc - mov r11, __blue_glCore_glSharpenTexFuncSGIS +extrn __blue_glCore_glDrawElementsInstancedBaseInstance: qword +bluegl_glDrawElementsInstancedBaseInstance proc + mov r11, __blue_glCore_glDrawElementsInstancedBaseInstance jmp r11 -bluegl_glSharpenTexFuncSGIS endp +bluegl_glDrawElementsInstancedBaseInstance endp -extrn __blue_glCore_glNormalFormatNV: qword -bluegl_glNormalFormatNV proc - mov r11, __blue_glCore_glNormalFormatNV +extrn __blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance: qword +bluegl_glDrawElementsInstancedBaseVertexBaseInstance proc + mov r11, __blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance jmp r11 -bluegl_glNormalFormatNV endp +bluegl_glDrawElementsInstancedBaseVertexBaseInstance endp -extrn __blue_glCore_glVertexAttribL3dv: qword -bluegl_glVertexAttribL3dv proc - mov r11, __blue_glCore_glVertexAttribL3dv +extrn __blue_glCore_glGetInternalformativ: qword +bluegl_glGetInternalformativ proc + mov r11, __blue_glCore_glGetInternalformativ jmp r11 -bluegl_glVertexAttribL3dv endp +bluegl_glGetInternalformativ endp -extrn __blue_glCore_glNamedStringARB: qword -bluegl_glNamedStringARB proc - mov r11, __blue_glCore_glNamedStringARB +extrn __blue_glCore_glGetActiveAtomicCounterBufferiv: qword +bluegl_glGetActiveAtomicCounterBufferiv proc + mov r11, __blue_glCore_glGetActiveAtomicCounterBufferiv jmp r11 -bluegl_glNamedStringARB endp +bluegl_glGetActiveAtomicCounterBufferiv endp -extrn __blue_glCore_glVertexArrayVertexAttribFormatEXT: qword -bluegl_glVertexArrayVertexAttribFormatEXT proc - mov r11, __blue_glCore_glVertexArrayVertexAttribFormatEXT +extrn __blue_glCore_glBindImageTexture: qword +bluegl_glBindImageTexture proc + mov r11, __blue_glCore_glBindImageTexture jmp r11 -bluegl_glVertexArrayVertexAttribFormatEXT endp +bluegl_glBindImageTexture endp -extrn __blue_glCore_glMultiTexCoordP3ui: qword -bluegl_glMultiTexCoordP3ui proc - mov r11, __blue_glCore_glMultiTexCoordP3ui +extrn __blue_glCore_glMemoryBarrier: qword +bluegl_glMemoryBarrier proc + mov r11, __blue_glCore_glMemoryBarrier jmp r11 -bluegl_glMultiTexCoordP3ui endp +bluegl_glMemoryBarrier endp -extrn __blue_glCore_glMultiTexSubImage3DEXT: qword -bluegl_glMultiTexSubImage3DEXT proc - mov r11, __blue_glCore_glMultiTexSubImage3DEXT +extrn __blue_glCore_glTexStorage1D: qword +bluegl_glTexStorage1D proc + mov r11, __blue_glCore_glTexStorage1D jmp r11 -bluegl_glMultiTexSubImage3DEXT endp +bluegl_glTexStorage1D endp -extrn __blue_glCore_glUniform2fvARB: qword -bluegl_glUniform2fvARB proc - mov r11, __blue_glCore_glUniform2fvARB +extrn __blue_glCore_glTexStorage2D: qword +bluegl_glTexStorage2D proc + mov r11, __blue_glCore_glTexStorage2D jmp r11 -bluegl_glUniform2fvARB endp +bluegl_glTexStorage2D endp -extrn __blue_glCore_glGetPixelMapxv: qword -bluegl_glGetPixelMapxv proc - mov r11, __blue_glCore_glGetPixelMapxv +extrn __blue_glCore_glTexStorage3D: qword +bluegl_glTexStorage3D proc + mov r11, __blue_glCore_glTexStorage3D jmp r11 -bluegl_glGetPixelMapxv endp +bluegl_glTexStorage3D endp -extrn __blue_glCore_glTangent3ivEXT: qword -bluegl_glTangent3ivEXT proc - mov r11, __blue_glCore_glTangent3ivEXT +extrn __blue_glCore_glDrawTransformFeedbackInstanced: qword +bluegl_glDrawTransformFeedbackInstanced proc + mov r11, __blue_glCore_glDrawTransformFeedbackInstanced jmp r11 -bluegl_glTangent3ivEXT endp +bluegl_glDrawTransformFeedbackInstanced endp -extrn __blue_glCore_glGetLocalConstantIntegervEXT: qword -bluegl_glGetLocalConstantIntegervEXT proc - mov r11, __blue_glCore_glGetLocalConstantIntegervEXT +extrn __blue_glCore_glDrawTransformFeedbackStreamInstanced: qword +bluegl_glDrawTransformFeedbackStreamInstanced proc + mov r11, __blue_glCore_glDrawTransformFeedbackStreamInstanced jmp r11 -bluegl_glGetLocalConstantIntegervEXT endp +bluegl_glDrawTransformFeedbackStreamInstanced endp -extrn __blue_glCore_glPresentFrameDualFillNV: qword -bluegl_glPresentFrameDualFillNV proc - mov r11, __blue_glCore_glPresentFrameDualFillNV +extrn __blue_glCore_glClearBufferData: qword +bluegl_glClearBufferData proc + mov r11, __blue_glCore_glClearBufferData jmp r11 -bluegl_glPresentFrameDualFillNV endp +bluegl_glClearBufferData endp -extrn __blue_glCore_glEndVertexShaderEXT: qword -bluegl_glEndVertexShaderEXT proc - mov r11, __blue_glCore_glEndVertexShaderEXT +extrn __blue_glCore_glClearBufferSubData: qword +bluegl_glClearBufferSubData proc + mov r11, __blue_glCore_glClearBufferSubData jmp r11 -bluegl_glEndVertexShaderEXT endp +bluegl_glClearBufferSubData endp -extrn __blue_glCore_glVertexArrayVertexBuffer: qword -bluegl_glVertexArrayVertexBuffer proc - mov r11, __blue_glCore_glVertexArrayVertexBuffer +extrn __blue_glCore_glDispatchCompute: qword +bluegl_glDispatchCompute proc + mov r11, __blue_glCore_glDispatchCompute jmp r11 -bluegl_glVertexArrayVertexBuffer endp +bluegl_glDispatchCompute endp -extrn __blue_glCore_glMakeTextureHandleNonResidentNV: qword -bluegl_glMakeTextureHandleNonResidentNV proc - mov r11, __blue_glCore_glMakeTextureHandleNonResidentNV +extrn __blue_glCore_glDispatchComputeIndirect: qword +bluegl_glDispatchComputeIndirect proc + mov r11, __blue_glCore_glDispatchComputeIndirect jmp r11 -bluegl_glMakeTextureHandleNonResidentNV endp +bluegl_glDispatchComputeIndirect endp -extrn __blue_glCore_glVertexAttribI3uiEXT: qword -bluegl_glVertexAttribI3uiEXT proc - mov r11, __blue_glCore_glVertexAttribI3uiEXT +extrn __blue_glCore_glCopyImageSubData: qword +bluegl_glCopyImageSubData proc + mov r11, __blue_glCore_glCopyImageSubData jmp r11 -bluegl_glVertexAttribI3uiEXT endp +bluegl_glCopyImageSubData endp -extrn __blue_glCore_glBinormal3bvEXT: qword -bluegl_glBinormal3bvEXT proc - mov r11, __blue_glCore_glBinormal3bvEXT +extrn __blue_glCore_glFramebufferParameteri: qword +bluegl_glFramebufferParameteri proc + mov r11, __blue_glCore_glFramebufferParameteri jmp r11 -bluegl_glBinormal3bvEXT endp +bluegl_glFramebufferParameteri endp -extrn __blue_glCore_glPixelTexGenParameterfSGIS: qword -bluegl_glPixelTexGenParameterfSGIS proc - mov r11, __blue_glCore_glPixelTexGenParameterfSGIS +extrn __blue_glCore_glGetFramebufferParameteriv: qword +bluegl_glGetFramebufferParameteriv proc + mov r11, __blue_glCore_glGetFramebufferParameteriv jmp r11 -bluegl_glPixelTexGenParameterfSGIS endp +bluegl_glGetFramebufferParameteriv endp -extrn __blue_glCore_glMultiTexGenivEXT: qword -bluegl_glMultiTexGenivEXT proc - mov r11, __blue_glCore_glMultiTexGenivEXT +extrn __blue_glCore_glGetInternalformati64v: qword +bluegl_glGetInternalformati64v proc + mov r11, __blue_glCore_glGetInternalformati64v jmp r11 -bluegl_glMultiTexGenivEXT endp +bluegl_glGetInternalformati64v endp -extrn __blue_glCore_glGetVideoivNV: qword -bluegl_glGetVideoivNV proc - mov r11, __blue_glCore_glGetVideoivNV +extrn __blue_glCore_glInvalidateTexSubImage: qword +bluegl_glInvalidateTexSubImage proc + mov r11, __blue_glCore_glInvalidateTexSubImage jmp r11 -bluegl_glGetVideoivNV endp +bluegl_glInvalidateTexSubImage endp -extrn __blue_glCore_glMultiTexCoordP2ui: qword -bluegl_glMultiTexCoordP2ui proc - mov r11, __blue_glCore_glMultiTexCoordP2ui +extrn __blue_glCore_glInvalidateTexImage: qword +bluegl_glInvalidateTexImage proc + mov r11, __blue_glCore_glInvalidateTexImage jmp r11 -bluegl_glMultiTexCoordP2ui endp +bluegl_glInvalidateTexImage endp -extrn __blue_glCore_glDeletePerfQueryINTEL: qword -bluegl_glDeletePerfQueryINTEL proc - mov r11, __blue_glCore_glDeletePerfQueryINTEL +extrn __blue_glCore_glInvalidateBufferSubData: qword +bluegl_glInvalidateBufferSubData proc + mov r11, __blue_glCore_glInvalidateBufferSubData jmp r11 -bluegl_glDeletePerfQueryINTEL endp +bluegl_glInvalidateBufferSubData endp -extrn __blue_glCore_glDepthBoundsdNV: qword -bluegl_glDepthBoundsdNV proc - mov r11, __blue_glCore_glDepthBoundsdNV +extrn __blue_glCore_glInvalidateBufferData: qword +bluegl_glInvalidateBufferData proc + mov r11, __blue_glCore_glInvalidateBufferData jmp r11 -bluegl_glDepthBoundsdNV endp +bluegl_glInvalidateBufferData endp -extrn __blue_glCore_glPixelTransferxOES: qword -bluegl_glPixelTransferxOES proc - mov r11, __blue_glCore_glPixelTransferxOES +extrn __blue_glCore_glInvalidateFramebuffer: qword +bluegl_glInvalidateFramebuffer proc + mov r11, __blue_glCore_glInvalidateFramebuffer jmp r11 -bluegl_glPixelTransferxOES endp +bluegl_glInvalidateFramebuffer endp -extrn __blue_glCore_glCombinerOutputNV: qword -bluegl_glCombinerOutputNV proc - mov r11, __blue_glCore_glCombinerOutputNV +extrn __blue_glCore_glInvalidateSubFramebuffer: qword +bluegl_glInvalidateSubFramebuffer proc + mov r11, __blue_glCore_glInvalidateSubFramebuffer jmp r11 -bluegl_glCombinerOutputNV endp +bluegl_glInvalidateSubFramebuffer endp -extrn __blue_glCore_glCopyTextureSubImage1D: qword -bluegl_glCopyTextureSubImage1D proc - mov r11, __blue_glCore_glCopyTextureSubImage1D +extrn __blue_glCore_glMultiDrawArraysIndirect: qword +bluegl_glMultiDrawArraysIndirect proc + mov r11, __blue_glCore_glMultiDrawArraysIndirect jmp r11 -bluegl_glCopyTextureSubImage1D endp +bluegl_glMultiDrawArraysIndirect endp -extrn __blue_glCore_glVertexAttribI4iv: qword -bluegl_glVertexAttribI4iv proc - mov r11, __blue_glCore_glVertexAttribI4iv +extrn __blue_glCore_glMultiDrawElementsIndirect: qword +bluegl_glMultiDrawElementsIndirect proc + mov r11, __blue_glCore_glMultiDrawElementsIndirect jmp r11 -bluegl_glVertexAttribI4iv endp +bluegl_glMultiDrawElementsIndirect endp -extrn __blue_glCore_glCopyTexImage2DEXT: qword -bluegl_glCopyTexImage2DEXT proc - mov r11, __blue_glCore_glCopyTexImage2DEXT +extrn __blue_glCore_glGetProgramInterfaceiv: qword +bluegl_glGetProgramInterfaceiv proc + mov r11, __blue_glCore_glGetProgramInterfaceiv jmp r11 -bluegl_glCopyTexImage2DEXT endp +bluegl_glGetProgramInterfaceiv endp -extrn __blue_glCore_glBindLightParameterEXT: qword -bluegl_glBindLightParameterEXT proc - mov r11, __blue_glCore_glBindLightParameterEXT +extrn __blue_glCore_glGetProgramResourceIndex: qword +bluegl_glGetProgramResourceIndex proc + mov r11, __blue_glCore_glGetProgramResourceIndex jmp r11 -bluegl_glBindLightParameterEXT endp +bluegl_glGetProgramResourceIndex endp -extrn __blue_glCore_glMultiDrawElementsBaseVertex: qword -bluegl_glMultiDrawElementsBaseVertex proc - mov r11, __blue_glCore_glMultiDrawElementsBaseVertex +extrn __blue_glCore_glGetProgramResourceName: qword +bluegl_glGetProgramResourceName proc + mov r11, __blue_glCore_glGetProgramResourceName jmp r11 -bluegl_glMultiDrawElementsBaseVertex endp +bluegl_glGetProgramResourceName endp -extrn __blue_glCore_glProgramUniform2uivEXT: qword -bluegl_glProgramUniform2uivEXT proc - mov r11, __blue_glCore_glProgramUniform2uivEXT +extrn __blue_glCore_glGetProgramResourceiv: qword +bluegl_glGetProgramResourceiv proc + mov r11, __blue_glCore_glGetProgramResourceiv jmp r11 -bluegl_glProgramUniform2uivEXT endp +bluegl_glGetProgramResourceiv endp -extrn __blue_glCore_glDeletePerfMonitorsAMD: qword -bluegl_glDeletePerfMonitorsAMD proc - mov r11, __blue_glCore_glDeletePerfMonitorsAMD +extrn __blue_glCore_glGetProgramResourceLocation: qword +bluegl_glGetProgramResourceLocation proc + mov r11, __blue_glCore_glGetProgramResourceLocation jmp r11 -bluegl_glDeletePerfMonitorsAMD endp +bluegl_glGetProgramResourceLocation endp -extrn __blue_glCore_glCopyImageSubData: qword -bluegl_glCopyImageSubData proc - mov r11, __blue_glCore_glCopyImageSubData +extrn __blue_glCore_glGetProgramResourceLocationIndex: qword +bluegl_glGetProgramResourceLocationIndex proc + mov r11, __blue_glCore_glGetProgramResourceLocationIndex jmp r11 -bluegl_glCopyImageSubData endp +bluegl_glGetProgramResourceLocationIndex endp -extrn __blue_glCore_glPathCoverDepthFuncNV: qword -bluegl_glPathCoverDepthFuncNV proc - mov r11, __blue_glCore_glPathCoverDepthFuncNV +extrn __blue_glCore_glShaderStorageBlockBinding: qword +bluegl_glShaderStorageBlockBinding proc + mov r11, __blue_glCore_glShaderStorageBlockBinding jmp r11 -bluegl_glPathCoverDepthFuncNV endp +bluegl_glShaderStorageBlockBinding endp -extrn __blue_glCore_glGetFramebufferAttachmentParameteriv: qword -bluegl_glGetFramebufferAttachmentParameteriv proc - mov r11, __blue_glCore_glGetFramebufferAttachmentParameteriv +extrn __blue_glCore_glTexBufferRange: qword +bluegl_glTexBufferRange proc + mov r11, __blue_glCore_glTexBufferRange jmp r11 -bluegl_glGetFramebufferAttachmentParameteriv endp +bluegl_glTexBufferRange endp -extrn __blue_glCore_glRectxOES: qword -bluegl_glRectxOES proc - mov r11, __blue_glCore_glRectxOES +extrn __blue_glCore_glTexStorage2DMultisample: qword +bluegl_glTexStorage2DMultisample proc + mov r11, __blue_glCore_glTexStorage2DMultisample jmp r11 -bluegl_glRectxOES endp +bluegl_glTexStorage2DMultisample endp -extrn __blue_glCore_glTagSampleBufferSGIX: qword -bluegl_glTagSampleBufferSGIX proc - mov r11, __blue_glCore_glTagSampleBufferSGIX +extrn __blue_glCore_glTexStorage3DMultisample: qword +bluegl_glTexStorage3DMultisample proc + mov r11, __blue_glCore_glTexStorage3DMultisample jmp r11 -bluegl_glTagSampleBufferSGIX endp +bluegl_glTexStorage3DMultisample endp -extrn __blue_glCore_glVertexStream3svATI: qword -bluegl_glVertexStream3svATI proc - mov r11, __blue_glCore_glVertexStream3svATI +extrn __blue_glCore_glTextureView: qword +bluegl_glTextureView proc + mov r11, __blue_glCore_glTextureView jmp r11 -bluegl_glVertexStream3svATI endp +bluegl_glTextureView endp -extrn __blue_glCore_glGetPathTexGenfvNV: qword -bluegl_glGetPathTexGenfvNV proc - mov r11, __blue_glCore_glGetPathTexGenfvNV +extrn __blue_glCore_glBindVertexBuffer: qword +bluegl_glBindVertexBuffer proc + mov r11, __blue_glCore_glBindVertexBuffer jmp r11 -bluegl_glGetPathTexGenfvNV endp +bluegl_glBindVertexBuffer endp -extrn __blue_glCore_glOrthofOES: qword -bluegl_glOrthofOES proc - mov r11, __blue_glCore_glOrthofOES +extrn __blue_glCore_glVertexAttribFormat: qword +bluegl_glVertexAttribFormat proc + mov r11, __blue_glCore_glVertexAttribFormat jmp r11 -bluegl_glOrthofOES endp +bluegl_glVertexAttribFormat endp -extrn __blue_glCore_glCopyTexImage2D: qword -bluegl_glCopyTexImage2D proc - mov r11, __blue_glCore_glCopyTexImage2D +extrn __blue_glCore_glVertexAttribIFormat: qword +bluegl_glVertexAttribIFormat proc + mov r11, __blue_glCore_glVertexAttribIFormat jmp r11 -bluegl_glCopyTexImage2D endp +bluegl_glVertexAttribIFormat endp -extrn __blue_glCore_glTexCoord2fColor4ubVertex3fSUN: qword -bluegl_glTexCoord2fColor4ubVertex3fSUN proc - mov r11, __blue_glCore_glTexCoord2fColor4ubVertex3fSUN +extrn __blue_glCore_glVertexAttribLFormat: qword +bluegl_glVertexAttribLFormat proc + mov r11, __blue_glCore_glVertexAttribLFormat jmp r11 -bluegl_glTexCoord2fColor4ubVertex3fSUN endp +bluegl_glVertexAttribLFormat endp -extrn __blue_glCore_glMultTransposeMatrixdARB: qword -bluegl_glMultTransposeMatrixdARB proc - mov r11, __blue_glCore_glMultTransposeMatrixdARB +extrn __blue_glCore_glVertexAttribBinding: qword +bluegl_glVertexAttribBinding proc + mov r11, __blue_glCore_glVertexAttribBinding jmp r11 -bluegl_glMultTransposeMatrixdARB endp +bluegl_glVertexAttribBinding endp -extrn __blue_glCore_glProgramUniform3i: qword -bluegl_glProgramUniform3i proc - mov r11, __blue_glCore_glProgramUniform3i +extrn __blue_glCore_glVertexBindingDivisor: qword +bluegl_glVertexBindingDivisor proc + mov r11, __blue_glCore_glVertexBindingDivisor jmp r11 -bluegl_glProgramUniform3i endp +bluegl_glVertexBindingDivisor endp -extrn __blue_glCore_glArrayObjectATI: qword -bluegl_glArrayObjectATI proc - mov r11, __blue_glCore_glArrayObjectATI +extrn __blue_glCore_glDebugMessageControl: qword +bluegl_glDebugMessageControl proc + mov r11, __blue_glCore_glDebugMessageControl jmp r11 -bluegl_glArrayObjectATI endp +bluegl_glDebugMessageControl endp -extrn __blue_glCore_glMatrixRotatedEXT: qword -bluegl_glMatrixRotatedEXT proc - mov r11, __blue_glCore_glMatrixRotatedEXT +extrn __blue_glCore_glDebugMessageInsert: qword +bluegl_glDebugMessageInsert proc + mov r11, __blue_glCore_glDebugMessageInsert jmp r11 -bluegl_glMatrixRotatedEXT endp +bluegl_glDebugMessageInsert endp -extrn __blue_glCore_glTexCoordP2ui: qword -bluegl_glTexCoordP2ui proc - mov r11, __blue_glCore_glTexCoordP2ui +extrn __blue_glCore_glDebugMessageCallback: qword +bluegl_glDebugMessageCallback proc + mov r11, __blue_glCore_glDebugMessageCallback jmp r11 -bluegl_glTexCoordP2ui endp +bluegl_glDebugMessageCallback endp -extrn __blue_glCore_glPassTexCoordATI: qword -bluegl_glPassTexCoordATI proc - mov r11, __blue_glCore_glPassTexCoordATI +extrn __blue_glCore_glGetDebugMessageLog: qword +bluegl_glGetDebugMessageLog proc + mov r11, __blue_glCore_glGetDebugMessageLog jmp r11 -bluegl_glPassTexCoordATI endp +bluegl_glGetDebugMessageLog endp -extrn __blue_glCore_glIsTexture: qword -bluegl_glIsTexture proc - mov r11, __blue_glCore_glIsTexture +extrn __blue_glCore_glPushDebugGroup: qword +bluegl_glPushDebugGroup proc + mov r11, __blue_glCore_glPushDebugGroup jmp r11 -bluegl_glIsTexture endp +bluegl_glPushDebugGroup endp -extrn __blue_glCore_glCompressedTexSubImage3DARB: qword -bluegl_glCompressedTexSubImage3DARB proc - mov r11, __blue_glCore_glCompressedTexSubImage3DARB +extrn __blue_glCore_glPopDebugGroup: qword +bluegl_glPopDebugGroup proc + mov r11, __blue_glCore_glPopDebugGroup jmp r11 -bluegl_glCompressedTexSubImage3DARB endp +bluegl_glPopDebugGroup endp -extrn __blue_glCore_glDepthRangexOES: qword -bluegl_glDepthRangexOES proc - mov r11, __blue_glCore_glDepthRangexOES +extrn __blue_glCore_glObjectLabel: qword +bluegl_glObjectLabel proc + mov r11, __blue_glCore_glObjectLabel jmp r11 -bluegl_glDepthRangexOES endp +bluegl_glObjectLabel endp -extrn __blue_glCore_glImageTransformParameterivHP: qword -bluegl_glImageTransformParameterivHP proc - mov r11, __blue_glCore_glImageTransformParameterivHP +extrn __blue_glCore_glGetObjectLabel: qword +bluegl_glGetObjectLabel proc + mov r11, __blue_glCore_glGetObjectLabel jmp r11 -bluegl_glImageTransformParameterivHP endp +bluegl_glGetObjectLabel endp -extrn __blue_glCore_glMultTransposeMatrixfARB: qword -bluegl_glMultTransposeMatrixfARB proc - mov r11, __blue_glCore_glMultTransposeMatrixfARB +extrn __blue_glCore_glObjectPtrLabel: qword +bluegl_glObjectPtrLabel proc + mov r11, __blue_glCore_glObjectPtrLabel jmp r11 -bluegl_glMultTransposeMatrixfARB endp +bluegl_glObjectPtrLabel endp -extrn __blue_glCore_glUniformHandleui64vARB: qword -bluegl_glUniformHandleui64vARB proc - mov r11, __blue_glCore_glUniformHandleui64vARB +extrn __blue_glCore_glGetObjectPtrLabel: qword +bluegl_glGetObjectPtrLabel proc + mov r11, __blue_glCore_glGetObjectPtrLabel jmp r11 -bluegl_glUniformHandleui64vARB endp +bluegl_glGetObjectPtrLabel endp -extrn __blue_glCore_glGenTransformFeedbacks: qword -bluegl_glGenTransformFeedbacks proc - mov r11, __blue_glCore_glGenTransformFeedbacks +extrn __blue_glCore_glBufferStorage: qword +bluegl_glBufferStorage proc + mov r11, __blue_glCore_glBufferStorage jmp r11 -bluegl_glGenTransformFeedbacks endp +bluegl_glBufferStorage endp -extrn __blue_glCore_glTextureStorage1D: qword -bluegl_glTextureStorage1D proc - mov r11, __blue_glCore_glTextureStorage1D +extrn __blue_glCore_glClearTexImage: qword +bluegl_glClearTexImage proc + mov r11, __blue_glCore_glClearTexImage jmp r11 -bluegl_glTextureStorage1D endp +bluegl_glClearTexImage endp -extrn __blue_glCore_glGetVertexAttribivNV: qword -bluegl_glGetVertexAttribivNV proc - mov r11, __blue_glCore_glGetVertexAttribivNV +extrn __blue_glCore_glClearTexSubImage: qword +bluegl_glClearTexSubImage proc + mov r11, __blue_glCore_glClearTexSubImage jmp r11 -bluegl_glGetVertexAttribivNV endp +bluegl_glClearTexSubImage endp -extrn __blue_glCore_glReplacementCodePointerSUN: qword -bluegl_glReplacementCodePointerSUN proc - mov r11, __blue_glCore_glReplacementCodePointerSUN +extrn __blue_glCore_glBindBuffersBase: qword +bluegl_glBindBuffersBase proc + mov r11, __blue_glCore_glBindBuffersBase jmp r11 -bluegl_glReplacementCodePointerSUN endp +bluegl_glBindBuffersBase endp -extrn __blue_glCore_glVertexAttribI3uiv: qword -bluegl_glVertexAttribI3uiv proc - mov r11, __blue_glCore_glVertexAttribI3uiv +extrn __blue_glCore_glBindBuffersRange: qword +bluegl_glBindBuffersRange proc + mov r11, __blue_glCore_glBindBuffersRange jmp r11 -bluegl_glVertexAttribI3uiv endp +bluegl_glBindBuffersRange endp -extrn __blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN: qword -bluegl_glReplacementCodeuiNormal3fVertex3fSUN proc - mov r11, __blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN +extrn __blue_glCore_glBindTextures: qword +bluegl_glBindTextures proc + mov r11, __blue_glCore_glBindTextures jmp r11 -bluegl_glReplacementCodeuiNormal3fVertex3fSUN endp +bluegl_glBindTextures endp -extrn __blue_glCore_glVertexAttribL2dEXT: qword -bluegl_glVertexAttribL2dEXT proc - mov r11, __blue_glCore_glVertexAttribL2dEXT +extrn __blue_glCore_glBindSamplers: qword +bluegl_glBindSamplers proc + mov r11, __blue_glCore_glBindSamplers jmp r11 -bluegl_glVertexAttribL2dEXT endp +bluegl_glBindSamplers endp -extrn __blue_glCore_glProgramUniform3ui64NV: qword -bluegl_glProgramUniform3ui64NV proc - mov r11, __blue_glCore_glProgramUniform3ui64NV +extrn __blue_glCore_glBindImageTextures: qword +bluegl_glBindImageTextures proc + mov r11, __blue_glCore_glBindImageTextures jmp r11 -bluegl_glProgramUniform3ui64NV endp +bluegl_glBindImageTextures endp -extrn __blue_glCore_glProgramUniform3i64NV: qword -bluegl_glProgramUniform3i64NV proc - mov r11, __blue_glCore_glProgramUniform3i64NV +extrn __blue_glCore_glBindVertexBuffers: qword +bluegl_glBindVertexBuffers proc + mov r11, __blue_glCore_glBindVertexBuffers jmp r11 -bluegl_glProgramUniform3i64NV endp +bluegl_glBindVertexBuffers endp -extrn __blue_glCore_glGetNamedRenderbufferParameterivEXT: qword -bluegl_glGetNamedRenderbufferParameterivEXT proc - mov r11, __blue_glCore_glGetNamedRenderbufferParameterivEXT +extrn __blue_glCore_glClipControl: qword +bluegl_glClipControl proc + mov r11, __blue_glCore_glClipControl jmp r11 -bluegl_glGetNamedRenderbufferParameterivEXT endp +bluegl_glClipControl endp -extrn __blue_glCore_glTangent3bvEXT: qword -bluegl_glTangent3bvEXT proc - mov r11, __blue_glCore_glTangent3bvEXT +extrn __blue_glCore_glCreateTransformFeedbacks: qword +bluegl_glCreateTransformFeedbacks proc + mov r11, __blue_glCore_glCreateTransformFeedbacks jmp r11 -bluegl_glTangent3bvEXT endp +bluegl_glCreateTransformFeedbacks endp -extrn __blue_glCore_glProgramUniform1dvEXT: qword -bluegl_glProgramUniform1dvEXT proc - mov r11, __blue_glCore_glProgramUniform1dvEXT +extrn __blue_glCore_glTransformFeedbackBufferBase: qword +bluegl_glTransformFeedbackBufferBase proc + mov r11, __blue_glCore_glTransformFeedbackBufferBase jmp r11 -bluegl_glProgramUniform1dvEXT endp +bluegl_glTransformFeedbackBufferBase endp -extrn __blue_glCore_glMatrixLoadTransposedEXT: qword -bluegl_glMatrixLoadTransposedEXT proc - mov r11, __blue_glCore_glMatrixLoadTransposedEXT +extrn __blue_glCore_glTransformFeedbackBufferRange: qword +bluegl_glTransformFeedbackBufferRange proc + mov r11, __blue_glCore_glTransformFeedbackBufferRange jmp r11 -bluegl_glMatrixLoadTransposedEXT endp +bluegl_glTransformFeedbackBufferRange endp -extrn __blue_glCore_glGetVertexAttribLdv: qword -bluegl_glGetVertexAttribLdv proc - mov r11, __blue_glCore_glGetVertexAttribLdv +extrn __blue_glCore_glGetTransformFeedbackiv: qword +bluegl_glGetTransformFeedbackiv proc + mov r11, __blue_glCore_glGetTransformFeedbackiv jmp r11 -bluegl_glGetVertexAttribLdv endp +bluegl_glGetTransformFeedbackiv endp -extrn __blue_glCore_glVertexStream2dATI: qword -bluegl_glVertexStream2dATI proc - mov r11, __blue_glCore_glVertexStream2dATI +extrn __blue_glCore_glGetTransformFeedbacki_v: qword +bluegl_glGetTransformFeedbacki_v proc + mov r11, __blue_glCore_glGetTransformFeedbacki_v jmp r11 -bluegl_glVertexStream2dATI endp +bluegl_glGetTransformFeedbacki_v endp -extrn __blue_glCore_glGetFragmentLightivSGIX: qword -bluegl_glGetFragmentLightivSGIX proc - mov r11, __blue_glCore_glGetFragmentLightivSGIX +extrn __blue_glCore_glGetTransformFeedbacki64_v: qword +bluegl_glGetTransformFeedbacki64_v proc + mov r11, __blue_glCore_glGetTransformFeedbacki64_v jmp r11 -bluegl_glGetFragmentLightivSGIX endp +bluegl_glGetTransformFeedbacki64_v endp -extrn __blue_glCore_glGetMinmaxEXT: qword -bluegl_glGetMinmaxEXT proc - mov r11, __blue_glCore_glGetMinmaxEXT +extrn __blue_glCore_glCreateBuffers: qword +bluegl_glCreateBuffers proc + mov r11, __blue_glCore_glCreateBuffers jmp r11 -bluegl_glGetMinmaxEXT endp +bluegl_glCreateBuffers endp -extrn __blue_glCore_glFlushStaticDataIBM: qword -bluegl_glFlushStaticDataIBM proc - mov r11, __blue_glCore_glFlushStaticDataIBM +extrn __blue_glCore_glNamedBufferStorage: qword +bluegl_glNamedBufferStorage proc + mov r11, __blue_glCore_glNamedBufferStorage jmp r11 -bluegl_glFlushStaticDataIBM endp +bluegl_glNamedBufferStorage endp -extrn __blue_glCore_glShaderOp1EXT: qword -bluegl_glShaderOp1EXT proc - mov r11, __blue_glCore_glShaderOp1EXT +extrn __blue_glCore_glNamedBufferData: qword +bluegl_glNamedBufferData proc + mov r11, __blue_glCore_glNamedBufferData jmp r11 -bluegl_glShaderOp1EXT endp +bluegl_glNamedBufferData endp -extrn __blue_glCore_glIsStateNV: qword -bluegl_glIsStateNV proc - mov r11, __blue_glCore_glIsStateNV +extrn __blue_glCore_glNamedBufferSubData: qword +bluegl_glNamedBufferSubData proc + mov r11, __blue_glCore_glNamedBufferSubData jmp r11 -bluegl_glIsStateNV endp +bluegl_glNamedBufferSubData endp -extrn __blue_glCore_glGetProgramEnvParameterIuivNV: qword -bluegl_glGetProgramEnvParameterIuivNV proc - mov r11, __blue_glCore_glGetProgramEnvParameterIuivNV +extrn __blue_glCore_glCopyNamedBufferSubData: qword +bluegl_glCopyNamedBufferSubData proc + mov r11, __blue_glCore_glCopyNamedBufferSubData jmp r11 -bluegl_glGetProgramEnvParameterIuivNV endp +bluegl_glCopyNamedBufferSubData endp -extrn __blue_glCore_glGetVideoCaptureivNV: qword -bluegl_glGetVideoCaptureivNV proc - mov r11, __blue_glCore_glGetVideoCaptureivNV +extrn __blue_glCore_glClearNamedBufferData: qword +bluegl_glClearNamedBufferData proc + mov r11, __blue_glCore_glClearNamedBufferData jmp r11 -bluegl_glGetVideoCaptureivNV endp +bluegl_glClearNamedBufferData endp -extrn __blue_glCore_glPathStringNV: qword -bluegl_glPathStringNV proc - mov r11, __blue_glCore_glPathStringNV +extrn __blue_glCore_glClearNamedBufferSubData: qword +bluegl_glClearNamedBufferSubData proc + mov r11, __blue_glCore_glClearNamedBufferSubData jmp r11 -bluegl_glPathStringNV endp +bluegl_glClearNamedBufferSubData endp -extrn __blue_glCore_glListParameterfSGIX: qword -bluegl_glListParameterfSGIX proc - mov r11, __blue_glCore_glListParameterfSGIX +extrn __blue_glCore_glMapNamedBuffer: qword +bluegl_glMapNamedBuffer proc + mov r11, __blue_glCore_glMapNamedBuffer jmp r11 -bluegl_glListParameterfSGIX endp +bluegl_glMapNamedBuffer endp -extrn __blue_glCore_glFeedbackBufferxOES: qword -bluegl_glFeedbackBufferxOES proc - mov r11, __blue_glCore_glFeedbackBufferxOES +extrn __blue_glCore_glMapNamedBufferRange: qword +bluegl_glMapNamedBufferRange proc + mov r11, __blue_glCore_glMapNamedBufferRange jmp r11 -bluegl_glFeedbackBufferxOES endp +bluegl_glMapNamedBufferRange endp -extrn __blue_glCore_glGetNextPerfQueryIdINTEL: qword -bluegl_glGetNextPerfQueryIdINTEL proc - mov r11, __blue_glCore_glGetNextPerfQueryIdINTEL +extrn __blue_glCore_glUnmapNamedBuffer: qword +bluegl_glUnmapNamedBuffer proc + mov r11, __blue_glCore_glUnmapNamedBuffer jmp r11 -bluegl_glGetNextPerfQueryIdINTEL endp +bluegl_glUnmapNamedBuffer endp -extrn __blue_glCore_glGetVariantArrayObjectfvATI: qword -bluegl_glGetVariantArrayObjectfvATI proc - mov r11, __blue_glCore_glGetVariantArrayObjectfvATI +extrn __blue_glCore_glFlushMappedNamedBufferRange: qword +bluegl_glFlushMappedNamedBufferRange proc + mov r11, __blue_glCore_glFlushMappedNamedBufferRange jmp r11 -bluegl_glGetVariantArrayObjectfvATI endp +bluegl_glFlushMappedNamedBufferRange endp -extrn __blue_glCore_glUniform3d: qword -bluegl_glUniform3d proc - mov r11, __blue_glCore_glUniform3d +extrn __blue_glCore_glGetNamedBufferParameteriv: qword +bluegl_glGetNamedBufferParameteriv proc + mov r11, __blue_glCore_glGetNamedBufferParameteriv jmp r11 -bluegl_glUniform3d endp +bluegl_glGetNamedBufferParameteriv endp -extrn __blue_glCore_glMultiTexParameterfvEXT: qword -bluegl_glMultiTexParameterfvEXT proc - mov r11, __blue_glCore_glMultiTexParameterfvEXT +extrn __blue_glCore_glGetNamedBufferParameteri64v: qword +bluegl_glGetNamedBufferParameteri64v proc + mov r11, __blue_glCore_glGetNamedBufferParameteri64v jmp r11 -bluegl_glMultiTexParameterfvEXT endp +bluegl_glGetNamedBufferParameteri64v endp -extrn __blue_glCore_glGetLocalConstantFloatvEXT: qword -bluegl_glGetLocalConstantFloatvEXT proc - mov r11, __blue_glCore_glGetLocalConstantFloatvEXT +extrn __blue_glCore_glGetNamedBufferPointerv: qword +bluegl_glGetNamedBufferPointerv proc + mov r11, __blue_glCore_glGetNamedBufferPointerv jmp r11 -bluegl_glGetLocalConstantFloatvEXT endp +bluegl_glGetNamedBufferPointerv endp -extrn __blue_glCore_glMultiTexImage3DEXT: qword -bluegl_glMultiTexImage3DEXT proc - mov r11, __blue_glCore_glMultiTexImage3DEXT +extrn __blue_glCore_glGetNamedBufferSubData: qword +bluegl_glGetNamedBufferSubData proc + mov r11, __blue_glCore_glGetNamedBufferSubData jmp r11 -bluegl_glMultiTexImage3DEXT endp +bluegl_glGetNamedBufferSubData endp -extrn __blue_glCore_glWindowPos3fMESA: qword -bluegl_glWindowPos3fMESA proc - mov r11, __blue_glCore_glWindowPos3fMESA +extrn __blue_glCore_glCreateFramebuffers: qword +bluegl_glCreateFramebuffers proc + mov r11, __blue_glCore_glCreateFramebuffers jmp r11 -bluegl_glWindowPos3fMESA endp +bluegl_glCreateFramebuffers endp -extrn __blue_glCore_glCullParameterdvEXT: qword -bluegl_glCullParameterdvEXT proc - mov r11, __blue_glCore_glCullParameterdvEXT +extrn __blue_glCore_glNamedFramebufferRenderbuffer: qword +bluegl_glNamedFramebufferRenderbuffer proc + mov r11, __blue_glCore_glNamedFramebufferRenderbuffer jmp r11 -bluegl_glCullParameterdvEXT endp +bluegl_glNamedFramebufferRenderbuffer endp -extrn __blue_glCore_glGetTrackMatrixivNV: qword -bluegl_glGetTrackMatrixivNV proc - mov r11, __blue_glCore_glGetTrackMatrixivNV +extrn __blue_glCore_glNamedFramebufferParameteri: qword +bluegl_glNamedFramebufferParameteri proc + mov r11, __blue_glCore_glNamedFramebufferParameteri jmp r11 -bluegl_glGetTrackMatrixivNV endp +bluegl_glNamedFramebufferParameteri endp -extrn __blue_glCore_glBlendFuncSeparateINGR: qword -bluegl_glBlendFuncSeparateINGR proc - mov r11, __blue_glCore_glBlendFuncSeparateINGR +extrn __blue_glCore_glNamedFramebufferTexture: qword +bluegl_glNamedFramebufferTexture proc + mov r11, __blue_glCore_glNamedFramebufferTexture jmp r11 -bluegl_glBlendFuncSeparateINGR endp +bluegl_glNamedFramebufferTexture endp -extrn __blue_glCore_glUniformMatrix2fvARB: qword -bluegl_glUniformMatrix2fvARB proc - mov r11, __blue_glCore_glUniformMatrix2fvARB +extrn __blue_glCore_glNamedFramebufferTextureLayer: qword +bluegl_glNamedFramebufferTextureLayer proc + mov r11, __blue_glCore_glNamedFramebufferTextureLayer jmp r11 -bluegl_glUniformMatrix2fvARB endp +bluegl_glNamedFramebufferTextureLayer endp -extrn __blue_glCore_glDrawArraysInstancedEXT: qword -bluegl_glDrawArraysInstancedEXT proc - mov r11, __blue_glCore_glDrawArraysInstancedEXT +extrn __blue_glCore_glNamedFramebufferDrawBuffer: qword +bluegl_glNamedFramebufferDrawBuffer proc + mov r11, __blue_glCore_glNamedFramebufferDrawBuffer jmp r11 -bluegl_glDrawArraysInstancedEXT endp +bluegl_glNamedFramebufferDrawBuffer endp -extrn __blue_glCore_glMultiTexCoord3iARB: qword -bluegl_glMultiTexCoord3iARB proc - mov r11, __blue_glCore_glMultiTexCoord3iARB +extrn __blue_glCore_glNamedFramebufferDrawBuffers: qword +bluegl_glNamedFramebufferDrawBuffers proc + mov r11, __blue_glCore_glNamedFramebufferDrawBuffers jmp r11 -bluegl_glMultiTexCoord3iARB endp +bluegl_glNamedFramebufferDrawBuffers endp -extrn __blue_glCore_glGetNamedFramebufferParameterivEXT: qword -bluegl_glGetNamedFramebufferParameterivEXT proc - mov r11, __blue_glCore_glGetNamedFramebufferParameterivEXT +extrn __blue_glCore_glNamedFramebufferReadBuffer: qword +bluegl_glNamedFramebufferReadBuffer proc + mov r11, __blue_glCore_glNamedFramebufferReadBuffer jmp r11 -bluegl_glGetNamedFramebufferParameterivEXT endp +bluegl_glNamedFramebufferReadBuffer endp -extrn __blue_glCore_glGenTextures: qword -bluegl_glGenTextures proc - mov r11, __blue_glCore_glGenTextures +extrn __blue_glCore_glInvalidateNamedFramebufferData: qword +bluegl_glInvalidateNamedFramebufferData proc + mov r11, __blue_glCore_glInvalidateNamedFramebufferData jmp r11 -bluegl_glGenTextures endp +bluegl_glInvalidateNamedFramebufferData endp -extrn __blue_glCore_glIsPointInStrokePathNV: qword -bluegl_glIsPointInStrokePathNV proc - mov r11, __blue_glCore_glIsPointInStrokePathNV +extrn __blue_glCore_glInvalidateNamedFramebufferSubData: qword +bluegl_glInvalidateNamedFramebufferSubData proc + mov r11, __blue_glCore_glInvalidateNamedFramebufferSubData jmp r11 -bluegl_glIsPointInStrokePathNV endp +bluegl_glInvalidateNamedFramebufferSubData endp -extrn __blue_glCore_glDrawTransformFeedbackNV: qword -bluegl_glDrawTransformFeedbackNV proc - mov r11, __blue_glCore_glDrawTransformFeedbackNV +extrn __blue_glCore_glClearNamedFramebufferiv: qword +bluegl_glClearNamedFramebufferiv proc + mov r11, __blue_glCore_glClearNamedFramebufferiv jmp r11 -bluegl_glDrawTransformFeedbackNV endp +bluegl_glClearNamedFramebufferiv endp -extrn __blue_glCore_glGetActiveUniformARB: qword -bluegl_glGetActiveUniformARB proc - mov r11, __blue_glCore_glGetActiveUniformARB +extrn __blue_glCore_glClearNamedFramebufferuiv: qword +bluegl_glClearNamedFramebufferuiv proc + mov r11, __blue_glCore_glClearNamedFramebufferuiv jmp r11 -bluegl_glGetActiveUniformARB endp +bluegl_glClearNamedFramebufferuiv endp extrn __blue_glCore_glClearNamedFramebufferfv: qword bluegl_glClearNamedFramebufferfv proc @@ -3549,77 +3487,71 @@ bluegl_glClearNamedFramebufferfv proc jmp r11 bluegl_glClearNamedFramebufferfv endp -extrn __blue_glCore_glBeginVideoCaptureNV: qword -bluegl_glBeginVideoCaptureNV proc - mov r11, __blue_glCore_glBeginVideoCaptureNV - jmp r11 -bluegl_glBeginVideoCaptureNV endp - -extrn __blue_glCore_glCopyTexImage1D: qword -bluegl_glCopyTexImage1D proc - mov r11, __blue_glCore_glCopyTexImage1D +extrn __blue_glCore_glClearNamedFramebufferfi: qword +bluegl_glClearNamedFramebufferfi proc + mov r11, __blue_glCore_glClearNamedFramebufferfi jmp r11 -bluegl_glCopyTexImage1D endp +bluegl_glClearNamedFramebufferfi endp -extrn __blue_glCore_glTexStorage1D: qword -bluegl_glTexStorage1D proc - mov r11, __blue_glCore_glTexStorage1D +extrn __blue_glCore_glBlitNamedFramebuffer: qword +bluegl_glBlitNamedFramebuffer proc + mov r11, __blue_glCore_glBlitNamedFramebuffer jmp r11 -bluegl_glTexStorage1D endp +bluegl_glBlitNamedFramebuffer endp -extrn __blue_glCore_glProgramUniform3ui64ARB: qword -bluegl_glProgramUniform3ui64ARB proc - mov r11, __blue_glCore_glProgramUniform3ui64ARB +extrn __blue_glCore_glCheckNamedFramebufferStatus: qword +bluegl_glCheckNamedFramebufferStatus proc + mov r11, __blue_glCore_glCheckNamedFramebufferStatus jmp r11 -bluegl_glProgramUniform3ui64ARB endp +bluegl_glCheckNamedFramebufferStatus endp -extrn __blue_glCore_glTextureSubImage2D: qword -bluegl_glTextureSubImage2D proc - mov r11, __blue_glCore_glTextureSubImage2D +extrn __blue_glCore_glGetNamedFramebufferParameteriv: qword +bluegl_glGetNamedFramebufferParameteriv proc + mov r11, __blue_glCore_glGetNamedFramebufferParameteriv jmp r11 -bluegl_glTextureSubImage2D endp +bluegl_glGetNamedFramebufferParameteriv endp -extrn __blue_glCore_glMultiTexCoord4bOES: qword -bluegl_glMultiTexCoord4bOES proc - mov r11, __blue_glCore_glMultiTexCoord4bOES +extrn __blue_glCore_glGetNamedFramebufferAttachmentParameteriv: qword +bluegl_glGetNamedFramebufferAttachmentParameteriv proc + mov r11, __blue_glCore_glGetNamedFramebufferAttachmentParameteriv jmp r11 -bluegl_glMultiTexCoord4bOES endp +bluegl_glGetNamedFramebufferAttachmentParameteriv endp -extrn __blue_glCore_glMultiDrawArraysIndirectCountARB: qword -bluegl_glMultiDrawArraysIndirectCountARB proc - mov r11, __blue_glCore_glMultiDrawArraysIndirectCountARB +extrn __blue_glCore_glCreateRenderbuffers: qword +bluegl_glCreateRenderbuffers proc + mov r11, __blue_glCore_glCreateRenderbuffers jmp r11 -bluegl_glMultiDrawArraysIndirectCountARB endp +bluegl_glCreateRenderbuffers endp -extrn __blue_glCore_glProgramUniformMatrix3dvEXT: qword -bluegl_glProgramUniformMatrix3dvEXT proc - mov r11, __blue_glCore_glProgramUniformMatrix3dvEXT +extrn __blue_glCore_glNamedRenderbufferStorage: qword +bluegl_glNamedRenderbufferStorage proc + mov r11, __blue_glCore_glNamedRenderbufferStorage jmp r11 -bluegl_glProgramUniformMatrix3dvEXT endp +bluegl_glNamedRenderbufferStorage endp -extrn __blue_glCore_glVertexAttrib2s: qword -bluegl_glVertexAttrib2s proc - mov r11, __blue_glCore_glVertexAttrib2s +extrn __blue_glCore_glNamedRenderbufferStorageMultisample: qword +bluegl_glNamedRenderbufferStorageMultisample proc + mov r11, __blue_glCore_glNamedRenderbufferStorageMultisample jmp r11 -bluegl_glVertexAttrib2s endp +bluegl_glNamedRenderbufferStorageMultisample endp -extrn __blue_glCore_glGetDoublev: qword -bluegl_glGetDoublev proc - mov r11, __blue_glCore_glGetDoublev +extrn __blue_glCore_glGetNamedRenderbufferParameteriv: qword +bluegl_glGetNamedRenderbufferParameteriv proc + mov r11, __blue_glCore_glGetNamedRenderbufferParameteriv jmp r11 -bluegl_glGetDoublev endp +bluegl_glGetNamedRenderbufferParameteriv endp -extrn __blue_glCore_glVertexAttrib3svARB: qword -bluegl_glVertexAttrib3svARB proc - mov r11, __blue_glCore_glVertexAttrib3svARB +extrn __blue_glCore_glCreateTextures: qword +bluegl_glCreateTextures proc + mov r11, __blue_glCore_glCreateTextures jmp r11 -bluegl_glVertexAttrib3svARB endp +bluegl_glCreateTextures endp -extrn __blue_glCore_glProgramNamedParameter4dvNV: qword -bluegl_glProgramNamedParameter4dvNV proc - mov r11, __blue_glCore_glProgramNamedParameter4dvNV +extrn __blue_glCore_glTextureBuffer: qword +bluegl_glTextureBuffer proc + mov r11, __blue_glCore_glTextureBuffer jmp r11 -bluegl_glProgramNamedParameter4dvNV endp +bluegl_glTextureBuffer endp extrn __blue_glCore_glTextureBufferRange: qword bluegl_glTextureBufferRange proc @@ -3627,3659 +3559,3677 @@ bluegl_glTextureBufferRange proc jmp r11 bluegl_glTextureBufferRange endp -extrn __blue_glCore_glFramebufferTextureFaceEXT: qword -bluegl_glFramebufferTextureFaceEXT proc - mov r11, __blue_glCore_glFramebufferTextureFaceEXT +extrn __blue_glCore_glTextureStorage1D: qword +bluegl_glTextureStorage1D proc + mov r11, __blue_glCore_glTextureStorage1D jmp r11 -bluegl_glFramebufferTextureFaceEXT endp +bluegl_glTextureStorage1D endp -extrn __blue_glCore_glBindBufferRange: qword -bluegl_glBindBufferRange proc - mov r11, __blue_glCore_glBindBufferRange +extrn __blue_glCore_glTextureStorage2D: qword +bluegl_glTextureStorage2D proc + mov r11, __blue_glCore_glTextureStorage2D jmp r11 -bluegl_glBindBufferRange endp +bluegl_glTextureStorage2D endp -extrn __blue_glCore_glEnablei: qword -bluegl_glEnablei proc - mov r11, __blue_glCore_glEnablei +extrn __blue_glCore_glTextureStorage3D: qword +bluegl_glTextureStorage3D proc + mov r11, __blue_glCore_glTextureStorage3D jmp r11 -bluegl_glEnablei endp +bluegl_glTextureStorage3D endp -extrn __blue_glCore_glGetTextureParameterIuivEXT: qword -bluegl_glGetTextureParameterIuivEXT proc - mov r11, __blue_glCore_glGetTextureParameterIuivEXT +extrn __blue_glCore_glTextureStorage2DMultisample: qword +bluegl_glTextureStorage2DMultisample proc + mov r11, __blue_glCore_glTextureStorage2DMultisample jmp r11 -bluegl_glGetTextureParameterIuivEXT endp +bluegl_glTextureStorage2DMultisample endp -extrn __blue_glCore_glGetProgramInterfaceiv: qword -bluegl_glGetProgramInterfaceiv proc - mov r11, __blue_glCore_glGetProgramInterfaceiv +extrn __blue_glCore_glTextureStorage3DMultisample: qword +bluegl_glTextureStorage3DMultisample proc + mov r11, __blue_glCore_glTextureStorage3DMultisample jmp r11 -bluegl_glGetProgramInterfaceiv endp +bluegl_glTextureStorage3DMultisample endp -extrn __blue_glCore_glClientAttribDefaultEXT: qword -bluegl_glClientAttribDefaultEXT proc - mov r11, __blue_glCore_glClientAttribDefaultEXT +extrn __blue_glCore_glTextureSubImage1D: qword +bluegl_glTextureSubImage1D proc + mov r11, __blue_glCore_glTextureSubImage1D jmp r11 -bluegl_glClientAttribDefaultEXT endp +bluegl_glTextureSubImage1D endp -extrn __blue_glCore_glVertexAttribL3ui64NV: qword -bluegl_glVertexAttribL3ui64NV proc - mov r11, __blue_glCore_glVertexAttribL3ui64NV +extrn __blue_glCore_glTextureSubImage2D: qword +bluegl_glTextureSubImage2D proc + mov r11, __blue_glCore_glTextureSubImage2D jmp r11 -bluegl_glVertexAttribL3ui64NV endp +bluegl_glTextureSubImage2D endp -extrn __blue_glCore_glWindowPos2dARB: qword -bluegl_glWindowPos2dARB proc - mov r11, __blue_glCore_glWindowPos2dARB +extrn __blue_glCore_glTextureSubImage3D: qword +bluegl_glTextureSubImage3D proc + mov r11, __blue_glCore_glTextureSubImage3D jmp r11 -bluegl_glWindowPos2dARB endp +bluegl_glTextureSubImage3D endp -extrn __blue_glCore_glVertexAttribI2uiEXT: qword -bluegl_glVertexAttribI2uiEXT proc - mov r11, __blue_glCore_glVertexAttribI2uiEXT +extrn __blue_glCore_glCompressedTextureSubImage1D: qword +bluegl_glCompressedTextureSubImage1D proc + mov r11, __blue_glCore_glCompressedTextureSubImage1D jmp r11 -bluegl_glVertexAttribI2uiEXT endp +bluegl_glCompressedTextureSubImage1D endp -extrn __blue_glCore_glBindVertexBuffers: qword -bluegl_glBindVertexBuffers proc - mov r11, __blue_glCore_glBindVertexBuffers +extrn __blue_glCore_glCompressedTextureSubImage2D: qword +bluegl_glCompressedTextureSubImage2D proc + mov r11, __blue_glCore_glCompressedTextureSubImage2D jmp r11 -bluegl_glBindVertexBuffers endp +bluegl_glCompressedTextureSubImage2D endp -extrn __blue_glCore_glProgramUniformMatrix3x4fv: qword -bluegl_glProgramUniformMatrix3x4fv proc - mov r11, __blue_glCore_glProgramUniformMatrix3x4fv +extrn __blue_glCore_glCompressedTextureSubImage3D: qword +bluegl_glCompressedTextureSubImage3D proc + mov r11, __blue_glCore_glCompressedTextureSubImage3D jmp r11 -bluegl_glProgramUniformMatrix3x4fv endp +bluegl_glCompressedTextureSubImage3D endp -extrn __blue_glCore_glGetTexLevelParameterxvOES: qword -bluegl_glGetTexLevelParameterxvOES proc - mov r11, __blue_glCore_glGetTexLevelParameterxvOES +extrn __blue_glCore_glCopyTextureSubImage1D: qword +bluegl_glCopyTextureSubImage1D proc + mov r11, __blue_glCore_glCopyTextureSubImage1D jmp r11 -bluegl_glGetTexLevelParameterxvOES endp +bluegl_glCopyTextureSubImage1D endp -extrn __blue_glCore_glVertexAttribPointer: qword -bluegl_glVertexAttribPointer proc - mov r11, __blue_glCore_glVertexAttribPointer +extrn __blue_glCore_glCopyTextureSubImage2D: qword +bluegl_glCopyTextureSubImage2D proc + mov r11, __blue_glCore_glCopyTextureSubImage2D jmp r11 -bluegl_glVertexAttribPointer endp +bluegl_glCopyTextureSubImage2D endp -extrn __blue_glCore_glTextureImage1DEXT: qword -bluegl_glTextureImage1DEXT proc - mov r11, __blue_glCore_glTextureImage1DEXT +extrn __blue_glCore_glCopyTextureSubImage3D: qword +bluegl_glCopyTextureSubImage3D proc + mov r11, __blue_glCore_glCopyTextureSubImage3D jmp r11 -bluegl_glTextureImage1DEXT endp +bluegl_glCopyTextureSubImage3D endp -extrn __blue_glCore_glVertexAttribs4dvNV: qword -bluegl_glVertexAttribs4dvNV proc - mov r11, __blue_glCore_glVertexAttribs4dvNV +extrn __blue_glCore_glTextureParameterf: qword +bluegl_glTextureParameterf proc + mov r11, __blue_glCore_glTextureParameterf jmp r11 -bluegl_glVertexAttribs4dvNV endp +bluegl_glTextureParameterf endp -extrn __blue_glCore_glSecondaryColor3svEXT: qword -bluegl_glSecondaryColor3svEXT proc - mov r11, __blue_glCore_glSecondaryColor3svEXT +extrn __blue_glCore_glTextureParameterfv: qword +bluegl_glTextureParameterfv proc + mov r11, __blue_glCore_glTextureParameterfv jmp r11 -bluegl_glSecondaryColor3svEXT endp +bluegl_glTextureParameterfv endp -extrn __blue_glCore_glGetQueryivARB: qword -bluegl_glGetQueryivARB proc - mov r11, __blue_glCore_glGetQueryivARB +extrn __blue_glCore_glTextureParameteri: qword +bluegl_glTextureParameteri proc + mov r11, __blue_glCore_glTextureParameteri jmp r11 -bluegl_glGetQueryivARB endp +bluegl_glTextureParameteri endp -extrn __blue_glCore_glTexCoord4bOES: qword -bluegl_glTexCoord4bOES proc - mov r11, __blue_glCore_glTexCoord4bOES +extrn __blue_glCore_glTextureParameterIiv: qword +bluegl_glTextureParameterIiv proc + mov r11, __blue_glCore_glTextureParameterIiv jmp r11 -bluegl_glTexCoord4bOES endp +bluegl_glTextureParameterIiv endp -extrn __blue_glCore_glProgramUniform1fEXT: qword -bluegl_glProgramUniform1fEXT proc - mov r11, __blue_glCore_glProgramUniform1fEXT +extrn __blue_glCore_glTextureParameterIuiv: qword +bluegl_glTextureParameterIuiv proc + mov r11, __blue_glCore_glTextureParameterIuiv jmp r11 -bluegl_glProgramUniform1fEXT endp +bluegl_glTextureParameterIuiv endp -extrn __blue_glCore_glVertexP2ui: qword -bluegl_glVertexP2ui proc - mov r11, __blue_glCore_glVertexP2ui +extrn __blue_glCore_glTextureParameteriv: qword +bluegl_glTextureParameteriv proc + mov r11, __blue_glCore_glTextureParameteriv jmp r11 -bluegl_glVertexP2ui endp +bluegl_glTextureParameteriv endp -extrn __blue_glCore_glSetInvariantEXT: qword -bluegl_glSetInvariantEXT proc - mov r11, __blue_glCore_glSetInvariantEXT +extrn __blue_glCore_glGenerateTextureMipmap: qword +bluegl_glGenerateTextureMipmap proc + mov r11, __blue_glCore_glGenerateTextureMipmap jmp r11 -bluegl_glSetInvariantEXT endp +bluegl_glGenerateTextureMipmap endp -extrn __blue_glCore_glActiveShaderProgram: qword -bluegl_glActiveShaderProgram proc - mov r11, __blue_glCore_glActiveShaderProgram +extrn __blue_glCore_glBindTextureUnit: qword +bluegl_glBindTextureUnit proc + mov r11, __blue_glCore_glBindTextureUnit jmp r11 -bluegl_glActiveShaderProgram endp +bluegl_glBindTextureUnit endp -extrn __blue_glCore_glVertexAttribL1ui64NV: qword -bluegl_glVertexAttribL1ui64NV proc - mov r11, __blue_glCore_glVertexAttribL1ui64NV +extrn __blue_glCore_glGetTextureImage: qword +bluegl_glGetTextureImage proc + mov r11, __blue_glCore_glGetTextureImage jmp r11 -bluegl_glVertexAttribL1ui64NV endp +bluegl_glGetTextureImage endp -extrn __blue_glCore_glGetVariantBooleanvEXT: qword -bluegl_glGetVariantBooleanvEXT proc - mov r11, __blue_glCore_glGetVariantBooleanvEXT +extrn __blue_glCore_glGetCompressedTextureImage: qword +bluegl_glGetCompressedTextureImage proc + mov r11, __blue_glCore_glGetCompressedTextureImage + jmp r11 +bluegl_glGetCompressedTextureImage endp + +extrn __blue_glCore_glGetTextureLevelParameterfv: qword +bluegl_glGetTextureLevelParameterfv proc + mov r11, __blue_glCore_glGetTextureLevelParameterfv + jmp r11 +bluegl_glGetTextureLevelParameterfv endp + +extrn __blue_glCore_glGetTextureLevelParameteriv: qword +bluegl_glGetTextureLevelParameteriv proc + mov r11, __blue_glCore_glGetTextureLevelParameteriv + jmp r11 +bluegl_glGetTextureLevelParameteriv endp + +extrn __blue_glCore_glGetTextureParameterfv: qword +bluegl_glGetTextureParameterfv proc + mov r11, __blue_glCore_glGetTextureParameterfv jmp r11 -bluegl_glGetVariantBooleanvEXT endp +bluegl_glGetTextureParameterfv endp -extrn __blue_glCore_glAreTexturesResidentEXT: qword -bluegl_glAreTexturesResidentEXT proc - mov r11, __blue_glCore_glAreTexturesResidentEXT +extrn __blue_glCore_glGetTextureParameterIiv: qword +bluegl_glGetTextureParameterIiv proc + mov r11, __blue_glCore_glGetTextureParameterIiv jmp r11 -bluegl_glAreTexturesResidentEXT endp +bluegl_glGetTextureParameterIiv endp -extrn __blue_glCore_glMatrixMultTranspose3x3fNV: qword -bluegl_glMatrixMultTranspose3x3fNV proc - mov r11, __blue_glCore_glMatrixMultTranspose3x3fNV +extrn __blue_glCore_glGetTextureParameterIuiv: qword +bluegl_glGetTextureParameterIuiv proc + mov r11, __blue_glCore_glGetTextureParameterIuiv jmp r11 -bluegl_glMatrixMultTranspose3x3fNV endp +bluegl_glGetTextureParameterIuiv endp -extrn __blue_glCore_glProgramUniform2f: qword -bluegl_glProgramUniform2f proc - mov r11, __blue_glCore_glProgramUniform2f +extrn __blue_glCore_glGetTextureParameteriv: qword +bluegl_glGetTextureParameteriv proc + mov r11, __blue_glCore_glGetTextureParameteriv jmp r11 -bluegl_glProgramUniform2f endp +bluegl_glGetTextureParameteriv endp -extrn __blue_glCore_glClearNamedBufferDataEXT: qword -bluegl_glClearNamedBufferDataEXT proc - mov r11, __blue_glCore_glClearNamedBufferDataEXT +extrn __blue_glCore_glCreateVertexArrays: qword +bluegl_glCreateVertexArrays proc + mov r11, __blue_glCore_glCreateVertexArrays jmp r11 -bluegl_glClearNamedBufferDataEXT endp +bluegl_glCreateVertexArrays endp -extrn __blue_glCore_glIsOcclusionQueryNV: qword -bluegl_glIsOcclusionQueryNV proc - mov r11, __blue_glCore_glIsOcclusionQueryNV +extrn __blue_glCore_glDisableVertexArrayAttrib: qword +bluegl_glDisableVertexArrayAttrib proc + mov r11, __blue_glCore_glDisableVertexArrayAttrib jmp r11 -bluegl_glIsOcclusionQueryNV endp +bluegl_glDisableVertexArrayAttrib endp -extrn __blue_glCore_glVertexAttribI4bv: qword -bluegl_glVertexAttribI4bv proc - mov r11, __blue_glCore_glVertexAttribI4bv +extrn __blue_glCore_glEnableVertexArrayAttrib: qword +bluegl_glEnableVertexArrayAttrib proc + mov r11, __blue_glCore_glEnableVertexArrayAttrib jmp r11 -bluegl_glVertexAttribI4bv endp +bluegl_glEnableVertexArrayAttrib endp -extrn __blue_glCore_glTexCoord2xvOES: qword -bluegl_glTexCoord2xvOES proc - mov r11, __blue_glCore_glTexCoord2xvOES +extrn __blue_glCore_glVertexArrayElementBuffer: qword +bluegl_glVertexArrayElementBuffer proc + mov r11, __blue_glCore_glVertexArrayElementBuffer jmp r11 -bluegl_glTexCoord2xvOES endp +bluegl_glVertexArrayElementBuffer endp -extrn __blue_glCore_glVertexAttrib4Nubv: qword -bluegl_glVertexAttrib4Nubv proc - mov r11, __blue_glCore_glVertexAttrib4Nubv +extrn __blue_glCore_glVertexArrayVertexBuffer: qword +bluegl_glVertexArrayVertexBuffer proc + mov r11, __blue_glCore_glVertexArrayVertexBuffer jmp r11 -bluegl_glVertexAttrib4Nubv endp +bluegl_glVertexArrayVertexBuffer endp -extrn __blue_glCore_glVertexAttrib3hNV: qword -bluegl_glVertexAttrib3hNV proc - mov r11, __blue_glCore_glVertexAttrib3hNV +extrn __blue_glCore_glVertexArrayVertexBuffers: qword +bluegl_glVertexArrayVertexBuffers proc + mov r11, __blue_glCore_glVertexArrayVertexBuffers jmp r11 -bluegl_glVertexAttrib3hNV endp +bluegl_glVertexArrayVertexBuffers endp -extrn __blue_glCore_glMultiTexCoord2xvOES: qword -bluegl_glMultiTexCoord2xvOES proc - mov r11, __blue_glCore_glMultiTexCoord2xvOES +extrn __blue_glCore_glVertexArrayAttribBinding: qword +bluegl_glVertexArrayAttribBinding proc + mov r11, __blue_glCore_glVertexArrayAttribBinding jmp r11 -bluegl_glMultiTexCoord2xvOES endp +bluegl_glVertexArrayAttribBinding endp -extrn __blue_glCore_glFramebufferTextureEXT: qword -bluegl_glFramebufferTextureEXT proc - mov r11, __blue_glCore_glFramebufferTextureEXT +extrn __blue_glCore_glVertexArrayAttribFormat: qword +bluegl_glVertexArrayAttribFormat proc + mov r11, __blue_glCore_glVertexArrayAttribFormat jmp r11 -bluegl_glFramebufferTextureEXT endp +bluegl_glVertexArrayAttribFormat endp -extrn __blue_glCore_glProgramUniformMatrix3fv: qword -bluegl_glProgramUniformMatrix3fv proc - mov r11, __blue_glCore_glProgramUniformMatrix3fv +extrn __blue_glCore_glVertexArrayAttribIFormat: qword +bluegl_glVertexArrayAttribIFormat proc + mov r11, __blue_glCore_glVertexArrayAttribIFormat jmp r11 -bluegl_glProgramUniformMatrix3fv endp +bluegl_glVertexArrayAttribIFormat endp -extrn __blue_glCore_glGetInternalformatSampleivNV: qword -bluegl_glGetInternalformatSampleivNV proc - mov r11, __blue_glCore_glGetInternalformatSampleivNV +extrn __blue_glCore_glVertexArrayAttribLFormat: qword +bluegl_glVertexArrayAttribLFormat proc + mov r11, __blue_glCore_glVertexArrayAttribLFormat jmp r11 -bluegl_glGetInternalformatSampleivNV endp +bluegl_glVertexArrayAttribLFormat endp -extrn __blue_glCore_glPathSubCommandsNV: qword -bluegl_glPathSubCommandsNV proc - mov r11, __blue_glCore_glPathSubCommandsNV +extrn __blue_glCore_glVertexArrayBindingDivisor: qword +bluegl_glVertexArrayBindingDivisor proc + mov r11, __blue_glCore_glVertexArrayBindingDivisor jmp r11 -bluegl_glPathSubCommandsNV endp +bluegl_glVertexArrayBindingDivisor endp -extrn __blue_glCore_glStencilStrokePathNV: qword -bluegl_glStencilStrokePathNV proc - mov r11, __blue_glCore_glStencilStrokePathNV +extrn __blue_glCore_glGetVertexArrayiv: qword +bluegl_glGetVertexArrayiv proc + mov r11, __blue_glCore_glGetVertexArrayiv jmp r11 -bluegl_glStencilStrokePathNV endp +bluegl_glGetVertexArrayiv endp -extrn __blue_glCore_glPathParameterfNV: qword -bluegl_glPathParameterfNV proc - mov r11, __blue_glCore_glPathParameterfNV +extrn __blue_glCore_glGetVertexArrayIndexediv: qword +bluegl_glGetVertexArrayIndexediv proc + mov r11, __blue_glCore_glGetVertexArrayIndexediv jmp r11 -bluegl_glPathParameterfNV endp +bluegl_glGetVertexArrayIndexediv endp -extrn __blue_glCore_glActiveProgramEXT: qword -bluegl_glActiveProgramEXT proc - mov r11, __blue_glCore_glActiveProgramEXT +extrn __blue_glCore_glGetVertexArrayIndexed64iv: qword +bluegl_glGetVertexArrayIndexed64iv proc + mov r11, __blue_glCore_glGetVertexArrayIndexed64iv jmp r11 -bluegl_glActiveProgramEXT endp +bluegl_glGetVertexArrayIndexed64iv endp -extrn __blue_glCore_glClampColorARB: qword -bluegl_glClampColorARB proc - mov r11, __blue_glCore_glClampColorARB +extrn __blue_glCore_glCreateSamplers: qword +bluegl_glCreateSamplers proc + mov r11, __blue_glCore_glCreateSamplers jmp r11 -bluegl_glClampColorARB endp +bluegl_glCreateSamplers endp -extrn __blue_glCore_glVertexAttribI2uivEXT: qword -bluegl_glVertexAttribI2uivEXT proc - mov r11, __blue_glCore_glVertexAttribI2uivEXT +extrn __blue_glCore_glCreateProgramPipelines: qword +bluegl_glCreateProgramPipelines proc + mov r11, __blue_glCore_glCreateProgramPipelines jmp r11 -bluegl_glVertexAttribI2uivEXT endp +bluegl_glCreateProgramPipelines endp -extrn __blue_glCore_glVertexAttribL1ui64vARB: qword -bluegl_glVertexAttribL1ui64vARB proc - mov r11, __blue_glCore_glVertexAttribL1ui64vARB +extrn __blue_glCore_glCreateQueries: qword +bluegl_glCreateQueries proc + mov r11, __blue_glCore_glCreateQueries jmp r11 -bluegl_glVertexAttribL1ui64vARB endp +bluegl_glCreateQueries endp -extrn __blue_glCore_glValidateProgram: qword -bluegl_glValidateProgram proc - mov r11, __blue_glCore_glValidateProgram +extrn __blue_glCore_glGetQueryBufferObjecti64v: qword +bluegl_glGetQueryBufferObjecti64v proc + mov r11, __blue_glCore_glGetQueryBufferObjecti64v jmp r11 -bluegl_glValidateProgram endp +bluegl_glGetQueryBufferObjecti64v endp -extrn __blue_glCore_glMultiTexCoord2xOES: qword -bluegl_glMultiTexCoord2xOES proc - mov r11, __blue_glCore_glMultiTexCoord2xOES +extrn __blue_glCore_glGetQueryBufferObjectiv: qword +bluegl_glGetQueryBufferObjectiv proc + mov r11, __blue_glCore_glGetQueryBufferObjectiv jmp r11 -bluegl_glMultiTexCoord2xOES endp +bluegl_glGetQueryBufferObjectiv endp -extrn __blue_glCore_glFogCoordf: qword -bluegl_glFogCoordf proc - mov r11, __blue_glCore_glFogCoordf +extrn __blue_glCore_glGetQueryBufferObjectui64v: qword +bluegl_glGetQueryBufferObjectui64v proc + mov r11, __blue_glCore_glGetQueryBufferObjectui64v jmp r11 -bluegl_glFogCoordf endp +bluegl_glGetQueryBufferObjectui64v endp -extrn __blue_glCore_glGetError: qword -bluegl_glGetError proc - mov r11, __blue_glCore_glGetError +extrn __blue_glCore_glGetQueryBufferObjectuiv: qword +bluegl_glGetQueryBufferObjectuiv proc + mov r11, __blue_glCore_glGetQueryBufferObjectuiv jmp r11 -bluegl_glGetError endp +bluegl_glGetQueryBufferObjectuiv endp -extrn __blue_glCore_glSpriteParameterfSGIX: qword -bluegl_glSpriteParameterfSGIX proc - mov r11, __blue_glCore_glSpriteParameterfSGIX +extrn __blue_glCore_glMemoryBarrierByRegion: qword +bluegl_glMemoryBarrierByRegion proc + mov r11, __blue_glCore_glMemoryBarrierByRegion jmp r11 -bluegl_glSpriteParameterfSGIX endp +bluegl_glMemoryBarrierByRegion endp -extrn __blue_glCore_glVertexAttrib3dvNV: qword -bluegl_glVertexAttrib3dvNV proc - mov r11, __blue_glCore_glVertexAttrib3dvNV +extrn __blue_glCore_glGetTextureSubImage: qword +bluegl_glGetTextureSubImage proc + mov r11, __blue_glCore_glGetTextureSubImage jmp r11 -bluegl_glVertexAttrib3dvNV endp +bluegl_glGetTextureSubImage endp -extrn __blue_glCore_glMultiTexCoord3bOES: qword -bluegl_glMultiTexCoord3bOES proc - mov r11, __blue_glCore_glMultiTexCoord3bOES +extrn __blue_glCore_glGetCompressedTextureSubImage: qword +bluegl_glGetCompressedTextureSubImage proc + mov r11, __blue_glCore_glGetCompressedTextureSubImage jmp r11 -bluegl_glMultiTexCoord3bOES endp +bluegl_glGetCompressedTextureSubImage endp -extrn __blue_glCore_glGetTexParameterIuivEXT: qword -bluegl_glGetTexParameterIuivEXT proc - mov r11, __blue_glCore_glGetTexParameterIuivEXT +extrn __blue_glCore_glGetGraphicsResetStatus: qword +bluegl_glGetGraphicsResetStatus proc + mov r11, __blue_glCore_glGetGraphicsResetStatus jmp r11 -bluegl_glGetTexParameterIuivEXT endp +bluegl_glGetGraphicsResetStatus endp -extrn __blue_glCore_glIndexMaterialEXT: qword -bluegl_glIndexMaterialEXT proc - mov r11, __blue_glCore_glIndexMaterialEXT +extrn __blue_glCore_glGetnCompressedTexImage: qword +bluegl_glGetnCompressedTexImage proc + mov r11, __blue_glCore_glGetnCompressedTexImage jmp r11 -bluegl_glIndexMaterialEXT endp +bluegl_glGetnCompressedTexImage endp -extrn __blue_glCore_glUniform1iARB: qword -bluegl_glUniform1iARB proc - mov r11, __blue_glCore_glUniform1iARB +extrn __blue_glCore_glGetnTexImage: qword +bluegl_glGetnTexImage proc + mov r11, __blue_glCore_glGetnTexImage jmp r11 -bluegl_glUniform1iARB endp +bluegl_glGetnTexImage endp -extrn __blue_glCore_glVertexAttrib4NivARB: qword -bluegl_glVertexAttrib4NivARB proc - mov r11, __blue_glCore_glVertexAttrib4NivARB +extrn __blue_glCore_glGetnUniformdv: qword +bluegl_glGetnUniformdv proc + mov r11, __blue_glCore_glGetnUniformdv jmp r11 -bluegl_glVertexAttrib4NivARB endp +bluegl_glGetnUniformdv endp -extrn __blue_glCore_glTextureParameteri: qword -bluegl_glTextureParameteri proc - mov r11, __blue_glCore_glTextureParameteri +extrn __blue_glCore_glGetnUniformfv: qword +bluegl_glGetnUniformfv proc + mov r11, __blue_glCore_glGetnUniformfv jmp r11 -bluegl_glTextureParameteri endp +bluegl_glGetnUniformfv endp -extrn __blue_glCore_glSecondaryColor3d: qword -bluegl_glSecondaryColor3d proc - mov r11, __blue_glCore_glSecondaryColor3d +extrn __blue_glCore_glGetnUniformiv: qword +bluegl_glGetnUniformiv proc + mov r11, __blue_glCore_glGetnUniformiv jmp r11 -bluegl_glSecondaryColor3d endp +bluegl_glGetnUniformiv endp -extrn __blue_glCore_glWindowPos2sv: qword -bluegl_glWindowPos2sv proc - mov r11, __blue_glCore_glWindowPos2sv +extrn __blue_glCore_glGetnUniformuiv: qword +bluegl_glGetnUniformuiv proc + mov r11, __blue_glCore_glGetnUniformuiv jmp r11 -bluegl_glWindowPos2sv endp +bluegl_glGetnUniformuiv endp -extrn __blue_glCore_glDrawBuffersARB: qword -bluegl_glDrawBuffersARB proc - mov r11, __blue_glCore_glDrawBuffersARB +extrn __blue_glCore_glReadnPixels: qword +bluegl_glReadnPixels proc + mov r11, __blue_glCore_glReadnPixels jmp r11 -bluegl_glDrawBuffersARB endp +bluegl_glReadnPixels endp -extrn __blue_glCore_glGetMultiTexParameterIuivEXT: qword -bluegl_glGetMultiTexParameterIuivEXT proc - mov r11, __blue_glCore_glGetMultiTexParameterIuivEXT +extrn __blue_glCore_glTextureBarrier: qword +bluegl_glTextureBarrier proc + mov r11, __blue_glCore_glTextureBarrier jmp r11 -bluegl_glGetMultiTexParameterIuivEXT endp +bluegl_glTextureBarrier endp -extrn __blue_glCore_glGetConvolutionFilter: qword -bluegl_glGetConvolutionFilter proc - mov r11, __blue_glCore_glGetConvolutionFilter +extrn __blue_glCore_glGetTextureHandleARB: qword +bluegl_glGetTextureHandleARB proc + mov r11, __blue_glCore_glGetTextureHandleARB jmp r11 -bluegl_glGetConvolutionFilter endp +bluegl_glGetTextureHandleARB endp -extrn __blue_glCore_glDisableVertexArrayAttrib: qword -bluegl_glDisableVertexArrayAttrib proc - mov r11, __blue_glCore_glDisableVertexArrayAttrib +extrn __blue_glCore_glGetTextureSamplerHandleARB: qword +bluegl_glGetTextureSamplerHandleARB proc + mov r11, __blue_glCore_glGetTextureSamplerHandleARB jmp r11 -bluegl_glDisableVertexArrayAttrib endp +bluegl_glGetTextureSamplerHandleARB endp -extrn __blue_glCore_glProgramUniform4i: qword -bluegl_glProgramUniform4i proc - mov r11, __blue_glCore_glProgramUniform4i +extrn __blue_glCore_glMakeTextureHandleResidentARB: qword +bluegl_glMakeTextureHandleResidentARB proc + mov r11, __blue_glCore_glMakeTextureHandleResidentARB jmp r11 -bluegl_glProgramUniform4i endp +bluegl_glMakeTextureHandleResidentARB endp -extrn __blue_glCore_glCheckNamedFramebufferStatusEXT: qword -bluegl_glCheckNamedFramebufferStatusEXT proc - mov r11, __blue_glCore_glCheckNamedFramebufferStatusEXT +extrn __blue_glCore_glMakeTextureHandleNonResidentARB: qword +bluegl_glMakeTextureHandleNonResidentARB proc + mov r11, __blue_glCore_glMakeTextureHandleNonResidentARB jmp r11 -bluegl_glCheckNamedFramebufferStatusEXT endp +bluegl_glMakeTextureHandleNonResidentARB endp -extrn __blue_glCore_glMultiTexCoord3xOES: qword -bluegl_glMultiTexCoord3xOES proc - mov r11, __blue_glCore_glMultiTexCoord3xOES +extrn __blue_glCore_glGetImageHandleARB: qword +bluegl_glGetImageHandleARB proc + mov r11, __blue_glCore_glGetImageHandleARB jmp r11 -bluegl_glMultiTexCoord3xOES endp +bluegl_glGetImageHandleARB endp -extrn __blue_glCore_glDrawElementsInstancedEXT: qword -bluegl_glDrawElementsInstancedEXT proc - mov r11, __blue_glCore_glDrawElementsInstancedEXT +extrn __blue_glCore_glMakeImageHandleResidentARB: qword +bluegl_glMakeImageHandleResidentARB proc + mov r11, __blue_glCore_glMakeImageHandleResidentARB jmp r11 -bluegl_glDrawElementsInstancedEXT endp +bluegl_glMakeImageHandleResidentARB endp -extrn __blue_glCore_glColor4fNormal3fVertex3fvSUN: qword -bluegl_glColor4fNormal3fVertex3fvSUN proc - mov r11, __blue_glCore_glColor4fNormal3fVertex3fvSUN +extrn __blue_glCore_glMakeImageHandleNonResidentARB: qword +bluegl_glMakeImageHandleNonResidentARB proc + mov r11, __blue_glCore_glMakeImageHandleNonResidentARB jmp r11 -bluegl_glColor4fNormal3fVertex3fvSUN endp +bluegl_glMakeImageHandleNonResidentARB endp -extrn __blue_glCore_glIsTransformFeedbackNV: qword -bluegl_glIsTransformFeedbackNV proc - mov r11, __blue_glCore_glIsTransformFeedbackNV +extrn __blue_glCore_glUniformHandleui64ARB: qword +bluegl_glUniformHandleui64ARB proc + mov r11, __blue_glCore_glUniformHandleui64ARB jmp r11 -bluegl_glIsTransformFeedbackNV endp +bluegl_glUniformHandleui64ARB endp -extrn __blue_glCore_glDrawTransformFeedbackStreamInstanced: qword -bluegl_glDrawTransformFeedbackStreamInstanced proc - mov r11, __blue_glCore_glDrawTransformFeedbackStreamInstanced +extrn __blue_glCore_glUniformHandleui64vARB: qword +bluegl_glUniformHandleui64vARB proc + mov r11, __blue_glCore_glUniformHandleui64vARB jmp r11 -bluegl_glDrawTransformFeedbackStreamInstanced endp +bluegl_glUniformHandleui64vARB endp -extrn __blue_glCore_glMapNamedBufferEXT: qword -bluegl_glMapNamedBufferEXT proc - mov r11, __blue_glCore_glMapNamedBufferEXT +extrn __blue_glCore_glProgramUniformHandleui64ARB: qword +bluegl_glProgramUniformHandleui64ARB proc + mov r11, __blue_glCore_glProgramUniformHandleui64ARB jmp r11 -bluegl_glMapNamedBufferEXT endp +bluegl_glProgramUniformHandleui64ARB endp -extrn __blue_glCore_glVertexArrayIndexOffsetEXT: qword -bluegl_glVertexArrayIndexOffsetEXT proc - mov r11, __blue_glCore_glVertexArrayIndexOffsetEXT +extrn __blue_glCore_glProgramUniformHandleui64vARB: qword +bluegl_glProgramUniformHandleui64vARB proc + mov r11, __blue_glCore_glProgramUniformHandleui64vARB jmp r11 -bluegl_glVertexArrayIndexOffsetEXT endp +bluegl_glProgramUniformHandleui64vARB endp -extrn __blue_glCore_glPolygonMode: qword -bluegl_glPolygonMode proc - mov r11, __blue_glCore_glPolygonMode +extrn __blue_glCore_glIsTextureHandleResidentARB: qword +bluegl_glIsTextureHandleResidentARB proc + mov r11, __blue_glCore_glIsTextureHandleResidentARB jmp r11 -bluegl_glPolygonMode endp +bluegl_glIsTextureHandleResidentARB endp -extrn __blue_glCore_glGetDetailTexFuncSGIS: qword -bluegl_glGetDetailTexFuncSGIS proc - mov r11, __blue_glCore_glGetDetailTexFuncSGIS +extrn __blue_glCore_glIsImageHandleResidentARB: qword +bluegl_glIsImageHandleResidentARB proc + mov r11, __blue_glCore_glIsImageHandleResidentARB jmp r11 -bluegl_glGetDetailTexFuncSGIS endp +bluegl_glIsImageHandleResidentARB endp -extrn __blue_glCore_glMultiTexCoord2iv: qword -bluegl_glMultiTexCoord2iv proc - mov r11, __blue_glCore_glMultiTexCoord2iv +extrn __blue_glCore_glVertexAttribL1ui64ARB: qword +bluegl_glVertexAttribL1ui64ARB proc + mov r11, __blue_glCore_glVertexAttribL1ui64ARB jmp r11 -bluegl_glMultiTexCoord2iv endp +bluegl_glVertexAttribL1ui64ARB endp -extrn __blue_glCore_glGetHistogramParameterfvEXT: qword -bluegl_glGetHistogramParameterfvEXT proc - mov r11, __blue_glCore_glGetHistogramParameterfvEXT +extrn __blue_glCore_glVertexAttribL1ui64vARB: qword +bluegl_glVertexAttribL1ui64vARB proc + mov r11, __blue_glCore_glVertexAttribL1ui64vARB jmp r11 -bluegl_glGetHistogramParameterfvEXT endp +bluegl_glVertexAttribL1ui64vARB endp -extrn __blue_glCore_glProgramUniform4fvEXT: qword -bluegl_glProgramUniform4fvEXT proc - mov r11, __blue_glCore_glProgramUniform4fvEXT +extrn __blue_glCore_glGetVertexAttribLui64vARB: qword +bluegl_glGetVertexAttribLui64vARB proc + mov r11, __blue_glCore_glGetVertexAttribLui64vARB jmp r11 -bluegl_glProgramUniform4fvEXT endp +bluegl_glGetVertexAttribLui64vARB endp -extrn __blue_glCore_glDetailTexFuncSGIS: qword -bluegl_glDetailTexFuncSGIS proc - mov r11, __blue_glCore_glDetailTexFuncSGIS +extrn __blue_glCore_glCreateSyncFromCLeventARB: qword +bluegl_glCreateSyncFromCLeventARB proc + mov r11, __blue_glCore_glCreateSyncFromCLeventARB jmp r11 -bluegl_glDetailTexFuncSGIS endp +bluegl_glCreateSyncFromCLeventARB endp -extrn __blue_glCore_glTexParameterIivEXT: qword -bluegl_glTexParameterIivEXT proc - mov r11, __blue_glCore_glTexParameterIivEXT +extrn __blue_glCore_glDispatchComputeGroupSizeARB: qword +bluegl_glDispatchComputeGroupSizeARB proc + mov r11, __blue_glCore_glDispatchComputeGroupSizeARB jmp r11 -bluegl_glTexParameterIivEXT endp +bluegl_glDispatchComputeGroupSizeARB endp -extrn __blue_glCore_glNamedFramebufferTextureLayerEXT: qword -bluegl_glNamedFramebufferTextureLayerEXT proc - mov r11, __blue_glCore_glNamedFramebufferTextureLayerEXT +extrn __blue_glCore_glDebugMessageControlARB: qword +bluegl_glDebugMessageControlARB proc + mov r11, __blue_glCore_glDebugMessageControlARB jmp r11 -bluegl_glNamedFramebufferTextureLayerEXT endp +bluegl_glDebugMessageControlARB endp -extrn __blue_glCore_glDisablei: qword -bluegl_glDisablei proc - mov r11, __blue_glCore_glDisablei +extrn __blue_glCore_glDebugMessageInsertARB: qword +bluegl_glDebugMessageInsertARB proc + mov r11, __blue_glCore_glDebugMessageInsertARB jmp r11 -bluegl_glDisablei endp +bluegl_glDebugMessageInsertARB endp -extrn __blue_glCore_glUniform4fv: qword -bluegl_glUniform4fv proc - mov r11, __blue_glCore_glUniform4fv +extrn __blue_glCore_glDebugMessageCallbackARB: qword +bluegl_glDebugMessageCallbackARB proc + mov r11, __blue_glCore_glDebugMessageCallbackARB jmp r11 -bluegl_glUniform4fv endp +bluegl_glDebugMessageCallbackARB endp -extrn __blue_glCore_glVertexAttrib1hNV: qword -bluegl_glVertexAttrib1hNV proc - mov r11, __blue_glCore_glVertexAttrib1hNV +extrn __blue_glCore_glGetDebugMessageLogARB: qword +bluegl_glGetDebugMessageLogARB proc + mov r11, __blue_glCore_glGetDebugMessageLogARB jmp r11 -bluegl_glVertexAttrib1hNV endp +bluegl_glGetDebugMessageLogARB endp -extrn __blue_glCore_glWeightsvARB: qword -bluegl_glWeightsvARB proc - mov r11, __blue_glCore_glWeightsvARB +extrn __blue_glCore_glBlendEquationiARB: qword +bluegl_glBlendEquationiARB proc + mov r11, __blue_glCore_glBlendEquationiARB jmp r11 -bluegl_glWeightsvARB endp +bluegl_glBlendEquationiARB endp -extrn __blue_glCore_glSampleMaskIndexedNV: qword -bluegl_glSampleMaskIndexedNV proc - mov r11, __blue_glCore_glSampleMaskIndexedNV +extrn __blue_glCore_glBlendEquationSeparateiARB: qword +bluegl_glBlendEquationSeparateiARB proc + mov r11, __blue_glCore_glBlendEquationSeparateiARB jmp r11 -bluegl_glSampleMaskIndexedNV endp +bluegl_glBlendEquationSeparateiARB endp -extrn __blue_glCore_glVertexAttrib4dvARB: qword -bluegl_glVertexAttrib4dvARB proc - mov r11, __blue_glCore_glVertexAttrib4dvARB +extrn __blue_glCore_glBlendFunciARB: qword +bluegl_glBlendFunciARB proc + mov r11, __blue_glCore_glBlendFunciARB jmp r11 -bluegl_glVertexAttrib4dvARB endp +bluegl_glBlendFunciARB endp -extrn __blue_glCore_glBeginFragmentShaderATI: qword -bluegl_glBeginFragmentShaderATI proc - mov r11, __blue_glCore_glBeginFragmentShaderATI +extrn __blue_glCore_glBlendFuncSeparateiARB: qword +bluegl_glBlendFuncSeparateiARB proc + mov r11, __blue_glCore_glBlendFuncSeparateiARB jmp r11 -bluegl_glBeginFragmentShaderATI endp +bluegl_glBlendFuncSeparateiARB endp -extrn __blue_glCore_glNamedProgramLocalParameterI4ivEXT: qword -bluegl_glNamedProgramLocalParameterI4ivEXT proc - mov r11, __blue_glCore_glNamedProgramLocalParameterI4ivEXT +extrn __blue_glCore_glMultiDrawArraysIndirectCountARB: qword +bluegl_glMultiDrawArraysIndirectCountARB proc + mov r11, __blue_glCore_glMultiDrawArraysIndirectCountARB jmp r11 -bluegl_glNamedProgramLocalParameterI4ivEXT endp +bluegl_glMultiDrawArraysIndirectCountARB endp -extrn __blue_glCore_glGetConvolutionParameteriv: qword -bluegl_glGetConvolutionParameteriv proc - mov r11, __blue_glCore_glGetConvolutionParameteriv +extrn __blue_glCore_glMultiDrawElementsIndirectCountARB: qword +bluegl_glMultiDrawElementsIndirectCountARB proc + mov r11, __blue_glCore_glMultiDrawElementsIndirectCountARB jmp r11 -bluegl_glGetConvolutionParameteriv endp +bluegl_glMultiDrawElementsIndirectCountARB endp -extrn __blue_glCore_glClipControl: qword -bluegl_glClipControl proc - mov r11, __blue_glCore_glClipControl +extrn __blue_glCore_glGetGraphicsResetStatusARB: qword +bluegl_glGetGraphicsResetStatusARB proc + mov r11, __blue_glCore_glGetGraphicsResetStatusARB jmp r11 -bluegl_glClipControl endp +bluegl_glGetGraphicsResetStatusARB endp -extrn __blue_glCore_glBinormal3fEXT: qword -bluegl_glBinormal3fEXT proc - mov r11, __blue_glCore_glBinormal3fEXT +extrn __blue_glCore_glGetnTexImageARB: qword +bluegl_glGetnTexImageARB proc + mov r11, __blue_glCore_glGetnTexImageARB jmp r11 -bluegl_glBinormal3fEXT endp +bluegl_glGetnTexImageARB endp -extrn __blue_glCore_glColor4ubVertex2fSUN: qword -bluegl_glColor4ubVertex2fSUN proc - mov r11, __blue_glCore_glColor4ubVertex2fSUN +extrn __blue_glCore_glReadnPixelsARB: qword +bluegl_glReadnPixelsARB proc + mov r11, __blue_glCore_glReadnPixelsARB jmp r11 -bluegl_glColor4ubVertex2fSUN endp +bluegl_glReadnPixelsARB endp -extrn __blue_glCore_glCompressedTexImage3D: qword -bluegl_glCompressedTexImage3D proc - mov r11, __blue_glCore_glCompressedTexImage3D +extrn __blue_glCore_glGetnCompressedTexImageARB: qword +bluegl_glGetnCompressedTexImageARB proc + mov r11, __blue_glCore_glGetnCompressedTexImageARB jmp r11 -bluegl_glCompressedTexImage3D endp +bluegl_glGetnCompressedTexImageARB endp -extrn __blue_glCore_glGetTextureSamplerHandleARB: qword -bluegl_glGetTextureSamplerHandleARB proc - mov r11, __blue_glCore_glGetTextureSamplerHandleARB +extrn __blue_glCore_glGetnUniformfvARB: qword +bluegl_glGetnUniformfvARB proc + mov r11, __blue_glCore_glGetnUniformfvARB jmp r11 -bluegl_glGetTextureSamplerHandleARB endp +bluegl_glGetnUniformfvARB endp -extrn __blue_glCore_glUniform3uiv: qword -bluegl_glUniform3uiv proc - mov r11, __blue_glCore_glUniform3uiv +extrn __blue_glCore_glGetnUniformivARB: qword +bluegl_glGetnUniformivARB proc + mov r11, __blue_glCore_glGetnUniformivARB jmp r11 -bluegl_glUniform3uiv endp +bluegl_glGetnUniformivARB endp -extrn __blue_glCore_glGetVertexAttribPointerv: qword -bluegl_glGetVertexAttribPointerv proc - mov r11, __blue_glCore_glGetVertexAttribPointerv +extrn __blue_glCore_glGetnUniformuivARB: qword +bluegl_glGetnUniformuivARB proc + mov r11, __blue_glCore_glGetnUniformuivARB jmp r11 -bluegl_glGetVertexAttribPointerv endp +bluegl_glGetnUniformuivARB endp -extrn __blue_glCore_glGenBuffers: qword -bluegl_glGenBuffers proc - mov r11, __blue_glCore_glGenBuffers +extrn __blue_glCore_glGetnUniformdvARB: qword +bluegl_glGetnUniformdvARB proc + mov r11, __blue_glCore_glGetnUniformdvARB jmp r11 -bluegl_glGenBuffers endp +bluegl_glGetnUniformdvARB endp -extrn __blue_glCore_glVertexAttrib3dvARB: qword -bluegl_glVertexAttrib3dvARB proc - mov r11, __blue_glCore_glVertexAttrib3dvARB +extrn __blue_glCore_glMinSampleShadingARB: qword +bluegl_glMinSampleShadingARB proc + mov r11, __blue_glCore_glMinSampleShadingARB jmp r11 -bluegl_glVertexAttrib3dvARB endp +bluegl_glMinSampleShadingARB endp -extrn __blue_glCore_glFlushVertexArrayRangeNV: qword -bluegl_glFlushVertexArrayRangeNV proc - mov r11, __blue_glCore_glFlushVertexArrayRangeNV +extrn __blue_glCore_glNamedStringARB: qword +bluegl_glNamedStringARB proc + mov r11, __blue_glCore_glNamedStringARB jmp r11 -bluegl_glFlushVertexArrayRangeNV endp +bluegl_glNamedStringARB endp -extrn __blue_glCore_glGetProgramNamedParameterdvNV: qword -bluegl_glGetProgramNamedParameterdvNV proc - mov r11, __blue_glCore_glGetProgramNamedParameterdvNV +extrn __blue_glCore_glDeleteNamedStringARB: qword +bluegl_glDeleteNamedStringARB proc + mov r11, __blue_glCore_glDeleteNamedStringARB jmp r11 -bluegl_glGetProgramNamedParameterdvNV endp +bluegl_glDeleteNamedStringARB endp -extrn __blue_glCore_glConvolutionParameterf: qword -bluegl_glConvolutionParameterf proc - mov r11, __blue_glCore_glConvolutionParameterf +extrn __blue_glCore_glCompileShaderIncludeARB: qword +bluegl_glCompileShaderIncludeARB proc + mov r11, __blue_glCore_glCompileShaderIncludeARB jmp r11 -bluegl_glConvolutionParameterf endp +bluegl_glCompileShaderIncludeARB endp -extrn __blue_glCore_glVertex2bOES: qword -bluegl_glVertex2bOES proc - mov r11, __blue_glCore_glVertex2bOES +extrn __blue_glCore_glIsNamedStringARB: qword +bluegl_glIsNamedStringARB proc + mov r11, __blue_glCore_glIsNamedStringARB jmp r11 -bluegl_glVertex2bOES endp +bluegl_glIsNamedStringARB endp -extrn __blue_glCore_glGetObjectPtrLabel: qword -bluegl_glGetObjectPtrLabel proc - mov r11, __blue_glCore_glGetObjectPtrLabel +extrn __blue_glCore_glGetNamedStringARB: qword +bluegl_glGetNamedStringARB proc + mov r11, __blue_glCore_glGetNamedStringARB jmp r11 -bluegl_glGetObjectPtrLabel endp +bluegl_glGetNamedStringARB endp -extrn __blue_glCore_glBeginTransformFeedbackNV: qword -bluegl_glBeginTransformFeedbackNV proc - mov r11, __blue_glCore_glBeginTransformFeedbackNV +extrn __blue_glCore_glGetNamedStringivARB: qword +bluegl_glGetNamedStringivARB proc + mov r11, __blue_glCore_glGetNamedStringivARB jmp r11 -bluegl_glBeginTransformFeedbackNV endp +bluegl_glGetNamedStringivARB endp -extrn __blue_glCore_glGetTextureSubImage: qword -bluegl_glGetTextureSubImage proc - mov r11, __blue_glCore_glGetTextureSubImage +extrn __blue_glCore_glBufferPageCommitmentARB: qword +bluegl_glBufferPageCommitmentARB proc + mov r11, __blue_glCore_glBufferPageCommitmentARB jmp r11 -bluegl_glGetTextureSubImage endp +bluegl_glBufferPageCommitmentARB endp -extrn __blue_glCore_glGetFramebufferAttachmentParameterivEXT: qword -bluegl_glGetFramebufferAttachmentParameterivEXT proc - mov r11, __blue_glCore_glGetFramebufferAttachmentParameterivEXT +extrn __blue_glCore_glNamedBufferPageCommitmentEXT: qword +bluegl_glNamedBufferPageCommitmentEXT proc + mov r11, __blue_glCore_glNamedBufferPageCommitmentEXT jmp r11 -bluegl_glGetFramebufferAttachmentParameterivEXT endp +bluegl_glNamedBufferPageCommitmentEXT endp -extrn __blue_glCore_glGetInteger64v: qword -bluegl_glGetInteger64v proc - mov r11, __blue_glCore_glGetInteger64v +extrn __blue_glCore_glNamedBufferPageCommitmentARB: qword +bluegl_glNamedBufferPageCommitmentARB proc + mov r11, __blue_glCore_glNamedBufferPageCommitmentARB jmp r11 -bluegl_glGetInteger64v endp +bluegl_glNamedBufferPageCommitmentARB endp -extrn __blue_glCore_glGetUniformLocation: qword -bluegl_glGetUniformLocation proc - mov r11, __blue_glCore_glGetUniformLocation +extrn __blue_glCore_glTexPageCommitmentARB: qword +bluegl_glTexPageCommitmentARB proc + mov r11, __blue_glCore_glTexPageCommitmentARB jmp r11 -bluegl_glGetUniformLocation endp +bluegl_glTexPageCommitmentARB endp -extrn __blue_glCore_glMultiTexCoord2fv: qword -bluegl_glMultiTexCoord2fv proc - mov r11, __blue_glCore_glMultiTexCoord2fv +extrn __blue_glCore_glClientActiveTexture: qword +bluegl_glClientActiveTexture proc + mov r11, __blue_glCore_glClientActiveTexture jmp r11 -bluegl_glMultiTexCoord2fv endp +bluegl_glClientActiveTexture endp -extrn __blue_glCore_glProgramUniform2uiv: qword -bluegl_glProgramUniform2uiv proc - mov r11, __blue_glCore_glProgramUniform2uiv +extrn __blue_glCore_glMultiTexCoord1d: qword +bluegl_glMultiTexCoord1d proc + mov r11, __blue_glCore_glMultiTexCoord1d jmp r11 -bluegl_glProgramUniform2uiv endp +bluegl_glMultiTexCoord1d endp -extrn __blue_glCore_glGetTexParameterIuiv: qword -bluegl_glGetTexParameterIuiv proc - mov r11, __blue_glCore_glGetTexParameterIuiv +extrn __blue_glCore_glMultiTexCoord1dv: qword +bluegl_glMultiTexCoord1dv proc + mov r11, __blue_glCore_glMultiTexCoord1dv jmp r11 -bluegl_glGetTexParameterIuiv endp +bluegl_glMultiTexCoord1dv endp -extrn __blue_glCore_glVertexAttribI4ui: qword -bluegl_glVertexAttribI4ui proc - mov r11, __blue_glCore_glVertexAttribI4ui +extrn __blue_glCore_glMultiTexCoord1f: qword +bluegl_glMultiTexCoord1f proc + mov r11, __blue_glCore_glMultiTexCoord1f jmp r11 -bluegl_glVertexAttribI4ui endp +bluegl_glMultiTexCoord1f endp -extrn __blue_glCore_glTexGenxvOES: qword -bluegl_glTexGenxvOES proc - mov r11, __blue_glCore_glTexGenxvOES +extrn __blue_glCore_glMultiTexCoord1fv: qword +bluegl_glMultiTexCoord1fv proc + mov r11, __blue_glCore_glMultiTexCoord1fv jmp r11 -bluegl_glTexGenxvOES endp +bluegl_glMultiTexCoord1fv endp -extrn __blue_glCore_glVertex4bOES: qword -bluegl_glVertex4bOES proc - mov r11, __blue_glCore_glVertex4bOES +extrn __blue_glCore_glMultiTexCoord1i: qword +bluegl_glMultiTexCoord1i proc + mov r11, __blue_glCore_glMultiTexCoord1i jmp r11 -bluegl_glVertex4bOES endp +bluegl_glMultiTexCoord1i endp -extrn __blue_glCore_glCopyTexSubImage2DEXT: qword -bluegl_glCopyTexSubImage2DEXT proc - mov r11, __blue_glCore_glCopyTexSubImage2DEXT +extrn __blue_glCore_glMultiTexCoord1iv: qword +bluegl_glMultiTexCoord1iv proc + mov r11, __blue_glCore_glMultiTexCoord1iv jmp r11 -bluegl_glCopyTexSubImage2DEXT endp +bluegl_glMultiTexCoord1iv endp -extrn __blue_glCore_glDrawBuffersATI: qword -bluegl_glDrawBuffersATI proc - mov r11, __blue_glCore_glDrawBuffersATI +extrn __blue_glCore_glMultiTexCoord1s: qword +bluegl_glMultiTexCoord1s proc + mov r11, __blue_glCore_glMultiTexCoord1s jmp r11 -bluegl_glDrawBuffersATI endp +bluegl_glMultiTexCoord1s endp -extrn __blue_glCore_glPathGlyphsNV: qword -bluegl_glPathGlyphsNV proc - mov r11, __blue_glCore_glPathGlyphsNV +extrn __blue_glCore_glMultiTexCoord1sv: qword +bluegl_glMultiTexCoord1sv proc + mov r11, __blue_glCore_glMultiTexCoord1sv jmp r11 -bluegl_glPathGlyphsNV endp +bluegl_glMultiTexCoord1sv endp -extrn __blue_glCore_glMatrixIndexuivARB: qword -bluegl_glMatrixIndexuivARB proc - mov r11, __blue_glCore_glMatrixIndexuivARB +extrn __blue_glCore_glMultiTexCoord2d: qword +bluegl_glMultiTexCoord2d proc + mov r11, __blue_glCore_glMultiTexCoord2d jmp r11 -bluegl_glMatrixIndexuivARB endp +bluegl_glMultiTexCoord2d endp -extrn __blue_glCore_glNamedProgramLocalParameterI4uiEXT: qword -bluegl_glNamedProgramLocalParameterI4uiEXT proc - mov r11, __blue_glCore_glNamedProgramLocalParameterI4uiEXT +extrn __blue_glCore_glMultiTexCoord2dv: qword +bluegl_glMultiTexCoord2dv proc + mov r11, __blue_glCore_glMultiTexCoord2dv jmp r11 -bluegl_glNamedProgramLocalParameterI4uiEXT endp +bluegl_glMultiTexCoord2dv endp -extrn __blue_glCore_glWindowPos2iv: qword -bluegl_glWindowPos2iv proc - mov r11, __blue_glCore_glWindowPos2iv +extrn __blue_glCore_glMultiTexCoord2f: qword +bluegl_glMultiTexCoord2f proc + mov r11, __blue_glCore_glMultiTexCoord2f jmp r11 -bluegl_glWindowPos2iv endp +bluegl_glMultiTexCoord2f endp -extrn __blue_glCore_glLightModelxOES: qword -bluegl_glLightModelxOES proc - mov r11, __blue_glCore_glLightModelxOES +extrn __blue_glCore_glMultiTexCoord2fv: qword +bluegl_glMultiTexCoord2fv proc + mov r11, __blue_glCore_glMultiTexCoord2fv jmp r11 -bluegl_glLightModelxOES endp +bluegl_glMultiTexCoord2fv endp -extrn __blue_glCore_glBindFragmentShaderATI: qword -bluegl_glBindFragmentShaderATI proc - mov r11, __blue_glCore_glBindFragmentShaderATI +extrn __blue_glCore_glMultiTexCoord2i: qword +bluegl_glMultiTexCoord2i proc + mov r11, __blue_glCore_glMultiTexCoord2i jmp r11 -bluegl_glBindFragmentShaderATI endp +bluegl_glMultiTexCoord2i endp -extrn __blue_glCore_glInvalidateTexSubImage: qword -bluegl_glInvalidateTexSubImage proc - mov r11, __blue_glCore_glInvalidateTexSubImage +extrn __blue_glCore_glMultiTexCoord2iv: qword +bluegl_glMultiTexCoord2iv proc + mov r11, __blue_glCore_glMultiTexCoord2iv jmp r11 -bluegl_glInvalidateTexSubImage endp +bluegl_glMultiTexCoord2iv endp -extrn __blue_glCore_glVertexAttrib4sARB: qword -bluegl_glVertexAttrib4sARB proc - mov r11, __blue_glCore_glVertexAttrib4sARB +extrn __blue_glCore_glMultiTexCoord2s: qword +bluegl_glMultiTexCoord2s proc + mov r11, __blue_glCore_glMultiTexCoord2s jmp r11 -bluegl_glVertexAttrib4sARB endp +bluegl_glMultiTexCoord2s endp -extrn __blue_glCore_glGetProgramiv: qword -bluegl_glGetProgramiv proc - mov r11, __blue_glCore_glGetProgramiv +extrn __blue_glCore_glMultiTexCoord2sv: qword +bluegl_glMultiTexCoord2sv proc + mov r11, __blue_glCore_glMultiTexCoord2sv jmp r11 -bluegl_glGetProgramiv endp +bluegl_glMultiTexCoord2sv endp -extrn __blue_glCore_glGetVideoCaptureStreamivNV: qword -bluegl_glGetVideoCaptureStreamivNV proc - mov r11, __blue_glCore_glGetVideoCaptureStreamivNV +extrn __blue_glCore_glMultiTexCoord3d: qword +bluegl_glMultiTexCoord3d proc + mov r11, __blue_glCore_glMultiTexCoord3d jmp r11 -bluegl_glGetVideoCaptureStreamivNV endp +bluegl_glMultiTexCoord3d endp -extrn __blue_glCore_glTextureParameterfvEXT: qword -bluegl_glTextureParameterfvEXT proc - mov r11, __blue_glCore_glTextureParameterfvEXT +extrn __blue_glCore_glMultiTexCoord3dv: qword +bluegl_glMultiTexCoord3dv proc + mov r11, __blue_glCore_glMultiTexCoord3dv jmp r11 -bluegl_glTextureParameterfvEXT endp +bluegl_glMultiTexCoord3dv endp -extrn __blue_glCore_glPNTrianglesfATI: qword -bluegl_glPNTrianglesfATI proc - mov r11, __blue_glCore_glPNTrianglesfATI +extrn __blue_glCore_glMultiTexCoord3f: qword +bluegl_glMultiTexCoord3f proc + mov r11, __blue_glCore_glMultiTexCoord3f jmp r11 -bluegl_glPNTrianglesfATI endp +bluegl_glMultiTexCoord3f endp -extrn __blue_glCore_glCheckNamedFramebufferStatus: qword -bluegl_glCheckNamedFramebufferStatus proc - mov r11, __blue_glCore_glCheckNamedFramebufferStatus +extrn __blue_glCore_glMultiTexCoord3fv: qword +bluegl_glMultiTexCoord3fv proc + mov r11, __blue_glCore_glMultiTexCoord3fv jmp r11 -bluegl_glCheckNamedFramebufferStatus endp +bluegl_glMultiTexCoord3fv endp -extrn __blue_glCore_glUniform4uiEXT: qword -bluegl_glUniform4uiEXT proc - mov r11, __blue_glCore_glUniform4uiEXT +extrn __blue_glCore_glMultiTexCoord3i: qword +bluegl_glMultiTexCoord3i proc + mov r11, __blue_glCore_glMultiTexCoord3i jmp r11 -bluegl_glUniform4uiEXT endp +bluegl_glMultiTexCoord3i endp -extrn __blue_glCore_glVertexAttrib2sv: qword -bluegl_glVertexAttrib2sv proc - mov r11, __blue_glCore_glVertexAttrib2sv +extrn __blue_glCore_glMultiTexCoord3iv: qword +bluegl_glMultiTexCoord3iv proc + mov r11, __blue_glCore_glMultiTexCoord3iv jmp r11 -bluegl_glVertexAttrib2sv endp +bluegl_glMultiTexCoord3iv endp -extrn __blue_glCore_glClearBufferData: qword -bluegl_glClearBufferData proc - mov r11, __blue_glCore_glClearBufferData +extrn __blue_glCore_glMultiTexCoord3s: qword +bluegl_glMultiTexCoord3s proc + mov r11, __blue_glCore_glMultiTexCoord3s jmp r11 -bluegl_glClearBufferData endp +bluegl_glMultiTexCoord3s endp -extrn __blue_glCore_glShaderSourceARB: qword -bluegl_glShaderSourceARB proc - mov r11, __blue_glCore_glShaderSourceARB +extrn __blue_glCore_glMultiTexCoord3sv: qword +bluegl_glMultiTexCoord3sv proc + mov r11, __blue_glCore_glMultiTexCoord3sv jmp r11 -bluegl_glShaderSourceARB endp +bluegl_glMultiTexCoord3sv endp -extrn __blue_glCore_glObjectPurgeableAPPLE: qword -bluegl_glObjectPurgeableAPPLE proc - mov r11, __blue_glCore_glObjectPurgeableAPPLE +extrn __blue_glCore_glMultiTexCoord4d: qword +bluegl_glMultiTexCoord4d proc + mov r11, __blue_glCore_glMultiTexCoord4d jmp r11 -bluegl_glObjectPurgeableAPPLE endp +bluegl_glMultiTexCoord4d endp -extrn __blue_glCore_glProgramUniform2iEXT: qword -bluegl_glProgramUniform2iEXT proc - mov r11, __blue_glCore_glProgramUniform2iEXT +extrn __blue_glCore_glMultiTexCoord4dv: qword +bluegl_glMultiTexCoord4dv proc + mov r11, __blue_glCore_glMultiTexCoord4dv jmp r11 -bluegl_glProgramUniform2iEXT endp +bluegl_glMultiTexCoord4dv endp -extrn __blue_glCore_glGetStringi: qword -bluegl_glGetStringi proc - mov r11, __blue_glCore_glGetStringi +extrn __blue_glCore_glMultiTexCoord4f: qword +bluegl_glMultiTexCoord4f proc + mov r11, __blue_glCore_glMultiTexCoord4f jmp r11 -bluegl_glGetStringi endp +bluegl_glMultiTexCoord4f endp -extrn __blue_glCore_glTexFilterFuncSGIS: qword -bluegl_glTexFilterFuncSGIS proc - mov r11, __blue_glCore_glTexFilterFuncSGIS +extrn __blue_glCore_glMultiTexCoord4fv: qword +bluegl_glMultiTexCoord4fv proc + mov r11, __blue_glCore_glMultiTexCoord4fv jmp r11 -bluegl_glTexFilterFuncSGIS endp +bluegl_glMultiTexCoord4fv endp -extrn __blue_glCore_glVertexArrayVertexAttribLOffsetEXT: qword -bluegl_glVertexArrayVertexAttribLOffsetEXT proc - mov r11, __blue_glCore_glVertexArrayVertexAttribLOffsetEXT +extrn __blue_glCore_glMultiTexCoord4i: qword +bluegl_glMultiTexCoord4i proc + mov r11, __blue_glCore_glMultiTexCoord4i jmp r11 -bluegl_glVertexArrayVertexAttribLOffsetEXT endp +bluegl_glMultiTexCoord4i endp -extrn __blue_glCore_glProgramLocalParametersI4uivNV: qword -bluegl_glProgramLocalParametersI4uivNV proc - mov r11, __blue_glCore_glProgramLocalParametersI4uivNV +extrn __blue_glCore_glMultiTexCoord4iv: qword +bluegl_glMultiTexCoord4iv proc + mov r11, __blue_glCore_glMultiTexCoord4iv jmp r11 -bluegl_glProgramLocalParametersI4uivNV endp +bluegl_glMultiTexCoord4iv endp -extrn __blue_glCore_glGetHistogramEXT: qword -bluegl_glGetHistogramEXT proc - mov r11, __blue_glCore_glGetHistogramEXT +extrn __blue_glCore_glMultiTexCoord4s: qword +bluegl_glMultiTexCoord4s proc + mov r11, __blue_glCore_glMultiTexCoord4s jmp r11 -bluegl_glGetHistogramEXT endp +bluegl_glMultiTexCoord4s endp -extrn __blue_glCore_glNamedBufferPageCommitmentARB: qword -bluegl_glNamedBufferPageCommitmentARB proc - mov r11, __blue_glCore_glNamedBufferPageCommitmentARB +extrn __blue_glCore_glMultiTexCoord4sv: qword +bluegl_glMultiTexCoord4sv proc + mov r11, __blue_glCore_glMultiTexCoord4sv jmp r11 -bluegl_glNamedBufferPageCommitmentARB endp +bluegl_glMultiTexCoord4sv endp -extrn __blue_glCore_glMakeBufferResidentNV: qword -bluegl_glMakeBufferResidentNV proc - mov r11, __blue_glCore_glMakeBufferResidentNV +extrn __blue_glCore_glLoadTransposeMatrixf: qword +bluegl_glLoadTransposeMatrixf proc + mov r11, __blue_glCore_glLoadTransposeMatrixf jmp r11 -bluegl_glMakeBufferResidentNV endp +bluegl_glLoadTransposeMatrixf endp -extrn __blue_glCore_glNamedFramebufferDrawBuffers: qword -bluegl_glNamedFramebufferDrawBuffers proc - mov r11, __blue_glCore_glNamedFramebufferDrawBuffers +extrn __blue_glCore_glLoadTransposeMatrixd: qword +bluegl_glLoadTransposeMatrixd proc + mov r11, __blue_glCore_glLoadTransposeMatrixd jmp r11 -bluegl_glNamedFramebufferDrawBuffers endp +bluegl_glLoadTransposeMatrixd endp -extrn __blue_glCore_glVertexPointerListIBM: qword -bluegl_glVertexPointerListIBM proc - mov r11, __blue_glCore_glVertexPointerListIBM +extrn __blue_glCore_glMultTransposeMatrixf: qword +bluegl_glMultTransposeMatrixf proc + mov r11, __blue_glCore_glMultTransposeMatrixf jmp r11 -bluegl_glVertexPointerListIBM endp +bluegl_glMultTransposeMatrixf endp -extrn __blue_glCore_glGetUniformui64vNV: qword -bluegl_glGetUniformui64vNV proc - mov r11, __blue_glCore_glGetUniformui64vNV +extrn __blue_glCore_glMultTransposeMatrixd: qword +bluegl_glMultTransposeMatrixd proc + mov r11, __blue_glCore_glMultTransposeMatrixd jmp r11 -bluegl_glGetUniformui64vNV endp +bluegl_glMultTransposeMatrixd endp -extrn __blue_glCore_glClearDepthfOES: qword -bluegl_glClearDepthfOES proc - mov r11, __blue_glCore_glClearDepthfOES +extrn __blue_glCore_glFogCoordf: qword +bluegl_glFogCoordf proc + mov r11, __blue_glCore_glFogCoordf jmp r11 -bluegl_glClearDepthfOES endp +bluegl_glFogCoordf endp -extrn __blue_glCore_glWindowPos2iMESA: qword -bluegl_glWindowPos2iMESA proc - mov r11, __blue_glCore_glWindowPos2iMESA +extrn __blue_glCore_glFogCoordfv: qword +bluegl_glFogCoordfv proc + mov r11, __blue_glCore_glFogCoordfv jmp r11 -bluegl_glWindowPos2iMESA endp +bluegl_glFogCoordfv endp -extrn __blue_glCore_glCopyTextureImage1DEXT: qword -bluegl_glCopyTextureImage1DEXT proc - mov r11, __blue_glCore_glCopyTextureImage1DEXT +extrn __blue_glCore_glFogCoordd: qword +bluegl_glFogCoordd proc + mov r11, __blue_glCore_glFogCoordd jmp r11 -bluegl_glCopyTextureImage1DEXT endp +bluegl_glFogCoordd endp -extrn __blue_glCore_glBeginOcclusionQueryNV: qword -bluegl_glBeginOcclusionQueryNV proc - mov r11, __blue_glCore_glBeginOcclusionQueryNV +extrn __blue_glCore_glFogCoorddv: qword +bluegl_glFogCoorddv proc + mov r11, __blue_glCore_glFogCoorddv jmp r11 -bluegl_glBeginOcclusionQueryNV endp +bluegl_glFogCoorddv endp -extrn __blue_glCore_glLoadTransposeMatrixf: qword -bluegl_glLoadTransposeMatrixf proc - mov r11, __blue_glCore_glLoadTransposeMatrixf +extrn __blue_glCore_glFogCoordPointer: qword +bluegl_glFogCoordPointer proc + mov r11, __blue_glCore_glFogCoordPointer jmp r11 -bluegl_glLoadTransposeMatrixf endp +bluegl_glFogCoordPointer endp -extrn __blue_glCore_glNamedRenderbufferStorageMultisampleEXT: qword -bluegl_glNamedRenderbufferStorageMultisampleEXT proc - mov r11, __blue_glCore_glNamedRenderbufferStorageMultisampleEXT +extrn __blue_glCore_glSecondaryColor3b: qword +bluegl_glSecondaryColor3b proc + mov r11, __blue_glCore_glSecondaryColor3b jmp r11 -bluegl_glNamedRenderbufferStorageMultisampleEXT endp +bluegl_glSecondaryColor3b endp -extrn __blue_glCore_glNormalStream3fATI: qword -bluegl_glNormalStream3fATI proc - mov r11, __blue_glCore_glNormalStream3fATI +extrn __blue_glCore_glSecondaryColor3bv: qword +bluegl_glSecondaryColor3bv proc + mov r11, __blue_glCore_glSecondaryColor3bv jmp r11 -bluegl_glNormalStream3fATI endp +bluegl_glSecondaryColor3bv endp -extrn __blue_glCore_glNormal3hNV: qword -bluegl_glNormal3hNV proc - mov r11, __blue_glCore_glNormal3hNV +extrn __blue_glCore_glSecondaryColor3d: qword +bluegl_glSecondaryColor3d proc + mov r11, __blue_glCore_glSecondaryColor3d jmp r11 -bluegl_glNormal3hNV endp +bluegl_glSecondaryColor3d endp -extrn __blue_glCore_glUseProgram: qword -bluegl_glUseProgram proc - mov r11, __blue_glCore_glUseProgram +extrn __blue_glCore_glSecondaryColor3dv: qword +bluegl_glSecondaryColor3dv proc + mov r11, __blue_glCore_glSecondaryColor3dv jmp r11 -bluegl_glUseProgram endp +bluegl_glSecondaryColor3dv endp -extrn __blue_glCore_glPushGroupMarkerEXT: qword -bluegl_glPushGroupMarkerEXT proc - mov r11, __blue_glCore_glPushGroupMarkerEXT +extrn __blue_glCore_glSecondaryColor3f: qword +bluegl_glSecondaryColor3f proc + mov r11, __blue_glCore_glSecondaryColor3f jmp r11 -bluegl_glPushGroupMarkerEXT endp +bluegl_glSecondaryColor3f endp -extrn __blue_glCore_glMultiTexSubImage2DEXT: qword -bluegl_glMultiTexSubImage2DEXT proc - mov r11, __blue_glCore_glMultiTexSubImage2DEXT +extrn __blue_glCore_glSecondaryColor3fv: qword +bluegl_glSecondaryColor3fv proc + mov r11, __blue_glCore_glSecondaryColor3fv jmp r11 -bluegl_glMultiTexSubImage2DEXT endp +bluegl_glSecondaryColor3fv endp -extrn __blue_glCore_glVertexArrayRangeNV: qword -bluegl_glVertexArrayRangeNV proc - mov r11, __blue_glCore_glVertexArrayRangeNV +extrn __blue_glCore_glSecondaryColor3i: qword +bluegl_glSecondaryColor3i proc + mov r11, __blue_glCore_glSecondaryColor3i jmp r11 -bluegl_glVertexArrayRangeNV endp +bluegl_glSecondaryColor3i endp -extrn __blue_glCore_glGetMultiTexLevelParameterivEXT: qword -bluegl_glGetMultiTexLevelParameterivEXT proc - mov r11, __blue_glCore_glGetMultiTexLevelParameterivEXT +extrn __blue_glCore_glSecondaryColor3iv: qword +bluegl_glSecondaryColor3iv proc + mov r11, __blue_glCore_glSecondaryColor3iv jmp r11 -bluegl_glGetMultiTexLevelParameterivEXT endp +bluegl_glSecondaryColor3iv endp -extrn __blue_glCore_glMultiDrawArraysEXT: qword -bluegl_glMultiDrawArraysEXT proc - mov r11, __blue_glCore_glMultiDrawArraysEXT +extrn __blue_glCore_glSecondaryColor3s: qword +bluegl_glSecondaryColor3s proc + mov r11, __blue_glCore_glSecondaryColor3s jmp r11 -bluegl_glMultiDrawArraysEXT endp +bluegl_glSecondaryColor3s endp -extrn __blue_glCore_glVertexAttribL4ui64NV: qword -bluegl_glVertexAttribL4ui64NV proc - mov r11, __blue_glCore_glVertexAttribL4ui64NV +extrn __blue_glCore_glSecondaryColor3sv: qword +bluegl_glSecondaryColor3sv proc + mov r11, __blue_glCore_glSecondaryColor3sv jmp r11 -bluegl_glVertexAttribL4ui64NV endp +bluegl_glSecondaryColor3sv endp -extrn __blue_glCore_glVertexAttrib4Nub: qword -bluegl_glVertexAttrib4Nub proc - mov r11, __blue_glCore_glVertexAttrib4Nub +extrn __blue_glCore_glSecondaryColor3ub: qword +bluegl_glSecondaryColor3ub proc + mov r11, __blue_glCore_glSecondaryColor3ub jmp r11 -bluegl_glVertexAttrib4Nub endp +bluegl_glSecondaryColor3ub endp -extrn __blue_glCore_glFogCoordhNV: qword -bluegl_glFogCoordhNV proc - mov r11, __blue_glCore_glFogCoordhNV +extrn __blue_glCore_glSecondaryColor3ubv: qword +bluegl_glSecondaryColor3ubv proc + mov r11, __blue_glCore_glSecondaryColor3ubv jmp r11 -bluegl_glFogCoordhNV endp +bluegl_glSecondaryColor3ubv endp -extrn __blue_glCore_glVertexAttribI3ui: qword -bluegl_glVertexAttribI3ui proc - mov r11, __blue_glCore_glVertexAttribI3ui +extrn __blue_glCore_glSecondaryColor3ui: qword +bluegl_glSecondaryColor3ui proc + mov r11, __blue_glCore_glSecondaryColor3ui jmp r11 -bluegl_glVertexAttribI3ui endp +bluegl_glSecondaryColor3ui endp -extrn __blue_glCore_glTexImage3DMultisampleCoverageNV: qword -bluegl_glTexImage3DMultisampleCoverageNV proc - mov r11, __blue_glCore_glTexImage3DMultisampleCoverageNV +extrn __blue_glCore_glSecondaryColor3uiv: qword +bluegl_glSecondaryColor3uiv proc + mov r11, __blue_glCore_glSecondaryColor3uiv jmp r11 -bluegl_glTexImage3DMultisampleCoverageNV endp +bluegl_glSecondaryColor3uiv endp -extrn __blue_glCore_glGetUniformBufferSizeEXT: qword -bluegl_glGetUniformBufferSizeEXT proc - mov r11, __blue_glCore_glGetUniformBufferSizeEXT +extrn __blue_glCore_glSecondaryColor3us: qword +bluegl_glSecondaryColor3us proc + mov r11, __blue_glCore_glSecondaryColor3us jmp r11 -bluegl_glGetUniformBufferSizeEXT endp +bluegl_glSecondaryColor3us endp -extrn __blue_glCore_glCompileCommandListNV: qword -bluegl_glCompileCommandListNV proc - mov r11, __blue_glCore_glCompileCommandListNV +extrn __blue_glCore_glSecondaryColor3usv: qword +bluegl_glSecondaryColor3usv proc + mov r11, __blue_glCore_glSecondaryColor3usv jmp r11 -bluegl_glCompileCommandListNV endp +bluegl_glSecondaryColor3usv endp -extrn __blue_glCore_glVertexArrayVertexAttribBindingEXT: qword -bluegl_glVertexArrayVertexAttribBindingEXT proc - mov r11, __blue_glCore_glVertexArrayVertexAttribBindingEXT +extrn __blue_glCore_glSecondaryColorPointer: qword +bluegl_glSecondaryColorPointer proc + mov r11, __blue_glCore_glSecondaryColorPointer jmp r11 -bluegl_glVertexArrayVertexAttribBindingEXT endp +bluegl_glSecondaryColorPointer endp -extrn __blue_glCore_glBlendEquation: qword -bluegl_glBlendEquation proc - mov r11, __blue_glCore_glBlendEquation +extrn __blue_glCore_glWindowPos2d: qword +bluegl_glWindowPos2d proc + mov r11, __blue_glCore_glWindowPos2d jmp r11 -bluegl_glBlendEquation endp +bluegl_glWindowPos2d endp -extrn __blue_glCore_glBinormal3dvEXT: qword -bluegl_glBinormal3dvEXT proc - mov r11, __blue_glCore_glBinormal3dvEXT +extrn __blue_glCore_glWindowPos2dv: qword +bluegl_glWindowPos2dv proc + mov r11, __blue_glCore_glWindowPos2dv jmp r11 -bluegl_glBinormal3dvEXT endp +bluegl_glWindowPos2dv endp -extrn __blue_glCore_glVertexFormatNV: qword -bluegl_glVertexFormatNV proc - mov r11, __blue_glCore_glVertexFormatNV +extrn __blue_glCore_glWindowPos2f: qword +bluegl_glWindowPos2f proc + mov r11, __blue_glCore_glWindowPos2f jmp r11 -bluegl_glVertexFormatNV endp +bluegl_glWindowPos2f endp -extrn __blue_glCore_glProgramUniform4fv: qword -bluegl_glProgramUniform4fv proc - mov r11, __blue_glCore_glProgramUniform4fv +extrn __blue_glCore_glWindowPos2fv: qword +bluegl_glWindowPos2fv proc + mov r11, __blue_glCore_glWindowPos2fv jmp r11 -bluegl_glProgramUniform4fv endp +bluegl_glWindowPos2fv endp -extrn __blue_glCore_glTextureStorage2DMultisample: qword -bluegl_glTextureStorage2DMultisample proc - mov r11, __blue_glCore_glTextureStorage2DMultisample +extrn __blue_glCore_glWindowPos2i: qword +bluegl_glWindowPos2i proc + mov r11, __blue_glCore_glWindowPos2i jmp r11 -bluegl_glTextureStorage2DMultisample endp +bluegl_glWindowPos2i endp -extrn __blue_glCore_glProgramUniform3uiEXT: qword -bluegl_glProgramUniform3uiEXT proc - mov r11, __blue_glCore_glProgramUniform3uiEXT +extrn __blue_glCore_glWindowPos2iv: qword +bluegl_glWindowPos2iv proc + mov r11, __blue_glCore_glWindowPos2iv jmp r11 -bluegl_glProgramUniform3uiEXT endp +bluegl_glWindowPos2iv endp -extrn __blue_glCore_glFramebufferDrawBufferEXT: qword -bluegl_glFramebufferDrawBufferEXT proc - mov r11, __blue_glCore_glFramebufferDrawBufferEXT +extrn __blue_glCore_glWindowPos2s: qword +bluegl_glWindowPos2s proc + mov r11, __blue_glCore_glWindowPos2s jmp r11 -bluegl_glFramebufferDrawBufferEXT endp +bluegl_glWindowPos2s endp -extrn __blue_glCore_glCreateTextures: qword -bluegl_glCreateTextures proc - mov r11, __blue_glCore_glCreateTextures +extrn __blue_glCore_glWindowPos2sv: qword +bluegl_glWindowPos2sv proc + mov r11, __blue_glCore_glWindowPos2sv jmp r11 -bluegl_glCreateTextures endp +bluegl_glWindowPos2sv endp -extrn __blue_glCore_glMatrixPopEXT: qword -bluegl_glMatrixPopEXT proc - mov r11, __blue_glCore_glMatrixPopEXT +extrn __blue_glCore_glWindowPos3d: qword +bluegl_glWindowPos3d proc + mov r11, __blue_glCore_glWindowPos3d jmp r11 -bluegl_glMatrixPopEXT endp +bluegl_glWindowPos3d endp -extrn __blue_glCore_glProgramUniformui64vNV: qword -bluegl_glProgramUniformui64vNV proc - mov r11, __blue_glCore_glProgramUniformui64vNV +extrn __blue_glCore_glWindowPos3dv: qword +bluegl_glWindowPos3dv proc + mov r11, __blue_glCore_glWindowPos3dv jmp r11 -bluegl_glProgramUniformui64vNV endp +bluegl_glWindowPos3dv endp -extrn __blue_glCore_glFramebufferTexture2D: qword -bluegl_glFramebufferTexture2D proc - mov r11, __blue_glCore_glFramebufferTexture2D +extrn __blue_glCore_glWindowPos3f: qword +bluegl_glWindowPos3f proc + mov r11, __blue_glCore_glWindowPos3f jmp r11 -bluegl_glFramebufferTexture2D endp +bluegl_glWindowPos3f endp -extrn __blue_glCore_glGetAttribLocation: qword -bluegl_glGetAttribLocation proc - mov r11, __blue_glCore_glGetAttribLocation +extrn __blue_glCore_glWindowPos3fv: qword +bluegl_glWindowPos3fv proc + mov r11, __blue_glCore_glWindowPos3fv jmp r11 -bluegl_glGetAttribLocation endp +bluegl_glWindowPos3fv endp -extrn __blue_glCore_glUniform2fARB: qword -bluegl_glUniform2fARB proc - mov r11, __blue_glCore_glUniform2fARB +extrn __blue_glCore_glWindowPos3i: qword +bluegl_glWindowPos3i proc + mov r11, __blue_glCore_glWindowPos3i jmp r11 -bluegl_glUniform2fARB endp +bluegl_glWindowPos3i endp -extrn __blue_glCore_glDisableVertexArrayAttribEXT: qword -bluegl_glDisableVertexArrayAttribEXT proc - mov r11, __blue_glCore_glDisableVertexArrayAttribEXT +extrn __blue_glCore_glWindowPos3iv: qword +bluegl_glWindowPos3iv proc + mov r11, __blue_glCore_glWindowPos3iv jmp r11 -bluegl_glDisableVertexArrayAttribEXT endp +bluegl_glWindowPos3iv endp -extrn __blue_glCore_glTexStorage2D: qword -bluegl_glTexStorage2D proc - mov r11, __blue_glCore_glTexStorage2D +extrn __blue_glCore_glWindowPos3s: qword +bluegl_glWindowPos3s proc + mov r11, __blue_glCore_glWindowPos3s jmp r11 -bluegl_glTexStorage2D endp +bluegl_glWindowPos3s endp -extrn __blue_glCore_glVertexAttribI1iEXT: qword -bluegl_glVertexAttribI1iEXT proc - mov r11, __blue_glCore_glVertexAttribI1iEXT +extrn __blue_glCore_glWindowPos3sv: qword +bluegl_glWindowPos3sv proc + mov r11, __blue_glCore_glWindowPos3sv jmp r11 -bluegl_glVertexAttribI1iEXT endp +bluegl_glWindowPos3sv endp -extrn __blue_glCore_glUniform4ui: qword -bluegl_glUniform4ui proc - mov r11, __blue_glCore_glUniform4ui +extrn __blue_glCore_glVertexP2ui: qword +bluegl_glVertexP2ui proc + mov r11, __blue_glCore_glVertexP2ui jmp r11 -bluegl_glUniform4ui endp +bluegl_glVertexP2ui endp -extrn __blue_glCore_glMultiTexCoordP1uiv: qword -bluegl_glMultiTexCoordP1uiv proc - mov r11, __blue_glCore_glMultiTexCoordP1uiv +extrn __blue_glCore_glVertexP2uiv: qword +bluegl_glVertexP2uiv proc + mov r11, __blue_glCore_glVertexP2uiv jmp r11 -bluegl_glMultiTexCoordP1uiv endp +bluegl_glVertexP2uiv endp -extrn __blue_glCore_glNamedProgramLocalParametersI4ivEXT: qword -bluegl_glNamedProgramLocalParametersI4ivEXT proc - mov r11, __blue_glCore_glNamedProgramLocalParametersI4ivEXT +extrn __blue_glCore_glVertexP3ui: qword +bluegl_glVertexP3ui proc + mov r11, __blue_glCore_glVertexP3ui jmp r11 -bluegl_glNamedProgramLocalParametersI4ivEXT endp +bluegl_glVertexP3ui endp -extrn __blue_glCore_glImageTransformParameteriHP: qword -bluegl_glImageTransformParameteriHP proc - mov r11, __blue_glCore_glImageTransformParameteriHP +extrn __blue_glCore_glVertexP3uiv: qword +bluegl_glVertexP3uiv proc + mov r11, __blue_glCore_glVertexP3uiv jmp r11 -bluegl_glImageTransformParameteriHP endp +bluegl_glVertexP3uiv endp -extrn __blue_glCore_glIsBuffer: qword -bluegl_glIsBuffer proc - mov r11, __blue_glCore_glIsBuffer +extrn __blue_glCore_glVertexP4ui: qword +bluegl_glVertexP4ui proc + mov r11, __blue_glCore_glVertexP4ui jmp r11 -bluegl_glIsBuffer endp +bluegl_glVertexP4ui endp -extrn __blue_glCore_glFogCoorddv: qword -bluegl_glFogCoorddv proc - mov r11, __blue_glCore_glFogCoorddv +extrn __blue_glCore_glVertexP4uiv: qword +bluegl_glVertexP4uiv proc + mov r11, __blue_glCore_glVertexP4uiv jmp r11 -bluegl_glFogCoorddv endp +bluegl_glVertexP4uiv endp -extrn __blue_glCore_glClientActiveTexture: qword -bluegl_glClientActiveTexture proc - mov r11, __blue_glCore_glClientActiveTexture +extrn __blue_glCore_glTexCoordP1ui: qword +bluegl_glTexCoordP1ui proc + mov r11, __blue_glCore_glTexCoordP1ui jmp r11 -bluegl_glClientActiveTexture endp +bluegl_glTexCoordP1ui endp -extrn __blue_glCore_glUniformHandleui64vNV: qword -bluegl_glUniformHandleui64vNV proc - mov r11, __blue_glCore_glUniformHandleui64vNV +extrn __blue_glCore_glTexCoordP1uiv: qword +bluegl_glTexCoordP1uiv proc + mov r11, __blue_glCore_glTexCoordP1uiv jmp r11 -bluegl_glUniformHandleui64vNV endp +bluegl_glTexCoordP1uiv endp -extrn __blue_glCore_glWindowPos3fARB: qword -bluegl_glWindowPos3fARB proc - mov r11, __blue_glCore_glWindowPos3fARB +extrn __blue_glCore_glTexCoordP2ui: qword +bluegl_glTexCoordP2ui proc + mov r11, __blue_glCore_glTexCoordP2ui jmp r11 -bluegl_glWindowPos3fARB endp +bluegl_glTexCoordP2ui endp -extrn __blue_glCore_glGetVertexAttribfvARB: qword -bluegl_glGetVertexAttribfvARB proc - mov r11, __blue_glCore_glGetVertexAttribfvARB +extrn __blue_glCore_glTexCoordP2uiv: qword +bluegl_glTexCoordP2uiv proc + mov r11, __blue_glCore_glTexCoordP2uiv jmp r11 -bluegl_glGetVertexAttribfvARB endp +bluegl_glTexCoordP2uiv endp -extrn __blue_glCore_glSamplerParameterfv: qword -bluegl_glSamplerParameterfv proc - mov r11, __blue_glCore_glSamplerParameterfv +extrn __blue_glCore_glTexCoordP3ui: qword +bluegl_glTexCoordP3ui proc + mov r11, __blue_glCore_glTexCoordP3ui jmp r11 -bluegl_glSamplerParameterfv endp +bluegl_glTexCoordP3ui endp -extrn __blue_glCore_glVertexAttrib4NsvARB: qword -bluegl_glVertexAttrib4NsvARB proc - mov r11, __blue_glCore_glVertexAttrib4NsvARB +extrn __blue_glCore_glTexCoordP3uiv: qword +bluegl_glTexCoordP3uiv proc + mov r11, __blue_glCore_glTexCoordP3uiv jmp r11 -bluegl_glVertexAttrib4NsvARB endp +bluegl_glTexCoordP3uiv endp -extrn __blue_glCore_glProgramUniform2ivEXT: qword -bluegl_glProgramUniform2ivEXT proc - mov r11, __blue_glCore_glProgramUniform2ivEXT +extrn __blue_glCore_glTexCoordP4ui: qword +bluegl_glTexCoordP4ui proc + mov r11, __blue_glCore_glTexCoordP4ui jmp r11 -bluegl_glProgramUniform2ivEXT endp +bluegl_glTexCoordP4ui endp -extrn __blue_glCore_glNamedProgramStringEXT: qword -bluegl_glNamedProgramStringEXT proc - mov r11, __blue_glCore_glNamedProgramStringEXT +extrn __blue_glCore_glTexCoordP4uiv: qword +bluegl_glTexCoordP4uiv proc + mov r11, __blue_glCore_glTexCoordP4uiv jmp r11 -bluegl_glNamedProgramStringEXT endp +bluegl_glTexCoordP4uiv endp -extrn __blue_glCore_glPointSize: qword -bluegl_glPointSize proc - mov r11, __blue_glCore_glPointSize +extrn __blue_glCore_glMultiTexCoordP1ui: qword +bluegl_glMultiTexCoordP1ui proc + mov r11, __blue_glCore_glMultiTexCoordP1ui jmp r11 -bluegl_glPointSize endp +bluegl_glMultiTexCoordP1ui endp -extrn __blue_glCore_glTexCoord4hNV: qword -bluegl_glTexCoord4hNV proc - mov r11, __blue_glCore_glTexCoord4hNV +extrn __blue_glCore_glMultiTexCoordP1uiv: qword +bluegl_glMultiTexCoordP1uiv proc + mov r11, __blue_glCore_glMultiTexCoordP1uiv jmp r11 -bluegl_glTexCoord4hNV endp +bluegl_glMultiTexCoordP1uiv endp -extrn __blue_glCore_glGetIntegerIndexedvEXT: qword -bluegl_glGetIntegerIndexedvEXT proc - mov r11, __blue_glCore_glGetIntegerIndexedvEXT +extrn __blue_glCore_glMultiTexCoordP2ui: qword +bluegl_glMultiTexCoordP2ui proc + mov r11, __blue_glCore_glMultiTexCoordP2ui jmp r11 -bluegl_glGetIntegerIndexedvEXT endp +bluegl_glMultiTexCoordP2ui endp -extrn __blue_glCore_glPrimitiveBoundingBoxARB: qword -bluegl_glPrimitiveBoundingBoxARB proc - mov r11, __blue_glCore_glPrimitiveBoundingBoxARB +extrn __blue_glCore_glMultiTexCoordP2uiv: qword +bluegl_glMultiTexCoordP2uiv proc + mov r11, __blue_glCore_glMultiTexCoordP2uiv jmp r11 -bluegl_glPrimitiveBoundingBoxARB endp +bluegl_glMultiTexCoordP2uiv endp -extrn __blue_glCore_glDebugMessageInsert: qword -bluegl_glDebugMessageInsert proc - mov r11, __blue_glCore_glDebugMessageInsert +extrn __blue_glCore_glMultiTexCoordP3ui: qword +bluegl_glMultiTexCoordP3ui proc + mov r11, __blue_glCore_glMultiTexCoordP3ui jmp r11 -bluegl_glDebugMessageInsert endp +bluegl_glMultiTexCoordP3ui endp -extrn __blue_glCore_glMultiTexCoord3bvOES: qword -bluegl_glMultiTexCoord3bvOES proc - mov r11, __blue_glCore_glMultiTexCoord3bvOES +extrn __blue_glCore_glMultiTexCoordP3uiv: qword +bluegl_glMultiTexCoordP3uiv proc + mov r11, __blue_glCore_glMultiTexCoordP3uiv jmp r11 -bluegl_glMultiTexCoord3bvOES endp +bluegl_glMultiTexCoordP3uiv endp -extrn __blue_glCore_glVertexAttribL1i64vNV: qword -bluegl_glVertexAttribL1i64vNV proc - mov r11, __blue_glCore_glVertexAttribL1i64vNV +extrn __blue_glCore_glMultiTexCoordP4ui: qword +bluegl_glMultiTexCoordP4ui proc + mov r11, __blue_glCore_glMultiTexCoordP4ui jmp r11 -bluegl_glVertexAttribL1i64vNV endp +bluegl_glMultiTexCoordP4ui endp -extrn __blue_glCore_glTextureBuffer: qword -bluegl_glTextureBuffer proc - mov r11, __blue_glCore_glTextureBuffer +extrn __blue_glCore_glMultiTexCoordP4uiv: qword +bluegl_glMultiTexCoordP4uiv proc + mov r11, __blue_glCore_glMultiTexCoordP4uiv jmp r11 -bluegl_glTextureBuffer endp +bluegl_glMultiTexCoordP4uiv endp -extrn __blue_glCore_glGetTextureParameterIiv: qword -bluegl_glGetTextureParameterIiv proc - mov r11, __blue_glCore_glGetTextureParameterIiv +extrn __blue_glCore_glNormalP3ui: qword +bluegl_glNormalP3ui proc + mov r11, __blue_glCore_glNormalP3ui jmp r11 -bluegl_glGetTextureParameterIiv endp +bluegl_glNormalP3ui endp -extrn __blue_glCore_glFramebufferTexture: qword -bluegl_glFramebufferTexture proc - mov r11, __blue_glCore_glFramebufferTexture +extrn __blue_glCore_glNormalP3uiv: qword +bluegl_glNormalP3uiv proc + mov r11, __blue_glCore_glNormalP3uiv jmp r11 -bluegl_glFramebufferTexture endp +bluegl_glNormalP3uiv endp -extrn __blue_glCore_glGetProgramivARB: qword -bluegl_glGetProgramivARB proc - mov r11, __blue_glCore_glGetProgramivARB +extrn __blue_glCore_glColorP3ui: qword +bluegl_glColorP3ui proc + mov r11, __blue_glCore_glColorP3ui jmp r11 -bluegl_glGetProgramivARB endp +bluegl_glColorP3ui endp -extrn __blue_glCore_glVertexAttribPointerARB: qword -bluegl_glVertexAttribPointerARB proc - mov r11, __blue_glCore_glVertexAttribPointerARB +extrn __blue_glCore_glColorP3uiv: qword +bluegl_glColorP3uiv proc + mov r11, __blue_glCore_glColorP3uiv jmp r11 -bluegl_glVertexAttribPointerARB endp +bluegl_glColorP3uiv endp -extrn __blue_glCore_glIsCommandListNV: qword -bluegl_glIsCommandListNV proc - mov r11, __blue_glCore_glIsCommandListNV +extrn __blue_glCore_glColorP4ui: qword +bluegl_glColorP4ui proc + mov r11, __blue_glCore_glColorP4ui jmp r11 -bluegl_glIsCommandListNV endp +bluegl_glColorP4ui endp -extrn __blue_glCore_glUniform1uivEXT: qword -bluegl_glUniform1uivEXT proc - mov r11, __blue_glCore_glUniform1uivEXT +extrn __blue_glCore_glColorP4uiv: qword +bluegl_glColorP4uiv proc + mov r11, __blue_glCore_glColorP4uiv jmp r11 -bluegl_glUniform1uivEXT endp +bluegl_glColorP4uiv endp -extrn __blue_glCore_glProgramUniform2i: qword -bluegl_glProgramUniform2i proc - mov r11, __blue_glCore_glProgramUniform2i +extrn __blue_glCore_glSecondaryColorP3ui: qword +bluegl_glSecondaryColorP3ui proc + mov r11, __blue_glCore_glSecondaryColorP3ui jmp r11 -bluegl_glProgramUniform2i endp +bluegl_glSecondaryColorP3ui endp -extrn __blue_glCore_glVertexAttribDivisorARB: qword -bluegl_glVertexAttribDivisorARB proc - mov r11, __blue_glCore_glVertexAttribDivisorARB +extrn __blue_glCore_glSecondaryColorP3uiv: qword +bluegl_glSecondaryColorP3uiv proc + mov r11, __blue_glCore_glSecondaryColorP3uiv jmp r11 -bluegl_glVertexAttribDivisorARB endp +bluegl_glSecondaryColorP3uiv endp -extrn __blue_glCore_glGetVertexAttribPointervARB: qword -bluegl_glGetVertexAttribPointervARB proc - mov r11, __blue_glCore_glGetVertexAttribPointervARB +extrn __blue_glCore_glGetnMapdv: qword +bluegl_glGetnMapdv proc + mov r11, __blue_glCore_glGetnMapdv jmp r11 -bluegl_glGetVertexAttribPointervARB endp +bluegl_glGetnMapdv endp -extrn __blue_glCore_glTextureImage2DMultisampleNV: qword -bluegl_glTextureImage2DMultisampleNV proc - mov r11, __blue_glCore_glTextureImage2DMultisampleNV +extrn __blue_glCore_glGetnMapfv: qword +bluegl_glGetnMapfv proc + mov r11, __blue_glCore_glGetnMapfv jmp r11 -bluegl_glTextureImage2DMultisampleNV endp +bluegl_glGetnMapfv endp -extrn __blue_glCore_glGetVariantPointervEXT: qword -bluegl_glGetVariantPointervEXT proc - mov r11, __blue_glCore_glGetVariantPointervEXT +extrn __blue_glCore_glGetnMapiv: qword +bluegl_glGetnMapiv proc + mov r11, __blue_glCore_glGetnMapiv jmp r11 -bluegl_glGetVariantPointervEXT endp +bluegl_glGetnMapiv endp -extrn __blue_glCore_glCheckFramebufferStatus: qword -bluegl_glCheckFramebufferStatus proc - mov r11, __blue_glCore_glCheckFramebufferStatus +extrn __blue_glCore_glGetnPixelMapfv: qword +bluegl_glGetnPixelMapfv proc + mov r11, __blue_glCore_glGetnPixelMapfv jmp r11 -bluegl_glCheckFramebufferStatus endp +bluegl_glGetnPixelMapfv endp -extrn __blue_glCore_glMap1xOES: qword -bluegl_glMap1xOES proc - mov r11, __blue_glCore_glMap1xOES +extrn __blue_glCore_glGetnPixelMapuiv: qword +bluegl_glGetnPixelMapuiv proc + mov r11, __blue_glCore_glGetnPixelMapuiv jmp r11 -bluegl_glMap1xOES endp +bluegl_glGetnPixelMapuiv endp -extrn __blue_glCore_glBindSampler: qword -bluegl_glBindSampler proc - mov r11, __blue_glCore_glBindSampler +extrn __blue_glCore_glGetnPixelMapusv: qword +bluegl_glGetnPixelMapusv proc + mov r11, __blue_glCore_glGetnPixelMapusv jmp r11 -bluegl_glBindSampler endp +bluegl_glGetnPixelMapusv endp -extrn __blue_glCore_glPathGlyphIndexRangeNV: qword -bluegl_glPathGlyphIndexRangeNV proc - mov r11, __blue_glCore_glPathGlyphIndexRangeNV +extrn __blue_glCore_glGetnPolygonStipple: qword +bluegl_glGetnPolygonStipple proc + mov r11, __blue_glCore_glGetnPolygonStipple jmp r11 -bluegl_glPathGlyphIndexRangeNV endp +bluegl_glGetnPolygonStipple endp -extrn __blue_glCore_glProgramEnvParameters4fvEXT: qword -bluegl_glProgramEnvParameters4fvEXT proc - mov r11, __blue_glCore_glProgramEnvParameters4fvEXT +extrn __blue_glCore_glGetnColorTable: qword +bluegl_glGetnColorTable proc + mov r11, __blue_glCore_glGetnColorTable jmp r11 -bluegl_glProgramEnvParameters4fvEXT endp +bluegl_glGetnColorTable endp -extrn __blue_glCore_glVertexAttrib3fNV: qword -bluegl_glVertexAttrib3fNV proc - mov r11, __blue_glCore_glVertexAttrib3fNV +extrn __blue_glCore_glGetnConvolutionFilter: qword +bluegl_glGetnConvolutionFilter proc + mov r11, __blue_glCore_glGetnConvolutionFilter jmp r11 -bluegl_glVertexAttrib3fNV endp +bluegl_glGetnConvolutionFilter endp -extrn __blue_glCore_glBindBuffersBase: qword -bluegl_glBindBuffersBase proc - mov r11, __blue_glCore_glBindBuffersBase +extrn __blue_glCore_glGetnSeparableFilter: qword +bluegl_glGetnSeparableFilter proc + mov r11, __blue_glCore_glGetnSeparableFilter jmp r11 -bluegl_glBindBuffersBase endp +bluegl_glGetnSeparableFilter endp -extrn __blue_glCore_glGetNamedProgramLocalParameterIivEXT: qword -bluegl_glGetNamedProgramLocalParameterIivEXT proc - mov r11, __blue_glCore_glGetNamedProgramLocalParameterIivEXT +extrn __blue_glCore_glGetnHistogram: qword +bluegl_glGetnHistogram proc + mov r11, __blue_glCore_glGetnHistogram jmp r11 -bluegl_glGetNamedProgramLocalParameterIivEXT endp +bluegl_glGetnHistogram endp -extrn __blue_glCore_glProgramUniform4d: qword -bluegl_glProgramUniform4d proc - mov r11, __blue_glCore_glProgramUniform4d +extrn __blue_glCore_glGetnMinmax: qword +bluegl_glGetnMinmax proc + mov r11, __blue_glCore_glGetnMinmax jmp r11 -bluegl_glProgramUniform4d endp +bluegl_glGetnMinmax endp -extrn __blue_glCore_glMultiTexCoord3f: qword -bluegl_glMultiTexCoord3f proc - mov r11, __blue_glCore_glMultiTexCoord3f +extrn __blue_glCore_glPrimitiveBoundingBoxARB: qword +bluegl_glPrimitiveBoundingBoxARB proc + mov r11, __blue_glCore_glPrimitiveBoundingBoxARB jmp r11 -bluegl_glMultiTexCoord3f endp +bluegl_glPrimitiveBoundingBoxARB endp -extrn __blue_glCore_glDeleteProgram: qword -bluegl_glDeleteProgram proc - mov r11, __blue_glCore_glDeleteProgram +extrn __blue_glCore_glClampColorARB: qword +bluegl_glClampColorARB proc + mov r11, __blue_glCore_glClampColorARB jmp r11 -bluegl_glDeleteProgram endp +bluegl_glClampColorARB endp -extrn __blue_glCore_glReplacementCodeuiVertex3fvSUN: qword -bluegl_glReplacementCodeuiVertex3fvSUN proc - mov r11, __blue_glCore_glReplacementCodeuiVertex3fvSUN +extrn __blue_glCore_glDrawBuffersARB: qword +bluegl_glDrawBuffersARB proc + mov r11, __blue_glCore_glDrawBuffersARB jmp r11 -bluegl_glReplacementCodeuiVertex3fvSUN endp +bluegl_glDrawBuffersARB endp -extrn __blue_glCore_glMapNamedBufferRange: qword -bluegl_glMapNamedBufferRange proc - mov r11, __blue_glCore_glMapNamedBufferRange +extrn __blue_glCore_glDrawArraysInstancedARB: qword +bluegl_glDrawArraysInstancedARB proc + mov r11, __blue_glCore_glDrawArraysInstancedARB jmp r11 -bluegl_glMapNamedBufferRange endp +bluegl_glDrawArraysInstancedARB endp -extrn __blue_glCore_glFramebufferSampleLocationsfvARB: qword -bluegl_glFramebufferSampleLocationsfvARB proc - mov r11, __blue_glCore_glFramebufferSampleLocationsfvARB +extrn __blue_glCore_glDrawElementsInstancedARB: qword +bluegl_glDrawElementsInstancedARB proc + mov r11, __blue_glCore_glDrawElementsInstancedARB jmp r11 -bluegl_glFramebufferSampleLocationsfvARB endp +bluegl_glDrawElementsInstancedARB endp -extrn __blue_glCore_glMultiTexCoord1dvARB: qword -bluegl_glMultiTexCoord1dvARB proc - mov r11, __blue_glCore_glMultiTexCoord1dvARB +extrn __blue_glCore_glProgramStringARB: qword +bluegl_glProgramStringARB proc + mov r11, __blue_glCore_glProgramStringARB jmp r11 -bluegl_glMultiTexCoord1dvARB endp +bluegl_glProgramStringARB endp -extrn __blue_glCore_glClearBufferuiv: qword -bluegl_glClearBufferuiv proc - mov r11, __blue_glCore_glClearBufferuiv +extrn __blue_glCore_glBindProgramARB: qword +bluegl_glBindProgramARB proc + mov r11, __blue_glCore_glBindProgramARB jmp r11 -bluegl_glClearBufferuiv endp +bluegl_glBindProgramARB endp -extrn __blue_glCore_glDrawRangeElementsEXT: qword -bluegl_glDrawRangeElementsEXT proc - mov r11, __blue_glCore_glDrawRangeElementsEXT +extrn __blue_glCore_glDeleteProgramsARB: qword +bluegl_glDeleteProgramsARB proc + mov r11, __blue_glCore_glDeleteProgramsARB jmp r11 -bluegl_glDrawRangeElementsEXT endp +bluegl_glDeleteProgramsARB endp -extrn __blue_glCore_glVertexAttrib1hvNV: qword -bluegl_glVertexAttrib1hvNV proc - mov r11, __blue_glCore_glVertexAttrib1hvNV +extrn __blue_glCore_glGenProgramsARB: qword +bluegl_glGenProgramsARB proc + mov r11, __blue_glCore_glGenProgramsARB jmp r11 -bluegl_glVertexAttrib1hvNV endp +bluegl_glGenProgramsARB endp -extrn __blue_glCore_glSecondaryColor3bv: qword -bluegl_glSecondaryColor3bv proc - mov r11, __blue_glCore_glSecondaryColor3bv +extrn __blue_glCore_glProgramEnvParameter4dARB: qword +bluegl_glProgramEnvParameter4dARB proc + mov r11, __blue_glCore_glProgramEnvParameter4dARB jmp r11 -bluegl_glSecondaryColor3bv endp +bluegl_glProgramEnvParameter4dARB endp -extrn __blue_glCore_glVDPAUMapSurfacesNV: qword -bluegl_glVDPAUMapSurfacesNV proc - mov r11, __blue_glCore_glVDPAUMapSurfacesNV +extrn __blue_glCore_glProgramEnvParameter4dvARB: qword +bluegl_glProgramEnvParameter4dvARB proc + mov r11, __blue_glCore_glProgramEnvParameter4dvARB jmp r11 -bluegl_glVDPAUMapSurfacesNV endp +bluegl_glProgramEnvParameter4dvARB endp -extrn __blue_glCore_glStencilMask: qword -bluegl_glStencilMask proc - mov r11, __blue_glCore_glStencilMask +extrn __blue_glCore_glProgramEnvParameter4fARB: qword +bluegl_glProgramEnvParameter4fARB proc + mov r11, __blue_glCore_glProgramEnvParameter4fARB jmp r11 -bluegl_glStencilMask endp +bluegl_glProgramEnvParameter4fARB endp -extrn __blue_glCore_glGetProgramResourceLocationIndex: qword -bluegl_glGetProgramResourceLocationIndex proc - mov r11, __blue_glCore_glGetProgramResourceLocationIndex +extrn __blue_glCore_glProgramEnvParameter4fvARB: qword +bluegl_glProgramEnvParameter4fvARB proc + mov r11, __blue_glCore_glProgramEnvParameter4fvARB jmp r11 -bluegl_glGetProgramResourceLocationIndex endp +bluegl_glProgramEnvParameter4fvARB endp -extrn __blue_glCore_glGetIntegerui64i_vNV: qword -bluegl_glGetIntegerui64i_vNV proc - mov r11, __blue_glCore_glGetIntegerui64i_vNV +extrn __blue_glCore_glProgramLocalParameter4dARB: qword +bluegl_glProgramLocalParameter4dARB proc + mov r11, __blue_glCore_glProgramLocalParameter4dARB jmp r11 -bluegl_glGetIntegerui64i_vNV endp +bluegl_glProgramLocalParameter4dARB endp -extrn __blue_glCore_glGetTextureLevelParameterfvEXT: qword -bluegl_glGetTextureLevelParameterfvEXT proc - mov r11, __blue_glCore_glGetTextureLevelParameterfvEXT +extrn __blue_glCore_glProgramLocalParameter4dvARB: qword +bluegl_glProgramLocalParameter4dvARB proc + mov r11, __blue_glCore_glProgramLocalParameter4dvARB jmp r11 -bluegl_glGetTextureLevelParameterfvEXT endp +bluegl_glProgramLocalParameter4dvARB endp -extrn __blue_glCore_glWindowPos3sv: qword -bluegl_glWindowPos3sv proc - mov r11, __blue_glCore_glWindowPos3sv +extrn __blue_glCore_glProgramLocalParameter4fARB: qword +bluegl_glProgramLocalParameter4fARB proc + mov r11, __blue_glCore_glProgramLocalParameter4fARB jmp r11 -bluegl_glWindowPos3sv endp +bluegl_glProgramLocalParameter4fARB endp -extrn __blue_glCore_glBlendEquationSeparatei: qword -bluegl_glBlendEquationSeparatei proc - mov r11, __blue_glCore_glBlendEquationSeparatei +extrn __blue_glCore_glProgramLocalParameter4fvARB: qword +bluegl_glProgramLocalParameter4fvARB proc + mov r11, __blue_glCore_glProgramLocalParameter4fvARB jmp r11 -bluegl_glBlendEquationSeparatei endp +bluegl_glProgramLocalParameter4fvARB endp -extrn __blue_glCore_glGetInfoLogARB: qword -bluegl_glGetInfoLogARB proc - mov r11, __blue_glCore_glGetInfoLogARB +extrn __blue_glCore_glGetProgramEnvParameterdvARB: qword +bluegl_glGetProgramEnvParameterdvARB proc + mov r11, __blue_glCore_glGetProgramEnvParameterdvARB jmp r11 -bluegl_glGetInfoLogARB endp +bluegl_glGetProgramEnvParameterdvARB endp -extrn __blue_glCore_glProgramNamedParameter4fNV: qword -bluegl_glProgramNamedParameter4fNV proc - mov r11, __blue_glCore_glProgramNamedParameter4fNV +extrn __blue_glCore_glGetProgramEnvParameterfvARB: qword +bluegl_glGetProgramEnvParameterfvARB proc + mov r11, __blue_glCore_glGetProgramEnvParameterfvARB jmp r11 -bluegl_glProgramNamedParameter4fNV endp +bluegl_glGetProgramEnvParameterfvARB endp -extrn __blue_glCore_glProgramParameter4fNV: qword -bluegl_glProgramParameter4fNV proc - mov r11, __blue_glCore_glProgramParameter4fNV +extrn __blue_glCore_glGetProgramLocalParameterdvARB: qword +bluegl_glGetProgramLocalParameterdvARB proc + mov r11, __blue_glCore_glGetProgramLocalParameterdvARB jmp r11 -bluegl_glProgramParameter4fNV endp +bluegl_glGetProgramLocalParameterdvARB endp -extrn __blue_glCore_glDeleteTextures: qword -bluegl_glDeleteTextures proc - mov r11, __blue_glCore_glDeleteTextures +extrn __blue_glCore_glGetProgramLocalParameterfvARB: qword +bluegl_glGetProgramLocalParameterfvARB proc + mov r11, __blue_glCore_glGetProgramLocalParameterfvARB jmp r11 -bluegl_glDeleteTextures endp +bluegl_glGetProgramLocalParameterfvARB endp -extrn __blue_glCore_glFramebufferDrawBuffersEXT: qword -bluegl_glFramebufferDrawBuffersEXT proc - mov r11, __blue_glCore_glFramebufferDrawBuffersEXT +extrn __blue_glCore_glGetProgramivARB: qword +bluegl_glGetProgramivARB proc + mov r11, __blue_glCore_glGetProgramivARB jmp r11 -bluegl_glFramebufferDrawBuffersEXT endp +bluegl_glGetProgramivARB endp -extrn __blue_glCore_glGetObjectLabelEXT: qword -bluegl_glGetObjectLabelEXT proc - mov r11, __blue_glCore_glGetObjectLabelEXT +extrn __blue_glCore_glGetProgramStringARB: qword +bluegl_glGetProgramStringARB proc + mov r11, __blue_glCore_glGetProgramStringARB jmp r11 -bluegl_glGetObjectLabelEXT endp +bluegl_glGetProgramStringARB endp -extrn __blue_glCore_glProgramUniform3ivEXT: qword -bluegl_glProgramUniform3ivEXT proc - mov r11, __blue_glCore_glProgramUniform3ivEXT +extrn __blue_glCore_glIsProgramARB: qword +bluegl_glIsProgramARB proc + mov r11, __blue_glCore_glIsProgramARB jmp r11 -bluegl_glProgramUniform3ivEXT endp +bluegl_glIsProgramARB endp -extrn __blue_glCore_glTextureParameterIiv: qword -bluegl_glTextureParameterIiv proc - mov r11, __blue_glCore_glTextureParameterIiv +extrn __blue_glCore_glProgramParameteriARB: qword +bluegl_glProgramParameteriARB proc + mov r11, __blue_glCore_glProgramParameteriARB jmp r11 -bluegl_glTextureParameterIiv endp +bluegl_glProgramParameteriARB endp -extrn __blue_glCore_glGetnUniformuiv: qword -bluegl_glGetnUniformuiv proc - mov r11, __blue_glCore_glGetnUniformuiv +extrn __blue_glCore_glFramebufferTextureARB: qword +bluegl_glFramebufferTextureARB proc + mov r11, __blue_glCore_glFramebufferTextureARB jmp r11 -bluegl_glGetnUniformuiv endp +bluegl_glFramebufferTextureARB endp -extrn __blue_glCore_glMapObjectBufferATI: qword -bluegl_glMapObjectBufferATI proc - mov r11, __blue_glCore_glMapObjectBufferATI +extrn __blue_glCore_glFramebufferTextureLayerARB: qword +bluegl_glFramebufferTextureLayerARB proc + mov r11, __blue_glCore_glFramebufferTextureLayerARB jmp r11 -bluegl_glMapObjectBufferATI endp +bluegl_glFramebufferTextureLayerARB endp -extrn __blue_glCore_glTangent3dvEXT: qword -bluegl_glTangent3dvEXT proc - mov r11, __blue_glCore_glTangent3dvEXT +extrn __blue_glCore_glFramebufferTextureFaceARB: qword +bluegl_glFramebufferTextureFaceARB proc + mov r11, __blue_glCore_glFramebufferTextureFaceARB jmp r11 -bluegl_glTangent3dvEXT endp +bluegl_glFramebufferTextureFaceARB endp -extrn __blue_glCore_glProgramParameter4dNV: qword -bluegl_glProgramParameter4dNV proc - mov r11, __blue_glCore_glProgramParameter4dNV +extrn __blue_glCore_glUniform1i64ARB: qword +bluegl_glUniform1i64ARB proc + mov r11, __blue_glCore_glUniform1i64ARB jmp r11 -bluegl_glProgramParameter4dNV endp +bluegl_glUniform1i64ARB endp -extrn __blue_glCore_glGenVertexArraysAPPLE: qword -bluegl_glGenVertexArraysAPPLE proc - mov r11, __blue_glCore_glGenVertexArraysAPPLE +extrn __blue_glCore_glUniform2i64ARB: qword +bluegl_glUniform2i64ARB proc + mov r11, __blue_glCore_glUniform2i64ARB jmp r11 -bluegl_glGenVertexArraysAPPLE endp +bluegl_glUniform2i64ARB endp -extrn __blue_glCore_glVertexAttrib4bvARB: qword -bluegl_glVertexAttrib4bvARB proc - mov r11, __blue_glCore_glVertexAttrib4bvARB +extrn __blue_glCore_glUniform3i64ARB: qword +bluegl_glUniform3i64ARB proc + mov r11, __blue_glCore_glUniform3i64ARB jmp r11 -bluegl_glVertexAttrib4bvARB endp +bluegl_glUniform3i64ARB endp -extrn __blue_glCore_glVertexStream1dATI: qword -bluegl_glVertexStream1dATI proc - mov r11, __blue_glCore_glVertexStream1dATI +extrn __blue_glCore_glUniform4i64ARB: qword +bluegl_glUniform4i64ARB proc + mov r11, __blue_glCore_glUniform4i64ARB jmp r11 -bluegl_glVertexStream1dATI endp +bluegl_glUniform4i64ARB endp -extrn __blue_glCore_glMultiTexCoord2svARB: qword -bluegl_glMultiTexCoord2svARB proc - mov r11, __blue_glCore_glMultiTexCoord2svARB +extrn __blue_glCore_glUniform1i64vARB: qword +bluegl_glUniform1i64vARB proc + mov r11, __blue_glCore_glUniform1i64vARB jmp r11 -bluegl_glMultiTexCoord2svARB endp +bluegl_glUniform1i64vARB endp -extrn __blue_glCore_glClearNamedBufferSubDataEXT: qword -bluegl_glClearNamedBufferSubDataEXT proc - mov r11, __blue_glCore_glClearNamedBufferSubDataEXT +extrn __blue_glCore_glUniform2i64vARB: qword +bluegl_glUniform2i64vARB proc + mov r11, __blue_glCore_glUniform2i64vARB jmp r11 -bluegl_glClearNamedBufferSubDataEXT endp +bluegl_glUniform2i64vARB endp -extrn __blue_glCore_glCompressedTextureSubImage3D: qword -bluegl_glCompressedTextureSubImage3D proc - mov r11, __blue_glCore_glCompressedTextureSubImage3D +extrn __blue_glCore_glUniform3i64vARB: qword +bluegl_glUniform3i64vARB proc + mov r11, __blue_glCore_glUniform3i64vARB jmp r11 -bluegl_glCompressedTextureSubImage3D endp +bluegl_glUniform3i64vARB endp -extrn __blue_glCore_glVertexAttribI4iEXT: qword -bluegl_glVertexAttribI4iEXT proc - mov r11, __blue_glCore_glVertexAttribI4iEXT +extrn __blue_glCore_glUniform4i64vARB: qword +bluegl_glUniform4i64vARB proc + mov r11, __blue_glCore_glUniform4i64vARB jmp r11 -bluegl_glVertexAttribI4iEXT endp +bluegl_glUniform4i64vARB endp -extrn __blue_glCore_glGetnPixelMapfvARB: qword -bluegl_glGetnPixelMapfvARB proc - mov r11, __blue_glCore_glGetnPixelMapfvARB +extrn __blue_glCore_glUniform1ui64ARB: qword +bluegl_glUniform1ui64ARB proc + mov r11, __blue_glCore_glUniform1ui64ARB jmp r11 -bluegl_glGetnPixelMapfvARB endp +bluegl_glUniform1ui64ARB endp -extrn __blue_glCore_glVertexStream4iATI: qword -bluegl_glVertexStream4iATI proc - mov r11, __blue_glCore_glVertexStream4iATI +extrn __blue_glCore_glUniform2ui64ARB: qword +bluegl_glUniform2ui64ARB proc + mov r11, __blue_glCore_glUniform2ui64ARB jmp r11 -bluegl_glVertexStream4iATI endp +bluegl_glUniform2ui64ARB endp -extrn __blue_glCore_glMatrixMultTransposedEXT: qword -bluegl_glMatrixMultTransposedEXT proc - mov r11, __blue_glCore_glMatrixMultTransposedEXT +extrn __blue_glCore_glUniform3ui64ARB: qword +bluegl_glUniform3ui64ARB proc + mov r11, __blue_glCore_glUniform3ui64ARB jmp r11 -bluegl_glMatrixMultTransposedEXT endp +bluegl_glUniform3ui64ARB endp -extrn __blue_glCore_glDisableVariantClientStateEXT: qword -bluegl_glDisableVariantClientStateEXT proc - mov r11, __blue_glCore_glDisableVariantClientStateEXT +extrn __blue_glCore_glUniform4ui64ARB: qword +bluegl_glUniform4ui64ARB proc + mov r11, __blue_glCore_glUniform4ui64ARB jmp r11 -bluegl_glDisableVariantClientStateEXT endp +bluegl_glUniform4ui64ARB endp -extrn __blue_glCore_glPrimitiveRestartNV: qword -bluegl_glPrimitiveRestartNV proc - mov r11, __blue_glCore_glPrimitiveRestartNV +extrn __blue_glCore_glUniform1ui64vARB: qword +bluegl_glUniform1ui64vARB proc + mov r11, __blue_glCore_glUniform1ui64vARB jmp r11 -bluegl_glPrimitiveRestartNV endp +bluegl_glUniform1ui64vARB endp -extrn __blue_glCore_glVertexAttribP4uiv: qword -bluegl_glVertexAttribP4uiv proc - mov r11, __blue_glCore_glVertexAttribP4uiv +extrn __blue_glCore_glUniform2ui64vARB: qword +bluegl_glUniform2ui64vARB proc + mov r11, __blue_glCore_glUniform2ui64vARB jmp r11 -bluegl_glVertexAttribP4uiv endp +bluegl_glUniform2ui64vARB endp -extrn __blue_glCore_glProgramUniformMatrix2fv: qword -bluegl_glProgramUniformMatrix2fv proc - mov r11, __blue_glCore_glProgramUniformMatrix2fv +extrn __blue_glCore_glUniform3ui64vARB: qword +bluegl_glUniform3ui64vARB proc + mov r11, __blue_glCore_glUniform3ui64vARB jmp r11 -bluegl_glProgramUniformMatrix2fv endp +bluegl_glUniform3ui64vARB endp -extrn __blue_glCore_glPolygonOffsetEXT: qword -bluegl_glPolygonOffsetEXT proc - mov r11, __blue_glCore_glPolygonOffsetEXT +extrn __blue_glCore_glUniform4ui64vARB: qword +bluegl_glUniform4ui64vARB proc + mov r11, __blue_glCore_glUniform4ui64vARB jmp r11 -bluegl_glPolygonOffsetEXT endp +bluegl_glUniform4ui64vARB endp -extrn __blue_glCore_glUseProgramObjectARB: qword -bluegl_glUseProgramObjectARB proc - mov r11, __blue_glCore_glUseProgramObjectARB +extrn __blue_glCore_glGetUniformi64vARB: qword +bluegl_glGetUniformi64vARB proc + mov r11, __blue_glCore_glGetUniformi64vARB jmp r11 -bluegl_glUseProgramObjectARB endp +bluegl_glGetUniformi64vARB endp -extrn __blue_glCore_glMatrixLoadfEXT: qword -bluegl_glMatrixLoadfEXT proc - mov r11, __blue_glCore_glMatrixLoadfEXT +extrn __blue_glCore_glGetUniformui64vARB: qword +bluegl_glGetUniformui64vARB proc + mov r11, __blue_glCore_glGetUniformui64vARB jmp r11 -bluegl_glMatrixLoadfEXT endp +bluegl_glGetUniformui64vARB endp -extrn __blue_glCore_glTextureSubImage1D: qword -bluegl_glTextureSubImage1D proc - mov r11, __blue_glCore_glTextureSubImage1D +extrn __blue_glCore_glGetnUniformi64vARB: qword +bluegl_glGetnUniformi64vARB proc + mov r11, __blue_glCore_glGetnUniformi64vARB jmp r11 -bluegl_glTextureSubImage1D endp +bluegl_glGetnUniformi64vARB endp -extrn __blue_glCore_glHistogramEXT: qword -bluegl_glHistogramEXT proc - mov r11, __blue_glCore_glHistogramEXT +extrn __blue_glCore_glGetnUniformui64vARB: qword +bluegl_glGetnUniformui64vARB proc + mov r11, __blue_glCore_glGetnUniformui64vARB jmp r11 -bluegl_glHistogramEXT endp +bluegl_glGetnUniformui64vARB endp -extrn __blue_glCore_glProgramUniform1ivEXT: qword -bluegl_glProgramUniform1ivEXT proc - mov r11, __blue_glCore_glProgramUniform1ivEXT +extrn __blue_glCore_glProgramUniform1i64ARB: qword +bluegl_glProgramUniform1i64ARB proc + mov r11, __blue_glCore_glProgramUniform1i64ARB jmp r11 -bluegl_glProgramUniform1ivEXT endp +bluegl_glProgramUniform1i64ARB endp -extrn __blue_glCore_glGetBufferParameterivARB: qword -bluegl_glGetBufferParameterivARB proc - mov r11, __blue_glCore_glGetBufferParameterivARB +extrn __blue_glCore_glProgramUniform2i64ARB: qword +bluegl_glProgramUniform2i64ARB proc + mov r11, __blue_glCore_glProgramUniform2i64ARB jmp r11 -bluegl_glGetBufferParameterivARB endp +bluegl_glProgramUniform2i64ARB endp -extrn __blue_glCore_glStringMarkerGREMEDY: qword -bluegl_glStringMarkerGREMEDY proc - mov r11, __blue_glCore_glStringMarkerGREMEDY +extrn __blue_glCore_glProgramUniform3i64ARB: qword +bluegl_glProgramUniform3i64ARB proc + mov r11, __blue_glCore_glProgramUniform3i64ARB jmp r11 -bluegl_glStringMarkerGREMEDY endp +bluegl_glProgramUniform3i64ARB endp -extrn __blue_glCore_glGetnMapfv: qword -bluegl_glGetnMapfv proc - mov r11, __blue_glCore_glGetnMapfv +extrn __blue_glCore_glProgramUniform4i64ARB: qword +bluegl_glProgramUniform4i64ARB proc + mov r11, __blue_glCore_glProgramUniform4i64ARB jmp r11 -bluegl_glGetnMapfv endp +bluegl_glProgramUniform4i64ARB endp -extrn __blue_glCore_glMultiTexCoord3dvARB: qword -bluegl_glMultiTexCoord3dvARB proc - mov r11, __blue_glCore_glMultiTexCoord3dvARB +extrn __blue_glCore_glProgramUniform1i64vARB: qword +bluegl_glProgramUniform1i64vARB proc + mov r11, __blue_glCore_glProgramUniform1i64vARB jmp r11 -bluegl_glMultiTexCoord3dvARB endp +bluegl_glProgramUniform1i64vARB endp -extrn __blue_glCore_glFinishTextureSUNX: qword -bluegl_glFinishTextureSUNX proc - mov r11, __blue_glCore_glFinishTextureSUNX +extrn __blue_glCore_glProgramUniform2i64vARB: qword +bluegl_glProgramUniform2i64vARB proc + mov r11, __blue_glCore_glProgramUniform2i64vARB jmp r11 -bluegl_glFinishTextureSUNX endp +bluegl_glProgramUniform2i64vARB endp -extrn __blue_glCore_glWindowPos3dARB: qword -bluegl_glWindowPos3dARB proc - mov r11, __blue_glCore_glWindowPos3dARB +extrn __blue_glCore_glProgramUniform3i64vARB: qword +bluegl_glProgramUniform3i64vARB proc + mov r11, __blue_glCore_glProgramUniform3i64vARB jmp r11 -bluegl_glWindowPos3dARB endp +bluegl_glProgramUniform3i64vARB endp -extrn __blue_glCore_glNamedBufferStorageEXT: qword -bluegl_glNamedBufferStorageEXT proc - mov r11, __blue_glCore_glNamedBufferStorageEXT +extrn __blue_glCore_glProgramUniform4i64vARB: qword +bluegl_glProgramUniform4i64vARB proc + mov r11, __blue_glCore_glProgramUniform4i64vARB jmp r11 -bluegl_glNamedBufferStorageEXT endp +bluegl_glProgramUniform4i64vARB endp -extrn __blue_glCore_glIndexPointerListIBM: qword -bluegl_glIndexPointerListIBM proc - mov r11, __blue_glCore_glIndexPointerListIBM +extrn __blue_glCore_glProgramUniform1ui64ARB: qword +bluegl_glProgramUniform1ui64ARB proc + mov r11, __blue_glCore_glProgramUniform1ui64ARB jmp r11 -bluegl_glIndexPointerListIBM endp +bluegl_glProgramUniform1ui64ARB endp -extrn __blue_glCore_glColor3fVertex3fSUN: qword -bluegl_glColor3fVertex3fSUN proc - mov r11, __blue_glCore_glColor3fVertex3fSUN +extrn __blue_glCore_glProgramUniform2ui64ARB: qword +bluegl_glProgramUniform2ui64ARB proc + mov r11, __blue_glCore_glProgramUniform2ui64ARB jmp r11 -bluegl_glColor3fVertex3fSUN endp +bluegl_glProgramUniform2ui64ARB endp -extrn __blue_glCore_glDepthRangefOES: qword -bluegl_glDepthRangefOES proc - mov r11, __blue_glCore_glDepthRangefOES +extrn __blue_glCore_glProgramUniform3ui64ARB: qword +bluegl_glProgramUniform3ui64ARB proc + mov r11, __blue_glCore_glProgramUniform3ui64ARB jmp r11 -bluegl_glDepthRangefOES endp +bluegl_glProgramUniform3ui64ARB endp -extrn __blue_glCore_glVertexBlendEnvfATI: qword -bluegl_glVertexBlendEnvfATI proc - mov r11, __blue_glCore_glVertexBlendEnvfATI +extrn __blue_glCore_glProgramUniform4ui64ARB: qword +bluegl_glProgramUniform4ui64ARB proc + mov r11, __blue_glCore_glProgramUniform4ui64ARB jmp r11 -bluegl_glVertexBlendEnvfATI endp +bluegl_glProgramUniform4ui64ARB endp -extrn __blue_glCore_glMultiTexCoord1hvNV: qword -bluegl_glMultiTexCoord1hvNV proc - mov r11, __blue_glCore_glMultiTexCoord1hvNV +extrn __blue_glCore_glProgramUniform1ui64vARB: qword +bluegl_glProgramUniform1ui64vARB proc + mov r11, __blue_glCore_glProgramUniform1ui64vARB jmp r11 -bluegl_glMultiTexCoord1hvNV endp +bluegl_glProgramUniform1ui64vARB endp -extrn __blue_glCore_glGetPixelTexGenParameterfvSGIS: qword -bluegl_glGetPixelTexGenParameterfvSGIS proc - mov r11, __blue_glCore_glGetPixelTexGenParameterfvSGIS +extrn __blue_glCore_glProgramUniform2ui64vARB: qword +bluegl_glProgramUniform2ui64vARB proc + mov r11, __blue_glCore_glProgramUniform2ui64vARB jmp r11 -bluegl_glGetPixelTexGenParameterfvSGIS endp +bluegl_glProgramUniform2ui64vARB endp -extrn __blue_glCore_glDisableClientStateIndexedEXT: qword -bluegl_glDisableClientStateIndexedEXT proc - mov r11, __blue_glCore_glDisableClientStateIndexedEXT +extrn __blue_glCore_glProgramUniform3ui64vARB: qword +bluegl_glProgramUniform3ui64vARB proc + mov r11, __blue_glCore_glProgramUniform3ui64vARB jmp r11 -bluegl_glDisableClientStateIndexedEXT endp +bluegl_glProgramUniform3ui64vARB endp -extrn __blue_glCore_glProgramUniform1ui64NV: qword -bluegl_glProgramUniform1ui64NV proc - mov r11, __blue_glCore_glProgramUniform1ui64NV +extrn __blue_glCore_glProgramUniform4ui64vARB: qword +bluegl_glProgramUniform4ui64vARB proc + mov r11, __blue_glCore_glProgramUniform4ui64vARB jmp r11 -bluegl_glProgramUniform1ui64NV endp +bluegl_glProgramUniform4ui64vARB endp -extrn __blue_glCore_glMultiTexCoord1dv: qword -bluegl_glMultiTexCoord1dv proc - mov r11, __blue_glCore_glMultiTexCoord1dv +extrn __blue_glCore_glColorTable: qword +bluegl_glColorTable proc + mov r11, __blue_glCore_glColorTable jmp r11 -bluegl_glMultiTexCoord1dv endp +bluegl_glColorTable endp -extrn __blue_glCore_glMultiTexCoord1ivARB: qword -bluegl_glMultiTexCoord1ivARB proc - mov r11, __blue_glCore_glMultiTexCoord1ivARB +extrn __blue_glCore_glColorTableParameterfv: qword +bluegl_glColorTableParameterfv proc + mov r11, __blue_glCore_glColorTableParameterfv jmp r11 -bluegl_glMultiTexCoord1ivARB endp +bluegl_glColorTableParameterfv endp -extrn __blue_glCore_glMapVertexAttrib1dAPPLE: qword -bluegl_glMapVertexAttrib1dAPPLE proc - mov r11, __blue_glCore_glMapVertexAttrib1dAPPLE +extrn __blue_glCore_glColorTableParameteriv: qword +bluegl_glColorTableParameteriv proc + mov r11, __blue_glCore_glColorTableParameteriv jmp r11 -bluegl_glMapVertexAttrib1dAPPLE endp +bluegl_glColorTableParameteriv endp -extrn __blue_glCore_glGetPerfQueryIdByNameINTEL: qword -bluegl_glGetPerfQueryIdByNameINTEL proc - mov r11, __blue_glCore_glGetPerfQueryIdByNameINTEL +extrn __blue_glCore_glCopyColorTable: qword +bluegl_glCopyColorTable proc + mov r11, __blue_glCore_glCopyColorTable jmp r11 -bluegl_glGetPerfQueryIdByNameINTEL endp +bluegl_glCopyColorTable endp -extrn __blue_glCore_glUniform2ui64vNV: qword -bluegl_glUniform2ui64vNV proc - mov r11, __blue_glCore_glUniform2ui64vNV +extrn __blue_glCore_glGetColorTable: qword +bluegl_glGetColorTable proc + mov r11, __blue_glCore_glGetColorTable jmp r11 -bluegl_glUniform2ui64vNV endp +bluegl_glGetColorTable endp -extrn __blue_glCore_glGetSharpenTexFuncSGIS: qword -bluegl_glGetSharpenTexFuncSGIS proc - mov r11, __blue_glCore_glGetSharpenTexFuncSGIS +extrn __blue_glCore_glGetColorTableParameterfv: qword +bluegl_glGetColorTableParameterfv proc + mov r11, __blue_glCore_glGetColorTableParameterfv jmp r11 -bluegl_glGetSharpenTexFuncSGIS endp +bluegl_glGetColorTableParameterfv endp -extrn __blue_glCore_glBindImageTexture: qword -bluegl_glBindImageTexture proc - mov r11, __blue_glCore_glBindImageTexture +extrn __blue_glCore_glGetColorTableParameteriv: qword +bluegl_glGetColorTableParameteriv proc + mov r11, __blue_glCore_glGetColorTableParameteriv jmp r11 -bluegl_glBindImageTexture endp +bluegl_glGetColorTableParameteriv endp -extrn __blue_glCore_glProgramEnvParameter4dvARB: qword -bluegl_glProgramEnvParameter4dvARB proc - mov r11, __blue_glCore_glProgramEnvParameter4dvARB +extrn __blue_glCore_glColorSubTable: qword +bluegl_glColorSubTable proc + mov r11, __blue_glCore_glColorSubTable jmp r11 -bluegl_glProgramEnvParameter4dvARB endp +bluegl_glColorSubTable endp -extrn __blue_glCore_glDeleteFramebuffers: qword -bluegl_glDeleteFramebuffers proc - mov r11, __blue_glCore_glDeleteFramebuffers +extrn __blue_glCore_glCopyColorSubTable: qword +bluegl_glCopyColorSubTable proc + mov r11, __blue_glCore_glCopyColorSubTable jmp r11 -bluegl_glDeleteFramebuffers endp +bluegl_glCopyColorSubTable endp -extrn __blue_glCore_glVertexArrayVertexOffsetEXT: qword -bluegl_glVertexArrayVertexOffsetEXT proc - mov r11, __blue_glCore_glVertexArrayVertexOffsetEXT +extrn __blue_glCore_glConvolutionFilter1D: qword +bluegl_glConvolutionFilter1D proc + mov r11, __blue_glCore_glConvolutionFilter1D jmp r11 -bluegl_glVertexArrayVertexOffsetEXT endp +bluegl_glConvolutionFilter1D endp -extrn __blue_glCore_glProgramLocalParameters4fvEXT: qword -bluegl_glProgramLocalParameters4fvEXT proc - mov r11, __blue_glCore_glProgramLocalParameters4fvEXT +extrn __blue_glCore_glConvolutionFilter2D: qword +bluegl_glConvolutionFilter2D proc + mov r11, __blue_glCore_glConvolutionFilter2D jmp r11 -bluegl_glProgramLocalParameters4fvEXT endp +bluegl_glConvolutionFilter2D endp -extrn __blue_glCore_glFogCoordFormatNV: qword -bluegl_glFogCoordFormatNV proc - mov r11, __blue_glCore_glFogCoordFormatNV +extrn __blue_glCore_glConvolutionParameterf: qword +bluegl_glConvolutionParameterf proc + mov r11, __blue_glCore_glConvolutionParameterf jmp r11 -bluegl_glFogCoordFormatNV endp +bluegl_glConvolutionParameterf endp -extrn __blue_glCore_glGenQueries: qword -bluegl_glGenQueries proc - mov r11, __blue_glCore_glGenQueries +extrn __blue_glCore_glConvolutionParameterfv: qword +bluegl_glConvolutionParameterfv proc + mov r11, __blue_glCore_glConvolutionParameterfv jmp r11 -bluegl_glGenQueries endp +bluegl_glConvolutionParameterfv endp -extrn __blue_glCore_glVertexAttribL4dEXT: qword -bluegl_glVertexAttribL4dEXT proc - mov r11, __blue_glCore_glVertexAttribL4dEXT +extrn __blue_glCore_glConvolutionParameteri: qword +bluegl_glConvolutionParameteri proc + mov r11, __blue_glCore_glConvolutionParameteri jmp r11 -bluegl_glVertexAttribL4dEXT endp +bluegl_glConvolutionParameteri endp -extrn __blue_glCore_glMultiTexCoord4fvARB: qword -bluegl_glMultiTexCoord4fvARB proc - mov r11, __blue_glCore_glMultiTexCoord4fvARB +extrn __blue_glCore_glConvolutionParameteriv: qword +bluegl_glConvolutionParameteriv proc + mov r11, __blue_glCore_glConvolutionParameteriv jmp r11 -bluegl_glMultiTexCoord4fvARB endp +bluegl_glConvolutionParameteriv endp -extrn __blue_glCore_glPixelZoomxOES: qword -bluegl_glPixelZoomxOES proc - mov r11, __blue_glCore_glPixelZoomxOES +extrn __blue_glCore_glCopyConvolutionFilter1D: qword +bluegl_glCopyConvolutionFilter1D proc + mov r11, __blue_glCore_glCopyConvolutionFilter1D jmp r11 -bluegl_glPixelZoomxOES endp +bluegl_glCopyConvolutionFilter1D endp -extrn __blue_glCore_glCopyTexSubImage3D: qword -bluegl_glCopyTexSubImage3D proc - mov r11, __blue_glCore_glCopyTexSubImage3D +extrn __blue_glCore_glCopyConvolutionFilter2D: qword +bluegl_glCopyConvolutionFilter2D proc + mov r11, __blue_glCore_glCopyConvolutionFilter2D jmp r11 -bluegl_glCopyTexSubImage3D endp +bluegl_glCopyConvolutionFilter2D endp -extrn __blue_glCore_glUniform1ui64vARB: qword -bluegl_glUniform1ui64vARB proc - mov r11, __blue_glCore_glUniform1ui64vARB +extrn __blue_glCore_glGetConvolutionFilter: qword +bluegl_glGetConvolutionFilter proc + mov r11, __blue_glCore_glGetConvolutionFilter jmp r11 -bluegl_glUniform1ui64vARB endp +bluegl_glGetConvolutionFilter endp -extrn __blue_glCore_glGetMapControlPointsNV: qword -bluegl_glGetMapControlPointsNV proc - mov r11, __blue_glCore_glGetMapControlPointsNV +extrn __blue_glCore_glGetConvolutionParameterfv: qword +bluegl_glGetConvolutionParameterfv proc + mov r11, __blue_glCore_glGetConvolutionParameterfv jmp r11 -bluegl_glGetMapControlPointsNV endp +bluegl_glGetConvolutionParameterfv endp -extrn __blue_glCore_glLightEnviSGIX: qword -bluegl_glLightEnviSGIX proc - mov r11, __blue_glCore_glLightEnviSGIX +extrn __blue_glCore_glGetConvolutionParameteriv: qword +bluegl_glGetConvolutionParameteriv proc + mov r11, __blue_glCore_glGetConvolutionParameteriv jmp r11 -bluegl_glLightEnviSGIX endp +bluegl_glGetConvolutionParameteriv endp -extrn __blue_glCore_glVertexAttrib4Nbv: qword -bluegl_glVertexAttrib4Nbv proc - mov r11, __blue_glCore_glVertexAttrib4Nbv +extrn __blue_glCore_glGetSeparableFilter: qword +bluegl_glGetSeparableFilter proc + mov r11, __blue_glCore_glGetSeparableFilter jmp r11 -bluegl_glVertexAttrib4Nbv endp +bluegl_glGetSeparableFilter endp -extrn __blue_glCore_glDrawBuffer: qword -bluegl_glDrawBuffer proc - mov r11, __blue_glCore_glDrawBuffer +extrn __blue_glCore_glSeparableFilter2D: qword +bluegl_glSeparableFilter2D proc + mov r11, __blue_glCore_glSeparableFilter2D jmp r11 -bluegl_glDrawBuffer endp +bluegl_glSeparableFilter2D endp -extrn __blue_glCore_glDrawTransformFeedbackStream: qword -bluegl_glDrawTransformFeedbackStream proc - mov r11, __blue_glCore_glDrawTransformFeedbackStream +extrn __blue_glCore_glGetHistogram: qword +bluegl_glGetHistogram proc + mov r11, __blue_glCore_glGetHistogram jmp r11 -bluegl_glDrawTransformFeedbackStream endp +bluegl_glGetHistogram endp -extrn __blue_glCore_glDisableClientStateiEXT: qword -bluegl_glDisableClientStateiEXT proc - mov r11, __blue_glCore_glDisableClientStateiEXT +extrn __blue_glCore_glGetHistogramParameterfv: qword +bluegl_glGetHistogramParameterfv proc + mov r11, __blue_glCore_glGetHistogramParameterfv jmp r11 -bluegl_glDisableClientStateiEXT endp +bluegl_glGetHistogramParameterfv endp -extrn __blue_glCore_glFramebufferTexture3D: qword -bluegl_glFramebufferTexture3D proc - mov r11, __blue_glCore_glFramebufferTexture3D +extrn __blue_glCore_glGetHistogramParameteriv: qword +bluegl_glGetHistogramParameteriv proc + mov r11, __blue_glCore_glGetHistogramParameteriv jmp r11 -bluegl_glFramebufferTexture3D endp +bluegl_glGetHistogramParameteriv endp -extrn __blue_glCore_glTextureColorMaskSGIS: qword -bluegl_glTextureColorMaskSGIS proc - mov r11, __blue_glCore_glTextureColorMaskSGIS +extrn __blue_glCore_glGetMinmax: qword +bluegl_glGetMinmax proc + mov r11, __blue_glCore_glGetMinmax jmp r11 -bluegl_glTextureColorMaskSGIS endp +bluegl_glGetMinmax endp -extrn __blue_glCore_glCullFace: qword -bluegl_glCullFace proc - mov r11, __blue_glCore_glCullFace +extrn __blue_glCore_glGetMinmaxParameterfv: qword +bluegl_glGetMinmaxParameterfv proc + mov r11, __blue_glCore_glGetMinmaxParameterfv jmp r11 -bluegl_glCullFace endp +bluegl_glGetMinmaxParameterfv endp -extrn __blue_glCore_glGetNamedBufferSubData: qword -bluegl_glGetNamedBufferSubData proc - mov r11, __blue_glCore_glGetNamedBufferSubData +extrn __blue_glCore_glGetMinmaxParameteriv: qword +bluegl_glGetMinmaxParameteriv proc + mov r11, __blue_glCore_glGetMinmaxParameteriv jmp r11 -bluegl_glGetNamedBufferSubData endp +bluegl_glGetMinmaxParameteriv endp -extrn __blue_glCore_glDispatchCompute: qword -bluegl_glDispatchCompute proc - mov r11, __blue_glCore_glDispatchCompute +extrn __blue_glCore_glHistogram: qword +bluegl_glHistogram proc + mov r11, __blue_glCore_glHistogram jmp r11 -bluegl_glDispatchCompute endp +bluegl_glHistogram endp -extrn __blue_glCore_glInvalidateFramebuffer: qword -bluegl_glInvalidateFramebuffer proc - mov r11, __blue_glCore_glInvalidateFramebuffer +extrn __blue_glCore_glMinmax: qword +bluegl_glMinmax proc + mov r11, __blue_glCore_glMinmax jmp r11 -bluegl_glInvalidateFramebuffer endp +bluegl_glMinmax endp -extrn __blue_glCore_glDebugMessageControl: qword -bluegl_glDebugMessageControl proc - mov r11, __blue_glCore_glDebugMessageControl +extrn __blue_glCore_glResetHistogram: qword +bluegl_glResetHistogram proc + mov r11, __blue_glCore_glResetHistogram jmp r11 -bluegl_glDebugMessageControl endp +bluegl_glResetHistogram endp -extrn __blue_glCore_glProgramUniformMatrix3dv: qword -bluegl_glProgramUniformMatrix3dv proc - mov r11, __blue_glCore_glProgramUniformMatrix3dv +extrn __blue_glCore_glResetMinmax: qword +bluegl_glResetMinmax proc + mov r11, __blue_glCore_glResetMinmax jmp r11 -bluegl_glProgramUniformMatrix3dv endp +bluegl_glResetMinmax endp -extrn __blue_glCore_glSecondaryColor3ui: qword -bluegl_glSecondaryColor3ui proc - mov r11, __blue_glCore_glSecondaryColor3ui +extrn __blue_glCore_glVertexAttribDivisorARB: qword +bluegl_glVertexAttribDivisorARB proc + mov r11, __blue_glCore_glVertexAttribDivisorARB jmp r11 -bluegl_glSecondaryColor3ui endp +bluegl_glVertexAttribDivisorARB endp -extrn __blue_glCore_glShaderStorageBlockBinding: qword -bluegl_glShaderStorageBlockBinding proc - mov r11, __blue_glCore_glShaderStorageBlockBinding +extrn __blue_glCore_glCurrentPaletteMatrixARB: qword +bluegl_glCurrentPaletteMatrixARB proc + mov r11, __blue_glCore_glCurrentPaletteMatrixARB jmp r11 -bluegl_glShaderStorageBlockBinding endp +bluegl_glCurrentPaletteMatrixARB endp -extrn __blue_glCore_glUniformMatrix3fvARB: qword -bluegl_glUniformMatrix3fvARB proc - mov r11, __blue_glCore_glUniformMatrix3fvARB +extrn __blue_glCore_glMatrixIndexubvARB: qword +bluegl_glMatrixIndexubvARB proc + mov r11, __blue_glCore_glMatrixIndexubvARB jmp r11 -bluegl_glUniformMatrix3fvARB endp +bluegl_glMatrixIndexubvARB endp -extrn __blue_glCore_glGetUniformOffsetEXT: qword -bluegl_glGetUniformOffsetEXT proc - mov r11, __blue_glCore_glGetUniformOffsetEXT +extrn __blue_glCore_glMatrixIndexusvARB: qword +bluegl_glMatrixIndexusvARB proc + mov r11, __blue_glCore_glMatrixIndexusvARB jmp r11 -bluegl_glGetUniformOffsetEXT endp +bluegl_glMatrixIndexusvARB endp -extrn __blue_glCore_glBinormal3fvEXT: qword -bluegl_glBinormal3fvEXT proc - mov r11, __blue_glCore_glBinormal3fvEXT +extrn __blue_glCore_glMatrixIndexuivARB: qword +bluegl_glMatrixIndexuivARB proc + mov r11, __blue_glCore_glMatrixIndexuivARB jmp r11 -bluegl_glBinormal3fvEXT endp +bluegl_glMatrixIndexuivARB endp -extrn __blue_glCore_glMultiTexCoordPointerEXT: qword -bluegl_glMultiTexCoordPointerEXT proc - mov r11, __blue_glCore_glMultiTexCoordPointerEXT +extrn __blue_glCore_glMatrixIndexPointerARB: qword +bluegl_glMatrixIndexPointerARB proc + mov r11, __blue_glCore_glMatrixIndexPointerARB jmp r11 -bluegl_glMultiTexCoordPointerEXT endp +bluegl_glMatrixIndexPointerARB endp -extrn __blue_glCore_glVertexAttrib4sv: qword -bluegl_glVertexAttrib4sv proc - mov r11, __blue_glCore_glVertexAttrib4sv +extrn __blue_glCore_glSampleCoverageARB: qword +bluegl_glSampleCoverageARB proc + mov r11, __blue_glCore_glSampleCoverageARB jmp r11 -bluegl_glVertexAttrib4sv endp +bluegl_glSampleCoverageARB endp -extrn __blue_glCore_glMatrixIndexubvARB: qword -bluegl_glMatrixIndexubvARB proc - mov r11, __blue_glCore_glMatrixIndexubvARB +extrn __blue_glCore_glActiveTextureARB: qword +bluegl_glActiveTextureARB proc + mov r11, __blue_glCore_glActiveTextureARB jmp r11 -bluegl_glMatrixIndexubvARB endp +bluegl_glActiveTextureARB endp -extrn __blue_glCore_glProgramUniform4ivEXT: qword -bluegl_glProgramUniform4ivEXT proc - mov r11, __blue_glCore_glProgramUniform4ivEXT +extrn __blue_glCore_glClientActiveTextureARB: qword +bluegl_glClientActiveTextureARB proc + mov r11, __blue_glCore_glClientActiveTextureARB jmp r11 -bluegl_glProgramUniform4ivEXT endp +bluegl_glClientActiveTextureARB endp -extrn __blue_glCore_glWindowPos4dMESA: qword -bluegl_glWindowPos4dMESA proc - mov r11, __blue_glCore_glWindowPos4dMESA +extrn __blue_glCore_glMultiTexCoord1dARB: qword +bluegl_glMultiTexCoord1dARB proc + mov r11, __blue_glCore_glMultiTexCoord1dARB jmp r11 -bluegl_glWindowPos4dMESA endp +bluegl_glMultiTexCoord1dARB endp -extrn __blue_glCore_glMultiDrawElementsIndirectCountARB: qword -bluegl_glMultiDrawElementsIndirectCountARB proc - mov r11, __blue_glCore_glMultiDrawElementsIndirectCountARB +extrn __blue_glCore_glMultiTexCoord1dvARB: qword +bluegl_glMultiTexCoord1dvARB proc + mov r11, __blue_glCore_glMultiTexCoord1dvARB jmp r11 -bluegl_glMultiDrawElementsIndirectCountARB endp +bluegl_glMultiTexCoord1dvARB endp -extrn __blue_glCore_glUniformMatrix4fvARB: qword -bluegl_glUniformMatrix4fvARB proc - mov r11, __blue_glCore_glUniformMatrix4fvARB +extrn __blue_glCore_glMultiTexCoord1fARB: qword +bluegl_glMultiTexCoord1fARB proc + mov r11, __blue_glCore_glMultiTexCoord1fARB jmp r11 -bluegl_glUniformMatrix4fvARB endp +bluegl_glMultiTexCoord1fARB endp -extrn __blue_glCore_glBindImageTextureEXT: qword -bluegl_glBindImageTextureEXT proc - mov r11, __blue_glCore_glBindImageTextureEXT +extrn __blue_glCore_glMultiTexCoord1fvARB: qword +bluegl_glMultiTexCoord1fvARB proc + mov r11, __blue_glCore_glMultiTexCoord1fvARB jmp r11 -bluegl_glBindImageTextureEXT endp +bluegl_glMultiTexCoord1fvARB endp -extrn __blue_glCore_glResolveDepthValuesNV: qword -bluegl_glResolveDepthValuesNV proc - mov r11, __blue_glCore_glResolveDepthValuesNV +extrn __blue_glCore_glMultiTexCoord1iARB: qword +bluegl_glMultiTexCoord1iARB proc + mov r11, __blue_glCore_glMultiTexCoord1iARB jmp r11 -bluegl_glResolveDepthValuesNV endp +bluegl_glMultiTexCoord1iARB endp -extrn __blue_glCore_glColor3fVertex3fvSUN: qword -bluegl_glColor3fVertex3fvSUN proc - mov r11, __blue_glCore_glColor3fVertex3fvSUN +extrn __blue_glCore_glMultiTexCoord1ivARB: qword +bluegl_glMultiTexCoord1ivARB proc + mov r11, __blue_glCore_glMultiTexCoord1ivARB jmp r11 -bluegl_glColor3fVertex3fvSUN endp +bluegl_glMultiTexCoord1ivARB endp -extrn __blue_glCore_glCompressedTexImage1D: qword -bluegl_glCompressedTexImage1D proc - mov r11, __blue_glCore_glCompressedTexImage1D +extrn __blue_glCore_glMultiTexCoord1sARB: qword +bluegl_glMultiTexCoord1sARB proc + mov r11, __blue_glCore_glMultiTexCoord1sARB jmp r11 -bluegl_glCompressedTexImage1D endp +bluegl_glMultiTexCoord1sARB endp -extrn __blue_glCore_glGetnUniformdvARB: qword -bluegl_glGetnUniformdvARB proc - mov r11, __blue_glCore_glGetnUniformdvARB +extrn __blue_glCore_glMultiTexCoord1svARB: qword +bluegl_glMultiTexCoord1svARB proc + mov r11, __blue_glCore_glMultiTexCoord1svARB jmp r11 -bluegl_glGetnUniformdvARB endp +bluegl_glMultiTexCoord1svARB endp -extrn __blue_glCore_glUniform1ui64vNV: qword -bluegl_glUniform1ui64vNV proc - mov r11, __blue_glCore_glUniform1ui64vNV +extrn __blue_glCore_glMultiTexCoord2dARB: qword +bluegl_glMultiTexCoord2dARB proc + mov r11, __blue_glCore_glMultiTexCoord2dARB jmp r11 -bluegl_glUniform1ui64vNV endp +bluegl_glMultiTexCoord2dARB endp -extrn __blue_glCore_glProgramEnvParameterI4uiNV: qword -bluegl_glProgramEnvParameterI4uiNV proc - mov r11, __blue_glCore_glProgramEnvParameterI4uiNV +extrn __blue_glCore_glMultiTexCoord2dvARB: qword +bluegl_glMultiTexCoord2dvARB proc + mov r11, __blue_glCore_glMultiTexCoord2dvARB jmp r11 -bluegl_glProgramEnvParameterI4uiNV endp +bluegl_glMultiTexCoord2dvARB endp -extrn __blue_glCore_glVertexAttrib4ubNV: qword -bluegl_glVertexAttrib4ubNV proc - mov r11, __blue_glCore_glVertexAttrib4ubNV +extrn __blue_glCore_glMultiTexCoord2fARB: qword +bluegl_glMultiTexCoord2fARB proc + mov r11, __blue_glCore_glMultiTexCoord2fARB jmp r11 -bluegl_glVertexAttrib4ubNV endp +bluegl_glMultiTexCoord2fARB endp -extrn __blue_glCore_glGenAsyncMarkersSGIX: qword -bluegl_glGenAsyncMarkersSGIX proc - mov r11, __blue_glCore_glGenAsyncMarkersSGIX +extrn __blue_glCore_glMultiTexCoord2fvARB: qword +bluegl_glMultiTexCoord2fvARB proc + mov r11, __blue_glCore_glMultiTexCoord2fvARB jmp r11 -bluegl_glGenAsyncMarkersSGIX endp +bluegl_glMultiTexCoord2fvARB endp -extrn __blue_glCore_glVertexBindingDivisor: qword -bluegl_glVertexBindingDivisor proc - mov r11, __blue_glCore_glVertexBindingDivisor +extrn __blue_glCore_glMultiTexCoord2iARB: qword +bluegl_glMultiTexCoord2iARB proc + mov r11, __blue_glCore_glMultiTexCoord2iARB jmp r11 -bluegl_glVertexBindingDivisor endp +bluegl_glMultiTexCoord2iARB endp -extrn __blue_glCore_glCreateShaderProgramv: qword -bluegl_glCreateShaderProgramv proc - mov r11, __blue_glCore_glCreateShaderProgramv +extrn __blue_glCore_glMultiTexCoord2ivARB: qword +bluegl_glMultiTexCoord2ivARB proc + mov r11, __blue_glCore_glMultiTexCoord2ivARB jmp r11 -bluegl_glCreateShaderProgramv endp +bluegl_glMultiTexCoord2ivARB endp -extrn __blue_glCore_glBindBufferARB: qword -bluegl_glBindBufferARB proc - mov r11, __blue_glCore_glBindBufferARB +extrn __blue_glCore_glMultiTexCoord2sARB: qword +bluegl_glMultiTexCoord2sARB proc + mov r11, __blue_glCore_glMultiTexCoord2sARB jmp r11 -bluegl_glBindBufferARB endp +bluegl_glMultiTexCoord2sARB endp -extrn __blue_glCore_glColor4ubVertex2fvSUN: qword -bluegl_glColor4ubVertex2fvSUN proc - mov r11, __blue_glCore_glColor4ubVertex2fvSUN +extrn __blue_glCore_glMultiTexCoord2svARB: qword +bluegl_glMultiTexCoord2svARB proc + mov r11, __blue_glCore_glMultiTexCoord2svARB jmp r11 -bluegl_glColor4ubVertex2fvSUN endp +bluegl_glMultiTexCoord2svARB endp -extrn __blue_glCore_glResetHistogram: qword -bluegl_glResetHistogram proc - mov r11, __blue_glCore_glResetHistogram +extrn __blue_glCore_glMultiTexCoord3dARB: qword +bluegl_glMultiTexCoord3dARB proc + mov r11, __blue_glCore_glMultiTexCoord3dARB jmp r11 -bluegl_glResetHistogram endp +bluegl_glMultiTexCoord3dARB endp -extrn __blue_glCore_glGetProgramResourceLocation: qword -bluegl_glGetProgramResourceLocation proc - mov r11, __blue_glCore_glGetProgramResourceLocation +extrn __blue_glCore_glMultiTexCoord3dvARB: qword +bluegl_glMultiTexCoord3dvARB proc + mov r11, __blue_glCore_glMultiTexCoord3dvARB jmp r11 -bluegl_glGetProgramResourceLocation endp +bluegl_glMultiTexCoord3dvARB endp -extrn __blue_glCore_glBlendFuncSeparateiARB: qword -bluegl_glBlendFuncSeparateiARB proc - mov r11, __blue_glCore_glBlendFuncSeparateiARB +extrn __blue_glCore_glMultiTexCoord3fARB: qword +bluegl_glMultiTexCoord3fARB proc + mov r11, __blue_glCore_glMultiTexCoord3fARB jmp r11 -bluegl_glBlendFuncSeparateiARB endp +bluegl_glMultiTexCoord3fARB endp -extrn __blue_glCore_glBinormalPointerEXT: qword -bluegl_glBinormalPointerEXT proc - mov r11, __blue_glCore_glBinormalPointerEXT +extrn __blue_glCore_glMultiTexCoord3fvARB: qword +bluegl_glMultiTexCoord3fvARB proc + mov r11, __blue_glCore_glMultiTexCoord3fvARB jmp r11 -bluegl_glBinormalPointerEXT endp +bluegl_glMultiTexCoord3fvARB endp -extrn __blue_glCore_glVertexAttrib2svNV: qword -bluegl_glVertexAttrib2svNV proc - mov r11, __blue_glCore_glVertexAttrib2svNV +extrn __blue_glCore_glMultiTexCoord3iARB: qword +bluegl_glMultiTexCoord3iARB proc + mov r11, __blue_glCore_glMultiTexCoord3iARB jmp r11 -bluegl_glVertexAttrib2svNV endp +bluegl_glMultiTexCoord3iARB endp -extrn __blue_glCore_glProgramUniform2i64vNV: qword -bluegl_glProgramUniform2i64vNV proc - mov r11, __blue_glCore_glProgramUniform2i64vNV +extrn __blue_glCore_glMultiTexCoord3ivARB: qword +bluegl_glMultiTexCoord3ivARB proc + mov r11, __blue_glCore_glMultiTexCoord3ivARB jmp r11 -bluegl_glProgramUniform2i64vNV endp +bluegl_glMultiTexCoord3ivARB endp -extrn __blue_glCore_glTextureNormalEXT: qword -bluegl_glTextureNormalEXT proc - mov r11, __blue_glCore_glTextureNormalEXT +extrn __blue_glCore_glMultiTexCoord3sARB: qword +bluegl_glMultiTexCoord3sARB proc + mov r11, __blue_glCore_glMultiTexCoord3sARB jmp r11 -bluegl_glTextureNormalEXT endp +bluegl_glMultiTexCoord3sARB endp -extrn __blue_glCore_glFlushMappedBufferRangeAPPLE: qword -bluegl_glFlushMappedBufferRangeAPPLE proc - mov r11, __blue_glCore_glFlushMappedBufferRangeAPPLE +extrn __blue_glCore_glMultiTexCoord3svARB: qword +bluegl_glMultiTexCoord3svARB proc + mov r11, __blue_glCore_glMultiTexCoord3svARB jmp r11 -bluegl_glFlushMappedBufferRangeAPPLE endp +bluegl_glMultiTexCoord3svARB endp -extrn __blue_glCore_glSecondaryColor3dv: qword -bluegl_glSecondaryColor3dv proc - mov r11, __blue_glCore_glSecondaryColor3dv +extrn __blue_glCore_glMultiTexCoord4dARB: qword +bluegl_glMultiTexCoord4dARB proc + mov r11, __blue_glCore_glMultiTexCoord4dARB jmp r11 -bluegl_glSecondaryColor3dv endp +bluegl_glMultiTexCoord4dARB endp -extrn __blue_glCore_glColorP3uiv: qword -bluegl_glColorP3uiv proc - mov r11, __blue_glCore_glColorP3uiv +extrn __blue_glCore_glMultiTexCoord4dvARB: qword +bluegl_glMultiTexCoord4dvARB proc + mov r11, __blue_glCore_glMultiTexCoord4dvARB jmp r11 -bluegl_glColorP3uiv endp +bluegl_glMultiTexCoord4dvARB endp -extrn __blue_glCore_glUniformMatrix4x2dv: qword -bluegl_glUniformMatrix4x2dv proc - mov r11, __blue_glCore_glUniformMatrix4x2dv +extrn __blue_glCore_glMultiTexCoord4fARB: qword +bluegl_glMultiTexCoord4fARB proc + mov r11, __blue_glCore_glMultiTexCoord4fARB jmp r11 -bluegl_glUniformMatrix4x2dv endp +bluegl_glMultiTexCoord4fARB endp -extrn __blue_glCore_glTexCoordP3ui: qword -bluegl_glTexCoordP3ui proc - mov r11, __blue_glCore_glTexCoordP3ui +extrn __blue_glCore_glMultiTexCoord4fvARB: qword +bluegl_glMultiTexCoord4fvARB proc + mov r11, __blue_glCore_glMultiTexCoord4fvARB jmp r11 -bluegl_glTexCoordP3ui endp +bluegl_glMultiTexCoord4fvARB endp -extrn __blue_glCore_glNamedBufferSubDataEXT: qword -bluegl_glNamedBufferSubDataEXT proc - mov r11, __blue_glCore_glNamedBufferSubDataEXT +extrn __blue_glCore_glMultiTexCoord4iARB: qword +bluegl_glMultiTexCoord4iARB proc + mov r11, __blue_glCore_glMultiTexCoord4iARB jmp r11 -bluegl_glNamedBufferSubDataEXT endp +bluegl_glMultiTexCoord4iARB endp -extrn __blue_glCore_glProvokingVertexEXT: qword -bluegl_glProvokingVertexEXT proc - mov r11, __blue_glCore_glProvokingVertexEXT +extrn __blue_glCore_glMultiTexCoord4ivARB: qword +bluegl_glMultiTexCoord4ivARB proc + mov r11, __blue_glCore_glMultiTexCoord4ivARB jmp r11 -bluegl_glProvokingVertexEXT endp +bluegl_glMultiTexCoord4ivARB endp -extrn __blue_glCore_glWeightbvARB: qword -bluegl_glWeightbvARB proc - mov r11, __blue_glCore_glWeightbvARB +extrn __blue_glCore_glMultiTexCoord4sARB: qword +bluegl_glMultiTexCoord4sARB proc + mov r11, __blue_glCore_glMultiTexCoord4sARB jmp r11 -bluegl_glWeightbvARB endp +bluegl_glMultiTexCoord4sARB endp -extrn __blue_glCore_glInvalidateNamedFramebufferData: qword -bluegl_glInvalidateNamedFramebufferData proc - mov r11, __blue_glCore_glInvalidateNamedFramebufferData +extrn __blue_glCore_glMultiTexCoord4svARB: qword +bluegl_glMultiTexCoord4svARB proc + mov r11, __blue_glCore_glMultiTexCoord4svARB jmp r11 -bluegl_glInvalidateNamedFramebufferData endp +bluegl_glMultiTexCoord4svARB endp -extrn __blue_glCore_glGetArrayObjectfvATI: qword -bluegl_glGetArrayObjectfvATI proc - mov r11, __blue_glCore_glGetArrayObjectfvATI +extrn __blue_glCore_glGenQueriesARB: qword +bluegl_glGenQueriesARB proc + mov r11, __blue_glCore_glGenQueriesARB jmp r11 -bluegl_glGetArrayObjectfvATI endp +bluegl_glGenQueriesARB endp -extrn __blue_glCore_glIsSampler: qword -bluegl_glIsSampler proc - mov r11, __blue_glCore_glIsSampler +extrn __blue_glCore_glDeleteQueriesARB: qword +bluegl_glDeleteQueriesARB proc + mov r11, __blue_glCore_glDeleteQueriesARB jmp r11 -bluegl_glIsSampler endp +bluegl_glDeleteQueriesARB endp -extrn __blue_glCore_glNormalStream3dvATI: qword -bluegl_glNormalStream3dvATI proc - mov r11, __blue_glCore_glNormalStream3dvATI +extrn __blue_glCore_glIsQueryARB: qword +bluegl_glIsQueryARB proc + mov r11, __blue_glCore_glIsQueryARB jmp r11 -bluegl_glNormalStream3dvATI endp +bluegl_glIsQueryARB endp -extrn __blue_glCore_glVertexAttribL4i64vNV: qword -bluegl_glVertexAttribL4i64vNV proc - mov r11, __blue_glCore_glVertexAttribL4i64vNV +extrn __blue_glCore_glBeginQueryARB: qword +bluegl_glBeginQueryARB proc + mov r11, __blue_glCore_glBeginQueryARB jmp r11 -bluegl_glVertexAttribL4i64vNV endp +bluegl_glBeginQueryARB endp -extrn __blue_glCore_glValidateProgramARB: qword -bluegl_glValidateProgramARB proc - mov r11, __blue_glCore_glValidateProgramARB +extrn __blue_glCore_glEndQueryARB: qword +bluegl_glEndQueryARB proc + mov r11, __blue_glCore_glEndQueryARB jmp r11 -bluegl_glValidateProgramARB endp +bluegl_glEndQueryARB endp -extrn __blue_glCore_glUniform3ui: qword -bluegl_glUniform3ui proc - mov r11, __blue_glCore_glUniform3ui +extrn __blue_glCore_glGetQueryivARB: qword +bluegl_glGetQueryivARB proc + mov r11, __blue_glCore_glGetQueryivARB jmp r11 -bluegl_glUniform3ui endp +bluegl_glGetQueryivARB endp -extrn __blue_glCore_glTransformFeedbackVaryingsNV: qword -bluegl_glTransformFeedbackVaryingsNV proc - mov r11, __blue_glCore_glTransformFeedbackVaryingsNV +extrn __blue_glCore_glGetQueryObjectivARB: qword +bluegl_glGetQueryObjectivARB proc + mov r11, __blue_glCore_glGetQueryObjectivARB jmp r11 -bluegl_glTransformFeedbackVaryingsNV endp +bluegl_glGetQueryObjectivARB endp -extrn __blue_glCore_glGetSeparableFilter: qword -bluegl_glGetSeparableFilter proc - mov r11, __blue_glCore_glGetSeparableFilter +extrn __blue_glCore_glGetQueryObjectuivARB: qword +bluegl_glGetQueryObjectuivARB proc + mov r11, __blue_glCore_glGetQueryObjectuivARB jmp r11 -bluegl_glGetSeparableFilter endp +bluegl_glGetQueryObjectuivARB endp -extrn __blue_glCore_glGetCompressedTexImageARB: qword -bluegl_glGetCompressedTexImageARB proc - mov r11, __blue_glCore_glGetCompressedTexImageARB +extrn __blue_glCore_glMaxShaderCompilerThreadsARB: qword +bluegl_glMaxShaderCompilerThreadsARB proc + mov r11, __blue_glCore_glMaxShaderCompilerThreadsARB jmp r11 -bluegl_glGetCompressedTexImageARB endp +bluegl_glMaxShaderCompilerThreadsARB endp -extrn __blue_glCore_glProgramNamedParameter4fvNV: qword -bluegl_glProgramNamedParameter4fvNV proc - mov r11, __blue_glCore_glProgramNamedParameter4fvNV +extrn __blue_glCore_glPointParameterfARB: qword +bluegl_glPointParameterfARB proc + mov r11, __blue_glCore_glPointParameterfARB jmp r11 -bluegl_glProgramNamedParameter4fvNV endp +bluegl_glPointParameterfARB endp -extrn __blue_glCore_glTextureBarrierNV: qword -bluegl_glTextureBarrierNV proc - mov r11, __blue_glCore_glTextureBarrierNV +extrn __blue_glCore_glPointParameterfvARB: qword +bluegl_glPointParameterfvARB proc + mov r11, __blue_glCore_glPointParameterfvARB jmp r11 -bluegl_glTextureBarrierNV endp +bluegl_glPointParameterfvARB endp -extrn __blue_glCore_glRasterSamplesEXT: qword -bluegl_glRasterSamplesEXT proc - mov r11, __blue_glCore_glRasterSamplesEXT +extrn __blue_glCore_glGetnMapdvARB: qword +bluegl_glGetnMapdvARB proc + mov r11, __blue_glCore_glGetnMapdvARB jmp r11 -bluegl_glRasterSamplesEXT endp +bluegl_glGetnMapdvARB endp -extrn __blue_glCore_glSecondaryColor3dEXT: qword -bluegl_glSecondaryColor3dEXT proc - mov r11, __blue_glCore_glSecondaryColor3dEXT +extrn __blue_glCore_glGetnMapfvARB: qword +bluegl_glGetnMapfvARB proc + mov r11, __blue_glCore_glGetnMapfvARB jmp r11 -bluegl_glSecondaryColor3dEXT endp +bluegl_glGetnMapfvARB endp -extrn __blue_glCore_glVertexAttrib1svNV: qword -bluegl_glVertexAttrib1svNV proc - mov r11, __blue_glCore_glVertexAttrib1svNV +extrn __blue_glCore_glGetnMapivARB: qword +bluegl_glGetnMapivARB proc + mov r11, __blue_glCore_glGetnMapivARB jmp r11 -bluegl_glVertexAttrib1svNV endp +bluegl_glGetnMapivARB endp -extrn __blue_glCore_glTexImage3D: qword -bluegl_glTexImage3D proc - mov r11, __blue_glCore_glTexImage3D +extrn __blue_glCore_glGetnPixelMapfvARB: qword +bluegl_glGetnPixelMapfvARB proc + mov r11, __blue_glCore_glGetnPixelMapfvARB jmp r11 -bluegl_glTexImage3D endp +bluegl_glGetnPixelMapfvARB endp -extrn __blue_glCore_glUniform1i64ARB: qword -bluegl_glUniform1i64ARB proc - mov r11, __blue_glCore_glUniform1i64ARB +extrn __blue_glCore_glGetnPixelMapuivARB: qword +bluegl_glGetnPixelMapuivARB proc + mov r11, __blue_glCore_glGetnPixelMapuivARB jmp r11 -bluegl_glUniform1i64ARB endp +bluegl_glGetnPixelMapuivARB endp -extrn __blue_glCore_glVertexAttrib4Nuiv: qword -bluegl_glVertexAttrib4Nuiv proc - mov r11, __blue_glCore_glVertexAttrib4Nuiv +extrn __blue_glCore_glGetnPixelMapusvARB: qword +bluegl_glGetnPixelMapusvARB proc + mov r11, __blue_glCore_glGetnPixelMapusvARB jmp r11 -bluegl_glVertexAttrib4Nuiv endp +bluegl_glGetnPixelMapusvARB endp -extrn __blue_glCore_glGetProgramivNV: qword -bluegl_glGetProgramivNV proc - mov r11, __blue_glCore_glGetProgramivNV +extrn __blue_glCore_glGetnPolygonStippleARB: qword +bluegl_glGetnPolygonStippleARB proc + mov r11, __blue_glCore_glGetnPolygonStippleARB jmp r11 -bluegl_glGetProgramivNV endp +bluegl_glGetnPolygonStippleARB endp -extrn __blue_glCore_glGetTexGenxvOES: qword -bluegl_glGetTexGenxvOES proc - mov r11, __blue_glCore_glGetTexGenxvOES +extrn __blue_glCore_glGetnColorTableARB: qword +bluegl_glGetnColorTableARB proc + mov r11, __blue_glCore_glGetnColorTableARB jmp r11 -bluegl_glGetTexGenxvOES endp +bluegl_glGetnColorTableARB endp -extrn __blue_glCore_glVertexP4uiv: qword -bluegl_glVertexP4uiv proc - mov r11, __blue_glCore_glVertexP4uiv +extrn __blue_glCore_glGetnConvolutionFilterARB: qword +bluegl_glGetnConvolutionFilterARB proc + mov r11, __blue_glCore_glGetnConvolutionFilterARB jmp r11 -bluegl_glVertexP4uiv endp +bluegl_glGetnConvolutionFilterARB endp -extrn __blue_glCore_glMapGrid1xOES: qword -bluegl_glMapGrid1xOES proc - mov r11, __blue_glCore_glMapGrid1xOES +extrn __blue_glCore_glGetnSeparableFilterARB: qword +bluegl_glGetnSeparableFilterARB proc + mov r11, __blue_glCore_glGetnSeparableFilterARB jmp r11 -bluegl_glMapGrid1xOES endp +bluegl_glGetnSeparableFilterARB endp -extrn __blue_glCore_glProgramUniformMatrix2dv: qword -bluegl_glProgramUniformMatrix2dv proc - mov r11, __blue_glCore_glProgramUniformMatrix2dv +extrn __blue_glCore_glGetnHistogramARB: qword +bluegl_glGetnHistogramARB proc + mov r11, __blue_glCore_glGetnHistogramARB jmp r11 -bluegl_glProgramUniformMatrix2dv endp +bluegl_glGetnHistogramARB endp -extrn __blue_glCore_glColorMaski: qword -bluegl_glColorMaski proc - mov r11, __blue_glCore_glColorMaski +extrn __blue_glCore_glGetnMinmaxARB: qword +bluegl_glGetnMinmaxARB proc + mov r11, __blue_glCore_glGetnMinmaxARB jmp r11 -bluegl_glColorMaski endp +bluegl_glGetnMinmaxARB endp -extrn __blue_glCore_glEdgeFlagPointerListIBM: qword -bluegl_glEdgeFlagPointerListIBM proc - mov r11, __blue_glCore_glEdgeFlagPointerListIBM +extrn __blue_glCore_glFramebufferSampleLocationsfvARB: qword +bluegl_glFramebufferSampleLocationsfvARB proc + mov r11, __blue_glCore_glFramebufferSampleLocationsfvARB jmp r11 -bluegl_glEdgeFlagPointerListIBM endp +bluegl_glFramebufferSampleLocationsfvARB endp -extrn __blue_glCore_glGetUniformBlockIndex: qword -bluegl_glGetUniformBlockIndex proc - mov r11, __blue_glCore_glGetUniformBlockIndex +extrn __blue_glCore_glNamedFramebufferSampleLocationsfvARB: qword +bluegl_glNamedFramebufferSampleLocationsfvARB proc + mov r11, __blue_glCore_glNamedFramebufferSampleLocationsfvARB jmp r11 -bluegl_glGetUniformBlockIndex endp +bluegl_glNamedFramebufferSampleLocationsfvARB endp -extrn __blue_glCore_glClearColorxOES: qword -bluegl_glClearColorxOES proc - mov r11, __blue_glCore_glClearColorxOES +extrn __blue_glCore_glEvaluateDepthValuesARB: qword +bluegl_glEvaluateDepthValuesARB proc + mov r11, __blue_glCore_glEvaluateDepthValuesARB jmp r11 -bluegl_glClearColorxOES endp +bluegl_glEvaluateDepthValuesARB endp -extrn __blue_glCore_glPixelTransformParameteriEXT: qword -bluegl_glPixelTransformParameteriEXT proc - mov r11, __blue_glCore_glPixelTransformParameteriEXT +extrn __blue_glCore_glDeleteObjectARB: qword +bluegl_glDeleteObjectARB proc + mov r11, __blue_glCore_glDeleteObjectARB jmp r11 -bluegl_glPixelTransformParameteriEXT endp +bluegl_glDeleteObjectARB endp -extrn __blue_glCore_glNamedFramebufferTexture3DEXT: qword -bluegl_glNamedFramebufferTexture3DEXT proc - mov r11, __blue_glCore_glNamedFramebufferTexture3DEXT +extrn __blue_glCore_glGetHandleARB: qword +bluegl_glGetHandleARB proc + mov r11, __blue_glCore_glGetHandleARB jmp r11 -bluegl_glNamedFramebufferTexture3DEXT endp +bluegl_glGetHandleARB endp -extrn __blue_glCore_glTexCoord4xOES: qword -bluegl_glTexCoord4xOES proc - mov r11, __blue_glCore_glTexCoord4xOES +extrn __blue_glCore_glDetachObjectARB: qword +bluegl_glDetachObjectARB proc + mov r11, __blue_glCore_glDetachObjectARB jmp r11 -bluegl_glTexCoord4xOES endp +bluegl_glDetachObjectARB endp -extrn __blue_glCore_glGetUniformivARB: qword -bluegl_glGetUniformivARB proc - mov r11, __blue_glCore_glGetUniformivARB +extrn __blue_glCore_glCreateShaderObjectARB: qword +bluegl_glCreateShaderObjectARB proc + mov r11, __blue_glCore_glCreateShaderObjectARB jmp r11 -bluegl_glGetUniformivARB endp +bluegl_glCreateShaderObjectARB endp -extrn __blue_glCore_glNamedFramebufferTextureEXT: qword -bluegl_glNamedFramebufferTextureEXT proc - mov r11, __blue_glCore_glNamedFramebufferTextureEXT +extrn __blue_glCore_glShaderSourceARB: qword +bluegl_glShaderSourceARB proc + mov r11, __blue_glCore_glShaderSourceARB jmp r11 -bluegl_glNamedFramebufferTextureEXT endp +bluegl_glShaderSourceARB endp -extrn __blue_glCore_glDrawBuffers: qword -bluegl_glDrawBuffers proc - mov r11, __blue_glCore_glDrawBuffers +extrn __blue_glCore_glCompileShaderARB: qword +bluegl_glCompileShaderARB proc + mov r11, __blue_glCore_glCompileShaderARB jmp r11 -bluegl_glDrawBuffers endp +bluegl_glCompileShaderARB endp -extrn __blue_glCore_glWeightuivARB: qword -bluegl_glWeightuivARB proc - mov r11, __blue_glCore_glWeightuivARB +extrn __blue_glCore_glCreateProgramObjectARB: qword +bluegl_glCreateProgramObjectARB proc + mov r11, __blue_glCore_glCreateProgramObjectARB jmp r11 -bluegl_glWeightuivARB endp +bluegl_glCreateProgramObjectARB endp -extrn __blue_glCore_glMultiTexCoordP1ui: qword -bluegl_glMultiTexCoordP1ui proc - mov r11, __blue_glCore_glMultiTexCoordP1ui +extrn __blue_glCore_glAttachObjectARB: qword +bluegl_glAttachObjectARB proc + mov r11, __blue_glCore_glAttachObjectARB jmp r11 -bluegl_glMultiTexCoordP1ui endp +bluegl_glAttachObjectARB endp -extrn __blue_glCore_glCopyTexSubImage1DEXT: qword -bluegl_glCopyTexSubImage1DEXT proc - mov r11, __blue_glCore_glCopyTexSubImage1DEXT +extrn __blue_glCore_glLinkProgramARB: qword +bluegl_glLinkProgramARB proc + mov r11, __blue_glCore_glLinkProgramARB jmp r11 -bluegl_glCopyTexSubImage1DEXT endp +bluegl_glLinkProgramARB endp -extrn __blue_glCore_glVertexArrayAttribBinding: qword -bluegl_glVertexArrayAttribBinding proc - mov r11, __blue_glCore_glVertexArrayAttribBinding +extrn __blue_glCore_glUseProgramObjectARB: qword +bluegl_glUseProgramObjectARB proc + mov r11, __blue_glCore_glUseProgramObjectARB jmp r11 -bluegl_glVertexArrayAttribBinding endp +bluegl_glUseProgramObjectARB endp -extrn __blue_glCore_glVertexP4ui: qword -bluegl_glVertexP4ui proc - mov r11, __blue_glCore_glVertexP4ui +extrn __blue_glCore_glValidateProgramARB: qword +bluegl_glValidateProgramARB proc + mov r11, __blue_glCore_glValidateProgramARB jmp r11 -bluegl_glVertexP4ui endp +bluegl_glValidateProgramARB endp -extrn __blue_glCore_glVertex2hvNV: qword -bluegl_glVertex2hvNV proc - mov r11, __blue_glCore_glVertex2hvNV +extrn __blue_glCore_glUniform1fARB: qword +bluegl_glUniform1fARB proc + mov r11, __blue_glCore_glUniform1fARB jmp r11 -bluegl_glVertex2hvNV endp +bluegl_glUniform1fARB endp -extrn __blue_glCore_glDrawElementsInstancedBaseInstance: qword -bluegl_glDrawElementsInstancedBaseInstance proc - mov r11, __blue_glCore_glDrawElementsInstancedBaseInstance +extrn __blue_glCore_glUniform2fARB: qword +bluegl_glUniform2fARB proc + mov r11, __blue_glCore_glUniform2fARB jmp r11 -bluegl_glDrawElementsInstancedBaseInstance endp +bluegl_glUniform2fARB endp -extrn __blue_glCore_glNormalStream3sATI: qword -bluegl_glNormalStream3sATI proc - mov r11, __blue_glCore_glNormalStream3sATI +extrn __blue_glCore_glUniform3fARB: qword +bluegl_glUniform3fARB proc + mov r11, __blue_glCore_glUniform3fARB jmp r11 -bluegl_glNormalStream3sATI endp +bluegl_glUniform3fARB endp -extrn __blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN: qword -bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN proc - mov r11, __blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN +extrn __blue_glCore_glUniform4fARB: qword +bluegl_glUniform4fARB proc + mov r11, __blue_glCore_glUniform4fARB jmp r11 -bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN endp +bluegl_glUniform4fARB endp -extrn __blue_glCore_glBindSamplers: qword -bluegl_glBindSamplers proc - mov r11, __blue_glCore_glBindSamplers +extrn __blue_glCore_glUniform1iARB: qword +bluegl_glUniform1iARB proc + mov r11, __blue_glCore_glUniform1iARB jmp r11 -bluegl_glBindSamplers endp +bluegl_glUniform1iARB endp -extrn __blue_glCore_glGetCompressedMultiTexImageEXT: qword -bluegl_glGetCompressedMultiTexImageEXT proc - mov r11, __blue_glCore_glGetCompressedMultiTexImageEXT +extrn __blue_glCore_glUniform2iARB: qword +bluegl_glUniform2iARB proc + mov r11, __blue_glCore_glUniform2iARB jmp r11 -bluegl_glGetCompressedMultiTexImageEXT endp +bluegl_glUniform2iARB endp -extrn __blue_glCore_glGetRenderbufferParameterivEXT: qword -bluegl_glGetRenderbufferParameterivEXT proc - mov r11, __blue_glCore_glGetRenderbufferParameterivEXT +extrn __blue_glCore_glUniform3iARB: qword +bluegl_glUniform3iARB proc + mov r11, __blue_glCore_glUniform3iARB jmp r11 -bluegl_glGetRenderbufferParameterivEXT endp +bluegl_glUniform3iARB endp -extrn __blue_glCore_glUniform3dv: qword -bluegl_glUniform3dv proc - mov r11, __blue_glCore_glUniform3dv +extrn __blue_glCore_glUniform4iARB: qword +bluegl_glUniform4iARB proc + mov r11, __blue_glCore_glUniform4iARB jmp r11 -bluegl_glUniform3dv endp +bluegl_glUniform4iARB endp -extrn __blue_glCore_glFlushRasterSGIX: qword -bluegl_glFlushRasterSGIX proc - mov r11, __blue_glCore_glFlushRasterSGIX +extrn __blue_glCore_glUniform1fvARB: qword +bluegl_glUniform1fvARB proc + mov r11, __blue_glCore_glUniform1fvARB jmp r11 -bluegl_glFlushRasterSGIX endp +bluegl_glUniform1fvARB endp -extrn __blue_glCore_glVertexAttribs3hvNV: qword -bluegl_glVertexAttribs3hvNV proc - mov r11, __blue_glCore_glVertexAttribs3hvNV +extrn __blue_glCore_glUniform2fvARB: qword +bluegl_glUniform2fvARB proc + mov r11, __blue_glCore_glUniform2fvARB jmp r11 -bluegl_glVertexAttribs3hvNV endp +bluegl_glUniform2fvARB endp -extrn __blue_glCore_glGetnSeparableFilterARB: qword -bluegl_glGetnSeparableFilterARB proc - mov r11, __blue_glCore_glGetnSeparableFilterARB +extrn __blue_glCore_glUniform3fvARB: qword +bluegl_glUniform3fvARB proc + mov r11, __blue_glCore_glUniform3fvARB jmp r11 -bluegl_glGetnSeparableFilterARB endp +bluegl_glUniform3fvARB endp -extrn __blue_glCore_glWindowPos2sARB: qword -bluegl_glWindowPos2sARB proc - mov r11, __blue_glCore_glWindowPos2sARB +extrn __blue_glCore_glUniform4fvARB: qword +bluegl_glUniform4fvARB proc + mov r11, __blue_glCore_glUniform4fvARB jmp r11 -bluegl_glWindowPos2sARB endp +bluegl_glUniform4fvARB endp -extrn __blue_glCore_glPopDebugGroup: qword -bluegl_glPopDebugGroup proc - mov r11, __blue_glCore_glPopDebugGroup +extrn __blue_glCore_glUniform1ivARB: qword +bluegl_glUniform1ivARB proc + mov r11, __blue_glCore_glUniform1ivARB jmp r11 -bluegl_glPopDebugGroup endp +bluegl_glUniform1ivARB endp -extrn __blue_glCore_glVideoCaptureNV: qword -bluegl_glVideoCaptureNV proc - mov r11, __blue_glCore_glVideoCaptureNV +extrn __blue_glCore_glUniform2ivARB: qword +bluegl_glUniform2ivARB proc + mov r11, __blue_glCore_glUniform2ivARB jmp r11 -bluegl_glVideoCaptureNV endp +bluegl_glUniform2ivARB endp -extrn __blue_glCore_glTangent3bEXT: qword -bluegl_glTangent3bEXT proc - mov r11, __blue_glCore_glTangent3bEXT +extrn __blue_glCore_glUniform3ivARB: qword +bluegl_glUniform3ivARB proc + mov r11, __blue_glCore_glUniform3ivARB jmp r11 -bluegl_glTangent3bEXT endp +bluegl_glUniform3ivARB endp -extrn __blue_glCore_glLinkProgram: qword -bluegl_glLinkProgram proc - mov r11, __blue_glCore_glLinkProgram +extrn __blue_glCore_glUniform4ivARB: qword +bluegl_glUniform4ivARB proc + mov r11, __blue_glCore_glUniform4ivARB jmp r11 -bluegl_glLinkProgram endp +bluegl_glUniform4ivARB endp -extrn __blue_glCore_glFogCoordPointerListIBM: qword -bluegl_glFogCoordPointerListIBM proc - mov r11, __blue_glCore_glFogCoordPointerListIBM +extrn __blue_glCore_glUniformMatrix2fvARB: qword +bluegl_glUniformMatrix2fvARB proc + mov r11, __blue_glCore_glUniformMatrix2fvARB jmp r11 -bluegl_glFogCoordPointerListIBM endp +bluegl_glUniformMatrix2fvARB endp -extrn __blue_glCore_glRotatexOES: qword -bluegl_glRotatexOES proc - mov r11, __blue_glCore_glRotatexOES +extrn __blue_glCore_glUniformMatrix3fvARB: qword +bluegl_glUniformMatrix3fvARB proc + mov r11, __blue_glCore_glUniformMatrix3fvARB jmp r11 -bluegl_glRotatexOES endp +bluegl_glUniformMatrix3fvARB endp -extrn __blue_glCore_glPathParameterivNV: qword -bluegl_glPathParameterivNV proc - mov r11, __blue_glCore_glPathParameterivNV +extrn __blue_glCore_glUniformMatrix4fvARB: qword +bluegl_glUniformMatrix4fvARB proc + mov r11, __blue_glCore_glUniformMatrix4fvARB jmp r11 -bluegl_glPathParameterivNV endp +bluegl_glUniformMatrix4fvARB endp -extrn __blue_glCore_glVertexAttribLPointerEXT: qword -bluegl_glVertexAttribLPointerEXT proc - mov r11, __blue_glCore_glVertexAttribLPointerEXT +extrn __blue_glCore_glGetObjectParameterfvARB: qword +bluegl_glGetObjectParameterfvARB proc + mov r11, __blue_glCore_glGetObjectParameterfvARB jmp r11 -bluegl_glVertexAttribLPointerEXT endp +bluegl_glGetObjectParameterfvARB endp -extrn __blue_glCore_glGetInteger64i_v: qword -bluegl_glGetInteger64i_v proc - mov r11, __blue_glCore_glGetInteger64i_v +extrn __blue_glCore_glGetObjectParameterivARB: qword +bluegl_glGetObjectParameterivARB proc + mov r11, __blue_glCore_glGetObjectParameterivARB jmp r11 -bluegl_glGetInteger64i_v endp +bluegl_glGetObjectParameterivARB endp -extrn __blue_glCore_glCompressedMultiTexSubImage1DEXT: qword -bluegl_glCompressedMultiTexSubImage1DEXT proc - mov r11, __blue_glCore_glCompressedMultiTexSubImage1DEXT +extrn __blue_glCore_glGetInfoLogARB: qword +bluegl_glGetInfoLogARB proc + mov r11, __blue_glCore_glGetInfoLogARB jmp r11 -bluegl_glCompressedMultiTexSubImage1DEXT endp +bluegl_glGetInfoLogARB endp -extrn __blue_glCore_glConvolutionParameteriEXT: qword -bluegl_glConvolutionParameteriEXT proc - mov r11, __blue_glCore_glConvolutionParameteriEXT +extrn __blue_glCore_glGetAttachedObjectsARB: qword +bluegl_glGetAttachedObjectsARB proc + mov r11, __blue_glCore_glGetAttachedObjectsARB jmp r11 -bluegl_glConvolutionParameteriEXT endp +bluegl_glGetAttachedObjectsARB endp -extrn __blue_glCore_glNamedFramebufferTextureLayer: qword -bluegl_glNamedFramebufferTextureLayer proc - mov r11, __blue_glCore_glNamedFramebufferTextureLayer +extrn __blue_glCore_glGetUniformLocationARB: qword +bluegl_glGetUniformLocationARB proc + mov r11, __blue_glCore_glGetUniformLocationARB jmp r11 -bluegl_glNamedFramebufferTextureLayer endp +bluegl_glGetUniformLocationARB endp -extrn __blue_glCore_glWindowPos2sMESA: qword -bluegl_glWindowPos2sMESA proc - mov r11, __blue_glCore_glWindowPos2sMESA +extrn __blue_glCore_glGetActiveUniformARB: qword +bluegl_glGetActiveUniformARB proc + mov r11, __blue_glCore_glGetActiveUniformARB jmp r11 -bluegl_glWindowPos2sMESA endp +bluegl_glGetActiveUniformARB endp -extrn __blue_glCore_glCoverStrokePathInstancedNV: qword -bluegl_glCoverStrokePathInstancedNV proc - mov r11, __blue_glCore_glCoverStrokePathInstancedNV +extrn __blue_glCore_glGetUniformfvARB: qword +bluegl_glGetUniformfvARB proc + mov r11, __blue_glCore_glGetUniformfvARB jmp r11 -bluegl_glCoverStrokePathInstancedNV endp +bluegl_glGetUniformfvARB endp -extrn __blue_glCore_glTexParameteri: qword -bluegl_glTexParameteri proc - mov r11, __blue_glCore_glTexParameteri +extrn __blue_glCore_glGetUniformivARB: qword +bluegl_glGetUniformivARB proc + mov r11, __blue_glCore_glGetUniformivARB jmp r11 -bluegl_glTexParameteri endp +bluegl_glGetUniformivARB endp -extrn __blue_glCore_glUniform1uiv: qword -bluegl_glUniform1uiv proc - mov r11, __blue_glCore_glUniform1uiv +extrn __blue_glCore_glGetShaderSourceARB: qword +bluegl_glGetShaderSourceARB proc + mov r11, __blue_glCore_glGetShaderSourceARB jmp r11 -bluegl_glUniform1uiv endp +bluegl_glGetShaderSourceARB endp -extrn __blue_glCore_glMultiTexCoord4fv: qword -bluegl_glMultiTexCoord4fv proc - mov r11, __blue_glCore_glMultiTexCoord4fv +extrn __blue_glCore_glTexBufferARB: qword +bluegl_glTexBufferARB proc + mov r11, __blue_glCore_glTexBufferARB jmp r11 -bluegl_glMultiTexCoord4fv endp +bluegl_glTexBufferARB endp -extrn __blue_glCore_glProgramParameter4fvNV: qword -bluegl_glProgramParameter4fvNV proc - mov r11, __blue_glCore_glProgramParameter4fvNV +extrn __blue_glCore_glCompressedTexImage3DARB: qword +bluegl_glCompressedTexImage3DARB proc + mov r11, __blue_glCore_glCompressedTexImage3DARB jmp r11 -bluegl_glProgramParameter4fvNV endp +bluegl_glCompressedTexImage3DARB endp -extrn __blue_glCore_glDeformationMap3fSGIX: qword -bluegl_glDeformationMap3fSGIX proc - mov r11, __blue_glCore_glDeformationMap3fSGIX +extrn __blue_glCore_glCompressedTexImage2DARB: qword +bluegl_glCompressedTexImage2DARB proc + mov r11, __blue_glCore_glCompressedTexImage2DARB jmp r11 -bluegl_glDeformationMap3fSGIX endp +bluegl_glCompressedTexImage2DARB endp -extrn __blue_glCore_glBlendEquationiARB: qword -bluegl_glBlendEquationiARB proc - mov r11, __blue_glCore_glBlendEquationiARB +extrn __blue_glCore_glCompressedTexImage1DARB: qword +bluegl_glCompressedTexImage1DARB proc + mov r11, __blue_glCore_glCompressedTexImage1DARB jmp r11 -bluegl_glBlendEquationiARB endp +bluegl_glCompressedTexImage1DARB endp -extrn __blue_glCore_glStencilFunc: qword -bluegl_glStencilFunc proc - mov r11, __blue_glCore_glStencilFunc +extrn __blue_glCore_glCompressedTexSubImage3DARB: qword +bluegl_glCompressedTexSubImage3DARB proc + mov r11, __blue_glCore_glCompressedTexSubImage3DARB jmp r11 -bluegl_glStencilFunc endp +bluegl_glCompressedTexSubImage3DARB endp -extrn __blue_glCore_glFogCoordd: qword -bluegl_glFogCoordd proc - mov r11, __blue_glCore_glFogCoordd +extrn __blue_glCore_glCompressedTexSubImage2DARB: qword +bluegl_glCompressedTexSubImage2DARB proc + mov r11, __blue_glCore_glCompressedTexSubImage2DARB jmp r11 -bluegl_glFogCoordd endp +bluegl_glCompressedTexSubImage2DARB endp -extrn __blue_glCore_glUniform2iv: qword -bluegl_glUniform2iv proc - mov r11, __blue_glCore_glUniform2iv +extrn __blue_glCore_glCompressedTexSubImage1DARB: qword +bluegl_glCompressedTexSubImage1DARB proc + mov r11, __blue_glCore_glCompressedTexSubImage1DARB jmp r11 -bluegl_glUniform2iv endp +bluegl_glCompressedTexSubImage1DARB endp -extrn __blue_glCore_glUniform1i64NV: qword -bluegl_glUniform1i64NV proc - mov r11, __blue_glCore_glUniform1i64NV +extrn __blue_glCore_glGetCompressedTexImageARB: qword +bluegl_glGetCompressedTexImageARB proc + mov r11, __blue_glCore_glGetCompressedTexImageARB jmp r11 -bluegl_glUniform1i64NV endp +bluegl_glGetCompressedTexImageARB endp -extrn __blue_glCore_glTextureStorage2D: qword -bluegl_glTextureStorage2D proc - mov r11, __blue_glCore_glTextureStorage2D +extrn __blue_glCore_glLoadTransposeMatrixfARB: qword +bluegl_glLoadTransposeMatrixfARB proc + mov r11, __blue_glCore_glLoadTransposeMatrixfARB jmp r11 -bluegl_glTextureStorage2D endp +bluegl_glLoadTransposeMatrixfARB endp -extrn __blue_glCore_glTextureStorage2DMultisampleEXT: qword -bluegl_glTextureStorage2DMultisampleEXT proc - mov r11, __blue_glCore_glTextureStorage2DMultisampleEXT +extrn __blue_glCore_glLoadTransposeMatrixdARB: qword +bluegl_glLoadTransposeMatrixdARB proc + mov r11, __blue_glCore_glLoadTransposeMatrixdARB jmp r11 -bluegl_glTextureStorage2DMultisampleEXT endp +bluegl_glLoadTransposeMatrixdARB endp -extrn __blue_glCore_glCopyTexSubImage1D: qword -bluegl_glCopyTexSubImage1D proc - mov r11, __blue_glCore_glCopyTexSubImage1D +extrn __blue_glCore_glMultTransposeMatrixfARB: qword +bluegl_glMultTransposeMatrixfARB proc + mov r11, __blue_glCore_glMultTransposeMatrixfARB jmp r11 -bluegl_glCopyTexSubImage1D endp +bluegl_glMultTransposeMatrixfARB endp -extrn __blue_glCore_glSamplerParameterf: qword -bluegl_glSamplerParameterf proc - mov r11, __blue_glCore_glSamplerParameterf +extrn __blue_glCore_glMultTransposeMatrixdARB: qword +bluegl_glMultTransposeMatrixdARB proc + mov r11, __blue_glCore_glMultTransposeMatrixdARB jmp r11 -bluegl_glSamplerParameterf endp +bluegl_glMultTransposeMatrixdARB endp -extrn __blue_glCore_glDrawArraysInstancedBaseInstance: qword -bluegl_glDrawArraysInstancedBaseInstance proc - mov r11, __blue_glCore_glDrawArraysInstancedBaseInstance +extrn __blue_glCore_glWeightbvARB: qword +bluegl_glWeightbvARB proc + mov r11, __blue_glCore_glWeightbvARB jmp r11 -bluegl_glDrawArraysInstancedBaseInstance endp +bluegl_glWeightbvARB endp -extrn __blue_glCore_glVertexAttrib4uivARB: qword -bluegl_glVertexAttrib4uivARB proc - mov r11, __blue_glCore_glVertexAttrib4uivARB +extrn __blue_glCore_glWeightsvARB: qword +bluegl_glWeightsvARB proc + mov r11, __blue_glCore_glWeightsvARB jmp r11 -bluegl_glVertexAttrib4uivARB endp +bluegl_glWeightsvARB endp -extrn __blue_glCore_glVertexAttribFormatNV: qword -bluegl_glVertexAttribFormatNV proc - mov r11, __blue_glCore_glVertexAttribFormatNV +extrn __blue_glCore_glWeightivARB: qword +bluegl_glWeightivARB proc + mov r11, __blue_glCore_glWeightivARB jmp r11 -bluegl_glVertexAttribFormatNV endp +bluegl_glWeightivARB endp -extrn __blue_glCore_glIsQueryARB: qword -bluegl_glIsQueryARB proc - mov r11, __blue_glCore_glIsQueryARB +extrn __blue_glCore_glWeightfvARB: qword +bluegl_glWeightfvARB proc + mov r11, __blue_glCore_glWeightfvARB jmp r11 -bluegl_glIsQueryARB endp +bluegl_glWeightfvARB endp -extrn __blue_glCore_glSampleCoverageARB: qword -bluegl_glSampleCoverageARB proc - mov r11, __blue_glCore_glSampleCoverageARB +extrn __blue_glCore_glWeightdvARB: qword +bluegl_glWeightdvARB proc + mov r11, __blue_glCore_glWeightdvARB jmp r11 -bluegl_glSampleCoverageARB endp +bluegl_glWeightdvARB endp -extrn __blue_glCore_glGetnCompressedTexImageARB: qword -bluegl_glGetnCompressedTexImageARB proc - mov r11, __blue_glCore_glGetnCompressedTexImageARB +extrn __blue_glCore_glWeightubvARB: qword +bluegl_glWeightubvARB proc + mov r11, __blue_glCore_glWeightubvARB jmp r11 -bluegl_glGetnCompressedTexImageARB endp +bluegl_glWeightubvARB endp -extrn __blue_glCore_glTexCoord3xvOES: qword -bluegl_glTexCoord3xvOES proc - mov r11, __blue_glCore_glTexCoord3xvOES +extrn __blue_glCore_glWeightusvARB: qword +bluegl_glWeightusvARB proc + mov r11, __blue_glCore_glWeightusvARB jmp r11 -bluegl_glTexCoord3xvOES endp +bluegl_glWeightusvARB endp -extrn __blue_glCore_glTexCoord2fNormal3fVertex3fSUN: qword -bluegl_glTexCoord2fNormal3fVertex3fSUN proc - mov r11, __blue_glCore_glTexCoord2fNormal3fVertex3fSUN +extrn __blue_glCore_glWeightuivARB: qword +bluegl_glWeightuivARB proc + mov r11, __blue_glCore_glWeightuivARB jmp r11 -bluegl_glTexCoord2fNormal3fVertex3fSUN endp +bluegl_glWeightuivARB endp -extrn __blue_glCore_glGetGraphicsResetStatus: qword -bluegl_glGetGraphicsResetStatus proc - mov r11, __blue_glCore_glGetGraphicsResetStatus +extrn __blue_glCore_glWeightPointerARB: qword +bluegl_glWeightPointerARB proc + mov r11, __blue_glCore_glWeightPointerARB jmp r11 -bluegl_glGetGraphicsResetStatus endp +bluegl_glWeightPointerARB endp -extrn __blue_glCore_glProgramVertexLimitNV: qword -bluegl_glProgramVertexLimitNV proc - mov r11, __blue_glCore_glProgramVertexLimitNV +extrn __blue_glCore_glVertexBlendARB: qword +bluegl_glVertexBlendARB proc + mov r11, __blue_glCore_glVertexBlendARB jmp r11 -bluegl_glProgramVertexLimitNV endp +bluegl_glVertexBlendARB endp -extrn __blue_glCore_glCopyConvolutionFilter2D: qword -bluegl_glCopyConvolutionFilter2D proc - mov r11, __blue_glCore_glCopyConvolutionFilter2D +extrn __blue_glCore_glBindBufferARB: qword +bluegl_glBindBufferARB proc + mov r11, __blue_glCore_glBindBufferARB jmp r11 -bluegl_glCopyConvolutionFilter2D endp +bluegl_glBindBufferARB endp -extrn __blue_glCore_glVertexStream4fATI: qword -bluegl_glVertexStream4fATI proc - mov r11, __blue_glCore_glVertexStream4fATI +extrn __blue_glCore_glDeleteBuffersARB: qword +bluegl_glDeleteBuffersARB proc + mov r11, __blue_glCore_glDeleteBuffersARB jmp r11 -bluegl_glVertexStream4fATI endp +bluegl_glDeleteBuffersARB endp -extrn __blue_glCore_glSecondaryColor3f: qword -bluegl_glSecondaryColor3f proc - mov r11, __blue_glCore_glSecondaryColor3f +extrn __blue_glCore_glGenBuffersARB: qword +bluegl_glGenBuffersARB proc + mov r11, __blue_glCore_glGenBuffersARB jmp r11 -bluegl_glSecondaryColor3f endp +bluegl_glGenBuffersARB endp -extrn __blue_glCore_glTexCoordP1ui: qword -bluegl_glTexCoordP1ui proc - mov r11, __blue_glCore_glTexCoordP1ui +extrn __blue_glCore_glIsBufferARB: qword +bluegl_glIsBufferARB proc + mov r11, __blue_glCore_glIsBufferARB jmp r11 -bluegl_glTexCoordP1ui endp +bluegl_glIsBufferARB endp -extrn __blue_glCore_glProgramBufferParametersfvNV: qword -bluegl_glProgramBufferParametersfvNV proc - mov r11, __blue_glCore_glProgramBufferParametersfvNV +extrn __blue_glCore_glBufferDataARB: qword +bluegl_glBufferDataARB proc + mov r11, __blue_glCore_glBufferDataARB jmp r11 -bluegl_glProgramBufferParametersfvNV endp +bluegl_glBufferDataARB endp -extrn __blue_glCore_glTexCoord1xOES: qword -bluegl_glTexCoord1xOES proc - mov r11, __blue_glCore_glTexCoord1xOES +extrn __blue_glCore_glBufferSubDataARB: qword +bluegl_glBufferSubDataARB proc + mov r11, __blue_glCore_glBufferSubDataARB jmp r11 -bluegl_glTexCoord1xOES endp +bluegl_glBufferSubDataARB endp -extrn __blue_glCore_glFogCoordfv: qword -bluegl_glFogCoordfv proc - mov r11, __blue_glCore_glFogCoordfv +extrn __blue_glCore_glGetBufferSubDataARB: qword +bluegl_glGetBufferSubDataARB proc + mov r11, __blue_glCore_glGetBufferSubDataARB jmp r11 -bluegl_glFogCoordfv endp +bluegl_glGetBufferSubDataARB endp -extrn __blue_glCore_glMultiDrawElementsIndirectAMD: qword -bluegl_glMultiDrawElementsIndirectAMD proc - mov r11, __blue_glCore_glMultiDrawElementsIndirectAMD +extrn __blue_glCore_glMapBufferARB: qword +bluegl_glMapBufferARB proc + mov r11, __blue_glCore_glMapBufferARB jmp r11 -bluegl_glMultiDrawElementsIndirectAMD endp +bluegl_glMapBufferARB endp -extrn __blue_glCore_glGetnMinmaxARB: qword -bluegl_glGetnMinmaxARB proc - mov r11, __blue_glCore_glGetnMinmaxARB +extrn __blue_glCore_glUnmapBufferARB: qword +bluegl_glUnmapBufferARB proc + mov r11, __blue_glCore_glUnmapBufferARB jmp r11 -bluegl_glGetnMinmaxARB endp +bluegl_glUnmapBufferARB endp -extrn __blue_glCore_glSecondaryColor3uivEXT: qword -bluegl_glSecondaryColor3uivEXT proc - mov r11, __blue_glCore_glSecondaryColor3uivEXT +extrn __blue_glCore_glGetBufferParameterivARB: qword +bluegl_glGetBufferParameterivARB proc + mov r11, __blue_glCore_glGetBufferParameterivARB jmp r11 -bluegl_glSecondaryColor3uivEXT endp +bluegl_glGetBufferParameterivARB endp -extrn __blue_glCore_glColorMask: qword -bluegl_glColorMask proc - mov r11, __blue_glCore_glColorMask +extrn __blue_glCore_glGetBufferPointervARB: qword +bluegl_glGetBufferPointervARB proc + mov r11, __blue_glCore_glGetBufferPointervARB jmp r11 -bluegl_glColorMask endp +bluegl_glGetBufferPointervARB endp -extrn __blue_glCore_glTextureImage2DMultisampleCoverageNV: qword -bluegl_glTextureImage2DMultisampleCoverageNV proc - mov r11, __blue_glCore_glTextureImage2DMultisampleCoverageNV +extrn __blue_glCore_glVertexAttrib1dARB: qword +bluegl_glVertexAttrib1dARB proc + mov r11, __blue_glCore_glVertexAttrib1dARB jmp r11 -bluegl_glTextureImage2DMultisampleCoverageNV endp +bluegl_glVertexAttrib1dARB endp -extrn __blue_glCore_glMultiModeDrawElementsIBM: qword -bluegl_glMultiModeDrawElementsIBM proc - mov r11, __blue_glCore_glMultiModeDrawElementsIBM +extrn __blue_glCore_glVertexAttrib1dvARB: qword +bluegl_glVertexAttrib1dvARB proc + mov r11, __blue_glCore_glVertexAttrib1dvARB jmp r11 -bluegl_glMultiModeDrawElementsIBM endp +bluegl_glVertexAttrib1dvARB endp -extrn __blue_glCore_glVertexArrayAttribLFormat: qword -bluegl_glVertexArrayAttribLFormat proc - mov r11, __blue_glCore_glVertexArrayAttribLFormat +extrn __blue_glCore_glVertexAttrib1fARB: qword +bluegl_glVertexAttrib1fARB proc + mov r11, __blue_glCore_glVertexAttrib1fARB jmp r11 -bluegl_glVertexArrayAttribLFormat endp +bluegl_glVertexAttrib1fARB endp -extrn __blue_glCore_glBindFragDataLocationIndexed: qword -bluegl_glBindFragDataLocationIndexed proc - mov r11, __blue_glCore_glBindFragDataLocationIndexed +extrn __blue_glCore_glVertexAttrib1fvARB: qword +bluegl_glVertexAttrib1fvARB proc + mov r11, __blue_glCore_glVertexAttrib1fvARB jmp r11 -bluegl_glBindFragDataLocationIndexed endp +bluegl_glVertexAttrib1fvARB endp -extrn __blue_glCore_glGetNamedBufferParameterivEXT: qword -bluegl_glGetNamedBufferParameterivEXT proc - mov r11, __blue_glCore_glGetNamedBufferParameterivEXT +extrn __blue_glCore_glVertexAttrib1sARB: qword +bluegl_glVertexAttrib1sARB proc + mov r11, __blue_glCore_glVertexAttrib1sARB jmp r11 -bluegl_glGetNamedBufferParameterivEXT endp +bluegl_glVertexAttrib1sARB endp -extrn __blue_glCore_glSecondaryColor3bEXT: qword -bluegl_glSecondaryColor3bEXT proc - mov r11, __blue_glCore_glSecondaryColor3bEXT +extrn __blue_glCore_glVertexAttrib1svARB: qword +bluegl_glVertexAttrib1svARB proc + mov r11, __blue_glCore_glVertexAttrib1svARB jmp r11 -bluegl_glSecondaryColor3bEXT endp +bluegl_glVertexAttrib1svARB endp -extrn __blue_glCore_glVertexAttrib1fNV: qword -bluegl_glVertexAttrib1fNV proc - mov r11, __blue_glCore_glVertexAttrib1fNV +extrn __blue_glCore_glVertexAttrib2dARB: qword +bluegl_glVertexAttrib2dARB proc + mov r11, __blue_glCore_glVertexAttrib2dARB jmp r11 -bluegl_glVertexAttrib1fNV endp +bluegl_glVertexAttrib2dARB endp -extrn __blue_glCore_glVertexAttribI4uivEXT: qword -bluegl_glVertexAttribI4uivEXT proc - mov r11, __blue_glCore_glVertexAttribI4uivEXT +extrn __blue_glCore_glVertexAttrib2dvARB: qword +bluegl_glVertexAttrib2dvARB proc + mov r11, __blue_glCore_glVertexAttrib2dvARB jmp r11 -bluegl_glVertexAttribI4uivEXT endp +bluegl_glVertexAttrib2dvARB endp -extrn __blue_glCore_glGetQueryObjecti64vEXT: qword -bluegl_glGetQueryObjecti64vEXT proc - mov r11, __blue_glCore_glGetQueryObjecti64vEXT +extrn __blue_glCore_glVertexAttrib2fARB: qword +bluegl_glVertexAttrib2fARB proc + mov r11, __blue_glCore_glVertexAttrib2fARB jmp r11 -bluegl_glGetQueryObjecti64vEXT endp +bluegl_glVertexAttrib2fARB endp -extrn __blue_glCore_glNormalStream3bATI: qword -bluegl_glNormalStream3bATI proc - mov r11, __blue_glCore_glNormalStream3bATI +extrn __blue_glCore_glVertexAttrib2fvARB: qword +bluegl_glVertexAttrib2fvARB proc + mov r11, __blue_glCore_glVertexAttrib2fvARB jmp r11 -bluegl_glNormalStream3bATI endp +bluegl_glVertexAttrib2fvARB endp -extrn __blue_glCore_glGetObjectParameterivAPPLE: qword -bluegl_glGetObjectParameterivAPPLE proc - mov r11, __blue_glCore_glGetObjectParameterivAPPLE +extrn __blue_glCore_glVertexAttrib2sARB: qword +bluegl_glVertexAttrib2sARB proc + mov r11, __blue_glCore_glVertexAttrib2sARB jmp r11 -bluegl_glGetObjectParameterivAPPLE endp +bluegl_glVertexAttrib2sARB endp -extrn __blue_glCore_glProgramUniform3uivEXT: qword -bluegl_glProgramUniform3uivEXT proc - mov r11, __blue_glCore_glProgramUniform3uivEXT +extrn __blue_glCore_glVertexAttrib2svARB: qword +bluegl_glVertexAttrib2svARB proc + mov r11, __blue_glCore_glVertexAttrib2svARB jmp r11 -bluegl_glProgramUniform3uivEXT endp +bluegl_glVertexAttrib2svARB endp -extrn __blue_glCore_glProgramUniformHandleui64ARB: qword -bluegl_glProgramUniformHandleui64ARB proc - mov r11, __blue_glCore_glProgramUniformHandleui64ARB +extrn __blue_glCore_glVertexAttrib3dARB: qword +bluegl_glVertexAttrib3dARB proc + mov r11, __blue_glCore_glVertexAttrib3dARB jmp r11 -bluegl_glProgramUniformHandleui64ARB endp +bluegl_glVertexAttrib3dARB endp -extrn __blue_glCore_glGetPointerv: qword -bluegl_glGetPointerv proc - mov r11, __blue_glCore_glGetPointerv +extrn __blue_glCore_glVertexAttrib3dvARB: qword +bluegl_glVertexAttrib3dvARB proc + mov r11, __blue_glCore_glVertexAttrib3dvARB jmp r11 -bluegl_glGetPointerv endp +bluegl_glVertexAttrib3dvARB endp -extrn __blue_glCore_glUniformMatrix4x3dv: qword -bluegl_glUniformMatrix4x3dv proc - mov r11, __blue_glCore_glUniformMatrix4x3dv +extrn __blue_glCore_glVertexAttrib3fARB: qword +bluegl_glVertexAttrib3fARB proc + mov r11, __blue_glCore_glVertexAttrib3fARB jmp r11 -bluegl_glUniformMatrix4x3dv endp +bluegl_glVertexAttrib3fARB endp -extrn __blue_glCore_glTexCoordP4uiv: qword -bluegl_glTexCoordP4uiv proc - mov r11, __blue_glCore_glTexCoordP4uiv +extrn __blue_glCore_glVertexAttrib3fvARB: qword +bluegl_glVertexAttrib3fvARB proc + mov r11, __blue_glCore_glVertexAttrib3fvARB jmp r11 -bluegl_glTexCoordP4uiv endp +bluegl_glVertexAttrib3fvARB endp -extrn __blue_glCore_glVertexAttribI4sv: qword -bluegl_glVertexAttribI4sv proc - mov r11, __blue_glCore_glVertexAttribI4sv +extrn __blue_glCore_glVertexAttrib3sARB: qword +bluegl_glVertexAttrib3sARB proc + mov r11, __blue_glCore_glVertexAttrib3sARB jmp r11 -bluegl_glVertexAttribI4sv endp +bluegl_glVertexAttrib3sARB endp -extrn __blue_glCore_glFlushMappedNamedBufferRangeEXT: qword -bluegl_glFlushMappedNamedBufferRangeEXT proc - mov r11, __blue_glCore_glFlushMappedNamedBufferRangeEXT +extrn __blue_glCore_glVertexAttrib3svARB: qword +bluegl_glVertexAttrib3svARB proc + mov r11, __blue_glCore_glVertexAttrib3svARB jmp r11 -bluegl_glFlushMappedNamedBufferRangeEXT endp +bluegl_glVertexAttrib3svARB endp -extrn __blue_glCore_glDisableVertexArrayEXT: qword -bluegl_glDisableVertexArrayEXT proc - mov r11, __blue_glCore_glDisableVertexArrayEXT +extrn __blue_glCore_glVertexAttrib4NbvARB: qword +bluegl_glVertexAttrib4NbvARB proc + mov r11, __blue_glCore_glVertexAttrib4NbvARB jmp r11 -bluegl_glDisableVertexArrayEXT endp +bluegl_glVertexAttrib4NbvARB endp -extrn __blue_glCore_glGetPathDashArrayNV: qword -bluegl_glGetPathDashArrayNV proc - mov r11, __blue_glCore_glGetPathDashArrayNV +extrn __blue_glCore_glVertexAttrib4NivARB: qword +bluegl_glVertexAttrib4NivARB proc + mov r11, __blue_glCore_glVertexAttrib4NivARB jmp r11 -bluegl_glGetPathDashArrayNV endp +bluegl_glVertexAttrib4NivARB endp -extrn __blue_glCore_glProgramUniform2uiEXT: qword -bluegl_glProgramUniform2uiEXT proc - mov r11, __blue_glCore_glProgramUniform2uiEXT +extrn __blue_glCore_glVertexAttrib4NsvARB: qword +bluegl_glVertexAttrib4NsvARB proc + mov r11, __blue_glCore_glVertexAttrib4NsvARB jmp r11 -bluegl_glProgramUniform2uiEXT endp +bluegl_glVertexAttrib4NsvARB endp -extrn __blue_glCore_glBindImageTextures: qword -bluegl_glBindImageTextures proc - mov r11, __blue_glCore_glBindImageTextures +extrn __blue_glCore_glVertexAttrib4NubARB: qword +bluegl_glVertexAttrib4NubARB proc + mov r11, __blue_glCore_glVertexAttrib4NubARB jmp r11 -bluegl_glBindImageTextures endp +bluegl_glVertexAttrib4NubARB endp -extrn __blue_glCore_glVertexAttrib4sNV: qword -bluegl_glVertexAttrib4sNV proc - mov r11, __blue_glCore_glVertexAttrib4sNV +extrn __blue_glCore_glVertexAttrib4NubvARB: qword +bluegl_glVertexAttrib4NubvARB proc + mov r11, __blue_glCore_glVertexAttrib4NubvARB jmp r11 -bluegl_glVertexAttrib4sNV endp +bluegl_glVertexAttrib4NubvARB endp -extrn __blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN: qword -bluegl_glReplacementCodeuiNormal3fVertex3fvSUN proc - mov r11, __blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN +extrn __blue_glCore_glVertexAttrib4NuivARB: qword +bluegl_glVertexAttrib4NuivARB proc + mov r11, __blue_glCore_glVertexAttrib4NuivARB jmp r11 -bluegl_glReplacementCodeuiNormal3fVertex3fvSUN endp +bluegl_glVertexAttrib4NuivARB endp -extrn __blue_glCore_glVertex3hNV: qword -bluegl_glVertex3hNV proc - mov r11, __blue_glCore_glVertex3hNV +extrn __blue_glCore_glVertexAttrib4NusvARB: qword +bluegl_glVertexAttrib4NusvARB proc + mov r11, __blue_glCore_glVertexAttrib4NusvARB jmp r11 -bluegl_glVertex3hNV endp +bluegl_glVertexAttrib4NusvARB endp -extrn __blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN: qword -bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN proc - mov r11, __blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN +extrn __blue_glCore_glVertexAttrib4bvARB: qword +bluegl_glVertexAttrib4bvARB proc + mov r11, __blue_glCore_glVertexAttrib4bvARB jmp r11 -bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN endp +bluegl_glVertexAttrib4bvARB endp -extrn __blue_glCore_glProgramUniform2i64NV: qword -bluegl_glProgramUniform2i64NV proc - mov r11, __blue_glCore_glProgramUniform2i64NV +extrn __blue_glCore_glVertexAttrib4dARB: qword +bluegl_glVertexAttrib4dARB proc + mov r11, __blue_glCore_glVertexAttrib4dARB jmp r11 -bluegl_glProgramUniform2i64NV endp +bluegl_glVertexAttrib4dARB endp -extrn __blue_glCore_glBufferData: qword -bluegl_glBufferData proc - mov r11, __blue_glCore_glBufferData +extrn __blue_glCore_glVertexAttrib4dvARB: qword +bluegl_glVertexAttrib4dvARB proc + mov r11, __blue_glCore_glVertexAttrib4dvARB jmp r11 -bluegl_glBufferData endp +bluegl_glVertexAttrib4dvARB endp -extrn __blue_glCore_glGetBufferParameteriv: qword -bluegl_glGetBufferParameteriv proc - mov r11, __blue_glCore_glGetBufferParameteriv +extrn __blue_glCore_glVertexAttrib4fARB: qword +bluegl_glVertexAttrib4fARB proc + mov r11, __blue_glCore_glVertexAttrib4fARB jmp r11 -bluegl_glGetBufferParameteriv endp +bluegl_glVertexAttrib4fARB endp -extrn __blue_glCore_glIsAsyncMarkerSGIX: qword -bluegl_glIsAsyncMarkerSGIX proc - mov r11, __blue_glCore_glIsAsyncMarkerSGIX +extrn __blue_glCore_glVertexAttrib4fvARB: qword +bluegl_glVertexAttrib4fvARB proc + mov r11, __blue_glCore_glVertexAttrib4fvARB jmp r11 -bluegl_glIsAsyncMarkerSGIX endp +bluegl_glVertexAttrib4fvARB endp -extrn __blue_glCore_glTexImage4DSGIS: qword -bluegl_glTexImage4DSGIS proc - mov r11, __blue_glCore_glTexImage4DSGIS +extrn __blue_glCore_glVertexAttrib4ivARB: qword +bluegl_glVertexAttrib4ivARB proc + mov r11, __blue_glCore_glVertexAttrib4ivARB jmp r11 -bluegl_glTexImage4DSGIS endp +bluegl_glVertexAttrib4ivARB endp -extrn __blue_glCore_glGetMultiTexEnvivEXT: qword -bluegl_glGetMultiTexEnvivEXT proc - mov r11, __blue_glCore_glGetMultiTexEnvivEXT +extrn __blue_glCore_glVertexAttrib4sARB: qword +bluegl_glVertexAttrib4sARB proc + mov r11, __blue_glCore_glVertexAttrib4sARB jmp r11 -bluegl_glGetMultiTexEnvivEXT endp +bluegl_glVertexAttrib4sARB endp -extrn __blue_glCore_glGetClipPlanexOES: qword -bluegl_glGetClipPlanexOES proc - mov r11, __blue_glCore_glGetClipPlanexOES +extrn __blue_glCore_glVertexAttrib4svARB: qword +bluegl_glVertexAttrib4svARB proc + mov r11, __blue_glCore_glVertexAttrib4svARB jmp r11 -bluegl_glGetClipPlanexOES endp +bluegl_glVertexAttrib4svARB endp -extrn __blue_glCore_glUniform3uiEXT: qword -bluegl_glUniform3uiEXT proc - mov r11, __blue_glCore_glUniform3uiEXT +extrn __blue_glCore_glVertexAttrib4ubvARB: qword +bluegl_glVertexAttrib4ubvARB proc + mov r11, __blue_glCore_glVertexAttrib4ubvARB jmp r11 -bluegl_glUniform3uiEXT endp +bluegl_glVertexAttrib4ubvARB endp -extrn __blue_glCore_glMultiTexCoord3sv: qword -bluegl_glMultiTexCoord3sv proc - mov r11, __blue_glCore_glMultiTexCoord3sv +extrn __blue_glCore_glVertexAttrib4uivARB: qword +bluegl_glVertexAttrib4uivARB proc + mov r11, __blue_glCore_glVertexAttrib4uivARB jmp r11 -bluegl_glMultiTexCoord3sv endp +bluegl_glVertexAttrib4uivARB endp -extrn __blue_glCore_glVertexAttribs1hvNV: qword -bluegl_glVertexAttribs1hvNV proc - mov r11, __blue_glCore_glVertexAttribs1hvNV +extrn __blue_glCore_glVertexAttrib4usvARB: qword +bluegl_glVertexAttrib4usvARB proc + mov r11, __blue_glCore_glVertexAttrib4usvARB jmp r11 -bluegl_glVertexAttribs1hvNV endp +bluegl_glVertexAttrib4usvARB endp -extrn __blue_glCore_glGetPerfQueryInfoINTEL: qword -bluegl_glGetPerfQueryInfoINTEL proc - mov r11, __blue_glCore_glGetPerfQueryInfoINTEL +extrn __blue_glCore_glVertexAttribPointerARB: qword +bluegl_glVertexAttribPointerARB proc + mov r11, __blue_glCore_glVertexAttribPointerARB jmp r11 -bluegl_glGetPerfQueryInfoINTEL endp +bluegl_glVertexAttribPointerARB endp -extrn __blue_glCore_glGetClipPlanefOES: qword -bluegl_glGetClipPlanefOES proc - mov r11, __blue_glCore_glGetClipPlanefOES +extrn __blue_glCore_glEnableVertexAttribArrayARB: qword +bluegl_glEnableVertexAttribArrayARB proc + mov r11, __blue_glCore_glEnableVertexAttribArrayARB jmp r11 -bluegl_glGetClipPlanefOES endp +bluegl_glEnableVertexAttribArrayARB endp -extrn __blue_glCore_glSecondaryColor3ubEXT: qword -bluegl_glSecondaryColor3ubEXT proc - mov r11, __blue_glCore_glSecondaryColor3ubEXT +extrn __blue_glCore_glDisableVertexAttribArrayARB: qword +bluegl_glDisableVertexAttribArrayARB proc + mov r11, __blue_glCore_glDisableVertexAttribArrayARB jmp r11 -bluegl_glSecondaryColor3ubEXT endp +bluegl_glDisableVertexAttribArrayARB endp -extrn __blue_glCore_glSyncTextureINTEL: qword -bluegl_glSyncTextureINTEL proc - mov r11, __blue_glCore_glSyncTextureINTEL +extrn __blue_glCore_glGetVertexAttribdvARB: qword +bluegl_glGetVertexAttribdvARB proc + mov r11, __blue_glCore_glGetVertexAttribdvARB jmp r11 -bluegl_glSyncTextureINTEL endp +bluegl_glGetVertexAttribdvARB endp -extrn __blue_glCore_glProgramUniformMatrix3x2dv: qword -bluegl_glProgramUniformMatrix3x2dv proc - mov r11, __blue_glCore_glProgramUniformMatrix3x2dv +extrn __blue_glCore_glGetVertexAttribfvARB: qword +bluegl_glGetVertexAttribfvARB proc + mov r11, __blue_glCore_glGetVertexAttribfvARB jmp r11 -bluegl_glProgramUniformMatrix3x2dv endp +bluegl_glGetVertexAttribfvARB endp -extrn __blue_glCore_glUniformMatrix4x2fv: qword -bluegl_glUniformMatrix4x2fv proc - mov r11, __blue_glCore_glUniformMatrix4x2fv +extrn __blue_glCore_glGetVertexAttribivARB: qword +bluegl_glGetVertexAttribivARB proc + mov r11, __blue_glCore_glGetVertexAttribivARB jmp r11 -bluegl_glUniformMatrix4x2fv endp +bluegl_glGetVertexAttribivARB endp -extrn __blue_glCore_glTextureBufferEXT: qword -bluegl_glTextureBufferEXT proc - mov r11, __blue_glCore_glTextureBufferEXT +extrn __blue_glCore_glGetVertexAttribPointervARB: qword +bluegl_glGetVertexAttribPointervARB proc + mov r11, __blue_glCore_glGetVertexAttribPointervARB jmp r11 -bluegl_glTextureBufferEXT endp +bluegl_glGetVertexAttribPointervARB endp -extrn __blue_glCore_glVertexPointervINTEL: qword -bluegl_glVertexPointervINTEL proc - mov r11, __blue_glCore_glVertexPointervINTEL +extrn __blue_glCore_glBindAttribLocationARB: qword +bluegl_glBindAttribLocationARB proc + mov r11, __blue_glCore_glBindAttribLocationARB jmp r11 -bluegl_glVertexPointervINTEL endp +bluegl_glBindAttribLocationARB endp -extrn __blue_glCore_glGetShaderPrecisionFormat: qword -bluegl_glGetShaderPrecisionFormat proc - mov r11, __blue_glCore_glGetShaderPrecisionFormat +extrn __blue_glCore_glGetActiveAttribARB: qword +bluegl_glGetActiveAttribARB proc + mov r11, __blue_glCore_glGetActiveAttribARB jmp r11 -bluegl_glGetShaderPrecisionFormat endp +bluegl_glGetActiveAttribARB endp -extrn __blue_glCore_glGetTextureImage: qword -bluegl_glGetTextureImage proc - mov r11, __blue_glCore_glGetTextureImage +extrn __blue_glCore_glGetAttribLocationARB: qword +bluegl_glGetAttribLocationARB proc + mov r11, __blue_glCore_glGetAttribLocationARB jmp r11 -bluegl_glGetTextureImage endp +bluegl_glGetAttribLocationARB endp -extrn __blue_glCore_glUniform3ivARB: qword -bluegl_glUniform3ivARB proc - mov r11, __blue_glCore_glUniform3ivARB +extrn __blue_glCore_glWindowPos2dARB: qword +bluegl_glWindowPos2dARB proc + mov r11, __blue_glCore_glWindowPos2dARB jmp r11 -bluegl_glUniform3ivARB endp +bluegl_glWindowPos2dARB endp -extrn __blue_glCore_glFramebufferParameteri: qword -bluegl_glFramebufferParameteri proc - mov r11, __blue_glCore_glFramebufferParameteri +extrn __blue_glCore_glWindowPos2dvARB: qword +bluegl_glWindowPos2dvARB proc + mov r11, __blue_glCore_glWindowPos2dvARB jmp r11 -bluegl_glFramebufferParameteri endp +bluegl_glWindowPos2dvARB endp -extrn __blue_glCore_glPointParameterxvOES: qword -bluegl_glPointParameterxvOES proc - mov r11, __blue_glCore_glPointParameterxvOES +extrn __blue_glCore_glWindowPos2fARB: qword +bluegl_glWindowPos2fARB proc + mov r11, __blue_glCore_glWindowPos2fARB jmp r11 -bluegl_glPointParameterxvOES endp +bluegl_glWindowPos2fARB endp -extrn __blue_glCore_glBlendFunci: qword -bluegl_glBlendFunci proc - mov r11, __blue_glCore_glBlendFunci +extrn __blue_glCore_glWindowPos2fvARB: qword +bluegl_glWindowPos2fvARB proc + mov r11, __blue_glCore_glWindowPos2fvARB jmp r11 -bluegl_glBlendFunci endp +bluegl_glWindowPos2fvARB endp -extrn __blue_glCore_glUniformMatrix2x3dv: qword -bluegl_glUniformMatrix2x3dv proc - mov r11, __blue_glCore_glUniformMatrix2x3dv +extrn __blue_glCore_glWindowPos2iARB: qword +bluegl_glWindowPos2iARB proc + mov r11, __blue_glCore_glWindowPos2iARB jmp r11 -bluegl_glUniformMatrix2x3dv endp +bluegl_glWindowPos2iARB endp -extrn __blue_glCore_glUniform2i64ARB: qword -bluegl_glUniform2i64ARB proc - mov r11, __blue_glCore_glUniform2i64ARB +extrn __blue_glCore_glWindowPos2ivARB: qword +bluegl_glWindowPos2ivARB proc + mov r11, __blue_glCore_glWindowPos2ivARB jmp r11 -bluegl_glUniform2i64ARB endp +bluegl_glWindowPos2ivARB endp -extrn __blue_glCore_glProgramEnvParameterI4ivNV: qword -bluegl_glProgramEnvParameterI4ivNV proc - mov r11, __blue_glCore_glProgramEnvParameterI4ivNV +extrn __blue_glCore_glWindowPos2sARB: qword +bluegl_glWindowPos2sARB proc + mov r11, __blue_glCore_glWindowPos2sARB jmp r11 -bluegl_glProgramEnvParameterI4ivNV endp +bluegl_glWindowPos2sARB endp -extrn __blue_glCore_glFragmentLightModelivSGIX: qword -bluegl_glFragmentLightModelivSGIX proc - mov r11, __blue_glCore_glFragmentLightModelivSGIX +extrn __blue_glCore_glWindowPos2svARB: qword +bluegl_glWindowPos2svARB proc + mov r11, __blue_glCore_glWindowPos2svARB jmp r11 -bluegl_glFragmentLightModelivSGIX endp +bluegl_glWindowPos2svARB endp -extrn __blue_glCore_glProgramUniform4ui64vARB: qword -bluegl_glProgramUniform4ui64vARB proc - mov r11, __blue_glCore_glProgramUniform4ui64vARB +extrn __blue_glCore_glWindowPos3dARB: qword +bluegl_glWindowPos3dARB proc + mov r11, __blue_glCore_glWindowPos3dARB jmp r11 -bluegl_glProgramUniform4ui64vARB endp +bluegl_glWindowPos3dARB endp -extrn __blue_glCore_glProgramUniformMatrix2x3fvEXT: qword -bluegl_glProgramUniformMatrix2x3fvEXT proc - mov r11, __blue_glCore_glProgramUniformMatrix2x3fvEXT +extrn __blue_glCore_glWindowPos3dvARB: qword +bluegl_glWindowPos3dvARB proc + mov r11, __blue_glCore_glWindowPos3dvARB jmp r11 -bluegl_glProgramUniformMatrix2x3fvEXT endp +bluegl_glWindowPos3dvARB endp -extrn __blue_glCore_glStencilClearTagEXT: qword -bluegl_glStencilClearTagEXT proc - mov r11, __blue_glCore_glStencilClearTagEXT +extrn __blue_glCore_glWindowPos3fARB: qword +bluegl_glWindowPos3fARB proc + mov r11, __blue_glCore_glWindowPos3fARB jmp r11 -bluegl_glStencilClearTagEXT endp +bluegl_glWindowPos3fARB endp -extrn __blue_glCore_glMultiTexCoord4s: qword -bluegl_glMultiTexCoord4s proc - mov r11, __blue_glCore_glMultiTexCoord4s +extrn __blue_glCore_glWindowPos3fvARB: qword +bluegl_glWindowPos3fvARB proc + mov r11, __blue_glCore_glWindowPos3fvARB jmp r11 -bluegl_glMultiTexCoord4s endp +bluegl_glWindowPos3fvARB endp -extrn __blue_glCore_glProgramUniformMatrix4dvEXT: qword -bluegl_glProgramUniformMatrix4dvEXT proc - mov r11, __blue_glCore_glProgramUniformMatrix4dvEXT +extrn __blue_glCore_glWindowPos3iARB: qword +bluegl_glWindowPos3iARB proc + mov r11, __blue_glCore_glWindowPos3iARB jmp r11 -bluegl_glProgramUniformMatrix4dvEXT endp +bluegl_glWindowPos3iARB endp -extrn __blue_glCore_glGetNamedBufferParameteri64v: qword -bluegl_glGetNamedBufferParameteri64v proc - mov r11, __blue_glCore_glGetNamedBufferParameteri64v +extrn __blue_glCore_glWindowPos3ivARB: qword +bluegl_glWindowPos3ivARB proc + mov r11, __blue_glCore_glWindowPos3ivARB jmp r11 -bluegl_glGetNamedBufferParameteri64v endp +bluegl_glWindowPos3ivARB endp -extrn __blue_glCore_glVertexAttribI3iEXT: qword -bluegl_glVertexAttribI3iEXT proc - mov r11, __blue_glCore_glVertexAttribI3iEXT +extrn __blue_glCore_glWindowPos3sARB: qword +bluegl_glWindowPos3sARB proc + mov r11, __blue_glCore_glWindowPos3sARB jmp r11 -bluegl_glVertexAttribI3iEXT endp +bluegl_glWindowPos3sARB endp -extrn __blue_glCore_glReplacementCodeuivSUN: qword -bluegl_glReplacementCodeuivSUN proc - mov r11, __blue_glCore_glReplacementCodeuivSUN +extrn __blue_glCore_glWindowPos3svARB: qword +bluegl_glWindowPos3svARB proc + mov r11, __blue_glCore_glWindowPos3svARB jmp r11 -bluegl_glReplacementCodeuivSUN endp +bluegl_glWindowPos3svARB endp -extrn __blue_glCore_glFragmentLightModeliSGIX: qword -bluegl_glFragmentLightModeliSGIX proc - mov r11, __blue_glCore_glFragmentLightModeliSGIX +extrn __blue_glCore_glBlendBarrierKHR: qword +bluegl_glBlendBarrierKHR proc + mov r11, __blue_glCore_glBlendBarrierKHR jmp r11 -bluegl_glFragmentLightModeliSGIX endp +bluegl_glBlendBarrierKHR endp -extrn __blue_glCore_glUniform2i64vNV: qword -bluegl_glUniform2i64vNV proc - mov r11, __blue_glCore_glUniform2i64vNV +extrn __blue_glCore_glMultiTexCoord1bOES: qword +bluegl_glMultiTexCoord1bOES proc + mov r11, __blue_glCore_glMultiTexCoord1bOES jmp r11 -bluegl_glUniform2i64vNV endp +bluegl_glMultiTexCoord1bOES endp -extrn __blue_glCore_glPointParameterivNV: qword -bluegl_glPointParameterivNV proc - mov r11, __blue_glCore_glPointParameterivNV +extrn __blue_glCore_glMultiTexCoord1bvOES: qword +bluegl_glMultiTexCoord1bvOES proc + mov r11, __blue_glCore_glMultiTexCoord1bvOES jmp r11 -bluegl_glPointParameterivNV endp +bluegl_glMultiTexCoord1bvOES endp -extrn __blue_glCore_glStencilStrokePathInstancedNV: qword -bluegl_glStencilStrokePathInstancedNV proc - mov r11, __blue_glCore_glStencilStrokePathInstancedNV +extrn __blue_glCore_glMultiTexCoord2bOES: qword +bluegl_glMultiTexCoord2bOES proc + mov r11, __blue_glCore_glMultiTexCoord2bOES jmp r11 -bluegl_glStencilStrokePathInstancedNV endp +bluegl_glMultiTexCoord2bOES endp -extrn __blue_glCore_glInsertComponentEXT: qword -bluegl_glInsertComponentEXT proc - mov r11, __blue_glCore_glInsertComponentEXT +extrn __blue_glCore_glMultiTexCoord2bvOES: qword +bluegl_glMultiTexCoord2bvOES proc + mov r11, __blue_glCore_glMultiTexCoord2bvOES jmp r11 -bluegl_glInsertComponentEXT endp +bluegl_glMultiTexCoord2bvOES endp -extrn __blue_glCore_glIsEnabled: qword -bluegl_glIsEnabled proc - mov r11, __blue_glCore_glIsEnabled +extrn __blue_glCore_glMultiTexCoord3bOES: qword +bluegl_glMultiTexCoord3bOES proc + mov r11, __blue_glCore_glMultiTexCoord3bOES jmp r11 -bluegl_glIsEnabled endp +bluegl_glMultiTexCoord3bOES endp -extrn __blue_glCore_glWindowPos3dMESA: qword -bluegl_glWindowPos3dMESA proc - mov r11, __blue_glCore_glWindowPos3dMESA +extrn __blue_glCore_glMultiTexCoord3bvOES: qword +bluegl_glMultiTexCoord3bvOES proc + mov r11, __blue_glCore_glMultiTexCoord3bvOES jmp r11 -bluegl_glWindowPos3dMESA endp +bluegl_glMultiTexCoord3bvOES endp -extrn __blue_glCore_glGetnCompressedTexImage: qword -bluegl_glGetnCompressedTexImage proc - mov r11, __blue_glCore_glGetnCompressedTexImage +extrn __blue_glCore_glMultiTexCoord4bOES: qword +bluegl_glMultiTexCoord4bOES proc + mov r11, __blue_glCore_glMultiTexCoord4bOES jmp r11 -bluegl_glGetnCompressedTexImage endp +bluegl_glMultiTexCoord4bOES endp -extrn __blue_glCore_glCopyMultiTexSubImage2DEXT: qword -bluegl_glCopyMultiTexSubImage2DEXT proc - mov r11, __blue_glCore_glCopyMultiTexSubImage2DEXT +extrn __blue_glCore_glMultiTexCoord4bvOES: qword +bluegl_glMultiTexCoord4bvOES proc + mov r11, __blue_glCore_glMultiTexCoord4bvOES jmp r11 -bluegl_glCopyMultiTexSubImage2DEXT endp +bluegl_glMultiTexCoord4bvOES endp -extrn __blue_glCore_glDisableIndexedEXT: qword -bluegl_glDisableIndexedEXT proc - mov r11, __blue_glCore_glDisableIndexedEXT +extrn __blue_glCore_glTexCoord1bOES: qword +bluegl_glTexCoord1bOES proc + mov r11, __blue_glCore_glTexCoord1bOES jmp r11 -bluegl_glDisableIndexedEXT endp +bluegl_glTexCoord1bOES endp -extrn __blue_glCore_glWindowPos2dv: qword -bluegl_glWindowPos2dv proc - mov r11, __blue_glCore_glWindowPos2dv +extrn __blue_glCore_glTexCoord1bvOES: qword +bluegl_glTexCoord1bvOES proc + mov r11, __blue_glCore_glTexCoord1bvOES jmp r11 -bluegl_glWindowPos2dv endp +bluegl_glTexCoord1bvOES endp -extrn __blue_glCore_glAlphaFuncxOES: qword -bluegl_glAlphaFuncxOES proc - mov r11, __blue_glCore_glAlphaFuncxOES +extrn __blue_glCore_glTexCoord2bOES: qword +bluegl_glTexCoord2bOES proc + mov r11, __blue_glCore_glTexCoord2bOES jmp r11 -bluegl_glAlphaFuncxOES endp +bluegl_glTexCoord2bOES endp -extrn __blue_glCore_glCreateFramebuffers: qword -bluegl_glCreateFramebuffers proc - mov r11, __blue_glCore_glCreateFramebuffers +extrn __blue_glCore_glTexCoord2bvOES: qword +bluegl_glTexCoord2bvOES proc + mov r11, __blue_glCore_glTexCoord2bvOES jmp r11 -bluegl_glCreateFramebuffers endp +bluegl_glTexCoord2bvOES endp -extrn __blue_glCore_glGetAttribLocationARB: qword -bluegl_glGetAttribLocationARB proc - mov r11, __blue_glCore_glGetAttribLocationARB +extrn __blue_glCore_glTexCoord3bOES: qword +bluegl_glTexCoord3bOES proc + mov r11, __blue_glCore_glTexCoord3bOES jmp r11 -bluegl_glGetAttribLocationARB endp +bluegl_glTexCoord3bOES endp -extrn __blue_glCore_glVertexAttrib1sARB: qword -bluegl_glVertexAttrib1sARB proc - mov r11, __blue_glCore_glVertexAttrib1sARB +extrn __blue_glCore_glTexCoord3bvOES: qword +bluegl_glTexCoord3bvOES proc + mov r11, __blue_glCore_glTexCoord3bvOES jmp r11 -bluegl_glVertexAttrib1sARB endp +bluegl_glTexCoord3bvOES endp -extrn __blue_glCore_glTexBumpParameterfvATI: qword -bluegl_glTexBumpParameterfvATI proc - mov r11, __blue_glCore_glTexBumpParameterfvATI +extrn __blue_glCore_glTexCoord4bOES: qword +bluegl_glTexCoord4bOES proc + mov r11, __blue_glCore_glTexCoord4bOES jmp r11 -bluegl_glTexBumpParameterfvATI endp +bluegl_glTexCoord4bOES endp -extrn __blue_glCore_glGetActiveSubroutineUniformiv: qword -bluegl_glGetActiveSubroutineUniformiv proc - mov r11, __blue_glCore_glGetActiveSubroutineUniformiv +extrn __blue_glCore_glTexCoord4bvOES: qword +bluegl_glTexCoord4bvOES proc + mov r11, __blue_glCore_glTexCoord4bvOES jmp r11 -bluegl_glGetActiveSubroutineUniformiv endp +bluegl_glTexCoord4bvOES endp -extrn __blue_glCore_glVertexAttrib2fARB: qword -bluegl_glVertexAttrib2fARB proc - mov r11, __blue_glCore_glVertexAttrib2fARB +extrn __blue_glCore_glVertex2bOES: qword +bluegl_glVertex2bOES proc + mov r11, __blue_glCore_glVertex2bOES jmp r11 -bluegl_glVertexAttrib2fARB endp +bluegl_glVertex2bOES endp -extrn __blue_glCore_glGetTransformFeedbacki64_v: qword -bluegl_glGetTransformFeedbacki64_v proc - mov r11, __blue_glCore_glGetTransformFeedbacki64_v +extrn __blue_glCore_glVertex2bvOES: qword +bluegl_glVertex2bvOES proc + mov r11, __blue_glCore_glVertex2bvOES jmp r11 -bluegl_glGetTransformFeedbacki64_v endp +bluegl_glVertex2bvOES endp -extrn __blue_glCore_glMultiTexCoord4hvNV: qword -bluegl_glMultiTexCoord4hvNV proc - mov r11, __blue_glCore_glMultiTexCoord4hvNV +extrn __blue_glCore_glVertex3bOES: qword +bluegl_glVertex3bOES proc + mov r11, __blue_glCore_glVertex3bOES jmp r11 -bluegl_glMultiTexCoord4hvNV endp +bluegl_glVertex3bOES endp -extrn __blue_glCore_glBlendColorEXT: qword -bluegl_glBlendColorEXT proc - mov r11, __blue_glCore_glBlendColorEXT +extrn __blue_glCore_glVertex3bvOES: qword +bluegl_glVertex3bvOES proc + mov r11, __blue_glCore_glVertex3bvOES jmp r11 -bluegl_glBlendColorEXT endp +bluegl_glVertex3bvOES endp -extrn __blue_glCore_glCompressedTexSubImage3D: qword -bluegl_glCompressedTexSubImage3D proc - mov r11, __blue_glCore_glCompressedTexSubImage3D +extrn __blue_glCore_glVertex4bOES: qword +bluegl_glVertex4bOES proc + mov r11, __blue_glCore_glVertex4bOES jmp r11 -bluegl_glCompressedTexSubImage3D endp +bluegl_glVertex4bOES endp -extrn __blue_glCore_glVertexStream4dvATI: qword -bluegl_glVertexStream4dvATI proc - mov r11, __blue_glCore_glVertexStream4dvATI +extrn __blue_glCore_glVertex4bvOES: qword +bluegl_glVertex4bvOES proc + mov r11, __blue_glCore_glVertex4bvOES jmp r11 -bluegl_glVertexStream4dvATI endp +bluegl_glVertex4bvOES endp -extrn __blue_glCore_glMaxShaderCompilerThreadsARB: qword -bluegl_glMaxShaderCompilerThreadsARB proc - mov r11, __blue_glCore_glMaxShaderCompilerThreadsARB +extrn __blue_glCore_glAlphaFuncxOES: qword +bluegl_glAlphaFuncxOES proc + mov r11, __blue_glCore_glAlphaFuncxOES jmp r11 -bluegl_glMaxShaderCompilerThreadsARB endp +bluegl_glAlphaFuncxOES endp -extrn __blue_glCore_glGlobalAlphaFactorbSUN: qword -bluegl_glGlobalAlphaFactorbSUN proc - mov r11, __blue_glCore_glGlobalAlphaFactorbSUN +extrn __blue_glCore_glClearColorxOES: qword +bluegl_glClearColorxOES proc + mov r11, __blue_glCore_glClearColorxOES jmp r11 -bluegl_glGlobalAlphaFactorbSUN endp +bluegl_glClearColorxOES endp -extrn __blue_glCore_glGlobalAlphaFactoruiSUN: qword -bluegl_glGlobalAlphaFactoruiSUN proc - mov r11, __blue_glCore_glGlobalAlphaFactoruiSUN +extrn __blue_glCore_glClearDepthxOES: qword +bluegl_glClearDepthxOES proc + mov r11, __blue_glCore_glClearDepthxOES jmp r11 -bluegl_glGlobalAlphaFactoruiSUN endp +bluegl_glClearDepthxOES endp -extrn __blue_glCore_glClientActiveTextureARB: qword -bluegl_glClientActiveTextureARB proc - mov r11, __blue_glCore_glClientActiveTextureARB +extrn __blue_glCore_glClipPlanexOES: qword +bluegl_glClipPlanexOES proc + mov r11, __blue_glCore_glClipPlanexOES jmp r11 -bluegl_glClientActiveTextureARB endp +bluegl_glClipPlanexOES endp -extrn __blue_glCore_glGenProgramsARB: qword -bluegl_glGenProgramsARB proc - mov r11, __blue_glCore_glGenProgramsARB +extrn __blue_glCore_glColor4xOES: qword +bluegl_glColor4xOES proc + mov r11, __blue_glCore_glColor4xOES jmp r11 -bluegl_glGenProgramsARB endp +bluegl_glColor4xOES endp -extrn __blue_glCore_glGetTexParameterPointervAPPLE: qword -bluegl_glGetTexParameterPointervAPPLE proc - mov r11, __blue_glCore_glGetTexParameterPointervAPPLE +extrn __blue_glCore_glDepthRangexOES: qword +bluegl_glDepthRangexOES proc + mov r11, __blue_glCore_glDepthRangexOES jmp r11 -bluegl_glGetTexParameterPointervAPPLE endp +bluegl_glDepthRangexOES endp -extrn __blue_glCore_glGetBooleanv: qword -bluegl_glGetBooleanv proc - mov r11, __blue_glCore_glGetBooleanv +extrn __blue_glCore_glFogxOES: qword +bluegl_glFogxOES proc + mov r11, __blue_glCore_glFogxOES jmp r11 -bluegl_glGetBooleanv endp +bluegl_glFogxOES endp -extrn __blue_glCore_glDrawElementsBaseVertex: qword -bluegl_glDrawElementsBaseVertex proc - mov r11, __blue_glCore_glDrawElementsBaseVertex +extrn __blue_glCore_glFogxvOES: qword +bluegl_glFogxvOES proc + mov r11, __blue_glCore_glFogxvOES jmp r11 -bluegl_glDrawElementsBaseVertex endp +bluegl_glFogxvOES endp -extrn __blue_glCore_glVertexAttribL4ui64vNV: qword -bluegl_glVertexAttribL4ui64vNV proc - mov r11, __blue_glCore_glVertexAttribL4ui64vNV +extrn __blue_glCore_glFrustumxOES: qword +bluegl_glFrustumxOES proc + mov r11, __blue_glCore_glFrustumxOES jmp r11 -bluegl_glVertexAttribL4ui64vNV endp +bluegl_glFrustumxOES endp -extrn __blue_glCore_glSecondaryColor3fvEXT: qword -bluegl_glSecondaryColor3fvEXT proc - mov r11, __blue_glCore_glSecondaryColor3fvEXT +extrn __blue_glCore_glGetClipPlanexOES: qword +bluegl_glGetClipPlanexOES proc + mov r11, __blue_glCore_glGetClipPlanexOES jmp r11 -bluegl_glSecondaryColor3fvEXT endp +bluegl_glGetClipPlanexOES endp -extrn __blue_glCore_glMultiTexCoord1s: qword -bluegl_glMultiTexCoord1s proc - mov r11, __blue_glCore_glMultiTexCoord1s +extrn __blue_glCore_glGetFixedvOES: qword +bluegl_glGetFixedvOES proc + mov r11, __blue_glCore_glGetFixedvOES jmp r11 -bluegl_glMultiTexCoord1s endp +bluegl_glGetFixedvOES endp -extrn __blue_glCore_glDeleteProgramsARB: qword -bluegl_glDeleteProgramsARB proc - mov r11, __blue_glCore_glDeleteProgramsARB +extrn __blue_glCore_glGetTexEnvxvOES: qword +bluegl_glGetTexEnvxvOES proc + mov r11, __blue_glCore_glGetTexEnvxvOES jmp r11 -bluegl_glDeleteProgramsARB endp +bluegl_glGetTexEnvxvOES endp -extrn __blue_glCore_glDrawElementsInstancedBaseVertex: qword -bluegl_glDrawElementsInstancedBaseVertex proc - mov r11, __blue_glCore_glDrawElementsInstancedBaseVertex +extrn __blue_glCore_glGetTexParameterxvOES: qword +bluegl_glGetTexParameterxvOES proc + mov r11, __blue_glCore_glGetTexParameterxvOES jmp r11 -bluegl_glDrawElementsInstancedBaseVertex endp +bluegl_glGetTexParameterxvOES endp -extrn __blue_glCore_glProgramUniform4dEXT: qword -bluegl_glProgramUniform4dEXT proc - mov r11, __blue_glCore_glProgramUniform4dEXT +extrn __blue_glCore_glLightModelxOES: qword +bluegl_glLightModelxOES proc + mov r11, __blue_glCore_glLightModelxOES jmp r11 -bluegl_glProgramUniform4dEXT endp +bluegl_glLightModelxOES endp -extrn __blue_glCore_glGetPathMetricRangeNV: qword -bluegl_glGetPathMetricRangeNV proc - mov r11, __blue_glCore_glGetPathMetricRangeNV +extrn __blue_glCore_glLightModelxvOES: qword +bluegl_glLightModelxvOES proc + mov r11, __blue_glCore_glLightModelxvOES jmp r11 -bluegl_glGetPathMetricRangeNV endp +bluegl_glLightModelxvOES endp -extrn __blue_glCore_glProgramUniform3iEXT: qword -bluegl_glProgramUniform3iEXT proc - mov r11, __blue_glCore_glProgramUniform3iEXT +extrn __blue_glCore_glLightxOES: qword +bluegl_glLightxOES proc + mov r11, __blue_glCore_glLightxOES jmp r11 -bluegl_glProgramUniform3iEXT endp +bluegl_glLightxOES endp -extrn __blue_glCore_glDeleteBuffers: qword -bluegl_glDeleteBuffers proc - mov r11, __blue_glCore_glDeleteBuffers +extrn __blue_glCore_glLightxvOES: qword +bluegl_glLightxvOES proc + mov r11, __blue_glCore_glLightxvOES jmp r11 -bluegl_glDeleteBuffers endp +bluegl_glLightxvOES endp -extrn __blue_glCore_glSecondaryColor3usEXT: qword -bluegl_glSecondaryColor3usEXT proc - mov r11, __blue_glCore_glSecondaryColor3usEXT +extrn __blue_glCore_glLineWidthxOES: qword +bluegl_glLineWidthxOES proc + mov r11, __blue_glCore_glLineWidthxOES jmp r11 -bluegl_glSecondaryColor3usEXT endp +bluegl_glLineWidthxOES endp -extrn __blue_glCore_glDepthMask: qword -bluegl_glDepthMask proc - mov r11, __blue_glCore_glDepthMask +extrn __blue_glCore_glLoadMatrixxOES: qword +bluegl_glLoadMatrixxOES proc + mov r11, __blue_glCore_glLoadMatrixxOES jmp r11 -bluegl_glDepthMask endp +bluegl_glLoadMatrixxOES endp -extrn __blue_glCore_glMultiTexCoord2dv: qword -bluegl_glMultiTexCoord2dv proc - mov r11, __blue_glCore_glMultiTexCoord2dv +extrn __blue_glCore_glMaterialxOES: qword +bluegl_glMaterialxOES proc + mov r11, __blue_glCore_glMaterialxOES jmp r11 -bluegl_glMultiTexCoord2dv endp +bluegl_glMaterialxOES endp -extrn __blue_glCore_glCopyConvolutionFilter2DEXT: qword -bluegl_glCopyConvolutionFilter2DEXT proc - mov r11, __blue_glCore_glCopyConvolutionFilter2DEXT +extrn __blue_glCore_glMaterialxvOES: qword +bluegl_glMaterialxvOES proc + mov r11, __blue_glCore_glMaterialxvOES jmp r11 -bluegl_glCopyConvolutionFilter2DEXT endp +bluegl_glMaterialxvOES endp -extrn __blue_glCore_glLoadTransposeMatrixxOES: qword -bluegl_glLoadTransposeMatrixxOES proc - mov r11, __blue_glCore_glLoadTransposeMatrixxOES +extrn __blue_glCore_glMultMatrixxOES: qword +bluegl_glMultMatrixxOES proc + mov r11, __blue_glCore_glMultMatrixxOES jmp r11 -bluegl_glLoadTransposeMatrixxOES endp +bluegl_glMultMatrixxOES endp -extrn __blue_glCore_glPixelStoref: qword -bluegl_glPixelStoref proc - mov r11, __blue_glCore_glPixelStoref +extrn __blue_glCore_glMultiTexCoord4xOES: qword +bluegl_glMultiTexCoord4xOES proc + mov r11, __blue_glCore_glMultiTexCoord4xOES jmp r11 -bluegl_glPixelStoref endp +bluegl_glMultiTexCoord4xOES endp -extrn __blue_glCore_glStencilOpSeparateATI: qword -bluegl_glStencilOpSeparateATI proc - mov r11, __blue_glCore_glStencilOpSeparateATI +extrn __blue_glCore_glNormal3xOES: qword +bluegl_glNormal3xOES proc + mov r11, __blue_glCore_glNormal3xOES jmp r11 -bluegl_glStencilOpSeparateATI endp +bluegl_glNormal3xOES endp -extrn __blue_glCore_glCopyTextureSubImage1DEXT: qword -bluegl_glCopyTextureSubImage1DEXT proc - mov r11, __blue_glCore_glCopyTextureSubImage1DEXT +extrn __blue_glCore_glOrthoxOES: qword +bluegl_glOrthoxOES proc + mov r11, __blue_glCore_glOrthoxOES jmp r11 -bluegl_glCopyTextureSubImage1DEXT endp +bluegl_glOrthoxOES endp -extrn __blue_glCore_glMatrixScaledEXT: qword -bluegl_glMatrixScaledEXT proc - mov r11, __blue_glCore_glMatrixScaledEXT +extrn __blue_glCore_glPointParameterxvOES: qword +bluegl_glPointParameterxvOES proc + mov r11, __blue_glCore_glPointParameterxvOES jmp r11 -bluegl_glMatrixScaledEXT endp +bluegl_glPointParameterxvOES endp -extrn __blue_glCore_glProgramUniform2i64ARB: qword -bluegl_glProgramUniform2i64ARB proc - mov r11, __blue_glCore_glProgramUniform2i64ARB +extrn __blue_glCore_glPointSizexOES: qword +bluegl_glPointSizexOES proc + mov r11, __blue_glCore_glPointSizexOES jmp r11 -bluegl_glProgramUniform2i64ARB endp +bluegl_glPointSizexOES endp -extrn __blue_glCore_glTextureParameterfEXT: qword -bluegl_glTextureParameterfEXT proc - mov r11, __blue_glCore_glTextureParameterfEXT +extrn __blue_glCore_glPolygonOffsetxOES: qword +bluegl_glPolygonOffsetxOES proc + mov r11, __blue_glCore_glPolygonOffsetxOES jmp r11 -bluegl_glTextureParameterfEXT endp +bluegl_glPolygonOffsetxOES endp -extrn __blue_glCore_glGetProgramLocalParameterIivNV: qword -bluegl_glGetProgramLocalParameterIivNV proc - mov r11, __blue_glCore_glGetProgramLocalParameterIivNV +extrn __blue_glCore_glRotatexOES: qword +bluegl_glRotatexOES proc + mov r11, __blue_glCore_glRotatexOES jmp r11 -bluegl_glGetProgramLocalParameterIivNV endp +bluegl_glRotatexOES endp -extrn __blue_glCore_glGetShaderInfoLog: qword -bluegl_glGetShaderInfoLog proc - mov r11, __blue_glCore_glGetShaderInfoLog +extrn __blue_glCore_glScalexOES: qword +bluegl_glScalexOES proc + mov r11, __blue_glCore_glScalexOES jmp r11 -bluegl_glGetShaderInfoLog endp +bluegl_glScalexOES endp -extrn __blue_glCore_glTexCoordP2uiv: qword -bluegl_glTexCoordP2uiv proc - mov r11, __blue_glCore_glTexCoordP2uiv +extrn __blue_glCore_glTexEnvxOES: qword +bluegl_glTexEnvxOES proc + mov r11, __blue_glCore_glTexEnvxOES jmp r11 -bluegl_glTexCoordP2uiv endp +bluegl_glTexEnvxOES endp -extrn __blue_glCore_glDebugMessageCallback: qword -bluegl_glDebugMessageCallback proc - mov r11, __blue_glCore_glDebugMessageCallback +extrn __blue_glCore_glTexEnvxvOES: qword +bluegl_glTexEnvxvOES proc + mov r11, __blue_glCore_glTexEnvxvOES jmp r11 -bluegl_glDebugMessageCallback endp +bluegl_glTexEnvxvOES endp -extrn __blue_glCore_glLoadTransposeMatrixfARB: qword -bluegl_glLoadTransposeMatrixfARB proc - mov r11, __blue_glCore_glLoadTransposeMatrixfARB +extrn __blue_glCore_glTexParameterxOES: qword +bluegl_glTexParameterxOES proc + mov r11, __blue_glCore_glTexParameterxOES jmp r11 -bluegl_glLoadTransposeMatrixfARB endp +bluegl_glTexParameterxOES endp -extrn __blue_glCore_glUniform1ui: qword -bluegl_glUniform1ui proc - mov r11, __blue_glCore_glUniform1ui +extrn __blue_glCore_glTexParameterxvOES: qword +bluegl_glTexParameterxvOES proc + mov r11, __blue_glCore_glTexParameterxvOES jmp r11 -bluegl_glUniform1ui endp +bluegl_glTexParameterxvOES endp -extrn __blue_glCore_glVertexAttribL4dvEXT: qword -bluegl_glVertexAttribL4dvEXT proc - mov r11, __blue_glCore_glVertexAttribL4dvEXT +extrn __blue_glCore_glTranslatexOES: qword +bluegl_glTranslatexOES proc + mov r11, __blue_glCore_glTranslatexOES jmp r11 -bluegl_glVertexAttribL4dvEXT endp +bluegl_glTranslatexOES endp -extrn __blue_glCore_glVertex3bvOES: qword -bluegl_glVertex3bvOES proc - mov r11, __blue_glCore_glVertex3bvOES +extrn __blue_glCore_glAccumxOES: qword +bluegl_glAccumxOES proc + mov r11, __blue_glCore_glAccumxOES jmp r11 -bluegl_glVertex3bvOES endp +bluegl_glAccumxOES endp -extrn __blue_glCore_glPassThroughxOES: qword -bluegl_glPassThroughxOES proc - mov r11, __blue_glCore_glPassThroughxOES +extrn __blue_glCore_glBitmapxOES: qword +bluegl_glBitmapxOES proc + mov r11, __blue_glCore_glBitmapxOES jmp r11 -bluegl_glPassThroughxOES endp +bluegl_glBitmapxOES endp -extrn __blue_glCore_glGetFloatIndexedvEXT: qword -bluegl_glGetFloatIndexedvEXT proc - mov r11, __blue_glCore_glGetFloatIndexedvEXT +extrn __blue_glCore_glBlendColorxOES: qword +bluegl_glBlendColorxOES proc + mov r11, __blue_glCore_glBlendColorxOES jmp r11 -bluegl_glGetFloatIndexedvEXT endp +bluegl_glBlendColorxOES endp -extrn __blue_glCore_glSubpixelPrecisionBiasNV: qword -bluegl_glSubpixelPrecisionBiasNV proc - mov r11, __blue_glCore_glSubpixelPrecisionBiasNV +extrn __blue_glCore_glClearAccumxOES: qword +bluegl_glClearAccumxOES proc + mov r11, __blue_glCore_glClearAccumxOES jmp r11 -bluegl_glSubpixelPrecisionBiasNV endp +bluegl_glClearAccumxOES endp -extrn __blue_glCore_glFinishFenceNV: qword -bluegl_glFinishFenceNV proc - mov r11, __blue_glCore_glFinishFenceNV +extrn __blue_glCore_glColor3xOES: qword +bluegl_glColor3xOES proc + mov r11, __blue_glCore_glColor3xOES jmp r11 -bluegl_glFinishFenceNV endp +bluegl_glColor3xOES endp -extrn __blue_glCore_glGetProgramBinary: qword -bluegl_glGetProgramBinary proc - mov r11, __blue_glCore_glGetProgramBinary +extrn __blue_glCore_glColor3xvOES: qword +bluegl_glColor3xvOES proc + mov r11, __blue_glCore_glColor3xvOES jmp r11 -bluegl_glGetProgramBinary endp +bluegl_glColor3xvOES endp -extrn __blue_glCore_glBlendFuncSeparateIndexedAMD: qword -bluegl_glBlendFuncSeparateIndexedAMD proc - mov r11, __blue_glCore_glBlendFuncSeparateIndexedAMD +extrn __blue_glCore_glColor4xvOES: qword +bluegl_glColor4xvOES proc + mov r11, __blue_glCore_glColor4xvOES jmp r11 -bluegl_glBlendFuncSeparateIndexedAMD endp +bluegl_glColor4xvOES endp -extrn __blue_glCore_glBlendFuncSeparate: qword -bluegl_glBlendFuncSeparate proc - mov r11, __blue_glCore_glBlendFuncSeparate +extrn __blue_glCore_glConvolutionParameterxOES: qword +bluegl_glConvolutionParameterxOES proc + mov r11, __blue_glCore_glConvolutionParameterxOES jmp r11 -bluegl_glBlendFuncSeparate endp +bluegl_glConvolutionParameterxOES endp -extrn __blue_glCore_glIndexxvOES: qword -bluegl_glIndexxvOES proc - mov r11, __blue_glCore_glIndexxvOES +extrn __blue_glCore_glConvolutionParameterxvOES: qword +bluegl_glConvolutionParameterxvOES proc + mov r11, __blue_glCore_glConvolutionParameterxvOES jmp r11 -bluegl_glIndexxvOES endp +bluegl_glConvolutionParameterxvOES endp -extrn __blue_glCore_glVertexAttrib4NuivARB: qword -bluegl_glVertexAttrib4NuivARB proc - mov r11, __blue_glCore_glVertexAttrib4NuivARB +extrn __blue_glCore_glEvalCoord1xOES: qword +bluegl_glEvalCoord1xOES proc + mov r11, __blue_glCore_glEvalCoord1xOES jmp r11 -bluegl_glVertexAttrib4NuivARB endp +bluegl_glEvalCoord1xOES endp -extrn __blue_glCore_glUniform2ui64ARB: qword -bluegl_glUniform2ui64ARB proc - mov r11, __blue_glCore_glUniform2ui64ARB +extrn __blue_glCore_glEvalCoord1xvOES: qword +bluegl_glEvalCoord1xvOES proc + mov r11, __blue_glCore_glEvalCoord1xvOES jmp r11 -bluegl_glUniform2ui64ARB endp +bluegl_glEvalCoord1xvOES endp -extrn __blue_glCore_glEndPerfMonitorAMD: qword -bluegl_glEndPerfMonitorAMD proc - mov r11, __blue_glCore_glEndPerfMonitorAMD +extrn __blue_glCore_glEvalCoord2xOES: qword +bluegl_glEvalCoord2xOES proc + mov r11, __blue_glCore_glEvalCoord2xOES jmp r11 -bluegl_glEndPerfMonitorAMD endp +bluegl_glEvalCoord2xOES endp -extrn __blue_glCore_glReleaseShaderCompiler: qword -bluegl_glReleaseShaderCompiler proc - mov r11, __blue_glCore_glReleaseShaderCompiler +extrn __blue_glCore_glEvalCoord2xvOES: qword +bluegl_glEvalCoord2xvOES proc + mov r11, __blue_glCore_glEvalCoord2xvOES jmp r11 -bluegl_glReleaseShaderCompiler endp +bluegl_glEvalCoord2xvOES endp -extrn __blue_glCore_glGenFramebuffersEXT: qword -bluegl_glGenFramebuffersEXT proc - mov r11, __blue_glCore_glGenFramebuffersEXT +extrn __blue_glCore_glFeedbackBufferxOES: qword +bluegl_glFeedbackBufferxOES proc + mov r11, __blue_glCore_glFeedbackBufferxOES jmp r11 -bluegl_glGenFramebuffersEXT endp +bluegl_glFeedbackBufferxOES endp -extrn __blue_glCore_glUniform2uiv: qword -bluegl_glUniform2uiv proc - mov r11, __blue_glCore_glUniform2uiv +extrn __blue_glCore_glGetConvolutionParameterxvOES: qword +bluegl_glGetConvolutionParameterxvOES proc + mov r11, __blue_glCore_glGetConvolutionParameterxvOES jmp r11 -bluegl_glUniform2uiv endp +bluegl_glGetConvolutionParameterxvOES endp -extrn __blue_glCore_glGenSymbolsEXT: qword -bluegl_glGenSymbolsEXT proc - mov r11, __blue_glCore_glGenSymbolsEXT +extrn __blue_glCore_glGetHistogramParameterxvOES: qword +bluegl_glGetHistogramParameterxvOES proc + mov r11, __blue_glCore_glGetHistogramParameterxvOES jmp r11 -bluegl_glGenSymbolsEXT endp +bluegl_glGetHistogramParameterxvOES endp -extrn __blue_glCore_glVertexAttribIPointer: qword -bluegl_glVertexAttribIPointer proc - mov r11, __blue_glCore_glVertexAttribIPointer +extrn __blue_glCore_glGetLightxOES: qword +bluegl_glGetLightxOES proc + mov r11, __blue_glCore_glGetLightxOES jmp r11 -bluegl_glVertexAttribIPointer endp +bluegl_glGetLightxOES endp -extrn __blue_glCore_glUniformMatrix3x4fv: qword -bluegl_glUniformMatrix3x4fv proc - mov r11, __blue_glCore_glUniformMatrix3x4fv +extrn __blue_glCore_glGetMapxvOES: qword +bluegl_glGetMapxvOES proc + mov r11, __blue_glCore_glGetMapxvOES jmp r11 -bluegl_glUniformMatrix3x4fv endp +bluegl_glGetMapxvOES endp -extrn __blue_glCore_glTexCoord3bOES: qword -bluegl_glTexCoord3bOES proc - mov r11, __blue_glCore_glTexCoord3bOES +extrn __blue_glCore_glGetMaterialxOES: qword +bluegl_glGetMaterialxOES proc + mov r11, __blue_glCore_glGetMaterialxOES jmp r11 -bluegl_glTexCoord3bOES endp +bluegl_glGetMaterialxOES endp -extrn __blue_glCore_glVDPAUUnmapSurfacesNV: qword -bluegl_glVDPAUUnmapSurfacesNV proc - mov r11, __blue_glCore_glVDPAUUnmapSurfacesNV +extrn __blue_glCore_glGetPixelMapxv: qword +bluegl_glGetPixelMapxv proc + mov r11, __blue_glCore_glGetPixelMapxv jmp r11 -bluegl_glVDPAUUnmapSurfacesNV endp +bluegl_glGetPixelMapxv endp -extrn __blue_glCore_glProgramUniform4ui64NV: qword -bluegl_glProgramUniform4ui64NV proc - mov r11, __blue_glCore_glProgramUniform4ui64NV +extrn __blue_glCore_glGetTexGenxvOES: qword +bluegl_glGetTexGenxvOES proc + mov r11, __blue_glCore_glGetTexGenxvOES jmp r11 -bluegl_glProgramUniform4ui64NV endp +bluegl_glGetTexGenxvOES endp -extrn __blue_glCore_glUniformHandleui64NV: qword -bluegl_glUniformHandleui64NV proc - mov r11, __blue_glCore_glUniformHandleui64NV +extrn __blue_glCore_glGetTexLevelParameterxvOES: qword +bluegl_glGetTexLevelParameterxvOES proc + mov r11, __blue_glCore_glGetTexLevelParameterxvOES jmp r11 -bluegl_glUniformHandleui64NV endp +bluegl_glGetTexLevelParameterxvOES endp -extrn __blue_glCore_glGetStageIndexNV: qword -bluegl_glGetStageIndexNV proc - mov r11, __blue_glCore_glGetStageIndexNV +extrn __blue_glCore_glIndexxOES: qword +bluegl_glIndexxOES proc + mov r11, __blue_glCore_glIndexxOES jmp r11 -bluegl_glGetStageIndexNV endp +bluegl_glIndexxOES endp -extrn __blue_glCore_glMultiTexCoord3fvARB: qword -bluegl_glMultiTexCoord3fvARB proc - mov r11, __blue_glCore_glMultiTexCoord3fvARB +extrn __blue_glCore_glIndexxvOES: qword +bluegl_glIndexxvOES proc + mov r11, __blue_glCore_glIndexxvOES jmp r11 -bluegl_glMultiTexCoord3fvARB endp +bluegl_glIndexxvOES endp -extrn __blue_glCore_glBindBufferOffsetEXT: qword -bluegl_glBindBufferOffsetEXT proc - mov r11, __blue_glCore_glBindBufferOffsetEXT +extrn __blue_glCore_glLoadTransposeMatrixxOES: qword +bluegl_glLoadTransposeMatrixxOES proc + mov r11, __blue_glCore_glLoadTransposeMatrixxOES jmp r11 -bluegl_glBindBufferOffsetEXT endp +bluegl_glLoadTransposeMatrixxOES endp -extrn __blue_glCore_glVertexAttribL4dv: qword -bluegl_glVertexAttribL4dv proc - mov r11, __blue_glCore_glVertexAttribL4dv +extrn __blue_glCore_glMap1xOES: qword +bluegl_glMap1xOES proc + mov r11, __blue_glCore_glMap1xOES jmp r11 -bluegl_glVertexAttribL4dv endp +bluegl_glMap1xOES endp -extrn __blue_glCore_glClearStencil: qword -bluegl_glClearStencil proc - mov r11, __blue_glCore_glClearStencil +extrn __blue_glCore_glMap2xOES: qword +bluegl_glMap2xOES proc + mov r11, __blue_glCore_glMap2xOES jmp r11 -bluegl_glClearStencil endp +bluegl_glMap2xOES endp -extrn __blue_glCore_glWindowPos2ivMESA: qword -bluegl_glWindowPos2ivMESA proc - mov r11, __blue_glCore_glWindowPos2ivMESA +extrn __blue_glCore_glMapGrid1xOES: qword +bluegl_glMapGrid1xOES proc + mov r11, __blue_glCore_glMapGrid1xOES jmp r11 -bluegl_glWindowPos2ivMESA endp +bluegl_glMapGrid1xOES endp -extrn __blue_glCore_glReplacementCodeubvSUN: qword -bluegl_glReplacementCodeubvSUN proc - mov r11, __blue_glCore_glReplacementCodeubvSUN +extrn __blue_glCore_glMapGrid2xOES: qword +bluegl_glMapGrid2xOES proc + mov r11, __blue_glCore_glMapGrid2xOES jmp r11 -bluegl_glReplacementCodeubvSUN endp +bluegl_glMapGrid2xOES endp -extrn __blue_glCore_glClipPlanefOES: qword -bluegl_glClipPlanefOES proc - mov r11, __blue_glCore_glClipPlanefOES +extrn __blue_glCore_glMultTransposeMatrixxOES: qword +bluegl_glMultTransposeMatrixxOES proc + mov r11, __blue_glCore_glMultTransposeMatrixxOES jmp r11 -bluegl_glClipPlanefOES endp +bluegl_glMultTransposeMatrixxOES endp extrn __blue_glCore_glMultiTexCoord1xOES: qword bluegl_glMultiTexCoord1xOES proc @@ -7287,1577 +7237,1571 @@ bluegl_glMultiTexCoord1xOES proc jmp r11 bluegl_glMultiTexCoord1xOES endp -extrn __blue_glCore_glGetProgramInfoLog: qword -bluegl_glGetProgramInfoLog proc - mov r11, __blue_glCore_glGetProgramInfoLog - jmp r11 -bluegl_glGetProgramInfoLog endp - -extrn __blue_glCore_glEndFragmentShaderATI: qword -bluegl_glEndFragmentShaderATI proc - mov r11, __blue_glCore_glEndFragmentShaderATI - jmp r11 -bluegl_glEndFragmentShaderATI endp - -extrn __blue_glCore_glGetTransformFeedbackVaryingNV: qword -bluegl_glGetTransformFeedbackVaryingNV proc - mov r11, __blue_glCore_glGetTransformFeedbackVaryingNV +extrn __blue_glCore_glMultiTexCoord1xvOES: qword +bluegl_glMultiTexCoord1xvOES proc + mov r11, __blue_glCore_glMultiTexCoord1xvOES jmp r11 -bluegl_glGetTransformFeedbackVaryingNV endp +bluegl_glMultiTexCoord1xvOES endp -extrn __blue_glCore_glProgramUniformMatrix4x2dv: qword -bluegl_glProgramUniformMatrix4x2dv proc - mov r11, __blue_glCore_glProgramUniformMatrix4x2dv +extrn __blue_glCore_glMultiTexCoord2xOES: qword +bluegl_glMultiTexCoord2xOES proc + mov r11, __blue_glCore_glMultiTexCoord2xOES jmp r11 -bluegl_glProgramUniformMatrix4x2dv endp +bluegl_glMultiTexCoord2xOES endp -extrn __blue_glCore_glResetHistogramEXT: qword -bluegl_glResetHistogramEXT proc - mov r11, __blue_glCore_glResetHistogramEXT +extrn __blue_glCore_glMultiTexCoord2xvOES: qword +bluegl_glMultiTexCoord2xvOES proc + mov r11, __blue_glCore_glMultiTexCoord2xvOES jmp r11 -bluegl_glResetHistogramEXT endp +bluegl_glMultiTexCoord2xvOES endp -extrn __blue_glCore_glUniform1i64vNV: qword -bluegl_glUniform1i64vNV proc - mov r11, __blue_glCore_glUniform1i64vNV +extrn __blue_glCore_glMultiTexCoord3xOES: qword +bluegl_glMultiTexCoord3xOES proc + mov r11, __blue_glCore_glMultiTexCoord3xOES jmp r11 -bluegl_glUniform1i64vNV endp +bluegl_glMultiTexCoord3xOES endp -extrn __blue_glCore_glProgramEnvParameter4dARB: qword -bluegl_glProgramEnvParameter4dARB proc - mov r11, __blue_glCore_glProgramEnvParameter4dARB +extrn __blue_glCore_glMultiTexCoord3xvOES: qword +bluegl_glMultiTexCoord3xvOES proc + mov r11, __blue_glCore_glMultiTexCoord3xvOES jmp r11 -bluegl_glProgramEnvParameter4dARB endp +bluegl_glMultiTexCoord3xvOES endp -extrn __blue_glCore_glCopyTextureSubImage2DEXT: qword -bluegl_glCopyTextureSubImage2DEXT proc - mov r11, __blue_glCore_glCopyTextureSubImage2DEXT +extrn __blue_glCore_glMultiTexCoord4xvOES: qword +bluegl_glMultiTexCoord4xvOES proc + mov r11, __blue_glCore_glMultiTexCoord4xvOES jmp r11 -bluegl_glCopyTextureSubImage2DEXT endp +bluegl_glMultiTexCoord4xvOES endp -extrn __blue_glCore_glGetCombinerInputParameterivNV: qword -bluegl_glGetCombinerInputParameterivNV proc - mov r11, __blue_glCore_glGetCombinerInputParameterivNV +extrn __blue_glCore_glNormal3xvOES: qword +bluegl_glNormal3xvOES proc + mov r11, __blue_glCore_glNormal3xvOES jmp r11 -bluegl_glGetCombinerInputParameterivNV endp +bluegl_glNormal3xvOES endp -extrn __blue_glCore_glUniformMatrix4fv: qword -bluegl_glUniformMatrix4fv proc - mov r11, __blue_glCore_glUniformMatrix4fv +extrn __blue_glCore_glPassThroughxOES: qword +bluegl_glPassThroughxOES proc + mov r11, __blue_glCore_glPassThroughxOES jmp r11 -bluegl_glUniformMatrix4fv endp +bluegl_glPassThroughxOES endp -extrn __blue_glCore_glGenQueriesARB: qword -bluegl_glGenQueriesARB proc - mov r11, __blue_glCore_glGenQueriesARB +extrn __blue_glCore_glPixelMapx: qword +bluegl_glPixelMapx proc + mov r11, __blue_glCore_glPixelMapx jmp r11 -bluegl_glGenQueriesARB endp +bluegl_glPixelMapx endp -extrn __blue_glCore_glGetnSeparableFilter: qword -bluegl_glGetnSeparableFilter proc - mov r11, __blue_glCore_glGetnSeparableFilter +extrn __blue_glCore_glPixelStorex: qword +bluegl_glPixelStorex proc + mov r11, __blue_glCore_glPixelStorex jmp r11 -bluegl_glGetnSeparableFilter endp +bluegl_glPixelStorex endp -extrn __blue_glCore_glUniform3ui64vARB: qword -bluegl_glUniform3ui64vARB proc - mov r11, __blue_glCore_glUniform3ui64vARB +extrn __blue_glCore_glPixelTransferxOES: qword +bluegl_glPixelTransferxOES proc + mov r11, __blue_glCore_glPixelTransferxOES jmp r11 -bluegl_glUniform3ui64vARB endp +bluegl_glPixelTransferxOES endp -extrn __blue_glCore_glMultiTexCoord1i: qword -bluegl_glMultiTexCoord1i proc - mov r11, __blue_glCore_glMultiTexCoord1i +extrn __blue_glCore_glPixelZoomxOES: qword +bluegl_glPixelZoomxOES proc + mov r11, __blue_glCore_glPixelZoomxOES jmp r11 -bluegl_glMultiTexCoord1i endp +bluegl_glPixelZoomxOES endp -extrn __blue_glCore_glColorTable: qword -bluegl_glColorTable proc - mov r11, __blue_glCore_glColorTable +extrn __blue_glCore_glPrioritizeTexturesxOES: qword +bluegl_glPrioritizeTexturesxOES proc + mov r11, __blue_glCore_glPrioritizeTexturesxOES jmp r11 -bluegl_glColorTable endp +bluegl_glPrioritizeTexturesxOES endp -extrn __blue_glCore_glVertexAttribs4ubvNV: qword -bluegl_glVertexAttribs4ubvNV proc - mov r11, __blue_glCore_glVertexAttribs4ubvNV +extrn __blue_glCore_glRasterPos2xOES: qword +bluegl_glRasterPos2xOES proc + mov r11, __blue_glCore_glRasterPos2xOES jmp r11 -bluegl_glVertexAttribs4ubvNV endp +bluegl_glRasterPos2xOES endp -extrn __blue_glCore_glProgramUniform3uiv: qword -bluegl_glProgramUniform3uiv proc - mov r11, __blue_glCore_glProgramUniform3uiv +extrn __blue_glCore_glRasterPos2xvOES: qword +bluegl_glRasterPos2xvOES proc + mov r11, __blue_glCore_glRasterPos2xvOES jmp r11 -bluegl_glProgramUniform3uiv endp +bluegl_glRasterPos2xvOES endp -extrn __blue_glCore_glProgramUniformMatrix3x2fv: qword -bluegl_glProgramUniformMatrix3x2fv proc - mov r11, __blue_glCore_glProgramUniformMatrix3x2fv +extrn __blue_glCore_glRasterPos3xOES: qword +bluegl_glRasterPos3xOES proc + mov r11, __blue_glCore_glRasterPos3xOES jmp r11 -bluegl_glProgramUniformMatrix3x2fv endp +bluegl_glRasterPos3xOES endp -extrn __blue_glCore_glUnmapBuffer: qword -bluegl_glUnmapBuffer proc - mov r11, __blue_glCore_glUnmapBuffer +extrn __blue_glCore_glRasterPos3xvOES: qword +bluegl_glRasterPos3xvOES proc + mov r11, __blue_glCore_glRasterPos3xvOES jmp r11 -bluegl_glUnmapBuffer endp +bluegl_glRasterPos3xvOES endp -extrn __blue_glCore_glBindTextureUnit: qword -bluegl_glBindTextureUnit proc - mov r11, __blue_glCore_glBindTextureUnit +extrn __blue_glCore_glRasterPos4xOES: qword +bluegl_glRasterPos4xOES proc + mov r11, __blue_glCore_glRasterPos4xOES jmp r11 -bluegl_glBindTextureUnit endp +bluegl_glRasterPos4xOES endp -extrn __blue_glCore_glTextureParameterIuivEXT: qword -bluegl_glTextureParameterIuivEXT proc - mov r11, __blue_glCore_glTextureParameterIuivEXT +extrn __blue_glCore_glRasterPos4xvOES: qword +bluegl_glRasterPos4xvOES proc + mov r11, __blue_glCore_glRasterPos4xvOES jmp r11 -bluegl_glTextureParameterIuivEXT endp +bluegl_glRasterPos4xvOES endp -extrn __blue_glCore_glVertexAttribDivisor: qword -bluegl_glVertexAttribDivisor proc - mov r11, __blue_glCore_glVertexAttribDivisor +extrn __blue_glCore_glRectxOES: qword +bluegl_glRectxOES proc + mov r11, __blue_glCore_glRectxOES jmp r11 -bluegl_glVertexAttribDivisor endp +bluegl_glRectxOES endp -extrn __blue_glCore_glSamplerParameterIiv: qword -bluegl_glSamplerParameterIiv proc - mov r11, __blue_glCore_glSamplerParameterIiv +extrn __blue_glCore_glRectxvOES: qword +bluegl_glRectxvOES proc + mov r11, __blue_glCore_glRectxvOES jmp r11 -bluegl_glSamplerParameterIiv endp +bluegl_glRectxvOES endp -extrn __blue_glCore_glGetDebugMessageLog: qword -bluegl_glGetDebugMessageLog proc - mov r11, __blue_glCore_glGetDebugMessageLog +extrn __blue_glCore_glTexCoord1xOES: qword +bluegl_glTexCoord1xOES proc + mov r11, __blue_glCore_glTexCoord1xOES jmp r11 -bluegl_glGetDebugMessageLog endp +bluegl_glTexCoord1xOES endp -extrn __blue_glCore_glSelectPerfMonitorCountersAMD: qword -bluegl_glSelectPerfMonitorCountersAMD proc - mov r11, __blue_glCore_glSelectPerfMonitorCountersAMD +extrn __blue_glCore_glTexCoord1xvOES: qword +bluegl_glTexCoord1xvOES proc + mov r11, __blue_glCore_glTexCoord1xvOES jmp r11 -bluegl_glSelectPerfMonitorCountersAMD endp +bluegl_glTexCoord1xvOES endp -extrn __blue_glCore_glVertexAttribI2i: qword -bluegl_glVertexAttribI2i proc - mov r11, __blue_glCore_glVertexAttribI2i +extrn __blue_glCore_glTexCoord2xOES: qword +bluegl_glTexCoord2xOES proc + mov r11, __blue_glCore_glTexCoord2xOES jmp r11 -bluegl_glVertexAttribI2i endp +bluegl_glTexCoord2xOES endp -extrn __blue_glCore_glDepthRangedNV: qword -bluegl_glDepthRangedNV proc - mov r11, __blue_glCore_glDepthRangedNV +extrn __blue_glCore_glTexCoord2xvOES: qword +bluegl_glTexCoord2xvOES proc + mov r11, __blue_glCore_glTexCoord2xvOES jmp r11 -bluegl_glDepthRangedNV endp +bluegl_glTexCoord2xvOES endp -extrn __blue_glCore_glTextureRangeAPPLE: qword -bluegl_glTextureRangeAPPLE proc - mov r11, __blue_glCore_glTextureRangeAPPLE +extrn __blue_glCore_glTexCoord3xOES: qword +bluegl_glTexCoord3xOES proc + mov r11, __blue_glCore_glTexCoord3xOES jmp r11 -bluegl_glTextureRangeAPPLE endp +bluegl_glTexCoord3xOES endp -extrn __blue_glCore_glEvalCoord2xOES: qword -bluegl_glEvalCoord2xOES proc - mov r11, __blue_glCore_glEvalCoord2xOES +extrn __blue_glCore_glTexCoord3xvOES: qword +bluegl_glTexCoord3xvOES proc + mov r11, __blue_glCore_glTexCoord3xvOES jmp r11 -bluegl_glEvalCoord2xOES endp +bluegl_glTexCoord3xvOES endp -extrn __blue_glCore_glCallCommandListNV: qword -bluegl_glCallCommandListNV proc - mov r11, __blue_glCore_glCallCommandListNV +extrn __blue_glCore_glTexCoord4xOES: qword +bluegl_glTexCoord4xOES proc + mov r11, __blue_glCore_glTexCoord4xOES jmp r11 -bluegl_glCallCommandListNV endp +bluegl_glTexCoord4xOES endp -extrn __blue_glCore_glVariantdvEXT: qword -bluegl_glVariantdvEXT proc - mov r11, __blue_glCore_glVariantdvEXT +extrn __blue_glCore_glTexCoord4xvOES: qword +bluegl_glTexCoord4xvOES proc + mov r11, __blue_glCore_glTexCoord4xvOES jmp r11 -bluegl_glVariantdvEXT endp +bluegl_glTexCoord4xvOES endp -extrn __blue_glCore_glBlendColorxOES: qword -bluegl_glBlendColorxOES proc - mov r11, __blue_glCore_glBlendColorxOES +extrn __blue_glCore_glTexGenxOES: qword +bluegl_glTexGenxOES proc + mov r11, __blue_glCore_glTexGenxOES jmp r11 -bluegl_glBlendColorxOES endp +bluegl_glTexGenxOES endp -extrn __blue_glCore_glFramebufferTexture2DEXT: qword -bluegl_glFramebufferTexture2DEXT proc - mov r11, __blue_glCore_glFramebufferTexture2DEXT +extrn __blue_glCore_glTexGenxvOES: qword +bluegl_glTexGenxvOES proc + mov r11, __blue_glCore_glTexGenxvOES jmp r11 -bluegl_glFramebufferTexture2DEXT endp +bluegl_glTexGenxvOES endp -extrn __blue_glCore_glGetString: qword -bluegl_glGetString proc - mov r11, __blue_glCore_glGetString +extrn __blue_glCore_glVertex2xOES: qword +bluegl_glVertex2xOES proc + mov r11, __blue_glCore_glVertex2xOES jmp r11 -bluegl_glGetString endp +bluegl_glVertex2xOES endp -extrn __blue_glCore_glVertexStream3iATI: qword -bluegl_glVertexStream3iATI proc - mov r11, __blue_glCore_glVertexStream3iATI +extrn __blue_glCore_glVertex2xvOES: qword +bluegl_glVertex2xvOES proc + mov r11, __blue_glCore_glVertex2xvOES jmp r11 -bluegl_glVertexStream3iATI endp +bluegl_glVertex2xvOES endp -extrn __blue_glCore_glHintPGI: qword -bluegl_glHintPGI proc - mov r11, __blue_glCore_glHintPGI +extrn __blue_glCore_glVertex3xOES: qword +bluegl_glVertex3xOES proc + mov r11, __blue_glCore_glVertex3xOES jmp r11 -bluegl_glHintPGI endp +bluegl_glVertex3xOES endp -extrn __blue_glCore_glGenPerfMonitorsAMD: qword -bluegl_glGenPerfMonitorsAMD proc - mov r11, __blue_glCore_glGenPerfMonitorsAMD +extrn __blue_glCore_glVertex3xvOES: qword +bluegl_glVertex3xvOES proc + mov r11, __blue_glCore_glVertex3xvOES jmp r11 -bluegl_glGenPerfMonitorsAMD endp +bluegl_glVertex3xvOES endp -extrn __blue_glCore_glTextureSubImage3DEXT: qword -bluegl_glTextureSubImage3DEXT proc - mov r11, __blue_glCore_glTextureSubImage3DEXT +extrn __blue_glCore_glVertex4xOES: qword +bluegl_glVertex4xOES proc + mov r11, __blue_glCore_glVertex4xOES jmp r11 -bluegl_glTextureSubImage3DEXT endp +bluegl_glVertex4xOES endp -extrn __blue_glCore_glVertexAttrib4usvARB: qword -bluegl_glVertexAttrib4usvARB proc - mov r11, __blue_glCore_glVertexAttrib4usvARB +extrn __blue_glCore_glVertex4xvOES: qword +bluegl_glVertex4xvOES proc + mov r11, __blue_glCore_glVertex4xvOES jmp r11 -bluegl_glVertexAttrib4usvARB endp +bluegl_glVertex4xvOES endp -extrn __blue_glCore_glVertexArrayBindVertexBufferEXT: qword -bluegl_glVertexArrayBindVertexBufferEXT proc - mov r11, __blue_glCore_glVertexArrayBindVertexBufferEXT +extrn __blue_glCore_glQueryMatrixxOES: qword +bluegl_glQueryMatrixxOES proc + mov r11, __blue_glCore_glQueryMatrixxOES jmp r11 -bluegl_glVertexArrayBindVertexBufferEXT endp +bluegl_glQueryMatrixxOES endp -extrn __blue_glCore_glMinSampleShading: qword -bluegl_glMinSampleShading proc - mov r11, __blue_glCore_glMinSampleShading +extrn __blue_glCore_glClearDepthfOES: qword +bluegl_glClearDepthfOES proc + mov r11, __blue_glCore_glClearDepthfOES jmp r11 -bluegl_glMinSampleShading endp +bluegl_glClearDepthfOES endp -extrn __blue_glCore_glIsPathNV: qword -bluegl_glIsPathNV proc - mov r11, __blue_glCore_glIsPathNV +extrn __blue_glCore_glClipPlanefOES: qword +bluegl_glClipPlanefOES proc + mov r11, __blue_glCore_glClipPlanefOES jmp r11 -bluegl_glIsPathNV endp +bluegl_glClipPlanefOES endp -extrn __blue_glCore_glGetPathTexGenivNV: qword -bluegl_glGetPathTexGenivNV proc - mov r11, __blue_glCore_glGetPathTexGenivNV +extrn __blue_glCore_glDepthRangefOES: qword +bluegl_glDepthRangefOES proc + mov r11, __blue_glCore_glDepthRangefOES jmp r11 -bluegl_glGetPathTexGenivNV endp +bluegl_glDepthRangefOES endp -extrn __blue_glCore_glProgramUniform3fv: qword -bluegl_glProgramUniform3fv proc - mov r11, __blue_glCore_glProgramUniform3fv +extrn __blue_glCore_glFrustumfOES: qword +bluegl_glFrustumfOES proc + mov r11, __blue_glCore_glFrustumfOES jmp r11 -bluegl_glProgramUniform3fv endp +bluegl_glFrustumfOES endp -extrn __blue_glCore_glVertexAttrib3sv: qword -bluegl_glVertexAttrib3sv proc - mov r11, __blue_glCore_glVertexAttrib3sv +extrn __blue_glCore_glGetClipPlanefOES: qword +bluegl_glGetClipPlanefOES proc + mov r11, __blue_glCore_glGetClipPlanefOES jmp r11 -bluegl_glVertexAttrib3sv endp +bluegl_glGetClipPlanefOES endp -extrn __blue_glCore_glGetUniformuiv: qword -bluegl_glGetUniformuiv proc - mov r11, __blue_glCore_glGetUniformuiv +extrn __blue_glCore_glOrthofOES: qword +bluegl_glOrthofOES proc + mov r11, __blue_glCore_glOrthofOES jmp r11 -bluegl_glGetUniformuiv endp +bluegl_glOrthofOES endp -extrn __blue_glCore_glGetPixelTransformParameterfvEXT: qword -bluegl_glGetPixelTransformParameterfvEXT proc - mov r11, __blue_glCore_glGetPixelTransformParameterfvEXT +extrn __blue_glCore_glTbufferMask3DFX: qword +bluegl_glTbufferMask3DFX proc + mov r11, __blue_glCore_glTbufferMask3DFX jmp r11 -bluegl_glGetPixelTransformParameterfvEXT endp +bluegl_glTbufferMask3DFX endp -extrn __blue_glCore_glMultiTexCoord3dv: qword -bluegl_glMultiTexCoord3dv proc - mov r11, __blue_glCore_glMultiTexCoord3dv +extrn __blue_glCore_glDebugMessageEnableAMD: qword +bluegl_glDebugMessageEnableAMD proc + mov r11, __blue_glCore_glDebugMessageEnableAMD jmp r11 -bluegl_glMultiTexCoord3dv endp +bluegl_glDebugMessageEnableAMD endp -extrn __blue_glCore_glVertexAttrib3fvARB: qword -bluegl_glVertexAttrib3fvARB proc - mov r11, __blue_glCore_glVertexAttrib3fvARB +extrn __blue_glCore_glDebugMessageInsertAMD: qword +bluegl_glDebugMessageInsertAMD proc + mov r11, __blue_glCore_glDebugMessageInsertAMD jmp r11 -bluegl_glVertexAttrib3fvARB endp +bluegl_glDebugMessageInsertAMD endp -extrn __blue_glCore_glGetProgramResourceIndex: qword -bluegl_glGetProgramResourceIndex proc - mov r11, __blue_glCore_glGetProgramResourceIndex +extrn __blue_glCore_glDebugMessageCallbackAMD: qword +bluegl_glDebugMessageCallbackAMD proc + mov r11, __blue_glCore_glDebugMessageCallbackAMD jmp r11 -bluegl_glGetProgramResourceIndex endp +bluegl_glDebugMessageCallbackAMD endp -extrn __blue_glCore_glGetMinmaxParameteriv: qword -bluegl_glGetMinmaxParameteriv proc - mov r11, __blue_glCore_glGetMinmaxParameteriv +extrn __blue_glCore_glGetDebugMessageLogAMD: qword +bluegl_glGetDebugMessageLogAMD proc + mov r11, __blue_glCore_glGetDebugMessageLogAMD jmp r11 -bluegl_glGetMinmaxParameteriv endp +bluegl_glGetDebugMessageLogAMD endp -extrn __blue_glCore_glConvolutionParameterfEXT: qword -bluegl_glConvolutionParameterfEXT proc - mov r11, __blue_glCore_glConvolutionParameterfEXT +extrn __blue_glCore_glBlendFuncIndexedAMD: qword +bluegl_glBlendFuncIndexedAMD proc + mov r11, __blue_glCore_glBlendFuncIndexedAMD jmp r11 -bluegl_glConvolutionParameterfEXT endp +bluegl_glBlendFuncIndexedAMD endp -extrn __blue_glCore_glProgramUniform4i64NV: qword -bluegl_glProgramUniform4i64NV proc - mov r11, __blue_glCore_glProgramUniform4i64NV +extrn __blue_glCore_glBlendFuncSeparateIndexedAMD: qword +bluegl_glBlendFuncSeparateIndexedAMD proc + mov r11, __blue_glCore_glBlendFuncSeparateIndexedAMD jmp r11 -bluegl_glProgramUniform4i64NV endp +bluegl_glBlendFuncSeparateIndexedAMD endp -extrn __blue_glCore_glProgramUniformMatrix4fvEXT: qword -bluegl_glProgramUniformMatrix4fvEXT proc - mov r11, __blue_glCore_glProgramUniformMatrix4fvEXT +extrn __blue_glCore_glBlendEquationIndexedAMD: qword +bluegl_glBlendEquationIndexedAMD proc + mov r11, __blue_glCore_glBlendEquationIndexedAMD jmp r11 -bluegl_glProgramUniformMatrix4fvEXT endp +bluegl_glBlendEquationIndexedAMD endp -extrn __blue_glCore_glMultiTexCoordP4ui: qword -bluegl_glMultiTexCoordP4ui proc - mov r11, __blue_glCore_glMultiTexCoordP4ui +extrn __blue_glCore_glBlendEquationSeparateIndexedAMD: qword +bluegl_glBlendEquationSeparateIndexedAMD proc + mov r11, __blue_glCore_glBlendEquationSeparateIndexedAMD jmp r11 -bluegl_glMultiTexCoordP4ui endp +bluegl_glBlendEquationSeparateIndexedAMD endp -extrn __blue_glCore_glEnableVertexAttribAPPLE: qword -bluegl_glEnableVertexAttribAPPLE proc - mov r11, __blue_glCore_glEnableVertexAttribAPPLE +extrn __blue_glCore_glUniform1i64NV: qword +bluegl_glUniform1i64NV proc + mov r11, __blue_glCore_glUniform1i64NV jmp r11 -bluegl_glEnableVertexAttribAPPLE endp +bluegl_glUniform1i64NV endp -extrn __blue_glCore_glTexCoordP3uiv: qword -bluegl_glTexCoordP3uiv proc - mov r11, __blue_glCore_glTexCoordP3uiv +extrn __blue_glCore_glUniform2i64NV: qword +bluegl_glUniform2i64NV proc + mov r11, __blue_glCore_glUniform2i64NV jmp r11 -bluegl_glTexCoordP3uiv endp +bluegl_glUniform2i64NV endp -extrn __blue_glCore_glCoverageModulationNV: qword -bluegl_glCoverageModulationNV proc - mov r11, __blue_glCore_glCoverageModulationNV +extrn __blue_glCore_glUniform3i64NV: qword +bluegl_glUniform3i64NV proc + mov r11, __blue_glCore_glUniform3i64NV jmp r11 -bluegl_glCoverageModulationNV endp +bluegl_glUniform3i64NV endp -extrn __blue_glCore_glMultiTexCoord3ivARB: qword -bluegl_glMultiTexCoord3ivARB proc - mov r11, __blue_glCore_glMultiTexCoord3ivARB +extrn __blue_glCore_glUniform4i64NV: qword +bluegl_glUniform4i64NV proc + mov r11, __blue_glCore_glUniform4i64NV jmp r11 -bluegl_glMultiTexCoord3ivARB endp +bluegl_glUniform4i64NV endp -extrn __blue_glCore_glListParameterfvSGIX: qword -bluegl_glListParameterfvSGIX proc - mov r11, __blue_glCore_glListParameterfvSGIX +extrn __blue_glCore_glUniform1i64vNV: qword +bluegl_glUniform1i64vNV proc + mov r11, __blue_glCore_glUniform1i64vNV jmp r11 -bluegl_glListParameterfvSGIX endp +bluegl_glUniform1i64vNV endp -extrn __blue_glCore_glNormal3fVertex3fvSUN: qword -bluegl_glNormal3fVertex3fvSUN proc - mov r11, __blue_glCore_glNormal3fVertex3fvSUN +extrn __blue_glCore_glUniform2i64vNV: qword +bluegl_glUniform2i64vNV proc + mov r11, __blue_glCore_glUniform2i64vNV jmp r11 -bluegl_glNormal3fVertex3fvSUN endp +bluegl_glUniform2i64vNV endp -extrn __blue_glCore_glVertexAttrib4bv: qword -bluegl_glVertexAttrib4bv proc - mov r11, __blue_glCore_glVertexAttrib4bv +extrn __blue_glCore_glUniform3i64vNV: qword +bluegl_glUniform3i64vNV proc + mov r11, __blue_glCore_glUniform3i64vNV jmp r11 -bluegl_glVertexAttrib4bv endp +bluegl_glUniform3i64vNV endp -extrn __blue_glCore_glTexParameterIiv: qword -bluegl_glTexParameterIiv proc - mov r11, __blue_glCore_glTexParameterIiv +extrn __blue_glCore_glUniform4i64vNV: qword +bluegl_glUniform4i64vNV proc + mov r11, __blue_glCore_glUniform4i64vNV jmp r11 -bluegl_glTexParameterIiv endp +bluegl_glUniform4i64vNV endp -extrn __blue_glCore_glNamedFramebufferParameteri: qword -bluegl_glNamedFramebufferParameteri proc - mov r11, __blue_glCore_glNamedFramebufferParameteri +extrn __blue_glCore_glUniform1ui64NV: qword +bluegl_glUniform1ui64NV proc + mov r11, __blue_glCore_glUniform1ui64NV jmp r11 -bluegl_glNamedFramebufferParameteri endp +bluegl_glUniform1ui64NV endp -extrn __blue_glCore_glGetFramebufferParameterivEXT: qword -bluegl_glGetFramebufferParameterivEXT proc - mov r11, __blue_glCore_glGetFramebufferParameterivEXT +extrn __blue_glCore_glUniform2ui64NV: qword +bluegl_glUniform2ui64NV proc + mov r11, __blue_glCore_glUniform2ui64NV jmp r11 -bluegl_glGetFramebufferParameterivEXT endp +bluegl_glUniform2ui64NV endp -extrn __blue_glCore_glReplacementCodeubSUN: qword -bluegl_glReplacementCodeubSUN proc - mov r11, __blue_glCore_glReplacementCodeubSUN +extrn __blue_glCore_glUniform3ui64NV: qword +bluegl_glUniform3ui64NV proc + mov r11, __blue_glCore_glUniform3ui64NV jmp r11 -bluegl_glReplacementCodeubSUN endp +bluegl_glUniform3ui64NV endp -extrn __blue_glCore_glTexCoord2bvOES: qword -bluegl_glTexCoord2bvOES proc - mov r11, __blue_glCore_glTexCoord2bvOES +extrn __blue_glCore_glUniform4ui64NV: qword +bluegl_glUniform4ui64NV proc + mov r11, __blue_glCore_glUniform4ui64NV jmp r11 -bluegl_glTexCoord2bvOES endp +bluegl_glUniform4ui64NV endp -extrn __blue_glCore_glGetVideoui64vNV: qword -bluegl_glGetVideoui64vNV proc - mov r11, __blue_glCore_glGetVideoui64vNV +extrn __blue_glCore_glUniform1ui64vNV: qword +bluegl_glUniform1ui64vNV proc + mov r11, __blue_glCore_glUniform1ui64vNV jmp r11 -bluegl_glGetVideoui64vNV endp +bluegl_glUniform1ui64vNV endp -extrn __blue_glCore_glTexStorage2DMultisample: qword -bluegl_glTexStorage2DMultisample proc - mov r11, __blue_glCore_glTexStorage2DMultisample +extrn __blue_glCore_glUniform2ui64vNV: qword +bluegl_glUniform2ui64vNV proc + mov r11, __blue_glCore_glUniform2ui64vNV jmp r11 -bluegl_glTexStorage2DMultisample endp +bluegl_glUniform2ui64vNV endp -extrn __blue_glCore_glColorTableParameteriv: qword -bluegl_glColorTableParameteriv proc - mov r11, __blue_glCore_glColorTableParameteriv +extrn __blue_glCore_glUniform3ui64vNV: qword +bluegl_glUniform3ui64vNV proc + mov r11, __blue_glCore_glUniform3ui64vNV jmp r11 -bluegl_glColorTableParameteriv endp +bluegl_glUniform3ui64vNV endp -extrn __blue_glCore_glConvolutionFilter2DEXT: qword -bluegl_glConvolutionFilter2DEXT proc - mov r11, __blue_glCore_glConvolutionFilter2DEXT +extrn __blue_glCore_glUniform4ui64vNV: qword +bluegl_glUniform4ui64vNV proc + mov r11, __blue_glCore_glUniform4ui64vNV jmp r11 -bluegl_glConvolutionFilter2DEXT endp +bluegl_glUniform4ui64vNV endp -extrn __blue_glCore_glSampleMaskEXT: qword -bluegl_glSampleMaskEXT proc - mov r11, __blue_glCore_glSampleMaskEXT +extrn __blue_glCore_glGetUniformi64vNV: qword +bluegl_glGetUniformi64vNV proc + mov r11, __blue_glCore_glGetUniformi64vNV jmp r11 -bluegl_glSampleMaskEXT endp +bluegl_glGetUniformi64vNV endp -extrn __blue_glCore_glGlobalAlphaFactorusSUN: qword -bluegl_glGlobalAlphaFactorusSUN proc - mov r11, __blue_glCore_glGlobalAlphaFactorusSUN +extrn __blue_glCore_glGetUniformui64vNV: qword +bluegl_glGetUniformui64vNV proc + mov r11, __blue_glCore_glGetUniformui64vNV jmp r11 -bluegl_glGlobalAlphaFactorusSUN endp +bluegl_glGetUniformui64vNV endp -extrn __blue_glCore_glBindRenderbuffer: qword -bluegl_glBindRenderbuffer proc - mov r11, __blue_glCore_glBindRenderbuffer +extrn __blue_glCore_glProgramUniform1i64NV: qword +bluegl_glProgramUniform1i64NV proc + mov r11, __blue_glCore_glProgramUniform1i64NV jmp r11 -bluegl_glBindRenderbuffer endp +bluegl_glProgramUniform1i64NV endp -extrn __blue_glCore_glVertexAttribI1i: qword -bluegl_glVertexAttribI1i proc - mov r11, __blue_glCore_glVertexAttribI1i +extrn __blue_glCore_glProgramUniform2i64NV: qword +bluegl_glProgramUniform2i64NV proc + mov r11, __blue_glCore_glProgramUniform2i64NV jmp r11 -bluegl_glVertexAttribI1i endp +bluegl_glProgramUniform2i64NV endp -extrn __blue_glCore_glProgramLocalParameterI4uiNV: qword -bluegl_glProgramLocalParameterI4uiNV proc - mov r11, __blue_glCore_glProgramLocalParameterI4uiNV +extrn __blue_glCore_glProgramUniform3i64NV: qword +bluegl_glProgramUniform3i64NV proc + mov r11, __blue_glCore_glProgramUniform3i64NV jmp r11 -bluegl_glProgramLocalParameterI4uiNV endp +bluegl_glProgramUniform3i64NV endp -extrn __blue_glCore_glProgramUniform4ui64ARB: qword -bluegl_glProgramUniform4ui64ARB proc - mov r11, __blue_glCore_glProgramUniform4ui64ARB +extrn __blue_glCore_glProgramUniform4i64NV: qword +bluegl_glProgramUniform4i64NV proc + mov r11, __blue_glCore_glProgramUniform4i64NV jmp r11 -bluegl_glProgramUniform4ui64ARB endp +bluegl_glProgramUniform4i64NV endp -extrn __blue_glCore_glObjectLabel: qword -bluegl_glObjectLabel proc - mov r11, __blue_glCore_glObjectLabel +extrn __blue_glCore_glProgramUniform1i64vNV: qword +bluegl_glProgramUniform1i64vNV proc + mov r11, __blue_glCore_glProgramUniform1i64vNV jmp r11 -bluegl_glObjectLabel endp +bluegl_glProgramUniform1i64vNV endp -extrn __blue_glCore_glGetColorTableParameterivEXT: qword -bluegl_glGetColorTableParameterivEXT proc - mov r11, __blue_glCore_glGetColorTableParameterivEXT +extrn __blue_glCore_glProgramUniform2i64vNV: qword +bluegl_glProgramUniform2i64vNV proc + mov r11, __blue_glCore_glProgramUniform2i64vNV jmp r11 -bluegl_glGetColorTableParameterivEXT endp +bluegl_glProgramUniform2i64vNV endp -extrn __blue_glCore_glGetCombinerOutputParameterivNV: qword -bluegl_glGetCombinerOutputParameterivNV proc - mov r11, __blue_glCore_glGetCombinerOutputParameterivNV +extrn __blue_glCore_glProgramUniform3i64vNV: qword +bluegl_glProgramUniform3i64vNV proc + mov r11, __blue_glCore_glProgramUniform3i64vNV jmp r11 -bluegl_glGetCombinerOutputParameterivNV endp +bluegl_glProgramUniform3i64vNV endp -extrn __blue_glCore_glDrawElementsInstancedARB: qword -bluegl_glDrawElementsInstancedARB proc - mov r11, __blue_glCore_glDrawElementsInstancedARB +extrn __blue_glCore_glProgramUniform4i64vNV: qword +bluegl_glProgramUniform4i64vNV proc + mov r11, __blue_glCore_glProgramUniform4i64vNV jmp r11 -bluegl_glDrawElementsInstancedARB endp +bluegl_glProgramUniform4i64vNV endp -extrn __blue_glCore_glGetMinmaxParameterfv: qword -bluegl_glGetMinmaxParameterfv proc - mov r11, __blue_glCore_glGetMinmaxParameterfv +extrn __blue_glCore_glProgramUniform1ui64NV: qword +bluegl_glProgramUniform1ui64NV proc + mov r11, __blue_glCore_glProgramUniform1ui64NV jmp r11 -bluegl_glGetMinmaxParameterfv endp +bluegl_glProgramUniform1ui64NV endp -extrn __blue_glCore_glMatrixPushEXT: qword -bluegl_glMatrixPushEXT proc - mov r11, __blue_glCore_glMatrixPushEXT +extrn __blue_glCore_glProgramUniform2ui64NV: qword +bluegl_glProgramUniform2ui64NV proc + mov r11, __blue_glCore_glProgramUniform2ui64NV jmp r11 -bluegl_glMatrixPushEXT endp +bluegl_glProgramUniform2ui64NV endp -extrn __blue_glCore_glMultiTexParameterIivEXT: qword -bluegl_glMultiTexParameterIivEXT proc - mov r11, __blue_glCore_glMultiTexParameterIivEXT +extrn __blue_glCore_glProgramUniform3ui64NV: qword +bluegl_glProgramUniform3ui64NV proc + mov r11, __blue_glCore_glProgramUniform3ui64NV jmp r11 -bluegl_glMultiTexParameterIivEXT endp +bluegl_glProgramUniform3ui64NV endp -extrn __blue_glCore_glGetPathColorGenfvNV: qword -bluegl_glGetPathColorGenfvNV proc - mov r11, __blue_glCore_glGetPathColorGenfvNV +extrn __blue_glCore_glProgramUniform4ui64NV: qword +bluegl_glProgramUniform4ui64NV proc + mov r11, __blue_glCore_glProgramUniform4ui64NV jmp r11 -bluegl_glGetPathColorGenfvNV endp +bluegl_glProgramUniform4ui64NV endp -extrn __blue_glCore_glBindProgramNV: qword -bluegl_glBindProgramNV proc - mov r11, __blue_glCore_glBindProgramNV +extrn __blue_glCore_glProgramUniform1ui64vNV: qword +bluegl_glProgramUniform1ui64vNV proc + mov r11, __blue_glCore_glProgramUniform1ui64vNV jmp r11 -bluegl_glBindProgramNV endp +bluegl_glProgramUniform1ui64vNV endp -extrn __blue_glCore_glFramebufferReadBufferEXT: qword -bluegl_glFramebufferReadBufferEXT proc - mov r11, __blue_glCore_glFramebufferReadBufferEXT +extrn __blue_glCore_glProgramUniform2ui64vNV: qword +bluegl_glProgramUniform2ui64vNV proc + mov r11, __blue_glCore_glProgramUniform2ui64vNV jmp r11 -bluegl_glFramebufferReadBufferEXT endp +bluegl_glProgramUniform2ui64vNV endp -extrn __blue_glCore_glFogCoordfEXT: qword -bluegl_glFogCoordfEXT proc - mov r11, __blue_glCore_glFogCoordfEXT +extrn __blue_glCore_glProgramUniform3ui64vNV: qword +bluegl_glProgramUniform3ui64vNV proc + mov r11, __blue_glCore_glProgramUniform3ui64vNV jmp r11 -bluegl_glFogCoordfEXT endp +bluegl_glProgramUniform3ui64vNV endp -extrn __blue_glCore_glVertexArrayNormalOffsetEXT: qword -bluegl_glVertexArrayNormalOffsetEXT proc - mov r11, __blue_glCore_glVertexArrayNormalOffsetEXT +extrn __blue_glCore_glProgramUniform4ui64vNV: qword +bluegl_glProgramUniform4ui64vNV proc + mov r11, __blue_glCore_glProgramUniform4ui64vNV jmp r11 -bluegl_glVertexArrayNormalOffsetEXT endp +bluegl_glProgramUniform4ui64vNV endp -extrn __blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN: qword -bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN proc - mov r11, __blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN +extrn __blue_glCore_glVertexAttribParameteriAMD: qword +bluegl_glVertexAttribParameteriAMD proc + mov r11, __blue_glCore_glVertexAttribParameteriAMD jmp r11 -bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN endp +bluegl_glVertexAttribParameteriAMD endp -extrn __blue_glCore_glGetnUniformfv: qword -bluegl_glGetnUniformfv proc - mov r11, __blue_glCore_glGetnUniformfv +extrn __blue_glCore_glMultiDrawArraysIndirectAMD: qword +bluegl_glMultiDrawArraysIndirectAMD proc + mov r11, __blue_glCore_glMultiDrawArraysIndirectAMD jmp r11 -bluegl_glGetnUniformfv endp +bluegl_glMultiDrawArraysIndirectAMD endp -extrn __blue_glCore_glPointParameterfEXT: qword -bluegl_glPointParameterfEXT proc - mov r11, __blue_glCore_glPointParameterfEXT +extrn __blue_glCore_glMultiDrawElementsIndirectAMD: qword +bluegl_glMultiDrawElementsIndirectAMD proc + mov r11, __blue_glCore_glMultiDrawElementsIndirectAMD jmp r11 -bluegl_glPointParameterfEXT endp +bluegl_glMultiDrawElementsIndirectAMD endp -extrn __blue_glCore_glEndVideoCaptureNV: qword -bluegl_glEndVideoCaptureNV proc - mov r11, __blue_glCore_glEndVideoCaptureNV +extrn __blue_glCore_glGenNamesAMD: qword +bluegl_glGenNamesAMD proc + mov r11, __blue_glCore_glGenNamesAMD jmp r11 -bluegl_glEndVideoCaptureNV endp +bluegl_glGenNamesAMD endp -extrn __blue_glCore_glVertexBlendARB: qword -bluegl_glVertexBlendARB proc - mov r11, __blue_glCore_glVertexBlendARB +extrn __blue_glCore_glDeleteNamesAMD: qword +bluegl_glDeleteNamesAMD proc + mov r11, __blue_glCore_glDeleteNamesAMD jmp r11 -bluegl_glVertexBlendARB endp +bluegl_glDeleteNamesAMD endp -extrn __blue_glCore_glVertexAttribL3i64vNV: qword -bluegl_glVertexAttribL3i64vNV proc - mov r11, __blue_glCore_glVertexAttribL3i64vNV +extrn __blue_glCore_glIsNameAMD: qword +bluegl_glIsNameAMD proc + mov r11, __blue_glCore_glIsNameAMD jmp r11 -bluegl_glVertexAttribL3i64vNV endp +bluegl_glIsNameAMD endp -extrn __blue_glCore_glSecondaryColor3fEXT: qword -bluegl_glSecondaryColor3fEXT proc - mov r11, __blue_glCore_glSecondaryColor3fEXT +extrn __blue_glCore_glQueryObjectParameteruiAMD: qword +bluegl_glQueryObjectParameteruiAMD proc + mov r11, __blue_glCore_glQueryObjectParameteruiAMD jmp r11 -bluegl_glSecondaryColor3fEXT endp +bluegl_glQueryObjectParameteruiAMD endp -extrn __blue_glCore_glStencilFuncSeparateATI: qword -bluegl_glStencilFuncSeparateATI proc - mov r11, __blue_glCore_glStencilFuncSeparateATI +extrn __blue_glCore_glGetPerfMonitorGroupsAMD: qword +bluegl_glGetPerfMonitorGroupsAMD proc + mov r11, __blue_glCore_glGetPerfMonitorGroupsAMD jmp r11 -bluegl_glStencilFuncSeparateATI endp +bluegl_glGetPerfMonitorGroupsAMD endp -extrn __blue_glCore_glCompressedMultiTexSubImage2DEXT: qword -bluegl_glCompressedMultiTexSubImage2DEXT proc - mov r11, __blue_glCore_glCompressedMultiTexSubImage2DEXT +extrn __blue_glCore_glGetPerfMonitorCountersAMD: qword +bluegl_glGetPerfMonitorCountersAMD proc + mov r11, __blue_glCore_glGetPerfMonitorCountersAMD jmp r11 -bluegl_glCompressedMultiTexSubImage2DEXT endp +bluegl_glGetPerfMonitorCountersAMD endp -extrn __blue_glCore_glTransformPathNV: qword -bluegl_glTransformPathNV proc - mov r11, __blue_glCore_glTransformPathNV +extrn __blue_glCore_glGetPerfMonitorGroupStringAMD: qword +bluegl_glGetPerfMonitorGroupStringAMD proc + mov r11, __blue_glCore_glGetPerfMonitorGroupStringAMD jmp r11 -bluegl_glTransformPathNV endp +bluegl_glGetPerfMonitorGroupStringAMD endp -extrn __blue_glCore_glIsEnabledi: qword -bluegl_glIsEnabledi proc - mov r11, __blue_glCore_glIsEnabledi +extrn __blue_glCore_glGetPerfMonitorCounterStringAMD: qword +bluegl_glGetPerfMonitorCounterStringAMD proc + mov r11, __blue_glCore_glGetPerfMonitorCounterStringAMD jmp r11 -bluegl_glIsEnabledi endp +bluegl_glGetPerfMonitorCounterStringAMD endp -extrn __blue_glCore_glExtractComponentEXT: qword -bluegl_glExtractComponentEXT proc - mov r11, __blue_glCore_glExtractComponentEXT +extrn __blue_glCore_glGetPerfMonitorCounterInfoAMD: qword +bluegl_glGetPerfMonitorCounterInfoAMD proc + mov r11, __blue_glCore_glGetPerfMonitorCounterInfoAMD jmp r11 -bluegl_glExtractComponentEXT endp +bluegl_glGetPerfMonitorCounterInfoAMD endp -extrn __blue_glCore_glGetFixedvOES: qword -bluegl_glGetFixedvOES proc - mov r11, __blue_glCore_glGetFixedvOES +extrn __blue_glCore_glGenPerfMonitorsAMD: qword +bluegl_glGenPerfMonitorsAMD proc + mov r11, __blue_glCore_glGenPerfMonitorsAMD jmp r11 -bluegl_glGetFixedvOES endp +bluegl_glGenPerfMonitorsAMD endp -extrn __blue_glCore_glDeleteProgramPipelines: qword -bluegl_glDeleteProgramPipelines proc - mov r11, __blue_glCore_glDeleteProgramPipelines +extrn __blue_glCore_glDeletePerfMonitorsAMD: qword +bluegl_glDeletePerfMonitorsAMD proc + mov r11, __blue_glCore_glDeletePerfMonitorsAMD jmp r11 -bluegl_glDeleteProgramPipelines endp +bluegl_glDeletePerfMonitorsAMD endp -extrn __blue_glCore_glCopyMultiTexSubImage3DEXT: qword -bluegl_glCopyMultiTexSubImage3DEXT proc - mov r11, __blue_glCore_glCopyMultiTexSubImage3DEXT +extrn __blue_glCore_glSelectPerfMonitorCountersAMD: qword +bluegl_glSelectPerfMonitorCountersAMD proc + mov r11, __blue_glCore_glSelectPerfMonitorCountersAMD jmp r11 -bluegl_glCopyMultiTexSubImage3DEXT endp +bluegl_glSelectPerfMonitorCountersAMD endp -extrn __blue_glCore_glCreateStatesNV: qword -bluegl_glCreateStatesNV proc - mov r11, __blue_glCore_glCreateStatesNV +extrn __blue_glCore_glBeginPerfMonitorAMD: qword +bluegl_glBeginPerfMonitorAMD proc + mov r11, __blue_glCore_glBeginPerfMonitorAMD jmp r11 -bluegl_glCreateStatesNV endp +bluegl_glBeginPerfMonitorAMD endp -extrn __blue_glCore_glSwizzleEXT: qword -bluegl_glSwizzleEXT proc - mov r11, __blue_glCore_glSwizzleEXT +extrn __blue_glCore_glEndPerfMonitorAMD: qword +bluegl_glEndPerfMonitorAMD proc + mov r11, __blue_glCore_glEndPerfMonitorAMD jmp r11 -bluegl_glSwizzleEXT endp +bluegl_glEndPerfMonitorAMD endp -extrn __blue_glCore_glVertexWeightfvEXT: qword -bluegl_glVertexWeightfvEXT proc - mov r11, __blue_glCore_glVertexWeightfvEXT +extrn __blue_glCore_glGetPerfMonitorCounterDataAMD: qword +bluegl_glGetPerfMonitorCounterDataAMD proc + mov r11, __blue_glCore_glGetPerfMonitorCounterDataAMD jmp r11 -bluegl_glVertexWeightfvEXT endp +bluegl_glGetPerfMonitorCounterDataAMD endp -extrn __blue_glCore_glNormalPointerEXT: qword -bluegl_glNormalPointerEXT proc - mov r11, __blue_glCore_glNormalPointerEXT +extrn __blue_glCore_glSetMultisamplefvAMD: qword +bluegl_glSetMultisamplefvAMD proc + mov r11, __blue_glCore_glSetMultisamplefvAMD jmp r11 -bluegl_glNormalPointerEXT endp +bluegl_glSetMultisamplefvAMD endp -extrn __blue_glCore_glGetConvolutionFilterEXT: qword -bluegl_glGetConvolutionFilterEXT proc - mov r11, __blue_glCore_glGetConvolutionFilterEXT +extrn __blue_glCore_glTexStorageSparseAMD: qword +bluegl_glTexStorageSparseAMD proc + mov r11, __blue_glCore_glTexStorageSparseAMD jmp r11 -bluegl_glGetConvolutionFilterEXT endp +bluegl_glTexStorageSparseAMD endp -extrn __blue_glCore_glCurrentPaletteMatrixARB: qword -bluegl_glCurrentPaletteMatrixARB proc - mov r11, __blue_glCore_glCurrentPaletteMatrixARB +extrn __blue_glCore_glTextureStorageSparseAMD: qword +bluegl_glTextureStorageSparseAMD proc + mov r11, __blue_glCore_glTextureStorageSparseAMD jmp r11 -bluegl_glCurrentPaletteMatrixARB endp +bluegl_glTextureStorageSparseAMD endp -extrn __blue_glCore_glVertexStream4sATI: qword -bluegl_glVertexStream4sATI proc - mov r11, __blue_glCore_glVertexStream4sATI +extrn __blue_glCore_glStencilOpValueAMD: qword +bluegl_glStencilOpValueAMD proc + mov r11, __blue_glCore_glStencilOpValueAMD jmp r11 -bluegl_glVertexStream4sATI endp +bluegl_glStencilOpValueAMD endp -extrn __blue_glCore_glUniform3ui64ARB: qword -bluegl_glUniform3ui64ARB proc - mov r11, __blue_glCore_glUniform3ui64ARB +extrn __blue_glCore_glTessellationFactorAMD: qword +bluegl_glTessellationFactorAMD proc + mov r11, __blue_glCore_glTessellationFactorAMD jmp r11 -bluegl_glUniform3ui64ARB endp +bluegl_glTessellationFactorAMD endp -extrn __blue_glCore_glProgramUniform1uivEXT: qword -bluegl_glProgramUniform1uivEXT proc - mov r11, __blue_glCore_glProgramUniform1uivEXT +extrn __blue_glCore_glTessellationModeAMD: qword +bluegl_glTessellationModeAMD proc + mov r11, __blue_glCore_glTessellationModeAMD jmp r11 -bluegl_glProgramUniform1uivEXT endp +bluegl_glTessellationModeAMD endp -extrn __blue_glCore_glVertexAttribs3dvNV: qword -bluegl_glVertexAttribs3dvNV proc - mov r11, __blue_glCore_glVertexAttribs3dvNV +extrn __blue_glCore_glElementPointerAPPLE: qword +bluegl_glElementPointerAPPLE proc + mov r11, __blue_glCore_glElementPointerAPPLE jmp r11 -bluegl_glVertexAttribs3dvNV endp +bluegl_glElementPointerAPPLE endp -extrn __blue_glCore_glExecuteProgramNV: qword -bluegl_glExecuteProgramNV proc - mov r11, __blue_glCore_glExecuteProgramNV +extrn __blue_glCore_glDrawElementArrayAPPLE: qword +bluegl_glDrawElementArrayAPPLE proc + mov r11, __blue_glCore_glDrawElementArrayAPPLE jmp r11 -bluegl_glExecuteProgramNV endp +bluegl_glDrawElementArrayAPPLE endp -extrn __blue_glCore_glFrameZoomSGIX: qword -bluegl_glFrameZoomSGIX proc - mov r11, __blue_glCore_glFrameZoomSGIX +extrn __blue_glCore_glDrawRangeElementArrayAPPLE: qword +bluegl_glDrawRangeElementArrayAPPLE proc + mov r11, __blue_glCore_glDrawRangeElementArrayAPPLE jmp r11 -bluegl_glFrameZoomSGIX endp +bluegl_glDrawRangeElementArrayAPPLE endp -extrn __blue_glCore_glFragmentMaterialfSGIX: qword -bluegl_glFragmentMaterialfSGIX proc - mov r11, __blue_glCore_glFragmentMaterialfSGIX +extrn __blue_glCore_glMultiDrawElementArrayAPPLE: qword +bluegl_glMultiDrawElementArrayAPPLE proc + mov r11, __blue_glCore_glMultiDrawElementArrayAPPLE jmp r11 -bluegl_glFragmentMaterialfSGIX endp +bluegl_glMultiDrawElementArrayAPPLE endp -extrn __blue_glCore_glFramebufferTextureLayerEXT: qword -bluegl_glFramebufferTextureLayerEXT proc - mov r11, __blue_glCore_glFramebufferTextureLayerEXT +extrn __blue_glCore_glMultiDrawRangeElementArrayAPPLE: qword +bluegl_glMultiDrawRangeElementArrayAPPLE proc + mov r11, __blue_glCore_glMultiDrawRangeElementArrayAPPLE jmp r11 -bluegl_glFramebufferTextureLayerEXT endp +bluegl_glMultiDrawRangeElementArrayAPPLE endp -extrn __blue_glCore_glVertexStream1iATI: qword -bluegl_glVertexStream1iATI proc - mov r11, __blue_glCore_glVertexStream1iATI +extrn __blue_glCore_glGenFencesAPPLE: qword +bluegl_glGenFencesAPPLE proc + mov r11, __blue_glCore_glGenFencesAPPLE jmp r11 -bluegl_glVertexStream1iATI endp +bluegl_glGenFencesAPPLE endp -extrn __blue_glCore_glVertexAttrib3s: qword -bluegl_glVertexAttrib3s proc - mov r11, __blue_glCore_glVertexAttrib3s +extrn __blue_glCore_glDeleteFencesAPPLE: qword +bluegl_glDeleteFencesAPPLE proc + mov r11, __blue_glCore_glDeleteFencesAPPLE jmp r11 -bluegl_glVertexAttrib3s endp +bluegl_glDeleteFencesAPPLE endp -extrn __blue_glCore_glFramebufferTextureMultiviewOVR: qword -bluegl_glFramebufferTextureMultiviewOVR proc - mov r11, __blue_glCore_glFramebufferTextureMultiviewOVR +extrn __blue_glCore_glSetFenceAPPLE: qword +bluegl_glSetFenceAPPLE proc + mov r11, __blue_glCore_glSetFenceAPPLE jmp r11 -bluegl_glFramebufferTextureMultiviewOVR endp +bluegl_glSetFenceAPPLE endp -extrn __blue_glCore_glElementPointerAPPLE: qword -bluegl_glElementPointerAPPLE proc - mov r11, __blue_glCore_glElementPointerAPPLE +extrn __blue_glCore_glIsFenceAPPLE: qword +bluegl_glIsFenceAPPLE proc + mov r11, __blue_glCore_glIsFenceAPPLE jmp r11 -bluegl_glElementPointerAPPLE endp +bluegl_glIsFenceAPPLE endp -extrn __blue_glCore_glWindowPos4ivMESA: qword -bluegl_glWindowPos4ivMESA proc - mov r11, __blue_glCore_glWindowPos4ivMESA +extrn __blue_glCore_glTestFenceAPPLE: qword +bluegl_glTestFenceAPPLE proc + mov r11, __blue_glCore_glTestFenceAPPLE jmp r11 -bluegl_glWindowPos4ivMESA endp +bluegl_glTestFenceAPPLE endp -extrn __blue_glCore_glTexSubImage3D: qword -bluegl_glTexSubImage3D proc - mov r11, __blue_glCore_glTexSubImage3D +extrn __blue_glCore_glFinishFenceAPPLE: qword +bluegl_glFinishFenceAPPLE proc + mov r11, __blue_glCore_glFinishFenceAPPLE jmp r11 -bluegl_glTexSubImage3D endp +bluegl_glFinishFenceAPPLE endp -extrn __blue_glCore_glGetFragmentMaterialfvSGIX: qword -bluegl_glGetFragmentMaterialfvSGIX proc - mov r11, __blue_glCore_glGetFragmentMaterialfvSGIX +extrn __blue_glCore_glTestObjectAPPLE: qword +bluegl_glTestObjectAPPLE proc + mov r11, __blue_glCore_glTestObjectAPPLE jmp r11 -bluegl_glGetFragmentMaterialfvSGIX endp +bluegl_glTestObjectAPPLE endp -extrn __blue_glCore_glProgramUniform1dEXT: qword -bluegl_glProgramUniform1dEXT proc - mov r11, __blue_glCore_glProgramUniform1dEXT +extrn __blue_glCore_glFinishObjectAPPLE: qword +bluegl_glFinishObjectAPPLE proc + mov r11, __blue_glCore_glFinishObjectAPPLE jmp r11 -bluegl_glProgramUniform1dEXT endp +bluegl_glFinishObjectAPPLE endp -extrn __blue_glCore_glGetFragmentLightfvSGIX: qword -bluegl_glGetFragmentLightfvSGIX proc - mov r11, __blue_glCore_glGetFragmentLightfvSGIX +extrn __blue_glCore_glBufferParameteriAPPLE: qword +bluegl_glBufferParameteriAPPLE proc + mov r11, __blue_glCore_glBufferParameteriAPPLE jmp r11 -bluegl_glGetFragmentLightfvSGIX endp +bluegl_glBufferParameteriAPPLE endp -extrn __blue_glCore_glTexCoord2bOES: qword -bluegl_glTexCoord2bOES proc - mov r11, __blue_glCore_glTexCoord2bOES +extrn __blue_glCore_glFlushMappedBufferRangeAPPLE: qword +bluegl_glFlushMappedBufferRangeAPPLE proc + mov r11, __blue_glCore_glFlushMappedBufferRangeAPPLE jmp r11 -bluegl_glTexCoord2bOES endp +bluegl_glFlushMappedBufferRangeAPPLE endp -extrn __blue_glCore_glVertexAttrib3fv: qword -bluegl_glVertexAttrib3fv proc - mov r11, __blue_glCore_glVertexAttrib3fv +extrn __blue_glCore_glObjectPurgeableAPPLE: qword +bluegl_glObjectPurgeableAPPLE proc + mov r11, __blue_glCore_glObjectPurgeableAPPLE jmp r11 -bluegl_glVertexAttrib3fv endp +bluegl_glObjectPurgeableAPPLE endp -extrn __blue_glCore_glMakeNamedBufferNonResidentNV: qword -bluegl_glMakeNamedBufferNonResidentNV proc - mov r11, __blue_glCore_glMakeNamedBufferNonResidentNV +extrn __blue_glCore_glObjectUnpurgeableAPPLE: qword +bluegl_glObjectUnpurgeableAPPLE proc + mov r11, __blue_glCore_glObjectUnpurgeableAPPLE jmp r11 -bluegl_glMakeNamedBufferNonResidentNV endp +bluegl_glObjectUnpurgeableAPPLE endp -extrn __blue_glCore_glIsProgramARB: qword -bluegl_glIsProgramARB proc - mov r11, __blue_glCore_glIsProgramARB +extrn __blue_glCore_glGetObjectParameterivAPPLE: qword +bluegl_glGetObjectParameterivAPPLE proc + mov r11, __blue_glCore_glGetObjectParameterivAPPLE jmp r11 -bluegl_glIsProgramARB endp +bluegl_glGetObjectParameterivAPPLE endp -extrn __blue_glCore_glScissorArrayv: qword -bluegl_glScissorArrayv proc - mov r11, __blue_glCore_glScissorArrayv +extrn __blue_glCore_glTextureRangeAPPLE: qword +bluegl_glTextureRangeAPPLE proc + mov r11, __blue_glCore_glTextureRangeAPPLE jmp r11 -bluegl_glScissorArrayv endp +bluegl_glTextureRangeAPPLE endp -extrn __blue_glCore_glMultiDrawElementsIndirect: qword -bluegl_glMultiDrawElementsIndirect proc - mov r11, __blue_glCore_glMultiDrawElementsIndirect +extrn __blue_glCore_glGetTexParameterPointervAPPLE: qword +bluegl_glGetTexParameterPointervAPPLE proc + mov r11, __blue_glCore_glGetTexParameterPointervAPPLE jmp r11 -bluegl_glMultiDrawElementsIndirect endp +bluegl_glGetTexParameterPointervAPPLE endp -extrn __blue_glCore_glGetMultiTexParameterfvEXT: qword -bluegl_glGetMultiTexParameterfvEXT proc - mov r11, __blue_glCore_glGetMultiTexParameterfvEXT +extrn __blue_glCore_glBindVertexArrayAPPLE: qword +bluegl_glBindVertexArrayAPPLE proc + mov r11, __blue_glCore_glBindVertexArrayAPPLE jmp r11 -bluegl_glGetMultiTexParameterfvEXT endp +bluegl_glBindVertexArrayAPPLE endp -extrn __blue_glCore_glWindowPos2iARB: qword -bluegl_glWindowPos2iARB proc - mov r11, __blue_glCore_glWindowPos2iARB +extrn __blue_glCore_glDeleteVertexArraysAPPLE: qword +bluegl_glDeleteVertexArraysAPPLE proc + mov r11, __blue_glCore_glDeleteVertexArraysAPPLE jmp r11 -bluegl_glWindowPos2iARB endp +bluegl_glDeleteVertexArraysAPPLE endp -extrn __blue_glCore_glGetProgramStringNV: qword -bluegl_glGetProgramStringNV proc - mov r11, __blue_glCore_glGetProgramStringNV +extrn __blue_glCore_glGenVertexArraysAPPLE: qword +bluegl_glGenVertexArraysAPPLE proc + mov r11, __blue_glCore_glGenVertexArraysAPPLE jmp r11 -bluegl_glGetProgramStringNV endp +bluegl_glGenVertexArraysAPPLE endp -extrn __blue_glCore_glTranslatexOES: qword -bluegl_glTranslatexOES proc - mov r11, __blue_glCore_glTranslatexOES +extrn __blue_glCore_glIsVertexArrayAPPLE: qword +bluegl_glIsVertexArrayAPPLE proc + mov r11, __blue_glCore_glIsVertexArrayAPPLE jmp r11 -bluegl_glTranslatexOES endp +bluegl_glIsVertexArrayAPPLE endp -extrn __blue_glCore_glMultiTexCoord4d: qword -bluegl_glMultiTexCoord4d proc - mov r11, __blue_glCore_glMultiTexCoord4d +extrn __blue_glCore_glVertexArrayRangeAPPLE: qword +bluegl_glVertexArrayRangeAPPLE proc + mov r11, __blue_glCore_glVertexArrayRangeAPPLE jmp r11 -bluegl_glMultiTexCoord4d endp +bluegl_glVertexArrayRangeAPPLE endp -extrn __blue_glCore_glColorTableParameterfvSGI: qword -bluegl_glColorTableParameterfvSGI proc - mov r11, __blue_glCore_glColorTableParameterfvSGI +extrn __blue_glCore_glFlushVertexArrayRangeAPPLE: qword +bluegl_glFlushVertexArrayRangeAPPLE proc + mov r11, __blue_glCore_glFlushVertexArrayRangeAPPLE jmp r11 -bluegl_glColorTableParameterfvSGI endp +bluegl_glFlushVertexArrayRangeAPPLE endp -extrn __blue_glCore_glTexCoord3bvOES: qword -bluegl_glTexCoord3bvOES proc - mov r11, __blue_glCore_glTexCoord3bvOES +extrn __blue_glCore_glVertexArrayParameteriAPPLE: qword +bluegl_glVertexArrayParameteriAPPLE proc + mov r11, __blue_glCore_glVertexArrayParameteriAPPLE jmp r11 -bluegl_glTexCoord3bvOES endp +bluegl_glVertexArrayParameteriAPPLE endp -extrn __blue_glCore_glUniform2ui64vARB: qword -bluegl_glUniform2ui64vARB proc - mov r11, __blue_glCore_glUniform2ui64vARB +extrn __blue_glCore_glEnableVertexAttribAPPLE: qword +bluegl_glEnableVertexAttribAPPLE proc + mov r11, __blue_glCore_glEnableVertexAttribAPPLE jmp r11 -bluegl_glUniform2ui64vARB endp +bluegl_glEnableVertexAttribAPPLE endp -extrn __blue_glCore_glMatrixIndexusvARB: qword -bluegl_glMatrixIndexusvARB proc - mov r11, __blue_glCore_glMatrixIndexusvARB +extrn __blue_glCore_glDisableVertexAttribAPPLE: qword +bluegl_glDisableVertexAttribAPPLE proc + mov r11, __blue_glCore_glDisableVertexAttribAPPLE jmp r11 -bluegl_glMatrixIndexusvARB endp +bluegl_glDisableVertexAttribAPPLE endp -extrn __blue_glCore_glGetMultiTexGenfvEXT: qword -bluegl_glGetMultiTexGenfvEXT proc - mov r11, __blue_glCore_glGetMultiTexGenfvEXT +extrn __blue_glCore_glIsVertexAttribEnabledAPPLE: qword +bluegl_glIsVertexAttribEnabledAPPLE proc + mov r11, __blue_glCore_glIsVertexAttribEnabledAPPLE jmp r11 -bluegl_glGetMultiTexGenfvEXT endp +bluegl_glIsVertexAttribEnabledAPPLE endp -extrn __blue_glCore_glGenerateTextureMipmapEXT: qword -bluegl_glGenerateTextureMipmapEXT proc - mov r11, __blue_glCore_glGenerateTextureMipmapEXT +extrn __blue_glCore_glMapVertexAttrib1dAPPLE: qword +bluegl_glMapVertexAttrib1dAPPLE proc + mov r11, __blue_glCore_glMapVertexAttrib1dAPPLE jmp r11 -bluegl_glGenerateTextureMipmapEXT endp +bluegl_glMapVertexAttrib1dAPPLE endp -extrn __blue_glCore_glGetMapParameterivNV: qword -bluegl_glGetMapParameterivNV proc - mov r11, __blue_glCore_glGetMapParameterivNV +extrn __blue_glCore_glMapVertexAttrib1fAPPLE: qword +bluegl_glMapVertexAttrib1fAPPLE proc + mov r11, __blue_glCore_glMapVertexAttrib1fAPPLE jmp r11 -bluegl_glGetMapParameterivNV endp +bluegl_glMapVertexAttrib1fAPPLE endp -extrn __blue_glCore_glGetConvolutionParameterxvOES: qword -bluegl_glGetConvolutionParameterxvOES proc - mov r11, __blue_glCore_glGetConvolutionParameterxvOES +extrn __blue_glCore_glMapVertexAttrib2dAPPLE: qword +bluegl_glMapVertexAttrib2dAPPLE proc + mov r11, __blue_glCore_glMapVertexAttrib2dAPPLE jmp r11 -bluegl_glGetConvolutionParameterxvOES endp +bluegl_glMapVertexAttrib2dAPPLE endp -extrn __blue_glCore_glVertexAttrib4fvNV: qword -bluegl_glVertexAttrib4fvNV proc - mov r11, __blue_glCore_glVertexAttrib4fvNV +extrn __blue_glCore_glMapVertexAttrib2fAPPLE: qword +bluegl_glMapVertexAttrib2fAPPLE proc + mov r11, __blue_glCore_glMapVertexAttrib2fAPPLE jmp r11 -bluegl_glVertexAttrib4fvNV endp +bluegl_glMapVertexAttrib2fAPPLE endp -extrn __blue_glCore_glBufferDataARB: qword -bluegl_glBufferDataARB proc - mov r11, __blue_glCore_glBufferDataARB +extrn __blue_glCore_glDrawBuffersATI: qword +bluegl_glDrawBuffersATI proc + mov r11, __blue_glCore_glDrawBuffersATI jmp r11 -bluegl_glBufferDataARB endp +bluegl_glDrawBuffersATI endp -extrn __blue_glCore_glWindowPos4fMESA: qword -bluegl_glWindowPos4fMESA proc - mov r11, __blue_glCore_glWindowPos4fMESA +extrn __blue_glCore_glElementPointerATI: qword +bluegl_glElementPointerATI proc + mov r11, __blue_glCore_glElementPointerATI jmp r11 -bluegl_glWindowPos4fMESA endp +bluegl_glElementPointerATI endp -extrn __blue_glCore_glPushDebugGroup: qword -bluegl_glPushDebugGroup proc - mov r11, __blue_glCore_glPushDebugGroup +extrn __blue_glCore_glDrawElementArrayATI: qword +bluegl_glDrawElementArrayATI proc + mov r11, __blue_glCore_glDrawElementArrayATI jmp r11 -bluegl_glPushDebugGroup endp +bluegl_glDrawElementArrayATI endp -extrn __blue_glCore_glProgramUniform2fEXT: qword -bluegl_glProgramUniform2fEXT proc - mov r11, __blue_glCore_glProgramUniform2fEXT +extrn __blue_glCore_glDrawRangeElementArrayATI: qword +bluegl_glDrawRangeElementArrayATI proc + mov r11, __blue_glCore_glDrawRangeElementArrayATI jmp r11 -bluegl_glProgramUniform2fEXT endp +bluegl_glDrawRangeElementArrayATI endp -extrn __blue_glCore_glCopyTexImage1DEXT: qword -bluegl_glCopyTexImage1DEXT proc - mov r11, __blue_glCore_glCopyTexImage1DEXT +extrn __blue_glCore_glTexBumpParameterivATI: qword +bluegl_glTexBumpParameterivATI proc + mov r11, __blue_glCore_glTexBumpParameterivATI jmp r11 -bluegl_glCopyTexImage1DEXT endp +bluegl_glTexBumpParameterivATI endp -extrn __blue_glCore_glCompressedTexSubImage2DARB: qword -bluegl_glCompressedTexSubImage2DARB proc - mov r11, __blue_glCore_glCompressedTexSubImage2DARB +extrn __blue_glCore_glTexBumpParameterfvATI: qword +bluegl_glTexBumpParameterfvATI proc + mov r11, __blue_glCore_glTexBumpParameterfvATI jmp r11 -bluegl_glCompressedTexSubImage2DARB endp +bluegl_glTexBumpParameterfvATI endp -extrn __blue_glCore_glCopyColorSubTableEXT: qword -bluegl_glCopyColorSubTableEXT proc - mov r11, __blue_glCore_glCopyColorSubTableEXT +extrn __blue_glCore_glGetTexBumpParameterivATI: qword +bluegl_glGetTexBumpParameterivATI proc + mov r11, __blue_glCore_glGetTexBumpParameterivATI jmp r11 -bluegl_glCopyColorSubTableEXT endp +bluegl_glGetTexBumpParameterivATI endp -extrn __blue_glCore_glTransformFeedbackAttribsNV: qword -bluegl_glTransformFeedbackAttribsNV proc - mov r11, __blue_glCore_glTransformFeedbackAttribsNV +extrn __blue_glCore_glGetTexBumpParameterfvATI: qword +bluegl_glGetTexBumpParameterfvATI proc + mov r11, __blue_glCore_glGetTexBumpParameterfvATI jmp r11 -bluegl_glTransformFeedbackAttribsNV endp +bluegl_glGetTexBumpParameterfvATI endp -extrn __blue_glCore_glMatrixFrustumEXT: qword -bluegl_glMatrixFrustumEXT proc - mov r11, __blue_glCore_glMatrixFrustumEXT +extrn __blue_glCore_glGenFragmentShadersATI: qword +bluegl_glGenFragmentShadersATI proc + mov r11, __blue_glCore_glGenFragmentShadersATI jmp r11 -bluegl_glMatrixFrustumEXT endp +bluegl_glGenFragmentShadersATI endp -extrn __blue_glCore_glIsBufferARB: qword -bluegl_glIsBufferARB proc - mov r11, __blue_glCore_glIsBufferARB +extrn __blue_glCore_glBindFragmentShaderATI: qword +bluegl_glBindFragmentShaderATI proc + mov r11, __blue_glCore_glBindFragmentShaderATI jmp r11 -bluegl_glIsBufferARB endp +bluegl_glBindFragmentShaderATI endp -extrn __blue_glCore_glUniform3fvARB: qword -bluegl_glUniform3fvARB proc - mov r11, __blue_glCore_glUniform3fvARB +extrn __blue_glCore_glDeleteFragmentShaderATI: qword +bluegl_glDeleteFragmentShaderATI proc + mov r11, __blue_glCore_glDeleteFragmentShaderATI jmp r11 -bluegl_glUniform3fvARB endp +bluegl_glDeleteFragmentShaderATI endp -extrn __blue_glCore_glMultiTexCoord3dARB: qword -bluegl_glMultiTexCoord3dARB proc - mov r11, __blue_glCore_glMultiTexCoord3dARB +extrn __blue_glCore_glBeginFragmentShaderATI: qword +bluegl_glBeginFragmentShaderATI proc + mov r11, __blue_glCore_glBeginFragmentShaderATI jmp r11 -bluegl_glMultiTexCoord3dARB endp +bluegl_glBeginFragmentShaderATI endp -extrn __blue_glCore_glIndexPointerEXT: qword -bluegl_glIndexPointerEXT proc - mov r11, __blue_glCore_glIndexPointerEXT +extrn __blue_glCore_glEndFragmentShaderATI: qword +bluegl_glEndFragmentShaderATI proc + mov r11, __blue_glCore_glEndFragmentShaderATI jmp r11 -bluegl_glIndexPointerEXT endp +bluegl_glEndFragmentShaderATI endp -extrn __blue_glCore_glMatrixLoad3x3fNV: qword -bluegl_glMatrixLoad3x3fNV proc - mov r11, __blue_glCore_glMatrixLoad3x3fNV +extrn __blue_glCore_glPassTexCoordATI: qword +bluegl_glPassTexCoordATI proc + mov r11, __blue_glCore_glPassTexCoordATI jmp r11 -bluegl_glMatrixLoad3x3fNV endp +bluegl_glPassTexCoordATI endp -extrn __blue_glCore_glUnmapNamedBufferEXT: qword -bluegl_glUnmapNamedBufferEXT proc - mov r11, __blue_glCore_glUnmapNamedBufferEXT +extrn __blue_glCore_glSampleMapATI: qword +bluegl_glSampleMapATI proc + mov r11, __blue_glCore_glSampleMapATI jmp r11 -bluegl_glUnmapNamedBufferEXT endp +bluegl_glSampleMapATI endp -extrn __blue_glCore_glCreateProgramObjectARB: qword -bluegl_glCreateProgramObjectARB proc - mov r11, __blue_glCore_glCreateProgramObjectARB +extrn __blue_glCore_glColorFragmentOp1ATI: qword +bluegl_glColorFragmentOp1ATI proc + mov r11, __blue_glCore_glColorFragmentOp1ATI jmp r11 -bluegl_glCreateProgramObjectARB endp +bluegl_glColorFragmentOp1ATI endp -extrn __blue_glCore_glMapGrid2xOES: qword -bluegl_glMapGrid2xOES proc - mov r11, __blue_glCore_glMapGrid2xOES +extrn __blue_glCore_glColorFragmentOp2ATI: qword +bluegl_glColorFragmentOp2ATI proc + mov r11, __blue_glCore_glColorFragmentOp2ATI jmp r11 -bluegl_glMapGrid2xOES endp +bluegl_glColorFragmentOp2ATI endp -extrn __blue_glCore_glVertexPointerEXT: qword -bluegl_glVertexPointerEXT proc - mov r11, __blue_glCore_glVertexPointerEXT +extrn __blue_glCore_glColorFragmentOp3ATI: qword +bluegl_glColorFragmentOp3ATI proc + mov r11, __blue_glCore_glColorFragmentOp3ATI jmp r11 -bluegl_glVertexPointerEXT endp +bluegl_glColorFragmentOp3ATI endp -extrn __blue_glCore_glVertexStream4svATI: qword -bluegl_glVertexStream4svATI proc - mov r11, __blue_glCore_glVertexStream4svATI +extrn __blue_glCore_glAlphaFragmentOp1ATI: qword +bluegl_glAlphaFragmentOp1ATI proc + mov r11, __blue_glCore_glAlphaFragmentOp1ATI jmp r11 -bluegl_glVertexStream4svATI endp +bluegl_glAlphaFragmentOp1ATI endp -extrn __blue_glCore_glMultiTexCoord2hvNV: qword -bluegl_glMultiTexCoord2hvNV proc - mov r11, __blue_glCore_glMultiTexCoord2hvNV +extrn __blue_glCore_glAlphaFragmentOp2ATI: qword +bluegl_glAlphaFragmentOp2ATI proc + mov r11, __blue_glCore_glAlphaFragmentOp2ATI jmp r11 -bluegl_glMultiTexCoord2hvNV endp +bluegl_glAlphaFragmentOp2ATI endp -extrn __blue_glCore_glLabelObjectEXT: qword -bluegl_glLabelObjectEXT proc - mov r11, __blue_glCore_glLabelObjectEXT +extrn __blue_glCore_glAlphaFragmentOp3ATI: qword +bluegl_glAlphaFragmentOp3ATI proc + mov r11, __blue_glCore_glAlphaFragmentOp3ATI jmp r11 -bluegl_glLabelObjectEXT endp +bluegl_glAlphaFragmentOp3ATI endp -extrn __blue_glCore_glTextureImage3DMultisampleNV: qword -bluegl_glTextureImage3DMultisampleNV proc - mov r11, __blue_glCore_glTextureImage3DMultisampleNV +extrn __blue_glCore_glSetFragmentShaderConstantATI: qword +bluegl_glSetFragmentShaderConstantATI proc + mov r11, __blue_glCore_glSetFragmentShaderConstantATI jmp r11 -bluegl_glTextureImage3DMultisampleNV endp +bluegl_glSetFragmentShaderConstantATI endp -extrn __blue_glCore_glMultTransposeMatrixd: qword -bluegl_glMultTransposeMatrixd proc - mov r11, __blue_glCore_glMultTransposeMatrixd +extrn __blue_glCore_glMapObjectBufferATI: qword +bluegl_glMapObjectBufferATI proc + mov r11, __blue_glCore_glMapObjectBufferATI jmp r11 -bluegl_glMultTransposeMatrixd endp +bluegl_glMapObjectBufferATI endp -extrn __blue_glCore_glMultiTexCoord2fARB: qword -bluegl_glMultiTexCoord2fARB proc - mov r11, __blue_glCore_glMultiTexCoord2fARB +extrn __blue_glCore_glUnmapObjectBufferATI: qword +bluegl_glUnmapObjectBufferATI proc + mov r11, __blue_glCore_glUnmapObjectBufferATI jmp r11 -bluegl_glMultiTexCoord2fARB endp +bluegl_glUnmapObjectBufferATI endp -extrn __blue_glCore_glMultiTexCoord2dARB: qword -bluegl_glMultiTexCoord2dARB proc - mov r11, __blue_glCore_glMultiTexCoord2dARB +extrn __blue_glCore_glPNTrianglesiATI: qword +bluegl_glPNTrianglesiATI proc + mov r11, __blue_glCore_glPNTrianglesiATI jmp r11 -bluegl_glMultiTexCoord2dARB endp +bluegl_glPNTrianglesiATI endp -extrn __blue_glCore_glGetCombinerOutputParameterfvNV: qword -bluegl_glGetCombinerOutputParameterfvNV proc - mov r11, __blue_glCore_glGetCombinerOutputParameterfvNV +extrn __blue_glCore_glPNTrianglesfATI: qword +bluegl_glPNTrianglesfATI proc + mov r11, __blue_glCore_glPNTrianglesfATI jmp r11 -bluegl_glGetCombinerOutputParameterfvNV endp +bluegl_glPNTrianglesfATI endp -extrn __blue_glCore_glGetBufferPointerv: qword -bluegl_glGetBufferPointerv proc - mov r11, __blue_glCore_glGetBufferPointerv +extrn __blue_glCore_glStencilOpSeparateATI: qword +bluegl_glStencilOpSeparateATI proc + mov r11, __blue_glCore_glStencilOpSeparateATI jmp r11 -bluegl_glGetBufferPointerv endp +bluegl_glStencilOpSeparateATI endp -extrn __blue_glCore_glVertexAttrib1dNV: qword -bluegl_glVertexAttrib1dNV proc - mov r11, __blue_glCore_glVertexAttrib1dNV +extrn __blue_glCore_glStencilFuncSeparateATI: qword +bluegl_glStencilFuncSeparateATI proc + mov r11, __blue_glCore_glStencilFuncSeparateATI jmp r11 -bluegl_glVertexAttrib1dNV endp +bluegl_glStencilFuncSeparateATI endp -extrn __blue_glCore_glTextureView: qword -bluegl_glTextureView proc - mov r11, __blue_glCore_glTextureView +extrn __blue_glCore_glNewObjectBufferATI: qword +bluegl_glNewObjectBufferATI proc + mov r11, __blue_glCore_glNewObjectBufferATI jmp r11 -bluegl_glTextureView endp +bluegl_glNewObjectBufferATI endp -extrn __blue_glCore_glBlitFramebufferEXT: qword -bluegl_glBlitFramebufferEXT proc - mov r11, __blue_glCore_glBlitFramebufferEXT +extrn __blue_glCore_glIsObjectBufferATI: qword +bluegl_glIsObjectBufferATI proc + mov r11, __blue_glCore_glIsObjectBufferATI jmp r11 -bluegl_glBlitFramebufferEXT endp +bluegl_glIsObjectBufferATI endp -extrn __blue_glCore_glVertexWeightPointerEXT: qword -bluegl_glVertexWeightPointerEXT proc - mov r11, __blue_glCore_glVertexWeightPointerEXT +extrn __blue_glCore_glUpdateObjectBufferATI: qword +bluegl_glUpdateObjectBufferATI proc + mov r11, __blue_glCore_glUpdateObjectBufferATI jmp r11 -bluegl_glVertexWeightPointerEXT endp +bluegl_glUpdateObjectBufferATI endp -extrn __blue_glCore_glBindTextures: qword -bluegl_glBindTextures proc - mov r11, __blue_glCore_glBindTextures +extrn __blue_glCore_glGetObjectBufferfvATI: qword +bluegl_glGetObjectBufferfvATI proc + mov r11, __blue_glCore_glGetObjectBufferfvATI jmp r11 -bluegl_glBindTextures endp +bluegl_glGetObjectBufferfvATI endp -extrn __blue_glCore_glClearBufferiv: qword -bluegl_glClearBufferiv proc - mov r11, __blue_glCore_glClearBufferiv +extrn __blue_glCore_glGetObjectBufferivATI: qword +bluegl_glGetObjectBufferivATI proc + mov r11, __blue_glCore_glGetObjectBufferivATI jmp r11 -bluegl_glClearBufferiv endp +bluegl_glGetObjectBufferivATI endp -extrn __blue_glCore_glMultiTexCoord4ivARB: qword -bluegl_glMultiTexCoord4ivARB proc - mov r11, __blue_glCore_glMultiTexCoord4ivARB +extrn __blue_glCore_glFreeObjectBufferATI: qword +bluegl_glFreeObjectBufferATI proc + mov r11, __blue_glCore_glFreeObjectBufferATI jmp r11 -bluegl_glMultiTexCoord4ivARB endp +bluegl_glFreeObjectBufferATI endp -extrn __blue_glCore_glGetImageHandleNV: qword -bluegl_glGetImageHandleNV proc - mov r11, __blue_glCore_glGetImageHandleNV +extrn __blue_glCore_glArrayObjectATI: qword +bluegl_glArrayObjectATI proc + mov r11, __blue_glCore_glArrayObjectATI jmp r11 -bluegl_glGetImageHandleNV endp +bluegl_glArrayObjectATI endp -extrn __blue_glCore_glGetDoublei_vEXT: qword -bluegl_glGetDoublei_vEXT proc - mov r11, __blue_glCore_glGetDoublei_vEXT +extrn __blue_glCore_glGetArrayObjectfvATI: qword +bluegl_glGetArrayObjectfvATI proc + mov r11, __blue_glCore_glGetArrayObjectfvATI jmp r11 -bluegl_glGetDoublei_vEXT endp +bluegl_glGetArrayObjectfvATI endp -extrn __blue_glCore_glProgramUniform1i64NV: qword -bluegl_glProgramUniform1i64NV proc - mov r11, __blue_glCore_glProgramUniform1i64NV +extrn __blue_glCore_glGetArrayObjectivATI: qword +bluegl_glGetArrayObjectivATI proc + mov r11, __blue_glCore_glGetArrayObjectivATI jmp r11 -bluegl_glProgramUniform1i64NV endp +bluegl_glGetArrayObjectivATI endp -extrn __blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN: qword -bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN proc - mov r11, __blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN +extrn __blue_glCore_glVariantArrayObjectATI: qword +bluegl_glVariantArrayObjectATI proc + mov r11, __blue_glCore_glVariantArrayObjectATI jmp r11 -bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN endp +bluegl_glVariantArrayObjectATI endp -extrn __blue_glCore_glWindowPos3s: qword -bluegl_glWindowPos3s proc - mov r11, __blue_glCore_glWindowPos3s +extrn __blue_glCore_glGetVariantArrayObjectfvATI: qword +bluegl_glGetVariantArrayObjectfvATI proc + mov r11, __blue_glCore_glGetVariantArrayObjectfvATI jmp r11 -bluegl_glWindowPos3s endp +bluegl_glGetVariantArrayObjectfvATI endp -extrn __blue_glCore_glUniform4i64ARB: qword -bluegl_glUniform4i64ARB proc - mov r11, __blue_glCore_glUniform4i64ARB +extrn __blue_glCore_glGetVariantArrayObjectivATI: qword +bluegl_glGetVariantArrayObjectivATI proc + mov r11, __blue_glCore_glGetVariantArrayObjectivATI jmp r11 -bluegl_glUniform4i64ARB endp +bluegl_glGetVariantArrayObjectivATI endp -extrn __blue_glCore_glProgramUniform2dvEXT: qword -bluegl_glProgramUniform2dvEXT proc - mov r11, __blue_glCore_glProgramUniform2dvEXT +extrn __blue_glCore_glVertexAttribArrayObjectATI: qword +bluegl_glVertexAttribArrayObjectATI proc + mov r11, __blue_glCore_glVertexAttribArrayObjectATI jmp r11 -bluegl_glProgramUniform2dvEXT endp +bluegl_glVertexAttribArrayObjectATI endp -extrn __blue_glCore_glMultiTexSubImage1DEXT: qword -bluegl_glMultiTexSubImage1DEXT proc - mov r11, __blue_glCore_glMultiTexSubImage1DEXT +extrn __blue_glCore_glGetVertexAttribArrayObjectfvATI: qword +bluegl_glGetVertexAttribArrayObjectfvATI proc + mov r11, __blue_glCore_glGetVertexAttribArrayObjectfvATI jmp r11 -bluegl_glMultiTexSubImage1DEXT endp +bluegl_glGetVertexAttribArrayObjectfvATI endp -extrn __blue_glCore_glHint: qword -bluegl_glHint proc - mov r11, __blue_glCore_glHint +extrn __blue_glCore_glGetVertexAttribArrayObjectivATI: qword +bluegl_glGetVertexAttribArrayObjectivATI proc + mov r11, __blue_glCore_glGetVertexAttribArrayObjectivATI jmp r11 -bluegl_glHint endp +bluegl_glGetVertexAttribArrayObjectivATI endp -extrn __blue_glCore_glProgramUniformMatrix4fv: qword -bluegl_glProgramUniformMatrix4fv proc - mov r11, __blue_glCore_glProgramUniformMatrix4fv +extrn __blue_glCore_glVertexStream1sATI: qword +bluegl_glVertexStream1sATI proc + mov r11, __blue_glCore_glVertexStream1sATI jmp r11 -bluegl_glProgramUniformMatrix4fv endp +bluegl_glVertexStream1sATI endp -extrn __blue_glCore_glTexCoord4bvOES: qword -bluegl_glTexCoord4bvOES proc - mov r11, __blue_glCore_glTexCoord4bvOES +extrn __blue_glCore_glVertexStream1svATI: qword +bluegl_glVertexStream1svATI proc + mov r11, __blue_glCore_glVertexStream1svATI jmp r11 -bluegl_glTexCoord4bvOES endp +bluegl_glVertexStream1svATI endp -extrn __blue_glCore_glGetQueryObjectiv: qword -bluegl_glGetQueryObjectiv proc - mov r11, __blue_glCore_glGetQueryObjectiv +extrn __blue_glCore_glVertexStream1iATI: qword +bluegl_glVertexStream1iATI proc + mov r11, __blue_glCore_glVertexStream1iATI jmp r11 -bluegl_glGetQueryObjectiv endp +bluegl_glVertexStream1iATI endp -extrn __blue_glCore_glGetQueryIndexediv: qword -bluegl_glGetQueryIndexediv proc - mov r11, __blue_glCore_glGetQueryIndexediv +extrn __blue_glCore_glVertexStream1ivATI: qword +bluegl_glVertexStream1ivATI proc + mov r11, __blue_glCore_glVertexStream1ivATI jmp r11 -bluegl_glGetQueryIndexediv endp +bluegl_glVertexStream1ivATI endp -extrn __blue_glCore_glTexCoordP4ui: qword -bluegl_glTexCoordP4ui proc - mov r11, __blue_glCore_glTexCoordP4ui +extrn __blue_glCore_glVertexStream1fATI: qword +bluegl_glVertexStream1fATI proc + mov r11, __blue_glCore_glVertexStream1fATI jmp r11 -bluegl_glTexCoordP4ui endp +bluegl_glVertexStream1fATI endp -extrn __blue_glCore_glVertexStream2fvATI: qword -bluegl_glVertexStream2fvATI proc - mov r11, __blue_glCore_glVertexStream2fvATI +extrn __blue_glCore_glVertexStream1fvATI: qword +bluegl_glVertexStream1fvATI proc + mov r11, __blue_glCore_glVertexStream1fvATI jmp r11 -bluegl_glVertexStream2fvATI endp +bluegl_glVertexStream1fvATI endp -extrn __blue_glCore_glUniform3fv: qword -bluegl_glUniform3fv proc - mov r11, __blue_glCore_glUniform3fv +extrn __blue_glCore_glVertexStream1dATI: qword +bluegl_glVertexStream1dATI proc + mov r11, __blue_glCore_glVertexStream1dATI jmp r11 -bluegl_glUniform3fv endp +bluegl_glVertexStream1dATI endp -extrn __blue_glCore_glUniformMatrix2dv: qword -bluegl_glUniformMatrix2dv proc - mov r11, __blue_glCore_glUniformMatrix2dv +extrn __blue_glCore_glVertexStream1dvATI: qword +bluegl_glVertexStream1dvATI proc + mov r11, __blue_glCore_glVertexStream1dvATI jmp r11 -bluegl_glUniformMatrix2dv endp +bluegl_glVertexStream1dvATI endp -extrn __blue_glCore_glIsObjectBufferATI: qword -bluegl_glIsObjectBufferATI proc - mov r11, __blue_glCore_glIsObjectBufferATI +extrn __blue_glCore_glVertexStream2sATI: qword +bluegl_glVertexStream2sATI proc + mov r11, __blue_glCore_glVertexStream2sATI jmp r11 -bluegl_glIsObjectBufferATI endp +bluegl_glVertexStream2sATI endp -extrn __blue_glCore_glVertexAttribP2uiv: qword -bluegl_glVertexAttribP2uiv proc - mov r11, __blue_glCore_glVertexAttribP2uiv +extrn __blue_glCore_glVertexStream2svATI: qword +bluegl_glVertexStream2svATI proc + mov r11, __blue_glCore_glVertexStream2svATI jmp r11 -bluegl_glVertexAttribP2uiv endp +bluegl_glVertexStream2svATI endp -extrn __blue_glCore_glCompileShader: qword -bluegl_glCompileShader proc - mov r11, __blue_glCore_glCompileShader +extrn __blue_glCore_glVertexStream2iATI: qword +bluegl_glVertexStream2iATI proc + mov r11, __blue_glCore_glVertexStream2iATI jmp r11 -bluegl_glCompileShader endp +bluegl_glVertexStream2iATI endp -extrn __blue_glCore_glMatrixScalefEXT: qword -bluegl_glMatrixScalefEXT proc - mov r11, __blue_glCore_glMatrixScalefEXT +extrn __blue_glCore_glVertexStream2ivATI: qword +bluegl_glVertexStream2ivATI proc + mov r11, __blue_glCore_glVertexStream2ivATI jmp r11 -bluegl_glMatrixScalefEXT endp +bluegl_glVertexStream2ivATI endp -extrn __blue_glCore_glBinormal3ivEXT: qword -bluegl_glBinormal3ivEXT proc - mov r11, __blue_glCore_glBinormal3ivEXT +extrn __blue_glCore_glVertexStream2fATI: qword +bluegl_glVertexStream2fATI proc + mov r11, __blue_glCore_glVertexStream2fATI jmp r11 -bluegl_glBinormal3ivEXT endp +bluegl_glVertexStream2fATI endp -extrn __blue_glCore_glGetMapAttribParameterivNV: qword -bluegl_glGetMapAttribParameterivNV proc - mov r11, __blue_glCore_glGetMapAttribParameterivNV +extrn __blue_glCore_glVertexStream2fvATI: qword +bluegl_glVertexStream2fvATI proc + mov r11, __blue_glCore_glVertexStream2fvATI jmp r11 -bluegl_glGetMapAttribParameterivNV endp +bluegl_glVertexStream2fvATI endp -extrn __blue_glCore_glGetnPixelMapusvARB: qword -bluegl_glGetnPixelMapusvARB proc - mov r11, __blue_glCore_glGetnPixelMapusvARB +extrn __blue_glCore_glVertexStream2dATI: qword +bluegl_glVertexStream2dATI proc + mov r11, __blue_glCore_glVertexStream2dATI jmp r11 -bluegl_glGetnPixelMapusvARB endp +bluegl_glVertexStream2dATI endp -extrn __blue_glCore_glGetPerfMonitorCounterStringAMD: qword -bluegl_glGetPerfMonitorCounterStringAMD proc - mov r11, __blue_glCore_glGetPerfMonitorCounterStringAMD +extrn __blue_glCore_glVertexStream2dvATI: qword +bluegl_glVertexStream2dvATI proc + mov r11, __blue_glCore_glVertexStream2dvATI jmp r11 -bluegl_glGetPerfMonitorCounterStringAMD endp +bluegl_glVertexStream2dvATI endp -extrn __blue_glCore_glIsTextureHandleResidentNV: qword -bluegl_glIsTextureHandleResidentNV proc - mov r11, __blue_glCore_glIsTextureHandleResidentNV +extrn __blue_glCore_glVertexStream3sATI: qword +bluegl_glVertexStream3sATI proc + mov r11, __blue_glCore_glVertexStream3sATI jmp r11 -bluegl_glIsTextureHandleResidentNV endp +bluegl_glVertexStream3sATI endp -extrn __blue_glCore_glWaitSync: qword -bluegl_glWaitSync proc - mov r11, __blue_glCore_glWaitSync +extrn __blue_glCore_glVertexStream3svATI: qword +bluegl_glVertexStream3svATI proc + mov r11, __blue_glCore_glVertexStream3svATI jmp r11 -bluegl_glWaitSync endp +bluegl_glVertexStream3svATI endp -extrn __blue_glCore_glGenSamplers: qword -bluegl_glGenSamplers proc - mov r11, __blue_glCore_glGenSamplers +extrn __blue_glCore_glVertexStream3iATI: qword +bluegl_glVertexStream3iATI proc + mov r11, __blue_glCore_glVertexStream3iATI jmp r11 -bluegl_glGenSamplers endp +bluegl_glVertexStream3iATI endp -extrn __blue_glCore_glCompressedTextureImage3DEXT: qword -bluegl_glCompressedTextureImage3DEXT proc - mov r11, __blue_glCore_glCompressedTextureImage3DEXT +extrn __blue_glCore_glVertexStream3ivATI: qword +bluegl_glVertexStream3ivATI proc + mov r11, __blue_glCore_glVertexStream3ivATI jmp r11 -bluegl_glCompressedTextureImage3DEXT endp +bluegl_glVertexStream3ivATI endp -extrn __blue_glCore_glGetPerfMonitorCounterInfoAMD: qword -bluegl_glGetPerfMonitorCounterInfoAMD proc - mov r11, __blue_glCore_glGetPerfMonitorCounterInfoAMD +extrn __blue_glCore_glVertexStream3fATI: qword +bluegl_glVertexStream3fATI proc + mov r11, __blue_glCore_glVertexStream3fATI jmp r11 -bluegl_glGetPerfMonitorCounterInfoAMD endp +bluegl_glVertexStream3fATI endp -extrn __blue_glCore_glUniform2ivARB: qword -bluegl_glUniform2ivARB proc - mov r11, __blue_glCore_glUniform2ivARB +extrn __blue_glCore_glVertexStream3fvATI: qword +bluegl_glVertexStream3fvATI proc + mov r11, __blue_glCore_glVertexStream3fvATI jmp r11 -bluegl_glUniform2ivARB endp +bluegl_glVertexStream3fvATI endp -extrn __blue_glCore_glVertexAttrib2sARB: qword -bluegl_glVertexAttrib2sARB proc - mov r11, __blue_glCore_glVertexAttrib2sARB +extrn __blue_glCore_glVertexStream3dATI: qword +bluegl_glVertexStream3dATI proc + mov r11, __blue_glCore_glVertexStream3dATI jmp r11 -bluegl_glVertexAttrib2sARB endp +bluegl_glVertexStream3dATI endp -extrn __blue_glCore_glDrawCommandsAddressNV: qword -bluegl_glDrawCommandsAddressNV proc - mov r11, __blue_glCore_glDrawCommandsAddressNV +extrn __blue_glCore_glVertexStream3dvATI: qword +bluegl_glVertexStream3dvATI proc + mov r11, __blue_glCore_glVertexStream3dvATI jmp r11 -bluegl_glDrawCommandsAddressNV endp +bluegl_glVertexStream3dvATI endp -extrn __blue_glCore_glTexCoord1hNV: qword -bluegl_glTexCoord1hNV proc - mov r11, __blue_glCore_glTexCoord1hNV +extrn __blue_glCore_glVertexStream4sATI: qword +bluegl_glVertexStream4sATI proc + mov r11, __blue_glCore_glVertexStream4sATI jmp r11 -bluegl_glTexCoord1hNV endp +bluegl_glVertexStream4sATI endp -extrn __blue_glCore_glGetFirstPerfQueryIdINTEL: qword -bluegl_glGetFirstPerfQueryIdINTEL proc - mov r11, __blue_glCore_glGetFirstPerfQueryIdINTEL +extrn __blue_glCore_glVertexStream4svATI: qword +bluegl_glVertexStream4svATI proc + mov r11, __blue_glCore_glVertexStream4svATI jmp r11 -bluegl_glGetFirstPerfQueryIdINTEL endp +bluegl_glVertexStream4svATI endp -extrn __blue_glCore_glFramebufferTexture1D: qword -bluegl_glFramebufferTexture1D proc - mov r11, __blue_glCore_glFramebufferTexture1D +extrn __blue_glCore_glVertexStream4iATI: qword +bluegl_glVertexStream4iATI proc + mov r11, __blue_glCore_glVertexStream4iATI jmp r11 -bluegl_glFramebufferTexture1D endp +bluegl_glVertexStream4iATI endp -extrn __blue_glCore_glGetQueryObjecti64v: qword -bluegl_glGetQueryObjecti64v proc - mov r11, __blue_glCore_glGetQueryObjecti64v +extrn __blue_glCore_glVertexStream4ivATI: qword +bluegl_glVertexStream4ivATI proc + mov r11, __blue_glCore_glVertexStream4ivATI jmp r11 -bluegl_glGetQueryObjecti64v endp +bluegl_glVertexStream4ivATI endp -extrn __blue_glCore_glVertexStream1dvATI: qword -bluegl_glVertexStream1dvATI proc - mov r11, __blue_glCore_glVertexStream1dvATI +extrn __blue_glCore_glVertexStream4fATI: qword +bluegl_glVertexStream4fATI proc + mov r11, __blue_glCore_glVertexStream4fATI jmp r11 -bluegl_glVertexStream1dvATI endp +bluegl_glVertexStream4fATI endp -extrn __blue_glCore_glTexCoordPointerListIBM: qword -bluegl_glTexCoordPointerListIBM proc - mov r11, __blue_glCore_glTexCoordPointerListIBM +extrn __blue_glCore_glVertexStream4fvATI: qword +bluegl_glVertexStream4fvATI proc + mov r11, __blue_glCore_glVertexStream4fvATI jmp r11 -bluegl_glTexCoordPointerListIBM endp +bluegl_glVertexStream4fvATI endp -extrn __blue_glCore_glTexImage1D: qword -bluegl_glTexImage1D proc - mov r11, __blue_glCore_glTexImage1D +extrn __blue_glCore_glVertexStream4dATI: qword +bluegl_glVertexStream4dATI proc + mov r11, __blue_glCore_glVertexStream4dATI jmp r11 -bluegl_glTexImage1D endp +bluegl_glVertexStream4dATI endp -extrn __blue_glCore_glWindowPos2fvMESA: qword -bluegl_glWindowPos2fvMESA proc - mov r11, __blue_glCore_glWindowPos2fvMESA +extrn __blue_glCore_glVertexStream4dvATI: qword +bluegl_glVertexStream4dvATI proc + mov r11, __blue_glCore_glVertexStream4dvATI jmp r11 -bluegl_glWindowPos2fvMESA endp +bluegl_glVertexStream4dvATI endp -extrn __blue_glCore_glIsFenceNV: qword -bluegl_glIsFenceNV proc - mov r11, __blue_glCore_glIsFenceNV +extrn __blue_glCore_glNormalStream3bATI: qword +bluegl_glNormalStream3bATI proc + mov r11, __blue_glCore_glNormalStream3bATI jmp r11 -bluegl_glIsFenceNV endp +bluegl_glNormalStream3bATI endp -extrn __blue_glCore_glVariantsvEXT: qword -bluegl_glVariantsvEXT proc - mov r11, __blue_glCore_glVariantsvEXT +extrn __blue_glCore_glNormalStream3bvATI: qword +bluegl_glNormalStream3bvATI proc + mov r11, __blue_glCore_glNormalStream3bvATI jmp r11 -bluegl_glVariantsvEXT endp +bluegl_glNormalStream3bvATI endp -extrn __blue_glCore_glProgramUniform3dEXT: qword -bluegl_glProgramUniform3dEXT proc - mov r11, __blue_glCore_glProgramUniform3dEXT +extrn __blue_glCore_glNormalStream3sATI: qword +bluegl_glNormalStream3sATI proc + mov r11, __blue_glCore_glNormalStream3sATI jmp r11 -bluegl_glProgramUniform3dEXT endp +bluegl_glNormalStream3sATI endp -extrn __blue_glCore_glUniform2iARB: qword -bluegl_glUniform2iARB proc - mov r11, __blue_glCore_glUniform2iARB +extrn __blue_glCore_glNormalStream3svATI: qword +bluegl_glNormalStream3svATI proc + mov r11, __blue_glCore_glNormalStream3svATI jmp r11 -bluegl_glUniform2iARB endp +bluegl_glNormalStream3svATI endp -extrn __blue_glCore_glPointParameteri: qword -bluegl_glPointParameteri proc - mov r11, __blue_glCore_glPointParameteri +extrn __blue_glCore_glNormalStream3iATI: qword +bluegl_glNormalStream3iATI proc + mov r11, __blue_glCore_glNormalStream3iATI jmp r11 -bluegl_glPointParameteri endp +bluegl_glNormalStream3iATI endp -extrn __blue_glCore_glCreateRenderbuffers: qword -bluegl_glCreateRenderbuffers proc - mov r11, __blue_glCore_glCreateRenderbuffers +extrn __blue_glCore_glNormalStream3ivATI: qword +bluegl_glNormalStream3ivATI proc + mov r11, __blue_glCore_glNormalStream3ivATI jmp r11 -bluegl_glCreateRenderbuffers endp +bluegl_glNormalStream3ivATI endp -extrn __blue_glCore_glUniform4i: qword -bluegl_glUniform4i proc - mov r11, __blue_glCore_glUniform4i +extrn __blue_glCore_glNormalStream3fATI: qword +bluegl_glNormalStream3fATI proc + mov r11, __blue_glCore_glNormalStream3fATI jmp r11 -bluegl_glUniform4i endp +bluegl_glNormalStream3fATI endp -extrn __blue_glCore_glDeleteCommandListsNV: qword -bluegl_glDeleteCommandListsNV proc - mov r11, __blue_glCore_glDeleteCommandListsNV +extrn __blue_glCore_glNormalStream3fvATI: qword +bluegl_glNormalStream3fvATI proc + mov r11, __blue_glCore_glNormalStream3fvATI jmp r11 -bluegl_glDeleteCommandListsNV endp +bluegl_glNormalStream3fvATI endp -extrn __blue_glCore_glRequestResidentProgramsNV: qword -bluegl_glRequestResidentProgramsNV proc - mov r11, __blue_glCore_glRequestResidentProgramsNV +extrn __blue_glCore_glNormalStream3dATI: qword +bluegl_glNormalStream3dATI proc + mov r11, __blue_glCore_glNormalStream3dATI jmp r11 -bluegl_glRequestResidentProgramsNV endp +bluegl_glNormalStream3dATI endp -extrn __blue_glCore_glTextureSubImage3D: qword -bluegl_glTextureSubImage3D proc - mov r11, __blue_glCore_glTextureSubImage3D +extrn __blue_glCore_glNormalStream3dvATI: qword +bluegl_glNormalStream3dvATI proc + mov r11, __blue_glCore_glNormalStream3dvATI jmp r11 -bluegl_glTextureSubImage3D endp +bluegl_glNormalStream3dvATI endp -extrn __blue_glCore_glPixelStorex: qword -bluegl_glPixelStorex proc - mov r11, __blue_glCore_glPixelStorex +extrn __blue_glCore_glClientActiveVertexStreamATI: qword +bluegl_glClientActiveVertexStreamATI proc + mov r11, __blue_glCore_glClientActiveVertexStreamATI jmp r11 -bluegl_glPixelStorex endp +bluegl_glClientActiveVertexStreamATI endp -extrn __blue_glCore_glVertexAttrib4fARB: qword -bluegl_glVertexAttrib4fARB proc - mov r11, __blue_glCore_glVertexAttrib4fARB +extrn __blue_glCore_glVertexBlendEnviATI: qword +bluegl_glVertexBlendEnviATI proc + mov r11, __blue_glCore_glVertexBlendEnviATI jmp r11 -bluegl_glVertexAttrib4fARB endp +bluegl_glVertexBlendEnviATI endp -extrn __blue_glCore_glGetVertexAttribIuiv: qword -bluegl_glGetVertexAttribIuiv proc - mov r11, __blue_glCore_glGetVertexAttribIuiv +extrn __blue_glCore_glVertexBlendEnvfATI: qword +bluegl_glVertexBlendEnvfATI proc + mov r11, __blue_glCore_glVertexBlendEnvfATI jmp r11 -bluegl_glGetVertexAttribIuiv endp +bluegl_glVertexBlendEnvfATI endp -extrn __blue_glCore_glVertexAttrib1s: qword -bluegl_glVertexAttrib1s proc - mov r11, __blue_glCore_glVertexAttrib1s +extrn __blue_glCore_glUniformBufferEXT: qword +bluegl_glUniformBufferEXT proc + mov r11, __blue_glCore_glUniformBufferEXT jmp r11 -bluegl_glVertexAttrib1s endp +bluegl_glUniformBufferEXT endp -extrn __blue_glCore_glProgramUniformMatrix4x3dv: qword -bluegl_glProgramUniformMatrix4x3dv proc - mov r11, __blue_glCore_glProgramUniformMatrix4x3dv +extrn __blue_glCore_glGetUniformBufferSizeEXT: qword +bluegl_glGetUniformBufferSizeEXT proc + mov r11, __blue_glCore_glGetUniformBufferSizeEXT jmp r11 -bluegl_glProgramUniformMatrix4x3dv endp +bluegl_glGetUniformBufferSizeEXT endp -extrn __blue_glCore_glActiveVaryingNV: qword -bluegl_glActiveVaryingNV proc - mov r11, __blue_glCore_glActiveVaryingNV +extrn __blue_glCore_glGetUniformOffsetEXT: qword +bluegl_glGetUniformOffsetEXT proc + mov r11, __blue_glCore_glGetUniformOffsetEXT jmp r11 -bluegl_glActiveVaryingNV endp +bluegl_glGetUniformOffsetEXT endp -extrn __blue_glCore_glTangent3sEXT: qword -bluegl_glTangent3sEXT proc - mov r11, __blue_glCore_glTangent3sEXT +extrn __blue_glCore_glBlendColorEXT: qword +bluegl_glBlendColorEXT proc + mov r11, __blue_glCore_glBlendColorEXT jmp r11 -bluegl_glTangent3sEXT endp +bluegl_glBlendColorEXT endp -extrn __blue_glCore_glConvolutionParameteriv: qword -bluegl_glConvolutionParameteriv proc - mov r11, __blue_glCore_glConvolutionParameteriv +extrn __blue_glCore_glBlendEquationSeparateEXT: qword +bluegl_glBlendEquationSeparateEXT proc + mov r11, __blue_glCore_glBlendEquationSeparateEXT jmp r11 -bluegl_glConvolutionParameteriv endp +bluegl_glBlendEquationSeparateEXT endp -extrn __blue_glCore_glQueryCounter: qword -bluegl_glQueryCounter proc - mov r11, __blue_glCore_glQueryCounter +extrn __blue_glCore_glBlendFuncSeparateEXT: qword +bluegl_glBlendFuncSeparateEXT proc + mov r11, __blue_glCore_glBlendFuncSeparateEXT jmp r11 -bluegl_glQueryCounter endp +bluegl_glBlendFuncSeparateEXT endp -extrn __blue_glCore_glProgramUniform3d: qword -bluegl_glProgramUniform3d proc - mov r11, __blue_glCore_glProgramUniform3d +extrn __blue_glCore_glBlendEquationEXT: qword +bluegl_glBlendEquationEXT proc + mov r11, __blue_glCore_glBlendEquationEXT jmp r11 -bluegl_glProgramUniform3d endp +bluegl_glBlendEquationEXT endp -extrn __blue_glCore_glGetUniformi64vARB: qword -bluegl_glGetUniformi64vARB proc - mov r11, __blue_glCore_glGetUniformi64vARB +extrn __blue_glCore_glColorSubTableEXT: qword +bluegl_glColorSubTableEXT proc + mov r11, __blue_glCore_glColorSubTableEXT jmp r11 -bluegl_glGetUniformi64vARB endp +bluegl_glColorSubTableEXT endp -extrn __blue_glCore_glGetnUniformui64vARB: qword -bluegl_glGetnUniformui64vARB proc - mov r11, __blue_glCore_glGetnUniformui64vARB +extrn __blue_glCore_glCopyColorSubTableEXT: qword +bluegl_glCopyColorSubTableEXT proc + mov r11, __blue_glCore_glCopyColorSubTableEXT jmp r11 -bluegl_glGetnUniformui64vARB endp +bluegl_glCopyColorSubTableEXT endp -extrn __blue_glCore_glNamedProgramLocalParameters4fvEXT: qword -bluegl_glNamedProgramLocalParameters4fvEXT proc - mov r11, __blue_glCore_glNamedProgramLocalParameters4fvEXT +extrn __blue_glCore_glLockArraysEXT: qword +bluegl_glLockArraysEXT proc + mov r11, __blue_glCore_glLockArraysEXT jmp r11 -bluegl_glNamedProgramLocalParameters4fvEXT endp +bluegl_glLockArraysEXT endp -extrn __blue_glCore_glGetShaderSource: qword -bluegl_glGetShaderSource proc - mov r11, __blue_glCore_glGetShaderSource +extrn __blue_glCore_glUnlockArraysEXT: qword +bluegl_glUnlockArraysEXT proc + mov r11, __blue_glCore_glUnlockArraysEXT jmp r11 -bluegl_glGetShaderSource endp +bluegl_glUnlockArraysEXT endp -extrn __blue_glCore_glClearDepthdNV: qword -bluegl_glClearDepthdNV proc - mov r11, __blue_glCore_glClearDepthdNV +extrn __blue_glCore_glConvolutionFilter1DEXT: qword +bluegl_glConvolutionFilter1DEXT proc + mov r11, __blue_glCore_glConvolutionFilter1DEXT + jmp r11 +bluegl_glConvolutionFilter1DEXT endp + +extrn __blue_glCore_glConvolutionFilter2DEXT: qword +bluegl_glConvolutionFilter2DEXT proc + mov r11, __blue_glCore_glConvolutionFilter2DEXT jmp r11 -bluegl_glClearDepthdNV endp +bluegl_glConvolutionFilter2DEXT endp -extrn __blue_glCore_glSecondaryColorP3ui: qword -bluegl_glSecondaryColorP3ui proc - mov r11, __blue_glCore_glSecondaryColorP3ui +extrn __blue_glCore_glConvolutionParameterfEXT: qword +bluegl_glConvolutionParameterfEXT proc + mov r11, __blue_glCore_glConvolutionParameterfEXT jmp r11 -bluegl_glSecondaryColorP3ui endp +bluegl_glConvolutionParameterfEXT endp -extrn __blue_glCore_glMinmax: qword -bluegl_glMinmax proc - mov r11, __blue_glCore_glMinmax +extrn __blue_glCore_glConvolutionParameterfvEXT: qword +bluegl_glConvolutionParameterfvEXT proc + mov r11, __blue_glCore_glConvolutionParameterfvEXT jmp r11 -bluegl_glMinmax endp +bluegl_glConvolutionParameterfvEXT endp -extrn __blue_glCore_glVariantubvEXT: qword -bluegl_glVariantubvEXT proc - mov r11, __blue_glCore_glVariantubvEXT +extrn __blue_glCore_glConvolutionParameteriEXT: qword +bluegl_glConvolutionParameteriEXT proc + mov r11, __blue_glCore_glConvolutionParameteriEXT jmp r11 -bluegl_glVariantubvEXT endp +bluegl_glConvolutionParameteriEXT endp -extrn __blue_glCore_glBinormal3sEXT: qword -bluegl_glBinormal3sEXT proc - mov r11, __blue_glCore_glBinormal3sEXT +extrn __blue_glCore_glConvolutionParameterivEXT: qword +bluegl_glConvolutionParameterivEXT proc + mov r11, __blue_glCore_glConvolutionParameterivEXT jmp r11 -bluegl_glBinormal3sEXT endp +bluegl_glConvolutionParameterivEXT endp -extrn __blue_glCore_glVertexAttrib4d: qword -bluegl_glVertexAttrib4d proc - mov r11, __blue_glCore_glVertexAttrib4d +extrn __blue_glCore_glCopyConvolutionFilter1DEXT: qword +bluegl_glCopyConvolutionFilter1DEXT proc + mov r11, __blue_glCore_glCopyConvolutionFilter1DEXT jmp r11 -bluegl_glVertexAttrib4d endp +bluegl_glCopyConvolutionFilter1DEXT endp -extrn __blue_glCore_glEndTransformFeedbackEXT: qword -bluegl_glEndTransformFeedbackEXT proc - mov r11, __blue_glCore_glEndTransformFeedbackEXT +extrn __blue_glCore_glCopyConvolutionFilter2DEXT: qword +bluegl_glCopyConvolutionFilter2DEXT proc + mov r11, __blue_glCore_glCopyConvolutionFilter2DEXT jmp r11 -bluegl_glEndTransformFeedbackEXT endp +bluegl_glCopyConvolutionFilter2DEXT endp -extrn __blue_glCore_glTexImage2DMultisample: qword -bluegl_glTexImage2DMultisample proc - mov r11, __blue_glCore_glTexImage2DMultisample +extrn __blue_glCore_glGetConvolutionFilterEXT: qword +bluegl_glGetConvolutionFilterEXT proc + mov r11, __blue_glCore_glGetConvolutionFilterEXT jmp r11 -bluegl_glTexImage2DMultisample endp +bluegl_glGetConvolutionFilterEXT endp -extrn __blue_glCore_glLoadMatrixxOES: qword -bluegl_glLoadMatrixxOES proc - mov r11, __blue_glCore_glLoadMatrixxOES +extrn __blue_glCore_glGetConvolutionParameterfvEXT: qword +bluegl_glGetConvolutionParameterfvEXT proc + mov r11, __blue_glCore_glGetConvolutionParameterfvEXT jmp r11 -bluegl_glLoadMatrixxOES endp +bluegl_glGetConvolutionParameterfvEXT endp -extrn __blue_glCore_glGetUniformfv: qword -bluegl_glGetUniformfv proc - mov r11, __blue_glCore_glGetUniformfv +extrn __blue_glCore_glGetConvolutionParameterivEXT: qword +bluegl_glGetConvolutionParameterivEXT proc + mov r11, __blue_glCore_glGetConvolutionParameterivEXT jmp r11 -bluegl_glGetUniformfv endp +bluegl_glGetConvolutionParameterivEXT endp -extrn __blue_glCore_glStartInstrumentsSGIX: qword -bluegl_glStartInstrumentsSGIX proc - mov r11, __blue_glCore_glStartInstrumentsSGIX +extrn __blue_glCore_glGetSeparableFilterEXT: qword +bluegl_glGetSeparableFilterEXT proc + mov r11, __blue_glCore_glGetSeparableFilterEXT jmp r11 -bluegl_glStartInstrumentsSGIX endp +bluegl_glGetSeparableFilterEXT endp -extrn __blue_glCore_glColor4ubVertex3fvSUN: qword -bluegl_glColor4ubVertex3fvSUN proc - mov r11, __blue_glCore_glColor4ubVertex3fvSUN +extrn __blue_glCore_glSeparableFilter2DEXT: qword +bluegl_glSeparableFilter2DEXT proc + mov r11, __blue_glCore_glSeparableFilter2DEXT jmp r11 -bluegl_glColor4ubVertex3fvSUN endp +bluegl_glSeparableFilter2DEXT endp -extrn __blue_glCore_glMatrixLoadTransposefEXT: qword -bluegl_glMatrixLoadTransposefEXT proc - mov r11, __blue_glCore_glMatrixLoadTransposefEXT +extrn __blue_glCore_glTangent3bEXT: qword +bluegl_glTangent3bEXT proc + mov r11, __blue_glCore_glTangent3bEXT jmp r11 -bluegl_glMatrixLoadTransposefEXT endp +bluegl_glTangent3bEXT endp -extrn __blue_glCore_glGetCompressedTexImage: qword -bluegl_glGetCompressedTexImage proc - mov r11, __blue_glCore_glGetCompressedTexImage +extrn __blue_glCore_glTangent3bvEXT: qword +bluegl_glTangent3bvEXT proc + mov r11, __blue_glCore_glTangent3bvEXT jmp r11 -bluegl_glGetCompressedTexImage endp +bluegl_glTangent3bvEXT endp -extrn __blue_glCore_glGetNamedProgramLocalParameterdvEXT: qword -bluegl_glGetNamedProgramLocalParameterdvEXT proc - mov r11, __blue_glCore_glGetNamedProgramLocalParameterdvEXT +extrn __blue_glCore_glTangent3dEXT: qword +bluegl_glTangent3dEXT proc + mov r11, __blue_glCore_glTangent3dEXT jmp r11 -bluegl_glGetNamedProgramLocalParameterdvEXT endp +bluegl_glTangent3dEXT endp -extrn __blue_glCore_glColorPointerEXT: qword -bluegl_glColorPointerEXT proc - mov r11, __blue_glCore_glColorPointerEXT +extrn __blue_glCore_glTangent3dvEXT: qword +bluegl_glTangent3dvEXT proc + mov r11, __blue_glCore_glTangent3dvEXT jmp r11 -bluegl_glColorPointerEXT endp +bluegl_glTangent3dvEXT endp extrn __blue_glCore_glTangent3fEXT: qword bluegl_glTangent3fEXT proc @@ -8865,713 +8809,737 @@ bluegl_glTangent3fEXT proc jmp r11 bluegl_glTangent3fEXT endp -extrn __blue_glCore_glWindowPos2dvARB: qword -bluegl_glWindowPos2dvARB proc - mov r11, __blue_glCore_glWindowPos2dvARB +extrn __blue_glCore_glTangent3fvEXT: qword +bluegl_glTangent3fvEXT proc + mov r11, __blue_glCore_glTangent3fvEXT jmp r11 -bluegl_glWindowPos2dvARB endp +bluegl_glTangent3fvEXT endp -extrn __blue_glCore_glGetInvariantIntegervEXT: qword -bluegl_glGetInvariantIntegervEXT proc - mov r11, __blue_glCore_glGetInvariantIntegervEXT +extrn __blue_glCore_glTangent3iEXT: qword +bluegl_glTangent3iEXT proc + mov r11, __blue_glCore_glTangent3iEXT jmp r11 -bluegl_glGetInvariantIntegervEXT endp +bluegl_glTangent3iEXT endp -extrn __blue_glCore_glProgramUniform3fEXT: qword -bluegl_glProgramUniform3fEXT proc - mov r11, __blue_glCore_glProgramUniform3fEXT +extrn __blue_glCore_glTangent3ivEXT: qword +bluegl_glTangent3ivEXT proc + mov r11, __blue_glCore_glTangent3ivEXT jmp r11 -bluegl_glProgramUniform3fEXT endp +bluegl_glTangent3ivEXT endp -extrn __blue_glCore_glPixelTexGenSGIX: qword -bluegl_glPixelTexGenSGIX proc - mov r11, __blue_glCore_glPixelTexGenSGIX +extrn __blue_glCore_glTangent3sEXT: qword +bluegl_glTangent3sEXT proc + mov r11, __blue_glCore_glTangent3sEXT jmp r11 -bluegl_glPixelTexGenSGIX endp +bluegl_glTangent3sEXT endp -extrn __blue_glCore_glClampColor: qword -bluegl_glClampColor proc - mov r11, __blue_glCore_glClampColor +extrn __blue_glCore_glTangent3svEXT: qword +bluegl_glTangent3svEXT proc + mov r11, __blue_glCore_glTangent3svEXT jmp r11 -bluegl_glClampColor endp +bluegl_glTangent3svEXT endp -extrn __blue_glCore_glVertexAttribs4hvNV: qword -bluegl_glVertexAttribs4hvNV proc - mov r11, __blue_glCore_glVertexAttribs4hvNV +extrn __blue_glCore_glBinormal3bEXT: qword +bluegl_glBinormal3bEXT proc + mov r11, __blue_glCore_glBinormal3bEXT jmp r11 -bluegl_glVertexAttribs4hvNV endp +bluegl_glBinormal3bEXT endp -extrn __blue_glCore_glGetIntegeri_v: qword -bluegl_glGetIntegeri_v proc - mov r11, __blue_glCore_glGetIntegeri_v +extrn __blue_glCore_glBinormal3bvEXT: qword +bluegl_glBinormal3bvEXT proc + mov r11, __blue_glCore_glBinormal3bvEXT jmp r11 -bluegl_glGetIntegeri_v endp +bluegl_glBinormal3bvEXT endp -extrn __blue_glCore_glDeleteVertexArraysAPPLE: qword -bluegl_glDeleteVertexArraysAPPLE proc - mov r11, __blue_glCore_glDeleteVertexArraysAPPLE +extrn __blue_glCore_glBinormal3dEXT: qword +bluegl_glBinormal3dEXT proc + mov r11, __blue_glCore_glBinormal3dEXT jmp r11 -bluegl_glDeleteVertexArraysAPPLE endp +bluegl_glBinormal3dEXT endp -extrn __blue_glCore_glGetAttachedShaders: qword -bluegl_glGetAttachedShaders proc - mov r11, __blue_glCore_glGetAttachedShaders +extrn __blue_glCore_glBinormal3dvEXT: qword +bluegl_glBinormal3dvEXT proc + mov r11, __blue_glCore_glBinormal3dvEXT jmp r11 -bluegl_glGetAttachedShaders endp +bluegl_glBinormal3dvEXT endp -extrn __blue_glCore_glEndTransformFeedbackNV: qword -bluegl_glEndTransformFeedbackNV proc - mov r11, __blue_glCore_glEndTransformFeedbackNV +extrn __blue_glCore_glBinormal3fEXT: qword +bluegl_glBinormal3fEXT proc + mov r11, __blue_glCore_glBinormal3fEXT jmp r11 -bluegl_glEndTransformFeedbackNV endp +bluegl_glBinormal3fEXT endp -extrn __blue_glCore_glGetColorTableParameterfvSGI: qword -bluegl_glGetColorTableParameterfvSGI proc - mov r11, __blue_glCore_glGetColorTableParameterfvSGI +extrn __blue_glCore_glBinormal3fvEXT: qword +bluegl_glBinormal3fvEXT proc + mov r11, __blue_glCore_glBinormal3fvEXT jmp r11 -bluegl_glGetColorTableParameterfvSGI endp +bluegl_glBinormal3fvEXT endp -extrn __blue_glCore_glBindBufferBase: qword -bluegl_glBindBufferBase proc - mov r11, __blue_glCore_glBindBufferBase +extrn __blue_glCore_glBinormal3iEXT: qword +bluegl_glBinormal3iEXT proc + mov r11, __blue_glCore_glBinormal3iEXT jmp r11 -bluegl_glBindBufferBase endp +bluegl_glBinormal3iEXT endp -extrn __blue_glCore_glDeleteSync: qword -bluegl_glDeleteSync proc - mov r11, __blue_glCore_glDeleteSync +extrn __blue_glCore_glBinormal3ivEXT: qword +bluegl_glBinormal3ivEXT proc + mov r11, __blue_glCore_glBinormal3ivEXT jmp r11 -bluegl_glDeleteSync endp +bluegl_glBinormal3ivEXT endp -extrn __blue_glCore_glGetTransformFeedbackVarying: qword -bluegl_glGetTransformFeedbackVarying proc - mov r11, __blue_glCore_glGetTransformFeedbackVarying +extrn __blue_glCore_glBinormal3sEXT: qword +bluegl_glBinormal3sEXT proc + mov r11, __blue_glCore_glBinormal3sEXT jmp r11 -bluegl_glGetTransformFeedbackVarying endp +bluegl_glBinormal3sEXT endp + +extrn __blue_glCore_glBinormal3svEXT: qword +bluegl_glBinormal3svEXT proc + mov r11, __blue_glCore_glBinormal3svEXT + jmp r11 +bluegl_glBinormal3svEXT endp + +extrn __blue_glCore_glTangentPointerEXT: qword +bluegl_glTangentPointerEXT proc + mov r11, __blue_glCore_glTangentPointerEXT + jmp r11 +bluegl_glTangentPointerEXT endp + +extrn __blue_glCore_glBinormalPointerEXT: qword +bluegl_glBinormalPointerEXT proc + mov r11, __blue_glCore_glBinormalPointerEXT + jmp r11 +bluegl_glBinormalPointerEXT endp -extrn __blue_glCore_glVertexAttrib1svARB: qword -bluegl_glVertexAttrib1svARB proc - mov r11, __blue_glCore_glVertexAttrib1svARB +extrn __blue_glCore_glCopyTexImage1DEXT: qword +bluegl_glCopyTexImage1DEXT proc + mov r11, __blue_glCore_glCopyTexImage1DEXT jmp r11 -bluegl_glVertexAttrib1svARB endp +bluegl_glCopyTexImage1DEXT endp -extrn __blue_glCore_glCopyPathNV: qword -bluegl_glCopyPathNV proc - mov r11, __blue_glCore_glCopyPathNV +extrn __blue_glCore_glCopyTexImage2DEXT: qword +bluegl_glCopyTexImage2DEXT proc + mov r11, __blue_glCore_glCopyTexImage2DEXT jmp r11 -bluegl_glCopyPathNV endp +bluegl_glCopyTexImage2DEXT endp -extrn __blue_glCore_glBindTransformFeedback: qword -bluegl_glBindTransformFeedback proc - mov r11, __blue_glCore_glBindTransformFeedback +extrn __blue_glCore_glCopyTexSubImage1DEXT: qword +bluegl_glCopyTexSubImage1DEXT proc + mov r11, __blue_glCore_glCopyTexSubImage1DEXT jmp r11 -bluegl_glBindTransformFeedback endp +bluegl_glCopyTexSubImage1DEXT endp -extrn __blue_glCore_glVertexAttrib4usv: qword -bluegl_glVertexAttrib4usv proc - mov r11, __blue_glCore_glVertexAttrib4usv +extrn __blue_glCore_glCopyTexSubImage2DEXT: qword +bluegl_glCopyTexSubImage2DEXT proc + mov r11, __blue_glCore_glCopyTexSubImage2DEXT jmp r11 -bluegl_glVertexAttrib4usv endp +bluegl_glCopyTexSubImage2DEXT endp -extrn __blue_glCore_glCompressedMultiTexImage3DEXT: qword -bluegl_glCompressedMultiTexImage3DEXT proc - mov r11, __blue_glCore_glCompressedMultiTexImage3DEXT +extrn __blue_glCore_glCopyTexSubImage3DEXT: qword +bluegl_glCopyTexSubImage3DEXT proc + mov r11, __blue_glCore_glCopyTexSubImage3DEXT jmp r11 -bluegl_glCompressedMultiTexImage3DEXT endp +bluegl_glCopyTexSubImage3DEXT endp -extrn __blue_glCore_glMatrixLoadTranspose3x3fNV: qword -bluegl_glMatrixLoadTranspose3x3fNV proc - mov r11, __blue_glCore_glMatrixLoadTranspose3x3fNV +extrn __blue_glCore_glCullParameterdvEXT: qword +bluegl_glCullParameterdvEXT proc + mov r11, __blue_glCore_glCullParameterdvEXT jmp r11 -bluegl_glMatrixLoadTranspose3x3fNV endp +bluegl_glCullParameterdvEXT endp -extrn __blue_glCore_glVertexStream1sATI: qword -bluegl_glVertexStream1sATI proc - mov r11, __blue_glCore_glVertexStream1sATI +extrn __blue_glCore_glCullParameterfvEXT: qword +bluegl_glCullParameterfvEXT proc + mov r11, __blue_glCore_glCullParameterfvEXT jmp r11 -bluegl_glVertexStream1sATI endp +bluegl_glCullParameterfvEXT endp -extrn __blue_glCore_glMultiDrawArraysIndirectBindlessNV: qword -bluegl_glMultiDrawArraysIndirectBindlessNV proc - mov r11, __blue_glCore_glMultiDrawArraysIndirectBindlessNV +extrn __blue_glCore_glLabelObjectEXT: qword +bluegl_glLabelObjectEXT proc + mov r11, __blue_glCore_glLabelObjectEXT jmp r11 -bluegl_glMultiDrawArraysIndirectBindlessNV endp +bluegl_glLabelObjectEXT endp -extrn __blue_glCore_glTexParameterIuiv: qword -bluegl_glTexParameterIuiv proc - mov r11, __blue_glCore_glTexParameterIuiv +extrn __blue_glCore_glGetObjectLabelEXT: qword +bluegl_glGetObjectLabelEXT proc + mov r11, __blue_glCore_glGetObjectLabelEXT jmp r11 -bluegl_glTexParameterIuiv endp +bluegl_glGetObjectLabelEXT endp -extrn __blue_glCore_glVDPAUFiniNV: qword -bluegl_glVDPAUFiniNV proc - mov r11, __blue_glCore_glVDPAUFiniNV +extrn __blue_glCore_glInsertEventMarkerEXT: qword +bluegl_glInsertEventMarkerEXT proc + mov r11, __blue_glCore_glInsertEventMarkerEXT jmp r11 -bluegl_glVDPAUFiniNV endp +bluegl_glInsertEventMarkerEXT endp -extrn __blue_glCore_glUniform1iv: qword -bluegl_glUniform1iv proc - mov r11, __blue_glCore_glUniform1iv +extrn __blue_glCore_glPushGroupMarkerEXT: qword +bluegl_glPushGroupMarkerEXT proc + mov r11, __blue_glCore_glPushGroupMarkerEXT jmp r11 -bluegl_glUniform1iv endp +bluegl_glPushGroupMarkerEXT endp -extrn __blue_glCore_glStencilThenCoverStrokePathNV: qword -bluegl_glStencilThenCoverStrokePathNV proc - mov r11, __blue_glCore_glStencilThenCoverStrokePathNV +extrn __blue_glCore_glPopGroupMarkerEXT: qword +bluegl_glPopGroupMarkerEXT proc + mov r11, __blue_glCore_glPopGroupMarkerEXT jmp r11 -bluegl_glStencilThenCoverStrokePathNV endp +bluegl_glPopGroupMarkerEXT endp -extrn __blue_glCore_glUniform3i64vNV: qword -bluegl_glUniform3i64vNV proc - mov r11, __blue_glCore_glUniform3i64vNV +extrn __blue_glCore_glDepthBoundsEXT: qword +bluegl_glDepthBoundsEXT proc + mov r11, __blue_glCore_glDepthBoundsEXT jmp r11 -bluegl_glUniform3i64vNV endp +bluegl_glDepthBoundsEXT endp -extrn __blue_glCore_glGetFragDataLocationEXT: qword -bluegl_glGetFragDataLocationEXT proc - mov r11, __blue_glCore_glGetFragDataLocationEXT +extrn __blue_glCore_glMatrixLoadfEXT: qword +bluegl_glMatrixLoadfEXT proc + mov r11, __blue_glCore_glMatrixLoadfEXT jmp r11 -bluegl_glGetFragDataLocationEXT endp +bluegl_glMatrixLoadfEXT endp -extrn __blue_glCore_glProgramUniformMatrix4dv: qword -bluegl_glProgramUniformMatrix4dv proc - mov r11, __blue_glCore_glProgramUniformMatrix4dv +extrn __blue_glCore_glMatrixLoaddEXT: qword +bluegl_glMatrixLoaddEXT proc + mov r11, __blue_glCore_glMatrixLoaddEXT jmp r11 -bluegl_glProgramUniformMatrix4dv endp +bluegl_glMatrixLoaddEXT endp -extrn __blue_glCore_glGetnUniformiv: qword -bluegl_glGetnUniformiv proc - mov r11, __blue_glCore_glGetnUniformiv +extrn __blue_glCore_glMatrixMultfEXT: qword +bluegl_glMatrixMultfEXT proc + mov r11, __blue_glCore_glMatrixMultfEXT jmp r11 -bluegl_glGetnUniformiv endp +bluegl_glMatrixMultfEXT endp -extrn __blue_glCore_glMapBuffer: qword -bluegl_glMapBuffer proc - mov r11, __blue_glCore_glMapBuffer +extrn __blue_glCore_glMatrixMultdEXT: qword +bluegl_glMatrixMultdEXT proc + mov r11, __blue_glCore_glMatrixMultdEXT jmp r11 -bluegl_glMapBuffer endp +bluegl_glMatrixMultdEXT endp -extrn __blue_glCore_glScissorIndexed: qword -bluegl_glScissorIndexed proc - mov r11, __blue_glCore_glScissorIndexed +extrn __blue_glCore_glMatrixLoadIdentityEXT: qword +bluegl_glMatrixLoadIdentityEXT proc + mov r11, __blue_glCore_glMatrixLoadIdentityEXT jmp r11 -bluegl_glScissorIndexed endp +bluegl_glMatrixLoadIdentityEXT endp -extrn __blue_glCore_glUniform3fARB: qword -bluegl_glUniform3fARB proc - mov r11, __blue_glCore_glUniform3fARB +extrn __blue_glCore_glMatrixRotatefEXT: qword +bluegl_glMatrixRotatefEXT proc + mov r11, __blue_glCore_glMatrixRotatefEXT jmp r11 -bluegl_glUniform3fARB endp +bluegl_glMatrixRotatefEXT endp -extrn __blue_glCore_glGetColorTable: qword -bluegl_glGetColorTable proc - mov r11, __blue_glCore_glGetColorTable +extrn __blue_glCore_glMatrixRotatedEXT: qword +bluegl_glMatrixRotatedEXT proc + mov r11, __blue_glCore_glMatrixRotatedEXT jmp r11 -bluegl_glGetColorTable endp +bluegl_glMatrixRotatedEXT endp -extrn __blue_glCore_glFramebufferTextureFaceARB: qword -bluegl_glFramebufferTextureFaceARB proc - mov r11, __blue_glCore_glFramebufferTextureFaceARB +extrn __blue_glCore_glMatrixScalefEXT: qword +bluegl_glMatrixScalefEXT proc + mov r11, __blue_glCore_glMatrixScalefEXT jmp r11 -bluegl_glFramebufferTextureFaceARB endp +bluegl_glMatrixScalefEXT endp -extrn __blue_glCore_glBeginTransformFeedbackEXT: qword -bluegl_glBeginTransformFeedbackEXT proc - mov r11, __blue_glCore_glBeginTransformFeedbackEXT +extrn __blue_glCore_glMatrixScaledEXT: qword +bluegl_glMatrixScaledEXT proc + mov r11, __blue_glCore_glMatrixScaledEXT jmp r11 -bluegl_glBeginTransformFeedbackEXT endp +bluegl_glMatrixScaledEXT endp -extrn __blue_glCore_glGenFencesNV: qword -bluegl_glGenFencesNV proc - mov r11, __blue_glCore_glGenFencesNV +extrn __blue_glCore_glMatrixTranslatefEXT: qword +bluegl_glMatrixTranslatefEXT proc + mov r11, __blue_glCore_glMatrixTranslatefEXT jmp r11 -bluegl_glGenFencesNV endp +bluegl_glMatrixTranslatefEXT endp -extrn __blue_glCore_glMultiTexImage2DEXT: qword -bluegl_glMultiTexImage2DEXT proc - mov r11, __blue_glCore_glMultiTexImage2DEXT +extrn __blue_glCore_glMatrixTranslatedEXT: qword +bluegl_glMatrixTranslatedEXT proc + mov r11, __blue_glCore_glMatrixTranslatedEXT jmp r11 -bluegl_glMultiTexImage2DEXT endp +bluegl_glMatrixTranslatedEXT endp -extrn __blue_glCore_glVertexAttrib2hNV: qword -bluegl_glVertexAttrib2hNV proc - mov r11, __blue_glCore_glVertexAttrib2hNV +extrn __blue_glCore_glMatrixFrustumEXT: qword +bluegl_glMatrixFrustumEXT proc + mov r11, __blue_glCore_glMatrixFrustumEXT jmp r11 -bluegl_glVertexAttrib2hNV endp +bluegl_glMatrixFrustumEXT endp -extrn __blue_glCore_glFragmentLightfvSGIX: qword -bluegl_glFragmentLightfvSGIX proc - mov r11, __blue_glCore_glFragmentLightfvSGIX +extrn __blue_glCore_glMatrixOrthoEXT: qword +bluegl_glMatrixOrthoEXT proc + mov r11, __blue_glCore_glMatrixOrthoEXT jmp r11 -bluegl_glFragmentLightfvSGIX endp +bluegl_glMatrixOrthoEXT endp -extrn __blue_glCore_glProgramUniform2iv: qword -bluegl_glProgramUniform2iv proc - mov r11, __blue_glCore_glProgramUniform2iv +extrn __blue_glCore_glMatrixPopEXT: qword +bluegl_glMatrixPopEXT proc + mov r11, __blue_glCore_glMatrixPopEXT jmp r11 -bluegl_glProgramUniform2iv endp +bluegl_glMatrixPopEXT endp -extrn __blue_glCore_glVertexAttribL4d: qword -bluegl_glVertexAttribL4d proc - mov r11, __blue_glCore_glVertexAttribL4d +extrn __blue_glCore_glMatrixPushEXT: qword +bluegl_glMatrixPushEXT proc + mov r11, __blue_glCore_glMatrixPushEXT jmp r11 -bluegl_glVertexAttribL4d endp +bluegl_glMatrixPushEXT endp -extrn __blue_glCore_glMapBufferARB: qword -bluegl_glMapBufferARB proc - mov r11, __blue_glCore_glMapBufferARB +extrn __blue_glCore_glClientAttribDefaultEXT: qword +bluegl_glClientAttribDefaultEXT proc + mov r11, __blue_glCore_glClientAttribDefaultEXT jmp r11 -bluegl_glMapBufferARB endp +bluegl_glClientAttribDefaultEXT endp -extrn __blue_glCore_glBindVideoCaptureStreamTextureNV: qword -bluegl_glBindVideoCaptureStreamTextureNV proc - mov r11, __blue_glCore_glBindVideoCaptureStreamTextureNV +extrn __blue_glCore_glPushClientAttribDefaultEXT: qword +bluegl_glPushClientAttribDefaultEXT proc + mov r11, __blue_glCore_glPushClientAttribDefaultEXT jmp r11 -bluegl_glBindVideoCaptureStreamTextureNV endp +bluegl_glPushClientAttribDefaultEXT endp -extrn __blue_glCore_glConvolutionParameterxvOES: qword -bluegl_glConvolutionParameterxvOES proc - mov r11, __blue_glCore_glConvolutionParameterxvOES +extrn __blue_glCore_glTextureParameterfEXT: qword +bluegl_glTextureParameterfEXT proc + mov r11, __blue_glCore_glTextureParameterfEXT jmp r11 -bluegl_glConvolutionParameterxvOES endp +bluegl_glTextureParameterfEXT endp -extrn __blue_glCore_glTexParameterIuivEXT: qword -bluegl_glTexParameterIuivEXT proc - mov r11, __blue_glCore_glTexParameterIuivEXT +extrn __blue_glCore_glTextureParameterfvEXT: qword +bluegl_glTextureParameterfvEXT proc + mov r11, __blue_glCore_glTextureParameterfvEXT jmp r11 -bluegl_glTexParameterIuivEXT endp +bluegl_glTextureParameterfvEXT endp -extrn __blue_glCore_glVertexAttribI4ubv: qword -bluegl_glVertexAttribI4ubv proc - mov r11, __blue_glCore_glVertexAttribI4ubv +extrn __blue_glCore_glTextureParameteriEXT: qword +bluegl_glTextureParameteriEXT proc + mov r11, __blue_glCore_glTextureParameteriEXT jmp r11 -bluegl_glVertexAttribI4ubv endp +bluegl_glTextureParameteriEXT endp -extrn __blue_glCore_glTexSubImage1DEXT: qword -bluegl_glTexSubImage1DEXT proc - mov r11, __blue_glCore_glTexSubImage1DEXT +extrn __blue_glCore_glTextureParameterivEXT: qword +bluegl_glTextureParameterivEXT proc + mov r11, __blue_glCore_glTextureParameterivEXT jmp r11 -bluegl_glTexSubImage1DEXT endp +bluegl_glTextureParameterivEXT endp -extrn __blue_glCore_glTextureStorage2DEXT: qword -bluegl_glTextureStorage2DEXT proc - mov r11, __blue_glCore_glTextureStorage2DEXT +extrn __blue_glCore_glTextureImage1DEXT: qword +bluegl_glTextureImage1DEXT proc + mov r11, __blue_glCore_glTextureImage1DEXT jmp r11 -bluegl_glTextureStorage2DEXT endp +bluegl_glTextureImage1DEXT endp -extrn __blue_glCore_glTexSubImage3DEXT: qword -bluegl_glTexSubImage3DEXT proc - mov r11, __blue_glCore_glTexSubImage3DEXT +extrn __blue_glCore_glTextureImage2DEXT: qword +bluegl_glTextureImage2DEXT proc + mov r11, __blue_glCore_glTextureImage2DEXT jmp r11 -bluegl_glTexSubImage3DEXT endp +bluegl_glTextureImage2DEXT endp -extrn __blue_glCore_glVertex2xvOES: qword -bluegl_glVertex2xvOES proc - mov r11, __blue_glCore_glVertex2xvOES +extrn __blue_glCore_glTextureSubImage1DEXT: qword +bluegl_glTextureSubImage1DEXT proc + mov r11, __blue_glCore_glTextureSubImage1DEXT jmp r11 -bluegl_glVertex2xvOES endp +bluegl_glTextureSubImage1DEXT endp -extrn __blue_glCore_glGetMultiTexImageEXT: qword -bluegl_glGetMultiTexImageEXT proc - mov r11, __blue_glCore_glGetMultiTexImageEXT +extrn __blue_glCore_glTextureSubImage2DEXT: qword +bluegl_glTextureSubImage2DEXT proc + mov r11, __blue_glCore_glTextureSubImage2DEXT jmp r11 -bluegl_glGetMultiTexImageEXT endp +bluegl_glTextureSubImage2DEXT endp -extrn __blue_glCore_glNormalStream3ivATI: qword -bluegl_glNormalStream3ivATI proc - mov r11, __blue_glCore_glNormalStream3ivATI +extrn __blue_glCore_glCopyTextureImage1DEXT: qword +bluegl_glCopyTextureImage1DEXT proc + mov r11, __blue_glCore_glCopyTextureImage1DEXT jmp r11 -bluegl_glNormalStream3ivATI endp +bluegl_glCopyTextureImage1DEXT endp -extrn __blue_glCore_glGetNamedBufferPointerv: qword -bluegl_glGetNamedBufferPointerv proc - mov r11, __blue_glCore_glGetNamedBufferPointerv +extrn __blue_glCore_glCopyTextureImage2DEXT: qword +bluegl_glCopyTextureImage2DEXT proc + mov r11, __blue_glCore_glCopyTextureImage2DEXT jmp r11 -bluegl_glGetNamedBufferPointerv endp +bluegl_glCopyTextureImage2DEXT endp -extrn __blue_glCore_glTexBuffer: qword -bluegl_glTexBuffer proc - mov r11, __blue_glCore_glTexBuffer +extrn __blue_glCore_glCopyTextureSubImage1DEXT: qword +bluegl_glCopyTextureSubImage1DEXT proc + mov r11, __blue_glCore_glCopyTextureSubImage1DEXT jmp r11 -bluegl_glTexBuffer endp +bluegl_glCopyTextureSubImage1DEXT endp -extrn __blue_glCore_glCombinerInputNV: qword -bluegl_glCombinerInputNV proc - mov r11, __blue_glCore_glCombinerInputNV +extrn __blue_glCore_glCopyTextureSubImage2DEXT: qword +bluegl_glCopyTextureSubImage2DEXT proc + mov r11, __blue_glCore_glCopyTextureSubImage2DEXT jmp r11 -bluegl_glCombinerInputNV endp +bluegl_glCopyTextureSubImage2DEXT endp -extrn __blue_glCore_glVertexAttrib1dARB: qword -bluegl_glVertexAttrib1dARB proc - mov r11, __blue_glCore_glVertexAttrib1dARB +extrn __blue_glCore_glGetTextureImageEXT: qword +bluegl_glGetTextureImageEXT proc + mov r11, __blue_glCore_glGetTextureImageEXT jmp r11 -bluegl_glVertexAttrib1dARB endp +bluegl_glGetTextureImageEXT endp -extrn __blue_glCore_glVertexP3ui: qword -bluegl_glVertexP3ui proc - mov r11, __blue_glCore_glVertexP3ui +extrn __blue_glCore_glGetTextureParameterfvEXT: qword +bluegl_glGetTextureParameterfvEXT proc + mov r11, __blue_glCore_glGetTextureParameterfvEXT jmp r11 -bluegl_glVertexP3ui endp +bluegl_glGetTextureParameterfvEXT endp -extrn __blue_glCore_glMatrixMult3x2fNV: qword -bluegl_glMatrixMult3x2fNV proc - mov r11, __blue_glCore_glMatrixMult3x2fNV +extrn __blue_glCore_glGetTextureParameterivEXT: qword +bluegl_glGetTextureParameterivEXT proc + mov r11, __blue_glCore_glGetTextureParameterivEXT jmp r11 -bluegl_glMatrixMult3x2fNV endp +bluegl_glGetTextureParameterivEXT endp -extrn __blue_glCore_glNamedFramebufferTexture2DEXT: qword -bluegl_glNamedFramebufferTexture2DEXT proc - mov r11, __blue_glCore_glNamedFramebufferTexture2DEXT +extrn __blue_glCore_glGetTextureLevelParameterfvEXT: qword +bluegl_glGetTextureLevelParameterfvEXT proc + mov r11, __blue_glCore_glGetTextureLevelParameterfvEXT jmp r11 -bluegl_glNamedFramebufferTexture2DEXT endp +bluegl_glGetTextureLevelParameterfvEXT endp -extrn __blue_glCore_glGetTextureLevelParameteriv: qword -bluegl_glGetTextureLevelParameteriv proc - mov r11, __blue_glCore_glGetTextureLevelParameteriv +extrn __blue_glCore_glGetTextureLevelParameterivEXT: qword +bluegl_glGetTextureLevelParameterivEXT proc + mov r11, __blue_glCore_glGetTextureLevelParameterivEXT jmp r11 -bluegl_glGetTextureLevelParameteriv endp +bluegl_glGetTextureLevelParameterivEXT endp -extrn __blue_glCore_glPixelMapx: qword -bluegl_glPixelMapx proc - mov r11, __blue_glCore_glPixelMapx +extrn __blue_glCore_glTextureImage3DEXT: qword +bluegl_glTextureImage3DEXT proc + mov r11, __blue_glCore_glTextureImage3DEXT jmp r11 -bluegl_glPixelMapx endp +bluegl_glTextureImage3DEXT endp -extrn __blue_glCore_glBlendFuncSeparatei: qword -bluegl_glBlendFuncSeparatei proc - mov r11, __blue_glCore_glBlendFuncSeparatei +extrn __blue_glCore_glTextureSubImage3DEXT: qword +bluegl_glTextureSubImage3DEXT proc + mov r11, __blue_glCore_glTextureSubImage3DEXT jmp r11 -bluegl_glBlendFuncSeparatei endp +bluegl_glTextureSubImage3DEXT endp -extrn __blue_glCore_glTessellationModeAMD: qword -bluegl_glTessellationModeAMD proc - mov r11, __blue_glCore_glTessellationModeAMD +extrn __blue_glCore_glCopyTextureSubImage3DEXT: qword +bluegl_glCopyTextureSubImage3DEXT proc + mov r11, __blue_glCore_glCopyTextureSubImage3DEXT jmp r11 -bluegl_glTessellationModeAMD endp +bluegl_glCopyTextureSubImage3DEXT endp -extrn __blue_glCore_glProgramEnvParametersI4uivNV: qword -bluegl_glProgramEnvParametersI4uivNV proc - mov r11, __blue_glCore_glProgramEnvParametersI4uivNV +extrn __blue_glCore_glBindMultiTextureEXT: qword +bluegl_glBindMultiTextureEXT proc + mov r11, __blue_glCore_glBindMultiTextureEXT jmp r11 -bluegl_glProgramEnvParametersI4uivNV endp +bluegl_glBindMultiTextureEXT endp -extrn __blue_glCore_glGetColorTableParameterfvEXT: qword -bluegl_glGetColorTableParameterfvEXT proc - mov r11, __blue_glCore_glGetColorTableParameterfvEXT +extrn __blue_glCore_glMultiTexCoordPointerEXT: qword +bluegl_glMultiTexCoordPointerEXT proc + mov r11, __blue_glCore_glMultiTexCoordPointerEXT jmp r11 -bluegl_glGetColorTableParameterfvEXT endp +bluegl_glMultiTexCoordPointerEXT endp -extrn __blue_glCore_glVertexAttribI1uiEXT: qword -bluegl_glVertexAttribI1uiEXT proc - mov r11, __blue_glCore_glVertexAttribI1uiEXT +extrn __blue_glCore_glMultiTexEnvfEXT: qword +bluegl_glMultiTexEnvfEXT proc + mov r11, __blue_glCore_glMultiTexEnvfEXT jmp r11 -bluegl_glVertexAttribI1uiEXT endp +bluegl_glMultiTexEnvfEXT endp -extrn __blue_glCore_glPrioritizeTexturesEXT: qword -bluegl_glPrioritizeTexturesEXT proc - mov r11, __blue_glCore_glPrioritizeTexturesEXT +extrn __blue_glCore_glMultiTexEnvfvEXT: qword +bluegl_glMultiTexEnvfvEXT proc + mov r11, __blue_glCore_glMultiTexEnvfvEXT jmp r11 -bluegl_glPrioritizeTexturesEXT endp +bluegl_glMultiTexEnvfvEXT endp -extrn __blue_glCore_glProgramUniform1i64vNV: qword -bluegl_glProgramUniform1i64vNV proc - mov r11, __blue_glCore_glProgramUniform1i64vNV +extrn __blue_glCore_glMultiTexEnviEXT: qword +bluegl_glMultiTexEnviEXT proc + mov r11, __blue_glCore_glMultiTexEnviEXT jmp r11 -bluegl_glProgramUniform1i64vNV endp +bluegl_glMultiTexEnviEXT endp -extrn __blue_glCore_glGetTextureParameteriv: qword -bluegl_glGetTextureParameteriv proc - mov r11, __blue_glCore_glGetTextureParameteriv +extrn __blue_glCore_glMultiTexEnvivEXT: qword +bluegl_glMultiTexEnvivEXT proc + mov r11, __blue_glCore_glMultiTexEnvivEXT jmp r11 -bluegl_glGetTextureParameteriv endp +bluegl_glMultiTexEnvivEXT endp -extrn __blue_glCore_glGetTransformFeedbackiv: qword -bluegl_glGetTransformFeedbackiv proc - mov r11, __blue_glCore_glGetTransformFeedbackiv +extrn __blue_glCore_glMultiTexGendEXT: qword +bluegl_glMultiTexGendEXT proc + mov r11, __blue_glCore_glMultiTexGendEXT jmp r11 -bluegl_glGetTransformFeedbackiv endp +bluegl_glMultiTexGendEXT endp -extrn __blue_glCore_glMultiDrawArraysIndirectBindlessCountNV: qword -bluegl_glMultiDrawArraysIndirectBindlessCountNV proc - mov r11, __blue_glCore_glMultiDrawArraysIndirectBindlessCountNV +extrn __blue_glCore_glMultiTexGendvEXT: qword +bluegl_glMultiTexGendvEXT proc + mov r11, __blue_glCore_glMultiTexGendvEXT jmp r11 -bluegl_glMultiDrawArraysIndirectBindlessCountNV endp +bluegl_glMultiTexGendvEXT endp -extrn __blue_glCore_glUseShaderProgramEXT: qword -bluegl_glUseShaderProgramEXT proc - mov r11, __blue_glCore_glUseShaderProgramEXT +extrn __blue_glCore_glMultiTexGenfEXT: qword +bluegl_glMultiTexGenfEXT proc + mov r11, __blue_glCore_glMultiTexGenfEXT jmp r11 -bluegl_glUseShaderProgramEXT endp +bluegl_glMultiTexGenfEXT endp -extrn __blue_glCore_glDeleteTransformFeedbacks: qword -bluegl_glDeleteTransformFeedbacks proc - mov r11, __blue_glCore_glDeleteTransformFeedbacks +extrn __blue_glCore_glMultiTexGenfvEXT: qword +bluegl_glMultiTexGenfvEXT proc + mov r11, __blue_glCore_glMultiTexGenfvEXT jmp r11 -bluegl_glDeleteTransformFeedbacks endp +bluegl_glMultiTexGenfvEXT endp -extrn __blue_glCore_glCoverageModulationTableNV: qword -bluegl_glCoverageModulationTableNV proc - mov r11, __blue_glCore_glCoverageModulationTableNV +extrn __blue_glCore_glMultiTexGeniEXT: qword +bluegl_glMultiTexGeniEXT proc + mov r11, __blue_glCore_glMultiTexGeniEXT jmp r11 -bluegl_glCoverageModulationTableNV endp +bluegl_glMultiTexGeniEXT endp -extrn __blue_glCore_glMultiTexCoord1d: qword -bluegl_glMultiTexCoord1d proc - mov r11, __blue_glCore_glMultiTexCoord1d +extrn __blue_glCore_glMultiTexGenivEXT: qword +bluegl_glMultiTexGenivEXT proc + mov r11, __blue_glCore_glMultiTexGenivEXT jmp r11 -bluegl_glMultiTexCoord1d endp +bluegl_glMultiTexGenivEXT endp -extrn __blue_glCore_glGetTexLevelParameteriv: qword -bluegl_glGetTexLevelParameteriv proc - mov r11, __blue_glCore_glGetTexLevelParameteriv +extrn __blue_glCore_glGetMultiTexEnvfvEXT: qword +bluegl_glGetMultiTexEnvfvEXT proc + mov r11, __blue_glCore_glGetMultiTexEnvfvEXT jmp r11 -bluegl_glGetTexLevelParameteriv endp +bluegl_glGetMultiTexEnvfvEXT endp -extrn __blue_glCore_glProgramUniform4ui: qword -bluegl_glProgramUniform4ui proc - mov r11, __blue_glCore_glProgramUniform4ui +extrn __blue_glCore_glGetMultiTexEnvivEXT: qword +bluegl_glGetMultiTexEnvivEXT proc + mov r11, __blue_glCore_glGetMultiTexEnvivEXT jmp r11 -bluegl_glProgramUniform4ui endp +bluegl_glGetMultiTexEnvivEXT endp -extrn __blue_glCore_glProgramUniform4iv: qword -bluegl_glProgramUniform4iv proc - mov r11, __blue_glCore_glProgramUniform4iv +extrn __blue_glCore_glGetMultiTexGendvEXT: qword +bluegl_glGetMultiTexGendvEXT proc + mov r11, __blue_glCore_glGetMultiTexGendvEXT jmp r11 -bluegl_glProgramUniform4iv endp +bluegl_glGetMultiTexGendvEXT endp -extrn __blue_glCore_glTangent3fvEXT: qword -bluegl_glTangent3fvEXT proc - mov r11, __blue_glCore_glTangent3fvEXT +extrn __blue_glCore_glGetMultiTexGenfvEXT: qword +bluegl_glGetMultiTexGenfvEXT proc + mov r11, __blue_glCore_glGetMultiTexGenfvEXT jmp r11 -bluegl_glTangent3fvEXT endp +bluegl_glGetMultiTexGenfvEXT endp -extrn __blue_glCore_glViewportIndexedfv: qword -bluegl_glViewportIndexedfv proc - mov r11, __blue_glCore_glViewportIndexedfv +extrn __blue_glCore_glGetMultiTexGenivEXT: qword +bluegl_glGetMultiTexGenivEXT proc + mov r11, __blue_glCore_glGetMultiTexGenivEXT jmp r11 -bluegl_glViewportIndexedfv endp +bluegl_glGetMultiTexGenivEXT endp -extrn __blue_glCore_glSampleMaski: qword -bluegl_glSampleMaski proc - mov r11, __blue_glCore_glSampleMaski +extrn __blue_glCore_glMultiTexParameteriEXT: qword +bluegl_glMultiTexParameteriEXT proc + mov r11, __blue_glCore_glMultiTexParameteriEXT jmp r11 -bluegl_glSampleMaski endp +bluegl_glMultiTexParameteriEXT endp -extrn __blue_glCore_glProgramUniformMatrix4x3dvEXT: qword -bluegl_glProgramUniformMatrix4x3dvEXT proc - mov r11, __blue_glCore_glProgramUniformMatrix4x3dvEXT +extrn __blue_glCore_glMultiTexParameterivEXT: qword +bluegl_glMultiTexParameterivEXT proc + mov r11, __blue_glCore_glMultiTexParameterivEXT jmp r11 -bluegl_glProgramUniformMatrix4x3dvEXT endp +bluegl_glMultiTexParameterivEXT endp -extrn __blue_glCore_glCompileShaderARB: qword -bluegl_glCompileShaderARB proc - mov r11, __blue_glCore_glCompileShaderARB +extrn __blue_glCore_glMultiTexParameterfEXT: qword +bluegl_glMultiTexParameterfEXT proc + mov r11, __blue_glCore_glMultiTexParameterfEXT jmp r11 -bluegl_glCompileShaderARB endp +bluegl_glMultiTexParameterfEXT endp -extrn __blue_glCore_glUniform4ui64ARB: qword -bluegl_glUniform4ui64ARB proc - mov r11, __blue_glCore_glUniform4ui64ARB +extrn __blue_glCore_glMultiTexParameterfvEXT: qword +bluegl_glMultiTexParameterfvEXT proc + mov r11, __blue_glCore_glMultiTexParameterfvEXT jmp r11 -bluegl_glUniform4ui64ARB endp +bluegl_glMultiTexParameterfvEXT endp -extrn __blue_glCore_glTexCoord3xOES: qword -bluegl_glTexCoord3xOES proc - mov r11, __blue_glCore_glTexCoord3xOES +extrn __blue_glCore_glMultiTexImage1DEXT: qword +bluegl_glMultiTexImage1DEXT proc + mov r11, __blue_glCore_glMultiTexImage1DEXT jmp r11 -bluegl_glTexCoord3xOES endp +bluegl_glMultiTexImage1DEXT endp -extrn __blue_glCore_glGetInternalformativ: qword -bluegl_glGetInternalformativ proc - mov r11, __blue_glCore_glGetInternalformativ +extrn __blue_glCore_glMultiTexImage2DEXT: qword +bluegl_glMultiTexImage2DEXT proc + mov r11, __blue_glCore_glMultiTexImage2DEXT jmp r11 -bluegl_glGetInternalformativ endp +bluegl_glMultiTexImage2DEXT endp -extrn __blue_glCore_glObjectPtrLabel: qword -bluegl_glObjectPtrLabel proc - mov r11, __blue_glCore_glObjectPtrLabel +extrn __blue_glCore_glMultiTexSubImage1DEXT: qword +bluegl_glMultiTexSubImage1DEXT proc + mov r11, __blue_glCore_glMultiTexSubImage1DEXT jmp r11 -bluegl_glObjectPtrLabel endp +bluegl_glMultiTexSubImage1DEXT endp -extrn __blue_glCore_glNormal3hvNV: qword -bluegl_glNormal3hvNV proc - mov r11, __blue_glCore_glNormal3hvNV +extrn __blue_glCore_glMultiTexSubImage2DEXT: qword +bluegl_glMultiTexSubImage2DEXT proc + mov r11, __blue_glCore_glMultiTexSubImage2DEXT jmp r11 -bluegl_glNormal3hvNV endp +bluegl_glMultiTexSubImage2DEXT endp -extrn __blue_glCore_glProgramUniform1uiv: qword -bluegl_glProgramUniform1uiv proc - mov r11, __blue_glCore_glProgramUniform1uiv +extrn __blue_glCore_glCopyMultiTexImage1DEXT: qword +bluegl_glCopyMultiTexImage1DEXT proc + mov r11, __blue_glCore_glCopyMultiTexImage1DEXT jmp r11 -bluegl_glProgramUniform1uiv endp +bluegl_glCopyMultiTexImage1DEXT endp -extrn __blue_glCore_glGenFragmentShadersATI: qword -bluegl_glGenFragmentShadersATI proc - mov r11, __blue_glCore_glGenFragmentShadersATI +extrn __blue_glCore_glCopyMultiTexImage2DEXT: qword +bluegl_glCopyMultiTexImage2DEXT proc + mov r11, __blue_glCore_glCopyMultiTexImage2DEXT jmp r11 -bluegl_glGenFragmentShadersATI endp +bluegl_glCopyMultiTexImage2DEXT endp -extrn __blue_glCore_glTexCoord2hvNV: qword -bluegl_glTexCoord2hvNV proc - mov r11, __blue_glCore_glTexCoord2hvNV +extrn __blue_glCore_glCopyMultiTexSubImage1DEXT: qword +bluegl_glCopyMultiTexSubImage1DEXT proc + mov r11, __blue_glCore_glCopyMultiTexSubImage1DEXT jmp r11 -bluegl_glTexCoord2hvNV endp +bluegl_glCopyMultiTexSubImage1DEXT endp -extrn __blue_glCore_glFinishAsyncSGIX: qword -bluegl_glFinishAsyncSGIX proc - mov r11, __blue_glCore_glFinishAsyncSGIX +extrn __blue_glCore_glCopyMultiTexSubImage2DEXT: qword +bluegl_glCopyMultiTexSubImage2DEXT proc + mov r11, __blue_glCore_glCopyMultiTexSubImage2DEXT jmp r11 -bluegl_glFinishAsyncSGIX endp +bluegl_glCopyMultiTexSubImage2DEXT endp -extrn __blue_glCore_glEnableVertexAttribArrayARB: qword -bluegl_glEnableVertexAttribArrayARB proc - mov r11, __blue_glCore_glEnableVertexAttribArrayARB +extrn __blue_glCore_glGetMultiTexImageEXT: qword +bluegl_glGetMultiTexImageEXT proc + mov r11, __blue_glCore_glGetMultiTexImageEXT jmp r11 -bluegl_glEnableVertexAttribArrayARB endp +bluegl_glGetMultiTexImageEXT endp -extrn __blue_glCore_glDeleteSamplers: qword -bluegl_glDeleteSamplers proc - mov r11, __blue_glCore_glDeleteSamplers +extrn __blue_glCore_glGetMultiTexParameterfvEXT: qword +bluegl_glGetMultiTexParameterfvEXT proc + mov r11, __blue_glCore_glGetMultiTexParameterfvEXT jmp r11 -bluegl_glDeleteSamplers endp +bluegl_glGetMultiTexParameterfvEXT endp -extrn __blue_glCore_glVertexAttrib1fvARB: qword -bluegl_glVertexAttrib1fvARB proc - mov r11, __blue_glCore_glVertexAttrib1fvARB +extrn __blue_glCore_glGetMultiTexParameterivEXT: qword +bluegl_glGetMultiTexParameterivEXT proc + mov r11, __blue_glCore_glGetMultiTexParameterivEXT jmp r11 -bluegl_glVertexAttrib1fvARB endp +bluegl_glGetMultiTexParameterivEXT endp -extrn __blue_glCore_glGetnUniformivARB: qword -bluegl_glGetnUniformivARB proc - mov r11, __blue_glCore_glGetnUniformivARB +extrn __blue_glCore_glGetMultiTexLevelParameterfvEXT: qword +bluegl_glGetMultiTexLevelParameterfvEXT proc + mov r11, __blue_glCore_glGetMultiTexLevelParameterfvEXT jmp r11 -bluegl_glGetnUniformivARB endp +bluegl_glGetMultiTexLevelParameterfvEXT endp -extrn __blue_glCore_glLoadTransposeMatrixd: qword -bluegl_glLoadTransposeMatrixd proc - mov r11, __blue_glCore_glLoadTransposeMatrixd +extrn __blue_glCore_glGetMultiTexLevelParameterivEXT: qword +bluegl_glGetMultiTexLevelParameterivEXT proc + mov r11, __blue_glCore_glGetMultiTexLevelParameterivEXT jmp r11 -bluegl_glLoadTransposeMatrixd endp +bluegl_glGetMultiTexLevelParameterivEXT endp -extrn __blue_glCore_glProgramParameteri: qword -bluegl_glProgramParameteri proc - mov r11, __blue_glCore_glProgramParameteri +extrn __blue_glCore_glMultiTexImage3DEXT: qword +bluegl_glMultiTexImage3DEXT proc + mov r11, __blue_glCore_glMultiTexImage3DEXT jmp r11 -bluegl_glProgramParameteri endp +bluegl_glMultiTexImage3DEXT endp -extrn __blue_glCore_glCreateShader: qword -bluegl_glCreateShader proc - mov r11, __blue_glCore_glCreateShader +extrn __blue_glCore_glMultiTexSubImage3DEXT: qword +bluegl_glMultiTexSubImage3DEXT proc + mov r11, __blue_glCore_glMultiTexSubImage3DEXT jmp r11 -bluegl_glCreateShader endp +bluegl_glMultiTexSubImage3DEXT endp -extrn __blue_glCore_glFragmentCoverageColorNV: qword -bluegl_glFragmentCoverageColorNV proc - mov r11, __blue_glCore_glFragmentCoverageColorNV +extrn __blue_glCore_glCopyMultiTexSubImage3DEXT: qword +bluegl_glCopyMultiTexSubImage3DEXT proc + mov r11, __blue_glCore_glCopyMultiTexSubImage3DEXT jmp r11 -bluegl_glFragmentCoverageColorNV endp +bluegl_glCopyMultiTexSubImage3DEXT endp -extrn __blue_glCore_glVertexStream3dvATI: qword -bluegl_glVertexStream3dvATI proc - mov r11, __blue_glCore_glVertexStream3dvATI +extrn __blue_glCore_glEnableClientStateIndexedEXT: qword +bluegl_glEnableClientStateIndexedEXT proc + mov r11, __blue_glCore_glEnableClientStateIndexedEXT jmp r11 -bluegl_glVertexStream3dvATI endp +bluegl_glEnableClientStateIndexedEXT endp -extrn __blue_glCore_glUniformHandleui64ARB: qword -bluegl_glUniformHandleui64ARB proc - mov r11, __blue_glCore_glUniformHandleui64ARB +extrn __blue_glCore_glDisableClientStateIndexedEXT: qword +bluegl_glDisableClientStateIndexedEXT proc + mov r11, __blue_glCore_glDisableClientStateIndexedEXT jmp r11 -bluegl_glUniformHandleui64ARB endp +bluegl_glDisableClientStateIndexedEXT endp -extrn __blue_glCore_glGetVaryingLocationNV: qword -bluegl_glGetVaryingLocationNV proc - mov r11, __blue_glCore_glGetVaryingLocationNV +extrn __blue_glCore_glGetFloatIndexedvEXT: qword +bluegl_glGetFloatIndexedvEXT proc + mov r11, __blue_glCore_glGetFloatIndexedvEXT jmp r11 -bluegl_glGetVaryingLocationNV endp +bluegl_glGetFloatIndexedvEXT endp -extrn __blue_glCore_glCompressedTextureSubImage2DEXT: qword -bluegl_glCompressedTextureSubImage2DEXT proc - mov r11, __blue_glCore_glCompressedTextureSubImage2DEXT +extrn __blue_glCore_glGetDoubleIndexedvEXT: qword +bluegl_glGetDoubleIndexedvEXT proc + mov r11, __blue_glCore_glGetDoubleIndexedvEXT jmp r11 -bluegl_glCompressedTextureSubImage2DEXT endp +bluegl_glGetDoubleIndexedvEXT endp -extrn __blue_glCore_glTangent3dEXT: qword -bluegl_glTangent3dEXT proc - mov r11, __blue_glCore_glTangent3dEXT +extrn __blue_glCore_glGetPointerIndexedvEXT: qword +bluegl_glGetPointerIndexedvEXT proc + mov r11, __blue_glCore_glGetPointerIndexedvEXT jmp r11 -bluegl_glTangent3dEXT endp +bluegl_glGetPointerIndexedvEXT endp -extrn __blue_glCore_glGetNamedBufferPointervEXT: qword -bluegl_glGetNamedBufferPointervEXT proc - mov r11, __blue_glCore_glGetNamedBufferPointervEXT +extrn __blue_glCore_glEnableIndexedEXT: qword +bluegl_glEnableIndexedEXT proc + mov r11, __blue_glCore_glEnableIndexedEXT jmp r11 -bluegl_glGetNamedBufferPointervEXT endp +bluegl_glEnableIndexedEXT endp -extrn __blue_glCore_glVertex2bvOES: qword -bluegl_glVertex2bvOES proc - mov r11, __blue_glCore_glVertex2bvOES +extrn __blue_glCore_glDisableIndexedEXT: qword +bluegl_glDisableIndexedEXT proc + mov r11, __blue_glCore_glDisableIndexedEXT jmp r11 -bluegl_glVertex2bvOES endp +bluegl_glDisableIndexedEXT endp -extrn __blue_glCore_glProgramBufferParametersIuivNV: qword -bluegl_glProgramBufferParametersIuivNV proc - mov r11, __blue_glCore_glProgramBufferParametersIuivNV +extrn __blue_glCore_glIsEnabledIndexedEXT: qword +bluegl_glIsEnabledIndexedEXT proc + mov r11, __blue_glCore_glIsEnabledIndexedEXT jmp r11 -bluegl_glProgramBufferParametersIuivNV endp +bluegl_glIsEnabledIndexedEXT endp -extrn __blue_glCore_glGetnTexImageARB: qword -bluegl_glGetnTexImageARB proc - mov r11, __blue_glCore_glGetnTexImageARB +extrn __blue_glCore_glGetIntegerIndexedvEXT: qword +bluegl_glGetIntegerIndexedvEXT proc + mov r11, __blue_glCore_glGetIntegerIndexedvEXT + jmp r11 +bluegl_glGetIntegerIndexedvEXT endp + +extrn __blue_glCore_glGetBooleanIndexedvEXT: qword +bluegl_glGetBooleanIndexedvEXT proc + mov r11, __blue_glCore_glGetBooleanIndexedvEXT jmp r11 -bluegl_glGetnTexImageARB endp +bluegl_glGetBooleanIndexedvEXT endp -extrn __blue_glCore_glSetFenceNV: qword -bluegl_glSetFenceNV proc - mov r11, __blue_glCore_glSetFenceNV +extrn __blue_glCore_glCompressedTextureImage3DEXT: qword +bluegl_glCompressedTextureImage3DEXT proc + mov r11, __blue_glCore_glCompressedTextureImage3DEXT jmp r11 -bluegl_glSetFenceNV endp +bluegl_glCompressedTextureImage3DEXT endp -extrn __blue_glCore_glPathParameterfvNV: qword -bluegl_glPathParameterfvNV proc - mov r11, __blue_glCore_glPathParameterfvNV +extrn __blue_glCore_glCompressedTextureImage2DEXT: qword +bluegl_glCompressedTextureImage2DEXT proc + mov r11, __blue_glCore_glCompressedTextureImage2DEXT jmp r11 -bluegl_glPathParameterfvNV endp +bluegl_glCompressedTextureImage2DEXT endp -extrn __blue_glCore_glVertexAttribFormat: qword -bluegl_glVertexAttribFormat proc - mov r11, __blue_glCore_glVertexAttribFormat +extrn __blue_glCore_glCompressedTextureImage1DEXT: qword +bluegl_glCompressedTextureImage1DEXT proc + mov r11, __blue_glCore_glCompressedTextureImage1DEXT jmp r11 -bluegl_glVertexAttribFormat endp +bluegl_glCompressedTextureImage1DEXT endp -extrn __blue_glCore_glConservativeRasterParameterfNV: qword -bluegl_glConservativeRasterParameterfNV proc - mov r11, __blue_glCore_glConservativeRasterParameterfNV +extrn __blue_glCore_glCompressedTextureSubImage3DEXT: qword +bluegl_glCompressedTextureSubImage3DEXT proc + mov r11, __blue_glCore_glCompressedTextureSubImage3DEXT jmp r11 -bluegl_glConservativeRasterParameterfNV endp +bluegl_glCompressedTextureSubImage3DEXT endp -extrn __blue_glCore_glGetVertexAttribIuivEXT: qword -bluegl_glGetVertexAttribIuivEXT proc - mov r11, __blue_glCore_glGetVertexAttribIuivEXT +extrn __blue_glCore_glCompressedTextureSubImage2DEXT: qword +bluegl_glCompressedTextureSubImage2DEXT proc + mov r11, __blue_glCore_glCompressedTextureSubImage2DEXT jmp r11 -bluegl_glGetVertexAttribIuivEXT endp +bluegl_glCompressedTextureSubImage2DEXT endp -extrn __blue_glCore_glBindMultiTextureEXT: qword -bluegl_glBindMultiTextureEXT proc - mov r11, __blue_glCore_glBindMultiTextureEXT +extrn __blue_glCore_glCompressedTextureSubImage1DEXT: qword +bluegl_glCompressedTextureSubImage1DEXT proc + mov r11, __blue_glCore_glCompressedTextureSubImage1DEXT jmp r11 -bluegl_glBindMultiTextureEXT endp +bluegl_glCompressedTextureSubImage1DEXT endp -extrn __blue_glCore_glMapControlPointsNV: qword -bluegl_glMapControlPointsNV proc - mov r11, __blue_glCore_glMapControlPointsNV +extrn __blue_glCore_glGetCompressedTextureImageEXT: qword +bluegl_glGetCompressedTextureImageEXT proc + mov r11, __blue_glCore_glGetCompressedTextureImageEXT jmp r11 -bluegl_glMapControlPointsNV endp +bluegl_glGetCompressedTextureImageEXT endp -extrn __blue_glCore_glVertexAttrib4Nsv: qword -bluegl_glVertexAttrib4Nsv proc - mov r11, __blue_glCore_glVertexAttrib4Nsv +extrn __blue_glCore_glCompressedMultiTexImage3DEXT: qword +bluegl_glCompressedMultiTexImage3DEXT proc + mov r11, __blue_glCore_glCompressedMultiTexImage3DEXT jmp r11 -bluegl_glVertexAttrib4Nsv endp +bluegl_glCompressedMultiTexImage3DEXT endp extrn __blue_glCore_glCompressedMultiTexImage2DEXT: qword bluegl_glCompressedMultiTexImage2DEXT proc @@ -9579,1025 +9547,1043 @@ bluegl_glCompressedMultiTexImage2DEXT proc jmp r11 bluegl_glCompressedMultiTexImage2DEXT endp -extrn __blue_glCore_glIsNamedBufferResidentNV: qword -bluegl_glIsNamedBufferResidentNV proc - mov r11, __blue_glCore_glIsNamedBufferResidentNV +extrn __blue_glCore_glCompressedMultiTexImage1DEXT: qword +bluegl_glCompressedMultiTexImage1DEXT proc + mov r11, __blue_glCore_glCompressedMultiTexImage1DEXT jmp r11 -bluegl_glIsNamedBufferResidentNV endp +bluegl_glCompressedMultiTexImage1DEXT endp -extrn __blue_glCore_glLoadProgramNV: qword -bluegl_glLoadProgramNV proc - mov r11, __blue_glCore_glLoadProgramNV +extrn __blue_glCore_glCompressedMultiTexSubImage3DEXT: qword +bluegl_glCompressedMultiTexSubImage3DEXT proc + mov r11, __blue_glCore_glCompressedMultiTexSubImage3DEXT jmp r11 -bluegl_glLoadProgramNV endp +bluegl_glCompressedMultiTexSubImage3DEXT endp -extrn __blue_glCore_glClearColor: qword -bluegl_glClearColor proc - mov r11, __blue_glCore_glClearColor +extrn __blue_glCore_glCompressedMultiTexSubImage2DEXT: qword +bluegl_glCompressedMultiTexSubImage2DEXT proc + mov r11, __blue_glCore_glCompressedMultiTexSubImage2DEXT jmp r11 -bluegl_glClearColor endp +bluegl_glCompressedMultiTexSubImage2DEXT endp -extrn __blue_glCore_glUniform2uivEXT: qword -bluegl_glUniform2uivEXT proc - mov r11, __blue_glCore_glUniform2uivEXT +extrn __blue_glCore_glCompressedMultiTexSubImage1DEXT: qword +bluegl_glCompressedMultiTexSubImage1DEXT proc + mov r11, __blue_glCore_glCompressedMultiTexSubImage1DEXT jmp r11 -bluegl_glUniform2uivEXT endp +bluegl_glCompressedMultiTexSubImage1DEXT endp -extrn __blue_glCore_glMultiTexGenfEXT: qword -bluegl_glMultiTexGenfEXT proc - mov r11, __blue_glCore_glMultiTexGenfEXT +extrn __blue_glCore_glGetCompressedMultiTexImageEXT: qword +bluegl_glGetCompressedMultiTexImageEXT proc + mov r11, __blue_glCore_glGetCompressedMultiTexImageEXT jmp r11 -bluegl_glMultiTexGenfEXT endp +bluegl_glGetCompressedMultiTexImageEXT endp -extrn __blue_glCore_glGetUniformdv: qword -bluegl_glGetUniformdv proc - mov r11, __blue_glCore_glGetUniformdv +extrn __blue_glCore_glMatrixLoadTransposefEXT: qword +bluegl_glMatrixLoadTransposefEXT proc + mov r11, __blue_glCore_glMatrixLoadTransposefEXT jmp r11 -bluegl_glGetUniformdv endp +bluegl_glMatrixLoadTransposefEXT endp -extrn __blue_glCore_glGenRenderbuffersEXT: qword -bluegl_glGenRenderbuffersEXT proc - mov r11, __blue_glCore_glGenRenderbuffersEXT +extrn __blue_glCore_glMatrixLoadTransposedEXT: qword +bluegl_glMatrixLoadTransposedEXT proc + mov r11, __blue_glCore_glMatrixLoadTransposedEXT jmp r11 -bluegl_glGenRenderbuffersEXT endp +bluegl_glMatrixLoadTransposedEXT endp -extrn __blue_glCore_glGetMultisamplefv: qword -bluegl_glGetMultisamplefv proc - mov r11, __blue_glCore_glGetMultisamplefv +extrn __blue_glCore_glMatrixMultTransposefEXT: qword +bluegl_glMatrixMultTransposefEXT proc + mov r11, __blue_glCore_glMatrixMultTransposefEXT jmp r11 -bluegl_glGetMultisamplefv endp +bluegl_glMatrixMultTransposefEXT endp -extrn __blue_glCore_glMapNamedBuffer: qword -bluegl_glMapNamedBuffer proc - mov r11, __blue_glCore_glMapNamedBuffer +extrn __blue_glCore_glMatrixMultTransposedEXT: qword +bluegl_glMatrixMultTransposedEXT proc + mov r11, __blue_glCore_glMatrixMultTransposedEXT jmp r11 -bluegl_glMapNamedBuffer endp +bluegl_glMatrixMultTransposedEXT endp -extrn __blue_glCore_glDeleteFramebuffersEXT: qword -bluegl_glDeleteFramebuffersEXT proc - mov r11, __blue_glCore_glDeleteFramebuffersEXT +extrn __blue_glCore_glNamedBufferDataEXT: qword +bluegl_glNamedBufferDataEXT proc + mov r11, __blue_glCore_glNamedBufferDataEXT jmp r11 -bluegl_glDeleteFramebuffersEXT endp +bluegl_glNamedBufferDataEXT endp -extrn __blue_glCore_glVertexAttribI4usvEXT: qword -bluegl_glVertexAttribI4usvEXT proc - mov r11, __blue_glCore_glVertexAttribI4usvEXT +extrn __blue_glCore_glNamedBufferSubDataEXT: qword +bluegl_glNamedBufferSubDataEXT proc + mov r11, __blue_glCore_glNamedBufferSubDataEXT jmp r11 -bluegl_glVertexAttribI4usvEXT endp +bluegl_glNamedBufferSubDataEXT endp -extrn __blue_glCore_glSecondaryColor3hNV: qword -bluegl_glSecondaryColor3hNV proc - mov r11, __blue_glCore_glSecondaryColor3hNV +extrn __blue_glCore_glMapNamedBufferEXT: qword +bluegl_glMapNamedBufferEXT proc + mov r11, __blue_glCore_glMapNamedBufferEXT jmp r11 -bluegl_glSecondaryColor3hNV endp +bluegl_glMapNamedBufferEXT endp -extrn __blue_glCore_glGenerateMipmap: qword -bluegl_glGenerateMipmap proc - mov r11, __blue_glCore_glGenerateMipmap +extrn __blue_glCore_glUnmapNamedBufferEXT: qword +bluegl_glUnmapNamedBufferEXT proc + mov r11, __blue_glCore_glUnmapNamedBufferEXT jmp r11 -bluegl_glGenerateMipmap endp +bluegl_glUnmapNamedBufferEXT endp -extrn __blue_glCore_glProgramEnvParameterI4uivNV: qword -bluegl_glProgramEnvParameterI4uivNV proc - mov r11, __blue_glCore_glProgramEnvParameterI4uivNV +extrn __blue_glCore_glGetNamedBufferParameterivEXT: qword +bluegl_glGetNamedBufferParameterivEXT proc + mov r11, __blue_glCore_glGetNamedBufferParameterivEXT jmp r11 -bluegl_glProgramEnvParameterI4uivNV endp +bluegl_glGetNamedBufferParameterivEXT endp -extrn __blue_glCore_glSeparableFilter2D: qword -bluegl_glSeparableFilter2D proc - mov r11, __blue_glCore_glSeparableFilter2D +extrn __blue_glCore_glGetNamedBufferPointervEXT: qword +bluegl_glGetNamedBufferPointervEXT proc + mov r11, __blue_glCore_glGetNamedBufferPointervEXT jmp r11 -bluegl_glSeparableFilter2D endp +bluegl_glGetNamedBufferPointervEXT endp -extrn __blue_glCore_glFogCoorddEXT: qword -bluegl_glFogCoorddEXT proc - mov r11, __blue_glCore_glFogCoorddEXT +extrn __blue_glCore_glGetNamedBufferSubDataEXT: qword +bluegl_glGetNamedBufferSubDataEXT proc + mov r11, __blue_glCore_glGetNamedBufferSubDataEXT jmp r11 -bluegl_glFogCoorddEXT endp +bluegl_glGetNamedBufferSubDataEXT endp -extrn __blue_glCore_glGetPerfCounterInfoINTEL: qword -bluegl_glGetPerfCounterInfoINTEL proc - mov r11, __blue_glCore_glGetPerfCounterInfoINTEL +extrn __blue_glCore_glProgramUniform1fEXT: qword +bluegl_glProgramUniform1fEXT proc + mov r11, __blue_glCore_glProgramUniform1fEXT jmp r11 -bluegl_glGetPerfCounterInfoINTEL endp +bluegl_glProgramUniform1fEXT endp -extrn __blue_glCore_glUniform4uiv: qword -bluegl_glUniform4uiv proc - mov r11, __blue_glCore_glUniform4uiv +extrn __blue_glCore_glProgramUniform2fEXT: qword +bluegl_glProgramUniform2fEXT proc + mov r11, __blue_glCore_glProgramUniform2fEXT jmp r11 -bluegl_glUniform4uiv endp +bluegl_glProgramUniform2fEXT endp -extrn __blue_glCore_glVertexAttribL2dv: qword -bluegl_glVertexAttribL2dv proc - mov r11, __blue_glCore_glVertexAttribL2dv +extrn __blue_glCore_glProgramUniform3fEXT: qword +bluegl_glProgramUniform3fEXT proc + mov r11, __blue_glCore_glProgramUniform3fEXT jmp r11 -bluegl_glVertexAttribL2dv endp +bluegl_glProgramUniform3fEXT endp -extrn __blue_glCore_glUniform1dv: qword -bluegl_glUniform1dv proc - mov r11, __blue_glCore_glUniform1dv +extrn __blue_glCore_glProgramUniform4fEXT: qword +bluegl_glProgramUniform4fEXT proc + mov r11, __blue_glCore_glProgramUniform4fEXT jmp r11 -bluegl_glUniform1dv endp +bluegl_glProgramUniform4fEXT endp -extrn __blue_glCore_glVertexAttribL1ui64ARB: qword -bluegl_glVertexAttribL1ui64ARB proc - mov r11, __blue_glCore_glVertexAttribL1ui64ARB +extrn __blue_glCore_glProgramUniform1iEXT: qword +bluegl_glProgramUniform1iEXT proc + mov r11, __blue_glCore_glProgramUniform1iEXT jmp r11 -bluegl_glVertexAttribL1ui64ARB endp +bluegl_glProgramUniform1iEXT endp + +extrn __blue_glCore_glProgramUniform2iEXT: qword +bluegl_glProgramUniform2iEXT proc + mov r11, __blue_glCore_glProgramUniform2iEXT + jmp r11 +bluegl_glProgramUniform2iEXT endp + +extrn __blue_glCore_glProgramUniform3iEXT: qword +bluegl_glProgramUniform3iEXT proc + mov r11, __blue_glCore_glProgramUniform3iEXT + jmp r11 +bluegl_glProgramUniform3iEXT endp + +extrn __blue_glCore_glProgramUniform4iEXT: qword +bluegl_glProgramUniform4iEXT proc + mov r11, __blue_glCore_glProgramUniform4iEXT + jmp r11 +bluegl_glProgramUniform4iEXT endp -extrn __blue_glCore_glEndPerfQueryINTEL: qword -bluegl_glEndPerfQueryINTEL proc - mov r11, __blue_glCore_glEndPerfQueryINTEL +extrn __blue_glCore_glProgramUniform1fvEXT: qword +bluegl_glProgramUniform1fvEXT proc + mov r11, __blue_glCore_glProgramUniform1fvEXT jmp r11 -bluegl_glEndPerfQueryINTEL endp +bluegl_glProgramUniform1fvEXT endp -extrn __blue_glCore_glVertexArrayEdgeFlagOffsetEXT: qword -bluegl_glVertexArrayEdgeFlagOffsetEXT proc - mov r11, __blue_glCore_glVertexArrayEdgeFlagOffsetEXT +extrn __blue_glCore_glProgramUniform2fvEXT: qword +bluegl_glProgramUniform2fvEXT proc + mov r11, __blue_glCore_glProgramUniform2fvEXT jmp r11 -bluegl_glVertexArrayEdgeFlagOffsetEXT endp +bluegl_glProgramUniform2fvEXT endp -extrn __blue_glCore_glVertexAttrib1dv: qword -bluegl_glVertexAttrib1dv proc - mov r11, __blue_glCore_glVertexAttrib1dv +extrn __blue_glCore_glProgramUniform3fvEXT: qword +bluegl_glProgramUniform3fvEXT proc + mov r11, __blue_glCore_glProgramUniform3fvEXT jmp r11 -bluegl_glVertexAttrib1dv endp +bluegl_glProgramUniform3fvEXT endp -extrn __blue_glCore_glProgramUniformMatrix2dvEXT: qword -bluegl_glProgramUniformMatrix2dvEXT proc - mov r11, __blue_glCore_glProgramUniformMatrix2dvEXT +extrn __blue_glCore_glProgramUniform4fvEXT: qword +bluegl_glProgramUniform4fvEXT proc + mov r11, __blue_glCore_glProgramUniform4fvEXT jmp r11 -bluegl_glProgramUniformMatrix2dvEXT endp +bluegl_glProgramUniform4fvEXT endp -extrn __blue_glCore_glDepthRange: qword -bluegl_glDepthRange proc - mov r11, __blue_glCore_glDepthRange +extrn __blue_glCore_glProgramUniform1ivEXT: qword +bluegl_glProgramUniform1ivEXT proc + mov r11, __blue_glCore_glProgramUniform1ivEXT jmp r11 -bluegl_glDepthRange endp +bluegl_glProgramUniform1ivEXT endp -extrn __blue_glCore_glCombinerParameterfNV: qword -bluegl_glCombinerParameterfNV proc - mov r11, __blue_glCore_glCombinerParameterfNV +extrn __blue_glCore_glProgramUniform2ivEXT: qword +bluegl_glProgramUniform2ivEXT proc + mov r11, __blue_glCore_glProgramUniform2ivEXT jmp r11 -bluegl_glCombinerParameterfNV endp +bluegl_glProgramUniform2ivEXT endp -extrn __blue_glCore_glVariantArrayObjectATI: qword -bluegl_glVariantArrayObjectATI proc - mov r11, __blue_glCore_glVariantArrayObjectATI +extrn __blue_glCore_glProgramUniform3ivEXT: qword +bluegl_glProgramUniform3ivEXT proc + mov r11, __blue_glCore_glProgramUniform3ivEXT jmp r11 -bluegl_glVariantArrayObjectATI endp +bluegl_glProgramUniform3ivEXT endp -extrn __blue_glCore_glDeleteBuffersARB: qword -bluegl_glDeleteBuffersARB proc - mov r11, __blue_glCore_glDeleteBuffersARB +extrn __blue_glCore_glProgramUniform4ivEXT: qword +bluegl_glProgramUniform4ivEXT proc + mov r11, __blue_glCore_glProgramUniform4ivEXT jmp r11 -bluegl_glDeleteBuffersARB endp +bluegl_glProgramUniform4ivEXT endp -extrn __blue_glCore_glFragmentLightiSGIX: qword -bluegl_glFragmentLightiSGIX proc - mov r11, __blue_glCore_glFragmentLightiSGIX +extrn __blue_glCore_glProgramUniformMatrix2fvEXT: qword +bluegl_glProgramUniformMatrix2fvEXT proc + mov r11, __blue_glCore_glProgramUniformMatrix2fvEXT jmp r11 -bluegl_glFragmentLightiSGIX endp +bluegl_glProgramUniformMatrix2fvEXT endp -extrn __blue_glCore_glGetSamplerParameterIiv: qword -bluegl_glGetSamplerParameterIiv proc - mov r11, __blue_glCore_glGetSamplerParameterIiv +extrn __blue_glCore_glProgramUniformMatrix3fvEXT: qword +bluegl_glProgramUniformMatrix3fvEXT proc + mov r11, __blue_glCore_glProgramUniformMatrix3fvEXT jmp r11 -bluegl_glGetSamplerParameterIiv endp +bluegl_glProgramUniformMatrix3fvEXT endp -extrn __blue_glCore_glImportSyncEXT: qword -bluegl_glImportSyncEXT proc - mov r11, __blue_glCore_glImportSyncEXT +extrn __blue_glCore_glProgramUniformMatrix4fvEXT: qword +bluegl_glProgramUniformMatrix4fvEXT proc + mov r11, __blue_glCore_glProgramUniformMatrix4fvEXT jmp r11 -bluegl_glImportSyncEXT endp +bluegl_glProgramUniformMatrix4fvEXT endp -extrn __blue_glCore_glGetVertexAttribivARB: qword -bluegl_glGetVertexAttribivARB proc - mov r11, __blue_glCore_glGetVertexAttribivARB +extrn __blue_glCore_glProgramUniformMatrix2x3fvEXT: qword +bluegl_glProgramUniformMatrix2x3fvEXT proc + mov r11, __blue_glCore_glProgramUniformMatrix2x3fvEXT jmp r11 -bluegl_glGetVertexAttribivARB endp +bluegl_glProgramUniformMatrix2x3fvEXT endp -extrn __blue_glCore_glVertexAttribI2ui: qword -bluegl_glVertexAttribI2ui proc - mov r11, __blue_glCore_glVertexAttribI2ui +extrn __blue_glCore_glProgramUniformMatrix3x2fvEXT: qword +bluegl_glProgramUniformMatrix3x2fvEXT proc + mov r11, __blue_glCore_glProgramUniformMatrix3x2fvEXT jmp r11 -bluegl_glVertexAttribI2ui endp +bluegl_glProgramUniformMatrix3x2fvEXT endp -extrn __blue_glCore_glGetObjectParameterivARB: qword -bluegl_glGetObjectParameterivARB proc - mov r11, __blue_glCore_glGetObjectParameterivARB +extrn __blue_glCore_glProgramUniformMatrix2x4fvEXT: qword +bluegl_glProgramUniformMatrix2x4fvEXT proc + mov r11, __blue_glCore_glProgramUniformMatrix2x4fvEXT jmp r11 -bluegl_glGetObjectParameterivARB endp +bluegl_glProgramUniformMatrix2x4fvEXT endp -extrn __blue_glCore_glEnableClientStateiEXT: qword -bluegl_glEnableClientStateiEXT proc - mov r11, __blue_glCore_glEnableClientStateiEXT +extrn __blue_glCore_glProgramUniformMatrix4x2fvEXT: qword +bluegl_glProgramUniformMatrix4x2fvEXT proc + mov r11, __blue_glCore_glProgramUniformMatrix4x2fvEXT jmp r11 -bluegl_glEnableClientStateiEXT endp +bluegl_glProgramUniformMatrix4x2fvEXT endp -extrn __blue_glCore_glGetnUniformi64vARB: qword -bluegl_glGetnUniformi64vARB proc - mov r11, __blue_glCore_glGetnUniformi64vARB +extrn __blue_glCore_glProgramUniformMatrix3x4fvEXT: qword +bluegl_glProgramUniformMatrix3x4fvEXT proc + mov r11, __blue_glCore_glProgramUniformMatrix3x4fvEXT jmp r11 -bluegl_glGetnUniformi64vARB endp +bluegl_glProgramUniformMatrix3x4fvEXT endp -extrn __blue_glCore_glDeleteFencesAPPLE: qword -bluegl_glDeleteFencesAPPLE proc - mov r11, __blue_glCore_glDeleteFencesAPPLE +extrn __blue_glCore_glProgramUniformMatrix4x3fvEXT: qword +bluegl_glProgramUniformMatrix4x3fvEXT proc + mov r11, __blue_glCore_glProgramUniformMatrix4x3fvEXT jmp r11 -bluegl_glDeleteFencesAPPLE endp +bluegl_glProgramUniformMatrix4x3fvEXT endp -extrn __blue_glCore_glTransformFeedbackBufferRange: qword -bluegl_glTransformFeedbackBufferRange proc - mov r11, __blue_glCore_glTransformFeedbackBufferRange +extrn __blue_glCore_glTextureBufferEXT: qword +bluegl_glTextureBufferEXT proc + mov r11, __blue_glCore_glTextureBufferEXT jmp r11 -bluegl_glTransformFeedbackBufferRange endp +bluegl_glTextureBufferEXT endp -extrn __blue_glCore_glProgramUniform2fvEXT: qword -bluegl_glProgramUniform2fvEXT proc - mov r11, __blue_glCore_glProgramUniform2fvEXT +extrn __blue_glCore_glMultiTexBufferEXT: qword +bluegl_glMultiTexBufferEXT proc + mov r11, __blue_glCore_glMultiTexBufferEXT jmp r11 -bluegl_glProgramUniform2fvEXT endp +bluegl_glMultiTexBufferEXT endp -extrn __blue_glCore_glFramebufferTextureLayerARB: qword -bluegl_glFramebufferTextureLayerARB proc - mov r11, __blue_glCore_glFramebufferTextureLayerARB +extrn __blue_glCore_glTextureParameterIivEXT: qword +bluegl_glTextureParameterIivEXT proc + mov r11, __blue_glCore_glTextureParameterIivEXT jmp r11 -bluegl_glFramebufferTextureLayerARB endp +bluegl_glTextureParameterIivEXT endp -extrn __blue_glCore_glVertexAttribLFormatNV: qword -bluegl_glVertexAttribLFormatNV proc - mov r11, __blue_glCore_glVertexAttribLFormatNV +extrn __blue_glCore_glTextureParameterIuivEXT: qword +bluegl_glTextureParameterIuivEXT proc + mov r11, __blue_glCore_glTextureParameterIuivEXT jmp r11 -bluegl_glVertexAttribLFormatNV endp +bluegl_glTextureParameterIuivEXT endp -extrn __blue_glCore_glVertexAttrib2fvARB: qword -bluegl_glVertexAttrib2fvARB proc - mov r11, __blue_glCore_glVertexAttrib2fvARB +extrn __blue_glCore_glGetTextureParameterIivEXT: qword +bluegl_glGetTextureParameterIivEXT proc + mov r11, __blue_glCore_glGetTextureParameterIivEXT jmp r11 -bluegl_glVertexAttrib2fvARB endp +bluegl_glGetTextureParameterIivEXT endp -extrn __blue_glCore_glWindowPos4fvMESA: qword -bluegl_glWindowPos4fvMESA proc - mov r11, __blue_glCore_glWindowPos4fvMESA +extrn __blue_glCore_glGetTextureParameterIuivEXT: qword +bluegl_glGetTextureParameterIuivEXT proc + mov r11, __blue_glCore_glGetTextureParameterIuivEXT jmp r11 -bluegl_glWindowPos4fvMESA endp +bluegl_glGetTextureParameterIuivEXT endp -extrn __blue_glCore_glMakeNamedBufferResidentNV: qword -bluegl_glMakeNamedBufferResidentNV proc - mov r11, __blue_glCore_glMakeNamedBufferResidentNV +extrn __blue_glCore_glMultiTexParameterIivEXT: qword +bluegl_glMultiTexParameterIivEXT proc + mov r11, __blue_glCore_glMultiTexParameterIivEXT jmp r11 -bluegl_glMakeNamedBufferResidentNV endp +bluegl_glMultiTexParameterIivEXT endp -extrn __blue_glCore_glProgramUniformMatrix3x4fvEXT: qword -bluegl_glProgramUniformMatrix3x4fvEXT proc - mov r11, __blue_glCore_glProgramUniformMatrix3x4fvEXT +extrn __blue_glCore_glMultiTexParameterIuivEXT: qword +bluegl_glMultiTexParameterIuivEXT proc + mov r11, __blue_glCore_glMultiTexParameterIuivEXT jmp r11 -bluegl_glProgramUniformMatrix3x4fvEXT endp +bluegl_glMultiTexParameterIuivEXT endp -extrn __blue_glCore_glSamplePatternSGIS: qword -bluegl_glSamplePatternSGIS proc - mov r11, __blue_glCore_glSamplePatternSGIS +extrn __blue_glCore_glGetMultiTexParameterIivEXT: qword +bluegl_glGetMultiTexParameterIivEXT proc + mov r11, __blue_glCore_glGetMultiTexParameterIivEXT jmp r11 -bluegl_glSamplePatternSGIS endp +bluegl_glGetMultiTexParameterIivEXT endp -extrn __blue_glCore_glVDPAUGetSurfaceivNV: qword -bluegl_glVDPAUGetSurfaceivNV proc - mov r11, __blue_glCore_glVDPAUGetSurfaceivNV +extrn __blue_glCore_glGetMultiTexParameterIuivEXT: qword +bluegl_glGetMultiTexParameterIuivEXT proc + mov r11, __blue_glCore_glGetMultiTexParameterIuivEXT jmp r11 -bluegl_glVDPAUGetSurfaceivNV endp +bluegl_glGetMultiTexParameterIuivEXT endp -extrn __blue_glCore_glProgramUniformMatrix4x2fvEXT: qword -bluegl_glProgramUniformMatrix4x2fvEXT proc - mov r11, __blue_glCore_glProgramUniformMatrix4x2fvEXT +extrn __blue_glCore_glProgramUniform1uiEXT: qword +bluegl_glProgramUniform1uiEXT proc + mov r11, __blue_glCore_glProgramUniform1uiEXT jmp r11 -bluegl_glProgramUniformMatrix4x2fvEXT endp +bluegl_glProgramUniform1uiEXT endp -extrn __blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN: qword -bluegl_glReplacementCodeuiColor3fVertex3fvSUN proc - mov r11, __blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN +extrn __blue_glCore_glProgramUniform2uiEXT: qword +bluegl_glProgramUniform2uiEXT proc + mov r11, __blue_glCore_glProgramUniform2uiEXT jmp r11 -bluegl_glReplacementCodeuiColor3fVertex3fvSUN endp +bluegl_glProgramUniform2uiEXT endp -extrn __blue_glCore_glWindowPos3sMESA: qword -bluegl_glWindowPos3sMESA proc - mov r11, __blue_glCore_glWindowPos3sMESA +extrn __blue_glCore_glProgramUniform3uiEXT: qword +bluegl_glProgramUniform3uiEXT proc + mov r11, __blue_glCore_glProgramUniform3uiEXT jmp r11 -bluegl_glWindowPos3sMESA endp +bluegl_glProgramUniform3uiEXT endp -extrn __blue_glCore_glTexGenxOES: qword -bluegl_glTexGenxOES proc - mov r11, __blue_glCore_glTexGenxOES +extrn __blue_glCore_glProgramUniform4uiEXT: qword +bluegl_glProgramUniform4uiEXT proc + mov r11, __blue_glCore_glProgramUniform4uiEXT jmp r11 -bluegl_glTexGenxOES endp +bluegl_glProgramUniform4uiEXT endp -extrn __blue_glCore_glVertexAttrib4dNV: qword -bluegl_glVertexAttrib4dNV proc - mov r11, __blue_glCore_glVertexAttrib4dNV +extrn __blue_glCore_glProgramUniform1uivEXT: qword +bluegl_glProgramUniform1uivEXT proc + mov r11, __blue_glCore_glProgramUniform1uivEXT jmp r11 -bluegl_glVertexAttrib4dNV endp +bluegl_glProgramUniform1uivEXT endp -extrn __blue_glCore_glTangentPointerEXT: qword -bluegl_glTangentPointerEXT proc - mov r11, __blue_glCore_glTangentPointerEXT +extrn __blue_glCore_glProgramUniform2uivEXT: qword +bluegl_glProgramUniform2uivEXT proc + mov r11, __blue_glCore_glProgramUniform2uivEXT jmp r11 -bluegl_glTangentPointerEXT endp +bluegl_glProgramUniform2uivEXT endp -extrn __blue_glCore_glPixelTransformParameterfvEXT: qword -bluegl_glPixelTransformParameterfvEXT proc - mov r11, __blue_glCore_glPixelTransformParameterfvEXT +extrn __blue_glCore_glProgramUniform3uivEXT: qword +bluegl_glProgramUniform3uivEXT proc + mov r11, __blue_glCore_glProgramUniform3uivEXT jmp r11 -bluegl_glPixelTransformParameterfvEXT endp +bluegl_glProgramUniform3uivEXT endp -extrn __blue_glCore_glProgramUniform1i: qword -bluegl_glProgramUniform1i proc - mov r11, __blue_glCore_glProgramUniform1i +extrn __blue_glCore_glProgramUniform4uivEXT: qword +bluegl_glProgramUniform4uivEXT proc + mov r11, __blue_glCore_glProgramUniform4uivEXT jmp r11 -bluegl_glProgramUniform1i endp +bluegl_glProgramUniform4uivEXT endp -extrn __blue_glCore_glMultiTexCoord2bOES: qword -bluegl_glMultiTexCoord2bOES proc - mov r11, __blue_glCore_glMultiTexCoord2bOES +extrn __blue_glCore_glNamedProgramLocalParameters4fvEXT: qword +bluegl_glNamedProgramLocalParameters4fvEXT proc + mov r11, __blue_glCore_glNamedProgramLocalParameters4fvEXT jmp r11 -bluegl_glMultiTexCoord2bOES endp +bluegl_glNamedProgramLocalParameters4fvEXT endp -extrn __blue_glCore_glVertexAttribI2iv: qword -bluegl_glVertexAttribI2iv proc - mov r11, __blue_glCore_glVertexAttribI2iv +extrn __blue_glCore_glNamedProgramLocalParameterI4iEXT: qword +bluegl_glNamedProgramLocalParameterI4iEXT proc + mov r11, __blue_glCore_glNamedProgramLocalParameterI4iEXT jmp r11 -bluegl_glVertexAttribI2iv endp +bluegl_glNamedProgramLocalParameterI4iEXT endp -extrn __blue_glCore_glWindowPos4iMESA: qword -bluegl_glWindowPos4iMESA proc - mov r11, __blue_glCore_glWindowPos4iMESA +extrn __blue_glCore_glNamedProgramLocalParameterI4ivEXT: qword +bluegl_glNamedProgramLocalParameterI4ivEXT proc + mov r11, __blue_glCore_glNamedProgramLocalParameterI4ivEXT jmp r11 -bluegl_glWindowPos4iMESA endp +bluegl_glNamedProgramLocalParameterI4ivEXT endp -extrn __blue_glCore_glTestFenceNV: qword -bluegl_glTestFenceNV proc - mov r11, __blue_glCore_glTestFenceNV +extrn __blue_glCore_glNamedProgramLocalParametersI4ivEXT: qword +bluegl_glNamedProgramLocalParametersI4ivEXT proc + mov r11, __blue_glCore_glNamedProgramLocalParametersI4ivEXT jmp r11 -bluegl_glTestFenceNV endp +bluegl_glNamedProgramLocalParametersI4ivEXT endp -extrn __blue_glCore_glDispatchComputeGroupSizeARB: qword -bluegl_glDispatchComputeGroupSizeARB proc - mov r11, __blue_glCore_glDispatchComputeGroupSizeARB +extrn __blue_glCore_glNamedProgramLocalParameterI4uiEXT: qword +bluegl_glNamedProgramLocalParameterI4uiEXT proc + mov r11, __blue_glCore_glNamedProgramLocalParameterI4uiEXT jmp r11 -bluegl_glDispatchComputeGroupSizeARB endp +bluegl_glNamedProgramLocalParameterI4uiEXT endp -extrn __blue_glCore_glShaderOp3EXT: qword -bluegl_glShaderOp3EXT proc - mov r11, __blue_glCore_glShaderOp3EXT +extrn __blue_glCore_glNamedProgramLocalParameterI4uivEXT: qword +bluegl_glNamedProgramLocalParameterI4uivEXT proc + mov r11, __blue_glCore_glNamedProgramLocalParameterI4uivEXT jmp r11 -bluegl_glShaderOp3EXT endp +bluegl_glNamedProgramLocalParameterI4uivEXT endp -extrn __blue_glCore_glSampleMaskSGIS: qword -bluegl_glSampleMaskSGIS proc - mov r11, __blue_glCore_glSampleMaskSGIS +extrn __blue_glCore_glNamedProgramLocalParametersI4uivEXT: qword +bluegl_glNamedProgramLocalParametersI4uivEXT proc + mov r11, __blue_glCore_glNamedProgramLocalParametersI4uivEXT jmp r11 -bluegl_glSampleMaskSGIS endp +bluegl_glNamedProgramLocalParametersI4uivEXT endp -extrn __blue_glCore_glMultiTexParameterivEXT: qword -bluegl_glMultiTexParameterivEXT proc - mov r11, __blue_glCore_glMultiTexParameterivEXT +extrn __blue_glCore_glGetNamedProgramLocalParameterIivEXT: qword +bluegl_glGetNamedProgramLocalParameterIivEXT proc + mov r11, __blue_glCore_glGetNamedProgramLocalParameterIivEXT jmp r11 -bluegl_glMultiTexParameterivEXT endp +bluegl_glGetNamedProgramLocalParameterIivEXT endp -extrn __blue_glCore_glGetnMinmax: qword -bluegl_glGetnMinmax proc - mov r11, __blue_glCore_glGetnMinmax +extrn __blue_glCore_glGetNamedProgramLocalParameterIuivEXT: qword +bluegl_glGetNamedProgramLocalParameterIuivEXT proc + mov r11, __blue_glCore_glGetNamedProgramLocalParameterIuivEXT jmp r11 -bluegl_glGetnMinmax endp +bluegl_glGetNamedProgramLocalParameterIuivEXT endp -extrn __blue_glCore_glColorP3ui: qword -bluegl_glColorP3ui proc - mov r11, __blue_glCore_glColorP3ui +extrn __blue_glCore_glEnableClientStateiEXT: qword +bluegl_glEnableClientStateiEXT proc + mov r11, __blue_glCore_glEnableClientStateiEXT jmp r11 -bluegl_glColorP3ui endp +bluegl_glEnableClientStateiEXT endp -extrn __blue_glCore_glBeginQueryARB: qword -bluegl_glBeginQueryARB proc - mov r11, __blue_glCore_glBeginQueryARB +extrn __blue_glCore_glDisableClientStateiEXT: qword +bluegl_glDisableClientStateiEXT proc + mov r11, __blue_glCore_glDisableClientStateiEXT jmp r11 -bluegl_glBeginQueryARB endp +bluegl_glDisableClientStateiEXT endp -extrn __blue_glCore_glMultiDrawArraysIndirectAMD: qword -bluegl_glMultiDrawArraysIndirectAMD proc - mov r11, __blue_glCore_glMultiDrawArraysIndirectAMD +extrn __blue_glCore_glGetFloati_vEXT: qword +bluegl_glGetFloati_vEXT proc + mov r11, __blue_glCore_glGetFloati_vEXT jmp r11 -bluegl_glMultiDrawArraysIndirectAMD endp +bluegl_glGetFloati_vEXT endp -extrn __blue_glCore_glRasterPos4xOES: qword -bluegl_glRasterPos4xOES proc - mov r11, __blue_glCore_glRasterPos4xOES +extrn __blue_glCore_glGetDoublei_vEXT: qword +bluegl_glGetDoublei_vEXT proc + mov r11, __blue_glCore_glGetDoublei_vEXT jmp r11 -bluegl_glRasterPos4xOES endp +bluegl_glGetDoublei_vEXT endp -extrn __blue_glCore_glFogCoordPointer: qword -bluegl_glFogCoordPointer proc - mov r11, __blue_glCore_glFogCoordPointer +extrn __blue_glCore_glGetPointeri_vEXT: qword +bluegl_glGetPointeri_vEXT proc + mov r11, __blue_glCore_glGetPointeri_vEXT jmp r11 -bluegl_glFogCoordPointer endp +bluegl_glGetPointeri_vEXT endp -extrn __blue_glCore_glTextureLightEXT: qword -bluegl_glTextureLightEXT proc - mov r11, __blue_glCore_glTextureLightEXT +extrn __blue_glCore_glNamedProgramStringEXT: qword +bluegl_glNamedProgramStringEXT proc + mov r11, __blue_glCore_glNamedProgramStringEXT jmp r11 -bluegl_glTextureLightEXT endp +bluegl_glNamedProgramStringEXT endp -extrn __blue_glCore_glGetCombinerInputParameterfvNV: qword -bluegl_glGetCombinerInputParameterfvNV proc - mov r11, __blue_glCore_glGetCombinerInputParameterfvNV +extrn __blue_glCore_glNamedProgramLocalParameter4dEXT: qword +bluegl_glNamedProgramLocalParameter4dEXT proc + mov r11, __blue_glCore_glNamedProgramLocalParameter4dEXT jmp r11 -bluegl_glGetCombinerInputParameterfvNV endp +bluegl_glNamedProgramLocalParameter4dEXT endp -extrn __blue_glCore_glDeleteFragmentShaderATI: qword -bluegl_glDeleteFragmentShaderATI proc - mov r11, __blue_glCore_glDeleteFragmentShaderATI +extrn __blue_glCore_glNamedProgramLocalParameter4dvEXT: qword +bluegl_glNamedProgramLocalParameter4dvEXT proc + mov r11, __blue_glCore_glNamedProgramLocalParameter4dvEXT jmp r11 -bluegl_glDeleteFragmentShaderATI endp +bluegl_glNamedProgramLocalParameter4dvEXT endp -extrn __blue_glCore_glMultiTexCoord2sv: qword -bluegl_glMultiTexCoord2sv proc - mov r11, __blue_glCore_glMultiTexCoord2sv +extrn __blue_glCore_glNamedProgramLocalParameter4fEXT: qword +bluegl_glNamedProgramLocalParameter4fEXT proc + mov r11, __blue_glCore_glNamedProgramLocalParameter4fEXT jmp r11 -bluegl_glMultiTexCoord2sv endp +bluegl_glNamedProgramLocalParameter4fEXT endp -extrn __blue_glCore_glMultiTexCoord2s: qword -bluegl_glMultiTexCoord2s proc - mov r11, __blue_glCore_glMultiTexCoord2s +extrn __blue_glCore_glNamedProgramLocalParameter4fvEXT: qword +bluegl_glNamedProgramLocalParameter4fvEXT proc + mov r11, __blue_glCore_glNamedProgramLocalParameter4fvEXT jmp r11 -bluegl_glMultiTexCoord2s endp +bluegl_glNamedProgramLocalParameter4fvEXT endp -extrn __blue_glCore_glLightModelxvOES: qword -bluegl_glLightModelxvOES proc - mov r11, __blue_glCore_glLightModelxvOES +extrn __blue_glCore_glGetNamedProgramLocalParameterdvEXT: qword +bluegl_glGetNamedProgramLocalParameterdvEXT proc + mov r11, __blue_glCore_glGetNamedProgramLocalParameterdvEXT jmp r11 -bluegl_glLightModelxvOES endp +bluegl_glGetNamedProgramLocalParameterdvEXT endp -extrn __blue_glCore_glTessellationFactorAMD: qword -bluegl_glTessellationFactorAMD proc - mov r11, __blue_glCore_glTessellationFactorAMD +extrn __blue_glCore_glGetNamedProgramLocalParameterfvEXT: qword +bluegl_glGetNamedProgramLocalParameterfvEXT proc + mov r11, __blue_glCore_glGetNamedProgramLocalParameterfvEXT jmp r11 -bluegl_glTessellationFactorAMD endp +bluegl_glGetNamedProgramLocalParameterfvEXT endp -extrn __blue_glCore_glVariantivEXT: qword -bluegl_glVariantivEXT proc - mov r11, __blue_glCore_glVariantivEXT +extrn __blue_glCore_glGetNamedProgramivEXT: qword +bluegl_glGetNamedProgramivEXT proc + mov r11, __blue_glCore_glGetNamedProgramivEXT jmp r11 -bluegl_glVariantivEXT endp +bluegl_glGetNamedProgramivEXT endp -extrn __blue_glCore_glNamedFramebufferRenderbuffer: qword -bluegl_glNamedFramebufferRenderbuffer proc - mov r11, __blue_glCore_glNamedFramebufferRenderbuffer +extrn __blue_glCore_glGetNamedProgramStringEXT: qword +bluegl_glGetNamedProgramStringEXT proc + mov r11, __blue_glCore_glGetNamedProgramStringEXT jmp r11 -bluegl_glNamedFramebufferRenderbuffer endp +bluegl_glGetNamedProgramStringEXT endp -extrn __blue_glCore_glWindowPos2ivARB: qword -bluegl_glWindowPos2ivARB proc - mov r11, __blue_glCore_glWindowPos2ivARB +extrn __blue_glCore_glNamedRenderbufferStorageEXT: qword +bluegl_glNamedRenderbufferStorageEXT proc + mov r11, __blue_glCore_glNamedRenderbufferStorageEXT jmp r11 -bluegl_glWindowPos2ivARB endp +bluegl_glNamedRenderbufferStorageEXT endp -extrn __blue_glCore_glVertexArrayFogCoordOffsetEXT: qword -bluegl_glVertexArrayFogCoordOffsetEXT proc - mov r11, __blue_glCore_glVertexArrayFogCoordOffsetEXT +extrn __blue_glCore_glGetNamedRenderbufferParameterivEXT: qword +bluegl_glGetNamedRenderbufferParameterivEXT proc + mov r11, __blue_glCore_glGetNamedRenderbufferParameterivEXT jmp r11 -bluegl_glVertexArrayFogCoordOffsetEXT endp +bluegl_glGetNamedRenderbufferParameterivEXT endp -extrn __blue_glCore_glUniform2i: qword -bluegl_glUniform2i proc - mov r11, __blue_glCore_glUniform2i +extrn __blue_glCore_glNamedRenderbufferStorageMultisampleEXT: qword +bluegl_glNamedRenderbufferStorageMultisampleEXT proc + mov r11, __blue_glCore_glNamedRenderbufferStorageMultisampleEXT jmp r11 -bluegl_glUniform2i endp +bluegl_glNamedRenderbufferStorageMultisampleEXT endp -extrn __blue_glCore_glGetTexBumpParameterivATI: qword -bluegl_glGetTexBumpParameterivATI proc - mov r11, __blue_glCore_glGetTexBumpParameterivATI +extrn __blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT: qword +bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT proc + mov r11, __blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT jmp r11 -bluegl_glGetTexBumpParameterivATI endp +bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT endp -extrn __blue_glCore_glSamplerParameterIuiv: qword -bluegl_glSamplerParameterIuiv proc - mov r11, __blue_glCore_glSamplerParameterIuiv +extrn __blue_glCore_glCheckNamedFramebufferStatusEXT: qword +bluegl_glCheckNamedFramebufferStatusEXT proc + mov r11, __blue_glCore_glCheckNamedFramebufferStatusEXT jmp r11 -bluegl_glSamplerParameterIuiv endp +bluegl_glCheckNamedFramebufferStatusEXT endp -extrn __blue_glCore_glClearBufferfv: qword -bluegl_glClearBufferfv proc - mov r11, __blue_glCore_glClearBufferfv +extrn __blue_glCore_glNamedFramebufferTexture1DEXT: qword +bluegl_glNamedFramebufferTexture1DEXT proc + mov r11, __blue_glCore_glNamedFramebufferTexture1DEXT jmp r11 -bluegl_glClearBufferfv endp +bluegl_glNamedFramebufferTexture1DEXT endp -extrn __blue_glCore_glBindTextureUnitParameterEXT: qword -bluegl_glBindTextureUnitParameterEXT proc - mov r11, __blue_glCore_glBindTextureUnitParameterEXT +extrn __blue_glCore_glNamedFramebufferTexture2DEXT: qword +bluegl_glNamedFramebufferTexture2DEXT proc + mov r11, __blue_glCore_glNamedFramebufferTexture2DEXT jmp r11 -bluegl_glBindTextureUnitParameterEXT endp +bluegl_glNamedFramebufferTexture2DEXT endp -extrn __blue_glCore_glMultiTexCoord3hNV: qword -bluegl_glMultiTexCoord3hNV proc - mov r11, __blue_glCore_glMultiTexCoord3hNV +extrn __blue_glCore_glNamedFramebufferTexture3DEXT: qword +bluegl_glNamedFramebufferTexture3DEXT proc + mov r11, __blue_glCore_glNamedFramebufferTexture3DEXT jmp r11 -bluegl_glMultiTexCoord3hNV endp +bluegl_glNamedFramebufferTexture3DEXT endp -extrn __blue_glCore_glSecondaryColor3us: qword -bluegl_glSecondaryColor3us proc - mov r11, __blue_glCore_glSecondaryColor3us +extrn __blue_glCore_glNamedFramebufferRenderbufferEXT: qword +bluegl_glNamedFramebufferRenderbufferEXT proc + mov r11, __blue_glCore_glNamedFramebufferRenderbufferEXT jmp r11 -bluegl_glSecondaryColor3us endp +bluegl_glNamedFramebufferRenderbufferEXT endp -extrn __blue_glCore_glReplacementCodeusvSUN: qword -bluegl_glReplacementCodeusvSUN proc - mov r11, __blue_glCore_glReplacementCodeusvSUN +extrn __blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT: qword +bluegl_glGetNamedFramebufferAttachmentParameterivEXT proc + mov r11, __blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT jmp r11 -bluegl_glReplacementCodeusvSUN endp +bluegl_glGetNamedFramebufferAttachmentParameterivEXT endp -extrn __blue_glCore_glSecondaryColor3bvEXT: qword -bluegl_glSecondaryColor3bvEXT proc - mov r11, __blue_glCore_glSecondaryColor3bvEXT +extrn __blue_glCore_glGenerateTextureMipmapEXT: qword +bluegl_glGenerateTextureMipmapEXT proc + mov r11, __blue_glCore_glGenerateTextureMipmapEXT jmp r11 -bluegl_glSecondaryColor3bvEXT endp +bluegl_glGenerateTextureMipmapEXT endp -extrn __blue_glCore_glGetProgramPipelineInfoLog: qword -bluegl_glGetProgramPipelineInfoLog proc - mov r11, __blue_glCore_glGetProgramPipelineInfoLog +extrn __blue_glCore_glGenerateMultiTexMipmapEXT: qword +bluegl_glGenerateMultiTexMipmapEXT proc + mov r11, __blue_glCore_glGenerateMultiTexMipmapEXT jmp r11 -bluegl_glGetProgramPipelineInfoLog endp +bluegl_glGenerateMultiTexMipmapEXT endp -extrn __blue_glCore_glGetVideoi64vNV: qword -bluegl_glGetVideoi64vNV proc - mov r11, __blue_glCore_glGetVideoi64vNV +extrn __blue_glCore_glFramebufferDrawBufferEXT: qword +bluegl_glFramebufferDrawBufferEXT proc + mov r11, __blue_glCore_glFramebufferDrawBufferEXT jmp r11 -bluegl_glGetVideoi64vNV endp +bluegl_glFramebufferDrawBufferEXT endp -extrn __blue_glCore_glMultiTexCoord3iv: qword -bluegl_glMultiTexCoord3iv proc - mov r11, __blue_glCore_glMultiTexCoord3iv +extrn __blue_glCore_glFramebufferDrawBuffersEXT: qword +bluegl_glFramebufferDrawBuffersEXT proc + mov r11, __blue_glCore_glFramebufferDrawBuffersEXT jmp r11 -bluegl_glMultiTexCoord3iv endp +bluegl_glFramebufferDrawBuffersEXT endp -extrn __blue_glCore_glVertexArrayTexCoordOffsetEXT: qword -bluegl_glVertexArrayTexCoordOffsetEXT proc - mov r11, __blue_glCore_glVertexArrayTexCoordOffsetEXT +extrn __blue_glCore_glFramebufferReadBufferEXT: qword +bluegl_glFramebufferReadBufferEXT proc + mov r11, __blue_glCore_glFramebufferReadBufferEXT jmp r11 -bluegl_glVertexArrayTexCoordOffsetEXT endp +bluegl_glFramebufferReadBufferEXT endp -extrn __blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT: qword -bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT proc - mov r11, __blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT +extrn __blue_glCore_glGetFramebufferParameterivEXT: qword +bluegl_glGetFramebufferParameterivEXT proc + mov r11, __blue_glCore_glGetFramebufferParameterivEXT jmp r11 -bluegl_glNamedRenderbufferStorageMultisampleCoverageEXT endp +bluegl_glGetFramebufferParameterivEXT endp -extrn __blue_glCore_glGetSamplerParameterIuiv: qword -bluegl_glGetSamplerParameterIuiv proc - mov r11, __blue_glCore_glGetSamplerParameterIuiv +extrn __blue_glCore_glNamedCopyBufferSubDataEXT: qword +bluegl_glNamedCopyBufferSubDataEXT proc + mov r11, __blue_glCore_glNamedCopyBufferSubDataEXT jmp r11 -bluegl_glGetSamplerParameterIuiv endp +bluegl_glNamedCopyBufferSubDataEXT endp -extrn __blue_glCore_glVertexAttrib2dARB: qword -bluegl_glVertexAttrib2dARB proc - mov r11, __blue_glCore_glVertexAttrib2dARB +extrn __blue_glCore_glNamedFramebufferTextureEXT: qword +bluegl_glNamedFramebufferTextureEXT proc + mov r11, __blue_glCore_glNamedFramebufferTextureEXT jmp r11 -bluegl_glVertexAttrib2dARB endp +bluegl_glNamedFramebufferTextureEXT endp -extrn __blue_glCore_glNormalStream3svATI: qword -bluegl_glNormalStream3svATI proc - mov r11, __blue_glCore_glNormalStream3svATI +extrn __blue_glCore_glNamedFramebufferTextureLayerEXT: qword +bluegl_glNamedFramebufferTextureLayerEXT proc + mov r11, __blue_glCore_glNamedFramebufferTextureLayerEXT jmp r11 -bluegl_glNormalStream3svATI endp +bluegl_glNamedFramebufferTextureLayerEXT endp -extrn __blue_glCore_glClientActiveVertexStreamATI: qword -bluegl_glClientActiveVertexStreamATI proc - mov r11, __blue_glCore_glClientActiveVertexStreamATI +extrn __blue_glCore_glNamedFramebufferTextureFaceEXT: qword +bluegl_glNamedFramebufferTextureFaceEXT proc + mov r11, __blue_glCore_glNamedFramebufferTextureFaceEXT jmp r11 -bluegl_glClientActiveVertexStreamATI endp +bluegl_glNamedFramebufferTextureFaceEXT endp -extrn __blue_glCore_glStencilThenCoverFillPathInstancedNV: qword -bluegl_glStencilThenCoverFillPathInstancedNV proc - mov r11, __blue_glCore_glStencilThenCoverFillPathInstancedNV +extrn __blue_glCore_glTextureRenderbufferEXT: qword +bluegl_glTextureRenderbufferEXT proc + mov r11, __blue_glCore_glTextureRenderbufferEXT jmp r11 -bluegl_glStencilThenCoverFillPathInstancedNV endp +bluegl_glTextureRenderbufferEXT endp -extrn __blue_glCore_glSecondaryColor3uiEXT: qword -bluegl_glSecondaryColor3uiEXT proc - mov r11, __blue_glCore_glSecondaryColor3uiEXT +extrn __blue_glCore_glMultiTexRenderbufferEXT: qword +bluegl_glMultiTexRenderbufferEXT proc + mov r11, __blue_glCore_glMultiTexRenderbufferEXT jmp r11 -bluegl_glSecondaryColor3uiEXT endp +bluegl_glMultiTexRenderbufferEXT endp -extrn __blue_glCore_glTexCoord2hNV: qword -bluegl_glTexCoord2hNV proc - mov r11, __blue_glCore_glTexCoord2hNV +extrn __blue_glCore_glVertexArrayVertexOffsetEXT: qword +bluegl_glVertexArrayVertexOffsetEXT proc + mov r11, __blue_glCore_glVertexArrayVertexOffsetEXT jmp r11 -bluegl_glTexCoord2hNV endp +bluegl_glVertexArrayVertexOffsetEXT endp -extrn __blue_glCore_glVertexAttrib3fARB: qword -bluegl_glVertexAttrib3fARB proc - mov r11, __blue_glCore_glVertexAttrib3fARB +extrn __blue_glCore_glVertexArrayColorOffsetEXT: qword +bluegl_glVertexArrayColorOffsetEXT proc + mov r11, __blue_glCore_glVertexArrayColorOffsetEXT jmp r11 -bluegl_glVertexAttrib3fARB endp +bluegl_glVertexArrayColorOffsetEXT endp -extrn __blue_glCore_glGetQueryBufferObjectui64v: qword -bluegl_glGetQueryBufferObjectui64v proc - mov r11, __blue_glCore_glGetQueryBufferObjectui64v +extrn __blue_glCore_glVertexArrayEdgeFlagOffsetEXT: qword +bluegl_glVertexArrayEdgeFlagOffsetEXT proc + mov r11, __blue_glCore_glVertexArrayEdgeFlagOffsetEXT jmp r11 -bluegl_glGetQueryBufferObjectui64v endp +bluegl_glVertexArrayEdgeFlagOffsetEXT endp -extrn __blue_glCore_glGetMaterialxOES: qword -bluegl_glGetMaterialxOES proc - mov r11, __blue_glCore_glGetMaterialxOES +extrn __blue_glCore_glVertexArrayIndexOffsetEXT: qword +bluegl_glVertexArrayIndexOffsetEXT proc + mov r11, __blue_glCore_glVertexArrayIndexOffsetEXT jmp r11 -bluegl_glGetMaterialxOES endp +bluegl_glVertexArrayIndexOffsetEXT endp -extrn __blue_glCore_glMultiDrawArrays: qword -bluegl_glMultiDrawArrays proc - mov r11, __blue_glCore_glMultiDrawArrays +extrn __blue_glCore_glVertexArrayNormalOffsetEXT: qword +bluegl_glVertexArrayNormalOffsetEXT proc + mov r11, __blue_glCore_glVertexArrayNormalOffsetEXT jmp r11 -bluegl_glMultiDrawArrays endp +bluegl_glVertexArrayNormalOffsetEXT endp -extrn __blue_glCore_glSecondaryColor3iEXT: qword -bluegl_glSecondaryColor3iEXT proc - mov r11, __blue_glCore_glSecondaryColor3iEXT +extrn __blue_glCore_glVertexArrayTexCoordOffsetEXT: qword +bluegl_glVertexArrayTexCoordOffsetEXT proc + mov r11, __blue_glCore_glVertexArrayTexCoordOffsetEXT jmp r11 -bluegl_glSecondaryColor3iEXT endp +bluegl_glVertexArrayTexCoordOffsetEXT endp -extrn __blue_glCore_glProgramUniform2ui64NV: qword -bluegl_glProgramUniform2ui64NV proc - mov r11, __blue_glCore_glProgramUniform2ui64NV +extrn __blue_glCore_glVertexArrayMultiTexCoordOffsetEXT: qword +bluegl_glVertexArrayMultiTexCoordOffsetEXT proc + mov r11, __blue_glCore_glVertexArrayMultiTexCoordOffsetEXT jmp r11 -bluegl_glProgramUniform2ui64NV endp +bluegl_glVertexArrayMultiTexCoordOffsetEXT endp -extrn __blue_glCore_glDeleteQueries: qword -bluegl_glDeleteQueries proc - mov r11, __blue_glCore_glDeleteQueries +extrn __blue_glCore_glVertexArrayFogCoordOffsetEXT: qword +bluegl_glVertexArrayFogCoordOffsetEXT proc + mov r11, __blue_glCore_glVertexArrayFogCoordOffsetEXT jmp r11 -bluegl_glDeleteQueries endp +bluegl_glVertexArrayFogCoordOffsetEXT endp -extrn __blue_glCore_glDeleteRenderbuffers: qword -bluegl_glDeleteRenderbuffers proc - mov r11, __blue_glCore_glDeleteRenderbuffers +extrn __blue_glCore_glVertexArraySecondaryColorOffsetEXT: qword +bluegl_glVertexArraySecondaryColorOffsetEXT proc + mov r11, __blue_glCore_glVertexArraySecondaryColorOffsetEXT jmp r11 -bluegl_glDeleteRenderbuffers endp +bluegl_glVertexArraySecondaryColorOffsetEXT endp -extrn __blue_glCore_glGetProgramLocalParameterdvARB: qword -bluegl_glGetProgramLocalParameterdvARB proc - mov r11, __blue_glCore_glGetProgramLocalParameterdvARB +extrn __blue_glCore_glVertexArrayVertexAttribOffsetEXT: qword +bluegl_glVertexArrayVertexAttribOffsetEXT proc + mov r11, __blue_glCore_glVertexArrayVertexAttribOffsetEXT jmp r11 -bluegl_glGetProgramLocalParameterdvARB endp +bluegl_glVertexArrayVertexAttribOffsetEXT endp -extrn __blue_glCore_glTexCoord2xOES: qword -bluegl_glTexCoord2xOES proc - mov r11, __blue_glCore_glTexCoord2xOES +extrn __blue_glCore_glVertexArrayVertexAttribIOffsetEXT: qword +bluegl_glVertexArrayVertexAttribIOffsetEXT proc + mov r11, __blue_glCore_glVertexArrayVertexAttribIOffsetEXT jmp r11 -bluegl_glTexCoord2xOES endp +bluegl_glVertexArrayVertexAttribIOffsetEXT endp -extrn __blue_glCore_glBindBuffer: qword -bluegl_glBindBuffer proc - mov r11, __blue_glCore_glBindBuffer +extrn __blue_glCore_glEnableVertexArrayEXT: qword +bluegl_glEnableVertexArrayEXT proc + mov r11, __blue_glCore_glEnableVertexArrayEXT jmp r11 -bluegl_glBindBuffer endp +bluegl_glEnableVertexArrayEXT endp -extrn __blue_glCore_glResumeTransformFeedback: qword -bluegl_glResumeTransformFeedback proc - mov r11, __blue_glCore_glResumeTransformFeedback +extrn __blue_glCore_glDisableVertexArrayEXT: qword +bluegl_glDisableVertexArrayEXT proc + mov r11, __blue_glCore_glDisableVertexArrayEXT jmp r11 -bluegl_glResumeTransformFeedback endp +bluegl_glDisableVertexArrayEXT endp -extrn __blue_glCore_glFlushPixelDataRangeNV: qword -bluegl_glFlushPixelDataRangeNV proc - mov r11, __blue_glCore_glFlushPixelDataRangeNV +extrn __blue_glCore_glEnableVertexArrayAttribEXT: qword +bluegl_glEnableVertexArrayAttribEXT proc + mov r11, __blue_glCore_glEnableVertexArrayAttribEXT jmp r11 -bluegl_glFlushPixelDataRangeNV endp +bluegl_glEnableVertexArrayAttribEXT endp -extrn __blue_glCore_glSecondaryColorPointer: qword -bluegl_glSecondaryColorPointer proc - mov r11, __blue_glCore_glSecondaryColorPointer +extrn __blue_glCore_glDisableVertexArrayAttribEXT: qword +bluegl_glDisableVertexArrayAttribEXT proc + mov r11, __blue_glCore_glDisableVertexArrayAttribEXT jmp r11 -bluegl_glSecondaryColorPointer endp +bluegl_glDisableVertexArrayAttribEXT endp -extrn __blue_glCore_glVideoCaptureStreamParameterdvNV: qword -bluegl_glVideoCaptureStreamParameterdvNV proc - mov r11, __blue_glCore_glVideoCaptureStreamParameterdvNV +extrn __blue_glCore_glGetVertexArrayIntegervEXT: qword +bluegl_glGetVertexArrayIntegervEXT proc + mov r11, __blue_glCore_glGetVertexArrayIntegervEXT jmp r11 -bluegl_glVideoCaptureStreamParameterdvNV endp +bluegl_glGetVertexArrayIntegervEXT endp -extrn __blue_glCore_glTextureSubImage2DEXT: qword -bluegl_glTextureSubImage2DEXT proc - mov r11, __blue_glCore_glTextureSubImage2DEXT +extrn __blue_glCore_glGetVertexArrayPointervEXT: qword +bluegl_glGetVertexArrayPointervEXT proc + mov r11, __blue_glCore_glGetVertexArrayPointervEXT jmp r11 -bluegl_glTextureSubImage2DEXT endp +bluegl_glGetVertexArrayPointervEXT endp -extrn __blue_glCore_glDeletePathsNV: qword -bluegl_glDeletePathsNV proc - mov r11, __blue_glCore_glDeletePathsNV +extrn __blue_glCore_glGetVertexArrayIntegeri_vEXT: qword +bluegl_glGetVertexArrayIntegeri_vEXT proc + mov r11, __blue_glCore_glGetVertexArrayIntegeri_vEXT jmp r11 -bluegl_glDeletePathsNV endp +bluegl_glGetVertexArrayIntegeri_vEXT endp -extrn __blue_glCore_glGetFloatv: qword -bluegl_glGetFloatv proc - mov r11, __blue_glCore_glGetFloatv +extrn __blue_glCore_glGetVertexArrayPointeri_vEXT: qword +bluegl_glGetVertexArrayPointeri_vEXT proc + mov r11, __blue_glCore_glGetVertexArrayPointeri_vEXT jmp r11 -bluegl_glGetFloatv endp +bluegl_glGetVertexArrayPointeri_vEXT endp -extrn __blue_glCore_glVertexAttribI3uivEXT: qword -bluegl_glVertexAttribI3uivEXT proc - mov r11, __blue_glCore_glVertexAttribI3uivEXT +extrn __blue_glCore_glMapNamedBufferRangeEXT: qword +bluegl_glMapNamedBufferRangeEXT proc + mov r11, __blue_glCore_glMapNamedBufferRangeEXT jmp r11 -bluegl_glVertexAttribI3uivEXT endp +bluegl_glMapNamedBufferRangeEXT endp -extrn __blue_glCore_glGetVertexAttribdvARB: qword -bluegl_glGetVertexAttribdvARB proc - mov r11, __blue_glCore_glGetVertexAttribdvARB +extrn __blue_glCore_glFlushMappedNamedBufferRangeEXT: qword +bluegl_glFlushMappedNamedBufferRangeEXT proc + mov r11, __blue_glCore_glFlushMappedNamedBufferRangeEXT jmp r11 -bluegl_glGetVertexAttribdvARB endp +bluegl_glFlushMappedNamedBufferRangeEXT endp -extrn __blue_glCore_glUniform4ui64NV: qword -bluegl_glUniform4ui64NV proc - mov r11, __blue_glCore_glUniform4ui64NV +extrn __blue_glCore_glNamedBufferStorageEXT: qword +bluegl_glNamedBufferStorageEXT proc + mov r11, __blue_glCore_glNamedBufferStorageEXT jmp r11 -bluegl_glUniform4ui64NV endp +bluegl_glNamedBufferStorageEXT endp -extrn __blue_glCore_glGetTextureLevelParameterfv: qword -bluegl_glGetTextureLevelParameterfv proc - mov r11, __blue_glCore_glGetTextureLevelParameterfv +extrn __blue_glCore_glClearNamedBufferDataEXT: qword +bluegl_glClearNamedBufferDataEXT proc + mov r11, __blue_glCore_glClearNamedBufferDataEXT jmp r11 -bluegl_glGetTextureLevelParameterfv endp +bluegl_glClearNamedBufferDataEXT endp -extrn __blue_glCore_glWindowPos2i: qword -bluegl_glWindowPos2i proc - mov r11, __blue_glCore_glWindowPos2i +extrn __blue_glCore_glClearNamedBufferSubDataEXT: qword +bluegl_glClearNamedBufferSubDataEXT proc + mov r11, __blue_glCore_glClearNamedBufferSubDataEXT jmp r11 -bluegl_glWindowPos2i endp +bluegl_glClearNamedBufferSubDataEXT endp -extrn __blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN: qword -bluegl_glReplacementCodeuiColor4ubVertex3fSUN proc - mov r11, __blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN +extrn __blue_glCore_glNamedFramebufferParameteriEXT: qword +bluegl_glNamedFramebufferParameteriEXT proc + mov r11, __blue_glCore_glNamedFramebufferParameteriEXT jmp r11 -bluegl_glReplacementCodeuiColor4ubVertex3fSUN endp +bluegl_glNamedFramebufferParameteriEXT endp -extrn __blue_glCore_glCompressedMultiTexSubImage3DEXT: qword -bluegl_glCompressedMultiTexSubImage3DEXT proc - mov r11, __blue_glCore_glCompressedMultiTexSubImage3DEXT +extrn __blue_glCore_glGetNamedFramebufferParameterivEXT: qword +bluegl_glGetNamedFramebufferParameterivEXT proc + mov r11, __blue_glCore_glGetNamedFramebufferParameterivEXT jmp r11 -bluegl_glCompressedMultiTexSubImage3DEXT endp +bluegl_glGetNamedFramebufferParameterivEXT endp -extrn __blue_glCore_glGetTexParameterIivEXT: qword -bluegl_glGetTexParameterIivEXT proc - mov r11, __blue_glCore_glGetTexParameterIivEXT +extrn __blue_glCore_glProgramUniform1dEXT: qword +bluegl_glProgramUniform1dEXT proc + mov r11, __blue_glCore_glProgramUniform1dEXT jmp r11 -bluegl_glGetTexParameterIivEXT endp +bluegl_glProgramUniform1dEXT endp -extrn __blue_glCore_glDebugMessageCallbackARB: qword -bluegl_glDebugMessageCallbackARB proc - mov r11, __blue_glCore_glDebugMessageCallbackARB +extrn __blue_glCore_glProgramUniform2dEXT: qword +bluegl_glProgramUniform2dEXT proc + mov r11, __blue_glCore_glProgramUniform2dEXT jmp r11 -bluegl_glDebugMessageCallbackARB endp +bluegl_glProgramUniform2dEXT endp -extrn __blue_glCore_glWeightPointerARB: qword -bluegl_glWeightPointerARB proc - mov r11, __blue_glCore_glWeightPointerARB +extrn __blue_glCore_glProgramUniform3dEXT: qword +bluegl_glProgramUniform3dEXT proc + mov r11, __blue_glCore_glProgramUniform3dEXT jmp r11 -bluegl_glWeightPointerARB endp +bluegl_glProgramUniform3dEXT endp -extrn __blue_glCore_glFogxOES: qword -bluegl_glFogxOES proc - mov r11, __blue_glCore_glFogxOES +extrn __blue_glCore_glProgramUniform4dEXT: qword +bluegl_glProgramUniform4dEXT proc + mov r11, __blue_glCore_glProgramUniform4dEXT jmp r11 -bluegl_glFogxOES endp +bluegl_glProgramUniform4dEXT endp -extrn __blue_glCore_glProgramUniformMatrix2x4fvEXT: qword -bluegl_glProgramUniformMatrix2x4fvEXT proc - mov r11, __blue_glCore_glProgramUniformMatrix2x4fvEXT +extrn __blue_glCore_glProgramUniform1dvEXT: qword +bluegl_glProgramUniform1dvEXT proc + mov r11, __blue_glCore_glProgramUniform1dvEXT jmp r11 -bluegl_glProgramUniformMatrix2x4fvEXT endp +bluegl_glProgramUniform1dvEXT endp -extrn __blue_glCore_glVertexAttrib4iv: qword -bluegl_glVertexAttrib4iv proc - mov r11, __blue_glCore_glVertexAttrib4iv +extrn __blue_glCore_glProgramUniform2dvEXT: qword +bluegl_glProgramUniform2dvEXT proc + mov r11, __blue_glCore_glProgramUniform2dvEXT jmp r11 -bluegl_glVertexAttrib4iv endp +bluegl_glProgramUniform2dvEXT endp -extrn __blue_glCore_glProgramLocalParameterI4iNV: qword -bluegl_glProgramLocalParameterI4iNV proc - mov r11, __blue_glCore_glProgramLocalParameterI4iNV +extrn __blue_glCore_glProgramUniform3dvEXT: qword +bluegl_glProgramUniform3dvEXT proc + mov r11, __blue_glCore_glProgramUniform3dvEXT jmp r11 -bluegl_glProgramLocalParameterI4iNV endp +bluegl_glProgramUniform3dvEXT endp -extrn __blue_glCore_glGetnColorTableARB: qword -bluegl_glGetnColorTableARB proc - mov r11, __blue_glCore_glGetnColorTableARB +extrn __blue_glCore_glProgramUniform4dvEXT: qword +bluegl_glProgramUniform4dvEXT proc + mov r11, __blue_glCore_glProgramUniform4dvEXT jmp r11 -bluegl_glGetnColorTableARB endp +bluegl_glProgramUniform4dvEXT endp -extrn __blue_glCore_glClearNamedBufferData: qword -bluegl_glClearNamedBufferData proc - mov r11, __blue_glCore_glClearNamedBufferData +extrn __blue_glCore_glProgramUniformMatrix2dvEXT: qword +bluegl_glProgramUniformMatrix2dvEXT proc + mov r11, __blue_glCore_glProgramUniformMatrix2dvEXT jmp r11 -bluegl_glClearNamedBufferData endp +bluegl_glProgramUniformMatrix2dvEXT endp -extrn __blue_glCore_glColorMaskIndexedEXT: qword -bluegl_glColorMaskIndexedEXT proc - mov r11, __blue_glCore_glColorMaskIndexedEXT +extrn __blue_glCore_glProgramUniformMatrix3dvEXT: qword +bluegl_glProgramUniformMatrix3dvEXT proc + mov r11, __blue_glCore_glProgramUniformMatrix3dvEXT jmp r11 -bluegl_glColorMaskIndexedEXT endp +bluegl_glProgramUniformMatrix3dvEXT endp -extrn __blue_glCore_glVertexAttribLPointer: qword -bluegl_glVertexAttribLPointer proc - mov r11, __blue_glCore_glVertexAttribLPointer +extrn __blue_glCore_glProgramUniformMatrix4dvEXT: qword +bluegl_glProgramUniformMatrix4dvEXT proc + mov r11, __blue_glCore_glProgramUniformMatrix4dvEXT jmp r11 -bluegl_glVertexAttribLPointer endp +bluegl_glProgramUniformMatrix4dvEXT endp -extrn __blue_glCore_glProgramUniform3i64vNV: qword -bluegl_glProgramUniform3i64vNV proc - mov r11, __blue_glCore_glProgramUniform3i64vNV +extrn __blue_glCore_glProgramUniformMatrix2x3dvEXT: qword +bluegl_glProgramUniformMatrix2x3dvEXT proc + mov r11, __blue_glCore_glProgramUniformMatrix2x3dvEXT jmp r11 -bluegl_glProgramUniform3i64vNV endp +bluegl_glProgramUniformMatrix2x3dvEXT endp -extrn __blue_glCore_glScissor: qword -bluegl_glScissor proc - mov r11, __blue_glCore_glScissor +extrn __blue_glCore_glProgramUniformMatrix2x4dvEXT: qword +bluegl_glProgramUniformMatrix2x4dvEXT proc + mov r11, __blue_glCore_glProgramUniformMatrix2x4dvEXT jmp r11 -bluegl_glScissor endp +bluegl_glProgramUniformMatrix2x4dvEXT endp -extrn __blue_glCore_glSecondaryColor3fv: qword -bluegl_glSecondaryColor3fv proc - mov r11, __blue_glCore_glSecondaryColor3fv +extrn __blue_glCore_glProgramUniformMatrix3x2dvEXT: qword +bluegl_glProgramUniformMatrix3x2dvEXT proc + mov r11, __blue_glCore_glProgramUniformMatrix3x2dvEXT jmp r11 -bluegl_glSecondaryColor3fv endp +bluegl_glProgramUniformMatrix3x2dvEXT endp -extrn __blue_glCore_glCombinerParameterivNV: qword -bluegl_glCombinerParameterivNV proc - mov r11, __blue_glCore_glCombinerParameterivNV +extrn __blue_glCore_glProgramUniformMatrix3x4dvEXT: qword +bluegl_glProgramUniformMatrix3x4dvEXT proc + mov r11, __blue_glCore_glProgramUniformMatrix3x4dvEXT jmp r11 -bluegl_glCombinerParameterivNV endp +bluegl_glProgramUniformMatrix3x4dvEXT endp -extrn __blue_glCore_glGetTexLevelParameterfv: qword -bluegl_glGetTexLevelParameterfv proc - mov r11, __blue_glCore_glGetTexLevelParameterfv +extrn __blue_glCore_glProgramUniformMatrix4x2dvEXT: qword +bluegl_glProgramUniformMatrix4x2dvEXT proc + mov r11, __blue_glCore_glProgramUniformMatrix4x2dvEXT jmp r11 -bluegl_glGetTexLevelParameterfv endp +bluegl_glProgramUniformMatrix4x2dvEXT endp -extrn __blue_glCore_glDrawElementArrayATI: qword -bluegl_glDrawElementArrayATI proc - mov r11, __blue_glCore_glDrawElementArrayATI +extrn __blue_glCore_glProgramUniformMatrix4x3dvEXT: qword +bluegl_glProgramUniformMatrix4x3dvEXT proc + mov r11, __blue_glCore_glProgramUniformMatrix4x3dvEXT jmp r11 -bluegl_glDrawElementArrayATI endp +bluegl_glProgramUniformMatrix4x3dvEXT endp -extrn __blue_glCore_glVertexAttrib4Nusv: qword -bluegl_glVertexAttrib4Nusv proc - mov r11, __blue_glCore_glVertexAttrib4Nusv +extrn __blue_glCore_glTextureBufferRangeEXT: qword +bluegl_glTextureBufferRangeEXT proc + mov r11, __blue_glCore_glTextureBufferRangeEXT jmp r11 -bluegl_glVertexAttrib4Nusv endp +bluegl_glTextureBufferRangeEXT endp -extrn __blue_glCore_glWindowPos3dvMESA: qword -bluegl_glWindowPos3dvMESA proc - mov r11, __blue_glCore_glWindowPos3dvMESA +extrn __blue_glCore_glTextureStorage1DEXT: qword +bluegl_glTextureStorage1DEXT proc + mov r11, __blue_glCore_glTextureStorage1DEXT jmp r11 -bluegl_glWindowPos3dvMESA endp +bluegl_glTextureStorage1DEXT endp -extrn __blue_glCore_glMakeImageHandleResidentARB: qword -bluegl_glMakeImageHandleResidentARB proc - mov r11, __blue_glCore_glMakeImageHandleResidentARB +extrn __blue_glCore_glTextureStorage2DEXT: qword +bluegl_glTextureStorage2DEXT proc + mov r11, __blue_glCore_glTextureStorage2DEXT jmp r11 -bluegl_glMakeImageHandleResidentARB endp +bluegl_glTextureStorage2DEXT endp -extrn __blue_glCore_glWindowPos3svMESA: qword -bluegl_glWindowPos3svMESA proc - mov r11, __blue_glCore_glWindowPos3svMESA +extrn __blue_glCore_glTextureStorage3DEXT: qword +bluegl_glTextureStorage3DEXT proc + mov r11, __blue_glCore_glTextureStorage3DEXT jmp r11 -bluegl_glWindowPos3svMESA endp +bluegl_glTextureStorage3DEXT endp -extrn __blue_glCore_glGetMultiTexLevelParameterfvEXT: qword -bluegl_glGetMultiTexLevelParameterfvEXT proc - mov r11, __blue_glCore_glGetMultiTexLevelParameterfvEXT +extrn __blue_glCore_glTextureStorage2DMultisampleEXT: qword +bluegl_glTextureStorage2DMultisampleEXT proc + mov r11, __blue_glCore_glTextureStorage2DMultisampleEXT jmp r11 -bluegl_glGetMultiTexLevelParameterfvEXT endp +bluegl_glTextureStorage2DMultisampleEXT endp -extrn __blue_glCore_glRasterPos3xOES: qword -bluegl_glRasterPos3xOES proc - mov r11, __blue_glCore_glRasterPos3xOES +extrn __blue_glCore_glTextureStorage3DMultisampleEXT: qword +bluegl_glTextureStorage3DMultisampleEXT proc + mov r11, __blue_glCore_glTextureStorage3DMultisampleEXT jmp r11 -bluegl_glRasterPos3xOES endp +bluegl_glTextureStorage3DMultisampleEXT endp -extrn __blue_glCore_glBinormal3iEXT: qword -bluegl_glBinormal3iEXT proc - mov r11, __blue_glCore_glBinormal3iEXT +extrn __blue_glCore_glVertexArrayBindVertexBufferEXT: qword +bluegl_glVertexArrayBindVertexBufferEXT proc + mov r11, __blue_glCore_glVertexArrayBindVertexBufferEXT jmp r11 -bluegl_glBinormal3iEXT endp +bluegl_glVertexArrayBindVertexBufferEXT endp -extrn __blue_glCore_glVertexAttribP3uiv: qword -bluegl_glVertexAttribP3uiv proc - mov r11, __blue_glCore_glVertexAttribP3uiv +extrn __blue_glCore_glVertexArrayVertexAttribFormatEXT: qword +bluegl_glVertexArrayVertexAttribFormatEXT proc + mov r11, __blue_glCore_glVertexArrayVertexAttribFormatEXT jmp r11 -bluegl_glVertexAttribP3uiv endp +bluegl_glVertexArrayVertexAttribFormatEXT endp -extrn __blue_glCore_glProgramUniformMatrix2x3dv: qword -bluegl_glProgramUniformMatrix2x3dv proc - mov r11, __blue_glCore_glProgramUniformMatrix2x3dv +extrn __blue_glCore_glVertexArrayVertexAttribIFormatEXT: qword +bluegl_glVertexArrayVertexAttribIFormatEXT proc + mov r11, __blue_glCore_glVertexArrayVertexAttribIFormatEXT jmp r11 -bluegl_glProgramUniformMatrix2x3dv endp +bluegl_glVertexArrayVertexAttribIFormatEXT endp -extrn __blue_glCore_glEndConditionalRender: qword -bluegl_glEndConditionalRender proc - mov r11, __blue_glCore_glEndConditionalRender +extrn __blue_glCore_glVertexArrayVertexAttribLFormatEXT: qword +bluegl_glVertexArrayVertexAttribLFormatEXT proc + mov r11, __blue_glCore_glVertexArrayVertexAttribLFormatEXT jmp r11 -bluegl_glEndConditionalRender endp +bluegl_glVertexArrayVertexAttribLFormatEXT endp -extrn __blue_glCore_glBindParameterEXT: qword -bluegl_glBindParameterEXT proc - mov r11, __blue_glCore_glBindParameterEXT +extrn __blue_glCore_glVertexArrayVertexAttribBindingEXT: qword +bluegl_glVertexArrayVertexAttribBindingEXT proc + mov r11, __blue_glCore_glVertexArrayVertexAttribBindingEXT jmp r11 -bluegl_glBindParameterEXT endp +bluegl_glVertexArrayVertexAttribBindingEXT endp -extrn __blue_glCore_glCompileShaderIncludeARB: qword -bluegl_glCompileShaderIncludeARB proc - mov r11, __blue_glCore_glCompileShaderIncludeARB +extrn __blue_glCore_glVertexArrayVertexBindingDivisorEXT: qword +bluegl_glVertexArrayVertexBindingDivisorEXT proc + mov r11, __blue_glCore_glVertexArrayVertexBindingDivisorEXT jmp r11 -bluegl_glCompileShaderIncludeARB endp +bluegl_glVertexArrayVertexBindingDivisorEXT endp -extrn __blue_glCore_glTexStorageSparseAMD: qword -bluegl_glTexStorageSparseAMD proc - mov r11, __blue_glCore_glTexStorageSparseAMD +extrn __blue_glCore_glVertexArrayVertexAttribLOffsetEXT: qword +bluegl_glVertexArrayVertexAttribLOffsetEXT proc + mov r11, __blue_glCore_glVertexArrayVertexAttribLOffsetEXT jmp r11 -bluegl_glTexStorageSparseAMD endp +bluegl_glVertexArrayVertexAttribLOffsetEXT endp -extrn __blue_glCore_glCreateShaderProgramEXT: qword -bluegl_glCreateShaderProgramEXT proc - mov r11, __blue_glCore_glCreateShaderProgramEXT +extrn __blue_glCore_glTexturePageCommitmentEXT: qword +bluegl_glTexturePageCommitmentEXT proc + mov r11, __blue_glCore_glTexturePageCommitmentEXT jmp r11 -bluegl_glCreateShaderProgramEXT endp +bluegl_glTexturePageCommitmentEXT endp -extrn __blue_glCore_glUniformMatrix3x2fv: qword -bluegl_glUniformMatrix3x2fv proc - mov r11, __blue_glCore_glUniformMatrix3x2fv +extrn __blue_glCore_glVertexArrayVertexAttribDivisorEXT: qword +bluegl_glVertexArrayVertexAttribDivisorEXT proc + mov r11, __blue_glCore_glVertexArrayVertexAttribDivisorEXT jmp r11 -bluegl_glUniformMatrix3x2fv endp +bluegl_glVertexArrayVertexAttribDivisorEXT endp -extrn __blue_glCore_glPrimitiveRestartIndex: qword -bluegl_glPrimitiveRestartIndex proc - mov r11, __blue_glCore_glPrimitiveRestartIndex +extrn __blue_glCore_glColorMaskIndexedEXT: qword +bluegl_glColorMaskIndexedEXT proc + mov r11, __blue_glCore_glColorMaskIndexedEXT jmp r11 -bluegl_glPrimitiveRestartIndex endp +bluegl_glColorMaskIndexedEXT endp -extrn __blue_glCore_glCreateProgram: qword -bluegl_glCreateProgram proc - mov r11, __blue_glCore_glCreateProgram +extrn __blue_glCore_glDrawArraysInstancedEXT: qword +bluegl_glDrawArraysInstancedEXT proc + mov r11, __blue_glCore_glDrawArraysInstancedEXT jmp r11 -bluegl_glCreateProgram endp +bluegl_glDrawArraysInstancedEXT endp -extrn __blue_glCore_glMultiTexCoord3d: qword -bluegl_glMultiTexCoord3d proc - mov r11, __blue_glCore_glMultiTexCoord3d +extrn __blue_glCore_glDrawElementsInstancedEXT: qword +bluegl_glDrawElementsInstancedEXT proc + mov r11, __blue_glCore_glDrawElementsInstancedEXT jmp r11 -bluegl_glMultiTexCoord3d endp +bluegl_glDrawElementsInstancedEXT endp -extrn __blue_glCore_glGetFenceivNV: qword -bluegl_glGetFenceivNV proc - mov r11, __blue_glCore_glGetFenceivNV +extrn __blue_glCore_glDrawRangeElementsEXT: qword +bluegl_glDrawRangeElementsEXT proc + mov r11, __blue_glCore_glDrawRangeElementsEXT jmp r11 -bluegl_glGetFenceivNV endp +bluegl_glDrawRangeElementsEXT endp -extrn __blue_glCore_glUniform4dv: qword -bluegl_glUniform4dv proc - mov r11, __blue_glCore_glUniform4dv +extrn __blue_glCore_glFogCoordfEXT: qword +bluegl_glFogCoordfEXT proc + mov r11, __blue_glCore_glFogCoordfEXT jmp r11 -bluegl_glUniform4dv endp +bluegl_glFogCoordfEXT endp -extrn __blue_glCore_glUniform3i64ARB: qword -bluegl_glUniform3i64ARB proc - mov r11, __blue_glCore_glUniform3i64ARB +extrn __blue_glCore_glFogCoordfvEXT: qword +bluegl_glFogCoordfvEXT proc + mov r11, __blue_glCore_glFogCoordfvEXT jmp r11 -bluegl_glUniform3i64ARB endp +bluegl_glFogCoordfvEXT endp -extrn __blue_glCore_glTexturePageCommitmentEXT: qword -bluegl_glTexturePageCommitmentEXT proc - mov r11, __blue_glCore_glTexturePageCommitmentEXT +extrn __blue_glCore_glFogCoorddEXT: qword +bluegl_glFogCoorddEXT proc + mov r11, __blue_glCore_glFogCoorddEXT jmp r11 -bluegl_glTexturePageCommitmentEXT endp +bluegl_glFogCoorddEXT endp -extrn __blue_glCore_glColor4hNV: qword -bluegl_glColor4hNV proc - mov r11, __blue_glCore_glColor4hNV +extrn __blue_glCore_glFogCoorddvEXT: qword +bluegl_glFogCoorddvEXT proc + mov r11, __blue_glCore_glFogCoorddvEXT jmp r11 -bluegl_glColor4hNV endp +bluegl_glFogCoorddvEXT endp -extrn __blue_glCore_glVertexStream2fATI: qword -bluegl_glVertexStream2fATI proc - mov r11, __blue_glCore_glVertexStream2fATI +extrn __blue_glCore_glFogCoordPointerEXT: qword +bluegl_glFogCoordPointerEXT proc + mov r11, __blue_glCore_glFogCoordPointerEXT jmp r11 -bluegl_glVertexStream2fATI endp +bluegl_glFogCoordPointerEXT endp -extrn __blue_glCore_glDisable: qword -bluegl_glDisable proc - mov r11, __blue_glCore_glDisable +extrn __blue_glCore_glBlitFramebufferEXT: qword +bluegl_glBlitFramebufferEXT proc + mov r11, __blue_glCore_glBlitFramebufferEXT jmp r11 -bluegl_glDisable endp +bluegl_glBlitFramebufferEXT endp -extrn __blue_glCore_glFramebufferRenderbuffer: qword -bluegl_glFramebufferRenderbuffer proc - mov r11, __blue_glCore_glFramebufferRenderbuffer +extrn __blue_glCore_glRenderbufferStorageMultisampleEXT: qword +bluegl_glRenderbufferStorageMultisampleEXT proc + mov r11, __blue_glCore_glRenderbufferStorageMultisampleEXT jmp r11 -bluegl_glFramebufferRenderbuffer endp +bluegl_glRenderbufferStorageMultisampleEXT endp extrn __blue_glCore_glIsRenderbufferEXT: qword bluegl_glIsRenderbufferEXT proc @@ -10605,1187 +10591,1217 @@ bluegl_glIsRenderbufferEXT proc jmp r11 bluegl_glIsRenderbufferEXT endp -extrn __blue_glCore_glGetMultiTexParameterIivEXT: qword -bluegl_glGetMultiTexParameterIivEXT proc - mov r11, __blue_glCore_glGetMultiTexParameterIivEXT +extrn __blue_glCore_glBindRenderbufferEXT: qword +bluegl_glBindRenderbufferEXT proc + mov r11, __blue_glCore_glBindRenderbufferEXT jmp r11 -bluegl_glGetMultiTexParameterIivEXT endp +bluegl_glBindRenderbufferEXT endp -extrn __blue_glCore_glVertexAttrib2fvNV: qword -bluegl_glVertexAttrib2fvNV proc - mov r11, __blue_glCore_glVertexAttrib2fvNV +extrn __blue_glCore_glDeleteRenderbuffersEXT: qword +bluegl_glDeleteRenderbuffersEXT proc + mov r11, __blue_glCore_glDeleteRenderbuffersEXT jmp r11 -bluegl_glVertexAttrib2fvNV endp +bluegl_glDeleteRenderbuffersEXT endp -extrn __blue_glCore_glReferencePlaneSGIX: qword -bluegl_glReferencePlaneSGIX proc - mov r11, __blue_glCore_glReferencePlaneSGIX +extrn __blue_glCore_glGenRenderbuffersEXT: qword +bluegl_glGenRenderbuffersEXT proc + mov r11, __blue_glCore_glGenRenderbuffersEXT jmp r11 -bluegl_glReferencePlaneSGIX endp +bluegl_glGenRenderbuffersEXT endp -extrn __blue_glCore_glUniform4fARB: qword -bluegl_glUniform4fARB proc - mov r11, __blue_glCore_glUniform4fARB +extrn __blue_glCore_glRenderbufferStorageEXT: qword +bluegl_glRenderbufferStorageEXT proc + mov r11, __blue_glCore_glRenderbufferStorageEXT jmp r11 -bluegl_glUniform4fARB endp +bluegl_glRenderbufferStorageEXT endp -extrn __blue_glCore_glClearBufferfi: qword -bluegl_glClearBufferfi proc - mov r11, __blue_glCore_glClearBufferfi +extrn __blue_glCore_glGetRenderbufferParameterivEXT: qword +bluegl_glGetRenderbufferParameterivEXT proc + mov r11, __blue_glCore_glGetRenderbufferParameterivEXT jmp r11 -bluegl_glClearBufferfi endp +bluegl_glGetRenderbufferParameterivEXT endp -extrn __blue_glCore_glBindFragDataLocation: qword -bluegl_glBindFragDataLocation proc - mov r11, __blue_glCore_glBindFragDataLocation +extrn __blue_glCore_glIsFramebufferEXT: qword +bluegl_glIsFramebufferEXT proc + mov r11, __blue_glCore_glIsFramebufferEXT jmp r11 -bluegl_glBindFragDataLocation endp +bluegl_glIsFramebufferEXT endp -extrn __blue_glCore_glGetIntegerv: qword -bluegl_glGetIntegerv proc - mov r11, __blue_glCore_glGetIntegerv +extrn __blue_glCore_glBindFramebufferEXT: qword +bluegl_glBindFramebufferEXT proc + mov r11, __blue_glCore_glBindFramebufferEXT jmp r11 -bluegl_glGetIntegerv endp +bluegl_glBindFramebufferEXT endp -extrn __blue_glCore_glGetObjectLabel: qword -bluegl_glGetObjectLabel proc - mov r11, __blue_glCore_glGetObjectLabel +extrn __blue_glCore_glDeleteFramebuffersEXT: qword +bluegl_glDeleteFramebuffersEXT proc + mov r11, __blue_glCore_glDeleteFramebuffersEXT jmp r11 -bluegl_glGetObjectLabel endp +bluegl_glDeleteFramebuffersEXT endp + +extrn __blue_glCore_glGenFramebuffersEXT: qword +bluegl_glGenFramebuffersEXT proc + mov r11, __blue_glCore_glGenFramebuffersEXT + jmp r11 +bluegl_glGenFramebuffersEXT endp + +extrn __blue_glCore_glCheckFramebufferStatusEXT: qword +bluegl_glCheckFramebufferStatusEXT proc + mov r11, __blue_glCore_glCheckFramebufferStatusEXT + jmp r11 +bluegl_glCheckFramebufferStatusEXT endp + +extrn __blue_glCore_glFramebufferTexture1DEXT: qword +bluegl_glFramebufferTexture1DEXT proc + mov r11, __blue_glCore_glFramebufferTexture1DEXT + jmp r11 +bluegl_glFramebufferTexture1DEXT endp + +extrn __blue_glCore_glFramebufferTexture2DEXT: qword +bluegl_glFramebufferTexture2DEXT proc + mov r11, __blue_glCore_glFramebufferTexture2DEXT + jmp r11 +bluegl_glFramebufferTexture2DEXT endp -extrn __blue_glCore_glBufferPageCommitmentARB: qword -bluegl_glBufferPageCommitmentARB proc - mov r11, __blue_glCore_glBufferPageCommitmentARB +extrn __blue_glCore_glFramebufferTexture3DEXT: qword +bluegl_glFramebufferTexture3DEXT proc + mov r11, __blue_glCore_glFramebufferTexture3DEXT jmp r11 -bluegl_glBufferPageCommitmentARB endp +bluegl_glFramebufferTexture3DEXT endp -extrn __blue_glCore_glBlendFuncIndexedAMD: qword -bluegl_glBlendFuncIndexedAMD proc - mov r11, __blue_glCore_glBlendFuncIndexedAMD +extrn __blue_glCore_glFramebufferRenderbufferEXT: qword +bluegl_glFramebufferRenderbufferEXT proc + mov r11, __blue_glCore_glFramebufferRenderbufferEXT jmp r11 -bluegl_glBlendFuncIndexedAMD endp +bluegl_glFramebufferRenderbufferEXT endp -extrn __blue_glCore_glGetQueryObjectui64vEXT: qword -bluegl_glGetQueryObjectui64vEXT proc - mov r11, __blue_glCore_glGetQueryObjectui64vEXT +extrn __blue_glCore_glGetFramebufferAttachmentParameterivEXT: qword +bluegl_glGetFramebufferAttachmentParameterivEXT proc + mov r11, __blue_glCore_glGetFramebufferAttachmentParameterivEXT jmp r11 -bluegl_glGetQueryObjectui64vEXT endp +bluegl_glGetFramebufferAttachmentParameterivEXT endp -extrn __blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN: qword -bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN proc - mov r11, __blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN +extrn __blue_glCore_glGenerateMipmapEXT: qword +bluegl_glGenerateMipmapEXT proc + mov r11, __blue_glCore_glGenerateMipmapEXT jmp r11 -bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN endp +bluegl_glGenerateMipmapEXT endp -extrn __blue_glCore_glBlitFramebuffer: qword -bluegl_glBlitFramebuffer proc - mov r11, __blue_glCore_glBlitFramebuffer +extrn __blue_glCore_glProgramParameteriEXT: qword +bluegl_glProgramParameteriEXT proc + mov r11, __blue_glCore_glProgramParameteriEXT jmp r11 -bluegl_glBlitFramebuffer endp +bluegl_glProgramParameteriEXT endp -extrn __blue_glCore_glMultiTexCoord2f: qword -bluegl_glMultiTexCoord2f proc - mov r11, __blue_glCore_glMultiTexCoord2f +extrn __blue_glCore_glProgramEnvParameters4fvEXT: qword +bluegl_glProgramEnvParameters4fvEXT proc + mov r11, __blue_glCore_glProgramEnvParameters4fvEXT jmp r11 -bluegl_glMultiTexCoord2f endp +bluegl_glProgramEnvParameters4fvEXT endp -extrn __blue_glCore_glNamedFramebufferRenderbufferEXT: qword -bluegl_glNamedFramebufferRenderbufferEXT proc - mov r11, __blue_glCore_glNamedFramebufferRenderbufferEXT +extrn __blue_glCore_glProgramLocalParameters4fvEXT: qword +bluegl_glProgramLocalParameters4fvEXT proc + mov r11, __blue_glCore_glProgramLocalParameters4fvEXT jmp r11 -bluegl_glNamedFramebufferRenderbufferEXT endp +bluegl_glProgramLocalParameters4fvEXT endp -extrn __blue_glCore_glUseProgramStages: qword -bluegl_glUseProgramStages proc - mov r11, __blue_glCore_glUseProgramStages +extrn __blue_glCore_glGetUniformuivEXT: qword +bluegl_glGetUniformuivEXT proc + mov r11, __blue_glCore_glGetUniformuivEXT jmp r11 -bluegl_glUseProgramStages endp +bluegl_glGetUniformuivEXT endp -extrn __blue_glCore_glGetNamedStringivARB: qword -bluegl_glGetNamedStringivARB proc - mov r11, __blue_glCore_glGetNamedStringivARB +extrn __blue_glCore_glBindFragDataLocationEXT: qword +bluegl_glBindFragDataLocationEXT proc + mov r11, __blue_glCore_glBindFragDataLocationEXT jmp r11 -bluegl_glGetNamedStringivARB endp +bluegl_glBindFragDataLocationEXT endp -extrn __blue_glCore_glMultiTexCoord1iARB: qword -bluegl_glMultiTexCoord1iARB proc - mov r11, __blue_glCore_glMultiTexCoord1iARB +extrn __blue_glCore_glGetFragDataLocationEXT: qword +bluegl_glGetFragDataLocationEXT proc + mov r11, __blue_glCore_glGetFragDataLocationEXT jmp r11 -bluegl_glMultiTexCoord1iARB endp +bluegl_glGetFragDataLocationEXT endp -extrn __blue_glCore_glMultiTexCoord4xvOES: qword -bluegl_glMultiTexCoord4xvOES proc - mov r11, __blue_glCore_glMultiTexCoord4xvOES +extrn __blue_glCore_glUniform1uiEXT: qword +bluegl_glUniform1uiEXT proc + mov r11, __blue_glCore_glUniform1uiEXT jmp r11 -bluegl_glMultiTexCoord4xvOES endp +bluegl_glUniform1uiEXT endp -extrn __blue_glCore_glMakeImageHandleResidentNV: qword -bluegl_glMakeImageHandleResidentNV proc - mov r11, __blue_glCore_glMakeImageHandleResidentNV +extrn __blue_glCore_glUniform2uiEXT: qword +bluegl_glUniform2uiEXT proc + mov r11, __blue_glCore_glUniform2uiEXT jmp r11 -bluegl_glMakeImageHandleResidentNV endp +bluegl_glUniform2uiEXT endp -extrn __blue_glCore_glVertexAttrib1fvNV: qword -bluegl_glVertexAttrib1fvNV proc - mov r11, __blue_glCore_glVertexAttrib1fvNV +extrn __blue_glCore_glUniform3uiEXT: qword +bluegl_glUniform3uiEXT proc + mov r11, __blue_glCore_glUniform3uiEXT jmp r11 -bluegl_glVertexAttrib1fvNV endp +bluegl_glUniform3uiEXT endp -extrn __blue_glCore_glViewportIndexedf: qword -bluegl_glViewportIndexedf proc - mov r11, __blue_glCore_glViewportIndexedf +extrn __blue_glCore_glUniform4uiEXT: qword +bluegl_glUniform4uiEXT proc + mov r11, __blue_glCore_glUniform4uiEXT jmp r11 -bluegl_glViewportIndexedf endp +bluegl_glUniform4uiEXT endp -extrn __blue_glCore_glTexStorage3DMultisample: qword -bluegl_glTexStorage3DMultisample proc - mov r11, __blue_glCore_glTexStorage3DMultisample +extrn __blue_glCore_glUniform1uivEXT: qword +bluegl_glUniform1uivEXT proc + mov r11, __blue_glCore_glUniform1uivEXT jmp r11 -bluegl_glTexStorage3DMultisample endp +bluegl_glUniform1uivEXT endp -extrn __blue_glCore_glCreateShaderObjectARB: qword -bluegl_glCreateShaderObjectARB proc - mov r11, __blue_glCore_glCreateShaderObjectARB +extrn __blue_glCore_glUniform2uivEXT: qword +bluegl_glUniform2uivEXT proc + mov r11, __blue_glCore_glUniform2uivEXT jmp r11 -bluegl_glCreateShaderObjectARB endp +bluegl_glUniform2uivEXT endp -extrn __blue_glCore_glListDrawCommandsStatesClientNV: qword -bluegl_glListDrawCommandsStatesClientNV proc - mov r11, __blue_glCore_glListDrawCommandsStatesClientNV +extrn __blue_glCore_glUniform3uivEXT: qword +bluegl_glUniform3uivEXT proc + mov r11, __blue_glCore_glUniform3uivEXT jmp r11 -bluegl_glListDrawCommandsStatesClientNV endp +bluegl_glUniform3uivEXT endp -extrn __blue_glCore_glUniform1d: qword -bluegl_glUniform1d proc - mov r11, __blue_glCore_glUniform1d +extrn __blue_glCore_glUniform4uivEXT: qword +bluegl_glUniform4uivEXT proc + mov r11, __blue_glCore_glUniform4uivEXT jmp r11 -bluegl_glUniform1d endp +bluegl_glUniform4uivEXT endp -extrn __blue_glCore_glGetDebugMessageLogARB: qword -bluegl_glGetDebugMessageLogARB proc - mov r11, __blue_glCore_glGetDebugMessageLogARB +extrn __blue_glCore_glGetHistogramEXT: qword +bluegl_glGetHistogramEXT proc + mov r11, __blue_glCore_glGetHistogramEXT jmp r11 -bluegl_glGetDebugMessageLogARB endp +bluegl_glGetHistogramEXT endp -extrn __blue_glCore_glBlendParameteriNV: qword -bluegl_glBlendParameteriNV proc - mov r11, __blue_glCore_glBlendParameteriNV +extrn __blue_glCore_glGetHistogramParameterfvEXT: qword +bluegl_glGetHistogramParameterfvEXT proc + mov r11, __blue_glCore_glGetHistogramParameterfvEXT jmp r11 -bluegl_glBlendParameteriNV endp +bluegl_glGetHistogramParameterfvEXT endp -extrn __blue_glCore_glMultiTexCoord4sv: qword -bluegl_glMultiTexCoord4sv proc - mov r11, __blue_glCore_glMultiTexCoord4sv +extrn __blue_glCore_glGetHistogramParameterivEXT: qword +bluegl_glGetHistogramParameterivEXT proc + mov r11, __blue_glCore_glGetHistogramParameterivEXT jmp r11 -bluegl_glMultiTexCoord4sv endp +bluegl_glGetHistogramParameterivEXT endp -extrn __blue_glCore_glUniform1uiEXT: qword -bluegl_glUniform1uiEXT proc - mov r11, __blue_glCore_glUniform1uiEXT +extrn __blue_glCore_glGetMinmaxEXT: qword +bluegl_glGetMinmaxEXT proc + mov r11, __blue_glCore_glGetMinmaxEXT jmp r11 -bluegl_glUniform1uiEXT endp +bluegl_glGetMinmaxEXT endp -extrn __blue_glCore_glDebugMessageInsertAMD: qword -bluegl_glDebugMessageInsertAMD proc - mov r11, __blue_glCore_glDebugMessageInsertAMD +extrn __blue_glCore_glGetMinmaxParameterfvEXT: qword +bluegl_glGetMinmaxParameterfvEXT proc + mov r11, __blue_glCore_glGetMinmaxParameterfvEXT jmp r11 -bluegl_glDebugMessageInsertAMD endp +bluegl_glGetMinmaxParameterfvEXT endp -extrn __blue_glCore_glMultiDrawArraysIndirect: qword -bluegl_glMultiDrawArraysIndirect proc - mov r11, __blue_glCore_glMultiDrawArraysIndirect +extrn __blue_glCore_glGetMinmaxParameterivEXT: qword +bluegl_glGetMinmaxParameterivEXT proc + mov r11, __blue_glCore_glGetMinmaxParameterivEXT jmp r11 -bluegl_glMultiDrawArraysIndirect endp +bluegl_glGetMinmaxParameterivEXT endp -extrn __blue_glCore_glProgramUniform1d: qword -bluegl_glProgramUniform1d proc - mov r11, __blue_glCore_glProgramUniform1d +extrn __blue_glCore_glHistogramEXT: qword +bluegl_glHistogramEXT proc + mov r11, __blue_glCore_glHistogramEXT jmp r11 -bluegl_glProgramUniform1d endp +bluegl_glHistogramEXT endp -extrn __blue_glCore_glGetListParameterivSGIX: qword -bluegl_glGetListParameterivSGIX proc - mov r11, __blue_glCore_glGetListParameterivSGIX +extrn __blue_glCore_glMinmaxEXT: qword +bluegl_glMinmaxEXT proc + mov r11, __blue_glCore_glMinmaxEXT jmp r11 -bluegl_glGetListParameterivSGIX endp +bluegl_glMinmaxEXT endp -extrn __blue_glCore_glPointParameterfv: qword -bluegl_glPointParameterfv proc - mov r11, __blue_glCore_glPointParameterfv +extrn __blue_glCore_glResetHistogramEXT: qword +bluegl_glResetHistogramEXT proc + mov r11, __blue_glCore_glResetHistogramEXT jmp r11 -bluegl_glPointParameterfv endp +bluegl_glResetHistogramEXT endp -extrn __blue_glCore_glCopyBufferSubData: qword -bluegl_glCopyBufferSubData proc - mov r11, __blue_glCore_glCopyBufferSubData +extrn __blue_glCore_glResetMinmaxEXT: qword +bluegl_glResetMinmaxEXT proc + mov r11, __blue_glCore_glResetMinmaxEXT jmp r11 -bluegl_glCopyBufferSubData endp +bluegl_glResetMinmaxEXT endp -extrn __blue_glCore_glBindProgramARB: qword -bluegl_glBindProgramARB proc - mov r11, __blue_glCore_glBindProgramARB +extrn __blue_glCore_glIndexFuncEXT: qword +bluegl_glIndexFuncEXT proc + mov r11, __blue_glCore_glIndexFuncEXT jmp r11 -bluegl_glBindProgramARB endp +bluegl_glIndexFuncEXT endp -extrn __blue_glCore_glCombinerStageParameterfvNV: qword -bluegl_glCombinerStageParameterfvNV proc - mov r11, __blue_glCore_glCombinerStageParameterfvNV +extrn __blue_glCore_glIndexMaterialEXT: qword +bluegl_glIndexMaterialEXT proc + mov r11, __blue_glCore_glIndexMaterialEXT jmp r11 -bluegl_glCombinerStageParameterfvNV endp +bluegl_glIndexMaterialEXT endp -extrn __blue_glCore_glEndConditionalRenderNV: qword -bluegl_glEndConditionalRenderNV proc - mov r11, __blue_glCore_glEndConditionalRenderNV +extrn __blue_glCore_glApplyTextureEXT: qword +bluegl_glApplyTextureEXT proc + mov r11, __blue_glCore_glApplyTextureEXT jmp r11 -bluegl_glEndConditionalRenderNV endp +bluegl_glApplyTextureEXT endp -extrn __blue_glCore_glVertexAttribL3dEXT: qword -bluegl_glVertexAttribL3dEXT proc - mov r11, __blue_glCore_glVertexAttribL3dEXT +extrn __blue_glCore_glTextureLightEXT: qword +bluegl_glTextureLightEXT proc + mov r11, __blue_glCore_glTextureLightEXT jmp r11 -bluegl_glVertexAttribL3dEXT endp +bluegl_glTextureLightEXT endp -extrn __blue_glCore_glWindowPos3iv: qword -bluegl_glWindowPos3iv proc - mov r11, __blue_glCore_glWindowPos3iv +extrn __blue_glCore_glTextureMaterialEXT: qword +bluegl_glTextureMaterialEXT proc + mov r11, __blue_glCore_glTextureMaterialEXT jmp r11 -bluegl_glWindowPos3iv endp +bluegl_glTextureMaterialEXT endp -extrn __blue_glCore_glGetFogFuncSGIS: qword -bluegl_glGetFogFuncSGIS proc - mov r11, __blue_glCore_glGetFogFuncSGIS +extrn __blue_glCore_glMultiDrawArraysEXT: qword +bluegl_glMultiDrawArraysEXT proc + mov r11, __blue_glCore_glMultiDrawArraysEXT jmp r11 -bluegl_glGetFogFuncSGIS endp +bluegl_glMultiDrawArraysEXT endp -extrn __blue_glCore_glCompressedTexImage2D: qword -bluegl_glCompressedTexImage2D proc - mov r11, __blue_glCore_glCompressedTexImage2D +extrn __blue_glCore_glMultiDrawElementsEXT: qword +bluegl_glMultiDrawElementsEXT proc + mov r11, __blue_glCore_glMultiDrawElementsEXT jmp r11 -bluegl_glCompressedTexImage2D endp +bluegl_glMultiDrawElementsEXT endp -extrn __blue_glCore_glPixelTexGenParameteriSGIS: qword -bluegl_glPixelTexGenParameteriSGIS proc - mov r11, __blue_glCore_glPixelTexGenParameteriSGIS +extrn __blue_glCore_glSampleMaskEXT: qword +bluegl_glSampleMaskEXT proc + mov r11, __blue_glCore_glSampleMaskEXT jmp r11 -bluegl_glPixelTexGenParameteriSGIS endp +bluegl_glSampleMaskEXT endp -extrn __blue_glCore_glDebugMessageControlARB: qword -bluegl_glDebugMessageControlARB proc - mov r11, __blue_glCore_glDebugMessageControlARB +extrn __blue_glCore_glSamplePatternEXT: qword +bluegl_glSamplePatternEXT proc + mov r11, __blue_glCore_glSamplePatternEXT jmp r11 -bluegl_glDebugMessageControlARB endp +bluegl_glSamplePatternEXT endp -extrn __blue_glCore_glMapBufferRange: qword -bluegl_glMapBufferRange proc - mov r11, __blue_glCore_glMapBufferRange +extrn __blue_glCore_glColorTableEXT: qword +bluegl_glColorTableEXT proc + mov r11, __blue_glCore_glColorTableEXT jmp r11 -bluegl_glMapBufferRange endp +bluegl_glColorTableEXT endp -extrn __blue_glCore_glProgramUniform1fvEXT: qword -bluegl_glProgramUniform1fvEXT proc - mov r11, __blue_glCore_glProgramUniform1fvEXT +extrn __blue_glCore_glGetColorTableEXT: qword +bluegl_glGetColorTableEXT proc + mov r11, __blue_glCore_glGetColorTableEXT jmp r11 -bluegl_glProgramUniform1fvEXT endp +bluegl_glGetColorTableEXT endp -extrn __blue_glCore_glNamedRenderbufferStorageEXT: qword -bluegl_glNamedRenderbufferStorageEXT proc - mov r11, __blue_glCore_glNamedRenderbufferStorageEXT +extrn __blue_glCore_glGetColorTableParameterivEXT: qword +bluegl_glGetColorTableParameterivEXT proc + mov r11, __blue_glCore_glGetColorTableParameterivEXT jmp r11 -bluegl_glNamedRenderbufferStorageEXT endp +bluegl_glGetColorTableParameterivEXT endp -extrn __blue_glCore_glProgramUniformMatrix4x2fv: qword -bluegl_glProgramUniformMatrix4x2fv proc - mov r11, __blue_glCore_glProgramUniformMatrix4x2fv +extrn __blue_glCore_glGetColorTableParameterfvEXT: qword +bluegl_glGetColorTableParameterfvEXT proc + mov r11, __blue_glCore_glGetColorTableParameterfvEXT jmp r11 -bluegl_glProgramUniformMatrix4x2fv endp +bluegl_glGetColorTableParameterfvEXT endp -extrn __blue_glCore_glNamedProgramLocalParameterI4iEXT: qword -bluegl_glNamedProgramLocalParameterI4iEXT proc - mov r11, __blue_glCore_glNamedProgramLocalParameterI4iEXT +extrn __blue_glCore_glPixelTransformParameteriEXT: qword +bluegl_glPixelTransformParameteriEXT proc + mov r11, __blue_glCore_glPixelTransformParameteriEXT jmp r11 -bluegl_glNamedProgramLocalParameterI4iEXT endp +bluegl_glPixelTransformParameteriEXT endp -extrn __blue_glCore_glClearDepth: qword -bluegl_glClearDepth proc - mov r11, __blue_glCore_glClearDepth +extrn __blue_glCore_glPixelTransformParameterfEXT: qword +bluegl_glPixelTransformParameterfEXT proc + mov r11, __blue_glCore_glPixelTransformParameterfEXT jmp r11 -bluegl_glClearDepth endp +bluegl_glPixelTransformParameterfEXT endp -extrn __blue_glCore_glVertexAttribs1dvNV: qword -bluegl_glVertexAttribs1dvNV proc - mov r11, __blue_glCore_glVertexAttribs1dvNV +extrn __blue_glCore_glPixelTransformParameterivEXT: qword +bluegl_glPixelTransformParameterivEXT proc + mov r11, __blue_glCore_glPixelTransformParameterivEXT jmp r11 -bluegl_glVertexAttribs1dvNV endp +bluegl_glPixelTransformParameterivEXT endp -extrn __blue_glCore_glWindowPos3f: qword -bluegl_glWindowPos3f proc - mov r11, __blue_glCore_glWindowPos3f +extrn __blue_glCore_glPixelTransformParameterfvEXT: qword +bluegl_glPixelTransformParameterfvEXT proc + mov r11, __blue_glCore_glPixelTransformParameterfvEXT jmp r11 -bluegl_glWindowPos3f endp +bluegl_glPixelTransformParameterfvEXT endp -extrn __blue_glCore_glProvokingVertex: qword -bluegl_glProvokingVertex proc - mov r11, __blue_glCore_glProvokingVertex +extrn __blue_glCore_glGetPixelTransformParameterivEXT: qword +bluegl_glGetPixelTransformParameterivEXT proc + mov r11, __blue_glCore_glGetPixelTransformParameterivEXT jmp r11 -bluegl_glProvokingVertex endp +bluegl_glGetPixelTransformParameterivEXT endp -extrn __blue_glCore_glIsNamedStringARB: qword -bluegl_glIsNamedStringARB proc - mov r11, __blue_glCore_glIsNamedStringARB +extrn __blue_glCore_glGetPixelTransformParameterfvEXT: qword +bluegl_glGetPixelTransformParameterfvEXT proc + mov r11, __blue_glCore_glGetPixelTransformParameterfvEXT jmp r11 -bluegl_glIsNamedStringARB endp +bluegl_glGetPixelTransformParameterfvEXT endp -extrn __blue_glCore_glNamedBufferData: qword -bluegl_glNamedBufferData proc - mov r11, __blue_glCore_glNamedBufferData +extrn __blue_glCore_glPointParameterfEXT: qword +bluegl_glPointParameterfEXT proc + mov r11, __blue_glCore_glPointParameterfEXT jmp r11 -bluegl_glNamedBufferData endp +bluegl_glPointParameterfEXT endp -extrn __blue_glCore_glFragmentLightfSGIX: qword -bluegl_glFragmentLightfSGIX proc - mov r11, __blue_glCore_glFragmentLightfSGIX +extrn __blue_glCore_glPointParameterfvEXT: qword +bluegl_glPointParameterfvEXT proc + mov r11, __blue_glCore_glPointParameterfvEXT jmp r11 -bluegl_glFragmentLightfSGIX endp +bluegl_glPointParameterfvEXT endp -extrn __blue_glCore_glProgramUniform4uiv: qword -bluegl_glProgramUniform4uiv proc - mov r11, __blue_glCore_glProgramUniform4uiv +extrn __blue_glCore_glPolygonOffsetEXT: qword +bluegl_glPolygonOffsetEXT proc + mov r11, __blue_glCore_glPolygonOffsetEXT jmp r11 -bluegl_glProgramUniform4uiv endp +bluegl_glPolygonOffsetEXT endp -extrn __blue_glCore_glPointParameteriNV: qword -bluegl_glPointParameteriNV proc - mov r11, __blue_glCore_glPointParameteriNV +extrn __blue_glCore_glPolygonOffsetClampEXT: qword +bluegl_glPolygonOffsetClampEXT proc + mov r11, __blue_glCore_glPolygonOffsetClampEXT jmp r11 -bluegl_glPointParameteriNV endp +bluegl_glPolygonOffsetClampEXT endp -extrn __blue_glCore_glNamedFramebufferReadBuffer: qword -bluegl_glNamedFramebufferReadBuffer proc - mov r11, __blue_glCore_glNamedFramebufferReadBuffer +extrn __blue_glCore_glProvokingVertexEXT: qword +bluegl_glProvokingVertexEXT proc + mov r11, __blue_glCore_glProvokingVertexEXT jmp r11 -bluegl_glNamedFramebufferReadBuffer endp +bluegl_glProvokingVertexEXT endp -extrn __blue_glCore_glPatchParameterfv: qword -bluegl_glPatchParameterfv proc - mov r11, __blue_glCore_glPatchParameterfv +extrn __blue_glCore_glRasterSamplesEXT: qword +bluegl_glRasterSamplesEXT proc + mov r11, __blue_glCore_glRasterSamplesEXT jmp r11 -bluegl_glPatchParameterfv endp +bluegl_glRasterSamplesEXT endp -extrn __blue_glCore_glVertexArrayBindingDivisor: qword -bluegl_glVertexArrayBindingDivisor proc - mov r11, __blue_glCore_glVertexArrayBindingDivisor +extrn __blue_glCore_glSecondaryColor3bEXT: qword +bluegl_glSecondaryColor3bEXT proc + mov r11, __blue_glCore_glSecondaryColor3bEXT jmp r11 -bluegl_glVertexArrayBindingDivisor endp +bluegl_glSecondaryColor3bEXT endp -extrn __blue_glCore_glDebugMessageEnableAMD: qword -bluegl_glDebugMessageEnableAMD proc - mov r11, __blue_glCore_glDebugMessageEnableAMD +extrn __blue_glCore_glSecondaryColor3bvEXT: qword +bluegl_glSecondaryColor3bvEXT proc + mov r11, __blue_glCore_glSecondaryColor3bvEXT jmp r11 -bluegl_glDebugMessageEnableAMD endp +bluegl_glSecondaryColor3bvEXT endp -extrn __blue_glCore_glGetVertexArrayIndexediv: qword -bluegl_glGetVertexArrayIndexediv proc - mov r11, __blue_glCore_glGetVertexArrayIndexediv +extrn __blue_glCore_glSecondaryColor3dEXT: qword +bluegl_glSecondaryColor3dEXT proc + mov r11, __blue_glCore_glSecondaryColor3dEXT jmp r11 -bluegl_glGetVertexArrayIndexediv endp +bluegl_glSecondaryColor3dEXT endp -extrn __blue_glCore_glGetVideoCaptureStreamdvNV: qword -bluegl_glGetVideoCaptureStreamdvNV proc - mov r11, __blue_glCore_glGetVideoCaptureStreamdvNV +extrn __blue_glCore_glSecondaryColor3dvEXT: qword +bluegl_glSecondaryColor3dvEXT proc + mov r11, __blue_glCore_glSecondaryColor3dvEXT jmp r11 -bluegl_glGetVideoCaptureStreamdvNV endp +bluegl_glSecondaryColor3dvEXT endp -extrn __blue_glCore_glAlphaFragmentOp2ATI: qword -bluegl_glAlphaFragmentOp2ATI proc - mov r11, __blue_glCore_glAlphaFragmentOp2ATI +extrn __blue_glCore_glSecondaryColor3fEXT: qword +bluegl_glSecondaryColor3fEXT proc + mov r11, __blue_glCore_glSecondaryColor3fEXT jmp r11 -bluegl_glAlphaFragmentOp2ATI endp +bluegl_glSecondaryColor3fEXT endp -extrn __blue_glCore_glVertex2hNV: qword -bluegl_glVertex2hNV proc - mov r11, __blue_glCore_glVertex2hNV +extrn __blue_glCore_glSecondaryColor3fvEXT: qword +bluegl_glSecondaryColor3fvEXT proc + mov r11, __blue_glCore_glSecondaryColor3fvEXT jmp r11 -bluegl_glVertex2hNV endp +bluegl_glSecondaryColor3fvEXT endp -extrn __blue_glCore_glCombinerParameteriNV: qword -bluegl_glCombinerParameteriNV proc - mov r11, __blue_glCore_glCombinerParameteriNV +extrn __blue_glCore_glSecondaryColor3iEXT: qword +bluegl_glSecondaryColor3iEXT proc + mov r11, __blue_glCore_glSecondaryColor3iEXT jmp r11 -bluegl_glCombinerParameteriNV endp +bluegl_glSecondaryColor3iEXT endp -extrn __blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT: qword -bluegl_glGetNamedFramebufferAttachmentParameterivEXT proc - mov r11, __blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT +extrn __blue_glCore_glSecondaryColor3ivEXT: qword +bluegl_glSecondaryColor3ivEXT proc + mov r11, __blue_glCore_glSecondaryColor3ivEXT jmp r11 -bluegl_glGetNamedFramebufferAttachmentParameterivEXT endp +bluegl_glSecondaryColor3ivEXT endp -extrn __blue_glCore_glIsVariantEnabledEXT: qword -bluegl_glIsVariantEnabledEXT proc - mov r11, __blue_glCore_glIsVariantEnabledEXT +extrn __blue_glCore_glSecondaryColor3sEXT: qword +bluegl_glSecondaryColor3sEXT proc + mov r11, __blue_glCore_glSecondaryColor3sEXT jmp r11 -bluegl_glIsVariantEnabledEXT endp +bluegl_glSecondaryColor3sEXT endp -extrn __blue_glCore_glGetVertexAttribfvNV: qword -bluegl_glGetVertexAttribfvNV proc - mov r11, __blue_glCore_glGetVertexAttribfvNV +extrn __blue_glCore_glSecondaryColor3svEXT: qword +bluegl_glSecondaryColor3svEXT proc + mov r11, __blue_glCore_glSecondaryColor3svEXT jmp r11 -bluegl_glGetVertexAttribfvNV endp +bluegl_glSecondaryColor3svEXT endp -extrn __blue_glCore_glGetProgramPipelineiv: qword -bluegl_glGetProgramPipelineiv proc - mov r11, __blue_glCore_glGetProgramPipelineiv +extrn __blue_glCore_glSecondaryColor3ubEXT: qword +bluegl_glSecondaryColor3ubEXT proc + mov r11, __blue_glCore_glSecondaryColor3ubEXT jmp r11 -bluegl_glGetProgramPipelineiv endp +bluegl_glSecondaryColor3ubEXT endp -extrn __blue_glCore_glUnmapBufferARB: qword -bluegl_glUnmapBufferARB proc - mov r11, __blue_glCore_glUnmapBufferARB +extrn __blue_glCore_glSecondaryColor3ubvEXT: qword +bluegl_glSecondaryColor3ubvEXT proc + mov r11, __blue_glCore_glSecondaryColor3ubvEXT jmp r11 -bluegl_glUnmapBufferARB endp +bluegl_glSecondaryColor3ubvEXT endp -extrn __blue_glCore_glVertexAttribPointerNV: qword -bluegl_glVertexAttribPointerNV proc - mov r11, __blue_glCore_glVertexAttribPointerNV +extrn __blue_glCore_glSecondaryColor3uiEXT: qword +bluegl_glSecondaryColor3uiEXT proc + mov r11, __blue_glCore_glSecondaryColor3uiEXT jmp r11 -bluegl_glVertexAttribPointerNV endp +bluegl_glSecondaryColor3uiEXT endp -extrn __blue_glCore_glGetPathSpacingNV: qword -bluegl_glGetPathSpacingNV proc - mov r11, __blue_glCore_glGetPathSpacingNV +extrn __blue_glCore_glSecondaryColor3uivEXT: qword +bluegl_glSecondaryColor3uivEXT proc + mov r11, __blue_glCore_glSecondaryColor3uivEXT jmp r11 -bluegl_glGetPathSpacingNV endp +bluegl_glSecondaryColor3uivEXT endp -extrn __blue_glCore_glMaterialxOES: qword -bluegl_glMaterialxOES proc - mov r11, __blue_glCore_glMaterialxOES +extrn __blue_glCore_glSecondaryColor3usEXT: qword +bluegl_glSecondaryColor3usEXT proc + mov r11, __blue_glCore_glSecondaryColor3usEXT jmp r11 -bluegl_glMaterialxOES endp +bluegl_glSecondaryColor3usEXT endp -extrn __blue_glCore_glVertexStream3fvATI: qword -bluegl_glVertexStream3fvATI proc - mov r11, __blue_glCore_glVertexStream3fvATI +extrn __blue_glCore_glSecondaryColor3usvEXT: qword +bluegl_glSecondaryColor3usvEXT proc + mov r11, __blue_glCore_glSecondaryColor3usvEXT jmp r11 -bluegl_glVertexStream3fvATI endp +bluegl_glSecondaryColor3usvEXT endp -extrn __blue_glCore_glVertexStream4dATI: qword -bluegl_glVertexStream4dATI proc - mov r11, __blue_glCore_glVertexStream4dATI +extrn __blue_glCore_glSecondaryColorPointerEXT: qword +bluegl_glSecondaryColorPointerEXT proc + mov r11, __blue_glCore_glSecondaryColorPointerEXT jmp r11 -bluegl_glVertexStream4dATI endp +bluegl_glSecondaryColorPointerEXT endp -extrn __blue_glCore_glVertexAttrib2d: qword -bluegl_glVertexAttrib2d proc - mov r11, __blue_glCore_glVertexAttrib2d +extrn __blue_glCore_glUseShaderProgramEXT: qword +bluegl_glUseShaderProgramEXT proc + mov r11, __blue_glCore_glUseShaderProgramEXT jmp r11 -bluegl_glVertexAttrib2d endp +bluegl_glUseShaderProgramEXT endp -extrn __blue_glCore_glStencilMaskSeparate: qword -bluegl_glStencilMaskSeparate proc - mov r11, __blue_glCore_glStencilMaskSeparate +extrn __blue_glCore_glActiveProgramEXT: qword +bluegl_glActiveProgramEXT proc + mov r11, __blue_glCore_glActiveProgramEXT jmp r11 -bluegl_glStencilMaskSeparate endp +bluegl_glActiveProgramEXT endp -extrn __blue_glCore_glTestFenceAPPLE: qword -bluegl_glTestFenceAPPLE proc - mov r11, __blue_glCore_glTestFenceAPPLE +extrn __blue_glCore_glCreateShaderProgramEXT: qword +bluegl_glCreateShaderProgramEXT proc + mov r11, __blue_glCore_glCreateShaderProgramEXT jmp r11 -bluegl_glTestFenceAPPLE endp +bluegl_glCreateShaderProgramEXT endp -extrn __blue_glCore_glBindMaterialParameterEXT: qword -bluegl_glBindMaterialParameterEXT proc - mov r11, __blue_glCore_glBindMaterialParameterEXT +extrn __blue_glCore_glBindImageTextureEXT: qword +bluegl_glBindImageTextureEXT proc + mov r11, __blue_glCore_glBindImageTextureEXT jmp r11 -bluegl_glBindMaterialParameterEXT endp +bluegl_glBindImageTextureEXT endp -extrn __blue_glCore_glBlendEquationEXT: qword -bluegl_glBlendEquationEXT proc - mov r11, __blue_glCore_glBlendEquationEXT +extrn __blue_glCore_glMemoryBarrierEXT: qword +bluegl_glMemoryBarrierEXT proc + mov r11, __blue_glCore_glMemoryBarrierEXT jmp r11 -bluegl_glBlendEquationEXT endp +bluegl_glMemoryBarrierEXT endp -extrn __blue_glCore_glMultiTexCoord4hNV: qword -bluegl_glMultiTexCoord4hNV proc - mov r11, __blue_glCore_glMultiTexCoord4hNV +extrn __blue_glCore_glStencilClearTagEXT: qword +bluegl_glStencilClearTagEXT proc + mov r11, __blue_glCore_glStencilClearTagEXT jmp r11 -bluegl_glMultiTexCoord4hNV endp +bluegl_glStencilClearTagEXT endp -extrn __blue_glCore_glMultiTexCoord1fARB: qword -bluegl_glMultiTexCoord1fARB proc - mov r11, __blue_glCore_glMultiTexCoord1fARB +extrn __blue_glCore_glActiveStencilFaceEXT: qword +bluegl_glActiveStencilFaceEXT proc + mov r11, __blue_glCore_glActiveStencilFaceEXT jmp r11 -bluegl_glMultiTexCoord1fARB endp +bluegl_glActiveStencilFaceEXT endp -extrn __blue_glCore_glPrioritizeTexturesxOES: qword -bluegl_glPrioritizeTexturesxOES proc - mov r11, __blue_glCore_glPrioritizeTexturesxOES +extrn __blue_glCore_glTexSubImage1DEXT: qword +bluegl_glTexSubImage1DEXT proc + mov r11, __blue_glCore_glTexSubImage1DEXT jmp r11 -bluegl_glPrioritizeTexturesxOES endp +bluegl_glTexSubImage1DEXT endp -extrn __blue_glCore_glVertexAttribs1fvNV: qword -bluegl_glVertexAttribs1fvNV proc - mov r11, __blue_glCore_glVertexAttribs1fvNV +extrn __blue_glCore_glTexSubImage2DEXT: qword +bluegl_glTexSubImage2DEXT proc + mov r11, __blue_glCore_glTexSubImage2DEXT jmp r11 -bluegl_glVertexAttribs1fvNV endp +bluegl_glTexSubImage2DEXT endp -extrn __blue_glCore_glGetInternalformati64v: qword -bluegl_glGetInternalformati64v proc - mov r11, __blue_glCore_glGetInternalformati64v +extrn __blue_glCore_glTexImage3DEXT: qword +bluegl_glTexImage3DEXT proc + mov r11, __blue_glCore_glTexImage3DEXT jmp r11 -bluegl_glGetInternalformati64v endp +bluegl_glTexImage3DEXT endp -extrn __blue_glCore_glDisableVertexAttribAPPLE: qword -bluegl_glDisableVertexAttribAPPLE proc - mov r11, __blue_glCore_glDisableVertexAttribAPPLE +extrn __blue_glCore_glTexSubImage3DEXT: qword +bluegl_glTexSubImage3DEXT proc + mov r11, __blue_glCore_glTexSubImage3DEXT jmp r11 -bluegl_glDisableVertexAttribAPPLE endp +bluegl_glTexSubImage3DEXT endp -extrn __blue_glCore_glVertexStream3sATI: qword -bluegl_glVertexStream3sATI proc - mov r11, __blue_glCore_glVertexStream3sATI +extrn __blue_glCore_glFramebufferTextureLayerEXT: qword +bluegl_glFramebufferTextureLayerEXT proc + mov r11, __blue_glCore_glFramebufferTextureLayerEXT jmp r11 -bluegl_glVertexStream3sATI endp +bluegl_glFramebufferTextureLayerEXT endp -extrn __blue_glCore_glCheckFramebufferStatusEXT: qword -bluegl_glCheckFramebufferStatusEXT proc - mov r11, __blue_glCore_glCheckFramebufferStatusEXT +extrn __blue_glCore_glTexBufferEXT: qword +bluegl_glTexBufferEXT proc + mov r11, __blue_glCore_glTexBufferEXT jmp r11 -bluegl_glCheckFramebufferStatusEXT endp +bluegl_glTexBufferEXT endp -extrn __blue_glCore_glGetMinmax: qword -bluegl_glGetMinmax proc - mov r11, __blue_glCore_glGetMinmax +extrn __blue_glCore_glTexParameterIivEXT: qword +bluegl_glTexParameterIivEXT proc + mov r11, __blue_glCore_glTexParameterIivEXT jmp r11 -bluegl_glGetMinmax endp +bluegl_glTexParameterIivEXT endp -extrn __blue_glCore_glCopyTexSubImage3DEXT: qword -bluegl_glCopyTexSubImage3DEXT proc - mov r11, __blue_glCore_glCopyTexSubImage3DEXT +extrn __blue_glCore_glTexParameterIuivEXT: qword +bluegl_glTexParameterIuivEXT proc + mov r11, __blue_glCore_glTexParameterIuivEXT jmp r11 -bluegl_glCopyTexSubImage3DEXT endp +bluegl_glTexParameterIuivEXT endp -extrn __blue_glCore_glUniform1ivARB: qword -bluegl_glUniform1ivARB proc - mov r11, __blue_glCore_glUniform1ivARB +extrn __blue_glCore_glGetTexParameterIivEXT: qword +bluegl_glGetTexParameterIivEXT proc + mov r11, __blue_glCore_glGetTexParameterIivEXT jmp r11 -bluegl_glUniform1ivARB endp +bluegl_glGetTexParameterIivEXT endp -extrn __blue_glCore_glColorP4uiv: qword -bluegl_glColorP4uiv proc - mov r11, __blue_glCore_glColorP4uiv +extrn __blue_glCore_glGetTexParameterIuivEXT: qword +bluegl_glGetTexParameterIuivEXT proc + mov r11, __blue_glCore_glGetTexParameterIuivEXT jmp r11 -bluegl_glColorP4uiv endp +bluegl_glGetTexParameterIuivEXT endp -extrn __blue_glCore_glDisableVertexAttribArrayARB: qword -bluegl_glDisableVertexAttribArrayARB proc - mov r11, __blue_glCore_glDisableVertexAttribArrayARB +extrn __blue_glCore_glClearColorIiEXT: qword +bluegl_glClearColorIiEXT proc + mov r11, __blue_glCore_glClearColorIiEXT jmp r11 -bluegl_glDisableVertexAttribArrayARB endp +bluegl_glClearColorIiEXT endp -extrn __blue_glCore_glNamedProgramLocalParameter4fvEXT: qword -bluegl_glNamedProgramLocalParameter4fvEXT proc - mov r11, __blue_glCore_glNamedProgramLocalParameter4fvEXT +extrn __blue_glCore_glClearColorIuiEXT: qword +bluegl_glClearColorIuiEXT proc + mov r11, __blue_glCore_glClearColorIuiEXT jmp r11 -bluegl_glNamedProgramLocalParameter4fvEXT endp +bluegl_glClearColorIuiEXT endp -extrn __blue_glCore_glBlendFuncSeparateEXT: qword -bluegl_glBlendFuncSeparateEXT proc - mov r11, __blue_glCore_glBlendFuncSeparateEXT +extrn __blue_glCore_glAreTexturesResidentEXT: qword +bluegl_glAreTexturesResidentEXT proc + mov r11, __blue_glCore_glAreTexturesResidentEXT jmp r11 -bluegl_glBlendFuncSeparateEXT endp +bluegl_glAreTexturesResidentEXT endp -extrn __blue_glCore_glVertexAttribL3i64NV: qword -bluegl_glVertexAttribL3i64NV proc - mov r11, __blue_glCore_glVertexAttribL3i64NV +extrn __blue_glCore_glBindTextureEXT: qword +bluegl_glBindTextureEXT proc + mov r11, __blue_glCore_glBindTextureEXT jmp r11 -bluegl_glVertexAttribL3i64NV endp +bluegl_glBindTextureEXT endp -extrn __blue_glCore_glBindProgramPipeline: qword -bluegl_glBindProgramPipeline proc - mov r11, __blue_glCore_glBindProgramPipeline +extrn __blue_glCore_glDeleteTexturesEXT: qword +bluegl_glDeleteTexturesEXT proc + mov r11, __blue_glCore_glDeleteTexturesEXT jmp r11 -bluegl_glBindProgramPipeline endp +bluegl_glDeleteTexturesEXT endp -extrn __blue_glCore_glCreateProgramPipelines: qword -bluegl_glCreateProgramPipelines proc - mov r11, __blue_glCore_glCreateProgramPipelines +extrn __blue_glCore_glGenTexturesEXT: qword +bluegl_glGenTexturesEXT proc + mov r11, __blue_glCore_glGenTexturesEXT jmp r11 -bluegl_glCreateProgramPipelines endp +bluegl_glGenTexturesEXT endp -extrn __blue_glCore_glDeleteRenderbuffersEXT: qword -bluegl_glDeleteRenderbuffersEXT proc - mov r11, __blue_glCore_glDeleteRenderbuffersEXT +extrn __blue_glCore_glIsTextureEXT: qword +bluegl_glIsTextureEXT proc + mov r11, __blue_glCore_glIsTextureEXT jmp r11 -bluegl_glDeleteRenderbuffersEXT endp +bluegl_glIsTextureEXT endp -extrn __blue_glCore_glEdgeFlagFormatNV: qword -bluegl_glEdgeFlagFormatNV proc - mov r11, __blue_glCore_glEdgeFlagFormatNV +extrn __blue_glCore_glPrioritizeTexturesEXT: qword +bluegl_glPrioritizeTexturesEXT proc + mov r11, __blue_glCore_glPrioritizeTexturesEXT jmp r11 -bluegl_glEdgeFlagFormatNV endp +bluegl_glPrioritizeTexturesEXT endp -extrn __blue_glCore_glGetActiveUniformBlockiv: qword -bluegl_glGetActiveUniformBlockiv proc - mov r11, __blue_glCore_glGetActiveUniformBlockiv +extrn __blue_glCore_glTextureNormalEXT: qword +bluegl_glTextureNormalEXT proc + mov r11, __blue_glCore_glTextureNormalEXT jmp r11 -bluegl_glGetActiveUniformBlockiv endp +bluegl_glTextureNormalEXT endp -extrn __blue_glCore_glProgramUniform3f: qword -bluegl_glProgramUniform3f proc - mov r11, __blue_glCore_glProgramUniform3f +extrn __blue_glCore_glGetQueryObjecti64vEXT: qword +bluegl_glGetQueryObjecti64vEXT proc + mov r11, __blue_glCore_glGetQueryObjecti64vEXT jmp r11 -bluegl_glProgramUniform3f endp +bluegl_glGetQueryObjecti64vEXT endp -extrn __blue_glCore_glDrawCommandsStatesAddressNV: qword -bluegl_glDrawCommandsStatesAddressNV proc - mov r11, __blue_glCore_glDrawCommandsStatesAddressNV +extrn __blue_glCore_glGetQueryObjectui64vEXT: qword +bluegl_glGetQueryObjectui64vEXT proc + mov r11, __blue_glCore_glGetQueryObjectui64vEXT jmp r11 -bluegl_glDrawCommandsStatesAddressNV endp +bluegl_glGetQueryObjectui64vEXT endp -extrn __blue_glCore_glGetVertexAttribfv: qword -bluegl_glGetVertexAttribfv proc - mov r11, __blue_glCore_glGetVertexAttribfv +extrn __blue_glCore_glBeginTransformFeedbackEXT: qword +bluegl_glBeginTransformFeedbackEXT proc + mov r11, __blue_glCore_glBeginTransformFeedbackEXT jmp r11 -bluegl_glGetVertexAttribfv endp +bluegl_glBeginTransformFeedbackEXT endp -extrn __blue_glCore_glGetVariantArrayObjectivATI: qword -bluegl_glGetVariantArrayObjectivATI proc - mov r11, __blue_glCore_glGetVariantArrayObjectivATI +extrn __blue_glCore_glEndTransformFeedbackEXT: qword +bluegl_glEndTransformFeedbackEXT proc + mov r11, __blue_glCore_glEndTransformFeedbackEXT jmp r11 -bluegl_glGetVariantArrayObjectivATI endp +bluegl_glEndTransformFeedbackEXT endp -extrn __blue_glCore_glNamedProgramLocalParameter4dEXT: qword -bluegl_glNamedProgramLocalParameter4dEXT proc - mov r11, __blue_glCore_glNamedProgramLocalParameter4dEXT +extrn __blue_glCore_glBindBufferRangeEXT: qword +bluegl_glBindBufferRangeEXT proc + mov r11, __blue_glCore_glBindBufferRangeEXT jmp r11 -bluegl_glNamedProgramLocalParameter4dEXT endp +bluegl_glBindBufferRangeEXT endp -extrn __blue_glCore_glGenTransformFeedbacksNV: qword -bluegl_glGenTransformFeedbacksNV proc - mov r11, __blue_glCore_glGenTransformFeedbacksNV +extrn __blue_glCore_glBindBufferOffsetEXT: qword +bluegl_glBindBufferOffsetEXT proc + mov r11, __blue_glCore_glBindBufferOffsetEXT jmp r11 -bluegl_glGenTransformFeedbacksNV endp +bluegl_glBindBufferOffsetEXT endp -extrn __blue_glCore_glDrawElementArrayAPPLE: qword -bluegl_glDrawElementArrayAPPLE proc - mov r11, __blue_glCore_glDrawElementArrayAPPLE +extrn __blue_glCore_glBindBufferBaseEXT: qword +bluegl_glBindBufferBaseEXT proc + mov r11, __blue_glCore_glBindBufferBaseEXT jmp r11 -bluegl_glDrawElementArrayAPPLE endp +bluegl_glBindBufferBaseEXT endp -extrn __blue_glCore_glVertexAttrib4NusvARB: qword -bluegl_glVertexAttrib4NusvARB proc - mov r11, __blue_glCore_glVertexAttrib4NusvARB +extrn __blue_glCore_glTransformFeedbackVaryingsEXT: qword +bluegl_glTransformFeedbackVaryingsEXT proc + mov r11, __blue_glCore_glTransformFeedbackVaryingsEXT jmp r11 -bluegl_glVertexAttrib4NusvARB endp +bluegl_glTransformFeedbackVaryingsEXT endp -extrn __blue_glCore_glBindRenderbufferEXT: qword -bluegl_glBindRenderbufferEXT proc - mov r11, __blue_glCore_glBindRenderbufferEXT +extrn __blue_glCore_glGetTransformFeedbackVaryingEXT: qword +bluegl_glGetTransformFeedbackVaryingEXT proc + mov r11, __blue_glCore_glGetTransformFeedbackVaryingEXT jmp r11 -bluegl_glBindRenderbufferEXT endp +bluegl_glGetTransformFeedbackVaryingEXT endp -extrn __blue_glCore_glUnmapTexture2DINTEL: qword -bluegl_glUnmapTexture2DINTEL proc - mov r11, __blue_glCore_glUnmapTexture2DINTEL +extrn __blue_glCore_glArrayElementEXT: qword +bluegl_glArrayElementEXT proc + mov r11, __blue_glCore_glArrayElementEXT jmp r11 -bluegl_glUnmapTexture2DINTEL endp +bluegl_glArrayElementEXT endp -extrn __blue_glCore_glGetProgramEnvParameterfvARB: qword -bluegl_glGetProgramEnvParameterfvARB proc - mov r11, __blue_glCore_glGetProgramEnvParameterfvARB +extrn __blue_glCore_glColorPointerEXT: qword +bluegl_glColorPointerEXT proc + mov r11, __blue_glCore_glColorPointerEXT jmp r11 -bluegl_glGetProgramEnvParameterfvARB endp +bluegl_glColorPointerEXT endp -extrn __blue_glCore_glVertexAttrib4f: qword -bluegl_glVertexAttrib4f proc - mov r11, __blue_glCore_glVertexAttrib4f +extrn __blue_glCore_glDrawArraysEXT: qword +bluegl_glDrawArraysEXT proc + mov r11, __blue_glCore_glDrawArraysEXT jmp r11 -bluegl_glVertexAttrib4f endp +bluegl_glDrawArraysEXT endp -extrn __blue_glCore_glGetnPixelMapfv: qword -bluegl_glGetnPixelMapfv proc - mov r11, __blue_glCore_glGetnPixelMapfv +extrn __blue_glCore_glEdgeFlagPointerEXT: qword +bluegl_glEdgeFlagPointerEXT proc + mov r11, __blue_glCore_glEdgeFlagPointerEXT jmp r11 -bluegl_glGetnPixelMapfv endp +bluegl_glEdgeFlagPointerEXT endp -extrn __blue_glCore_glVertexAttrib3dv: qword -bluegl_glVertexAttrib3dv proc - mov r11, __blue_glCore_glVertexAttrib3dv +extrn __blue_glCore_glGetPointervEXT: qword +bluegl_glGetPointervEXT proc + mov r11, __blue_glCore_glGetPointervEXT jmp r11 -bluegl_glVertexAttrib3dv endp +bluegl_glGetPointervEXT endp -extrn __blue_glCore_glFlushMappedBufferRange: qword -bluegl_glFlushMappedBufferRange proc - mov r11, __blue_glCore_glFlushMappedBufferRange +extrn __blue_glCore_glIndexPointerEXT: qword +bluegl_glIndexPointerEXT proc + mov r11, __blue_glCore_glIndexPointerEXT jmp r11 -bluegl_glFlushMappedBufferRange endp +bluegl_glIndexPointerEXT endp -extrn __blue_glCore_glSecondaryColor3ub: qword -bluegl_glSecondaryColor3ub proc - mov r11, __blue_glCore_glSecondaryColor3ub +extrn __blue_glCore_glNormalPointerEXT: qword +bluegl_glNormalPointerEXT proc + mov r11, __blue_glCore_glNormalPointerEXT jmp r11 -bluegl_glSecondaryColor3ub endp +bluegl_glNormalPointerEXT endp -extrn __blue_glCore_glGetPerfQueryDataINTEL: qword -bluegl_glGetPerfQueryDataINTEL proc - mov r11, __blue_glCore_glGetPerfQueryDataINTEL +extrn __blue_glCore_glTexCoordPointerEXT: qword +bluegl_glTexCoordPointerEXT proc + mov r11, __blue_glCore_glTexCoordPointerEXT jmp r11 -bluegl_glGetPerfQueryDataINTEL endp +bluegl_glTexCoordPointerEXT endp -extrn __blue_glCore_glGetnMapivARB: qword -bluegl_glGetnMapivARB proc - mov r11, __blue_glCore_glGetnMapivARB +extrn __blue_glCore_glVertexPointerEXT: qword +bluegl_glVertexPointerEXT proc + mov r11, __blue_glCore_glVertexPointerEXT jmp r11 -bluegl_glGetnMapivARB endp +bluegl_glVertexPointerEXT endp -extrn __blue_glCore_glSeparableFilter2DEXT: qword -bluegl_glSeparableFilter2DEXT proc - mov r11, __blue_glCore_glSeparableFilter2DEXT +extrn __blue_glCore_glVertexAttribL1dEXT: qword +bluegl_glVertexAttribL1dEXT proc + mov r11, __blue_glCore_glVertexAttribL1dEXT jmp r11 -bluegl_glSeparableFilter2DEXT endp +bluegl_glVertexAttribL1dEXT endp -extrn __blue_glCore_glProgramUniformMatrix3x2fvEXT: qword -bluegl_glProgramUniformMatrix3x2fvEXT proc - mov r11, __blue_glCore_glProgramUniformMatrix3x2fvEXT +extrn __blue_glCore_glVertexAttribL2dEXT: qword +bluegl_glVertexAttribL2dEXT proc + mov r11, __blue_glCore_glVertexAttribL2dEXT jmp r11 -bluegl_glProgramUniformMatrix3x2fvEXT endp +bluegl_glVertexAttribL2dEXT endp -extrn __blue_glCore_glGenVertexArrays: qword -bluegl_glGenVertexArrays proc - mov r11, __blue_glCore_glGenVertexArrays +extrn __blue_glCore_glVertexAttribL3dEXT: qword +bluegl_glVertexAttribL3dEXT proc + mov r11, __blue_glCore_glVertexAttribL3dEXT jmp r11 -bluegl_glGenVertexArrays endp +bluegl_glVertexAttribL3dEXT endp -extrn __blue_glCore_glEndQueryARB: qword -bluegl_glEndQueryARB proc - mov r11, __blue_glCore_glEndQueryARB +extrn __blue_glCore_glVertexAttribL4dEXT: qword +bluegl_glVertexAttribL4dEXT proc + mov r11, __blue_glCore_glVertexAttribL4dEXT jmp r11 -bluegl_glEndQueryARB endp +bluegl_glVertexAttribL4dEXT endp -extrn __blue_glCore_glVertexAttrib2fv: qword -bluegl_glVertexAttrib2fv proc - mov r11, __blue_glCore_glVertexAttrib2fv +extrn __blue_glCore_glVertexAttribL1dvEXT: qword +bluegl_glVertexAttribL1dvEXT proc + mov r11, __blue_glCore_glVertexAttribL1dvEXT jmp r11 -bluegl_glVertexAttrib2fv endp +bluegl_glVertexAttribL1dvEXT endp -extrn __blue_glCore_glWindowPos2fv: qword -bluegl_glWindowPos2fv proc - mov r11, __blue_glCore_glWindowPos2fv +extrn __blue_glCore_glVertexAttribL2dvEXT: qword +bluegl_glVertexAttribL2dvEXT proc + mov r11, __blue_glCore_glVertexAttribL2dvEXT jmp r11 -bluegl_glWindowPos2fv endp +bluegl_glVertexAttribL2dvEXT endp -extrn __blue_glCore_glCopyConvolutionFilter1D: qword -bluegl_glCopyConvolutionFilter1D proc - mov r11, __blue_glCore_glCopyConvolutionFilter1D +extrn __blue_glCore_glVertexAttribL3dvEXT: qword +bluegl_glVertexAttribL3dvEXT proc + mov r11, __blue_glCore_glVertexAttribL3dvEXT jmp r11 -bluegl_glCopyConvolutionFilter1D endp +bluegl_glVertexAttribL3dvEXT endp -extrn __blue_glCore_glTexCoordFormatNV: qword -bluegl_glTexCoordFormatNV proc - mov r11, __blue_glCore_glTexCoordFormatNV +extrn __blue_glCore_glVertexAttribL4dvEXT: qword +bluegl_glVertexAttribL4dvEXT proc + mov r11, __blue_glCore_glVertexAttribL4dvEXT jmp r11 -bluegl_glTexCoordFormatNV endp +bluegl_glVertexAttribL4dvEXT endp -extrn __blue_glCore_glMultiTexCoordP2uiv: qword -bluegl_glMultiTexCoordP2uiv proc - mov r11, __blue_glCore_glMultiTexCoordP2uiv +extrn __blue_glCore_glVertexAttribLPointerEXT: qword +bluegl_glVertexAttribLPointerEXT proc + mov r11, __blue_glCore_glVertexAttribLPointerEXT jmp r11 -bluegl_glMultiTexCoordP2uiv endp +bluegl_glVertexAttribLPointerEXT endp -extrn __blue_glCore_glProgramUniform1ui64vARB: qword -bluegl_glProgramUniform1ui64vARB proc - mov r11, __blue_glCore_glProgramUniform1ui64vARB +extrn __blue_glCore_glGetVertexAttribLdvEXT: qword +bluegl_glGetVertexAttribLdvEXT proc + mov r11, __blue_glCore_glGetVertexAttribLdvEXT jmp r11 -bluegl_glProgramUniform1ui64vARB endp +bluegl_glGetVertexAttribLdvEXT endp -extrn __blue_glCore_glColorSubTable: qword -bluegl_glColorSubTable proc - mov r11, __blue_glCore_glColorSubTable +extrn __blue_glCore_glBeginVertexShaderEXT: qword +bluegl_glBeginVertexShaderEXT proc + mov r11, __blue_glCore_glBeginVertexShaderEXT jmp r11 -bluegl_glColorSubTable endp +bluegl_glBeginVertexShaderEXT endp -extrn __blue_glCore_glNamedBufferSubData: qword -bluegl_glNamedBufferSubData proc - mov r11, __blue_glCore_glNamedBufferSubData +extrn __blue_glCore_glEndVertexShaderEXT: qword +bluegl_glEndVertexShaderEXT proc + mov r11, __blue_glCore_glEndVertexShaderEXT jmp r11 -bluegl_glNamedBufferSubData endp +bluegl_glEndVertexShaderEXT endp -extrn __blue_glCore_glGetCompressedTextureImage: qword -bluegl_glGetCompressedTextureImage proc - mov r11, __blue_glCore_glGetCompressedTextureImage +extrn __blue_glCore_glBindVertexShaderEXT: qword +bluegl_glBindVertexShaderEXT proc + mov r11, __blue_glCore_glBindVertexShaderEXT jmp r11 -bluegl_glGetCompressedTextureImage endp +bluegl_glBindVertexShaderEXT endp -extrn __blue_glCore_glNamedCopyBufferSubDataEXT: qword -bluegl_glNamedCopyBufferSubDataEXT proc - mov r11, __blue_glCore_glNamedCopyBufferSubDataEXT +extrn __blue_glCore_glGenVertexShadersEXT: qword +bluegl_glGenVertexShadersEXT proc + mov r11, __blue_glCore_glGenVertexShadersEXT jmp r11 -bluegl_glNamedCopyBufferSubDataEXT endp +bluegl_glGenVertexShadersEXT endp -extrn __blue_glCore_glVertexAttribL1i64NV: qword -bluegl_glVertexAttribL1i64NV proc - mov r11, __blue_glCore_glVertexAttribL1i64NV +extrn __blue_glCore_glDeleteVertexShaderEXT: qword +bluegl_glDeleteVertexShaderEXT proc + mov r11, __blue_glCore_glDeleteVertexShaderEXT jmp r11 -bluegl_glVertexAttribL1i64NV endp +bluegl_glDeleteVertexShaderEXT endp -extrn __blue_glCore_glVertexArrayMultiTexCoordOffsetEXT: qword -bluegl_glVertexArrayMultiTexCoordOffsetEXT proc - mov r11, __blue_glCore_glVertexArrayMultiTexCoordOffsetEXT +extrn __blue_glCore_glShaderOp1EXT: qword +bluegl_glShaderOp1EXT proc + mov r11, __blue_glCore_glShaderOp1EXT jmp r11 -bluegl_glVertexArrayMultiTexCoordOffsetEXT endp +bluegl_glShaderOp1EXT endp -extrn __blue_glCore_glGetUniformIndices: qword -bluegl_glGetUniformIndices proc - mov r11, __blue_glCore_glGetUniformIndices +extrn __blue_glCore_glShaderOp2EXT: qword +bluegl_glShaderOp2EXT proc + mov r11, __blue_glCore_glShaderOp2EXT jmp r11 -bluegl_glGetUniformIndices endp +bluegl_glShaderOp2EXT endp -extrn __blue_glCore_glDrawArraysInstancedARB: qword -bluegl_glDrawArraysInstancedARB proc - mov r11, __blue_glCore_glDrawArraysInstancedARB +extrn __blue_glCore_glShaderOp3EXT: qword +bluegl_glShaderOp3EXT proc + mov r11, __blue_glCore_glShaderOp3EXT jmp r11 -bluegl_glDrawArraysInstancedARB endp +bluegl_glShaderOp3EXT endp -extrn __blue_glCore_glGetMultiTexGenivEXT: qword -bluegl_glGetMultiTexGenivEXT proc - mov r11, __blue_glCore_glGetMultiTexGenivEXT +extrn __blue_glCore_glSwizzleEXT: qword +bluegl_glSwizzleEXT proc + mov r11, __blue_glCore_glSwizzleEXT jmp r11 -bluegl_glGetMultiTexGenivEXT endp +bluegl_glSwizzleEXT endp -extrn __blue_glCore_glGetVertexArrayPointervEXT: qword -bluegl_glGetVertexArrayPointervEXT proc - mov r11, __blue_glCore_glGetVertexArrayPointervEXT +extrn __blue_glCore_glWriteMaskEXT: qword +bluegl_glWriteMaskEXT proc + mov r11, __blue_glCore_glWriteMaskEXT jmp r11 -bluegl_glGetVertexArrayPointervEXT endp +bluegl_glWriteMaskEXT endp -extrn __blue_glCore_glBeginQuery: qword -bluegl_glBeginQuery proc - mov r11, __blue_glCore_glBeginQuery +extrn __blue_glCore_glInsertComponentEXT: qword +bluegl_glInsertComponentEXT proc + mov r11, __blue_glCore_glInsertComponentEXT jmp r11 -bluegl_glBeginQuery endp +bluegl_glInsertComponentEXT endp -extrn __blue_glCore_glDetachObjectARB: qword -bluegl_glDetachObjectARB proc - mov r11, __blue_glCore_glDetachObjectARB +extrn __blue_glCore_glExtractComponentEXT: qword +bluegl_glExtractComponentEXT proc + mov r11, __blue_glCore_glExtractComponentEXT jmp r11 -bluegl_glDetachObjectARB endp +bluegl_glExtractComponentEXT endp -extrn __blue_glCore_glUniform4iv: qword -bluegl_glUniform4iv proc - mov r11, __blue_glCore_glUniform4iv +extrn __blue_glCore_glGenSymbolsEXT: qword +bluegl_glGenSymbolsEXT proc + mov r11, __blue_glCore_glGenSymbolsEXT jmp r11 -bluegl_glUniform4iv endp +bluegl_glGenSymbolsEXT endp -extrn __blue_glCore_glGetQueryObjectuiv: qword -bluegl_glGetQueryObjectuiv proc - mov r11, __blue_glCore_glGetQueryObjectuiv +extrn __blue_glCore_glSetInvariantEXT: qword +bluegl_glSetInvariantEXT proc + mov r11, __blue_glCore_glSetInvariantEXT jmp r11 -bluegl_glGetQueryObjectuiv endp +bluegl_glSetInvariantEXT endp -extrn __blue_glCore_glGetObjectBufferivATI: qword -bluegl_glGetObjectBufferivATI proc - mov r11, __blue_glCore_glGetObjectBufferivATI +extrn __blue_glCore_glSetLocalConstantEXT: qword +bluegl_glSetLocalConstantEXT proc + mov r11, __blue_glCore_glSetLocalConstantEXT jmp r11 -bluegl_glGetObjectBufferivATI endp +bluegl_glSetLocalConstantEXT endp -extrn __blue_glCore_glCreateTransformFeedbacks: qword -bluegl_glCreateTransformFeedbacks proc - mov r11, __blue_glCore_glCreateTransformFeedbacks +extrn __blue_glCore_glVariantbvEXT: qword +bluegl_glVariantbvEXT proc + mov r11, __blue_glCore_glVariantbvEXT jmp r11 -bluegl_glCreateTransformFeedbacks endp +bluegl_glVariantbvEXT endp -extrn __blue_glCore_glVertexStream3dATI: qword -bluegl_glVertexStream3dATI proc - mov r11, __blue_glCore_glVertexStream3dATI +extrn __blue_glCore_glVariantsvEXT: qword +bluegl_glVariantsvEXT proc + mov r11, __blue_glCore_glVariantsvEXT jmp r11 -bluegl_glVertexStream3dATI endp +bluegl_glVariantsvEXT endp -extrn __blue_glCore_glEvalMapsNV: qword -bluegl_glEvalMapsNV proc - mov r11, __blue_glCore_glEvalMapsNV +extrn __blue_glCore_glVariantivEXT: qword +bluegl_glVariantivEXT proc + mov r11, __blue_glCore_glVariantivEXT jmp r11 -bluegl_glEvalMapsNV endp +bluegl_glVariantivEXT endp -extrn __blue_glCore_glIsNameAMD: qword -bluegl_glIsNameAMD proc - mov r11, __blue_glCore_glIsNameAMD +extrn __blue_glCore_glVariantfvEXT: qword +bluegl_glVariantfvEXT proc + mov r11, __blue_glCore_glVariantfvEXT jmp r11 -bluegl_glIsNameAMD endp +bluegl_glVariantfvEXT endp -extrn __blue_glCore_glVertexAttrib4ivARB: qword -bluegl_glVertexAttrib4ivARB proc - mov r11, __blue_glCore_glVertexAttrib4ivARB +extrn __blue_glCore_glVariantdvEXT: qword +bluegl_glVariantdvEXT proc + mov r11, __blue_glCore_glVariantdvEXT jmp r11 -bluegl_glVertexAttrib4ivARB endp +bluegl_glVariantdvEXT endp -extrn __blue_glCore_glGetProgramSubroutineParameteruivNV: qword -bluegl_glGetProgramSubroutineParameteruivNV proc - mov r11, __blue_glCore_glGetProgramSubroutineParameteruivNV +extrn __blue_glCore_glVariantubvEXT: qword +bluegl_glVariantubvEXT proc + mov r11, __blue_glCore_glVariantubvEXT jmp r11 -bluegl_glGetProgramSubroutineParameteruivNV endp +bluegl_glVariantubvEXT endp -extrn __blue_glCore_glProgramUniformMatrix2x4dv: qword -bluegl_glProgramUniformMatrix2x4dv proc - mov r11, __blue_glCore_glProgramUniformMatrix2x4dv +extrn __blue_glCore_glVariantusvEXT: qword +bluegl_glVariantusvEXT proc + mov r11, __blue_glCore_glVariantusvEXT jmp r11 -bluegl_glProgramUniformMatrix2x4dv endp +bluegl_glVariantusvEXT endp -extrn __blue_glCore_glBeginPerfQueryINTEL: qword -bluegl_glBeginPerfQueryINTEL proc - mov r11, __blue_glCore_glBeginPerfQueryINTEL +extrn __blue_glCore_glVariantuivEXT: qword +bluegl_glVariantuivEXT proc + mov r11, __blue_glCore_glVariantuivEXT jmp r11 -bluegl_glBeginPerfQueryINTEL endp +bluegl_glVariantuivEXT endp -extrn __blue_glCore_glPathParameteriNV: qword -bluegl_glPathParameteriNV proc - mov r11, __blue_glCore_glPathParameteriNV +extrn __blue_glCore_glVariantPointerEXT: qword +bluegl_glVariantPointerEXT proc + mov r11, __blue_glCore_glVariantPointerEXT jmp r11 -bluegl_glPathParameteriNV endp +bluegl_glVariantPointerEXT endp -extrn __blue_glCore_glUniform4i64vNV: qword -bluegl_glUniform4i64vNV proc - mov r11, __blue_glCore_glUniform4i64vNV +extrn __blue_glCore_glEnableVariantClientStateEXT: qword +bluegl_glEnableVariantClientStateEXT proc + mov r11, __blue_glCore_glEnableVariantClientStateEXT jmp r11 -bluegl_glUniform4i64vNV endp +bluegl_glEnableVariantClientStateEXT endp -extrn __blue_glCore_glStateCaptureNV: qword -bluegl_glStateCaptureNV proc - mov r11, __blue_glCore_glStateCaptureNV +extrn __blue_glCore_glDisableVariantClientStateEXT: qword +bluegl_glDisableVariantClientStateEXT proc + mov r11, __blue_glCore_glDisableVariantClientStateEXT jmp r11 -bluegl_glStateCaptureNV endp +bluegl_glDisableVariantClientStateEXT endp -extrn __blue_glCore_glProgramUniform3fvEXT: qword -bluegl_glProgramUniform3fvEXT proc - mov r11, __blue_glCore_glProgramUniform3fvEXT +extrn __blue_glCore_glBindLightParameterEXT: qword +bluegl_glBindLightParameterEXT proc + mov r11, __blue_glCore_glBindLightParameterEXT jmp r11 -bluegl_glProgramUniform3fvEXT endp +bluegl_glBindLightParameterEXT endp -extrn __blue_glCore_glVertexAttribL1d: qword -bluegl_glVertexAttribL1d proc - mov r11, __blue_glCore_glVertexAttribL1d +extrn __blue_glCore_glBindMaterialParameterEXT: qword +bluegl_glBindMaterialParameterEXT proc + mov r11, __blue_glCore_glBindMaterialParameterEXT jmp r11 -bluegl_glVertexAttribL1d endp +bluegl_glBindMaterialParameterEXT endp -extrn __blue_glCore_glMatrixLoadIdentityEXT: qword -bluegl_glMatrixLoadIdentityEXT proc - mov r11, __blue_glCore_glMatrixLoadIdentityEXT +extrn __blue_glCore_glBindTexGenParameterEXT: qword +bluegl_glBindTexGenParameterEXT proc + mov r11, __blue_glCore_glBindTexGenParameterEXT jmp r11 -bluegl_glMatrixLoadIdentityEXT endp +bluegl_glBindTexGenParameterEXT endp -extrn __blue_glCore_glBindVertexArrayAPPLE: qword -bluegl_glBindVertexArrayAPPLE proc - mov r11, __blue_glCore_glBindVertexArrayAPPLE +extrn __blue_glCore_glBindTextureUnitParameterEXT: qword +bluegl_glBindTextureUnitParameterEXT proc + mov r11, __blue_glCore_glBindTextureUnitParameterEXT jmp r11 -bluegl_glBindVertexArrayAPPLE endp +bluegl_glBindTextureUnitParameterEXT endp -extrn __blue_glCore_glRasterPos2xvOES: qword -bluegl_glRasterPos2xvOES proc - mov r11, __blue_glCore_glRasterPos2xvOES +extrn __blue_glCore_glBindParameterEXT: qword +bluegl_glBindParameterEXT proc + mov r11, __blue_glCore_glBindParameterEXT jmp r11 -bluegl_glRasterPos2xvOES endp +bluegl_glBindParameterEXT endp -extrn __blue_glCore_glCommandListSegmentsNV: qword -bluegl_glCommandListSegmentsNV proc - mov r11, __blue_glCore_glCommandListSegmentsNV +extrn __blue_glCore_glIsVariantEnabledEXT: qword +bluegl_glIsVariantEnabledEXT proc + mov r11, __blue_glCore_glIsVariantEnabledEXT jmp r11 -bluegl_glCommandListSegmentsNV endp +bluegl_glIsVariantEnabledEXT endp -extrn __blue_glCore_glWindowPos4svMESA: qword -bluegl_glWindowPos4svMESA proc - mov r11, __blue_glCore_glWindowPos4svMESA +extrn __blue_glCore_glGetVariantBooleanvEXT: qword +bluegl_glGetVariantBooleanvEXT proc + mov r11, __blue_glCore_glGetVariantBooleanvEXT jmp r11 -bluegl_glWindowPos4svMESA endp +bluegl_glGetVariantBooleanvEXT endp -extrn __blue_glCore_glProgramLocalParameter4dvARB: qword -bluegl_glProgramLocalParameter4dvARB proc - mov r11, __blue_glCore_glProgramLocalParameter4dvARB +extrn __blue_glCore_glGetVariantIntegervEXT: qword +bluegl_glGetVariantIntegervEXT proc + mov r11, __blue_glCore_glGetVariantIntegervEXT jmp r11 -bluegl_glProgramLocalParameter4dvARB endp +bluegl_glGetVariantIntegervEXT endp -extrn __blue_glCore_glGetnPolygonStipple: qword -bluegl_glGetnPolygonStipple proc - mov r11, __blue_glCore_glGetnPolygonStipple +extrn __blue_glCore_glGetVariantFloatvEXT: qword +bluegl_glGetVariantFloatvEXT proc + mov r11, __blue_glCore_glGetVariantFloatvEXT jmp r11 -bluegl_glGetnPolygonStipple endp +bluegl_glGetVariantFloatvEXT endp -extrn __blue_glCore_glMultiTexCoord1svARB: qword -bluegl_glMultiTexCoord1svARB proc - mov r11, __blue_glCore_glMultiTexCoord1svARB +extrn __blue_glCore_glGetVariantPointervEXT: qword +bluegl_glGetVariantPointervEXT proc + mov r11, __blue_glCore_glGetVariantPointervEXT + jmp r11 +bluegl_glGetVariantPointervEXT endp + +extrn __blue_glCore_glGetInvariantBooleanvEXT: qword +bluegl_glGetInvariantBooleanvEXT proc + mov r11, __blue_glCore_glGetInvariantBooleanvEXT jmp r11 -bluegl_glMultiTexCoord1svARB endp +bluegl_glGetInvariantBooleanvEXT endp -extrn __blue_glCore_glNamedRenderbufferStorage: qword -bluegl_glNamedRenderbufferStorage proc - mov r11, __blue_glCore_glNamedRenderbufferStorage +extrn __blue_glCore_glGetInvariantIntegervEXT: qword +bluegl_glGetInvariantIntegervEXT proc + mov r11, __blue_glCore_glGetInvariantIntegervEXT jmp r11 -bluegl_glNamedRenderbufferStorage endp +bluegl_glGetInvariantIntegervEXT endp -extrn __blue_glCore_glProgramEnvParameterI4iNV: qword -bluegl_glProgramEnvParameterI4iNV proc - mov r11, __blue_glCore_glProgramEnvParameterI4iNV +extrn __blue_glCore_glGetInvariantFloatvEXT: qword +bluegl_glGetInvariantFloatvEXT proc + mov r11, __blue_glCore_glGetInvariantFloatvEXT jmp r11 -bluegl_glProgramEnvParameterI4iNV endp +bluegl_glGetInvariantFloatvEXT endp -extrn __blue_glCore_glVertexAttribIFormat: qword -bluegl_glVertexAttribIFormat proc - mov r11, __blue_glCore_glVertexAttribIFormat +extrn __blue_glCore_glGetLocalConstantBooleanvEXT: qword +bluegl_glGetLocalConstantBooleanvEXT proc + mov r11, __blue_glCore_glGetLocalConstantBooleanvEXT jmp r11 -bluegl_glVertexAttribIFormat endp +bluegl_glGetLocalConstantBooleanvEXT endp -extrn __blue_glCore_glFogCoordfvEXT: qword -bluegl_glFogCoordfvEXT proc - mov r11, __blue_glCore_glFogCoordfvEXT +extrn __blue_glCore_glGetLocalConstantIntegervEXT: qword +bluegl_glGetLocalConstantIntegervEXT proc + mov r11, __blue_glCore_glGetLocalConstantIntegervEXT jmp r11 -bluegl_glFogCoordfvEXT endp +bluegl_glGetLocalConstantIntegervEXT endp -extrn __blue_glCore_glEnableVertexAttribArray: qword -bluegl_glEnableVertexAttribArray proc - mov r11, __blue_glCore_glEnableVertexAttribArray +extrn __blue_glCore_glGetLocalConstantFloatvEXT: qword +bluegl_glGetLocalConstantFloatvEXT proc + mov r11, __blue_glCore_glGetLocalConstantFloatvEXT jmp r11 -bluegl_glEnableVertexAttribArray endp +bluegl_glGetLocalConstantFloatvEXT endp -extrn __blue_glCore_glPolygonOffsetClampEXT: qword -bluegl_glPolygonOffsetClampEXT proc - mov r11, __blue_glCore_glPolygonOffsetClampEXT +extrn __blue_glCore_glVertexWeightfEXT: qword +bluegl_glVertexWeightfEXT proc + mov r11, __blue_glCore_glVertexWeightfEXT jmp r11 -bluegl_glPolygonOffsetClampEXT endp +bluegl_glVertexWeightfEXT endp -extrn __blue_glCore_glEnable: qword -bluegl_glEnable proc - mov r11, __blue_glCore_glEnable +extrn __blue_glCore_glVertexWeightfvEXT: qword +bluegl_glVertexWeightfvEXT proc + mov r11, __blue_glCore_glVertexWeightfvEXT jmp r11 -bluegl_glEnable endp +bluegl_glVertexWeightfvEXT endp -extrn __blue_glCore_glIndexFuncEXT: qword -bluegl_glIndexFuncEXT proc - mov r11, __blue_glCore_glIndexFuncEXT +extrn __blue_glCore_glVertexWeightPointerEXT: qword +bluegl_glVertexWeightPointerEXT proc + mov r11, __blue_glCore_glVertexWeightPointerEXT jmp r11 -bluegl_glIndexFuncEXT endp +bluegl_glVertexWeightPointerEXT endp -extrn __blue_glCore_glDepthRangeArrayv: qword -bluegl_glDepthRangeArrayv proc - mov r11, __blue_glCore_glDepthRangeArrayv +extrn __blue_glCore_glImportSyncEXT: qword +bluegl_glImportSyncEXT proc + mov r11, __blue_glCore_glImportSyncEXT jmp r11 -bluegl_glDepthRangeArrayv endp +bluegl_glImportSyncEXT endp -extrn __blue_glCore_glRasterPos4xvOES: qword -bluegl_glRasterPos4xvOES proc - mov r11, __blue_glCore_glRasterPos4xvOES +extrn __blue_glCore_glFrameTerminatorGREMEDY: qword +bluegl_glFrameTerminatorGREMEDY proc + mov r11, __blue_glCore_glFrameTerminatorGREMEDY jmp r11 -bluegl_glRasterPos4xvOES endp +bluegl_glFrameTerminatorGREMEDY endp -extrn __blue_glCore_glSpriteParameterfvSGIX: qword -bluegl_glSpriteParameterfvSGIX proc - mov r11, __blue_glCore_glSpriteParameterfvSGIX +extrn __blue_glCore_glStringMarkerGREMEDY: qword +bluegl_glStringMarkerGREMEDY proc + mov r11, __blue_glCore_glStringMarkerGREMEDY jmp r11 -bluegl_glSpriteParameterfvSGIX endp +bluegl_glStringMarkerGREMEDY endp -extrn __blue_glCore_glGetnUniformdv: qword -bluegl_glGetnUniformdv proc - mov r11, __blue_glCore_glGetnUniformdv +extrn __blue_glCore_glImageTransformParameteriHP: qword +bluegl_glImageTransformParameteriHP proc + mov r11, __blue_glCore_glImageTransformParameteriHP jmp r11 -bluegl_glGetnUniformdv endp +bluegl_glImageTransformParameteriHP endp -extrn __blue_glCore_glGetHistogram: qword -bluegl_glGetHistogram proc - mov r11, __blue_glCore_glGetHistogram +extrn __blue_glCore_glImageTransformParameterfHP: qword +bluegl_glImageTransformParameterfHP proc + mov r11, __blue_glCore_glImageTransformParameterfHP jmp r11 -bluegl_glGetHistogram endp +bluegl_glImageTransformParameterfHP endp -extrn __blue_glCore_glClearColorIiEXT: qword -bluegl_glClearColorIiEXT proc - mov r11, __blue_glCore_glClearColorIiEXT +extrn __blue_glCore_glImageTransformParameterivHP: qword +bluegl_glImageTransformParameterivHP proc + mov r11, __blue_glCore_glImageTransformParameterivHP jmp r11 -bluegl_glClearColorIiEXT endp +bluegl_glImageTransformParameterivHP endp -extrn __blue_glCore_glTbufferMask3DFX: qword -bluegl_glTbufferMask3DFX proc - mov r11, __blue_glCore_glTbufferMask3DFX +extrn __blue_glCore_glImageTransformParameterfvHP: qword +bluegl_glImageTransformParameterfvHP proc + mov r11, __blue_glCore_glImageTransformParameterfvHP jmp r11 -bluegl_glTbufferMask3DFX endp +bluegl_glImageTransformParameterfvHP endp -extrn __blue_glCore_glProgramUniform1f: qword -bluegl_glProgramUniform1f proc - mov r11, __blue_glCore_glProgramUniform1f +extrn __blue_glCore_glGetImageTransformParameterivHP: qword +bluegl_glGetImageTransformParameterivHP proc + mov r11, __blue_glCore_glGetImageTransformParameterivHP jmp r11 -bluegl_glProgramUniform1f endp +bluegl_glGetImageTransformParameterivHP endp -extrn __blue_glCore_glVertexAttrib4Niv: qword -bluegl_glVertexAttrib4Niv proc - mov r11, __blue_glCore_glVertexAttrib4Niv +extrn __blue_glCore_glGetImageTransformParameterfvHP: qword +bluegl_glGetImageTransformParameterfvHP proc + mov r11, __blue_glCore_glGetImageTransformParameterfvHP jmp r11 -bluegl_glVertexAttrib4Niv endp +bluegl_glGetImageTransformParameterfvHP endp -extrn __blue_glCore_glGetUniformLocationARB: qword -bluegl_glGetUniformLocationARB proc - mov r11, __blue_glCore_glGetUniformLocationARB +extrn __blue_glCore_glMultiModeDrawArraysIBM: qword +bluegl_glMultiModeDrawArraysIBM proc + mov r11, __blue_glCore_glMultiModeDrawArraysIBM jmp r11 -bluegl_glGetUniformLocationARB endp +bluegl_glMultiModeDrawArraysIBM endp -extrn __blue_glCore_glColor4hvNV: qword -bluegl_glColor4hvNV proc - mov r11, __blue_glCore_glColor4hvNV +extrn __blue_glCore_glMultiModeDrawElementsIBM: qword +bluegl_glMultiModeDrawElementsIBM proc + mov r11, __blue_glCore_glMultiModeDrawElementsIBM jmp r11 -bluegl_glColor4hvNV endp +bluegl_glMultiModeDrawElementsIBM endp -extrn __blue_glCore_glTextureBufferRangeEXT: qword -bluegl_glTextureBufferRangeEXT proc - mov r11, __blue_glCore_glTextureBufferRangeEXT +extrn __blue_glCore_glFlushStaticDataIBM: qword +bluegl_glFlushStaticDataIBM proc + mov r11, __blue_glCore_glFlushStaticDataIBM jmp r11 -bluegl_glTextureBufferRangeEXT endp +bluegl_glFlushStaticDataIBM endp -extrn __blue_glCore_glGlobalAlphaFactorsSUN: qword -bluegl_glGlobalAlphaFactorsSUN proc - mov r11, __blue_glCore_glGlobalAlphaFactorsSUN +extrn __blue_glCore_glColorPointerListIBM: qword +bluegl_glColorPointerListIBM proc + mov r11, __blue_glCore_glColorPointerListIBM jmp r11 -bluegl_glGlobalAlphaFactorsSUN endp +bluegl_glColorPointerListIBM endp -extrn __blue_glCore_glCopyTextureSubImage2D: qword -bluegl_glCopyTextureSubImage2D proc - mov r11, __blue_glCore_glCopyTextureSubImage2D +extrn __blue_glCore_glSecondaryColorPointerListIBM: qword +bluegl_glSecondaryColorPointerListIBM proc + mov r11, __blue_glCore_glSecondaryColorPointerListIBM jmp r11 -bluegl_glCopyTextureSubImage2D endp +bluegl_glSecondaryColorPointerListIBM endp -extrn __blue_glCore_glUniform1i64vARB: qword -bluegl_glUniform1i64vARB proc - mov r11, __blue_glCore_glUniform1i64vARB +extrn __blue_glCore_glEdgeFlagPointerListIBM: qword +bluegl_glEdgeFlagPointerListIBM proc + mov r11, __blue_glCore_glEdgeFlagPointerListIBM jmp r11 -bluegl_glUniform1i64vARB endp +bluegl_glEdgeFlagPointerListIBM endp -extrn __blue_glCore_glVertexAttrib2dNV: qword -bluegl_glVertexAttrib2dNV proc - mov r11, __blue_glCore_glVertexAttrib2dNV +extrn __blue_glCore_glFogCoordPointerListIBM: qword +bluegl_glFogCoordPointerListIBM proc + mov r11, __blue_glCore_glFogCoordPointerListIBM jmp r11 -bluegl_glVertexAttrib2dNV endp +bluegl_glFogCoordPointerListIBM endp -extrn __blue_glCore_glVertexAttrib4NbvARB: qword -bluegl_glVertexAttrib4NbvARB proc - mov r11, __blue_glCore_glVertexAttrib4NbvARB +extrn __blue_glCore_glIndexPointerListIBM: qword +bluegl_glIndexPointerListIBM proc + mov r11, __blue_glCore_glIndexPointerListIBM jmp r11 -bluegl_glVertexAttrib4NbvARB endp +bluegl_glIndexPointerListIBM endp -extrn __blue_glCore_glPatchParameteri: qword -bluegl_glPatchParameteri proc - mov r11, __blue_glCore_glPatchParameteri +extrn __blue_glCore_glNormalPointerListIBM: qword +bluegl_glNormalPointerListIBM proc + mov r11, __blue_glCore_glNormalPointerListIBM jmp r11 -bluegl_glPatchParameteri endp +bluegl_glNormalPointerListIBM endp -extrn __blue_glCore_glGetNamedStringARB: qword -bluegl_glGetNamedStringARB proc - mov r11, __blue_glCore_glGetNamedStringARB +extrn __blue_glCore_glTexCoordPointerListIBM: qword +bluegl_glTexCoordPointerListIBM proc + mov r11, __blue_glCore_glTexCoordPointerListIBM jmp r11 -bluegl_glGetNamedStringARB endp +bluegl_glTexCoordPointerListIBM endp -extrn __blue_glCore_glGetCombinerStageParameterfvNV: qword -bluegl_glGetCombinerStageParameterfvNV proc - mov r11, __blue_glCore_glGetCombinerStageParameterfvNV +extrn __blue_glCore_glVertexPointerListIBM: qword +bluegl_glVertexPointerListIBM proc + mov r11, __blue_glCore_glVertexPointerListIBM jmp r11 -bluegl_glGetCombinerStageParameterfvNV endp +bluegl_glVertexPointerListIBM endp -extrn __blue_glCore_glVertexAttrib2svARB: qword -bluegl_glVertexAttrib2svARB proc - mov r11, __blue_glCore_glVertexAttrib2svARB +extrn __blue_glCore_glBlendFuncSeparateINGR: qword +bluegl_glBlendFuncSeparateINGR proc + mov r11, __blue_glCore_glBlendFuncSeparateINGR jmp r11 -bluegl_glVertexAttrib2svARB endp +bluegl_glBlendFuncSeparateINGR endp extrn __blue_glCore_glApplyFramebufferAttachmentCMAAINTEL: qword bluegl_glApplyFramebufferAttachmentCMAAINTEL proc @@ -11793,659 +11809,671 @@ bluegl_glApplyFramebufferAttachmentCMAAINTEL proc jmp r11 bluegl_glApplyFramebufferAttachmentCMAAINTEL endp -extrn __blue_glCore_glGetVideouivNV: qword -bluegl_glGetVideouivNV proc - mov r11, __blue_glCore_glGetVideouivNV +extrn __blue_glCore_glSyncTextureINTEL: qword +bluegl_glSyncTextureINTEL proc + mov r11, __blue_glCore_glSyncTextureINTEL + jmp r11 +bluegl_glSyncTextureINTEL endp + +extrn __blue_glCore_glUnmapTexture2DINTEL: qword +bluegl_glUnmapTexture2DINTEL proc + mov r11, __blue_glCore_glUnmapTexture2DINTEL + jmp r11 +bluegl_glUnmapTexture2DINTEL endp + +extrn __blue_glCore_glMapTexture2DINTEL: qword +bluegl_glMapTexture2DINTEL proc + mov r11, __blue_glCore_glMapTexture2DINTEL jmp r11 -bluegl_glGetVideouivNV endp +bluegl_glMapTexture2DINTEL endp -extrn __blue_glCore_glMultiTexCoord3s: qword -bluegl_glMultiTexCoord3s proc - mov r11, __blue_glCore_glMultiTexCoord3s +extrn __blue_glCore_glVertexPointervINTEL: qword +bluegl_glVertexPointervINTEL proc + mov r11, __blue_glCore_glVertexPointervINTEL jmp r11 -bluegl_glMultiTexCoord3s endp +bluegl_glVertexPointervINTEL endp -extrn __blue_glCore_glMultiTexCoord1sARB: qword -bluegl_glMultiTexCoord1sARB proc - mov r11, __blue_glCore_glMultiTexCoord1sARB +extrn __blue_glCore_glNormalPointervINTEL: qword +bluegl_glNormalPointervINTEL proc + mov r11, __blue_glCore_glNormalPointervINTEL jmp r11 -bluegl_glMultiTexCoord1sARB endp +bluegl_glNormalPointervINTEL endp -extrn __blue_glCore_glLogicOp: qword -bluegl_glLogicOp proc - mov r11, __blue_glCore_glLogicOp +extrn __blue_glCore_glColorPointervINTEL: qword +bluegl_glColorPointervINTEL proc + mov r11, __blue_glCore_glColorPointervINTEL jmp r11 -bluegl_glLogicOp endp +bluegl_glColorPointervINTEL endp -extrn __blue_glCore_glFogFuncSGIS: qword -bluegl_glFogFuncSGIS proc - mov r11, __blue_glCore_glFogFuncSGIS +extrn __blue_glCore_glTexCoordPointervINTEL: qword +bluegl_glTexCoordPointervINTEL proc + mov r11, __blue_glCore_glTexCoordPointervINTEL jmp r11 -bluegl_glFogFuncSGIS endp +bluegl_glTexCoordPointervINTEL endp -extrn __blue_glCore_glMatrixMultfEXT: qword -bluegl_glMatrixMultfEXT proc - mov r11, __blue_glCore_glMatrixMultfEXT +extrn __blue_glCore_glBeginPerfQueryINTEL: qword +bluegl_glBeginPerfQueryINTEL proc + mov r11, __blue_glCore_glBeginPerfQueryINTEL jmp r11 -bluegl_glMatrixMultfEXT endp +bluegl_glBeginPerfQueryINTEL endp -extrn __blue_glCore_glGetTexParameterfv: qword -bluegl_glGetTexParameterfv proc - mov r11, __blue_glCore_glGetTexParameterfv +extrn __blue_glCore_glCreatePerfQueryINTEL: qword +bluegl_glCreatePerfQueryINTEL proc + mov r11, __blue_glCore_glCreatePerfQueryINTEL jmp r11 -bluegl_glGetTexParameterfv endp +bluegl_glCreatePerfQueryINTEL endp -extrn __blue_glCore_glSecondaryColorP3uiv: qword -bluegl_glSecondaryColorP3uiv proc - mov r11, __blue_glCore_glSecondaryColorP3uiv +extrn __blue_glCore_glDeletePerfQueryINTEL: qword +bluegl_glDeletePerfQueryINTEL proc + mov r11, __blue_glCore_glDeletePerfQueryINTEL jmp r11 -bluegl_glSecondaryColorP3uiv endp +bluegl_glDeletePerfQueryINTEL endp -extrn __blue_glCore_glMultiTexParameteriEXT: qword -bluegl_glMultiTexParameteriEXT proc - mov r11, __blue_glCore_glMultiTexParameteriEXT +extrn __blue_glCore_glEndPerfQueryINTEL: qword +bluegl_glEndPerfQueryINTEL proc + mov r11, __blue_glCore_glEndPerfQueryINTEL jmp r11 -bluegl_glMultiTexParameteriEXT endp +bluegl_glEndPerfQueryINTEL endp -extrn __blue_glCore_glEnableClientStateIndexedEXT: qword -bluegl_glEnableClientStateIndexedEXT proc - mov r11, __blue_glCore_glEnableClientStateIndexedEXT +extrn __blue_glCore_glGetFirstPerfQueryIdINTEL: qword +bluegl_glGetFirstPerfQueryIdINTEL proc + mov r11, __blue_glCore_glGetFirstPerfQueryIdINTEL jmp r11 -bluegl_glEnableClientStateIndexedEXT endp +bluegl_glGetFirstPerfQueryIdINTEL endp -extrn __blue_glCore_glGenPathsNV: qword -bluegl_glGenPathsNV proc - mov r11, __blue_glCore_glGenPathsNV +extrn __blue_glCore_glGetNextPerfQueryIdINTEL: qword +bluegl_glGetNextPerfQueryIdINTEL proc + mov r11, __blue_glCore_glGetNextPerfQueryIdINTEL jmp r11 -bluegl_glGenPathsNV endp +bluegl_glGetNextPerfQueryIdINTEL endp -extrn __blue_glCore_glGetBufferSubData: qword -bluegl_glGetBufferSubData proc - mov r11, __blue_glCore_glGetBufferSubData +extrn __blue_glCore_glGetPerfCounterInfoINTEL: qword +bluegl_glGetPerfCounterInfoINTEL proc + mov r11, __blue_glCore_glGetPerfCounterInfoINTEL jmp r11 -bluegl_glGetBufferSubData endp +bluegl_glGetPerfCounterInfoINTEL endp -extrn __blue_glCore_glGetDoublei_v: qword -bluegl_glGetDoublei_v proc - mov r11, __blue_glCore_glGetDoublei_v +extrn __blue_glCore_glGetPerfQueryDataINTEL: qword +bluegl_glGetPerfQueryDataINTEL proc + mov r11, __blue_glCore_glGetPerfQueryDataINTEL jmp r11 -bluegl_glGetDoublei_v endp +bluegl_glGetPerfQueryDataINTEL endp -extrn __blue_glCore_glCoverStrokePathNV: qword -bluegl_glCoverStrokePathNV proc - mov r11, __blue_glCore_glCoverStrokePathNV +extrn __blue_glCore_glGetPerfQueryIdByNameINTEL: qword +bluegl_glGetPerfQueryIdByNameINTEL proc + mov r11, __blue_glCore_glGetPerfQueryIdByNameINTEL jmp r11 -bluegl_glCoverStrokePathNV endp +bluegl_glGetPerfQueryIdByNameINTEL endp -extrn __blue_glCore_glFrontFace: qword -bluegl_glFrontFace proc - mov r11, __blue_glCore_glFrontFace +extrn __blue_glCore_glGetPerfQueryInfoINTEL: qword +bluegl_glGetPerfQueryInfoINTEL proc + mov r11, __blue_glCore_glGetPerfQueryInfoINTEL jmp r11 -bluegl_glFrontFace endp +bluegl_glGetPerfQueryInfoINTEL endp -extrn __blue_glCore_glScissorIndexedv: qword -bluegl_glScissorIndexedv proc - mov r11, __blue_glCore_glScissorIndexedv +extrn __blue_glCore_glResizeBuffersMESA: qword +bluegl_glResizeBuffersMESA proc + mov r11, __blue_glCore_glResizeBuffersMESA jmp r11 -bluegl_glScissorIndexedv endp +bluegl_glResizeBuffersMESA endp -extrn __blue_glCore_glTextureStorage3D: qword -bluegl_glTextureStorage3D proc - mov r11, __blue_glCore_glTextureStorage3D +extrn __blue_glCore_glWindowPos2dMESA: qword +bluegl_glWindowPos2dMESA proc + mov r11, __blue_glCore_glWindowPos2dMESA jmp r11 -bluegl_glTextureStorage3D endp +bluegl_glWindowPos2dMESA endp -extrn __blue_glCore_glPathFogGenNV: qword -bluegl_glPathFogGenNV proc - mov r11, __blue_glCore_glPathFogGenNV +extrn __blue_glCore_glWindowPos2dvMESA: qword +bluegl_glWindowPos2dvMESA proc + mov r11, __blue_glCore_glWindowPos2dvMESA jmp r11 -bluegl_glPathFogGenNV endp +bluegl_glWindowPos2dvMESA endp -extrn __blue_glCore_glPixelTexGenParameterivSGIS: qword -bluegl_glPixelTexGenParameterivSGIS proc - mov r11, __blue_glCore_glPixelTexGenParameterivSGIS +extrn __blue_glCore_glWindowPos2fMESA: qword +bluegl_glWindowPos2fMESA proc + mov r11, __blue_glCore_glWindowPos2fMESA jmp r11 -bluegl_glPixelTexGenParameterivSGIS endp +bluegl_glWindowPos2fMESA endp -extrn __blue_glCore_glBlendEquationi: qword -bluegl_glBlendEquationi proc - mov r11, __blue_glCore_glBlendEquationi +extrn __blue_glCore_glWindowPos2fvMESA: qword +bluegl_glWindowPos2fvMESA proc + mov r11, __blue_glCore_glWindowPos2fvMESA jmp r11 -bluegl_glBlendEquationi endp +bluegl_glWindowPos2fvMESA endp -extrn __blue_glCore_glGetHistogramParameterivEXT: qword -bluegl_glGetHistogramParameterivEXT proc - mov r11, __blue_glCore_glGetHistogramParameterivEXT +extrn __blue_glCore_glWindowPos2iMESA: qword +bluegl_glWindowPos2iMESA proc + mov r11, __blue_glCore_glWindowPos2iMESA jmp r11 -bluegl_glGetHistogramParameterivEXT endp +bluegl_glWindowPos2iMESA endp -extrn __blue_glCore_glClearNamedFramebufferfi: qword -bluegl_glClearNamedFramebufferfi proc - mov r11, __blue_glCore_glClearNamedFramebufferfi +extrn __blue_glCore_glWindowPos2ivMESA: qword +bluegl_glWindowPos2ivMESA proc + mov r11, __blue_glCore_glWindowPos2ivMESA jmp r11 -bluegl_glClearNamedFramebufferfi endp +bluegl_glWindowPos2ivMESA endp -extrn __blue_glCore_glCopyColorTableSGI: qword -bluegl_glCopyColorTableSGI proc - mov r11, __blue_glCore_glCopyColorTableSGI +extrn __blue_glCore_glWindowPos2sMESA: qword +bluegl_glWindowPos2sMESA proc + mov r11, __blue_glCore_glWindowPos2sMESA jmp r11 -bluegl_glCopyColorTableSGI endp +bluegl_glWindowPos2sMESA endp -extrn __blue_glCore_glBinormal3dEXT: qword -bluegl_glBinormal3dEXT proc - mov r11, __blue_glCore_glBinormal3dEXT +extrn __blue_glCore_glWindowPos2svMESA: qword +bluegl_glWindowPos2svMESA proc + mov r11, __blue_glCore_glWindowPos2svMESA jmp r11 -bluegl_glBinormal3dEXT endp +bluegl_glWindowPos2svMESA endp -extrn __blue_glCore_glGetBufferParameterui64vNV: qword -bluegl_glGetBufferParameterui64vNV proc - mov r11, __blue_glCore_glGetBufferParameterui64vNV +extrn __blue_glCore_glWindowPos3dMESA: qword +bluegl_glWindowPos3dMESA proc + mov r11, __blue_glCore_glWindowPos3dMESA jmp r11 -bluegl_glGetBufferParameterui64vNV endp +bluegl_glWindowPos3dMESA endp -extrn __blue_glCore_glTextureImage2DEXT: qword -bluegl_glTextureImage2DEXT proc - mov r11, __blue_glCore_glTextureImage2DEXT +extrn __blue_glCore_glWindowPos3dvMESA: qword +bluegl_glWindowPos3dvMESA proc + mov r11, __blue_glCore_glWindowPos3dvMESA jmp r11 -bluegl_glTextureImage2DEXT endp +bluegl_glWindowPos3dvMESA endp -extrn __blue_glCore_glTransformFeedbackVaryings: qword -bluegl_glTransformFeedbackVaryings proc - mov r11, __blue_glCore_glTransformFeedbackVaryings +extrn __blue_glCore_glWindowPos3fMESA: qword +bluegl_glWindowPos3fMESA proc + mov r11, __blue_glCore_glWindowPos3fMESA jmp r11 -bluegl_glTransformFeedbackVaryings endp +bluegl_glWindowPos3fMESA endp -extrn __blue_glCore_glNamedFramebufferSampleLocationsfvNV: qword -bluegl_glNamedFramebufferSampleLocationsfvNV proc - mov r11, __blue_glCore_glNamedFramebufferSampleLocationsfvNV +extrn __blue_glCore_glWindowPos3fvMESA: qword +bluegl_glWindowPos3fvMESA proc + mov r11, __blue_glCore_glWindowPos3fvMESA jmp r11 -bluegl_glNamedFramebufferSampleLocationsfvNV endp +bluegl_glWindowPos3fvMESA endp -extrn __blue_glCore_glMapTexture2DINTEL: qword -bluegl_glMapTexture2DINTEL proc - mov r11, __blue_glCore_glMapTexture2DINTEL +extrn __blue_glCore_glWindowPos3iMESA: qword +bluegl_glWindowPos3iMESA proc + mov r11, __blue_glCore_glWindowPos3iMESA jmp r11 -bluegl_glMapTexture2DINTEL endp +bluegl_glWindowPos3iMESA endp -extrn __blue_glCore_glMaterialxvOES: qword -bluegl_glMaterialxvOES proc - mov r11, __blue_glCore_glMaterialxvOES +extrn __blue_glCore_glWindowPos3ivMESA: qword +bluegl_glWindowPos3ivMESA proc + mov r11, __blue_glCore_glWindowPos3ivMESA jmp r11 -bluegl_glMaterialxvOES endp +bluegl_glWindowPos3ivMESA endp -extrn __blue_glCore_glGenNamesAMD: qword -bluegl_glGenNamesAMD proc - mov r11, __blue_glCore_glGenNamesAMD +extrn __blue_glCore_glWindowPos3sMESA: qword +bluegl_glWindowPos3sMESA proc + mov r11, __blue_glCore_glWindowPos3sMESA jmp r11 -bluegl_glGenNamesAMD endp +bluegl_glWindowPos3sMESA endp -extrn __blue_glCore_glUniform2uiEXT: qword -bluegl_glUniform2uiEXT proc - mov r11, __blue_glCore_glUniform2uiEXT +extrn __blue_glCore_glWindowPos3svMESA: qword +bluegl_glWindowPos3svMESA proc + mov r11, __blue_glCore_glWindowPos3svMESA jmp r11 -bluegl_glUniform2uiEXT endp +bluegl_glWindowPos3svMESA endp -extrn __blue_glCore_glMultiTexCoord1xvOES: qword -bluegl_glMultiTexCoord1xvOES proc - mov r11, __blue_glCore_glMultiTexCoord1xvOES +extrn __blue_glCore_glWindowPos4dMESA: qword +bluegl_glWindowPos4dMESA proc + mov r11, __blue_glCore_glWindowPos4dMESA jmp r11 -bluegl_glMultiTexCoord1xvOES endp +bluegl_glWindowPos4dMESA endp -extrn __blue_glCore_glEnableIndexedEXT: qword -bluegl_glEnableIndexedEXT proc - mov r11, __blue_glCore_glEnableIndexedEXT +extrn __blue_glCore_glWindowPos4dvMESA: qword +bluegl_glWindowPos4dvMESA proc + mov r11, __blue_glCore_glWindowPos4dvMESA jmp r11 -bluegl_glEnableIndexedEXT endp +bluegl_glWindowPos4dvMESA endp -extrn __blue_glCore_glCompressedTextureImage1DEXT: qword -bluegl_glCompressedTextureImage1DEXT proc - mov r11, __blue_glCore_glCompressedTextureImage1DEXT +extrn __blue_glCore_glWindowPos4fMESA: qword +bluegl_glWindowPos4fMESA proc + mov r11, __blue_glCore_glWindowPos4fMESA jmp r11 -bluegl_glCompressedTextureImage1DEXT endp +bluegl_glWindowPos4fMESA endp -extrn __blue_glCore_glMultiTexCoord3fv: qword -bluegl_glMultiTexCoord3fv proc - mov r11, __blue_glCore_glMultiTexCoord3fv +extrn __blue_glCore_glWindowPos4fvMESA: qword +bluegl_glWindowPos4fvMESA proc + mov r11, __blue_glCore_glWindowPos4fvMESA jmp r11 -bluegl_glMultiTexCoord3fv endp +bluegl_glWindowPos4fvMESA endp -extrn __blue_glCore_glGetnPolygonStippleARB: qword -bluegl_glGetnPolygonStippleARB proc - mov r11, __blue_glCore_glGetnPolygonStippleARB +extrn __blue_glCore_glWindowPos4iMESA: qword +bluegl_glWindowPos4iMESA proc + mov r11, __blue_glCore_glWindowPos4iMESA jmp r11 -bluegl_glGetnPolygonStippleARB endp +bluegl_glWindowPos4iMESA endp -extrn __blue_glCore_glTexCoord2fColor3fVertex3fvSUN: qword -bluegl_glTexCoord2fColor3fVertex3fvSUN proc - mov r11, __blue_glCore_glTexCoord2fColor3fVertex3fvSUN +extrn __blue_glCore_glWindowPos4ivMESA: qword +bluegl_glWindowPos4ivMESA proc + mov r11, __blue_glCore_glWindowPos4ivMESA jmp r11 -bluegl_glTexCoord2fColor3fVertex3fvSUN endp +bluegl_glWindowPos4ivMESA endp -extrn __blue_glCore_glBindTransformFeedbackNV: qword -bluegl_glBindTransformFeedbackNV proc - mov r11, __blue_glCore_glBindTransformFeedbackNV +extrn __blue_glCore_glWindowPos4sMESA: qword +bluegl_glWindowPos4sMESA proc + mov r11, __blue_glCore_glWindowPos4sMESA jmp r11 -bluegl_glBindTransformFeedbackNV endp +bluegl_glWindowPos4sMESA endp -extrn __blue_glCore_glVertexStream2svATI: qword -bluegl_glVertexStream2svATI proc - mov r11, __blue_glCore_glVertexStream2svATI +extrn __blue_glCore_glWindowPos4svMESA: qword +bluegl_glWindowPos4svMESA proc + mov r11, __blue_glCore_glWindowPos4svMESA jmp r11 -bluegl_glVertexStream2svATI endp +bluegl_glWindowPos4svMESA endp -extrn __blue_glCore_glMultiTexCoord1fvARB: qword -bluegl_glMultiTexCoord1fvARB proc - mov r11, __blue_glCore_glMultiTexCoord1fvARB +extrn __blue_glCore_glBeginConditionalRenderNVX: qword +bluegl_glBeginConditionalRenderNVX proc + mov r11, __blue_glCore_glBeginConditionalRenderNVX jmp r11 -bluegl_glMultiTexCoord1fvARB endp +bluegl_glBeginConditionalRenderNVX endp -extrn __blue_glCore_glMultiTexGendvEXT: qword -bluegl_glMultiTexGendvEXT proc - mov r11, __blue_glCore_glMultiTexGendvEXT +extrn __blue_glCore_glEndConditionalRenderNVX: qword +bluegl_glEndConditionalRenderNVX proc + mov r11, __blue_glCore_glEndConditionalRenderNVX jmp r11 -bluegl_glMultiTexGendvEXT endp +bluegl_glEndConditionalRenderNVX endp -extrn __blue_glCore_glProgramUniform2ui64vNV: qword -bluegl_glProgramUniform2ui64vNV proc - mov r11, __blue_glCore_glProgramUniform2ui64vNV +extrn __blue_glCore_glMultiDrawArraysIndirectBindlessNV: qword +bluegl_glMultiDrawArraysIndirectBindlessNV proc + mov r11, __blue_glCore_glMultiDrawArraysIndirectBindlessNV jmp r11 -bluegl_glProgramUniform2ui64vNV endp +bluegl_glMultiDrawArraysIndirectBindlessNV endp -extrn __blue_glCore_glGetNamedRenderbufferParameteriv: qword -bluegl_glGetNamedRenderbufferParameteriv proc - mov r11, __blue_glCore_glGetNamedRenderbufferParameteriv +extrn __blue_glCore_glMultiDrawElementsIndirectBindlessNV: qword +bluegl_glMultiDrawElementsIndirectBindlessNV proc + mov r11, __blue_glCore_glMultiDrawElementsIndirectBindlessNV jmp r11 -bluegl_glGetNamedRenderbufferParameteriv endp +bluegl_glMultiDrawElementsIndirectBindlessNV endp -extrn __blue_glCore_glBlendEquationSeparateEXT: qword -bluegl_glBlendEquationSeparateEXT proc - mov r11, __blue_glCore_glBlendEquationSeparateEXT +extrn __blue_glCore_glMultiDrawArraysIndirectBindlessCountNV: qword +bluegl_glMultiDrawArraysIndirectBindlessCountNV proc + mov r11, __blue_glCore_glMultiDrawArraysIndirectBindlessCountNV jmp r11 -bluegl_glBlendEquationSeparateEXT endp +bluegl_glMultiDrawArraysIndirectBindlessCountNV endp -extrn __blue_glCore_glInvalidateBufferData: qword -bluegl_glInvalidateBufferData proc - mov r11, __blue_glCore_glInvalidateBufferData +extrn __blue_glCore_glMultiDrawElementsIndirectBindlessCountNV: qword +bluegl_glMultiDrawElementsIndirectBindlessCountNV proc + mov r11, __blue_glCore_glMultiDrawElementsIndirectBindlessCountNV jmp r11 -bluegl_glInvalidateBufferData endp +bluegl_glMultiDrawElementsIndirectBindlessCountNV endp -extrn __blue_glCore_glFragmentLightModelfvSGIX: qword -bluegl_glFragmentLightModelfvSGIX proc - mov r11, __blue_glCore_glFragmentLightModelfvSGIX +extrn __blue_glCore_glGetTextureHandleNV: qword +bluegl_glGetTextureHandleNV proc + mov r11, __blue_glCore_glGetTextureHandleNV jmp r11 -bluegl_glFragmentLightModelfvSGIX endp +bluegl_glGetTextureHandleNV endp -extrn __blue_glCore_glMakeTextureHandleNonResidentARB: qword -bluegl_glMakeTextureHandleNonResidentARB proc - mov r11, __blue_glCore_glMakeTextureHandleNonResidentARB +extrn __blue_glCore_glGetTextureSamplerHandleNV: qword +bluegl_glGetTextureSamplerHandleNV proc + mov r11, __blue_glCore_glGetTextureSamplerHandleNV jmp r11 -bluegl_glMakeTextureHandleNonResidentARB endp +bluegl_glGetTextureSamplerHandleNV endp -extrn __blue_glCore_glMap2xOES: qword -bluegl_glMap2xOES proc - mov r11, __blue_glCore_glMap2xOES +extrn __blue_glCore_glMakeTextureHandleResidentNV: qword +bluegl_glMakeTextureHandleResidentNV proc + mov r11, __blue_glCore_glMakeTextureHandleResidentNV jmp r11 -bluegl_glMap2xOES endp +bluegl_glMakeTextureHandleResidentNV endp -extrn __blue_glCore_glFramebufferRenderbufferEXT: qword -bluegl_glFramebufferRenderbufferEXT proc - mov r11, __blue_glCore_glFramebufferRenderbufferEXT +extrn __blue_glCore_glMakeTextureHandleNonResidentNV: qword +bluegl_glMakeTextureHandleNonResidentNV proc + mov r11, __blue_glCore_glMakeTextureHandleNonResidentNV jmp r11 -bluegl_glFramebufferRenderbufferEXT endp +bluegl_glMakeTextureHandleNonResidentNV endp -extrn __blue_glCore_glGetMapAttribParameterfvNV: qword -bluegl_glGetMapAttribParameterfvNV proc - mov r11, __blue_glCore_glGetMapAttribParameterfvNV +extrn __blue_glCore_glGetImageHandleNV: qword +bluegl_glGetImageHandleNV proc + mov r11, __blue_glCore_glGetImageHandleNV jmp r11 -bluegl_glGetMapAttribParameterfvNV endp +bluegl_glGetImageHandleNV endp -extrn __blue_glCore_glVertexAttrib2dvARB: qword -bluegl_glVertexAttrib2dvARB proc - mov r11, __blue_glCore_glVertexAttrib2dvARB +extrn __blue_glCore_glMakeImageHandleResidentNV: qword +bluegl_glMakeImageHandleResidentNV proc + mov r11, __blue_glCore_glMakeImageHandleResidentNV jmp r11 -bluegl_glVertexAttrib2dvARB endp +bluegl_glMakeImageHandleResidentNV endp -extrn __blue_glCore_glInvalidateBufferSubData: qword -bluegl_glInvalidateBufferSubData proc - mov r11, __blue_glCore_glInvalidateBufferSubData +extrn __blue_glCore_glMakeImageHandleNonResidentNV: qword +bluegl_glMakeImageHandleNonResidentNV proc + mov r11, __blue_glCore_glMakeImageHandleNonResidentNV jmp r11 -bluegl_glInvalidateBufferSubData endp +bluegl_glMakeImageHandleNonResidentNV endp -extrn __blue_glCore_glVertexAttrib1d: qword -bluegl_glVertexAttrib1d proc - mov r11, __blue_glCore_glVertexAttrib1d +extrn __blue_glCore_glUniformHandleui64NV: qword +bluegl_glUniformHandleui64NV proc + mov r11, __blue_glCore_glUniformHandleui64NV jmp r11 -bluegl_glVertexAttrib1d endp +bluegl_glUniformHandleui64NV endp -extrn __blue_glCore_glDispatchComputeIndirect: qword -bluegl_glDispatchComputeIndirect proc - mov r11, __blue_glCore_glDispatchComputeIndirect +extrn __blue_glCore_glUniformHandleui64vNV: qword +bluegl_glUniformHandleui64vNV proc + mov r11, __blue_glCore_glUniformHandleui64vNV jmp r11 -bluegl_glDispatchComputeIndirect endp +bluegl_glUniformHandleui64vNV endp -extrn __blue_glCore_glStencilFuncSeparate: qword -bluegl_glStencilFuncSeparate proc - mov r11, __blue_glCore_glStencilFuncSeparate +extrn __blue_glCore_glProgramUniformHandleui64NV: qword +bluegl_glProgramUniformHandleui64NV proc + mov r11, __blue_glCore_glProgramUniformHandleui64NV jmp r11 -bluegl_glStencilFuncSeparate endp +bluegl_glProgramUniformHandleui64NV endp -extrn __blue_glCore_glMapVertexAttrib2fAPPLE: qword -bluegl_glMapVertexAttrib2fAPPLE proc - mov r11, __blue_glCore_glMapVertexAttrib2fAPPLE +extrn __blue_glCore_glProgramUniformHandleui64vNV: qword +bluegl_glProgramUniformHandleui64vNV proc + mov r11, __blue_glCore_glProgramUniformHandleui64vNV jmp r11 -bluegl_glMapVertexAttrib2fAPPLE endp +bluegl_glProgramUniformHandleui64vNV endp -extrn __blue_glCore_glProgramUniformMatrix2x4fv: qword -bluegl_glProgramUniformMatrix2x4fv proc - mov r11, __blue_glCore_glProgramUniformMatrix2x4fv +extrn __blue_glCore_glIsTextureHandleResidentNV: qword +bluegl_glIsTextureHandleResidentNV proc + mov r11, __blue_glCore_glIsTextureHandleResidentNV jmp r11 -bluegl_glProgramUniformMatrix2x4fv endp +bluegl_glIsTextureHandleResidentNV endp -extrn __blue_glCore_glReadPixels: qword -bluegl_glReadPixels proc - mov r11, __blue_glCore_glReadPixels +extrn __blue_glCore_glIsImageHandleResidentNV: qword +bluegl_glIsImageHandleResidentNV proc + mov r11, __blue_glCore_glIsImageHandleResidentNV jmp r11 -bluegl_glReadPixels endp +bluegl_glIsImageHandleResidentNV endp -extrn __blue_glCore_glVertexArrayAttribIFormat: qword -bluegl_glVertexArrayAttribIFormat proc - mov r11, __blue_glCore_glVertexArrayAttribIFormat +extrn __blue_glCore_glBlendParameteriNV: qword +bluegl_glBlendParameteriNV proc + mov r11, __blue_glCore_glBlendParameteriNV jmp r11 -bluegl_glVertexArrayAttribIFormat endp +bluegl_glBlendParameteriNV endp -extrn __blue_glCore_glCopyMultiTexSubImage1DEXT: qword -bluegl_glCopyMultiTexSubImage1DEXT proc - mov r11, __blue_glCore_glCopyMultiTexSubImage1DEXT +extrn __blue_glCore_glBlendBarrierNV: qword +bluegl_glBlendBarrierNV proc + mov r11, __blue_glCore_glBlendBarrierNV jmp r11 -bluegl_glCopyMultiTexSubImage1DEXT endp +bluegl_glBlendBarrierNV endp -extrn __blue_glCore_glBlendEquationSeparateIndexedAMD: qword -bluegl_glBlendEquationSeparateIndexedAMD proc - mov r11, __blue_glCore_glBlendEquationSeparateIndexedAMD +extrn __blue_glCore_glCreateStatesNV: qword +bluegl_glCreateStatesNV proc + mov r11, __blue_glCore_glCreateStatesNV jmp r11 -bluegl_glBlendEquationSeparateIndexedAMD endp +bluegl_glCreateStatesNV endp -extrn __blue_glCore_glGetTransformFeedbackVaryingEXT: qword -bluegl_glGetTransformFeedbackVaryingEXT proc - mov r11, __blue_glCore_glGetTransformFeedbackVaryingEXT +extrn __blue_glCore_glDeleteStatesNV: qword +bluegl_glDeleteStatesNV proc + mov r11, __blue_glCore_glDeleteStatesNV jmp r11 -bluegl_glGetTransformFeedbackVaryingEXT endp +bluegl_glDeleteStatesNV endp -extrn __blue_glCore_glProgramUniform2ui64ARB: qword -bluegl_glProgramUniform2ui64ARB proc - mov r11, __blue_glCore_glProgramUniform2ui64ARB +extrn __blue_glCore_glIsStateNV: qword +bluegl_glIsStateNV proc + mov r11, __blue_glCore_glIsStateNV jmp r11 -bluegl_glProgramUniform2ui64ARB endp +bluegl_glIsStateNV endp -extrn __blue_glCore_glProgramUniform1i64vARB: qword -bluegl_glProgramUniform1i64vARB proc - mov r11, __blue_glCore_glProgramUniform1i64vARB +extrn __blue_glCore_glStateCaptureNV: qword +bluegl_glStateCaptureNV proc + mov r11, __blue_glCore_glStateCaptureNV jmp r11 -bluegl_glProgramUniform1i64vARB endp +bluegl_glStateCaptureNV endp -extrn __blue_glCore_glMultiTexCoord4iv: qword -bluegl_glMultiTexCoord4iv proc - mov r11, __blue_glCore_glMultiTexCoord4iv +extrn __blue_glCore_glGetCommandHeaderNV: qword +bluegl_glGetCommandHeaderNV proc + mov r11, __blue_glCore_glGetCommandHeaderNV jmp r11 -bluegl_glMultiTexCoord4iv endp +bluegl_glGetCommandHeaderNV endp -extrn __blue_glCore_glLoadIdentityDeformationMapSGIX: qword -bluegl_glLoadIdentityDeformationMapSGIX proc - mov r11, __blue_glCore_glLoadIdentityDeformationMapSGIX +extrn __blue_glCore_glGetStageIndexNV: qword +bluegl_glGetStageIndexNV proc + mov r11, __blue_glCore_glGetStageIndexNV jmp r11 -bluegl_glLoadIdentityDeformationMapSGIX endp +bluegl_glGetStageIndexNV endp -extrn __blue_glCore_glGetMultiTexGendvEXT: qword -bluegl_glGetMultiTexGendvEXT proc - mov r11, __blue_glCore_glGetMultiTexGendvEXT +extrn __blue_glCore_glDrawCommandsNV: qword +bluegl_glDrawCommandsNV proc + mov r11, __blue_glCore_glDrawCommandsNV jmp r11 -bluegl_glGetMultiTexGendvEXT endp +bluegl_glDrawCommandsNV endp -extrn __blue_glCore_glVertex4xvOES: qword -bluegl_glVertex4xvOES proc - mov r11, __blue_glCore_glVertex4xvOES +extrn __blue_glCore_glDrawCommandsAddressNV: qword +bluegl_glDrawCommandsAddressNV proc + mov r11, __blue_glCore_glDrawCommandsAddressNV jmp r11 -bluegl_glVertex4xvOES endp +bluegl_glDrawCommandsAddressNV endp -extrn __blue_glCore_glVertexArrayVertexAttribOffsetEXT: qword -bluegl_glVertexArrayVertexAttribOffsetEXT proc - mov r11, __blue_glCore_glVertexArrayVertexAttribOffsetEXT +extrn __blue_glCore_glDrawCommandsStatesNV: qword +bluegl_glDrawCommandsStatesNV proc + mov r11, __blue_glCore_glDrawCommandsStatesNV jmp r11 -bluegl_glVertexArrayVertexAttribOffsetEXT endp +bluegl_glDrawCommandsStatesNV endp -extrn __blue_glCore_glNormalP3ui: qword -bluegl_glNormalP3ui proc - mov r11, __blue_glCore_glNormalP3ui +extrn __blue_glCore_glDrawCommandsStatesAddressNV: qword +bluegl_glDrawCommandsStatesAddressNV proc + mov r11, __blue_glCore_glDrawCommandsStatesAddressNV jmp r11 -bluegl_glNormalP3ui endp +bluegl_glDrawCommandsStatesAddressNV endp -extrn __blue_glCore_glMapParameterivNV: qword -bluegl_glMapParameterivNV proc - mov r11, __blue_glCore_glMapParameterivNV +extrn __blue_glCore_glCreateCommandListsNV: qword +bluegl_glCreateCommandListsNV proc + mov r11, __blue_glCore_glCreateCommandListsNV jmp r11 -bluegl_glMapParameterivNV endp +bluegl_glCreateCommandListsNV endp -extrn __blue_glCore_glColorPointervINTEL: qword -bluegl_glColorPointervINTEL proc - mov r11, __blue_glCore_glColorPointervINTEL +extrn __blue_glCore_glDeleteCommandListsNV: qword +bluegl_glDeleteCommandListsNV proc + mov r11, __blue_glCore_glDeleteCommandListsNV jmp r11 -bluegl_glColorPointervINTEL endp +bluegl_glDeleteCommandListsNV endp -extrn __blue_glCore_glGetQueryObjectui64v: qword -bluegl_glGetQueryObjectui64v proc - mov r11, __blue_glCore_glGetQueryObjectui64v +extrn __blue_glCore_glIsCommandListNV: qword +bluegl_glIsCommandListNV proc + mov r11, __blue_glCore_glIsCommandListNV jmp r11 -bluegl_glGetQueryObjectui64v endp +bluegl_glIsCommandListNV endp -extrn __blue_glCore_glGenFencesAPPLE: qword -bluegl_glGenFencesAPPLE proc - mov r11, __blue_glCore_glGenFencesAPPLE +extrn __blue_glCore_glListDrawCommandsStatesClientNV: qword +bluegl_glListDrawCommandsStatesClientNV proc + mov r11, __blue_glCore_glListDrawCommandsStatesClientNV jmp r11 -bluegl_glGenFencesAPPLE endp +bluegl_glListDrawCommandsStatesClientNV endp -extrn __blue_glCore_glNamedBufferPageCommitmentEXT: qword -bluegl_glNamedBufferPageCommitmentEXT proc - mov r11, __blue_glCore_glNamedBufferPageCommitmentEXT +extrn __blue_glCore_glCommandListSegmentsNV: qword +bluegl_glCommandListSegmentsNV proc + mov r11, __blue_glCore_glCommandListSegmentsNV jmp r11 -bluegl_glNamedBufferPageCommitmentEXT endp +bluegl_glCommandListSegmentsNV endp -extrn __blue_glCore_glGetShaderSourceARB: qword -bluegl_glGetShaderSourceARB proc - mov r11, __blue_glCore_glGetShaderSourceARB +extrn __blue_glCore_glCompileCommandListNV: qword +bluegl_glCompileCommandListNV proc + mov r11, __blue_glCore_glCompileCommandListNV jmp r11 -bluegl_glGetShaderSourceARB endp +bluegl_glCompileCommandListNV endp -extrn __blue_glCore_glClearNamedFramebufferuiv: qword -bluegl_glClearNamedFramebufferuiv proc - mov r11, __blue_glCore_glClearNamedFramebufferuiv +extrn __blue_glCore_glCallCommandListNV: qword +bluegl_glCallCommandListNV proc + mov r11, __blue_glCore_glCallCommandListNV jmp r11 -bluegl_glClearNamedFramebufferuiv endp +bluegl_glCallCommandListNV endp -extrn __blue_glCore_glVDPAUIsSurfaceNV: qword -bluegl_glVDPAUIsSurfaceNV proc - mov r11, __blue_glCore_glVDPAUIsSurfaceNV +extrn __blue_glCore_glBeginConditionalRenderNV: qword +bluegl_glBeginConditionalRenderNV proc + mov r11, __blue_glCore_glBeginConditionalRenderNV jmp r11 -bluegl_glVDPAUIsSurfaceNV endp +bluegl_glBeginConditionalRenderNV endp -extrn __blue_glCore_glVertexAttribL2ui64NV: qword -bluegl_glVertexAttribL2ui64NV proc - mov r11, __blue_glCore_glVertexAttribL2ui64NV +extrn __blue_glCore_glEndConditionalRenderNV: qword +bluegl_glEndConditionalRenderNV proc + mov r11, __blue_glCore_glEndConditionalRenderNV jmp r11 -bluegl_glVertexAttribL2ui64NV endp +bluegl_glEndConditionalRenderNV endp -extrn __blue_glCore_glColor4xvOES: qword -bluegl_glColor4xvOES proc - mov r11, __blue_glCore_glColor4xvOES +extrn __blue_glCore_glSubpixelPrecisionBiasNV: qword +bluegl_glSubpixelPrecisionBiasNV proc + mov r11, __blue_glCore_glSubpixelPrecisionBiasNV jmp r11 -bluegl_glColor4xvOES endp +bluegl_glSubpixelPrecisionBiasNV endp -extrn __blue_glCore_glUniformBlockBinding: qword -bluegl_glUniformBlockBinding proc - mov r11, __blue_glCore_glUniformBlockBinding +extrn __blue_glCore_glConservativeRasterParameterfNV: qword +bluegl_glConservativeRasterParameterfNV proc + mov r11, __blue_glCore_glConservativeRasterParameterfNV jmp r11 -bluegl_glUniformBlockBinding endp +bluegl_glConservativeRasterParameterfNV endp -extrn __blue_glCore_glListParameterivSGIX: qword -bluegl_glListParameterivSGIX proc - mov r11, __blue_glCore_glListParameterivSGIX +extrn __blue_glCore_glCopyImageSubDataNV: qword +bluegl_glCopyImageSubDataNV proc + mov r11, __blue_glCore_glCopyImageSubDataNV jmp r11 -bluegl_glListParameterivSGIX endp +bluegl_glCopyImageSubDataNV endp -extrn __blue_glCore_glPathSubCoordsNV: qword -bluegl_glPathSubCoordsNV proc - mov r11, __blue_glCore_glPathSubCoordsNV +extrn __blue_glCore_glDepthRangedNV: qword +bluegl_glDepthRangedNV proc + mov r11, __blue_glCore_glDepthRangedNV jmp r11 -bluegl_glPathSubCoordsNV endp +bluegl_glDepthRangedNV endp -extrn __blue_glCore_glGetProgramStringARB: qword -bluegl_glGetProgramStringARB proc - mov r11, __blue_glCore_glGetProgramStringARB +extrn __blue_glCore_glClearDepthdNV: qword +bluegl_glClearDepthdNV proc + mov r11, __blue_glCore_glClearDepthdNV jmp r11 -bluegl_glGetProgramStringARB endp +bluegl_glClearDepthdNV endp -extrn __blue_glCore_glPathStencilFuncNV: qword -bluegl_glPathStencilFuncNV proc - mov r11, __blue_glCore_glPathStencilFuncNV +extrn __blue_glCore_glDepthBoundsdNV: qword +bluegl_glDepthBoundsdNV proc + mov r11, __blue_glCore_glDepthBoundsdNV jmp r11 -bluegl_glPathStencilFuncNV endp +bluegl_glDepthBoundsdNV endp -extrn __blue_glCore_glBindVideoCaptureStreamBufferNV: qword -bluegl_glBindVideoCaptureStreamBufferNV proc - mov r11, __blue_glCore_glBindVideoCaptureStreamBufferNV +extrn __blue_glCore_glDrawTextureNV: qword +bluegl_glDrawTextureNV proc + mov r11, __blue_glCore_glDrawTextureNV jmp r11 -bluegl_glBindVideoCaptureStreamBufferNV endp +bluegl_glDrawTextureNV endp -extrn __blue_glCore_glReadnPixelsARB: qword -bluegl_glReadnPixelsARB proc - mov r11, __blue_glCore_glReadnPixelsARB +extrn __blue_glCore_glMapControlPointsNV: qword +bluegl_glMapControlPointsNV proc + mov r11, __blue_glCore_glMapControlPointsNV jmp r11 -bluegl_glReadnPixelsARB endp +bluegl_glMapControlPointsNV endp -extrn __blue_glCore_glTexBufferARB: qword -bluegl_glTexBufferARB proc - mov r11, __blue_glCore_glTexBufferARB +extrn __blue_glCore_glMapParameterivNV: qword +bluegl_glMapParameterivNV proc + mov r11, __blue_glCore_glMapParameterivNV jmp r11 -bluegl_glTexBufferARB endp +bluegl_glMapParameterivNV endp -extrn __blue_glCore_glVertexAttribL2ui64vNV: qword -bluegl_glVertexAttribL2ui64vNV proc - mov r11, __blue_glCore_glVertexAttribL2ui64vNV +extrn __blue_glCore_glMapParameterfvNV: qword +bluegl_glMapParameterfvNV proc + mov r11, __blue_glCore_glMapParameterfvNV jmp r11 -bluegl_glVertexAttribL2ui64vNV endp +bluegl_glMapParameterfvNV endp -extrn __blue_glCore_glCreateBuffers: qword -bluegl_glCreateBuffers proc - mov r11, __blue_glCore_glCreateBuffers +extrn __blue_glCore_glGetMapControlPointsNV: qword +bluegl_glGetMapControlPointsNV proc + mov r11, __blue_glCore_glGetMapControlPointsNV jmp r11 -bluegl_glCreateBuffers endp +bluegl_glGetMapControlPointsNV endp -extrn __blue_glCore_glImageTransformParameterfvHP: qword -bluegl_glImageTransformParameterfvHP proc - mov r11, __blue_glCore_glImageTransformParameterfvHP +extrn __blue_glCore_glGetMapParameterivNV: qword +bluegl_glGetMapParameterivNV proc + mov r11, __blue_glCore_glGetMapParameterivNV jmp r11 -bluegl_glImageTransformParameterfvHP endp +bluegl_glGetMapParameterivNV endp -extrn __blue_glCore_glUniform2d: qword -bluegl_glUniform2d proc - mov r11, __blue_glCore_glUniform2d +extrn __blue_glCore_glGetMapParameterfvNV: qword +bluegl_glGetMapParameterfvNV proc + mov r11, __blue_glCore_glGetMapParameterfvNV jmp r11 -bluegl_glUniform2d endp +bluegl_glGetMapParameterfvNV endp -extrn __blue_glCore_glBufferStorage: qword -bluegl_glBufferStorage proc - mov r11, __blue_glCore_glBufferStorage +extrn __blue_glCore_glGetMapAttribParameterivNV: qword +bluegl_glGetMapAttribParameterivNV proc + mov r11, __blue_glCore_glGetMapAttribParameterivNV jmp r11 -bluegl_glBufferStorage endp +bluegl_glGetMapAttribParameterivNV endp -extrn __blue_glCore_glGetTexFilterFuncSGIS: qword -bluegl_glGetTexFilterFuncSGIS proc - mov r11, __blue_glCore_glGetTexFilterFuncSGIS +extrn __blue_glCore_glGetMapAttribParameterfvNV: qword +bluegl_glGetMapAttribParameterfvNV proc + mov r11, __blue_glCore_glGetMapAttribParameterfvNV jmp r11 -bluegl_glGetTexFilterFuncSGIS endp +bluegl_glGetMapAttribParameterfvNV endp -extrn __blue_glCore_glGetHandleARB: qword -bluegl_glGetHandleARB proc - mov r11, __blue_glCore_glGetHandleARB +extrn __blue_glCore_glEvalMapsNV: qword +bluegl_glEvalMapsNV proc + mov r11, __blue_glCore_glEvalMapsNV jmp r11 -bluegl_glGetHandleARB endp +bluegl_glEvalMapsNV endp -extrn __blue_glCore_glGetHistogramParameterxvOES: qword -bluegl_glGetHistogramParameterxvOES proc - mov r11, __blue_glCore_glGetHistogramParameterxvOES +extrn __blue_glCore_glGetMultisamplefvNV: qword +bluegl_glGetMultisamplefvNV proc + mov r11, __blue_glCore_glGetMultisamplefvNV jmp r11 -bluegl_glGetHistogramParameterxvOES endp +bluegl_glGetMultisamplefvNV endp -extrn __blue_glCore_glMultiTexCoord2d: qword -bluegl_glMultiTexCoord2d proc - mov r11, __blue_glCore_glMultiTexCoord2d +extrn __blue_glCore_glSampleMaskIndexedNV: qword +bluegl_glSampleMaskIndexedNV proc + mov r11, __blue_glCore_glSampleMaskIndexedNV jmp r11 -bluegl_glMultiTexCoord2d endp +bluegl_glSampleMaskIndexedNV endp -extrn __blue_glCore_glVertex4hNV: qword -bluegl_glVertex4hNV proc - mov r11, __blue_glCore_glVertex4hNV +extrn __blue_glCore_glTexRenderbufferNV: qword +bluegl_glTexRenderbufferNV proc + mov r11, __blue_glCore_glTexRenderbufferNV jmp r11 -bluegl_glVertex4hNV endp +bluegl_glTexRenderbufferNV endp -extrn __blue_glCore_glGetPerfMonitorGroupStringAMD: qword -bluegl_glGetPerfMonitorGroupStringAMD proc - mov r11, __blue_glCore_glGetPerfMonitorGroupStringAMD +extrn __blue_glCore_glDeleteFencesNV: qword +bluegl_glDeleteFencesNV proc + mov r11, __blue_glCore_glDeleteFencesNV jmp r11 -bluegl_glGetPerfMonitorGroupStringAMD endp +bluegl_glDeleteFencesNV endp -extrn __blue_glCore_glCompressedTextureSubImage1D: qword -bluegl_glCompressedTextureSubImage1D proc - mov r11, __blue_glCore_glCompressedTextureSubImage1D +extrn __blue_glCore_glGenFencesNV: qword +bluegl_glGenFencesNV proc + mov r11, __blue_glCore_glGenFencesNV jmp r11 -bluegl_glCompressedTextureSubImage1D endp +bluegl_glGenFencesNV endp -extrn __blue_glCore_glIsFramebuffer: qword -bluegl_glIsFramebuffer proc - mov r11, __blue_glCore_glIsFramebuffer +extrn __blue_glCore_glIsFenceNV: qword +bluegl_glIsFenceNV proc + mov r11, __blue_glCore_glIsFenceNV jmp r11 -bluegl_glIsFramebuffer endp +bluegl_glIsFenceNV endp -extrn __blue_glCore_glUniform2dv: qword -bluegl_glUniform2dv proc - mov r11, __blue_glCore_glUniform2dv +extrn __blue_glCore_glTestFenceNV: qword +bluegl_glTestFenceNV proc + mov r11, __blue_glCore_glTestFenceNV jmp r11 -bluegl_glUniform2dv endp +bluegl_glTestFenceNV endp -extrn __blue_glCore_glVertexAttrib1dvARB: qword -bluegl_glVertexAttrib1dvARB proc - mov r11, __blue_glCore_glVertexAttrib1dvARB +extrn __blue_glCore_glGetFenceivNV: qword +bluegl_glGetFenceivNV proc + mov r11, __blue_glCore_glGetFenceivNV jmp r11 -bluegl_glVertexAttrib1dvARB endp +bluegl_glGetFenceivNV endp -extrn __blue_glCore_glClientWaitSync: qword -bluegl_glClientWaitSync proc - mov r11, __blue_glCore_glClientWaitSync +extrn __blue_glCore_glFinishFenceNV: qword +bluegl_glFinishFenceNV proc + mov r11, __blue_glCore_glFinishFenceNV jmp r11 -bluegl_glClientWaitSync endp +bluegl_glFinishFenceNV endp -extrn __blue_glCore_glProgramUniform4i64vARB: qword -bluegl_glProgramUniform4i64vARB proc - mov r11, __blue_glCore_glProgramUniform4i64vARB +extrn __blue_glCore_glSetFenceNV: qword +bluegl_glSetFenceNV proc + mov r11, __blue_glCore_glSetFenceNV jmp r11 -bluegl_glProgramUniform4i64vARB endp +bluegl_glSetFenceNV endp -extrn __blue_glCore_glGetActiveAttribARB: qword -bluegl_glGetActiveAttribARB proc - mov r11, __blue_glCore_glGetActiveAttribARB +extrn __blue_glCore_glFragmentCoverageColorNV: qword +bluegl_glFragmentCoverageColorNV proc + mov r11, __blue_glCore_glFragmentCoverageColorNV jmp r11 -bluegl_glGetActiveAttribARB endp +bluegl_glFragmentCoverageColorNV endp -extrn __blue_glCore_glCompressedTexImage3DARB: qword -bluegl_glCompressedTexImage3DARB proc - mov r11, __blue_glCore_glCompressedTexImage3DARB +extrn __blue_glCore_glProgramNamedParameter4fNV: qword +bluegl_glProgramNamedParameter4fNV proc + mov r11, __blue_glCore_glProgramNamedParameter4fNV jmp r11 -bluegl_glCompressedTexImage3DARB endp +bluegl_glProgramNamedParameter4fNV endp -extrn __blue_glCore_glVertexAttribI2iEXT: qword -bluegl_glVertexAttribI2iEXT proc - mov r11, __blue_glCore_glVertexAttribI2iEXT +extrn __blue_glCore_glProgramNamedParameter4fvNV: qword +bluegl_glProgramNamedParameter4fvNV proc + mov r11, __blue_glCore_glProgramNamedParameter4fvNV jmp r11 -bluegl_glVertexAttribI2iEXT endp +bluegl_glProgramNamedParameter4fvNV endp extrn __blue_glCore_glProgramNamedParameter4dNV: qword bluegl_glProgramNamedParameter4dNV proc @@ -12453,2837 +12481,2819 @@ bluegl_glProgramNamedParameter4dNV proc jmp r11 bluegl_glProgramNamedParameter4dNV endp -extrn __blue_glCore_glProgramStringARB: qword -bluegl_glProgramStringARB proc - mov r11, __blue_glCore_glProgramStringARB - jmp r11 -bluegl_glProgramStringARB endp - -extrn __blue_glCore_glWindowPos3fvMESA: qword -bluegl_glWindowPos3fvMESA proc - mov r11, __blue_glCore_glWindowPos3fvMESA - jmp r11 -bluegl_glWindowPos3fvMESA endp - -extrn __blue_glCore_glBlendFunciARB: qword -bluegl_glBlendFunciARB proc - mov r11, __blue_glCore_glBlendFunciARB - jmp r11 -bluegl_glBlendFunciARB endp - -extrn __blue_glCore_glVertexAttrib4dvNV: qword -bluegl_glVertexAttrib4dvNV proc - mov r11, __blue_glCore_glVertexAttrib4dvNV +extrn __blue_glCore_glProgramNamedParameter4dvNV: qword +bluegl_glProgramNamedParameter4dvNV proc + mov r11, __blue_glCore_glProgramNamedParameter4dvNV jmp r11 -bluegl_glVertexAttrib4dvNV endp +bluegl_glProgramNamedParameter4dvNV endp -extrn __blue_glCore_glWindowPos3dvARB: qword -bluegl_glWindowPos3dvARB proc - mov r11, __blue_glCore_glWindowPos3dvARB +extrn __blue_glCore_glGetProgramNamedParameterfvNV: qword +bluegl_glGetProgramNamedParameterfvNV proc + mov r11, __blue_glCore_glGetProgramNamedParameterfvNV jmp r11 -bluegl_glWindowPos3dvARB endp +bluegl_glGetProgramNamedParameterfvNV endp -extrn __blue_glCore_glMultiTexCoord1bvOES: qword -bluegl_glMultiTexCoord1bvOES proc - mov r11, __blue_glCore_glMultiTexCoord1bvOES +extrn __blue_glCore_glGetProgramNamedParameterdvNV: qword +bluegl_glGetProgramNamedParameterdvNV proc + mov r11, __blue_glCore_glGetProgramNamedParameterdvNV jmp r11 -bluegl_glMultiTexCoord1bvOES endp +bluegl_glGetProgramNamedParameterdvNV endp -extrn __blue_glCore_glVertexAttrib4fvARB: qword -bluegl_glVertexAttrib4fvARB proc - mov r11, __blue_glCore_glVertexAttrib4fvARB +extrn __blue_glCore_glCoverageModulationTableNV: qword +bluegl_glCoverageModulationTableNV proc + mov r11, __blue_glCore_glCoverageModulationTableNV jmp r11 -bluegl_glVertexAttrib4fvARB endp +bluegl_glCoverageModulationTableNV endp -extrn __blue_glCore_glPopGroupMarkerEXT: qword -bluegl_glPopGroupMarkerEXT proc - mov r11, __blue_glCore_glPopGroupMarkerEXT +extrn __blue_glCore_glGetCoverageModulationTableNV: qword +bluegl_glGetCoverageModulationTableNV proc + mov r11, __blue_glCore_glGetCoverageModulationTableNV jmp r11 -bluegl_glPopGroupMarkerEXT endp +bluegl_glGetCoverageModulationTableNV endp -extrn __blue_glCore_glMultiDrawElements: qword -bluegl_glMultiDrawElements proc - mov r11, __blue_glCore_glMultiDrawElements +extrn __blue_glCore_glCoverageModulationNV: qword +bluegl_glCoverageModulationNV proc + mov r11, __blue_glCore_glCoverageModulationNV jmp r11 -bluegl_glMultiDrawElements endp +bluegl_glCoverageModulationNV endp -extrn __blue_glCore_glGetInstrumentsSGIX: qword -bluegl_glGetInstrumentsSGIX proc - mov r11, __blue_glCore_glGetInstrumentsSGIX +extrn __blue_glCore_glRenderbufferStorageMultisampleCoverageNV: qword +bluegl_glRenderbufferStorageMultisampleCoverageNV proc + mov r11, __blue_glCore_glRenderbufferStorageMultisampleCoverageNV jmp r11 -bluegl_glGetInstrumentsSGIX endp +bluegl_glRenderbufferStorageMultisampleCoverageNV endp -extrn __blue_glCore_glProgramUniform4dv: qword -bluegl_glProgramUniform4dv proc - mov r11, __blue_glCore_glProgramUniform4dv +extrn __blue_glCore_glProgramVertexLimitNV: qword +bluegl_glProgramVertexLimitNV proc + mov r11, __blue_glCore_glProgramVertexLimitNV jmp r11 -bluegl_glProgramUniform4dv endp +bluegl_glProgramVertexLimitNV endp -extrn __blue_glCore_glColorTableEXT: qword -bluegl_glColorTableEXT proc - mov r11, __blue_glCore_glColorTableEXT +extrn __blue_glCore_glFramebufferTextureEXT: qword +bluegl_glFramebufferTextureEXT proc + mov r11, __blue_glCore_glFramebufferTextureEXT jmp r11 -bluegl_glColorTableEXT endp +bluegl_glFramebufferTextureEXT endp -extrn __blue_glCore_glTexSubImage1D: qword -bluegl_glTexSubImage1D proc - mov r11, __blue_glCore_glTexSubImage1D +extrn __blue_glCore_glFramebufferTextureFaceEXT: qword +bluegl_glFramebufferTextureFaceEXT proc + mov r11, __blue_glCore_glFramebufferTextureFaceEXT jmp r11 -bluegl_glTexSubImage1D endp +bluegl_glFramebufferTextureFaceEXT endp -extrn __blue_glCore_glBeginPerfMonitorAMD: qword -bluegl_glBeginPerfMonitorAMD proc - mov r11, __blue_glCore_glBeginPerfMonitorAMD +extrn __blue_glCore_glProgramLocalParameterI4iNV: qword +bluegl_glProgramLocalParameterI4iNV proc + mov r11, __blue_glCore_glProgramLocalParameterI4iNV jmp r11 -bluegl_glBeginPerfMonitorAMD endp +bluegl_glProgramLocalParameterI4iNV endp -extrn __blue_glCore_glPointParameterfvSGIS: qword -bluegl_glPointParameterfvSGIS proc - mov r11, __blue_glCore_glPointParameterfvSGIS +extrn __blue_glCore_glProgramLocalParameterI4ivNV: qword +bluegl_glProgramLocalParameterI4ivNV proc + mov r11, __blue_glCore_glProgramLocalParameterI4ivNV jmp r11 -bluegl_glPointParameterfvSGIS endp +bluegl_glProgramLocalParameterI4ivNV endp -extrn __blue_glCore_glGetImageTransformParameterfvHP: qword -bluegl_glGetImageTransformParameterfvHP proc - mov r11, __blue_glCore_glGetImageTransformParameterfvHP +extrn __blue_glCore_glProgramLocalParametersI4ivNV: qword +bluegl_glProgramLocalParametersI4ivNV proc + mov r11, __blue_glCore_glProgramLocalParametersI4ivNV jmp r11 -bluegl_glGetImageTransformParameterfvHP endp +bluegl_glProgramLocalParametersI4ivNV endp -extrn __blue_glCore_glVertex3hvNV: qword -bluegl_glVertex3hvNV proc - mov r11, __blue_glCore_glVertex3hvNV +extrn __blue_glCore_glProgramLocalParameterI4uiNV: qword +bluegl_glProgramLocalParameterI4uiNV proc + mov r11, __blue_glCore_glProgramLocalParameterI4uiNV jmp r11 -bluegl_glVertex3hvNV endp +bluegl_glProgramLocalParameterI4uiNV endp -extrn __blue_glCore_glTexCoord4fVertex4fvSUN: qword -bluegl_glTexCoord4fVertex4fvSUN proc - mov r11, __blue_glCore_glTexCoord4fVertex4fvSUN +extrn __blue_glCore_glProgramLocalParameterI4uivNV: qword +bluegl_glProgramLocalParameterI4uivNV proc + mov r11, __blue_glCore_glProgramLocalParameterI4uivNV jmp r11 -bluegl_glTexCoord4fVertex4fvSUN endp +bluegl_glProgramLocalParameterI4uivNV endp -extrn __blue_glCore_glCompressedTexSubImage1D: qword -bluegl_glCompressedTexSubImage1D proc - mov r11, __blue_glCore_glCompressedTexSubImage1D +extrn __blue_glCore_glProgramLocalParametersI4uivNV: qword +bluegl_glProgramLocalParametersI4uivNV proc + mov r11, __blue_glCore_glProgramLocalParametersI4uivNV jmp r11 -bluegl_glCompressedTexSubImage1D endp +bluegl_glProgramLocalParametersI4uivNV endp -extrn __blue_glCore_glWindowPos2dvMESA: qword -bluegl_glWindowPos2dvMESA proc - mov r11, __blue_glCore_glWindowPos2dvMESA +extrn __blue_glCore_glProgramEnvParameterI4iNV: qword +bluegl_glProgramEnvParameterI4iNV proc + mov r11, __blue_glCore_glProgramEnvParameterI4iNV jmp r11 -bluegl_glWindowPos2dvMESA endp +bluegl_glProgramEnvParameterI4iNV endp -extrn __blue_glCore_glGetSamplerParameteriv: qword -bluegl_glGetSamplerParameteriv proc - mov r11, __blue_glCore_glGetSamplerParameteriv +extrn __blue_glCore_glProgramEnvParameterI4ivNV: qword +bluegl_glProgramEnvParameterI4ivNV proc + mov r11, __blue_glCore_glProgramEnvParameterI4ivNV jmp r11 -bluegl_glGetSamplerParameteriv endp +bluegl_glProgramEnvParameterI4ivNV endp -extrn __blue_glCore_glColorPointerListIBM: qword -bluegl_glColorPointerListIBM proc - mov r11, __blue_glCore_glColorPointerListIBM +extrn __blue_glCore_glProgramEnvParametersI4ivNV: qword +bluegl_glProgramEnvParametersI4ivNV proc + mov r11, __blue_glCore_glProgramEnvParametersI4ivNV jmp r11 -bluegl_glColorPointerListIBM endp +bluegl_glProgramEnvParametersI4ivNV endp -extrn __blue_glCore_glGetFinalCombinerInputParameterivNV: qword -bluegl_glGetFinalCombinerInputParameterivNV proc - mov r11, __blue_glCore_glGetFinalCombinerInputParameterivNV +extrn __blue_glCore_glProgramEnvParameterI4uiNV: qword +bluegl_glProgramEnvParameterI4uiNV proc + mov r11, __blue_glCore_glProgramEnvParameterI4uiNV jmp r11 -bluegl_glGetFinalCombinerInputParameterivNV endp +bluegl_glProgramEnvParameterI4uiNV endp -extrn __blue_glCore_glGetVertexAttribiv: qword -bluegl_glGetVertexAttribiv proc - mov r11, __blue_glCore_glGetVertexAttribiv +extrn __blue_glCore_glProgramEnvParameterI4uivNV: qword +bluegl_glProgramEnvParameterI4uivNV proc + mov r11, __blue_glCore_glProgramEnvParameterI4uivNV jmp r11 -bluegl_glGetVertexAttribiv endp +bluegl_glProgramEnvParameterI4uivNV endp -extrn __blue_glCore_glGetTexImage: qword -bluegl_glGetTexImage proc - mov r11, __blue_glCore_glGetTexImage +extrn __blue_glCore_glProgramEnvParametersI4uivNV: qword +bluegl_glProgramEnvParametersI4uivNV proc + mov r11, __blue_glCore_glProgramEnvParametersI4uivNV jmp r11 -bluegl_glGetTexImage endp +bluegl_glProgramEnvParametersI4uivNV endp -extrn __blue_glCore_glBufferSubData: qword -bluegl_glBufferSubData proc - mov r11, __blue_glCore_glBufferSubData +extrn __blue_glCore_glGetProgramLocalParameterIivNV: qword +bluegl_glGetProgramLocalParameterIivNV proc + mov r11, __blue_glCore_glGetProgramLocalParameterIivNV jmp r11 -bluegl_glBufferSubData endp +bluegl_glGetProgramLocalParameterIivNV endp -extrn __blue_glCore_glVertexAttrib3sARB: qword -bluegl_glVertexAttrib3sARB proc - mov r11, __blue_glCore_glVertexAttrib3sARB +extrn __blue_glCore_glGetProgramLocalParameterIuivNV: qword +bluegl_glGetProgramLocalParameterIuivNV proc + mov r11, __blue_glCore_glGetProgramLocalParameterIuivNV jmp r11 -bluegl_glVertexAttrib3sARB endp +bluegl_glGetProgramLocalParameterIuivNV endp -extrn __blue_glCore_glIsTextureHandleResidentARB: qword -bluegl_glIsTextureHandleResidentARB proc - mov r11, __blue_glCore_glIsTextureHandleResidentARB +extrn __blue_glCore_glGetProgramEnvParameterIivNV: qword +bluegl_glGetProgramEnvParameterIivNV proc + mov r11, __blue_glCore_glGetProgramEnvParameterIivNV jmp r11 -bluegl_glIsTextureHandleResidentARB endp +bluegl_glGetProgramEnvParameterIivNV endp -extrn __blue_glCore_glMultiTexCoord3i: qword -bluegl_glMultiTexCoord3i proc - mov r11, __blue_glCore_glMultiTexCoord3i +extrn __blue_glCore_glGetProgramEnvParameterIuivNV: qword +bluegl_glGetProgramEnvParameterIuivNV proc + mov r11, __blue_glCore_glGetProgramEnvParameterIuivNV jmp r11 -bluegl_glMultiTexCoord3i endp +bluegl_glGetProgramEnvParameterIuivNV endp -extrn __blue_glCore_glLinkProgramARB: qword -bluegl_glLinkProgramARB proc - mov r11, __blue_glCore_glLinkProgramARB +extrn __blue_glCore_glProgramSubroutineParametersuivNV: qword +bluegl_glProgramSubroutineParametersuivNV proc + mov r11, __blue_glCore_glProgramSubroutineParametersuivNV jmp r11 -bluegl_glLinkProgramARB endp +bluegl_glProgramSubroutineParametersuivNV endp -extrn __blue_glCore_glIsProgramNV: qword -bluegl_glIsProgramNV proc - mov r11, __blue_glCore_glIsProgramNV +extrn __blue_glCore_glGetProgramSubroutineParameteruivNV: qword +bluegl_glGetProgramSubroutineParameteruivNV proc + mov r11, __blue_glCore_glGetProgramSubroutineParameteruivNV jmp r11 -bluegl_glIsProgramNV endp +bluegl_glGetProgramSubroutineParameteruivNV endp -extrn __blue_glCore_glVertexAttribI4i: qword -bluegl_glVertexAttribI4i proc - mov r11, __blue_glCore_glVertexAttribI4i +extrn __blue_glCore_glVertex2hNV: qword +bluegl_glVertex2hNV proc + mov r11, __blue_glCore_glVertex2hNV jmp r11 -bluegl_glVertexAttribI4i endp +bluegl_glVertex2hNV endp -extrn __blue_glCore_glUniform1i: qword -bluegl_glUniform1i proc - mov r11, __blue_glCore_glUniform1i +extrn __blue_glCore_glVertex2hvNV: qword +bluegl_glVertex2hvNV proc + mov r11, __blue_glCore_glVertex2hvNV jmp r11 -bluegl_glUniform1i endp +bluegl_glVertex2hvNV endp -extrn __blue_glCore_glBindAttribLocationARB: qword -bluegl_glBindAttribLocationARB proc - mov r11, __blue_glCore_glBindAttribLocationARB +extrn __blue_glCore_glVertex3hNV: qword +bluegl_glVertex3hNV proc + mov r11, __blue_glCore_glVertex3hNV jmp r11 -bluegl_glBindAttribLocationARB endp +bluegl_glVertex3hNV endp -extrn __blue_glCore_glProgramUniform4i64vNV: qword -bluegl_glProgramUniform4i64vNV proc - mov r11, __blue_glCore_glProgramUniform4i64vNV +extrn __blue_glCore_glVertex3hvNV: qword +bluegl_glVertex3hvNV proc + mov r11, __blue_glCore_glVertex3hvNV jmp r11 -bluegl_glProgramUniform4i64vNV endp +bluegl_glVertex3hvNV endp -extrn __blue_glCore_glVertex4xOES: qword -bluegl_glVertex4xOES proc - mov r11, __blue_glCore_glVertex4xOES +extrn __blue_glCore_glVertex4hNV: qword +bluegl_glVertex4hNV proc + mov r11, __blue_glCore_glVertex4hNV jmp r11 -bluegl_glVertex4xOES endp +bluegl_glVertex4hNV endp -extrn __blue_glCore_glSetLocalConstantEXT: qword -bluegl_glSetLocalConstantEXT proc - mov r11, __blue_glCore_glSetLocalConstantEXT +extrn __blue_glCore_glVertex4hvNV: qword +bluegl_glVertex4hvNV proc + mov r11, __blue_glCore_glVertex4hvNV jmp r11 -bluegl_glSetLocalConstantEXT endp +bluegl_glVertex4hvNV endp -extrn __blue_glCore_glTexSubImage2D: qword -bluegl_glTexSubImage2D proc - mov r11, __blue_glCore_glTexSubImage2D +extrn __blue_glCore_glNormal3hNV: qword +bluegl_glNormal3hNV proc + mov r11, __blue_glCore_glNormal3hNV jmp r11 -bluegl_glTexSubImage2D endp +bluegl_glNormal3hNV endp -extrn __blue_glCore_glWindowPos2f: qword -bluegl_glWindowPos2f proc - mov r11, __blue_glCore_glWindowPos2f +extrn __blue_glCore_glNormal3hvNV: qword +bluegl_glNormal3hvNV proc + mov r11, __blue_glCore_glNormal3hvNV jmp r11 -bluegl_glWindowPos2f endp +bluegl_glNormal3hvNV endp -extrn __blue_glCore_glVariantPointerEXT: qword -bluegl_glVariantPointerEXT proc - mov r11, __blue_glCore_glVariantPointerEXT +extrn __blue_glCore_glColor3hNV: qword +bluegl_glColor3hNV proc + mov r11, __blue_glCore_glColor3hNV jmp r11 -bluegl_glVariantPointerEXT endp +bluegl_glColor3hNV endp -extrn __blue_glCore_glNamedRenderbufferStorageMultisample: qword -bluegl_glNamedRenderbufferStorageMultisample proc - mov r11, __blue_glCore_glNamedRenderbufferStorageMultisample +extrn __blue_glCore_glColor3hvNV: qword +bluegl_glColor3hvNV proc + mov r11, __blue_glCore_glColor3hvNV jmp r11 -bluegl_glNamedRenderbufferStorageMultisample endp +bluegl_glColor3hvNV endp -extrn __blue_glCore_glFogCoorddvEXT: qword -bluegl_glFogCoorddvEXT proc - mov r11, __blue_glCore_glFogCoorddvEXT +extrn __blue_glCore_glColor4hNV: qword +bluegl_glColor4hNV proc + mov r11, __blue_glCore_glColor4hNV jmp r11 -bluegl_glFogCoorddvEXT endp +bluegl_glColor4hNV endp -extrn __blue_glCore_glMultiModeDrawArraysIBM: qword -bluegl_glMultiModeDrawArraysIBM proc - mov r11, __blue_glCore_glMultiModeDrawArraysIBM +extrn __blue_glCore_glColor4hvNV: qword +bluegl_glColor4hvNV proc + mov r11, __blue_glCore_glColor4hvNV jmp r11 -bluegl_glMultiModeDrawArraysIBM endp +bluegl_glColor4hvNV endp -extrn __blue_glCore_glMatrixLoaddEXT: qword -bluegl_glMatrixLoaddEXT proc - mov r11, __blue_glCore_glMatrixLoaddEXT +extrn __blue_glCore_glTexCoord1hNV: qword +bluegl_glTexCoord1hNV proc + mov r11, __blue_glCore_glTexCoord1hNV jmp r11 -bluegl_glMatrixLoaddEXT endp +bluegl_glTexCoord1hNV endp -extrn __blue_glCore_glDeleteQueriesARB: qword -bluegl_glDeleteQueriesARB proc - mov r11, __blue_glCore_glDeleteQueriesARB +extrn __blue_glCore_glTexCoord1hvNV: qword +bluegl_glTexCoord1hvNV proc + mov r11, __blue_glCore_glTexCoord1hvNV jmp r11 -bluegl_glDeleteQueriesARB endp +bluegl_glTexCoord1hvNV endp -extrn __blue_glCore_glUniform1fvARB: qword -bluegl_glUniform1fvARB proc - mov r11, __blue_glCore_glUniform1fvARB +extrn __blue_glCore_glTexCoord2hNV: qword +bluegl_glTexCoord2hNV proc + mov r11, __blue_glCore_glTexCoord2hNV jmp r11 -bluegl_glUniform1fvARB endp +bluegl_glTexCoord2hNV endp -extrn __blue_glCore_glDrawCommandsNV: qword -bluegl_glDrawCommandsNV proc - mov r11, __blue_glCore_glDrawCommandsNV +extrn __blue_glCore_glTexCoord2hvNV: qword +bluegl_glTexCoord2hvNV proc + mov r11, __blue_glCore_glTexCoord2hvNV jmp r11 -bluegl_glDrawCommandsNV endp +bluegl_glTexCoord2hvNV endp -extrn __blue_glCore_glSecondaryColor3dvEXT: qword -bluegl_glSecondaryColor3dvEXT proc - mov r11, __blue_glCore_glSecondaryColor3dvEXT +extrn __blue_glCore_glTexCoord3hNV: qword +bluegl_glTexCoord3hNV proc + mov r11, __blue_glCore_glTexCoord3hNV jmp r11 -bluegl_glSecondaryColor3dvEXT endp +bluegl_glTexCoord3hNV endp -extrn __blue_glCore_glFlushVertexArrayRangeAPPLE: qword -bluegl_glFlushVertexArrayRangeAPPLE proc - mov r11, __blue_glCore_glFlushVertexArrayRangeAPPLE +extrn __blue_glCore_glTexCoord3hvNV: qword +bluegl_glTexCoord3hvNV proc + mov r11, __blue_glCore_glTexCoord3hvNV jmp r11 -bluegl_glFlushVertexArrayRangeAPPLE endp +bluegl_glTexCoord3hvNV endp -extrn __blue_glCore_glTexEnvxvOES: qword -bluegl_glTexEnvxvOES proc - mov r11, __blue_glCore_glTexEnvxvOES +extrn __blue_glCore_glTexCoord4hNV: qword +bluegl_glTexCoord4hNV proc + mov r11, __blue_glCore_glTexCoord4hNV jmp r11 -bluegl_glTexEnvxvOES endp +bluegl_glTexCoord4hNV endp -extrn __blue_glCore_glGetSeparableFilterEXT: qword -bluegl_glGetSeparableFilterEXT proc - mov r11, __blue_glCore_glGetSeparableFilterEXT +extrn __blue_glCore_glTexCoord4hvNV: qword +bluegl_glTexCoord4hvNV proc + mov r11, __blue_glCore_glTexCoord4hvNV jmp r11 -bluegl_glGetSeparableFilterEXT endp +bluegl_glTexCoord4hvNV endp -extrn __blue_glCore_glVertexAttribI4bvEXT: qword -bluegl_glVertexAttribI4bvEXT proc - mov r11, __blue_glCore_glVertexAttribI4bvEXT +extrn __blue_glCore_glMultiTexCoord1hNV: qword +bluegl_glMultiTexCoord1hNV proc + mov r11, __blue_glCore_glMultiTexCoord1hNV jmp r11 -bluegl_glVertexAttribI4bvEXT endp +bluegl_glMultiTexCoord1hNV endp -extrn __blue_glCore_glUniform3i64NV: qword -bluegl_glUniform3i64NV proc - mov r11, __blue_glCore_glUniform3i64NV +extrn __blue_glCore_glMultiTexCoord1hvNV: qword +bluegl_glMultiTexCoord1hvNV proc + mov r11, __blue_glCore_glMultiTexCoord1hvNV jmp r11 -bluegl_glUniform3i64NV endp +bluegl_glMultiTexCoord1hvNV endp -extrn __blue_glCore_glBlendEquationIndexedAMD: qword -bluegl_glBlendEquationIndexedAMD proc - mov r11, __blue_glCore_glBlendEquationIndexedAMD +extrn __blue_glCore_glMultiTexCoord2hNV: qword +bluegl_glMultiTexCoord2hNV proc + mov r11, __blue_glCore_glMultiTexCoord2hNV jmp r11 -bluegl_glBlendEquationIndexedAMD endp +bluegl_glMultiTexCoord2hNV endp -extrn __blue_glCore_glPointParameterf: qword -bluegl_glPointParameterf proc - mov r11, __blue_glCore_glPointParameterf +extrn __blue_glCore_glMultiTexCoord2hvNV: qword +bluegl_glMultiTexCoord2hvNV proc + mov r11, __blue_glCore_glMultiTexCoord2hvNV jmp r11 -bluegl_glPointParameterf endp +bluegl_glMultiTexCoord2hvNV endp -extrn __blue_glCore_glVertex4bvOES: qword -bluegl_glVertex4bvOES proc - mov r11, __blue_glCore_glVertex4bvOES +extrn __blue_glCore_glMultiTexCoord3hNV: qword +bluegl_glMultiTexCoord3hNV proc + mov r11, __blue_glCore_glMultiTexCoord3hNV jmp r11 -bluegl_glVertex4bvOES endp +bluegl_glMultiTexCoord3hNV endp -extrn __blue_glCore_glStencilThenCoverFillPathNV: qword -bluegl_glStencilThenCoverFillPathNV proc - mov r11, __blue_glCore_glStencilThenCoverFillPathNV +extrn __blue_glCore_glMultiTexCoord3hvNV: qword +bluegl_glMultiTexCoord3hvNV proc + mov r11, __blue_glCore_glMultiTexCoord3hvNV jmp r11 -bluegl_glStencilThenCoverFillPathNV endp +bluegl_glMultiTexCoord3hvNV endp -extrn __blue_glCore_glCompressedTextureImage2DEXT: qword -bluegl_glCompressedTextureImage2DEXT proc - mov r11, __blue_glCore_glCompressedTextureImage2DEXT +extrn __blue_glCore_glMultiTexCoord4hNV: qword +bluegl_glMultiTexCoord4hNV proc + mov r11, __blue_glCore_glMultiTexCoord4hNV jmp r11 -bluegl_glCompressedTextureImage2DEXT endp +bluegl_glMultiTexCoord4hNV endp -extrn __blue_glCore_glBlendEquationSeparate: qword -bluegl_glBlendEquationSeparate proc - mov r11, __blue_glCore_glBlendEquationSeparate +extrn __blue_glCore_glMultiTexCoord4hvNV: qword +bluegl_glMultiTexCoord4hvNV proc + mov r11, __blue_glCore_glMultiTexCoord4hvNV jmp r11 -bluegl_glBlendEquationSeparate endp +bluegl_glMultiTexCoord4hvNV endp -extrn __blue_glCore_glGetNamedFramebufferParameteriv: qword -bluegl_glGetNamedFramebufferParameteriv proc - mov r11, __blue_glCore_glGetNamedFramebufferParameteriv +extrn __blue_glCore_glFogCoordhNV: qword +bluegl_glFogCoordhNV proc + mov r11, __blue_glCore_glFogCoordhNV jmp r11 -bluegl_glGetNamedFramebufferParameteriv endp +bluegl_glFogCoordhNV endp -extrn __blue_glCore_glTexImage3DEXT: qword -bluegl_glTexImage3DEXT proc - mov r11, __blue_glCore_glTexImage3DEXT +extrn __blue_glCore_glFogCoordhvNV: qword +bluegl_glFogCoordhvNV proc + mov r11, __blue_glCore_glFogCoordhvNV jmp r11 -bluegl_glTexImage3DEXT endp +bluegl_glFogCoordhvNV endp -extrn __blue_glCore_glColorFragmentOp3ATI: qword -bluegl_glColorFragmentOp3ATI proc - mov r11, __blue_glCore_glColorFragmentOp3ATI +extrn __blue_glCore_glSecondaryColor3hNV: qword +bluegl_glSecondaryColor3hNV proc + mov r11, __blue_glCore_glSecondaryColor3hNV jmp r11 -bluegl_glColorFragmentOp3ATI endp +bluegl_glSecondaryColor3hNV endp -extrn __blue_glCore_glNormalPointerListIBM: qword -bluegl_glNormalPointerListIBM proc - mov r11, __blue_glCore_glNormalPointerListIBM +extrn __blue_glCore_glSecondaryColor3hvNV: qword +bluegl_glSecondaryColor3hvNV proc + mov r11, __blue_glCore_glSecondaryColor3hvNV jmp r11 -bluegl_glNormalPointerListIBM endp +bluegl_glSecondaryColor3hvNV endp -extrn __blue_glCore_glTexParameteriv: qword -bluegl_glTexParameteriv proc - mov r11, __blue_glCore_glTexParameteriv +extrn __blue_glCore_glVertexWeighthNV: qword +bluegl_glVertexWeighthNV proc + mov r11, __blue_glCore_glVertexWeighthNV jmp r11 -bluegl_glTexParameteriv endp +bluegl_glVertexWeighthNV endp -extrn __blue_glCore_glCompressedTexSubImage2D: qword -bluegl_glCompressedTexSubImage2D proc - mov r11, __blue_glCore_glCompressedTexSubImage2D +extrn __blue_glCore_glVertexWeighthvNV: qword +bluegl_glVertexWeighthvNV proc + mov r11, __blue_glCore_glVertexWeighthvNV jmp r11 -bluegl_glCompressedTexSubImage2D endp +bluegl_glVertexWeighthvNV endp -extrn __blue_glCore_glCoverFillPathNV: qword -bluegl_glCoverFillPathNV proc - mov r11, __blue_glCore_glCoverFillPathNV +extrn __blue_glCore_glVertexAttrib1hNV: qword +bluegl_glVertexAttrib1hNV proc + mov r11, __blue_glCore_glVertexAttrib1hNV jmp r11 -bluegl_glCoverFillPathNV endp +bluegl_glVertexAttrib1hNV endp -extrn __blue_glCore_glProgramUniformMatrix4x2dvEXT: qword -bluegl_glProgramUniformMatrix4x2dvEXT proc - mov r11, __blue_glCore_glProgramUniformMatrix4x2dvEXT +extrn __blue_glCore_glVertexAttrib1hvNV: qword +bluegl_glVertexAttrib1hvNV proc + mov r11, __blue_glCore_glVertexAttrib1hvNV jmp r11 -bluegl_glProgramUniformMatrix4x2dvEXT endp +bluegl_glVertexAttrib1hvNV endp -extrn __blue_glCore_glVertexAttrib1f: qword -bluegl_glVertexAttrib1f proc - mov r11, __blue_glCore_glVertexAttrib1f +extrn __blue_glCore_glVertexAttrib2hNV: qword +bluegl_glVertexAttrib2hNV proc + mov r11, __blue_glCore_glVertexAttrib2hNV jmp r11 -bluegl_glVertexAttrib1f endp +bluegl_glVertexAttrib2hNV endp -extrn __blue_glCore_glAlphaFragmentOp3ATI: qword -bluegl_glAlphaFragmentOp3ATI proc - mov r11, __blue_glCore_glAlphaFragmentOp3ATI +extrn __blue_glCore_glVertexAttrib2hvNV: qword +bluegl_glVertexAttrib2hvNV proc + mov r11, __blue_glCore_glVertexAttrib2hvNV jmp r11 -bluegl_glAlphaFragmentOp3ATI endp +bluegl_glVertexAttrib2hvNV endp -extrn __blue_glCore_glBeginQueryIndexed: qword -bluegl_glBeginQueryIndexed proc - mov r11, __blue_glCore_glBeginQueryIndexed +extrn __blue_glCore_glVertexAttrib3hNV: qword +bluegl_glVertexAttrib3hNV proc + mov r11, __blue_glCore_glVertexAttrib3hNV jmp r11 -bluegl_glBeginQueryIndexed endp +bluegl_glVertexAttrib3hNV endp -extrn __blue_glCore_glProgramUniformMatrix2x3fv: qword -bluegl_glProgramUniformMatrix2x3fv proc - mov r11, __blue_glCore_glProgramUniformMatrix2x3fv +extrn __blue_glCore_glVertexAttrib3hvNV: qword +bluegl_glVertexAttrib3hvNV proc + mov r11, __blue_glCore_glVertexAttrib3hvNV jmp r11 -bluegl_glProgramUniformMatrix2x3fv endp +bluegl_glVertexAttrib3hvNV endp -extrn __blue_glCore_glProgramUniform4ui64vNV: qword -bluegl_glProgramUniform4ui64vNV proc - mov r11, __blue_glCore_glProgramUniform4ui64vNV +extrn __blue_glCore_glVertexAttrib4hNV: qword +bluegl_glVertexAttrib4hNV proc + mov r11, __blue_glCore_glVertexAttrib4hNV jmp r11 -bluegl_glProgramUniform4ui64vNV endp +bluegl_glVertexAttrib4hNV endp -extrn __blue_glCore_glUniform1ui64NV: qword -bluegl_glUniform1ui64NV proc - mov r11, __blue_glCore_glUniform1ui64NV +extrn __blue_glCore_glVertexAttrib4hvNV: qword +bluegl_glVertexAttrib4hvNV proc + mov r11, __blue_glCore_glVertexAttrib4hvNV jmp r11 -bluegl_glUniform1ui64NV endp +bluegl_glVertexAttrib4hvNV endp -extrn __blue_glCore_glMultiTexCoord3svARB: qword -bluegl_glMultiTexCoord3svARB proc - mov r11, __blue_glCore_glMultiTexCoord3svARB +extrn __blue_glCore_glVertexAttribs1hvNV: qword +bluegl_glVertexAttribs1hvNV proc + mov r11, __blue_glCore_glVertexAttribs1hvNV jmp r11 -bluegl_glMultiTexCoord3svARB endp +bluegl_glVertexAttribs1hvNV endp -extrn __blue_glCore_glWeightivARB: qword -bluegl_glWeightivARB proc - mov r11, __blue_glCore_glWeightivARB +extrn __blue_glCore_glVertexAttribs2hvNV: qword +bluegl_glVertexAttribs2hvNV proc + mov r11, __blue_glCore_glVertexAttribs2hvNV jmp r11 -bluegl_glWeightivARB endp +bluegl_glVertexAttribs2hvNV endp -extrn __blue_glCore_glMultiTexCoord4xOES: qword -bluegl_glMultiTexCoord4xOES proc - mov r11, __blue_glCore_glMultiTexCoord4xOES +extrn __blue_glCore_glVertexAttribs3hvNV: qword +bluegl_glVertexAttribs3hvNV proc + mov r11, __blue_glCore_glVertexAttribs3hvNV jmp r11 -bluegl_glMultiTexCoord4xOES endp +bluegl_glVertexAttribs3hvNV endp -extrn __blue_glCore_glVertexAttribL2i64NV: qword -bluegl_glVertexAttribL2i64NV proc - mov r11, __blue_glCore_glVertexAttribL2i64NV +extrn __blue_glCore_glVertexAttribs4hvNV: qword +bluegl_glVertexAttribs4hvNV proc + mov r11, __blue_glCore_glVertexAttribs4hvNV jmp r11 -bluegl_glVertexAttribL2i64NV endp +bluegl_glVertexAttribs4hvNV endp -extrn __blue_glCore_glProgramUniformMatrix3x4dv: qword -bluegl_glProgramUniformMatrix3x4dv proc - mov r11, __blue_glCore_glProgramUniformMatrix3x4dv +extrn __blue_glCore_glGetInternalformatSampleivNV: qword +bluegl_glGetInternalformatSampleivNV proc + mov r11, __blue_glCore_glGetInternalformatSampleivNV jmp r11 -bluegl_glProgramUniformMatrix3x4dv endp +bluegl_glGetInternalformatSampleivNV endp -extrn __blue_glCore_glProgramParameteriEXT: qword -bluegl_glProgramParameteriEXT proc - mov r11, __blue_glCore_glProgramParameteriEXT +extrn __blue_glCore_glGenOcclusionQueriesNV: qword +bluegl_glGenOcclusionQueriesNV proc + mov r11, __blue_glCore_glGenOcclusionQueriesNV jmp r11 -bluegl_glProgramParameteriEXT endp +bluegl_glGenOcclusionQueriesNV endp -extrn __blue_glCore_glSecondaryColor3sEXT: qword -bluegl_glSecondaryColor3sEXT proc - mov r11, __blue_glCore_glSecondaryColor3sEXT +extrn __blue_glCore_glDeleteOcclusionQueriesNV: qword +bluegl_glDeleteOcclusionQueriesNV proc + mov r11, __blue_glCore_glDeleteOcclusionQueriesNV jmp r11 -bluegl_glSecondaryColor3sEXT endp +bluegl_glDeleteOcclusionQueriesNV endp -extrn __blue_glCore_glCompressedTextureSubImage3DEXT: qword -bluegl_glCompressedTextureSubImage3DEXT proc - mov r11, __blue_glCore_glCompressedTextureSubImage3DEXT +extrn __blue_glCore_glIsOcclusionQueryNV: qword +bluegl_glIsOcclusionQueryNV proc + mov r11, __blue_glCore_glIsOcclusionQueryNV jmp r11 -bluegl_glCompressedTextureSubImage3DEXT endp +bluegl_glIsOcclusionQueryNV endp -extrn __blue_glCore_glGetPointervEXT: qword -bluegl_glGetPointervEXT proc - mov r11, __blue_glCore_glGetPointervEXT +extrn __blue_glCore_glBeginOcclusionQueryNV: qword +bluegl_glBeginOcclusionQueryNV proc + mov r11, __blue_glCore_glBeginOcclusionQueryNV jmp r11 -bluegl_glGetPointervEXT endp +bluegl_glBeginOcclusionQueryNV endp -extrn __blue_glCore_glGetMinmaxParameterfvEXT: qword -bluegl_glGetMinmaxParameterfvEXT proc - mov r11, __blue_glCore_glGetMinmaxParameterfvEXT +extrn __blue_glCore_glEndOcclusionQueryNV: qword +bluegl_glEndOcclusionQueryNV proc + mov r11, __blue_glCore_glEndOcclusionQueryNV jmp r11 -bluegl_glGetMinmaxParameterfvEXT endp +bluegl_glEndOcclusionQueryNV endp -extrn __blue_glCore_glMultiTexCoord4sARB: qword -bluegl_glMultiTexCoord4sARB proc - mov r11, __blue_glCore_glMultiTexCoord4sARB +extrn __blue_glCore_glGetOcclusionQueryivNV: qword +bluegl_glGetOcclusionQueryivNV proc + mov r11, __blue_glCore_glGetOcclusionQueryivNV jmp r11 -bluegl_glMultiTexCoord4sARB endp +bluegl_glGetOcclusionQueryivNV endp -extrn __blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance: qword -bluegl_glDrawElementsInstancedBaseVertexBaseInstance proc - mov r11, __blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance +extrn __blue_glCore_glGetOcclusionQueryuivNV: qword +bluegl_glGetOcclusionQueryuivNV proc + mov r11, __blue_glCore_glGetOcclusionQueryuivNV jmp r11 -bluegl_glDrawElementsInstancedBaseVertexBaseInstance endp +bluegl_glGetOcclusionQueryuivNV endp -extrn __blue_glCore_glVDPAUSurfaceAccessNV: qword -bluegl_glVDPAUSurfaceAccessNV proc - mov r11, __blue_glCore_glVDPAUSurfaceAccessNV +extrn __blue_glCore_glProgramBufferParametersfvNV: qword +bluegl_glProgramBufferParametersfvNV proc + mov r11, __blue_glCore_glProgramBufferParametersfvNV jmp r11 -bluegl_glVDPAUSurfaceAccessNV endp +bluegl_glProgramBufferParametersfvNV endp -extrn __blue_glCore_glMultiTexCoord2iARB: qword -bluegl_glMultiTexCoord2iARB proc - mov r11, __blue_glCore_glMultiTexCoord2iARB +extrn __blue_glCore_glProgramBufferParametersIivNV: qword +bluegl_glProgramBufferParametersIivNV proc + mov r11, __blue_glCore_glProgramBufferParametersIivNV jmp r11 -bluegl_glMultiTexCoord2iARB endp +bluegl_glProgramBufferParametersIivNV endp -extrn __blue_glCore_glPathCommandsNV: qword -bluegl_glPathCommandsNV proc - mov r11, __blue_glCore_glPathCommandsNV +extrn __blue_glCore_glProgramBufferParametersIuivNV: qword +bluegl_glProgramBufferParametersIuivNV proc + mov r11, __blue_glCore_glProgramBufferParametersIuivNV jmp r11 -bluegl_glPathCommandsNV endp +bluegl_glProgramBufferParametersIuivNV endp -extrn __blue_glCore_glSetMultisamplefvAMD: qword -bluegl_glSetMultisamplefvAMD proc - mov r11, __blue_glCore_glSetMultisamplefvAMD +extrn __blue_glCore_glGenPathsNV: qword +bluegl_glGenPathsNV proc + mov r11, __blue_glCore_glGenPathsNV jmp r11 -bluegl_glSetMultisamplefvAMD endp +bluegl_glGenPathsNV endp -extrn __blue_glCore_glVertexStream3ivATI: qword -bluegl_glVertexStream3ivATI proc - mov r11, __blue_glCore_glVertexStream3ivATI +extrn __blue_glCore_glDeletePathsNV: qword +bluegl_glDeletePathsNV proc + mov r11, __blue_glCore_glDeletePathsNV jmp r11 -bluegl_glVertexStream3ivATI endp +bluegl_glDeletePathsNV endp -extrn __blue_glCore_glVDPAUUnregisterSurfaceNV: qword -bluegl_glVDPAUUnregisterSurfaceNV proc - mov r11, __blue_glCore_glVDPAUUnregisterSurfaceNV +extrn __blue_glCore_glIsPathNV: qword +bluegl_glIsPathNV proc + mov r11, __blue_glCore_glIsPathNV jmp r11 -bluegl_glVDPAUUnregisterSurfaceNV endp +bluegl_glIsPathNV endp -extrn __blue_glCore_glTextureRenderbufferEXT: qword -bluegl_glTextureRenderbufferEXT proc - mov r11, __blue_glCore_glTextureRenderbufferEXT +extrn __blue_glCore_glPathCommandsNV: qword +bluegl_glPathCommandsNV proc + mov r11, __blue_glCore_glPathCommandsNV jmp r11 -bluegl_glTextureRenderbufferEXT endp +bluegl_glPathCommandsNV endp -extrn __blue_glCore_glProgramLocalParameter4dARB: qword -bluegl_glProgramLocalParameter4dARB proc - mov r11, __blue_glCore_glProgramLocalParameter4dARB +extrn __blue_glCore_glPathCoordsNV: qword +bluegl_glPathCoordsNV proc + mov r11, __blue_glCore_glPathCoordsNV jmp r11 -bluegl_glProgramLocalParameter4dARB endp +bluegl_glPathCoordsNV endp -extrn __blue_glCore_glBindVertexShaderEXT: qword -bluegl_glBindVertexShaderEXT proc - mov r11, __blue_glCore_glBindVertexShaderEXT +extrn __blue_glCore_glPathSubCommandsNV: qword +bluegl_glPathSubCommandsNV proc + mov r11, __blue_glCore_glPathSubCommandsNV jmp r11 -bluegl_glBindVertexShaderEXT endp +bluegl_glPathSubCommandsNV endp -extrn __blue_glCore_glEnableVariantClientStateEXT: qword -bluegl_glEnableVariantClientStateEXT proc - mov r11, __blue_glCore_glEnableVariantClientStateEXT +extrn __blue_glCore_glPathSubCoordsNV: qword +bluegl_glPathSubCoordsNV proc + mov r11, __blue_glCore_glPathSubCoordsNV jmp r11 -bluegl_glEnableVariantClientStateEXT endp +bluegl_glPathSubCoordsNV endp -extrn __blue_glCore_glGetPointerIndexedvEXT: qword -bluegl_glGetPointerIndexedvEXT proc - mov r11, __blue_glCore_glGetPointerIndexedvEXT +extrn __blue_glCore_glPathStringNV: qword +bluegl_glPathStringNV proc + mov r11, __blue_glCore_glPathStringNV jmp r11 -bluegl_glGetPointerIndexedvEXT endp +bluegl_glPathStringNV endp -extrn __blue_glCore_glMultiTexEnvfEXT: qword -bluegl_glMultiTexEnvfEXT proc - mov r11, __blue_glCore_glMultiTexEnvfEXT +extrn __blue_glCore_glPathGlyphsNV: qword +bluegl_glPathGlyphsNV proc + mov r11, __blue_glCore_glPathGlyphsNV jmp r11 -bluegl_glMultiTexEnvfEXT endp +bluegl_glPathGlyphsNV endp -extrn __blue_glCore_glFrustumxOES: qword -bluegl_glFrustumxOES proc - mov r11, __blue_glCore_glFrustumxOES +extrn __blue_glCore_glPathGlyphRangeNV: qword +bluegl_glPathGlyphRangeNV proc + mov r11, __blue_glCore_glPathGlyphRangeNV jmp r11 -bluegl_glFrustumxOES endp +bluegl_glPathGlyphRangeNV endp -extrn __blue_glCore_glAreProgramsResidentNV: qword -bluegl_glAreProgramsResidentNV proc - mov r11, __blue_glCore_glAreProgramsResidentNV +extrn __blue_glCore_glWeightPathsNV: qword +bluegl_glWeightPathsNV proc + mov r11, __blue_glCore_glWeightPathsNV jmp r11 -bluegl_glAreProgramsResidentNV endp +bluegl_glWeightPathsNV endp -extrn __blue_glCore_glFramebufferSampleLocationsfvNV: qword -bluegl_glFramebufferSampleLocationsfvNV proc - mov r11, __blue_glCore_glFramebufferSampleLocationsfvNV +extrn __blue_glCore_glCopyPathNV: qword +bluegl_glCopyPathNV proc + mov r11, __blue_glCore_glCopyPathNV jmp r11 -bluegl_glFramebufferSampleLocationsfvNV endp +bluegl_glCopyPathNV endp -extrn __blue_glCore_glVertexAttrib1sNV: qword -bluegl_glVertexAttrib1sNV proc - mov r11, __blue_glCore_glVertexAttrib1sNV +extrn __blue_glCore_glInterpolatePathsNV: qword +bluegl_glInterpolatePathsNV proc + mov r11, __blue_glCore_glInterpolatePathsNV jmp r11 -bluegl_glVertexAttrib1sNV endp +bluegl_glInterpolatePathsNV endp -extrn __blue_glCore_glGetActiveUniformBlockName: qword -bluegl_glGetActiveUniformBlockName proc - mov r11, __blue_glCore_glGetActiveUniformBlockName +extrn __blue_glCore_glTransformPathNV: qword +bluegl_glTransformPathNV proc + mov r11, __blue_glCore_glTransformPathNV jmp r11 -bluegl_glGetActiveUniformBlockName endp +bluegl_glTransformPathNV endp -extrn __blue_glCore_glVertex2xOES: qword -bluegl_glVertex2xOES proc - mov r11, __blue_glCore_glVertex2xOES +extrn __blue_glCore_glPathParameterivNV: qword +bluegl_glPathParameterivNV proc + mov r11, __blue_glCore_glPathParameterivNV jmp r11 -bluegl_glVertex2xOES endp +bluegl_glPathParameterivNV endp -extrn __blue_glCore_glResetMinmaxEXT: qword -bluegl_glResetMinmaxEXT proc - mov r11, __blue_glCore_glResetMinmaxEXT +extrn __blue_glCore_glPathParameteriNV: qword +bluegl_glPathParameteriNV proc + mov r11, __blue_glCore_glPathParameteriNV jmp r11 -bluegl_glResetMinmaxEXT endp +bluegl_glPathParameteriNV endp -extrn __blue_glCore_glMatrixOrthoEXT: qword -bluegl_glMatrixOrthoEXT proc - mov r11, __blue_glCore_glMatrixOrthoEXT +extrn __blue_glCore_glPathParameterfvNV: qword +bluegl_glPathParameterfvNV proc + mov r11, __blue_glCore_glPathParameterfvNV jmp r11 -bluegl_glMatrixOrthoEXT endp +bluegl_glPathParameterfvNV endp -extrn __blue_glCore_glUniform4ui64vNV: qword -bluegl_glUniform4ui64vNV proc - mov r11, __blue_glCore_glUniform4ui64vNV +extrn __blue_glCore_glPathParameterfNV: qword +bluegl_glPathParameterfNV proc + mov r11, __blue_glCore_glPathParameterfNV jmp r11 -bluegl_glUniform4ui64vNV endp +bluegl_glPathParameterfNV endp -extrn __blue_glCore_glProgramUniformMatrix4x3fvEXT: qword -bluegl_glProgramUniformMatrix4x3fvEXT proc - mov r11, __blue_glCore_glProgramUniformMatrix4x3fvEXT +extrn __blue_glCore_glPathDashArrayNV: qword +bluegl_glPathDashArrayNV proc + mov r11, __blue_glCore_glPathDashArrayNV jmp r11 -bluegl_glProgramUniformMatrix4x3fvEXT endp +bluegl_glPathDashArrayNV endp -extrn __blue_glCore_glVertexAttribs1svNV: qword -bluegl_glVertexAttribs1svNV proc - mov r11, __blue_glCore_glVertexAttribs1svNV +extrn __blue_glCore_glPathStencilFuncNV: qword +bluegl_glPathStencilFuncNV proc + mov r11, __blue_glCore_glPathStencilFuncNV jmp r11 -bluegl_glVertexAttribs1svNV endp +bluegl_glPathStencilFuncNV endp -extrn __blue_glCore_glDebugMessageCallbackAMD: qword -bluegl_glDebugMessageCallbackAMD proc - mov r11, __blue_glCore_glDebugMessageCallbackAMD +extrn __blue_glCore_glPathStencilDepthOffsetNV: qword +bluegl_glPathStencilDepthOffsetNV proc + mov r11, __blue_glCore_glPathStencilDepthOffsetNV jmp r11 -bluegl_glDebugMessageCallbackAMD endp +bluegl_glPathStencilDepthOffsetNV endp -extrn __blue_glCore_glProgramUniform1uiEXT: qword -bluegl_glProgramUniform1uiEXT proc - mov r11, __blue_glCore_glProgramUniform1uiEXT +extrn __blue_glCore_glStencilFillPathNV: qword +bluegl_glStencilFillPathNV proc + mov r11, __blue_glCore_glStencilFillPathNV jmp r11 -bluegl_glProgramUniform1uiEXT endp +bluegl_glStencilFillPathNV endp -extrn __blue_glCore_glTexBufferEXT: qword -bluegl_glTexBufferEXT proc - mov r11, __blue_glCore_glTexBufferEXT +extrn __blue_glCore_glStencilStrokePathNV: qword +bluegl_glStencilStrokePathNV proc + mov r11, __blue_glCore_glStencilStrokePathNV jmp r11 -bluegl_glTexBufferEXT endp +bluegl_glStencilStrokePathNV endp -extrn __blue_glCore_glUniform4f: qword -bluegl_glUniform4f proc - mov r11, __blue_glCore_glUniform4f +extrn __blue_glCore_glStencilFillPathInstancedNV: qword +bluegl_glStencilFillPathInstancedNV proc + mov r11, __blue_glCore_glStencilFillPathInstancedNV jmp r11 -bluegl_glUniform4f endp +bluegl_glStencilFillPathInstancedNV endp -extrn __blue_glCore_glUpdateObjectBufferATI: qword -bluegl_glUpdateObjectBufferATI proc - mov r11, __blue_glCore_glUpdateObjectBufferATI +extrn __blue_glCore_glStencilStrokePathInstancedNV: qword +bluegl_glStencilStrokePathInstancedNV proc + mov r11, __blue_glCore_glStencilStrokePathInstancedNV jmp r11 -bluegl_glUpdateObjectBufferATI endp +bluegl_glStencilStrokePathInstancedNV endp -extrn __blue_glCore_glProgramUniform1iEXT: qword -bluegl_glProgramUniform1iEXT proc - mov r11, __blue_glCore_glProgramUniform1iEXT +extrn __blue_glCore_glPathCoverDepthFuncNV: qword +bluegl_glPathCoverDepthFuncNV proc + mov r11, __blue_glCore_glPathCoverDepthFuncNV jmp r11 -bluegl_glProgramUniform1iEXT endp +bluegl_glPathCoverDepthFuncNV endp -extrn __blue_glCore_glGetMultiTexEnvfvEXT: qword -bluegl_glGetMultiTexEnvfvEXT proc - mov r11, __blue_glCore_glGetMultiTexEnvfvEXT +extrn __blue_glCore_glCoverFillPathNV: qword +bluegl_glCoverFillPathNV proc + mov r11, __blue_glCore_glCoverFillPathNV jmp r11 -bluegl_glGetMultiTexEnvfvEXT endp +bluegl_glCoverFillPathNV endp -extrn __blue_glCore_glVertexAttribL2d: qword -bluegl_glVertexAttribL2d proc - mov r11, __blue_glCore_glVertexAttribL2d +extrn __blue_glCore_glCoverStrokePathNV: qword +bluegl_glCoverStrokePathNV proc + mov r11, __blue_glCore_glCoverStrokePathNV jmp r11 -bluegl_glVertexAttribL2d endp +bluegl_glCoverStrokePathNV endp -extrn __blue_glCore_glConvolutionParameterxOES: qword -bluegl_glConvolutionParameterxOES proc - mov r11, __blue_glCore_glConvolutionParameterxOES +extrn __blue_glCore_glCoverFillPathInstancedNV: qword +bluegl_glCoverFillPathInstancedNV proc + mov r11, __blue_glCore_glCoverFillPathInstancedNV jmp r11 -bluegl_glConvolutionParameterxOES endp +bluegl_glCoverFillPathInstancedNV endp -extrn __blue_glCore_glGetVertexAttribArrayObjectivATI: qword -bluegl_glGetVertexAttribArrayObjectivATI proc - mov r11, __blue_glCore_glGetVertexAttribArrayObjectivATI +extrn __blue_glCore_glCoverStrokePathInstancedNV: qword +bluegl_glCoverStrokePathInstancedNV proc + mov r11, __blue_glCore_glCoverStrokePathInstancedNV jmp r11 -bluegl_glGetVertexAttribArrayObjectivATI endp +bluegl_glCoverStrokePathInstancedNV endp -extrn __blue_glCore_glGetListParameterfvSGIX: qword -bluegl_glGetListParameterfvSGIX proc - mov r11, __blue_glCore_glGetListParameterfvSGIX +extrn __blue_glCore_glGetPathParameterivNV: qword +bluegl_glGetPathParameterivNV proc + mov r11, __blue_glCore_glGetPathParameterivNV jmp r11 -bluegl_glGetListParameterfvSGIX endp +bluegl_glGetPathParameterivNV endp -extrn __blue_glCore_glInstrumentsBufferSGIX: qword -bluegl_glInstrumentsBufferSGIX proc - mov r11, __blue_glCore_glInstrumentsBufferSGIX +extrn __blue_glCore_glGetPathParameterfvNV: qword +bluegl_glGetPathParameterfvNV proc + mov r11, __blue_glCore_glGetPathParameterfvNV jmp r11 -bluegl_glInstrumentsBufferSGIX endp +bluegl_glGetPathParameterfvNV endp -extrn __blue_glCore_glDeleteNamesAMD: qword -bluegl_glDeleteNamesAMD proc - mov r11, __blue_glCore_glDeleteNamesAMD +extrn __blue_glCore_glGetPathCommandsNV: qword +bluegl_glGetPathCommandsNV proc + mov r11, __blue_glCore_glGetPathCommandsNV jmp r11 -bluegl_glDeleteNamesAMD endp +bluegl_glGetPathCommandsNV endp -extrn __blue_glCore_glGetSubroutineIndex: qword -bluegl_glGetSubroutineIndex proc - mov r11, __blue_glCore_glGetSubroutineIndex +extrn __blue_glCore_glGetPathCoordsNV: qword +bluegl_glGetPathCoordsNV proc + mov r11, __blue_glCore_glGetPathCoordsNV jmp r11 -bluegl_glGetSubroutineIndex endp +bluegl_glGetPathCoordsNV endp -extrn __blue_glCore_glVideoCaptureStreamParameterivNV: qword -bluegl_glVideoCaptureStreamParameterivNV proc - mov r11, __blue_glCore_glVideoCaptureStreamParameterivNV +extrn __blue_glCore_glGetPathDashArrayNV: qword +bluegl_glGetPathDashArrayNV proc + mov r11, __blue_glCore_glGetPathDashArrayNV jmp r11 -bluegl_glVideoCaptureStreamParameterivNV endp +bluegl_glGetPathDashArrayNV endp -extrn __blue_glCore_glMultiTexCoord4i: qword -bluegl_glMultiTexCoord4i proc - mov r11, __blue_glCore_glMultiTexCoord4i +extrn __blue_glCore_glGetPathMetricsNV: qword +bluegl_glGetPathMetricsNV proc + mov r11, __blue_glCore_glGetPathMetricsNV jmp r11 -bluegl_glMultiTexCoord4i endp +bluegl_glGetPathMetricsNV endp -extrn __blue_glCore_glGetFramebufferParameteriv: qword -bluegl_glGetFramebufferParameteriv proc - mov r11, __blue_glCore_glGetFramebufferParameteriv +extrn __blue_glCore_glGetPathMetricRangeNV: qword +bluegl_glGetPathMetricRangeNV proc + mov r11, __blue_glCore_glGetPathMetricRangeNV jmp r11 -bluegl_glGetFramebufferParameteriv endp +bluegl_glGetPathMetricRangeNV endp -extrn __blue_glCore_glVertexAttrib2hvNV: qword -bluegl_glVertexAttrib2hvNV proc - mov r11, __blue_glCore_glVertexAttrib2hvNV +extrn __blue_glCore_glGetPathSpacingNV: qword +bluegl_glGetPathSpacingNV proc + mov r11, __blue_glCore_glGetPathSpacingNV jmp r11 -bluegl_glVertexAttrib2hvNV endp +bluegl_glGetPathSpacingNV endp -extrn __blue_glCore_glMakeBufferNonResidentNV: qword -bluegl_glMakeBufferNonResidentNV proc - mov r11, __blue_glCore_glMakeBufferNonResidentNV +extrn __blue_glCore_glIsPointInFillPathNV: qword +bluegl_glIsPointInFillPathNV proc + mov r11, __blue_glCore_glIsPointInFillPathNV jmp r11 -bluegl_glMakeBufferNonResidentNV endp +bluegl_glIsPointInFillPathNV endp -extrn __blue_glCore_glPixelDataRangeNV: qword -bluegl_glPixelDataRangeNV proc - mov r11, __blue_glCore_glPixelDataRangeNV +extrn __blue_glCore_glIsPointInStrokePathNV: qword +bluegl_glIsPointInStrokePathNV proc + mov r11, __blue_glCore_glIsPointInStrokePathNV jmp r11 -bluegl_glPixelDataRangeNV endp +bluegl_glIsPointInStrokePathNV endp -extrn __blue_glCore_glNamedBufferDataEXT: qword -bluegl_glNamedBufferDataEXT proc - mov r11, __blue_glCore_glNamedBufferDataEXT +extrn __blue_glCore_glGetPathLengthNV: qword +bluegl_glGetPathLengthNV proc + mov r11, __blue_glCore_glGetPathLengthNV jmp r11 -bluegl_glNamedBufferDataEXT endp +bluegl_glGetPathLengthNV endp -extrn __blue_glCore_glIsImageHandleResidentARB: qword -bluegl_glIsImageHandleResidentARB proc - mov r11, __blue_glCore_glIsImageHandleResidentARB +extrn __blue_glCore_glPointAlongPathNV: qword +bluegl_glPointAlongPathNV proc + mov r11, __blue_glCore_glPointAlongPathNV jmp r11 -bluegl_glIsImageHandleResidentARB endp +bluegl_glPointAlongPathNV endp -extrn __blue_glCore_glFrustumfOES: qword -bluegl_glFrustumfOES proc - mov r11, __blue_glCore_glFrustumfOES +extrn __blue_glCore_glMatrixLoad3x2fNV: qword +bluegl_glMatrixLoad3x2fNV proc + mov r11, __blue_glCore_glMatrixLoad3x2fNV jmp r11 -bluegl_glFrustumfOES endp +bluegl_glMatrixLoad3x2fNV endp -extrn __blue_glCore_glGetArrayObjectivATI: qword -bluegl_glGetArrayObjectivATI proc - mov r11, __blue_glCore_glGetArrayObjectivATI +extrn __blue_glCore_glMatrixLoad3x3fNV: qword +bluegl_glMatrixLoad3x3fNV proc + mov r11, __blue_glCore_glMatrixLoad3x3fNV jmp r11 -bluegl_glGetArrayObjectivATI endp +bluegl_glMatrixLoad3x3fNV endp -extrn __blue_glCore_glMultiTexParameterIuivEXT: qword -bluegl_glMultiTexParameterIuivEXT proc - mov r11, __blue_glCore_glMultiTexParameterIuivEXT +extrn __blue_glCore_glMatrixLoadTranspose3x3fNV: qword +bluegl_glMatrixLoadTranspose3x3fNV proc + mov r11, __blue_glCore_glMatrixLoadTranspose3x3fNV jmp r11 -bluegl_glMultiTexParameterIuivEXT endp +bluegl_glMatrixLoadTranspose3x3fNV endp -extrn __blue_glCore_glGetMapParameterfvNV: qword -bluegl_glGetMapParameterfvNV proc - mov r11, __blue_glCore_glGetMapParameterfvNV +extrn __blue_glCore_glMatrixMult3x2fNV: qword +bluegl_glMatrixMult3x2fNV proc + mov r11, __blue_glCore_glMatrixMult3x2fNV jmp r11 -bluegl_glGetMapParameterfvNV endp +bluegl_glMatrixMult3x2fNV endp -extrn __blue_glCore_glMultTransposeMatrixxOES: qword -bluegl_glMultTransposeMatrixxOES proc - mov r11, __blue_glCore_glMultTransposeMatrixxOES +extrn __blue_glCore_glMatrixMult3x3fNV: qword +bluegl_glMatrixMult3x3fNV proc + mov r11, __blue_glCore_glMatrixMult3x3fNV jmp r11 -bluegl_glMultTransposeMatrixxOES endp +bluegl_glMatrixMult3x3fNV endp -extrn __blue_glCore_glGetPerfMonitorCounterDataAMD: qword -bluegl_glGetPerfMonitorCounterDataAMD proc - mov r11, __blue_glCore_glGetPerfMonitorCounterDataAMD +extrn __blue_glCore_glMatrixMultTranspose3x3fNV: qword +bluegl_glMatrixMultTranspose3x3fNV proc + mov r11, __blue_glCore_glMatrixMultTranspose3x3fNV jmp r11 -bluegl_glGetPerfMonitorCounterDataAMD endp +bluegl_glMatrixMultTranspose3x3fNV endp -extrn __blue_glCore_glClearDepthxOES: qword -bluegl_glClearDepthxOES proc - mov r11, __blue_glCore_glClearDepthxOES +extrn __blue_glCore_glStencilThenCoverFillPathNV: qword +bluegl_glStencilThenCoverFillPathNV proc + mov r11, __blue_glCore_glStencilThenCoverFillPathNV jmp r11 -bluegl_glClearDepthxOES endp +bluegl_glStencilThenCoverFillPathNV endp -extrn __blue_glCore_glColor3xvOES: qword -bluegl_glColor3xvOES proc - mov r11, __blue_glCore_glColor3xvOES +extrn __blue_glCore_glStencilThenCoverStrokePathNV: qword +bluegl_glStencilThenCoverStrokePathNV proc + mov r11, __blue_glCore_glStencilThenCoverStrokePathNV jmp r11 -bluegl_glColor3xvOES endp +bluegl_glStencilThenCoverStrokePathNV endp -extrn __blue_glCore_glVertexAttribI4ivEXT: qword -bluegl_glVertexAttribI4ivEXT proc - mov r11, __blue_glCore_glVertexAttribI4ivEXT +extrn __blue_glCore_glStencilThenCoverFillPathInstancedNV: qword +bluegl_glStencilThenCoverFillPathInstancedNV proc + mov r11, __blue_glCore_glStencilThenCoverFillPathInstancedNV jmp r11 -bluegl_glVertexAttribI4ivEXT endp +bluegl_glStencilThenCoverFillPathInstancedNV endp -extrn __blue_glCore_glMultiTexCoordP4uiv: qword -bluegl_glMultiTexCoordP4uiv proc - mov r11, __blue_glCore_glMultiTexCoordP4uiv +extrn __blue_glCore_glStencilThenCoverStrokePathInstancedNV: qword +bluegl_glStencilThenCoverStrokePathInstancedNV proc + mov r11, __blue_glCore_glStencilThenCoverStrokePathInstancedNV jmp r11 -bluegl_glMultiTexCoordP4uiv endp +bluegl_glStencilThenCoverStrokePathInstancedNV endp -extrn __blue_glCore_glVertexAttribI4usv: qword -bluegl_glVertexAttribI4usv proc - mov r11, __blue_glCore_glVertexAttribI4usv +extrn __blue_glCore_glPathGlyphIndexRangeNV: qword +bluegl_glPathGlyphIndexRangeNV proc + mov r11, __blue_glCore_glPathGlyphIndexRangeNV jmp r11 -bluegl_glVertexAttribI4usv endp +bluegl_glPathGlyphIndexRangeNV endp -extrn __blue_glCore_glGetnTexImage: qword -bluegl_glGetnTexImage proc - mov r11, __blue_glCore_glGetnTexImage +extrn __blue_glCore_glPathGlyphIndexArrayNV: qword +bluegl_glPathGlyphIndexArrayNV proc + mov r11, __blue_glCore_glPathGlyphIndexArrayNV jmp r11 -bluegl_glGetnTexImage endp +bluegl_glPathGlyphIndexArrayNV endp -extrn __blue_glCore_glReadBuffer: qword -bluegl_glReadBuffer proc - mov r11, __blue_glCore_glReadBuffer +extrn __blue_glCore_glPathMemoryGlyphIndexArrayNV: qword +bluegl_glPathMemoryGlyphIndexArrayNV proc + mov r11, __blue_glCore_glPathMemoryGlyphIndexArrayNV jmp r11 -bluegl_glReadBuffer endp +bluegl_glPathMemoryGlyphIndexArrayNV endp -extrn __blue_glCore_glUniform3iARB: qword -bluegl_glUniform3iARB proc - mov r11, __blue_glCore_glUniform3iARB +extrn __blue_glCore_glProgramPathFragmentInputGenNV: qword +bluegl_glProgramPathFragmentInputGenNV proc + mov r11, __blue_glCore_glProgramPathFragmentInputGenNV jmp r11 -bluegl_glUniform3iARB endp +bluegl_glProgramPathFragmentInputGenNV endp -extrn __blue_glCore_glMultiTexBufferEXT: qword -bluegl_glMultiTexBufferEXT proc - mov r11, __blue_glCore_glMultiTexBufferEXT +extrn __blue_glCore_glGetProgramResourcefvNV: qword +bluegl_glGetProgramResourcefvNV proc + mov r11, __blue_glCore_glGetProgramResourcefvNV jmp r11 -bluegl_glMultiTexBufferEXT endp +bluegl_glGetProgramResourcefvNV endp -extrn __blue_glCore_glNormalStream3fvATI: qword -bluegl_glNormalStream3fvATI proc - mov r11, __blue_glCore_glNormalStream3fvATI +extrn __blue_glCore_glPathColorGenNV: qword +bluegl_glPathColorGenNV proc + mov r11, __blue_glCore_glPathColorGenNV jmp r11 -bluegl_glNormalStream3fvATI endp +bluegl_glPathColorGenNV endp -extrn __blue_glCore_glDeleteVertexShaderEXT: qword -bluegl_glDeleteVertexShaderEXT proc - mov r11, __blue_glCore_glDeleteVertexShaderEXT +extrn __blue_glCore_glPathTexGenNV: qword +bluegl_glPathTexGenNV proc + mov r11, __blue_glCore_glPathTexGenNV jmp r11 -bluegl_glDeleteVertexShaderEXT endp +bluegl_glPathTexGenNV endp -extrn __blue_glCore_glVertexAttrib3hvNV: qword -bluegl_glVertexAttrib3hvNV proc - mov r11, __blue_glCore_glVertexAttrib3hvNV +extrn __blue_glCore_glPathFogGenNV: qword +bluegl_glPathFogGenNV proc + mov r11, __blue_glCore_glPathFogGenNV jmp r11 -bluegl_glVertexAttrib3hvNV endp +bluegl_glPathFogGenNV endp -extrn __blue_glCore_glDrawMeshArraysSUN: qword -bluegl_glDrawMeshArraysSUN proc - mov r11, __blue_glCore_glDrawMeshArraysSUN +extrn __blue_glCore_glGetPathColorGenivNV: qword +bluegl_glGetPathColorGenivNV proc + mov r11, __blue_glCore_glGetPathColorGenivNV jmp r11 -bluegl_glDrawMeshArraysSUN endp +bluegl_glGetPathColorGenivNV endp -extrn __blue_glCore_glVertexAttribL3dvEXT: qword -bluegl_glVertexAttribL3dvEXT proc - mov r11, __blue_glCore_glVertexAttribL3dvEXT +extrn __blue_glCore_glGetPathColorGenfvNV: qword +bluegl_glGetPathColorGenfvNV proc + mov r11, __blue_glCore_glGetPathColorGenfvNV jmp r11 -bluegl_glVertexAttribL3dvEXT endp +bluegl_glGetPathColorGenfvNV endp -extrn __blue_glCore_glReplacementCodeuiColor3fVertex3fSUN: qword -bluegl_glReplacementCodeuiColor3fVertex3fSUN proc - mov r11, __blue_glCore_glReplacementCodeuiColor3fVertex3fSUN +extrn __blue_glCore_glGetPathTexGenivNV: qword +bluegl_glGetPathTexGenivNV proc + mov r11, __blue_glCore_glGetPathTexGenivNV jmp r11 -bluegl_glReplacementCodeuiColor3fVertex3fSUN endp +bluegl_glGetPathTexGenivNV endp -extrn __blue_glCore_glProgramUniform1fv: qword -bluegl_glProgramUniform1fv proc - mov r11, __blue_glCore_glProgramUniform1fv +extrn __blue_glCore_glGetPathTexGenfvNV: qword +bluegl_glGetPathTexGenfvNV proc + mov r11, __blue_glCore_glGetPathTexGenfvNV jmp r11 -bluegl_glProgramUniform1fv endp +bluegl_glGetPathTexGenfvNV endp -extrn __blue_glCore_glNormal3xvOES: qword -bluegl_glNormal3xvOES proc - mov r11, __blue_glCore_glNormal3xvOES +extrn __blue_glCore_glPixelDataRangeNV: qword +bluegl_glPixelDataRangeNV proc + mov r11, __blue_glCore_glPixelDataRangeNV jmp r11 -bluegl_glNormal3xvOES endp +bluegl_glPixelDataRangeNV endp -extrn __blue_glCore_glGetProgramStageiv: qword -bluegl_glGetProgramStageiv proc - mov r11, __blue_glCore_glGetProgramStageiv +extrn __blue_glCore_glFlushPixelDataRangeNV: qword +bluegl_glFlushPixelDataRangeNV proc + mov r11, __blue_glCore_glFlushPixelDataRangeNV jmp r11 -bluegl_glGetProgramStageiv endp +bluegl_glFlushPixelDataRangeNV endp -extrn __blue_glCore_glUniform2ui64NV: qword -bluegl_glUniform2ui64NV proc - mov r11, __blue_glCore_glUniform2ui64NV +extrn __blue_glCore_glPointParameteriNV: qword +bluegl_glPointParameteriNV proc + mov r11, __blue_glCore_glPointParameteriNV jmp r11 -bluegl_glUniform2ui64NV endp +bluegl_glPointParameteriNV endp -extrn __blue_glCore_glProgramEnvParameter4fARB: qword -bluegl_glProgramEnvParameter4fARB proc - mov r11, __blue_glCore_glProgramEnvParameter4fARB +extrn __blue_glCore_glPointParameterivNV: qword +bluegl_glPointParameterivNV proc + mov r11, __blue_glCore_glPointParameterivNV jmp r11 -bluegl_glProgramEnvParameter4fARB endp +bluegl_glPointParameterivNV endp -extrn __blue_glCore_glPixelTransformParameterivEXT: qword -bluegl_glPixelTransformParameterivEXT proc - mov r11, __blue_glCore_glPixelTransformParameterivEXT +extrn __blue_glCore_glPresentFrameKeyedNV: qword +bluegl_glPresentFrameKeyedNV proc + mov r11, __blue_glCore_glPresentFrameKeyedNV jmp r11 -bluegl_glPixelTransformParameterivEXT endp +bluegl_glPresentFrameKeyedNV endp -extrn __blue_glCore_glWindowPos4dvMESA: qword -bluegl_glWindowPos4dvMESA proc - mov r11, __blue_glCore_glWindowPos4dvMESA +extrn __blue_glCore_glPresentFrameDualFillNV: qword +bluegl_glPresentFrameDualFillNV proc + mov r11, __blue_glCore_glPresentFrameDualFillNV jmp r11 -bluegl_glWindowPos4dvMESA endp +bluegl_glPresentFrameDualFillNV endp -extrn __blue_glCore_glMultiDrawElementsIndirectBindlessCountNV: qword -bluegl_glMultiDrawElementsIndirectBindlessCountNV proc - mov r11, __blue_glCore_glMultiDrawElementsIndirectBindlessCountNV +extrn __blue_glCore_glGetVideoivNV: qword +bluegl_glGetVideoivNV proc + mov r11, __blue_glCore_glGetVideoivNV jmp r11 -bluegl_glMultiDrawElementsIndirectBindlessCountNV endp +bluegl_glGetVideoivNV endp -extrn __blue_glCore_glUniform3i64vARB: qword -bluegl_glUniform3i64vARB proc - mov r11, __blue_glCore_glUniform3i64vARB +extrn __blue_glCore_glGetVideouivNV: qword +bluegl_glGetVideouivNV proc + mov r11, __blue_glCore_glGetVideouivNV jmp r11 -bluegl_glUniform3i64vARB endp +bluegl_glGetVideouivNV endp -extrn __blue_glCore_glTextureStorage3DMultisample: qword -bluegl_glTextureStorage3DMultisample proc - mov r11, __blue_glCore_glTextureStorage3DMultisample +extrn __blue_glCore_glGetVideoi64vNV: qword +bluegl_glGetVideoi64vNV proc + mov r11, __blue_glCore_glGetVideoi64vNV jmp r11 -bluegl_glTextureStorage3DMultisample endp +bluegl_glGetVideoi64vNV endp -extrn __blue_glCore_glGetNamedBufferParameterui64vNV: qword -bluegl_glGetNamedBufferParameterui64vNV proc - mov r11, __blue_glCore_glGetNamedBufferParameterui64vNV +extrn __blue_glCore_glGetVideoui64vNV: qword +bluegl_glGetVideoui64vNV proc + mov r11, __blue_glCore_glGetVideoui64vNV jmp r11 -bluegl_glGetNamedBufferParameterui64vNV endp +bluegl_glGetVideoui64vNV endp -extrn __blue_glCore_glEndTransformFeedback: qword -bluegl_glEndTransformFeedback proc - mov r11, __blue_glCore_glEndTransformFeedback +extrn __blue_glCore_glPrimitiveRestartNV: qword +bluegl_glPrimitiveRestartNV proc + mov r11, __blue_glCore_glPrimitiveRestartNV jmp r11 -bluegl_glEndTransformFeedback endp +bluegl_glPrimitiveRestartNV endp -extrn __blue_glCore_glVertexAttribI3ivEXT: qword -bluegl_glVertexAttribI3ivEXT proc - mov r11, __blue_glCore_glVertexAttribI3ivEXT +extrn __blue_glCore_glPrimitiveRestartIndexNV: qword +bluegl_glPrimitiveRestartIndexNV proc + mov r11, __blue_glCore_glPrimitiveRestartIndexNV jmp r11 -bluegl_glVertexAttribI3ivEXT endp +bluegl_glPrimitiveRestartIndexNV endp -extrn __blue_glCore_glUniform2f: qword -bluegl_glUniform2f proc - mov r11, __blue_glCore_glUniform2f +extrn __blue_glCore_glCombinerParameterfvNV: qword +bluegl_glCombinerParameterfvNV proc + mov r11, __blue_glCore_glCombinerParameterfvNV jmp r11 -bluegl_glUniform2f endp +bluegl_glCombinerParameterfvNV endp -extrn __blue_glCore_glMultiTexCoord1dARB: qword -bluegl_glMultiTexCoord1dARB proc - mov r11, __blue_glCore_glMultiTexCoord1dARB +extrn __blue_glCore_glCombinerParameterfNV: qword +bluegl_glCombinerParameterfNV proc + mov r11, __blue_glCore_glCombinerParameterfNV jmp r11 -bluegl_glMultiTexCoord1dARB endp +bluegl_glCombinerParameterfNV endp -extrn __blue_glCore_glGetColorTableParameterfv: qword -bluegl_glGetColorTableParameterfv proc - mov r11, __blue_glCore_glGetColorTableParameterfv +extrn __blue_glCore_glCombinerParameterivNV: qword +bluegl_glCombinerParameterivNV proc + mov r11, __blue_glCore_glCombinerParameterivNV jmp r11 -bluegl_glGetColorTableParameterfv endp +bluegl_glCombinerParameterivNV endp -extrn __blue_glCore_glWindowPos3d: qword -bluegl_glWindowPos3d proc - mov r11, __blue_glCore_glWindowPos3d +extrn __blue_glCore_glCombinerParameteriNV: qword +bluegl_glCombinerParameteriNV proc + mov r11, __blue_glCore_glCombinerParameteriNV jmp r11 -bluegl_glWindowPos3d endp +bluegl_glCombinerParameteriNV endp -extrn __blue_glCore_glVertexAttribL3ui64vNV: qword -bluegl_glVertexAttribL3ui64vNV proc - mov r11, __blue_glCore_glVertexAttribL3ui64vNV +extrn __blue_glCore_glCombinerInputNV: qword +bluegl_glCombinerInputNV proc + mov r11, __blue_glCore_glCombinerInputNV jmp r11 -bluegl_glVertexAttribL3ui64vNV endp +bluegl_glCombinerInputNV endp -extrn __blue_glCore_glReplacementCodeuiSUN: qword -bluegl_glReplacementCodeuiSUN proc - mov r11, __blue_glCore_glReplacementCodeuiSUN +extrn __blue_glCore_glCombinerOutputNV: qword +bluegl_glCombinerOutputNV proc + mov r11, __blue_glCore_glCombinerOutputNV jmp r11 -bluegl_glReplacementCodeuiSUN endp +bluegl_glCombinerOutputNV endp -extrn __blue_glCore_glColor4ubVertex3fSUN: qword -bluegl_glColor4ubVertex3fSUN proc - mov r11, __blue_glCore_glColor4ubVertex3fSUN +extrn __blue_glCore_glFinalCombinerInputNV: qword +bluegl_glFinalCombinerInputNV proc + mov r11, __blue_glCore_glFinalCombinerInputNV jmp r11 -bluegl_glColor4ubVertex3fSUN endp +bluegl_glFinalCombinerInputNV endp -extrn __blue_glCore_glDrawRangeElementsBaseVertex: qword -bluegl_glDrawRangeElementsBaseVertex proc - mov r11, __blue_glCore_glDrawRangeElementsBaseVertex +extrn __blue_glCore_glGetCombinerInputParameterfvNV: qword +bluegl_glGetCombinerInputParameterfvNV proc + mov r11, __blue_glCore_glGetCombinerInputParameterfvNV jmp r11 -bluegl_glDrawRangeElementsBaseVertex endp +bluegl_glGetCombinerInputParameterfvNV endp -extrn __blue_glCore_glGetMultiTexParameterivEXT: qword -bluegl_glGetMultiTexParameterivEXT proc - mov r11, __blue_glCore_glGetMultiTexParameterivEXT +extrn __blue_glCore_glGetCombinerInputParameterivNV: qword +bluegl_glGetCombinerInputParameterivNV proc + mov r11, __blue_glCore_glGetCombinerInputParameterivNV jmp r11 -bluegl_glGetMultiTexParameterivEXT endp +bluegl_glGetCombinerInputParameterivNV endp -extrn __blue_glCore_glMultiTexCoord3hvNV: qword -bluegl_glMultiTexCoord3hvNV proc - mov r11, __blue_glCore_glMultiTexCoord3hvNV +extrn __blue_glCore_glGetCombinerOutputParameterfvNV: qword +bluegl_glGetCombinerOutputParameterfvNV proc + mov r11, __blue_glCore_glGetCombinerOutputParameterfvNV jmp r11 -bluegl_glMultiTexCoord3hvNV endp +bluegl_glGetCombinerOutputParameterfvNV endp -extrn __blue_glCore_glGetQueryBufferObjectuiv: qword -bluegl_glGetQueryBufferObjectuiv proc - mov r11, __blue_glCore_glGetQueryBufferObjectuiv +extrn __blue_glCore_glGetCombinerOutputParameterivNV: qword +bluegl_glGetCombinerOutputParameterivNV proc + mov r11, __blue_glCore_glGetCombinerOutputParameterivNV jmp r11 -bluegl_glGetQueryBufferObjectuiv endp +bluegl_glGetCombinerOutputParameterivNV endp -extrn __blue_glCore_glGetPerfMonitorGroupsAMD: qword -bluegl_glGetPerfMonitorGroupsAMD proc - mov r11, __blue_glCore_glGetPerfMonitorGroupsAMD +extrn __blue_glCore_glGetFinalCombinerInputParameterfvNV: qword +bluegl_glGetFinalCombinerInputParameterfvNV proc + mov r11, __blue_glCore_glGetFinalCombinerInputParameterfvNV jmp r11 -bluegl_glGetPerfMonitorGroupsAMD endp +bluegl_glGetFinalCombinerInputParameterfvNV endp -extrn __blue_glCore_glUnlockArraysEXT: qword -bluegl_glUnlockArraysEXT proc - mov r11, __blue_glCore_glUnlockArraysEXT +extrn __blue_glCore_glGetFinalCombinerInputParameterivNV: qword +bluegl_glGetFinalCombinerInputParameterivNV proc + mov r11, __blue_glCore_glGetFinalCombinerInputParameterivNV jmp r11 -bluegl_glUnlockArraysEXT endp +bluegl_glGetFinalCombinerInputParameterivNV endp -extrn __blue_glCore_glPauseTransformFeedback: qword -bluegl_glPauseTransformFeedback proc - mov r11, __blue_glCore_glPauseTransformFeedback +extrn __blue_glCore_glCombinerStageParameterfvNV: qword +bluegl_glCombinerStageParameterfvNV proc + mov r11, __blue_glCore_glCombinerStageParameterfvNV jmp r11 -bluegl_glPauseTransformFeedback endp +bluegl_glCombinerStageParameterfvNV endp -extrn __blue_glCore_glGetProgramEnvParameterIivNV: qword -bluegl_glGetProgramEnvParameterIivNV proc - mov r11, __blue_glCore_glGetProgramEnvParameterIivNV +extrn __blue_glCore_glGetCombinerStageParameterfvNV: qword +bluegl_glGetCombinerStageParameterfvNV proc + mov r11, __blue_glCore_glGetCombinerStageParameterfvNV jmp r11 -bluegl_glGetProgramEnvParameterIivNV endp +bluegl_glGetCombinerStageParameterfvNV endp -extrn __blue_glCore_glPathTexGenNV: qword -bluegl_glPathTexGenNV proc - mov r11, __blue_glCore_glPathTexGenNV +extrn __blue_glCore_glFramebufferSampleLocationsfvNV: qword +bluegl_glFramebufferSampleLocationsfvNV proc + mov r11, __blue_glCore_glFramebufferSampleLocationsfvNV jmp r11 -bluegl_glPathTexGenNV endp +bluegl_glFramebufferSampleLocationsfvNV endp -extrn __blue_glCore_glVertex3xOES: qword -bluegl_glVertex3xOES proc - mov r11, __blue_glCore_glVertex3xOES +extrn __blue_glCore_glNamedFramebufferSampleLocationsfvNV: qword +bluegl_glNamedFramebufferSampleLocationsfvNV proc + mov r11, __blue_glCore_glNamedFramebufferSampleLocationsfvNV jmp r11 -bluegl_glVertex3xOES endp +bluegl_glNamedFramebufferSampleLocationsfvNV endp -extrn __blue_glCore_glEdgeFlagPointerEXT: qword -bluegl_glEdgeFlagPointerEXT proc - mov r11, __blue_glCore_glEdgeFlagPointerEXT +extrn __blue_glCore_glResolveDepthValuesNV: qword +bluegl_glResolveDepthValuesNV proc + mov r11, __blue_glCore_glResolveDepthValuesNV jmp r11 -bluegl_glEdgeFlagPointerEXT endp +bluegl_glResolveDepthValuesNV endp -extrn __blue_glCore_glVertexAttribBinding: qword -bluegl_glVertexAttribBinding proc - mov r11, __blue_glCore_glVertexAttribBinding +extrn __blue_glCore_glMakeBufferResidentNV: qword +bluegl_glMakeBufferResidentNV proc + mov r11, __blue_glCore_glMakeBufferResidentNV jmp r11 -bluegl_glVertexAttribBinding endp +bluegl_glMakeBufferResidentNV endp -extrn __blue_glCore_glVertexAttrib3f: qword -bluegl_glVertexAttrib3f proc - mov r11, __blue_glCore_glVertexAttrib3f +extrn __blue_glCore_glMakeBufferNonResidentNV: qword +bluegl_glMakeBufferNonResidentNV proc + mov r11, __blue_glCore_glMakeBufferNonResidentNV jmp r11 -bluegl_glVertexAttrib3f endp +bluegl_glMakeBufferNonResidentNV endp -extrn __blue_glCore_glVertexAttrib4NubARB: qword -bluegl_glVertexAttrib4NubARB proc - mov r11, __blue_glCore_glVertexAttrib4NubARB +extrn __blue_glCore_glIsBufferResidentNV: qword +bluegl_glIsBufferResidentNV proc + mov r11, __blue_glCore_glIsBufferResidentNV jmp r11 -bluegl_glVertexAttrib4NubARB endp +bluegl_glIsBufferResidentNV endp -extrn __blue_glCore_glWindowPos2svMESA: qword -bluegl_glWindowPos2svMESA proc - mov r11, __blue_glCore_glWindowPos2svMESA +extrn __blue_glCore_glMakeNamedBufferResidentNV: qword +bluegl_glMakeNamedBufferResidentNV proc + mov r11, __blue_glCore_glMakeNamedBufferResidentNV jmp r11 -bluegl_glWindowPos2svMESA endp +bluegl_glMakeNamedBufferResidentNV endp -extrn __blue_glCore_glGetUniformSubroutineuiv: qword -bluegl_glGetUniformSubroutineuiv proc - mov r11, __blue_glCore_glGetUniformSubroutineuiv +extrn __blue_glCore_glMakeNamedBufferNonResidentNV: qword +bluegl_glMakeNamedBufferNonResidentNV proc + mov r11, __blue_glCore_glMakeNamedBufferNonResidentNV jmp r11 -bluegl_glGetUniformSubroutineuiv endp +bluegl_glMakeNamedBufferNonResidentNV endp -extrn __blue_glCore_glMultiTexCoord2ivARB: qword -bluegl_glMultiTexCoord2ivARB proc - mov r11, __blue_glCore_glMultiTexCoord2ivARB +extrn __blue_glCore_glIsNamedBufferResidentNV: qword +bluegl_glIsNamedBufferResidentNV proc + mov r11, __blue_glCore_glIsNamedBufferResidentNV jmp r11 -bluegl_glMultiTexCoord2ivARB endp +bluegl_glIsNamedBufferResidentNV endp -extrn __blue_glCore_glFragmentMaterialivSGIX: qword -bluegl_glFragmentMaterialivSGIX proc - mov r11, __blue_glCore_glFragmentMaterialivSGIX +extrn __blue_glCore_glGetBufferParameterui64vNV: qword +bluegl_glGetBufferParameterui64vNV proc + mov r11, __blue_glCore_glGetBufferParameterui64vNV jmp r11 -bluegl_glFragmentMaterialivSGIX endp +bluegl_glGetBufferParameterui64vNV endp -extrn __blue_glCore_glSamplerParameteriv: qword -bluegl_glSamplerParameteriv proc - mov r11, __blue_glCore_glSamplerParameteriv +extrn __blue_glCore_glGetNamedBufferParameterui64vNV: qword +bluegl_glGetNamedBufferParameterui64vNV proc + mov r11, __blue_glCore_glGetNamedBufferParameterui64vNV jmp r11 -bluegl_glSamplerParameteriv endp +bluegl_glGetNamedBufferParameterui64vNV endp -extrn __blue_glCore_glVertexArrayColorOffsetEXT: qword -bluegl_glVertexArrayColorOffsetEXT proc - mov r11, __blue_glCore_glVertexArrayColorOffsetEXT +extrn __blue_glCore_glGetIntegerui64vNV: qword +bluegl_glGetIntegerui64vNV proc + mov r11, __blue_glCore_glGetIntegerui64vNV jmp r11 -bluegl_glVertexArrayColorOffsetEXT endp +bluegl_glGetIntegerui64vNV endp -extrn __blue_glCore_glVertexAttrib3sNV: qword -bluegl_glVertexAttrib3sNV proc - mov r11, __blue_glCore_glVertexAttrib3sNV +extrn __blue_glCore_glUniformui64NV: qword +bluegl_glUniformui64NV proc + mov r11, __blue_glCore_glUniformui64NV jmp r11 -bluegl_glVertexAttrib3sNV endp +bluegl_glUniformui64NV endp -extrn __blue_glCore_glDrawElementsInstanced: qword -bluegl_glDrawElementsInstanced proc - mov r11, __blue_glCore_glDrawElementsInstanced +extrn __blue_glCore_glUniformui64vNV: qword +bluegl_glUniformui64vNV proc + mov r11, __blue_glCore_glUniformui64vNV jmp r11 -bluegl_glDrawElementsInstanced endp +bluegl_glUniformui64vNV endp -extrn __blue_glCore_glCreateSyncFromCLeventARB: qword -bluegl_glCreateSyncFromCLeventARB proc - mov r11, __blue_glCore_glCreateSyncFromCLeventARB +extrn __blue_glCore_glProgramUniformui64NV: qword +bluegl_glProgramUniformui64NV proc + mov r11, __blue_glCore_glProgramUniformui64NV jmp r11 -bluegl_glCreateSyncFromCLeventARB endp +bluegl_glProgramUniformui64NV endp -extrn __blue_glCore_glInsertEventMarkerEXT: qword -bluegl_glInsertEventMarkerEXT proc - mov r11, __blue_glCore_glInsertEventMarkerEXT +extrn __blue_glCore_glProgramUniformui64vNV: qword +bluegl_glProgramUniformui64vNV proc + mov r11, __blue_glCore_glProgramUniformui64vNV jmp r11 -bluegl_glInsertEventMarkerEXT endp +bluegl_glProgramUniformui64vNV endp -extrn __blue_glCore_glGetTextureParameterfv: qword -bluegl_glGetTextureParameterfv proc - mov r11, __blue_glCore_glGetTextureParameterfv +extrn __blue_glCore_glTextureBarrierNV: qword +bluegl_glTextureBarrierNV proc + mov r11, __blue_glCore_glTextureBarrierNV jmp r11 -bluegl_glGetTextureParameterfv endp +bluegl_glTextureBarrierNV endp -extrn __blue_glCore_glCopyMultiTexImage2DEXT: qword -bluegl_glCopyMultiTexImage2DEXT proc - mov r11, __blue_glCore_glCopyMultiTexImage2DEXT +extrn __blue_glCore_glTexImage2DMultisampleCoverageNV: qword +bluegl_glTexImage2DMultisampleCoverageNV proc + mov r11, __blue_glCore_glTexImage2DMultisampleCoverageNV jmp r11 -bluegl_glCopyMultiTexImage2DEXT endp +bluegl_glTexImage2DMultisampleCoverageNV endp -extrn __blue_glCore_glVertexWeightfEXT: qword -bluegl_glVertexWeightfEXT proc - mov r11, __blue_glCore_glVertexWeightfEXT +extrn __blue_glCore_glTexImage3DMultisampleCoverageNV: qword +bluegl_glTexImage3DMultisampleCoverageNV proc + mov r11, __blue_glCore_glTexImage3DMultisampleCoverageNV jmp r11 -bluegl_glVertexWeightfEXT endp +bluegl_glTexImage3DMultisampleCoverageNV endp -extrn __blue_glCore_glUniform4i64vARB: qword -bluegl_glUniform4i64vARB proc - mov r11, __blue_glCore_glUniform4i64vARB +extrn __blue_glCore_glTextureImage2DMultisampleNV: qword +bluegl_glTextureImage2DMultisampleNV proc + mov r11, __blue_glCore_glTextureImage2DMultisampleNV jmp r11 -bluegl_glUniform4i64vARB endp +bluegl_glTextureImage2DMultisampleNV endp -extrn __blue_glCore_glGetPathParameterfvNV: qword -bluegl_glGetPathParameterfvNV proc - mov r11, __blue_glCore_glGetPathParameterfvNV +extrn __blue_glCore_glTextureImage3DMultisampleNV: qword +bluegl_glTextureImage3DMultisampleNV proc + mov r11, __blue_glCore_glTextureImage3DMultisampleNV jmp r11 -bluegl_glGetPathParameterfvNV endp +bluegl_glTextureImage3DMultisampleNV endp -extrn __blue_glCore_glBlitNamedFramebuffer: qword -bluegl_glBlitNamedFramebuffer proc - mov r11, __blue_glCore_glBlitNamedFramebuffer +extrn __blue_glCore_glTextureImage2DMultisampleCoverageNV: qword +bluegl_glTextureImage2DMultisampleCoverageNV proc + mov r11, __blue_glCore_glTextureImage2DMultisampleCoverageNV jmp r11 -bluegl_glBlitNamedFramebuffer endp +bluegl_glTextureImage2DMultisampleCoverageNV endp -extrn __blue_glCore_glTexCoordPointerEXT: qword -bluegl_glTexCoordPointerEXT proc - mov r11, __blue_glCore_glTexCoordPointerEXT +extrn __blue_glCore_glTextureImage3DMultisampleCoverageNV: qword +bluegl_glTextureImage3DMultisampleCoverageNV proc + mov r11, __blue_glCore_glTextureImage3DMultisampleCoverageNV jmp r11 -bluegl_glTexCoordPointerEXT endp +bluegl_glTextureImage3DMultisampleCoverageNV endp -extrn __blue_glCore_glGetPathMetricsNV: qword -bluegl_glGetPathMetricsNV proc - mov r11, __blue_glCore_glGetPathMetricsNV +extrn __blue_glCore_glBeginTransformFeedbackNV: qword +bluegl_glBeginTransformFeedbackNV proc + mov r11, __blue_glCore_glBeginTransformFeedbackNV jmp r11 -bluegl_glGetPathMetricsNV endp +bluegl_glBeginTransformFeedbackNV endp -extrn __blue_glCore_glVertexAttribL2dvEXT: qword -bluegl_glVertexAttribL2dvEXT proc - mov r11, __blue_glCore_glVertexAttribL2dvEXT +extrn __blue_glCore_glEndTransformFeedbackNV: qword +bluegl_glEndTransformFeedbackNV proc + mov r11, __blue_glCore_glEndTransformFeedbackNV jmp r11 -bluegl_glVertexAttribL2dvEXT endp +bluegl_glEndTransformFeedbackNV endp -extrn __blue_glCore_glVariantuivEXT: qword -bluegl_glVariantuivEXT proc - mov r11, __blue_glCore_glVariantuivEXT +extrn __blue_glCore_glTransformFeedbackAttribsNV: qword +bluegl_glTransformFeedbackAttribsNV proc + mov r11, __blue_glCore_glTransformFeedbackAttribsNV jmp r11 -bluegl_glVariantuivEXT endp +bluegl_glTransformFeedbackAttribsNV endp -extrn __blue_glCore_glGetVertexAttribdvNV: qword -bluegl_glGetVertexAttribdvNV proc - mov r11, __blue_glCore_glGetVertexAttribdvNV +extrn __blue_glCore_glBindBufferRangeNV: qword +bluegl_glBindBufferRangeNV proc + mov r11, __blue_glCore_glBindBufferRangeNV jmp r11 -bluegl_glGetVertexAttribdvNV endp +bluegl_glBindBufferRangeNV endp -extrn __blue_glCore_glFenceSync: qword -bluegl_glFenceSync proc - mov r11, __blue_glCore_glFenceSync +extrn __blue_glCore_glBindBufferOffsetNV: qword +bluegl_glBindBufferOffsetNV proc + mov r11, __blue_glCore_glBindBufferOffsetNV jmp r11 -bluegl_glFenceSync endp +bluegl_glBindBufferOffsetNV endp -extrn __blue_glCore_glGetTextureParameterIuiv: qword -bluegl_glGetTextureParameterIuiv proc - mov r11, __blue_glCore_glGetTextureParameterIuiv +extrn __blue_glCore_glBindBufferBaseNV: qword +bluegl_glBindBufferBaseNV proc + mov r11, __blue_glCore_glBindBufferBaseNV jmp r11 -bluegl_glGetTextureParameterIuiv endp +bluegl_glBindBufferBaseNV endp -extrn __blue_glCore_glMultiTexCoord2sARB: qword -bluegl_glMultiTexCoord2sARB proc - mov r11, __blue_glCore_glMultiTexCoord2sARB +extrn __blue_glCore_glTransformFeedbackVaryingsNV: qword +bluegl_glTransformFeedbackVaryingsNV proc + mov r11, __blue_glCore_glTransformFeedbackVaryingsNV jmp r11 -bluegl_glMultiTexCoord2sARB endp +bluegl_glTransformFeedbackVaryingsNV endp -extrn __blue_glCore_glUniform2i64NV: qword -bluegl_glUniform2i64NV proc - mov r11, __blue_glCore_glUniform2i64NV +extrn __blue_glCore_glActiveVaryingNV: qword +bluegl_glActiveVaryingNV proc + mov r11, __blue_glCore_glActiveVaryingNV jmp r11 -bluegl_glUniform2i64NV endp +bluegl_glActiveVaryingNV endp -extrn __blue_glCore_glDeformationMap3dSGIX: qword -bluegl_glDeformationMap3dSGIX proc - mov r11, __blue_glCore_glDeformationMap3dSGIX +extrn __blue_glCore_glGetVaryingLocationNV: qword +bluegl_glGetVaryingLocationNV proc + mov r11, __blue_glCore_glGetVaryingLocationNV jmp r11 -bluegl_glDeformationMap3dSGIX endp +bluegl_glGetVaryingLocationNV endp -extrn __blue_glCore_glDrawRangeElementArrayAPPLE: qword -bluegl_glDrawRangeElementArrayAPPLE proc - mov r11, __blue_glCore_glDrawRangeElementArrayAPPLE +extrn __blue_glCore_glGetActiveVaryingNV: qword +bluegl_glGetActiveVaryingNV proc + mov r11, __blue_glCore_glGetActiveVaryingNV jmp r11 -bluegl_glDrawRangeElementArrayAPPLE endp +bluegl_glGetActiveVaryingNV endp -extrn __blue_glCore_glDepthFunc: qword -bluegl_glDepthFunc proc - mov r11, __blue_glCore_glDepthFunc +extrn __blue_glCore_glGetTransformFeedbackVaryingNV: qword +bluegl_glGetTransformFeedbackVaryingNV proc + mov r11, __blue_glCore_glGetTransformFeedbackVaryingNV jmp r11 -bluegl_glDepthFunc endp +bluegl_glGetTransformFeedbackVaryingNV endp -extrn __blue_glCore_glProgramUniform3dvEXT: qword -bluegl_glProgramUniform3dvEXT proc - mov r11, __blue_glCore_glProgramUniform3dvEXT +extrn __blue_glCore_glTransformFeedbackStreamAttribsNV: qword +bluegl_glTransformFeedbackStreamAttribsNV proc + mov r11, __blue_glCore_glTransformFeedbackStreamAttribsNV jmp r11 -bluegl_glProgramUniform3dvEXT endp +bluegl_glTransformFeedbackStreamAttribsNV endp -extrn __blue_glCore_glTexCoord3hvNV: qword -bluegl_glTexCoord3hvNV proc - mov r11, __blue_glCore_glTexCoord3hvNV +extrn __blue_glCore_glBindTransformFeedbackNV: qword +bluegl_glBindTransformFeedbackNV proc + mov r11, __blue_glCore_glBindTransformFeedbackNV jmp r11 -bluegl_glTexCoord3hvNV endp +bluegl_glBindTransformFeedbackNV endp -extrn __blue_glCore_glGetPathLengthNV: qword -bluegl_glGetPathLengthNV proc - mov r11, __blue_glCore_glGetPathLengthNV +extrn __blue_glCore_glDeleteTransformFeedbacksNV: qword +bluegl_glDeleteTransformFeedbacksNV proc + mov r11, __blue_glCore_glDeleteTransformFeedbacksNV jmp r11 -bluegl_glGetPathLengthNV endp +bluegl_glDeleteTransformFeedbacksNV endp -extrn __blue_glCore_glUnmapObjectBufferATI: qword -bluegl_glUnmapObjectBufferATI proc - mov r11, __blue_glCore_glUnmapObjectBufferATI +extrn __blue_glCore_glGenTransformFeedbacksNV: qword +bluegl_glGenTransformFeedbacksNV proc + mov r11, __blue_glCore_glGenTransformFeedbacksNV jmp r11 -bluegl_glUnmapObjectBufferATI endp +bluegl_glGenTransformFeedbacksNV endp -extrn __blue_glCore_glValidateProgramPipeline: qword -bluegl_glValidateProgramPipeline proc - mov r11, __blue_glCore_glValidateProgramPipeline +extrn __blue_glCore_glIsTransformFeedbackNV: qword +bluegl_glIsTransformFeedbackNV proc + mov r11, __blue_glCore_glIsTransformFeedbackNV jmp r11 -bluegl_glValidateProgramPipeline endp +bluegl_glIsTransformFeedbackNV endp -extrn __blue_glCore_glIsProgram: qword -bluegl_glIsProgram proc - mov r11, __blue_glCore_glIsProgram +extrn __blue_glCore_glPauseTransformFeedbackNV: qword +bluegl_glPauseTransformFeedbackNV proc + mov r11, __blue_glCore_glPauseTransformFeedbackNV jmp r11 -bluegl_glIsProgram endp +bluegl_glPauseTransformFeedbackNV endp -extrn __blue_glCore_glVertexAttrib4hvNV: qword -bluegl_glVertexAttrib4hvNV proc - mov r11, __blue_glCore_glVertexAttrib4hvNV +extrn __blue_glCore_glResumeTransformFeedbackNV: qword +bluegl_glResumeTransformFeedbackNV proc + mov r11, __blue_glCore_glResumeTransformFeedbackNV jmp r11 -bluegl_glVertexAttrib4hvNV endp +bluegl_glResumeTransformFeedbackNV endp -extrn __blue_glCore_glLoadTransposeMatrixdARB: qword -bluegl_glLoadTransposeMatrixdARB proc - mov r11, __blue_glCore_glLoadTransposeMatrixdARB +extrn __blue_glCore_glDrawTransformFeedbackNV: qword +bluegl_glDrawTransformFeedbackNV proc + mov r11, __blue_glCore_glDrawTransformFeedbackNV jmp r11 -bluegl_glLoadTransposeMatrixdARB endp +bluegl_glDrawTransformFeedbackNV endp -extrn __blue_glCore_glMapVertexAttrib2dAPPLE: qword -bluegl_glMapVertexAttrib2dAPPLE proc - mov r11, __blue_glCore_glMapVertexAttrib2dAPPLE +extrn __blue_glCore_glVDPAUInitNV: qword +bluegl_glVDPAUInitNV proc + mov r11, __blue_glCore_glVDPAUInitNV jmp r11 -bluegl_glMapVertexAttrib2dAPPLE endp +bluegl_glVDPAUInitNV endp -extrn __blue_glCore_glProgramBinary: qword -bluegl_glProgramBinary proc - mov r11, __blue_glCore_glProgramBinary +extrn __blue_glCore_glVDPAUFiniNV: qword +bluegl_glVDPAUFiniNV proc + mov r11, __blue_glCore_glVDPAUFiniNV jmp r11 -bluegl_glProgramBinary endp +bluegl_glVDPAUFiniNV endp -extrn __blue_glCore_glUniform3i: qword -bluegl_glUniform3i proc - mov r11, __blue_glCore_glUniform3i +extrn __blue_glCore_glVDPAURegisterVideoSurfaceNV: qword +bluegl_glVDPAURegisterVideoSurfaceNV proc + mov r11, __blue_glCore_glVDPAURegisterVideoSurfaceNV jmp r11 -bluegl_glUniform3i endp +bluegl_glVDPAURegisterVideoSurfaceNV endp -extrn __blue_glCore_glProgramUniform2dEXT: qword -bluegl_glProgramUniform2dEXT proc - mov r11, __blue_glCore_glProgramUniform2dEXT +extrn __blue_glCore_glVDPAURegisterOutputSurfaceNV: qword +bluegl_glVDPAURegisterOutputSurfaceNV proc + mov r11, __blue_glCore_glVDPAURegisterOutputSurfaceNV jmp r11 -bluegl_glProgramUniform2dEXT endp +bluegl_glVDPAURegisterOutputSurfaceNV endp -extrn __blue_glCore_glDepthRangeIndexed: qword -bluegl_glDepthRangeIndexed proc - mov r11, __blue_glCore_glDepthRangeIndexed +extrn __blue_glCore_glVDPAUIsSurfaceNV: qword +bluegl_glVDPAUIsSurfaceNV proc + mov r11, __blue_glCore_glVDPAUIsSurfaceNV jmp r11 -bluegl_glDepthRangeIndexed endp +bluegl_glVDPAUIsSurfaceNV endp -extrn __blue_glCore_glEvalCoord1xOES: qword -bluegl_glEvalCoord1xOES proc - mov r11, __blue_glCore_glEvalCoord1xOES +extrn __blue_glCore_glVDPAUUnregisterSurfaceNV: qword +bluegl_glVDPAUUnregisterSurfaceNV proc + mov r11, __blue_glCore_glVDPAUUnregisterSurfaceNV jmp r11 -bluegl_glEvalCoord1xOES endp +bluegl_glVDPAUUnregisterSurfaceNV endp -extrn __blue_glCore_glVertexArrayRangeAPPLE: qword -bluegl_glVertexArrayRangeAPPLE proc - mov r11, __blue_glCore_glVertexArrayRangeAPPLE +extrn __blue_glCore_glVDPAUGetSurfaceivNV: qword +bluegl_glVDPAUGetSurfaceivNV proc + mov r11, __blue_glCore_glVDPAUGetSurfaceivNV jmp r11 -bluegl_glVertexArrayRangeAPPLE endp +bluegl_glVDPAUGetSurfaceivNV endp -extrn __blue_glCore_glVertexStream1svATI: qword -bluegl_glVertexStream1svATI proc - mov r11, __blue_glCore_glVertexStream1svATI +extrn __blue_glCore_glVDPAUSurfaceAccessNV: qword +bluegl_glVDPAUSurfaceAccessNV proc + mov r11, __blue_glCore_glVDPAUSurfaceAccessNV jmp r11 -bluegl_glVertexStream1svATI endp +bluegl_glVDPAUSurfaceAccessNV endp -extrn __blue_glCore_glNormalStream3iATI: qword -bluegl_glNormalStream3iATI proc - mov r11, __blue_glCore_glNormalStream3iATI +extrn __blue_glCore_glVDPAUMapSurfacesNV: qword +bluegl_glVDPAUMapSurfacesNV proc + mov r11, __blue_glCore_glVDPAUMapSurfacesNV jmp r11 -bluegl_glNormalStream3iATI endp +bluegl_glVDPAUMapSurfacesNV endp -extrn __blue_glCore_glProgramUniform4f: qword -bluegl_glProgramUniform4f proc - mov r11, __blue_glCore_glProgramUniform4f +extrn __blue_glCore_glVDPAUUnmapSurfacesNV: qword +bluegl_glVDPAUUnmapSurfacesNV proc + mov r11, __blue_glCore_glVDPAUUnmapSurfacesNV jmp r11 -bluegl_glProgramUniform4f endp +bluegl_glVDPAUUnmapSurfacesNV endp -extrn __blue_glCore_glScalexOES: qword -bluegl_glScalexOES proc - mov r11, __blue_glCore_glScalexOES +extrn __blue_glCore_glFlushVertexArrayRangeNV: qword +bluegl_glFlushVertexArrayRangeNV proc + mov r11, __blue_glCore_glFlushVertexArrayRangeNV jmp r11 -bluegl_glScalexOES endp +bluegl_glFlushVertexArrayRangeNV endp -extrn __blue_glCore_glUniform1fv: qword -bluegl_glUniform1fv proc - mov r11, __blue_glCore_glUniform1fv +extrn __blue_glCore_glVertexArrayRangeNV: qword +bluegl_glVertexArrayRangeNV proc + mov r11, __blue_glCore_glVertexArrayRangeNV jmp r11 -bluegl_glUniform1fv endp +bluegl_glVertexArrayRangeNV endp -extrn __blue_glCore_glGetActiveUniform: qword -bluegl_glGetActiveUniform proc - mov r11, __blue_glCore_glGetActiveUniform +extrn __blue_glCore_glVertexAttribL1i64NV: qword +bluegl_glVertexAttribL1i64NV proc + mov r11, __blue_glCore_glVertexAttribL1i64NV jmp r11 -bluegl_glGetActiveUniform endp +bluegl_glVertexAttribL1i64NV endp -extrn __blue_glCore_glProgramUniformMatrix4x3fv: qword -bluegl_glProgramUniformMatrix4x3fv proc - mov r11, __blue_glCore_glProgramUniformMatrix4x3fv +extrn __blue_glCore_glVertexAttribL2i64NV: qword +bluegl_glVertexAttribL2i64NV proc + mov r11, __blue_glCore_glVertexAttribL2i64NV jmp r11 -bluegl_glProgramUniformMatrix4x3fv endp +bluegl_glVertexAttribL2i64NV endp -extrn __blue_glCore_glCreateVertexArrays: qword -bluegl_glCreateVertexArrays proc - mov r11, __blue_glCore_glCreateVertexArrays +extrn __blue_glCore_glVertexAttribL3i64NV: qword +bluegl_glVertexAttribL3i64NV proc + mov r11, __blue_glCore_glVertexAttribL3i64NV jmp r11 -bluegl_glCreateVertexArrays endp +bluegl_glVertexAttribL3i64NV endp -extrn __blue_glCore_glWindowPos3dv: qword -bluegl_glWindowPos3dv proc - mov r11, __blue_glCore_glWindowPos3dv +extrn __blue_glCore_glVertexAttribL4i64NV: qword +bluegl_glVertexAttribL4i64NV proc + mov r11, __blue_glCore_glVertexAttribL4i64NV jmp r11 -bluegl_glWindowPos3dv endp +bluegl_glVertexAttribL4i64NV endp -extrn __blue_glCore_glUniform1fARB: qword -bluegl_glUniform1fARB proc - mov r11, __blue_glCore_glUniform1fARB +extrn __blue_glCore_glVertexAttribL1i64vNV: qword +bluegl_glVertexAttribL1i64vNV proc + mov r11, __blue_glCore_glVertexAttribL1i64vNV jmp r11 -bluegl_glUniform1fARB endp +bluegl_glVertexAttribL1i64vNV endp -extrn __blue_glCore_glFragmentMaterialiSGIX: qword -bluegl_glFragmentMaterialiSGIX proc - mov r11, __blue_glCore_glFragmentMaterialiSGIX +extrn __blue_glCore_glVertexAttribL2i64vNV: qword +bluegl_glVertexAttribL2i64vNV proc + mov r11, __blue_glCore_glVertexAttribL2i64vNV jmp r11 -bluegl_glFragmentMaterialiSGIX endp +bluegl_glVertexAttribL2i64vNV endp -extrn __blue_glCore_glGetVertexAttribArrayObjectfvATI: qword -bluegl_glGetVertexAttribArrayObjectfvATI proc - mov r11, __blue_glCore_glGetVertexAttribArrayObjectfvATI +extrn __blue_glCore_glVertexAttribL3i64vNV: qword +bluegl_glVertexAttribL3i64vNV proc + mov r11, __blue_glCore_glVertexAttribL3i64vNV jmp r11 -bluegl_glGetVertexAttribArrayObjectfvATI endp +bluegl_glVertexAttribL3i64vNV endp -extrn __blue_glCore_glClearAccumxOES: qword -bluegl_glClearAccumxOES proc - mov r11, __blue_glCore_glClearAccumxOES +extrn __blue_glCore_glVertexAttribL4i64vNV: qword +bluegl_glVertexAttribL4i64vNV proc + mov r11, __blue_glCore_glVertexAttribL4i64vNV jmp r11 -bluegl_glClearAccumxOES endp +bluegl_glVertexAttribL4i64vNV endp -extrn __blue_glCore_glBindFragDataLocationEXT: qword -bluegl_glBindFragDataLocationEXT proc - mov r11, __blue_glCore_glBindFragDataLocationEXT +extrn __blue_glCore_glVertexAttribL1ui64NV: qword +bluegl_glVertexAttribL1ui64NV proc + mov r11, __blue_glCore_glVertexAttribL1ui64NV jmp r11 -bluegl_glBindFragDataLocationEXT endp +bluegl_glVertexAttribL1ui64NV endp -extrn __blue_glCore_glMultiTexCoord4dARB: qword -bluegl_glMultiTexCoord4dARB proc - mov r11, __blue_glCore_glMultiTexCoord4dARB +extrn __blue_glCore_glVertexAttribL2ui64NV: qword +bluegl_glVertexAttribL2ui64NV proc + mov r11, __blue_glCore_glVertexAttribL2ui64NV jmp r11 -bluegl_glMultiTexCoord4dARB endp +bluegl_glVertexAttribL2ui64NV endp -extrn __blue_glCore_glConvolutionParameterfv: qword -bluegl_glConvolutionParameterfv proc - mov r11, __blue_glCore_glConvolutionParameterfv +extrn __blue_glCore_glVertexAttribL3ui64NV: qword +bluegl_glVertexAttribL3ui64NV proc + mov r11, __blue_glCore_glVertexAttribL3ui64NV jmp r11 -bluegl_glConvolutionParameterfv endp +bluegl_glVertexAttribL3ui64NV endp -extrn __blue_glCore_glFragmentColorMaterialSGIX: qword -bluegl_glFragmentColorMaterialSGIX proc - mov r11, __blue_glCore_glFragmentColorMaterialSGIX +extrn __blue_glCore_glVertexAttribL4ui64NV: qword +bluegl_glVertexAttribL4ui64NV proc + mov r11, __blue_glCore_glVertexAttribL4ui64NV jmp r11 -bluegl_glFragmentColorMaterialSGIX endp +bluegl_glVertexAttribL4ui64NV endp -extrn __blue_glCore_glUniformMatrix3dv: qword -bluegl_glUniformMatrix3dv proc - mov r11, __blue_glCore_glUniformMatrix3dv +extrn __blue_glCore_glVertexAttribL1ui64vNV: qword +bluegl_glVertexAttribL1ui64vNV proc + mov r11, __blue_glCore_glVertexAttribL1ui64vNV jmp r11 -bluegl_glUniformMatrix3dv endp +bluegl_glVertexAttribL1ui64vNV endp -extrn __blue_glCore_glGetnPixelMapusv: qword -bluegl_glGetnPixelMapusv proc - mov r11, __blue_glCore_glGetnPixelMapusv +extrn __blue_glCore_glVertexAttribL2ui64vNV: qword +bluegl_glVertexAttribL2ui64vNV proc + mov r11, __blue_glCore_glVertexAttribL2ui64vNV jmp r11 -bluegl_glGetnPixelMapusv endp +bluegl_glVertexAttribL2ui64vNV endp -extrn __blue_glCore_glFramebufferTextureLayer: qword -bluegl_glFramebufferTextureLayer proc - mov r11, __blue_glCore_glFramebufferTextureLayer +extrn __blue_glCore_glVertexAttribL3ui64vNV: qword +bluegl_glVertexAttribL3ui64vNV proc + mov r11, __blue_glCore_glVertexAttribL3ui64vNV jmp r11 -bluegl_glFramebufferTextureLayer endp +bluegl_glVertexAttribL3ui64vNV endp -extrn __blue_glCore_glStencilThenCoverStrokePathInstancedNV: qword -bluegl_glStencilThenCoverStrokePathInstancedNV proc - mov r11, __blue_glCore_glStencilThenCoverStrokePathInstancedNV +extrn __blue_glCore_glVertexAttribL4ui64vNV: qword +bluegl_glVertexAttribL4ui64vNV proc + mov r11, __blue_glCore_glVertexAttribL4ui64vNV jmp r11 -bluegl_glStencilThenCoverStrokePathInstancedNV endp +bluegl_glVertexAttribL4ui64vNV endp -extrn __blue_glCore_glVDPAURegisterOutputSurfaceNV: qword -bluegl_glVDPAURegisterOutputSurfaceNV proc - mov r11, __blue_glCore_glVDPAURegisterOutputSurfaceNV +extrn __blue_glCore_glGetVertexAttribLi64vNV: qword +bluegl_glGetVertexAttribLi64vNV proc + mov r11, __blue_glCore_glGetVertexAttribLi64vNV jmp r11 -bluegl_glVDPAURegisterOutputSurfaceNV endp +bluegl_glGetVertexAttribLi64vNV endp -extrn __blue_glCore_glMultiTexCoord4dvARB: qword -bluegl_glMultiTexCoord4dvARB proc - mov r11, __blue_glCore_glMultiTexCoord4dvARB +extrn __blue_glCore_glGetVertexAttribLui64vNV: qword +bluegl_glGetVertexAttribLui64vNV proc + mov r11, __blue_glCore_glGetVertexAttribLui64vNV jmp r11 -bluegl_glMultiTexCoord4dvARB endp +bluegl_glGetVertexAttribLui64vNV endp -extrn __blue_glCore_glCopyTextureSubImage3D: qword -bluegl_glCopyTextureSubImage3D proc - mov r11, __blue_glCore_glCopyTextureSubImage3D +extrn __blue_glCore_glVertexAttribLFormatNV: qword +bluegl_glVertexAttribLFormatNV proc + mov r11, __blue_glCore_glVertexAttribLFormatNV jmp r11 -bluegl_glCopyTextureSubImage3D endp +bluegl_glVertexAttribLFormatNV endp -extrn __blue_glCore_glGetVariantIntegervEXT: qword -bluegl_glGetVariantIntegervEXT proc - mov r11, __blue_glCore_glGetVariantIntegervEXT +extrn __blue_glCore_glBufferAddressRangeNV: qword +bluegl_glBufferAddressRangeNV proc + mov r11, __blue_glCore_glBufferAddressRangeNV jmp r11 -bluegl_glGetVariantIntegervEXT endp +bluegl_glBufferAddressRangeNV endp -extrn __blue_glCore_glGetTexEnvxvOES: qword -bluegl_glGetTexEnvxvOES proc - mov r11, __blue_glCore_glGetTexEnvxvOES +extrn __blue_glCore_glVertexFormatNV: qword +bluegl_glVertexFormatNV proc + mov r11, __blue_glCore_glVertexFormatNV jmp r11 -bluegl_glGetTexEnvxvOES endp +bluegl_glVertexFormatNV endp -extrn __blue_glCore_glGetFloati_vEXT: qword -bluegl_glGetFloati_vEXT proc - mov r11, __blue_glCore_glGetFloati_vEXT +extrn __blue_glCore_glNormalFormatNV: qword +bluegl_glNormalFormatNV proc + mov r11, __blue_glCore_glNormalFormatNV jmp r11 -bluegl_glGetFloati_vEXT endp +bluegl_glNormalFormatNV endp -extrn __blue_glCore_glAsyncMarkerSGIX: qword -bluegl_glAsyncMarkerSGIX proc - mov r11, __blue_glCore_glAsyncMarkerSGIX +extrn __blue_glCore_glColorFormatNV: qword +bluegl_glColorFormatNV proc + mov r11, __blue_glCore_glColorFormatNV jmp r11 -bluegl_glAsyncMarkerSGIX endp +bluegl_glColorFormatNV endp -extrn __blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN: qword -bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN proc - mov r11, __blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN +extrn __blue_glCore_glIndexFormatNV: qword +bluegl_glIndexFormatNV proc + mov r11, __blue_glCore_glIndexFormatNV jmp r11 -bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN endp +bluegl_glIndexFormatNV endp -extrn __blue_glCore_glTexRenderbufferNV: qword -bluegl_glTexRenderbufferNV proc - mov r11, __blue_glCore_glTexRenderbufferNV +extrn __blue_glCore_glTexCoordFormatNV: qword +bluegl_glTexCoordFormatNV proc + mov r11, __blue_glCore_glTexCoordFormatNV jmp r11 -bluegl_glTexRenderbufferNV endp +bluegl_glTexCoordFormatNV endp -extrn __blue_glCore_glGetConvolutionParameterfvEXT: qword -bluegl_glGetConvolutionParameterfvEXT proc - mov r11, __blue_glCore_glGetConvolutionParameterfvEXT +extrn __blue_glCore_glEdgeFlagFormatNV: qword +bluegl_glEdgeFlagFormatNV proc + mov r11, __blue_glCore_glEdgeFlagFormatNV jmp r11 -bluegl_glGetConvolutionParameterfvEXT endp +bluegl_glEdgeFlagFormatNV endp -extrn __blue_glCore_glLightxvOES: qword -bluegl_glLightxvOES proc - mov r11, __blue_glCore_glLightxvOES +extrn __blue_glCore_glSecondaryColorFormatNV: qword +bluegl_glSecondaryColorFormatNV proc + mov r11, __blue_glCore_glSecondaryColorFormatNV jmp r11 -bluegl_glLightxvOES endp +bluegl_glSecondaryColorFormatNV endp -extrn __blue_glCore_glDeleteNamedStringARB: qword -bluegl_glDeleteNamedStringARB proc - mov r11, __blue_glCore_glDeleteNamedStringARB +extrn __blue_glCore_glFogCoordFormatNV: qword +bluegl_glFogCoordFormatNV proc + mov r11, __blue_glCore_glFogCoordFormatNV jmp r11 -bluegl_glDeleteNamedStringARB endp +bluegl_glFogCoordFormatNV endp -extrn __blue_glCore_glColor3hvNV: qword -bluegl_glColor3hvNV proc - mov r11, __blue_glCore_glColor3hvNV +extrn __blue_glCore_glVertexAttribFormatNV: qword +bluegl_glVertexAttribFormatNV proc + mov r11, __blue_glCore_glVertexAttribFormatNV jmp r11 -bluegl_glColor3hvNV endp +bluegl_glVertexAttribFormatNV endp -extrn __blue_glCore_glUniformMatrix4dv: qword -bluegl_glUniformMatrix4dv proc - mov r11, __blue_glCore_glUniformMatrix4dv +extrn __blue_glCore_glVertexAttribIFormatNV: qword +bluegl_glVertexAttribIFormatNV proc + mov r11, __blue_glCore_glVertexAttribIFormatNV jmp r11 -bluegl_glUniformMatrix4dv endp +bluegl_glVertexAttribIFormatNV endp -extrn __blue_glCore_glCompressedTexImage2DARB: qword -bluegl_glCompressedTexImage2DARB proc - mov r11, __blue_glCore_glCompressedTexImage2DARB +extrn __blue_glCore_glGetIntegerui64i_vNV: qword +bluegl_glGetIntegerui64i_vNV proc + mov r11, __blue_glCore_glGetIntegerui64i_vNV jmp r11 -bluegl_glCompressedTexImage2DARB endp +bluegl_glGetIntegerui64i_vNV endp -extrn __blue_glCore_glGenTexturesEXT: qword -bluegl_glGenTexturesEXT proc - mov r11, __blue_glCore_glGenTexturesEXT +extrn __blue_glCore_glAreProgramsResidentNV: qword +bluegl_glAreProgramsResidentNV proc + mov r11, __blue_glCore_glAreProgramsResidentNV jmp r11 -bluegl_glGenTexturesEXT endp +bluegl_glAreProgramsResidentNV endp -extrn __blue_glCore_glPathMemoryGlyphIndexArrayNV: qword -bluegl_glPathMemoryGlyphIndexArrayNV proc - mov r11, __blue_glCore_glPathMemoryGlyphIndexArrayNV +extrn __blue_glCore_glBindProgramNV: qword +bluegl_glBindProgramNV proc + mov r11, __blue_glCore_glBindProgramNV jmp r11 -bluegl_glPathMemoryGlyphIndexArrayNV endp +bluegl_glBindProgramNV endp -extrn __blue_glCore_glGetBufferSubDataARB: qword -bluegl_glGetBufferSubDataARB proc - mov r11, __blue_glCore_glGetBufferSubDataARB +extrn __blue_glCore_glDeleteProgramsNV: qword +bluegl_glDeleteProgramsNV proc + mov r11, __blue_glCore_glDeleteProgramsNV jmp r11 -bluegl_glGetBufferSubDataARB endp +bluegl_glDeleteProgramsNV endp -extrn __blue_glCore_glFinishObjectAPPLE: qword -bluegl_glFinishObjectAPPLE proc - mov r11, __blue_glCore_glFinishObjectAPPLE +extrn __blue_glCore_glExecuteProgramNV: qword +bluegl_glExecuteProgramNV proc + mov r11, __blue_glCore_glExecuteProgramNV jmp r11 -bluegl_glFinishObjectAPPLE endp +bluegl_glExecuteProgramNV endp -extrn __blue_glCore_glDetachShader: qword -bluegl_glDetachShader proc - mov r11, __blue_glCore_glDetachShader +extrn __blue_glCore_glGenProgramsNV: qword +bluegl_glGenProgramsNV proc + mov r11, __blue_glCore_glGenProgramsNV jmp r11 -bluegl_glDetachShader endp +bluegl_glGenProgramsNV endp -extrn __blue_glCore_glBindTexture: qword -bluegl_glBindTexture proc - mov r11, __blue_glCore_glBindTexture +extrn __blue_glCore_glGetProgramParameterdvNV: qword +bluegl_glGetProgramParameterdvNV proc + mov r11, __blue_glCore_glGetProgramParameterdvNV jmp r11 -bluegl_glBindTexture endp +bluegl_glGetProgramParameterdvNV endp -extrn __blue_glCore_glGetProgramResourcefvNV: qword -bluegl_glGetProgramResourcefvNV proc - mov r11, __blue_glCore_glGetProgramResourcefvNV +extrn __blue_glCore_glGetProgramParameterfvNV: qword +bluegl_glGetProgramParameterfvNV proc + mov r11, __blue_glCore_glGetProgramParameterfvNV jmp r11 -bluegl_glGetProgramResourcefvNV endp +bluegl_glGetProgramParameterfvNV endp -extrn __blue_glCore_glTexCoord2fColor4ubVertex3fvSUN: qword -bluegl_glTexCoord2fColor4ubVertex3fvSUN proc - mov r11, __blue_glCore_glTexCoord2fColor4ubVertex3fvSUN +extrn __blue_glCore_glGetProgramivNV: qword +bluegl_glGetProgramivNV proc + mov r11, __blue_glCore_glGetProgramivNV jmp r11 -bluegl_glTexCoord2fColor4ubVertex3fvSUN endp +bluegl_glGetProgramivNV endp -extrn __blue_glCore_glMultiTexCoord4dv: qword -bluegl_glMultiTexCoord4dv proc - mov r11, __blue_glCore_glMultiTexCoord4dv +extrn __blue_glCore_glGetProgramStringNV: qword +bluegl_glGetProgramStringNV proc + mov r11, __blue_glCore_glGetProgramStringNV jmp r11 -bluegl_glMultiTexCoord4dv endp +bluegl_glGetProgramStringNV endp -extrn __blue_glCore_glIsPointInFillPathNV: qword -bluegl_glIsPointInFillPathNV proc - mov r11, __blue_glCore_glIsPointInFillPathNV +extrn __blue_glCore_glGetTrackMatrixivNV: qword +bluegl_glGetTrackMatrixivNV proc + mov r11, __blue_glCore_glGetTrackMatrixivNV jmp r11 -bluegl_glIsPointInFillPathNV endp +bluegl_glGetTrackMatrixivNV endp -extrn __blue_glCore_glDrawTransformFeedbackInstanced: qword -bluegl_glDrawTransformFeedbackInstanced proc - mov r11, __blue_glCore_glDrawTransformFeedbackInstanced +extrn __blue_glCore_glGetVertexAttribdvNV: qword +bluegl_glGetVertexAttribdvNV proc + mov r11, __blue_glCore_glGetVertexAttribdvNV jmp r11 -bluegl_glDrawTransformFeedbackInstanced endp +bluegl_glGetVertexAttribdvNV endp -extrn __blue_glCore_glProgramParameteriARB: qword -bluegl_glProgramParameteriARB proc - mov r11, __blue_glCore_glProgramParameteriARB +extrn __blue_glCore_glGetVertexAttribfvNV: qword +bluegl_glGetVertexAttribfvNV proc + mov r11, __blue_glCore_glGetVertexAttribfvNV jmp r11 -bluegl_glProgramParameteriARB endp +bluegl_glGetVertexAttribfvNV endp -extrn __blue_glCore_glVertexAttrib3fvNV: qword -bluegl_glVertexAttrib3fvNV proc - mov r11, __blue_glCore_glVertexAttrib3fvNV +extrn __blue_glCore_glGetVertexAttribivNV: qword +bluegl_glGetVertexAttribivNV proc + mov r11, __blue_glCore_glGetVertexAttribivNV jmp r11 -bluegl_glVertexAttrib3fvNV endp +bluegl_glGetVertexAttribivNV endp -extrn __blue_glCore_glEnableVertexArrayAttrib: qword -bluegl_glEnableVertexArrayAttrib proc - mov r11, __blue_glCore_glEnableVertexArrayAttrib +extrn __blue_glCore_glGetVertexAttribPointervNV: qword +bluegl_glGetVertexAttribPointervNV proc + mov r11, __blue_glCore_glGetVertexAttribPointervNV jmp r11 -bluegl_glEnableVertexArrayAttrib endp +bluegl_glGetVertexAttribPointervNV endp -extrn __blue_glCore_glUniform3ui64vNV: qword -bluegl_glUniform3ui64vNV proc - mov r11, __blue_glCore_glUniform3ui64vNV +extrn __blue_glCore_glIsProgramNV: qword +bluegl_glIsProgramNV proc + mov r11, __blue_glCore_glIsProgramNV jmp r11 -bluegl_glUniform3ui64vNV endp +bluegl_glIsProgramNV endp -extrn __blue_glCore_glVertexAttribs4fvNV: qword -bluegl_glVertexAttribs4fvNV proc - mov r11, __blue_glCore_glVertexAttribs4fvNV +extrn __blue_glCore_glLoadProgramNV: qword +bluegl_glLoadProgramNV proc + mov r11, __blue_glCore_glLoadProgramNV jmp r11 -bluegl_glVertexAttribs4fvNV endp +bluegl_glLoadProgramNV endp -extrn __blue_glCore_glGetCompressedTextureImageEXT: qword -bluegl_glGetCompressedTextureImageEXT proc - mov r11, __blue_glCore_glGetCompressedTextureImageEXT +extrn __blue_glCore_glProgramParameter4dNV: qword +bluegl_glProgramParameter4dNV proc + mov r11, __blue_glCore_glProgramParameter4dNV jmp r11 -bluegl_glGetCompressedTextureImageEXT endp +bluegl_glProgramParameter4dNV endp -extrn __blue_glCore_glVertex3bOES: qword -bluegl_glVertex3bOES proc - mov r11, __blue_glCore_glVertex3bOES +extrn __blue_glCore_glProgramParameter4dvNV: qword +bluegl_glProgramParameter4dvNV proc + mov r11, __blue_glCore_glProgramParameter4dvNV jmp r11 -bluegl_glVertex3bOES endp +bluegl_glProgramParameter4dvNV endp -extrn __blue_glCore_glProgramLocalParameterI4ivNV: qword -bluegl_glProgramLocalParameterI4ivNV proc - mov r11, __blue_glCore_glProgramLocalParameterI4ivNV +extrn __blue_glCore_glProgramParameter4fNV: qword +bluegl_glProgramParameter4fNV proc + mov r11, __blue_glCore_glProgramParameter4fNV jmp r11 -bluegl_glProgramLocalParameterI4ivNV endp +bluegl_glProgramParameter4fNV endp -extrn __blue_glCore_glWindowPos2fMESA: qword -bluegl_glWindowPos2fMESA proc - mov r11, __blue_glCore_glWindowPos2fMESA +extrn __blue_glCore_glProgramParameter4fvNV: qword +bluegl_glProgramParameter4fvNV proc + mov r11, __blue_glCore_glProgramParameter4fvNV jmp r11 -bluegl_glWindowPos2fMESA endp +bluegl_glProgramParameter4fvNV endp -extrn __blue_glCore_glWeightusvARB: qword -bluegl_glWeightusvARB proc - mov r11, __blue_glCore_glWeightusvARB +extrn __blue_glCore_glProgramParameters4dvNV: qword +bluegl_glProgramParameters4dvNV proc + mov r11, __blue_glCore_glProgramParameters4dvNV jmp r11 -bluegl_glWeightusvARB endp +bluegl_glProgramParameters4dvNV endp -extrn __blue_glCore_glGenOcclusionQueriesNV: qword -bluegl_glGenOcclusionQueriesNV proc - mov r11, __blue_glCore_glGenOcclusionQueriesNV +extrn __blue_glCore_glProgramParameters4fvNV: qword +bluegl_glProgramParameters4fvNV proc + mov r11, __blue_glCore_glProgramParameters4fvNV jmp r11 -bluegl_glGenOcclusionQueriesNV endp +bluegl_glProgramParameters4fvNV endp -extrn __blue_glCore_glTexCoordPointervINTEL: qword -bluegl_glTexCoordPointervINTEL proc - mov r11, __blue_glCore_glTexCoordPointervINTEL +extrn __blue_glCore_glRequestResidentProgramsNV: qword +bluegl_glRequestResidentProgramsNV proc + mov r11, __blue_glCore_glRequestResidentProgramsNV jmp r11 -bluegl_glTexCoordPointervINTEL endp +bluegl_glRequestResidentProgramsNV endp -extrn __blue_glCore_glGetTextureParameterIivEXT: qword -bluegl_glGetTextureParameterIivEXT proc - mov r11, __blue_glCore_glGetTextureParameterIivEXT +extrn __blue_glCore_glTrackMatrixNV: qword +bluegl_glTrackMatrixNV proc + mov r11, __blue_glCore_glTrackMatrixNV jmp r11 -bluegl_glGetTextureParameterIivEXT endp +bluegl_glTrackMatrixNV endp -extrn __blue_glCore_glDeleteStatesNV: qword -bluegl_glDeleteStatesNV proc - mov r11, __blue_glCore_glDeleteStatesNV +extrn __blue_glCore_glVertexAttribPointerNV: qword +bluegl_glVertexAttribPointerNV proc + mov r11, __blue_glCore_glVertexAttribPointerNV jmp r11 -bluegl_glDeleteStatesNV endp +bluegl_glVertexAttribPointerNV endp -extrn __blue_glCore_glProgramLocalParameter4fvARB: qword -bluegl_glProgramLocalParameter4fvARB proc - mov r11, __blue_glCore_glProgramLocalParameter4fvARB +extrn __blue_glCore_glVertexAttrib1dNV: qword +bluegl_glVertexAttrib1dNV proc + mov r11, __blue_glCore_glVertexAttrib1dNV jmp r11 -bluegl_glProgramLocalParameter4fvARB endp +bluegl_glVertexAttrib1dNV endp -extrn __blue_glCore_glCoverFillPathInstancedNV: qword -bluegl_glCoverFillPathInstancedNV proc - mov r11, __blue_glCore_glCoverFillPathInstancedNV +extrn __blue_glCore_glVertexAttrib1dvNV: qword +bluegl_glVertexAttrib1dvNV proc + mov r11, __blue_glCore_glVertexAttrib1dvNV jmp r11 -bluegl_glCoverFillPathInstancedNV endp +bluegl_glVertexAttrib1dvNV endp -extrn __blue_glCore_glBeginConditionalRenderNVX: qword -bluegl_glBeginConditionalRenderNVX proc - mov r11, __blue_glCore_glBeginConditionalRenderNVX +extrn __blue_glCore_glVertexAttrib1fNV: qword +bluegl_glVertexAttrib1fNV proc + mov r11, __blue_glCore_glVertexAttrib1fNV jmp r11 -bluegl_glBeginConditionalRenderNVX endp +bluegl_glVertexAttrib1fNV endp -extrn __blue_glCore_glPathDashArrayNV: qword -bluegl_glPathDashArrayNV proc - mov r11, __blue_glCore_glPathDashArrayNV +extrn __blue_glCore_glVertexAttrib1fvNV: qword +bluegl_glVertexAttrib1fvNV proc + mov r11, __blue_glCore_glVertexAttrib1fvNV jmp r11 -bluegl_glPathDashArrayNV endp +bluegl_glVertexAttrib1fvNV endp -extrn __blue_glCore_glSpriteParameteriSGIX: qword -bluegl_glSpriteParameteriSGIX proc - mov r11, __blue_glCore_glSpriteParameteriSGIX +extrn __blue_glCore_glVertexAttrib1sNV: qword +bluegl_glVertexAttrib1sNV proc + mov r11, __blue_glCore_glVertexAttrib1sNV jmp r11 -bluegl_glSpriteParameteriSGIX endp +bluegl_glVertexAttrib1sNV endp -extrn __blue_glCore_glGetNamedProgramStringEXT: qword -bluegl_glGetNamedProgramStringEXT proc - mov r11, __blue_glCore_glGetNamedProgramStringEXT +extrn __blue_glCore_glVertexAttrib1svNV: qword +bluegl_glVertexAttrib1svNV proc + mov r11, __blue_glCore_glVertexAttrib1svNV jmp r11 -bluegl_glGetNamedProgramStringEXT endp +bluegl_glVertexAttrib1svNV endp -extrn __blue_glCore_glCombinerParameterfvNV: qword -bluegl_glCombinerParameterfvNV proc - mov r11, __blue_glCore_glCombinerParameterfvNV +extrn __blue_glCore_glVertexAttrib2dNV: qword +bluegl_glVertexAttrib2dNV proc + mov r11, __blue_glCore_glVertexAttrib2dNV jmp r11 -bluegl_glCombinerParameterfvNV endp +bluegl_glVertexAttrib2dNV endp -extrn __blue_glCore_glTexParameterxvOES: qword -bluegl_glTexParameterxvOES proc - mov r11, __blue_glCore_glTexParameterxvOES +extrn __blue_glCore_glVertexAttrib2dvNV: qword +bluegl_glVertexAttrib2dvNV proc + mov r11, __blue_glCore_glVertexAttrib2dvNV jmp r11 -bluegl_glTexParameterxvOES endp +bluegl_glVertexAttrib2dvNV endp -extrn __blue_glCore_glVertexArrayVertexAttribDivisorEXT: qword -bluegl_glVertexArrayVertexAttribDivisorEXT proc - mov r11, __blue_glCore_glVertexArrayVertexAttribDivisorEXT +extrn __blue_glCore_glVertexAttrib2fNV: qword +bluegl_glVertexAttrib2fNV proc + mov r11, __blue_glCore_glVertexAttrib2fNV jmp r11 -bluegl_glVertexArrayVertexAttribDivisorEXT endp +bluegl_glVertexAttrib2fNV endp -extrn __blue_glCore_glProgramSubroutineParametersuivNV: qword -bluegl_glProgramSubroutineParametersuivNV proc - mov r11, __blue_glCore_glProgramSubroutineParametersuivNV +extrn __blue_glCore_glVertexAttrib2fvNV: qword +bluegl_glVertexAttrib2fvNV proc + mov r11, __blue_glCore_glVertexAttrib2fvNV jmp r11 -bluegl_glProgramSubroutineParametersuivNV endp +bluegl_glVertexAttrib2fvNV endp -extrn __blue_glCore_glDeleteObjectARB: qword -bluegl_glDeleteObjectARB proc - mov r11, __blue_glCore_glDeleteObjectARB +extrn __blue_glCore_glVertexAttrib2sNV: qword +bluegl_glVertexAttrib2sNV proc + mov r11, __blue_glCore_glVertexAttrib2sNV jmp r11 -bluegl_glDeleteObjectARB endp +bluegl_glVertexAttrib2sNV endp -extrn __blue_glCore_glProgramUniform1i64ARB: qword -bluegl_glProgramUniform1i64ARB proc - mov r11, __blue_glCore_glProgramUniform1i64ARB +extrn __blue_glCore_glVertexAttrib2svNV: qword +bluegl_glVertexAttrib2svNV proc + mov r11, __blue_glCore_glVertexAttrib2svNV jmp r11 -bluegl_glProgramUniform1i64ARB endp +bluegl_glVertexAttrib2svNV endp -extrn __blue_glCore_glFramebufferTextureARB: qword -bluegl_glFramebufferTextureARB proc - mov r11, __blue_glCore_glFramebufferTextureARB +extrn __blue_glCore_glVertexAttrib3dNV: qword +bluegl_glVertexAttrib3dNV proc + mov r11, __blue_glCore_glVertexAttrib3dNV jmp r11 -bluegl_glFramebufferTextureARB endp +bluegl_glVertexAttrib3dNV endp -extrn __blue_glCore_glElementPointerATI: qword -bluegl_glElementPointerATI proc - mov r11, __blue_glCore_glElementPointerATI +extrn __blue_glCore_glVertexAttrib3dvNV: qword +bluegl_glVertexAttrib3dvNV proc + mov r11, __blue_glCore_glVertexAttrib3dvNV jmp r11 -bluegl_glElementPointerATI endp +bluegl_glVertexAttrib3dvNV endp -extrn __blue_glCore_glUniform2i64vARB: qword -bluegl_glUniform2i64vARB proc - mov r11, __blue_glCore_glUniform2i64vARB +extrn __blue_glCore_glVertexAttrib3fNV: qword +bluegl_glVertexAttrib3fNV proc + mov r11, __blue_glCore_glVertexAttrib3fNV jmp r11 -bluegl_glUniform2i64vARB endp +bluegl_glVertexAttrib3fNV endp -extrn __blue_glCore_glGetBooleanIndexedvEXT: qword -bluegl_glGetBooleanIndexedvEXT proc - mov r11, __blue_glCore_glGetBooleanIndexedvEXT +extrn __blue_glCore_glVertexAttrib3fvNV: qword +bluegl_glVertexAttrib3fvNV proc + mov r11, __blue_glCore_glVertexAttrib3fvNV jmp r11 -bluegl_glGetBooleanIndexedvEXT endp +bluegl_glVertexAttrib3fvNV endp -extrn __blue_glCore_glVertexAttribP1uiv: qword -bluegl_glVertexAttribP1uiv proc - mov r11, __blue_glCore_glVertexAttribP1uiv +extrn __blue_glCore_glVertexAttrib3sNV: qword +bluegl_glVertexAttrib3sNV proc + mov r11, __blue_glCore_glVertexAttrib3sNV jmp r11 -bluegl_glVertexAttribP1uiv endp +bluegl_glVertexAttrib3sNV endp -extrn __blue_glCore_glGetDoubleIndexedvEXT: qword -bluegl_glGetDoubleIndexedvEXT proc - mov r11, __blue_glCore_glGetDoubleIndexedvEXT +extrn __blue_glCore_glVertexAttrib3svNV: qword +bluegl_glVertexAttrib3svNV proc + mov r11, __blue_glCore_glVertexAttrib3svNV jmp r11 -bluegl_glGetDoubleIndexedvEXT endp +bluegl_glVertexAttrib3svNV endp -extrn __blue_glCore_glGetUniformiv: qword -bluegl_glGetUniformiv proc - mov r11, __blue_glCore_glGetUniformiv +extrn __blue_glCore_glVertexAttrib4dNV: qword +bluegl_glVertexAttrib4dNV proc + mov r11, __blue_glCore_glVertexAttrib4dNV jmp r11 -bluegl_glGetUniformiv endp +bluegl_glVertexAttrib4dNV endp -extrn __blue_glCore_glVertexAttribArrayObjectATI: qword -bluegl_glVertexAttribArrayObjectATI proc - mov r11, __blue_glCore_glVertexAttribArrayObjectATI +extrn __blue_glCore_glVertexAttrib4dvNV: qword +bluegl_glVertexAttrib4dvNV proc + mov r11, __blue_glCore_glVertexAttrib4dvNV jmp r11 -bluegl_glVertexAttribArrayObjectATI endp +bluegl_glVertexAttrib4dvNV endp -extrn __blue_glCore_glBufferSubDataARB: qword -bluegl_glBufferSubDataARB proc - mov r11, __blue_glCore_glBufferSubDataARB +extrn __blue_glCore_glVertexAttrib4fNV: qword +bluegl_glVertexAttrib4fNV proc + mov r11, __blue_glCore_glVertexAttrib4fNV jmp r11 -bluegl_glBufferSubDataARB endp +bluegl_glVertexAttrib4fNV endp -extrn __blue_glCore_glWindowPos2fARB: qword -bluegl_glWindowPos2fARB proc - mov r11, __blue_glCore_glWindowPos2fARB +extrn __blue_glCore_glVertexAttrib4fvNV: qword +bluegl_glVertexAttrib4fvNV proc + mov r11, __blue_glCore_glVertexAttrib4fvNV jmp r11 -bluegl_glWindowPos2fARB endp +bluegl_glVertexAttrib4fvNV endp -extrn __blue_glCore_glMultiTexCoord2bvOES: qword -bluegl_glMultiTexCoord2bvOES proc - mov r11, __blue_glCore_glMultiTexCoord2bvOES +extrn __blue_glCore_glVertexAttrib4sNV: qword +bluegl_glVertexAttrib4sNV proc + mov r11, __blue_glCore_glVertexAttrib4sNV jmp r11 -bluegl_glMultiTexCoord2bvOES endp +bluegl_glVertexAttrib4sNV endp -extrn __blue_glCore_glProgramUniform2i64vARB: qword -bluegl_glProgramUniform2i64vARB proc - mov r11, __blue_glCore_glProgramUniform2i64vARB +extrn __blue_glCore_glVertexAttrib4svNV: qword +bluegl_glVertexAttrib4svNV proc + mov r11, __blue_glCore_glVertexAttrib4svNV jmp r11 -bluegl_glProgramUniform2i64vARB endp +bluegl_glVertexAttrib4svNV endp -extrn __blue_glCore_glTexEnvxOES: qword -bluegl_glTexEnvxOES proc - mov r11, __blue_glCore_glTexEnvxOES +extrn __blue_glCore_glVertexAttrib4ubNV: qword +bluegl_glVertexAttrib4ubNV proc + mov r11, __blue_glCore_glVertexAttrib4ubNV jmp r11 -bluegl_glTexEnvxOES endp +bluegl_glVertexAttrib4ubNV endp -extrn __blue_glCore_glStencilOpValueAMD: qword -bluegl_glStencilOpValueAMD proc - mov r11, __blue_glCore_glStencilOpValueAMD +extrn __blue_glCore_glVertexAttrib4ubvNV: qword +bluegl_glVertexAttrib4ubvNV proc + mov r11, __blue_glCore_glVertexAttrib4ubvNV jmp r11 -bluegl_glStencilOpValueAMD endp +bluegl_glVertexAttrib4ubvNV endp -extrn __blue_glCore_glUniform4ui64vARB: qword -bluegl_glUniform4ui64vARB proc - mov r11, __blue_glCore_glUniform4ui64vARB +extrn __blue_glCore_glVertexAttribs1dvNV: qword +bluegl_glVertexAttribs1dvNV proc + mov r11, __blue_glCore_glVertexAttribs1dvNV jmp r11 -bluegl_glUniform4ui64vARB endp +bluegl_glVertexAttribs1dvNV endp -extrn __blue_glCore_glTangent3iEXT: qword -bluegl_glTangent3iEXT proc - mov r11, __blue_glCore_glTangent3iEXT +extrn __blue_glCore_glVertexAttribs1fvNV: qword +bluegl_glVertexAttribs1fvNV proc + mov r11, __blue_glCore_glVertexAttribs1fvNV jmp r11 -bluegl_glTangent3iEXT endp +bluegl_glVertexAttribs1fvNV endp -extrn __blue_glCore_glGetVertexAttribLdvEXT: qword -bluegl_glGetVertexAttribLdvEXT proc - mov r11, __blue_glCore_glGetVertexAttribLdvEXT +extrn __blue_glCore_glVertexAttribs1svNV: qword +bluegl_glVertexAttribs1svNV proc + mov r11, __blue_glCore_glVertexAttribs1svNV jmp r11 -bluegl_glGetVertexAttribLdvEXT endp +bluegl_glVertexAttribs1svNV endp -extrn __blue_glCore_glGetCoverageModulationTableNV: qword -bluegl_glGetCoverageModulationTableNV proc - mov r11, __blue_glCore_glGetCoverageModulationTableNV +extrn __blue_glCore_glVertexAttribs2dvNV: qword +bluegl_glVertexAttribs2dvNV proc + mov r11, __blue_glCore_glVertexAttribs2dvNV jmp r11 -bluegl_glGetCoverageModulationTableNV endp +bluegl_glVertexAttribs2dvNV endp -extrn __blue_glCore_glVertexWeighthvNV: qword -bluegl_glVertexWeighthvNV proc - mov r11, __blue_glCore_glVertexWeighthvNV +extrn __blue_glCore_glVertexAttribs2fvNV: qword +bluegl_glVertexAttribs2fvNV proc + mov r11, __blue_glCore_glVertexAttribs2fvNV jmp r11 -bluegl_glVertexWeighthvNV endp +bluegl_glVertexAttribs2fvNV endp -extrn __blue_glCore_glWindowPos3iARB: qword -bluegl_glWindowPos3iARB proc - mov r11, __blue_glCore_glWindowPos3iARB +extrn __blue_glCore_glVertexAttribs2svNV: qword +bluegl_glVertexAttribs2svNV proc + mov r11, __blue_glCore_glVertexAttribs2svNV jmp r11 -bluegl_glWindowPos3iARB endp +bluegl_glVertexAttribs2svNV endp -extrn __blue_glCore_glVertexAttribI1iv: qword -bluegl_glVertexAttribI1iv proc - mov r11, __blue_glCore_glVertexAttribI1iv +extrn __blue_glCore_glVertexAttribs3dvNV: qword +bluegl_glVertexAttribs3dvNV proc + mov r11, __blue_glCore_glVertexAttribs3dvNV jmp r11 -bluegl_glVertexAttribI1iv endp +bluegl_glVertexAttribs3dvNV endp -extrn __blue_glCore_glWindowPos3fv: qword -bluegl_glWindowPos3fv proc - mov r11, __blue_glCore_glWindowPos3fv +extrn __blue_glCore_glVertexAttribs3fvNV: qword +bluegl_glVertexAttribs3fvNV proc + mov r11, __blue_glCore_glVertexAttribs3fvNV jmp r11 -bluegl_glWindowPos3fv endp +bluegl_glVertexAttribs3fvNV endp -extrn __blue_glCore_glVertexStream4ivATI: qword -bluegl_glVertexStream4ivATI proc - mov r11, __blue_glCore_glVertexStream4ivATI +extrn __blue_glCore_glVertexAttribs3svNV: qword +bluegl_glVertexAttribs3svNV proc + mov r11, __blue_glCore_glVertexAttribs3svNV jmp r11 -bluegl_glVertexStream4ivATI endp +bluegl_glVertexAttribs3svNV endp -extrn __blue_glCore_glTextureImage3DMultisampleCoverageNV: qword -bluegl_glTextureImage3DMultisampleCoverageNV proc - mov r11, __blue_glCore_glTextureImage3DMultisampleCoverageNV +extrn __blue_glCore_glVertexAttribs4dvNV: qword +bluegl_glVertexAttribs4dvNV proc + mov r11, __blue_glCore_glVertexAttribs4dvNV jmp r11 -bluegl_glTextureImage3DMultisampleCoverageNV endp +bluegl_glVertexAttribs4dvNV endp -extrn __blue_glCore_glUniform3f: qword -bluegl_glUniform3f proc - mov r11, __blue_glCore_glUniform3f +extrn __blue_glCore_glVertexAttribs4fvNV: qword +bluegl_glVertexAttribs4fvNV proc + mov r11, __blue_glCore_glVertexAttribs4fvNV jmp r11 -bluegl_glUniform3f endp +bluegl_glVertexAttribs4fvNV endp -extrn __blue_glCore_glAccumxOES: qword -bluegl_glAccumxOES proc - mov r11, __blue_glCore_glAccumxOES +extrn __blue_glCore_glVertexAttribs4svNV: qword +bluegl_glVertexAttribs4svNV proc + mov r11, __blue_glCore_glVertexAttribs4svNV jmp r11 -bluegl_glAccumxOES endp +bluegl_glVertexAttribs4svNV endp -extrn __blue_glCore_glTexStorage3D: qword -bluegl_glTexStorage3D proc - mov r11, __blue_glCore_glTexStorage3D +extrn __blue_glCore_glVertexAttribs4ubvNV: qword +bluegl_glVertexAttribs4ubvNV proc + mov r11, __blue_glCore_glVertexAttribs4ubvNV jmp r11 -bluegl_glTexStorage3D endp +bluegl_glVertexAttribs4ubvNV endp -extrn __blue_glCore_glDrawArrays: qword -bluegl_glDrawArrays proc - mov r11, __blue_glCore_glDrawArrays +extrn __blue_glCore_glVertexAttribI1iEXT: qword +bluegl_glVertexAttribI1iEXT proc + mov r11, __blue_glCore_glVertexAttribI1iEXT jmp r11 -bluegl_glDrawArrays endp +bluegl_glVertexAttribI1iEXT endp -extrn __blue_glCore_glSamplePatternEXT: qword -bluegl_glSamplePatternEXT proc - mov r11, __blue_glCore_glSamplePatternEXT +extrn __blue_glCore_glVertexAttribI2iEXT: qword +bluegl_glVertexAttribI2iEXT proc + mov r11, __blue_glCore_glVertexAttribI2iEXT jmp r11 -bluegl_glSamplePatternEXT endp +bluegl_glVertexAttribI2iEXT endp -extrn __blue_glCore_glNormalPointervINTEL: qword -bluegl_glNormalPointervINTEL proc - mov r11, __blue_glCore_glNormalPointervINTEL +extrn __blue_glCore_glVertexAttribI3iEXT: qword +bluegl_glVertexAttribI3iEXT proc + mov r11, __blue_glCore_glVertexAttribI3iEXT jmp r11 -bluegl_glNormalPointervINTEL endp +bluegl_glVertexAttribI3iEXT endp -extrn __blue_glCore_glWeightubvARB: qword -bluegl_glWeightubvARB proc - mov r11, __blue_glCore_glWeightubvARB +extrn __blue_glCore_glVertexAttribI4iEXT: qword +bluegl_glVertexAttribI4iEXT proc + mov r11, __blue_glCore_glVertexAttribI4iEXT jmp r11 -bluegl_glWeightubvARB endp +bluegl_glVertexAttribI4iEXT endp -extrn __blue_glCore_glGenProgramsNV: qword -bluegl_glGenProgramsNV proc - mov r11, __blue_glCore_glGenProgramsNV +extrn __blue_glCore_glVertexAttribI1uiEXT: qword +bluegl_glVertexAttribI1uiEXT proc + mov r11, __blue_glCore_glVertexAttribI1uiEXT jmp r11 -bluegl_glGenProgramsNV endp +bluegl_glVertexAttribI1uiEXT endp -extrn __blue_glCore_glDepthRangef: qword -bluegl_glDepthRangef proc - mov r11, __blue_glCore_glDepthRangef +extrn __blue_glCore_glVertexAttribI2uiEXT: qword +bluegl_glVertexAttribI2uiEXT proc + mov r11, __blue_glCore_glVertexAttribI2uiEXT jmp r11 -bluegl_glDepthRangef endp +bluegl_glVertexAttribI2uiEXT endp -extrn __blue_glCore_glGetProgramParameterdvNV: qword -bluegl_glGetProgramParameterdvNV proc - mov r11, __blue_glCore_glGetProgramParameterdvNV +extrn __blue_glCore_glVertexAttribI3uiEXT: qword +bluegl_glVertexAttribI3uiEXT proc + mov r11, __blue_glCore_glVertexAttribI3uiEXT jmp r11 -bluegl_glGetProgramParameterdvNV endp +bluegl_glVertexAttribI3uiEXT endp -extrn __blue_glCore_glPollInstrumentsSGIX: qword -bluegl_glPollInstrumentsSGIX proc - mov r11, __blue_glCore_glPollInstrumentsSGIX +extrn __blue_glCore_glVertexAttribI4uiEXT: qword +bluegl_glVertexAttribI4uiEXT proc + mov r11, __blue_glCore_glVertexAttribI4uiEXT jmp r11 -bluegl_glPollInstrumentsSGIX endp +bluegl_glVertexAttribI4uiEXT endp -extrn __blue_glCore_glMultiTexCoord1hNV: qword -bluegl_glMultiTexCoord1hNV proc - mov r11, __blue_glCore_glMultiTexCoord1hNV +extrn __blue_glCore_glVertexAttribI1ivEXT: qword +bluegl_glVertexAttribI1ivEXT proc + mov r11, __blue_glCore_glVertexAttribI1ivEXT jmp r11 -bluegl_glMultiTexCoord1hNV endp +bluegl_glVertexAttribI1ivEXT endp -extrn __blue_glCore_glSecondaryColor3s: qword -bluegl_glSecondaryColor3s proc - mov r11, __blue_glCore_glSecondaryColor3s +extrn __blue_glCore_glVertexAttribI2ivEXT: qword +bluegl_glVertexAttribI2ivEXT proc + mov r11, __blue_glCore_glVertexAttribI2ivEXT jmp r11 -bluegl_glSecondaryColor3s endp +bluegl_glVertexAttribI2ivEXT endp -extrn __blue_glCore_glTexCoordP1uiv: qword -bluegl_glTexCoordP1uiv proc - mov r11, __blue_glCore_glTexCoordP1uiv +extrn __blue_glCore_glVertexAttribI3ivEXT: qword +bluegl_glVertexAttribI3ivEXT proc + mov r11, __blue_glCore_glVertexAttribI3ivEXT jmp r11 -bluegl_glTexCoordP1uiv endp +bluegl_glVertexAttribI3ivEXT endp -extrn __blue_glCore_glStopInstrumentsSGIX: qword -bluegl_glStopInstrumentsSGIX proc - mov r11, __blue_glCore_glStopInstrumentsSGIX +extrn __blue_glCore_glVertexAttribI4ivEXT: qword +bluegl_glVertexAttribI4ivEXT proc + mov r11, __blue_glCore_glVertexAttribI4ivEXT jmp r11 -bluegl_glStopInstrumentsSGIX endp +bluegl_glVertexAttribI4ivEXT endp -extrn __blue_glCore_glActiveTexture: qword -bluegl_glActiveTexture proc - mov r11, __blue_glCore_glActiveTexture +extrn __blue_glCore_glVertexAttribI1uivEXT: qword +bluegl_glVertexAttribI1uivEXT proc + mov r11, __blue_glCore_glVertexAttribI1uivEXT jmp r11 -bluegl_glActiveTexture endp +bluegl_glVertexAttribI1uivEXT endp -extrn __blue_glCore_glVertexAttribs2svNV: qword -bluegl_glVertexAttribs2svNV proc - mov r11, __blue_glCore_glVertexAttribs2svNV +extrn __blue_glCore_glVertexAttribI2uivEXT: qword +bluegl_glVertexAttribI2uivEXT proc + mov r11, __blue_glCore_glVertexAttribI2uivEXT jmp r11 -bluegl_glVertexAttribs2svNV endp +bluegl_glVertexAttribI2uivEXT endp -extrn __blue_glCore_glGetActiveAtomicCounterBufferiv: qword -bluegl_glGetActiveAtomicCounterBufferiv proc - mov r11, __blue_glCore_glGetActiveAtomicCounterBufferiv +extrn __blue_glCore_glVertexAttribI3uivEXT: qword +bluegl_glVertexAttribI3uivEXT proc + mov r11, __blue_glCore_glVertexAttribI3uivEXT jmp r11 -bluegl_glGetActiveAtomicCounterBufferiv endp +bluegl_glVertexAttribI3uivEXT endp -extrn __blue_glCore_glEndConditionalRenderNVX: qword -bluegl_glEndConditionalRenderNVX proc - mov r11, __blue_glCore_glEndConditionalRenderNVX +extrn __blue_glCore_glVertexAttribI4uivEXT: qword +bluegl_glVertexAttribI4uivEXT proc + mov r11, __blue_glCore_glVertexAttribI4uivEXT jmp r11 -bluegl_glEndConditionalRenderNVX endp +bluegl_glVertexAttribI4uivEXT endp -extrn __blue_glCore_glDrawRangeElementArrayATI: qword -bluegl_glDrawRangeElementArrayATI proc - mov r11, __blue_glCore_glDrawRangeElementArrayATI +extrn __blue_glCore_glVertexAttribI4bvEXT: qword +bluegl_glVertexAttribI4bvEXT proc + mov r11, __blue_glCore_glVertexAttribI4bvEXT jmp r11 -bluegl_glDrawRangeElementArrayATI endp +bluegl_glVertexAttribI4bvEXT endp -extrn __blue_glCore_glCopyMultiTexImage1DEXT: qword -bluegl_glCopyMultiTexImage1DEXT proc - mov r11, __blue_glCore_glCopyMultiTexImage1DEXT +extrn __blue_glCore_glVertexAttribI4svEXT: qword +bluegl_glVertexAttribI4svEXT proc + mov r11, __blue_glCore_glVertexAttribI4svEXT jmp r11 -bluegl_glCopyMultiTexImage1DEXT endp +bluegl_glVertexAttribI4svEXT endp -extrn __blue_glCore_glReplacementCodeusSUN: qword -bluegl_glReplacementCodeusSUN proc - mov r11, __blue_glCore_glReplacementCodeusSUN +extrn __blue_glCore_glVertexAttribI4ubvEXT: qword +bluegl_glVertexAttribI4ubvEXT proc + mov r11, __blue_glCore_glVertexAttribI4ubvEXT jmp r11 -bluegl_glReplacementCodeusSUN endp +bluegl_glVertexAttribI4ubvEXT endp -extrn __blue_glCore_glMultiTexGendEXT: qword -bluegl_glMultiTexGendEXT proc - mov r11, __blue_glCore_glMultiTexGendEXT +extrn __blue_glCore_glVertexAttribI4usvEXT: qword +bluegl_glVertexAttribI4usvEXT proc + mov r11, __blue_glCore_glVertexAttribI4usvEXT jmp r11 -bluegl_glMultiTexGendEXT endp +bluegl_glVertexAttribI4usvEXT endp -extrn __blue_glCore_glMatrixRotatefEXT: qword -bluegl_glMatrixRotatefEXT proc - mov r11, __blue_glCore_glMatrixRotatefEXT +extrn __blue_glCore_glVertexAttribIPointerEXT: qword +bluegl_glVertexAttribIPointerEXT proc + mov r11, __blue_glCore_glVertexAttribIPointerEXT jmp r11 -bluegl_glMatrixRotatefEXT endp +bluegl_glVertexAttribIPointerEXT endp -extrn __blue_glCore_glBindBufferOffsetNV: qword -bluegl_glBindBufferOffsetNV proc - mov r11, __blue_glCore_glBindBufferOffsetNV +extrn __blue_glCore_glGetVertexAttribIivEXT: qword +bluegl_glGetVertexAttribIivEXT proc + mov r11, __blue_glCore_glGetVertexAttribIivEXT jmp r11 -bluegl_glBindBufferOffsetNV endp +bluegl_glGetVertexAttribIivEXT endp -extrn __blue_glCore_glVertexAttribI1ui: qword -bluegl_glVertexAttribI1ui proc - mov r11, __blue_glCore_glVertexAttribI1ui +extrn __blue_glCore_glGetVertexAttribIuivEXT: qword +bluegl_glGetVertexAttribIuivEXT proc + mov r11, __blue_glCore_glGetVertexAttribIuivEXT jmp r11 -bluegl_glVertexAttribI1ui endp +bluegl_glGetVertexAttribIuivEXT endp -extrn __blue_glCore_glMakeImageHandleNonResidentARB: qword -bluegl_glMakeImageHandleNonResidentARB proc - mov r11, __blue_glCore_glMakeImageHandleNonResidentARB +extrn __blue_glCore_glBeginVideoCaptureNV: qword +bluegl_glBeginVideoCaptureNV proc + mov r11, __blue_glCore_glBeginVideoCaptureNV jmp r11 -bluegl_glMakeImageHandleNonResidentARB endp +bluegl_glBeginVideoCaptureNV endp -extrn __blue_glCore_glTextureParameteriEXT: qword -bluegl_glTextureParameteriEXT proc - mov r11, __blue_glCore_glTextureParameteriEXT +extrn __blue_glCore_glBindVideoCaptureStreamBufferNV: qword +bluegl_glBindVideoCaptureStreamBufferNV proc + mov r11, __blue_glCore_glBindVideoCaptureStreamBufferNV jmp r11 -bluegl_glTextureParameteriEXT endp +bluegl_glBindVideoCaptureStreamBufferNV endp -extrn __blue_glCore_glDebugMessageInsertARB: qword -bluegl_glDebugMessageInsertARB proc - mov r11, __blue_glCore_glDebugMessageInsertARB +extrn __blue_glCore_glBindVideoCaptureStreamTextureNV: qword +bluegl_glBindVideoCaptureStreamTextureNV proc + mov r11, __blue_glCore_glBindVideoCaptureStreamTextureNV jmp r11 -bluegl_glDebugMessageInsertARB endp +bluegl_glBindVideoCaptureStreamTextureNV endp -extrn __blue_glCore_glVertexAttrib4NubvARB: qword -bluegl_glVertexAttrib4NubvARB proc - mov r11, __blue_glCore_glVertexAttrib4NubvARB +extrn __blue_glCore_glEndVideoCaptureNV: qword +bluegl_glEndVideoCaptureNV proc + mov r11, __blue_glCore_glEndVideoCaptureNV jmp r11 -bluegl_glVertexAttrib4NubvARB endp +bluegl_glEndVideoCaptureNV endp -extrn __blue_glCore_glDeleteTexturesEXT: qword -bluegl_glDeleteTexturesEXT proc - mov r11, __blue_glCore_glDeleteTexturesEXT +extrn __blue_glCore_glGetVideoCaptureivNV: qword +bluegl_glGetVideoCaptureivNV proc + mov r11, __blue_glCore_glGetVideoCaptureivNV jmp r11 -bluegl_glDeleteTexturesEXT endp +bluegl_glGetVideoCaptureivNV endp -extrn __blue_glCore_glWindowPos3svARB: qword -bluegl_glWindowPos3svARB proc - mov r11, __blue_glCore_glWindowPos3svARB +extrn __blue_glCore_glGetVideoCaptureStreamivNV: qword +bluegl_glGetVideoCaptureStreamivNV proc + mov r11, __blue_glCore_glGetVideoCaptureStreamivNV jmp r11 -bluegl_glWindowPos3svARB endp +bluegl_glGetVideoCaptureStreamivNV endp -extrn __blue_glCore_glTexParameterxOES: qword -bluegl_glTexParameterxOES proc - mov r11, __blue_glCore_glTexParameterxOES +extrn __blue_glCore_glGetVideoCaptureStreamfvNV: qword +bluegl_glGetVideoCaptureStreamfvNV proc + mov r11, __blue_glCore_glGetVideoCaptureStreamfvNV jmp r11 -bluegl_glTexParameterxOES endp +bluegl_glGetVideoCaptureStreamfvNV endp -extrn __blue_glCore_glVertexStream3fATI: qword -bluegl_glVertexStream3fATI proc - mov r11, __blue_glCore_glVertexStream3fATI +extrn __blue_glCore_glGetVideoCaptureStreamdvNV: qword +bluegl_glGetVideoCaptureStreamdvNV proc + mov r11, __blue_glCore_glGetVideoCaptureStreamdvNV jmp r11 -bluegl_glVertexStream3fATI endp +bluegl_glGetVideoCaptureStreamdvNV endp -extrn __blue_glCore_glNormal3xOES: qword -bluegl_glNormal3xOES proc - mov r11, __blue_glCore_glNormal3xOES +extrn __blue_glCore_glVideoCaptureNV: qword +bluegl_glVideoCaptureNV proc + mov r11, __blue_glCore_glVideoCaptureNV jmp r11 -bluegl_glNormal3xOES endp +bluegl_glVideoCaptureNV endp -extrn __blue_glCore_glMultiTexCoord4bvOES: qword -bluegl_glMultiTexCoord4bvOES proc - mov r11, __blue_glCore_glMultiTexCoord4bvOES +extrn __blue_glCore_glVideoCaptureStreamParameterivNV: qword +bluegl_glVideoCaptureStreamParameterivNV proc + mov r11, __blue_glCore_glVideoCaptureStreamParameterivNV jmp r11 -bluegl_glMultiTexCoord4bvOES endp +bluegl_glVideoCaptureStreamParameterivNV endp -extrn __blue_glCore_glVertexAttribL1dv: qword -bluegl_glVertexAttribL1dv proc - mov r11, __blue_glCore_glVertexAttribL1dv +extrn __blue_glCore_glVideoCaptureStreamParameterfvNV: qword +bluegl_glVideoCaptureStreamParameterfvNV proc + mov r11, __blue_glCore_glVideoCaptureStreamParameterfvNV jmp r11 -bluegl_glVertexAttribL1dv endp +bluegl_glVideoCaptureStreamParameterfvNV endp -extrn __blue_glCore_glGetImageTransformParameterivHP: qword -bluegl_glGetImageTransformParameterivHP proc - mov r11, __blue_glCore_glGetImageTransformParameterivHP +extrn __blue_glCore_glVideoCaptureStreamParameterdvNV: qword +bluegl_glVideoCaptureStreamParameterdvNV proc + mov r11, __blue_glCore_glVideoCaptureStreamParameterdvNV jmp r11 -bluegl_glGetImageTransformParameterivHP endp +bluegl_glVideoCaptureStreamParameterdvNV endp -extrn __blue_glCore_glGetSubroutineUniformLocation: qword -bluegl_glGetSubroutineUniformLocation proc - mov r11, __blue_glCore_glGetSubroutineUniformLocation +extrn __blue_glCore_glFramebufferTextureMultiviewOVR: qword +bluegl_glFramebufferTextureMultiviewOVR proc + mov r11, __blue_glCore_glFramebufferTextureMultiviewOVR jmp r11 -bluegl_glGetSubroutineUniformLocation endp +bluegl_glFramebufferTextureMultiviewOVR endp -extrn __blue_glCore_glProgramEnvParameter4fvARB: qword -bluegl_glProgramEnvParameter4fvARB proc - mov r11, __blue_glCore_glProgramEnvParameter4fvARB +extrn __blue_glCore_glHintPGI: qword +bluegl_glHintPGI proc + mov r11, __blue_glCore_glHintPGI jmp r11 -bluegl_glProgramEnvParameter4fvARB endp +bluegl_glHintPGI endp -extrn __blue_glCore_glGetTextureImageEXT: qword -bluegl_glGetTextureImageEXT proc - mov r11, __blue_glCore_glGetTextureImageEXT +extrn __blue_glCore_glDetailTexFuncSGIS: qword +bluegl_glDetailTexFuncSGIS proc + mov r11, __blue_glCore_glDetailTexFuncSGIS jmp r11 -bluegl_glGetTextureImageEXT endp +bluegl_glDetailTexFuncSGIS endp -extrn __blue_glCore_glBindTexGenParameterEXT: qword -bluegl_glBindTexGenParameterEXT proc - mov r11, __blue_glCore_glBindTexGenParameterEXT +extrn __blue_glCore_glGetDetailTexFuncSGIS: qword +bluegl_glGetDetailTexFuncSGIS proc + mov r11, __blue_glCore_glGetDetailTexFuncSGIS jmp r11 -bluegl_glBindTexGenParameterEXT endp +bluegl_glGetDetailTexFuncSGIS endp -extrn __blue_glCore_glMinSampleShadingARB: qword -bluegl_glMinSampleShadingARB proc - mov r11, __blue_glCore_glMinSampleShadingARB +extrn __blue_glCore_glFogFuncSGIS: qword +bluegl_glFogFuncSGIS proc + mov r11, __blue_glCore_glFogFuncSGIS jmp r11 -bluegl_glMinSampleShadingARB endp +bluegl_glFogFuncSGIS endp -extrn __blue_glCore_glGetAttachedObjectsARB: qword -bluegl_glGetAttachedObjectsARB proc - mov r11, __blue_glCore_glGetAttachedObjectsARB +extrn __blue_glCore_glGetFogFuncSGIS: qword +bluegl_glGetFogFuncSGIS proc + mov r11, __blue_glCore_glGetFogFuncSGIS jmp r11 -bluegl_glGetAttachedObjectsARB endp +bluegl_glGetFogFuncSGIS endp -extrn __blue_glCore_glGetVertexArrayiv: qword -bluegl_glGetVertexArrayiv proc - mov r11, __blue_glCore_glGetVertexArrayiv +extrn __blue_glCore_glSampleMaskSGIS: qword +bluegl_glSampleMaskSGIS proc + mov r11, __blue_glCore_glSampleMaskSGIS jmp r11 -bluegl_glGetVertexArrayiv endp +bluegl_glSampleMaskSGIS endp -extrn __blue_glCore_glWeightfvARB: qword -bluegl_glWeightfvARB proc - mov r11, __blue_glCore_glWeightfvARB +extrn __blue_glCore_glSamplePatternSGIS: qword +bluegl_glSamplePatternSGIS proc + mov r11, __blue_glCore_glSamplePatternSGIS jmp r11 -bluegl_glWeightfvARB endp +bluegl_glSamplePatternSGIS endp -extrn __blue_glCore_glGetPathCommandsNV: qword -bluegl_glGetPathCommandsNV proc - mov r11, __blue_glCore_glGetPathCommandsNV +extrn __blue_glCore_glPixelTexGenParameteriSGIS: qword +bluegl_glPixelTexGenParameteriSGIS proc + mov r11, __blue_glCore_glPixelTexGenParameteriSGIS jmp r11 -bluegl_glGetPathCommandsNV endp +bluegl_glPixelTexGenParameteriSGIS endp -extrn __blue_glCore_glGetColorTableParameterivSGI: qword -bluegl_glGetColorTableParameterivSGI proc - mov r11, __blue_glCore_glGetColorTableParameterivSGI +extrn __blue_glCore_glPixelTexGenParameterivSGIS: qword +bluegl_glPixelTexGenParameterivSGIS proc + mov r11, __blue_glCore_glPixelTexGenParameterivSGIS jmp r11 -bluegl_glGetColorTableParameterivSGI endp +bluegl_glPixelTexGenParameterivSGIS endp -extrn __blue_glCore_glGetNamedProgramivEXT: qword -bluegl_glGetNamedProgramivEXT proc - mov r11, __blue_glCore_glGetNamedProgramivEXT +extrn __blue_glCore_glPixelTexGenParameterfSGIS: qword +bluegl_glPixelTexGenParameterfSGIS proc + mov r11, __blue_glCore_glPixelTexGenParameterfSGIS jmp r11 -bluegl_glGetNamedProgramivEXT endp +bluegl_glPixelTexGenParameterfSGIS endp -extrn __blue_glCore_glSecondaryColor3ubvEXT: qword -bluegl_glSecondaryColor3ubvEXT proc - mov r11, __blue_glCore_glSecondaryColor3ubvEXT +extrn __blue_glCore_glPixelTexGenParameterfvSGIS: qword +bluegl_glPixelTexGenParameterfvSGIS proc + mov r11, __blue_glCore_glPixelTexGenParameterfvSGIS jmp r11 -bluegl_glSecondaryColor3ubvEXT endp +bluegl_glPixelTexGenParameterfvSGIS endp -extrn __blue_glCore_glVDPAURegisterVideoSurfaceNV: qword -bluegl_glVDPAURegisterVideoSurfaceNV proc - mov r11, __blue_glCore_glVDPAURegisterVideoSurfaceNV +extrn __blue_glCore_glGetPixelTexGenParameterivSGIS: qword +bluegl_glGetPixelTexGenParameterivSGIS proc + mov r11, __blue_glCore_glGetPixelTexGenParameterivSGIS jmp r11 -bluegl_glVDPAURegisterVideoSurfaceNV endp +bluegl_glGetPixelTexGenParameterivSGIS endp -extrn __blue_glCore_glTexParameterf: qword -bluegl_glTexParameterf proc - mov r11, __blue_glCore_glTexParameterf +extrn __blue_glCore_glGetPixelTexGenParameterfvSGIS: qword +bluegl_glGetPixelTexGenParameterfvSGIS proc + mov r11, __blue_glCore_glGetPixelTexGenParameterfvSGIS jmp r11 -bluegl_glTexParameterf endp +bluegl_glGetPixelTexGenParameterfvSGIS endp -extrn __blue_glCore_glVertexAttribL4i64NV: qword -bluegl_glVertexAttribL4i64NV proc - mov r11, __blue_glCore_glVertexAttribL4i64NV +extrn __blue_glCore_glPointParameterfSGIS: qword +bluegl_glPointParameterfSGIS proc + mov r11, __blue_glCore_glPointParameterfSGIS jmp r11 -bluegl_glVertexAttribL4i64NV endp +bluegl_glPointParameterfSGIS endp -extrn __blue_glCore_glPollAsyncSGIX: qword -bluegl_glPollAsyncSGIX proc - mov r11, __blue_glCore_glPollAsyncSGIX +extrn __blue_glCore_glPointParameterfvSGIS: qword +bluegl_glPointParameterfvSGIS proc + mov r11, __blue_glCore_glPointParameterfvSGIS jmp r11 -bluegl_glPollAsyncSGIX endp +bluegl_glPointParameterfvSGIS endp -extrn __blue_glCore_glBufferParameteriAPPLE: qword -bluegl_glBufferParameteriAPPLE proc - mov r11, __blue_glCore_glBufferParameteriAPPLE +extrn __blue_glCore_glSharpenTexFuncSGIS: qword +bluegl_glSharpenTexFuncSGIS proc + mov r11, __blue_glCore_glSharpenTexFuncSGIS jmp r11 -bluegl_glBufferParameteriAPPLE endp +bluegl_glSharpenTexFuncSGIS endp -extrn __blue_glCore_glApplyTextureEXT: qword -bluegl_glApplyTextureEXT proc - mov r11, __blue_glCore_glApplyTextureEXT +extrn __blue_glCore_glGetSharpenTexFuncSGIS: qword +bluegl_glGetSharpenTexFuncSGIS proc + mov r11, __blue_glCore_glGetSharpenTexFuncSGIS jmp r11 -bluegl_glApplyTextureEXT endp +bluegl_glGetSharpenTexFuncSGIS endp -extrn __blue_glCore_glGenVertexShadersEXT: qword -bluegl_glGenVertexShadersEXT proc - mov r11, __blue_glCore_glGenVertexShadersEXT +extrn __blue_glCore_glTexImage4DSGIS: qword +bluegl_glTexImage4DSGIS proc + mov r11, __blue_glCore_glTexImage4DSGIS jmp r11 -bluegl_glGenVertexShadersEXT endp +bluegl_glTexImage4DSGIS endp -extrn __blue_glCore_glTexImage2DMultisampleCoverageNV: qword -bluegl_glTexImage2DMultisampleCoverageNV proc - mov r11, __blue_glCore_glTexImage2DMultisampleCoverageNV +extrn __blue_glCore_glTexSubImage4DSGIS: qword +bluegl_glTexSubImage4DSGIS proc + mov r11, __blue_glCore_glTexSubImage4DSGIS jmp r11 -bluegl_glTexImage2DMultisampleCoverageNV endp +bluegl_glTexSubImage4DSGIS endp -extrn __blue_glCore_glObjectUnpurgeableAPPLE: qword -bluegl_glObjectUnpurgeableAPPLE proc - mov r11, __blue_glCore_glObjectUnpurgeableAPPLE +extrn __blue_glCore_glTextureColorMaskSGIS: qword +bluegl_glTextureColorMaskSGIS proc + mov r11, __blue_glCore_glTextureColorMaskSGIS jmp r11 -bluegl_glObjectUnpurgeableAPPLE endp +bluegl_glTextureColorMaskSGIS endp -extrn __blue_glCore_glCopyNamedBufferSubData: qword -bluegl_glCopyNamedBufferSubData proc - mov r11, __blue_glCore_glCopyNamedBufferSubData +extrn __blue_glCore_glGetTexFilterFuncSGIS: qword +bluegl_glGetTexFilterFuncSGIS proc + mov r11, __blue_glCore_glGetTexFilterFuncSGIS jmp r11 -bluegl_glCopyNamedBufferSubData endp +bluegl_glGetTexFilterFuncSGIS endp -extrn __blue_glCore_glVertexAttrib4dv: qword -bluegl_glVertexAttrib4dv proc - mov r11, __blue_glCore_glVertexAttrib4dv +extrn __blue_glCore_glTexFilterFuncSGIS: qword +bluegl_glTexFilterFuncSGIS proc + mov r11, __blue_glCore_glTexFilterFuncSGIS jmp r11 -bluegl_glVertexAttrib4dv endp +bluegl_glTexFilterFuncSGIS endp -extrn __blue_glCore_glClearTexSubImage: qword -bluegl_glClearTexSubImage proc - mov r11, __blue_glCore_glClearTexSubImage +extrn __blue_glCore_glAsyncMarkerSGIX: qword +bluegl_glAsyncMarkerSGIX proc + mov r11, __blue_glCore_glAsyncMarkerSGIX jmp r11 -bluegl_glClearTexSubImage endp +bluegl_glAsyncMarkerSGIX endp -extrn __blue_glCore_glPointAlongPathNV: qword -bluegl_glPointAlongPathNV proc - mov r11, __blue_glCore_glPointAlongPathNV +extrn __blue_glCore_glFinishAsyncSGIX: qword +bluegl_glFinishAsyncSGIX proc + mov r11, __blue_glCore_glFinishAsyncSGIX jmp r11 -bluegl_glPointAlongPathNV endp +bluegl_glFinishAsyncSGIX endp -extrn __blue_glCore_glFramebufferTexture1DEXT: qword -bluegl_glFramebufferTexture1DEXT proc - mov r11, __blue_glCore_glFramebufferTexture1DEXT +extrn __blue_glCore_glPollAsyncSGIX: qword +bluegl_glPollAsyncSGIX proc + mov r11, __blue_glCore_glPollAsyncSGIX jmp r11 -bluegl_glFramebufferTexture1DEXT endp +bluegl_glPollAsyncSGIX endp -extrn __blue_glCore_glMatrixLoad3x2fNV: qword -bluegl_glMatrixLoad3x2fNV proc - mov r11, __blue_glCore_glMatrixLoad3x2fNV +extrn __blue_glCore_glGenAsyncMarkersSGIX: qword +bluegl_glGenAsyncMarkersSGIX proc + mov r11, __blue_glCore_glGenAsyncMarkersSGIX jmp r11 -bluegl_glMatrixLoad3x2fNV endp +bluegl_glGenAsyncMarkersSGIX endp -extrn __blue_glCore_glGetUniformui64vARB: qword -bluegl_glGetUniformui64vARB proc - mov r11, __blue_glCore_glGetUniformui64vARB +extrn __blue_glCore_glDeleteAsyncMarkersSGIX: qword +bluegl_glDeleteAsyncMarkersSGIX proc + mov r11, __blue_glCore_glDeleteAsyncMarkersSGIX jmp r11 -bluegl_glGetUniformui64vARB endp +bluegl_glDeleteAsyncMarkersSGIX endp -extrn __blue_glCore_glTextureStorage3DMultisampleEXT: qword -bluegl_glTextureStorage3DMultisampleEXT proc - mov r11, __blue_glCore_glTextureStorage3DMultisampleEXT +extrn __blue_glCore_glIsAsyncMarkerSGIX: qword +bluegl_glIsAsyncMarkerSGIX proc + mov r11, __blue_glCore_glIsAsyncMarkerSGIX jmp r11 -bluegl_glTextureStorage3DMultisampleEXT endp +bluegl_glIsAsyncMarkerSGIX endp -extrn __blue_glCore_glTexCoord1bvOES: qword -bluegl_glTexCoord1bvOES proc - mov r11, __blue_glCore_glTexCoord1bvOES +extrn __blue_glCore_glFlushRasterSGIX: qword +bluegl_glFlushRasterSGIX proc + mov r11, __blue_glCore_glFlushRasterSGIX jmp r11 -bluegl_glTexCoord1bvOES endp +bluegl_glFlushRasterSGIX endp -extrn __blue_glCore_glGetBufferParameteri64v: qword -bluegl_glGetBufferParameteri64v proc - mov r11, __blue_glCore_glGetBufferParameteri64v +extrn __blue_glCore_glFragmentColorMaterialSGIX: qword +bluegl_glFragmentColorMaterialSGIX proc + mov r11, __blue_glCore_glFragmentColorMaterialSGIX jmp r11 -bluegl_glGetBufferParameteri64v endp +bluegl_glFragmentColorMaterialSGIX endp -extrn __blue_glCore_glQueryMatrixxOES: qword -bluegl_glQueryMatrixxOES proc - mov r11, __blue_glCore_glQueryMatrixxOES +extrn __blue_glCore_glFragmentLightfSGIX: qword +bluegl_glFragmentLightfSGIX proc + mov r11, __blue_glCore_glFragmentLightfSGIX jmp r11 -bluegl_glQueryMatrixxOES endp +bluegl_glFragmentLightfSGIX endp -extrn __blue_glCore_glVertexAttrib1fv: qword -bluegl_glVertexAttrib1fv proc - mov r11, __blue_glCore_glVertexAttrib1fv +extrn __blue_glCore_glFragmentLightfvSGIX: qword +bluegl_glFragmentLightfvSGIX proc + mov r11, __blue_glCore_glFragmentLightfvSGIX jmp r11 -bluegl_glVertexAttrib1fv endp +bluegl_glFragmentLightfvSGIX endp -extrn __blue_glCore_glVertexAttribP3ui: qword -bluegl_glVertexAttribP3ui proc - mov r11, __blue_glCore_glVertexAttribP3ui +extrn __blue_glCore_glFragmentLightiSGIX: qword +bluegl_glFragmentLightiSGIX proc + mov r11, __blue_glCore_glFragmentLightiSGIX jmp r11 -bluegl_glVertexAttribP3ui endp +bluegl_glFragmentLightiSGIX endp -extrn __blue_glCore_glVDPAUInitNV: qword -bluegl_glVDPAUInitNV proc - mov r11, __blue_glCore_glVDPAUInitNV +extrn __blue_glCore_glFragmentLightivSGIX: qword +bluegl_glFragmentLightivSGIX proc + mov r11, __blue_glCore_glFragmentLightivSGIX jmp r11 -bluegl_glVDPAUInitNV endp +bluegl_glFragmentLightivSGIX endp -extrn __blue_glCore_glPathStencilDepthOffsetNV: qword -bluegl_glPathStencilDepthOffsetNV proc - mov r11, __blue_glCore_glPathStencilDepthOffsetNV +extrn __blue_glCore_glFragmentLightModelfSGIX: qword +bluegl_glFragmentLightModelfSGIX proc + mov r11, __blue_glCore_glFragmentLightModelfSGIX jmp r11 -bluegl_glPathStencilDepthOffsetNV endp +bluegl_glFragmentLightModelfSGIX endp -extrn __blue_glCore_glLightxOES: qword -bluegl_glLightxOES proc - mov r11, __blue_glCore_glLightxOES +extrn __blue_glCore_glFragmentLightModelfvSGIX: qword +bluegl_glFragmentLightModelfvSGIX proc + mov r11, __blue_glCore_glFragmentLightModelfvSGIX jmp r11 -bluegl_glLightxOES endp +bluegl_glFragmentLightModelfvSGIX endp -extrn __blue_glCore_glVertexAttribI3i: qword -bluegl_glVertexAttribI3i proc - mov r11, __blue_glCore_glVertexAttribI3i +extrn __blue_glCore_glFragmentLightModeliSGIX: qword +bluegl_glFragmentLightModeliSGIX proc + mov r11, __blue_glCore_glFragmentLightModeliSGIX jmp r11 -bluegl_glVertexAttribI3i endp +bluegl_glFragmentLightModeliSGIX endp -extrn __blue_glCore_glProgramUniformHandleui64vARB: qword -bluegl_glProgramUniformHandleui64vARB proc - mov r11, __blue_glCore_glProgramUniformHandleui64vARB +extrn __blue_glCore_glFragmentLightModelivSGIX: qword +bluegl_glFragmentLightModelivSGIX proc + mov r11, __blue_glCore_glFragmentLightModelivSGIX jmp r11 -bluegl_glProgramUniformHandleui64vARB endp +bluegl_glFragmentLightModelivSGIX endp -extrn __blue_glCore_glTextureParameteriv: qword -bluegl_glTextureParameteriv proc - mov r11, __blue_glCore_glTextureParameteriv +extrn __blue_glCore_glFragmentMaterialfSGIX: qword +bluegl_glFragmentMaterialfSGIX proc + mov r11, __blue_glCore_glFragmentMaterialfSGIX jmp r11 -bluegl_glTextureParameteriv endp +bluegl_glFragmentMaterialfSGIX endp -extrn __blue_glCore_glProgramUniformHandleui64NV: qword -bluegl_glProgramUniformHandleui64NV proc - mov r11, __blue_glCore_glProgramUniformHandleui64NV +extrn __blue_glCore_glFragmentMaterialfvSGIX: qword +bluegl_glFragmentMaterialfvSGIX proc + mov r11, __blue_glCore_glFragmentMaterialfvSGIX jmp r11 -bluegl_glProgramUniformHandleui64NV endp +bluegl_glFragmentMaterialfvSGIX endp -extrn __blue_glCore_glGetVertexArrayIntegervEXT: qword -bluegl_glGetVertexArrayIntegervEXT proc - mov r11, __blue_glCore_glGetVertexArrayIntegervEXT +extrn __blue_glCore_glFragmentMaterialiSGIX: qword +bluegl_glFragmentMaterialiSGIX proc + mov r11, __blue_glCore_glFragmentMaterialiSGIX jmp r11 -bluegl_glGetVertexArrayIntegervEXT endp +bluegl_glFragmentMaterialiSGIX endp -extrn __blue_glCore_glDrawElements: qword -bluegl_glDrawElements proc - mov r11, __blue_glCore_glDrawElements +extrn __blue_glCore_glFragmentMaterialivSGIX: qword +bluegl_glFragmentMaterialivSGIX proc + mov r11, __blue_glCore_glFragmentMaterialivSGIX jmp r11 -bluegl_glDrawElements endp +bluegl_glFragmentMaterialivSGIX endp -extrn __blue_glCore_glProgramUniform3i64ARB: qword -bluegl_glProgramUniform3i64ARB proc - mov r11, __blue_glCore_glProgramUniform3i64ARB +extrn __blue_glCore_glGetFragmentLightfvSGIX: qword +bluegl_glGetFragmentLightfvSGIX proc + mov r11, __blue_glCore_glGetFragmentLightfvSGIX jmp r11 -bluegl_glProgramUniform3i64ARB endp +bluegl_glGetFragmentLightfvSGIX endp -extrn __blue_glCore_glDeleteAsyncMarkersSGIX: qword -bluegl_glDeleteAsyncMarkersSGIX proc - mov r11, __blue_glCore_glDeleteAsyncMarkersSGIX +extrn __blue_glCore_glGetFragmentLightivSGIX: qword +bluegl_glGetFragmentLightivSGIX proc + mov r11, __blue_glCore_glGetFragmentLightivSGIX jmp r11 -bluegl_glDeleteAsyncMarkersSGIX endp +bluegl_glGetFragmentLightivSGIX endp -extrn __blue_glCore_glGetLightxOES: qword -bluegl_glGetLightxOES proc - mov r11, __blue_glCore_glGetLightxOES +extrn __blue_glCore_glGetFragmentMaterialfvSGIX: qword +bluegl_glGetFragmentMaterialfvSGIX proc + mov r11, __blue_glCore_glGetFragmentMaterialfvSGIX jmp r11 -bluegl_glGetLightxOES endp +bluegl_glGetFragmentMaterialfvSGIX endp -extrn __blue_glCore_glCreateCommandListsNV: qword -bluegl_glCreateCommandListsNV proc - mov r11, __blue_glCore_glCreateCommandListsNV +extrn __blue_glCore_glGetFragmentMaterialivSGIX: qword +bluegl_glGetFragmentMaterialivSGIX proc + mov r11, __blue_glCore_glGetFragmentMaterialivSGIX jmp r11 -bluegl_glCreateCommandListsNV endp +bluegl_glGetFragmentMaterialivSGIX endp -extrn __blue_glCore_glClear: qword -bluegl_glClear proc - mov r11, __blue_glCore_glClear +extrn __blue_glCore_glLightEnviSGIX: qword +bluegl_glLightEnviSGIX proc + mov r11, __blue_glCore_glLightEnviSGIX jmp r11 -bluegl_glClear endp +bluegl_glLightEnviSGIX endp -extrn __blue_glCore_glUniformui64vNV: qword -bluegl_glUniformui64vNV proc - mov r11, __blue_glCore_glUniformui64vNV +extrn __blue_glCore_glFrameZoomSGIX: qword +bluegl_glFrameZoomSGIX proc + mov r11, __blue_glCore_glFrameZoomSGIX jmp r11 -bluegl_glUniformui64vNV endp +bluegl_glFrameZoomSGIX endp -extrn __blue_glCore_glVertexAttrib2dvNV: qword -bluegl_glVertexAttrib2dvNV proc - mov r11, __blue_glCore_glVertexAttrib2dvNV +extrn __blue_glCore_glIglooInterfaceSGIX: qword +bluegl_glIglooInterfaceSGIX proc + mov r11, __blue_glCore_glIglooInterfaceSGIX jmp r11 -bluegl_glVertexAttrib2dvNV endp +bluegl_glIglooInterfaceSGIX endp -extrn __blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN: qword -bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN proc - mov r11, __blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN +extrn __blue_glCore_glGetInstrumentsSGIX: qword +bluegl_glGetInstrumentsSGIX proc + mov r11, __blue_glCore_glGetInstrumentsSGIX jmp r11 -bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN endp +bluegl_glGetInstrumentsSGIX endp -extrn __blue_glCore_glWindowPos3sARB: qword -bluegl_glWindowPos3sARB proc - mov r11, __blue_glCore_glWindowPos3sARB +extrn __blue_glCore_glInstrumentsBufferSGIX: qword +bluegl_glInstrumentsBufferSGIX proc + mov r11, __blue_glCore_glInstrumentsBufferSGIX jmp r11 -bluegl_glWindowPos3sARB endp +bluegl_glInstrumentsBufferSGIX endp -extrn __blue_glCore_glDrawTextureNV: qword -bluegl_glDrawTextureNV proc - mov r11, __blue_glCore_glDrawTextureNV +extrn __blue_glCore_glPollInstrumentsSGIX: qword +bluegl_glPollInstrumentsSGIX proc + mov r11, __blue_glCore_glPollInstrumentsSGIX jmp r11 -bluegl_glDrawTextureNV endp +bluegl_glPollInstrumentsSGIX endp -extrn __blue_glCore_glIsSync: qword -bluegl_glIsSync proc - mov r11, __blue_glCore_glIsSync +extrn __blue_glCore_glReadInstrumentsSGIX: qword +bluegl_glReadInstrumentsSGIX proc + mov r11, __blue_glCore_glReadInstrumentsSGIX jmp r11 -bluegl_glIsSync endp +bluegl_glReadInstrumentsSGIX endp -extrn __blue_glCore_glMatrixTranslatedEXT: qword -bluegl_glMatrixTranslatedEXT proc - mov r11, __blue_glCore_glMatrixTranslatedEXT +extrn __blue_glCore_glStartInstrumentsSGIX: qword +bluegl_glStartInstrumentsSGIX proc + mov r11, __blue_glCore_glStartInstrumentsSGIX jmp r11 -bluegl_glMatrixTranslatedEXT endp +bluegl_glStartInstrumentsSGIX endp -extrn __blue_glCore_glGetActiveVaryingNV: qword -bluegl_glGetActiveVaryingNV proc - mov r11, __blue_glCore_glGetActiveVaryingNV +extrn __blue_glCore_glStopInstrumentsSGIX: qword +bluegl_glStopInstrumentsSGIX proc + mov r11, __blue_glCore_glStopInstrumentsSGIX jmp r11 -bluegl_glGetActiveVaryingNV endp +bluegl_glStopInstrumentsSGIX endp -extrn __blue_glCore_glCreateQueries: qword -bluegl_glCreateQueries proc - mov r11, __blue_glCore_glCreateQueries +extrn __blue_glCore_glGetListParameterfvSGIX: qword +bluegl_glGetListParameterfvSGIX proc + mov r11, __blue_glCore_glGetListParameterfvSGIX jmp r11 -bluegl_glCreateQueries endp +bluegl_glGetListParameterfvSGIX endp -extrn __blue_glCore_glGetProgramEnvParameterdvARB: qword -bluegl_glGetProgramEnvParameterdvARB proc - mov r11, __blue_glCore_glGetProgramEnvParameterdvARB +extrn __blue_glCore_glGetListParameterivSGIX: qword +bluegl_glGetListParameterivSGIX proc + mov r11, __blue_glCore_glGetListParameterivSGIX jmp r11 -bluegl_glGetProgramEnvParameterdvARB endp +bluegl_glGetListParameterivSGIX endp -extrn __blue_glCore_glVertexArrayVertexAttribIOffsetEXT: qword -bluegl_glVertexArrayVertexAttribIOffsetEXT proc - mov r11, __blue_glCore_glVertexArrayVertexAttribIOffsetEXT +extrn __blue_glCore_glListParameterfSGIX: qword +bluegl_glListParameterfSGIX proc + mov r11, __blue_glCore_glListParameterfSGIX jmp r11 -bluegl_glVertexArrayVertexAttribIOffsetEXT endp +bluegl_glListParameterfSGIX endp -extrn __blue_glCore_glGetLocalConstantBooleanvEXT: qword -bluegl_glGetLocalConstantBooleanvEXT proc - mov r11, __blue_glCore_glGetLocalConstantBooleanvEXT +extrn __blue_glCore_glListParameterfvSGIX: qword +bluegl_glListParameterfvSGIX proc + mov r11, __blue_glCore_glListParameterfvSGIX jmp r11 -bluegl_glGetLocalConstantBooleanvEXT endp +bluegl_glListParameterfvSGIX endp -extrn __blue_glCore_glGetProgramParameterfvNV: qword -bluegl_glGetProgramParameterfvNV proc - mov r11, __blue_glCore_glGetProgramParameterfvNV +extrn __blue_glCore_glListParameteriSGIX: qword +bluegl_glListParameteriSGIX proc + mov r11, __blue_glCore_glListParameteriSGIX jmp r11 -bluegl_glGetProgramParameterfvNV endp +bluegl_glListParameteriSGIX endp -extrn __blue_glCore_glSpriteParameterivSGIX: qword -bluegl_glSpriteParameterivSGIX proc - mov r11, __blue_glCore_glSpriteParameterivSGIX +extrn __blue_glCore_glListParameterivSGIX: qword +bluegl_glListParameterivSGIX proc + mov r11, __blue_glCore_glListParameterivSGIX jmp r11 -bluegl_glSpriteParameterivSGIX endp +bluegl_glListParameterivSGIX endp -extrn __blue_glCore_glMultiTexCoord3xvOES: qword -bluegl_glMultiTexCoord3xvOES proc - mov r11, __blue_glCore_glMultiTexCoord3xvOES +extrn __blue_glCore_glPixelTexGenSGIX: qword +bluegl_glPixelTexGenSGIX proc + mov r11, __blue_glCore_glPixelTexGenSGIX jmp r11 -bluegl_glMultiTexCoord3xvOES endp +bluegl_glPixelTexGenSGIX endp -extrn __blue_glCore_glBindBufferRangeNV: qword -bluegl_glBindBufferRangeNV proc - mov r11, __blue_glCore_glBindBufferRangeNV +extrn __blue_glCore_glDeformationMap3dSGIX: qword +bluegl_glDeformationMap3dSGIX proc + mov r11, __blue_glCore_glDeformationMap3dSGIX jmp r11 -bluegl_glBindBufferRangeNV endp +bluegl_glDeformationMap3dSGIX endp -extrn __blue_glCore_glMultiTexCoord1sv: qword -bluegl_glMultiTexCoord1sv proc - mov r11, __blue_glCore_glMultiTexCoord1sv +extrn __blue_glCore_glDeformationMap3fSGIX: qword +bluegl_glDeformationMap3fSGIX proc + mov r11, __blue_glCore_glDeformationMap3fSGIX jmp r11 -bluegl_glMultiTexCoord1sv endp +bluegl_glDeformationMap3fSGIX endp -extrn __blue_glCore_glVertexStream1ivATI: qword -bluegl_glVertexStream1ivATI proc - mov r11, __blue_glCore_glVertexStream1ivATI +extrn __blue_glCore_glDeformSGIX: qword +bluegl_glDeformSGIX proc + mov r11, __blue_glCore_glDeformSGIX jmp r11 -bluegl_glVertexStream1ivATI endp +bluegl_glDeformSGIX endp -extrn __blue_glCore_glGetQueryObjectivARB: qword -bluegl_glGetQueryObjectivARB proc - mov r11, __blue_glCore_glGetQueryObjectivARB +extrn __blue_glCore_glLoadIdentityDeformationMapSGIX: qword +bluegl_glLoadIdentityDeformationMapSGIX proc + mov r11, __blue_glCore_glLoadIdentityDeformationMapSGIX jmp r11 -bluegl_glGetQueryObjectivARB endp +bluegl_glLoadIdentityDeformationMapSGIX endp -extrn __blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN: qword -bluegl_glReplacementCodeuiColor4ubVertex3fvSUN proc - mov r11, __blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN +extrn __blue_glCore_glReferencePlaneSGIX: qword +bluegl_glReferencePlaneSGIX proc + mov r11, __blue_glCore_glReferencePlaneSGIX jmp r11 -bluegl_glReplacementCodeuiColor4ubVertex3fvSUN endp +bluegl_glReferencePlaneSGIX endp -extrn __blue_glCore_glFlushMappedNamedBufferRange: qword -bluegl_glFlushMappedNamedBufferRange proc - mov r11, __blue_glCore_glFlushMappedNamedBufferRange +extrn __blue_glCore_glSpriteParameterfSGIX: qword +bluegl_glSpriteParameterfSGIX proc + mov r11, __blue_glCore_glSpriteParameterfSGIX jmp r11 -bluegl_glFlushMappedNamedBufferRange endp +bluegl_glSpriteParameterfSGIX endp -extrn __blue_glCore_glPointParameteriv: qword -bluegl_glPointParameteriv proc - mov r11, __blue_glCore_glPointParameteriv +extrn __blue_glCore_glSpriteParameterfvSGIX: qword +bluegl_glSpriteParameterfvSGIX proc + mov r11, __blue_glCore_glSpriteParameterfvSGIX jmp r11 -bluegl_glPointParameteriv endp +bluegl_glSpriteParameterfvSGIX endp -extrn __blue_glCore_glGetTextureLevelParameterivEXT: qword -bluegl_glGetTextureLevelParameterivEXT proc - mov r11, __blue_glCore_glGetTextureLevelParameterivEXT +extrn __blue_glCore_glSpriteParameteriSGIX: qword +bluegl_glSpriteParameteriSGIX proc + mov r11, __blue_glCore_glSpriteParameteriSGIX jmp r11 -bluegl_glGetTextureLevelParameterivEXT endp +bluegl_glSpriteParameteriSGIX endp -extrn __blue_glCore_glMultiTexEnviEXT: qword -bluegl_glMultiTexEnviEXT proc - mov r11, __blue_glCore_glMultiTexEnviEXT +extrn __blue_glCore_glSpriteParameterivSGIX: qword +bluegl_glSpriteParameterivSGIX proc + mov r11, __blue_glCore_glSpriteParameterivSGIX jmp r11 -bluegl_glMultiTexEnviEXT endp +bluegl_glSpriteParameterivSGIX endp -extrn __blue_glCore_glPolygonOffset: qword -bluegl_glPolygonOffset proc - mov r11, __blue_glCore_glPolygonOffset +extrn __blue_glCore_glTagSampleBufferSGIX: qword +bluegl_glTagSampleBufferSGIX proc + mov r11, __blue_glCore_glTagSampleBufferSGIX jmp r11 -bluegl_glPolygonOffset endp +bluegl_glTagSampleBufferSGIX endp -extrn __blue_glCore_glUniform1ui64ARB: qword -bluegl_glUniform1ui64ARB proc - mov r11, __blue_glCore_glUniform1ui64ARB +extrn __blue_glCore_glColorTableSGI: qword +bluegl_glColorTableSGI proc + mov r11, __blue_glCore_glColorTableSGI jmp r11 -bluegl_glUniform1ui64ARB endp +bluegl_glColorTableSGI endp -extrn __blue_glCore_glDeleteVertexArrays: qword -bluegl_glDeleteVertexArrays proc - mov r11, __blue_glCore_glDeleteVertexArrays +extrn __blue_glCore_glColorTableParameterfvSGI: qword +bluegl_glColorTableParameterfvSGI proc + mov r11, __blue_glCore_glColorTableParameterfvSGI jmp r11 -bluegl_glDeleteVertexArrays endp +bluegl_glColorTableParameterfvSGI endp -extrn __blue_glCore_glGetUniformi64vNV: qword -bluegl_glGetUniformi64vNV proc - mov r11, __blue_glCore_glGetUniformi64vNV +extrn __blue_glCore_glColorTableParameterivSGI: qword +bluegl_glColorTableParameterivSGI proc + mov r11, __blue_glCore_glColorTableParameterivSGI jmp r11 -bluegl_glGetUniformi64vNV endp +bluegl_glColorTableParameterivSGI endp -extrn __blue_glCore_glVertexAttribI3iv: qword -bluegl_glVertexAttribI3iv proc - mov r11, __blue_glCore_glVertexAttribI3iv +extrn __blue_glCore_glCopyColorTableSGI: qword +bluegl_glCopyColorTableSGI proc + mov r11, __blue_glCore_glCopyColorTableSGI jmp r11 -bluegl_glVertexAttribI3iv endp +bluegl_glCopyColorTableSGI endp -extrn __blue_glCore_glEndQueryIndexed: qword -bluegl_glEndQueryIndexed proc - mov r11, __blue_glCore_glEndQueryIndexed +extrn __blue_glCore_glGetColorTableSGI: qword +bluegl_glGetColorTableSGI proc + mov r11, __blue_glCore_glGetColorTableSGI jmp r11 -bluegl_glEndQueryIndexed endp +bluegl_glGetColorTableSGI endp -extrn __blue_glCore_glTextureSubImage1DEXT: qword -bluegl_glTextureSubImage1DEXT proc - mov r11, __blue_glCore_glTextureSubImage1DEXT +extrn __blue_glCore_glGetColorTableParameterfvSGI: qword +bluegl_glGetColorTableParameterfvSGI proc + mov r11, __blue_glCore_glGetColorTableParameterfvSGI jmp r11 -bluegl_glTextureSubImage1DEXT endp +bluegl_glGetColorTableParameterfvSGI endp -extrn __blue_glCore_glVertexAttribI4ubvEXT: qword -bluegl_glVertexAttribI4ubvEXT proc - mov r11, __blue_glCore_glVertexAttribI4ubvEXT +extrn __blue_glCore_glGetColorTableParameterivSGI: qword +bluegl_glGetColorTableParameterivSGI proc + mov r11, __blue_glCore_glGetColorTableParameterivSGI jmp r11 -bluegl_glVertexAttribI4ubvEXT endp +bluegl_glGetColorTableParameterivSGI endp -extrn __blue_glCore_glVertexAttribP4ui: qword -bluegl_glVertexAttribP4ui proc - mov r11, __blue_glCore_glVertexAttribP4ui +extrn __blue_glCore_glFinishTextureSUNX: qword +bluegl_glFinishTextureSUNX proc + mov r11, __blue_glCore_glFinishTextureSUNX jmp r11 -bluegl_glVertexAttribP4ui endp +bluegl_glFinishTextureSUNX endp -extrn __blue_glCore_glNamedProgramLocalParameter4dvEXT: qword -bluegl_glNamedProgramLocalParameter4dvEXT proc - mov r11, __blue_glCore_glNamedProgramLocalParameter4dvEXT +extrn __blue_glCore_glGlobalAlphaFactorbSUN: qword +bluegl_glGlobalAlphaFactorbSUN proc + mov r11, __blue_glCore_glGlobalAlphaFactorbSUN jmp r11 -bluegl_glNamedProgramLocalParameter4dvEXT endp +bluegl_glGlobalAlphaFactorbSUN endp -extrn __blue_glCore_glGetNamedProgramLocalParameterIuivEXT: qword -bluegl_glGetNamedProgramLocalParameterIuivEXT proc - mov r11, __blue_glCore_glGetNamedProgramLocalParameterIuivEXT +extrn __blue_glCore_glGlobalAlphaFactorsSUN: qword +bluegl_glGlobalAlphaFactorsSUN proc + mov r11, __blue_glCore_glGlobalAlphaFactorsSUN jmp r11 -bluegl_glGetNamedProgramLocalParameterIuivEXT endp +bluegl_glGlobalAlphaFactorsSUN endp -extrn __blue_glCore_glGetPixelTexGenParameterivSGIS: qword -bluegl_glGetPixelTexGenParameterivSGIS proc - mov r11, __blue_glCore_glGetPixelTexGenParameterivSGIS +extrn __blue_glCore_glGlobalAlphaFactoriSUN: qword +bluegl_glGlobalAlphaFactoriSUN proc + mov r11, __blue_glCore_glGlobalAlphaFactoriSUN jmp r11 -bluegl_glGetPixelTexGenParameterivSGIS endp +bluegl_glGlobalAlphaFactoriSUN endp -extrn __blue_glCore_glGetnMapdv: qword -bluegl_glGetnMapdv proc - mov r11, __blue_glCore_glGetnMapdv +extrn __blue_glCore_glGlobalAlphaFactorfSUN: qword +bluegl_glGlobalAlphaFactorfSUN proc + mov r11, __blue_glCore_glGlobalAlphaFactorfSUN jmp r11 -bluegl_glGetnMapdv endp +bluegl_glGlobalAlphaFactorfSUN endp -extrn __blue_glCore_glMultiTexCoord4svARB: qword -bluegl_glMultiTexCoord4svARB proc - mov r11, __blue_glCore_glMultiTexCoord4svARB +extrn __blue_glCore_glGlobalAlphaFactordSUN: qword +bluegl_glGlobalAlphaFactordSUN proc + mov r11, __blue_glCore_glGlobalAlphaFactordSUN jmp r11 -bluegl_glMultiTexCoord4svARB endp +bluegl_glGlobalAlphaFactordSUN endp -extrn __blue_glCore_glVertexStream2ivATI: qword -bluegl_glVertexStream2ivATI proc - mov r11, __blue_glCore_glVertexStream2ivATI +extrn __blue_glCore_glGlobalAlphaFactorubSUN: qword +bluegl_glGlobalAlphaFactorubSUN proc + mov r11, __blue_glCore_glGlobalAlphaFactorubSUN jmp r11 -bluegl_glVertexStream2ivATI endp +bluegl_glGlobalAlphaFactorubSUN endp -extrn __blue_glCore_glUniform4uivEXT: qword -bluegl_glUniform4uivEXT proc - mov r11, __blue_glCore_glUniform4uivEXT +extrn __blue_glCore_glGlobalAlphaFactorusSUN: qword +bluegl_glGlobalAlphaFactorusSUN proc + mov r11, __blue_glCore_glGlobalAlphaFactorusSUN jmp r11 -bluegl_glUniform4uivEXT endp +bluegl_glGlobalAlphaFactorusSUN endp -extrn __blue_glCore_glGetPointeri_vEXT: qword -bluegl_glGetPointeri_vEXT proc - mov r11, __blue_glCore_glGetPointeri_vEXT +extrn __blue_glCore_glGlobalAlphaFactoruiSUN: qword +bluegl_glGlobalAlphaFactoruiSUN proc + mov r11, __blue_glCore_glGlobalAlphaFactoruiSUN jmp r11 -bluegl_glGetPointeri_vEXT endp +bluegl_glGlobalAlphaFactoruiSUN endp -extrn __blue_glCore_glClearTexImage: qword -bluegl_glClearTexImage proc - mov r11, __blue_glCore_glClearTexImage +extrn __blue_glCore_glDrawMeshArraysSUN: qword +bluegl_glDrawMeshArraysSUN proc + mov r11, __blue_glCore_glDrawMeshArraysSUN jmp r11 -bluegl_glClearTexImage endp +bluegl_glDrawMeshArraysSUN endp -extrn __blue_glCore_glVertexAttribP1ui: qword -bluegl_glVertexAttribP1ui proc - mov r11, __blue_glCore_glVertexAttribP1ui +extrn __blue_glCore_glReplacementCodeuiSUN: qword +bluegl_glReplacementCodeuiSUN proc + mov r11, __blue_glCore_glReplacementCodeuiSUN jmp r11 -bluegl_glVertexAttribP1ui endp +bluegl_glReplacementCodeuiSUN endp -extrn __blue_glCore_glCompressedTexImage1DARB: qword -bluegl_glCompressedTexImage1DARB proc - mov r11, __blue_glCore_glCompressedTexImage1DARB +extrn __blue_glCore_glReplacementCodeusSUN: qword +bluegl_glReplacementCodeusSUN proc + mov r11, __blue_glCore_glReplacementCodeusSUN jmp r11 -bluegl_glCompressedTexImage1DARB endp +bluegl_glReplacementCodeusSUN endp -extrn __blue_glCore_glTextureStorage1DEXT: qword -bluegl_glTextureStorage1DEXT proc - mov r11, __blue_glCore_glTextureStorage1DEXT +extrn __blue_glCore_glReplacementCodeubSUN: qword +bluegl_glReplacementCodeubSUN proc + mov r11, __blue_glCore_glReplacementCodeubSUN jmp r11 -bluegl_glTextureStorage1DEXT endp +bluegl_glReplacementCodeubSUN endp -extrn __blue_glCore_glUniform4fvARB: qword -bluegl_glUniform4fvARB proc - mov r11, __blue_glCore_glUniform4fvARB +extrn __blue_glCore_glReplacementCodeuivSUN: qword +bluegl_glReplacementCodeuivSUN proc + mov r11, __blue_glCore_glReplacementCodeuivSUN jmp r11 -bluegl_glUniform4fvARB endp +bluegl_glReplacementCodeuivSUN endp -extrn __blue_glCore_glFramebufferTexture3DEXT: qword -bluegl_glFramebufferTexture3DEXT proc - mov r11, __blue_glCore_glFramebufferTexture3DEXT +extrn __blue_glCore_glReplacementCodeusvSUN: qword +bluegl_glReplacementCodeusvSUN proc + mov r11, __blue_glCore_glReplacementCodeusvSUN jmp r11 -bluegl_glFramebufferTexture3DEXT endp +bluegl_glReplacementCodeusvSUN endp -extrn __blue_glCore_glDrawElementsIndirect: qword -bluegl_glDrawElementsIndirect proc - mov r11, __blue_glCore_glDrawElementsIndirect +extrn __blue_glCore_glReplacementCodeubvSUN: qword +bluegl_glReplacementCodeubvSUN proc + mov r11, __blue_glCore_glReplacementCodeubvSUN jmp r11 -bluegl_glDrawElementsIndirect endp +bluegl_glReplacementCodeubvSUN endp -extrn __blue_glCore_glBindBufferBaseEXT: qword -bluegl_glBindBufferBaseEXT proc - mov r11, __blue_glCore_glBindBufferBaseEXT +extrn __blue_glCore_glReplacementCodePointerSUN: qword +bluegl_glReplacementCodePointerSUN proc + mov r11, __blue_glCore_glReplacementCodePointerSUN jmp r11 -bluegl_glBindBufferBaseEXT endp +bluegl_glReplacementCodePointerSUN endp -extrn __blue_glCore_glIglooInterfaceSGIX: qword -bluegl_glIglooInterfaceSGIX proc - mov r11, __blue_glCore_glIglooInterfaceSGIX +extrn __blue_glCore_glColor4ubVertex2fSUN: qword +bluegl_glColor4ubVertex2fSUN proc + mov r11, __blue_glCore_glColor4ubVertex2fSUN jmp r11 -bluegl_glIglooInterfaceSGIX endp +bluegl_glColor4ubVertex2fSUN endp -extrn __blue_glCore_glMinmaxEXT: qword -bluegl_glMinmaxEXT proc - mov r11, __blue_glCore_glMinmaxEXT +extrn __blue_glCore_glColor4ubVertex2fvSUN: qword +bluegl_glColor4ubVertex2fvSUN proc + mov r11, __blue_glCore_glColor4ubVertex2fvSUN jmp r11 -bluegl_glMinmaxEXT endp +bluegl_glColor4ubVertex2fvSUN endp -extrn __blue_glCore_glClearDepthf: qword -bluegl_glClearDepthf proc - mov r11, __blue_glCore_glClearDepthf +extrn __blue_glCore_glColor4ubVertex3fSUN: qword +bluegl_glColor4ubVertex3fSUN proc + mov r11, __blue_glCore_glColor4ubVertex3fSUN jmp r11 -bluegl_glClearDepthf endp +bluegl_glColor4ubVertex3fSUN endp -extrn __blue_glCore_glReadnPixels: qword -bluegl_glReadnPixels proc - mov r11, __blue_glCore_glReadnPixels +extrn __blue_glCore_glColor4ubVertex3fvSUN: qword +bluegl_glColor4ubVertex3fvSUN proc + mov r11, __blue_glCore_glColor4ubVertex3fvSUN jmp r11 -bluegl_glReadnPixels endp +bluegl_glColor4ubVertex3fvSUN endp -extrn __blue_glCore_glGenerateTextureMipmap: qword -bluegl_glGenerateTextureMipmap proc - mov r11, __blue_glCore_glGenerateTextureMipmap +extrn __blue_glCore_glColor3fVertex3fSUN: qword +bluegl_glColor3fVertex3fSUN proc + mov r11, __blue_glCore_glColor3fVertex3fSUN jmp r11 -bluegl_glGenerateTextureMipmap endp +bluegl_glColor3fVertex3fSUN endp -extrn __blue_glCore_glGetnPixelMapuivARB: qword -bluegl_glGetnPixelMapuivARB proc - mov r11, __blue_glCore_glGetnPixelMapuivARB +extrn __blue_glCore_glColor3fVertex3fvSUN: qword +bluegl_glColor3fVertex3fvSUN proc + mov r11, __blue_glCore_glColor3fVertex3fvSUN jmp r11 -bluegl_glGetnPixelMapuivARB endp +bluegl_glColor3fVertex3fvSUN endp -extrn __blue_glCore_glProgramLocalParameter4fARB: qword -bluegl_glProgramLocalParameter4fARB proc - mov r11, __blue_glCore_glProgramLocalParameter4fARB +extrn __blue_glCore_glNormal3fVertex3fSUN: qword +bluegl_glNormal3fVertex3fSUN proc + mov r11, __blue_glCore_glNormal3fVertex3fSUN jmp r11 -bluegl_glProgramLocalParameter4fARB endp +bluegl_glNormal3fVertex3fSUN endp -extrn __blue_glCore_glVertexAttribL1dvEXT: qword -bluegl_glVertexAttribL1dvEXT proc - mov r11, __blue_glCore_glVertexAttribL1dvEXT +extrn __blue_glCore_glNormal3fVertex3fvSUN: qword +bluegl_glNormal3fVertex3fvSUN proc + mov r11, __blue_glCore_glNormal3fVertex3fvSUN jmp r11 -bluegl_glVertexAttribL1dvEXT endp +bluegl_glNormal3fVertex3fvSUN endp -extrn __blue_glCore_glBeginTransformFeedback: qword -bluegl_glBeginTransformFeedback proc - mov r11, __blue_glCore_glBeginTransformFeedback +extrn __blue_glCore_glColor4fNormal3fVertex3fSUN: qword +bluegl_glColor4fNormal3fVertex3fSUN proc + mov r11, __blue_glCore_glColor4fNormal3fVertex3fSUN jmp r11 -bluegl_glBeginTransformFeedback endp +bluegl_glColor4fNormal3fVertex3fSUN endp -extrn __blue_glCore_glDepthBoundsEXT: qword -bluegl_glDepthBoundsEXT proc - mov r11, __blue_glCore_glDepthBoundsEXT +extrn __blue_glCore_glColor4fNormal3fVertex3fvSUN: qword +bluegl_glColor4fNormal3fVertex3fvSUN proc + mov r11, __blue_glCore_glColor4fNormal3fVertex3fvSUN jmp r11 -bluegl_glDepthBoundsEXT endp +bluegl_glColor4fNormal3fVertex3fvSUN endp -extrn __blue_glCore_glVertexAttrib2f: qword -bluegl_glVertexAttrib2f proc - mov r11, __blue_glCore_glVertexAttrib2f +extrn __blue_glCore_glTexCoord2fVertex3fSUN: qword +bluegl_glTexCoord2fVertex3fSUN proc + mov r11, __blue_glCore_glTexCoord2fVertex3fSUN jmp r11 -bluegl_glVertexAttrib2f endp +bluegl_glTexCoord2fVertex3fSUN endp -extrn __blue_glCore_glProgramEnvParametersI4ivNV: qword -bluegl_glProgramEnvParametersI4ivNV proc - mov r11, __blue_glCore_glProgramEnvParametersI4ivNV +extrn __blue_glCore_glTexCoord2fVertex3fvSUN: qword +bluegl_glTexCoord2fVertex3fvSUN proc + mov r11, __blue_glCore_glTexCoord2fVertex3fvSUN jmp r11 -bluegl_glProgramEnvParametersI4ivNV endp +bluegl_glTexCoord2fVertex3fvSUN endp extrn __blue_glCore_glTexCoord4fVertex4fSUN: qword bluegl_glTexCoord4fVertex4fSUN proc @@ -15291,177 +15301,165 @@ bluegl_glTexCoord4fVertex4fSUN proc jmp r11 bluegl_glTexCoord4fVertex4fSUN endp -extrn __blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN: qword -bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN proc - mov r11, __blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN - jmp r11 -bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN endp - -extrn __blue_glCore_glGetNamedProgramLocalParameterfvEXT: qword -bluegl_glGetNamedProgramLocalParameterfvEXT proc - mov r11, __blue_glCore_glGetNamedProgramLocalParameterfvEXT - jmp r11 -bluegl_glGetNamedProgramLocalParameterfvEXT endp - -extrn __blue_glCore_glProgramUniform1ui64ARB: qword -bluegl_glProgramUniform1ui64ARB proc - mov r11, __blue_glCore_glProgramUniform1ui64ARB +extrn __blue_glCore_glTexCoord4fVertex4fvSUN: qword +bluegl_glTexCoord4fVertex4fvSUN proc + mov r11, __blue_glCore_glTexCoord4fVertex4fvSUN jmp r11 -bluegl_glProgramUniform1ui64ARB endp +bluegl_glTexCoord4fVertex4fvSUN endp -extrn __blue_glCore_glReadInstrumentsSGIX: qword -bluegl_glReadInstrumentsSGIX proc - mov r11, __blue_glCore_glReadInstrumentsSGIX +extrn __blue_glCore_glTexCoord2fColor4ubVertex3fSUN: qword +bluegl_glTexCoord2fColor4ubVertex3fSUN proc + mov r11, __blue_glCore_glTexCoord2fColor4ubVertex3fSUN jmp r11 -bluegl_glReadInstrumentsSGIX endp +bluegl_glTexCoord2fColor4ubVertex3fSUN endp -extrn __blue_glCore_glVertexAttrib3dNV: qword -bluegl_glVertexAttrib3dNV proc - mov r11, __blue_glCore_glVertexAttrib3dNV +extrn __blue_glCore_glTexCoord2fColor4ubVertex3fvSUN: qword +bluegl_glTexCoord2fColor4ubVertex3fvSUN proc + mov r11, __blue_glCore_glTexCoord2fColor4ubVertex3fvSUN jmp r11 -bluegl_glVertexAttrib3dNV endp +bluegl_glTexCoord2fColor4ubVertex3fvSUN endp -extrn __blue_glCore_glProgramParameter4dvNV: qword -bluegl_glProgramParameter4dvNV proc - mov r11, __blue_glCore_glProgramParameter4dvNV +extrn __blue_glCore_glTexCoord2fColor3fVertex3fSUN: qword +bluegl_glTexCoord2fColor3fVertex3fSUN proc + mov r11, __blue_glCore_glTexCoord2fColor3fVertex3fSUN jmp r11 -bluegl_glProgramParameter4dvNV endp +bluegl_glTexCoord2fColor3fVertex3fSUN endp -extrn __blue_glCore_glColorTableParameterivSGI: qword -bluegl_glColorTableParameterivSGI proc - mov r11, __blue_glCore_glColorTableParameterivSGI +extrn __blue_glCore_glTexCoord2fColor3fVertex3fvSUN: qword +bluegl_glTexCoord2fColor3fVertex3fvSUN proc + mov r11, __blue_glCore_glTexCoord2fColor3fVertex3fvSUN jmp r11 -bluegl_glColorTableParameterivSGI endp +bluegl_glTexCoord2fColor3fVertex3fvSUN endp -extrn __blue_glCore_glUniform1f: qword -bluegl_glUniform1f proc - mov r11, __blue_glCore_glUniform1f +extrn __blue_glCore_glTexCoord2fNormal3fVertex3fSUN: qword +bluegl_glTexCoord2fNormal3fVertex3fSUN proc + mov r11, __blue_glCore_glTexCoord2fNormal3fVertex3fSUN jmp r11 -bluegl_glUniform1f endp +bluegl_glTexCoord2fNormal3fVertex3fSUN endp -extrn __blue_glCore_glMultiTexRenderbufferEXT: qword -bluegl_glMultiTexRenderbufferEXT proc - mov r11, __blue_glCore_glMultiTexRenderbufferEXT +extrn __blue_glCore_glTexCoord2fNormal3fVertex3fvSUN: qword +bluegl_glTexCoord2fNormal3fVertex3fvSUN proc + mov r11, __blue_glCore_glTexCoord2fNormal3fVertex3fvSUN jmp r11 -bluegl_glMultiTexRenderbufferEXT endp +bluegl_glTexCoord2fNormal3fVertex3fvSUN endp -extrn __blue_glCore_glVertexAttribI4uiEXT: qword -bluegl_glVertexAttribI4uiEXT proc - mov r11, __blue_glCore_glVertexAttribI4uiEXT +extrn __blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN: qword +bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN proc + mov r11, __blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN jmp r11 -bluegl_glVertexAttribI4uiEXT endp +bluegl_glTexCoord2fColor4fNormal3fVertex3fSUN endp -extrn __blue_glCore_glGetConvolutionParameterfv: qword -bluegl_glGetConvolutionParameterfv proc - mov r11, __blue_glCore_glGetConvolutionParameterfv +extrn __blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN: qword +bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN proc + mov r11, __blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN jmp r11 -bluegl_glGetConvolutionParameterfv endp +bluegl_glTexCoord2fColor4fNormal3fVertex3fvSUN endp -extrn __blue_glCore_glMultiTexCoord3sARB: qword -bluegl_glMultiTexCoord3sARB proc - mov r11, __blue_glCore_glMultiTexCoord3sARB +extrn __blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN: qword +bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN proc + mov r11, __blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN jmp r11 -bluegl_glMultiTexCoord3sARB endp +bluegl_glTexCoord4fColor4fNormal3fVertex4fSUN endp -extrn __blue_glCore_glGetTexParameterxvOES: qword -bluegl_glGetTexParameterxvOES proc - mov r11, __blue_glCore_glGetTexParameterxvOES +extrn __blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN: qword +bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN proc + mov r11, __blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN jmp r11 -bluegl_glGetTexParameterxvOES endp +bluegl_glTexCoord4fColor4fNormal3fVertex4fvSUN endp -extrn __blue_glCore_glGetNamedBufferParameteriv: qword -bluegl_glGetNamedBufferParameteriv proc - mov r11, __blue_glCore_glGetNamedBufferParameteriv +extrn __blue_glCore_glReplacementCodeuiVertex3fSUN: qword +bluegl_glReplacementCodeuiVertex3fSUN proc + mov r11, __blue_glCore_glReplacementCodeuiVertex3fSUN jmp r11 -bluegl_glGetNamedBufferParameteriv endp +bluegl_glReplacementCodeuiVertex3fSUN endp -extrn __blue_glCore_glMultiDrawElementArrayAPPLE: qword -bluegl_glMultiDrawElementArrayAPPLE proc - mov r11, __blue_glCore_glMultiDrawElementArrayAPPLE +extrn __blue_glCore_glReplacementCodeuiVertex3fvSUN: qword +bluegl_glReplacementCodeuiVertex3fvSUN proc + mov r11, __blue_glCore_glReplacementCodeuiVertex3fvSUN jmp r11 -bluegl_glMultiDrawElementArrayAPPLE endp +bluegl_glReplacementCodeuiVertex3fvSUN endp -extrn __blue_glCore_glGetnConvolutionFilter: qword -bluegl_glGetnConvolutionFilter proc - mov r11, __blue_glCore_glGetnConvolutionFilter +extrn __blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN: qword +bluegl_glReplacementCodeuiColor4ubVertex3fSUN proc + mov r11, __blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN jmp r11 -bluegl_glGetnConvolutionFilter endp +bluegl_glReplacementCodeuiColor4ubVertex3fSUN endp -extrn __blue_glCore_glUniformMatrix2x3fv: qword -bluegl_glUniformMatrix2x3fv proc - mov r11, __blue_glCore_glUniformMatrix2x3fv +extrn __blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN: qword +bluegl_glReplacementCodeuiColor4ubVertex3fvSUN proc + mov r11, __blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN jmp r11 -bluegl_glUniformMatrix2x3fv endp +bluegl_glReplacementCodeuiColor4ubVertex3fvSUN endp -extrn __blue_glCore_glBindBuffersRange: qword -bluegl_glBindBuffersRange proc - mov r11, __blue_glCore_glBindBuffersRange +extrn __blue_glCore_glReplacementCodeuiColor3fVertex3fSUN: qword +bluegl_glReplacementCodeuiColor3fVertex3fSUN proc + mov r11, __blue_glCore_glReplacementCodeuiColor3fVertex3fSUN jmp r11 -bluegl_glBindBuffersRange endp +bluegl_glReplacementCodeuiColor3fVertex3fSUN endp -extrn __blue_glCore_glMakeImageHandleNonResidentNV: qword -bluegl_glMakeImageHandleNonResidentNV proc - mov r11, __blue_glCore_glMakeImageHandleNonResidentNV +extrn __blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN: qword +bluegl_glReplacementCodeuiColor3fVertex3fvSUN proc + mov r11, __blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN jmp r11 -bluegl_glMakeImageHandleNonResidentNV endp +bluegl_glReplacementCodeuiColor3fVertex3fvSUN endp -extrn __blue_glCore_glFinalCombinerInputNV: qword -bluegl_glFinalCombinerInputNV proc - mov r11, __blue_glCore_glFinalCombinerInputNV +extrn __blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN: qword +bluegl_glReplacementCodeuiNormal3fVertex3fSUN proc + mov r11, __blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN jmp r11 -bluegl_glFinalCombinerInputNV endp +bluegl_glReplacementCodeuiNormal3fVertex3fSUN endp -extrn __blue_glCore_glFlush: qword -bluegl_glFlush proc - mov r11, __blue_glCore_glFlush +extrn __blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN: qword +bluegl_glReplacementCodeuiNormal3fVertex3fvSUN proc + mov r11, __blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN jmp r11 -bluegl_glFlush endp +bluegl_glReplacementCodeuiNormal3fVertex3fvSUN endp -extrn __blue_glCore_glVertexArrayElementBuffer: qword -bluegl_glVertexArrayElementBuffer proc - mov r11, __blue_glCore_glVertexArrayElementBuffer +extrn __blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN: qword +bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN proc + mov r11, __blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN jmp r11 -bluegl_glVertexArrayElementBuffer endp +bluegl_glReplacementCodeuiColor4fNormal3fVertex3fSUN endp -extrn __blue_glCore_glProgramUniform4uiEXT: qword -bluegl_glProgramUniform4uiEXT proc - mov r11, __blue_glCore_glProgramUniform4uiEXT +extrn __blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN: qword +bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN proc + mov r11, __blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN jmp r11 -bluegl_glProgramUniform4uiEXT endp +bluegl_glReplacementCodeuiColor4fNormal3fVertex3fvSUN endp -extrn __blue_glCore_glVertexAttrib4ubvNV: qword -bluegl_glVertexAttrib4ubvNV proc - mov r11, __blue_glCore_glVertexAttrib4ubvNV +extrn __blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN: qword +bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN proc + mov r11, __blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN jmp r11 -bluegl_glVertexAttrib4ubvNV endp +bluegl_glReplacementCodeuiTexCoord2fVertex3fSUN endp -extrn __blue_glCore_glSampleMapATI: qword -bluegl_glSampleMapATI proc - mov r11, __blue_glCore_glSampleMapATI +extrn __blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN: qword +bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN proc + mov r11, __blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN jmp r11 -bluegl_glSampleMapATI endp +bluegl_glReplacementCodeuiTexCoord2fVertex3fvSUN endp -extrn __blue_glCore_glMultiTexCoord1bOES: qword -bluegl_glMultiTexCoord1bOES proc - mov r11, __blue_glCore_glMultiTexCoord1bOES +extrn __blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN: qword +bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN proc + mov r11, __blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN jmp r11 -bluegl_glMultiTexCoord1bOES endp +bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN endp -extrn __blue_glCore_glVertexAttribParameteriAMD: qword -bluegl_glVertexAttribParameteriAMD proc - mov r11, __blue_glCore_glVertexAttribParameteriAMD +extrn __blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN: qword +bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN proc + mov r11, __blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN jmp r11 -bluegl_glVertexAttribParameteriAMD endp +bluegl_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN endp -extrn __blue_glCore_glPointParameterfARB: qword -bluegl_glPointParameterfARB proc - mov r11, __blue_glCore_glPointParameterfARB +extrn __blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN: qword +bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN proc + mov r11, __blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN jmp r11 -bluegl_glPointParameterfARB endp +bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN endp -extrn __blue_glCore_glWindowPos2dMESA: qword -bluegl_glWindowPos2dMESA proc - mov r11, __blue_glCore_glWindowPos2dMESA +extrn __blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN: qword +bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN proc + mov r11, __blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN jmp r11 -bluegl_glWindowPos2dMESA endp +bluegl_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN endp end diff --git a/libs/bluegl/src/BlueGLLinuxOSMesa.cpp b/libs/bluegl/src/BlueGLLinuxOSMesa.cpp new file mode 100644 index 00000000000..abadd69c4ea --- /dev/null +++ b/libs/bluegl/src/BlueGLLinuxOSMesa.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +namespace bluegl { + +namespace { +using ProcAddressFunc = void*(*)(char const* funcName); +} + +struct Driver { + ProcAddressFunc OSMesaGetProcAddress; + void* library; +} g_driver = {nullptr, nullptr}; + +bool initBinder() { + constexpr char const* libraryNames[] = {"libOSMesa.so", "libosmesa.so"}; + for (char const* name : libraryNames) { + g_driver.library = dlopen(name, RTLD_GLOBAL | RTLD_NOW); + if (g_driver.library) { + break; + } + } + if (!g_driver.library) { + // The library has been linked explicitly during compile. + g_driver.OSMesaGetProcAddress = (ProcAddressFunc) dlsym(RTLD_LOCAL, "OSMesaGetProcAddress"); + } else { + g_driver.OSMesaGetProcAddress = + (ProcAddressFunc) dlsym(g_driver.library, "OSMesaGetProcAddress"); + } + + return g_driver.OSMesaGetProcAddress; +} + +void* loadFunction(const char* name) { + return (void*) g_driver.OSMesaGetProcAddress(name); +} + +void shutdownBinder() { + if (g_driver.library) { + dlclose(g_driver.library); + } + memset(&g_driver, 0, sizeof(g_driver)); +} + +} // namespace bluegl diff --git a/libs/bluegl/src/private_BlueGL.h b/libs/bluegl/src/private_BlueGL.h index 01d80b8cd9a..0552786f0b8 100644 --- a/libs/bluegl/src/private_BlueGL.h +++ b/libs/bluegl/src/private_BlueGL.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,5166 +20,5166 @@ **********************************************************************************************/ extern "C" { -void* __blue_glCore_glVertexAttrib4dARB; -void* __blue_glCore_glMultMatrixxOES; -void* __blue_glCore_glProgramParameters4fvNV; -void* __blue_glCore_glGenProgramPipelines; -void* __blue_glCore_glMultiTexCoordP3uiv; -void* __blue_glCore_glSecondaryColor3usv; -void* __blue_glCore_glGetHistogramParameteriv; -void* __blue_glCore_glRenderbufferStorageEXT; -void* __blue_glCore_glGetPathParameterivNV; -void* __blue_glCore_glLineWidthxOES; -void* __blue_glCore_glGlobalAlphaFactordSUN; +void* __blue_glCore_glCullFace; +void* __blue_glCore_glFrontFace; +void* __blue_glCore_glHint; +void* __blue_glCore_glLineWidth; +void* __blue_glCore_glPointSize; +void* __blue_glCore_glPolygonMode; +void* __blue_glCore_glScissor; +void* __blue_glCore_glTexParameterf; +void* __blue_glCore_glTexParameterfv; +void* __blue_glCore_glTexParameteri; +void* __blue_glCore_glTexParameteriv; +void* __blue_glCore_glTexImage1D; void* __blue_glCore_glTexImage2D; -void* __blue_glCore_glGlobalAlphaFactorfSUN; -void* __blue_glCore_glNormalP3uiv; -void* __blue_glCore_glColor4fNormal3fVertex3fSUN; -void* __blue_glCore_glMapVertexAttrib1fAPPLE; -void* __blue_glCore_glTexCoord2fNormal3fVertex3fvSUN; -void* __blue_glCore_glVertexArrayVertexBuffers; +void* __blue_glCore_glDrawBuffer; +void* __blue_glCore_glClear; +void* __blue_glCore_glClearColor; +void* __blue_glCore_glClearStencil; +void* __blue_glCore_glClearDepth; +void* __blue_glCore_glStencilMask; +void* __blue_glCore_glColorMask; +void* __blue_glCore_glDepthMask; +void* __blue_glCore_glDisable; +void* __blue_glCore_glEnable; +void* __blue_glCore_glFinish; +void* __blue_glCore_glFlush; +void* __blue_glCore_glBlendFunc; +void* __blue_glCore_glLogicOp; +void* __blue_glCore_glStencilFunc; +void* __blue_glCore_glStencilOp; +void* __blue_glCore_glDepthFunc; +void* __blue_glCore_glPixelStoref; +void* __blue_glCore_glPixelStorei; +void* __blue_glCore_glReadBuffer; +void* __blue_glCore_glReadPixels; +void* __blue_glCore_glGetBooleanv; +void* __blue_glCore_glGetDoublev; +void* __blue_glCore_glGetError; +void* __blue_glCore_glGetFloatv; +void* __blue_glCore_glGetIntegerv; +void* __blue_glCore_glGetString; +void* __blue_glCore_glGetTexImage; +void* __blue_glCore_glGetTexParameterfv; +void* __blue_glCore_glGetTexParameteriv; +void* __blue_glCore_glGetTexLevelParameterfv; +void* __blue_glCore_glGetTexLevelParameteriv; +void* __blue_glCore_glIsEnabled; +void* __blue_glCore_glDepthRange; +void* __blue_glCore_glViewport; +void* __blue_glCore_glDrawArrays; +void* __blue_glCore_glDrawElements; +void* __blue_glCore_glGetPointerv; +void* __blue_glCore_glPolygonOffset; +void* __blue_glCore_glCopyTexImage1D; +void* __blue_glCore_glCopyTexImage2D; +void* __blue_glCore_glCopyTexSubImage1D; +void* __blue_glCore_glCopyTexSubImage2D; +void* __blue_glCore_glTexSubImage1D; +void* __blue_glCore_glTexSubImage2D; +void* __blue_glCore_glBindTexture; +void* __blue_glCore_glDeleteTextures; +void* __blue_glCore_glGenTextures; +void* __blue_glCore_glIsTexture; +void* __blue_glCore_glDrawRangeElements; +void* __blue_glCore_glTexImage3D; +void* __blue_glCore_glTexSubImage3D; +void* __blue_glCore_glCopyTexSubImage3D; +void* __blue_glCore_glActiveTexture; +void* __blue_glCore_glSampleCoverage; +void* __blue_glCore_glCompressedTexImage3D; +void* __blue_glCore_glCompressedTexImage2D; +void* __blue_glCore_glCompressedTexImage1D; +void* __blue_glCore_glCompressedTexSubImage3D; +void* __blue_glCore_glCompressedTexSubImage2D; +void* __blue_glCore_glCompressedTexSubImage1D; +void* __blue_glCore_glGetCompressedTexImage; +void* __blue_glCore_glBlendFuncSeparate; +void* __blue_glCore_glMultiDrawArrays; +void* __blue_glCore_glMultiDrawElements; +void* __blue_glCore_glPointParameterf; +void* __blue_glCore_glPointParameterfv; +void* __blue_glCore_glPointParameteri; +void* __blue_glCore_glPointParameteriv; +void* __blue_glCore_glBlendColor; +void* __blue_glCore_glBlendEquation; +void* __blue_glCore_glGenQueries; +void* __blue_glCore_glDeleteQueries; +void* __blue_glCore_glIsQuery; +void* __blue_glCore_glBeginQuery; +void* __blue_glCore_glEndQuery; +void* __blue_glCore_glGetQueryiv; +void* __blue_glCore_glGetQueryObjectiv; +void* __blue_glCore_glGetQueryObjectuiv; +void* __blue_glCore_glBindBuffer; +void* __blue_glCore_glDeleteBuffers; +void* __blue_glCore_glGenBuffers; +void* __blue_glCore_glIsBuffer; +void* __blue_glCore_glBufferData; +void* __blue_glCore_glBufferSubData; +void* __blue_glCore_glGetBufferSubData; +void* __blue_glCore_glMapBuffer; +void* __blue_glCore_glUnmapBuffer; +void* __blue_glCore_glGetBufferParameteriv; +void* __blue_glCore_glGetBufferPointerv; +void* __blue_glCore_glBlendEquationSeparate; +void* __blue_glCore_glDrawBuffers; +void* __blue_glCore_glStencilOpSeparate; +void* __blue_glCore_glStencilFuncSeparate; +void* __blue_glCore_glStencilMaskSeparate; +void* __blue_glCore_glAttachShader; +void* __blue_glCore_glBindAttribLocation; +void* __blue_glCore_glCompileShader; +void* __blue_glCore_glCreateProgram; +void* __blue_glCore_glCreateShader; +void* __blue_glCore_glDeleteProgram; +void* __blue_glCore_glDeleteShader; +void* __blue_glCore_glDetachShader; +void* __blue_glCore_glDisableVertexAttribArray; +void* __blue_glCore_glEnableVertexAttribArray; +void* __blue_glCore_glGetActiveAttrib; +void* __blue_glCore_glGetActiveUniform; +void* __blue_glCore_glGetAttachedShaders; +void* __blue_glCore_glGetAttribLocation; +void* __blue_glCore_glGetProgramiv; +void* __blue_glCore_glGetProgramInfoLog; +void* __blue_glCore_glGetShaderiv; +void* __blue_glCore_glGetShaderInfoLog; +void* __blue_glCore_glGetShaderSource; +void* __blue_glCore_glGetUniformLocation; +void* __blue_glCore_glGetUniformfv; +void* __blue_glCore_glGetUniformiv; +void* __blue_glCore_glGetVertexAttribdv; +void* __blue_glCore_glGetVertexAttribfv; +void* __blue_glCore_glGetVertexAttribiv; +void* __blue_glCore_glGetVertexAttribPointerv; +void* __blue_glCore_glIsProgram; +void* __blue_glCore_glIsShader; +void* __blue_glCore_glLinkProgram; void* __blue_glCore_glShaderSource; -void* __blue_glCore_glConvolutionFilter1D; -void* __blue_glCore_glIsFenceAPPLE; -void* __blue_glCore_glWindowPos2s; -void* __blue_glCore_glEvaluateDepthValuesARB; -void* __blue_glCore_glInterpolatePathsNV; -void* __blue_glCore_glTextureParameterivEXT; -void* __blue_glCore_glDeleteOcclusionQueriesNV; -void* __blue_glCore_glMakeTextureHandleResidentARB; -void* __blue_glCore_glCopyImageSubDataNV; -void* __blue_glCore_glVertexAttribL3d; -void* __blue_glCore_glGetTextureSamplerHandleNV; -void* __blue_glCore_glMakeTextureHandleResidentNV; -void* __blue_glCore_glPolygonOffsetxOES; +void* __blue_glCore_glUseProgram; +void* __blue_glCore_glUniform1f; +void* __blue_glCore_glUniform2f; +void* __blue_glCore_glUniform3f; +void* __blue_glCore_glUniform4f; +void* __blue_glCore_glUniform1i; +void* __blue_glCore_glUniform2i; +void* __blue_glCore_glUniform3i; +void* __blue_glCore_glUniform4i; +void* __blue_glCore_glUniform1fv; +void* __blue_glCore_glUniform2fv; +void* __blue_glCore_glUniform3fv; +void* __blue_glCore_glUniform4fv; +void* __blue_glCore_glUniform1iv; +void* __blue_glCore_glUniform2iv; +void* __blue_glCore_glUniform3iv; +void* __blue_glCore_glUniform4iv; void* __blue_glCore_glUniformMatrix2fv; -void* __blue_glCore_glMultiDrawElementsEXT; -void* __blue_glCore_glVertexAttribI1uiv; -void* __blue_glCore_glPathCoordsNV; -void* __blue_glCore_glVertexArrayVertexBindingDivisorEXT; +void* __blue_glCore_glUniformMatrix3fv; +void* __blue_glCore_glUniformMatrix4fv; +void* __blue_glCore_glValidateProgram; +void* __blue_glCore_glVertexAttrib1d; +void* __blue_glCore_glVertexAttrib1dv; +void* __blue_glCore_glVertexAttrib1f; +void* __blue_glCore_glVertexAttrib1fv; +void* __blue_glCore_glVertexAttrib1s; +void* __blue_glCore_glVertexAttrib1sv; +void* __blue_glCore_glVertexAttrib2d; void* __blue_glCore_glVertexAttrib2dv; -void* __blue_glCore_glFinish; -void* __blue_glCore_glVertexAttribs2dvNV; -void* __blue_glCore_glVertexAttribI1ivEXT; -void* __blue_glCore_glVertexAttrib2sNV; -void* __blue_glCore_glMultiTexCoord1iv; -void* __blue_glCore_glGetnMapiv; -void* __blue_glCore_glCompressedTexSubImage1DARB; -void* __blue_glCore_glFogCoordPointerEXT; -void* __blue_glCore_glCompressedMultiTexImage1DEXT; +void* __blue_glCore_glVertexAttrib2f; +void* __blue_glCore_glVertexAttrib2fv; +void* __blue_glCore_glVertexAttrib2s; +void* __blue_glCore_glVertexAttrib2sv; void* __blue_glCore_glVertexAttrib3d; -void* __blue_glCore_glLineWidth; -void* __blue_glCore_glGetShaderiv; -void* __blue_glCore_glProgramUniform1dv; -void* __blue_glCore_glGetVertexAttribLui64vNV; -void* __blue_glCore_glProgramUniform1ui64vNV; -void* __blue_glCore_glGetRenderbufferParameteriv; -void* __blue_glCore_glGetOcclusionQueryivNV; -void* __blue_glCore_glUniformMatrix2x4dv; -void* __blue_glCore_glGetVertexAttribPointervNV; -void* __blue_glCore_glUniform2fv; -void* __blue_glCore_glRasterPos2xOES; -void* __blue_glCore_glGetCommandHeaderNV; -void* __blue_glCore_glUniformSubroutinesuiv; -void* __blue_glCore_glGetPixelTransformParameterivEXT; -void* __blue_glCore_glGetFragDataLocation; -void* __blue_glCore_glTexCoord2fColor3fVertex3fSUN; -void* __blue_glCore_glSecondaryColor3uiv; -void* __blue_glCore_glEnableVertexArrayAttribEXT; -void* __blue_glCore_glPixelTexGenParameterfvSGIS; -void* __blue_glCore_glProgramUniformMatrix3x4dvEXT; -void* __blue_glCore_glMultiTexCoord2fvARB; -void* __blue_glCore_glHistogram; -void* __blue_glCore_glGetSynciv; -void* __blue_glCore_glBitmapxOES; -void* __blue_glCore_glGetnColorTable; -void* __blue_glCore_glGenerateMultiTexMipmapEXT; -void* __blue_glCore_glVertexStream4fvATI; -void* __blue_glCore_glSecondaryColorPointerEXT; -void* __blue_glCore_glVertexAttribIPointerEXT; -void* __blue_glCore_glEvalCoord2xvOES; -void* __blue_glCore_glDeleteFencesNV; -void* __blue_glCore_glAlphaFragmentOp1ATI; -void* __blue_glCore_glGetActiveUniformName; -void* __blue_glCore_glGetCompressedTextureSubImage; -void* __blue_glCore_glGetTextureParameterfvEXT; -void* __blue_glCore_glDeleteShader; -void* __blue_glCore_glRenderbufferStorageMultisample; -void* __blue_glCore_glTexCoord2fVertex3fSUN; -void* __blue_glCore_glGetActiveSubroutineUniformName; -void* __blue_glCore_glGetVideoCaptureStreamfvNV; -void* __blue_glCore_glInvalidateSubFramebuffer; -void* __blue_glCore_glIndexFormatNV; -void* __blue_glCore_glMultiTexEnvfvEXT; -void* __blue_glCore_glUniformBufferEXT; -void* __blue_glCore_glNamedProgramLocalParametersI4uivEXT; -void* __blue_glCore_glWeightPathsNV; -void* __blue_glCore_glGetnHistogram; -void* __blue_glCore_glTexCoord1bOES; -void* __blue_glCore_glSetFragmentShaderConstantATI; -void* __blue_glCore_glRasterPos3xvOES; -void* __blue_glCore_glCopyConvolutionFilter1DEXT; -void* __blue_glCore_glArrayElementEXT; -void* __blue_glCore_glCopyTextureImage2DEXT; -void* __blue_glCore_glNamedProgramLocalParameterI4uivEXT; -void* __blue_glCore_glMultiDrawElementsIndirectBindlessNV; -void* __blue_glCore_glClearColorIuiEXT; -void* __blue_glCore_glMultiTexParameterfEXT; -void* __blue_glCore_glVertexArrayVertexAttribIFormatEXT; -void* __blue_glCore_glVertexAttrib1sv; -void* __blue_glCore_glVertexStream2dvATI; -void* __blue_glCore_glUniform4iARB; -void* __blue_glCore_glVertexAttribs4svNV; -void* __blue_glCore_glProgramUniformMatrix3x2dvEXT; -void* __blue_glCore_glProgramUniform1ui; -void* __blue_glCore_glVertexAttribIFormatNV; -void* __blue_glCore_glFragmentLightModelfSGIX; -void* __blue_glCore_glGetActiveSubroutineName; -void* __blue_glCore_glConvolutionParameteri; -void* __blue_glCore_glMultiTexCoord4f; -void* __blue_glCore_glTexCoord1xvOES; -void* __blue_glCore_glIsTransformFeedback; -void* __blue_glCore_glBlendBarrierKHR; -void* __blue_glCore_glBindBufferRangeEXT; -void* __blue_glCore_glPathColorGenNV; -void* __blue_glCore_glEndQuery; +void* __blue_glCore_glVertexAttrib3dv; +void* __blue_glCore_glVertexAttrib3f; +void* __blue_glCore_glVertexAttrib3fv; +void* __blue_glCore_glVertexAttrib3s; +void* __blue_glCore_glVertexAttrib3sv; +void* __blue_glCore_glVertexAttrib4Nbv; +void* __blue_glCore_glVertexAttrib4Niv; +void* __blue_glCore_glVertexAttrib4Nsv; +void* __blue_glCore_glVertexAttrib4Nub; +void* __blue_glCore_glVertexAttrib4Nubv; +void* __blue_glCore_glVertexAttrib4Nuiv; +void* __blue_glCore_glVertexAttrib4Nusv; +void* __blue_glCore_glVertexAttrib4bv; +void* __blue_glCore_glVertexAttrib4d; +void* __blue_glCore_glVertexAttrib4dv; +void* __blue_glCore_glVertexAttrib4f; +void* __blue_glCore_glVertexAttrib4fv; +void* __blue_glCore_glVertexAttrib4iv; +void* __blue_glCore_glVertexAttrib4s; +void* __blue_glCore_glVertexAttrib4sv; +void* __blue_glCore_glVertexAttrib4ubv; +void* __blue_glCore_glVertexAttrib4uiv; +void* __blue_glCore_glVertexAttrib4usv; +void* __blue_glCore_glVertexAttribPointer; +void* __blue_glCore_glUniformMatrix2x3fv; +void* __blue_glCore_glUniformMatrix3x2fv; void* __blue_glCore_glUniformMatrix2x4fv; +void* __blue_glCore_glUniformMatrix4x2fv; +void* __blue_glCore_glUniformMatrix3x4fv; +void* __blue_glCore_glUniformMatrix4x3fv; +void* __blue_glCore_glColorMaski; +void* __blue_glCore_glGetBooleani_v; +void* __blue_glCore_glGetIntegeri_v; +void* __blue_glCore_glEnablei; +void* __blue_glCore_glDisablei; +void* __blue_glCore_glIsEnabledi; +void* __blue_glCore_glBeginTransformFeedback; +void* __blue_glCore_glEndTransformFeedback; +void* __blue_glCore_glBindBufferRange; +void* __blue_glCore_glBindBufferBase; +void* __blue_glCore_glTransformFeedbackVaryings; +void* __blue_glCore_glGetTransformFeedbackVarying; +void* __blue_glCore_glClampColor; +void* __blue_glCore_glBeginConditionalRender; +void* __blue_glCore_glEndConditionalRender; +void* __blue_glCore_glVertexAttribIPointer; +void* __blue_glCore_glGetVertexAttribIiv; +void* __blue_glCore_glGetVertexAttribIuiv; +void* __blue_glCore_glVertexAttribI1i; +void* __blue_glCore_glVertexAttribI2i; +void* __blue_glCore_glVertexAttribI3i; +void* __blue_glCore_glVertexAttribI4i; +void* __blue_glCore_glVertexAttribI1ui; +void* __blue_glCore_glVertexAttribI2ui; +void* __blue_glCore_glVertexAttribI3ui; +void* __blue_glCore_glVertexAttribI4ui; +void* __blue_glCore_glVertexAttribI1iv; +void* __blue_glCore_glVertexAttribI2iv; +void* __blue_glCore_glVertexAttribI3iv; +void* __blue_glCore_glVertexAttribI4iv; +void* __blue_glCore_glVertexAttribI1uiv; +void* __blue_glCore_glVertexAttribI2uiv; +void* __blue_glCore_glVertexAttribI3uiv; +void* __blue_glCore_glVertexAttribI4uiv; +void* __blue_glCore_glVertexAttribI4bv; +void* __blue_glCore_glVertexAttribI4sv; +void* __blue_glCore_glVertexAttribI4ubv; +void* __blue_glCore_glVertexAttribI4usv; +void* __blue_glCore_glGetUniformuiv; +void* __blue_glCore_glBindFragDataLocation; +void* __blue_glCore_glGetFragDataLocation; +void* __blue_glCore_glUniform1ui; +void* __blue_glCore_glUniform2ui; +void* __blue_glCore_glUniform3ui; +void* __blue_glCore_glUniform4ui; +void* __blue_glCore_glUniform1uiv; +void* __blue_glCore_glUniform2uiv; +void* __blue_glCore_glUniform3uiv; +void* __blue_glCore_glUniform4uiv; +void* __blue_glCore_glTexParameterIiv; +void* __blue_glCore_glTexParameterIuiv; +void* __blue_glCore_glGetTexParameterIiv; +void* __blue_glCore_glGetTexParameterIuiv; +void* __blue_glCore_glClearBufferiv; +void* __blue_glCore_glClearBufferuiv; +void* __blue_glCore_glClearBufferfv; +void* __blue_glCore_glClearBufferfi; +void* __blue_glCore_glGetStringi; +void* __blue_glCore_glIsRenderbuffer; +void* __blue_glCore_glBindRenderbuffer; +void* __blue_glCore_glDeleteRenderbuffers; void* __blue_glCore_glGenRenderbuffers; -void* __blue_glCore_glShaderOp2EXT; -void* __blue_glCore_glDrawTransformFeedback; -void* __blue_glCore_glProgramUniform3ui64vNV; -void* __blue_glCore_glNamedBufferStorage; -void* __blue_glCore_glOrthoxOES; -void* __blue_glCore_glVertexAttrib4ubvARB; -void* __blue_glCore_glStencilOp; -void* __blue_glCore_glProgramLocalParametersI4ivNV; -void* __blue_glCore_glVertexStream2iATI; -void* __blue_glCore_glWeightdvARB; -void* __blue_glCore_glVertexAttrib1fARB; -void* __blue_glCore_glColorFragmentOp2ATI; -void* __blue_glCore_glGetBufferPointervARB; -void* __blue_glCore_glNamedFramebufferTexture1DEXT; -void* __blue_glCore_glVertexAttrib2fNV; -void* __blue_glCore_glDisableVertexAttribArray; -void* __blue_glCore_glTextureParameterf; -void* __blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; -void* __blue_glCore_glNormal3fVertex3fSUN; -void* __blue_glCore_glGetTexBumpParameterfvATI; -void* __blue_glCore_glMultiTexCoord3fARB; -void* __blue_glCore_glTextureParameterfv; -void* __blue_glCore_glTexBumpParameterivATI; -void* __blue_glCore_glLockArraysEXT; -void* __blue_glCore_glIsEnabledIndexedEXT; -void* __blue_glCore_glGenerateMipmapEXT; -void* __blue_glCore_glVertexP3uiv; -void* __blue_glCore_glClearNamedBufferSubData; -void* __blue_glCore_glInvalidateTexImage; +void* __blue_glCore_glRenderbufferStorage; +void* __blue_glCore_glGetRenderbufferParameteriv; +void* __blue_glCore_glIsFramebuffer; void* __blue_glCore_glBindFramebuffer; -void* __blue_glCore_glDrawArraysIndirect; -void* __blue_glCore_glClipPlanexOES; -void* __blue_glCore_glGetFloati_v; -void* __blue_glCore_glTransformFeedbackVaryingsEXT; -void* __blue_glCore_glGetColorTableParameteriv; -void* __blue_glCore_glTexBufferRange; -void* __blue_glCore_glVertexAttribI1uivEXT; -void* __blue_glCore_glShaderBinary; -void* __blue_glCore_glGetVertexAttribLi64vNV; -void* __blue_glCore_glGetNamedBufferSubDataEXT; -void* __blue_glCore_glUniform3uivEXT; -void* __blue_glCore_glMatrixTranslatefEXT; -void* __blue_glCore_glVertexAttribs2hvNV; -void* __blue_glCore_glClearBufferSubData; +void* __blue_glCore_glDeleteFramebuffers; void* __blue_glCore_glGenFramebuffers; -void* __blue_glCore_glVertexArrayAttribFormat; +void* __blue_glCore_glCheckFramebufferStatus; +void* __blue_glCore_glFramebufferTexture1D; +void* __blue_glCore_glFramebufferTexture2D; +void* __blue_glCore_glFramebufferTexture3D; +void* __blue_glCore_glFramebufferRenderbuffer; +void* __blue_glCore_glGetFramebufferAttachmentParameteriv; +void* __blue_glCore_glGenerateMipmap; +void* __blue_glCore_glBlitFramebuffer; +void* __blue_glCore_glRenderbufferStorageMultisample; +void* __blue_glCore_glFramebufferTextureLayer; +void* __blue_glCore_glMapBufferRange; +void* __blue_glCore_glFlushMappedBufferRange; +void* __blue_glCore_glBindVertexArray; +void* __blue_glCore_glDeleteVertexArrays; +void* __blue_glCore_glGenVertexArrays; +void* __blue_glCore_glIsVertexArray; +void* __blue_glCore_glDrawArraysInstanced; +void* __blue_glCore_glDrawElementsInstanced; +void* __blue_glCore_glTexBuffer; +void* __blue_glCore_glPrimitiveRestartIndex; +void* __blue_glCore_glCopyBufferSubData; +void* __blue_glCore_glGetUniformIndices; void* __blue_glCore_glGetActiveUniformsiv; -void* __blue_glCore_glCompressedTextureSubImage1DEXT; -void* __blue_glCore_glIsRenderbuffer; -void* __blue_glCore_glPresentFrameKeyedNV; -void* __blue_glCore_glProgramUniformMatrix3fvEXT; -void* __blue_glCore_glVertexAttribL2i64vNV; -void* __blue_glCore_glFogCoordhvNV; -void* __blue_glCore_glVertexAttrib4ubv; -void* __blue_glCore_glPushClientAttribDefaultEXT; -void* __blue_glCore_glWindowPos3ivMESA; -void* __blue_glCore_glPrimitiveRestartIndexNV; -void* __blue_glCore_glCreatePerfQueryINTEL; -void* __blue_glCore_glGetProgramLocalParameterIuivNV; -void* __blue_glCore_glResizeBuffersMESA; -void* __blue_glCore_glVertexStream1fATI; -void* __blue_glCore_glProgramUniform2ui; -void* __blue_glCore_glSecondaryColor3iv; -void* __blue_glCore_glProgramParameters4dvNV; -void* __blue_glCore_glWindowPos3i; -void* __blue_glCore_glRectxvOES; -void* __blue_glCore_glMultiTexCoord4iARB; -void* __blue_glCore_glBeginConditionalRender; -void* __blue_glCore_glFreeObjectBufferATI; -void* __blue_glCore_glGetOcclusionQueryuivNV; -void* __blue_glCore_glColorP4ui; -void* __blue_glCore_glGetPathColorGenivNV; -void* __blue_glCore_glGetQueryiv; -void* __blue_glCore_glVertexAttribI2uiv; -void* __blue_glCore_glGetVertexArrayPointeri_vEXT; +void* __blue_glCore_glGetActiveUniformName; +void* __blue_glCore_glGetUniformBlockIndex; +void* __blue_glCore_glGetActiveUniformBlockiv; +void* __blue_glCore_glGetActiveUniformBlockName; +void* __blue_glCore_glUniformBlockBinding; +void* __blue_glCore_glDrawElementsBaseVertex; +void* __blue_glCore_glDrawRangeElementsBaseVertex; +void* __blue_glCore_glDrawElementsInstancedBaseVertex; +void* __blue_glCore_glMultiDrawElementsBaseVertex; +void* __blue_glCore_glProvokingVertex; +void* __blue_glCore_glFenceSync; +void* __blue_glCore_glIsSync; +void* __blue_glCore_glDeleteSync; +void* __blue_glCore_glClientWaitSync; +void* __blue_glCore_glWaitSync; +void* __blue_glCore_glGetInteger64v; +void* __blue_glCore_glGetSynciv; +void* __blue_glCore_glGetInteger64i_v; +void* __blue_glCore_glGetBufferParameteri64v; +void* __blue_glCore_glFramebufferTexture; +void* __blue_glCore_glTexImage2DMultisample; +void* __blue_glCore_glTexImage3DMultisample; +void* __blue_glCore_glGetMultisamplefv; +void* __blue_glCore_glSampleMaski; +void* __blue_glCore_glBindFragDataLocationIndexed; +void* __blue_glCore_glGetFragDataIndex; +void* __blue_glCore_glGenSamplers; +void* __blue_glCore_glDeleteSamplers; +void* __blue_glCore_glIsSampler; +void* __blue_glCore_glBindSampler; void* __blue_glCore_glSamplerParameteri; -void* __blue_glCore_glResumeTransformFeedbackNV; -void* __blue_glCore_glVertexAttribL1ui64vNV; -void* __blue_glCore_glPauseTransformFeedbackNV; -void* __blue_glCore_glVertexAttribs2fvNV; -void* __blue_glCore_glProgramUniform1iv; -void* __blue_glCore_glGetColorTableSGI; -void* __blue_glCore_glGetActiveAttrib; -void* __blue_glCore_glResetMinmax; -void* __blue_glCore_glBinormal3svEXT; -void* __blue_glCore_glVertexAttrib4fv; -void* __blue_glCore_glIndexxOES; -void* __blue_glCore_glMatrixMultTransposefEXT; -void* __blue_glCore_glNamedFramebufferTexture; -void* __blue_glCore_glVertexP2uiv; -void* __blue_glCore_glMemoryBarrier; -void* __blue_glCore_glGetGraphicsResetStatusARB; -void* __blue_glCore_glBindAttribLocation; -void* __blue_glCore_glVertexBlendEnviATI; -void* __blue_glCore_glAttachObjectARB; -void* __blue_glCore_glNormalStream3bvATI; -void* __blue_glCore_glNamedFramebufferTextureFaceEXT; -void* __blue_glCore_glGetConvolutionParameterivEXT; -void* __blue_glCore_glProgramPathFragmentInputGenNV; -void* __blue_glCore_glIsFramebufferEXT; -void* __blue_glCore_glIsVertexArray; -void* __blue_glCore_glGetVertexAttribIivEXT; -void* __blue_glCore_glTextureParameterIivEXT; -void* __blue_glCore_glGetnPixelMapuiv; -void* __blue_glCore_glGetInvariantFloatvEXT; -void* __blue_glCore_glAttachShader; -void* __blue_glCore_glSecondaryColor3i; -void* __blue_glCore_glTexCoord4hvNV; -void* __blue_glCore_glColorTableSGI; -void* __blue_glCore_glProgramUniform4uivEXT; -void* __blue_glCore_glPointSizexOES; -void* __blue_glCore_glTrackMatrixNV; -void* __blue_glCore_glMultiTexCoord1fv; -void* __blue_glCore_glSecondaryColorPointerListIBM; -void* __blue_glCore_glGenBuffersARB; -void* __blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN; -void* __blue_glCore_glCopyColorTable; -void* __blue_glCore_glTexPageCommitmentARB; -void* __blue_glCore_glSetFenceAPPLE; -void* __blue_glCore_glMultiTexCoord2dvARB; -void* __blue_glCore_glVertex4hvNV; -void* __blue_glCore_glBindVertexBuffer; -void* __blue_glCore_glVertex3xvOES; -void* __blue_glCore_glConvolutionParameterivEXT; -void* __blue_glCore_glProgramUniform3ui64vARB; -void* __blue_glCore_glProgramUniform2dv; -void* __blue_glCore_glWindowPos4sMESA; -void* __blue_glCore_glMultiTexImage1DEXT; -void* __blue_glCore_glRenderbufferStorage; -void* __blue_glCore_glConvolutionFilter2D; -void* __blue_glCore_glBinormal3bEXT; -void* __blue_glCore_glFragmentLightivSGIX; -void* __blue_glCore_glProgramUniform3iv; -void* __blue_glCore_glIsQuery; -void* __blue_glCore_glVertexStream2sATI; -void* __blue_glCore_glProgramUniform4iEXT; -void* __blue_glCore_glGetInvariantBooleanvEXT; -void* __blue_glCore_glSecondaryColorFormatNV; -void* __blue_glCore_glVertexAttrib4fNV; -void* __blue_glCore_glColorFragmentOp1ATI; -void* __blue_glCore_glTransformFeedbackBufferBase; -void* __blue_glCore_glGetTexParameteriv; -void* __blue_glCore_glGetVertexAttribIiv; -void* __blue_glCore_glEndOcclusionQueryNV; -void* __blue_glCore_glTransformFeedbackStreamAttribsNV; -void* __blue_glCore_glGetQueryBufferObjecti64v; -void* __blue_glCore_glStencilFillPathInstancedNV; -void* __blue_glCore_glDrawCommandsStatesNV; +void* __blue_glCore_glSamplerParameteriv; +void* __blue_glCore_glSamplerParameterf; +void* __blue_glCore_glSamplerParameterfv; +void* __blue_glCore_glSamplerParameterIiv; +void* __blue_glCore_glSamplerParameterIuiv; +void* __blue_glCore_glGetSamplerParameteriv; +void* __blue_glCore_glGetSamplerParameterIiv; void* __blue_glCore_glGetSamplerParameterfv; -void* __blue_glCore_glMultiTexCoord4fARB; -void* __blue_glCore_glUniform3ui64NV; -void* __blue_glCore_glVertexWeighthNV; -void* __blue_glCore_glWindowPos3ivARB; -void* __blue_glCore_glSecondaryColor3ivEXT; -void* __blue_glCore_glBindVertexArray; -void* __blue_glCore_glGetVertexAttribLui64vARB; -void* __blue_glCore_glUniform4i64NV; -void* __blue_glCore_glBlendBarrierNV; -void* __blue_glCore_glWindowPos3fvARB; -void* __blue_glCore_glBlendEquationSeparateiARB; -void* __blue_glCore_glGetVariantFloatvEXT; -void* __blue_glCore_glColorSubTableEXT; -void* __blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; -void* __blue_glCore_glGetProgramResourceiv; -void* __blue_glCore_glMultiTexCoord1f; -void* __blue_glCore_glGetNamedFramebufferAttachmentParameteriv; -void* __blue_glCore_glDeleteProgramsNV; -void* __blue_glCore_glGlobalAlphaFactoriSUN; -void* __blue_glCore_glGetFinalCombinerInputParameterfvNV; -void* __blue_glCore_glNormalStream3dATI; -void* __blue_glCore_glMultiTexEnvivEXT; -void* __blue_glCore_glTexCoord4xvOES; -void* __blue_glCore_glProgramUniform4dvEXT; -void* __blue_glCore_glProgramUniform2ui64vARB; -void* __blue_glCore_glBindBufferBaseNV; -void* __blue_glCore_glVertexAttrib4s; -void* __blue_glCore_glTexCoord2fVertex3fvSUN; -void* __blue_glCore_glMatrixMultdEXT; -void* __blue_glCore_glGetnMapdvARB; -void* __blue_glCore_glEnableVertexArrayEXT; -void* __blue_glCore_glConvolutionFilter1DEXT; -void* __blue_glCore_glMemoryBarrierEXT; -void* __blue_glCore_glNewObjectBufferATI; -void* __blue_glCore_glProgramUniform2fv; -void* __blue_glCore_glUniformMatrix4x3fv; -void* __blue_glCore_glGetHistogramParameterfv; -void* __blue_glCore_glFrameTerminatorGREMEDY; -void* __blue_glCore_glGetProgramLocalParameterfvARB; -void* __blue_glCore_glUnmapNamedBuffer; -void* __blue_glCore_glWindowPos2svARB; -void* __blue_glCore_glBindTextureEXT; -void* __blue_glCore_glVertexAttrib4svNV; -void* __blue_glCore_glPointParameterfSGIS; -void* __blue_glCore_glSecondaryColor3hvNV; -void* __blue_glCore_glColorTableParameterfv; -void* __blue_glCore_glNamedProgramLocalParameter4fEXT; -void* __blue_glCore_glGetTextureParameterivEXT; -void* __blue_glCore_glTestObjectAPPLE; -void* __blue_glCore_glGetIntegerui64vNV; -void* __blue_glCore_glIsVertexAttribEnabledAPPLE; -void* __blue_glCore_glActiveTextureARB; -void* __blue_glCore_glVertexAttrib3dARB; -void* __blue_glCore_glGetTextureHandleARB; -void* __blue_glCore_glGetColorTableEXT; -void* __blue_glCore_glDrawArraysEXT; -void* __blue_glCore_glImageTransformParameterfHP; -void* __blue_glCore_glActiveStencilFaceEXT; +void* __blue_glCore_glGetSamplerParameterIuiv; +void* __blue_glCore_glQueryCounter; +void* __blue_glCore_glGetQueryObjecti64v; +void* __blue_glCore_glGetQueryObjectui64v; +void* __blue_glCore_glVertexAttribDivisor; +void* __blue_glCore_glVertexAttribP1ui; +void* __blue_glCore_glVertexAttribP1uiv; +void* __blue_glCore_glVertexAttribP2ui; +void* __blue_glCore_glVertexAttribP2uiv; +void* __blue_glCore_glVertexAttribP3ui; +void* __blue_glCore_glVertexAttribP3uiv; +void* __blue_glCore_glVertexAttribP4ui; +void* __blue_glCore_glVertexAttribP4uiv; +void* __blue_glCore_glMinSampleShading; +void* __blue_glCore_glBlendEquationi; +void* __blue_glCore_glBlendEquationSeparatei; +void* __blue_glCore_glBlendFunci; +void* __blue_glCore_glBlendFuncSeparatei; +void* __blue_glCore_glDrawArraysIndirect; +void* __blue_glCore_glDrawElementsIndirect; +void* __blue_glCore_glUniform1d; +void* __blue_glCore_glUniform2d; +void* __blue_glCore_glUniform3d; +void* __blue_glCore_glUniform4d; +void* __blue_glCore_glUniform1dv; +void* __blue_glCore_glUniform2dv; +void* __blue_glCore_glUniform3dv; +void* __blue_glCore_glUniform4dv; +void* __blue_glCore_glUniformMatrix2dv; +void* __blue_glCore_glUniformMatrix3dv; +void* __blue_glCore_glUniformMatrix4dv; +void* __blue_glCore_glUniformMatrix2x3dv; +void* __blue_glCore_glUniformMatrix2x4dv; +void* __blue_glCore_glUniformMatrix3x2dv; void* __blue_glCore_glUniformMatrix3x4dv; -void* __blue_glCore_glProgramUniform4i64ARB; -void* __blue_glCore_glUniform3iv; -void* __blue_glCore_glGetPerfMonitorCountersAMD; -void* __blue_glCore_glFinishFenceAPPLE; -void* __blue_glCore_glUniform4ivARB; -void* __blue_glCore_glRenderbufferStorageMultisampleEXT; -void* __blue_glCore_glPointParameterfvARB; -void* __blue_glCore_glProgramLocalParameterI4uivNV; -void* __blue_glCore_glDeformSGIX; -void* __blue_glCore_glProgramUniformHandleui64vNV; -void* __blue_glCore_glMultiDrawRangeElementArrayAPPLE; -void* __blue_glCore_glGetnUniformfvARB; -void* __blue_glCore_glVertexAttribs3svNV; -void* __blue_glCore_glVertexAttrib1dvNV; -void* __blue_glCore_glVertexStream1fvATI; +void* __blue_glCore_glUniformMatrix4x2dv; +void* __blue_glCore_glUniformMatrix4x3dv; +void* __blue_glCore_glGetUniformdv; +void* __blue_glCore_glGetSubroutineUniformLocation; +void* __blue_glCore_glGetSubroutineIndex; +void* __blue_glCore_glGetActiveSubroutineUniformiv; +void* __blue_glCore_glGetActiveSubroutineUniformName; +void* __blue_glCore_glGetActiveSubroutineName; +void* __blue_glCore_glUniformSubroutinesuiv; +void* __blue_glCore_glGetUniformSubroutineuiv; +void* __blue_glCore_glGetProgramStageiv; +void* __blue_glCore_glPatchParameteri; +void* __blue_glCore_glPatchParameterfv; +void* __blue_glCore_glBindTransformFeedback; +void* __blue_glCore_glDeleteTransformFeedbacks; +void* __blue_glCore_glGenTransformFeedbacks; +void* __blue_glCore_glIsTransformFeedback; +void* __blue_glCore_glPauseTransformFeedback; +void* __blue_glCore_glResumeTransformFeedback; +void* __blue_glCore_glDrawTransformFeedback; +void* __blue_glCore_glDrawTransformFeedbackStream; +void* __blue_glCore_glBeginQueryIndexed; +void* __blue_glCore_glEndQueryIndexed; +void* __blue_glCore_glGetQueryIndexediv; +void* __blue_glCore_glReleaseShaderCompiler; +void* __blue_glCore_glShaderBinary; +void* __blue_glCore_glGetShaderPrecisionFormat; +void* __blue_glCore_glDepthRangef; +void* __blue_glCore_glClearDepthf; +void* __blue_glCore_glGetProgramBinary; +void* __blue_glCore_glProgramBinary; +void* __blue_glCore_glProgramParameteri; +void* __blue_glCore_glUseProgramStages; +void* __blue_glCore_glActiveShaderProgram; +void* __blue_glCore_glCreateShaderProgramv; +void* __blue_glCore_glBindProgramPipeline; +void* __blue_glCore_glDeleteProgramPipelines; +void* __blue_glCore_glGenProgramPipelines; void* __blue_glCore_glIsProgramPipeline; -void* __blue_glCore_glGetObjectBufferfvATI; -void* __blue_glCore_glBeginVertexShaderEXT; -void* __blue_glCore_glVertexAttrib4svARB; -void* __blue_glCore_glWindowPos2d; -void* __blue_glCore_glWriteMaskEXT; -void* __blue_glCore_glDrawRangeElements; -void* __blue_glCore_glGetFragDataIndex; -void* __blue_glCore_glDeleteTransformFeedbacksNV; -void* __blue_glCore_glProgramUniformMatrix2fvEXT; +void* __blue_glCore_glGetProgramPipelineiv; +void* __blue_glCore_glProgramUniform1i; +void* __blue_glCore_glProgramUniform1iv; +void* __blue_glCore_glProgramUniform1f; +void* __blue_glCore_glProgramUniform1fv; +void* __blue_glCore_glProgramUniform1d; +void* __blue_glCore_glProgramUniform1dv; +void* __blue_glCore_glProgramUniform1ui; +void* __blue_glCore_glProgramUniform1uiv; +void* __blue_glCore_glProgramUniform2i; +void* __blue_glCore_glProgramUniform2iv; +void* __blue_glCore_glProgramUniform2f; +void* __blue_glCore_glProgramUniform2fv; +void* __blue_glCore_glProgramUniform2d; +void* __blue_glCore_glProgramUniform2dv; +void* __blue_glCore_glProgramUniform2ui; +void* __blue_glCore_glProgramUniform2uiv; +void* __blue_glCore_glProgramUniform3i; +void* __blue_glCore_glProgramUniform3iv; +void* __blue_glCore_glProgramUniform3f; +void* __blue_glCore_glProgramUniform3fv; +void* __blue_glCore_glProgramUniform3d; +void* __blue_glCore_glProgramUniform3dv; void* __blue_glCore_glProgramUniform3ui; -void* __blue_glCore_glGetTransformFeedbacki_v; -void* __blue_glCore_glUniformMatrix3x2dv; -void* __blue_glCore_glGetMapxvOES; -void* __blue_glCore_glMemoryBarrierByRegion; -void* __blue_glCore_glNamedFramebufferDrawBuffer; -void* __blue_glCore_glIsBufferResidentNV; -void* __blue_glCore_glStencilOpSeparate; -void* __blue_glCore_glInvalidateNamedFramebufferSubData; -void* __blue_glCore_glColor3hNV; -void* __blue_glCore_glTextureMaterialEXT; -void* __blue_glCore_glCompressedTextureSubImage2D; -void* __blue_glCore_glMultiTexGeniEXT; -void* __blue_glCore_glSecondaryColor3usvEXT; +void* __blue_glCore_glProgramUniform3uiv; +void* __blue_glCore_glProgramUniform4i; +void* __blue_glCore_glProgramUniform4iv; +void* __blue_glCore_glProgramUniform4f; +void* __blue_glCore_glProgramUniform4fv; +void* __blue_glCore_glProgramUniform4d; +void* __blue_glCore_glProgramUniform4dv; +void* __blue_glCore_glProgramUniform4ui; +void* __blue_glCore_glProgramUniform4uiv; +void* __blue_glCore_glProgramUniformMatrix2fv; +void* __blue_glCore_glProgramUniformMatrix3fv; +void* __blue_glCore_glProgramUniformMatrix4fv; +void* __blue_glCore_glProgramUniformMatrix2dv; +void* __blue_glCore_glProgramUniformMatrix3dv; +void* __blue_glCore_glProgramUniformMatrix4dv; +void* __blue_glCore_glProgramUniformMatrix2x3fv; +void* __blue_glCore_glProgramUniformMatrix3x2fv; +void* __blue_glCore_glProgramUniformMatrix2x4fv; +void* __blue_glCore_glProgramUniformMatrix4x2fv; +void* __blue_glCore_glProgramUniformMatrix3x4fv; +void* __blue_glCore_glProgramUniformMatrix4x3fv; +void* __blue_glCore_glProgramUniformMatrix2x3dv; +void* __blue_glCore_glProgramUniformMatrix3x2dv; +void* __blue_glCore_glProgramUniformMatrix2x4dv; +void* __blue_glCore_glProgramUniformMatrix4x2dv; +void* __blue_glCore_glProgramUniformMatrix3x4dv; +void* __blue_glCore_glProgramUniformMatrix4x3dv; +void* __blue_glCore_glValidateProgramPipeline; +void* __blue_glCore_glGetProgramPipelineInfoLog; +void* __blue_glCore_glVertexAttribL1d; +void* __blue_glCore_glVertexAttribL2d; +void* __blue_glCore_glVertexAttribL3d; +void* __blue_glCore_glVertexAttribL4d; +void* __blue_glCore_glVertexAttribL1dv; +void* __blue_glCore_glVertexAttribL2dv; +void* __blue_glCore_glVertexAttribL3dv; +void* __blue_glCore_glVertexAttribL4dv; +void* __blue_glCore_glVertexAttribLPointer; +void* __blue_glCore_glGetVertexAttribLdv; +void* __blue_glCore_glViewportArrayv; +void* __blue_glCore_glViewportIndexedf; +void* __blue_glCore_glViewportIndexedfv; +void* __blue_glCore_glScissorArrayv; +void* __blue_glCore_glScissorIndexed; +void* __blue_glCore_glScissorIndexedv; +void* __blue_glCore_glDepthRangeArrayv; +void* __blue_glCore_glDepthRangeIndexed; +void* __blue_glCore_glGetFloati_v; +void* __blue_glCore_glGetDoublei_v; +void* __blue_glCore_glDrawArraysInstancedBaseInstance; +void* __blue_glCore_glDrawElementsInstancedBaseInstance; +void* __blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance; +void* __blue_glCore_glGetInternalformativ; +void* __blue_glCore_glGetActiveAtomicCounterBufferiv; +void* __blue_glCore_glBindImageTexture; +void* __blue_glCore_glMemoryBarrier; +void* __blue_glCore_glTexStorage1D; +void* __blue_glCore_glTexStorage2D; +void* __blue_glCore_glTexStorage3D; +void* __blue_glCore_glDrawTransformFeedbackInstanced; +void* __blue_glCore_glDrawTransformFeedbackStreamInstanced; +void* __blue_glCore_glClearBufferData; +void* __blue_glCore_glClearBufferSubData; +void* __blue_glCore_glDispatchCompute; +void* __blue_glCore_glDispatchComputeIndirect; +void* __blue_glCore_glCopyImageSubData; +void* __blue_glCore_glFramebufferParameteri; +void* __blue_glCore_glGetFramebufferParameteriv; +void* __blue_glCore_glGetInternalformati64v; +void* __blue_glCore_glInvalidateTexSubImage; +void* __blue_glCore_glInvalidateTexImage; +void* __blue_glCore_glInvalidateBufferSubData; +void* __blue_glCore_glInvalidateBufferData; +void* __blue_glCore_glInvalidateFramebuffer; +void* __blue_glCore_glInvalidateSubFramebuffer; +void* __blue_glCore_glMultiDrawArraysIndirect; +void* __blue_glCore_glMultiDrawElementsIndirect; +void* __blue_glCore_glGetProgramInterfaceiv; +void* __blue_glCore_glGetProgramResourceIndex; void* __blue_glCore_glGetProgramResourceName; -void* __blue_glCore_glTextureStorageSparseAMD; -void* __blue_glCore_glPixelStorei; -void* __blue_glCore_glGetBooleani_v; -void* __blue_glCore_glGetPathCoordsNV; -void* __blue_glCore_glVertexAttrib3svNV; -void* __blue_glCore_glUniformui64NV; -void* __blue_glCore_glIsImageHandleResidentNV; -void* __blue_glCore_glBeginConditionalRenderNV; -void* __blue_glCore_glNamedFramebufferParameteriEXT; -void* __blue_glCore_glIsVertexArrayAPPLE; -void* __blue_glCore_glPointParameterfvEXT; -void* __blue_glCore_glGetnMapfvARB; -void* __blue_glCore_glCopyColorSubTable; -void* __blue_glCore_glVariantbvEXT; -void* __blue_glCore_glTextureParameterIuiv; -void* __blue_glCore_glPNTrianglesiATI; -void* __blue_glCore_glBlendFunc; -void* __blue_glCore_glVertexAttrib4uiv; -void* __blue_glCore_glUniform2ui; -void* __blue_glCore_glBlendColor; -void* __blue_glCore_glViewport; -void* __blue_glCore_glWindowPos2fvARB; -void* __blue_glCore_glSampleCoverage; -void* __blue_glCore_glSecondaryColor3ubv; -void* __blue_glCore_glColor4xOES; -void* __blue_glCore_glVertexAttribL1dEXT; -void* __blue_glCore_glMultTransposeMatrixf; -void* __blue_glCore_glGetVertexArrayIntegeri_vEXT; -void* __blue_glCore_glCullParameterfvEXT; -void* __blue_glCore_glMapNamedBufferRangeEXT; -void* __blue_glCore_glTextureImage3DEXT; -void* __blue_glCore_glBufferAddressRangeNV; -void* __blue_glCore_glGetVertexAttribdv; -void* __blue_glCore_glNamedFramebufferSampleLocationsfvARB; -void* __blue_glCore_glMultiTexCoord2i; -void* __blue_glCore_glBindFramebufferEXT; -void* __blue_glCore_glTexParameterfv; -void* __blue_glCore_glGetProgramNamedParameterfvNV; -void* __blue_glCore_glTextureStorage3DEXT; -void* __blue_glCore_glGetDebugMessageLogAMD; -void* __blue_glCore_glTexCoord1hvNV; -void* __blue_glCore_glRenderbufferStorageMultisampleCoverageNV; -void* __blue_glCore_glProgramUniform3i64vARB; -void* __blue_glCore_glFragmentMaterialfvSGIX; -void* __blue_glCore_glGetImageHandleARB; -void* __blue_glCore_glVertexAttribs3fvNV; -void* __blue_glCore_glTexSubImage4DSGIS; -void* __blue_glCore_glListParameteriSGIX; -void* __blue_glCore_glPixelTransformParameterfEXT; -void* __blue_glCore_glMapParameterfvNV; -void* __blue_glCore_glProgramUniform3dv; -void* __blue_glCore_glUniformMatrix3fv; -void* __blue_glCore_glProgramUniform4fEXT; -void* __blue_glCore_glMultiTexCoord2hNV; -void* __blue_glCore_glVertexAttribI4uiv; -void* __blue_glCore_glSecondaryColor3b; -void* __blue_glCore_glFogxvOES; -void* __blue_glCore_glGlobalAlphaFactorubSUN; -void* __blue_glCore_glVertexAttribI4svEXT; -void* __blue_glCore_glSecondaryColor3sv; -void* __blue_glCore_glProgramUniformMatrix2x3dvEXT; -void* __blue_glCore_glTextureBarrier; -void* __blue_glCore_glCreateSamplers; -void* __blue_glCore_glVertexAttribP2ui; -void* __blue_glCore_glGetTexParameterIiv; -void* __blue_glCore_glConvolutionParameterfvEXT; -void* __blue_glCore_glPathGlyphIndexArrayNV; -void* __blue_glCore_glCopyTexSubImage2D; -void* __blue_glCore_glVertexArrayParameteriAPPLE; -void* __blue_glCore_glGetnConvolutionFilterARB; -void* __blue_glCore_glVariantfvEXT; -void* __blue_glCore_glGetMultisamplefvNV; -void* __blue_glCore_glQueryObjectParameteruiAMD; -void* __blue_glCore_glMatrixIndexPointerARB; -void* __blue_glCore_glGetQueryObjectuivARB; -void* __blue_glCore_glColorFormatNV; -void* __blue_glCore_glMultiTexGenfvEXT; -void* __blue_glCore_glGetUniformfvARB; -void* __blue_glCore_glTexCoord3hNV; -void* __blue_glCore_glPathGlyphRangeNV; -void* __blue_glCore_glCopyTextureSubImage3DEXT; -void* __blue_glCore_glColor3xOES; -void* __blue_glCore_glVertexAttrib4hNV; -void* __blue_glCore_glProgramUniformui64NV; -void* __blue_glCore_glVertexArrayVertexAttribLFormatEXT; -void* __blue_glCore_glGetMinmaxParameterivEXT; -void* __blue_glCore_glWindowPos3iMESA; +void* __blue_glCore_glGetProgramResourceiv; +void* __blue_glCore_glGetProgramResourceLocation; +void* __blue_glCore_glGetProgramResourceLocationIndex; +void* __blue_glCore_glShaderStorageBlockBinding; +void* __blue_glCore_glTexBufferRange; +void* __blue_glCore_glTexStorage2DMultisample; +void* __blue_glCore_glTexStorage3DMultisample; +void* __blue_glCore_glTextureView; +void* __blue_glCore_glBindVertexBuffer; +void* __blue_glCore_glVertexAttribFormat; +void* __blue_glCore_glVertexAttribIFormat; void* __blue_glCore_glVertexAttribLFormat; -void* __blue_glCore_glGetObjectParameterfvARB; -void* __blue_glCore_glStencilFillPathNV; -void* __blue_glCore_glEvalCoord1xvOES; -void* __blue_glCore_glUniform4d; -void* __blue_glCore_glGetTextureHandleNV; -void* __blue_glCore_glGetUniformuivEXT; -void* __blue_glCore_glIsTextureEXT; -void* __blue_glCore_glProgramUniform2d; -void* __blue_glCore_glGetnUniformuivARB; -void* __blue_glCore_glIsShader; -void* __blue_glCore_glGetVertexArrayIndexed64iv; -void* __blue_glCore_glGetnHistogramARB; -void* __blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN; -void* __blue_glCore_glVertexAttribI2ivEXT; -void* __blue_glCore_glTexSubImage2DEXT; -void* __blue_glCore_glGetFragmentMaterialivSGIX; +void* __blue_glCore_glVertexAttribBinding; +void* __blue_glCore_glVertexBindingDivisor; +void* __blue_glCore_glDebugMessageControl; +void* __blue_glCore_glDebugMessageInsert; +void* __blue_glCore_glDebugMessageCallback; +void* __blue_glCore_glGetDebugMessageLog; +void* __blue_glCore_glPushDebugGroup; +void* __blue_glCore_glPopDebugGroup; +void* __blue_glCore_glObjectLabel; +void* __blue_glCore_glGetObjectLabel; +void* __blue_glCore_glObjectPtrLabel; +void* __blue_glCore_glGetObjectPtrLabel; +void* __blue_glCore_glBufferStorage; +void* __blue_glCore_glClearTexImage; +void* __blue_glCore_glClearTexSubImage; +void* __blue_glCore_glBindBuffersBase; +void* __blue_glCore_glBindBuffersRange; +void* __blue_glCore_glBindTextures; +void* __blue_glCore_glBindSamplers; +void* __blue_glCore_glBindImageTextures; +void* __blue_glCore_glBindVertexBuffers; +void* __blue_glCore_glClipControl; +void* __blue_glCore_glCreateTransformFeedbacks; +void* __blue_glCore_glTransformFeedbackBufferBase; +void* __blue_glCore_glTransformFeedbackBufferRange; +void* __blue_glCore_glGetTransformFeedbackiv; +void* __blue_glCore_glGetTransformFeedbacki_v; +void* __blue_glCore_glGetTransformFeedbacki64_v; +void* __blue_glCore_glCreateBuffers; +void* __blue_glCore_glNamedBufferStorage; +void* __blue_glCore_glNamedBufferData; +void* __blue_glCore_glNamedBufferSubData; +void* __blue_glCore_glCopyNamedBufferSubData; +void* __blue_glCore_glClearNamedBufferData; +void* __blue_glCore_glClearNamedBufferSubData; +void* __blue_glCore_glMapNamedBuffer; +void* __blue_glCore_glMapNamedBufferRange; +void* __blue_glCore_glUnmapNamedBuffer; +void* __blue_glCore_glFlushMappedNamedBufferRange; +void* __blue_glCore_glGetNamedBufferParameteriv; +void* __blue_glCore_glGetNamedBufferParameteri64v; +void* __blue_glCore_glGetNamedBufferPointerv; +void* __blue_glCore_glGetNamedBufferSubData; +void* __blue_glCore_glCreateFramebuffers; +void* __blue_glCore_glNamedFramebufferRenderbuffer; +void* __blue_glCore_glNamedFramebufferParameteri; +void* __blue_glCore_glNamedFramebufferTexture; +void* __blue_glCore_glNamedFramebufferTextureLayer; +void* __blue_glCore_glNamedFramebufferDrawBuffer; +void* __blue_glCore_glNamedFramebufferDrawBuffers; +void* __blue_glCore_glNamedFramebufferReadBuffer; +void* __blue_glCore_glInvalidateNamedFramebufferData; +void* __blue_glCore_glInvalidateNamedFramebufferSubData; void* __blue_glCore_glClearNamedFramebufferiv; -void* __blue_glCore_glMatrixMult3x3fNV; -void* __blue_glCore_glGetQueryBufferObjectiv; -void* __blue_glCore_glVideoCaptureStreamParameterfvNV; -void* __blue_glCore_glTexImage3DMultisample; -void* __blue_glCore_glVertexArraySecondaryColorOffsetEXT; -void* __blue_glCore_glVariantusvEXT; -void* __blue_glCore_glDrawArraysInstanced; -void* __blue_glCore_glProgramUniformMatrix2x4dvEXT; -void* __blue_glCore_glProgramBufferParametersIivNV; -void* __blue_glCore_glViewportArrayv; -void* __blue_glCore_glTangent3svEXT; -void* __blue_glCore_glReplacementCodeuiVertex3fSUN; -void* __blue_glCore_glSharpenTexFuncSGIS; -void* __blue_glCore_glNormalFormatNV; -void* __blue_glCore_glVertexAttribL3dv; -void* __blue_glCore_glNamedStringARB; -void* __blue_glCore_glVertexArrayVertexAttribFormatEXT; -void* __blue_glCore_glMultiTexCoordP3ui; -void* __blue_glCore_glMultiTexSubImage3DEXT; -void* __blue_glCore_glUniform2fvARB; -void* __blue_glCore_glGetPixelMapxv; -void* __blue_glCore_glTangent3ivEXT; -void* __blue_glCore_glGetLocalConstantIntegervEXT; -void* __blue_glCore_glPresentFrameDualFillNV; -void* __blue_glCore_glEndVertexShaderEXT; -void* __blue_glCore_glVertexArrayVertexBuffer; -void* __blue_glCore_glMakeTextureHandleNonResidentNV; -void* __blue_glCore_glVertexAttribI3uiEXT; -void* __blue_glCore_glBinormal3bvEXT; -void* __blue_glCore_glPixelTexGenParameterfSGIS; -void* __blue_glCore_glMultiTexGenivEXT; -void* __blue_glCore_glGetVideoivNV; -void* __blue_glCore_glMultiTexCoordP2ui; -void* __blue_glCore_glDeletePerfQueryINTEL; -void* __blue_glCore_glDepthBoundsdNV; -void* __blue_glCore_glPixelTransferxOES; -void* __blue_glCore_glCombinerOutputNV; -void* __blue_glCore_glCopyTextureSubImage1D; -void* __blue_glCore_glVertexAttribI4iv; -void* __blue_glCore_glCopyTexImage2DEXT; -void* __blue_glCore_glBindLightParameterEXT; -void* __blue_glCore_glMultiDrawElementsBaseVertex; -void* __blue_glCore_glProgramUniform2uivEXT; -void* __blue_glCore_glDeletePerfMonitorsAMD; -void* __blue_glCore_glCopyImageSubData; -void* __blue_glCore_glPathCoverDepthFuncNV; -void* __blue_glCore_glGetFramebufferAttachmentParameteriv; -void* __blue_glCore_glRectxOES; -void* __blue_glCore_glTagSampleBufferSGIX; -void* __blue_glCore_glVertexStream3svATI; -void* __blue_glCore_glGetPathTexGenfvNV; -void* __blue_glCore_glOrthofOES; -void* __blue_glCore_glCopyTexImage2D; -void* __blue_glCore_glTexCoord2fColor4ubVertex3fSUN; -void* __blue_glCore_glMultTransposeMatrixdARB; -void* __blue_glCore_glProgramUniform3i; -void* __blue_glCore_glArrayObjectATI; -void* __blue_glCore_glMatrixRotatedEXT; -void* __blue_glCore_glTexCoordP2ui; -void* __blue_glCore_glPassTexCoordATI; -void* __blue_glCore_glIsTexture; -void* __blue_glCore_glCompressedTexSubImage3DARB; -void* __blue_glCore_glDepthRangexOES; -void* __blue_glCore_glImageTransformParameterivHP; -void* __blue_glCore_glMultTransposeMatrixfARB; -void* __blue_glCore_glUniformHandleui64vARB; -void* __blue_glCore_glGenTransformFeedbacks; -void* __blue_glCore_glTextureStorage1D; -void* __blue_glCore_glGetVertexAttribivNV; -void* __blue_glCore_glReplacementCodePointerSUN; -void* __blue_glCore_glVertexAttribI3uiv; -void* __blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN; -void* __blue_glCore_glVertexAttribL2dEXT; -void* __blue_glCore_glProgramUniform3ui64NV; -void* __blue_glCore_glProgramUniform3i64NV; -void* __blue_glCore_glGetNamedRenderbufferParameterivEXT; -void* __blue_glCore_glTangent3bvEXT; -void* __blue_glCore_glProgramUniform1dvEXT; -void* __blue_glCore_glMatrixLoadTransposedEXT; -void* __blue_glCore_glGetVertexAttribLdv; -void* __blue_glCore_glVertexStream2dATI; -void* __blue_glCore_glGetFragmentLightivSGIX; -void* __blue_glCore_glGetMinmaxEXT; -void* __blue_glCore_glFlushStaticDataIBM; -void* __blue_glCore_glShaderOp1EXT; -void* __blue_glCore_glIsStateNV; -void* __blue_glCore_glGetProgramEnvParameterIuivNV; -void* __blue_glCore_glGetVideoCaptureivNV; -void* __blue_glCore_glPathStringNV; -void* __blue_glCore_glListParameterfSGIX; -void* __blue_glCore_glFeedbackBufferxOES; -void* __blue_glCore_glGetNextPerfQueryIdINTEL; -void* __blue_glCore_glGetVariantArrayObjectfvATI; -void* __blue_glCore_glUniform3d; -void* __blue_glCore_glMultiTexParameterfvEXT; -void* __blue_glCore_glGetLocalConstantFloatvEXT; -void* __blue_glCore_glMultiTexImage3DEXT; -void* __blue_glCore_glWindowPos3fMESA; -void* __blue_glCore_glCullParameterdvEXT; -void* __blue_glCore_glGetTrackMatrixivNV; -void* __blue_glCore_glBlendFuncSeparateINGR; -void* __blue_glCore_glUniformMatrix2fvARB; -void* __blue_glCore_glDrawArraysInstancedEXT; -void* __blue_glCore_glMultiTexCoord3iARB; -void* __blue_glCore_glGetNamedFramebufferParameterivEXT; -void* __blue_glCore_glGenTextures; -void* __blue_glCore_glIsPointInStrokePathNV; -void* __blue_glCore_glDrawTransformFeedbackNV; -void* __blue_glCore_glGetActiveUniformARB; +void* __blue_glCore_glClearNamedFramebufferuiv; void* __blue_glCore_glClearNamedFramebufferfv; -void* __blue_glCore_glBeginVideoCaptureNV; -void* __blue_glCore_glCopyTexImage1D; -void* __blue_glCore_glTexStorage1D; -void* __blue_glCore_glProgramUniform3ui64ARB; -void* __blue_glCore_glTextureSubImage2D; -void* __blue_glCore_glMultiTexCoord4bOES; -void* __blue_glCore_glMultiDrawArraysIndirectCountARB; -void* __blue_glCore_glProgramUniformMatrix3dvEXT; -void* __blue_glCore_glVertexAttrib2s; -void* __blue_glCore_glGetDoublev; -void* __blue_glCore_glVertexAttrib3svARB; -void* __blue_glCore_glProgramNamedParameter4dvNV; +void* __blue_glCore_glClearNamedFramebufferfi; +void* __blue_glCore_glBlitNamedFramebuffer; +void* __blue_glCore_glCheckNamedFramebufferStatus; +void* __blue_glCore_glGetNamedFramebufferParameteriv; +void* __blue_glCore_glGetNamedFramebufferAttachmentParameteriv; +void* __blue_glCore_glCreateRenderbuffers; +void* __blue_glCore_glNamedRenderbufferStorage; +void* __blue_glCore_glNamedRenderbufferStorageMultisample; +void* __blue_glCore_glGetNamedRenderbufferParameteriv; +void* __blue_glCore_glCreateTextures; +void* __blue_glCore_glTextureBuffer; void* __blue_glCore_glTextureBufferRange; -void* __blue_glCore_glFramebufferTextureFaceEXT; -void* __blue_glCore_glBindBufferRange; -void* __blue_glCore_glEnablei; -void* __blue_glCore_glGetTextureParameterIuivEXT; -void* __blue_glCore_glGetProgramInterfaceiv; -void* __blue_glCore_glClientAttribDefaultEXT; -void* __blue_glCore_glVertexAttribL3ui64NV; -void* __blue_glCore_glWindowPos2dARB; -void* __blue_glCore_glVertexAttribI2uiEXT; -void* __blue_glCore_glBindVertexBuffers; -void* __blue_glCore_glProgramUniformMatrix3x4fv; -void* __blue_glCore_glGetTexLevelParameterxvOES; -void* __blue_glCore_glVertexAttribPointer; -void* __blue_glCore_glTextureImage1DEXT; -void* __blue_glCore_glVertexAttribs4dvNV; -void* __blue_glCore_glSecondaryColor3svEXT; -void* __blue_glCore_glGetQueryivARB; -void* __blue_glCore_glTexCoord4bOES; -void* __blue_glCore_glProgramUniform1fEXT; -void* __blue_glCore_glVertexP2ui; -void* __blue_glCore_glSetInvariantEXT; -void* __blue_glCore_glActiveShaderProgram; -void* __blue_glCore_glVertexAttribL1ui64NV; -void* __blue_glCore_glGetVariantBooleanvEXT; -void* __blue_glCore_glAreTexturesResidentEXT; -void* __blue_glCore_glMatrixMultTranspose3x3fNV; -void* __blue_glCore_glProgramUniform2f; -void* __blue_glCore_glClearNamedBufferDataEXT; -void* __blue_glCore_glIsOcclusionQueryNV; -void* __blue_glCore_glVertexAttribI4bv; -void* __blue_glCore_glTexCoord2xvOES; -void* __blue_glCore_glVertexAttrib4Nubv; -void* __blue_glCore_glVertexAttrib3hNV; -void* __blue_glCore_glMultiTexCoord2xvOES; -void* __blue_glCore_glFramebufferTextureEXT; -void* __blue_glCore_glProgramUniformMatrix3fv; -void* __blue_glCore_glGetInternalformatSampleivNV; -void* __blue_glCore_glPathSubCommandsNV; -void* __blue_glCore_glStencilStrokePathNV; -void* __blue_glCore_glPathParameterfNV; -void* __blue_glCore_glActiveProgramEXT; -void* __blue_glCore_glClampColorARB; -void* __blue_glCore_glVertexAttribI2uivEXT; -void* __blue_glCore_glVertexAttribL1ui64vARB; -void* __blue_glCore_glValidateProgram; -void* __blue_glCore_glMultiTexCoord2xOES; -void* __blue_glCore_glFogCoordf; -void* __blue_glCore_glGetError; -void* __blue_glCore_glSpriteParameterfSGIX; -void* __blue_glCore_glVertexAttrib3dvNV; -void* __blue_glCore_glMultiTexCoord3bOES; -void* __blue_glCore_glGetTexParameterIuivEXT; -void* __blue_glCore_glIndexMaterialEXT; -void* __blue_glCore_glUniform1iARB; -void* __blue_glCore_glVertexAttrib4NivARB; +void* __blue_glCore_glTextureStorage1D; +void* __blue_glCore_glTextureStorage2D; +void* __blue_glCore_glTextureStorage3D; +void* __blue_glCore_glTextureStorage2DMultisample; +void* __blue_glCore_glTextureStorage3DMultisample; +void* __blue_glCore_glTextureSubImage1D; +void* __blue_glCore_glTextureSubImage2D; +void* __blue_glCore_glTextureSubImage3D; +void* __blue_glCore_glCompressedTextureSubImage1D; +void* __blue_glCore_glCompressedTextureSubImage2D; +void* __blue_glCore_glCompressedTextureSubImage3D; +void* __blue_glCore_glCopyTextureSubImage1D; +void* __blue_glCore_glCopyTextureSubImage2D; +void* __blue_glCore_glCopyTextureSubImage3D; +void* __blue_glCore_glTextureParameterf; +void* __blue_glCore_glTextureParameterfv; void* __blue_glCore_glTextureParameteri; -void* __blue_glCore_glSecondaryColor3d; -void* __blue_glCore_glWindowPos2sv; -void* __blue_glCore_glDrawBuffersARB; -void* __blue_glCore_glGetMultiTexParameterIuivEXT; -void* __blue_glCore_glGetConvolutionFilter; +void* __blue_glCore_glTextureParameterIiv; +void* __blue_glCore_glTextureParameterIuiv; +void* __blue_glCore_glTextureParameteriv; +void* __blue_glCore_glGenerateTextureMipmap; +void* __blue_glCore_glBindTextureUnit; +void* __blue_glCore_glGetTextureImage; +void* __blue_glCore_glGetCompressedTextureImage; +void* __blue_glCore_glGetTextureLevelParameterfv; +void* __blue_glCore_glGetTextureLevelParameteriv; +void* __blue_glCore_glGetTextureParameterfv; +void* __blue_glCore_glGetTextureParameterIiv; +void* __blue_glCore_glGetTextureParameterIuiv; +void* __blue_glCore_glGetTextureParameteriv; +void* __blue_glCore_glCreateVertexArrays; void* __blue_glCore_glDisableVertexArrayAttrib; -void* __blue_glCore_glProgramUniform4i; -void* __blue_glCore_glCheckNamedFramebufferStatusEXT; -void* __blue_glCore_glMultiTexCoord3xOES; -void* __blue_glCore_glDrawElementsInstancedEXT; -void* __blue_glCore_glColor4fNormal3fVertex3fvSUN; -void* __blue_glCore_glIsTransformFeedbackNV; -void* __blue_glCore_glDrawTransformFeedbackStreamInstanced; -void* __blue_glCore_glMapNamedBufferEXT; -void* __blue_glCore_glVertexArrayIndexOffsetEXT; -void* __blue_glCore_glPolygonMode; -void* __blue_glCore_glGetDetailTexFuncSGIS; -void* __blue_glCore_glMultiTexCoord2iv; -void* __blue_glCore_glGetHistogramParameterfvEXT; -void* __blue_glCore_glProgramUniform4fvEXT; -void* __blue_glCore_glDetailTexFuncSGIS; -void* __blue_glCore_glTexParameterIivEXT; -void* __blue_glCore_glNamedFramebufferTextureLayerEXT; -void* __blue_glCore_glDisablei; -void* __blue_glCore_glUniform4fv; -void* __blue_glCore_glVertexAttrib1hNV; -void* __blue_glCore_glWeightsvARB; -void* __blue_glCore_glSampleMaskIndexedNV; -void* __blue_glCore_glVertexAttrib4dvARB; -void* __blue_glCore_glBeginFragmentShaderATI; -void* __blue_glCore_glNamedProgramLocalParameterI4ivEXT; -void* __blue_glCore_glGetConvolutionParameteriv; -void* __blue_glCore_glClipControl; -void* __blue_glCore_glBinormal3fEXT; -void* __blue_glCore_glColor4ubVertex2fSUN; -void* __blue_glCore_glCompressedTexImage3D; -void* __blue_glCore_glGetTextureSamplerHandleARB; -void* __blue_glCore_glUniform3uiv; -void* __blue_glCore_glGetVertexAttribPointerv; -void* __blue_glCore_glGenBuffers; -void* __blue_glCore_glVertexAttrib3dvARB; -void* __blue_glCore_glFlushVertexArrayRangeNV; -void* __blue_glCore_glGetProgramNamedParameterdvNV; -void* __blue_glCore_glConvolutionParameterf; -void* __blue_glCore_glVertex2bOES; -void* __blue_glCore_glGetObjectPtrLabel; -void* __blue_glCore_glBeginTransformFeedbackNV; +void* __blue_glCore_glEnableVertexArrayAttrib; +void* __blue_glCore_glVertexArrayElementBuffer; +void* __blue_glCore_glVertexArrayVertexBuffer; +void* __blue_glCore_glVertexArrayVertexBuffers; +void* __blue_glCore_glVertexArrayAttribBinding; +void* __blue_glCore_glVertexArrayAttribFormat; +void* __blue_glCore_glVertexArrayAttribIFormat; +void* __blue_glCore_glVertexArrayAttribLFormat; +void* __blue_glCore_glVertexArrayBindingDivisor; +void* __blue_glCore_glGetVertexArrayiv; +void* __blue_glCore_glGetVertexArrayIndexediv; +void* __blue_glCore_glGetVertexArrayIndexed64iv; +void* __blue_glCore_glCreateSamplers; +void* __blue_glCore_glCreateProgramPipelines; +void* __blue_glCore_glCreateQueries; +void* __blue_glCore_glGetQueryBufferObjecti64v; +void* __blue_glCore_glGetQueryBufferObjectiv; +void* __blue_glCore_glGetQueryBufferObjectui64v; +void* __blue_glCore_glGetQueryBufferObjectuiv; +void* __blue_glCore_glMemoryBarrierByRegion; void* __blue_glCore_glGetTextureSubImage; -void* __blue_glCore_glGetFramebufferAttachmentParameterivEXT; -void* __blue_glCore_glGetInteger64v; -void* __blue_glCore_glGetUniformLocation; -void* __blue_glCore_glMultiTexCoord2fv; -void* __blue_glCore_glProgramUniform2uiv; -void* __blue_glCore_glGetTexParameterIuiv; -void* __blue_glCore_glVertexAttribI4ui; -void* __blue_glCore_glTexGenxvOES; -void* __blue_glCore_glVertex4bOES; -void* __blue_glCore_glCopyTexSubImage2DEXT; -void* __blue_glCore_glDrawBuffersATI; -void* __blue_glCore_glPathGlyphsNV; -void* __blue_glCore_glMatrixIndexuivARB; -void* __blue_glCore_glNamedProgramLocalParameterI4uiEXT; -void* __blue_glCore_glWindowPos2iv; -void* __blue_glCore_glLightModelxOES; -void* __blue_glCore_glBindFragmentShaderATI; -void* __blue_glCore_glInvalidateTexSubImage; -void* __blue_glCore_glVertexAttrib4sARB; -void* __blue_glCore_glGetProgramiv; -void* __blue_glCore_glGetVideoCaptureStreamivNV; -void* __blue_glCore_glTextureParameterfvEXT; -void* __blue_glCore_glPNTrianglesfATI; -void* __blue_glCore_glCheckNamedFramebufferStatus; -void* __blue_glCore_glUniform4uiEXT; -void* __blue_glCore_glVertexAttrib2sv; -void* __blue_glCore_glClearBufferData; -void* __blue_glCore_glShaderSourceARB; -void* __blue_glCore_glObjectPurgeableAPPLE; -void* __blue_glCore_glProgramUniform2iEXT; -void* __blue_glCore_glGetStringi; -void* __blue_glCore_glTexFilterFuncSGIS; -void* __blue_glCore_glVertexArrayVertexAttribLOffsetEXT; -void* __blue_glCore_glProgramLocalParametersI4uivNV; -void* __blue_glCore_glGetHistogramEXT; +void* __blue_glCore_glGetCompressedTextureSubImage; +void* __blue_glCore_glGetGraphicsResetStatus; +void* __blue_glCore_glGetnCompressedTexImage; +void* __blue_glCore_glGetnTexImage; +void* __blue_glCore_glGetnUniformdv; +void* __blue_glCore_glGetnUniformfv; +void* __blue_glCore_glGetnUniformiv; +void* __blue_glCore_glGetnUniformuiv; +void* __blue_glCore_glReadnPixels; +void* __blue_glCore_glTextureBarrier; +void* __blue_glCore_glGetTextureHandleARB; +void* __blue_glCore_glGetTextureSamplerHandleARB; +void* __blue_glCore_glMakeTextureHandleResidentARB; +void* __blue_glCore_glMakeTextureHandleNonResidentARB; +void* __blue_glCore_glGetImageHandleARB; +void* __blue_glCore_glMakeImageHandleResidentARB; +void* __blue_glCore_glMakeImageHandleNonResidentARB; +void* __blue_glCore_glUniformHandleui64ARB; +void* __blue_glCore_glUniformHandleui64vARB; +void* __blue_glCore_glProgramUniformHandleui64ARB; +void* __blue_glCore_glProgramUniformHandleui64vARB; +void* __blue_glCore_glIsTextureHandleResidentARB; +void* __blue_glCore_glIsImageHandleResidentARB; +void* __blue_glCore_glVertexAttribL1ui64ARB; +void* __blue_glCore_glVertexAttribL1ui64vARB; +void* __blue_glCore_glGetVertexAttribLui64vARB; +void* __blue_glCore_glCreateSyncFromCLeventARB; +void* __blue_glCore_glDispatchComputeGroupSizeARB; +void* __blue_glCore_glDebugMessageControlARB; +void* __blue_glCore_glDebugMessageInsertARB; +void* __blue_glCore_glDebugMessageCallbackARB; +void* __blue_glCore_glGetDebugMessageLogARB; +void* __blue_glCore_glBlendEquationiARB; +void* __blue_glCore_glBlendEquationSeparateiARB; +void* __blue_glCore_glBlendFunciARB; +void* __blue_glCore_glBlendFuncSeparateiARB; +void* __blue_glCore_glMultiDrawArraysIndirectCountARB; +void* __blue_glCore_glMultiDrawElementsIndirectCountARB; +void* __blue_glCore_glGetGraphicsResetStatusARB; +void* __blue_glCore_glGetnTexImageARB; +void* __blue_glCore_glReadnPixelsARB; +void* __blue_glCore_glGetnCompressedTexImageARB; +void* __blue_glCore_glGetnUniformfvARB; +void* __blue_glCore_glGetnUniformivARB; +void* __blue_glCore_glGetnUniformuivARB; +void* __blue_glCore_glGetnUniformdvARB; +void* __blue_glCore_glMinSampleShadingARB; +void* __blue_glCore_glNamedStringARB; +void* __blue_glCore_glDeleteNamedStringARB; +void* __blue_glCore_glCompileShaderIncludeARB; +void* __blue_glCore_glIsNamedStringARB; +void* __blue_glCore_glGetNamedStringARB; +void* __blue_glCore_glGetNamedStringivARB; +void* __blue_glCore_glBufferPageCommitmentARB; +void* __blue_glCore_glNamedBufferPageCommitmentEXT; void* __blue_glCore_glNamedBufferPageCommitmentARB; -void* __blue_glCore_glMakeBufferResidentNV; -void* __blue_glCore_glNamedFramebufferDrawBuffers; -void* __blue_glCore_glVertexPointerListIBM; -void* __blue_glCore_glGetUniformui64vNV; -void* __blue_glCore_glClearDepthfOES; -void* __blue_glCore_glWindowPos2iMESA; -void* __blue_glCore_glCopyTextureImage1DEXT; -void* __blue_glCore_glBeginOcclusionQueryNV; -void* __blue_glCore_glLoadTransposeMatrixf; -void* __blue_glCore_glNamedRenderbufferStorageMultisampleEXT; -void* __blue_glCore_glNormalStream3fATI; -void* __blue_glCore_glNormal3hNV; -void* __blue_glCore_glUseProgram; -void* __blue_glCore_glPushGroupMarkerEXT; -void* __blue_glCore_glMultiTexSubImage2DEXT; -void* __blue_glCore_glVertexArrayRangeNV; -void* __blue_glCore_glGetMultiTexLevelParameterivEXT; -void* __blue_glCore_glMultiDrawArraysEXT; -void* __blue_glCore_glVertexAttribL4ui64NV; -void* __blue_glCore_glVertexAttrib4Nub; -void* __blue_glCore_glFogCoordhNV; -void* __blue_glCore_glVertexAttribI3ui; -void* __blue_glCore_glTexImage3DMultisampleCoverageNV; -void* __blue_glCore_glGetUniformBufferSizeEXT; -void* __blue_glCore_glCompileCommandListNV; -void* __blue_glCore_glVertexArrayVertexAttribBindingEXT; -void* __blue_glCore_glBlendEquation; -void* __blue_glCore_glBinormal3dvEXT; -void* __blue_glCore_glVertexFormatNV; -void* __blue_glCore_glProgramUniform4fv; -void* __blue_glCore_glTextureStorage2DMultisample; -void* __blue_glCore_glProgramUniform3uiEXT; -void* __blue_glCore_glFramebufferDrawBufferEXT; -void* __blue_glCore_glCreateTextures; -void* __blue_glCore_glMatrixPopEXT; -void* __blue_glCore_glProgramUniformui64vNV; -void* __blue_glCore_glFramebufferTexture2D; -void* __blue_glCore_glGetAttribLocation; -void* __blue_glCore_glUniform2fARB; -void* __blue_glCore_glDisableVertexArrayAttribEXT; -void* __blue_glCore_glTexStorage2D; -void* __blue_glCore_glVertexAttribI1iEXT; -void* __blue_glCore_glUniform4ui; -void* __blue_glCore_glMultiTexCoordP1uiv; -void* __blue_glCore_glNamedProgramLocalParametersI4ivEXT; -void* __blue_glCore_glImageTransformParameteriHP; -void* __blue_glCore_glIsBuffer; -void* __blue_glCore_glFogCoorddv; +void* __blue_glCore_glTexPageCommitmentARB; void* __blue_glCore_glClientActiveTexture; -void* __blue_glCore_glUniformHandleui64vNV; -void* __blue_glCore_glWindowPos3fARB; -void* __blue_glCore_glGetVertexAttribfvARB; -void* __blue_glCore_glSamplerParameterfv; -void* __blue_glCore_glVertexAttrib4NsvARB; -void* __blue_glCore_glProgramUniform2ivEXT; -void* __blue_glCore_glNamedProgramStringEXT; -void* __blue_glCore_glPointSize; -void* __blue_glCore_glTexCoord4hNV; -void* __blue_glCore_glGetIntegerIndexedvEXT; -void* __blue_glCore_glPrimitiveBoundingBoxARB; -void* __blue_glCore_glDebugMessageInsert; -void* __blue_glCore_glMultiTexCoord3bvOES; -void* __blue_glCore_glVertexAttribL1i64vNV; -void* __blue_glCore_glTextureBuffer; -void* __blue_glCore_glGetTextureParameterIiv; -void* __blue_glCore_glFramebufferTexture; -void* __blue_glCore_glGetProgramivARB; -void* __blue_glCore_glVertexAttribPointerARB; -void* __blue_glCore_glIsCommandListNV; -void* __blue_glCore_glUniform1uivEXT; -void* __blue_glCore_glProgramUniform2i; -void* __blue_glCore_glVertexAttribDivisorARB; -void* __blue_glCore_glGetVertexAttribPointervARB; -void* __blue_glCore_glTextureImage2DMultisampleNV; -void* __blue_glCore_glGetVariantPointervEXT; -void* __blue_glCore_glCheckFramebufferStatus; -void* __blue_glCore_glMap1xOES; -void* __blue_glCore_glBindSampler; -void* __blue_glCore_glPathGlyphIndexRangeNV; -void* __blue_glCore_glProgramEnvParameters4fvEXT; -void* __blue_glCore_glVertexAttrib3fNV; -void* __blue_glCore_glBindBuffersBase; -void* __blue_glCore_glGetNamedProgramLocalParameterIivEXT; -void* __blue_glCore_glProgramUniform4d; +void* __blue_glCore_glMultiTexCoord1d; +void* __blue_glCore_glMultiTexCoord1dv; +void* __blue_glCore_glMultiTexCoord1f; +void* __blue_glCore_glMultiTexCoord1fv; +void* __blue_glCore_glMultiTexCoord1i; +void* __blue_glCore_glMultiTexCoord1iv; +void* __blue_glCore_glMultiTexCoord1s; +void* __blue_glCore_glMultiTexCoord1sv; +void* __blue_glCore_glMultiTexCoord2d; +void* __blue_glCore_glMultiTexCoord2dv; +void* __blue_glCore_glMultiTexCoord2f; +void* __blue_glCore_glMultiTexCoord2fv; +void* __blue_glCore_glMultiTexCoord2i; +void* __blue_glCore_glMultiTexCoord2iv; +void* __blue_glCore_glMultiTexCoord2s; +void* __blue_glCore_glMultiTexCoord2sv; +void* __blue_glCore_glMultiTexCoord3d; +void* __blue_glCore_glMultiTexCoord3dv; void* __blue_glCore_glMultiTexCoord3f; -void* __blue_glCore_glDeleteProgram; -void* __blue_glCore_glReplacementCodeuiVertex3fvSUN; -void* __blue_glCore_glMapNamedBufferRange; -void* __blue_glCore_glFramebufferSampleLocationsfvARB; -void* __blue_glCore_glMultiTexCoord1dvARB; -void* __blue_glCore_glClearBufferuiv; -void* __blue_glCore_glDrawRangeElementsEXT; -void* __blue_glCore_glVertexAttrib1hvNV; +void* __blue_glCore_glMultiTexCoord3fv; +void* __blue_glCore_glMultiTexCoord3i; +void* __blue_glCore_glMultiTexCoord3iv; +void* __blue_glCore_glMultiTexCoord3s; +void* __blue_glCore_glMultiTexCoord3sv; +void* __blue_glCore_glMultiTexCoord4d; +void* __blue_glCore_glMultiTexCoord4dv; +void* __blue_glCore_glMultiTexCoord4f; +void* __blue_glCore_glMultiTexCoord4fv; +void* __blue_glCore_glMultiTexCoord4i; +void* __blue_glCore_glMultiTexCoord4iv; +void* __blue_glCore_glMultiTexCoord4s; +void* __blue_glCore_glMultiTexCoord4sv; +void* __blue_glCore_glLoadTransposeMatrixf; +void* __blue_glCore_glLoadTransposeMatrixd; +void* __blue_glCore_glMultTransposeMatrixf; +void* __blue_glCore_glMultTransposeMatrixd; +void* __blue_glCore_glFogCoordf; +void* __blue_glCore_glFogCoordfv; +void* __blue_glCore_glFogCoordd; +void* __blue_glCore_glFogCoorddv; +void* __blue_glCore_glFogCoordPointer; +void* __blue_glCore_glSecondaryColor3b; void* __blue_glCore_glSecondaryColor3bv; -void* __blue_glCore_glVDPAUMapSurfacesNV; -void* __blue_glCore_glStencilMask; -void* __blue_glCore_glGetProgramResourceLocationIndex; -void* __blue_glCore_glGetIntegerui64i_vNV; -void* __blue_glCore_glGetTextureLevelParameterfvEXT; -void* __blue_glCore_glWindowPos3sv; -void* __blue_glCore_glBlendEquationSeparatei; -void* __blue_glCore_glGetInfoLogARB; -void* __blue_glCore_glProgramNamedParameter4fNV; -void* __blue_glCore_glProgramParameter4fNV; -void* __blue_glCore_glDeleteTextures; -void* __blue_glCore_glFramebufferDrawBuffersEXT; -void* __blue_glCore_glGetObjectLabelEXT; -void* __blue_glCore_glProgramUniform3ivEXT; -void* __blue_glCore_glTextureParameterIiv; -void* __blue_glCore_glGetnUniformuiv; -void* __blue_glCore_glMapObjectBufferATI; -void* __blue_glCore_glTangent3dvEXT; -void* __blue_glCore_glProgramParameter4dNV; -void* __blue_glCore_glGenVertexArraysAPPLE; -void* __blue_glCore_glVertexAttrib4bvARB; -void* __blue_glCore_glVertexStream1dATI; -void* __blue_glCore_glMultiTexCoord2svARB; -void* __blue_glCore_glClearNamedBufferSubDataEXT; -void* __blue_glCore_glCompressedTextureSubImage3D; -void* __blue_glCore_glVertexAttribI4iEXT; -void* __blue_glCore_glGetnPixelMapfvARB; -void* __blue_glCore_glVertexStream4iATI; -void* __blue_glCore_glMatrixMultTransposedEXT; -void* __blue_glCore_glDisableVariantClientStateEXT; -void* __blue_glCore_glPrimitiveRestartNV; -void* __blue_glCore_glVertexAttribP4uiv; -void* __blue_glCore_glProgramUniformMatrix2fv; -void* __blue_glCore_glPolygonOffsetEXT; -void* __blue_glCore_glUseProgramObjectARB; -void* __blue_glCore_glMatrixLoadfEXT; -void* __blue_glCore_glTextureSubImage1D; -void* __blue_glCore_glHistogramEXT; -void* __blue_glCore_glProgramUniform1ivEXT; -void* __blue_glCore_glGetBufferParameterivARB; -void* __blue_glCore_glStringMarkerGREMEDY; +void* __blue_glCore_glSecondaryColor3d; +void* __blue_glCore_glSecondaryColor3dv; +void* __blue_glCore_glSecondaryColor3f; +void* __blue_glCore_glSecondaryColor3fv; +void* __blue_glCore_glSecondaryColor3i; +void* __blue_glCore_glSecondaryColor3iv; +void* __blue_glCore_glSecondaryColor3s; +void* __blue_glCore_glSecondaryColor3sv; +void* __blue_glCore_glSecondaryColor3ub; +void* __blue_glCore_glSecondaryColor3ubv; +void* __blue_glCore_glSecondaryColor3ui; +void* __blue_glCore_glSecondaryColor3uiv; +void* __blue_glCore_glSecondaryColor3us; +void* __blue_glCore_glSecondaryColor3usv; +void* __blue_glCore_glSecondaryColorPointer; +void* __blue_glCore_glWindowPos2d; +void* __blue_glCore_glWindowPos2dv; +void* __blue_glCore_glWindowPos2f; +void* __blue_glCore_glWindowPos2fv; +void* __blue_glCore_glWindowPos2i; +void* __blue_glCore_glWindowPos2iv; +void* __blue_glCore_glWindowPos2s; +void* __blue_glCore_glWindowPos2sv; +void* __blue_glCore_glWindowPos3d; +void* __blue_glCore_glWindowPos3dv; +void* __blue_glCore_glWindowPos3f; +void* __blue_glCore_glWindowPos3fv; +void* __blue_glCore_glWindowPos3i; +void* __blue_glCore_glWindowPos3iv; +void* __blue_glCore_glWindowPos3s; +void* __blue_glCore_glWindowPos3sv; +void* __blue_glCore_glVertexP2ui; +void* __blue_glCore_glVertexP2uiv; +void* __blue_glCore_glVertexP3ui; +void* __blue_glCore_glVertexP3uiv; +void* __blue_glCore_glVertexP4ui; +void* __blue_glCore_glVertexP4uiv; +void* __blue_glCore_glTexCoordP1ui; +void* __blue_glCore_glTexCoordP1uiv; +void* __blue_glCore_glTexCoordP2ui; +void* __blue_glCore_glTexCoordP2uiv; +void* __blue_glCore_glTexCoordP3ui; +void* __blue_glCore_glTexCoordP3uiv; +void* __blue_glCore_glTexCoordP4ui; +void* __blue_glCore_glTexCoordP4uiv; +void* __blue_glCore_glMultiTexCoordP1ui; +void* __blue_glCore_glMultiTexCoordP1uiv; +void* __blue_glCore_glMultiTexCoordP2ui; +void* __blue_glCore_glMultiTexCoordP2uiv; +void* __blue_glCore_glMultiTexCoordP3ui; +void* __blue_glCore_glMultiTexCoordP3uiv; +void* __blue_glCore_glMultiTexCoordP4ui; +void* __blue_glCore_glMultiTexCoordP4uiv; +void* __blue_glCore_glNormalP3ui; +void* __blue_glCore_glNormalP3uiv; +void* __blue_glCore_glColorP3ui; +void* __blue_glCore_glColorP3uiv; +void* __blue_glCore_glColorP4ui; +void* __blue_glCore_glColorP4uiv; +void* __blue_glCore_glSecondaryColorP3ui; +void* __blue_glCore_glSecondaryColorP3uiv; +void* __blue_glCore_glGetnMapdv; void* __blue_glCore_glGetnMapfv; -void* __blue_glCore_glMultiTexCoord3dvARB; -void* __blue_glCore_glFinishTextureSUNX; -void* __blue_glCore_glWindowPos3dARB; -void* __blue_glCore_glNamedBufferStorageEXT; -void* __blue_glCore_glIndexPointerListIBM; -void* __blue_glCore_glColor3fVertex3fSUN; -void* __blue_glCore_glDepthRangefOES; -void* __blue_glCore_glVertexBlendEnvfATI; -void* __blue_glCore_glMultiTexCoord1hvNV; -void* __blue_glCore_glGetPixelTexGenParameterfvSGIS; -void* __blue_glCore_glDisableClientStateIndexedEXT; -void* __blue_glCore_glProgramUniform1ui64NV; -void* __blue_glCore_glMultiTexCoord1dv; -void* __blue_glCore_glMultiTexCoord1ivARB; -void* __blue_glCore_glMapVertexAttrib1dAPPLE; -void* __blue_glCore_glGetPerfQueryIdByNameINTEL; -void* __blue_glCore_glUniform2ui64vNV; -void* __blue_glCore_glGetSharpenTexFuncSGIS; -void* __blue_glCore_glBindImageTexture; +void* __blue_glCore_glGetnMapiv; +void* __blue_glCore_glGetnPixelMapfv; +void* __blue_glCore_glGetnPixelMapuiv; +void* __blue_glCore_glGetnPixelMapusv; +void* __blue_glCore_glGetnPolygonStipple; +void* __blue_glCore_glGetnColorTable; +void* __blue_glCore_glGetnConvolutionFilter; +void* __blue_glCore_glGetnSeparableFilter; +void* __blue_glCore_glGetnHistogram; +void* __blue_glCore_glGetnMinmax; +void* __blue_glCore_glPrimitiveBoundingBoxARB; +void* __blue_glCore_glClampColorARB; +void* __blue_glCore_glDrawBuffersARB; +void* __blue_glCore_glDrawArraysInstancedARB; +void* __blue_glCore_glDrawElementsInstancedARB; +void* __blue_glCore_glProgramStringARB; +void* __blue_glCore_glBindProgramARB; +void* __blue_glCore_glDeleteProgramsARB; +void* __blue_glCore_glGenProgramsARB; +void* __blue_glCore_glProgramEnvParameter4dARB; void* __blue_glCore_glProgramEnvParameter4dvARB; -void* __blue_glCore_glDeleteFramebuffers; -void* __blue_glCore_glVertexArrayVertexOffsetEXT; -void* __blue_glCore_glProgramLocalParameters4fvEXT; -void* __blue_glCore_glFogCoordFormatNV; -void* __blue_glCore_glGenQueries; -void* __blue_glCore_glVertexAttribL4dEXT; -void* __blue_glCore_glMultiTexCoord4fvARB; -void* __blue_glCore_glPixelZoomxOES; -void* __blue_glCore_glCopyTexSubImage3D; +void* __blue_glCore_glProgramEnvParameter4fARB; +void* __blue_glCore_glProgramEnvParameter4fvARB; +void* __blue_glCore_glProgramLocalParameter4dARB; +void* __blue_glCore_glProgramLocalParameter4dvARB; +void* __blue_glCore_glProgramLocalParameter4fARB; +void* __blue_glCore_glProgramLocalParameter4fvARB; +void* __blue_glCore_glGetProgramEnvParameterdvARB; +void* __blue_glCore_glGetProgramEnvParameterfvARB; +void* __blue_glCore_glGetProgramLocalParameterdvARB; +void* __blue_glCore_glGetProgramLocalParameterfvARB; +void* __blue_glCore_glGetProgramivARB; +void* __blue_glCore_glGetProgramStringARB; +void* __blue_glCore_glIsProgramARB; +void* __blue_glCore_glProgramParameteriARB; +void* __blue_glCore_glFramebufferTextureARB; +void* __blue_glCore_glFramebufferTextureLayerARB; +void* __blue_glCore_glFramebufferTextureFaceARB; +void* __blue_glCore_glUniform1i64ARB; +void* __blue_glCore_glUniform2i64ARB; +void* __blue_glCore_glUniform3i64ARB; +void* __blue_glCore_glUniform4i64ARB; +void* __blue_glCore_glUniform1i64vARB; +void* __blue_glCore_glUniform2i64vARB; +void* __blue_glCore_glUniform3i64vARB; +void* __blue_glCore_glUniform4i64vARB; +void* __blue_glCore_glUniform1ui64ARB; +void* __blue_glCore_glUniform2ui64ARB; +void* __blue_glCore_glUniform3ui64ARB; +void* __blue_glCore_glUniform4ui64ARB; void* __blue_glCore_glUniform1ui64vARB; -void* __blue_glCore_glGetMapControlPointsNV; -void* __blue_glCore_glLightEnviSGIX; -void* __blue_glCore_glVertexAttrib4Nbv; -void* __blue_glCore_glDrawBuffer; -void* __blue_glCore_glDrawTransformFeedbackStream; -void* __blue_glCore_glDisableClientStateiEXT; -void* __blue_glCore_glFramebufferTexture3D; -void* __blue_glCore_glTextureColorMaskSGIS; -void* __blue_glCore_glCullFace; -void* __blue_glCore_glGetNamedBufferSubData; -void* __blue_glCore_glDispatchCompute; -void* __blue_glCore_glInvalidateFramebuffer; -void* __blue_glCore_glDebugMessageControl; -void* __blue_glCore_glProgramUniformMatrix3dv; -void* __blue_glCore_glSecondaryColor3ui; -void* __blue_glCore_glShaderStorageBlockBinding; -void* __blue_glCore_glUniformMatrix3fvARB; -void* __blue_glCore_glGetUniformOffsetEXT; -void* __blue_glCore_glBinormal3fvEXT; -void* __blue_glCore_glMultiTexCoordPointerEXT; -void* __blue_glCore_glVertexAttrib4sv; +void* __blue_glCore_glUniform2ui64vARB; +void* __blue_glCore_glUniform3ui64vARB; +void* __blue_glCore_glUniform4ui64vARB; +void* __blue_glCore_glGetUniformi64vARB; +void* __blue_glCore_glGetUniformui64vARB; +void* __blue_glCore_glGetnUniformi64vARB; +void* __blue_glCore_glGetnUniformui64vARB; +void* __blue_glCore_glProgramUniform1i64ARB; +void* __blue_glCore_glProgramUniform2i64ARB; +void* __blue_glCore_glProgramUniform3i64ARB; +void* __blue_glCore_glProgramUniform4i64ARB; +void* __blue_glCore_glProgramUniform1i64vARB; +void* __blue_glCore_glProgramUniform2i64vARB; +void* __blue_glCore_glProgramUniform3i64vARB; +void* __blue_glCore_glProgramUniform4i64vARB; +void* __blue_glCore_glProgramUniform1ui64ARB; +void* __blue_glCore_glProgramUniform2ui64ARB; +void* __blue_glCore_glProgramUniform3ui64ARB; +void* __blue_glCore_glProgramUniform4ui64ARB; +void* __blue_glCore_glProgramUniform1ui64vARB; +void* __blue_glCore_glProgramUniform2ui64vARB; +void* __blue_glCore_glProgramUniform3ui64vARB; +void* __blue_glCore_glProgramUniform4ui64vARB; +void* __blue_glCore_glColorTable; +void* __blue_glCore_glColorTableParameterfv; +void* __blue_glCore_glColorTableParameteriv; +void* __blue_glCore_glCopyColorTable; +void* __blue_glCore_glGetColorTable; +void* __blue_glCore_glGetColorTableParameterfv; +void* __blue_glCore_glGetColorTableParameteriv; +void* __blue_glCore_glColorSubTable; +void* __blue_glCore_glCopyColorSubTable; +void* __blue_glCore_glConvolutionFilter1D; +void* __blue_glCore_glConvolutionFilter2D; +void* __blue_glCore_glConvolutionParameterf; +void* __blue_glCore_glConvolutionParameterfv; +void* __blue_glCore_glConvolutionParameteri; +void* __blue_glCore_glConvolutionParameteriv; +void* __blue_glCore_glCopyConvolutionFilter1D; +void* __blue_glCore_glCopyConvolutionFilter2D; +void* __blue_glCore_glGetConvolutionFilter; +void* __blue_glCore_glGetConvolutionParameterfv; +void* __blue_glCore_glGetConvolutionParameteriv; +void* __blue_glCore_glGetSeparableFilter; +void* __blue_glCore_glSeparableFilter2D; +void* __blue_glCore_glGetHistogram; +void* __blue_glCore_glGetHistogramParameterfv; +void* __blue_glCore_glGetHistogramParameteriv; +void* __blue_glCore_glGetMinmax; +void* __blue_glCore_glGetMinmaxParameterfv; +void* __blue_glCore_glGetMinmaxParameteriv; +void* __blue_glCore_glHistogram; +void* __blue_glCore_glMinmax; +void* __blue_glCore_glResetHistogram; +void* __blue_glCore_glResetMinmax; +void* __blue_glCore_glVertexAttribDivisorARB; +void* __blue_glCore_glCurrentPaletteMatrixARB; void* __blue_glCore_glMatrixIndexubvARB; -void* __blue_glCore_glProgramUniform4ivEXT; -void* __blue_glCore_glWindowPos4dMESA; -void* __blue_glCore_glMultiDrawElementsIndirectCountARB; -void* __blue_glCore_glUniformMatrix4fvARB; -void* __blue_glCore_glBindImageTextureEXT; -void* __blue_glCore_glResolveDepthValuesNV; -void* __blue_glCore_glColor3fVertex3fvSUN; -void* __blue_glCore_glCompressedTexImage1D; -void* __blue_glCore_glGetnUniformdvARB; -void* __blue_glCore_glUniform1ui64vNV; -void* __blue_glCore_glProgramEnvParameterI4uiNV; -void* __blue_glCore_glVertexAttrib4ubNV; -void* __blue_glCore_glGenAsyncMarkersSGIX; -void* __blue_glCore_glVertexBindingDivisor; -void* __blue_glCore_glCreateShaderProgramv; -void* __blue_glCore_glBindBufferARB; -void* __blue_glCore_glColor4ubVertex2fvSUN; -void* __blue_glCore_glResetHistogram; -void* __blue_glCore_glGetProgramResourceLocation; -void* __blue_glCore_glBlendFuncSeparateiARB; -void* __blue_glCore_glBinormalPointerEXT; -void* __blue_glCore_glVertexAttrib2svNV; -void* __blue_glCore_glProgramUniform2i64vNV; -void* __blue_glCore_glTextureNormalEXT; -void* __blue_glCore_glFlushMappedBufferRangeAPPLE; -void* __blue_glCore_glSecondaryColor3dv; -void* __blue_glCore_glColorP3uiv; -void* __blue_glCore_glUniformMatrix4x2dv; -void* __blue_glCore_glTexCoordP3ui; -void* __blue_glCore_glNamedBufferSubDataEXT; -void* __blue_glCore_glProvokingVertexEXT; -void* __blue_glCore_glWeightbvARB; -void* __blue_glCore_glInvalidateNamedFramebufferData; -void* __blue_glCore_glGetArrayObjectfvATI; -void* __blue_glCore_glIsSampler; -void* __blue_glCore_glNormalStream3dvATI; -void* __blue_glCore_glVertexAttribL4i64vNV; +void* __blue_glCore_glMatrixIndexusvARB; +void* __blue_glCore_glMatrixIndexuivARB; +void* __blue_glCore_glMatrixIndexPointerARB; +void* __blue_glCore_glSampleCoverageARB; +void* __blue_glCore_glActiveTextureARB; +void* __blue_glCore_glClientActiveTextureARB; +void* __blue_glCore_glMultiTexCoord1dARB; +void* __blue_glCore_glMultiTexCoord1dvARB; +void* __blue_glCore_glMultiTexCoord1fARB; +void* __blue_glCore_glMultiTexCoord1fvARB; +void* __blue_glCore_glMultiTexCoord1iARB; +void* __blue_glCore_glMultiTexCoord1ivARB; +void* __blue_glCore_glMultiTexCoord1sARB; +void* __blue_glCore_glMultiTexCoord1svARB; +void* __blue_glCore_glMultiTexCoord2dARB; +void* __blue_glCore_glMultiTexCoord2dvARB; +void* __blue_glCore_glMultiTexCoord2fARB; +void* __blue_glCore_glMultiTexCoord2fvARB; +void* __blue_glCore_glMultiTexCoord2iARB; +void* __blue_glCore_glMultiTexCoord2ivARB; +void* __blue_glCore_glMultiTexCoord2sARB; +void* __blue_glCore_glMultiTexCoord2svARB; +void* __blue_glCore_glMultiTexCoord3dARB; +void* __blue_glCore_glMultiTexCoord3dvARB; +void* __blue_glCore_glMultiTexCoord3fARB; +void* __blue_glCore_glMultiTexCoord3fvARB; +void* __blue_glCore_glMultiTexCoord3iARB; +void* __blue_glCore_glMultiTexCoord3ivARB; +void* __blue_glCore_glMultiTexCoord3sARB; +void* __blue_glCore_glMultiTexCoord3svARB; +void* __blue_glCore_glMultiTexCoord4dARB; +void* __blue_glCore_glMultiTexCoord4dvARB; +void* __blue_glCore_glMultiTexCoord4fARB; +void* __blue_glCore_glMultiTexCoord4fvARB; +void* __blue_glCore_glMultiTexCoord4iARB; +void* __blue_glCore_glMultiTexCoord4ivARB; +void* __blue_glCore_glMultiTexCoord4sARB; +void* __blue_glCore_glMultiTexCoord4svARB; +void* __blue_glCore_glGenQueriesARB; +void* __blue_glCore_glDeleteQueriesARB; +void* __blue_glCore_glIsQueryARB; +void* __blue_glCore_glBeginQueryARB; +void* __blue_glCore_glEndQueryARB; +void* __blue_glCore_glGetQueryivARB; +void* __blue_glCore_glGetQueryObjectivARB; +void* __blue_glCore_glGetQueryObjectuivARB; +void* __blue_glCore_glMaxShaderCompilerThreadsARB; +void* __blue_glCore_glPointParameterfARB; +void* __blue_glCore_glPointParameterfvARB; +void* __blue_glCore_glGetnMapdvARB; +void* __blue_glCore_glGetnMapfvARB; +void* __blue_glCore_glGetnMapivARB; +void* __blue_glCore_glGetnPixelMapfvARB; +void* __blue_glCore_glGetnPixelMapuivARB; +void* __blue_glCore_glGetnPixelMapusvARB; +void* __blue_glCore_glGetnPolygonStippleARB; +void* __blue_glCore_glGetnColorTableARB; +void* __blue_glCore_glGetnConvolutionFilterARB; +void* __blue_glCore_glGetnSeparableFilterARB; +void* __blue_glCore_glGetnHistogramARB; +void* __blue_glCore_glGetnMinmaxARB; +void* __blue_glCore_glFramebufferSampleLocationsfvARB; +void* __blue_glCore_glNamedFramebufferSampleLocationsfvARB; +void* __blue_glCore_glEvaluateDepthValuesARB; +void* __blue_glCore_glDeleteObjectARB; +void* __blue_glCore_glGetHandleARB; +void* __blue_glCore_glDetachObjectARB; +void* __blue_glCore_glCreateShaderObjectARB; +void* __blue_glCore_glShaderSourceARB; +void* __blue_glCore_glCompileShaderARB; +void* __blue_glCore_glCreateProgramObjectARB; +void* __blue_glCore_glAttachObjectARB; +void* __blue_glCore_glLinkProgramARB; +void* __blue_glCore_glUseProgramObjectARB; void* __blue_glCore_glValidateProgramARB; -void* __blue_glCore_glUniform3ui; -void* __blue_glCore_glTransformFeedbackVaryingsNV; -void* __blue_glCore_glGetSeparableFilter; -void* __blue_glCore_glGetCompressedTexImageARB; -void* __blue_glCore_glProgramNamedParameter4fvNV; -void* __blue_glCore_glTextureBarrierNV; -void* __blue_glCore_glRasterSamplesEXT; -void* __blue_glCore_glSecondaryColor3dEXT; -void* __blue_glCore_glVertexAttrib1svNV; -void* __blue_glCore_glTexImage3D; -void* __blue_glCore_glUniform1i64ARB; -void* __blue_glCore_glVertexAttrib4Nuiv; -void* __blue_glCore_glGetProgramivNV; -void* __blue_glCore_glGetTexGenxvOES; -void* __blue_glCore_glVertexP4uiv; -void* __blue_glCore_glMapGrid1xOES; -void* __blue_glCore_glProgramUniformMatrix2dv; -void* __blue_glCore_glColorMaski; -void* __blue_glCore_glEdgeFlagPointerListIBM; -void* __blue_glCore_glGetUniformBlockIndex; -void* __blue_glCore_glClearColorxOES; -void* __blue_glCore_glPixelTransformParameteriEXT; -void* __blue_glCore_glNamedFramebufferTexture3DEXT; -void* __blue_glCore_glTexCoord4xOES; +void* __blue_glCore_glUniform1fARB; +void* __blue_glCore_glUniform2fARB; +void* __blue_glCore_glUniform3fARB; +void* __blue_glCore_glUniform4fARB; +void* __blue_glCore_glUniform1iARB; +void* __blue_glCore_glUniform2iARB; +void* __blue_glCore_glUniform3iARB; +void* __blue_glCore_glUniform4iARB; +void* __blue_glCore_glUniform1fvARB; +void* __blue_glCore_glUniform2fvARB; +void* __blue_glCore_glUniform3fvARB; +void* __blue_glCore_glUniform4fvARB; +void* __blue_glCore_glUniform1ivARB; +void* __blue_glCore_glUniform2ivARB; +void* __blue_glCore_glUniform3ivARB; +void* __blue_glCore_glUniform4ivARB; +void* __blue_glCore_glUniformMatrix2fvARB; +void* __blue_glCore_glUniformMatrix3fvARB; +void* __blue_glCore_glUniformMatrix4fvARB; +void* __blue_glCore_glGetObjectParameterfvARB; +void* __blue_glCore_glGetObjectParameterivARB; +void* __blue_glCore_glGetInfoLogARB; +void* __blue_glCore_glGetAttachedObjectsARB; +void* __blue_glCore_glGetUniformLocationARB; +void* __blue_glCore_glGetActiveUniformARB; +void* __blue_glCore_glGetUniformfvARB; void* __blue_glCore_glGetUniformivARB; -void* __blue_glCore_glNamedFramebufferTextureEXT; -void* __blue_glCore_glDrawBuffers; +void* __blue_glCore_glGetShaderSourceARB; +void* __blue_glCore_glTexBufferARB; +void* __blue_glCore_glCompressedTexImage3DARB; +void* __blue_glCore_glCompressedTexImage2DARB; +void* __blue_glCore_glCompressedTexImage1DARB; +void* __blue_glCore_glCompressedTexSubImage3DARB; +void* __blue_glCore_glCompressedTexSubImage2DARB; +void* __blue_glCore_glCompressedTexSubImage1DARB; +void* __blue_glCore_glGetCompressedTexImageARB; +void* __blue_glCore_glLoadTransposeMatrixfARB; +void* __blue_glCore_glLoadTransposeMatrixdARB; +void* __blue_glCore_glMultTransposeMatrixfARB; +void* __blue_glCore_glMultTransposeMatrixdARB; +void* __blue_glCore_glWeightbvARB; +void* __blue_glCore_glWeightsvARB; +void* __blue_glCore_glWeightivARB; +void* __blue_glCore_glWeightfvARB; +void* __blue_glCore_glWeightdvARB; +void* __blue_glCore_glWeightubvARB; +void* __blue_glCore_glWeightusvARB; void* __blue_glCore_glWeightuivARB; -void* __blue_glCore_glMultiTexCoordP1ui; -void* __blue_glCore_glCopyTexSubImage1DEXT; -void* __blue_glCore_glVertexArrayAttribBinding; -void* __blue_glCore_glVertexP4ui; -void* __blue_glCore_glVertex2hvNV; -void* __blue_glCore_glDrawElementsInstancedBaseInstance; -void* __blue_glCore_glNormalStream3sATI; -void* __blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN; -void* __blue_glCore_glBindSamplers; -void* __blue_glCore_glGetCompressedMultiTexImageEXT; -void* __blue_glCore_glGetRenderbufferParameterivEXT; -void* __blue_glCore_glUniform3dv; -void* __blue_glCore_glFlushRasterSGIX; -void* __blue_glCore_glVertexAttribs3hvNV; -void* __blue_glCore_glGetnSeparableFilterARB; +void* __blue_glCore_glWeightPointerARB; +void* __blue_glCore_glVertexBlendARB; +void* __blue_glCore_glBindBufferARB; +void* __blue_glCore_glDeleteBuffersARB; +void* __blue_glCore_glGenBuffersARB; +void* __blue_glCore_glIsBufferARB; +void* __blue_glCore_glBufferDataARB; +void* __blue_glCore_glBufferSubDataARB; +void* __blue_glCore_glGetBufferSubDataARB; +void* __blue_glCore_glMapBufferARB; +void* __blue_glCore_glUnmapBufferARB; +void* __blue_glCore_glGetBufferParameterivARB; +void* __blue_glCore_glGetBufferPointervARB; +void* __blue_glCore_glVertexAttrib1dARB; +void* __blue_glCore_glVertexAttrib1dvARB; +void* __blue_glCore_glVertexAttrib1fARB; +void* __blue_glCore_glVertexAttrib1fvARB; +void* __blue_glCore_glVertexAttrib1sARB; +void* __blue_glCore_glVertexAttrib1svARB; +void* __blue_glCore_glVertexAttrib2dARB; +void* __blue_glCore_glVertexAttrib2dvARB; +void* __blue_glCore_glVertexAttrib2fARB; +void* __blue_glCore_glVertexAttrib2fvARB; +void* __blue_glCore_glVertexAttrib2sARB; +void* __blue_glCore_glVertexAttrib2svARB; +void* __blue_glCore_glVertexAttrib3dARB; +void* __blue_glCore_glVertexAttrib3dvARB; +void* __blue_glCore_glVertexAttrib3fARB; +void* __blue_glCore_glVertexAttrib3fvARB; +void* __blue_glCore_glVertexAttrib3sARB; +void* __blue_glCore_glVertexAttrib3svARB; +void* __blue_glCore_glVertexAttrib4NbvARB; +void* __blue_glCore_glVertexAttrib4NivARB; +void* __blue_glCore_glVertexAttrib4NsvARB; +void* __blue_glCore_glVertexAttrib4NubARB; +void* __blue_glCore_glVertexAttrib4NubvARB; +void* __blue_glCore_glVertexAttrib4NuivARB; +void* __blue_glCore_glVertexAttrib4NusvARB; +void* __blue_glCore_glVertexAttrib4bvARB; +void* __blue_glCore_glVertexAttrib4dARB; +void* __blue_glCore_glVertexAttrib4dvARB; +void* __blue_glCore_glVertexAttrib4fARB; +void* __blue_glCore_glVertexAttrib4fvARB; +void* __blue_glCore_glVertexAttrib4ivARB; +void* __blue_glCore_glVertexAttrib4sARB; +void* __blue_glCore_glVertexAttrib4svARB; +void* __blue_glCore_glVertexAttrib4ubvARB; +void* __blue_glCore_glVertexAttrib4uivARB; +void* __blue_glCore_glVertexAttrib4usvARB; +void* __blue_glCore_glVertexAttribPointerARB; +void* __blue_glCore_glEnableVertexAttribArrayARB; +void* __blue_glCore_glDisableVertexAttribArrayARB; +void* __blue_glCore_glGetVertexAttribdvARB; +void* __blue_glCore_glGetVertexAttribfvARB; +void* __blue_glCore_glGetVertexAttribivARB; +void* __blue_glCore_glGetVertexAttribPointervARB; +void* __blue_glCore_glBindAttribLocationARB; +void* __blue_glCore_glGetActiveAttribARB; +void* __blue_glCore_glGetAttribLocationARB; +void* __blue_glCore_glWindowPos2dARB; +void* __blue_glCore_glWindowPos2dvARB; +void* __blue_glCore_glWindowPos2fARB; +void* __blue_glCore_glWindowPos2fvARB; +void* __blue_glCore_glWindowPos2iARB; +void* __blue_glCore_glWindowPos2ivARB; void* __blue_glCore_glWindowPos2sARB; -void* __blue_glCore_glPopDebugGroup; -void* __blue_glCore_glVideoCaptureNV; -void* __blue_glCore_glTangent3bEXT; -void* __blue_glCore_glLinkProgram; -void* __blue_glCore_glFogCoordPointerListIBM; -void* __blue_glCore_glRotatexOES; -void* __blue_glCore_glPathParameterivNV; -void* __blue_glCore_glVertexAttribLPointerEXT; -void* __blue_glCore_glGetInteger64i_v; -void* __blue_glCore_glCompressedMultiTexSubImage1DEXT; -void* __blue_glCore_glConvolutionParameteriEXT; -void* __blue_glCore_glNamedFramebufferTextureLayer; -void* __blue_glCore_glWindowPos2sMESA; -void* __blue_glCore_glCoverStrokePathInstancedNV; -void* __blue_glCore_glTexParameteri; -void* __blue_glCore_glUniform1uiv; -void* __blue_glCore_glMultiTexCoord4fv; -void* __blue_glCore_glProgramParameter4fvNV; -void* __blue_glCore_glDeformationMap3fSGIX; -void* __blue_glCore_glBlendEquationiARB; -void* __blue_glCore_glStencilFunc; -void* __blue_glCore_glFogCoordd; -void* __blue_glCore_glUniform2iv; -void* __blue_glCore_glUniform1i64NV; -void* __blue_glCore_glTextureStorage2D; -void* __blue_glCore_glTextureStorage2DMultisampleEXT; -void* __blue_glCore_glCopyTexSubImage1D; -void* __blue_glCore_glSamplerParameterf; -void* __blue_glCore_glDrawArraysInstancedBaseInstance; -void* __blue_glCore_glVertexAttrib4uivARB; -void* __blue_glCore_glVertexAttribFormatNV; -void* __blue_glCore_glIsQueryARB; -void* __blue_glCore_glSampleCoverageARB; -void* __blue_glCore_glGetnCompressedTexImageARB; -void* __blue_glCore_glTexCoord3xvOES; -void* __blue_glCore_glTexCoord2fNormal3fVertex3fSUN; -void* __blue_glCore_glGetGraphicsResetStatus; -void* __blue_glCore_glProgramVertexLimitNV; -void* __blue_glCore_glCopyConvolutionFilter2D; -void* __blue_glCore_glVertexStream4fATI; -void* __blue_glCore_glSecondaryColor3f; -void* __blue_glCore_glTexCoordP1ui; -void* __blue_glCore_glProgramBufferParametersfvNV; -void* __blue_glCore_glTexCoord1xOES; -void* __blue_glCore_glFogCoordfv; -void* __blue_glCore_glMultiDrawElementsIndirectAMD; -void* __blue_glCore_glGetnMinmaxARB; -void* __blue_glCore_glSecondaryColor3uivEXT; -void* __blue_glCore_glColorMask; -void* __blue_glCore_glTextureImage2DMultisampleCoverageNV; -void* __blue_glCore_glMultiModeDrawElementsIBM; -void* __blue_glCore_glVertexArrayAttribLFormat; -void* __blue_glCore_glBindFragDataLocationIndexed; -void* __blue_glCore_glGetNamedBufferParameterivEXT; -void* __blue_glCore_glSecondaryColor3bEXT; -void* __blue_glCore_glVertexAttrib1fNV; -void* __blue_glCore_glVertexAttribI4uivEXT; -void* __blue_glCore_glGetQueryObjecti64vEXT; -void* __blue_glCore_glNormalStream3bATI; -void* __blue_glCore_glGetObjectParameterivAPPLE; -void* __blue_glCore_glProgramUniform3uivEXT; -void* __blue_glCore_glProgramUniformHandleui64ARB; -void* __blue_glCore_glGetPointerv; -void* __blue_glCore_glUniformMatrix4x3dv; -void* __blue_glCore_glTexCoordP4uiv; -void* __blue_glCore_glVertexAttribI4sv; -void* __blue_glCore_glFlushMappedNamedBufferRangeEXT; -void* __blue_glCore_glDisableVertexArrayEXT; -void* __blue_glCore_glGetPathDashArrayNV; -void* __blue_glCore_glProgramUniform2uiEXT; -void* __blue_glCore_glBindImageTextures; -void* __blue_glCore_glVertexAttrib4sNV; -void* __blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN; -void* __blue_glCore_glVertex3hNV; -void* __blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN; -void* __blue_glCore_glProgramUniform2i64NV; -void* __blue_glCore_glBufferData; -void* __blue_glCore_glGetBufferParameteriv; -void* __blue_glCore_glIsAsyncMarkerSGIX; -void* __blue_glCore_glTexImage4DSGIS; -void* __blue_glCore_glGetMultiTexEnvivEXT; +void* __blue_glCore_glWindowPos2svARB; +void* __blue_glCore_glWindowPos3dARB; +void* __blue_glCore_glWindowPos3dvARB; +void* __blue_glCore_glWindowPos3fARB; +void* __blue_glCore_glWindowPos3fvARB; +void* __blue_glCore_glWindowPos3iARB; +void* __blue_glCore_glWindowPos3ivARB; +void* __blue_glCore_glWindowPos3sARB; +void* __blue_glCore_glWindowPos3svARB; +void* __blue_glCore_glBlendBarrierKHR; +void* __blue_glCore_glMultiTexCoord1bOES; +void* __blue_glCore_glMultiTexCoord1bvOES; +void* __blue_glCore_glMultiTexCoord2bOES; +void* __blue_glCore_glMultiTexCoord2bvOES; +void* __blue_glCore_glMultiTexCoord3bOES; +void* __blue_glCore_glMultiTexCoord3bvOES; +void* __blue_glCore_glMultiTexCoord4bOES; +void* __blue_glCore_glMultiTexCoord4bvOES; +void* __blue_glCore_glTexCoord1bOES; +void* __blue_glCore_glTexCoord1bvOES; +void* __blue_glCore_glTexCoord2bOES; +void* __blue_glCore_glTexCoord2bvOES; +void* __blue_glCore_glTexCoord3bOES; +void* __blue_glCore_glTexCoord3bvOES; +void* __blue_glCore_glTexCoord4bOES; +void* __blue_glCore_glTexCoord4bvOES; +void* __blue_glCore_glVertex2bOES; +void* __blue_glCore_glVertex2bvOES; +void* __blue_glCore_glVertex3bOES; +void* __blue_glCore_glVertex3bvOES; +void* __blue_glCore_glVertex4bOES; +void* __blue_glCore_glVertex4bvOES; +void* __blue_glCore_glAlphaFuncxOES; +void* __blue_glCore_glClearColorxOES; +void* __blue_glCore_glClearDepthxOES; +void* __blue_glCore_glClipPlanexOES; +void* __blue_glCore_glColor4xOES; +void* __blue_glCore_glDepthRangexOES; +void* __blue_glCore_glFogxOES; +void* __blue_glCore_glFogxvOES; +void* __blue_glCore_glFrustumxOES; void* __blue_glCore_glGetClipPlanexOES; -void* __blue_glCore_glUniform3uiEXT; -void* __blue_glCore_glMultiTexCoord3sv; -void* __blue_glCore_glVertexAttribs1hvNV; -void* __blue_glCore_glGetPerfQueryInfoINTEL; -void* __blue_glCore_glGetClipPlanefOES; -void* __blue_glCore_glSecondaryColor3ubEXT; -void* __blue_glCore_glSyncTextureINTEL; -void* __blue_glCore_glProgramUniformMatrix3x2dv; -void* __blue_glCore_glUniformMatrix4x2fv; -void* __blue_glCore_glTextureBufferEXT; -void* __blue_glCore_glVertexPointervINTEL; -void* __blue_glCore_glGetShaderPrecisionFormat; -void* __blue_glCore_glGetTextureImage; -void* __blue_glCore_glUniform3ivARB; -void* __blue_glCore_glFramebufferParameteri; +void* __blue_glCore_glGetFixedvOES; +void* __blue_glCore_glGetTexEnvxvOES; +void* __blue_glCore_glGetTexParameterxvOES; +void* __blue_glCore_glLightModelxOES; +void* __blue_glCore_glLightModelxvOES; +void* __blue_glCore_glLightxOES; +void* __blue_glCore_glLightxvOES; +void* __blue_glCore_glLineWidthxOES; +void* __blue_glCore_glLoadMatrixxOES; +void* __blue_glCore_glMaterialxOES; +void* __blue_glCore_glMaterialxvOES; +void* __blue_glCore_glMultMatrixxOES; +void* __blue_glCore_glMultiTexCoord4xOES; +void* __blue_glCore_glNormal3xOES; +void* __blue_glCore_glOrthoxOES; void* __blue_glCore_glPointParameterxvOES; -void* __blue_glCore_glBlendFunci; -void* __blue_glCore_glUniformMatrix2x3dv; -void* __blue_glCore_glUniform2i64ARB; -void* __blue_glCore_glProgramEnvParameterI4ivNV; -void* __blue_glCore_glFragmentLightModelivSGIX; -void* __blue_glCore_glProgramUniform4ui64vARB; -void* __blue_glCore_glProgramUniformMatrix2x3fvEXT; -void* __blue_glCore_glStencilClearTagEXT; -void* __blue_glCore_glMultiTexCoord4s; -void* __blue_glCore_glProgramUniformMatrix4dvEXT; -void* __blue_glCore_glGetNamedBufferParameteri64v; -void* __blue_glCore_glVertexAttribI3iEXT; -void* __blue_glCore_glReplacementCodeuivSUN; -void* __blue_glCore_glFragmentLightModeliSGIX; -void* __blue_glCore_glUniform2i64vNV; -void* __blue_glCore_glPointParameterivNV; -void* __blue_glCore_glStencilStrokePathInstancedNV; -void* __blue_glCore_glInsertComponentEXT; -void* __blue_glCore_glIsEnabled; -void* __blue_glCore_glWindowPos3dMESA; -void* __blue_glCore_glGetnCompressedTexImage; -void* __blue_glCore_glCopyMultiTexSubImage2DEXT; -void* __blue_glCore_glDisableIndexedEXT; -void* __blue_glCore_glWindowPos2dv; -void* __blue_glCore_glAlphaFuncxOES; -void* __blue_glCore_glCreateFramebuffers; -void* __blue_glCore_glGetAttribLocationARB; -void* __blue_glCore_glVertexAttrib1sARB; -void* __blue_glCore_glTexBumpParameterfvATI; -void* __blue_glCore_glGetActiveSubroutineUniformiv; -void* __blue_glCore_glVertexAttrib2fARB; -void* __blue_glCore_glGetTransformFeedbacki64_v; -void* __blue_glCore_glMultiTexCoord4hvNV; -void* __blue_glCore_glBlendColorEXT; -void* __blue_glCore_glCompressedTexSubImage3D; -void* __blue_glCore_glVertexStream4dvATI; -void* __blue_glCore_glMaxShaderCompilerThreadsARB; -void* __blue_glCore_glGlobalAlphaFactorbSUN; -void* __blue_glCore_glGlobalAlphaFactoruiSUN; -void* __blue_glCore_glClientActiveTextureARB; -void* __blue_glCore_glGenProgramsARB; -void* __blue_glCore_glGetTexParameterPointervAPPLE; -void* __blue_glCore_glGetBooleanv; -void* __blue_glCore_glDrawElementsBaseVertex; -void* __blue_glCore_glVertexAttribL4ui64vNV; -void* __blue_glCore_glSecondaryColor3fvEXT; -void* __blue_glCore_glMultiTexCoord1s; -void* __blue_glCore_glDeleteProgramsARB; -void* __blue_glCore_glDrawElementsInstancedBaseVertex; -void* __blue_glCore_glProgramUniform4dEXT; -void* __blue_glCore_glGetPathMetricRangeNV; -void* __blue_glCore_glProgramUniform3iEXT; -void* __blue_glCore_glDeleteBuffers; -void* __blue_glCore_glSecondaryColor3usEXT; -void* __blue_glCore_glDepthMask; -void* __blue_glCore_glMultiTexCoord2dv; -void* __blue_glCore_glCopyConvolutionFilter2DEXT; +void* __blue_glCore_glPointSizexOES; +void* __blue_glCore_glPolygonOffsetxOES; +void* __blue_glCore_glRotatexOES; +void* __blue_glCore_glScalexOES; +void* __blue_glCore_glTexEnvxOES; +void* __blue_glCore_glTexEnvxvOES; +void* __blue_glCore_glTexParameterxOES; +void* __blue_glCore_glTexParameterxvOES; +void* __blue_glCore_glTranslatexOES; +void* __blue_glCore_glAccumxOES; +void* __blue_glCore_glBitmapxOES; +void* __blue_glCore_glBlendColorxOES; +void* __blue_glCore_glClearAccumxOES; +void* __blue_glCore_glColor3xOES; +void* __blue_glCore_glColor3xvOES; +void* __blue_glCore_glColor4xvOES; +void* __blue_glCore_glConvolutionParameterxOES; +void* __blue_glCore_glConvolutionParameterxvOES; +void* __blue_glCore_glEvalCoord1xOES; +void* __blue_glCore_glEvalCoord1xvOES; +void* __blue_glCore_glEvalCoord2xOES; +void* __blue_glCore_glEvalCoord2xvOES; +void* __blue_glCore_glFeedbackBufferxOES; +void* __blue_glCore_glGetConvolutionParameterxvOES; +void* __blue_glCore_glGetHistogramParameterxvOES; +void* __blue_glCore_glGetLightxOES; +void* __blue_glCore_glGetMapxvOES; +void* __blue_glCore_glGetMaterialxOES; +void* __blue_glCore_glGetPixelMapxv; +void* __blue_glCore_glGetTexGenxvOES; +void* __blue_glCore_glGetTexLevelParameterxvOES; +void* __blue_glCore_glIndexxOES; +void* __blue_glCore_glIndexxvOES; void* __blue_glCore_glLoadTransposeMatrixxOES; -void* __blue_glCore_glPixelStoref; -void* __blue_glCore_glStencilOpSeparateATI; -void* __blue_glCore_glCopyTextureSubImage1DEXT; -void* __blue_glCore_glMatrixScaledEXT; -void* __blue_glCore_glProgramUniform2i64ARB; -void* __blue_glCore_glTextureParameterfEXT; -void* __blue_glCore_glGetProgramLocalParameterIivNV; -void* __blue_glCore_glGetShaderInfoLog; -void* __blue_glCore_glTexCoordP2uiv; -void* __blue_glCore_glDebugMessageCallback; -void* __blue_glCore_glLoadTransposeMatrixfARB; -void* __blue_glCore_glUniform1ui; -void* __blue_glCore_glVertexAttribL4dvEXT; -void* __blue_glCore_glVertex3bvOES; -void* __blue_glCore_glPassThroughxOES; -void* __blue_glCore_glGetFloatIndexedvEXT; -void* __blue_glCore_glSubpixelPrecisionBiasNV; -void* __blue_glCore_glFinishFenceNV; -void* __blue_glCore_glGetProgramBinary; -void* __blue_glCore_glBlendFuncSeparateIndexedAMD; -void* __blue_glCore_glBlendFuncSeparate; -void* __blue_glCore_glIndexxvOES; -void* __blue_glCore_glVertexAttrib4NuivARB; -void* __blue_glCore_glUniform2ui64ARB; -void* __blue_glCore_glEndPerfMonitorAMD; -void* __blue_glCore_glReleaseShaderCompiler; -void* __blue_glCore_glGenFramebuffersEXT; -void* __blue_glCore_glUniform2uiv; -void* __blue_glCore_glGenSymbolsEXT; -void* __blue_glCore_glVertexAttribIPointer; -void* __blue_glCore_glUniformMatrix3x4fv; -void* __blue_glCore_glTexCoord3bOES; -void* __blue_glCore_glVDPAUUnmapSurfacesNV; -void* __blue_glCore_glProgramUniform4ui64NV; -void* __blue_glCore_glUniformHandleui64NV; -void* __blue_glCore_glGetStageIndexNV; -void* __blue_glCore_glMultiTexCoord3fvARB; -void* __blue_glCore_glBindBufferOffsetEXT; -void* __blue_glCore_glVertexAttribL4dv; -void* __blue_glCore_glClearStencil; -void* __blue_glCore_glWindowPos2ivMESA; -void* __blue_glCore_glReplacementCodeubvSUN; -void* __blue_glCore_glClipPlanefOES; +void* __blue_glCore_glMap1xOES; +void* __blue_glCore_glMap2xOES; +void* __blue_glCore_glMapGrid1xOES; +void* __blue_glCore_glMapGrid2xOES; +void* __blue_glCore_glMultTransposeMatrixxOES; void* __blue_glCore_glMultiTexCoord1xOES; -void* __blue_glCore_glGetProgramInfoLog; -void* __blue_glCore_glEndFragmentShaderATI; -void* __blue_glCore_glGetTransformFeedbackVaryingNV; -void* __blue_glCore_glProgramUniformMatrix4x2dv; -void* __blue_glCore_glResetHistogramEXT; +void* __blue_glCore_glMultiTexCoord1xvOES; +void* __blue_glCore_glMultiTexCoord2xOES; +void* __blue_glCore_glMultiTexCoord2xvOES; +void* __blue_glCore_glMultiTexCoord3xOES; +void* __blue_glCore_glMultiTexCoord3xvOES; +void* __blue_glCore_glMultiTexCoord4xvOES; +void* __blue_glCore_glNormal3xvOES; +void* __blue_glCore_glPassThroughxOES; +void* __blue_glCore_glPixelMapx; +void* __blue_glCore_glPixelStorex; +void* __blue_glCore_glPixelTransferxOES; +void* __blue_glCore_glPixelZoomxOES; +void* __blue_glCore_glPrioritizeTexturesxOES; +void* __blue_glCore_glRasterPos2xOES; +void* __blue_glCore_glRasterPos2xvOES; +void* __blue_glCore_glRasterPos3xOES; +void* __blue_glCore_glRasterPos3xvOES; +void* __blue_glCore_glRasterPos4xOES; +void* __blue_glCore_glRasterPos4xvOES; +void* __blue_glCore_glRectxOES; +void* __blue_glCore_glRectxvOES; +void* __blue_glCore_glTexCoord1xOES; +void* __blue_glCore_glTexCoord1xvOES; +void* __blue_glCore_glTexCoord2xOES; +void* __blue_glCore_glTexCoord2xvOES; +void* __blue_glCore_glTexCoord3xOES; +void* __blue_glCore_glTexCoord3xvOES; +void* __blue_glCore_glTexCoord4xOES; +void* __blue_glCore_glTexCoord4xvOES; +void* __blue_glCore_glTexGenxOES; +void* __blue_glCore_glTexGenxvOES; +void* __blue_glCore_glVertex2xOES; +void* __blue_glCore_glVertex2xvOES; +void* __blue_glCore_glVertex3xOES; +void* __blue_glCore_glVertex3xvOES; +void* __blue_glCore_glVertex4xOES; +void* __blue_glCore_glVertex4xvOES; +void* __blue_glCore_glQueryMatrixxOES; +void* __blue_glCore_glClearDepthfOES; +void* __blue_glCore_glClipPlanefOES; +void* __blue_glCore_glDepthRangefOES; +void* __blue_glCore_glFrustumfOES; +void* __blue_glCore_glGetClipPlanefOES; +void* __blue_glCore_glOrthofOES; +void* __blue_glCore_glTbufferMask3DFX; +void* __blue_glCore_glDebugMessageEnableAMD; +void* __blue_glCore_glDebugMessageInsertAMD; +void* __blue_glCore_glDebugMessageCallbackAMD; +void* __blue_glCore_glGetDebugMessageLogAMD; +void* __blue_glCore_glBlendFuncIndexedAMD; +void* __blue_glCore_glBlendFuncSeparateIndexedAMD; +void* __blue_glCore_glBlendEquationIndexedAMD; +void* __blue_glCore_glBlendEquationSeparateIndexedAMD; +void* __blue_glCore_glUniform1i64NV; +void* __blue_glCore_glUniform2i64NV; +void* __blue_glCore_glUniform3i64NV; +void* __blue_glCore_glUniform4i64NV; void* __blue_glCore_glUniform1i64vNV; -void* __blue_glCore_glProgramEnvParameter4dARB; -void* __blue_glCore_glCopyTextureSubImage2DEXT; -void* __blue_glCore_glGetCombinerInputParameterivNV; -void* __blue_glCore_glUniformMatrix4fv; -void* __blue_glCore_glGenQueriesARB; -void* __blue_glCore_glGetnSeparableFilter; -void* __blue_glCore_glUniform3ui64vARB; -void* __blue_glCore_glMultiTexCoord1i; -void* __blue_glCore_glColorTable; -void* __blue_glCore_glVertexAttribs4ubvNV; -void* __blue_glCore_glProgramUniform3uiv; -void* __blue_glCore_glProgramUniformMatrix3x2fv; -void* __blue_glCore_glUnmapBuffer; -void* __blue_glCore_glBindTextureUnit; -void* __blue_glCore_glTextureParameterIuivEXT; -void* __blue_glCore_glVertexAttribDivisor; -void* __blue_glCore_glSamplerParameterIiv; -void* __blue_glCore_glGetDebugMessageLog; +void* __blue_glCore_glUniform2i64vNV; +void* __blue_glCore_glUniform3i64vNV; +void* __blue_glCore_glUniform4i64vNV; +void* __blue_glCore_glUniform1ui64NV; +void* __blue_glCore_glUniform2ui64NV; +void* __blue_glCore_glUniform3ui64NV; +void* __blue_glCore_glUniform4ui64NV; +void* __blue_glCore_glUniform1ui64vNV; +void* __blue_glCore_glUniform2ui64vNV; +void* __blue_glCore_glUniform3ui64vNV; +void* __blue_glCore_glUniform4ui64vNV; +void* __blue_glCore_glGetUniformi64vNV; +void* __blue_glCore_glGetUniformui64vNV; +void* __blue_glCore_glProgramUniform1i64NV; +void* __blue_glCore_glProgramUniform2i64NV; +void* __blue_glCore_glProgramUniform3i64NV; +void* __blue_glCore_glProgramUniform4i64NV; +void* __blue_glCore_glProgramUniform1i64vNV; +void* __blue_glCore_glProgramUniform2i64vNV; +void* __blue_glCore_glProgramUniform3i64vNV; +void* __blue_glCore_glProgramUniform4i64vNV; +void* __blue_glCore_glProgramUniform1ui64NV; +void* __blue_glCore_glProgramUniform2ui64NV; +void* __blue_glCore_glProgramUniform3ui64NV; +void* __blue_glCore_glProgramUniform4ui64NV; +void* __blue_glCore_glProgramUniform1ui64vNV; +void* __blue_glCore_glProgramUniform2ui64vNV; +void* __blue_glCore_glProgramUniform3ui64vNV; +void* __blue_glCore_glProgramUniform4ui64vNV; +void* __blue_glCore_glVertexAttribParameteriAMD; +void* __blue_glCore_glMultiDrawArraysIndirectAMD; +void* __blue_glCore_glMultiDrawElementsIndirectAMD; +void* __blue_glCore_glGenNamesAMD; +void* __blue_glCore_glDeleteNamesAMD; +void* __blue_glCore_glIsNameAMD; +void* __blue_glCore_glQueryObjectParameteruiAMD; +void* __blue_glCore_glGetPerfMonitorGroupsAMD; +void* __blue_glCore_glGetPerfMonitorCountersAMD; +void* __blue_glCore_glGetPerfMonitorGroupStringAMD; +void* __blue_glCore_glGetPerfMonitorCounterStringAMD; +void* __blue_glCore_glGetPerfMonitorCounterInfoAMD; +void* __blue_glCore_glGenPerfMonitorsAMD; +void* __blue_glCore_glDeletePerfMonitorsAMD; void* __blue_glCore_glSelectPerfMonitorCountersAMD; -void* __blue_glCore_glVertexAttribI2i; -void* __blue_glCore_glDepthRangedNV; +void* __blue_glCore_glBeginPerfMonitorAMD; +void* __blue_glCore_glEndPerfMonitorAMD; +void* __blue_glCore_glGetPerfMonitorCounterDataAMD; +void* __blue_glCore_glSetMultisamplefvAMD; +void* __blue_glCore_glTexStorageSparseAMD; +void* __blue_glCore_glTextureStorageSparseAMD; +void* __blue_glCore_glStencilOpValueAMD; +void* __blue_glCore_glTessellationFactorAMD; +void* __blue_glCore_glTessellationModeAMD; +void* __blue_glCore_glElementPointerAPPLE; +void* __blue_glCore_glDrawElementArrayAPPLE; +void* __blue_glCore_glDrawRangeElementArrayAPPLE; +void* __blue_glCore_glMultiDrawElementArrayAPPLE; +void* __blue_glCore_glMultiDrawRangeElementArrayAPPLE; +void* __blue_glCore_glGenFencesAPPLE; +void* __blue_glCore_glDeleteFencesAPPLE; +void* __blue_glCore_glSetFenceAPPLE; +void* __blue_glCore_glIsFenceAPPLE; +void* __blue_glCore_glTestFenceAPPLE; +void* __blue_glCore_glFinishFenceAPPLE; +void* __blue_glCore_glTestObjectAPPLE; +void* __blue_glCore_glFinishObjectAPPLE; +void* __blue_glCore_glBufferParameteriAPPLE; +void* __blue_glCore_glFlushMappedBufferRangeAPPLE; +void* __blue_glCore_glObjectPurgeableAPPLE; +void* __blue_glCore_glObjectUnpurgeableAPPLE; +void* __blue_glCore_glGetObjectParameterivAPPLE; void* __blue_glCore_glTextureRangeAPPLE; -void* __blue_glCore_glEvalCoord2xOES; -void* __blue_glCore_glCallCommandListNV; -void* __blue_glCore_glVariantdvEXT; -void* __blue_glCore_glBlendColorxOES; -void* __blue_glCore_glFramebufferTexture2DEXT; -void* __blue_glCore_glGetString; -void* __blue_glCore_glVertexStream3iATI; -void* __blue_glCore_glHintPGI; -void* __blue_glCore_glGenPerfMonitorsAMD; -void* __blue_glCore_glTextureSubImage3DEXT; -void* __blue_glCore_glVertexAttrib4usvARB; -void* __blue_glCore_glVertexArrayBindVertexBufferEXT; -void* __blue_glCore_glMinSampleShading; -void* __blue_glCore_glIsPathNV; -void* __blue_glCore_glGetPathTexGenivNV; -void* __blue_glCore_glProgramUniform3fv; -void* __blue_glCore_glVertexAttrib3sv; -void* __blue_glCore_glGetUniformuiv; -void* __blue_glCore_glGetPixelTransformParameterfvEXT; -void* __blue_glCore_glMultiTexCoord3dv; -void* __blue_glCore_glVertexAttrib3fvARB; -void* __blue_glCore_glGetProgramResourceIndex; -void* __blue_glCore_glGetMinmaxParameteriv; -void* __blue_glCore_glConvolutionParameterfEXT; -void* __blue_glCore_glProgramUniform4i64NV; -void* __blue_glCore_glProgramUniformMatrix4fvEXT; -void* __blue_glCore_glMultiTexCoordP4ui; +void* __blue_glCore_glGetTexParameterPointervAPPLE; +void* __blue_glCore_glBindVertexArrayAPPLE; +void* __blue_glCore_glDeleteVertexArraysAPPLE; +void* __blue_glCore_glGenVertexArraysAPPLE; +void* __blue_glCore_glIsVertexArrayAPPLE; +void* __blue_glCore_glVertexArrayRangeAPPLE; +void* __blue_glCore_glFlushVertexArrayRangeAPPLE; +void* __blue_glCore_glVertexArrayParameteriAPPLE; void* __blue_glCore_glEnableVertexAttribAPPLE; -void* __blue_glCore_glTexCoordP3uiv; -void* __blue_glCore_glCoverageModulationNV; -void* __blue_glCore_glMultiTexCoord3ivARB; -void* __blue_glCore_glListParameterfvSGIX; -void* __blue_glCore_glNormal3fVertex3fvSUN; -void* __blue_glCore_glVertexAttrib4bv; -void* __blue_glCore_glTexParameterIiv; -void* __blue_glCore_glNamedFramebufferParameteri; -void* __blue_glCore_glGetFramebufferParameterivEXT; -void* __blue_glCore_glReplacementCodeubSUN; -void* __blue_glCore_glTexCoord2bvOES; -void* __blue_glCore_glGetVideoui64vNV; -void* __blue_glCore_glTexStorage2DMultisample; -void* __blue_glCore_glColorTableParameteriv; -void* __blue_glCore_glConvolutionFilter2DEXT; -void* __blue_glCore_glSampleMaskEXT; -void* __blue_glCore_glGlobalAlphaFactorusSUN; -void* __blue_glCore_glBindRenderbuffer; -void* __blue_glCore_glVertexAttribI1i; -void* __blue_glCore_glProgramLocalParameterI4uiNV; -void* __blue_glCore_glProgramUniform4ui64ARB; -void* __blue_glCore_glObjectLabel; -void* __blue_glCore_glGetColorTableParameterivEXT; -void* __blue_glCore_glGetCombinerOutputParameterivNV; -void* __blue_glCore_glDrawElementsInstancedARB; -void* __blue_glCore_glGetMinmaxParameterfv; -void* __blue_glCore_glMatrixPushEXT; -void* __blue_glCore_glMultiTexParameterIivEXT; -void* __blue_glCore_glGetPathColorGenfvNV; -void* __blue_glCore_glBindProgramNV; -void* __blue_glCore_glFramebufferReadBufferEXT; -void* __blue_glCore_glFogCoordfEXT; -void* __blue_glCore_glVertexArrayNormalOffsetEXT; -void* __blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN; -void* __blue_glCore_glGetnUniformfv; -void* __blue_glCore_glPointParameterfEXT; -void* __blue_glCore_glEndVideoCaptureNV; -void* __blue_glCore_glVertexBlendARB; -void* __blue_glCore_glVertexAttribL3i64vNV; -void* __blue_glCore_glSecondaryColor3fEXT; +void* __blue_glCore_glDisableVertexAttribAPPLE; +void* __blue_glCore_glIsVertexAttribEnabledAPPLE; +void* __blue_glCore_glMapVertexAttrib1dAPPLE; +void* __blue_glCore_glMapVertexAttrib1fAPPLE; +void* __blue_glCore_glMapVertexAttrib2dAPPLE; +void* __blue_glCore_glMapVertexAttrib2fAPPLE; +void* __blue_glCore_glDrawBuffersATI; +void* __blue_glCore_glElementPointerATI; +void* __blue_glCore_glDrawElementArrayATI; +void* __blue_glCore_glDrawRangeElementArrayATI; +void* __blue_glCore_glTexBumpParameterivATI; +void* __blue_glCore_glTexBumpParameterfvATI; +void* __blue_glCore_glGetTexBumpParameterivATI; +void* __blue_glCore_glGetTexBumpParameterfvATI; +void* __blue_glCore_glGenFragmentShadersATI; +void* __blue_glCore_glBindFragmentShaderATI; +void* __blue_glCore_glDeleteFragmentShaderATI; +void* __blue_glCore_glBeginFragmentShaderATI; +void* __blue_glCore_glEndFragmentShaderATI; +void* __blue_glCore_glPassTexCoordATI; +void* __blue_glCore_glSampleMapATI; +void* __blue_glCore_glColorFragmentOp1ATI; +void* __blue_glCore_glColorFragmentOp2ATI; +void* __blue_glCore_glColorFragmentOp3ATI; +void* __blue_glCore_glAlphaFragmentOp1ATI; +void* __blue_glCore_glAlphaFragmentOp2ATI; +void* __blue_glCore_glAlphaFragmentOp3ATI; +void* __blue_glCore_glSetFragmentShaderConstantATI; +void* __blue_glCore_glMapObjectBufferATI; +void* __blue_glCore_glUnmapObjectBufferATI; +void* __blue_glCore_glPNTrianglesiATI; +void* __blue_glCore_glPNTrianglesfATI; +void* __blue_glCore_glStencilOpSeparateATI; void* __blue_glCore_glStencilFuncSeparateATI; -void* __blue_glCore_glCompressedMultiTexSubImage2DEXT; -void* __blue_glCore_glTransformPathNV; -void* __blue_glCore_glIsEnabledi; -void* __blue_glCore_glExtractComponentEXT; -void* __blue_glCore_glGetFixedvOES; -void* __blue_glCore_glDeleteProgramPipelines; -void* __blue_glCore_glCopyMultiTexSubImage3DEXT; -void* __blue_glCore_glCreateStatesNV; -void* __blue_glCore_glSwizzleEXT; -void* __blue_glCore_glVertexWeightfvEXT; -void* __blue_glCore_glNormalPointerEXT; -void* __blue_glCore_glGetConvolutionFilterEXT; -void* __blue_glCore_glCurrentPaletteMatrixARB; -void* __blue_glCore_glVertexStream4sATI; -void* __blue_glCore_glUniform3ui64ARB; -void* __blue_glCore_glProgramUniform1uivEXT; -void* __blue_glCore_glVertexAttribs3dvNV; -void* __blue_glCore_glExecuteProgramNV; -void* __blue_glCore_glFrameZoomSGIX; -void* __blue_glCore_glFragmentMaterialfSGIX; -void* __blue_glCore_glFramebufferTextureLayerEXT; +void* __blue_glCore_glNewObjectBufferATI; +void* __blue_glCore_glIsObjectBufferATI; +void* __blue_glCore_glUpdateObjectBufferATI; +void* __blue_glCore_glGetObjectBufferfvATI; +void* __blue_glCore_glGetObjectBufferivATI; +void* __blue_glCore_glFreeObjectBufferATI; +void* __blue_glCore_glArrayObjectATI; +void* __blue_glCore_glGetArrayObjectfvATI; +void* __blue_glCore_glGetArrayObjectivATI; +void* __blue_glCore_glVariantArrayObjectATI; +void* __blue_glCore_glGetVariantArrayObjectfvATI; +void* __blue_glCore_glGetVariantArrayObjectivATI; +void* __blue_glCore_glVertexAttribArrayObjectATI; +void* __blue_glCore_glGetVertexAttribArrayObjectfvATI; +void* __blue_glCore_glGetVertexAttribArrayObjectivATI; +void* __blue_glCore_glVertexStream1sATI; +void* __blue_glCore_glVertexStream1svATI; void* __blue_glCore_glVertexStream1iATI; -void* __blue_glCore_glVertexAttrib3s; -void* __blue_glCore_glFramebufferTextureMultiviewOVR; -void* __blue_glCore_glElementPointerAPPLE; -void* __blue_glCore_glWindowPos4ivMESA; -void* __blue_glCore_glTexSubImage3D; -void* __blue_glCore_glGetFragmentMaterialfvSGIX; -void* __blue_glCore_glProgramUniform1dEXT; -void* __blue_glCore_glGetFragmentLightfvSGIX; -void* __blue_glCore_glTexCoord2bOES; -void* __blue_glCore_glVertexAttrib3fv; -void* __blue_glCore_glMakeNamedBufferNonResidentNV; -void* __blue_glCore_glIsProgramARB; -void* __blue_glCore_glScissorArrayv; -void* __blue_glCore_glMultiDrawElementsIndirect; -void* __blue_glCore_glGetMultiTexParameterfvEXT; -void* __blue_glCore_glWindowPos2iARB; -void* __blue_glCore_glGetProgramStringNV; -void* __blue_glCore_glTranslatexOES; -void* __blue_glCore_glMultiTexCoord4d; -void* __blue_glCore_glColorTableParameterfvSGI; -void* __blue_glCore_glTexCoord3bvOES; -void* __blue_glCore_glUniform2ui64vARB; -void* __blue_glCore_glMatrixIndexusvARB; -void* __blue_glCore_glGetMultiTexGenfvEXT; -void* __blue_glCore_glGenerateTextureMipmapEXT; -void* __blue_glCore_glGetMapParameterivNV; -void* __blue_glCore_glGetConvolutionParameterxvOES; -void* __blue_glCore_glVertexAttrib4fvNV; -void* __blue_glCore_glBufferDataARB; -void* __blue_glCore_glWindowPos4fMESA; -void* __blue_glCore_glPushDebugGroup; -void* __blue_glCore_glProgramUniform2fEXT; -void* __blue_glCore_glCopyTexImage1DEXT; -void* __blue_glCore_glCompressedTexSubImage2DARB; -void* __blue_glCore_glCopyColorSubTableEXT; -void* __blue_glCore_glTransformFeedbackAttribsNV; -void* __blue_glCore_glMatrixFrustumEXT; -void* __blue_glCore_glIsBufferARB; -void* __blue_glCore_glUniform3fvARB; -void* __blue_glCore_glMultiTexCoord3dARB; -void* __blue_glCore_glIndexPointerEXT; -void* __blue_glCore_glMatrixLoad3x3fNV; -void* __blue_glCore_glUnmapNamedBufferEXT; -void* __blue_glCore_glCreateProgramObjectARB; -void* __blue_glCore_glMapGrid2xOES; -void* __blue_glCore_glVertexPointerEXT; -void* __blue_glCore_glVertexStream4svATI; -void* __blue_glCore_glMultiTexCoord2hvNV; -void* __blue_glCore_glLabelObjectEXT; -void* __blue_glCore_glTextureImage3DMultisampleNV; -void* __blue_glCore_glMultTransposeMatrixd; -void* __blue_glCore_glMultiTexCoord2fARB; -void* __blue_glCore_glMultiTexCoord2dARB; -void* __blue_glCore_glGetCombinerOutputParameterfvNV; -void* __blue_glCore_glGetBufferPointerv; -void* __blue_glCore_glVertexAttrib1dNV; -void* __blue_glCore_glTextureView; -void* __blue_glCore_glBlitFramebufferEXT; -void* __blue_glCore_glVertexWeightPointerEXT; -void* __blue_glCore_glBindTextures; -void* __blue_glCore_glClearBufferiv; -void* __blue_glCore_glMultiTexCoord4ivARB; -void* __blue_glCore_glGetImageHandleNV; -void* __blue_glCore_glGetDoublei_vEXT; -void* __blue_glCore_glProgramUniform1i64NV; -void* __blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; -void* __blue_glCore_glWindowPos3s; -void* __blue_glCore_glUniform4i64ARB; -void* __blue_glCore_glProgramUniform2dvEXT; -void* __blue_glCore_glMultiTexSubImage1DEXT; -void* __blue_glCore_glHint; -void* __blue_glCore_glProgramUniformMatrix4fv; -void* __blue_glCore_glTexCoord4bvOES; -void* __blue_glCore_glGetQueryObjectiv; -void* __blue_glCore_glGetQueryIndexediv; -void* __blue_glCore_glTexCoordP4ui; +void* __blue_glCore_glVertexStream1ivATI; +void* __blue_glCore_glVertexStream1fATI; +void* __blue_glCore_glVertexStream1fvATI; +void* __blue_glCore_glVertexStream1dATI; +void* __blue_glCore_glVertexStream1dvATI; +void* __blue_glCore_glVertexStream2sATI; +void* __blue_glCore_glVertexStream2svATI; +void* __blue_glCore_glVertexStream2iATI; +void* __blue_glCore_glVertexStream2ivATI; +void* __blue_glCore_glVertexStream2fATI; void* __blue_glCore_glVertexStream2fvATI; -void* __blue_glCore_glUniform3fv; -void* __blue_glCore_glUniformMatrix2dv; -void* __blue_glCore_glIsObjectBufferATI; -void* __blue_glCore_glVertexAttribP2uiv; -void* __blue_glCore_glCompileShader; -void* __blue_glCore_glMatrixScalefEXT; +void* __blue_glCore_glVertexStream2dATI; +void* __blue_glCore_glVertexStream2dvATI; +void* __blue_glCore_glVertexStream3sATI; +void* __blue_glCore_glVertexStream3svATI; +void* __blue_glCore_glVertexStream3iATI; +void* __blue_glCore_glVertexStream3ivATI; +void* __blue_glCore_glVertexStream3fATI; +void* __blue_glCore_glVertexStream3fvATI; +void* __blue_glCore_glVertexStream3dATI; +void* __blue_glCore_glVertexStream3dvATI; +void* __blue_glCore_glVertexStream4sATI; +void* __blue_glCore_glVertexStream4svATI; +void* __blue_glCore_glVertexStream4iATI; +void* __blue_glCore_glVertexStream4ivATI; +void* __blue_glCore_glVertexStream4fATI; +void* __blue_glCore_glVertexStream4fvATI; +void* __blue_glCore_glVertexStream4dATI; +void* __blue_glCore_glVertexStream4dvATI; +void* __blue_glCore_glNormalStream3bATI; +void* __blue_glCore_glNormalStream3bvATI; +void* __blue_glCore_glNormalStream3sATI; +void* __blue_glCore_glNormalStream3svATI; +void* __blue_glCore_glNormalStream3iATI; +void* __blue_glCore_glNormalStream3ivATI; +void* __blue_glCore_glNormalStream3fATI; +void* __blue_glCore_glNormalStream3fvATI; +void* __blue_glCore_glNormalStream3dATI; +void* __blue_glCore_glNormalStream3dvATI; +void* __blue_glCore_glClientActiveVertexStreamATI; +void* __blue_glCore_glVertexBlendEnviATI; +void* __blue_glCore_glVertexBlendEnvfATI; +void* __blue_glCore_glUniformBufferEXT; +void* __blue_glCore_glGetUniformBufferSizeEXT; +void* __blue_glCore_glGetUniformOffsetEXT; +void* __blue_glCore_glBlendColorEXT; +void* __blue_glCore_glBlendEquationSeparateEXT; +void* __blue_glCore_glBlendFuncSeparateEXT; +void* __blue_glCore_glBlendEquationEXT; +void* __blue_glCore_glColorSubTableEXT; +void* __blue_glCore_glCopyColorSubTableEXT; +void* __blue_glCore_glLockArraysEXT; +void* __blue_glCore_glUnlockArraysEXT; +void* __blue_glCore_glConvolutionFilter1DEXT; +void* __blue_glCore_glConvolutionFilter2DEXT; +void* __blue_glCore_glConvolutionParameterfEXT; +void* __blue_glCore_glConvolutionParameterfvEXT; +void* __blue_glCore_glConvolutionParameteriEXT; +void* __blue_glCore_glConvolutionParameterivEXT; +void* __blue_glCore_glCopyConvolutionFilter1DEXT; +void* __blue_glCore_glCopyConvolutionFilter2DEXT; +void* __blue_glCore_glGetConvolutionFilterEXT; +void* __blue_glCore_glGetConvolutionParameterfvEXT; +void* __blue_glCore_glGetConvolutionParameterivEXT; +void* __blue_glCore_glGetSeparableFilterEXT; +void* __blue_glCore_glSeparableFilter2DEXT; +void* __blue_glCore_glTangent3bEXT; +void* __blue_glCore_glTangent3bvEXT; +void* __blue_glCore_glTangent3dEXT; +void* __blue_glCore_glTangent3dvEXT; +void* __blue_glCore_glTangent3fEXT; +void* __blue_glCore_glTangent3fvEXT; +void* __blue_glCore_glTangent3iEXT; +void* __blue_glCore_glTangent3ivEXT; +void* __blue_glCore_glTangent3sEXT; +void* __blue_glCore_glTangent3svEXT; +void* __blue_glCore_glBinormal3bEXT; +void* __blue_glCore_glBinormal3bvEXT; +void* __blue_glCore_glBinormal3dEXT; +void* __blue_glCore_glBinormal3dvEXT; +void* __blue_glCore_glBinormal3fEXT; +void* __blue_glCore_glBinormal3fvEXT; +void* __blue_glCore_glBinormal3iEXT; void* __blue_glCore_glBinormal3ivEXT; -void* __blue_glCore_glGetMapAttribParameterivNV; -void* __blue_glCore_glGetnPixelMapusvARB; -void* __blue_glCore_glGetPerfMonitorCounterStringAMD; -void* __blue_glCore_glIsTextureHandleResidentNV; -void* __blue_glCore_glWaitSync; -void* __blue_glCore_glGenSamplers; -void* __blue_glCore_glCompressedTextureImage3DEXT; -void* __blue_glCore_glGetPerfMonitorCounterInfoAMD; -void* __blue_glCore_glUniform2ivARB; -void* __blue_glCore_glVertexAttrib2sARB; -void* __blue_glCore_glDrawCommandsAddressNV; -void* __blue_glCore_glTexCoord1hNV; -void* __blue_glCore_glGetFirstPerfQueryIdINTEL; -void* __blue_glCore_glFramebufferTexture1D; -void* __blue_glCore_glGetQueryObjecti64v; -void* __blue_glCore_glVertexStream1dvATI; -void* __blue_glCore_glTexCoordPointerListIBM; -void* __blue_glCore_glTexImage1D; -void* __blue_glCore_glWindowPos2fvMESA; -void* __blue_glCore_glIsFenceNV; -void* __blue_glCore_glVariantsvEXT; -void* __blue_glCore_glProgramUniform3dEXT; -void* __blue_glCore_glUniform2iARB; -void* __blue_glCore_glPointParameteri; -void* __blue_glCore_glCreateRenderbuffers; -void* __blue_glCore_glUniform4i; -void* __blue_glCore_glDeleteCommandListsNV; -void* __blue_glCore_glRequestResidentProgramsNV; -void* __blue_glCore_glTextureSubImage3D; -void* __blue_glCore_glPixelStorex; -void* __blue_glCore_glVertexAttrib4fARB; -void* __blue_glCore_glGetVertexAttribIuiv; -void* __blue_glCore_glVertexAttrib1s; -void* __blue_glCore_glProgramUniformMatrix4x3dv; -void* __blue_glCore_glActiveVaryingNV; -void* __blue_glCore_glTangent3sEXT; -void* __blue_glCore_glConvolutionParameteriv; -void* __blue_glCore_glQueryCounter; -void* __blue_glCore_glProgramUniform3d; -void* __blue_glCore_glGetUniformi64vARB; -void* __blue_glCore_glGetnUniformui64vARB; -void* __blue_glCore_glNamedProgramLocalParameters4fvEXT; -void* __blue_glCore_glGetShaderSource; -void* __blue_glCore_glClearDepthdNV; -void* __blue_glCore_glSecondaryColorP3ui; -void* __blue_glCore_glMinmax; -void* __blue_glCore_glVariantubvEXT; void* __blue_glCore_glBinormal3sEXT; -void* __blue_glCore_glVertexAttrib4d; -void* __blue_glCore_glEndTransformFeedbackEXT; -void* __blue_glCore_glTexImage2DMultisample; -void* __blue_glCore_glLoadMatrixxOES; -void* __blue_glCore_glGetUniformfv; -void* __blue_glCore_glStartInstrumentsSGIX; -void* __blue_glCore_glColor4ubVertex3fvSUN; -void* __blue_glCore_glMatrixLoadTransposefEXT; -void* __blue_glCore_glGetCompressedTexImage; -void* __blue_glCore_glGetNamedProgramLocalParameterdvEXT; -void* __blue_glCore_glColorPointerEXT; -void* __blue_glCore_glTangent3fEXT; -void* __blue_glCore_glWindowPos2dvARB; -void* __blue_glCore_glGetInvariantIntegervEXT; -void* __blue_glCore_glProgramUniform3fEXT; -void* __blue_glCore_glPixelTexGenSGIX; -void* __blue_glCore_glClampColor; -void* __blue_glCore_glVertexAttribs4hvNV; -void* __blue_glCore_glGetIntegeri_v; -void* __blue_glCore_glDeleteVertexArraysAPPLE; -void* __blue_glCore_glGetAttachedShaders; -void* __blue_glCore_glEndTransformFeedbackNV; -void* __blue_glCore_glGetColorTableParameterfvSGI; -void* __blue_glCore_glBindBufferBase; -void* __blue_glCore_glDeleteSync; -void* __blue_glCore_glGetTransformFeedbackVarying; -void* __blue_glCore_glVertexAttrib1svARB; -void* __blue_glCore_glCopyPathNV; -void* __blue_glCore_glBindTransformFeedback; -void* __blue_glCore_glVertexAttrib4usv; -void* __blue_glCore_glCompressedMultiTexImage3DEXT; -void* __blue_glCore_glMatrixLoadTranspose3x3fNV; -void* __blue_glCore_glVertexStream1sATI; -void* __blue_glCore_glMultiDrawArraysIndirectBindlessNV; -void* __blue_glCore_glTexParameterIuiv; -void* __blue_glCore_glVDPAUFiniNV; -void* __blue_glCore_glUniform1iv; -void* __blue_glCore_glStencilThenCoverStrokePathNV; -void* __blue_glCore_glUniform3i64vNV; -void* __blue_glCore_glGetFragDataLocationEXT; -void* __blue_glCore_glProgramUniformMatrix4dv; -void* __blue_glCore_glGetnUniformiv; -void* __blue_glCore_glMapBuffer; -void* __blue_glCore_glScissorIndexed; -void* __blue_glCore_glUniform3fARB; -void* __blue_glCore_glGetColorTable; -void* __blue_glCore_glFramebufferTextureFaceARB; -void* __blue_glCore_glBeginTransformFeedbackEXT; -void* __blue_glCore_glGenFencesNV; +void* __blue_glCore_glBinormal3svEXT; +void* __blue_glCore_glTangentPointerEXT; +void* __blue_glCore_glBinormalPointerEXT; +void* __blue_glCore_glCopyTexImage1DEXT; +void* __blue_glCore_glCopyTexImage2DEXT; +void* __blue_glCore_glCopyTexSubImage1DEXT; +void* __blue_glCore_glCopyTexSubImage2DEXT; +void* __blue_glCore_glCopyTexSubImage3DEXT; +void* __blue_glCore_glCullParameterdvEXT; +void* __blue_glCore_glCullParameterfvEXT; +void* __blue_glCore_glLabelObjectEXT; +void* __blue_glCore_glGetObjectLabelEXT; +void* __blue_glCore_glInsertEventMarkerEXT; +void* __blue_glCore_glPushGroupMarkerEXT; +void* __blue_glCore_glPopGroupMarkerEXT; +void* __blue_glCore_glDepthBoundsEXT; +void* __blue_glCore_glMatrixLoadfEXT; +void* __blue_glCore_glMatrixLoaddEXT; +void* __blue_glCore_glMatrixMultfEXT; +void* __blue_glCore_glMatrixMultdEXT; +void* __blue_glCore_glMatrixLoadIdentityEXT; +void* __blue_glCore_glMatrixRotatefEXT; +void* __blue_glCore_glMatrixRotatedEXT; +void* __blue_glCore_glMatrixScalefEXT; +void* __blue_glCore_glMatrixScaledEXT; +void* __blue_glCore_glMatrixTranslatefEXT; +void* __blue_glCore_glMatrixTranslatedEXT; +void* __blue_glCore_glMatrixFrustumEXT; +void* __blue_glCore_glMatrixOrthoEXT; +void* __blue_glCore_glMatrixPopEXT; +void* __blue_glCore_glMatrixPushEXT; +void* __blue_glCore_glClientAttribDefaultEXT; +void* __blue_glCore_glPushClientAttribDefaultEXT; +void* __blue_glCore_glTextureParameterfEXT; +void* __blue_glCore_glTextureParameterfvEXT; +void* __blue_glCore_glTextureParameteriEXT; +void* __blue_glCore_glTextureParameterivEXT; +void* __blue_glCore_glTextureImage1DEXT; +void* __blue_glCore_glTextureImage2DEXT; +void* __blue_glCore_glTextureSubImage1DEXT; +void* __blue_glCore_glTextureSubImage2DEXT; +void* __blue_glCore_glCopyTextureImage1DEXT; +void* __blue_glCore_glCopyTextureImage2DEXT; +void* __blue_glCore_glCopyTextureSubImage1DEXT; +void* __blue_glCore_glCopyTextureSubImage2DEXT; +void* __blue_glCore_glGetTextureImageEXT; +void* __blue_glCore_glGetTextureParameterfvEXT; +void* __blue_glCore_glGetTextureParameterivEXT; +void* __blue_glCore_glGetTextureLevelParameterfvEXT; +void* __blue_glCore_glGetTextureLevelParameterivEXT; +void* __blue_glCore_glTextureImage3DEXT; +void* __blue_glCore_glTextureSubImage3DEXT; +void* __blue_glCore_glCopyTextureSubImage3DEXT; +void* __blue_glCore_glBindMultiTextureEXT; +void* __blue_glCore_glMultiTexCoordPointerEXT; +void* __blue_glCore_glMultiTexEnvfEXT; +void* __blue_glCore_glMultiTexEnvfvEXT; +void* __blue_glCore_glMultiTexEnviEXT; +void* __blue_glCore_glMultiTexEnvivEXT; +void* __blue_glCore_glMultiTexGendEXT; +void* __blue_glCore_glMultiTexGendvEXT; +void* __blue_glCore_glMultiTexGenfEXT; +void* __blue_glCore_glMultiTexGenfvEXT; +void* __blue_glCore_glMultiTexGeniEXT; +void* __blue_glCore_glMultiTexGenivEXT; +void* __blue_glCore_glGetMultiTexEnvfvEXT; +void* __blue_glCore_glGetMultiTexEnvivEXT; +void* __blue_glCore_glGetMultiTexGendvEXT; +void* __blue_glCore_glGetMultiTexGenfvEXT; +void* __blue_glCore_glGetMultiTexGenivEXT; +void* __blue_glCore_glMultiTexParameteriEXT; +void* __blue_glCore_glMultiTexParameterivEXT; +void* __blue_glCore_glMultiTexParameterfEXT; +void* __blue_glCore_glMultiTexParameterfvEXT; +void* __blue_glCore_glMultiTexImage1DEXT; void* __blue_glCore_glMultiTexImage2DEXT; -void* __blue_glCore_glVertexAttrib2hNV; -void* __blue_glCore_glFragmentLightfvSGIX; -void* __blue_glCore_glProgramUniform2iv; -void* __blue_glCore_glVertexAttribL4d; -void* __blue_glCore_glMapBufferARB; -void* __blue_glCore_glBindVideoCaptureStreamTextureNV; -void* __blue_glCore_glConvolutionParameterxvOES; -void* __blue_glCore_glTexParameterIuivEXT; -void* __blue_glCore_glVertexAttribI4ubv; -void* __blue_glCore_glTexSubImage1DEXT; -void* __blue_glCore_glTextureStorage2DEXT; -void* __blue_glCore_glTexSubImage3DEXT; -void* __blue_glCore_glVertex2xvOES; +void* __blue_glCore_glMultiTexSubImage1DEXT; +void* __blue_glCore_glMultiTexSubImage2DEXT; +void* __blue_glCore_glCopyMultiTexImage1DEXT; +void* __blue_glCore_glCopyMultiTexImage2DEXT; +void* __blue_glCore_glCopyMultiTexSubImage1DEXT; +void* __blue_glCore_glCopyMultiTexSubImage2DEXT; void* __blue_glCore_glGetMultiTexImageEXT; -void* __blue_glCore_glNormalStream3ivATI; -void* __blue_glCore_glGetNamedBufferPointerv; -void* __blue_glCore_glTexBuffer; -void* __blue_glCore_glCombinerInputNV; -void* __blue_glCore_glVertexAttrib1dARB; -void* __blue_glCore_glVertexP3ui; -void* __blue_glCore_glMatrixMult3x2fNV; -void* __blue_glCore_glNamedFramebufferTexture2DEXT; -void* __blue_glCore_glGetTextureLevelParameteriv; -void* __blue_glCore_glPixelMapx; -void* __blue_glCore_glBlendFuncSeparatei; -void* __blue_glCore_glTessellationModeAMD; -void* __blue_glCore_glProgramEnvParametersI4uivNV; -void* __blue_glCore_glGetColorTableParameterfvEXT; -void* __blue_glCore_glVertexAttribI1uiEXT; -void* __blue_glCore_glPrioritizeTexturesEXT; -void* __blue_glCore_glProgramUniform1i64vNV; -void* __blue_glCore_glGetTextureParameteriv; -void* __blue_glCore_glGetTransformFeedbackiv; -void* __blue_glCore_glMultiDrawArraysIndirectBindlessCountNV; -void* __blue_glCore_glUseShaderProgramEXT; -void* __blue_glCore_glDeleteTransformFeedbacks; -void* __blue_glCore_glCoverageModulationTableNV; -void* __blue_glCore_glMultiTexCoord1d; -void* __blue_glCore_glGetTexLevelParameteriv; -void* __blue_glCore_glProgramUniform4ui; -void* __blue_glCore_glProgramUniform4iv; -void* __blue_glCore_glTangent3fvEXT; -void* __blue_glCore_glViewportIndexedfv; -void* __blue_glCore_glSampleMaski; -void* __blue_glCore_glProgramUniformMatrix4x3dvEXT; -void* __blue_glCore_glCompileShaderARB; -void* __blue_glCore_glUniform4ui64ARB; -void* __blue_glCore_glTexCoord3xOES; -void* __blue_glCore_glGetInternalformativ; -void* __blue_glCore_glObjectPtrLabel; -void* __blue_glCore_glNormal3hvNV; -void* __blue_glCore_glProgramUniform1uiv; -void* __blue_glCore_glGenFragmentShadersATI; -void* __blue_glCore_glTexCoord2hvNV; -void* __blue_glCore_glFinishAsyncSGIX; -void* __blue_glCore_glEnableVertexAttribArrayARB; -void* __blue_glCore_glDeleteSamplers; -void* __blue_glCore_glVertexAttrib1fvARB; -void* __blue_glCore_glGetnUniformivARB; -void* __blue_glCore_glLoadTransposeMatrixd; -void* __blue_glCore_glProgramParameteri; -void* __blue_glCore_glCreateShader; -void* __blue_glCore_glFragmentCoverageColorNV; -void* __blue_glCore_glVertexStream3dvATI; -void* __blue_glCore_glUniformHandleui64ARB; -void* __blue_glCore_glGetVaryingLocationNV; +void* __blue_glCore_glGetMultiTexParameterfvEXT; +void* __blue_glCore_glGetMultiTexParameterivEXT; +void* __blue_glCore_glGetMultiTexLevelParameterfvEXT; +void* __blue_glCore_glGetMultiTexLevelParameterivEXT; +void* __blue_glCore_glMultiTexImage3DEXT; +void* __blue_glCore_glMultiTexSubImage3DEXT; +void* __blue_glCore_glCopyMultiTexSubImage3DEXT; +void* __blue_glCore_glEnableClientStateIndexedEXT; +void* __blue_glCore_glDisableClientStateIndexedEXT; +void* __blue_glCore_glGetFloatIndexedvEXT; +void* __blue_glCore_glGetDoubleIndexedvEXT; +void* __blue_glCore_glGetPointerIndexedvEXT; +void* __blue_glCore_glEnableIndexedEXT; +void* __blue_glCore_glDisableIndexedEXT; +void* __blue_glCore_glIsEnabledIndexedEXT; +void* __blue_glCore_glGetIntegerIndexedvEXT; +void* __blue_glCore_glGetBooleanIndexedvEXT; +void* __blue_glCore_glCompressedTextureImage3DEXT; +void* __blue_glCore_glCompressedTextureImage2DEXT; +void* __blue_glCore_glCompressedTextureImage1DEXT; +void* __blue_glCore_glCompressedTextureSubImage3DEXT; void* __blue_glCore_glCompressedTextureSubImage2DEXT; -void* __blue_glCore_glTangent3dEXT; -void* __blue_glCore_glGetNamedBufferPointervEXT; -void* __blue_glCore_glVertex2bvOES; -void* __blue_glCore_glProgramBufferParametersIuivNV; -void* __blue_glCore_glGetnTexImageARB; -void* __blue_glCore_glSetFenceNV; -void* __blue_glCore_glPathParameterfvNV; -void* __blue_glCore_glVertexAttribFormat; -void* __blue_glCore_glConservativeRasterParameterfNV; -void* __blue_glCore_glGetVertexAttribIuivEXT; -void* __blue_glCore_glBindMultiTextureEXT; -void* __blue_glCore_glMapControlPointsNV; -void* __blue_glCore_glVertexAttrib4Nsv; +void* __blue_glCore_glCompressedTextureSubImage1DEXT; +void* __blue_glCore_glGetCompressedTextureImageEXT; +void* __blue_glCore_glCompressedMultiTexImage3DEXT; void* __blue_glCore_glCompressedMultiTexImage2DEXT; -void* __blue_glCore_glIsNamedBufferResidentNV; -void* __blue_glCore_glLoadProgramNV; -void* __blue_glCore_glClearColor; -void* __blue_glCore_glUniform2uivEXT; -void* __blue_glCore_glMultiTexGenfEXT; -void* __blue_glCore_glGetUniformdv; -void* __blue_glCore_glGenRenderbuffersEXT; -void* __blue_glCore_glGetMultisamplefv; -void* __blue_glCore_glMapNamedBuffer; -void* __blue_glCore_glDeleteFramebuffersEXT; -void* __blue_glCore_glVertexAttribI4usvEXT; -void* __blue_glCore_glSecondaryColor3hNV; -void* __blue_glCore_glGenerateMipmap; -void* __blue_glCore_glProgramEnvParameterI4uivNV; -void* __blue_glCore_glSeparableFilter2D; -void* __blue_glCore_glFogCoorddEXT; -void* __blue_glCore_glGetPerfCounterInfoINTEL; -void* __blue_glCore_glUniform4uiv; -void* __blue_glCore_glVertexAttribL2dv; -void* __blue_glCore_glUniform1dv; -void* __blue_glCore_glVertexAttribL1ui64ARB; -void* __blue_glCore_glEndPerfQueryINTEL; -void* __blue_glCore_glVertexArrayEdgeFlagOffsetEXT; -void* __blue_glCore_glVertexAttrib1dv; -void* __blue_glCore_glProgramUniformMatrix2dvEXT; -void* __blue_glCore_glDepthRange; -void* __blue_glCore_glCombinerParameterfNV; -void* __blue_glCore_glVariantArrayObjectATI; -void* __blue_glCore_glDeleteBuffersARB; -void* __blue_glCore_glFragmentLightiSGIX; -void* __blue_glCore_glGetSamplerParameterIiv; -void* __blue_glCore_glImportSyncEXT; -void* __blue_glCore_glGetVertexAttribivARB; -void* __blue_glCore_glVertexAttribI2ui; -void* __blue_glCore_glGetObjectParameterivARB; -void* __blue_glCore_glEnableClientStateiEXT; -void* __blue_glCore_glGetnUniformi64vARB; -void* __blue_glCore_glDeleteFencesAPPLE; -void* __blue_glCore_glTransformFeedbackBufferRange; -void* __blue_glCore_glProgramUniform2fvEXT; -void* __blue_glCore_glFramebufferTextureLayerARB; -void* __blue_glCore_glVertexAttribLFormatNV; -void* __blue_glCore_glVertexAttrib2fvARB; -void* __blue_glCore_glWindowPos4fvMESA; -void* __blue_glCore_glMakeNamedBufferResidentNV; -void* __blue_glCore_glProgramUniformMatrix3x4fvEXT; -void* __blue_glCore_glSamplePatternSGIS; -void* __blue_glCore_glVDPAUGetSurfaceivNV; -void* __blue_glCore_glProgramUniformMatrix4x2fvEXT; -void* __blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN; -void* __blue_glCore_glWindowPos3sMESA; -void* __blue_glCore_glTexGenxOES; -void* __blue_glCore_glVertexAttrib4dNV; -void* __blue_glCore_glTangentPointerEXT; -void* __blue_glCore_glPixelTransformParameterfvEXT; -void* __blue_glCore_glProgramUniform1i; -void* __blue_glCore_glMultiTexCoord2bOES; -void* __blue_glCore_glVertexAttribI2iv; -void* __blue_glCore_glWindowPos4iMESA; -void* __blue_glCore_glTestFenceNV; -void* __blue_glCore_glDispatchComputeGroupSizeARB; -void* __blue_glCore_glShaderOp3EXT; -void* __blue_glCore_glSampleMaskSGIS; -void* __blue_glCore_glMultiTexParameterivEXT; -void* __blue_glCore_glGetnMinmax; -void* __blue_glCore_glColorP3ui; -void* __blue_glCore_glBeginQueryARB; -void* __blue_glCore_glMultiDrawArraysIndirectAMD; -void* __blue_glCore_glRasterPos4xOES; -void* __blue_glCore_glFogCoordPointer; -void* __blue_glCore_glTextureLightEXT; -void* __blue_glCore_glGetCombinerInputParameterfvNV; -void* __blue_glCore_glDeleteFragmentShaderATI; -void* __blue_glCore_glMultiTexCoord2sv; -void* __blue_glCore_glMultiTexCoord2s; -void* __blue_glCore_glLightModelxvOES; -void* __blue_glCore_glTessellationFactorAMD; -void* __blue_glCore_glVariantivEXT; -void* __blue_glCore_glNamedFramebufferRenderbuffer; -void* __blue_glCore_glWindowPos2ivARB; -void* __blue_glCore_glVertexArrayFogCoordOffsetEXT; -void* __blue_glCore_glUniform2i; -void* __blue_glCore_glGetTexBumpParameterivATI; -void* __blue_glCore_glSamplerParameterIuiv; -void* __blue_glCore_glClearBufferfv; -void* __blue_glCore_glBindTextureUnitParameterEXT; -void* __blue_glCore_glMultiTexCoord3hNV; -void* __blue_glCore_glSecondaryColor3us; -void* __blue_glCore_glReplacementCodeusvSUN; -void* __blue_glCore_glSecondaryColor3bvEXT; -void* __blue_glCore_glGetProgramPipelineInfoLog; -void* __blue_glCore_glGetVideoi64vNV; -void* __blue_glCore_glMultiTexCoord3iv; -void* __blue_glCore_glVertexArrayTexCoordOffsetEXT; -void* __blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT; -void* __blue_glCore_glGetSamplerParameterIuiv; -void* __blue_glCore_glVertexAttrib2dARB; -void* __blue_glCore_glNormalStream3svATI; -void* __blue_glCore_glClientActiveVertexStreamATI; -void* __blue_glCore_glStencilThenCoverFillPathInstancedNV; -void* __blue_glCore_glSecondaryColor3uiEXT; -void* __blue_glCore_glTexCoord2hNV; -void* __blue_glCore_glVertexAttrib3fARB; -void* __blue_glCore_glGetQueryBufferObjectui64v; -void* __blue_glCore_glGetMaterialxOES; -void* __blue_glCore_glMultiDrawArrays; -void* __blue_glCore_glSecondaryColor3iEXT; -void* __blue_glCore_glProgramUniform2ui64NV; -void* __blue_glCore_glDeleteQueries; -void* __blue_glCore_glDeleteRenderbuffers; -void* __blue_glCore_glGetProgramLocalParameterdvARB; -void* __blue_glCore_glTexCoord2xOES; -void* __blue_glCore_glBindBuffer; -void* __blue_glCore_glResumeTransformFeedback; -void* __blue_glCore_glFlushPixelDataRangeNV; -void* __blue_glCore_glSecondaryColorPointer; -void* __blue_glCore_glVideoCaptureStreamParameterdvNV; -void* __blue_glCore_glTextureSubImage2DEXT; -void* __blue_glCore_glDeletePathsNV; -void* __blue_glCore_glGetFloatv; -void* __blue_glCore_glVertexAttribI3uivEXT; -void* __blue_glCore_glGetVertexAttribdvARB; -void* __blue_glCore_glUniform4ui64NV; -void* __blue_glCore_glGetTextureLevelParameterfv; -void* __blue_glCore_glWindowPos2i; -void* __blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN; +void* __blue_glCore_glCompressedMultiTexImage1DEXT; void* __blue_glCore_glCompressedMultiTexSubImage3DEXT; -void* __blue_glCore_glGetTexParameterIivEXT; -void* __blue_glCore_glDebugMessageCallbackARB; -void* __blue_glCore_glWeightPointerARB; -void* __blue_glCore_glFogxOES; +void* __blue_glCore_glCompressedMultiTexSubImage2DEXT; +void* __blue_glCore_glCompressedMultiTexSubImage1DEXT; +void* __blue_glCore_glGetCompressedMultiTexImageEXT; +void* __blue_glCore_glMatrixLoadTransposefEXT; +void* __blue_glCore_glMatrixLoadTransposedEXT; +void* __blue_glCore_glMatrixMultTransposefEXT; +void* __blue_glCore_glMatrixMultTransposedEXT; +void* __blue_glCore_glNamedBufferDataEXT; +void* __blue_glCore_glNamedBufferSubDataEXT; +void* __blue_glCore_glMapNamedBufferEXT; +void* __blue_glCore_glUnmapNamedBufferEXT; +void* __blue_glCore_glGetNamedBufferParameterivEXT; +void* __blue_glCore_glGetNamedBufferPointervEXT; +void* __blue_glCore_glGetNamedBufferSubDataEXT; +void* __blue_glCore_glProgramUniform1fEXT; +void* __blue_glCore_glProgramUniform2fEXT; +void* __blue_glCore_glProgramUniform3fEXT; +void* __blue_glCore_glProgramUniform4fEXT; +void* __blue_glCore_glProgramUniform1iEXT; +void* __blue_glCore_glProgramUniform2iEXT; +void* __blue_glCore_glProgramUniform3iEXT; +void* __blue_glCore_glProgramUniform4iEXT; +void* __blue_glCore_glProgramUniform1fvEXT; +void* __blue_glCore_glProgramUniform2fvEXT; +void* __blue_glCore_glProgramUniform3fvEXT; +void* __blue_glCore_glProgramUniform4fvEXT; +void* __blue_glCore_glProgramUniform1ivEXT; +void* __blue_glCore_glProgramUniform2ivEXT; +void* __blue_glCore_glProgramUniform3ivEXT; +void* __blue_glCore_glProgramUniform4ivEXT; +void* __blue_glCore_glProgramUniformMatrix2fvEXT; +void* __blue_glCore_glProgramUniformMatrix3fvEXT; +void* __blue_glCore_glProgramUniformMatrix4fvEXT; +void* __blue_glCore_glProgramUniformMatrix2x3fvEXT; +void* __blue_glCore_glProgramUniformMatrix3x2fvEXT; void* __blue_glCore_glProgramUniformMatrix2x4fvEXT; -void* __blue_glCore_glVertexAttrib4iv; -void* __blue_glCore_glProgramLocalParameterI4iNV; -void* __blue_glCore_glGetnColorTableARB; -void* __blue_glCore_glClearNamedBufferData; -void* __blue_glCore_glColorMaskIndexedEXT; -void* __blue_glCore_glVertexAttribLPointer; -void* __blue_glCore_glProgramUniform3i64vNV; -void* __blue_glCore_glScissor; -void* __blue_glCore_glSecondaryColor3fv; -void* __blue_glCore_glCombinerParameterivNV; -void* __blue_glCore_glGetTexLevelParameterfv; -void* __blue_glCore_glDrawElementArrayATI; -void* __blue_glCore_glVertexAttrib4Nusv; -void* __blue_glCore_glWindowPos3dvMESA; -void* __blue_glCore_glMakeImageHandleResidentARB; -void* __blue_glCore_glWindowPos3svMESA; -void* __blue_glCore_glGetMultiTexLevelParameterfvEXT; -void* __blue_glCore_glRasterPos3xOES; -void* __blue_glCore_glBinormal3iEXT; -void* __blue_glCore_glVertexAttribP3uiv; -void* __blue_glCore_glProgramUniformMatrix2x3dv; -void* __blue_glCore_glEndConditionalRender; -void* __blue_glCore_glBindParameterEXT; -void* __blue_glCore_glCompileShaderIncludeARB; -void* __blue_glCore_glTexStorageSparseAMD; -void* __blue_glCore_glCreateShaderProgramEXT; -void* __blue_glCore_glUniformMatrix3x2fv; -void* __blue_glCore_glPrimitiveRestartIndex; -void* __blue_glCore_glCreateProgram; -void* __blue_glCore_glMultiTexCoord3d; -void* __blue_glCore_glGetFenceivNV; -void* __blue_glCore_glUniform4dv; -void* __blue_glCore_glUniform3i64ARB; -void* __blue_glCore_glTexturePageCommitmentEXT; -void* __blue_glCore_glColor4hNV; -void* __blue_glCore_glVertexStream2fATI; -void* __blue_glCore_glDisable; -void* __blue_glCore_glFramebufferRenderbuffer; -void* __blue_glCore_glIsRenderbufferEXT; +void* __blue_glCore_glProgramUniformMatrix4x2fvEXT; +void* __blue_glCore_glProgramUniformMatrix3x4fvEXT; +void* __blue_glCore_glProgramUniformMatrix4x3fvEXT; +void* __blue_glCore_glTextureBufferEXT; +void* __blue_glCore_glMultiTexBufferEXT; +void* __blue_glCore_glTextureParameterIivEXT; +void* __blue_glCore_glTextureParameterIuivEXT; +void* __blue_glCore_glGetTextureParameterIivEXT; +void* __blue_glCore_glGetTextureParameterIuivEXT; +void* __blue_glCore_glMultiTexParameterIivEXT; +void* __blue_glCore_glMultiTexParameterIuivEXT; void* __blue_glCore_glGetMultiTexParameterIivEXT; -void* __blue_glCore_glVertexAttrib2fvNV; -void* __blue_glCore_glReferencePlaneSGIX; -void* __blue_glCore_glUniform4fARB; -void* __blue_glCore_glClearBufferfi; -void* __blue_glCore_glBindFragDataLocation; -void* __blue_glCore_glGetIntegerv; -void* __blue_glCore_glGetObjectLabel; -void* __blue_glCore_glBufferPageCommitmentARB; -void* __blue_glCore_glBlendFuncIndexedAMD; -void* __blue_glCore_glGetQueryObjectui64vEXT; -void* __blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN; -void* __blue_glCore_glBlitFramebuffer; -void* __blue_glCore_glMultiTexCoord2f; -void* __blue_glCore_glNamedFramebufferRenderbufferEXT; -void* __blue_glCore_glUseProgramStages; -void* __blue_glCore_glGetNamedStringivARB; -void* __blue_glCore_glMultiTexCoord1iARB; -void* __blue_glCore_glMultiTexCoord4xvOES; -void* __blue_glCore_glMakeImageHandleResidentNV; -void* __blue_glCore_glVertexAttrib1fvNV; -void* __blue_glCore_glViewportIndexedf; -void* __blue_glCore_glTexStorage3DMultisample; -void* __blue_glCore_glCreateShaderObjectARB; -void* __blue_glCore_glListDrawCommandsStatesClientNV; -void* __blue_glCore_glUniform1d; -void* __blue_glCore_glGetDebugMessageLogARB; -void* __blue_glCore_glBlendParameteriNV; -void* __blue_glCore_glMultiTexCoord4sv; -void* __blue_glCore_glUniform1uiEXT; -void* __blue_glCore_glDebugMessageInsertAMD; -void* __blue_glCore_glMultiDrawArraysIndirect; -void* __blue_glCore_glProgramUniform1d; -void* __blue_glCore_glGetListParameterivSGIX; -void* __blue_glCore_glPointParameterfv; -void* __blue_glCore_glCopyBufferSubData; -void* __blue_glCore_glBindProgramARB; -void* __blue_glCore_glCombinerStageParameterfvNV; -void* __blue_glCore_glEndConditionalRenderNV; -void* __blue_glCore_glVertexAttribL3dEXT; -void* __blue_glCore_glWindowPos3iv; -void* __blue_glCore_glGetFogFuncSGIS; -void* __blue_glCore_glCompressedTexImage2D; -void* __blue_glCore_glPixelTexGenParameteriSGIS; -void* __blue_glCore_glDebugMessageControlARB; -void* __blue_glCore_glMapBufferRange; -void* __blue_glCore_glProgramUniform1fvEXT; -void* __blue_glCore_glNamedRenderbufferStorageEXT; -void* __blue_glCore_glProgramUniformMatrix4x2fv; +void* __blue_glCore_glGetMultiTexParameterIuivEXT; +void* __blue_glCore_glProgramUniform1uiEXT; +void* __blue_glCore_glProgramUniform2uiEXT; +void* __blue_glCore_glProgramUniform3uiEXT; +void* __blue_glCore_glProgramUniform4uiEXT; +void* __blue_glCore_glProgramUniform1uivEXT; +void* __blue_glCore_glProgramUniform2uivEXT; +void* __blue_glCore_glProgramUniform3uivEXT; +void* __blue_glCore_glProgramUniform4uivEXT; +void* __blue_glCore_glNamedProgramLocalParameters4fvEXT; void* __blue_glCore_glNamedProgramLocalParameterI4iEXT; -void* __blue_glCore_glClearDepth; -void* __blue_glCore_glVertexAttribs1dvNV; -void* __blue_glCore_glWindowPos3f; -void* __blue_glCore_glProvokingVertex; -void* __blue_glCore_glIsNamedStringARB; -void* __blue_glCore_glNamedBufferData; -void* __blue_glCore_glFragmentLightfSGIX; -void* __blue_glCore_glProgramUniform4uiv; -void* __blue_glCore_glPointParameteriNV; -void* __blue_glCore_glNamedFramebufferReadBuffer; -void* __blue_glCore_glPatchParameterfv; -void* __blue_glCore_glVertexArrayBindingDivisor; -void* __blue_glCore_glDebugMessageEnableAMD; -void* __blue_glCore_glGetVertexArrayIndexediv; -void* __blue_glCore_glGetVideoCaptureStreamdvNV; -void* __blue_glCore_glAlphaFragmentOp2ATI; -void* __blue_glCore_glVertex2hNV; -void* __blue_glCore_glCombinerParameteriNV; -void* __blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT; -void* __blue_glCore_glIsVariantEnabledEXT; -void* __blue_glCore_glGetVertexAttribfvNV; -void* __blue_glCore_glGetProgramPipelineiv; -void* __blue_glCore_glUnmapBufferARB; -void* __blue_glCore_glVertexAttribPointerNV; -void* __blue_glCore_glGetPathSpacingNV; -void* __blue_glCore_glMaterialxOES; -void* __blue_glCore_glVertexStream3fvATI; -void* __blue_glCore_glVertexStream4dATI; -void* __blue_glCore_glVertexAttrib2d; -void* __blue_glCore_glStencilMaskSeparate; -void* __blue_glCore_glTestFenceAPPLE; -void* __blue_glCore_glBindMaterialParameterEXT; -void* __blue_glCore_glBlendEquationEXT; -void* __blue_glCore_glMultiTexCoord4hNV; -void* __blue_glCore_glMultiTexCoord1fARB; -void* __blue_glCore_glPrioritizeTexturesxOES; -void* __blue_glCore_glVertexAttribs1fvNV; -void* __blue_glCore_glGetInternalformati64v; -void* __blue_glCore_glDisableVertexAttribAPPLE; -void* __blue_glCore_glVertexStream3sATI; -void* __blue_glCore_glCheckFramebufferStatusEXT; -void* __blue_glCore_glGetMinmax; -void* __blue_glCore_glCopyTexSubImage3DEXT; -void* __blue_glCore_glUniform1ivARB; -void* __blue_glCore_glColorP4uiv; -void* __blue_glCore_glDisableVertexAttribArrayARB; -void* __blue_glCore_glNamedProgramLocalParameter4fvEXT; -void* __blue_glCore_glBlendFuncSeparateEXT; -void* __blue_glCore_glVertexAttribL3i64NV; -void* __blue_glCore_glBindProgramPipeline; -void* __blue_glCore_glCreateProgramPipelines; -void* __blue_glCore_glDeleteRenderbuffersEXT; -void* __blue_glCore_glEdgeFlagFormatNV; -void* __blue_glCore_glGetActiveUniformBlockiv; -void* __blue_glCore_glProgramUniform3f; -void* __blue_glCore_glDrawCommandsStatesAddressNV; -void* __blue_glCore_glGetVertexAttribfv; -void* __blue_glCore_glGetVariantArrayObjectivATI; +void* __blue_glCore_glNamedProgramLocalParameterI4ivEXT; +void* __blue_glCore_glNamedProgramLocalParametersI4ivEXT; +void* __blue_glCore_glNamedProgramLocalParameterI4uiEXT; +void* __blue_glCore_glNamedProgramLocalParameterI4uivEXT; +void* __blue_glCore_glNamedProgramLocalParametersI4uivEXT; +void* __blue_glCore_glGetNamedProgramLocalParameterIivEXT; +void* __blue_glCore_glGetNamedProgramLocalParameterIuivEXT; +void* __blue_glCore_glEnableClientStateiEXT; +void* __blue_glCore_glDisableClientStateiEXT; +void* __blue_glCore_glGetFloati_vEXT; +void* __blue_glCore_glGetDoublei_vEXT; +void* __blue_glCore_glGetPointeri_vEXT; +void* __blue_glCore_glNamedProgramStringEXT; void* __blue_glCore_glNamedProgramLocalParameter4dEXT; -void* __blue_glCore_glGenTransformFeedbacksNV; -void* __blue_glCore_glDrawElementArrayAPPLE; -void* __blue_glCore_glVertexAttrib4NusvARB; -void* __blue_glCore_glBindRenderbufferEXT; -void* __blue_glCore_glUnmapTexture2DINTEL; -void* __blue_glCore_glGetProgramEnvParameterfvARB; -void* __blue_glCore_glVertexAttrib4f; -void* __blue_glCore_glGetnPixelMapfv; -void* __blue_glCore_glVertexAttrib3dv; -void* __blue_glCore_glFlushMappedBufferRange; -void* __blue_glCore_glSecondaryColor3ub; -void* __blue_glCore_glGetPerfQueryDataINTEL; -void* __blue_glCore_glGetnMapivARB; -void* __blue_glCore_glSeparableFilter2DEXT; -void* __blue_glCore_glProgramUniformMatrix3x2fvEXT; -void* __blue_glCore_glGenVertexArrays; -void* __blue_glCore_glEndQueryARB; -void* __blue_glCore_glVertexAttrib2fv; -void* __blue_glCore_glWindowPos2fv; -void* __blue_glCore_glCopyConvolutionFilter1D; -void* __blue_glCore_glTexCoordFormatNV; -void* __blue_glCore_glMultiTexCoordP2uiv; -void* __blue_glCore_glProgramUniform1ui64vARB; -void* __blue_glCore_glColorSubTable; -void* __blue_glCore_glNamedBufferSubData; -void* __blue_glCore_glGetCompressedTextureImage; +void* __blue_glCore_glNamedProgramLocalParameter4dvEXT; +void* __blue_glCore_glNamedProgramLocalParameter4fEXT; +void* __blue_glCore_glNamedProgramLocalParameter4fvEXT; +void* __blue_glCore_glGetNamedProgramLocalParameterdvEXT; +void* __blue_glCore_glGetNamedProgramLocalParameterfvEXT; +void* __blue_glCore_glGetNamedProgramivEXT; +void* __blue_glCore_glGetNamedProgramStringEXT; +void* __blue_glCore_glNamedRenderbufferStorageEXT; +void* __blue_glCore_glGetNamedRenderbufferParameterivEXT; +void* __blue_glCore_glNamedRenderbufferStorageMultisampleEXT; +void* __blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT; +void* __blue_glCore_glCheckNamedFramebufferStatusEXT; +void* __blue_glCore_glNamedFramebufferTexture1DEXT; +void* __blue_glCore_glNamedFramebufferTexture2DEXT; +void* __blue_glCore_glNamedFramebufferTexture3DEXT; +void* __blue_glCore_glNamedFramebufferRenderbufferEXT; +void* __blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT; +void* __blue_glCore_glGenerateTextureMipmapEXT; +void* __blue_glCore_glGenerateMultiTexMipmapEXT; +void* __blue_glCore_glFramebufferDrawBufferEXT; +void* __blue_glCore_glFramebufferDrawBuffersEXT; +void* __blue_glCore_glFramebufferReadBufferEXT; +void* __blue_glCore_glGetFramebufferParameterivEXT; void* __blue_glCore_glNamedCopyBufferSubDataEXT; -void* __blue_glCore_glVertexAttribL1i64NV; +void* __blue_glCore_glNamedFramebufferTextureEXT; +void* __blue_glCore_glNamedFramebufferTextureLayerEXT; +void* __blue_glCore_glNamedFramebufferTextureFaceEXT; +void* __blue_glCore_glTextureRenderbufferEXT; +void* __blue_glCore_glMultiTexRenderbufferEXT; +void* __blue_glCore_glVertexArrayVertexOffsetEXT; +void* __blue_glCore_glVertexArrayColorOffsetEXT; +void* __blue_glCore_glVertexArrayEdgeFlagOffsetEXT; +void* __blue_glCore_glVertexArrayIndexOffsetEXT; +void* __blue_glCore_glVertexArrayNormalOffsetEXT; +void* __blue_glCore_glVertexArrayTexCoordOffsetEXT; void* __blue_glCore_glVertexArrayMultiTexCoordOffsetEXT; -void* __blue_glCore_glGetUniformIndices; -void* __blue_glCore_glDrawArraysInstancedARB; -void* __blue_glCore_glGetMultiTexGenivEXT; +void* __blue_glCore_glVertexArrayFogCoordOffsetEXT; +void* __blue_glCore_glVertexArraySecondaryColorOffsetEXT; +void* __blue_glCore_glVertexArrayVertexAttribOffsetEXT; +void* __blue_glCore_glVertexArrayVertexAttribIOffsetEXT; +void* __blue_glCore_glEnableVertexArrayEXT; +void* __blue_glCore_glDisableVertexArrayEXT; +void* __blue_glCore_glEnableVertexArrayAttribEXT; +void* __blue_glCore_glDisableVertexArrayAttribEXT; +void* __blue_glCore_glGetVertexArrayIntegervEXT; void* __blue_glCore_glGetVertexArrayPointervEXT; -void* __blue_glCore_glBeginQuery; -void* __blue_glCore_glDetachObjectARB; -void* __blue_glCore_glUniform4iv; -void* __blue_glCore_glGetQueryObjectuiv; -void* __blue_glCore_glGetObjectBufferivATI; -void* __blue_glCore_glCreateTransformFeedbacks; -void* __blue_glCore_glVertexStream3dATI; -void* __blue_glCore_glEvalMapsNV; -void* __blue_glCore_glIsNameAMD; -void* __blue_glCore_glVertexAttrib4ivARB; -void* __blue_glCore_glGetProgramSubroutineParameteruivNV; -void* __blue_glCore_glProgramUniformMatrix2x4dv; -void* __blue_glCore_glBeginPerfQueryINTEL; -void* __blue_glCore_glPathParameteriNV; -void* __blue_glCore_glUniform4i64vNV; -void* __blue_glCore_glStateCaptureNV; -void* __blue_glCore_glProgramUniform3fvEXT; -void* __blue_glCore_glVertexAttribL1d; -void* __blue_glCore_glMatrixLoadIdentityEXT; -void* __blue_glCore_glBindVertexArrayAPPLE; -void* __blue_glCore_glRasterPos2xvOES; -void* __blue_glCore_glCommandListSegmentsNV; -void* __blue_glCore_glWindowPos4svMESA; -void* __blue_glCore_glProgramLocalParameter4dvARB; -void* __blue_glCore_glGetnPolygonStipple; -void* __blue_glCore_glMultiTexCoord1svARB; -void* __blue_glCore_glNamedRenderbufferStorage; -void* __blue_glCore_glProgramEnvParameterI4iNV; -void* __blue_glCore_glVertexAttribIFormat; -void* __blue_glCore_glFogCoordfvEXT; -void* __blue_glCore_glEnableVertexAttribArray; -void* __blue_glCore_glPolygonOffsetClampEXT; -void* __blue_glCore_glEnable; -void* __blue_glCore_glIndexFuncEXT; -void* __blue_glCore_glDepthRangeArrayv; -void* __blue_glCore_glRasterPos4xvOES; -void* __blue_glCore_glSpriteParameterfvSGIX; -void* __blue_glCore_glGetnUniformdv; -void* __blue_glCore_glGetHistogram; -void* __blue_glCore_glClearColorIiEXT; -void* __blue_glCore_glTbufferMask3DFX; -void* __blue_glCore_glProgramUniform1f; -void* __blue_glCore_glVertexAttrib4Niv; -void* __blue_glCore_glGetUniformLocationARB; -void* __blue_glCore_glColor4hvNV; +void* __blue_glCore_glGetVertexArrayIntegeri_vEXT; +void* __blue_glCore_glGetVertexArrayPointeri_vEXT; +void* __blue_glCore_glMapNamedBufferRangeEXT; +void* __blue_glCore_glFlushMappedNamedBufferRangeEXT; +void* __blue_glCore_glNamedBufferStorageEXT; +void* __blue_glCore_glClearNamedBufferDataEXT; +void* __blue_glCore_glClearNamedBufferSubDataEXT; +void* __blue_glCore_glNamedFramebufferParameteriEXT; +void* __blue_glCore_glGetNamedFramebufferParameterivEXT; +void* __blue_glCore_glProgramUniform1dEXT; +void* __blue_glCore_glProgramUniform2dEXT; +void* __blue_glCore_glProgramUniform3dEXT; +void* __blue_glCore_glProgramUniform4dEXT; +void* __blue_glCore_glProgramUniform1dvEXT; +void* __blue_glCore_glProgramUniform2dvEXT; +void* __blue_glCore_glProgramUniform3dvEXT; +void* __blue_glCore_glProgramUniform4dvEXT; +void* __blue_glCore_glProgramUniformMatrix2dvEXT; +void* __blue_glCore_glProgramUniformMatrix3dvEXT; +void* __blue_glCore_glProgramUniformMatrix4dvEXT; +void* __blue_glCore_glProgramUniformMatrix2x3dvEXT; +void* __blue_glCore_glProgramUniformMatrix2x4dvEXT; +void* __blue_glCore_glProgramUniformMatrix3x2dvEXT; +void* __blue_glCore_glProgramUniformMatrix3x4dvEXT; +void* __blue_glCore_glProgramUniformMatrix4x2dvEXT; +void* __blue_glCore_glProgramUniformMatrix4x3dvEXT; void* __blue_glCore_glTextureBufferRangeEXT; -void* __blue_glCore_glGlobalAlphaFactorsSUN; -void* __blue_glCore_glCopyTextureSubImage2D; -void* __blue_glCore_glUniform1i64vARB; -void* __blue_glCore_glVertexAttrib2dNV; -void* __blue_glCore_glVertexAttrib4NbvARB; -void* __blue_glCore_glPatchParameteri; -void* __blue_glCore_glGetNamedStringARB; -void* __blue_glCore_glGetCombinerStageParameterfvNV; -void* __blue_glCore_glVertexAttrib2svARB; -void* __blue_glCore_glApplyFramebufferAttachmentCMAAINTEL; -void* __blue_glCore_glGetVideouivNV; -void* __blue_glCore_glMultiTexCoord3s; -void* __blue_glCore_glMultiTexCoord1sARB; -void* __blue_glCore_glLogicOp; -void* __blue_glCore_glFogFuncSGIS; -void* __blue_glCore_glMatrixMultfEXT; -void* __blue_glCore_glGetTexParameterfv; -void* __blue_glCore_glSecondaryColorP3uiv; -void* __blue_glCore_glMultiTexParameteriEXT; -void* __blue_glCore_glEnableClientStateIndexedEXT; -void* __blue_glCore_glGenPathsNV; -void* __blue_glCore_glGetBufferSubData; -void* __blue_glCore_glGetDoublei_v; -void* __blue_glCore_glCoverStrokePathNV; -void* __blue_glCore_glFrontFace; -void* __blue_glCore_glScissorIndexedv; -void* __blue_glCore_glTextureStorage3D; -void* __blue_glCore_glPathFogGenNV; -void* __blue_glCore_glPixelTexGenParameterivSGIS; -void* __blue_glCore_glBlendEquationi; -void* __blue_glCore_glGetHistogramParameterivEXT; -void* __blue_glCore_glClearNamedFramebufferfi; -void* __blue_glCore_glCopyColorTableSGI; -void* __blue_glCore_glBinormal3dEXT; -void* __blue_glCore_glGetBufferParameterui64vNV; -void* __blue_glCore_glTextureImage2DEXT; -void* __blue_glCore_glTransformFeedbackVaryings; -void* __blue_glCore_glNamedFramebufferSampleLocationsfvNV; -void* __blue_glCore_glMapTexture2DINTEL; -void* __blue_glCore_glMaterialxvOES; -void* __blue_glCore_glGenNamesAMD; -void* __blue_glCore_glUniform2uiEXT; -void* __blue_glCore_glMultiTexCoord1xvOES; -void* __blue_glCore_glEnableIndexedEXT; -void* __blue_glCore_glCompressedTextureImage1DEXT; -void* __blue_glCore_glMultiTexCoord3fv; -void* __blue_glCore_glGetnPolygonStippleARB; -void* __blue_glCore_glTexCoord2fColor3fVertex3fvSUN; -void* __blue_glCore_glBindTransformFeedbackNV; -void* __blue_glCore_glVertexStream2svATI; -void* __blue_glCore_glMultiTexCoord1fvARB; -void* __blue_glCore_glMultiTexGendvEXT; -void* __blue_glCore_glProgramUniform2ui64vNV; -void* __blue_glCore_glGetNamedRenderbufferParameteriv; -void* __blue_glCore_glBlendEquationSeparateEXT; -void* __blue_glCore_glInvalidateBufferData; -void* __blue_glCore_glFragmentLightModelfvSGIX; -void* __blue_glCore_glMakeTextureHandleNonResidentARB; -void* __blue_glCore_glMap2xOES; -void* __blue_glCore_glFramebufferRenderbufferEXT; -void* __blue_glCore_glGetMapAttribParameterfvNV; -void* __blue_glCore_glVertexAttrib2dvARB; -void* __blue_glCore_glInvalidateBufferSubData; -void* __blue_glCore_glVertexAttrib1d; -void* __blue_glCore_glDispatchComputeIndirect; -void* __blue_glCore_glStencilFuncSeparate; -void* __blue_glCore_glMapVertexAttrib2fAPPLE; -void* __blue_glCore_glProgramUniformMatrix2x4fv; -void* __blue_glCore_glReadPixels; -void* __blue_glCore_glVertexArrayAttribIFormat; -void* __blue_glCore_glCopyMultiTexSubImage1DEXT; -void* __blue_glCore_glBlendEquationSeparateIndexedAMD; -void* __blue_glCore_glGetTransformFeedbackVaryingEXT; -void* __blue_glCore_glProgramUniform2ui64ARB; -void* __blue_glCore_glProgramUniform1i64vARB; -void* __blue_glCore_glMultiTexCoord4iv; -void* __blue_glCore_glLoadIdentityDeformationMapSGIX; -void* __blue_glCore_glGetMultiTexGendvEXT; -void* __blue_glCore_glVertex4xvOES; -void* __blue_glCore_glVertexArrayVertexAttribOffsetEXT; -void* __blue_glCore_glNormalP3ui; -void* __blue_glCore_glMapParameterivNV; -void* __blue_glCore_glColorPointervINTEL; -void* __blue_glCore_glGetQueryObjectui64v; -void* __blue_glCore_glGenFencesAPPLE; -void* __blue_glCore_glNamedBufferPageCommitmentEXT; -void* __blue_glCore_glGetShaderSourceARB; -void* __blue_glCore_glClearNamedFramebufferuiv; -void* __blue_glCore_glVDPAUIsSurfaceNV; -void* __blue_glCore_glVertexAttribL2ui64NV; -void* __blue_glCore_glColor4xvOES; -void* __blue_glCore_glUniformBlockBinding; -void* __blue_glCore_glListParameterivSGIX; -void* __blue_glCore_glPathSubCoordsNV; -void* __blue_glCore_glGetProgramStringARB; -void* __blue_glCore_glPathStencilFuncNV; -void* __blue_glCore_glBindVideoCaptureStreamBufferNV; -void* __blue_glCore_glReadnPixelsARB; -void* __blue_glCore_glTexBufferARB; -void* __blue_glCore_glVertexAttribL2ui64vNV; -void* __blue_glCore_glCreateBuffers; -void* __blue_glCore_glImageTransformParameterfvHP; -void* __blue_glCore_glUniform2d; -void* __blue_glCore_glBufferStorage; -void* __blue_glCore_glGetTexFilterFuncSGIS; -void* __blue_glCore_glGetHandleARB; -void* __blue_glCore_glGetHistogramParameterxvOES; -void* __blue_glCore_glMultiTexCoord2d; -void* __blue_glCore_glVertex4hNV; -void* __blue_glCore_glGetPerfMonitorGroupStringAMD; -void* __blue_glCore_glCompressedTextureSubImage1D; -void* __blue_glCore_glIsFramebuffer; -void* __blue_glCore_glUniform2dv; -void* __blue_glCore_glVertexAttrib1dvARB; -void* __blue_glCore_glClientWaitSync; -void* __blue_glCore_glProgramUniform4i64vARB; -void* __blue_glCore_glGetActiveAttribARB; -void* __blue_glCore_glCompressedTexImage3DARB; -void* __blue_glCore_glVertexAttribI2iEXT; -void* __blue_glCore_glProgramNamedParameter4dNV; -void* __blue_glCore_glProgramStringARB; -void* __blue_glCore_glWindowPos3fvMESA; -void* __blue_glCore_glBlendFunciARB; -void* __blue_glCore_glVertexAttrib4dvNV; -void* __blue_glCore_glWindowPos3dvARB; -void* __blue_glCore_glMultiTexCoord1bvOES; -void* __blue_glCore_glVertexAttrib4fvARB; -void* __blue_glCore_glPopGroupMarkerEXT; -void* __blue_glCore_glMultiDrawElements; -void* __blue_glCore_glGetInstrumentsSGIX; -void* __blue_glCore_glProgramUniform4dv; -void* __blue_glCore_glColorTableEXT; -void* __blue_glCore_glTexSubImage1D; -void* __blue_glCore_glBeginPerfMonitorAMD; -void* __blue_glCore_glPointParameterfvSGIS; -void* __blue_glCore_glGetImageTransformParameterfvHP; -void* __blue_glCore_glVertex3hvNV; -void* __blue_glCore_glTexCoord4fVertex4fvSUN; -void* __blue_glCore_glCompressedTexSubImage1D; -void* __blue_glCore_glWindowPos2dvMESA; -void* __blue_glCore_glGetSamplerParameteriv; -void* __blue_glCore_glColorPointerListIBM; -void* __blue_glCore_glGetFinalCombinerInputParameterivNV; -void* __blue_glCore_glGetVertexAttribiv; -void* __blue_glCore_glGetTexImage; -void* __blue_glCore_glBufferSubData; -void* __blue_glCore_glVertexAttrib3sARB; -void* __blue_glCore_glIsTextureHandleResidentARB; -void* __blue_glCore_glMultiTexCoord3i; -void* __blue_glCore_glLinkProgramARB; -void* __blue_glCore_glIsProgramNV; -void* __blue_glCore_glVertexAttribI4i; -void* __blue_glCore_glUniform1i; -void* __blue_glCore_glBindAttribLocationARB; -void* __blue_glCore_glProgramUniform4i64vNV; -void* __blue_glCore_glVertex4xOES; -void* __blue_glCore_glSetLocalConstantEXT; -void* __blue_glCore_glTexSubImage2D; -void* __blue_glCore_glWindowPos2f; -void* __blue_glCore_glVariantPointerEXT; -void* __blue_glCore_glNamedRenderbufferStorageMultisample; +void* __blue_glCore_glTextureStorage1DEXT; +void* __blue_glCore_glTextureStorage2DEXT; +void* __blue_glCore_glTextureStorage3DEXT; +void* __blue_glCore_glTextureStorage2DMultisampleEXT; +void* __blue_glCore_glTextureStorage3DMultisampleEXT; +void* __blue_glCore_glVertexArrayBindVertexBufferEXT; +void* __blue_glCore_glVertexArrayVertexAttribFormatEXT; +void* __blue_glCore_glVertexArrayVertexAttribIFormatEXT; +void* __blue_glCore_glVertexArrayVertexAttribLFormatEXT; +void* __blue_glCore_glVertexArrayVertexAttribBindingEXT; +void* __blue_glCore_glVertexArrayVertexBindingDivisorEXT; +void* __blue_glCore_glVertexArrayVertexAttribLOffsetEXT; +void* __blue_glCore_glTexturePageCommitmentEXT; +void* __blue_glCore_glVertexArrayVertexAttribDivisorEXT; +void* __blue_glCore_glColorMaskIndexedEXT; +void* __blue_glCore_glDrawArraysInstancedEXT; +void* __blue_glCore_glDrawElementsInstancedEXT; +void* __blue_glCore_glDrawRangeElementsEXT; +void* __blue_glCore_glFogCoordfEXT; +void* __blue_glCore_glFogCoordfvEXT; +void* __blue_glCore_glFogCoorddEXT; void* __blue_glCore_glFogCoorddvEXT; -void* __blue_glCore_glMultiModeDrawArraysIBM; -void* __blue_glCore_glMatrixLoaddEXT; -void* __blue_glCore_glDeleteQueriesARB; -void* __blue_glCore_glUniform1fvARB; -void* __blue_glCore_glDrawCommandsNV; -void* __blue_glCore_glSecondaryColor3dvEXT; -void* __blue_glCore_glFlushVertexArrayRangeAPPLE; -void* __blue_glCore_glTexEnvxvOES; -void* __blue_glCore_glGetSeparableFilterEXT; -void* __blue_glCore_glVertexAttribI4bvEXT; -void* __blue_glCore_glUniform3i64NV; -void* __blue_glCore_glBlendEquationIndexedAMD; -void* __blue_glCore_glPointParameterf; -void* __blue_glCore_glVertex4bvOES; -void* __blue_glCore_glStencilThenCoverFillPathNV; -void* __blue_glCore_glCompressedTextureImage2DEXT; -void* __blue_glCore_glBlendEquationSeparate; -void* __blue_glCore_glGetNamedFramebufferParameteriv; -void* __blue_glCore_glTexImage3DEXT; -void* __blue_glCore_glColorFragmentOp3ATI; -void* __blue_glCore_glNormalPointerListIBM; -void* __blue_glCore_glTexParameteriv; -void* __blue_glCore_glCompressedTexSubImage2D; -void* __blue_glCore_glCoverFillPathNV; -void* __blue_glCore_glProgramUniformMatrix4x2dvEXT; -void* __blue_glCore_glVertexAttrib1f; -void* __blue_glCore_glAlphaFragmentOp3ATI; -void* __blue_glCore_glBeginQueryIndexed; -void* __blue_glCore_glProgramUniformMatrix2x3fv; -void* __blue_glCore_glProgramUniform4ui64vNV; -void* __blue_glCore_glUniform1ui64NV; -void* __blue_glCore_glMultiTexCoord3svARB; -void* __blue_glCore_glWeightivARB; -void* __blue_glCore_glMultiTexCoord4xOES; -void* __blue_glCore_glVertexAttribL2i64NV; -void* __blue_glCore_glProgramUniformMatrix3x4dv; +void* __blue_glCore_glFogCoordPointerEXT; +void* __blue_glCore_glBlitFramebufferEXT; +void* __blue_glCore_glRenderbufferStorageMultisampleEXT; +void* __blue_glCore_glIsRenderbufferEXT; +void* __blue_glCore_glBindRenderbufferEXT; +void* __blue_glCore_glDeleteRenderbuffersEXT; +void* __blue_glCore_glGenRenderbuffersEXT; +void* __blue_glCore_glRenderbufferStorageEXT; +void* __blue_glCore_glGetRenderbufferParameterivEXT; +void* __blue_glCore_glIsFramebufferEXT; +void* __blue_glCore_glBindFramebufferEXT; +void* __blue_glCore_glDeleteFramebuffersEXT; +void* __blue_glCore_glGenFramebuffersEXT; +void* __blue_glCore_glCheckFramebufferStatusEXT; +void* __blue_glCore_glFramebufferTexture1DEXT; +void* __blue_glCore_glFramebufferTexture2DEXT; +void* __blue_glCore_glFramebufferTexture3DEXT; +void* __blue_glCore_glFramebufferRenderbufferEXT; +void* __blue_glCore_glGetFramebufferAttachmentParameterivEXT; +void* __blue_glCore_glGenerateMipmapEXT; void* __blue_glCore_glProgramParameteriEXT; -void* __blue_glCore_glSecondaryColor3sEXT; -void* __blue_glCore_glCompressedTextureSubImage3DEXT; -void* __blue_glCore_glGetPointervEXT; +void* __blue_glCore_glProgramEnvParameters4fvEXT; +void* __blue_glCore_glProgramLocalParameters4fvEXT; +void* __blue_glCore_glGetUniformuivEXT; +void* __blue_glCore_glBindFragDataLocationEXT; +void* __blue_glCore_glGetFragDataLocationEXT; +void* __blue_glCore_glUniform1uiEXT; +void* __blue_glCore_glUniform2uiEXT; +void* __blue_glCore_glUniform3uiEXT; +void* __blue_glCore_glUniform4uiEXT; +void* __blue_glCore_glUniform1uivEXT; +void* __blue_glCore_glUniform2uivEXT; +void* __blue_glCore_glUniform3uivEXT; +void* __blue_glCore_glUniform4uivEXT; +void* __blue_glCore_glGetHistogramEXT; +void* __blue_glCore_glGetHistogramParameterfvEXT; +void* __blue_glCore_glGetHistogramParameterivEXT; +void* __blue_glCore_glGetMinmaxEXT; void* __blue_glCore_glGetMinmaxParameterfvEXT; -void* __blue_glCore_glMultiTexCoord4sARB; -void* __blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance; -void* __blue_glCore_glVDPAUSurfaceAccessNV; -void* __blue_glCore_glMultiTexCoord2iARB; -void* __blue_glCore_glPathCommandsNV; -void* __blue_glCore_glSetMultisamplefvAMD; -void* __blue_glCore_glVertexStream3ivATI; -void* __blue_glCore_glVDPAUUnregisterSurfaceNV; -void* __blue_glCore_glTextureRenderbufferEXT; -void* __blue_glCore_glProgramLocalParameter4dARB; -void* __blue_glCore_glBindVertexShaderEXT; -void* __blue_glCore_glEnableVariantClientStateEXT; -void* __blue_glCore_glGetPointerIndexedvEXT; -void* __blue_glCore_glMultiTexEnvfEXT; -void* __blue_glCore_glFrustumxOES; -void* __blue_glCore_glAreProgramsResidentNV; -void* __blue_glCore_glFramebufferSampleLocationsfvNV; -void* __blue_glCore_glVertexAttrib1sNV; -void* __blue_glCore_glGetActiveUniformBlockName; -void* __blue_glCore_glVertex2xOES; +void* __blue_glCore_glGetMinmaxParameterivEXT; +void* __blue_glCore_glHistogramEXT; +void* __blue_glCore_glMinmaxEXT; +void* __blue_glCore_glResetHistogramEXT; void* __blue_glCore_glResetMinmaxEXT; -void* __blue_glCore_glMatrixOrthoEXT; -void* __blue_glCore_glUniform4ui64vNV; -void* __blue_glCore_glProgramUniformMatrix4x3fvEXT; -void* __blue_glCore_glVertexAttribs1svNV; -void* __blue_glCore_glDebugMessageCallbackAMD; -void* __blue_glCore_glProgramUniform1uiEXT; -void* __blue_glCore_glTexBufferEXT; -void* __blue_glCore_glUniform4f; -void* __blue_glCore_glUpdateObjectBufferATI; -void* __blue_glCore_glProgramUniform1iEXT; -void* __blue_glCore_glGetMultiTexEnvfvEXT; -void* __blue_glCore_glVertexAttribL2d; -void* __blue_glCore_glConvolutionParameterxOES; -void* __blue_glCore_glGetVertexAttribArrayObjectivATI; -void* __blue_glCore_glGetListParameterfvSGIX; -void* __blue_glCore_glInstrumentsBufferSGIX; -void* __blue_glCore_glDeleteNamesAMD; -void* __blue_glCore_glGetSubroutineIndex; -void* __blue_glCore_glVideoCaptureStreamParameterivNV; -void* __blue_glCore_glMultiTexCoord4i; -void* __blue_glCore_glGetFramebufferParameteriv; -void* __blue_glCore_glVertexAttrib2hvNV; -void* __blue_glCore_glMakeBufferNonResidentNV; -void* __blue_glCore_glPixelDataRangeNV; -void* __blue_glCore_glNamedBufferDataEXT; -void* __blue_glCore_glIsImageHandleResidentARB; -void* __blue_glCore_glFrustumfOES; -void* __blue_glCore_glGetArrayObjectivATI; -void* __blue_glCore_glMultiTexParameterIuivEXT; -void* __blue_glCore_glGetMapParameterfvNV; -void* __blue_glCore_glMultTransposeMatrixxOES; -void* __blue_glCore_glGetPerfMonitorCounterDataAMD; -void* __blue_glCore_glClearDepthxOES; -void* __blue_glCore_glColor3xvOES; -void* __blue_glCore_glVertexAttribI4ivEXT; -void* __blue_glCore_glMultiTexCoordP4uiv; -void* __blue_glCore_glVertexAttribI4usv; -void* __blue_glCore_glGetnTexImage; -void* __blue_glCore_glReadBuffer; -void* __blue_glCore_glUniform3iARB; -void* __blue_glCore_glMultiTexBufferEXT; -void* __blue_glCore_glNormalStream3fvATI; -void* __blue_glCore_glDeleteVertexShaderEXT; -void* __blue_glCore_glVertexAttrib3hvNV; -void* __blue_glCore_glDrawMeshArraysSUN; -void* __blue_glCore_glVertexAttribL3dvEXT; -void* __blue_glCore_glReplacementCodeuiColor3fVertex3fSUN; -void* __blue_glCore_glProgramUniform1fv; -void* __blue_glCore_glNormal3xvOES; -void* __blue_glCore_glGetProgramStageiv; -void* __blue_glCore_glUniform2ui64NV; -void* __blue_glCore_glProgramEnvParameter4fARB; +void* __blue_glCore_glIndexFuncEXT; +void* __blue_glCore_glIndexMaterialEXT; +void* __blue_glCore_glApplyTextureEXT; +void* __blue_glCore_glTextureLightEXT; +void* __blue_glCore_glTextureMaterialEXT; +void* __blue_glCore_glMultiDrawArraysEXT; +void* __blue_glCore_glMultiDrawElementsEXT; +void* __blue_glCore_glSampleMaskEXT; +void* __blue_glCore_glSamplePatternEXT; +void* __blue_glCore_glColorTableEXT; +void* __blue_glCore_glGetColorTableEXT; +void* __blue_glCore_glGetColorTableParameterivEXT; +void* __blue_glCore_glGetColorTableParameterfvEXT; +void* __blue_glCore_glPixelTransformParameteriEXT; +void* __blue_glCore_glPixelTransformParameterfEXT; void* __blue_glCore_glPixelTransformParameterivEXT; -void* __blue_glCore_glWindowPos4dvMESA; -void* __blue_glCore_glMultiDrawElementsIndirectBindlessCountNV; -void* __blue_glCore_glUniform3i64vARB; -void* __blue_glCore_glTextureStorage3DMultisample; -void* __blue_glCore_glGetNamedBufferParameterui64vNV; -void* __blue_glCore_glEndTransformFeedback; -void* __blue_glCore_glVertexAttribI3ivEXT; -void* __blue_glCore_glUniform2f; -void* __blue_glCore_glMultiTexCoord1dARB; -void* __blue_glCore_glGetColorTableParameterfv; -void* __blue_glCore_glWindowPos3d; -void* __blue_glCore_glVertexAttribL3ui64vNV; -void* __blue_glCore_glReplacementCodeuiSUN; -void* __blue_glCore_glColor4ubVertex3fSUN; -void* __blue_glCore_glDrawRangeElementsBaseVertex; -void* __blue_glCore_glGetMultiTexParameterivEXT; -void* __blue_glCore_glMultiTexCoord3hvNV; -void* __blue_glCore_glGetQueryBufferObjectuiv; -void* __blue_glCore_glGetPerfMonitorGroupsAMD; -void* __blue_glCore_glUnlockArraysEXT; -void* __blue_glCore_glPauseTransformFeedback; -void* __blue_glCore_glGetProgramEnvParameterIivNV; -void* __blue_glCore_glPathTexGenNV; -void* __blue_glCore_glVertex3xOES; +void* __blue_glCore_glPixelTransformParameterfvEXT; +void* __blue_glCore_glGetPixelTransformParameterivEXT; +void* __blue_glCore_glGetPixelTransformParameterfvEXT; +void* __blue_glCore_glPointParameterfEXT; +void* __blue_glCore_glPointParameterfvEXT; +void* __blue_glCore_glPolygonOffsetEXT; +void* __blue_glCore_glPolygonOffsetClampEXT; +void* __blue_glCore_glProvokingVertexEXT; +void* __blue_glCore_glRasterSamplesEXT; +void* __blue_glCore_glSecondaryColor3bEXT; +void* __blue_glCore_glSecondaryColor3bvEXT; +void* __blue_glCore_glSecondaryColor3dEXT; +void* __blue_glCore_glSecondaryColor3dvEXT; +void* __blue_glCore_glSecondaryColor3fEXT; +void* __blue_glCore_glSecondaryColor3fvEXT; +void* __blue_glCore_glSecondaryColor3iEXT; +void* __blue_glCore_glSecondaryColor3ivEXT; +void* __blue_glCore_glSecondaryColor3sEXT; +void* __blue_glCore_glSecondaryColor3svEXT; +void* __blue_glCore_glSecondaryColor3ubEXT; +void* __blue_glCore_glSecondaryColor3ubvEXT; +void* __blue_glCore_glSecondaryColor3uiEXT; +void* __blue_glCore_glSecondaryColor3uivEXT; +void* __blue_glCore_glSecondaryColor3usEXT; +void* __blue_glCore_glSecondaryColor3usvEXT; +void* __blue_glCore_glSecondaryColorPointerEXT; +void* __blue_glCore_glUseShaderProgramEXT; +void* __blue_glCore_glActiveProgramEXT; +void* __blue_glCore_glCreateShaderProgramEXT; +void* __blue_glCore_glBindImageTextureEXT; +void* __blue_glCore_glMemoryBarrierEXT; +void* __blue_glCore_glStencilClearTagEXT; +void* __blue_glCore_glActiveStencilFaceEXT; +void* __blue_glCore_glTexSubImage1DEXT; +void* __blue_glCore_glTexSubImage2DEXT; +void* __blue_glCore_glTexImage3DEXT; +void* __blue_glCore_glTexSubImage3DEXT; +void* __blue_glCore_glFramebufferTextureLayerEXT; +void* __blue_glCore_glTexBufferEXT; +void* __blue_glCore_glTexParameterIivEXT; +void* __blue_glCore_glTexParameterIuivEXT; +void* __blue_glCore_glGetTexParameterIivEXT; +void* __blue_glCore_glGetTexParameterIuivEXT; +void* __blue_glCore_glClearColorIiEXT; +void* __blue_glCore_glClearColorIuiEXT; +void* __blue_glCore_glAreTexturesResidentEXT; +void* __blue_glCore_glBindTextureEXT; +void* __blue_glCore_glDeleteTexturesEXT; +void* __blue_glCore_glGenTexturesEXT; +void* __blue_glCore_glIsTextureEXT; +void* __blue_glCore_glPrioritizeTexturesEXT; +void* __blue_glCore_glTextureNormalEXT; +void* __blue_glCore_glGetQueryObjecti64vEXT; +void* __blue_glCore_glGetQueryObjectui64vEXT; +void* __blue_glCore_glBeginTransformFeedbackEXT; +void* __blue_glCore_glEndTransformFeedbackEXT; +void* __blue_glCore_glBindBufferRangeEXT; +void* __blue_glCore_glBindBufferOffsetEXT; +void* __blue_glCore_glBindBufferBaseEXT; +void* __blue_glCore_glTransformFeedbackVaryingsEXT; +void* __blue_glCore_glGetTransformFeedbackVaryingEXT; +void* __blue_glCore_glArrayElementEXT; +void* __blue_glCore_glColorPointerEXT; +void* __blue_glCore_glDrawArraysEXT; void* __blue_glCore_glEdgeFlagPointerEXT; -void* __blue_glCore_glVertexAttribBinding; -void* __blue_glCore_glVertexAttrib3f; -void* __blue_glCore_glVertexAttrib4NubARB; -void* __blue_glCore_glWindowPos2svMESA; -void* __blue_glCore_glGetUniformSubroutineuiv; -void* __blue_glCore_glMultiTexCoord2ivARB; -void* __blue_glCore_glFragmentMaterialivSGIX; -void* __blue_glCore_glSamplerParameteriv; -void* __blue_glCore_glVertexArrayColorOffsetEXT; -void* __blue_glCore_glVertexAttrib3sNV; -void* __blue_glCore_glDrawElementsInstanced; -void* __blue_glCore_glCreateSyncFromCLeventARB; -void* __blue_glCore_glInsertEventMarkerEXT; -void* __blue_glCore_glGetTextureParameterfv; -void* __blue_glCore_glCopyMultiTexImage2DEXT; -void* __blue_glCore_glVertexWeightfEXT; -void* __blue_glCore_glUniform4i64vARB; -void* __blue_glCore_glGetPathParameterfvNV; -void* __blue_glCore_glBlitNamedFramebuffer; +void* __blue_glCore_glGetPointervEXT; +void* __blue_glCore_glIndexPointerEXT; +void* __blue_glCore_glNormalPointerEXT; void* __blue_glCore_glTexCoordPointerEXT; -void* __blue_glCore_glGetPathMetricsNV; +void* __blue_glCore_glVertexPointerEXT; +void* __blue_glCore_glVertexAttribL1dEXT; +void* __blue_glCore_glVertexAttribL2dEXT; +void* __blue_glCore_glVertexAttribL3dEXT; +void* __blue_glCore_glVertexAttribL4dEXT; +void* __blue_glCore_glVertexAttribL1dvEXT; void* __blue_glCore_glVertexAttribL2dvEXT; +void* __blue_glCore_glVertexAttribL3dvEXT; +void* __blue_glCore_glVertexAttribL4dvEXT; +void* __blue_glCore_glVertexAttribLPointerEXT; +void* __blue_glCore_glGetVertexAttribLdvEXT; +void* __blue_glCore_glBeginVertexShaderEXT; +void* __blue_glCore_glEndVertexShaderEXT; +void* __blue_glCore_glBindVertexShaderEXT; +void* __blue_glCore_glGenVertexShadersEXT; +void* __blue_glCore_glDeleteVertexShaderEXT; +void* __blue_glCore_glShaderOp1EXT; +void* __blue_glCore_glShaderOp2EXT; +void* __blue_glCore_glShaderOp3EXT; +void* __blue_glCore_glSwizzleEXT; +void* __blue_glCore_glWriteMaskEXT; +void* __blue_glCore_glInsertComponentEXT; +void* __blue_glCore_glExtractComponentEXT; +void* __blue_glCore_glGenSymbolsEXT; +void* __blue_glCore_glSetInvariantEXT; +void* __blue_glCore_glSetLocalConstantEXT; +void* __blue_glCore_glVariantbvEXT; +void* __blue_glCore_glVariantsvEXT; +void* __blue_glCore_glVariantivEXT; +void* __blue_glCore_glVariantfvEXT; +void* __blue_glCore_glVariantdvEXT; +void* __blue_glCore_glVariantubvEXT; +void* __blue_glCore_glVariantusvEXT; void* __blue_glCore_glVariantuivEXT; -void* __blue_glCore_glGetVertexAttribdvNV; -void* __blue_glCore_glFenceSync; -void* __blue_glCore_glGetTextureParameterIuiv; -void* __blue_glCore_glMultiTexCoord2sARB; -void* __blue_glCore_glUniform2i64NV; -void* __blue_glCore_glDeformationMap3dSGIX; -void* __blue_glCore_glDrawRangeElementArrayAPPLE; -void* __blue_glCore_glDepthFunc; -void* __blue_glCore_glProgramUniform3dvEXT; -void* __blue_glCore_glTexCoord3hvNV; -void* __blue_glCore_glGetPathLengthNV; -void* __blue_glCore_glUnmapObjectBufferATI; -void* __blue_glCore_glValidateProgramPipeline; -void* __blue_glCore_glIsProgram; -void* __blue_glCore_glVertexAttrib4hvNV; -void* __blue_glCore_glLoadTransposeMatrixdARB; -void* __blue_glCore_glMapVertexAttrib2dAPPLE; -void* __blue_glCore_glProgramBinary; -void* __blue_glCore_glUniform3i; -void* __blue_glCore_glProgramUniform2dEXT; -void* __blue_glCore_glDepthRangeIndexed; -void* __blue_glCore_glEvalCoord1xOES; -void* __blue_glCore_glVertexArrayRangeAPPLE; -void* __blue_glCore_glVertexStream1svATI; -void* __blue_glCore_glNormalStream3iATI; -void* __blue_glCore_glProgramUniform4f; -void* __blue_glCore_glScalexOES; -void* __blue_glCore_glUniform1fv; -void* __blue_glCore_glGetActiveUniform; -void* __blue_glCore_glProgramUniformMatrix4x3fv; -void* __blue_glCore_glCreateVertexArrays; -void* __blue_glCore_glWindowPos3dv; -void* __blue_glCore_glUniform1fARB; -void* __blue_glCore_glFragmentMaterialiSGIX; -void* __blue_glCore_glGetVertexAttribArrayObjectfvATI; -void* __blue_glCore_glClearAccumxOES; -void* __blue_glCore_glBindFragDataLocationEXT; -void* __blue_glCore_glMultiTexCoord4dARB; -void* __blue_glCore_glConvolutionParameterfv; -void* __blue_glCore_glFragmentColorMaterialSGIX; -void* __blue_glCore_glUniformMatrix3dv; -void* __blue_glCore_glGetnPixelMapusv; -void* __blue_glCore_glFramebufferTextureLayer; -void* __blue_glCore_glStencilThenCoverStrokePathInstancedNV; -void* __blue_glCore_glVDPAURegisterOutputSurfaceNV; -void* __blue_glCore_glMultiTexCoord4dvARB; -void* __blue_glCore_glCopyTextureSubImage3D; +void* __blue_glCore_glVariantPointerEXT; +void* __blue_glCore_glEnableVariantClientStateEXT; +void* __blue_glCore_glDisableVariantClientStateEXT; +void* __blue_glCore_glBindLightParameterEXT; +void* __blue_glCore_glBindMaterialParameterEXT; +void* __blue_glCore_glBindTexGenParameterEXT; +void* __blue_glCore_glBindTextureUnitParameterEXT; +void* __blue_glCore_glBindParameterEXT; +void* __blue_glCore_glIsVariantEnabledEXT; +void* __blue_glCore_glGetVariantBooleanvEXT; void* __blue_glCore_glGetVariantIntegervEXT; -void* __blue_glCore_glGetTexEnvxvOES; -void* __blue_glCore_glGetFloati_vEXT; -void* __blue_glCore_glAsyncMarkerSGIX; -void* __blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN; -void* __blue_glCore_glTexRenderbufferNV; -void* __blue_glCore_glGetConvolutionParameterfvEXT; -void* __blue_glCore_glLightxvOES; -void* __blue_glCore_glDeleteNamedStringARB; -void* __blue_glCore_glColor3hvNV; -void* __blue_glCore_glUniformMatrix4dv; -void* __blue_glCore_glCompressedTexImage2DARB; -void* __blue_glCore_glGenTexturesEXT; -void* __blue_glCore_glPathMemoryGlyphIndexArrayNV; -void* __blue_glCore_glGetBufferSubDataARB; -void* __blue_glCore_glFinishObjectAPPLE; -void* __blue_glCore_glDetachShader; -void* __blue_glCore_glBindTexture; -void* __blue_glCore_glGetProgramResourcefvNV; -void* __blue_glCore_glTexCoord2fColor4ubVertex3fvSUN; -void* __blue_glCore_glMultiTexCoord4dv; -void* __blue_glCore_glIsPointInFillPathNV; -void* __blue_glCore_glDrawTransformFeedbackInstanced; -void* __blue_glCore_glProgramParameteriARB; -void* __blue_glCore_glVertexAttrib3fvNV; -void* __blue_glCore_glEnableVertexArrayAttrib; -void* __blue_glCore_glUniform3ui64vNV; -void* __blue_glCore_glVertexAttribs4fvNV; -void* __blue_glCore_glGetCompressedTextureImageEXT; -void* __blue_glCore_glVertex3bOES; -void* __blue_glCore_glProgramLocalParameterI4ivNV; -void* __blue_glCore_glWindowPos2fMESA; -void* __blue_glCore_glWeightusvARB; -void* __blue_glCore_glGenOcclusionQueriesNV; +void* __blue_glCore_glGetVariantFloatvEXT; +void* __blue_glCore_glGetVariantPointervEXT; +void* __blue_glCore_glGetInvariantBooleanvEXT; +void* __blue_glCore_glGetInvariantIntegervEXT; +void* __blue_glCore_glGetInvariantFloatvEXT; +void* __blue_glCore_glGetLocalConstantBooleanvEXT; +void* __blue_glCore_glGetLocalConstantIntegervEXT; +void* __blue_glCore_glGetLocalConstantFloatvEXT; +void* __blue_glCore_glVertexWeightfEXT; +void* __blue_glCore_glVertexWeightfvEXT; +void* __blue_glCore_glVertexWeightPointerEXT; +void* __blue_glCore_glImportSyncEXT; +void* __blue_glCore_glFrameTerminatorGREMEDY; +void* __blue_glCore_glStringMarkerGREMEDY; +void* __blue_glCore_glImageTransformParameteriHP; +void* __blue_glCore_glImageTransformParameterfHP; +void* __blue_glCore_glImageTransformParameterivHP; +void* __blue_glCore_glImageTransformParameterfvHP; +void* __blue_glCore_glGetImageTransformParameterivHP; +void* __blue_glCore_glGetImageTransformParameterfvHP; +void* __blue_glCore_glMultiModeDrawArraysIBM; +void* __blue_glCore_glMultiModeDrawElementsIBM; +void* __blue_glCore_glFlushStaticDataIBM; +void* __blue_glCore_glColorPointerListIBM; +void* __blue_glCore_glSecondaryColorPointerListIBM; +void* __blue_glCore_glEdgeFlagPointerListIBM; +void* __blue_glCore_glFogCoordPointerListIBM; +void* __blue_glCore_glIndexPointerListIBM; +void* __blue_glCore_glNormalPointerListIBM; +void* __blue_glCore_glTexCoordPointerListIBM; +void* __blue_glCore_glVertexPointerListIBM; +void* __blue_glCore_glBlendFuncSeparateINGR; +void* __blue_glCore_glApplyFramebufferAttachmentCMAAINTEL; +void* __blue_glCore_glSyncTextureINTEL; +void* __blue_glCore_glUnmapTexture2DINTEL; +void* __blue_glCore_glMapTexture2DINTEL; +void* __blue_glCore_glVertexPointervINTEL; +void* __blue_glCore_glNormalPointervINTEL; +void* __blue_glCore_glColorPointervINTEL; void* __blue_glCore_glTexCoordPointervINTEL; -void* __blue_glCore_glGetTextureParameterIivEXT; -void* __blue_glCore_glDeleteStatesNV; -void* __blue_glCore_glProgramLocalParameter4fvARB; -void* __blue_glCore_glCoverFillPathInstancedNV; +void* __blue_glCore_glBeginPerfQueryINTEL; +void* __blue_glCore_glCreatePerfQueryINTEL; +void* __blue_glCore_glDeletePerfQueryINTEL; +void* __blue_glCore_glEndPerfQueryINTEL; +void* __blue_glCore_glGetFirstPerfQueryIdINTEL; +void* __blue_glCore_glGetNextPerfQueryIdINTEL; +void* __blue_glCore_glGetPerfCounterInfoINTEL; +void* __blue_glCore_glGetPerfQueryDataINTEL; +void* __blue_glCore_glGetPerfQueryIdByNameINTEL; +void* __blue_glCore_glGetPerfQueryInfoINTEL; +void* __blue_glCore_glResizeBuffersMESA; +void* __blue_glCore_glWindowPos2dMESA; +void* __blue_glCore_glWindowPos2dvMESA; +void* __blue_glCore_glWindowPos2fMESA; +void* __blue_glCore_glWindowPos2fvMESA; +void* __blue_glCore_glWindowPos2iMESA; +void* __blue_glCore_glWindowPos2ivMESA; +void* __blue_glCore_glWindowPos2sMESA; +void* __blue_glCore_glWindowPos2svMESA; +void* __blue_glCore_glWindowPos3dMESA; +void* __blue_glCore_glWindowPos3dvMESA; +void* __blue_glCore_glWindowPos3fMESA; +void* __blue_glCore_glWindowPos3fvMESA; +void* __blue_glCore_glWindowPos3iMESA; +void* __blue_glCore_glWindowPos3ivMESA; +void* __blue_glCore_glWindowPos3sMESA; +void* __blue_glCore_glWindowPos3svMESA; +void* __blue_glCore_glWindowPos4dMESA; +void* __blue_glCore_glWindowPos4dvMESA; +void* __blue_glCore_glWindowPos4fMESA; +void* __blue_glCore_glWindowPos4fvMESA; +void* __blue_glCore_glWindowPos4iMESA; +void* __blue_glCore_glWindowPos4ivMESA; +void* __blue_glCore_glWindowPos4sMESA; +void* __blue_glCore_glWindowPos4svMESA; void* __blue_glCore_glBeginConditionalRenderNVX; -void* __blue_glCore_glPathDashArrayNV; -void* __blue_glCore_glSpriteParameteriSGIX; -void* __blue_glCore_glGetNamedProgramStringEXT; -void* __blue_glCore_glCombinerParameterfvNV; -void* __blue_glCore_glTexParameterxvOES; -void* __blue_glCore_glVertexArrayVertexAttribDivisorEXT; -void* __blue_glCore_glProgramSubroutineParametersuivNV; -void* __blue_glCore_glDeleteObjectARB; -void* __blue_glCore_glProgramUniform1i64ARB; -void* __blue_glCore_glFramebufferTextureARB; -void* __blue_glCore_glElementPointerATI; -void* __blue_glCore_glUniform2i64vARB; -void* __blue_glCore_glGetBooleanIndexedvEXT; -void* __blue_glCore_glVertexAttribP1uiv; -void* __blue_glCore_glGetDoubleIndexedvEXT; -void* __blue_glCore_glGetUniformiv; -void* __blue_glCore_glVertexAttribArrayObjectATI; -void* __blue_glCore_glBufferSubDataARB; -void* __blue_glCore_glWindowPos2fARB; -void* __blue_glCore_glMultiTexCoord2bvOES; -void* __blue_glCore_glProgramUniform2i64vARB; -void* __blue_glCore_glTexEnvxOES; -void* __blue_glCore_glStencilOpValueAMD; -void* __blue_glCore_glUniform4ui64vARB; -void* __blue_glCore_glTangent3iEXT; -void* __blue_glCore_glGetVertexAttribLdvEXT; -void* __blue_glCore_glGetCoverageModulationTableNV; -void* __blue_glCore_glVertexWeighthvNV; -void* __blue_glCore_glWindowPos3iARB; -void* __blue_glCore_glVertexAttribI1iv; -void* __blue_glCore_glWindowPos3fv; -void* __blue_glCore_glVertexStream4ivATI; -void* __blue_glCore_glTextureImage3DMultisampleCoverageNV; -void* __blue_glCore_glUniform3f; -void* __blue_glCore_glAccumxOES; -void* __blue_glCore_glTexStorage3D; -void* __blue_glCore_glDrawArrays; -void* __blue_glCore_glSamplePatternEXT; -void* __blue_glCore_glNormalPointervINTEL; -void* __blue_glCore_glWeightubvARB; -void* __blue_glCore_glGenProgramsNV; -void* __blue_glCore_glDepthRangef; -void* __blue_glCore_glGetProgramParameterdvNV; -void* __blue_glCore_glPollInstrumentsSGIX; -void* __blue_glCore_glMultiTexCoord1hNV; -void* __blue_glCore_glSecondaryColor3s; -void* __blue_glCore_glTexCoordP1uiv; -void* __blue_glCore_glStopInstrumentsSGIX; -void* __blue_glCore_glActiveTexture; -void* __blue_glCore_glVertexAttribs2svNV; -void* __blue_glCore_glGetActiveAtomicCounterBufferiv; void* __blue_glCore_glEndConditionalRenderNVX; -void* __blue_glCore_glDrawRangeElementArrayATI; -void* __blue_glCore_glCopyMultiTexImage1DEXT; -void* __blue_glCore_glReplacementCodeusSUN; -void* __blue_glCore_glMultiTexGendEXT; -void* __blue_glCore_glMatrixRotatefEXT; -void* __blue_glCore_glBindBufferOffsetNV; -void* __blue_glCore_glVertexAttribI1ui; -void* __blue_glCore_glMakeImageHandleNonResidentARB; -void* __blue_glCore_glTextureParameteriEXT; -void* __blue_glCore_glDebugMessageInsertARB; -void* __blue_glCore_glVertexAttrib4NubvARB; -void* __blue_glCore_glDeleteTexturesEXT; -void* __blue_glCore_glWindowPos3svARB; -void* __blue_glCore_glTexParameterxOES; -void* __blue_glCore_glVertexStream3fATI; -void* __blue_glCore_glNormal3xOES; -void* __blue_glCore_glMultiTexCoord4bvOES; -void* __blue_glCore_glVertexAttribL1dv; -void* __blue_glCore_glGetImageTransformParameterivHP; -void* __blue_glCore_glGetSubroutineUniformLocation; -void* __blue_glCore_glProgramEnvParameter4fvARB; -void* __blue_glCore_glGetTextureImageEXT; -void* __blue_glCore_glBindTexGenParameterEXT; -void* __blue_glCore_glMinSampleShadingARB; -void* __blue_glCore_glGetAttachedObjectsARB; -void* __blue_glCore_glGetVertexArrayiv; -void* __blue_glCore_glWeightfvARB; -void* __blue_glCore_glGetPathCommandsNV; -void* __blue_glCore_glGetColorTableParameterivSGI; -void* __blue_glCore_glGetNamedProgramivEXT; -void* __blue_glCore_glSecondaryColor3ubvEXT; -void* __blue_glCore_glVDPAURegisterVideoSurfaceNV; -void* __blue_glCore_glTexParameterf; -void* __blue_glCore_glVertexAttribL4i64NV; -void* __blue_glCore_glPollAsyncSGIX; -void* __blue_glCore_glBufferParameteriAPPLE; -void* __blue_glCore_glApplyTextureEXT; -void* __blue_glCore_glGenVertexShadersEXT; -void* __blue_glCore_glTexImage2DMultisampleCoverageNV; -void* __blue_glCore_glObjectUnpurgeableAPPLE; -void* __blue_glCore_glCopyNamedBufferSubData; -void* __blue_glCore_glVertexAttrib4dv; -void* __blue_glCore_glClearTexSubImage; -void* __blue_glCore_glPointAlongPathNV; -void* __blue_glCore_glFramebufferTexture1DEXT; -void* __blue_glCore_glMatrixLoad3x2fNV; -void* __blue_glCore_glGetUniformui64vARB; -void* __blue_glCore_glTextureStorage3DMultisampleEXT; -void* __blue_glCore_glTexCoord1bvOES; -void* __blue_glCore_glGetBufferParameteri64v; -void* __blue_glCore_glQueryMatrixxOES; -void* __blue_glCore_glVertexAttrib1fv; -void* __blue_glCore_glVertexAttribP3ui; -void* __blue_glCore_glVDPAUInitNV; -void* __blue_glCore_glPathStencilDepthOffsetNV; -void* __blue_glCore_glLightxOES; -void* __blue_glCore_glVertexAttribI3i; -void* __blue_glCore_glProgramUniformHandleui64vARB; -void* __blue_glCore_glTextureParameteriv; +void* __blue_glCore_glMultiDrawArraysIndirectBindlessNV; +void* __blue_glCore_glMultiDrawElementsIndirectBindlessNV; +void* __blue_glCore_glMultiDrawArraysIndirectBindlessCountNV; +void* __blue_glCore_glMultiDrawElementsIndirectBindlessCountNV; +void* __blue_glCore_glGetTextureHandleNV; +void* __blue_glCore_glGetTextureSamplerHandleNV; +void* __blue_glCore_glMakeTextureHandleResidentNV; +void* __blue_glCore_glMakeTextureHandleNonResidentNV; +void* __blue_glCore_glGetImageHandleNV; +void* __blue_glCore_glMakeImageHandleResidentNV; +void* __blue_glCore_glMakeImageHandleNonResidentNV; +void* __blue_glCore_glUniformHandleui64NV; +void* __blue_glCore_glUniformHandleui64vNV; void* __blue_glCore_glProgramUniformHandleui64NV; -void* __blue_glCore_glGetVertexArrayIntegervEXT; -void* __blue_glCore_glDrawElements; -void* __blue_glCore_glProgramUniform3i64ARB; -void* __blue_glCore_glDeleteAsyncMarkersSGIX; -void* __blue_glCore_glGetLightxOES; +void* __blue_glCore_glProgramUniformHandleui64vNV; +void* __blue_glCore_glIsTextureHandleResidentNV; +void* __blue_glCore_glIsImageHandleResidentNV; +void* __blue_glCore_glBlendParameteriNV; +void* __blue_glCore_glBlendBarrierNV; +void* __blue_glCore_glCreateStatesNV; +void* __blue_glCore_glDeleteStatesNV; +void* __blue_glCore_glIsStateNV; +void* __blue_glCore_glStateCaptureNV; +void* __blue_glCore_glGetCommandHeaderNV; +void* __blue_glCore_glGetStageIndexNV; +void* __blue_glCore_glDrawCommandsNV; +void* __blue_glCore_glDrawCommandsAddressNV; +void* __blue_glCore_glDrawCommandsStatesNV; +void* __blue_glCore_glDrawCommandsStatesAddressNV; void* __blue_glCore_glCreateCommandListsNV; -void* __blue_glCore_glClear; -void* __blue_glCore_glUniformui64vNV; -void* __blue_glCore_glVertexAttrib2dvNV; -void* __blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; -void* __blue_glCore_glWindowPos3sARB; +void* __blue_glCore_glDeleteCommandListsNV; +void* __blue_glCore_glIsCommandListNV; +void* __blue_glCore_glListDrawCommandsStatesClientNV; +void* __blue_glCore_glCommandListSegmentsNV; +void* __blue_glCore_glCompileCommandListNV; +void* __blue_glCore_glCallCommandListNV; +void* __blue_glCore_glBeginConditionalRenderNV; +void* __blue_glCore_glEndConditionalRenderNV; +void* __blue_glCore_glSubpixelPrecisionBiasNV; +void* __blue_glCore_glConservativeRasterParameterfNV; +void* __blue_glCore_glCopyImageSubDataNV; +void* __blue_glCore_glDepthRangedNV; +void* __blue_glCore_glClearDepthdNV; +void* __blue_glCore_glDepthBoundsdNV; void* __blue_glCore_glDrawTextureNV; -void* __blue_glCore_glIsSync; -void* __blue_glCore_glMatrixTranslatedEXT; -void* __blue_glCore_glGetActiveVaryingNV; -void* __blue_glCore_glCreateQueries; -void* __blue_glCore_glGetProgramEnvParameterdvARB; -void* __blue_glCore_glVertexArrayVertexAttribIOffsetEXT; -void* __blue_glCore_glGetLocalConstantBooleanvEXT; -void* __blue_glCore_glGetProgramParameterfvNV; -void* __blue_glCore_glSpriteParameterivSGIX; -void* __blue_glCore_glMultiTexCoord3xvOES; -void* __blue_glCore_glBindBufferRangeNV; -void* __blue_glCore_glMultiTexCoord1sv; -void* __blue_glCore_glVertexStream1ivATI; -void* __blue_glCore_glGetQueryObjectivARB; -void* __blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN; -void* __blue_glCore_glFlushMappedNamedBufferRange; -void* __blue_glCore_glPointParameteriv; -void* __blue_glCore_glGetTextureLevelParameterivEXT; -void* __blue_glCore_glMultiTexEnviEXT; -void* __blue_glCore_glPolygonOffset; -void* __blue_glCore_glUniform1ui64ARB; -void* __blue_glCore_glDeleteVertexArrays; -void* __blue_glCore_glGetUniformi64vNV; -void* __blue_glCore_glVertexAttribI3iv; -void* __blue_glCore_glEndQueryIndexed; -void* __blue_glCore_glTextureSubImage1DEXT; -void* __blue_glCore_glVertexAttribI4ubvEXT; -void* __blue_glCore_glVertexAttribP4ui; -void* __blue_glCore_glNamedProgramLocalParameter4dvEXT; -void* __blue_glCore_glGetNamedProgramLocalParameterIuivEXT; -void* __blue_glCore_glGetPixelTexGenParameterivSGIS; -void* __blue_glCore_glGetnMapdv; -void* __blue_glCore_glMultiTexCoord4svARB; -void* __blue_glCore_glVertexStream2ivATI; -void* __blue_glCore_glUniform4uivEXT; -void* __blue_glCore_glGetPointeri_vEXT; -void* __blue_glCore_glClearTexImage; -void* __blue_glCore_glVertexAttribP1ui; -void* __blue_glCore_glCompressedTexImage1DARB; -void* __blue_glCore_glTextureStorage1DEXT; -void* __blue_glCore_glUniform4fvARB; -void* __blue_glCore_glFramebufferTexture3DEXT; -void* __blue_glCore_glDrawElementsIndirect; -void* __blue_glCore_glBindBufferBaseEXT; -void* __blue_glCore_glIglooInterfaceSGIX; -void* __blue_glCore_glMinmaxEXT; -void* __blue_glCore_glClearDepthf; -void* __blue_glCore_glReadnPixels; -void* __blue_glCore_glGenerateTextureMipmap; -void* __blue_glCore_glGetnPixelMapuivARB; -void* __blue_glCore_glProgramLocalParameter4fARB; -void* __blue_glCore_glVertexAttribL1dvEXT; -void* __blue_glCore_glBeginTransformFeedback; -void* __blue_glCore_glDepthBoundsEXT; -void* __blue_glCore_glVertexAttrib2f; +void* __blue_glCore_glMapControlPointsNV; +void* __blue_glCore_glMapParameterivNV; +void* __blue_glCore_glMapParameterfvNV; +void* __blue_glCore_glGetMapControlPointsNV; +void* __blue_glCore_glGetMapParameterivNV; +void* __blue_glCore_glGetMapParameterfvNV; +void* __blue_glCore_glGetMapAttribParameterivNV; +void* __blue_glCore_glGetMapAttribParameterfvNV; +void* __blue_glCore_glEvalMapsNV; +void* __blue_glCore_glGetMultisamplefvNV; +void* __blue_glCore_glSampleMaskIndexedNV; +void* __blue_glCore_glTexRenderbufferNV; +void* __blue_glCore_glDeleteFencesNV; +void* __blue_glCore_glGenFencesNV; +void* __blue_glCore_glIsFenceNV; +void* __blue_glCore_glTestFenceNV; +void* __blue_glCore_glGetFenceivNV; +void* __blue_glCore_glFinishFenceNV; +void* __blue_glCore_glSetFenceNV; +void* __blue_glCore_glFragmentCoverageColorNV; +void* __blue_glCore_glProgramNamedParameter4fNV; +void* __blue_glCore_glProgramNamedParameter4fvNV; +void* __blue_glCore_glProgramNamedParameter4dNV; +void* __blue_glCore_glProgramNamedParameter4dvNV; +void* __blue_glCore_glGetProgramNamedParameterfvNV; +void* __blue_glCore_glGetProgramNamedParameterdvNV; +void* __blue_glCore_glCoverageModulationTableNV; +void* __blue_glCore_glGetCoverageModulationTableNV; +void* __blue_glCore_glCoverageModulationNV; +void* __blue_glCore_glRenderbufferStorageMultisampleCoverageNV; +void* __blue_glCore_glProgramVertexLimitNV; +void* __blue_glCore_glFramebufferTextureEXT; +void* __blue_glCore_glFramebufferTextureFaceEXT; +void* __blue_glCore_glProgramLocalParameterI4iNV; +void* __blue_glCore_glProgramLocalParameterI4ivNV; +void* __blue_glCore_glProgramLocalParametersI4ivNV; +void* __blue_glCore_glProgramLocalParameterI4uiNV; +void* __blue_glCore_glProgramLocalParameterI4uivNV; +void* __blue_glCore_glProgramLocalParametersI4uivNV; +void* __blue_glCore_glProgramEnvParameterI4iNV; +void* __blue_glCore_glProgramEnvParameterI4ivNV; void* __blue_glCore_glProgramEnvParametersI4ivNV; -void* __blue_glCore_glTexCoord4fVertex4fSUN; -void* __blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN; -void* __blue_glCore_glGetNamedProgramLocalParameterfvEXT; -void* __blue_glCore_glProgramUniform1ui64ARB; -void* __blue_glCore_glReadInstrumentsSGIX; -void* __blue_glCore_glVertexAttrib3dNV; -void* __blue_glCore_glProgramParameter4dvNV; -void* __blue_glCore_glColorTableParameterivSGI; -void* __blue_glCore_glUniform1f; -void* __blue_glCore_glMultiTexRenderbufferEXT; -void* __blue_glCore_glVertexAttribI4uiEXT; -void* __blue_glCore_glGetConvolutionParameterfv; -void* __blue_glCore_glMultiTexCoord3sARB; -void* __blue_glCore_glGetTexParameterxvOES; -void* __blue_glCore_glGetNamedBufferParameteriv; -void* __blue_glCore_glMultiDrawElementArrayAPPLE; -void* __blue_glCore_glGetnConvolutionFilter; -void* __blue_glCore_glUniformMatrix2x3fv; -void* __blue_glCore_glBindBuffersRange; -void* __blue_glCore_glMakeImageHandleNonResidentNV; -void* __blue_glCore_glFinalCombinerInputNV; -void* __blue_glCore_glFlush; -void* __blue_glCore_glVertexArrayElementBuffer; -void* __blue_glCore_glProgramUniform4uiEXT; -void* __blue_glCore_glVertexAttrib4ubvNV; -void* __blue_glCore_glSampleMapATI; -void* __blue_glCore_glMultiTexCoord1bOES; -void* __blue_glCore_glVertexAttribParameteriAMD; -void* __blue_glCore_glPointParameterfARB; -void* __blue_glCore_glWindowPos2dMESA; -} - -namespace bluegl { - -// This mutex protect g_library_refcount below. -static std::mutex g_library_mutex; -static uint32_t g_library_refcount = 0; - -struct { - void** api_call; - const char* api_name; -} g_gl_stubs[] = { - { &__blue_glCore_glVertexAttrib4dARB, "glVertexAttrib4dARB" }, - { &__blue_glCore_glMultMatrixxOES, "glMultMatrixxOES" }, - { &__blue_glCore_glProgramParameters4fvNV, "glProgramParameters4fvNV" }, - { &__blue_glCore_glGenProgramPipelines, "glGenProgramPipelines" }, - { &__blue_glCore_glMultiTexCoordP3uiv, "glMultiTexCoordP3uiv" }, - { &__blue_glCore_glSecondaryColor3usv, "glSecondaryColor3usv" }, - { &__blue_glCore_glGetHistogramParameteriv, "glGetHistogramParameteriv" }, - { &__blue_glCore_glRenderbufferStorageEXT, "glRenderbufferStorageEXT" }, - { &__blue_glCore_glGetPathParameterivNV, "glGetPathParameterivNV" }, - { &__blue_glCore_glLineWidthxOES, "glLineWidthxOES" }, - { &__blue_glCore_glGlobalAlphaFactordSUN, "glGlobalAlphaFactordSUN" }, - { &__blue_glCore_glTexImage2D, "glTexImage2D" }, - { &__blue_glCore_glGlobalAlphaFactorfSUN, "glGlobalAlphaFactorfSUN" }, - { &__blue_glCore_glNormalP3uiv, "glNormalP3uiv" }, - { &__blue_glCore_glColor4fNormal3fVertex3fSUN, "glColor4fNormal3fVertex3fSUN" }, - { &__blue_glCore_glMapVertexAttrib1fAPPLE, "glMapVertexAttrib1fAPPLE" }, - { &__blue_glCore_glTexCoord2fNormal3fVertex3fvSUN, "glTexCoord2fNormal3fVertex3fvSUN" }, - { &__blue_glCore_glVertexArrayVertexBuffers, "glVertexArrayVertexBuffers" }, - { &__blue_glCore_glShaderSource, "glShaderSource" }, - { &__blue_glCore_glConvolutionFilter1D, "glConvolutionFilter1D" }, - { &__blue_glCore_glIsFenceAPPLE, "glIsFenceAPPLE" }, - { &__blue_glCore_glWindowPos2s, "glWindowPos2s" }, - { &__blue_glCore_glEvaluateDepthValuesARB, "glEvaluateDepthValuesARB" }, - { &__blue_glCore_glInterpolatePathsNV, "glInterpolatePathsNV" }, - { &__blue_glCore_glTextureParameterivEXT, "glTextureParameterivEXT" }, - { &__blue_glCore_glDeleteOcclusionQueriesNV, "glDeleteOcclusionQueriesNV" }, - { &__blue_glCore_glMakeTextureHandleResidentARB, "glMakeTextureHandleResidentARB" }, - { &__blue_glCore_glCopyImageSubDataNV, "glCopyImageSubDataNV" }, - { &__blue_glCore_glVertexAttribL3d, "glVertexAttribL3d" }, - { &__blue_glCore_glGetTextureSamplerHandleNV, "glGetTextureSamplerHandleNV" }, - { &__blue_glCore_glMakeTextureHandleResidentNV, "glMakeTextureHandleResidentNV" }, - { &__blue_glCore_glPolygonOffsetxOES, "glPolygonOffsetxOES" }, - { &__blue_glCore_glUniformMatrix2fv, "glUniformMatrix2fv" }, - { &__blue_glCore_glMultiDrawElementsEXT, "glMultiDrawElementsEXT" }, - { &__blue_glCore_glVertexAttribI1uiv, "glVertexAttribI1uiv" }, - { &__blue_glCore_glPathCoordsNV, "glPathCoordsNV" }, - { &__blue_glCore_glVertexArrayVertexBindingDivisorEXT, "glVertexArrayVertexBindingDivisorEXT" }, - { &__blue_glCore_glVertexAttrib2dv, "glVertexAttrib2dv" }, - { &__blue_glCore_glFinish, "glFinish" }, - { &__blue_glCore_glVertexAttribs2dvNV, "glVertexAttribs2dvNV" }, - { &__blue_glCore_glVertexAttribI1ivEXT, "glVertexAttribI1ivEXT" }, - { &__blue_glCore_glVertexAttrib2sNV, "glVertexAttrib2sNV" }, - { &__blue_glCore_glMultiTexCoord1iv, "glMultiTexCoord1iv" }, - { &__blue_glCore_glGetnMapiv, "glGetnMapiv" }, - { &__blue_glCore_glCompressedTexSubImage1DARB, "glCompressedTexSubImage1DARB" }, - { &__blue_glCore_glFogCoordPointerEXT, "glFogCoordPointerEXT" }, - { &__blue_glCore_glCompressedMultiTexImage1DEXT, "glCompressedMultiTexImage1DEXT" }, - { &__blue_glCore_glVertexAttrib3d, "glVertexAttrib3d" }, - { &__blue_glCore_glLineWidth, "glLineWidth" }, - { &__blue_glCore_glGetShaderiv, "glGetShaderiv" }, - { &__blue_glCore_glProgramUniform1dv, "glProgramUniform1dv" }, - { &__blue_glCore_glGetVertexAttribLui64vNV, "glGetVertexAttribLui64vNV" }, - { &__blue_glCore_glProgramUniform1ui64vNV, "glProgramUniform1ui64vNV" }, - { &__blue_glCore_glGetRenderbufferParameteriv, "glGetRenderbufferParameteriv" }, - { &__blue_glCore_glGetOcclusionQueryivNV, "glGetOcclusionQueryivNV" }, - { &__blue_glCore_glUniformMatrix2x4dv, "glUniformMatrix2x4dv" }, - { &__blue_glCore_glGetVertexAttribPointervNV, "glGetVertexAttribPointervNV" }, - { &__blue_glCore_glUniform2fv, "glUniform2fv" }, - { &__blue_glCore_glRasterPos2xOES, "glRasterPos2xOES" }, - { &__blue_glCore_glGetCommandHeaderNV, "glGetCommandHeaderNV" }, - { &__blue_glCore_glUniformSubroutinesuiv, "glUniformSubroutinesuiv" }, - { &__blue_glCore_glGetPixelTransformParameterivEXT, "glGetPixelTransformParameterivEXT" }, - { &__blue_glCore_glGetFragDataLocation, "glGetFragDataLocation" }, - { &__blue_glCore_glTexCoord2fColor3fVertex3fSUN, "glTexCoord2fColor3fVertex3fSUN" }, - { &__blue_glCore_glSecondaryColor3uiv, "glSecondaryColor3uiv" }, - { &__blue_glCore_glEnableVertexArrayAttribEXT, "glEnableVertexArrayAttribEXT" }, - { &__blue_glCore_glPixelTexGenParameterfvSGIS, "glPixelTexGenParameterfvSGIS" }, - { &__blue_glCore_glProgramUniformMatrix3x4dvEXT, "glProgramUniformMatrix3x4dvEXT" }, - { &__blue_glCore_glMultiTexCoord2fvARB, "glMultiTexCoord2fvARB" }, - { &__blue_glCore_glHistogram, "glHistogram" }, - { &__blue_glCore_glGetSynciv, "glGetSynciv" }, - { &__blue_glCore_glBitmapxOES, "glBitmapxOES" }, - { &__blue_glCore_glGetnColorTable, "glGetnColorTable" }, - { &__blue_glCore_glGenerateMultiTexMipmapEXT, "glGenerateMultiTexMipmapEXT" }, - { &__blue_glCore_glVertexStream4fvATI, "glVertexStream4fvATI" }, - { &__blue_glCore_glSecondaryColorPointerEXT, "glSecondaryColorPointerEXT" }, - { &__blue_glCore_glVertexAttribIPointerEXT, "glVertexAttribIPointerEXT" }, - { &__blue_glCore_glEvalCoord2xvOES, "glEvalCoord2xvOES" }, - { &__blue_glCore_glDeleteFencesNV, "glDeleteFencesNV" }, - { &__blue_glCore_glAlphaFragmentOp1ATI, "glAlphaFragmentOp1ATI" }, - { &__blue_glCore_glGetActiveUniformName, "glGetActiveUniformName" }, - { &__blue_glCore_glGetCompressedTextureSubImage, "glGetCompressedTextureSubImage" }, - { &__blue_glCore_glGetTextureParameterfvEXT, "glGetTextureParameterfvEXT" }, - { &__blue_glCore_glDeleteShader, "glDeleteShader" }, - { &__blue_glCore_glRenderbufferStorageMultisample, "glRenderbufferStorageMultisample" }, - { &__blue_glCore_glTexCoord2fVertex3fSUN, "glTexCoord2fVertex3fSUN" }, - { &__blue_glCore_glGetActiveSubroutineUniformName, "glGetActiveSubroutineUniformName" }, - { &__blue_glCore_glGetVideoCaptureStreamfvNV, "glGetVideoCaptureStreamfvNV" }, - { &__blue_glCore_glInvalidateSubFramebuffer, "glInvalidateSubFramebuffer" }, - { &__blue_glCore_glIndexFormatNV, "glIndexFormatNV" }, - { &__blue_glCore_glMultiTexEnvfvEXT, "glMultiTexEnvfvEXT" }, - { &__blue_glCore_glUniformBufferEXT, "glUniformBufferEXT" }, - { &__blue_glCore_glNamedProgramLocalParametersI4uivEXT, "glNamedProgramLocalParametersI4uivEXT" }, - { &__blue_glCore_glWeightPathsNV, "glWeightPathsNV" }, - { &__blue_glCore_glGetnHistogram, "glGetnHistogram" }, - { &__blue_glCore_glTexCoord1bOES, "glTexCoord1bOES" }, - { &__blue_glCore_glSetFragmentShaderConstantATI, "glSetFragmentShaderConstantATI" }, - { &__blue_glCore_glRasterPos3xvOES, "glRasterPos3xvOES" }, - { &__blue_glCore_glCopyConvolutionFilter1DEXT, "glCopyConvolutionFilter1DEXT" }, - { &__blue_glCore_glArrayElementEXT, "glArrayElementEXT" }, - { &__blue_glCore_glCopyTextureImage2DEXT, "glCopyTextureImage2DEXT" }, - { &__blue_glCore_glNamedProgramLocalParameterI4uivEXT, "glNamedProgramLocalParameterI4uivEXT" }, - { &__blue_glCore_glMultiDrawElementsIndirectBindlessNV, "glMultiDrawElementsIndirectBindlessNV" }, - { &__blue_glCore_glClearColorIuiEXT, "glClearColorIuiEXT" }, - { &__blue_glCore_glMultiTexParameterfEXT, "glMultiTexParameterfEXT" }, - { &__blue_glCore_glVertexArrayVertexAttribIFormatEXT, "glVertexArrayVertexAttribIFormatEXT" }, - { &__blue_glCore_glVertexAttrib1sv, "glVertexAttrib1sv" }, - { &__blue_glCore_glVertexStream2dvATI, "glVertexStream2dvATI" }, - { &__blue_glCore_glUniform4iARB, "glUniform4iARB" }, - { &__blue_glCore_glVertexAttribs4svNV, "glVertexAttribs4svNV" }, - { &__blue_glCore_glProgramUniformMatrix3x2dvEXT, "glProgramUniformMatrix3x2dvEXT" }, - { &__blue_glCore_glProgramUniform1ui, "glProgramUniform1ui" }, - { &__blue_glCore_glVertexAttribIFormatNV, "glVertexAttribIFormatNV" }, - { &__blue_glCore_glFragmentLightModelfSGIX, "glFragmentLightModelfSGIX" }, - { &__blue_glCore_glGetActiveSubroutineName, "glGetActiveSubroutineName" }, - { &__blue_glCore_glConvolutionParameteri, "glConvolutionParameteri" }, - { &__blue_glCore_glMultiTexCoord4f, "glMultiTexCoord4f" }, - { &__blue_glCore_glTexCoord1xvOES, "glTexCoord1xvOES" }, - { &__blue_glCore_glIsTransformFeedback, "glIsTransformFeedback" }, - { &__blue_glCore_glBlendBarrierKHR, "glBlendBarrierKHR" }, - { &__blue_glCore_glBindBufferRangeEXT, "glBindBufferRangeEXT" }, - { &__blue_glCore_glPathColorGenNV, "glPathColorGenNV" }, - { &__blue_glCore_glEndQuery, "glEndQuery" }, - { &__blue_glCore_glUniformMatrix2x4fv, "glUniformMatrix2x4fv" }, - { &__blue_glCore_glGenRenderbuffers, "glGenRenderbuffers" }, - { &__blue_glCore_glShaderOp2EXT, "glShaderOp2EXT" }, - { &__blue_glCore_glDrawTransformFeedback, "glDrawTransformFeedback" }, - { &__blue_glCore_glProgramUniform3ui64vNV, "glProgramUniform3ui64vNV" }, - { &__blue_glCore_glNamedBufferStorage, "glNamedBufferStorage" }, - { &__blue_glCore_glOrthoxOES, "glOrthoxOES" }, - { &__blue_glCore_glVertexAttrib4ubvARB, "glVertexAttrib4ubvARB" }, - { &__blue_glCore_glStencilOp, "glStencilOp" }, - { &__blue_glCore_glProgramLocalParametersI4ivNV, "glProgramLocalParametersI4ivNV" }, - { &__blue_glCore_glVertexStream2iATI, "glVertexStream2iATI" }, - { &__blue_glCore_glWeightdvARB, "glWeightdvARB" }, - { &__blue_glCore_glVertexAttrib1fARB, "glVertexAttrib1fARB" }, - { &__blue_glCore_glColorFragmentOp2ATI, "glColorFragmentOp2ATI" }, - { &__blue_glCore_glGetBufferPointervARB, "glGetBufferPointervARB" }, - { &__blue_glCore_glNamedFramebufferTexture1DEXT, "glNamedFramebufferTexture1DEXT" }, - { &__blue_glCore_glVertexAttrib2fNV, "glVertexAttrib2fNV" }, - { &__blue_glCore_glDisableVertexAttribArray, "glDisableVertexAttribArray" }, - { &__blue_glCore_glTextureParameterf, "glTextureParameterf" }, - { &__blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN, "glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN" }, - { &__blue_glCore_glNormal3fVertex3fSUN, "glNormal3fVertex3fSUN" }, - { &__blue_glCore_glGetTexBumpParameterfvATI, "glGetTexBumpParameterfvATI" }, - { &__blue_glCore_glMultiTexCoord3fARB, "glMultiTexCoord3fARB" }, - { &__blue_glCore_glTextureParameterfv, "glTextureParameterfv" }, - { &__blue_glCore_glTexBumpParameterivATI, "glTexBumpParameterivATI" }, - { &__blue_glCore_glLockArraysEXT, "glLockArraysEXT" }, - { &__blue_glCore_glIsEnabledIndexedEXT, "glIsEnabledIndexedEXT" }, - { &__blue_glCore_glGenerateMipmapEXT, "glGenerateMipmapEXT" }, - { &__blue_glCore_glVertexP3uiv, "glVertexP3uiv" }, - { &__blue_glCore_glClearNamedBufferSubData, "glClearNamedBufferSubData" }, - { &__blue_glCore_glInvalidateTexImage, "glInvalidateTexImage" }, - { &__blue_glCore_glBindFramebuffer, "glBindFramebuffer" }, - { &__blue_glCore_glDrawArraysIndirect, "glDrawArraysIndirect" }, - { &__blue_glCore_glClipPlanexOES, "glClipPlanexOES" }, - { &__blue_glCore_glGetFloati_v, "glGetFloati_v" }, - { &__blue_glCore_glTransformFeedbackVaryingsEXT, "glTransformFeedbackVaryingsEXT" }, - { &__blue_glCore_glGetColorTableParameteriv, "glGetColorTableParameteriv" }, - { &__blue_glCore_glTexBufferRange, "glTexBufferRange" }, - { &__blue_glCore_glVertexAttribI1uivEXT, "glVertexAttribI1uivEXT" }, - { &__blue_glCore_glShaderBinary, "glShaderBinary" }, - { &__blue_glCore_glGetVertexAttribLi64vNV, "glGetVertexAttribLi64vNV" }, - { &__blue_glCore_glGetNamedBufferSubDataEXT, "glGetNamedBufferSubDataEXT" }, - { &__blue_glCore_glUniform3uivEXT, "glUniform3uivEXT" }, - { &__blue_glCore_glMatrixTranslatefEXT, "glMatrixTranslatefEXT" }, - { &__blue_glCore_glVertexAttribs2hvNV, "glVertexAttribs2hvNV" }, - { &__blue_glCore_glClearBufferSubData, "glClearBufferSubData" }, - { &__blue_glCore_glGenFramebuffers, "glGenFramebuffers" }, - { &__blue_glCore_glVertexArrayAttribFormat, "glVertexArrayAttribFormat" }, - { &__blue_glCore_glGetActiveUniformsiv, "glGetActiveUniformsiv" }, - { &__blue_glCore_glCompressedTextureSubImage1DEXT, "glCompressedTextureSubImage1DEXT" }, - { &__blue_glCore_glIsRenderbuffer, "glIsRenderbuffer" }, - { &__blue_glCore_glPresentFrameKeyedNV, "glPresentFrameKeyedNV" }, - { &__blue_glCore_glProgramUniformMatrix3fvEXT, "glProgramUniformMatrix3fvEXT" }, - { &__blue_glCore_glVertexAttribL2i64vNV, "glVertexAttribL2i64vNV" }, - { &__blue_glCore_glFogCoordhvNV, "glFogCoordhvNV" }, - { &__blue_glCore_glVertexAttrib4ubv, "glVertexAttrib4ubv" }, - { &__blue_glCore_glPushClientAttribDefaultEXT, "glPushClientAttribDefaultEXT" }, - { &__blue_glCore_glWindowPos3ivMESA, "glWindowPos3ivMESA" }, - { &__blue_glCore_glPrimitiveRestartIndexNV, "glPrimitiveRestartIndexNV" }, - { &__blue_glCore_glCreatePerfQueryINTEL, "glCreatePerfQueryINTEL" }, - { &__blue_glCore_glGetProgramLocalParameterIuivNV, "glGetProgramLocalParameterIuivNV" }, - { &__blue_glCore_glResizeBuffersMESA, "glResizeBuffersMESA" }, - { &__blue_glCore_glVertexStream1fATI, "glVertexStream1fATI" }, - { &__blue_glCore_glProgramUniform2ui, "glProgramUniform2ui" }, - { &__blue_glCore_glSecondaryColor3iv, "glSecondaryColor3iv" }, - { &__blue_glCore_glProgramParameters4dvNV, "glProgramParameters4dvNV" }, - { &__blue_glCore_glWindowPos3i, "glWindowPos3i" }, - { &__blue_glCore_glRectxvOES, "glRectxvOES" }, - { &__blue_glCore_glMultiTexCoord4iARB, "glMultiTexCoord4iARB" }, - { &__blue_glCore_glBeginConditionalRender, "glBeginConditionalRender" }, - { &__blue_glCore_glFreeObjectBufferATI, "glFreeObjectBufferATI" }, - { &__blue_glCore_glGetOcclusionQueryuivNV, "glGetOcclusionQueryuivNV" }, - { &__blue_glCore_glColorP4ui, "glColorP4ui" }, - { &__blue_glCore_glGetPathColorGenivNV, "glGetPathColorGenivNV" }, - { &__blue_glCore_glGetQueryiv, "glGetQueryiv" }, - { &__blue_glCore_glVertexAttribI2uiv, "glVertexAttribI2uiv" }, - { &__blue_glCore_glGetVertexArrayPointeri_vEXT, "glGetVertexArrayPointeri_vEXT" }, - { &__blue_glCore_glSamplerParameteri, "glSamplerParameteri" }, - { &__blue_glCore_glResumeTransformFeedbackNV, "glResumeTransformFeedbackNV" }, - { &__blue_glCore_glVertexAttribL1ui64vNV, "glVertexAttribL1ui64vNV" }, - { &__blue_glCore_glPauseTransformFeedbackNV, "glPauseTransformFeedbackNV" }, - { &__blue_glCore_glVertexAttribs2fvNV, "glVertexAttribs2fvNV" }, - { &__blue_glCore_glProgramUniform1iv, "glProgramUniform1iv" }, - { &__blue_glCore_glGetColorTableSGI, "glGetColorTableSGI" }, - { &__blue_glCore_glGetActiveAttrib, "glGetActiveAttrib" }, - { &__blue_glCore_glResetMinmax, "glResetMinmax" }, - { &__blue_glCore_glBinormal3svEXT, "glBinormal3svEXT" }, - { &__blue_glCore_glVertexAttrib4fv, "glVertexAttrib4fv" }, - { &__blue_glCore_glIndexxOES, "glIndexxOES" }, - { &__blue_glCore_glMatrixMultTransposefEXT, "glMatrixMultTransposefEXT" }, - { &__blue_glCore_glNamedFramebufferTexture, "glNamedFramebufferTexture" }, - { &__blue_glCore_glVertexP2uiv, "glVertexP2uiv" }, - { &__blue_glCore_glMemoryBarrier, "glMemoryBarrier" }, - { &__blue_glCore_glGetGraphicsResetStatusARB, "glGetGraphicsResetStatusARB" }, - { &__blue_glCore_glBindAttribLocation, "glBindAttribLocation" }, - { &__blue_glCore_glVertexBlendEnviATI, "glVertexBlendEnviATI" }, - { &__blue_glCore_glAttachObjectARB, "glAttachObjectARB" }, - { &__blue_glCore_glNormalStream3bvATI, "glNormalStream3bvATI" }, - { &__blue_glCore_glNamedFramebufferTextureFaceEXT, "glNamedFramebufferTextureFaceEXT" }, - { &__blue_glCore_glGetConvolutionParameterivEXT, "glGetConvolutionParameterivEXT" }, - { &__blue_glCore_glProgramPathFragmentInputGenNV, "glProgramPathFragmentInputGenNV" }, - { &__blue_glCore_glIsFramebufferEXT, "glIsFramebufferEXT" }, - { &__blue_glCore_glIsVertexArray, "glIsVertexArray" }, - { &__blue_glCore_glGetVertexAttribIivEXT, "glGetVertexAttribIivEXT" }, - { &__blue_glCore_glTextureParameterIivEXT, "glTextureParameterIivEXT" }, - { &__blue_glCore_glGetnPixelMapuiv, "glGetnPixelMapuiv" }, - { &__blue_glCore_glGetInvariantFloatvEXT, "glGetInvariantFloatvEXT" }, - { &__blue_glCore_glAttachShader, "glAttachShader" }, - { &__blue_glCore_glSecondaryColor3i, "glSecondaryColor3i" }, - { &__blue_glCore_glTexCoord4hvNV, "glTexCoord4hvNV" }, - { &__blue_glCore_glColorTableSGI, "glColorTableSGI" }, - { &__blue_glCore_glProgramUniform4uivEXT, "glProgramUniform4uivEXT" }, - { &__blue_glCore_glPointSizexOES, "glPointSizexOES" }, - { &__blue_glCore_glTrackMatrixNV, "glTrackMatrixNV" }, - { &__blue_glCore_glMultiTexCoord1fv, "glMultiTexCoord1fv" }, - { &__blue_glCore_glSecondaryColorPointerListIBM, "glSecondaryColorPointerListIBM" }, - { &__blue_glCore_glGenBuffersARB, "glGenBuffersARB" }, - { &__blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN, "glTexCoord4fColor4fNormal3fVertex4fSUN" }, - { &__blue_glCore_glCopyColorTable, "glCopyColorTable" }, - { &__blue_glCore_glTexPageCommitmentARB, "glTexPageCommitmentARB" }, - { &__blue_glCore_glSetFenceAPPLE, "glSetFenceAPPLE" }, - { &__blue_glCore_glMultiTexCoord2dvARB, "glMultiTexCoord2dvARB" }, - { &__blue_glCore_glVertex4hvNV, "glVertex4hvNV" }, - { &__blue_glCore_glBindVertexBuffer, "glBindVertexBuffer" }, - { &__blue_glCore_glVertex3xvOES, "glVertex3xvOES" }, - { &__blue_glCore_glConvolutionParameterivEXT, "glConvolutionParameterivEXT" }, - { &__blue_glCore_glProgramUniform3ui64vARB, "glProgramUniform3ui64vARB" }, - { &__blue_glCore_glProgramUniform2dv, "glProgramUniform2dv" }, - { &__blue_glCore_glWindowPos4sMESA, "glWindowPos4sMESA" }, - { &__blue_glCore_glMultiTexImage1DEXT, "glMultiTexImage1DEXT" }, - { &__blue_glCore_glRenderbufferStorage, "glRenderbufferStorage" }, - { &__blue_glCore_glConvolutionFilter2D, "glConvolutionFilter2D" }, - { &__blue_glCore_glBinormal3bEXT, "glBinormal3bEXT" }, - { &__blue_glCore_glFragmentLightivSGIX, "glFragmentLightivSGIX" }, - { &__blue_glCore_glProgramUniform3iv, "glProgramUniform3iv" }, - { &__blue_glCore_glIsQuery, "glIsQuery" }, - { &__blue_glCore_glVertexStream2sATI, "glVertexStream2sATI" }, - { &__blue_glCore_glProgramUniform4iEXT, "glProgramUniform4iEXT" }, - { &__blue_glCore_glGetInvariantBooleanvEXT, "glGetInvariantBooleanvEXT" }, - { &__blue_glCore_glSecondaryColorFormatNV, "glSecondaryColorFormatNV" }, - { &__blue_glCore_glVertexAttrib4fNV, "glVertexAttrib4fNV" }, - { &__blue_glCore_glColorFragmentOp1ATI, "glColorFragmentOp1ATI" }, - { &__blue_glCore_glTransformFeedbackBufferBase, "glTransformFeedbackBufferBase" }, - { &__blue_glCore_glGetTexParameteriv, "glGetTexParameteriv" }, - { &__blue_glCore_glGetVertexAttribIiv, "glGetVertexAttribIiv" }, - { &__blue_glCore_glEndOcclusionQueryNV, "glEndOcclusionQueryNV" }, - { &__blue_glCore_glTransformFeedbackStreamAttribsNV, "glTransformFeedbackStreamAttribsNV" }, - { &__blue_glCore_glGetQueryBufferObjecti64v, "glGetQueryBufferObjecti64v" }, - { &__blue_glCore_glStencilFillPathInstancedNV, "glStencilFillPathInstancedNV" }, - { &__blue_glCore_glDrawCommandsStatesNV, "glDrawCommandsStatesNV" }, - { &__blue_glCore_glGetSamplerParameterfv, "glGetSamplerParameterfv" }, - { &__blue_glCore_glMultiTexCoord4fARB, "glMultiTexCoord4fARB" }, - { &__blue_glCore_glUniform3ui64NV, "glUniform3ui64NV" }, - { &__blue_glCore_glVertexWeighthNV, "glVertexWeighthNV" }, - { &__blue_glCore_glWindowPos3ivARB, "glWindowPos3ivARB" }, - { &__blue_glCore_glSecondaryColor3ivEXT, "glSecondaryColor3ivEXT" }, - { &__blue_glCore_glBindVertexArray, "glBindVertexArray" }, - { &__blue_glCore_glGetVertexAttribLui64vARB, "glGetVertexAttribLui64vARB" }, - { &__blue_glCore_glUniform4i64NV, "glUniform4i64NV" }, - { &__blue_glCore_glBlendBarrierNV, "glBlendBarrierNV" }, - { &__blue_glCore_glWindowPos3fvARB, "glWindowPos3fvARB" }, - { &__blue_glCore_glBlendEquationSeparateiARB, "glBlendEquationSeparateiARB" }, - { &__blue_glCore_glGetVariantFloatvEXT, "glGetVariantFloatvEXT" }, - { &__blue_glCore_glColorSubTableEXT, "glColorSubTableEXT" }, - { &__blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN, "glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN" }, - { &__blue_glCore_glGetProgramResourceiv, "glGetProgramResourceiv" }, - { &__blue_glCore_glMultiTexCoord1f, "glMultiTexCoord1f" }, - { &__blue_glCore_glGetNamedFramebufferAttachmentParameteriv, "glGetNamedFramebufferAttachmentParameteriv" }, - { &__blue_glCore_glDeleteProgramsNV, "glDeleteProgramsNV" }, - { &__blue_glCore_glGlobalAlphaFactoriSUN, "glGlobalAlphaFactoriSUN" }, - { &__blue_glCore_glGetFinalCombinerInputParameterfvNV, "glGetFinalCombinerInputParameterfvNV" }, - { &__blue_glCore_glNormalStream3dATI, "glNormalStream3dATI" }, - { &__blue_glCore_glMultiTexEnvivEXT, "glMultiTexEnvivEXT" }, - { &__blue_glCore_glTexCoord4xvOES, "glTexCoord4xvOES" }, - { &__blue_glCore_glProgramUniform4dvEXT, "glProgramUniform4dvEXT" }, - { &__blue_glCore_glProgramUniform2ui64vARB, "glProgramUniform2ui64vARB" }, - { &__blue_glCore_glBindBufferBaseNV, "glBindBufferBaseNV" }, - { &__blue_glCore_glVertexAttrib4s, "glVertexAttrib4s" }, - { &__blue_glCore_glTexCoord2fVertex3fvSUN, "glTexCoord2fVertex3fvSUN" }, - { &__blue_glCore_glMatrixMultdEXT, "glMatrixMultdEXT" }, - { &__blue_glCore_glGetnMapdvARB, "glGetnMapdvARB" }, - { &__blue_glCore_glEnableVertexArrayEXT, "glEnableVertexArrayEXT" }, - { &__blue_glCore_glConvolutionFilter1DEXT, "glConvolutionFilter1DEXT" }, - { &__blue_glCore_glMemoryBarrierEXT, "glMemoryBarrierEXT" }, - { &__blue_glCore_glNewObjectBufferATI, "glNewObjectBufferATI" }, - { &__blue_glCore_glProgramUniform2fv, "glProgramUniform2fv" }, - { &__blue_glCore_glUniformMatrix4x3fv, "glUniformMatrix4x3fv" }, - { &__blue_glCore_glGetHistogramParameterfv, "glGetHistogramParameterfv" }, - { &__blue_glCore_glFrameTerminatorGREMEDY, "glFrameTerminatorGREMEDY" }, - { &__blue_glCore_glGetProgramLocalParameterfvARB, "glGetProgramLocalParameterfvARB" }, - { &__blue_glCore_glUnmapNamedBuffer, "glUnmapNamedBuffer" }, - { &__blue_glCore_glWindowPos2svARB, "glWindowPos2svARB" }, - { &__blue_glCore_glBindTextureEXT, "glBindTextureEXT" }, - { &__blue_glCore_glVertexAttrib4svNV, "glVertexAttrib4svNV" }, - { &__blue_glCore_glPointParameterfSGIS, "glPointParameterfSGIS" }, - { &__blue_glCore_glSecondaryColor3hvNV, "glSecondaryColor3hvNV" }, - { &__blue_glCore_glColorTableParameterfv, "glColorTableParameterfv" }, - { &__blue_glCore_glNamedProgramLocalParameter4fEXT, "glNamedProgramLocalParameter4fEXT" }, - { &__blue_glCore_glGetTextureParameterivEXT, "glGetTextureParameterivEXT" }, - { &__blue_glCore_glTestObjectAPPLE, "glTestObjectAPPLE" }, - { &__blue_glCore_glGetIntegerui64vNV, "glGetIntegerui64vNV" }, - { &__blue_glCore_glIsVertexAttribEnabledAPPLE, "glIsVertexAttribEnabledAPPLE" }, - { &__blue_glCore_glActiveTextureARB, "glActiveTextureARB" }, - { &__blue_glCore_glVertexAttrib3dARB, "glVertexAttrib3dARB" }, - { &__blue_glCore_glGetTextureHandleARB, "glGetTextureHandleARB" }, - { &__blue_glCore_glGetColorTableEXT, "glGetColorTableEXT" }, - { &__blue_glCore_glDrawArraysEXT, "glDrawArraysEXT" }, - { &__blue_glCore_glImageTransformParameterfHP, "glImageTransformParameterfHP" }, - { &__blue_glCore_glActiveStencilFaceEXT, "glActiveStencilFaceEXT" }, - { &__blue_glCore_glUniformMatrix3x4dv, "glUniformMatrix3x4dv" }, - { &__blue_glCore_glProgramUniform4i64ARB, "glProgramUniform4i64ARB" }, - { &__blue_glCore_glUniform3iv, "glUniform3iv" }, - { &__blue_glCore_glGetPerfMonitorCountersAMD, "glGetPerfMonitorCountersAMD" }, - { &__blue_glCore_glFinishFenceAPPLE, "glFinishFenceAPPLE" }, - { &__blue_glCore_glUniform4ivARB, "glUniform4ivARB" }, - { &__blue_glCore_glRenderbufferStorageMultisampleEXT, "glRenderbufferStorageMultisampleEXT" }, - { &__blue_glCore_glPointParameterfvARB, "glPointParameterfvARB" }, - { &__blue_glCore_glProgramLocalParameterI4uivNV, "glProgramLocalParameterI4uivNV" }, - { &__blue_glCore_glDeformSGIX, "glDeformSGIX" }, - { &__blue_glCore_glProgramUniformHandleui64vNV, "glProgramUniformHandleui64vNV" }, - { &__blue_glCore_glMultiDrawRangeElementArrayAPPLE, "glMultiDrawRangeElementArrayAPPLE" }, - { &__blue_glCore_glGetnUniformfvARB, "glGetnUniformfvARB" }, - { &__blue_glCore_glVertexAttribs3svNV, "glVertexAttribs3svNV" }, - { &__blue_glCore_glVertexAttrib1dvNV, "glVertexAttrib1dvNV" }, - { &__blue_glCore_glVertexStream1fvATI, "glVertexStream1fvATI" }, - { &__blue_glCore_glIsProgramPipeline, "glIsProgramPipeline" }, - { &__blue_glCore_glGetObjectBufferfvATI, "glGetObjectBufferfvATI" }, - { &__blue_glCore_glBeginVertexShaderEXT, "glBeginVertexShaderEXT" }, - { &__blue_glCore_glVertexAttrib4svARB, "glVertexAttrib4svARB" }, - { &__blue_glCore_glWindowPos2d, "glWindowPos2d" }, - { &__blue_glCore_glWriteMaskEXT, "glWriteMaskEXT" }, - { &__blue_glCore_glDrawRangeElements, "glDrawRangeElements" }, - { &__blue_glCore_glGetFragDataIndex, "glGetFragDataIndex" }, - { &__blue_glCore_glDeleteTransformFeedbacksNV, "glDeleteTransformFeedbacksNV" }, - { &__blue_glCore_glProgramUniformMatrix2fvEXT, "glProgramUniformMatrix2fvEXT" }, - { &__blue_glCore_glProgramUniform3ui, "glProgramUniform3ui" }, - { &__blue_glCore_glGetTransformFeedbacki_v, "glGetTransformFeedbacki_v" }, - { &__blue_glCore_glUniformMatrix3x2dv, "glUniformMatrix3x2dv" }, - { &__blue_glCore_glGetMapxvOES, "glGetMapxvOES" }, - { &__blue_glCore_glMemoryBarrierByRegion, "glMemoryBarrierByRegion" }, - { &__blue_glCore_glNamedFramebufferDrawBuffer, "glNamedFramebufferDrawBuffer" }, - { &__blue_glCore_glIsBufferResidentNV, "glIsBufferResidentNV" }, - { &__blue_glCore_glStencilOpSeparate, "glStencilOpSeparate" }, - { &__blue_glCore_glInvalidateNamedFramebufferSubData, "glInvalidateNamedFramebufferSubData" }, - { &__blue_glCore_glColor3hNV, "glColor3hNV" }, - { &__blue_glCore_glTextureMaterialEXT, "glTextureMaterialEXT" }, - { &__blue_glCore_glCompressedTextureSubImage2D, "glCompressedTextureSubImage2D" }, - { &__blue_glCore_glMultiTexGeniEXT, "glMultiTexGeniEXT" }, - { &__blue_glCore_glSecondaryColor3usvEXT, "glSecondaryColor3usvEXT" }, - { &__blue_glCore_glGetProgramResourceName, "glGetProgramResourceName" }, - { &__blue_glCore_glTextureStorageSparseAMD, "glTextureStorageSparseAMD" }, - { &__blue_glCore_glPixelStorei, "glPixelStorei" }, - { &__blue_glCore_glGetBooleani_v, "glGetBooleani_v" }, - { &__blue_glCore_glGetPathCoordsNV, "glGetPathCoordsNV" }, - { &__blue_glCore_glVertexAttrib3svNV, "glVertexAttrib3svNV" }, - { &__blue_glCore_glUniformui64NV, "glUniformui64NV" }, - { &__blue_glCore_glIsImageHandleResidentNV, "glIsImageHandleResidentNV" }, - { &__blue_glCore_glBeginConditionalRenderNV, "glBeginConditionalRenderNV" }, - { &__blue_glCore_glNamedFramebufferParameteriEXT, "glNamedFramebufferParameteriEXT" }, - { &__blue_glCore_glIsVertexArrayAPPLE, "glIsVertexArrayAPPLE" }, - { &__blue_glCore_glPointParameterfvEXT, "glPointParameterfvEXT" }, - { &__blue_glCore_glGetnMapfvARB, "glGetnMapfvARB" }, - { &__blue_glCore_glCopyColorSubTable, "glCopyColorSubTable" }, - { &__blue_glCore_glVariantbvEXT, "glVariantbvEXT" }, - { &__blue_glCore_glTextureParameterIuiv, "glTextureParameterIuiv" }, - { &__blue_glCore_glPNTrianglesiATI, "glPNTrianglesiATI" }, - { &__blue_glCore_glBlendFunc, "glBlendFunc" }, - { &__blue_glCore_glVertexAttrib4uiv, "glVertexAttrib4uiv" }, - { &__blue_glCore_glUniform2ui, "glUniform2ui" }, - { &__blue_glCore_glBlendColor, "glBlendColor" }, - { &__blue_glCore_glViewport, "glViewport" }, - { &__blue_glCore_glWindowPos2fvARB, "glWindowPos2fvARB" }, - { &__blue_glCore_glSampleCoverage, "glSampleCoverage" }, - { &__blue_glCore_glSecondaryColor3ubv, "glSecondaryColor3ubv" }, - { &__blue_glCore_glColor4xOES, "glColor4xOES" }, - { &__blue_glCore_glVertexAttribL1dEXT, "glVertexAttribL1dEXT" }, - { &__blue_glCore_glMultTransposeMatrixf, "glMultTransposeMatrixf" }, - { &__blue_glCore_glGetVertexArrayIntegeri_vEXT, "glGetVertexArrayIntegeri_vEXT" }, - { &__blue_glCore_glCullParameterfvEXT, "glCullParameterfvEXT" }, - { &__blue_glCore_glMapNamedBufferRangeEXT, "glMapNamedBufferRangeEXT" }, - { &__blue_glCore_glTextureImage3DEXT, "glTextureImage3DEXT" }, - { &__blue_glCore_glBufferAddressRangeNV, "glBufferAddressRangeNV" }, - { &__blue_glCore_glGetVertexAttribdv, "glGetVertexAttribdv" }, - { &__blue_glCore_glNamedFramebufferSampleLocationsfvARB, "glNamedFramebufferSampleLocationsfvARB" }, - { &__blue_glCore_glMultiTexCoord2i, "glMultiTexCoord2i" }, - { &__blue_glCore_glBindFramebufferEXT, "glBindFramebufferEXT" }, - { &__blue_glCore_glTexParameterfv, "glTexParameterfv" }, - { &__blue_glCore_glGetProgramNamedParameterfvNV, "glGetProgramNamedParameterfvNV" }, - { &__blue_glCore_glTextureStorage3DEXT, "glTextureStorage3DEXT" }, - { &__blue_glCore_glGetDebugMessageLogAMD, "glGetDebugMessageLogAMD" }, - { &__blue_glCore_glTexCoord1hvNV, "glTexCoord1hvNV" }, - { &__blue_glCore_glRenderbufferStorageMultisampleCoverageNV, "glRenderbufferStorageMultisampleCoverageNV" }, - { &__blue_glCore_glProgramUniform3i64vARB, "glProgramUniform3i64vARB" }, - { &__blue_glCore_glFragmentMaterialfvSGIX, "glFragmentMaterialfvSGIX" }, - { &__blue_glCore_glGetImageHandleARB, "glGetImageHandleARB" }, - { &__blue_glCore_glVertexAttribs3fvNV, "glVertexAttribs3fvNV" }, - { &__blue_glCore_glTexSubImage4DSGIS, "glTexSubImage4DSGIS" }, - { &__blue_glCore_glListParameteriSGIX, "glListParameteriSGIX" }, - { &__blue_glCore_glPixelTransformParameterfEXT, "glPixelTransformParameterfEXT" }, - { &__blue_glCore_glMapParameterfvNV, "glMapParameterfvNV" }, - { &__blue_glCore_glProgramUniform3dv, "glProgramUniform3dv" }, - { &__blue_glCore_glUniformMatrix3fv, "glUniformMatrix3fv" }, - { &__blue_glCore_glProgramUniform4fEXT, "glProgramUniform4fEXT" }, - { &__blue_glCore_glMultiTexCoord2hNV, "glMultiTexCoord2hNV" }, - { &__blue_glCore_glVertexAttribI4uiv, "glVertexAttribI4uiv" }, - { &__blue_glCore_glSecondaryColor3b, "glSecondaryColor3b" }, - { &__blue_glCore_glFogxvOES, "glFogxvOES" }, - { &__blue_glCore_glGlobalAlphaFactorubSUN, "glGlobalAlphaFactorubSUN" }, - { &__blue_glCore_glVertexAttribI4svEXT, "glVertexAttribI4svEXT" }, - { &__blue_glCore_glSecondaryColor3sv, "glSecondaryColor3sv" }, - { &__blue_glCore_glProgramUniformMatrix2x3dvEXT, "glProgramUniformMatrix2x3dvEXT" }, - { &__blue_glCore_glTextureBarrier, "glTextureBarrier" }, - { &__blue_glCore_glCreateSamplers, "glCreateSamplers" }, - { &__blue_glCore_glVertexAttribP2ui, "glVertexAttribP2ui" }, - { &__blue_glCore_glGetTexParameterIiv, "glGetTexParameterIiv" }, - { &__blue_glCore_glConvolutionParameterfvEXT, "glConvolutionParameterfvEXT" }, - { &__blue_glCore_glPathGlyphIndexArrayNV, "glPathGlyphIndexArrayNV" }, - { &__blue_glCore_glCopyTexSubImage2D, "glCopyTexSubImage2D" }, - { &__blue_glCore_glVertexArrayParameteriAPPLE, "glVertexArrayParameteriAPPLE" }, - { &__blue_glCore_glGetnConvolutionFilterARB, "glGetnConvolutionFilterARB" }, - { &__blue_glCore_glVariantfvEXT, "glVariantfvEXT" }, - { &__blue_glCore_glGetMultisamplefvNV, "glGetMultisamplefvNV" }, - { &__blue_glCore_glQueryObjectParameteruiAMD, "glQueryObjectParameteruiAMD" }, - { &__blue_glCore_glMatrixIndexPointerARB, "glMatrixIndexPointerARB" }, - { &__blue_glCore_glGetQueryObjectuivARB, "glGetQueryObjectuivARB" }, - { &__blue_glCore_glColorFormatNV, "glColorFormatNV" }, - { &__blue_glCore_glMultiTexGenfvEXT, "glMultiTexGenfvEXT" }, - { &__blue_glCore_glGetUniformfvARB, "glGetUniformfvARB" }, - { &__blue_glCore_glTexCoord3hNV, "glTexCoord3hNV" }, - { &__blue_glCore_glPathGlyphRangeNV, "glPathGlyphRangeNV" }, - { &__blue_glCore_glCopyTextureSubImage3DEXT, "glCopyTextureSubImage3DEXT" }, - { &__blue_glCore_glColor3xOES, "glColor3xOES" }, - { &__blue_glCore_glVertexAttrib4hNV, "glVertexAttrib4hNV" }, - { &__blue_glCore_glProgramUniformui64NV, "glProgramUniformui64NV" }, - { &__blue_glCore_glVertexArrayVertexAttribLFormatEXT, "glVertexArrayVertexAttribLFormatEXT" }, - { &__blue_glCore_glGetMinmaxParameterivEXT, "glGetMinmaxParameterivEXT" }, - { &__blue_glCore_glWindowPos3iMESA, "glWindowPos3iMESA" }, - { &__blue_glCore_glVertexAttribLFormat, "glVertexAttribLFormat" }, - { &__blue_glCore_glGetObjectParameterfvARB, "glGetObjectParameterfvARB" }, - { &__blue_glCore_glStencilFillPathNV, "glStencilFillPathNV" }, - { &__blue_glCore_glEvalCoord1xvOES, "glEvalCoord1xvOES" }, - { &__blue_glCore_glUniform4d, "glUniform4d" }, - { &__blue_glCore_glGetTextureHandleNV, "glGetTextureHandleNV" }, - { &__blue_glCore_glGetUniformuivEXT, "glGetUniformuivEXT" }, - { &__blue_glCore_glIsTextureEXT, "glIsTextureEXT" }, - { &__blue_glCore_glProgramUniform2d, "glProgramUniform2d" }, - { &__blue_glCore_glGetnUniformuivARB, "glGetnUniformuivARB" }, - { &__blue_glCore_glIsShader, "glIsShader" }, - { &__blue_glCore_glGetVertexArrayIndexed64iv, "glGetVertexArrayIndexed64iv" }, - { &__blue_glCore_glGetnHistogramARB, "glGetnHistogramARB" }, - { &__blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN, "glTexCoord2fColor4fNormal3fVertex3fvSUN" }, - { &__blue_glCore_glVertexAttribI2ivEXT, "glVertexAttribI2ivEXT" }, - { &__blue_glCore_glTexSubImage2DEXT, "glTexSubImage2DEXT" }, - { &__blue_glCore_glGetFragmentMaterialivSGIX, "glGetFragmentMaterialivSGIX" }, - { &__blue_glCore_glClearNamedFramebufferiv, "glClearNamedFramebufferiv" }, - { &__blue_glCore_glMatrixMult3x3fNV, "glMatrixMult3x3fNV" }, - { &__blue_glCore_glGetQueryBufferObjectiv, "glGetQueryBufferObjectiv" }, - { &__blue_glCore_glVideoCaptureStreamParameterfvNV, "glVideoCaptureStreamParameterfvNV" }, - { &__blue_glCore_glTexImage3DMultisample, "glTexImage3DMultisample" }, - { &__blue_glCore_glVertexArraySecondaryColorOffsetEXT, "glVertexArraySecondaryColorOffsetEXT" }, - { &__blue_glCore_glVariantusvEXT, "glVariantusvEXT" }, - { &__blue_glCore_glDrawArraysInstanced, "glDrawArraysInstanced" }, - { &__blue_glCore_glProgramUniformMatrix2x4dvEXT, "glProgramUniformMatrix2x4dvEXT" }, - { &__blue_glCore_glProgramBufferParametersIivNV, "glProgramBufferParametersIivNV" }, - { &__blue_glCore_glViewportArrayv, "glViewportArrayv" }, - { &__blue_glCore_glTangent3svEXT, "glTangent3svEXT" }, - { &__blue_glCore_glReplacementCodeuiVertex3fSUN, "glReplacementCodeuiVertex3fSUN" }, - { &__blue_glCore_glSharpenTexFuncSGIS, "glSharpenTexFuncSGIS" }, - { &__blue_glCore_glNormalFormatNV, "glNormalFormatNV" }, - { &__blue_glCore_glVertexAttribL3dv, "glVertexAttribL3dv" }, - { &__blue_glCore_glNamedStringARB, "glNamedStringARB" }, - { &__blue_glCore_glVertexArrayVertexAttribFormatEXT, "glVertexArrayVertexAttribFormatEXT" }, - { &__blue_glCore_glMultiTexCoordP3ui, "glMultiTexCoordP3ui" }, - { &__blue_glCore_glMultiTexSubImage3DEXT, "glMultiTexSubImage3DEXT" }, - { &__blue_glCore_glUniform2fvARB, "glUniform2fvARB" }, - { &__blue_glCore_glGetPixelMapxv, "glGetPixelMapxv" }, - { &__blue_glCore_glTangent3ivEXT, "glTangent3ivEXT" }, - { &__blue_glCore_glGetLocalConstantIntegervEXT, "glGetLocalConstantIntegervEXT" }, - { &__blue_glCore_glPresentFrameDualFillNV, "glPresentFrameDualFillNV" }, - { &__blue_glCore_glEndVertexShaderEXT, "glEndVertexShaderEXT" }, - { &__blue_glCore_glVertexArrayVertexBuffer, "glVertexArrayVertexBuffer" }, - { &__blue_glCore_glMakeTextureHandleNonResidentNV, "glMakeTextureHandleNonResidentNV" }, - { &__blue_glCore_glVertexAttribI3uiEXT, "glVertexAttribI3uiEXT" }, - { &__blue_glCore_glBinormal3bvEXT, "glBinormal3bvEXT" }, - { &__blue_glCore_glPixelTexGenParameterfSGIS, "glPixelTexGenParameterfSGIS" }, - { &__blue_glCore_glMultiTexGenivEXT, "glMultiTexGenivEXT" }, - { &__blue_glCore_glGetVideoivNV, "glGetVideoivNV" }, - { &__blue_glCore_glMultiTexCoordP2ui, "glMultiTexCoordP2ui" }, - { &__blue_glCore_glDeletePerfQueryINTEL, "glDeletePerfQueryINTEL" }, - { &__blue_glCore_glDepthBoundsdNV, "glDepthBoundsdNV" }, - { &__blue_glCore_glPixelTransferxOES, "glPixelTransferxOES" }, - { &__blue_glCore_glCombinerOutputNV, "glCombinerOutputNV" }, - { &__blue_glCore_glCopyTextureSubImage1D, "glCopyTextureSubImage1D" }, - { &__blue_glCore_glVertexAttribI4iv, "glVertexAttribI4iv" }, - { &__blue_glCore_glCopyTexImage2DEXT, "glCopyTexImage2DEXT" }, - { &__blue_glCore_glBindLightParameterEXT, "glBindLightParameterEXT" }, - { &__blue_glCore_glMultiDrawElementsBaseVertex, "glMultiDrawElementsBaseVertex" }, - { &__blue_glCore_glProgramUniform2uivEXT, "glProgramUniform2uivEXT" }, - { &__blue_glCore_glDeletePerfMonitorsAMD, "glDeletePerfMonitorsAMD" }, - { &__blue_glCore_glCopyImageSubData, "glCopyImageSubData" }, - { &__blue_glCore_glPathCoverDepthFuncNV, "glPathCoverDepthFuncNV" }, - { &__blue_glCore_glGetFramebufferAttachmentParameteriv, "glGetFramebufferAttachmentParameteriv" }, - { &__blue_glCore_glRectxOES, "glRectxOES" }, - { &__blue_glCore_glTagSampleBufferSGIX, "glTagSampleBufferSGIX" }, - { &__blue_glCore_glVertexStream3svATI, "glVertexStream3svATI" }, - { &__blue_glCore_glGetPathTexGenfvNV, "glGetPathTexGenfvNV" }, - { &__blue_glCore_glOrthofOES, "glOrthofOES" }, - { &__blue_glCore_glCopyTexImage2D, "glCopyTexImage2D" }, - { &__blue_glCore_glTexCoord2fColor4ubVertex3fSUN, "glTexCoord2fColor4ubVertex3fSUN" }, - { &__blue_glCore_glMultTransposeMatrixdARB, "glMultTransposeMatrixdARB" }, - { &__blue_glCore_glProgramUniform3i, "glProgramUniform3i" }, - { &__blue_glCore_glArrayObjectATI, "glArrayObjectATI" }, - { &__blue_glCore_glMatrixRotatedEXT, "glMatrixRotatedEXT" }, - { &__blue_glCore_glTexCoordP2ui, "glTexCoordP2ui" }, - { &__blue_glCore_glPassTexCoordATI, "glPassTexCoordATI" }, - { &__blue_glCore_glIsTexture, "glIsTexture" }, - { &__blue_glCore_glCompressedTexSubImage3DARB, "glCompressedTexSubImage3DARB" }, - { &__blue_glCore_glDepthRangexOES, "glDepthRangexOES" }, - { &__blue_glCore_glImageTransformParameterivHP, "glImageTransformParameterivHP" }, - { &__blue_glCore_glMultTransposeMatrixfARB, "glMultTransposeMatrixfARB" }, - { &__blue_glCore_glUniformHandleui64vARB, "glUniformHandleui64vARB" }, - { &__blue_glCore_glGenTransformFeedbacks, "glGenTransformFeedbacks" }, - { &__blue_glCore_glTextureStorage1D, "glTextureStorage1D" }, - { &__blue_glCore_glGetVertexAttribivNV, "glGetVertexAttribivNV" }, - { &__blue_glCore_glReplacementCodePointerSUN, "glReplacementCodePointerSUN" }, - { &__blue_glCore_glVertexAttribI3uiv, "glVertexAttribI3uiv" }, - { &__blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN, "glReplacementCodeuiNormal3fVertex3fSUN" }, - { &__blue_glCore_glVertexAttribL2dEXT, "glVertexAttribL2dEXT" }, - { &__blue_glCore_glProgramUniform3ui64NV, "glProgramUniform3ui64NV" }, - { &__blue_glCore_glProgramUniform3i64NV, "glProgramUniform3i64NV" }, - { &__blue_glCore_glGetNamedRenderbufferParameterivEXT, "glGetNamedRenderbufferParameterivEXT" }, - { &__blue_glCore_glTangent3bvEXT, "glTangent3bvEXT" }, - { &__blue_glCore_glProgramUniform1dvEXT, "glProgramUniform1dvEXT" }, - { &__blue_glCore_glMatrixLoadTransposedEXT, "glMatrixLoadTransposedEXT" }, - { &__blue_glCore_glGetVertexAttribLdv, "glGetVertexAttribLdv" }, - { &__blue_glCore_glVertexStream2dATI, "glVertexStream2dATI" }, - { &__blue_glCore_glGetFragmentLightivSGIX, "glGetFragmentLightivSGIX" }, - { &__blue_glCore_glGetMinmaxEXT, "glGetMinmaxEXT" }, - { &__blue_glCore_glFlushStaticDataIBM, "glFlushStaticDataIBM" }, - { &__blue_glCore_glShaderOp1EXT, "glShaderOp1EXT" }, - { &__blue_glCore_glIsStateNV, "glIsStateNV" }, - { &__blue_glCore_glGetProgramEnvParameterIuivNV, "glGetProgramEnvParameterIuivNV" }, - { &__blue_glCore_glGetVideoCaptureivNV, "glGetVideoCaptureivNV" }, - { &__blue_glCore_glPathStringNV, "glPathStringNV" }, - { &__blue_glCore_glListParameterfSGIX, "glListParameterfSGIX" }, - { &__blue_glCore_glFeedbackBufferxOES, "glFeedbackBufferxOES" }, - { &__blue_glCore_glGetNextPerfQueryIdINTEL, "glGetNextPerfQueryIdINTEL" }, - { &__blue_glCore_glGetVariantArrayObjectfvATI, "glGetVariantArrayObjectfvATI" }, - { &__blue_glCore_glUniform3d, "glUniform3d" }, - { &__blue_glCore_glMultiTexParameterfvEXT, "glMultiTexParameterfvEXT" }, - { &__blue_glCore_glGetLocalConstantFloatvEXT, "glGetLocalConstantFloatvEXT" }, - { &__blue_glCore_glMultiTexImage3DEXT, "glMultiTexImage3DEXT" }, - { &__blue_glCore_glWindowPos3fMESA, "glWindowPos3fMESA" }, - { &__blue_glCore_glCullParameterdvEXT, "glCullParameterdvEXT" }, - { &__blue_glCore_glGetTrackMatrixivNV, "glGetTrackMatrixivNV" }, - { &__blue_glCore_glBlendFuncSeparateINGR, "glBlendFuncSeparateINGR" }, - { &__blue_glCore_glUniformMatrix2fvARB, "glUniformMatrix2fvARB" }, - { &__blue_glCore_glDrawArraysInstancedEXT, "glDrawArraysInstancedEXT" }, - { &__blue_glCore_glMultiTexCoord3iARB, "glMultiTexCoord3iARB" }, - { &__blue_glCore_glGetNamedFramebufferParameterivEXT, "glGetNamedFramebufferParameterivEXT" }, - { &__blue_glCore_glGenTextures, "glGenTextures" }, - { &__blue_glCore_glIsPointInStrokePathNV, "glIsPointInStrokePathNV" }, - { &__blue_glCore_glDrawTransformFeedbackNV, "glDrawTransformFeedbackNV" }, - { &__blue_glCore_glGetActiveUniformARB, "glGetActiveUniformARB" }, - { &__blue_glCore_glClearNamedFramebufferfv, "glClearNamedFramebufferfv" }, - { &__blue_glCore_glBeginVideoCaptureNV, "glBeginVideoCaptureNV" }, - { &__blue_glCore_glCopyTexImage1D, "glCopyTexImage1D" }, - { &__blue_glCore_glTexStorage1D, "glTexStorage1D" }, - { &__blue_glCore_glProgramUniform3ui64ARB, "glProgramUniform3ui64ARB" }, - { &__blue_glCore_glTextureSubImage2D, "glTextureSubImage2D" }, - { &__blue_glCore_glMultiTexCoord4bOES, "glMultiTexCoord4bOES" }, - { &__blue_glCore_glMultiDrawArraysIndirectCountARB, "glMultiDrawArraysIndirectCountARB" }, - { &__blue_glCore_glProgramUniformMatrix3dvEXT, "glProgramUniformMatrix3dvEXT" }, - { &__blue_glCore_glVertexAttrib2s, "glVertexAttrib2s" }, - { &__blue_glCore_glGetDoublev, "glGetDoublev" }, - { &__blue_glCore_glVertexAttrib3svARB, "glVertexAttrib3svARB" }, - { &__blue_glCore_glProgramNamedParameter4dvNV, "glProgramNamedParameter4dvNV" }, - { &__blue_glCore_glTextureBufferRange, "glTextureBufferRange" }, - { &__blue_glCore_glFramebufferTextureFaceEXT, "glFramebufferTextureFaceEXT" }, - { &__blue_glCore_glBindBufferRange, "glBindBufferRange" }, - { &__blue_glCore_glEnablei, "glEnablei" }, - { &__blue_glCore_glGetTextureParameterIuivEXT, "glGetTextureParameterIuivEXT" }, - { &__blue_glCore_glGetProgramInterfaceiv, "glGetProgramInterfaceiv" }, - { &__blue_glCore_glClientAttribDefaultEXT, "glClientAttribDefaultEXT" }, - { &__blue_glCore_glVertexAttribL3ui64NV, "glVertexAttribL3ui64NV" }, - { &__blue_glCore_glWindowPos2dARB, "glWindowPos2dARB" }, - { &__blue_glCore_glVertexAttribI2uiEXT, "glVertexAttribI2uiEXT" }, - { &__blue_glCore_glBindVertexBuffers, "glBindVertexBuffers" }, - { &__blue_glCore_glProgramUniformMatrix3x4fv, "glProgramUniformMatrix3x4fv" }, - { &__blue_glCore_glGetTexLevelParameterxvOES, "glGetTexLevelParameterxvOES" }, - { &__blue_glCore_glVertexAttribPointer, "glVertexAttribPointer" }, - { &__blue_glCore_glTextureImage1DEXT, "glTextureImage1DEXT" }, - { &__blue_glCore_glVertexAttribs4dvNV, "glVertexAttribs4dvNV" }, - { &__blue_glCore_glSecondaryColor3svEXT, "glSecondaryColor3svEXT" }, - { &__blue_glCore_glGetQueryivARB, "glGetQueryivARB" }, - { &__blue_glCore_glTexCoord4bOES, "glTexCoord4bOES" }, - { &__blue_glCore_glProgramUniform1fEXT, "glProgramUniform1fEXT" }, - { &__blue_glCore_glVertexP2ui, "glVertexP2ui" }, - { &__blue_glCore_glSetInvariantEXT, "glSetInvariantEXT" }, - { &__blue_glCore_glActiveShaderProgram, "glActiveShaderProgram" }, - { &__blue_glCore_glVertexAttribL1ui64NV, "glVertexAttribL1ui64NV" }, - { &__blue_glCore_glGetVariantBooleanvEXT, "glGetVariantBooleanvEXT" }, - { &__blue_glCore_glAreTexturesResidentEXT, "glAreTexturesResidentEXT" }, - { &__blue_glCore_glMatrixMultTranspose3x3fNV, "glMatrixMultTranspose3x3fNV" }, - { &__blue_glCore_glProgramUniform2f, "glProgramUniform2f" }, - { &__blue_glCore_glClearNamedBufferDataEXT, "glClearNamedBufferDataEXT" }, - { &__blue_glCore_glIsOcclusionQueryNV, "glIsOcclusionQueryNV" }, - { &__blue_glCore_glVertexAttribI4bv, "glVertexAttribI4bv" }, - { &__blue_glCore_glTexCoord2xvOES, "glTexCoord2xvOES" }, - { &__blue_glCore_glVertexAttrib4Nubv, "glVertexAttrib4Nubv" }, - { &__blue_glCore_glVertexAttrib3hNV, "glVertexAttrib3hNV" }, - { &__blue_glCore_glMultiTexCoord2xvOES, "glMultiTexCoord2xvOES" }, - { &__blue_glCore_glFramebufferTextureEXT, "glFramebufferTextureEXT" }, - { &__blue_glCore_glProgramUniformMatrix3fv, "glProgramUniformMatrix3fv" }, - { &__blue_glCore_glGetInternalformatSampleivNV, "glGetInternalformatSampleivNV" }, - { &__blue_glCore_glPathSubCommandsNV, "glPathSubCommandsNV" }, - { &__blue_glCore_glStencilStrokePathNV, "glStencilStrokePathNV" }, - { &__blue_glCore_glPathParameterfNV, "glPathParameterfNV" }, - { &__blue_glCore_glActiveProgramEXT, "glActiveProgramEXT" }, - { &__blue_glCore_glClampColorARB, "glClampColorARB" }, - { &__blue_glCore_glVertexAttribI2uivEXT, "glVertexAttribI2uivEXT" }, - { &__blue_glCore_glVertexAttribL1ui64vARB, "glVertexAttribL1ui64vARB" }, - { &__blue_glCore_glValidateProgram, "glValidateProgram" }, - { &__blue_glCore_glMultiTexCoord2xOES, "glMultiTexCoord2xOES" }, - { &__blue_glCore_glFogCoordf, "glFogCoordf" }, - { &__blue_glCore_glGetError, "glGetError" }, - { &__blue_glCore_glSpriteParameterfSGIX, "glSpriteParameterfSGIX" }, - { &__blue_glCore_glVertexAttrib3dvNV, "glVertexAttrib3dvNV" }, - { &__blue_glCore_glMultiTexCoord3bOES, "glMultiTexCoord3bOES" }, - { &__blue_glCore_glGetTexParameterIuivEXT, "glGetTexParameterIuivEXT" }, - { &__blue_glCore_glIndexMaterialEXT, "glIndexMaterialEXT" }, - { &__blue_glCore_glUniform1iARB, "glUniform1iARB" }, - { &__blue_glCore_glVertexAttrib4NivARB, "glVertexAttrib4NivARB" }, - { &__blue_glCore_glTextureParameteri, "glTextureParameteri" }, - { &__blue_glCore_glSecondaryColor3d, "glSecondaryColor3d" }, - { &__blue_glCore_glWindowPos2sv, "glWindowPos2sv" }, - { &__blue_glCore_glDrawBuffersARB, "glDrawBuffersARB" }, - { &__blue_glCore_glGetMultiTexParameterIuivEXT, "glGetMultiTexParameterIuivEXT" }, - { &__blue_glCore_glGetConvolutionFilter, "glGetConvolutionFilter" }, - { &__blue_glCore_glDisableVertexArrayAttrib, "glDisableVertexArrayAttrib" }, - { &__blue_glCore_glProgramUniform4i, "glProgramUniform4i" }, - { &__blue_glCore_glCheckNamedFramebufferStatusEXT, "glCheckNamedFramebufferStatusEXT" }, - { &__blue_glCore_glMultiTexCoord3xOES, "glMultiTexCoord3xOES" }, - { &__blue_glCore_glDrawElementsInstancedEXT, "glDrawElementsInstancedEXT" }, - { &__blue_glCore_glColor4fNormal3fVertex3fvSUN, "glColor4fNormal3fVertex3fvSUN" }, - { &__blue_glCore_glIsTransformFeedbackNV, "glIsTransformFeedbackNV" }, - { &__blue_glCore_glDrawTransformFeedbackStreamInstanced, "glDrawTransformFeedbackStreamInstanced" }, - { &__blue_glCore_glMapNamedBufferEXT, "glMapNamedBufferEXT" }, - { &__blue_glCore_glVertexArrayIndexOffsetEXT, "glVertexArrayIndexOffsetEXT" }, - { &__blue_glCore_glPolygonMode, "glPolygonMode" }, - { &__blue_glCore_glGetDetailTexFuncSGIS, "glGetDetailTexFuncSGIS" }, - { &__blue_glCore_glMultiTexCoord2iv, "glMultiTexCoord2iv" }, - { &__blue_glCore_glGetHistogramParameterfvEXT, "glGetHistogramParameterfvEXT" }, - { &__blue_glCore_glProgramUniform4fvEXT, "glProgramUniform4fvEXT" }, - { &__blue_glCore_glDetailTexFuncSGIS, "glDetailTexFuncSGIS" }, - { &__blue_glCore_glTexParameterIivEXT, "glTexParameterIivEXT" }, - { &__blue_glCore_glNamedFramebufferTextureLayerEXT, "glNamedFramebufferTextureLayerEXT" }, - { &__blue_glCore_glDisablei, "glDisablei" }, - { &__blue_glCore_glUniform4fv, "glUniform4fv" }, - { &__blue_glCore_glVertexAttrib1hNV, "glVertexAttrib1hNV" }, - { &__blue_glCore_glWeightsvARB, "glWeightsvARB" }, - { &__blue_glCore_glSampleMaskIndexedNV, "glSampleMaskIndexedNV" }, - { &__blue_glCore_glVertexAttrib4dvARB, "glVertexAttrib4dvARB" }, - { &__blue_glCore_glBeginFragmentShaderATI, "glBeginFragmentShaderATI" }, - { &__blue_glCore_glNamedProgramLocalParameterI4ivEXT, "glNamedProgramLocalParameterI4ivEXT" }, - { &__blue_glCore_glGetConvolutionParameteriv, "glGetConvolutionParameteriv" }, - { &__blue_glCore_glClipControl, "glClipControl" }, - { &__blue_glCore_glBinormal3fEXT, "glBinormal3fEXT" }, - { &__blue_glCore_glColor4ubVertex2fSUN, "glColor4ubVertex2fSUN" }, - { &__blue_glCore_glCompressedTexImage3D, "glCompressedTexImage3D" }, - { &__blue_glCore_glGetTextureSamplerHandleARB, "glGetTextureSamplerHandleARB" }, - { &__blue_glCore_glUniform3uiv, "glUniform3uiv" }, - { &__blue_glCore_glGetVertexAttribPointerv, "glGetVertexAttribPointerv" }, - { &__blue_glCore_glGenBuffers, "glGenBuffers" }, - { &__blue_glCore_glVertexAttrib3dvARB, "glVertexAttrib3dvARB" }, - { &__blue_glCore_glFlushVertexArrayRangeNV, "glFlushVertexArrayRangeNV" }, - { &__blue_glCore_glGetProgramNamedParameterdvNV, "glGetProgramNamedParameterdvNV" }, - { &__blue_glCore_glConvolutionParameterf, "glConvolutionParameterf" }, - { &__blue_glCore_glVertex2bOES, "glVertex2bOES" }, - { &__blue_glCore_glGetObjectPtrLabel, "glGetObjectPtrLabel" }, - { &__blue_glCore_glBeginTransformFeedbackNV, "glBeginTransformFeedbackNV" }, - { &__blue_glCore_glGetTextureSubImage, "glGetTextureSubImage" }, - { &__blue_glCore_glGetFramebufferAttachmentParameterivEXT, "glGetFramebufferAttachmentParameterivEXT" }, - { &__blue_glCore_glGetInteger64v, "glGetInteger64v" }, - { &__blue_glCore_glGetUniformLocation, "glGetUniformLocation" }, - { &__blue_glCore_glMultiTexCoord2fv, "glMultiTexCoord2fv" }, - { &__blue_glCore_glProgramUniform2uiv, "glProgramUniform2uiv" }, - { &__blue_glCore_glGetTexParameterIuiv, "glGetTexParameterIuiv" }, - { &__blue_glCore_glVertexAttribI4ui, "glVertexAttribI4ui" }, - { &__blue_glCore_glTexGenxvOES, "glTexGenxvOES" }, - { &__blue_glCore_glVertex4bOES, "glVertex4bOES" }, - { &__blue_glCore_glCopyTexSubImage2DEXT, "glCopyTexSubImage2DEXT" }, - { &__blue_glCore_glDrawBuffersATI, "glDrawBuffersATI" }, - { &__blue_glCore_glPathGlyphsNV, "glPathGlyphsNV" }, - { &__blue_glCore_glMatrixIndexuivARB, "glMatrixIndexuivARB" }, - { &__blue_glCore_glNamedProgramLocalParameterI4uiEXT, "glNamedProgramLocalParameterI4uiEXT" }, - { &__blue_glCore_glWindowPos2iv, "glWindowPos2iv" }, - { &__blue_glCore_glLightModelxOES, "glLightModelxOES" }, - { &__blue_glCore_glBindFragmentShaderATI, "glBindFragmentShaderATI" }, - { &__blue_glCore_glInvalidateTexSubImage, "glInvalidateTexSubImage" }, - { &__blue_glCore_glVertexAttrib4sARB, "glVertexAttrib4sARB" }, - { &__blue_glCore_glGetProgramiv, "glGetProgramiv" }, - { &__blue_glCore_glGetVideoCaptureStreamivNV, "glGetVideoCaptureStreamivNV" }, - { &__blue_glCore_glTextureParameterfvEXT, "glTextureParameterfvEXT" }, - { &__blue_glCore_glPNTrianglesfATI, "glPNTrianglesfATI" }, - { &__blue_glCore_glCheckNamedFramebufferStatus, "glCheckNamedFramebufferStatus" }, - { &__blue_glCore_glUniform4uiEXT, "glUniform4uiEXT" }, - { &__blue_glCore_glVertexAttrib2sv, "glVertexAttrib2sv" }, - { &__blue_glCore_glClearBufferData, "glClearBufferData" }, - { &__blue_glCore_glShaderSourceARB, "glShaderSourceARB" }, - { &__blue_glCore_glObjectPurgeableAPPLE, "glObjectPurgeableAPPLE" }, - { &__blue_glCore_glProgramUniform2iEXT, "glProgramUniform2iEXT" }, - { &__blue_glCore_glGetStringi, "glGetStringi" }, - { &__blue_glCore_glTexFilterFuncSGIS, "glTexFilterFuncSGIS" }, - { &__blue_glCore_glVertexArrayVertexAttribLOffsetEXT, "glVertexArrayVertexAttribLOffsetEXT" }, - { &__blue_glCore_glProgramLocalParametersI4uivNV, "glProgramLocalParametersI4uivNV" }, - { &__blue_glCore_glGetHistogramEXT, "glGetHistogramEXT" }, - { &__blue_glCore_glNamedBufferPageCommitmentARB, "glNamedBufferPageCommitmentARB" }, - { &__blue_glCore_glMakeBufferResidentNV, "glMakeBufferResidentNV" }, - { &__blue_glCore_glNamedFramebufferDrawBuffers, "glNamedFramebufferDrawBuffers" }, - { &__blue_glCore_glVertexPointerListIBM, "glVertexPointerListIBM" }, - { &__blue_glCore_glGetUniformui64vNV, "glGetUniformui64vNV" }, - { &__blue_glCore_glClearDepthfOES, "glClearDepthfOES" }, - { &__blue_glCore_glWindowPos2iMESA, "glWindowPos2iMESA" }, - { &__blue_glCore_glCopyTextureImage1DEXT, "glCopyTextureImage1DEXT" }, - { &__blue_glCore_glBeginOcclusionQueryNV, "glBeginOcclusionQueryNV" }, - { &__blue_glCore_glLoadTransposeMatrixf, "glLoadTransposeMatrixf" }, - { &__blue_glCore_glNamedRenderbufferStorageMultisampleEXT, "glNamedRenderbufferStorageMultisampleEXT" }, - { &__blue_glCore_glNormalStream3fATI, "glNormalStream3fATI" }, - { &__blue_glCore_glNormal3hNV, "glNormal3hNV" }, - { &__blue_glCore_glUseProgram, "glUseProgram" }, - { &__blue_glCore_glPushGroupMarkerEXT, "glPushGroupMarkerEXT" }, - { &__blue_glCore_glMultiTexSubImage2DEXT, "glMultiTexSubImage2DEXT" }, - { &__blue_glCore_glVertexArrayRangeNV, "glVertexArrayRangeNV" }, - { &__blue_glCore_glGetMultiTexLevelParameterivEXT, "glGetMultiTexLevelParameterivEXT" }, - { &__blue_glCore_glMultiDrawArraysEXT, "glMultiDrawArraysEXT" }, - { &__blue_glCore_glVertexAttribL4ui64NV, "glVertexAttribL4ui64NV" }, - { &__blue_glCore_glVertexAttrib4Nub, "glVertexAttrib4Nub" }, - { &__blue_glCore_glFogCoordhNV, "glFogCoordhNV" }, - { &__blue_glCore_glVertexAttribI3ui, "glVertexAttribI3ui" }, - { &__blue_glCore_glTexImage3DMultisampleCoverageNV, "glTexImage3DMultisampleCoverageNV" }, - { &__blue_glCore_glGetUniformBufferSizeEXT, "glGetUniformBufferSizeEXT" }, - { &__blue_glCore_glCompileCommandListNV, "glCompileCommandListNV" }, - { &__blue_glCore_glVertexArrayVertexAttribBindingEXT, "glVertexArrayVertexAttribBindingEXT" }, - { &__blue_glCore_glBlendEquation, "glBlendEquation" }, - { &__blue_glCore_glBinormal3dvEXT, "glBinormal3dvEXT" }, - { &__blue_glCore_glVertexFormatNV, "glVertexFormatNV" }, - { &__blue_glCore_glProgramUniform4fv, "glProgramUniform4fv" }, - { &__blue_glCore_glTextureStorage2DMultisample, "glTextureStorage2DMultisample" }, - { &__blue_glCore_glProgramUniform3uiEXT, "glProgramUniform3uiEXT" }, - { &__blue_glCore_glFramebufferDrawBufferEXT, "glFramebufferDrawBufferEXT" }, - { &__blue_glCore_glCreateTextures, "glCreateTextures" }, - { &__blue_glCore_glMatrixPopEXT, "glMatrixPopEXT" }, - { &__blue_glCore_glProgramUniformui64vNV, "glProgramUniformui64vNV" }, - { &__blue_glCore_glFramebufferTexture2D, "glFramebufferTexture2D" }, - { &__blue_glCore_glGetAttribLocation, "glGetAttribLocation" }, - { &__blue_glCore_glUniform2fARB, "glUniform2fARB" }, - { &__blue_glCore_glDisableVertexArrayAttribEXT, "glDisableVertexArrayAttribEXT" }, - { &__blue_glCore_glTexStorage2D, "glTexStorage2D" }, - { &__blue_glCore_glVertexAttribI1iEXT, "glVertexAttribI1iEXT" }, - { &__blue_glCore_glUniform4ui, "glUniform4ui" }, - { &__blue_glCore_glMultiTexCoordP1uiv, "glMultiTexCoordP1uiv" }, - { &__blue_glCore_glNamedProgramLocalParametersI4ivEXT, "glNamedProgramLocalParametersI4ivEXT" }, - { &__blue_glCore_glImageTransformParameteriHP, "glImageTransformParameteriHP" }, - { &__blue_glCore_glIsBuffer, "glIsBuffer" }, - { &__blue_glCore_glFogCoorddv, "glFogCoorddv" }, - { &__blue_glCore_glClientActiveTexture, "glClientActiveTexture" }, - { &__blue_glCore_glUniformHandleui64vNV, "glUniformHandleui64vNV" }, - { &__blue_glCore_glWindowPos3fARB, "glWindowPos3fARB" }, - { &__blue_glCore_glGetVertexAttribfvARB, "glGetVertexAttribfvARB" }, - { &__blue_glCore_glSamplerParameterfv, "glSamplerParameterfv" }, - { &__blue_glCore_glVertexAttrib4NsvARB, "glVertexAttrib4NsvARB" }, - { &__blue_glCore_glProgramUniform2ivEXT, "glProgramUniform2ivEXT" }, - { &__blue_glCore_glNamedProgramStringEXT, "glNamedProgramStringEXT" }, +void* __blue_glCore_glProgramEnvParameterI4uiNV; +void* __blue_glCore_glProgramEnvParameterI4uivNV; +void* __blue_glCore_glProgramEnvParametersI4uivNV; +void* __blue_glCore_glGetProgramLocalParameterIivNV; +void* __blue_glCore_glGetProgramLocalParameterIuivNV; +void* __blue_glCore_glGetProgramEnvParameterIivNV; +void* __blue_glCore_glGetProgramEnvParameterIuivNV; +void* __blue_glCore_glProgramSubroutineParametersuivNV; +void* __blue_glCore_glGetProgramSubroutineParameteruivNV; +void* __blue_glCore_glVertex2hNV; +void* __blue_glCore_glVertex2hvNV; +void* __blue_glCore_glVertex3hNV; +void* __blue_glCore_glVertex3hvNV; +void* __blue_glCore_glVertex4hNV; +void* __blue_glCore_glVertex4hvNV; +void* __blue_glCore_glNormal3hNV; +void* __blue_glCore_glNormal3hvNV; +void* __blue_glCore_glColor3hNV; +void* __blue_glCore_glColor3hvNV; +void* __blue_glCore_glColor4hNV; +void* __blue_glCore_glColor4hvNV; +void* __blue_glCore_glTexCoord1hNV; +void* __blue_glCore_glTexCoord1hvNV; +void* __blue_glCore_glTexCoord2hNV; +void* __blue_glCore_glTexCoord2hvNV; +void* __blue_glCore_glTexCoord3hNV; +void* __blue_glCore_glTexCoord3hvNV; +void* __blue_glCore_glTexCoord4hNV; +void* __blue_glCore_glTexCoord4hvNV; +void* __blue_glCore_glMultiTexCoord1hNV; +void* __blue_glCore_glMultiTexCoord1hvNV; +void* __blue_glCore_glMultiTexCoord2hNV; +void* __blue_glCore_glMultiTexCoord2hvNV; +void* __blue_glCore_glMultiTexCoord3hNV; +void* __blue_glCore_glMultiTexCoord3hvNV; +void* __blue_glCore_glMultiTexCoord4hNV; +void* __blue_glCore_glMultiTexCoord4hvNV; +void* __blue_glCore_glFogCoordhNV; +void* __blue_glCore_glFogCoordhvNV; +void* __blue_glCore_glSecondaryColor3hNV; +void* __blue_glCore_glSecondaryColor3hvNV; +void* __blue_glCore_glVertexWeighthNV; +void* __blue_glCore_glVertexWeighthvNV; +void* __blue_glCore_glVertexAttrib1hNV; +void* __blue_glCore_glVertexAttrib1hvNV; +void* __blue_glCore_glVertexAttrib2hNV; +void* __blue_glCore_glVertexAttrib2hvNV; +void* __blue_glCore_glVertexAttrib3hNV; +void* __blue_glCore_glVertexAttrib3hvNV; +void* __blue_glCore_glVertexAttrib4hNV; +void* __blue_glCore_glVertexAttrib4hvNV; +void* __blue_glCore_glVertexAttribs1hvNV; +void* __blue_glCore_glVertexAttribs2hvNV; +void* __blue_glCore_glVertexAttribs3hvNV; +void* __blue_glCore_glVertexAttribs4hvNV; +void* __blue_glCore_glGetInternalformatSampleivNV; +void* __blue_glCore_glGenOcclusionQueriesNV; +void* __blue_glCore_glDeleteOcclusionQueriesNV; +void* __blue_glCore_glIsOcclusionQueryNV; +void* __blue_glCore_glBeginOcclusionQueryNV; +void* __blue_glCore_glEndOcclusionQueryNV; +void* __blue_glCore_glGetOcclusionQueryivNV; +void* __blue_glCore_glGetOcclusionQueryuivNV; +void* __blue_glCore_glProgramBufferParametersfvNV; +void* __blue_glCore_glProgramBufferParametersIivNV; +void* __blue_glCore_glProgramBufferParametersIuivNV; +void* __blue_glCore_glGenPathsNV; +void* __blue_glCore_glDeletePathsNV; +void* __blue_glCore_glIsPathNV; +void* __blue_glCore_glPathCommandsNV; +void* __blue_glCore_glPathCoordsNV; +void* __blue_glCore_glPathSubCommandsNV; +void* __blue_glCore_glPathSubCoordsNV; +void* __blue_glCore_glPathStringNV; +void* __blue_glCore_glPathGlyphsNV; +void* __blue_glCore_glPathGlyphRangeNV; +void* __blue_glCore_glWeightPathsNV; +void* __blue_glCore_glCopyPathNV; +void* __blue_glCore_glInterpolatePathsNV; +void* __blue_glCore_glTransformPathNV; +void* __blue_glCore_glPathParameterivNV; +void* __blue_glCore_glPathParameteriNV; +void* __blue_glCore_glPathParameterfvNV; +void* __blue_glCore_glPathParameterfNV; +void* __blue_glCore_glPathDashArrayNV; +void* __blue_glCore_glPathStencilFuncNV; +void* __blue_glCore_glPathStencilDepthOffsetNV; +void* __blue_glCore_glStencilFillPathNV; +void* __blue_glCore_glStencilStrokePathNV; +void* __blue_glCore_glStencilFillPathInstancedNV; +void* __blue_glCore_glStencilStrokePathInstancedNV; +void* __blue_glCore_glPathCoverDepthFuncNV; +void* __blue_glCore_glCoverFillPathNV; +void* __blue_glCore_glCoverStrokePathNV; +void* __blue_glCore_glCoverFillPathInstancedNV; +void* __blue_glCore_glCoverStrokePathInstancedNV; +void* __blue_glCore_glGetPathParameterivNV; +void* __blue_glCore_glGetPathParameterfvNV; +void* __blue_glCore_glGetPathCommandsNV; +void* __blue_glCore_glGetPathCoordsNV; +void* __blue_glCore_glGetPathDashArrayNV; +void* __blue_glCore_glGetPathMetricsNV; +void* __blue_glCore_glGetPathMetricRangeNV; +void* __blue_glCore_glGetPathSpacingNV; +void* __blue_glCore_glIsPointInFillPathNV; +void* __blue_glCore_glIsPointInStrokePathNV; +void* __blue_glCore_glGetPathLengthNV; +void* __blue_glCore_glPointAlongPathNV; +void* __blue_glCore_glMatrixLoad3x2fNV; +void* __blue_glCore_glMatrixLoad3x3fNV; +void* __blue_glCore_glMatrixLoadTranspose3x3fNV; +void* __blue_glCore_glMatrixMult3x2fNV; +void* __blue_glCore_glMatrixMult3x3fNV; +void* __blue_glCore_glMatrixMultTranspose3x3fNV; +void* __blue_glCore_glStencilThenCoverFillPathNV; +void* __blue_glCore_glStencilThenCoverStrokePathNV; +void* __blue_glCore_glStencilThenCoverFillPathInstancedNV; +void* __blue_glCore_glStencilThenCoverStrokePathInstancedNV; +void* __blue_glCore_glPathGlyphIndexRangeNV; +void* __blue_glCore_glPathGlyphIndexArrayNV; +void* __blue_glCore_glPathMemoryGlyphIndexArrayNV; +void* __blue_glCore_glProgramPathFragmentInputGenNV; +void* __blue_glCore_glGetProgramResourcefvNV; +void* __blue_glCore_glPathColorGenNV; +void* __blue_glCore_glPathTexGenNV; +void* __blue_glCore_glPathFogGenNV; +void* __blue_glCore_glGetPathColorGenivNV; +void* __blue_glCore_glGetPathColorGenfvNV; +void* __blue_glCore_glGetPathTexGenivNV; +void* __blue_glCore_glGetPathTexGenfvNV; +void* __blue_glCore_glPixelDataRangeNV; +void* __blue_glCore_glFlushPixelDataRangeNV; +void* __blue_glCore_glPointParameteriNV; +void* __blue_glCore_glPointParameterivNV; +void* __blue_glCore_glPresentFrameKeyedNV; +void* __blue_glCore_glPresentFrameDualFillNV; +void* __blue_glCore_glGetVideoivNV; +void* __blue_glCore_glGetVideouivNV; +void* __blue_glCore_glGetVideoi64vNV; +void* __blue_glCore_glGetVideoui64vNV; +void* __blue_glCore_glPrimitiveRestartNV; +void* __blue_glCore_glPrimitiveRestartIndexNV; +void* __blue_glCore_glCombinerParameterfvNV; +void* __blue_glCore_glCombinerParameterfNV; +void* __blue_glCore_glCombinerParameterivNV; +void* __blue_glCore_glCombinerParameteriNV; +void* __blue_glCore_glCombinerInputNV; +void* __blue_glCore_glCombinerOutputNV; +void* __blue_glCore_glFinalCombinerInputNV; +void* __blue_glCore_glGetCombinerInputParameterfvNV; +void* __blue_glCore_glGetCombinerInputParameterivNV; +void* __blue_glCore_glGetCombinerOutputParameterfvNV; +void* __blue_glCore_glGetCombinerOutputParameterivNV; +void* __blue_glCore_glGetFinalCombinerInputParameterfvNV; +void* __blue_glCore_glGetFinalCombinerInputParameterivNV; +void* __blue_glCore_glCombinerStageParameterfvNV; +void* __blue_glCore_glGetCombinerStageParameterfvNV; +void* __blue_glCore_glFramebufferSampleLocationsfvNV; +void* __blue_glCore_glNamedFramebufferSampleLocationsfvNV; +void* __blue_glCore_glResolveDepthValuesNV; +void* __blue_glCore_glMakeBufferResidentNV; +void* __blue_glCore_glMakeBufferNonResidentNV; +void* __blue_glCore_glIsBufferResidentNV; +void* __blue_glCore_glMakeNamedBufferResidentNV; +void* __blue_glCore_glMakeNamedBufferNonResidentNV; +void* __blue_glCore_glIsNamedBufferResidentNV; +void* __blue_glCore_glGetBufferParameterui64vNV; +void* __blue_glCore_glGetNamedBufferParameterui64vNV; +void* __blue_glCore_glGetIntegerui64vNV; +void* __blue_glCore_glUniformui64NV; +void* __blue_glCore_glUniformui64vNV; +void* __blue_glCore_glProgramUniformui64NV; +void* __blue_glCore_glProgramUniformui64vNV; +void* __blue_glCore_glTextureBarrierNV; +void* __blue_glCore_glTexImage2DMultisampleCoverageNV; +void* __blue_glCore_glTexImage3DMultisampleCoverageNV; +void* __blue_glCore_glTextureImage2DMultisampleNV; +void* __blue_glCore_glTextureImage3DMultisampleNV; +void* __blue_glCore_glTextureImage2DMultisampleCoverageNV; +void* __blue_glCore_glTextureImage3DMultisampleCoverageNV; +void* __blue_glCore_glBeginTransformFeedbackNV; +void* __blue_glCore_glEndTransformFeedbackNV; +void* __blue_glCore_glTransformFeedbackAttribsNV; +void* __blue_glCore_glBindBufferRangeNV; +void* __blue_glCore_glBindBufferOffsetNV; +void* __blue_glCore_glBindBufferBaseNV; +void* __blue_glCore_glTransformFeedbackVaryingsNV; +void* __blue_glCore_glActiveVaryingNV; +void* __blue_glCore_glGetVaryingLocationNV; +void* __blue_glCore_glGetActiveVaryingNV; +void* __blue_glCore_glGetTransformFeedbackVaryingNV; +void* __blue_glCore_glTransformFeedbackStreamAttribsNV; +void* __blue_glCore_glBindTransformFeedbackNV; +void* __blue_glCore_glDeleteTransformFeedbacksNV; +void* __blue_glCore_glGenTransformFeedbacksNV; +void* __blue_glCore_glIsTransformFeedbackNV; +void* __blue_glCore_glPauseTransformFeedbackNV; +void* __blue_glCore_glResumeTransformFeedbackNV; +void* __blue_glCore_glDrawTransformFeedbackNV; +void* __blue_glCore_glVDPAUInitNV; +void* __blue_glCore_glVDPAUFiniNV; +void* __blue_glCore_glVDPAURegisterVideoSurfaceNV; +void* __blue_glCore_glVDPAURegisterOutputSurfaceNV; +void* __blue_glCore_glVDPAUIsSurfaceNV; +void* __blue_glCore_glVDPAUUnregisterSurfaceNV; +void* __blue_glCore_glVDPAUGetSurfaceivNV; +void* __blue_glCore_glVDPAUSurfaceAccessNV; +void* __blue_glCore_glVDPAUMapSurfacesNV; +void* __blue_glCore_glVDPAUUnmapSurfacesNV; +void* __blue_glCore_glFlushVertexArrayRangeNV; +void* __blue_glCore_glVertexArrayRangeNV; +void* __blue_glCore_glVertexAttribL1i64NV; +void* __blue_glCore_glVertexAttribL2i64NV; +void* __blue_glCore_glVertexAttribL3i64NV; +void* __blue_glCore_glVertexAttribL4i64NV; +void* __blue_glCore_glVertexAttribL1i64vNV; +void* __blue_glCore_glVertexAttribL2i64vNV; +void* __blue_glCore_glVertexAttribL3i64vNV; +void* __blue_glCore_glVertexAttribL4i64vNV; +void* __blue_glCore_glVertexAttribL1ui64NV; +void* __blue_glCore_glVertexAttribL2ui64NV; +void* __blue_glCore_glVertexAttribL3ui64NV; +void* __blue_glCore_glVertexAttribL4ui64NV; +void* __blue_glCore_glVertexAttribL1ui64vNV; +void* __blue_glCore_glVertexAttribL2ui64vNV; +void* __blue_glCore_glVertexAttribL3ui64vNV; +void* __blue_glCore_glVertexAttribL4ui64vNV; +void* __blue_glCore_glGetVertexAttribLi64vNV; +void* __blue_glCore_glGetVertexAttribLui64vNV; +void* __blue_glCore_glVertexAttribLFormatNV; +void* __blue_glCore_glBufferAddressRangeNV; +void* __blue_glCore_glVertexFormatNV; +void* __blue_glCore_glNormalFormatNV; +void* __blue_glCore_glColorFormatNV; +void* __blue_glCore_glIndexFormatNV; +void* __blue_glCore_glTexCoordFormatNV; +void* __blue_glCore_glEdgeFlagFormatNV; +void* __blue_glCore_glSecondaryColorFormatNV; +void* __blue_glCore_glFogCoordFormatNV; +void* __blue_glCore_glVertexAttribFormatNV; +void* __blue_glCore_glVertexAttribIFormatNV; +void* __blue_glCore_glGetIntegerui64i_vNV; +void* __blue_glCore_glAreProgramsResidentNV; +void* __blue_glCore_glBindProgramNV; +void* __blue_glCore_glDeleteProgramsNV; +void* __blue_glCore_glExecuteProgramNV; +void* __blue_glCore_glGenProgramsNV; +void* __blue_glCore_glGetProgramParameterdvNV; +void* __blue_glCore_glGetProgramParameterfvNV; +void* __blue_glCore_glGetProgramivNV; +void* __blue_glCore_glGetProgramStringNV; +void* __blue_glCore_glGetTrackMatrixivNV; +void* __blue_glCore_glGetVertexAttribdvNV; +void* __blue_glCore_glGetVertexAttribfvNV; +void* __blue_glCore_glGetVertexAttribivNV; +void* __blue_glCore_glGetVertexAttribPointervNV; +void* __blue_glCore_glIsProgramNV; +void* __blue_glCore_glLoadProgramNV; +void* __blue_glCore_glProgramParameter4dNV; +void* __blue_glCore_glProgramParameter4dvNV; +void* __blue_glCore_glProgramParameter4fNV; +void* __blue_glCore_glProgramParameter4fvNV; +void* __blue_glCore_glProgramParameters4dvNV; +void* __blue_glCore_glProgramParameters4fvNV; +void* __blue_glCore_glRequestResidentProgramsNV; +void* __blue_glCore_glTrackMatrixNV; +void* __blue_glCore_glVertexAttribPointerNV; +void* __blue_glCore_glVertexAttrib1dNV; +void* __blue_glCore_glVertexAttrib1dvNV; +void* __blue_glCore_glVertexAttrib1fNV; +void* __blue_glCore_glVertexAttrib1fvNV; +void* __blue_glCore_glVertexAttrib1sNV; +void* __blue_glCore_glVertexAttrib1svNV; +void* __blue_glCore_glVertexAttrib2dNV; +void* __blue_glCore_glVertexAttrib2dvNV; +void* __blue_glCore_glVertexAttrib2fNV; +void* __blue_glCore_glVertexAttrib2fvNV; +void* __blue_glCore_glVertexAttrib2sNV; +void* __blue_glCore_glVertexAttrib2svNV; +void* __blue_glCore_glVertexAttrib3dNV; +void* __blue_glCore_glVertexAttrib3dvNV; +void* __blue_glCore_glVertexAttrib3fNV; +void* __blue_glCore_glVertexAttrib3fvNV; +void* __blue_glCore_glVertexAttrib3sNV; +void* __blue_glCore_glVertexAttrib3svNV; +void* __blue_glCore_glVertexAttrib4dNV; +void* __blue_glCore_glVertexAttrib4dvNV; +void* __blue_glCore_glVertexAttrib4fNV; +void* __blue_glCore_glVertexAttrib4fvNV; +void* __blue_glCore_glVertexAttrib4sNV; +void* __blue_glCore_glVertexAttrib4svNV; +void* __blue_glCore_glVertexAttrib4ubNV; +void* __blue_glCore_glVertexAttrib4ubvNV; +void* __blue_glCore_glVertexAttribs1dvNV; +void* __blue_glCore_glVertexAttribs1fvNV; +void* __blue_glCore_glVertexAttribs1svNV; +void* __blue_glCore_glVertexAttribs2dvNV; +void* __blue_glCore_glVertexAttribs2fvNV; +void* __blue_glCore_glVertexAttribs2svNV; +void* __blue_glCore_glVertexAttribs3dvNV; +void* __blue_glCore_glVertexAttribs3fvNV; +void* __blue_glCore_glVertexAttribs3svNV; +void* __blue_glCore_glVertexAttribs4dvNV; +void* __blue_glCore_glVertexAttribs4fvNV; +void* __blue_glCore_glVertexAttribs4svNV; +void* __blue_glCore_glVertexAttribs4ubvNV; +void* __blue_glCore_glVertexAttribI1iEXT; +void* __blue_glCore_glVertexAttribI2iEXT; +void* __blue_glCore_glVertexAttribI3iEXT; +void* __blue_glCore_glVertexAttribI4iEXT; +void* __blue_glCore_glVertexAttribI1uiEXT; +void* __blue_glCore_glVertexAttribI2uiEXT; +void* __blue_glCore_glVertexAttribI3uiEXT; +void* __blue_glCore_glVertexAttribI4uiEXT; +void* __blue_glCore_glVertexAttribI1ivEXT; +void* __blue_glCore_glVertexAttribI2ivEXT; +void* __blue_glCore_glVertexAttribI3ivEXT; +void* __blue_glCore_glVertexAttribI4ivEXT; +void* __blue_glCore_glVertexAttribI1uivEXT; +void* __blue_glCore_glVertexAttribI2uivEXT; +void* __blue_glCore_glVertexAttribI3uivEXT; +void* __blue_glCore_glVertexAttribI4uivEXT; +void* __blue_glCore_glVertexAttribI4bvEXT; +void* __blue_glCore_glVertexAttribI4svEXT; +void* __blue_glCore_glVertexAttribI4ubvEXT; +void* __blue_glCore_glVertexAttribI4usvEXT; +void* __blue_glCore_glVertexAttribIPointerEXT; +void* __blue_glCore_glGetVertexAttribIivEXT; +void* __blue_glCore_glGetVertexAttribIuivEXT; +void* __blue_glCore_glBeginVideoCaptureNV; +void* __blue_glCore_glBindVideoCaptureStreamBufferNV; +void* __blue_glCore_glBindVideoCaptureStreamTextureNV; +void* __blue_glCore_glEndVideoCaptureNV; +void* __blue_glCore_glGetVideoCaptureivNV; +void* __blue_glCore_glGetVideoCaptureStreamivNV; +void* __blue_glCore_glGetVideoCaptureStreamfvNV; +void* __blue_glCore_glGetVideoCaptureStreamdvNV; +void* __blue_glCore_glVideoCaptureNV; +void* __blue_glCore_glVideoCaptureStreamParameterivNV; +void* __blue_glCore_glVideoCaptureStreamParameterfvNV; +void* __blue_glCore_glVideoCaptureStreamParameterdvNV; +void* __blue_glCore_glFramebufferTextureMultiviewOVR; +void* __blue_glCore_glHintPGI; +void* __blue_glCore_glDetailTexFuncSGIS; +void* __blue_glCore_glGetDetailTexFuncSGIS; +void* __blue_glCore_glFogFuncSGIS; +void* __blue_glCore_glGetFogFuncSGIS; +void* __blue_glCore_glSampleMaskSGIS; +void* __blue_glCore_glSamplePatternSGIS; +void* __blue_glCore_glPixelTexGenParameteriSGIS; +void* __blue_glCore_glPixelTexGenParameterivSGIS; +void* __blue_glCore_glPixelTexGenParameterfSGIS; +void* __blue_glCore_glPixelTexGenParameterfvSGIS; +void* __blue_glCore_glGetPixelTexGenParameterivSGIS; +void* __blue_glCore_glGetPixelTexGenParameterfvSGIS; +void* __blue_glCore_glPointParameterfSGIS; +void* __blue_glCore_glPointParameterfvSGIS; +void* __blue_glCore_glSharpenTexFuncSGIS; +void* __blue_glCore_glGetSharpenTexFuncSGIS; +void* __blue_glCore_glTexImage4DSGIS; +void* __blue_glCore_glTexSubImage4DSGIS; +void* __blue_glCore_glTextureColorMaskSGIS; +void* __blue_glCore_glGetTexFilterFuncSGIS; +void* __blue_glCore_glTexFilterFuncSGIS; +void* __blue_glCore_glAsyncMarkerSGIX; +void* __blue_glCore_glFinishAsyncSGIX; +void* __blue_glCore_glPollAsyncSGIX; +void* __blue_glCore_glGenAsyncMarkersSGIX; +void* __blue_glCore_glDeleteAsyncMarkersSGIX; +void* __blue_glCore_glIsAsyncMarkerSGIX; +void* __blue_glCore_glFlushRasterSGIX; +void* __blue_glCore_glFragmentColorMaterialSGIX; +void* __blue_glCore_glFragmentLightfSGIX; +void* __blue_glCore_glFragmentLightfvSGIX; +void* __blue_glCore_glFragmentLightiSGIX; +void* __blue_glCore_glFragmentLightivSGIX; +void* __blue_glCore_glFragmentLightModelfSGIX; +void* __blue_glCore_glFragmentLightModelfvSGIX; +void* __blue_glCore_glFragmentLightModeliSGIX; +void* __blue_glCore_glFragmentLightModelivSGIX; +void* __blue_glCore_glFragmentMaterialfSGIX; +void* __blue_glCore_glFragmentMaterialfvSGIX; +void* __blue_glCore_glFragmentMaterialiSGIX; +void* __blue_glCore_glFragmentMaterialivSGIX; +void* __blue_glCore_glGetFragmentLightfvSGIX; +void* __blue_glCore_glGetFragmentLightivSGIX; +void* __blue_glCore_glGetFragmentMaterialfvSGIX; +void* __blue_glCore_glGetFragmentMaterialivSGIX; +void* __blue_glCore_glLightEnviSGIX; +void* __blue_glCore_glFrameZoomSGIX; +void* __blue_glCore_glIglooInterfaceSGIX; +void* __blue_glCore_glGetInstrumentsSGIX; +void* __blue_glCore_glInstrumentsBufferSGIX; +void* __blue_glCore_glPollInstrumentsSGIX; +void* __blue_glCore_glReadInstrumentsSGIX; +void* __blue_glCore_glStartInstrumentsSGIX; +void* __blue_glCore_glStopInstrumentsSGIX; +void* __blue_glCore_glGetListParameterfvSGIX; +void* __blue_glCore_glGetListParameterivSGIX; +void* __blue_glCore_glListParameterfSGIX; +void* __blue_glCore_glListParameterfvSGIX; +void* __blue_glCore_glListParameteriSGIX; +void* __blue_glCore_glListParameterivSGIX; +void* __blue_glCore_glPixelTexGenSGIX; +void* __blue_glCore_glDeformationMap3dSGIX; +void* __blue_glCore_glDeformationMap3fSGIX; +void* __blue_glCore_glDeformSGIX; +void* __blue_glCore_glLoadIdentityDeformationMapSGIX; +void* __blue_glCore_glReferencePlaneSGIX; +void* __blue_glCore_glSpriteParameterfSGIX; +void* __blue_glCore_glSpriteParameterfvSGIX; +void* __blue_glCore_glSpriteParameteriSGIX; +void* __blue_glCore_glSpriteParameterivSGIX; +void* __blue_glCore_glTagSampleBufferSGIX; +void* __blue_glCore_glColorTableSGI; +void* __blue_glCore_glColorTableParameterfvSGI; +void* __blue_glCore_glColorTableParameterivSGI; +void* __blue_glCore_glCopyColorTableSGI; +void* __blue_glCore_glGetColorTableSGI; +void* __blue_glCore_glGetColorTableParameterfvSGI; +void* __blue_glCore_glGetColorTableParameterivSGI; +void* __blue_glCore_glFinishTextureSUNX; +void* __blue_glCore_glGlobalAlphaFactorbSUN; +void* __blue_glCore_glGlobalAlphaFactorsSUN; +void* __blue_glCore_glGlobalAlphaFactoriSUN; +void* __blue_glCore_glGlobalAlphaFactorfSUN; +void* __blue_glCore_glGlobalAlphaFactordSUN; +void* __blue_glCore_glGlobalAlphaFactorubSUN; +void* __blue_glCore_glGlobalAlphaFactorusSUN; +void* __blue_glCore_glGlobalAlphaFactoruiSUN; +void* __blue_glCore_glDrawMeshArraysSUN; +void* __blue_glCore_glReplacementCodeuiSUN; +void* __blue_glCore_glReplacementCodeusSUN; +void* __blue_glCore_glReplacementCodeubSUN; +void* __blue_glCore_glReplacementCodeuivSUN; +void* __blue_glCore_glReplacementCodeusvSUN; +void* __blue_glCore_glReplacementCodeubvSUN; +void* __blue_glCore_glReplacementCodePointerSUN; +void* __blue_glCore_glColor4ubVertex2fSUN; +void* __blue_glCore_glColor4ubVertex2fvSUN; +void* __blue_glCore_glColor4ubVertex3fSUN; +void* __blue_glCore_glColor4ubVertex3fvSUN; +void* __blue_glCore_glColor3fVertex3fSUN; +void* __blue_glCore_glColor3fVertex3fvSUN; +void* __blue_glCore_glNormal3fVertex3fSUN; +void* __blue_glCore_glNormal3fVertex3fvSUN; +void* __blue_glCore_glColor4fNormal3fVertex3fSUN; +void* __blue_glCore_glColor4fNormal3fVertex3fvSUN; +void* __blue_glCore_glTexCoord2fVertex3fSUN; +void* __blue_glCore_glTexCoord2fVertex3fvSUN; +void* __blue_glCore_glTexCoord4fVertex4fSUN; +void* __blue_glCore_glTexCoord4fVertex4fvSUN; +void* __blue_glCore_glTexCoord2fColor4ubVertex3fSUN; +void* __blue_glCore_glTexCoord2fColor4ubVertex3fvSUN; +void* __blue_glCore_glTexCoord2fColor3fVertex3fSUN; +void* __blue_glCore_glTexCoord2fColor3fVertex3fvSUN; +void* __blue_glCore_glTexCoord2fNormal3fVertex3fSUN; +void* __blue_glCore_glTexCoord2fNormal3fVertex3fvSUN; +void* __blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN; +void* __blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN; +void* __blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN; +void* __blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN; +void* __blue_glCore_glReplacementCodeuiVertex3fSUN; +void* __blue_glCore_glReplacementCodeuiVertex3fvSUN; +void* __blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN; +void* __blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN; +void* __blue_glCore_glReplacementCodeuiColor3fVertex3fSUN; +void* __blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN; +void* __blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN; +void* __blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN; +void* __blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN; +void* __blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN; +void* __blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN; +void* __blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN; +void* __blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; +void* __blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; +void* __blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; +void* __blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; +} + +namespace bluegl { + +// This mutex protect g_library_refcount below. +static std::mutex g_library_mutex; +static uint32_t g_library_refcount = 0; + +struct { + void** api_call; + const char* api_name; +} g_gl_stubs[] = { + { &__blue_glCore_glCullFace, "glCullFace" }, + { &__blue_glCore_glFrontFace, "glFrontFace" }, + { &__blue_glCore_glHint, "glHint" }, + { &__blue_glCore_glLineWidth, "glLineWidth" }, { &__blue_glCore_glPointSize, "glPointSize" }, - { &__blue_glCore_glTexCoord4hNV, "glTexCoord4hNV" }, - { &__blue_glCore_glGetIntegerIndexedvEXT, "glGetIntegerIndexedvEXT" }, - { &__blue_glCore_glPrimitiveBoundingBoxARB, "glPrimitiveBoundingBoxARB" }, - { &__blue_glCore_glDebugMessageInsert, "glDebugMessageInsert" }, - { &__blue_glCore_glMultiTexCoord3bvOES, "glMultiTexCoord3bvOES" }, - { &__blue_glCore_glVertexAttribL1i64vNV, "glVertexAttribL1i64vNV" }, - { &__blue_glCore_glTextureBuffer, "glTextureBuffer" }, - { &__blue_glCore_glGetTextureParameterIiv, "glGetTextureParameterIiv" }, - { &__blue_glCore_glFramebufferTexture, "glFramebufferTexture" }, - { &__blue_glCore_glGetProgramivARB, "glGetProgramivARB" }, - { &__blue_glCore_glVertexAttribPointerARB, "glVertexAttribPointerARB" }, - { &__blue_glCore_glIsCommandListNV, "glIsCommandListNV" }, - { &__blue_glCore_glUniform1uivEXT, "glUniform1uivEXT" }, - { &__blue_glCore_glProgramUniform2i, "glProgramUniform2i" }, - { &__blue_glCore_glVertexAttribDivisorARB, "glVertexAttribDivisorARB" }, - { &__blue_glCore_glGetVertexAttribPointervARB, "glGetVertexAttribPointervARB" }, - { &__blue_glCore_glTextureImage2DMultisampleNV, "glTextureImage2DMultisampleNV" }, - { &__blue_glCore_glGetVariantPointervEXT, "glGetVariantPointervEXT" }, - { &__blue_glCore_glCheckFramebufferStatus, "glCheckFramebufferStatus" }, - { &__blue_glCore_glMap1xOES, "glMap1xOES" }, - { &__blue_glCore_glBindSampler, "glBindSampler" }, - { &__blue_glCore_glPathGlyphIndexRangeNV, "glPathGlyphIndexRangeNV" }, - { &__blue_glCore_glProgramEnvParameters4fvEXT, "glProgramEnvParameters4fvEXT" }, - { &__blue_glCore_glVertexAttrib3fNV, "glVertexAttrib3fNV" }, - { &__blue_glCore_glBindBuffersBase, "glBindBuffersBase" }, - { &__blue_glCore_glGetNamedProgramLocalParameterIivEXT, "glGetNamedProgramLocalParameterIivEXT" }, - { &__blue_glCore_glProgramUniform4d, "glProgramUniform4d" }, - { &__blue_glCore_glMultiTexCoord3f, "glMultiTexCoord3f" }, - { &__blue_glCore_glDeleteProgram, "glDeleteProgram" }, - { &__blue_glCore_glReplacementCodeuiVertex3fvSUN, "glReplacementCodeuiVertex3fvSUN" }, - { &__blue_glCore_glMapNamedBufferRange, "glMapNamedBufferRange" }, - { &__blue_glCore_glFramebufferSampleLocationsfvARB, "glFramebufferSampleLocationsfvARB" }, - { &__blue_glCore_glMultiTexCoord1dvARB, "glMultiTexCoord1dvARB" }, - { &__blue_glCore_glClearBufferuiv, "glClearBufferuiv" }, - { &__blue_glCore_glDrawRangeElementsEXT, "glDrawRangeElementsEXT" }, - { &__blue_glCore_glVertexAttrib1hvNV, "glVertexAttrib1hvNV" }, - { &__blue_glCore_glSecondaryColor3bv, "glSecondaryColor3bv" }, - { &__blue_glCore_glVDPAUMapSurfacesNV, "glVDPAUMapSurfacesNV" }, + { &__blue_glCore_glPolygonMode, "glPolygonMode" }, + { &__blue_glCore_glScissor, "glScissor" }, + { &__blue_glCore_glTexParameterf, "glTexParameterf" }, + { &__blue_glCore_glTexParameterfv, "glTexParameterfv" }, + { &__blue_glCore_glTexParameteri, "glTexParameteri" }, + { &__blue_glCore_glTexParameteriv, "glTexParameteriv" }, + { &__blue_glCore_glTexImage1D, "glTexImage1D" }, + { &__blue_glCore_glTexImage2D, "glTexImage2D" }, + { &__blue_glCore_glDrawBuffer, "glDrawBuffer" }, + { &__blue_glCore_glClear, "glClear" }, + { &__blue_glCore_glClearColor, "glClearColor" }, + { &__blue_glCore_glClearStencil, "glClearStencil" }, + { &__blue_glCore_glClearDepth, "glClearDepth" }, { &__blue_glCore_glStencilMask, "glStencilMask" }, - { &__blue_glCore_glGetProgramResourceLocationIndex, "glGetProgramResourceLocationIndex" }, - { &__blue_glCore_glGetIntegerui64i_vNV, "glGetIntegerui64i_vNV" }, - { &__blue_glCore_glGetTextureLevelParameterfvEXT, "glGetTextureLevelParameterfvEXT" }, - { &__blue_glCore_glWindowPos3sv, "glWindowPos3sv" }, - { &__blue_glCore_glBlendEquationSeparatei, "glBlendEquationSeparatei" }, - { &__blue_glCore_glGetInfoLogARB, "glGetInfoLogARB" }, - { &__blue_glCore_glProgramNamedParameter4fNV, "glProgramNamedParameter4fNV" }, - { &__blue_glCore_glProgramParameter4fNV, "glProgramParameter4fNV" }, - { &__blue_glCore_glDeleteTextures, "glDeleteTextures" }, - { &__blue_glCore_glFramebufferDrawBuffersEXT, "glFramebufferDrawBuffersEXT" }, - { &__blue_glCore_glGetObjectLabelEXT, "glGetObjectLabelEXT" }, - { &__blue_glCore_glProgramUniform3ivEXT, "glProgramUniform3ivEXT" }, - { &__blue_glCore_glTextureParameterIiv, "glTextureParameterIiv" }, - { &__blue_glCore_glGetnUniformuiv, "glGetnUniformuiv" }, - { &__blue_glCore_glMapObjectBufferATI, "glMapObjectBufferATI" }, - { &__blue_glCore_glTangent3dvEXT, "glTangent3dvEXT" }, - { &__blue_glCore_glProgramParameter4dNV, "glProgramParameter4dNV" }, - { &__blue_glCore_glGenVertexArraysAPPLE, "glGenVertexArraysAPPLE" }, - { &__blue_glCore_glVertexAttrib4bvARB, "glVertexAttrib4bvARB" }, - { &__blue_glCore_glVertexStream1dATI, "glVertexStream1dATI" }, - { &__blue_glCore_glMultiTexCoord2svARB, "glMultiTexCoord2svARB" }, - { &__blue_glCore_glClearNamedBufferSubDataEXT, "glClearNamedBufferSubDataEXT" }, - { &__blue_glCore_glCompressedTextureSubImage3D, "glCompressedTextureSubImage3D" }, - { &__blue_glCore_glVertexAttribI4iEXT, "glVertexAttribI4iEXT" }, - { &__blue_glCore_glGetnPixelMapfvARB, "glGetnPixelMapfvARB" }, - { &__blue_glCore_glVertexStream4iATI, "glVertexStream4iATI" }, - { &__blue_glCore_glMatrixMultTransposedEXT, "glMatrixMultTransposedEXT" }, - { &__blue_glCore_glDisableVariantClientStateEXT, "glDisableVariantClientStateEXT" }, - { &__blue_glCore_glPrimitiveRestartNV, "glPrimitiveRestartNV" }, - { &__blue_glCore_glVertexAttribP4uiv, "glVertexAttribP4uiv" }, - { &__blue_glCore_glProgramUniformMatrix2fv, "glProgramUniformMatrix2fv" }, - { &__blue_glCore_glPolygonOffsetEXT, "glPolygonOffsetEXT" }, - { &__blue_glCore_glUseProgramObjectARB, "glUseProgramObjectARB" }, - { &__blue_glCore_glMatrixLoadfEXT, "glMatrixLoadfEXT" }, - { &__blue_glCore_glTextureSubImage1D, "glTextureSubImage1D" }, - { &__blue_glCore_glHistogramEXT, "glHistogramEXT" }, - { &__blue_glCore_glProgramUniform1ivEXT, "glProgramUniform1ivEXT" }, - { &__blue_glCore_glGetBufferParameterivARB, "glGetBufferParameterivARB" }, - { &__blue_glCore_glStringMarkerGREMEDY, "glStringMarkerGREMEDY" }, - { &__blue_glCore_glGetnMapfv, "glGetnMapfv" }, - { &__blue_glCore_glMultiTexCoord3dvARB, "glMultiTexCoord3dvARB" }, - { &__blue_glCore_glFinishTextureSUNX, "glFinishTextureSUNX" }, - { &__blue_glCore_glWindowPos3dARB, "glWindowPos3dARB" }, - { &__blue_glCore_glNamedBufferStorageEXT, "glNamedBufferStorageEXT" }, - { &__blue_glCore_glIndexPointerListIBM, "glIndexPointerListIBM" }, - { &__blue_glCore_glColor3fVertex3fSUN, "glColor3fVertex3fSUN" }, - { &__blue_glCore_glDepthRangefOES, "glDepthRangefOES" }, - { &__blue_glCore_glVertexBlendEnvfATI, "glVertexBlendEnvfATI" }, - { &__blue_glCore_glMultiTexCoord1hvNV, "glMultiTexCoord1hvNV" }, - { &__blue_glCore_glGetPixelTexGenParameterfvSGIS, "glGetPixelTexGenParameterfvSGIS" }, - { &__blue_glCore_glDisableClientStateIndexedEXT, "glDisableClientStateIndexedEXT" }, - { &__blue_glCore_glProgramUniform1ui64NV, "glProgramUniform1ui64NV" }, - { &__blue_glCore_glMultiTexCoord1dv, "glMultiTexCoord1dv" }, - { &__blue_glCore_glMultiTexCoord1ivARB, "glMultiTexCoord1ivARB" }, - { &__blue_glCore_glMapVertexAttrib1dAPPLE, "glMapVertexAttrib1dAPPLE" }, - { &__blue_glCore_glGetPerfQueryIdByNameINTEL, "glGetPerfQueryIdByNameINTEL" }, - { &__blue_glCore_glUniform2ui64vNV, "glUniform2ui64vNV" }, - { &__blue_glCore_glGetSharpenTexFuncSGIS, "glGetSharpenTexFuncSGIS" }, - { &__blue_glCore_glBindImageTexture, "glBindImageTexture" }, - { &__blue_glCore_glProgramEnvParameter4dvARB, "glProgramEnvParameter4dvARB" }, - { &__blue_glCore_glDeleteFramebuffers, "glDeleteFramebuffers" }, - { &__blue_glCore_glVertexArrayVertexOffsetEXT, "glVertexArrayVertexOffsetEXT" }, - { &__blue_glCore_glProgramLocalParameters4fvEXT, "glProgramLocalParameters4fvEXT" }, - { &__blue_glCore_glFogCoordFormatNV, "glFogCoordFormatNV" }, - { &__blue_glCore_glGenQueries, "glGenQueries" }, - { &__blue_glCore_glVertexAttribL4dEXT, "glVertexAttribL4dEXT" }, - { &__blue_glCore_glMultiTexCoord4fvARB, "glMultiTexCoord4fvARB" }, - { &__blue_glCore_glPixelZoomxOES, "glPixelZoomxOES" }, + { &__blue_glCore_glColorMask, "glColorMask" }, + { &__blue_glCore_glDepthMask, "glDepthMask" }, + { &__blue_glCore_glDisable, "glDisable" }, + { &__blue_glCore_glEnable, "glEnable" }, + { &__blue_glCore_glFinish, "glFinish" }, + { &__blue_glCore_glFlush, "glFlush" }, + { &__blue_glCore_glBlendFunc, "glBlendFunc" }, + { &__blue_glCore_glLogicOp, "glLogicOp" }, + { &__blue_glCore_glStencilFunc, "glStencilFunc" }, + { &__blue_glCore_glStencilOp, "glStencilOp" }, + { &__blue_glCore_glDepthFunc, "glDepthFunc" }, + { &__blue_glCore_glPixelStoref, "glPixelStoref" }, + { &__blue_glCore_glPixelStorei, "glPixelStorei" }, + { &__blue_glCore_glReadBuffer, "glReadBuffer" }, + { &__blue_glCore_glReadPixels, "glReadPixels" }, + { &__blue_glCore_glGetBooleanv, "glGetBooleanv" }, + { &__blue_glCore_glGetDoublev, "glGetDoublev" }, + { &__blue_glCore_glGetError, "glGetError" }, + { &__blue_glCore_glGetFloatv, "glGetFloatv" }, + { &__blue_glCore_glGetIntegerv, "glGetIntegerv" }, + { &__blue_glCore_glGetString, "glGetString" }, + { &__blue_glCore_glGetTexImage, "glGetTexImage" }, + { &__blue_glCore_glGetTexParameterfv, "glGetTexParameterfv" }, + { &__blue_glCore_glGetTexParameteriv, "glGetTexParameteriv" }, + { &__blue_glCore_glGetTexLevelParameterfv, "glGetTexLevelParameterfv" }, + { &__blue_glCore_glGetTexLevelParameteriv, "glGetTexLevelParameteriv" }, + { &__blue_glCore_glIsEnabled, "glIsEnabled" }, + { &__blue_glCore_glDepthRange, "glDepthRange" }, + { &__blue_glCore_glViewport, "glViewport" }, + { &__blue_glCore_glDrawArrays, "glDrawArrays" }, + { &__blue_glCore_glDrawElements, "glDrawElements" }, + { &__blue_glCore_glGetPointerv, "glGetPointerv" }, + { &__blue_glCore_glPolygonOffset, "glPolygonOffset" }, + { &__blue_glCore_glCopyTexImage1D, "glCopyTexImage1D" }, + { &__blue_glCore_glCopyTexImage2D, "glCopyTexImage2D" }, + { &__blue_glCore_glCopyTexSubImage1D, "glCopyTexSubImage1D" }, + { &__blue_glCore_glCopyTexSubImage2D, "glCopyTexSubImage2D" }, + { &__blue_glCore_glTexSubImage1D, "glTexSubImage1D" }, + { &__blue_glCore_glTexSubImage2D, "glTexSubImage2D" }, + { &__blue_glCore_glBindTexture, "glBindTexture" }, + { &__blue_glCore_glDeleteTextures, "glDeleteTextures" }, + { &__blue_glCore_glGenTextures, "glGenTextures" }, + { &__blue_glCore_glIsTexture, "glIsTexture" }, + { &__blue_glCore_glDrawRangeElements, "glDrawRangeElements" }, + { &__blue_glCore_glTexImage3D, "glTexImage3D" }, + { &__blue_glCore_glTexSubImage3D, "glTexSubImage3D" }, { &__blue_glCore_glCopyTexSubImage3D, "glCopyTexSubImage3D" }, - { &__blue_glCore_glUniform1ui64vARB, "glUniform1ui64vARB" }, - { &__blue_glCore_glGetMapControlPointsNV, "glGetMapControlPointsNV" }, - { &__blue_glCore_glLightEnviSGIX, "glLightEnviSGIX" }, + { &__blue_glCore_glActiveTexture, "glActiveTexture" }, + { &__blue_glCore_glSampleCoverage, "glSampleCoverage" }, + { &__blue_glCore_glCompressedTexImage3D, "glCompressedTexImage3D" }, + { &__blue_glCore_glCompressedTexImage2D, "glCompressedTexImage2D" }, + { &__blue_glCore_glCompressedTexImage1D, "glCompressedTexImage1D" }, + { &__blue_glCore_glCompressedTexSubImage3D, "glCompressedTexSubImage3D" }, + { &__blue_glCore_glCompressedTexSubImage2D, "glCompressedTexSubImage2D" }, + { &__blue_glCore_glCompressedTexSubImage1D, "glCompressedTexSubImage1D" }, + { &__blue_glCore_glGetCompressedTexImage, "glGetCompressedTexImage" }, + { &__blue_glCore_glBlendFuncSeparate, "glBlendFuncSeparate" }, + { &__blue_glCore_glMultiDrawArrays, "glMultiDrawArrays" }, + { &__blue_glCore_glMultiDrawElements, "glMultiDrawElements" }, + { &__blue_glCore_glPointParameterf, "glPointParameterf" }, + { &__blue_glCore_glPointParameterfv, "glPointParameterfv" }, + { &__blue_glCore_glPointParameteri, "glPointParameteri" }, + { &__blue_glCore_glPointParameteriv, "glPointParameteriv" }, + { &__blue_glCore_glBlendColor, "glBlendColor" }, + { &__blue_glCore_glBlendEquation, "glBlendEquation" }, + { &__blue_glCore_glGenQueries, "glGenQueries" }, + { &__blue_glCore_glDeleteQueries, "glDeleteQueries" }, + { &__blue_glCore_glIsQuery, "glIsQuery" }, + { &__blue_glCore_glBeginQuery, "glBeginQuery" }, + { &__blue_glCore_glEndQuery, "glEndQuery" }, + { &__blue_glCore_glGetQueryiv, "glGetQueryiv" }, + { &__blue_glCore_glGetQueryObjectiv, "glGetQueryObjectiv" }, + { &__blue_glCore_glGetQueryObjectuiv, "glGetQueryObjectuiv" }, + { &__blue_glCore_glBindBuffer, "glBindBuffer" }, + { &__blue_glCore_glDeleteBuffers, "glDeleteBuffers" }, + { &__blue_glCore_glGenBuffers, "glGenBuffers" }, + { &__blue_glCore_glIsBuffer, "glIsBuffer" }, + { &__blue_glCore_glBufferData, "glBufferData" }, + { &__blue_glCore_glBufferSubData, "glBufferSubData" }, + { &__blue_glCore_glGetBufferSubData, "glGetBufferSubData" }, + { &__blue_glCore_glMapBuffer, "glMapBuffer" }, + { &__blue_glCore_glUnmapBuffer, "glUnmapBuffer" }, + { &__blue_glCore_glGetBufferParameteriv, "glGetBufferParameteriv" }, + { &__blue_glCore_glGetBufferPointerv, "glGetBufferPointerv" }, + { &__blue_glCore_glBlendEquationSeparate, "glBlendEquationSeparate" }, + { &__blue_glCore_glDrawBuffers, "glDrawBuffers" }, + { &__blue_glCore_glStencilOpSeparate, "glStencilOpSeparate" }, + { &__blue_glCore_glStencilFuncSeparate, "glStencilFuncSeparate" }, + { &__blue_glCore_glStencilMaskSeparate, "glStencilMaskSeparate" }, + { &__blue_glCore_glAttachShader, "glAttachShader" }, + { &__blue_glCore_glBindAttribLocation, "glBindAttribLocation" }, + { &__blue_glCore_glCompileShader, "glCompileShader" }, + { &__blue_glCore_glCreateProgram, "glCreateProgram" }, + { &__blue_glCore_glCreateShader, "glCreateShader" }, + { &__blue_glCore_glDeleteProgram, "glDeleteProgram" }, + { &__blue_glCore_glDeleteShader, "glDeleteShader" }, + { &__blue_glCore_glDetachShader, "glDetachShader" }, + { &__blue_glCore_glDisableVertexAttribArray, "glDisableVertexAttribArray" }, + { &__blue_glCore_glEnableVertexAttribArray, "glEnableVertexAttribArray" }, + { &__blue_glCore_glGetActiveAttrib, "glGetActiveAttrib" }, + { &__blue_glCore_glGetActiveUniform, "glGetActiveUniform" }, + { &__blue_glCore_glGetAttachedShaders, "glGetAttachedShaders" }, + { &__blue_glCore_glGetAttribLocation, "glGetAttribLocation" }, + { &__blue_glCore_glGetProgramiv, "glGetProgramiv" }, + { &__blue_glCore_glGetProgramInfoLog, "glGetProgramInfoLog" }, + { &__blue_glCore_glGetShaderiv, "glGetShaderiv" }, + { &__blue_glCore_glGetShaderInfoLog, "glGetShaderInfoLog" }, + { &__blue_glCore_glGetShaderSource, "glGetShaderSource" }, + { &__blue_glCore_glGetUniformLocation, "glGetUniformLocation" }, + { &__blue_glCore_glGetUniformfv, "glGetUniformfv" }, + { &__blue_glCore_glGetUniformiv, "glGetUniformiv" }, + { &__blue_glCore_glGetVertexAttribdv, "glGetVertexAttribdv" }, + { &__blue_glCore_glGetVertexAttribfv, "glGetVertexAttribfv" }, + { &__blue_glCore_glGetVertexAttribiv, "glGetVertexAttribiv" }, + { &__blue_glCore_glGetVertexAttribPointerv, "glGetVertexAttribPointerv" }, + { &__blue_glCore_glIsProgram, "glIsProgram" }, + { &__blue_glCore_glIsShader, "glIsShader" }, + { &__blue_glCore_glLinkProgram, "glLinkProgram" }, + { &__blue_glCore_glShaderSource, "glShaderSource" }, + { &__blue_glCore_glUseProgram, "glUseProgram" }, + { &__blue_glCore_glUniform1f, "glUniform1f" }, + { &__blue_glCore_glUniform2f, "glUniform2f" }, + { &__blue_glCore_glUniform3f, "glUniform3f" }, + { &__blue_glCore_glUniform4f, "glUniform4f" }, + { &__blue_glCore_glUniform1i, "glUniform1i" }, + { &__blue_glCore_glUniform2i, "glUniform2i" }, + { &__blue_glCore_glUniform3i, "glUniform3i" }, + { &__blue_glCore_glUniform4i, "glUniform4i" }, + { &__blue_glCore_glUniform1fv, "glUniform1fv" }, + { &__blue_glCore_glUniform2fv, "glUniform2fv" }, + { &__blue_glCore_glUniform3fv, "glUniform3fv" }, + { &__blue_glCore_glUniform4fv, "glUniform4fv" }, + { &__blue_glCore_glUniform1iv, "glUniform1iv" }, + { &__blue_glCore_glUniform2iv, "glUniform2iv" }, + { &__blue_glCore_glUniform3iv, "glUniform3iv" }, + { &__blue_glCore_glUniform4iv, "glUniform4iv" }, + { &__blue_glCore_glUniformMatrix2fv, "glUniformMatrix2fv" }, + { &__blue_glCore_glUniformMatrix3fv, "glUniformMatrix3fv" }, + { &__blue_glCore_glUniformMatrix4fv, "glUniformMatrix4fv" }, + { &__blue_glCore_glValidateProgram, "glValidateProgram" }, + { &__blue_glCore_glVertexAttrib1d, "glVertexAttrib1d" }, + { &__blue_glCore_glVertexAttrib1dv, "glVertexAttrib1dv" }, + { &__blue_glCore_glVertexAttrib1f, "glVertexAttrib1f" }, + { &__blue_glCore_glVertexAttrib1fv, "glVertexAttrib1fv" }, + { &__blue_glCore_glVertexAttrib1s, "glVertexAttrib1s" }, + { &__blue_glCore_glVertexAttrib1sv, "glVertexAttrib1sv" }, + { &__blue_glCore_glVertexAttrib2d, "glVertexAttrib2d" }, + { &__blue_glCore_glVertexAttrib2dv, "glVertexAttrib2dv" }, + { &__blue_glCore_glVertexAttrib2f, "glVertexAttrib2f" }, + { &__blue_glCore_glVertexAttrib2fv, "glVertexAttrib2fv" }, + { &__blue_glCore_glVertexAttrib2s, "glVertexAttrib2s" }, + { &__blue_glCore_glVertexAttrib2sv, "glVertexAttrib2sv" }, + { &__blue_glCore_glVertexAttrib3d, "glVertexAttrib3d" }, + { &__blue_glCore_glVertexAttrib3dv, "glVertexAttrib3dv" }, + { &__blue_glCore_glVertexAttrib3f, "glVertexAttrib3f" }, + { &__blue_glCore_glVertexAttrib3fv, "glVertexAttrib3fv" }, + { &__blue_glCore_glVertexAttrib3s, "glVertexAttrib3s" }, + { &__blue_glCore_glVertexAttrib3sv, "glVertexAttrib3sv" }, { &__blue_glCore_glVertexAttrib4Nbv, "glVertexAttrib4Nbv" }, - { &__blue_glCore_glDrawBuffer, "glDrawBuffer" }, - { &__blue_glCore_glDrawTransformFeedbackStream, "glDrawTransformFeedbackStream" }, - { &__blue_glCore_glDisableClientStateiEXT, "glDisableClientStateiEXT" }, - { &__blue_glCore_glFramebufferTexture3D, "glFramebufferTexture3D" }, - { &__blue_glCore_glTextureColorMaskSGIS, "glTextureColorMaskSGIS" }, - { &__blue_glCore_glCullFace, "glCullFace" }, - { &__blue_glCore_glGetNamedBufferSubData, "glGetNamedBufferSubData" }, - { &__blue_glCore_glDispatchCompute, "glDispatchCompute" }, - { &__blue_glCore_glInvalidateFramebuffer, "glInvalidateFramebuffer" }, - { &__blue_glCore_glDebugMessageControl, "glDebugMessageControl" }, - { &__blue_glCore_glProgramUniformMatrix3dv, "glProgramUniformMatrix3dv" }, - { &__blue_glCore_glSecondaryColor3ui, "glSecondaryColor3ui" }, - { &__blue_glCore_glShaderStorageBlockBinding, "glShaderStorageBlockBinding" }, - { &__blue_glCore_glUniformMatrix3fvARB, "glUniformMatrix3fvARB" }, - { &__blue_glCore_glGetUniformOffsetEXT, "glGetUniformOffsetEXT" }, - { &__blue_glCore_glBinormal3fvEXT, "glBinormal3fvEXT" }, - { &__blue_glCore_glMultiTexCoordPointerEXT, "glMultiTexCoordPointerEXT" }, + { &__blue_glCore_glVertexAttrib4Niv, "glVertexAttrib4Niv" }, + { &__blue_glCore_glVertexAttrib4Nsv, "glVertexAttrib4Nsv" }, + { &__blue_glCore_glVertexAttrib4Nub, "glVertexAttrib4Nub" }, + { &__blue_glCore_glVertexAttrib4Nubv, "glVertexAttrib4Nubv" }, + { &__blue_glCore_glVertexAttrib4Nuiv, "glVertexAttrib4Nuiv" }, + { &__blue_glCore_glVertexAttrib4Nusv, "glVertexAttrib4Nusv" }, + { &__blue_glCore_glVertexAttrib4bv, "glVertexAttrib4bv" }, + { &__blue_glCore_glVertexAttrib4d, "glVertexAttrib4d" }, + { &__blue_glCore_glVertexAttrib4dv, "glVertexAttrib4dv" }, + { &__blue_glCore_glVertexAttrib4f, "glVertexAttrib4f" }, + { &__blue_glCore_glVertexAttrib4fv, "glVertexAttrib4fv" }, + { &__blue_glCore_glVertexAttrib4iv, "glVertexAttrib4iv" }, + { &__blue_glCore_glVertexAttrib4s, "glVertexAttrib4s" }, { &__blue_glCore_glVertexAttrib4sv, "glVertexAttrib4sv" }, - { &__blue_glCore_glMatrixIndexubvARB, "glMatrixIndexubvARB" }, - { &__blue_glCore_glProgramUniform4ivEXT, "glProgramUniform4ivEXT" }, - { &__blue_glCore_glWindowPos4dMESA, "glWindowPos4dMESA" }, - { &__blue_glCore_glMultiDrawElementsIndirectCountARB, "glMultiDrawElementsIndirectCountARB" }, - { &__blue_glCore_glUniformMatrix4fvARB, "glUniformMatrix4fvARB" }, - { &__blue_glCore_glBindImageTextureEXT, "glBindImageTextureEXT" }, - { &__blue_glCore_glResolveDepthValuesNV, "glResolveDepthValuesNV" }, - { &__blue_glCore_glColor3fVertex3fvSUN, "glColor3fVertex3fvSUN" }, - { &__blue_glCore_glCompressedTexImage1D, "glCompressedTexImage1D" }, - { &__blue_glCore_glGetnUniformdvARB, "glGetnUniformdvARB" }, - { &__blue_glCore_glUniform1ui64vNV, "glUniform1ui64vNV" }, - { &__blue_glCore_glProgramEnvParameterI4uiNV, "glProgramEnvParameterI4uiNV" }, - { &__blue_glCore_glVertexAttrib4ubNV, "glVertexAttrib4ubNV" }, - { &__blue_glCore_glGenAsyncMarkersSGIX, "glGenAsyncMarkersSGIX" }, - { &__blue_glCore_glVertexBindingDivisor, "glVertexBindingDivisor" }, - { &__blue_glCore_glCreateShaderProgramv, "glCreateShaderProgramv" }, - { &__blue_glCore_glBindBufferARB, "glBindBufferARB" }, - { &__blue_glCore_glColor4ubVertex2fvSUN, "glColor4ubVertex2fvSUN" }, - { &__blue_glCore_glResetHistogram, "glResetHistogram" }, - { &__blue_glCore_glGetProgramResourceLocation, "glGetProgramResourceLocation" }, - { &__blue_glCore_glBlendFuncSeparateiARB, "glBlendFuncSeparateiARB" }, - { &__blue_glCore_glBinormalPointerEXT, "glBinormalPointerEXT" }, - { &__blue_glCore_glVertexAttrib2svNV, "glVertexAttrib2svNV" }, - { &__blue_glCore_glProgramUniform2i64vNV, "glProgramUniform2i64vNV" }, - { &__blue_glCore_glTextureNormalEXT, "glTextureNormalEXT" }, - { &__blue_glCore_glFlushMappedBufferRangeAPPLE, "glFlushMappedBufferRangeAPPLE" }, - { &__blue_glCore_glSecondaryColor3dv, "glSecondaryColor3dv" }, - { &__blue_glCore_glColorP3uiv, "glColorP3uiv" }, - { &__blue_glCore_glUniformMatrix4x2dv, "glUniformMatrix4x2dv" }, - { &__blue_glCore_glTexCoordP3ui, "glTexCoordP3ui" }, - { &__blue_glCore_glNamedBufferSubDataEXT, "glNamedBufferSubDataEXT" }, - { &__blue_glCore_glProvokingVertexEXT, "glProvokingVertexEXT" }, - { &__blue_glCore_glWeightbvARB, "glWeightbvARB" }, - { &__blue_glCore_glInvalidateNamedFramebufferData, "glInvalidateNamedFramebufferData" }, - { &__blue_glCore_glGetArrayObjectfvATI, "glGetArrayObjectfvATI" }, - { &__blue_glCore_glIsSampler, "glIsSampler" }, - { &__blue_glCore_glNormalStream3dvATI, "glNormalStream3dvATI" }, - { &__blue_glCore_glVertexAttribL4i64vNV, "glVertexAttribL4i64vNV" }, - { &__blue_glCore_glValidateProgramARB, "glValidateProgramARB" }, + { &__blue_glCore_glVertexAttrib4ubv, "glVertexAttrib4ubv" }, + { &__blue_glCore_glVertexAttrib4uiv, "glVertexAttrib4uiv" }, + { &__blue_glCore_glVertexAttrib4usv, "glVertexAttrib4usv" }, + { &__blue_glCore_glVertexAttribPointer, "glVertexAttribPointer" }, + { &__blue_glCore_glUniformMatrix2x3fv, "glUniformMatrix2x3fv" }, + { &__blue_glCore_glUniformMatrix3x2fv, "glUniformMatrix3x2fv" }, + { &__blue_glCore_glUniformMatrix2x4fv, "glUniformMatrix2x4fv" }, + { &__blue_glCore_glUniformMatrix4x2fv, "glUniformMatrix4x2fv" }, + { &__blue_glCore_glUniformMatrix3x4fv, "glUniformMatrix3x4fv" }, + { &__blue_glCore_glUniformMatrix4x3fv, "glUniformMatrix4x3fv" }, + { &__blue_glCore_glColorMaski, "glColorMaski" }, + { &__blue_glCore_glGetBooleani_v, "glGetBooleani_v" }, + { &__blue_glCore_glGetIntegeri_v, "glGetIntegeri_v" }, + { &__blue_glCore_glEnablei, "glEnablei" }, + { &__blue_glCore_glDisablei, "glDisablei" }, + { &__blue_glCore_glIsEnabledi, "glIsEnabledi" }, + { &__blue_glCore_glBeginTransformFeedback, "glBeginTransformFeedback" }, + { &__blue_glCore_glEndTransformFeedback, "glEndTransformFeedback" }, + { &__blue_glCore_glBindBufferRange, "glBindBufferRange" }, + { &__blue_glCore_glBindBufferBase, "glBindBufferBase" }, + { &__blue_glCore_glTransformFeedbackVaryings, "glTransformFeedbackVaryings" }, + { &__blue_glCore_glGetTransformFeedbackVarying, "glGetTransformFeedbackVarying" }, + { &__blue_glCore_glClampColor, "glClampColor" }, + { &__blue_glCore_glBeginConditionalRender, "glBeginConditionalRender" }, + { &__blue_glCore_glEndConditionalRender, "glEndConditionalRender" }, + { &__blue_glCore_glVertexAttribIPointer, "glVertexAttribIPointer" }, + { &__blue_glCore_glGetVertexAttribIiv, "glGetVertexAttribIiv" }, + { &__blue_glCore_glGetVertexAttribIuiv, "glGetVertexAttribIuiv" }, + { &__blue_glCore_glVertexAttribI1i, "glVertexAttribI1i" }, + { &__blue_glCore_glVertexAttribI2i, "glVertexAttribI2i" }, + { &__blue_glCore_glVertexAttribI3i, "glVertexAttribI3i" }, + { &__blue_glCore_glVertexAttribI4i, "glVertexAttribI4i" }, + { &__blue_glCore_glVertexAttribI1ui, "glVertexAttribI1ui" }, + { &__blue_glCore_glVertexAttribI2ui, "glVertexAttribI2ui" }, + { &__blue_glCore_glVertexAttribI3ui, "glVertexAttribI3ui" }, + { &__blue_glCore_glVertexAttribI4ui, "glVertexAttribI4ui" }, + { &__blue_glCore_glVertexAttribI1iv, "glVertexAttribI1iv" }, + { &__blue_glCore_glVertexAttribI2iv, "glVertexAttribI2iv" }, + { &__blue_glCore_glVertexAttribI3iv, "glVertexAttribI3iv" }, + { &__blue_glCore_glVertexAttribI4iv, "glVertexAttribI4iv" }, + { &__blue_glCore_glVertexAttribI1uiv, "glVertexAttribI1uiv" }, + { &__blue_glCore_glVertexAttribI2uiv, "glVertexAttribI2uiv" }, + { &__blue_glCore_glVertexAttribI3uiv, "glVertexAttribI3uiv" }, + { &__blue_glCore_glVertexAttribI4uiv, "glVertexAttribI4uiv" }, + { &__blue_glCore_glVertexAttribI4bv, "glVertexAttribI4bv" }, + { &__blue_glCore_glVertexAttribI4sv, "glVertexAttribI4sv" }, + { &__blue_glCore_glVertexAttribI4ubv, "glVertexAttribI4ubv" }, + { &__blue_glCore_glVertexAttribI4usv, "glVertexAttribI4usv" }, + { &__blue_glCore_glGetUniformuiv, "glGetUniformuiv" }, + { &__blue_glCore_glBindFragDataLocation, "glBindFragDataLocation" }, + { &__blue_glCore_glGetFragDataLocation, "glGetFragDataLocation" }, + { &__blue_glCore_glUniform1ui, "glUniform1ui" }, + { &__blue_glCore_glUniform2ui, "glUniform2ui" }, { &__blue_glCore_glUniform3ui, "glUniform3ui" }, - { &__blue_glCore_glTransformFeedbackVaryingsNV, "glTransformFeedbackVaryingsNV" }, - { &__blue_glCore_glGetSeparableFilter, "glGetSeparableFilter" }, - { &__blue_glCore_glGetCompressedTexImageARB, "glGetCompressedTexImageARB" }, - { &__blue_glCore_glProgramNamedParameter4fvNV, "glProgramNamedParameter4fvNV" }, - { &__blue_glCore_glTextureBarrierNV, "glTextureBarrierNV" }, - { &__blue_glCore_glRasterSamplesEXT, "glRasterSamplesEXT" }, - { &__blue_glCore_glSecondaryColor3dEXT, "glSecondaryColor3dEXT" }, - { &__blue_glCore_glVertexAttrib1svNV, "glVertexAttrib1svNV" }, - { &__blue_glCore_glTexImage3D, "glTexImage3D" }, - { &__blue_glCore_glUniform1i64ARB, "glUniform1i64ARB" }, - { &__blue_glCore_glVertexAttrib4Nuiv, "glVertexAttrib4Nuiv" }, - { &__blue_glCore_glGetProgramivNV, "glGetProgramivNV" }, - { &__blue_glCore_glGetTexGenxvOES, "glGetTexGenxvOES" }, - { &__blue_glCore_glVertexP4uiv, "glVertexP4uiv" }, - { &__blue_glCore_glMapGrid1xOES, "glMapGrid1xOES" }, - { &__blue_glCore_glProgramUniformMatrix2dv, "glProgramUniformMatrix2dv" }, - { &__blue_glCore_glColorMaski, "glColorMaski" }, - { &__blue_glCore_glEdgeFlagPointerListIBM, "glEdgeFlagPointerListIBM" }, + { &__blue_glCore_glUniform4ui, "glUniform4ui" }, + { &__blue_glCore_glUniform1uiv, "glUniform1uiv" }, + { &__blue_glCore_glUniform2uiv, "glUniform2uiv" }, + { &__blue_glCore_glUniform3uiv, "glUniform3uiv" }, + { &__blue_glCore_glUniform4uiv, "glUniform4uiv" }, + { &__blue_glCore_glTexParameterIiv, "glTexParameterIiv" }, + { &__blue_glCore_glTexParameterIuiv, "glTexParameterIuiv" }, + { &__blue_glCore_glGetTexParameterIiv, "glGetTexParameterIiv" }, + { &__blue_glCore_glGetTexParameterIuiv, "glGetTexParameterIuiv" }, + { &__blue_glCore_glClearBufferiv, "glClearBufferiv" }, + { &__blue_glCore_glClearBufferuiv, "glClearBufferuiv" }, + { &__blue_glCore_glClearBufferfv, "glClearBufferfv" }, + { &__blue_glCore_glClearBufferfi, "glClearBufferfi" }, + { &__blue_glCore_glGetStringi, "glGetStringi" }, + { &__blue_glCore_glIsRenderbuffer, "glIsRenderbuffer" }, + { &__blue_glCore_glBindRenderbuffer, "glBindRenderbuffer" }, + { &__blue_glCore_glDeleteRenderbuffers, "glDeleteRenderbuffers" }, + { &__blue_glCore_glGenRenderbuffers, "glGenRenderbuffers" }, + { &__blue_glCore_glRenderbufferStorage, "glRenderbufferStorage" }, + { &__blue_glCore_glGetRenderbufferParameteriv, "glGetRenderbufferParameteriv" }, + { &__blue_glCore_glIsFramebuffer, "glIsFramebuffer" }, + { &__blue_glCore_glBindFramebuffer, "glBindFramebuffer" }, + { &__blue_glCore_glDeleteFramebuffers, "glDeleteFramebuffers" }, + { &__blue_glCore_glGenFramebuffers, "glGenFramebuffers" }, + { &__blue_glCore_glCheckFramebufferStatus, "glCheckFramebufferStatus" }, + { &__blue_glCore_glFramebufferTexture1D, "glFramebufferTexture1D" }, + { &__blue_glCore_glFramebufferTexture2D, "glFramebufferTexture2D" }, + { &__blue_glCore_glFramebufferTexture3D, "glFramebufferTexture3D" }, + { &__blue_glCore_glFramebufferRenderbuffer, "glFramebufferRenderbuffer" }, + { &__blue_glCore_glGetFramebufferAttachmentParameteriv, "glGetFramebufferAttachmentParameteriv" }, + { &__blue_glCore_glGenerateMipmap, "glGenerateMipmap" }, + { &__blue_glCore_glBlitFramebuffer, "glBlitFramebuffer" }, + { &__blue_glCore_glRenderbufferStorageMultisample, "glRenderbufferStorageMultisample" }, + { &__blue_glCore_glFramebufferTextureLayer, "glFramebufferTextureLayer" }, + { &__blue_glCore_glMapBufferRange, "glMapBufferRange" }, + { &__blue_glCore_glFlushMappedBufferRange, "glFlushMappedBufferRange" }, + { &__blue_glCore_glBindVertexArray, "glBindVertexArray" }, + { &__blue_glCore_glDeleteVertexArrays, "glDeleteVertexArrays" }, + { &__blue_glCore_glGenVertexArrays, "glGenVertexArrays" }, + { &__blue_glCore_glIsVertexArray, "glIsVertexArray" }, + { &__blue_glCore_glDrawArraysInstanced, "glDrawArraysInstanced" }, + { &__blue_glCore_glDrawElementsInstanced, "glDrawElementsInstanced" }, + { &__blue_glCore_glTexBuffer, "glTexBuffer" }, + { &__blue_glCore_glPrimitiveRestartIndex, "glPrimitiveRestartIndex" }, + { &__blue_glCore_glCopyBufferSubData, "glCopyBufferSubData" }, + { &__blue_glCore_glGetUniformIndices, "glGetUniformIndices" }, + { &__blue_glCore_glGetActiveUniformsiv, "glGetActiveUniformsiv" }, + { &__blue_glCore_glGetActiveUniformName, "glGetActiveUniformName" }, { &__blue_glCore_glGetUniformBlockIndex, "glGetUniformBlockIndex" }, - { &__blue_glCore_glClearColorxOES, "glClearColorxOES" }, - { &__blue_glCore_glPixelTransformParameteriEXT, "glPixelTransformParameteriEXT" }, - { &__blue_glCore_glNamedFramebufferTexture3DEXT, "glNamedFramebufferTexture3DEXT" }, - { &__blue_glCore_glTexCoord4xOES, "glTexCoord4xOES" }, - { &__blue_glCore_glGetUniformivARB, "glGetUniformivARB" }, - { &__blue_glCore_glNamedFramebufferTextureEXT, "glNamedFramebufferTextureEXT" }, - { &__blue_glCore_glDrawBuffers, "glDrawBuffers" }, - { &__blue_glCore_glWeightuivARB, "glWeightuivARB" }, - { &__blue_glCore_glMultiTexCoordP1ui, "glMultiTexCoordP1ui" }, - { &__blue_glCore_glCopyTexSubImage1DEXT, "glCopyTexSubImage1DEXT" }, - { &__blue_glCore_glVertexArrayAttribBinding, "glVertexArrayAttribBinding" }, - { &__blue_glCore_glVertexP4ui, "glVertexP4ui" }, - { &__blue_glCore_glVertex2hvNV, "glVertex2hvNV" }, - { &__blue_glCore_glDrawElementsInstancedBaseInstance, "glDrawElementsInstancedBaseInstance" }, - { &__blue_glCore_glNormalStream3sATI, "glNormalStream3sATI" }, - { &__blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN, "glTexCoord2fColor4fNormal3fVertex3fSUN" }, - { &__blue_glCore_glBindSamplers, "glBindSamplers" }, - { &__blue_glCore_glGetCompressedMultiTexImageEXT, "glGetCompressedMultiTexImageEXT" }, - { &__blue_glCore_glGetRenderbufferParameterivEXT, "glGetRenderbufferParameterivEXT" }, - { &__blue_glCore_glUniform3dv, "glUniform3dv" }, - { &__blue_glCore_glFlushRasterSGIX, "glFlushRasterSGIX" }, - { &__blue_glCore_glVertexAttribs3hvNV, "glVertexAttribs3hvNV" }, - { &__blue_glCore_glGetnSeparableFilterARB, "glGetnSeparableFilterARB" }, - { &__blue_glCore_glWindowPos2sARB, "glWindowPos2sARB" }, - { &__blue_glCore_glPopDebugGroup, "glPopDebugGroup" }, - { &__blue_glCore_glVideoCaptureNV, "glVideoCaptureNV" }, - { &__blue_glCore_glTangent3bEXT, "glTangent3bEXT" }, - { &__blue_glCore_glLinkProgram, "glLinkProgram" }, - { &__blue_glCore_glFogCoordPointerListIBM, "glFogCoordPointerListIBM" }, - { &__blue_glCore_glRotatexOES, "glRotatexOES" }, - { &__blue_glCore_glPathParameterivNV, "glPathParameterivNV" }, - { &__blue_glCore_glVertexAttribLPointerEXT, "glVertexAttribLPointerEXT" }, + { &__blue_glCore_glGetActiveUniformBlockiv, "glGetActiveUniformBlockiv" }, + { &__blue_glCore_glGetActiveUniformBlockName, "glGetActiveUniformBlockName" }, + { &__blue_glCore_glUniformBlockBinding, "glUniformBlockBinding" }, + { &__blue_glCore_glDrawElementsBaseVertex, "glDrawElementsBaseVertex" }, + { &__blue_glCore_glDrawRangeElementsBaseVertex, "glDrawRangeElementsBaseVertex" }, + { &__blue_glCore_glDrawElementsInstancedBaseVertex, "glDrawElementsInstancedBaseVertex" }, + { &__blue_glCore_glMultiDrawElementsBaseVertex, "glMultiDrawElementsBaseVertex" }, + { &__blue_glCore_glProvokingVertex, "glProvokingVertex" }, + { &__blue_glCore_glFenceSync, "glFenceSync" }, + { &__blue_glCore_glIsSync, "glIsSync" }, + { &__blue_glCore_glDeleteSync, "glDeleteSync" }, + { &__blue_glCore_glClientWaitSync, "glClientWaitSync" }, + { &__blue_glCore_glWaitSync, "glWaitSync" }, + { &__blue_glCore_glGetInteger64v, "glGetInteger64v" }, + { &__blue_glCore_glGetSynciv, "glGetSynciv" }, { &__blue_glCore_glGetInteger64i_v, "glGetInteger64i_v" }, - { &__blue_glCore_glCompressedMultiTexSubImage1DEXT, "glCompressedMultiTexSubImage1DEXT" }, - { &__blue_glCore_glConvolutionParameteriEXT, "glConvolutionParameteriEXT" }, - { &__blue_glCore_glNamedFramebufferTextureLayer, "glNamedFramebufferTextureLayer" }, - { &__blue_glCore_glWindowPos2sMESA, "glWindowPos2sMESA" }, - { &__blue_glCore_glCoverStrokePathInstancedNV, "glCoverStrokePathInstancedNV" }, - { &__blue_glCore_glTexParameteri, "glTexParameteri" }, - { &__blue_glCore_glUniform1uiv, "glUniform1uiv" }, - { &__blue_glCore_glMultiTexCoord4fv, "glMultiTexCoord4fv" }, - { &__blue_glCore_glProgramParameter4fvNV, "glProgramParameter4fvNV" }, - { &__blue_glCore_glDeformationMap3fSGIX, "glDeformationMap3fSGIX" }, - { &__blue_glCore_glBlendEquationiARB, "glBlendEquationiARB" }, - { &__blue_glCore_glStencilFunc, "glStencilFunc" }, - { &__blue_glCore_glFogCoordd, "glFogCoordd" }, - { &__blue_glCore_glUniform2iv, "glUniform2iv" }, - { &__blue_glCore_glUniform1i64NV, "glUniform1i64NV" }, - { &__blue_glCore_glTextureStorage2D, "glTextureStorage2D" }, - { &__blue_glCore_glTextureStorage2DMultisampleEXT, "glTextureStorage2DMultisampleEXT" }, - { &__blue_glCore_glCopyTexSubImage1D, "glCopyTexSubImage1D" }, - { &__blue_glCore_glSamplerParameterf, "glSamplerParameterf" }, - { &__blue_glCore_glDrawArraysInstancedBaseInstance, "glDrawArraysInstancedBaseInstance" }, - { &__blue_glCore_glVertexAttrib4uivARB, "glVertexAttrib4uivARB" }, - { &__blue_glCore_glVertexAttribFormatNV, "glVertexAttribFormatNV" }, - { &__blue_glCore_glIsQueryARB, "glIsQueryARB" }, - { &__blue_glCore_glSampleCoverageARB, "glSampleCoverageARB" }, - { &__blue_glCore_glGetnCompressedTexImageARB, "glGetnCompressedTexImageARB" }, - { &__blue_glCore_glTexCoord3xvOES, "glTexCoord3xvOES" }, - { &__blue_glCore_glTexCoord2fNormal3fVertex3fSUN, "glTexCoord2fNormal3fVertex3fSUN" }, - { &__blue_glCore_glGetGraphicsResetStatus, "glGetGraphicsResetStatus" }, - { &__blue_glCore_glProgramVertexLimitNV, "glProgramVertexLimitNV" }, - { &__blue_glCore_glCopyConvolutionFilter2D, "glCopyConvolutionFilter2D" }, - { &__blue_glCore_glVertexStream4fATI, "glVertexStream4fATI" }, - { &__blue_glCore_glSecondaryColor3f, "glSecondaryColor3f" }, - { &__blue_glCore_glTexCoordP1ui, "glTexCoordP1ui" }, - { &__blue_glCore_glProgramBufferParametersfvNV, "glProgramBufferParametersfvNV" }, - { &__blue_glCore_glTexCoord1xOES, "glTexCoord1xOES" }, - { &__blue_glCore_glFogCoordfv, "glFogCoordfv" }, - { &__blue_glCore_glMultiDrawElementsIndirectAMD, "glMultiDrawElementsIndirectAMD" }, - { &__blue_glCore_glGetnMinmaxARB, "glGetnMinmaxARB" }, - { &__blue_glCore_glSecondaryColor3uivEXT, "glSecondaryColor3uivEXT" }, - { &__blue_glCore_glColorMask, "glColorMask" }, - { &__blue_glCore_glTextureImage2DMultisampleCoverageNV, "glTextureImage2DMultisampleCoverageNV" }, - { &__blue_glCore_glMultiModeDrawElementsIBM, "glMultiModeDrawElementsIBM" }, - { &__blue_glCore_glVertexArrayAttribLFormat, "glVertexArrayAttribLFormat" }, + { &__blue_glCore_glGetBufferParameteri64v, "glGetBufferParameteri64v" }, + { &__blue_glCore_glFramebufferTexture, "glFramebufferTexture" }, + { &__blue_glCore_glTexImage2DMultisample, "glTexImage2DMultisample" }, + { &__blue_glCore_glTexImage3DMultisample, "glTexImage3DMultisample" }, + { &__blue_glCore_glGetMultisamplefv, "glGetMultisamplefv" }, + { &__blue_glCore_glSampleMaski, "glSampleMaski" }, { &__blue_glCore_glBindFragDataLocationIndexed, "glBindFragDataLocationIndexed" }, - { &__blue_glCore_glGetNamedBufferParameterivEXT, "glGetNamedBufferParameterivEXT" }, - { &__blue_glCore_glSecondaryColor3bEXT, "glSecondaryColor3bEXT" }, - { &__blue_glCore_glVertexAttrib1fNV, "glVertexAttrib1fNV" }, - { &__blue_glCore_glVertexAttribI4uivEXT, "glVertexAttribI4uivEXT" }, - { &__blue_glCore_glGetQueryObjecti64vEXT, "glGetQueryObjecti64vEXT" }, - { &__blue_glCore_glNormalStream3bATI, "glNormalStream3bATI" }, - { &__blue_glCore_glGetObjectParameterivAPPLE, "glGetObjectParameterivAPPLE" }, - { &__blue_glCore_glProgramUniform3uivEXT, "glProgramUniform3uivEXT" }, - { &__blue_glCore_glProgramUniformHandleui64ARB, "glProgramUniformHandleui64ARB" }, - { &__blue_glCore_glGetPointerv, "glGetPointerv" }, - { &__blue_glCore_glUniformMatrix4x3dv, "glUniformMatrix4x3dv" }, - { &__blue_glCore_glTexCoordP4uiv, "glTexCoordP4uiv" }, - { &__blue_glCore_glVertexAttribI4sv, "glVertexAttribI4sv" }, - { &__blue_glCore_glFlushMappedNamedBufferRangeEXT, "glFlushMappedNamedBufferRangeEXT" }, - { &__blue_glCore_glDisableVertexArrayEXT, "glDisableVertexArrayEXT" }, - { &__blue_glCore_glGetPathDashArrayNV, "glGetPathDashArrayNV" }, - { &__blue_glCore_glProgramUniform2uiEXT, "glProgramUniform2uiEXT" }, - { &__blue_glCore_glBindImageTextures, "glBindImageTextures" }, - { &__blue_glCore_glVertexAttrib4sNV, "glVertexAttrib4sNV" }, - { &__blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN, "glReplacementCodeuiNormal3fVertex3fvSUN" }, - { &__blue_glCore_glVertex3hNV, "glVertex3hNV" }, - { &__blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN, "glReplacementCodeuiColor4fNormal3fVertex3fSUN" }, - { &__blue_glCore_glProgramUniform2i64NV, "glProgramUniform2i64NV" }, - { &__blue_glCore_glBufferData, "glBufferData" }, - { &__blue_glCore_glGetBufferParameteriv, "glGetBufferParameteriv" }, - { &__blue_glCore_glIsAsyncMarkerSGIX, "glIsAsyncMarkerSGIX" }, - { &__blue_glCore_glTexImage4DSGIS, "glTexImage4DSGIS" }, - { &__blue_glCore_glGetMultiTexEnvivEXT, "glGetMultiTexEnvivEXT" }, - { &__blue_glCore_glGetClipPlanexOES, "glGetClipPlanexOES" }, - { &__blue_glCore_glUniform3uiEXT, "glUniform3uiEXT" }, - { &__blue_glCore_glMultiTexCoord3sv, "glMultiTexCoord3sv" }, - { &__blue_glCore_glVertexAttribs1hvNV, "glVertexAttribs1hvNV" }, - { &__blue_glCore_glGetPerfQueryInfoINTEL, "glGetPerfQueryInfoINTEL" }, - { &__blue_glCore_glGetClipPlanefOES, "glGetClipPlanefOES" }, - { &__blue_glCore_glSecondaryColor3ubEXT, "glSecondaryColor3ubEXT" }, - { &__blue_glCore_glSyncTextureINTEL, "glSyncTextureINTEL" }, - { &__blue_glCore_glProgramUniformMatrix3x2dv, "glProgramUniformMatrix3x2dv" }, - { &__blue_glCore_glUniformMatrix4x2fv, "glUniformMatrix4x2fv" }, - { &__blue_glCore_glTextureBufferEXT, "glTextureBufferEXT" }, - { &__blue_glCore_glVertexPointervINTEL, "glVertexPointervINTEL" }, - { &__blue_glCore_glGetShaderPrecisionFormat, "glGetShaderPrecisionFormat" }, - { &__blue_glCore_glGetTextureImage, "glGetTextureImage" }, - { &__blue_glCore_glUniform3ivARB, "glUniform3ivARB" }, - { &__blue_glCore_glFramebufferParameteri, "glFramebufferParameteri" }, - { &__blue_glCore_glPointParameterxvOES, "glPointParameterxvOES" }, + { &__blue_glCore_glGetFragDataIndex, "glGetFragDataIndex" }, + { &__blue_glCore_glGenSamplers, "glGenSamplers" }, + { &__blue_glCore_glDeleteSamplers, "glDeleteSamplers" }, + { &__blue_glCore_glIsSampler, "glIsSampler" }, + { &__blue_glCore_glBindSampler, "glBindSampler" }, + { &__blue_glCore_glSamplerParameteri, "glSamplerParameteri" }, + { &__blue_glCore_glSamplerParameteriv, "glSamplerParameteriv" }, + { &__blue_glCore_glSamplerParameterf, "glSamplerParameterf" }, + { &__blue_glCore_glSamplerParameterfv, "glSamplerParameterfv" }, + { &__blue_glCore_glSamplerParameterIiv, "glSamplerParameterIiv" }, + { &__blue_glCore_glSamplerParameterIuiv, "glSamplerParameterIuiv" }, + { &__blue_glCore_glGetSamplerParameteriv, "glGetSamplerParameteriv" }, + { &__blue_glCore_glGetSamplerParameterIiv, "glGetSamplerParameterIiv" }, + { &__blue_glCore_glGetSamplerParameterfv, "glGetSamplerParameterfv" }, + { &__blue_glCore_glGetSamplerParameterIuiv, "glGetSamplerParameterIuiv" }, + { &__blue_glCore_glQueryCounter, "glQueryCounter" }, + { &__blue_glCore_glGetQueryObjecti64v, "glGetQueryObjecti64v" }, + { &__blue_glCore_glGetQueryObjectui64v, "glGetQueryObjectui64v" }, + { &__blue_glCore_glVertexAttribDivisor, "glVertexAttribDivisor" }, + { &__blue_glCore_glVertexAttribP1ui, "glVertexAttribP1ui" }, + { &__blue_glCore_glVertexAttribP1uiv, "glVertexAttribP1uiv" }, + { &__blue_glCore_glVertexAttribP2ui, "glVertexAttribP2ui" }, + { &__blue_glCore_glVertexAttribP2uiv, "glVertexAttribP2uiv" }, + { &__blue_glCore_glVertexAttribP3ui, "glVertexAttribP3ui" }, + { &__blue_glCore_glVertexAttribP3uiv, "glVertexAttribP3uiv" }, + { &__blue_glCore_glVertexAttribP4ui, "glVertexAttribP4ui" }, + { &__blue_glCore_glVertexAttribP4uiv, "glVertexAttribP4uiv" }, + { &__blue_glCore_glMinSampleShading, "glMinSampleShading" }, + { &__blue_glCore_glBlendEquationi, "glBlendEquationi" }, + { &__blue_glCore_glBlendEquationSeparatei, "glBlendEquationSeparatei" }, { &__blue_glCore_glBlendFunci, "glBlendFunci" }, + { &__blue_glCore_glBlendFuncSeparatei, "glBlendFuncSeparatei" }, + { &__blue_glCore_glDrawArraysIndirect, "glDrawArraysIndirect" }, + { &__blue_glCore_glDrawElementsIndirect, "glDrawElementsIndirect" }, + { &__blue_glCore_glUniform1d, "glUniform1d" }, + { &__blue_glCore_glUniform2d, "glUniform2d" }, + { &__blue_glCore_glUniform3d, "glUniform3d" }, + { &__blue_glCore_glUniform4d, "glUniform4d" }, + { &__blue_glCore_glUniform1dv, "glUniform1dv" }, + { &__blue_glCore_glUniform2dv, "glUniform2dv" }, + { &__blue_glCore_glUniform3dv, "glUniform3dv" }, + { &__blue_glCore_glUniform4dv, "glUniform4dv" }, + { &__blue_glCore_glUniformMatrix2dv, "glUniformMatrix2dv" }, + { &__blue_glCore_glUniformMatrix3dv, "glUniformMatrix3dv" }, + { &__blue_glCore_glUniformMatrix4dv, "glUniformMatrix4dv" }, { &__blue_glCore_glUniformMatrix2x3dv, "glUniformMatrix2x3dv" }, - { &__blue_glCore_glUniform2i64ARB, "glUniform2i64ARB" }, - { &__blue_glCore_glProgramEnvParameterI4ivNV, "glProgramEnvParameterI4ivNV" }, - { &__blue_glCore_glFragmentLightModelivSGIX, "glFragmentLightModelivSGIX" }, - { &__blue_glCore_glProgramUniform4ui64vARB, "glProgramUniform4ui64vARB" }, - { &__blue_glCore_glProgramUniformMatrix2x3fvEXT, "glProgramUniformMatrix2x3fvEXT" }, - { &__blue_glCore_glStencilClearTagEXT, "glStencilClearTagEXT" }, - { &__blue_glCore_glMultiTexCoord4s, "glMultiTexCoord4s" }, - { &__blue_glCore_glProgramUniformMatrix4dvEXT, "glProgramUniformMatrix4dvEXT" }, - { &__blue_glCore_glGetNamedBufferParameteri64v, "glGetNamedBufferParameteri64v" }, - { &__blue_glCore_glVertexAttribI3iEXT, "glVertexAttribI3iEXT" }, - { &__blue_glCore_glReplacementCodeuivSUN, "glReplacementCodeuivSUN" }, - { &__blue_glCore_glFragmentLightModeliSGIX, "glFragmentLightModeliSGIX" }, - { &__blue_glCore_glUniform2i64vNV, "glUniform2i64vNV" }, - { &__blue_glCore_glPointParameterivNV, "glPointParameterivNV" }, - { &__blue_glCore_glStencilStrokePathInstancedNV, "glStencilStrokePathInstancedNV" }, - { &__blue_glCore_glInsertComponentEXT, "glInsertComponentEXT" }, - { &__blue_glCore_glIsEnabled, "glIsEnabled" }, - { &__blue_glCore_glWindowPos3dMESA, "glWindowPos3dMESA" }, - { &__blue_glCore_glGetnCompressedTexImage, "glGetnCompressedTexImage" }, - { &__blue_glCore_glCopyMultiTexSubImage2DEXT, "glCopyMultiTexSubImage2DEXT" }, - { &__blue_glCore_glDisableIndexedEXT, "glDisableIndexedEXT" }, - { &__blue_glCore_glWindowPos2dv, "glWindowPos2dv" }, - { &__blue_glCore_glAlphaFuncxOES, "glAlphaFuncxOES" }, - { &__blue_glCore_glCreateFramebuffers, "glCreateFramebuffers" }, - { &__blue_glCore_glGetAttribLocationARB, "glGetAttribLocationARB" }, - { &__blue_glCore_glVertexAttrib1sARB, "glVertexAttrib1sARB" }, - { &__blue_glCore_glTexBumpParameterfvATI, "glTexBumpParameterfvATI" }, + { &__blue_glCore_glUniformMatrix2x4dv, "glUniformMatrix2x4dv" }, + { &__blue_glCore_glUniformMatrix3x2dv, "glUniformMatrix3x2dv" }, + { &__blue_glCore_glUniformMatrix3x4dv, "glUniformMatrix3x4dv" }, + { &__blue_glCore_glUniformMatrix4x2dv, "glUniformMatrix4x2dv" }, + { &__blue_glCore_glUniformMatrix4x3dv, "glUniformMatrix4x3dv" }, + { &__blue_glCore_glGetUniformdv, "glGetUniformdv" }, + { &__blue_glCore_glGetSubroutineUniformLocation, "glGetSubroutineUniformLocation" }, + { &__blue_glCore_glGetSubroutineIndex, "glGetSubroutineIndex" }, { &__blue_glCore_glGetActiveSubroutineUniformiv, "glGetActiveSubroutineUniformiv" }, - { &__blue_glCore_glVertexAttrib2fARB, "glVertexAttrib2fARB" }, - { &__blue_glCore_glGetTransformFeedbacki64_v, "glGetTransformFeedbacki64_v" }, - { &__blue_glCore_glMultiTexCoord4hvNV, "glMultiTexCoord4hvNV" }, - { &__blue_glCore_glBlendColorEXT, "glBlendColorEXT" }, - { &__blue_glCore_glCompressedTexSubImage3D, "glCompressedTexSubImage3D" }, - { &__blue_glCore_glVertexStream4dvATI, "glVertexStream4dvATI" }, - { &__blue_glCore_glMaxShaderCompilerThreadsARB, "glMaxShaderCompilerThreadsARB" }, - { &__blue_glCore_glGlobalAlphaFactorbSUN, "glGlobalAlphaFactorbSUN" }, - { &__blue_glCore_glGlobalAlphaFactoruiSUN, "glGlobalAlphaFactoruiSUN" }, - { &__blue_glCore_glClientActiveTextureARB, "glClientActiveTextureARB" }, - { &__blue_glCore_glGenProgramsARB, "glGenProgramsARB" }, - { &__blue_glCore_glGetTexParameterPointervAPPLE, "glGetTexParameterPointervAPPLE" }, - { &__blue_glCore_glGetBooleanv, "glGetBooleanv" }, - { &__blue_glCore_glDrawElementsBaseVertex, "glDrawElementsBaseVertex" }, - { &__blue_glCore_glVertexAttribL4ui64vNV, "glVertexAttribL4ui64vNV" }, - { &__blue_glCore_glSecondaryColor3fvEXT, "glSecondaryColor3fvEXT" }, - { &__blue_glCore_glMultiTexCoord1s, "glMultiTexCoord1s" }, - { &__blue_glCore_glDeleteProgramsARB, "glDeleteProgramsARB" }, - { &__blue_glCore_glDrawElementsInstancedBaseVertex, "glDrawElementsInstancedBaseVertex" }, - { &__blue_glCore_glProgramUniform4dEXT, "glProgramUniform4dEXT" }, - { &__blue_glCore_glGetPathMetricRangeNV, "glGetPathMetricRangeNV" }, - { &__blue_glCore_glProgramUniform3iEXT, "glProgramUniform3iEXT" }, - { &__blue_glCore_glDeleteBuffers, "glDeleteBuffers" }, - { &__blue_glCore_glSecondaryColor3usEXT, "glSecondaryColor3usEXT" }, - { &__blue_glCore_glDepthMask, "glDepthMask" }, - { &__blue_glCore_glMultiTexCoord2dv, "glMultiTexCoord2dv" }, - { &__blue_glCore_glCopyConvolutionFilter2DEXT, "glCopyConvolutionFilter2DEXT" }, - { &__blue_glCore_glLoadTransposeMatrixxOES, "glLoadTransposeMatrixxOES" }, - { &__blue_glCore_glPixelStoref, "glPixelStoref" }, - { &__blue_glCore_glStencilOpSeparateATI, "glStencilOpSeparateATI" }, - { &__blue_glCore_glCopyTextureSubImage1DEXT, "glCopyTextureSubImage1DEXT" }, - { &__blue_glCore_glMatrixScaledEXT, "glMatrixScaledEXT" }, - { &__blue_glCore_glProgramUniform2i64ARB, "glProgramUniform2i64ARB" }, - { &__blue_glCore_glTextureParameterfEXT, "glTextureParameterfEXT" }, - { &__blue_glCore_glGetProgramLocalParameterIivNV, "glGetProgramLocalParameterIivNV" }, - { &__blue_glCore_glGetShaderInfoLog, "glGetShaderInfoLog" }, - { &__blue_glCore_glTexCoordP2uiv, "glTexCoordP2uiv" }, - { &__blue_glCore_glDebugMessageCallback, "glDebugMessageCallback" }, - { &__blue_glCore_glLoadTransposeMatrixfARB, "glLoadTransposeMatrixfARB" }, - { &__blue_glCore_glUniform1ui, "glUniform1ui" }, - { &__blue_glCore_glVertexAttribL4dvEXT, "glVertexAttribL4dvEXT" }, - { &__blue_glCore_glVertex3bvOES, "glVertex3bvOES" }, - { &__blue_glCore_glPassThroughxOES, "glPassThroughxOES" }, - { &__blue_glCore_glGetFloatIndexedvEXT, "glGetFloatIndexedvEXT" }, - { &__blue_glCore_glSubpixelPrecisionBiasNV, "glSubpixelPrecisionBiasNV" }, - { &__blue_glCore_glFinishFenceNV, "glFinishFenceNV" }, - { &__blue_glCore_glGetProgramBinary, "glGetProgramBinary" }, - { &__blue_glCore_glBlendFuncSeparateIndexedAMD, "glBlendFuncSeparateIndexedAMD" }, - { &__blue_glCore_glBlendFuncSeparate, "glBlendFuncSeparate" }, - { &__blue_glCore_glIndexxvOES, "glIndexxvOES" }, - { &__blue_glCore_glVertexAttrib4NuivARB, "glVertexAttrib4NuivARB" }, - { &__blue_glCore_glUniform2ui64ARB, "glUniform2ui64ARB" }, - { &__blue_glCore_glEndPerfMonitorAMD, "glEndPerfMonitorAMD" }, + { &__blue_glCore_glGetActiveSubroutineUniformName, "glGetActiveSubroutineUniformName" }, + { &__blue_glCore_glGetActiveSubroutineName, "glGetActiveSubroutineName" }, + { &__blue_glCore_glUniformSubroutinesuiv, "glUniformSubroutinesuiv" }, + { &__blue_glCore_glGetUniformSubroutineuiv, "glGetUniformSubroutineuiv" }, + { &__blue_glCore_glGetProgramStageiv, "glGetProgramStageiv" }, + { &__blue_glCore_glPatchParameteri, "glPatchParameteri" }, + { &__blue_glCore_glPatchParameterfv, "glPatchParameterfv" }, + { &__blue_glCore_glBindTransformFeedback, "glBindTransformFeedback" }, + { &__blue_glCore_glDeleteTransformFeedbacks, "glDeleteTransformFeedbacks" }, + { &__blue_glCore_glGenTransformFeedbacks, "glGenTransformFeedbacks" }, + { &__blue_glCore_glIsTransformFeedback, "glIsTransformFeedback" }, + { &__blue_glCore_glPauseTransformFeedback, "glPauseTransformFeedback" }, + { &__blue_glCore_glResumeTransformFeedback, "glResumeTransformFeedback" }, + { &__blue_glCore_glDrawTransformFeedback, "glDrawTransformFeedback" }, + { &__blue_glCore_glDrawTransformFeedbackStream, "glDrawTransformFeedbackStream" }, + { &__blue_glCore_glBeginQueryIndexed, "glBeginQueryIndexed" }, + { &__blue_glCore_glEndQueryIndexed, "glEndQueryIndexed" }, + { &__blue_glCore_glGetQueryIndexediv, "glGetQueryIndexediv" }, { &__blue_glCore_glReleaseShaderCompiler, "glReleaseShaderCompiler" }, - { &__blue_glCore_glGenFramebuffersEXT, "glGenFramebuffersEXT" }, - { &__blue_glCore_glUniform2uiv, "glUniform2uiv" }, - { &__blue_glCore_glGenSymbolsEXT, "glGenSymbolsEXT" }, - { &__blue_glCore_glVertexAttribIPointer, "glVertexAttribIPointer" }, - { &__blue_glCore_glUniformMatrix3x4fv, "glUniformMatrix3x4fv" }, - { &__blue_glCore_glTexCoord3bOES, "glTexCoord3bOES" }, - { &__blue_glCore_glVDPAUUnmapSurfacesNV, "glVDPAUUnmapSurfacesNV" }, - { &__blue_glCore_glProgramUniform4ui64NV, "glProgramUniform4ui64NV" }, - { &__blue_glCore_glUniformHandleui64NV, "glUniformHandleui64NV" }, - { &__blue_glCore_glGetStageIndexNV, "glGetStageIndexNV" }, - { &__blue_glCore_glMultiTexCoord3fvARB, "glMultiTexCoord3fvARB" }, - { &__blue_glCore_glBindBufferOffsetEXT, "glBindBufferOffsetEXT" }, - { &__blue_glCore_glVertexAttribL4dv, "glVertexAttribL4dv" }, - { &__blue_glCore_glClearStencil, "glClearStencil" }, - { &__blue_glCore_glWindowPos2ivMESA, "glWindowPos2ivMESA" }, - { &__blue_glCore_glReplacementCodeubvSUN, "glReplacementCodeubvSUN" }, - { &__blue_glCore_glClipPlanefOES, "glClipPlanefOES" }, - { &__blue_glCore_glMultiTexCoord1xOES, "glMultiTexCoord1xOES" }, - { &__blue_glCore_glGetProgramInfoLog, "glGetProgramInfoLog" }, - { &__blue_glCore_glEndFragmentShaderATI, "glEndFragmentShaderATI" }, - { &__blue_glCore_glGetTransformFeedbackVaryingNV, "glGetTransformFeedbackVaryingNV" }, - { &__blue_glCore_glProgramUniformMatrix4x2dv, "glProgramUniformMatrix4x2dv" }, - { &__blue_glCore_glResetHistogramEXT, "glResetHistogramEXT" }, - { &__blue_glCore_glUniform1i64vNV, "glUniform1i64vNV" }, - { &__blue_glCore_glProgramEnvParameter4dARB, "glProgramEnvParameter4dARB" }, - { &__blue_glCore_glCopyTextureSubImage2DEXT, "glCopyTextureSubImage2DEXT" }, - { &__blue_glCore_glGetCombinerInputParameterivNV, "glGetCombinerInputParameterivNV" }, - { &__blue_glCore_glUniformMatrix4fv, "glUniformMatrix4fv" }, - { &__blue_glCore_glGenQueriesARB, "glGenQueriesARB" }, - { &__blue_glCore_glGetnSeparableFilter, "glGetnSeparableFilter" }, - { &__blue_glCore_glUniform3ui64vARB, "glUniform3ui64vARB" }, - { &__blue_glCore_glMultiTexCoord1i, "glMultiTexCoord1i" }, - { &__blue_glCore_glColorTable, "glColorTable" }, - { &__blue_glCore_glVertexAttribs4ubvNV, "glVertexAttribs4ubvNV" }, + { &__blue_glCore_glShaderBinary, "glShaderBinary" }, + { &__blue_glCore_glGetShaderPrecisionFormat, "glGetShaderPrecisionFormat" }, + { &__blue_glCore_glDepthRangef, "glDepthRangef" }, + { &__blue_glCore_glClearDepthf, "glClearDepthf" }, + { &__blue_glCore_glGetProgramBinary, "glGetProgramBinary" }, + { &__blue_glCore_glProgramBinary, "glProgramBinary" }, + { &__blue_glCore_glProgramParameteri, "glProgramParameteri" }, + { &__blue_glCore_glUseProgramStages, "glUseProgramStages" }, + { &__blue_glCore_glActiveShaderProgram, "glActiveShaderProgram" }, + { &__blue_glCore_glCreateShaderProgramv, "glCreateShaderProgramv" }, + { &__blue_glCore_glBindProgramPipeline, "glBindProgramPipeline" }, + { &__blue_glCore_glDeleteProgramPipelines, "glDeleteProgramPipelines" }, + { &__blue_glCore_glGenProgramPipelines, "glGenProgramPipelines" }, + { &__blue_glCore_glIsProgramPipeline, "glIsProgramPipeline" }, + { &__blue_glCore_glGetProgramPipelineiv, "glGetProgramPipelineiv" }, + { &__blue_glCore_glProgramUniform1i, "glProgramUniform1i" }, + { &__blue_glCore_glProgramUniform1iv, "glProgramUniform1iv" }, + { &__blue_glCore_glProgramUniform1f, "glProgramUniform1f" }, + { &__blue_glCore_glProgramUniform1fv, "glProgramUniform1fv" }, + { &__blue_glCore_glProgramUniform1d, "glProgramUniform1d" }, + { &__blue_glCore_glProgramUniform1dv, "glProgramUniform1dv" }, + { &__blue_glCore_glProgramUniform1ui, "glProgramUniform1ui" }, + { &__blue_glCore_glProgramUniform1uiv, "glProgramUniform1uiv" }, + { &__blue_glCore_glProgramUniform2i, "glProgramUniform2i" }, + { &__blue_glCore_glProgramUniform2iv, "glProgramUniform2iv" }, + { &__blue_glCore_glProgramUniform2f, "glProgramUniform2f" }, + { &__blue_glCore_glProgramUniform2fv, "glProgramUniform2fv" }, + { &__blue_glCore_glProgramUniform2d, "glProgramUniform2d" }, + { &__blue_glCore_glProgramUniform2dv, "glProgramUniform2dv" }, + { &__blue_glCore_glProgramUniform2ui, "glProgramUniform2ui" }, + { &__blue_glCore_glProgramUniform2uiv, "glProgramUniform2uiv" }, + { &__blue_glCore_glProgramUniform3i, "glProgramUniform3i" }, + { &__blue_glCore_glProgramUniform3iv, "glProgramUniform3iv" }, + { &__blue_glCore_glProgramUniform3f, "glProgramUniform3f" }, + { &__blue_glCore_glProgramUniform3fv, "glProgramUniform3fv" }, + { &__blue_glCore_glProgramUniform3d, "glProgramUniform3d" }, + { &__blue_glCore_glProgramUniform3dv, "glProgramUniform3dv" }, + { &__blue_glCore_glProgramUniform3ui, "glProgramUniform3ui" }, { &__blue_glCore_glProgramUniform3uiv, "glProgramUniform3uiv" }, + { &__blue_glCore_glProgramUniform4i, "glProgramUniform4i" }, + { &__blue_glCore_glProgramUniform4iv, "glProgramUniform4iv" }, + { &__blue_glCore_glProgramUniform4f, "glProgramUniform4f" }, + { &__blue_glCore_glProgramUniform4fv, "glProgramUniform4fv" }, + { &__blue_glCore_glProgramUniform4d, "glProgramUniform4d" }, + { &__blue_glCore_glProgramUniform4dv, "glProgramUniform4dv" }, + { &__blue_glCore_glProgramUniform4ui, "glProgramUniform4ui" }, + { &__blue_glCore_glProgramUniform4uiv, "glProgramUniform4uiv" }, + { &__blue_glCore_glProgramUniformMatrix2fv, "glProgramUniformMatrix2fv" }, + { &__blue_glCore_glProgramUniformMatrix3fv, "glProgramUniformMatrix3fv" }, + { &__blue_glCore_glProgramUniformMatrix4fv, "glProgramUniformMatrix4fv" }, + { &__blue_glCore_glProgramUniformMatrix2dv, "glProgramUniformMatrix2dv" }, + { &__blue_glCore_glProgramUniformMatrix3dv, "glProgramUniformMatrix3dv" }, + { &__blue_glCore_glProgramUniformMatrix4dv, "glProgramUniformMatrix4dv" }, + { &__blue_glCore_glProgramUniformMatrix2x3fv, "glProgramUniformMatrix2x3fv" }, { &__blue_glCore_glProgramUniformMatrix3x2fv, "glProgramUniformMatrix3x2fv" }, - { &__blue_glCore_glUnmapBuffer, "glUnmapBuffer" }, - { &__blue_glCore_glBindTextureUnit, "glBindTextureUnit" }, - { &__blue_glCore_glTextureParameterIuivEXT, "glTextureParameterIuivEXT" }, - { &__blue_glCore_glVertexAttribDivisor, "glVertexAttribDivisor" }, - { &__blue_glCore_glSamplerParameterIiv, "glSamplerParameterIiv" }, - { &__blue_glCore_glGetDebugMessageLog, "glGetDebugMessageLog" }, - { &__blue_glCore_glSelectPerfMonitorCountersAMD, "glSelectPerfMonitorCountersAMD" }, - { &__blue_glCore_glVertexAttribI2i, "glVertexAttribI2i" }, - { &__blue_glCore_glDepthRangedNV, "glDepthRangedNV" }, - { &__blue_glCore_glTextureRangeAPPLE, "glTextureRangeAPPLE" }, - { &__blue_glCore_glEvalCoord2xOES, "glEvalCoord2xOES" }, - { &__blue_glCore_glCallCommandListNV, "glCallCommandListNV" }, - { &__blue_glCore_glVariantdvEXT, "glVariantdvEXT" }, - { &__blue_glCore_glBlendColorxOES, "glBlendColorxOES" }, - { &__blue_glCore_glFramebufferTexture2DEXT, "glFramebufferTexture2DEXT" }, - { &__blue_glCore_glGetString, "glGetString" }, - { &__blue_glCore_glVertexStream3iATI, "glVertexStream3iATI" }, - { &__blue_glCore_glHintPGI, "glHintPGI" }, - { &__blue_glCore_glGenPerfMonitorsAMD, "glGenPerfMonitorsAMD" }, - { &__blue_glCore_glTextureSubImage3DEXT, "glTextureSubImage3DEXT" }, - { &__blue_glCore_glVertexAttrib4usvARB, "glVertexAttrib4usvARB" }, - { &__blue_glCore_glVertexArrayBindVertexBufferEXT, "glVertexArrayBindVertexBufferEXT" }, - { &__blue_glCore_glMinSampleShading, "glMinSampleShading" }, - { &__blue_glCore_glIsPathNV, "glIsPathNV" }, - { &__blue_glCore_glGetPathTexGenivNV, "glGetPathTexGenivNV" }, - { &__blue_glCore_glProgramUniform3fv, "glProgramUniform3fv" }, - { &__blue_glCore_glVertexAttrib3sv, "glVertexAttrib3sv" }, - { &__blue_glCore_glGetUniformuiv, "glGetUniformuiv" }, - { &__blue_glCore_glGetPixelTransformParameterfvEXT, "glGetPixelTransformParameterfvEXT" }, - { &__blue_glCore_glMultiTexCoord3dv, "glMultiTexCoord3dv" }, - { &__blue_glCore_glVertexAttrib3fvARB, "glVertexAttrib3fvARB" }, + { &__blue_glCore_glProgramUniformMatrix2x4fv, "glProgramUniformMatrix2x4fv" }, + { &__blue_glCore_glProgramUniformMatrix4x2fv, "glProgramUniformMatrix4x2fv" }, + { &__blue_glCore_glProgramUniformMatrix3x4fv, "glProgramUniformMatrix3x4fv" }, + { &__blue_glCore_glProgramUniformMatrix4x3fv, "glProgramUniformMatrix4x3fv" }, + { &__blue_glCore_glProgramUniformMatrix2x3dv, "glProgramUniformMatrix2x3dv" }, + { &__blue_glCore_glProgramUniformMatrix3x2dv, "glProgramUniformMatrix3x2dv" }, + { &__blue_glCore_glProgramUniformMatrix2x4dv, "glProgramUniformMatrix2x4dv" }, + { &__blue_glCore_glProgramUniformMatrix4x2dv, "glProgramUniformMatrix4x2dv" }, + { &__blue_glCore_glProgramUniformMatrix3x4dv, "glProgramUniformMatrix3x4dv" }, + { &__blue_glCore_glProgramUniformMatrix4x3dv, "glProgramUniformMatrix4x3dv" }, + { &__blue_glCore_glValidateProgramPipeline, "glValidateProgramPipeline" }, + { &__blue_glCore_glGetProgramPipelineInfoLog, "glGetProgramPipelineInfoLog" }, + { &__blue_glCore_glVertexAttribL1d, "glVertexAttribL1d" }, + { &__blue_glCore_glVertexAttribL2d, "glVertexAttribL2d" }, + { &__blue_glCore_glVertexAttribL3d, "glVertexAttribL3d" }, + { &__blue_glCore_glVertexAttribL4d, "glVertexAttribL4d" }, + { &__blue_glCore_glVertexAttribL1dv, "glVertexAttribL1dv" }, + { &__blue_glCore_glVertexAttribL2dv, "glVertexAttribL2dv" }, + { &__blue_glCore_glVertexAttribL3dv, "glVertexAttribL3dv" }, + { &__blue_glCore_glVertexAttribL4dv, "glVertexAttribL4dv" }, + { &__blue_glCore_glVertexAttribLPointer, "glVertexAttribLPointer" }, + { &__blue_glCore_glGetVertexAttribLdv, "glGetVertexAttribLdv" }, + { &__blue_glCore_glViewportArrayv, "glViewportArrayv" }, + { &__blue_glCore_glViewportIndexedf, "glViewportIndexedf" }, + { &__blue_glCore_glViewportIndexedfv, "glViewportIndexedfv" }, + { &__blue_glCore_glScissorArrayv, "glScissorArrayv" }, + { &__blue_glCore_glScissorIndexed, "glScissorIndexed" }, + { &__blue_glCore_glScissorIndexedv, "glScissorIndexedv" }, + { &__blue_glCore_glDepthRangeArrayv, "glDepthRangeArrayv" }, + { &__blue_glCore_glDepthRangeIndexed, "glDepthRangeIndexed" }, + { &__blue_glCore_glGetFloati_v, "glGetFloati_v" }, + { &__blue_glCore_glGetDoublei_v, "glGetDoublei_v" }, + { &__blue_glCore_glDrawArraysInstancedBaseInstance, "glDrawArraysInstancedBaseInstance" }, + { &__blue_glCore_glDrawElementsInstancedBaseInstance, "glDrawElementsInstancedBaseInstance" }, + { &__blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance, "glDrawElementsInstancedBaseVertexBaseInstance" }, + { &__blue_glCore_glGetInternalformativ, "glGetInternalformativ" }, + { &__blue_glCore_glGetActiveAtomicCounterBufferiv, "glGetActiveAtomicCounterBufferiv" }, + { &__blue_glCore_glBindImageTexture, "glBindImageTexture" }, + { &__blue_glCore_glMemoryBarrier, "glMemoryBarrier" }, + { &__blue_glCore_glTexStorage1D, "glTexStorage1D" }, + { &__blue_glCore_glTexStorage2D, "glTexStorage2D" }, + { &__blue_glCore_glTexStorage3D, "glTexStorage3D" }, + { &__blue_glCore_glDrawTransformFeedbackInstanced, "glDrawTransformFeedbackInstanced" }, + { &__blue_glCore_glDrawTransformFeedbackStreamInstanced, "glDrawTransformFeedbackStreamInstanced" }, + { &__blue_glCore_glClearBufferData, "glClearBufferData" }, + { &__blue_glCore_glClearBufferSubData, "glClearBufferSubData" }, + { &__blue_glCore_glDispatchCompute, "glDispatchCompute" }, + { &__blue_glCore_glDispatchComputeIndirect, "glDispatchComputeIndirect" }, + { &__blue_glCore_glCopyImageSubData, "glCopyImageSubData" }, + { &__blue_glCore_glFramebufferParameteri, "glFramebufferParameteri" }, + { &__blue_glCore_glGetFramebufferParameteriv, "glGetFramebufferParameteriv" }, + { &__blue_glCore_glGetInternalformati64v, "glGetInternalformati64v" }, + { &__blue_glCore_glInvalidateTexSubImage, "glInvalidateTexSubImage" }, + { &__blue_glCore_glInvalidateTexImage, "glInvalidateTexImage" }, + { &__blue_glCore_glInvalidateBufferSubData, "glInvalidateBufferSubData" }, + { &__blue_glCore_glInvalidateBufferData, "glInvalidateBufferData" }, + { &__blue_glCore_glInvalidateFramebuffer, "glInvalidateFramebuffer" }, + { &__blue_glCore_glInvalidateSubFramebuffer, "glInvalidateSubFramebuffer" }, + { &__blue_glCore_glMultiDrawArraysIndirect, "glMultiDrawArraysIndirect" }, + { &__blue_glCore_glMultiDrawElementsIndirect, "glMultiDrawElementsIndirect" }, + { &__blue_glCore_glGetProgramInterfaceiv, "glGetProgramInterfaceiv" }, { &__blue_glCore_glGetProgramResourceIndex, "glGetProgramResourceIndex" }, - { &__blue_glCore_glGetMinmaxParameteriv, "glGetMinmaxParameteriv" }, - { &__blue_glCore_glConvolutionParameterfEXT, "glConvolutionParameterfEXT" }, - { &__blue_glCore_glProgramUniform4i64NV, "glProgramUniform4i64NV" }, - { &__blue_glCore_glProgramUniformMatrix4fvEXT, "glProgramUniformMatrix4fvEXT" }, - { &__blue_glCore_glMultiTexCoordP4ui, "glMultiTexCoordP4ui" }, - { &__blue_glCore_glEnableVertexAttribAPPLE, "glEnableVertexAttribAPPLE" }, - { &__blue_glCore_glTexCoordP3uiv, "glTexCoordP3uiv" }, - { &__blue_glCore_glCoverageModulationNV, "glCoverageModulationNV" }, - { &__blue_glCore_glMultiTexCoord3ivARB, "glMultiTexCoord3ivARB" }, - { &__blue_glCore_glListParameterfvSGIX, "glListParameterfvSGIX" }, - { &__blue_glCore_glNormal3fVertex3fvSUN, "glNormal3fVertex3fvSUN" }, - { &__blue_glCore_glVertexAttrib4bv, "glVertexAttrib4bv" }, - { &__blue_glCore_glTexParameterIiv, "glTexParameterIiv" }, - { &__blue_glCore_glNamedFramebufferParameteri, "glNamedFramebufferParameteri" }, - { &__blue_glCore_glGetFramebufferParameterivEXT, "glGetFramebufferParameterivEXT" }, - { &__blue_glCore_glReplacementCodeubSUN, "glReplacementCodeubSUN" }, - { &__blue_glCore_glTexCoord2bvOES, "glTexCoord2bvOES" }, - { &__blue_glCore_glGetVideoui64vNV, "glGetVideoui64vNV" }, + { &__blue_glCore_glGetProgramResourceName, "glGetProgramResourceName" }, + { &__blue_glCore_glGetProgramResourceiv, "glGetProgramResourceiv" }, + { &__blue_glCore_glGetProgramResourceLocation, "glGetProgramResourceLocation" }, + { &__blue_glCore_glGetProgramResourceLocationIndex, "glGetProgramResourceLocationIndex" }, + { &__blue_glCore_glShaderStorageBlockBinding, "glShaderStorageBlockBinding" }, + { &__blue_glCore_glTexBufferRange, "glTexBufferRange" }, { &__blue_glCore_glTexStorage2DMultisample, "glTexStorage2DMultisample" }, - { &__blue_glCore_glColorTableParameteriv, "glColorTableParameteriv" }, - { &__blue_glCore_glConvolutionFilter2DEXT, "glConvolutionFilter2DEXT" }, - { &__blue_glCore_glSampleMaskEXT, "glSampleMaskEXT" }, - { &__blue_glCore_glGlobalAlphaFactorusSUN, "glGlobalAlphaFactorusSUN" }, - { &__blue_glCore_glBindRenderbuffer, "glBindRenderbuffer" }, - { &__blue_glCore_glVertexAttribI1i, "glVertexAttribI1i" }, - { &__blue_glCore_glProgramLocalParameterI4uiNV, "glProgramLocalParameterI4uiNV" }, - { &__blue_glCore_glProgramUniform4ui64ARB, "glProgramUniform4ui64ARB" }, + { &__blue_glCore_glTexStorage3DMultisample, "glTexStorage3DMultisample" }, + { &__blue_glCore_glTextureView, "glTextureView" }, + { &__blue_glCore_glBindVertexBuffer, "glBindVertexBuffer" }, + { &__blue_glCore_glVertexAttribFormat, "glVertexAttribFormat" }, + { &__blue_glCore_glVertexAttribIFormat, "glVertexAttribIFormat" }, + { &__blue_glCore_glVertexAttribLFormat, "glVertexAttribLFormat" }, + { &__blue_glCore_glVertexAttribBinding, "glVertexAttribBinding" }, + { &__blue_glCore_glVertexBindingDivisor, "glVertexBindingDivisor" }, + { &__blue_glCore_glDebugMessageControl, "glDebugMessageControl" }, + { &__blue_glCore_glDebugMessageInsert, "glDebugMessageInsert" }, + { &__blue_glCore_glDebugMessageCallback, "glDebugMessageCallback" }, + { &__blue_glCore_glGetDebugMessageLog, "glGetDebugMessageLog" }, + { &__blue_glCore_glPushDebugGroup, "glPushDebugGroup" }, + { &__blue_glCore_glPopDebugGroup, "glPopDebugGroup" }, { &__blue_glCore_glObjectLabel, "glObjectLabel" }, - { &__blue_glCore_glGetColorTableParameterivEXT, "glGetColorTableParameterivEXT" }, - { &__blue_glCore_glGetCombinerOutputParameterivNV, "glGetCombinerOutputParameterivNV" }, - { &__blue_glCore_glDrawElementsInstancedARB, "glDrawElementsInstancedARB" }, - { &__blue_glCore_glGetMinmaxParameterfv, "glGetMinmaxParameterfv" }, - { &__blue_glCore_glMatrixPushEXT, "glMatrixPushEXT" }, - { &__blue_glCore_glMultiTexParameterIivEXT, "glMultiTexParameterIivEXT" }, - { &__blue_glCore_glGetPathColorGenfvNV, "glGetPathColorGenfvNV" }, - { &__blue_glCore_glBindProgramNV, "glBindProgramNV" }, - { &__blue_glCore_glFramebufferReadBufferEXT, "glFramebufferReadBufferEXT" }, - { &__blue_glCore_glFogCoordfEXT, "glFogCoordfEXT" }, - { &__blue_glCore_glVertexArrayNormalOffsetEXT, "glVertexArrayNormalOffsetEXT" }, - { &__blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN, "glReplacementCodeuiTexCoord2fVertex3fvSUN" }, - { &__blue_glCore_glGetnUniformfv, "glGetnUniformfv" }, - { &__blue_glCore_glPointParameterfEXT, "glPointParameterfEXT" }, - { &__blue_glCore_glEndVideoCaptureNV, "glEndVideoCaptureNV" }, - { &__blue_glCore_glVertexBlendARB, "glVertexBlendARB" }, - { &__blue_glCore_glVertexAttribL3i64vNV, "glVertexAttribL3i64vNV" }, - { &__blue_glCore_glSecondaryColor3fEXT, "glSecondaryColor3fEXT" }, - { &__blue_glCore_glStencilFuncSeparateATI, "glStencilFuncSeparateATI" }, - { &__blue_glCore_glCompressedMultiTexSubImage2DEXT, "glCompressedMultiTexSubImage2DEXT" }, - { &__blue_glCore_glTransformPathNV, "glTransformPathNV" }, - { &__blue_glCore_glIsEnabledi, "glIsEnabledi" }, - { &__blue_glCore_glExtractComponentEXT, "glExtractComponentEXT" }, - { &__blue_glCore_glGetFixedvOES, "glGetFixedvOES" }, - { &__blue_glCore_glDeleteProgramPipelines, "glDeleteProgramPipelines" }, - { &__blue_glCore_glCopyMultiTexSubImage3DEXT, "glCopyMultiTexSubImage3DEXT" }, - { &__blue_glCore_glCreateStatesNV, "glCreateStatesNV" }, - { &__blue_glCore_glSwizzleEXT, "glSwizzleEXT" }, - { &__blue_glCore_glVertexWeightfvEXT, "glVertexWeightfvEXT" }, - { &__blue_glCore_glNormalPointerEXT, "glNormalPointerEXT" }, - { &__blue_glCore_glGetConvolutionFilterEXT, "glGetConvolutionFilterEXT" }, - { &__blue_glCore_glCurrentPaletteMatrixARB, "glCurrentPaletteMatrixARB" }, - { &__blue_glCore_glVertexStream4sATI, "glVertexStream4sATI" }, - { &__blue_glCore_glUniform3ui64ARB, "glUniform3ui64ARB" }, - { &__blue_glCore_glProgramUniform1uivEXT, "glProgramUniform1uivEXT" }, - { &__blue_glCore_glVertexAttribs3dvNV, "glVertexAttribs3dvNV" }, - { &__blue_glCore_glExecuteProgramNV, "glExecuteProgramNV" }, - { &__blue_glCore_glFrameZoomSGIX, "glFrameZoomSGIX" }, - { &__blue_glCore_glFragmentMaterialfSGIX, "glFragmentMaterialfSGIX" }, - { &__blue_glCore_glFramebufferTextureLayerEXT, "glFramebufferTextureLayerEXT" }, - { &__blue_glCore_glVertexStream1iATI, "glVertexStream1iATI" }, - { &__blue_glCore_glVertexAttrib3s, "glVertexAttrib3s" }, - { &__blue_glCore_glFramebufferTextureMultiviewOVR, "glFramebufferTextureMultiviewOVR" }, - { &__blue_glCore_glElementPointerAPPLE, "glElementPointerAPPLE" }, - { &__blue_glCore_glWindowPos4ivMESA, "glWindowPos4ivMESA" }, - { &__blue_glCore_glTexSubImage3D, "glTexSubImage3D" }, - { &__blue_glCore_glGetFragmentMaterialfvSGIX, "glGetFragmentMaterialfvSGIX" }, - { &__blue_glCore_glProgramUniform1dEXT, "glProgramUniform1dEXT" }, - { &__blue_glCore_glGetFragmentLightfvSGIX, "glGetFragmentLightfvSGIX" }, - { &__blue_glCore_glTexCoord2bOES, "glTexCoord2bOES" }, - { &__blue_glCore_glVertexAttrib3fv, "glVertexAttrib3fv" }, - { &__blue_glCore_glMakeNamedBufferNonResidentNV, "glMakeNamedBufferNonResidentNV" }, - { &__blue_glCore_glIsProgramARB, "glIsProgramARB" }, - { &__blue_glCore_glScissorArrayv, "glScissorArrayv" }, - { &__blue_glCore_glMultiDrawElementsIndirect, "glMultiDrawElementsIndirect" }, - { &__blue_glCore_glGetMultiTexParameterfvEXT, "glGetMultiTexParameterfvEXT" }, - { &__blue_glCore_glWindowPos2iARB, "glWindowPos2iARB" }, - { &__blue_glCore_glGetProgramStringNV, "glGetProgramStringNV" }, - { &__blue_glCore_glTranslatexOES, "glTranslatexOES" }, + { &__blue_glCore_glGetObjectLabel, "glGetObjectLabel" }, + { &__blue_glCore_glObjectPtrLabel, "glObjectPtrLabel" }, + { &__blue_glCore_glGetObjectPtrLabel, "glGetObjectPtrLabel" }, + { &__blue_glCore_glBufferStorage, "glBufferStorage" }, + { &__blue_glCore_glClearTexImage, "glClearTexImage" }, + { &__blue_glCore_glClearTexSubImage, "glClearTexSubImage" }, + { &__blue_glCore_glBindBuffersBase, "glBindBuffersBase" }, + { &__blue_glCore_glBindBuffersRange, "glBindBuffersRange" }, + { &__blue_glCore_glBindTextures, "glBindTextures" }, + { &__blue_glCore_glBindSamplers, "glBindSamplers" }, + { &__blue_glCore_glBindImageTextures, "glBindImageTextures" }, + { &__blue_glCore_glBindVertexBuffers, "glBindVertexBuffers" }, + { &__blue_glCore_glClipControl, "glClipControl" }, + { &__blue_glCore_glCreateTransformFeedbacks, "glCreateTransformFeedbacks" }, + { &__blue_glCore_glTransformFeedbackBufferBase, "glTransformFeedbackBufferBase" }, + { &__blue_glCore_glTransformFeedbackBufferRange, "glTransformFeedbackBufferRange" }, + { &__blue_glCore_glGetTransformFeedbackiv, "glGetTransformFeedbackiv" }, + { &__blue_glCore_glGetTransformFeedbacki_v, "glGetTransformFeedbacki_v" }, + { &__blue_glCore_glGetTransformFeedbacki64_v, "glGetTransformFeedbacki64_v" }, + { &__blue_glCore_glCreateBuffers, "glCreateBuffers" }, + { &__blue_glCore_glNamedBufferStorage, "glNamedBufferStorage" }, + { &__blue_glCore_glNamedBufferData, "glNamedBufferData" }, + { &__blue_glCore_glNamedBufferSubData, "glNamedBufferSubData" }, + { &__blue_glCore_glCopyNamedBufferSubData, "glCopyNamedBufferSubData" }, + { &__blue_glCore_glClearNamedBufferData, "glClearNamedBufferData" }, + { &__blue_glCore_glClearNamedBufferSubData, "glClearNamedBufferSubData" }, + { &__blue_glCore_glMapNamedBuffer, "glMapNamedBuffer" }, + { &__blue_glCore_glMapNamedBufferRange, "glMapNamedBufferRange" }, + { &__blue_glCore_glUnmapNamedBuffer, "glUnmapNamedBuffer" }, + { &__blue_glCore_glFlushMappedNamedBufferRange, "glFlushMappedNamedBufferRange" }, + { &__blue_glCore_glGetNamedBufferParameteriv, "glGetNamedBufferParameteriv" }, + { &__blue_glCore_glGetNamedBufferParameteri64v, "glGetNamedBufferParameteri64v" }, + { &__blue_glCore_glGetNamedBufferPointerv, "glGetNamedBufferPointerv" }, + { &__blue_glCore_glGetNamedBufferSubData, "glGetNamedBufferSubData" }, + { &__blue_glCore_glCreateFramebuffers, "glCreateFramebuffers" }, + { &__blue_glCore_glNamedFramebufferRenderbuffer, "glNamedFramebufferRenderbuffer" }, + { &__blue_glCore_glNamedFramebufferParameteri, "glNamedFramebufferParameteri" }, + { &__blue_glCore_glNamedFramebufferTexture, "glNamedFramebufferTexture" }, + { &__blue_glCore_glNamedFramebufferTextureLayer, "glNamedFramebufferTextureLayer" }, + { &__blue_glCore_glNamedFramebufferDrawBuffer, "glNamedFramebufferDrawBuffer" }, + { &__blue_glCore_glNamedFramebufferDrawBuffers, "glNamedFramebufferDrawBuffers" }, + { &__blue_glCore_glNamedFramebufferReadBuffer, "glNamedFramebufferReadBuffer" }, + { &__blue_glCore_glInvalidateNamedFramebufferData, "glInvalidateNamedFramebufferData" }, + { &__blue_glCore_glInvalidateNamedFramebufferSubData, "glInvalidateNamedFramebufferSubData" }, + { &__blue_glCore_glClearNamedFramebufferiv, "glClearNamedFramebufferiv" }, + { &__blue_glCore_glClearNamedFramebufferuiv, "glClearNamedFramebufferuiv" }, + { &__blue_glCore_glClearNamedFramebufferfv, "glClearNamedFramebufferfv" }, + { &__blue_glCore_glClearNamedFramebufferfi, "glClearNamedFramebufferfi" }, + { &__blue_glCore_glBlitNamedFramebuffer, "glBlitNamedFramebuffer" }, + { &__blue_glCore_glCheckNamedFramebufferStatus, "glCheckNamedFramebufferStatus" }, + { &__blue_glCore_glGetNamedFramebufferParameteriv, "glGetNamedFramebufferParameteriv" }, + { &__blue_glCore_glGetNamedFramebufferAttachmentParameteriv, "glGetNamedFramebufferAttachmentParameteriv" }, + { &__blue_glCore_glCreateRenderbuffers, "glCreateRenderbuffers" }, + { &__blue_glCore_glNamedRenderbufferStorage, "glNamedRenderbufferStorage" }, + { &__blue_glCore_glNamedRenderbufferStorageMultisample, "glNamedRenderbufferStorageMultisample" }, + { &__blue_glCore_glGetNamedRenderbufferParameteriv, "glGetNamedRenderbufferParameteriv" }, + { &__blue_glCore_glCreateTextures, "glCreateTextures" }, + { &__blue_glCore_glTextureBuffer, "glTextureBuffer" }, + { &__blue_glCore_glTextureBufferRange, "glTextureBufferRange" }, + { &__blue_glCore_glTextureStorage1D, "glTextureStorage1D" }, + { &__blue_glCore_glTextureStorage2D, "glTextureStorage2D" }, + { &__blue_glCore_glTextureStorage3D, "glTextureStorage3D" }, + { &__blue_glCore_glTextureStorage2DMultisample, "glTextureStorage2DMultisample" }, + { &__blue_glCore_glTextureStorage3DMultisample, "glTextureStorage3DMultisample" }, + { &__blue_glCore_glTextureSubImage1D, "glTextureSubImage1D" }, + { &__blue_glCore_glTextureSubImage2D, "glTextureSubImage2D" }, + { &__blue_glCore_glTextureSubImage3D, "glTextureSubImage3D" }, + { &__blue_glCore_glCompressedTextureSubImage1D, "glCompressedTextureSubImage1D" }, + { &__blue_glCore_glCompressedTextureSubImage2D, "glCompressedTextureSubImage2D" }, + { &__blue_glCore_glCompressedTextureSubImage3D, "glCompressedTextureSubImage3D" }, + { &__blue_glCore_glCopyTextureSubImage1D, "glCopyTextureSubImage1D" }, + { &__blue_glCore_glCopyTextureSubImage2D, "glCopyTextureSubImage2D" }, + { &__blue_glCore_glCopyTextureSubImage3D, "glCopyTextureSubImage3D" }, + { &__blue_glCore_glTextureParameterf, "glTextureParameterf" }, + { &__blue_glCore_glTextureParameterfv, "glTextureParameterfv" }, + { &__blue_glCore_glTextureParameteri, "glTextureParameteri" }, + { &__blue_glCore_glTextureParameterIiv, "glTextureParameterIiv" }, + { &__blue_glCore_glTextureParameterIuiv, "glTextureParameterIuiv" }, + { &__blue_glCore_glTextureParameteriv, "glTextureParameteriv" }, + { &__blue_glCore_glGenerateTextureMipmap, "glGenerateTextureMipmap" }, + { &__blue_glCore_glBindTextureUnit, "glBindTextureUnit" }, + { &__blue_glCore_glGetTextureImage, "glGetTextureImage" }, + { &__blue_glCore_glGetCompressedTextureImage, "glGetCompressedTextureImage" }, + { &__blue_glCore_glGetTextureLevelParameterfv, "glGetTextureLevelParameterfv" }, + { &__blue_glCore_glGetTextureLevelParameteriv, "glGetTextureLevelParameteriv" }, + { &__blue_glCore_glGetTextureParameterfv, "glGetTextureParameterfv" }, + { &__blue_glCore_glGetTextureParameterIiv, "glGetTextureParameterIiv" }, + { &__blue_glCore_glGetTextureParameterIuiv, "glGetTextureParameterIuiv" }, + { &__blue_glCore_glGetTextureParameteriv, "glGetTextureParameteriv" }, + { &__blue_glCore_glCreateVertexArrays, "glCreateVertexArrays" }, + { &__blue_glCore_glDisableVertexArrayAttrib, "glDisableVertexArrayAttrib" }, + { &__blue_glCore_glEnableVertexArrayAttrib, "glEnableVertexArrayAttrib" }, + { &__blue_glCore_glVertexArrayElementBuffer, "glVertexArrayElementBuffer" }, + { &__blue_glCore_glVertexArrayVertexBuffer, "glVertexArrayVertexBuffer" }, + { &__blue_glCore_glVertexArrayVertexBuffers, "glVertexArrayVertexBuffers" }, + { &__blue_glCore_glVertexArrayAttribBinding, "glVertexArrayAttribBinding" }, + { &__blue_glCore_glVertexArrayAttribFormat, "glVertexArrayAttribFormat" }, + { &__blue_glCore_glVertexArrayAttribIFormat, "glVertexArrayAttribIFormat" }, + { &__blue_glCore_glVertexArrayAttribLFormat, "glVertexArrayAttribLFormat" }, + { &__blue_glCore_glVertexArrayBindingDivisor, "glVertexArrayBindingDivisor" }, + { &__blue_glCore_glGetVertexArrayiv, "glGetVertexArrayiv" }, + { &__blue_glCore_glGetVertexArrayIndexediv, "glGetVertexArrayIndexediv" }, + { &__blue_glCore_glGetVertexArrayIndexed64iv, "glGetVertexArrayIndexed64iv" }, + { &__blue_glCore_glCreateSamplers, "glCreateSamplers" }, + { &__blue_glCore_glCreateProgramPipelines, "glCreateProgramPipelines" }, + { &__blue_glCore_glCreateQueries, "glCreateQueries" }, + { &__blue_glCore_glGetQueryBufferObjecti64v, "glGetQueryBufferObjecti64v" }, + { &__blue_glCore_glGetQueryBufferObjectiv, "glGetQueryBufferObjectiv" }, + { &__blue_glCore_glGetQueryBufferObjectui64v, "glGetQueryBufferObjectui64v" }, + { &__blue_glCore_glGetQueryBufferObjectuiv, "glGetQueryBufferObjectuiv" }, + { &__blue_glCore_glMemoryBarrierByRegion, "glMemoryBarrierByRegion" }, + { &__blue_glCore_glGetTextureSubImage, "glGetTextureSubImage" }, + { &__blue_glCore_glGetCompressedTextureSubImage, "glGetCompressedTextureSubImage" }, + { &__blue_glCore_glGetGraphicsResetStatus, "glGetGraphicsResetStatus" }, + { &__blue_glCore_glGetnCompressedTexImage, "glGetnCompressedTexImage" }, + { &__blue_glCore_glGetnTexImage, "glGetnTexImage" }, + { &__blue_glCore_glGetnUniformdv, "glGetnUniformdv" }, + { &__blue_glCore_glGetnUniformfv, "glGetnUniformfv" }, + { &__blue_glCore_glGetnUniformiv, "glGetnUniformiv" }, + { &__blue_glCore_glGetnUniformuiv, "glGetnUniformuiv" }, + { &__blue_glCore_glReadnPixels, "glReadnPixels" }, + { &__blue_glCore_glTextureBarrier, "glTextureBarrier" }, + { &__blue_glCore_glGetTextureHandleARB, "glGetTextureHandleARB" }, + { &__blue_glCore_glGetTextureSamplerHandleARB, "glGetTextureSamplerHandleARB" }, + { &__blue_glCore_glMakeTextureHandleResidentARB, "glMakeTextureHandleResidentARB" }, + { &__blue_glCore_glMakeTextureHandleNonResidentARB, "glMakeTextureHandleNonResidentARB" }, + { &__blue_glCore_glGetImageHandleARB, "glGetImageHandleARB" }, + { &__blue_glCore_glMakeImageHandleResidentARB, "glMakeImageHandleResidentARB" }, + { &__blue_glCore_glMakeImageHandleNonResidentARB, "glMakeImageHandleNonResidentARB" }, + { &__blue_glCore_glUniformHandleui64ARB, "glUniformHandleui64ARB" }, + { &__blue_glCore_glUniformHandleui64vARB, "glUniformHandleui64vARB" }, + { &__blue_glCore_glProgramUniformHandleui64ARB, "glProgramUniformHandleui64ARB" }, + { &__blue_glCore_glProgramUniformHandleui64vARB, "glProgramUniformHandleui64vARB" }, + { &__blue_glCore_glIsTextureHandleResidentARB, "glIsTextureHandleResidentARB" }, + { &__blue_glCore_glIsImageHandleResidentARB, "glIsImageHandleResidentARB" }, + { &__blue_glCore_glVertexAttribL1ui64ARB, "glVertexAttribL1ui64ARB" }, + { &__blue_glCore_glVertexAttribL1ui64vARB, "glVertexAttribL1ui64vARB" }, + { &__blue_glCore_glGetVertexAttribLui64vARB, "glGetVertexAttribLui64vARB" }, + { &__blue_glCore_glCreateSyncFromCLeventARB, "glCreateSyncFromCLeventARB" }, + { &__blue_glCore_glDispatchComputeGroupSizeARB, "glDispatchComputeGroupSizeARB" }, + { &__blue_glCore_glDebugMessageControlARB, "glDebugMessageControlARB" }, + { &__blue_glCore_glDebugMessageInsertARB, "glDebugMessageInsertARB" }, + { &__blue_glCore_glDebugMessageCallbackARB, "glDebugMessageCallbackARB" }, + { &__blue_glCore_glGetDebugMessageLogARB, "glGetDebugMessageLogARB" }, + { &__blue_glCore_glBlendEquationiARB, "glBlendEquationiARB" }, + { &__blue_glCore_glBlendEquationSeparateiARB, "glBlendEquationSeparateiARB" }, + { &__blue_glCore_glBlendFunciARB, "glBlendFunciARB" }, + { &__blue_glCore_glBlendFuncSeparateiARB, "glBlendFuncSeparateiARB" }, + { &__blue_glCore_glMultiDrawArraysIndirectCountARB, "glMultiDrawArraysIndirectCountARB" }, + { &__blue_glCore_glMultiDrawElementsIndirectCountARB, "glMultiDrawElementsIndirectCountARB" }, + { &__blue_glCore_glGetGraphicsResetStatusARB, "glGetGraphicsResetStatusARB" }, + { &__blue_glCore_glGetnTexImageARB, "glGetnTexImageARB" }, + { &__blue_glCore_glReadnPixelsARB, "glReadnPixelsARB" }, + { &__blue_glCore_glGetnCompressedTexImageARB, "glGetnCompressedTexImageARB" }, + { &__blue_glCore_glGetnUniformfvARB, "glGetnUniformfvARB" }, + { &__blue_glCore_glGetnUniformivARB, "glGetnUniformivARB" }, + { &__blue_glCore_glGetnUniformuivARB, "glGetnUniformuivARB" }, + { &__blue_glCore_glGetnUniformdvARB, "glGetnUniformdvARB" }, + { &__blue_glCore_glMinSampleShadingARB, "glMinSampleShadingARB" }, + { &__blue_glCore_glNamedStringARB, "glNamedStringARB" }, + { &__blue_glCore_glDeleteNamedStringARB, "glDeleteNamedStringARB" }, + { &__blue_glCore_glCompileShaderIncludeARB, "glCompileShaderIncludeARB" }, + { &__blue_glCore_glIsNamedStringARB, "glIsNamedStringARB" }, + { &__blue_glCore_glGetNamedStringARB, "glGetNamedStringARB" }, + { &__blue_glCore_glGetNamedStringivARB, "glGetNamedStringivARB" }, + { &__blue_glCore_glBufferPageCommitmentARB, "glBufferPageCommitmentARB" }, + { &__blue_glCore_glNamedBufferPageCommitmentEXT, "glNamedBufferPageCommitmentEXT" }, + { &__blue_glCore_glNamedBufferPageCommitmentARB, "glNamedBufferPageCommitmentARB" }, + { &__blue_glCore_glTexPageCommitmentARB, "glTexPageCommitmentARB" }, + { &__blue_glCore_glClientActiveTexture, "glClientActiveTexture" }, + { &__blue_glCore_glMultiTexCoord1d, "glMultiTexCoord1d" }, + { &__blue_glCore_glMultiTexCoord1dv, "glMultiTexCoord1dv" }, + { &__blue_glCore_glMultiTexCoord1f, "glMultiTexCoord1f" }, + { &__blue_glCore_glMultiTexCoord1fv, "glMultiTexCoord1fv" }, + { &__blue_glCore_glMultiTexCoord1i, "glMultiTexCoord1i" }, + { &__blue_glCore_glMultiTexCoord1iv, "glMultiTexCoord1iv" }, + { &__blue_glCore_glMultiTexCoord1s, "glMultiTexCoord1s" }, + { &__blue_glCore_glMultiTexCoord1sv, "glMultiTexCoord1sv" }, + { &__blue_glCore_glMultiTexCoord2d, "glMultiTexCoord2d" }, + { &__blue_glCore_glMultiTexCoord2dv, "glMultiTexCoord2dv" }, + { &__blue_glCore_glMultiTexCoord2f, "glMultiTexCoord2f" }, + { &__blue_glCore_glMultiTexCoord2fv, "glMultiTexCoord2fv" }, + { &__blue_glCore_glMultiTexCoord2i, "glMultiTexCoord2i" }, + { &__blue_glCore_glMultiTexCoord2iv, "glMultiTexCoord2iv" }, + { &__blue_glCore_glMultiTexCoord2s, "glMultiTexCoord2s" }, + { &__blue_glCore_glMultiTexCoord2sv, "glMultiTexCoord2sv" }, + { &__blue_glCore_glMultiTexCoord3d, "glMultiTexCoord3d" }, + { &__blue_glCore_glMultiTexCoord3dv, "glMultiTexCoord3dv" }, + { &__blue_glCore_glMultiTexCoord3f, "glMultiTexCoord3f" }, + { &__blue_glCore_glMultiTexCoord3fv, "glMultiTexCoord3fv" }, + { &__blue_glCore_glMultiTexCoord3i, "glMultiTexCoord3i" }, + { &__blue_glCore_glMultiTexCoord3iv, "glMultiTexCoord3iv" }, + { &__blue_glCore_glMultiTexCoord3s, "glMultiTexCoord3s" }, + { &__blue_glCore_glMultiTexCoord3sv, "glMultiTexCoord3sv" }, { &__blue_glCore_glMultiTexCoord4d, "glMultiTexCoord4d" }, - { &__blue_glCore_glColorTableParameterfvSGI, "glColorTableParameterfvSGI" }, - { &__blue_glCore_glTexCoord3bvOES, "glTexCoord3bvOES" }, - { &__blue_glCore_glUniform2ui64vARB, "glUniform2ui64vARB" }, - { &__blue_glCore_glMatrixIndexusvARB, "glMatrixIndexusvARB" }, - { &__blue_glCore_glGetMultiTexGenfvEXT, "glGetMultiTexGenfvEXT" }, - { &__blue_glCore_glGenerateTextureMipmapEXT, "glGenerateTextureMipmapEXT" }, - { &__blue_glCore_glGetMapParameterivNV, "glGetMapParameterivNV" }, - { &__blue_glCore_glGetConvolutionParameterxvOES, "glGetConvolutionParameterxvOES" }, - { &__blue_glCore_glVertexAttrib4fvNV, "glVertexAttrib4fvNV" }, - { &__blue_glCore_glBufferDataARB, "glBufferDataARB" }, - { &__blue_glCore_glWindowPos4fMESA, "glWindowPos4fMESA" }, - { &__blue_glCore_glPushDebugGroup, "glPushDebugGroup" }, - { &__blue_glCore_glProgramUniform2fEXT, "glProgramUniform2fEXT" }, - { &__blue_glCore_glCopyTexImage1DEXT, "glCopyTexImage1DEXT" }, - { &__blue_glCore_glCompressedTexSubImage2DARB, "glCompressedTexSubImage2DARB" }, - { &__blue_glCore_glCopyColorSubTableEXT, "glCopyColorSubTableEXT" }, - { &__blue_glCore_glTransformFeedbackAttribsNV, "glTransformFeedbackAttribsNV" }, - { &__blue_glCore_glMatrixFrustumEXT, "glMatrixFrustumEXT" }, - { &__blue_glCore_glIsBufferARB, "glIsBufferARB" }, - { &__blue_glCore_glUniform3fvARB, "glUniform3fvARB" }, - { &__blue_glCore_glMultiTexCoord3dARB, "glMultiTexCoord3dARB" }, - { &__blue_glCore_glIndexPointerEXT, "glIndexPointerEXT" }, - { &__blue_glCore_glMatrixLoad3x3fNV, "glMatrixLoad3x3fNV" }, - { &__blue_glCore_glUnmapNamedBufferEXT, "glUnmapNamedBufferEXT" }, - { &__blue_glCore_glCreateProgramObjectARB, "glCreateProgramObjectARB" }, - { &__blue_glCore_glMapGrid2xOES, "glMapGrid2xOES" }, - { &__blue_glCore_glVertexPointerEXT, "glVertexPointerEXT" }, - { &__blue_glCore_glVertexStream4svATI, "glVertexStream4svATI" }, - { &__blue_glCore_glMultiTexCoord2hvNV, "glMultiTexCoord2hvNV" }, - { &__blue_glCore_glLabelObjectEXT, "glLabelObjectEXT" }, - { &__blue_glCore_glTextureImage3DMultisampleNV, "glTextureImage3DMultisampleNV" }, + { &__blue_glCore_glMultiTexCoord4dv, "glMultiTexCoord4dv" }, + { &__blue_glCore_glMultiTexCoord4f, "glMultiTexCoord4f" }, + { &__blue_glCore_glMultiTexCoord4fv, "glMultiTexCoord4fv" }, + { &__blue_glCore_glMultiTexCoord4i, "glMultiTexCoord4i" }, + { &__blue_glCore_glMultiTexCoord4iv, "glMultiTexCoord4iv" }, + { &__blue_glCore_glMultiTexCoord4s, "glMultiTexCoord4s" }, + { &__blue_glCore_glMultiTexCoord4sv, "glMultiTexCoord4sv" }, + { &__blue_glCore_glLoadTransposeMatrixf, "glLoadTransposeMatrixf" }, + { &__blue_glCore_glLoadTransposeMatrixd, "glLoadTransposeMatrixd" }, + { &__blue_glCore_glMultTransposeMatrixf, "glMultTransposeMatrixf" }, { &__blue_glCore_glMultTransposeMatrixd, "glMultTransposeMatrixd" }, - { &__blue_glCore_glMultiTexCoord2fARB, "glMultiTexCoord2fARB" }, - { &__blue_glCore_glMultiTexCoord2dARB, "glMultiTexCoord2dARB" }, - { &__blue_glCore_glGetCombinerOutputParameterfvNV, "glGetCombinerOutputParameterfvNV" }, - { &__blue_glCore_glGetBufferPointerv, "glGetBufferPointerv" }, - { &__blue_glCore_glVertexAttrib1dNV, "glVertexAttrib1dNV" }, - { &__blue_glCore_glTextureView, "glTextureView" }, - { &__blue_glCore_glBlitFramebufferEXT, "glBlitFramebufferEXT" }, - { &__blue_glCore_glVertexWeightPointerEXT, "glVertexWeightPointerEXT" }, - { &__blue_glCore_glBindTextures, "glBindTextures" }, - { &__blue_glCore_glClearBufferiv, "glClearBufferiv" }, - { &__blue_glCore_glMultiTexCoord4ivARB, "glMultiTexCoord4ivARB" }, - { &__blue_glCore_glGetImageHandleNV, "glGetImageHandleNV" }, - { &__blue_glCore_glGetDoublei_vEXT, "glGetDoublei_vEXT" }, - { &__blue_glCore_glProgramUniform1i64NV, "glProgramUniform1i64NV" }, - { &__blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN, "glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN" }, + { &__blue_glCore_glFogCoordf, "glFogCoordf" }, + { &__blue_glCore_glFogCoordfv, "glFogCoordfv" }, + { &__blue_glCore_glFogCoordd, "glFogCoordd" }, + { &__blue_glCore_glFogCoorddv, "glFogCoorddv" }, + { &__blue_glCore_glFogCoordPointer, "glFogCoordPointer" }, + { &__blue_glCore_glSecondaryColor3b, "glSecondaryColor3b" }, + { &__blue_glCore_glSecondaryColor3bv, "glSecondaryColor3bv" }, + { &__blue_glCore_glSecondaryColor3d, "glSecondaryColor3d" }, + { &__blue_glCore_glSecondaryColor3dv, "glSecondaryColor3dv" }, + { &__blue_glCore_glSecondaryColor3f, "glSecondaryColor3f" }, + { &__blue_glCore_glSecondaryColor3fv, "glSecondaryColor3fv" }, + { &__blue_glCore_glSecondaryColor3i, "glSecondaryColor3i" }, + { &__blue_glCore_glSecondaryColor3iv, "glSecondaryColor3iv" }, + { &__blue_glCore_glSecondaryColor3s, "glSecondaryColor3s" }, + { &__blue_glCore_glSecondaryColor3sv, "glSecondaryColor3sv" }, + { &__blue_glCore_glSecondaryColor3ub, "glSecondaryColor3ub" }, + { &__blue_glCore_glSecondaryColor3ubv, "glSecondaryColor3ubv" }, + { &__blue_glCore_glSecondaryColor3ui, "glSecondaryColor3ui" }, + { &__blue_glCore_glSecondaryColor3uiv, "glSecondaryColor3uiv" }, + { &__blue_glCore_glSecondaryColor3us, "glSecondaryColor3us" }, + { &__blue_glCore_glSecondaryColor3usv, "glSecondaryColor3usv" }, + { &__blue_glCore_glSecondaryColorPointer, "glSecondaryColorPointer" }, + { &__blue_glCore_glWindowPos2d, "glWindowPos2d" }, + { &__blue_glCore_glWindowPos2dv, "glWindowPos2dv" }, + { &__blue_glCore_glWindowPos2f, "glWindowPos2f" }, + { &__blue_glCore_glWindowPos2fv, "glWindowPos2fv" }, + { &__blue_glCore_glWindowPos2i, "glWindowPos2i" }, + { &__blue_glCore_glWindowPos2iv, "glWindowPos2iv" }, + { &__blue_glCore_glWindowPos2s, "glWindowPos2s" }, + { &__blue_glCore_glWindowPos2sv, "glWindowPos2sv" }, + { &__blue_glCore_glWindowPos3d, "glWindowPos3d" }, + { &__blue_glCore_glWindowPos3dv, "glWindowPos3dv" }, + { &__blue_glCore_glWindowPos3f, "glWindowPos3f" }, + { &__blue_glCore_glWindowPos3fv, "glWindowPos3fv" }, + { &__blue_glCore_glWindowPos3i, "glWindowPos3i" }, + { &__blue_glCore_glWindowPos3iv, "glWindowPos3iv" }, { &__blue_glCore_glWindowPos3s, "glWindowPos3s" }, + { &__blue_glCore_glWindowPos3sv, "glWindowPos3sv" }, + { &__blue_glCore_glVertexP2ui, "glVertexP2ui" }, + { &__blue_glCore_glVertexP2uiv, "glVertexP2uiv" }, + { &__blue_glCore_glVertexP3ui, "glVertexP3ui" }, + { &__blue_glCore_glVertexP3uiv, "glVertexP3uiv" }, + { &__blue_glCore_glVertexP4ui, "glVertexP4ui" }, + { &__blue_glCore_glVertexP4uiv, "glVertexP4uiv" }, + { &__blue_glCore_glTexCoordP1ui, "glTexCoordP1ui" }, + { &__blue_glCore_glTexCoordP1uiv, "glTexCoordP1uiv" }, + { &__blue_glCore_glTexCoordP2ui, "glTexCoordP2ui" }, + { &__blue_glCore_glTexCoordP2uiv, "glTexCoordP2uiv" }, + { &__blue_glCore_glTexCoordP3ui, "glTexCoordP3ui" }, + { &__blue_glCore_glTexCoordP3uiv, "glTexCoordP3uiv" }, + { &__blue_glCore_glTexCoordP4ui, "glTexCoordP4ui" }, + { &__blue_glCore_glTexCoordP4uiv, "glTexCoordP4uiv" }, + { &__blue_glCore_glMultiTexCoordP1ui, "glMultiTexCoordP1ui" }, + { &__blue_glCore_glMultiTexCoordP1uiv, "glMultiTexCoordP1uiv" }, + { &__blue_glCore_glMultiTexCoordP2ui, "glMultiTexCoordP2ui" }, + { &__blue_glCore_glMultiTexCoordP2uiv, "glMultiTexCoordP2uiv" }, + { &__blue_glCore_glMultiTexCoordP3ui, "glMultiTexCoordP3ui" }, + { &__blue_glCore_glMultiTexCoordP3uiv, "glMultiTexCoordP3uiv" }, + { &__blue_glCore_glMultiTexCoordP4ui, "glMultiTexCoordP4ui" }, + { &__blue_glCore_glMultiTexCoordP4uiv, "glMultiTexCoordP4uiv" }, + { &__blue_glCore_glNormalP3ui, "glNormalP3ui" }, + { &__blue_glCore_glNormalP3uiv, "glNormalP3uiv" }, + { &__blue_glCore_glColorP3ui, "glColorP3ui" }, + { &__blue_glCore_glColorP3uiv, "glColorP3uiv" }, + { &__blue_glCore_glColorP4ui, "glColorP4ui" }, + { &__blue_glCore_glColorP4uiv, "glColorP4uiv" }, + { &__blue_glCore_glSecondaryColorP3ui, "glSecondaryColorP3ui" }, + { &__blue_glCore_glSecondaryColorP3uiv, "glSecondaryColorP3uiv" }, + { &__blue_glCore_glGetnMapdv, "glGetnMapdv" }, + { &__blue_glCore_glGetnMapfv, "glGetnMapfv" }, + { &__blue_glCore_glGetnMapiv, "glGetnMapiv" }, + { &__blue_glCore_glGetnPixelMapfv, "glGetnPixelMapfv" }, + { &__blue_glCore_glGetnPixelMapuiv, "glGetnPixelMapuiv" }, + { &__blue_glCore_glGetnPixelMapusv, "glGetnPixelMapusv" }, + { &__blue_glCore_glGetnPolygonStipple, "glGetnPolygonStipple" }, + { &__blue_glCore_glGetnColorTable, "glGetnColorTable" }, + { &__blue_glCore_glGetnConvolutionFilter, "glGetnConvolutionFilter" }, + { &__blue_glCore_glGetnSeparableFilter, "glGetnSeparableFilter" }, + { &__blue_glCore_glGetnHistogram, "glGetnHistogram" }, + { &__blue_glCore_glGetnMinmax, "glGetnMinmax" }, + { &__blue_glCore_glPrimitiveBoundingBoxARB, "glPrimitiveBoundingBoxARB" }, + { &__blue_glCore_glClampColorARB, "glClampColorARB" }, + { &__blue_glCore_glDrawBuffersARB, "glDrawBuffersARB" }, + { &__blue_glCore_glDrawArraysInstancedARB, "glDrawArraysInstancedARB" }, + { &__blue_glCore_glDrawElementsInstancedARB, "glDrawElementsInstancedARB" }, + { &__blue_glCore_glProgramStringARB, "glProgramStringARB" }, + { &__blue_glCore_glBindProgramARB, "glBindProgramARB" }, + { &__blue_glCore_glDeleteProgramsARB, "glDeleteProgramsARB" }, + { &__blue_glCore_glGenProgramsARB, "glGenProgramsARB" }, + { &__blue_glCore_glProgramEnvParameter4dARB, "glProgramEnvParameter4dARB" }, + { &__blue_glCore_glProgramEnvParameter4dvARB, "glProgramEnvParameter4dvARB" }, + { &__blue_glCore_glProgramEnvParameter4fARB, "glProgramEnvParameter4fARB" }, + { &__blue_glCore_glProgramEnvParameter4fvARB, "glProgramEnvParameter4fvARB" }, + { &__blue_glCore_glProgramLocalParameter4dARB, "glProgramLocalParameter4dARB" }, + { &__blue_glCore_glProgramLocalParameter4dvARB, "glProgramLocalParameter4dvARB" }, + { &__blue_glCore_glProgramLocalParameter4fARB, "glProgramLocalParameter4fARB" }, + { &__blue_glCore_glProgramLocalParameter4fvARB, "glProgramLocalParameter4fvARB" }, + { &__blue_glCore_glGetProgramEnvParameterdvARB, "glGetProgramEnvParameterdvARB" }, + { &__blue_glCore_glGetProgramEnvParameterfvARB, "glGetProgramEnvParameterfvARB" }, + { &__blue_glCore_glGetProgramLocalParameterdvARB, "glGetProgramLocalParameterdvARB" }, + { &__blue_glCore_glGetProgramLocalParameterfvARB, "glGetProgramLocalParameterfvARB" }, + { &__blue_glCore_glGetProgramivARB, "glGetProgramivARB" }, + { &__blue_glCore_glGetProgramStringARB, "glGetProgramStringARB" }, + { &__blue_glCore_glIsProgramARB, "glIsProgramARB" }, + { &__blue_glCore_glProgramParameteriARB, "glProgramParameteriARB" }, + { &__blue_glCore_glFramebufferTextureARB, "glFramebufferTextureARB" }, + { &__blue_glCore_glFramebufferTextureLayerARB, "glFramebufferTextureLayerARB" }, + { &__blue_glCore_glFramebufferTextureFaceARB, "glFramebufferTextureFaceARB" }, + { &__blue_glCore_glUniform1i64ARB, "glUniform1i64ARB" }, + { &__blue_glCore_glUniform2i64ARB, "glUniform2i64ARB" }, + { &__blue_glCore_glUniform3i64ARB, "glUniform3i64ARB" }, { &__blue_glCore_glUniform4i64ARB, "glUniform4i64ARB" }, - { &__blue_glCore_glProgramUniform2dvEXT, "glProgramUniform2dvEXT" }, - { &__blue_glCore_glMultiTexSubImage1DEXT, "glMultiTexSubImage1DEXT" }, - { &__blue_glCore_glHint, "glHint" }, - { &__blue_glCore_glProgramUniformMatrix4fv, "glProgramUniformMatrix4fv" }, - { &__blue_glCore_glTexCoord4bvOES, "glTexCoord4bvOES" }, - { &__blue_glCore_glGetQueryObjectiv, "glGetQueryObjectiv" }, - { &__blue_glCore_glGetQueryIndexediv, "glGetQueryIndexediv" }, - { &__blue_glCore_glTexCoordP4ui, "glTexCoordP4ui" }, - { &__blue_glCore_glVertexStream2fvATI, "glVertexStream2fvATI" }, - { &__blue_glCore_glUniform3fv, "glUniform3fv" }, - { &__blue_glCore_glUniformMatrix2dv, "glUniformMatrix2dv" }, - { &__blue_glCore_glIsObjectBufferATI, "glIsObjectBufferATI" }, - { &__blue_glCore_glVertexAttribP2uiv, "glVertexAttribP2uiv" }, - { &__blue_glCore_glCompileShader, "glCompileShader" }, - { &__blue_glCore_glMatrixScalefEXT, "glMatrixScalefEXT" }, - { &__blue_glCore_glBinormal3ivEXT, "glBinormal3ivEXT" }, - { &__blue_glCore_glGetMapAttribParameterivNV, "glGetMapAttribParameterivNV" }, - { &__blue_glCore_glGetnPixelMapusvARB, "glGetnPixelMapusvARB" }, - { &__blue_glCore_glGetPerfMonitorCounterStringAMD, "glGetPerfMonitorCounterStringAMD" }, - { &__blue_glCore_glIsTextureHandleResidentNV, "glIsTextureHandleResidentNV" }, - { &__blue_glCore_glWaitSync, "glWaitSync" }, - { &__blue_glCore_glGenSamplers, "glGenSamplers" }, - { &__blue_glCore_glCompressedTextureImage3DEXT, "glCompressedTextureImage3DEXT" }, - { &__blue_glCore_glGetPerfMonitorCounterInfoAMD, "glGetPerfMonitorCounterInfoAMD" }, - { &__blue_glCore_glUniform2ivARB, "glUniform2ivARB" }, - { &__blue_glCore_glVertexAttrib2sARB, "glVertexAttrib2sARB" }, - { &__blue_glCore_glDrawCommandsAddressNV, "glDrawCommandsAddressNV" }, - { &__blue_glCore_glTexCoord1hNV, "glTexCoord1hNV" }, - { &__blue_glCore_glGetFirstPerfQueryIdINTEL, "glGetFirstPerfQueryIdINTEL" }, - { &__blue_glCore_glFramebufferTexture1D, "glFramebufferTexture1D" }, - { &__blue_glCore_glGetQueryObjecti64v, "glGetQueryObjecti64v" }, - { &__blue_glCore_glVertexStream1dvATI, "glVertexStream1dvATI" }, - { &__blue_glCore_glTexCoordPointerListIBM, "glTexCoordPointerListIBM" }, - { &__blue_glCore_glTexImage1D, "glTexImage1D" }, - { &__blue_glCore_glWindowPos2fvMESA, "glWindowPos2fvMESA" }, - { &__blue_glCore_glIsFenceNV, "glIsFenceNV" }, - { &__blue_glCore_glVariantsvEXT, "glVariantsvEXT" }, - { &__blue_glCore_glProgramUniform3dEXT, "glProgramUniform3dEXT" }, - { &__blue_glCore_glUniform2iARB, "glUniform2iARB" }, - { &__blue_glCore_glPointParameteri, "glPointParameteri" }, - { &__blue_glCore_glCreateRenderbuffers, "glCreateRenderbuffers" }, - { &__blue_glCore_glUniform4i, "glUniform4i" }, - { &__blue_glCore_glDeleteCommandListsNV, "glDeleteCommandListsNV" }, - { &__blue_glCore_glRequestResidentProgramsNV, "glRequestResidentProgramsNV" }, - { &__blue_glCore_glTextureSubImage3D, "glTextureSubImage3D" }, - { &__blue_glCore_glPixelStorex, "glPixelStorex" }, - { &__blue_glCore_glVertexAttrib4fARB, "glVertexAttrib4fARB" }, - { &__blue_glCore_glGetVertexAttribIuiv, "glGetVertexAttribIuiv" }, - { &__blue_glCore_glVertexAttrib1s, "glVertexAttrib1s" }, - { &__blue_glCore_glProgramUniformMatrix4x3dv, "glProgramUniformMatrix4x3dv" }, - { &__blue_glCore_glActiveVaryingNV, "glActiveVaryingNV" }, - { &__blue_glCore_glTangent3sEXT, "glTangent3sEXT" }, - { &__blue_glCore_glConvolutionParameteriv, "glConvolutionParameteriv" }, - { &__blue_glCore_glQueryCounter, "glQueryCounter" }, - { &__blue_glCore_glProgramUniform3d, "glProgramUniform3d" }, + { &__blue_glCore_glUniform1i64vARB, "glUniform1i64vARB" }, + { &__blue_glCore_glUniform2i64vARB, "glUniform2i64vARB" }, + { &__blue_glCore_glUniform3i64vARB, "glUniform3i64vARB" }, + { &__blue_glCore_glUniform4i64vARB, "glUniform4i64vARB" }, + { &__blue_glCore_glUniform1ui64ARB, "glUniform1ui64ARB" }, + { &__blue_glCore_glUniform2ui64ARB, "glUniform2ui64ARB" }, + { &__blue_glCore_glUniform3ui64ARB, "glUniform3ui64ARB" }, + { &__blue_glCore_glUniform4ui64ARB, "glUniform4ui64ARB" }, + { &__blue_glCore_glUniform1ui64vARB, "glUniform1ui64vARB" }, + { &__blue_glCore_glUniform2ui64vARB, "glUniform2ui64vARB" }, + { &__blue_glCore_glUniform3ui64vARB, "glUniform3ui64vARB" }, + { &__blue_glCore_glUniform4ui64vARB, "glUniform4ui64vARB" }, { &__blue_glCore_glGetUniformi64vARB, "glGetUniformi64vARB" }, + { &__blue_glCore_glGetUniformui64vARB, "glGetUniformui64vARB" }, + { &__blue_glCore_glGetnUniformi64vARB, "glGetnUniformi64vARB" }, { &__blue_glCore_glGetnUniformui64vARB, "glGetnUniformui64vARB" }, - { &__blue_glCore_glNamedProgramLocalParameters4fvEXT, "glNamedProgramLocalParameters4fvEXT" }, - { &__blue_glCore_glGetShaderSource, "glGetShaderSource" }, - { &__blue_glCore_glClearDepthdNV, "glClearDepthdNV" }, - { &__blue_glCore_glSecondaryColorP3ui, "glSecondaryColorP3ui" }, - { &__blue_glCore_glMinmax, "glMinmax" }, - { &__blue_glCore_glVariantubvEXT, "glVariantubvEXT" }, - { &__blue_glCore_glBinormal3sEXT, "glBinormal3sEXT" }, - { &__blue_glCore_glVertexAttrib4d, "glVertexAttrib4d" }, - { &__blue_glCore_glEndTransformFeedbackEXT, "glEndTransformFeedbackEXT" }, - { &__blue_glCore_glTexImage2DMultisample, "glTexImage2DMultisample" }, - { &__blue_glCore_glLoadMatrixxOES, "glLoadMatrixxOES" }, - { &__blue_glCore_glGetUniformfv, "glGetUniformfv" }, - { &__blue_glCore_glStartInstrumentsSGIX, "glStartInstrumentsSGIX" }, - { &__blue_glCore_glColor4ubVertex3fvSUN, "glColor4ubVertex3fvSUN" }, - { &__blue_glCore_glMatrixLoadTransposefEXT, "glMatrixLoadTransposefEXT" }, - { &__blue_glCore_glGetCompressedTexImage, "glGetCompressedTexImage" }, - { &__blue_glCore_glGetNamedProgramLocalParameterdvEXT, "glGetNamedProgramLocalParameterdvEXT" }, - { &__blue_glCore_glColorPointerEXT, "glColorPointerEXT" }, - { &__blue_glCore_glTangent3fEXT, "glTangent3fEXT" }, - { &__blue_glCore_glWindowPos2dvARB, "glWindowPos2dvARB" }, - { &__blue_glCore_glGetInvariantIntegervEXT, "glGetInvariantIntegervEXT" }, - { &__blue_glCore_glProgramUniform3fEXT, "glProgramUniform3fEXT" }, - { &__blue_glCore_glPixelTexGenSGIX, "glPixelTexGenSGIX" }, - { &__blue_glCore_glClampColor, "glClampColor" }, - { &__blue_glCore_glVertexAttribs4hvNV, "glVertexAttribs4hvNV" }, - { &__blue_glCore_glGetIntegeri_v, "glGetIntegeri_v" }, - { &__blue_glCore_glDeleteVertexArraysAPPLE, "glDeleteVertexArraysAPPLE" }, - { &__blue_glCore_glGetAttachedShaders, "glGetAttachedShaders" }, - { &__blue_glCore_glEndTransformFeedbackNV, "glEndTransformFeedbackNV" }, - { &__blue_glCore_glGetColorTableParameterfvSGI, "glGetColorTableParameterfvSGI" }, - { &__blue_glCore_glBindBufferBase, "glBindBufferBase" }, - { &__blue_glCore_glDeleteSync, "glDeleteSync" }, - { &__blue_glCore_glGetTransformFeedbackVarying, "glGetTransformFeedbackVarying" }, - { &__blue_glCore_glVertexAttrib1svARB, "glVertexAttrib1svARB" }, - { &__blue_glCore_glCopyPathNV, "glCopyPathNV" }, - { &__blue_glCore_glBindTransformFeedback, "glBindTransformFeedback" }, - { &__blue_glCore_glVertexAttrib4usv, "glVertexAttrib4usv" }, - { &__blue_glCore_glCompressedMultiTexImage3DEXT, "glCompressedMultiTexImage3DEXT" }, - { &__blue_glCore_glMatrixLoadTranspose3x3fNV, "glMatrixLoadTranspose3x3fNV" }, - { &__blue_glCore_glVertexStream1sATI, "glVertexStream1sATI" }, - { &__blue_glCore_glMultiDrawArraysIndirectBindlessNV, "glMultiDrawArraysIndirectBindlessNV" }, - { &__blue_glCore_glTexParameterIuiv, "glTexParameterIuiv" }, - { &__blue_glCore_glVDPAUFiniNV, "glVDPAUFiniNV" }, - { &__blue_glCore_glUniform1iv, "glUniform1iv" }, - { &__blue_glCore_glStencilThenCoverStrokePathNV, "glStencilThenCoverStrokePathNV" }, - { &__blue_glCore_glUniform3i64vNV, "glUniform3i64vNV" }, - { &__blue_glCore_glGetFragDataLocationEXT, "glGetFragDataLocationEXT" }, - { &__blue_glCore_glProgramUniformMatrix4dv, "glProgramUniformMatrix4dv" }, - { &__blue_glCore_glGetnUniformiv, "glGetnUniformiv" }, - { &__blue_glCore_glMapBuffer, "glMapBuffer" }, - { &__blue_glCore_glScissorIndexed, "glScissorIndexed" }, - { &__blue_glCore_glUniform3fARB, "glUniform3fARB" }, + { &__blue_glCore_glProgramUniform1i64ARB, "glProgramUniform1i64ARB" }, + { &__blue_glCore_glProgramUniform2i64ARB, "glProgramUniform2i64ARB" }, + { &__blue_glCore_glProgramUniform3i64ARB, "glProgramUniform3i64ARB" }, + { &__blue_glCore_glProgramUniform4i64ARB, "glProgramUniform4i64ARB" }, + { &__blue_glCore_glProgramUniform1i64vARB, "glProgramUniform1i64vARB" }, + { &__blue_glCore_glProgramUniform2i64vARB, "glProgramUniform2i64vARB" }, + { &__blue_glCore_glProgramUniform3i64vARB, "glProgramUniform3i64vARB" }, + { &__blue_glCore_glProgramUniform4i64vARB, "glProgramUniform4i64vARB" }, + { &__blue_glCore_glProgramUniform1ui64ARB, "glProgramUniform1ui64ARB" }, + { &__blue_glCore_glProgramUniform2ui64ARB, "glProgramUniform2ui64ARB" }, + { &__blue_glCore_glProgramUniform3ui64ARB, "glProgramUniform3ui64ARB" }, + { &__blue_glCore_glProgramUniform4ui64ARB, "glProgramUniform4ui64ARB" }, + { &__blue_glCore_glProgramUniform1ui64vARB, "glProgramUniform1ui64vARB" }, + { &__blue_glCore_glProgramUniform2ui64vARB, "glProgramUniform2ui64vARB" }, + { &__blue_glCore_glProgramUniform3ui64vARB, "glProgramUniform3ui64vARB" }, + { &__blue_glCore_glProgramUniform4ui64vARB, "glProgramUniform4ui64vARB" }, + { &__blue_glCore_glColorTable, "glColorTable" }, + { &__blue_glCore_glColorTableParameterfv, "glColorTableParameterfv" }, + { &__blue_glCore_glColorTableParameteriv, "glColorTableParameteriv" }, + { &__blue_glCore_glCopyColorTable, "glCopyColorTable" }, { &__blue_glCore_glGetColorTable, "glGetColorTable" }, - { &__blue_glCore_glFramebufferTextureFaceARB, "glFramebufferTextureFaceARB" }, - { &__blue_glCore_glBeginTransformFeedbackEXT, "glBeginTransformFeedbackEXT" }, - { &__blue_glCore_glGenFencesNV, "glGenFencesNV" }, - { &__blue_glCore_glMultiTexImage2DEXT, "glMultiTexImage2DEXT" }, - { &__blue_glCore_glVertexAttrib2hNV, "glVertexAttrib2hNV" }, - { &__blue_glCore_glFragmentLightfvSGIX, "glFragmentLightfvSGIX" }, - { &__blue_glCore_glProgramUniform2iv, "glProgramUniform2iv" }, - { &__blue_glCore_glVertexAttribL4d, "glVertexAttribL4d" }, + { &__blue_glCore_glGetColorTableParameterfv, "glGetColorTableParameterfv" }, + { &__blue_glCore_glGetColorTableParameteriv, "glGetColorTableParameteriv" }, + { &__blue_glCore_glColorSubTable, "glColorSubTable" }, + { &__blue_glCore_glCopyColorSubTable, "glCopyColorSubTable" }, + { &__blue_glCore_glConvolutionFilter1D, "glConvolutionFilter1D" }, + { &__blue_glCore_glConvolutionFilter2D, "glConvolutionFilter2D" }, + { &__blue_glCore_glConvolutionParameterf, "glConvolutionParameterf" }, + { &__blue_glCore_glConvolutionParameterfv, "glConvolutionParameterfv" }, + { &__blue_glCore_glConvolutionParameteri, "glConvolutionParameteri" }, + { &__blue_glCore_glConvolutionParameteriv, "glConvolutionParameteriv" }, + { &__blue_glCore_glCopyConvolutionFilter1D, "glCopyConvolutionFilter1D" }, + { &__blue_glCore_glCopyConvolutionFilter2D, "glCopyConvolutionFilter2D" }, + { &__blue_glCore_glGetConvolutionFilter, "glGetConvolutionFilter" }, + { &__blue_glCore_glGetConvolutionParameterfv, "glGetConvolutionParameterfv" }, + { &__blue_glCore_glGetConvolutionParameteriv, "glGetConvolutionParameteriv" }, + { &__blue_glCore_glGetSeparableFilter, "glGetSeparableFilter" }, + { &__blue_glCore_glSeparableFilter2D, "glSeparableFilter2D" }, + { &__blue_glCore_glGetHistogram, "glGetHistogram" }, + { &__blue_glCore_glGetHistogramParameterfv, "glGetHistogramParameterfv" }, + { &__blue_glCore_glGetHistogramParameteriv, "glGetHistogramParameteriv" }, + { &__blue_glCore_glGetMinmax, "glGetMinmax" }, + { &__blue_glCore_glGetMinmaxParameterfv, "glGetMinmaxParameterfv" }, + { &__blue_glCore_glGetMinmaxParameteriv, "glGetMinmaxParameteriv" }, + { &__blue_glCore_glHistogram, "glHistogram" }, + { &__blue_glCore_glMinmax, "glMinmax" }, + { &__blue_glCore_glResetHistogram, "glResetHistogram" }, + { &__blue_glCore_glResetMinmax, "glResetMinmax" }, + { &__blue_glCore_glVertexAttribDivisorARB, "glVertexAttribDivisorARB" }, + { &__blue_glCore_glCurrentPaletteMatrixARB, "glCurrentPaletteMatrixARB" }, + { &__blue_glCore_glMatrixIndexubvARB, "glMatrixIndexubvARB" }, + { &__blue_glCore_glMatrixIndexusvARB, "glMatrixIndexusvARB" }, + { &__blue_glCore_glMatrixIndexuivARB, "glMatrixIndexuivARB" }, + { &__blue_glCore_glMatrixIndexPointerARB, "glMatrixIndexPointerARB" }, + { &__blue_glCore_glSampleCoverageARB, "glSampleCoverageARB" }, + { &__blue_glCore_glActiveTextureARB, "glActiveTextureARB" }, + { &__blue_glCore_glClientActiveTextureARB, "glClientActiveTextureARB" }, + { &__blue_glCore_glMultiTexCoord1dARB, "glMultiTexCoord1dARB" }, + { &__blue_glCore_glMultiTexCoord1dvARB, "glMultiTexCoord1dvARB" }, + { &__blue_glCore_glMultiTexCoord1fARB, "glMultiTexCoord1fARB" }, + { &__blue_glCore_glMultiTexCoord1fvARB, "glMultiTexCoord1fvARB" }, + { &__blue_glCore_glMultiTexCoord1iARB, "glMultiTexCoord1iARB" }, + { &__blue_glCore_glMultiTexCoord1ivARB, "glMultiTexCoord1ivARB" }, + { &__blue_glCore_glMultiTexCoord1sARB, "glMultiTexCoord1sARB" }, + { &__blue_glCore_glMultiTexCoord1svARB, "glMultiTexCoord1svARB" }, + { &__blue_glCore_glMultiTexCoord2dARB, "glMultiTexCoord2dARB" }, + { &__blue_glCore_glMultiTexCoord2dvARB, "glMultiTexCoord2dvARB" }, + { &__blue_glCore_glMultiTexCoord2fARB, "glMultiTexCoord2fARB" }, + { &__blue_glCore_glMultiTexCoord2fvARB, "glMultiTexCoord2fvARB" }, + { &__blue_glCore_glMultiTexCoord2iARB, "glMultiTexCoord2iARB" }, + { &__blue_glCore_glMultiTexCoord2ivARB, "glMultiTexCoord2ivARB" }, + { &__blue_glCore_glMultiTexCoord2sARB, "glMultiTexCoord2sARB" }, + { &__blue_glCore_glMultiTexCoord2svARB, "glMultiTexCoord2svARB" }, + { &__blue_glCore_glMultiTexCoord3dARB, "glMultiTexCoord3dARB" }, + { &__blue_glCore_glMultiTexCoord3dvARB, "glMultiTexCoord3dvARB" }, + { &__blue_glCore_glMultiTexCoord3fARB, "glMultiTexCoord3fARB" }, + { &__blue_glCore_glMultiTexCoord3fvARB, "glMultiTexCoord3fvARB" }, + { &__blue_glCore_glMultiTexCoord3iARB, "glMultiTexCoord3iARB" }, + { &__blue_glCore_glMultiTexCoord3ivARB, "glMultiTexCoord3ivARB" }, + { &__blue_glCore_glMultiTexCoord3sARB, "glMultiTexCoord3sARB" }, + { &__blue_glCore_glMultiTexCoord3svARB, "glMultiTexCoord3svARB" }, + { &__blue_glCore_glMultiTexCoord4dARB, "glMultiTexCoord4dARB" }, + { &__blue_glCore_glMultiTexCoord4dvARB, "glMultiTexCoord4dvARB" }, + { &__blue_glCore_glMultiTexCoord4fARB, "glMultiTexCoord4fARB" }, + { &__blue_glCore_glMultiTexCoord4fvARB, "glMultiTexCoord4fvARB" }, + { &__blue_glCore_glMultiTexCoord4iARB, "glMultiTexCoord4iARB" }, + { &__blue_glCore_glMultiTexCoord4ivARB, "glMultiTexCoord4ivARB" }, + { &__blue_glCore_glMultiTexCoord4sARB, "glMultiTexCoord4sARB" }, + { &__blue_glCore_glMultiTexCoord4svARB, "glMultiTexCoord4svARB" }, + { &__blue_glCore_glGenQueriesARB, "glGenQueriesARB" }, + { &__blue_glCore_glDeleteQueriesARB, "glDeleteQueriesARB" }, + { &__blue_glCore_glIsQueryARB, "glIsQueryARB" }, + { &__blue_glCore_glBeginQueryARB, "glBeginQueryARB" }, + { &__blue_glCore_glEndQueryARB, "glEndQueryARB" }, + { &__blue_glCore_glGetQueryivARB, "glGetQueryivARB" }, + { &__blue_glCore_glGetQueryObjectivARB, "glGetQueryObjectivARB" }, + { &__blue_glCore_glGetQueryObjectuivARB, "glGetQueryObjectuivARB" }, + { &__blue_glCore_glMaxShaderCompilerThreadsARB, "glMaxShaderCompilerThreadsARB" }, + { &__blue_glCore_glPointParameterfARB, "glPointParameterfARB" }, + { &__blue_glCore_glPointParameterfvARB, "glPointParameterfvARB" }, + { &__blue_glCore_glGetnMapdvARB, "glGetnMapdvARB" }, + { &__blue_glCore_glGetnMapfvARB, "glGetnMapfvARB" }, + { &__blue_glCore_glGetnMapivARB, "glGetnMapivARB" }, + { &__blue_glCore_glGetnPixelMapfvARB, "glGetnPixelMapfvARB" }, + { &__blue_glCore_glGetnPixelMapuivARB, "glGetnPixelMapuivARB" }, + { &__blue_glCore_glGetnPixelMapusvARB, "glGetnPixelMapusvARB" }, + { &__blue_glCore_glGetnPolygonStippleARB, "glGetnPolygonStippleARB" }, + { &__blue_glCore_glGetnColorTableARB, "glGetnColorTableARB" }, + { &__blue_glCore_glGetnConvolutionFilterARB, "glGetnConvolutionFilterARB" }, + { &__blue_glCore_glGetnSeparableFilterARB, "glGetnSeparableFilterARB" }, + { &__blue_glCore_glGetnHistogramARB, "glGetnHistogramARB" }, + { &__blue_glCore_glGetnMinmaxARB, "glGetnMinmaxARB" }, + { &__blue_glCore_glFramebufferSampleLocationsfvARB, "glFramebufferSampleLocationsfvARB" }, + { &__blue_glCore_glNamedFramebufferSampleLocationsfvARB, "glNamedFramebufferSampleLocationsfvARB" }, + { &__blue_glCore_glEvaluateDepthValuesARB, "glEvaluateDepthValuesARB" }, + { &__blue_glCore_glDeleteObjectARB, "glDeleteObjectARB" }, + { &__blue_glCore_glGetHandleARB, "glGetHandleARB" }, + { &__blue_glCore_glDetachObjectARB, "glDetachObjectARB" }, + { &__blue_glCore_glCreateShaderObjectARB, "glCreateShaderObjectARB" }, + { &__blue_glCore_glShaderSourceARB, "glShaderSourceARB" }, + { &__blue_glCore_glCompileShaderARB, "glCompileShaderARB" }, + { &__blue_glCore_glCreateProgramObjectARB, "glCreateProgramObjectARB" }, + { &__blue_glCore_glAttachObjectARB, "glAttachObjectARB" }, + { &__blue_glCore_glLinkProgramARB, "glLinkProgramARB" }, + { &__blue_glCore_glUseProgramObjectARB, "glUseProgramObjectARB" }, + { &__blue_glCore_glValidateProgramARB, "glValidateProgramARB" }, + { &__blue_glCore_glUniform1fARB, "glUniform1fARB" }, + { &__blue_glCore_glUniform2fARB, "glUniform2fARB" }, + { &__blue_glCore_glUniform3fARB, "glUniform3fARB" }, + { &__blue_glCore_glUniform4fARB, "glUniform4fARB" }, + { &__blue_glCore_glUniform1iARB, "glUniform1iARB" }, + { &__blue_glCore_glUniform2iARB, "glUniform2iARB" }, + { &__blue_glCore_glUniform3iARB, "glUniform3iARB" }, + { &__blue_glCore_glUniform4iARB, "glUniform4iARB" }, + { &__blue_glCore_glUniform1fvARB, "glUniform1fvARB" }, + { &__blue_glCore_glUniform2fvARB, "glUniform2fvARB" }, + { &__blue_glCore_glUniform3fvARB, "glUniform3fvARB" }, + { &__blue_glCore_glUniform4fvARB, "glUniform4fvARB" }, + { &__blue_glCore_glUniform1ivARB, "glUniform1ivARB" }, + { &__blue_glCore_glUniform2ivARB, "glUniform2ivARB" }, + { &__blue_glCore_glUniform3ivARB, "glUniform3ivARB" }, + { &__blue_glCore_glUniform4ivARB, "glUniform4ivARB" }, + { &__blue_glCore_glUniformMatrix2fvARB, "glUniformMatrix2fvARB" }, + { &__blue_glCore_glUniformMatrix3fvARB, "glUniformMatrix3fvARB" }, + { &__blue_glCore_glUniformMatrix4fvARB, "glUniformMatrix4fvARB" }, + { &__blue_glCore_glGetObjectParameterfvARB, "glGetObjectParameterfvARB" }, + { &__blue_glCore_glGetObjectParameterivARB, "glGetObjectParameterivARB" }, + { &__blue_glCore_glGetInfoLogARB, "glGetInfoLogARB" }, + { &__blue_glCore_glGetAttachedObjectsARB, "glGetAttachedObjectsARB" }, + { &__blue_glCore_glGetUniformLocationARB, "glGetUniformLocationARB" }, + { &__blue_glCore_glGetActiveUniformARB, "glGetActiveUniformARB" }, + { &__blue_glCore_glGetUniformfvARB, "glGetUniformfvARB" }, + { &__blue_glCore_glGetUniformivARB, "glGetUniformivARB" }, + { &__blue_glCore_glGetShaderSourceARB, "glGetShaderSourceARB" }, + { &__blue_glCore_glTexBufferARB, "glTexBufferARB" }, + { &__blue_glCore_glCompressedTexImage3DARB, "glCompressedTexImage3DARB" }, + { &__blue_glCore_glCompressedTexImage2DARB, "glCompressedTexImage2DARB" }, + { &__blue_glCore_glCompressedTexImage1DARB, "glCompressedTexImage1DARB" }, + { &__blue_glCore_glCompressedTexSubImage3DARB, "glCompressedTexSubImage3DARB" }, + { &__blue_glCore_glCompressedTexSubImage2DARB, "glCompressedTexSubImage2DARB" }, + { &__blue_glCore_glCompressedTexSubImage1DARB, "glCompressedTexSubImage1DARB" }, + { &__blue_glCore_glGetCompressedTexImageARB, "glGetCompressedTexImageARB" }, + { &__blue_glCore_glLoadTransposeMatrixfARB, "glLoadTransposeMatrixfARB" }, + { &__blue_glCore_glLoadTransposeMatrixdARB, "glLoadTransposeMatrixdARB" }, + { &__blue_glCore_glMultTransposeMatrixfARB, "glMultTransposeMatrixfARB" }, + { &__blue_glCore_glMultTransposeMatrixdARB, "glMultTransposeMatrixdARB" }, + { &__blue_glCore_glWeightbvARB, "glWeightbvARB" }, + { &__blue_glCore_glWeightsvARB, "glWeightsvARB" }, + { &__blue_glCore_glWeightivARB, "glWeightivARB" }, + { &__blue_glCore_glWeightfvARB, "glWeightfvARB" }, + { &__blue_glCore_glWeightdvARB, "glWeightdvARB" }, + { &__blue_glCore_glWeightubvARB, "glWeightubvARB" }, + { &__blue_glCore_glWeightusvARB, "glWeightusvARB" }, + { &__blue_glCore_glWeightuivARB, "glWeightuivARB" }, + { &__blue_glCore_glWeightPointerARB, "glWeightPointerARB" }, + { &__blue_glCore_glVertexBlendARB, "glVertexBlendARB" }, + { &__blue_glCore_glBindBufferARB, "glBindBufferARB" }, + { &__blue_glCore_glDeleteBuffersARB, "glDeleteBuffersARB" }, + { &__blue_glCore_glGenBuffersARB, "glGenBuffersARB" }, + { &__blue_glCore_glIsBufferARB, "glIsBufferARB" }, + { &__blue_glCore_glBufferDataARB, "glBufferDataARB" }, + { &__blue_glCore_glBufferSubDataARB, "glBufferSubDataARB" }, + { &__blue_glCore_glGetBufferSubDataARB, "glGetBufferSubDataARB" }, { &__blue_glCore_glMapBufferARB, "glMapBufferARB" }, - { &__blue_glCore_glBindVideoCaptureStreamTextureNV, "glBindVideoCaptureStreamTextureNV" }, - { &__blue_glCore_glConvolutionParameterxvOES, "glConvolutionParameterxvOES" }, - { &__blue_glCore_glTexParameterIuivEXT, "glTexParameterIuivEXT" }, - { &__blue_glCore_glVertexAttribI4ubv, "glVertexAttribI4ubv" }, - { &__blue_glCore_glTexSubImage1DEXT, "glTexSubImage1DEXT" }, - { &__blue_glCore_glTextureStorage2DEXT, "glTextureStorage2DEXT" }, - { &__blue_glCore_glTexSubImage3DEXT, "glTexSubImage3DEXT" }, - { &__blue_glCore_glVertex2xvOES, "glVertex2xvOES" }, - { &__blue_glCore_glGetMultiTexImageEXT, "glGetMultiTexImageEXT" }, - { &__blue_glCore_glNormalStream3ivATI, "glNormalStream3ivATI" }, - { &__blue_glCore_glGetNamedBufferPointerv, "glGetNamedBufferPointerv" }, - { &__blue_glCore_glTexBuffer, "glTexBuffer" }, - { &__blue_glCore_glCombinerInputNV, "glCombinerInputNV" }, + { &__blue_glCore_glUnmapBufferARB, "glUnmapBufferARB" }, + { &__blue_glCore_glGetBufferParameterivARB, "glGetBufferParameterivARB" }, + { &__blue_glCore_glGetBufferPointervARB, "glGetBufferPointervARB" }, { &__blue_glCore_glVertexAttrib1dARB, "glVertexAttrib1dARB" }, - { &__blue_glCore_glVertexP3ui, "glVertexP3ui" }, - { &__blue_glCore_glMatrixMult3x2fNV, "glMatrixMult3x2fNV" }, - { &__blue_glCore_glNamedFramebufferTexture2DEXT, "glNamedFramebufferTexture2DEXT" }, - { &__blue_glCore_glGetTextureLevelParameteriv, "glGetTextureLevelParameteriv" }, - { &__blue_glCore_glPixelMapx, "glPixelMapx" }, - { &__blue_glCore_glBlendFuncSeparatei, "glBlendFuncSeparatei" }, - { &__blue_glCore_glTessellationModeAMD, "glTessellationModeAMD" }, - { &__blue_glCore_glProgramEnvParametersI4uivNV, "glProgramEnvParametersI4uivNV" }, - { &__blue_glCore_glGetColorTableParameterfvEXT, "glGetColorTableParameterfvEXT" }, - { &__blue_glCore_glVertexAttribI1uiEXT, "glVertexAttribI1uiEXT" }, - { &__blue_glCore_glPrioritizeTexturesEXT, "glPrioritizeTexturesEXT" }, - { &__blue_glCore_glProgramUniform1i64vNV, "glProgramUniform1i64vNV" }, - { &__blue_glCore_glGetTextureParameteriv, "glGetTextureParameteriv" }, - { &__blue_glCore_glGetTransformFeedbackiv, "glGetTransformFeedbackiv" }, - { &__blue_glCore_glMultiDrawArraysIndirectBindlessCountNV, "glMultiDrawArraysIndirectBindlessCountNV" }, - { &__blue_glCore_glUseShaderProgramEXT, "glUseShaderProgramEXT" }, - { &__blue_glCore_glDeleteTransformFeedbacks, "glDeleteTransformFeedbacks" }, - { &__blue_glCore_glCoverageModulationTableNV, "glCoverageModulationTableNV" }, - { &__blue_glCore_glMultiTexCoord1d, "glMultiTexCoord1d" }, - { &__blue_glCore_glGetTexLevelParameteriv, "glGetTexLevelParameteriv" }, - { &__blue_glCore_glProgramUniform4ui, "glProgramUniform4ui" }, - { &__blue_glCore_glProgramUniform4iv, "glProgramUniform4iv" }, - { &__blue_glCore_glTangent3fvEXT, "glTangent3fvEXT" }, - { &__blue_glCore_glViewportIndexedfv, "glViewportIndexedfv" }, - { &__blue_glCore_glSampleMaski, "glSampleMaski" }, - { &__blue_glCore_glProgramUniformMatrix4x3dvEXT, "glProgramUniformMatrix4x3dvEXT" }, - { &__blue_glCore_glCompileShaderARB, "glCompileShaderARB" }, - { &__blue_glCore_glUniform4ui64ARB, "glUniform4ui64ARB" }, - { &__blue_glCore_glTexCoord3xOES, "glTexCoord3xOES" }, - { &__blue_glCore_glGetInternalformativ, "glGetInternalformativ" }, - { &__blue_glCore_glObjectPtrLabel, "glObjectPtrLabel" }, - { &__blue_glCore_glNormal3hvNV, "glNormal3hvNV" }, - { &__blue_glCore_glProgramUniform1uiv, "glProgramUniform1uiv" }, - { &__blue_glCore_glGenFragmentShadersATI, "glGenFragmentShadersATI" }, - { &__blue_glCore_glTexCoord2hvNV, "glTexCoord2hvNV" }, - { &__blue_glCore_glFinishAsyncSGIX, "glFinishAsyncSGIX" }, - { &__blue_glCore_glEnableVertexAttribArrayARB, "glEnableVertexAttribArrayARB" }, - { &__blue_glCore_glDeleteSamplers, "glDeleteSamplers" }, + { &__blue_glCore_glVertexAttrib1dvARB, "glVertexAttrib1dvARB" }, + { &__blue_glCore_glVertexAttrib1fARB, "glVertexAttrib1fARB" }, { &__blue_glCore_glVertexAttrib1fvARB, "glVertexAttrib1fvARB" }, - { &__blue_glCore_glGetnUniformivARB, "glGetnUniformivARB" }, - { &__blue_glCore_glLoadTransposeMatrixd, "glLoadTransposeMatrixd" }, - { &__blue_glCore_glProgramParameteri, "glProgramParameteri" }, - { &__blue_glCore_glCreateShader, "glCreateShader" }, - { &__blue_glCore_glFragmentCoverageColorNV, "glFragmentCoverageColorNV" }, - { &__blue_glCore_glVertexStream3dvATI, "glVertexStream3dvATI" }, - { &__blue_glCore_glUniformHandleui64ARB, "glUniformHandleui64ARB" }, - { &__blue_glCore_glGetVaryingLocationNV, "glGetVaryingLocationNV" }, - { &__blue_glCore_glCompressedTextureSubImage2DEXT, "glCompressedTextureSubImage2DEXT" }, - { &__blue_glCore_glTangent3dEXT, "glTangent3dEXT" }, - { &__blue_glCore_glGetNamedBufferPointervEXT, "glGetNamedBufferPointervEXT" }, - { &__blue_glCore_glVertex2bvOES, "glVertex2bvOES" }, - { &__blue_glCore_glProgramBufferParametersIuivNV, "glProgramBufferParametersIuivNV" }, - { &__blue_glCore_glGetnTexImageARB, "glGetnTexImageARB" }, - { &__blue_glCore_glSetFenceNV, "glSetFenceNV" }, - { &__blue_glCore_glPathParameterfvNV, "glPathParameterfvNV" }, - { &__blue_glCore_glVertexAttribFormat, "glVertexAttribFormat" }, - { &__blue_glCore_glConservativeRasterParameterfNV, "glConservativeRasterParameterfNV" }, - { &__blue_glCore_glGetVertexAttribIuivEXT, "glGetVertexAttribIuivEXT" }, - { &__blue_glCore_glBindMultiTextureEXT, "glBindMultiTextureEXT" }, - { &__blue_glCore_glMapControlPointsNV, "glMapControlPointsNV" }, - { &__blue_glCore_glVertexAttrib4Nsv, "glVertexAttrib4Nsv" }, - { &__blue_glCore_glCompressedMultiTexImage2DEXT, "glCompressedMultiTexImage2DEXT" }, - { &__blue_glCore_glIsNamedBufferResidentNV, "glIsNamedBufferResidentNV" }, - { &__blue_glCore_glLoadProgramNV, "glLoadProgramNV" }, - { &__blue_glCore_glClearColor, "glClearColor" }, - { &__blue_glCore_glUniform2uivEXT, "glUniform2uivEXT" }, - { &__blue_glCore_glMultiTexGenfEXT, "glMultiTexGenfEXT" }, - { &__blue_glCore_glGetUniformdv, "glGetUniformdv" }, - { &__blue_glCore_glGenRenderbuffersEXT, "glGenRenderbuffersEXT" }, - { &__blue_glCore_glGetMultisamplefv, "glGetMultisamplefv" }, - { &__blue_glCore_glMapNamedBuffer, "glMapNamedBuffer" }, - { &__blue_glCore_glDeleteFramebuffersEXT, "glDeleteFramebuffersEXT" }, - { &__blue_glCore_glVertexAttribI4usvEXT, "glVertexAttribI4usvEXT" }, - { &__blue_glCore_glSecondaryColor3hNV, "glSecondaryColor3hNV" }, - { &__blue_glCore_glGenerateMipmap, "glGenerateMipmap" }, - { &__blue_glCore_glProgramEnvParameterI4uivNV, "glProgramEnvParameterI4uivNV" }, - { &__blue_glCore_glSeparableFilter2D, "glSeparableFilter2D" }, - { &__blue_glCore_glFogCoorddEXT, "glFogCoorddEXT" }, - { &__blue_glCore_glGetPerfCounterInfoINTEL, "glGetPerfCounterInfoINTEL" }, - { &__blue_glCore_glUniform4uiv, "glUniform4uiv" }, - { &__blue_glCore_glVertexAttribL2dv, "glVertexAttribL2dv" }, - { &__blue_glCore_glUniform1dv, "glUniform1dv" }, - { &__blue_glCore_glVertexAttribL1ui64ARB, "glVertexAttribL1ui64ARB" }, - { &__blue_glCore_glEndPerfQueryINTEL, "glEndPerfQueryINTEL" }, - { &__blue_glCore_glVertexArrayEdgeFlagOffsetEXT, "glVertexArrayEdgeFlagOffsetEXT" }, - { &__blue_glCore_glVertexAttrib1dv, "glVertexAttrib1dv" }, - { &__blue_glCore_glProgramUniformMatrix2dvEXT, "glProgramUniformMatrix2dvEXT" }, - { &__blue_glCore_glDepthRange, "glDepthRange" }, - { &__blue_glCore_glCombinerParameterfNV, "glCombinerParameterfNV" }, - { &__blue_glCore_glVariantArrayObjectATI, "glVariantArrayObjectATI" }, - { &__blue_glCore_glDeleteBuffersARB, "glDeleteBuffersARB" }, - { &__blue_glCore_glFragmentLightiSGIX, "glFragmentLightiSGIX" }, - { &__blue_glCore_glGetSamplerParameterIiv, "glGetSamplerParameterIiv" }, - { &__blue_glCore_glImportSyncEXT, "glImportSyncEXT" }, - { &__blue_glCore_glGetVertexAttribivARB, "glGetVertexAttribivARB" }, - { &__blue_glCore_glVertexAttribI2ui, "glVertexAttribI2ui" }, - { &__blue_glCore_glGetObjectParameterivARB, "glGetObjectParameterivARB" }, - { &__blue_glCore_glEnableClientStateiEXT, "glEnableClientStateiEXT" }, - { &__blue_glCore_glGetnUniformi64vARB, "glGetnUniformi64vARB" }, - { &__blue_glCore_glDeleteFencesAPPLE, "glDeleteFencesAPPLE" }, - { &__blue_glCore_glTransformFeedbackBufferRange, "glTransformFeedbackBufferRange" }, - { &__blue_glCore_glProgramUniform2fvEXT, "glProgramUniform2fvEXT" }, - { &__blue_glCore_glFramebufferTextureLayerARB, "glFramebufferTextureLayerARB" }, - { &__blue_glCore_glVertexAttribLFormatNV, "glVertexAttribLFormatNV" }, - { &__blue_glCore_glVertexAttrib2fvARB, "glVertexAttrib2fvARB" }, - { &__blue_glCore_glWindowPos4fvMESA, "glWindowPos4fvMESA" }, - { &__blue_glCore_glMakeNamedBufferResidentNV, "glMakeNamedBufferResidentNV" }, - { &__blue_glCore_glProgramUniformMatrix3x4fvEXT, "glProgramUniformMatrix3x4fvEXT" }, - { &__blue_glCore_glSamplePatternSGIS, "glSamplePatternSGIS" }, - { &__blue_glCore_glVDPAUGetSurfaceivNV, "glVDPAUGetSurfaceivNV" }, - { &__blue_glCore_glProgramUniformMatrix4x2fvEXT, "glProgramUniformMatrix4x2fvEXT" }, - { &__blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN, "glReplacementCodeuiColor3fVertex3fvSUN" }, - { &__blue_glCore_glWindowPos3sMESA, "glWindowPos3sMESA" }, - { &__blue_glCore_glTexGenxOES, "glTexGenxOES" }, - { &__blue_glCore_glVertexAttrib4dNV, "glVertexAttrib4dNV" }, - { &__blue_glCore_glTangentPointerEXT, "glTangentPointerEXT" }, - { &__blue_glCore_glPixelTransformParameterfvEXT, "glPixelTransformParameterfvEXT" }, - { &__blue_glCore_glProgramUniform1i, "glProgramUniform1i" }, - { &__blue_glCore_glMultiTexCoord2bOES, "glMultiTexCoord2bOES" }, - { &__blue_glCore_glVertexAttribI2iv, "glVertexAttribI2iv" }, - { &__blue_glCore_glWindowPos4iMESA, "glWindowPos4iMESA" }, - { &__blue_glCore_glTestFenceNV, "glTestFenceNV" }, - { &__blue_glCore_glDispatchComputeGroupSizeARB, "glDispatchComputeGroupSizeARB" }, - { &__blue_glCore_glShaderOp3EXT, "glShaderOp3EXT" }, - { &__blue_glCore_glSampleMaskSGIS, "glSampleMaskSGIS" }, - { &__blue_glCore_glMultiTexParameterivEXT, "glMultiTexParameterivEXT" }, - { &__blue_glCore_glGetnMinmax, "glGetnMinmax" }, - { &__blue_glCore_glColorP3ui, "glColorP3ui" }, - { &__blue_glCore_glBeginQueryARB, "glBeginQueryARB" }, - { &__blue_glCore_glMultiDrawArraysIndirectAMD, "glMultiDrawArraysIndirectAMD" }, - { &__blue_glCore_glRasterPos4xOES, "glRasterPos4xOES" }, - { &__blue_glCore_glFogCoordPointer, "glFogCoordPointer" }, - { &__blue_glCore_glTextureLightEXT, "glTextureLightEXT" }, - { &__blue_glCore_glGetCombinerInputParameterfvNV, "glGetCombinerInputParameterfvNV" }, - { &__blue_glCore_glDeleteFragmentShaderATI, "glDeleteFragmentShaderATI" }, - { &__blue_glCore_glMultiTexCoord2sv, "glMultiTexCoord2sv" }, - { &__blue_glCore_glMultiTexCoord2s, "glMultiTexCoord2s" }, - { &__blue_glCore_glLightModelxvOES, "glLightModelxvOES" }, - { &__blue_glCore_glTessellationFactorAMD, "glTessellationFactorAMD" }, - { &__blue_glCore_glVariantivEXT, "glVariantivEXT" }, - { &__blue_glCore_glNamedFramebufferRenderbuffer, "glNamedFramebufferRenderbuffer" }, - { &__blue_glCore_glWindowPos2ivARB, "glWindowPos2ivARB" }, - { &__blue_glCore_glVertexArrayFogCoordOffsetEXT, "glVertexArrayFogCoordOffsetEXT" }, - { &__blue_glCore_glUniform2i, "glUniform2i" }, - { &__blue_glCore_glGetTexBumpParameterivATI, "glGetTexBumpParameterivATI" }, - { &__blue_glCore_glSamplerParameterIuiv, "glSamplerParameterIuiv" }, - { &__blue_glCore_glClearBufferfv, "glClearBufferfv" }, - { &__blue_glCore_glBindTextureUnitParameterEXT, "glBindTextureUnitParameterEXT" }, - { &__blue_glCore_glMultiTexCoord3hNV, "glMultiTexCoord3hNV" }, - { &__blue_glCore_glSecondaryColor3us, "glSecondaryColor3us" }, - { &__blue_glCore_glReplacementCodeusvSUN, "glReplacementCodeusvSUN" }, - { &__blue_glCore_glSecondaryColor3bvEXT, "glSecondaryColor3bvEXT" }, - { &__blue_glCore_glGetProgramPipelineInfoLog, "glGetProgramPipelineInfoLog" }, - { &__blue_glCore_glGetVideoi64vNV, "glGetVideoi64vNV" }, - { &__blue_glCore_glMultiTexCoord3iv, "glMultiTexCoord3iv" }, - { &__blue_glCore_glVertexArrayTexCoordOffsetEXT, "glVertexArrayTexCoordOffsetEXT" }, - { &__blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT, "glNamedRenderbufferStorageMultisampleCoverageEXT" }, - { &__blue_glCore_glGetSamplerParameterIuiv, "glGetSamplerParameterIuiv" }, - { &__blue_glCore_glVertexAttrib2dARB, "glVertexAttrib2dARB" }, - { &__blue_glCore_glNormalStream3svATI, "glNormalStream3svATI" }, - { &__blue_glCore_glClientActiveVertexStreamATI, "glClientActiveVertexStreamATI" }, - { &__blue_glCore_glStencilThenCoverFillPathInstancedNV, "glStencilThenCoverFillPathInstancedNV" }, - { &__blue_glCore_glSecondaryColor3uiEXT, "glSecondaryColor3uiEXT" }, - { &__blue_glCore_glTexCoord2hNV, "glTexCoord2hNV" }, - { &__blue_glCore_glVertexAttrib3fARB, "glVertexAttrib3fARB" }, - { &__blue_glCore_glGetQueryBufferObjectui64v, "glGetQueryBufferObjectui64v" }, - { &__blue_glCore_glGetMaterialxOES, "glGetMaterialxOES" }, - { &__blue_glCore_glMultiDrawArrays, "glMultiDrawArrays" }, - { &__blue_glCore_glSecondaryColor3iEXT, "glSecondaryColor3iEXT" }, - { &__blue_glCore_glProgramUniform2ui64NV, "glProgramUniform2ui64NV" }, - { &__blue_glCore_glDeleteQueries, "glDeleteQueries" }, - { &__blue_glCore_glDeleteRenderbuffers, "glDeleteRenderbuffers" }, - { &__blue_glCore_glGetProgramLocalParameterdvARB, "glGetProgramLocalParameterdvARB" }, - { &__blue_glCore_glTexCoord2xOES, "glTexCoord2xOES" }, - { &__blue_glCore_glBindBuffer, "glBindBuffer" }, - { &__blue_glCore_glResumeTransformFeedback, "glResumeTransformFeedback" }, - { &__blue_glCore_glFlushPixelDataRangeNV, "glFlushPixelDataRangeNV" }, - { &__blue_glCore_glSecondaryColorPointer, "glSecondaryColorPointer" }, - { &__blue_glCore_glVideoCaptureStreamParameterdvNV, "glVideoCaptureStreamParameterdvNV" }, - { &__blue_glCore_glTextureSubImage2DEXT, "glTextureSubImage2DEXT" }, - { &__blue_glCore_glDeletePathsNV, "glDeletePathsNV" }, - { &__blue_glCore_glGetFloatv, "glGetFloatv" }, - { &__blue_glCore_glVertexAttribI3uivEXT, "glVertexAttribI3uivEXT" }, + { &__blue_glCore_glVertexAttrib1sARB, "glVertexAttrib1sARB" }, + { &__blue_glCore_glVertexAttrib1svARB, "glVertexAttrib1svARB" }, + { &__blue_glCore_glVertexAttrib2dARB, "glVertexAttrib2dARB" }, + { &__blue_glCore_glVertexAttrib2dvARB, "glVertexAttrib2dvARB" }, + { &__blue_glCore_glVertexAttrib2fARB, "glVertexAttrib2fARB" }, + { &__blue_glCore_glVertexAttrib2fvARB, "glVertexAttrib2fvARB" }, + { &__blue_glCore_glVertexAttrib2sARB, "glVertexAttrib2sARB" }, + { &__blue_glCore_glVertexAttrib2svARB, "glVertexAttrib2svARB" }, + { &__blue_glCore_glVertexAttrib3dARB, "glVertexAttrib3dARB" }, + { &__blue_glCore_glVertexAttrib3dvARB, "glVertexAttrib3dvARB" }, + { &__blue_glCore_glVertexAttrib3fARB, "glVertexAttrib3fARB" }, + { &__blue_glCore_glVertexAttrib3fvARB, "glVertexAttrib3fvARB" }, + { &__blue_glCore_glVertexAttrib3sARB, "glVertexAttrib3sARB" }, + { &__blue_glCore_glVertexAttrib3svARB, "glVertexAttrib3svARB" }, + { &__blue_glCore_glVertexAttrib4NbvARB, "glVertexAttrib4NbvARB" }, + { &__blue_glCore_glVertexAttrib4NivARB, "glVertexAttrib4NivARB" }, + { &__blue_glCore_glVertexAttrib4NsvARB, "glVertexAttrib4NsvARB" }, + { &__blue_glCore_glVertexAttrib4NubARB, "glVertexAttrib4NubARB" }, + { &__blue_glCore_glVertexAttrib4NubvARB, "glVertexAttrib4NubvARB" }, + { &__blue_glCore_glVertexAttrib4NuivARB, "glVertexAttrib4NuivARB" }, + { &__blue_glCore_glVertexAttrib4NusvARB, "glVertexAttrib4NusvARB" }, + { &__blue_glCore_glVertexAttrib4bvARB, "glVertexAttrib4bvARB" }, + { &__blue_glCore_glVertexAttrib4dARB, "glVertexAttrib4dARB" }, + { &__blue_glCore_glVertexAttrib4dvARB, "glVertexAttrib4dvARB" }, + { &__blue_glCore_glVertexAttrib4fARB, "glVertexAttrib4fARB" }, + { &__blue_glCore_glVertexAttrib4fvARB, "glVertexAttrib4fvARB" }, + { &__blue_glCore_glVertexAttrib4ivARB, "glVertexAttrib4ivARB" }, + { &__blue_glCore_glVertexAttrib4sARB, "glVertexAttrib4sARB" }, + { &__blue_glCore_glVertexAttrib4svARB, "glVertexAttrib4svARB" }, + { &__blue_glCore_glVertexAttrib4ubvARB, "glVertexAttrib4ubvARB" }, + { &__blue_glCore_glVertexAttrib4uivARB, "glVertexAttrib4uivARB" }, + { &__blue_glCore_glVertexAttrib4usvARB, "glVertexAttrib4usvARB" }, + { &__blue_glCore_glVertexAttribPointerARB, "glVertexAttribPointerARB" }, + { &__blue_glCore_glEnableVertexAttribArrayARB, "glEnableVertexAttribArrayARB" }, + { &__blue_glCore_glDisableVertexAttribArrayARB, "glDisableVertexAttribArrayARB" }, { &__blue_glCore_glGetVertexAttribdvARB, "glGetVertexAttribdvARB" }, - { &__blue_glCore_glUniform4ui64NV, "glUniform4ui64NV" }, - { &__blue_glCore_glGetTextureLevelParameterfv, "glGetTextureLevelParameterfv" }, - { &__blue_glCore_glWindowPos2i, "glWindowPos2i" }, - { &__blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN, "glReplacementCodeuiColor4ubVertex3fSUN" }, - { &__blue_glCore_glCompressedMultiTexSubImage3DEXT, "glCompressedMultiTexSubImage3DEXT" }, - { &__blue_glCore_glGetTexParameterIivEXT, "glGetTexParameterIivEXT" }, - { &__blue_glCore_glDebugMessageCallbackARB, "glDebugMessageCallbackARB" }, - { &__blue_glCore_glWeightPointerARB, "glWeightPointerARB" }, + { &__blue_glCore_glGetVertexAttribfvARB, "glGetVertexAttribfvARB" }, + { &__blue_glCore_glGetVertexAttribivARB, "glGetVertexAttribivARB" }, + { &__blue_glCore_glGetVertexAttribPointervARB, "glGetVertexAttribPointervARB" }, + { &__blue_glCore_glBindAttribLocationARB, "glBindAttribLocationARB" }, + { &__blue_glCore_glGetActiveAttribARB, "glGetActiveAttribARB" }, + { &__blue_glCore_glGetAttribLocationARB, "glGetAttribLocationARB" }, + { &__blue_glCore_glWindowPos2dARB, "glWindowPos2dARB" }, + { &__blue_glCore_glWindowPos2dvARB, "glWindowPos2dvARB" }, + { &__blue_glCore_glWindowPos2fARB, "glWindowPos2fARB" }, + { &__blue_glCore_glWindowPos2fvARB, "glWindowPos2fvARB" }, + { &__blue_glCore_glWindowPos2iARB, "glWindowPos2iARB" }, + { &__blue_glCore_glWindowPos2ivARB, "glWindowPos2ivARB" }, + { &__blue_glCore_glWindowPos2sARB, "glWindowPos2sARB" }, + { &__blue_glCore_glWindowPos2svARB, "glWindowPos2svARB" }, + { &__blue_glCore_glWindowPos3dARB, "glWindowPos3dARB" }, + { &__blue_glCore_glWindowPos3dvARB, "glWindowPos3dvARB" }, + { &__blue_glCore_glWindowPos3fARB, "glWindowPos3fARB" }, + { &__blue_glCore_glWindowPos3fvARB, "glWindowPos3fvARB" }, + { &__blue_glCore_glWindowPos3iARB, "glWindowPos3iARB" }, + { &__blue_glCore_glWindowPos3ivARB, "glWindowPos3ivARB" }, + { &__blue_glCore_glWindowPos3sARB, "glWindowPos3sARB" }, + { &__blue_glCore_glWindowPos3svARB, "glWindowPos3svARB" }, + { &__blue_glCore_glBlendBarrierKHR, "glBlendBarrierKHR" }, + { &__blue_glCore_glMultiTexCoord1bOES, "glMultiTexCoord1bOES" }, + { &__blue_glCore_glMultiTexCoord1bvOES, "glMultiTexCoord1bvOES" }, + { &__blue_glCore_glMultiTexCoord2bOES, "glMultiTexCoord2bOES" }, + { &__blue_glCore_glMultiTexCoord2bvOES, "glMultiTexCoord2bvOES" }, + { &__blue_glCore_glMultiTexCoord3bOES, "glMultiTexCoord3bOES" }, + { &__blue_glCore_glMultiTexCoord3bvOES, "glMultiTexCoord3bvOES" }, + { &__blue_glCore_glMultiTexCoord4bOES, "glMultiTexCoord4bOES" }, + { &__blue_glCore_glMultiTexCoord4bvOES, "glMultiTexCoord4bvOES" }, + { &__blue_glCore_glTexCoord1bOES, "glTexCoord1bOES" }, + { &__blue_glCore_glTexCoord1bvOES, "glTexCoord1bvOES" }, + { &__blue_glCore_glTexCoord2bOES, "glTexCoord2bOES" }, + { &__blue_glCore_glTexCoord2bvOES, "glTexCoord2bvOES" }, + { &__blue_glCore_glTexCoord3bOES, "glTexCoord3bOES" }, + { &__blue_glCore_glTexCoord3bvOES, "glTexCoord3bvOES" }, + { &__blue_glCore_glTexCoord4bOES, "glTexCoord4bOES" }, + { &__blue_glCore_glTexCoord4bvOES, "glTexCoord4bvOES" }, + { &__blue_glCore_glVertex2bOES, "glVertex2bOES" }, + { &__blue_glCore_glVertex2bvOES, "glVertex2bvOES" }, + { &__blue_glCore_glVertex3bOES, "glVertex3bOES" }, + { &__blue_glCore_glVertex3bvOES, "glVertex3bvOES" }, + { &__blue_glCore_glVertex4bOES, "glVertex4bOES" }, + { &__blue_glCore_glVertex4bvOES, "glVertex4bvOES" }, + { &__blue_glCore_glAlphaFuncxOES, "glAlphaFuncxOES" }, + { &__blue_glCore_glClearColorxOES, "glClearColorxOES" }, + { &__blue_glCore_glClearDepthxOES, "glClearDepthxOES" }, + { &__blue_glCore_glClipPlanexOES, "glClipPlanexOES" }, + { &__blue_glCore_glColor4xOES, "glColor4xOES" }, + { &__blue_glCore_glDepthRangexOES, "glDepthRangexOES" }, { &__blue_glCore_glFogxOES, "glFogxOES" }, - { &__blue_glCore_glProgramUniformMatrix2x4fvEXT, "glProgramUniformMatrix2x4fvEXT" }, - { &__blue_glCore_glVertexAttrib4iv, "glVertexAttrib4iv" }, - { &__blue_glCore_glProgramLocalParameterI4iNV, "glProgramLocalParameterI4iNV" }, - { &__blue_glCore_glGetnColorTableARB, "glGetnColorTableARB" }, - { &__blue_glCore_glClearNamedBufferData, "glClearNamedBufferData" }, - { &__blue_glCore_glColorMaskIndexedEXT, "glColorMaskIndexedEXT" }, - { &__blue_glCore_glVertexAttribLPointer, "glVertexAttribLPointer" }, - { &__blue_glCore_glProgramUniform3i64vNV, "glProgramUniform3i64vNV" }, - { &__blue_glCore_glScissor, "glScissor" }, - { &__blue_glCore_glSecondaryColor3fv, "glSecondaryColor3fv" }, - { &__blue_glCore_glCombinerParameterivNV, "glCombinerParameterivNV" }, - { &__blue_glCore_glGetTexLevelParameterfv, "glGetTexLevelParameterfv" }, - { &__blue_glCore_glDrawElementArrayATI, "glDrawElementArrayATI" }, - { &__blue_glCore_glVertexAttrib4Nusv, "glVertexAttrib4Nusv" }, - { &__blue_glCore_glWindowPos3dvMESA, "glWindowPos3dvMESA" }, - { &__blue_glCore_glMakeImageHandleResidentARB, "glMakeImageHandleResidentARB" }, - { &__blue_glCore_glWindowPos3svMESA, "glWindowPos3svMESA" }, - { &__blue_glCore_glGetMultiTexLevelParameterfvEXT, "glGetMultiTexLevelParameterfvEXT" }, - { &__blue_glCore_glRasterPos3xOES, "glRasterPos3xOES" }, - { &__blue_glCore_glBinormal3iEXT, "glBinormal3iEXT" }, - { &__blue_glCore_glVertexAttribP3uiv, "glVertexAttribP3uiv" }, - { &__blue_glCore_glProgramUniformMatrix2x3dv, "glProgramUniformMatrix2x3dv" }, - { &__blue_glCore_glEndConditionalRender, "glEndConditionalRender" }, - { &__blue_glCore_glBindParameterEXT, "glBindParameterEXT" }, - { &__blue_glCore_glCompileShaderIncludeARB, "glCompileShaderIncludeARB" }, - { &__blue_glCore_glTexStorageSparseAMD, "glTexStorageSparseAMD" }, - { &__blue_glCore_glCreateShaderProgramEXT, "glCreateShaderProgramEXT" }, - { &__blue_glCore_glUniformMatrix3x2fv, "glUniformMatrix3x2fv" }, - { &__blue_glCore_glPrimitiveRestartIndex, "glPrimitiveRestartIndex" }, - { &__blue_glCore_glCreateProgram, "glCreateProgram" }, - { &__blue_glCore_glMultiTexCoord3d, "glMultiTexCoord3d" }, - { &__blue_glCore_glGetFenceivNV, "glGetFenceivNV" }, - { &__blue_glCore_glUniform4dv, "glUniform4dv" }, - { &__blue_glCore_glUniform3i64ARB, "glUniform3i64ARB" }, - { &__blue_glCore_glTexturePageCommitmentEXT, "glTexturePageCommitmentEXT" }, - { &__blue_glCore_glColor4hNV, "glColor4hNV" }, - { &__blue_glCore_glVertexStream2fATI, "glVertexStream2fATI" }, - { &__blue_glCore_glDisable, "glDisable" }, - { &__blue_glCore_glFramebufferRenderbuffer, "glFramebufferRenderbuffer" }, - { &__blue_glCore_glIsRenderbufferEXT, "glIsRenderbufferEXT" }, - { &__blue_glCore_glGetMultiTexParameterIivEXT, "glGetMultiTexParameterIivEXT" }, - { &__blue_glCore_glVertexAttrib2fvNV, "glVertexAttrib2fvNV" }, - { &__blue_glCore_glReferencePlaneSGIX, "glReferencePlaneSGIX" }, - { &__blue_glCore_glUniform4fARB, "glUniform4fARB" }, - { &__blue_glCore_glClearBufferfi, "glClearBufferfi" }, - { &__blue_glCore_glBindFragDataLocation, "glBindFragDataLocation" }, - { &__blue_glCore_glGetIntegerv, "glGetIntegerv" }, - { &__blue_glCore_glGetObjectLabel, "glGetObjectLabel" }, - { &__blue_glCore_glBufferPageCommitmentARB, "glBufferPageCommitmentARB" }, - { &__blue_glCore_glBlendFuncIndexedAMD, "glBlendFuncIndexedAMD" }, - { &__blue_glCore_glGetQueryObjectui64vEXT, "glGetQueryObjectui64vEXT" }, - { &__blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN, "glReplacementCodeuiTexCoord2fVertex3fSUN" }, - { &__blue_glCore_glBlitFramebuffer, "glBlitFramebuffer" }, - { &__blue_glCore_glMultiTexCoord2f, "glMultiTexCoord2f" }, - { &__blue_glCore_glNamedFramebufferRenderbufferEXT, "glNamedFramebufferRenderbufferEXT" }, - { &__blue_glCore_glUseProgramStages, "glUseProgramStages" }, - { &__blue_glCore_glGetNamedStringivARB, "glGetNamedStringivARB" }, - { &__blue_glCore_glMultiTexCoord1iARB, "glMultiTexCoord1iARB" }, - { &__blue_glCore_glMultiTexCoord4xvOES, "glMultiTexCoord4xvOES" }, - { &__blue_glCore_glMakeImageHandleResidentNV, "glMakeImageHandleResidentNV" }, - { &__blue_glCore_glVertexAttrib1fvNV, "glVertexAttrib1fvNV" }, - { &__blue_glCore_glViewportIndexedf, "glViewportIndexedf" }, - { &__blue_glCore_glTexStorage3DMultisample, "glTexStorage3DMultisample" }, - { &__blue_glCore_glCreateShaderObjectARB, "glCreateShaderObjectARB" }, - { &__blue_glCore_glListDrawCommandsStatesClientNV, "glListDrawCommandsStatesClientNV" }, - { &__blue_glCore_glUniform1d, "glUniform1d" }, - { &__blue_glCore_glGetDebugMessageLogARB, "glGetDebugMessageLogARB" }, - { &__blue_glCore_glBlendParameteriNV, "glBlendParameteriNV" }, - { &__blue_glCore_glMultiTexCoord4sv, "glMultiTexCoord4sv" }, - { &__blue_glCore_glUniform1uiEXT, "glUniform1uiEXT" }, - { &__blue_glCore_glDebugMessageInsertAMD, "glDebugMessageInsertAMD" }, - { &__blue_glCore_glMultiDrawArraysIndirect, "glMultiDrawArraysIndirect" }, - { &__blue_glCore_glProgramUniform1d, "glProgramUniform1d" }, - { &__blue_glCore_glGetListParameterivSGIX, "glGetListParameterivSGIX" }, - { &__blue_glCore_glPointParameterfv, "glPointParameterfv" }, - { &__blue_glCore_glCopyBufferSubData, "glCopyBufferSubData" }, - { &__blue_glCore_glBindProgramARB, "glBindProgramARB" }, - { &__blue_glCore_glCombinerStageParameterfvNV, "glCombinerStageParameterfvNV" }, - { &__blue_glCore_glEndConditionalRenderNV, "glEndConditionalRenderNV" }, - { &__blue_glCore_glVertexAttribL3dEXT, "glVertexAttribL3dEXT" }, - { &__blue_glCore_glWindowPos3iv, "glWindowPos3iv" }, - { &__blue_glCore_glGetFogFuncSGIS, "glGetFogFuncSGIS" }, - { &__blue_glCore_glCompressedTexImage2D, "glCompressedTexImage2D" }, - { &__blue_glCore_glPixelTexGenParameteriSGIS, "glPixelTexGenParameteriSGIS" }, - { &__blue_glCore_glDebugMessageControlARB, "glDebugMessageControlARB" }, - { &__blue_glCore_glMapBufferRange, "glMapBufferRange" }, - { &__blue_glCore_glProgramUniform1fvEXT, "glProgramUniform1fvEXT" }, - { &__blue_glCore_glNamedRenderbufferStorageEXT, "glNamedRenderbufferStorageEXT" }, - { &__blue_glCore_glProgramUniformMatrix4x2fv, "glProgramUniformMatrix4x2fv" }, - { &__blue_glCore_glNamedProgramLocalParameterI4iEXT, "glNamedProgramLocalParameterI4iEXT" }, - { &__blue_glCore_glClearDepth, "glClearDepth" }, - { &__blue_glCore_glVertexAttribs1dvNV, "glVertexAttribs1dvNV" }, - { &__blue_glCore_glWindowPos3f, "glWindowPos3f" }, - { &__blue_glCore_glProvokingVertex, "glProvokingVertex" }, - { &__blue_glCore_glIsNamedStringARB, "glIsNamedStringARB" }, - { &__blue_glCore_glNamedBufferData, "glNamedBufferData" }, - { &__blue_glCore_glFragmentLightfSGIX, "glFragmentLightfSGIX" }, - { &__blue_glCore_glProgramUniform4uiv, "glProgramUniform4uiv" }, - { &__blue_glCore_glPointParameteriNV, "glPointParameteriNV" }, - { &__blue_glCore_glNamedFramebufferReadBuffer, "glNamedFramebufferReadBuffer" }, - { &__blue_glCore_glPatchParameterfv, "glPatchParameterfv" }, - { &__blue_glCore_glVertexArrayBindingDivisor, "glVertexArrayBindingDivisor" }, + { &__blue_glCore_glFogxvOES, "glFogxvOES" }, + { &__blue_glCore_glFrustumxOES, "glFrustumxOES" }, + { &__blue_glCore_glGetClipPlanexOES, "glGetClipPlanexOES" }, + { &__blue_glCore_glGetFixedvOES, "glGetFixedvOES" }, + { &__blue_glCore_glGetTexEnvxvOES, "glGetTexEnvxvOES" }, + { &__blue_glCore_glGetTexParameterxvOES, "glGetTexParameterxvOES" }, + { &__blue_glCore_glLightModelxOES, "glLightModelxOES" }, + { &__blue_glCore_glLightModelxvOES, "glLightModelxvOES" }, + { &__blue_glCore_glLightxOES, "glLightxOES" }, + { &__blue_glCore_glLightxvOES, "glLightxvOES" }, + { &__blue_glCore_glLineWidthxOES, "glLineWidthxOES" }, + { &__blue_glCore_glLoadMatrixxOES, "glLoadMatrixxOES" }, + { &__blue_glCore_glMaterialxOES, "glMaterialxOES" }, + { &__blue_glCore_glMaterialxvOES, "glMaterialxvOES" }, + { &__blue_glCore_glMultMatrixxOES, "glMultMatrixxOES" }, + { &__blue_glCore_glMultiTexCoord4xOES, "glMultiTexCoord4xOES" }, + { &__blue_glCore_glNormal3xOES, "glNormal3xOES" }, + { &__blue_glCore_glOrthoxOES, "glOrthoxOES" }, + { &__blue_glCore_glPointParameterxvOES, "glPointParameterxvOES" }, + { &__blue_glCore_glPointSizexOES, "glPointSizexOES" }, + { &__blue_glCore_glPolygonOffsetxOES, "glPolygonOffsetxOES" }, + { &__blue_glCore_glRotatexOES, "glRotatexOES" }, + { &__blue_glCore_glScalexOES, "glScalexOES" }, + { &__blue_glCore_glTexEnvxOES, "glTexEnvxOES" }, + { &__blue_glCore_glTexEnvxvOES, "glTexEnvxvOES" }, + { &__blue_glCore_glTexParameterxOES, "glTexParameterxOES" }, + { &__blue_glCore_glTexParameterxvOES, "glTexParameterxvOES" }, + { &__blue_glCore_glTranslatexOES, "glTranslatexOES" }, + { &__blue_glCore_glAccumxOES, "glAccumxOES" }, + { &__blue_glCore_glBitmapxOES, "glBitmapxOES" }, + { &__blue_glCore_glBlendColorxOES, "glBlendColorxOES" }, + { &__blue_glCore_glClearAccumxOES, "glClearAccumxOES" }, + { &__blue_glCore_glColor3xOES, "glColor3xOES" }, + { &__blue_glCore_glColor3xvOES, "glColor3xvOES" }, + { &__blue_glCore_glColor4xvOES, "glColor4xvOES" }, + { &__blue_glCore_glConvolutionParameterxOES, "glConvolutionParameterxOES" }, + { &__blue_glCore_glConvolutionParameterxvOES, "glConvolutionParameterxvOES" }, + { &__blue_glCore_glEvalCoord1xOES, "glEvalCoord1xOES" }, + { &__blue_glCore_glEvalCoord1xvOES, "glEvalCoord1xvOES" }, + { &__blue_glCore_glEvalCoord2xOES, "glEvalCoord2xOES" }, + { &__blue_glCore_glEvalCoord2xvOES, "glEvalCoord2xvOES" }, + { &__blue_glCore_glFeedbackBufferxOES, "glFeedbackBufferxOES" }, + { &__blue_glCore_glGetConvolutionParameterxvOES, "glGetConvolutionParameterxvOES" }, + { &__blue_glCore_glGetHistogramParameterxvOES, "glGetHistogramParameterxvOES" }, + { &__blue_glCore_glGetLightxOES, "glGetLightxOES" }, + { &__blue_glCore_glGetMapxvOES, "glGetMapxvOES" }, + { &__blue_glCore_glGetMaterialxOES, "glGetMaterialxOES" }, + { &__blue_glCore_glGetPixelMapxv, "glGetPixelMapxv" }, + { &__blue_glCore_glGetTexGenxvOES, "glGetTexGenxvOES" }, + { &__blue_glCore_glGetTexLevelParameterxvOES, "glGetTexLevelParameterxvOES" }, + { &__blue_glCore_glIndexxOES, "glIndexxOES" }, + { &__blue_glCore_glIndexxvOES, "glIndexxvOES" }, + { &__blue_glCore_glLoadTransposeMatrixxOES, "glLoadTransposeMatrixxOES" }, + { &__blue_glCore_glMap1xOES, "glMap1xOES" }, + { &__blue_glCore_glMap2xOES, "glMap2xOES" }, + { &__blue_glCore_glMapGrid1xOES, "glMapGrid1xOES" }, + { &__blue_glCore_glMapGrid2xOES, "glMapGrid2xOES" }, + { &__blue_glCore_glMultTransposeMatrixxOES, "glMultTransposeMatrixxOES" }, + { &__blue_glCore_glMultiTexCoord1xOES, "glMultiTexCoord1xOES" }, + { &__blue_glCore_glMultiTexCoord1xvOES, "glMultiTexCoord1xvOES" }, + { &__blue_glCore_glMultiTexCoord2xOES, "glMultiTexCoord2xOES" }, + { &__blue_glCore_glMultiTexCoord2xvOES, "glMultiTexCoord2xvOES" }, + { &__blue_glCore_glMultiTexCoord3xOES, "glMultiTexCoord3xOES" }, + { &__blue_glCore_glMultiTexCoord3xvOES, "glMultiTexCoord3xvOES" }, + { &__blue_glCore_glMultiTexCoord4xvOES, "glMultiTexCoord4xvOES" }, + { &__blue_glCore_glNormal3xvOES, "glNormal3xvOES" }, + { &__blue_glCore_glPassThroughxOES, "glPassThroughxOES" }, + { &__blue_glCore_glPixelMapx, "glPixelMapx" }, + { &__blue_glCore_glPixelStorex, "glPixelStorex" }, + { &__blue_glCore_glPixelTransferxOES, "glPixelTransferxOES" }, + { &__blue_glCore_glPixelZoomxOES, "glPixelZoomxOES" }, + { &__blue_glCore_glPrioritizeTexturesxOES, "glPrioritizeTexturesxOES" }, + { &__blue_glCore_glRasterPos2xOES, "glRasterPos2xOES" }, + { &__blue_glCore_glRasterPos2xvOES, "glRasterPos2xvOES" }, + { &__blue_glCore_glRasterPos3xOES, "glRasterPos3xOES" }, + { &__blue_glCore_glRasterPos3xvOES, "glRasterPos3xvOES" }, + { &__blue_glCore_glRasterPos4xOES, "glRasterPos4xOES" }, + { &__blue_glCore_glRasterPos4xvOES, "glRasterPos4xvOES" }, + { &__blue_glCore_glRectxOES, "glRectxOES" }, + { &__blue_glCore_glRectxvOES, "glRectxvOES" }, + { &__blue_glCore_glTexCoord1xOES, "glTexCoord1xOES" }, + { &__blue_glCore_glTexCoord1xvOES, "glTexCoord1xvOES" }, + { &__blue_glCore_glTexCoord2xOES, "glTexCoord2xOES" }, + { &__blue_glCore_glTexCoord2xvOES, "glTexCoord2xvOES" }, + { &__blue_glCore_glTexCoord3xOES, "glTexCoord3xOES" }, + { &__blue_glCore_glTexCoord3xvOES, "glTexCoord3xvOES" }, + { &__blue_glCore_glTexCoord4xOES, "glTexCoord4xOES" }, + { &__blue_glCore_glTexCoord4xvOES, "glTexCoord4xvOES" }, + { &__blue_glCore_glTexGenxOES, "glTexGenxOES" }, + { &__blue_glCore_glTexGenxvOES, "glTexGenxvOES" }, + { &__blue_glCore_glVertex2xOES, "glVertex2xOES" }, + { &__blue_glCore_glVertex2xvOES, "glVertex2xvOES" }, + { &__blue_glCore_glVertex3xOES, "glVertex3xOES" }, + { &__blue_glCore_glVertex3xvOES, "glVertex3xvOES" }, + { &__blue_glCore_glVertex4xOES, "glVertex4xOES" }, + { &__blue_glCore_glVertex4xvOES, "glVertex4xvOES" }, + { &__blue_glCore_glQueryMatrixxOES, "glQueryMatrixxOES" }, + { &__blue_glCore_glClearDepthfOES, "glClearDepthfOES" }, + { &__blue_glCore_glClipPlanefOES, "glClipPlanefOES" }, + { &__blue_glCore_glDepthRangefOES, "glDepthRangefOES" }, + { &__blue_glCore_glFrustumfOES, "glFrustumfOES" }, + { &__blue_glCore_glGetClipPlanefOES, "glGetClipPlanefOES" }, + { &__blue_glCore_glOrthofOES, "glOrthofOES" }, + { &__blue_glCore_glTbufferMask3DFX, "glTbufferMask3DFX" }, { &__blue_glCore_glDebugMessageEnableAMD, "glDebugMessageEnableAMD" }, - { &__blue_glCore_glGetVertexArrayIndexediv, "glGetVertexArrayIndexediv" }, - { &__blue_glCore_glGetVideoCaptureStreamdvNV, "glGetVideoCaptureStreamdvNV" }, - { &__blue_glCore_glAlphaFragmentOp2ATI, "glAlphaFragmentOp2ATI" }, - { &__blue_glCore_glVertex2hNV, "glVertex2hNV" }, - { &__blue_glCore_glCombinerParameteriNV, "glCombinerParameteriNV" }, - { &__blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT, "glGetNamedFramebufferAttachmentParameterivEXT" }, - { &__blue_glCore_glIsVariantEnabledEXT, "glIsVariantEnabledEXT" }, - { &__blue_glCore_glGetVertexAttribfvNV, "glGetVertexAttribfvNV" }, - { &__blue_glCore_glGetProgramPipelineiv, "glGetProgramPipelineiv" }, - { &__blue_glCore_glUnmapBufferARB, "glUnmapBufferARB" }, - { &__blue_glCore_glVertexAttribPointerNV, "glVertexAttribPointerNV" }, - { &__blue_glCore_glGetPathSpacingNV, "glGetPathSpacingNV" }, - { &__blue_glCore_glMaterialxOES, "glMaterialxOES" }, - { &__blue_glCore_glVertexStream3fvATI, "glVertexStream3fvATI" }, - { &__blue_glCore_glVertexStream4dATI, "glVertexStream4dATI" }, - { &__blue_glCore_glVertexAttrib2d, "glVertexAttrib2d" }, - { &__blue_glCore_glStencilMaskSeparate, "glStencilMaskSeparate" }, + { &__blue_glCore_glDebugMessageInsertAMD, "glDebugMessageInsertAMD" }, + { &__blue_glCore_glDebugMessageCallbackAMD, "glDebugMessageCallbackAMD" }, + { &__blue_glCore_glGetDebugMessageLogAMD, "glGetDebugMessageLogAMD" }, + { &__blue_glCore_glBlendFuncIndexedAMD, "glBlendFuncIndexedAMD" }, + { &__blue_glCore_glBlendFuncSeparateIndexedAMD, "glBlendFuncSeparateIndexedAMD" }, + { &__blue_glCore_glBlendEquationIndexedAMD, "glBlendEquationIndexedAMD" }, + { &__blue_glCore_glBlendEquationSeparateIndexedAMD, "glBlendEquationSeparateIndexedAMD" }, + { &__blue_glCore_glUniform1i64NV, "glUniform1i64NV" }, + { &__blue_glCore_glUniform2i64NV, "glUniform2i64NV" }, + { &__blue_glCore_glUniform3i64NV, "glUniform3i64NV" }, + { &__blue_glCore_glUniform4i64NV, "glUniform4i64NV" }, + { &__blue_glCore_glUniform1i64vNV, "glUniform1i64vNV" }, + { &__blue_glCore_glUniform2i64vNV, "glUniform2i64vNV" }, + { &__blue_glCore_glUniform3i64vNV, "glUniform3i64vNV" }, + { &__blue_glCore_glUniform4i64vNV, "glUniform4i64vNV" }, + { &__blue_glCore_glUniform1ui64NV, "glUniform1ui64NV" }, + { &__blue_glCore_glUniform2ui64NV, "glUniform2ui64NV" }, + { &__blue_glCore_glUniform3ui64NV, "glUniform3ui64NV" }, + { &__blue_glCore_glUniform4ui64NV, "glUniform4ui64NV" }, + { &__blue_glCore_glUniform1ui64vNV, "glUniform1ui64vNV" }, + { &__blue_glCore_glUniform2ui64vNV, "glUniform2ui64vNV" }, + { &__blue_glCore_glUniform3ui64vNV, "glUniform3ui64vNV" }, + { &__blue_glCore_glUniform4ui64vNV, "glUniform4ui64vNV" }, + { &__blue_glCore_glGetUniformi64vNV, "glGetUniformi64vNV" }, + { &__blue_glCore_glGetUniformui64vNV, "glGetUniformui64vNV" }, + { &__blue_glCore_glProgramUniform1i64NV, "glProgramUniform1i64NV" }, + { &__blue_glCore_glProgramUniform2i64NV, "glProgramUniform2i64NV" }, + { &__blue_glCore_glProgramUniform3i64NV, "glProgramUniform3i64NV" }, + { &__blue_glCore_glProgramUniform4i64NV, "glProgramUniform4i64NV" }, + { &__blue_glCore_glProgramUniform1i64vNV, "glProgramUniform1i64vNV" }, + { &__blue_glCore_glProgramUniform2i64vNV, "glProgramUniform2i64vNV" }, + { &__blue_glCore_glProgramUniform3i64vNV, "glProgramUniform3i64vNV" }, + { &__blue_glCore_glProgramUniform4i64vNV, "glProgramUniform4i64vNV" }, + { &__blue_glCore_glProgramUniform1ui64NV, "glProgramUniform1ui64NV" }, + { &__blue_glCore_glProgramUniform2ui64NV, "glProgramUniform2ui64NV" }, + { &__blue_glCore_glProgramUniform3ui64NV, "glProgramUniform3ui64NV" }, + { &__blue_glCore_glProgramUniform4ui64NV, "glProgramUniform4ui64NV" }, + { &__blue_glCore_glProgramUniform1ui64vNV, "glProgramUniform1ui64vNV" }, + { &__blue_glCore_glProgramUniform2ui64vNV, "glProgramUniform2ui64vNV" }, + { &__blue_glCore_glProgramUniform3ui64vNV, "glProgramUniform3ui64vNV" }, + { &__blue_glCore_glProgramUniform4ui64vNV, "glProgramUniform4ui64vNV" }, + { &__blue_glCore_glVertexAttribParameteriAMD, "glVertexAttribParameteriAMD" }, + { &__blue_glCore_glMultiDrawArraysIndirectAMD, "glMultiDrawArraysIndirectAMD" }, + { &__blue_glCore_glMultiDrawElementsIndirectAMD, "glMultiDrawElementsIndirectAMD" }, + { &__blue_glCore_glGenNamesAMD, "glGenNamesAMD" }, + { &__blue_glCore_glDeleteNamesAMD, "glDeleteNamesAMD" }, + { &__blue_glCore_glIsNameAMD, "glIsNameAMD" }, + { &__blue_glCore_glQueryObjectParameteruiAMD, "glQueryObjectParameteruiAMD" }, + { &__blue_glCore_glGetPerfMonitorGroupsAMD, "glGetPerfMonitorGroupsAMD" }, + { &__blue_glCore_glGetPerfMonitorCountersAMD, "glGetPerfMonitorCountersAMD" }, + { &__blue_glCore_glGetPerfMonitorGroupStringAMD, "glGetPerfMonitorGroupStringAMD" }, + { &__blue_glCore_glGetPerfMonitorCounterStringAMD, "glGetPerfMonitorCounterStringAMD" }, + { &__blue_glCore_glGetPerfMonitorCounterInfoAMD, "glGetPerfMonitorCounterInfoAMD" }, + { &__blue_glCore_glGenPerfMonitorsAMD, "glGenPerfMonitorsAMD" }, + { &__blue_glCore_glDeletePerfMonitorsAMD, "glDeletePerfMonitorsAMD" }, + { &__blue_glCore_glSelectPerfMonitorCountersAMD, "glSelectPerfMonitorCountersAMD" }, + { &__blue_glCore_glBeginPerfMonitorAMD, "glBeginPerfMonitorAMD" }, + { &__blue_glCore_glEndPerfMonitorAMD, "glEndPerfMonitorAMD" }, + { &__blue_glCore_glGetPerfMonitorCounterDataAMD, "glGetPerfMonitorCounterDataAMD" }, + { &__blue_glCore_glSetMultisamplefvAMD, "glSetMultisamplefvAMD" }, + { &__blue_glCore_glTexStorageSparseAMD, "glTexStorageSparseAMD" }, + { &__blue_glCore_glTextureStorageSparseAMD, "glTextureStorageSparseAMD" }, + { &__blue_glCore_glStencilOpValueAMD, "glStencilOpValueAMD" }, + { &__blue_glCore_glTessellationFactorAMD, "glTessellationFactorAMD" }, + { &__blue_glCore_glTessellationModeAMD, "glTessellationModeAMD" }, + { &__blue_glCore_glElementPointerAPPLE, "glElementPointerAPPLE" }, + { &__blue_glCore_glDrawElementArrayAPPLE, "glDrawElementArrayAPPLE" }, + { &__blue_glCore_glDrawRangeElementArrayAPPLE, "glDrawRangeElementArrayAPPLE" }, + { &__blue_glCore_glMultiDrawElementArrayAPPLE, "glMultiDrawElementArrayAPPLE" }, + { &__blue_glCore_glMultiDrawRangeElementArrayAPPLE, "glMultiDrawRangeElementArrayAPPLE" }, + { &__blue_glCore_glGenFencesAPPLE, "glGenFencesAPPLE" }, + { &__blue_glCore_glDeleteFencesAPPLE, "glDeleteFencesAPPLE" }, + { &__blue_glCore_glSetFenceAPPLE, "glSetFenceAPPLE" }, + { &__blue_glCore_glIsFenceAPPLE, "glIsFenceAPPLE" }, { &__blue_glCore_glTestFenceAPPLE, "glTestFenceAPPLE" }, - { &__blue_glCore_glBindMaterialParameterEXT, "glBindMaterialParameterEXT" }, - { &__blue_glCore_glBlendEquationEXT, "glBlendEquationEXT" }, - { &__blue_glCore_glMultiTexCoord4hNV, "glMultiTexCoord4hNV" }, - { &__blue_glCore_glMultiTexCoord1fARB, "glMultiTexCoord1fARB" }, - { &__blue_glCore_glPrioritizeTexturesxOES, "glPrioritizeTexturesxOES" }, - { &__blue_glCore_glVertexAttribs1fvNV, "glVertexAttribs1fvNV" }, - { &__blue_glCore_glGetInternalformati64v, "glGetInternalformati64v" }, + { &__blue_glCore_glFinishFenceAPPLE, "glFinishFenceAPPLE" }, + { &__blue_glCore_glTestObjectAPPLE, "glTestObjectAPPLE" }, + { &__blue_glCore_glFinishObjectAPPLE, "glFinishObjectAPPLE" }, + { &__blue_glCore_glBufferParameteriAPPLE, "glBufferParameteriAPPLE" }, + { &__blue_glCore_glFlushMappedBufferRangeAPPLE, "glFlushMappedBufferRangeAPPLE" }, + { &__blue_glCore_glObjectPurgeableAPPLE, "glObjectPurgeableAPPLE" }, + { &__blue_glCore_glObjectUnpurgeableAPPLE, "glObjectUnpurgeableAPPLE" }, + { &__blue_glCore_glGetObjectParameterivAPPLE, "glGetObjectParameterivAPPLE" }, + { &__blue_glCore_glTextureRangeAPPLE, "glTextureRangeAPPLE" }, + { &__blue_glCore_glGetTexParameterPointervAPPLE, "glGetTexParameterPointervAPPLE" }, + { &__blue_glCore_glBindVertexArrayAPPLE, "glBindVertexArrayAPPLE" }, + { &__blue_glCore_glDeleteVertexArraysAPPLE, "glDeleteVertexArraysAPPLE" }, + { &__blue_glCore_glGenVertexArraysAPPLE, "glGenVertexArraysAPPLE" }, + { &__blue_glCore_glIsVertexArrayAPPLE, "glIsVertexArrayAPPLE" }, + { &__blue_glCore_glVertexArrayRangeAPPLE, "glVertexArrayRangeAPPLE" }, + { &__blue_glCore_glFlushVertexArrayRangeAPPLE, "glFlushVertexArrayRangeAPPLE" }, + { &__blue_glCore_glVertexArrayParameteriAPPLE, "glVertexArrayParameteriAPPLE" }, + { &__blue_glCore_glEnableVertexAttribAPPLE, "glEnableVertexAttribAPPLE" }, { &__blue_glCore_glDisableVertexAttribAPPLE, "glDisableVertexAttribAPPLE" }, + { &__blue_glCore_glIsVertexAttribEnabledAPPLE, "glIsVertexAttribEnabledAPPLE" }, + { &__blue_glCore_glMapVertexAttrib1dAPPLE, "glMapVertexAttrib1dAPPLE" }, + { &__blue_glCore_glMapVertexAttrib1fAPPLE, "glMapVertexAttrib1fAPPLE" }, + { &__blue_glCore_glMapVertexAttrib2dAPPLE, "glMapVertexAttrib2dAPPLE" }, + { &__blue_glCore_glMapVertexAttrib2fAPPLE, "glMapVertexAttrib2fAPPLE" }, + { &__blue_glCore_glDrawBuffersATI, "glDrawBuffersATI" }, + { &__blue_glCore_glElementPointerATI, "glElementPointerATI" }, + { &__blue_glCore_glDrawElementArrayATI, "glDrawElementArrayATI" }, + { &__blue_glCore_glDrawRangeElementArrayATI, "glDrawRangeElementArrayATI" }, + { &__blue_glCore_glTexBumpParameterivATI, "glTexBumpParameterivATI" }, + { &__blue_glCore_glTexBumpParameterfvATI, "glTexBumpParameterfvATI" }, + { &__blue_glCore_glGetTexBumpParameterivATI, "glGetTexBumpParameterivATI" }, + { &__blue_glCore_glGetTexBumpParameterfvATI, "glGetTexBumpParameterfvATI" }, + { &__blue_glCore_glGenFragmentShadersATI, "glGenFragmentShadersATI" }, + { &__blue_glCore_glBindFragmentShaderATI, "glBindFragmentShaderATI" }, + { &__blue_glCore_glDeleteFragmentShaderATI, "glDeleteFragmentShaderATI" }, + { &__blue_glCore_glBeginFragmentShaderATI, "glBeginFragmentShaderATI" }, + { &__blue_glCore_glEndFragmentShaderATI, "glEndFragmentShaderATI" }, + { &__blue_glCore_glPassTexCoordATI, "glPassTexCoordATI" }, + { &__blue_glCore_glSampleMapATI, "glSampleMapATI" }, + { &__blue_glCore_glColorFragmentOp1ATI, "glColorFragmentOp1ATI" }, + { &__blue_glCore_glColorFragmentOp2ATI, "glColorFragmentOp2ATI" }, + { &__blue_glCore_glColorFragmentOp3ATI, "glColorFragmentOp3ATI" }, + { &__blue_glCore_glAlphaFragmentOp1ATI, "glAlphaFragmentOp1ATI" }, + { &__blue_glCore_glAlphaFragmentOp2ATI, "glAlphaFragmentOp2ATI" }, + { &__blue_glCore_glAlphaFragmentOp3ATI, "glAlphaFragmentOp3ATI" }, + { &__blue_glCore_glSetFragmentShaderConstantATI, "glSetFragmentShaderConstantATI" }, + { &__blue_glCore_glMapObjectBufferATI, "glMapObjectBufferATI" }, + { &__blue_glCore_glUnmapObjectBufferATI, "glUnmapObjectBufferATI" }, + { &__blue_glCore_glPNTrianglesiATI, "glPNTrianglesiATI" }, + { &__blue_glCore_glPNTrianglesfATI, "glPNTrianglesfATI" }, + { &__blue_glCore_glStencilOpSeparateATI, "glStencilOpSeparateATI" }, + { &__blue_glCore_glStencilFuncSeparateATI, "glStencilFuncSeparateATI" }, + { &__blue_glCore_glNewObjectBufferATI, "glNewObjectBufferATI" }, + { &__blue_glCore_glIsObjectBufferATI, "glIsObjectBufferATI" }, + { &__blue_glCore_glUpdateObjectBufferATI, "glUpdateObjectBufferATI" }, + { &__blue_glCore_glGetObjectBufferfvATI, "glGetObjectBufferfvATI" }, + { &__blue_glCore_glGetObjectBufferivATI, "glGetObjectBufferivATI" }, + { &__blue_glCore_glFreeObjectBufferATI, "glFreeObjectBufferATI" }, + { &__blue_glCore_glArrayObjectATI, "glArrayObjectATI" }, + { &__blue_glCore_glGetArrayObjectfvATI, "glGetArrayObjectfvATI" }, + { &__blue_glCore_glGetArrayObjectivATI, "glGetArrayObjectivATI" }, + { &__blue_glCore_glVariantArrayObjectATI, "glVariantArrayObjectATI" }, + { &__blue_glCore_glGetVariantArrayObjectfvATI, "glGetVariantArrayObjectfvATI" }, + { &__blue_glCore_glGetVariantArrayObjectivATI, "glGetVariantArrayObjectivATI" }, + { &__blue_glCore_glVertexAttribArrayObjectATI, "glVertexAttribArrayObjectATI" }, + { &__blue_glCore_glGetVertexAttribArrayObjectfvATI, "glGetVertexAttribArrayObjectfvATI" }, + { &__blue_glCore_glGetVertexAttribArrayObjectivATI, "glGetVertexAttribArrayObjectivATI" }, + { &__blue_glCore_glVertexStream1sATI, "glVertexStream1sATI" }, + { &__blue_glCore_glVertexStream1svATI, "glVertexStream1svATI" }, + { &__blue_glCore_glVertexStream1iATI, "glVertexStream1iATI" }, + { &__blue_glCore_glVertexStream1ivATI, "glVertexStream1ivATI" }, + { &__blue_glCore_glVertexStream1fATI, "glVertexStream1fATI" }, + { &__blue_glCore_glVertexStream1fvATI, "glVertexStream1fvATI" }, + { &__blue_glCore_glVertexStream1dATI, "glVertexStream1dATI" }, + { &__blue_glCore_glVertexStream1dvATI, "glVertexStream1dvATI" }, + { &__blue_glCore_glVertexStream2sATI, "glVertexStream2sATI" }, + { &__blue_glCore_glVertexStream2svATI, "glVertexStream2svATI" }, + { &__blue_glCore_glVertexStream2iATI, "glVertexStream2iATI" }, + { &__blue_glCore_glVertexStream2ivATI, "glVertexStream2ivATI" }, + { &__blue_glCore_glVertexStream2fATI, "glVertexStream2fATI" }, + { &__blue_glCore_glVertexStream2fvATI, "glVertexStream2fvATI" }, + { &__blue_glCore_glVertexStream2dATI, "glVertexStream2dATI" }, + { &__blue_glCore_glVertexStream2dvATI, "glVertexStream2dvATI" }, { &__blue_glCore_glVertexStream3sATI, "glVertexStream3sATI" }, - { &__blue_glCore_glCheckFramebufferStatusEXT, "glCheckFramebufferStatusEXT" }, - { &__blue_glCore_glGetMinmax, "glGetMinmax" }, - { &__blue_glCore_glCopyTexSubImage3DEXT, "glCopyTexSubImage3DEXT" }, - { &__blue_glCore_glUniform1ivARB, "glUniform1ivARB" }, - { &__blue_glCore_glColorP4uiv, "glColorP4uiv" }, - { &__blue_glCore_glDisableVertexAttribArrayARB, "glDisableVertexAttribArrayARB" }, - { &__blue_glCore_glNamedProgramLocalParameter4fvEXT, "glNamedProgramLocalParameter4fvEXT" }, + { &__blue_glCore_glVertexStream3svATI, "glVertexStream3svATI" }, + { &__blue_glCore_glVertexStream3iATI, "glVertexStream3iATI" }, + { &__blue_glCore_glVertexStream3ivATI, "glVertexStream3ivATI" }, + { &__blue_glCore_glVertexStream3fATI, "glVertexStream3fATI" }, + { &__blue_glCore_glVertexStream3fvATI, "glVertexStream3fvATI" }, + { &__blue_glCore_glVertexStream3dATI, "glVertexStream3dATI" }, + { &__blue_glCore_glVertexStream3dvATI, "glVertexStream3dvATI" }, + { &__blue_glCore_glVertexStream4sATI, "glVertexStream4sATI" }, + { &__blue_glCore_glVertexStream4svATI, "glVertexStream4svATI" }, + { &__blue_glCore_glVertexStream4iATI, "glVertexStream4iATI" }, + { &__blue_glCore_glVertexStream4ivATI, "glVertexStream4ivATI" }, + { &__blue_glCore_glVertexStream4fATI, "glVertexStream4fATI" }, + { &__blue_glCore_glVertexStream4fvATI, "glVertexStream4fvATI" }, + { &__blue_glCore_glVertexStream4dATI, "glVertexStream4dATI" }, + { &__blue_glCore_glVertexStream4dvATI, "glVertexStream4dvATI" }, + { &__blue_glCore_glNormalStream3bATI, "glNormalStream3bATI" }, + { &__blue_glCore_glNormalStream3bvATI, "glNormalStream3bvATI" }, + { &__blue_glCore_glNormalStream3sATI, "glNormalStream3sATI" }, + { &__blue_glCore_glNormalStream3svATI, "glNormalStream3svATI" }, + { &__blue_glCore_glNormalStream3iATI, "glNormalStream3iATI" }, + { &__blue_glCore_glNormalStream3ivATI, "glNormalStream3ivATI" }, + { &__blue_glCore_glNormalStream3fATI, "glNormalStream3fATI" }, + { &__blue_glCore_glNormalStream3fvATI, "glNormalStream3fvATI" }, + { &__blue_glCore_glNormalStream3dATI, "glNormalStream3dATI" }, + { &__blue_glCore_glNormalStream3dvATI, "glNormalStream3dvATI" }, + { &__blue_glCore_glClientActiveVertexStreamATI, "glClientActiveVertexStreamATI" }, + { &__blue_glCore_glVertexBlendEnviATI, "glVertexBlendEnviATI" }, + { &__blue_glCore_glVertexBlendEnvfATI, "glVertexBlendEnvfATI" }, + { &__blue_glCore_glUniformBufferEXT, "glUniformBufferEXT" }, + { &__blue_glCore_glGetUniformBufferSizeEXT, "glGetUniformBufferSizeEXT" }, + { &__blue_glCore_glGetUniformOffsetEXT, "glGetUniformOffsetEXT" }, + { &__blue_glCore_glBlendColorEXT, "glBlendColorEXT" }, + { &__blue_glCore_glBlendEquationSeparateEXT, "glBlendEquationSeparateEXT" }, { &__blue_glCore_glBlendFuncSeparateEXT, "glBlendFuncSeparateEXT" }, - { &__blue_glCore_glVertexAttribL3i64NV, "glVertexAttribL3i64NV" }, - { &__blue_glCore_glBindProgramPipeline, "glBindProgramPipeline" }, - { &__blue_glCore_glCreateProgramPipelines, "glCreateProgramPipelines" }, - { &__blue_glCore_glDeleteRenderbuffersEXT, "glDeleteRenderbuffersEXT" }, - { &__blue_glCore_glEdgeFlagFormatNV, "glEdgeFlagFormatNV" }, - { &__blue_glCore_glGetActiveUniformBlockiv, "glGetActiveUniformBlockiv" }, - { &__blue_glCore_glProgramUniform3f, "glProgramUniform3f" }, - { &__blue_glCore_glDrawCommandsStatesAddressNV, "glDrawCommandsStatesAddressNV" }, - { &__blue_glCore_glGetVertexAttribfv, "glGetVertexAttribfv" }, - { &__blue_glCore_glGetVariantArrayObjectivATI, "glGetVariantArrayObjectivATI" }, - { &__blue_glCore_glNamedProgramLocalParameter4dEXT, "glNamedProgramLocalParameter4dEXT" }, - { &__blue_glCore_glGenTransformFeedbacksNV, "glGenTransformFeedbacksNV" }, - { &__blue_glCore_glDrawElementArrayAPPLE, "glDrawElementArrayAPPLE" }, - { &__blue_glCore_glVertexAttrib4NusvARB, "glVertexAttrib4NusvARB" }, - { &__blue_glCore_glBindRenderbufferEXT, "glBindRenderbufferEXT" }, - { &__blue_glCore_glUnmapTexture2DINTEL, "glUnmapTexture2DINTEL" }, - { &__blue_glCore_glGetProgramEnvParameterfvARB, "glGetProgramEnvParameterfvARB" }, - { &__blue_glCore_glVertexAttrib4f, "glVertexAttrib4f" }, - { &__blue_glCore_glGetnPixelMapfv, "glGetnPixelMapfv" }, - { &__blue_glCore_glVertexAttrib3dv, "glVertexAttrib3dv" }, - { &__blue_glCore_glFlushMappedBufferRange, "glFlushMappedBufferRange" }, - { &__blue_glCore_glSecondaryColor3ub, "glSecondaryColor3ub" }, - { &__blue_glCore_glGetPerfQueryDataINTEL, "glGetPerfQueryDataINTEL" }, - { &__blue_glCore_glGetnMapivARB, "glGetnMapivARB" }, + { &__blue_glCore_glBlendEquationEXT, "glBlendEquationEXT" }, + { &__blue_glCore_glColorSubTableEXT, "glColorSubTableEXT" }, + { &__blue_glCore_glCopyColorSubTableEXT, "glCopyColorSubTableEXT" }, + { &__blue_glCore_glLockArraysEXT, "glLockArraysEXT" }, + { &__blue_glCore_glUnlockArraysEXT, "glUnlockArraysEXT" }, + { &__blue_glCore_glConvolutionFilter1DEXT, "glConvolutionFilter1DEXT" }, + { &__blue_glCore_glConvolutionFilter2DEXT, "glConvolutionFilter2DEXT" }, + { &__blue_glCore_glConvolutionParameterfEXT, "glConvolutionParameterfEXT" }, + { &__blue_glCore_glConvolutionParameterfvEXT, "glConvolutionParameterfvEXT" }, + { &__blue_glCore_glConvolutionParameteriEXT, "glConvolutionParameteriEXT" }, + { &__blue_glCore_glConvolutionParameterivEXT, "glConvolutionParameterivEXT" }, + { &__blue_glCore_glCopyConvolutionFilter1DEXT, "glCopyConvolutionFilter1DEXT" }, + { &__blue_glCore_glCopyConvolutionFilter2DEXT, "glCopyConvolutionFilter2DEXT" }, + { &__blue_glCore_glGetConvolutionFilterEXT, "glGetConvolutionFilterEXT" }, + { &__blue_glCore_glGetConvolutionParameterfvEXT, "glGetConvolutionParameterfvEXT" }, + { &__blue_glCore_glGetConvolutionParameterivEXT, "glGetConvolutionParameterivEXT" }, + { &__blue_glCore_glGetSeparableFilterEXT, "glGetSeparableFilterEXT" }, { &__blue_glCore_glSeparableFilter2DEXT, "glSeparableFilter2DEXT" }, - { &__blue_glCore_glProgramUniformMatrix3x2fvEXT, "glProgramUniformMatrix3x2fvEXT" }, - { &__blue_glCore_glGenVertexArrays, "glGenVertexArrays" }, - { &__blue_glCore_glEndQueryARB, "glEndQueryARB" }, - { &__blue_glCore_glVertexAttrib2fv, "glVertexAttrib2fv" }, - { &__blue_glCore_glWindowPos2fv, "glWindowPos2fv" }, - { &__blue_glCore_glCopyConvolutionFilter1D, "glCopyConvolutionFilter1D" }, - { &__blue_glCore_glTexCoordFormatNV, "glTexCoordFormatNV" }, - { &__blue_glCore_glMultiTexCoordP2uiv, "glMultiTexCoordP2uiv" }, - { &__blue_glCore_glProgramUniform1ui64vARB, "glProgramUniform1ui64vARB" }, - { &__blue_glCore_glColorSubTable, "glColorSubTable" }, - { &__blue_glCore_glNamedBufferSubData, "glNamedBufferSubData" }, - { &__blue_glCore_glGetCompressedTextureImage, "glGetCompressedTextureImage" }, - { &__blue_glCore_glNamedCopyBufferSubDataEXT, "glNamedCopyBufferSubDataEXT" }, - { &__blue_glCore_glVertexAttribL1i64NV, "glVertexAttribL1i64NV" }, - { &__blue_glCore_glVertexArrayMultiTexCoordOffsetEXT, "glVertexArrayMultiTexCoordOffsetEXT" }, - { &__blue_glCore_glGetUniformIndices, "glGetUniformIndices" }, - { &__blue_glCore_glDrawArraysInstancedARB, "glDrawArraysInstancedARB" }, - { &__blue_glCore_glGetMultiTexGenivEXT, "glGetMultiTexGenivEXT" }, - { &__blue_glCore_glGetVertexArrayPointervEXT, "glGetVertexArrayPointervEXT" }, - { &__blue_glCore_glBeginQuery, "glBeginQuery" }, - { &__blue_glCore_glDetachObjectARB, "glDetachObjectARB" }, - { &__blue_glCore_glUniform4iv, "glUniform4iv" }, - { &__blue_glCore_glGetQueryObjectuiv, "glGetQueryObjectuiv" }, - { &__blue_glCore_glGetObjectBufferivATI, "glGetObjectBufferivATI" }, - { &__blue_glCore_glCreateTransformFeedbacks, "glCreateTransformFeedbacks" }, - { &__blue_glCore_glVertexStream3dATI, "glVertexStream3dATI" }, - { &__blue_glCore_glEvalMapsNV, "glEvalMapsNV" }, - { &__blue_glCore_glIsNameAMD, "glIsNameAMD" }, - { &__blue_glCore_glVertexAttrib4ivARB, "glVertexAttrib4ivARB" }, - { &__blue_glCore_glGetProgramSubroutineParameteruivNV, "glGetProgramSubroutineParameteruivNV" }, - { &__blue_glCore_glProgramUniformMatrix2x4dv, "glProgramUniformMatrix2x4dv" }, - { &__blue_glCore_glBeginPerfQueryINTEL, "glBeginPerfQueryINTEL" }, - { &__blue_glCore_glPathParameteriNV, "glPathParameteriNV" }, - { &__blue_glCore_glUniform4i64vNV, "glUniform4i64vNV" }, - { &__blue_glCore_glStateCaptureNV, "glStateCaptureNV" }, - { &__blue_glCore_glProgramUniform3fvEXT, "glProgramUniform3fvEXT" }, - { &__blue_glCore_glVertexAttribL1d, "glVertexAttribL1d" }, - { &__blue_glCore_glMatrixLoadIdentityEXT, "glMatrixLoadIdentityEXT" }, - { &__blue_glCore_glBindVertexArrayAPPLE, "glBindVertexArrayAPPLE" }, - { &__blue_glCore_glRasterPos2xvOES, "glRasterPos2xvOES" }, - { &__blue_glCore_glCommandListSegmentsNV, "glCommandListSegmentsNV" }, - { &__blue_glCore_glWindowPos4svMESA, "glWindowPos4svMESA" }, - { &__blue_glCore_glProgramLocalParameter4dvARB, "glProgramLocalParameter4dvARB" }, - { &__blue_glCore_glGetnPolygonStipple, "glGetnPolygonStipple" }, - { &__blue_glCore_glMultiTexCoord1svARB, "glMultiTexCoord1svARB" }, - { &__blue_glCore_glNamedRenderbufferStorage, "glNamedRenderbufferStorage" }, - { &__blue_glCore_glProgramEnvParameterI4iNV, "glProgramEnvParameterI4iNV" }, - { &__blue_glCore_glVertexAttribIFormat, "glVertexAttribIFormat" }, - { &__blue_glCore_glFogCoordfvEXT, "glFogCoordfvEXT" }, - { &__blue_glCore_glEnableVertexAttribArray, "glEnableVertexAttribArray" }, - { &__blue_glCore_glPolygonOffsetClampEXT, "glPolygonOffsetClampEXT" }, - { &__blue_glCore_glEnable, "glEnable" }, - { &__blue_glCore_glIndexFuncEXT, "glIndexFuncEXT" }, - { &__blue_glCore_glDepthRangeArrayv, "glDepthRangeArrayv" }, - { &__blue_glCore_glRasterPos4xvOES, "glRasterPos4xvOES" }, - { &__blue_glCore_glSpriteParameterfvSGIX, "glSpriteParameterfvSGIX" }, - { &__blue_glCore_glGetnUniformdv, "glGetnUniformdv" }, - { &__blue_glCore_glGetHistogram, "glGetHistogram" }, - { &__blue_glCore_glClearColorIiEXT, "glClearColorIiEXT" }, - { &__blue_glCore_glTbufferMask3DFX, "glTbufferMask3DFX" }, - { &__blue_glCore_glProgramUniform1f, "glProgramUniform1f" }, - { &__blue_glCore_glVertexAttrib4Niv, "glVertexAttrib4Niv" }, - { &__blue_glCore_glGetUniformLocationARB, "glGetUniformLocationARB" }, - { &__blue_glCore_glColor4hvNV, "glColor4hvNV" }, - { &__blue_glCore_glTextureBufferRangeEXT, "glTextureBufferRangeEXT" }, - { &__blue_glCore_glGlobalAlphaFactorsSUN, "glGlobalAlphaFactorsSUN" }, - { &__blue_glCore_glCopyTextureSubImage2D, "glCopyTextureSubImage2D" }, - { &__blue_glCore_glUniform1i64vARB, "glUniform1i64vARB" }, - { &__blue_glCore_glVertexAttrib2dNV, "glVertexAttrib2dNV" }, - { &__blue_glCore_glVertexAttrib4NbvARB, "glVertexAttrib4NbvARB" }, - { &__blue_glCore_glPatchParameteri, "glPatchParameteri" }, - { &__blue_glCore_glGetNamedStringARB, "glGetNamedStringARB" }, - { &__blue_glCore_glGetCombinerStageParameterfvNV, "glGetCombinerStageParameterfvNV" }, - { &__blue_glCore_glVertexAttrib2svARB, "glVertexAttrib2svARB" }, - { &__blue_glCore_glApplyFramebufferAttachmentCMAAINTEL, "glApplyFramebufferAttachmentCMAAINTEL" }, - { &__blue_glCore_glGetVideouivNV, "glGetVideouivNV" }, - { &__blue_glCore_glMultiTexCoord3s, "glMultiTexCoord3s" }, - { &__blue_glCore_glMultiTexCoord1sARB, "glMultiTexCoord1sARB" }, - { &__blue_glCore_glLogicOp, "glLogicOp" }, - { &__blue_glCore_glFogFuncSGIS, "glFogFuncSGIS" }, - { &__blue_glCore_glMatrixMultfEXT, "glMatrixMultfEXT" }, - { &__blue_glCore_glGetTexParameterfv, "glGetTexParameterfv" }, - { &__blue_glCore_glSecondaryColorP3uiv, "glSecondaryColorP3uiv" }, - { &__blue_glCore_glMultiTexParameteriEXT, "glMultiTexParameteriEXT" }, - { &__blue_glCore_glEnableClientStateIndexedEXT, "glEnableClientStateIndexedEXT" }, - { &__blue_glCore_glGenPathsNV, "glGenPathsNV" }, - { &__blue_glCore_glGetBufferSubData, "glGetBufferSubData" }, - { &__blue_glCore_glGetDoublei_v, "glGetDoublei_v" }, - { &__blue_glCore_glCoverStrokePathNV, "glCoverStrokePathNV" }, - { &__blue_glCore_glFrontFace, "glFrontFace" }, - { &__blue_glCore_glScissorIndexedv, "glScissorIndexedv" }, - { &__blue_glCore_glTextureStorage3D, "glTextureStorage3D" }, - { &__blue_glCore_glPathFogGenNV, "glPathFogGenNV" }, - { &__blue_glCore_glPixelTexGenParameterivSGIS, "glPixelTexGenParameterivSGIS" }, - { &__blue_glCore_glBlendEquationi, "glBlendEquationi" }, - { &__blue_glCore_glGetHistogramParameterivEXT, "glGetHistogramParameterivEXT" }, - { &__blue_glCore_glClearNamedFramebufferfi, "glClearNamedFramebufferfi" }, - { &__blue_glCore_glCopyColorTableSGI, "glCopyColorTableSGI" }, + { &__blue_glCore_glTangent3bEXT, "glTangent3bEXT" }, + { &__blue_glCore_glTangent3bvEXT, "glTangent3bvEXT" }, + { &__blue_glCore_glTangent3dEXT, "glTangent3dEXT" }, + { &__blue_glCore_glTangent3dvEXT, "glTangent3dvEXT" }, + { &__blue_glCore_glTangent3fEXT, "glTangent3fEXT" }, + { &__blue_glCore_glTangent3fvEXT, "glTangent3fvEXT" }, + { &__blue_glCore_glTangent3iEXT, "glTangent3iEXT" }, + { &__blue_glCore_glTangent3ivEXT, "glTangent3ivEXT" }, + { &__blue_glCore_glTangent3sEXT, "glTangent3sEXT" }, + { &__blue_glCore_glTangent3svEXT, "glTangent3svEXT" }, + { &__blue_glCore_glBinormal3bEXT, "glBinormal3bEXT" }, + { &__blue_glCore_glBinormal3bvEXT, "glBinormal3bvEXT" }, { &__blue_glCore_glBinormal3dEXT, "glBinormal3dEXT" }, - { &__blue_glCore_glGetBufferParameterui64vNV, "glGetBufferParameterui64vNV" }, - { &__blue_glCore_glTextureImage2DEXT, "glTextureImage2DEXT" }, - { &__blue_glCore_glTransformFeedbackVaryings, "glTransformFeedbackVaryings" }, - { &__blue_glCore_glNamedFramebufferSampleLocationsfvNV, "glNamedFramebufferSampleLocationsfvNV" }, - { &__blue_glCore_glMapTexture2DINTEL, "glMapTexture2DINTEL" }, - { &__blue_glCore_glMaterialxvOES, "glMaterialxvOES" }, - { &__blue_glCore_glGenNamesAMD, "glGenNamesAMD" }, - { &__blue_glCore_glUniform2uiEXT, "glUniform2uiEXT" }, - { &__blue_glCore_glMultiTexCoord1xvOES, "glMultiTexCoord1xvOES" }, - { &__blue_glCore_glEnableIndexedEXT, "glEnableIndexedEXT" }, - { &__blue_glCore_glCompressedTextureImage1DEXT, "glCompressedTextureImage1DEXT" }, - { &__blue_glCore_glMultiTexCoord3fv, "glMultiTexCoord3fv" }, - { &__blue_glCore_glGetnPolygonStippleARB, "glGetnPolygonStippleARB" }, - { &__blue_glCore_glTexCoord2fColor3fVertex3fvSUN, "glTexCoord2fColor3fVertex3fvSUN" }, - { &__blue_glCore_glBindTransformFeedbackNV, "glBindTransformFeedbackNV" }, - { &__blue_glCore_glVertexStream2svATI, "glVertexStream2svATI" }, - { &__blue_glCore_glMultiTexCoord1fvARB, "glMultiTexCoord1fvARB" }, - { &__blue_glCore_glMultiTexGendvEXT, "glMultiTexGendvEXT" }, - { &__blue_glCore_glProgramUniform2ui64vNV, "glProgramUniform2ui64vNV" }, - { &__blue_glCore_glGetNamedRenderbufferParameteriv, "glGetNamedRenderbufferParameteriv" }, - { &__blue_glCore_glBlendEquationSeparateEXT, "glBlendEquationSeparateEXT" }, - { &__blue_glCore_glInvalidateBufferData, "glInvalidateBufferData" }, - { &__blue_glCore_glFragmentLightModelfvSGIX, "glFragmentLightModelfvSGIX" }, - { &__blue_glCore_glMakeTextureHandleNonResidentARB, "glMakeTextureHandleNonResidentARB" }, - { &__blue_glCore_glMap2xOES, "glMap2xOES" }, - { &__blue_glCore_glFramebufferRenderbufferEXT, "glFramebufferRenderbufferEXT" }, - { &__blue_glCore_glGetMapAttribParameterfvNV, "glGetMapAttribParameterfvNV" }, - { &__blue_glCore_glVertexAttrib2dvARB, "glVertexAttrib2dvARB" }, - { &__blue_glCore_glInvalidateBufferSubData, "glInvalidateBufferSubData" }, - { &__blue_glCore_glVertexAttrib1d, "glVertexAttrib1d" }, - { &__blue_glCore_glDispatchComputeIndirect, "glDispatchComputeIndirect" }, - { &__blue_glCore_glStencilFuncSeparate, "glStencilFuncSeparate" }, - { &__blue_glCore_glMapVertexAttrib2fAPPLE, "glMapVertexAttrib2fAPPLE" }, - { &__blue_glCore_glProgramUniformMatrix2x4fv, "glProgramUniformMatrix2x4fv" }, - { &__blue_glCore_glReadPixels, "glReadPixels" }, - { &__blue_glCore_glVertexArrayAttribIFormat, "glVertexArrayAttribIFormat" }, - { &__blue_glCore_glCopyMultiTexSubImage1DEXT, "glCopyMultiTexSubImage1DEXT" }, - { &__blue_glCore_glBlendEquationSeparateIndexedAMD, "glBlendEquationSeparateIndexedAMD" }, - { &__blue_glCore_glGetTransformFeedbackVaryingEXT, "glGetTransformFeedbackVaryingEXT" }, - { &__blue_glCore_glProgramUniform2ui64ARB, "glProgramUniform2ui64ARB" }, - { &__blue_glCore_glProgramUniform1i64vARB, "glProgramUniform1i64vARB" }, - { &__blue_glCore_glMultiTexCoord4iv, "glMultiTexCoord4iv" }, - { &__blue_glCore_glLoadIdentityDeformationMapSGIX, "glLoadIdentityDeformationMapSGIX" }, - { &__blue_glCore_glGetMultiTexGendvEXT, "glGetMultiTexGendvEXT" }, - { &__blue_glCore_glVertex4xvOES, "glVertex4xvOES" }, - { &__blue_glCore_glVertexArrayVertexAttribOffsetEXT, "glVertexArrayVertexAttribOffsetEXT" }, - { &__blue_glCore_glNormalP3ui, "glNormalP3ui" }, - { &__blue_glCore_glMapParameterivNV, "glMapParameterivNV" }, - { &__blue_glCore_glColorPointervINTEL, "glColorPointervINTEL" }, - { &__blue_glCore_glGetQueryObjectui64v, "glGetQueryObjectui64v" }, - { &__blue_glCore_glGenFencesAPPLE, "glGenFencesAPPLE" }, - { &__blue_glCore_glNamedBufferPageCommitmentEXT, "glNamedBufferPageCommitmentEXT" }, - { &__blue_glCore_glGetShaderSourceARB, "glGetShaderSourceARB" }, - { &__blue_glCore_glClearNamedFramebufferuiv, "glClearNamedFramebufferuiv" }, - { &__blue_glCore_glVDPAUIsSurfaceNV, "glVDPAUIsSurfaceNV" }, - { &__blue_glCore_glVertexAttribL2ui64NV, "glVertexAttribL2ui64NV" }, - { &__blue_glCore_glColor4xvOES, "glColor4xvOES" }, - { &__blue_glCore_glUniformBlockBinding, "glUniformBlockBinding" }, - { &__blue_glCore_glListParameterivSGIX, "glListParameterivSGIX" }, - { &__blue_glCore_glPathSubCoordsNV, "glPathSubCoordsNV" }, - { &__blue_glCore_glGetProgramStringARB, "glGetProgramStringARB" }, - { &__blue_glCore_glPathStencilFuncNV, "glPathStencilFuncNV" }, - { &__blue_glCore_glBindVideoCaptureStreamBufferNV, "glBindVideoCaptureStreamBufferNV" }, - { &__blue_glCore_glReadnPixelsARB, "glReadnPixelsARB" }, - { &__blue_glCore_glTexBufferARB, "glTexBufferARB" }, - { &__blue_glCore_glVertexAttribL2ui64vNV, "glVertexAttribL2ui64vNV" }, - { &__blue_glCore_glCreateBuffers, "glCreateBuffers" }, - { &__blue_glCore_glImageTransformParameterfvHP, "glImageTransformParameterfvHP" }, - { &__blue_glCore_glUniform2d, "glUniform2d" }, - { &__blue_glCore_glBufferStorage, "glBufferStorage" }, - { &__blue_glCore_glGetTexFilterFuncSGIS, "glGetTexFilterFuncSGIS" }, - { &__blue_glCore_glGetHandleARB, "glGetHandleARB" }, - { &__blue_glCore_glGetHistogramParameterxvOES, "glGetHistogramParameterxvOES" }, - { &__blue_glCore_glMultiTexCoord2d, "glMultiTexCoord2d" }, - { &__blue_glCore_glVertex4hNV, "glVertex4hNV" }, - { &__blue_glCore_glGetPerfMonitorGroupStringAMD, "glGetPerfMonitorGroupStringAMD" }, - { &__blue_glCore_glCompressedTextureSubImage1D, "glCompressedTextureSubImage1D" }, - { &__blue_glCore_glIsFramebuffer, "glIsFramebuffer" }, - { &__blue_glCore_glUniform2dv, "glUniform2dv" }, - { &__blue_glCore_glVertexAttrib1dvARB, "glVertexAttrib1dvARB" }, - { &__blue_glCore_glClientWaitSync, "glClientWaitSync" }, - { &__blue_glCore_glProgramUniform4i64vARB, "glProgramUniform4i64vARB" }, - { &__blue_glCore_glGetActiveAttribARB, "glGetActiveAttribARB" }, - { &__blue_glCore_glCompressedTexImage3DARB, "glCompressedTexImage3DARB" }, - { &__blue_glCore_glVertexAttribI2iEXT, "glVertexAttribI2iEXT" }, - { &__blue_glCore_glProgramNamedParameter4dNV, "glProgramNamedParameter4dNV" }, - { &__blue_glCore_glProgramStringARB, "glProgramStringARB" }, - { &__blue_glCore_glWindowPos3fvMESA, "glWindowPos3fvMESA" }, - { &__blue_glCore_glBlendFunciARB, "glBlendFunciARB" }, - { &__blue_glCore_glVertexAttrib4dvNV, "glVertexAttrib4dvNV" }, - { &__blue_glCore_glWindowPos3dvARB, "glWindowPos3dvARB" }, - { &__blue_glCore_glMultiTexCoord1bvOES, "glMultiTexCoord1bvOES" }, - { &__blue_glCore_glVertexAttrib4fvARB, "glVertexAttrib4fvARB" }, + { &__blue_glCore_glBinormal3dvEXT, "glBinormal3dvEXT" }, + { &__blue_glCore_glBinormal3fEXT, "glBinormal3fEXT" }, + { &__blue_glCore_glBinormal3fvEXT, "glBinormal3fvEXT" }, + { &__blue_glCore_glBinormal3iEXT, "glBinormal3iEXT" }, + { &__blue_glCore_glBinormal3ivEXT, "glBinormal3ivEXT" }, + { &__blue_glCore_glBinormal3sEXT, "glBinormal3sEXT" }, + { &__blue_glCore_glBinormal3svEXT, "glBinormal3svEXT" }, + { &__blue_glCore_glTangentPointerEXT, "glTangentPointerEXT" }, + { &__blue_glCore_glBinormalPointerEXT, "glBinormalPointerEXT" }, + { &__blue_glCore_glCopyTexImage1DEXT, "glCopyTexImage1DEXT" }, + { &__blue_glCore_glCopyTexImage2DEXT, "glCopyTexImage2DEXT" }, + { &__blue_glCore_glCopyTexSubImage1DEXT, "glCopyTexSubImage1DEXT" }, + { &__blue_glCore_glCopyTexSubImage2DEXT, "glCopyTexSubImage2DEXT" }, + { &__blue_glCore_glCopyTexSubImage3DEXT, "glCopyTexSubImage3DEXT" }, + { &__blue_glCore_glCullParameterdvEXT, "glCullParameterdvEXT" }, + { &__blue_glCore_glCullParameterfvEXT, "glCullParameterfvEXT" }, + { &__blue_glCore_glLabelObjectEXT, "glLabelObjectEXT" }, + { &__blue_glCore_glGetObjectLabelEXT, "glGetObjectLabelEXT" }, + { &__blue_glCore_glInsertEventMarkerEXT, "glInsertEventMarkerEXT" }, + { &__blue_glCore_glPushGroupMarkerEXT, "glPushGroupMarkerEXT" }, { &__blue_glCore_glPopGroupMarkerEXT, "glPopGroupMarkerEXT" }, - { &__blue_glCore_glMultiDrawElements, "glMultiDrawElements" }, - { &__blue_glCore_glGetInstrumentsSGIX, "glGetInstrumentsSGIX" }, - { &__blue_glCore_glProgramUniform4dv, "glProgramUniform4dv" }, - { &__blue_glCore_glColorTableEXT, "glColorTableEXT" }, - { &__blue_glCore_glTexSubImage1D, "glTexSubImage1D" }, - { &__blue_glCore_glBeginPerfMonitorAMD, "glBeginPerfMonitorAMD" }, - { &__blue_glCore_glPointParameterfvSGIS, "glPointParameterfvSGIS" }, - { &__blue_glCore_glGetImageTransformParameterfvHP, "glGetImageTransformParameterfvHP" }, - { &__blue_glCore_glVertex3hvNV, "glVertex3hvNV" }, - { &__blue_glCore_glTexCoord4fVertex4fvSUN, "glTexCoord4fVertex4fvSUN" }, - { &__blue_glCore_glCompressedTexSubImage1D, "glCompressedTexSubImage1D" }, - { &__blue_glCore_glWindowPos2dvMESA, "glWindowPos2dvMESA" }, - { &__blue_glCore_glGetSamplerParameteriv, "glGetSamplerParameteriv" }, - { &__blue_glCore_glColorPointerListIBM, "glColorPointerListIBM" }, - { &__blue_glCore_glGetFinalCombinerInputParameterivNV, "glGetFinalCombinerInputParameterivNV" }, - { &__blue_glCore_glGetVertexAttribiv, "glGetVertexAttribiv" }, - { &__blue_glCore_glGetTexImage, "glGetTexImage" }, - { &__blue_glCore_glBufferSubData, "glBufferSubData" }, - { &__blue_glCore_glVertexAttrib3sARB, "glVertexAttrib3sARB" }, - { &__blue_glCore_glIsTextureHandleResidentARB, "glIsTextureHandleResidentARB" }, - { &__blue_glCore_glMultiTexCoord3i, "glMultiTexCoord3i" }, - { &__blue_glCore_glLinkProgramARB, "glLinkProgramARB" }, - { &__blue_glCore_glIsProgramNV, "glIsProgramNV" }, - { &__blue_glCore_glVertexAttribI4i, "glVertexAttribI4i" }, - { &__blue_glCore_glUniform1i, "glUniform1i" }, - { &__blue_glCore_glBindAttribLocationARB, "glBindAttribLocationARB" }, - { &__blue_glCore_glProgramUniform4i64vNV, "glProgramUniform4i64vNV" }, - { &__blue_glCore_glVertex4xOES, "glVertex4xOES" }, - { &__blue_glCore_glSetLocalConstantEXT, "glSetLocalConstantEXT" }, - { &__blue_glCore_glTexSubImage2D, "glTexSubImage2D" }, - { &__blue_glCore_glWindowPos2f, "glWindowPos2f" }, - { &__blue_glCore_glVariantPointerEXT, "glVariantPointerEXT" }, - { &__blue_glCore_glNamedRenderbufferStorageMultisample, "glNamedRenderbufferStorageMultisample" }, - { &__blue_glCore_glFogCoorddvEXT, "glFogCoorddvEXT" }, - { &__blue_glCore_glMultiModeDrawArraysIBM, "glMultiModeDrawArraysIBM" }, + { &__blue_glCore_glDepthBoundsEXT, "glDepthBoundsEXT" }, + { &__blue_glCore_glMatrixLoadfEXT, "glMatrixLoadfEXT" }, { &__blue_glCore_glMatrixLoaddEXT, "glMatrixLoaddEXT" }, - { &__blue_glCore_glDeleteQueriesARB, "glDeleteQueriesARB" }, - { &__blue_glCore_glUniform1fvARB, "glUniform1fvARB" }, - { &__blue_glCore_glDrawCommandsNV, "glDrawCommandsNV" }, - { &__blue_glCore_glSecondaryColor3dvEXT, "glSecondaryColor3dvEXT" }, - { &__blue_glCore_glFlushVertexArrayRangeAPPLE, "glFlushVertexArrayRangeAPPLE" }, - { &__blue_glCore_glTexEnvxvOES, "glTexEnvxvOES" }, - { &__blue_glCore_glGetSeparableFilterEXT, "glGetSeparableFilterEXT" }, - { &__blue_glCore_glVertexAttribI4bvEXT, "glVertexAttribI4bvEXT" }, - { &__blue_glCore_glUniform3i64NV, "glUniform3i64NV" }, - { &__blue_glCore_glBlendEquationIndexedAMD, "glBlendEquationIndexedAMD" }, - { &__blue_glCore_glPointParameterf, "glPointParameterf" }, - { &__blue_glCore_glVertex4bvOES, "glVertex4bvOES" }, - { &__blue_glCore_glStencilThenCoverFillPathNV, "glStencilThenCoverFillPathNV" }, + { &__blue_glCore_glMatrixMultfEXT, "glMatrixMultfEXT" }, + { &__blue_glCore_glMatrixMultdEXT, "glMatrixMultdEXT" }, + { &__blue_glCore_glMatrixLoadIdentityEXT, "glMatrixLoadIdentityEXT" }, + { &__blue_glCore_glMatrixRotatefEXT, "glMatrixRotatefEXT" }, + { &__blue_glCore_glMatrixRotatedEXT, "glMatrixRotatedEXT" }, + { &__blue_glCore_glMatrixScalefEXT, "glMatrixScalefEXT" }, + { &__blue_glCore_glMatrixScaledEXT, "glMatrixScaledEXT" }, + { &__blue_glCore_glMatrixTranslatefEXT, "glMatrixTranslatefEXT" }, + { &__blue_glCore_glMatrixTranslatedEXT, "glMatrixTranslatedEXT" }, + { &__blue_glCore_glMatrixFrustumEXT, "glMatrixFrustumEXT" }, + { &__blue_glCore_glMatrixOrthoEXT, "glMatrixOrthoEXT" }, + { &__blue_glCore_glMatrixPopEXT, "glMatrixPopEXT" }, + { &__blue_glCore_glMatrixPushEXT, "glMatrixPushEXT" }, + { &__blue_glCore_glClientAttribDefaultEXT, "glClientAttribDefaultEXT" }, + { &__blue_glCore_glPushClientAttribDefaultEXT, "glPushClientAttribDefaultEXT" }, + { &__blue_glCore_glTextureParameterfEXT, "glTextureParameterfEXT" }, + { &__blue_glCore_glTextureParameterfvEXT, "glTextureParameterfvEXT" }, + { &__blue_glCore_glTextureParameteriEXT, "glTextureParameteriEXT" }, + { &__blue_glCore_glTextureParameterivEXT, "glTextureParameterivEXT" }, + { &__blue_glCore_glTextureImage1DEXT, "glTextureImage1DEXT" }, + { &__blue_glCore_glTextureImage2DEXT, "glTextureImage2DEXT" }, + { &__blue_glCore_glTextureSubImage1DEXT, "glTextureSubImage1DEXT" }, + { &__blue_glCore_glTextureSubImage2DEXT, "glTextureSubImage2DEXT" }, + { &__blue_glCore_glCopyTextureImage1DEXT, "glCopyTextureImage1DEXT" }, + { &__blue_glCore_glCopyTextureImage2DEXT, "glCopyTextureImage2DEXT" }, + { &__blue_glCore_glCopyTextureSubImage1DEXT, "glCopyTextureSubImage1DEXT" }, + { &__blue_glCore_glCopyTextureSubImage2DEXT, "glCopyTextureSubImage2DEXT" }, + { &__blue_glCore_glGetTextureImageEXT, "glGetTextureImageEXT" }, + { &__blue_glCore_glGetTextureParameterfvEXT, "glGetTextureParameterfvEXT" }, + { &__blue_glCore_glGetTextureParameterivEXT, "glGetTextureParameterivEXT" }, + { &__blue_glCore_glGetTextureLevelParameterfvEXT, "glGetTextureLevelParameterfvEXT" }, + { &__blue_glCore_glGetTextureLevelParameterivEXT, "glGetTextureLevelParameterivEXT" }, + { &__blue_glCore_glTextureImage3DEXT, "glTextureImage3DEXT" }, + { &__blue_glCore_glTextureSubImage3DEXT, "glTextureSubImage3DEXT" }, + { &__blue_glCore_glCopyTextureSubImage3DEXT, "glCopyTextureSubImage3DEXT" }, + { &__blue_glCore_glBindMultiTextureEXT, "glBindMultiTextureEXT" }, + { &__blue_glCore_glMultiTexCoordPointerEXT, "glMultiTexCoordPointerEXT" }, + { &__blue_glCore_glMultiTexEnvfEXT, "glMultiTexEnvfEXT" }, + { &__blue_glCore_glMultiTexEnvfvEXT, "glMultiTexEnvfvEXT" }, + { &__blue_glCore_glMultiTexEnviEXT, "glMultiTexEnviEXT" }, + { &__blue_glCore_glMultiTexEnvivEXT, "glMultiTexEnvivEXT" }, + { &__blue_glCore_glMultiTexGendEXT, "glMultiTexGendEXT" }, + { &__blue_glCore_glMultiTexGendvEXT, "glMultiTexGendvEXT" }, + { &__blue_glCore_glMultiTexGenfEXT, "glMultiTexGenfEXT" }, + { &__blue_glCore_glMultiTexGenfvEXT, "glMultiTexGenfvEXT" }, + { &__blue_glCore_glMultiTexGeniEXT, "glMultiTexGeniEXT" }, + { &__blue_glCore_glMultiTexGenivEXT, "glMultiTexGenivEXT" }, + { &__blue_glCore_glGetMultiTexEnvfvEXT, "glGetMultiTexEnvfvEXT" }, + { &__blue_glCore_glGetMultiTexEnvivEXT, "glGetMultiTexEnvivEXT" }, + { &__blue_glCore_glGetMultiTexGendvEXT, "glGetMultiTexGendvEXT" }, + { &__blue_glCore_glGetMultiTexGenfvEXT, "glGetMultiTexGenfvEXT" }, + { &__blue_glCore_glGetMultiTexGenivEXT, "glGetMultiTexGenivEXT" }, + { &__blue_glCore_glMultiTexParameteriEXT, "glMultiTexParameteriEXT" }, + { &__blue_glCore_glMultiTexParameterivEXT, "glMultiTexParameterivEXT" }, + { &__blue_glCore_glMultiTexParameterfEXT, "glMultiTexParameterfEXT" }, + { &__blue_glCore_glMultiTexParameterfvEXT, "glMultiTexParameterfvEXT" }, + { &__blue_glCore_glMultiTexImage1DEXT, "glMultiTexImage1DEXT" }, + { &__blue_glCore_glMultiTexImage2DEXT, "glMultiTexImage2DEXT" }, + { &__blue_glCore_glMultiTexSubImage1DEXT, "glMultiTexSubImage1DEXT" }, + { &__blue_glCore_glMultiTexSubImage2DEXT, "glMultiTexSubImage2DEXT" }, + { &__blue_glCore_glCopyMultiTexImage1DEXT, "glCopyMultiTexImage1DEXT" }, + { &__blue_glCore_glCopyMultiTexImage2DEXT, "glCopyMultiTexImage2DEXT" }, + { &__blue_glCore_glCopyMultiTexSubImage1DEXT, "glCopyMultiTexSubImage1DEXT" }, + { &__blue_glCore_glCopyMultiTexSubImage2DEXT, "glCopyMultiTexSubImage2DEXT" }, + { &__blue_glCore_glGetMultiTexImageEXT, "glGetMultiTexImageEXT" }, + { &__blue_glCore_glGetMultiTexParameterfvEXT, "glGetMultiTexParameterfvEXT" }, + { &__blue_glCore_glGetMultiTexParameterivEXT, "glGetMultiTexParameterivEXT" }, + { &__blue_glCore_glGetMultiTexLevelParameterfvEXT, "glGetMultiTexLevelParameterfvEXT" }, + { &__blue_glCore_glGetMultiTexLevelParameterivEXT, "glGetMultiTexLevelParameterivEXT" }, + { &__blue_glCore_glMultiTexImage3DEXT, "glMultiTexImage3DEXT" }, + { &__blue_glCore_glMultiTexSubImage3DEXT, "glMultiTexSubImage3DEXT" }, + { &__blue_glCore_glCopyMultiTexSubImage3DEXT, "glCopyMultiTexSubImage3DEXT" }, + { &__blue_glCore_glEnableClientStateIndexedEXT, "glEnableClientStateIndexedEXT" }, + { &__blue_glCore_glDisableClientStateIndexedEXT, "glDisableClientStateIndexedEXT" }, + { &__blue_glCore_glGetFloatIndexedvEXT, "glGetFloatIndexedvEXT" }, + { &__blue_glCore_glGetDoubleIndexedvEXT, "glGetDoubleIndexedvEXT" }, + { &__blue_glCore_glGetPointerIndexedvEXT, "glGetPointerIndexedvEXT" }, + { &__blue_glCore_glEnableIndexedEXT, "glEnableIndexedEXT" }, + { &__blue_glCore_glDisableIndexedEXT, "glDisableIndexedEXT" }, + { &__blue_glCore_glIsEnabledIndexedEXT, "glIsEnabledIndexedEXT" }, + { &__blue_glCore_glGetIntegerIndexedvEXT, "glGetIntegerIndexedvEXT" }, + { &__blue_glCore_glGetBooleanIndexedvEXT, "glGetBooleanIndexedvEXT" }, + { &__blue_glCore_glCompressedTextureImage3DEXT, "glCompressedTextureImage3DEXT" }, { &__blue_glCore_glCompressedTextureImage2DEXT, "glCompressedTextureImage2DEXT" }, - { &__blue_glCore_glBlendEquationSeparate, "glBlendEquationSeparate" }, - { &__blue_glCore_glGetNamedFramebufferParameteriv, "glGetNamedFramebufferParameteriv" }, - { &__blue_glCore_glTexImage3DEXT, "glTexImage3DEXT" }, - { &__blue_glCore_glColorFragmentOp3ATI, "glColorFragmentOp3ATI" }, - { &__blue_glCore_glNormalPointerListIBM, "glNormalPointerListIBM" }, - { &__blue_glCore_glTexParameteriv, "glTexParameteriv" }, - { &__blue_glCore_glCompressedTexSubImage2D, "glCompressedTexSubImage2D" }, - { &__blue_glCore_glCoverFillPathNV, "glCoverFillPathNV" }, + { &__blue_glCore_glCompressedTextureImage1DEXT, "glCompressedTextureImage1DEXT" }, + { &__blue_glCore_glCompressedTextureSubImage3DEXT, "glCompressedTextureSubImage3DEXT" }, + { &__blue_glCore_glCompressedTextureSubImage2DEXT, "glCompressedTextureSubImage2DEXT" }, + { &__blue_glCore_glCompressedTextureSubImage1DEXT, "glCompressedTextureSubImage1DEXT" }, + { &__blue_glCore_glGetCompressedTextureImageEXT, "glGetCompressedTextureImageEXT" }, + { &__blue_glCore_glCompressedMultiTexImage3DEXT, "glCompressedMultiTexImage3DEXT" }, + { &__blue_glCore_glCompressedMultiTexImage2DEXT, "glCompressedMultiTexImage2DEXT" }, + { &__blue_glCore_glCompressedMultiTexImage1DEXT, "glCompressedMultiTexImage1DEXT" }, + { &__blue_glCore_glCompressedMultiTexSubImage3DEXT, "glCompressedMultiTexSubImage3DEXT" }, + { &__blue_glCore_glCompressedMultiTexSubImage2DEXT, "glCompressedMultiTexSubImage2DEXT" }, + { &__blue_glCore_glCompressedMultiTexSubImage1DEXT, "glCompressedMultiTexSubImage1DEXT" }, + { &__blue_glCore_glGetCompressedMultiTexImageEXT, "glGetCompressedMultiTexImageEXT" }, + { &__blue_glCore_glMatrixLoadTransposefEXT, "glMatrixLoadTransposefEXT" }, + { &__blue_glCore_glMatrixLoadTransposedEXT, "glMatrixLoadTransposedEXT" }, + { &__blue_glCore_glMatrixMultTransposefEXT, "glMatrixMultTransposefEXT" }, + { &__blue_glCore_glMatrixMultTransposedEXT, "glMatrixMultTransposedEXT" }, + { &__blue_glCore_glNamedBufferDataEXT, "glNamedBufferDataEXT" }, + { &__blue_glCore_glNamedBufferSubDataEXT, "glNamedBufferSubDataEXT" }, + { &__blue_glCore_glMapNamedBufferEXT, "glMapNamedBufferEXT" }, + { &__blue_glCore_glUnmapNamedBufferEXT, "glUnmapNamedBufferEXT" }, + { &__blue_glCore_glGetNamedBufferParameterivEXT, "glGetNamedBufferParameterivEXT" }, + { &__blue_glCore_glGetNamedBufferPointervEXT, "glGetNamedBufferPointervEXT" }, + { &__blue_glCore_glGetNamedBufferSubDataEXT, "glGetNamedBufferSubDataEXT" }, + { &__blue_glCore_glProgramUniform1fEXT, "glProgramUniform1fEXT" }, + { &__blue_glCore_glProgramUniform2fEXT, "glProgramUniform2fEXT" }, + { &__blue_glCore_glProgramUniform3fEXT, "glProgramUniform3fEXT" }, + { &__blue_glCore_glProgramUniform4fEXT, "glProgramUniform4fEXT" }, + { &__blue_glCore_glProgramUniform1iEXT, "glProgramUniform1iEXT" }, + { &__blue_glCore_glProgramUniform2iEXT, "glProgramUniform2iEXT" }, + { &__blue_glCore_glProgramUniform3iEXT, "glProgramUniform3iEXT" }, + { &__blue_glCore_glProgramUniform4iEXT, "glProgramUniform4iEXT" }, + { &__blue_glCore_glProgramUniform1fvEXT, "glProgramUniform1fvEXT" }, + { &__blue_glCore_glProgramUniform2fvEXT, "glProgramUniform2fvEXT" }, + { &__blue_glCore_glProgramUniform3fvEXT, "glProgramUniform3fvEXT" }, + { &__blue_glCore_glProgramUniform4fvEXT, "glProgramUniform4fvEXT" }, + { &__blue_glCore_glProgramUniform1ivEXT, "glProgramUniform1ivEXT" }, + { &__blue_glCore_glProgramUniform2ivEXT, "glProgramUniform2ivEXT" }, + { &__blue_glCore_glProgramUniform3ivEXT, "glProgramUniform3ivEXT" }, + { &__blue_glCore_glProgramUniform4ivEXT, "glProgramUniform4ivEXT" }, + { &__blue_glCore_glProgramUniformMatrix2fvEXT, "glProgramUniformMatrix2fvEXT" }, + { &__blue_glCore_glProgramUniformMatrix3fvEXT, "glProgramUniformMatrix3fvEXT" }, + { &__blue_glCore_glProgramUniformMatrix4fvEXT, "glProgramUniformMatrix4fvEXT" }, + { &__blue_glCore_glProgramUniformMatrix2x3fvEXT, "glProgramUniformMatrix2x3fvEXT" }, + { &__blue_glCore_glProgramUniformMatrix3x2fvEXT, "glProgramUniformMatrix3x2fvEXT" }, + { &__blue_glCore_glProgramUniformMatrix2x4fvEXT, "glProgramUniformMatrix2x4fvEXT" }, + { &__blue_glCore_glProgramUniformMatrix4x2fvEXT, "glProgramUniformMatrix4x2fvEXT" }, + { &__blue_glCore_glProgramUniformMatrix3x4fvEXT, "glProgramUniformMatrix3x4fvEXT" }, + { &__blue_glCore_glProgramUniformMatrix4x3fvEXT, "glProgramUniformMatrix4x3fvEXT" }, + { &__blue_glCore_glTextureBufferEXT, "glTextureBufferEXT" }, + { &__blue_glCore_glMultiTexBufferEXT, "glMultiTexBufferEXT" }, + { &__blue_glCore_glTextureParameterIivEXT, "glTextureParameterIivEXT" }, + { &__blue_glCore_glTextureParameterIuivEXT, "glTextureParameterIuivEXT" }, + { &__blue_glCore_glGetTextureParameterIivEXT, "glGetTextureParameterIivEXT" }, + { &__blue_glCore_glGetTextureParameterIuivEXT, "glGetTextureParameterIuivEXT" }, + { &__blue_glCore_glMultiTexParameterIivEXT, "glMultiTexParameterIivEXT" }, + { &__blue_glCore_glMultiTexParameterIuivEXT, "glMultiTexParameterIuivEXT" }, + { &__blue_glCore_glGetMultiTexParameterIivEXT, "glGetMultiTexParameterIivEXT" }, + { &__blue_glCore_glGetMultiTexParameterIuivEXT, "glGetMultiTexParameterIuivEXT" }, + { &__blue_glCore_glProgramUniform1uiEXT, "glProgramUniform1uiEXT" }, + { &__blue_glCore_glProgramUniform2uiEXT, "glProgramUniform2uiEXT" }, + { &__blue_glCore_glProgramUniform3uiEXT, "glProgramUniform3uiEXT" }, + { &__blue_glCore_glProgramUniform4uiEXT, "glProgramUniform4uiEXT" }, + { &__blue_glCore_glProgramUniform1uivEXT, "glProgramUniform1uivEXT" }, + { &__blue_glCore_glProgramUniform2uivEXT, "glProgramUniform2uivEXT" }, + { &__blue_glCore_glProgramUniform3uivEXT, "glProgramUniform3uivEXT" }, + { &__blue_glCore_glProgramUniform4uivEXT, "glProgramUniform4uivEXT" }, + { &__blue_glCore_glNamedProgramLocalParameters4fvEXT, "glNamedProgramLocalParameters4fvEXT" }, + { &__blue_glCore_glNamedProgramLocalParameterI4iEXT, "glNamedProgramLocalParameterI4iEXT" }, + { &__blue_glCore_glNamedProgramLocalParameterI4ivEXT, "glNamedProgramLocalParameterI4ivEXT" }, + { &__blue_glCore_glNamedProgramLocalParametersI4ivEXT, "glNamedProgramLocalParametersI4ivEXT" }, + { &__blue_glCore_glNamedProgramLocalParameterI4uiEXT, "glNamedProgramLocalParameterI4uiEXT" }, + { &__blue_glCore_glNamedProgramLocalParameterI4uivEXT, "glNamedProgramLocalParameterI4uivEXT" }, + { &__blue_glCore_glNamedProgramLocalParametersI4uivEXT, "glNamedProgramLocalParametersI4uivEXT" }, + { &__blue_glCore_glGetNamedProgramLocalParameterIivEXT, "glGetNamedProgramLocalParameterIivEXT" }, + { &__blue_glCore_glGetNamedProgramLocalParameterIuivEXT, "glGetNamedProgramLocalParameterIuivEXT" }, + { &__blue_glCore_glEnableClientStateiEXT, "glEnableClientStateiEXT" }, + { &__blue_glCore_glDisableClientStateiEXT, "glDisableClientStateiEXT" }, + { &__blue_glCore_glGetFloati_vEXT, "glGetFloati_vEXT" }, + { &__blue_glCore_glGetDoublei_vEXT, "glGetDoublei_vEXT" }, + { &__blue_glCore_glGetPointeri_vEXT, "glGetPointeri_vEXT" }, + { &__blue_glCore_glNamedProgramStringEXT, "glNamedProgramStringEXT" }, + { &__blue_glCore_glNamedProgramLocalParameter4dEXT, "glNamedProgramLocalParameter4dEXT" }, + { &__blue_glCore_glNamedProgramLocalParameter4dvEXT, "glNamedProgramLocalParameter4dvEXT" }, + { &__blue_glCore_glNamedProgramLocalParameter4fEXT, "glNamedProgramLocalParameter4fEXT" }, + { &__blue_glCore_glNamedProgramLocalParameter4fvEXT, "glNamedProgramLocalParameter4fvEXT" }, + { &__blue_glCore_glGetNamedProgramLocalParameterdvEXT, "glGetNamedProgramLocalParameterdvEXT" }, + { &__blue_glCore_glGetNamedProgramLocalParameterfvEXT, "glGetNamedProgramLocalParameterfvEXT" }, + { &__blue_glCore_glGetNamedProgramivEXT, "glGetNamedProgramivEXT" }, + { &__blue_glCore_glGetNamedProgramStringEXT, "glGetNamedProgramStringEXT" }, + { &__blue_glCore_glNamedRenderbufferStorageEXT, "glNamedRenderbufferStorageEXT" }, + { &__blue_glCore_glGetNamedRenderbufferParameterivEXT, "glGetNamedRenderbufferParameterivEXT" }, + { &__blue_glCore_glNamedRenderbufferStorageMultisampleEXT, "glNamedRenderbufferStorageMultisampleEXT" }, + { &__blue_glCore_glNamedRenderbufferStorageMultisampleCoverageEXT, "glNamedRenderbufferStorageMultisampleCoverageEXT" }, + { &__blue_glCore_glCheckNamedFramebufferStatusEXT, "glCheckNamedFramebufferStatusEXT" }, + { &__blue_glCore_glNamedFramebufferTexture1DEXT, "glNamedFramebufferTexture1DEXT" }, + { &__blue_glCore_glNamedFramebufferTexture2DEXT, "glNamedFramebufferTexture2DEXT" }, + { &__blue_glCore_glNamedFramebufferTexture3DEXT, "glNamedFramebufferTexture3DEXT" }, + { &__blue_glCore_glNamedFramebufferRenderbufferEXT, "glNamedFramebufferRenderbufferEXT" }, + { &__blue_glCore_glGetNamedFramebufferAttachmentParameterivEXT, "glGetNamedFramebufferAttachmentParameterivEXT" }, + { &__blue_glCore_glGenerateTextureMipmapEXT, "glGenerateTextureMipmapEXT" }, + { &__blue_glCore_glGenerateMultiTexMipmapEXT, "glGenerateMultiTexMipmapEXT" }, + { &__blue_glCore_glFramebufferDrawBufferEXT, "glFramebufferDrawBufferEXT" }, + { &__blue_glCore_glFramebufferDrawBuffersEXT, "glFramebufferDrawBuffersEXT" }, + { &__blue_glCore_glFramebufferReadBufferEXT, "glFramebufferReadBufferEXT" }, + { &__blue_glCore_glGetFramebufferParameterivEXT, "glGetFramebufferParameterivEXT" }, + { &__blue_glCore_glNamedCopyBufferSubDataEXT, "glNamedCopyBufferSubDataEXT" }, + { &__blue_glCore_glNamedFramebufferTextureEXT, "glNamedFramebufferTextureEXT" }, + { &__blue_glCore_glNamedFramebufferTextureLayerEXT, "glNamedFramebufferTextureLayerEXT" }, + { &__blue_glCore_glNamedFramebufferTextureFaceEXT, "glNamedFramebufferTextureFaceEXT" }, + { &__blue_glCore_glTextureRenderbufferEXT, "glTextureRenderbufferEXT" }, + { &__blue_glCore_glMultiTexRenderbufferEXT, "glMultiTexRenderbufferEXT" }, + { &__blue_glCore_glVertexArrayVertexOffsetEXT, "glVertexArrayVertexOffsetEXT" }, + { &__blue_glCore_glVertexArrayColorOffsetEXT, "glVertexArrayColorOffsetEXT" }, + { &__blue_glCore_glVertexArrayEdgeFlagOffsetEXT, "glVertexArrayEdgeFlagOffsetEXT" }, + { &__blue_glCore_glVertexArrayIndexOffsetEXT, "glVertexArrayIndexOffsetEXT" }, + { &__blue_glCore_glVertexArrayNormalOffsetEXT, "glVertexArrayNormalOffsetEXT" }, + { &__blue_glCore_glVertexArrayTexCoordOffsetEXT, "glVertexArrayTexCoordOffsetEXT" }, + { &__blue_glCore_glVertexArrayMultiTexCoordOffsetEXT, "glVertexArrayMultiTexCoordOffsetEXT" }, + { &__blue_glCore_glVertexArrayFogCoordOffsetEXT, "glVertexArrayFogCoordOffsetEXT" }, + { &__blue_glCore_glVertexArraySecondaryColorOffsetEXT, "glVertexArraySecondaryColorOffsetEXT" }, + { &__blue_glCore_glVertexArrayVertexAttribOffsetEXT, "glVertexArrayVertexAttribOffsetEXT" }, + { &__blue_glCore_glVertexArrayVertexAttribIOffsetEXT, "glVertexArrayVertexAttribIOffsetEXT" }, + { &__blue_glCore_glEnableVertexArrayEXT, "glEnableVertexArrayEXT" }, + { &__blue_glCore_glDisableVertexArrayEXT, "glDisableVertexArrayEXT" }, + { &__blue_glCore_glEnableVertexArrayAttribEXT, "glEnableVertexArrayAttribEXT" }, + { &__blue_glCore_glDisableVertexArrayAttribEXT, "glDisableVertexArrayAttribEXT" }, + { &__blue_glCore_glGetVertexArrayIntegervEXT, "glGetVertexArrayIntegervEXT" }, + { &__blue_glCore_glGetVertexArrayPointervEXT, "glGetVertexArrayPointervEXT" }, + { &__blue_glCore_glGetVertexArrayIntegeri_vEXT, "glGetVertexArrayIntegeri_vEXT" }, + { &__blue_glCore_glGetVertexArrayPointeri_vEXT, "glGetVertexArrayPointeri_vEXT" }, + { &__blue_glCore_glMapNamedBufferRangeEXT, "glMapNamedBufferRangeEXT" }, + { &__blue_glCore_glFlushMappedNamedBufferRangeEXT, "glFlushMappedNamedBufferRangeEXT" }, + { &__blue_glCore_glNamedBufferStorageEXT, "glNamedBufferStorageEXT" }, + { &__blue_glCore_glClearNamedBufferDataEXT, "glClearNamedBufferDataEXT" }, + { &__blue_glCore_glClearNamedBufferSubDataEXT, "glClearNamedBufferSubDataEXT" }, + { &__blue_glCore_glNamedFramebufferParameteriEXT, "glNamedFramebufferParameteriEXT" }, + { &__blue_glCore_glGetNamedFramebufferParameterivEXT, "glGetNamedFramebufferParameterivEXT" }, + { &__blue_glCore_glProgramUniform1dEXT, "glProgramUniform1dEXT" }, + { &__blue_glCore_glProgramUniform2dEXT, "glProgramUniform2dEXT" }, + { &__blue_glCore_glProgramUniform3dEXT, "glProgramUniform3dEXT" }, + { &__blue_glCore_glProgramUniform4dEXT, "glProgramUniform4dEXT" }, + { &__blue_glCore_glProgramUniform1dvEXT, "glProgramUniform1dvEXT" }, + { &__blue_glCore_glProgramUniform2dvEXT, "glProgramUniform2dvEXT" }, + { &__blue_glCore_glProgramUniform3dvEXT, "glProgramUniform3dvEXT" }, + { &__blue_glCore_glProgramUniform4dvEXT, "glProgramUniform4dvEXT" }, + { &__blue_glCore_glProgramUniformMatrix2dvEXT, "glProgramUniformMatrix2dvEXT" }, + { &__blue_glCore_glProgramUniformMatrix3dvEXT, "glProgramUniformMatrix3dvEXT" }, + { &__blue_glCore_glProgramUniformMatrix4dvEXT, "glProgramUniformMatrix4dvEXT" }, + { &__blue_glCore_glProgramUniformMatrix2x3dvEXT, "glProgramUniformMatrix2x3dvEXT" }, + { &__blue_glCore_glProgramUniformMatrix2x4dvEXT, "glProgramUniformMatrix2x4dvEXT" }, + { &__blue_glCore_glProgramUniformMatrix3x2dvEXT, "glProgramUniformMatrix3x2dvEXT" }, + { &__blue_glCore_glProgramUniformMatrix3x4dvEXT, "glProgramUniformMatrix3x4dvEXT" }, { &__blue_glCore_glProgramUniformMatrix4x2dvEXT, "glProgramUniformMatrix4x2dvEXT" }, - { &__blue_glCore_glVertexAttrib1f, "glVertexAttrib1f" }, - { &__blue_glCore_glAlphaFragmentOp3ATI, "glAlphaFragmentOp3ATI" }, - { &__blue_glCore_glBeginQueryIndexed, "glBeginQueryIndexed" }, - { &__blue_glCore_glProgramUniformMatrix2x3fv, "glProgramUniformMatrix2x3fv" }, - { &__blue_glCore_glProgramUniform4ui64vNV, "glProgramUniform4ui64vNV" }, - { &__blue_glCore_glUniform1ui64NV, "glUniform1ui64NV" }, - { &__blue_glCore_glMultiTexCoord3svARB, "glMultiTexCoord3svARB" }, - { &__blue_glCore_glWeightivARB, "glWeightivARB" }, - { &__blue_glCore_glMultiTexCoord4xOES, "glMultiTexCoord4xOES" }, - { &__blue_glCore_glVertexAttribL2i64NV, "glVertexAttribL2i64NV" }, - { &__blue_glCore_glProgramUniformMatrix3x4dv, "glProgramUniformMatrix3x4dv" }, + { &__blue_glCore_glProgramUniformMatrix4x3dvEXT, "glProgramUniformMatrix4x3dvEXT" }, + { &__blue_glCore_glTextureBufferRangeEXT, "glTextureBufferRangeEXT" }, + { &__blue_glCore_glTextureStorage1DEXT, "glTextureStorage1DEXT" }, + { &__blue_glCore_glTextureStorage2DEXT, "glTextureStorage2DEXT" }, + { &__blue_glCore_glTextureStorage3DEXT, "glTextureStorage3DEXT" }, + { &__blue_glCore_glTextureStorage2DMultisampleEXT, "glTextureStorage2DMultisampleEXT" }, + { &__blue_glCore_glTextureStorage3DMultisampleEXT, "glTextureStorage3DMultisampleEXT" }, + { &__blue_glCore_glVertexArrayBindVertexBufferEXT, "glVertexArrayBindVertexBufferEXT" }, + { &__blue_glCore_glVertexArrayVertexAttribFormatEXT, "glVertexArrayVertexAttribFormatEXT" }, + { &__blue_glCore_glVertexArrayVertexAttribIFormatEXT, "glVertexArrayVertexAttribIFormatEXT" }, + { &__blue_glCore_glVertexArrayVertexAttribLFormatEXT, "glVertexArrayVertexAttribLFormatEXT" }, + { &__blue_glCore_glVertexArrayVertexAttribBindingEXT, "glVertexArrayVertexAttribBindingEXT" }, + { &__blue_glCore_glVertexArrayVertexBindingDivisorEXT, "glVertexArrayVertexBindingDivisorEXT" }, + { &__blue_glCore_glVertexArrayVertexAttribLOffsetEXT, "glVertexArrayVertexAttribLOffsetEXT" }, + { &__blue_glCore_glTexturePageCommitmentEXT, "glTexturePageCommitmentEXT" }, + { &__blue_glCore_glVertexArrayVertexAttribDivisorEXT, "glVertexArrayVertexAttribDivisorEXT" }, + { &__blue_glCore_glColorMaskIndexedEXT, "glColorMaskIndexedEXT" }, + { &__blue_glCore_glDrawArraysInstancedEXT, "glDrawArraysInstancedEXT" }, + { &__blue_glCore_glDrawElementsInstancedEXT, "glDrawElementsInstancedEXT" }, + { &__blue_glCore_glDrawRangeElementsEXT, "glDrawRangeElementsEXT" }, + { &__blue_glCore_glFogCoordfEXT, "glFogCoordfEXT" }, + { &__blue_glCore_glFogCoordfvEXT, "glFogCoordfvEXT" }, + { &__blue_glCore_glFogCoorddEXT, "glFogCoorddEXT" }, + { &__blue_glCore_glFogCoorddvEXT, "glFogCoorddvEXT" }, + { &__blue_glCore_glFogCoordPointerEXT, "glFogCoordPointerEXT" }, + { &__blue_glCore_glBlitFramebufferEXT, "glBlitFramebufferEXT" }, + { &__blue_glCore_glRenderbufferStorageMultisampleEXT, "glRenderbufferStorageMultisampleEXT" }, + { &__blue_glCore_glIsRenderbufferEXT, "glIsRenderbufferEXT" }, + { &__blue_glCore_glBindRenderbufferEXT, "glBindRenderbufferEXT" }, + { &__blue_glCore_glDeleteRenderbuffersEXT, "glDeleteRenderbuffersEXT" }, + { &__blue_glCore_glGenRenderbuffersEXT, "glGenRenderbuffersEXT" }, + { &__blue_glCore_glRenderbufferStorageEXT, "glRenderbufferStorageEXT" }, + { &__blue_glCore_glGetRenderbufferParameterivEXT, "glGetRenderbufferParameterivEXT" }, + { &__blue_glCore_glIsFramebufferEXT, "glIsFramebufferEXT" }, + { &__blue_glCore_glBindFramebufferEXT, "glBindFramebufferEXT" }, + { &__blue_glCore_glDeleteFramebuffersEXT, "glDeleteFramebuffersEXT" }, + { &__blue_glCore_glGenFramebuffersEXT, "glGenFramebuffersEXT" }, + { &__blue_glCore_glCheckFramebufferStatusEXT, "glCheckFramebufferStatusEXT" }, + { &__blue_glCore_glFramebufferTexture1DEXT, "glFramebufferTexture1DEXT" }, + { &__blue_glCore_glFramebufferTexture2DEXT, "glFramebufferTexture2DEXT" }, + { &__blue_glCore_glFramebufferTexture3DEXT, "glFramebufferTexture3DEXT" }, + { &__blue_glCore_glFramebufferRenderbufferEXT, "glFramebufferRenderbufferEXT" }, + { &__blue_glCore_glGetFramebufferAttachmentParameterivEXT, "glGetFramebufferAttachmentParameterivEXT" }, + { &__blue_glCore_glGenerateMipmapEXT, "glGenerateMipmapEXT" }, { &__blue_glCore_glProgramParameteriEXT, "glProgramParameteriEXT" }, - { &__blue_glCore_glSecondaryColor3sEXT, "glSecondaryColor3sEXT" }, - { &__blue_glCore_glCompressedTextureSubImage3DEXT, "glCompressedTextureSubImage3DEXT" }, - { &__blue_glCore_glGetPointervEXT, "glGetPointervEXT" }, + { &__blue_glCore_glProgramEnvParameters4fvEXT, "glProgramEnvParameters4fvEXT" }, + { &__blue_glCore_glProgramLocalParameters4fvEXT, "glProgramLocalParameters4fvEXT" }, + { &__blue_glCore_glGetUniformuivEXT, "glGetUniformuivEXT" }, + { &__blue_glCore_glBindFragDataLocationEXT, "glBindFragDataLocationEXT" }, + { &__blue_glCore_glGetFragDataLocationEXT, "glGetFragDataLocationEXT" }, + { &__blue_glCore_glUniform1uiEXT, "glUniform1uiEXT" }, + { &__blue_glCore_glUniform2uiEXT, "glUniform2uiEXT" }, + { &__blue_glCore_glUniform3uiEXT, "glUniform3uiEXT" }, + { &__blue_glCore_glUniform4uiEXT, "glUniform4uiEXT" }, + { &__blue_glCore_glUniform1uivEXT, "glUniform1uivEXT" }, + { &__blue_glCore_glUniform2uivEXT, "glUniform2uivEXT" }, + { &__blue_glCore_glUniform3uivEXT, "glUniform3uivEXT" }, + { &__blue_glCore_glUniform4uivEXT, "glUniform4uivEXT" }, + { &__blue_glCore_glGetHistogramEXT, "glGetHistogramEXT" }, + { &__blue_glCore_glGetHistogramParameterfvEXT, "glGetHistogramParameterfvEXT" }, + { &__blue_glCore_glGetHistogramParameterivEXT, "glGetHistogramParameterivEXT" }, + { &__blue_glCore_glGetMinmaxEXT, "glGetMinmaxEXT" }, { &__blue_glCore_glGetMinmaxParameterfvEXT, "glGetMinmaxParameterfvEXT" }, - { &__blue_glCore_glMultiTexCoord4sARB, "glMultiTexCoord4sARB" }, - { &__blue_glCore_glDrawElementsInstancedBaseVertexBaseInstance, "glDrawElementsInstancedBaseVertexBaseInstance" }, - { &__blue_glCore_glVDPAUSurfaceAccessNV, "glVDPAUSurfaceAccessNV" }, - { &__blue_glCore_glMultiTexCoord2iARB, "glMultiTexCoord2iARB" }, - { &__blue_glCore_glPathCommandsNV, "glPathCommandsNV" }, - { &__blue_glCore_glSetMultisamplefvAMD, "glSetMultisamplefvAMD" }, - { &__blue_glCore_glVertexStream3ivATI, "glVertexStream3ivATI" }, - { &__blue_glCore_glVDPAUUnregisterSurfaceNV, "glVDPAUUnregisterSurfaceNV" }, - { &__blue_glCore_glTextureRenderbufferEXT, "glTextureRenderbufferEXT" }, - { &__blue_glCore_glProgramLocalParameter4dARB, "glProgramLocalParameter4dARB" }, - { &__blue_glCore_glBindVertexShaderEXT, "glBindVertexShaderEXT" }, - { &__blue_glCore_glEnableVariantClientStateEXT, "glEnableVariantClientStateEXT" }, - { &__blue_glCore_glGetPointerIndexedvEXT, "glGetPointerIndexedvEXT" }, - { &__blue_glCore_glMultiTexEnvfEXT, "glMultiTexEnvfEXT" }, - { &__blue_glCore_glFrustumxOES, "glFrustumxOES" }, - { &__blue_glCore_glAreProgramsResidentNV, "glAreProgramsResidentNV" }, - { &__blue_glCore_glFramebufferSampleLocationsfvNV, "glFramebufferSampleLocationsfvNV" }, - { &__blue_glCore_glVertexAttrib1sNV, "glVertexAttrib1sNV" }, - { &__blue_glCore_glGetActiveUniformBlockName, "glGetActiveUniformBlockName" }, - { &__blue_glCore_glVertex2xOES, "glVertex2xOES" }, + { &__blue_glCore_glGetMinmaxParameterivEXT, "glGetMinmaxParameterivEXT" }, + { &__blue_glCore_glHistogramEXT, "glHistogramEXT" }, + { &__blue_glCore_glMinmaxEXT, "glMinmaxEXT" }, + { &__blue_glCore_glResetHistogramEXT, "glResetHistogramEXT" }, { &__blue_glCore_glResetMinmaxEXT, "glResetMinmaxEXT" }, - { &__blue_glCore_glMatrixOrthoEXT, "glMatrixOrthoEXT" }, - { &__blue_glCore_glUniform4ui64vNV, "glUniform4ui64vNV" }, - { &__blue_glCore_glProgramUniformMatrix4x3fvEXT, "glProgramUniformMatrix4x3fvEXT" }, - { &__blue_glCore_glVertexAttribs1svNV, "glVertexAttribs1svNV" }, - { &__blue_glCore_glDebugMessageCallbackAMD, "glDebugMessageCallbackAMD" }, - { &__blue_glCore_glProgramUniform1uiEXT, "glProgramUniform1uiEXT" }, - { &__blue_glCore_glTexBufferEXT, "glTexBufferEXT" }, - { &__blue_glCore_glUniform4f, "glUniform4f" }, - { &__blue_glCore_glUpdateObjectBufferATI, "glUpdateObjectBufferATI" }, - { &__blue_glCore_glProgramUniform1iEXT, "glProgramUniform1iEXT" }, - { &__blue_glCore_glGetMultiTexEnvfvEXT, "glGetMultiTexEnvfvEXT" }, - { &__blue_glCore_glVertexAttribL2d, "glVertexAttribL2d" }, - { &__blue_glCore_glConvolutionParameterxOES, "glConvolutionParameterxOES" }, - { &__blue_glCore_glGetVertexAttribArrayObjectivATI, "glGetVertexAttribArrayObjectivATI" }, - { &__blue_glCore_glGetListParameterfvSGIX, "glGetListParameterfvSGIX" }, - { &__blue_glCore_glInstrumentsBufferSGIX, "glInstrumentsBufferSGIX" }, - { &__blue_glCore_glDeleteNamesAMD, "glDeleteNamesAMD" }, - { &__blue_glCore_glGetSubroutineIndex, "glGetSubroutineIndex" }, - { &__blue_glCore_glVideoCaptureStreamParameterivNV, "glVideoCaptureStreamParameterivNV" }, - { &__blue_glCore_glMultiTexCoord4i, "glMultiTexCoord4i" }, - { &__blue_glCore_glGetFramebufferParameteriv, "glGetFramebufferParameteriv" }, - { &__blue_glCore_glVertexAttrib2hvNV, "glVertexAttrib2hvNV" }, - { &__blue_glCore_glMakeBufferNonResidentNV, "glMakeBufferNonResidentNV" }, - { &__blue_glCore_glPixelDataRangeNV, "glPixelDataRangeNV" }, - { &__blue_glCore_glNamedBufferDataEXT, "glNamedBufferDataEXT" }, - { &__blue_glCore_glIsImageHandleResidentARB, "glIsImageHandleResidentARB" }, - { &__blue_glCore_glFrustumfOES, "glFrustumfOES" }, - { &__blue_glCore_glGetArrayObjectivATI, "glGetArrayObjectivATI" }, - { &__blue_glCore_glMultiTexParameterIuivEXT, "glMultiTexParameterIuivEXT" }, - { &__blue_glCore_glGetMapParameterfvNV, "glGetMapParameterfvNV" }, - { &__blue_glCore_glMultTransposeMatrixxOES, "glMultTransposeMatrixxOES" }, - { &__blue_glCore_glGetPerfMonitorCounterDataAMD, "glGetPerfMonitorCounterDataAMD" }, - { &__blue_glCore_glClearDepthxOES, "glClearDepthxOES" }, - { &__blue_glCore_glColor3xvOES, "glColor3xvOES" }, - { &__blue_glCore_glVertexAttribI4ivEXT, "glVertexAttribI4ivEXT" }, - { &__blue_glCore_glMultiTexCoordP4uiv, "glMultiTexCoordP4uiv" }, - { &__blue_glCore_glVertexAttribI4usv, "glVertexAttribI4usv" }, - { &__blue_glCore_glGetnTexImage, "glGetnTexImage" }, - { &__blue_glCore_glReadBuffer, "glReadBuffer" }, - { &__blue_glCore_glUniform3iARB, "glUniform3iARB" }, - { &__blue_glCore_glMultiTexBufferEXT, "glMultiTexBufferEXT" }, - { &__blue_glCore_glNormalStream3fvATI, "glNormalStream3fvATI" }, - { &__blue_glCore_glDeleteVertexShaderEXT, "glDeleteVertexShaderEXT" }, - { &__blue_glCore_glVertexAttrib3hvNV, "glVertexAttrib3hvNV" }, - { &__blue_glCore_glDrawMeshArraysSUN, "glDrawMeshArraysSUN" }, - { &__blue_glCore_glVertexAttribL3dvEXT, "glVertexAttribL3dvEXT" }, - { &__blue_glCore_glReplacementCodeuiColor3fVertex3fSUN, "glReplacementCodeuiColor3fVertex3fSUN" }, - { &__blue_glCore_glProgramUniform1fv, "glProgramUniform1fv" }, - { &__blue_glCore_glNormal3xvOES, "glNormal3xvOES" }, - { &__blue_glCore_glGetProgramStageiv, "glGetProgramStageiv" }, - { &__blue_glCore_glUniform2ui64NV, "glUniform2ui64NV" }, - { &__blue_glCore_glProgramEnvParameter4fARB, "glProgramEnvParameter4fARB" }, + { &__blue_glCore_glIndexFuncEXT, "glIndexFuncEXT" }, + { &__blue_glCore_glIndexMaterialEXT, "glIndexMaterialEXT" }, + { &__blue_glCore_glApplyTextureEXT, "glApplyTextureEXT" }, + { &__blue_glCore_glTextureLightEXT, "glTextureLightEXT" }, + { &__blue_glCore_glTextureMaterialEXT, "glTextureMaterialEXT" }, + { &__blue_glCore_glMultiDrawArraysEXT, "glMultiDrawArraysEXT" }, + { &__blue_glCore_glMultiDrawElementsEXT, "glMultiDrawElementsEXT" }, + { &__blue_glCore_glSampleMaskEXT, "glSampleMaskEXT" }, + { &__blue_glCore_glSamplePatternEXT, "glSamplePatternEXT" }, + { &__blue_glCore_glColorTableEXT, "glColorTableEXT" }, + { &__blue_glCore_glGetColorTableEXT, "glGetColorTableEXT" }, + { &__blue_glCore_glGetColorTableParameterivEXT, "glGetColorTableParameterivEXT" }, + { &__blue_glCore_glGetColorTableParameterfvEXT, "glGetColorTableParameterfvEXT" }, + { &__blue_glCore_glPixelTransformParameteriEXT, "glPixelTransformParameteriEXT" }, + { &__blue_glCore_glPixelTransformParameterfEXT, "glPixelTransformParameterfEXT" }, { &__blue_glCore_glPixelTransformParameterivEXT, "glPixelTransformParameterivEXT" }, - { &__blue_glCore_glWindowPos4dvMESA, "glWindowPos4dvMESA" }, - { &__blue_glCore_glMultiDrawElementsIndirectBindlessCountNV, "glMultiDrawElementsIndirectBindlessCountNV" }, - { &__blue_glCore_glUniform3i64vARB, "glUniform3i64vARB" }, - { &__blue_glCore_glTextureStorage3DMultisample, "glTextureStorage3DMultisample" }, - { &__blue_glCore_glGetNamedBufferParameterui64vNV, "glGetNamedBufferParameterui64vNV" }, - { &__blue_glCore_glEndTransformFeedback, "glEndTransformFeedback" }, - { &__blue_glCore_glVertexAttribI3ivEXT, "glVertexAttribI3ivEXT" }, - { &__blue_glCore_glUniform2f, "glUniform2f" }, - { &__blue_glCore_glMultiTexCoord1dARB, "glMultiTexCoord1dARB" }, - { &__blue_glCore_glGetColorTableParameterfv, "glGetColorTableParameterfv" }, - { &__blue_glCore_glWindowPos3d, "glWindowPos3d" }, - { &__blue_glCore_glVertexAttribL3ui64vNV, "glVertexAttribL3ui64vNV" }, - { &__blue_glCore_glReplacementCodeuiSUN, "glReplacementCodeuiSUN" }, - { &__blue_glCore_glColor4ubVertex3fSUN, "glColor4ubVertex3fSUN" }, - { &__blue_glCore_glDrawRangeElementsBaseVertex, "glDrawRangeElementsBaseVertex" }, - { &__blue_glCore_glGetMultiTexParameterivEXT, "glGetMultiTexParameterivEXT" }, - { &__blue_glCore_glMultiTexCoord3hvNV, "glMultiTexCoord3hvNV" }, - { &__blue_glCore_glGetQueryBufferObjectuiv, "glGetQueryBufferObjectuiv" }, - { &__blue_glCore_glGetPerfMonitorGroupsAMD, "glGetPerfMonitorGroupsAMD" }, - { &__blue_glCore_glUnlockArraysEXT, "glUnlockArraysEXT" }, - { &__blue_glCore_glPauseTransformFeedback, "glPauseTransformFeedback" }, - { &__blue_glCore_glGetProgramEnvParameterIivNV, "glGetProgramEnvParameterIivNV" }, - { &__blue_glCore_glPathTexGenNV, "glPathTexGenNV" }, - { &__blue_glCore_glVertex3xOES, "glVertex3xOES" }, + { &__blue_glCore_glPixelTransformParameterfvEXT, "glPixelTransformParameterfvEXT" }, + { &__blue_glCore_glGetPixelTransformParameterivEXT, "glGetPixelTransformParameterivEXT" }, + { &__blue_glCore_glGetPixelTransformParameterfvEXT, "glGetPixelTransformParameterfvEXT" }, + { &__blue_glCore_glPointParameterfEXT, "glPointParameterfEXT" }, + { &__blue_glCore_glPointParameterfvEXT, "glPointParameterfvEXT" }, + { &__blue_glCore_glPolygonOffsetEXT, "glPolygonOffsetEXT" }, + { &__blue_glCore_glPolygonOffsetClampEXT, "glPolygonOffsetClampEXT" }, + { &__blue_glCore_glProvokingVertexEXT, "glProvokingVertexEXT" }, + { &__blue_glCore_glRasterSamplesEXT, "glRasterSamplesEXT" }, + { &__blue_glCore_glSecondaryColor3bEXT, "glSecondaryColor3bEXT" }, + { &__blue_glCore_glSecondaryColor3bvEXT, "glSecondaryColor3bvEXT" }, + { &__blue_glCore_glSecondaryColor3dEXT, "glSecondaryColor3dEXT" }, + { &__blue_glCore_glSecondaryColor3dvEXT, "glSecondaryColor3dvEXT" }, + { &__blue_glCore_glSecondaryColor3fEXT, "glSecondaryColor3fEXT" }, + { &__blue_glCore_glSecondaryColor3fvEXT, "glSecondaryColor3fvEXT" }, + { &__blue_glCore_glSecondaryColor3iEXT, "glSecondaryColor3iEXT" }, + { &__blue_glCore_glSecondaryColor3ivEXT, "glSecondaryColor3ivEXT" }, + { &__blue_glCore_glSecondaryColor3sEXT, "glSecondaryColor3sEXT" }, + { &__blue_glCore_glSecondaryColor3svEXT, "glSecondaryColor3svEXT" }, + { &__blue_glCore_glSecondaryColor3ubEXT, "glSecondaryColor3ubEXT" }, + { &__blue_glCore_glSecondaryColor3ubvEXT, "glSecondaryColor3ubvEXT" }, + { &__blue_glCore_glSecondaryColor3uiEXT, "glSecondaryColor3uiEXT" }, + { &__blue_glCore_glSecondaryColor3uivEXT, "glSecondaryColor3uivEXT" }, + { &__blue_glCore_glSecondaryColor3usEXT, "glSecondaryColor3usEXT" }, + { &__blue_glCore_glSecondaryColor3usvEXT, "glSecondaryColor3usvEXT" }, + { &__blue_glCore_glSecondaryColorPointerEXT, "glSecondaryColorPointerEXT" }, + { &__blue_glCore_glUseShaderProgramEXT, "glUseShaderProgramEXT" }, + { &__blue_glCore_glActiveProgramEXT, "glActiveProgramEXT" }, + { &__blue_glCore_glCreateShaderProgramEXT, "glCreateShaderProgramEXT" }, + { &__blue_glCore_glBindImageTextureEXT, "glBindImageTextureEXT" }, + { &__blue_glCore_glMemoryBarrierEXT, "glMemoryBarrierEXT" }, + { &__blue_glCore_glStencilClearTagEXT, "glStencilClearTagEXT" }, + { &__blue_glCore_glActiveStencilFaceEXT, "glActiveStencilFaceEXT" }, + { &__blue_glCore_glTexSubImage1DEXT, "glTexSubImage1DEXT" }, + { &__blue_glCore_glTexSubImage2DEXT, "glTexSubImage2DEXT" }, + { &__blue_glCore_glTexImage3DEXT, "glTexImage3DEXT" }, + { &__blue_glCore_glTexSubImage3DEXT, "glTexSubImage3DEXT" }, + { &__blue_glCore_glFramebufferTextureLayerEXT, "glFramebufferTextureLayerEXT" }, + { &__blue_glCore_glTexBufferEXT, "glTexBufferEXT" }, + { &__blue_glCore_glTexParameterIivEXT, "glTexParameterIivEXT" }, + { &__blue_glCore_glTexParameterIuivEXT, "glTexParameterIuivEXT" }, + { &__blue_glCore_glGetTexParameterIivEXT, "glGetTexParameterIivEXT" }, + { &__blue_glCore_glGetTexParameterIuivEXT, "glGetTexParameterIuivEXT" }, + { &__blue_glCore_glClearColorIiEXT, "glClearColorIiEXT" }, + { &__blue_glCore_glClearColorIuiEXT, "glClearColorIuiEXT" }, + { &__blue_glCore_glAreTexturesResidentEXT, "glAreTexturesResidentEXT" }, + { &__blue_glCore_glBindTextureEXT, "glBindTextureEXT" }, + { &__blue_glCore_glDeleteTexturesEXT, "glDeleteTexturesEXT" }, + { &__blue_glCore_glGenTexturesEXT, "glGenTexturesEXT" }, + { &__blue_glCore_glIsTextureEXT, "glIsTextureEXT" }, + { &__blue_glCore_glPrioritizeTexturesEXT, "glPrioritizeTexturesEXT" }, + { &__blue_glCore_glTextureNormalEXT, "glTextureNormalEXT" }, + { &__blue_glCore_glGetQueryObjecti64vEXT, "glGetQueryObjecti64vEXT" }, + { &__blue_glCore_glGetQueryObjectui64vEXT, "glGetQueryObjectui64vEXT" }, + { &__blue_glCore_glBeginTransformFeedbackEXT, "glBeginTransformFeedbackEXT" }, + { &__blue_glCore_glEndTransformFeedbackEXT, "glEndTransformFeedbackEXT" }, + { &__blue_glCore_glBindBufferRangeEXT, "glBindBufferRangeEXT" }, + { &__blue_glCore_glBindBufferOffsetEXT, "glBindBufferOffsetEXT" }, + { &__blue_glCore_glBindBufferBaseEXT, "glBindBufferBaseEXT" }, + { &__blue_glCore_glTransformFeedbackVaryingsEXT, "glTransformFeedbackVaryingsEXT" }, + { &__blue_glCore_glGetTransformFeedbackVaryingEXT, "glGetTransformFeedbackVaryingEXT" }, + { &__blue_glCore_glArrayElementEXT, "glArrayElementEXT" }, + { &__blue_glCore_glColorPointerEXT, "glColorPointerEXT" }, + { &__blue_glCore_glDrawArraysEXT, "glDrawArraysEXT" }, { &__blue_glCore_glEdgeFlagPointerEXT, "glEdgeFlagPointerEXT" }, - { &__blue_glCore_glVertexAttribBinding, "glVertexAttribBinding" }, - { &__blue_glCore_glVertexAttrib3f, "glVertexAttrib3f" }, - { &__blue_glCore_glVertexAttrib4NubARB, "glVertexAttrib4NubARB" }, - { &__blue_glCore_glWindowPos2svMESA, "glWindowPos2svMESA" }, - { &__blue_glCore_glGetUniformSubroutineuiv, "glGetUniformSubroutineuiv" }, - { &__blue_glCore_glMultiTexCoord2ivARB, "glMultiTexCoord2ivARB" }, - { &__blue_glCore_glFragmentMaterialivSGIX, "glFragmentMaterialivSGIX" }, - { &__blue_glCore_glSamplerParameteriv, "glSamplerParameteriv" }, - { &__blue_glCore_glVertexArrayColorOffsetEXT, "glVertexArrayColorOffsetEXT" }, - { &__blue_glCore_glVertexAttrib3sNV, "glVertexAttrib3sNV" }, - { &__blue_glCore_glDrawElementsInstanced, "glDrawElementsInstanced" }, - { &__blue_glCore_glCreateSyncFromCLeventARB, "glCreateSyncFromCLeventARB" }, - { &__blue_glCore_glInsertEventMarkerEXT, "glInsertEventMarkerEXT" }, - { &__blue_glCore_glGetTextureParameterfv, "glGetTextureParameterfv" }, - { &__blue_glCore_glCopyMultiTexImage2DEXT, "glCopyMultiTexImage2DEXT" }, - { &__blue_glCore_glVertexWeightfEXT, "glVertexWeightfEXT" }, - { &__blue_glCore_glUniform4i64vARB, "glUniform4i64vARB" }, - { &__blue_glCore_glGetPathParameterfvNV, "glGetPathParameterfvNV" }, - { &__blue_glCore_glBlitNamedFramebuffer, "glBlitNamedFramebuffer" }, + { &__blue_glCore_glGetPointervEXT, "glGetPointervEXT" }, + { &__blue_glCore_glIndexPointerEXT, "glIndexPointerEXT" }, + { &__blue_glCore_glNormalPointerEXT, "glNormalPointerEXT" }, { &__blue_glCore_glTexCoordPointerEXT, "glTexCoordPointerEXT" }, - { &__blue_glCore_glGetPathMetricsNV, "glGetPathMetricsNV" }, + { &__blue_glCore_glVertexPointerEXT, "glVertexPointerEXT" }, + { &__blue_glCore_glVertexAttribL1dEXT, "glVertexAttribL1dEXT" }, + { &__blue_glCore_glVertexAttribL2dEXT, "glVertexAttribL2dEXT" }, + { &__blue_glCore_glVertexAttribL3dEXT, "glVertexAttribL3dEXT" }, + { &__blue_glCore_glVertexAttribL4dEXT, "glVertexAttribL4dEXT" }, + { &__blue_glCore_glVertexAttribL1dvEXT, "glVertexAttribL1dvEXT" }, { &__blue_glCore_glVertexAttribL2dvEXT, "glVertexAttribL2dvEXT" }, + { &__blue_glCore_glVertexAttribL3dvEXT, "glVertexAttribL3dvEXT" }, + { &__blue_glCore_glVertexAttribL4dvEXT, "glVertexAttribL4dvEXT" }, + { &__blue_glCore_glVertexAttribLPointerEXT, "glVertexAttribLPointerEXT" }, + { &__blue_glCore_glGetVertexAttribLdvEXT, "glGetVertexAttribLdvEXT" }, + { &__blue_glCore_glBeginVertexShaderEXT, "glBeginVertexShaderEXT" }, + { &__blue_glCore_glEndVertexShaderEXT, "glEndVertexShaderEXT" }, + { &__blue_glCore_glBindVertexShaderEXT, "glBindVertexShaderEXT" }, + { &__blue_glCore_glGenVertexShadersEXT, "glGenVertexShadersEXT" }, + { &__blue_glCore_glDeleteVertexShaderEXT, "glDeleteVertexShaderEXT" }, + { &__blue_glCore_glShaderOp1EXT, "glShaderOp1EXT" }, + { &__blue_glCore_glShaderOp2EXT, "glShaderOp2EXT" }, + { &__blue_glCore_glShaderOp3EXT, "glShaderOp3EXT" }, + { &__blue_glCore_glSwizzleEXT, "glSwizzleEXT" }, + { &__blue_glCore_glWriteMaskEXT, "glWriteMaskEXT" }, + { &__blue_glCore_glInsertComponentEXT, "glInsertComponentEXT" }, + { &__blue_glCore_glExtractComponentEXT, "glExtractComponentEXT" }, + { &__blue_glCore_glGenSymbolsEXT, "glGenSymbolsEXT" }, + { &__blue_glCore_glSetInvariantEXT, "glSetInvariantEXT" }, + { &__blue_glCore_glSetLocalConstantEXT, "glSetLocalConstantEXT" }, + { &__blue_glCore_glVariantbvEXT, "glVariantbvEXT" }, + { &__blue_glCore_glVariantsvEXT, "glVariantsvEXT" }, + { &__blue_glCore_glVariantivEXT, "glVariantivEXT" }, + { &__blue_glCore_glVariantfvEXT, "glVariantfvEXT" }, + { &__blue_glCore_glVariantdvEXT, "glVariantdvEXT" }, + { &__blue_glCore_glVariantubvEXT, "glVariantubvEXT" }, + { &__blue_glCore_glVariantusvEXT, "glVariantusvEXT" }, { &__blue_glCore_glVariantuivEXT, "glVariantuivEXT" }, - { &__blue_glCore_glGetVertexAttribdvNV, "glGetVertexAttribdvNV" }, - { &__blue_glCore_glFenceSync, "glFenceSync" }, - { &__blue_glCore_glGetTextureParameterIuiv, "glGetTextureParameterIuiv" }, - { &__blue_glCore_glMultiTexCoord2sARB, "glMultiTexCoord2sARB" }, - { &__blue_glCore_glUniform2i64NV, "glUniform2i64NV" }, - { &__blue_glCore_glDeformationMap3dSGIX, "glDeformationMap3dSGIX" }, - { &__blue_glCore_glDrawRangeElementArrayAPPLE, "glDrawRangeElementArrayAPPLE" }, - { &__blue_glCore_glDepthFunc, "glDepthFunc" }, - { &__blue_glCore_glProgramUniform3dvEXT, "glProgramUniform3dvEXT" }, - { &__blue_glCore_glTexCoord3hvNV, "glTexCoord3hvNV" }, - { &__blue_glCore_glGetPathLengthNV, "glGetPathLengthNV" }, - { &__blue_glCore_glUnmapObjectBufferATI, "glUnmapObjectBufferATI" }, - { &__blue_glCore_glValidateProgramPipeline, "glValidateProgramPipeline" }, - { &__blue_glCore_glIsProgram, "glIsProgram" }, - { &__blue_glCore_glVertexAttrib4hvNV, "glVertexAttrib4hvNV" }, - { &__blue_glCore_glLoadTransposeMatrixdARB, "glLoadTransposeMatrixdARB" }, - { &__blue_glCore_glMapVertexAttrib2dAPPLE, "glMapVertexAttrib2dAPPLE" }, - { &__blue_glCore_glProgramBinary, "glProgramBinary" }, - { &__blue_glCore_glUniform3i, "glUniform3i" }, - { &__blue_glCore_glProgramUniform2dEXT, "glProgramUniform2dEXT" }, - { &__blue_glCore_glDepthRangeIndexed, "glDepthRangeIndexed" }, - { &__blue_glCore_glEvalCoord1xOES, "glEvalCoord1xOES" }, - { &__blue_glCore_glVertexArrayRangeAPPLE, "glVertexArrayRangeAPPLE" }, - { &__blue_glCore_glVertexStream1svATI, "glVertexStream1svATI" }, - { &__blue_glCore_glNormalStream3iATI, "glNormalStream3iATI" }, - { &__blue_glCore_glProgramUniform4f, "glProgramUniform4f" }, - { &__blue_glCore_glScalexOES, "glScalexOES" }, - { &__blue_glCore_glUniform1fv, "glUniform1fv" }, - { &__blue_glCore_glGetActiveUniform, "glGetActiveUniform" }, - { &__blue_glCore_glProgramUniformMatrix4x3fv, "glProgramUniformMatrix4x3fv" }, - { &__blue_glCore_glCreateVertexArrays, "glCreateVertexArrays" }, - { &__blue_glCore_glWindowPos3dv, "glWindowPos3dv" }, - { &__blue_glCore_glUniform1fARB, "glUniform1fARB" }, - { &__blue_glCore_glFragmentMaterialiSGIX, "glFragmentMaterialiSGIX" }, - { &__blue_glCore_glGetVertexAttribArrayObjectfvATI, "glGetVertexAttribArrayObjectfvATI" }, - { &__blue_glCore_glClearAccumxOES, "glClearAccumxOES" }, - { &__blue_glCore_glBindFragDataLocationEXT, "glBindFragDataLocationEXT" }, - { &__blue_glCore_glMultiTexCoord4dARB, "glMultiTexCoord4dARB" }, - { &__blue_glCore_glConvolutionParameterfv, "glConvolutionParameterfv" }, - { &__blue_glCore_glFragmentColorMaterialSGIX, "glFragmentColorMaterialSGIX" }, - { &__blue_glCore_glUniformMatrix3dv, "glUniformMatrix3dv" }, - { &__blue_glCore_glGetnPixelMapusv, "glGetnPixelMapusv" }, - { &__blue_glCore_glFramebufferTextureLayer, "glFramebufferTextureLayer" }, - { &__blue_glCore_glStencilThenCoverStrokePathInstancedNV, "glStencilThenCoverStrokePathInstancedNV" }, - { &__blue_glCore_glVDPAURegisterOutputSurfaceNV, "glVDPAURegisterOutputSurfaceNV" }, - { &__blue_glCore_glMultiTexCoord4dvARB, "glMultiTexCoord4dvARB" }, - { &__blue_glCore_glCopyTextureSubImage3D, "glCopyTextureSubImage3D" }, + { &__blue_glCore_glVariantPointerEXT, "glVariantPointerEXT" }, + { &__blue_glCore_glEnableVariantClientStateEXT, "glEnableVariantClientStateEXT" }, + { &__blue_glCore_glDisableVariantClientStateEXT, "glDisableVariantClientStateEXT" }, + { &__blue_glCore_glBindLightParameterEXT, "glBindLightParameterEXT" }, + { &__blue_glCore_glBindMaterialParameterEXT, "glBindMaterialParameterEXT" }, + { &__blue_glCore_glBindTexGenParameterEXT, "glBindTexGenParameterEXT" }, + { &__blue_glCore_glBindTextureUnitParameterEXT, "glBindTextureUnitParameterEXT" }, + { &__blue_glCore_glBindParameterEXT, "glBindParameterEXT" }, + { &__blue_glCore_glIsVariantEnabledEXT, "glIsVariantEnabledEXT" }, + { &__blue_glCore_glGetVariantBooleanvEXT, "glGetVariantBooleanvEXT" }, { &__blue_glCore_glGetVariantIntegervEXT, "glGetVariantIntegervEXT" }, - { &__blue_glCore_glGetTexEnvxvOES, "glGetTexEnvxvOES" }, - { &__blue_glCore_glGetFloati_vEXT, "glGetFloati_vEXT" }, - { &__blue_glCore_glAsyncMarkerSGIX, "glAsyncMarkerSGIX" }, - { &__blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN, "glTexCoord4fColor4fNormal3fVertex4fvSUN" }, + { &__blue_glCore_glGetVariantFloatvEXT, "glGetVariantFloatvEXT" }, + { &__blue_glCore_glGetVariantPointervEXT, "glGetVariantPointervEXT" }, + { &__blue_glCore_glGetInvariantBooleanvEXT, "glGetInvariantBooleanvEXT" }, + { &__blue_glCore_glGetInvariantIntegervEXT, "glGetInvariantIntegervEXT" }, + { &__blue_glCore_glGetInvariantFloatvEXT, "glGetInvariantFloatvEXT" }, + { &__blue_glCore_glGetLocalConstantBooleanvEXT, "glGetLocalConstantBooleanvEXT" }, + { &__blue_glCore_glGetLocalConstantIntegervEXT, "glGetLocalConstantIntegervEXT" }, + { &__blue_glCore_glGetLocalConstantFloatvEXT, "glGetLocalConstantFloatvEXT" }, + { &__blue_glCore_glVertexWeightfEXT, "glVertexWeightfEXT" }, + { &__blue_glCore_glVertexWeightfvEXT, "glVertexWeightfvEXT" }, + { &__blue_glCore_glVertexWeightPointerEXT, "glVertexWeightPointerEXT" }, + { &__blue_glCore_glImportSyncEXT, "glImportSyncEXT" }, + { &__blue_glCore_glFrameTerminatorGREMEDY, "glFrameTerminatorGREMEDY" }, + { &__blue_glCore_glStringMarkerGREMEDY, "glStringMarkerGREMEDY" }, + { &__blue_glCore_glImageTransformParameteriHP, "glImageTransformParameteriHP" }, + { &__blue_glCore_glImageTransformParameterfHP, "glImageTransformParameterfHP" }, + { &__blue_glCore_glImageTransformParameterivHP, "glImageTransformParameterivHP" }, + { &__blue_glCore_glImageTransformParameterfvHP, "glImageTransformParameterfvHP" }, + { &__blue_glCore_glGetImageTransformParameterivHP, "glGetImageTransformParameterivHP" }, + { &__blue_glCore_glGetImageTransformParameterfvHP, "glGetImageTransformParameterfvHP" }, + { &__blue_glCore_glMultiModeDrawArraysIBM, "glMultiModeDrawArraysIBM" }, + { &__blue_glCore_glMultiModeDrawElementsIBM, "glMultiModeDrawElementsIBM" }, + { &__blue_glCore_glFlushStaticDataIBM, "glFlushStaticDataIBM" }, + { &__blue_glCore_glColorPointerListIBM, "glColorPointerListIBM" }, + { &__blue_glCore_glSecondaryColorPointerListIBM, "glSecondaryColorPointerListIBM" }, + { &__blue_glCore_glEdgeFlagPointerListIBM, "glEdgeFlagPointerListIBM" }, + { &__blue_glCore_glFogCoordPointerListIBM, "glFogCoordPointerListIBM" }, + { &__blue_glCore_glIndexPointerListIBM, "glIndexPointerListIBM" }, + { &__blue_glCore_glNormalPointerListIBM, "glNormalPointerListIBM" }, + { &__blue_glCore_glTexCoordPointerListIBM, "glTexCoordPointerListIBM" }, + { &__blue_glCore_glVertexPointerListIBM, "glVertexPointerListIBM" }, + { &__blue_glCore_glBlendFuncSeparateINGR, "glBlendFuncSeparateINGR" }, + { &__blue_glCore_glApplyFramebufferAttachmentCMAAINTEL, "glApplyFramebufferAttachmentCMAAINTEL" }, + { &__blue_glCore_glSyncTextureINTEL, "glSyncTextureINTEL" }, + { &__blue_glCore_glUnmapTexture2DINTEL, "glUnmapTexture2DINTEL" }, + { &__blue_glCore_glMapTexture2DINTEL, "glMapTexture2DINTEL" }, + { &__blue_glCore_glVertexPointervINTEL, "glVertexPointervINTEL" }, + { &__blue_glCore_glNormalPointervINTEL, "glNormalPointervINTEL" }, + { &__blue_glCore_glColorPointervINTEL, "glColorPointervINTEL" }, + { &__blue_glCore_glTexCoordPointervINTEL, "glTexCoordPointervINTEL" }, + { &__blue_glCore_glBeginPerfQueryINTEL, "glBeginPerfQueryINTEL" }, + { &__blue_glCore_glCreatePerfQueryINTEL, "glCreatePerfQueryINTEL" }, + { &__blue_glCore_glDeletePerfQueryINTEL, "glDeletePerfQueryINTEL" }, + { &__blue_glCore_glEndPerfQueryINTEL, "glEndPerfQueryINTEL" }, + { &__blue_glCore_glGetFirstPerfQueryIdINTEL, "glGetFirstPerfQueryIdINTEL" }, + { &__blue_glCore_glGetNextPerfQueryIdINTEL, "glGetNextPerfQueryIdINTEL" }, + { &__blue_glCore_glGetPerfCounterInfoINTEL, "glGetPerfCounterInfoINTEL" }, + { &__blue_glCore_glGetPerfQueryDataINTEL, "glGetPerfQueryDataINTEL" }, + { &__blue_glCore_glGetPerfQueryIdByNameINTEL, "glGetPerfQueryIdByNameINTEL" }, + { &__blue_glCore_glGetPerfQueryInfoINTEL, "glGetPerfQueryInfoINTEL" }, + { &__blue_glCore_glResizeBuffersMESA, "glResizeBuffersMESA" }, + { &__blue_glCore_glWindowPos2dMESA, "glWindowPos2dMESA" }, + { &__blue_glCore_glWindowPos2dvMESA, "glWindowPos2dvMESA" }, + { &__blue_glCore_glWindowPos2fMESA, "glWindowPos2fMESA" }, + { &__blue_glCore_glWindowPos2fvMESA, "glWindowPos2fvMESA" }, + { &__blue_glCore_glWindowPos2iMESA, "glWindowPos2iMESA" }, + { &__blue_glCore_glWindowPos2ivMESA, "glWindowPos2ivMESA" }, + { &__blue_glCore_glWindowPos2sMESA, "glWindowPos2sMESA" }, + { &__blue_glCore_glWindowPos2svMESA, "glWindowPos2svMESA" }, + { &__blue_glCore_glWindowPos3dMESA, "glWindowPos3dMESA" }, + { &__blue_glCore_glWindowPos3dvMESA, "glWindowPos3dvMESA" }, + { &__blue_glCore_glWindowPos3fMESA, "glWindowPos3fMESA" }, + { &__blue_glCore_glWindowPos3fvMESA, "glWindowPos3fvMESA" }, + { &__blue_glCore_glWindowPos3iMESA, "glWindowPos3iMESA" }, + { &__blue_glCore_glWindowPos3ivMESA, "glWindowPos3ivMESA" }, + { &__blue_glCore_glWindowPos3sMESA, "glWindowPos3sMESA" }, + { &__blue_glCore_glWindowPos3svMESA, "glWindowPos3svMESA" }, + { &__blue_glCore_glWindowPos4dMESA, "glWindowPos4dMESA" }, + { &__blue_glCore_glWindowPos4dvMESA, "glWindowPos4dvMESA" }, + { &__blue_glCore_glWindowPos4fMESA, "glWindowPos4fMESA" }, + { &__blue_glCore_glWindowPos4fvMESA, "glWindowPos4fvMESA" }, + { &__blue_glCore_glWindowPos4iMESA, "glWindowPos4iMESA" }, + { &__blue_glCore_glWindowPos4ivMESA, "glWindowPos4ivMESA" }, + { &__blue_glCore_glWindowPos4sMESA, "glWindowPos4sMESA" }, + { &__blue_glCore_glWindowPos4svMESA, "glWindowPos4svMESA" }, + { &__blue_glCore_glBeginConditionalRenderNVX, "glBeginConditionalRenderNVX" }, + { &__blue_glCore_glEndConditionalRenderNVX, "glEndConditionalRenderNVX" }, + { &__blue_glCore_glMultiDrawArraysIndirectBindlessNV, "glMultiDrawArraysIndirectBindlessNV" }, + { &__blue_glCore_glMultiDrawElementsIndirectBindlessNV, "glMultiDrawElementsIndirectBindlessNV" }, + { &__blue_glCore_glMultiDrawArraysIndirectBindlessCountNV, "glMultiDrawArraysIndirectBindlessCountNV" }, + { &__blue_glCore_glMultiDrawElementsIndirectBindlessCountNV, "glMultiDrawElementsIndirectBindlessCountNV" }, + { &__blue_glCore_glGetTextureHandleNV, "glGetTextureHandleNV" }, + { &__blue_glCore_glGetTextureSamplerHandleNV, "glGetTextureSamplerHandleNV" }, + { &__blue_glCore_glMakeTextureHandleResidentNV, "glMakeTextureHandleResidentNV" }, + { &__blue_glCore_glMakeTextureHandleNonResidentNV, "glMakeTextureHandleNonResidentNV" }, + { &__blue_glCore_glGetImageHandleNV, "glGetImageHandleNV" }, + { &__blue_glCore_glMakeImageHandleResidentNV, "glMakeImageHandleResidentNV" }, + { &__blue_glCore_glMakeImageHandleNonResidentNV, "glMakeImageHandleNonResidentNV" }, + { &__blue_glCore_glUniformHandleui64NV, "glUniformHandleui64NV" }, + { &__blue_glCore_glUniformHandleui64vNV, "glUniformHandleui64vNV" }, + { &__blue_glCore_glProgramUniformHandleui64NV, "glProgramUniformHandleui64NV" }, + { &__blue_glCore_glProgramUniformHandleui64vNV, "glProgramUniformHandleui64vNV" }, + { &__blue_glCore_glIsTextureHandleResidentNV, "glIsTextureHandleResidentNV" }, + { &__blue_glCore_glIsImageHandleResidentNV, "glIsImageHandleResidentNV" }, + { &__blue_glCore_glBlendParameteriNV, "glBlendParameteriNV" }, + { &__blue_glCore_glBlendBarrierNV, "glBlendBarrierNV" }, + { &__blue_glCore_glCreateStatesNV, "glCreateStatesNV" }, + { &__blue_glCore_glDeleteStatesNV, "glDeleteStatesNV" }, + { &__blue_glCore_glIsStateNV, "glIsStateNV" }, + { &__blue_glCore_glStateCaptureNV, "glStateCaptureNV" }, + { &__blue_glCore_glGetCommandHeaderNV, "glGetCommandHeaderNV" }, + { &__blue_glCore_glGetStageIndexNV, "glGetStageIndexNV" }, + { &__blue_glCore_glDrawCommandsNV, "glDrawCommandsNV" }, + { &__blue_glCore_glDrawCommandsAddressNV, "glDrawCommandsAddressNV" }, + { &__blue_glCore_glDrawCommandsStatesNV, "glDrawCommandsStatesNV" }, + { &__blue_glCore_glDrawCommandsStatesAddressNV, "glDrawCommandsStatesAddressNV" }, + { &__blue_glCore_glCreateCommandListsNV, "glCreateCommandListsNV" }, + { &__blue_glCore_glDeleteCommandListsNV, "glDeleteCommandListsNV" }, + { &__blue_glCore_glIsCommandListNV, "glIsCommandListNV" }, + { &__blue_glCore_glListDrawCommandsStatesClientNV, "glListDrawCommandsStatesClientNV" }, + { &__blue_glCore_glCommandListSegmentsNV, "glCommandListSegmentsNV" }, + { &__blue_glCore_glCompileCommandListNV, "glCompileCommandListNV" }, + { &__blue_glCore_glCallCommandListNV, "glCallCommandListNV" }, + { &__blue_glCore_glBeginConditionalRenderNV, "glBeginConditionalRenderNV" }, + { &__blue_glCore_glEndConditionalRenderNV, "glEndConditionalRenderNV" }, + { &__blue_glCore_glSubpixelPrecisionBiasNV, "glSubpixelPrecisionBiasNV" }, + { &__blue_glCore_glConservativeRasterParameterfNV, "glConservativeRasterParameterfNV" }, + { &__blue_glCore_glCopyImageSubDataNV, "glCopyImageSubDataNV" }, + { &__blue_glCore_glDepthRangedNV, "glDepthRangedNV" }, + { &__blue_glCore_glClearDepthdNV, "glClearDepthdNV" }, + { &__blue_glCore_glDepthBoundsdNV, "glDepthBoundsdNV" }, + { &__blue_glCore_glDrawTextureNV, "glDrawTextureNV" }, + { &__blue_glCore_glMapControlPointsNV, "glMapControlPointsNV" }, + { &__blue_glCore_glMapParameterivNV, "glMapParameterivNV" }, + { &__blue_glCore_glMapParameterfvNV, "glMapParameterfvNV" }, + { &__blue_glCore_glGetMapControlPointsNV, "glGetMapControlPointsNV" }, + { &__blue_glCore_glGetMapParameterivNV, "glGetMapParameterivNV" }, + { &__blue_glCore_glGetMapParameterfvNV, "glGetMapParameterfvNV" }, + { &__blue_glCore_glGetMapAttribParameterivNV, "glGetMapAttribParameterivNV" }, + { &__blue_glCore_glGetMapAttribParameterfvNV, "glGetMapAttribParameterfvNV" }, + { &__blue_glCore_glEvalMapsNV, "glEvalMapsNV" }, + { &__blue_glCore_glGetMultisamplefvNV, "glGetMultisamplefvNV" }, + { &__blue_glCore_glSampleMaskIndexedNV, "glSampleMaskIndexedNV" }, { &__blue_glCore_glTexRenderbufferNV, "glTexRenderbufferNV" }, - { &__blue_glCore_glGetConvolutionParameterfvEXT, "glGetConvolutionParameterfvEXT" }, - { &__blue_glCore_glLightxvOES, "glLightxvOES" }, - { &__blue_glCore_glDeleteNamedStringARB, "glDeleteNamedStringARB" }, - { &__blue_glCore_glColor3hvNV, "glColor3hvNV" }, - { &__blue_glCore_glUniformMatrix4dv, "glUniformMatrix4dv" }, - { &__blue_glCore_glCompressedTexImage2DARB, "glCompressedTexImage2DARB" }, - { &__blue_glCore_glGenTexturesEXT, "glGenTexturesEXT" }, - { &__blue_glCore_glPathMemoryGlyphIndexArrayNV, "glPathMemoryGlyphIndexArrayNV" }, - { &__blue_glCore_glGetBufferSubDataARB, "glGetBufferSubDataARB" }, - { &__blue_glCore_glFinishObjectAPPLE, "glFinishObjectAPPLE" }, - { &__blue_glCore_glDetachShader, "glDetachShader" }, - { &__blue_glCore_glBindTexture, "glBindTexture" }, - { &__blue_glCore_glGetProgramResourcefvNV, "glGetProgramResourcefvNV" }, - { &__blue_glCore_glTexCoord2fColor4ubVertex3fvSUN, "glTexCoord2fColor4ubVertex3fvSUN" }, - { &__blue_glCore_glMultiTexCoord4dv, "glMultiTexCoord4dv" }, - { &__blue_glCore_glIsPointInFillPathNV, "glIsPointInFillPathNV" }, - { &__blue_glCore_glDrawTransformFeedbackInstanced, "glDrawTransformFeedbackInstanced" }, - { &__blue_glCore_glProgramParameteriARB, "glProgramParameteriARB" }, - { &__blue_glCore_glVertexAttrib3fvNV, "glVertexAttrib3fvNV" }, - { &__blue_glCore_glEnableVertexArrayAttrib, "glEnableVertexArrayAttrib" }, - { &__blue_glCore_glUniform3ui64vNV, "glUniform3ui64vNV" }, - { &__blue_glCore_glVertexAttribs4fvNV, "glVertexAttribs4fvNV" }, - { &__blue_glCore_glGetCompressedTextureImageEXT, "glGetCompressedTextureImageEXT" }, - { &__blue_glCore_glVertex3bOES, "glVertex3bOES" }, + { &__blue_glCore_glDeleteFencesNV, "glDeleteFencesNV" }, + { &__blue_glCore_glGenFencesNV, "glGenFencesNV" }, + { &__blue_glCore_glIsFenceNV, "glIsFenceNV" }, + { &__blue_glCore_glTestFenceNV, "glTestFenceNV" }, + { &__blue_glCore_glGetFenceivNV, "glGetFenceivNV" }, + { &__blue_glCore_glFinishFenceNV, "glFinishFenceNV" }, + { &__blue_glCore_glSetFenceNV, "glSetFenceNV" }, + { &__blue_glCore_glFragmentCoverageColorNV, "glFragmentCoverageColorNV" }, + { &__blue_glCore_glProgramNamedParameter4fNV, "glProgramNamedParameter4fNV" }, + { &__blue_glCore_glProgramNamedParameter4fvNV, "glProgramNamedParameter4fvNV" }, + { &__blue_glCore_glProgramNamedParameter4dNV, "glProgramNamedParameter4dNV" }, + { &__blue_glCore_glProgramNamedParameter4dvNV, "glProgramNamedParameter4dvNV" }, + { &__blue_glCore_glGetProgramNamedParameterfvNV, "glGetProgramNamedParameterfvNV" }, + { &__blue_glCore_glGetProgramNamedParameterdvNV, "glGetProgramNamedParameterdvNV" }, + { &__blue_glCore_glCoverageModulationTableNV, "glCoverageModulationTableNV" }, + { &__blue_glCore_glGetCoverageModulationTableNV, "glGetCoverageModulationTableNV" }, + { &__blue_glCore_glCoverageModulationNV, "glCoverageModulationNV" }, + { &__blue_glCore_glRenderbufferStorageMultisampleCoverageNV, "glRenderbufferStorageMultisampleCoverageNV" }, + { &__blue_glCore_glProgramVertexLimitNV, "glProgramVertexLimitNV" }, + { &__blue_glCore_glFramebufferTextureEXT, "glFramebufferTextureEXT" }, + { &__blue_glCore_glFramebufferTextureFaceEXT, "glFramebufferTextureFaceEXT" }, + { &__blue_glCore_glProgramLocalParameterI4iNV, "glProgramLocalParameterI4iNV" }, { &__blue_glCore_glProgramLocalParameterI4ivNV, "glProgramLocalParameterI4ivNV" }, - { &__blue_glCore_glWindowPos2fMESA, "glWindowPos2fMESA" }, - { &__blue_glCore_glWeightusvARB, "glWeightusvARB" }, - { &__blue_glCore_glGenOcclusionQueriesNV, "glGenOcclusionQueriesNV" }, - { &__blue_glCore_glTexCoordPointervINTEL, "glTexCoordPointervINTEL" }, - { &__blue_glCore_glGetTextureParameterIivEXT, "glGetTextureParameterIivEXT" }, - { &__blue_glCore_glDeleteStatesNV, "glDeleteStatesNV" }, - { &__blue_glCore_glProgramLocalParameter4fvARB, "glProgramLocalParameter4fvARB" }, - { &__blue_glCore_glCoverFillPathInstancedNV, "glCoverFillPathInstancedNV" }, - { &__blue_glCore_glBeginConditionalRenderNVX, "glBeginConditionalRenderNVX" }, - { &__blue_glCore_glPathDashArrayNV, "glPathDashArrayNV" }, - { &__blue_glCore_glSpriteParameteriSGIX, "glSpriteParameteriSGIX" }, - { &__blue_glCore_glGetNamedProgramStringEXT, "glGetNamedProgramStringEXT" }, - { &__blue_glCore_glCombinerParameterfvNV, "glCombinerParameterfvNV" }, - { &__blue_glCore_glTexParameterxvOES, "glTexParameterxvOES" }, - { &__blue_glCore_glVertexArrayVertexAttribDivisorEXT, "glVertexArrayVertexAttribDivisorEXT" }, + { &__blue_glCore_glProgramLocalParametersI4ivNV, "glProgramLocalParametersI4ivNV" }, + { &__blue_glCore_glProgramLocalParameterI4uiNV, "glProgramLocalParameterI4uiNV" }, + { &__blue_glCore_glProgramLocalParameterI4uivNV, "glProgramLocalParameterI4uivNV" }, + { &__blue_glCore_glProgramLocalParametersI4uivNV, "glProgramLocalParametersI4uivNV" }, + { &__blue_glCore_glProgramEnvParameterI4iNV, "glProgramEnvParameterI4iNV" }, + { &__blue_glCore_glProgramEnvParameterI4ivNV, "glProgramEnvParameterI4ivNV" }, + { &__blue_glCore_glProgramEnvParametersI4ivNV, "glProgramEnvParametersI4ivNV" }, + { &__blue_glCore_glProgramEnvParameterI4uiNV, "glProgramEnvParameterI4uiNV" }, + { &__blue_glCore_glProgramEnvParameterI4uivNV, "glProgramEnvParameterI4uivNV" }, + { &__blue_glCore_glProgramEnvParametersI4uivNV, "glProgramEnvParametersI4uivNV" }, + { &__blue_glCore_glGetProgramLocalParameterIivNV, "glGetProgramLocalParameterIivNV" }, + { &__blue_glCore_glGetProgramLocalParameterIuivNV, "glGetProgramLocalParameterIuivNV" }, + { &__blue_glCore_glGetProgramEnvParameterIivNV, "glGetProgramEnvParameterIivNV" }, + { &__blue_glCore_glGetProgramEnvParameterIuivNV, "glGetProgramEnvParameterIuivNV" }, { &__blue_glCore_glProgramSubroutineParametersuivNV, "glProgramSubroutineParametersuivNV" }, - { &__blue_glCore_glDeleteObjectARB, "glDeleteObjectARB" }, - { &__blue_glCore_glProgramUniform1i64ARB, "glProgramUniform1i64ARB" }, - { &__blue_glCore_glFramebufferTextureARB, "glFramebufferTextureARB" }, - { &__blue_glCore_glElementPointerATI, "glElementPointerATI" }, - { &__blue_glCore_glUniform2i64vARB, "glUniform2i64vARB" }, - { &__blue_glCore_glGetBooleanIndexedvEXT, "glGetBooleanIndexedvEXT" }, - { &__blue_glCore_glVertexAttribP1uiv, "glVertexAttribP1uiv" }, - { &__blue_glCore_glGetDoubleIndexedvEXT, "glGetDoubleIndexedvEXT" }, - { &__blue_glCore_glGetUniformiv, "glGetUniformiv" }, - { &__blue_glCore_glVertexAttribArrayObjectATI, "glVertexAttribArrayObjectATI" }, - { &__blue_glCore_glBufferSubDataARB, "glBufferSubDataARB" }, - { &__blue_glCore_glWindowPos2fARB, "glWindowPos2fARB" }, - { &__blue_glCore_glMultiTexCoord2bvOES, "glMultiTexCoord2bvOES" }, - { &__blue_glCore_glProgramUniform2i64vARB, "glProgramUniform2i64vARB" }, - { &__blue_glCore_glTexEnvxOES, "glTexEnvxOES" }, - { &__blue_glCore_glStencilOpValueAMD, "glStencilOpValueAMD" }, - { &__blue_glCore_glUniform4ui64vARB, "glUniform4ui64vARB" }, - { &__blue_glCore_glTangent3iEXT, "glTangent3iEXT" }, - { &__blue_glCore_glGetVertexAttribLdvEXT, "glGetVertexAttribLdvEXT" }, - { &__blue_glCore_glGetCoverageModulationTableNV, "glGetCoverageModulationTableNV" }, - { &__blue_glCore_glVertexWeighthvNV, "glVertexWeighthvNV" }, - { &__blue_glCore_glWindowPos3iARB, "glWindowPos3iARB" }, - { &__blue_glCore_glVertexAttribI1iv, "glVertexAttribI1iv" }, - { &__blue_glCore_glWindowPos3fv, "glWindowPos3fv" }, - { &__blue_glCore_glVertexStream4ivATI, "glVertexStream4ivATI" }, - { &__blue_glCore_glTextureImage3DMultisampleCoverageNV, "glTextureImage3DMultisampleCoverageNV" }, - { &__blue_glCore_glUniform3f, "glUniform3f" }, - { &__blue_glCore_glAccumxOES, "glAccumxOES" }, - { &__blue_glCore_glTexStorage3D, "glTexStorage3D" }, - { &__blue_glCore_glDrawArrays, "glDrawArrays" }, - { &__blue_glCore_glSamplePatternEXT, "glSamplePatternEXT" }, - { &__blue_glCore_glNormalPointervINTEL, "glNormalPointervINTEL" }, - { &__blue_glCore_glWeightubvARB, "glWeightubvARB" }, - { &__blue_glCore_glGenProgramsNV, "glGenProgramsNV" }, - { &__blue_glCore_glDepthRangef, "glDepthRangef" }, - { &__blue_glCore_glGetProgramParameterdvNV, "glGetProgramParameterdvNV" }, - { &__blue_glCore_glPollInstrumentsSGIX, "glPollInstrumentsSGIX" }, + { &__blue_glCore_glGetProgramSubroutineParameteruivNV, "glGetProgramSubroutineParameteruivNV" }, + { &__blue_glCore_glVertex2hNV, "glVertex2hNV" }, + { &__blue_glCore_glVertex2hvNV, "glVertex2hvNV" }, + { &__blue_glCore_glVertex3hNV, "glVertex3hNV" }, + { &__blue_glCore_glVertex3hvNV, "glVertex3hvNV" }, + { &__blue_glCore_glVertex4hNV, "glVertex4hNV" }, + { &__blue_glCore_glVertex4hvNV, "glVertex4hvNV" }, + { &__blue_glCore_glNormal3hNV, "glNormal3hNV" }, + { &__blue_glCore_glNormal3hvNV, "glNormal3hvNV" }, + { &__blue_glCore_glColor3hNV, "glColor3hNV" }, + { &__blue_glCore_glColor3hvNV, "glColor3hvNV" }, + { &__blue_glCore_glColor4hNV, "glColor4hNV" }, + { &__blue_glCore_glColor4hvNV, "glColor4hvNV" }, + { &__blue_glCore_glTexCoord1hNV, "glTexCoord1hNV" }, + { &__blue_glCore_glTexCoord1hvNV, "glTexCoord1hvNV" }, + { &__blue_glCore_glTexCoord2hNV, "glTexCoord2hNV" }, + { &__blue_glCore_glTexCoord2hvNV, "glTexCoord2hvNV" }, + { &__blue_glCore_glTexCoord3hNV, "glTexCoord3hNV" }, + { &__blue_glCore_glTexCoord3hvNV, "glTexCoord3hvNV" }, + { &__blue_glCore_glTexCoord4hNV, "glTexCoord4hNV" }, + { &__blue_glCore_glTexCoord4hvNV, "glTexCoord4hvNV" }, { &__blue_glCore_glMultiTexCoord1hNV, "glMultiTexCoord1hNV" }, - { &__blue_glCore_glSecondaryColor3s, "glSecondaryColor3s" }, - { &__blue_glCore_glTexCoordP1uiv, "glTexCoordP1uiv" }, - { &__blue_glCore_glStopInstrumentsSGIX, "glStopInstrumentsSGIX" }, - { &__blue_glCore_glActiveTexture, "glActiveTexture" }, - { &__blue_glCore_glVertexAttribs2svNV, "glVertexAttribs2svNV" }, - { &__blue_glCore_glGetActiveAtomicCounterBufferiv, "glGetActiveAtomicCounterBufferiv" }, - { &__blue_glCore_glEndConditionalRenderNVX, "glEndConditionalRenderNVX" }, - { &__blue_glCore_glDrawRangeElementArrayATI, "glDrawRangeElementArrayATI" }, - { &__blue_glCore_glCopyMultiTexImage1DEXT, "glCopyMultiTexImage1DEXT" }, - { &__blue_glCore_glReplacementCodeusSUN, "glReplacementCodeusSUN" }, - { &__blue_glCore_glMultiTexGendEXT, "glMultiTexGendEXT" }, - { &__blue_glCore_glMatrixRotatefEXT, "glMatrixRotatefEXT" }, - { &__blue_glCore_glBindBufferOffsetNV, "glBindBufferOffsetNV" }, - { &__blue_glCore_glVertexAttribI1ui, "glVertexAttribI1ui" }, - { &__blue_glCore_glMakeImageHandleNonResidentARB, "glMakeImageHandleNonResidentARB" }, - { &__blue_glCore_glTextureParameteriEXT, "glTextureParameteriEXT" }, - { &__blue_glCore_glDebugMessageInsertARB, "glDebugMessageInsertARB" }, - { &__blue_glCore_glVertexAttrib4NubvARB, "glVertexAttrib4NubvARB" }, - { &__blue_glCore_glDeleteTexturesEXT, "glDeleteTexturesEXT" }, - { &__blue_glCore_glWindowPos3svARB, "glWindowPos3svARB" }, - { &__blue_glCore_glTexParameterxOES, "glTexParameterxOES" }, - { &__blue_glCore_glVertexStream3fATI, "glVertexStream3fATI" }, - { &__blue_glCore_glNormal3xOES, "glNormal3xOES" }, - { &__blue_glCore_glMultiTexCoord4bvOES, "glMultiTexCoord4bvOES" }, - { &__blue_glCore_glVertexAttribL1dv, "glVertexAttribL1dv" }, - { &__blue_glCore_glGetImageTransformParameterivHP, "glGetImageTransformParameterivHP" }, - { &__blue_glCore_glGetSubroutineUniformLocation, "glGetSubroutineUniformLocation" }, - { &__blue_glCore_glProgramEnvParameter4fvARB, "glProgramEnvParameter4fvARB" }, - { &__blue_glCore_glGetTextureImageEXT, "glGetTextureImageEXT" }, - { &__blue_glCore_glBindTexGenParameterEXT, "glBindTexGenParameterEXT" }, - { &__blue_glCore_glMinSampleShadingARB, "glMinSampleShadingARB" }, - { &__blue_glCore_glGetAttachedObjectsARB, "glGetAttachedObjectsARB" }, - { &__blue_glCore_glGetVertexArrayiv, "glGetVertexArrayiv" }, - { &__blue_glCore_glWeightfvARB, "glWeightfvARB" }, + { &__blue_glCore_glMultiTexCoord1hvNV, "glMultiTexCoord1hvNV" }, + { &__blue_glCore_glMultiTexCoord2hNV, "glMultiTexCoord2hNV" }, + { &__blue_glCore_glMultiTexCoord2hvNV, "glMultiTexCoord2hvNV" }, + { &__blue_glCore_glMultiTexCoord3hNV, "glMultiTexCoord3hNV" }, + { &__blue_glCore_glMultiTexCoord3hvNV, "glMultiTexCoord3hvNV" }, + { &__blue_glCore_glMultiTexCoord4hNV, "glMultiTexCoord4hNV" }, + { &__blue_glCore_glMultiTexCoord4hvNV, "glMultiTexCoord4hvNV" }, + { &__blue_glCore_glFogCoordhNV, "glFogCoordhNV" }, + { &__blue_glCore_glFogCoordhvNV, "glFogCoordhvNV" }, + { &__blue_glCore_glSecondaryColor3hNV, "glSecondaryColor3hNV" }, + { &__blue_glCore_glSecondaryColor3hvNV, "glSecondaryColor3hvNV" }, + { &__blue_glCore_glVertexWeighthNV, "glVertexWeighthNV" }, + { &__blue_glCore_glVertexWeighthvNV, "glVertexWeighthvNV" }, + { &__blue_glCore_glVertexAttrib1hNV, "glVertexAttrib1hNV" }, + { &__blue_glCore_glVertexAttrib1hvNV, "glVertexAttrib1hvNV" }, + { &__blue_glCore_glVertexAttrib2hNV, "glVertexAttrib2hNV" }, + { &__blue_glCore_glVertexAttrib2hvNV, "glVertexAttrib2hvNV" }, + { &__blue_glCore_glVertexAttrib3hNV, "glVertexAttrib3hNV" }, + { &__blue_glCore_glVertexAttrib3hvNV, "glVertexAttrib3hvNV" }, + { &__blue_glCore_glVertexAttrib4hNV, "glVertexAttrib4hNV" }, + { &__blue_glCore_glVertexAttrib4hvNV, "glVertexAttrib4hvNV" }, + { &__blue_glCore_glVertexAttribs1hvNV, "glVertexAttribs1hvNV" }, + { &__blue_glCore_glVertexAttribs2hvNV, "glVertexAttribs2hvNV" }, + { &__blue_glCore_glVertexAttribs3hvNV, "glVertexAttribs3hvNV" }, + { &__blue_glCore_glVertexAttribs4hvNV, "glVertexAttribs4hvNV" }, + { &__blue_glCore_glGetInternalformatSampleivNV, "glGetInternalformatSampleivNV" }, + { &__blue_glCore_glGenOcclusionQueriesNV, "glGenOcclusionQueriesNV" }, + { &__blue_glCore_glDeleteOcclusionQueriesNV, "glDeleteOcclusionQueriesNV" }, + { &__blue_glCore_glIsOcclusionQueryNV, "glIsOcclusionQueryNV" }, + { &__blue_glCore_glBeginOcclusionQueryNV, "glBeginOcclusionQueryNV" }, + { &__blue_glCore_glEndOcclusionQueryNV, "glEndOcclusionQueryNV" }, + { &__blue_glCore_glGetOcclusionQueryivNV, "glGetOcclusionQueryivNV" }, + { &__blue_glCore_glGetOcclusionQueryuivNV, "glGetOcclusionQueryuivNV" }, + { &__blue_glCore_glProgramBufferParametersfvNV, "glProgramBufferParametersfvNV" }, + { &__blue_glCore_glProgramBufferParametersIivNV, "glProgramBufferParametersIivNV" }, + { &__blue_glCore_glProgramBufferParametersIuivNV, "glProgramBufferParametersIuivNV" }, + { &__blue_glCore_glGenPathsNV, "glGenPathsNV" }, + { &__blue_glCore_glDeletePathsNV, "glDeletePathsNV" }, + { &__blue_glCore_glIsPathNV, "glIsPathNV" }, + { &__blue_glCore_glPathCommandsNV, "glPathCommandsNV" }, + { &__blue_glCore_glPathCoordsNV, "glPathCoordsNV" }, + { &__blue_glCore_glPathSubCommandsNV, "glPathSubCommandsNV" }, + { &__blue_glCore_glPathSubCoordsNV, "glPathSubCoordsNV" }, + { &__blue_glCore_glPathStringNV, "glPathStringNV" }, + { &__blue_glCore_glPathGlyphsNV, "glPathGlyphsNV" }, + { &__blue_glCore_glPathGlyphRangeNV, "glPathGlyphRangeNV" }, + { &__blue_glCore_glWeightPathsNV, "glWeightPathsNV" }, + { &__blue_glCore_glCopyPathNV, "glCopyPathNV" }, + { &__blue_glCore_glInterpolatePathsNV, "glInterpolatePathsNV" }, + { &__blue_glCore_glTransformPathNV, "glTransformPathNV" }, + { &__blue_glCore_glPathParameterivNV, "glPathParameterivNV" }, + { &__blue_glCore_glPathParameteriNV, "glPathParameteriNV" }, + { &__blue_glCore_glPathParameterfvNV, "glPathParameterfvNV" }, + { &__blue_glCore_glPathParameterfNV, "glPathParameterfNV" }, + { &__blue_glCore_glPathDashArrayNV, "glPathDashArrayNV" }, + { &__blue_glCore_glPathStencilFuncNV, "glPathStencilFuncNV" }, + { &__blue_glCore_glPathStencilDepthOffsetNV, "glPathStencilDepthOffsetNV" }, + { &__blue_glCore_glStencilFillPathNV, "glStencilFillPathNV" }, + { &__blue_glCore_glStencilStrokePathNV, "glStencilStrokePathNV" }, + { &__blue_glCore_glStencilFillPathInstancedNV, "glStencilFillPathInstancedNV" }, + { &__blue_glCore_glStencilStrokePathInstancedNV, "glStencilStrokePathInstancedNV" }, + { &__blue_glCore_glPathCoverDepthFuncNV, "glPathCoverDepthFuncNV" }, + { &__blue_glCore_glCoverFillPathNV, "glCoverFillPathNV" }, + { &__blue_glCore_glCoverStrokePathNV, "glCoverStrokePathNV" }, + { &__blue_glCore_glCoverFillPathInstancedNV, "glCoverFillPathInstancedNV" }, + { &__blue_glCore_glCoverStrokePathInstancedNV, "glCoverStrokePathInstancedNV" }, + { &__blue_glCore_glGetPathParameterivNV, "glGetPathParameterivNV" }, + { &__blue_glCore_glGetPathParameterfvNV, "glGetPathParameterfvNV" }, { &__blue_glCore_glGetPathCommandsNV, "glGetPathCommandsNV" }, - { &__blue_glCore_glGetColorTableParameterivSGI, "glGetColorTableParameterivSGI" }, - { &__blue_glCore_glGetNamedProgramivEXT, "glGetNamedProgramivEXT" }, - { &__blue_glCore_glSecondaryColor3ubvEXT, "glSecondaryColor3ubvEXT" }, - { &__blue_glCore_glVDPAURegisterVideoSurfaceNV, "glVDPAURegisterVideoSurfaceNV" }, - { &__blue_glCore_glTexParameterf, "glTexParameterf" }, - { &__blue_glCore_glVertexAttribL4i64NV, "glVertexAttribL4i64NV" }, - { &__blue_glCore_glPollAsyncSGIX, "glPollAsyncSGIX" }, - { &__blue_glCore_glBufferParameteriAPPLE, "glBufferParameteriAPPLE" }, - { &__blue_glCore_glApplyTextureEXT, "glApplyTextureEXT" }, - { &__blue_glCore_glGenVertexShadersEXT, "glGenVertexShadersEXT" }, - { &__blue_glCore_glTexImage2DMultisampleCoverageNV, "glTexImage2DMultisampleCoverageNV" }, - { &__blue_glCore_glObjectUnpurgeableAPPLE, "glObjectUnpurgeableAPPLE" }, - { &__blue_glCore_glCopyNamedBufferSubData, "glCopyNamedBufferSubData" }, - { &__blue_glCore_glVertexAttrib4dv, "glVertexAttrib4dv" }, - { &__blue_glCore_glClearTexSubImage, "glClearTexSubImage" }, + { &__blue_glCore_glGetPathCoordsNV, "glGetPathCoordsNV" }, + { &__blue_glCore_glGetPathDashArrayNV, "glGetPathDashArrayNV" }, + { &__blue_glCore_glGetPathMetricsNV, "glGetPathMetricsNV" }, + { &__blue_glCore_glGetPathMetricRangeNV, "glGetPathMetricRangeNV" }, + { &__blue_glCore_glGetPathSpacingNV, "glGetPathSpacingNV" }, + { &__blue_glCore_glIsPointInFillPathNV, "glIsPointInFillPathNV" }, + { &__blue_glCore_glIsPointInStrokePathNV, "glIsPointInStrokePathNV" }, + { &__blue_glCore_glGetPathLengthNV, "glGetPathLengthNV" }, { &__blue_glCore_glPointAlongPathNV, "glPointAlongPathNV" }, - { &__blue_glCore_glFramebufferTexture1DEXT, "glFramebufferTexture1DEXT" }, { &__blue_glCore_glMatrixLoad3x2fNV, "glMatrixLoad3x2fNV" }, - { &__blue_glCore_glGetUniformui64vARB, "glGetUniformui64vARB" }, - { &__blue_glCore_glTextureStorage3DMultisampleEXT, "glTextureStorage3DMultisampleEXT" }, - { &__blue_glCore_glTexCoord1bvOES, "glTexCoord1bvOES" }, - { &__blue_glCore_glGetBufferParameteri64v, "glGetBufferParameteri64v" }, - { &__blue_glCore_glQueryMatrixxOES, "glQueryMatrixxOES" }, - { &__blue_glCore_glVertexAttrib1fv, "glVertexAttrib1fv" }, - { &__blue_glCore_glVertexAttribP3ui, "glVertexAttribP3ui" }, - { &__blue_glCore_glVDPAUInitNV, "glVDPAUInitNV" }, - { &__blue_glCore_glPathStencilDepthOffsetNV, "glPathStencilDepthOffsetNV" }, - { &__blue_glCore_glLightxOES, "glLightxOES" }, - { &__blue_glCore_glVertexAttribI3i, "glVertexAttribI3i" }, - { &__blue_glCore_glProgramUniformHandleui64vARB, "glProgramUniformHandleui64vARB" }, - { &__blue_glCore_glTextureParameteriv, "glTextureParameteriv" }, - { &__blue_glCore_glProgramUniformHandleui64NV, "glProgramUniformHandleui64NV" }, - { &__blue_glCore_glGetVertexArrayIntegervEXT, "glGetVertexArrayIntegervEXT" }, - { &__blue_glCore_glDrawElements, "glDrawElements" }, - { &__blue_glCore_glProgramUniform3i64ARB, "glProgramUniform3i64ARB" }, - { &__blue_glCore_glDeleteAsyncMarkersSGIX, "glDeleteAsyncMarkersSGIX" }, - { &__blue_glCore_glGetLightxOES, "glGetLightxOES" }, - { &__blue_glCore_glCreateCommandListsNV, "glCreateCommandListsNV" }, - { &__blue_glCore_glClear, "glClear" }, + { &__blue_glCore_glMatrixLoad3x3fNV, "glMatrixLoad3x3fNV" }, + { &__blue_glCore_glMatrixLoadTranspose3x3fNV, "glMatrixLoadTranspose3x3fNV" }, + { &__blue_glCore_glMatrixMult3x2fNV, "glMatrixMult3x2fNV" }, + { &__blue_glCore_glMatrixMult3x3fNV, "glMatrixMult3x3fNV" }, + { &__blue_glCore_glMatrixMultTranspose3x3fNV, "glMatrixMultTranspose3x3fNV" }, + { &__blue_glCore_glStencilThenCoverFillPathNV, "glStencilThenCoverFillPathNV" }, + { &__blue_glCore_glStencilThenCoverStrokePathNV, "glStencilThenCoverStrokePathNV" }, + { &__blue_glCore_glStencilThenCoverFillPathInstancedNV, "glStencilThenCoverFillPathInstancedNV" }, + { &__blue_glCore_glStencilThenCoverStrokePathInstancedNV, "glStencilThenCoverStrokePathInstancedNV" }, + { &__blue_glCore_glPathGlyphIndexRangeNV, "glPathGlyphIndexRangeNV" }, + { &__blue_glCore_glPathGlyphIndexArrayNV, "glPathGlyphIndexArrayNV" }, + { &__blue_glCore_glPathMemoryGlyphIndexArrayNV, "glPathMemoryGlyphIndexArrayNV" }, + { &__blue_glCore_glProgramPathFragmentInputGenNV, "glProgramPathFragmentInputGenNV" }, + { &__blue_glCore_glGetProgramResourcefvNV, "glGetProgramResourcefvNV" }, + { &__blue_glCore_glPathColorGenNV, "glPathColorGenNV" }, + { &__blue_glCore_glPathTexGenNV, "glPathTexGenNV" }, + { &__blue_glCore_glPathFogGenNV, "glPathFogGenNV" }, + { &__blue_glCore_glGetPathColorGenivNV, "glGetPathColorGenivNV" }, + { &__blue_glCore_glGetPathColorGenfvNV, "glGetPathColorGenfvNV" }, + { &__blue_glCore_glGetPathTexGenivNV, "glGetPathTexGenivNV" }, + { &__blue_glCore_glGetPathTexGenfvNV, "glGetPathTexGenfvNV" }, + { &__blue_glCore_glPixelDataRangeNV, "glPixelDataRangeNV" }, + { &__blue_glCore_glFlushPixelDataRangeNV, "glFlushPixelDataRangeNV" }, + { &__blue_glCore_glPointParameteriNV, "glPointParameteriNV" }, + { &__blue_glCore_glPointParameterivNV, "glPointParameterivNV" }, + { &__blue_glCore_glPresentFrameKeyedNV, "glPresentFrameKeyedNV" }, + { &__blue_glCore_glPresentFrameDualFillNV, "glPresentFrameDualFillNV" }, + { &__blue_glCore_glGetVideoivNV, "glGetVideoivNV" }, + { &__blue_glCore_glGetVideouivNV, "glGetVideouivNV" }, + { &__blue_glCore_glGetVideoi64vNV, "glGetVideoi64vNV" }, + { &__blue_glCore_glGetVideoui64vNV, "glGetVideoui64vNV" }, + { &__blue_glCore_glPrimitiveRestartNV, "glPrimitiveRestartNV" }, + { &__blue_glCore_glPrimitiveRestartIndexNV, "glPrimitiveRestartIndexNV" }, + { &__blue_glCore_glCombinerParameterfvNV, "glCombinerParameterfvNV" }, + { &__blue_glCore_glCombinerParameterfNV, "glCombinerParameterfNV" }, + { &__blue_glCore_glCombinerParameterivNV, "glCombinerParameterivNV" }, + { &__blue_glCore_glCombinerParameteriNV, "glCombinerParameteriNV" }, + { &__blue_glCore_glCombinerInputNV, "glCombinerInputNV" }, + { &__blue_glCore_glCombinerOutputNV, "glCombinerOutputNV" }, + { &__blue_glCore_glFinalCombinerInputNV, "glFinalCombinerInputNV" }, + { &__blue_glCore_glGetCombinerInputParameterfvNV, "glGetCombinerInputParameterfvNV" }, + { &__blue_glCore_glGetCombinerInputParameterivNV, "glGetCombinerInputParameterivNV" }, + { &__blue_glCore_glGetCombinerOutputParameterfvNV, "glGetCombinerOutputParameterfvNV" }, + { &__blue_glCore_glGetCombinerOutputParameterivNV, "glGetCombinerOutputParameterivNV" }, + { &__blue_glCore_glGetFinalCombinerInputParameterfvNV, "glGetFinalCombinerInputParameterfvNV" }, + { &__blue_glCore_glGetFinalCombinerInputParameterivNV, "glGetFinalCombinerInputParameterivNV" }, + { &__blue_glCore_glCombinerStageParameterfvNV, "glCombinerStageParameterfvNV" }, + { &__blue_glCore_glGetCombinerStageParameterfvNV, "glGetCombinerStageParameterfvNV" }, + { &__blue_glCore_glFramebufferSampleLocationsfvNV, "glFramebufferSampleLocationsfvNV" }, + { &__blue_glCore_glNamedFramebufferSampleLocationsfvNV, "glNamedFramebufferSampleLocationsfvNV" }, + { &__blue_glCore_glResolveDepthValuesNV, "glResolveDepthValuesNV" }, + { &__blue_glCore_glMakeBufferResidentNV, "glMakeBufferResidentNV" }, + { &__blue_glCore_glMakeBufferNonResidentNV, "glMakeBufferNonResidentNV" }, + { &__blue_glCore_glIsBufferResidentNV, "glIsBufferResidentNV" }, + { &__blue_glCore_glMakeNamedBufferResidentNV, "glMakeNamedBufferResidentNV" }, + { &__blue_glCore_glMakeNamedBufferNonResidentNV, "glMakeNamedBufferNonResidentNV" }, + { &__blue_glCore_glIsNamedBufferResidentNV, "glIsNamedBufferResidentNV" }, + { &__blue_glCore_glGetBufferParameterui64vNV, "glGetBufferParameterui64vNV" }, + { &__blue_glCore_glGetNamedBufferParameterui64vNV, "glGetNamedBufferParameterui64vNV" }, + { &__blue_glCore_glGetIntegerui64vNV, "glGetIntegerui64vNV" }, + { &__blue_glCore_glUniformui64NV, "glUniformui64NV" }, { &__blue_glCore_glUniformui64vNV, "glUniformui64vNV" }, - { &__blue_glCore_glVertexAttrib2dvNV, "glVertexAttrib2dvNV" }, - { &__blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN, "glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN" }, - { &__blue_glCore_glWindowPos3sARB, "glWindowPos3sARB" }, - { &__blue_glCore_glDrawTextureNV, "glDrawTextureNV" }, - { &__blue_glCore_glIsSync, "glIsSync" }, - { &__blue_glCore_glMatrixTranslatedEXT, "glMatrixTranslatedEXT" }, + { &__blue_glCore_glProgramUniformui64NV, "glProgramUniformui64NV" }, + { &__blue_glCore_glProgramUniformui64vNV, "glProgramUniformui64vNV" }, + { &__blue_glCore_glTextureBarrierNV, "glTextureBarrierNV" }, + { &__blue_glCore_glTexImage2DMultisampleCoverageNV, "glTexImage2DMultisampleCoverageNV" }, + { &__blue_glCore_glTexImage3DMultisampleCoverageNV, "glTexImage3DMultisampleCoverageNV" }, + { &__blue_glCore_glTextureImage2DMultisampleNV, "glTextureImage2DMultisampleNV" }, + { &__blue_glCore_glTextureImage3DMultisampleNV, "glTextureImage3DMultisampleNV" }, + { &__blue_glCore_glTextureImage2DMultisampleCoverageNV, "glTextureImage2DMultisampleCoverageNV" }, + { &__blue_glCore_glTextureImage3DMultisampleCoverageNV, "glTextureImage3DMultisampleCoverageNV" }, + { &__blue_glCore_glBeginTransformFeedbackNV, "glBeginTransformFeedbackNV" }, + { &__blue_glCore_glEndTransformFeedbackNV, "glEndTransformFeedbackNV" }, + { &__blue_glCore_glTransformFeedbackAttribsNV, "glTransformFeedbackAttribsNV" }, + { &__blue_glCore_glBindBufferRangeNV, "glBindBufferRangeNV" }, + { &__blue_glCore_glBindBufferOffsetNV, "glBindBufferOffsetNV" }, + { &__blue_glCore_glBindBufferBaseNV, "glBindBufferBaseNV" }, + { &__blue_glCore_glTransformFeedbackVaryingsNV, "glTransformFeedbackVaryingsNV" }, + { &__blue_glCore_glActiveVaryingNV, "glActiveVaryingNV" }, + { &__blue_glCore_glGetVaryingLocationNV, "glGetVaryingLocationNV" }, { &__blue_glCore_glGetActiveVaryingNV, "glGetActiveVaryingNV" }, - { &__blue_glCore_glCreateQueries, "glCreateQueries" }, - { &__blue_glCore_glGetProgramEnvParameterdvARB, "glGetProgramEnvParameterdvARB" }, - { &__blue_glCore_glVertexArrayVertexAttribIOffsetEXT, "glVertexArrayVertexAttribIOffsetEXT" }, - { &__blue_glCore_glGetLocalConstantBooleanvEXT, "glGetLocalConstantBooleanvEXT" }, + { &__blue_glCore_glGetTransformFeedbackVaryingNV, "glGetTransformFeedbackVaryingNV" }, + { &__blue_glCore_glTransformFeedbackStreamAttribsNV, "glTransformFeedbackStreamAttribsNV" }, + { &__blue_glCore_glBindTransformFeedbackNV, "glBindTransformFeedbackNV" }, + { &__blue_glCore_glDeleteTransformFeedbacksNV, "glDeleteTransformFeedbacksNV" }, + { &__blue_glCore_glGenTransformFeedbacksNV, "glGenTransformFeedbacksNV" }, + { &__blue_glCore_glIsTransformFeedbackNV, "glIsTransformFeedbackNV" }, + { &__blue_glCore_glPauseTransformFeedbackNV, "glPauseTransformFeedbackNV" }, + { &__blue_glCore_glResumeTransformFeedbackNV, "glResumeTransformFeedbackNV" }, + { &__blue_glCore_glDrawTransformFeedbackNV, "glDrawTransformFeedbackNV" }, + { &__blue_glCore_glVDPAUInitNV, "glVDPAUInitNV" }, + { &__blue_glCore_glVDPAUFiniNV, "glVDPAUFiniNV" }, + { &__blue_glCore_glVDPAURegisterVideoSurfaceNV, "glVDPAURegisterVideoSurfaceNV" }, + { &__blue_glCore_glVDPAURegisterOutputSurfaceNV, "glVDPAURegisterOutputSurfaceNV" }, + { &__blue_glCore_glVDPAUIsSurfaceNV, "glVDPAUIsSurfaceNV" }, + { &__blue_glCore_glVDPAUUnregisterSurfaceNV, "glVDPAUUnregisterSurfaceNV" }, + { &__blue_glCore_glVDPAUGetSurfaceivNV, "glVDPAUGetSurfaceivNV" }, + { &__blue_glCore_glVDPAUSurfaceAccessNV, "glVDPAUSurfaceAccessNV" }, + { &__blue_glCore_glVDPAUMapSurfacesNV, "glVDPAUMapSurfacesNV" }, + { &__blue_glCore_glVDPAUUnmapSurfacesNV, "glVDPAUUnmapSurfacesNV" }, + { &__blue_glCore_glFlushVertexArrayRangeNV, "glFlushVertexArrayRangeNV" }, + { &__blue_glCore_glVertexArrayRangeNV, "glVertexArrayRangeNV" }, + { &__blue_glCore_glVertexAttribL1i64NV, "glVertexAttribL1i64NV" }, + { &__blue_glCore_glVertexAttribL2i64NV, "glVertexAttribL2i64NV" }, + { &__blue_glCore_glVertexAttribL3i64NV, "glVertexAttribL3i64NV" }, + { &__blue_glCore_glVertexAttribL4i64NV, "glVertexAttribL4i64NV" }, + { &__blue_glCore_glVertexAttribL1i64vNV, "glVertexAttribL1i64vNV" }, + { &__blue_glCore_glVertexAttribL2i64vNV, "glVertexAttribL2i64vNV" }, + { &__blue_glCore_glVertexAttribL3i64vNV, "glVertexAttribL3i64vNV" }, + { &__blue_glCore_glVertexAttribL4i64vNV, "glVertexAttribL4i64vNV" }, + { &__blue_glCore_glVertexAttribL1ui64NV, "glVertexAttribL1ui64NV" }, + { &__blue_glCore_glVertexAttribL2ui64NV, "glVertexAttribL2ui64NV" }, + { &__blue_glCore_glVertexAttribL3ui64NV, "glVertexAttribL3ui64NV" }, + { &__blue_glCore_glVertexAttribL4ui64NV, "glVertexAttribL4ui64NV" }, + { &__blue_glCore_glVertexAttribL1ui64vNV, "glVertexAttribL1ui64vNV" }, + { &__blue_glCore_glVertexAttribL2ui64vNV, "glVertexAttribL2ui64vNV" }, + { &__blue_glCore_glVertexAttribL3ui64vNV, "glVertexAttribL3ui64vNV" }, + { &__blue_glCore_glVertexAttribL4ui64vNV, "glVertexAttribL4ui64vNV" }, + { &__blue_glCore_glGetVertexAttribLi64vNV, "glGetVertexAttribLi64vNV" }, + { &__blue_glCore_glGetVertexAttribLui64vNV, "glGetVertexAttribLui64vNV" }, + { &__blue_glCore_glVertexAttribLFormatNV, "glVertexAttribLFormatNV" }, + { &__blue_glCore_glBufferAddressRangeNV, "glBufferAddressRangeNV" }, + { &__blue_glCore_glVertexFormatNV, "glVertexFormatNV" }, + { &__blue_glCore_glNormalFormatNV, "glNormalFormatNV" }, + { &__blue_glCore_glColorFormatNV, "glColorFormatNV" }, + { &__blue_glCore_glIndexFormatNV, "glIndexFormatNV" }, + { &__blue_glCore_glTexCoordFormatNV, "glTexCoordFormatNV" }, + { &__blue_glCore_glEdgeFlagFormatNV, "glEdgeFlagFormatNV" }, + { &__blue_glCore_glSecondaryColorFormatNV, "glSecondaryColorFormatNV" }, + { &__blue_glCore_glFogCoordFormatNV, "glFogCoordFormatNV" }, + { &__blue_glCore_glVertexAttribFormatNV, "glVertexAttribFormatNV" }, + { &__blue_glCore_glVertexAttribIFormatNV, "glVertexAttribIFormatNV" }, + { &__blue_glCore_glGetIntegerui64i_vNV, "glGetIntegerui64i_vNV" }, + { &__blue_glCore_glAreProgramsResidentNV, "glAreProgramsResidentNV" }, + { &__blue_glCore_glBindProgramNV, "glBindProgramNV" }, + { &__blue_glCore_glDeleteProgramsNV, "glDeleteProgramsNV" }, + { &__blue_glCore_glExecuteProgramNV, "glExecuteProgramNV" }, + { &__blue_glCore_glGenProgramsNV, "glGenProgramsNV" }, + { &__blue_glCore_glGetProgramParameterdvNV, "glGetProgramParameterdvNV" }, { &__blue_glCore_glGetProgramParameterfvNV, "glGetProgramParameterfvNV" }, - { &__blue_glCore_glSpriteParameterivSGIX, "glSpriteParameterivSGIX" }, - { &__blue_glCore_glMultiTexCoord3xvOES, "glMultiTexCoord3xvOES" }, - { &__blue_glCore_glBindBufferRangeNV, "glBindBufferRangeNV" }, - { &__blue_glCore_glMultiTexCoord1sv, "glMultiTexCoord1sv" }, - { &__blue_glCore_glVertexStream1ivATI, "glVertexStream1ivATI" }, - { &__blue_glCore_glGetQueryObjectivARB, "glGetQueryObjectivARB" }, - { &__blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN, "glReplacementCodeuiColor4ubVertex3fvSUN" }, - { &__blue_glCore_glFlushMappedNamedBufferRange, "glFlushMappedNamedBufferRange" }, - { &__blue_glCore_glPointParameteriv, "glPointParameteriv" }, - { &__blue_glCore_glGetTextureLevelParameterivEXT, "glGetTextureLevelParameterivEXT" }, - { &__blue_glCore_glMultiTexEnviEXT, "glMultiTexEnviEXT" }, - { &__blue_glCore_glPolygonOffset, "glPolygonOffset" }, - { &__blue_glCore_glUniform1ui64ARB, "glUniform1ui64ARB" }, - { &__blue_glCore_glDeleteVertexArrays, "glDeleteVertexArrays" }, - { &__blue_glCore_glGetUniformi64vNV, "glGetUniformi64vNV" }, - { &__blue_glCore_glVertexAttribI3iv, "glVertexAttribI3iv" }, - { &__blue_glCore_glEndQueryIndexed, "glEndQueryIndexed" }, - { &__blue_glCore_glTextureSubImage1DEXT, "glTextureSubImage1DEXT" }, + { &__blue_glCore_glGetProgramivNV, "glGetProgramivNV" }, + { &__blue_glCore_glGetProgramStringNV, "glGetProgramStringNV" }, + { &__blue_glCore_glGetTrackMatrixivNV, "glGetTrackMatrixivNV" }, + { &__blue_glCore_glGetVertexAttribdvNV, "glGetVertexAttribdvNV" }, + { &__blue_glCore_glGetVertexAttribfvNV, "glGetVertexAttribfvNV" }, + { &__blue_glCore_glGetVertexAttribivNV, "glGetVertexAttribivNV" }, + { &__blue_glCore_glGetVertexAttribPointervNV, "glGetVertexAttribPointervNV" }, + { &__blue_glCore_glIsProgramNV, "glIsProgramNV" }, + { &__blue_glCore_glLoadProgramNV, "glLoadProgramNV" }, + { &__blue_glCore_glProgramParameter4dNV, "glProgramParameter4dNV" }, + { &__blue_glCore_glProgramParameter4dvNV, "glProgramParameter4dvNV" }, + { &__blue_glCore_glProgramParameter4fNV, "glProgramParameter4fNV" }, + { &__blue_glCore_glProgramParameter4fvNV, "glProgramParameter4fvNV" }, + { &__blue_glCore_glProgramParameters4dvNV, "glProgramParameters4dvNV" }, + { &__blue_glCore_glProgramParameters4fvNV, "glProgramParameters4fvNV" }, + { &__blue_glCore_glRequestResidentProgramsNV, "glRequestResidentProgramsNV" }, + { &__blue_glCore_glTrackMatrixNV, "glTrackMatrixNV" }, + { &__blue_glCore_glVertexAttribPointerNV, "glVertexAttribPointerNV" }, + { &__blue_glCore_glVertexAttrib1dNV, "glVertexAttrib1dNV" }, + { &__blue_glCore_glVertexAttrib1dvNV, "glVertexAttrib1dvNV" }, + { &__blue_glCore_glVertexAttrib1fNV, "glVertexAttrib1fNV" }, + { &__blue_glCore_glVertexAttrib1fvNV, "glVertexAttrib1fvNV" }, + { &__blue_glCore_glVertexAttrib1sNV, "glVertexAttrib1sNV" }, + { &__blue_glCore_glVertexAttrib1svNV, "glVertexAttrib1svNV" }, + { &__blue_glCore_glVertexAttrib2dNV, "glVertexAttrib2dNV" }, + { &__blue_glCore_glVertexAttrib2dvNV, "glVertexAttrib2dvNV" }, + { &__blue_glCore_glVertexAttrib2fNV, "glVertexAttrib2fNV" }, + { &__blue_glCore_glVertexAttrib2fvNV, "glVertexAttrib2fvNV" }, + { &__blue_glCore_glVertexAttrib2sNV, "glVertexAttrib2sNV" }, + { &__blue_glCore_glVertexAttrib2svNV, "glVertexAttrib2svNV" }, + { &__blue_glCore_glVertexAttrib3dNV, "glVertexAttrib3dNV" }, + { &__blue_glCore_glVertexAttrib3dvNV, "glVertexAttrib3dvNV" }, + { &__blue_glCore_glVertexAttrib3fNV, "glVertexAttrib3fNV" }, + { &__blue_glCore_glVertexAttrib3fvNV, "glVertexAttrib3fvNV" }, + { &__blue_glCore_glVertexAttrib3sNV, "glVertexAttrib3sNV" }, + { &__blue_glCore_glVertexAttrib3svNV, "glVertexAttrib3svNV" }, + { &__blue_glCore_glVertexAttrib4dNV, "glVertexAttrib4dNV" }, + { &__blue_glCore_glVertexAttrib4dvNV, "glVertexAttrib4dvNV" }, + { &__blue_glCore_glVertexAttrib4fNV, "glVertexAttrib4fNV" }, + { &__blue_glCore_glVertexAttrib4fvNV, "glVertexAttrib4fvNV" }, + { &__blue_glCore_glVertexAttrib4sNV, "glVertexAttrib4sNV" }, + { &__blue_glCore_glVertexAttrib4svNV, "glVertexAttrib4svNV" }, + { &__blue_glCore_glVertexAttrib4ubNV, "glVertexAttrib4ubNV" }, + { &__blue_glCore_glVertexAttrib4ubvNV, "glVertexAttrib4ubvNV" }, + { &__blue_glCore_glVertexAttribs1dvNV, "glVertexAttribs1dvNV" }, + { &__blue_glCore_glVertexAttribs1fvNV, "glVertexAttribs1fvNV" }, + { &__blue_glCore_glVertexAttribs1svNV, "glVertexAttribs1svNV" }, + { &__blue_glCore_glVertexAttribs2dvNV, "glVertexAttribs2dvNV" }, + { &__blue_glCore_glVertexAttribs2fvNV, "glVertexAttribs2fvNV" }, + { &__blue_glCore_glVertexAttribs2svNV, "glVertexAttribs2svNV" }, + { &__blue_glCore_glVertexAttribs3dvNV, "glVertexAttribs3dvNV" }, + { &__blue_glCore_glVertexAttribs3fvNV, "glVertexAttribs3fvNV" }, + { &__blue_glCore_glVertexAttribs3svNV, "glVertexAttribs3svNV" }, + { &__blue_glCore_glVertexAttribs4dvNV, "glVertexAttribs4dvNV" }, + { &__blue_glCore_glVertexAttribs4fvNV, "glVertexAttribs4fvNV" }, + { &__blue_glCore_glVertexAttribs4svNV, "glVertexAttribs4svNV" }, + { &__blue_glCore_glVertexAttribs4ubvNV, "glVertexAttribs4ubvNV" }, + { &__blue_glCore_glVertexAttribI1iEXT, "glVertexAttribI1iEXT" }, + { &__blue_glCore_glVertexAttribI2iEXT, "glVertexAttribI2iEXT" }, + { &__blue_glCore_glVertexAttribI3iEXT, "glVertexAttribI3iEXT" }, + { &__blue_glCore_glVertexAttribI4iEXT, "glVertexAttribI4iEXT" }, + { &__blue_glCore_glVertexAttribI1uiEXT, "glVertexAttribI1uiEXT" }, + { &__blue_glCore_glVertexAttribI2uiEXT, "glVertexAttribI2uiEXT" }, + { &__blue_glCore_glVertexAttribI3uiEXT, "glVertexAttribI3uiEXT" }, + { &__blue_glCore_glVertexAttribI4uiEXT, "glVertexAttribI4uiEXT" }, + { &__blue_glCore_glVertexAttribI1ivEXT, "glVertexAttribI1ivEXT" }, + { &__blue_glCore_glVertexAttribI2ivEXT, "glVertexAttribI2ivEXT" }, + { &__blue_glCore_glVertexAttribI3ivEXT, "glVertexAttribI3ivEXT" }, + { &__blue_glCore_glVertexAttribI4ivEXT, "glVertexAttribI4ivEXT" }, + { &__blue_glCore_glVertexAttribI1uivEXT, "glVertexAttribI1uivEXT" }, + { &__blue_glCore_glVertexAttribI2uivEXT, "glVertexAttribI2uivEXT" }, + { &__blue_glCore_glVertexAttribI3uivEXT, "glVertexAttribI3uivEXT" }, + { &__blue_glCore_glVertexAttribI4uivEXT, "glVertexAttribI4uivEXT" }, + { &__blue_glCore_glVertexAttribI4bvEXT, "glVertexAttribI4bvEXT" }, + { &__blue_glCore_glVertexAttribI4svEXT, "glVertexAttribI4svEXT" }, { &__blue_glCore_glVertexAttribI4ubvEXT, "glVertexAttribI4ubvEXT" }, - { &__blue_glCore_glVertexAttribP4ui, "glVertexAttribP4ui" }, - { &__blue_glCore_glNamedProgramLocalParameter4dvEXT, "glNamedProgramLocalParameter4dvEXT" }, - { &__blue_glCore_glGetNamedProgramLocalParameterIuivEXT, "glGetNamedProgramLocalParameterIuivEXT" }, + { &__blue_glCore_glVertexAttribI4usvEXT, "glVertexAttribI4usvEXT" }, + { &__blue_glCore_glVertexAttribIPointerEXT, "glVertexAttribIPointerEXT" }, + { &__blue_glCore_glGetVertexAttribIivEXT, "glGetVertexAttribIivEXT" }, + { &__blue_glCore_glGetVertexAttribIuivEXT, "glGetVertexAttribIuivEXT" }, + { &__blue_glCore_glBeginVideoCaptureNV, "glBeginVideoCaptureNV" }, + { &__blue_glCore_glBindVideoCaptureStreamBufferNV, "glBindVideoCaptureStreamBufferNV" }, + { &__blue_glCore_glBindVideoCaptureStreamTextureNV, "glBindVideoCaptureStreamTextureNV" }, + { &__blue_glCore_glEndVideoCaptureNV, "glEndVideoCaptureNV" }, + { &__blue_glCore_glGetVideoCaptureivNV, "glGetVideoCaptureivNV" }, + { &__blue_glCore_glGetVideoCaptureStreamivNV, "glGetVideoCaptureStreamivNV" }, + { &__blue_glCore_glGetVideoCaptureStreamfvNV, "glGetVideoCaptureStreamfvNV" }, + { &__blue_glCore_glGetVideoCaptureStreamdvNV, "glGetVideoCaptureStreamdvNV" }, + { &__blue_glCore_glVideoCaptureNV, "glVideoCaptureNV" }, + { &__blue_glCore_glVideoCaptureStreamParameterivNV, "glVideoCaptureStreamParameterivNV" }, + { &__blue_glCore_glVideoCaptureStreamParameterfvNV, "glVideoCaptureStreamParameterfvNV" }, + { &__blue_glCore_glVideoCaptureStreamParameterdvNV, "glVideoCaptureStreamParameterdvNV" }, + { &__blue_glCore_glFramebufferTextureMultiviewOVR, "glFramebufferTextureMultiviewOVR" }, + { &__blue_glCore_glHintPGI, "glHintPGI" }, + { &__blue_glCore_glDetailTexFuncSGIS, "glDetailTexFuncSGIS" }, + { &__blue_glCore_glGetDetailTexFuncSGIS, "glGetDetailTexFuncSGIS" }, + { &__blue_glCore_glFogFuncSGIS, "glFogFuncSGIS" }, + { &__blue_glCore_glGetFogFuncSGIS, "glGetFogFuncSGIS" }, + { &__blue_glCore_glSampleMaskSGIS, "glSampleMaskSGIS" }, + { &__blue_glCore_glSamplePatternSGIS, "glSamplePatternSGIS" }, + { &__blue_glCore_glPixelTexGenParameteriSGIS, "glPixelTexGenParameteriSGIS" }, + { &__blue_glCore_glPixelTexGenParameterivSGIS, "glPixelTexGenParameterivSGIS" }, + { &__blue_glCore_glPixelTexGenParameterfSGIS, "glPixelTexGenParameterfSGIS" }, + { &__blue_glCore_glPixelTexGenParameterfvSGIS, "glPixelTexGenParameterfvSGIS" }, { &__blue_glCore_glGetPixelTexGenParameterivSGIS, "glGetPixelTexGenParameterivSGIS" }, - { &__blue_glCore_glGetnMapdv, "glGetnMapdv" }, - { &__blue_glCore_glMultiTexCoord4svARB, "glMultiTexCoord4svARB" }, - { &__blue_glCore_glVertexStream2ivATI, "glVertexStream2ivATI" }, - { &__blue_glCore_glUniform4uivEXT, "glUniform4uivEXT" }, - { &__blue_glCore_glGetPointeri_vEXT, "glGetPointeri_vEXT" }, - { &__blue_glCore_glClearTexImage, "glClearTexImage" }, - { &__blue_glCore_glVertexAttribP1ui, "glVertexAttribP1ui" }, - { &__blue_glCore_glCompressedTexImage1DARB, "glCompressedTexImage1DARB" }, - { &__blue_glCore_glTextureStorage1DEXT, "glTextureStorage1DEXT" }, - { &__blue_glCore_glUniform4fvARB, "glUniform4fvARB" }, - { &__blue_glCore_glFramebufferTexture3DEXT, "glFramebufferTexture3DEXT" }, - { &__blue_glCore_glDrawElementsIndirect, "glDrawElementsIndirect" }, - { &__blue_glCore_glBindBufferBaseEXT, "glBindBufferBaseEXT" }, + { &__blue_glCore_glGetPixelTexGenParameterfvSGIS, "glGetPixelTexGenParameterfvSGIS" }, + { &__blue_glCore_glPointParameterfSGIS, "glPointParameterfSGIS" }, + { &__blue_glCore_glPointParameterfvSGIS, "glPointParameterfvSGIS" }, + { &__blue_glCore_glSharpenTexFuncSGIS, "glSharpenTexFuncSGIS" }, + { &__blue_glCore_glGetSharpenTexFuncSGIS, "glGetSharpenTexFuncSGIS" }, + { &__blue_glCore_glTexImage4DSGIS, "glTexImage4DSGIS" }, + { &__blue_glCore_glTexSubImage4DSGIS, "glTexSubImage4DSGIS" }, + { &__blue_glCore_glTextureColorMaskSGIS, "glTextureColorMaskSGIS" }, + { &__blue_glCore_glGetTexFilterFuncSGIS, "glGetTexFilterFuncSGIS" }, + { &__blue_glCore_glTexFilterFuncSGIS, "glTexFilterFuncSGIS" }, + { &__blue_glCore_glAsyncMarkerSGIX, "glAsyncMarkerSGIX" }, + { &__blue_glCore_glFinishAsyncSGIX, "glFinishAsyncSGIX" }, + { &__blue_glCore_glPollAsyncSGIX, "glPollAsyncSGIX" }, + { &__blue_glCore_glGenAsyncMarkersSGIX, "glGenAsyncMarkersSGIX" }, + { &__blue_glCore_glDeleteAsyncMarkersSGIX, "glDeleteAsyncMarkersSGIX" }, + { &__blue_glCore_glIsAsyncMarkerSGIX, "glIsAsyncMarkerSGIX" }, + { &__blue_glCore_glFlushRasterSGIX, "glFlushRasterSGIX" }, + { &__blue_glCore_glFragmentColorMaterialSGIX, "glFragmentColorMaterialSGIX" }, + { &__blue_glCore_glFragmentLightfSGIX, "glFragmentLightfSGIX" }, + { &__blue_glCore_glFragmentLightfvSGIX, "glFragmentLightfvSGIX" }, + { &__blue_glCore_glFragmentLightiSGIX, "glFragmentLightiSGIX" }, + { &__blue_glCore_glFragmentLightivSGIX, "glFragmentLightivSGIX" }, + { &__blue_glCore_glFragmentLightModelfSGIX, "glFragmentLightModelfSGIX" }, + { &__blue_glCore_glFragmentLightModelfvSGIX, "glFragmentLightModelfvSGIX" }, + { &__blue_glCore_glFragmentLightModeliSGIX, "glFragmentLightModeliSGIX" }, + { &__blue_glCore_glFragmentLightModelivSGIX, "glFragmentLightModelivSGIX" }, + { &__blue_glCore_glFragmentMaterialfSGIX, "glFragmentMaterialfSGIX" }, + { &__blue_glCore_glFragmentMaterialfvSGIX, "glFragmentMaterialfvSGIX" }, + { &__blue_glCore_glFragmentMaterialiSGIX, "glFragmentMaterialiSGIX" }, + { &__blue_glCore_glFragmentMaterialivSGIX, "glFragmentMaterialivSGIX" }, + { &__blue_glCore_glGetFragmentLightfvSGIX, "glGetFragmentLightfvSGIX" }, + { &__blue_glCore_glGetFragmentLightivSGIX, "glGetFragmentLightivSGIX" }, + { &__blue_glCore_glGetFragmentMaterialfvSGIX, "glGetFragmentMaterialfvSGIX" }, + { &__blue_glCore_glGetFragmentMaterialivSGIX, "glGetFragmentMaterialivSGIX" }, + { &__blue_glCore_glLightEnviSGIX, "glLightEnviSGIX" }, + { &__blue_glCore_glFrameZoomSGIX, "glFrameZoomSGIX" }, { &__blue_glCore_glIglooInterfaceSGIX, "glIglooInterfaceSGIX" }, - { &__blue_glCore_glMinmaxEXT, "glMinmaxEXT" }, - { &__blue_glCore_glClearDepthf, "glClearDepthf" }, - { &__blue_glCore_glReadnPixels, "glReadnPixels" }, - { &__blue_glCore_glGenerateTextureMipmap, "glGenerateTextureMipmap" }, - { &__blue_glCore_glGetnPixelMapuivARB, "glGetnPixelMapuivARB" }, - { &__blue_glCore_glProgramLocalParameter4fARB, "glProgramLocalParameter4fARB" }, - { &__blue_glCore_glVertexAttribL1dvEXT, "glVertexAttribL1dvEXT" }, - { &__blue_glCore_glBeginTransformFeedback, "glBeginTransformFeedback" }, - { &__blue_glCore_glDepthBoundsEXT, "glDepthBoundsEXT" }, - { &__blue_glCore_glVertexAttrib2f, "glVertexAttrib2f" }, - { &__blue_glCore_glProgramEnvParametersI4ivNV, "glProgramEnvParametersI4ivNV" }, - { &__blue_glCore_glTexCoord4fVertex4fSUN, "glTexCoord4fVertex4fSUN" }, - { &__blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN, "glReplacementCodeuiColor4fNormal3fVertex3fvSUN" }, - { &__blue_glCore_glGetNamedProgramLocalParameterfvEXT, "glGetNamedProgramLocalParameterfvEXT" }, - { &__blue_glCore_glProgramUniform1ui64ARB, "glProgramUniform1ui64ARB" }, + { &__blue_glCore_glGetInstrumentsSGIX, "glGetInstrumentsSGIX" }, + { &__blue_glCore_glInstrumentsBufferSGIX, "glInstrumentsBufferSGIX" }, + { &__blue_glCore_glPollInstrumentsSGIX, "glPollInstrumentsSGIX" }, { &__blue_glCore_glReadInstrumentsSGIX, "glReadInstrumentsSGIX" }, - { &__blue_glCore_glVertexAttrib3dNV, "glVertexAttrib3dNV" }, - { &__blue_glCore_glProgramParameter4dvNV, "glProgramParameter4dvNV" }, + { &__blue_glCore_glStartInstrumentsSGIX, "glStartInstrumentsSGIX" }, + { &__blue_glCore_glStopInstrumentsSGIX, "glStopInstrumentsSGIX" }, + { &__blue_glCore_glGetListParameterfvSGIX, "glGetListParameterfvSGIX" }, + { &__blue_glCore_glGetListParameterivSGIX, "glGetListParameterivSGIX" }, + { &__blue_glCore_glListParameterfSGIX, "glListParameterfSGIX" }, + { &__blue_glCore_glListParameterfvSGIX, "glListParameterfvSGIX" }, + { &__blue_glCore_glListParameteriSGIX, "glListParameteriSGIX" }, + { &__blue_glCore_glListParameterivSGIX, "glListParameterivSGIX" }, + { &__blue_glCore_glPixelTexGenSGIX, "glPixelTexGenSGIX" }, + { &__blue_glCore_glDeformationMap3dSGIX, "glDeformationMap3dSGIX" }, + { &__blue_glCore_glDeformationMap3fSGIX, "glDeformationMap3fSGIX" }, + { &__blue_glCore_glDeformSGIX, "glDeformSGIX" }, + { &__blue_glCore_glLoadIdentityDeformationMapSGIX, "glLoadIdentityDeformationMapSGIX" }, + { &__blue_glCore_glReferencePlaneSGIX, "glReferencePlaneSGIX" }, + { &__blue_glCore_glSpriteParameterfSGIX, "glSpriteParameterfSGIX" }, + { &__blue_glCore_glSpriteParameterfvSGIX, "glSpriteParameterfvSGIX" }, + { &__blue_glCore_glSpriteParameteriSGIX, "glSpriteParameteriSGIX" }, + { &__blue_glCore_glSpriteParameterivSGIX, "glSpriteParameterivSGIX" }, + { &__blue_glCore_glTagSampleBufferSGIX, "glTagSampleBufferSGIX" }, + { &__blue_glCore_glColorTableSGI, "glColorTableSGI" }, + { &__blue_glCore_glColorTableParameterfvSGI, "glColorTableParameterfvSGI" }, { &__blue_glCore_glColorTableParameterivSGI, "glColorTableParameterivSGI" }, - { &__blue_glCore_glUniform1f, "glUniform1f" }, - { &__blue_glCore_glMultiTexRenderbufferEXT, "glMultiTexRenderbufferEXT" }, - { &__blue_glCore_glVertexAttribI4uiEXT, "glVertexAttribI4uiEXT" }, - { &__blue_glCore_glGetConvolutionParameterfv, "glGetConvolutionParameterfv" }, - { &__blue_glCore_glMultiTexCoord3sARB, "glMultiTexCoord3sARB" }, - { &__blue_glCore_glGetTexParameterxvOES, "glGetTexParameterxvOES" }, - { &__blue_glCore_glGetNamedBufferParameteriv, "glGetNamedBufferParameteriv" }, - { &__blue_glCore_glMultiDrawElementArrayAPPLE, "glMultiDrawElementArrayAPPLE" }, - { &__blue_glCore_glGetnConvolutionFilter, "glGetnConvolutionFilter" }, - { &__blue_glCore_glUniformMatrix2x3fv, "glUniformMatrix2x3fv" }, - { &__blue_glCore_glBindBuffersRange, "glBindBuffersRange" }, - { &__blue_glCore_glMakeImageHandleNonResidentNV, "glMakeImageHandleNonResidentNV" }, - { &__blue_glCore_glFinalCombinerInputNV, "glFinalCombinerInputNV" }, - { &__blue_glCore_glFlush, "glFlush" }, - { &__blue_glCore_glVertexArrayElementBuffer, "glVertexArrayElementBuffer" }, - { &__blue_glCore_glProgramUniform4uiEXT, "glProgramUniform4uiEXT" }, - { &__blue_glCore_glVertexAttrib4ubvNV, "glVertexAttrib4ubvNV" }, - { &__blue_glCore_glSampleMapATI, "glSampleMapATI" }, - { &__blue_glCore_glMultiTexCoord1bOES, "glMultiTexCoord1bOES" }, - { &__blue_glCore_glVertexAttribParameteriAMD, "glVertexAttribParameteriAMD" }, - { &__blue_glCore_glPointParameterfARB, "glPointParameterfARB" }, - { &__blue_glCore_glWindowPos2dMESA, "glWindowPos2dMESA" }, + { &__blue_glCore_glCopyColorTableSGI, "glCopyColorTableSGI" }, + { &__blue_glCore_glGetColorTableSGI, "glGetColorTableSGI" }, + { &__blue_glCore_glGetColorTableParameterfvSGI, "glGetColorTableParameterfvSGI" }, + { &__blue_glCore_glGetColorTableParameterivSGI, "glGetColorTableParameterivSGI" }, + { &__blue_glCore_glFinishTextureSUNX, "glFinishTextureSUNX" }, + { &__blue_glCore_glGlobalAlphaFactorbSUN, "glGlobalAlphaFactorbSUN" }, + { &__blue_glCore_glGlobalAlphaFactorsSUN, "glGlobalAlphaFactorsSUN" }, + { &__blue_glCore_glGlobalAlphaFactoriSUN, "glGlobalAlphaFactoriSUN" }, + { &__blue_glCore_glGlobalAlphaFactorfSUN, "glGlobalAlphaFactorfSUN" }, + { &__blue_glCore_glGlobalAlphaFactordSUN, "glGlobalAlphaFactordSUN" }, + { &__blue_glCore_glGlobalAlphaFactorubSUN, "glGlobalAlphaFactorubSUN" }, + { &__blue_glCore_glGlobalAlphaFactorusSUN, "glGlobalAlphaFactorusSUN" }, + { &__blue_glCore_glGlobalAlphaFactoruiSUN, "glGlobalAlphaFactoruiSUN" }, + { &__blue_glCore_glDrawMeshArraysSUN, "glDrawMeshArraysSUN" }, + { &__blue_glCore_glReplacementCodeuiSUN, "glReplacementCodeuiSUN" }, + { &__blue_glCore_glReplacementCodeusSUN, "glReplacementCodeusSUN" }, + { &__blue_glCore_glReplacementCodeubSUN, "glReplacementCodeubSUN" }, + { &__blue_glCore_glReplacementCodeuivSUN, "glReplacementCodeuivSUN" }, + { &__blue_glCore_glReplacementCodeusvSUN, "glReplacementCodeusvSUN" }, + { &__blue_glCore_glReplacementCodeubvSUN, "glReplacementCodeubvSUN" }, + { &__blue_glCore_glReplacementCodePointerSUN, "glReplacementCodePointerSUN" }, + { &__blue_glCore_glColor4ubVertex2fSUN, "glColor4ubVertex2fSUN" }, + { &__blue_glCore_glColor4ubVertex2fvSUN, "glColor4ubVertex2fvSUN" }, + { &__blue_glCore_glColor4ubVertex3fSUN, "glColor4ubVertex3fSUN" }, + { &__blue_glCore_glColor4ubVertex3fvSUN, "glColor4ubVertex3fvSUN" }, + { &__blue_glCore_glColor3fVertex3fSUN, "glColor3fVertex3fSUN" }, + { &__blue_glCore_glColor3fVertex3fvSUN, "glColor3fVertex3fvSUN" }, + { &__blue_glCore_glNormal3fVertex3fSUN, "glNormal3fVertex3fSUN" }, + { &__blue_glCore_glNormal3fVertex3fvSUN, "glNormal3fVertex3fvSUN" }, + { &__blue_glCore_glColor4fNormal3fVertex3fSUN, "glColor4fNormal3fVertex3fSUN" }, + { &__blue_glCore_glColor4fNormal3fVertex3fvSUN, "glColor4fNormal3fVertex3fvSUN" }, + { &__blue_glCore_glTexCoord2fVertex3fSUN, "glTexCoord2fVertex3fSUN" }, + { &__blue_glCore_glTexCoord2fVertex3fvSUN, "glTexCoord2fVertex3fvSUN" }, + { &__blue_glCore_glTexCoord4fVertex4fSUN, "glTexCoord4fVertex4fSUN" }, + { &__blue_glCore_glTexCoord4fVertex4fvSUN, "glTexCoord4fVertex4fvSUN" }, + { &__blue_glCore_glTexCoord2fColor4ubVertex3fSUN, "glTexCoord2fColor4ubVertex3fSUN" }, + { &__blue_glCore_glTexCoord2fColor4ubVertex3fvSUN, "glTexCoord2fColor4ubVertex3fvSUN" }, + { &__blue_glCore_glTexCoord2fColor3fVertex3fSUN, "glTexCoord2fColor3fVertex3fSUN" }, + { &__blue_glCore_glTexCoord2fColor3fVertex3fvSUN, "glTexCoord2fColor3fVertex3fvSUN" }, + { &__blue_glCore_glTexCoord2fNormal3fVertex3fSUN, "glTexCoord2fNormal3fVertex3fSUN" }, + { &__blue_glCore_glTexCoord2fNormal3fVertex3fvSUN, "glTexCoord2fNormal3fVertex3fvSUN" }, + { &__blue_glCore_glTexCoord2fColor4fNormal3fVertex3fSUN, "glTexCoord2fColor4fNormal3fVertex3fSUN" }, + { &__blue_glCore_glTexCoord2fColor4fNormal3fVertex3fvSUN, "glTexCoord2fColor4fNormal3fVertex3fvSUN" }, + { &__blue_glCore_glTexCoord4fColor4fNormal3fVertex4fSUN, "glTexCoord4fColor4fNormal3fVertex4fSUN" }, + { &__blue_glCore_glTexCoord4fColor4fNormal3fVertex4fvSUN, "glTexCoord4fColor4fNormal3fVertex4fvSUN" }, + { &__blue_glCore_glReplacementCodeuiVertex3fSUN, "glReplacementCodeuiVertex3fSUN" }, + { &__blue_glCore_glReplacementCodeuiVertex3fvSUN, "glReplacementCodeuiVertex3fvSUN" }, + { &__blue_glCore_glReplacementCodeuiColor4ubVertex3fSUN, "glReplacementCodeuiColor4ubVertex3fSUN" }, + { &__blue_glCore_glReplacementCodeuiColor4ubVertex3fvSUN, "glReplacementCodeuiColor4ubVertex3fvSUN" }, + { &__blue_glCore_glReplacementCodeuiColor3fVertex3fSUN, "glReplacementCodeuiColor3fVertex3fSUN" }, + { &__blue_glCore_glReplacementCodeuiColor3fVertex3fvSUN, "glReplacementCodeuiColor3fVertex3fvSUN" }, + { &__blue_glCore_glReplacementCodeuiNormal3fVertex3fSUN, "glReplacementCodeuiNormal3fVertex3fSUN" }, + { &__blue_glCore_glReplacementCodeuiNormal3fVertex3fvSUN, "glReplacementCodeuiNormal3fVertex3fvSUN" }, + { &__blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fSUN, "glReplacementCodeuiColor4fNormal3fVertex3fSUN" }, + { &__blue_glCore_glReplacementCodeuiColor4fNormal3fVertex3fvSUN, "glReplacementCodeuiColor4fNormal3fVertex3fvSUN" }, + { &__blue_glCore_glReplacementCodeuiTexCoord2fVertex3fSUN, "glReplacementCodeuiTexCoord2fVertex3fSUN" }, + { &__blue_glCore_glReplacementCodeuiTexCoord2fVertex3fvSUN, "glReplacementCodeuiTexCoord2fVertex3fvSUN" }, + { &__blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN, "glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN" }, + { &__blue_glCore_glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN, "glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN" }, + { &__blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN, "glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN" }, + { &__blue_glCore_glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN, "glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN" }, }; size_t blueCoreNumFunctions = 2574; } // namespace bluegl \ No newline at end of file diff --git a/libs/bluevk/include/bluevk/BlueVK.h b/libs/bluevk/include/bluevk/BlueVK.h index a57c528a254..4fb61191a32 100644 --- a/libs/bluevk/include/bluevk/BlueVK.h +++ b/libs/bluevk/include/bluevk/BlueVK.h @@ -40,7 +40,7 @@ #if defined(__ANDROID__) #define VK_USE_PLATFORM_ANDROID_KHR 1 - #elif defined(IOS) + #elif defined(FILAMENT_IOS) #define VK_USE_PLATFORM_IOS_MVK 1 #elif defined(__linux__) #if defined(FILAMENT_SUPPORTS_XCB) diff --git a/libs/bluevk/src/BlueVKDarwin.cpp b/libs/bluevk/src/BlueVKDarwin.cpp index 69c446f78e8..c070bf00c04 100644 --- a/libs/bluevk/src/BlueVKDarwin.cpp +++ b/libs/bluevk/src/BlueVKDarwin.cpp @@ -31,10 +31,9 @@ bool loadLibrary() { #endif module = dlopen(dylibPath, RTLD_NOW | RTLD_LOCAL); - ASSERT_POSTCONDITION(module != nullptr, - "BlueVK is unable to load entry points: %s.\n" - "Install the LunarG SDK with 'System Global Installation' and reboot.\n", - dlerror()); + FILAMENT_CHECK_POSTCONDITION(module != nullptr) + << "BlueVK is unable to load entry points: " << dlerror() << ".\n" + "Install the LunarG SDK with 'System Global Installation' and reboot.\n"; return module != nullptr; } diff --git a/libs/camutils/CMakeLists.txt b/libs/camutils/CMakeLists.txt index 60a67fbafbb..541261c1aae 100644 --- a/libs/camutils/CMakeLists.txt +++ b/libs/camutils/CMakeLists.txt @@ -37,9 +37,7 @@ set_target_properties(${TARGET} PROPERTIES FOLDER Libs) # Compiler flags # ================================================================================================== if (MSVC) - target_compile_options(${TARGET} PRIVATE $<$:/fp:fast>) else() - target_compile_options(${TARGET} PRIVATE $<$:-ffast-math>) target_compile_options(${TARGET} PRIVATE -Wno-deprecated-register) endif() diff --git a/libs/camutils/include/camutils/Manipulator.h b/libs/camutils/include/camutils/Manipulator.h index 2cc8a4da03a..5ea49eaf5ae 100644 --- a/libs/camutils/include/camutils/Manipulator.h +++ b/libs/camutils/include/camutils/Manipulator.h @@ -109,6 +109,7 @@ class CAMUTILS_PUBLIC Manipulator { vec4 groundPlane; RayCallback raycastCallback; void* raycastUserdata; + bool panning = true; }; struct Builder { @@ -143,6 +144,8 @@ class CAMUTILS_PUBLIC Manipulator { Builder& groundPlane(FLOAT a, FLOAT b, FLOAT c, FLOAT d); //! Plane equation used as a raycast fallback Builder& raycastCallback(RayCallback cb, void* userdata); //! Raycast function for accurate grab-and-pan + Builder& panning(bool enabled); //! Sets whether panning is enabled + /** * Creates a new camera manipulator, either ORBIT, MAP, or FREE_FLIGHT. * diff --git a/libs/camutils/src/FreeFlightManipulator.h b/libs/camutils/src/FreeFlightManipulator.h index 1df4dd56f73..e700713ee98 100644 --- a/libs/camutils/src/FreeFlightManipulator.h +++ b/libs/camutils/src/FreeFlightManipulator.h @@ -24,6 +24,7 @@ #include #include +#include #include namespace filament { @@ -121,50 +122,90 @@ class FreeFlightManipulator : public Manipulator { } void update(FLOAT deltaTime) override { - vec3 forceLocal { 0.0, 0.0, 0.0 }; - if (mKeyDown[(int) Base::Key::FORWARD]) { - forceLocal += vec3{ 0.0, 0.0, -1.0 }; - } - if (mKeyDown[(int) Base::Key::LEFT]) { - forceLocal += vec3{ -1.0, 0.0, 0.0 }; - } - if (mKeyDown[(int) Base::Key::BACKWARD]) { - forceLocal += vec3{ 0.0, 0.0, 1.0 }; - } - if (mKeyDown[(int) Base::Key::RIGHT]) { - forceLocal += vec3{ 1.0, 0.0, 0.0 }; - } - - const mat4 orientation = mat4::lookAt(Base::mEye, Base::mTarget, Base::mProps.upVector); - vec3 forceWorld = (orientation * vec4{ forceLocal, 0.0f }).xyz; - - if (mKeyDown[(int) Base::Key::UP]) { - forceWorld += vec3{ 0.0, 1.0, 0.0 }; - } - if (mKeyDown[(int) Base::Key::DOWN]) { - forceWorld += vec3{ 0.0, -1.0, 0.0 }; - } - - forceWorld *= mMoveSpeed; - - const auto dampingFactor = Base::mProps.flightMoveDamping; + auto getLocalDirection = [this]() -> vec3 { + vec3 directionLocal{ 0.0, 0.0, 0.0 }; + if (mKeyDown[(int)Base::Key::FORWARD]) { + directionLocal += vec3{ 0.0, 0.0, -1.0 }; + } + if (mKeyDown[(int)Base::Key::LEFT]) { + directionLocal += vec3{ -1.0, 0.0, 0.0 }; + } + if (mKeyDown[(int)Base::Key::BACKWARD]) { + directionLocal += vec3{ 0.0, 0.0, 1.0 }; + } + if (mKeyDown[(int)Base::Key::RIGHT]) { + directionLocal += vec3{ 1.0, 0.0, 0.0 }; + } + return directionLocal; + }; + + auto getWorldDirection = [this](vec3 directionLocal) -> vec3 { + const mat4 orientation = mat4::lookAt(Base::mEye, Base::mTarget, Base::mProps.upVector); + vec3 directionWorld = (orientation * vec4{ directionLocal, 0.0f }).xyz; + if (mKeyDown[(int)Base::Key::UP]) { + directionWorld += vec3{ 0.0, 1.0, 0.0 }; + } + if (mKeyDown[(int)Base::Key::DOWN]) { + directionWorld += vec3{ 0.0, -1.0, 0.0 }; + } + return directionWorld; + }; + + vec3 const localDirection = getLocalDirection(); + vec3 const worldDirection = getWorldDirection(localDirection); + + // unit of dampingFactor is [1/s] + FLOAT const dampingFactor = Base::mProps.flightMoveDamping; if (dampingFactor == 0.0) { // Without damping, we simply treat the force as our velocity. - mEyeVelocity = forceWorld; + vec3 const speed = worldDirection * mMoveSpeed; + mEyeVelocity = speed; + vec3 const positionDelta = mEyeVelocity * deltaTime; + Base::mEye += positionDelta; + Base::mTarget += positionDelta; } else { - // The dampingFactor acts as "friction", which acts upon the camera in the direction - // opposite its velocity. - // Force is also multiplied by the dampingFactor, to "make up" for the friction. - // This ensures that the max velocity still approaches mMoveSpeed; - vec3 velocityDelta = (forceWorld - mEyeVelocity) * dampingFactor; - mEyeVelocity += velocityDelta * deltaTime; + auto dt = deltaTime / 16.0; + for (size_t i = 0; i < 16; i++) { + // Note: the algorithm below doesn't work well for large time steps because + // we're not using a closed form for updating the position, so we need + // to loop a few times. We could make this better by having a dynamic + // loop count. What we're really doing is evaluation the solution to + // a differential equation numerically. + + // Kinetic friction is a force opposing velocity and proportional to it.: + // F = -kv + // F = ma + // ==> ma = -kv + // a = -vk/m [m.s^-2] = [m/s] * [Kg/s] / [Kg] + // ==> dampingFactor = k/m [1/s] = [Kg/s] / [Kg] + // + // The velocity update for dt due to friction is then: + // v = v + a.dt + // = v - v * dampingFactor * dt + // = v * (1.0 - dampingFactor * dt) + mEyeVelocity = mEyeVelocity * saturate(1.0 - dampingFactor * dt); + + // We also undergo an acceleration proportional to the distance to the target speed + // (the closer we are the less we accelerate, similar to a car). + // F = k * (target_v - v) + // F = ma + // ==> ma = k * (target_v - v) + // a = k/m * (target_v - v) [m.s^-2] = [Kg/s] / [Kg] * [m/s] + // + // The velocity update for dt due to the acceleration (the gas basically) is then: + // v = v + a.dt + // = v + k/m * (target_v - v).dt + // We're using the same dampingFactor here, but we don't have to. + auto const accelerationFactor = dampingFactor; + vec3 const acceleration = worldDirection * + (accelerationFactor * std::max(mMoveSpeed - length(mEyeVelocity), FLOAT(0))); + mEyeVelocity += acceleration * dt; + vec3 const positionDelta = mEyeVelocity * dt; + Base::mEye += positionDelta; + Base::mTarget += positionDelta; + } } - - const vec3 positionDelta = mEyeVelocity * deltaTime; - - Base::mEye += positionDelta; - Base::mTarget += positionDelta; } Bookmark getCurrentBookmark() const override { @@ -185,6 +226,8 @@ class FreeFlightManipulator : public Manipulator { void jumpToBookmark(const Bookmark& bookmark) override { Base::mEye = bookmark.flight.position; + mTargetEuler.x = bookmark.flight.pitch; + mTargetEuler.y = bookmark.flight.yaw; updateTarget(bookmark.flight.pitch, bookmark.flight.yaw); } diff --git a/libs/camutils/src/Manipulator.cpp b/libs/camutils/src/Manipulator.cpp index d44528cd505..897d75c6d1e 100644 --- a/libs/camutils/src/Manipulator.cpp +++ b/libs/camutils/src/Manipulator.cpp @@ -144,6 +144,14 @@ Manipulator::Builder& Manipulator::Builder::raycastCallback(RayCal return *this; } + + +template typename +Manipulator::Builder& Manipulator::Builder::panning(bool enabled) { + details.panning = enabled; + return *this; +} + template Manipulator* Manipulator::Builder::build(Mode mode) { switch (mode) { diff --git a/libs/camutils/src/OrbitManipulator.h b/libs/camutils/src/OrbitManipulator.h index 54e325cc3b4..f89b7ada033 100644 --- a/libs/camutils/src/OrbitManipulator.h +++ b/libs/camutils/src/OrbitManipulator.h @@ -69,7 +69,7 @@ class OrbitManipulator : public Manipulator { } void grabBegin(int x, int y, bool strafe) override { - mGrabState = strafe ? PANNING : ORBITING; + mGrabState = strafe && Base::mProps.panning ? PANNING : ORBITING; mGrabPivot = mPivot; mGrabEye = Base::mEye; mGrabTarget = Base::mTarget; diff --git a/libs/fgviewer/CMakeLists.txt b/libs/fgviewer/CMakeLists.txt new file mode 100644 index 00000000000..892232f433a --- /dev/null +++ b/libs/fgviewer/CMakeLists.txt @@ -0,0 +1,73 @@ +cmake_minimum_required(VERSION 3.19) +project(fgviewer C ASM) + +set(TARGET fgviewer) +set(PUBLIC_HDR_DIR include) + +if (CMAKE_CROSSCOMPILING) + include(${IMPORT_EXECUTABLES}) +endif() + +# ================================================================================================== +# Sources and headers +# ================================================================================================== + +set(PUBLIC_HDRS + include/fgviewer/DebugServer.h + include/fgviewer/JsonWriter.h + include/fgviewer/FrameGraphInfo.h +) + +set(SRCS + src/ApiHandler.cpp + src/ApiHandler.h + src/DebugServer.cpp + src/FrameGraphInfo.cpp +) + +# ================================================================================================== +# Include and target definitions +# ================================================================================================== + +include_directories(${PUBLIC_HDR_DIR}) + +add_library(${TARGET} STATIC ${PUBLIC_HDRS} ${SRCS}) + +target_link_libraries(${TARGET} PUBLIC + civetweb + utils +) + +target_include_directories(${TARGET} PRIVATE ${filamat_SOURCE_DIR}/src) + +target_include_directories(${TARGET} PUBLIC ${PUBLIC_HDR_DIR}) +set_target_properties(${TARGET} PROPERTIES FOLDER Libs) + +# ================================================================================================== +# Compiler flags +# ================================================================================================== + +if (MSVC) +else() + target_compile_options(${TARGET} PRIVATE -Wno-deprecated-register) +endif() + +# ================================================================================================== +# Installation +# ================================================================================================== + +# matdbg has dependencies on non-installed libraries. Here we bundle them all together into a single +# library that gets copied into the installation folder so users are only required to link against +# matdbg. +set(FGVIEWER_DEPS + fgviewer + civetweb + ) + +set(FGVIEWER_COMBINED_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/libfgviewer_combined.a") +combine_static_libs(fgviewer "${FGVIEWER_COMBINED_OUTPUT}" "${FGVIEWER_DEPS}") + +set(FGVIEWER_LIB_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}fgviewer${CMAKE_STATIC_LIBRARY_SUFFIX}) +install(FILES "${FGVIEWER_COMBINED_OUTPUT}" DESTINATION lib/${DIST_DIR} RENAME ${FGVIEWER_LIB_NAME}) +# We do not need fgviewer headers in the install directory +# install(DIRECTORY ${PUBLIC_HDR_DIR}/fgviewer DESTINATION include) diff --git a/libs/fgviewer/include/fgviewer/DebugServer.h b/libs/fgviewer/include/fgviewer/DebugServer.h new file mode 100644 index 00000000000..d56addf9097 --- /dev/null +++ b/libs/fgviewer/include/fgviewer/DebugServer.h @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FGVIEWER_DEBUGSERVER_H +#define FGVIEWER_DEBUGSERVER_H + +#include + +#include +#include + +#include +#include + +class CivetServer; + +namespace filament::fgviewer { + +using ViewHandle = uint32_t; + + + +/** + * Server-side frame graph debugger. + * + * This class manages an HTTP server. It receives frame graph packages from the Filament C++ engine or + * from a standalone tool such as fginfo. + */ +class DebugServer { +public: + static std::string_view const kSuccessHeader; + static std::string_view const kErrorHeader; + + explicit DebugServer(int port); + ~DebugServer(); + + /** + * Notifies the debugger that a new view has been added. + */ + ViewHandle createView(utils::CString name); + + /** + * Notifies the debugger that the given view has been deleted. + */ + void destroyView(ViewHandle h); + + /** + * Updates the information for a given view. + */ + void update(ViewHandle h, FrameGraphInfo info); + + bool isReady() const { return mServer; } + +private: + CivetServer* mServer; + + std::unordered_map mViews; + uint32_t mViewCounter = 0; + mutable utils::Mutex mViewsMutex; + + class FileRequestHandler* mFileHandler = nullptr; + class ApiHandler* mApiHandler = nullptr; + + friend class FileRequestHandler; + friend class ApiHandler; +}; + +} // namespace filament::fgviewer + +#endif // FGVIEWER_DEBUGSERVER_H diff --git a/libs/fgviewer/include/fgviewer/FrameGraphInfo.h b/libs/fgviewer/include/fgviewer/FrameGraphInfo.h new file mode 100644 index 00000000000..7de8dd02def --- /dev/null +++ b/libs/fgviewer/include/fgviewer/FrameGraphInfo.h @@ -0,0 +1,82 @@ +/* +* Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FGVIEWER_FRAMEGRAPHINFO_H +#define FGVIEWER_FRAMEGRAPHINFO_H + +#include + +#include +#include +#include + +namespace filament::fgviewer { +using ResourceId = uint32_t; + +class FrameGraphInfo { +public: + explicit FrameGraphInfo(utils::CString viewName); + + ~FrameGraphInfo(); + + FrameGraphInfo(FrameGraphInfo &&rhs) noexcept; + + FrameGraphInfo(FrameGraphInfo const &) = delete; + + struct Pass { + Pass(utils::CString name, std::vector reads, + std::vector writes); + + utils::CString name; + std::vector reads; + std::vector writes; + }; + + struct Resource { + struct Property { + utils::CString name; + utils::CString value; + }; + + Resource(ResourceId id, utils::CString name, + std::vector properties); + + ResourceId id; + utils::CString name; + // We use a vector of Property here to store the resource properties, + // so different kinds of resources could choose different types of + // properties to record. + // ex. + // Texture2D --> { {"name","XXX"}, {"sizeX", "1024"}, {"sizeY", "768"} } + // Buffer1D --> { {"name", "XXX"}, {"size", "512"} } + std::vector properties; + }; + + void setResources(std::unordered_map resources); + + // The incoming passes should be sorted by the execution order. + void setPasses(std::vector sortedPasses); + +private: + utils::CString viewName; + // The order of the passes in the vector indicates the execution + // order of the passes. + std::vector passes; + std::unordered_map resources; +}; +} // namespace filament::fgviewer + +#endif //FGVIEWER_FRAMEGRAPHINFO_H diff --git a/libs/fgviewer/include/fgviewer/JsonWriter.h b/libs/fgviewer/include/fgviewer/JsonWriter.h new file mode 100644 index 00000000000..de9c188eee2 --- /dev/null +++ b/libs/fgviewer/include/fgviewer/JsonWriter.h @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FGVIEWER_JSONWRITER_H +#define FGVIEWER_JSONWRITER_H + +#include + +namespace filament::fgviewer { + +struct FrameGraphInfo; + +// This class generates portions of JSON messages that are sent to the web client. +// Note that some portions of these JSON strings are generated by directly in DebugServer, +// as well as CommonWriter. +class JsonWriter { +public: + + // Retrieves the most recently generated string. + const char* getJsonString() const; + size_t getJsonSize() const; + + // Generates a JSON string describing the given FrameGraphInfo. + bool writeFrameGraphInfo(const FrameGraphInfo& frameGraph); + +private: + utils::CString mJsonString; +}; + +} // namespace filament::fgviewer + +#endif // FGVIEWER_JSONWRITER_H diff --git a/libs/fgviewer/src/ApiHandler.cpp b/libs/fgviewer/src/ApiHandler.cpp new file mode 100644 index 00000000000..729820d4047 --- /dev/null +++ b/libs/fgviewer/src/ApiHandler.cpp @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "ApiHandler.h" + +#include + +#include +#include + +#include + +namespace filament::fgviewer { + +using namespace std::chrono_literals; + +namespace { + +auto const& kSuccessHeader = DebugServer::kSuccessHeader; +auto const& kErrorHeader = DebugServer::kErrorHeader; + +auto const error = [](int line, std::string const& uri) { + utils::slog.e << "[fgviewer] DebugServer: 404 at line " << line << ": " << uri << utils::io::endl; + return false; +}; + +} // anonymous + +bool ApiHandler::handleGetApiFgInfo(struct mg_connection* conn, + struct mg_request_info const* request) { + auto const softError = [conn, request](char const* msg) { + utils::slog.e << "[fgviewer] DebugServer: " << msg << ": " << request->query_string << utils::io::endl; + mg_printf(conn, kErrorHeader.data(), "application/txt"); + mg_write(conn, msg, strlen(msg)); + return true; + }; + + // TODO: Implement the method + return true; +} + +void ApiHandler::addFrameGraph(FrameGraphInfo const* framegraph) { + // TODO: Implement the method +} + + +bool ApiHandler::handleGet(CivetServer* server, struct mg_connection* conn) { + struct mg_request_info const* request = mg_get_request_info(conn); + std::string const& uri = request->local_uri; + + // TODO: Implement the method + return true; +} + +} // filament::fgviewer diff --git a/libs/fgviewer/src/ApiHandler.h b/libs/fgviewer/src/ApiHandler.h new file mode 100644 index 00000000000..b0ed9e785d3 --- /dev/null +++ b/libs/fgviewer/src/ApiHandler.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FGVIEWER_APIHANDLER_H +#define FGVIEWER_APIHANDLER_H + +#include + +namespace filament::fgviewer { + +class DebugServer; +struct FrameGraphInfo; + +// Handles the following REST requests, where {id} is an 8-digit hex string. +// +// GET /api/framegraphs +// GET /api/framegraph?fg={viewname} +// +class ApiHandler : public CivetHandler { +public: + explicit ApiHandler(DebugServer* server) + : mServer(server) {} + ~ApiHandler() = default; + + bool handleGet(CivetServer* server, struct mg_connection* conn); + void addFrameGraph(FrameGraphInfo const* frameGraph); + +private: + bool handleGetApiFgInfo(struct mg_connection* conn, struct mg_request_info const* request); + + DebugServer* mServer; +}; + +} // filament::fgviewer + +#endif // FGVIEWER_APIHANDLER_H diff --git a/libs/fgviewer/src/DebugServer.cpp b/libs/fgviewer/src/DebugServer.cpp new file mode 100644 index 00000000000..70d2af08947 --- /dev/null +++ b/libs/fgviewer/src/DebugServer.cpp @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include "ApiHandler.h" + +#include + +#include +#include +#include + +#include +#include + +namespace filament::fgviewer { + +namespace { +std::string const BASE_URL = "libs/fgviewer/web"; +} // anonymous + +using namespace utils; + +std::string_view const DebugServer::kSuccessHeader = + "HTTP/1.1 200 OK\r\nContent-Type: %s\r\n" + "Connection: close\r\n\r\n"; + +std::string_view const DebugServer::kErrorHeader = + "HTTP/1.1 404 Not Found\r\nContent-Type: %s\r\n" + "Connection: close\r\n\r\n"; + + +class FileRequestHandler : public CivetHandler { +public: + FileRequestHandler(DebugServer* server) : mServer(server) {} + bool handleGet(CivetServer *server, struct mg_connection *conn) { + auto const& kSuccessHeader = DebugServer::kSuccessHeader; + struct mg_request_info const* request = mg_get_request_info(conn); + std::string uri(request->request_uri); + if (uri == "/") { + uri = "/index.html"; + } + + if (uri == "/index.html" || uri == "/app.js" || uri == "/api.js") { + mg_send_file(conn, (BASE_URL + uri).c_str()); + return true; + } + slog.e << "[fgviewer] DebugServer: bad request at line " << __LINE__ << ": " << uri << io::endl; + return false; + } +private: + DebugServer* mServer; +}; + +DebugServer::DebugServer(int port) { + // By default the server spawns 50 threads so we override this to 10. According to the civetweb + // documentation, "it is recommended to use num_threads of at least 5, since browsers often + /// establish multiple connections to load a single web page, including all linked documents + // (CSS, JavaScript, images, ...)." If this count is too small, the web app basically hangs. + const char* kServerOptions[] = { + "listening_ports", "8085", + "num_threads", "10", + "error_log_file", "civetweb.txt", + nullptr + }; + std::string portString = std::to_string(port); + kServerOptions[1] = portString.c_str(); + + mServer = new CivetServer(kServerOptions); + if (!mServer->getContext()) { + delete mServer; + mServer = nullptr; + slog.e << "[fgviewer] Unable to start DebugServer, see civetweb.txt for details." << io::endl; + return; + } + + mFileHandler = new FileRequestHandler(this); + mApiHandler = new ApiHandler(this); + + mServer->addHandler("/api", mApiHandler); + mServer->addHandler("", mFileHandler); + + slog.i << "[fgviewer] DebugServer listening at http://localhost:" << port << io::endl; +} + +DebugServer::~DebugServer() { + mServer->close(); + + delete mFileHandler; + delete mApiHandler; + delete mServer; +} + +ViewHandle DebugServer::createView(utils::CString name) { + std::unique_lock lock(mViewsMutex); + ViewHandle handle = mViewCounter++; + mViews.emplace(handle, FrameGraphInfo(std::move(name))); + + return handle; +} + +void DebugServer::destroyView(ViewHandle h) { + std::unique_lock lock(mViewsMutex); + mViews.erase(h); +} + +void DebugServer::update(ViewHandle h, FrameGraphInfo info) { + std::unique_lock lock(mViewsMutex); + mViews.erase(h); + mViews.emplace(h, std::move(info)); +} + +} // namespace filament::fgviewer diff --git a/libs/fgviewer/src/FrameGraphInfo.cpp b/libs/fgviewer/src/FrameGraphInfo.cpp new file mode 100644 index 00000000000..59fcaea489b --- /dev/null +++ b/libs/fgviewer/src/FrameGraphInfo.cpp @@ -0,0 +1,46 @@ +/* +* Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +namespace filament::fgviewer { + +FrameGraphInfo::FrameGraphInfo(utils::CString viewName): + viewName(std::move(viewName)), passes({}), resources({}) {} + +FrameGraphInfo::~FrameGraphInfo() = default; + +FrameGraphInfo::FrameGraphInfo(FrameGraphInfo&& rhs) noexcept = default; + +FrameGraphInfo::Pass::Pass(utils::CString name, std::vector reads, + std::vector writes): name(std::move(name)), + reads(std::move(reads)), + writes(std::move(writes)) {} + +FrameGraphInfo::Resource::Resource(ResourceId id, utils::CString name, + std::vector properties): id(id), + name(std::move(name)), properties(std::move(properties)) {} + +void FrameGraphInfo::setResources( + std::unordered_map resources) { + this->resources = std::move(resources); +} + +void FrameGraphInfo::setPasses(std::vector sortedPasses) { + passes = std::move(sortedPasses); +} + +} // namespace filament::fgviewer diff --git a/libs/filabridge/CMakeLists.txt b/libs/filabridge/CMakeLists.txt index ffcd1ce2367..6840ce536e7 100644 --- a/libs/filabridge/CMakeLists.txt +++ b/libs/filabridge/CMakeLists.txt @@ -10,8 +10,9 @@ set(PUBLIC_HDR_DIR include) file(GLOB_RECURSE PUBLIC_HDRS ${PUBLIC_HDR_DIR}/**/*.h) set(SRCS - src/SamplerInterfaceBlock.cpp src/BufferInterfaceBlock.cpp + src/DescriptorSets.cpp + src/SamplerInterfaceBlock.cpp src/Variant.cpp ) diff --git a/libs/filabridge/include/filament/MaterialChunkType.h b/libs/filabridge/include/filament/MaterialChunkType.h index c63b7d5414b..4d9f6a7deb6 100644 --- a/libs/filabridge/include/filament/MaterialChunkType.h +++ b/libs/filabridge/include/filament/MaterialChunkType.h @@ -42,18 +42,26 @@ enum UTILS_PUBLIC ChunkType : uint64_t { MaterialSib = charTo64bitNum("MAT_SIB "), MaterialSubpass = charTo64bitNum("MAT_SUB "), MaterialGlsl = charTo64bitNum("MAT_GLSL"), + MaterialEssl1 = charTo64bitNum("MAT_ESS1"), MaterialSpirv = charTo64bitNum("MAT_SPIR"), MaterialMetal = charTo64bitNum("MAT_METL"), + MaterialMetalLibrary = charTo64bitNum("MAT_MLIB"), MaterialShaderModels = charTo64bitNum("MAT_SMDL"), - MaterialSamplerBindings = charTo64bitNum("MAT_SAMP"), - MaterialUniformBindings = charTo64bitNum("MAT_UNIF"), + MaterialBindingUniformInfo = charTo64bitNum("MAT_UFRM"), + MaterialAttributeInfo = charTo64bitNum("MAT_ATTR"), + MaterialDescriptorBindingsInfo = charTo64bitNum("MAT_DBDI"), + MaterialDescriptorSetLayoutInfo = charTo64bitNum("MAT_DSLI"), MaterialProperties = charTo64bitNum("MAT_PROP"), + MaterialConstants = charTo64bitNum("MAT_CONS"), + MaterialPushConstants = charTo64bitNum("MAT_PCON"), MaterialName = charTo64bitNum("MAT_NAME"), MaterialVersion = charTo64bitNum("MAT_VERS"), + MaterialCacheId = charTo64bitNum("MAT_UUID"), MaterialFeatureLevel = charTo64bitNum("MAT_FEAT"), MaterialShading = charTo64bitNum("MAT_SHAD"), MaterialBlendingMode = charTo64bitNum("MAT_BLEN"), + MaterialBlendFunction = charTo64bitNum("MAT_BLFN"), MaterialTransparencyMode = charTo64bitNum("MAT_TRMD"), MaterialMaskThreshold = charTo64bitNum("MAT_THRS"), MaterialShadowMultiplier = charTo64bitNum("MAT_SHML"), @@ -62,28 +70,33 @@ enum UTILS_PUBLIC ChunkType : uint64_t { MaterialSpecularAntiAliasingThreshold = charTo64bitNum("MAT_STHR"), MaterialClearCoatIorChange = charTo64bitNum("MAT_CIOR"), MaterialDomain = charTo64bitNum("MAT_DOMN"), + MaterialVariantFilterMask = charTo64bitNum("MAT_VFLT"), MaterialRefraction = charTo64bitNum("MAT_REFM"), MaterialRefractionType = charTo64bitNum("MAT_REFT"), MaterialReflectionMode = charTo64bitNum("MAT_REFL"), MaterialRequiredAttributes = charTo64bitNum("MAT_REQA"), - MaterialDepthWriteSet = charTo64bitNum("MAT_DEWS"), MaterialDoubleSidedSet = charTo64bitNum("MAT_DOSS"), MaterialDoubleSided = charTo64bitNum("MAT_DOSI"), MaterialColorWrite = charTo64bitNum("MAT_CWRIT"), + MaterialDepthWriteSet = charTo64bitNum("MAT_DEWS"), MaterialDepthWrite = charTo64bitNum("MAT_DWRIT"), MaterialDepthTest = charTo64bitNum("MAT_DTEST"), MaterialInstanced = charTo64bitNum("MAT_INSTA"), MaterialCullingMode = charTo64bitNum("MAT_CUMO"), + MaterialAlphaToCoverageSet = charTo64bitNum("MAT_A2CS"), + MaterialAlphaToCoverage = charTo64bitNum("MAT_A2CO"), MaterialHasCustomDepthShader =charTo64bitNum("MAT_CSDP"), MaterialVertexDomain = charTo64bitNum("MAT_VEDO"), MaterialInterpolation = charTo64bitNum("MAT_INTR"), + MaterialStereoscopicType = charTo64bitNum("MAT_STER"), DictionaryText = charTo64bitNum("DIC_TEXT"), DictionarySpirv = charTo64bitNum("DIC_SPIR"), + DictionaryMetalLibrary = charTo64bitNum("DIC_MLIB"), }; } // namespace filamat diff --git a/libs/filabridge/include/filament/MaterialEnums.h b/libs/filabridge/include/filament/MaterialEnums.h index d0a98e8ca97..4092e8a765e 100644 --- a/libs/filabridge/include/filament/MaterialEnums.h +++ b/libs/filabridge/include/filament/MaterialEnums.h @@ -20,6 +20,7 @@ #define TNT_FILAMENT_MATERIAL_ENUM_H #include +#include #include #include @@ -27,7 +28,7 @@ namespace filament { // update this when a new version of filament wouldn't work with older materials -static constexpr size_t MATERIAL_VERSION = 31; +static constexpr size_t MATERIAL_VERSION = 56; /** * Supported shading models @@ -79,6 +80,8 @@ enum class BlendingMode : uint8_t { MULTIPLY, //! material brightens what's behind it SCREEN, + //! custom blending function + CUSTOM, }; /** @@ -200,7 +203,7 @@ enum class ReflectionMode : uint8_t { // can't really use std::underlying_type::type because the driver takes a uint32_t using AttributeBitset = utils::bitset32; -static constexpr size_t MATERIAL_PROPERTIES_COUNT = 26; +static constexpr size_t MATERIAL_PROPERTIES_COUNT = 29; enum class Property : uint8_t { BASE_COLOR, //!< float4, all shading models ROUGHNESS, //!< float, lit shading models only @@ -222,28 +225,39 @@ enum class Property : uint8_t { EMISSIVE, //!< float4, all shading models NORMAL, //!< float3, all shading models only, except unlit POST_LIGHTING_COLOR, //!< float4, all shading models + POST_LIGHTING_MIX_FACTOR,//!< float, all shading models CLIP_SPACE_TRANSFORM, //!< mat4, vertex shader only ABSORPTION, //!< float3, how much light is absorbed by the material TRANSMISSION, //!< float, how much light is refracted through the material IOR, //!< float, material's index of refraction MICRO_THICKNESS, //!< float, thickness of the thin layer BENT_NORMAL, //!< float3, all shading models only, except unlit + SPECULAR_FACTOR, //!< float, lit shading models only, except subsurface and cloth + SPECULAR_COLOR_FACTOR, //!< float3, lit shading models only, except subsurface and cloth // when adding new Properties, make sure to update MATERIAL_PROPERTIES_COUNT }; -enum class UserVariantFilterBit : uint32_t { - DIRECTIONAL_LIGHTING = 0x01, - DYNAMIC_LIGHTING = 0x02, - SHADOW_RECEIVER = 0x04, - SKINNING = 0x08, - FOG = 0x10, - VSM = 0x20, - SSR = 0x40, -}; - using UserVariantFilterMask = uint32_t; +enum class UserVariantFilterBit : UserVariantFilterMask { + DIRECTIONAL_LIGHTING = 0x01, //!< Directional lighting + DYNAMIC_LIGHTING = 0x02, //!< Dynamic lighting + SHADOW_RECEIVER = 0x04, //!< Shadow receiver + SKINNING = 0x08, //!< Skinning + FOG = 0x10, //!< Fog + VSM = 0x20, //!< Variance shadow maps + SSR = 0x40, //!< Screen-space reflections + STE = 0x80, //!< Instanced stereo rendering + ALL = 0xFF, +}; + } // namespace filament +template<> struct utils::EnableBitMaskOperators + : public std::true_type {}; + +template<> struct utils::EnableIntegerOperators + : public std::true_type {}; + #endif diff --git a/libs/filabridge/include/private/filament/BufferInterfaceBlock.h b/libs/filabridge/include/private/filament/BufferInterfaceBlock.h index a8240f7016f..c47193208fd 100644 --- a/libs/filabridge/include/private/filament/BufferInterfaceBlock.h +++ b/libs/filabridge/include/private/filament/BufferInterfaceBlock.h @@ -41,6 +41,7 @@ class BufferInterfaceBlock { uint32_t size; backend::UniformType type; backend::Precision precision{}; + backend::FeatureLevel minFeatureLevel = backend::FeatureLevel::FEATURE_LEVEL_1; std::string_view structName{}; uint32_t stride{}; std::string_view sizeName{}; @@ -67,6 +68,7 @@ class BufferInterfaceBlock { bool isArray; // true if the field is an array uint32_t size; // size of the array in elements, or 0 if not an array Precision precision; // precision of this field + backend::FeatureLevel minFeatureLevel; // below this feature level, this field is not needed utils::CString structName; // name of this field structure if type is STRUCT utils::CString sizeName; // name of the size parameter in the shader // returns offset in bytes of this field (at index if an array) @@ -158,6 +160,8 @@ class BufferInterfaceBlock { bool isEmpty() const noexcept { return mFieldInfoList.empty(); } + bool isEmptyForFeatureLevel(backend::FeatureLevel featureLevel) const noexcept; + Alignment getAlignment() const noexcept { return mAlignment; } Target getTarget() const noexcept { return mTarget; } diff --git a/libs/filabridge/include/private/filament/ConstantInfo.h b/libs/filabridge/include/private/filament/ConstantInfo.h new file mode 100644 index 00000000000..04ceaf15beb --- /dev/null +++ b/libs/filabridge/include/private/filament/ConstantInfo.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_CONSTANTINFO_H +#define TNT_FILAMENT_CONSTANTINFO_H + +#include + +#include + +namespace filament { + +struct MaterialConstant { + using ConstantType = backend::ConstantType; + + utils::CString name; + ConstantType type; + + MaterialConstant() = default; + MaterialConstant(const char* name, ConstantType type) : name(name), type(type) {} +}; + +} + +#endif // TNT_FILAMENT_CONSTANTINFO_H diff --git a/libs/filabridge/include/private/filament/DescriptorSets.h b/libs/filabridge/include/private/filament/DescriptorSets.h new file mode 100644 index 00000000000..171c8650d10 --- /dev/null +++ b/libs/filabridge/include/private/filament/DescriptorSets.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_DESCRIPTORSETS_H +#define TNT_FILAMENT_DESCRIPTORSETS_H + +#include + +#include + +#include + +#include + +namespace filament::descriptor_sets { + +backend::DescriptorSetLayout const& getPostProcessLayout() noexcept; +backend::DescriptorSetLayout const& getDepthVariantLayout() noexcept; +backend::DescriptorSetLayout const& getSsrVariantLayout() noexcept; +backend::DescriptorSetLayout const& getPerRenderableLayout() noexcept; + +backend::DescriptorSetLayout getPerViewDescriptorSetLayout( + MaterialDomain domain, + UserVariantFilterMask variantFilter, + bool isLit, + ReflectionMode reflectionMode, + RefractionMode refractionMode) noexcept; + +utils::CString getDescriptorName( + filament::DescriptorSetBindingPoints set, + backend::descriptor_binding_t binding) noexcept; + +} // namespace filament::descriptor_sets + + +#endif //TNT_FILAMENT_DESCRIPTORSETS_H diff --git a/libs/filabridge/include/private/filament/EngineEnums.h b/libs/filabridge/include/private/filament/EngineEnums.h index f2113344f72..2ba000c5db0 100644 --- a/libs/filabridge/include/private/filament/EngineEnums.h +++ b/libs/filabridge/include/private/filament/EngineEnums.h @@ -20,39 +20,74 @@ #include #include +#include #include #include namespace filament { -static constexpr size_t POST_PROCESS_VARIANT_COUNT = 2; +static constexpr size_t POST_PROCESS_VARIANT_BITS = 1; +static constexpr size_t POST_PROCESS_VARIANT_COUNT = (1u << POST_PROCESS_VARIANT_BITS); +static constexpr size_t POST_PROCESS_VARIANT_MASK = POST_PROCESS_VARIANT_COUNT - 1; + enum class PostProcessVariant : uint8_t { OPAQUE, TRANSLUCENT }; -// Binding points for uniform buffers -enum class UniformBindingPoints : uint8_t { - PER_VIEW = 0, // uniforms updated per view - PER_RENDERABLE = 1, // uniforms updated per renderable - PER_RENDERABLE_BONES = 2, // bones data, per renderable - PER_RENDERABLE_MORPHING = 3, // morphing uniform/sampler updated per render primitive - LIGHTS = 4, // lights data array - SHADOW = 5, // punctual shadow data - FROXEL_RECORDS = 6, - PER_MATERIAL_INSTANCE = 7, // uniforms updates per material - // Update utils::Enum::count<>() below when adding values here - // These are limited by CONFIG_BINDING_COUNT (currently 10) +enum class DescriptorSetBindingPoints : uint8_t { + PER_VIEW = 0, + PER_RENDERABLE = 1, + PER_MATERIAL = 2, +}; + +// binding point for the "per-view" descriptor set +enum class PerViewBindingPoints : uint8_t { + FRAME_UNIFORMS = 0, // uniforms updated per view + SHADOWS = 1, // punctual shadow data + LIGHTS = 2, // lights data array + RECORD_BUFFER = 3, // froxel record buffer + FROXEL_BUFFER = 4, // froxel buffer + STRUCTURE = 5, // variable, DEPTH + SHADOW_MAP = 6, // user defined (1024x1024) DEPTH, array + IBL_DFG_LUT = 7, // user defined (128x128), RGB16F + IBL_SPECULAR = 8, // user defined, user defined, CUBEMAP + SSAO = 9, // variable, RGB8 {AO, [depth]} + SSR = 10, // variable, RGB_11_11_10, mipmapped + FOG = 11 // variable, user defined, CUBEMAP +}; + +enum class PerRenderableBindingPoints : uint8_t { + OBJECT_UNIFORMS = 0, // uniforms updated per renderable + BONES_UNIFORMS = 1, + MORPHING_UNIFORMS = 2, + MORPH_TARGET_POSITIONS = 3, + MORPH_TARGET_TANGENTS = 4, + BONES_INDICES_AND_WEIGHTS = 5, +}; + +enum class PerMaterialBindingPoints : uint8_t { + MATERIAL_PARAMS = 0, // uniforms }; -// Binding points for sampler buffers. -enum class SamplerBindingPoints : uint8_t { - PER_VIEW = 0, // samplers updated per view - PER_RENDERABLE_MORPHING = 1, // morphing sampler updated per render primitive - PER_MATERIAL_INSTANCE = 2, // samplers updates per material - // Update utils::Enum::count<>() below when adding values here - // These are limited by CONFIG_SAMPLER_BINDING_COUNT (currently 4) +enum class ReservedSpecializationConstants : uint8_t { + BACKEND_FEATURE_LEVEL = 0, + CONFIG_MAX_INSTANCES = 1, + CONFIG_STATIC_TEXTURE_TARGET_WORKAROUND = 2, + CONFIG_SRGB_SWAPCHAIN_EMULATION = 3, // don't change (hardcoded in OpenGLDriver.cpp) + CONFIG_FROXEL_BUFFER_HEIGHT = 4, + CONFIG_POWER_VR_SHADER_WORKAROUNDS = 5, + CONFIG_DEBUG_DIRECTIONAL_SHADOWMAP = 6, + CONFIG_DEBUG_FROXEL_VISUALIZATION = 7, + CONFIG_STEREO_EYE_COUNT = 8, // don't change (hardcoded in ShaderCompilerService.cpp) + CONFIG_SH_BANDS_COUNT = 9, + CONFIG_SHADOW_SAMPLING_METHOD = 10 + // check CONFIG_MAX_RESERVED_SPEC_CONSTANTS below +}; + +enum class PushConstantIds : uint8_t { + MORPHING_BUFFER_OFFSET = 0, }; // This value is limited by UBO size, ES3.0 only guarantees 16 KiB. @@ -60,11 +95,16 @@ enum class SamplerBindingPoints : uint8_t { constexpr size_t CONFIG_MAX_LIGHT_COUNT = 256; constexpr size_t CONFIG_MAX_LIGHT_INDEX = CONFIG_MAX_LIGHT_COUNT - 1; -// The maximum number of shadowmaps. -// There is currently a maximum limit of 128 shadowmaps. +// The number of specialization constants that Filament reserves for its own use. These are always +// the first constants (from 0 to CONFIG_MAX_RESERVED_SPEC_CONSTANTS - 1). +// Updating this value necessitates a material version bump. +constexpr size_t CONFIG_MAX_RESERVED_SPEC_CONSTANTS = 16; + +// The maximum number of shadow maps possible. +// There is currently a maximum limit of 128 shadow maps. // Factors contributing to this limit: // - minspec for UBOs is 16KiB, which currently can hold a maximum of 128 entries -constexpr size_t CONFIG_MAX_SHADOWMAPS = 64; +constexpr size_t CONFIG_MAX_SHADOWMAPS = 128; // The maximum number of shadow layers. // There is currently a maximum limit of 255 layers. @@ -72,7 +112,8 @@ constexpr size_t CONFIG_MAX_SHADOWMAPS = 64; // - minspec for 2d texture arrays layer is 256 // - we're using uint8_t to store the number of layers (255 max) // - nonsensical to be larger than the number of shadowmaps -constexpr size_t CONFIG_MAX_SHADOW_LAYERS = CONFIG_MAX_SHADOWMAPS; +// - AtlasAllocator depth limits it to 64 +constexpr size_t CONFIG_MAX_SHADOW_LAYERS = 64; // The maximum number of shadow cascades that can be used for directional lights. constexpr size_t CONFIG_MAX_SHADOW_CASCADES = 4; @@ -103,19 +144,30 @@ constexpr size_t CONFIG_MAX_BONE_COUNT = 256; // Furthermore, this is constrained by CONFIG_MINSPEC_UBO_SIZE (16 bytes per morph target). constexpr size_t CONFIG_MAX_MORPH_TARGET_COUNT = 256; +// The max number of eyes supported in stereoscopic mode. +// The number of eyes actually rendered is set at Engine creation time, see +// Engine::Config::stereoscopicEyeCount. +constexpr uint8_t CONFIG_MAX_STEREOSCOPIC_EYES = 4; + } // namespace filament template<> -struct utils::EnableIntegerOperators : public std::true_type {}; +struct utils::EnableIntegerOperators : public std::true_type {}; +template<> +struct utils::EnableIntegerOperators : public std::true_type {}; template<> -struct utils::EnableIntegerOperators : public std::true_type {}; +struct utils::EnableIntegerOperators : public std::true_type {}; +template<> +struct utils::EnableIntegerOperators : public std::true_type {}; template<> -inline constexpr size_t utils::Enum::count() { return 8; } +struct utils::EnableIntegerOperators : public std::true_type {}; +template<> +struct utils::EnableIntegerOperators : public std::true_type {}; template<> -inline constexpr size_t utils::Enum::count() { return 3; } +struct utils::EnableIntegerOperators : public std::true_type {}; -static_assert(utils::Enum::count() <= filament::backend::CONFIG_UNIFORM_BINDING_COUNT); -static_assert(utils::Enum::count() <= filament::backend::CONFIG_SAMPLER_BINDING_COUNT); +template<> +inline constexpr size_t utils::Enum::count() { return filament::POST_PROCESS_VARIANT_COUNT; } #endif // TNT_FILAMENT_ENGINE_ENUM_H diff --git a/libs/filabridge/include/private/filament/PushConstantInfo.h b/libs/filabridge/include/private/filament/PushConstantInfo.h new file mode 100644 index 00000000000..45b1615664a --- /dev/null +++ b/libs/filabridge/include/private/filament/PushConstantInfo.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMENT_PUSHCONSTANTINFO_H +#define TNT_FILAMENT_PUSHCONSTANTINFO_H + +#include + +#include + +namespace filament { + +struct MaterialPushConstant { + using ShaderStage = backend::ShaderStage; + using ConstantType = backend::ConstantType; + + utils::CString name; + ConstantType type; + ShaderStage stage; + + MaterialPushConstant() = default; + MaterialPushConstant(const char* name, ConstantType type, ShaderStage stage) + : name(name), + type(type), + stage(stage) {} +}; + +} + +#endif // TNT_FILAMENT_PUSHCONSTANTINFO_H diff --git a/libs/filabridge/include/private/filament/SamplerBindingsInfo.h b/libs/filabridge/include/private/filament/SamplerBindingsInfo.h index e8f3164eda6..e69de29bb2d 100644 --- a/libs/filabridge/include/private/filament/SamplerBindingsInfo.h +++ b/libs/filabridge/include/private/filament/SamplerBindingsInfo.h @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef TNT_FILABRIDGE_SAMPLERBINDINGS_INFO_H -#define TNT_FILABRIDGE_SAMPLERBINDINGS_INFO_H - -#include - -#include - -#include -#include - -#include - -namespace filament { - -// binding information about a sampler group -struct SamplerGroupBindingInfo { - constexpr static uint8_t UNKNOWN_OFFSET = 0xff; - // global binding of this block, or UNKNOWN_OFFSET if not used. - uint8_t bindingOffset = UNKNOWN_OFFSET; - // shader stage flags for samplers in this block - backend::ShaderStageFlags shaderStageFlags = backend::ShaderStageFlags::NONE; - // number of samplers in this block. Can be zero. - uint8_t count = 0; -}; - -// list of binding information for all known binding points -using SamplerGroupBindingInfoList = - std::array()>; - -// map of sampler shader binding to sampler shader name -using SamplerBindingToNameMap = - utils::FixedCapacityVector; - -} // namespace filament - -#endif //TNT_FILABRIDGE_SAMPLERBINDINGS_INFO_H diff --git a/libs/filabridge/include/private/filament/SamplerInterfaceBlock.h b/libs/filabridge/include/private/filament/SamplerInterfaceBlock.h index af592155a66..243f2dcfb6c 100644 --- a/libs/filabridge/include/private/filament/SamplerInterfaceBlock.h +++ b/libs/filabridge/include/private/filament/SamplerInterfaceBlock.h @@ -20,13 +20,16 @@ #include -#include #include #include #include #include #include +#include + +#include +#include namespace filament { @@ -46,17 +49,20 @@ class SamplerInterfaceBlock { using Format = backend::SamplerFormat; using Precision = backend::Precision; using SamplerParams = backend::SamplerParams; + using Binding = backend::descriptor_binding_t; struct SamplerInfo { // NOLINT(cppcoreguidelines-pro-type-member-init) utils::CString name; // name of this sampler utils::CString uniformName; // name of the uniform holding this sampler (needed for glsl/MSL) - uint8_t offset; // offset in "Sampler" of this sampler in the buffer + Binding binding; // binding in the descriptor set Type type; // type of this sampler Format format; // format of this sampler Precision precision; // precision of this sampler bool multisample; // multisample capable }; + using SamplerInfoList = utils::FixedCapacityVector; + class Builder { public: Builder(); @@ -69,6 +75,7 @@ class SamplerInterfaceBlock { struct ListEntry { // NOLINT(cppcoreguidelines-pro-type-member-init) std::string_view name; // name of this sampler + Binding binding; // binding in the descriptor set Type type; // type of this sampler Format format; // format of this sampler Precision precision; // precision of this sampler @@ -81,7 +88,7 @@ class SamplerInterfaceBlock { Builder& stageFlags(backend::ShaderStageFlags stageFlags); // Add a sampler - Builder& add(std::string_view samplerName, Type type, Format format, + Builder& add(std::string_view samplerName, Binding binding, Type type, Format format, Precision precision = Precision::MEDIUM, bool multisample = false) noexcept; @@ -106,7 +113,7 @@ class SamplerInterfaceBlock { size_t getSize() const noexcept { return mSamplersInfoList.size(); } // list of information records for each sampler - utils::FixedCapacityVector const& getSamplerInfoList() const noexcept { + SamplerInfoList const& getSamplerInfoList() const noexcept { return mSamplersInfoList; } diff --git a/libs/filabridge/include/private/filament/SibStructs.h b/libs/filabridge/include/private/filament/SibStructs.h index 2d4ca033e90..94bdb2b276d 100644 --- a/libs/filabridge/include/private/filament/SibStructs.h +++ b/libs/filabridge/include/private/filament/SibStructs.h @@ -25,12 +25,12 @@ namespace filament { struct PerViewSib { // indices of each sampler in this SamplerInterfaceBlock (see: getPerViewSib()) static constexpr size_t SHADOW_MAP = 0; // user defined (1024x1024) DEPTH, array - static constexpr size_t FROXELS = 1; // 64x2048, RG16 {index, count, reserved} - static constexpr size_t IBL_DFG_LUT = 2; // user defined (128x128), RGB16F - static constexpr size_t IBL_SPECULAR = 3; // user defined, user defined, CUBEMAP - static constexpr size_t SSAO = 4; // variable, RGB8 {AO, [depth]} - static constexpr size_t SSR = 5; // variable, RGB_11_11_10, mipmapped - static constexpr size_t STRUCTURE = 6; // variable, DEPTH + static constexpr size_t IBL_DFG_LUT = 1; // user defined (128x128), RGB16F + static constexpr size_t IBL_SPECULAR = 2; // user defined, user defined, CUBEMAP + static constexpr size_t SSAO = 3; // variable, RGB8 {AO, [depth]} + static constexpr size_t SSR = 4; // variable, RGB_11_11_10, mipmapped + static constexpr size_t STRUCTURE = 5; // variable, DEPTH + static constexpr size_t FOG = 6; // variable, user defined, CUBEMAP static constexpr size_t SAMPLER_COUNT = 7; }; @@ -42,6 +42,12 @@ struct PerRenderPrimitiveMorphingSib { static constexpr size_t SAMPLER_COUNT = 2; }; +struct PerRenderPrimitiveSkinningSib { + static constexpr size_t BONE_INDICES_AND_WEIGHTS = 0; //bone indices and weights + + static constexpr size_t SAMPLER_COUNT = 1; +}; + } // namespace filament #endif //TNT_FILABRIDGE_SIBSTRUCTS_H diff --git a/libs/filabridge/include/private/filament/UibStructs.h b/libs/filabridge/include/private/filament/UibStructs.h index 03e1282d6a5..4f06f43b409 100644 --- a/libs/filabridge/include/private/filament/UibStructs.h +++ b/libs/filabridge/include/private/filament/UibStructs.h @@ -32,6 +32,35 @@ namespace filament { +namespace std140 { + +struct alignas(16) vec3 : public std::array {}; +struct alignas(16) vec4 : public std::array {}; + +struct mat33 : public std::array { + mat33& operator=(math::mat3f const& rhs) noexcept { + for (int i = 0; i < 3; i++) { + (*this)[i][0] = rhs[i][0]; + (*this)[i][1] = rhs[i][1]; + (*this)[i][2] = rhs[i][2]; + } + return *this; + } +}; + +struct mat44 : public std::array { + mat44& operator=(math::mat4f const& rhs) noexcept { + for (int i = 0; i < 4; i++) { + (*this)[i][0] = rhs[i][0]; + (*this)[i][1] = rhs[i][1]; + (*this)[i][2] = rhs[i][2]; + (*this)[i][3] = rhs[i][3]; + } + return *this; + } +}; + +} // std140 /* * IMPORTANT NOTE: Respect std140 layout, don't update without updating UibGenerator::get{*}Uib() */ @@ -43,16 +72,19 @@ struct PerViewUib { // NOLINT(cppcoreguidelines-pro-type-member-init) // Values that can be accessed in both surface and post-process materials // -------------------------------------------------------------------------------------------- - math::mat4f viewFromWorldMatrix; - math::mat4f worldFromViewMatrix; - math::mat4f clipFromViewMatrix; - math::mat4f viewFromClipMatrix; - math::mat4f clipFromWorldMatrix; - math::mat4f worldFromClipMatrix; - math::float4 clipTransform; // [sx, sy, tx, ty] only used by VERTEX_DOMAIN_DEVICE + math::mat4f viewFromWorldMatrix; // clip view <- world : view matrix + math::mat4f worldFromViewMatrix; // clip view -> world : model matrix + math::mat4f clipFromViewMatrix; // clip <- view world : projection matrix + math::mat4f viewFromClipMatrix; // clip -> view world : inverse projection matrix + math::mat4f clipFromWorldMatrix[CONFIG_MAX_STEREOSCOPIC_EYES]; // clip <- view <- world + math::mat4f worldFromClipMatrix; // clip -> view -> world + math::mat4f userWorldFromWorldMatrix; // userWorld <- world + math::float4 clipTransform; // [sx, sy, tx, ty] only used by VERTEX_DOMAIN_DEVICE + + // -------------------------------------------------------------------------------------------- math::float2 clipControl; // clip control - float time; // time in seconds, with a 1 second period + float time; // time in seconds, with a 1-second period float temporalNoise; // noise [0,1] when TAA is used, 0 otherwise math::float4 userTime; // time(s), (double)time - (float)time, 0, 0 @@ -67,14 +99,10 @@ struct PerViewUib { // NOLINT(cppcoreguidelines-pro-type-member-init) float lodBias; // load bias to apply to user materials float refractionLodOffset; - float padding1; - float padding2; + math::float2 derivativesScale; // camera position in view space (when camera_at_origin is enabled), i.e. it's (0,0,0). - // Always add worldOffset in the shader to get the true world-space position of the camera. - math::float3 cameraPosition; float oneOverFarMinusNear; // 1 / (f-n), always positive - math::float3 worldOffset; // this is (0,0,0) when camera_at_origin is disabled float nearOverFarMinusNear; // n / (f-n), always positive float cameraFar; // camera *culling* far-plane distance, always positive (projection far is at +inf) float exposure; @@ -84,15 +112,13 @@ struct PerViewUib { // NOLINT(cppcoreguidelines-pro-type-member-init) // AO float aoSamplingQualityAndEdgeDistance; // <0: no AO, 0: bilinear, !0: bilateral edge distance float aoBentNormals; // 0: no AO bent normal, >0.0 AO bent normals - float aoReserved0; - float aoReserved1; // -------------------------------------------------------------------------------------------- // Dynamic Lighting [variant: DYN] // -------------------------------------------------------------------------------------------- math::float4 zParams; // froxel Z parameters math::uint3 fParams; // stride-x, stride-y, stride-z - uint32_t lightChannels; // light channel bits + int32_t lightChannels; // light channel bits math::float2 froxelCountXY; // IBL @@ -107,7 +133,7 @@ struct PerViewUib { // NOLINT(cppcoreguidelines-pro-type-member-init) float padding0; math::float4 lightColorIntensity; // directional light math::float4 sun; // cos(sunAngle), sin(sunAngle), 1/(sunAngle*HALO_SIZE-sunAngle), HALO_EXP - math::float2 lightFarAttenuationParams; // a, a/far (a=1/pct-of-far) + math::float2 shadowFarAttenuationParams; // a, a/far (a=1/pct-of-far) // -------------------------------------------------------------------------------------------- // Directional light shadowing [variant: SRE | DIR] @@ -115,19 +141,17 @@ struct PerViewUib { // NOLINT(cppcoreguidelines-pro-type-member-init) // bit 0: directional (sun) shadow enabled // bit 1: directional (sun) screen-space contact shadow enabled // bit 8-15: screen-space contact shadows ray casting steps - uint32_t directionalShadows; + int32_t directionalShadows; float ssContactShadowDistance; // position of cascade splits, in world space (not including the near plane) // -Inf stored in unused components math::float4 cascadeSplits; // bit 0-3: cascade count - // bit 4: visualize cascades // bit 8-11: cascade has visible shadows - uint32_t cascades; - float reserved0; - float reserved1; // normal bias + int32_t cascades; float shadowPenumbraRatioScale; // For DPCF or PCSS, scale penumbra ratio for artistic use + math::float2 lightFarAttenuationParams; // a, a/far (a=1/pct-of-far) // -------------------------------------------------------------------------------------------- // VSM shadows [variant: VSM] @@ -140,16 +164,19 @@ struct PerViewUib { // NOLINT(cppcoreguidelines-pro-type-member-init) // -------------------------------------------------------------------------------------------- // Fog [variant: FOG] // -------------------------------------------------------------------------------------------- + math::float3 fogDensity; // { density, -falloff * yc, density * exp(-fallof * yc) } float fogStart; float fogMaxOpacity; - float fogHeight; - float fogHeightFalloff; // falloff * 1.44269 + uint32_t fogMinMaxMip; + float fogHeightFalloff; + float fogCutOffDistance; math::float3 fogColor; - float fogDensity; // (density/falloff)*exp(-falloff*(camera.y - fogHeight)) + float fogColorFromIbl; float fogInscatteringStart; float fogInscatteringSize; - float fogColorFromIbl; - float fogReserved0; + float fogOneOverFarMinusNear; + float fogNearOverFarMinusNear; + std140::mat33 fogFromWorldMatrix; // -------------------------------------------------------------------------------------------- // Screen-space reflections [variant: SSR (i.e.: VSM | SRE)] @@ -161,8 +188,21 @@ struct PerViewUib { // NOLINT(cppcoreguidelines-pro-type-member-init) float ssrDistance; // ssr world raycast distance, 0 when ssr is off float ssrStride; // ssr texel stride, >= 1.0 + // -------------------------------------------------------------------------------------------- + // user defined global variables + // -------------------------------------------------------------------------------------------- + math::float4 custom[4]; + + // -------------------------------------------------------------------------------------------- + // for feature level 0 / es2 usage + // -------------------------------------------------------------------------------------------- + int32_t rec709; // Only for ES2, 0 or 1, whether we need to do sRGB conversion + float es2Reserved0; + float es2Reserved1; + float es2Reserved2; + // bring PerViewUib to 2 KiB - math::float4 reserved[63]; + math::float4 reserved[40]; }; // 2 KiB == 128 float4s @@ -173,37 +213,33 @@ static_assert(sizeof(PerViewUib) == sizeof(math::float4) * 128, // MARK: - struct PerRenderableData { - - struct alignas(16) vec3_std140 : public std::array { }; - struct mat33_std140 : public std::array { - mat33_std140& operator=(math::mat3f const& rhs) noexcept { - for (int i = 0; i < 3; i++) { - (*this)[i][0] = rhs[i][0]; - (*this)[i][1] = rhs[i][1]; - (*this)[i][2] = rhs[i][2]; - } - return *this; - } - }; - - math::mat4f worldFromModelMatrix; - mat33_std140 worldFromModelNormalMatrix; - uint32_t morphTargetCount; - uint32_t flagsChannels; // see packFlags() below (0x00000fll) - uint32_t objectId; // used for picking + std140::mat44 worldFromModelMatrix; + std140::mat33 worldFromModelNormalMatrix; + int32_t morphTargetCount; + int32_t flagsChannels; // see packFlags() below (0x00000fll) + int32_t objectId; // used for picking // TODO: We need a better solution, this currently holds the average local scale for the renderable float userData; math::float4 reserved[8]; static uint32_t packFlagsChannels( - bool skinning, bool morphing, bool contactShadows, uint8_t channels) noexcept { - return (skinning ? 0x100 : 0) | - (morphing ? 0x200 : 0) | - (contactShadows ? 0x400 : 0) | + bool skinning, bool morphing, bool contactShadows, bool hasInstanceBuffer, + uint8_t channels) noexcept { + return (skinning ? 0x100 : 0) | + (morphing ? 0x200 : 0) | + (contactShadows ? 0x400 : 0) | + (hasInstanceBuffer ? 0x800 : 0) | channels; } }; + +#ifndef _MSC_VER +// not sure why this static_assert fails on MSVC +static_assert(std::is_trivially_default_constructible_v, + "make sure PerRenderableData stays trivially_default_constructible"); +#endif + static_assert(sizeof(PerRenderableData) == 256, "sizeof(PerRenderableData) must be 256 bytes"); @@ -275,6 +311,13 @@ struct FroxelRecordUib { // NOLINT(cppcoreguidelines-pro-type-member-init) static_assert(sizeof(FroxelRecordUib) == 16384, "FroxelRecordUib should be exactly 16KiB"); +struct FroxelsUib { // NOLINT(cppcoreguidelines-pro-type-member-init) + static constexpr std::string_view _name{ "FroxelsUniforms" }; + math::uint4 records[1024]; +}; +static_assert(sizeof(FroxelsUib) == 16384, + "FroxelsUib should be exactly 16KiB"); + // ------------------------------------------------------------------------------------------------ // MARK: - @@ -284,8 +327,9 @@ struct PerRenderableBoneUib { // NOLINT(cppcoreguidelines-pro-type-member-init) struct alignas(16) BoneData { // bone transform, last row assumed [0,0,0,1] math::float4 transform[3]; - // 8 first cofactor matrix of transform's upper left - math::uint4 cof; + // 4 first cofactor matrix of transform's upper left + math::float3 cof0; + float cof1x; }; BoneData bones[CONFIG_MAX_BONE_COUNT]; }; diff --git a/libs/filabridge/include/private/filament/Variant.h b/libs/filabridge/include/private/filament/Variant.h index f752a7ad398..153ea33f69e 100644 --- a/libs/filabridge/include/private/filament/Variant.h +++ b/libs/filabridge/include/private/filament/Variant.h @@ -17,15 +17,17 @@ #ifndef TNT_FILABRIDGE_VARIANT_H #define TNT_FILABRIDGE_VARIANT_H -#include -#include - #include +#include #include +#include + +#include +#include namespace filament { -static constexpr size_t VARIANT_BITS = 7; +static constexpr size_t VARIANT_BITS = 8; static constexpr size_t VARIANT_COUNT = 1 << VARIANT_BITS; using VariantList = utils::bitset; @@ -49,34 +51,34 @@ struct Variant { // FOG: Fog // PCK: Picking (depth variant only) // VSM: Variance shadow maps + // STE: Instanced stereo rendering // // X: either 1 or 0 - // 1 0 0 0 1 0 1 // +-----+-----+-----+-----+-----+-----+-----+-----+ - // Variant | 0 | VSM | FOG | DEP | SKN | SRE | DYN | DIR | 128 + // Variant | STE | VSM | FOG | DEP | SKN | SRE | DYN | DIR | 256 // +-----+-----+-----+-----+-----+-----+-----+-----+ // PCK // // Standard variants: // +-----+-----+-----+-----+-----+-----+-----+-----+ - // | 0 | VSM | FOG | 0 | SKN | SRE | DYN | DIR | 64 - 22 = 42 + // | STE | VSM | FOG | 0 | SKN | SRE | DYN | DIR | 128 - 44 = 84 // +-----+-----+-----+-----+-----+-----+-----+-----+ - // Vertex shader 0 0 0 X X X X - // Fragment shader X X 0 0 X X X - // Fragment SSR 1 0 0 0 1 0 0 - // Reserved 1 1 0 X 1 0 0 [ -2] - // Reserved 0 X 0 X 1 0 0 [ -4] - // Reserved 1 X 0 X 0 X X [-16] + // Vertex shader X 0 0 0 X X X X + // Fragment shader 0 X X 0 0 X X X + // Fragment SSR 0 1 0 0 0 1 0 0 + // Reserved X 1 1 0 X 1 0 0 [ -4] + // Reserved X 0 X 0 X 1 0 0 [ -8] + // Reserved X 1 X 0 X 0 X X [-32] // // Depth variants: // +-----+-----+-----+-----+-----+-----+-----+-----+ - // | 0 | VSM | PCK | 1 | SKN | 0 | 0 | 0 | 8 - 2 = 6 + // | STE | VSM | PCK | 1 | SKN | 0 | 0 | 0 | 16 - 4 = 12 // +-----+-----+-----+-----+-----+-----+-----+-----+ - // Vertex depth X 0 1 X 0 0 0 - // Fragment depth X X 1 0 0 0 0 - // Reserved 1 1 1 X 0 0 0 [ -2] + // Vertex depth X X 0 1 X 0 0 0 + // Fragment depth 0 X X 1 0 0 0 0 + // Reserved X 1 1 1 X 0 0 0 [ -4] // - // 48 variants used, 80 reserved (128 - 46) + // 96 variants used, 160 reserved (256 - 96) // // note: a valid variant can be neither a valid vertex nor a valid fragment variant // (e.g.: FOG|SKN variants), the proper bits are filtered appropriately, @@ -94,6 +96,7 @@ struct Variant { static constexpr type_t FOG = 0x20; // fog (standard) static constexpr type_t PCK = 0x20; // picking (depth) static constexpr type_t VSM = 0x40; // variance shadow maps + static constexpr type_t STE = 0x80; // instanced stereo // special variants (variants that use the reserved space) static constexpr type_t SPECIAL_SSR = VSM | SRE; // screen-space reflections variant @@ -107,12 +110,13 @@ struct Variant { static constexpr type_t DEPTH_VARIANT = DEP; // this mask filters out the lighting variants - static constexpr type_t UNLIT_MASK = SKN | FOG; + static constexpr type_t UNLIT_MASK = STE | SKN | FOG; // returns raw variant bits inline bool hasDirectionalLighting() const noexcept { return key & DIR; } inline bool hasDynamicLighting() const noexcept { return key & DYN; } inline bool hasSkinningOrMorphing() const noexcept { return key & SKN; } + inline bool hasStereo() const noexcept { return key & STE; } inline void setDirectionalLighting(bool v) noexcept { set(v, DIR); } inline void setDynamicLighting(bool v) noexcept { set(v, DYN); } @@ -121,6 +125,7 @@ struct Variant { inline void setFog(bool v) noexcept { set(v, FOG); } inline void setPicking(bool v) noexcept { set(v, PCK); } inline void setVsm(bool v) noexcept { set(v, VSM); } + inline void setStereo(bool v) noexcept { set(v, STE); } inline static constexpr bool isValidDepthVariant(Variant variant) noexcept { // Can't have VSM and PICKING together with DEPTH variants @@ -166,7 +171,7 @@ struct Variant { } inline static constexpr bool isSSRVariant(Variant variant) noexcept { - return (variant.key & (VSM | DEP | SRE | DYN | DIR)) == (VSM | SRE); + return (variant.key & (STE | VSM | DEP | SRE | DYN | DIR)) == (VSM | SRE); } inline static constexpr bool isVSMVariant(Variant variant) noexcept { @@ -185,6 +190,10 @@ struct Variant { return (variant.key & (PCK | DEP)) == (PCK | DEP); } + inline static constexpr bool isStereoVariant(Variant variant) noexcept { + return (variant.key & STE) == STE; + } + static constexpr Variant filterVariantVertex(Variant variant) noexcept { // filter out vertex variants that are not needed. For e.g. fog doesn't affect the // vertex shader. @@ -192,11 +201,11 @@ struct Variant { if (isSSRVariant(variant)) { variant.key &= ~(VSM | SRE); } - return variant & (SKN | SRE | DYN | DIR); + return variant & (STE | SKN | SRE | DYN | DIR); } if ((variant.key & DEPTH_MASK) == DEPTH_VARIANT) { - // Only VSM and skinning affects the vertex shader's DEPTH variant - return variant & (VSM | SKN | DEP); + // Only VSM, skinning, and stereo affect the vertex shader's DEPTH variant + return variant & (STE | VSM | SKN | DEP); } return {}; } @@ -217,6 +226,10 @@ struct Variant { static constexpr Variant filterVariant(Variant variant, bool isLit) noexcept { // special case for depth variant if (isValidDepthVariant(variant)) { + if (!isLit) { + // if we're unlit, we never need the VSM variant + return variant & ~VSM; + } return variant; } if (isSSRVariant(variant)) { @@ -254,6 +267,15 @@ struct Variant { } }; +namespace VariantUtils { +// list of lit variants +utils::Slice getLitVariants() noexcept UTILS_PURE; +// list of unlit variants +utils::Slice getUnlitVariants() noexcept UTILS_PURE; +// list of depth variants +utils::Slice getDepthVariants() noexcept UTILS_PURE; +} + } // namespace filament #endif // TNT_FILABRIDGE_VARIANT_H diff --git a/libs/filabridge/src/BufferInterfaceBlock.cpp b/libs/filabridge/src/BufferInterfaceBlock.cpp index 1854d2b7da7..7b907baceb6 100644 --- a/libs/filabridge/src/BufferInterfaceBlock.cpp +++ b/libs/filabridge/src/BufferInterfaceBlock.cpp @@ -58,7 +58,7 @@ BufferInterfaceBlock::Builder& BufferInterfaceBlock::Builder::add( for (auto const& item : list) { mEntries.push_back({ { item.name.data(), item.name.size() }, - 0, uint8_t(item.stride), item.type, item.size > 0, item.size, item.precision, + 0, uint8_t(item.stride), item.type, item.size > 0, item.size, item.precision, item.minFeatureLevel, { item.structName.data(), item.structName.size() }, { item.sizeName.data(), item.sizeName.size() } }); @@ -71,7 +71,7 @@ BufferInterfaceBlock::Builder& BufferInterfaceBlock::Builder::addVariableSizedAr mHasVariableSizeArray = true; mEntries.push_back({ { item.name.data(), item.name.size() }, - 0, uint8_t(item.stride), item.type, true, 0, item.precision, + 0, uint8_t(item.stride), item.type, true, 0, item.precision, item.minFeatureLevel, { item.structName.data(), item.structName.size() }, { item.sizeName.data(), item.sizeName.size() } }); @@ -86,16 +86,16 @@ BufferInterfaceBlock BufferInterfaceBlock::Builder::build() { }); // if there is one, check it's the last entry - ASSERT_PRECONDITION(pos == mEntries.end() || pos == mEntries.end() - 1, - "the variable-size array must be the last entry"); + FILAMENT_CHECK_PRECONDITION(pos == mEntries.end() || pos == mEntries.end() - 1) + << "the variable-size array must be the last entry"; // if we have a variable size array, we can't be a UBO - ASSERT_PRECONDITION(pos == mEntries.end() || mTarget == Target::SSBO, - "variable size arrays not supported for UBOs"); + FILAMENT_CHECK_PRECONDITION(pos == mEntries.end() || mTarget == Target::SSBO) + << "variable size arrays not supported for UBOs"; // std430 not available for UBOs - ASSERT_PRECONDITION(mAlignment == Alignment::std140 || mTarget == Target::SSBO, - "UBOs must use std140"); + FILAMENT_CHECK_PRECONDITION(mAlignment == Alignment::std140 || mTarget == Target::SSBO) + << "UBOs must use std140"; return BufferInterfaceBlock(*this); } @@ -143,7 +143,7 @@ BufferInterfaceBlock::BufferInterfaceBlock(Builder const& builder) noexcept FieldInfo& info = uniformsInfoList[i]; info = { e.name, offset, uint8_t(stride), e.type, e.isArray, e.size, - e.precision, e.structName, e.sizeName }; + e.precision, e.minFeatureLevel, e.structName, e.sizeName }; // record this uniform info infoMap[{ info.name.data(), info.name.size() }] = i; @@ -166,11 +166,19 @@ ssize_t BufferInterfaceBlock::getFieldOffset(std::string_view name, size_t index BufferInterfaceBlock::FieldInfo const* BufferInterfaceBlock::getFieldInfo( std::string_view name) const { auto pos = mInfoMap.find(name); - ASSERT_PRECONDITION(pos != mInfoMap.end(), - "uniform named \"%.*s\" not found", name.size(), name.data()); + FILAMENT_CHECK_PRECONDITION(pos != mInfoMap.end()) << "uniform named \"" + << name << "\" not found"; return &mFieldInfoList[pos->second]; } +bool BufferInterfaceBlock::isEmptyForFeatureLevel( + backend::FeatureLevel featureLevel) const noexcept { + return std::all_of(mFieldInfoList.begin(), mFieldInfoList.end(), + [featureLevel](auto const &info) { + return featureLevel < info.minFeatureLevel; + }); +} + uint8_t UTILS_NOINLINE BufferInterfaceBlock::baseAlignmentForType(BufferInterfaceBlock::Type type) noexcept { switch (type) { case Type::BOOL: @@ -230,4 +238,3 @@ uint8_t UTILS_NOINLINE BufferInterfaceBlock::strideForType(BufferInterfaceBlock: } } // namespace filament - diff --git a/libs/filabridge/src/DescriptorSets.cpp b/libs/filabridge/src/DescriptorSets.cpp new file mode 100644 index 00000000000..b313fcc0567 --- /dev/null +++ b/libs/filabridge/src/DescriptorSets.cpp @@ -0,0 +1,197 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "private/filament/DescriptorSets.h" + +#include + +#include + +#include + +#include +#include + +#include +#include +#include + +namespace filament::descriptor_sets { + +using namespace backend; + +static DescriptorSetLayout const postProcessDescriptorSetLayout{{ + { DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::FRAME_UNIFORMS }, +}}; + +static DescriptorSetLayout const depthVariantDescriptorSetLayout{{ + { DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::FRAME_UNIFORMS }, +}}; + +// ssrVariantDescriptorSetLayout must match perViewDescriptorSetLayout's vertex stage. This is +// because the SSR variant is always using the "standard" vertex shader (i.e. there is no +// dedicated SSR vertex shader), which uses perViewDescriptorSetLayout. +// This means that PerViewBindingPoints::SHADOWS must be in the layout even though it's not used +// by the SSR variant. +static DescriptorSetLayout const ssrVariantDescriptorSetLayout{{ + { DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::FRAME_UNIFORMS }, + { DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::SHADOWS }, + { DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::STRUCTURE }, + { DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::SSR }, +}}; + +static DescriptorSetLayout perViewDescriptorSetLayout = {{ + { DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::FRAME_UNIFORMS }, + { DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::SHADOWS }, + { DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::LIGHTS }, + { DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::RECORD_BUFFER }, + { DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::FROXEL_BUFFER }, + { DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::STRUCTURE }, + { DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::SHADOW_MAP }, + { DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::IBL_DFG_LUT }, + { DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::IBL_SPECULAR }, + { DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::SSAO }, + { DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::SSR }, + { DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::FOG }, +}}; + +static DescriptorSetLayout perRenderableDescriptorSetLayout = {{ + { DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerRenderableBindingPoints::OBJECT_UNIFORMS, DescriptorFlags::DYNAMIC_OFFSET }, + { DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerRenderableBindingPoints::BONES_UNIFORMS, DescriptorFlags::DYNAMIC_OFFSET }, + { DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerRenderableBindingPoints::MORPHING_UNIFORMS }, + { DescriptorType::SAMPLER, ShaderStageFlags::VERTEX , +PerRenderableBindingPoints::MORPH_TARGET_POSITIONS }, + { DescriptorType::SAMPLER, ShaderStageFlags::VERTEX , +PerRenderableBindingPoints::MORPH_TARGET_TANGENTS }, + { DescriptorType::SAMPLER, ShaderStageFlags::VERTEX , +PerRenderableBindingPoints::BONES_INDICES_AND_WEIGHTS }, +}}; + +DescriptorSetLayout const& getPostProcessLayout() noexcept { + return postProcessDescriptorSetLayout; +} + +DescriptorSetLayout const& getDepthVariantLayout() noexcept { + return depthVariantDescriptorSetLayout; +} + +DescriptorSetLayout const& getSsrVariantLayout() noexcept { + return ssrVariantDescriptorSetLayout; +} + +DescriptorSetLayout const& getPerRenderableLayout() noexcept { + return perRenderableDescriptorSetLayout; +} + +utils::CString getDescriptorName(DescriptorSetBindingPoints set, + descriptor_binding_t binding) noexcept { + using namespace std::literals; + + static std::unordered_map const set0{{ + { +PerViewBindingPoints::FRAME_UNIFORMS, "FrameUniforms"sv }, + { +PerViewBindingPoints::SHADOWS, "ShadowUniforms"sv }, + { +PerViewBindingPoints::LIGHTS, "LightsUniforms"sv }, + { +PerViewBindingPoints::RECORD_BUFFER, "FroxelRecordUniforms"sv }, + { +PerViewBindingPoints::FROXEL_BUFFER, "FroxelsUniforms"sv }, + { +PerViewBindingPoints::STRUCTURE, "sampler0_structure"sv }, + { +PerViewBindingPoints::SHADOW_MAP, "sampler0_shadowMap"sv }, + { +PerViewBindingPoints::IBL_DFG_LUT, "sampler0_iblDFG"sv }, + { +PerViewBindingPoints::IBL_SPECULAR, "sampler0_iblSpecular"sv }, + { +PerViewBindingPoints::SSAO, "sampler0_ssao"sv }, + { +PerViewBindingPoints::SSR, "sampler0_ssr"sv }, + { +PerViewBindingPoints::FOG, "sampler0_fog"sv }, + }}; + + static std::unordered_map const set1{{ + { +PerRenderableBindingPoints::OBJECT_UNIFORMS, "ObjectUniforms"sv }, + { +PerRenderableBindingPoints::BONES_UNIFORMS, "BonesUniforms"sv }, + { +PerRenderableBindingPoints::MORPHING_UNIFORMS, "MorphingUniforms"sv }, + { +PerRenderableBindingPoints::MORPH_TARGET_POSITIONS, "sampler1_positions"sv }, + { +PerRenderableBindingPoints::MORPH_TARGET_TANGENTS, "sampler1_tangents"sv }, + { +PerRenderableBindingPoints::BONES_INDICES_AND_WEIGHTS, "sampler1_indicesAndWeights"sv }, + }}; + + switch (set) { + case DescriptorSetBindingPoints::PER_VIEW: { + auto pos = set0.find(binding); + assert_invariant(pos != set0.end()); + return { pos->second.data(), pos->second.size() }; + } + case DescriptorSetBindingPoints::PER_RENDERABLE: { + auto pos = set1.find(binding); + assert_invariant(pos != set1.end()); + return { pos->second.data(), pos->second.size() }; + } + case DescriptorSetBindingPoints::PER_MATERIAL: { + assert_invariant(binding < 1); + return "MaterialParams"; + } + } +} + +DescriptorSetLayout getPerViewDescriptorSetLayout( + MaterialDomain domain, + UserVariantFilterMask variantFilter, + bool isLit, + ReflectionMode reflectionMode, + RefractionMode refractionMode) noexcept { + + bool const ssr = reflectionMode == ReflectionMode::SCREEN_SPACE || + refractionMode == RefractionMode::SCREEN_SPACE; + + switch (domain) { + case MaterialDomain::SURFACE: { + // + // CAVEAT: The logic here must match MaterialBuilder::checkMaterialLevelFeatures() + // + auto layout = perViewDescriptorSetLayout; + // remove descriptors not needed for unlit materials + if (!isLit) { + layout.bindings.erase( + std::remove_if(layout.bindings.begin(), layout.bindings.end(), + [](auto const& entry) { + return entry.binding == PerViewBindingPoints::IBL_DFG_LUT || + entry.binding == PerViewBindingPoints::IBL_SPECULAR; + }), + layout.bindings.end()); + } + // remove descriptors not needed for SSRs + if (!ssr) { + layout.bindings.erase( + std::remove_if(layout.bindings.begin(), layout.bindings.end(), + [](auto const& entry) { + return entry.binding == PerViewBindingPoints::SSR; + }), + layout.bindings.end()); + + } + // remove fog descriptor if filtered out + if (variantFilter & (UserVariantFilterMask)UserVariantFilterBit::FOG) { + layout.bindings.erase( + std::remove_if(layout.bindings.begin(), layout.bindings.end(), + [](auto const& entry) { + return entry.binding == PerViewBindingPoints::FOG; + }), + layout.bindings.end()); + } + return layout; + } + case MaterialDomain::POST_PROCESS: + return descriptor_sets::getPostProcessLayout(); + case MaterialDomain::COMPUTE: + // TODO: what's the layout for compute? + return descriptor_sets::getPostProcessLayout(); + } +} + +} // namespace filament::descriptor_sets diff --git a/libs/filabridge/src/SamplerInterfaceBlock.cpp b/libs/filabridge/src/SamplerInterfaceBlock.cpp index 09c70a240b5..1d1f4c387ff 100644 --- a/libs/filabridge/src/SamplerInterfaceBlock.cpp +++ b/libs/filabridge/src/SamplerInterfaceBlock.cpp @@ -16,11 +16,17 @@ #include "private/filament/SamplerInterfaceBlock.h" + +#include + #include -#include +#include +#include +#include #include +#include #include using namespace utils; @@ -43,11 +49,12 @@ SamplerInterfaceBlock::Builder::stageFlags(backend::ShaderStageFlags stageFlags) } SamplerInterfaceBlock::Builder& SamplerInterfaceBlock::Builder::add( - std::string_view samplerName, Type type, Format format, + std::string_view samplerName, Binding binding, Type type, Format format, Precision precision, bool multisample) noexcept { mEntries.push_back({ - { samplerName.data(), samplerName.size() }, { }, - uint8_t(mEntries.size()), type, format, precision, multisample }); + { samplerName.data(), samplerName.size() }, // name + { }, // uniform name + binding, type, format, precision, multisample }); return *this; } @@ -58,7 +65,7 @@ SamplerInterfaceBlock SamplerInterfaceBlock::Builder::build() { SamplerInterfaceBlock::Builder& SamplerInterfaceBlock::Builder::add( std::initializer_list list) noexcept { for (auto& e : list) { - add(e.name, e.type, e.format, e.precision, e.multisample); + add(e.name, e.binding, e.type, e.format, e.precision, e.multisample); } return *this; } @@ -79,22 +86,19 @@ SamplerInterfaceBlock::SamplerInterfaceBlock(Builder const& builder) noexcept auto& samplersInfoList = mSamplersInfoList; - size_t i = 0; for (auto const& e : builder.mEntries) { - assert_invariant(i == e.offset); - SamplerInfo& info = samplersInfoList[i++]; + size_t const i = std::distance(builder.mEntries.data(), &e); + SamplerInfo& info = samplersInfoList[i]; info = e; info.uniformName = generateUniformName(mName.c_str(), e.name.c_str()); - infoMap[{ info.name.data(), info.name.size() }] = info.offset; // info.name.c_str() guaranteed constant + infoMap[{ info.name.data(), info.name.size() }] = i; // info.name.c_str() guaranteed constant } - assert_invariant(i == samplersInfoList.size()); } const SamplerInterfaceBlock::SamplerInfo* SamplerInterfaceBlock::getSamplerInfo( std::string_view name) const { auto pos = mInfoMap.find(name); - ASSERT_PRECONDITION(pos != mInfoMap.end(), "sampler named \"%.*s\" not found", - name.size(), name.data()); + FILAMENT_CHECK_PRECONDITION(pos != mInfoMap.end()) << "sampler named \"" << name << "\" not found"; return &mSamplersInfoList[pos->second]; } diff --git a/libs/filabridge/src/Variant.cpp b/libs/filabridge/src/Variant.cpp index 91a293a3160..a515e83f370 100644 --- a/libs/filabridge/src/Variant.cpp +++ b/libs/filabridge/src/Variant.cpp @@ -16,38 +16,50 @@ #include +#include + +#include + +#include + +#include +#include + namespace filament { Variant Variant::filterUserVariant( Variant variant, UserVariantFilterMask filterMask) noexcept { // these are easy to filter by just removing the corresponding bit if (filterMask & (uint32_t)UserVariantFilterBit::DIRECTIONAL_LIGHTING) { - variant.key &= ~(filterMask & DIR); + variant.key &= ~DIR; } if (filterMask & (uint32_t)UserVariantFilterBit::DYNAMIC_LIGHTING) { - variant.key &= ~(filterMask & DYN); + variant.key &= ~DYN; } if (filterMask & (uint32_t)UserVariantFilterBit::SKINNING) { - variant.key &= ~(filterMask & SKN); + variant.key &= ~SKN; + } + if (filterMask & (uint32_t)UserVariantFilterBit::STE) { + variant.key &= ~(filterMask & STE); } if (!isValidDepthVariant(variant)) { // we can't remove FOG from depth variants, this would, in fact, remove picking if (filterMask & (uint32_t)UserVariantFilterBit::FOG) { - variant.key &= ~(filterMask & FOG); + variant.key &= ~FOG; } } else { // depth variants can have their VSM bit filtered if (filterMask & (uint32_t)UserVariantFilterBit::VSM) { - variant.key &= ~(filterMask & VSM); + variant.key &= ~VSM; } } if (!isSSRVariant(variant)) { // SSR variant needs to be handled separately if (filterMask & (uint32_t)UserVariantFilterBit::SHADOW_RECEIVER) { - variant.key &= ~(filterMask & SRE); + variant.key &= ~SRE; } if (filterMask & (uint32_t)UserVariantFilterBit::VSM) { - variant.key &= ~(filterMask & VSM); + variant.key &= ~VSM; } } else { // see if we need to filter out the SSR variants @@ -60,13 +72,71 @@ Variant Variant::filterUserVariant( namespace details { -// compile time sanity-check tests +namespace { + +// Compile-time variant count for lit and unlit +constexpr inline size_t variant_count(bool lit) noexcept { + size_t count = 0; + for (size_t i = 0; i < VARIANT_COUNT; i++) { + Variant variant(i); + if (!Variant::isValid(variant)) { + continue; + } + variant = Variant::filterVariant(variant, lit); + if (i == variant.key) { + count++; + } + } + return count; +} + +constexpr inline size_t depth_variant_count() noexcept { + size_t count = 0; + for (size_t i = 0; i < VARIANT_COUNT; i++) { + Variant const variant(i); + if (Variant::isValidDepthVariant(variant)) { + count++; + } + } + return count; +} + +// Compile-time variant list for lit and unlit +template +constexpr auto get_variants() noexcept { + std::array variants; + size_t count = 0; + for (size_t i = 0; i < VARIANT_COUNT; i++) { + Variant variant(i); + if (Variant::isReserved(variant)) { + continue; + } + variant = Variant::filterVariant(variant, LIT); + if (i == variant.key) { + variants[count++] = variant; + } + } + return variants; +} + +constexpr auto get_depth_variants() noexcept { + std::array variants; + size_t count = 0; + for (size_t i = 0; i < VARIANT_COUNT; i++) { + Variant const variant(i); + if (Variant::isValidDepthVariant(variant)) { + variants[count++] = variant; + } + } + return variants; +} +// Below are compile time sanity-check tests constexpr inline bool reserved_is_not_valid() noexcept { - for (Variant::type_t i = 0; i < VARIANT_COUNT; i++) { + for (size_t i = 0; i < VARIANT_COUNT; i++) { const Variant variant(i); - bool is_valid = Variant::isValid(variant); - bool is_reserved = Variant::isReserved(variant); + bool const is_valid = Variant::isValid(variant); + bool const is_reserved = Variant::isReserved(variant); if (is_valid == is_reserved) { return false; } @@ -76,7 +146,7 @@ constexpr inline bool reserved_is_not_valid() noexcept { constexpr inline size_t reserved_variant_count() noexcept { size_t count = 0; - for (Variant::type_t i = 0; i < VARIANT_COUNT; i++) { + for (size_t i = 0; i < VARIANT_COUNT; i++) { const Variant variant(i); if (Variant::isReserved(variant)) { count++; @@ -87,7 +157,7 @@ constexpr inline size_t reserved_variant_count() noexcept { constexpr inline size_t valid_variant_count() noexcept { size_t count = 0; - for (Variant::type_t i = 0; i < VARIANT_COUNT; i++) { + for (size_t i = 0; i < VARIANT_COUNT; i++) { const Variant variant(i); if (Variant::isValid(variant)) { count++; @@ -98,7 +168,7 @@ constexpr inline size_t valid_variant_count() noexcept { constexpr inline size_t vertex_variant_count() noexcept { size_t count = 0; - for (Variant::type_t i = 0; i < VARIANT_COUNT; i++) { + for (size_t i = 0; i < VARIANT_COUNT; i++) { const Variant variant(i); if (Variant::isValid(variant)) { if (Variant::isVertexVariant(variant)) { @@ -111,7 +181,7 @@ constexpr inline size_t vertex_variant_count() noexcept { constexpr inline size_t fragment_variant_count() noexcept { size_t count = 0; - for (Variant::type_t i = 0; i < VARIANT_COUNT; i++) { + for (size_t i = 0; i < VARIANT_COUNT; i++) { const Variant variant(i); if (Variant::isValid(variant)) { if (Variant::isFragmentVariant(variant)) { @@ -122,12 +192,36 @@ constexpr inline size_t fragment_variant_count() noexcept { return count; } +} // anonymous namespace + + +static auto const gLitVariants{ details::get_variants() }; +static auto const gUnlitVariants{ details::get_variants() }; +static auto const gDepthVariants{ details::get_depth_variants() }; + static_assert(reserved_is_not_valid()); -static_assert(reserved_variant_count() == 80); -static_assert(valid_variant_count() == 48); -static_assert(vertex_variant_count() == 16 - (2 + 0) + 4 - 0); // 18 +static_assert(reserved_variant_count() == 160); +static_assert(valid_variant_count() == 96); +static_assert(vertex_variant_count() == 32 - (4 + 0) + 8 - 0); // 36 static_assert(fragment_variant_count() == 33 - (2 + 2 + 8) + 4 - 1); // 24 } // namespace details + +namespace VariantUtils { + +utils::Slice getLitVariants() noexcept { + return { details::gLitVariants.data(), details::gLitVariants.size() }; +} + +utils::Slice getUnlitVariants() noexcept { + return { details::gUnlitVariants.data(), details::gUnlitVariants.size() }; +} + +utils::Slice getDepthVariants() noexcept { + return { details::gDepthVariants.data(), details::gDepthVariants.size() }; +} + +}; // VariantUtils + } // namespace filament diff --git a/libs/filaflat/include/filaflat/ChunkContainer.h b/libs/filaflat/include/filaflat/ChunkContainer.h index 95a96ca5f02..d0da2a366bd 100644 --- a/libs/filaflat/include/filaflat/ChunkContainer.h +++ b/libs/filaflat/include/filaflat/ChunkContainer.h @@ -67,25 +67,16 @@ class UTILS_PUBLIC ChunkContainer { } std::pair getChunkRange(Type type) const noexcept { - ChunkDesc const* pChunkDesc; - bool success = hasChunk(type, &pChunkDesc); + ChunkDesc chunkDesc; + bool const success = hasChunk(type, &chunkDesc); if (success) { - return { pChunkDesc->start, pChunkDesc->start + pChunkDesc->size }; + return { chunkDesc.start, chunkDesc.start + chunkDesc.size }; } return { nullptr, nullptr }; } - bool hasChunk(Type type, ChunkDesc const** pChunkDesc = nullptr) const noexcept { - auto& chunks = mChunks; - auto pos = chunks.find(type); - if (pos != chunks.end()) { - if (pChunkDesc) { - *pChunkDesc = &pos.value(); - } - return true; - } - return false; - } + bool hasChunk(Type type) const noexcept; + bool hasChunk(Type type, ChunkDesc* pChunkDesc) const noexcept; void const* getData() const { return mData; } diff --git a/libs/filaflat/include/filaflat/MaterialChunk.h b/libs/filaflat/include/filaflat/MaterialChunk.h index fa4f2a54224..304819769ee 100644 --- a/libs/filaflat/include/filaflat/MaterialChunk.h +++ b/libs/filaflat/include/filaflat/MaterialChunk.h @@ -26,10 +26,17 @@ #include +#include + +#include +#include + namespace filaflat { class MaterialChunk { public: + using ShaderModel = filament::backend::ShaderModel; + using ShaderStage = filament::backend::ShaderStage; using Variant = filament::Variant; explicit MaterialChunk(ChunkContainer const& container); @@ -41,11 +48,18 @@ class MaterialChunk { // call this as many times as needed // populates "shaderContent" with the requested shader, or returns false on failure. bool getShader(ShaderContent& shaderContent, BlobDictionary const& dictionary, - uint8_t shaderModel, Variant variant, uint8_t stage); + ShaderModel shaderModel, filament::Variant variant, ShaderStage stage); + + uint32_t getShaderCount() const noexcept; + + void visitShaders(utils::Invocable&& visitor) const; + + bool hasShader(ShaderModel model, Variant variant, ShaderStage stage) const noexcept; // These methods are for debugging purposes only (matdbg) // @{ - static void decodeKey(uint32_t key, uint8_t* model, Variant::type_t* variant, uint8_t* stage); + static void decodeKey(uint32_t key, + ShaderModel* outModel, Variant* outVariant, ShaderStage* outStage); const tsl::robin_map& getOffsets() const { return mOffsets; } // @} @@ -58,11 +72,11 @@ class MaterialChunk { bool getTextShader(Unflattener unflattener, BlobDictionary const& dictionary, ShaderContent& shaderContent, - uint8_t shaderModel, Variant variant, uint8_t stage); + ShaderModel shaderModel, filament::Variant variant, ShaderStage shaderStage); - bool getSpirvShader( + bool getBinaryShader( BlobDictionary const& dictionary, ShaderContent& shaderContent, - uint8_t shaderModel, Variant variant, uint8_t stage); + ShaderModel shaderModel, filament::Variant variant, ShaderStage shaderStage); }; } // namespace filamat diff --git a/libs/filaflat/include/filaflat/Unflattener.h b/libs/filaflat/include/filaflat/Unflattener.h index 11759aeb45b..d484ce71cd9 100644 --- a/libs/filaflat/include/filaflat/Unflattener.h +++ b/libs/filaflat/include/filaflat/Unflattener.h @@ -22,6 +22,8 @@ #include +#include + #include namespace filaflat { @@ -46,7 +48,7 @@ class UTILS_PUBLIC Unflattener { return mCursor < mEnd; } - inline bool willOverflow(size_t size) const noexcept { + bool willOverflow(size_t size) const noexcept { return (mCursor + size) > mEnd; } @@ -56,100 +58,41 @@ class UTILS_PUBLIC Unflattener { assert_invariant(0 == (intptr_t(mCursor) % 8)); } - bool read(bool* b) noexcept { - if (willOverflow(1)) { + template>> + bool read(T* const out) noexcept { + if (UTILS_UNLIKELY(willOverflow(sizeof(T)))) { return false; } - *b = mCursor[0]; - mCursor += 1; + auto const* const cursor = mCursor; + mCursor += sizeof(T); + T v = 0; + for (size_t i = 0; i < sizeof(T); i++) { + v |= T(cursor[i]) << (8 * i); + } + *out = v; return true; } - bool read(uint8_t* i) noexcept { - if (willOverflow(1)) { - return false; - } - *i = mCursor[0]; - mCursor += 1; - return true; + bool read(float* f) noexcept { + return read(reinterpret_cast(reinterpret_cast(f))); } bool read(filament::Variant* v) noexcept { return read(&v->key); } - bool read(uint16_t* i) noexcept { - if (willOverflow(2)) { - return false; - } - *i = 0; - *i |= mCursor[0]; - *i |= mCursor[1] << 8; - mCursor += 2; - return true; - } - - bool read(uint32_t* i) noexcept { - if (willOverflow(4)) { - return false; - } - *i = 0; - *i |= mCursor[0]; - *i |= mCursor[1] << 8; - *i |= mCursor[2] << 16; - *i |= mCursor[3] << 24; - mCursor += 4; - return true; - } - - bool read(uint64_t* i) noexcept { - if (willOverflow(8)) { - return false; - } - *i = 0; - *i |= static_cast(mCursor[0]); - *i |= static_cast(mCursor[1]) << 8; - *i |= static_cast(mCursor[2]) << 16; - *i |= static_cast(mCursor[3]) << 24; - *i |= static_cast(mCursor[4]) << 32; - *i |= static_cast(mCursor[5]) << 40; - *i |= static_cast(mCursor[6]) << 48; - *i |= static_cast(mCursor[7]) << 56; - mCursor += 8; - return true; - } - bool read(utils::CString* s) noexcept; bool read(const char** blob, size_t* size) noexcept; bool read(const char** s) noexcept; - bool read(float* f) noexcept { - if (willOverflow(4)) { - return false; - } - uint32_t i; - i = 0; - i |= mCursor[0]; - i |= mCursor[1] << 8; - i |= mCursor[2] << 16; - i |= mCursor[3] << 24; - *f = reinterpret_cast(i); - mCursor += 4; - return true; - } - const uint8_t* getCursor() const noexcept { return mCursor; } void setCursor(const uint8_t* cursor) noexcept { - if (mSrc <= cursor && cursor < mEnd) { - mCursor = cursor; - } else { - mCursor = mEnd; - } + mCursor = (cursor >= mSrc && cursor < mEnd) ? cursor : mEnd; } private: diff --git a/libs/filaflat/src/ChunkContainer.cpp b/libs/filaflat/src/ChunkContainer.cpp index 5419c91b8a0..d2d348053fc 100644 --- a/libs/filaflat/src/ChunkContainer.cpp +++ b/libs/filaflat/src/ChunkContainer.cpp @@ -22,6 +22,23 @@ namespace filaflat { ChunkContainer::~ChunkContainer() noexcept = default; +bool ChunkContainer::hasChunk(Type type) const noexcept { + auto const& chunks = mChunks; + auto pos = chunks.find(type); + return pos != chunks.end(); +} + +bool ChunkContainer::hasChunk(Type type, ChunkDesc* pChunkDesc) const noexcept { + assert_invariant(pChunkDesc); + auto const& chunks = mChunks; + auto pos = chunks.find(type); + if (UTILS_LIKELY(pos != chunks.end())) { + *pChunkDesc = pos.value(); + return true; + } + return false; +} + bool ChunkContainer::parseChunk(Unflattener& unflattener) { uint64_t type; if (!unflattener.read(&type)) { diff --git a/libs/filaflat/src/DictionaryReader.cpp b/libs/filaflat/src/DictionaryReader.cpp index 87c8d9a2e08..6a84ca34b62 100644 --- a/libs/filaflat/src/DictionaryReader.cpp +++ b/libs/filaflat/src/DictionaryReader.cpp @@ -78,6 +78,25 @@ bool DictionaryReader::unflatten(ChunkContainer const& container, } return true; + } else if (dictionaryTag == ChunkType::DictionaryMetalLibrary) { + uint32_t blobCount; + if (!unflattener.read(&blobCount)) { + return false; + } + + dictionary.reserve(blobCount); + for (uint32_t i = 0; i < blobCount; i++) { + unflattener.skipAlignmentPadding(); + + const char* data; + size_t dataSize; + if (!unflattener.read(&data, &dataSize)) { + return false; + } + dictionary.emplace_back(dataSize); + memcpy(dictionary.back().data(), data, dictionary.back().size()); + } + return true; } else if (dictionaryTag == ChunkType::DictionaryText) { uint32_t stringCount = 0; if (!unflattener.read(&stringCount)) { diff --git a/libs/filaflat/src/MaterialChunk.cpp b/libs/filaflat/src/MaterialChunk.cpp index 3fcc829187f..b69af9abd08 100644 --- a/libs/filaflat/src/MaterialChunk.cpp +++ b/libs/filaflat/src/MaterialChunk.cpp @@ -17,20 +17,27 @@ #include #include +#include + #include namespace filaflat { -static inline uint32_t makeKey(uint8_t shaderModel, filament::Variant variant, uint8_t stage) noexcept { +static inline uint32_t makeKey( + MaterialChunk::ShaderModel shaderModel, + MaterialChunk::Variant variant, + MaterialChunk::ShaderStage stage) noexcept { static_assert(sizeof(variant.key) * 8 <= 8); - return (shaderModel << 16) | (stage << 8) | variant.key; + return (uint32_t(shaderModel) << 16) | (uint32_t(stage) << 8) | variant.key; } -void MaterialChunk::decodeKey(uint32_t key, uint8_t* model, filament::Variant::type_t* variant, - uint8_t* stage) { - *variant = key & 0xff; - *stage = (key >> 8) & 0xff; - *model = (key >> 16) & 0xff; +void MaterialChunk::decodeKey(uint32_t key, + MaterialChunk::ShaderModel* model, + MaterialChunk::Variant* variant, + MaterialChunk::ShaderStage* stage) { + variant->key = key & 0xff; + *model = MaterialChunk::ShaderModel((key >> 16) & 0xff); + *stage = MaterialChunk::ShaderStage((key >> 8) & 0xff); } MaterialChunk::MaterialChunk(ChunkContainer const& container) @@ -61,12 +68,12 @@ bool MaterialChunk::initialize(filamat::ChunkType materialTag) { // Read all index entries. for (uint64_t i = 0 ; i < numShaders; i++) { - uint8_t shaderModelValue; - filament::Variant variant; - uint8_t pipelineStageValue; + uint8_t model; + Variant variant; + uint8_t stage; uint32_t offsetValue; - if (!unflattener.read(&shaderModelValue)) { + if (!unflattener.read(&model)) { return false; } @@ -74,7 +81,7 @@ bool MaterialChunk::initialize(filamat::ChunkType materialTag) { return false; } - if (!unflattener.read(&pipelineStageValue)) { + if (!unflattener.read(&stage)) { return false; } @@ -82,20 +89,21 @@ bool MaterialChunk::initialize(filamat::ChunkType materialTag) { return false; } - uint32_t key = makeKey(shaderModelValue, variant, pipelineStageValue); + uint32_t key = makeKey(ShaderModel(model), variant, ShaderStage(stage)); mOffsets[key] = offsetValue; } return true; } -bool MaterialChunk::getTextShader(Unflattener unflattener, BlobDictionary const& dictionary, - ShaderContent& shaderContent, uint8_t shaderModel, filament::Variant variant, uint8_t ps) { +bool MaterialChunk::getTextShader(Unflattener unflattener, + BlobDictionary const& dictionary, ShaderContent& shaderContent, + ShaderModel shaderModel, Variant variant, ShaderStage shaderStage) { if (mBase == nullptr) { return false; } // Jump and read - uint32_t key = makeKey(shaderModel, variant, ps); + uint32_t key = makeKey(shaderModel, variant, shaderStage); auto pos = mOffsets.find(key); if (pos == mOffsets.end()) { return false; @@ -145,14 +153,14 @@ bool MaterialChunk::getTextShader(Unflattener unflattener, BlobDictionary const& return true; } -bool MaterialChunk::getSpirvShader(BlobDictionary const& dictionary, - ShaderContent& shaderContent, uint8_t shaderModel, filament::Variant variant, uint8_t stage) { +bool MaterialChunk::getBinaryShader(BlobDictionary const& dictionary, + ShaderContent& shaderContent, ShaderModel shaderModel, filament::Variant variant, ShaderStage shaderStage) { if (mBase == nullptr) { return false; } - uint32_t key = makeKey(shaderModel, variant, stage); + uint32_t key = makeKey(shaderModel, variant, shaderStage); auto pos = mOffsets.find(key); if (pos == mOffsets.end()) { return false; @@ -162,18 +170,63 @@ bool MaterialChunk::getSpirvShader(BlobDictionary const& dictionary, return true; } -bool MaterialChunk::getShader(ShaderContent& shaderContent, - BlobDictionary const& dictionary, uint8_t shaderModel, filament::Variant variant, uint8_t stage) { +bool MaterialChunk::hasShader(ShaderModel model, Variant variant, ShaderStage stage) const noexcept { + if (mBase == nullptr) { + return false; + } + auto pos = mOffsets.find(makeKey(model, variant, stage)); + return pos != mOffsets.end(); +} + +bool MaterialChunk::getShader(ShaderContent& shaderContent, BlobDictionary const& dictionary, + ShaderModel shaderModel, filament::Variant variant, ShaderStage stage) { switch (mMaterialTag) { case filamat::ChunkType::MaterialGlsl: + case filamat::ChunkType::MaterialEssl1: case filamat::ChunkType::MaterialMetal: return getTextShader(mUnflattener, dictionary, shaderContent, shaderModel, variant, stage); case filamat::ChunkType::MaterialSpirv: - return getSpirvShader(dictionary, shaderContent, shaderModel, variant, stage); + case filamat::ChunkType::MaterialMetalLibrary: + return getBinaryShader(dictionary, shaderContent, shaderModel, variant, stage); default: return false; } } +uint32_t MaterialChunk::getShaderCount() const noexcept { + Unflattener unflattener{ mUnflattener }; // make a copy + uint64_t numShaders; + unflattener.read(&numShaders); + return uint32_t(numShaders); +} + +void MaterialChunk::visitShaders( + utils::Invocable&& visitor) const { + + Unflattener unflattener{ mUnflattener }; // make a copy + + // read() calls below cannot fail by construction, because we've already run through them + // in the constructor. + + // Read how many shaders we have in the chunk. + uint64_t numShaders; + unflattener.read(&numShaders); + + // Read all index entries. + for (uint64_t i = 0; i < numShaders; i++) { + uint8_t shaderModelValue; + filament::Variant variant; + uint8_t pipelineStageValue; + uint32_t offsetValue; + + unflattener.read(&shaderModelValue); + unflattener.read(&variant); + unflattener.read(&pipelineStageValue); + unflattener.read(&offsetValue); + + visitor(ShaderModel(shaderModelValue), variant, ShaderStage(pipelineStageValue)); + } +} + } // namespace filaflat diff --git a/libs/filaflat/src/Unflattener.cpp b/libs/filaflat/src/Unflattener.cpp index d339ee6aaa6..7a16f7dcf3f 100644 --- a/libs/filaflat/src/Unflattener.cpp +++ b/libs/filaflat/src/Unflattener.cpp @@ -18,19 +18,6 @@ namespace filaflat { -bool Unflattener::read(utils::CString* s) noexcept { - const uint8_t* start = mCursor; - while (mCursor < mEnd && *mCursor != '\0') { - mCursor++; - } - bool overflowed = mCursor >= mEnd; - if (!overflowed) { - *s = utils::CString{ (const char*)start, (utils::CString::size_type)(mCursor - start) }; - mCursor++; - } - return !overflowed; -} - bool Unflattener::read(const char** blob, size_t* size) noexcept { uint64_t nbytes; if (!read(&nbytes)) { @@ -38,7 +25,7 @@ bool Unflattener::read(const char** blob, size_t* size) noexcept { } const uint8_t* start = mCursor; mCursor += nbytes; - bool overflowed = mCursor > mEnd; + bool const overflowed = mCursor > mEnd; if (!overflowed) { *blob = (const char*)start; *size = nbytes; @@ -46,16 +33,35 @@ bool Unflattener::read(const char** blob, size_t* size) noexcept { return !overflowed; } -bool Unflattener::read(const char** s) noexcept { - const uint8_t* start = mCursor; - while (mCursor < mEnd && *mCursor != '\0') { - mCursor++; +bool Unflattener::read(utils::CString* const s) noexcept { + const uint8_t* const start = mCursor; + const uint8_t* const last = mEnd; + const uint8_t* curr = start; + while (curr < last && *curr != '\0') { + curr++; } - bool overflowed = mCursor >= mEnd; - if (!overflowed) { - mCursor++; + bool const overflowed = start >= last; + if (UTILS_LIKELY(!overflowed)) { + *s = utils::CString{ (const char*)start, utils::CString::size_type(curr - start) }; + curr++; + } + mCursor = curr; + return !overflowed; +} + +bool Unflattener::read(const char** const s) noexcept { + const uint8_t* const start = mCursor; + const uint8_t* const last = mEnd; + const uint8_t* curr = start; + while (curr < last && *curr != '\0') { + curr++; + } + bool const overflowed = start >= last; + if (UTILS_LIKELY(!overflowed)) { + *s = (char const*)start; + curr++; } - *s = (char*)start; + mCursor = curr; return !overflowed; } diff --git a/libs/filagui/CMakeLists.txt b/libs/filagui/CMakeLists.txt index 8e63b0ee551..dac013ce7f5 100644 --- a/libs/filagui/CMakeLists.txt +++ b/libs/filagui/CMakeLists.txt @@ -33,15 +33,27 @@ endif() set(MATERIAL_SRCS src/materials/uiBlit.mat) +if (ANDROID) + list(APPEND MATERIAL_SRCS + src/materials/uiBlitExternal.mat) +endif() + file(MAKE_DIRECTORY ${MATERIAL_DIR}) +set (MATC_FLAGS ${MATC_BASE_FLAGS}) +if (FILAMENT_SAMPLES_STEREO_TYPE STREQUAL "instanced") + set (MATC_FLAGS ${MATC_FLAGS} -PstereoscopicType=instanced) +elseif (FILAMENT_SAMPLES_STEREO_TYPE STREQUAL "multiview") + set (MATC_FLAGS ${MATC_FLAGS} -PstereoscopicType=multiview) +endif () + foreach (mat_src ${MATERIAL_SRCS}) get_filename_component(localname "${mat_src}" NAME_WE) get_filename_component(fullname "${mat_src}" ABSOLUTE) set(output_path "${MATERIAL_DIR}/${localname}.filamat") add_custom_command( OUTPUT ${output_path} - COMMAND matc ${MATC_BASE_FLAGS} -o ${output_path} ${fullname} + COMMAND matc ${MATC_FLAGS} -o ${output_path} ${fullname} DEPENDS ${mat_src} matc COMMENT "Compiling material ${mat_src} to ${output_path}" ) @@ -91,6 +103,5 @@ set_target_properties(${TARGET} PROPERTIES FOLDER Libs) if (NOT MSVC) target_compile_options(${TARGET} PRIVATE -Wno-deprecated-register - $<$:-ffast-math> ) endif() diff --git a/libs/filagui/include/filagui/ImGuiHelper.h b/libs/filagui/include/filagui/ImGuiHelper.h index f953acbc91e..3f55ac77bbd 100644 --- a/libs/filagui/include/filagui/ImGuiHelper.h +++ b/libs/filagui/include/filagui/ImGuiHelper.h @@ -83,11 +83,15 @@ class UTILS_PUBLIC ImGuiHelper { filament::Engine* mEngine; filament::View* mView; // The view is owned by the client. filament::Scene* mScene; - filament::Material* mMaterial = nullptr; + filament::Material* mMaterial2d = nullptr; + std::vector mMaterial2dInstances; +#ifdef __ANDROID__ + filament::Material* mMaterialExternal = nullptr; + std::vector mMaterialExternalInstances; +#endif filament::Camera* mCamera = nullptr; std::vector mVertexBuffers; std::vector mIndexBuffers; - std::vector mMaterialInstances; utils::Entity mRenderable; utils::Entity mCameraEntity; filament::Texture* mTexture = nullptr; @@ -95,6 +99,7 @@ class UTILS_PUBLIC ImGuiHelper { ImGuiContext* mImGuiContext; filament::TextureSampler mSampler; bool mFlipVertical = false; + utils::Path mSettingsPath; }; } // namespace filagui diff --git a/libs/filagui/src/ImGuiExtensions.cpp b/libs/filagui/src/ImGuiExtensions.cpp index 89b5944d40e..a01b7e2a14c 100644 --- a/libs/filagui/src/ImGuiExtensions.cpp +++ b/libs/filagui/src/ImGuiExtensions.cpp @@ -119,7 +119,7 @@ static void PlotEx(ImGuiPlotType plot_type, const char* label, int series_count, const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0)); ImGui::ItemSize(total_bb, style.FramePadding.y); if (!ImGui::ItemAdd(total_bb, 0, &frame_bb)) return; - const bool hovered = ImGui::ItemHoverable(inner_bb, 0); + const bool hovered = ImGui::ItemHoverable(inner_bb, 0, ImGuiHoveredFlags_None); // Determine scale from values if not specified if (scale_min == FLT_MAX || scale_max == FLT_MAX) { diff --git a/libs/filagui/src/ImGuiHelper.cpp b/libs/filagui/src/ImGuiHelper.cpp index 0d470a72e11..7d22547fdb9 100644 --- a/libs/filagui/src/ImGuiHelper.cpp +++ b/libs/filagui/src/ImGuiHelper.cpp @@ -32,6 +32,7 @@ #include #include #include + #include using namespace filament::math; @@ -50,11 +51,23 @@ ImGuiHelper::ImGuiHelper(Engine* engine, filament::View* view, const Path& fontP : mEngine(engine), mView(view), mScene(engine->createScene()), mImGuiContext(imGuiContext ? imGuiContext : ImGui::CreateContext()) { ImGuiIO& io = ImGui::GetIO(); + mSettingsPath.setPath( + Path::getUserSettingsDirectory() + + Path(std::string(".") + Path::getCurrentExecutable().getNameWithoutExtension()) + + Path("imgui_settings.ini") + ); + mSettingsPath.getParent().mkdirRecursive(); + io.IniFilename = mSettingsPath.c_str(); // Create a simple alpha-blended 2D blitting material. - mMaterial = Material::Builder() + mMaterial2d = Material::Builder() .package(FILAGUI_RESOURCES_UIBLIT_DATA, FILAGUI_RESOURCES_UIBLIT_SIZE) .build(*engine); +#ifdef __ANDROID__ + mMaterialExternal = Material::Builder() + .package(FILAGUI_RESOURCES_UIBLITEXTERNAL_DATA, FILAGUI_RESOURCES_UIBLITEXTERNAL_SIZE) + .build(*engine); +#endif // If the given font path is invalid, ImGui will silently fall back to proggy, which is a // tiny "pixel art" texture that is compiled into the library. @@ -66,7 +79,7 @@ ImGuiHelper::ImGuiHelper(Engine* engine, filament::View* view, const Path& fontP // For proggy, switch to NEAREST for pixel-perfect text. if (!fontPath.isFile() && !imGuiContext) { mSampler = TextureSampler(MinFilter::NEAREST, MagFilter::NEAREST); - mMaterial->setDefaultParameter("albedo", mTexture, mSampler); + mMaterial2d->setDefaultParameter("albedo", mTexture, mSampler); } utils::EntityManager& em = utils::EntityManager::get(); @@ -109,7 +122,7 @@ void ImGuiHelper::createAtlasTexture(Engine* engine) { mTexture->setImage(*engine, 0, std::move(pb)); mSampler = TextureSampler(MinFilter::LINEAR, MagFilter::LINEAR); - mMaterial->setDefaultParameter("albedo", mTexture, mSampler); + mMaterial2d->setDefaultParameter("albedo", mTexture, mSampler); } ImGuiHelper::~ImGuiHelper() { @@ -117,10 +130,16 @@ ImGuiHelper::~ImGuiHelper() { mEngine->destroy(mRenderable); mEngine->destroyCameraComponent(mCameraEntity); - for (auto& mi : mMaterialInstances) { + for (auto& mi : mMaterial2dInstances) { mEngine->destroy(mi); } - mEngine->destroy(mMaterial); + mEngine->destroy(mMaterial2d); +#ifdef __ANDROID__ + for (auto& mi : mMaterialExternalInstances) { + mEngine->destroy(mi); + } + mEngine->destroy(mMaterialExternal); +#endif mEngine->destroy(mTexture); for (auto& vb : mVertexBuffers) { mEngine->destroy(vb); @@ -194,19 +213,12 @@ void ImGuiHelper::processImGuiCommands(ImDrawData* commands, const ImGuiIO& io) auto rbuilder = RenderableManager::Builder(nPrims); rbuilder.boundingBox({{ 0, 0, 0 }, { 10000, 10000, 10000 }}).culling(false); - // Ensure that we have a material instance for each primitive. - size_t previousSize = mMaterialInstances.size(); - if (nPrims > mMaterialInstances.size()) { - mMaterialInstances.resize(nPrims); - for (size_t i = previousSize; i < mMaterialInstances.size(); i++) { - mMaterialInstances[i] = mMaterial->createInstance(); - } - } - // Recreate the Renderable component and point it to the vertex buffers. rcm.destroy(mRenderable); int bufferIndex = 0; int primIndex = 0; + int material2dIndex = 0; + int materialExternalIndex = 0; for (int cmdListIndex = 0; cmdListIndex < commands->CmdListsCount; cmdListIndex++) { const ImDrawList* cmds = commands->CmdLists[cmdListIndex]; populateVertexData(bufferIndex, @@ -216,16 +228,30 @@ void ImGuiHelper::processImGuiCommands(ImDrawData* commands, const ImGuiIO& io) if (pcmd.UserCallback) { pcmd.UserCallback(cmds, &pcmd); } else { - MaterialInstance* materialInstance = mMaterialInstances[primIndex]; + auto texture = (Texture const*)pcmd.TextureId; + MaterialInstance* materialInstance; +#ifdef __ANDROID__ + if (texture && texture->getTarget() == Texture::Sampler::SAMPLER_EXTERNAL) { + if (materialExternalIndex == mMaterialExternalInstances.size()) { + mMaterialExternalInstances.push_back(mMaterialExternal->createInstance()); + } + materialInstance = mMaterialExternalInstances[materialExternalIndex++]; + } else +#endif + { + if (material2dIndex == mMaterial2dInstances.size()) { + mMaterial2dInstances.push_back(mMaterial2d->createInstance()); + } + materialInstance = mMaterial2dInstances[material2dIndex++]; + } materialInstance->setScissor( pcmd.ClipRect.x, mFlipVertical ? pcmd.ClipRect.y : (fbheight - pcmd.ClipRect.w), (uint16_t) (pcmd.ClipRect.z - pcmd.ClipRect.x), (uint16_t) (pcmd.ClipRect.w - pcmd.ClipRect.y)); - if (pcmd.TextureId) { + if (texture) { TextureSampler sampler(MinFilter::LINEAR, MagFilter::LINEAR); - materialInstance->setParameter("albedo", - (Texture const*)pcmd.TextureId, sampler); + materialInstance->setParameter("albedo", texture, sampler); } else { materialInstance->setParameter("albedo", mTexture, mSampler); } diff --git a/libs/filagui/src/materials/uiBlit.mat b/libs/filagui/src/materials/uiBlit.mat index 46b66338a91..774113fbd33 100644 --- a/libs/filagui/src/materials/uiBlit.mat +++ b/libs/filagui/src/materials/uiBlit.mat @@ -13,15 +13,16 @@ material { shadingModel : unlit, culling : none, depthCulling: false, - blending : transparent + blending : transparent, + featureLevel : 0 } fragment { void material(inout MaterialInputs material) { - prepareMaterial(material); + prepareMaterial(material); vec2 uv = getUV0(); uv.y = 1.0 - uv.y; - vec4 albedo = texture(materialParams_albedo, uv); + vec4 albedo = texture2D(materialParams_albedo, uv); material.baseColor = getColor() * albedo; material.baseColor.rgb *= material.baseColor.a; } diff --git a/libs/filagui/src/materials/uiBlitExternal.mat b/libs/filagui/src/materials/uiBlitExternal.mat new file mode 100644 index 00000000000..f07187837de --- /dev/null +++ b/libs/filagui/src/materials/uiBlitExternal.mat @@ -0,0 +1,29 @@ +material { + name : uiBlitExternal, + parameters : [ + { + type : samplerExternal, + name : albedo + } + ], + requires : [ + uv0, + color + ], + shadingModel : unlit, + culling : none, + depthCulling: false, + blending : transparent, + featureLevel : 0 +} + +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + vec2 uv = getUV0(); + uv.y = 1.0 - uv.y; + vec4 albedo = texture2D(materialParams_albedo, uv); + material.baseColor = getColor() * albedo; + material.baseColor.rgb *= material.baseColor.a; + } +} diff --git a/libs/filamat/CMakeLists.txt b/libs/filamat/CMakeLists.txt index d4be03fa717..c74ad631fa6 100644 --- a/libs/filamat/CMakeLists.txt +++ b/libs/filamat/CMakeLists.txt @@ -4,11 +4,6 @@ project(filamat) set(TARGET filamat) set(PUBLIC_HDR_DIR include) -# filamat is split into two targets: filamat, and filamat_lite. -# filamat_lite forgoes SPIRV-V / MSL output, static analysis, and optimization in favor of a smaller -# binary size. -# Both libraries use the same public header files. - # ================================================================================================== # Sources and headers # ================================================================================================== @@ -28,7 +23,8 @@ set(COMMON_PRIVATE_HDRS src/eiff/MaterialInterfaceBlockChunk.h src/eiff/ShaderEntry.h src/eiff/SimpleFieldChunk.h - src/Includes.h) + src/Includes.h + src/PushConstantDefinitions.h) set(COMMON_SRCS src/eiff/Chunk.cpp @@ -40,13 +36,12 @@ set(COMMON_SRCS src/eiff/SimpleFieldChunk.cpp src/shaders/CodeGenerator.cpp src/shaders/ShaderGenerator.cpp + src/shaders/SibGenerator.cpp + src/shaders/UibGenerator.cpp src/Enums.cpp src/Includes.cpp src/MaterialBuilder.cpp src/MaterialVariants.cpp - src/SamplerBindingMap.cpp - src/SibGenerator.cpp - src/UibGenerator.cpp ) # Sources and headers for filamat @@ -55,10 +50,12 @@ set(PRIVATE_HDRS ${COMMON_PRIVATE_HDRS} src/eiff/BlobDictionary.h src/eiff/DictionarySpirvChunk.h - src/eiff/MaterialSpirvChunk.h + src/eiff/DictionaryMetalLibraryChunk.h + src/eiff/MaterialBinaryChunk.h src/GLSLPostProcessor.h src/MetalArgumentBuffer.h src/ShaderMinifier.h + src/SpirvFixup.h src/sca/ASTHelpers.h src/sca/GLSLTools.h src/sca/builtinResource.h) @@ -67,22 +64,14 @@ set(SRCS ${COMMON_SRCS} src/eiff/BlobDictionary.cpp src/eiff/DictionarySpirvChunk.cpp - src/eiff/MaterialSpirvChunk.cpp + src/eiff/DictionaryMetalLibraryChunk.cpp + src/eiff/MaterialBinaryChunk.cpp src/MetalArgumentBuffer.cpp src/sca/ASTHelpers.cpp src/sca/GLSLTools.cpp src/GLSLPostProcessor.cpp - src/ShaderMinifier.cpp) - -# Sources and headers for filamat lite - -set(LITE_PRIVATE_HDRS - ${COMMON_PRIVATE_HDRS} - src/sca/GLSLToolsLite.h) - -set(LITE_SRCS - ${COMMON_SRCS} - src/sca/GLSLToolsLite.cpp) + src/ShaderMinifier.cpp + src/SpirvFixup.cpp) # ================================================================================================== # Include and target definitions @@ -94,13 +83,7 @@ include_directories(${CMAKE_BINARY_DIR}) add_library(${TARGET} STATIC ${HDRS} ${PRIVATE_HDRS} ${SRCS}) target_include_directories(${TARGET} PUBLIC ${PUBLIC_HDR_DIR}) set_target_properties(${TARGET} PROPERTIES FOLDER Libs) -target_link_libraries(${TARGET} shaders filabridge utils smol-v) - -# Filamat Lite -add_library(filamat_lite STATIC ${HDRS} ${LITE_PRIVATE_HDRS} ${LITE_SRCS}) -target_include_directories(filamat_lite PUBLIC ${PUBLIC_HDR_DIR}) -set_target_properties(filamat_lite PROPERTIES FOLDER Libs) -target_link_libraries(filamat_lite shaders filabridge utils) +target_link_libraries(${TARGET} backend_headers shaders filabridge utils smol-v) # We are being naughty and accessing private headers here # For spirv-tools, we're just following glslang's example @@ -122,12 +105,14 @@ endif() # this must match options enabled in glslang's CMakeLists.txt target_compile_options(${TARGET} PRIVATE -DAMD_EXTENSIONS -DNV_EXTENSIONS ) -target_compile_definitions(filamat_lite PRIVATE FILAMAT_LITE) - if (MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W0 /Zc:__cplusplus") endif() +if (FILAMENT_ENABLE_MATDBG) + add_definitions(-DFILAMENT_ENABLE_MATDBG) +endif() + # ================================================================================================== # Installation # ================================================================================================== @@ -156,8 +141,6 @@ set(FILAMAT_LIB_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}filamat${CMAKE_STATIC_LIBRARY install(FILES "${FILAMAT_COMBINED_OUTPUT}" DESTINATION lib/${DIST_DIR} RENAME ${FILAMAT_LIB_NAME}) install(DIRECTORY ${PUBLIC_HDR_DIR}/filamat DESTINATION include) -install(TARGETS filamat_lite ARCHIVE DESTINATION lib/${DIST_DIR}) - # ================================================================================================== # Tests # ================================================================================================== @@ -166,6 +149,7 @@ set(TARGET test_filamat) set(SRCS tests/test_filamat.cpp tests/test_argBufferFixup.cpp + tests/test_clipDistanceFixup.cpp tests/test_includes.cpp) add_executable(${TARGET} ${SRCS}) @@ -176,14 +160,3 @@ target_link_libraries(${TARGET} filamat gtest) set_target_properties(${TARGET} PROPERTIES FOLDER Tests) -set(TARGET test_filamat_lite) -set(SRCS - tests/test_filamat_lite.cpp) - -add_executable(${TARGET} ${SRCS}) - -target_include_directories(${TARGET} PRIVATE src) - -target_link_libraries(${TARGET} filamat_lite gtest) - -set_target_properties(${TARGET} PROPERTIES FOLDER Tests) diff --git a/libs/filamat/README.md b/libs/filamat/README.md index dd810042750..61d98c67677 100644 --- a/libs/filamat/README.md +++ b/libs/filamat/README.md @@ -35,7 +35,7 @@ for example, `filament-20181009-linux.tgz`. Create a file, `main.cpp`, in the same directory with the following contents: -``` +```c++ #include #include @@ -85,7 +85,7 @@ Copy your platform's Makefile below into a `Makefile` inside the same directory. ### Linux -``` +```make FILAMENT_LIBS=-lfilamat -lfilabridge -lshaders -lutils -lsmol-v CC=clang++ @@ -103,7 +103,7 @@ clean: ### macOS -``` +```make FILAMENT_LIBS=-lfilamat -lfilabridge -lshaders -lutils -lsmol-v CC=clang++ @@ -129,7 +129,7 @@ flags](https://docs.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-tim When building Filamat from source, the `USE_STATIC_CRT` CMake option can be used to change the run-time library version. -``` +```make FILAMENT_LIBS=lib/x86_64/mt/filamat.lib lib/x86_64/mt/filabridge.lib lib/x86_64/mt/shaders.lib \ lib/x86_64/mt/utils.lib lib/x86_64/mt/smol-v.lib CC=clang-cl.exe @@ -164,7 +164,7 @@ and invoke `nmake` instead of `make`. For simplicity, this demo doesn't do anything useful with the built material package. To use the material with Filament, pass the material package's data into a Filament Material builder: -``` +```c++ Package package = builder.build(); filament::Material* myMaterial = Material::Builder() .package(package.getData(), package.getSize()) @@ -186,7 +186,7 @@ In addition, `filamat_lite` only performs a simple text match to determine which `MaterialInputs` structure are set. The `material` input variable must also always be refered to by the name `material`. -``` +```glsl void anotherFunction(inout MaterialInputs m) { // Incorrect! The MaterialInputs is being referred to by the name "m". m.metallic = 0.0; diff --git a/libs/filamat/include/filamat/Enums.h b/libs/filamat/include/filamat/Enums.h index ea626e814a0..04b5ff8bbfc 100644 --- a/libs/filamat/include/filamat/Enums.h +++ b/libs/filamat/include/filamat/Enums.h @@ -34,6 +34,7 @@ using ParameterPrecision = MaterialBuilder::ParameterPrecision; using OutputTarget = MaterialBuilder::OutputTarget; using OutputQualifier = MaterialBuilder::VariableQualifier; using OutputType = MaterialBuilder::OutputType; +using ConstantType = MaterialBuilder::ConstantType; // Convenience methods to convert std::string to Enum and also iterate over Enum values. class Enums { @@ -77,6 +78,7 @@ class Enums { static std::unordered_map mStringToOutputTarget; static std::unordered_map mStringToOutputQualifier; static std::unordered_map mStringToOutputType; + static std::unordered_map mStringToConstantType; }; template diff --git a/libs/filamat/include/filamat/MaterialBuilder.h b/libs/filamat/include/filamat/MaterialBuilder.h index 9bd6182e302..767bdecc6fd 100644 --- a/libs/filamat/include/filamat/MaterialBuilder.h +++ b/libs/filamat/include/filamat/MaterialBuilder.h @@ -35,9 +35,11 @@ #include #include +#include #include #include #include +#include #include #include @@ -125,28 +127,24 @@ class UTILS_PUBLIC MaterialBuilderBase { protected: // Looks at platform and target API, then decides on shader models and output formats. - void prepare(bool vulkanSemantics); + void prepare(bool vulkanSemantics, filament::backend::FeatureLevel featureLevel); using ShaderModel = filament::backend::ShaderModel; Platform mPlatform = Platform::DESKTOP; TargetApi mTargetApi = (TargetApi) 0; Optimization mOptimization = Optimization::PERFORMANCE; bool mPrintShaders = false; + bool mSaveRawVariants = false; bool mGenerateDebugInfo = false; + bool mIncludeEssl1 = true; utils::bitset32 mShaderModels; struct CodeGenParams { ShaderModel shaderModel; TargetApi targetApi; TargetLanguage targetLanguage; + filament::backend::FeatureLevel featureLevel; }; std::vector mCodeGenPermutations; - // For finding properties and running semantic analysis, we always use the same code gen - // permutation. This is the first permutation generated with default arguments passed to matc. - static constexpr const CodeGenParams mSemanticCodeGenParams = { - .shaderModel = ShaderModel::MOBILE, - .targetApi = TargetApi::OPENGL, - .targetLanguage = TargetLanguage::SPIRV - }; // Keeps track of how many times MaterialBuilder::init() has been called without a call to // MaterialBuilder::shutdown(). Internally, glslang does something similar. We keep track for @@ -230,19 +228,25 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { using ShaderQuality = filament::ShaderQuality; using BlendingMode = filament::BlendingMode; + using BlendFunction = filament::backend::BlendFunction; using Shading = filament::Shading; using Interpolation = filament::Interpolation; using VertexDomain = filament::VertexDomain; using TransparencyMode = filament::TransparencyMode; using SpecularAmbientOcclusion = filament::SpecularAmbientOcclusion; + using AttributeType = filament::backend::UniformType; using UniformType = filament::backend::UniformType; + using ConstantType = filament::backend::ConstantType; using SamplerType = filament::backend::SamplerType; using SubpassType = filament::backend::SubpassType; using SamplerFormat = filament::backend::SamplerFormat; using ParameterPrecision = filament::backend::Precision; + using Precision = filament::backend::Precision; using CullingMode = filament::backend::CullingMode; using FeatureLevel = filament::backend::FeatureLevel; + using StereoscopicType = filament::backend::StereoscopicType; + using ShaderStage = filament::backend::ShaderStage; enum class VariableQualifier : uint8_t { OUT @@ -269,6 +273,12 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { }; using PreprocessorDefineList = std::vector; + + MaterialBuilder& noSamplerValidation(bool enabled) noexcept; + + //! Enable generation of ESSL 1.0 code in FL0 materials. + MaterialBuilder& includeEssl1(bool enabled) noexcept; + //! Set the name of this material. MaterialBuilder& name(const char* name) noexcept; @@ -289,6 +299,15 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { MaterialBuilder& parameter(const char* name, size_t size, UniformType type, ParameterPrecision precision = ParameterPrecision::DEFAULT) noexcept; + //! Add a constant parameter to this material. + template + using is_supported_constant_parameter_t = typename std::enable_if< + std::is_same::value || + std::is_same::value || + std::is_same::value>::type; + template> + MaterialBuilder& constant(const char *name, ConstantType type, T defaultValue = 0); + /** * Add a sampler parameter to this material. * @@ -296,18 +315,17 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { */ MaterialBuilder& parameter(const char* name, SamplerType samplerType, SamplerFormat format = SamplerFormat::FLOAT, - ParameterPrecision precision = ParameterPrecision::DEFAULT) noexcept; - - /// @copydoc parameter(SamplerType, SamplerFormat, ParameterPrecision, const char*) - MaterialBuilder& parameter(const char* name, SamplerType samplerType, - ParameterPrecision precision) noexcept; - + ParameterPrecision precision = ParameterPrecision::DEFAULT, + bool multisample = false) noexcept; MaterialBuilder& buffer(filament::BufferInterfaceBlock bib) noexcept; //! Custom variables (all float4). MaterialBuilder& variable(Variable v, const char* name) noexcept; + MaterialBuilder& variable(Variable v, const char* name, + ParameterPrecision precision) noexcept; + /** * Require a specified attribute. * @@ -389,13 +407,26 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { MaterialBuilder& featureLevel(FeatureLevel featureLevel) noexcept; - //! Set the blending mode for this material. + /** + * Set the blending mode for this material. When set to MASKED, alpha to coverage is turned on. + * You can override this behavior using alphaToCoverage(false). + */ MaterialBuilder& blending(BlendingMode blending) noexcept; + /** + * Set the blend function for this material. blending must be et to CUSTOM. + */ + MaterialBuilder& customBlendFunctions( + BlendFunction srcRGB, + BlendFunction srcA, + BlendFunction dstRGB, + BlendFunction dstA) noexcept; + /** * Set the blending mode of the post-lighting color for this material. * Only OPAQUE, TRANSPARENT and ADD are supported, the default is TRANSPARENT. - * This setting requires the material property "postLightingColor" to be set. + * This setting requires the material properties "postLightingColor" and + * "postLightingMixFactor" to be set. */ MaterialBuilder& postLightingBlending(BlendingMode blending) noexcept; @@ -435,6 +466,14 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { */ MaterialBuilder& maskThreshold(float threshold) noexcept; + /** + * Enables or disables alpha-to-coverage. When enabled, the coverage of a fragment is based + * on its alpha value. This parameter is only useful when MSAA is in use. Alpha to coverage + * is enabled automatically when the blend mode is set to MASKED; this behavior can be + * overridden by calling alphaToCoverage(false). + */ + MaterialBuilder& alphaToCoverage(bool enable) noexcept; + //! The material output is multiplied by the shadowing factor (UNLIT model only). MaterialBuilder& shadowMultiplier(bool shadowMultiplier) noexcept; @@ -499,6 +538,12 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { //! Specifies how transparent objects should be rendered (default is DEFAULT). MaterialBuilder& transparencyMode(TransparencyMode mode) noexcept; + //! Specify the stereoscopic type (default is INSTANCED) + MaterialBuilder& stereoscopicType(StereoscopicType stereoscopicType) noexcept; + + //! Specify the number of eyes for stereoscopic rendering + MaterialBuilder& stereoscopicEyeCount(uint8_t eyeCount) noexcept; + /** * Enable / disable custom surface shading. Custom surface shading requires the LIT * shading model. In addition, the following function must be defined in the fragment @@ -545,6 +590,14 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { //! If true, will output the generated GLSL shader code to stdout. MaterialBuilder& printShaders(bool printShaders) noexcept; + /** + * If true, this will write the raw generated GLSL for each variant to a text file in the + * current directory. The file will be named after the material name and the variant name. Its + * extension will be derived from the shader stage. For example, mymaterial_0x0e.frag, + * mymaterial_0x18.vert, etc. + */ + MaterialBuilder& saveRawVariants(bool saveVariants) noexcept; + //! If true, will include debugging information in generated SPIRV. MaterialBuilder& generateDebugInfo(bool generateDebugInfo) noexcept; @@ -555,7 +608,7 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { MaterialBuilder& shaderDefine(const char* name, const char* value) noexcept; //! Add a new fragment shader output variable. Only valid for materials in the POST_PROCESS domain. - MaterialBuilder& output(VariableQualifier qualifier, OutputTarget target, + MaterialBuilder& output(VariableQualifier qualifier, OutputTarget target, Precision precision, OutputType type, const char* name, int location = -1) noexcept; MaterialBuilder& enableFramebufferFetch() noexcept; @@ -596,8 +649,8 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { Parameter() noexcept: parameterType(INVALID) {} // Sampler - Parameter(const char* paramName, SamplerType t, SamplerFormat f, ParameterPrecision p) - : name(paramName), size(1), precision(p), samplerType(t), format(f), parameterType(SAMPLER) { } + Parameter(const char* paramName, SamplerType t, SamplerFormat f, ParameterPrecision p, bool ms) + : name(paramName), size(1), precision(p), samplerType(t), format(f), parameterType(SAMPLER), multisample(ms) { } // Uniform Parameter(const char* paramName, UniformType t, size_t typeSize, ParameterPrecision p) @@ -614,6 +667,7 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { SamplerType samplerType; SubpassType subpassType; SamplerFormat format; + bool multisample; enum { INVALID, UNIFORM, @@ -629,22 +683,45 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { struct Output { Output() noexcept = default; Output(const char* outputName, VariableQualifier qualifier, OutputTarget target, - OutputType type, int location) noexcept - : name(outputName), qualifier(qualifier), target(target), type(type), - location(location) { } + Precision precision, OutputType type, int location) noexcept + : name(outputName), qualifier(qualifier), target(target), precision(precision), + type(type), location(location) { } utils::CString name; VariableQualifier qualifier; OutputTarget target; + Precision precision; OutputType type; int location; }; + struct Constant { + utils::CString name; + ConstantType type; + union { + int32_t i; + float f; + bool b; + } defaultValue; + }; + + struct PushConstant { + utils::CString name; + ConstantType type; + ShaderStage stage; + }; + + struct CustomVariable { + utils::CString name; + Precision precision = Precision::DEFAULT; + bool hasPrecision = false; + }; + static constexpr size_t MATERIAL_PROPERTIES_COUNT = filament::MATERIAL_PROPERTIES_COUNT; using Property = filament::Property; using PropertyList = bool[MATERIAL_PROPERTIES_COUNT]; - using VariableList = utils::CString[MATERIAL_VARIABLES_COUNT]; + using VariableList = CustomVariable[MATERIAL_VARIABLES_COUNT]; using OutputList = std::vector; static constexpr size_t MAX_COLOR_OUTPUT = filament::backend::MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT; @@ -658,8 +735,8 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { std::string peek(filament::backend::ShaderStage type, const CodeGenParams& params, const PropertyList& properties) noexcept; - // Returns true if any of the parameter samplers is of type samplerExternal - bool hasExternalSampler() const noexcept; + // Returns true if any of the parameter samplers matches the specified type. + bool hasSamplerType(SamplerType samplerType) const noexcept; static constexpr size_t MAX_PARAMETERS_COUNT = 48; static constexpr size_t MAX_SUBPASS_COUNT = 1; @@ -667,6 +744,8 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { using ParameterList = Parameter[MAX_PARAMETERS_COUNT]; using SubpassList = Parameter[MAX_SUBPASS_COUNT]; using BufferList = std::vector>; + using ConstantList = std::vector; + using PushConstantList = std::vector; // returns the number of parameters declared in this material uint8_t getParameterCount() const noexcept { return mParameterCount; } @@ -682,22 +761,51 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { filament::UserVariantFilterMask getVariantFilter() const { return mVariantFilter; } + FeatureLevel getFeatureLevel() const noexcept { return mFeatureLevel; } /// @endcond + struct Attribute { + std::string_view name; + AttributeType type; + MaterialBuilder::VertexAttribute location; + std::string getAttributeName() const noexcept { + return "mesh_" + std::string{ name }; + } + std::string getDefineName() const noexcept { + std::string uppercase{ name }; + transform(uppercase.cbegin(), uppercase.cend(), uppercase.begin(), ::toupper); + return "HAS_ATTRIBUTE_" + uppercase; + } + }; + + using AttributeDatabase = std::array; + + static inline AttributeDatabase const& getAttributeDatabase() noexcept { + return sAttributeDatabase; + } + private: + static const AttributeDatabase sAttributeDatabase; + void prepareToBuild(MaterialInfo& info) noexcept; + // Initialize internal push constants that will both be written to the shaders and material + // chunks (like user-defined spec constants). + void initPushConstants() noexcept; + // Return true if the shader is syntactically and semantically valid. // This method finds all the properties defined in the fragment and // vertex shaders of the material. - bool findAllProperties() noexcept; + bool findAllProperties(CodeGenParams const& semanticCodeGenParams) noexcept; // Multiple calls to findProperties accumulate the property sets across fragment // and vertex shaders in mProperties. bool findProperties(filament::backend::ShaderStage type, - MaterialBuilder::PropertyList& p) noexcept; + MaterialBuilder::PropertyList& allProperties, + CodeGenParams const& semanticCodeGenParams) noexcept; - bool runSemanticAnalysis(MaterialInfo const& info) noexcept; + bool runSemanticAnalysis(MaterialInfo* inOutInfo, + CodeGenParams const& semanticCodeGenParams) noexcept; bool checkLiteRequirements() noexcept; @@ -750,6 +858,8 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { PropertyList mProperties; ParameterList mParameters; + ConstantList mConstants; + PushConstantList mPushConstants; SubpassList mSubpasses; VariableList mVariables; OutputList mOutputs; @@ -759,6 +869,7 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { FeatureLevel mFeatureLevel = FeatureLevel::FEATURE_LEVEL_1; BlendingMode mBlendingMode = BlendingMode::OPAQUE; BlendingMode mPostLightingBlendingMode = BlendingMode::TRANSPARENT; + std::array mCustomBlendFunctions = {}; CullingMode mCullingMode = CullingMode::BACK; Shading mShading = Shading::LIT; MaterialDomain mMaterialDomain = MaterialDomain::SURFACE; @@ -768,6 +879,8 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { Interpolation mInterpolation = Interpolation::SMOOTH; VertexDomain mVertexDomain = VertexDomain::OBJECT; TransparencyMode mTransparencyMode = TransparencyMode::DEFAULT; + StereoscopicType mStereoscopicType = StereoscopicType::INSTANCED; + uint8_t mStereoscopicEyeCount = 2; filament::AttributeBitset mRequiredAttributes; @@ -790,6 +903,8 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { bool mInstanced = false; bool mDepthWrite = true; bool mDepthWriteSet = false; + bool mAlphaToCoverage = false; + bool mAlphaToCoverageSet = false; bool mSpecularAntiAliasing = false; bool mClearCoatIorChange = true; @@ -813,6 +928,8 @@ class UTILS_PUBLIC MaterialBuilder : public MaterialBuilderBase { PreprocessorDefineList mDefines; filament::UserVariantFilterMask mVariantFilter = {}; + + bool mNoSamplerValidation = false; }; } // namespace filamat diff --git a/libs/filamat/src/Enums.cpp b/libs/filamat/src/Enums.cpp index 8049fdc9fe4..bb163425daa 100644 --- a/libs/filamat/src/Enums.cpp +++ b/libs/filamat/src/Enums.cpp @@ -41,12 +41,15 @@ std::unordered_map Enums::mStringToProperty = { { "emissive", Property::EMISSIVE }, { "normal", Property::NORMAL }, { "postLightingColor", Property::POST_LIGHTING_COLOR }, + { "postLightingMixFactor", Property::POST_LIGHTING_MIX_FACTOR }, { "clipSpaceTransform", Property::CLIP_SPACE_TRANSFORM }, { "absorption", Property::ABSORPTION }, { "transmission", Property::TRANSMISSION }, { "ior", Property::IOR }, { "microThickness", Property::MICRO_THICKNESS }, { "bentNormal", Property::BENT_NORMAL }, + { "specularFactor", Property::SPECULAR_FACTOR }, + { "specularColorFactor", Property::SPECULAR_COLOR_FACTOR } }; template <> @@ -160,4 +163,15 @@ std::unordered_map& Enums::getMap() n return mStringToSamplerFormat; }; +std::unordered_map Enums::mStringToConstantType = { + { "int", ConstantType::INT }, + { "float", ConstantType::FLOAT }, + { "bool", ConstantType::BOOL }, +}; + +template <> +std::unordered_map& Enums::getMap() noexcept { + return mStringToConstantType; +}; + } // namespace filamat diff --git a/libs/filamat/src/GLSLPostProcessor.cpp b/libs/filamat/src/GLSLPostProcessor.cpp index 3782f6251f2..92675b8dffc 100644 --- a/libs/filamat/src/GLSLPostProcessor.cpp +++ b/libs/filamat/src/GLSLPostProcessor.cpp @@ -18,21 +18,25 @@ #include #include -#include +#include #include #include +#include "backend/DriverEnums.h" +#include "private/filament/DescriptorSets.h" #include "sca/builtinResource.h" #include "sca/GLSLTools.h" + #include "shaders/CodeGenerator.h" #include "shaders/MaterialInfo.h" +#include "shaders/SibGenerator.h" #include "MetalArgumentBuffer.h" +#include "SpirvFixup.h" +#include "utils/ostream.h" #include -#include -#include "SibGenerator.h" #include @@ -54,29 +58,235 @@ namespace msl { // this is only used for MSL using BindingIndexMap = std::unordered_map; -static void collectSibs(const GLSLPostProcessor::Config& config, SibVector& sibs) { - switch (config.domain) { - case MaterialDomain::SURFACE: - UTILS_NOUNROLL - for (uint8_t blockIndex = 0; blockIndex < CONFIG_SAMPLER_BINDING_COUNT; blockIndex++) { - if (blockIndex == SamplerBindingPoints::PER_MATERIAL_INSTANCE) { - continue; +#ifndef DEBUG_LOG_DESCRIPTOR_SETS +#define DEBUG_LOG_DESCRIPTOR_SETS 0 +#endif + +const char* toString(DescriptorType type) { + switch (type) { + case DescriptorType::UNIFORM_BUFFER: + return "UNIFORM_BUFFER"; + case DescriptorType::SHADER_STORAGE_BUFFER: + return "SHADER_STORAGE_BUFFER"; + case DescriptorType::SAMPLER: + return "SAMPLER"; + case DescriptorType::INPUT_ATTACHMENT: + return "INPUT_ATTACHMENT"; + case DescriptorType::SAMPLER_EXTERNAL: + return "SAMPLER_EXTERNAL"; + } +} + +const char* toString(ShaderStageFlags flags) { + std::vector stages; + if (any(flags & ShaderStageFlags::VERTEX)) { + stages.push_back("VERTEX"); + } + if (any(flags & ShaderStageFlags::FRAGMENT)) { + stages.push_back("FRAGMENT"); + } + if (any(flags & ShaderStageFlags::COMPUTE)) { + stages.push_back("COMPUTE"); + } + if (stages.empty()) { + return "NONE"; + } + static char buffer[64]; + buffer[0] = '\0'; + for (size_t i = 0; i < stages.size(); i++) { + if (i > 0) { + strcat(buffer, " | "); + } + strcat(buffer, stages[i]); + } + return buffer; +} + +const char* prettyDescriptorFlags(DescriptorFlags flags) { + if (flags == DescriptorFlags::DYNAMIC_OFFSET) { + return "DYNAMIC_OFFSET"; + } + return "NONE"; +} + +const char* prettyPrintSamplerType(SamplerType type) { + switch (type) { + case SamplerType::SAMPLER_2D: + return "SAMPLER_2D"; + case SamplerType::SAMPLER_2D_ARRAY: + return "SAMPLER_2D_ARRAY"; + case SamplerType::SAMPLER_CUBEMAP: + return "SAMPLER_CUBEMAP"; + case SamplerType::SAMPLER_EXTERNAL: + return "SAMPLER_EXTERNAL"; + case SamplerType::SAMPLER_3D: + return "SAMPLER_3D"; + case SamplerType::SAMPLER_CUBEMAP_ARRAY: + return "SAMPLER_CUBEMAP_ARRAY"; + } +} + +DescriptorSetLayout getPerMaterialDescriptorSet(SamplerInterfaceBlock const& sib) noexcept { + auto const& samplers = sib.getSamplerInfoList(); + + DescriptorSetLayout layout; + layout.bindings.reserve(1 + samplers.size()); + + layout.bindings.push_back(DescriptorSetLayoutBinding { DescriptorType::UNIFORM_BUFFER, + ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, + +PerMaterialBindingPoints::MATERIAL_PARAMS, DescriptorFlags::NONE, 0 }); + + for (auto const& sampler : samplers) { + layout.bindings.push_back(DescriptorSetLayoutBinding { + (sampler.type == SamplerInterfaceBlock::Type::SAMPLER_EXTERNAL) ? + DescriptorType::SAMPLER_EXTERNAL : DescriptorType::SAMPLER, + ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, sampler.binding, + DescriptorFlags::NONE, 0 }); + } + + return layout; +} + +static void collectDescriptorsForSet(filament::DescriptorSetBindingPoints set, + const GLSLPostProcessor::Config& config, DescriptorSetInfo& descriptors) { + const MaterialInfo& material = *config.materialInfo; + + DescriptorSetLayout const info = [&]() { + switch (set) { + case DescriptorSetBindingPoints::PER_VIEW: { + if (filament::Variant::isValidDepthVariant(config.variant)) { + return descriptor_sets::getDepthVariantLayout(); } - auto const* sib = - SibGenerator::getSib((SamplerBindingPoints)blockIndex, config.variant); - if (sib && hasShaderType(sib->getStageFlags(), config.shaderType)) { - sibs.emplace_back(blockIndex, sib); + if (filament::Variant::isSSRVariant(config.variant)) { + return descriptor_sets::getSsrVariantLayout(); } + return descriptor_sets::getPerViewDescriptorSetLayout(config.domain, + config.variantFilter, + material.isLit || material.hasShadowMultiplier, + material.reflectionMode, + material.refractionMode); } - case MaterialDomain::POST_PROCESS: - case MaterialDomain::COMPUTE: - break; + case DescriptorSetBindingPoints::PER_RENDERABLE: + return descriptor_sets::getPerRenderableLayout(); + case DescriptorSetBindingPoints::PER_MATERIAL: + return getPerMaterialDescriptorSet(config.materialInfo->sib); + default: + return DescriptorSetLayout {}; + } + }(); + + auto samplerList = [&]() { + switch (set) { + case DescriptorSetBindingPoints::PER_VIEW: + return SibGenerator::getPerViewSib(config.variant).getSamplerInfoList(); + case DescriptorSetBindingPoints::PER_RENDERABLE: + return SibGenerator::getPerRenderableSib(config.variant).getSamplerInfoList(); + case DescriptorSetBindingPoints::PER_MATERIAL: + return config.materialInfo->sib.getSamplerInfoList(); + default: + return SamplerInterfaceBlock::SamplerInfoList {}; + } + }(); + + // remove all the samplers that are not included in the descriptor-set layout + samplerList.erase(std::remove_if(samplerList.begin(), samplerList.end(), + [&info](auto const& entry) { + auto pos = std::find_if(info.bindings.begin(), + info.bindings.end(), [&entry](const auto& item) { + return item.binding == entry.binding; + }); + return pos == info.bindings.end(); + }), + samplerList.end()); + + auto getDescriptorName = [&](DescriptorSetBindingPoints set, descriptor_binding_t binding) { + if (set == DescriptorSetBindingPoints::PER_MATERIAL) { + auto pos = std::find_if(samplerList.begin(), samplerList.end(), + [&](const auto& entry) { return entry.binding == binding; }); + if (pos == samplerList.end()) { + return descriptor_sets::getDescriptorName(set, binding); + } + SamplerInterfaceBlock::SamplerInfo& sampler = *pos; + return sampler.uniformName; + } + return descriptor_sets::getDescriptorName(set, binding); + }; + + for (size_t i = 0; i < info.bindings.size(); i++) { + backend::descriptor_binding_t binding = info.bindings[i].binding; + auto name = getDescriptorName(set, binding); + if (info.bindings[i].type == DescriptorType::SAMPLER || + info.bindings[i].type == DescriptorType::SAMPLER_EXTERNAL) { + auto pos = std::find_if(samplerList.begin(), samplerList.end(), + [&](const auto& entry) { return entry.binding == binding; }); + assert_invariant(pos != samplerList.end()); + SamplerInterfaceBlock::SamplerInfo& sampler = *pos; + descriptors.emplace_back(name, info.bindings[i], sampler); + } else { + descriptors.emplace_back(name, info.bindings[i], std::nullopt); + } } - sibs.emplace_back((uint8_t) SamplerBindingPoints::PER_MATERIAL_INSTANCE, - &config.materialInfo->sib); + + std::sort(descriptors.begin(), descriptors.end(), [](const auto& a, const auto& b) { + return std::get<1>(a).binding < std::get<1>(b).binding; + }); +} + +void prettyPrintDescriptorSetInfoVector(DescriptorSets const& sets) { + auto getName = [](uint8_t set) { + switch (set) { + case +DescriptorSetBindingPoints::PER_VIEW: + return "perViewDescriptorSetLayout"; + case +DescriptorSetBindingPoints::PER_RENDERABLE: + return "perRenderableDescriptorSetLayout"; + case +DescriptorSetBindingPoints::PER_MATERIAL: + return "perMaterialDescriptorSetLayout"; + default: + return "unknown"; + } + }; + for (size_t setIndex = 0; setIndex < MAX_DESCRIPTOR_SET_COUNT; setIndex++) { + auto const& descriptors = sets[setIndex]; + printf("[DS] info (%s) = [\n", getName(setIndex)); + for (auto const& descriptor : descriptors) { + auto const& [name, info, sampler] = descriptor; + if (info.type == DescriptorType::SAMPLER || + info.type == DescriptorType::SAMPLER_EXTERNAL) { + assert_invariant(sampler.has_value()); + printf(" {name = %s, binding = %d, type = %s, count = %d, stage = %s, flags = " + "%s, samplerType = %s}", + name.c_str_safe(), info.binding, toString(info.type), info.count, + toString(info.stageFlags), prettyDescriptorFlags(info.flags), + prettyPrintSamplerType(sampler->type)); + } else { + printf(" {name = %s, binding = %d, type = %s, count = %d, stage = %s, flags = " + "%s}", + name.c_str_safe(), info.binding, toString(info.type), info.count, + toString(info.stageFlags), prettyDescriptorFlags(info.flags)); + } + printf(",\n"); + } + printf("]\n"); + } +} + +static void collectDescriptorSets(const GLSLPostProcessor::Config& config, DescriptorSets& sets) { + auto perViewDescriptors = DescriptorSetInfo::with_capacity(MAX_DESCRIPTOR_COUNT); + collectDescriptorsForSet(DescriptorSetBindingPoints::PER_VIEW, config, perViewDescriptors); + sets[+DescriptorSetBindingPoints::PER_VIEW] = std::move(perViewDescriptors); + + auto perRenderableDescriptors = DescriptorSetInfo::with_capacity(MAX_DESCRIPTOR_COUNT); + collectDescriptorsForSet( + DescriptorSetBindingPoints::PER_RENDERABLE, config, perRenderableDescriptors); + sets[+DescriptorSetBindingPoints::PER_RENDERABLE] = std::move(perRenderableDescriptors); + + auto perMaterialDescriptors = DescriptorSetInfo::with_capacity(MAX_DESCRIPTOR_COUNT); + collectDescriptorsForSet( + DescriptorSetBindingPoints::PER_MATERIAL, config, perMaterialDescriptors); + sets[+DescriptorSetBindingPoints::PER_MATERIAL] = std::move(perMaterialDescriptors); } -}; // namespace msl +} // namespace msl GLSLPostProcessor::GLSLPostProcessor(MaterialBuilder::Optimization optimization, uint32_t flags) : mOptimization(optimization), @@ -137,14 +347,14 @@ static std::string stringifySpvOptimizerMessage(spv_message_level_t level, const return oss.str(); } -void GLSLPostProcessor::spirvToMsl(const SpirvBlob *spirv, std::string *outMsl, - filament::backend::ShaderModel shaderModel, bool useFramebufferFetch, const SibVector& sibs, +void GLSLPostProcessor::spirvToMsl(const SpirvBlob* spirv, std::string* outMsl, + filament::backend::ShaderStage stage, filament::backend::ShaderModel shaderModel, + bool useFramebufferFetch, const DescriptorSets& descriptorSets, const ShaderMinifier* minifier) { - using namespace msl; CompilerMSL mslCompiler(*spirv); - CompilerGLSL::Options options; + CompilerGLSL::Options const options; mslCompiler.set_common_options(options); const CompilerMSL::Options::Platform platform = @@ -166,8 +376,34 @@ void GLSLPostProcessor::spirvToMsl(const SpirvBlob *spirv, std::string *outMsl, } mslOptions.argument_buffers = true; + mslOptions.ios_support_base_vertex_instance = true; + mslOptions.dynamic_offsets_buffer_index = 25; + + mslCompiler.set_msl_options(mslOptions); + + - // We're using argument buffers for texture resources, however, we cannot rely on spirv-cross to + auto executionModel = mslCompiler.get_execution_model(); + + // Map each descriptor set (argument buffer) to a [[buffer(n)]] binding. + // For example, mapDescriptorSet(0, 21) says "map descriptor set 0 to [[buffer(21)]]" + auto mapDescriptorSet = [&mslCompiler](uint32_t set, uint32_t buffer) { + MSLResourceBinding argBufferBinding; + argBufferBinding.basetype = SPIRType::BaseType::Float; + argBufferBinding.stage = mslCompiler.get_execution_model(); + argBufferBinding.desc_set = set; + argBufferBinding.binding = kArgumentBufferBinding; + argBufferBinding.count = 1; + argBufferBinding.msl_buffer = buffer; + mslCompiler.add_msl_resource_binding(argBufferBinding); + }; + for (int i = 0; i < MAX_DESCRIPTOR_SET_COUNT; i++) { + mapDescriptorSet(i, CodeGenerator::METAL_DESCRIPTOR_SET_BINDING_START + i); + } + + auto resources = mslCompiler.get_shader_resources(); + + // We're using argument buffers for descriptor sets, however, we cannot rely on spirv-cross to // generate the argument buffer definitions. // // Consider a shader with 3 textures: @@ -190,95 +426,67 @@ void GLSLPostProcessor::spirvToMsl(const SpirvBlob *spirv, std::string *outMsl, // shader doesn't precisely match the one generated at runtime. // // So, we use the MetalArgumentBuffer class to replace spirv-cross' argument buffer definitions - // with our own that contain all the textures/samples, even those optimized away. + // with our own that contain all the descriptors, even those optimized away. std::vector argumentBuffers; + size_t dynamicOffsetsBufferIndex = 0; + for (size_t setIndex = 0; setIndex < MAX_DESCRIPTOR_SET_COUNT; setIndex++) { + auto const& descriptors = descriptorSets[setIndex]; + auto argBufferBuilder = MetalArgumentBuffer::Builder().name( + "spvDescriptorSetBuffer" + std::to_string(int(setIndex))); + for (auto const& descriptor : descriptors) { + auto const& [name, info, sampler] = descriptor; + if (!hasShaderType(info.stageFlags, stage)) { + if (any(info.flags & DescriptorFlags::DYNAMIC_OFFSET)) { + // We still need to increment the dynamic offset index + dynamicOffsetsBufferIndex++; + } + continue; + } + switch (info.type) { + case DescriptorType::INPUT_ATTACHMENT: + // TODO: Handle INPUT_ATTACHMENT case + break; + case DescriptorType::UNIFORM_BUFFER: + case DescriptorType::SHADER_STORAGE_BUFFER: { + std::string lowercasedName = name.c_str(); + assert_invariant(!lowercasedName.empty()); + lowercasedName[0] = std::tolower(lowercasedName[0]); + argBufferBuilder + .buffer(info.binding * 2 + 0, name.c_str(), lowercasedName); + if (any(info.flags & DescriptorFlags::DYNAMIC_OFFSET)) { + // Note: this requires that the sets and descriptors are sorted (at least + // the uniforms). + mslCompiler.add_dynamic_buffer( + setIndex, info.binding * 2 + 0, dynamicOffsetsBufferIndex++); + } + break; + } - mslCompiler.set_msl_options(mslOptions); - - auto executionModel = mslCompiler.get_execution_model(); - - // Metal Descriptor Sets - // Descriptor set Name Binding - // ---------------------------------------------------------------------- - // 0 Uniforms Individual bindings - // 1-4 Sampler groups [[buffer(27-30)]] - // 5-7 Unused - // - // Here we enumerate each sampler in each sampler group and map it to a Metal resource. Each - // sampler group is its own descriptor set, and each descriptor set becomes an argument buffer. - // - // For example, in GLSL, we might have the following: - // layout( set = 1, binding = 0 ) uniform sampler2D textureA; - // layout( set = 1, binding = 1 ) uniform sampler2D textureB; - // - // This becomes the following MSL argument buffer: - // struct spvDescriptorSetBuffer1 { - // texture2d textureA [[id(0)]]; - // sampler textureASmplr [[id(1)]]; - // texture2d textureB [[id(2)]]; - // sampler textureBSmplr [[id(3)]]; - // }; - // - // Which is then bound to the vertex/fragment functions: - // constant spvDescriptorSetBuffer1& spvDescriptorSet1 [[buffer(27)]] - for (auto [bindingPoint, sib] : sibs) { - const auto& infoList = sib->getSamplerInfoList(); - - // bindingPoint + 1, because the first descriptor set is for uniforms - auto argBufferBuilder = MetalArgumentBuffer::Builder() - .name("spvDescriptorSetBuffer" + std::to_string(int(bindingPoint + 1))); - - for (const auto& info: infoList) { - const std::string name = info.uniformName.c_str(); - argBufferBuilder - .texture(info.offset * 2, name, info.type, info.format) - .sampler(info.offset * 2 + 1, name + "Smplr"); + case DescriptorType::SAMPLER: + case DescriptorType::SAMPLER_EXTERNAL: { + assert_invariant(sampler.has_value()); + const std::string samplerName = std::string(name.c_str()) + "Smplr"; + argBufferBuilder + .texture(info.binding * 2 + 0, name.c_str(), sampler->type, + sampler->format, sampler->multisample) + .sampler(info.binding * 2 + 1, samplerName); + break; + } + } } - argumentBuffers.push_back(argBufferBuilder.build()); - - // This MSLResourceBinding is how we control the [[buffer(n)]] binding of the argument - // buffer itself; - MSLResourceBinding argBufferBinding; - // the baseType doesn't matter, but can't be UNKNOWN - argBufferBinding.basetype = SPIRType::BaseType::Float; - argBufferBinding.stage = executionModel; - argBufferBinding.desc_set = bindingPoint + 1; - argBufferBinding.binding = kArgumentBufferBinding; - argBufferBinding.count = 1; - argBufferBinding.msl_buffer = - CodeGenerator::METAL_SAMPLER_GROUP_BINDING_START + bindingPoint; - mslCompiler.add_msl_resource_binding(argBufferBinding); } - auto updateResourceBindingDefault = [executionModel, &mslCompiler] - (const auto& resource, const BindingIndexMap* map = nullptr) { - auto set = mslCompiler.get_decoration(resource.id, spv::DecorationDescriptorSet); - auto binding = mslCompiler.get_decoration(resource.id, spv::DecorationBinding); - MSLResourceBinding newBinding; - newBinding.basetype = SPIRType::BaseType::Void; - newBinding.stage = executionModel; - newBinding.desc_set = set; - newBinding.binding = binding; - newBinding.count = 1; - newBinding.msl_texture = - newBinding.msl_sampler = - newBinding.msl_buffer = binding; - mslCompiler.add_msl_resource_binding(newBinding); - }; - - auto uniformResources = mslCompiler.get_shader_resources(); - for (const auto& resource : uniformResources.uniform_buffers) { - updateResourceBindingDefault(resource); - } - auto ssboResources = mslCompiler.get_shader_resources(); - for (const auto& resource : ssboResources.storage_buffers) { - updateResourceBindingDefault(resource); - } - - // Descriptor set 0 is uniforms. The add_discrete_descriptor_set call here prevents the uniforms - // from becoming argument buffers. - mslCompiler.add_discrete_descriptor_set(0); + // Bind push constants to [buffer(26)] + MSLResourceBinding pushConstantBinding; + // the baseType doesn't matter, but can't be UNKNOWN + pushConstantBinding.basetype = SPIRType::BaseType::Struct; + pushConstantBinding.stage = executionModel; + pushConstantBinding.desc_set = kPushConstDescSet; + pushConstantBinding.binding = kPushConstBinding; + pushConstantBinding.count = 1; + pushConstantBinding.msl_buffer = CodeGenerator::METAL_PUSH_CONSTANT_BUFFER_INDEX; + mslCompiler.add_msl_resource_binding(pushConstantBinding); *outMsl = mslCompiler.compile(); if (minifier) { @@ -327,11 +535,15 @@ bool GLSLPostProcessor::process(const std::string& inputShader, Config const& co TShader tShader(internalConfig.shLang); // The cleaner must be declared after the TShader to prevent ASAN failures. - GLSLangCleaner cleaner; + GLSLangCleaner const cleaner; const char* shaderCString = inputShader.c_str(); tShader.setStrings(&shaderCString, 1); + // This allows shaders to query if they will be run through glslang. + // OpenGL shaders without optimization, for example, won't have this define. + tShader.setPreamble("#define FILAMENT_GLSLANG\n"); + internalConfig.langVersion = GLSLTools::getGlslDefaultVersion(config.shaderModel); GLSLTools::prepareShaderParser(config.targetApi, config.targetLanguage, tShader, internalConfig.shLang, internalConfig.langVersion); @@ -345,7 +557,7 @@ bool GLSLPostProcessor::process(const std::string& inputShader, Config const& co msg = EShMessages(Type(msg) | Type(EShMessages::EShMsgVulkanRules)); } - bool ok = tShader.parse(&DefaultTBuiltInResource, internalConfig.langVersion, false, msg); + bool const ok = tShader.parse(&DefaultTBuiltInResource, internalConfig.langVersion, false, msg); if (!ok) { slog.e << tShader.getInfoLog() << io::endl; return false; @@ -360,7 +572,7 @@ bool GLSLPostProcessor::process(const std::string& inputShader, Config const& co program.addShader(&tShader); // Even though we only have a single shader stage, linking is still necessary to finalize // SPIR-V types - bool linkOk = program.link(msg); + bool const linkOk = program.link(msg); if (!linkOk) { slog.e << tShader.getInfoLog() << io::endl; return false; @@ -373,12 +585,17 @@ bool GLSLPostProcessor::process(const std::string& inputShader, Config const& co options.generateDebugInfo = mGenerateDebugInfo; GlslangToSpv(*program.getIntermediate(internalConfig.shLang), *internalConfig.spirvOutput, &options); + fixupClipDistance(*internalConfig.spirvOutput, config); if (internalConfig.mslOutput) { auto sibs = SibVector::with_capacity(CONFIG_SAMPLER_BINDING_COUNT); - msl::collectSibs(config, sibs); + DescriptorSets descriptors {}; + msl::collectDescriptorSets(config, descriptors); +#if DEBUG_LOG_DESCRIPTOR_SETS == 1 + msl::prettyPrintDescriptorSetInfoVector(descriptors); +#endif spirvToMsl(internalConfig.spirvOutput, internalConfig.mslOutput, - config.shaderModel, config.hasFramebufferFetch, sibs, - &internalConfig.minifier); + config.shaderType, config.shaderModel, config.hasFramebufferFetch, descriptors, + mGenerateDebugInfo ? &internalConfig.minifier : nullptr); } } else { slog.e << "GLSL post-processor invoked with optimization level NONE" @@ -390,20 +607,25 @@ bool GLSLPostProcessor::process(const std::string& inputShader, Config const& co break; case MaterialBuilder::Optimization::SIZE: case MaterialBuilder::Optimization::PERFORMANCE: - fullOptimization(tShader, config, internalConfig); + if (!fullOptimization(tShader, config, internalConfig)) { + return false; + } break; } if (internalConfig.glslOutput) { - *internalConfig.glslOutput = - internalConfig.minifier.removeWhitespace(*internalConfig.glslOutput); - - // In theory this should only be enabled for SIZE, but in practice we often use PERFORMANCE. - if (mOptimization != MaterialBuilder::Optimization::NONE) { - *internalConfig.glslOutput = - internalConfig.minifier.renameStructFields(*internalConfig.glslOutput); + if (!mGenerateDebugInfo) { + *internalConfig.glslOutput = + internalConfig.minifier.removeWhitespace( + *internalConfig.glslOutput, + mOptimization == MaterialBuilder::Optimization::SIZE); + + // In theory this should only be enabled for SIZE, but in practice we often use PERFORMANCE. + if (mOptimization != MaterialBuilder::Optimization::NONE) { + *internalConfig.glslOutput = + internalConfig.minifier.renameStructFields(*internalConfig.glslOutput); + } } - if (mPrintShaders) { slog.i << *internalConfig.glslOutput << io::endl; } @@ -420,7 +642,8 @@ void GLSLPostProcessor::preprocessOptimization(glslang::TShader& tShader, TShader::ForbidIncluder forbidIncluder; const int version = GLSLTools::getGlslDefaultVersion(config.shaderModel); - EShMessages msg = GLSLTools::glslangFlagsFromTargetApi(config.targetApi, config.targetLanguage); + EShMessages const msg = + GLSLTools::glslangFlagsFromTargetApi(config.targetApi, config.targetLanguage); bool ok = tShader.preprocess(&DefaultTBuiltInResource, version, ENoProfile, false, false, msg, &glsl, forbidIncluder); @@ -434,7 +657,7 @@ void GLSLPostProcessor::preprocessOptimization(glslang::TShader& tShader, // The cleaner must be declared after the TShader/TProgram which are setting the current // pool in the tls - GLSLangCleaner cleaner; + GLSLangCleaner const cleaner; const char* shaderCString = glsl.c_str(); spirvShader.setStrings(&shaderCString, 1); @@ -444,7 +667,7 @@ void GLSLPostProcessor::preprocessOptimization(glslang::TShader& tShader, program.addShader(&spirvShader); // Even though we only have a single shader stage, linking is still necessary to finalize // SPIR-V types - bool linkOk = program.link(msg); + bool const linkOk = program.link(msg); if (!ok || !linkOk) { slog.e << spirvShader.getInfoLog() << io::endl; } else { @@ -452,14 +675,19 @@ void GLSLPostProcessor::preprocessOptimization(glslang::TShader& tShader, options.generateDebugInfo = mGenerateDebugInfo; GlslangToSpv(*program.getIntermediate(internalConfig.shLang), *internalConfig.spirvOutput, &options); + fixupClipDistance(*internalConfig.spirvOutput, config); } } if (internalConfig.mslOutput) { - auto sibs = SibVector::with_capacity(CONFIG_SAMPLER_BINDING_COUNT); - msl::collectSibs(config, sibs); - spirvToMsl(internalConfig.spirvOutput, internalConfig.mslOutput, config.shaderModel, - config.hasFramebufferFetch, sibs, &internalConfig.minifier); + DescriptorSets descriptors {}; + msl::collectDescriptorSets(config, descriptors); +#if DEBUG_LOG_DESCRIPTOR_SETS == 1 + msl::prettyPrintDescriptorSetInfoVector(descriptors); +#endif + spirvToMsl(internalConfig.spirvOutput, internalConfig.mslOutput, config.shaderType, + config.shaderModel, config.hasFramebufferFetch, descriptors, + mGenerateDebugInfo ? &internalConfig.minifier : nullptr); } if (internalConfig.glslOutput) { @@ -467,28 +695,43 @@ void GLSLPostProcessor::preprocessOptimization(glslang::TShader& tShader, } } -void GLSLPostProcessor::fullOptimization(const TShader& tShader, +bool GLSLPostProcessor::fullOptimization(const TShader& tShader, GLSLPostProcessor::Config const& config, InternalConfig& internalConfig) const { SpirvBlob spirv; + bool const optimizeForSize = mOptimization == MaterialBuilderBase::Optimization::SIZE; + // Compile GLSL to to SPIR-V SpvOptions options; options.generateDebugInfo = mGenerateDebugInfo; GlslangToSpv(*tShader.getIntermediate(), spirv, &options); - // Run the SPIR-V optimizer - OptimizerPtr optimizer = createOptimizer(mOptimization, config); - optimizeSpirv(optimizer, spirv); + if (internalConfig.spirvOutput) { + // Run the SPIR-V optimizer + OptimizerPtr const optimizer = createOptimizer(mOptimization, config); + optimizeSpirv(optimizer, spirv); + } else { + if (!optimizeForSize) { + OptimizerPtr const optimizer = createOptimizer(mOptimization, config); + optimizeSpirv(optimizer, spirv); + } + } + + fixupClipDistance(spirv, config); if (internalConfig.spirvOutput) { *internalConfig.spirvOutput = spirv; } if (internalConfig.mslOutput) { - auto sibs = SibVector::with_capacity(CONFIG_SAMPLER_BINDING_COUNT); - msl::collectSibs(config, sibs); - spirvToMsl(&spirv, internalConfig.mslOutput, config.shaderModel, config.hasFramebufferFetch, - sibs, &internalConfig.minifier); + DescriptorSets descriptors {}; + msl::collectDescriptorSets(config, descriptors); +#if DEBUG_LOG_DESCRIPTOR_SETS == 1 + msl::prettyPrintDescriptorSetInfoVector(descriptors); +#endif + spirvToMsl(&spirv, internalConfig.mslOutput, config.shaderType, config.shaderModel, + config.hasFramebufferFetch, descriptors, + mGenerateDebugInfo ? &internalConfig.minifier : nullptr); } // Transpile back to GLSL @@ -504,6 +747,27 @@ void GLSLPostProcessor::fullOptimization(const TShader& tShader, glslOptions.fragment.default_int_precision = glslOptions.es ? CompilerGLSL::Options::Precision::Mediump : CompilerGLSL::Options::Precision::Highp; + // TODO: this should be done only on the "feature level 0" variant + if (config.featureLevel == 0) { + // convert UBOs to plain uniforms if we're at feature level 0 + glslOptions.emit_uniform_buffer_as_plain_uniforms = true; + } + + if (config.variant.hasStereo() && config.shaderType == ShaderStage::VERTEX) { + switch (config.materialInfo->stereoscopicType) { + case StereoscopicType::MULTIVIEW: + // For stereo variants using multiview feature, this generates the shader code below. + // #extension GL_OVR_multiview2 : require + // layout(num_views = 2) in; + glslOptions.ovr_multiview_view_count = config.materialInfo->stereoscopicEyeCount; + break; + case StereoscopicType::INSTANCED: + case StereoscopicType::NONE: + // Nothing to generate + break; + } + } + CompilerGLSL glslCompiler(std::move(spirv)); glslCompiler.set_common_options(glslOptions); @@ -518,13 +782,34 @@ void GLSLPostProcessor::fullOptimization(const TShader& tShader, } } +#ifdef SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS *internalConfig.glslOutput = glslCompiler.compile(); +#else + try { + *internalConfig.glslOutput = glslCompiler.compile(); + } catch (spirv_cross::CompilerError e) { + slog.e << "ERROR: " << e.what() << io::endl; + return false; + } +#endif + + // spirv-cross automatically redeclares gl_ClipDistance if it's used. Some drivers don't + // like this, so we simply remove it. + // According to EXT_clip_cull_distance, gl_ClipDistance can be + // "implicitly sized by indexing it only with integral constant expressions". + std::string& str = *internalConfig.glslOutput; + const std::string clipDistanceDefinition = "out float gl_ClipDistance[2];"; + size_t const found = str.find(clipDistanceDefinition); + if (found != std::string::npos) { + str.replace(found, clipDistanceDefinition.length(), ""); + } } + return true; } std::shared_ptr GLSLPostProcessor::createOptimizer( MaterialBuilder::Optimization optimization, Config const& config) { - auto optimizer = std::make_shared(SPV_ENV_UNIVERSAL_1_0); + auto optimizer = std::make_shared(SPV_ENV_UNIVERSAL_1_3); optimizer->SetMessageConsumer([](spv_message_level_t level, const char* source, const spv_position_t& position, const char* message) { @@ -536,16 +821,23 @@ std::shared_ptr GLSLPostProcessor::createOptimizer( }); if (optimization == MaterialBuilder::Optimization::SIZE) { - registerSizePasses(*optimizer, config); + // When optimizing for size, we don't run the SPIR-V through any size optimization passes + // when targeting MSL. This results in better line dictionary compression. We do, however, + // still register the passes necessary (below) to support half precision floating point + // math. + if (config.targetApi != MaterialBuilder::TargetApi::METAL) { + registerSizePasses(*optimizer, config); + } } else if (optimization == MaterialBuilder::Optimization::PERFORMANCE) { registerPerformancePasses(*optimizer, config); - // Metal doesn't support relaxed precision, but does have support for float16 math operations. - if (config.targetApi == MaterialBuilder::TargetApi::METAL) { - optimizer->RegisterPass(CreateConvertRelaxedToHalfPass()); - optimizer->RegisterPass(CreateSimplificationPass()); - optimizer->RegisterPass(CreateRedundancyEliminationPass()); - optimizer->RegisterPass(CreateAggressiveDCEPass()); - } + } + + // Metal doesn't support relaxed precision, but does have support for float16 math operations. + if (config.targetApi == MaterialBuilder::TargetApi::METAL) { + optimizer->RegisterPass(CreateConvertRelaxedToHalfPass()); + optimizer->RegisterPass(CreateSimplificationPass()); + optimizer->RegisterPass(CreateRedundancyEliminationPass()); + optimizer->RegisterPass(CreateAggressiveDCEPass()); } return optimizer; @@ -562,94 +854,122 @@ void GLSLPostProcessor::optimizeSpirv(OptimizerPtr optimizer, SpirvBlob& spirv) remapper.remap(spirv, spv::spirvbin_base_t::DCE_ALL); } +void GLSLPostProcessor::fixupClipDistance( + SpirvBlob& spirv, GLSLPostProcessor::Config const& config) const { + if (!config.usesClipDistance) { + return; + } + // This should match the version of SPIR-V used in GLSLTools::prepareShaderParser. + SpirvTools const tools(SPV_ENV_UNIVERSAL_1_3); + std::string disassembly; + const bool result = tools.Disassemble(spirv, &disassembly); + assert_invariant(result); + if (filamat::fixupClipDistance(disassembly)) { + spirv.clear(); + tools.Assemble(disassembly, &spirv); + assert_invariant(tools.Validate(spirv)); + } +} + +// CreateMergeReturnPass() causes these issues: +// - triggers a segfault with AMD OpenGL drivers on macOS +// - triggers a crash on some Adreno drivers (b/291140208, b/289401984, b/289393290) +// However Metal requires this pass in order to correctly generate half-precision MSL +// +// CreateSimplificationPass() creates a lot of problems: +// - Adreno GPU show artifacts after running simplification passes (Vulkan) +// - spirv-cross fails generating working glsl +// (https://github.com/KhronosGroup/SPIRV-Cross/issues/2162) +// - generally it makes the code more complicated, e.g.: replacing for loops with +// while-if-break, unclear if it helps for anything. +// However, the simplification passes below are necessary when targeting Metal, otherwise the +// result is mismatched half / float assignments in MSL. + + void GLSLPostProcessor::registerPerformancePasses(Optimizer& optimizer, Config const& config) { - optimizer - .RegisterPass(CreateWrapOpKillPass()) - .RegisterPass(CreateDeadBranchElimPass()); - - if (config.shaderModel != ShaderModel::DESKTOP || - config.targetApi != MaterialBuilder::TargetApi::OPENGL) { - // this triggers a segfault with AMD OpenGL drivers on MacOS - // note that Metal also requires this pass in order to correctly generate half-precision MSL - optimizer.RegisterPass(CreateMergeReturnPass()); - } - - optimizer - .RegisterPass(CreateInlineExhaustivePass()) - .RegisterPass(CreateAggressiveDCEPass()) - .RegisterPass(CreatePrivateToLocalPass()) - .RegisterPass(CreateLocalSingleBlockLoadStoreElimPass()) - .RegisterPass(CreateLocalSingleStoreElimPass()) - .RegisterPass(CreateAggressiveDCEPass()) - .RegisterPass(CreateScalarReplacementPass()) - .RegisterPass(CreateLocalAccessChainConvertPass()) - .RegisterPass(CreateLocalSingleBlockLoadStoreElimPass()) - .RegisterPass(CreateLocalSingleStoreElimPass()) - .RegisterPass(CreateAggressiveDCEPass()) - .RegisterPass(CreateLocalMultiStoreElimPass()) - .RegisterPass(CreateAggressiveDCEPass()) - .RegisterPass(CreateCCPPass()) - .RegisterPass(CreateAggressiveDCEPass()) - .RegisterPass(CreateRedundancyEliminationPass()) - .RegisterPass(CreateCombineAccessChainsPass()) - .RegisterPass(CreateSimplificationPass()) - .RegisterPass(CreateVectorDCEPass()) - .RegisterPass(CreateDeadInsertElimPass()) - .RegisterPass(CreateDeadBranchElimPass()) - .RegisterPass(CreateSimplificationPass()) - .RegisterPass(CreateIfConversionPass()) - .RegisterPass(CreateCopyPropagateArraysPass()) - .RegisterPass(CreateReduceLoadSizePass()) - .RegisterPass(CreateAggressiveDCEPass()) - .RegisterPass(CreateBlockMergePass()) - .RegisterPass(CreateRedundancyEliminationPass()) - .RegisterPass(CreateDeadBranchElimPass()) - .RegisterPass(CreateBlockMergePass()) - .RegisterPass(CreateSimplificationPass()); + auto RegisterPass = [&](spvtools::Optimizer::PassToken&& pass, + MaterialBuilder::TargetApi apiFilter = MaterialBuilder::TargetApi::ALL) { + if (!(config.targetApi & apiFilter)) { + return; + } + optimizer.RegisterPass(std::move(pass)); + }; + + RegisterPass(CreateWrapOpKillPass()); + RegisterPass(CreateDeadBranchElimPass()); + RegisterPass(CreateMergeReturnPass(), MaterialBuilder::TargetApi::METAL); + RegisterPass(CreateInlineExhaustivePass()); + RegisterPass(CreateAggressiveDCEPass()); + RegisterPass(CreatePrivateToLocalPass()); + RegisterPass(CreateLocalSingleBlockLoadStoreElimPass()); + RegisterPass(CreateLocalSingleStoreElimPass()); + RegisterPass(CreateAggressiveDCEPass()); + RegisterPass(CreateScalarReplacementPass()); + RegisterPass(CreateLocalAccessChainConvertPass()); + RegisterPass(CreateLocalSingleBlockLoadStoreElimPass()); + RegisterPass(CreateLocalSingleStoreElimPass()); + RegisterPass(CreateAggressiveDCEPass()); + RegisterPass(CreateLocalMultiStoreElimPass()); + RegisterPass(CreateAggressiveDCEPass()); + RegisterPass(CreateCCPPass()); + RegisterPass(CreateAggressiveDCEPass()); + RegisterPass(CreateRedundancyEliminationPass()); + RegisterPass(CreateCombineAccessChainsPass()); + RegisterPass(CreateSimplificationPass(), MaterialBuilder::TargetApi::METAL); + RegisterPass(CreateVectorDCEPass()); + RegisterPass(CreateDeadInsertElimPass()); + RegisterPass(CreateDeadBranchElimPass()); + RegisterPass(CreateSimplificationPass(), MaterialBuilder::TargetApi::METAL); + RegisterPass(CreateIfConversionPass()); + RegisterPass(CreateCopyPropagateArraysPass()); + RegisterPass(CreateReduceLoadSizePass()); + RegisterPass(CreateAggressiveDCEPass()); + RegisterPass(CreateBlockMergePass()); + RegisterPass(CreateRedundancyEliminationPass()); + RegisterPass(CreateDeadBranchElimPass()); + RegisterPass(CreateBlockMergePass()); + RegisterPass(CreateSimplificationPass(), MaterialBuilder::TargetApi::METAL); } void GLSLPostProcessor::registerSizePasses(Optimizer& optimizer, Config const& config) { - optimizer - .RegisterPass(CreateWrapOpKillPass()) - .RegisterPass(CreateDeadBranchElimPass()); - - if (config.shaderModel != ShaderModel::DESKTOP) { - // this triggers a segfault with AMD drivers on MacOS - optimizer.RegisterPass(CreateMergeReturnPass()); - } - - optimizer - .RegisterPass(CreateInlineExhaustivePass()) - .RegisterPass(CreateEliminateDeadFunctionsPass()) - .RegisterPass(CreatePrivateToLocalPass()) - .RegisterPass(CreateScalarReplacementPass(0)) - .RegisterPass(CreateLocalMultiStoreElimPass()) - .RegisterPass(CreateCCPPass()) - .RegisterPass(CreateLoopUnrollPass(true)) - .RegisterPass(CreateDeadBranchElimPass()) - .RegisterPass(CreateSimplificationPass()) - .RegisterPass(CreateScalarReplacementPass(0)) - .RegisterPass(CreateLocalSingleStoreElimPass()) - .RegisterPass(CreateIfConversionPass()) - .RegisterPass(CreateSimplificationPass()) - .RegisterPass(CreateAggressiveDCEPass()) - .RegisterPass(CreateDeadBranchElimPass()) - .RegisterPass(CreateBlockMergePass()) - .RegisterPass(CreateLocalAccessChainConvertPass()) - .RegisterPass(CreateLocalSingleBlockLoadStoreElimPass()) - .RegisterPass(CreateAggressiveDCEPass()) - .RegisterPass(CreateCopyPropagateArraysPass()) - .RegisterPass(CreateVectorDCEPass()) - .RegisterPass(CreateDeadInsertElimPass()) - // this breaks UBO layout - //.RegisterPass(CreateEliminateDeadMembersPass()) - .RegisterPass(CreateLocalSingleStoreElimPass()) - .RegisterPass(CreateBlockMergePass()) - .RegisterPass(CreateLocalMultiStoreElimPass()) - .RegisterPass(CreateRedundancyEliminationPass()) - .RegisterPass(CreateSimplificationPass()) - .RegisterPass(CreateAggressiveDCEPass()) - .RegisterPass(CreateCFGCleanupPass()); + auto RegisterPass = [&](spvtools::Optimizer::PassToken&& pass, + MaterialBuilder::TargetApi apiFilter = MaterialBuilder::TargetApi::ALL) { + if (!(config.targetApi & apiFilter)) { + return; + } + optimizer.RegisterPass(std::move(pass)); + }; + + RegisterPass(CreateWrapOpKillPass()); + RegisterPass(CreateDeadBranchElimPass()); + RegisterPass(CreateInlineExhaustivePass()); + RegisterPass(CreateEliminateDeadFunctionsPass()); + RegisterPass(CreatePrivateToLocalPass()); + RegisterPass(CreateScalarReplacementPass(0)); + RegisterPass(CreateLocalMultiStoreElimPass()); + RegisterPass(CreateCCPPass()); + RegisterPass(CreateLoopUnrollPass(true)); + RegisterPass(CreateDeadBranchElimPass()); + RegisterPass(CreateScalarReplacementPass(0)); + RegisterPass(CreateLocalSingleStoreElimPass()); + RegisterPass(CreateIfConversionPass()); + RegisterPass(CreateAggressiveDCEPass()); + RegisterPass(CreateDeadBranchElimPass()); + RegisterPass(CreateBlockMergePass()); + RegisterPass(CreateLocalAccessChainConvertPass()); + RegisterPass(CreateLocalSingleBlockLoadStoreElimPass()); + RegisterPass(CreateAggressiveDCEPass()); + RegisterPass(CreateCopyPropagateArraysPass()); + RegisterPass(CreateVectorDCEPass()); + RegisterPass(CreateDeadInsertElimPass()); + // this breaks UBO layout + //RegisterPass(CreateEliminateDeadMembersPass()); + RegisterPass(CreateLocalSingleStoreElimPass()); + RegisterPass(CreateBlockMergePass()); + RegisterPass(CreateLocalMultiStoreElimPass()); + RegisterPass(CreateRedundancyEliminationPass()); + RegisterPass(CreateAggressiveDCEPass()); + RegisterPass(CreateCFGCleanupPass()); } } // namespace filamat diff --git a/libs/filamat/src/GLSLPostProcessor.h b/libs/filamat/src/GLSLPostProcessor.h index 01c7d5058bc..8616d0e4dc8 100644 --- a/libs/filamat/src/GLSLPostProcessor.h +++ b/libs/filamat/src/GLSLPostProcessor.h @@ -17,28 +17,25 @@ #ifndef TNT_GLSLPOSTPROCESSOR_H #define TNT_GLSLPOSTPROCESSOR_H -#include -#include - -#include +#include // for MaterialBuilder:: enums #include - -#include "filamat/MaterialBuilder.h" // for MaterialBuilder:: enums - -#include +#include #include "ShaderMinifier.h" +#include + #include -#include +#include -#include +#include -namespace filament { -class SamplerInterfaceBlock; -}; +#include +#include +#include +#include namespace filamat { @@ -46,6 +43,13 @@ using SpirvBlob = std::vector; using BindingPointAndSib = std::pair; using SibVector = utils::FixedCapacityVector; +using DescriptorInfo = std::tuple< + utils::CString, + filament::backend::DescriptorSetLayoutBinding, + std::optional>; +using DescriptorSetInfo = utils::FixedCapacityVector; +using DescriptorSets = std::array; + class GLSLPostProcessor { public: enum Flags : uint32_t { @@ -59,6 +63,7 @@ class GLSLPostProcessor { struct Config { filament::Variant variant; + filament::UserVariantFilterMask variantFilter; MaterialBuilder::TargetApi targetApi; MaterialBuilder::TargetLanguage targetLanguage; filament::backend::ShaderStage shaderType; @@ -67,6 +72,7 @@ class GLSLPostProcessor { filament::MaterialDomain domain; const filamat::MaterialInfo* materialInfo; bool hasFramebufferFetch; + bool usesClipDistance; struct { std::vector> subpassInputToColorLocation; } glsl; @@ -79,8 +85,9 @@ class GLSLPostProcessor { // public so backend_test can also use it static void spirvToMsl(const SpirvBlob* spirv, std::string* outMsl, - filament::backend::ShaderModel shaderModel, bool useFramebufferFetch, - const SibVector& sibs, const ShaderMinifier* minifier); + filament::backend::ShaderStage stage, filament::backend::ShaderModel shaderModel, + bool useFramebufferFetch, const DescriptorSets& descriptorSets, + const ShaderMinifier* minifier); private: struct InternalConfig { @@ -93,8 +100,9 @@ class GLSLPostProcessor { ShaderMinifier minifier; }; - void fullOptimization(const glslang::TShader& tShader, + bool fullOptimization(const glslang::TShader& tShader, GLSLPostProcessor::Config const& config, InternalConfig& internalConfig) const; + void preprocessOptimization(glslang::TShader& tShader, GLSLPostProcessor::Config const& config, InternalConfig& internalConfig) const; @@ -111,6 +119,8 @@ class GLSLPostProcessor { void optimizeSpirv(OptimizerPtr optimizer, SpirvBlob& spirv) const; + void fixupClipDistance(SpirvBlob& spirv, GLSLPostProcessor::Config const& config) const; + const MaterialBuilder::Optimization mOptimization; const bool mPrintShaders; const bool mGenerateDebugInfo; diff --git a/libs/filamat/src/MaterialBuilder.cpp b/libs/filamat/src/MaterialBuilder.cpp index 94c1d3bed41..96563bfa6e1 100644 --- a/libs/filamat/src/MaterialBuilder.cpp +++ b/libs/filamat/src/MaterialBuilder.cpp @@ -20,14 +20,12 @@ #include "Includes.h" #include "MaterialVariants.h" -#include "SibGenerator.h" +#include "PushConstantDefinitions.h" +#include "shaders/SibGenerator.h" +#include "shaders/UibGenerator.h" -#ifndef FILAMAT_LITE -# include "GLSLPostProcessor.h" -# include "sca/GLSLTools.h" -#else -# include "sca/GLSLToolsLite.h" -#endif +#include "GLSLPostProcessor.h" +#include "sca/GLSLTools.h" #include "shaders/MaterialInfo.h" #include "shaders/ShaderGenerator.h" @@ -36,7 +34,7 @@ #include "eiff/LineDictionary.h" #include "eiff/MaterialInterfaceBlockChunk.h" #include "eiff/MaterialTextChunk.h" -#include "eiff/MaterialSpirvChunk.h" +#include "eiff/MaterialBinaryChunk.h" #include "eiff/ChunkContainer.h" #include "eiff/SimpleFieldChunk.h" #include "eiff/DictionaryTextChunk.h" @@ -45,22 +43,58 @@ #include #include #include +#include +#include +#include +#include +#include + +#include +#include +#include #include #include #include #include +#include +#include #include +#include #include #include +#include +#include +#include +#include namespace filamat { using namespace utils; using namespace filament; +// Note: the VertexAttribute enum value must match the index in the array +const MaterialBuilder::AttributeDatabase MaterialBuilder::sAttributeDatabase = {{ + { "position", AttributeType::FLOAT4, VertexAttribute::POSITION }, + { "tangents", AttributeType::FLOAT4, VertexAttribute::TANGENTS }, + { "color", AttributeType::FLOAT4, VertexAttribute::COLOR }, + { "uv0", AttributeType::FLOAT2, VertexAttribute::UV0 }, + { "uv1", AttributeType::FLOAT2, VertexAttribute::UV1 }, + { "bone_indices", AttributeType::UINT4, VertexAttribute::BONE_INDICES }, + { "bone_weights", AttributeType::FLOAT4, VertexAttribute::BONE_WEIGHTS }, + { }, + { "custom0", AttributeType::FLOAT4, VertexAttribute::CUSTOM0 }, + { "custom1", AttributeType::FLOAT4, VertexAttribute::CUSTOM1 }, + { "custom2", AttributeType::FLOAT4, VertexAttribute::CUSTOM2 }, + { "custom3", AttributeType::FLOAT4, VertexAttribute::CUSTOM3 }, + { "custom4", AttributeType::FLOAT4, VertexAttribute::CUSTOM4 }, + { "custom5", AttributeType::FLOAT4, VertexAttribute::CUSTOM5 }, + { "custom6", AttributeType::FLOAT4, VertexAttribute::CUSTOM6 }, + { "custom7", AttributeType::FLOAT4, VertexAttribute::CUSTOM7 }, +}}; + std::atomic MaterialBuilderBase::materialBuilderClients(0); inline void assertSingleTargetApi(MaterialBuilderBase::TargetApi api) { @@ -69,7 +103,8 @@ inline void assertSingleTargetApi(MaterialBuilderBase::TargetApi api) { assert(bits && !(bits & bits - 1u)); } -void MaterialBuilderBase::prepare(bool vulkanSemantics) { +void MaterialBuilderBase::prepare(bool vulkanSemantics, + filament::backend::FeatureLevel featureLevel) { mCodeGenPermutations.clear(); mShaderModels.reset(); @@ -97,6 +132,11 @@ void MaterialBuilderBase::prepare(bool vulkanSemantics) { mTargetApi = TargetApi::OPENGL; } + // Generally build for a minimum of feature level 1. If feature level 0 is specified, an extra + // permutation is specifically included for the OpenGL/mobile target. + MaterialBuilder::FeatureLevel effectiveFeatureLevel = + std::max(featureLevel, filament::backend::FeatureLevel::FEATURE_LEVEL_1); + // Build a list of codegen permutations, which is useful across all types of material builders. static_assert(backend::SHADER_MODEL_COUNT == 2); for (const auto shaderModel: { ShaderModel::MOBILE, ShaderModel::DESKTOP }) { @@ -104,14 +144,40 @@ void MaterialBuilderBase::prepare(bool vulkanSemantics) { if (!mShaderModels.test(i)) { continue; // skip this shader model since it was not requested. } + if (any(mTargetApi & TargetApi::OPENGL)) { - mCodeGenPermutations.push_back({shaderModel, TargetApi::OPENGL, glTargetLanguage}); + mCodeGenPermutations.push_back({ + shaderModel, + TargetApi::OPENGL, + glTargetLanguage, + effectiveFeatureLevel, + }); + if (mIncludeEssl1 + && featureLevel == filament::backend::FeatureLevel::FEATURE_LEVEL_0 + && shaderModel == ShaderModel::MOBILE) { + mCodeGenPermutations.push_back({ + shaderModel, + TargetApi::OPENGL, + glTargetLanguage, + filament::backend::FeatureLevel::FEATURE_LEVEL_0 + }); + } } if (any(mTargetApi & TargetApi::VULKAN)) { - mCodeGenPermutations.push_back({shaderModel, TargetApi::VULKAN, TargetLanguage::SPIRV}); + mCodeGenPermutations.push_back({ + shaderModel, + TargetApi::VULKAN, + TargetLanguage::SPIRV, + effectiveFeatureLevel, + }); } if (any(mTargetApi & TargetApi::METAL)) { - mCodeGenPermutations.push_back({shaderModel, TargetApi::METAL, TargetLanguage::SPIRV}); + mCodeGenPermutations.push_back({ + shaderModel, + TargetApi::METAL, + TargetLanguage::SPIRV, + effectiveFeatureLevel, + }); } } } @@ -119,22 +185,20 @@ void MaterialBuilderBase::prepare(bool vulkanSemantics) { MaterialBuilder::MaterialBuilder() : mMaterialName("Unnamed") { std::fill_n(mProperties, MATERIAL_PROPERTIES_COUNT, false); mShaderModels.reset(); + + initPushConstants(); } MaterialBuilder::~MaterialBuilder() = default; void MaterialBuilderBase::init() { materialBuilderClients++; -#ifndef FILAMAT_LITE GLSLTools::init(); -#endif } void MaterialBuilderBase::shutdown() { materialBuilderClients--; -#ifndef FILAMAT_LITE GLSLTools::shutdown(); -#endif } MaterialBuilder& MaterialBuilder::name(const char* name) noexcept { @@ -181,7 +245,21 @@ MaterialBuilder& MaterialBuilder::variable(Variable v, const char* name) noexcep case Variable::CUSTOM2: case Variable::CUSTOM3: assert(size_t(v) < MATERIAL_VARIABLES_COUNT); - mVariables[size_t(v)] = CString(name); + mVariables[size_t(v)] = { CString(name), Precision::DEFAULT, false }; + break; + } + return *this; +} + +MaterialBuilder& MaterialBuilder::variable(Variable v, + const char* name, ParameterPrecision precision) noexcept { + switch (v) { + case Variable::CUSTOM0: + case Variable::CUSTOM1: + case Variable::CUSTOM2: + case Variable::CUSTOM3: + assert(size_t(v) < MATERIAL_VARIABLES_COUNT); + mVariables[size_t(v)] = { CString(name), precision, true }; break; } return *this; @@ -189,7 +267,7 @@ MaterialBuilder& MaterialBuilder::variable(Variable v, const char* name) noexcep MaterialBuilder& MaterialBuilder::parameter(const char* name, size_t size, UniformType type, ParameterPrecision precision) noexcept { - ASSERT_POSTCONDITION(mParameterCount < MAX_PARAMETERS_COUNT, "Too many parameters"); + FILAMENT_CHECK_POSTCONDITION(mParameterCount < MAX_PARAMETERS_COUNT) << "Too many parameters"; mParameters[mParameterCount++] = { name, type, size, precision }; return *this; } @@ -201,29 +279,79 @@ MaterialBuilder& MaterialBuilder::parameter(const char* name, UniformType type, MaterialBuilder& MaterialBuilder::parameter(const char* name, SamplerType samplerType, - SamplerFormat format, ParameterPrecision precision) noexcept { - ASSERT_POSTCONDITION(mParameterCount < MAX_PARAMETERS_COUNT, "Too many parameters"); - mParameters[mParameterCount++] = { name, samplerType, format, precision }; + SamplerFormat format, ParameterPrecision precision, bool multisample) noexcept { + FILAMENT_CHECK_PRECONDITION(!multisample || + (format != SamplerFormat::SHADOW && + (samplerType == SamplerType::SAMPLER_2D || + samplerType == SamplerType::SAMPLER_2D_ARRAY))) + << "multisample samplers only possible with SAMPLER_2D or SAMPLER_2D_ARRAY," + " as long as type is not SHADOW"; + + FILAMENT_CHECK_POSTCONDITION(mParameterCount < MAX_PARAMETERS_COUNT) << "Too many parameters"; + mParameters[mParameterCount++] = { name, samplerType, format, precision, multisample }; return *this; } -MaterialBuilder& MaterialBuilder::parameter(const char* name, SamplerType samplerType, - ParameterPrecision precision) noexcept { - return parameter(name, samplerType, SamplerFormat::FLOAT, precision); +template +MaterialBuilder& MaterialBuilder::constant(const char* name, ConstantType type, T defaultValue) { + auto result = std::find_if(mConstants.begin(), mConstants.end(), [name](const Constant& c) { + return c.name == utils::CString(name); + }); + FILAMENT_CHECK_POSTCONDITION(result == mConstants.end()) + << "There is already a constant parameter present with the name " << name << "."; + Constant constant { + .name = CString(name), + .type = type, + }; + auto toString = [](ConstantType t) { + switch (t) { + case ConstantType::INT: return "INT"; + case ConstantType::FLOAT: return "FLOAT"; + case ConstantType::BOOL: return "BOOL"; + } + }; + + if constexpr (std::is_same_v) { + FILAMENT_CHECK_POSTCONDITION(type == ConstantType::INT) + << "Constant " << name << " was declared with type " << toString(type) + << " but given an int default value."; + constant.defaultValue.i = defaultValue; + } else if constexpr (std::is_same_v) { + FILAMENT_CHECK_POSTCONDITION(type == ConstantType::FLOAT) + << "Constant " << name << " was declared with type " << toString(type) + << " but given a float default value."; + constant.defaultValue.f = defaultValue; + } else if constexpr (std::is_same_v) { + FILAMENT_CHECK_POSTCONDITION(type == ConstantType::BOOL) + << "Constant " << name << " was declared with type " << toString(type) + << " but given a bool default value."; + constant.defaultValue.b = defaultValue; + } else { + assert_invariant(false); + } + + mConstants.push_back(constant); + return *this; } +template MaterialBuilder& MaterialBuilder::constant( + const char* name, ConstantType type, int32_t defaultValue); +template MaterialBuilder& MaterialBuilder::constant( + const char* name, ConstantType type, float defaultValue); +template MaterialBuilder& MaterialBuilder::constant( + const char* name, ConstantType type, bool defaultValue); MaterialBuilder& MaterialBuilder::buffer(BufferInterfaceBlock bib) noexcept { - ASSERT_POSTCONDITION(mBuffers.size() < MAX_BUFFERS_COUNT, "Too many buffers"); + FILAMENT_CHECK_POSTCONDITION(mBuffers.size() < MAX_BUFFERS_COUNT) << "Too many buffers"; mBuffers.emplace_back(std::make_unique(std::move(bib))); return *this; } MaterialBuilder& MaterialBuilder::subpass(SubpassType subpassType, SamplerFormat format, ParameterPrecision precision, const char* name) noexcept { - ASSERT_PRECONDITION(format == SamplerFormat::FLOAT, - "Subpass parameters must have FLOAT format."); + FILAMENT_CHECK_PRECONDITION(format == SamplerFormat::FLOAT) + << "Subpass parameters must have FLOAT format."; - ASSERT_POSTCONDITION(mSubpassCount < MAX_SUBPASS_COUNT, "Too many subpasses"); + FILAMENT_CHECK_POSTCONDITION(mSubpassCount < MAX_SUBPASS_COUNT) << "Too many subpasses"; mSubpasses[mSubpassCount++] = { name, subpassType, format, precision }; return *this; } @@ -289,6 +417,16 @@ MaterialBuilder& MaterialBuilder::blending(BlendingMode blending) noexcept { return *this; } +MaterialBuilder& MaterialBuilder::customBlendFunctions( + BlendFunction srcRGB, BlendFunction srcA, + BlendFunction dstRGB, BlendFunction dstA) noexcept { + mCustomBlendFunctions[0] = srcRGB; + mCustomBlendFunctions[1] = srcA; + mCustomBlendFunctions[2] = dstRGB; + mCustomBlendFunctions[3] = dstA; + return *this; +} + MaterialBuilder& MaterialBuilder::postLightingBlending(BlendingMode blending) noexcept { mPostLightingBlendingMode = blending; return *this; @@ -336,6 +474,12 @@ MaterialBuilder& MaterialBuilder::maskThreshold(float threshold) noexcept { return *this; } +MaterialBuilder& MaterialBuilder::alphaToCoverage(bool enable) noexcept { + mAlphaToCoverage = enable; + mAlphaToCoverageSet = true; + return *this; +} + MaterialBuilder& MaterialBuilder::shadowMultiplier(bool shadowMultiplier) noexcept { mShadowMultiplier = shadowMultiplier; return *this; @@ -393,6 +537,16 @@ MaterialBuilder& MaterialBuilder::transparencyMode(TransparencyMode mode) noexce return *this; } +MaterialBuilder& MaterialBuilder::stereoscopicType(StereoscopicType stereoscopicType) noexcept { + mStereoscopicType = stereoscopicType; + return *this; +} + +MaterialBuilder& MaterialBuilder::stereoscopicEyeCount(uint8_t eyeCount) noexcept { + mStereoscopicEyeCount = eyeCount; + return *this; +} + MaterialBuilder& MaterialBuilder::reflectionMode(ReflectionMode mode) noexcept { mReflectionMode = mode; return *this; @@ -418,6 +572,11 @@ MaterialBuilder& MaterialBuilder::printShaders(bool printShaders) noexcept { return *this; } +MaterialBuilder& MaterialBuilder::saveRawVariants(bool saveRawVariants) noexcept { + mSaveRawVariants = saveRawVariants; + return *this; +} + MaterialBuilder& MaterialBuilder::generateDebugInfo(bool generateDebugInfo) noexcept { mGenerateDebugInfo = generateDebugInfo; return *this; @@ -433,10 +592,10 @@ MaterialBuilder& MaterialBuilder::shaderDefine(const char* name, const char* val return *this; } -bool MaterialBuilder::hasExternalSampler() const noexcept { +bool MaterialBuilder::hasSamplerType(SamplerType samplerType) const noexcept { for (size_t i = 0, c = mParameterCount; i < c; i++) { auto const& param = mParameters[i]; - if (param.isSampler() && param.samplerType == SamplerType::SAMPLER_EXTERNAL) { + if (param.isSampler() && param.samplerType == samplerType) { return true; } } @@ -444,20 +603,22 @@ bool MaterialBuilder::hasExternalSampler() const noexcept { } void MaterialBuilder::prepareToBuild(MaterialInfo& info) noexcept { - MaterialBuilderBase::prepare(mEnableFramebufferFetch); + MaterialBuilderBase::prepare(mEnableFramebufferFetch, mFeatureLevel); // Build the per-material sampler block and uniform block. SamplerInterfaceBlock::Builder sbb; BufferInterfaceBlock::Builder ibb; - for (size_t i = 0, c = mParameterCount; i < c; i++) { + // sampler bindings start at 1, 0 is the ubo + for (size_t i = 0, binding = 1, c = mParameterCount; i < c; i++) { auto const& param = mParameters[i]; assert_invariant(!param.isSubpass()); if (param.isSampler()) { sbb.add({ param.name.data(), param.name.size() }, - param.samplerType, param.format, param.precision); + binding++, param.samplerType, param.format, param.precision, param.multisample); } else if (param.isUniform()) { ibb.add({{{ param.name.data(), param.name.size() }, - uint32_t(param.size == 1u ? 0u : param.size), param.uniformType, param.precision }}); + uint32_t(param.size == 1u ? 0u : param.size), param.uniformType, + param.precision, FeatureLevel::FEATURE_LEVEL_0 }}); } } @@ -484,11 +645,11 @@ void MaterialBuilder::prepareToBuild(MaterialInfo& info) noexcept { } if (mBlendingMode == BlendingMode::MASKED) { - ibb.add({{ "_maskThreshold", 0, UniformType::FLOAT }}); + ibb.add({{ "_maskThreshold", 0, UniformType::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 }}); } if (mDoubleSidedCapability) { - ibb.add({{ "_doubleSided", 0, UniformType::BOOL }}); + ibb.add({{ "_doubleSided", 0, UniformType::BOOL, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 }}); } mRequiredAttributes.set(VertexAttribute::POSITION); @@ -501,7 +662,8 @@ void MaterialBuilder::prepareToBuild(MaterialInfo& info) noexcept { info.isLit = isLit(); info.hasDoubleSidedCapability = mDoubleSidedCapability; - info.hasExternalSamplers = hasExternalSampler(); + info.hasExternalSamplers = hasSamplerType(SamplerType::SAMPLER_EXTERNAL); + info.has3dSamplers = hasSamplerType(SamplerType::SAMPLER_3D); info.specularAntiAliasing = mSpecularAntiAliasing; info.clearCoatIorChange = mClearCoatIorChange; info.flipUV = mFlipUV; @@ -525,63 +687,71 @@ void MaterialBuilder::prepareToBuild(MaterialInfo& info) noexcept { info.vertexDomainDeviceJittered = mVertexDomainDeviceJittered; info.featureLevel = mFeatureLevel; info.groupSize = mGroupSize; + info.stereoscopicType = mStereoscopicType; + info.stereoscopicEyeCount = mStereoscopicEyeCount; + + // This is determined via static analysis of the glsl after prepareToBuild(). + info.userMaterialHasCustomDepth = false; +} + +void MaterialBuilder::initPushConstants() noexcept { + mPushConstants.reserve(PUSH_CONSTANTS.size()); + mPushConstants.resize(PUSH_CONSTANTS.size()); + std::transform(PUSH_CONSTANTS.cbegin(), PUSH_CONSTANTS.cend(), mPushConstants.begin(), + [](filament::MaterialPushConstant const& inConstant) -> PushConstant { + return { + .name = inConstant.name, + .type = inConstant.type, + .stage = inConstant.stage, + }; + }); } bool MaterialBuilder::findProperties(backend::ShaderStage type, - MaterialBuilder::PropertyList& allProperties) noexcept { -#ifndef FILAMAT_LITE + MaterialBuilder::PropertyList& allProperties, + CodeGenParams const& semanticCodeGenParams) noexcept { GLSLTools glslTools; - std::string shaderCodeAllProperties = peek(type, mSemanticCodeGenParams, allProperties); + std::string shaderCodeAllProperties = peek(type, semanticCodeGenParams, allProperties); // Populate mProperties with the properties set in the shader. if (!glslTools.findProperties(type, shaderCodeAllProperties, mProperties, - mSemanticCodeGenParams.targetApi, - mSemanticCodeGenParams.targetLanguage, - mSemanticCodeGenParams.shaderModel)) { + semanticCodeGenParams.targetApi, + semanticCodeGenParams.targetLanguage, + semanticCodeGenParams.shaderModel)) { + if (mPrintShaders) { + slog.e << shaderCodeAllProperties << io::endl; + } return false; } return true; -#else - return false; -#endif } -bool MaterialBuilder::findAllProperties() noexcept { +bool MaterialBuilder::findAllProperties(CodeGenParams const& semanticCodeGenParams) noexcept { if (mMaterialDomain != MaterialDomain::SURFACE) { return true; } using namespace backend; -#ifndef FILAMAT_LITE // Some fields in MaterialInputs only exist if the property is set (e.g: normal, subsurface // for cloth shading model). Give our shader all properties. This will enable us to parse and // static code analyse the AST. MaterialBuilder::PropertyList allProperties; std::fill_n(allProperties, MATERIAL_PROPERTIES_COUNT, true); - if (!findProperties(ShaderStage::FRAGMENT, allProperties)) { + if (!findProperties(ShaderStage::FRAGMENT, allProperties, semanticCodeGenParams)) { return false; } - if (!findProperties(ShaderStage::VERTEX, allProperties)) { + if (!findProperties(ShaderStage::VERTEX, allProperties, semanticCodeGenParams)) { return false; } return true; -#else - GLSLToolsLite glslTools; - if (glslTools.findProperties(ShaderStage::FRAGMENT, mMaterialFragmentCode.getResolved(), mProperties)) { - return glslTools.findProperties( - ShaderStage::VERTEX, mMaterialVertexCode.getResolved(), mProperties); - } - return false; -#endif } -bool MaterialBuilder::runSemanticAnalysis(MaterialInfo const& info) noexcept { -#ifndef FILAMAT_LITE +bool MaterialBuilder::runSemanticAnalysis(MaterialInfo* inOutInfo, + CodeGenParams const& semanticCodeGenParams) noexcept { using namespace backend; - GLSLTools glslTools; - TargetApi targetApi = mSemanticCodeGenParams.targetApi; - TargetLanguage targetLanguage = mSemanticCodeGenParams.targetLanguage; + TargetApi targetApi = semanticCodeGenParams.targetApi; + TargetLanguage const targetLanguage = semanticCodeGenParams.targetLanguage; assertSingleTargetApi(targetApi); if (mEnableFramebufferFetch) { @@ -589,45 +759,31 @@ bool MaterialBuilder::runSemanticAnalysis(MaterialInfo const& info) noexcept { targetApi = TargetApi::VULKAN; } - bool result = false; - ShaderModel model = mSemanticCodeGenParams.shaderModel; + bool success = false; + std::string shaderCode; + ShaderModel const model = semanticCodeGenParams.shaderModel; if (mMaterialDomain == filament::MaterialDomain::COMPUTE) { - std::string shaderCode = peek(ShaderStage::COMPUTE, mSemanticCodeGenParams, mProperties); - result = GLSLTools::analyzeComputeShader(shaderCode, model, - targetApi, targetLanguage, info); + shaderCode = peek(ShaderStage::COMPUTE, semanticCodeGenParams, mProperties); + success = GLSLTools::analyzeComputeShader(shaderCode, model, + targetApi, targetLanguage); } else { - std::string shaderCode = peek(ShaderStage::VERTEX, mSemanticCodeGenParams, mProperties); - result = GLSLTools::analyzeVertexShader(shaderCode, model, mMaterialDomain, - targetApi, targetLanguage, info); - if (result) { - shaderCode = peek(ShaderStage::FRAGMENT, mSemanticCodeGenParams, mProperties); - result = GLSLTools::analyzeFragmentShader(shaderCode, model, mMaterialDomain, - targetApi, targetLanguage, mCustomSurfaceShading, info); + shaderCode = peek(ShaderStage::VERTEX, semanticCodeGenParams, mProperties); + success = GLSLTools::analyzeVertexShader(shaderCode, model, mMaterialDomain, + targetApi, targetLanguage); + if (success) { + shaderCode = peek(ShaderStage::FRAGMENT, semanticCodeGenParams, mProperties); + auto result = GLSLTools::analyzeFragmentShader(shaderCode, model, mMaterialDomain, + targetApi, targetLanguage, mCustomSurfaceShading); + success = result.has_value(); + if (success) { + inOutInfo->userMaterialHasCustomDepth = result->userMaterialHasCustomDepth; + } } } - return result; -#else - return true; -#endif -} - -bool MaterialBuilder::checkLiteRequirements() noexcept { -#ifdef FILAMAT_LITE - if (mTargetApi != TargetApi::OPENGL) { - slog.e - << "Filamat lite only supports building materials for the OpenGL backend." - << io::endl; - return false; - } - - if (mOptimization != Optimization::NONE) { - slog.e - << "Filamat lite does not support material optimization." << io::endl - << "Ensure optimization is set to NONE." << io::endl; - return false; + if (!success && mPrintShaders) { + slog.e << shaderCode << io::endl; } -#endif - return true; + return success; } bool MaterialBuilder::ShaderCode::resolveIncludes(IncludeCallback callback, @@ -655,16 +811,47 @@ bool MaterialBuilder::ShaderCode::resolveIncludes(IncludeCallback callback, static void showErrorMessage(const char* materialName, filament::Variant variant, MaterialBuilder::TargetApi targetApi, backend::ShaderStage shaderType, + MaterialBuilder::FeatureLevel featureLevel, const std::string& shaderCode) { using ShaderStage = backend::ShaderStage; using TargetApi = MaterialBuilder::TargetApi; + + const char* targetApiString; + switch (targetApi) { + case TargetApi::OPENGL: + targetApiString = (featureLevel == MaterialBuilder::FeatureLevel::FEATURE_LEVEL_0) + ? "GLES 2.0.\n" : "OpenGL.\n"; + break; + case TargetApi::VULKAN: + targetApiString = "Vulkan.\n"; + break; + case TargetApi::METAL: + targetApiString = "Metal.\n"; + break; + case TargetApi::ALL: + assert(0); // Unreachable. + break; + } + + const char* shaderStageString; + switch (shaderType) { + case ShaderStage::VERTEX: + shaderStageString = "Vertex Shader\n"; + break; + case ShaderStage::FRAGMENT: + shaderStageString = "Fragment Shader\n"; + break; + case ShaderStage::COMPUTE: + shaderStageString = "Compute Shader\n"; + break; + } + slog.e << "Error in \"" << materialName << "\"" << ", Variant 0x" << io::hex << +variant.key - << (targetApi == TargetApi::VULKAN ? ", Vulkan.\n" : ", OpenGL.\n") + << ", " << targetApiString << "=========================\n" - << "Generated " - << (shaderType == ShaderStage::VERTEX ? "Vertex Shader\n" : "Fragment Shader\n") + << "Generated " << shaderStageString << "=========================\n" << shaderCode; } @@ -672,30 +859,28 @@ static void showErrorMessage(const char* materialName, filament::Variant variant bool MaterialBuilder::generateShaders(JobSystem& jobSystem, const std::vector& variants, ChunkContainer& container, const MaterialInfo& info) const noexcept { // Create a postprocessor to optimize / compile to Spir-V if necessary. -#ifndef FILAMAT_LITE + uint32_t flags = 0; flags |= mPrintShaders ? GLSLPostProcessor::PRINT_SHADERS : 0; flags |= mGenerateDebugInfo ? GLSLPostProcessor::GENERATE_DEBUG_INFO : 0; GLSLPostProcessor postProcessor(mOptimization, flags); -#endif // Start: must be protected by lock Mutex entriesLock; std::vector glslEntries; - std::vector spirvEntries; + std::vector essl1Entries; + std::vector spirvEntries; std::vector metalEntries; LineDictionary textDictionary; -#ifndef FILAMAT_LITE BlobDictionary spirvDictionary; -#endif // End: must be protected by lock - ShaderGenerator sg( - mProperties, mVariables, mOutputs, mDefines, mMaterialFragmentCode.getResolved(), - mMaterialFragmentCode.getLineOffset(), mMaterialVertexCode.getResolved(), - mMaterialVertexCode.getLineOffset(), mMaterialDomain); + ShaderGenerator sg(mProperties, mVariables, mOutputs, mDefines, mConstants, mPushConstants, + mMaterialFragmentCode.getResolved(), mMaterialFragmentCode.getLineOffset(), + mMaterialVertexCode.getResolved(), mMaterialVertexCode.getLineOffset(), + mMaterialDomain); - container.addSimpleChild(ChunkType::MaterialHasCustomDepthShader, needsStandardDepthProgram()); + container.emplace(ChunkType::MaterialHasCustomDepthShader, needsStandardDepthProgram()); std::atomic_bool cancelJobs(false); bool firstJob = true; @@ -708,6 +893,7 @@ bool MaterialBuilder::generateShaders(JobSystem& jobSystem, const std::vector* pSpirv = targetApiNeedsSpirv ? &spirv : nullptr; std::string* pMsl = targetApiNeedsMsl ? &msl : nullptr; - TextEntry glslEntry{0}; - SpirvEntry spirvEntry{0}; - TextEntry metalEntry{0}; + TextEntry glslEntry{}; + BinaryEntry spirvEntry{}; + TextEntry metalEntry{}; - glslEntry.shaderModel = static_cast(params.shaderModel); - spirvEntry.shaderModel = static_cast(params.shaderModel); - metalEntry.shaderModel = static_cast(params.shaderModel); + glslEntry.shaderModel = params.shaderModel; + spirvEntry.shaderModel = params.shaderModel; + metalEntry.shaderModel = params.shaderModel; - glslEntry.variantKey = v.variant.key; - spirvEntry.variantKey = v.variant.key; - metalEntry.variantKey = v.variant.key; + glslEntry.variant = v.variant; + spirvEntry.variant = v.variant; + metalEntry.variant = v.variant; // Generate raw shader code. // The quotes in Google-style line directives cause problems with certain drivers. These @@ -752,37 +938,59 @@ bool MaterialBuilder::generateShaders(JobSystem& jobSystem, const std::vector lock(entriesLock); + std::unique_lock const lock(entriesLock); // below we rely on casting ShaderStage to uint8_t static_assert(sizeof(filament::backend::ShaderStage) == 1); @@ -819,26 +1029,29 @@ bool MaterialBuilder::generateShaders(JobSystem& jobSystem, const std::vector d(reinterpret_cast(spirv.data()), + reinterpret_cast(spirv.data() + spirv.size())); + spirvEntry.stage = v.stage; + spirvEntry.data = std::move(d); spirvEntries.push_back(spirvEntry); -#endif break; + } case TargetApi::METAL: -#ifndef FILAMAT_LITE assert(!spirv.empty()); assert(msl.length() > 0); - metalEntry.stage = uint8_t(v.stage); + metalEntry.stage = v.stage; metalEntry.shader = msl; metalEntries.push_back(metalEntry); -#endif break; } }); @@ -863,13 +1076,14 @@ bool MaterialBuilder::generateShaders(JobSystem& jobSystem, const std::vector spirv = std::move(s.spirv); + std::vector spirv = std::move(s.data); s.dictionaryIndex = spirvDictionary.addBlob(spirv); } -#endif for (const auto& s : metalEntries) { textDictionary.addText(s.shader); } // Emit dictionary chunk (TextDictionaryReader and DictionaryTextChunk) - const auto& dictionaryChunk = container.addChild( + const auto& dictionaryChunk = container.push( std::move(textDictionary), ChunkType::DictionaryText); // Emit GLSL chunk (MaterialTextChunk). if (!glslEntries.empty()) { - container.addChild(std::move(glslEntries), + container.push(std::move(glslEntries), dictionaryChunk.getDictionary(), ChunkType::MaterialGlsl); } - // Emit SPIRV chunks (SpirvDictionaryReader and MaterialSpirvChunk). -#ifndef FILAMAT_LITE + // Emit ESSL1 chunk (MaterialTextChunk). + if (!essl1Entries.empty()) { + container.push(std::move(essl1Entries), + dictionaryChunk.getDictionary(), ChunkType::MaterialEssl1); + } + + // Emit SPIRV chunks (SpirvDictionaryReader and MaterialBinaryChunk). if (!spirvEntries.empty()) { const bool stripInfo = !mGenerateDebugInfo; - container.addChild(std::move(spirvDictionary), stripInfo); - container.addChild(std::move(spirvEntries)); + container.push(std::move(spirvDictionary), stripInfo); + container.push(std::move(spirvEntries), ChunkType::MaterialSpirv); } // Emit Metal chunk (MaterialTextChunk). if (!metalEntries.empty()) { - container.addChild(std::move(metalEntries), + container.push(std::move(metalEntries), dictionaryChunk.getDictionary(), ChunkType::MaterialMetal); } -#endif return true; } MaterialBuilder& MaterialBuilder::output(VariableQualifier qualifier, OutputTarget target, - OutputType type, const char* name, int location) noexcept { + Precision precision, OutputType type, const char* name, int location) noexcept { + FILAMENT_CHECK_PRECONDITION(target != OutputTarget::DEPTH || type == OutputType::FLOAT) + << "Depth outputs must be of type FLOAT."; + FILAMENT_CHECK_PRECONDITION( + target != OutputTarget::DEPTH || qualifier == VariableQualifier::OUT) + << "Depth outputs must use OUT qualifier."; - ASSERT_PRECONDITION(target != OutputTarget::DEPTH || type == OutputType::FLOAT, - "Depth outputs must be of type FLOAT."); - ASSERT_PRECONDITION(target != OutputTarget::DEPTH || qualifier == VariableQualifier::OUT, - "Depth outputs must use OUT qualifier."); - - ASSERT_PRECONDITION(location >= -1, - "Output location must be >= 0 (or use -1 for default location)."); + FILAMENT_CHECK_PRECONDITION(location >= -1) + << "Output location must be >= 0 (or use -1 for default location)."; // A location value of -1 signals using the default location. We'll simply take the previous // output's location and add 1. @@ -933,7 +1152,7 @@ MaterialBuilder& MaterialBuilder::output(VariableQualifier qualifier, OutputTarg } // Unconditionally add this output, then we'll check if we've maxed on on any particular target. - mOutputs.emplace_back(name, qualifier, target, type, location); + mOutputs.emplace_back(name, qualifier, target, precision, type, location); uint8_t colorOutputCount = 0; uint8_t depthOutputCount = 0; @@ -946,10 +1165,10 @@ MaterialBuilder& MaterialBuilder::output(VariableQualifier qualifier, OutputTarg } } - ASSERT_PRECONDITION(colorOutputCount <= MAX_COLOR_OUTPUT, - "A maximum of %d COLOR outputs is allowed.", MAX_COLOR_OUTPUT); - ASSERT_PRECONDITION(depthOutputCount <= MAX_DEPTH_OUTPUT, - "A maximum of %d DEPTH output is allowed.", MAX_DEPTH_OUTPUT); + FILAMENT_CHECK_PRECONDITION(colorOutputCount <= MAX_COLOR_OUTPUT) + << "A maximum of " << MAX_COLOR_OUTPUT << " COLOR outputs is allowed."; + FILAMENT_CHECK_PRECONDITION(depthOutputCount <= MAX_DEPTH_OUTPUT) + << "A maximum of " << MAX_DEPTH_OUTPUT << " DEPTH output is allowed."; assert(mOutputs.size() <= MAX_COLOR_OUTPUT + MAX_DEPTH_OUTPUT); @@ -982,9 +1201,16 @@ Package MaterialBuilder::build(JobSystem& jobSystem) noexcept { return Package::invalidPackage(); } + // Force post process materials to be unlit. This prevents imposing a lot of extraneous + // data, code, and expectations for materials which do not need them. + if (mMaterialDomain == MaterialDomain::POST_PROCESS) { + mShading = Shading::UNLIT; + } + // Add a default color output. if (mMaterialDomain == MaterialDomain::POST_PROCESS && mOutputs.empty()) { - output(VariableQualifier::OUT, OutputTarget::COLOR, OutputType::FLOAT4, "color"); + output(VariableQualifier::OUT, + OutputTarget::COLOR, Precision::DEFAULT, OutputType::FLOAT4, "color"); } // TODO: maybe check MaterialDomain::COMPUTE has outputs @@ -1013,21 +1239,33 @@ Package MaterialBuilder::build(JobSystem& jobSystem) noexcept { // The call to findProperties populates mProperties and must come before runSemanticAnalysis. // Return an empty package to signal a failure to build the material. -#ifdef FILAMAT_LITE - if (!checkLiteRequirements()) { - goto error; - } -#endif + // For finding properties and running semantic analysis, we always use the same code gen + // permutation. This is the first permutation generated with default arguments passed to matc. + CodeGenParams const semanticCodeGenParams = { + .shaderModel = ShaderModel::MOBILE, + .targetApi = TargetApi::OPENGL, + .targetLanguage = (info.featureLevel == FeatureLevel::FEATURE_LEVEL_0) ? + TargetLanguage::GLSL : TargetLanguage::SPIRV, + .featureLevel = info.featureLevel, + }; - if (!findAllProperties()) { + if (!findAllProperties(semanticCodeGenParams)) { goto error; } - if (!runSemanticAnalysis(info)) { + if (!runSemanticAnalysis(&info, semanticCodeGenParams)) { goto error; } - info.samplerBindings.init(mMaterialDomain, info.sib); + // adjust variant-filter for feature level *before* we start writing into the container + if (mFeatureLevel == filament::backend::FeatureLevel::FEATURE_LEVEL_0) { + // at feature level 0, many variants are not supported + mVariantFilter |= uint32_t(UserVariantFilterBit::DIRECTIONAL_LIGHTING); + mVariantFilter |= uint32_t(UserVariantFilterBit::DYNAMIC_LIGHTING); + mVariantFilter |= uint32_t(UserVariantFilterBit::SHADOW_RECEIVER); + mVariantFilter |= uint32_t(UserVariantFilterBit::VSM); + mVariantFilter |= uint32_t(UserVariantFilterBit::SSR); + } // Create chunk tree. ChunkContainer container; @@ -1091,15 +1329,51 @@ bool MaterialBuilder::checkMaterialLevelFeatures(MaterialInfo const& info) const flush(slog.e); }; - const auto userSamplerCount = info.sib.getSize(); + auto userSamplerCount = info.sib.getSize(); + for (auto const& sampler: info.sib.getSamplerInfoList()) { + if (sampler.type == SamplerInterfaceBlock::Type::SAMPLER_EXTERNAL) { + userSamplerCount += 1; + } + } + switch (info.featureLevel) { + case FeatureLevel::FEATURE_LEVEL_0: + // TODO: check FEATURE_LEVEL_0 features (e.g. unlit only, no texture arrays, etc...) + if (info.isLit) { + slog.e << "Error: material \"" << mMaterialName.c_str() + << "\" has feature level " << +info.featureLevel + << " and is not 'unlit'." << io::endl; + return false; + } + return true; case FeatureLevel::FEATURE_LEVEL_1: case FeatureLevel::FEATURE_LEVEL_2: { + if (mNoSamplerValidation) { + break; + } + + auto const maxTextureCount = backend::FEATURE_LEVEL_CAPS[1].MAX_FRAGMENT_SAMPLER_COUNT; + + // count how many samplers filament uses based on the material properties + // note: currently SSAO is not used with unlit, but we want to keep that possibility. + uint32_t textureUsedByFilamentCount = 4; // shadowMap, structure, ssao, fog texture + if (info.isLit) { + textureUsedByFilamentCount += 3; // froxels, dfg, specular + } + if (info.reflectionMode == ReflectionMode::SCREEN_SPACE || + info.refractionMode == RefractionMode::SCREEN_SPACE) { + textureUsedByFilamentCount += 1; // ssr + } + if (mVariantFilter & (uint32_t)UserVariantFilterBit::FOG) { + textureUsedByFilamentCount -= 1; // fog texture + } + // TODO: we need constants somewhere for these values - if (userSamplerCount > 9) { + if (userSamplerCount > maxTextureCount - textureUsedByFilamentCount) { slog.e << "Error: material \"" << mMaterialName.c_str() << "\" has feature level " << +info.featureLevel - << " and is using more than 9 samplers." << io::endl; + << " and is using more than " << maxTextureCount - textureUsedByFilamentCount + << " samplers." << io::endl; logSamplerOverflow(info.sib); return false; } @@ -1119,10 +1393,11 @@ bool MaterialBuilder::checkMaterialLevelFeatures(MaterialInfo const& info) const } case FeatureLevel::FEATURE_LEVEL_3: { // TODO: we need constants somewhere for these values - if (userSamplerCount > 12) { + // TODO: 16 is artificially low for now, until we have a better idea of what we want + if (userSamplerCount > 16) { slog.e << "Error: material \"" << mMaterialName.c_str() << "\" has feature level " << +info.featureLevel - << " and is using more than 12 samplers" << io::endl; + << " and is using more than 16 samplers" << io::endl; logSamplerOverflow(info.sib); return false; } @@ -1134,7 +1409,7 @@ bool MaterialBuilder::checkMaterialLevelFeatures(MaterialInfo const& info) const bool MaterialBuilder::hasCustomVaryings() const noexcept { for (const auto& variable : mVariables) { - if (!variable.empty()) { + if (!variable.name.empty()) { return true; } } @@ -1154,64 +1429,147 @@ bool MaterialBuilder::needsStandardDepthProgram() const noexcept { std::string MaterialBuilder::peek(backend::ShaderStage stage, const CodeGenParams& params, const PropertyList& properties) noexcept { - ShaderGenerator sg(properties, mVariables, mOutputs, mDefines, + ShaderGenerator sg(properties, mVariables, mOutputs, mDefines, mConstants, mPushConstants, mMaterialFragmentCode.getResolved(), mMaterialFragmentCode.getLineOffset(), mMaterialVertexCode.getResolved(), mMaterialVertexCode.getLineOffset(), mMaterialDomain); MaterialInfo info; prepareToBuild(info); - info.samplerBindings.init(mMaterialDomain, info.sib); switch (stage) { case backend::ShaderStage::VERTEX: return sg.createVertexProgram( params.shaderModel, params.targetApi, params.targetLanguage, - info, {}, mInterpolation, mVertexDomain); + params.featureLevel, info, {}, mInterpolation, mVertexDomain); case backend::ShaderStage::FRAGMENT: return sg.createFragmentProgram( params.shaderModel, params.targetApi, params.targetLanguage, - info, {}, mInterpolation); + params.featureLevel, info, {}, mInterpolation, mVariantFilter); case backend::ShaderStage::COMPUTE: return sg.createComputeProgram( params.shaderModel, params.targetApi, params.targetLanguage, - info, {}); + params.featureLevel, info); + } +} + +static Program::UniformInfo extractUniforms(BufferInterfaceBlock const& uib) noexcept { + auto list = uib.getFieldInfoList(); + Program::UniformInfo uniforms = Program::UniformInfo::with_capacity(list.size()); + + char const firstLetter = std::tolower( uib.getName().at(0) ); + std::string_view const nameAfterFirstLetter{ + uib.getName().data() + 1, uib.getName().size() - 1 }; + + for (auto const& item : list) { + // construct the fully qualified name + std::string qualified; + qualified.reserve(uib.getName().size() + item.name.size() + 1u); + qualified.append({ &firstLetter, 1u }); + qualified.append(nameAfterFirstLetter); + qualified.append("."); + qualified.append({ item.name.data(), item.name.size() }); + + uniforms.push_back({ + { qualified.data(), qualified.size() }, + item.offset, + uint8_t(item.size < 1u ? 1u : item.size), + item.type + }); } + return uniforms; } void MaterialBuilder::writeCommonChunks(ChunkContainer& container, MaterialInfo& info) const noexcept { - container.addSimpleChild(ChunkType::MaterialVersion, MATERIAL_VERSION); - container.addSimpleChild(ChunkType::MaterialFeatureLevel, (uint8_t)mFeatureLevel); - container.addSimpleChild(ChunkType::MaterialName, mMaterialName.c_str_safe()); - container.addSimpleChild(ChunkType::MaterialShaderModels, mShaderModels.getValue()); - container.addSimpleChild(ChunkType::MaterialDomain, static_cast(mMaterialDomain)); + container.emplace(ChunkType::MaterialVersion, MATERIAL_VERSION); + container.emplace(ChunkType::MaterialFeatureLevel, (uint8_t)info.featureLevel); + container.emplace(ChunkType::MaterialName, mMaterialName.c_str_safe()); + container.emplace(ChunkType::MaterialShaderModels, mShaderModels.getValue()); + container.emplace(ChunkType::MaterialDomain, static_cast(mMaterialDomain)); + + // if that ever needed to change, this would require a material version bump + static_assert(sizeof(uint32_t) >= sizeof(UserVariantFilterMask)); + + container.emplace(ChunkType::MaterialVariantFilterMask, mVariantFilter); using namespace filament; - if (info.featureLevel <= FeatureLevel::FEATURE_LEVEL_1) { - // note: this chunk is only needed for OpenGL backends, which don't all support layout(binding=) - FixedCapacityVector> list = { - { PerViewUib::_name, UniformBindingPoints::PER_VIEW }, - { PerRenderableUib::_name, UniformBindingPoints::PER_RENDERABLE }, - { LightsUib::_name, UniformBindingPoints::LIGHTS }, - { ShadowUib::_name, UniformBindingPoints::SHADOW }, - { FroxelRecordUib::_name, UniformBindingPoints::FROXEL_RECORDS }, - { PerRenderableBoneUib::_name, UniformBindingPoints::PER_RENDERABLE_BONES }, - { PerRenderableMorphingUib::_name, UniformBindingPoints::PER_RENDERABLE_MORPHING }, - { info.uib.getName(), UniformBindingPoints::PER_MATERIAL_INSTANCE } - }; - container.addChild(std::move(list)); + if (info.featureLevel == FeatureLevel::FEATURE_LEVEL_0) { + // FIXME: don't hardcode this + FixedCapacityVector> list({ + { 0, "FrameUniforms", extractUniforms(UibGenerator::getPerViewUib()) }, + { 1, "ObjectUniforms", extractUniforms(UibGenerator::getPerRenderableUib()) }, + { 2, "MaterialParams", extractUniforms(info.uib) }, + }); + auto& uniforms = std::get<2>(list[1]); + uniforms.clear(); + uniforms.reserve(6); + uniforms.push_back({ + "objectUniforms.data[0].worldFromModelMatrix", + offsetof(PerRenderableUib, data[0].worldFromModelMatrix), 1, + UniformType::MAT4 }); + uniforms.push_back({ + "objectUniforms.data[0].worldFromModelNormalMatrix", + offsetof(PerRenderableUib, data[0].worldFromModelNormalMatrix), 1, + UniformType::MAT3 }); + uniforms.push_back({ + "objectUniforms.data[0].morphTargetCount", + offsetof(PerRenderableUib, data[0].morphTargetCount), 1, + UniformType::INT }); + uniforms.push_back({ + "objectUniforms.data[0].flagsChannels", + offsetof(PerRenderableUib, data[0].flagsChannels), 1, + UniformType::INT }); + uniforms.push_back({ + "objectUniforms.data[0].objectId", + offsetof(PerRenderableUib, data[0].objectId), 1, + UniformType::INT }); + uniforms.push_back({ + "objectUniforms.data[0].userData", + offsetof(PerRenderableUib, data[0].userData), 1, + UniformType::FLOAT }); + + container.push(std::move(list)); + + using Container = utils::FixedCapacityVector>; + auto attributes = Container::with_capacity(sAttributeDatabase.size()); + for (auto const& attribute: sAttributeDatabase) { + std::string name("mesh_"); + name.append(attribute.name); + attributes.emplace_back(utils::CString{ name.data(), name.size() }, attribute.location); + } + container.push(std::move(attributes)); } - // note: this chunk is needed for Vulkan and GL backends. Metal shouldn't need it (but - // still does as of now). - container.addChild(info.samplerBindings); + // User parameters (UBO) + container.push(info.uib); + + // User texture parameters + container.push(info.sib); - // User Material UIB - container.addChild(info.uib); - // User Material SIB - container.addChild(info.sib); + backend::DescriptorSetLayout const perViewDescriptorSetLayout = + descriptor_sets::getPerViewDescriptorSetLayout( + mMaterialDomain, mVariantFilter, + info.isLit || info.hasShadowMultiplier, info.reflectionMode, info.refractionMode); + + // Descriptor layout and descriptor name/binding mapping + container.push(info.sib, perViewDescriptorSetLayout); + container.push(info.sib, perViewDescriptorSetLayout); + + // User constant parameters + utils::FixedCapacityVector constantsEntry(mConstants.size()); + std::transform(mConstants.begin(), mConstants.end(), constantsEntry.begin(), + [](Constant const& c) { return MaterialConstant(c.name.c_str(), c.type); }); + container.push(std::move(constantsEntry)); + + utils::FixedCapacityVector pushConstantsEntry(mPushConstants.size()); + std::transform(mPushConstants.begin(), mPushConstants.end(), pushConstantsEntry.begin(), + [](PushConstant const& c) { + return MaterialPushConstant(c.name.c_str(), c.type, c.stage); + }); + container.push( + utils::CString(PUSH_CONSTANT_STRUCT_VAR_NAME), std::move(pushConstantsEntry)); // TODO: should we write the SSBO info? this would only be needed if we wanted to provide // an interface to set [get?] values in the buffer. But we can do that easily @@ -1219,19 +1577,35 @@ void MaterialBuilder::writeCommonChunks(ChunkContainer& container, MaterialInfo& if (mMaterialDomain != MaterialDomain::COMPUTE) { // User Subpass - container.addChild(info.subpass); - - container.addSimpleChild(ChunkType::MaterialDoubleSidedSet, mDoubleSidedCapability); - container.addSimpleChild(ChunkType::MaterialDoubleSided, mDoubleSided); - container.addSimpleChild(ChunkType::MaterialBlendingMode, static_cast(mBlendingMode)); - container.addSimpleChild(ChunkType::MaterialTransparencyMode, static_cast(mTransparencyMode)); - container.addSimpleChild(ChunkType::MaterialReflectionMode, static_cast(mReflectionMode)); - container.addSimpleChild(ChunkType::MaterialDepthWriteSet, mDepthWriteSet); - container.addSimpleChild(ChunkType::MaterialColorWrite, mColorWrite); - container.addSimpleChild(ChunkType::MaterialDepthWrite, mDepthWrite); - container.addSimpleChild(ChunkType::MaterialDepthTest, mDepthTest); - container.addSimpleChild(ChunkType::MaterialInstanced, mInstanced); - container.addSimpleChild(ChunkType::MaterialCullingMode, static_cast(mCullingMode)); + container.push(info.subpass); + + container.emplace(ChunkType::MaterialDoubleSidedSet, mDoubleSidedCapability); + container.emplace(ChunkType::MaterialDoubleSided, mDoubleSided); + container.emplace(ChunkType::MaterialBlendingMode, + static_cast(mBlendingMode)); + + if (mBlendingMode == BlendingMode::CUSTOM) { + uint32_t const blendFunctions = + (uint32_t(mCustomBlendFunctions[0]) << 24) | + (uint32_t(mCustomBlendFunctions[1]) << 16) | + (uint32_t(mCustomBlendFunctions[2]) << 8) | + (uint32_t(mCustomBlendFunctions[3]) << 0); + container.emplace< uint32_t >(ChunkType::MaterialBlendFunction, blendFunctions); + } + + container.emplace(ChunkType::MaterialTransparencyMode, + static_cast(mTransparencyMode)); + container.emplace(ChunkType::MaterialReflectionMode, + static_cast(mReflectionMode)); + container.emplace(ChunkType::MaterialColorWrite, mColorWrite); + container.emplace(ChunkType::MaterialDepthWriteSet, mDepthWriteSet); + container.emplace(ChunkType::MaterialDepthWrite, mDepthWrite); + container.emplace(ChunkType::MaterialDepthTest, mDepthTest); + container.emplace(ChunkType::MaterialInstanced, mInstanced); + container.emplace(ChunkType::MaterialAlphaToCoverageSet, mAlphaToCoverageSet); + container.emplace(ChunkType::MaterialAlphaToCoverage, mAlphaToCoverage); + container.emplace(ChunkType::MaterialCullingMode, + static_cast(mCullingMode)); uint64_t properties = 0; UTILS_NOUNROLL @@ -1240,30 +1614,58 @@ void MaterialBuilder::writeCommonChunks(ChunkContainer& container, MaterialInfo& properties |= uint64_t(1u) << i; } } - container.addSimpleChild(ChunkType::MaterialProperties, properties); + container.emplace(ChunkType::MaterialProperties, properties); + container.emplace(ChunkType::MaterialStereoscopicType, static_cast(mStereoscopicType)); } + + // create a unique material id + auto const& vert = mMaterialVertexCode.getResolved(); + auto const& frag = mMaterialFragmentCode.getResolved(); + std::hash const hasher; + size_t const materialId = utils::hash::combine( + MATERIAL_VERSION, + utils::hash::combine( + hasher({ vert.data(), vert.size() }), + hasher({ frag.data(), frag.size() }))); + + container.emplace(ChunkType::MaterialCacheId, materialId); } void MaterialBuilder::writeSurfaceChunks(ChunkContainer& container) const noexcept { if (mBlendingMode == BlendingMode::MASKED) { - container.addSimpleChild(ChunkType::MaterialMaskThreshold, mMaskThreshold); + container.emplace(ChunkType::MaterialMaskThreshold, mMaskThreshold); } - container.addSimpleChild(ChunkType::MaterialShading, static_cast(mShading)); + container.emplace(ChunkType::MaterialShading, static_cast(mShading)); if (mShading == Shading::UNLIT) { - container.addSimpleChild(ChunkType::MaterialShadowMultiplier, mShadowMultiplier); + container.emplace(ChunkType::MaterialShadowMultiplier, mShadowMultiplier); } - container.addSimpleChild(ChunkType::MaterialRefraction, static_cast(mRefractionMode)); - container.addSimpleChild(ChunkType::MaterialRefractionType, static_cast(mRefractionType)); - container.addSimpleChild(ChunkType::MaterialClearCoatIorChange, mClearCoatIorChange); - container.addSimpleChild(ChunkType::MaterialRequiredAttributes, mRequiredAttributes.getValue()); - container.addSimpleChild(ChunkType::MaterialSpecularAntiAliasing, mSpecularAntiAliasing); - container.addSimpleChild(ChunkType::MaterialSpecularAntiAliasingVariance, mSpecularAntiAliasingVariance); - container.addSimpleChild(ChunkType::MaterialSpecularAntiAliasingThreshold, mSpecularAntiAliasingThreshold); - container.addSimpleChild(ChunkType::MaterialVertexDomain, static_cast(mVertexDomain)); - container.addSimpleChild(ChunkType::MaterialInterpolation, static_cast(mInterpolation)); + container.emplace(ChunkType::MaterialRefraction, static_cast(mRefractionMode)); + container.emplace(ChunkType::MaterialRefractionType, + static_cast(mRefractionType)); + container.emplace(ChunkType::MaterialClearCoatIorChange, mClearCoatIorChange); + container.emplace(ChunkType::MaterialRequiredAttributes, + mRequiredAttributes.getValue()); + container.emplace(ChunkType::MaterialSpecularAntiAliasing, mSpecularAntiAliasing); + container.emplace(ChunkType::MaterialSpecularAntiAliasingVariance, + mSpecularAntiAliasingVariance); + container.emplace(ChunkType::MaterialSpecularAntiAliasingThreshold, + mSpecularAntiAliasingThreshold); + container.emplace(ChunkType::MaterialVertexDomain, static_cast(mVertexDomain)); + container.emplace(ChunkType::MaterialInterpolation, + static_cast(mInterpolation)); +} + +MaterialBuilder& MaterialBuilder::noSamplerValidation(bool enabled) noexcept { + mNoSamplerValidation = enabled; + return *this; +} + +MaterialBuilder& MaterialBuilder::includeEssl1(bool enabled) noexcept { + mIncludeEssl1 = enabled; + return *this; } } // namespace filamat diff --git a/libs/filamat/src/MaterialVariants.cpp b/libs/filamat/src/MaterialVariants.cpp index a30420bd746..b6ce7ccd745 100644 --- a/libs/filamat/src/MaterialVariants.cpp +++ b/libs/filamat/src/MaterialVariants.cpp @@ -16,15 +16,32 @@ #include "MaterialVariants.h" +#include "shaders/ShaderGenerator.h" + #include +#include + +#include + +#include + +#include +#include +#include + +#include +#include + +#include +#include namespace filamat { std::vector determineSurfaceVariants( filament::UserVariantFilterMask userVariantFilter, bool isLit, bool shadowMultiplier) { std::vector variants; - for (filament::Variant::type_t k = 0; k < filament::VARIANT_COUNT; k++) { - filament::Variant variant(k); + for (size_t k = 0; k < filament::VARIANT_COUNT; k++) { + filament::Variant const variant(k); if (filament::Variant::isReserved(variant)) { continue; } @@ -36,13 +53,67 @@ std::vector determineSurfaceVariants( filteredVariant = filament::Variant::filterVariant( filteredVariant, isLit || shadowMultiplier); - if (filament::Variant::filterVariantVertex(filteredVariant) == variant) { + auto const vertexVariant = filament::Variant::filterVariantVertex(filteredVariant); + if (vertexVariant == variant) { variants.emplace_back(variant, filament::backend::ShaderStage::VERTEX); } - if (filament::Variant::filterVariantFragment(filteredVariant) == variant) { + auto const fragmentVariant = filament::Variant::filterVariantFragment(filteredVariant); + if (fragmentVariant == variant) { variants.emplace_back(variant, filament::backend::ShaderStage::FRAGMENT); } + + // Here we make sure that the combination of vertex and fragment variants have compatible + // PER_VIEW descriptor-set layouts. This could actually be a static/compile-time check + // because it is entirely decided in DescriptorSets.cpp. Unfortunately it's not possible + // to write this entirely as a constexpr. + + if (UTILS_UNLIKELY(vertexVariant != fragmentVariant)) { + // fragment and vertex variants are different, we need to check the layouts are + // compatible. + using filament::ReflectionMode; + using filament::RefractionMode; + using filament::backend::ShaderStage; + + // And we need to do that for all configurations of the "PER_VIEW" descriptor set + // layouts (there are eight). + // See ShaderGenerator::getPerViewDescriptorSetLayoutWithVariant. + for (auto reflection: { + ReflectionMode::SCREEN_SPACE, + ReflectionMode::DEFAULT }) { + for (auto refraction: { + RefractionMode::SCREEN_SPACE, + RefractionMode::CUBEMAP, + RefractionMode::NONE }) { + auto const vdsl = ShaderGenerator::getPerViewDescriptorSetLayoutWithVariant( + vertexVariant, userVariantFilter, isLit || shadowMultiplier, + reflection, refraction); + auto const fdsl = ShaderGenerator::getPerViewDescriptorSetLayoutWithVariant( + fragmentVariant, userVariantFilter, isLit || shadowMultiplier, + reflection, refraction); + // Check that all bindings present in the vertex shader DescriptorSetLayout + // are also present in the fragment shader DescriptorSetLayout. + for (auto const& r: vdsl.bindings) { + if (!hasShaderType(r.stageFlags, ShaderStage::VERTEX)) { + // ignore descriptors that are of the fragment stage only + continue; + } + auto const pos = std::find_if(fdsl.bindings.begin(), fdsl.bindings.end(), + [r](auto const& l) { + return l.count == r.count && l.type == r.type && + l.binding == r.binding && l.flags == r.flags && + l.stageFlags == r.stageFlags; + }); + + // A mismatch is fatal. The material is ill-formed. This typically + // mean a bug / inconsistency in DescriptorsSets.cpp + FILAMENT_CHECK_POSTCONDITION(pos != fdsl.bindings.end()) + << "Variant " << +k << " has mismatched descriptorset layouts"; + } + } + } + } + } return variants; } @@ -52,7 +123,7 @@ std::vector determinePostProcessVariants() { // TODO: add a way to filter out post-process variants (e.g., the transparent variant if only // opaque is needed) for (filament::Variant::type_t k = 0; k < filament::POST_PROCESS_VARIANT_COUNT; k++) { - filament::Variant variant(k); + filament::Variant const variant(k); variants.emplace_back(variant, filament::backend::ShaderStage::VERTEX); variants.emplace_back(variant, filament::backend::ShaderStage::FRAGMENT); } diff --git a/libs/filamat/src/MetalArgumentBuffer.cpp b/libs/filamat/src/MetalArgumentBuffer.cpp index 436680ae295..ffe1aa1568d 100644 --- a/libs/filamat/src/MetalArgumentBuffer.cpp +++ b/libs/filamat/src/MetalArgumentBuffer.cpp @@ -18,6 +18,7 @@ #include #include +#include namespace filamat { @@ -29,11 +30,20 @@ MetalArgumentBuffer::Builder& filamat::MetalArgumentBuffer::Builder::name( MetalArgumentBuffer::Builder& MetalArgumentBuffer::Builder::texture(size_t index, const std::string& name, filament::backend::SamplerType type, - filament::backend::SamplerFormat format) noexcept { + filament::backend::SamplerFormat format, + bool multisample) noexcept { + + using namespace filament::backend; + // All combinations of SamplerType and SamplerFormat are valid except for SAMPLER_3D / SHADOW. - assert_invariant(type != filament::backend::SamplerType::SAMPLER_3D || - format != filament::backend::SamplerFormat::SHADOW); - mArguments.emplace_back(TextureArgument { name, index, type, format }); + assert_invariant(type != SamplerType::SAMPLER_3D || format != SamplerFormat::SHADOW); + + // multisample textures have restrictions too + assert_invariant(!multisample || ( + format != SamplerFormat::SHADOW && ( + type == SamplerType::SAMPLER_2D || type == SamplerType::SAMPLER_2D_ARRAY))); + + mArguments.emplace_back(TextureArgument { name, index, type, format, multisample }); return *this; } @@ -43,6 +53,12 @@ MetalArgumentBuffer::Builder& MetalArgumentBuffer::Builder::sampler( return *this; } +MetalArgumentBuffer::Builder& MetalArgumentBuffer::Builder::buffer( + size_t index, const std::string& type, const std::string& name) noexcept { + mArguments.emplace_back(BufferArgument { name, index, type }); + return *this; +} + MetalArgumentBuffer* MetalArgumentBuffer::Builder::build() { assert_invariant(!mName.empty()); return new MetalArgumentBuffer(*this); @@ -79,6 +95,10 @@ std::ostream& MetalArgumentBuffer::Builder::TextureArgument::write(std::ostream& break; } + if (multisample) { + os << "_ms"; + } + switch (format) { case filament::backend::SamplerFormat::INT: os << ""; @@ -101,12 +121,14 @@ std::ostream& MetalArgumentBuffer::Builder::SamplerArgument::write(std::ostream& return os; } +std::ostream& MetalArgumentBuffer::Builder::BufferArgument::write(std::ostream& os) const { + os << "constant " << type << "* " << name << " [[id(" << index << ")]];" << std::endl; + return os; +} + MetalArgumentBuffer::MetalArgumentBuffer(Builder& builder) { mName = builder.mName; - std::stringstream ss; - ss << "struct " << mName << " {" << std::endl; - auto& args = builder.mArguments; // Sort the arguments by index. @@ -121,6 +143,18 @@ MetalArgumentBuffer::MetalArgumentBuffer(Builder& builder) { [](auto const& x, auto const& y) { return x.index == y.index; }, lhs, rhs); }) == args.end()); + std::stringstream ss; + + // Add forward declarations of buffers. + for (const auto& a : builder.mArguments) { + if (std::holds_alternative(a)) { + const auto& bufferArg = std::get(a); + ss << "struct " << bufferArg.type << ";" << std::endl; + } + } + + ss << "struct " << mName << " {" << std::endl; + for (const auto& a : builder.mArguments) { std::visit([&](auto&& arg) { arg.write(ss); diff --git a/libs/filamat/src/MetalArgumentBuffer.h b/libs/filamat/src/MetalArgumentBuffer.h index f04d9e059d7..75f4d1a3fc3 100644 --- a/libs/filamat/src/MetalArgumentBuffer.h +++ b/libs/filamat/src/MetalArgumentBuffer.h @@ -48,7 +48,8 @@ class MetalArgumentBuffer { */ Builder& texture(size_t index, const std::string& name, filament::backend::SamplerType type, - filament::backend::SamplerFormat format) noexcept; + filament::backend::SamplerFormat format, + bool multisample) noexcept; /** * Add a sampler argument to the argument buffer structure. @@ -57,6 +58,14 @@ class MetalArgumentBuffer { */ Builder& sampler(size_t index, const std::string& name) noexcept; + /** + * Add a buffer argument to the argument buffer structure. + * @param index the [[id(n)]] index of the buffer argument + * @param type the type of data the buffer points to + * @param name the name of the buffer argument + */ + Builder& buffer(size_t index, const std::string& type, const std::string& name) noexcept; + MetalArgumentBuffer* build(); friend class MetalArgumentBuffer; @@ -69,6 +78,7 @@ class MetalArgumentBuffer { size_t index; filament::backend::SamplerType type; filament::backend::SamplerFormat format; + bool multisample; std::ostream& write(std::ostream& os) const; }; @@ -80,7 +90,15 @@ class MetalArgumentBuffer { std::ostream& write(std::ostream& os) const; }; - using ArgumentType = std::variant; + struct BufferArgument { + std::string name; + size_t index; + std::string type; + + std::ostream& write(std::ostream& os) const; + }; + + using ArgumentType = std::variant; std::vector mArguments; }; diff --git a/libs/filamat/src/PushConstantDefinitions.h b/libs/filamat/src/PushConstantDefinitions.h new file mode 100644 index 00000000000..244326969cd --- /dev/null +++ b/libs/filamat/src/PushConstantDefinitions.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMAT_PUSH_CONSTANT_DEFINTITIONS_H +#define TNT_FILAMAT_PUSH_CONSTANT_DEFINTITIONS_H + +#include +#include + +#include + +#include + +namespace filamat { + +constexpr char PUSH_CONSTANT_STRUCT_VAR_NAME[] = "pushConstants"; + +utils::FixedCapacityVector const PUSH_CONSTANTS = { + { + "morphingBufferOffset", + filament::backend::ConstantType::INT, + filament::backend::ShaderStage::VERTEX, + }, +}; + +// Make sure that the indices defined in filabridge match the actual array indices defined here. +static_assert(static_cast(filament::PushConstantIds::MORPHING_BUFFER_OFFSET) == 0u); + +}// namespace filamat + +#endif diff --git a/libs/filamat/src/SamplerBindingMap.cpp b/libs/filamat/src/SamplerBindingMap.cpp index 6a36e77fa10..e69de29bb2d 100644 --- a/libs/filamat/src/SamplerBindingMap.cpp +++ b/libs/filamat/src/SamplerBindingMap.cpp @@ -1,105 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "SamplerBindingMap.h" - -#include "SibGenerator.h" - -#include - -#include - -#include - -namespace filament { - -using namespace utils; -using namespace backend; - -void SamplerBindingMap::init(MaterialDomain materialDomain, - SamplerInterfaceBlock const& perMaterialSib) { - - assert_invariant(mActiveSamplerCount == 0); - - mSamplerNamesBindingMap.reserve(MAX_SAMPLER_COUNT); - mSamplerNamesBindingMap.resize(MAX_SAMPLER_COUNT); - - // Note: the material variant affects only the sampler types, but cannot affect - // the actual bindings. For this reason it is okay to use the dummyVariant here. - uint8_t offset = 0; - size_t vertexSamplerCount = 0; - size_t fragmentSamplerCount = 0; - - auto processSamplerGroup = [&](SamplerBindingPoints bindingPoint){ - SamplerInterfaceBlock const* const sib = - (bindingPoint == SamplerBindingPoints::PER_MATERIAL_INSTANCE) ? - &perMaterialSib : SibGenerator::getSib(bindingPoint, {}); - if (sib) { - const auto stageFlags = sib->getStageFlags(); - auto const& list = sib->getSamplerInfoList(); - const size_t samplerCount = list.size(); - - if (any(stageFlags & ShaderStageFlags::VERTEX)) { - vertexSamplerCount += samplerCount; - } - if (any(stageFlags & ShaderStageFlags::FRAGMENT)) { - fragmentSamplerCount += samplerCount; - } - - mSamplerBlockOffsets[+bindingPoint] = { offset, stageFlags, uint8_t(samplerCount) }; - for (size_t i = 0; i < samplerCount; i++) { - assert_invariant(mSamplerNamesBindingMap[offset + i].empty()); - mSamplerNamesBindingMap[offset + i] = list[i].uniformName; - } - - offset += samplerCount; - } - }; - - switch(materialDomain) { - case MaterialDomain::SURFACE: - UTILS_NOUNROLL - for (size_t i = 0; i < Enum::count(); i++) { - processSamplerGroup((SamplerBindingPoints)i); - } - break; - case MaterialDomain::POST_PROCESS: - case MaterialDomain::COMPUTE: - processSamplerGroup(SamplerBindingPoints::PER_MATERIAL_INSTANCE); - break; - } - - mActiveSamplerCount = offset; - - // we shouldn't be using more total samplers than supported - assert_invariant(vertexSamplerCount + fragmentSamplerCount <= MAX_SAMPLER_COUNT); - - // Here we cannot check for overflow for a given feature level because we don't know - // what feature level the backend will support. We only know the feature level declared - // by the material. However, we can at least assert for the highest feature level. - - constexpr size_t MAX_VERTEX_SAMPLER_COUNT = - backend::FEATURE_LEVEL_CAPS[+FeatureLevel::FEATURE_LEVEL_3].MAX_VERTEX_SAMPLER_COUNT; - - assert_invariant(vertexSamplerCount <= MAX_VERTEX_SAMPLER_COUNT); - - constexpr size_t MAX_FRAGMENT_SAMPLER_COUNT = - backend::FEATURE_LEVEL_CAPS[+FeatureLevel::FEATURE_LEVEL_3].MAX_FRAGMENT_SAMPLER_COUNT; - - assert_invariant(fragmentSamplerCount <= MAX_FRAGMENT_SAMPLER_COUNT); -} - -} // namespace filament diff --git a/libs/filamat/src/SamplerBindingMap.h b/libs/filamat/src/SamplerBindingMap.h index d76078138d6..e69de29bb2d 100644 --- a/libs/filamat/src/SamplerBindingMap.h +++ b/libs/filamat/src/SamplerBindingMap.h @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef TNT_FILAMENT_DRIVER_SAMPLERBINDINGMAP_H -#define TNT_FILAMENT_DRIVER_SAMPLERBINDINGMAP_H - -#include - -#include - -namespace filament { - -class SamplerInterfaceBlock; - -/* - * SamplerBindingMap maps filament's (BindingPoints, offset) to a global offset. - * This global offset is used in shaders to set the `layout(binding=` of each sampler. - * - * It also keeps a map of global offsets to the sampler name in the shader. - * - * SamplerBindingMap is flattened into the material file and used on the filament side to - * create the backend's programs. - */ -class SamplerBindingMap { -public: - - using SamplerGroupBindingInfo = SamplerGroupBindingInfo; - - // Initializes the SamplerBindingMap. - // Assigns a range of finalized binding points to each sampler block. - // If a per-material SIB is provided, then material samplers are also inserted (always at the - // end). - void init(MaterialDomain materialDomain, - SamplerInterfaceBlock const& perMaterialSib); - - SamplerGroupBindingInfo const& getSamplerGroupBindingInfo( - SamplerBindingPoints bindingPoint) const noexcept { - return mSamplerBlockOffsets[+bindingPoint]; - } - - // Gets the global offset of the first sampler in the given sampler block. - inline uint8_t getBlockOffset(SamplerBindingPoints bindingPoint) const noexcept { - assert_invariant(mSamplerBlockOffsets[+bindingPoint].bindingOffset != UNKNOWN_OFFSET); - return getSamplerGroupBindingInfo(bindingPoint).bindingOffset; - } - - size_t getActiveSamplerCount() const noexcept { - return mActiveSamplerCount; - } - - utils::CString const& getSamplerName(size_t binding) const noexcept { - return mSamplerNamesBindingMap[binding]; - } - -private: - constexpr static uint8_t UNKNOWN_OFFSET = SamplerGroupBindingInfo::UNKNOWN_OFFSET; - SamplerGroupBindingInfoList mSamplerBlockOffsets{}; - SamplerBindingToNameMap mSamplerNamesBindingMap{}; - uint8_t mActiveSamplerCount = 0; -}; - -} // namespace filament - -#endif // TNT_FILAMENT_DRIVER_SAMPLERBINDINGMAP_H diff --git a/libs/filamat/src/ShaderMinifier.cpp b/libs/filamat/src/ShaderMinifier.cpp index 7097bd2e2e7..d60d5dcad3e 100644 --- a/libs/filamat/src/ShaderMinifier.cpp +++ b/libs/filamat/src/ShaderMinifier.cpp @@ -137,7 +137,7 @@ namespace { * - Remove leading white spaces at the beginning of each line * - Remove empty lines */ -std::string ShaderMinifier::removeWhitespace(const std::string& s) const { +std::string ShaderMinifier::removeWhitespace(const std::string& s, bool mergeBraces) const { size_t cur = 0; std::string r; @@ -155,7 +155,13 @@ std::string ShaderMinifier::removeWhitespace(const std::string& s) const { size_t newPos = s.find_first_not_of(" \t", pos); if (newPos == std::string::npos) newPos = pos; - r.append(s, newPos, len - (newPos - pos)); + // If we have a single { or } on a line, move it to the previous line instead + size_t subLen = len - (newPos - pos); + if (mergeBraces && subLen == 1 && (s[newPos] == '{' || s[newPos] == '}')) { + r.replace(r.size() - 1, 1, 1, s[newPos]); + } else { + r.append(s, newPos, subLen); + } r += '\n'; while (s[cur] == '\n') { diff --git a/libs/filamat/src/ShaderMinifier.h b/libs/filamat/src/ShaderMinifier.h index 737b73c214a..56860414b17 100644 --- a/libs/filamat/src/ShaderMinifier.h +++ b/libs/filamat/src/ShaderMinifier.h @@ -30,7 +30,7 @@ namespace filamat { // This custom minifier is designed for generated code such as uniform structs. class ShaderMinifier { public: - std::string removeWhitespace(const std::string& source) const; + std::string removeWhitespace(const std::string& source, bool mergeBraces = false) const; std::string renameStructFields(const std::string& source); private: diff --git a/libs/filamat/src/SibGenerator.cpp b/libs/filamat/src/SibGenerator.cpp deleted file mode 100644 index b780599296e..00000000000 --- a/libs/filamat/src/SibGenerator.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "SibGenerator.h" - -#include "private/filament/Variant.h" -#include "private/filament/EngineEnums.h" -#include "private/filament/SamplerInterfaceBlock.h" -#include "private/filament/SibStructs.h" - -namespace filament { - -SamplerInterfaceBlock const& SibGenerator::getPerViewSib(Variant variant) noexcept { - using Type = SamplerInterfaceBlock::Type; - using Format = SamplerInterfaceBlock::Format; - using Precision = SamplerInterfaceBlock::Precision; - - static SamplerInterfaceBlock sibPcf = SamplerInterfaceBlock::Builder() - .name("Light") - .stageFlags(backend::ShaderStageFlags::FRAGMENT) - .add( {{ "shadowMap", Type::SAMPLER_2D_ARRAY, Format::SHADOW, Precision::MEDIUM }, - { "froxels", Type::SAMPLER_2D, Format::UINT, Precision::MEDIUM }, - { "iblDFG", Type::SAMPLER_2D, Format::FLOAT, Precision::MEDIUM }, - { "iblSpecular", Type::SAMPLER_CUBEMAP, Format::FLOAT, Precision::MEDIUM }, - { "ssao", Type::SAMPLER_2D_ARRAY, Format::FLOAT, Precision::MEDIUM }, - { "ssr", Type::SAMPLER_2D_ARRAY, Format::FLOAT, Precision::MEDIUM }, - { "structure", Type::SAMPLER_2D, Format::FLOAT, Precision::HIGH }} - ) - .build(); - - static SamplerInterfaceBlock sibVsm = SamplerInterfaceBlock::Builder() - .name("Light") - .stageFlags(backend::ShaderStageFlags::FRAGMENT) - .add( {{ "shadowMap", Type::SAMPLER_2D_ARRAY, Format::FLOAT, Precision::HIGH }, - { "froxels", Type::SAMPLER_2D, Format::UINT, Precision::MEDIUM }, - { "iblDFG", Type::SAMPLER_2D, Format::FLOAT, Precision::MEDIUM }, - { "iblSpecular", Type::SAMPLER_CUBEMAP, Format::FLOAT, Precision::MEDIUM }, - { "ssao", Type::SAMPLER_2D_ARRAY, Format::FLOAT, Precision::MEDIUM }, - { "ssr", Type::SAMPLER_2D_ARRAY, Format::FLOAT, Precision::MEDIUM }, - { "structure", Type::SAMPLER_2D, Format::FLOAT, Precision::HIGH }} - ) - .build(); - - static SamplerInterfaceBlock sibSsr = SamplerInterfaceBlock::Builder() - .name("Light") - .stageFlags(backend::ShaderStageFlags::FRAGMENT) - .add( {{ "shadowMap", Type::SAMPLER_2D_ARRAY, Format::SHADOW, Precision::MEDIUM }, - { "froxels", Type::SAMPLER_2D, Format::UINT, Precision::MEDIUM }, - { "iblDFG", Type::SAMPLER_2D, Format::FLOAT, Precision::MEDIUM }, - { "iblSpecular", Type::SAMPLER_CUBEMAP, Format::FLOAT, Precision::MEDIUM }, - { "ssao", Type::SAMPLER_2D_ARRAY, Format::FLOAT, Precision::MEDIUM }, - { "ssr", Type::SAMPLER_2D, Format::FLOAT, Precision::MEDIUM }, - { "structure", Type::SAMPLER_2D, Format::FLOAT, Precision::HIGH }} - ) - .build(); - - // SamplerBindingMap relies on the assumption that Sibs have the same names and offsets - // regardless of variant. - assert(sibPcf.getSize() == PerViewSib::SAMPLER_COUNT); - assert(sibVsm.getSize() == PerViewSib::SAMPLER_COUNT); - assert(sibSsr.getSize() == PerViewSib::SAMPLER_COUNT); - - if (Variant::isSSRVariant(variant)) { - return sibSsr; - } else if (Variant::isVSMVariant(variant)) { - return sibVsm; - } else { - return sibPcf; - } -} - -SamplerInterfaceBlock const& SibGenerator::getPerRenderPrimitiveMorphingSib(Variant variant) noexcept { - using Type = SamplerInterfaceBlock::Type; - using Format = SamplerInterfaceBlock::Format; - using Precision = SamplerInterfaceBlock::Precision; - - static SamplerInterfaceBlock sib = SamplerInterfaceBlock::Builder() - .name("MorphTargetBuffer") - .stageFlags(backend::ShaderStageFlags::VERTEX) - .add({ { "positions", Type::SAMPLER_2D_ARRAY, Format::FLOAT, Precision::HIGH }, - { "tangents", Type::SAMPLER_2D_ARRAY, Format::INT, Precision::HIGH }}) - .build(); - - return sib; -} - -SamplerInterfaceBlock const* SibGenerator::getSib(SamplerBindingPoints bindingPoint, Variant variant) noexcept { - switch (bindingPoint) { - case SamplerBindingPoints::PER_VIEW: - return &getPerViewSib(variant); - case SamplerBindingPoints::PER_RENDERABLE_MORPHING: - return &getPerRenderPrimitiveMorphingSib(variant); - default: - return nullptr; - } -} - -} // namespace filament diff --git a/libs/filamat/src/SpirvFixup.cpp b/libs/filamat/src/SpirvFixup.cpp new file mode 100644 index 00000000000..8680a3ccb86 --- /dev/null +++ b/libs/filamat/src/SpirvFixup.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SpirvFixup.h" + +namespace filamat { + +bool fixupClipDistance(std::string& spirvDisassembly) { + size_t p = spirvDisassembly.find("OpDecorate %filament_gl_ClipDistance Location"); + if (p == std::string::npos) { + return false; + } + size_t lineEnd = spirvDisassembly.find('\n', p); + if (lineEnd == std::string::npos) { + lineEnd = spirvDisassembly.size(); + } + spirvDisassembly.replace(p, lineEnd - p, + "OpDecorate %filament_gl_ClipDistance BuiltIn ClipDistance"); + return true; +} + +} // namespace filamat diff --git a/libs/filamat/src/SpirvFixup.h b/libs/filamat/src/SpirvFixup.h new file mode 100644 index 00000000000..74c4bde0356 --- /dev/null +++ b/libs/filamat/src/SpirvFixup.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_SPIRVFIXUP_H +#define TNT_SPIRVFIXUP_H + +#include + +namespace filamat { + +/** + * Performs a "fixup" operation on SPIR-V disassembly text, decorating the filament_gl_ClipDistance + * output as the canonical gl_ClipDistance built-in. + * + * glslang does not support the EXT_clip_cull_distance extension. Writing directly to + * gl_ClipDistance results in an error. + * + * To get around this, an ES shader should write instead to filament_gl_ClipDistance. After + * compiling to SPIR-V, this function will modify the SPIR_V disassembly and decorate + * filament_gl_ClipDistance as if it were gl_ClipDistance. + * + * For example, the source GLSL: + * ~~~~~~~~~~ + * #version 310 es + * + * // The location is required but does not matter and will be replaced. + * layout(location = 100) out float filament_gl_ClipDistance[1]; + * + * void main() { + * filament_gl_ClipDistance[0] = 0.0f; + * } + * ~~~~~~~~~~ + * + * This should only be used in SPIR-V generated for an ES environment. + * + * @param spirvDisassembly a reference to the SPIR-V disassembly, will be modified + * @return true if the replacement was successful, false otherwise + */ +bool fixupClipDistance(std::string& spirvDisassembly); + +} + +#endif // TNT_SPIRVFIXUP_H diff --git a/libs/filamat/src/UibGenerator.cpp b/libs/filamat/src/UibGenerator.cpp deleted file mode 100644 index bac835d17c2..00000000000 --- a/libs/filamat/src/UibGenerator.cpp +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "UibGenerator.h" -#include "private/filament/UibStructs.h" - -#include "private/filament/BufferInterfaceBlock.h" - -#include -#include - -namespace filament { - -using namespace backend; - -static_assert(CONFIG_MAX_SHADOW_CASCADES == 4, - "Changing CONFIG_MAX_SHADOW_CASCADES affects PerView size and breaks materials."); - -BufferInterfaceBlock const& UibGenerator::getPerViewUib() noexcept { - using Type = BufferInterfaceBlock::Type; - - static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder() - .name(PerViewUib::_name) - .add({ - { "viewFromWorldMatrix", 0, Type::MAT4, Precision::HIGH }, - { "worldFromViewMatrix", 0, Type::MAT4, Precision::HIGH }, - { "clipFromViewMatrix", 0, Type::MAT4, Precision::HIGH }, - { "viewFromClipMatrix", 0, Type::MAT4, Precision::HIGH }, - { "clipFromWorldMatrix", 0, Type::MAT4, Precision::HIGH }, - { "worldFromClipMatrix", 0, Type::MAT4, Precision::HIGH }, - { "clipTransform", 0, Type::FLOAT4, Precision::HIGH }, - - { "clipControl", 0, Type::FLOAT2 }, - { "time", 0, Type::FLOAT, Precision::HIGH }, - { "temporalNoise", 0, Type::FLOAT, Precision::HIGH }, - { "userTime", 0, Type::FLOAT4, Precision::HIGH }, - - // ------------------------------------------------------------------------------------ - // values below should only be accessed in surface materials - // ------------------------------------------------------------------------------------ - - { "resolution", 0, Type::FLOAT4, Precision::HIGH }, - { "logicalViewportScale", 0, Type::FLOAT2, Precision::HIGH }, - { "logicalViewportOffset", 0, Type::FLOAT2, Precision::HIGH }, - - { "lodBias", 0, Type::FLOAT }, - { "refractionLodOffset", 0, Type::FLOAT }, - { "padding1", 0, Type::FLOAT }, - { "padding2", 0, Type::FLOAT }, - - { "cameraPosition", 0, Type::FLOAT3, Precision::HIGH }, - { "oneOverFarMinusNear", 0, Type::FLOAT, Precision::HIGH }, - { "worldOffset", 0, Type::FLOAT3 }, - { "nearOverFarMinusNear", 0, Type::FLOAT, Precision::HIGH }, - { "cameraFar", 0, Type::FLOAT }, - { "exposure", 0, Type::FLOAT, Precision::HIGH }, // high precision to work around #3602 (qualcom), - { "ev100", 0, Type::FLOAT }, - { "needsAlphaChannel", 0, Type::FLOAT }, - - // AO - { "aoSamplingQualityAndEdgeDistance", 0, Type::FLOAT }, - { "aoBentNormals", 0, Type::FLOAT }, - { "aoReserved0", 0, Type::FLOAT }, - { "aoReserved1", 0, Type::FLOAT }, - - // ------------------------------------------------------------------------------------ - // Dynamic Lighting [variant: DYN] - // ------------------------------------------------------------------------------------ - { "zParams", 0, Type::FLOAT4 }, - { "fParams", 0, Type::UINT3 }, - { "lightChannels", 0, Type::UINT }, - { "froxelCountXY", 0, Type::FLOAT2 }, - - { "iblLuminance", 0, Type::FLOAT }, - { "iblRoughnessOneLevel", 0, Type::FLOAT }, - { "iblSH", 9, Type::FLOAT3 }, - - // ------------------------------------------------------------------------------------ - // Directional Lighting [variant: DIR] - // ------------------------------------------------------------------------------------ - { "lightDirection", 0, Type::FLOAT3 }, - { "padding0", 0, Type::FLOAT }, - { "lightColorIntensity", 0, Type::FLOAT4 }, - { "sun", 0, Type::FLOAT4 }, - { "lightFarAttenuationParams", 0, Type::FLOAT2 }, - - // ------------------------------------------------------------------------------------ - // Directional light shadowing [variant: SRE | DIR] - // ------------------------------------------------------------------------------------ - { "directionalShadows", 0, Type::UINT }, - { "ssContactShadowDistance",0, Type::FLOAT }, - - { "cascadeSplits", 0, Type::FLOAT4, Precision::HIGH }, - { "cascades", 0, Type::UINT }, - { "reserved0", 0, Type::FLOAT }, - { "reserved1", 0, Type::FLOAT }, - { "shadowPenumbraRatioScale", 0, Type::FLOAT }, - - // ------------------------------------------------------------------------------------ - // VSM shadows [variant: VSM] - // ------------------------------------------------------------------------------------ - { "vsmExponent", 0, Type::FLOAT }, - { "vsmDepthScale", 0, Type::FLOAT }, - { "vsmLightBleedReduction", 0, Type::FLOAT }, - { "shadowSamplingType", 0, Type::UINT }, - - // ------------------------------------------------------------------------------------ - // Fog [variant: FOG] - // ------------------------------------------------------------------------------------ - { "fogStart", 0, Type::FLOAT }, - { "fogMaxOpacity", 0, Type::FLOAT }, - { "fogHeight", 0, Type::FLOAT }, - { "fogHeightFalloff", 0, Type::FLOAT }, - { "fogColor", 0, Type::FLOAT3 }, - { "fogDensity", 0, Type::FLOAT }, - { "fogInscatteringStart", 0, Type::FLOAT }, - { "fogInscatteringSize", 0, Type::FLOAT }, - { "fogColorFromIbl", 0, Type::FLOAT }, - { "fogReserved0", 0, Type::FLOAT }, - - // ------------------------------------------------------------------------------------ - // Screen-space reflections [variant: SSR (i.e.: VSM | SRE)] - // ------------------------------------------------------------------------------------ - { "ssrReprojection", 0, Type::MAT4, Precision::HIGH }, - { "ssrUvFromViewMatrix", 0, Type::MAT4, Precision::HIGH }, - { "ssrThickness", 0, Type::FLOAT }, - { "ssrBias", 0, Type::FLOAT }, - { "ssrDistance", 0, Type::FLOAT }, - { "ssrStride", 0, Type::FLOAT }, - - // bring PerViewUib to 2 KiB - { "reserved", sizeof(PerViewUib::reserved)/16, Type::FLOAT4 } - }) - .build(); - - return uib; -} - -BufferInterfaceBlock const& UibGenerator::getPerRenderableUib() noexcept { - static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder() - .name(PerRenderableUib::_name) - .add({{ "data", CONFIG_MAX_INSTANCES, BufferInterfaceBlock::Type::STRUCT, {}, - "PerRenderableData", sizeof(PerRenderableData), "CONFIG_MAX_INSTANCES" }}) - .build(); - return uib; -} - -BufferInterfaceBlock const& UibGenerator::getLightsUib() noexcept { - static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder() - .name(LightsUib::_name) - .add({{ "lights", CONFIG_MAX_LIGHT_COUNT, - BufferInterfaceBlock::Type::MAT4, Precision::HIGH }}) - .build(); - return uib; -} - -BufferInterfaceBlock const& UibGenerator::getShadowUib() noexcept { - static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder() - .name(ShadowUib::_name) - .add({{ "shadows", CONFIG_MAX_SHADOWMAPS, - BufferInterfaceBlock::Type::STRUCT, {}, - "ShadowData", sizeof(ShadowUib::ShadowData) }}) - .build(); - return uib; -} - -BufferInterfaceBlock const& UibGenerator::getPerRenderableBonesUib() noexcept { - static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder() - .name(PerRenderableBoneUib::_name) - .add({{ "bones", CONFIG_MAX_BONE_COUNT, - BufferInterfaceBlock::Type::STRUCT, {}, - "BoneData", sizeof(PerRenderableBoneUib::BoneData) }}) - .build(); - return uib; -} - -BufferInterfaceBlock const& UibGenerator::getPerRenderableMorphingUib() noexcept { - static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder() - .name(PerRenderableMorphingUib::_name) - .add({{ "weights", CONFIG_MAX_MORPH_TARGET_COUNT, - BufferInterfaceBlock::Type::FLOAT4 }}) - .build(); - return uib; -} - -BufferInterfaceBlock const& UibGenerator::getFroxelRecordUib() noexcept { - static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder() - .name(FroxelRecordUib::_name) - .add({{ "records", 1024, BufferInterfaceBlock::Type::UINT4, Precision::HIGH }}) - .build(); - return uib; -} - -} // namespace filament diff --git a/libs/filamat/src/UibGenerator.h b/libs/filamat/src/UibGenerator.h deleted file mode 100644 index 4be877f148b..00000000000 --- a/libs/filamat/src/UibGenerator.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef TNT_FILAMAT_UIBGENERATOR_H -#define TNT_FILAMAT_UIBGENERATOR_H - -namespace filament { - -class BufferInterfaceBlock; - -class UibGenerator { -public: - static BufferInterfaceBlock const& getPerViewUib() noexcept; - static BufferInterfaceBlock const& getPerRenderableUib() noexcept; - static BufferInterfaceBlock const& getLightsUib() noexcept; - static BufferInterfaceBlock const& getShadowUib() noexcept; - static BufferInterfaceBlock const& getPerRenderableBonesUib() noexcept; - static BufferInterfaceBlock const& getPerRenderableMorphingUib() noexcept; - static BufferInterfaceBlock const& getFroxelRecordUib() noexcept; - // When adding an UBO here, make sure to also update - // MaterialBuilder::writeCommonChunks() if needed -}; - -} // namespace filament - -#endif // TNT_FILAMAT_UIBGENERATOR_H diff --git a/libs/filamat/src/eiff/BlobDictionary.cpp b/libs/filamat/src/eiff/BlobDictionary.cpp index d13227a5998..692884b0d95 100644 --- a/libs/filamat/src/eiff/BlobDictionary.cpp +++ b/libs/filamat/src/eiff/BlobDictionary.cpp @@ -20,8 +20,8 @@ namespace filamat { -size_t BlobDictionary::addBlob(const std::vector& vblob) noexcept { - std::string_view blob((char*) vblob.data(), vblob.size() * 4); +size_t BlobDictionary::addBlob(const std::vector& vblob) noexcept { + std::string_view blob((char*) vblob.data(), vblob.size()); auto iter = mBlobIndices.find(blob); if (iter != mBlobIndices.end()) { return iter->second; diff --git a/libs/filamat/src/eiff/BlobDictionary.h b/libs/filamat/src/eiff/BlobDictionary.h index c204f926587..b642f188d87 100644 --- a/libs/filamat/src/eiff/BlobDictionary.h +++ b/libs/filamat/src/eiff/BlobDictionary.h @@ -36,7 +36,7 @@ class BlobDictionary { BlobDictionary(BlobDictionary&&) = default; // Adds a blob if it's not already a duplicate and returns its index. - size_t addBlob(const std::vector& blob) noexcept; + size_t addBlob(const std::vector& blob) noexcept; size_t getBlobCount() const noexcept { return mBlobs.size(); diff --git a/libs/filamat/src/eiff/ChunkContainer.h b/libs/filamat/src/eiff/ChunkContainer.h index da66621b25b..617b2386e8c 100644 --- a/libs/filamat/src/eiff/ChunkContainer.h +++ b/libs/filamat/src/eiff/ChunkContainer.h @@ -37,7 +37,7 @@ class ChunkContainer { template ::value, int> = 0, typename... Args> - const T& addChild(Args&&... args) { + const T& push(Args&&... args) { T* chunk = new T(std::forward(args)...); mChildren.emplace_back(chunk); return *chunk; @@ -45,8 +45,8 @@ class ChunkContainer { // Helper method to add a SimpleFieldChunk to this ChunkContainer. template - const SimpleFieldChunk& addSimpleChild(Args&&... args) { - return addChild>(std::forward(args)...); + const SimpleFieldChunk& emplace(Args&&... args) { + return push>(std::forward(args)...); } size_t getSize() const; diff --git a/libs/filamat/src/eiff/DictionaryMetalLibraryChunk.cpp b/libs/filamat/src/eiff/DictionaryMetalLibraryChunk.cpp new file mode 100644 index 00000000000..fb701aab98e --- /dev/null +++ b/libs/filamat/src/eiff/DictionaryMetalLibraryChunk.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "DictionaryMetalLibraryChunk.h" + +namespace filamat { + +DictionaryMetalLibraryChunk::DictionaryMetalLibraryChunk(BlobDictionary&& dictionary) + : Chunk(ChunkType::DictionaryMetalLibrary), mDictionary(std::move(dictionary)) {} + +void DictionaryMetalLibraryChunk::flatten(Flattener& f) { + f.writeUint32(mDictionary.getBlobCount()); + for (size_t i = 0 ; i < mDictionary.getBlobCount() ; i++) { + std::string_view blob = mDictionary.getBlob(i); + f.writeAlignmentPadding(); + f.writeBlob((const char*) blob.data(), blob.size()); + } +} + +} // namespace filamat diff --git a/libs/filamat/src/eiff/DictionaryMetalLibraryChunk.h b/libs/filamat/src/eiff/DictionaryMetalLibraryChunk.h new file mode 100644 index 00000000000..a129974961b --- /dev/null +++ b/libs/filamat/src/eiff/DictionaryMetalLibraryChunk.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMAT_DIC_METAL_LIBRARY_CHUNK_H +#define TNT_FILAMAT_DIC_METAL_LIBRARY_CHUNK_H + +#include +#include + +#include "Chunk.h" +#include "Flattener.h" +#include "BlobDictionary.h" + +namespace filamat { + +class DictionaryMetalLibraryChunk final : public Chunk { +public: + explicit DictionaryMetalLibraryChunk(BlobDictionary&& dictionary); + ~DictionaryMetalLibraryChunk() = default; + +private: + void flatten(Flattener& f) override; + + BlobDictionary mDictionary; + bool mStripDebugInfo; +}; + +} // namespace filamat + +#endif // TNT_FILAMAT_DIC_METAL_LIBRARY_CHUNK_H diff --git a/libs/filamat/src/eiff/Flattener.h b/libs/filamat/src/eiff/Flattener.h index a658afe6e04..e43cdb76811 100644 --- a/libs/filamat/src/eiff/Flattener.h +++ b/libs/filamat/src/eiff/Flattener.h @@ -17,13 +17,19 @@ #ifndef TNT_FILAMAT_FLATENNER_H #define TNT_FILAMAT_FLATENNER_H -#include +#include +#include +#include +#include #include +#include #include #include #include +#include +#include #include using namespace utils; @@ -97,7 +103,7 @@ class Flattener { } void writeString(const char* str) { - size_t len = strlen(str); + size_t const len = strlen(str); if (mStart != nullptr) { strcpy(reinterpret_cast(mCursor), str); } @@ -105,7 +111,7 @@ class Flattener { } void writeString(std::string_view str) { - size_t len = str.length(); + size_t const len = str.length(); if (mStart != nullptr) { memcpy(reinterpret_cast(mCursor), str.data(), len); mCursor[len] = 0; @@ -121,6 +127,13 @@ class Flattener { mCursor += nbytes; } + void writeRaw(const char* raw, size_t nbytes) { + if (mStart != nullptr) { + memcpy(reinterpret_cast(mCursor), raw, nbytes); + } + mCursor += nbytes; + } + void writeSizePlaceholder() { mSizePlaceholders.push_back(mCursor); if (mStart != nullptr) { @@ -145,12 +158,12 @@ class Flattener { } uint32_t writeSize() { - assert(mSizePlaceholders.size() > 0); + assert(!mSizePlaceholders.empty()); uint8_t* dst = mSizePlaceholders.back(); mSizePlaceholders.pop_back(); // -4 to account for the 4 bytes we are about to write. - uint32_t size = static_cast(mCursor - dst - 4); + uint32_t const size = static_cast(mCursor - dst - 4); if (mStart != nullptr) { dst[0] = static_cast( size & 0xff); dst[1] = static_cast((size >> 8) & 0xff); @@ -177,12 +190,12 @@ class Flattener { } for(auto pair : mOffsetPlaceholders) { - size_t index = pair.first; + size_t const index = pair.first; if (index != forIndex) { continue; } uint8_t* dst = pair.second; - size_t offset = mCursor - mOffsetsBase; + size_t const offset = mCursor - mOffsetsBase; if (offset > UINT32_MAX) { slog.e << "Unable to write offset greater than UINT32_MAX." << io::endl; exit(0); @@ -206,7 +219,7 @@ class Flattener { } void writePlaceHoldValue(size_t v) { - assert(mValuePlaceholders.size() > 0); + assert(!mValuePlaceholders.empty()); if (v > UINT32_MAX) { slog.e << "Unable to write value greater than UINT32_MAX." << io::endl; diff --git a/libs/filamat/src/eiff/MaterialBinaryChunk.cpp b/libs/filamat/src/eiff/MaterialBinaryChunk.cpp new file mode 100644 index 00000000000..bc097e04234 --- /dev/null +++ b/libs/filamat/src/eiff/MaterialBinaryChunk.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MaterialBinaryChunk.h" + +namespace filamat { + +MaterialBinaryChunk::MaterialBinaryChunk( + const std::vector&& entries, ChunkType chunkType) + : Chunk(chunkType), mEntries(entries) {} + +void MaterialBinaryChunk::flatten(Flattener &f) { + f.writeUint64(mEntries.size()); + for (const BinaryEntry& entry : mEntries) { + f.writeUint8(uint8_t(entry.shaderModel)); + f.writeUint8(entry.variant.key); + f.writeUint8(uint8_t(entry.stage)); + f.writeUint32(entry.dictionaryIndex); + } +} + +} // namespace filamat diff --git a/libs/filamat/src/eiff/MaterialBinaryChunk.h b/libs/filamat/src/eiff/MaterialBinaryChunk.h new file mode 100644 index 00000000000..8c121947244 --- /dev/null +++ b/libs/filamat/src/eiff/MaterialBinaryChunk.h @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMAT_MATERIAL_BINARY_CHUNK_H +#define TNT_FILAMAT_MATERIAL_BINARY_CHUNK_H + +#include "Chunk.h" +#include "ShaderEntry.h" + +#include + +namespace filamat { + +class MaterialBinaryChunk final : public Chunk { +public: + explicit MaterialBinaryChunk(const std::vector&& entries, ChunkType type); + ~MaterialBinaryChunk() = default; + +private: + void flatten(Flattener& f) override; + + const std::vector mEntries; +}; + +} // namespace filamat + +#endif // TNT_FILAMAT_MATERIAL_BINARY_CHUNK_H diff --git a/libs/filamat/src/eiff/MaterialInterfaceBlockChunk.cpp b/libs/filamat/src/eiff/MaterialInterfaceBlockChunk.cpp index d3a23d9b3c3..2e86dca9d03 100644 --- a/libs/filamat/src/eiff/MaterialInterfaceBlockChunk.cpp +++ b/libs/filamat/src/eiff/MaterialInterfaceBlockChunk.cpp @@ -17,13 +17,22 @@ #include "filament/MaterialChunkType.h" -#include "../SamplerBindingMap.h" -#include #include +#include +#include +#include +#include +#include #include +#include + +#include + #include +#include + using namespace filament; namespace filamat { @@ -60,6 +69,7 @@ void MaterialSamplerInterfaceBlockChunk::flatten(Flattener& f) { f.writeUint64(sibFields.size()); for (auto sInfo: sibFields) { f.writeString(sInfo.name.c_str()); + f.writeUint8(static_cast(sInfo.binding)); f.writeUint8(static_cast(sInfo.type)); f.writeUint8(static_cast(sInfo.format)); f.writeUint8(static_cast(sInfo.precision)); @@ -89,50 +99,189 @@ void MaterialSubpassInterfaceBlockChunk::flatten(Flattener& f) { // ------------------------------------------------------------------------------------------------ -MaterialUniformBlockBindingsChunk::MaterialUniformBlockBindingsChunk( - utils::FixedCapacityVector> list) - : Chunk(ChunkType::MaterialUniformBindings), - mBindingList(std::move(list)) { +MaterialConstantParametersChunk::MaterialConstantParametersChunk( + utils::FixedCapacityVector constants) + : Chunk(ChunkType::MaterialConstants), mConstants(std::move(constants)) {} + +void MaterialConstantParametersChunk::flatten(Flattener& f) { + f.writeUint64(mConstants.size()); + for (const auto& constant : mConstants) { + f.writeString(constant.name.c_str()); + f.writeUint8(static_cast(constant.type)); + } +} + +// ------------------------------------------------------------------------------------------------ + +MaterialPushConstantParametersChunk::MaterialPushConstantParametersChunk( + CString const& structVarName, utils::FixedCapacityVector constants) + : Chunk(ChunkType::MaterialPushConstants), + mStructVarName(structVarName), + mConstants(std::move(constants)) {} + +void MaterialPushConstantParametersChunk::flatten(Flattener& f) { + f.writeString(mStructVarName.c_str()); + f.writeUint64(mConstants.size()); + for (const auto& constant: mConstants) { + f.writeString(constant.name.c_str()); + f.writeUint8(static_cast(constant.type)); + f.writeUint8(static_cast(constant.stage)); + } +} + +// ------------------------------------------------------------------------------------------------ + +MaterialBindingUniformInfoChunk::MaterialBindingUniformInfoChunk(Container list) noexcept + : Chunk(ChunkType::MaterialBindingUniformInfo), + mBindingUniformInfo(std::move(list)) { } -void MaterialUniformBlockBindingsChunk::flatten(Flattener& f) { - f.writeUint8(mBindingList.size()); - for (auto const& item: mBindingList) { - f.writeString(item.first); - f.writeUint8(uint8_t(item.second)); +void MaterialBindingUniformInfoChunk::flatten(Flattener& f) { + f.writeUint8(mBindingUniformInfo.size()); + for (auto const& [index, name, uniforms] : mBindingUniformInfo) { + f.writeUint8(uint8_t(index)); + f.writeString({ name.data(), name.size() }); + f.writeUint8(uint8_t(uniforms.size())); + for (auto const& uniform: uniforms) { + f.writeString({ uniform.name.data(), uniform.name.size() }); + f.writeUint16(uniform.offset); + f.writeUint8(uniform.size); + f.writeUint8(uint8_t(uniform.type)); + } } } // ------------------------------------------------------------------------------------------------ -MaterialSamplerBlockBindingChunk::MaterialSamplerBlockBindingChunk( - SamplerBindingMap const& samplerBindings) - : Chunk(ChunkType::MaterialSamplerBindings), - mSamplerBindings(samplerBindings) { -} - -void MaterialSamplerBlockBindingChunk::flatten(Flattener& f) { - f.writeUint8(utils::Enum::count()); - UTILS_NOUNROLL - for (size_t i = 0; i < utils::Enum::count(); i++) { - SamplerBindingPoints bindingPoint = (SamplerBindingPoints)i; - auto const& bindingInfo = mSamplerBindings.getSamplerGroupBindingInfo(bindingPoint); - f.writeUint8(bindingInfo.bindingOffset); - f.writeUint8((uint8_t)bindingInfo.shaderStageFlags); - f.writeUint8(bindingInfo.count); +MaterialAttributesInfoChunk::MaterialAttributesInfoChunk(Container list) noexcept + : Chunk(ChunkType::MaterialAttributeInfo), + mAttributeInfo(std::move(list)) +{ +} + +void MaterialAttributesInfoChunk::flatten(Flattener& f) { + f.writeUint8(mAttributeInfo.size()); + for (auto const& [attribute, location]: mAttributeInfo) { + f.writeString({ attribute.data(), attribute.size() }); + f.writeUint8(location); + } +} + +// ------------------------------------------------------------------------------------------------ + +MaterialDescriptorBindingsChuck::MaterialDescriptorBindingsChuck(Container const& sib, + backend::DescriptorSetLayout const& perViewLayout) noexcept + : Chunk(ChunkType::MaterialDescriptorBindingsInfo), + mSamplerInterfaceBlock(sib), + mPerViewLayout(perViewLayout) { +} + +void MaterialDescriptorBindingsChuck::flatten(Flattener& f) { + assert_invariant(sizeof(backend::descriptor_set_t) == sizeof(uint8_t)); + assert_invariant(sizeof(backend::descriptor_binding_t) == sizeof(uint8_t)); + + using namespace backend; + + + // number of descriptor-sets + f.writeUint8(3); + + // set + f.writeUint8(+DescriptorSetBindingPoints::PER_MATERIAL); + + // samplers + 1 descriptor for the UBO + f.writeUint8(mSamplerInterfaceBlock.getSize() + 1); + + // our UBO descriptor is always at binding 0 + CString const uboName = + descriptor_sets::getDescriptorName(DescriptorSetBindingPoints::PER_MATERIAL, 0); + f.writeString({ uboName.data(), uboName.size() }); + f.writeUint8(uint8_t(DescriptorType::UNIFORM_BUFFER)); + f.writeUint8(0); + + // all the material's sampler descriptors + for (auto const& entry: mSamplerInterfaceBlock.getSamplerInfoList()) { + f.writeString({ entry.uniformName.data(), entry.uniformName.size() }); + if (entry.type == SamplerInterfaceBlock::Type::SAMPLER_EXTERNAL) { + f.writeUint8(uint8_t(DescriptorType::SAMPLER_EXTERNAL)); + } else { + f.writeUint8(uint8_t(DescriptorType::SAMPLER)); + } + f.writeUint8(entry.binding); + } + + // set + f.writeUint8(+DescriptorSetBindingPoints::PER_RENDERABLE); + f.writeUint8(descriptor_sets::getPerRenderableLayout().bindings.size()); + for (auto const& entry: descriptor_sets::getPerRenderableLayout().bindings) { + auto const& name = descriptor_sets::getDescriptorName( + DescriptorSetBindingPoints::PER_RENDERABLE, entry.binding); + f.writeString({ name.data(), name.size() }); + f.writeUint8(uint8_t(entry.type)); + f.writeUint8(entry.binding); + } + + // set + f.writeUint8(+DescriptorSetBindingPoints::PER_VIEW); + f.writeUint8(mPerViewLayout.bindings.size()); + for (auto const& entry: mPerViewLayout.bindings) { + auto const& name = descriptor_sets::getDescriptorName( + DescriptorSetBindingPoints::PER_VIEW, entry.binding); + f.writeString({ name.data(), name.size() }); + f.writeUint8(uint8_t(entry.type)); + f.writeUint8(entry.binding); } - f.writeUint8(mSamplerBindings.getActiveSamplerCount()); - UTILS_UNUSED_IN_RELEASE size_t c = 0; - UTILS_NOUNROLL - for (size_t i = 0; i < backend::MAX_SAMPLER_COUNT; i++) { - auto const& uniformName = mSamplerBindings.getSamplerName(i); - if (!uniformName.empty()) { - f.writeUint8((uint8_t)i); - f.writeString(uniformName.c_str()); - c++; +} + +// ------------------------------------------------------------------------------------------------ + +MaterialDescriptorSetLayoutChunk::MaterialDescriptorSetLayoutChunk(Container const& sib, + backend::DescriptorSetLayout const& perViewLayout) noexcept + : Chunk(ChunkType::MaterialDescriptorSetLayoutInfo), + mSamplerInterfaceBlock(sib), + mPerViewLayout(perViewLayout) { +} + +void MaterialDescriptorSetLayoutChunk::flatten(Flattener& f) { + assert_invariant(sizeof(backend::descriptor_set_t) == sizeof(uint8_t)); + assert_invariant(sizeof(backend::descriptor_binding_t) == sizeof(uint8_t)); + + using namespace backend; + + // samplers + 1 descriptor for the UBO + f.writeUint8(mSamplerInterfaceBlock.getSize() + 1); + + // our UBO descriptor is always at binding 0 + f.writeUint8(uint8_t(DescriptorType::UNIFORM_BUFFER)); + f.writeUint8(uint8_t(ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT)); + f.writeUint8(0); + f.writeUint8(uint8_t(DescriptorFlags::NONE)); + f.writeUint16(0); + + // all the material's sampler descriptors + for (auto const& entry: mSamplerInterfaceBlock.getSamplerInfoList()) { + if (entry.type == SamplerInterfaceBlock::Type::SAMPLER_EXTERNAL) { + f.writeUint8(uint8_t(DescriptorType::SAMPLER_EXTERNAL)); + } else { + f.writeUint8(uint8_t(DescriptorType::SAMPLER)); } + f.writeUint8(uint8_t(ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT)); + f.writeUint8(entry.binding); + f.writeUint8(uint8_t(DescriptorFlags::NONE)); + f.writeUint16(0); + } + + // samplers + 1 descriptor for the UBO + f.writeUint8(mPerViewLayout.bindings.size()); + + // all the material's sampler descriptors + for (auto const& entry: mPerViewLayout.bindings) { + f.writeUint8(uint8_t(entry.type)); + f.writeUint8(uint8_t(entry.stageFlags)); + f.writeUint8(entry.binding); + f.writeUint8(uint8_t(entry.flags)); + f.writeUint16(entry.count); } - assert_invariant(c == mSamplerBindings.getActiveSamplerCount()); } } // namespace filamat diff --git a/libs/filamat/src/eiff/MaterialInterfaceBlockChunk.h b/libs/filamat/src/eiff/MaterialInterfaceBlockChunk.h index df42347556c..cbb3a85446c 100644 --- a/libs/filamat/src/eiff/MaterialInterfaceBlockChunk.h +++ b/libs/filamat/src/eiff/MaterialInterfaceBlockChunk.h @@ -21,13 +21,23 @@ #include +#include +#include + +#include #include +#include +#include + +#include + namespace filament { -class SamplerBindingMap; class SamplerInterfaceBlock; class BufferInterfaceBlock; struct SubpassInfo; +struct MaterialConstant; +struct MaterialPushConstant; } // namespace filament namespace filamat { @@ -71,29 +81,92 @@ class MaterialSubpassInterfaceBlockChunk final : public Chunk { // ------------------------------------------------------------------------------------------------ -class MaterialUniformBlockBindingsChunk final : public Chunk { +class MaterialConstantParametersChunk final : public Chunk { +public: + explicit MaterialConstantParametersChunk( + utils::FixedCapacityVector constants); + ~MaterialConstantParametersChunk() final = default; + +private: + void flatten(Flattener&) final; + + utils::FixedCapacityVector mConstants; +}; + +// ------------------------------------------------------------------------------------------------ + +class MaterialPushConstantParametersChunk final : public Chunk { public: - explicit MaterialUniformBlockBindingsChunk( - utils::FixedCapacityVector> list); - ~MaterialUniformBlockBindingsChunk() final = default; + explicit MaterialPushConstantParametersChunk(utils::CString const& structVarName, + utils::FixedCapacityVector constants); + ~MaterialPushConstantParametersChunk() final = default; private: void flatten(Flattener&) final; - utils::FixedCapacityVector> mBindingList; + utils::CString mStructVarName; + utils::FixedCapacityVector mConstants; }; // ------------------------------------------------------------------------------------------------ -class MaterialSamplerBlockBindingChunk final : public Chunk { +class MaterialBindingUniformInfoChunk final : public Chunk { + using Container = FixedCapacityVector>; public: - explicit MaterialSamplerBlockBindingChunk(filament::SamplerBindingMap const& samplerBindings); - ~MaterialSamplerBlockBindingChunk() final = default; + explicit MaterialBindingUniformInfoChunk(Container list) noexcept; + ~MaterialBindingUniformInfoChunk() final = default; private: void flatten(Flattener &) final; - filament::SamplerBindingMap const& mSamplerBindings; + Container mBindingUniformInfo; +}; + +// ------------------------------------------------------------------------------------------------ + +class MaterialAttributesInfoChunk final : public Chunk { + using Container = FixedCapacityVector>; +public: + explicit MaterialAttributesInfoChunk(Container list) noexcept; + ~MaterialAttributesInfoChunk() final = default; + +private: + void flatten(Flattener &) final; + + Container mAttributeInfo; +}; + +// ------------------------------------------------------------------------------------------------ + +class MaterialDescriptorBindingsChuck final : public Chunk { + using Container = filament::SamplerInterfaceBlock; +public: + explicit MaterialDescriptorBindingsChuck(Container const& sib, + filament::backend::DescriptorSetLayout const& perViewLayout) noexcept; + ~MaterialDescriptorBindingsChuck() final = default; + +private: + void flatten(Flattener&) final; + + Container const& mSamplerInterfaceBlock; + filament::backend::DescriptorSetLayout mPerViewLayout; +}; + +// ------------------------------------------------------------------------------------------------ + +class MaterialDescriptorSetLayoutChunk final : public Chunk { + using Container = filament::SamplerInterfaceBlock; +public: + explicit MaterialDescriptorSetLayoutChunk(Container const& sib, + filament::backend::DescriptorSetLayout const& perViewLayout) noexcept; + ~MaterialDescriptorSetLayoutChunk() final = default; + +private: + void flatten(Flattener&) final; + + Container const& mSamplerInterfaceBlock; + filament::backend::DescriptorSetLayout mPerViewLayout; }; } // namespace filamat diff --git a/libs/filamat/src/eiff/MaterialSpirvChunk.cpp b/libs/filamat/src/eiff/MaterialSpirvChunk.cpp deleted file mode 100644 index 5c9f0e856f4..00000000000 --- a/libs/filamat/src/eiff/MaterialSpirvChunk.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - *DictionaryGlsl - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "MaterialSpirvChunk.h" - -namespace filamat { - -MaterialSpirvChunk::MaterialSpirvChunk(const std::vector&& entries) : - Chunk(ChunkType::MaterialSpirv), mEntries(entries) {} - -void MaterialSpirvChunk::flatten(Flattener &f) { - f.writeUint64(mEntries.size()); - for (const SpirvEntry& entry : mEntries) { - f.writeUint8(entry.shaderModel); - f.writeUint8(entry.variantKey); - f.writeUint8(entry.stage); - f.writeUint32(entry.dictionaryIndex); - } -} - -} // namespace filamat diff --git a/libs/filamat/src/eiff/MaterialSpirvChunk.h b/libs/filamat/src/eiff/MaterialSpirvChunk.h deleted file mode 100644 index 42aefdc245f..00000000000 --- a/libs/filamat/src/eiff/MaterialSpirvChunk.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef TNT_FILAMAT_MATERIAL_SPIRV_CHUNK_H -#define TNT_FILAMAT_MATERIAL_SPIRV_CHUNK_H - -#include "Chunk.h" -#include "ShaderEntry.h" - -#include - -namespace filamat { - -class MaterialSpirvChunk final : public Chunk { -public: - explicit MaterialSpirvChunk(const std::vector&& entries); - ~MaterialSpirvChunk() = default; - -private: - void flatten(Flattener& f) override; - - const std::vector mEntries; -}; - -} // namespace filamat - -#endif // TNT_FILAMAT_MATERIAL_SPIRV_CHUNK_H diff --git a/libs/filamat/src/eiff/MaterialTextChunk.cpp b/libs/filamat/src/eiff/MaterialTextChunk.cpp index ee708bb7dc3..3b0e45dff62 100644 --- a/libs/filamat/src/eiff/MaterialTextChunk.cpp +++ b/libs/filamat/src/eiff/MaterialTextChunk.cpp @@ -20,9 +20,9 @@ namespace filamat { void MaterialTextChunk::writeEntryAttributes(size_t entryIndex, Flattener& f) const noexcept { const TextEntry& entry = mEntries[entryIndex]; - f.writeUint8(entry.shaderModel); - f.writeUint8(entry.variantKey); - f.writeUint8(entry.stage); + f.writeUint8(uint8_t(entry.shaderModel)); + f.writeUint8(entry.variant.key); + f.writeUint8(uint8_t(entry.stage)); } void compressShader(std::string_view src, Flattener &f, const LineDictionary& dictionary) { diff --git a/libs/filamat/src/eiff/ShaderEntry.h b/libs/filamat/src/eiff/ShaderEntry.h index f5b453b040a..b8e2067609b 100644 --- a/libs/filamat/src/eiff/ShaderEntry.h +++ b/libs/filamat/src/eiff/ShaderEntry.h @@ -17,32 +17,31 @@ #ifndef TNT_FILAMAT_SHADER_ENTRY_H #define TNT_FILAMAT_SHADER_ENTRY_H +#include + +#include + #include #include -#include - namespace filamat { // TextEntry stores a shader in ASCII text format, like GLSL. struct TextEntry { - uint8_t shaderModel; - filament::Variant::type_t variantKey; - uint8_t stage; + filament::backend::ShaderModel shaderModel; + filament::Variant variant; + filament::backend::ShaderStage stage; std::string shader; }; +struct BinaryEntry { + filament::backend::ShaderModel shaderModel; + filament::Variant variant; + filament::backend::ShaderStage stage; + size_t dictionaryIndex; // maps to an index in the blob dictionary -struct SpirvEntry { - uint8_t shaderModel; - filament::Variant::type_t variantKey; - uint8_t stage; - size_t dictionaryIndex; - -#ifndef FILAMAT_LITE - // temporarily holds this entry's spirv until added to the dictionary - std::vector spirv; -#endif + // temporarily holds this entry's binary data until added to the dictionary + std::vector data; }; } // namespace filamat diff --git a/libs/filamat/src/sca/ASTHelpers.cpp b/libs/filamat/src/sca/ASTHelpers.cpp index 0ef9ec6226f..d82831aa1bd 100644 --- a/libs/filamat/src/sca/ASTHelpers.cpp +++ b/libs/filamat/src/sca/ASTHelpers.cpp @@ -25,7 +25,7 @@ using namespace glslang; -namespace ASTUtils { +namespace ASTHelpers { // Traverse the AST to find the definition of a function based on its name/signature. // e.g: prepareMaterial(struct-MaterialInputs-vf4-vf41; @@ -41,8 +41,8 @@ class FunctionDefinitionFinder : public TIntermTraverser { if (mUseFQN) { match = node->getName() == mFunctionName; } else { - std::string_view prospectFunctionName = getFunctionName(node->getName()); - std::string_view cleanedFunctionName = getFunctionName(mFunctionName); + std::string_view const prospectFunctionName = getFunctionName(node->getName()); + std::string_view const cleanedFunctionName = getFunctionName(mFunctionName); match = prospectFunctionName == cleanedFunctionName; } if (match) { @@ -78,7 +78,7 @@ class FunctionCallFinder : public TIntermTraverser { if (node->getOp() != EOpFunctionCall) { return true; } - std::string_view functionCalledName = node->getName(); + std::string_view const functionCalledName = node->getName(); if (functionCalledName == mFunctionName) { mFunctionFound = true; } else { @@ -102,205 +102,49 @@ class FunctionCallFinder : public TIntermTraverser { // For debugging and printing out an AST portion. Mostly incomplete but complete enough for our need // TODO: Add more switch cases as needed. -const char* op2Str(TOperator op) { +std::string to_string(TOperator op) { switch (op) { - case EOpAssign : return "EOpAssign"; - case EOpAddAssign: return "EOpAddAssign"; - case EOpSubAssign: return "EOpSubAssign"; - case EOpMulAssign: return "EOpMulAssign"; - case EOpDivAssign: return "EOpDivAssign"; - case EOpVectorSwizzle: return "EOpVectorSwizzle"; - case EOpIndexDirectStruct :return "EOpIndexDirectStruct"; - case EOpFunction:return "EOpFunction"; - case EOpFunctionCall:return "EOpFunctionCall"; - case EOpParameters:return "EOpParameters"; - default: return "???"; + case EOpSequence: return "EOpSequence"; + case EOpAssign: return "EOpAssign"; + case EOpAddAssign: return "EOpAddAssign"; + case EOpSubAssign: return "EOpSubAssign"; + case EOpMulAssign: return "EOpMulAssign"; + case EOpDivAssign: return "EOpDivAssign"; + case EOpVectorSwizzle: return "EOpVectorSwizzle"; + case EOpIndexDirectStruct: return "EOpIndexDirectStruct"; + case EOpFunction: return "EOpFunction"; + case EOpFunctionCall: return "EOpFunctionCall"; + case EOpParameters: return "EOpParameters"; + // branch + case EOpKill: return "EOpKill"; + case EOpTerminateInvocation: return "EOpTerminateInvocation"; + case EOpDemote: return "EOpDemote"; + case EOpTerminateRayKHR: return "EOpTerminateRayKHR"; + case EOpIgnoreIntersectionKHR: return "EOpIgnoreIntersectionKHR"; + case EOpReturn: return "EOpReturn"; + case EOpBreak: return "EOpBreak"; + case EOpContinue: return "EOpContinue"; + case EOpCase: return "EOpCase"; + case EOpDefault: return "EOpDefault"; + default: + return std::to_string((int)op); } } -static std::string getIndexDirectStructString(const TIntermBinary& node) { +std::string getIndexDirectStructString(const TIntermBinary& node) { const TTypeList& structNode = *(node.getLeft()->getType().getStruct()); TIntermConstantUnion* index = node.getRight() ->getAsConstantUnion(); return structNode[index->getConstArray()[0].getIConst()].type->getFieldName().c_str(); } -// Meant to explore the Lvalue in an assignment. Depth traverse the left child of an assignment -// binary node to find out the symbol and all access applied on it. -static const TIntermTyped* findLValueBase(const TIntermTyped* node, Symbol& symbol) -{ - do { - // Make sure we have a binary node - const TIntermBinary* binary = node->getAsBinaryNode(); - if (binary == nullptr) { - return node; - } - - // Check Operator - TOperator op = binary->getOp(); - if (op != EOpIndexDirect && op != EOpIndexIndirect && op != EOpIndexDirectStruct && op != - EOpVectorSwizzle && op != EOpMatrixSwizzle) { - return nullptr; - } - Access access; - if (op == EOpIndexDirectStruct) { - access.string = getIndexDirectStructString(*binary); - access.type = Access::DirectIndexForStruct; - } else { - access.string = op2Str(op) ; - access.type = Access::Swizzling; - } - symbol.add(access); - node = node->getAsBinaryNode()->getLeft(); - } while (true); -} - - -class SymbolsTracer : public TIntermTraverser { -public: - explicit SymbolsTracer(std::deque& events) : mEvents(events) { - } - - // Function call site. - bool visitAggregate(TVisit, TIntermAggregate* node) override { - if (node->getOp() != EOpFunctionCall) { - return true; - } - - // Find function name. - std::string functionName = node->getName().c_str(); - - // Iterate on function parameters. - for (size_t parameterIdx = 0; parameterIdx < node->getSequence().size(); parameterIdx++) { - TIntermNode* parameter = node->getSequence().at(parameterIdx); - // Parameter is not a pure symbol. It is indexed or swizzled. - if (parameter->getAsBinaryNode()) { - Symbol symbol; - std::vector events; - const TIntermTyped* n = findLValueBase(parameter->getAsBinaryNode(), symbol); - if (n != nullptr && n->getAsSymbolNode() != nullptr) { - const TString& symbolTString = n->getAsSymbolNode()->getName(); - symbol.setName(symbolTString.c_str()); - events.push_back(symbol); - } - - for (Symbol symbol: events) { - Access fCall = {Access::FunctionCall, functionName, parameterIdx}; - symbol.add(fCall); - mEvents.push_back(symbol); - } - - } - // Parameter is a pure symbol. - if (parameter->getAsSymbolNode()) { - Symbol s(parameter->getAsSymbolNode()->getName().c_str()); - Access fCall = {Access::FunctionCall, functionName, parameterIdx}; - s.add(fCall); - mEvents.push_back(s); - } - } - - return true; - } - - // Assign operations - bool visitBinary(TVisit, TIntermBinary* node) override { - TOperator op = node->getOp(); - Symbol symbol; - if (op == EOpAssign || op == EOpAddAssign || op == EOpDivAssign || op == EOpSubAssign - || op == EOpMulAssign ) { - const TIntermTyped* n = findLValueBase(node->getLeft(), symbol); - if (n != nullptr && n->getAsSymbolNode() != nullptr) { - const TString& symbolTString = n->getAsSymbolNode()->getName(); - symbol.setName(symbolTString.c_str()); - mEvents.push_back(symbol); - return false; // Don't visit subtree since we just traced it with findLValueBase() - } - } - return true; - } - -private: - std::deque& mEvents; -}; std::string_view getFunctionName(std::string_view functionSignature) noexcept { - auto indexParenthesis = functionSignature.find('('); - return functionSignature.substr(0, indexParenthesis); + auto indexParenthesis = functionSignature.find('('); + return functionSignature.substr(0, indexParenthesis); } -class NodeToString: public TIntermTraverser { -public: - - void pad() { - for (int i = 0; i < depth; ++i) { - utils::slog.e << " "; - } - } - - bool visitBinary(TVisit, TIntermBinary* node) override { - pad(); - utils::slog.e << "Binary " << op2Str(node->getOp()); - utils::slog.e << utils::io::endl; - return true; - } - - bool visitUnary(TVisit, TIntermUnary* node) override { - pad(); - utils::slog.e << "Unary" << op2Str(node->getOp()); - utils::slog.e << utils::io::endl; - return true; - } - - bool visitAggregate(TVisit, TIntermAggregate* node) override { - pad(); - utils::slog.e << "Aggregate" << op2Str(node->getOp()); - utils::slog.e << utils::io::endl; - return true; - } - - bool visitSelection(TVisit, TIntermSelection* node) override { - pad(); - utils::slog.e << "Selection"; - utils::slog.e << utils::io::endl; - return true; - } - - void visitConstantUnion(TIntermConstantUnion* node) override { - pad(); - utils::slog.e << "ConstantUnion"; - utils::slog.e << utils::io::endl; - } - - void visitSymbol(TIntermSymbol* node) override { - pad(); - utils::slog.e << "Symbol " << node->getAsSymbolNode()->getName().c_str(); - utils::slog.e << utils::io::endl; - } - - bool visitLoop(TVisit, TIntermLoop* node) override { - pad(); - utils::slog.e << "Loop"; - utils::slog.e << utils::io::endl; - return true; - } - - bool visitBranch(TVisit, TIntermBranch* node) override { - pad(); - utils::slog.e << "Branch"; - utils::slog.e << utils::io::endl; - return true; - } - - bool visitSwitch(TVisit, TIntermSwitch* node) override { - utils::slog.e << "Binary "; - utils::slog.e << utils::io::endl; - return true; - } -}; - glslang::TIntermAggregate* getFunctionBySignature(std::string_view functionSignature, - TIntermNode& rootNode) - noexcept { + TIntermNode& rootNode) noexcept { FunctionDefinitionFinder functionDefinitionFinder(functionSignature); rootNode.traverse(&functionDefinitionFinder); return functionDefinitionFinder.getFunctionDefinitionNode(); @@ -320,11 +164,6 @@ bool isFunctionCalled(std::string_view functionName, TIntermNode& functionNode, return traverser.functionWasCalled(); } -void traceSymbols(TIntermNode& functionNode, std::deque& events) { - SymbolsTracer variableTracer(events); - functionNode.traverse(&variableTracer); -} - static FunctionParameter::Qualifier glslangQualifier2FunctionParameter(TStorageQualifier q) { switch (q) { case EvqIn: return FunctionParameter::Qualifier::IN; @@ -335,14 +174,15 @@ static FunctionParameter::Qualifier glslangQualifier2FunctionParameter(TStorageQ } } -void getFunctionParameters(TIntermAggregate* func, std::vector& output) noexcept { +void getFunctionParameters(TIntermAggregate* func, + std::vector& output) noexcept { if (func == nullptr) { return; } // Does it have a list of params // The second aggregate is the list of instructions, but the function may be empty - if (func->getSequence().size() < 1) { + if (func->getSequence().empty()) { return; } @@ -350,7 +190,7 @@ void getFunctionParameters(TIntermAggregate* func, std::vectorgetSequence().at(0)->getAsAggregate()->getSequence()) { TIntermSymbol* parameter = parameterNode->getAsSymbolNode(); - FunctionParameter p = { + FunctionParameter const p = { parameter->getName().c_str(), parameter->getType().getCompleteString().c_str(), glslangQualifier2FunctionParameter(parameter->getType().getQualifier().storage) @@ -359,105 +199,63 @@ void getFunctionParameters(TIntermAggregate* func, std::vector -class TraverserAdapter: public TIntermTraverser { - F closure; -public: - explicit TraverserAdapter(F closure) - : TIntermTraverser(true, false, false, false), - closure(closure) { +void NodeToString::pad() { + for (int i = 0; i < depth; ++i) { + utils::slog.d << " "; } - bool visitAggregate(TVisit visit, TIntermAggregate* node) override { - return closure(visit, node); - } -}; +} -void textureLodBias(TIntermediate* intermediate, TIntermNode* root, - const char* entryPointSignatureish, const char* lodBiasSymbolName) { - - // First, find the "lodBias" symbol and entry point - const std::string functionName{ entryPointSignatureish }; - TIntermSymbol* pIntermSymbolLodBias = nullptr; - TIntermNode* pEntryPointRoot = nullptr; - TraverserAdapter findLodBiasSymbol( - [&](TVisit visit, TIntermAggregate* node) { - if (node->getOp() == glslang::EOpSequence) { - return true; - } - if (node->getOp() == glslang::EOpFunction) { - if (node->getName().rfind(functionName, 0) == 0) { - pEntryPointRoot = node; - } - return false; - } - if (node->getOp() == glslang::EOpLinkerObjects) { - for (TIntermNode* item: node->getSequence()) { - TIntermSymbol* symbol = item->getAsSymbolNode(); - if (symbol && symbol->getBasicType() == TBasicType::EbtFloat) { - if (symbol->getName() == lodBiasSymbolName) { - pIntermSymbolLodBias = symbol; - break; - } - } - } - } - return true; - }); - root->traverse(&findLodBiasSymbol); - - if (!pEntryPointRoot) { - // This can happen if the material doesn't have user defined code, - // e.g. with the depth material. We just do nothing then. - return; - } +bool NodeToString::visitBinary(TVisit, TIntermBinary* node) { + pad(); + utils::slog.d << "Binary " << to_string(node->getOp()) << utils::io::endl; + return true; +} - if (!pIntermSymbolLodBias) { - // something went wrong - utils::slog.e << "lod bias ignored because \"" << lodBiasSymbolName << "\" was not found!" - << utils::io::endl; - return; - } +bool NodeToString::visitUnary(TVisit, TIntermUnary* node) { + pad(); + utils::slog.d << "Unary " << to_string(node->getOp()) << utils::io::endl; + return true; +} - // add lod bias to texture calls - TraverserAdapter addLodBiasToTextureCalls( - [&](TVisit visit, TIntermAggregate* node) { - // skip everything that's not a texture() call - if (node->getOp() != glslang::EOpTexture) { - return true; - } - - TIntermSequence& sequence = node->getSequence(); - - // first check that we have the correct sampler - TIntermTyped* pTyped = sequence[0]->getAsTyped(); - if (!pTyped) { - return false; - } - - TSampler const& sampler = pTyped->getType().getSampler(); - if (sampler.isArrayed() && sampler.isShadow()) { - // sampler2DArrayShadow is not supported - return false; - } - - // Then add the lod bias to the texture() call - if (sequence.size() == 2) { - // we only have 2 parameters, add the 3rd one - TIntermSymbol* symbol = intermediate->addSymbol(*pIntermSymbolLodBias); - sequence.push_back(symbol); - } else if (sequence.size() == 3) { - // load bias is already specified - TIntermSymbol* symbol = intermediate->addSymbol(*pIntermSymbolLodBias); - TIntermTyped* pAdd = intermediate->addBinaryMath(TOperator::EOpAdd, - sequence[2]->getAsTyped(), symbol, - node->getLoc()); - sequence[2] = pAdd; - } +bool NodeToString::visitAggregate(TVisit, TIntermAggregate* node) { + pad(); + utils::slog.d << "Aggregate " << to_string(node->getOp()); + utils::slog.d << " " << node->getName().c_str(); + utils::slog.d << utils::io::endl; + return true; +} - return false; - }); - // we need to run this only from the user's main entry point - pEntryPointRoot->traverse(&addLodBiasToTextureCalls); +bool NodeToString::visitSelection(TVisit, TIntermSelection*) { + pad(); + utils::slog.d << "Selection " << utils::io::endl; + return true; +} + +void NodeToString::visitConstantUnion(TIntermConstantUnion*) { + pad(); + utils::slog.d << "ConstantUnion " << utils::io::endl; +} + +void NodeToString::visitSymbol(TIntermSymbol* node) { + pad(); + utils::slog.d << "Symbol " << node->getAsSymbolNode()->getName().c_str() << utils::io::endl; +} + +bool NodeToString::visitLoop(TVisit, TIntermLoop*) { + pad(); + utils::slog.d << "Loop " << utils::io::endl; + return true; +} + +bool NodeToString::visitBranch(TVisit, TIntermBranch* branch) { + pad(); + utils::slog.d << "Branch " << to_string(branch->getFlowOp()) << utils::io::endl; + return true; +} + +bool NodeToString::visitSwitch(TVisit, TIntermSwitch*) { + utils::slog.d << "Binary " << utils::io::endl; + return true; } } // namespace ASTHelpers diff --git a/libs/filamat/src/sca/ASTHelpers.h b/libs/filamat/src/sca/ASTHelpers.h index b4e49831583..19ec1ce01e9 100644 --- a/libs/filamat/src/sca/ASTHelpers.h +++ b/libs/filamat/src/sca/ASTHelpers.h @@ -17,18 +17,28 @@ #ifndef TNT_SCAHELPERS_H_H #define TNT_SCAHELPERS_H_H -#include #include #include #include -#include "GLSLTools.h" - class TIntermNode; -using namespace filamat; - -namespace ASTUtils { +namespace ASTHelpers { + +class NodeToString : public glslang::TIntermTraverser { + void pad(); +public: + using TVisit = glslang::TVisit; + bool visitBinary(TVisit, glslang::TIntermBinary* node) override; + bool visitUnary(TVisit, glslang::TIntermUnary* node) override; + bool visitAggregate(TVisit, glslang::TIntermAggregate* node) override; + bool visitSelection(TVisit, glslang::TIntermSelection*) override; + void visitConstantUnion(glslang::TIntermConstantUnion*) override; + void visitSymbol(glslang::TIntermSymbol* node) override; + bool visitLoop(TVisit, glslang::TIntermLoop*) override; + bool visitBranch(TVisit, glslang::TIntermBranch*) override; + bool visitSwitch(TVisit, glslang::TIntermSwitch*) override; +}; // Extract the name of a function from its glslang mangled signature. e.g: Returns prepareMaterial // for input "prepareMaterial(struct-MaterialInputs-vf4-f1-f1-f1-f1-vf41;". @@ -48,18 +58,14 @@ glslang::TIntermAggregate* getFunctionBySignature(std::string_view functionSigna // This function is useful when looking for a function with variable signature. e.g: prepareMaterial // and material functions take a struct which can vary in size depending on the property of the // material processed. -glslang::TIntermAggregate* getFunctionByNameOnly(std::string_view functionName, TIntermNode& root) - noexcept; +glslang::TIntermAggregate* getFunctionByNameOnly(std::string_view functionName, + TIntermNode& root) noexcept; // Recursively traverse the AST function node provided, looking for a call to the specified // function. Traverse all function calls found in each function. bool isFunctionCalled(std::string_view functionName, TIntermNode& functionNode, TIntermNode& rootNode) noexcept; -// Traverse the function node provided and record all symbol writes operation and all function call -// involving symbols. -void traceSymbols(TIntermNode& functionNode, std::deque& vector); - struct FunctionParameter { enum Qualifier { IN, OUT, INOUT, CONST }; std::string name; @@ -68,13 +74,12 @@ struct FunctionParameter { }; // Traverse function definition node, looking for parameters and populate params vector. -void getFunctionParameters(glslang::TIntermAggregate* func, std::vector& output) - noexcept; +void getFunctionParameters(glslang::TIntermAggregate* func, + std::vector& output) noexcept; -// add lod bias to texture() calls -void textureLodBias(glslang::TIntermediate* intermediate, TIntermNode* root, - const char* entryPointSignatureish, const char* lodBiasSymbolName); +std::string to_string(glslang::TOperator op); +std::string getIndexDirectStructString(const glslang::TIntermBinary& node); } // namespace ASTutils #endif //TNT_SCAHELPERS_H_H diff --git a/libs/filamat/src/sca/GLSLTools.cpp b/libs/filamat/src/sca/GLSLTools.cpp index 45c5765f831..eeecf89efba 100644 --- a/libs/filamat/src/sca/GLSLTools.cpp +++ b/libs/filamat/src/sca/GLSLTools.cpp @@ -16,14 +16,12 @@ #include "GLSLTools.h" +#include #include #include -#include "../shaders/MaterialInfo.h" #include -#include "filamat/Enums.h" - #include "ASTHelpers.h" // GLSLANG headers @@ -34,7 +32,6 @@ using namespace utils; using namespace glslang; -using namespace ASTUtils; using namespace filament::backend; namespace filamat { @@ -48,6 +45,8 @@ GLSLangCleaner::~GLSLangCleaner() { SetThreadPoolAllocator(mAllocator); } +// ------------------------------------------------------------------------------------------------ + static std::string_view getMaterialFunctionName(MaterialBuilder::MaterialDomain domain) noexcept { switch (domain) { case MaterialBuilder::MaterialDomain::SURFACE: @@ -59,10 +58,111 @@ static std::string_view getMaterialFunctionName(MaterialBuilder::MaterialDomain } }; +// ------------------------------------------------------------------------------------------------ + +static const TIntermTyped* findLValueBase(const TIntermTyped* node, Symbol& symbol); + +class SymbolsTracer : public TIntermTraverser { +public: + explicit SymbolsTracer(std::deque& events) : mEvents(events) { + } + + // Function call site. + bool visitAggregate(TVisit, TIntermAggregate* node) override { + if (node->getOp() != EOpFunctionCall) { + return true; + } + + // Find function name. + std::string const functionName = node->getName().c_str(); + + // Iterate on function parameters. + for (size_t parameterIdx = 0; parameterIdx < node->getSequence().size(); parameterIdx++) { + TIntermNode* parameter = node->getSequence().at(parameterIdx); + // Parameter is not a pure symbol. It is indexed or swizzled. + if (parameter->getAsBinaryNode()) { + Symbol symbol; + std::vector events; + const TIntermTyped* n = findLValueBase(parameter->getAsBinaryNode(), symbol); + if (n != nullptr && n->getAsSymbolNode() != nullptr) { + const TString& symbolTString = n->getAsSymbolNode()->getName(); + symbol.setName(symbolTString.c_str()); + events.push_back(symbol); + } + + for (Symbol symbol : events) { + Access const fCall = { Access::FunctionCall, functionName, parameterIdx }; + symbol.add(fCall); + mEvents.push_back(symbol); + } + } + // Parameter is a pure symbol. + if (parameter->getAsSymbolNode()) { + Symbol s(parameter->getAsSymbolNode()->getName().c_str()); + Access const fCall = {Access::FunctionCall, functionName, parameterIdx}; + s.add(fCall); + mEvents.push_back(s); + } + } + + return true; + } + + // Assign operations + bool visitBinary(TVisit, TIntermBinary* node) override { + TOperator const op = node->getOp(); + Symbol symbol; + if (op == EOpAssign || op == EOpAddAssign || op == EOpDivAssign || op == EOpSubAssign + || op == EOpMulAssign ) { + const TIntermTyped* n = findLValueBase(node->getLeft(), symbol); + if (n != nullptr && n->getAsSymbolNode() != nullptr) { + const TString& symbolTString = n->getAsSymbolNode()->getName(); + symbol.setName(symbolTString.c_str()); + mEvents.push_back(symbol); + return false; // Don't visit subtree since we just traced it with findLValueBase() + } + } + return true; + } + +private: + std::deque& mEvents; +}; + +// Meant to explore the Lvalue in an assignment. Depth traverse the left child of an assignment +// binary node to find out the symbol and all access applied on it. +static const TIntermTyped* findLValueBase(const TIntermTyped* node, Symbol& symbol) { + do { + // Make sure we have a binary node + const TIntermBinary* binary = node->getAsBinaryNode(); + if (binary == nullptr) { + return node; + } + + // Check Operator + TOperator const op = binary->getOp(); + if (op != EOpIndexDirect && op != EOpIndexIndirect && op != EOpIndexDirectStruct + && op != EOpVectorSwizzle && op != EOpMatrixSwizzle) { + return nullptr; + } + Access access; + if (op == EOpIndexDirectStruct) { + access.string = ASTHelpers::getIndexDirectStructString(*binary); + access.type = Access::DirectIndexForStruct; + } else { + access.string = ASTHelpers::to_string(op) ; + access.type = Access::Swizzling; + } + symbol.add(access); + node = node->getAsBinaryNode()->getLeft(); + } while (true); +} + +// ------------------------------------------------------------------------------------------------ + bool GLSLTools::analyzeComputeShader(const std::string& shaderCode, filament::backend::ShaderModel model, MaterialBuilder::TargetApi targetApi, - MaterialBuilder::TargetLanguage targetLanguage, - MaterialInfo const& info) noexcept { + MaterialBuilder::TargetLanguage targetLanguage) noexcept { // Parse to check syntax and semantic. const char* shaderCString = shaderCode.c_str(); @@ -70,13 +170,13 @@ bool GLSLTools::analyzeComputeShader(const std::string& shaderCode, TShader tShader(EShLanguage::EShLangCompute); tShader.setStrings(&shaderCString, 1); - GLSLangCleaner cleaner; + GLSLangCleaner const cleaner; const int version = getGlslDefaultVersion(model); - EShMessages msg = glslangFlagsFromTargetApi(targetApi, targetLanguage); - bool ok = tShader.parse(&DefaultTBuiltInResource, version, false, msg); + EShMessages const msg = glslangFlagsFromTargetApi(targetApi, targetLanguage); + bool const ok = tShader.parse(&DefaultTBuiltInResource, version, false, msg); if (!ok) { utils::slog.e << "ERROR: Unable to parse compute shader:" << utils::io::endl; - utils::slog.e << tShader.getInfoLog() << utils::io::flush; + utils::slog.e << tShader.getInfoLog() << utils::io::endl; return false; } @@ -84,7 +184,7 @@ bool GLSLTools::analyzeComputeShader(const std::string& shaderCode, TIntermNode* root = tShader.getIntermediate()->getTreeRoot(); // Check there is a material function definition in this shader. - TIntermNode* materialFctNode = ASTUtils::getFunctionByNameOnly(materialFunctionName, *root); + TIntermNode* materialFctNode = ASTHelpers::getFunctionByNameOnly(materialFunctionName, *root); if (materialFctNode == nullptr) { utils::slog.e << "ERROR: Invalid compute shader:" << utils::io::endl; utils::slog.e << "ERROR: Unable to find " << materialFunctionName << "() function" << utils::io::endl; @@ -94,10 +194,11 @@ bool GLSLTools::analyzeComputeShader(const std::string& shaderCode, return true; } -bool GLSLTools::analyzeFragmentShader(const std::string& shaderCode, +std::optional GLSLTools::analyzeFragmentShader( + const std::string& shaderCode, filament::backend::ShaderModel model, MaterialBuilder::MaterialDomain materialDomain, MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage, - bool hasCustomSurfaceShading, MaterialInfo const& info) noexcept { + bool hasCustomSurfaceShading) noexcept { assert_invariant(materialDomain != MaterialBuilder::MaterialDomain::COMPUTE); @@ -107,68 +208,72 @@ bool GLSLTools::analyzeFragmentShader(const std::string& shaderCode, TShader tShader(EShLanguage::EShLangFragment); tShader.setStrings(&shaderCString, 1); - GLSLangCleaner cleaner; + GLSLangCleaner const cleaner; const int version = getGlslDefaultVersion(model); - EShMessages msg = glslangFlagsFromTargetApi(targetApi, targetLanguage); - bool ok = tShader.parse(&DefaultTBuiltInResource, version, false, msg); + EShMessages const msg = glslangFlagsFromTargetApi(targetApi, targetLanguage); + bool const ok = tShader.parse(&DefaultTBuiltInResource, version, false, msg); if (!ok) { utils::slog.e << "ERROR: Unable to parse fragment shader:" << utils::io::endl; - utils::slog.e << tShader.getInfoLog() << utils::io::flush; - return false; + utils::slog.e << tShader.getInfoLog() << utils::io::endl; + return std::nullopt; } auto materialFunctionName = getMaterialFunctionName(materialDomain); TIntermNode* root = tShader.getIntermediate()->getTreeRoot(); // Check there is a material function definition in this shader. - TIntermNode* materialFctNode = ASTUtils::getFunctionByNameOnly(materialFunctionName, *root); + TIntermNode* materialFctNode = ASTHelpers::getFunctionByNameOnly(materialFunctionName, *root); if (materialFctNode == nullptr) { utils::slog.e << "ERROR: Invalid fragment shader:" << utils::io::endl; utils::slog.e << "ERROR: Unable to find " << materialFunctionName << "() function" << utils::io::endl; - return false; + return std::nullopt; } + FragmentShaderInfo result { + .userMaterialHasCustomDepth = GLSLTools::hasCustomDepth(root, materialFctNode) + }; + // If this is a post-process material, at this point we've successfully met all the // requirements. if (materialDomain == MaterialBuilder::MaterialDomain::POST_PROCESS) { - return true; + return result; } // Check there is a prepareMaterial function definition in this shader. TIntermAggregate* prepareMaterialNode = - ASTUtils::getFunctionByNameOnly("prepareMaterial", *root); + ASTHelpers::getFunctionByNameOnly("prepareMaterial", *root); if (prepareMaterialNode == nullptr) { utils::slog.e << "ERROR: Invalid fragment shader:" << utils::io::endl; utils::slog.e << "ERROR: Unable to find prepareMaterial() function" << utils::io::endl; - return false; + return std::nullopt; } - std::string_view prepareMaterialSignature = prepareMaterialNode->getName(); - bool prepareMaterialCalled = isFunctionCalled(prepareMaterialSignature, - *materialFctNode, *root); + std::string_view const prepareMaterialSignature = prepareMaterialNode->getName(); + bool const prepareMaterialCalled = ASTHelpers::isFunctionCalled( + prepareMaterialSignature, *materialFctNode, *root); if (!prepareMaterialCalled) { utils::slog.e << "ERROR: Invalid fragment shader:" << utils::io::endl; utils::slog.e << "ERROR: prepareMaterial() is not called" << utils::io::endl; - return false; + return std::nullopt; } if (hasCustomSurfaceShading) { - materialFctNode = ASTUtils::getFunctionByNameOnly("surfaceShading", *root); + materialFctNode = ASTHelpers::getFunctionByNameOnly("surfaceShading", *root); if (materialFctNode == nullptr) { utils::slog.e << "ERROR: Invalid fragment shader:" << utils::io::endl; utils::slog.e << "ERROR: Unable to find surfaceShading() function" << utils::io::endl; - return false; + return std::nullopt; } } - return true; + return result; } bool GLSLTools::analyzeVertexShader(const std::string& shaderCode, filament::backend::ShaderModel model, MaterialBuilder::MaterialDomain materialDomain, MaterialBuilder::TargetApi targetApi, - MaterialBuilder::TargetLanguage targetLanguage, MaterialInfo const& info) noexcept { + MaterialBuilder::TargetLanguage targetLanguage) noexcept { assert_invariant(materialDomain != MaterialBuilder::MaterialDomain::COMPUTE); @@ -183,19 +288,19 @@ bool GLSLTools::analyzeVertexShader(const std::string& shaderCode, TShader tShader(EShLanguage::EShLangVertex); tShader.setStrings(&shaderCString, 1); - GLSLangCleaner cleaner; + GLSLangCleaner const cleaner; const int version = getGlslDefaultVersion(model); - EShMessages msg = glslangFlagsFromTargetApi(targetApi, targetLanguage); - bool ok = tShader.parse(&DefaultTBuiltInResource, version, false, msg); + EShMessages const msg = glslangFlagsFromTargetApi(targetApi, targetLanguage); + bool const ok = tShader.parse(&DefaultTBuiltInResource, version, false, msg); if (!ok) { utils::slog.e << "ERROR: Unable to parse vertex shader" << utils::io::endl; - utils::slog.e << tShader.getInfoLog() << utils::io::flush; + utils::slog.e << tShader.getInfoLog() << utils::io::endl; return false; } TIntermNode* root = tShader.getIntermediate()->getTreeRoot(); // Check there is a material function definition in this shader. - TIntermNode* materialFctNode = ASTUtils::getFunctionByNameOnly("materialVertex", *root); + TIntermNode* materialFctNode = ASTHelpers::getFunctionByNameOnly("materialVertex", *root); if (materialFctNode == nullptr) { utils::slog.e << "ERROR: Invalid vertex shader" << utils::io::endl; utils::slog.e << "ERROR: Unable to find materialVertex() function" << utils::io::endl; @@ -234,11 +339,11 @@ bool GLSLTools::findProperties( TShader tShader(getShaderStage(type)); tShader.setStrings(&shaderCString, 1); - GLSLangCleaner cleaner; + GLSLangCleaner const cleaner; const int version = getGlslDefaultVersion(model); - EShMessages msg = glslangFlagsFromTargetApi(targetApi, targetLanguage); + EShMessages const msg = glslangFlagsFromTargetApi(targetApi, targetLanguage); const TBuiltInResource* builtins = &DefaultTBuiltInResource; - bool ok = tShader.parse(builtins, version, false, msg); + bool const ok = tShader.parse(builtins, version, false, msg); if (!ok) { // Even with all properties set the shader doesn't build. This is likely a syntax error // with user provided code. @@ -248,11 +353,11 @@ bool GLSLTools::findProperties( TIntermNode* rootNode = tShader.getIntermediate()->getTreeRoot(); - std::string_view mainFunction(type == ShaderStage::FRAGMENT ? + std::string_view const mainFunction(type == ShaderStage::FRAGMENT ? "material" : "materialVertex"); - TIntermAggregate* functionMaterialDef = ASTUtils::getFunctionByNameOnly(mainFunction, *rootNode); - std::string_view materialFullyQualifiedName = functionMaterialDef->getName(); + TIntermAggregate* functionMaterialDef = ASTHelpers::getFunctionByNameOnly(mainFunction, *rootNode); + std::string_view const materialFullyQualifiedName = functionMaterialDef->getName(); return findPropertyWritesOperations(materialFullyQualifiedName, 0, rootNode, properties); } @@ -260,15 +365,15 @@ bool GLSLTools::findPropertyWritesOperations(std::string_view functionName, size TIntermNode* rootNode, MaterialBuilder::PropertyList& properties) const noexcept { glslang::TIntermAggregate* functionMaterialDef = - ASTUtils::getFunctionBySignature(functionName, *rootNode); + ASTHelpers::getFunctionBySignature(functionName, *rootNode); if (functionMaterialDef == nullptr) { utils::slog.e << "Unable to find function '" << functionName << "' definition." << utils::io::endl; return false; } - std::vector functionMaterialParameters; - ASTUtils::getFunctionParameters(functionMaterialDef, functionMaterialParameters); + std::vector functionMaterialParameters; + ASTHelpers::getFunctionParameters(functionMaterialDef, functionMaterialParameters); if (functionMaterialParameters.size() <= parameterIdx) { utils::slog.e << "Unable to find function '" << functionName << "' parameterIndex: " << @@ -283,8 +388,10 @@ bool GLSLTools::findPropertyWritesOperations(std::string_view functionName, size // Make sure the parameter is either out or inout. Othwerise (const or in), there is no point // tracing its usage. - FunctionParameter::Qualifier qualifier = functionMaterialParameters.at(parameterIdx).qualifier; - if (qualifier == FunctionParameter::IN || qualifier == FunctionParameter::CONST) { + ASTHelpers::FunctionParameter::Qualifier const qualifier = + functionMaterialParameters.at(parameterIdx).qualifier; + if (qualifier == ASTHelpers::FunctionParameter::IN || + qualifier == ASTHelpers::FunctionParameter::CONST) { return true; } @@ -292,7 +399,7 @@ bool GLSLTools::findPropertyWritesOperations(std::string_view functionName, size findSymbolsUsage(functionName, *rootNode, symbols); // Iterate over symbols to see if the parameter we are interested in what written. - std::string parameterName = functionMaterialParameters.at(parameterIdx).name; + std::string const parameterName = functionMaterialParameters.at(parameterIdx).name; for (Symbol symbol: symbols) { // This is not the symbol we are interested in. if (symbol.getName() != parameterName) { @@ -323,16 +430,17 @@ void GLSLTools::scanSymbolForProperty(Symbol& symbol, // if the parameter is out or inout. if (symbol.hasDirectIndexForStruct()) { TIntermAggregate* functionCall = - ASTUtils::getFunctionBySignature(access.string, *rootNode); - std::vector functionCallParameters; - ASTUtils::getFunctionParameters(functionCall, functionCallParameters); - - FunctionParameter& parameter = functionCallParameters.at(access.parameterIdx); - if (parameter.qualifier == FunctionParameter::OUT || parameter.qualifier == - FunctionParameter::INOUT) { + ASTHelpers::getFunctionBySignature(access.string, *rootNode); + std::vector functionCallParameters; + ASTHelpers::getFunctionParameters(functionCall, functionCallParameters); + + ASTHelpers::FunctionParameter const& parameter = + functionCallParameters.at(access.parameterIdx); + if (parameter.qualifier == ASTHelpers::FunctionParameter::OUT || + parameter.qualifier == ASTHelpers::FunctionParameter::INOUT) { const std::string& propName = symbol.getDirectIndexStructName(); if (Enums::isValid(propName)) { - MaterialBuilder::Property p = Enums::toEnum(propName); + MaterialBuilder::Property const p = Enums::toEnum(propName); properties[size_t(p)] = true; } } @@ -346,7 +454,7 @@ void GLSLTools::scanSymbolForProperty(Symbol& symbol, // If DirectIndexForStruct, issue the appropriate setProperty. if (access.type == Access::Type::DirectIndexForStruct) { if (Enums::isValid(access.string)) { - MaterialBuilder::Property p = Enums::toEnum(access.string); + MaterialBuilder::Property const p = Enums::toEnum(access.string); properties[size_t(p)] = true; } return; @@ -358,8 +466,9 @@ void GLSLTools::scanSymbolForProperty(Symbol& symbol, bool GLSLTools::findSymbolsUsage(std::string_view functionSignature, TIntermNode& root, std::deque& symbols) noexcept { - TIntermNode* functionAST = ASTUtils::getFunctionBySignature(functionSignature, root); - ASTUtils::traceSymbols(*functionAST, symbols); + TIntermNode* functionAST = ASTHelpers::getFunctionBySignature(functionSignature, root); + SymbolsTracer variableTracer(symbols); + functionAST->traverse(&variableTracer); return true; } @@ -381,7 +490,12 @@ std::pair GLSLTools::getShadingLanguageVersion(ShaderModel model, using FeatureLevel = filament::backend::FeatureLevel; switch (model) { case ShaderModel::MOBILE: - return { featureLevel >= FeatureLevel::FEATURE_LEVEL_2 ? 310 : 300, true }; + switch (featureLevel) { + case FeatureLevel::FEATURE_LEVEL_0: return { 100, true }; + case FeatureLevel::FEATURE_LEVEL_1: return { 300, true }; + case FeatureLevel::FEATURE_LEVEL_2: return { 310, true }; + case FeatureLevel::FEATURE_LEVEL_3: return { 310, true }; + } case ShaderModel::DESKTOP: return { featureLevel >= FeatureLevel::FEATURE_LEVEL_2 ? 430 : 410, false }; } @@ -429,22 +543,197 @@ void GLSLTools::prepareShaderParser(MaterialBuilder::TargetApi targetApi, case MaterialBuilderBase::TargetApi::VULKAN: case MaterialBuilderBase::TargetApi::METAL: shader.setEnvInput(EShSourceGlsl, stage, EShClientVulkan, version); - shader.setEnvClient(EShClientVulkan, EShTargetVulkan_1_0); + shader.setEnvClient(EShClientVulkan, EShTargetVulkan_1_1); break; case MaterialBuilderBase::TargetApi::ALL: // can't happen break; } - shader.setEnvTarget(EShTargetSpv, EShTargetSpv_1_0); + shader.setEnvTarget(EShTargetSpv, EShTargetSpv_1_3); } } void GLSLTools::textureLodBias(TShader& shader) { TIntermediate* intermediate = shader.getIntermediate(); TIntermNode* root = intermediate->getTreeRoot(); - ASTUtils::textureLodBias(intermediate, root, + textureLodBias(intermediate, root, "material(struct-MaterialInputs", "filament_lodBias"); } +template +class AggregateTraverserAdapter : public glslang::TIntermTraverser { + F closure; +public: + explicit AggregateTraverserAdapter(F closure) + : TIntermTraverser(true, false, false, false), + closure(closure) { } + + bool visitAggregate(glslang::TVisit visit, glslang::TIntermAggregate* node) override { + return closure(visit, node); + } +}; + +template +void traverseAggregate(TIntermNode* root, F&& closure) { + AggregateTraverserAdapter adapter(std::forward>(closure)); + root->traverse(&adapter); +} + +void GLSLTools::textureLodBias(TIntermediate* intermediate, TIntermNode* root, + const char* entryPointSignatureish, const char* lodBiasSymbolName) noexcept { + + // First, find the "lodBias" symbol and entry point + const std::string functionName{ entryPointSignatureish }; + TIntermSymbol* pIntermSymbolLodBias = nullptr; + TIntermNode* pEntryPointRoot = nullptr; + traverseAggregate(root, + [&](TVisit, TIntermAggregate* node) { + if (node->getOp() == glslang::EOpSequence) { + return true; + } + if (node->getOp() == glslang::EOpFunction) { + if (node->getName().rfind(functionName, 0) == 0) { + pEntryPointRoot = node; + } + return false; + } + if (node->getOp() == glslang::EOpLinkerObjects) { + for (TIntermNode* item: node->getSequence()) { + TIntermSymbol* symbol = item->getAsSymbolNode(); + if (symbol && symbol->getBasicType() == TBasicType::EbtFloat) { + if (symbol->getName() == lodBiasSymbolName) { + pIntermSymbolLodBias = symbol; + break; + } + } + } + } + return true; + }); + + if (!pEntryPointRoot) { + // This can happen if the material doesn't have user defined code, + // e.g. with the depth material. We just do nothing then. + return; + } + + if (!pIntermSymbolLodBias) { + // something went wrong + utils::slog.e << "lod bias ignored because \"" << lodBiasSymbolName << "\" was not found!" + << utils::io::endl; + return; + } + + // add lod bias to texture calls + // we need to run this only from the user's main entry point + traverseAggregate(pEntryPointRoot, + [&](TVisit, TIntermAggregate* node) { + // skip everything that's not a texture() call + if (node->getOp() != glslang::EOpTexture) { + return true; + } + + TIntermSequence& sequence = node->getSequence(); + + // first check that we have the correct sampler + TIntermTyped* pTyped = sequence[0]->getAsTyped(); + if (!pTyped) { + return false; + } + + TSampler const& sampler = pTyped->getType().getSampler(); + if (sampler.isArrayed() && sampler.isShadow()) { + // sampler2DArrayShadow is not supported + return false; + } + + // Then add the lod bias to the texture() call + if (sequence.size() == 2) { + // we only have 2 parameters, add the 3rd one + TIntermSymbol* symbol = intermediate->addSymbol(*pIntermSymbolLodBias); + sequence.push_back(symbol); + } else if (sequence.size() == 3) { + // load bias is already specified + TIntermSymbol* symbol = intermediate->addSymbol(*pIntermSymbolLodBias); + TIntermTyped* pAdd = intermediate->addBinaryMath(TOperator::EOpAdd, + sequence[2]->getAsTyped(), symbol, + node->getLoc()); + sequence[2] = pAdd; + } + + return false; + }); +} + +bool GLSLTools::hasCustomDepth(TIntermNode* root, TIntermNode* entryPoint) { + + class HasCustomDepth : public glslang::TIntermTraverser { + using TVisit = glslang::TVisit; + TIntermNode* const root; // shader root + bool hasCustomDepth = false; + + public: + bool operator()(TIntermNode* entryPoint) noexcept { + entryPoint->traverse(this); + return hasCustomDepth; + } + + explicit HasCustomDepth(TIntermNode* root) : root(root) {} + + bool visitAggregate(TVisit, TIntermAggregate* node) override { + if (node->getOp() == EOpFunctionCall) { + // we have a function call, "recurse" into it to see if we call discard or + // write to gl_FragDepth. + + // find the entry point corresponding to that call + TIntermNode* const entryPoint = + ASTHelpers::getFunctionBySignature(node->getName(), *root); + + // this should never happen because the shader has already been validated + assert_invariant(entryPoint); + + hasCustomDepth = hasCustomDepth || HasCustomDepth{ root }(entryPoint); + + return !hasCustomDepth; + } + return true; + } + + // this checks if we write gl_FragDepth + bool visitBinary(TVisit, glslang::TIntermBinary* node) override { + TOperator const op = node->getOp(); + Symbol symbol; + if (op == EOpAssign || + op == EOpAddAssign || + op == EOpDivAssign || + op == EOpSubAssign || + op == EOpMulAssign) { + const TIntermTyped* n = findLValueBase(node->getLeft(), symbol); + if (n != nullptr && n->getAsSymbolNode() != nullptr) { + const TString& symbolTString = n->getAsSymbolNode()->getName(); + if (symbolTString == "gl_FragDepth") { + hasCustomDepth = true; + } + // Don't visit subtree since we just traced it with findLValueBase() + return false; + } + } + return true; + } + + // this check if we call `discard` + bool visitBranch(TVisit, glslang::TIntermBranch* branch) override { + if (branch->getFlowOp() == EOpKill) { + hasCustomDepth = true; + return false; + } + return true; + } + + } hasCustomDepth(root); + + return hasCustomDepth(entryPoint); +} + } // namespace filamat diff --git a/libs/filamat/src/sca/GLSLTools.h b/libs/filamat/src/sca/GLSLTools.h index 16d3092a98d..1c7cf169db5 100644 --- a/libs/filamat/src/sca/GLSLTools.h +++ b/libs/filamat/src/sca/GLSLTools.h @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -27,6 +28,7 @@ #include class TIntermNode; + namespace glslang { class TPoolAllocator; } @@ -43,7 +45,7 @@ struct Access { size_t parameterIdx = 0; // Only used when type == FunctionCall; }; -// Record of symbol interactions in a statment involving a symbol. Can track a sequence of up to +// Record of symbol interactions in a statement involving a symbol. Can track a sequence of up to // (and in this order): // Function call: foo(material) // DirectIndexForStruct e.g: material.baseColor @@ -82,12 +84,9 @@ class Symbol { } bool hasDirectIndexForStruct() const noexcept { - for (const Access& access : mAccesses) { - if (access.type == Access::Type::DirectIndexForStruct) { - return true; - } - } - return false; + return std::any_of(mAccesses.begin(), mAccesses.end(), [](auto&& access) { + return access.type == Access::Type::DirectIndexForStruct; + }); } std::string getDirectIndexStructName() const noexcept { @@ -118,25 +117,28 @@ class GLSLTools { static void init(); static void shutdown(); + struct FragmentShaderInfo { + bool userMaterialHasCustomDepth = false; + }; + // Return true if: // The shader is syntactically and semantically valid AND // The shader features a material() function AND // The shader features a prepareMaterial() function AND // prepareMaterial() is called at some point in material() call chain. - static bool analyzeFragmentShader(const std::string& shaderCode, + static std::optional analyzeFragmentShader(const std::string& shaderCode, filament::backend::ShaderModel model, MaterialBuilder::MaterialDomain materialDomain, MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage, - bool hasCustomSurfaceShading, MaterialInfo const& info) noexcept; + bool hasCustomSurfaceShading) noexcept; static bool analyzeVertexShader(const std::string& shaderCode, filament::backend::ShaderModel model, MaterialBuilder::MaterialDomain materialDomain, MaterialBuilder::TargetApi targetApi, - MaterialBuilder::TargetLanguage targetLanguage, MaterialInfo const& info) noexcept; + MaterialBuilder::TargetLanguage targetLanguage) noexcept; static bool analyzeComputeShader(const std::string& shaderCode, filament::backend::ShaderModel model, MaterialBuilder::TargetApi targetApi, - MaterialBuilder::TargetLanguage targetLanguage, - MaterialInfo const& info) noexcept; + MaterialBuilder::TargetLanguage targetLanguage) noexcept; // Public for unit tests. using Property = MaterialBuilder::Property; @@ -171,9 +173,10 @@ class GLSLTools { static void textureLodBias(glslang::TShader& shader); -private: + static bool hasCustomDepth(TIntermNode* root, TIntermNode* entryPoint); +private: // Traverse a function definition and retrieve all symbol written to and all symbol passed down // in a function call. // Start in the function matching the signature provided and follow all out and inout calls. @@ -194,6 +197,9 @@ class GLSLTools { void scanSymbolForProperty(Symbol& symbol, TIntermNode* rootNode, MaterialBuilder::PropertyList& properties) const noexcept; + // add lod bias to texture() calls + static void textureLodBias(glslang::TIntermediate* intermediate, TIntermNode* root, + const char* entryPointSignatureish, const char* lodBiasSymbolName) noexcept; }; } // namespace filamat diff --git a/libs/filamat/src/sca/GLSLToolsLite.cpp b/libs/filamat/src/sca/GLSLToolsLite.cpp deleted file mode 100644 index 2d3b421322a..00000000000 --- a/libs/filamat/src/sca/GLSLToolsLite.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "GLSLToolsLite.h" - -#include - -#include - -using namespace filament::backend; - -namespace filamat { - -static bool isVariableCharacter(char c) { - return (c >= 'A' && c <= 'Z') || - (c >= 'a' && c <= 'z') || - (c >= '0' && c <= '9') || - (c == '_'); -} - -static bool isWhitespace(char c) { - return (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v'); -} - -static std::string stripComments(const std::string& code) { - char* temp = (char*) malloc(code.size() + 1); - - size_t r = 0; - bool insideSlashSlashComment = false, insideMultilineComment = false; - - for (size_t loc = 0; loc < code.size(); loc++) { - char c = code[loc]; - char lookahead = (loc + 1) < code.size() ? code[loc + 1] : 0; - - // Handle slash slash comments. - if (!insideSlashSlashComment && c == '/' && lookahead == '/') { - insideSlashSlashComment = true; - } - if (insideSlashSlashComment && c == '\n') { - insideSlashSlashComment = false; - } - - // Handle multiline comments. - if (!insideMultilineComment && c == '/' && lookahead == '*') { - insideMultilineComment = true; - } - if (insideMultilineComment && c == '*' && lookahead == '/') { - insideMultilineComment = false; - } - - if (insideSlashSlashComment || insideMultilineComment) { - continue; - } - - temp[r++] = c; - } - - temp[r] = 0; - std::string result(temp); - free(temp); - - return result; -} - -bool GLSLToolsLite::findProperties( - filament::backend::ShaderStage type, - const utils::CString& material, - MaterialBuilder::PropertyList& properties) const noexcept { - if (material.empty()) { - return true; - } - - const std::string shaderCode = stripComments(material.c_str()); - - size_t start = 0, end = 0; - - const auto p = Enums::map(); - - // Find all occurrences of "material.someProperty" in the shader string. - // TODO: We should find the name of the structure and search for .someProperty - size_t loc; - while ((loc = shaderCode.find("material", start)) != std::string::npos) { - // Set start to the index of the first character after "material" - start = loc + 8; - - // Eat up any whitespace after "material" - while (start != shaderCode.length() && isWhitespace(shaderCode[start])) { - start++; - } - - // If the next character isn't a '.', then this isn't a property set. - if (start == shaderCode.length() || shaderCode[start] != '.') { - continue; - } - start++; - - // Eat up any whitespace after the '.'. - while (start != shaderCode.length() && isWhitespace(shaderCode[start])) { - start++; - } - - // Increment end until we reach a non-variable character. - end = start; - while (end != shaderCode.length() && isVariableCharacter(shaderCode[end])) { - end++; - } - - std::string foundProperty = shaderCode.substr(start, end - start); - - // Check to see if this property matches any in the property list. - for (const auto& i : p) { - const std::string& propertySymbol = i.first; - Property prop = i.second; - - if (foundProperty == propertySymbol) { - properties[size_t(prop)] = true; - } - } - } - - return true; -} - -void GLSLToolsLite::removeGoogleLineDirectives(std::string& text) const noexcept { - size_t found; - size_t start = std::string::npos; - while ((found = text.rfind("#line", start)) != std::string::npos) { - // Eat up anything until a newline character. - // If we find a quote character, then this is a Google-style line directive. - size_t c = found + 5; - size_t len = 5; - bool googleStyleDirective = false; - while (c < text.length()) { - if (text[c] == '"') { - googleStyleDirective = true; - } - if (text[c] == '\n') { - len++; - break; - } - len++; - c++; - } - - if (googleStyleDirective) { - text.replace(found, len, ""); - } - - if (found == 0) { - break; - } - start = found - 1; - } -} - -} // namespace filamat diff --git a/libs/filamat/src/sca/GLSLToolsLite.h b/libs/filamat/src/sca/GLSLToolsLite.h deleted file mode 100644 index 3e8a2602002..00000000000 --- a/libs/filamat/src/sca/GLSLToolsLite.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef TNT_GLSLTOOLSLITE_H -#define TNT_GLSLTOOLSLITE_H - -#include - -#include - -#include - -namespace filamat { - -class GLSLToolsLite { -public: - - // Public for unit tests. - using Property = MaterialBuilder::Property; - - /* Guess the properties that the material is using based on a naive text-based search. - * - * In order for this method to detect the usage of a property: - * 1. The MaterialInputs argument to the user-defined material function must be named "material". - * 2. The properties on "material" should be set directly, i.e., not passed via an inout qualifier - * to another function which sets properties (this only works if the argument to the - * function is also named "material"). - */ - bool findProperties( - filament::backend::ShaderStage type, - const utils::CString& material, - MaterialBuilder::PropertyList& properties) const noexcept; - - /* Remove Google-style #line directives from the source string. - * - * Google-style #line directives use quotes to specify file names. For example: - * #line 100 "foobar.h" - */ - void removeGoogleLineDirectives(std::string& text) const noexcept; -}; - -} // namespace filamat - -#endif // TNT_GLSLTOOLSLITE_H diff --git a/libs/filamat/src/sca/builtinResource.h b/libs/filamat/src/sca/builtinResource.h index 53ef69ccc4c..d58f2a9d59a 100644 --- a/libs/filamat/src/sca/builtinResource.h +++ b/libs/filamat/src/sca/builtinResource.h @@ -14,6 +14,8 @@ * limitations under the License. */ +#include "glslang/Include/intermediate.h" + const TBuiltInResource DefaultTBuiltInResource = { /* .MaxLights = */ 32, /* .MaxClipPlanes = */ 6, diff --git a/libs/filamat/src/shaders/CodeGenerator.cpp b/libs/filamat/src/shaders/CodeGenerator.cpp index ee308cff7a0..6c63697bfee 100644 --- a/libs/filamat/src/shaders/CodeGenerator.cpp +++ b/libs/filamat/src/shaders/CodeGenerator.cpp @@ -17,9 +17,12 @@ #include "CodeGenerator.h" #include "MaterialInfo.h" +#include "../PushConstantDefinitions.h" #include "generated/shaders.h" +#include + #include #include @@ -40,26 +43,51 @@ io::sstream& CodeGenerator::generateSeparator(io::sstream& out) { } utils::io::sstream& CodeGenerator::generateProlog(utils::io::sstream& out, ShaderStage stage, - MaterialInfo const& material) const { + MaterialInfo const& material, filament::Variant v) const { switch (mShaderModel) { case ShaderModel::MOBILE: // Vulkan requires version 310 or higher if (mTargetLanguage == TargetLanguage::SPIRV || - material.featureLevel >= FeatureLevel::FEATURE_LEVEL_2) { + mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_2) { // Vulkan requires layout locations on ins and outs, which were not supported - // in the OpenGL 4.1 GLSL profile. + // in ESSL 300 out << "#version 310 es\n\n"; } else { - out << "#version 300 es\n\n"; + if (mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_1) { + out << "#version 300 es\n\n"; + } else { + out << "#version 100\n\n"; + } } if (material.hasExternalSamplers) { - out << "#extension GL_OES_EGL_image_external_essl3 : require\n\n"; + if (mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_1) { + out << "#extension GL_OES_EGL_image_external_essl3 : require\n\n"; + } else { + out << "#extension GL_OES_EGL_image_external : require\n\n"; + } + } + if (v.hasStereo() && stage == ShaderStage::VERTEX) { + switch (material.stereoscopicType) { + case StereoscopicType::INSTANCED: + // If we're not processing the shader through glslang (in the case of unoptimized + // OpenGL shaders), then we need to add the #extension string ourselves. + // If we ARE running the shader through glslang, then we must not include it, + // otherwise glslang will complain. + out << "#ifndef FILAMENT_GLSLANG\n"; + out << "#extension GL_EXT_clip_cull_distance : require\n"; + out << "#endif\n\n"; + break; + case StereoscopicType::MULTIVIEW: + out << "#extension GL_OVR_multiview2 : require\n"; + break; + case StereoscopicType::NONE: + break; + } } - out << "#define TARGET_MOBILE\n"; break; case ShaderModel::DESKTOP: if (mTargetLanguage == TargetLanguage::SPIRV || - material.featureLevel >= FeatureLevel::FEATURE_LEVEL_2) { + mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_2) { // Vulkan requires binding specifiers on uniforms and samplers, which were not // supported in the OpenGL 4.1 GLSL profile. out << "#version 450 core\n\n"; @@ -67,13 +95,42 @@ utils::io::sstream& CodeGenerator::generateProlog(utils::io::sstream& out, Shade out << "#version 410 core\n\n"; out << "#extension GL_ARB_shading_language_packing : enable\n\n"; } + if (v.hasStereo() && stage == ShaderStage::VERTEX) { + switch (material.stereoscopicType) { + case StereoscopicType::INSTANCED: + // Nothing to generate + break; + case StereoscopicType::MULTIVIEW: + out << "#extension GL_OVR_multiview2 : require\n"; + break; + case StereoscopicType::NONE: + break; + } + } break; } + if (mFeatureLevel == FeatureLevel::FEATURE_LEVEL_0) { + out << "#extension GL_OES_standard_derivatives : require\n\n"; + } + // This allows our includer system to use the #line directive to denote the source file for // #included code. This way, glslang reports errors more accurately. out << "#extension GL_GOOGLE_cpp_style_line_directive : enable\n\n"; + if (v.hasStereo() && stage == ShaderStage::VERTEX) { + switch (material.stereoscopicType) { + case StereoscopicType::INSTANCED: + // Nothing to generate + break; + case StereoscopicType::MULTIVIEW: + out << "layout(num_views = " << material.stereoscopicEyeCount << ") in;\n"; + break; + case StereoscopicType::NONE: + break; + } + } + if (stage == ShaderStage::COMPUTE) { out << "layout(local_size_x = " << material.groupSize.x << ", local_size_y = " << material.groupSize.y @@ -81,66 +138,246 @@ utils::io::sstream& CodeGenerator::generateProlog(utils::io::sstream& out, Shade << ") in;\n\n"; } - if (mTargetApi == TargetApi::VULKAN) { - out << "#define TARGET_VULKAN_ENVIRONMENT\n"; - } - if (mTargetApi == TargetApi::METAL) { - out << "#define TARGET_METAL_ENVIRONMENT\n"; - } - if (mTargetApi == TargetApi::OPENGL && mShaderModel == ShaderModel::MOBILE) { - out << "#define TARGET_GLES_ENVIRONMENT\n"; - } - if (mTargetApi == TargetApi::OPENGL && mShaderModel == ShaderModel::DESKTOP) { - out << "#define TARGET_GL_ENVIRONMENT\n"; + switch (mShaderModel) { + case ShaderModel::MOBILE: + out << "#define TARGET_MOBILE\n"; + break; + case ShaderModel::DESKTOP: + break; } - out << '\n'; - if (mTargetLanguage == TargetLanguage::SPIRV) { - out << "#define FILAMENT_VULKAN_SEMANTICS\n"; + switch (mTargetApi) { + case TargetApi::OPENGL: + switch (mShaderModel) { + case ShaderModel::MOBILE: + out << "#define TARGET_GLES_ENVIRONMENT\n"; + break; + case ShaderModel::DESKTOP: + out << "#define TARGET_GL_ENVIRONMENT\n"; + break; + } + break; + case TargetApi::VULKAN: + out << "#define TARGET_VULKAN_ENVIRONMENT\n"; + break; + case TargetApi::METAL: + out << "#define TARGET_METAL_ENVIRONMENT\n"; + break; + case TargetApi::ALL: + // invalid should never happen + break; } - if (mTargetLanguage == TargetLanguage::GLSL) { - out << "#define FILAMENT_OPENGL_SEMANTICS\n"; + + switch (mTargetLanguage) { + case TargetLanguage::GLSL: + out << "#define FILAMENT_OPENGL_SEMANTICS\n"; + break; + case TargetLanguage::SPIRV: + out << "#define FILAMENT_VULKAN_SEMANTICS\n"; + break; } - out << '\n'; if (mTargetApi == TargetApi::VULKAN || mTargetApi == TargetApi::METAL || (mTargetApi == TargetApi::OPENGL && mShaderModel == ShaderModel::DESKTOP) || - material.featureLevel >= FeatureLevel::FEATURE_LEVEL_2) { + mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_2) { out << "#define FILAMENT_HAS_FEATURE_TEXTURE_GATHER\n"; } - Precision defaultPrecision = getDefaultPrecision(stage); - const char* precision = getPrecisionQualifier(defaultPrecision, Precision::DEFAULT); + if (mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_1) { + out << "#define FILAMENT_HAS_FEATURE_INSTANCING\n"; + } + + // During compilation and optimization, __VERSION__ reflects the shader language version of the + // intermediate code, not the version of the final code. spirv-cross automatically adapts + // certain language features (e.g. fragment output) but leaves others untouched (e.g. sampler + // functions, bit shift operations). Client code may have to make decisions based on this + // information, so define a FILAMENT_EFFECTIVE_VERSION constant. + const char *effective_version; + if (mTargetLanguage == TargetLanguage::GLSL) { + effective_version = "__VERSION__"; + } else { + switch (mShaderModel) { + case ShaderModel::MOBILE: + if (mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_1) { + effective_version = "300"; + } else { + effective_version = "100"; + } + break; + case ShaderModel::DESKTOP: + if (mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_2) { + effective_version = "450"; + } else { + effective_version = "410"; + } + break; + default: + assert(false); + } + } + generateDefine(out, "FILAMENT_EFFECTIVE_VERSION", effective_version); + + switch (material.stereoscopicType) { + case StereoscopicType::INSTANCED: + generateDefine(out, "FILAMENT_STEREO_INSTANCED", true); + break; + case StereoscopicType::MULTIVIEW: + generateDefine(out, "FILAMENT_STEREO_MULTIVIEW", true); + break; + case StereoscopicType::NONE: + break; + } + + if (stage == ShaderStage::VERTEX) { + CodeGenerator::generateDefine(out, "FLIP_UV_ATTRIBUTE", material.flipUV); + CodeGenerator::generateDefine(out, "LEGACY_MORPHING", material.useLegacyMorphing); + } + if (stage == ShaderStage::FRAGMENT) { + CodeGenerator::generateDefine(out, "MATERIAL_HAS_CUSTOM_DEPTH", + material.userMaterialHasCustomDepth); + } + + if (mTargetLanguage == TargetLanguage::SPIRV || + mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_1) { + if (stage == ShaderStage::VERTEX) { + generateDefine(out, "VARYING", "out"); + generateDefine(out, "ATTRIBUTE", "in"); + } else if (stage == ShaderStage::FRAGMENT) { + generateDefine(out, "VARYING", "in"); + } + } else { + generateDefine(out, "VARYING", "varying"); + generateDefine(out, "ATTRIBUTE", "attribute"); + } + + auto getShadingDefine = [](Shading shading) -> const char* { + switch (shading) { + case Shading::LIT: return "SHADING_MODEL_LIT"; + case Shading::UNLIT: return "SHADING_MODEL_UNLIT"; + case Shading::SUBSURFACE: return "SHADING_MODEL_SUBSURFACE"; + case Shading::CLOTH: return "SHADING_MODEL_CLOTH"; + case Shading::SPECULAR_GLOSSINESS: return "SHADING_MODEL_SPECULAR_GLOSSINESS"; + } + }; + + CodeGenerator::generateDefine(out, getShadingDefine(material.shading), true); + + generateQualityDefine(out, material.quality); + + // precision qualifiers + out << '\n'; + Precision const defaultPrecision = getDefaultPrecision(stage); + const char* precision = getPrecisionQualifier(defaultPrecision); out << "precision " << precision << " float;\n"; out << "precision " << precision << " int;\n"; if (mShaderModel == ShaderModel::MOBILE) { - out << "precision lowp sampler2DArray;\n"; - out << "precision lowp sampler3D;\n"; + if (mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_1) { + out << "precision lowp sampler2DArray;\n"; + } + if (material.has3dSamplers) { + out << "precision lowp sampler3D;\n"; + } } - // specification constants + // Filament-reserved specification constants (limited by CONFIG_MAX_RESERVED_SPEC_CONSTANTS) out << '\n'; - generateSpecializationConstant(out, "BACKEND_FEATURE_LEVEL", 0, 1); + generateSpecializationConstant(out, "BACKEND_FEATURE_LEVEL", + +ReservedSpecializationConstants::BACKEND_FEATURE_LEVEL, 1); if (mTargetApi == TargetApi::VULKAN) { // Note: This is a hack for a hack. - // Vulkan doesn't fully support sizing arrays within a block with specialization constants, - // and since we only need to do this for a hack for WebGL, it's fine to replace it with - // regular constant here. - // We *could* leave it as a specialization constant, but this triggers a crashing bug with + // + // Vulkan doesn't support sizing arrays within a block with specialization constants, + // as per this paragraph of the ARB_spir_v specification: + // https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_gl_spirv.txt + // + // Arrays inside a block may be sized with a specialization constant, + // but the block will have a static layout. Changing the specialized size will + // not re-layout the block. In the absence of explicit offsets, the layout will be + // based on the default size of the array. + // + // CONFIG_MAX_INSTANCES is only needed for WebGL, so we can replace it with a constant. + // CONFIG_FROXEL_BUFFER_HEIGHT can be hardcoded to 2048 because only 3% of Android devices + // only support 16KiB buffer or less (1024 lines). + // + // We *could* leave these as a specialization constant, but this triggers a crashing bug with // some Adreno drivers on Android. see: https://github.com/google/filament/issues/6444 + // out << "const int CONFIG_MAX_INSTANCES = " << (int)CONFIG_MAX_INSTANCES << ";\n"; + out << "const int CONFIG_FROXEL_BUFFER_HEIGHT = 2048;\n"; } else { - generateSpecializationConstant(out, "CONFIG_MAX_INSTANCES", 1, (int)CONFIG_MAX_INSTANCES); + generateSpecializationConstant(out, "CONFIG_MAX_INSTANCES", + +ReservedSpecializationConstants::CONFIG_MAX_INSTANCES, (int)CONFIG_MAX_INSTANCES); + + // the default of 1024 (16KiB) is needed for 32% of Android devices + generateSpecializationConstant(out, "CONFIG_FROXEL_BUFFER_HEIGHT", + +ReservedSpecializationConstants::CONFIG_FROXEL_BUFFER_HEIGHT, 1024); + } + + // directional shadowmap visualization + generateSpecializationConstant(out, "CONFIG_DEBUG_DIRECTIONAL_SHADOWMAP", + +ReservedSpecializationConstants::CONFIG_DEBUG_DIRECTIONAL_SHADOWMAP, false); + + // froxel visualization + generateSpecializationConstant(out, "CONFIG_DEBUG_FROXEL_VISUALIZATION", + +ReservedSpecializationConstants::CONFIG_DEBUG_FROXEL_VISUALIZATION, false); + + // Workaround a Metal pipeline compilation error with the message: + // "Could not statically determine the target of a texture". See light_indirect.fs + generateSpecializationConstant(out, "CONFIG_STATIC_TEXTURE_TARGET_WORKAROUND", + +ReservedSpecializationConstants::CONFIG_STATIC_TEXTURE_TARGET_WORKAROUND, false); + + generateSpecializationConstant(out, "CONFIG_POWER_VR_SHADER_WORKAROUNDS", + +ReservedSpecializationConstants::CONFIG_POWER_VR_SHADER_WORKAROUNDS, false); + + generateSpecializationConstant(out, "CONFIG_STEREO_EYE_COUNT", + +ReservedSpecializationConstants::CONFIG_STEREO_EYE_COUNT, material.stereoscopicEyeCount); + + generateSpecializationConstant(out, "CONFIG_SH_BANDS_COUNT", + +ReservedSpecializationConstants::CONFIG_SH_BANDS_COUNT, 3); + + generateSpecializationConstant(out, "CONFIG_SHADOW_SAMPLING_METHOD", + +ReservedSpecializationConstants::CONFIG_SHADOW_SAMPLING_METHOD, 1); + + // CONFIG_MAX_STEREOSCOPIC_EYES is used to size arrays and on Adreno GPUs + vulkan, this has to + // be explicitly, statically defined (as in #define). Otherwise (using const int for + // example), we'd run into a GPU crash. + out << "#define CONFIG_MAX_STEREOSCOPIC_EYES " << (int) CONFIG_MAX_STEREOSCOPIC_EYES << "\n"; + + if (mFeatureLevel == FeatureLevel::FEATURE_LEVEL_0) { + // On ES2 since we don't have post-processing, we need to emulate EGL_GL_COLORSPACE_KHR, + // when it's not supported. + generateSpecializationConstant(out, "CONFIG_SRGB_SWAPCHAIN_EMULATION", + +ReservedSpecializationConstants::CONFIG_SRGB_SWAPCHAIN_EMULATION, false); } out << '\n'; out << SHADERS_COMMON_DEFINES_GLSL_DATA; - if (stage != ShaderStage::COMPUTE) { - out << '\n'; - out << SHADERS_COMMON_TYPES_GLSL_DATA; + if (material.featureLevel == FeatureLevel::FEATURE_LEVEL_0 && + (mFeatureLevel > FeatureLevel::FEATURE_LEVEL_0 + || mTargetLanguage == TargetLanguage::SPIRV)) { + // Insert compatibility definitions for ESSL 1.0 functions which were removed in ESSL 3.0. + + // This is the minimum required value according to the OpenGL ES Shading Language Version + // 1.00 document. glslang forbids defining symbols beginning with gl_ as const, hence the + // #define. + CodeGenerator::generateDefine(out, "gl_MaxVaryingVectors", "8"); + + CodeGenerator::generateDefine(out, "texture2D", "texture"); + CodeGenerator::generateDefine(out, "texture2DProj", "textureProj"); + CodeGenerator::generateDefine(out, "texture3D", "texture"); + CodeGenerator::generateDefine(out, "texture3DProj", "textureProj"); + CodeGenerator::generateDefine(out, "textureCube", "texture"); + + if (stage == ShaderStage::VERTEX) { + CodeGenerator::generateDefine(out, "texture2DLod", "textureLod"); + CodeGenerator::generateDefine(out, "texture2DProjLod", "textureProjLod"); + CodeGenerator::generateDefine(out, "texture3DLod", "textureLod"); + CodeGenerator::generateDefine(out, "texture3DProjLod", "textureProjLod"); + CodeGenerator::generateDefine(out, "textureCubeLod", "textureLod"); + } } out << "\n"; @@ -151,25 +388,24 @@ Precision CodeGenerator::getDefaultPrecision(ShaderStage stage) const { switch (stage) { case ShaderStage::VERTEX: return Precision::HIGH; - break; case ShaderStage::FRAGMENT: - if (mShaderModel < ShaderModel::DESKTOP) { - return Precision::MEDIUM; - } else { - return Precision::HIGH; + switch (mShaderModel) { + case ShaderModel::MOBILE: + return Precision::MEDIUM; + case ShaderModel::DESKTOP: + return Precision::HIGH; } - break; case ShaderStage::COMPUTE: return Precision::HIGH; - break; } } Precision CodeGenerator::getDefaultUniformPrecision() const { - if (mShaderModel < ShaderModel::DESKTOP) { - return Precision::MEDIUM; - } else { - return Precision::HIGH; + switch (mShaderModel) { + case ShaderModel::MOBILE: + return Precision::MEDIUM; + case ShaderModel::DESKTOP: + return Precision::HIGH; } } @@ -178,6 +414,23 @@ io::sstream& CodeGenerator::generateEpilog(io::sstream& out) { return out; } +io::sstream& CodeGenerator::generateCommonTypes(io::sstream& out, ShaderStage stage) { + out << '\n'; + switch (stage) { + case ShaderStage::VERTEX: + out << '\n'; + out << SHADERS_COMMON_TYPES_GLSL_DATA; + break; + case ShaderStage::FRAGMENT: + out << '\n'; + out << SHADERS_COMMON_TYPES_GLSL_DATA; + break; + case ShaderStage::COMPUTE: + break; + } + return out; +} + io::sstream& CodeGenerator::generateShaderMain(io::sstream& out, ShaderStage stage) { switch (stage) { case ShaderStage::VERTEX: @@ -202,87 +455,58 @@ io::sstream& CodeGenerator::generatePostProcessMain(io::sstream& out, ShaderStag return out; } -io::sstream& CodeGenerator::generateVariable(io::sstream& out, ShaderStage type, - const CString& name, size_t index) { - +io::sstream& CodeGenerator::generateVariable(io::sstream& out, ShaderStage stage, + const MaterialBuilder::CustomVariable& variable, size_t index) { + auto const& name = variable.name; + const char* precisionString = getPrecisionQualifier(variable.precision); if (!name.empty()) { - if (type == ShaderStage::VERTEX) { + if (stage == ShaderStage::VERTEX) { out << "\n#define VARIABLE_CUSTOM" << index << " " << name.c_str() << "\n"; out << "\n#define VARIABLE_CUSTOM_AT" << index << " variable_" << name.c_str() << "\n"; - out << "LAYOUT_LOCATION(" << index << ") out vec4 variable_" << name.c_str() << ";\n"; - } else if (type == ShaderStage::FRAGMENT) { - out << "\nLAYOUT_LOCATION(" << index << ") in highp vec4 variable_" << name.c_str() << ";\n"; + out << "LAYOUT_LOCATION(" << index << ") VARYING " << precisionString << " vec4 variable_" << name.c_str() << ";\n"; + } else if (stage == ShaderStage::FRAGMENT) { + if (!variable.hasPrecision && variable.precision == Precision::DEFAULT) { + // for backward compatibility + precisionString = "highp"; + } + out << "\nLAYOUT_LOCATION(" << index << ") VARYING " << precisionString << " vec4 variable_" << name.c_str() << ";\n"; } } return out; } io::sstream& CodeGenerator::generateShaderInputs(io::sstream& out, ShaderStage type, - const AttributeBitset& attributes, Interpolation interpolation) { + const AttributeBitset& attributes, Interpolation interpolation, + MaterialBuilder::PushConstantList const& pushConstants) const { + auto const& attributeDatabase = MaterialBuilder::getAttributeDatabase(); const char* shading = getInterpolationQualifier(interpolation); out << "#define SHADING_INTERPOLATION " << shading << "\n"; - bool hasTangents = attributes.test(VertexAttribute::TANGENTS); - generateDefine(out, "HAS_ATTRIBUTE_TANGENTS", hasTangents); - - bool hasColor = attributes.test(VertexAttribute::COLOR); - generateDefine(out, "HAS_ATTRIBUTE_COLOR", hasColor); - - bool hasUV0 = attributes.test(VertexAttribute::UV0); - generateDefine(out, "HAS_ATTRIBUTE_UV0", hasUV0); - - bool hasUV1 = attributes.test(VertexAttribute::UV1); - generateDefine(out, "HAS_ATTRIBUTE_UV1", hasUV1); - - bool hasBoneIndices = attributes.test(VertexAttribute::BONE_INDICES); - generateDefine(out, "HAS_ATTRIBUTE_BONE_INDICES", hasBoneIndices); - - bool hasBoneWeights = attributes.test(VertexAttribute::BONE_WEIGHTS); - generateDefine(out, "HAS_ATTRIBUTE_BONE_WEIGHTS", hasBoneWeights); - - for (int i = 0; i < MAX_CUSTOM_ATTRIBUTES; i++) { - bool hasCustom = attributes.test(VertexAttribute::CUSTOM0 + i); - if (hasCustom) { - generateIndexedDefine(out, "HAS_ATTRIBUTE_CUSTOM", i, 1); - } - } + out << "\n"; + attributes.forEachSetBit([&out, &attributeDatabase](size_t i) { + generateDefine(out, attributeDatabase[i].getDefineName().c_str(), true); + }); if (type == ShaderStage::VERTEX) { out << "\n"; - generateDefine(out, "LOCATION_POSITION", uint32_t(VertexAttribute::POSITION)); - if (hasTangents) { - generateDefine(out, "LOCATION_TANGENTS", uint32_t(VertexAttribute::TANGENTS)); - } - if (hasUV0) { - generateDefine(out, "LOCATION_UV0", uint32_t(VertexAttribute::UV0)); - } - if (hasUV1) { - generateDefine(out, "LOCATION_UV1", uint32_t(VertexAttribute::UV1)); - } - if (hasColor) { - generateDefine(out, "LOCATION_COLOR", uint32_t(VertexAttribute::COLOR)); - } - if (hasBoneIndices) { - generateDefine(out, "LOCATION_BONE_INDICES", uint32_t(VertexAttribute::BONE_INDICES)); - } - if (hasBoneWeights) { - generateDefine(out, "LOCATION_BONE_WEIGHTS", uint32_t(VertexAttribute::BONE_WEIGHTS)); - } - - for (int i = 0; i < MAX_CUSTOM_ATTRIBUTES; i++) { - if (attributes.test(VertexAttribute::CUSTOM0 + i)) { - generateIndexedDefine(out, "LOCATION_CUSTOM", i, - uint32_t(VertexAttribute::CUSTOM0) + i); + attributes.forEachSetBit([&out, &attributeDatabase, this](size_t i) { + auto const& attribute = attributeDatabase[i]; + assert_invariant( i == attribute.location ); + if (mTargetLanguage == TargetLanguage::SPIRV || + mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_1) { + out << "layout(location = " << size_t(attribute.location) << ") in "; + } else { + out << "attribute "; } - } - - out << SHADERS_ATTRIBUTES_VS_DATA; + out << getTypeName(attribute.type) << " " << attribute.getAttributeName() << ";\n"; + }); - generateDefine(out, "VARYING", "out"); - } else if (type == ShaderStage::FRAGMENT) { - generateDefine(out, "VARYING", "in"); + out << "\n"; + generatePushConstants(out, pushConstants, attributes.size()); } + + out << "\n"; out << SHADERS_VARYINGS_GLSL_DATA; return out; } @@ -290,11 +514,19 @@ io::sstream& CodeGenerator::generateShaderInputs(io::sstream& out, ShaderStage t io::sstream& CodeGenerator::generateOutput(io::sstream& out, ShaderStage type, const CString& name, size_t index, MaterialBuilder::VariableQualifier qualifier, + MaterialBuilder::Precision precision, MaterialBuilder::OutputType outputType) const { if (name.empty() || type == ShaderStage::VERTEX) { return out; } + // Feature level 0 only supports one output. + if (index > 0 && mFeatureLevel == FeatureLevel::FEATURE_LEVEL_0) { + slog.w << "Discarding an output in the generated ESSL 1.0 shader: index = " << index + << ", name = " << name.c_str() << io::endl; + return out; + } + // TODO: add and support additional variable qualifiers (void) qualifier; assert(qualifier == MaterialBuilder::VariableQualifier::OUT); @@ -308,23 +540,38 @@ io::sstream& CodeGenerator::generateOutput(io::sstream& out, ShaderStage type, // formats behind the scenes. It's an error to output fewer components than the attachment // needs, so we always output a float4 instead of a float3. It's never an error to output extra // components. - if (mTargetApi == TargetApi::METAL) { + // + // Meanwhile, ESSL 1.0 must always write to gl_FragColor, a vec4. + if (mTargetApi == TargetApi::METAL || mFeatureLevel == FeatureLevel::FEATURE_LEVEL_0) { if (outputType == MaterialBuilder::OutputType::FLOAT3) { outputType = MaterialBuilder::OutputType::FLOAT4; swizzleString = ".rgb"; } } + const char* precisionString = getPrecisionQualifier(precision); const char* materialTypeString = getOutputTypeName(materialOutputType); const char* typeString = getOutputTypeName(outputType); - out << "\n#define FRAG_OUTPUT" << index << " " << name.c_str() << "\n"; - out << "\n#define FRAG_OUTPUT_AT" << index << " output_" << name.c_str() << "\n"; - out << "\n#define FRAG_OUTPUT_MATERIAL_TYPE" << index << " " << materialTypeString << "\n"; - out << "\n#define FRAG_OUTPUT_TYPE" << index << " " << typeString << "\n"; - out << "\n#define FRAG_OUTPUT_SWIZZLE" << index << " " << swizzleString << "\n"; - out << "layout(location=" << index << ") out " << typeString << - " output_" << name.c_str() << ";\n"; + bool generate_essl3_code = mTargetLanguage == TargetLanguage::SPIRV + || mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_1; + + out << "\n#define FRAG_OUTPUT" << index << " " << name.c_str(); + if (generate_essl3_code) { + out << "\n#define FRAG_OUTPUT_AT" << index << " output_" << name.c_str(); + } else { + out << "\n#define FRAG_OUTPUT_AT" << index << " gl_FragColor"; + } + out << "\n#define FRAG_OUTPUT_MATERIAL_TYPE" << index << " " << materialTypeString; + out << "\n#define FRAG_OUTPUT_PRECISION" << index << " " << precisionString; + out << "\n#define FRAG_OUTPUT_TYPE" << index << " " << typeString; + out << "\n#define FRAG_OUTPUT_SWIZZLE" << index << " " << swizzleString; + out << "\n"; + + if (generate_essl3_code) { + out << "\nlayout(location=" << index << ") out " << precisionString << " " + << typeString << " output_" << name.c_str() << ";\n"; + } return out; } @@ -341,66 +588,141 @@ io::sstream& CodeGenerator::generateDepthShaderMain(io::sstream& out, ShaderStag const char* CodeGenerator::getUniformPrecisionQualifier(UniformType type, Precision precision, Precision uniformPrecision, Precision defaultPrecision) noexcept { if (!hasPrecision(type)) { + // some types like bool can't have a precision qualifier return ""; } if (precision == Precision::DEFAULT) { + // if precision field is specified as default, turn it into the default precision for + // uniforms (which might be different on desktop vs mobile) precision = uniformPrecision; } - return getPrecisionQualifier(precision, defaultPrecision); + if (precision == defaultPrecision) { + // finally if the precision match the default precision of this stage, don't omit + // the precision qualifier -- which mean the effective precision might be different + // in different stages. + return ""; + } + return getPrecisionQualifier(precision); } utils::io::sstream& CodeGenerator::generateBuffers(utils::io::sstream& out, MaterialInfo::BufferContainer const& buffers) const { - uint32_t binding = 0; + for (auto const* buffer : buffers) { - generateBufferInterfaceBlock(out, ShaderStage::COMPUTE, binding, *buffer); - binding++; + + // FIXME: we need to get the bindings for the SSBOs and that will depend on the samplers + backend::descriptor_binding_t binding = 0; + + if (mTargetApi == TargetApi::OPENGL) { + // For OpenGL, the set is not used bug the binding must be unique. + binding = getUniqueSsboBindingPoint(); + } + generateBufferInterfaceBlock(out, ShaderStage::COMPUTE, + DescriptorSetBindingPoints::PER_MATERIAL, binding, *buffer); } return out; } io::sstream& CodeGenerator::generateUniforms(io::sstream& out, ShaderStage stage, - UniformBindingPoints binding, const BufferInterfaceBlock& uib) const { - return generateBufferInterfaceBlock(out, stage, +binding, uib); + filament::DescriptorSetBindingPoints set, + filament::backend::descriptor_binding_t binding, + const BufferInterfaceBlock& uib) const { + + if (mTargetApi == TargetApi::OPENGL) { + // For OpenGL, the set is not used bug the binding must be unique. + binding = getUniqueUboBindingPoint(); + } + + return generateBufferInterfaceBlock(out, stage, set, binding, uib); } -io::sstream& CodeGenerator::generateBufferInterfaceBlock(io::sstream& out, ShaderStage stage, - uint32_t binding, const BufferInterfaceBlock& uib) const { - auto const& infos = uib.getFieldInfoList(); - if (infos.empty()) { - return out; +io::sstream& CodeGenerator::generateInterfaceFields(io::sstream& out, + FixedCapacityVector const& infos, + Precision defaultPrecision) const { + Precision const uniformPrecision = getDefaultUniformPrecision(); + + for (auto const& info : infos) { + if (mFeatureLevel < info.minFeatureLevel) { + continue; + } + char const* const type = getUniformTypeName(info); + char const* const precision = getUniformPrecisionQualifier(info.type, info.precision, + uniformPrecision, defaultPrecision); + out << " " << precision; + if (precision[0] != '\0') out << " "; + out << type << " " << info.name.c_str(); + if (info.isArray) { + if (info.sizeName.empty()) { + if (info.size) { + out << "[" << info.size << "]"; + } else { + out << "[]"; + } + } else { + out << "[" << info.sizeName.c_str() << "]"; + } + } + out << ";\n"; } + return out; +} + +io::sstream& CodeGenerator::generateUboAsPlainUniforms(io::sstream& out, ShaderStage stage, + const BufferInterfaceBlock& uib) const { + + auto const& infos = uib.getFieldInfoList(); std::string blockName{ uib.getName() }; std::string instanceName{ uib.getName() }; blockName.front() = char(std::toupper((unsigned char)blockName.front())); instanceName.front() = char(std::tolower((unsigned char)instanceName.front())); - Precision uniformPrecision = getDefaultUniformPrecision(); - Precision defaultPrecision = getDefaultPrecision(stage); + out << "\nstruct " << blockName << " {\n"; - auto metalBufferBindingOffset = 0; - switch (uib.getTarget()) { - case BufferInterfaceBlock::Target::UNIFORM: - metalBufferBindingOffset = METAL_UNIFORM_BUFFER_BINDING_START; - break; - case BufferInterfaceBlock::Target::SSBO: - metalBufferBindingOffset = METAL_SSBO_BINDING_START; - break; + generateInterfaceFields(out, infos, Precision::DEFAULT); + + out << "};\n"; + out << "uniform " << blockName << " " << instanceName << ";\n"; + + return out; +} + +io::sstream& CodeGenerator::generateBufferInterfaceBlock(io::sstream& out, ShaderStage stage, + filament::DescriptorSetBindingPoints set, + filament::backend::descriptor_binding_t binding, + const BufferInterfaceBlock& uib) const { + if (uib.isEmptyForFeatureLevel(mFeatureLevel)) { + return out; } + auto const& infos = uib.getFieldInfoList(); + + if (mTargetLanguage == TargetLanguage::GLSL && + mFeatureLevel == FeatureLevel::FEATURE_LEVEL_0) { + // we need to generate a structure instead + assert_invariant(mTargetApi == TargetApi::OPENGL); + assert_invariant(uib.getTarget() == BufferInterfaceBlock::Target::UNIFORM); + return generateUboAsPlainUniforms(out, stage, uib); + } + + std::string blockName{ uib.getName() }; + std::string instanceName{ uib.getName() }; + blockName.front() = char(std::toupper((unsigned char)blockName.front())); + instanceName.front() = char(std::tolower((unsigned char)instanceName.front())); + out << "\nlayout("; if (mTargetLanguage == TargetLanguage::SPIRV || mFeatureLevel >= FeatureLevel::FEATURE_LEVEL_2) { switch (mTargetApi) { case TargetApi::METAL: - out << "binding = " << metalBufferBindingOffset + binding << ", "; + case TargetApi::VULKAN: + out << "set = " << +set << ", binding = " << +binding << ", "; break; case TargetApi::OPENGL: // GLSL 4.5 / ESSL 3.1 require the 'binding' layout qualifier - case TargetApi::VULKAN: - out << "binding = " << binding << ", "; + // in the GLSL 4.5 / ESSL 3.1 case, the set is not used and binding is unique + out << "binding = " << +binding << ", "; break; case TargetApi::ALL: @@ -433,7 +755,7 @@ io::sstream& CodeGenerator::generateBufferInterfaceBlock(io::sstream& out, Shade if (uib.getTarget() == BufferInterfaceBlock::Target::SSBO) { uint8_t qualifiers = uib.getQualifier(); while (qualifiers) { - uint8_t mask = 1u << utils::ctz(unsigned(qualifiers)); + uint8_t const mask = 1u << utils::ctz(unsigned(qualifiers)); switch (BufferInterfaceBlock::Qualifier(qualifiers & mask)) { case BufferInterfaceBlock::Qualifier::COHERENT: out << "coherent "; break; case BufferInterfaceBlock::Qualifier::WRITEONLY: out << "writeonly "; break; @@ -447,40 +769,21 @@ io::sstream& CodeGenerator::generateBufferInterfaceBlock(io::sstream& out, Shade out << "{\n"; - for (auto const& info : infos) { - char const* const type = getUniformTypeName(info); - char const* const precision = getUniformPrecisionQualifier(info.type, info.precision, - uniformPrecision, defaultPrecision); - out << " " << precision; - if (precision[0] != '\0') out << " "; - out << type << " " << info.name.c_str(); - if (info.isArray) { - if (info.sizeName.empty()) { - if (info.size) { - out << "[" << info.size << "]"; - } else { - out << "[]"; - } - } else { - out << "[" << info.sizeName.c_str() << "]"; - } - } - out << ";\n"; - } + generateInterfaceFields(out, infos, getDefaultPrecision(stage)); + out << "} " << instanceName << ";\n"; return out; } -io::sstream& CodeGenerator::generateSamplers( - io::sstream& out, SamplerBindingPoints bindingPoint, uint8_t firstBinding, - const SamplerInterfaceBlock& sib) const { - auto const& infos = sib.getSamplerInfoList(); - if (infos.empty()) { +io::sstream& CodeGenerator::generateSamplers(utils::io::sstream& out, + filament::DescriptorSetBindingPoints set, + filament::SamplerInterfaceBlock::SamplerInfoList const& list) const { + if (list.empty()) { return out; } - for (auto const& info : infos) { + for (auto const& info : list) { auto type = info.type; if (type == SamplerType::SAMPLER_EXTERNAL && mShaderModel != ShaderModel::MOBILE) { // we're generating the shader for the desktop, where we assume external textures @@ -488,29 +791,29 @@ io::sstream& CodeGenerator::generateSamplers( type = SamplerType::SAMPLER_2D; } char const* const typeName = getSamplerTypeName(type, info.format, info.multisample); - char const* const precision = getPrecisionQualifier(info.precision, Precision::DEFAULT); + char const* const precision = getPrecisionQualifier(info.precision); if (mTargetLanguage == TargetLanguage::SPIRV) { - const uint32_t bindingIndex = (uint32_t) firstBinding + info.offset; switch (mTargetApi) { - // For Vulkan, we place uniforms in set 0 (the default set) and samplers in set 1. This - // allows the sampler bindings to live in a separate "namespace" that starts at zero. // Note that the set specifier is not covered by the desktop GLSL spec, including // recent versions. It is only documented in the GL_KHR_vulkan_glsl extension. case TargetApi::VULKAN: - out << "layout(binding = " << bindingIndex << ", set = 1) "; + out << "layout(binding = " << +info.binding << ", set = " << +set << ") "; break; // For Metal, each sampler group gets its own descriptor set, each of which will // become an argument buffer. The first descriptor set is reserved for uniforms, // hence the +1 here. case TargetApi::METAL: - out << "layout(binding = " << (uint32_t) info.offset - << ", set = " << (uint32_t) bindingPoint + 1 << ") "; + out << "layout(binding = " << +info.binding << ", set = " << +set << ") "; break; - default: case TargetApi::OPENGL: - out << "layout(binding = " << bindingIndex << ") "; + // GLSL 4.5 / ESSL 3.1 require the 'binding' layout qualifier + out << "layout(binding = " << getUniqueSamplerBindingPoint() << ") "; + break; + + case TargetApi::ALL: + // should not happen break; } } @@ -532,7 +835,7 @@ io::sstream& CodeGenerator::generateSubpass(io::sstream& out, SubpassInfo subpas char const* const typeName = "subpassInput"; // In our Vulkan backend, subpass inputs always live in descriptor set 2. (ignored for GLES) - char const* const precision = getPrecisionQualifier(subpass.precision, Precision::DEFAULT); + char const* const precision = getPrecisionQualifier(subpass.precision); out << "layout(input_attachment_index = " << (int) subpass.attachmentIndex << ", set = 2, binding = " << (int) subpass.binding << ") "; @@ -545,7 +848,7 @@ io::sstream& CodeGenerator::generateSubpass(io::sstream& out, SubpassInfo subpas } void CodeGenerator::fixupExternalSamplers( - std::string& shader, SamplerInterfaceBlock const& sib) noexcept { + std::string& shader, SamplerInterfaceBlock const& sib, FeatureLevel featureLevel) noexcept { auto const& infos = sib.getSamplerInfoList(); if (infos.empty()) { return; @@ -558,7 +861,7 @@ void CodeGenerator::fixupExternalSamplers( for (auto const& info : infos) { if (info.type == SamplerType::SAMPLER_EXTERNAL) { auto name = std::string("sampler2D ") + info.uniformName.c_str(); - size_t index = shader.find(name); + size_t const index = shader.find(name); if (index != std::string::npos) { hasExternalSampler = true; @@ -580,7 +883,10 @@ void CodeGenerator::fixupExternalSamplers( while (shader[index] != '\n') index++; index++; - shader.insert(index, "#extension GL_OES_EGL_image_external_essl3 : require\n"); + const char *extensionLine = (featureLevel >= FeatureLevel::FEATURE_LEVEL_1) + ? "#extension GL_OES_EGL_image_external_essl3 : require\n\n" + : "#extension GL_OES_EGL_image_external : require\n\n"; + shader.insert(index, extensionLine); } } @@ -608,26 +914,66 @@ io::sstream& CodeGenerator::generateIndexedDefine(io::sstream& out, const char* return out; } +struct SpecializationConstantFormatter { + std::string operator()(int value) noexcept { return std::to_string(value); } + std::string operator()(float value) noexcept { return std::to_string(value); } + std::string operator()(bool value) noexcept { return value ? "true" : "false"; } +}; + utils::io::sstream& CodeGenerator::generateSpecializationConstant(utils::io::sstream& out, const char* name, uint32_t id, std::variant value) const { + + std::string const constantString = std::visit(SpecializationConstantFormatter(), value); + static const char* types[] = { "int", "float", "bool" }; if (mTargetLanguage == MaterialBuilderBase::TargetLanguage::SPIRV) { - std::visit([&](auto&& arg) { - out << "layout (constant_id = " << id << ") const " - << types[value.index()] << " " << name << " = " << arg << ";\n\n"; - }, value); + out << "layout (constant_id = " << id << ") const " + << types[value.index()] << " " << name << " = " << constantString << ";\n"; } else { - std::visit([&](auto&& arg) { - out << "#ifndef SPIRV_CROSS_CONSTANT_ID_" << id << '\n' - << "#define SPIRV_CROSS_CONSTANT_ID_" << id << " " << arg << '\n' - << "#endif" << '\n' - << "const " << types[value.index()] << " " << name << " = SPIRV_CROSS_CONSTANT_ID_" << id - << ";\n\n"; - }, value); + out << "#ifndef SPIRV_CROSS_CONSTANT_ID_" << id << '\n' + << "#define SPIRV_CROSS_CONSTANT_ID_" << id << " " << constantString << '\n' + << "#endif" << '\n' + << "const " << types[value.index()] << " " << name << " = SPIRV_CROSS_CONSTANT_ID_" << id + << ";\n\n"; } return out; } +utils::io::sstream& CodeGenerator::generatePushConstants(utils::io::sstream& out, + MaterialBuilder::PushConstantList const& pushConstants, size_t const layoutLocation) const { + static constexpr char const* STRUCT_NAME = "Constants"; + + bool const outputSpirv = + mTargetLanguage == TargetLanguage::SPIRV && mTargetApi != TargetApi::OPENGL; + auto const getType = [](ConstantType const& type) { + switch (type) { + case ConstantType::BOOL: + return "bool"; + case ConstantType::INT: + return "int"; + case ConstantType::FLOAT: + return "float"; + } + }; + if (outputSpirv) { + out << "layout(push_constant) uniform " << STRUCT_NAME << " {\n "; + } else { + out << "struct " << STRUCT_NAME << " {\n"; + } + + for (auto const& constant: pushConstants) { + out << getType(constant.type) << " " << constant.name.c_str() << ";\n"; + } + + if (outputSpirv) { + out << "} " << PUSH_CONSTANT_STRUCT_VAR_NAME << ";\n"; + } else { + out << "};\n"; + out << "LAYOUT_LOCATION(" << static_cast(layoutLocation) << ") uniform " << STRUCT_NAME + << " " << PUSH_CONSTANT_STRUCT_VAR_NAME << ";\n"; + } + return out; +} io::sstream& CodeGenerator::generateMaterialProperty(io::sstream& out, MaterialBuilder::Property property, bool isSet) { @@ -645,9 +991,9 @@ io::sstream& CodeGenerator::generateQualityDefine(io::sstream& out, ShaderQualit switch (quality) { case ShaderQuality::DEFAULT: switch (mShaderModel) { - default: goto quality_normal; - case ShaderModel::DESKTOP: goto quality_high; - case ShaderModel::MOBILE: goto quality_low; + default: goto quality_normal; + case ShaderModel::DESKTOP: goto quality_high; + case ShaderModel::MOBILE: goto quality_low; } case ShaderQuality::LOW: quality_low: @@ -823,8 +1169,7 @@ io::sstream& CodeGenerator::generateShaderUnlit(io::sstream& out, ShaderStage ty return out; } -io::sstream& CodeGenerator::generateShaderReflections(utils::io::sstream& out, ShaderStage type, - filament::Variant variant) { +io::sstream& CodeGenerator::generateShaderReflections(utils::io::sstream& out, ShaderStage type) { if (type == ShaderStage::VERTEX) { } else if (type == ShaderStage::FRAGMENT) { out << SHADERS_COMMON_LIGHTING_FS_DATA; @@ -838,78 +1183,87 @@ io::sstream& CodeGenerator::generateShaderReflections(utils::io::sstream& out, S char const* CodeGenerator::getConstantName(MaterialBuilder::Property property) noexcept { using Property = MaterialBuilder::Property; switch (property) { - case Property::BASE_COLOR: return "BASE_COLOR"; - case Property::ROUGHNESS: return "ROUGHNESS"; - case Property::METALLIC: return "METALLIC"; - case Property::REFLECTANCE: return "REFLECTANCE"; - case Property::AMBIENT_OCCLUSION: return "AMBIENT_OCCLUSION"; - case Property::CLEAR_COAT: return "CLEAR_COAT"; - case Property::CLEAR_COAT_ROUGHNESS: return "CLEAR_COAT_ROUGHNESS"; - case Property::CLEAR_COAT_NORMAL: return "CLEAR_COAT_NORMAL"; - case Property::ANISOTROPY: return "ANISOTROPY"; - case Property::ANISOTROPY_DIRECTION: return "ANISOTROPY_DIRECTION"; - case Property::THICKNESS: return "THICKNESS"; - case Property::SUBSURFACE_POWER: return "SUBSURFACE_POWER"; - case Property::SUBSURFACE_COLOR: return "SUBSURFACE_COLOR"; - case Property::SHEEN_COLOR: return "SHEEN_COLOR"; - case Property::SHEEN_ROUGHNESS: return "SHEEN_ROUGHNESS"; - case Property::GLOSSINESS: return "GLOSSINESS"; - case Property::SPECULAR_COLOR: return "SPECULAR_COLOR"; - case Property::EMISSIVE: return "EMISSIVE"; - case Property::NORMAL: return "NORMAL"; - case Property::POST_LIGHTING_COLOR: return "POST_LIGHTING_COLOR"; - case Property::CLIP_SPACE_TRANSFORM: return "CLIP_SPACE_TRANSFORM"; - case Property::ABSORPTION: return "ABSORPTION"; - case Property::TRANSMISSION: return "TRANSMISSION"; - case Property::IOR: return "IOR"; - case Property::MICRO_THICKNESS: return "MICRO_THICKNESS"; - case Property::BENT_NORMAL: return "BENT_NORMAL"; + case Property::BASE_COLOR: return "BASE_COLOR"; + case Property::ROUGHNESS: return "ROUGHNESS"; + case Property::METALLIC: return "METALLIC"; + case Property::REFLECTANCE: return "REFLECTANCE"; + case Property::AMBIENT_OCCLUSION: return "AMBIENT_OCCLUSION"; + case Property::CLEAR_COAT: return "CLEAR_COAT"; + case Property::CLEAR_COAT_ROUGHNESS: return "CLEAR_COAT_ROUGHNESS"; + case Property::CLEAR_COAT_NORMAL: return "CLEAR_COAT_NORMAL"; + case Property::ANISOTROPY: return "ANISOTROPY"; + case Property::ANISOTROPY_DIRECTION: return "ANISOTROPY_DIRECTION"; + case Property::THICKNESS: return "THICKNESS"; + case Property::SUBSURFACE_POWER: return "SUBSURFACE_POWER"; + case Property::SUBSURFACE_COLOR: return "SUBSURFACE_COLOR"; + case Property::SHEEN_COLOR: return "SHEEN_COLOR"; + case Property::SHEEN_ROUGHNESS: return "SHEEN_ROUGHNESS"; + case Property::GLOSSINESS: return "GLOSSINESS"; + case Property::SPECULAR_COLOR: return "SPECULAR_COLOR"; + case Property::EMISSIVE: return "EMISSIVE"; + case Property::NORMAL: return "NORMAL"; + case Property::POST_LIGHTING_COLOR: return "POST_LIGHTING_COLOR"; + case Property::POST_LIGHTING_MIX_FACTOR: return "POST_LIGHTING_MIX_FACTOR"; + case Property::CLIP_SPACE_TRANSFORM: return "CLIP_SPACE_TRANSFORM"; + case Property::ABSORPTION: return "ABSORPTION"; + case Property::TRANSMISSION: return "TRANSMISSION"; + case Property::IOR: return "IOR"; + case Property::MICRO_THICKNESS: return "MICRO_THICKNESS"; + case Property::BENT_NORMAL: return "BENT_NORMAL"; + case Property::SPECULAR_FACTOR: return "SPECULAR_FACTOR"; + case Property::SPECULAR_COLOR_FACTOR: return "SPECULAR_COLOR_FACTOR"; + } +} + +char const* CodeGenerator::getTypeName(UniformType type) noexcept { + switch (type) { + case UniformType::BOOL: return "bool"; + case UniformType::BOOL2: return "bvec2"; + case UniformType::BOOL3: return "bvec3"; + case UniformType::BOOL4: return "bvec4"; + case UniformType::FLOAT: return "float"; + case UniformType::FLOAT2: return "vec2"; + case UniformType::FLOAT3: return "vec3"; + case UniformType::FLOAT4: return "vec4"; + case UniformType::INT: return "int"; + case UniformType::INT2: return "ivec2"; + case UniformType::INT3: return "ivec3"; + case UniformType::INT4: return "ivec4"; + case UniformType::UINT: return "uint"; + case UniformType::UINT2: return "uvec2"; + case UniformType::UINT3: return "uvec3"; + case UniformType::UINT4: return "uvec4"; + case UniformType::MAT3: return "mat3"; + case UniformType::MAT4: return "mat4"; + case UniformType::STRUCT: return ""; } } char const* CodeGenerator::getUniformTypeName(BufferInterfaceBlock::FieldInfo const& info) noexcept { using Type = BufferInterfaceBlock::Type; switch (info.type) { - case Type::BOOL: return "bool"; - case Type::BOOL2: return "bvec2"; - case Type::BOOL3: return "bvec3"; - case Type::BOOL4: return "bvec4"; - case Type::FLOAT: return "float"; - case Type::FLOAT2: return "vec2"; - case Type::FLOAT3: return "vec3"; - case Type::FLOAT4: return "vec4"; - case Type::INT: return "int"; - case Type::INT2: return "ivec2"; - case Type::INT3: return "ivec3"; - case Type::INT4: return "ivec4"; - case Type::UINT: return "uint"; - case Type::UINT2: return "uvec2"; - case Type::UINT3: return "uvec3"; - case Type::UINT4: return "uvec4"; - case Type::MAT3: return "mat3"; - case Type::MAT4: return "mat4"; case Type::STRUCT: return info.structName.c_str(); + default: return getTypeName(info.type); } } char const* CodeGenerator::getOutputTypeName(MaterialBuilder::OutputType type) noexcept { switch (type) { case MaterialBuilder::OutputType::FLOAT: return "float"; - case MaterialBuilder::OutputType::FLOAT2: return "float2"; - case MaterialBuilder::OutputType::FLOAT3: return "float3"; - case MaterialBuilder::OutputType::FLOAT4: return "float4"; + case MaterialBuilder::OutputType::FLOAT2: return "vec2"; + case MaterialBuilder::OutputType::FLOAT3: return "vec3"; + case MaterialBuilder::OutputType::FLOAT4: return "vec4"; } } char const* CodeGenerator::getSamplerTypeName(SamplerType type, SamplerFormat format, bool multisample) const noexcept { - assert(!multisample); // multisample samplers not yet supported. switch (type) { case SamplerType::SAMPLER_2D: switch (format) { - case SamplerFormat::INT: return "isampler2D"; - case SamplerFormat::UINT: return "usampler2D"; - case SamplerFormat::FLOAT: return "sampler2D"; + case SamplerFormat::INT: return multisample ? "isampler2DMS" : "isampler2D"; + case SamplerFormat::UINT: return multisample ? "usampler2DMS" : "usampler2D"; + case SamplerFormat::FLOAT: return multisample ? "sampler2DMS" : "sampler2D"; case SamplerFormat::SHADOW: return "sampler2DShadow"; } case SamplerType::SAMPLER_3D: @@ -922,9 +1276,9 @@ char const* CodeGenerator::getSamplerTypeName(SamplerType type, SamplerFormat fo } case SamplerType::SAMPLER_2D_ARRAY: switch (format) { - case SamplerFormat::INT: return "isampler2DArray"; - case SamplerFormat::UINT: return "usampler2DArray"; - case SamplerFormat::FLOAT: return "sampler2DArray"; + case SamplerFormat::INT: return multisample ? "isampler2DMSArray": "isampler2DArray"; + case SamplerFormat::UINT: return multisample ? "usampler2DMSArray": "usampler2DArray"; + case SamplerFormat::FLOAT: return multisample ? "sampler2DMSArray": "sampler2DArray"; case SamplerFormat::SHADOW: return "sampler2DArrayShadow"; } case SamplerType::SAMPLER_CUBEMAP: @@ -958,17 +1312,12 @@ char const* CodeGenerator::getInterpolationQualifier(Interpolation interpolation } /* static */ -char const* CodeGenerator::getPrecisionQualifier(Precision precision, - Precision defaultPrecision) noexcept { - if (precision == defaultPrecision) { - return ""; - } - +char const* CodeGenerator::getPrecisionQualifier(Precision precision) noexcept { switch (precision) { case Precision::LOW: return "lowp"; case Precision::MEDIUM: return "mediump"; case Precision::HIGH: return "highp"; - case Precision::DEFAULT: return "ERROR"; + case Precision::DEFAULT: return ""; } } diff --git a/libs/filamat/src/shaders/CodeGenerator.h b/libs/filamat/src/shaders/CodeGenerator.h index c31e45a8c59..dac8553c444 100644 --- a/libs/filamat/src/shaders/CodeGenerator.h +++ b/libs/filamat/src/shaders/CodeGenerator.h @@ -17,29 +17,33 @@ #ifndef TNT_FILAMENT_CODEGENERATOR_H #define TNT_FILAMENT_CODEGENERATOR_H -#include -#include -#include #include "MaterialInfo.h" - -#include -#include +#include "UibGenerator.h" #include + #include #include #include #include #include +#include #include +#include +#include +#include #include -#include -#include "private/filament/EngineEnums.h" +#include +#include +#include +#include + +#include namespace filamat { @@ -72,10 +76,12 @@ class UTILS_PRIVATE CodeGenerator { // generate prolog for the given shader utils::io::sstream& generateProlog(utils::io::sstream& out, ShaderStage stage, - MaterialInfo const& material) const; + MaterialInfo const& material, filament::Variant v) const; static utils::io::sstream& generateEpilog(utils::io::sstream& out); + static utils::io::sstream& generateCommonTypes(utils::io::sstream& out, ShaderStage stage); + // generate common functions for the given shader static utils::io::sstream& generateCommon(utils::io::sstream& out, ShaderStage stage); static utils::io::sstream& generatePostProcessCommon(utils::io::sstream& out, ShaderStage type); @@ -96,22 +102,23 @@ class UTILS_PRIVATE CodeGenerator { filament::Variant variant, bool hasShadowMultiplier); // generate the shader's code for the screen-space reflections - static utils::io::sstream& generateShaderReflections(utils::io::sstream& out, ShaderStage type, - filament::Variant variant); + static utils::io::sstream& generateShaderReflections(utils::io::sstream& out, ShaderStage type); // generate declarations for custom interpolants - static utils::io::sstream& generateVariable(utils::io::sstream& out, ShaderStage type, - const utils::CString& name, size_t index); + static utils::io::sstream& generateVariable(utils::io::sstream& out, ShaderStage stage, + const MaterialBuilder::CustomVariable& variable, size_t index); // generate declarations for non-custom "in" variables - static utils::io::sstream& generateShaderInputs(utils::io::sstream& out, ShaderStage type, - const filament::AttributeBitset& attributes, filament::Interpolation interpolation); + utils::io::sstream& generateShaderInputs(utils::io::sstream& out, ShaderStage type, + const filament::AttributeBitset& attributes, filament::Interpolation interpolation, + MaterialBuilder::PushConstantList const& pushConstants) const; static utils::io::sstream& generatePostProcessInputs(utils::io::sstream& out, ShaderStage type); // generate declarations for custom output variables utils::io::sstream& generateOutput(utils::io::sstream& out, ShaderStage type, const utils::CString& name, size_t index, MaterialBuilder::VariableQualifier qualifier, + MaterialBuilder::Precision precision, MaterialBuilder::OutputType outputType) const; // generate no-op shader for depth prepass @@ -119,8 +126,14 @@ class UTILS_PRIVATE CodeGenerator { // generate samplers utils::io::sstream& generateSamplers(utils::io::sstream& out, - filament::SamplerBindingPoints bindingPoint, uint8_t firstBinding, - const filament::SamplerInterfaceBlock& sib) const; + filament::DescriptorSetBindingPoints set, + filament::SamplerInterfaceBlock::SamplerInfoList const& list) const; + + utils::io::sstream& generateSamplers(utils::io::sstream& out, + filament::DescriptorSetBindingPoints set, + const filament::SamplerInterfaceBlock& sib) const { + return generateSamplers(out, set, sib.getSamplerInfoList()); + } // generate subpass static utils::io::sstream& generateSubpass(utils::io::sstream& out, @@ -128,7 +141,9 @@ class UTILS_PRIVATE CodeGenerator { // generate uniforms utils::io::sstream& generateUniforms(utils::io::sstream& out, ShaderStage stage, - filament::UniformBindingPoints binding, const filament::BufferInterfaceBlock& uib) const; + filament::DescriptorSetBindingPoints set, + filament::backend::descriptor_binding_t binding, + const filament::BufferInterfaceBlock& uib) const; // generate buffers utils::io::sstream& generateBuffers(utils::io::sstream& out, @@ -136,7 +151,9 @@ class UTILS_PRIVATE CodeGenerator { // generate an interface block utils::io::sstream& generateBufferInterfaceBlock(utils::io::sstream& out, ShaderStage stage, - uint32_t binding, const filament::BufferInterfaceBlock& uib) const; + filament::DescriptorSetBindingPoints set, + filament::backend::descriptor_binding_t binding, + const filament::BufferInterfaceBlock& uib) const; // generate material properties getters static utils::io::sstream& generateMaterialProperty(utils::io::sstream& out, @@ -153,24 +170,48 @@ class UTILS_PRIVATE CodeGenerator { utils::io::sstream& generateSpecializationConstant(utils::io::sstream& out, const char* name, uint32_t id, std::variant value) const; + utils::io::sstream& generatePushConstants(utils::io::sstream& out, + MaterialBuilder::PushConstantList const& pushConstants, + size_t const layoutLocation) const; + static utils::io::sstream& generatePostProcessGetters(utils::io::sstream& out, ShaderStage type); static utils::io::sstream& generateGetters(utils::io::sstream& out, ShaderStage stage); static utils::io::sstream& generateParameters(utils::io::sstream& out, ShaderStage type); static void fixupExternalSamplers( - std::string& shader, filament::SamplerInterfaceBlock const& sib) noexcept; + std::string& shader, filament::SamplerInterfaceBlock const& sib, + FeatureLevel featureLevel) noexcept; // These constants must match the equivalent in MetalState.h. // These values represent the starting index for uniform, ssbo, and sampler group [[buffer(n)]] // bindings. See the chart at the top of MetalState.h. - static constexpr uint32_t METAL_UNIFORM_BUFFER_BINDING_START = 17u; - static constexpr uint32_t METAL_SAMPLER_GROUP_BINDING_START = 27u; - static constexpr uint32_t METAL_SSBO_BINDING_START = 0; + static constexpr uint32_t METAL_PUSH_CONSTANT_BUFFER_INDEX = 20u; + static constexpr uint32_t METAL_DESCRIPTOR_SET_BINDING_START = 21u; + static constexpr uint32_t METAL_DYNAMIC_OFFSET_BINDING = 25u; + + uint32_t getUniqueSamplerBindingPoint() const noexcept { + return mUniqueSamplerBindingPoint++; + } + + uint32_t getUniqueUboBindingPoint() const noexcept { + return mUniqueUboBindingPoint++; + } + + uint32_t getUniqueSsboBindingPoint() const noexcept { + return mUniqueSsboBindingPoint++; + } private: filament::backend::Precision getDefaultPrecision(ShaderStage stage) const; filament::backend::Precision getDefaultUniformPrecision() const; + utils::io::sstream& generateInterfaceFields(utils::io::sstream& out, + utils::FixedCapacityVector const& infos, + filament::backend::Precision defaultPrecision) const; + + utils::io::sstream& generateUboAsPlainUniforms(utils::io::sstream& out, ShaderStage stage, + const filament::BufferInterfaceBlock& uib) const; + static const char* getUniformPrecisionQualifier(filament::backend::UniformType type, filament::backend::Precision precision, filament::backend::Precision uniformPrecision, @@ -183,15 +224,12 @@ class UTILS_PRIVATE CodeGenerator { // return name of the material property (e.g.: "ROUGHNESS") static char const* getConstantName(MaterialBuilder::Property property) noexcept; - static char const* getPrecisionQualifier(filament::backend::Precision precision, - filament::backend::Precision defaultPrecision) noexcept; + static char const* getPrecisionQualifier(filament::backend::Precision precision) noexcept; - ShaderModel mShaderModel; - TargetApi mTargetApi; - TargetLanguage mTargetLanguage; - FeatureLevel mFeatureLevel; + // return type (e.g.: "vec3", "vec4", "float") + static char const* getTypeName(UniformType type) noexcept; - // return type name of uniform (e.g.: "vec3", "vec4", "float") + // return type name of uniform Field (e.g.: "vec3", "vec4", "float") static char const* getUniformTypeName(filament::BufferInterfaceBlock::FieldInfo const& info) noexcept; // return type name of output (e.g.: "vec3", "vec4", "float") @@ -201,6 +239,14 @@ class UTILS_PRIVATE CodeGenerator { static char const* getInterpolationQualifier(filament::Interpolation interpolation) noexcept; static bool hasPrecision(filament::BufferInterfaceBlock::Type type) noexcept; + + ShaderModel mShaderModel; + TargetApi mTargetApi; + TargetLanguage mTargetLanguage; + FeatureLevel mFeatureLevel; + mutable uint32_t mUniqueSamplerBindingPoint = 0; + mutable uint32_t mUniqueUboBindingPoint = 0; + mutable uint32_t mUniqueSsboBindingPoint = 0; }; } // namespace filamat diff --git a/libs/filamat/src/shaders/MaterialInfo.h b/libs/filamat/src/shaders/MaterialInfo.h index 22af34cb28c..4324d1a24fd 100644 --- a/libs/filamat/src/shaders/MaterialInfo.h +++ b/libs/filamat/src/shaders/MaterialInfo.h @@ -19,8 +19,6 @@ #include -#include "../SamplerBindingMap.h" - #include #include @@ -28,6 +26,7 @@ #include #include +#include namespace filamat { @@ -39,6 +38,7 @@ struct UTILS_PUBLIC MaterialInfo { bool isLit; bool hasDoubleSidedCapability; bool hasExternalSamplers; + bool has3dSamplers; bool hasShadowMultiplier; bool hasTransparentShadow; bool specularAntiAliasing; @@ -51,6 +51,8 @@ struct UTILS_PUBLIC MaterialInfo { bool useLegacyMorphing; bool instanced; bool vertexDomainDeviceJittered; + bool userMaterialHasCustomDepth; + int stereoscopicEyeCount; filament::SpecularAmbientOcclusion specularAO; filament::RefractionMode refractionMode; filament::RefractionType refractionType; @@ -62,9 +64,9 @@ struct UTILS_PUBLIC MaterialInfo { filament::BufferInterfaceBlock uib; filament::SamplerInterfaceBlock sib; filament::SubpassInfo subpass; - filament::SamplerBindingMap samplerBindings; filament::ShaderQuality quality; filament::backend::FeatureLevel featureLevel; + filament::backend::StereoscopicType stereoscopicType; filament::math::uint3 groupSize; using BufferContainer = utils::FixedCapacityVector; diff --git a/libs/filamat/src/shaders/ShaderGenerator.cpp b/libs/filamat/src/shaders/ShaderGenerator.cpp index fbfca415964..63273b952b6 100644 --- a/libs/filamat/src/shaders/ShaderGenerator.cpp +++ b/libs/filamat/src/shaders/ShaderGenerator.cpp @@ -16,56 +16,219 @@ #include "ShaderGenerator.h" +#include "CodeGenerator.h" +#include "SibGenerator.h" +#include "UibGenerator.h" + #include +#include #include #include -#include +#include -#include "filamat/MaterialBuilder.h" -#include "CodeGenerator.h" -#include "../SibGenerator.h" -#include "../UibGenerator.h" +#include + +#include +#include +#include +#include #include +#include +#include + namespace filamat { using namespace filament; using namespace filament::backend; using namespace utils; -static const char* getShadingDefine(Shading shading) noexcept { - switch (shading) { - case Shading::LIT: return "SHADING_MODEL_LIT"; - case Shading::UNLIT: return "SHADING_MODEL_UNLIT"; - case Shading::SUBSURFACE: return "SHADING_MODEL_SUBSURFACE"; - case Shading::CLOTH: return "SHADING_MODEL_CLOTH"; - case Shading::SPECULAR_GLOSSINESS: return "SHADING_MODEL_SPECULAR_GLOSSINESS"; +void ShaderGenerator::generateSurfaceMaterialVariantDefines(utils::io::sstream& out, + ShaderStage stage, MaterialBuilder::FeatureLevel featureLevel, + MaterialInfo const& material, filament::Variant variant) noexcept { + + bool const litVariants = material.isLit || material.hasShadowMultiplier; + + CodeGenerator::generateDefine(out, "VARIANT_HAS_DIRECTIONAL_LIGHTING", + litVariants && variant.hasDirectionalLighting()); + CodeGenerator::generateDefine(out, "VARIANT_HAS_DYNAMIC_LIGHTING", + litVariants && variant.hasDynamicLighting()); + CodeGenerator::generateDefine(out, "VARIANT_HAS_SHADOWING", + litVariants && filament::Variant::isShadowReceiverVariant(variant)); + CodeGenerator::generateDefine(out, "VARIANT_HAS_VSM", + filament::Variant::isVSMVariant(variant)); + CodeGenerator::generateDefine(out, "VARIANT_HAS_STEREO", + hasStereo(variant, featureLevel)); + + switch (stage) { + case ShaderStage::VERTEX: + CodeGenerator::generateDefine(out, "VARIANT_HAS_SKINNING_OR_MORPHING", + hasSkinningOrMorphing(variant, featureLevel)); + break; + case ShaderStage::FRAGMENT: + CodeGenerator::generateDefine(out, "VARIANT_HAS_FOG", + filament::Variant::isFogVariant(variant)); + CodeGenerator::generateDefine(out, "VARIANT_HAS_PICKING", + filament::Variant::isPickingVariant(variant)); + CodeGenerator::generateDefine(out, "VARIANT_HAS_SSR", + filament::Variant::isSSRVariant(variant)); + break; + case ShaderStage::COMPUTE: + break; + } + + out << '\n'; + CodeGenerator::generateDefine(out, "MATERIAL_FEATURE_LEVEL", uint32_t(featureLevel)); + + CodeGenerator::generateDefine(out, "MATERIAL_HAS_SHADOW_MULTIPLIER", + material.hasShadowMultiplier); + + CodeGenerator::generateDefine(out, "MATERIAL_HAS_INSTANCES", material.instanced); + + CodeGenerator::generateDefine(out, "MATERIAL_HAS_VERTEX_DOMAIN_DEVICE_JITTERED", + material.vertexDomainDeviceJittered); + + CodeGenerator::generateDefine(out, "MATERIAL_HAS_TRANSPARENT_SHADOW", + material.hasTransparentShadow); + + if (stage == ShaderStage::FRAGMENT) { + // We only support both screen-space refractions and reflections at the same time. + // And the MATERIAL_HAS_REFRACTION/MATERIAL_HAS_REFLECTIONS defines signify if + // refraction/reflections are supported by the material. + + CodeGenerator::generateDefine(out, "MATERIAL_HAS_REFRACTION", + material.refractionMode != RefractionMode::NONE); + if (material.refractionMode != RefractionMode::NONE) { + CodeGenerator::generateDefine(out, "REFRACTION_MODE_CUBEMAP", + uint32_t(RefractionMode::CUBEMAP)); + CodeGenerator::generateDefine(out, "REFRACTION_MODE_SCREEN_SPACE", + uint32_t(RefractionMode::SCREEN_SPACE)); + switch (material.refractionMode) { + case RefractionMode::NONE: + // can't be here + break; + case RefractionMode::CUBEMAP: + CodeGenerator::generateDefine(out, "REFRACTION_MODE", + "REFRACTION_MODE_CUBEMAP"); + break; + case RefractionMode::SCREEN_SPACE: + CodeGenerator::generateDefine(out, "REFRACTION_MODE", + "REFRACTION_MODE_SCREEN_SPACE"); + break; + } + CodeGenerator::generateDefine(out, "REFRACTION_TYPE_SOLID", + uint32_t(RefractionType::SOLID)); + CodeGenerator::generateDefine(out, "REFRACTION_TYPE_THIN", + uint32_t(RefractionType::THIN)); + switch (material.refractionType) { + case RefractionType::SOLID: + CodeGenerator::generateDefine(out, "REFRACTION_TYPE", "REFRACTION_TYPE_SOLID"); + break; + case RefractionType::THIN: + CodeGenerator::generateDefine(out, "REFRACTION_TYPE", "REFRACTION_TYPE_THIN"); + break; + } + } + CodeGenerator::generateDefine(out, "MATERIAL_HAS_REFLECTIONS", + material.reflectionMode == ReflectionMode::SCREEN_SPACE); + + CodeGenerator::generateDefine(out, "MATERIAL_HAS_DOUBLE_SIDED_CAPABILITY", + material.hasDoubleSidedCapability); + + CodeGenerator::generateDefine(out, "MATERIAL_HAS_CUSTOM_SURFACE_SHADING", + material.hasCustomSurfaceShading); + + out << '\n'; + switch (material.blendingMode) { + case BlendingMode::OPAQUE: + CodeGenerator::generateDefine(out, "BLEND_MODE_OPAQUE", true); + break; + case BlendingMode::TRANSPARENT: + CodeGenerator::generateDefine(out, "BLEND_MODE_TRANSPARENT", true); + break; + case BlendingMode::ADD: + CodeGenerator::generateDefine(out, "BLEND_MODE_ADD", true); + break; + case BlendingMode::MASKED: + CodeGenerator::generateDefine(out, "BLEND_MODE_MASKED", true); + break; + case BlendingMode::FADE: + // Fade is a special case of transparent + CodeGenerator::generateDefine(out, "BLEND_MODE_TRANSPARENT", true); + CodeGenerator::generateDefine(out, "BLEND_MODE_FADE", true); + break; + case BlendingMode::MULTIPLY: + CodeGenerator::generateDefine(out, "BLEND_MODE_MULTIPLY", true); + break; + case BlendingMode::SCREEN: + CodeGenerator::generateDefine(out, "BLEND_MODE_SCREEN", true); + break; + case BlendingMode::CUSTOM: + CodeGenerator::generateDefine(out, "BLEND_MODE_CUSTOM", true); + break; + } + + switch (material.postLightingBlendingMode) { + case BlendingMode::OPAQUE: + CodeGenerator::generateDefine(out, "POST_LIGHTING_BLEND_MODE_OPAQUE", true); + break; + case BlendingMode::TRANSPARENT: + CodeGenerator::generateDefine(out, "POST_LIGHTING_BLEND_MODE_TRANSPARENT", true); + break; + case BlendingMode::ADD: + CodeGenerator::generateDefine(out, "POST_LIGHTING_BLEND_MODE_ADD", true); + break; + case BlendingMode::MULTIPLY: + CodeGenerator::generateDefine(out, "POST_LIGHTING_BLEND_MODE_MULTIPLY", true); + break; + case BlendingMode::SCREEN: + CodeGenerator::generateDefine(out, "POST_LIGHTING_BLEND_MODE_SCREEN", true); + break; + case BlendingMode::CUSTOM: + CodeGenerator::generateDefine(out, "POST_LIGHTING_BLEND_MODE_CUSTOM", true); + break; + default: + break; + } + + out << '\n'; + CodeGenerator::generateDefine(out, "GEOMETRIC_SPECULAR_AA", + material.specularAntiAliasing && material.isLit); + + CodeGenerator::generateDefine(out, "CLEAR_COAT_IOR_CHANGE", + material.clearCoatIorChange); } } -static void generateMaterialDefines(io::sstream& os, MaterialBuilder::PropertyList const properties, +void ShaderGenerator::generateSurfaceMaterialVariantProperties(io::sstream& out, + MaterialBuilder::PropertyList const properties, const MaterialBuilder::PreprocessorDefineList& defines) noexcept { + + UTILS_NOUNROLL for (size_t i = 0; i < MaterialBuilder::MATERIAL_PROPERTIES_COUNT; i++) { - CodeGenerator::generateMaterialProperty(os, static_cast(i), properties[i]); + CodeGenerator::generateMaterialProperty(out, + static_cast(i), properties[i]); } + // synthetic defines - bool hasTBN = + bool const hasTBN = properties[static_cast(MaterialBuilder::Property::ANISOTROPY)] || properties[static_cast(MaterialBuilder::Property::NORMAL)] || properties[static_cast(MaterialBuilder::Property::BENT_NORMAL)] || properties[static_cast(MaterialBuilder::Property::CLEAR_COAT_NORMAL)]; - CodeGenerator::generateDefine(os, "MATERIAL_NEEDS_TBN", hasTBN); + + CodeGenerator::generateDefine(out, "MATERIAL_NEEDS_TBN", hasTBN); // Additional, user-provided defines. for (const auto& define : defines) { - CodeGenerator::generateDefine(os, define.name.c_str(), define.value.c_str()); + CodeGenerator::generateDefine(out, define.name.c_str(), define.value.c_str()); } } -static void generateVertexDomain(io::sstream& vs, VertexDomain domain) noexcept { +void ShaderGenerator::generateVertexDomainDefines(io::sstream& vs, VertexDomain domain) noexcept { switch (domain) { case VertexDomain::OBJECT: CodeGenerator::generateDefine(vs, "VERTEX_DOMAIN_OBJECT", true); @@ -82,37 +245,30 @@ static void generateVertexDomain(io::sstream& vs, VertexDomain domain) noexcept } } -static void generatePostProcessMaterialVariantDefines(io::sstream& shader, +void ShaderGenerator::generatePostProcessMaterialVariantDefines(io::sstream& out, PostProcessVariant variant) noexcept { switch (variant) { case PostProcessVariant::OPAQUE: - CodeGenerator::generateDefine(shader, "POST_PROCESS_OPAQUE", 1u); + CodeGenerator::generateDefine(out, "POST_PROCESS_OPAQUE", 1u); break; case PostProcessVariant::TRANSLUCENT: - CodeGenerator::generateDefine(shader, "POST_PROCESS_OPAQUE", 0u); + CodeGenerator::generateDefine(out, "POST_PROCESS_OPAQUE", 0u); break; } } -static size_t countLines(const char* s) noexcept { - size_t lines = 0; - size_t i = 0; - while (s[i] != 0) { - if (s[i++] == '\n') lines++; - } - return lines; -} +void ShaderGenerator::appendShader(io::sstream& ss, + const CString& shader, size_t lineOffset) noexcept { -static size_t countLines(const CString& s) noexcept { - size_t lines = 0; - for (char i : s) { - if (i == '\n') lines++; - } - return lines; -} + auto countLines = [](const char* s) -> size_t { + size_t lines = 0; + size_t i = 0; + while (s[i]) { + if (s[i++] == '\n') lines++; + } + return lines; + }; -static void appendShader(io::sstream& ss, - const CString& shader, size_t lineOffset) noexcept { if (!shader.empty()) { size_t lines = countLines(ss.c_str()); ss << "#line " << lineOffset + 1 << '\n'; @@ -122,15 +278,42 @@ static void appendShader(io::sstream& ss, lines++; } // + 2 to account for the #line directives we just added - ss << "#line " << lines + countLines(shader) + 2 << "\n"; + ss << "#line " << lines + countLines(shader.c_str()) + 2 << "\n"; } } +void ShaderGenerator::generateUserSpecConstants( + const CodeGenerator& cg, io::sstream& fs, MaterialBuilder::ConstantList const& constants) { + // Constants 0 to CONFIG_MAX_RESERVED_SPEC_CONSTANTS - 1 are reserved by Filament. + size_t index = CONFIG_MAX_RESERVED_SPEC_CONSTANTS; + for (const auto& constant : constants) { + std::string const fullName = std::string("materialConstants_") + constant.name.c_str(); + switch (constant.type) { + case ConstantType::INT: + cg.generateSpecializationConstant( + fs, fullName.c_str(), index++, constant.defaultValue.i); + break; + case ConstantType::FLOAT: + cg.generateSpecializationConstant( + fs, fullName.c_str(), index++, constant.defaultValue.f); + break; + case ConstantType::BOOL: + cg.generateSpecializationConstant( + fs, fullName.c_str(), index++, constant.defaultValue.b); + break; + } + } +} + +// ------------------------------------------------------------------------------------------------ + ShaderGenerator::ShaderGenerator( MaterialBuilder::PropertyList const& properties, MaterialBuilder::VariableList const& variables, MaterialBuilder::OutputList const& outputs, MaterialBuilder::PreprocessorDefineList const& defines, + MaterialBuilder::ConstantList const& constants, + MaterialBuilder::PushConstantList const& pushConstants, CString const& materialCode, size_t lineOffset, CString const& materialVertexCode, size_t vertexLineOffset, MaterialBuilder::MaterialDomain materialDomain) noexcept { @@ -151,6 +334,8 @@ ShaderGenerator::ShaderGenerator( mMaterialVertexLineOffset = vertexLineOffset; mMaterialDomain = materialDomain; mDefines = defines; + mConstants = constants; + mPushConstants = pushConstants; if (mMaterialFragmentCode.empty()) { if (mMaterialDomain == MaterialBuilder::MaterialDomain::SURFACE) { @@ -175,43 +360,38 @@ ShaderGenerator::ShaderGenerator( } } -void ShaderGenerator::fixupExternalSamplers(ShaderModel sm, - std::string& shader, MaterialInfo const& material) noexcept { +void ShaderGenerator::fixupExternalSamplers(ShaderModel sm, std::string& shader, + MaterialBuilder::FeatureLevel featureLevel, + MaterialInfo const& material) noexcept { // External samplers are only supported on GL ES at the moment, we must // skip the fixup on desktop targets if (material.hasExternalSamplers && sm == ShaderModel::MOBILE) { - CodeGenerator::fixupExternalSamplers(shader, material.sib); + CodeGenerator::fixupExternalSamplers(shader, material.sib, featureLevel); } } std::string ShaderGenerator::createVertexProgram(ShaderModel shaderModel, MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage, + MaterialBuilder::FeatureLevel featureLevel, MaterialInfo const& material, const filament::Variant variant, Interpolation interpolation, VertexDomain vertexDomain) const noexcept { + assert_invariant(filament::Variant::isValid(variant)); assert_invariant(mMaterialDomain != MaterialBuilder::MaterialDomain::COMPUTE); if (mMaterialDomain == MaterialBuilder::MaterialDomain::POST_PROCESS) { - return createPostProcessVertexProgram(shaderModel, targetApi, - targetLanguage, material, variant.key); + return createPostProcessVertexProgram( + shaderModel, targetApi, + targetLanguage, featureLevel, material, variant.key); } io::sstream vs; - const CodeGenerator cg(shaderModel, targetApi, targetLanguage, material.featureLevel); - const bool lit = material.isLit; - - cg.generateProlog(vs, ShaderStage::VERTEX, material); - - cg.generateQualityDefine(vs, material.quality); - - CodeGenerator::generateDefine(vs, "FLIP_UV_ATTRIBUTE", material.flipUV); + const CodeGenerator cg(shaderModel, targetApi, targetLanguage, featureLevel); - CodeGenerator::generateDefine(vs, "LEGACY_MORPHING", material.useLegacyMorphing); + cg.generateProlog(vs, ShaderStage::VERTEX, material, variant); - const bool litVariants = lit || material.hasShadowMultiplier; - - assert_invariant(filament::Variant::isValid(variant)); + generateUserSpecConstants(cg, vs, mConstants); // note: even if the user vertex shader is empty, we can't use the "optimized" version if // we're in masked mode because fragment shader needs the color varyings @@ -230,34 +410,12 @@ std::string ShaderGenerator::createVertexProgram(ShaderModel shaderModel, CodeGenerator::generateDefine(vs, "USE_OPTIMIZED_DEPTH_VERTEX_SHADER", useOptimizedDepthVertexShader); - // material defines - CodeGenerator::generateDefine(vs, "MATERIAL_HAS_SHADOW_MULTIPLIER", - material.hasShadowMultiplier); - - CodeGenerator::generateDefine(vs, "MATERIAL_HAS_INSTANCES", material.instanced); - - CodeGenerator::generateDefine(vs, "MATERIAL_HAS_VERTEX_DOMAIN_DEVICE_JITTERED", - material.vertexDomainDeviceJittered); - - CodeGenerator::generateDefine(vs, "MATERIAL_HAS_TRANSPARENT_SHADOW", - material.hasTransparentShadow); - - CodeGenerator::generateDefine(vs, "VARIANT_HAS_DIRECTIONAL_LIGHTING", - litVariants && variant.hasDirectionalLighting()); - CodeGenerator::generateDefine(vs, "VARIANT_HAS_DYNAMIC_LIGHTING", - litVariants && variant.hasDynamicLighting()); - CodeGenerator::generateDefine(vs, "VARIANT_HAS_SHADOWING", - litVariants && filament::Variant::isShadowReceiverVariant(variant)); - CodeGenerator::generateDefine(vs, "VARIANT_HAS_SKINNING_OR_MORPHING", - variant.hasSkinningOrMorphing()); - CodeGenerator::generateDefine(vs, "VARIANT_HAS_VSM", - filament::Variant::isVSMVariant(variant)); + generateSurfaceMaterialVariantDefines(vs, ShaderStage::VERTEX, featureLevel, material, variant); - CodeGenerator::generateDefine(vs, getShadingDefine(material.shading), true); - generateMaterialDefines(vs, mProperties, mDefines); + generateSurfaceMaterialVariantProperties(vs, mProperties, mDefines); AttributeBitset attributes = material.requiredAttributes; - if (variant.hasSkinningOrMorphing()) { + if (hasSkinningOrMorphing(variant, featureLevel)) { attributes.set(VertexAttribute::BONE_INDICES); attributes.set(VertexAttribute::BONE_WEIGHTS); if (material.useLegacyMorphing) { @@ -271,7 +429,17 @@ std::string ShaderGenerator::createVertexProgram(ShaderModel shaderModel, attributes.set(VertexAttribute::MORPH_TANGENTS_3); } } - CodeGenerator::generateShaderInputs(vs, ShaderStage::VERTEX, attributes, interpolation); + + MaterialBuilder::PushConstantList vertexPushConstants; + std::copy_if(mPushConstants.begin(), mPushConstants.end(), + std::back_insert_iterator(vertexPushConstants), + [](MaterialBuilder::PushConstant const& constant) { + return constant.stage == ShaderStage::VERTEX; + }); + cg.generateShaderInputs(vs, ShaderStage::VERTEX, attributes, interpolation, + vertexPushConstants); + + CodeGenerator::generateCommonTypes(vs, ShaderStage::VERTEX); // custom material variables size_t variableIndex = 0; @@ -280,35 +448,49 @@ std::string ShaderGenerator::createVertexProgram(ShaderModel shaderModel, } // materials defines - generateVertexDomain(vs, vertexDomain); + generateVertexDomainDefines(vs, vertexDomain); // uniforms cg.generateUniforms(vs, ShaderStage::VERTEX, - UniformBindingPoints::PER_VIEW, UibGenerator::getPerViewUib()); + DescriptorSetBindingPoints::PER_VIEW, + +PerViewBindingPoints::FRAME_UNIFORMS, + UibGenerator::getPerViewUib()); + cg.generateUniforms(vs, ShaderStage::VERTEX, - UniformBindingPoints::PER_RENDERABLE, UibGenerator::getPerRenderableUib()); + DescriptorSetBindingPoints::PER_RENDERABLE, + +PerRenderableBindingPoints::OBJECT_UNIFORMS, + UibGenerator::getPerRenderableUib()); + + const bool litVariants = material.isLit || material.hasShadowMultiplier; if (litVariants && filament::Variant::isShadowReceiverVariant(variant)) { cg.generateUniforms(vs, ShaderStage::FRAGMENT, - UniformBindingPoints::SHADOW, UibGenerator::getShadowUib()); + DescriptorSetBindingPoints::PER_VIEW, + +PerViewBindingPoints::SHADOWS, + UibGenerator::getShadowUib()); } - if (variant.hasSkinningOrMorphing()) { + + if (hasSkinningOrMorphing(variant, featureLevel)) { cg.generateUniforms(vs, ShaderStage::VERTEX, - UniformBindingPoints::PER_RENDERABLE_BONES, + DescriptorSetBindingPoints::PER_RENDERABLE, + +PerRenderableBindingPoints::BONES_UNIFORMS, UibGenerator::getPerRenderableBonesUib()); cg.generateUniforms(vs, ShaderStage::VERTEX, - UniformBindingPoints::PER_RENDERABLE_MORPHING, + DescriptorSetBindingPoints::PER_RENDERABLE, + +PerRenderableBindingPoints::MORPHING_UNIFORMS, UibGenerator::getPerRenderableMorphingUib()); - cg.generateSamplers(vs, SamplerBindingPoints::PER_RENDERABLE_MORPHING, - material.samplerBindings.getBlockOffset(SamplerBindingPoints::PER_RENDERABLE_MORPHING), - SibGenerator::getPerRenderPrimitiveMorphingSib(variant)); + cg.generateSamplers(vs, DescriptorSetBindingPoints::PER_RENDERABLE, + SibGenerator::getPerRenderableSib(variant)); } + cg.generateUniforms(vs, ShaderStage::VERTEX, - UniformBindingPoints::PER_MATERIAL_INSTANCE, material.uib); + DescriptorSetBindingPoints::PER_MATERIAL, + +PerMaterialBindingPoints::MATERIAL_PARAMS, + material.uib); + CodeGenerator::generateSeparator(vs); + // TODO: should we generate per-view SIB in the vertex shader? - cg.generateSamplers(vs, SamplerBindingPoints::PER_MATERIAL_INSTANCE, - material.samplerBindings.getBlockOffset(SamplerBindingPoints::PER_MATERIAL_INSTANCE), - material.sib); + cg.generateSamplers(vs, DescriptorSetBindingPoints::PER_MATERIAL, material.sib); // shader code CodeGenerator::generateCommon(vs, ShaderStage::VERTEX); @@ -326,155 +508,49 @@ std::string ShaderGenerator::createVertexProgram(ShaderModel shaderModel, std::string ShaderGenerator::createFragmentProgram(ShaderModel shaderModel, MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage, + MaterialBuilder::FeatureLevel featureLevel, MaterialInfo const& material, const filament::Variant variant, - Interpolation interpolation) const noexcept { + Interpolation interpolation, UserVariantFilterMask variantFilter) const noexcept { + assert_invariant(filament::Variant::isValid(variant)); assert_invariant(mMaterialDomain != MaterialBuilder::MaterialDomain::COMPUTE); if (mMaterialDomain == MaterialBuilder::MaterialDomain::POST_PROCESS) { - return createPostProcessFragmentProgram(shaderModel, targetApi, targetLanguage, material, - variant.key); + return createPostProcessFragmentProgram(shaderModel, targetApi, targetLanguage, + featureLevel, material, variant.key); } - const CodeGenerator cg(shaderModel, targetApi, targetLanguage, material.featureLevel); - const bool lit = material.isLit; + const CodeGenerator cg(shaderModel, targetApi, targetLanguage, featureLevel); io::sstream fs; - cg.generateProlog(fs, ShaderStage::FRAGMENT, material); - - cg.generateQualityDefine(fs, material.quality); + cg.generateProlog(fs, ShaderStage::FRAGMENT, material, variant); - CodeGenerator::generateDefine(fs, "GEOMETRIC_SPECULAR_AA", material.specularAntiAliasing && lit); + generateUserSpecConstants(cg, fs, mConstants); - CodeGenerator::generateDefine(fs, "CLEAR_COAT_IOR_CHANGE", material.clearCoatIorChange); + generateSurfaceMaterialVariantDefines( + fs, ShaderStage::FRAGMENT, featureLevel, material, variant); auto defaultSpecularAO = shaderModel == ShaderModel::MOBILE ? - SpecularAmbientOcclusion::NONE : SpecularAmbientOcclusion::SIMPLE; + SpecularAmbientOcclusion::NONE : SpecularAmbientOcclusion::SIMPLE; auto specularAO = material.specularAOSet ? material.specularAO : defaultSpecularAO; CodeGenerator::generateDefine(fs, "SPECULAR_AMBIENT_OCCLUSION", uint32_t(specularAO)); - // We only support both screen-space refractions and reflections at the same time. - // And the MATERIAL_HAS_REFRACTION/MATERIAL_HAS_REFLECTIONS defines signify if refraction/reflections are supported by - // the material. - - CodeGenerator::generateDefine(fs, "MATERIAL_HAS_REFRACTION", material.refractionMode != RefractionMode::NONE); - if (material.refractionMode != RefractionMode::NONE) { - CodeGenerator::generateDefine(fs, "REFRACTION_MODE_CUBEMAP", uint32_t(RefractionMode::CUBEMAP)); - CodeGenerator::generateDefine(fs, "REFRACTION_MODE_SCREEN_SPACE", uint32_t(RefractionMode::SCREEN_SPACE)); - switch (material.refractionMode) { - case RefractionMode::NONE: - // can't be here - break; - case RefractionMode::CUBEMAP: - CodeGenerator::generateDefine(fs, "REFRACTION_MODE", "REFRACTION_MODE_CUBEMAP"); - break; - case RefractionMode::SCREEN_SPACE: - CodeGenerator::generateDefine(fs, "REFRACTION_MODE", "REFRACTION_MODE_SCREEN_SPACE"); - break; - } - CodeGenerator::generateDefine(fs, "REFRACTION_TYPE_SOLID", uint32_t(RefractionType::SOLID)); - CodeGenerator::generateDefine(fs, "REFRACTION_TYPE_THIN", uint32_t(RefractionType::THIN)); - switch (material.refractionType) { - case RefractionType::SOLID: - CodeGenerator::generateDefine(fs, "REFRACTION_TYPE", "REFRACTION_TYPE_SOLID"); - break; - case RefractionType::THIN: - CodeGenerator::generateDefine(fs, "REFRACTION_TYPE", "REFRACTION_TYPE_THIN"); - break; - } - } - - CodeGenerator::generateDefine(fs, "MATERIAL_HAS_REFLECTIONS", - material.reflectionMode == ReflectionMode::SCREEN_SPACE); - - bool multiBounceAO = material.multiBounceAOSet ? - material.multiBounceAO : shaderModel == ShaderModel::DESKTOP; + bool const multiBounceAO = material.multiBounceAOSet ? + material.multiBounceAO : shaderModel == ShaderModel::DESKTOP; CodeGenerator::generateDefine(fs, "MULTI_BOUNCE_AMBIENT_OCCLUSION", multiBounceAO ? 1u : 0u); - assert_invariant(filament::Variant::isValid(variant)); - - // lighting variants - bool litVariants = lit || material.hasShadowMultiplier; + generateSurfaceMaterialVariantProperties(fs, mProperties, mDefines); - // material defines - CodeGenerator::generateDefine(fs, "MATERIAL_HAS_SHADOW_MULTIPLIER", - material.hasShadowMultiplier); + MaterialBuilder::PushConstantList fragmentPushConstants; + std::copy_if(mPushConstants.begin(), mPushConstants.end(), + std::back_insert_iterator(fragmentPushConstants), + [](MaterialBuilder::PushConstant const& constant) { + return constant.stage == ShaderStage::FRAGMENT; + }); + cg.generateShaderInputs(fs, ShaderStage::FRAGMENT, material.requiredAttributes, interpolation, + fragmentPushConstants); - CodeGenerator::generateDefine(fs, "MATERIAL_HAS_INSTANCES", material.instanced); - - CodeGenerator::generateDefine(fs, "MATERIAL_HAS_VERTEX_DOMAIN_DEVICE_JITTERED", - material.vertexDomainDeviceJittered); - - CodeGenerator::generateDefine(fs, "MATERIAL_HAS_TRANSPARENT_SHADOW", - material.hasTransparentShadow); - - CodeGenerator::generateDefine(fs, "VARIANT_HAS_DIRECTIONAL_LIGHTING", - litVariants && variant.hasDirectionalLighting()); - CodeGenerator::generateDefine(fs, "VARIANT_HAS_DYNAMIC_LIGHTING", - litVariants && variant.hasDynamicLighting()); - CodeGenerator::generateDefine(fs, "VARIANT_HAS_SHADOWING", - litVariants && filament::Variant::isShadowReceiverVariant(variant)); - CodeGenerator::generateDefine(fs, "VARIANT_HAS_FOG", - filament::Variant::isFogVariant(variant)); - CodeGenerator::generateDefine(fs, "VARIANT_HAS_PICKING", - filament::Variant::isPickingVariant(variant)); - CodeGenerator::generateDefine(fs, "VARIANT_HAS_VSM", - filament::Variant::isVSMVariant(variant)); - CodeGenerator::generateDefine(fs, "VARIANT_HAS_SSR", - filament::Variant::isSSRVariant(variant)); - - CodeGenerator::generateDefine(fs, "MATERIAL_HAS_DOUBLE_SIDED_CAPABILITY", - material.hasDoubleSidedCapability); - switch (material.blendingMode) { - case BlendingMode::OPAQUE: - CodeGenerator::generateDefine(fs, "BLEND_MODE_OPAQUE", true); - break; - case BlendingMode::TRANSPARENT: - CodeGenerator::generateDefine(fs, "BLEND_MODE_TRANSPARENT", true); - break; - case BlendingMode::ADD: - CodeGenerator::generateDefine(fs, "BLEND_MODE_ADD", true); - break; - case BlendingMode::MASKED: - CodeGenerator::generateDefine(fs, "BLEND_MODE_MASKED", true); - break; - case BlendingMode::FADE: - // Fade is a special case of transparent - CodeGenerator::generateDefine(fs, "BLEND_MODE_TRANSPARENT", true); - CodeGenerator::generateDefine(fs, "BLEND_MODE_FADE", true); - break; - case BlendingMode::MULTIPLY: - CodeGenerator::generateDefine(fs, "BLEND_MODE_MULTIPLY", true); - break; - case BlendingMode::SCREEN: - CodeGenerator::generateDefine(fs, "BLEND_MODE_SCREEN", true); - break; - } - switch (material.postLightingBlendingMode) { - case BlendingMode::OPAQUE: - CodeGenerator::generateDefine(fs, "POST_LIGHTING_BLEND_MODE_OPAQUE", true); - break; - case BlendingMode::TRANSPARENT: - CodeGenerator::generateDefine(fs, "POST_LIGHTING_BLEND_MODE_TRANSPARENT", true); - break; - case BlendingMode::ADD: - CodeGenerator::generateDefine(fs, "POST_LIGHTING_BLEND_MODE_ADD", true); - break; - case BlendingMode::MULTIPLY: - CodeGenerator::generateDefine(fs, "POST_LIGHTING_BLEND_MODE_MULTIPLY", true); - break; - case BlendingMode::SCREEN: - CodeGenerator::generateDefine(fs, "POST_LIGHTING_BLEND_MODE_SCREEN", true); - break; - default: - break; - } - CodeGenerator::generateDefine(fs, getShadingDefine(material.shading), true); - generateMaterialDefines(fs, mProperties, mDefines); - - CodeGenerator::generateDefine(fs, "MATERIAL_HAS_CUSTOM_SURFACE_SHADING", material.hasCustomSurfaceShading); - - CodeGenerator::generateShaderInputs(fs, ShaderStage::FRAGMENT, material.requiredAttributes, interpolation); + CodeGenerator::generateCommonTypes(fs, ShaderStage::FRAGMENT); // custom material variables size_t variableIndex = 0; @@ -484,26 +560,77 @@ std::string ShaderGenerator::createFragmentProgram(ShaderModel shaderModel, // uniforms and samplers cg.generateUniforms(fs, ShaderStage::FRAGMENT, - UniformBindingPoints::PER_VIEW, UibGenerator::getPerViewUib()); - cg.generateUniforms(fs, ShaderStage::FRAGMENT, - UniformBindingPoints::PER_RENDERABLE, UibGenerator::getPerRenderableUib()); + DescriptorSetBindingPoints::PER_VIEW, + +PerViewBindingPoints::FRAME_UNIFORMS, + UibGenerator::getPerViewUib()); + cg.generateUniforms(fs, ShaderStage::FRAGMENT, - UniformBindingPoints::LIGHTS, UibGenerator::getLightsUib()); + DescriptorSetBindingPoints::PER_RENDERABLE, + +PerRenderableBindingPoints::OBJECT_UNIFORMS, + UibGenerator::getPerRenderableUib()); + + if (variant.hasDynamicLighting()) { + cg.generateUniforms(fs, ShaderStage::FRAGMENT, + DescriptorSetBindingPoints::PER_VIEW, + +PerViewBindingPoints::LIGHTS, + UibGenerator::getLightsUib()); + } + + bool const litVariants = material.isLit || material.hasShadowMultiplier; if (litVariants && filament::Variant::isShadowReceiverVariant(variant)) { cg.generateUniforms(fs, ShaderStage::FRAGMENT, - UniformBindingPoints::SHADOW, UibGenerator::getShadowUib()); + DescriptorSetBindingPoints::PER_VIEW, + +PerViewBindingPoints::SHADOWS, + UibGenerator::getShadowUib()); } + + if (variant.hasDynamicLighting()) { + cg.generateUniforms(fs, ShaderStage::FRAGMENT, + DescriptorSetBindingPoints::PER_VIEW, + +PerViewBindingPoints::RECORD_BUFFER, + UibGenerator::getFroxelRecordUib()); + + cg.generateUniforms(fs, ShaderStage::FRAGMENT, + DescriptorSetBindingPoints::PER_VIEW, + +PerViewBindingPoints::FROXEL_BUFFER, + UibGenerator::getFroxelsUib()); + } + cg.generateUniforms(fs, ShaderStage::FRAGMENT, - UniformBindingPoints::FROXEL_RECORDS, UibGenerator::getFroxelRecordUib()); - cg.generateUniforms(fs, ShaderStage::FRAGMENT, - UniformBindingPoints::PER_MATERIAL_INSTANCE, material.uib); + DescriptorSetBindingPoints::PER_MATERIAL, + +PerMaterialBindingPoints::MATERIAL_PARAMS, + material.uib); + CodeGenerator::generateSeparator(fs); - cg.generateSamplers(fs, SamplerBindingPoints::PER_VIEW, - material.samplerBindings.getBlockOffset(SamplerBindingPoints::PER_VIEW), - SibGenerator::getPerViewSib(variant)); - cg.generateSamplers(fs, SamplerBindingPoints::PER_MATERIAL_INSTANCE, - material.samplerBindings.getBlockOffset(SamplerBindingPoints::PER_MATERIAL_INSTANCE), - material.sib); + + if (featureLevel >= FeatureLevel::FEATURE_LEVEL_1) { + assert_invariant(mMaterialDomain == MaterialDomain::SURFACE); + + auto const perViewDescriptorSetLayout = getPerViewDescriptorSetLayoutWithVariant( + variant, variantFilter, + material.isLit || material.hasShadowMultiplier, + material.reflectionMode, material.refractionMode); + + // this is the list of samplers we need to filter + auto list = SibGenerator::getPerViewSib(variant).getSamplerInfoList(); + + // remove all the samplers that are not included in the descriptor-set layout + list.erase( + std::remove_if(list.begin(), list.end(), + [&perViewDescriptorSetLayout](auto const& entry) { + auto pos = std::find_if( + perViewDescriptorSetLayout.bindings.begin(), + perViewDescriptorSetLayout.bindings.end(), + [&entry](const auto& item) { + return item.binding == entry.binding; + }); + return pos == perViewDescriptorSetLayout.bindings.end(); + }), list.end()); + + cg.generateSamplers(fs, DescriptorSetBindingPoints::PER_VIEW, list); + } + + cg.generateSamplers(fs, DescriptorSetBindingPoints::PER_MATERIAL, material.sib); fs << "float filament_lodBias;\n"; @@ -512,25 +639,34 @@ std::string ShaderGenerator::createFragmentProgram(ShaderModel shaderModel, CodeGenerator::generateGetters(fs, ShaderStage::FRAGMENT); CodeGenerator::generateCommonMaterial(fs, ShaderStage::FRAGMENT); CodeGenerator::generateParameters(fs, ShaderStage::FRAGMENT); - CodeGenerator::generateFog(fs, ShaderStage::FRAGMENT); + + if (filament::Variant::isFogVariant(variant)) { + CodeGenerator::generateFog(fs, ShaderStage::FRAGMENT); + } // shading model if (filament::Variant::isValidDepthVariant(variant)) { // In MASKED mode or with transparent shadows, we need the alpha channel computed by // the material (user code), so we append it here. - if (material.blendingMode == BlendingMode::MASKED || material.hasTransparentShadow) { + if (material.userMaterialHasCustomDepth || + material.blendingMode == BlendingMode::MASKED || (( + material.blendingMode == BlendingMode::TRANSPARENT || + material.blendingMode == BlendingMode::FADE) + && material.hasTransparentShadow)) { appendShader(fs, mMaterialFragmentCode, mMaterialLineOffset); } - // these variants are special and are treated as DEPTH variants. Filament will never + // These variants are special and are treated as DEPTH variants. Filament will never // request that variant for the color pass. CodeGenerator::generateDepthShaderMain(fs, ShaderStage::FRAGMENT); } else { appendShader(fs, mMaterialFragmentCode, mMaterialLineOffset); - if (filament::Variant::isSSRVariant(variant)) { - CodeGenerator::generateShaderReflections(fs, ShaderStage::FRAGMENT, variant); - } else if (material.isLit) { - CodeGenerator::generateShaderLit(fs, ShaderStage::FRAGMENT, variant, - material.shading,material.hasCustomSurfaceShading); + if (material.isLit) { + if (filament::Variant::isSSRVariant(variant)) { + CodeGenerator::generateShaderReflections(fs, ShaderStage::FRAGMENT); + } else { + CodeGenerator::generateShaderLit(fs, ShaderStage::FRAGMENT, variant, + material.shading,material.hasCustomSurfaceShading); + } } else { CodeGenerator::generateShaderUnlit(fs, ShaderStage::FRAGMENT, variant, material.hasShadowMultiplier); @@ -546,25 +682,30 @@ std::string ShaderGenerator::createFragmentProgram(ShaderModel shaderModel, std::string ShaderGenerator::createComputeProgram(filament::backend::ShaderModel shaderModel, MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage, - MaterialInfo const& material, filament::Variant variant) const noexcept { + MaterialBuilder::FeatureLevel featureLevel, + MaterialInfo const& material) const noexcept { assert_invariant(mMaterialDomain == MaterialBuilder::MaterialDomain::COMPUTE); - assert_invariant(material.featureLevel >= FeatureLevel::FEATURE_LEVEL_2); - const CodeGenerator cg(shaderModel, targetApi, targetLanguage, material.featureLevel); + assert_invariant(featureLevel >= FeatureLevel::FEATURE_LEVEL_2); + const CodeGenerator cg(shaderModel, targetApi, targetLanguage, featureLevel); io::sstream s; - cg.generateProlog(s, ShaderStage::COMPUTE, material); + cg.generateProlog(s, ShaderStage::COMPUTE, material, {}); - cg.generateQualityDefine(s, material.quality); + generateUserSpecConstants(cg, s, mConstants); + + CodeGenerator::generateCommonTypes(s, ShaderStage::COMPUTE); cg.generateUniforms(s, ShaderStage::COMPUTE, - UniformBindingPoints::PER_VIEW, UibGenerator::getPerViewUib()); + DescriptorSetBindingPoints::PER_VIEW, + +PerViewBindingPoints::FRAME_UNIFORMS, + UibGenerator::getPerViewUib()); cg.generateUniforms(s, ShaderStage::COMPUTE, - UniformBindingPoints::PER_MATERIAL_INSTANCE, material.uib); + DescriptorSetBindingPoints::PER_MATERIAL, + +PerMaterialBindingPoints::MATERIAL_PARAMS, + material.uib); - cg.generateSamplers(s, SamplerBindingPoints::PER_MATERIAL_INSTANCE, - material.samplerBindings.getBlockOffset(SamplerBindingPoints::PER_MATERIAL_INSTANCE), - material.sib); + cg.generateSamplers(s, DescriptorSetBindingPoints::PER_MATERIAL, material.sib); // generate SSBO cg.generateBuffers(s, material.buffers); @@ -585,12 +726,13 @@ std::string ShaderGenerator::createComputeProgram(filament::backend::ShaderModel std::string ShaderGenerator::createPostProcessVertexProgram(ShaderModel sm, MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage, + MaterialBuilder::FeatureLevel featureLevel, MaterialInfo const& material, const filament::Variant::type_t variantKey) const noexcept { - const CodeGenerator cg(sm, targetApi, targetLanguage, material.featureLevel); + const CodeGenerator cg(sm, targetApi, targetLanguage, featureLevel); io::sstream vs; - cg.generateProlog(vs, ShaderStage::VERTEX, material); + cg.generateProlog(vs, ShaderStage::VERTEX, material, {}); - cg.generateQualityDefine(vs, material.quality); + generateUserSpecConstants(cg, vs, mConstants); CodeGenerator::generateDefine(vs, "LOCATION_POSITION", uint32_t(VertexAttribute::POSITION)); @@ -604,13 +746,16 @@ std::string ShaderGenerator::createPostProcessVertexProgram(ShaderModel sm, generatePostProcessMaterialVariantDefines(vs, PostProcessVariant(variantKey)); cg.generateUniforms(vs, ShaderStage::VERTEX, - UniformBindingPoints::PER_VIEW, UibGenerator::getPerViewUib()); + DescriptorSetBindingPoints::PER_VIEW, + +PerViewBindingPoints::FRAME_UNIFORMS, + UibGenerator::getPerViewUib()); + cg.generateUniforms(vs, ShaderStage::VERTEX, - UniformBindingPoints::PER_MATERIAL_INSTANCE, material.uib); + DescriptorSetBindingPoints::PER_MATERIAL, + +PerMaterialBindingPoints::MATERIAL_PARAMS, + material.uib); - cg.generateSamplers(vs, SamplerBindingPoints::PER_MATERIAL_INSTANCE, - material.samplerBindings.getBlockOffset(SamplerBindingPoints::PER_MATERIAL_INSTANCE), - material.sib); + cg.generateSamplers(vs, DescriptorSetBindingPoints::PER_MATERIAL, material.sib); CodeGenerator::generatePostProcessCommon(vs, ShaderStage::VERTEX); CodeGenerator::generatePostProcessGetters(vs, ShaderStage::VERTEX); @@ -625,12 +770,13 @@ std::string ShaderGenerator::createPostProcessVertexProgram(ShaderModel sm, std::string ShaderGenerator::createPostProcessFragmentProgram(ShaderModel sm, MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage, + MaterialBuilder::FeatureLevel featureLevel, MaterialInfo const& material, uint8_t variant) const noexcept { - const CodeGenerator cg(sm, targetApi, targetLanguage, material.featureLevel); + const CodeGenerator cg(sm, targetApi, targetLanguage, featureLevel); io::sstream fs; - cg.generateProlog(fs, ShaderStage::FRAGMENT, material); + cg.generateProlog(fs, ShaderStage::FRAGMENT, material, {}); - cg.generateQualityDefine(fs, material.quality); + generateUserSpecConstants(cg, fs, mConstants); generatePostProcessMaterialVariantDefines(fs, PostProcessVariant(variant)); @@ -641,13 +787,16 @@ std::string ShaderGenerator::createPostProcessFragmentProgram(ShaderModel sm, } cg.generateUniforms(fs, ShaderStage::FRAGMENT, - UniformBindingPoints::PER_VIEW, UibGenerator::getPerViewUib()); + DescriptorSetBindingPoints::PER_VIEW, + +PerViewBindingPoints::FRAME_UNIFORMS, + UibGenerator::getPerViewUib()); + cg.generateUniforms(fs, ShaderStage::FRAGMENT, - UniformBindingPoints::PER_MATERIAL_INSTANCE, material.uib); + DescriptorSetBindingPoints::PER_MATERIAL, + +PerMaterialBindingPoints::MATERIAL_PARAMS, + material.uib); - cg.generateSamplers(fs, SamplerBindingPoints::PER_MATERIAL_INSTANCE, - material.samplerBindings.getBlockOffset(SamplerBindingPoints::PER_MATERIAL_INSTANCE), - material.sib); + cg.generateSamplers(fs, DescriptorSetBindingPoints::PER_MATERIAL, material.sib); // subpass CodeGenerator::generateSubpass(fs, material.subpass); @@ -659,7 +808,7 @@ std::string ShaderGenerator::createPostProcessFragmentProgram(ShaderModel sm, for (const auto& output : mOutputs) { if (output.target == MaterialBuilder::OutputTarget::COLOR) { cg.generateOutput(fs, ShaderStage::FRAGMENT, output.name, output.location, - output.qualifier, output.type); + output.qualifier, output.precision, output.type); } if (output.target == MaterialBuilder::OutputTarget::DEPTH) { CodeGenerator::generateDefine(fs, "FRAG_OUTPUT_DEPTH", 1u); @@ -675,4 +824,39 @@ std::string ShaderGenerator::createPostProcessFragmentProgram(ShaderModel sm, return fs.c_str(); } +bool ShaderGenerator::hasSkinningOrMorphing( + filament::Variant variant, MaterialBuilder::FeatureLevel featureLevel) noexcept { + return variant.hasSkinningOrMorphing() + // HACK(exv): Ignore skinning/morphing variant when targeting ESSL 1.0. We should + // either properly support skinning on FL0 or build a system in matc which allows + // the set of included variants to differ per-feature level. + && featureLevel > MaterialBuilder::FeatureLevel::FEATURE_LEVEL_0; +} + +bool ShaderGenerator::hasStereo( + filament::Variant variant, MaterialBuilder::FeatureLevel featureLevel) noexcept { + return variant.hasStereo() + // HACK(exv): Ignore stereo variant when targeting ESSL 1.0. We should properly build a + // system in matc which allows the set of included variants to differ per-feature level. + && featureLevel > MaterialBuilder::FeatureLevel::FEATURE_LEVEL_0; +} + +backend::DescriptorSetLayout ShaderGenerator::getPerViewDescriptorSetLayoutWithVariant( + filament::Variant variant, + UserVariantFilterMask variantFilter, + bool isLit, + ReflectionMode reflectionMode, + RefractionMode refractionMode) { + if (filament::Variant::isValidDepthVariant(variant)) { + return descriptor_sets::getDepthVariantLayout(); + } + if (filament::Variant::isSSRVariant(variant)) { + return descriptor_sets::getSsrVariantLayout(); + } + // We need to filter out all the descriptors not included in the "resolved" layout below + return descriptor_sets::getPerViewDescriptorSetLayout( + MaterialDomain::SURFACE, variantFilter, + isLit, reflectionMode, refractionMode); +} + } // namespace filament diff --git a/libs/filamat/src/shaders/ShaderGenerator.h b/libs/filamat/src/shaders/ShaderGenerator.h index 2d7a63bd9e7..1c81411ca37 100644 --- a/libs/filamat/src/shaders/ShaderGenerator.h +++ b/libs/filamat/src/shaders/ShaderGenerator.h @@ -20,16 +20,24 @@ #include "MaterialInfo.h" +#include "UibGenerator.h" + #include #include +#include #include +#include + #include #include -#include +#include + +#include +#include namespace filamat { @@ -42,6 +50,8 @@ class ShaderGenerator { MaterialBuilder::VariableList const& variables, MaterialBuilder::OutputList const& outputs, MaterialBuilder::PreprocessorDefineList const& defines, + MaterialBuilder::ConstantList const& constants, + MaterialBuilder::PushConstantList const& pushConstants, utils::CString const& materialCode, size_t lineOffset, utils::CString const& materialVertexCode, @@ -50,18 +60,22 @@ class ShaderGenerator { std::string createVertexProgram(filament::backend::ShaderModel shaderModel, MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage, + MaterialBuilder::FeatureLevel featureLevel, MaterialInfo const& material, filament::Variant variant, filament::Interpolation interpolation, filament::VertexDomain vertexDomain) const noexcept; std::string createFragmentProgram(filament::backend::ShaderModel shaderModel, MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage, + MaterialBuilder::FeatureLevel featureLevel, MaterialInfo const& material, filament::Variant variant, - filament::Interpolation interpolation) const noexcept; + filament::Interpolation interpolation, + filament::UserVariantFilterMask variantFilter) const noexcept; std::string createComputeProgram(filament::backend::ShaderModel shaderModel, MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage, - MaterialInfo const& material, filament::Variant variant) const noexcept; + MaterialBuilder::FeatureLevel featureLevel, + MaterialInfo const& material) const noexcept; /** * When a GLSL shader is optimized we run it through an intermediate SPIR-V @@ -71,23 +85,64 @@ class ShaderGenerator { * the optimizations have been applied. */ static void fixupExternalSamplers(filament::backend::ShaderModel sm, std::string& shader, + MaterialBuilder::FeatureLevel featureLevel, MaterialInfo const& material) noexcept; + static filament::backend::DescriptorSetLayout getPerViewDescriptorSetLayoutWithVariant( + filament::Variant variant, + filament::UserVariantFilterMask variantFilter, + bool isLit, + filament::ReflectionMode reflectionMode, + filament::RefractionMode refractionMode); + private: + static void generateVertexDomainDefines(utils::io::sstream& out, + filament::VertexDomain domain) noexcept; + + static void generateSurfaceMaterialVariantProperties(utils::io::sstream& out, + MaterialBuilder::PropertyList const properties, + const MaterialBuilder::PreprocessorDefineList& defines) noexcept; + + static void generateSurfaceMaterialVariantDefines(utils::io::sstream& out, + filament::backend::ShaderStage stage, + MaterialBuilder::FeatureLevel featureLevel, + MaterialInfo const& material, filament::Variant variant) noexcept; + + static void generatePostProcessMaterialVariantDefines(utils::io::sstream& out, + filament::PostProcessVariant variant) noexcept; + + static void generateUserSpecConstants( + const CodeGenerator& cg, utils::io::sstream& fs, + MaterialBuilder::ConstantList const& constants); std::string createPostProcessVertexProgram(filament::backend::ShaderModel sm, MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage, + MaterialBuilder::FeatureLevel featureLevel, MaterialInfo const& material, filament::Variant::type_t variantKey) const noexcept; std::string createPostProcessFragmentProgram(filament::backend::ShaderModel sm, MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage, + MaterialBuilder::FeatureLevel featureLevel, MaterialInfo const& material, uint8_t variant) const noexcept; + static void appendShader(utils::io::sstream& ss, + const utils::CString& shader, size_t lineOffset) noexcept; + + static bool hasSkinningOrMorphing( + filament::Variant variant, + MaterialBuilder::FeatureLevel featureLevel) noexcept; + + static bool hasStereo( + filament::Variant variant, + MaterialBuilder::FeatureLevel featureLevel) noexcept; + MaterialBuilder::PropertyList mProperties; MaterialBuilder::VariableList mVariables; MaterialBuilder::OutputList mOutputs; MaterialBuilder::MaterialDomain mMaterialDomain; MaterialBuilder::PreprocessorDefineList mDefines; + MaterialBuilder::ConstantList mConstants; + MaterialBuilder::PushConstantList mPushConstants; utils::CString mMaterialFragmentCode; // fragment or compute code utils::CString mMaterialVertexCode; size_t mMaterialLineOffset; diff --git a/libs/filamat/src/shaders/SibGenerator.cpp b/libs/filamat/src/shaders/SibGenerator.cpp new file mode 100644 index 00000000000..ec07d9b186f --- /dev/null +++ b/libs/filamat/src/shaders/SibGenerator.cpp @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SibGenerator.h" + +#include "private/filament/Variant.h" +#include "private/filament/EngineEnums.h" +#include "private/filament/SamplerInterfaceBlock.h" +#include "private/filament/SibStructs.h" + +#include + +#include + +namespace filament { + +SamplerInterfaceBlock const& SibGenerator::getPerViewSib(Variant variant) noexcept { + using Type = SamplerInterfaceBlock::Type; + using Format = SamplerInterfaceBlock::Format; + using Precision = SamplerInterfaceBlock::Precision; + + // What is happening here is that depending on the variant, some samplers' type or format + // can change (e.g.: when VSM is used the shadowmap sampler is a regular float sampler), + // so we return a different SamplerInterfaceBlock based on the variant. + // + // The samplers' name and binding (i.e. ordering) must match in all SamplerInterfaceBlocks + // because this information is stored per-material and not per-shader. + // + // For the SSR (reflections) SamplerInterfaceBlock, only two samplers are ever used, for this + // reason we name them "unused*" to ensure we're not using them by mistake (type/format don't + // matter). + + static SamplerInterfaceBlock const sibPcf{ SamplerInterfaceBlock::Builder() + .name("sampler0") + .stageFlags(backend::ShaderStageFlags::FRAGMENT) + .add( {{ "shadowMap", +PerViewBindingPoints::SHADOW_MAP, Type::SAMPLER_2D_ARRAY, Format::SHADOW, Precision::MEDIUM }, + { "iblDFG", +PerViewBindingPoints::IBL_DFG_LUT, Type::SAMPLER_2D, Format::FLOAT, Precision::MEDIUM }, + { "iblSpecular", +PerViewBindingPoints::IBL_SPECULAR, Type::SAMPLER_CUBEMAP, Format::FLOAT, Precision::MEDIUM }, + { "ssao", +PerViewBindingPoints::SSAO, Type::SAMPLER_2D_ARRAY, Format::FLOAT, Precision::MEDIUM }, + { "ssr", +PerViewBindingPoints::SSR, Type::SAMPLER_2D_ARRAY, Format::FLOAT, Precision::MEDIUM }, + { "structure", +PerViewBindingPoints::STRUCTURE, Type::SAMPLER_2D, Format::FLOAT, Precision::HIGH }, + { "fog", +PerViewBindingPoints::FOG, Type::SAMPLER_CUBEMAP, Format::FLOAT, Precision::MEDIUM }} + ) + .build() }; + + static SamplerInterfaceBlock const sibVsm{ SamplerInterfaceBlock::Builder() + .name("sampler0") + .stageFlags(backend::ShaderStageFlags::FRAGMENT) + .add( {{ "shadowMap", +PerViewBindingPoints::SHADOW_MAP, Type::SAMPLER_2D_ARRAY, Format::FLOAT, Precision::HIGH }, + { "iblDFG", +PerViewBindingPoints::IBL_DFG_LUT, Type::SAMPLER_2D, Format::FLOAT, Precision::MEDIUM }, + { "iblSpecular", +PerViewBindingPoints::IBL_SPECULAR, Type::SAMPLER_CUBEMAP, Format::FLOAT, Precision::MEDIUM }, + { "ssao", +PerViewBindingPoints::SSAO, Type::SAMPLER_2D_ARRAY, Format::FLOAT, Precision::MEDIUM }, + { "ssr", +PerViewBindingPoints::SSR, Type::SAMPLER_2D_ARRAY, Format::FLOAT, Precision::MEDIUM }, + { "structure", +PerViewBindingPoints::STRUCTURE, Type::SAMPLER_2D, Format::FLOAT, Precision::HIGH }, + { "fog", +PerViewBindingPoints::FOG, Type::SAMPLER_CUBEMAP, Format::FLOAT, Precision::MEDIUM }} + ) + .build() }; + + static SamplerInterfaceBlock const sibSsr{ SamplerInterfaceBlock::Builder() + .name("sampler0") + .stageFlags(backend::ShaderStageFlags::FRAGMENT) + .add( {{ "ssr", +PerViewBindingPoints::SSR, Type::SAMPLER_2D, Format::FLOAT, Precision::MEDIUM }, + { "structure", +PerViewBindingPoints::STRUCTURE, Type::SAMPLER_2D, Format::FLOAT, Precision::HIGH }} + ) + .build() }; + + if (Variant::isSSRVariant(variant)) { + return sibSsr; + } else if (Variant::isVSMVariant(variant)) { + return sibVsm; + } else { + return sibPcf; + } +} + +SamplerInterfaceBlock const& SibGenerator::getPerRenderableSib(Variant) noexcept { + using Type = SamplerInterfaceBlock::Type; + using Format = SamplerInterfaceBlock::Format; + using Precision = SamplerInterfaceBlock::Precision; + + static SamplerInterfaceBlock const sib = SamplerInterfaceBlock::Builder() + .name("sampler1") + .stageFlags(backend::ShaderStageFlags::VERTEX) + .add({ {"positions", +PerRenderableBindingPoints::MORPH_TARGET_POSITIONS, Type::SAMPLER_2D_ARRAY, Format::FLOAT, Precision::HIGH }, + {"tangents", +PerRenderableBindingPoints::MORPH_TARGET_TANGENTS, Type::SAMPLER_2D_ARRAY, Format::INT, Precision::HIGH }, + {"indicesAndWeights", +PerRenderableBindingPoints::BONES_INDICES_AND_WEIGHTS, Type::SAMPLER_2D, Format::FLOAT, Precision::HIGH }}) + .build(); + + return sib; +} + +SamplerInterfaceBlock const* SibGenerator::getSib(DescriptorSetBindingPoints set, Variant variant) noexcept { + switch (set) { + case DescriptorSetBindingPoints::PER_VIEW: + return &getPerViewSib(variant); + case DescriptorSetBindingPoints::PER_RENDERABLE: + return &getPerRenderableSib(variant); + default: + return nullptr; + } +} + +} // namespace filament diff --git a/libs/filamat/src/SibGenerator.h b/libs/filamat/src/shaders/SibGenerator.h similarity index 84% rename from libs/filamat/src/SibGenerator.h rename to libs/filamat/src/shaders/SibGenerator.h index 18ae7bb9f24..b510d02d308 100644 --- a/libs/filamat/src/SibGenerator.h +++ b/libs/filamat/src/shaders/SibGenerator.h @@ -30,8 +30,8 @@ class SamplerInterfaceBlock; class SibGenerator { public: static SamplerInterfaceBlock const& getPerViewSib(Variant variant) noexcept; - static SamplerInterfaceBlock const& getPerRenderPrimitiveMorphingSib(Variant variant) noexcept; - static SamplerInterfaceBlock const* getSib(filament::SamplerBindingPoints bindingPoint, Variant variant) noexcept; + static SamplerInterfaceBlock const& getPerRenderableSib(Variant variant) noexcept; + static SamplerInterfaceBlock const* getSib(filament::DescriptorSetBindingPoints bindingPoint, Variant variant) noexcept; // When adding a sampler block here, make sure to also update // FMaterial::getSurfaceProgramSlow and FMaterial::getPostProcessProgramSlow if needed }; diff --git a/libs/filamat/src/shaders/UibGenerator.cpp b/libs/filamat/src/shaders/UibGenerator.cpp new file mode 100644 index 00000000000..9d4d360b1a1 --- /dev/null +++ b/libs/filamat/src/shaders/UibGenerator.cpp @@ -0,0 +1,288 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "UibGenerator.h" +#include "private/filament/UibStructs.h" + +#include "private/filament/BufferInterfaceBlock.h" + +#include +#include + +#include + +#include + +namespace filament { + +using namespace backend; + +BufferInterfaceBlock const& UibGenerator::get(UibGenerator::Ubo ubo) noexcept { + assert_invariant(ubo != Ubo::MaterialParams); + switch (ubo) { + case Ubo::FrameUniforms: + return getPerViewUib(); + case Ubo::ObjectUniforms: + return getPerRenderableUib(); + case Ubo::BonesUniforms: + return getPerRenderableBonesUib(); + case Ubo::MorphingUniforms: + return getPerRenderableMorphingUib(); + case Ubo::LightsUniforms: + return getLightsUib(); + case Ubo::ShadowUniforms: + return getShadowUib(); + case Ubo::FroxelRecordUniforms: + return getFroxelRecordUib(); + case Ubo::FroxelsUniforms: + return getFroxelsUib(); + case Ubo::MaterialParams: + abort(); + } +} + +UibGenerator::Binding UibGenerator::getBinding(UibGenerator::Ubo ubo) noexcept { + switch (ubo) { + case Ubo::FrameUniforms: + return { +DescriptorSetBindingPoints::PER_VIEW, + +PerViewBindingPoints::FRAME_UNIFORMS }; + case Ubo::ObjectUniforms: + return { +DescriptorSetBindingPoints::PER_RENDERABLE, + +PerRenderableBindingPoints::OBJECT_UNIFORMS }; + case Ubo::BonesUniforms: + return { +DescriptorSetBindingPoints::PER_RENDERABLE, + +PerRenderableBindingPoints::BONES_UNIFORMS }; + case Ubo::MorphingUniforms: + return { +DescriptorSetBindingPoints::PER_RENDERABLE, + +PerRenderableBindingPoints::MORPHING_UNIFORMS }; + case Ubo::LightsUniforms: + return { +DescriptorSetBindingPoints::PER_VIEW, + +PerViewBindingPoints::LIGHTS }; + case Ubo::ShadowUniforms: + return { +DescriptorSetBindingPoints::PER_VIEW, + +PerViewBindingPoints::SHADOWS }; + case Ubo::FroxelRecordUniforms: + return { +DescriptorSetBindingPoints::PER_VIEW, + +PerViewBindingPoints::RECORD_BUFFER }; + case Ubo::FroxelsUniforms: + return { +DescriptorSetBindingPoints::PER_VIEW, + +PerViewBindingPoints::FROXEL_BUFFER }; + case Ubo::MaterialParams: + return { +DescriptorSetBindingPoints::PER_MATERIAL, + +PerMaterialBindingPoints::MATERIAL_PARAMS }; + } +} + +static_assert(CONFIG_MAX_SHADOW_CASCADES == 4, + "Changing CONFIG_MAX_SHADOW_CASCADES affects PerView size and breaks materials."); + +BufferInterfaceBlock const& UibGenerator::getPerViewUib() noexcept { + using Type = BufferInterfaceBlock::Type; + + static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder() + .name(PerViewUib::_name) + .add({ + { "viewFromWorldMatrix", 0, Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "worldFromViewMatrix", 0, Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "clipFromViewMatrix", 0, Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "viewFromClipMatrix", 0, Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "clipFromWorldMatrix", CONFIG_MAX_STEREOSCOPIC_EYES, + Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "worldFromClipMatrix", 0, Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "userWorldFromWorldMatrix",0,Type::MAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "clipTransform", 0, Type::FLOAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + + { "clipControl", 0, Type::FLOAT2, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "time", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "temporalNoise", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "userTime", 0, Type::FLOAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + + // ------------------------------------------------------------------------------------ + // values below should only be accessed in surface materials + // ------------------------------------------------------------------------------------ + + { "resolution", 0, Type::FLOAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "logicalViewportScale", 0, Type::FLOAT2, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "logicalViewportOffset", 0, Type::FLOAT2, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + + { "lodBias", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 }, + { "refractionLodOffset", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 }, + { "derivativesScale", 0, Type::FLOAT2 }, + + { "oneOverFarMinusNear", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "nearOverFarMinusNear", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "cameraFar", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "exposure", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, // high precision to work around #3602 (qualcom), + { "ev100", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 }, + { "needsAlphaChannel", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 }, + + // AO + { "aoSamplingQualityAndEdgeDistance", 0, Type::FLOAT }, + { "aoBentNormals", 0, Type::FLOAT }, + + // ------------------------------------------------------------------------------------ + // Dynamic Lighting [variant: DYN] + // ------------------------------------------------------------------------------------ + { "zParams", 0, Type::FLOAT4 }, + { "fParams", 0, Type::UINT3 }, + { "lightChannels", 0, Type::INT }, + { "froxelCountXY", 0, Type::FLOAT2 }, + + { "iblLuminance", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 }, + { "iblRoughnessOneLevel", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 }, + { "iblSH", 9, Type::FLOAT3 }, + + // ------------------------------------------------------------------------------------ + // Directional Lighting [variant: DIR] + // ------------------------------------------------------------------------------------ + { "lightDirection", 0, Type::FLOAT3, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "padding0", 0, Type::FLOAT }, + { "lightColorIntensity", 0, Type::FLOAT4, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 }, + { "sun", 0, Type::FLOAT4, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 }, + { "shadowFarAttenuationParams", 0, Type::FLOAT2, Precision::HIGH }, + + // ------------------------------------------------------------------------------------ + // Directional light shadowing [variant: SRE | DIR] + // ------------------------------------------------------------------------------------ + { "directionalShadows", 0, Type::INT }, + { "ssContactShadowDistance", 0, Type::FLOAT }, + + { "cascadeSplits", 0, Type::FLOAT4, Precision::HIGH }, + { "cascades", 0, Type::INT }, + { "shadowPenumbraRatioScale", 0, Type::FLOAT }, + { "lightFarAttenuationParams", 0, Type::FLOAT2, Precision::HIGH }, + + // ------------------------------------------------------------------------------------ + // VSM shadows [variant: VSM] + // ------------------------------------------------------------------------------------ + { "vsmExponent", 0, Type::FLOAT }, + { "vsmDepthScale", 0, Type::FLOAT }, + { "vsmLightBleedReduction", 0, Type::FLOAT }, + { "shadowSamplingType", 0, Type::UINT }, + + // ------------------------------------------------------------------------------------ + // Fog [variant: FOG] + // ------------------------------------------------------------------------------------ + { "fogDensity", 0, Type::FLOAT3,Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "fogStart", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "fogMaxOpacity", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 }, + { "fogMinMaxMip", 0, Type::UINT, Precision::HIGH }, + { "fogHeightFalloff", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "fogCutOffDistance", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "fogColor", 0, Type::FLOAT3, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 }, + { "fogColorFromIbl", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 }, + { "fogInscatteringStart", 0, Type::FLOAT, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + { "fogInscatteringSize", 0, Type::FLOAT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 }, + { "fogOneOverFarMinusNear", 0, Type::FLOAT, Precision::HIGH }, + { "fogNearOverFarMinusNear", 0, Type::FLOAT, Precision::HIGH }, + { "fogFromWorldMatrix", 0, Type::MAT3, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + + // ------------------------------------------------------------------------------------ + // Screen-space reflections [variant: SSR (i.e.: VSM | SRE)] + // ------------------------------------------------------------------------------------ + { "ssrReprojection", 0, Type::MAT4, Precision::HIGH }, + { "ssrUvFromViewMatrix", 0, Type::MAT4, Precision::HIGH }, + { "ssrThickness", 0, Type::FLOAT }, + { "ssrBias", 0, Type::FLOAT }, + { "ssrDistance", 0, Type::FLOAT }, + { "ssrStride", 0, Type::FLOAT }, + + // -------------------------------------------------------------------------------------------- + // user defined global variables + // -------------------------------------------------------------------------------------------- + { "custom", 4, Type::FLOAT4, Precision::HIGH, FeatureLevel::FEATURE_LEVEL_0 }, + + // -------------------------------------------------------------------------------------------- + // for feature level 0 / es2 usage + // -------------------------------------------------------------------------------------------- + { "rec709", 0, Type::INT, Precision::DEFAULT, FeatureLevel::FEATURE_LEVEL_0 }, + { "es2Reserved0", 0, Type::FLOAT }, + { "es2Reserved1", 0, Type::FLOAT }, + { "es2Reserved2", 0, Type::FLOAT }, + + // bring PerViewUib to 2 KiB + { "reserved", sizeof(PerViewUib::reserved)/16, Type::FLOAT4 } + }) + .build(); + + return uib; +} + +BufferInterfaceBlock const& UibGenerator::getPerRenderableUib() noexcept { + static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder() + .name(PerRenderableUib::_name) + .add({{ "data", CONFIG_MAX_INSTANCES, BufferInterfaceBlock::Type::STRUCT, {}, {}, + "PerRenderableData", sizeof(PerRenderableData), "CONFIG_MAX_INSTANCES" }}) + .build(); + return uib; +} + +BufferInterfaceBlock const& UibGenerator::getLightsUib() noexcept { + static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder() + .name(LightsUib::_name) + .add({{ "lights", CONFIG_MAX_LIGHT_COUNT, + BufferInterfaceBlock::Type::MAT4, Precision::HIGH }}) + .build(); + return uib; +} + +BufferInterfaceBlock const& UibGenerator::getShadowUib() noexcept { + static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder() + .name(ShadowUib::_name) + .add({{ "shadows", CONFIG_MAX_SHADOWMAPS, + BufferInterfaceBlock::Type::STRUCT, {}, {}, + "ShadowData", sizeof(ShadowUib::ShadowData) }}) + .build(); + return uib; +} + +BufferInterfaceBlock const& UibGenerator::getPerRenderableBonesUib() noexcept { + static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder() + .name(PerRenderableBoneUib::_name) + .add({{ "bones", CONFIG_MAX_BONE_COUNT, + BufferInterfaceBlock::Type::STRUCT, {}, {}, + "BoneData", sizeof(PerRenderableBoneUib::BoneData) }}) + .build(); + return uib; +} + +BufferInterfaceBlock const& UibGenerator::getPerRenderableMorphingUib() noexcept { + static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder() + .name(PerRenderableMorphingUib::_name) + .add({{ "weights", CONFIG_MAX_MORPH_TARGET_COUNT, + BufferInterfaceBlock::Type::FLOAT4 }}) + .build(); + return uib; +} + +BufferInterfaceBlock const& UibGenerator::getFroxelRecordUib() noexcept { + static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder() + .name(FroxelRecordUib::_name) + .add({{ "records", 1024, BufferInterfaceBlock::Type::UINT4, Precision::HIGH }}) + .build(); + return uib; +} + +BufferInterfaceBlock const& UibGenerator::getFroxelsUib() noexcept { + static BufferInterfaceBlock const uib = BufferInterfaceBlock::Builder() + .name(FroxelsUib::_name) + .add({{ "records", 1024, BufferInterfaceBlock::Type::UINT4, Precision::HIGH, {}, + {}, {}, "CONFIG_FROXEL_BUFFER_HEIGHT"}}) + .build(); + return uib; +} + +} // namespace filament diff --git a/libs/filamat/src/shaders/UibGenerator.h b/libs/filamat/src/shaders/UibGenerator.h new file mode 100644 index 00000000000..a2250bdad98 --- /dev/null +++ b/libs/filamat/src/shaders/UibGenerator.h @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_FILAMAT_UIBGENERATOR_H +#define TNT_FILAMAT_UIBGENERATOR_H + +#include + +#include + +#include + +#include +#include + +namespace filament { + +class BufferInterfaceBlock; + +class UibGenerator { +public: + // tag to represent a generated ubo. + enum class Ubo : uint8_t { + FrameUniforms, // uniforms updated per view + ObjectUniforms, // uniforms updated per renderable + BonesUniforms, // bones data, per renderable + MorphingUniforms, // morphing uniform/sampler updated per render primitive + LightsUniforms, // lights data array + ShadowUniforms, // punctual shadow data + FroxelRecordUniforms, // froxel records + FroxelsUniforms, // froxels + MaterialParams, // material instance ubo + // Update utils::Enum::count<>() below when adding values here + // These are limited by CONFIG_BINDING_COUNT (currently 10) + // When adding an UBO here, make sure to also update + // MaterialBuilder::writeCommonChunks() if needed + }; + + struct Binding { + backend::descriptor_set_t set; + backend::descriptor_binding_t binding; + }; + + // return the BufferInterfaceBlock for the given UBO tag + static BufferInterfaceBlock const& get(Ubo ubo) noexcept; + + // return the {set, binding } for the given UBO tag + static Binding getBinding(Ubo ubo) noexcept; + + // deprecate these... + static BufferInterfaceBlock const& getPerViewUib() noexcept; + static BufferInterfaceBlock const& getPerRenderableUib() noexcept; + static BufferInterfaceBlock const& getLightsUib() noexcept; + static BufferInterfaceBlock const& getShadowUib() noexcept; + static BufferInterfaceBlock const& getPerRenderableBonesUib() noexcept; + static BufferInterfaceBlock const& getPerRenderableMorphingUib() noexcept; + static BufferInterfaceBlock const& getFroxelRecordUib() noexcept; + static BufferInterfaceBlock const& getFroxelsUib() noexcept; +}; + +} // namespace filament + +template<> +struct utils::EnableIntegerOperators : public std::true_type {}; + +template<> +inline constexpr size_t utils::Enum::count() { return 9; } + + +#endif // TNT_FILAMAT_UIBGENERATOR_H diff --git a/libs/filamat/tests/test_argBufferFixup.cpp b/libs/filamat/tests/test_argBufferFixup.cpp index 350f7fa2c59..549b5b07354 100644 --- a/libs/filamat/tests/test_argBufferFixup.cpp +++ b/libs/filamat/tests/test_argBufferFixup.cpp @@ -72,7 +72,7 @@ TEST(ArgBufferFixup, TextureAndSampler) { auto argBuffer = MetalArgumentBuffer::Builder() .name("myArgumentBuffer") - .texture(0, "textureA", SamplerType::SAMPLER_2D, SamplerFormat::FLOAT) + .texture(0, "textureA", SamplerType::SAMPLER_2D, SamplerFormat::FLOAT, false) .sampler(1, "samplerA") .build(); auto argBufferStr = argBuffer->getMsl(); @@ -88,23 +88,87 @@ TEST(ArgBufferFixup, TextureAndSampler) { MetalArgumentBuffer::destroy(&argBuffer); } +TEST(ArgBufferFixup, Buffer) { + auto argBuffer = + MetalArgumentBuffer::Builder() + .name("myArgumentBuffer") + .buffer(0, "FrameUniforms", "frameUniforms") + .build(); + auto argBufferStr = argBuffer->getMsl(); + + const std::string expected = + "struct FrameUniforms;\n" + "struct myArgumentBuffer {\n" + "constant FrameUniforms* frameUniforms [[id(0)]];\n" + "}"; + + EXPECT_EQ(argBuffer->getMsl(), expected); + + MetalArgumentBuffer::destroy(&argBuffer); +} + +TEST(ArgBufferFixup, MultipleBuffers) { + auto argBuffer = + MetalArgumentBuffer::Builder() + .name("myArgumentBuffer") + .buffer(0, "FrameUniforms", "frameUniforms") + .buffer(1, "ObjectUniforms", "objectUniforms") + .build(); + auto argBufferStr = argBuffer->getMsl(); + + const std::string expected = + "struct FrameUniforms;\n" + "struct ObjectUniforms;\n" + "struct myArgumentBuffer {\n" + "constant FrameUniforms* frameUniforms [[id(0)]];\n" + "constant ObjectUniforms* objectUniforms [[id(1)]];\n" + "}"; + + EXPECT_EQ(argBuffer->getMsl(), expected); + + MetalArgumentBuffer::destroy(&argBuffer); +} + +TEST(ArgBufferFixup, TextureAndSamplerMS) { + auto argBuffer = + MetalArgumentBuffer::Builder() + .name("myArgumentBuffer") + .texture(0, "textureA", SamplerType::SAMPLER_2D, SamplerFormat::FLOAT, true) + .sampler(1, "samplerA") + .build(); + auto argBufferStr = argBuffer->getMsl(); + + const std::string expected = + "struct myArgumentBuffer {\n" + "texture2d_ms textureA [[id(0)]];\n" + "sampler samplerA [[id(1)]];\n" + "}"; + + EXPECT_EQ(argBuffer->getMsl(), expected); + + MetalArgumentBuffer::destroy(&argBuffer); +} + TEST(ArgBufferFixup, Sorted) { auto argBuffer = MetalArgumentBuffer::Builder() .name("myArgumentBuffer") .sampler(3, "samplerB") - .texture(0, "textureA", SamplerType::SAMPLER_2D, SamplerFormat::FLOAT) - .texture(2, "textureB", SamplerType::SAMPLER_2D, SamplerFormat::FLOAT) + .texture(0, "textureA", SamplerType::SAMPLER_2D, SamplerFormat::FLOAT, false) + .buffer(4, "FrameUniforms", "frameUniforms") + .texture(2, "textureB", SamplerType::SAMPLER_2D, SamplerFormat::FLOAT, false) .sampler(1, "samplerA") .build(); auto argBufferStr = argBuffer->getMsl(); const std::string expected = + "struct FrameUniforms;\n" "struct myArgumentBuffer {\n" "texture2d textureA [[id(0)]];\n" "sampler samplerA [[id(1)]];\n" "texture2d textureB [[id(2)]];\n" "sampler samplerB [[id(3)]];\n" + "constant FrameUniforms* frameUniforms [[id(4)]];\n" "}"; EXPECT_EQ(argBuffer->getMsl(), expected); @@ -116,12 +180,12 @@ TEST(ArgBufferFixup, TextureTypes) { auto argBuffer = MetalArgumentBuffer::Builder() .name("myArgumentBuffer") - .texture(0, "textureA", SamplerType::SAMPLER_2D, SamplerFormat::INT) - .texture(1, "textureB", SamplerType::SAMPLER_2D_ARRAY, SamplerFormat::UINT) - .texture(2, "textureC", SamplerType::SAMPLER_CUBEMAP, SamplerFormat::FLOAT) - .texture(3, "textureD", SamplerType::SAMPLER_EXTERNAL, SamplerFormat::FLOAT) - .texture(4, "textureE", SamplerType::SAMPLER_3D, SamplerFormat::FLOAT) - .texture(5, "textureF", SamplerType::SAMPLER_CUBEMAP_ARRAY, SamplerFormat::SHADOW) + .texture(0, "textureA", SamplerType::SAMPLER_2D, SamplerFormat::INT, false) + .texture(1, "textureB", SamplerType::SAMPLER_2D_ARRAY, SamplerFormat::UINT, false) + .texture(2, "textureC", SamplerType::SAMPLER_CUBEMAP, SamplerFormat::FLOAT, false) + .texture(3, "textureD", SamplerType::SAMPLER_EXTERNAL, SamplerFormat::FLOAT, false) + .texture(4, "textureE", SamplerType::SAMPLER_3D, SamplerFormat::FLOAT, false) + .texture(5, "textureF", SamplerType::SAMPLER_CUBEMAP_ARRAY, SamplerFormat::SHADOW, false) .build(); auto argBufferStr = argBuffer->getMsl(); @@ -147,7 +211,7 @@ TEST(ArgBufferFixup, InvalidType) { auto argBuffer = MetalArgumentBuffer::Builder() .name("myArgumentBuffer") - .texture(0, "textureA", SamplerType::SAMPLER_3D, SamplerFormat::SHADOW) + .texture(0, "textureA", SamplerType::SAMPLER_3D, SamplerFormat::SHADOW, false) .build(); MetalArgumentBuffer::destroy(&argBuffer); }, "failed assertion"); diff --git a/libs/filamat/tests/test_clipDistanceFixup.cpp b/libs/filamat/tests/test_clipDistanceFixup.cpp new file mode 100644 index 00000000000..5307e94e8bd --- /dev/null +++ b/libs/filamat/tests/test_clipDistanceFixup.cpp @@ -0,0 +1,58 @@ +/* +* Copyright (C) 2023 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. + */ + +#include + +#include "SpirvFixup.h" + +TEST(ClipDistanceFixup, NoReplacement) { + std::string disassembly = + " OpDecorate %gl_PerVertex Block\n" + " %void = OpTypeVoid\n" + " %3 = OpTypeFunction %void\n"; + std::string expected = + " OpDecorate %gl_PerVertex Block\n" + " %void = OpTypeVoid\n" + " %3 = OpTypeFunction %void\n"; + EXPECT_EQ(filamat::fixupClipDistance(disassembly), false); + EXPECT_EQ(disassembly, expected); +} + +TEST(ClipDistanceFixup, BasicReplacement) { + std::string disassembly = + " OpDecorate %gl_PerVertex Block\n" + " OpDecorate %filament_gl_ClipDistance Location 100\n" + " %void = OpTypeVoid\n" + " %3 = OpTypeFunction %void\n"; + std::string expected = + " OpDecorate %gl_PerVertex Block\n" + " OpDecorate %filament_gl_ClipDistance BuiltIn ClipDistance\n" + " %void = OpTypeVoid\n" + " %3 = OpTypeFunction %void\n"; + EXPECT_EQ(filamat::fixupClipDistance(disassembly), true); + EXPECT_EQ(disassembly, expected); +} + +TEST(ClipDistanceFixup, NoNewline) { + std::string disassembly = + " OpDecorate %gl_PerVertex Block\n" + " OpDecorate %filament_gl_ClipDistance Location 100"; + std::string expected = + " OpDecorate %gl_PerVertex Block\n" + " OpDecorate %filament_gl_ClipDistance BuiltIn ClipDistance"; + EXPECT_EQ(filamat::fixupClipDistance(disassembly), true); + EXPECT_EQ(disassembly, expected); +} diff --git a/libs/filamat/tests/test_filamat.cpp b/libs/filamat/tests/test_filamat.cpp index 95b25f25ebc..1d63fc15dcd 100644 --- a/libs/filamat/tests/test_filamat.cpp +++ b/libs/filamat/tests/test_filamat.cpp @@ -17,18 +17,21 @@ #include #include "sca/ASTHelpers.h" +#include "sca/GLSLTools.h" #include "shaders/ShaderGenerator.h" #include "MockIncluder.h" #include +#include #include #include using namespace utils; -using namespace ASTUtils; +using namespace ASTHelpers; +using namespace filamat; using namespace filament::backend; static ::testing::AssertionResult PropertyListsMatch(const MaterialBuilder::PropertyList& expected, @@ -72,7 +75,8 @@ std::string shaderWithAllProperties(JobSystem& jobSystem, ShaderStage type, return builder.peek(type, { ShaderModel::MOBILE, MaterialBuilder::TargetApi::OPENGL, - MaterialBuilder::TargetLanguage::GLSL + MaterialBuilder::TargetLanguage::GLSL, + FeatureLevel::FEATURE_LEVEL_1, }, allProperties); } @@ -697,6 +701,7 @@ TEST_F(MaterialCompiler, StaticCodeAnalyzerOutputFactor) { void material(inout MaterialInputs material) { prepareMaterial(material); material.postLightingColor = vec4(1.0); + material.postLightingMixFactor = 0.5; } )"); @@ -708,6 +713,7 @@ TEST_F(MaterialCompiler, StaticCodeAnalyzerOutputFactor) { glslTools.findProperties(ShaderStage::FRAGMENT, shaderCode, properties); MaterialBuilder::PropertyList expected{ false }; expected[size_t(filamat::MaterialBuilder::Property::POST_LIGHTING_COLOR)] = true; + expected[size_t(filamat::MaterialBuilder::Property::POST_LIGHTING_MIX_FACTOR)] = true; EXPECT_TRUE(PropertyListsMatch(expected, properties)); } @@ -802,6 +808,89 @@ TEST_F(MaterialCompiler, CustomSurfaceShadingHasFunction) { EXPECT_TRUE(result.isValid()); } +TEST_F(MaterialCompiler, ConstantParameter) { + std::string shaderCode(R"( + void material(inout MaterialInputs material) { + prepareMaterial(material); + if (materialConstants_myBoolConstant) { + material.baseColor.rgb = float3(materialConstants_myFloatConstant); + int anInt = materialConstants_myIntConstant; + } + } + )"); + std::string vertexCode(R"( + void materialVertex(inout MaterialVertexInputs material) { + int anInt = materialConstants_myIntConstant; + bool aBool = materialConstants_myBoolConstant; + float aFloat = materialConstants_myFloatConstant; + } + )"); + filamat::MaterialBuilder builder; + builder.constant("myFloatConstant", ConstantType::FLOAT, 1.0f); + builder.constant("myIntConstant", ConstantType::INT, 123); + builder.constant("myBoolConstant", ConstantType::BOOL, true); + builder.constant("myOtherBoolConstant", ConstantType::BOOL); + + builder.shading(filament::Shading::LIT); + builder.material(shaderCode.c_str()); + builder.materialVertex(vertexCode.c_str()); + filamat::Package result = builder.build(*jobSystem); + EXPECT_TRUE(result.isValid()); +} + +TEST_F(MaterialCompiler, ConstantParameterSameName) { +#ifdef __EXCEPTIONS + EXPECT_THROW({ + filamat::MaterialBuilder builder; + builder.constant("myFloatConstant", ConstantType::FLOAT, 1.0f); + builder.constant("myFloatConstant", ConstantType::FLOAT, 1.0f); + }, utils::PostconditionPanic); +#endif +} + +TEST_F(MaterialCompiler, ConstantParameterWrongType) { +#ifdef __EXCEPTIONS + EXPECT_THROW({ + filamat::MaterialBuilder builder; + builder.constant("myFloatConstant", ConstantType::FLOAT, 10); + }, utils::PostconditionPanic); +#endif +} + +TEST_F(MaterialCompiler, FeatureLevel0Sampler2D) { + std::string shaderCode(R"( + void material(inout MaterialInputs material) { + prepareMaterial(material); + material.baseColor = texture2D(materialParams_sampler, vec2(0.0, 0.0)); + } + )"); + filamat::MaterialBuilder builder; + builder.parameter("sampler", SamplerType::SAMPLER_2D); + + builder.featureLevel(FeatureLevel::FEATURE_LEVEL_0); + builder.shading(filament::Shading::UNLIT); + builder.material(shaderCode.c_str()); + filamat::Package result = builder.build(*jobSystem); + EXPECT_TRUE(result.isValid()); +} + +TEST_F(MaterialCompiler, FeatureLevel0Ess3CallFails) { + std::string shaderCode(R"( + void material(inout MaterialInputs material) { + prepareMaterial(material); + material.baseColor = texture(materialParams_sampler, vec3(0.0, 0.0)); + } + )"); + filamat::MaterialBuilder builder; + builder.parameter("sampler", SamplerType::SAMPLER_2D); + + builder.featureLevel(FeatureLevel::FEATURE_LEVEL_0); + builder.shading(filament::Shading::UNLIT); + builder.material(shaderCode.c_str()); + filamat::Package result = builder.build(*jobSystem); + EXPECT_FALSE(result.isValid()); +} + int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); diff --git a/libs/filamat/tests/test_filamat_lite.cpp b/libs/filamat/tests/test_filamat_lite.cpp deleted file mode 100644 index 82c1d71f57d..00000000000 --- a/libs/filamat/tests/test_filamat_lite.cpp +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include "sca/GLSLToolsLite.h" - -#include -#include - -using namespace filamat; -using namespace filament::backend; - -static ::testing::AssertionResult PropertyListsMatch(const MaterialBuilder::PropertyList& expected, - const MaterialBuilder::PropertyList& actual) { - for (size_t i = 0; i < MaterialBuilder::MATERIAL_PROPERTIES_COUNT; i++) { - if (expected[i] != actual[i]) { - const auto& propString = Enums::toString(Property(i)); - return ::testing::AssertionFailure() - << "actual[" << propString << "] (" << actual[i] - << ") != expected[" << propString << "] (" << expected[i] << ")"; - } - } - return ::testing::AssertionSuccess(); -} - -class FilamatLite : public ::testing::Test { -protected: - FilamatLite() = default; - - ~FilamatLite() override = default; - - void SetUp() override { - MaterialBuilder::init(); - } -}; - -TEST_F(FilamatLite, StaticCodeAnalyzerNothingDetected) { - utils::CString shaderCode(R"( - void material(inout MaterialInputs material) { - prepareMaterial(material); - } - )"); - - GLSLToolsLite glslTools; - MaterialBuilder::PropertyList properties {false}; - glslTools.findProperties(ShaderStage::FRAGMENT, shaderCode, properties); - MaterialBuilder::PropertyList expected {false}; - EXPECT_TRUE(PropertyListsMatch(expected, properties)); -} - -TEST_F(FilamatLite, StaticCodeAnalyzerNothingDetectedinVertex) { - utils::CString shaderCode(R"( - void materialVertex(inout MaterialVertexInputs material) { - } - )"); - - GLSLToolsLite glslTools; - MaterialBuilder::PropertyList properties {false}; - glslTools.findProperties(ShaderStage::VERTEX, shaderCode, properties); - MaterialBuilder::PropertyList expected {false}; - EXPECT_TRUE(PropertyListsMatch(expected, properties)); -} - -TEST_F(FilamatLite, StaticCodeAnalyzerDirectAssign) { - utils::CString shaderCode(R"( - void material(inout MaterialInputs material) { - prepareMaterial(material); - material.baseColor = vec4(0.8); - } - )"); - - GLSLToolsLite glslTools; - MaterialBuilder::PropertyList properties {false}; - glslTools.findProperties(ShaderStage::FRAGMENT, shaderCode, properties); - MaterialBuilder::PropertyList expected {false}; - expected[size_t(MaterialBuilder::Property::BASE_COLOR)] = true; - EXPECT_TRUE(PropertyListsMatch(expected, properties)); -} - -TEST_F(FilamatLite, StaticCodeAnalyzerDirectAssignVertex) { - utils::CString shaderCode(R"( - void materialVertex(inout MaterialVertexInputs material) { - material.clipSpaceTransform = mat4(2.0); - } - )"); - - GLSLToolsLite glslTools; - MaterialBuilder::PropertyList properties {false}; - glslTools.findProperties(ShaderStage::VERTEX, shaderCode, properties); - MaterialBuilder::PropertyList expected {false}; - expected[size_t(MaterialBuilder::Property::CLIP_SPACE_TRANSFORM)] = true; - EXPECT_TRUE(PropertyListsMatch(expected, properties)); -} - -TEST_F(FilamatLite, StaticCodeAnalyzerAssignMultiple) { - utils::CString shaderCode(R"( - void material(inout MaterialInputs material) { - material.clearCoat = 1.0; - prepareMaterial(material); - material.baseColor = vec4(0.8); - material.metallic = 1.0; - } - )"); - - GLSLToolsLite glslTools; - MaterialBuilder::PropertyList properties {false}; - glslTools.findProperties(ShaderStage::FRAGMENT, shaderCode, properties); - MaterialBuilder::PropertyList expected {false}; - expected[size_t(MaterialBuilder::Property::CLEAR_COAT)] = true; - expected[size_t(MaterialBuilder::Property::BASE_COLOR)] = true; - expected[size_t(MaterialBuilder::Property::METALLIC)] = true; - EXPECT_TRUE(PropertyListsMatch(expected, properties)); -} - -TEST_F(FilamatLite, StaticCodeAnalyzerDirectAssignWithSwizzling) { - utils::CString shaderCode(R"( - void material(inout MaterialInputs material) { - prepareMaterial(material); - material.subsurfaceColor.rgb = vec3(1.0, 0.4, 0.8); - } - )"); - - GLSLToolsLite glslTools; - MaterialBuilder::PropertyList properties {false}; - glslTools.findProperties(ShaderStage::FRAGMENT, shaderCode, properties); - MaterialBuilder::PropertyList expected {false}; - expected[size_t(MaterialBuilder::Property::SUBSURFACE_COLOR)] = true; - EXPECT_TRUE(PropertyListsMatch(expected, properties)); -} - -TEST_F(FilamatLite, StaticCodeAnalyzerNoSpace) { - utils::CString shaderCode(R"( - void material(inout MaterialInputs material) { - prepareMaterial(material); - material.ambientOcclusion=vec3(1.0); - } - )"); - - GLSLToolsLite glslTools; - MaterialBuilder::PropertyList properties {false}; - glslTools.findProperties(ShaderStage::FRAGMENT, shaderCode, properties); - MaterialBuilder::PropertyList expected {false}; - expected[size_t(MaterialBuilder::Property::AMBIENT_OCCLUSION)] = true; - EXPECT_TRUE(PropertyListsMatch(expected, properties)); -} - -TEST_F(FilamatLite, StaticCodeAnalyzerWhitespace) { - utils::CString shaderCode(R"( - void material(inout MaterialInputs material) { - prepareMaterial(material); - material .subsurfaceColor = vec3(1.0); - material . ambientOcclusion = vec3(1.0); - material - . baseColor = vec3(1.0); - } - )"); - - GLSLToolsLite glslTools; - MaterialBuilder::PropertyList properties {false}; - glslTools.findProperties(ShaderStage::FRAGMENT, shaderCode, properties); - MaterialBuilder::PropertyList expected {false}; - expected[size_t(MaterialBuilder::Property::SUBSURFACE_COLOR)] = true; - expected[size_t(MaterialBuilder::Property::AMBIENT_OCCLUSION)] = true; - expected[size_t(MaterialBuilder::Property::BASE_COLOR)] = true; - EXPECT_TRUE(PropertyListsMatch(expected, properties)); -} - -TEST_F(FilamatLite, StaticCodeAnalyzerEndOfShader) { - utils::CString shaderCode(R"( - void material(inout MaterialInputs material) { - material.)"); - - GLSLToolsLite glslTools; - MaterialBuilder::PropertyList properties {false}; - glslTools.findProperties(ShaderStage::FRAGMENT, shaderCode, properties); - MaterialBuilder::PropertyList expected {false}; - EXPECT_TRUE(PropertyListsMatch(expected, properties)); -} - -TEST_F(FilamatLite, StaticCodeAnalyzerSlashComments) { - utils::CString shaderCode(R"( - void material(inout MaterialInputs material) { - prepareMaterial(material); - material.metallic = 1.0; - // material.baseColor = vec4(1.0); // material.baseColor = vec4(1.0); - // material.ambientOcclusion = vec3(1.0); - material.clearCoat = 0.5; - material.anisotropy = -1.0; - } - )"); - - GLSLToolsLite glslTools; - MaterialBuilder::PropertyList properties {false}; - glslTools.findProperties(ShaderStage::FRAGMENT, shaderCode, properties); - MaterialBuilder::PropertyList expected {false}; - expected[size_t(MaterialBuilder::Property::METALLIC)] = true; - expected[size_t(MaterialBuilder::Property::CLEAR_COAT)] = true; - expected[size_t(MaterialBuilder::Property::ANISOTROPY)] = true; - EXPECT_TRUE(PropertyListsMatch(expected, properties)); -} - -TEST_F(FilamatLite, StaticCodeAnalyzerMultilineComments) { - utils::CString shaderCode(R"( - void material(inout MaterialInputs material) { - prepareMaterial(material); - material.metallic = 1.0; - /* - material.baseColor = vec4(1.0); // material.baseColor = vec4(1.0); - material.ambientOcclusion = vec3(1.0); - */ - material.clearCoat = 0.5; - } - )"); - - GLSLToolsLite glslTools; - MaterialBuilder::PropertyList properties {false}; - glslTools.findProperties(ShaderStage::FRAGMENT, shaderCode, properties); - MaterialBuilder::PropertyList expected {false}; - expected[size_t(MaterialBuilder::Property::METALLIC)] = true; - expected[size_t(MaterialBuilder::Property::CLEAR_COAT)] = true; - EXPECT_TRUE(PropertyListsMatch(expected, properties)); -} - -TEST_F(FilamatLite, RemoveLineDirectivesOneLine) { - { - std::string shaderCode("#line 10 \"foobar\""); - GLSLToolsLite glslTools; - glslTools.removeGoogleLineDirectives(shaderCode); - EXPECT_STREQ("", shaderCode.c_str()); - } - { - // Ignore non-Google extension line directives - std::string shaderCode("#line 100"); - GLSLToolsLite glslTools; - glslTools.removeGoogleLineDirectives(shaderCode); - EXPECT_STREQ("#line 100", shaderCode.c_str()); - } -} - -TEST_F(FilamatLite, RemoveLineDirectives) { - std::string shaderCode(R"( -aaa -#line 10 "foobar" -bbb -ccc -#line 100 - )"); - - std::string expected(R"( -aaa -bbb -ccc -#line 100 - )"); - - GLSLToolsLite glslTools; - glslTools.removeGoogleLineDirectives(shaderCode); - EXPECT_STREQ(expected.c_str(), shaderCode.c_str()); -} - -int main(int argc, char** argv) { - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/libs/filamentapp/CMakeLists.txt b/libs/filamentapp/CMakeLists.txt index 5d391d88454..4a8a6c4cafc 100644 --- a/libs/filamentapp/CMakeLists.txt +++ b/libs/filamentapp/CMakeLists.txt @@ -47,6 +47,7 @@ set(LIBS geometry getopt image + imageio imgui ktxreader math @@ -88,13 +89,23 @@ file(MAKE_DIRECTORY ${MATERIAL_DIR}) file(MAKE_DIRECTORY ${RESOURCE_DIR}) set(RESOURCE_BINS) + +set (MATC_FLAGS ${MATC_BASE_FLAGS}) +if (FILAMENT_SAMPLES_STEREO_TYPE STREQUAL "instanced") + set (MATC_FLAGS ${MATC_FLAGS} -PstereoscopicType=instanced) + add_definitions(-DFILAMENT_SAMPLES_STEREO_TYPE_INSTANCED) +elseif (FILAMENT_SAMPLES_STEREO_TYPE STREQUAL "multiview") + set (MATC_FLAGS ${MATC_FLAGS} -PstereoscopicType=multiview) + add_definitions(-DFILAMENT_SAMPLES_STEREO_TYPE_MULTIVIEW) +endif () + foreach (mat_src ${MATERIAL_SRCS}) get_filename_component(localname "${mat_src}" NAME_WE) get_filename_component(fullname "${mat_src}" ABSOLUTE) set(output_path "${MATERIAL_DIR}/${localname}.filamat") add_custom_command( OUTPUT ${output_path} - COMMAND matc ${MATC_BASE_FLAGS} -o ${output_path} ${fullname} + COMMAND matc ${MATC_FLAGS} -o ${output_path} ${fullname} MAIN_DEPENDENCY ${mat_src} DEPENDS matc COMMENT "Compiling material ${mat_src} to ${output_path}" @@ -141,9 +152,7 @@ target_include_directories(${TARGET} PRIVATE ${GENERATION_ROOT}) # ================================================================================================== if (MSVC) - target_compile_options(${TARGET} PRIVATE $<$:/fp:fast>) else() - target_compile_options(${TARGET} PRIVATE $<$:-ffast-math>) target_compile_options(${TARGET} PRIVATE -Wno-deprecated-register) endif() diff --git a/libs/filamentapp/include/filamentapp/Config.h b/libs/filamentapp/include/filamentapp/Config.h index b51d042c10f..4f55cf866bb 100644 --- a/libs/filamentapp/include/filamentapp/Config.h +++ b/libs/filamentapp/include/filamentapp/Config.h @@ -34,6 +34,10 @@ struct Config { filament::camutils::Mode cameraMode = filament::camutils::Mode::ORBIT; bool resizeable = true; bool headless = false; + int stereoscopicEyeCount = 2; + + // Provided to indicate GPU preference for vulkan + std::string vulkanGPUHint; }; #endif // TNT_FILAMENT_SAMPLE_CONFIG_H diff --git a/libs/filamentapp/include/filamentapp/Cube.h b/libs/filamentapp/include/filamentapp/Cube.h index 778c645fd0b..53a8ef36d11 100644 --- a/libs/filamentapp/include/filamentapp/Cube.h +++ b/libs/filamentapp/include/filamentapp/Cube.h @@ -28,8 +28,14 @@ class Cube { public: + Cube(filament::Engine& engine, filament::Material const* material, filament::math::float3 linearColor, bool culling = true); + Cube(Cube const&) = delete; + Cube& operator=(Cube const&) = delete; + + Cube(Cube&& rhs) noexcept; + utils::Entity getSolidRenderable() { return mSolidRenderable; } @@ -55,8 +61,8 @@ class Cube { filament::Material const* mMaterial = nullptr; filament::MaterialInstance* mMaterialInstanceSolid = nullptr; filament::MaterialInstance* mMaterialInstanceWireFrame = nullptr; - utils::Entity mSolidRenderable; - utils::Entity mWireFrameRenderable; + utils::Entity mSolidRenderable{}; + utils::Entity mWireFrameRenderable{}; }; diff --git a/libs/filamentapp/include/filamentapp/FilamentApp.h b/libs/filamentapp/include/filamentapp/FilamentApp.h index f39c8db7aa0..e50f312cd36 100644 --- a/libs/filamentapp/include/filamentapp/FilamentApp.h +++ b/libs/filamentapp/include/filamentapp/FilamentApp.h @@ -49,6 +49,13 @@ class ImGuiHelper; class IBL; class MeshAssimp; +#if defined(FILAMENT_DRIVER_SUPPORTS_VULKAN) +// For customizing the vulkan backend +namespace filament::backend { +class VulkanPlatform; +} +#endif + class FilamentApp { public: using SetupCallback = std::function; @@ -78,6 +85,8 @@ class FilamentApp { PostRenderCallback postRender = PostRenderCallback(), size_t width = 1024, size_t height = 640); + void reconfigureCameras() { mReconfigureCameras = true; } + filament::Material const* getDefaultMaterial() const noexcept { return mDefaultMaterial; } filament::Material const* getTransparentMaterial() const noexcept { return mTransparentMaterial; } IBL* getIBL() const noexcept { return mIBL.get(); } @@ -88,12 +97,15 @@ class FilamentApp { void setSidebarWidth(int width) { mSidebarWidth = width; } void setWindowTitle(const char* title) { mWindowTitle = title; } - float& getCameraFocalLength() { return mCameraFocalLength; } + void setCameraFocalLength(float focalLength) { mCameraFocalLength = focalLength; } + void setCameraNearFar(float near, float far) { mCameraNear = near; mCameraFar = far; } void addOffscreenView(filament::View* view) { mOffscreenViews.push_back(view); } size_t getSkippedFrameCount() const { return mSkippedFrames; } + void loadIBL(std::string_view path); + FilamentApp(const FilamentApp& rhs) = delete; FilamentApp(FilamentApp&& rhs) = delete; FilamentApp& operator=(const FilamentApp& rhs) = delete; @@ -181,6 +193,7 @@ class FilamentApp { void fixupMouseCoordinatesForHdpi(ssize_t& x, ssize_t& y) const; FilamentApp* const mFilamentApp = nullptr; + Config mConfig; const bool mIsHeadless; SDL_Window* mWindow = nullptr; @@ -198,11 +211,11 @@ class FilamentApp { filament::Camera* mOrthoCamera; std::vector> mViews; - CView* mMainView; - CView* mUiView; + CView* mMainView; // well, the main view + CView* mUiView; // the imgui ui CView* mDepthView; - GodView* mGodView; - CView* mOrthoView; + GodView* mGodView; // the debug view with "god" camera + CView* mOrthoView; // directional shadow map view size_t mWidth = 0; size_t mHeight = 0; @@ -241,6 +254,13 @@ class FilamentApp { std::string mWindowTitle; std::vector mOffscreenViews; float mCameraFocalLength = 28.0f; + float mCameraNear = 0.1f; + float mCameraFar = 100.0f; + bool mReconfigureCameras = false; + +#if defined(FILAMENT_DRIVER_SUPPORTS_VULKAN) + filament::backend::VulkanPlatform* mVulkanPlatform = nullptr; +#endif }; #endif // TNT_FILAMENT_SAMPLE_FILAMENTAPP_H diff --git a/libs/filamentapp/include/filamentapp/IBL.h b/libs/filamentapp/include/filamentapp/IBL.h index 8943823ed95..e151f9c4845 100644 --- a/libs/filamentapp/include/filamentapp/IBL.h +++ b/libs/filamentapp/include/filamentapp/IBL.h @@ -22,6 +22,7 @@ #include #include +#include namespace filament { class Engine; @@ -55,6 +56,11 @@ class IBL { return mSkybox; } + filament::Texture* getFogTexture() const noexcept { + return mFogTexture; + } + + bool hasSphericalHarmonics() const { return mHasSphericalHarmonics; } filament::math::float3 const* getSphericalHarmonics() const { return mBands; } private: @@ -71,10 +77,12 @@ class IBL { filament::Engine& mEngine; filament::math::float3 mBands[9] = {}; + bool mHasSphericalHarmonics = false; filament::Texture* mTexture = nullptr; filament::IndirectLight* mIndirectLight = nullptr; filament::Texture* mSkyboxTexture = nullptr; + filament::Texture* mFogTexture = nullptr; filament::Skybox* mSkybox = nullptr; }; diff --git a/libs/filamentapp/materials/transparentColor.mat b/libs/filamentapp/materials/transparentColor.mat index c43f9410e7d..7ad51944dd4 100644 --- a/libs/filamentapp/materials/transparentColor.mat +++ b/libs/filamentapp/materials/transparentColor.mat @@ -9,7 +9,8 @@ material { blending : transparent, culling : none, depthCulling : false, - shadingModel : unlit + shadingModel : unlit, + featureLevel : 0 } fragment { diff --git a/libs/filamentapp/src/Cube.cpp b/libs/filamentapp/src/Cube.cpp index cd2faa0bc02..4283aa88b04 100644 --- a/libs/filamentapp/src/Cube.cpp +++ b/libs/filamentapp/src/Cube.cpp @@ -104,11 +104,23 @@ Cube::Cube(Engine& engine, filament::Material const* material, float3 linearColo .build(engine, mWireFrameRenderable); } +Cube::Cube(Cube&& rhs) noexcept + : mEngine(rhs.mEngine) { + using std::swap; + swap(rhs.mVertexBuffer, mVertexBuffer); + swap(rhs.mIndexBuffer, mIndexBuffer); + swap(rhs.mMaterial, mMaterial); + swap(rhs.mMaterialInstanceSolid, mMaterialInstanceSolid); + swap(rhs.mMaterialInstanceWireFrame, mMaterialInstanceWireFrame); + swap(rhs.mSolidRenderable, mSolidRenderable); + swap(rhs.mWireFrameRenderable, mWireFrameRenderable); +} + void Cube::mapFrustum(filament::Engine& engine, Camera const* camera) { // the Camera far plane is at infinity, but we want it closer for display const mat4 vm(camera->getModelMatrix()); mat4 p(vm * inverse(camera->getCullingProjectionMatrix())); - return mapFrustum(engine, p); + mapFrustum(engine, p); } void Cube::mapFrustum(filament::Engine& engine, filament::math::mat4 const& transform) { @@ -122,18 +134,21 @@ void Cube::mapFrustum(filament::Engine& engine, filament::math::mat4 const& tran void Cube::mapAabb(filament::Engine& engine, filament::Box const& box) { mat4 p = mat4::translation(box.center) * mat4::scaling(box.halfExtent); - return mapFrustum(engine, p); + mapFrustum(engine, p); } Cube::~Cube() { mEngine.destroy(mVertexBuffer); mEngine.destroy(mIndexBuffer); - mEngine.destroy(mMaterialInstanceSolid); - mEngine.destroy(mMaterialInstanceWireFrame); + // We don't own the material, only instances mEngine.destroy(mSolidRenderable); mEngine.destroy(mWireFrameRenderable); + // material instances must be destroyed after the renderables + mEngine.destroy(mMaterialInstanceSolid); + mEngine.destroy(mMaterialInstanceWireFrame); + utils::EntityManager& em = utils::EntityManager::get(); em.destroy(mSolidRenderable); em.destroy(mWireFrameRenderable); diff --git a/libs/filamentapp/src/FilamentApp.cpp b/libs/filamentapp/src/FilamentApp.cpp index 0d00f24f509..e47c95c79a1 100644 --- a/libs/filamentapp/src/FilamentApp.cpp +++ b/libs/filamentapp/src/FilamentApp.cpp @@ -1,4 +1,3 @@ -#include /* * Copyright (C) 2015 The Android Open Source Project @@ -38,12 +37,17 @@ #include #include #include +#include #include #ifndef NDEBUG #include #endif +#if defined(FILAMENT_DRIVER_SUPPORTS_VULKAN) +#include +#endif + #include #include @@ -51,6 +55,13 @@ #include +#include +#include +#include +#include + +#include + #include "generated/resources/filamentapp.h" using namespace filament; @@ -58,6 +69,42 @@ using namespace filagui; using namespace filament::math; using namespace utils; +namespace { + +using namespace filament::backend; + +#if defined(FILAMENT_DRIVER_SUPPORTS_VULKAN) +class FilamentAppVulkanPlatform : public VulkanPlatform { +public: + FilamentAppVulkanPlatform(char const* gpuHintCstr) { + utils::CString gpuHint{ gpuHintCstr }; + if (gpuHint.empty()) { + return; + } + VulkanPlatform::Customization::GPUPreference pref; + // Check to see if it is an integer, if so turn it into an index. + if (std::all_of(gpuHint.begin(), gpuHint.end(), ::isdigit)) { + char* p_end {}; + pref.index = static_cast(std::strtol(gpuHint.c_str(), &p_end, 10)); + } else { + pref.deviceName = gpuHint; + } + mCustomization = { + .gpu = pref + }; + } + + virtual VulkanPlatform::Customization getCustomization() const noexcept override { + return mCustomization; + } + +private: + VulkanPlatform::Customization mCustomization; +}; +#endif + +} // anonymous namespace + FilamentApp& FilamentApp::get() { static FilamentApp filamentApp; return filamentApp; @@ -97,10 +144,17 @@ void FilamentApp::run(const Config& config, SetupCallback setupCallback, .package(FILAMENTAPP_TRANSPARENTCOLOR_DATA, FILAMENTAPP_TRANSPARENTCOLOR_SIZE) .build(*mEngine); - std::unique_ptr cameraCube(new Cube(*mEngine, mTransparentMaterial, {1,0,0})); + std::unique_ptr cameraCube{ new Cube(*mEngine, mTransparentMaterial, { 1, 0, 0 }) }; + // we can't cull the light-frustum because it's not applied a rigid transform // and currently, filament assumes that for culling - std::unique_ptr lightmapCube(new Cube(*mEngine, mTransparentMaterial, {0,1,0}, false)); + std::vector lightmapCubes; + lightmapCubes.reserve(4); + lightmapCubes.emplace_back(*mEngine, mTransparentMaterial, float3{ 0, 1, 0 }, false); + lightmapCubes.emplace_back(*mEngine, mTransparentMaterial, float3{ 0, 0, 1 }, false); + lightmapCubes.emplace_back(*mEngine, mTransparentMaterial, float3{ 1, 1, 0 }, false); + lightmapCubes.emplace_back(*mEngine, mTransparentMaterial, float3{ 1, 0, 0 }, false); + mScene = mEngine->createScene(); window->mMainView->getView()->setVisibleLayers(0x4, 0x4); @@ -110,16 +164,15 @@ void FilamentApp::run(const Config& config, SetupCallback setupCallback, rcm.setLayerMask(rcm.getInstance(cameraCube->getSolidRenderable()), 0x3, 0x2); rcm.setLayerMask(rcm.getInstance(cameraCube->getWireFrameRenderable()), 0x3, 0x2); - - rcm.setLayerMask(rcm.getInstance(lightmapCube->getSolidRenderable()), 0x3, 0x2); - rcm.setLayerMask(rcm.getInstance(lightmapCube->getWireFrameRenderable()), 0x3, 0x2); - - // Create the camera mesh mScene->addEntity(cameraCube->getWireFrameRenderable()); mScene->addEntity(cameraCube->getSolidRenderable()); - mScene->addEntity(lightmapCube->getWireFrameRenderable()); - mScene->addEntity(lightmapCube->getSolidRenderable()); + for (auto&& cube : lightmapCubes) { + rcm.setLayerMask(rcm.getInstance(cube.getSolidRenderable()), 0x3, 0x2); + rcm.setLayerMask(rcm.getInstance(cube.getWireFrameRenderable()), 0x3, 0x2); + mScene->addEntity(cube.getWireFrameRenderable()); + mScene->addEntity(cube.getSolidRenderable()); + } window->mDepthView->getView()->setVisibleLayers(0x4, 0x4); window->mGodView->getView()->setVisibleLayers(0x6, 0x6); @@ -133,11 +186,6 @@ void FilamentApp::run(const Config& config, SetupCallback setupCallback, loadDirt(config); loadIBL(config); - if (mIBL != nullptr) { - mIBL->getSkybox()->setLayerMask(0x7, 0x4); - mScene->setSkybox(mIBL->getSkybox()); - mScene->setIndirectLight(mIBL->getIndirectLight()); - } for (auto& view : window->mViews) { if (view.get() != window->mUiView) { @@ -155,7 +203,7 @@ void FilamentApp::run(const Config& config, SetupCallback setupCallback, SDL_SysWMinfo wmInfo; SDL_VERSION(&wmInfo.version); SDL_GetWindowWMInfo(window->getSDLWindow(), &wmInfo); - io.ImeWindowHandle = wmInfo.info.win.window; + ImGui::GetMainViewport()->PlatformHandleRaw = wmInfo.info.win.window; #endif io.KeyMap[ImGuiKey_Tab] = SDL_SCANCODE_TAB; io.KeyMap[ImGuiKey_LeftArrow] = SDL_SCANCODE_LEFT; @@ -191,6 +239,8 @@ void FilamentApp::run(const Config& config, SetupCallback setupCallback, int sidebarWidth = mSidebarWidth; float cameraFocalLength = mCameraFocalLength; + float cameraNear = mCameraNear; + float cameraFar = mCameraFar; SDL_EventState(SDL_DROPFILE, SDL_ENABLE); SDL_Window* sdlWindow = window->getSDLWindow(); @@ -200,10 +250,15 @@ void FilamentApp::run(const Config& config, SetupCallback setupCallback, SDL_SetWindowTitle(sdlWindow, mWindowTitle.c_str()); } - if (mSidebarWidth != sidebarWidth || mCameraFocalLength != cameraFocalLength) { + if (mSidebarWidth != sidebarWidth || + mCameraFocalLength != cameraFocalLength || + mCameraNear != cameraNear || + mCameraFar != cameraFar) { window->configureCamerasForWindow(); sidebarWidth = mSidebarWidth; cameraFocalLength = mCameraFocalLength; + cameraNear = mCameraNear; + cameraFar = mCameraFar; } if (!UTILS_HAS_THREADING) { @@ -382,15 +437,33 @@ void FilamentApp::run(const Config& config, SetupCallback setupCallback, window->mDebugCamera->lookAt(eye, center, up); // Update the cube distortion matrix used for frustum visualization. - const Camera* lightmapCamera = window->mMainView->getView()->getDirectionalLightCamera(); - lightmapCube->mapFrustum(*mEngine, lightmapCamera); + auto& rcm = mEngine->getRenderableManager(); + auto const csm = window->mMainView->getView()->getDirectionalShadowCameras(); + // show/hide the cascades + for (size_t i = 0 ; i < 4; i++) { + rcm.setLayerMask(rcm.getInstance(lightmapCubes[i].getSolidRenderable()), 0x3, 0x0); + rcm.setLayerMask(rcm.getInstance(lightmapCubes[i].getWireFrameRenderable()), 0x3, 0x0); + } + if (!csm.empty()) { + for (size_t i = 0, c = csm.size(); i < c; i++) { + if (csm[i]) { + lightmapCubes[i].mapFrustum(*mEngine, csm[i]); + } + uint8_t const layer = csm[i] ? 0x2 : 0x0; + rcm.setLayerMask(rcm.getInstance(lightmapCubes[i].getSolidRenderable()), + 0x3, layer); + rcm.setLayerMask(rcm.getInstance(lightmapCubes[i].getWireFrameRenderable()), + 0x3, layer); + } + } + cameraCube->mapFrustum(*mEngine, window->mMainCamera); // Delay rendering for roughly one monitor refresh interval // TODO: Use SDL_GL_SetSwapInterval for proper vsync SDL_DisplayMode Mode; int refreshIntervalMS = (SDL_GetDesktopDisplayMode( - SDL_GetWindowDisplayIndex(window->mWindow), &Mode) == 0 && + SDL_GetWindowDisplayIndex(window->mWindow), &Mode) == 0 && Mode.refresh_rate != 0) ? round(1000.0 / Mode.refresh_rate) : 16; SDL_Delay(refreshIntervalMS); @@ -400,18 +473,36 @@ void FilamentApp::run(const Config& config, SetupCallback setupCallback, preRender(mEngine, window->mViews[0]->getView(), mScene, renderer); } + if (mReconfigureCameras) { + window->configureCamerasForWindow(); + mReconfigureCameras = false; + } + + if (config.splitView) { + if(!window->mOrthoView->getView()->hasCamera()) { + auto const csm = window->mMainView->getView()->getDirectionalShadowCameras(); + if (!csm.empty()) { + // here we could choose the cascade + Camera const* debugDirectionalShadowCamera = csm[0]; + if (debugDirectionalShadowCamera) { + window->mOrthoView->setCamera( + const_cast(debugDirectionalShadowCamera)); + } + } + } + } + if (renderer->beginFrame(window->getSwapChain())) { - for (filament::View* offscreenView : mOffscreenViews) { + for (filament::View* offscreenView: mOffscreenViews) { renderer->render(offscreenView); } - for (auto const& view : window->mViews) { + for (auto const& view: window->mViews) { renderer->render(view->getView()); } if (postRender) { postRender(mEngine, window->mViews[0]->getView(), mScene, renderer); } renderer->endFrame(); - } else { ++mSkippedFrames; } @@ -424,7 +515,7 @@ void FilamentApp::run(const Config& config, SetupCallback setupCallback, cleanupCallback(mEngine, window->mMainView->getView(), mScene); cameraCube.reset(); - lightmapCube.reset(); + lightmapCubes.clear(); window.reset(); mIBL.reset(); @@ -435,6 +526,12 @@ void FilamentApp::run(const Config& config, SetupCallback setupCallback, mEngine->destroy(mScene); Engine::destroy(&mEngine); mEngine = nullptr; + +#if defined(FILAMENT_DRIVER_SUPPORTS_VULKAN) + if (mVulkanPlatform) { + delete mVulkanPlatform; + } +#endif } // RELATIVE_ASSET_PATH is set inside samples/CMakeLists.txt and used to support multi-configuration @@ -448,31 +545,44 @@ const utils::Path& FilamentApp::getRootAssetsPath() { return root; } -void FilamentApp::loadIBL(const Config& config) { - if (!config.iblDirectory.empty()) { - Path iblPath(config.iblDirectory); +void FilamentApp::loadIBL(std::string_view path) { + Path iblPath(path); + if (!iblPath.exists()) { + std::cerr << "The specified IBL path does not exist: " << iblPath << std::endl; + return; + } + + // Note that IBL holds a skybox, and Scene also holds a reference. We cannot release IBL's + // skybox until after new skybox has been set in the scene. + std::unique_ptr oldIBL = std::move(mIBL); + mIBL = std::make_unique(*mEngine); - if (!iblPath.exists()) { - std::cerr << "The specified IBL path does not exist: " << iblPath << std::endl; + if (!iblPath.isDirectory()) { + if (!mIBL->loadFromEquirect(iblPath)) { + std::cerr << "Could not load the specified IBL: " << iblPath << std::endl; + mIBL.reset(nullptr); + return; + } + } else { + if (!mIBL->loadFromDirectory(iblPath)) { + std::cerr << "Could not load the specified IBL: " << iblPath << std::endl; + mIBL.reset(nullptr); return; } + } - mIBL = std::make_unique(*mEngine); + if (mIBL != nullptr) { + mIBL->getSkybox()->setLayerMask(0x7, 0x4); + mScene->setSkybox(mIBL->getSkybox()); + mScene->setIndirectLight(mIBL->getIndirectLight()); + } +} - if (!iblPath.isDirectory()) { - if (!mIBL->loadFromEquirect(iblPath)) { - std::cerr << "Could not load the specified IBL: " << iblPath << std::endl; - mIBL.reset(nullptr); - return; - } - } else { - if (!mIBL->loadFromDirectory(iblPath)) { - std::cerr << "Could not load the specified IBL: " << iblPath << std::endl; - mIBL.reset(nullptr); - return; - } - } +void FilamentApp::loadIBL(const Config& config) { + if (config.iblDirectory.empty()) { + return; } + loadIBL(config.iblDirectory); } void FilamentApp::loadDirt(const Config& config) { @@ -507,14 +617,14 @@ void FilamentApp::loadDirt(const Config& config) { } void FilamentApp::initSDL() { - ASSERT_POSTCONDITION(SDL_Init(SDL_INIT_EVENTS) == 0, "SDL_Init Failure"); + FILAMENT_CHECK_POSTCONDITION(SDL_Init(SDL_INIT_EVENTS) == 0) << "SDL_Init Failure"; } // ------------------------------------------------------------------------------------------------ FilamentApp::Window::Window(FilamentApp* filamentApp, const Config& config, std::string title, size_t w, size_t h) - : mFilamentApp(filamentApp), mIsHeadless(config.headless) { + : mFilamentApp(filamentApp), mConfig(config), mIsHeadless(config.headless) { const int x = SDL_WINDOWPOS_CENTERED; const int y = SDL_WINDOWPOS_CENTERED; uint32_t windowFlags = SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI; @@ -530,8 +640,49 @@ FilamentApp::Window::Window(FilamentApp* filamentApp, // events. mWindow = SDL_CreateWindow(title.c_str(), x, y, (int) w, (int) h, windowFlags); + auto const createEngine = [&config, this]() { + auto backend = config.backend; + + // This mirrors the logic for choosing a backend given compile-time flags and client having + // provided DEFAULT as the backend (see PlatformFactory.cpp) + #if !defined(__EMSCRIPTEN__) && !defined(__ANDROID__) && !defined(FILAMENT_IOS) && \ + !defined(__APPLE__) && defined(FILAMENT_DRIVER_SUPPORTS_VULKAN) + if (backend == Engine::Backend::DEFAULT) { + backend = Engine::Backend::VULKAN; + } + #endif + + Engine::Config engineConfig = {}; + engineConfig.stereoscopicEyeCount = config.stereoscopicEyeCount; +#if defined(FILAMENT_SAMPLES_STEREO_TYPE_INSTANCED) + engineConfig.stereoscopicType = Engine::StereoscopicType::INSTANCED; +#elif defined (FILAMENT_SAMPLES_STEREO_TYPE_MULTIVIEW) + engineConfig.stereoscopicType = Engine::StereoscopicType::MULTIVIEW; +#else + engineConfig.stereoscopicType = Engine::StereoscopicType::NONE; +#endif + + if (backend == Engine::Backend::VULKAN) { + #if defined(FILAMENT_DRIVER_SUPPORTS_VULKAN) + mFilamentApp->mVulkanPlatform = + new FilamentAppVulkanPlatform(config.vulkanGPUHint.c_str()); + return Engine::Builder() + .backend(backend) + .platform(mFilamentApp->mVulkanPlatform) + .featureLevel(config.featureLevel) + .config(&engineConfig) + .build(); + #endif + } + return Engine::Builder() + .backend(backend) + .featureLevel(config.featureLevel) + .config(&engineConfig) + .build(); + }; + if (config.headless) { - mFilamentApp->mEngine = Engine::create(config.backend); + mFilamentApp->mEngine = createEngine(); mSwapChain = mFilamentApp->mEngine->createSwapChain((uint32_t) w, (uint32_t) h); mWidth = w; mHeight = h; @@ -542,7 +693,7 @@ FilamentApp::Window::Window(FilamentApp* filamentApp, // Create the Engine after the window in case this happens to be a single-threaded platform. // For single-threaded platforms, we need to ensure that Filament's OpenGL context is // current, rather than the one created by SDL. - mFilamentApp->mEngine = Engine::create(config.backend); + mFilamentApp->mEngine = createEngine(); // get the resolved backend mBackend = config.backend = mFilamentApp->mEngine->getBackend(); @@ -568,13 +719,13 @@ FilamentApp::Window::Window(FilamentApp* filamentApp, #endif - // Select the feature level to use - config.featureLevel = std::min(config.featureLevel, - mFilamentApp->mEngine->getSupportedFeatureLevel()); - mFilamentApp->mEngine->setActiveFeatureLevel(config.featureLevel); + // Write back the active feature level. + config.featureLevel = mFilamentApp->mEngine->getActiveFeatureLevel(); - mSwapChain = mFilamentApp->mEngine->createSwapChain(nativeSwapChain); + mSwapChain = mFilamentApp->mEngine->createSwapChain( + nativeSwapChain, filament::SwapChain::CONFIG_HAS_STENCIL_BUFFER); } + mRenderer = mFilamentApp->mEngine->createRenderer(); // create cameras @@ -619,9 +770,6 @@ FilamentApp::Window::Window(FilamentApp* filamentApp, mGodView->setCamera(mMainCamera); mGodView->setGodCamera(mDebugCamera); mGodView->setCameraManipulator(mDebugCameraMan); - - // Ortho view obviously uses an ortho camera - mOrthoView->setCamera( (Camera *)mMainView->getView()->getDirectionalLightCamera() ); } // configure the cameras @@ -787,23 +935,38 @@ void FilamentApp::Window::configureCamerasForWindow() { const bool splitview = mViews.size() > 2; - // To trigger a floating-point exception, users could shrink the window to be smaller than - // the sidebar. To prevent this we simply clamp the width of the main viewport. - const uint32_t mainWidth = splitview ? width : std::max(1, (int) width - sidebar); + const uint32_t mainWidth = std::max(2, (int) width - sidebar); + + double near = mFilamentApp->mCameraNear; + double far = mFilamentApp->mCameraFar; + if (mMainView->getView()->getStereoscopicOptions().enabled) { + mat4 projections[4]; + projections[0] = Camera::projection(mFilamentApp->mCameraFocalLength, 1.0, near, far); + projections[1] = projections[0]; + // simulate foveated rendering + projections[2] = Camera::projection(mFilamentApp->mCameraFocalLength * 2.0, 1.0, near, far); + projections[3] = projections[2]; + mMainCamera->setCustomEyeProjection(projections, 4, projections[0], near, far); + } else { + mMainCamera->setLensProjection(mFilamentApp->mCameraFocalLength, 1.0, near, far); + } + mDebugCamera->setProjection(45.0, double(mainWidth) / height, 0.0625, 4096, Camera::Fov::VERTICAL); - double near = 0.1; - double far = 100; - mMainCamera->setLensProjection(mFilamentApp->mCameraFocalLength, double(mainWidth) / height, near, far); - mDebugCamera->setProjection(45.0, double(width) / height, 0.0625, 4096, Camera::Fov::VERTICAL); + auto aspectRatio = double(mainWidth) / height; + if (mMainView->getView()->getStereoscopicOptions().enabled) { + const int ec = mConfig.stereoscopicEyeCount; + aspectRatio = double(mainWidth) / ec / height; + } + mMainCamera->setScaling({1.0 / aspectRatio, 1.0}); // We're in split view when there are more views than just the Main and UI views. if (splitview) { - uint32_t vpw = width / 2; - uint32_t vph = height / 2; - mMainView->setViewport ({ 0, 0, vpw, vph }); - mDepthView->setViewport({ int32_t(vpw), 0, width - vpw, vph }); - mGodView->setViewport ({ int32_t(vpw), int32_t(vph), width - vpw, height - vph }); - mOrthoView->setViewport({ 0, int32_t(vph), vpw, height - vph }); + uint32_t const vpw = mainWidth / 2; + uint32_t const vph = height / 2; + mMainView->setViewport ({ sidebar + 0, 0, vpw, vph }); + mDepthView->setViewport({ sidebar + int32_t(vpw), 0, vpw, vph }); + mGodView->setViewport ({ sidebar + int32_t(vpw), int32_t(vph), vpw, vph }); + mOrthoView->setViewport({ sidebar + 0, int32_t(vph), vpw, vph }); } else { mMainView->setViewport({ sidebar, 0, mainWidth, height }); } @@ -822,7 +985,7 @@ FilamentApp::CView::~CView() { engine.destroy(view); } -void FilamentApp::CView::setViewport(Viewport const& viewport) { +void FilamentApp::CView::setViewport(filament::Viewport const& viewport) { mViewport = viewport; view->setViewport(viewport); if (mCameraManipulator) { diff --git a/libs/filamentapp/src/IBL.cpp b/libs/filamentapp/src/IBL.cpp index 762610db6d2..7d4b97b0c18 100644 --- a/libs/filamentapp/src/IBL.cpp +++ b/libs/filamentapp/src/IBL.cpp @@ -25,6 +25,8 @@ #include +#include + #include #include @@ -37,6 +39,8 @@ #include +#include + using namespace filament; using namespace filament::math; using namespace ktxreader; @@ -52,6 +56,7 @@ IBL::~IBL() { mEngine.destroy(mTexture); mEngine.destroy(mSkybox); mEngine.destroy(mSkyboxTexture); + mEngine.destroy(mFogTexture); } bool IBL::loadFromEquirect(Path const& path) { @@ -59,26 +64,51 @@ bool IBL::loadFromEquirect(Path const& path) { return false; } - int w, h; - stbi_info(path.getAbsolutePath().c_str(), &w, &h, nullptr); - if (w != h * 2) { - std::cerr << "not an equirectangular image!" << std::endl; - return false; + int w = 0, h = 0; + int n = 0; + size_t size = 0; + void* data = nullptr; + void* user = nullptr; + Texture::PixelBufferDescriptor::Callback destroyer{}; + + if (path.getExtension() == "exr") { + std::ifstream in_stream(path.getAbsolutePath().c_str(), std::ios::binary); + image::LinearImage* image = new image::LinearImage( + image::ImageDecoder::decode(in_stream, path.getAbsolutePath().c_str())); + w = image->getWidth(); + h = image->getHeight(); + n = image->getChannels(); + size = w * h * n * sizeof(float); + data = image->getPixelRef(); + user = image; + destroyer = [](void*, size_t, void* user) { + delete reinterpret_cast(user); + }; + } else { + stbi_info(path.getAbsolutePath().c_str(), &w, &h, nullptr); + // load image as float + size = w * h * sizeof(float3); + data = (float3*)stbi_loadf(path.getAbsolutePath().c_str(), &w, &h, &n, 3); + destroyer = [](void* data, size_t, void*) { + stbi_image_free(data); + }; } - // load image as float - int n; - const size_t size = w * h * sizeof(float3); - float3* const data = (float3*)stbi_loadf(path.getAbsolutePath().c_str(), &w, &h, &n, 3); if (data == nullptr || n != 3) { std::cerr << "Could not decode image " << std::endl; + destroyer(data, size, user); + return false; + } + + if (w != h * 2) { + std::cerr << "not an equirectangular image!" << std::endl; + destroyer(data, size, user); return false; } // now load texture Texture::PixelBufferDescriptor buffer( - data, size,Texture::Format::RGB, Texture::Type::FLOAT, - [](void* buffer, size_t size, void* user) { stbi_image_free(buffer); }); + data, size,Texture::Format::RGB, Texture::Type::FLOAT, destroyer, user); Texture* const equirect = Texture::Builder() .width((uint32_t)w) @@ -93,6 +123,7 @@ bool IBL::loadFromEquirect(Path const& path) { IBLPrefilterContext context(mEngine); IBLPrefilterContext::EquirectangularToCubemap equirectangularToCubemap(context); IBLPrefilterContext::SpecularFilter specularFilter(context); + IBLPrefilterContext::IrradianceFilter irradianceFilter(context); mSkyboxTexture = equirectangularToCubemap(equirect); @@ -100,6 +131,9 @@ bool IBL::loadFromEquirect(Path const& path) { mTexture = specularFilter(mSkyboxTexture); + mFogTexture = irradianceFilter({ .generateMipmap = false }, mSkyboxTexture); + mFogTexture->generateMipmaps(mEngine); + mIndirectLight = IndirectLight::Builder() .reflections(mTexture) .intensity(IBL_INTENSITY) @@ -136,9 +170,19 @@ bool IBL::loadFromKtx(const std::string& prefix) { mSkyboxTexture = Ktx1Reader::createTexture(&mEngine, skyKtx, false); mTexture = Ktx1Reader::createTexture(&mEngine, iblKtx, false); + // TODO: create the fog texture, it's a bit complicated because IBLPrefilter requires + // the source image to have miplevels, and it's not guaranteed here and also + // not guaranteed we can generate them (e.g. texture could be compressed) + //IBLPrefilterContext context(mEngine); + //IBLPrefilterContext::IrradianceFilter irradianceFilter(context); + //mFogTexture = irradianceFilter({ .generateMipmap=false }, mSkyboxTexture); + //mFogTexture->generateMipmaps(mEngine); + + if (!iblKtx->getSphericalHarmonics(mBands)) { return false; } + mHasSphericalHarmonics = true; mIndirectLight = IndirectLight::Builder() .reflections(mTexture) @@ -170,6 +214,7 @@ bool IBL::loadFromDirectory(const utils::Path& path) { } else { return false; } + mHasSphericalHarmonics = true; // Read mip-mapped cubemap const std::string prefix = "m"; diff --git a/libs/filamentapp/src/NativeWindowHelperCocoa.mm b/libs/filamentapp/src/NativeWindowHelperCocoa.mm index e0603e8e48c..26eabe7071e 100644 --- a/libs/filamentapp/src/NativeWindowHelperCocoa.mm +++ b/libs/filamentapp/src/NativeWindowHelperCocoa.mm @@ -26,7 +26,8 @@ void* getNativeWindow(SDL_Window* sdlWindow) { SDL_SysWMinfo wmi; SDL_VERSION(&wmi.version); - ASSERT_POSTCONDITION(SDL_GetWindowWMInfo(sdlWindow, &wmi), "SDL version unsupported!"); + FILAMENT_CHECK_POSTCONDITION(SDL_GetWindowWMInfo(sdlWindow, &wmi)) + << "SDL version unsupported!"; NSWindow* win = wmi.info.cocoa.window; NSView* view = [win contentView]; return view; @@ -35,7 +36,8 @@ void prepareNativeWindow(SDL_Window* sdlWindow) { SDL_SysWMinfo wmi; SDL_VERSION(&wmi.version); - ASSERT_POSTCONDITION(SDL_GetWindowWMInfo(sdlWindow, &wmi), "SDL version unsupported!"); + FILAMENT_CHECK_POSTCONDITION(SDL_GetWindowWMInfo(sdlWindow, &wmi)) + << "SDL version unsupported!"; NSWindow* win = wmi.info.cocoa.window; [win setColorSpace:[NSColorSpace sRGBColorSpace]]; } diff --git a/libs/filamentapp/src/NativeWindowHelperLinux.cpp b/libs/filamentapp/src/NativeWindowHelperLinux.cpp index 0edec8340de..a9348e660d8 100644 --- a/libs/filamentapp/src/NativeWindowHelperLinux.cpp +++ b/libs/filamentapp/src/NativeWindowHelperLinux.cpp @@ -23,7 +23,8 @@ void* getNativeWindow(SDL_Window* sdlWindow) { SDL_SysWMinfo wmi; SDL_VERSION(&wmi.version); - ASSERT_POSTCONDITION(SDL_GetWindowWMInfo(sdlWindow, &wmi), "SDL version unsupported!"); + FILAMENT_CHECK_POSTCONDITION(SDL_GetWindowWMInfo(sdlWindow, &wmi)) + << "SDL version unsupported!"; if (wmi.subsystem == SDL_SYSWM_X11) { #if defined(FILAMENT_SUPPORTS_X11) Window win = (Window) wmi.info.x11.window; @@ -32,15 +33,23 @@ void* getNativeWindow(SDL_Window* sdlWindow) { } else if (wmi.subsystem == SDL_SYSWM_WAYLAND) { #if defined(FILAMENT_SUPPORTS_WAYLAND) + int width = 0; + int height = 0; + SDL_GetWindowSize(sdlWindow, &width, &height); + // Static is used here to allocate the struct pointer for the lifetime of the program. // Without static the valid struct quickyly goes out of scope, and ends with seemingly // random segfaults. static struct { struct wl_display *display; struct wl_surface *surface; + uint32_t width; + uint32_t height; } wayland { wmi.info.wl.display, wmi.info.wl.surface, + static_cast(width), + static_cast(height) }; return (void *) &wayland; #endif diff --git a/libs/filamentapp/src/NativeWindowHelperWindows.cpp b/libs/filamentapp/src/NativeWindowHelperWindows.cpp index 38d53bd9ca7..47dac9a3281 100644 --- a/libs/filamentapp/src/NativeWindowHelperWindows.cpp +++ b/libs/filamentapp/src/NativeWindowHelperWindows.cpp @@ -23,7 +23,8 @@ void* getNativeWindow(SDL_Window* sdlWindow) { SDL_SysWMinfo wmi; SDL_VERSION(&wmi.version); - ASSERT_POSTCONDITION(SDL_GetWindowWMInfo(sdlWindow, &wmi), "SDL version unsupported!"); + FILAMENT_CHECK_POSTCONDITION(SDL_GetWindowWMInfo(sdlWindow, &wmi)) + << "SDL version unsupported!"; HWND win = (HWND) wmi.info.win.window; return (void*) win; } diff --git a/libs/geometry/CMakeLists.txt b/libs/geometry/CMakeLists.txt index 5c46eb606c0..a7e8f398eb9 100644 --- a/libs/geometry/CMakeLists.txt +++ b/libs/geometry/CMakeLists.txt @@ -9,11 +9,14 @@ set(PUBLIC_HDR_DIR include) # ================================================================================================== set(PUBLIC_HDRS include/geometry/SurfaceOrientation.h + include/geometry/TangentSpaceMesh.h include/geometry/Transcoder.h ) set(SRCS + src/MikktspaceImpl.cpp src/SurfaceOrientation.cpp + src/TangentSpaceMesh.cpp src/Transcoder.cpp ) @@ -24,7 +27,13 @@ include_directories(${PUBLIC_HDR_DIR}) add_library(${TARGET} STATIC ${PUBLIC_HDRS} ${SRCS}) +set(GEOMETRY_DEPS + meshoptimizer + mikktspace +) + target_link_libraries(${TARGET} PUBLIC math utils) +target_link_libraries(${TARGET} PRIVATE ${GEOMETRY_DEPS}) target_include_directories(${TARGET} PUBLIC ${PUBLIC_HDR_DIR}) set_target_properties(${TARGET} PROPERTIES FOLDER Libs) @@ -35,21 +44,43 @@ set_target_properties(${TARGET} PROPERTIES FOLDER Libs) if (MSVC) target_compile_options(${TARGET} PRIVATE $<$:/fp:fast>) else() - target_compile_options(${TARGET} PRIVATE $<$:-ffast-math>) + target_compile_options(${TARGET} PRIVATE $<$:-ffast-math -fno-finite-math-only>) target_compile_options(${TARGET} PRIVATE -Wno-deprecated-register) endif() # ================================================================================================== # Installation # ================================================================================================== -install(TARGETS ${TARGET} ARCHIVE DESTINATION lib/${DIST_DIR}) + +# No need to install since we're combining this lib and the dependent libs into a combined lib +# install(TARGETS ${TARGET} ARCHIVE DESTINATION lib/${DIST_DIR}) + install(DIRECTORY ${PUBLIC_HDR_DIR}/geometry DESTINATION include) +set(COMBINED_DEPS + ${TARGET} + ${GEOMETRY_DEPS} +) + +# Combine the deps into a single static lib so that client only have to link this lib and not have +# to link its dependencies. +set(GEOMETRY_COMBINED_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/libgeometry_combined.a") +combine_static_libs(${TARGET} "${GEOMETRY_COMBINED_OUTPUT}" "${COMBINED_DEPS}") + +set(GEOMETRY_LIB_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}geometry${CMAKE_STATIC_LIBRARY_SUFFIX}) +install(FILES "${GEOMETRY_COMBINED_OUTPUT}" DESTINATION lib/${DIST_DIR} RENAME ${GEOMETRY_LIB_NAME}) + # ================================================================================================== # Tests # ================================================================================================== if (NOT ANDROID AND NOT WEBGL AND NOT IOS) - add_executable(test_transcoder tests/test_transcoder.cpp) - target_link_libraries(test_transcoder PRIVATE ${TARGET} gtest) - set_target_properties(test_transcoder PROPERTIES FOLDER Tests) + set(TARGET test_transcoder) + add_executable(${TARGET} tests/test_transcoder.cpp) + target_link_libraries(${TARGET} PRIVATE geometry gtest) + set_target_properties(${TARGET} PROPERTIES FOLDER Tests) + + set(TARGET test_tangent_space_mesh) + add_executable(${TARGET} tests/test_tangent_space_mesh.cpp) + target_link_libraries(${TARGET} PRIVATE geometry gtest) + set_target_properties(${TARGET} PROPERTIES FOLDER Tests) endif() diff --git a/libs/geometry/include/geometry/TangentSpaceMesh.h b/libs/geometry/include/geometry/TangentSpaceMesh.h new file mode 100644 index 00000000000..980e81ac28f --- /dev/null +++ b/libs/geometry/include/geometry/TangentSpaceMesh.h @@ -0,0 +1,392 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_GEOMETRY_TANGENTSPACEMESH_H +#define TNT_GEOMETRY_TANGENTSPACEMESH_H + +#include +#include +#include + +#include + +namespace filament { +namespace geometry { + +struct TangentSpaceMeshInput; +struct TangentSpaceMeshOutput; + + /** + * This class builds Filament-style TANGENTS buffers given an input mesh. + * + * This class enables the client to chose between several algorithms. The client can retrieve the + * result through the `get` methods on the class. If the chosen algorithm did not remesh the input, + * the client is advised to just use the data they provided instead of querying. For example, if + * the chosen method is Algorithm::FRISVAD, then the client should not need to call getPositions(). + * We will simply copy from the input `positions` in that case. + * + * If the client calls getPositions() and positions were not provided as input, we will throw + * and exception. Similar behavior will apply to UVs. + * + * This class supersedes the implementation in SurfaceOrientation.h + */ +class TangentSpaceMesh { +public: + enum class Algorithm : uint8_t { + /** + * default + * + * Tries to select the best possible algorithm given the input. The corresponding algorithms + * are detailed in the corresponding enums. + *
    +         *   INPUT                                  ALGORITHM
    +         *   -----------------------------------------------------------
    +         *   normals                                FRISVAD
    +         *   positions + indices                    FLAT_SHADING
    +         *   normals + uvs + positions + indices    MIKKTSPACE
    +         * 
    + */ + DEFAULT = 0, + + /** + * mikktspace + * + * **Requires**: `normals + uvs + positions + indices`
    + * **Reference**: + * - Mikkelsen, M., 2008. Simulation of wrinkled surfaces revisited. + * - https://github.com/mmikk/MikkTSpace + * - https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#meshes-overview + * + * **Note**: Will remesh + */ + MIKKTSPACE = 1, + + /** + * Lengyel's method + * + * **Requires**: `normals + uvs + positions + indices`
    + * **Reference**: Lengyel, E., 2019. Foundations of Game Engine Development: Rendering. Terathon + * Software LLC.. (Chapter 7) + */ + LENGYEL = 2, + + /** + * Hughes-Moller method + * + * **Requires**: `normals`
    + * **Reference**: + * - Hughes, J.F. and Moller, T., 1999. Building an orthonormal basis from a unit + * vector. journal of graphics tools, 4(4), pp.33-35. + * - Parker, S.G., Bigler, J., Dietrich, A., Friedrich, H., Hoberock, J., Luebke, D., + * McAllister, D., McGuire, M., Morley, K., Robison, A. and Stich, M., 2010. + * Optix: a general purpose ray tracing engine. Acm transactions on graphics (tog), + * 29(4), pp.1-13. + * **Note**: We implement the Optix variant, which is documented in the second reference above. + */ + HUGHES_MOLLER = 3, + + /** + * Frisvad's method + * + * **Requires**: `normals`
    + * **Reference**: + * - Frisvad, J.R., 2012. Building an orthonormal basis from a 3D unit vector without + * normalization. Journal of Graphics Tools, 16(3), pp.151-159. + * - http://people.compute.dtu.dk/jerf/code/hairy/ + */ + FRISVAD = 4, + }; + + /** + * This enum specifies the auxiliary attributes of each vertex that can be provided as input. + * These attributes do not affect the computation of the tangent space, but they will be + * properly mapped when a remeshing is carried out. + */ + enum class AuxAttribute : uint8_t { + UV1 = 0x0, + COLORS = 0x1, + JOINTS = 0x2, + WEIGHTS = 0x3, + }; + + using InData = std::variant; + + /** + * Use this class to provide input to the TangentSpaceMesh computation. **Important**: + * Computation of the tangent space is intended to be synchronous (working on the same thread). + * Client is expected to keep the input immutable and in a good state for the duration of both + * computation *and* query. That is, when querying the result of the tangent spaces, part of the + * result might depend on the input data. + */ + class Builder { + public: + Builder() noexcept; + ~Builder() noexcept; + + /** + * Move constructor + */ + Builder(Builder&& that) noexcept; + + /** + * Move constructor + */ + Builder& operator=(Builder&& that) noexcept; + + Builder(Builder const&) = delete; + Builder& operator=(Builder const&) = delete; + + /** + * Client must provide this parameter + * + * @param vertexCount The input number of vertcies + */ + Builder& vertexCount(size_t vertexCount) noexcept; + + /** + * @param normals The input normals + * @param stride The stride for iterating through `normals` + * @return Builder + */ + Builder& normals(filament::math::float3 const* normals, size_t stride = 0) noexcept; + + /** + * @param tangents The input tangents. The `w` component is for use with + * Algorithm::SIGN_OF_W. + * @param stride The stride for iterating through `tangents` + * @return Builder + */ + Builder& tangents(filament::math::float4 const* tangents, size_t stride = 0) noexcept; + + /** + * @param uvs The input uvs + * @param stride The stride for iterating through `uvs` + * @return Builder + */ + Builder& uvs(filament::math::float2 const* uvs, size_t stride = 0) noexcept; + + /** + * Sets "auxiliary" attributes that will be properly mapped when remeshed. + * + * @param attribute The attribute of the data to be stored + * @param data The data to be store + * @param stride The stride for iterating through `attribute` + * @return Builder + */ + Builder& aux(AuxAttribute attribute, InData data, size_t stride = 0) noexcept; + + /** + * @param positions The input positions + * @param stride The stride for iterating through `positions` + * @return Builder + */ + Builder& positions(filament::math::float3 const* positions, size_t stride = 0) noexcept; + + /** + * @param triangleCount The input number of triangles + * @return Builder + */ + Builder& triangleCount(size_t triangleCount) noexcept; + + /** + * @param triangles The triangles in 32-bit indices + * @return Builder + */ + Builder& triangles(filament::math::uint3 const* triangles) noexcept; + + /** + * @param triangles The triangles in 16-bit indices + * @return Builder + */ + Builder& triangles(filament::math::ushort3 const* triangles) noexcept; + + /** + * The Client can provide an algorithm hint to produce the tangents. + * + * @param algorithm The algorithm hint. + * @return Builder + */ + Builder& algorithm(Algorithm algorithm) noexcept; + + /** + * Computes the tangent space mesh. The resulting mesh object is owned by the callee. The + * callee must call TangentSpaceMesh::destroy on the object once they are finished with it. + * + * The state of the Builder will be reset after each call to build(). The client needs to + * populate the builder with parameters again if they choose to re-use it. + * + * @return A TangentSpaceMesh + */ + TangentSpaceMesh* build(); + + private: + TangentSpaceMesh* mMesh = nullptr; + }; + + /** + * Destroy the mesh object + * @param mesh A pointer to a TangentSpaceMesh ready to be destroyed + */ + static void destroy(TangentSpaceMesh* mesh) noexcept; + + /** + * Move constructor + */ + TangentSpaceMesh(TangentSpaceMesh&& that) noexcept; + + /** + * Move constructor + */ + TangentSpaceMesh& operator=(TangentSpaceMesh&& that) noexcept; + + TangentSpaceMesh(TangentSpaceMesh const&) = delete; + TangentSpaceMesh& operator=(TangentSpaceMesh const&) = delete; + + /** + * Number of output vertices + * + * The number of output vertices can be the same as the input if the selected algorithm did not + * "remesh" the input. + * + * @return The number of vertices + */ + size_t getVertexCount() const noexcept; + + /** + * Get output vertex positions. + * Assumes the `out` param is at least of getVertexCount() length (while accounting for + * `stride`). The output vertices can be the same as the input if the selected algorithm did + * not "remesh" the input. The remeshed vertices are not guarranteed to have correlation in + * order with the input mesh. + * + * @param out Client-allocated array that will be used for copying out positions. + * @param stride Stride for iterating through `out` + */ + void getPositions(filament::math::float3* out, size_t stride = 0) const; + + /** + * Get output UVs. + * Assumes the `out` param is at least of getVertexCount() length (while accounting for + * `stride`). The output uvs can be the same as the input if the selected algorithm did + * not "remesh" the input. The remeshed UVs are not guarranteed to have correlation in order + * with the input mesh. + * + * @param out Client-allocated array that will be used for copying out UVs. + * @param stride Stride for iterating through `out` + */ + void getUVs(filament::math::float2* out, size_t stride = 0) const; + + /** + * Get output tangent space. + * Assumes the `out` param is at least of getVertexCount() length (while accounting for + * `stride`). + * + * @param out Client-allocated array that will be used for copying out tangent space in + * 32-bit floating points. + * @param stride Stride for iterating through `out` + */ + void getQuats(filament::math::quatf* out, size_t stride = 0) const noexcept; + + /** + * Get output tangent space. + * Assumes the `out` param is at least of getVertexCount() length (while accounting for + * `stride`). + * + * @param out Client-allocated array that will be used for copying out tangent space in + * 16-bit signed integers. + * @param stride Stride for iterating through `out` + */ + void getQuats(filament::math::short4* out, size_t stride = 0) const noexcept; + + /** + * Get output tangent space. + * Assumes the `out` param is at least of getVertexCount() length (while accounting for + * `stride`). + * + * @param out Client-allocated array that will be used for copying out tangent space in + * 16-bit floating points. + * @param stride Stride for iterating through `out` + */ + void getQuats(filament::math::quath* out, size_t stride = 0) const noexcept; + + /** + * Get output auxiliary attributes. + * Assumes the `out` param is at least of getVertexCount() length (while accounting for + * `stride`). + * + * @param out Client-allocated array that will be used for copying out attribute as T + * @param stride Stride for iterating through `out` + */ + template + using is_supported_aux_t = + typename std::enable_if::value || + std::is_same::value || + std::is_same::value || + std::is_same::value || + std::is_same::value>::type; + template> + void getAux(AuxAttribute attribute, T* out, size_t stride = 0) const noexcept; + + /** + * Get number of output triangles. + * The number of output triangles is the same as the number of input triangles. However, when a + * "remesh" is carried out the output triangles are not guarranteed to have any correlation with + * the input. + * + * @return The number of vertices + */ + size_t getTriangleCount() const noexcept; + + /** + * Get output triangles. + * This method assumes that the `out` param provided by the client is at least of + * getTriangleCount() length. If the client calls getTriangles() and triangles were not + * provided as input, we will throw and exception. + * + * @param out Client's array for the output triangles in unsigned 32-bit indices. + */ + void getTriangles(filament::math::uint3* out) const; + + /** + * Get output triangles. + * This method assumes that the `out` param provided by the client is at least of + * getTriangleCount() length. If the client calls getTriangles() and triangles were not + * provided as input, we will throw and exception. + * + * @param out Client's array for the output triangles in unsigned 16-bit indices. + */ + void getTriangles(filament::math::ushort3* out) const; + + /** + * @return Whether the TBN algorithm remeshed the input. + */ + bool remeshed() const noexcept; + +private: + ~TangentSpaceMesh() noexcept; + TangentSpaceMesh() noexcept; + TangentSpaceMeshInput* mInput; + TangentSpaceMeshOutput* mOutput; + + friend class Builder; +}; + +} // namespace geometry +} // namespace filament + +#endif //TNT_GEOMETRY_TANGENTSPACEMESH_H diff --git a/libs/geometry/src/MikktspaceImpl.cpp b/libs/geometry/src/MikktspaceImpl.cpp new file mode 100644 index 00000000000..5c5a1b582b1 --- /dev/null +++ b/libs/geometry/src/MikktspaceImpl.cpp @@ -0,0 +1,229 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MikktspaceImpl.h" + +#include +#include +#include + +#include +#include + +#include + +#include // memcpy + +namespace filament::geometry { + +using namespace filament::math; + +int MikktspaceImpl::getNumFaces(SMikkTSpaceContext const* context) noexcept { + auto const wrapper = MikktspaceImpl::getThis(context); + return wrapper->mFaceCount; +} + +int MikktspaceImpl::getNumVerticesOfFace(SMikkTSpaceContext const* context, + int const iFace) noexcept { + return 3; +} + +void MikktspaceImpl::getPosition(SMikkTSpaceContext const* context, float fvPosOut[], + int const iFace, int const iVert) noexcept { + auto const wrapper = MikktspaceImpl::getThis(context); + float3 const pos = *pointerAdd(wrapper->mPositions, wrapper->getTriangle(iFace)[iVert], + wrapper->mPositionStride); + fvPosOut[0] = pos.x; + fvPosOut[1] = pos.y; + fvPosOut[2] = pos.z; +} + +void MikktspaceImpl::getNormal(SMikkTSpaceContext const* context, float fvNormOut[], + int const iFace, int const iVert) noexcept { + auto const wrapper = MikktspaceImpl::getThis(context); + float3 const normal = *pointerAdd(wrapper->mNormals, wrapper->getTriangle(iFace)[iVert], + wrapper->mNormalStride); + fvNormOut[0] = normal.x; + fvNormOut[1] = normal.y; + fvNormOut[2] = normal.z; +} + +void MikktspaceImpl::getTexCoord(SMikkTSpaceContext const* context, float fvTexcOut[], + int const iFace, int const iVert) noexcept { + auto const wrapper = MikktspaceImpl::getThis(context); + float2 const texc + = *pointerAdd(wrapper->mUVs, wrapper->getTriangle(iFace)[iVert], wrapper->mUVStride); + fvTexcOut[0] = texc.x; + fvTexcOut[1] = texc.y; +} + +void MikktspaceImpl::setTSpaceBasic(SMikkTSpaceContext const* context, float const fvTangent[], + float const fSign, int const iFace, int const iVert) noexcept { + auto const wrapper = MikktspaceImpl::getThis(context); + uint32_t const vertInd = wrapper->getTriangle(iFace)[iVert]; + float3 const pos = *pointerAdd(wrapper->mPositions, vertInd, wrapper->mPositionStride); + float3 const n = normalize(*pointerAdd(wrapper->mNormals, vertInd, wrapper->mNormalStride)); + float2 const uv = *pointerAdd(wrapper->mUVs, vertInd, wrapper->mUVStride); + float3 const t { fvTangent[0], fvTangent[1], fvTangent[2] }; + float3 const b = fSign * normalize(cross(n, t)); + + // TODO: packTangentFrame actually changes the orientation of b. + quatf const quat = mat3f::packTangentFrame({t, b, n}, sizeof(int32_t)); + + auto& output = wrapper->mOutputData; + auto const& EMPTY_ELEMENT = wrapper->EMPTY_ELEMENT; + + size_t const outputCurSize = output.size(); + + // Prepare for the next element + output.insert(output.end(), EMPTY_ELEMENT.begin(), EMPTY_ELEMENT.end()); + + uint8_t* cursor = output.data() + outputCurSize; + + *((float3*) (cursor + POS_OFFSET)) = pos; + *((float2*) (cursor + UV_OFFSET)) = uv; + *((quatf*) (cursor + TBN_OFFSET)) = quat; + + cursor += BASE_OUTPUT_SIZE; + for (auto const& inputAttrib: wrapper->mInputAttribArrays) { + uint8_t const* input = pointerAdd(inputAttrib.data, vertInd, inputAttrib.stride); + memcpy(cursor, input, inputAttrib.size); + cursor += inputAttrib.size; + } +} + +MikktspaceImpl::MikktspaceImpl(const TangentSpaceMeshInput* input) noexcept + : mFaceCount((int) input->triangleCount), + mPositions(input->positions()), + mPositionStride(input->positionsStride()), + mNormals(input->normals()), + mNormalStride(input->normalsStride()), + mUVs(input->uvs()), + mUVStride(input->uvsStride()), + mIsTriangle16(input->triangles16), + mTriangles( + input->triangles16 ? (uint8_t*) input->triangles16 : (uint8_t*) input->triangles32), + mOutputElementSize(BASE_OUTPUT_SIZE) { + + // We don't know how many attributes there are so we have to create an ordering of the + // output components. The first three components are + // - float3 positions + // - float2 uv + // - quatf tangent + for (auto attrib: input->getAuxAttributes()) { + size_t const attribSize =input->attributeSize(attrib); + mOutputElementSize += attribSize; + mInputAttribArrays.push_back({ + .attrib = attrib, + .data = input->raw(attrib), + .stride = input->stride(attrib), + .size = attribSize, + }); + } + mOutputData.reserve(mFaceCount * 3 * mOutputElementSize); + + // We will insert 0s to signify a new element being added to the output. + EMPTY_ELEMENT = std::vector(mOutputElementSize); +} + +MikktspaceImpl* MikktspaceImpl::getThis(SMikkTSpaceContext const* context) noexcept { + return (MikktspaceImpl*) context->m_pUserData; +} + +inline const uint3 MikktspaceImpl::getTriangle(int const triangleIndex) const noexcept { + const size_t tstride = mIsTriangle16 ? sizeof(ushort3) : sizeof(uint3); + return mIsTriangle16 ? uint3(*(ushort3*) (pointerAdd(mTriangles, triangleIndex, tstride))) + : *(uint3*) (pointerAdd(mTriangles, triangleIndex, tstride)); +} + +void MikktspaceImpl::run(TangentSpaceMeshOutput* output) noexcept { + SMikkTSpaceInterface interface { + .m_getNumFaces = MikktspaceImpl::getNumFaces, + .m_getNumVerticesOfFace = MikktspaceImpl::getNumVerticesOfFace, + .m_getPosition = MikktspaceImpl::getPosition, + .m_getNormal = MikktspaceImpl::getNormal, + .m_getTexCoord = MikktspaceImpl::getTexCoord, + .m_setTSpaceBasic = MikktspaceImpl::setTSpaceBasic, + }; + SMikkTSpaceContext context{.m_pInterface = &interface, .m_pUserData = this}; + genTangSpaceDefault(&context); + + size_t oVertexCount = mOutputData.size() / mOutputElementSize; + std::vector remap; + remap.resize(oVertexCount); + size_t vertexCount = meshopt_generateVertexRemap(remap.data(), NULL, remap.size(), + mOutputData.data(), oVertexCount, mOutputElementSize); + + std::vector newVertices(vertexCount * mOutputElementSize); + meshopt_remapVertexBuffer((void*) newVertices.data(), mOutputData.data(), oVertexCount, + mOutputElementSize, remap.data()); + + uint3* triangles32 = output->triangles32.allocate(mFaceCount); + meshopt_remapIndexBuffer((uint32_t*) triangles32, NULL, remap.size(), remap.data()); + + float3* outPositions = output->positions().allocate(vertexCount); + float2* outUVs = output->uvs().allocate(vertexCount); + quatf* outQuats = output->tspace().allocate(vertexCount); + + uint8_t* const verts = newVertices.data(); + + std::vector> attributes; + + for (auto const& inputAttrib: mInputAttribArrays) { + auto const attrib = inputAttrib.attrib; + switch(attrib) { + case AttributeImpl::UV1: + attributes.push_back( + {attrib, output->data(attrib).allocate(vertexCount), + inputAttrib.size}); + break; + case AttributeImpl::COLORS: + attributes.push_back( + {attrib, output->data(attrib).allocate(vertexCount), + inputAttrib.size}); + break; + case AttributeImpl::JOINTS: + attributes.push_back( + {attrib, output->data(attrib).allocate(vertexCount), + inputAttrib.size}); + break; + case AttributeImpl::WEIGHTS: + attributes.push_back( + {attrib, output->data(attrib).allocate(vertexCount), + inputAttrib.size}); + break; + default: + PANIC_POSTCONDITION("Unexpected attribute=%d", (int) inputAttrib.attrib); + } + } + + for (size_t i = 0, vi=0; i < vertexCount; ++i, vi+=mOutputElementSize) { + outPositions[i] = *((float3*) (verts + vi + POS_OFFSET)); + outUVs[i] = *((float2*) (verts + vi + UV_OFFSET)); + outQuats[i] = *((quatf*) (verts + vi + TBN_OFFSET)); + + uint8_t* cursor = verts + vi + BASE_OUTPUT_SIZE; + for (auto const [attrib, outdata, size] : attributes) { + memcpy((uint8_t*) outdata + (i * size), cursor, size); + cursor += size; + } + } + + output->vertexCount = vertexCount; + output->triangleCount = mFaceCount; +} + +}// namespace filament::geometry diff --git a/libs/geometry/src/MikktspaceImpl.h b/libs/geometry/src/MikktspaceImpl.h new file mode 100644 index 00000000000..6add3027faf --- /dev/null +++ b/libs/geometry/src/MikktspaceImpl.h @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_GEOMETRY_MIKKTSPACEIMPL_H +#define TNT_GEOMETRY_MIKKTSPACEIMPL_H + +#include "TangentSpaceMeshInternal.h" + +#include +#include +#include + +#include + +struct SMikkTSpaceContext; + +namespace filament::geometry { + +using namespace filament::math; + +class MikktspaceImpl { +public: + struct IOVertex { + float3 position; + float2 uv; + quatf tangentSpace; + }; + + MikktspaceImpl(TangentSpaceMeshInput const* input) noexcept; + + MikktspaceImpl(MikktspaceImpl const&) = delete; + MikktspaceImpl& operator=(MikktspaceImpl const&) = delete; + + void run(TangentSpaceMeshOutput* output) noexcept; + +private: + // sizeof(float3 + float2 + quatf) (pos, uv, tangent) + static constexpr size_t const FLOAT3_SIZE = sizeof(float3); + static constexpr size_t const FLOAT2_SIZE = sizeof(float2); + static constexpr size_t const QUATF_SIZE = sizeof(quatf); + + static constexpr size_t const POS_OFFSET = 0; + static constexpr size_t const UV_OFFSET = FLOAT3_SIZE; + static constexpr size_t const TBN_OFFSET = FLOAT3_SIZE + FLOAT2_SIZE; + static constexpr size_t const BASE_OUTPUT_SIZE = FLOAT3_SIZE + FLOAT2_SIZE + QUATF_SIZE; + + static int getNumFaces(SMikkTSpaceContext const* context) noexcept; + static int getNumVerticesOfFace(SMikkTSpaceContext const* context, int const iFace) noexcept; + static void getPosition(SMikkTSpaceContext const* context, float fvPosOut[], int const iFace, + int const iVert) noexcept; + static void getNormal(SMikkTSpaceContext const* context, float fvNormOut[], int const iFace, + int const iVert) noexcept; + static void getTexCoord(SMikkTSpaceContext const* context, float fvTexcOut[], int const iFace, + int const iVert) noexcept; + static void setTSpaceBasic(SMikkTSpaceContext const* context, float const fvTangent[], + float const fSign, int const iFace, int const iVert) noexcept; + + static MikktspaceImpl* getThis(SMikkTSpaceContext const* context) noexcept; + + inline const uint3 getTriangle(int const triangleIndex) const noexcept; + + int const mFaceCount; + float3 const* mPositions; + size_t const mPositionStride; + float3 const* mNormals; + size_t const mNormalStride; + float2 const* mUVs; + size_t const mUVStride; + uint8_t const* mTriangles; + bool mIsTriangle16; + + struct InputAttribute { + AttributeImpl attrib; + uint8_t const* data; + size_t stride; + size_t size; + }; + std::vector mInputAttribArrays; + + size_t mOutputElementSize; + std::vector mOutputData; + std::vector EMPTY_ELEMENT; +}; + +}// namespace filament::geometry + +#endif//TNT_GEOMETRY_MIKKTSPACEIMPL_H diff --git a/libs/geometry/src/TangentSpaceMesh.cpp b/libs/geometry/src/TangentSpaceMesh.cpp new file mode 100644 index 00000000000..385189add23 --- /dev/null +++ b/libs/geometry/src/TangentSpaceMesh.cpp @@ -0,0 +1,788 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "MikktspaceImpl.h" +#include "TangentSpaceMeshInternal.h" + +#include +#include + +#include +#include + +#include + +namespace filament { +namespace geometry { + +using namespace filament::math; + +namespace { + +using Builder = TangentSpaceMesh::Builder; +using MethodPtr = void(*)(TangentSpaceMeshInput const*, TangentSpaceMeshOutput*); + +constexpr uint8_t const NORMALS_BIT = 0x01; +constexpr uint8_t const UVS_BIT = 0x02; +constexpr uint8_t const POSITIONS_BIT = 0x04; +constexpr uint8_t const TANGENTS_BIT = 0x08; +constexpr uint8_t const INDICES_BIT = 0x10; + +// Input types +constexpr uint8_t const NORMALS = NORMALS_BIT; +constexpr uint8_t const POSITIONS_INDICES = POSITIONS_BIT | INDICES_BIT; +constexpr uint8_t const NORMALS_UVS_POSITIONS_INDICES = NORMALS_BIT | UVS_BIT | POSITIONS_BIT | INDICES_BIT; +constexpr uint8_t const NORMALS_TANGENTS = NORMALS_BIT | TANGENTS_BIT; + +std::string_view to_string(Algorithm const algorithm) noexcept { + switch (algorithm) { + case Algorithm::DEFAULT: + return "DEFAULT"; + case Algorithm::MIKKTSPACE: + return "MIKKTSPACE"; + case Algorithm::LENGYEL: + return "LENGYEL"; + case Algorithm::HUGHES_MOLLER: + return "HUGHES_MOLLER"; + case Algorithm::FRISVAD: + return "FRISVAD"; + } +} + +std::string_view to_string(AlgorithmImpl const algorithm) noexcept { + switch (algorithm) { + case AlgorithmImpl::INVALID: + return "INVALID"; + case AlgorithmImpl::MIKKTSPACE: + return "MIKKTSPACE"; + case AlgorithmImpl::LENGYEL: + return "LENGYEL"; + case AlgorithmImpl::HUGHES_MOLLER: + return "HUGHES_MOLLER"; + case AlgorithmImpl::FRISVAD: + return "FRISVAD"; + case AlgorithmImpl::FLAT_SHADING: + return "FLAT_SHADING"; + case AlgorithmImpl::TANGENTS_PROVIDED: + return "TANGENTS_PROVIDED"; + } +} + +inline bool isInputType(uint8_t const inputType, uint8_t const checkType) noexcept { + return ((inputType & checkType) == checkType); +} + +template +inline void takeStride(InputType*& out, size_t const stride) noexcept { + out = pointerAdd(out, 1, stride); +} + +inline AlgorithmImpl selectBestDefaultAlgorithm(uint8_t const inputType) { + if (isInputType(inputType, NORMALS_UVS_POSITIONS_INDICES)) { + return AlgorithmImpl::MIKKTSPACE; + } else if (isInputType(inputType, NORMALS_TANGENTS)) { + return AlgorithmImpl::TANGENTS_PROVIDED; + } else if (isInputType(inputType, POSITIONS_INDICES)) { + return AlgorithmImpl::FLAT_SHADING; + } else { + FILAMENT_CHECK_PRECONDITION(inputType & NORMALS) + << "Must at least have normals or (positions + indices) as input"; + return AlgorithmImpl::FRISVAD; + } +} + +AlgorithmImpl selectAlgorithm(TangentSpaceMeshInput *input) noexcept { + uint8_t inputType = 0; + auto normals = input->normals(); + auto positions = input->positions(); + auto uvs = input->uvs(); + auto tangents = input->tangents(); + + if (normals) { + inputType |= NORMALS_BIT; + } + if (positions) { + inputType |= POSITIONS_BIT; + } + if (uvs) { + inputType |= UVS_BIT; + } + if (input->triangles32 || input->triangles16) { + inputType |= INDICES_BIT; + } + if (tangents) { + inputType |= TANGENTS_BIT; + } + + AlgorithmImpl outAlgo = AlgorithmImpl::INVALID; + switch (input->algorithm) { + case Algorithm::DEFAULT: + outAlgo = selectBestDefaultAlgorithm(inputType); + break; + case Algorithm::MIKKTSPACE: + if (isInputType(inputType, NORMALS_UVS_POSITIONS_INDICES)) { + outAlgo = AlgorithmImpl::MIKKTSPACE; + } + break; + case Algorithm::LENGYEL: + if (isInputType(inputType, NORMALS_UVS_POSITIONS_INDICES)) { + outAlgo = AlgorithmImpl::LENGYEL; + } + break; + case Algorithm::HUGHES_MOLLER: + if (isInputType(inputType, NORMALS)) { + outAlgo = AlgorithmImpl::HUGHES_MOLLER; + } + break; + case Algorithm::FRISVAD: + if (isInputType(inputType, NORMALS)) { + outAlgo = AlgorithmImpl::FRISVAD; + } + break; + } + + if (outAlgo == AlgorithmImpl::INVALID) { + outAlgo = selectBestDefaultAlgorithm(inputType); + utils::slog.w << "Cannot satisfy algorithm=" << to_string(input->algorithm) + << ". Selected algorithm=" << to_string(outAlgo) << " instead" + << utils::io::endl; + } + + return outAlgo; +} + +// The paper uses a Z-up world basis, which has been converted to Y-up here +inline std::pair frisvadKernel(float3 const& n) { + float3 b, t; + if (n.y < -1.0f + std::numeric_limits::epsilon()) { + // Handle the singularity + t = float3{-1.0f, 0.0f, 0.0f}; + b = float3{0.0f, 0.0f, -1.0f}; + } else { + float const va = 1.0f / (1.0f + n.y); + float const vb = -n.z * n.x * va; + t = float3{vb, -n.z, 1.0f - n.z * n.z * va}; + b = float3{1.0f - n.x * n.x * va, -n.x, vb}; + } + return {b, t}; +} + +void frisvadMethod(TangentSpaceMeshInput const* input, TangentSpaceMeshOutput* output) + noexcept { + size_t const vertexCount = input->vertexCount; + quatf* quats = output->tspace().allocate(vertexCount); + + float3 const* UTILS_RESTRICT normals = input->normals(); + size_t const nstride = input->normalsStride(); + + for (size_t qindex = 0; qindex < vertexCount; ++qindex) { + float3 const n = *normals; + auto const [b, t] = frisvadKernel(n); + quats[qindex] = mat3f::packTangentFrame({t, b, n}, sizeof(int32_t)); + normals = pointerAdd(normals, 1, nstride); + } + output->vertexCount = input->vertexCount; + output->triangleCount = input->triangleCount; + output->passthrough(input->attributeData, {AttributeImpl::UV0, AttributeImpl::POSITIONS}); + output->passthrough(input->attributeData, input->getAuxAttributes()); + output->triangles32.borrow(input->triangles32); + output->triangles16.borrow(input->triangles16); +} + +void hughesMollerMethod(TangentSpaceMeshInput const* input, TangentSpaceMeshOutput* output) + noexcept { + size_t const vertexCount = input->vertexCount; + quatf* quats = output->tspace().allocate(vertexCount); + + float3 const* UTILS_RESTRICT normals = input->normals(); + size_t const nstride = input->normalsStride(); + + for (size_t qindex = 0; qindex < vertexCount; ++qindex) { + float3 const n = *normals; + float3 b, t; + + if (abs(n.x) > abs(n.z) + std::numeric_limits::epsilon()) { + t = float3{-n.y, n.x, 0.0f}; + } else { + t = float3{0.0f, -n.z, n.y}; + } + t = normalize(t); + b = cross(n, t); + + quats[qindex] = mat3f::packTangentFrame({t, b, n}, sizeof(int32_t)); + normals = pointerAdd(normals, 1, nstride); + } + output->vertexCount = input->vertexCount; + output->triangleCount = input->triangleCount; + output->passthrough(input->attributeData, {AttributeImpl::UV0, AttributeImpl::POSITIONS}); + output->passthrough(input->attributeData, input->getAuxAttributes()); + output->triangles32.borrow(input->triangles32); + output->triangles16.borrow(input->triangles16); +} + +void flatShadingMethod(TangentSpaceMeshInput const* input, TangentSpaceMeshOutput* output) + noexcept { + bool const isTriangle16 = input->triangles16 != nullptr; + size_t const triangleCount = input->triangleCount; + size_t const tstride = isTriangle16 ? sizeof(ushort3) : sizeof(uint3); + size_t const outVertexCount = triangleCount * 3; + + using InData = TangentSpaceMesh::InData; + using OutData = std::variant; + + // We make sure to initialize arrays for the auxilliary attributes that will also be mapped in + // the new mesh. + std::vector> outAttributes; + { + auto const initArray = [output, count = outVertexCount](AttributeImpl attrib, + InData indata) -> OutData { + if (std::holds_alternative(indata)) { + if (std::get(indata)) { + return output->data(attrib).allocate(count); + } + return (float2*) nullptr; + } else if (std::holds_alternative(indata)) { + if (std::get(indata)) { + return output->data(attrib).allocate(count); + } + return (float3*) nullptr; + } else if (std::holds_alternative(indata)) { + if (std::get(indata)) { + return output->data(attrib).allocate(count); + } + return (float4*) nullptr; + } else if (std::holds_alternative(indata)) { + if (std::get(indata)) { + return output->data(attrib).allocate(count); + } + return (ushort3*) nullptr; + } else if (std::holds_alternative(indata)) { + if (std::get(indata)) { + return output->data(attrib).allocate(count); + } + return (ushort4*) nullptr; + } + return (float2*) nullptr; + }; + auto attributes = input->getAuxAttributes(); + if (input->uvs()) { + auto uvs = input->uvs(); + attributes.push_back(AttributeImpl::UV0); + } + std::for_each(attributes.begin(), attributes.end(), + [=, &outAttributes](AttributeImpl attrib) { + auto indata = input->data(attrib); + outAttributes.push_back({ + indata, + initArray(attrib, indata), + attrib, + input->stride(attrib), + }); + }); + + } + + float3 const* positions = input->positions(); + size_t const pstride = input->positionsStride(); + + uint8_t const* triangles = isTriangle16 ? (uint8_t const*) input->triangles16 : + (uint8_t const*) input->triangles32; + + float3* outPositions = output->positions().allocate(outVertexCount); + quatf* quats = output->tspace().allocate(outVertexCount); + + size_t const outTriangleCount = triangleCount; + uint3* outTriangles = output->triangles32.allocate(outTriangleCount); + + size_t vindex = 0; + for (size_t tindex = 0; tindex < triangleCount; ++tindex) { + uint3 tri = isTriangle16 ? + uint3(*(ushort3*)(pointerAdd(triangles, tindex, tstride))) : + *(uint3*)(pointerAdd(triangles, tindex, tstride)); + + float3 const pa = *pointerAdd(positions, tri.x, pstride); + float3 const pb = *pointerAdd(positions, tri.y, pstride); + float3 const pc = *pointerAdd(positions, tri.z, pstride); + + uint32_t i0 = vindex++, i1 = vindex++, i2 = vindex++; + outTriangles[tindex] = uint3{i0, i1, i2}; + + outPositions[i0] = pa; + outPositions[i1] = pb; + outPositions[i2] = pc; + + float3 const n = normalize(cross(pc - pb, pa - pb)); + const auto [t, b] = frisvadKernel(n); + + quatf const tspace = mat3f::packTangentFrame({t, b, n}, sizeof(int32_t)); + quats[i0] = tspace; + quats[i1] = tspace; + quats[i2] = tspace; + + // We need to make sure that the aux data is ported to the new mesh + for (auto& [indata, outdata, attrib, stride]: outAttributes) { + if (std::holds_alternative(indata)) { + float2* out = std::get(outdata); + float2 const* in = std::get(indata); + out[i0] = *pointerAdd(in, tri.x, stride); + out[i1] = *pointerAdd(in, tri.y, stride); + out[i2] = *pointerAdd(in, tri.z, stride); + } else if (std::holds_alternative(indata)) { + float3* out = std::get(outdata); + float3 const* in = std::get(indata); + out[i0] = *pointerAdd(in, tri.x, stride); + out[i1] = *pointerAdd(in, tri.y, stride); + out[i2] = *pointerAdd(in, tri.z, stride); + } else if (std::holds_alternative(indata)) { + float4* out = std::get(outdata); + float4 const* in = std::get(indata); + out[i0] = *pointerAdd(in, tri.x, stride); + out[i1] = *pointerAdd(in, tri.y, stride); + out[i2] = *pointerAdd(in, tri.z, stride); + } else if (std::holds_alternative(indata)) { + ushort3* out = std::get(outdata); + ushort3 const* in = std::get(indata); + out[i0] = *pointerAdd(in, tri.x, stride); + out[i1] = *pointerAdd(in, tri.y, stride); + out[i2] = *pointerAdd(in, tri.z, stride); + } else if (std::holds_alternative(indata)) { + ushort4* out = std::get(outdata); + ushort4 const* in = std::get(indata); + out[i0] = *pointerAdd(in, tri.x, stride); + out[i1] = *pointerAdd(in, tri.y, stride); + out[i2] = *pointerAdd(in, tri.z, stride); + } + } + } + + output->vertexCount = outVertexCount; + output->triangleCount = outTriangleCount; +} + +void tangentsProvidedMethod(TangentSpaceMeshInput const* input, TangentSpaceMeshOutput* output) + noexcept { + size_t const vertexCount = input->vertexCount; + quatf* quats = output->tspace().allocate(vertexCount); + + float3 const* normal = input->normals(); + size_t const nstride = input->normalsStride(); + + float4 const* tanvec = input->tangents(); + size_t const tstride = input->tangentsStride(); + + for (size_t qindex = 0; qindex < vertexCount; ++qindex) { + float3 const& n = *pointerAdd(normal, qindex, nstride); + float4 const& t4 = *pointerAdd(tanvec, qindex, nstride); + float3 tv = t4.xyz; + float3 b = t4.w > 0 ? cross(tv, n) : cross(n, tv); + + // Some assets do not provide perfectly orthogonal tangents and normals, so we adjust the + // tangent to enforce orthonormality. We would rather honor the exact normal vector than + // the exact tangent vector since the latter is only used for bump mapping and anisotropic + // lighting. + tv = t4.w > 0 ? cross(n, b) : cross(b, n); + + quats[qindex] = mat3f::packTangentFrame({tv, b, n}); + } + + output->vertexCount = vertexCount; + output->triangleCount = input->triangleCount; + output->passthrough(input->attributeData, {AttributeImpl::UV0, AttributeImpl::POSITIONS}); + output->passthrough(input->attributeData, input->getAuxAttributes()); + output->triangles32.borrow(input->triangles32); + output->triangles16.borrow(input->triangles16); +} + +void mikktspaceMethod(TangentSpaceMeshInput const* input, TangentSpaceMeshOutput* output) { + MikktspaceImpl impl(input); + impl.run(output); +} + +inline float3 randomPerp(float3 const& n) { + float3 perp = cross(n, float3{1, 0, 0}); + float sqrlen = dot(perp, perp); + if (sqrlen <= std::numeric_limits::epsilon()) { + perp = cross(n, float3{0, 1, 0}); + sqrlen = dot(perp, perp); + } + return perp / sqrlen; +} + +void lengyelMethod(TangentSpaceMeshInput const* input, TangentSpaceMeshOutput* output) { + size_t const vertexCount = input->vertexCount; + size_t const triangleCount = input->triangleCount; + size_t const positionStride = input->positionsStride(); + size_t const normalStride = input->normalsStride(); + size_t const uvStride = input->uvsStride(); + auto const* triangles16 = input->triangles16; + auto const* triangles32 = input->triangles32; + auto positions = input->positions(); + auto uvs = input->uvs(); + auto normals = input->normals(); + + std::vector tan1(vertexCount, float3{0.0f}); + std::vector tan2(vertexCount, float3{0.0f}); + for (size_t a = 0; a < triangleCount; ++a) { + uint3 tri = triangles16 ? uint3(triangles16[a]) : triangles32[a]; + assert_invariant(tri.x < vertexCount && tri.y < vertexCount && tri.z < vertexCount); + float3 const& v1 = *pointerAdd(positions, tri.x, positionStride); + float3 const& v2 = *pointerAdd(positions, tri.y, positionStride); + float3 const& v3 = *pointerAdd(positions, tri.z, positionStride); + float2 const& w1 = *pointerAdd(uvs, tri.x, uvStride); + float2 const& w2 = *pointerAdd(uvs, tri.y, uvStride); + float2 const& w3 = *pointerAdd(uvs, tri.z, uvStride); + float const x1 = v2.x - v1.x; + float const x2 = v3.x - v1.x; + float const y1 = v2.y - v1.y; + float const y2 = v3.y - v1.y; + float const z1 = v2.z - v1.z; + float const z2 = v3.z - v1.z; + float const s1 = w2.x - w1.x; + float const s2 = w3.x - w1.x; + float const t1 = w2.y - w1.y; + float const t2 = w3.y - w1.y; + float const d = s1 * t2 - s2 * t1; + float3 sdir, tdir; + // In general we can't guarantee smooth tangents when the UV's are non-smooth, but let's at + // least avoid divide-by-zero and fall back to normals-only method. + if (d == 0.0) { + float3 const& n1 = *pointerAdd(normals, tri.x, normalStride); + sdir = randomPerp(n1); + tdir = cross(n1, sdir); + } else { + sdir = {t2 * x1 - t1 * x2, t2 * y1 - t1 * y2, t2 * z1 - t1 * z2}; + tdir = {s1 * x2 - s2 * x1, s1 * y2 - s2 * y1, s1 * z2 - s2 * z1}; + float const r = 1.0f / d; + sdir *= r; + tdir *= r; + } + tan1[tri.x] += sdir; + tan1[tri.y] += sdir; + tan1[tri.z] += sdir; + tan2[tri.x] += tdir; + tan2[tri.y] += tdir; + tan2[tri.z] += tdir; + } + + quatf* quats = output->tspace().allocate(vertexCount); + for (size_t a = 0; a < vertexCount; a++) { + float3 const& n = *pointerAdd(normals, a, normalStride); + float3 const& t1 = tan1[a]; + float3 const& t2 = tan2[a]; + + // Gram-Schmidt orthogonalize + float3 const t = normalize(t1 - n * dot(n, t1)); + + // Calculate handedness + float const w = (dot(cross(n, t1), t2) < 0.0f) ? -1.0f : 1.0f; + + float3 b = w < 0 ? cross(t, n) : cross(n, t); + quats[a] = mat3f::packTangentFrame({t, b, n}, sizeof(int32_t)); + } + + output->vertexCount = vertexCount; + output->triangleCount = triangleCount; + output->passthrough(input->attributeData, {AttributeImpl::UV0, AttributeImpl::POSITIONS}); + output->passthrough(input->attributeData, input->getAuxAttributes()); + output->triangles32.borrow(triangles32); + output->triangles16.borrow(triangles16); +} + +void auxImpl(TangentSpaceMeshInput::AttributeMap& attributeData, AttributeImpl attribute, + InData data, size_t stride) noexcept { + attributeData[attribute] = { + data, + stride ? stride : TangentSpaceMeshInput::attributeSize(attribute), + }; +} + +} // anonymous namespace + +Builder::Builder() noexcept + :mMesh(new TangentSpaceMesh()) {} + +Builder::~Builder() noexcept { + delete mMesh; +} + +Builder::Builder(Builder&& that) noexcept { + std::swap(mMesh, that.mMesh); +} + +Builder& Builder::operator=(Builder&& that) noexcept { + std::swap(mMesh, that.mMesh); + return *this; +} + +Builder& Builder::vertexCount(size_t vertexCount) noexcept { + mMesh->mInput->vertexCount = vertexCount; + return *this; +} + +Builder& Builder::normals(float3 const* normals, size_t stride) noexcept { + auxImpl(mMesh->mInput->attributeData, AttributeImpl::NORMALS, normals, stride); + return *this; +} + +Builder& Builder::uvs(float2 const* uvs, size_t stride) noexcept { + auxImpl(mMesh->mInput->attributeData, AttributeImpl::UV0, uvs, stride); + return *this; +} + +Builder& Builder::positions(float3 const* positions, size_t stride) noexcept { + auxImpl(mMesh->mInput->attributeData, AttributeImpl::POSITIONS, positions, stride); + return *this; +} + +Builder& Builder::tangents(float4 const* tangents, size_t stride) noexcept { + auxImpl(mMesh->mInput->attributeData, AttributeImpl::TANGENTS, tangents, stride); + return *this; +} + +Builder& Builder::aux(AuxAttribute attribute, InData data, size_t stride) noexcept { + auxImpl(mMesh->mInput->attributeData, static_cast(attribute), data, stride); + return *this; +} + +Builder& Builder::triangleCount(size_t triangleCount) noexcept { + mMesh->mInput->triangleCount = triangleCount; + return *this; +} + +Builder& Builder::triangles(uint3 const* triangle32) noexcept { + mMesh->mInput->triangles32 = triangle32; + return *this; +} + +Builder& Builder::triangles(ushort3 const* triangle16) noexcept { + mMesh->mInput->triangles16 = triangle16; + return *this; +} + +Builder& Builder::algorithm(Algorithm algo) noexcept { + mMesh->mInput->algorithm = algo; + return *this; +} + +TangentSpaceMesh* Builder::build() { + FILAMENT_CHECK_PRECONDITION(!mMesh->mInput->triangles32 || !mMesh->mInput->triangles16) + << "Cannot provide both uint32 triangles and uint16 triangles"; + + // Validate whether the provided data for an attribute is of the right data type. + for (auto attribute: mMesh->mInput->getAuxAttributes()) { + FILAMENT_CHECK_PRECONDITION( + TangentSpaceMeshInput::isDataTypeCorrect(attribute, mMesh->mInput->data(attribute))) + << "Incorrect attribute data type"; + } + + mMesh->mOutput->algorithm = selectAlgorithm(mMesh->mInput); + MethodPtr method = nullptr; + switch (mMesh->mOutput->algorithm) { + case AlgorithmImpl::MIKKTSPACE: + method = mikktspaceMethod; + break; + case AlgorithmImpl::LENGYEL: + method = lengyelMethod; + break; + case AlgorithmImpl::HUGHES_MOLLER: + method = hughesMollerMethod; + break; + case AlgorithmImpl::FRISVAD: + method = frisvadMethod; + break; + case AlgorithmImpl::FLAT_SHADING: + method = flatShadingMethod; + break; + case AlgorithmImpl::TANGENTS_PROVIDED: + method = tangentsProvidedMethod; + break; + default: + break; + } + assert_invariant(method); + method(mMesh->mInput, mMesh->mOutput); + + auto meshPtr = mMesh; + // Reset the state. + mMesh = new TangentSpaceMesh(); + + return meshPtr; +} + +void TangentSpaceMesh::destroy(TangentSpaceMesh* mesh) noexcept { + delete mesh; +} + +TangentSpaceMesh::TangentSpaceMesh() noexcept + :mInput(new TangentSpaceMeshInput()), mOutput(new TangentSpaceMeshOutput()) { +} + +TangentSpaceMesh::~TangentSpaceMesh() noexcept { + delete mOutput; + delete mInput; +} + +TangentSpaceMesh::TangentSpaceMesh(TangentSpaceMesh&& that) noexcept { + std::swap(mInput, that.mInput); + std::swap(mOutput, that.mOutput); +} + +TangentSpaceMesh& TangentSpaceMesh::operator=(TangentSpaceMesh&& that) noexcept { + std::swap(mInput, that.mInput); + std::swap(mOutput, that.mOutput); + return *this; +} + +size_t TangentSpaceMesh::getVertexCount() const noexcept { + return mOutput->vertexCount; +} + +void TangentSpaceMesh::getPositions(float3* positions, size_t stride) const { + auto inPositions = mInput->positions(); + FILAMENT_CHECK_PRECONDITION(inPositions) << "Must provide input positions"; + stride = stride ? stride : sizeof(decltype(*positions)); + auto const& outPositions = mOutput->positions(); + for (size_t i = 0; i < mOutput->vertexCount; ++i) { + *positions = outPositions[i]; + takeStride(positions, stride); + } +} + +void TangentSpaceMesh::getUVs(float2* uvs, size_t stride) const { + auto inUVs = mInput->uvs(); + FILAMENT_CHECK_PRECONDITION(inUVs) << "Must provide input positions"; + stride = stride ? stride : sizeof(decltype(*uvs)); + auto const& outUvs = mOutput->uvs(); + for (size_t i = 0; i < mOutput->vertexCount; ++i) { + *uvs = outUvs[i]; + takeStride(uvs, stride); + } +} + +size_t TangentSpaceMesh::getTriangleCount() const noexcept { + return mOutput->triangleCount; +} + +void TangentSpaceMesh::getTriangles(uint3* out) const { + FILAMENT_CHECK_PRECONDITION(mInput->triangles16 || mInput->triangles32) + << "Must provide input triangles"; + + bool const is16 = (bool) mOutput->triangles16; + auto const& triangles16 = mOutput->triangles16; + auto const& triangles32 = mOutput->triangles32; + size_t const stride = sizeof(decltype(*out)); + for (size_t i = 0; i < mOutput->triangleCount; ++i) { + *out = is16 ? uint3{triangles16[i]} : triangles32[i]; + takeStride(out, stride); + } +} + +void TangentSpaceMesh::getTriangles(ushort3* out) const { + FILAMENT_CHECK_PRECONDITION(mInput->triangles16 || mInput->triangles32) + << "Must provide input triangles"; + + const bool is16 = (bool) mOutput->triangles16; + auto const& triangles16 = mOutput->triangles16; + auto const& triangles32 = mOutput->triangles32; + const size_t stride = sizeof(decltype(*out)); + for (size_t i = 0, c = mOutput->triangleCount; i < c; ++i) { + if (is16) { + *out = triangles16[i]; + } else { + uint3 const& tri = triangles32[i]; + FILAMENT_CHECK_PRECONDITION( + tri.x <= USHRT_MAX && tri.y <= USHRT_MAX && tri.z <= USHRT_MAX) + << "Overflow when casting uint3 to ushort3"; + *out = ushort3{static_cast(tri.x), + static_cast(tri.y), + static_cast(tri.z)}; + } + takeStride(out, stride); + } +} + +void TangentSpaceMesh::getQuats(quatf* out, size_t stride) const noexcept { + stride = stride ? stride : sizeof(decltype((*out))); + auto const& tangents = mOutput->tspace(); + size_t const vertexCount = mOutput->vertexCount; + for (size_t i = 0; i < vertexCount; ++i) { + *out = tangents[i]; + takeStride(out, stride); + } +} + +void TangentSpaceMesh::getQuats(short4* out, size_t stride) const noexcept { + stride = stride ? stride : sizeof(decltype((*out))); + auto const& tangents = mOutput->tspace(); + size_t const vertexCount = mOutput->vertexCount; + for (size_t i = 0; i < vertexCount; ++i) { + *out = packSnorm16(tangents[i].xyzw); + takeStride(out, stride); + } +} + +void TangentSpaceMesh::getQuats(quath* out, size_t stride) const noexcept { + stride = stride ? stride : sizeof(decltype((*out))); + auto const& tangents = mOutput->tspace(); + size_t const vertexCount = mOutput->vertexCount; + for (size_t i = 0; i < vertexCount; ++i) { + *out = quath(tangents[i].xyzw); + takeStride(out, stride); + } +} + +template void TangentSpaceMesh::getAux(AuxAttribute attribute, float2* out, + size_t stride) const noexcept; + +template void TangentSpaceMesh::getAux(AuxAttribute attribute, float3* out, + size_t stride) const noexcept; + +template void TangentSpaceMesh::getAux(AuxAttribute attribute, float4* out, + size_t stride) const noexcept; + +template void TangentSpaceMesh::getAux(AuxAttribute attribute, ushort3* out, + size_t stride) const noexcept; + +template void TangentSpaceMesh::getAux(AuxAttribute attribute, ushort4* out, + size_t stride) const noexcept; + +template +void TangentSpaceMesh::getAux(AuxAttribute attribute, T* out, size_t stride) const noexcept { + AttributeImpl attrib = static_cast(attribute); + auto inAux = mInput->data(attrib); + FILAMENT_CHECK_PRECONDITION(inAux) << "Must provide input auxilliary attribute"; + stride = stride ? stride : sizeof(decltype(*out)); + auto const& outAux = mOutput->data(attrib); + for (size_t i = 0; i < mOutput->vertexCount; ++i) { + *out = outAux[i]; + takeStride(out, stride); + } +} + +bool TangentSpaceMesh::remeshed() const noexcept { + switch(mOutput->algorithm) { + case AlgorithmImpl::MIKKTSPACE: + case AlgorithmImpl::FLAT_SHADING: + return true; + default: + return false; + } +} + +} +} diff --git a/libs/geometry/src/TangentSpaceMeshInternal.h b/libs/geometry/src/TangentSpaceMeshInternal.h new file mode 100644 index 00000000000..fb83f8eaa97 --- /dev/null +++ b/libs/geometry/src/TangentSpaceMeshInternal.h @@ -0,0 +1,426 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_GEOMETRY_TANGENTSPACEMESHIMPL_H +#define TNT_GEOMETRY_TANGENTSPACEMESHIMPL_H + +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include + +namespace filament::geometry { + +using namespace filament::math; + +namespace { + +using Algorithm = TangentSpaceMesh::Algorithm; +using AuxAttribute = TangentSpaceMesh::AuxAttribute; +using InData = TangentSpaceMesh::InData; + +} // namespace + +template +inline const InputType* pointerAdd(InputType const* ptr, size_t index, size_t stride) noexcept { + return (InputType*) (((uint8_t const*) ptr) + (index * stride)); +} + +template +inline InputType* pointerAdd(InputType* ptr, size_t index, size_t stride) noexcept { + return (InputType*) (((uint8_t*) ptr) + (index * stride)); +} + +// Defines the actual implementation used to compute the TBN, where as TangentSpaceMesh::Algorithm +// is a hint that the client can provide. +enum class AlgorithmImpl : uint8_t { + INVALID = 0, + + MIKKTSPACE = 1, + LENGYEL = 2, + HUGHES_MOLLER = 3, + FRISVAD = 4, + + // Generating flat shading will remesh the input + FLAT_SHADING = 5, + TANGENTS_PROVIDED = 6, +}; + +enum class AttributeImpl : uint8_t { + UV1 = 0x0, + COLORS = 0x1, + JOINTS = 0x2, + WEIGHTS = 0x3, + NORMALS = 0x4, + UV0 = 0x5, + TANGENTS = 0x6, + POSITIONS = 0x7, + TANGENT_SPACE = 0x8, +}; + +#define DATA_TYPE_UV1 float2 +#define DATA_TYPE_COLORS float4 +#define DATA_TYPE_JOINTS ushort4 +#define DATA_TYPE_WEIGHTS float4 +#define DATA_TYPE_NORMALS float3 +#define DATA_TYPE_UV0 float2 +#define DATA_TYPE_TANGENTS float4 +#define DATA_TYPE_POSITIONS float3 +#define DATA_TYPE_TANGENT_SPACE quatf + +#define AUX_ATTRIBUTE_MATCH(attrib) static_assert((uint8_t) AuxAttribute::attrib == (uint8_t) AttributeImpl::attrib) + +// These enums are exposed in the public API, we need to make sure they match the internal enums. +AUX_ATTRIBUTE_MATCH(UV1); +AUX_ATTRIBUTE_MATCH(COLORS); +AUX_ATTRIBUTE_MATCH(JOINTS); +AUX_ATTRIBUTE_MATCH(WEIGHTS); + +#undef AUX_ATTRIBUTE_MATCH + +namespace { + +// Maps an attribute to an array and stride. +struct AttributeDataStride { + InData data; + size_t stride = 0; +}; + +template +class InternalArray { +public: + void borrow(T const* ptr, size_t stride=sizeof(T)) { + assert_invariant(mAllocated.empty()); + mBorrowed = ptr; + mBorrowedStride = stride; + } + + T* allocate(size_t size) { + assert_invariant(!mBorrowed); + mAllocated.resize(size); + mAllocated.shrink_to_fit(); + return mAllocated.data(); + } + + explicit operator bool() const noexcept { + return mBorrowed || !mAllocated.empty(); + } + + T const& operator [](int i) const { + if (mBorrowed) { + return *pointerAdd(mBorrowed, i, mBorrowedStride); + } + return mAllocated[i]; + } + + T& operator [](int i) { + if (mBorrowed) { + return *pointerAdd(mBorrowed, i, mBorrowedStride); + } + return mAllocated[i]; + } + +private: + std::vector mAllocated; + T const* mBorrowed = nullptr; + size_t mBorrowedStride = sizeof(T); +}; + +using ArrayType = std::variant, InternalArray, InternalArray, + InternalArray, InternalArray, InternalArray>; + +ArrayType toArray(AttributeImpl attribute) { + switch (attribute) { + case AttributeImpl::UV1: + return InternalArray{}; + case AttributeImpl::COLORS: + return InternalArray{}; + case AttributeImpl::JOINTS: + return InternalArray{}; + case AttributeImpl::WEIGHTS: + return InternalArray{}; + case AttributeImpl::NORMALS: + return InternalArray{}; + case AttributeImpl::UV0: + return InternalArray{}; + case AttributeImpl::TANGENTS: + return InternalArray{}; + case AttributeImpl::POSITIONS: + return InternalArray{}; + case AttributeImpl::TANGENT_SPACE: + return InternalArray{}; + } +} + +} // namespace + +struct TangentSpaceMeshInput { + using AttributeMap = std::unordered_map; + + size_t vertexCount = 0; + ushort3 const* triangles16 = nullptr; + uint3 const* triangles32 = nullptr; + + size_t triangleCount = 0; + + inline float3 const* positions() const { + return data(AttributeImpl::POSITIONS); + } + + inline size_t positionsStride() const { + return strideSafe(AttributeImpl::POSITIONS); + } + + inline float2 const* uvs() const { + return data(AttributeImpl::UV0); + } + + inline size_t uvsStride() const { + return strideSafe(AttributeImpl::UV0); + } + + inline float4 const* tangents() const { + return data(AttributeImpl::TANGENTS); + } + + inline size_t tangentsStride() const { + return strideSafe(AttributeImpl::TANGENTS); + } + + inline float3 const* normals() const { + return data(AttributeImpl::NORMALS); + } + + inline size_t normalsStride() const { + return strideSafe(AttributeImpl::NORMALS); + } + + static inline size_t attributeSize(AttributeImpl attribute) { + switch (attribute) { + case AttributeImpl::UV1: return sizeof(DATA_TYPE_UV1); + case AttributeImpl::COLORS: return sizeof(DATA_TYPE_COLORS); + case AttributeImpl::JOINTS: return sizeof(DATA_TYPE_JOINTS); + case AttributeImpl::WEIGHTS: return sizeof(DATA_TYPE_WEIGHTS); + case AttributeImpl::NORMALS: return sizeof(DATA_TYPE_NORMALS); + case AttributeImpl::UV0: return sizeof(DATA_TYPE_UV0); + case AttributeImpl::TANGENTS: return sizeof(DATA_TYPE_TANGENTS); + case AttributeImpl::POSITIONS: return sizeof(DATA_TYPE_POSITIONS); + case AttributeImpl::TANGENT_SPACE: + PANIC_POSTCONDITION("Invalid attribute found in input"); + } + } + + static inline bool isDataTypeCorrect(AttributeImpl attribute, InData indata) { + switch (attribute) { + case AttributeImpl::UV1: + return std::holds_alternative(indata); + case AttributeImpl::COLORS: + return std::holds_alternative(indata); + case AttributeImpl::JOINTS: + return std::holds_alternative(indata); + case AttributeImpl::WEIGHTS: + return std::holds_alternative(indata); + case AttributeImpl::NORMALS: + return std::holds_alternative(indata); + case AttributeImpl::UV0: + return std::holds_alternative(indata); + case AttributeImpl::TANGENTS: + return std::holds_alternative(indata); + case AttributeImpl::POSITIONS: + return std::holds_alternative(indata); + case AttributeImpl::TANGENT_SPACE: + PANIC_POSTCONDITION("Invalid attribute found in input"); + } + } + + inline size_t stride(AttributeImpl attribute) const { + auto res = attributeData.find(attribute); + assert_invariant(res != attributeData.end()); + return res->second.stride ? res->second.stride : attributeSize(attribute); + } + + template + inline size_t strideSafe(AttributeImpl attribute) const { + auto res = attributeData.find(attribute); + if (res == attributeData.end()) { + return sizeof(DataType); + + } + return res->second.stride ? res->second.stride : sizeof(DataType); + } + + uint8_t const* raw(AttributeImpl attribute) const { + switch (attribute) { + case AttributeImpl::UV1: + return (uint8_t const*) data(attribute); + case AttributeImpl::COLORS: + return (uint8_t const*) data(attribute); + case AttributeImpl::JOINTS: + return (uint8_t const*) data(attribute); + case AttributeImpl::WEIGHTS: + return (uint8_t const*) data(attribute); + case AttributeImpl::NORMALS: + return (uint8_t const*) data(attribute); + case AttributeImpl::UV0: + return (uint8_t const*) data(attribute); + case AttributeImpl::TANGENTS: + return (uint8_t const*) data(attribute); + case AttributeImpl::POSITIONS: + return (uint8_t const*) data(attribute); + case AttributeImpl::TANGENT_SPACE: + PANIC_POSTCONDITION("Invalid attribute found in input"); + } + } + + // Pass back the std::variant instead of the content. + InData data(AttributeImpl attribute) const { + auto res = attributeData.find(attribute); + assert_invariant(res != attributeData.end()); + return res->second.data; + } + + template + inline DataType const* data(AttributeImpl attribute) const { + auto res = attributeData.find(attribute); + if (res == attributeData.end()) { + return nullptr; + } + return std::get(res->second.data); + } + + inline std::vector getAuxAttributes() const { + std::vector ret; + for (auto [attrib, data]: attributeData) { + // TANGENT_SPACE is only used for output + assert_invariant(attrib != AttributeImpl::TANGENT_SPACE); + + if (attrib == AttributeImpl::POSITIONS || attrib == AttributeImpl::TANGENTS || + attrib == AttributeImpl::UV0 || attrib == AttributeImpl::NORMALS) { + continue; + } + ret.push_back(attrib); + } + return ret; + } + + AttributeMap attributeData; + + Algorithm algorithm; +}; + +struct TangentSpaceMeshOutput { + TangentSpaceMeshOutput() { + for (AttributeImpl attrib: + {AttributeImpl::TANGENT_SPACE, AttributeImpl::UV0, AttributeImpl::POSITIONS}) { + attributeData.emplace(std::make_pair(attrib, toArray(attrib))); + } + } + + InternalArray& tspace() { + return data(AttributeImpl::TANGENT_SPACE); + } + + InternalArray& uvs() { + return data(AttributeImpl::UV0); + } + + InternalArray& positions() { + return data(AttributeImpl::POSITIONS); + } + + template + InternalArray& data(AttributeImpl attrib) { + if (attributeData.find(attrib) == attributeData.end()) { + attributeData.emplace(std::make_pair(attrib, toArray(attrib))); + } + return std::get>(attributeData[attrib]); + } + + void passthrough(TangentSpaceMeshInput::AttributeMap const& inAttributeMap, + std::vector const& attributes) { + auto const borrow = [&inAttributeMap, this](AttributeImpl attrib) { + auto ref = inAttributeMap.find(attrib); + if (ref == inAttributeMap.end()) { + return; + } + InData const& indata = ref->second.data; + size_t const stride = ref->second.stride; + switch (attrib) { + case AttributeImpl::UV1: + data(attrib).borrow(std::get(indata), + stride); + break; + case AttributeImpl::COLORS: + data(attrib).borrow(std::get(indata), + stride); + break; + case AttributeImpl::JOINTS: + data(attrib).borrow(std::get(indata), + stride); + break; + case AttributeImpl::WEIGHTS: + data(attrib).borrow( + std::get(indata), stride); + break; + case AttributeImpl::NORMALS: + data(attrib).borrow( + std::get(indata), stride); + break; + case AttributeImpl::UV0: + data(attrib).borrow(std::get(indata), + stride); + break; + case AttributeImpl::TANGENTS: + data(attrib).borrow( + std::get(indata), stride); + break; + case AttributeImpl::POSITIONS: + data(attrib).borrow( + std::get(indata), stride); + break; + case AttributeImpl::TANGENT_SPACE: + PANIC_POSTCONDITION("Invalid attribute found in input"); + break; + } + }; + + for (AttributeImpl attrib: attributes) { + borrow(attrib); + } + } + + AlgorithmImpl algorithm; + + size_t triangleCount = 0; + size_t vertexCount = 0; + + InternalArray triangles32; + InternalArray triangles16; + + std::unordered_map attributeData; +}; + +}// namespace filament::geometry + +#endif//TNT_GEOMETRY_TANGENTSPACEMESHIMPL_H diff --git a/libs/geometry/tests/test_tangent_space_mesh.cpp b/libs/geometry/tests/test_tangent_space_mesh.cpp new file mode 100644 index 00000000000..c9c1e6e3c34 --- /dev/null +++ b/libs/geometry/tests/test_tangent_space_mesh.cpp @@ -0,0 +1,433 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include +#include + +#include + +#include + +#include + +class TangentSpaceMeshTest : public testing::Test {}; + +using namespace filament::geometry; +using namespace filament::math; + +namespace { +using AuxAttribute = TangentSpaceMesh::AuxAttribute; + +std::vector const CUBE_VERTS { + float3{0, 0, 0}, + float3{0, 0, 1}, + float3{0, 1, 0}, + float3{0, 1, 1}, + float3{1, 0, 0}, + float3{1, 0, 1}, + float3{1, 1, 0}, + float3{1, 1, 1} +}; + +std::vector const CUBE_UVS { + float2{0, 0}, + float2{0, 0}, + float2{1, 0}, + float2{1, 1}, + float2{0, 1}, + float2{0, 1}, + float2{1, 1}, + float2{0, 1} +}; + +// This is used to verify that attributes are properly mapped for remeshed methods. +std::vector const CUBE_COLORS { + float4{0, 0, 0, 1}, + float4{0, 0, 1, 1}, + float4{0, 1, 0, 1}, + float4{0, 1, 1, 1}, + float4{1, 0, 0, 1}, + float4{1, 0, 1, 1}, + float4{1, 1, 0, 1}, + float4{1, 1, 1, 1}, +}; + +float3 const CUBE_CENTER { .5, .5, .5 }; +std::vector const CUBE_NORMALS { + normalize(CUBE_VERTS[0] - CUBE_CENTER), + normalize(CUBE_VERTS[1] - CUBE_CENTER), + normalize(CUBE_VERTS[2] - CUBE_CENTER), + normalize(CUBE_VERTS[3] - CUBE_CENTER), + normalize(CUBE_VERTS[4] - CUBE_CENTER), + normalize(CUBE_VERTS[5] - CUBE_CENTER), + normalize(CUBE_VERTS[6] - CUBE_CENTER), + normalize(CUBE_VERTS[7] - CUBE_CENTER), +}; + +float3 const UP_VEC{1, 0, 0}; +std::vector const CUBE_TANGENTS { + float4{normalize(cross(CUBE_NORMALS[0], UP_VEC)), -1.0}, + float4{normalize(cross(CUBE_NORMALS[1], UP_VEC)), -1.0}, + float4{normalize(cross(CUBE_NORMALS[2], UP_VEC)), -1.0}, + float4{normalize(cross(CUBE_NORMALS[3], UP_VEC)), -1.0}, + float4{normalize(cross(CUBE_NORMALS[4], UP_VEC)), -1.0}, + float4{normalize(cross(CUBE_NORMALS[5], UP_VEC)), -1.0}, + float4{normalize(cross(CUBE_NORMALS[6], UP_VEC)), -1.0}, + float4{normalize(cross(CUBE_NORMALS[7], UP_VEC)), -1.0}, +}; + +std::vector const CUBE_TRIANGLES { + ushort3{0, 6, 4}, ushort3{0, 2, 6}, // XY-plane at z=0, normal=(0, 0, -1) + ushort3{4, 7, 5}, ushort3{4, 6, 7}, // YZ-plane at x=1, normal=(1, 0 , 0) + ushort3{2, 7, 6}, ushort3{2, 3, 7}, // XZ-plane at y=1, normal=(0, 1, 0) + ushort3{1, 2, 0}, ushort3{1, 3, 2}, // YZ-plane at x=0, normal=(-1, 0, 0) + ushort3{1, 4, 5}, ushort3{1, 0, 4}, // XZ-plane at y=0, normal=(0, -1, 0) + ushort3{1, 7, 3}, ushort3{1, 5, 7} // XY-plane at z=1, normal=(0, 0, 1) +}; + +// Corresponding to the faces in CUBE_TRIANGLES +std::vector const CUBE_FACE_NORMALS { + float3{0, 0, -1}, + float3{1, 0, 0}, + float3{0, 1, 0}, + float3{-1, 0, 0}, + float3{0, -1, 0}, + float3{0, 0, 1} +}; + +std::vector const TEST_NORMALS { + float3{1, 0, 0}, + float3{0, 1, 0}, + float3{0, 0, 1}, + normalize(float3{0, 1, 1}), + normalize(float3{1, 1, 0}), + normalize(float3{1, 1, 1}) +}; + +float3 const NORMAL_AXIS{0, 0, 1}; +float3 const TANGENT_AXIS{1, 0, 0}; +float3 const BITANGENT_AXIS{0, 1, 0}; + +#define ALMOST_EQUAL() \ + decltype(a) diff = a - b; \ + const size_t steps = sizeof(decltype(a)) / sizeof(float); \ + for (int i = 0; i < steps; ++i) { \ + if (abs(diff[i]) > std::numeric_limits::epsilon()) { return false; } \ + } \ + return true + +bool isAlmostEqual4(const float4& a, const float4& b) noexcept { ALMOST_EQUAL(); } +bool isAlmostEqual3(const float3& a, const float3& b) noexcept { ALMOST_EQUAL(); } +bool isAlmostEqual2(const float2& a, const float2& b) noexcept { ALMOST_EQUAL(); } + +#undef ALMOST_EQUAL + +} // anonymous namespace + +TEST_F(TangentSpaceMeshTest, BuilderDefaultAlgorithmsRemeshes) { + // Expect flat shading selected. + TangentSpaceMesh* mesh = TangentSpaceMesh::Builder() + .vertexCount(CUBE_VERTS.size()) + .positions(CUBE_VERTS.data()) + .triangleCount(CUBE_TRIANGLES.size()) + .triangles(CUBE_TRIANGLES.data()) + .build(); + EXPECT_TRUE(mesh->remeshed()); + TangentSpaceMesh::destroy(mesh); + + // Expect frisvad selected. + mesh = TangentSpaceMesh::Builder() + .vertexCount(1) + .normals(TEST_NORMALS.data()) + .build(); + EXPECT_FALSE(mesh->remeshed()); + TangentSpaceMesh::destroy(mesh); + + // Expect mikktspace selected. + mesh = TangentSpaceMesh::Builder() + .vertexCount(CUBE_VERTS.size()) + .positions(CUBE_VERTS.data()) + .uvs(CUBE_UVS.data()) + .normals(CUBE_NORMALS.data()) + .triangleCount(CUBE_TRIANGLES.size()) + .triangles(CUBE_TRIANGLES.data()) + .build(); + EXPECT_TRUE(mesh->remeshed()); + TangentSpaceMesh::destroy(mesh); +} + +// Remeshed vertices/uvs should map to input vertices/uvs +TEST_F(TangentSpaceMeshTest, FlatShadingRemesh) { + TangentSpaceMesh* mesh = TangentSpaceMesh::Builder() + .vertexCount(CUBE_VERTS.size()) + .positions(CUBE_VERTS.data()) + .triangleCount(CUBE_TRIANGLES.size()) + .triangles(CUBE_TRIANGLES.data()) + .uvs(CUBE_UVS.data()) + .aux(AuxAttribute::COLORS, CUBE_COLORS.data()) + .build(); + + // Number of triangles should remain the same + ASSERT_EQ(mesh->getTriangleCount(), CUBE_TRIANGLES.size()); + + std::vector outPositions(mesh->getVertexCount()); + mesh->getPositions(outPositions.data()); + + std::vector outUVs(mesh->getVertexCount()); + mesh->getUVs(outUVs.data()); + + std::vector outColors(mesh->getVertexCount()); + mesh->getAux(AuxAttribute::COLORS, outColors.data()); + + for (size_t i = 0; i < outPositions.size(); ++i) { + const auto& outPos = outPositions[i]; + const auto& outUV = outUVs[i]; + const auto& outColor = outColors[i]; + + bool found = false; + for (size_t j = 0; j < CUBE_VERTS.size(); ++j) { + const auto& inPos = CUBE_VERTS[j]; + const auto& inUV = CUBE_UVS[j]; + const auto& inColor = CUBE_COLORS[j]; + if (isAlmostEqual3(outPos, inPos)) { + found = true; + EXPECT_PRED2(isAlmostEqual2, outUV, inUV); + EXPECT_PRED2(isAlmostEqual4, outColor, inColor); + break; + } + } + EXPECT_TRUE(found); + } + TangentSpaceMesh::destroy(mesh); +} + +TEST_F(TangentSpaceMeshTest, FlatShading) { + TangentSpaceMesh* mesh = TangentSpaceMesh::Builder() + .vertexCount(CUBE_VERTS.size()) + .positions(CUBE_VERTS.data()) + .triangleCount(CUBE_TRIANGLES.size()) + .triangles(CUBE_TRIANGLES.data()) + .build(); + + ASSERT_EQ(mesh->getVertexCount(), CUBE_TRIANGLES.size() * 3); + ASSERT_EQ(mesh->getTriangleCount(), CUBE_TRIANGLES.size()); + + std::vector quats(mesh->getVertexCount()); + std::vector triangles(mesh->getTriangleCount()); + mesh->getTriangles(triangles.data()); + mesh->getQuats(quats.data()); + for (size_t i = 0; i < CUBE_TRIANGLES.size(); ++i) { + size_t faceInd = i / 2; + const float3& expectedNormal = CUBE_FACE_NORMALS[faceInd]; + for (int j = 0; j < 3; ++j) { + const quatf& quat = quats[triangles[i][j]]; + EXPECT_PRED2(isAlmostEqual3, quat * NORMAL_AXIS, expectedNormal); + } + } + TangentSpaceMesh::destroy(mesh); +} + +TEST_F(TangentSpaceMeshTest, TangentsProvided) { + TangentSpaceMesh* mesh = TangentSpaceMesh::Builder() + .vertexCount(CUBE_VERTS.size()) + .normals(CUBE_NORMALS.data()) + .tangents(CUBE_TANGENTS.data()) + .triangleCount(CUBE_TRIANGLES.size()) + .triangles(CUBE_TRIANGLES.data()) + .build(); + + ASSERT_EQ(mesh->getVertexCount(), CUBE_VERTS.size()); + ASSERT_EQ(mesh->getTriangleCount(), CUBE_TRIANGLES.size()); + + size_t const vertexCount = mesh->getVertexCount(); + std::vector quats(vertexCount); + mesh->getQuats(quats.data()); + for (size_t i = 0; i < vertexCount; ++i) { + float3 const n = quats[i] * NORMAL_AXIS; + EXPECT_PRED2(isAlmostEqual3, n, CUBE_NORMALS[i]); + } + TangentSpaceMesh::destroy(mesh); +} + +TEST_F(TangentSpaceMeshTest, Frisvad) { + TangentSpaceMesh* mesh = TangentSpaceMesh::Builder() + .vertexCount(TEST_NORMALS.size()) + .normals(TEST_NORMALS.data()) + .algorithm(TangentSpaceMesh::Algorithm::FRISVAD) + .build(); + + ASSERT_EQ(mesh->getVertexCount(), TEST_NORMALS.size()); + ASSERT_EQ(mesh->getTriangleCount(), 0); + + std::vector quats(mesh->getVertexCount()); + mesh->getQuats(quats.data()); + for (size_t i = 0; i < TEST_NORMALS.size(); ++i) { + const float3 n = quats[i] * NORMAL_AXIS; + EXPECT_PRED2(isAlmostEqual3, n, TEST_NORMALS[i]); + + const float3 b = quats[i] * BITANGENT_AXIS; + const float3 t = quats[i] * TANGENT_AXIS; + + EXPECT_LT(abs(dot(b, t)), std::numeric_limits::epsilon()); + EXPECT_LT(abs(dot(n, t)), std::numeric_limits::epsilon()); + EXPECT_LT(abs(dot(n, b)), std::numeric_limits::epsilon()); + EXPECT_PRED2(isAlmostEqual3, cross(n, t), b); + } + TangentSpaceMesh::destroy(mesh); +} + +TEST_F(TangentSpaceMeshTest, HughesMoller) { + TangentSpaceMesh* mesh = TangentSpaceMesh::Builder() + .vertexCount(TEST_NORMALS.size()) + .normals(TEST_NORMALS.data()) + .algorithm(TangentSpaceMesh::Algorithm::HUGHES_MOLLER) + .build(); + + ASSERT_EQ(mesh->getVertexCount(), TEST_NORMALS.size()); + ASSERT_EQ(mesh->getTriangleCount(), 0); + + std::vector quats(mesh->getVertexCount()); + mesh->getQuats(quats.data()); + for (size_t i = 0; i < TEST_NORMALS.size(); ++i) { + const float3 n = quats[i] * NORMAL_AXIS; + EXPECT_PRED2(isAlmostEqual3, n, TEST_NORMALS[i]); + + const float3 b = quats[i] * BITANGENT_AXIS; + const float3 t = quats[i] * TANGENT_AXIS; + + EXPECT_LT(abs(dot(b, t)), std::numeric_limits::epsilon()); + EXPECT_LT(abs(dot(n, t)), std::numeric_limits::epsilon()); + EXPECT_LT(abs(dot(n, b)), std::numeric_limits::epsilon()); + EXPECT_PRED2(isAlmostEqual3, cross(n, t), b); + } + TangentSpaceMesh::destroy(mesh); +} + +TEST_F(TangentSpaceMeshTest, MikktspaceRemesh) { + TangentSpaceMesh* mesh = TangentSpaceMesh::Builder() + .vertexCount(CUBE_VERTS.size()) + .normals(CUBE_NORMALS.data()) + .positions(CUBE_VERTS.data()) + .uvs(CUBE_UVS.data()) + .triangleCount(CUBE_TRIANGLES.size()) + .triangles(CUBE_TRIANGLES.data()) + .aux(AuxAttribute::COLORS, CUBE_COLORS.data()) + .algorithm(TangentSpaceMesh::Algorithm::MIKKTSPACE) + .build(); + + size_t const vertexCount = mesh->getVertexCount(); + + std::vector outPositions(vertexCount); + mesh->getPositions(outPositions.data()); + + std::vector outUVs(vertexCount); + mesh->getUVs(outUVs.data()); + + std::vector outColors(mesh->getVertexCount()); + mesh->getAux(AuxAttribute::COLORS, outColors.data()); + + for (size_t i = 0; i < outPositions.size(); ++i) { + auto const& outPos = outPositions[i]; + auto const& outUV = outUVs[i]; + auto const& outColor = outColors[i]; + + bool found = false; + for (size_t j = 0; j < CUBE_VERTS.size(); ++j) { + auto const& inPos = CUBE_VERTS[j]; + auto const& inUV = CUBE_UVS[j]; + auto const& inColor = CUBE_COLORS[j]; + if (isAlmostEqual3(outPos, inPos)) { + found = true; + EXPECT_PRED2(isAlmostEqual2, outUV, inUV); + EXPECT_PRED2(isAlmostEqual4, outColor, inColor); + break; + } + } + EXPECT_TRUE(found); + } + TangentSpaceMesh::destroy(mesh); +} + +TEST_F(TangentSpaceMeshTest, Mikktspace) { + // It's unclear why the dot product between n and b is greater epsilon, but since we don't + // control the implementation of mikktspace, we simply add a little slack to the test. + constexpr float MAGIC_SLACK = 1.00001; + TangentSpaceMesh* mesh = TangentSpaceMesh::Builder() + .vertexCount(CUBE_VERTS.size()) + .normals(CUBE_NORMALS.data()) + .positions(CUBE_VERTS.data()) + .uvs(CUBE_UVS.data()) + .triangleCount(CUBE_TRIANGLES.size()) + .triangles(CUBE_TRIANGLES.data()) + .algorithm(TangentSpaceMesh::Algorithm::MIKKTSPACE) + .build(); + + size_t const vertexCount = mesh->getVertexCount(); + std::vector quats(vertexCount); + mesh->getQuats(quats.data()); + for (size_t i = 0; i < vertexCount; ++i) { + float3 const n = quats[i] * NORMAL_AXIS; + float3 const b = quats[i] * BITANGENT_AXIS; + float3 const t = quats[i] * TANGENT_AXIS; + + EXPECT_LT(abs(dot(b, t)), std::numeric_limits::epsilon()); + EXPECT_LT(abs(dot(n, t)), std::numeric_limits::epsilon()); + EXPECT_LT(abs(dot(n, b)), std::numeric_limits::epsilon() * MAGIC_SLACK); + EXPECT_PRED2(isAlmostEqual3, cross(n, t), b); + } + TangentSpaceMesh::destroy(mesh); +} + +TEST_F(TangentSpaceMeshTest, Lengyel) { + TangentSpaceMesh* mesh = TangentSpaceMesh::Builder() + .vertexCount(CUBE_VERTS.size()) + .normals(CUBE_NORMALS.data()) + .positions(CUBE_VERTS.data()) + .uvs(CUBE_UVS.data()) + .triangleCount(CUBE_TRIANGLES.size()) + .triangles(CUBE_TRIANGLES.data()) + .algorithm(TangentSpaceMesh::Algorithm::LENGYEL) + .build(); + + size_t const vertexCount = mesh->getVertexCount(); + std::vector quats(vertexCount); + mesh->getQuats(quats.data()); + + ASSERT_EQ(mesh->getTriangleCount(), CUBE_TRIANGLES.size()); + std::vector triangles(mesh->getTriangleCount()); + mesh->getTriangles(triangles.data()); + + for (size_t i = 0; i < vertexCount; ++i) { + float3 const n = quats[i] * NORMAL_AXIS; + EXPECT_PRED2(isAlmostEqual3, n, CUBE_NORMALS[i]); + + float3 const b = quats[i] * BITANGENT_AXIS; + float3 const t = quats[i] * TANGENT_AXIS; + + EXPECT_LT(abs(dot(b, t)), std::numeric_limits::epsilon()); + EXPECT_LT(abs(dot(n, t)), std::numeric_limits::epsilon()); + EXPECT_LT(abs(dot(n, b)), std::numeric_limits::epsilon()); + EXPECT_PRED2(isAlmostEqual3, cross(n, t), b); + } + TangentSpaceMesh::destroy(mesh); +} + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/libs/gltfio/CMakeLists.txt b/libs/gltfio/CMakeLists.txt index 70a790e4652..373df1f8a69 100644 --- a/libs/gltfio/CMakeLists.txt +++ b/libs/gltfio/CMakeLists.txt @@ -4,6 +4,8 @@ project(gltfio C ASM) set(TARGET gltfio) set(PUBLIC_HDR_DIR include) +set(ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../..) + # ================================================================================================== # Sources and headers # ================================================================================================== @@ -14,6 +16,7 @@ set(PUBLIC_HDRS include/gltfio/FilamentInstance.h include/gltfio/MaterialProvider.h include/gltfio/NodeManager.h + include/gltfio/TrsTransformManager.h include/gltfio/ResourceLoader.h include/gltfio/TextureProvider.h include/gltfio/math.h @@ -33,18 +36,30 @@ set(SRCS src/FilamentAsset.cpp src/FilamentInstance.cpp src/FNodeManager.h + src/FTrsTransformManager.h src/GltfEnums.h src/Ktx2Provider.cpp src/MaterialProvider.cpp src/NodeManager.cpp + src/TrsTransformManager.cpp src/ResourceLoader.cpp src/StbProvider.cpp src/TangentsJob.cpp src/TangentsJob.h src/UbershaderProvider.cpp + src/Utility.cpp + src/Utility.h src/Wireframe.cpp src/Wireframe.h src/downcast.h + src/extended/AssetLoaderExtended.cpp + src/extended/AssetLoaderExtended.h + src/extended/ResourceLoaderExtended.cpp + src/extended/ResourceLoaderExtended.h + src/extended/TangentsJobExtended.cpp + src/extended/TangentsJobExtended.h + src/extended/TangentSpaceMeshWrapper.cpp + src/extended/TangentSpaceMeshWrapper.h ) # ================================================================================================== @@ -62,6 +77,13 @@ set(TRANSPARENCY default) set(UBERZ_OUTPUT_PATH "${RESOURCE_DIR}/default.uberz") +set (MATC_FLAGS ${MATC_BASE_FLAGS}) +if (FILAMENT_SAMPLES_STEREO_TYPE STREQUAL "instanced") + set (MATC_FLAGS ${MATC_FLAGS} -PstereoscopicType=instanced) +elseif (FILAMENT_SAMPLES_STEREO_TYPE STREQUAL "multiview") + set (MATC_FLAGS ${MATC_FLAGS} -PstereoscopicType=multiview) +endif () + function(build_ubershader NAME SRC SHADINGMODEL BLENDING) set(DEST "${RESOURCE_DIR}/${NAME}") configure_file(materials/${SRC}.mat.in "${DEST}.mat" COPYONLY) @@ -78,7 +100,7 @@ function(build_ubershader NAME SRC SHADINGMODEL BLENDING) add_custom_command( OUTPUT "${NAME}.filamat" - COMMAND matc ${MATC_BASE_FLAGS} ${TEMPLATE_ARGS} -o "${NAME}.filamat" "${NAME}.mat" + COMMAND matc ${MATC_FLAGS} ${TEMPLATE_ARGS} -o "${NAME}.filamat" "${NAME}.mat" DEPENDS matc "${DEST}.mat" WORKING_DIRECTORY ${RESOURCE_DIR} COMMENT "Compiling material ${NAME}") @@ -118,9 +140,16 @@ build_ubershader(specularGlossiness_masked base specularGlossiness ma build_ubershader(unlit_fade base unlit fade) build_ubershader(unlit_opaque base unlit opaque) build_ubershader(unlit_masked base unlit masked) -build_ubershader(volume volume _ _) -build_ubershader(transmission transmission _ _) +build_ubershader(transmission_opaque transmission lit opaque) +build_ubershader(transmission_fade transmission lit fade) +build_ubershader(transmission_masked transmission lit masked) +build_ubershader(volume_opaque volume lit opaque) +build_ubershader(volume_fade volume lit fade) +build_ubershader(volume_masked volume lit masked) build_ubershader(sheen sheen _ _) +build_ubershader(specular_opaque specular lit opaque) +build_ubershader(specular_fade specular lit fade) +build_ubershader(specular_masked specular lit masked) add_custom_target(uberz_file DEPENDS ${UBERZ_OUTPUT_PATH}) set_target_properties(uberz_file PROPERTIES FOLDER Libs) @@ -153,7 +182,7 @@ set_target_properties(uberarchive PROPERTIES FOLDER Libs) # ================================================================================================== include_directories(${PUBLIC_HDR_DIR} ${RESOURCE_DIR}) -link_libraries(math utils filament cgltf stb ktxreader geometry tsl trie uberzlib) +link_libraries(math utils filament cgltf stb ktxreader geometry tsl uberzlib) add_library(gltfio_core STATIC ${PUBLIC_HDRS} ${SRCS}) @@ -167,6 +196,16 @@ if (WEBGL_PTHREADS) target_compile_definitions(gltfio_core PUBLIC -DFILAMENT_WASM_THREADS) endif() +set(GLTFIO_WARNINGS -Wall -Werror) +if (CMAKE_CXX_STANDARD EQUAL 20) + # The following things used by AssetLoader.cpp are deprecated in c++20: + # wstring_convert and std::codecvt_utf8. + list(APPEND GLTFIO_WARNINGS -Wno-deprecated-declarations) +endif() +if (NOT MSVC) + target_compile_options(gltfio_core PRIVATE ${GLTFIO_WARNINGS}) +endif() + if (NOT WEBGL AND NOT ANDROID AND NOT IOS) # ================================================================================================== @@ -176,14 +215,7 @@ if (NOT WEBGL AND NOT ANDROID AND NOT IOS) target_link_libraries(${TARGET} PUBLIC filamat gltfio_core) target_include_directories(${TARGET} PUBLIC ${PUBLIC_HDR_DIR}) set_target_properties(${TARGET} PROPERTIES FOLDER Libs) - - # ================================================================================================== - # Compiler flags - # ================================================================================================== - if (MSVC) - target_compile_options(${TARGET} PRIVATE $<$:/fp:fast>) - else() - target_compile_options(${TARGET} PRIVATE $<$:-ffast-math>) + if (NOT MSVC) target_compile_options(${TARGET} PRIVATE -Wno-deprecated-register) endif() @@ -191,6 +223,43 @@ if (NOT WEBGL AND NOT ANDROID AND NOT IOS) endif() +# ================================================================================================== +# Tests +# ================================================================================================== + +set(GLTF_TEST_FILES) +function(add_test_gltf SOURCE TARGET) + set(source_path "${ROOT_DIR}/${SOURCE}") + set(target_path "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}") + add_custom_command( + OUTPUT ${target_path} + DEPENDS ${source_path} + COMMAND ${CMAKE_COMMAND} -E copy ${source_path} ${target_path} + ) + list(APPEND GLTF_TEST_FILES "${target_path}") + set(GLTF_TEST_FILES ${GLTF_TEST_FILES} PARENT_SCOPE) +endfunction() + +add_test_gltf("third_party/models/AnimatedMorphCube/AnimatedMorphCube.glb" "AnimatedMorphCube.glb") + +add_custom_target(test_gltfio_files DEPENDS ${GLTF_TEST_FILES}) + +# The following tests rely on private APIs that are stripped +# away in Release builds +if (TNT_DEV AND NOT WEBGL AND NOT ANDROID AND NOT IOS) + set(TEST_TARGET test_gltfio) + + add_executable(${TEST_TARGET} test/gltfio_test.cpp) + add_dependencies(${TEST_TARGET} test_gltfio_files) + set_property(TARGET test_gltfio PROPERTY LINK_LIBRARIES) + + target_link_libraries(${TEST_TARGET} PRIVATE ${TARGET} gtest uberarchive) + if (NOT MSVC) + target_compile_options(${TEST_TARGET} PRIVATE ${GLTFIO_WARNINGS}) + endif() + set_target_properties(${TEST_TARGET} PROPERTIES FOLDER Tests) +endif() + # ================================================================================================== # Installation # ================================================================================================== diff --git a/libs/gltfio/include/gltfio/AssetLoader.h b/libs/gltfio/include/gltfio/AssetLoader.h index c031850f3b6..bf650f69477 100644 --- a/libs/gltfio/include/gltfio/AssetLoader.h +++ b/libs/gltfio/include/gltfio/AssetLoader.h @@ -38,6 +38,23 @@ namespace filament::gltfio { class NodeManager; +// Use this struct to enable mikktspace-based tangent-space computation. +/** + * \struct AssetConfigurationExtended AssetLoader.h gltfio/AssetLoader.h + * \brief extends struct AssetConfiguration + * Useful if client needs mikktspace tangent space computation. + * NOTE: Android, iOS, Web are not supported. And only disk-local glTF resources are supported. + */ +struct AssetConfigurationExtended { + //! Optional The same parameter as provided to \struct ResourceConfiguration ResourceLoader.h + //! gltfio/ResourceLoader.h + char const* gltfPath; + + //! Client can use this method to check if the extended implementation is supported on their + //! platform or not. + static bool isSupported(); +}; + /** * \struct AssetConfiguration AssetLoader.h gltfio/AssetLoader.h * \brief Construction parameters for AssetLoader. @@ -62,6 +79,10 @@ struct AssetConfiguration { //! Optional default node name for anonymous nodes char* defaultNodeName = nullptr; + + //! Optional to enable mikktspace tangents. Lifetime of struct only needs to be maintained for + // the duration of the constructor of AssetLoader. + AssetConfigurationExtended* ext = nullptr; }; /** @@ -97,8 +118,8 @@ struct AssetConfiguration { * * // Load buffers and textures from disk. * ResourceLoader resourceLoader({engine, ".", true}); - * resourceLoader.addTextureProvider("image/png", decoder) - * resourceLoader.addTextureProvider("image/jpeg", decoder) + * resourceLoader.addTextureProvider("image/png", decoder); + * resourceLoader.addTextureProvider("image/jpeg", decoder); * resourceLoader.loadResources(asset); * * // Free the glTF hierarchy as it is no longer needed. @@ -197,7 +218,7 @@ class UTILS_PUBLIC AssetLoader { * This cannot be called after FilamentAsset::releaseSourceData(). * See also AssetLoader::createInstancedAsset(). */ - FilamentInstance* createInstance(FilamentAsset* primary); + FilamentInstance* createInstance(FilamentAsset* asset); /** * Allows clients to enable diagnostic shading on newly-loaded assets. diff --git a/libs/gltfio/include/gltfio/MaterialProvider.h b/libs/gltfio/include/gltfio/MaterialProvider.h index f62d667b359..042f303bb6f 100644 --- a/libs/gltfio/include/gltfio/MaterialProvider.h +++ b/libs/gltfio/include/gltfio/MaterialProvider.h @@ -93,10 +93,17 @@ struct alignas(4) MaterialKey { bool hasSheen : 1; bool hasIOR : 1; bool hasVolume : 1; - uint8_t padding : 5; + bool hasSpecular : 1; + bool hasSpecularTexture : 1; + bool hasSpecularColorTexture : 1; + bool padding : 2; + // -- 32 bit boundary -- + uint8_t specularTextureUV; + uint8_t specularColorTextureUV; + uint16_t padding2; }; -static_assert(sizeof(MaterialKey) == 16, "MaterialKey has unexpected size."); +static_assert(sizeof(MaterialKey) == 20, "MaterialKey has unexpected size."); UTILS_WARNING_POP diff --git a/libs/gltfio/include/gltfio/ResourceLoader.h b/libs/gltfio/include/gltfio/ResourceLoader.h index ab0a6f10fa2..d222871bd7e 100644 --- a/libs/gltfio/include/gltfio/ResourceLoader.h +++ b/libs/gltfio/include/gltfio/ResourceLoader.h @@ -69,9 +69,12 @@ class UTILS_PUBLIC ResourceLoader { public: using BufferDescriptor = filament::backend::BufferDescriptor; - ResourceLoader(const ResourceConfiguration& config); + explicit ResourceLoader(const ResourceConfiguration& config); ~ResourceLoader(); + + void setConfiguration(const ResourceConfiguration& config); + /** * Feeds the binary content of an external resource into the loader's URI cache. * @@ -90,7 +93,8 @@ class UTILS_PUBLIC ResourceLoader { /** * Register a plugin that can consume PNG / JPEG content and produce filament::Texture objects. * - * Destruction of the given provider is the client's responsibility. + * Destruction of the given provider is the client's responsibility and must be done after the + * destruction of this ResourceLoader. */ void addTextureProvider(const char* mimeType, TextureProvider* provider); @@ -153,8 +157,6 @@ class UTILS_PUBLIC ResourceLoader { private: bool loadResources(FFilamentAsset* asset, bool async); - void normalizeSkinningWeights(FFilamentAsset* asset) const; - AssetPool* mPool; struct Impl; Impl* pImpl; }; diff --git a/libs/gltfio/include/gltfio/TrsTransformManager.h b/libs/gltfio/include/gltfio/TrsTransformManager.h new file mode 100644 index 00000000000..980457b7c8c --- /dev/null +++ b/libs/gltfio/include/gltfio/TrsTransformManager.h @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef GLTFIO_TRSTRANSFORMMANAGER_H +#define GLTFIO_TRSTRANSFORMMANAGER_H + +#include + +#include +#include +#include +#include +#include + +using namespace filament::math; + +namespace utils { +class Entity; +} // namespace utils + +namespace filament::gltfio { + +class FTrsTransformManager; + +/** + * TrsTransformManager is used to add entities with glTF-specific trs information. + * + * Trs information here just used for Animation, DON'T use for transform. + */ +class UTILS_PUBLIC TrsTransformManager { +public: + using Instance = utils::EntityInstance; + using Entity = utils::Entity; + + /** + * Returns whether a particular Entity is associated with a component of this TrsTransformManager + * @param e An Entity. + * @return true if this Entity has a component associated with this manager. + */ + bool hasComponent(Entity e) const noexcept; + + /** + * Gets an Instance representing the trs transform component associated with the given Entity. + * @param e An Entity. + * @return An Instance object, which represents the trs transform component associated with the Entity e. + * @note Use Instance::isValid() to make sure the component exists. + * @see hasComponent() + */ + Instance getInstance(Entity e) const noexcept; + + /** + * Creates a trs transform component and associates it with the given entity. + * @param entity An Entity to associate a trs transform component with. + * @param translation The translation to initialize the trs transform component with. + * @param rotation The rotation to initialize the trs transform component with. + * @param scale The scale to initialize the trs transform component with. + * + * If this component already exists on the given entity, it is first destroyed as if + * destroy(Entity e) was called. + * + * @see destroy() + */ + void create(Entity entity); + void create(Entity entity, const float3& translation, const quatf& rotation, + const float3& scale); //!< \overload + + /** + * Destroys this component from the given entity. + * @param e An entity. + * + * @see create() + */ + void destroy(Entity e) noexcept; + + void setTranslation(Instance ci, const float3& translation) noexcept; + const float3& getTranslation(Instance ci) const noexcept; + + void setRotation(Instance ci, const quatf& rotation) noexcept; + const quatf& getRotation(Instance ci) const noexcept; + + void setScale(Instance ci, const float3& scale) noexcept; + const float3& getScale(Instance ci) const noexcept; + + void setTrs(Instance ci, const float3& translation, const quatf& rotation, + const float3& scale) noexcept; + const mat4f getTransform(Instance ci) const noexcept; + +protected: + TrsTransformManager() noexcept = default; + ~TrsTransformManager() = default; + +public: + TrsTransformManager(TrsTransformManager const&) = delete; + TrsTransformManager(TrsTransformManager&&) = delete; + TrsTransformManager& operator=(TrsTransformManager const&) = delete; + TrsTransformManager& operator=(TrsTransformManager&&) = delete; +}; + +} // namespace filament::gltfio + +#endif // GLTFIO_TRSTRANSFORMMANAGER_H diff --git a/libs/gltfio/materials/base.spec.in b/libs/gltfio/materials/base.spec.in index 6e6e9375f52..f80236f5a1a 100644 --- a/libs/gltfio/materials/base.spec.in +++ b/libs/gltfio/materials/base.spec.in @@ -30,3 +30,8 @@ TransmissionTexture = unsupported # Volume Features Volume = unsupported VolumeThicknessTexture = unsupported + +# Specular Features +Specular = unsupported +SpecularTexture = unsupported +SpecularColorTexture = unsupported diff --git a/libs/gltfio/materials/sheen.mat.in b/libs/gltfio/materials/sheen.mat.in index b8682ca34fc..6ac496c96d8 100644 --- a/libs/gltfio/materials/sheen.mat.in +++ b/libs/gltfio/materials/sheen.mat.in @@ -55,7 +55,16 @@ material { { type : mat3, name : sheenRoughnessUvMatrix, precision: high }, // Reflectance - { type : float, name : reflectance } + { type : float, name : reflectance }, + + // KHR_materials_specular + { type : float, name : specularStrength }, + { type : float3, name : specularColorFactor }, + { type : int, name : specularIndex }, + { type : sampler2d, name : specularMap }, + { type : mat3, name : specularUvMatrix, precision: high }, + { type : int, name : specularColorIndex }, + { type : mat3, name : specularColorUvMatrix, precision: high } ${CUSTOM_PARAMS} ], @@ -136,6 +145,15 @@ fragment { material.emissive.rgb *= texture(materialParams_emissiveMap, uv).rgb; } + material.specularFactor = materialParams.specularStrength; + material.specularColorFactor = materialParams.specularColorFactor; + + if (materialParams.specularIndex > -1) { + highp float2 uv = uvs[materialParams.specularIndex]; + uv = (vec3(uv, 1.0) * materialParams.specularUvMatrix).xy; + material.specularFactor *= texture(materialParams_specularMap, uv).a; + } + ${CUSTOM_FRAGMENT} } } diff --git a/libs/gltfio/materials/sheen.spec.in b/libs/gltfio/materials/sheen.spec.in index dcd41bf25cd..6c72f0b3f95 100644 --- a/libs/gltfio/materials/sheen.spec.in +++ b/libs/gltfio/materials/sheen.spec.in @@ -17,3 +17,8 @@ TextureTransforms=optional Sheen=optional SheenColorTexture=optional SheenRoughnessTexture=optional + +# KHR_material_specular Features +Specular=optional +SpecularTexture=optional +SpecularColorTexture=unsupported diff --git a/libs/gltfio/materials/specular.mat.in b/libs/gltfio/materials/specular.mat.in new file mode 100644 index 00000000000..acb4f2dbd72 --- /dev/null +++ b/libs/gltfio/materials/specular.mat.in @@ -0,0 +1,168 @@ +material { + name : specular_ubershader, + requires : [ uv0, uv1, color ], + shadingModel : lit, + blending : ${BLENDING}, + doubleSided : ${DOUBLESIDED}, + transparency : ${TRANSPARENCY}, + flipUV : false, + specularAmbientOcclusion : simple, + specularAntiAliasing : true, + clearCoatIorChange : false, + reflections: screenspace, + parameters : [ + + // Base Color + { type : int, name : baseColorIndex }, + { type : float4, name : baseColorFactor }, + { type : sampler2d, name : baseColorMap }, + { type : mat3, name : baseColorUvMatrix, precision: high }, + + // Metallic-Roughness Map + { type : int, name : metallicRoughnessIndex }, + { type : float, name : metallicFactor }, + { type : float, name : roughnessFactor }, + { type : sampler2d, name : metallicRoughnessMap }, + { type : mat3, name : metallicRoughnessUvMatrix, precision: high }, + + // Normal Map + { type : int, name : normalIndex }, + { type : float, name : normalScale }, + { type : sampler2d, name : normalMap }, + { type : mat3, name : normalUvMatrix, precision: high }, + + // Ambient Occlusion + { type : int, name : aoIndex }, + { type : float, name : aoStrength }, + { type : sampler2d, name : occlusionMap }, + { type : mat3, name : occlusionUvMatrix, precision: high }, + + // Emissive Map + { type : int, name : emissiveIndex }, + { type : float3, name : emissiveFactor }, + { type : float, name : emissiveStrength }, + { type : sampler2d, name : emissiveMap }, + { type : mat3, name : emissiveUvMatrix, precision: high }, + + // Clear coat, we drop texture support for clear coat due to 8 texture limits. + { type : float, name : clearCoatFactor }, + { type : float, name : clearCoatRoughnessFactor }, + { type : int, name : clearCoatIndex }, + { type : sampler2d, name : clearCoatMap }, + { type : mat3, name : clearCoatUvMatrix, precision: high }, + { type : int, name : clearCoatRoughnessIndex }, + { type : mat3, name : clearCoatRoughnessUvMatrix, precision: high }, + { type : int, name : clearCoatNormalIndex }, + { type : mat3, name : clearCoatNormalUvMatrix, precision: high }, + { type : float, name : clearCoatNormalScale }, + + // KHR_materials_specular + { type : float, name : specularStrength }, + { type : float3, name : specularColorFactor }, + { type : int, name : specularIndex }, + { type : sampler2d, name : specularMap }, + { type : mat3, name : specularUvMatrix, precision: high }, + { type : int, name : specularColorIndex }, + { type : sampler2d, name : specularColorMap }, + { type : mat3, name : specularColorUvMatrix, precision: high }, + + // IOR + { type : float, name : ior } + + ${CUSTOM_PARAMS} + ], +} + +vertex { +void materialVertex(inout MaterialVertexInputs material) { + ${CUSTOM_VERTEX} +} +} + +fragment { +void material(inout MaterialInputs material) { + highp float2 uvs[2]; + uvs[0] = getUV0(); + uvs[1] = getUV1(); + + if (materialParams.normalIndex > -1) { + highp float2 uv = uvs[materialParams.normalIndex]; + uv = (vec3(uv, 1.0) * materialParams.normalUvMatrix).xy; + material.normal = texture(materialParams_normalMap, uv).xyz * 2.0 - 1.0; + material.normal.xy *= materialParams.normalScale; + } + + prepareMaterial(material); + material.baseColor = materialParams.baseColorFactor; + + if (materialParams.baseColorIndex > -1) { + highp float2 uv = uvs[materialParams.baseColorIndex]; + uv = (vec3(uv, 1.0) * materialParams.baseColorUvMatrix).xy; + material.baseColor *= texture(materialParams_baseColorMap, uv); + } + +#if defined(BLEND_MODE_TRANSPARENT) + material.baseColor.rgb *= material.baseColor.a; +#endif + + material.baseColor *= getColor(); + + material.roughness = materialParams.roughnessFactor; + material.metallic = materialParams.metallicFactor; + material.ior = materialParams.ior; + + material.emissive = vec4(materialParams.emissiveStrength * + materialParams.emissiveFactor.rgb, 0.0); + + // KHR_materials_clearcoat forbids clear coat from + // being applied in the specular/glossiness model + material.clearCoat = materialParams.clearCoatFactor; + material.clearCoatRoughness = materialParams.clearCoatRoughnessFactor; + + if (materialParams.clearCoatIndex > -1) { + highp float2 uv = uvs[materialParams.clearCoatIndex]; + uv = (vec3(uv, 1.0) * materialParams.clearCoatUvMatrix).xy; + material.clearCoat *= texture(materialParams_clearCoatMap, uv).r; + } + + material.specularFactor = materialParams.specularStrength; + material.specularColorFactor = materialParams.specularColorFactor; + + if (materialParams.specularIndex > -1) { + highp float2 uv = uvs[materialParams.specularIndex]; + uv = (vec3(uv, 1.0) * materialParams.specularUvMatrix).xy; + material.specularFactor *= texture(materialParams_specularMap, uv).a; + } + + if (materialParams.specularColorIndex > -1) { + highp float2 uv = uvs[materialParams.specularColorIndex]; + uv = (vec3(uv, 1.0) * materialParams.specularColorUvMatrix).xy; + vec4 sc = texture(materialParams_specularColorMap, uv); + material.specularColorFactor.r *= sc.r; + material.specularColorFactor.g *= sc.g; + material.specularColorFactor.b *= sc.b; + } + + if (materialParams.metallicRoughnessIndex > -1) { + highp float2 uv = uvs[materialParams.metallicRoughnessIndex]; + uv = (vec3(uv, 1.0) * materialParams.metallicRoughnessUvMatrix).xy; + vec4 mr = texture(materialParams_metallicRoughnessMap, uv); + material.roughness *= mr.g; + material.metallic *= mr.b; + } + + if (materialParams.aoIndex > -1) { + highp float2 uv = uvs[materialParams.aoIndex]; + uv = (vec3(uv, 1.0) * materialParams.occlusionUvMatrix).xy; + float occlusion = texture(materialParams_occlusionMap, uv).r; + material.ambientOcclusion = 1.0 + materialParams.aoStrength * (occlusion - 1.0); + } + if (materialParams.emissiveIndex > -1) { + highp float2 uv = uvs[materialParams.emissiveIndex]; + uv = (vec3(uv, 1.0) * materialParams.emissiveUvMatrix).xy; + material.emissive.rgb *= texture(materialParams_emissiveMap, uv).rgb; + } + + ${CUSTOM_FRAGMENT} +} +} diff --git a/libs/gltfio/materials/specular.spec.in b/libs/gltfio/materials/specular.spec.in new file mode 100644 index 00000000000..1b381ee8b52 --- /dev/null +++ b/libs/gltfio/materials/specular.spec.in @@ -0,0 +1,35 @@ +ShadingModel=lit + +# Required Aspects +BlendingMode = ${BLENDING} + +VertexColors = optional +BaseColorTexture = optional +NormalTexture = optional +OcclusionTexture = optional +EmissiveTexture = optional +MetallicRoughnessTexture = optional +TextureTransforms = optional + +# KHR_materials_specular Features +Specular = optional +SpecularTexture = optional +SpecularColorTexture = optional + +# ClearCoat Features +ClearCoat = optional +ClearCoatTexture = optional + +# Sheen Features +Sheen = unsupported +SheenColorTexture = unsupported +SheenRoughnessTexture = unsupported + +# Transmission and IOR Features +Transmission = unsupported +Ior = optional +TransmissionTexture = unsupported + +# Volume Features +Volume = unsupported +VolumeThicknessTexture = unsupported diff --git a/libs/gltfio/materials/transmission.mat.in b/libs/gltfio/materials/transmission.mat.in index 3b1cd2283f6..608b8576f2b 100644 --- a/libs/gltfio/materials/transmission.mat.in +++ b/libs/gltfio/materials/transmission.mat.in @@ -2,9 +2,9 @@ material { name : transmission_ubershader, requires : [ uv0, uv1, color ], shadingModel : lit, - blending : masked, - doubleSided : false, - transparency : default, + blending : ${BLENDING}, + doubleSided : ${DOUBLESIDED}, + transparency : ${TRANSPARENCY}, flipUV : false, specularAmbientOcclusion : simple, specularAntiAliasing : true, @@ -52,7 +52,18 @@ material { { type : mat3, name : transmissionUvMatrix, precision: high }, // IOR - { type : float, name : ior } + { type : float, name : ior }, + + // KHR_materials_specular + { type : float, name : specularStrength }, + { type : float3, name : specularColorFactor }, + { type : int, name : specularIndex }, + { type : sampler2d, name : specularMap }, + { type : mat3, name : specularUvMatrix, precision: high }, + { type : int, name : specularColorIndex }, + { type : sampler2d, name : specularColorMap }, + { type : mat3, name : specularColorUvMatrix, precision: high } + ${CUSTOM_PARAMS} ], @@ -126,6 +137,24 @@ fragment { material.emissive.rgb *= texture(materialParams_emissiveMap, uv).rgb; } + material.specularFactor = materialParams.specularStrength; + material.specularColorFactor = materialParams.specularColorFactor; + + if (materialParams.specularIndex > -1) { + highp float2 uv = uvs[materialParams.specularIndex]; + uv = (vec3(uv, 1.0) * materialParams.specularUvMatrix).xy; + material.specularFactor *= texture(materialParams_specularMap, uv).a; + } + + if (materialParams.specularColorIndex > -1) { + highp float2 uv = uvs[materialParams.specularColorIndex]; + uv = (vec3(uv, 1.0) * materialParams.specularColorUvMatrix).xy; + vec4 sc = texture(materialParams_specularColorMap, uv); + material.specularColorFactor.r *= sc.r; + material.specularColorFactor.g *= sc.g; + material.specularColorFactor.b *= sc.b; + } + ${CUSTOM_FRAGMENT} } } diff --git a/libs/gltfio/materials/transmission.spec.in b/libs/gltfio/materials/transmission.spec.in index 9c1062631f0..ff0c3648138 100644 --- a/libs/gltfio/materials/transmission.spec.in +++ b/libs/gltfio/materials/transmission.spec.in @@ -1,9 +1,7 @@ ShadingModel=lit -# Even though the transmission material actually has its -# blend mode set to "masked", we want the glTF loader to -# think that it is "opaque". -BlendingMode=opaque +# Required Aspects +BlendingMode = ${BLENDING} Sheen=unsupported Volume=unsupported @@ -17,6 +15,11 @@ EmissiveTexture=optional MetallicRoughnessTexture=optional TextureTransforms=optional +# KHR_materials_specular Features +Specular=optional +SpecularTexture=optional +SpecularColorTexture=optional + Transmission=optional Ior=optional TransmissionTexture=optional diff --git a/libs/gltfio/materials/volume.mat.in b/libs/gltfio/materials/volume.mat.in index 2f02f70530e..d7470bb2570 100644 --- a/libs/gltfio/materials/volume.mat.in +++ b/libs/gltfio/materials/volume.mat.in @@ -2,9 +2,9 @@ material { name : volume_ubershader, requires : [ uv0, uv1, color ], shadingModel : lit, - blending : masked, - doubleSided : false, - transparency : default, + blending : ${BLENDING}, + doubleSided : ${DOUBLESIDED}, + transparency : ${TRANSPARENCY}, flipUV : false, specularAmbientOcclusion : simple, specularAntiAliasing : true, @@ -58,6 +58,15 @@ material { { type : sampler2d, name : volumeThicknessMap }, { type : mat3, name : volumeThicknessUvMatrix, precision: high }, + // KHR_materials_specular + { type : float, name : specularStrength }, + { type : float3, name : specularColorFactor }, + { type : int, name : specularIndex }, + { type : sampler2d, name : specularMap }, + { type : mat3, name : specularUvMatrix, precision: high }, + { type : int, name : specularColorIndex }, + { type : mat3, name : specularColorUvMatrix, precision: high }, + // IOR { type : float, name : ior } @@ -142,6 +151,15 @@ fragment { material.emissive.rgb *= texture(materialParams_emissiveMap, uv).rgb; } + material.specularFactor = materialParams.specularStrength; + material.specularColorFactor = materialParams.specularColorFactor; + + if (materialParams.specularIndex > -1) { + highp float2 uv = uvs[materialParams.specularIndex]; + uv = (vec3(uv, 1.0) * materialParams.specularUvMatrix).xy; + material.specularFactor *= texture(materialParams_specularMap, uv).a; + } + ${CUSTOM_FRAGMENT} } } diff --git a/libs/gltfio/materials/volume.spec.in b/libs/gltfio/materials/volume.spec.in index d77b8148d3e..5f65676765c 100644 --- a/libs/gltfio/materials/volume.spec.in +++ b/libs/gltfio/materials/volume.spec.in @@ -1,7 +1,5 @@ -ShadingModel=lit - -# NOTE: this intentionally omits the blending mode spec because -# Filament requires MASKED blending for KHR_materials_volume. +# Required Aspects +BlendingMode = ${BLENDING} # Core Features VertexColors=optional @@ -28,3 +26,8 @@ TransmissionTexture=optional # Volume Features Volume=optional VolumeThicknessTexture=optional + +# KHR_materials_specular Features +Specular=optional +SpecularTexture=optional +SpecularColorTexture=unsupported diff --git a/libs/gltfio/src/Animator.cpp b/libs/gltfio/src/Animator.cpp index 62779da1f78..7b1bd6eb250 100644 --- a/libs/gltfio/src/Animator.cpp +++ b/libs/gltfio/src/Animator.cpp @@ -19,6 +19,7 @@ #include "FFilamentAsset.h" #include "FFilamentInstance.h" +#include "FTrsTransformManager.h" #include "downcast.h" #include @@ -74,6 +75,7 @@ struct AnimatorImpl { FFilamentInstance* instance = nullptr; RenderableManager* renderableManager; TransformManager* transformManager; + TrsTransformManager* trsTransformManager; vector weights; FixedCapacityVector crossFade; void addChannels(const FixedCapacityVector& nodeMap, const cgltf_animation& srcAnim, @@ -190,6 +192,7 @@ Animator::Animator(FFilamentAsset const* asset, FFilamentInstance* instance) { mImpl->instance = instance; mImpl->renderableManager = &asset->mEngine->getRenderableManager(); mImpl->transformManager = &asset->mEngine->getTransformManager(); + mImpl->trsTransformManager = asset->getTrsTransformManager(); const cgltf_data* srcAsset = asset->mSourceAsset->hierarchy; const cgltf_animation* srcAnims = srcAsset->animations; @@ -261,7 +264,7 @@ size_t Animator::getAnimationCount() const { void Animator::applyAnimation(size_t animationIndex, float time) const { const Animation& anim = mImpl->animations[animationIndex]; - time = fmod(time, anim.duration); + time = time == anim.duration ? time : fmod(time, anim.duration); TransformManager& transformManager = *mImpl->transformManager; transformManager.openLocalTransformTransaction(); for (const auto& channel : anim.channels) { @@ -365,7 +368,8 @@ void AnimatorImpl::stashCrossFade() { return index; }; - const Instance root = tm.getInstance(asset->mRoot); + const Entity rootEntity = instance ? instance->getRoot() : asset->mRoot; + const Instance root = tm.getInstance(rootEntity); const size_t count = recursiveCount(root, 0, recursiveCount); crossFade.reserve(count); crossFade.resize(count); @@ -391,7 +395,9 @@ void AnimatorImpl::applyCrossFade(float alpha) { } return index; }; - recursiveFn(tm.getInstance(asset->mRoot), 0, recursiveFn); + const Entity rootEntity = instance ? instance->getRoot() : asset->mRoot; + const Instance root = tm.getInstance(rootEntity); + recursiveFn(root, 0, recursiveFn); } void AnimatorImpl::addChannels(const FixedCapacityVector& nodeMap, @@ -402,6 +408,9 @@ void AnimatorImpl::addChannels(const FixedCapacityVector& nodeMap, const Sampler* samplers = dst.samplers.data(); for (cgltf_size j = 0, nchans = srcAnim.channels_count; j < nchans; ++j) { const cgltf_animation_channel& srcChannel = srcChannels[j]; + if (!srcChannel.target_node) { + continue; + } Entity targetEntity = nodeMap[srcChannel.target_node - nodes]; if (UTILS_UNLIKELY(!targetEntity)) { if (GLTFIO_VERBOSE) { @@ -429,20 +438,13 @@ void AnimatorImpl::applyAnimation(const Channel& channel, float t, size_t prevIn size_t nextIndex) { const Sampler* sampler = channel.sourceData; const TimeValues& times = sampler->times; + TrsTransformManager::Instance trsNode = trsTransformManager->getInstance(channel.targetEntity); TransformManager::Instance node = transformManager->getInstance(channel.targetEntity); - // Perform the interpolation. This is a simple but inefficient implementation; Filament - // stores transforms as mat4's but glTF animation is based on TRS (translation rotation - // scale). - mat4f xform = transformManager->getTransform(node); - float3 scale; - quatf rotation; - float3 translation; - decomposeMatrix(xform, &translation, &rotation, &scale); - switch (channel.transformType) { case Channel::SCALE: { + float3 scale; const float3* srcVec3 = (const float3*) sampler->values.data(); if (sampler->interpolation == Sampler::CUBIC) { float3 vert0 = srcVec3[prevIndex * 3 + 1]; @@ -453,10 +455,12 @@ void AnimatorImpl::applyAnimation(const Channel& channel, float t, size_t prevIn } else { scale = ((1 - t) * srcVec3[prevIndex]) + (t * srcVec3[nextIndex]); } + trsTransformManager->setScale(trsNode, scale); break; } case Channel::TRANSLATION: { + float3 translation; const float3* srcVec3 = (const float3*) sampler->values.data(); if (sampler->interpolation == Sampler::CUBIC) { float3 vert0 = srcVec3[prevIndex * 3 + 1]; @@ -467,10 +471,12 @@ void AnimatorImpl::applyAnimation(const Channel& channel, float t, size_t prevIn } else { translation = ((1 - t) * srcVec3[prevIndex]) + (t * srcVec3[nextIndex]); } + trsTransformManager->setTranslation(trsNode, translation); break; } case Channel::ROTATION: { + quatf rotation; const quatf* srcQuat = (const quatf*) sampler->values.data(); if (sampler->interpolation == Sampler::CUBIC) { quatf vert0 = srcQuat[prevIndex * 3 + 1]; @@ -481,6 +487,7 @@ void AnimatorImpl::applyAnimation(const Channel& channel, float t, size_t prevIn } else { rotation = slerp(srcQuat[prevIndex], srcQuat[nextIndex], t); } + trsTransformManager->setRotation(trsNode, rotation); break; } @@ -519,8 +526,7 @@ void AnimatorImpl::applyAnimation(const Channel& channel, float t, size_t prevIn } } - xform = composeMatrix(translation, rotation, scale); - transformManager->setTransform(node, xform); + transformManager->setTransform(node, trsTransformManager->getTransform(trsNode)); } void AnimatorImpl::resetBoneMatrices(FFilamentInstance* instance) { @@ -551,19 +557,18 @@ void AnimatorImpl::updateBoneMatrices(FFilamentInstance* instance) { if (!renderable) { continue; } - mat4f inverseGlobalTransform; + mat4 inverseGlobalTransform; auto xformable = transformManager->getInstance(entity); if (xformable) { - inverseGlobalTransform = inverse(transformManager->getWorldTransform(xformable)); + inverseGlobalTransform = inverse(transformManager->getWorldTransformAccurate(xformable)); } for (size_t boneIndex = 0; boneIndex < njoints; ++boneIndex) { const auto& joint = skin.joints[boneIndex]; const mat4f& inverseBindMatrix = assetSkin.inverseBindMatrices[boneIndex]; TransformManager::Instance jointInstance = transformManager->getInstance(joint); - mat4f globalJointTransform = transformManager->getWorldTransform(jointInstance); + mat4 globalJointTransform = transformManager->getWorldTransformAccurate(jointInstance); boneMatrices[boneIndex] = - inverseGlobalTransform * - globalJointTransform * + mat4f{ inverseGlobalTransform * globalJointTransform } * inverseBindMatrix; } renderableManager->setBones(renderable, boneMatrices.data(), boneMatrices.size()); diff --git a/libs/gltfio/src/ArchiveCache.cpp b/libs/gltfio/src/ArchiveCache.cpp index 152b0fc94cd..18280b01b79 100644 --- a/libs/gltfio/src/ArchiveCache.cpp +++ b/libs/gltfio/src/ArchiveCache.cpp @@ -16,17 +16,31 @@ #include "ArchiveCache.h" +#include + +#include #include + +#include +#include +#include +#include +#include +#include #include +#include #include +#include +#include +#include + using namespace utils; using namespace filament::uberz; namespace filament::gltfio { - // Set this to a certain spec index to find out why it was deemed unsuitable. // To find the spec index of interest, try invoking uberz with the verbose flag. constexpr static int DEBUG_SPEC_INDEX = -1; @@ -60,6 +74,9 @@ void ArchiveCache::load(const void* archiveData, uint64_t archiveByteCount) { // This loops though all ubershaders and returns the first one that meets the given requirements. Material* ArchiveCache::getMaterial(const ArchiveRequirements& reqs) { assert_invariant(mArchive && "Please call load() before requesting any materials."); + if (mArchive == nullptr) { + return nullptr; + } for (uint64_t i = 0; i < mArchive->specsCount; ++i) { const ArchiveSpec& spec = mArchive->specs[i]; @@ -101,7 +118,7 @@ Material* ArchiveCache::getMaterial(const ArchiveRequirements& reqs) { // mesh doesn't have it, then this ubershader is not suitable. This occurs very rarely, so // it intentionally comes after the other suitability check. for (uint64_t j = 0; j < spec.flagsCount && specIsSuitable; ++j) { - ArchiveFlag& flag = spec.flags[j]; + ArchiveFlag const& flag = spec.flags[j]; if (UTILS_UNLIKELY(flag.value == ArchiveFeature::REQUIRED)) { // This allocates a new CString just to make a robin_map lookup, but this is rare // because almost none of our feature flags are REQUIRED. @@ -119,6 +136,7 @@ Material* ArchiveCache::getMaterial(const ArchiveRequirements& reqs) { .package(spec.package, spec.packageByteCount) .build(mEngine); } + return mMaterials[i]; } } @@ -128,6 +146,7 @@ Material* ArchiveCache::getMaterial(const ArchiveRequirements& reqs) { Material* ArchiveCache::getDefaultMaterial() { assert_invariant(mArchive && "Please call load() before requesting any materials."); assert_invariant(!mMaterials.empty() && "Archive must have at least one material."); + if (!mArchive) return nullptr; if (mMaterials[0] == nullptr) { mMaterials[0] = Material::Builder() .package(mArchive->specs[0].package, mArchive->specs[0].packageByteCount) @@ -157,7 +176,7 @@ FeatureMap ArchiveCache::getFeatureMap(Material* material) const { } ArchiveCache::~ArchiveCache() { - assert_invariant(mMaterials.size() == 0 && + assert_invariant(mMaterials.empty() && "Please call destroyMaterials explicitly to ensure correct destruction order"); utils::aligned_free(mArchive); } diff --git a/libs/gltfio/src/AssetLoader.cpp b/libs/gltfio/src/AssetLoader.cpp index 2f93172b1d0..2e3439a9a7d 100644 --- a/libs/gltfio/src/AssetLoader.cpp +++ b/libs/gltfio/src/AssetLoader.cpp @@ -21,7 +21,10 @@ #include "FFilamentAsset.h" #include "FNodeManager.h" +#include "FTrsTransformManager.h" #include "GltfEnums.h" +#include "Utility.h" +#include "extended/AssetLoaderExtended.h" #include #include @@ -41,6 +44,7 @@ #include #include +#include #include #include #include @@ -50,11 +54,14 @@ #include -#define CGLTF_IMPLEMENTATION #include #include "downcast.h" +#include +#include +#include + using namespace filament; using namespace filament::math; using namespace utils; @@ -83,27 +90,58 @@ static constexpr cgltf_material kDefaultMat = { }, }; -// Sometimes a glTF bufferview includes unused data at the end (e.g. in skinning.gltf) so we need to -// compute the correct size of the vertex buffer. Filament automatically infers the size of -// driver-level vertex buffers from the attribute data (stride, count, offset) and clients are -// expected to avoid uploading data blobs that exceed this size. Since this information doesn't -// exist in the glTF we need to compute it manually. This is a bit of a cheat, cgltf_calc_size is -// private but its implementation file is available in this cpp file. -uint32_t computeBindingSize(const cgltf_accessor* accessor) { - cgltf_size element_size = cgltf_calc_size(accessor->type, accessor->component_type); - return uint32_t(accessor->stride * (accessor->count - 1) + element_size); -} +static std::string getNodeName(cgltf_node const* node, char const* defaultNodeName) { + auto const getNameImpl = [node, defaultNodeName]() -> char const* { + if (node->name) return node->name; + if (node->mesh && node->mesh->name) return node->mesh->name; + if (node->light && node->light->name) return node->light->name; + if (node->camera && node->camera->name) return node->camera->name; + if (defaultNodeName) return defaultNodeName; + return ""; + }; -uint32_t computeBindingOffset(const cgltf_accessor* accessor) { - return uint32_t(accessor->offset + accessor->buffer_view->offset); -} + std::string strOrig(getNameImpl()); + + // We handle the potential case of escaped characters in the JSON which should be properly + // interpreted as unicode. See spec: + // https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#json-encoding + // Also see spec for escaped strings in JSON (Section 2.5) https://www.ietf.org/rfc/rfc4627.txt + + std::string strEscaped; + size_t cur = 0, idx = 0; + std::wstring_convert, char32_t> conv; + + auto const addUnencodedSubstr = [&](size_t cursor, size_t nextPoint) { + assert_invariant(nextPoint >= cursor); + if (cursor == nextPoint) { + return; + } + strEscaped += strOrig.substr(cursor, nextPoint - cursor); + }; + + while ((idx = strOrig.find("\\u", cur)) != std::string::npos) { + if (idx + 6 > strOrig.length()) { + utils::slog.w << "gltfio: Unable to interpret node name=" << strOrig + << " as proper unicode encoding." << utils::io::endl; + return strOrig; + } + + // Turns string of the form \u0062 to 0x0062 + std::string const hexStr = strOrig.substr(idx + 2, 4); + if (hexStr.find_first_not_of("0123456789abcdefABCDEF") != std::string::npos) { + utils::slog.w << "gltfio: Unable to interpret node name=" << strOrig + << " as proper unicode encoding." << utils::io::endl; + return strOrig; + } + + addUnencodedSubstr(cur, idx); + + strEscaped += conv.to_bytes((char32_t) std::stoul(hexStr, nullptr, 16)); + cur = idx + 6; + } + addUnencodedSubstr(cur, strOrig.length()); -static const char* getNodeName(const cgltf_node* node, const char* defaultNodeName) { - if (node->name) return node->name; - if (node->mesh && node->mesh->name) return node->mesh->name; - if (node->light && node->light->name) return node->light->name; - if (node->camera && node->camera->name) return node->camera->name; - return defaultNodeName; + return strEscaped; } static bool primitiveHasVertexColor(const cgltf_primitive& inPrim) { @@ -215,21 +253,26 @@ class MaterialInstanceCache { }; struct FAssetLoader : public AssetLoader { - FAssetLoader(const AssetConfiguration& config) : + FAssetLoader(AssetConfiguration const& config) : mEntityManager(config.entities ? *config.entities : EntityManager::get()), mRenderableManager(config.engine->getRenderableManager()), mNameManager(config.names), mTransformManager(config.engine->getTransformManager()), mMaterials(*config.materials), mEngine(*config.engine), - mDefaultNodeName(config.defaultNodeName) {} + mDefaultNodeName(config.defaultNodeName) { + if (config.ext) { + FILAMENT_CHECK_PRECONDITION(AssetConfigurationExtended::isSupported()) + << "Extend asset loading is not supported on this platform"; + mLoaderExtended = std::make_unique( + *config.ext, config.engine, mMaterials); + } + } FFilamentAsset* createAsset(const uint8_t* bytes, uint32_t nbytes); FFilamentAsset* createInstancedAsset(const uint8_t* bytes, uint32_t numBytes, FilamentInstance** instances, size_t numInstances); - FilamentInstance* createInstance(FFilamentAsset* primary); - void importSkins(FFilamentAsset* primary, FFilamentInstance* instance, - const cgltf_data* srcAsset); + FilamentInstance* createInstance(FFilamentAsset* fAsset); static void destroy(FAssetLoader** loader) noexcept { delete *loader; @@ -257,31 +300,33 @@ struct FAssetLoader : public AssetLoader { } private: + void importSkins(FFilamentInstance* instance, const cgltf_data* srcAsset); + // Methods used during the first traveral (creation of VertexBuffer, IndexBuffer, etc) - void createRootAsset(const cgltf_data* srcAsset); - void recursePrimitives(const cgltf_data* srcAsset, const cgltf_node* rootNode); - void createPrimitives(const cgltf_data* srcAsset, const cgltf_node* node, const char* name); - bool createPrimitive(const cgltf_primitive& inPrim, Primitive* outPrim, const char* name); + FFilamentAsset* createRootAsset(const cgltf_data* srcAsset); + void recursePrimitives(const cgltf_node* rootNode, FFilamentAsset* fAsset); + void createPrimitives(const cgltf_node* node, const char* name, FFilamentAsset* fAsset); + bool createPrimitive(const cgltf_primitive& inPrim, const char* name, Primitive* outPrim, + FFilamentAsset* fAsset); // Methods used during subsequent traverals (creation of entities, renderables, etc) - void createInstances(const cgltf_data* srcAsset, size_t numInstances); - FFilamentInstance* createInstance(const cgltf_data* srcAsset); - void recurseEntities(const cgltf_data* srcAsset, const cgltf_node* node, SceneMask scenes, - Entity parent, FFilamentInstance* instance); - void createRenderable(const cgltf_data* srcAsset, const cgltf_node* node, Entity entity, - const char* name, FFilamentInstance* instance); - void createLight(const cgltf_light* light, Entity entity); - void createCamera(const cgltf_camera* camera, Entity entity); + void createInstances(size_t numInstances, FFilamentAsset* fAsset); + void recurseEntities(const cgltf_node* node, SceneMask scenes, Entity parent, + FFilamentAsset* fAsset, FFilamentInstance* instance); + void createRenderable(const cgltf_node* node, Entity entity, const char* name, + FFilamentAsset* fAsset); + void createLight(const cgltf_light* light, Entity entity, FFilamentAsset* fAsset); + void createCamera(const cgltf_camera* camera, Entity entity, FFilamentAsset* fAsset); void addTextureBinding(MaterialInstance* materialInstance, const char* parameterName, const cgltf_texture* srcTexture, bool srgb); - void createMaterialVariants(const cgltf_data* srcAsset, const cgltf_mesh* mesh, Entity entity, + void createMaterialVariants(const cgltf_mesh* mesh, Entity entity, FFilamentAsset* fAsset, FFilamentInstance* instance); // Utility methods that work with MaterialProvider. Material* getMaterial(const cgltf_data* srcAsset, const cgltf_material* inputMat, UvMap* uvmap, bool vertexColor); - MaterialInstance* createMaterialInstance(const cgltf_data* srcAsset, - const cgltf_material* inputMat, UvMap* uvmap, bool vertexColor); + MaterialInstance* createMaterialInstance(const cgltf_material* inputMat, UvMap* uvmap, + bool vertexColor, FFilamentAsset* fAsset); MaterialKey getMaterialKey(const cgltf_data* srcAsset, const cgltf_material* inputMat, UvMap* uvmap, bool vertexColor, cgltf_texture_view* baseColorTexture, @@ -295,10 +340,9 @@ struct FAssetLoader : public AssetLoader { MaterialProvider& mMaterials; Engine& mEngine; FNodeManager mNodeManager; + FTrsTransformManager mTrsTransformManager; // Transient state used only for the asset currently being loaded: - FFilamentAsset* mAsset; - tsl::robin_map mRootNodes; const char* mDefaultNodeName; bool mError = false; bool mDiagnosticsEnabled = false; @@ -306,6 +350,9 @@ struct FAssetLoader : public AssetLoader { // Weak reference to the largest dummy buffer so far in the current loading phase. BufferObject* mDummyBufferObject = nullptr; + +public: + std::unique_ptr mLoaderExtended; }; FILAMENT_DOWNCAST(AssetLoader) @@ -341,6 +388,7 @@ FFilamentAsset* FAssetLoader::createInstancedAsset(const uint8_t* bytes, uint32_ utils::FixedCapacityVector glbdata(byteCount); std::copy_n(bytes, byteCount, glbdata.data()); + // The ownership of an allocated `sourceAsset` will be moved to FFilamentAsset::mSourceAsset. cgltf_data* sourceAsset; cgltf_result result = cgltf_parse(&options, glbdata.data(), byteCount, &sourceAsset); if (result != cgltf_result_success) { @@ -348,87 +396,122 @@ FFilamentAsset* FAssetLoader::createInstancedAsset(const uint8_t* bytes, uint32_ return nullptr; } - createRootAsset(sourceAsset); + FFilamentAsset* fAsset = createRootAsset(sourceAsset); if (mError) { - delete mAsset; - mAsset = nullptr; + delete fAsset; + fAsset = nullptr; mError = false; return nullptr; } + glbdata.swap(fAsset->mSourceAsset->glbData); - createInstances(sourceAsset, numInstances); + createInstances(numInstances, fAsset); if (mError) { - delete mAsset; - mAsset = nullptr; + delete fAsset; + fAsset = nullptr; mError = false; return nullptr; - } + } - glbdata.swap(mAsset->mSourceAsset->glbData); - std::copy_n(mAsset->mInstances.data(), numInstances, instances); - return mAsset; + std::copy_n(fAsset->mInstances.data(), numInstances, instances); + return fAsset; } -// note there a two overloads; this is the high-level one -FilamentInstance* FAssetLoader::createInstance(FFilamentAsset* primary) { - if (!primary->mSourceAsset) { +FilamentInstance* FAssetLoader::createInstance(FFilamentAsset* fAsset) { + if (!fAsset->mSourceAsset) { slog.e << "Source data has been released; asset is frozen." << io::endl; return nullptr; } - const cgltf_data* srcAsset = primary->mSourceAsset->hierarchy; + const cgltf_data* srcAsset = fAsset->mSourceAsset->hierarchy; if (srcAsset->scenes == nullptr) { slog.e << "There is no scene in the asset." << io::endl; return nullptr; } - FFilamentInstance* instance = createInstance(srcAsset); + auto rootTransform = mTransformManager.getInstance(fAsset->mRoot); + Entity instanceRoot = mEntityManager.create(); + mTransformManager.create(instanceRoot, rootTransform); + + mMaterialInstanceCache = MaterialInstanceCache(srcAsset); + + // Create an instance object, which is a just a lightweight wrapper around a vector of + // entities and an animator. The creation of animator is triggered from ResourceLoader + // because it could require external bin data. + FFilamentInstance* instance = new FFilamentInstance(instanceRoot, fAsset); + + // Check if the asset has variants. + instance->mVariants.reserve(srcAsset->variants_count); + for (cgltf_size i = 0, len = srcAsset->variants_count; i < len; ++i) { + instance->mVariants.push_back({ CString(srcAsset->variants[i].name) }); + } + + // For each scene root, recursively create all entities. + for (const auto& pair : fAsset->mRootNodes) { + recurseEntities(pair.first, pair.second, instanceRoot, fAsset, instance); + } + + importSkins(instance, srcAsset); + + // Now that all entities have been created, the instance can create the animator component. + // Note that it may need to defer actual creation until external buffers are fully loaded. + instance->createAnimator(); + + fAsset->mInstances.push_back(instance); + + // Bounding boxes are not shared because users might call recomputeBoundingBoxes() which can + // be affected by entity transforms. However, upon instance creation we can safely copy over + // the asset's bounding box. + instance->mBoundingBox = fAsset->mBoundingBox; + + mMaterialInstanceCache.flush(&instance->mMaterialInstances); + + fAsset->mDependencyGraph.commitEdges(); - primary->mDependencyGraph.commitEdges(); return instance; } -void FAssetLoader::createRootAsset(const cgltf_data* srcAsset) { +FFilamentAsset* FAssetLoader::createRootAsset(const cgltf_data* srcAsset) { SYSTRACE_CALL(); #if !GLTFIO_DRACO_SUPPORTED for (cgltf_size i = 0; i < srcAsset->extensions_required_count; i++) { if (!strcmp(srcAsset->extensions_required[i], "KHR_draco_mesh_compression")) { slog.e << "KHR_draco_mesh_compression is not supported." << io::endl; - mAsset = nullptr; - return; + return nullptr; } } #endif mDummyBufferObject = nullptr; - mAsset = new FFilamentAsset(&mEngine, mNameManager, &mEntityManager, &mNodeManager, srcAsset); + FFilamentAsset* fAsset = new FFilamentAsset(&mEngine, mNameManager, &mEntityManager, + &mNodeManager, &mTrsTransformManager, srcAsset, (bool) mLoaderExtended); // It is not an error for a glTF file to have zero scenes. - mAsset->mScenes.clear(); + fAsset->mScenes.clear(); if (srcAsset->scenes == nullptr) { - return; + return fAsset; } // Create a single root node with an identity transform as a convenience to the client. - mAsset->mRoot = mEntityManager.create(); - mTransformManager.create(mAsset->mRoot); + fAsset->mRoot = mEntityManager.create(); + mTransformManager.create(fAsset->mRoot); // Check if the asset has an extras string. const cgltf_asset& asset = srcAsset->asset; const cgltf_size extras_size = asset.extras.end_offset - asset.extras.start_offset; if (extras_size > 1) { - mAsset->mAssetExtras = CString(srcAsset->json + asset.extras.start_offset, extras_size); + fAsset->mAssetExtras = CString(srcAsset->json + asset.extras.start_offset, extras_size); } // Build a mapping of root nodes to scene membership sets. assert_invariant(srcAsset->scenes_count <= NodeManager::MAX_SCENE_COUNT); - mRootNodes.clear(); + fAsset->mRootNodes.clear(); const size_t sic = std::min(srcAsset->scenes_count, NodeManager::MAX_SCENE_COUNT); - mAsset->mScenes.reserve(sic); + fAsset->mScenes.reserve(sic); for (size_t si = 0; si < sic; ++si) { const cgltf_scene& scene = srcAsset->scenes[si]; - mAsset->mScenes.emplace_back(scene.name); + fAsset->mScenes.emplace_back(scene.name); for (size_t ni = 0, nic = scene.nodes_count; ni < nic; ++ni) { - mRootNodes[scene.nodes[ni]].set(si); + fAsset->mRootNodes[scene.nodes[ni]].set(si); } } @@ -437,13 +520,13 @@ void FAssetLoader::createRootAsset(const cgltf_data* srcAsset) { // transformable entities for "un-scened" nodes in case they have bones. for (size_t i = 0, n = srcAsset->nodes_count; i < n; ++i) { cgltf_node* node = &srcAsset->nodes[i]; - if (node->parent == nullptr && mRootNodes.find(node) == mRootNodes.end()) { - mRootNodes.insert({node, {}}); + if (node->parent == nullptr && fAsset->mRootNodes.find(node) == fAsset->mRootNodes.end()) { + fAsset->mRootNodes.insert({node, {}}); } } - for (const auto& [node, sceneMask] : mRootNodes) { - recursePrimitives(srcAsset, node); + for (const auto& [node, sceneMask] : fAsset->mRootNodes) { + recursePrimitives(node, fAsset); } // Find every unique resource URI and store a pointer to any of the cgltf-owned cstrings @@ -460,32 +543,35 @@ void FAssetLoader::createRootAsset(const cgltf_data* srcAsset) { for (cgltf_size i = 0, len = srcAsset->images_count; i < len; ++i) { addResourceUri(srcAsset->images[i].uri); } - mAsset->mResourceUris.reserve(resourceUris.size()); + fAsset->mResourceUris.reserve(resourceUris.size()); for (std::string_view uri : resourceUris) { - mAsset->mResourceUris.push_back(uri.data()); + fAsset->mResourceUris.push_back(uri.data()); } + + return fAsset; } -void FAssetLoader::recursePrimitives(const cgltf_data* srcAsset, const cgltf_node* node) { - const char* name = getNodeName(node, mDefaultNodeName); +void FAssetLoader::recursePrimitives(const cgltf_node* node, FFilamentAsset* fAsset) { + auto nameStr = getNodeName(node, mDefaultNodeName); + const char* name = nameStr.c_str(); name = name ? name : "node"; if (node->mesh) { - createPrimitives(srcAsset, node, name); - mAsset->mRenderableCount++; + createPrimitives(node, name, fAsset); + fAsset->mRenderableCount++; } for (cgltf_size i = 0, len = node->children_count; i < len; ++i) { - recursePrimitives(srcAsset, node->children[i]); + recursePrimitives(node->children[i], fAsset); } } -void FAssetLoader::createInstances(const cgltf_data* srcAsset, size_t numInstances) { +void FAssetLoader::createInstances(size_t numInstances, FFilamentAsset* fAsset) { // Create a separate entity hierarchy for each instance. Note that MeshCache (vertex // buffers and index buffers) and MaterialInstanceCache (materials and textures) help avoid // needless duplication of resources. for (size_t index = 0; index < numInstances; ++index) { - if (createInstance(srcAsset) == nullptr) { + if (createInstance(fAsset) == nullptr) { mError = true; break; } @@ -494,62 +580,15 @@ void FAssetLoader::createInstances(const cgltf_data* srcAsset, size_t numInstanc // Sort the entities so that the renderable ones come first. This allows us to expose // a "renderables only" pointer without storing a separate list. const auto& rm = mEngine.getRenderableManager(); - std::partition(mAsset->mEntities.begin(), mAsset->mEntities.end(), [&rm](Entity a) { + std::partition(fAsset->mEntities.begin(), fAsset->mEntities.end(), [&rm](Entity a) { return rm.hasComponent(a); }); - - if (mError) { - destroyAsset(mAsset); - mAsset = nullptr; - mError = false; - } } -// note there a two overloads; this is the low-level one -FFilamentInstance* FAssetLoader::createInstance(const cgltf_data* srcAsset) { - auto rootTransform = mTransformManager.getInstance(mAsset->mRoot); - Entity instanceRoot = mEntityManager.create(); - mTransformManager.create(instanceRoot, rootTransform); - - mMaterialInstanceCache = MaterialInstanceCache(srcAsset); - - // Create an instance object, which is a just a lightweight wrapper around a vector of - // entities and an animator. The creation of animator is triggered from ResourceLoader - // because it could require external bin data. - FFilamentInstance* instance = new FFilamentInstance(instanceRoot, mAsset); - - // Check if the asset has variants. - instance->mVariants.reserve(srcAsset->variants_count); - for (cgltf_size i = 0, len = srcAsset->variants_count; i < len; ++i) { - instance->mVariants.push_back({CString(srcAsset->variants[i].name)}); - } - - // For each scene root, recursively create all entities. - for (const auto& pair : mRootNodes) { - recurseEntities(srcAsset, pair.first, pair.second, instanceRoot, instance); - } - - importSkins(mAsset, instance, srcAsset); - - // Now that all entities have been created, the instance can create the animator component. - // Note that it may need to defer actual creation until external buffers are fully loaded. - instance->createAnimator(); - - mAsset->mInstances.push_back(instance); - - // Bounding boxes are not shared because users might call recomputeBoundingBoxes() which can - // be affected by entity transforms. However, upon instance creation we can safely copy over - // the asset's bounding box. - instance->mBoundingBox = mAsset->mBoundingBox; - - mMaterialInstanceCache.flush(&instance->mMaterialInstances); - - return instance; -} - -void FAssetLoader::recurseEntities(const cgltf_data* srcAsset, const cgltf_node* node, - SceneMask scenes, Entity parent, FFilamentInstance* instance) { +void FAssetLoader::recurseEntities(const cgltf_node* node, SceneMask scenes, Entity parent, + FFilamentAsset* fAsset, FFilamentInstance* instance) { NodeManager& nm = mNodeManager; + const cgltf_data* srcAsset = fAsset->mSourceAsset->hierarchy; const Entity entity = mEntityManager.create(); nm.create(entity); const auto nodeInstance = nm.getInstance(entity); @@ -563,7 +602,9 @@ void FAssetLoader::recurseEntities(const cgltf_data* srcAsset, const cgltf_node* quatf* rotation = (quatf*) &node->rotation[0]; float3* scale = (float3*) &node->scale[0]; float3* translation = (float3*) &node->translation[0]; - localTransform = composeMatrix(*translation, *rotation, *scale); + mTrsTransformManager.create(entity, *translation, *rotation, *scale); + localTransform = mTrsTransformManager.getTransform( + mTrsTransformManager.getInstance(entity)); } auto parentTransform = mTransformManager.getInstance(parent); @@ -572,20 +613,20 @@ void FAssetLoader::recurseEntities(const cgltf_data* srcAsset, const cgltf_node* // Check if this node has an extras string. const cgltf_size extras_size = node->extras.end_offset - node->extras.start_offset; if (extras_size > 0) { - const cgltf_data* srcAsset = mAsset->mSourceAsset->hierarchy; mNodeManager.setExtras(mNodeManager.getInstance(entity), {srcAsset->json + node->extras.start_offset, extras_size}); } // Update the asset's entity list and private node mapping. - mAsset->mEntities.push_back(entity); + fAsset->mEntities.push_back(entity); instance->mEntities.push_back(entity); instance->mNodeMap[node - srcAsset->nodes] = entity; - const char* name = getNodeName(node, mDefaultNodeName); + auto nameStr = getNodeName(node, mDefaultNodeName); + const char* name = nameStr.c_str(); if (name) { - mAsset->mNameToEntity[name].push_back(entity); + fAsset->mNameToEntity[name].push_back(entity); if (mNameManager) { mNameManager->addComponent(entity); mNameManager->setName(mNameManager->getInstance(entity), name); @@ -597,34 +638,36 @@ void FAssetLoader::recurseEntities(const cgltf_data* srcAsset, const cgltf_node* // If the node has a mesh, then create a renderable component. if (node->mesh) { - createRenderable(srcAsset, node, entity, name, instance); + createRenderable(node, entity, name, fAsset); if (srcAsset->variants_count > 0) { - createMaterialVariants(srcAsset, node->mesh, entity, instance); + createMaterialVariants(node->mesh, entity, fAsset, instance); } } if (node->light) { - createLight(node->light, entity); + createLight(node->light, entity, fAsset); } if (node->camera) { - createCamera(node->camera, entity); + createCamera(node->camera, entity, fAsset); } for (cgltf_size i = 0, len = node->children_count; i < len; ++i) { - recurseEntities(srcAsset, node->children[i], scenes, entity, instance); + recurseEntities(node->children[i], scenes, entity, fAsset, instance); } } -void FAssetLoader::createPrimitives(const cgltf_data* srcAsset, const cgltf_node* node, - const char* name) { +void FAssetLoader::createPrimitives(const cgltf_node* node, const char* name, + FFilamentAsset* fAsset) { + cgltf_data* gltf = fAsset->mSourceAsset->hierarchy; const cgltf_mesh* mesh = node->mesh; + assert_invariant(gltf != nullptr); assert_invariant(mesh != nullptr); // If the mesh is already loaded, obtain the list of Filament VertexBuffer / IndexBuffer objects // that were already generated (one for each primitive), otherwise allocate a new list of // pointers for the primitives. - FixedCapacityVector& prims = mAsset->mMeshCache[mesh - srcAsset->meshes]; + FixedCapacityVector& prims = fAsset->mMeshCache[mesh - gltf->meshes]; if (prims.empty()) { prims.reserve(mesh->primitives_count); prims.resize(mesh->primitives_count); @@ -634,12 +677,38 @@ void FAssetLoader::createPrimitives(const cgltf_data* srcAsset, const cgltf_node for (cgltf_size index = 0, n = mesh->primitives_count; index < n; ++index) { Primitive& outputPrim = prims[index]; - const cgltf_primitive& inputPrim = mesh->primitives[index]; - - // Create a Filament VertexBuffer and IndexBuffer for this prim if we haven't already. - if (!outputPrim.vertices && !createPrimitive(inputPrim, &outputPrim, name)) { - mError = true; - return; + cgltf_primitive& inputPrim = mesh->primitives[index]; + + if (!outputPrim.vertices) { + if (mLoaderExtended) { + auto& resourceInfo = std::get(fAsset->mResourceInfo); + resourceInfo.uriDataCache = mLoaderExtended->getUriDataCache(); + AssetLoaderExtended::Input input{ + .gltf = gltf, + .prim = &inputPrim, + .name = name, + .dracoCache = &fAsset->mSourceAsset->dracoCache, + .material = getMaterial(gltf, inputPrim.material, &outputPrim.uvmap, + utility::primitiveHasVertexColor(&inputPrim)), + }; + + mError = !mLoaderExtended->createPrimitive(&input, &outputPrim, resourceInfo.slots); + if (!mError) { + if (outputPrim.vertices) { + fAsset->mVertexBuffers.push_back(outputPrim.vertices); + } + if (outputPrim.indices) { + fAsset->mIndexBuffers.push_back(outputPrim.indices); + } + } + } else { + // Create a Filament VertexBuffer and IndexBuffer for this prim if we haven't + // already. + mError = !createPrimitive(inputPrim, name, &outputPrim, fAsset); + } + if (mError) { + return; + } } // Expand the object-space bounding box. @@ -651,18 +720,19 @@ void FAssetLoader::createPrimitives(const cgltf_data* srcAsset, const cgltf_node cgltf_node_transform_world(node, &worldTransform[0][0]); const Aabb transformed = aabb.transform(worldTransform); - mAsset->mBoundingBox.min = min(mAsset->mBoundingBox.min, transformed.min); - mAsset->mBoundingBox.max = max(mAsset->mBoundingBox.max, transformed.max); + fAsset->mBoundingBox.min = min(fAsset->mBoundingBox.min, transformed.min); + fAsset->mBoundingBox.max = max(fAsset->mBoundingBox.max, transformed.max); } -void FAssetLoader::createRenderable(const cgltf_data* srcAsset, const cgltf_node* node, - Entity entity, const char* name, FFilamentInstance* instance) { +void FAssetLoader::createRenderable(const cgltf_node* node, Entity entity, const char* name, + FFilamentAsset* fAsset) { + const cgltf_data* srcAsset = fAsset->mSourceAsset->hierarchy; const cgltf_mesh* mesh = node->mesh; const cgltf_size primitiveCount = mesh->primitives_count; // If the mesh is already loaded, obtain the list of Filament VertexBuffer / IndexBuffer objects // that were already generated (one for each primitive). - FixedCapacityVector& prims = mAsset->mMeshCache[mesh - srcAsset->meshes]; + FixedCapacityVector& prims = fAsset->mMeshCache[mesh - srcAsset->meshes]; assert_invariant(prims.size() == primitiveCount); Primitive* outputPrim = prims.data(); const cgltf_primitive* inputPrim = &mesh->primitives[0]; @@ -672,11 +742,11 @@ void FAssetLoader::createRenderable(const cgltf_data* srcAsset, const cgltf_node // glTF spec says that all primitives must have the same number of morph targets. const cgltf_size numMorphTargets = inputPrim ? inputPrim->targets_count : 0; RenderableManager::Builder builder(primitiveCount); - builder.morphing(numMorphTargets); // For each prim, create a Filament VertexBuffer, IndexBuffer, and MaterialInstance. // The VertexBuffer and IndexBuffer objects are cached for possible re-use, but MaterialInstance // is not. + size_t morphingVertexCount = 0; for (cgltf_size index = 0; index < primitiveCount; ++index, ++outputPrim, ++inputPrim) { RenderableManager::PrimitiveType primType; if (!getPrimitiveType(inputPrim->type, &primType)) { @@ -693,15 +763,15 @@ void FAssetLoader::createRenderable(const cgltf_data* srcAsset, const cgltf_node // Create a material instance for this primitive or fetch one from the cache. UvMap uvmap {}; bool hasVertexColor = primitiveHasVertexColor(*inputPrim); - MaterialInstance* mi = createMaterialInstance(srcAsset, inputPrim->material, &uvmap, - hasVertexColor); + MaterialInstance* mi = createMaterialInstance(inputPrim->material, &uvmap, hasVertexColor, + fAsset); assert_invariant(mi); if (!mi) { mError = true; continue; } - mAsset->mDependencyGraph.addEdge(entity, mi); + fAsset->mDependencyGraph.addEdge(entity, mi); builder.material(index, mi); assert_invariant(outputPrim->vertices); @@ -717,8 +787,78 @@ void FAssetLoader::createRenderable(const cgltf_data* srcAsset, const cgltf_node builder.geometry(index, primType, outputPrim->vertices, outputPrim->indices); if (numMorphTargets) { - assert_invariant(outputPrim->targets); - builder.morphing(0, index, outputPrim->targets); + outputPrim->morphTargetOffset = morphingVertexCount; // FIXME: can I do that here? + builder.morphing(0, index, morphingVertexCount); + morphingVertexCount += outputPrim->vertices->getVertexCount(); + } + } + + if (numMorphTargets) { + MorphTargetBuffer* morphTargetBuffer = MorphTargetBuffer::Builder() + .count(numMorphTargets) + .vertexCount(morphingVertexCount) + .build(mEngine); + + fAsset->mMorphTargetBuffers.push_back(morphTargetBuffer); + + builder.morphing(morphTargetBuffer); + + outputPrim = prims.data(); + inputPrim = &mesh->primitives[0]; + for (cgltf_size index = 0; index < primitiveCount; ++index, ++outputPrim, ++inputPrim) { + outputPrim->morphTargetBuffer = morphTargetBuffer; + + UTILS_UNUSED_IN_RELEASE cgltf_accessor const* previous = nullptr; + for (int tindex = 0; tindex < numMorphTargets; ++tindex) { + const cgltf_morph_target& inTarget = inputPrim->targets[tindex]; + for (cgltf_size aindex = 0; aindex < inTarget.attributes_count; ++aindex) { + const cgltf_attribute& attribute = inTarget.attributes[aindex]; + const cgltf_accessor* accessor = attribute.data; + const cgltf_attribute_type atype = attribute.type; + if (atype == cgltf_attribute_type_position) { + // All position attributes must have the same number of components. + assert_invariant(!previous || previous->type == accessor->type); + previous = accessor; + + assert_invariant(outputPrim->morphTargetBuffer); + + if (std::holds_alternative( + fAsset->mResourceInfo)) { + using BufferSlot = FFilamentAsset::ResourceInfo::BufferSlot; + auto& slots = std::get( + fAsset->mResourceInfo).mBufferSlots; + BufferSlot& slot = slots[outputPrim->slotIndices[tindex]]; + + assert_invariant(!slot.vertexBuffer); + assert_invariant(!slot.indexBuffer); + + slot.morphTargetBuffer = outputPrim->morphTargetBuffer; + slot.morphTargetOffset = outputPrim->morphTargetOffset; + slot.morphTargetCount = outputPrim->vertices->getVertexCount(); + slot.bufferIndex = tindex; + } + else if (std::holds_alternative( + fAsset->mResourceInfo)) + { + using BufferSlot = FFilamentAsset::ResourceInfoExtended::BufferSlot; + auto& slots = std::get( + fAsset->mResourceInfo).slots; + + BufferSlot& slot = slots[outputPrim->slotIndices[tindex]]; + + assert_invariant(slot.slot == tindex); + assert_invariant(!slot.vertices); + assert_invariant(!slot.indices); + + slot.target = outputPrim->morphTargetBuffer; + slot.offset = outputPrim->morphTargetOffset; + slot.count = outputPrim->vertices->getVertexCount(); + } + + break; + } + } + } } } @@ -730,7 +870,7 @@ void FAssetLoader::createRenderable(const cgltf_data* srcAsset, const cgltf_node nm.setMorphTargetNames(nm.getInstance(entity), std::move(morphTargetNames)); if (node->skin) { - builder.skinning(node->skin->joints_count); + builder.skinning(node->skin->joints_count); } // Per the spec, glTF models must have valid mix / max annotations for position attributes. @@ -765,8 +905,8 @@ void FAssetLoader::createRenderable(const cgltf_data* srcAsset, const cgltf_node } } -void FAssetLoader::createMaterialVariants(const cgltf_data* srcAsset, const cgltf_mesh* mesh, - Entity entity, FFilamentInstance* instance) { +void FAssetLoader::createMaterialVariants(const cgltf_mesh* mesh, Entity entity, + FFilamentAsset* fAsset, FFilamentInstance* instance) { UvMap uvmap {}; for (cgltf_size prim = 0, n = mesh->primitives_count; prim < n; ++prim) { const cgltf_primitive& srcPrim = mesh->primitives[prim]; @@ -775,21 +915,24 @@ void FAssetLoader::createMaterialVariants(const cgltf_data* srcAsset, const cglt const cgltf_material* material = srcPrim.mappings[i].material; bool hasVertexColor = primitiveHasVertexColor(srcPrim); MaterialInstance* mi = - createMaterialInstance(srcAsset, material, &uvmap, hasVertexColor); + createMaterialInstance(material, &uvmap, hasVertexColor, fAsset); assert_invariant(mi); if (!mi) { mError = true; break; } - mAsset->mDependencyGraph.addEdge(entity, mi); + fAsset->mDependencyGraph.addEdge(entity, mi); instance->mVariants[variantIndex].mappings.push_back({entity, prim, mi}); } } } -bool FAssetLoader::createPrimitive(const cgltf_primitive& inPrim, Primitive* outPrim, - const char* name) { - Material* material = getMaterial(mAsset->mSourceAsset->hierarchy, +bool FAssetLoader::createPrimitive(const cgltf_primitive& inPrim, const char* name, + Primitive* outPrim, FFilamentAsset* fAsset) { + + using BufferSlot = FFilamentAsset::ResourceInfo::BufferSlot; + + Material* material = getMaterial(fAsset->mSourceAsset->hierarchy, inPrim.material, &outPrim->uvmap, primitiveHasVertexColor(inPrim)); AttributeBitset requiredAttributes = material->getRequiredAttributes(); @@ -799,8 +942,8 @@ bool FAssetLoader::createPrimitive(const cgltf_primitive& inPrim, Primitive* out // request from Google. // Create a little lambda that appends to the asset's vertex buffer slots. - auto slots = &mAsset->mBufferSlots; - auto addBufferSlot = [slots](BufferSlot entry) { + auto* const slots = &std::get(fAsset->mResourceInfo).mBufferSlots; + auto addBufferSlot = [slots](FFilamentAsset::ResourceInfo::BufferSlot entry) { slots->push_back(entry); }; @@ -819,7 +962,7 @@ bool FAssetLoader::createPrimitive(const cgltf_primitive& inPrim, Primitive* out .bufferType(indexType) .build(mEngine); - BufferSlot slot = { accessor }; + FFilamentAsset::ResourceInfo::BufferSlot slot = { accessor }; slot.indexBuffer = indices; addBufferSlot(slot); } else if (inPrim.attributes_count > 0) { @@ -839,7 +982,7 @@ bool FAssetLoader::createPrimitive(const cgltf_primitive& inPrim, Primitive* out IndexBuffer::BufferDescriptor bd(indexData, indexDataSize, FREE_CALLBACK); indices->setBuffer(mEngine, std::move(bd)); } - mAsset->mIndexBuffers.push_back(indices); + fAsset->mIndexBuffers.push_back(indices); VertexBuffer::Builder vbb; vbb.enableBufferObjects(); @@ -847,7 +990,7 @@ bool FAssetLoader::createPrimitive(const cgltf_primitive& inPrim, Primitive* out bool hasUv0 = false, hasUv1 = false, hasVertexColor = false, hasNormals = false; uint32_t vertexCount = 0; - const size_t firstSlot = mAsset->mBufferSlots.size(); + const size_t firstSlot = slots->size(); int slot = 0; for (cgltf_size aindex = 0; aindex < inPrim.attributes_count; aindex++) { @@ -867,7 +1010,7 @@ bool FAssetLoader::createPrimitive(const cgltf_primitive& inPrim, Primitive* out vbb.attribute(VertexAttribute::TANGENTS, slot, VertexBuffer::AttributeType::SHORT4); vbb.normalized(VertexAttribute::TANGENTS); hasNormals = true; - addBufferSlot({&mAsset->mGenerateTangents, atype, slot++}); + addBufferSlot({&fAsset->mGenerateTangents, atype, slot++}); continue; } @@ -889,6 +1032,7 @@ bool FAssetLoader::createPrimitive(const cgltf_primitive& inPrim, Primitive* out utils::slog.e << "Too many joints in " << name << utils::io::endl; continue; } + if (atype == cgltf_attribute_type_texcoord) { if (index >= UvMapSize) { utils::slog.e << "Too many texture coordinate sets in " << name << utils::io::endl; @@ -953,7 +1097,7 @@ bool FAssetLoader::createPrimitive(const cgltf_primitive& inPrim, Primitive* out vbb.attribute(VertexAttribute::TANGENTS, slot, VertexBuffer::AttributeType::SHORT4); vbb.normalized(VertexAttribute::TANGENTS); cgltf_attribute_type atype = cgltf_attribute_type_normal; - addBufferSlot({&mAsset->mGenerateNormals, atype, slot++}); + addBufferSlot({&fAsset->mGenerateNormals, atype, slot++}); } cgltf_size targetsCount = inPrim.targets_count; @@ -1060,21 +1204,17 @@ bool FAssetLoader::createPrimitive(const cgltf_primitive& inPrim, Primitive* out outPrim->indices = indices; outPrim->vertices = vertices; - mAsset->mPrimitives.push_back({&inPrim, vertices}); - mAsset->mVertexBuffers.push_back(vertices); + auto& primitives = std::get(fAsset->mResourceInfo).mPrimitives; + primitives.push_back({&inPrim, vertices}); + fAsset->mVertexBuffers.push_back(vertices); - for (size_t i = firstSlot; i < mAsset->mBufferSlots.size(); ++i) { - mAsset->mBufferSlots[i].vertexBuffer = vertices; + for (size_t i = firstSlot; i < slots->size(); ++i) { + (*slots)[i].vertexBuffer = vertices; } if (targetsCount > 0) { - MorphTargetBuffer* targets = MorphTargetBuffer::Builder() - .vertexCount(vertexCount) - .count(targetsCount) - .build(mEngine); - outPrim->targets = targets; - mAsset->mMorphTargetBuffers.push_back(targets); - const cgltf_accessor* previous = nullptr; + UTILS_UNUSED_IN_RELEASE cgltf_accessor const* previous = nullptr; + outPrim->slotIndices.resize(targetsCount); for (int tindex = 0; tindex < targetsCount; ++tindex) { const cgltf_morph_target& inTarget = inPrim.targets[tindex]; for (cgltf_size aindex = 0; aindex < inTarget.attributes_count; ++aindex) { @@ -1086,8 +1226,7 @@ bool FAssetLoader::createPrimitive(const cgltf_primitive& inPrim, Primitive* out assert_invariant(!previous || previous->type == accessor->type); previous = accessor; BufferSlot slot = { accessor }; - slot.morphTargetBuffer = targets; - slot.bufferIndex = tindex; + outPrim->slotIndices[tindex] = slots->size(); addBufferSlot(slot); break; } @@ -1099,7 +1238,7 @@ bool FAssetLoader::createPrimitive(const cgltf_primitive& inPrim, Primitive* out const uint32_t requiredSize = sizeof(ubyte4) * vertexCount; if (mDummyBufferObject == nullptr || requiredSize > mDummyBufferObject->getByteCount()) { mDummyBufferObject = BufferObject::Builder().size(requiredSize).build(mEngine); - mAsset->mBufferObjects.push_back(mDummyBufferObject); + fAsset->mBufferObjects.push_back(mDummyBufferObject); uint32_t* dummyData = (uint32_t*) malloc(requiredSize); memset(dummyData, 0xff, requiredSize); VertexBuffer::BufferDescriptor bd(dummyData, requiredSize, FREE_CALLBACK); @@ -1111,7 +1250,7 @@ bool FAssetLoader::createPrimitive(const cgltf_primitive& inPrim, Primitive* out return true; } -void FAssetLoader::createLight(const cgltf_light* light, Entity entity) { +void FAssetLoader::createLight(const cgltf_light* light, Entity entity, FFilamentAsset* fAsset) { LightManager::Type type = getLightType(light->type); LightManager::Builder builder(type); @@ -1144,10 +1283,10 @@ void FAssetLoader::createLight(const cgltf_light* light, Entity entity) { } builder.build(mEngine, entity); - mAsset->mLightEntities.push_back(entity); + fAsset->mLightEntities.push_back(entity); } -void FAssetLoader::createCamera(const cgltf_camera* camera, Entity entity) { +void FAssetLoader::createCamera(const cgltf_camera* camera, Entity entity, FFilamentAsset* fAsset) { Camera* filamentCamera = mEngine.createCamera(entity); if (camera->type == cgltf_camera_type_perspective) { @@ -1182,7 +1321,7 @@ void FAssetLoader::createCamera(const cgltf_camera* camera, Entity entity) { return; } - mAsset->mCameraEntities.push_back(entity); + fAsset->mCameraEntities.push_back(entity); } MaterialKey FAssetLoader::getMaterialKey(const cgltf_data* srcAsset, @@ -1194,6 +1333,7 @@ MaterialKey FAssetLoader::getMaterialKey(const cgltf_data* srcAsset, auto trConfig = inputMat->transmission; auto shConfig = inputMat->sheen; auto vlConfig = inputMat->volume; + auto spConfig = inputMat->specular; *baseColorTexture = mrConfig.base_color_texture; *metallicRoughnessTexture = mrConfig.metallic_roughness_texture; @@ -1210,7 +1350,9 @@ MaterialKey FAssetLoader::getMaterialKey(const cgltf_data* srcAsset, ccConfig.clearcoat_normal_texture.has_transform || shConfig.sheen_color_texture.has_transform || shConfig.sheen_roughness_texture.has_transform || - trConfig.transmission_texture.has_transform; + trConfig.transmission_texture.has_transform || + spConfig.specular_color_texture.has_transform || + spConfig.specular_texture.has_transform; MaterialKey matkey { .doubleSided = !!inputMat->double_sided, @@ -1245,6 +1387,11 @@ MaterialKey FAssetLoader::getMaterialKey(const cgltf_data* srcAsset, .hasSheen = !!inputMat->has_sheen, .hasIOR = !!inputMat->has_ior, .hasVolume = !!inputMat->has_volume, + .hasSpecular = !!inputMat->has_specular, + .hasSpecularTexture = spConfig.specular_texture.texture != nullptr, + .hasSpecularColorTexture = spConfig.specular_color_texture.texture != nullptr, + .specularTextureUV = (uint8_t) spConfig.specular_texture.texcoord, + .specularColorTextureUV = (uint8_t) spConfig.specular_color_texture.texcoord, }; if (inputMat->has_pbr_specular_glossiness) { @@ -1290,13 +1437,15 @@ Material* FAssetLoader::getMaterial(const cgltf_data* srcAsset, } MaterialKey matkey = getMaterialKey(srcAsset, inputMat, uvmap, vertexColor, &baseColorTexture, &metallicRoughnessTexture); - Material* material = mMaterials.getMaterial(&matkey, uvmap, inputMat->name); + const char* label = inputMat->name ? inputMat->name : "material"; + Material* material = mMaterials.getMaterial(&matkey, uvmap, label); assert_invariant(material); return material; } -MaterialInstance* FAssetLoader::createMaterialInstance(const cgltf_data* srcAsset, - const cgltf_material* inputMat, UvMap* uvmap, bool vertexColor) { +MaterialInstance* FAssetLoader::createMaterialInstance(const cgltf_material* inputMat, UvMap* uvmap, + bool vertexColor, FFilamentAsset* fAsset) { + const cgltf_data* srcAsset = fAsset->mSourceAsset->hierarchy; MaterialInstanceCache::Entry* const cacheEntry = mMaterialInstanceCache.getEntry(&inputMat, vertexColor); if (cacheEntry->instance) { @@ -1331,6 +1480,7 @@ MaterialInstance* FAssetLoader::createMaterialInstance(const cgltf_data* srcAsse auto trConfig = inputMat->transmission; auto shConfig = inputMat->sheen; auto vlConfig = inputMat->volume; + auto spConfig = inputMat->specular; // Check the material blending mode, not the cgltf blending mode, because the provider // might have selected an alternative blend mode (e.g. to support transmission). @@ -1362,7 +1512,7 @@ MaterialInstance* FAssetLoader::createMaterialInstance(const cgltf_data* srcAsse const TextureProvider::TextureFlags LINEAR = TextureProvider::TextureFlags::NONE; if (matkey.hasBaseColorTexture) { - mAsset->addTextureBinding(mi, "baseColorMap", baseColorTexture.texture, sRGB); + fAsset->addTextureBinding(mi, "baseColorMap", baseColorTexture.texture, sRGB); if (matkey.hasTextureTransforms) { const cgltf_texture_transform& uvt = baseColorTexture.transform; auto uvmat = matrixFromUvTransform(uvt.offset, uvt.rotation, uvt.scale); @@ -1376,7 +1526,7 @@ MaterialInstance* FAssetLoader::createMaterialInstance(const cgltf_data* srcAsse // specularGlossinessTexture are both sRGB, whereas the core glTF spec stipulates that // metallicRoughness is not sRGB. TextureProvider::TextureFlags srgb = inputMat->has_pbr_specular_glossiness ? sRGB : LINEAR; - mAsset->addTextureBinding(mi, "metallicRoughnessMap", metallicRoughnessTexture.texture, srgb); + fAsset->addTextureBinding(mi, "metallicRoughnessMap", metallicRoughnessTexture.texture, srgb); if (matkey.hasTextureTransforms) { const cgltf_texture_transform& uvt = metallicRoughnessTexture.transform; auto uvmat = matrixFromUvTransform(uvt.offset, uvt.rotation, uvt.scale); @@ -1385,7 +1535,7 @@ MaterialInstance* FAssetLoader::createMaterialInstance(const cgltf_data* srcAsse } if (matkey.hasNormalTexture) { - mAsset->addTextureBinding(mi, "normalMap", inputMat->normal_texture.texture, LINEAR); + fAsset->addTextureBinding(mi, "normalMap", inputMat->normal_texture.texture, LINEAR); if (matkey.hasTextureTransforms) { const cgltf_texture_transform& uvt = inputMat->normal_texture.transform; auto uvmat = matrixFromUvTransform(uvt.offset, uvt.rotation, uvt.scale); @@ -1397,7 +1547,7 @@ MaterialInstance* FAssetLoader::createMaterialInstance(const cgltf_data* srcAsse } if (matkey.hasOcclusionTexture) { - mAsset->addTextureBinding(mi, "occlusionMap", inputMat->occlusion_texture.texture, LINEAR); + fAsset->addTextureBinding(mi, "occlusionMap", inputMat->occlusion_texture.texture, LINEAR); if (matkey.hasTextureTransforms) { const cgltf_texture_transform& uvt = inputMat->occlusion_texture.transform; auto uvmat = matrixFromUvTransform(uvt.offset, uvt.rotation, uvt.scale); @@ -1409,7 +1559,7 @@ MaterialInstance* FAssetLoader::createMaterialInstance(const cgltf_data* srcAsse } if (matkey.hasEmissiveTexture) { - mAsset->addTextureBinding(mi, "emissiveMap", inputMat->emissive_texture.texture, sRGB); + fAsset->addTextureBinding(mi, "emissiveMap", inputMat->emissive_texture.texture, sRGB); if (matkey.hasTextureTransforms) { const cgltf_texture_transform& uvt = inputMat->emissive_texture.transform; auto uvmat = matrixFromUvTransform(uvt.offset, uvt.rotation, uvt.scale); @@ -1422,7 +1572,7 @@ MaterialInstance* FAssetLoader::createMaterialInstance(const cgltf_data* srcAsse mi->setParameter("clearCoatRoughnessFactor", ccConfig.clearcoat_roughness_factor); if (matkey.hasClearCoatTexture) { - mAsset->addTextureBinding(mi, "clearCoatMap", ccConfig.clearcoat_texture.texture, + fAsset->addTextureBinding(mi, "clearCoatMap", ccConfig.clearcoat_texture.texture, LINEAR); if (matkey.hasTextureTransforms) { const cgltf_texture_transform& uvt = ccConfig.clearcoat_texture.transform; @@ -1431,7 +1581,7 @@ MaterialInstance* FAssetLoader::createMaterialInstance(const cgltf_data* srcAsse } } if (matkey.hasClearCoatRoughnessTexture) { - mAsset->addTextureBinding(mi, "clearCoatRoughnessMap", + fAsset->addTextureBinding(mi, "clearCoatRoughnessMap", ccConfig.clearcoat_roughness_texture.texture, LINEAR); if (matkey.hasTextureTransforms) { const cgltf_texture_transform& uvt = ccConfig.clearcoat_roughness_texture.transform; @@ -1440,7 +1590,7 @@ MaterialInstance* FAssetLoader::createMaterialInstance(const cgltf_data* srcAsse } } if (matkey.hasClearCoatNormalTexture) { - mAsset->addTextureBinding(mi, "clearCoatNormalMap", + fAsset->addTextureBinding(mi, "clearCoatNormalMap", ccConfig.clearcoat_normal_texture.texture, LINEAR); if (matkey.hasTextureTransforms) { const cgltf_texture_transform& uvt = ccConfig.clearcoat_normal_texture.transform; @@ -1457,7 +1607,7 @@ MaterialInstance* FAssetLoader::createMaterialInstance(const cgltf_data* srcAsse mi->setParameter("sheenRoughnessFactor", shConfig.sheen_roughness_factor); if (matkey.hasSheenColorTexture) { - mAsset->addTextureBinding(mi, "sheenColorMap", shConfig.sheen_color_texture.texture, + fAsset->addTextureBinding(mi, "sheenColorMap", shConfig.sheen_color_texture.texture, sRGB); if (matkey.hasTextureTransforms) { const cgltf_texture_transform& uvt = shConfig.sheen_color_texture.transform; @@ -1466,8 +1616,9 @@ MaterialInstance* FAssetLoader::createMaterialInstance(const cgltf_data* srcAsse } } if (matkey.hasSheenRoughnessTexture) { - mAsset->addTextureBinding(mi, "sheenRoughnessMap", - shConfig.sheen_roughness_texture.texture, LINEAR); + bool sameTexture = shConfig.sheen_color_texture.texture == shConfig.sheen_roughness_texture.texture; + fAsset->addTextureBinding(mi, "sheenRoughnessMap", + shConfig.sheen_roughness_texture.texture, sameTexture ? sRGB : LINEAR); if (matkey.hasTextureTransforms) { const cgltf_texture_transform& uvt = shConfig.sheen_roughness_texture.transform; auto uvmat = matrixFromUvTransform(uvt.offset, uvt.rotation, uvt.scale); @@ -1487,7 +1638,7 @@ MaterialInstance* FAssetLoader::createMaterialInstance(const cgltf_data* srcAsse mi->setParameter("volumeAbsorption", RgbType::LINEAR, absorption); if (matkey.hasVolumeThicknessTexture) { - mAsset->addTextureBinding(mi, "volumeThicknessMap", vlConfig.thickness_texture.texture, + fAsset->addTextureBinding(mi, "volumeThicknessMap", vlConfig.thickness_texture.texture, LINEAR); if (matkey.hasTextureTransforms) { const cgltf_texture_transform& uvt = vlConfig.thickness_texture.transform; @@ -1500,7 +1651,7 @@ MaterialInstance* FAssetLoader::createMaterialInstance(const cgltf_data* srcAsse if (matkey.hasTransmission) { mi->setParameter("transmissionFactor", trConfig.transmission_factor); if (matkey.hasTransmissionTexture) { - mAsset->addTextureBinding(mi, "transmissionMap", trConfig.transmission_texture.texture, + fAsset->addTextureBinding(mi, "transmissionMap", trConfig.transmission_texture.texture, LINEAR); if (matkey.hasTextureTransforms) { const cgltf_texture_transform& uvt = trConfig.transmission_texture.transform; @@ -1529,12 +1680,35 @@ MaterialInstance* FAssetLoader::createMaterialInstance(const cgltf_data* srcAsse inputMat->emissive_strength.emissive_strength : 1.0f); } + if (matkey.hasSpecular) { + const float* s = spConfig.specular_color_factor; + mi->setParameter("specularColorFactor", float3{s[0], s[1], s[2]}); + mi->setParameter("specularStrength", spConfig.specular_factor); + + if (matkey.hasSpecularColorTexture) { + fAsset->addTextureBinding(mi, "specularColorMap", spConfig.specular_color_texture.texture, sRGB); + if (matkey.hasTextureTransforms) { + const cgltf_texture_transform uvt = spConfig.specular_color_texture.transform; + auto uvmat = matrixFromUvTransform(uvt.offset, uvt.rotation, uvt.scale); + mi->setParameter("specularColorUvMatrix", uvmat); + } + } + if (matkey.hasSpecularTexture) { + bool sameTexture = spConfig.specular_color_texture.texture == spConfig.specular_texture.texture; + fAsset->addTextureBinding(mi, "specularMap", spConfig.specular_texture.texture, sameTexture ? sRGB : LINEAR); + if (matkey.hasTextureTransforms) { + const cgltf_texture_transform uvt = spConfig.specular_texture.transform; + auto uvmat = matrixFromUvTransform(uvt.offset, uvt.rotation, uvt.scale); + mi->setParameter("specularUvMatrix", uvmat); + } + } + } + *cacheEntry = { mi, *uvmap }; return mi; } -void FAssetLoader::importSkins(FFilamentAsset* primary, - FFilamentInstance* instance, const cgltf_data* gltf) { +void FAssetLoader::importSkins(FFilamentInstance* instance, const cgltf_data* gltf) { instance->mSkins.reserve(gltf->skins_count); instance->mSkins.resize(gltf->skins_count); const auto& nodeMap = instance->mNodeMap; @@ -1558,6 +1732,14 @@ void FAssetLoader::importSkins(FFilamentAsset* primary, } } +bool AssetConfigurationExtended::isSupported() { +#if defined(__ANDROID__) || defined(FILAMENT_IOS) || defined(__EMSCRIPTEN__) + return false; +#else + return true; +#endif +} + AssetLoader* AssetLoader::create(const AssetConfiguration& config) { return new FAssetLoader(config); } diff --git a/libs/gltfio/src/DracoCache.cpp b/libs/gltfio/src/DracoCache.cpp index b0f061a1a1f..871e0054491 100644 --- a/libs/gltfio/src/DracoCache.cpp +++ b/libs/gltfio/src/DracoCache.cpp @@ -20,6 +20,7 @@ #include #endif +#include #include #if GLTFIO_DRACO_SUPPORTED @@ -65,7 +66,7 @@ DracoMesh::~DracoMesh() { } // Gets the number of components in the given cgltf vector type, or -1 for matrices. -static int getNumComponents(cgltf_type ctype) { +UTILS_UNUSED_IN_RELEASE static int getNumComponents(cgltf_type ctype) { return ((int) ctype) <= 4 ? ((int) ctype) : -1; } diff --git a/libs/gltfio/src/FFilamentAsset.h b/libs/gltfio/src/FFilamentAsset.h index 35ae8cdd570..1648ad0d2c3 100644 --- a/libs/gltfio/src/FFilamentAsset.h +++ b/libs/gltfio/src/FFilamentAsset.h @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -44,9 +45,11 @@ #include "DependencyGraph.h" #include "DracoCache.h" #include "FFilamentInstance.h" +#include "Utility.h" -#include - +#include +#include +#include #include #ifdef NDEBUG @@ -57,7 +60,7 @@ #define GLTFIO_WARN(msg) slog.w << msg << io::endl #endif -#if defined(__EMSCRIPTEN__) || defined(__ANDROID__) || defined(IOS) +#if defined(__EMSCRIPTEN__) || defined(__ANDROID__) || defined(FILAMENT_IOS) #define GLTFIO_USE_FILESYSTEM 0 #else #define GLTFIO_USE_FILESYSTEM 1 @@ -70,17 +73,7 @@ namespace utils { namespace filament::gltfio { -class Wireframe; - -// Encapsulates VertexBuffer::setBufferAt() or IndexBuffer::setBuffer(). -struct BufferSlot { - const cgltf_accessor* accessor; - cgltf_attribute_type attribute; - int bufferIndex; // for vertex buffer and morph target buffer only - VertexBuffer* vertexBuffer; - IndexBuffer* indexBuffer; - MorphTargetBuffer* morphTargetBuffer; -}; +struct Wireframe; // Stores a connection between Texture and MaterialInstance; consumed by resource loader so that it // can call "setParameter" on the given MaterialInstance after the Texture has been created. @@ -103,19 +96,31 @@ struct Primitive { IndexBuffer* indices = nullptr; Aabb aabb; // object-space bounding box UvMap uvmap; // mapping from each glTF UV set to either UV0 or UV1 (8 bytes) - MorphTargetBuffer* targets = nullptr; + MorphTargetBuffer* morphTargetBuffer = nullptr; + uint32_t morphTargetOffset; + std::vector slotIndices; }; using MeshCache = utils::FixedCapacityVector>; struct FFilamentAsset : public FilamentAsset { + struct ResourceInfo; + struct ResourceInfoExtended; + FFilamentAsset(Engine* engine, utils::NameComponentManager* names, utils::EntityManager* entityManager, NodeManager* nodeManager, - const cgltf_data* srcAsset) : + TrsTransformManager* trsTransformManager, const cgltf_data* srcAsset, + bool useExtendedAlgo) : mEngine(engine), mNameManager(names), mEntityManager(entityManager), - mNodeManager(nodeManager), + mNodeManager(nodeManager), mTrsTransformManager(trsTransformManager), mSourceAsset(new SourceAsset {(cgltf_data*)srcAsset}), mTextures(srcAsset->textures_count), - mMeshCache(srcAsset->meshes_count) {} + mMeshCache(srcAsset->meshes_count) { + if (!useExtendedAlgo) { + mResourceInfo = ResourceInfo{}; + } else { + mResourceInfo = ResourceInfoExtended{}; + } + } ~FFilamentAsset(); @@ -195,6 +200,10 @@ struct FFilamentAsset : public FilamentAsset { return mEngine; } + TrsTransformManager* getTrsTransformManager() const noexcept { + return mTrsTransformManager; + } + void releaseSourceData() noexcept; const void* getSourceAsset() const noexcept { @@ -222,6 +231,10 @@ struct FFilamentAsset : public FilamentAsset { mDetachedFilamentComponents = true; } + bool isUsingExtendedAlgorithm() { + return std::holds_alternative(mResourceInfo); + } + // end public API // If a Filament Texture for the given args already exists, calls setParameter() and returns @@ -242,6 +255,7 @@ struct FFilamentAsset : public FilamentAsset { utils::NameComponentManager* const mNameManager; utils::EntityManager* const mEntityManager; NodeManager* const mNodeManager; + TrsTransformManager* const mTrsTransformManager; std::vector mEntities; // sorted such that renderables come first std::vector mLightEntities; std::vector mCameraEntities; @@ -261,7 +275,7 @@ struct FFilamentAsset : public FilamentAsset { bool mResourcesLoaded = false; DependencyGraph mDependencyGraph; - tsl::htrie_map> mNameToEntity; + std::unordered_map> mNameToEntity; utils::CString mAssetExtras; bool mDetachedFilamentComponents = false; @@ -284,6 +298,9 @@ struct FFilamentAsset : public FilamentAsset { using SourceHandle = std::shared_ptr; SourceHandle mSourceAsset; + // The mapping of root nodes to scene membership sets. + tsl::robin_map mRootNodes; + // Stores all information related to a single cgltf_texture. // Note that more than one cgltf_texture can map to a single Filament texture, // e.g. if several have the same URL or bufferView. For each Filament texture, @@ -305,8 +322,54 @@ struct FFilamentAsset : public FilamentAsset { MeshCache mMeshCache; // Asset information that is produced by AssetLoader and consumed by ResourceLoader: - std::vector mBufferSlots; - std::vector > mPrimitives; + struct ResourceInfo { + // Encapsulates VertexBuffer::setBufferAt() or IndexBuffer::setBuffer(). + struct BufferSlot { + const cgltf_accessor* accessor; + cgltf_attribute_type attribute; + int bufferIndex;// for vertex buffer and morph target buffer only + VertexBuffer* vertexBuffer; + IndexBuffer* indexBuffer; + MorphTargetBuffer* morphTargetBuffer; + uint32_t morphTargetOffset; + uint32_t morphTargetCount; + }; + + std::vector mBufferSlots; + std::vector> mPrimitives; + }; + struct ResourceInfoExtended { + // Used to denote a generated buffer. Set as `index in `CgltfAttribute`. + static constexpr int const GENERATED_0_INDEX = -1; + static constexpr int const GENERATED_1_INDEX = -2; + + struct BufferSlot { + VertexBuffer* vertices = nullptr; + IndexBuffer* indices = nullptr; + MorphTargetBuffer* target = nullptr; + uint32_t offset = 0; + uint32_t count = 0; + int slot = -1; + size_t sizeInBytes = 0; + + void* data = nullptr; + + // MorphTarget-only data; + struct { + short4* tbn = nullptr; + float3* positions = nullptr; + } targetData; + }; + + std::vector slots; + + // This is to workaround the fact that the original ResourceLoader owns the UriDataCache. In + // the extended implementation, we create it in AssetLoader. We pass it along to + // ResourceLoader here. + UriDataCacheHandle uriDataCache; + }; + + std::variant mResourceInfo; }; FILAMENT_DOWNCAST(FilamentAsset) diff --git a/libs/gltfio/src/FNodeManager.h b/libs/gltfio/src/FNodeManager.h index 5f8dc53edb7..4e1c80d8877 100644 --- a/libs/gltfio/src/FNodeManager.h +++ b/libs/gltfio/src/FNodeManager.h @@ -57,13 +57,15 @@ class UTILS_PRIVATE FNodeManager : public NodeManager { } void destroy(utils::Entity e) noexcept { - if (Instance ci = mManager.getInstance(e); ci) { + if (Instance const ci = mManager.getInstance(e); ci) { mManager.removeComponent(e); } } void gc(utils::EntityManager& em) noexcept { - mManager.gc(em); + mManager.gc(em, [this](Entity e) { + destroy(e); + }); } void setMorphTargetNames(Instance ci, utils::FixedCapacityVector names) noexcept { diff --git a/libs/gltfio/src/FTrsTransformManager.h b/libs/gltfio/src/FTrsTransformManager.h new file mode 100644 index 00000000000..a2cb53e06e5 --- /dev/null +++ b/libs/gltfio/src/FTrsTransformManager.h @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef GLTFIO_FTRSTRANSFORMMANAGER_H +#define GLTFIO_FTRSTRANSFORMMANAGER_H + +#include "downcast.h" +#include "gltfio/math.h" +#include "math/quat.h" +#include "utils/debug.h" + +#include + +#include +#include +#include +#include +#include + +namespace filament::gltfio { + +class UTILS_PRIVATE FTrsTransformManager : public TrsTransformManager { +public: + using Instance = TrsTransformManager::Instance; + + FTrsTransformManager() noexcept {} + + ~FTrsTransformManager() noexcept { + assert_invariant(mManager.getComponentCount() == 0); + } + + void terminate() noexcept; + + bool hasComponent(utils::Entity e) const noexcept { + return mManager.hasComponent(e); + } + + Instance getInstance(utils::Entity e) const noexcept { + return Instance(mManager.getInstance(e)); + } + + void create(utils::Entity entity) { + create(entity, float3{}, quatf{}, float3{1}); + } + + void create(utils::Entity entity, const float3& translation, + const quatf& rotation, const float3& scale) { + if (UTILS_UNLIKELY(mManager.hasComponent(entity))) { + destroy(entity); + } + UTILS_UNUSED_IN_RELEASE Instance ci = mManager.addComponent(entity); + assert_invariant(ci); + + if (ci) { + setTrs(ci, translation, rotation, scale); + } + } + + void destroy(utils::Entity e) noexcept { + if (Instance const ci = mManager.getInstance(e); ci) { + mManager.removeComponent(e); + } + } + + void gc(utils::EntityManager& em) noexcept { + mManager.gc(em, [this](Entity e) { + destroy(e); + }); + } + + void setTranslation(Instance ci, const float3& translation) noexcept { + assert_invariant(ci.isValid()); + mManager[ci].translation = translation; + } + + const float3& getTranslation(Instance ci) const noexcept { + return mManager[ci].translation; + } + + void setRotation(Instance ci, const quatf& rotation) noexcept { + assert_invariant(ci.isValid()); + mManager[ci].rotation = rotation; + } + + const quatf& getRotation(Instance ci) const noexcept { + return mManager[ci].rotation; + } + + void setScale(Instance ci, const float3& scale) noexcept { + assert_invariant(ci.isValid()); + mManager[ci].scale = scale; + } + + const float3& getScale(Instance ci) const noexcept { + return mManager[ci].scale; + } + + void setTrs(Instance ci, const float3& translation, + const quatf& rotation, const float3& scale) noexcept { + setTranslation(ci, translation); + setRotation(ci, rotation); + setScale(ci, scale); + } + + const mat4f getTransform(Instance ci) const noexcept { + return composeMatrix(getTranslation(ci), getRotation(ci), getScale(ci)); + } + +private: + enum { + TRANSLATION, + ROTATION, + SCALE, + }; + + using Base = utils::SingleInstanceComponentManager< + float3, + quatf, + float3>; + + struct Sim : public Base { + using Base::gc; + using Base::swap; + + typename Base::SoA& getSoA() { return mData; } + + struct Proxy { + UTILS_ALWAYS_INLINE + Proxy(Base& sim, utils::EntityInstanceBase::Type i) noexcept : + translation{ sim, i } { } + + union { + Field translation; + Field rotation; + Field scale; + }; + }; + + UTILS_ALWAYS_INLINE Proxy operator[](Instance i) noexcept { + return { *this, i }; + } + UTILS_ALWAYS_INLINE const Proxy operator[](Instance i) const noexcept { + return { const_cast(*this), i }; + } + }; + + Sim mManager; +}; + +FILAMENT_DOWNCAST(TrsTransformManager) + +} // namespace filament::gltfio + +#endif // GLTFIO_FTRSTRANSFORMMANAGER_H diff --git a/libs/gltfio/src/FilamentAsset.cpp b/libs/gltfio/src/FilamentAsset.cpp index acec38ccdf7..4940766e1df 100644 --- a/libs/gltfio/src/FilamentAsset.cpp +++ b/libs/gltfio/src/FilamentAsset.cpp @@ -37,10 +37,8 @@ FFilamentAsset::~FFilamentAsset() { // Free transient load-time data if they haven't been freed yet. releaseSourceData(); - // Destroy all instance objects. Instance entities / components are - // destroyed later in this method because they are owned by the asset. for (FFilamentInstance* instance : mInstances) { - delete instance; + mEntityManager->destroy(instance->mRoot); } delete mWireframe; @@ -58,6 +56,11 @@ FFilamentAsset::~FFilamentAsset() { } + // Destroy gltfio trs transform components. + for (auto entity : mEntities) { + mTrsTransformManager->destroy(entity); + } + // Destroy all renderable, light, transform, and camera components, // then destroy the actual entities. This includes instances. if (!mDetachedFilamentComponents) { @@ -69,6 +72,12 @@ FFilamentAsset::~FFilamentAsset() { } } + // FilamentInstances need to be destroyed after the renderables have been destroyed + // so that there are no dangling MaterialInstance around + for (FFilamentInstance* instance : mInstances) { + delete instance; + } + for (auto vb : mVertexBuffers) { mEngine->destroy(vb); } @@ -204,7 +213,7 @@ Entity FFilamentAsset::getFirstEntityByName(const char* name) noexcept { if (iter == mNameToEntity.end()) { return {}; } - return iter->front(); + return iter->second.front(); } size_t FFilamentAsset::getEntitiesByName(const char* name, Entity* entities, @@ -213,7 +222,7 @@ size_t FFilamentAsset::getEntitiesByName(const char* name, Entity* entities, if (iter == mNameToEntity.end()) { return 0; } - const auto& source = *iter; + const auto& source = iter->second; if (entities == nullptr) { return source.size(); } @@ -233,25 +242,20 @@ size_t FFilamentAsset::getEntitiesByName(const char* name, Entity* entities, size_t FFilamentAsset::getEntitiesByPrefix(const char* prefix, Entity* entities, size_t maxCount) const noexcept { - const auto range = mNameToEntity.equal_prefix_range(prefix); - size_t count = 0; - for (auto iter = range.first; iter != range.second; ++iter) { - count += iter->size(); - } - if (entities == nullptr) { - return count; - } - maxCount = std::min(maxCount, count); if (maxCount == 0) { return 0; } - count = 0; - for (auto iter = range.first; iter != range.second; ++iter) { - const auto& source = *iter; - for (Entity entity : source) { - entities[count] = entity; - if (++count >= maxCount) { - return count; + std::string_view prefixString(prefix); + size_t count = 0; + for (auto& [k, v] : mNameToEntity) { + if (k.compare(0, prefixString.size(), prefixString) == 0) { + for (Entity entity : v) { + if (entities) { + entities[count] = entity; + } + if (++count >= maxCount) { + return count; + } } } } diff --git a/libs/gltfio/src/FilamentInstance.cpp b/libs/gltfio/src/FilamentInstance.cpp index bee3118b1aa..0437ffc53fe 100644 --- a/libs/gltfio/src/FilamentInstance.cpp +++ b/libs/gltfio/src/FilamentInstance.cpp @@ -92,16 +92,17 @@ void FFilamentInstance::detachSkin(size_t skinIndex, Entity target) noexcept { mat4f const* FFilamentInstance::getInverseBindMatricesAt(size_t skinIndex) const { assert_invariant(mOwner); - ASSERT_PRECONDITION(skinIndex < mOwner->mSkins.size(), "skinIndex must be less than the number of skins in this instance."); + FILAMENT_CHECK_PRECONDITION(skinIndex < mOwner->mSkins.size()) + << "skinIndex must be less than the number of skins in this instance."; return mOwner->mSkins[skinIndex].inverseBindMatrices.data(); } void FFilamentInstance::recomputeBoundingBoxes() { - ASSERT_PRECONDITION(mOwner->mSourceAsset, - "Do not call releaseSourceData before recomputeBoundingBoxes"); + FILAMENT_CHECK_PRECONDITION(mOwner->mSourceAsset) + << "Do not call releaseSourceData before recomputeBoundingBoxes"; - ASSERT_PRECONDITION(mOwner->mResourcesLoaded, - "Do not call recomputeBoundingBoxes before loadResources or asyncBeginLoad"); + FILAMENT_CHECK_PRECONDITION(mOwner->mResourcesLoaded) + << "Do not call recomputeBoundingBoxes before loadResources or asyncBeginLoad"; auto& rm = mOwner->mEngine->getRenderableManager(); auto& tm = mOwner->mEngine->getTransformManager(); diff --git a/libs/gltfio/src/GltfEnums.h b/libs/gltfio/src/GltfEnums.h index 4114ea79dc4..00797f294df 100644 --- a/libs/gltfio/src/GltfEnums.h +++ b/libs/gltfio/src/GltfEnums.h @@ -131,6 +131,7 @@ inline bool getPrimitiveType(cgltf_primitive_type in, case cgltf_primitive_type_triangle_strip: *out = filament::RenderableManager::PrimitiveType::TRIANGLE_STRIP; return true; + case cgltf_primitive_type_invalid: case cgltf_primitive_type_line_loop: case cgltf_primitive_type_triangle_fan: case cgltf_primitive_type_max_enum: diff --git a/libs/gltfio/src/JitShaderProvider.cpp b/libs/gltfio/src/JitShaderProvider.cpp index fff2e6e9774..44651176a59 100644 --- a/libs/gltfio/src/JitShaderProvider.cpp +++ b/libs/gltfio/src/JitShaderProvider.cpp @@ -287,7 +287,7 @@ std::string shaderFromKey(const MaterialKey& config) { // TODO: Provided by Filament, but this should really be provided/computed by gltfio // TODO: This scale is per renderable and should include the scale of the mesh node - float scale = object_uniforms.userData; + float scale = getObjectUserData(); material.thickness = materialParams.volumeThicknessFactor * scale; )SHADER"; @@ -308,6 +308,35 @@ std::string shaderFromKey(const MaterialKey& config) { material.ior = materialParams.ior; )SHADER"; } + + if (config.hasSpecular) { + shader += R"SHADER( + material.specularFactor = materialParams.specularStrength; + material.specularColorFactor = materialParams.specularColorFactor; + )SHADER"; + + if (config.hasSpecularTexture) { + shader += "highp float2 specularUV = ${specular};\n"; + if (config.hasTextureTransforms) { + shader += "specularUV = (vec3(specularUV, 1.0) * " + "materialParams.specularUvMatrix).xy;\n"; + } + shader += R"SHADER( + material.specularFactor *= texture(materialParams_specularMap, specularUV).a; + )SHADER"; + } + + if (config.hasSpecularColorTexture) { + shader += "highp float2 specularColorUV = ${specularColor};\n"; + if (config.hasTextureTransforms) { + shader += "specularColorUV = (vec3(specularColorUV, 1.0) * " + "materialParams.specularColorUvMatrix).xy;\n"; + } + shader += R"SHADER( + material.specularColorFactor *= texture(materialParams_specularColorMap, specularColorUV).rgb; + )SHADER"; + } + } } shader += "}\n"; @@ -330,7 +359,9 @@ Material* createMaterial(Engine* engine, const MaterialKey& config, const UvMap& MaterialBuilder::TransparencyMode::TWO_PASSES_TWO_SIDES : MaterialBuilder::TransparencyMode::DEFAULT) .reflectionMode(MaterialBuilder::ReflectionMode::SCREEN_SPACE) - .targetApi(filamat::targetApiFromBackend(engine->getBackend())); + .targetApi(filamat::targetApiFromBackend(engine->getBackend())) + .stereoscopicType(engine->getConfig().stereoscopicType) + .stereoscopicEyeCount(engine->getConfig().stereoscopicEyeCount); if (!optimizeShaders) { builder.optimization(MaterialBuilder::Optimization::NONE); @@ -461,6 +492,42 @@ Material* createMaterial(Engine* engine, const MaterialKey& config, const UvMap& } } + // SPECULAR + if (config.hasSpecular) { + builder.parameter("specularStrength", MaterialBuilder::UniformType::FLOAT); + builder.parameter("specularColorFactor", MaterialBuilder::UniformType::FLOAT3); + if (config.hasSpecularTexture) { + builder.parameter("specularMap", MaterialBuilder::SamplerType::SAMPLER_2D); + if (config.hasTextureTransforms) { + builder.parameter("specularUvMatrix", MaterialBuilder::UniformType::MAT3, + MaterialBuilder::ParameterPrecision::HIGH); + } + } + if (config.hasSpecularColorTexture) { + builder.parameter("specularColorMap", MaterialBuilder::SamplerType::SAMPLER_2D); + if (config.hasTextureTransforms) { + builder.parameter("specularColorUvMatrix", MaterialBuilder::UniformType::MAT3, + MaterialBuilder::ParameterPrecision::HIGH); + } + } + } + + // BLENDING + switch (config.alphaMode) { + case AlphaMode::OPAQUE: + builder.blending(MaterialBuilder::BlendingMode::OPAQUE); + break; + case AlphaMode::MASK: + builder.blending(MaterialBuilder::BlendingMode::MASKED); + break; + case AlphaMode::BLEND: + builder.blending(MaterialBuilder::BlendingMode::FADE); + break; + default: + // Ignore + break; + } + // TRANSMISSION if (config.hasTransmission) { // According to KHR_materials_transmission, the minimum expectation for a compliant renderer @@ -480,24 +547,6 @@ Material* createMaterial(Engine* engine, const MaterialKey& config, const UvMap& MaterialBuilder::ParameterPrecision::HIGH); } } - - builder.blending(MaterialBuilder::BlendingMode::MASKED); - } else { - // BLENDING - switch (config.alphaMode) { - case AlphaMode::OPAQUE: - builder.blending(MaterialBuilder::BlendingMode::OPAQUE); - break; - case AlphaMode::MASK: - builder.blending(MaterialBuilder::BlendingMode::MASKED); - break; - case AlphaMode::BLEND: - builder.blending(MaterialBuilder::BlendingMode::FADE); - break; - default: - // Ignore - break; - } } // VOLUME @@ -517,8 +566,6 @@ Material* createMaterial(Engine* engine, const MaterialKey& config, const UvMap& MaterialBuilder::ParameterPrecision::HIGH); } } - - builder.blending(MaterialBuilder::BlendingMode::MASKED); } // IOR diff --git a/libs/gltfio/src/Ktx2Provider.cpp b/libs/gltfio/src/Ktx2Provider.cpp index 52e80ade32c..5ceb3902aa9 100644 --- a/libs/gltfio/src/Ktx2Provider.cpp +++ b/libs/gltfio/src/Ktx2Provider.cpp @@ -116,7 +116,7 @@ Texture* Ktx2Provider::pushTexture(const uint8_t* data, size_t byteCount, } JobSystem* js = &mEngine->getJobSystem(); - item->job = jobs::createJob(*js, mDecoderRootJob, [this, item] { + item->job = jobs::createJob(*js, mDecoderRootJob, [item] { using Result = ktxreader::Ktx2Reader::Result; const bool success = Result::SUCCESS == item->async->doTranscoding(); item->transcoderState.store(success ? TranscoderState::SUCCESS : TranscoderState::ERROR); @@ -197,6 +197,17 @@ void Ktx2Provider::cancelDecoding() { // in-flight jobs. We should consider throttling the number of simultaneous decoder jobs, which // would allow for actual cancellation. waitForCompletion(); + + // For cancelled jobs, we need to set the QueueItemState to POPPED and free the decoded data + // stored in item->async. + for (auto& item : mQueueItems) { + if (item->state != QueueItemState::TRANSCODING) { + continue; + } + mKtxReader->asyncDestroy(&item->async); + item->async = nullptr; + item->state = QueueItemState::POPPED; + } } const char* Ktx2Provider::getPushMessage() const { diff --git a/libs/gltfio/src/MaterialProvider.cpp b/libs/gltfio/src/MaterialProvider.cpp index b42bd9a9302..7de92341524 100644 --- a/libs/gltfio/src/MaterialProvider.cpp +++ b/libs/gltfio/src/MaterialProvider.cpp @@ -56,7 +56,13 @@ bool operator==(const MaterialKey& k1, const MaterialKey& k2) { (k1.volumeThicknessUV == k2.volumeThicknessUV) && (k1.hasSheen == k2.hasSheen) && (k1.hasIOR == k2.hasIOR) && - (k1.hasVolume == k2.hasVolume); + (k1.hasVolume == k2.hasVolume) && + (k1.hasSpecular == k2.hasSpecular) && + (k1.hasSpecularTexture == k2.hasSpecularTexture) && + (k1.hasSpecularColorTexture == k2.hasSpecularColorTexture) && + (k1.specularTextureUV == k2.specularTextureUV) && + (k1.specularColorTextureUV == k2.specularColorTextureUV) + ; } // Filament supports up to 2 UV sets. glTF has arbitrary texcoord set indices, but it allows @@ -143,6 +149,21 @@ void constrainMaterial(MaterialKey* key, UvMap* uvmap) { retval[key->volumeThicknessUV] = (UvSet) index++; } } + if (key->hasSpecularTexture && retval[key->specularTextureUV] == UNUSED) { + if (index > MAX_INDEX) { + key->hasSpecularTexture = false; + } else { + retval[key->specularTextureUV] = (UvSet) index++; + } + } + if (key->hasSpecularColorTexture && retval[key->specularColorTextureUV] == UNUSED) { + if (index > MAX_INDEX) { + key->hasSpecularColorTexture = false; + } else { + retval[key->specularColorTextureUV] = (UvSet) index++; + } + } + // NOTE: KHR_materials_clearcoat does not provide separate UVs, we'll assume UV0 *uvmap = retval; } @@ -167,6 +188,8 @@ void processShaderString(std::string* shader, const UvMap& uvmap, const Material const auto& sheenColorUV = uvstrings[uvmap[config.sheenColorUV]]; const auto& sheenRoughnessUV = uvstrings[uvmap[config.sheenRoughnessUV]]; const auto& volumeThicknessUV = uvstrings[uvmap[config.volumeThicknessUV]]; + const auto& specularUV = uvstrings[uvmap[config.specularTextureUV]]; + const auto& specularColorUV = uvstrings[uvmap[config.specularColorTextureUV]]; replaceAll("${normal}", normalUV); replaceAll("${color}", baseColorUV); @@ -180,6 +203,8 @@ void processShaderString(std::string* shader, const UvMap& uvmap, const Material replaceAll("${sheenColor}", sheenColorUV); replaceAll("${sheenRoughness}", sheenRoughnessUV); replaceAll("${volumeThickness}", volumeThicknessUV); + replaceAll("${specular}", specularUV); + replaceAll("${specularColor}", specularColorUV); } } // namespace filament::gltfio diff --git a/libs/gltfio/src/ResourceLoader.cpp b/libs/gltfio/src/ResourceLoader.cpp index 8b83c4f30b0..6676de31469 100644 --- a/libs/gltfio/src/ResourceLoader.cpp +++ b/libs/gltfio/src/ResourceLoader.cpp @@ -21,6 +21,8 @@ #include "FFilamentAsset.h" #include "TangentsJob.h" #include "downcast.h" +#include "Utility.h" +#include "extended/ResourceLoaderExtended.h" #include #include @@ -32,6 +34,7 @@ #include +#include #include #include #include @@ -46,8 +49,10 @@ #include -#include #include +#include +#include +#include using namespace filament; using namespace filament::math; @@ -61,29 +66,31 @@ namespace filament::gltfio { using BufferTextureCache = tsl::robin_map; using FilepathTextureCache = tsl::robin_map; -using UriDataCache = tsl::robin_map; using TextureProviderList = tsl::robin_map; +namespace { enum class CacheResult { ERROR, NOT_READY, FOUND, MISS, }; +} // anonymous namespace struct ResourceLoader::Impl { - Impl(const ResourceConfiguration& config) : + explicit Impl(const ResourceConfiguration& config) : mEngine(config.engine), mNormalizeSkinningWeights(config.normalizeSkinningWeights), - mGltfPath(config.gltfPath ? config.gltfPath : "") {} + mGltfPath(config.gltfPath ? config.gltfPath : ""), + mUriDataCache(std::make_shared()) {} Engine* const mEngine; - const bool mNormalizeSkinningWeights; - const std::string mGltfPath; + bool mNormalizeSkinningWeights; + std::string mGltfPath; // User-provided resource data with URI string keys, populated with addResourceData(). // This is used on platforms without traditional file systems, such as Android, iOS, and WebGL. - UriDataCache mUriDataCache; + UriDataCacheHandle mUriDataCache; // User-provided mapping from mime types to texture providers. TextureProviderList mTextureProviders; @@ -104,187 +111,26 @@ struct ResourceLoader::Impl { ~Impl(); }; -uint32_t computeBindingSize(const cgltf_accessor* accessor); -uint32_t computeBindingOffset(const cgltf_accessor* accessor); - +namespace { // This little struct holds a shared_ptr that wraps cgltf_data (and, potentially, glb data) while // uploading vertex buffer data to the GPU. struct UploadEvent { FFilamentAsset::SourceHandle handle; + UriDataCacheHandle dataCacheHandle; }; -UploadEvent* uploadUserdata(FFilamentAsset* asset) { - return new UploadEvent({ asset->mSourceAsset }); +UploadEvent* uploadUserdata(FFilamentAsset* asset, UriDataCacheHandle dataCache) { + return new UploadEvent({ asset->mSourceAsset, dataCache }); } -static void uploadCallback(void* buffer, size_t size, void* user) { +void uploadCallback(void* buffer, size_t size, void* user) { auto event = (UploadEvent*) user; delete event; } -static void convertBytesToShorts(uint16_t* dst, const uint8_t* src, size_t count) { - for (size_t i = 0; i < count; ++i) { - dst[i] = src[i]; - } -} - -static bool requiresConversion(const cgltf_accessor* accessor) { - if (UTILS_UNLIKELY(accessor->is_sparse)) { - return true; - } - const cgltf_type type = accessor->type; - const cgltf_component_type ctype = accessor->component_type; - filament::VertexBuffer::AttributeType permitted; - filament::VertexBuffer::AttributeType actual; - bool supported = getElementType(type, ctype, &permitted, &actual); - return supported && permitted != actual; -} - -static bool requiresPacking(const cgltf_accessor* accessor) { - if (requiresConversion(accessor)) { - return true; - } - const size_t dim = cgltf_num_components(accessor->type); - switch (accessor->component_type) { - case cgltf_component_type_r_8: - case cgltf_component_type_r_8u: - return accessor->stride != dim; - case cgltf_component_type_r_16: - case cgltf_component_type_r_16u: - return accessor->stride != dim * 2; - case cgltf_component_type_r_32u: - case cgltf_component_type_r_32f: - return accessor->stride != dim * 4; - default: - assert_invariant(false); - return true; - } -} - -static void decodeDracoMeshes(FFilamentAsset* asset) { - DracoCache* dracoCache = &asset->mSourceAsset->dracoCache; - - // For a given primitive and attribute, find the corresponding accessor. - auto findAccessor = [](const cgltf_primitive* prim, cgltf_attribute_type type, cgltf_int idx) { - for (cgltf_size i = 0; i < prim->attributes_count; i++) { - const cgltf_attribute& attr = prim->attributes[i]; - if (attr.type == type && attr.index == idx) { - return attr.data; - } - } - return (cgltf_accessor*) nullptr; - }; - - // Go through every primitive and check if it has a Draco mesh. - for (auto& [prim, vertexBuffer] : asset->mPrimitives) { - if (!prim->has_draco_mesh_compression) { - continue; - } - - const cgltf_draco_mesh_compression& draco = prim->draco_mesh_compression; - - // If an error occurs, we can simply set the primitive's associated VertexBuffer to null. - // This does not cause a leak because it is a weak reference. - - // Check if we have already decoded this mesh. - DracoMesh* mesh = dracoCache->findOrCreateMesh(draco.buffer_view); - if (!mesh) { - slog.e << "Cannot decompress mesh, Draco decoding error." << io::endl; - vertexBuffer = nullptr; - continue; - } - - // Copy over the decompressed data, converting the data type if necessary. - if (prim->indices && !mesh->getFaceIndices(prim->indices)) { - vertexBuffer = nullptr; - continue; - } - - // Go through each attribute in the decompressed mesh. - for (cgltf_size i = 0; i < draco.attributes_count; i++) { - - // In cgltf, each Draco attribute's data pointer is an attribute id, not an accessor. - const uint32_t id = draco.attributes[i].data - asset->mSourceAsset->hierarchy->accessors; - - // Find the destination accessor; this contains the desired component type, etc. - const cgltf_attribute_type type = draco.attributes[i].type; - const cgltf_int index = draco.attributes[i].index; - cgltf_accessor* accessor = findAccessor(prim, type, index); - if (!accessor) { - slog.w << "Cannot find matching accessor for Draco id " << id << io::endl; - continue; - } - - // Copy over the decompressed data, converting the data type if necessary. - if (!mesh->getVertexAttributes(id, accessor)) { - vertexBuffer = nullptr; - break; - } - } - } -} - -static void decodeMeshoptCompression(cgltf_data* data) { - for (size_t i = 0; i < data->buffer_views_count; ++i) { - if (!data->buffer_views[i].has_meshopt_compression) { - continue; - } - - cgltf_meshopt_compression* compression = &data->buffer_views[i].meshopt_compression; - const uint8_t* source = (const uint8_t*) compression->buffer->data; - assert_invariant(source); - source += compression->offset; - - // This memory is freed by cgltf. - void* destination = malloc(compression->count * compression->stride); - assert_invariant(destination); - - int error = 0; - switch (compression->mode) { - case cgltf_meshopt_compression_mode_invalid: - break; - case cgltf_meshopt_compression_mode_attributes: - error = meshopt_decodeVertexBuffer(destination, compression->count, compression->stride, - source, compression->size); - break; - case cgltf_meshopt_compression_mode_triangles: - error = meshopt_decodeIndexBuffer(destination, compression->count, compression->stride, - source, compression->size); - break; - case cgltf_meshopt_compression_mode_indices: - error = meshopt_decodeIndexSequence(destination, compression->count, compression->stride, - source, compression->size); - break; - default: - assert_invariant(false); - break; - } - assert_invariant(!error); - - switch (compression->filter) { - case cgltf_meshopt_compression_filter_none: - break; - case cgltf_meshopt_compression_filter_octahedral: - meshopt_decodeFilterOct(destination, compression->count, compression->stride); - break; - case cgltf_meshopt_compression_filter_quaternion: - meshopt_decodeFilterQuat(destination, compression->count, compression->stride); - break; - case cgltf_meshopt_compression_filter_exponential: - meshopt_decodeFilterExp(destination, compression->count, compression->stride); - break; - default: - assert_invariant(false); - break; - } - - data->buffer_views[i].data = destination; - } -} - // Parses a data URI and returns a blob that gets malloc'd in cgltf, which the caller must free. // (implementation snarfed from meshoptimizer) -static const uint8_t* parseDataUri(const char* uri, std::string* mimeType, size_t* psize) { +uint8_t const* parseDataUri(const char* uri, std::string* mimeType, size_t* psize) { if (strncmp(uri, "data:", 5) != 0) { return nullptr; } @@ -310,12 +156,181 @@ static const uint8_t* parseDataUri(const char* uri, std::string* mimeType, size_ return nullptr; } +inline void normalizeSkinningWeights(cgltf_data const* gltf) { + auto normalize = [](cgltf_accessor* data) { + if (data->type != cgltf_type_vec4 || data->component_type != cgltf_component_type_r_32f) { + slog.w << "Cannot normalize weights, unsupported attribute type." << io::endl; + return; + } + uint8_t* bytes = (uint8_t*) data->buffer_view->buffer->data; + bytes += data->offset + data->buffer_view->offset; + for (cgltf_size i = 0, n = data->count; i < n; ++i, bytes += data->stride) { + float4* weights = (float4*) bytes; + const float sum = weights->x + weights->y + weights->z + weights->w; + *weights /= sum; + } + }; + cgltf_size mcount = gltf->meshes_count; + for (cgltf_size mindex = 0; mindex < mcount; ++mindex) { + const cgltf_mesh& mesh = gltf->meshes[mindex]; + cgltf_size pcount = mesh.primitives_count; + for (cgltf_size pindex = 0; pindex < pcount; ++pindex) { + const cgltf_primitive& prim = mesh.primitives[pindex]; + cgltf_size acount = prim.attributes_count; + for (cgltf_size aindex = 0; aindex < acount; ++aindex) { + const auto& attr = prim.attributes[aindex]; + if (attr.type == cgltf_attribute_type_weights) { + normalize(attr.data); + } + } + } + } +} + +inline void createSkins(cgltf_data const* gltf, bool normalize, + utils::FixedCapacityVector& skins) { + // For each skin, optionally normalize skinning weights and store a copy of the bind matrices. + if (gltf->skins_count == 0) { + return; + } + if (normalize) { + normalizeSkinningWeights(gltf); + } + skins.reserve(gltf->skins_count); + for (cgltf_size i = 0, len = gltf->skins_count; i < len; ++i) { + const cgltf_skin& srcSkin = gltf->skins[i]; + CString name; + if (srcSkin.name) { + name = CString(srcSkin.name); + } + const cgltf_accessor* srcMatrices = srcSkin.inverse_bind_matrices; + FixedCapacityVector inverseBindMatrices(srcSkin.joints_count); + if (srcMatrices) { + uint8_t* bytes = nullptr; + uint8_t* srcBuffer = nullptr; + if (srcMatrices->buffer_view->has_meshopt_compression) { + bytes = (uint8_t*) srcMatrices->buffer_view->data; + srcBuffer = bytes + srcMatrices->offset; + } else { + bytes = (uint8_t*) srcMatrices->buffer_view->buffer->data; + srcBuffer = bytes + srcMatrices->offset + srcMatrices->buffer_view->offset; + } + assert_invariant(bytes); + memcpy((uint8_t*) inverseBindMatrices.data(), (const void*) srcBuffer, + srcSkin.joints_count * sizeof(mat4f)); + } + FFilamentAsset::Skin skin{ + .name = std::move(name), + .inverseBindMatrices = std::move(inverseBindMatrices), + }; + skins.emplace_back(std::move(skin)); + } +} + +inline void uploadBuffers(FFilamentAsset* asset, Engine& engine, + UriDataCacheHandle uriDataCache) { + // Upload VertexBuffer and IndexBuffer data to the GPU. + auto& slots = std::get(asset->mResourceInfo).mBufferSlots; + for (auto const& slot: slots) { + const cgltf_accessor* accessor = slot.accessor; + if (!accessor->buffer_view) { + continue; + } + const uint8_t* bufferData = nullptr; + const uint8_t* data = nullptr; + if (accessor->buffer_view->has_meshopt_compression) { + bufferData = (const uint8_t*) accessor->buffer_view->data; + data = bufferData + accessor->offset; + } else { + bufferData = (const uint8_t*) accessor->buffer_view->buffer->data; + data = utility::computeBindingOffset(accessor) + bufferData; + } + assert_invariant(bufferData); + const uint32_t size = utility::computeBindingSize(accessor); + if (slot.vertexBuffer) { + if (utility::requiresConversion(accessor)) { + const size_t floatsCount = accessor->count * cgltf_num_components(accessor->type); + const size_t floatsByteCount = sizeof(float) * floatsCount; + float* floatsData = (float*) malloc(floatsByteCount); + cgltf_accessor_unpack_floats(accessor, floatsData, floatsCount); + BufferObject* bo = BufferObject::Builder().size(floatsByteCount).build(engine); + asset->mBufferObjects.push_back(bo); + bo->setBuffer(engine, BufferDescriptor(floatsData, floatsByteCount, FREE_CALLBACK)); + slot.vertexBuffer->setBufferObjectAt(engine, slot.bufferIndex, bo); + continue; + } + + BufferObject* bo = BufferObject::Builder().size(size).build(engine); + asset->mBufferObjects.push_back(bo); + bo->setBuffer(engine, BufferDescriptor(data, size, uploadCallback, + uploadUserdata(asset, uriDataCache))); + slot.vertexBuffer->setBufferObjectAt(engine, slot.bufferIndex, bo); + continue; + } else if (slot.indexBuffer) { + if (accessor->component_type == cgltf_component_type_r_8u) { + const size_t size16 = size * 2; + uint16_t* data16 = (uint16_t*) malloc(size16); + utility::convertBytesToShorts(data16, data, size); + IndexBuffer::BufferDescriptor bd(data16, size16, FREE_CALLBACK); + + slot.indexBuffer->setBuffer(engine, std::move(bd)); + continue; + } + IndexBuffer::BufferDescriptor bd(data, size, uploadCallback, + uploadUserdata(asset, uriDataCache)); + slot.indexBuffer->setBuffer(engine, std::move(bd)); + continue; + } + + // If the buffer slot does not have an associated VertexBuffer or IndexBuffer, then this + // must be a morph target. + assert(slot.morphTargetBuffer); + + if (utility::requiresPacking(accessor)) { + const size_t floatsCount = accessor->count * cgltf_num_components(accessor->type); + const size_t floatsByteCount = sizeof(float) * floatsCount; + float* floatsData = (float*) malloc(floatsByteCount); + cgltf_accessor_unpack_floats(accessor, floatsData, floatsCount); + if (accessor->type == cgltf_type_vec3) { + slot.morphTargetBuffer->setPositionsAt(engine, slot.bufferIndex, + (const float3*) floatsData, + slot.morphTargetCount, + slot.morphTargetOffset); + } else { + slot.morphTargetBuffer->setPositionsAt(engine, slot.bufferIndex, + (const float4*) data, slot.morphTargetBuffer->getVertexCount(), + slot.morphTargetOffset); + } + free(floatsData); + continue; + } + + if (accessor->type == cgltf_type_vec3) { + slot.morphTargetBuffer->setPositionsAt(engine, slot.bufferIndex, (const float3*) data, + slot.morphTargetCount, + slot.morphTargetOffset); + } else { + assert_invariant(accessor->type == cgltf_type_vec4); + slot.morphTargetBuffer->setPositionsAt(engine, slot.bufferIndex, (const float4*) data, + slot.morphTargetCount, + slot.morphTargetOffset); + } + } +} + +} // anonymous namespace + ResourceLoader::ResourceLoader(const ResourceConfiguration& config) : pImpl(new Impl(config)) { } ResourceLoader::~ResourceLoader() { delete pImpl; } +void ResourceLoader::setConfiguration(const ResourceConfiguration& config) { + pImpl->mNormalizeSkinningWeights = config.normalizeSkinningWeights; + pImpl->mGltfPath = config.gltfPath; +} + void ResourceLoader::addResourceData(const char* uri, BufferDescriptor&& buffer) { pImpl->addResourceData(uri, std::move(buffer)); } @@ -349,17 +364,17 @@ void ResourceLoader::Impl::addResourceData(const char* uri, BufferDescriptor&& b // Start an async marker the first time this is called and end it when // finalization begins. This marker provides a rough indicator of how long // the client is taking to load raw data blobs from storage. - if (mUriDataCache.empty()) { + if (mUriDataCache->empty()) { SYSTRACE_CONTEXT(); SYSTRACE_ASYNC_BEGIN("addResourceData", 1); } // NOTE: replacing an existing item in a robin map does not seem to behave as expected. // To work around this, we explicitly erase the old element if it already exists. - auto iter = mUriDataCache.find(uri); - if (iter != mUriDataCache.end()) { - mUriDataCache.erase(iter); + auto iter = mUriDataCache->find(uri); + if (iter != mUriDataCache->end()) { + mUriDataCache->erase(iter); } - mUriDataCache.emplace(uri, std::move(buffer)); + mUriDataCache->emplace(uri, std::move(buffer)); // If this is a texture and async loading has already started, add a new decoder job. if (isTexture(uri) && mAsyncAsset && mRemainingTextureDownloads > 0) { @@ -368,16 +383,24 @@ void ResourceLoader::Impl::addResourceData(const char* uri, BufferDescriptor&& b } bool ResourceLoader::hasResourceData(const char* uri) const { - return pImpl->mUriDataCache.find(uri) != pImpl->mUriDataCache.end(); + return pImpl->mUriDataCache->find(uri) != pImpl->mUriDataCache->end(); } void ResourceLoader::evictResourceData() { // Note that this triggers BufferDescriptor callbacks. - pImpl->mUriDataCache.clear(); + pImpl->mUriDataCache->clear(); } bool ResourceLoader::loadResources(FilamentAsset* asset) { FFilamentAsset* fasset = downcast(asset); + + // This is a workaround in case of using extended algo, please see description in + // FFilamentAsset.h + if (fasset->isUsingExtendedAlgorithm()) { + pImpl->mUriDataCache = + std::get(fasset->mResourceInfo).uriDataCache; + } + return loadResources(fasset, false); } @@ -390,6 +413,8 @@ bool ResourceLoader::loadResources(FFilamentAsset* asset, bool async) { } asset->mResourcesLoaded = true; + bool const isExtendedAlgo = asset->isUsingExtendedAlgorithm(); + // At this point, any entities that are created in the future (i.e. dynamically added instances) // will not need the progressive feature to be enabled. This simplifies the dependency graph and // prevents it from growing. @@ -400,190 +425,42 @@ bool ResourceLoader::loadResources(FFilamentAsset* asset, bool async) { pImpl->mBufferTextureCache.clear(); pImpl->mFilepathTextureCache.clear(); - const cgltf_data* gltf = asset->mSourceAsset->hierarchy; - cgltf_options options {}; - - // For emscripten and Android builds we supply a custom file reader callback that looks inside a - // cache of externally-supplied data blobs, rather than loading from the filesystem. - - SYSTRACE_NAME_BEGIN("Load buffers"); - #if !GLTFIO_USE_FILESYSTEM - - struct Closure { - Impl* impl; - const cgltf_data* gltf; - }; - - Closure closure = { pImpl, gltf }; - - options.file.user_data = &closure; - - options.file.read = [](const cgltf_memory_options* memoryOpts, - const cgltf_file_options* fileOpts, const char* path, cgltf_size* size, void** data) { - Closure* closure = (Closure*) fileOpts->user_data; - auto& uriDataCache = closure->impl->mUriDataCache; - - if (auto iter = uriDataCache.find(path); iter != uriDataCache.end()) { - *size = iter->second.size; - *data = iter->second.buffer; - } else { - // Even if we don't find the given resource in the cache, we still return a successful - // error code, because we allow downloads to finish after the decoding work starts. - *size = 0; - *data = 0; - } - - return cgltf_result_success; - }; - - #endif + cgltf_data const* gltf = asset->mSourceAsset->hierarchy; - // Read data from the file system and base64 URIs. - cgltf_result result = cgltf_load_buffers(&options, (cgltf_data*) gltf, pImpl->mGltfPath.c_str()); - if (result != cgltf_result_success) { - slog.e << "Unable to load resources." << io::endl; - return false; - } - - SYSTRACE_NAME_END(); - - #ifndef NDEBUG - if (cgltf_validate((cgltf_data*) gltf) != cgltf_result_success) { - slog.e << "Failed cgltf validation." << io::endl; - return false; - } - #endif - // Decompress Draco meshes early on, which allows us to exploit subsequent processing such as - // tangent generation. - decodeDracoMeshes(asset); - decodeMeshoptCompression((cgltf_data*) gltf); - - // For each skin, optionally normalize skinning weights and store a copy of the bind matrices. - if (gltf->skins_count > 0) { - if (pImpl->mNormalizeSkinningWeights) { - normalizeSkinningWeights(asset); - } - asset->mSkins.reserve(gltf->skins_count); - for (cgltf_size i = 0, len = gltf->skins_count; i < len; ++i) { - const cgltf_skin& srcSkin = gltf->skins[i]; - CString name; - if (srcSkin.name) { - name = CString(srcSkin.name); - } - const cgltf_accessor* srcMatrices = srcSkin.inverse_bind_matrices; - FixedCapacityVector inverseBindMatrices(srcSkin.joints_count); - if (srcMatrices) { - uint8_t* bytes = nullptr; - uint8_t* srcBuffer = nullptr; - if (srcMatrices->buffer_view->has_meshopt_compression) { - bytes = (uint8_t*) srcMatrices->buffer_view->data; - srcBuffer = bytes + srcMatrices->offset; - } else { - bytes = (uint8_t*) srcMatrices->buffer_view->buffer->data; - srcBuffer = bytes + srcMatrices->offset + srcMatrices->buffer_view->offset; - } - assert_invariant(bytes); - memcpy((uint8_t*) inverseBindMatrices.data(), - (const void*) srcBuffer, srcSkin.joints_count * sizeof(mat4f)); - } - FFilamentAsset::Skin skin { - .name = std::move(name), - .inverseBindMatrices = std::move(inverseBindMatrices), - }; - asset->mSkins.emplace_back(std::move(skin)); - } - } - - Engine& engine = *pImpl->mEngine; + if (!isExtendedAlgo) { + utility::loadCgltfBuffers(gltf, pImpl->mGltfPath.c_str(), pImpl->mUriDataCache); - // Upload VertexBuffer and IndexBuffer data to the GPU. - for (auto slot : asset->mBufferSlots) { - const cgltf_accessor* accessor = slot.accessor; - if (!accessor->buffer_view) { - continue; - } - const uint8_t* bufferData = nullptr; - const uint8_t* data = nullptr; - if (accessor->buffer_view->has_meshopt_compression) { - bufferData = (const uint8_t*) accessor->buffer_view->data; - data = bufferData + accessor->offset; - } else { - bufferData = (const uint8_t*) accessor->buffer_view->buffer->data; - data = computeBindingOffset(accessor) + bufferData; - } - assert_invariant(bufferData); - const uint32_t size = computeBindingSize(accessor); - if (slot.vertexBuffer) { - if (requiresConversion(accessor)) { - const size_t floatsCount = accessor->count * cgltf_num_components(accessor->type); - const size_t floatsByteCount = sizeof(float) * floatsCount; - float* floatsData = (float*) malloc(floatsByteCount); - cgltf_accessor_unpack_floats(accessor, floatsData, floatsCount); - BufferObject* bo = BufferObject::Builder().size(floatsByteCount).build(engine); - asset->mBufferObjects.push_back(bo); - bo->setBuffer(engine, BufferDescriptor(floatsData, floatsByteCount, FREE_CALLBACK)); - slot.vertexBuffer->setBufferObjectAt(engine, slot.bufferIndex, bo); - continue; - } - BufferObject* bo = BufferObject::Builder().size(size).build(engine); - asset->mBufferObjects.push_back(bo); - bo->setBuffer(engine, BufferDescriptor(data, size, - uploadCallback, uploadUserdata(asset))); - slot.vertexBuffer->setBufferObjectAt(engine, slot.bufferIndex, bo); - continue; - } else if (slot.indexBuffer) { - if (accessor->component_type == cgltf_component_type_r_8u) { - const size_t size16 = size * 2; - uint16_t* data16 = (uint16_t*) malloc(size16); - convertBytesToShorts(data16, data, size); - IndexBuffer::BufferDescriptor bd(data16, size16, FREE_CALLBACK); - slot.indexBuffer->setBuffer(engine, std::move(bd)); + // Decompress Draco meshes early on, which allows us to exploit subsequent processing such + // as tangent generation. + DracoCache* dracoCache = &asset->mSourceAsset->dracoCache; + auto& primitives = std::get(asset->mResourceInfo).mPrimitives; + // Go through every primitive and check if it has a Draco mesh. + for (auto& [prim, vertexBuffer]: primitives) { + if (!prim->has_draco_mesh_compression) { continue; } - IndexBuffer::BufferDescriptor bd(data, size, uploadCallback, uploadUserdata(asset)); - slot.indexBuffer->setBuffer(engine, std::move(bd)); - continue; + utility::decodeDracoMeshes(gltf, prim, dracoCache); } + utility::decodeMeshoptCompression((cgltf_data*) gltf); - // If the buffer slot does not have an associated VertexBuffer or IndexBuffer, then this - // must be a morph target. - assert(slot.morphTargetBuffer); + uploadBuffers(asset, *pImpl->mEngine, pImpl->mUriDataCache); - if (requiresPacking(accessor)) { - const size_t floatsCount = accessor->count * cgltf_num_components(accessor->type); - const size_t floatsByteCount = sizeof(float) * floatsCount; - float* floatsData = (float*) malloc(floatsByteCount); - cgltf_accessor_unpack_floats(accessor, floatsData, floatsCount); - if (accessor->type == cgltf_type_vec3) { - slot.morphTargetBuffer->setPositionsAt(engine, slot.bufferIndex, - (const float3*) floatsData, slot.morphTargetBuffer->getVertexCount()); - } else { - slot.morphTargetBuffer->setPositionsAt(engine, slot.bufferIndex, - (const float4*) data, slot.morphTargetBuffer->getVertexCount()); - } - free(floatsData); - continue; - } + // Compute surface orientation quaternions if necessary. This is similar to sparse data in + // that we need to generate the contents of a GPU buffer by processing one or more CPU + // buffer(s). + pImpl->computeTangents(asset); - if (accessor->type == cgltf_type_vec3) { - slot.morphTargetBuffer->setPositionsAt(engine, slot.bufferIndex, - (const float3*) data, slot.morphTargetBuffer->getVertexCount()); - } else { - assert_invariant(accessor->type == cgltf_type_vec4); - slot.morphTargetBuffer->setPositionsAt(engine, slot.bufferIndex, - (const float4*) data, slot.morphTargetBuffer->getVertexCount()); - } + std::get(asset->mResourceInfo).mBufferSlots.clear(); + std::get(asset->mResourceInfo).mPrimitives.clear(); + } else { + auto& slots = std::get(asset->mResourceInfo).slots; + ResourceLoaderExtended::loadResources(slots, pImpl->mEngine, asset->mBufferObjects); } - // Compute surface orientation quaternions if necessary. This is similar to sparse data in that - // we need to generate the contents of a GPU buffer by processing one or more CPU buffer(s). - pImpl->computeTangents(asset); - - asset->mBufferSlots = {}; - asset->mPrimitives = {}; + createSkins(gltf, pImpl->mNormalizeSkinningWeights, asset->mSkins); // If any decoding jobs are still underway from a previous load, wait for them to finish. - for (const auto& iter : pImpl->mTextureProviders) { + for (const auto& iter: pImpl->mTextureProviders) { iter.second->waitForCompletion(); iter.second->updateQueue(); } @@ -665,11 +542,13 @@ std::pair ResourceLoader::Impl::getOrCreateTexture(FFilam mime = extension == "jpg" ? "image/jpeg" : "image/" + extension; } - TextureProvider* provider = mTextureProviders[mime]; - if (!provider) { + auto foundProvider = mTextureProviders.find(mime); + if (foundProvider == mTextureProviders.end()) { slog.e << "Missing texture provider for " << mime << io::endl; return {}; } + TextureProvider* provider = foundProvider->second; + assert_invariant(provider); // Check if the texture slot uses BufferView data. if (void** bufferViewData = bv ? &bv->buffer->data : nullptr; bufferViewData) { @@ -703,7 +582,7 @@ std::pair ResourceLoader::Impl::getOrCreateTexture(FFilam } // Check the user-supplied resource cache for this URI. - else if (auto iter = mUriDataCache.find(uri); iter != mUriDataCache.end()) { + else if (auto iter = mUriDataCache->find(uri); iter != mUriDataCache->end()) { const uint8_t* sourceData = (const uint8_t*) iter->second.buffer; if (auto iter = mBufferTextureCache.find(sourceData); iter != mBufferTextureCache.end()) { return {iter->second, CacheResult::FOUND}; @@ -802,7 +681,9 @@ void ResourceLoader::Impl::computeTangents(FFilamentAsset* asset) { // Collect all TANGENT vertex attribute slots that need to be populated. tsl::robin_map baseTangents; - for (auto slot : asset->mBufferSlots) { + auto& slots = std::get(asset->mResourceInfo).mBufferSlots; + auto& primitives = std::get(asset->mResourceInfo).mPrimitives; + for (auto const& slot: slots) { if (slot.accessor != kGenerateTangents && slot.accessor != kGenerateNormals) { continue; } @@ -812,13 +693,13 @@ void ResourceLoader::Impl::computeTangents(FFilamentAsset* asset) { // Create a job description for each triangle-based primitive. using Params = TangentsJob::Params; std::vector jobParams; - for (auto [prim, vb] : asset->mPrimitives) { + for (auto const& [prim, vb] : primitives) { if (UTILS_UNLIKELY(prim->type != cgltf_primitive_type_triangles)) { continue; } auto iter = baseTangents.find(vb); if (iter != baseTangents.end()) { - jobParams.emplace_back(Params {{ prim }, {vb, nullptr, iter->second }}); + jobParams.emplace_back(Params {{ prim }, {vb, nullptr, 0, iter->second }}); } } @@ -831,7 +712,8 @@ void ResourceLoader::Impl::computeTangents(FFilamentAsset* asset) { } for (cgltf_size pindex = 0, pcount = mesh.primitives_count; pindex < pcount; ++pindex) { const cgltf_primitive& prim = mesh.primitives[pindex]; - MorphTargetBuffer* tb = prims[pindex].targets; + MorphTargetBuffer* const tb = prims[pindex].morphTargetBuffer; + uint32_t const morphTargetOffset = prims[pindex].morphTargetOffset; for (cgltf_size tindex = 0, tcount = prim.targets_count; tindex < tcount; ++tindex) { const cgltf_morph_target& target = prim.targets[tindex]; bool hasNormals = false; @@ -843,13 +725,13 @@ void ResourceLoader::Impl::computeTangents(FFilamentAsset* asset) { } hasNormals = true; jobParams.emplace_back(Params { { &prim, (int) tindex }, - { nullptr, tb, (uint8_t) pindex } }); + { nullptr, tb, morphTargetOffset, (uint8_t) pindex } }); break; } // Generate flat normals if necessary. - if (!hasNormals && !prim.material->unlit) { + if (!hasNormals && prim.material && !prim.material->unlit) { jobParams.emplace_back(Params { { &prim, (int) tindex }, - { nullptr, tb, (uint8_t) pindex } }); + { nullptr, tb, morphTargetOffset, (uint8_t) pindex } }); } } } @@ -876,7 +758,7 @@ void ResourceLoader::Impl::computeTangents(FFilamentAsset* asset) { } else { assert_invariant(params.context.tb); params.context.tb->setTangentsAt(*mEngine, params.in.morphTargetIndex, - params.out.results, params.out.vertexCount); + params.out.results, params.out.vertexCount, params.context.offset); free(params.out.results); } } @@ -888,36 +770,4 @@ ResourceLoader::Impl::~Impl() { } } -void ResourceLoader::normalizeSkinningWeights(FFilamentAsset* asset) const { - auto normalize = [](cgltf_accessor* data) { - if (data->type != cgltf_type_vec4 || data->component_type != cgltf_component_type_r_32f) { - slog.w << "Cannot normalize weights, unsupported attribute type." << io::endl; - return; - } - uint8_t* bytes = (uint8_t*) data->buffer_view->buffer->data; - bytes += data->offset + data->buffer_view->offset; - for (cgltf_size i = 0, n = data->count; i < n; ++i, bytes += data->stride) { - float4* weights = (float4*) bytes; - const float sum = weights->x + weights->y + weights->z + weights->w; - *weights /= sum; - } - }; - const cgltf_data* gltf = asset->mSourceAsset->hierarchy; - cgltf_size mcount = gltf->meshes_count; - for (cgltf_size mindex = 0; mindex < mcount; ++mindex) { - const cgltf_mesh& mesh = gltf->meshes[mindex]; - cgltf_size pcount = mesh.primitives_count; - for (cgltf_size pindex = 0; pindex < pcount; ++pindex) { - const cgltf_primitive& prim = mesh.primitives[pindex]; - cgltf_size acount = prim.attributes_count; - for (cgltf_size aindex = 0; aindex < acount; ++aindex) { - const auto& attr = prim.attributes[aindex]; - if (attr.type == cgltf_attribute_type_weights) { - normalize(attr.data); - } - } - } - } -} - } // namespace filament::gltfio diff --git a/libs/gltfio/src/StbProvider.cpp b/libs/gltfio/src/StbProvider.cpp index 4c5f811b315..c5900fd426f 100644 --- a/libs/gltfio/src/StbProvider.cpp +++ b/libs/gltfio/src/StbProvider.cpp @@ -126,7 +126,7 @@ Texture* StbProvider::pushTexture(const uint8_t* data, size_t byteCount, } JobSystem* js = &mEngine->getJobSystem(); - info->decoderJob = jobs::createJob(*js, mDecoderRootJob, [this, info] { + info->decoderJob = jobs::createJob(*js, mDecoderRootJob, [info] { auto& source = info->sourceBuffer; int width, height, comp; @@ -219,6 +219,22 @@ void StbProvider::cancelDecoding() { // in-flight jobs. We should consider throttling the number of simultaneous decoder jobs, which // would allow for actual cancellation. waitForCompletion(); + + // For cancelled jobs, we need to set the TextureInfo to the popped state and free the decoded + // data. + for (auto& info : mTextures) { + if (info->state != TextureState::DECODING) { + continue; + } + // Deleting data here should be safe thread-wise as the only other place where + // decodedTexelsBaseMipmap is loaded is in the job threads, and we have waited them to + // completion above. We also expect the TextureProvider API calls to be made only from one + // thread. + if (intptr_t data = info->decodedTexelsBaseMipmap.load()) { + delete [] (uint8_t*) data; + } + info->state = TextureState::POPPED; + } } const char* StbProvider::getPushMessage() const { diff --git a/libs/gltfio/src/TangentsJob.cpp b/libs/gltfio/src/TangentsJob.cpp index 6152387bd71..8194fb5c765 100644 --- a/libs/gltfio/src/TangentsJob.cpp +++ b/libs/gltfio/src/TangentsJob.cpp @@ -49,7 +49,7 @@ void TangentsJob::run(Params* params) { std::unique_ptr morphDeltas; // Build a mapping from cgltf_attribute_type to cgltf_accessor. - const int NUM_ATTRIBUTES = 8; + const int NUM_ATTRIBUTES = cgltf_attribute_type_max_enum; const cgltf_accessor* baseAccessors[NUM_ATTRIBUTES] = {}; const cgltf_accessor* morphTargetAccessors[NUM_ATTRIBUTES] = {}; diff --git a/libs/gltfio/src/TangentsJob.h b/libs/gltfio/src/TangentsJob.h index 43011e25c58..6aeed1ea3bf 100644 --- a/libs/gltfio/src/TangentsJob.h +++ b/libs/gltfio/src/TangentsJob.h @@ -47,6 +47,7 @@ struct TangentsJob { struct Context { VertexBuffer* const vb; MorphTargetBuffer* const tb; + uint32_t const offset; const uint8_t slot; }; diff --git a/libs/gltfio/src/TrsTransformManager.cpp b/libs/gltfio/src/TrsTransformManager.cpp new file mode 100644 index 00000000000..5548bc94530 --- /dev/null +++ b/libs/gltfio/src/TrsTransformManager.cpp @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "FTrsTransformManager.h" + +#include + +#include "downcast.h" +#include "gltfio/TrsTransformManager.h" + +using namespace utils; + +namespace filament::gltfio { + +using Instance = TrsTransformManager::Instance; + +void FTrsTransformManager::terminate() noexcept { + auto& manager = mManager; + if (!manager.empty()) { +#ifndef NDEBUG + utils::slog.d << "cleaning up " << manager.getComponentCount() + << " leaked trs transform components" << utils::io::endl; +#endif + while (!manager.empty()) { + Instance ci = manager.end() - 1; + manager.removeComponent(manager.getEntity(ci)); + } + } +} + +bool TrsTransformManager::hasComponent(Entity e) const noexcept { + return downcast(this)->hasComponent(e); +} + +Instance TrsTransformManager::getInstance(Entity e) const noexcept { + return downcast(this)->getInstance(e); +} + +void TrsTransformManager::create(Entity entity) { + downcast(this)->create(entity); +} + +void TrsTransformManager::create(Entity entity, const float3& translation, + const quatf& rotation, const float3& scale) { + downcast(this)->create(entity, translation, rotation, scale); +} + +void TrsTransformManager::destroy(Entity e) noexcept { + downcast(this)->destroy(e); +} + +void TrsTransformManager::setTranslation(Instance ci, const float3& translation) noexcept { + downcast(this)->setTranslation(ci, translation); +} + +const float3& TrsTransformManager::getTranslation(Instance ci) const noexcept { + return downcast(this)->getTranslation(ci); +} + +void TrsTransformManager::setRotation(Instance ci, const quatf& rotation) noexcept { + downcast(this)->setRotation(ci, rotation); +} + +const quatf& TrsTransformManager::getRotation(Instance ci) const noexcept { + return downcast(this)->getRotation(ci); +} + +void TrsTransformManager::setScale(Instance ci, const float3& scale) noexcept { + downcast(this)->setScale(ci, scale); +} + +const float3& TrsTransformManager::getScale(Instance ci) const noexcept { + return downcast(this)->getScale(ci); +} + +void TrsTransformManager::setTrs(Instance ci, const float3& translation, + const quatf& rotation, const float3& scale) noexcept { + downcast(this)->setTrs(ci, translation, rotation, scale); +} + +const mat4f TrsTransformManager::getTransform(Instance ci) const noexcept { + return downcast(this)->getTransform(ci); +} + +} // namespace filament::gltfio diff --git a/libs/gltfio/src/UbershaderProvider.cpp b/libs/gltfio/src/UbershaderProvider.cpp index 8196273f232..d70c5ab6955 100644 --- a/libs/gltfio/src/UbershaderProvider.cpp +++ b/libs/gltfio/src/UbershaderProvider.cpp @@ -63,6 +63,42 @@ static void prepareConfig(MaterialKey* config, const char* label) { config->hasSheen = false; config->hasIOR = false; } + + if (config->useSpecularGlossiness && config->hasSpecular) { + slog.w << "SpecularGlossiness and specular are not supported together in ubershader mode," + " removing specularGlossiness (" << label << ")." << io::endl; + + config->useSpecularGlossiness = false; + } + + if (config->unlit && config->hasSpecular) { + slog.w << "Unlit and specular are not supported together in ubershader mode," + " removing unlit (" << label << ")." << io::endl; + + config->unlit = false; + } + + // Also due to sampler overload, clearcoat with specular, we can only support with specular map. + if ((config->hasClearCoatNormalTexture || config->hasClearCoatRoughnessTexture) && config->hasSpecular) { + slog.w << "Specular can only work with clearcoat that does not use clear coat normal or clear coat roughness map," + " removing clear coat normal and roughness (" << label << ")." << io::endl; + config->hasClearCoatNormalTexture = false; + config->hasClearCoatRoughnessTexture = false; + } + + // Also due to sampler overload, sheen with specular, we can only support without specular color texture. + if (config->hasSpecularColorTexture && config->hasSheen) { + slog.w << "Sheen can only work with specular that does not use specular color map," + " removing specular color (" << label << ")." << io::endl; + config->hasSpecularColorTexture = false; + } + + // Also due to sampler overload, volume with specular, we can only support without specular color texture. + if (config->hasSpecularColorTexture && config->hasVolume) { + slog.w << "Volume can only work with specular that does not use specular color map," + "removing specular color (" << label << ")." << io::endl; + config->hasSpecularColorTexture = false; + } } class UbershaderProvider : public MaterialProvider { @@ -155,6 +191,9 @@ Material* UbershaderProvider::getMaterial(const MaterialKey& config) const { requirements.features["SheenColorTexture"] = config.hasSheenColorTexture; requirements.features["SheenRoughnessTexture"] = config.hasSheenRoughnessTexture; requirements.features["VolumeThicknessTexture"] = config.hasVolumeThicknessTexture; + requirements.features["Specular"] = config.hasSpecular; + requirements.features["SpecularTexture"] = config.hasSpecularTexture; + requirements.features["SpecularColorTexture"] = config.hasSpecularColorTexture; if (Material* mat = mMaterials.getMaterial(requirements); mat != nullptr) { return mat; @@ -220,6 +259,24 @@ MaterialInstance* UbershaderProvider::createMaterialInstance(MaterialKey* config mi->setParameter("occlusionUvMatrix", identity); mi->setParameter("emissiveUvMatrix", identity); + // set to -1 all possibly optional parameters + for (auto const* param : { + "clearCoatIndex", + "clearCoatRoughnessIndex", + "clearCoatNormalIndex", + "sheenColorIndex", + "sheenRoughnessIndex", + "volumeThicknessUvMatrix", + "volumeThicknessIndex", + "transmissionIndex", + "specularIndex", + "specularColorIndex", + }) { + if (material->hasParameter(param)) { + mi->setParameter(param, -1); + } + } + if (config->hasClearCoat) { mi->setParameter("clearCoatIndex", getUvIndex(config->clearCoatUV, config->hasClearCoatTexture)); @@ -250,6 +307,14 @@ MaterialInstance* UbershaderProvider::createMaterialInstance(MaterialKey* config mi->setParameter("transmissionIndex", getUvIndex(config->transmissionUV, config->hasTransmissionTexture)); } + if (config->hasSpecular) { + mi->setParameter("specularUvMatrix", identity); + mi->setParameter("specularIndex", + getUvIndex(config->specularTextureUV, config->hasSpecularTexture)); + mi->setParameter("specularColorUvMatrix", identity); + mi->setParameter("specularColorIndex", + getUvIndex(config->specularColorTextureUV, config->hasSpecularColorTexture)); + } } TextureSampler sampler; @@ -293,13 +358,29 @@ MaterialInstance* UbershaderProvider::createMaterialInstance(MaterialKey* config mi->setParameter("sheenRoughnessMap", mDummyTexture, sampler); } - if (mi->getMaterial()->hasParameter("ior")) { + if (material->hasParameter("ior")) { mi->setParameter("ior", 1.5f); } - if (mi->getMaterial()->hasParameter("reflectance")) { + if (material->hasParameter("reflectance")) { mi->setParameter("reflectance", 0.5f); } + if (needsTexture("SpecularTexture")) { + mi->setParameter("specularMap", mDummyTexture, sampler); + } + + if (needsTexture("SpecularColorTexture")) { + mi->setParameter("specularColorMap", mDummyTexture, sampler); + } + + if (material->hasParameter("specularColorFactor")) { + mi->setParameter("specularColorFactor", float3(1.0f)); + } + + if (material->hasParameter("specularStrength")) { + mi->setParameter("specularStrength", 1.0f); + } + return mi; } @@ -338,6 +419,7 @@ const char* toString(BlendingMode blendingMode) noexcept { case BlendingMode::FADE: return "fade"; case BlendingMode::MULTIPLY: return "multiply"; case BlendingMode::SCREEN: return "screen"; + case BlendingMode::CUSTOM: return "custom"; } } diff --git a/libs/gltfio/src/Utility.cpp b/libs/gltfio/src/Utility.cpp new file mode 100644 index 00000000000..f875f71a4ea --- /dev/null +++ b/libs/gltfio/src/Utility.cpp @@ -0,0 +1,265 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Utility.h" + +#include "DracoCache.h" +#include "FFilamentAsset.h" +#include "GltfEnums.h" + +#include +#include + +#define CGLTF_IMPLEMENTATION +#include +#include + +namespace filament::gltfio::utility { + +using namespace utils; + +void decodeDracoMeshes(cgltf_data const* gltf, cgltf_primitive const* prim, + DracoCache* dracoCache) { + if (!prim->has_draco_mesh_compression) { + return; + } + + // For a given primitive and attribute, find the corresponding accessor. + auto findAccessor = [](const cgltf_primitive* prim, cgltf_attribute_type type, cgltf_int idx) { + for (cgltf_size i = 0; i < prim->attributes_count; i++) { + const cgltf_attribute& attr = prim->attributes[i]; + if (attr.type == type && attr.index == idx) { + return attr.data; + } + } + return (cgltf_accessor*) nullptr; + }; + const cgltf_draco_mesh_compression& draco = prim->draco_mesh_compression; + + // Check if we have already decoded this mesh. + DracoMesh* mesh = dracoCache->findOrCreateMesh(draco.buffer_view); + if (!mesh) { + slog.e << "Cannot decompress mesh, Draco decoding error." << io::endl; + return; + } + + // Copy over the decompressed data, converting the data type if necessary. + if (prim->indices && !mesh->getFaceIndices(prim->indices)) { + return; + } + + // Go through each attribute in the decompressed mesh. + for (cgltf_size i = 0; i < draco.attributes_count; i++) { + + // In cgltf, each Draco attribute's data pointer is an attribute id, not an accessor. + const uint32_t id = draco.attributes[i].data - gltf->accessors; + + // Find the destination accessor; this contains the desired component type, etc. + const cgltf_attribute_type type = draco.attributes[i].type; + const cgltf_int index = draco.attributes[i].index; + cgltf_accessor* accessor = findAccessor(prim, type, index); + if (!accessor) { + slog.w << "Cannot find matching accessor for Draco id " << id << io::endl; + continue; + } + + // Copy over the decompressed data, converting the data type if necessary. + if (!mesh->getVertexAttributes(id, accessor)) { + break; + } + } +} + +void decodeMeshoptCompression(cgltf_data* data) { + for (size_t i = 0; i < data->buffer_views_count; ++i) { + if (!data->buffer_views[i].has_meshopt_compression) { + continue; + } + cgltf_meshopt_compression* compression = &data->buffer_views[i].meshopt_compression; + const uint8_t* source = (const uint8_t*) compression->buffer->data; + assert_invariant(source); + source += compression->offset; + + // This memory is freed by cgltf. + void* destination = malloc(compression->count * compression->stride); + assert_invariant(destination); + + UTILS_UNUSED_IN_RELEASE int error = 0; + switch (compression->mode) { + case cgltf_meshopt_compression_mode_invalid: + break; + case cgltf_meshopt_compression_mode_attributes: + error = meshopt_decodeVertexBuffer(destination, compression->count, + compression->stride, source, compression->size); + break; + case cgltf_meshopt_compression_mode_triangles: + error = meshopt_decodeIndexBuffer(destination, compression->count, + compression->stride, source, compression->size); + break; + case cgltf_meshopt_compression_mode_indices: + error = meshopt_decodeIndexSequence(destination, compression->count, + compression->stride, source, compression->size); + break; + default: + assert_invariant(false); + break; + } + assert_invariant(!error); + + switch (compression->filter) { + case cgltf_meshopt_compression_filter_none: + break; + case cgltf_meshopt_compression_filter_octahedral: + meshopt_decodeFilterOct(destination, compression->count, compression->stride); + break; + case cgltf_meshopt_compression_filter_quaternion: + meshopt_decodeFilterQuat(destination, compression->count, compression->stride); + break; + case cgltf_meshopt_compression_filter_exponential: + meshopt_decodeFilterExp(destination, compression->count, compression->stride); + break; + default: + assert_invariant(false); + break; + } + + data->buffer_views[i].data = destination; + } +} + +bool primitiveHasVertexColor(cgltf_primitive* inPrim) { + for (int slot = 0; slot < inPrim->attributes_count; slot++) { + const cgltf_attribute& inputAttribute = inPrim->attributes[slot]; + if (inputAttribute.type == cgltf_attribute_type_color) { + return true; + } + } + return false; +} + +// Sometimes a glTF bufferview includes unused data at the end (e.g. in skinning.gltf) so we need to +// compute the correct size of the vertex buffer. Filament automatically infers the size of +// driver-level vertex buffers from the attribute data (stride, count, offset) and clients are +// expected to avoid uploading data blobs that exceed this size. Since this information doesn't +// exist in the glTF we need to compute it manually. This is a bit of a cheat, cgltf_calc_size is +// private but its implementation file is available in this cpp file. +uint32_t computeBindingSize(cgltf_accessor const* accessor) { + cgltf_size element_size = cgltf_calc_size(accessor->type, accessor->component_type); + return uint32_t(accessor->stride * (accessor->count - 1) + element_size); +} + +void convertBytesToShorts(uint16_t* dst, uint8_t const* src, size_t count) { + for (size_t i = 0; i < count; ++i) { + dst[i] = src[i]; + } +} + +uint32_t computeBindingOffset(cgltf_accessor const* accessor) { + return uint32_t(accessor->offset + accessor->buffer_view->offset); +} + +bool requiresConversion(cgltf_accessor const* accessor) { + if (UTILS_UNLIKELY(accessor->is_sparse)) { + return true; + } + const cgltf_type type = accessor->type; + const cgltf_component_type ctype = accessor->component_type; + filament::VertexBuffer::AttributeType permitted; + filament::VertexBuffer::AttributeType actual; + UTILS_UNUSED_IN_RELEASE bool supported = getElementType(type, ctype, &permitted, &actual); + assert_invariant(supported && "Unsupported types"); + return permitted != actual; +} + +bool requiresPacking(cgltf_accessor const* accessor) { + if (requiresConversion(accessor)) { + return true; + } + const size_t dim = cgltf_num_components(accessor->type); + switch (accessor->component_type) { + case cgltf_component_type_r_8: + case cgltf_component_type_r_8u: + return accessor->stride != dim; + case cgltf_component_type_r_16: + case cgltf_component_type_r_16u: + return accessor->stride != dim * 2; + case cgltf_component_type_r_32u: + case cgltf_component_type_r_32f: + return accessor->stride != dim * 4; + default: + assert_invariant(false); + return true; + } +} + +bool loadCgltfBuffers(cgltf_data const* gltf, char const* gltfPath, + UriDataCacheHandle uriDataCacheHandle) { + SYSTRACE_CONTEXT(); + SYSTRACE_NAME_BEGIN("Load buffers"); + cgltf_options options{}; + + // For emscripten and Android builds we supply a custom file reader callback that looks inside a + // cache of externally-supplied data blobs, rather than loading from the filesystem. + +#if !GLTFIO_USE_FILESYSTEM + struct Closure { + UriDataCacheHandle uriDataCache; + const cgltf_data* gltf; + }; + + Closure closure = { uriDataCacheHandle, gltf }; + + options.file.user_data = &closure; + + options.file.read = [](const cgltf_memory_options* memoryOpts, + const cgltf_file_options* fileOpts, const char* path, + cgltf_size* size, void** data) { + Closure* closure = (Closure*) fileOpts->user_data; + auto& uriDataCache = closure->uriDataCache; + + if (auto iter = uriDataCache->find(path); iter != uriDataCache->end()) { + *size = iter->second.size; + *data = iter->second.buffer; + } else { + // Even if we don't find the given resource in the cache, we still return a successful + // error code, because we allow downloads to finish after the decoding work starts. + *size = 0; + *data = 0; + } + + return cgltf_result_success; + }; +#endif + + // Read data from the file system and base64 URIs. + cgltf_result result = cgltf_load_buffers(&options, (cgltf_data*) gltf, gltfPath); + if (result != cgltf_result_success) { + slog.e << "Unable to load resources." << io::endl; + return false; + } + + SYSTRACE_NAME_END(); + +#ifndef NDEBUG + if (cgltf_validate((cgltf_data*) gltf) != cgltf_result_success) { + slog.e << "Failed cgltf validation." << io::endl; + return false; + } +#endif + return true; +} + +} // namespace filament::gltfio::utility diff --git a/libs/gltfio/src/Utility.h b/libs/gltfio/src/Utility.h new file mode 100644 index 00000000000..3d2271ec4aa --- /dev/null +++ b/libs/gltfio/src/Utility.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef GLTFIO_UTILITY_H +#define GLTFIO_UTILITY_H + +#include + +#include + +#include +#include + +struct FFilamentAsset; +struct cgltf_primitive; +struct cgltf_data; +class DracoCache; + +struct cgltf_accessor; + +namespace filament::gltfio { + +// Referenced in ResourceLoader and AssetLoaderExtended +using BufferDescriptor = filament::backend::BufferDescriptor; +using UriDataCache = tsl::robin_map; +using UriDataCacheHandle = std::shared_ptr; + +} // namespace filament::gltfio::utility + +namespace filament::gltfio::utility { + +// Functions that are shared between the original implementation and the extended implementation. +void decodeDracoMeshes(cgltf_data const* gltf, cgltf_primitive const* prim, DracoCache* dracoCache); +void decodeMeshoptCompression(cgltf_data* data); +bool primitiveHasVertexColor(cgltf_primitive* inPrim); +uint32_t computeBindingSize(cgltf_accessor const* accessor); +void convertBytesToShorts(uint16_t* dst, uint8_t const* src, size_t count); +uint32_t computeBindingOffset(cgltf_accessor const* accessor); +bool requiresConversion(cgltf_accessor const* accessor); +bool requiresPacking(cgltf_accessor const* accessor); +bool loadCgltfBuffers(cgltf_data const* gltf, char const* gltfPath, + UriDataCacheHandle uriDataCacheHandle); + +} // namespace filament::gltfio::utility + +#endif diff --git a/libs/gltfio/src/extended/AssetLoaderExtended.cpp b/libs/gltfio/src/extended/AssetLoaderExtended.cpp new file mode 100644 index 00000000000..37434783911 --- /dev/null +++ b/libs/gltfio/src/extended/AssetLoaderExtended.cpp @@ -0,0 +1,563 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "AssetLoaderExtended.h" + +#include "../DracoCache.h" +#include "../FFilamentAsset.h" +#include "../GltfEnums.h" +#include "../Utility.h" +#include "TangentsJobExtended.h" + +#include + +#include +#include +#include + +#include + +#include +#include + +namespace filament::gltfio { + +namespace { + +constexpr uint8_t const VERTEX_JOB = 0x1; +constexpr uint8_t const INDEX_JOB = 0x2; +constexpr uint8_t const MORPH_TARGET_JOB = 0x4; + +constexpr int const GENERATED_0 = FFilamentAsset::ResourceInfoExtended::GENERATED_0_INDEX; +constexpr int const GENERATED_1 = FFilamentAsset::ResourceInfoExtended::GENERATED_1_INDEX; + +using BufferSlot = AssetLoaderExtended::BufferSlot; +using BufferType = std::variant; + +struct AttributeHash { + size_t operator()(Attribute const& key) const { + size_t h1 = std::hash{}((uint64_t) key.type); + size_t h2 = std::hash{}((uint64_t) key.index); + return h1 ^ (h2 << 1); + } +}; + +struct AttributeEqual { + bool operator()(Attribute const& lhs, Attribute const& rhs) const { + return lhs.type == rhs.type && lhs.index == rhs.index; + } +}; + +using AttributesMap = + std::unordered_map; + +inline std::tuple getVertexBundle( + VertexAttribute attrib, TangentsJobExtended::OutputParams& out) { + VertexBuffer::AttributeType type; + size_t byteCount = 0; + void* data = nullptr; + switch (attrib) { + case VertexAttribute::POSITION: + type = VertexBuffer::AttributeType::FLOAT3; + byteCount = sizeof(float3); + data = out.positions; + out.positions = nullptr; + break; + case VertexAttribute::TANGENTS: + type = VertexBuffer::AttributeType::SHORT4; + byteCount = sizeof(short4); + data = out.tbn; + out.tbn = nullptr; + break; + case VertexAttribute::COLOR: + type = VertexBuffer::AttributeType::FLOAT4; + byteCount = sizeof(float4); + data = out.colors; + out.colors = nullptr; + break; + case VertexAttribute::UV0: + type = VertexBuffer::AttributeType::FLOAT2; + byteCount = sizeof(float2); + data = out.uv0; + out.uv0 = nullptr; + break; + case VertexAttribute::UV1: + type = VertexBuffer::AttributeType::FLOAT2; + byteCount = sizeof(float2); + data = out.uv1; + out.uv1 = nullptr; + break; + case VertexAttribute::BONE_INDICES: + type = VertexBuffer::AttributeType::USHORT4; + byteCount = sizeof(ushort4); + data = out.joints; + out.joints = nullptr; + break; + case VertexAttribute::BONE_WEIGHTS: + type = VertexBuffer::AttributeType::FLOAT4; + byteCount = sizeof(float4); + data = out.weights; + out.weights = nullptr; + break; + default: + PANIC_POSTCONDITION("Unexpected vertex attribute %d", static_cast(attrib)); + } + return {type, byteCount, data}; +} + +// This will run the jobs to create tangent spaces if necessary, or simply forward the data if the +// input does not require processing. The output is a list of buffers that will be uploaded in the +// ResourceLoader. +std::vector computeGeometries(cgltf_primitive const* prim, uint8_t const jobType, + AttributesMap const& attributesMap, std::vector const& morphTargets, UvMap const& uvmap, + filament::Engine* engine) { + + bool const isUnlit = prim->material ? prim->material->unlit : false; + + using Params = TangentsJobExtended::Params; + + std::unordered_map jobs; + auto getJob = [&jobs](int key) -> Params& { + return jobs.try_emplace(key).first->second; + }; + + // Create a job description for each triangle-based primitive. + // Collect all TANGENT vertex attribute slots that need to be populated. + if ((jobType & VERTEX_JOB) != 0) { + auto& job = getJob(TangentsJobExtended::kMorphTargetUnused); + job.in = { + .prim = prim, + .uvmap = uvmap, + }; + job.jobType |= VERTEX_JOB; + } + if ((jobType & INDEX_JOB) != 0) { + auto& job = getJob(TangentsJobExtended::kMorphTargetUnused); + job.in = { + .prim = prim, + .uvmap = uvmap, + }; + job.jobType |= INDEX_JOB; + } + for (auto const target: morphTargets) { + auto& job = getJob(target); + job.jobType = MORPH_TARGET_JOB; + job.in = { + .prim = prim, + .morphTargetIndex = target, + }; + } + + utils::JobSystem& js = engine->getJobSystem(); + utils::JobSystem::Job* parent = js.createJob(); + for (auto& [key, params]: jobs) { + js.run(utils::jobs::createJob(js, parent, + [pptr = ¶ms] { TangentsJobExtended::run(pptr); })); + } + js.runAndWait(parent); + + std::vector slots; + + struct MorphTargetOut { + int morphTarget; + float3* positions; + short4* tbn; + size_t vertexCount; + }; + std::vector morphTargetOuts; + + for (auto& [key, params]: jobs) { + uint8_t const jobType = params.jobType; + TangentsJobExtended::OutputParams& out = params.out; + size_t const vertexCount = out.vertexCount; + + if ((jobType & VERTEX_JOB) != 0) { + auto vertexBufferBuilder = + VertexBuffer::Builder().enableBufferObjects().vertexCount(vertexCount); + + std::vector vslots; + bool slottedTangent = false; + int maxSlot = 0; + for (auto [cgltfAttr, filamentAttr]: attributesMap) { + auto const [cattr, expectedIndex] = cgltfAttr; + auto const [vattr, slot] = filamentAttr; + auto const [type, byteCount, data] = getVertexBundle(vattr, out); + + vertexBufferBuilder.attribute(vattr, slot, type); + + // Here we generate data if needed. + if (expectedIndex == GENERATED_0 || expectedIndex == GENERATED_1) { + // We should free `data` here because it's not being passed on to ResourceLoader. + if (data) { + free(data); + } + + size_t const requiredSize = byteCount * vertexCount; + auto gendata = (uint8_t*) malloc(requiredSize); + + if (vattr == filament::VertexAttribute::COLOR) { + // Assume white as the default if colors need to be generated. + float4* dataf = (float4*) gendata; + for (size_t i = 0; i < vertexCount; ++i) { + dataf[i] = float4(1.0, 1.0, 1.0, 1.0f); + } + } else { + memset(gendata, 0xff, requiredSize); + } + + vslots.push_back({ + .slot = slot, + .sizeInBytes = requiredSize, + .data = gendata, + }); + } else { + // Note that normalization is not necessary because we always convert the input. + if (vattr == filament::VertexAttribute::TANGENTS) { + vertexBufferBuilder.normalized(vattr); + slottedTangent = true; + } + vslots.push_back({ + .slot = slot, + .sizeInBytes = byteCount * vertexCount, + .data = data, + }); + } + maxSlot = std::max(maxSlot, slot); + } + + // Tangent is always computed for lit. + if (!slottedTangent && !isUnlit) { + auto const slot = maxSlot + 1; + auto const vattr = filament::VertexAttribute::TANGENTS; + auto const [type, byteCount, data] = getVertexBundle(vattr, out); + vertexBufferBuilder.attribute(vattr, slot, type); + vertexBufferBuilder.normalized(vattr); + vslots.push_back({ + .slot = slot, + .sizeInBytes = byteCount * vertexCount, + .data = data, + }); + } + + assert_invariant(!vslots.empty()); + vertexBufferBuilder.bufferCount(vslots.size()); + auto vertexBuffer = vertexBufferBuilder.build(*engine); + std::for_each(vslots.begin(), vslots.end(), + [vertexBuffer](BufferSlot& slot) { slot.vertices = vertexBuffer; }); + slots.insert(slots.end(), vslots.begin(), vslots.end()); + } + if ((jobType & INDEX_JOB) != 0) { + auto indexBuffer = IndexBuffer::Builder() + .indexCount(out.triangleCount * 3) + .bufferType(IndexBuffer::IndexType::UINT) + .build(*engine); + + slots.push_back({ + .indices = indexBuffer, + .sizeInBytes = out.triangleCount * 3 * 4, + .data = out.triangles, + }); + out.triangles = nullptr; + } + if ((jobType & MORPH_TARGET_JOB) != 0) { + morphTargetOuts.push_back({ + .morphTarget = params.in.morphTargetIndex, + .positions = out.positions, + .tbn = out.tbn, + .vertexCount = vertexCount, + }); + out.positions = nullptr; + out.tbn = nullptr; + } + + // We should have passed ownership of all allocation to other parties. + assert_invariant(out.isEmpty()); + } + + if (!morphTargets.empty()) { + UTILS_UNUSED_IN_RELEASE + auto const vertexCount = morphTargetOuts[0].vertexCount; + for (auto target: morphTargetOuts) { + assert_invariant(target.vertexCount == vertexCount); + slots.push_back({ + .offset = 0xdeadbeef, + .slot = target.morphTarget, + .targetData = { + .tbn = target.tbn, + .positions = target.positions, + }}); + } + } + return slots; +} + +} // anonymous namespace + +// The first portion of this function prepares the computation of geometries associated with one +// cgltf primitive by transforming types into Filament associated (or gltfio internal) types. If the +// input mesh is meshopt compressed or is in the Draco format, then it will be first transformed +// into the uncompressed version and then the geometries (tangents etc) will be computed. +bool AssetLoaderExtended::createPrimitive(Input* input, Output* out, + std::vector& outSlots) { + auto gltf = input->gltf; + auto prim = input->prim; + auto name = input->name; + + bool const isUnlit = prim->material ? prim->material->unlit : false; + uint8_t jobType = 0; + + // In glTF, each primitive may or may not have an index buffer. + const cgltf_accessor* indexAccessor = prim->indices; + if (indexAccessor || prim->attributes_count > 0) { + IndexBuffer::IndexType indexType; + if (indexAccessor && !getIndexType(indexAccessor->component_type, &indexType)) { + utils::slog.e << "Unrecognized index type in " << name << utils::io::endl; + return false; + } + jobType |= INDEX_JOB; + } + + jobType |= VERTEX_JOB; + + AttributesMap attributesMap; + bool hasUv0 = false, hasUv1 = false, hasVertexColor = false, hasNormals = false; + int slotCount = 0; + + for (cgltf_size aindex = 0; aindex < prim->attributes_count; aindex++) { + cgltf_attribute const attribute = prim->attributes[aindex]; + int const index = attribute.index; + cgltf_attribute_type const atype = attribute.type; + cgltf_accessor const* accessor = attribute.data; + + Attribute const cattr{atype, index}; + + // At a minimum, surface orientation requires normals to be present in the source data. + // Here we re-purpose the normals slot to point to the quats that get computed later. + if (atype == cgltf_attribute_type_normal) { + if (isUnlit) continue; + if (!hasNormals) { + FilamentAttribute const fattr { VertexAttribute::TANGENTS, slotCount++ }; + hasNormals = true; + attributesMap[cattr] = fattr; + } + continue; + } + + if (atype == cgltf_attribute_type_tangent) { + if (isUnlit) continue; + if (!hasNormals) { + FilamentAttribute const fattr { VertexAttribute::TANGENTS, slotCount++ }; + hasNormals = true; + attributesMap[cattr] = fattr; + } + continue; + } + + // Translate the cgltf attribute enum into a Filament enum. + VertexAttribute semantic; + if (!getVertexAttrType(atype, &semantic)) { + utils::slog.e << "Unrecognized vertex semantic in " << name << utils::io::endl; + return false; + } + if (atype == cgltf_attribute_type_weights && index > 0) { + utils::slog.e << "Too many bone weights in " << name << utils::io::endl; + continue; + } + if (atype == cgltf_attribute_type_joints && index > 0) { + utils::slog.e << "Too many joints in " << name << utils::io::endl; + continue; + } + if (atype == cgltf_attribute_type_texcoord) { + if (index >= UvMapSize) { + utils::slog.e << "Too many texture coordinate sets in " << name << utils::io::endl; + continue; + } + UvSet uvset = out->uvmap[index]; + switch (uvset) { + case UV0: + semantic = VertexAttribute::UV0; + hasUv0 = true; + break; + case UV1: + semantic = VertexAttribute::UV1; + hasUv1 = true; + break; + case UNUSED: + // If we have a free slot, then include this unused UV set in the VertexBuffer. + // This allows clients to swap the glTF material with a custom material. + if (!hasUv0 && getNumUvSets(out->uvmap) == 0) { + semantic = VertexAttribute::UV0; + hasUv0 = true; + break; + } + + // If there are no free slots then drop this unused texture coordinate set. + // This should not print an error or warning because the glTF spec stipulates an + // order of degradation for gracefully dropping UV sets. We implement this in + // constrainMaterial in MaterialProvider. + continue; + } + } + + if (atype == cgltf_attribute_type_color) { + hasVertexColor = true; + } + + // The positions accessor is required to have min/max properties, use them to expand + // the bounding box for this primitive. + if (atype == cgltf_attribute_type_position) { + const float* minp = &accessor->min[0]; + const float* maxp = &accessor->max[0]; + out->aabb.min = min(out->aabb.min, float3(minp[0], minp[1], minp[2])); + out->aabb.max = max(out->aabb.max, float3(maxp[0], maxp[1], maxp[2])); + } + + if (VertexBuffer::AttributeType fatype, actualType; + !getElementType(accessor->type, accessor->component_type, &fatype, &actualType)) { + utils::slog.e << "Unsupported accessor type in " << name << utils::io::endl; + return false; + } + + attributesMap[cattr] = { semantic, slotCount++ }; + + if (accessor->count == 0) { + utils::slog.e << "Empty vertex buffer in " << name << utils::io::endl; + return false; + } + } + + cgltf_size targetsCount = prim->targets_count; + if (targetsCount > MAX_MORPH_TARGETS) { + utils::slog.w << "WARNING: Exceeded max morph target count of " << MAX_MORPH_TARGETS + << utils::io::endl; + targetsCount = MAX_MORPH_TARGETS; + } + + // A set of morph targets to generate tangents for. + std::vector morphTargets; + + Aabb const baseAabb(out->aabb); + for (cgltf_size targetIndex = 0; targetIndex < targetsCount; targetIndex++) { + bool morphTargetHasNormals = false; + cgltf_morph_target const& target = prim->targets[targetIndex]; + for (cgltf_size aindex = 0; aindex < target.attributes_count; aindex++) { + cgltf_attribute const& attribute = target.attributes[aindex]; + cgltf_accessor const* accessor = attribute.data; + cgltf_attribute_type const atype = attribute.type; + + if (atype != cgltf_attribute_type_position && atype != cgltf_attribute_type_normal && + atype != cgltf_attribute_type_tangent) { + utils::slog.e << "Only positions, normals, and tangents can be morphed." + << " type=" << static_cast(atype) << utils::io::endl; + return false; + } + + if (VertexBuffer::AttributeType fatype, actualType; !getElementType(accessor->type, + accessor->component_type, &fatype, &actualType)) { + utils::slog.e << "Unsupported accessor type in " << name << utils::io::endl; + return false; + } + + if (atype == cgltf_attribute_type_position && accessor->has_min && accessor->has_max) { + Aabb targetAabb(baseAabb); + float const* minp = &accessor->min[0]; + float const* maxp = &accessor->max[0]; + + // We assume that the range of morph target weight is [0, 1]. + targetAabb.min += float3(minp[0], minp[1], minp[2]); + targetAabb.max += float3(maxp[0], maxp[1], maxp[2]); + + out->aabb.min = min(out->aabb.min, targetAabb.min); + out->aabb.max = max(out->aabb.max, targetAabb.max); + } + + if (atype == cgltf_attribute_type_tangent) { + morphTargetHasNormals = true; + morphTargets.push_back(targetIndex); + } + } + // Generate flat normals if necessary. + if (!morphTargetHasNormals && prim->material && !prim->material->unlit) { + morphTargets.push_back(targetIndex); + } + } + + // We provide a single dummy buffer (filled with 0xff) for all unfulfilled vertex requirements. + // The color data should be a sequence of normalized UBYTE4, so dummy UVs are USHORT2 to make + // the sizes match. + if (mMaterials.needsDummyData(VertexAttribute::UV0) && !hasUv0) { + attributesMap[{cgltf_attribute_type_texcoord, GENERATED_0}] = {VertexAttribute::UV0, + slotCount++}; + } + + if (mMaterials.needsDummyData(VertexAttribute::UV1) && !hasUv1) { + attributesMap[{cgltf_attribute_type_texcoord, GENERATED_1}] = {VertexAttribute::UV1, + slotCount++}; + } + + if (mMaterials.needsDummyData(VertexAttribute::COLOR) && !hasVertexColor) { + attributesMap[{cgltf_attribute_type_color, GENERATED_0}] = {VertexAttribute::COLOR, + slotCount++}; + } + + int numUvSets = getNumUvSets(out->uvmap); + if (!hasUv0 && numUvSets > 0) { + attributesMap[{cgltf_attribute_type_texcoord, GENERATED_0}] = {VertexAttribute::UV0, + slotCount++}; + } + + if (!hasUv1 && numUvSets > 1) { + utils::slog.w << "Missing UV1 data in " << name << utils::io::endl; + attributesMap[{cgltf_attribute_type_texcoord, GENERATED_1}] = {VertexAttribute::UV1, + slotCount++}; + } + + if (!mCgltfBuffersLoaded) { + mCgltfBuffersLoaded = utility::loadCgltfBuffers(gltf, mGltfPath.c_str(), mUriDataCache); + if (!mCgltfBuffersLoaded) { + return false; + } + utility::decodeMeshoptCompression(gltf); + } + + utility::decodeDracoMeshes(gltf, prim, input->dracoCache); + + auto slots = computeGeometries(prim, jobType, attributesMap, morphTargets, out->uvmap, mEngine); + + out->slotIndices.resize(morphTargets.size()); + + for (size_t i = 0; i < slots.size(); i++) { + auto& slot = slots[i]; + if (slot.vertices) { + assert_invariant(!out->vertices || out->vertices == slot.vertices); + out->vertices = slot.vertices; + } + if (slot.indices) { + assert_invariant(!out->indices || out->indices == slot.indices); + out->indices = slot.indices; + } + if (slot.offset == 0xdeadbeef) { + // we can't fill this here, unfortunately, so this is done in + // FAssetLoader::createRenderable + out->slotIndices[slot.slot] = outSlots.size() + i; + } + } + + outSlots.insert(outSlots.end(), slots.begin(), slots.end()); + return true; +} + +}// namespace filament::gltfio diff --git a/libs/gltfio/src/extended/AssetLoaderExtended.h b/libs/gltfio/src/extended/AssetLoaderExtended.h new file mode 100644 index 00000000000..bac61c85f05 --- /dev/null +++ b/libs/gltfio/src/extended/AssetLoaderExtended.h @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef GLTFIO_ASSETLOADEREXTENDED_H +#define GLTFIO_ASSETLOADEREXTENDED_H + +#include "../FFilamentAsset.h" +#include "../Utility.h" + +#include +#include + +#include + +#include + +namespace filament::gltfio { + +struct Primitive; +struct FFilamentAsset; +class DracoCache; + +using BufferDescriptor = filament::backend::BufferDescriptor; + +// The cgltf attribute is a type and the attribute index +struct Attribute { + cgltf_attribute_type type; // positions, tangents + int index; +}; + +// The Filament Attribute is defined as a type and a slot. +struct FilamentAttribute { + VertexAttribute attribute; + int slot; +}; + +// AssetLoaderExtended performs the same task as AssetLoader. Specifically, it takes the data from +// cgltf and store them in CPU memory. These buffers are then forwarded to ResourceLoader for +// uplaoding to GPU. The difference between this class AssetLoader is that tangent space computation +// are computed here (and not in ResourceLoader). The reason for this change is that +// TangentSpaceMesh will remesh the input and possibly change the indices, vertex count, and +// triangle counts, and so those changes must be resolved before the buffers are sent to the GPU. +struct AssetLoaderExtended { + using BufferSlot = FFilamentAsset::ResourceInfoExtended::BufferSlot; + using Output = Primitive; + + struct Input { + cgltf_data* gltf; + cgltf_primitive* prim; + char const* name; + DracoCache* dracoCache; + Material* material; + }; + + AssetLoaderExtended(AssetConfigurationExtended const& config, Engine* engine, + MaterialProvider& materials) + : mEngine(engine), + mGltfPath(config.gltfPath), + mMaterials(materials), + mUriDataCache(std::make_shared()), + mCgltfBuffersLoaded(false) {} + + ~AssetLoaderExtended() = default; + + bool createPrimitive(Input* input, Output* out, std::vector& outSlots); + + UriDataCacheHandle getUriDataCache() const noexcept { return mUriDataCache; } + +private: + filament::Engine* mEngine; + std::string mGltfPath; + MaterialProvider& mMaterials; + UriDataCacheHandle mUriDataCache; + bool mCgltfBuffersLoaded; +}; + +} // namespace filament::gltfio + +#endif // GLTFIO_ASSETLOADEREXTENDED_H diff --git a/libs/gltfio/src/extended/ResourceLoaderExtended.cpp b/libs/gltfio/src/extended/ResourceLoaderExtended.cpp new file mode 100644 index 00000000000..6ce83d8f97e --- /dev/null +++ b/libs/gltfio/src/extended/ResourceLoaderExtended.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ResourceLoaderExtended.h" + +#include "../FFilamentAsset.h" + +#include +#include + +#include + +#include + +static const auto FREE_CALLBACK = [](void* mem, size_t, void*) { + free(mem); + }; + +namespace filament::gltfio { + + +void ResourceLoaderExtended::loadResources(std::vector const& slots, + filament::Engine* engine, std::vector& bufferObjects) { + for (auto& slot: slots) { + size_t const byteCount = slot.sizeInBytes; + if (slot.vertices) { + BufferObject* bo = BufferObject::Builder().size(byteCount).build(*engine); + bo->setBuffer(*engine, BufferDescriptor(slot.data, byteCount, FREE_CALLBACK)); + slot.vertices->setBufferObjectAt(*engine, slot.slot, bo); + bufferObjects.push_back(bo); + } + if (slot.indices) { + slot.indices->setBuffer(*engine, BufferDescriptor(slot.data, byteCount, FREE_CALLBACK)); + } + if (slot.target) { + assert_invariant(slot.targetData.positions && slot.targetData.tbn); + slot.target->setPositionsAt(*engine, slot.slot, + (float3 const*) slot.targetData.positions, + slot.count, slot.offset); + slot.target->setTangentsAt(*engine, slot.slot, (short4 const*) slot.targetData.tbn, + slot.count, slot.offset); + + free(slot.targetData.positions); + free(slot.targetData.tbn); + } + } +} + +} // namespace filament::gltfio diff --git a/libs/gltfio/src/extended/ResourceLoaderExtended.h b/libs/gltfio/src/extended/ResourceLoaderExtended.h new file mode 100644 index 00000000000..c095a046f52 --- /dev/null +++ b/libs/gltfio/src/extended/ResourceLoaderExtended.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef GLTFIO_RESOURCELOADEREXTENDED_H +#define GLTFIO_RESOURCELOADEREXTENDED_H + +#include "../FFilamentAsset.h" + +#include + +namespace filament::gltfio { + +struct ResourceLoaderExtended { + using BufferSlot = FFilamentAsset::ResourceInfoExtended::BufferSlot; + static void loadResources( + std::vector const& slots, filament::Engine* engine, + std::vector& bufferObjects); +}; + +} // namespace filament::gltfio + +#endif // GLTFIO_RESOURCELOADEREXTENDED_H diff --git a/libs/gltfio/src/extended/TangentSpaceMeshWrapper.cpp b/libs/gltfio/src/extended/TangentSpaceMeshWrapper.cpp new file mode 100644 index 00000000000..3522de2f9e8 --- /dev/null +++ b/libs/gltfio/src/extended/TangentSpaceMeshWrapper.cpp @@ -0,0 +1,339 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "TangentSpaceMeshWrapper.h" + +#include + +#include +#include +#include + +namespace filament::gltfio { + +namespace { + +using AuxType = TangentSpaceMeshWrapper::AuxType; +using Builder = TangentSpaceMeshWrapper::Builder; + +template +using is_supported_aux_t = TangentSpaceMeshWrapper::is_supported_aux_t; + +struct Passthrough { + static constexpr int POSITION = 256; + static constexpr int UV0 = 257; + static constexpr int NORMALS = 258; + static constexpr int TANGENTS = 259; + static constexpr int TRIANGLES = 260; + + std::unordered_map data; + size_t vertexCount = 0; + size_t triangleCount = 0; +}; + +// Note that the method signatures here match TangentSpaceMesh +struct PassthroughMesh { + explicit PassthroughMesh(Passthrough const& passthrough) + : mPassthrough(passthrough) {} + + void getPositions(float3* data) noexcept { + size_t const nbytes = mPassthrough.vertexCount * sizeof(float3); + std::memcpy(data, mPassthrough.data[Passthrough::POSITION], nbytes); + } + + void getUVs(float2* data) noexcept { + size_t const nbytes = mPassthrough.vertexCount * sizeof(float2); + std::memcpy(data, mPassthrough.data[Passthrough::UV0], nbytes); + } + + void getQuats(short4* data) noexcept { + size_t const nbytes = mPassthrough.vertexCount * sizeof(short4); + std::memcpy(data, mPassthrough.data[Passthrough::TANGENTS], nbytes); + } + + void getTriangles(uint3* data) { + size_t const nbytes = mPassthrough.triangleCount * sizeof(uint3); + std::memcpy(data, mPassthrough.data[Passthrough::TRIANGLES], nbytes); + } + + template + void getAux(AuxType attribute, T data) noexcept { + size_t const nbytes = mPassthrough.vertexCount * sizeof(std::remove_pointer_t); + std::memcpy(data, (T) mPassthrough.data[static_cast(attribute)], nbytes); + } + + size_t getVertexCount() const noexcept { return mPassthrough.vertexCount; } + size_t getTriangleCount() const noexcept { return mPassthrough.triangleCount; } + +private: + Passthrough mPassthrough; +}; + +// Note that the method signatures here match TangentSpaceMesh::Builder +struct PassthroughBuilder { + void vertexCount(size_t count) noexcept { mPassthrough.vertexCount = count; } + + void normals(float3 const* normals) noexcept { + mPassthrough.data[Passthrough::NORMALS] = normals; + } + + void tangents(float4 const* tangents) noexcept { + mPassthrough.data[Passthrough::TANGENTS] = tangents; + } + void uvs(float2 const* uvs) noexcept { mPassthrough.data[Passthrough::UV0] = uvs; } + + void positions(float3 const* positions) noexcept { + mPassthrough.data[Passthrough::POSITION] = positions; + } + + void triangleCount(size_t triangleCount) noexcept { + mPassthrough.triangleCount = triangleCount; + } + + void triangles(uint3 const* triangles) noexcept { + mPassthrough.data[Passthrough::TRIANGLES] = triangles; + } + + void aux(AuxType type, void* data) noexcept { + mPassthrough.data[static_cast(type)] = data; + } + + PassthroughMesh* build() const noexcept { + return new PassthroughMesh(mPassthrough); + } + +private: + Passthrough mPassthrough; + friend struct PassthroughMesh; +}; + +} // anonymous + +#define DO_MESH_IMPL(METHOD, ...) \ + do { \ + if (mTsMesh) { \ + mTsMesh->METHOD(__VA_ARGS__); \ + } else { \ + mPassthroughMesh->METHOD(__VA_ARGS__); \ + } \ + } while (0) + +#define DO_MESH_RET_IMPL(METHOD) \ + do { \ + if (mTsMesh) { \ + return mTsMesh->METHOD(); \ + } else { \ + return mPassthroughMesh->METHOD(); \ + } \ + } while (0) + +struct TangentSpaceMeshWrapper::Impl { + Impl(geometry::TangentSpaceMesh* tsMesh) + : mTsMesh(tsMesh) {} + + Impl(PassthroughMesh* passthroughMesh) + : mPassthroughMesh(passthroughMesh) {} + + ~Impl() { + if (mTsMesh) { + geometry::TangentSpaceMesh::destroy(mTsMesh); + } + if (mPassthroughMesh) { + delete mPassthroughMesh; + } + } + + inline size_t getVertexCount() const noexcept { + DO_MESH_RET_IMPL(getVertexCount); + } + + float3* getPositions() noexcept { + size_t const nbytes = getVertexCount() * sizeof(float3); + auto data = (float3*) malloc(nbytes); + DO_MESH_IMPL(getPositions, data); + return data; + } + + float2* getUVs() noexcept { + size_t const nbytes = getVertexCount() * sizeof(float2); + auto data = (float2*) malloc(nbytes); + DO_MESH_IMPL(getUVs, data); + return data; + } + + short4* getQuats() noexcept { + size_t const nbytes = getVertexCount() * sizeof(short4); + auto data = (short4*) malloc(nbytes); + DO_MESH_IMPL(getQuats, data); + return data; + } + + uint3* getTriangles() { + size_t const nbytes = getTriangleCount() * sizeof(uint3); + auto data = (uint3*) malloc(nbytes); + DO_MESH_IMPL(getTriangles, data); + return data; + } + + template> + T getAux(AuxType attribute) noexcept { + size_t const nbytes = getVertexCount() * sizeof(std::remove_pointer_t); + auto data = (T) malloc(nbytes); + DO_MESH_IMPL(getAux, attribute, data); + return data; + } + + inline size_t getTriangleCount() const noexcept { + DO_MESH_RET_IMPL(getTriangleCount); + } + +private: + geometry::TangentSpaceMesh* mTsMesh = nullptr; + PassthroughMesh* mPassthroughMesh = nullptr; +}; + +#undef DO_MESH_IMPL +#undef DO_MESH_RET_IMPL + +#define DO_BUILDER_IMPL(METHOD, ...) \ + do { \ + if (mPassthroughBuilder) { \ + mPassthroughBuilder->METHOD(__VA_ARGS__); \ + } else { \ + mTsmBuilder->METHOD(__VA_ARGS__); \ + } \ + } while (0) + +struct TangentSpaceMeshWrapper::Builder::Impl { + explicit Impl(bool isUnlit) + : mPassthroughBuilder(isUnlit ? std::make_unique() : nullptr), + mTsmBuilder( + !isUnlit ? std::make_unique() : nullptr) {} + + void vertexCount(size_t count) noexcept { DO_BUILDER_IMPL(vertexCount, count); } + void normals(float3 const* normals) noexcept { DO_BUILDER_IMPL(normals, normals); } + void tangents(float4 const* tangents) noexcept { DO_BUILDER_IMPL(tangents, tangents); } + void uvs(float2 const* uvs) noexcept { DO_BUILDER_IMPL(uvs, uvs); } + void positions(float3 const* positions) noexcept { DO_BUILDER_IMPL(positions, positions); } + void triangles(uint3 const* triangles) noexcept { DO_BUILDER_IMPL(triangles, triangles); } + void triangleCount(size_t count) noexcept { DO_BUILDER_IMPL(triangleCount, count); } + + template> + void aux(AuxType type, T data) { + DO_BUILDER_IMPL(aux, type, data); + } + + TangentSpaceMeshWrapper* build() { + auto ret = new TangentSpaceMeshWrapper(); + if (mPassthroughBuilder) { + ret->mImpl = new TangentSpaceMeshWrapper::Impl{ mPassthroughBuilder->build() }; + } else { + ret->mImpl = new TangentSpaceMeshWrapper::Impl{ mTsmBuilder->build() }; + } + return ret; + } + +private: + std::unique_ptr mPassthroughBuilder; + std::unique_ptr mTsmBuilder; +}; + +#undef DO_BUILDER_IMPL + +Builder::Builder(bool isUnlit) + : mImpl(new Impl{isUnlit}) {} + + +Builder& Builder::vertexCount(size_t count) noexcept { + mImpl->vertexCount(count); + return *this; +} + +Builder& Builder::normals(float3 const* normals) noexcept { + mImpl->normals(normals); + return *this; +} + +Builder& Builder::tangents(float4 const* tangents) noexcept { + mImpl->tangents(tangents); + return *this; +} + +Builder& Builder::uvs(float2 const* uvs) noexcept { + mImpl->uvs(uvs); + return *this; +} + +Builder& Builder::positions(float3 const* positions) noexcept{ + mImpl->positions(positions); + return *this; +} + +Builder& Builder::triangleCount(size_t triangleCount) noexcept { + mImpl->triangleCount(triangleCount); + return *this; +} + +Builder& Builder::triangles(uint3 const* triangles) noexcept { + mImpl->triangles(triangles); + return *this; +} + +template Builder& Builder::aux(AuxType attribute, float2* data); +template Builder& Builder::aux(AuxType attribute, float3* data); +template Builder& Builder::aux(AuxType attribute, float4* data); +template Builder& Builder::aux(AuxType attribute, ushort3* data); +template Builder& Builder::aux(AuxType attribute, ushort4* data); + +template +Builder& Builder::aux(AuxType type, T data) { + mImpl->aux(type, data); + return *this; +} + +TangentSpaceMeshWrapper* Builder::build() { + return mImpl->build(); +} + +void TangentSpaceMeshWrapper::destroy(TangentSpaceMeshWrapper* mesh) { + assert_invariant(mesh->mImpl); + assert_invariant(mesh); + delete mesh->mImpl; + delete mesh; +} + +float3* TangentSpaceMeshWrapper::getPositions() noexcept { return mImpl->getPositions(); } +float2* TangentSpaceMeshWrapper::getUVs() noexcept { return mImpl->getUVs(); } +short4* TangentSpaceMeshWrapper::getQuats() noexcept { return mImpl->getQuats(); } +uint3* TangentSpaceMeshWrapper::getTriangles() { return mImpl->getTriangles(); } +size_t TangentSpaceMeshWrapper::getVertexCount() const noexcept { return mImpl->getVertexCount(); } + +template float2* TangentSpaceMeshWrapper::getAux(AuxType attribute) noexcept; +template float3* TangentSpaceMeshWrapper::getAux(AuxType attribute) noexcept; +template float4* TangentSpaceMeshWrapper::getAux(AuxType attribute) noexcept; +template ushort3* TangentSpaceMeshWrapper::getAux(AuxType attribute) noexcept; +template ushort4* TangentSpaceMeshWrapper::getAux(AuxType attribute) noexcept; + +template +T TangentSpaceMeshWrapper::getAux(AuxType attribute) noexcept { + return mImpl->getAux(attribute); +} + +size_t TangentSpaceMeshWrapper::getTriangleCount() const noexcept { + return mImpl->getTriangleCount(); +} + +} // filament::gltfio diff --git a/libs/gltfio/src/extended/TangentSpaceMeshWrapper.h b/libs/gltfio/src/extended/TangentSpaceMeshWrapper.h new file mode 100644 index 00000000000..2dc2d5e8ddb --- /dev/null +++ b/libs/gltfio/src/extended/TangentSpaceMeshWrapper.h @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef GLTFIO_TANGENT_SPACE_MESH_WRAPPER_H +#define GLTFIO_TANGENT_SPACE_MESH_WRAPPER_H + +#include + +#include + +namespace filament::gltfio { + +using namespace math; + +// Wrapper around TangentSpaceMesh because in the case of unlit material, we do not need to go +// through TSM transformation, and we simply passthrough any given input as output. +struct TangentSpaceMeshWrapper { + using AuxType = geometry::TangentSpaceMesh::AuxAttribute; + + template + using is_supported_aux_t = typename std::enable_if< + std::is_same::value || std::is_same::value || + std::is_same::value || std::is_same::value || + std::is_same::value>::type; + + struct Builder { + struct Impl; + + Builder(bool isUnlit); + + Builder& vertexCount(size_t count) noexcept; + Builder& normals(float3 const* normals) noexcept; + Builder& tangents(float4 const* tangents) noexcept; + Builder& uvs(float2 const* uvs) noexcept; + Builder& positions(float3 const* positions) noexcept; + Builder& triangleCount(size_t triangleCount) noexcept; + Builder& triangles(uint3 const* triangles) noexcept; + + template> + Builder& aux(AuxType type, T data); + + TangentSpaceMeshWrapper* build(); + + private: + Impl* mImpl; + }; + + explicit TangentSpaceMeshWrapper() = default; + + static void destroy(TangentSpaceMeshWrapper* mesh); + + float3* getPositions() noexcept; + float2* getUVs() noexcept; + short4* getQuats() noexcept; + uint3* getTriangles(); + + template + using is_supported_aux_t = typename std::enable_if< + std::is_same::value || std::is_same::value || + std::is_same::value || std::is_same::value || + std::is_same::value>::type; + template> + T getAux(AuxType attribute) noexcept; + + size_t getVertexCount() const noexcept; + size_t getTriangleCount() const noexcept; + +private: + struct Impl; + Impl* mImpl; + + friend struct Builder::Impl; +}; + +} // namespace filament + +#endif // GLTFIO_TANGENTS_JOB_EXTENDED_H diff --git a/libs/gltfio/src/extended/TangentsJobExtended.cpp b/libs/gltfio/src/extended/TangentsJobExtended.cpp new file mode 100644 index 00000000000..8c2ab665a8d --- /dev/null +++ b/libs/gltfio/src/extended/TangentsJobExtended.cpp @@ -0,0 +1,550 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "TangentsJobExtended.h" + +#include "AssetLoaderExtended.h" +#include "TangentSpaceMeshWrapper.h" +#include "../GltfEnums.h" +#include "../FFilamentAsset.h" +#include "../Utility.h" + +#include +#include +#include + +#include +#include +#include + +using namespace filament; +using namespace filament::gltfio; +using namespace filament::math; + +namespace { + +constexpr uint8_t POSITIONS_ID = 0; +constexpr uint8_t TANGENTS_ID = 1; +constexpr uint8_t COLORS_ID = 3; +constexpr uint8_t NORMALS_ID = 4; +constexpr uint8_t UV0_ID = 5; +constexpr uint8_t UV1_ID = 6; +constexpr uint8_t WEIGHTS_ID = 7; +constexpr uint8_t JOINTS_ID = 8; +constexpr uint8_t INVALID_ID = 0xFF; + +using POSITIONS_TYPE = float3*; +using TANGENTS_TYPE = float4*; +using COLORS_TYPE = float4*; +using NORMALS_TYPE = float3*; +using UV0_TYPE = float2*; +using UV1_TYPE = float2*; +using WEIGHTS_TYPE = float4*; +using JOINTS_TYPE = ushort4*; + +// Used in template specifier. +#define POSITIONS_T POSITIONS_TYPE, POSITIONS_ID +#define TANGENTS_T TANGENTS_TYPE, TANGENTS_ID +#define COLORS_T COLORS_TYPE, COLORS_ID +#define NORMALS_T NORMALS_TYPE, NORMALS_ID +#define UV0_T UV0_TYPE, UV0_ID +#define UV1_T UV1_TYPE, UV1_ID +#define WEIGHTS_T WEIGHTS_TYPE, WEIGHTS_ID +#define JOINTS_T JOINTS_TYPE, JOINTS_ID + +using DataType = std::variant; +using AttributeDataMap = std::unordered_map; + +// This converts from cgltf attributes to the representation in this file. +inline uint8_t toCode(Attribute attr, UvMap const& uvmap, bool hasUv0) { + switch (attr.type) { + case cgltf_attribute_type_normal: + assert_invariant(attr.index == 0); + return NORMALS_ID; + case cgltf_attribute_type_tangent: + assert_invariant(attr.index == 0); + return TANGENTS_ID; + case cgltf_attribute_type_color: + assert_invariant(attr.index == 0); + return COLORS_ID; + case cgltf_attribute_type_position: + assert_invariant(attr.index == 0); + return POSITIONS_ID; + // This logic is replicating slot assignment in AssetLoaderExtended.cpp + case cgltf_attribute_type_texcoord: { + assert_invariant(attr.index < UvMapSize); + UvSet uvset = uvmap[attr.index]; + switch (uvset) { + case gltfio::UV0: + return UV0_ID; + case gltfio::UV1: + return UV1_ID; + case gltfio::UNUSED: + // If we have a free slot, then include this unused UV set in the VertexBuffer. + // This allows clients to swap the glTF material with a custom material. + if (!hasUv0 && getNumUvSets(uvmap) == 0) { + return UV0_ID; + } + } + utils::slog.w << "Only two sets of UVs are available" << utils::io::endl; + return INVALID_ID; + } + case cgltf_attribute_type_weights: + assert_invariant(attr.index == 0); + return WEIGHTS_ID; + case cgltf_attribute_type_joints: + assert_invariant(attr.index == 0); + return JOINTS_ID; + default: + // Otherwise, this is not an attribute supported by Filament. + return INVALID_ID; + } +} + +// These methods extra and/or transform the data from the cgltf accessors. +namespace data { + +template +inline T get(AttributeDataMap const& data) { + auto iter = data.find(attrib); + if (iter != data.end()) { + return std::get(iter->second); + } + return nullptr; +} + +template +void allocate(AttributeDataMap& data, size_t count) { + assert_invariant(data.find(attrib) == data.end()); + data[attrib] = (T) malloc(sizeof(std::remove_pointer_t) * count); +} + +template +void free(AttributeDataMap& data) { + if (data.find(attrib) == data.end()) { + return; + } + std::free(std::get(data[attrib])); + data.erase(attrib); +} + +constexpr uint8_t UBYTE_TYPE = 1; +constexpr uint8_t USHORT_TYPE = 2; +constexpr uint8_t FLOAT_TYPE = 3; + +template +constexpr uint8_t componentType() { + if constexpr (std::is_same_v || + std::is_same_v || + std::is_same_v) { + return FLOAT_TYPE; + } else if constexpr (std::is_same_v || + std::is_same_v || + std::is_same_v) { + return UBYTE_TYPE; + } else if constexpr (std::is_same_v || + std::is_same_v || + std::is_same_v) { + return USHORT_TYPE; + } + return 0; +} + +template +constexpr size_t byteCount() { + return sizeof(std::remove_pointer_t); +} + +template +constexpr size_t componentCount() { + if constexpr (std::is_same_v || std::is_same_v || + std::is_same_v) { + return 2; + } else if constexpr (std::is_same_v || std::is_same_v || + std::is_same_v) { + return 3; + } else if constexpr (std::is_same_v || std::is_same_v || + std::is_same_v) { + return 4; + } + return 0; +} + +// This method will copy when the input/output types are the same and will do conversion where it +// makes sense. +template +void copy(InDataType in, size_t inStride, OutDataType out, size_t outStride, size_t count) { + uint8_t* inBytes = (uint8_t*) in; + uint8_t* outBytes = (uint8_t*) out; + + if constexpr (componentType() == componentType()) { + if constexpr (componentCount() == 3 && componentCount() == 4) { + for (size_t i = 0; i < count; ++i) { + *((OutDataType) (outBytes + (i * outStride))) = std::remove_pointer_t( + *((InDataType) (inBytes + (i * inStride))), 1); + } + return; + } else if constexpr (componentCount() == componentCount()) { + if (inStride == outStride) { + std::memcpy(out, in, data::byteCount() * count); + } else { + for (size_t i = 0; i < count; ++i) { + *((OutDataType) (outBytes + (i * outStride))) = + std::remove_pointer_t( + *((InDataType) (inBytes + (i * inStride)))); + } + } + return; + } + + PANIC_POSTCONDITION("Invalid component count in conversion"); + } else if constexpr (componentCount() == componentCount()) { + // byte to float conversion + constexpr size_t const compCount = componentCount(); + if constexpr (componentType() == UBYTE_TYPE && + componentType() == FLOAT_TYPE) { + for (size_t i = 0; i < count; ++i) { + for (size_t j = 0; j < compCount; ++j) { + *(((float*) (outBytes + (i * outStride))) + j) = + *(((uint8_t*) (inBytes + (i * inStride))) + j) / 255.0f; + } + } + return; + } else if constexpr (componentType() == UBYTE_TYPE && + componentType() == USHORT_TYPE) { + for (size_t i = 0; i < count; ++i) { + for (size_t j = 0; j < compCount; ++j) { + *(((uint16_t*) (outBytes + (i * outStride))) + j) = + *(((uint8_t*) (inBytes + (i * inStride))) + j); + } + } + return; + } + } + PANIC_POSTCONDITION("Invalid conversion"); +} + +template +void unpack(cgltf_accessor const* accessor, size_t const vertexCount, T out, + bool isMorphTarget = false) { + assert_invariant(accessor->count == vertexCount); + uint8_t const* data = nullptr; + if (accessor->buffer_view->has_meshopt_compression) { + data = (uint8_t const*) accessor->buffer_view->data + accessor->offset; + } else { + data = (uint8_t const*) accessor->buffer_view->buffer->data + + utility::computeBindingOffset(accessor); + } + auto componentType = accessor->component_type; + size_t const inDim = cgltf_num_components(accessor->type); + size_t const outDim = componentCount(); + + if (componentType == cgltf_component_type_r_32f) { + assert_invariant(accessor->buffer_view); + assert_invariant(data::componentType() == FLOAT_TYPE); + size_t const elementCount = outDim * vertexCount; + + if ((isMorphTarget && utility::requiresPacking(accessor)) || + utility::requiresConversion(accessor)) { + cgltf_accessor_unpack_floats(accessor, (float*) out, elementCount); + return; + } else { + if (inDim == 3 && outDim == 4) { + data::copy((float3*) data, accessor->stride, (T) out, + data::byteCount(), vertexCount); + return; + } else { + assert_invariant(inDim == outDim); + data::copy((T) data, accessor->stride, (T) out, data::byteCount(), + vertexCount); + return; + } + } + } else { + assert_invariant(outDim == inDim); + if (componentType == cgltf_component_type_r_8u) { + if (inDim == 2) { + data::copy((ubyte2*) data, accessor->stride, (T) out, + data::byteCount(), vertexCount); + return; + } else if (inDim == 3) { + data::copy((ubyte3*) data, accessor->stride, (T) out, + data::byteCount(), vertexCount); + return; + } else if (inDim == 4) { + data::copy((ubyte4*) data, accessor->stride, (T) out, + data::byteCount(), vertexCount); + return; + } + } else if (componentType == cgltf_component_type_r_16u) { + if (inDim == 2) { + data::copy((ushort2*) data, accessor->stride, (T) out, + data::byteCount(), vertexCount); + return; + } else if (inDim == 3) { + data::copy((ushort3*) data, accessor->stride, (T) out, + data::byteCount(), vertexCount); + return; + } else if (inDim == 4) { + data::copy((ushort4*) data, accessor->stride, (T) out, + data::byteCount(), vertexCount); + return; + } + } + + PANIC_POSTCONDITION("Only ubyte or ushort accepted as input"); + } +} + +template +void unpack(cgltf_accessor const* accessor, AttributeDataMap& data, size_t const vertexCount, + bool isMorphTarget = false) { + assert_invariant(accessor->count == vertexCount); + assert_invariant(data.find(attrib) != data.end()); + + unpack(accessor, vertexCount, data::get(data), isMorphTarget); +} + +template +void add(AttributeDataMap& data, size_t const vertexCount, float3* addition) { + assert_invariant(data.find(attrib) != data.end()); + + T datav = std::get(data[attrib]); + for (size_t i = 0; i < vertexCount; ++i) { + if constexpr(std::is_same_v) { + datav[i] += addition[i].xy; + } else if constexpr(std::is_same_v) { + datav[i] += addition[i]; + } else if constexpr(std::is_same_v) { + datav[i].xyz += addition[i]; + } + } +} + +} // namespace data + +void destroy(AttributeDataMap& data) { + data::free(data); + data::free(data); + data::free(data); + data::free(data); + data::free(data); + data::free(data); + data::free(data); + data::free(data); +} + +} // anonymous namespace + +namespace filament::gltfio { + +void TangentsJobExtended::run(Params* params) { + cgltf_primitive const& prim = *params->in.prim; + int const morphTargetIndex = params->in.morphTargetIndex; + bool const isMorphTarget = morphTargetIndex != kMorphTargetUnused; + bool const isUnlit = prim.material ? prim.material->unlit : false; + + // Extract the vertex count from the first attribute. All attributes must have the same count. + assert_invariant(prim.attributes_count > 0); + auto const vertexCount = prim.attributes[0].data->count; + assert_invariant(vertexCount > 0); + + std::unordered_map accessors; + std::unordered_map morphAccessors; + AttributeDataMap attributes; + + // Extract the accessor per attribute from cgltf into our attributes mapping. + bool hasUV0 = false; + for (cgltf_size aindex = 0; aindex < prim.attributes_count; ++aindex) { + cgltf_attribute const& attr = prim.attributes[aindex]; + cgltf_accessor* accessor = attr.data; + assert_invariant(accessor); + if (auto const attrCode = toCode({attr.type, attr.index}, params->in.uvmap, hasUV0); + attrCode != INVALID_ID) { + hasUV0 = hasUV0 || attrCode == UV0_ID; + accessors[attrCode] = accessor; + } + } + + std::vector morphDelta; + if (isMorphTarget) { + auto const& morphTarget = prim.targets[morphTargetIndex]; + decltype(params->in.uvmap) tmpUvmap; // just a placeholder since we don't consider morph target uvs. + for (cgltf_size aindex = 0; aindex < morphTarget.attributes_count; aindex++) { + cgltf_attribute const& attr = morphTarget.attributes[aindex]; + if (auto const attrCode = toCode({attr.type, attr.index}, tmpUvmap, false); + attrCode != INVALID_ID) { + assert_invariant(accessors.find(attrCode) != accessors.end() && + "Morph target data has no corresponding base vertex data."); + morphAccessors[attrCode] = attr.data; + } + } + morphDelta.resize(vertexCount); + } + using AuxType = TangentSpaceMeshWrapper::AuxType; + TangentSpaceMeshWrapper::Builder tob(isUnlit); + tob.vertexCount(vertexCount); + + // We go through all of the accessors (that we care about) associated with the primitive and + // extra the associated data. For morph targets, we also find the associated morph target offset + // and apply offsets where possible. + for (auto [attr, accessor]: accessors) { + switch (attr) { + case POSITIONS_ID: + data::allocate(attributes, vertexCount); + data::unpack(accessor, attributes, vertexCount); + if (auto itr = morphAccessors.find(attr); itr != morphAccessors.end()) { + data::unpack(itr->second, vertexCount, morphDelta.data(), + isMorphTarget); + data::add(attributes, vertexCount, morphDelta.data()); + + // We stash the positions as colors so that they can be retrieved without change + // after the TBN algo, which might have remeshed the input. + data::allocate(attributes, vertexCount); + float4* storage = data::get(attributes); + for (size_t i = 0; i < vertexCount; i++) { + storage[i] = float4{morphDelta[i], 0.0}; + } + tob.aux(AuxType::COLORS, storage); + } + tob.positions(data::get(attributes)); + break; + case TANGENTS_ID: + data::allocate(attributes, vertexCount); + data::unpack(accessor, attributes, vertexCount); + if (auto itr = morphAccessors.find(attr); itr != morphAccessors.end()) { + data::unpack(itr->second, vertexCount, morphDelta.data()); + data::add(attributes, vertexCount, morphDelta.data()); + } + tob.tangents(data::get(attributes)); + break; + case NORMALS_ID: + data::allocate(attributes, vertexCount); + data::unpack(accessor, attributes, vertexCount); + if (auto itr = morphAccessors.find(attr); itr != morphAccessors.end()) { + data::unpack(itr->second, vertexCount, morphDelta.data()); + data::add(attributes, vertexCount, morphDelta.data()); + } + tob.normals(data::get(attributes)); + break; + case COLORS_ID: + data::allocate(attributes, vertexCount); + data::unpack(accessor, attributes, vertexCount); + tob.aux(AuxType::COLORS, data::get(attributes)); + break; + case UV0_ID: + data::allocate(attributes, vertexCount); + data::unpack(accessor, attributes, vertexCount); + tob.uvs(data::get(attributes)); + break; + case UV1_ID: + data::allocate(attributes, vertexCount); + data::unpack(accessor, attributes, vertexCount); + tob.aux(AuxType::UV1, data::get(attributes)); + break; + case WEIGHTS_ID: + data::allocate(attributes, vertexCount); + data::unpack(accessor, attributes, vertexCount); + tob.aux(AuxType::WEIGHTS, data::get(attributes)); + break; + case JOINTS_ID: + data::allocate(attributes, vertexCount); + data::unpack(accessor, attributes, vertexCount); + tob.aux(AuxType::JOINTS, data::get(attributes)); + break; + default: + break; + } + } + + std::unique_ptr unpackedTriangles; + size_t const triangleCount = prim.indices ? (prim.indices->count / 3) : (vertexCount / 3); + unpackedTriangles.reset(new uint3[triangleCount]); + + // TODO: this is slow. We might be able to skip the manual read if the indices are already in + // the right format. + if (prim.indices) { + for (size_t tri = 0, j = 0; tri < triangleCount; ++tri) { + auto& triangle = unpackedTriangles[tri]; + triangle.x = cgltf_accessor_read_index(prim.indices, j++); + triangle.y = cgltf_accessor_read_index(prim.indices, j++); + triangle.z = cgltf_accessor_read_index(prim.indices, j++); + } + } else { + for (size_t tri = 0, j = 0; tri < triangleCount; ++tri) { + auto& triangle = unpackedTriangles[tri]; + triangle.x = j++; + triangle.y = j++; + triangle.z = j++; + } + } + + tob.triangleCount(triangleCount); + tob.triangles(unpackedTriangles.get()); + auto const mesh = tob.build(); + + auto& out = params->out; + out.vertexCount = mesh->getVertexCount(); + + out.triangleCount = mesh->getTriangleCount(); + out.triangles = mesh->getTriangles(); + + if (!isUnlit) { + out.tbn = mesh->getQuats(); + } + + if (isMorphTarget) { + // For morph targets, we need to retrieve the positions, but note that the unadjusted + // positions are stored as colors. + // For morph targets, we use COLORS as a way to store the original positions. + auto data = mesh->getAux(AuxType::COLORS); + out.positions = (float3*) malloc(sizeof(float3) * out.vertexCount); + for (size_t i = 0; i < out.vertexCount; ++i) { + out.positions[i] = data[i].xyz; + } + free(data); + } else { + for (auto [attr, data]: attributes) { + switch (attr) { + case POSITIONS_ID: + out.positions = mesh->getPositions(); + break; + case COLORS_ID: + out.colors = mesh->getAux(AuxType::COLORS); + break; + case UV0_ID: + out.uv0 = mesh->getUVs(); + break; + case UV1_ID: + out.uv1 = mesh->getAux(AuxType::UV1); + break; + case WEIGHTS_ID: + out.weights = mesh->getAux(AuxType::WEIGHTS); + break; + case JOINTS_ID: + out.joints = mesh->getAux(AuxType::JOINTS); + break; + default: + break; + } + } + } + + destroy(attributes); + TangentSpaceMeshWrapper::destroy(mesh); +} + +} // namespace filament::gltfio diff --git a/libs/gltfio/src/extended/TangentsJobExtended.h b/libs/gltfio/src/extended/TangentsJobExtended.h new file mode 100644 index 00000000000..5fb7544f7c5 --- /dev/null +++ b/libs/gltfio/src/extended/TangentsJobExtended.h @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef GLTFIO_TANGENTS_JOB_EXTENDED_H +#define GLTFIO_TANGENTS_JOB_EXTENDED_H + +#include // for UvMap +#include + +#include + +namespace filament::gltfio { + +// Encapsulates a tangent-space transformation, which computes tangents (and maybe transform the +// mesh vertices/indices depending on the algorithm used). Input to this job can be the base mesh +// and attributes, or it could be a specific morph target, where offsets to the base mesh will be +// computed with respect to the morph target index. +struct TangentsJobExtended { + static constexpr int kMorphTargetUnused = -1; + + // The inputs to the procedure. The prim is owned by the client, which should ensure that it + // stays alive for the duration of the procedure. + struct InputParams { + cgltf_primitive const* prim; + int morphTargetIndex = kMorphTargetUnused; + UvMap uvmap; + }; + + // The outputs of the procedure. The results array gets malloc'd by the procedure, so clients + // should remember to free it. + struct OutputParams { + size_t triangleCount = 0; + math::uint3* triangles = nullptr; + + size_t vertexCount = 0; + math::short4* tbn = nullptr; + math::float2* uv0 = nullptr; + math::float2* uv1 = nullptr; + math::float3* positions = nullptr; + math::ushort4* joints = nullptr; + math::float4* weights = nullptr; + math::float4* colors = nullptr; + + bool isEmpty() const { + return !tbn && !uv0 && !uv1 && !positions && !joints && !weights && !colors; + } + }; + + // Clients might want to track the jobs in an array, so the arguments are bundled into a struct. + struct Params { + InputParams in; + OutputParams out; + uint8_t jobType = 0; + }; + + // Performs tangents generation synchronously. This can be invoked from inside a job if desired. + // The parameters structure is owned by the client. + static void run(Params* params); +}; + +} // namespace filament::gltfio + +#endif // GLTFIO_TANGENTS_JOB_EXTENDED_H diff --git a/libs/gltfio/test/gltfio_test.cpp b/libs/gltfio/test/gltfio_test.cpp new file mode 100644 index 00000000000..239edbaae09 --- /dev/null +++ b/libs/gltfio/test/gltfio_test.cpp @@ -0,0 +1,242 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "materials/uberarchive.h" + +#include +#include + +using namespace filament; +using namespace backend; +using namespace gltfio; +using namespace utils; + +char const* ANIMATED_MORPH_CUBE_GLB = "AnimatedMorphCube.glb"; + +static std::ifstream::pos_type getFileSize(const char* filename) { + std::ifstream in(filename, std::ifstream::ate | std::ifstream::binary); + return in.tellg(); +} + +class glTFData { +public: + glTFData(Path filename, Engine* engine, MaterialProvider* materialProvider, + NameComponentManager* nameManager) + : mAssetLoader(AssetLoader::create({engine, materialProvider, nameManager})), + mResourceLoader(new ResourceLoader({ + engine, filename.getAbsolutePath().c_str(), false, /* normalizeSkinningWeights */ + })), + mStbDecoder(createStbProvider(engine)), mKtxDecoder(createKtx2Provider(engine)) { + mResourceLoader->addTextureProvider("image/png", mStbDecoder); + mResourceLoader->addTextureProvider("image/ktx2", mKtxDecoder); + + long contentSize = static_cast(getFileSize(filename.c_str())); + if (contentSize <= 0) { + std::cerr << "Unable to open " << filename.c_str() << std::endl; + exit(1); + } + + // Consume the glTF file. + std::ifstream in(filename.c_str(), std::ifstream::binary | std::ifstream::in); + std::vector buffer(static_cast(contentSize)); + if (!in.read((char*) buffer.data(), contentSize)) { + std::cerr << "Unable to read " << filename.c_str() << std::endl; + exit(1); + } + + // Parse the glTF file and create Filament entities. + mAsset = mAssetLoader->createAsset(buffer.data(), buffer.size()); + buffer.clear(); + buffer.shrink_to_fit(); + + if (!mAsset) { + std::cerr << "Unable to parse " << filename.c_str() << std::endl; + exit(1); + } + + // Load resources + if (!mResourceLoader->asyncBeginLoad(mAsset)) { + std::cerr << "Unable to start loading resources for " << filename << std::endl; + exit(1); + } + mAsset->releaseSourceData(); + } + + ~glTFData() { + mAssetLoader->destroyAsset(mAsset); + delete mResourceLoader; + delete mStbDecoder; + delete mKtxDecoder; + + AssetLoader::destroy(&mAssetLoader); + } + + FilamentAsset* getAsset() const { return mAsset; } + + AssetLoader* mAssetLoader; + ResourceLoader* mResourceLoader = nullptr; + TextureProvider* mStbDecoder = nullptr; + TextureProvider* mKtxDecoder = nullptr; + FilamentAsset* mAsset = nullptr; +}; + +class glTFIOTest : public testing::Test { +protected: + Engine* mEngine = nullptr; + NameComponentManager* mNameManager = nullptr; + MaterialProvider* mMaterialProvider = nullptr; + + // std::unique_ptr mData; + std::unordered_map> mData; + + void SetUp() override { + mEngine = Engine::Builder().backend(Backend::NOOP).build(); + + mNameManager = new NameComponentManager(EntityManager::get()); + mMaterialProvider = createUbershaderProvider(mEngine, UBERARCHIVE_DEFAULT_DATA, + UBERARCHIVE_DEFAULT_SIZE); + + for (auto fname: {ANIMATED_MORPH_CUBE_GLB}) { + Path gltfFile = Path::getCurrentExecutable().getParent() + Path(fname); + mData[fname] = + std::make_unique(gltfFile, mEngine, mMaterialProvider, mNameManager); + } + } + + void TearDown() override { + mData.clear(); + mMaterialProvider->destroyMaterials(); + Engine::destroy(&mEngine); + + delete mMaterialProvider; + delete mNameManager; + } +}; + +TEST_F(glTFIOTest, AnimatedMorphCubeMaterials) { + FilamentAsset const& morphCubeAsset = *mData[ANIMATED_MORPH_CUBE_GLB]->getAsset(); + Entity const* renderables = morphCubeAsset.getRenderableEntities(); + auto& renderableManager = mEngine->getRenderableManager(); + + auto inst = renderableManager.getInstance(renderables[0]); + auto materialInst = renderableManager.getMaterialInstanceAt(inst, 0); + std::string_view name{materialInst->getName()}; + + EXPECT_EQ(name, "Material"); +} + +// A macro to help with mat comparisons within a range. +#define EXPECT_MAT_NEAR(MAT1, MAT2, eps) \ +do { \ + const decltype(MAT1) v1 = MAT1; \ + const decltype(MAT2) v2 = MAT2; \ + EXPECT_EQ(v1.NUM_ROWS, v2.NUM_ROWS); \ + EXPECT_EQ(v1.NUM_COLS, v2.NUM_COLS); \ + for (int i = 0; i < v1.NUM_ROWS; ++i) { \ + for (int j = 0; j < v1.NUM_COLS; ++j) \ + EXPECT_NEAR(v1[i][j], v2[i][j], eps) << \ + "v[" << i << "][" << j << "]"; \ + } \ +} while(0) + + +TEST_F(glTFIOTest, AnimatedMorphCubeTransforms) { + FilamentAsset const& morphCubeAsset = *mData[ANIMATED_MORPH_CUBE_GLB]->getAsset(); + auto const& transformManager = mEngine->getTransformManager(); + Entity const* renderables = morphCubeAsset.getRenderableEntities(); + + EXPECT_EQ(morphCubeAsset.getRenderableEntityCount(), 1u); + + EXPECT_TRUE(transformManager.hasComponent(renderables[0])); + + auto const inst = transformManager.getInstance(renderables[0]); + math::mat4f const transform = transformManager.getTransform(inst); + math::mat4f const expectedTransform = composeMatrix(math::float3{0.0, 0.0, 0.0}, + math::quatf{0.0, 0.0, 0.7071067, -0.7071068}, math::float3{100.0, 100.0, 100.0}); + + auto const result = inverse(transform) * expectedTransform; + + float const value_eps = float(0.00001) * std::numeric_limits::epsilon(); + + // We expect the result to be identity + EXPECT_MAT_NEAR(result, math::mat4f{}, value_eps); +} + +TEST_F(glTFIOTest, AnimatedMorphCubeRenderables) { + FilamentAsset const& morphCubeAsset = *mData[ANIMATED_MORPH_CUBE_GLB]->getAsset(); + Entity const* renderables = morphCubeAsset.getRenderableEntities(); + auto const& renderableManager = mEngine->getRenderableManager(); + + EXPECT_EQ(morphCubeAsset.getRenderableEntityCount(), 1u); + + EXPECT_TRUE(renderableManager.hasComponent(renderables[0])); + auto const inst = renderableManager.getInstance(renderables[0]); + EXPECT_EQ(renderableManager.getPrimitiveCount(inst), 1u); + AttributeBitset const attribs = renderableManager.getEnabledAttributesAt(inst, 0); + + EXPECT_TRUE(attribs[VertexAttribute::POSITION]); + EXPECT_TRUE(attribs[VertexAttribute::TANGENTS]); + if (mMaterialProvider->needsDummyData(VertexAttribute::COLOR)) { + EXPECT_TRUE(attribs[VertexAttribute::COLOR]); + } else { + EXPECT_FALSE(attribs[VertexAttribute::COLOR]); + } + if (mMaterialProvider->needsDummyData(VertexAttribute::UV0)) { + EXPECT_TRUE(attribs[VertexAttribute::UV0]); + } else { + EXPECT_FALSE(attribs[VertexAttribute::UV0]); + } + if (mMaterialProvider->needsDummyData(VertexAttribute::UV1)) { + EXPECT_TRUE(attribs[VertexAttribute::UV1]); + } else { + EXPECT_FALSE(attribs[VertexAttribute::UV1]); + } + + // The AnimatedMorphCube has two morph targets: "thin" and "angle" + EXPECT_EQ(renderableManager.getMorphTargetCount(inst), 2u); + + // The 0-th MorphTargetBuffer holds both of the targets + auto const morphTargetBuffer = renderableManager.getMorphTargetBuffer(inst); + EXPECT_EQ(morphTargetBuffer->getCount(), 2u); + + // The number of vertices for the morph target should be the face vertices in a cube => + // (6 faces * 4 vertices per face) = 24 vertices + EXPECT_EQ(morphTargetBuffer->getVertexCount(), 24u); +} + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/libs/ibl/CMakeLists.txt b/libs/ibl/CMakeLists.txt index 23b1937cc2b..aae32fbaa79 100644 --- a/libs/ibl/CMakeLists.txt +++ b/libs/ibl/CMakeLists.txt @@ -51,8 +51,8 @@ if (MSVC) target_compile_options(${TARGET} PRIVATE /fp:fast) target_compile_options(${TARGET}-lite PRIVATE /fp:fast) else() - target_compile_options(${TARGET} PRIVATE -ffast-math) - target_compile_options(${TARGET}-lite PRIVATE -ffast-math) + target_compile_options(${TARGET} PRIVATE -ffast-math -fno-finite-math-only) + target_compile_options(${TARGET}-lite PRIVATE -ffast-math -fno-finite-math-only) endif() diff --git a/libs/ibl/src/CubemapIBL.cpp b/libs/ibl/src/CubemapIBL.cpp index f6ce8ab2697..ecde2fafe3b 100644 --- a/libs/ibl/src/CubemapIBL.cpp +++ b/libs/ibl/src/CubemapIBL.cpp @@ -1022,7 +1022,7 @@ void CubemapIBL::DFG(JobSystem& js, Image& dst, bool multiscatter, bool cloth) { // here we're using ^2, but other mappings are possible. // ==> coord = sqrt(linear_roughness) const float linear_roughness = coord * coord; - for (size_t x = 0; x < height; x++, data++) { + for (size_t x = 0; x < width; x++, data++) { // const float NoV = float(x) / (width-1); const float NoV = saturate((x + 0.5f) / width); float3 r = { dfvFunction(NoV, linear_roughness, 1024), 0 }; diff --git a/libs/ibl/src/CubemapSH.cpp b/libs/ibl/src/CubemapSH.cpp index fc8b00c7825..5d22cb804b8 100644 --- a/libs/ibl/src/CubemapSH.cpp +++ b/libs/ibl/src/CubemapSH.cpp @@ -22,6 +22,7 @@ #include "CubemapUtilsImpl.h" +#include #include #include diff --git a/libs/iblprefilter/CMakeLists.txt b/libs/iblprefilter/CMakeLists.txt index e39212e4382..c001de6bfcb 100644 --- a/libs/iblprefilter/CMakeLists.txt +++ b/libs/iblprefilter/CMakeLists.txt @@ -111,6 +111,7 @@ elseif(WEBGL) else() set(OPTIMIZATION_FLAGS -ffast-math + -fno-finite-math-only -ffp-contract=fast # TODO: aggressive vectorization is currently broken on Android # -fslp-vectorize-aggressive diff --git a/libs/iblprefilter/include/filament-iblprefilter/IBLPrefilterContext.h b/libs/iblprefilter/include/filament-iblprefilter/IBLPrefilterContext.h index 15cd681021e..903c42589f2 100644 --- a/libs/iblprefilter/include/filament-iblprefilter/IBLPrefilterContext.h +++ b/libs/iblprefilter/include/filament-iblprefilter/IBLPrefilterContext.h @@ -58,6 +58,10 @@ class Texture; class UTILS_PUBLIC IBLPrefilterContext { public: + enum class Kernel : uint8_t { + D_GGX, // Trowbridge-reitz distribution + }; + /** * Creates an IBLPrefilter context. * @param engine filament engine to use @@ -84,12 +88,23 @@ class UTILS_PUBLIC IBLPrefilterContext { */ class EquirectangularToCubemap { public: + + struct Config { + bool mirror = true; //!< mirror the source horizontally + }; + /** - * Creates a EquirectangularToCubemap processor. + * Creates a EquirectangularToCubemap processor using the default Config * @param context IBLPrefilterContext to use */ explicit EquirectangularToCubemap(IBLPrefilterContext& context); + /** + * Creates a EquirectangularToCubemap processor using the provided Config + * @param context IBLPrefilterContext to use + */ + EquirectangularToCubemap(IBLPrefilterContext& context, Config const& config); + /** * Destroys all GPU resources created during initialization. */ @@ -109,7 +124,7 @@ class UTILS_PUBLIC IBLPrefilterContext { * - Must be allocated with all mip levels. * - Must be SAMPLEABLE * @param outCubemap Output cubemap. If null the texture is automatically created - * with default parameters (size of 256 with 5 levels). + * with default parameters (size of 256 with 9 levels). * - Must be a cubemap * - Must have SAMPLEABLE and COLOR_ATTACHMENT usage bits * @return returns outCubemap @@ -121,8 +136,103 @@ class UTILS_PUBLIC IBLPrefilterContext { private: IBLPrefilterContext& mContext; filament::Material* mEquirectMaterial = nullptr; + Config mConfig{}; }; + /** + * IrradianceFilter is a GPU based implementation of the diffuse probe pre-integration filter. + * An instance of IrradianceFilter is needed per filter configuration. A filter configuration + * contains the filter's kernel and sample count. + */ + class IrradianceFilter { + public: + using Kernel = Kernel; + + /** + * Filter configuration. + */ + struct Config { + uint16_t sampleCount = 1024u; //!< filter sample count (max 2048) + Kernel kernel = Kernel::D_GGX; //!< filter kernel + }; + + /** + * Filtering options for the current environment. + */ + struct Options { + float hdrLinear = 1024.0f; //!< no HDR compression up to this value + float hdrMax = 16384.0f; //!< HDR compression between hdrLinear and hdrMax + float lodOffset = 2.0f; //!< Good values are 2.0 or 3.0. Higher values help with heavily HDR inputs. + bool generateMipmap = true; //!< set to false if the input environment map already has mipmaps + }; + + /** + * Creates a IrradianceFilter processor. + * @param context IBLPrefilterContext to use + * @param config Configuration of the filter + */ + IrradianceFilter(IBLPrefilterContext& context, Config config); + + /** + * Creates a filter with the default configuration. + * @param context IBLPrefilterContext to use + */ + explicit IrradianceFilter(IBLPrefilterContext& context); + + /** + * Destroys all GPU resources created during initialization. + */ + ~IrradianceFilter() noexcept; + + IrradianceFilter(IrradianceFilter const&) = delete; + IrradianceFilter& operator=(IrradianceFilter const&) = delete; + IrradianceFilter(IrradianceFilter&& rhs) noexcept; + IrradianceFilter& operator=(IrradianceFilter&& rhs) noexcept; + + /** + * Generates an irradiance cubemap. Mipmaps are not generated even if present. + * @param options Options for this environment + * @param environmentCubemap Environment cubemap (input). Can't be null. + * This cubemap must be SAMPLEABLE and must have all its + * levels allocated. If Options.generateMipmap is true, + * the mipmap levels will be overwritten, otherwise + * it is assumed that all levels are correctly initialized. + * @param outIrradianceTexture Output irradiance texture or, if null, it is + * automatically created with some default parameters. + * outIrradianceTexture must be a cubemap, it must have + * at least COLOR_ATTACHMENT and SAMPLEABLE usages. + * + * @return returns outIrradianceTexture + */ + filament::Texture* operator()(Options options, + filament::Texture const* environmentCubemap, + filament::Texture* outIrradianceTexture = nullptr); + + /** + * Generates a prefiltered cubemap. + * @param environmentCubemap Environment cubemap (input). Can't be null. + * This cubemap must be SAMPLEABLE and must have all its + * levels allocated. If Options.generateMipmap is true, + * the mipmap levels will be overwritten, otherwise + * it is assumed that all levels are correctly initialized. + * @param outIrradianceTexture Output irradiance texture or, if null, it is + * automatically created with some default parameters. + * outIrradianceTexture must be a cubemap, it must have + * at least COLOR_ATTACHMENT and SAMPLEABLE usages. + * + * @return returns outReflectionsTexture + */ + filament::Texture* operator()( + filament::Texture const* environmentCubemap, + filament::Texture* outIrradianceTexture = nullptr); + + private: + filament::Texture* createIrradianceTexture(); + IBLPrefilterContext& mContext; + filament::Material* mKernelMaterial = nullptr; + filament::Texture* mKernelTexture = nullptr; + uint32_t mSampleCount = 0u; + }; /** * SpecularFilter is a GPU based implementation of the specular probe pre-integration filter. @@ -131,9 +241,7 @@ class UTILS_PUBLIC IBLPrefilterContext { */ class SpecularFilter { public: - enum class Kernel : uint8_t { - D_GGX, // Trowbridge-reitz distribution - }; + using Kernel = Kernel; /** * Filter configuration. @@ -151,7 +259,7 @@ class UTILS_PUBLIC IBLPrefilterContext { float hdrLinear = 1024.0f; //!< no HDR compression up to this value float hdrMax = 16384.0f; //!< HDR compression between hdrLinear and hdrMax float lodOffset = 1.0f; //!< Good values are 1.0 or 2.0. Higher values help with heavily HDR inputs. - bool generateMipmap = true; //!< set to false if the environment map already has mipmaps + bool generateMipmap = true; //!< set to false if the input environment map already has mipmaps }; /** @@ -237,6 +345,7 @@ class UTILS_PUBLIC IBLPrefilterContext { utils::Entity mCameraEntity{}; filament::View* mView{}; filament::Material* mIntegrationMaterial{}; + filament::Material* mIrradianceIntegrationMaterial{}; }; #endif //TNT_IBL_PREFILTER_IBLPREFILTER_H diff --git a/libs/iblprefilter/src/IBLPrefilterContext.cpp b/libs/iblprefilter/src/IBLPrefilterContext.cpp index c911301b3ae..0ac10e50711 100644 --- a/libs/iblprefilter/src/IBLPrefilterContext.cpp +++ b/libs/iblprefilter/src/IBLPrefilterContext.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -29,12 +30,22 @@ #include #include -#include +#include + +#include #include +#include #include -#include -#include +#include +#include + +#include +#include +#include + +#include +#include #include "generated/resources/iblprefilter_materials.h" @@ -78,6 +89,12 @@ IBLPrefilterContext::IBLPrefilterContext(Engine& engine) IBLPREFILTER_MATERIALS_IBLPREFILTER_DATA, IBLPREFILTER_MATERIALS_IBLPREFILTER_SIZE).build(engine); + mIrradianceIntegrationMaterial = Material::Builder().package( + IBLPREFILTER_MATERIALS_IBLPREFILTER_DATA, + IBLPREFILTER_MATERIALS_IBLPREFILTER_SIZE) + .constant("irradiance", true) + .build(engine); + mVertexBuffer = VertexBuffer::Builder() .vertexCount(3) .bufferCount(1) @@ -97,10 +114,8 @@ IBLPrefilterContext::IBLPrefilterContext(Engine& engine) mIndexBuffer->setBuffer(engine, { sFullScreenTriangleIndices, sizeof(sFullScreenTriangleIndices) }); - RenderableManager::Builder(1) .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, mVertexBuffer, mIndexBuffer) - .material(0, mIntegrationMaterial->getDefaultInstance()) .culling(false) .castShadows(false) .receiveShadows(false) @@ -131,6 +146,7 @@ IBLPrefilterContext::~IBLPrefilterContext() noexcept { engine.destroy(mVertexBuffer); engine.destroy(mIndexBuffer); engine.destroy(mIntegrationMaterial); + engine.destroy(mIrradianceIntegrationMaterial); engine.destroy(mFullScreenQuadEntity); engine.destroyCameraComponent(mCameraEntity); em.destroy(mFullScreenQuadEntity); @@ -154,6 +170,7 @@ IBLPrefilterContext& IBLPrefilterContext::operator=(IBLPrefilterContext&& rhs) n swap(mCameraEntity, rhs.mCameraEntity); swap(mView, rhs.mView); swap(mIntegrationMaterial, rhs.mIntegrationMaterial); + swap(mIrradianceIntegrationMaterial, rhs.mIrradianceIntegrationMaterial); } return *this; } @@ -161,13 +178,19 @@ IBLPrefilterContext& IBLPrefilterContext::operator=(IBLPrefilterContext&& rhs) n // ------------------------------------------------------------------------------------------------ IBLPrefilterContext::EquirectangularToCubemap::EquirectangularToCubemap( - IBLPrefilterContext& context) : mContext(context) { + IBLPrefilterContext& context, + IBLPrefilterContext::EquirectangularToCubemap::Config const& config) + : mContext(context), mConfig(config) { Engine& engine = mContext.mEngine; mEquirectMaterial = Material::Builder().package( IBLPREFILTER_MATERIALS_EQUIRECTTOCUBE_DATA, IBLPREFILTER_MATERIALS_EQUIRECTTOCUBE_SIZE).build(engine); } +IBLPrefilterContext::EquirectangularToCubemap::EquirectangularToCubemap( + IBLPrefilterContext& context) : EquirectangularToCubemap(context, {}) { +} + IBLPrefilterContext::EquirectangularToCubemap::~EquirectangularToCubemap() noexcept { Engine& engine = mContext.mEngine; engine.destroy(mEquirectMaterial); @@ -203,18 +226,18 @@ Texture* IBLPrefilterContext::EquirectangularToCubemap::operator()( Engine& engine = mContext.mEngine; View* const view = mContext.mView; Renderer* const renderer = mContext.mRenderer; - MaterialInstance* const mi = mEquirectMaterial->getDefaultInstance(); + MaterialInstance* const mi = mEquirectMaterial->createInstance(); - ASSERT_PRECONDITION(equirect != nullptr, "equirect is null!"); + FILAMENT_CHECK_PRECONDITION(equirect != nullptr) << "equirect is null!"; - ASSERT_PRECONDITION(equirect->getTarget() == Texture::Sampler::SAMPLER_2D, - "equirect must be a 2D texture."); + FILAMENT_CHECK_PRECONDITION(equirect->getTarget() == Texture::Sampler::SAMPLER_2D) + << "equirect must be a 2D texture."; UTILS_UNUSED_IN_RELEASE - const uint8_t maxLevelCount = uint8_t(std::log2(equirect->getWidth()) + 0.5f) + 1u; + const uint8_t maxLevelCount = std::max(1, std::ilogbf(float(equirect->getWidth())) + 1); - ASSERT_PRECONDITION(equirect->getLevels() == maxLevelCount, - "equirect must have %u mipmap levels allocated.", +maxLevelCount); + FILAMENT_CHECK_PRECONDITION(equirect->getLevels() == maxLevelCount) + << "equirect must have " << +maxLevelCount << " mipmap levels allocated."; if (outCube == nullptr) { outCube = Texture::Builder() @@ -225,14 +248,14 @@ Texture* IBLPrefilterContext::EquirectangularToCubemap::operator()( .build(engine); } - ASSERT_PRECONDITION(outCube->getTarget() == Texture::Sampler::SAMPLER_CUBEMAP, - "outCube must be a Cubemap texture."); + FILAMENT_CHECK_PRECONDITION(outCube->getTarget() == Texture::Sampler::SAMPLER_CUBEMAP) + << "outCube must be a Cubemap texture."; const uint32_t dim = outCube->getWidth(); RenderableManager& rcm = engine.getRenderableManager(); - rcm.setMaterialInstanceAt( - rcm.getInstance(mContext.mFullScreenQuadEntity), 0, mi); + auto const ci = rcm.getInstance(mContext.mFullScreenQuadEntity); + rcm.setMaterialInstanceAt(ci, 0, mi); TextureSampler environmentSampler; environmentSampler.setMagFilter(SamplerMagFilter::LINEAR); @@ -251,6 +274,8 @@ Texture* IBLPrefilterContext::EquirectangularToCubemap::operator()( .texture(RenderTarget::AttachmentPoint::COLOR1, outCube) .texture(RenderTarget::AttachmentPoint::COLOR2, outCube); + mi->setParameter("mirror", mConfig.mirror ? -1.0f : 1.0f); + for (size_t i = 0; i < 2; i++) { mi->setParameter("side", i == 0 ? 1.0f : -1.0f); @@ -264,12 +289,217 @@ Texture* IBLPrefilterContext::EquirectangularToCubemap::operator()( engine.destroy(rt); } + rcm.clearMaterialInstanceAt(ci, 0); + engine.destroy(mi); + return outCube; } + +// ------------------------------------------------------------------------------------------------ + +IBLPrefilterContext::IrradianceFilter::IrradianceFilter(IBLPrefilterContext& context, + IBLPrefilterContext::IrradianceFilter::Config config) + : mContext(context), + mSampleCount(std::min(config.sampleCount, uint16_t(2048))) { + + SYSTRACE_CALL(); + using namespace backend; + + Engine& engine = mContext.mEngine; + View* const view = mContext.mView; + Renderer* const renderer = mContext.mRenderer; + + mKernelMaterial = Material::Builder().package( + IBLPREFILTER_MATERIALS_GENERATEKERNEL_DATA, + IBLPREFILTER_MATERIALS_GENERATEKERNEL_SIZE) + .constant("irradiance", true) + .build(engine); + + // { L.x, L.y, L.z, lod } + mKernelTexture = Texture::Builder() + .sampler(Texture::Sampler::SAMPLER_2D) + .format(Texture::InternalFormat::RGBA16F) + .usage(Texture::Usage::SAMPLEABLE | Texture::Usage::COLOR_ATTACHMENT) + .width(1) + .height(mSampleCount) + .build(engine); + + MaterialInstance* const mi = mKernelMaterial->createInstance(); + mi->setParameter("size", uint2{ 1, mSampleCount }); + mi->setParameter("sampleCount", float(mSampleCount)); + + RenderableManager& rcm = engine.getRenderableManager(); + auto const ci = rcm.getInstance(mContext.mFullScreenQuadEntity); + rcm.setMaterialInstanceAt(ci, 0, mi); + + RenderTarget* const rt = RenderTarget::Builder() + .texture(RenderTarget::AttachmentPoint::COLOR0, mKernelTexture) + .build(engine); + + view->setRenderTarget(rt); + view->setViewport({ 0, 0, 1, mSampleCount }); + + renderer->renderStandaloneView(view); + + rcm.clearMaterialInstanceAt(ci, 0); + + engine.destroy(rt); + engine.destroy(mi); +} + +UTILS_NOINLINE +IBLPrefilterContext::IrradianceFilter::IrradianceFilter(IBLPrefilterContext& context) + : IrradianceFilter(context, {}) { +} + +IBLPrefilterContext::IrradianceFilter::~IrradianceFilter() noexcept { + Engine& engine = mContext.mEngine; + engine.destroy(mKernelTexture); + engine.destroy(mKernelMaterial); +} + +IBLPrefilterContext::IrradianceFilter::IrradianceFilter( + IBLPrefilterContext::IrradianceFilter&& rhs) noexcept + : mContext(rhs.mContext) { + this->operator=(std::move(rhs)); +} + +IBLPrefilterContext::IrradianceFilter& IBLPrefilterContext::IrradianceFilter::operator=( + IBLPrefilterContext::IrradianceFilter&& rhs) noexcept { + using std::swap; + if (this != & rhs) { + swap(mKernelMaterial, rhs.mKernelMaterial); + swap(mKernelTexture, rhs.mKernelTexture); + mSampleCount = rhs.mSampleCount; + } + return *this; +} + +filament::Texture* IBLPrefilterContext::IrradianceFilter::operator()( + IBLPrefilterContext::IrradianceFilter::Options options, + filament::Texture const* environmentCubemap, filament::Texture* outIrradianceTexture) { + + SYSTRACE_CALL(); + using namespace backend; + + FILAMENT_CHECK_PRECONDITION(environmentCubemap != nullptr) << "environmentCubemap is null!"; + + FILAMENT_CHECK_PRECONDITION( + environmentCubemap->getTarget() == Texture::Sampler::SAMPLER_CUBEMAP) + << "environmentCubemap must be a cubemap."; + + UTILS_UNUSED_IN_RELEASE + const uint8_t maxLevelCount = uint8_t(std::log2(environmentCubemap->getWidth()) + 0.5f) + 1u; + + FILAMENT_CHECK_PRECONDITION(environmentCubemap->getLevels() == maxLevelCount) + << "environmentCubemap must have " << +maxLevelCount << " mipmap levels allocated."; + + if (outIrradianceTexture == nullptr) { + outIrradianceTexture = createIrradianceTexture(); + } + + FILAMENT_CHECK_PRECONDITION( + outIrradianceTexture->getTarget() == Texture::Sampler::SAMPLER_CUBEMAP) + << "outReflectionsTexture must be a cubemap."; + + const TextureCubemapFace faces[2][3] = { + { TextureCubemapFace::POSITIVE_X, TextureCubemapFace::POSITIVE_Y, TextureCubemapFace::POSITIVE_Z }, + { TextureCubemapFace::NEGATIVE_X, TextureCubemapFace::NEGATIVE_Y, TextureCubemapFace::NEGATIVE_Z } + }; + + Engine& engine = mContext.mEngine; + View* const view = mContext.mView; + Renderer* const renderer = mContext.mRenderer; + MaterialInstance* const mi = mContext.mIrradianceIntegrationMaterial->createInstance(); + + RenderableManager& rcm = engine.getRenderableManager(); + auto const ci = rcm.getInstance(mContext.mFullScreenQuadEntity); + rcm.setMaterialInstanceAt(ci, 0, mi); + + const uint32_t sampleCount = mSampleCount; + const float linear = options.hdrLinear; + const float compress = options.hdrMax; + const uint32_t dim = outIrradianceTexture->getWidth(); + const float omegaP = (4.0f * f::PI) / float(6 * dim * dim); + + TextureSampler environmentSampler; + environmentSampler.setMagFilter(SamplerMagFilter::LINEAR); + environmentSampler.setMinFilter(SamplerMinFilter::LINEAR_MIPMAP_LINEAR); + + mi->setParameter("environment", environmentCubemap, environmentSampler); + mi->setParameter("kernel", mKernelTexture, TextureSampler{ SamplerMagFilter::NEAREST }); + mi->setParameter("compress", float2{ linear, compress }); + mi->setParameter("lodOffset", options.lodOffset - log4(omegaP)); + mi->setParameter("sampleCount", sampleCount); + + if (options.generateMipmap) { + // We need mipmaps for prefiltering + environmentCubemap->generateMipmaps(engine); + } + + RenderTarget::Builder builder; + builder.texture(RenderTarget::AttachmentPoint::COLOR0, outIrradianceTexture) + .texture(RenderTarget::AttachmentPoint::COLOR1, outIrradianceTexture) + .texture(RenderTarget::AttachmentPoint::COLOR2, outIrradianceTexture); + + + view->setViewport({ 0, 0, dim, dim }); + + for (size_t i = 0; i < 2; i++) { + mi->setParameter("side", i == 0 ? 1.0f : -1.0f); + + builder.face(RenderTarget::AttachmentPoint::COLOR0, faces[i][0]) + .face(RenderTarget::AttachmentPoint::COLOR1, faces[i][1]) + .face(RenderTarget::AttachmentPoint::COLOR2, faces[i][2]); + + RenderTarget* const rt = builder.build(engine); + view->setRenderTarget(rt); + renderer->renderStandaloneView(view); + engine.destroy(rt); + } + + rcm.clearMaterialInstanceAt(ci, 0); + + engine.destroy(mi); + + return outIrradianceTexture; +} + +UTILS_NOINLINE +filament::Texture* IBLPrefilterContext::IrradianceFilter::operator()( + filament::Texture const* environmentCubemap, filament::Texture* outIrradianceTexture) { + return operator()({}, environmentCubemap, outIrradianceTexture); +} + +filament::Texture* IBLPrefilterContext::IrradianceFilter::createIrradianceTexture() { + Engine& engine = mContext.mEngine; + + Texture* const outCubemap = Texture::Builder() + .sampler(Texture::Sampler::SAMPLER_CUBEMAP) + .format(Texture::InternalFormat::R11F_G11F_B10F) + .usage(Texture::Usage::COLOR_ATTACHMENT | Texture::Usage::SAMPLEABLE) + .width(256).height(256).levels(0xff) + .build(engine); + + return outCubemap; +} + // ------------------------------------------------------------------------------------------------ IBLPrefilterContext::SpecularFilter::SpecularFilter(IBLPrefilterContext& context, Config config) : mContext(context) { + + auto lodToPerceptualRoughness = [](const float lod) -> float { + // Inverse perceptualRoughness-to-LOD mapping: + // The LOD-to-perceptualRoughness mapping is a quadratic fit for + // log2(perceptualRoughness)+iblMaxMipLevel when iblMaxMipLevel is 4. + // We found empirically that this mapping works very well for a 256 cubemap with 5 levels used, + // but also scales well for other iblMaxMipLevel values. + const float a = 2.0f; + const float b = -1.0f; + return (lod != 0.0f) ? saturate((sqrt(a * a + 4.0f * b * lod) - a) / (2.0f * b)) : 0.0f; + }; + SYSTRACE_CALL(); using namespace backend; @@ -285,7 +515,6 @@ IBLPrefilterContext::SpecularFilter::SpecularFilter(IBLPrefilterContext& context IBLPREFILTER_MATERIALS_GENERATEKERNEL_DATA, IBLPREFILTER_MATERIALS_GENERATEKERNEL_SIZE).build(engine); - // { L.x, L.y, L.z, lod } mKernelTexture = Texture::Builder() .sampler(Texture::Sampler::SAMPLER_2D) @@ -295,14 +524,22 @@ IBLPrefilterContext::SpecularFilter::SpecularFilter(IBLPrefilterContext& context .height(mSampleCount) .build(engine); - MaterialInstance* const mi = mKernelMaterial->getDefaultInstance(); + float roughnessArray[16] = {}; + for (size_t i = 0, c = mLevelCount; i < c; i++) { + float const perceptualRoughness = lodToPerceptualRoughness( + saturate(float(i) * (1.0f / (float(mLevelCount) - 1.0f)))); + float const roughness = perceptualRoughness * perceptualRoughness; + roughnessArray[i] = roughness; + } + + MaterialInstance* const mi = mKernelMaterial->createInstance(); mi->setParameter("size", uint2{ mLevelCount, mSampleCount }); mi->setParameter("sampleCount", float(mSampleCount)); - mi->setParameter("oneOverLevelsMinusOne", 1.0f / (mLevelCount - 1.0f)); + mi->setParameter("roughness", roughnessArray, 16); RenderableManager& rcm = engine.getRenderableManager(); - rcm.setMaterialInstanceAt( - rcm.getInstance(mContext.mFullScreenQuadEntity), 0, mi); + auto const ci = rcm.getInstance(mContext.mFullScreenQuadEntity); + rcm.setMaterialInstanceAt(ci, 0, mi); RenderTarget* const rt = RenderTarget::Builder() .texture(RenderTarget::AttachmentPoint::COLOR0, mKernelTexture) @@ -313,7 +550,10 @@ IBLPrefilterContext::SpecularFilter::SpecularFilter(IBLPrefilterContext& context renderer->renderStandaloneView(view); + rcm.clearMaterialInstanceAt(ci, 0); + engine.destroy(rt); + engine.destroy(mi); } UTILS_NOINLINE @@ -375,27 +615,29 @@ Texture* IBLPrefilterContext::SpecularFilter::operator()( SYSTRACE_CALL(); using namespace backend; - ASSERT_PRECONDITION(environmentCubemap != nullptr, "environmentCubemap is null!"); + FILAMENT_CHECK_PRECONDITION(environmentCubemap != nullptr) << "environmentCubemap is null!"; - ASSERT_PRECONDITION(environmentCubemap->getTarget() == Texture::Sampler::SAMPLER_CUBEMAP, - "environmentCubemap must be a cubemap."); + FILAMENT_CHECK_PRECONDITION( + environmentCubemap->getTarget() == Texture::Sampler::SAMPLER_CUBEMAP) + << "environmentCubemap must be a cubemap."; UTILS_UNUSED_IN_RELEASE const uint8_t maxLevelCount = uint8_t(std::log2(environmentCubemap->getWidth()) + 0.5f) + 1u; - ASSERT_PRECONDITION(environmentCubemap->getLevels() == maxLevelCount, - "environmentCubemap must have %u mipmap levels allocated.", +maxLevelCount); + FILAMENT_CHECK_PRECONDITION(environmentCubemap->getLevels() == maxLevelCount) + << "environmentCubemap must have " << +maxLevelCount << " mipmap levels allocated."; if (outReflectionsTexture == nullptr) { outReflectionsTexture = createReflectionsTexture(); } - ASSERT_PRECONDITION(outReflectionsTexture->getTarget() == Texture::Sampler::SAMPLER_CUBEMAP, - "outReflectionsTexture must be a cubemap."); + FILAMENT_CHECK_PRECONDITION( + outReflectionsTexture->getTarget() == Texture::Sampler::SAMPLER_CUBEMAP) + << "outReflectionsTexture must be a cubemap."; - ASSERT_PRECONDITION(mLevelCount <= outReflectionsTexture->getLevels(), - "outReflectionsTexture has %u levels but %u are requested.", - +outReflectionsTexture->getLevels(), +mLevelCount); + FILAMENT_CHECK_PRECONDITION(mLevelCount <= outReflectionsTexture->getLevels()) + << "outReflectionsTexture has " << +outReflectionsTexture->getLevels() << " levels but " + << +mLevelCount << " are requested."; const TextureCubemapFace faces[2][3] = { { TextureCubemapFace::POSITIVE_X, TextureCubemapFace::POSITIVE_Y, TextureCubemapFace::POSITIVE_Z }, @@ -405,11 +647,11 @@ Texture* IBLPrefilterContext::SpecularFilter::operator()( Engine& engine = mContext.mEngine; View* const view = mContext.mView; Renderer* const renderer = mContext.mRenderer; - MaterialInstance* const mi = mContext.mIntegrationMaterial->getDefaultInstance(); + MaterialInstance* const mi = mContext.mIntegrationMaterial->createInstance(); RenderableManager& rcm = engine.getRenderableManager(); - rcm.setMaterialInstanceAt( - rcm.getInstance(mContext.mFullScreenQuadEntity), 0, mi); + auto const ci = rcm.getInstance(mContext.mFullScreenQuadEntity); + rcm.setMaterialInstanceAt(ci, 0, mi); const uint32_t sampleCount = mSampleCount; const float linear = options.hdrLinear; @@ -472,5 +714,9 @@ Texture* IBLPrefilterContext::SpecularFilter::operator()( dim >>= 1; } + rcm.clearMaterialInstanceAt(ci, 0); + + engine.destroy(mi); + return outReflectionsTexture; } diff --git a/libs/iblprefilter/src/materials/equirectToCube.mat b/libs/iblprefilter/src/materials/equirectToCube.mat index b35a869b981..36b20e21e23 100644 --- a/libs/iblprefilter/src/materials/equirectToCube.mat +++ b/libs/iblprefilter/src/materials/equirectToCube.mat @@ -10,6 +10,11 @@ material { type : float, name : side, precision: medium + }, + { + type : float, + name : mirror, + precision: medium } ], outputs : [ @@ -48,7 +53,7 @@ fragment { void dummy() {} highp vec2 toEquirect(const highp vec3 s) { - highp float xf = atan2(s.x, s.z) * (1.0 / PI); // range [-1.0, 1.0] + highp float xf = atan(s.x, s.z) * (1.0 / PI); // range [-1.0, 1.0] highp float yf = asin(s.y) * (2.0 / PI); // range [-1.0, 1.0] xf = (xf + 1.0) * 0.5; // range [0, 1.0] yf = (1.0 - yf) * 0.5; // range [0, 1.0] @@ -62,17 +67,22 @@ mediump vec3 sampleEquirect(mediump sampler2D equirect, const highp vec3 r) { void postProcess(inout PostProcessInputs postProcess) { highp vec2 uv = variable_vertex.xy; // interpolated at pixel's center - highp vec2 p = uv * 2.0 - 1.0; + highp vec2 p = vec2( + uv.x * 2.0 - 1.0, + 1.0 - uv.y * 2.0); + float side = materialParams.side; + float mirror = materialParams.mirror; + highp float l = inversesqrt(p.x * p.x + p.y * p.y + 1.0); // compute the view (and normal, since v = n) direction for each face - highp vec3 rx = normalize(vec3( side, -p.y, side * -p.x)); - highp vec3 ry = normalize(vec3( p.x, side, side * p.y)); - highp vec3 rz = normalize(vec3(side * p.x, -p.y, side)); + highp vec3 rx = vec3( side * mirror, p.y, side * -p.x); + highp vec3 ry = vec3( p.x * mirror, side, side * -p.y); + highp vec3 rz = vec3(side * p.x * mirror, p.y, side); - postProcess.outx = sampleEquirect(materialParams_equirect, rx); - postProcess.outy = sampleEquirect(materialParams_equirect, ry); - postProcess.outz = sampleEquirect(materialParams_equirect, rz); + postProcess.outx = sampleEquirect(materialParams_equirect, rx * l); + postProcess.outy = sampleEquirect(materialParams_equirect, ry * l); + postProcess.outz = sampleEquirect(materialParams_equirect, rz * l); } } diff --git a/libs/iblprefilter/src/materials/generateKernel.mat b/libs/iblprefilter/src/materials/generateKernel.mat index 5d9274dd6aa..d1e4da8d80e 100644 --- a/libs/iblprefilter/src/materials/generateKernel.mat +++ b/libs/iblprefilter/src/materials/generateKernel.mat @@ -11,8 +11,8 @@ material { name : sampleCount, }, { - type : float, - name : oneOverLevelsMinusOne, + type : float[16], + name : roughness, } ], outputs : [ @@ -22,6 +22,13 @@ material { type : float4 } ], + constants : [ + { + name : irradiance, + type : bool, + default : false + } + ], variables : [ vertex ], @@ -81,6 +88,14 @@ vec3 hemisphereImportanceSampleDggx(const vec2 u, const float a) { // pdf = D(a) return vec3(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta); } +vec3 hemisphereCosSample(float2 u) { // pdf = cosTheta / PI; + float phi = 2.0 * PI * u.x; + float cosTheta2 = 1.0 - u.y; + float cosTheta = sqrt(cosTheta2); + float sinTheta = sqrt(1.0 - cosTheta2); + return vec3(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta); +} + vec4 computeWeight(const uint index, const float roughness) { float sampleCount = materialParams.sampleCount; vec2 u = hammersley(index, sampleCount); @@ -95,27 +110,28 @@ vec4 computeWeight(const uint index, const float roughness) { return vec4(L, l); } -float lodToPerceptualRoughness(const float lod) { - // Inverse perceptualRoughness-to-LOD mapping: - // The LOD-to-perceptualRoughness mapping is a quadratic fit for - // log2(perceptualRoughness)+iblMaxMipLevel when iblMaxMipLevel is 4. - // We found empirically that this mapping works very well for a 256 cubemap with 5 levels used, - // but also scales well for other iblMaxMipLevel values. - const float a = 2.0f; - const float b = -1.0f; - return (lod != 0.0) ? saturate((sqrt(a * a + 4.0 * b * lod) - a) / (2.0 * b)) : 0.0; +vec4 computeWeightIrradiance(const uint index) { + float sampleCount = materialParams.sampleCount; + vec2 u = hammersley(index, sampleCount); + vec3 L = hemisphereCosSample(u); + float pdf = L.z / PI; + float invOmegaS = sampleCount * pdf; + float l = -log4(invOmegaS); + return vec4(L, l); } void postProcess(inout PostProcessInputs postProcess) { vec2 uv = variable_vertex.xy; // interpolated at pixel's center - float lod = floor(uv.x); + uint lod = uint(uv.x); uint index = uint(uv.y); - float perceptualRoughness = lodToPerceptualRoughness(saturate(lod * materialParams.oneOverLevelsMinusOne)); - float roughness = perceptualRoughness * perceptualRoughness; - - postProcess.weight = computeWeight(index, roughness); + if (materialConstants_irradiance) { + postProcess.weight = computeWeightIrradiance(index); + } else { + float roughness = materialParams.roughness[lod]; + postProcess.weight = computeWeight(index, roughness); + } } } diff --git a/libs/iblprefilter/src/materials/iblprefilter.mat b/libs/iblprefilter/src/materials/iblprefilter.mat index f979becd38f..d9fa379a8e0 100644 --- a/libs/iblprefilter/src/materials/iblprefilter.mat +++ b/libs/iblprefilter/src/materials/iblprefilter.mat @@ -54,6 +54,13 @@ material { type : float3 } ], + constants : [ + { + name : irradiance, + type : bool, + default : false + } + ], variables : [ vertex ], @@ -139,15 +146,30 @@ void postProcess(inout PostProcessInputs postProcess) { vec3 Lz = vec3(0); float kernelWeight = 0.0; - for (uint i = 0u ; i < materialParams.sampleCount ; i++) { - // { L, lod }, with L.z == NoL - mediump vec4 entry = texelFetch(materialParams_kernel, ivec2(materialParams.attachmentLevel, i), 0); - if (entry.z > 0.0) { - float l = entry.w + materialParams.lodOffset;// we don't need to clamp, the h/w does it for us - Lx += sampleEnvironment(materialParams_environment, Tx * entry.xyz, l) * entry.z; - Ly += sampleEnvironment(materialParams_environment, Ty * entry.xyz, l) * entry.z; - Lz += sampleEnvironment(materialParams_environment, Tz * entry.xyz, l) * entry.z; - kernelWeight += entry.z; + + if (materialConstants_irradiance) { + for (uint i = 0u; i < materialParams.sampleCount; i++) { + // { L, lod }, with L.z == NoL + mediump vec4 entry = texelFetch(materialParams_kernel, ivec2(0u, i), 0); + if (entry.z > 0.0) { + float l = entry.w + materialParams.lodOffset;// we don't need to clamp, the h/w does it for us + Lx += sampleEnvironment(materialParams_environment, Tx * entry.xyz, l); + Ly += sampleEnvironment(materialParams_environment, Ty * entry.xyz, l); + Lz += sampleEnvironment(materialParams_environment, Tz * entry.xyz, l); + } + } + kernelWeight = float(materialParams.sampleCount); + } else { + for (uint i = 0u; i < materialParams.sampleCount; i++) { + // { L, lod }, with L.z == NoL + mediump vec4 entry = texelFetch(materialParams_kernel, ivec2(materialParams.attachmentLevel, i), 0); + if (entry.z > 0.0) { + float l = entry.w + materialParams.lodOffset;// we don't need to clamp, the h/w does it for us + Lx += sampleEnvironment(materialParams_environment, Tx * entry.xyz, l) * entry.z; + Ly += sampleEnvironment(materialParams_environment, Ty * entry.xyz, l) * entry.z; + Lz += sampleEnvironment(materialParams_environment, Tz * entry.xyz, l) * entry.z; + kernelWeight += entry.z; + } } } diff --git a/libs/image/CMakeLists.txt b/libs/image/CMakeLists.txt index 2d76ca1488f..351d3954869 100644 --- a/libs/image/CMakeLists.txt +++ b/libs/image/CMakeLists.txt @@ -40,7 +40,7 @@ set_target_properties(${TARGET} PROPERTIES FOLDER Libs) if (MSVC) target_compile_options(${TARGET} PRIVATE $<$:/fp:fast>) else() - target_compile_options(${TARGET} PRIVATE $<$:-ffast-math>) + target_compile_options(${TARGET} PRIVATE $<$:-ffast-math -fno-finite-math-only>) target_compile_options(${TARGET} PRIVATE -Wno-deprecated-register) endif() @@ -55,6 +55,6 @@ install(DIRECTORY ${PUBLIC_HDR_DIR}/image DESTINATION include) # ================================================================================================== if (NOT ANDROID AND NOT WEBGL AND NOT IOS AND NOT FILAMENT_SKIP_SDL2) add_executable(test_${TARGET} tests/test_image.cpp) - target_link_libraries(test_${TARGET} PRIVATE image imageio gtest) + target_link_libraries(test_${TARGET} PRIVATE imageio gtest) set_target_properties(test_${TARGET} PROPERTIES FOLDER Tests) endif() diff --git a/libs/image/src/ImageOps.cpp b/libs/image/src/ImageOps.cpp index fb097d8c84f..f9338316a22 100644 --- a/libs/image/src/ImageOps.cpp +++ b/libs/image/src/ImageOps.cpp @@ -34,7 +34,7 @@ LinearImage horizontalStack(std::initializer_list images) { } LinearImage horizontalStack(const LinearImage* first, size_t count) { - ASSERT_PRECONDITION(count > 0, "Must supply one or more images for stacking."); + FILAMENT_CHECK_PRECONDITION(count > 0) << "Must supply one or more images for stacking."; // Compute the final size and allocate memory. uint32_t width = 0; @@ -46,12 +46,12 @@ LinearImage horizontalStack(const LinearImage* first, size_t count) { if (height == 0) { height = img.getHeight(); } else { - ASSERT_PRECONDITION(height == img.getHeight(), "Inconsistent heights."); + FILAMENT_CHECK_PRECONDITION(height == img.getHeight()) << "Inconsistent heights."; } if (nchannels == 0) { nchannels = img.getChannels(); } else { - ASSERT_PRECONDITION(nchannels == img.getChannels(), "Inconsistent channels."); + FILAMENT_CHECK_PRECONDITION(nchannels == img.getChannels()) << "Inconsistent channels."; } } LinearImage result(width, height, nchannels); @@ -79,7 +79,7 @@ LinearImage verticalStack(std::initializer_list images) { // result. This is incredibly lazy, but since we use row-major ordering, copying columns would be // really painful. LinearImage verticalStack(const LinearImage* first, size_t count) { - ASSERT_PRECONDITION(count > 0, "Must supply one or more images for stacking."); + FILAMENT_CHECK_PRECONDITION(count > 0) << "Must supply one or more images for stacking."; std::unique_ptr flipped(new LinearImage[count]); int i = 0; for (size_t c = 0; c < count; ++c) { @@ -133,16 +133,16 @@ LinearImage applyScaleOffset(const LinearImage& image, } LinearImage vectorsToColors(const LinearImage& image) { - ASSERT_PRECONDITION(image.getChannels() == 3 || image.getChannels() == 4, - "Must be a 3 or 4 channel image"); + FILAMENT_CHECK_PRECONDITION(image.getChannels() == 3 || image.getChannels() == 4) + << "Must be a 3 or 4 channel image"; return image.getChannels() == 3 ? applyScaleOffset(image, 0.5f, 0.5f) : applyScaleOffset(image, 0.5f, 0.5f); } LinearImage colorsToVectors(const LinearImage& image) { - ASSERT_PRECONDITION(image.getChannels() == 3 || image.getChannels() == 4, - "Must be a 3 or 4 channel image"); + FILAMENT_CHECK_PRECONDITION(image.getChannels() == 3 || image.getChannels() == 4) + << "Must be a 3 or 4 channel image"; return image.getChannels() == 3 ? applyScaleOffset(image, 2.0f, -1.0f) : applyScaleOffset(image, 2.0f, -1.0f); @@ -151,7 +151,7 @@ LinearImage colorsToVectors(const LinearImage& image) { LinearImage extractChannel(const LinearImage& source, uint32_t channel) { const uint32_t width = source.getWidth(), height = source.getHeight(); const uint32_t nchan = source.getChannels(); - ASSERT_PRECONDITION(channel < nchan, "Channel is out of range."); + FILAMENT_CHECK_PRECONDITION(channel < nchan) << "Channel is out of range."; LinearImage result(width, height, 1); auto src = source.getPixelRef(); auto dst = result.getPixelRef(); @@ -167,14 +167,16 @@ LinearImage combineChannels(std::initializer_list images) { } LinearImage combineChannels(LinearImage const* img, size_t count) { - ASSERT_PRECONDITION(count > 0, "Must supply one or more image planes for combining."); + FILAMENT_CHECK_PRECONDITION(count > 0) << "Must supply one or more image planes for combining."; const uint32_t width = img[0].getWidth(); const uint32_t height = img[0].getHeight(); for (size_t c = 0; c < count; ++c) { const LinearImage& plane = img[c]; - ASSERT_PRECONDITION(plane.getWidth() == width, "Planes must all have same width."); - ASSERT_PRECONDITION(plane.getHeight() == height, "Planes must all have same height."); - ASSERT_PRECONDITION(plane.getChannels() == 1, "Planes must be single channel."); + FILAMENT_CHECK_PRECONDITION(plane.getWidth() == width) + << "Planes must all have same width."; + FILAMENT_CHECK_PRECONDITION(plane.getHeight() == height) + << "Planes must all have same height."; + FILAMENT_CHECK_PRECONDITION(plane.getChannels() == 1) << "Planes must be single channel."; } LinearImage result(width, height, (uint32_t) count); float* dst = result.getPixelRef(); @@ -414,10 +416,12 @@ LinearImage voronoiFromCoordField(const LinearImage& coordField, const LinearIma } void blitImage(LinearImage& target, const LinearImage& source) { - ASSERT_PRECONDITION(source.getWidth() == target.getWidth(), "Images must have same width."); - ASSERT_PRECONDITION(source.getHeight() == target.getHeight(), "Images must have same height."); - ASSERT_PRECONDITION(source.getChannels() == target.getChannels(), - "Images must have same number of channels."); + FILAMENT_CHECK_PRECONDITION(source.getWidth() == target.getWidth()) + << "Images must have same width."; + FILAMENT_CHECK_PRECONDITION(source.getHeight() == target.getHeight()) + << "Images must have same height."; + FILAMENT_CHECK_PRECONDITION(source.getChannels() == target.getChannels()) + << "Images must have same number of channels."; memcpy(target.getPixelRef(), source.getPixelRef(), sizeof(float) * source.getWidth() * source.getHeight() * source.getChannels()); } diff --git a/libs/image/src/ImageSampler.cpp b/libs/image/src/ImageSampler.cpp index 157f1586753..20c9a006d3f 100644 --- a/libs/image/src/ImageSampler.cpp +++ b/libs/image/src/ImageSampler.cpp @@ -217,8 +217,8 @@ void normalizeImpl(LinearImage& image) { } void normalize(LinearImage& image) { - ASSERT_PRECONDITION(image.getChannels() == 3 || image.getChannels() == 4, - "Must be a 3 or 4 channel image"); + FILAMENT_CHECK_PRECONDITION(image.getChannels() == 3 || image.getChannels() == 4) + << "Must be a 3 or 4 channel image"; if (image.getChannels() == 3) { normalizeImpl< filament::math::float3>(image); } else { @@ -288,11 +288,10 @@ SingleSample::~SingleSample() { LinearImage resampleImage(const LinearImage& source, uint32_t width, uint32_t height, const ImageSampler& sampler) { - ASSERT_PRECONDITION( - sampler.east.mode == Boundary::EXCLUDE && - sampler.north.mode == Boundary::EXCLUDE && - sampler.west.mode == Boundary::EXCLUDE && - sampler.south.mode == Boundary::EXCLUDE, "Not yet implemented."); + FILAMENT_CHECK_PRECONDITION(sampler.east.mode == Boundary::EXCLUDE && + sampler.north.mode == Boundary::EXCLUDE && sampler.west.mode == Boundary::EXCLUDE && + sampler.south.mode == Boundary::EXCLUDE) + << "Not yet implemented."; const auto hfilter = sampler.horizontalFilter; const auto vfilter = sampler.verticalFilter; const float radius = sampler.filterRadiusMultiplier; diff --git a/libs/image/src/Ktx1Bundle.cpp b/libs/image/src/Ktx1Bundle.cpp index ab7f01ca5b5..f3b9931095a 100644 --- a/libs/image/src/Ktx1Bundle.cpp +++ b/libs/image/src/Ktx1Bundle.cpp @@ -109,11 +109,12 @@ Ktx1Bundle::Ktx1Bundle(uint32_t numMipLevels, uint32_t arrayLength, bool isCubem Ktx1Bundle::Ktx1Bundle(uint8_t const* bytes, uint32_t nbytes) : mBlobs(new KtxBlobList), mMetadata(new KtxMetadata) { - ASSERT_PRECONDITION(sizeof(SerializationHeader) <= nbytes, "KTX buffer is too small"); + FILAMENT_CHECK_PRECONDITION(sizeof(SerializationHeader) <= nbytes) << "KTX buffer is too small"; // First, "parse" the header by casting it to a struct. SerializationHeader const* header = (SerializationHeader const*) bytes; - ASSERT_PRECONDITION(memcmp(header->magic, MAGIC, 12) == 0, "KTX has unexpected identifier"); + FILAMENT_CHECK_PRECONDITION(memcmp(header->magic, MAGIC, 12) == 0) + << "KTX has unexpected identifier"; mInfo = header->info; // The spec allows 0 or 1 for the number of array layers and mipmap levels, but we replace 0 @@ -263,7 +264,8 @@ uint32_t Ktx1Bundle::getSerializedLength() const { if (blobSize == 0) { blobSize = thisBlobSize; } - ASSERT_PRECONDITION(blobSize == thisBlobSize, "Inconsistent blob sizes within LOD"); + FILAMENT_CHECK_PRECONDITION(blobSize == thisBlobSize) + << "Inconsistent blob sizes within LOD"; total += thisBlobSize; } } diff --git a/libs/image/tests/test_image.cpp b/libs/image/tests/test_image.cpp index a0594a17e71..ef92bee017e 100644 --- a/libs/image/tests/test_image.cpp +++ b/libs/image/tests/test_image.cpp @@ -671,8 +671,9 @@ static bool intersect(Ray ray, Sphere sphere, float* t) { static LinearImage diffImages(const LinearImage& a, const LinearImage& b) { const uint32_t width = a.getWidth(), height = a.getHeight(), nchan = a.getChannels(); - ASSERT_PRECONDITION(width == b.getWidth() && height == b.getHeight() && - nchan == b.getChannels(), "Images must have same shape."); + FILAMENT_CHECK_PRECONDITION( + width == b.getWidth() && height == b.getHeight() && nchan == b.getChannels()) + << "Images must have same shape."; LinearImage result(width, height, nchan); float* dst = result.getPixelRef(); float const* srca = a.getPixelRef(); diff --git a/libs/imageio/CMakeLists.txt b/libs/imageio/CMakeLists.txt index 1971e7ffb3a..47544655b1e 100644 --- a/libs/imageio/CMakeLists.txt +++ b/libs/imageio/CMakeLists.txt @@ -44,9 +44,3 @@ endif() if (NOT MSVC) target_compile_options(${TARGET} PRIVATE -Wno-deprecated-register) endif() - -if (MSVC) - target_compile_options(${TARGET} PRIVATE $<$:/fp:fast>) -else() - target_compile_options(${TARGET} PRIVATE $<$:-ffast-math>) -endif() diff --git a/libs/imageio/src/ImageDiffer.cpp b/libs/imageio/src/ImageDiffer.cpp index cef04d626c7..c0792387bfe 100644 --- a/libs/imageio/src/ImageDiffer.cpp +++ b/libs/imageio/src/ImageDiffer.cpp @@ -51,7 +51,7 @@ void updateOrCompare(LinearImage limgResult, const utils::Path& fnameGolden, // Load the PNG file at the given path. std::ifstream in(fnameGolden, std::ios::binary); - ASSERT_PRECONDITION(in, "Unable to open: %s", fnameGolden.c_str()); + FILAMENT_CHECK_PRECONDITION(in) << "Unable to open: " << fnameGolden.c_str(); LinearImage limgGolden = ImageDecoder::decode(in, fnameGolden); // Convert 4-channel RGBM into proper RGB. @@ -67,7 +67,7 @@ void updateOrCompare(LinearImage limgResult, const utils::Path& fnameGolden, } // Perform a simple comparison of the two images. - ASSERT_PRECONDITION(compare(limgResult, limgGolden, epsilon) == 0, "Image mismatch."); + FILAMENT_CHECK_PRECONDITION(compare(limgResult, limgGolden, epsilon) == 0) << "Image mismatch."; } } diff --git a/libs/ktxreader/CMakeLists.txt b/libs/ktxreader/CMakeLists.txt index d5da5332a71..a9d5714e07c 100644 --- a/libs/ktxreader/CMakeLists.txt +++ b/libs/ktxreader/CMakeLists.txt @@ -33,9 +33,7 @@ set_target_properties(${TARGET} PROPERTIES FOLDER Libs) # Compiler flags # ================================================================================================== if (MSVC) - target_compile_options(${TARGET} PRIVATE $<$:/fp:fast>) else() - target_compile_options(${TARGET} PRIVATE $<$:-ffast-math>) target_compile_options(${TARGET} PRIVATE -Wno-deprecated-register) endif() diff --git a/libs/ktxreader/include/ktxreader/Ktx2Reader.h b/libs/ktxreader/include/ktxreader/Ktx2Reader.h index 91c5a537215..0994a5e2fbb 100644 --- a/libs/ktxreader/include/ktxreader/Ktx2Reader.h +++ b/libs/ktxreader/include/ktxreader/Ktx2Reader.h @@ -142,7 +142,7 @@ class Ktx2Reader { protected: Async() noexcept = default; - ~Async() = default; + virtual ~Async(); public: Async(Async const&) = delete; diff --git a/libs/ktxreader/src/Ktx2Reader.cpp b/libs/ktxreader/src/Ktx2Reader.cpp index b04f23f226b..5d53861464a 100644 --- a/libs/ktxreader/src/Ktx2Reader.cpp +++ b/libs/ktxreader/src/Ktx2Reader.cpp @@ -172,6 +172,9 @@ class FAsync : public Async { Result doTranscoding(); void uploadImages(); +protected: + ~FAsync(); + private: using TranscoderResult = std::atomic; @@ -260,6 +263,15 @@ Texture* Ktx2Reader::load(const void* data, size_t size, TransferFunction transf return texture; } +FAsync::~FAsync() { + for (TranscoderResult& level : mTranscoderResults) { + Texture::PixelBufferDescriptor* pbd = level.load(); + if (pbd) { + delete pbd; + } + } +} + Result FAsync::doTranscoding() { ktx2_transcoder_state basisThreadState; basisThreadState.clear(); @@ -412,6 +424,8 @@ Texture* Ktx2Reader::createTexture(ktx2_transcoder* transcoder, const void* data return texture; } +Async::~Async() = default; + Texture* Async::getTexture() const noexcept { return static_cast(this)->getTexture(); } diff --git a/libs/matdbg/CMakeLists.txt b/libs/matdbg/CMakeLists.txt index 071c5e9dac5..566aec3fd31 100644 --- a/libs/matdbg/CMakeLists.txt +++ b/libs/matdbg/CMakeLists.txt @@ -22,6 +22,8 @@ set(PUBLIC_HDRS ) set(SRCS + src/ApiHandler.cpp + src/ApiHandler.h src/CommonWriter.h src/CommonWriter.cpp src/DebugServer.cpp @@ -29,6 +31,8 @@ set(SRCS src/ShaderReplacer.cpp src/ShaderExtractor.cpp src/ShaderInfo.cpp + src/SourceFormatter.cpp + src/SourceFormatter.h src/TextWriter.cpp ) @@ -39,8 +43,8 @@ set(SRCS set(RESOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}) set(RESOURCE_BINS - ${CMAKE_CURRENT_SOURCE_DIR}/web/style.css - ${CMAKE_CURRENT_SOURCE_DIR}/web/script.js + ${CMAKE_CURRENT_SOURCE_DIR}/web/api.js + ${CMAKE_CURRENT_SOURCE_DIR}/web/app.js ${CMAKE_CURRENT_SOURCE_DIR}/web/index.html ) @@ -82,7 +86,6 @@ target_link_libraries(${TARGET} PUBLIC spirv-cross-glsl SPIRV-Tools utils - utils ) target_include_directories(${TARGET} PRIVATE ${filamat_SOURCE_DIR}/src) @@ -95,9 +98,7 @@ set_target_properties(${TARGET} PROPERTIES FOLDER Libs) # ================================================================================================== if (MSVC) - target_compile_options(${TARGET} PRIVATE $<$:/fp:fast>) else() - target_compile_options(${TARGET} PRIVATE $<$:-ffast-math>) target_compile_options(${TARGET} PRIVATE -Wno-deprecated-register) endif() diff --git a/libs/matdbg/include/matdbg/DebugServer.h b/libs/matdbg/include/matdbg/DebugServer.h index fa1ef0fc9b4..4340001d661 100644 --- a/libs/matdbg/include/matdbg/DebugServer.h +++ b/libs/matdbg/include/matdbg/DebugServer.h @@ -24,23 +24,34 @@ #include #include +#include class CivetServer; -namespace filament { -namespace matdbg { +namespace filament::matdbg { using MaterialKey = uint32_t; +struct MaterialRecord { + void* userdata; + const uint8_t* package; + size_t packageSize; + utils::CString name; + MaterialKey key; + VariantList activeVariants; +}; + /** * Server-side material debugger. * - * This class manages an HTTP server and a WebSockets server that listen on a secondary thread. It - * receives material packages from the Filament C++ engine or from a standalone tool such as - * matinfo. + * This class manages an HTTP server. It receives material packages from the Filament C++ engine or + * from a standalone tool such as matinfo. */ class DebugServer { public: + static std::string_view const kSuccessHeader; + static std::string_view const kErrorHeader; + DebugServer(backend::Backend backend, int port); ~DebugServer(); @@ -74,16 +85,7 @@ class DebugServer { bool isReady() const { return mServer; } private: - struct MaterialRecord { - void* userdata; - const uint8_t* package; - size_t packageSize; - utils::CString name; - MaterialKey key; - VariantList activeVariants; - }; - - const MaterialRecord* getRecord(const MaterialKey& key) const; + MaterialRecord const* getRecord(const MaterialKey& key) const; void updateActiveVariants(); @@ -97,7 +99,10 @@ class DebugServer { const backend::Backend mBackend; CivetServer* mServer; + tsl::robin_map mMaterialRecords; + mutable utils::Mutex mMaterialRecordsMutex; + utils::CString mHtml; utils::CString mJavascript; utils::CString mCss; @@ -109,15 +114,12 @@ class DebugServer { QueryCallback mQueryCallback = nullptr; class FileRequestHandler* mFileHandler = nullptr; - class RestRequestHandler* mRestHandler = nullptr; - class WebSocketHandler* mWebSocketHandler = nullptr; + class ApiHandler* mApiHandler = nullptr; friend class FileRequestHandler; - friend class RestRequestHandler; - friend class WebSocketHandler; + friend class ApiHandler; }; -} // namespace matdbg -} // namespace filament +} // namespace filament::matdbg #endif // MATDBG_DEBUGSERVER_H diff --git a/libs/matdbg/include/matdbg/ShaderExtractor.h b/libs/matdbg/include/matdbg/ShaderExtractor.h index 76503c42d23..3669b50bf4d 100644 --- a/libs/matdbg/include/matdbg/ShaderExtractor.h +++ b/libs/matdbg/include/matdbg/ShaderExtractor.h @@ -31,13 +31,14 @@ namespace matdbg { // in a manner similar to ShaderReplacer. class ShaderExtractor { public: - ShaderExtractor(backend::Backend backend, const void* data, size_t size); + ShaderExtractor(backend::ShaderLanguage target, const void* data, size_t size); bool parse() noexcept; bool getShader(backend::ShaderModel shaderModel, Variant variant, backend::ShaderStage stage, filaflat::ShaderContent& shader) noexcept; bool getDictionary(filaflat::BlobDictionary& dictionary) noexcept; - static utils::CString spirvToGLSL(const uint32_t* data, size_t wordCount); + static utils::CString spirvToGLSL(backend::ShaderModel shaderModel, const uint32_t* data, + size_t wordCount); static utils::CString spirvToText(const uint32_t* data, size_t wordCount); private: diff --git a/libs/matdbg/include/matdbg/ShaderInfo.h b/libs/matdbg/include/matdbg/ShaderInfo.h index fc571c734ab..89d5a8377a4 100644 --- a/libs/matdbg/include/matdbg/ShaderInfo.h +++ b/libs/matdbg/include/matdbg/ShaderInfo.h @@ -35,9 +35,7 @@ struct ShaderInfo { }; size_t getShaderCount(const filaflat::ChunkContainer& container, filamat::ChunkType type); -bool getMetalShaderInfo(const filaflat::ChunkContainer& container, ShaderInfo* info); -bool getGlShaderInfo(const filaflat::ChunkContainer& container, ShaderInfo* info); -bool getVkShaderInfo(const filaflat::ChunkContainer& container, ShaderInfo* info); +bool getShaderInfo(const filaflat::ChunkContainer& container, ShaderInfo* info, filamat::ChunkType chunkType); } // namespace matdbg } // namespace filament diff --git a/libs/matdbg/src/ApiHandler.cpp b/libs/matdbg/src/ApiHandler.cpp new file mode 100644 index 00000000000..c9ef42c0ee0 --- /dev/null +++ b/libs/matdbg/src/ApiHandler.cpp @@ -0,0 +1,397 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "ApiHandler.h" + +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include +#include + +namespace filament::matdbg { + +using namespace filament::backend; +using namespace std::chrono_literals; + +namespace { + +auto const& kSuccessHeader = DebugServer::kSuccessHeader; +auto const& kErrorHeader = DebugServer::kErrorHeader; + +} // anonymous + +using filaflat::ChunkContainer; +using filamat::ChunkType; +using utils::FixedCapacityVector; + +static auto const error = [](int line, std::string const& uri) { + utils::slog.e << "[matdbg] DebugServer: 404 at line " << line << ": " << uri << utils::io::endl; + return false; +}; + +MaterialRecord const* ApiHandler::getMaterialRecord(struct mg_request_info const* request) { + size_t const qlength = strlen(request->query_string); + char matid[9] = {}; + if (mg_get_var(request->query_string, qlength, "matid", matid, sizeof(matid)) < 0) { + return nullptr; + } + uint32_t const id = strtoul(matid, nullptr, 16); + return mServer->getRecord(id); +} + +bool ApiHandler::handleGetApiShader(struct mg_connection* conn, + struct mg_request_info const* request) { + auto const softError = [conn, request](char const* msg) { + utils::slog.e << "[matdbg] DebugServer: " << msg << ": " << request->query_string << utils::io::endl; + mg_printf(conn, kErrorHeader.data(), "application/txt"); + mg_write(conn, msg, strlen(msg)); + return true; + }; + + MaterialRecord const* result = getMaterialRecord(request); + std::string const& uri = request->local_uri; + + if (!result) { + return error(__LINE__, uri); + } + + ChunkContainer package(result->package, result->packageSize); + if (!package.parse()) { + return error(__LINE__, uri); + } + + std::string_view const glsl("glsl"); + std::string_view const msl("msl"); + std::string_view const spirv("spirv"); + size_t const qlength = strlen(request->query_string); + + char type[6] = {}; + if (mg_get_var(request->query_string, qlength, "type", type, sizeof(type)) < 0) { + return error(__LINE__, uri); + } + + std::string_view const language(type, strlen(type)); + + char glindex[4] = {}; + char vkindex[4] = {}; + char metalindex[4] = {}; + mg_get_var(request->query_string, qlength, "glindex", glindex, sizeof(glindex)); + mg_get_var(request->query_string, qlength, "vkindex", vkindex, sizeof(vkindex)); + mg_get_var(request->query_string, qlength, "metalindex", metalindex, sizeof(metalindex)); + + if (!glindex[0] && !vkindex[0] && !metalindex[0]) { + return error(__LINE__, uri); + } + + if (glindex[0]) { + if (language != glsl) { + return softError("Only GLSL is supported."); + } + + FixedCapacityVector info(getShaderCount(package, ChunkType::MaterialGlsl)); + if (!getShaderInfo(package, info.data(), ChunkType::MaterialGlsl)) { + return error(__LINE__, uri); + } + + int const shaderIndex = std::stoi(glindex); + if (shaderIndex >= info.size()) { + return error(__LINE__, uri); + } + + ShaderExtractor extractor(ShaderLanguage::ESSL3, result->package, result->packageSize); + if (!extractor.parse()) { + return error(__LINE__, uri); + } + + auto const& item = info[shaderIndex]; + filaflat::ShaderContent content; + extractor.getShader(item.shaderModel, item.variant, item.pipelineStage, content); + + std::string const shader = mFormatter.format((char const*) content.data()); + mg_printf(conn, kSuccessHeader.data(), "application/txt"); + mg_write(conn, shader.c_str(), shader.size()); + + return true; + } + + if (vkindex[0]) { + ShaderExtractor extractor(ShaderLanguage::SPIRV, result->package, result->packageSize); + if (!extractor.parse()) { + return error(__LINE__, uri); + } + + FixedCapacityVector info(getShaderCount(package, ChunkType::MaterialSpirv)); + if (!getShaderInfo(package, info.data(), ChunkType::MaterialSpirv)) { + return error(__LINE__, uri); + } + + int const shaderIndex = std::stoi(vkindex); + if (shaderIndex >= info.size()) { + return error(__LINE__, uri); + } + + auto const& item = info[shaderIndex]; + filaflat::ShaderContent content; + extractor.getShader(item.shaderModel, item.variant, item.pipelineStage, content); + + if (language == spirv) { + auto spirvDisassembly = ShaderExtractor::spirvToText((uint32_t const*) content.data(), + content.size() / 4); + mg_printf(conn, kSuccessHeader.data(), "application/txt"); + mg_write(conn, spirvDisassembly.c_str(), spirvDisassembly.size()); + return true; + } + + if (language == glsl) { + auto glsl = ShaderExtractor::spirvToGLSL(item.shaderModel, + (uint32_t const*) content.data(), content.size() / 4); + std::string const shader = mFormatter.format((char const*) glsl.c_str()); + mg_printf(conn, kSuccessHeader.data(), "application/txt"); + mg_printf(conn, shader.c_str(), shader.size()); + return true; + } + + return softError("Only SPIRV is supported."); + } + + if (metalindex[0]) { + ShaderExtractor extractor(ShaderLanguage::MSL, result->package, result->packageSize); + if (!extractor.parse()) { + return error(__LINE__, uri); + } + + FixedCapacityVector info(getShaderCount(package, ChunkType::MaterialMetal)); + if (!getShaderInfo(package, info.data(), ChunkType::MaterialMetal)) { + return error(__LINE__, uri); + } + + int const shaderIndex = std::stoi(metalindex); + if (shaderIndex >= info.size()) { + return error(__LINE__, uri); + } + + auto const& item = info[shaderIndex]; + filaflat::ShaderContent content; + extractor.getShader(item.shaderModel, item.variant, item.pipelineStage, content); + + if (language == msl) { + std::string const shader = mFormatter.format((char const*) content.data()); + mg_printf(conn, kSuccessHeader.data(), "application/txt"); + mg_write(conn, shader.c_str(), shader.size()); + return true; + } + + return softError("Only MSL is supported."); + } + return error(__LINE__, uri); +} + +void ApiHandler::addMaterial(MaterialRecord const* material) { + std::unique_lock const lock(mStatusMutex); + snprintf(statusMaterialId, sizeof(statusMaterialId), "%8.8x", material->key); + mStatusCondition.notify_all(); +} + +bool ApiHandler::handleGetStatus(struct mg_connection* conn, + struct mg_request_info const* request) { + char const* qstr = request->query_string; + if (qstr && strcmp(qstr, "firstTime") == 0) { + mg_printf(conn, kSuccessHeader.data(), "application/txt"); + mg_write(conn, "0", 1); + return true; + } + + std::unique_lock lock(mStatusMutex); + uint64_t const currentStatusCount = mCurrentStatus; + if (mStatusCondition.wait_for(lock, 10s, + [this, currentStatusCount] { return currentStatusCount < mCurrentStatus; })) { + mg_printf(conn, kSuccessHeader.data(), "application/txt"); + mg_write(conn, statusMaterialId, 8); + } else { + mg_printf(conn, kSuccessHeader.data(), "application/txt"); + // Use '1' to indicate a no-op. This ensures that we don't block forever if the client is + // gone. + mg_write(conn, "1", 1); + } + return true; +} + +bool ApiHandler::handlePost(CivetServer* server, struct mg_connection* conn) { + struct mg_request_info const* request = mg_get_request_info(conn); + std::string const& uri = request->local_uri; + + // For now we simply use istringstream for parsing, so command arguments are delimited + // with space characters. + // + // The "shader index" is a zero-based index into the list of variants using the order that + // they appear in the package, where each API (GL / VK / Metal) has its own list. + // + // POST body format: + // [material id] [api index] [shader index] [shader source....] + if (uri == "/api/edit") { + struct mg_request_info const* req_info = mg_get_request_info(conn); + size_t const msgLen = req_info->content_length; + + char buf[1024]; + size_t readLen = 0; + std::stringstream sstream; + while (readLen < msgLen) { + int const res = mg_read(conn, buf, sizeof(buf)); + if (res < 0) { + utils::slog.e << "[matdbg] civet error parsing /api/edit body: " << res << utils::io::endl; + break; + } + if (res == 0) { + break; + } + readLen += res; + sstream.write(buf, res); + } + uint32_t matid; + int api; + int shaderIndex; + sstream >> std::hex >> matid >> std::dec >> api >> shaderIndex; + std::string const shader = sstream.str().substr(sstream.tellg()); + + mServer->handleEditCommand(matid, backend::Backend(api), shaderIndex, shader.c_str(), + shader.size()); + + mg_printf(conn, "HTTP/1.1 200 OK\r\nConnection: close"); + return true; + } + return error(__LINE__, uri); +} + +bool ApiHandler::handleGet(CivetServer* server, struct mg_connection* conn) { + struct mg_request_info const* request = mg_get_request_info(conn); + std::string const& uri = request->local_uri; + + if (uri == "/api/active") { + mServer->updateActiveVariants(); + + // Careful not to lock the above line. + std::unique_lock const lock(mServer->mMaterialRecordsMutex); + mg_printf(conn, kSuccessHeader.data(), "application/json"); + mg_printf(conn, "{"); + + // If the backend has not been resolved to Vulkan, Metal, etc., then return an empty + // list. This can occur if the server is matinfo rather than an actual Filament session. + if (mServer->mBackend == backend::Backend::DEFAULT) { + mg_printf(conn, "}"); + return true; + } + + int index = 0; + for (auto const& pair: mServer->mMaterialRecords) { + auto const& record = pair.second; + ChunkContainer package(record.package, record.packageSize); + if (!package.parse()) { + return error(__LINE__, uri); + } + JsonWriter writer; + if (!writer.writeActiveInfo(package, mServer->mBackend, record.activeVariants)) { + return error(__LINE__, uri); + } + bool const last = (++index) == mServer->mMaterialRecords.size(); + mg_printf(conn, "\"%8.8x\": %s %s", pair.first, writer.getJsonString(), + last ? "" : ","); + } + mg_printf(conn, "}"); + return true; + } + + if (uri == "/api/matids") { + std::unique_lock const lock(mServer->mMaterialRecordsMutex); + mg_printf(conn, kSuccessHeader.data(), "application/json"); + mg_printf(conn, "["); + int index = 0; + for (auto const& record: mServer->mMaterialRecords) { + bool const last = (++index) == mServer->mMaterialRecords.size(); + mg_printf(conn, "\"%8.8x\" %s", record.first, last ? "" : ","); + } + mg_printf(conn, "]"); + return true; + } + + if (uri == "/api/materials") { + std::unique_lock const lock(mServer->mMaterialRecordsMutex); + mg_printf(conn, kSuccessHeader.data(), "application/json"); + mg_printf(conn, "["); + int index = 0; + for (auto const& record: mServer->mMaterialRecords) { + bool const last = (++index) == mServer->mMaterialRecords.size(); + + ChunkContainer package(record.second.package, record.second.packageSize); + if (!package.parse()) { + return error(__LINE__, uri); + } + + JsonWriter writer; + if (!writer.writeMaterialInfo(package)) { + return error(__LINE__, uri); + } + + mg_printf(conn, "{ \"matid\": \"%8.8x\", %s } %s", record.first, writer.getJsonString(), + last ? "" : ","); + } + mg_printf(conn, "]"); + return true; + } + + if (uri == "/api/material") { + MaterialRecord const* result = getMaterialRecord(request); + if (!result) { + return error(__LINE__, uri); + } + + ChunkContainer package(result->package, result->packageSize); + if (!package.parse()) { + return error(__LINE__, uri); + } + + JsonWriter writer; + if (!writer.writeMaterialInfo(package)) { + return error(__LINE__, uri); + } + mg_printf(conn, kSuccessHeader.data(), "application/json"); + mg_printf(conn, "{ %s }", writer.getJsonString()); + return true; + } + + if (uri == "/api/shader") { + return handleGetApiShader(conn, request); + } + + if (uri.find("/api/status") == 0) { + return handleGetStatus(conn, request); + } + + return error(__LINE__, uri); +} + +} // filament::matdbg diff --git a/libs/matdbg/src/ApiHandler.h b/libs/matdbg/src/ApiHandler.h new file mode 100644 index 00000000000..353326a7dc7 --- /dev/null +++ b/libs/matdbg/src/ApiHandler.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MATDBG_APIHANDLER_H +#define MATDBG_APIHANDLER_H + +#include "SourceFormatter.h" + +#include +#include +#include + +#include + +namespace filament::matdbg { + +class DebugServer; +struct MaterialRecord; + +// Handles the following REST requests, where {id} is an 8-digit hex string. +// +// GET /api/matids +// GET /api/materials +// GET /api/material?matid={id} +// GET /api/shader?matid={id}&type=[glsl|spirv]&[glindex|vkindex|metalindex]={index} +// GET /api/active +// GET /api/status +// POST /api/edit +// +class ApiHandler : public CivetHandler { +public: + explicit ApiHandler(DebugServer* server) + : mServer(server) {} + ~ApiHandler() = default; + + bool handleGet(CivetServer* server, struct mg_connection* conn); + bool handlePost(CivetServer* server, struct mg_connection* conn); + void addMaterial(MaterialRecord const* material); + +private: + bool handleGetApiShader(struct mg_connection* conn, struct mg_request_info const* request); + bool handleGetStatus(struct mg_connection* conn, struct mg_request_info const* request); + MaterialRecord const* getMaterialRecord(struct mg_request_info const* request); + + DebugServer* mServer; + + std::mutex mStatusMutex; + std::condition_variable mStatusCondition; + char statusMaterialId[9] = {}; + + // This variable is to implement a *hanging* effect for /api/status. The call to /api/status + // will always block until statusMaterialId is updated again. The client is expected to keep + // calling /api/status (a constant "pull" to simulate a push). + std::atomic mCurrentStatus = 0; + + SourceFormatter mFormatter; +}; + +} // filament::matdbg + +#endif // MATDBG_APIHANDLER_H diff --git a/libs/matdbg/src/CommonWriter.cpp b/libs/matdbg/src/CommonWriter.cpp index efaa86a050f..862229f406c 100644 --- a/libs/matdbg/src/CommonWriter.cpp +++ b/libs/matdbg/src/CommonWriter.cpp @@ -46,8 +46,13 @@ std::string formatVariantString(Variant variant, MaterialDomain domain) noexcept if (variant.key & Variant::SRE) variantString += "SRE|"; if (variant.key & Variant::SKN) variantString += "SKN|"; if (variant.key & Variant::DEP) variantString += "DEP|"; - if (variant.key & Variant::FOG) variantString += "FOG|"; + if (variant.key & Variant::DEP) { + if (variant.key & Variant::PCK) variantString += "PCK|"; + } else { + if (variant.key & Variant::FOG) variantString += "FOG|"; + } if (variant.key & Variant::VSM) variantString += "VSM|"; + if (variant.key & Variant::STE) variantString += "STE|"; variantString = variantString.substr(0, variantString.length() - 1); } diff --git a/libs/matdbg/src/CommonWriter.h b/libs/matdbg/src/CommonWriter.h index a7113197087..9e49df9a862 100644 --- a/libs/matdbg/src/CommonWriter.h +++ b/libs/matdbg/src/CommonWriter.h @@ -65,6 +65,7 @@ const char* toString(BlendingMode blendingMode) noexcept { case BlendingMode::FADE: return "fade"; case BlendingMode::MULTIPLY: return "multiply"; case BlendingMode::SCREEN: return "screen"; + case BlendingMode::CUSTOM: return "custom"; } return "--"; } @@ -236,6 +237,16 @@ const char* toString(backend::SamplerFormat format) noexcept { return "--"; } +inline +const char* toString(backend::ConstantType type) noexcept { + switch (type) { + case backend::ConstantType::FLOAT: return "float"; + case backend::ConstantType::INT: return "int"; + case backend::ConstantType::BOOL: return "bool"; + } + return "--"; +} + // Returns a human-readable variant description. // For example: DYN|DIR std::string formatVariantString(Variant variant, MaterialDomain domain) noexcept; diff --git a/libs/matdbg/src/DebugServer.cpp b/libs/matdbg/src/DebugServer.cpp index 368b3a862ea..e8efb0b2274 100644 --- a/libs/matdbg/src/DebugServer.cpp +++ b/libs/matdbg/src/DebugServer.cpp @@ -16,6 +16,8 @@ #include +#include "ApiHandler.h" + #include #include @@ -48,12 +50,30 @@ using utils::FixedCapacityVector; // serves files directly from the source code tree. #define SERVE_FROM_SOURCE_TREE 0 -#if !SERVE_FROM_SOURCE_TREE +#if SERVE_FROM_SOURCE_TREE + +namespace { +std::string const BASE_URL = "libs/matdbg/web"; +} // anonymous + +#else + #include "matdbg_resources.h" -#endif +#include + +namespace { + +struct Asset { + std::string_view mime; + std::string_view data; +}; +std::unordered_map ASSET_MAP; + +} // anonymous + +#endif // SERVE_FROM_SOURCE_TREE -namespace filament { -namespace matdbg { +namespace filament::matdbg { using namespace utils; using namespace filament::backend; @@ -61,439 +81,62 @@ using namespace filament::backend; using filaflat::ChunkContainer; using filamat::ChunkType; -static const std::string_view kSuccessHeader = +std::string_view const DebugServer::kSuccessHeader = "HTTP/1.1 200 OK\r\nContent-Type: %s\r\n" "Connection: close\r\n\r\n"; -static const std::string_view kErrorHeader = +std::string_view const DebugServer::kErrorHeader = "HTTP/1.1 404 Not Found\r\nContent-Type: %s\r\n" "Connection: close\r\n\r\n"; -static void spirvToAsm(struct mg_connection *conn, const uint32_t* spirv, size_t size) { - auto context = spvContextCreate(SPV_ENV_UNIVERSAL_1_0); - spv_text text = nullptr; - const uint32_t options = SPV_BINARY_TO_TEXT_OPTION_INDENT | - SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES; - spvBinaryToText(context, spirv, size / 4, options, &text, nullptr); - - mg_printf(conn, kSuccessHeader.data(), "application/txt"); - mg_write(conn, text->str, text->length); - spvTextDestroy(text); - spvContextDestroy(context); -} - -static void spirvToGlsl(struct mg_connection *conn, const uint32_t* spirv, size_t size) { - auto glsl = ShaderExtractor::spirvToGLSL(spirv, size / 4); - mg_printf(conn, kSuccessHeader.data(), "application/txt"); - mg_printf(conn, glsl.c_str(), glsl.size()); -} - class FileRequestHandler : public CivetHandler { public: FileRequestHandler(DebugServer* server) : mServer(server) {} bool handleGet(CivetServer *server, struct mg_connection *conn) { - const struct mg_request_info* request = mg_get_request_info(conn); + auto const& kSuccessHeader = DebugServer::kSuccessHeader; + struct mg_request_info const* request = mg_get_request_info(conn); std::string uri(request->request_uri); - if (uri == "/" || uri == "/index.html") { - #if SERVE_FROM_SOURCE_TREE - mg_send_file(conn, "libs/matdbg/web/index.html"); - #else - mg_printf(conn, kSuccessHeader.data(), "text/html"); - mg_write(conn, mServer->mHtml.c_str(), mServer->mHtml.size()); - #endif - return true; - } - if (uri == "/style.css") { - #if SERVE_FROM_SOURCE_TREE - mg_send_file(conn, "libs/matdbg/web/style.css"); - #else - mg_printf(conn, kSuccessHeader.data(), "text/css"); - mg_write(conn, mServer->mCss.c_str(), mServer->mCss.size()); - #endif - return true; - } - if (uri == "/script.js") { - #if SERVE_FROM_SOURCE_TREE - mg_send_file(conn, "libs/matdbg/web/script.js"); - #else - mg_printf(conn, kSuccessHeader.data(), "text/javascript"); - mg_write(conn, mServer->mJavascript.c_str(), mServer->mJavascript.size()); - #endif - return true; - } - slog.e << "DebugServer: bad request at line " << __LINE__ << ": " << uri << io::endl; - return false; - } -private: - DebugServer* mServer; -}; - -// Handles the following REST requests, where {id} is an 8-digit hex string. -// -// GET /api/matids -// GET /api/materials -// GET /api/material?matid={id} -// GET /api/shader?matid={id}&type=[glsl|spirv]&[glindex|vkindex|metalindex]={index} -// GET /api/active -// -class RestRequestHandler : public CivetHandler { -public: - RestRequestHandler(DebugServer* server) : mServer(server) {} - - bool handleGet(CivetServer *server, struct mg_connection *conn) { - const struct mg_request_info* request = mg_get_request_info(conn); - std::string uri(request->local_uri); - - const auto error = [request](int line) { - slog.e << "DebugServer: 404 at line " << line << ": " << request->local_uri - << io::endl; - return false; - }; - - const auto softError = [request, conn](const char* msg) { - slog.e << "DebugServer: " << msg << ": " << request->query_string << io::endl; - mg_printf(conn, kErrorHeader.data(), "application/txt"); - mg_write(conn, msg, strlen(msg)); - return true; - }; - - if (uri == "/api/active") { - mServer->updateActiveVariants(); - mg_printf(conn, kSuccessHeader.data(), "application/json"); - mg_printf(conn, "{"); - - // If the backend has not been resolved to Vulkan, Metal, etc., then return an empty - // list. This can occur if the server is matinfo rather than an actual Filament session. - if (mServer->mBackend == backend::Backend::DEFAULT) { - mg_printf(conn, "}"); - return true; - } - - int index = 0; - for (const auto& pair : mServer->mMaterialRecords) { - const auto& record = pair.second; - ChunkContainer package(record.package, record.packageSize); - if (!package.parse()) { - return error(__LINE__); - } - JsonWriter writer; - if (!writer.writeActiveInfo(package, mServer->mBackend, record.activeVariants)) { - return error(__LINE__); - } - const bool last = (++index) == mServer->mMaterialRecords.size(); - mg_printf(conn, "\"%8.8x\": %s %s", pair.first, writer.getJsonString(), - last ? "" : ","); - } - mg_printf(conn, "}"); - return true; - } - - if (uri == "/api/matids") { - mg_printf(conn, kSuccessHeader.data(), "application/json"); - mg_printf(conn, "["); - int index = 0; - for (const auto& record : mServer->mMaterialRecords) { - const bool last = (++index) == mServer->mMaterialRecords.size(); - mg_printf(conn, "\"%8.8x\" %s", record.first, last ? "" : ","); - } - mg_printf(conn, "]"); - return true; + if (uri == "/") { + uri = "/index.html"; } - if (uri == "/api/materials") { - mg_printf(conn, kSuccessHeader.data(), "application/json"); - mg_printf(conn, "["); - int index = 0; - for (const auto& record : mServer->mMaterialRecords) { - const bool last = (++index) == mServer->mMaterialRecords.size(); - - ChunkContainer package(record.second.package, record.second.packageSize); - if (!package.parse()) { - return error(__LINE__); - } - - JsonWriter writer; - if (!writer.writeMaterialInfo(package)) { - return error(__LINE__); - } - - mg_printf(conn, "{ \"matid\": \"%8.8x\", %s } %s", record.first, - writer.getJsonString(), last ? "" : ","); - } - mg_printf(conn, "]"); +#if SERVE_FROM_SOURCE_TREE + if (uri == "/index.html" || uri == "/app.js" || uri == "/api.js") { + mg_send_file(conn, (BASE_URL + uri).c_str()); return true; } - - if (!request->query_string) { - return error(__LINE__); - } - - const size_t qlength = strlen(request->query_string); - char matid[9] = {}; - if (mg_get_var(request->query_string, qlength, "matid", matid, sizeof(matid)) < 0) { - return error(__LINE__); - } - const uint32_t id = strtol(matid, nullptr, 16); - const DebugServer::MaterialRecord* result = mServer->getRecord(id); - if (result == nullptr) { - return error(__LINE__); - } - - ChunkContainer package(result->package, result->packageSize); - if (!package.parse()) { - return error(__LINE__); - } - - if (uri == "/api/material") { - JsonWriter writer; - if (!writer.writeMaterialInfo(package)) { - return error(__LINE__); - } - mg_printf(conn, kSuccessHeader.data(), "application/json"); - mg_printf(conn, "{ %s }", writer.getJsonString()); - return true; - } - - const std::string_view glsl("glsl"); - const std::string_view msl("msl"); - const std::string_view spirv("spirv"); - - char type[6] = {}; - if (mg_get_var(request->query_string, qlength, "type", type, sizeof(type)) < 0) { - return error(__LINE__); - } - - std::string_view language(type, strlen(type)); - - char glindex[4] = {}; - char vkindex[4] = {}; - char metalindex[4] = {}; - mg_get_var(request->query_string, qlength, "glindex", glindex, sizeof(glindex)); - mg_get_var(request->query_string, qlength, "vkindex", vkindex, sizeof(vkindex)); - mg_get_var(request->query_string, qlength, "metalindex", metalindex, sizeof(metalindex)); - - if (!glindex[0] && !vkindex[0] && !metalindex[0]) { - return error(__LINE__); - } - - if (uri != "/api/shader") { - return error(__LINE__); - } - - if (glindex[0]) { - if (language != glsl) { - return softError("Only GLSL is supported."); - } - - FixedCapacityVector info(getShaderCount(package, ChunkType::MaterialGlsl)); - if (!getGlShaderInfo(package, info.data())) { - return error(__LINE__); - } - - const int shaderIndex = std::stoi(glindex); - if (shaderIndex >= info.size()) { - return error(__LINE__); - } - - ShaderExtractor extractor(Backend::OPENGL, result->package, result->packageSize); - if (!extractor.parse()) { - return error(__LINE__); - } - - const auto& item = info[shaderIndex]; - filaflat::ShaderContent content; - extractor.getShader(item.shaderModel, item.variant, item.pipelineStage, content); - - mg_printf(conn, kSuccessHeader.data(), "application/txt"); - mg_write(conn, content.data(), content.size() - 1); +#else + auto const& asset_itr = ASSET_MAP.find(uri); + if (asset_itr != ASSET_MAP.end()) { + auto const& mime = asset_itr->second.mime; + auto const& data = asset_itr->second.data; + mg_printf(conn, kSuccessHeader.data(), mime.data()); + mg_write(conn, data.data(), data.size()); return true; } - - if (vkindex[0]) { - ShaderExtractor extractor(Backend::VULKAN, result->package, result->packageSize); - if (!extractor.parse()) { - return error(__LINE__); - } - - filaflat::ShaderContent content; - FixedCapacityVector info(getShaderCount(package, ChunkType::MaterialSpirv)); - if (!getVkShaderInfo(package, info.data())) { - return error(__LINE__); - } - - const int shaderIndex = std::stoi(vkindex); - if (shaderIndex >= info.size()) { - return error(__LINE__); - } - - const auto& item = info[shaderIndex]; - extractor.getShader(item.shaderModel, item.variant, item.pipelineStage, content); - - if (language == spirv) { - spirvToAsm(conn, (const uint32_t*) content.data(), content.size()); - return true; - } - - if (language == glsl) { - spirvToGlsl(conn, (const uint32_t*) content.data(), content.size()); - return true; - } - - return softError("Only SPIRV is supported."); - } - - if (metalindex[0]) { - ShaderExtractor extractor(Backend::METAL, result->package, result->packageSize); - if (!extractor.parse()) { - return error(__LINE__); - } - - filaflat::ShaderContent content; - FixedCapacityVector info(getShaderCount(package, ChunkType::MaterialMetal)); - if (!getMetalShaderInfo(package, info.data())) { - return error(__LINE__); - } - - const int shaderIndex = std::stoi(metalindex); - if (shaderIndex >= info.size()) { - return error(__LINE__); - } - - const auto& item = info[shaderIndex]; - extractor.getShader(item.shaderModel, item.variant, item.pipelineStage, content); - - if (language == msl) { - mg_printf(conn, kSuccessHeader.data(), "application/txt"); - mg_write(conn, content.data(), content.size() - 1); - return true; - } - - return softError("Only MSL is supported."); - } - - return error(__LINE__); - } - -private: - DebugServer* mServer; -}; - -class WebSocketHandler : public CivetWebSocketHandler { -public: - WebSocketHandler(DebugServer* server) : mServer(server) {} - - bool handleConnection(CivetServer *server, const struct mg_connection *conn) override { - return true; - } - - void handleReadyState(CivetServer *server, struct mg_connection *conn) override { - mConnections.insert(conn); - } - - bool handleData(CivetServer *server, struct mg_connection *conn, int bits, char *data, - size_t size) override { - - // First check if this chunk is a continuation of a partial existing message. - if (mServer->mChunkedMessageRemaining > 0) { - const CString chunk(data, size); - const size_t pos = mServer->mChunkedMessage.size(); - - // Append the partial existing message. - mServer->mChunkedMessage = mServer->mChunkedMessage.insert(pos, chunk); - - // Determine number of outstanding bytes. - if (size > mServer->mChunkedMessageRemaining) { - mServer->mChunkedMessageRemaining = 0; - } else { - mServer->mChunkedMessageRemaining -= size; - } - - // Return early and wait for more chunks if some bytes are still outstanding. - if (mServer->mChunkedMessageRemaining > 0) { - return true; - } - - data = mServer->mChunkedMessage.data(); - size = mServer->mChunkedMessage.size(); - - // Ignore the handshake message that occurs after startup. - } else if (size < 8) { - return true; - } - - mServer->mChunkedMessageRemaining = 0; - - // Every WebSocket message is prefixed with a command name followed by a space. - // - // For now we simply use istringstream for parsing, so command arguments are delimited - // with space characters. - // - // The "API index" matches the values of filament::backend::Backend (zero is invalid). - // - // The "shader index" is a zero-based index into the list of variants using the order that - // they appear in the package, where each API (GL / VK / Metal) has its own list. - // - // Commands: - // - // EDIT [material id] [api index] [shader index] [shader length] [shader source....] - // - - const static std::string_view kEditCmd = "EDIT "; - const static size_t kEditCmdLength = kEditCmd.size(); - - if (0 == strncmp(data, kEditCmd.data(), kEditCmdLength)) { - std::string command(data + kEditCmdLength, size - kEditCmdLength); - std::istringstream str(command); - uint32_t matid; - int api; - int shaderIndex; - int shaderLength; - str >> std::hex >> matid >> std::dec >> api >> shaderIndex >> shaderLength; - const char* source = data + kEditCmdLength + str.tellg() + 1; - const size_t remaining = size - kEditCmdLength - str.tellg(); - - // Return early and wait for more chunks if some bytes are still outstanding. - if (remaining < shaderLength + 1) { - mServer->mChunkedMessage = CString(data, size); - mServer->mChunkedMessageRemaining = shaderLength + 1 - remaining; - return true; - } - - mServer->handleEditCommand(matid, backend::Backend(api), shaderIndex, source, - shaderLength); - return true; - } - - const std::string firstFewChars(data, std::min(size, size_t(8))); - slog.e << "Bad WebSocket message. First few characters: " - << "[" << firstFewChars << "]" << io::endl; +#endif + slog.e << "[matdbg] DebugServer: bad request at line " << __LINE__ << ": " << uri << io::endl; return false; } - - void handleClose(CivetServer *server, const struct mg_connection *conn) override { - struct mg_connection *key = const_cast(conn); - mConnections.erase(key); - } - - // Notify all JavaScript clients that a new material package has been loaded. - void addMaterial(const DebugServer::MaterialRecord& material) { - for (auto connection : mConnections) { - char matid[9] = {}; - snprintf(matid, sizeof(matid), "%8.8x", material.key); - mg_websocket_write(connection, MG_WEBSOCKET_OPCODE_TEXT, matid, 8); - } - } - private: DebugServer* mServer; - tsl::robin_set mConnections; }; DebugServer::DebugServer(Backend backend, int port) : mBackend(backend) { + #if !SERVE_FROM_SOURCE_TREE - mHtml = CString((const char*) MATDBG_RESOURCES_INDEX_DATA, MATDBG_RESOURCES_INDEX_SIZE - 1); - mJavascript = CString((const char*) MATDBG_RESOURCES_SCRIPT_DATA, MATDBG_RESOURCES_SCRIPT_SIZE - 1); - mCss = CString((const char*) MATDBG_RESOURCES_STYLE_DATA, MATDBG_RESOURCES_STYLE_SIZE - 1); + ASSET_MAP["/index.html"] = { + .mime = "text/html", + .data = {(char const*) MATDBG_RESOURCES_INDEX_DATA}, + }; + ASSET_MAP["/app.js"] = { + .mime = "text/javascript", + .data = {(char const*) MATDBG_RESOURCES_APP_DATA}, + }; + ASSET_MAP["/api.js"] = { + .mime = "text/javascript", + .data = {(char const*) MATDBG_RESOURCES_API_DATA}, + }; #endif // By default the server spawns 50 threads so we override this to 10. According to the civetweb @@ -513,65 +156,76 @@ DebugServer::DebugServer(Backend backend, int port) : mBackend(backend) { if (!mServer->getContext()) { delete mServer; mServer = nullptr; - slog.e << "Unable to start DebugServer, see civetweb.txt for details." << io::endl; + slog.e << "[matdbg] Unable to start DebugServer, see civetweb.txt for details." << io::endl; return; } mFileHandler = new FileRequestHandler(this); - mRestHandler = new RestRequestHandler(this); - mWebSocketHandler = new WebSocketHandler(this); + mApiHandler = new ApiHandler(this); - mServer->addHandler("/api", mRestHandler); + mServer->addHandler("/api", mApiHandler); mServer->addHandler("", mFileHandler); - mServer->addWebSocketHandler("", mWebSocketHandler); - slog.i << "DebugServer listening at http://localhost:" << port << io::endl; + slog.i << "[matdbg] DebugServer listening at http://localhost:" << port << io::endl; filamat::GLSLTools::init(); } DebugServer::~DebugServer() { filamat::GLSLTools::shutdown(); + + mServer->close(); + + delete mFileHandler; + delete mApiHandler; + delete mServer; + + std::unique_lock lock(mMaterialRecordsMutex); for (auto& pair : mMaterialRecords) { delete [] pair.second.package; } - delete mFileHandler; - delete mRestHandler; - delete mServer; } MaterialKey DebugServer::addMaterial(const CString& name, const void* data, size_t size, void* userdata) { filaflat::ChunkContainer* container = new filaflat::ChunkContainer(data, size); if (!container->parse()) { - slog.e << "DebugServer: unable to parse material package: " << name.c_str() << io::endl; + slog.e << "[matdbg] DebugServer: unable to parse material package: " << name.c_str() << io::endl; return {}; } - const uint32_t seed = 42; - const MaterialKey key = utils::hash::murmurSlow((const uint8_t*) data, size, seed); + // Note that it's possible to have two materials with the exact same content (however wasteful), + // but they refer to different instantiation of FMaterial. Hence we hash on userdata and the + // material data. + constexpr uint32_t seed = 42; + uint64_t dataSpace[2] = {(uint64_t) data, (uint64_t) userdata}; + uint32_t const key = utils::hash::murmurSlow((uint8_t const*) dataSpace, sizeof(dataSpace), seed); // Retain a copy of the package to permit queries after the client application has // freed up the original material package. uint8_t* package = new uint8_t[size]; memcpy(package, data, size); + std::unique_lock lock(mMaterialRecordsMutex); MaterialRecord info = {userdata, package, size, name, key}; mMaterialRecords.insert({key, info}); - mWebSocketHandler->addMaterial(info); + mApiHandler->addMaterial(&info); return key; } void DebugServer::removeMaterial(MaterialKey key) { + std::unique_lock lock(mMaterialRecordsMutex); mMaterialRecords.erase(key); } -const DebugServer::MaterialRecord* DebugServer::getRecord(const MaterialKey& key) const { +const MaterialRecord* DebugServer::getRecord(const MaterialKey& key) const { + std::unique_lock lock(mMaterialRecordsMutex); const auto& iter = mMaterialRecords.find(key); return iter == mMaterialRecords.end() ? nullptr : &iter->second; } void DebugServer::updateActiveVariants() { if (mQueryCallback) { + std::unique_lock lock(mMaterialRecordsMutex); auto curr = mMaterialRecords.begin(); auto end = mMaterialRecords.end(); while (curr != end) { @@ -586,10 +240,11 @@ void DebugServer::updateActiveVariants() { bool DebugServer::handleEditCommand(const MaterialKey& key, backend::Backend api, int shaderIndex, const char* source, size_t size) { const auto error = [](int line) { - slog.e << "DebugServer: Unable to apply shader edit at line " << line << io::endl; + slog.e << "[matdbg] DebugServer: Unable to apply shader edit at line " << line << io::endl; return false; }; + std::unique_lock lock(mMaterialRecordsMutex); if (mMaterialRecords.find(key) == mMaterialRecords.end()) { return error(__LINE__); } @@ -606,7 +261,7 @@ bool DebugServer::handleEditCommand(const MaterialKey& key, backend::Backend api shaderCount = getShaderCount(package, ChunkType::MaterialGlsl); infos.reserve(shaderCount); infos.resize(shaderCount); - if (!getGlShaderInfo(package, infos.data())) { + if (!getShaderInfo(package, infos.data(), ChunkType::MaterialGlsl)) { return error(__LINE__); } break; @@ -615,7 +270,7 @@ bool DebugServer::handleEditCommand(const MaterialKey& key, backend::Backend api shaderCount = getShaderCount(package, ChunkType::MaterialSpirv); infos.reserve(shaderCount); infos.resize(shaderCount); - if (!getVkShaderInfo(package, infos.data())) { + if (!getShaderInfo(package, infos.data(), ChunkType::MaterialSpirv)) { return error(__LINE__); } break; @@ -624,7 +279,7 @@ bool DebugServer::handleEditCommand(const MaterialKey& key, backend::Backend api shaderCount = getShaderCount(package, ChunkType::MaterialMetal); infos.reserve(shaderCount); infos.resize(shaderCount); - if (!getMetalShaderInfo(package, infos.data())) { + if (!getShaderInfo(package, infos.data(), ChunkType::MaterialMetal)) { return error(__LINE__); } break; @@ -655,5 +310,4 @@ bool DebugServer::handleEditCommand(const MaterialKey& key, backend::Backend api return true; } -} // namespace matdbg -} // namespace filament +} // namespace filament::matdbg diff --git a/libs/matdbg/src/JsonWriter.cpp b/libs/matdbg/src/JsonWriter.cpp index dfe5e3d970d..c9e94c8143d 100644 --- a/libs/matdbg/src/JsonWriter.cpp +++ b/libs/matdbg/src/JsonWriter.cpp @@ -90,6 +90,7 @@ static bool printMaterial(ostream& json, const ChunkContainer& container) { json << "\"shading\": {\n"; printChunk(json, container, MaterialShading, "model"); printChunk(json, container, ChunkType::MaterialDomain, "material_domain"); + printChunk(json, container, ChunkType::MaterialVariantFilterMask, "variant_filter_mask"); printChunk(json, container, MaterialVertexDomain, "vertex_domain"); printChunk(json, container, MaterialInterpolation, "interpolation"); printChunk(json, container, MaterialShadowMultiplier, "shadow_multiply"); @@ -112,7 +113,7 @@ static bool printMaterial(ostream& json, const ChunkContainer& container) { return true; } -static bool printParametersInfo(ostream& json, const ChunkContainer& container) { +static bool printParametersInfo(ostream&, const ChunkContainer&) { // TODO return true; } @@ -138,7 +139,7 @@ static void printShaderInfo(ostream& json, const vector& info, const static bool printGlslInfo(ostream& json, const ChunkContainer& container) { std::vector info; info.resize(getShaderCount(container, ChunkType::MaterialGlsl)); - if (!getGlShaderInfo(container, info.data())) { + if (!getShaderInfo(container, info.data(), ChunkType::MaterialGlsl)) { return false; } json << "\"opengl\": [\n"; @@ -150,7 +151,7 @@ static bool printGlslInfo(ostream& json, const ChunkContainer& container) { static bool printVkInfo(ostream& json, const ChunkContainer& container) { std::vector info; info.resize(getShaderCount(container, ChunkType::MaterialSpirv)); - if (!getVkShaderInfo(container, info.data())) { + if (!getShaderInfo(container, info.data(), ChunkType::MaterialSpirv)) { return false; } json << "\"vulkan\": [\n"; @@ -162,7 +163,7 @@ static bool printVkInfo(ostream& json, const ChunkContainer& container) { static bool printMetalInfo(ostream& json, const ChunkContainer& container) { std::vector info; info.resize(getShaderCount(container, ChunkType::MaterialMetal)); - if (!getMetalShaderInfo(container, info.data())) { + if (!getShaderInfo(container, info.data(), ChunkType::MaterialMetal)) { return false; } json << "\"metal\": [\n"; @@ -226,17 +227,17 @@ bool JsonWriter::writeActiveInfo(const filaflat::ChunkContainer& package, switch (backend) { case Backend::OPENGL: shaders.resize(getShaderCount(package, ChunkType::MaterialGlsl)); - getGlShaderInfo(package, shaders.data()); + getShaderInfo(package, shaders.data(), ChunkType::MaterialGlsl); json << "opengl"; break; case Backend::VULKAN: shaders.resize(getShaderCount(package, ChunkType::MaterialSpirv)); - getVkShaderInfo(package, shaders.data()); + getShaderInfo(package, shaders.data(), ChunkType::MaterialSpirv); json << "vulkan"; break; case Backend::METAL: shaders.resize(getShaderCount(package, ChunkType::MaterialMetal)); - getMetalShaderInfo(package, shaders.data()); + getShaderInfo(package, shaders.data(), ChunkType::MaterialMetal); json << "metal"; break; default: diff --git a/libs/matdbg/src/ShaderExtractor.cpp b/libs/matdbg/src/ShaderExtractor.cpp index c89175ac852..22ba82c211f 100644 --- a/libs/matdbg/src/ShaderExtractor.cpp +++ b/libs/matdbg/src/ShaderExtractor.cpp @@ -38,23 +38,29 @@ using namespace utils; namespace filament { namespace matdbg { -ShaderExtractor::ShaderExtractor(Backend backend, const void* data, size_t size) +ShaderExtractor::ShaderExtractor(backend::ShaderLanguage target, const void* data, size_t size) : mChunkContainer(data, size), mMaterialChunk(mChunkContainer) { - switch (backend) { - case Backend::OPENGL: + switch (target) { + case backend::ShaderLanguage::ESSL1: + mMaterialTag = ChunkType::MaterialEssl1; + mDictionaryTag = ChunkType::DictionaryText; + break; + case backend::ShaderLanguage::ESSL3: mMaterialTag = ChunkType::MaterialGlsl; mDictionaryTag = ChunkType::DictionaryText; break; - case Backend::METAL: + case backend::ShaderLanguage::MSL: mMaterialTag = ChunkType::MaterialMetal; mDictionaryTag = ChunkType::DictionaryText; break; - case Backend::VULKAN: + case backend::ShaderLanguage::METAL_LIBRARY: + mMaterialTag = ChunkType::MaterialMetalLibrary; + mDictionaryTag = ChunkType::DictionaryMetalLibrary; + break; + case backend::ShaderLanguage::SPIRV: mMaterialTag = ChunkType::MaterialSpirv; mDictionaryTag = ChunkType::DictionarySpirv; break; - default: - break; } } @@ -82,16 +88,23 @@ bool ShaderExtractor::getShader(ShaderModel shaderModel, return false; } - return mMaterialChunk.getShader(shader, blobDictionary, - uint8_t(shaderModel), variant, uint8_t(stage)); + return mMaterialChunk.getShader(shader, blobDictionary, shaderModel, variant, stage); } -CString ShaderExtractor::spirvToGLSL(const uint32_t* data, size_t wordCount) { +CString ShaderExtractor::spirvToGLSL(ShaderModel shaderModel, const uint32_t* data, + size_t wordCount) { using namespace spirv_cross; CompilerGLSL::Options emitOptions; - emitOptions.es = false; - emitOptions.version = 410; + if (shaderModel == ShaderModel::MOBILE) { + emitOptions.es = true; + emitOptions.version = 310; + emitOptions.fragment.default_float_precision = CompilerGLSL::Options::Precision::Mediump; + emitOptions.fragment.default_int_precision = CompilerGLSL::Options::Precision::Mediump; + } else if (shaderModel == ShaderModel::DESKTOP) { + emitOptions.es = false; + emitOptions.version = 450; + } emitOptions.vulkan_semantics = true; std::vector spirv(data, data + wordCount); @@ -105,8 +118,9 @@ CString ShaderExtractor::spirvToGLSL(const uint32_t* data, size_t wordCount) { // but please do not submit. We prefer to use the syntax that the standalone "spirv-dis" tool // uses, which lets us easily generate test cases for the spirv-cross project. CString ShaderExtractor::spirvToText(const uint32_t* begin, size_t wordCount) { - spv_context context = spvContextCreate(SPV_ENV_UNIVERSAL_1_0); - if (SPV_SUCCESS != spvValidateBinary(context, begin, wordCount, nullptr)) { + spv_context context = spvContextCreate(SPV_ENV_UNIVERSAL_1_3); + + if (spvValidateBinary(context, begin, wordCount, nullptr) != SPV_SUCCESS) { spvContextDestroy(context); return CString("Validation failure."); } diff --git a/libs/matdbg/src/ShaderInfo.cpp b/libs/matdbg/src/ShaderInfo.cpp index 6b857a5b9dd..cba7bf648df 100644 --- a/libs/matdbg/src/ShaderInfo.cpp +++ b/libs/matdbg/src/ShaderInfo.cpp @@ -48,61 +48,16 @@ size_t getShaderCount(const ChunkContainer& container, ChunkType type) { return shaderCount; } -bool getMetalShaderInfo(const ChunkContainer& container, ShaderInfo* info) { - if (!container.hasChunk(ChunkType::MaterialMetal)) { - return true; - } - - auto [start, end] = container.getChunkRange(ChunkType::MaterialMetal); - Unflattener unflattener(start, end); - - uint64_t shaderCount = 0; - if (!unflattener.read(&shaderCount) || shaderCount == 0) { - return false; - } - - for (uint64_t i = 0; i < shaderCount; i++) { - uint8_t shaderModelValue; - Variant variant; - uint8_t pipelineStageValue; - uint32_t offsetValue; - if (!unflattener.read(&shaderModelValue)) { - return false; - } - - if (!unflattener.read(&variant)) { - return false; - } - - if (!unflattener.read(&pipelineStageValue)) { - return false; - } - - if (!unflattener.read(&offsetValue)) { - return false; - } - - *info++ = { - .shaderModel = ShaderModel(shaderModelValue), - .variant = variant, - .pipelineStage = ShaderStage(pipelineStageValue), - .offset = offsetValue - }; - } - - return true; -} - -bool getGlShaderInfo(const ChunkContainer& container, ShaderInfo* info) { - if (!container.hasChunk(ChunkType::MaterialGlsl)) { +bool getShaderInfo(const ChunkContainer& container, ShaderInfo* info, ChunkType chunkType) { + if (!container.hasChunk(chunkType)) { return true; } - auto [start, end] = container.getChunkRange(ChunkType::MaterialGlsl); + auto [start, end] = container.getChunkRange(chunkType); Unflattener unflattener(start, end); - uint64_t shaderCount; + uint64_t shaderCount = 0; if (!unflattener.read(&shaderCount) || shaderCount == 0) { return false; } @@ -139,49 +94,4 @@ bool getGlShaderInfo(const ChunkContainer& container, ShaderInfo* info) { return true; } -bool getVkShaderInfo(const ChunkContainer& container, ShaderInfo* info) { - if (!container.hasChunk(ChunkType::MaterialSpirv)) { - return true; - } - - auto [start, end] = container.getChunkRange(ChunkType::MaterialSpirv); - Unflattener unflattener(start, end); - - uint64_t shaderCount; - if (!unflattener.read(&shaderCount) || shaderCount == 0) { - return false; - } - - for (uint64_t i = 0; i < shaderCount; i++) { - uint8_t shaderModelValue; - Variant variant; - uint8_t pipelineStageValue; - uint32_t dictionaryIndex; - - if (!unflattener.read(&shaderModelValue)) { - return false; - } - - if (!unflattener.read(&variant)) { - return false; - } - - if (!unflattener.read(&pipelineStageValue)) { - return false; - } - - if (!unflattener.read(&dictionaryIndex)) { - return false; - } - - *info++ = { - .shaderModel = ShaderModel(shaderModelValue), - .variant = variant, - .pipelineStage = ShaderStage(pipelineStageValue), - .offset = dictionaryIndex - }; - } - return true; -} - } // namespace filament diff --git a/libs/matdbg/src/ShaderReplacer.cpp b/libs/matdbg/src/ShaderReplacer.cpp index 481e0d89b88..8a457e598c9 100644 --- a/libs/matdbg/src/ShaderReplacer.cpp +++ b/libs/matdbg/src/ShaderReplacer.cpp @@ -35,10 +35,12 @@ #include "eiff/ChunkContainer.h" #include "eiff/DictionarySpirvChunk.h" #include "eiff/DictionaryTextChunk.h" -#include "eiff/MaterialSpirvChunk.h" +#include "eiff/MaterialBinaryChunk.h" #include "eiff/MaterialTextChunk.h" #include "eiff/LineDictionary.h" +#include "spirv-tools/libspirv.h" + namespace filament::matdbg { using namespace backend; @@ -60,7 +62,7 @@ class ShaderIndex { void writeChunks(ostream& stream); // Replaces the specified shader text with new content. - void replaceShader(backend::ShaderModel shaderModel, Variant variant, + void replaceShader(backend::ShaderModel model, Variant variant, ShaderStage stage, const char* source, size_t sourceLength); bool isEmpty() const { return mShaderRecords.size() == 0; } @@ -71,7 +73,7 @@ class ShaderIndex { vector mShaderRecords; }; -// Tiny database of data blobs that can import / export MaterialSpirvChunk and DictionarySpirvChunk. +// Tiny database of data blobs that can import / export MaterialBinaryChunk and DictionarySpirvChunk. // The blobs are stored *after* they have been compressed by SMOL-V. class BlobIndex { public: @@ -88,7 +90,7 @@ class BlobIndex { private: const ChunkType mDictTag; const ChunkType mMatTag; - vector mShaderRecords; + vector mShaderRecords; filaflat::BlobDictionary mDataBlobs; }; @@ -182,45 +184,70 @@ bool ShaderReplacer::replaceSpirv(ShaderModel shaderModel, Variant variant, } }; - const EShLanguage shLang = getShaderStage(stage); + MaterialBuilder::TargetApi const targetApi = targetApiFromBackend(mBackend); + assert_invariant(targetApi == MaterialBuilder::TargetApi::VULKAN); - std::string nullTerminated(source, sourceLength); - source = nullTerminated.c_str(); + // Unfortunately we need to use std::vector to interface with glslang. + vector spirv; - TShader tShader(shLang); - tShader.setStrings(&source, 1); + const std::string_view src{ source, sourceLength }; + if (!src.compare(0, 8, "; SPIR-V")) { + // we're receiving disassembled spirv + spv_binary binary; + spv_diagnostic diagnostic = nullptr; + spv_context context = spvContextCreate(SPV_ENV_VULKAN_1_1); + spv_result_t const error = spvTextToBinaryWithOptions(context, source, sourceLength, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS, &binary, &diagnostic); + spvContextDestroy(context); + if (error) { + slog.e << "[matdbg] ShaderReplacer spirv-as failed (spv_result_t: " << error << ")" << io::endl; + spvDiagnosticPrint(diagnostic); + spvDiagnosticDestroy(diagnostic); + return false; + } + spirv.insert(spirv.end(), binary->code, binary->code + binary->wordCount); + spvBinaryDestroy(binary); - MaterialBuilder::TargetApi targetApi = targetApiFromBackend(mBackend); - assert_invariant(targetApi == MaterialBuilder::TargetApi::VULKAN); + } else { + // we're receiving glsl - const int version = GLSLTools::getGlslDefaultVersion(shaderModel); - const EShMessages msg = GLSLTools::glslangFlagsFromTargetApi(targetApi, - MaterialBuilder::TargetLanguage::SPIRV); - const bool ok = tShader.parse(&DefaultTBuiltInResource, version, false, msg); - if (!ok) { - slog.e << "ShaderReplacer parse:\n" << tShader.getInfoLog() << io::endl; - return false; - } + std::string const nullTerminated(source, sourceLength); + source = nullTerminated.c_str(); - TProgram program; - program.addShader(&tShader); - const bool linkOk = program.link(msg); - if (!linkOk) { - slog.e << "ShaderReplacer link:\n" << program.getInfoLog() << io::endl; - return false; - } + const EShLanguage shLang = getShaderStage(stage); + TShader tShader(shLang); + tShader.setStrings(&source, 1); - // Unfortunately we need to use std::vector to interface with glslang. - vector spirv; + const int version = GLSLTools::getGlslDefaultVersion(shaderModel); + const EShMessages msg = GLSLTools::glslangFlagsFromTargetApi(targetApi, + MaterialBuilder::TargetLanguage::SPIRV); + + GLSLTools::prepareShaderParser(targetApi, + MaterialBuilder::TargetLanguage::SPIRV, tShader, shLang, version); - SpvOptions options; - options.generateDebugInfo = true; - GlslangToSpv(*tShader.getIntermediate(), spirv, &options); + const bool ok = tShader.parse(&DefaultTBuiltInResource, version, false, msg); + if (!ok) { + slog.e << "[matdbg] ShaderReplacer parse:\n" << tShader.getInfoLog() << io::endl; + return false; + } + + TProgram program; + program.addShader(&tShader); + const bool linkOk = program.link(msg); + if (!linkOk) { + slog.e << "[matdbg] ShaderReplacer link:\n" << program.getInfoLog() << io::endl; + return false; + } + + SpvOptions options; + options.generateDebugInfo = true; + GlslangToSpv(*tShader.getIntermediate(), spirv, &options); + } source = (const char*) spirv.data(); sourceLength = spirv.size() * 4; - slog.i << "Success re-generating SPIR-V. (" << sourceLength << " bytes)" << io::endl; + slog.i << "[matdbg] Success re-generating SPIR-V. (" << sourceLength << " bytes)" << io::endl; // Clone all chunks except Dictionary* and Material*. filaflat::ChunkContainer const& cc = mOriginalPackage; @@ -272,6 +299,9 @@ size_t ShaderReplacer::getEditedSize() const { ShaderIndex::ShaderIndex(ChunkType dictTag, ChunkType matTag, const filaflat::ChunkContainer& cc) : mDictTag(dictTag), mMatTag(matTag) { + + assert_invariant(matTag != filamat::ChunkType::MaterialSpirv); + filaflat::BlobDictionary stringBlobs; DictionaryReader reader; reader.unflatten(cc, dictTag, stringBlobs); @@ -279,18 +309,17 @@ ShaderIndex::ShaderIndex(ChunkType dictTag, ChunkType matTag, const filaflat::Ch filaflat::MaterialChunk matChunk(cc); matChunk.initialize(matTag); - const auto& offsets = matChunk.getOffsets(); - mShaderRecords.reserve(offsets.size()); - for (auto [key, offset] : offsets) { - TextEntry info; - filaflat::MaterialChunk::decodeKey(key, &info.shaderModel, &info.variantKey, &info.stage); - ShaderContent content; - UTILS_UNUSED_IN_RELEASE bool success = matChunk.getShader(content, - stringBlobs, info.shaderModel, Variant(info.variantKey), info.stage); - info.shader = std::string(content.data(), content.data() + content.size() - 1); - assert_invariant(success); - mShaderRecords.emplace_back(info); - } + matChunk.visitShaders([this, &matChunk, &stringBlobs] + (ShaderModel shaderModel, Variant variant, ShaderStage stage) { + ShaderContent content; + UTILS_UNUSED_IN_RELEASE bool success = matChunk.getShader(content, + stringBlobs, shaderModel, variant, stage); + + std::string source{ content.data(), content.data() + content.size() - 1u }; + assert_invariant(success); + + mShaderRecords.push_back({ shaderModel, variant, stage, std::move(source) }); + }); } void ShaderIndex::writeChunks(ostream& stream) { @@ -300,8 +329,8 @@ void ShaderIndex::writeChunks(ostream& stream) { } filamat::ChunkContainer cc; - const auto& dchunk = cc.addChild(std::move(lines), mDictTag); - cc.addChild(std::move(mShaderRecords), dchunk.getDictionary(), mMatTag); + const auto& dchunk = cc.push(std::move(lines), mDictTag); + cc.push(std::move(mShaderRecords), dchunk.getDictionary(), mMatTag); const size_t bufSize = cc.getSize(); auto buffer = std::make_unique(bufSize); @@ -311,17 +340,16 @@ void ShaderIndex::writeChunks(ostream& stream) { stream.write((char*)buffer.get(), bufSize); } -void ShaderIndex::replaceShader(backend::ShaderModel shaderModel, Variant variant, +void ShaderIndex::replaceShader(backend::ShaderModel model, Variant variant, backend::ShaderStage stage, const char* source, size_t sourceLength) { - const uint8_t model = uint8_t(shaderModel); for (auto& record : mShaderRecords) { - if (record.shaderModel == model && record.variantKey == variant.key && - record.stage == uint8_t(stage)) { + if (record.shaderModel == model && record.variant == variant && + record.stage == stage) { record.shader = std::string(source, sourceLength); return; } } - slog.e << "Failed to replace shader." << io::endl; + slog.e << "[matdbg] Failed to replace shader." << io::endl; } BlobIndex::BlobIndex(ChunkType dictTag, ChunkType matTag, const filaflat::ChunkContainer& cc) : @@ -336,8 +364,8 @@ BlobIndex::BlobIndex(ChunkType dictTag, ChunkType matTag, const filaflat::ChunkC const auto& offsets = matChunk.getOffsets(); mShaderRecords.reserve(offsets.size()); for (auto [key, offset] : offsets) { - SpirvEntry info; - filaflat::MaterialChunk::decodeKey(key, &info.shaderModel, &info.variantKey, &info.stage); + BinaryEntry info; + filaflat::MaterialChunk::decodeKey(key, &info.shaderModel, &info.variant, &info.stage); info.dictionaryIndex = offset; mShaderRecords.emplace_back(info); } @@ -349,8 +377,8 @@ void BlobIndex::writeChunks(ostream& stream) { for (auto& record : mShaderRecords) { const auto& src = mDataBlobs[record.dictionaryIndex]; assert(src.size() % 4 == 0); - const uint32_t* ptr = (const uint32_t*) src.data(); - record.dictionaryIndex = blobs.addBlob(vector(ptr, ptr + src.size() / 4)); + uint8_t const* ptr = (uint8_t const*) src.data(); + record.dictionaryIndex = blobs.addBlob(vector(ptr, ptr + src.size())); } // Adjust start cursor of flatteners to match alignment of output stream. @@ -363,8 +391,8 @@ void BlobIndex::writeChunks(ostream& stream) { // Apply SMOL-V compression and write out the results. filamat::ChunkContainer cc; - cc.addChild(std::move(mShaderRecords)); - cc.addChild(std::move(blobs), false); + cc.push(std::move(mShaderRecords), ChunkType::MaterialSpirv); + cc.push(std::move(blobs), false); Flattener prepass = Flattener::getDryRunner(); initialize(prepass); @@ -381,13 +409,10 @@ void BlobIndex::writeChunks(ostream& stream) { stream.write((char*)buffer.get() + pad, bufSize - pad); } -void BlobIndex::replaceShader(ShaderModel shaderModel, Variant variant, +void BlobIndex::replaceShader(ShaderModel model, Variant variant, ShaderStage stage, const char* source, size_t sourceLength) { - const uint8_t model = (uint8_t) shaderModel; for (auto& record : mShaderRecords) { - if (record.shaderModel == model && record.variantKey == variant.key && - record.stage == uint8_t(stage)) { - + if (record.shaderModel == model && record.variant == variant && record.stage == stage) { // TODO: because a single blob entry might be used by more than one variant, matdbg // users may unwittingly edit more than 1 variant when multiple variants have the exact // same content before the edit. In practice this is rarely problematic, but we should @@ -401,7 +426,7 @@ void BlobIndex::replaceShader(ShaderModel shaderModel, Variant variant, return; } } - slog.e << "Unable to replace shader." << io::endl; + slog.e << "[matdbg] Unable to replace shader." << io::endl; } } // namespace filament::matdbg diff --git a/libs/matdbg/src/SourceFormatter.cpp b/libs/matdbg/src/SourceFormatter.cpp new file mode 100644 index 00000000000..c068a34f4b4 --- /dev/null +++ b/libs/matdbg/src/SourceFormatter.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SourceFormatter.h" + +#include + +#include +#include + +namespace filament::matdbg { + +#if defined(__linux__) || defined(__APPLE__) +std::string SourceFormatter::format(char const* source) { + std::string const TMP_FILENAME = "/tmp/matdbg-tmp-src.cpp"; + + std::string original(source); + FILE* fp; + fp = fopen(TMP_FILENAME.c_str(), "w"); + if (!fp) { + return original; + } + fputs(original.c_str(), fp); + fflush(fp); + pclose(fp); + + std::string const CLANG_FORMAT_OPTIONS = + "-style='{" + "BasedOnStyle: Google, " + "IndentWidth: 4, " + "MaxEmptyLinesToKeep: 2" + "}'"; + + fp = popen(("clang-format " + CLANG_FORMAT_OPTIONS + "< " + TMP_FILENAME).c_str(), "r"); + + if (!fp) { + std::call_once(mClangWarningFlag, []() { + utils::slog.w << "[matdbg] unable to run clang-format to format shader file. " + << "Please make sure it's installed."; + }); + return original; + } + + char output[1024]; + std::stringstream outStream; + while (fgets(output, 1024, fp) != NULL) { + outStream << output; + } + + int status = pclose(fp); + if (WEXITSTATUS(status)) { + utils::slog.w << "[matdbg] clang-format failed with code=" << WEXITSTATUS(status) + << utils::io::endl; + } + return outStream.str(); +} +#else +std::string SourceFormatter::format(char const* source) { + std::call_once(mClangWarningFlag, []() { + utils::slog.w <<"[matdbg]: source formatting is not available on this platform" << + utils::io::endl; + }); + return ""; +} +#endif + +} // filament::matdbg diff --git a/libs/matdbg/src/SourceFormatter.h b/libs/matdbg/src/SourceFormatter.h new file mode 100644 index 00000000000..5793474d716 --- /dev/null +++ b/libs/matdbg/src/SourceFormatter.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MATDBG_SOURCE_FORMATTER_H +#define MATDBG_SOURCE_FORMATTER_H + +#include + +namespace filament::matdbg { + +class SourceFormatter { +public: + SourceFormatter() = default; + ~SourceFormatter() = default; + std::string format(char const* source); + +private: + + std::once_flag mClangWarningFlag; +}; + +} // filament::matdbg + +#endif // MATDBG_SOURCE_FORMATTER_H diff --git a/libs/matdbg/src/TextWriter.cpp b/libs/matdbg/src/TextWriter.cpp index 737458ab0c4..baa189a1b84 100644 --- a/libs/matdbg/src/TextWriter.cpp +++ b/libs/matdbg/src/TextWriter.cpp @@ -112,6 +112,7 @@ static bool printMaterial(ostream& text, const ChunkContainer& container) { text << "Shading:" << endl; printChunk(text, container, MaterialShading, "Model: "); printChunk(text, container, ChunkType::MaterialDomain, "Material domain: "); + printChunk(text, container, ChunkType::MaterialVariantFilterMask, "Material Variant Filter: "); printChunk(text, container, MaterialVertexDomain, "Vertex domain: "); printChunk(text, container, MaterialInterpolation, "Interpolation: "); printChunk(text, container, MaterialShadowMultiplier, "Shadow multiply: "); @@ -222,6 +223,7 @@ static bool printParametersInfo(ostream& text, const ChunkContainer& container) for (uint64_t i = 0; i < sibCount; i++) { CString fieldName; + uint8_t fieldBinding; uint8_t fieldType; uint8_t fieldFormat; uint8_t fieldPrecision; @@ -231,6 +233,10 @@ static bool printParametersInfo(ostream& text, const ChunkContainer& container) return false; } + if (!sib.read(&fieldBinding)) { + return false; + } + if (!sib.read(&fieldType)) { return false; } @@ -248,6 +254,7 @@ static bool printParametersInfo(ostream& text, const ChunkContainer& container) text << " " << setw(alignment) << fieldName.c_str() + << setw(shortAlignment) << +fieldBinding << setw(shortAlignment) << toString(SamplerType(fieldType)) << setw(shortAlignment) << toString(Precision(fieldPrecision)) << toString(SamplerFormat(fieldFormat)) @@ -259,6 +266,42 @@ static bool printParametersInfo(ostream& text, const ChunkContainer& container) return true; } +static bool printConstantInfo(ostream& text, const ChunkContainer& container) { + if (!container.hasChunk(ChunkType::MaterialConstants)) { + return true; + } + + auto [startConstants, endConstants] = container.getChunkRange(ChunkType::MaterialConstants); + Unflattener constants(startConstants, endConstants); + + uint64_t constantsCount; + constants.read(&constantsCount); + + text << "Constants:" << endl; + + for (uint64_t i = 0; i < constantsCount; i++) { + CString fieldName; + uint8_t fieldType; + + if (!constants.read(&fieldName)) { + return false; + } + + if (!constants.read(&fieldType)) { + return false; + } + + text << " " + << setw(alignment) << fieldName.c_str() + << setw(shortAlignment) << toString(ConstantType(fieldType)) + << endl; + } + + text << endl; + + return true; +} + static bool printSubpassesInfo(ostream& text, const ChunkContainer& container) { // Subpasses are optional. @@ -365,35 +408,32 @@ static void printShaderInfo(ostream& text, const vector& info, text << endl; } -static bool printGlslInfo(ostream& text, const ChunkContainer& container) { +static bool printShaderInfo(ostream& text, const ChunkContainer& container, ChunkType chunkType) { vector info; - info.resize(getShaderCount(container, ChunkType::MaterialGlsl)); - if (!getGlShaderInfo(container, info.data())) { + info.resize(getShaderCount(container, chunkType)); + if (!getShaderInfo(container, info.data(), chunkType)) { return false; } - text << "GLSL shaders:" << endl; - printShaderInfo(text, info, container); - return true; -} - -static bool printVkInfo(ostream& text, const ChunkContainer& container) { - vector info; - info.resize(getShaderCount(container, ChunkType::MaterialSpirv)); - if (!getVkShaderInfo(container, info.data())) { - return false; - } - text << "Vulkan shaders:" << endl; - printShaderInfo(text, info, container); - return true; -} - -static bool printMetalInfo(ostream& text, const ChunkContainer& container) { - vector info; - info.resize(getShaderCount(container, ChunkType::MaterialMetal)); - if (!getMetalShaderInfo(container, info.data())) { - return false; + switch (chunkType) { + case ChunkType::MaterialGlsl: + text << "GLSL shaders:" << endl; + break; + case ChunkType::MaterialEssl1: + text << "ESSL1 shaders:" << endl; + break; + case ChunkType::MaterialSpirv: + text << "Vulkan shaders:" << endl; + break; + case ChunkType::MaterialMetal: + text << "Metal shaders:" << endl; + break; + case ChunkType::MaterialMetalLibrary: + text << "Metal precompiled shader libraries:" << endl; + break; + default: + assert(false && "Invalid shader ChunkType"); + break; } - text << "Metal shaders:" << endl; printShaderInfo(text, info, container); return true; } @@ -406,16 +446,25 @@ bool TextWriter::writeMaterialInfo(const filaflat::ChunkContainer& container) { if (!printParametersInfo(text, container)) { return false; } + if (!printConstantInfo(text, container)) { + return false; + } if (!printSubpassesInfo(text, container)) { return false; } - if (!printGlslInfo(text, container)) { + if (!printShaderInfo(text, container, ChunkType::MaterialGlsl)) { + return false; + } + if (!printShaderInfo(text, container, ChunkType::MaterialEssl1)) { + return false; + } + if (!printShaderInfo(text, container, ChunkType::MaterialSpirv)) { return false; } - if (!printVkInfo(text, container)) { + if (!printShaderInfo(text, container, ChunkType::MaterialMetal)) { return false; } - if (!printMetalInfo(text, container)) { + if (!printShaderInfo(text, container, ChunkType::MaterialMetalLibrary)) { return false; } diff --git a/libs/matdbg/web/api.js b/libs/matdbg/web/api.js new file mode 100644 index 00000000000..3a580fcacfe --- /dev/null +++ b/libs/matdbg/web/api.js @@ -0,0 +1,145 @@ +/* +* Copyright (C) 2023 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +// api.js encapsulates all of the REST endpoints that the server provides + +async function _fetchJson(uri) { + const response = await fetch(uri); + return await response.json(); +} + +async function _fetchText(uri) { + const response = await fetch(uri); + return await response.text(); +} + +async function fetchShaderCode(matid, backend, language, index) { + let query; + switch (backend) { + case "opengl": + query = `type=${language}&glindex=${index}`; + break; + case "vulkan": + query = `type=${language}&vkindex=${index}`; + break; + case "metal": + query = `type=${language}&metalindex=${index}`; + break; + } + return await _fetchText(`api/shader?matid=${matid}&${query}`); +} + +async function fetchMaterials() { + const matJson = await _fetchJson("api/materials") + const ret = {}; + for (const matInfo of matJson) { + ret[matInfo.matid] = matInfo; + } + return ret; +} + +async function fetchMaterial(matId) { + const matInfo = await _fetchJson(`api/material?matid=${matid}`); + matInfo.matid = matid; + return matInfo; +} + +async function fetchMatIds() { + const matInfo = await _fetchJson("api/matids"); + const ret = []; + for (matid of matInfo) { + ret.push(matid); + } + return ret; +} + +async function queryActiveShaders() { + const activeMaterials = await _fetchJson("api/active"); + const actives = {}; + for (matid in activeMaterials) { + const backend = activeMaterials[matid][0]; + const variants = activeMaterials[matid].slice(1); + actives[matid] = { + backend, variants + }; + } + return actives; +} + +function rebuildMaterial(materialId, backend, shaderIndex, editedText) { + let api = 0; + switch (backend) { + case "opengl": api = 1; break; + case "vulkan": api = 2; break; + case "metal": api = 3; break; + } + return new Promise((ok, fail) => { + const req = new XMLHttpRequest(); + req.open('POST', '/api/edit'); + req.send(`${materialId} ${api} ${shaderIndex} ${editedText}`); + req.onload = ok; + req.onerror = fail; + }); +} + +function activeShadersLoop(isConnected, onActiveShaders) { + setInterval(async () => { + if (isConnected()) { + onActiveShaders(await queryActiveShaders()); + } + }, 1000); +} + +const STATUS_LOOP_TIMEOUT = 3000; + +const STATUS_CONNECTED = 1; +const STATUS_DISCONNECTED = 2; +const STATUS_MATERIAL_UPDATED = 3; + +// Status function should be of the form function(status, data) +async function statusLoop(isConnected, onStatus) { + // This is a hanging get except for when transition from disconnected to connected, which + // should return immediately. + try { + const matid = await _fetchText("api/status" + (isConnected() ? '' : '?firstTime')); + // A first-time request returned successfully + if (matid === '0') { + onStatus(STATUS_CONNECTED); + } else if (matid !== '1') { + onStatus(STATUS_MATERIAL_UPDATED, matid); + } // matid == '1' is no-op, just loop again + statusLoop(isConnected, onStatus); + } catch { + onStatus(STATUS_DISCONNECTED); + setTimeout(() => statusLoop(isConnected, onStatus), STATUS_LOOP_TIMEOUT) + } +} + +// Use browser User-agent to guess the current backend. This is mainly for matinfo which does +// not have a running backend. +function guessBackend() { + const AGENTS_TO_BACKEND = [ + ['Mac OS', 'metal'], + ['Windows', 'opengl'], + ['Linux', 'vulkan'], + ]; + + const result = AGENTS_TO_BACKEND.filter((agent_backend) => { + return window.navigator.userAgent.search(agent_backend[0]); + }).map((agent_backend) => agent_backend[1]); + + return result.length > 0 ? result[0] : null; +} diff --git a/libs/matdbg/web/app.js b/libs/matdbg/web/app.js new file mode 100644 index 00000000000..325d47487fd --- /dev/null +++ b/libs/matdbg/web/app.js @@ -0,0 +1,1174 @@ +/* +* Copyright (C) 2023 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import { LitElement, html, css, unsafeCSS, nothing } from "https://unpkg.com/lit@2.8.0?module"; + +const kUntitledPlaceholder = "untitled"; + +// Maps to backend to the languages allowed for that backend. +const LANGUAGE_CHOICES = { + 'opengl': ['glsl'], + 'vulkan': ['glsl', 'spirv'], + 'metal': ['msl'], +}; + +const BACKENDS = Object.keys(LANGUAGE_CHOICES); + +const MATERIAL_INFO_KEY_TO_STRING = { + 'model': 'shading model', + 'vertex_domain': 'vertex domain', + 'interpolation': 'interpolation', + 'shadow_multiply': 'shadow multiply', + 'specular_antialiasing': 'specular antialiasing', + 'variance': 'variance', + 'threshold': 'threshold', + 'clear_coat_IOR_change': 'clear coat IOR change', + 'blending': 'blending', + 'mask_threshold': 'mask threshold', + 'color_write': 'color write', + 'depth_write': 'depth write', + 'depth_test': 'depth test', + 'double_sided': 'double sided', + 'culling': 'culling', + 'transparency': 'transparency', +}; + +// CSS constants +const FOREGROUND_COLOR = '#fafafa'; +const INACTIVE_COLOR = '#9a9a9a'; +const DARKER_INACTIVE_COLOR = '#6f6f6f'; +const LIGHTER_INACTIVE_COLOR = '#d9d9d9'; +const UNSELECTED_COLOR = '#dfdfdf'; +const BACKGROUND_COLOR = '#5362e5'; +const HOVER_BACKGROUND_COLOR = '#b3c2ff'; +const CODE_VIEWER_BOTTOM_ROW_HEIGHT = 60; +const REGULAR_FONT_SIZE = 12; + +// Set up the Monaco editor. See also CodeViewer +const kMonacoBaseUrl = 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.25.2/min/'; +require.config({ + paths: { "vs": `${kMonacoBaseUrl}vs` }, + 'vs/css': { disabled: true }, +}); +window.MonacoEnvironment = { + getWorkerUrl: function() { + return `data:text/javascript;charset=utf-8,${encodeURIComponent(` + self.MonacoEnvironment = { + baseUrl: '${kMonacoBaseUrl}' + }; + importScripts('${kMonacoBaseUrl}vs/base/worker/workerMain.js');` + )}`; + } +}; + +const _validDict = (obj) => { + return obj && Object.keys(obj).length > 0; +} + +const _isMatInfoMode = (database) => { + return Object.keys(database).length == 1; +} + +class Button extends LitElement { + static get styles() { + return css` + :host { + display: flex; + } + .main { + border: solid 2px ${unsafeCSS(BACKGROUND_COLOR)}; + border-radius: 5px; + font-size: 16px; + display: flex; + align-items: center; + justify-content: center; + height: 30px; + padding: 1px 8px; + color: ${unsafeCSS(BACKGROUND_COLOR)}; + margin: 5px 10px; + width: 100px; + } + .main:hover { + background: ${unsafeCSS(HOVER_BACKGROUND_COLOR)}; + } + .enabled { + cursor: pointer; + } + .disabled:hover { + background: ${unsafeCSS(LIGHTER_INACTIVE_COLOR)}; + } + .disabled { + color: ${unsafeCSS(INACTIVE_COLOR)}; + border: solid 2px ${unsafeCSS(INACTIVE_COLOR)}; + background: ${unsafeCSS(LIGHTER_INACTIVE_COLOR)}; + } + `; + } + static get properties() { + return { + label: {type: String, attribute: 'label'}, + enabled: {type: Boolean, attribute: 'enabled'}, + } + } + + constructor() { + super(); + this.label = ''; + this.enabled = false; + } + + _onClick(ev) { + this.dispatchEvent(new CustomEvent('button-clicked', {bubbles: true, composed: true})); + } + + render() { + let divClass = 'main'; + if (this.enabled) { + divClass += ' enabled'; + } else { + divClass += ' disabled'; + } + return html` +
    + ${this.label} +
    + `; + } +} +customElements.define("custom-button", Button); + +class CodeViewer extends LitElement { + static get styles() { + return css` + :host { + background: white; + width:100%; + padding-top: 10px; + display: flex; + flex-direction: column; + } + #editor { + width: 100%; + height: 100%; + } + #bottom-row { + width: 100%; + display: flex; + height: ${unsafeCSS(CODE_VIEWER_BOTTOM_ROW_HEIGHT)}px; + flex-direction: column; + align-items: flex-end; + justify-content: center; + border-top: solid 1px ${unsafeCSS(BACKGROUND_COLOR)}; + } + .hide { + display: none; + } + .reminder { + height: 100%; + width: 100%; + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + font-size: 20px; + color: ${unsafeCSS(BACKGROUND_COLOR)}; + } + .stateText { + color: ${unsafeCSS(INACTIVE_COLOR)}; + padding: 0 10px; + } + `; + } + + static get properties() { + return { + connected: {type: Boolean, attribute: 'connected'}, + code: {type: String, state: true}, + active: {type: Boolean, attribute: 'active'}, + modified: {type: Boolean, attribute: 'modified'}, + expectedWidth: {type: Number, attribute: 'expected-width'}, + expectedHeight: {type: Number, attribute: 'expected-height'}, + } + } + + get _editorDiv() { + return this.renderRoot.querySelector('#editor'); + } + + firstUpdated() { + const innerStyle = document.createElement('style'); + innerStyle.innerText = `@import "${kMonacoBaseUrl}/vs/editor/editor.main.css";`; + this.renderRoot.appendChild(innerStyle); + + require(["vs/editor/editor.main"], () => { + this.editor = monaco.editor.create(this._editorDiv, { + language: "cpp", + scrollBeyondLastLine: false, + readOnly: false, + minimap: { enabled: false }, + automaticLayout: true, + + // Workaround see https://github.com/microsoft/monaco-editor/issues/3217 + fontLigatures: '', + }); + const KeyMod = monaco.KeyMod, KeyCode = monaco.KeyCode; + this.editor.onDidChangeModelContent(this._onEdit.bind(this)); + this.editor.addCommand(KeyMod.CtrlCmd | KeyCode.KEY_S, this._rebuild.bind(this)); + + // It might be that the code is available before the editor has been created. + if (this.code && this.code.length > 0) { + this.editor.setValue(this.code); + } + }); + } + + _onEdit(edit) { + // If the edit is the loading of the entire code, we ignore the edit. + if (edit.changes[0].text.length == this.code.length) { + return; + } + this.dispatchEvent(new CustomEvent( + 'shader-edited', + {detail: this.editor.getValue(), bubbles: true, composed: true} + )); + } + + _rebuild() { + if (!this.active || !this.modified) { + console.log('Called rebuild while variant is inactive or unmodified'); + return; + } + this.dispatchEvent(new CustomEvent( + 'rebuild-shader', + {detail: this.editor.getValue(), bubbles: true, composed: true} + )); + } + + updated(props) { + if (props.has('code') && this.code.length > 0) { + // Note that the prop might have been updated before the editor is available. + if (this.editor) { + this.editor.setValue(this.code); + } + } + if ((props.has('expectedWidth') || props.has('expectedHeight')) && + (this.expectedWidth > 0 && (this.expectedHeight - CODE_VIEWER_BOTTOM_ROW_HEIGHT) > 0)) { + const actualWidth = Math.floor(this.expectedWidth); + const actualHeight = (Math.floor(this.expectedHeight) - CODE_VIEWER_BOTTOM_ROW_HEIGHT); + this._editorDiv.style.width = actualWidth + 'px'; + this._editorDiv.style.height = actualHeight + 'px'; + } + } + + constructor() { + super(); + this.code = ''; + this.active = false; + this.modified = false; + this.addEventListener('button-clicked', this._rebuild.bind(this)); + this.expectedWidth = 0; + this.expectedHeight = 0; + } + + render() { + let divClass = ''; + let reminder = null; + if (this.code.length == 0) { + divClass += ' hide'; + reminder = (() => html`
    Please select a shader in the side panel.
    `)(); + } + let stateText = null; + if (!this.connected) { + stateText = 'disconnected'; + } else if (this.code.length > 0 && !this.active) { + stateText = 'inactive variant/shader'; + } else if (this.code.length > 0 &&!this.modified) { + stateText = 'source unmodified'; + } + + const stateDiv = stateText ? (() => html` +
    ${stateText}
    + `)(): null; + + return html` +
    + ${reminder ?? nothing} +
    +
    + ${stateDiv ?? nothing} + + +
    +
    + `; + } +} +customElements.define("code-viewer", CodeViewer); + +class MenuSection extends LitElement { + static get properties() { + return { + showing: {type: Boolean, state: true}, + title: {type: String, attribute: 'title'}, + }; + } + + static get styles() { + return css` + :host { + font-size: ${unsafeCSS(REGULAR_FONT_SIZE)}px; + color: ${unsafeCSS(UNSELECTED_COLOR)}; + } + .section-title { + font-size: 16px; + color: ${unsafeCSS(UNSELECTED_COLOR)}; + cursor: pointer; + } + .container { + margin-bottom: 20px; + } + hr { + display: block; + height: 1px; + border: 0px; + border-top: 1px solid ${unsafeCSS(UNSELECTED_COLOR)}; + padding: 0; + width: 100%; + margin: 3px 0 8px 0; + } + .expander { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + } + `; + } + + _showClick() { + this.showing = !this.showing; + } + + constructor() { + super(); + this.showing = true; + } + + render() { + const expandedIcon = this.showing ? '-' : '+'; + const slot = (() => html``)(); + return html` +
    +
    + ${this.title} ${expandedIcon} +
    +
    + ${this.showing ? slot : []} +
    + `; + } +} +customElements.define('menu-section', MenuSection); + +class MaterialInfo extends LitElement { + static get properties() { + return { + info: {type: Object, state: true}, + }; + } + + static get styles() { + return css` + :host { + font-size: ${unsafeCSS(REGULAR_FONT_SIZE)}px; + } + `; + } + + constructor() { + super(); + this.info = null; + } + + _hasInfo() { + return this.info && Object.keys(this.info).length > 0; + } + + render() { + let infoDivs = []; + if (this._hasInfo()) { + if (this.info.shading && this.info.shading.material_domain === 'surface') { + infoDivs = infoDivs.concat( + Object.keys(this.info.shading) + .filter((propKey) => (propKey in MATERIAL_INFO_KEY_TO_STRING)) + .map((propKey) => html` +
    + ${MATERIAL_INFO_KEY_TO_STRING[propKey]} = ${this.info.shading[propKey]} +
    + `) + ); + } + if (this.info.raster) { + infoDivs = infoDivs.concat( + Object.keys(this.info.raster) + .filter((propKey) => (propKey in MATERIAL_INFO_KEY_TO_STRING)) + .map((propKey) => html` +
    + ${MATERIAL_INFO_KEY_TO_STRING[propKey]} = ${this.info.raster[propKey]} +
    + `) + ); + } + } + const shouldHide = infoDivs.length == 0; + if (infoDivs.length > 0) { + return html` + + ${infoDivs} + + `; + } + return html``; + } +} +customElements.define('material-info', MaterialInfo); + +class AdvancedOptions extends LitElement { + static get properties() { + return { + currentBackend: {type: String, attribute: 'current-backend'}, + hideInactiveVariants: {type: Boolean, attribute: 'hide-inactive-variants'}, + availableBackends: {type: Array, state: true}, + }; + } + + static get styles() { + return css` + :host { + font-size: ${unsafeCSS(REGULAR_FONT_SIZE)}px; + } + .option { + border: 1px solid ${unsafeCSS(UNSELECTED_COLOR)}; + border-radius: 5px; + padding: 4px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + } + .borderless { + border: 1px solid rgba(0,0,0,0); + } + label { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + margin-right: 5px; + } + label input { + margin: 0 4px 0 0; + } + form { + display: flex; + } + .option-heading { + margin-bottom: 5px; + } + + /* Below is a custom checkbox */ + input[type="checkbox"] { + -webkit-appearance: none; + appearance: none; + background-color: var(--form-background); + margin-right: 5px; + font: inherit; + width: 1.15em; + height: 1.15em; + border: 0.15em solid ${unsafeCSS(UNSELECTED_COLOR)}; + border-radius: 0.15em; + display: grid; + place-content: center; + } + input[type="checkbox"]::before { + content: ""; + width: 0.65em; + height: 0.65em; + clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%); + transform: scale(0); + transform-origin: bottom left; + box-shadow: inset 1em 1em var(--form-control-color); + /* Windows High Contrast Mode */ + background-color: ${unsafeCSS(FOREGROUND_COLOR)}; + } + input[type="checkbox"]:checked::before { + transform: scale(1); + } + `; + } + + get _backendOptionForm() { + return this.renderRoot.querySelector('#backend-option-form'); + } + + updated(props) { + if (props.has('currentBackend') || props.has('availableBackends')) { + // Clear the radio button selections. The correct option will be selected + // in _backendOption(). + if (this._backendOptionForm) { + this._backendOptionForm.reset(); + } + } + } + + _backendOption() { + if (this.availableBackends.length == 0) { + return null; + } + + const onChange = (ev) => { + const backend = ev.currentTarget.getAttribute('name'); + this.dispatchEvent( + new CustomEvent( + 'option-backend', + {detail: backend, bubbles: true, composed: true})); + } + const div = this.availableBackends.map((backend) => { + const selected = backend == this.currentBackend; + return html` + + `; + }); + + return html` +
    +
    Current Backend
    +
    + ${div} +
    +
    + `; + } + + _hideInactiveVariantsOption() { + const onChange = (ev) => { + this.dispatchEvent( + new CustomEvent( + 'option-hide-inactive-variants', + {detail: null, bubbles: true, composed: true})); + } + return html` +
    + +
    + + Hide Inactive Variants +
    +
    + `; + } + + constructor() { + super(); + this.availableBackends = []; + } + + render() { + return html` + + ${this._hideInactiveVariantsOption() ?? nothing} + ${this._backendOption() ?? nothing} + + `; + } +} +customElements.define('advanced-options', AdvancedOptions); + + +class MaterialSidePanel extends LitElement { + // Setting the style in render() has poor performance implications. We use it simply to avoid + // having another container descending from the root to host the background color. + dynamicStyle() { + return ` + :host { + background: ${this.connected ? BACKGROUND_COLOR : DARKER_INACTIVE_COLOR}; + width:100%; + max-width: 250px; + min-width: 180px; + padding: 10px 20px; + overflow-y: auto; + } + .title { + color: white; + width: 100%; + text-align: center; + margin: 0 0 10px 0; + font-size: 20px; + } + .materials { + display: flex; + flex-direction: column; + margin-bottom: 20px; + font-size: ${REGULAR_FONT_SIZE}px; + color: ${UNSELECTED_COLOR}; + } + .material_variant_language:hover { + text-decoration: underline; + } + .material_variant_language { + cursor: pointer; + } + .selected { + font-weight: bolder; + color: ${FOREGROUND_COLOR}; + } + .inactive { + color: ${INACTIVE_COLOR}; + } + .variant-list { + padding-left: 20px; + } + .language { + margin: 0 8px 0 0; + } + .languages { + padding-left: 20px; + flex-direction: row; + display: flex; + } + `; + } + + static get properties() { + return { + connected: {type: Boolean, attribute: 'connected'}, + currentMaterial: {type: String, attribute: 'current-material'}, + currentShaderIndex: {type: Number, attribute: 'current-shader-index'}, + currentBackend: {type: String, attribute: 'current-backend'}, + currentLanguage: {type: String, attribute: 'current-language'}, + hideInactiveVariants: {type: Boolean, attribute: 'hide-inactive-variants'}, + + database: {type: Object, state: true}, + materials: {type: Array, state: true}, + activeShaders: {type: Object, state: true}, + variants: {type: Array, state: true}, + } + } + + get _materialInfo() { + return this.renderRoot.querySelector('#material-info'); + } + + get _advancedOptions() { + return this.renderRoot.querySelector('#advanced-options'); + } + + constructor() { + super(); + this.connected = false; + this.materials = []; + this.database = {}; + this.activeShaders = {}; + this.variants = []; + } + + updated(props) { + if (props.has('database')) { + const items = []; + + // Names need not be unique, so we display a numeric suffix for non-unique names. + // To achieve stable ordering of anonymous materials, we first sort by matid. + const labels = new Set(); + const matids = Object.keys(this.database).sort(); + const duplicatedLabels = {}; + for (const matid of matids) { + const name = this.database[matid].name || kUntitledPlaceholder; + if (labels.has(name)) { + duplicatedLabels[name] = 0; + } else { + labels.add(name); + } + } + + this.materials = matids.map((matid) => { + const material = this.database[matid]; + let name = material.name || kUntitledPlaceholder; + if (name in duplicatedLabels) { + const index = duplicatedLabels[name]; + duplicatedLabels[name] = index + 1; + name = `${name} (${index})`; + } + return { + matid: matid, + name: name, + domain: material.shading.material_domain === "surface" ? "surface" : "postpro", + active: material.active, + }; + }); + } + if (props.has('currentMaterial')) { + if (this.currentBackend && this.database && this.currentMaterial) { + const material = this.database[this.currentMaterial]; + const activeVariants = _validDict(this.activeShaders) ? this.activeShaders[this.currentMaterial].variants : []; + const materialShaders = material[this.currentBackend]; + let variants = []; + for (const [index, shader] of materialShaders.entries()) { + const active = activeVariants.indexOf(shader.variant) >= 0; + variants.push({ + active, + shader, + }); + } + this.variants = variants; + } + + if (this.currentMaterial && this.database) { + const material = this.database[this.currentMaterial]; + this._materialInfo.info = material; + + // The matinfo usecase + if (_isMatInfoMode(this.database)) { + this._advancedOptions.availableBackends = BACKENDS.filter((backend) => !!material[backend]); + } + } + } + } + + _handleMaterialClick(matid, ev) { + this.dispatchEvent(new CustomEvent('select-material', {detail: matid, bubbles: true, composed: true})); + } + + _handleVariantClick(shaderIndex, ev) { + this.dispatchEvent(new CustomEvent('select-variant', {detail: shaderIndex, bubbles: true, composed: true})); + } + + _handleLanguageClick(lang, ev) { + this.dispatchEvent(new CustomEvent('select-language', {detail: lang, bubbles: true, composed: true})); + } + + _buildLanguagesDiv(isActive) { + const languages = LANGUAGE_CHOICES[this.currentBackend]; + if (!languages || languages.length == 1) { + return null; + } + const languagesDiv = languages.map((lang) => { + const isLanguageSelected = lang === this.currentLanguage; + let divClass = + 'material_variant_language language' + + (isLanguageSelected ? ' selected' : '') + + (!isActive ? ' inactive' : ''); + const onClickLanguage = this._handleLanguageClick.bind(this, lang); + lang = (isLanguageSelected ? '● ' : '') + lang; + return html` +
    + ${lang} +
    + `; + }); + return html`
    ${languagesDiv}
    `; + } + + _buildShaderDiv(showAllShaders) { + if (!this.variants) { + return null; + } + let variants = + this.variants + .sort((a, b) => { + // Place the active variants up top. + if (a.active && !b.active) return -1; + if (b.active && !a.active) return 1; + return 0; + }) + .filter((variant) => (!this.hideInactiveVariants || variant.shader.active)) + .map((variant) => { + let divClass = 'material_variant_language'; + const shaderIndex = +variant.shader.index; + const isVariantSelected = this.currentShaderIndex === shaderIndex; + const isActive = variant.shader.active; + if (isVariantSelected) { + divClass += ' selected'; + } + if (!isActive) { + divClass += ' inactive'; + } + const onClickVariant = this._handleVariantClick.bind(this, shaderIndex); + // Handle the case where variantString is empty (default variant?) + let vstring = (variant.shader.variantString || '').trim(); + if (vstring.length > 0) { + vstring = `[${vstring}]`; + } + let languagesDiv = isVariantSelected ? this._buildLanguagesDiv(isActive) : null; + const stage = (isVariantSelected ? '● ' : '') + variant.shader.pipelineStage; + return html` +
    +
    ${stage} ${vstring}
    +
    + ${languagesDiv ?? nothing} + ` + }); + return html`
    ${variants}
    `; + } + + render() { + const sections = (title, domain) => { + const mats = this.materials + .filter((m) => m.domain == domain) + .filter((mat) => { + const material = this.database[mat.matid]; + return !this.hideInactiveVariants || material.active; + }) + .map((mat) => { + const material = this.database[mat.matid]; + const onClick = this._handleMaterialClick.bind(this, mat.matid); + let divClass = 'material_variant_language'; + let shaderDiv = null; + const isMaterialSelected = mat.matid === this.currentMaterial; + if (isMaterialSelected) { + divClass += ' selected'; + // If we are looking at an inactive material, show all shaders regardless. + const showAllShaders = !material.active; + shaderDiv = this._buildShaderDiv(showAllShaders); + } + if (!material.active) { + divClass += " inactive"; + } + const matName = (isMaterialSelected ? '● ' : '') + mat.name; + return html` +
    + ${matName} +
    + ${shaderDiv ?? nothing} + `; + }); + if (mats.length > 0) { + return html`${mats}`; + } + return null; + }; + const advancedOptions = + (() => html` + + `)(); + + return html` + +
    +
    matdbg
    + ${sections("Surface", "surface") ?? nothing} + ${sections("Post-processing", "postpro") ?? nothing} + + ${advancedOptions ?? nothing} +
    + `; + } + +} +customElements.define("material-sidepanel", MaterialSidePanel); + +class MatdbgViewer extends LitElement { + static get styles() { + return css` + :host { + height: 100%; + width: 100%; + display: flex; + } + `; + } + + get _sidepanel() { + return this.renderRoot.querySelector('#sidepanel'); + } + + get _codeviewer() { + return this.renderRoot.querySelector('#code-viewer'); + } + + async init() { + const isConnected = () => this.connected; + statusLoop( + isConnected, + async (status, data) => { + this.connected = status == STATUS_CONNECTED || status == STATUS_MATERIAL_UPDATED; + + if (status == STATUS_MATERIAL_UPDATED) { + let matInfo = await fetchMaterial(matid); + this.database[matInfo.matid] = matInfo; + this.database = this.database; + } + } + ); + + activeShadersLoop( + isConnected, + (activeShaders) => { + this.activeShaders = activeShaders; + } + ); + + let materials = await fetchMaterials(); + this.database = materials; + + // This is the user preferences stored in localStorage + let hideInactiveVariantsVal = localStorage.getItem('option-hide-inactive-variants'); + if (hideInactiveVariantsVal != null) { + this.hideInactiveVariants = hideInactiveVariantsVal == 'true'; + } + } + + _getShader() { + if (!this.currentLanguage || this.currentShaderIndex < 0 || !this.currentBackend) { + return null; + } + const material = (this.database && this.currentMaterial) ? this.database[this.currentMaterial] : null; + if (!material) { + return null; + } + const shaders = material[this.currentBackend]; + return shaders[this.currentShaderIndex]; + } + + _onResize() { + const rect = this._sidepanel.getBoundingClientRect(); + this.codeViewerExpectedWidth = window.innerWidth - rect.width - 1; + this.codeViewerExpectedHeight = window.innerHeight; + } + + firstUpdated() { + this._onResize(); + } + + constructor() { + super(); + this.connected = false; + this.activeShaders = {}; + this.database = {}; + this.currentShaderIndex = -1; + this.currentMaterial = null; + this.currentLanguage = null; + this.currentBackend = null; + this.hideInactiveVariants = false; + this.init(); + + this.addEventListener('select-material', + (ev) => { + this.currentMaterial = ev.detail; + } + ); + this.addEventListener('select-variant', + (ev) => { + this.currentShaderIndex = ev.detail; + } + ); + this.addEventListener('select-language', + (ev) => { + this.currentLanguage = ev.detail; + } + ); + + this.addEventListener('rebuild-shader', + (ev) => { + const shader = this._getShader(); + if (!shader) { + return + } + rebuildMaterial( + this.currentMaterial, this.currentBackend, this.currentShaderIndex, ev.detail); + + shader.modified = false; + // Trigger an update + this.database = this.database; + } + ); + + this.addEventListener('shader-edited', + (ev) => { + const shader = this._getShader(); + if (shader) { + shader.modified = true; + // Trigger an update + this.database = this.database; + } + } + ); + + this.addEventListener('option-backend', + (ev) => { + this.currentBackend = ev.detail; + } + ); + + this.addEventListener('option-hide-inactive-variants', + (ev) => { + this.hideInactiveVariants = !this.hideInactiveVariants; + localStorage.setItem('option-hide-inactive-variants', "" + this.hideInactiveVariants); + } + ); + addEventListener('resize', this._onResize.bind(this)); + } + + static get properties() { + return { + connected: {type: Boolean, state: true}, + database: {type: Object, state: true}, + activeShaders: {type: Object, state: true}, + currentLanguage: {type: String, state: true}, + currentMaterial: {type: String, state: true}, + // Each material has a list of variants compiled for it, this index tracks a position in the list. + currentShaderIndex: {type: Number, state: true}, + currentBackend: {type: String, state: true}, + codeViewerExpectedWidth: {type: Number, state: true}, + codeViewerExpectedHeight: {type: Number, state: true}, + + hideInactiveVariants: {type: Boolean, state: true}, + } + } + + updated(props) { + // Set a language if there hasn't been one set. + if (props.has('currentBackend') && this.currentBackend) { + const choices = LANGUAGE_CHOICES[this.currentBackend]; + if (choices.indexOf(this.currentLanguage) < 0) { + this.currentLanguage = choices[0]; + } + } + if (props.has('currentMaterial')) { + // Try to find a default shader index + if ((this.currentMaterial in this.activeShaders) && this.currentBackend) { + const material = this.database[this.currentMaterial]; + const activeVariants = this.activeShaders[this.currentMaterial].variants; + const materialShaders = material[this.currentBackend]; + for (let shader in materialShaders) { + let ind = activeVariants.indexOf(+shader); + if (ind >= 0) { + this.currentShaderIndex = +shader; + break; + } + } + } else if (this.currentMaterial) { + const material = this.database[this.currentMaterial]; + // Just pick the first variant in this materials list. + this.currentShaderIndex = 0; + } + } + if ((props.has('currentMaterial') || props.has('currentBackend') || + props.has('currentShaderIndex') || props.has('currentLanguage')) && + (this.currentMaterial && this.currentBackend && this.currentShaderIndex >= 0&& + this.currentLanguage)) { + (async () => { + this._codeviewer.code = await fetchShaderCode( + this.currentMaterial, this.currentBackend, this.currentLanguage, + this.currentShaderIndex); + const shader = this._getShader(); + if (shader) { + shader.modified = false; + this.database = this.database; + } + + // Size of the editor will be adjusted due to the code being loaded, we try to + // fit the editor again by calling the resize signal. + setTimeout(this._onResize.bind(this), 700); + })(); + } + if (props.has('activeShaders') || props.has('database')) { + // The only active materials are the ones with active variants. + Object.values(this.database).forEach((material) => { + material.active = false; + }); + for (matid in this.activeShaders) { + if (!this.database[matid]) { + continue; + } + let material = this.database[matid]; + const backend = this.activeShaders[matid].backend; + const variants = this.activeShaders[matid].variants; + for (let shader of material[backend]) { + shader.active = variants.indexOf(shader.variant) > -1; + material.active = material.active || shader.active; + } + } + if (_validDict(this.activeShaders)) { + let backends = {}; + for (let matid in this.activeShaders) { + const backend = this.activeShaders[matid].backend; + if (backend in backends) { + backends[backend] = backends[backend] + 1; + } else { + backends[backend] = 1; + } + } + let backendList = Object.keys(backends); + if (backendList.length > 0) { + this.currentBackend = backendList[0]; + } + } else if (!this.currentBackend) { + // Make a guess on the backend if one wasn't from activeShaders. + this.currentBackend = guessBackend(); + } + + this._sidepanel.database = this.database; + this._sidepanel.activeShaders = this.activeShaders; + } + if (props.has('connected') && this.connected) { + (async () => { + for (const matId of await fetchMatIds()) { + const matInfo = await fetchMaterial(matid); + this.database[matInfo.matid] = matInfo; + this.database = this.database; + } + + // In the `matinfo -w` usecase, we assume the current material to be the only + // material available in the database. + if (_isMatInfoMode(this.database)) { + this.currentMaterial = Object.keys(this.database)[0]; + } + })(); + } + } + + render() { + const shader = this._getShader(); + return html` + + + + + `; + } +} +customElements.define("matdbg-viewer", MatdbgViewer); diff --git a/libs/matdbg/web/index.html b/libs/matdbg/web/index.html index 9474348e0c8..3bf2971cad8 100644 --- a/libs/matdbg/web/index.html +++ b/libs/matdbg/web/index.html @@ -1,96 +1,28 @@ - + Filament Debugger - - - - - - -
    matdbg
    - -
    - -
    -
    -
    - -
     
    - - - - - - - - - + + + + + + + + + + + diff --git a/libs/matdbg/web/script.js b/libs/matdbg/web/script.js deleted file mode 100644 index 4c22e94dc01..00000000000 --- a/libs/matdbg/web/script.js +++ /dev/null @@ -1,499 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - -*/ -const kMonacoBaseUrl = 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.25.2/min/'; -const kUntitledPlaceholder = "untitled"; - -const materialList = document.getElementById("material-list"); -const materialDetail = document.getElementById("material-detail"); -const header = document.querySelector("header"); -const footer = document.querySelector("footer"); -const shaderSource = document.getElementById("shader-source"); -const matDetailTemplate = document.getElementById("material-detail-template"); -const matListTemplate = document.getElementById("material-list-template"); - -const gMaterialDatabase = {}; - -let gSocket = null; -let gEditor = null; -let gCurrentMaterial = "00000000"; -let gCurrentLanguage = "glsl"; -let gCurrentShader = { matid: "00000000", glindex: 0 }; -let gCurrentSocketId = 0; -let gEditorIsLoading = false; - -require.config({ paths: { "vs": `${kMonacoBaseUrl}vs` }}); - -window.MonacoEnvironment = { - getWorkerUrl: function() { - return `data:text/javascript;charset=utf-8,${encodeURIComponent(` - self.MonacoEnvironment = { - baseUrl: '${kMonacoBaseUrl}' - }; - importScripts('${kMonacoBaseUrl}vs/base/worker/workerMain.js');` - )}`; - } -}; - -function getShaderAPI(selection) { - if (!selection) { - selection = gCurrentShader; - } - if ("glindex" in selection) return "opengl"; - if ("vkindex" in selection) return "vulkan"; - if ("metalindex" in selection) return "metal"; - return "error"; -} - -function rebuildMaterial() { - let api = 0, index = -1; - if (gCurrentLanguage === "spirv") { - console.error("SPIR-V editing is not supported."); - return; - } - switch (getShaderAPI()) { - case "opengl": api = 1; index = gCurrentShader.glindex; break; - case "vulkan": api = 2; index = gCurrentShader.vkindex; break; - case "metal": api = 3; index = gCurrentShader.metalindex; break; - } - const editedText = getShaderRecord(gCurrentShader)[gCurrentLanguage]; - const byteCount = new Blob([editedText]).size; - gSocket.send(`EDIT ${gCurrentShader.matid} ${api} ${index} ${byteCount} ${editedText}`); -} - -document.querySelector("body").addEventListener("click", (evt) => { - const anchor = evt.target.closest("a"); - if (!anchor) { - return; - } - - // Handle selection of a material. - if (anchor.classList.contains("material")) { - selectMaterial(anchor.dataset.matid, true); - return; - } - - // Handle selection of a shader. - if (anchor.classList.contains("shader")) { - selectShader(anchor.dataset); - return; - } - - // Handle a rebuild. - if (anchor.classList.contains("rebuild")) { - rebuildMaterial(); - return; - } - - // Handle language selection. - for (const lang of "glsl spirv msl".split(" ")) { - if (anchor.classList.contains(lang)) { - gCurrentLanguage = lang; - selectShader(gCurrentShader); - return; - } - } -}); - -// Handle Ctrl+Arrow for fast keyboard navigation between shader variants and materials. Either the -// materialStep or shaderStep argument can be non-zero (not both) and they must be -1, 0, or +1. -// TODO: this function could be vastly simplified by changing the format of the shader selector. -function selectNextShader(materialStep, shaderStep) { - if (materialStep !== 0) { - const matids = getDisplayedMaterials().map(m => m.matid).filter(m => m); - const currentIndex = matids.indexOf(gCurrentMaterial); - const nextIndex = currentIndex + materialStep; - if (nextIndex >= 0 && nextIndex < matids.length) { - selectMaterial(matids[nextIndex], true); - } - return; - } - const material = gMaterialDatabase[gCurrentMaterial]; - const variants = []; - let currentIndex = 0; - for (const [index, shader] of material.opengl.entries()) { - if (index === gCurrentShader.glindex) currentIndex = variants.length; - variants.push({ matid, glindex: index }); - } - for (const [index, shader] of material.vulkan.entries()) { - if (index === gCurrentShader.vkindex) currentIndex = variants.length; - variants.push({ matid, vkindex: index }); - } - for (const [index, shader] of material.metal.entries()) { - if (index === gCurrentShader.metalindex) currentIndex = variants.length; - variants.push({ matid, metalindex: index }); - } - const nextIndex = currentIndex + shaderStep; - if (nextIndex >= 0 && nextIndex < variants.length) { - selectShader(variants[nextIndex]); - } -} - -function fetchMaterial(matid) { - fetch(`api/material?matid=${matid}`).then(function(response) { - return response.json(); - }).then(function(matInfo) { - if (matid in gMaterialDatabase) { - return; - } - matInfo.matid = matid; - gMaterialDatabase[matid] = matInfo; - renderMaterialList(); - }); -} - -function queryActiveShaders() { - if (!gSocket) { - for (matid in gMaterialDatabase) { - const material = gMaterialDatabase[matid]; - material.active = false; - for (const shader of material.opengl) shader.active = false; - for (const shader of material.vulkan) shader.active = false; - for (const shader of material.metal) shader.active = false; - } - renderMaterialList(); - renderMaterialDetail(); - return; - } - fetch("api/active").then(function(response) { - return response.json(); - }).then(function(activeMaterials) { - // The only active materials are the ones with active variants. - for (matid in gMaterialDatabase) { - const material = gMaterialDatabase[matid]; - material.active = false; - } - for (matid in activeMaterials) { - const material = gMaterialDatabase[matid]; - const activeBackend = activeMaterials[matid][0]; - const activeShaders = activeMaterials[matid].slice(1); - for (const shader of material[activeBackend]) { - shader.active = activeShaders.indexOf(shader.variant) > -1; - material.active = material.active || shader.active; - } - } - renderMaterialList(); - renderMaterialDetail(); - }) - .catch(error => { - // This can occur if the JSON is invalid. - console.error(error); - }); -} - -function startSocket() { - const url = new URL(document.URL) - const ws = new WebSocket(`ws://${url.host}`); - - // When a new server has come online, ask it what materials it has. - ws.addEventListener("open", () => { - footer.innerText = `connection ${gCurrentSocketId}`; - gCurrentSocketId++; - - fetch("api/matids").then(function(response) { - return response.json(); - }).then(function(matInfo) { - for (matid of matInfo) { - if (!(matid in gMaterialDatabase)) { - fetchMaterial(matid); - } - } - }); - }); - - ws.addEventListener("close", (e) => { - footer.innerText = "no connection"; - gSocket = null; - setTimeout(() => startSocket(), 3000); - }); - - ws.addEventListener("message", event => { - const matid = event.data; - fetchMaterial(matid); - }); - - gSocket = ws; -} - -function fetchMaterials() { - fetch("api/materials").then(function(response) { - return response.json(); - }).then(function(matJson) { - for (const matInfo of matJson) { - if (matInfo.matid in gMaterialDatabase) { - continue; - } - gMaterialDatabase[matInfo.matid] = matInfo; - } - selectMaterial(matJson[0].matid, true); - }); -} - -function fetchShader(selection, matinfo, onDone) { - let query, target, index; - switch (getShaderAPI(selection)) { - case "opengl": - index = parseInt(selection.glindex); - query = `type=${gCurrentLanguage}&glindex=${index}`; - target = matinfo.opengl[index]; - break; - case "vulkan": - index = parseInt(selection.vkindex); - query = `type=${gCurrentLanguage}&vkindex=${index}`; - target = matinfo.vulkan[index]; - break; - case "metal": - index = parseInt(selection.metalindex); - query = `type=${gCurrentLanguage}&metalindex=${index}`; - target = matinfo.metal[index]; - break; - } - fetch(`api/shader?matid=${matinfo.matid}&${query}`).then(function(response) { - return response.text(); - }).then(function(shaderText) { - target[gCurrentLanguage] = shaderText; - onDone(); - }); -} - -function getDisplayedMaterials() { - const items = []; - - // Names need not be unique, so we display a numeric suffix for non-unique names. - // To achieve stable ordering of anonymous materials, we first sort by matid. - const labels = new Set(); - const matids = Object.keys(gMaterialDatabase).sort(); - const duplicatedLabels = {}; - for (const matid of matids) { - const name = gMaterialDatabase[matid].name || kUntitledPlaceholder; - if (labels.has(name)) { - duplicatedLabels[name] = 0; - } else { - labels.add(name); - } - } - - // Build a list of objects to pass into the template string. - for (const matid of matids) { - const item = Object.assign({}, gMaterialDatabase[matid]); - item.classes = matid === gCurrentMaterial ? "current " : ""; - if (!item.active) { - item.classes += "inactive " - } - item.domain = item.shading.material_domain === "surface" ? "surface" : "postpro"; - item.is_material = true; - - const name = item.name || kUntitledPlaceholder; - if (name in duplicatedLabels) { - const index = duplicatedLabels[name]; - item.name = `${name} (${index})`; - duplicatedLabels[name] = index + 1; - } else { - item.name = name; - } - - items.push(item); - } - - // The template takes a flat list of items, so here we insert items for section headers using - // blank names, which causes them to sort to the top of their respective sections. - const sectionLabel = {"is_label": true, "name": ""}; - items.push(Object.assign({"label": "Surface materials", "domain": "surface"}, sectionLabel)); - items.push(Object.assign({"label": "PostProcess materials", "domain": "postpro"}, sectionLabel)); - - // Next, sort all materials and section headers. - items.sort((a, b) => { - if (a.domain > b.domain) return -1; - if (a.domain < b.domain) return +1; - if (a.name < b.name) return -1; - if (a.name > b.name) return +1; - return 0; - }); - return items; -} - -function renderMaterialList() { - const items = getDisplayedMaterials(); - materialList.innerHTML = Mustache.render(matListTemplate.innerHTML, { "item": items } ); -} - -function updateClassList(array, indexProperty, selectedIndex) { - for (let item of array) { - const current = parseInt(item[indexProperty]) === selectedIndex; - item.classes = current ? "current " : ""; - if (!item.active) { - item.classes += "inactive " - } - } -} - -function renderMaterialDetail() { - const mat = gMaterialDatabase[gCurrentMaterial]; - const ok = mat.matid === gCurrentShader.matid; - updateClassList(mat.opengl, "index", ok ? parseInt(gCurrentShader.glindex) : -1); - updateClassList(mat.vulkan, "index", ok ? parseInt(gCurrentShader.vkindex) : -1); - updateClassList(mat.metal, "index", ok ? parseInt(gCurrentShader.metalindex) : -1); - const item = Object.assign({}, mat); - if (item.shading.material_domain !== "surface") { - delete item.shading; - } - materialDetail.innerHTML = Mustache.render(matDetailTemplate.innerHTML, item); -} - -function getShaderRecord(selection) { - const mat = gMaterialDatabase[gCurrentMaterial]; - if (selection.glindex >= 0) return mat.opengl[parseInt(selection.glindex)]; - if (selection.vkindex >= 0) return mat.vulkan[parseInt(selection.vkindex)]; - if (selection.metalindex >= 0) return mat.metal[parseInt(selection.metalindex)]; - return null; -} - -function renderShaderStatus() { - const shader = getShaderRecord(gCurrentShader); - let statusString = ""; - if (shader) { - const glsl = "glsl " + (gCurrentLanguage === "glsl" ? "active" : ""); - const msl = "msl " + (gCurrentLanguage === "msl" ? "active" : ""); - const spirv = "spirv " + (gCurrentLanguage === "spirv" ? "active" : ""); - switch (getShaderAPI()) { - case "opengl": - statusString += `   [GLSL]`; - break; - case "metal": - statusString += `   [MSL]`; - break; - case "vulkan": - statusString += `   [GLSL]`; - statusString += `   [SPIRV]`; - break; - } - if (shader.modified && gCurrentLanguage !== "spirv") { - statusString += "   [rebuild]"; - } - if (!shader.active) { - statusString += "   selected variant is inactive "; - } - } - header.innerHTML = "matdbg" + statusString; -} - -function selectShader(selection) { - const shader = getShaderRecord(selection); - if (!shader) { - console.error("Shader not yet available.") - return; - } - - // Change the current language selection if necessary. - switch (getShaderAPI(selection)) { - case "opengl": - if (gCurrentLanguage != "glsl") { - gCurrentLanguage = "glsl"; - } - break; - case "vulkan": - if (gCurrentLanguage != "spirv" && gCurrentLanguage != "glsl") { - gCurrentLanguage = "spirv"; - } - break; - case "metal": - if (gCurrentLanguage != "msl") { - gCurrentLanguage = "msl"; - } - break; - } - - const showShaderSource = () => { - gCurrentShader = selection; - gCurrentShader.matid = gCurrentMaterial; - renderMaterialDetail(); - gEditorIsLoading = true; - gEditor.setValue(shader[gCurrentLanguage]); - gEditorIsLoading = false; - shaderSource.style.visibility = "visible"; - renderShaderStatus(); - }; - if (!shader[gCurrentLanguage]) { - const matInfo = gMaterialDatabase[gCurrentMaterial]; - fetchShader(selection, matInfo, showShaderSource); - } else { - showShaderSource(); - } -} - -function onEdit(changes) { - if (gEditorIsLoading) { - return; - } - const shader = getShaderRecord(gCurrentShader); - if (!shader) { - return; - } - if (!shader.modified) { - shader.modified = true; - renderShaderStatus(); - } - shader[gCurrentLanguage] = gEditor.getValue(); -} - -function selectMaterial(matid, selectFirstShader) { - gCurrentMaterial = matid; - renderMaterialList(); - renderMaterialDetail(); - if (selectFirstShader) { - const mat = gMaterialDatabase[gCurrentMaterial]; - const selection = { matid }; - if (mat.opengl.length > 0) selection.glindex = 0; - else if (mat.vulkan.length > 0) selection.vkindex = 0; - else if (mat.metal.length > 0) selection.metalindex = 0; - selectShader(selection); - } -} - -function init() { - require(["vs/editor/editor.main"], function () { - const KeyMod = monaco.KeyMod, KeyCode = monaco.KeyCode; - gEditor = monaco.editor.create(shaderSource, { - value: "", - language: "cpp", - scrollBeyondLastLine: false, - readOnly: false, - minimap: { enabled: false } - }); - gEditor.onDidChangeModelContent((e) => { onEdit(e.changes); }); - - gEditor.addCommand(KeyMod.CtrlCmd | KeyCode.KEY_S, () => rebuildMaterial()); - - gEditor.addCommand(KeyMod.Shift | KeyMod.WinCtrl | KeyCode.UpArrow, () => selectNextShader(-1, 0)); - gEditor.addCommand(KeyMod.Shift | KeyMod.WinCtrl | KeyCode.DownArrow, () => selectNextShader(+1, 0)); - gEditor.addCommand(KeyMod.Shift | KeyMod.WinCtrl | KeyCode.LeftArrow, () => selectNextShader(0, -1)); - gEditor.addCommand(KeyMod.Shift | KeyMod.WinCtrl | KeyCode.RightArrow, () => selectNextShader(0, +1)); - - fetchMaterials(); - }); - - Mustache.parse(matDetailTemplate.innerHTML); - Mustache.parse(matListTemplate.innerHTML); - - startSocket(); - - // Poll for active shaders once every second. - // Take care not to poll more frequently than the frame rate. Active variants are determined - // by the list of variants that were fetched between this query and the previous query. - setInterval(queryActiveShaders, 1000); -} - -init(); diff --git a/libs/matdbg/web/style.css b/libs/matdbg/web/style.css deleted file mode 100644 index 05e46e63640..00000000000 --- a/libs/matdbg/web/style.css +++ /dev/null @@ -1,110 +0,0 @@ -html, body, .viewport { - width: 100%; - height: 100%; - margin: 0; -} - -body { - font-family: 'Lexend Deca', sans-serif; - overflow: hidden; -} - -a, a:visited { - text-decoration: none; - color: #567; - cursor: pointer; -} - -a:hover, a.current { - font-weight: bold; - color: #07f; -} - -a.status_button { - color: #e4e682; -} - -a.status_button.active { - color: #fff; -} - -span.warning { - color: black; - background: orange; - font-size: small; -} - -a.inactive { - color: #aaa; -} - -a.inactive.current { - color: #5af; -} - -pre { - font-family: Menlo, Monaco, "Courier New", monospace; -} - -.vbox { - display: flex; - flex-direction: column; -} - -.scrollable { - position: relative; - overflow-y: scroll; -} - -.scrollable > * { - position: absolute; -} - -.squishy { - flex-grow: 1; -} - -.stretchy { - flex-grow: 1; -} - -.hbox { - display: flex; - flex-direction: row; -} - -.space-between { - justify-content: space-between; -} - -header, footer { - height: 26px; - background: cornflowerblue; - padding: 5px 0 0 5px; -} - -.main { - flex: 1; -} - -article { - flex: 5; - border-top: solid 2px; - border-bottom: solid 2px; - visibility: hidden; -} - -nav { - border: solid 2px; - font-size: 12px; - flex: 1; -} - -nav > *:first-child { - border-bottom: solid 2px; -} - -nav > * { - padding-left: 5px; - padding-right: 5px; -} diff --git a/libs/math/CMakeLists.txt b/libs/math/CMakeLists.txt index d7dab9108c0..838aa2d53d4 100644 --- a/libs/math/CMakeLists.txt +++ b/libs/math/CMakeLists.txt @@ -7,7 +7,7 @@ set(PUBLIC_HDR_DIR include) if (MSVC) set(OPTIMIZATION_FLAGS /fp:fast) else() - set(OPTIMIZATION_FLAGS -ffast-math -ffp-contract=fast) + set(OPTIMIZATION_FLAGS -ffast-math -fno-finite-math-only -ffp-contract=fast) endif() # ================================================================================================== diff --git a/libs/math/include/math/TQuatHelpers.h b/libs/math/include/math/TQuatHelpers.h index 81e06a096b4..b4787481bdb 100644 --- a/libs/math/include/math/TQuatHelpers.h +++ b/libs/math/include/math/TQuatHelpers.h @@ -25,10 +25,7 @@ #include #include -namespace filament { -namespace math { -namespace details { -// ------------------------------------------------------------------------------------- +namespace filament::math::details { /* * No user serviceable parts here. @@ -49,7 +46,7 @@ namespace details { template class QUATERNION, typename T> class TQuatProductOperators { public: - /* compound assignment from a another quaternion of the same size but different + /* compound assignment from another quaternion of the same size but different * element type. */ template @@ -61,7 +58,8 @@ class TQuatProductOperators { /* compound assignment products by a scalar */ - constexpr QUATERNION& operator*=(T v) { + template>> + constexpr QUATERNION& operator*=(U v) { QUATERNION& lhs = static_cast&>(*this); for (size_t i = 0; i < QUATERNION::size(); i++) { lhs[i] *= v; @@ -69,7 +67,8 @@ class TQuatProductOperators { return lhs; } - constexpr QUATERNION& operator/=(T v) { + template>> + constexpr QUATERNION& operator/=(U v) { QUATERNION& lhs = static_cast&>(*this); for (size_t i = 0; i < QUATERNION::size(); i++) { lhs[i] /= v; @@ -85,31 +84,32 @@ class TQuatProductOperators { * (the first one, BASE being known). */ - /* The operators below handle operation between quaternion of the same size + /* The operators below handle operation between quaternions of the same size * but of a different element type. */ - template - friend inline - constexpr QUATERNION MATH_PURE operator*(const QUATERNION& q, const QUATERNION& r) { + template + friend inline constexpr + QUATERNION> MATH_PURE operator*( + const QUATERNION& q, const QUATERNION& r) { // could be written as: // return QUATERNION( // q.w*r.w - dot(q.xyz, r.xyz), // q.w*r.xyz + r.w*q.xyz + cross(q.xyz, r.xyz)); - - return QUATERNION( + return { q.w * r.w - q.x * r.x - q.y * r.y - q.z * r.z, q.w * r.x + q.x * r.w + q.y * r.z - q.z * r.y, q.w * r.y - q.x * r.z + q.y * r.w + q.z * r.x, - q.w * r.z + q.x * r.y - q.y * r.x + q.z * r.w); + q.w * r.z + q.x * r.y - q.y * r.x + q.z * r.w + }; } - template - friend inline - constexpr TVec3 MATH_PURE operator*(const QUATERNION& q, const TVec3& v) { + template + friend inline constexpr + TVec3> MATH_PURE operator*(const QUATERNION& q, const TVec3& v) { // note: if q is known to be a unit quaternion, then this simplifies to: // TVec3 t = 2 * cross(q.xyz, v) // return v + (q.w * t) + cross(q.xyz, t) - return imaginary(q * QUATERNION(v, 0) * inverse(q)); + return imaginary(q * QUATERNION(v, 0) * inverse(q)); } @@ -125,22 +125,25 @@ class TQuatProductOperators { * q.w*r.z + q.x*r.y - q.y*r.x + q.z*r.w); * */ - friend inline - constexpr QUATERNION MATH_PURE operator*(QUATERNION q, T scalar) { - // don't pass q by reference because we need a copy anyways - return q *= scalar; + template>> + friend inline constexpr + QUATERNION> MATH_PURE operator*(QUATERNION q, U scalar) { + // don't pass q by reference because we need a copy anyway + return QUATERNION>(q *= scalar); } - friend inline - constexpr QUATERNION MATH_PURE operator*(T scalar, QUATERNION q) { - // don't pass q by reference because we need a copy anyways - return q *= scalar; + template>> + friend inline constexpr + QUATERNION> MATH_PURE operator*(U scalar, QUATERNION q) { + // don't pass q by reference because we need a copy anyway + return QUATERNION>(q *= scalar); } - friend inline - constexpr QUATERNION MATH_PURE operator/(QUATERNION q, T scalar) { - // don't pass q by reference because we need a copy anyways - return q /= scalar; + template>> + friend inline constexpr + QUATERNION> MATH_PURE operator/(QUATERNION q, U scalar) { + // don't pass q by reference because we need a copy anyway + return QUATERNION>(q /= scalar); } }; @@ -163,9 +166,10 @@ class TQuatFunctions { * (the first one, BASE being known). */ - template - friend inline - constexpr T MATH_PURE dot(const QUATERNION& p, const QUATERNION& q) { + template + friend inline constexpr + arithmetic_result_t MATH_PURE dot( + const QUATERNION& p, const QUATERNION& q) { return p.x * q.x + p.y * q.y + p.z * q.z + @@ -199,7 +203,7 @@ class TQuatFunctions { friend inline constexpr QUATERNION MATH_PURE inverse(const QUATERNION& q) { - return conj(q) * (1 / dot(q, q)); + return conj(q) * (T(1) / dot(q, q)); } friend inline @@ -217,8 +221,10 @@ class TQuatFunctions { return QUATERNION(q.xyz, 0); } - friend inline - constexpr QUATERNION MATH_PURE cross(const QUATERNION& p, const QUATERNION& q) { + template + friend inline constexpr + QUATERNION> MATH_PURE cross( + const QUATERNION& p, const QUATERNION& q) { return unreal(p * q); } @@ -253,7 +259,7 @@ class TQuatFunctions { return normalize(lerp(d < 0 ? -p : p, q, t)); } const T npq = std::sqrt(dot(p, p) * dot(q, q)); // ||p|| * ||q|| - const T a = std::acos(filament::math::clamp(absd / npq, T(-1), T(1))); + const T a = std::acos(math::clamp(absd / npq, T(-1), T(1))); const T a0 = a * (1 - t); const T a1 = a * t; const T sina = sin(a); @@ -283,9 +289,6 @@ class TQuatFunctions { } }; -// ------------------------------------------------------------------------------------- -} // namespace details -} // namespace math -} // namespace filament +} // namespace filament::math::details #endif // TNT_MATH_TQUATHELPERS_H diff --git a/libs/math/include/math/TVecHelpers.h b/libs/math/include/math/TVecHelpers.h index a43c2a479f9..fb7d026d6fb 100644 --- a/libs/math/include/math/TVecHelpers.h +++ b/libs/math/include/math/TVecHelpers.h @@ -443,6 +443,37 @@ class TVecFunctions { return v; } + template + friend inline + VECTOR MATH_PURE fmod(VECTOR const& x, VECTOR const& y) { + VECTOR r; + for (size_t i = 0; i < r.size(); i++) { + r[i] = std::fmod(x[i], y[i]); + } + return r; + } + + template + friend inline + VECTOR MATH_PURE remainder(VECTOR const& x, VECTOR const& y) { + VECTOR r; + for (size_t i = 0; i < r.size(); i++) { + r[i] = std::remainder(x[i], y[i]); + } + return r; + } + + template + friend inline + VECTOR MATH_PURE remquo(VECTOR const& x, VECTOR const& y, + VECTOR* q) { + VECTOR r; + for (size_t i = 0; i < r.size(); i++) { + r[i] = std::remquo(x[i], y[i], &((*q)[i])); + } + return r; + } + friend inline VECTOR MATH_PURE inversesqrt(VECTOR v) { for (size_t i = 0; i < v.size(); i++) { v[i] = T(1) / std::sqrt(v[i]); diff --git a/libs/math/include/math/fast.h b/libs/math/include/math/fast.h index 85b990d2872..9988cfd2a34 100644 --- a/libs/math/include/math/fast.h +++ b/libs/math/include/math/fast.h @@ -50,7 +50,7 @@ constexpr T MATH_PURE cos(T x) noexcept { // x between -pi and pi template::value>> constexpr T MATH_PURE sin(T x) noexcept { - return filament::math::fast::cos(x - T(F_PI_2)); + return fast::cos(x - T(F_PI_2)); } constexpr inline float MATH_PURE ilog2(float x) noexcept { diff --git a/libs/math/include/math/half.h b/libs/math/include/math/half.h index 779bdbe40c8..c46d4ee4b66 100644 --- a/libs/math/include/math/half.h +++ b/libs/math/include/math/half.h @@ -160,11 +160,11 @@ constexpr inline half makeHalf(uint16_t bits) noexcept { #endif // __ARM_NEON -inline constexpr half operator "" _h(long double v) { +inline constexpr half operator""_h(long double v) { return half( static_cast(v) ); } -template<> struct is_arithmetic : public std::true_type {}; +template<> struct is_arithmetic : public std::true_type {}; } // namespace math } // namespace filament diff --git a/libs/math/include/math/mat2.h b/libs/math/include/math/mat2.h index 551fe4451ed..d12aa532de7 100644 --- a/libs/math/include/math/mat2.h +++ b/libs/math/include/math/mat2.h @@ -225,7 +225,7 @@ class MATH_EMPTY_BASES TMat22 : * Rotate by radians in the 2D plane */ static TMat22 rotate(T radian) noexcept { - TMat22 r(TMat22::NO_INIT); + TMat22 r(NO_INIT); T c = std::cos(radian); T s = std::sin(radian); r[0][0] = c; @@ -235,23 +235,6 @@ class MATH_EMPTY_BASES TMat22 : return r; } - // returns false if the two matrices are different. May return false if they're the - // same, with some elements only differing by +0 or -0. Behaviour is undefined with NaNs. - static constexpr bool fuzzyEqual(TMat22 l, TMat22 r) noexcept { - uint64_t const* const li = reinterpret_cast(&l); - uint64_t const* const ri = reinterpret_cast(&r); - uint64_t result = 0; - // For some reason clang is not able to vectoize this loop when the number of iteration - // is known and constant (!?!?!). Still this is better than operator==. -#if defined(__clang__) -#pragma clang loop vectorize_width(2) -#endif - for (size_t i = 0; i < sizeof(TMat22) / sizeof(uint64_t); i++) { - result |= li[i] ^ ri[i]; - } - return result != 0; - } - template static constexpr TMat22 translation(const TVec2& t) noexcept { TMat22 r; diff --git a/libs/math/include/math/mat3.h b/libs/math/include/math/mat3.h index d7b673a38e9..ae78e588895 100644 --- a/libs/math/include/math/mat3.h +++ b/libs/math/include/math/mat3.h @@ -17,15 +17,21 @@ #ifndef TNT_MATH_MAT3_H #define TNT_MATH_MAT3_H -#include #include #include #include +#include +#include #include #include #include +#include + +#include +#include + namespace filament { namespace math { // ------------------------------------------------------------------------------------- @@ -250,7 +256,7 @@ class MATH_EMPTY_BASES TMat33 : */ friend inline constexpr TMat33 orthogonalize(const TMat33& m) noexcept { - TMat33 ret(TMat33::NO_INIT); + TMat33 ret(NO_INIT); ret[0] = normalize(m[0]); ret[2] = normalize(cross(ret[0], m[1])); ret[1] = normalize(cross(ret[2], ret[0])); @@ -289,6 +295,14 @@ class MATH_EMPTY_BASES TMat33 : return matrix::cof(m); } + /* + * Returns a matrix representing the pose of a virtual camera looking towards -Z in its + * local Y-up coordinate system. "up" defines where the Y axis of the camera's local coordinate + * system is. + */ + template + static TMat33 lookTo(const TVec3& direction, const TVec3& up) noexcept; + /** * Packs the tangent frame represented by the specified matrix into a quaternion. * Reflection is preserved by encoding it as the sign of the w component in the @@ -406,6 +420,29 @@ constexpr TMat33::TMat33(const TQuaternion& q) noexcept : m_value{} { m_value[2] = col_type(xz + yw, yz - xw, 1 - xx - yy); // NOLINT } +template +constexpr T dot_tolerance() noexcept; + +template<> +constexpr float dot_tolerance() noexcept { return 0.999f; } + +template<> +constexpr double dot_tolerance() noexcept { return 0.9999; } + +template +template +TMat33 TMat33::lookTo(const TVec3& direction, const TVec3& up) noexcept { + auto const z_axis = direction; + auto norm_up = up; + if (std::abs(dot(z_axis, norm_up)) > dot_tolerance< arithmetic_result_t >()) { + // Fix up vector if we're degenerate (looking straight up, basically) + norm_up = { norm_up.z, norm_up.x, norm_up.y }; + } + auto const x_axis = normalize(cross(z_axis, norm_up)); + auto const y_axis = cross(x_axis, z_axis); + return { x_axis, y_axis, -z_axis }; +} + //------------------------------------------------------------------------------ template constexpr TQuaternion TMat33::packTangentFrame(const TMat33& m, size_t storageSize) noexcept { @@ -430,8 +467,21 @@ constexpr TQuaternion TMat33::packTangentFrame(const TMat33& m, size_t return q; } + } // namespace details +/** + * Pre-scale a matrix m by the inverse of the largest scale factor to avoid large post-transform + * magnitudes in the shader. This is useful for normal transformations, to avoid large + * post-transform magnitudes in the shader, especially in the fragment shader, where we use + * medium precision. + */ +template +constexpr details::TMat33 prescaleForNormals(const details::TMat33& m) noexcept { + return m * details::TMat33( + 1.0 / std::sqrt(max(float3{length2(m[0]), length2(m[1]), length2(m[2])}))); +} + // ---------------------------------------------------------------------------------------- typedef details::TMat33 mat3; diff --git a/libs/math/include/math/mat4.h b/libs/math/include/math/mat4.h index fa5301adfaa..7eb50e3576c 100644 --- a/libs/math/include/math/mat4.h +++ b/libs/math/include/math/mat4.h @@ -272,24 +272,6 @@ class MATH_EMPTY_BASES TMat44 : template constexpr TMat44(const TMat33& matrix, const TVec4& column3) noexcept; - /* - * helpers - */ - - // returns false if the two matrices are different. May return false if they're the - // same, with some elements only differing by +0 or -0. Behaviour is undefined with NaNs. - static constexpr bool fuzzyEqual(TMat44 const& l, TMat44 const& r) noexcept { - uint64_t const* const li = reinterpret_cast(&l); - uint64_t const* const ri = reinterpret_cast(&r); - uint64_t result = 0; - // For some reason clang is not able to vectorize this loop when the number of iteration - // is known and constant (!?!?!). Still this is better than operator==. - for (size_t i = 0; i < sizeof(TMat44) / sizeof(uint64_t); i++) { - result |= li[i] ^ ri[i]; - } - return result != 0; - } - static constexpr TMat44 ortho(T left, T right, T bottom, T top, T near, T far) noexcept; static constexpr TMat44 frustum(T left, T right, T bottom, T top, T near, T far) noexcept; @@ -303,6 +285,9 @@ class MATH_EMPTY_BASES TMat44 : template static TMat44 lookAt(const TVec3& eye, const TVec3& center, const TVec3& up) noexcept; + template + static TMat44 lookTo(const TVec3& direction, const TVec3& position, const TVec3& up) noexcept; + template static constexpr TVec3 project(const TMat44& projectionMatrix, TVec3 vertice) noexcept{ TVec4 r = projectionMatrix * TVec4{ vertice, 1 }; @@ -513,10 +498,10 @@ constexpr TMat44 TMat44::frustum(T left, T right, T bottom, T top, T near, } template -TMat44 TMat44::perspective(T fov, T aspect, T near, T far, TMat44::Fov direction) noexcept { +TMat44 TMat44::perspective(T fov, T aspect, T near, T far, Fov direction) noexcept { T h, w; - if (direction == TMat44::Fov::VERTICAL) { + if (direction == Fov::VERTICAL) { h = std::tan(fov * F_PI / 360.0f) * near; w = h * aspect; } else { @@ -535,19 +520,19 @@ template template TMat44 TMat44::lookAt(const TVec3& eye, const TVec3& center, const TVec3& up) noexcept { - TVec3 z_axis(normalize(center - eye)); - TVec3 norm_up(normalize(up)); - if (std::abs(dot(z_axis, norm_up)) > T(0.999)) { - // Fix up vector if we're degenerate (looking straight up, basically) - norm_up = { norm_up.z, norm_up.x, norm_up.y }; - } - TVec3 x_axis(normalize(cross(z_axis, norm_up))); - TVec3 y_axis(cross(x_axis, z_axis)); - return TMat44( - TVec4(x_axis, 0), - TVec4(y_axis, 0), - TVec4(-z_axis, 0), - TVec4(eye, 1)); + return lookTo(normalize(center - eye), eye, normalize(up)); +} + +template +template +TMat44 TMat44::lookTo(const TVec3& direction, const TVec3& position, + const TVec3& up) noexcept { + auto r = TMat33::lookTo(direction, up); + return TMat44{ + TVec4{ r[0], 0 }, + TVec4{ r[1], 0 }, + TVec4{ r[2], 0 }, + TVec4{ position, 1 } }; } // ---------------------------------------------------------------------------------------- diff --git a/libs/math/include/math/mathfwd.h b/libs/math/include/math/mathfwd.h index c5eecfab1ba..b2d3ad84172 100644 --- a/libs/math/include/math/mathfwd.h +++ b/libs/math/include/math/mathfwd.h @@ -33,8 +33,7 @@ #include -namespace filament { -namespace math { +namespace filament::math { namespace details { template class TVec2; @@ -45,6 +44,8 @@ template class TMat22; template class TMat33; template class TMat44; +template class TQuaternion; + } // namespace details using double2 = details::TVec2; @@ -86,8 +87,10 @@ using mat3f = details::TMat33; using mat4 = details::TMat44; using mat4f = details::TMat44; -} // namespace math -} // namespace filament +using quat = details::TQuaternion; +using quatf = details::TQuaternion; + +} // namespace filament::math #endif // _MSC_VER diff --git a/libs/math/include/math/quat.h b/libs/math/include/math/quat.h index 91e1ab6d81d..af9f7467fb4 100644 --- a/libs/math/include/math/quat.h +++ b/libs/math/include/math/quat.h @@ -26,10 +26,7 @@ #include #include -namespace filament { -namespace math { -// ------------------------------------------------------------------------------------- - +namespace filament::math { namespace details { template @@ -89,15 +86,15 @@ class MATH_EMPTY_BASES TQuaternion : // constructors - // leaves object uninitialized. use with caution. + // Leaves object uninitialized. Use with caution. explicit constexpr TQuaternion(no_init) {} // default constructor. sets all values to zero. constexpr TQuaternion() : x(0), y(0), z(0), w(0) {} - // handles implicit conversion to a quat. must not be explicit. + // Handles implicit conversion to a quat. Must not be explicit. template> - constexpr TQuaternion(A w) : x(0), y(0), z(0), w(w) {} + constexpr TQuaternion(A w) : x(0), y(0), z(0), w(w) {} // NOLINT(google-explicit-constructor) // initialize from 4 values to w + xi + yj + zk template quat; typedef details::TQuaternion quatf; typedef details::TQuaternion quath; -constexpr inline quat operator "" _i(long double v) { - return quat(0.0, double(v), 0.0, 0.0); +// note: don't put a space between "" and _{i,j,k}, this is deprecated + +constexpr inline quat operator ""_i(long double v) { + return { 0.0, double(v), 0.0, 0.0 }; } -constexpr inline quat operator "" _j(long double v) { - return quat(0.0, 0.0, double(v), 0.0); +constexpr inline quat operator ""_j(long double v) { + return { 0.0, 0.0, double(v), 0.0 }; } -constexpr inline quat operator "" _k(long double v) { - return quat(0.0, 0.0, 0.0, double(v)); +constexpr inline quat operator ""_k(long double v) { + return { 0.0, 0.0, 0.0, double(v) }; } -constexpr inline quat operator "" _i(unsigned long long v) { - return quat(0.0, double(v), 0.0, 0.0); +constexpr inline quat operator ""_i(unsigned long long v) { + return { 0.0, double(v), 0.0, 0.0 }; } -constexpr inline quat operator "" _j(unsigned long long v) { - return quat(0.0, 0.0, double(v), 0.0); +constexpr inline quat operator ""_j(unsigned long long v) { + return { 0.0, 0.0, double(v), 0.0 }; } -constexpr inline quat operator "" _k(unsigned long long v) { - return quat(0.0, 0.0, 0.0, double(v)); +constexpr inline quat operator ""_k(unsigned long long v) { + return { 0.0, 0.0, 0.0, double(v) }; } -// ---------------------------------------------------------------------------------------- -} // namespace math -} // namespace filament +} // namespace filament::math #endif // TNT_MATH_QUAT_H diff --git a/libs/math/tests/test_mat.cpp b/libs/math/tests/test_mat.cpp index 6afe9c81fc3..047a5629cd7 100644 --- a/libs/math/tests/test_mat.cpp +++ b/libs/math/tests/test_mat.cpp @@ -32,6 +32,71 @@ class MatTest : public testing::Test { protected: }; +//------------------------------------------------------------------------------ +// A macro to help with vector comparisons within floating point range. +#define EXPECT_VEC_EQ(VEC1, VEC2) \ +do { \ + const decltype(VEC1) v1 = VEC1; \ + const decltype(VEC2) v2 = VEC2; \ + if (std::is_same::value) { \ + for (int i = 0; i < v1.size(); ++i) { \ + EXPECT_FLOAT_EQ(v1[i], v2[i]); \ + } \ + } else if (std::is_same::value) { \ + for (int i = 0; i < v1.size(); ++i) { \ + EXPECT_DOUBLE_EQ(v1[i], v2[i]); \ + } \ + } else { \ + for (int i = 0; i < v1.size(); ++i) { \ + EXPECT_EQ(v1[i], v2[i]); \ + } \ + } \ +} while(0) + +//------------------------------------------------------------------------------ +// A macro to help with vector comparisons within a range. +#define EXPECT_VEC_NEAR(VEC1, VEC2, eps) \ +do { \ + const decltype(VEC1) v1 = VEC1; \ + const decltype(VEC2) v2 = VEC2; \ + for (int i = 0; i < v1.size(); ++i) { \ + EXPECT_NEAR(v1[i], v2[i], eps); \ + } \ +} while(0) + + +//------------------------------------------------------------------------------ +// A macro to help with type comparisons within floating point range. +#define ASSERT_TYPE_EQ(T1, T2) \ +do { \ + const decltype(T1) t1 = T1; \ + const decltype(T2) t2 = T2; \ + if (std::is_same::value) { \ + ASSERT_FLOAT_EQ(t1, t2); \ + } else if (std::is_same::value) { \ + ASSERT_DOUBLE_EQ(t1, t2); \ + } else { \ + ASSERT_EQ(t1, t2); \ + } \ +} while(0) + + + +TEST_F(MatTest, LargeFloatRotationsWithOrthogonalization) { + double3 const t = { 2304097.1410110965, -4688442.9915525438, -3639452.5611694567 }; + mat4 const T = mat4::translation(t); + for (float d = 0; d < 90; d = d + 1.0) { + mat3f const R = mat3f::rotation(d * f::DEG_TO_RAD, float3{ 0, 1, 0 }); + mat3 RR = orthogonalize(mat3{ R }); + ASSERT_NEAR(dot(RR[0], RR[0]), 1.0, 1e-12); + ASSERT_NEAR(dot(RR[1], RR[1]), 1.0, 1e-12); + ASSERT_NEAR(dot(RR[2], RR[2]), 1.0, 1e-12); + mat4 M = mat4{ RR } * T; + double3 const t2 = transpose(M.upperLeft()) * M[3].xyz; + EXPECT_VEC_NEAR(t, t2, 0.0001); // 0.1mm + } +} + TEST_F(MatTest, ConstexprMat2) { constexpr float a = F_PI; constexpr mat2f M; @@ -552,41 +617,6 @@ TYPED_TEST(MatTestT, Inverse2) { TEST_MATRIX_INVERSE(m4, 20.0 * std::numeric_limits::epsilon()); } -//------------------------------------------------------------------------------ -// A macro to help with vector comparisons within floating point range. -#define EXPECT_VEC_EQ(VEC1, VEC2) \ -do { \ - const decltype(VEC1) v1 = VEC1; \ - const decltype(VEC2) v2 = VEC2; \ - if (std::is_same::value) { \ - for (int i = 0; i < v1.size(); ++i) { \ - EXPECT_FLOAT_EQ(v1[i], v2[i]); \ - } \ - } else if (std::is_same::value) { \ - for (int i = 0; i < v1.size(); ++i) { \ - EXPECT_DOUBLE_EQ(v1[i], v2[i]); \ - } \ - } else { \ - for (int i = 0; i < v1.size(); ++i) { \ - EXPECT_EQ(v1[i], v2[i]); \ - } \ - } \ -} while(0) - -//------------------------------------------------------------------------------ -// A macro to help with type comparisons within floating point range. -#define ASSERT_TYPE_EQ(T1, T2) \ -do { \ - const decltype(T1) t1 = T1; \ - const decltype(T2) t2 = T2; \ - if (std::is_same::value) { \ - ASSERT_FLOAT_EQ(t1, t2); \ - } else if (std::is_same::value) { \ - ASSERT_DOUBLE_EQ(t1, t2); \ - } else { \ - ASSERT_EQ(t1, t2); \ - } \ -} while(0) TYPED_TEST(MatTestT, NormalsNegativeScale) { typedef filament::math::details::TMat33 M33T; @@ -834,9 +864,10 @@ TYPED_TEST(MatTestT, cofactor) { M33T r = M33T::eulerZYX(rand_gen(), rand_gen(), rand_gen()); M33T c0 = details::matrix::cofactor(r); M33T c1 = details::matrix::fastCofactor3(r); - EXPECT_VEC_EQ(c0[0], c1[0]); - EXPECT_VEC_EQ(c0[1], c1[1]); - EXPECT_VEC_EQ(c0[2], c1[2]); + + EXPECT_VEC_NEAR(c0[0], c1[0], value_eps); + EXPECT_VEC_NEAR(c0[1], c1[1], value_eps); + EXPECT_VEC_NEAR(c0[2], c1[2], value_eps); } } diff --git a/libs/math/tests/test_quat.cpp b/libs/math/tests/test_quat.cpp index 6a5849875e7..044a272a7e0 100644 --- a/libs/math/tests/test_quat.cpp +++ b/libs/math/tests/test_quat.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include @@ -324,3 +325,103 @@ TEST_F(QuatTest, NaN) { EXPECT_NEAR(qs[2], 0.5, 0.1); EXPECT_NEAR(qs[3], 0.5, 0.1); } + +TEST_F(QuatTest, Conversions) { + quat qd; + quatf qf; + float3 vf; + double3 vd; + double d = 0.0; + float f = 0.0f; + + static_assert(std::is_same, float>::value); + static_assert(std::is_same, double>::value); + static_assert(std::is_same, double>::value); + static_assert(std::is_same, double>::value); + + { + auto r1 = qd * d; + auto r2 = qd * f; + auto r3 = qf * d; + auto r4 = qf * f; + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + } + { + auto r1 = qd / d; + auto r2 = qd / f; + auto r3 = qf / d; + auto r4 = qf / f; + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + } + { + auto r1 = d * qd; + auto r2 = f * qd; + auto r3 = d * qf; + auto r4 = f * qf; + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + } + { + auto r1 = qd * vd; + auto r2 = qf * vd; + auto r3 = qd * vf; + auto r4 = qf * vf; + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + } + { + auto r1 = qd * qd; + auto r2 = qf * qd; + auto r3 = qd * qf; + auto r4 = qf * qf; + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + } + { + auto r1 = dot(qd, qd); + auto r2 = dot(qf, qd); + auto r3 = dot(qd, qf); + auto r4 = dot(qf, qf); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + } + { + auto r1 = cross(qd, qd); + auto r2 = cross(qf, qd); + auto r3 = cross(qd, qf); + auto r4 = cross(qf, qf); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + static_assert(std::is_same::value); + } +} + +template +struct has_divide_assign : std::false_type {}; + +template +struct has_divide_assign() /= std::declval(), void())> : std::true_type {}; + +// Static assertions to validate the availability of the /= operator for specific type +// combinations. The first static_assert checks that the quat does not have a /= operator with Foo. +// This ensures that quat does not provide an inappropriate overload that could be erroneously +// selected. +struct Foo {}; +static_assert(!has_divide_assign::value); +static_assert(has_divide_assign::value); diff --git a/libs/mathio/CMakeLists.txt b/libs/mathio/CMakeLists.txt index e626aef3b47..4ad5126fc01 100644 --- a/libs/mathio/CMakeLists.txt +++ b/libs/mathio/CMakeLists.txt @@ -4,12 +4,6 @@ project(math) set(TARGET mathio) set(PUBLIC_HDR_DIR include) -if (MSVC) - set(OPTIMIZATION_FLAGS /fp:fast) -else() - set(OPTIMIZATION_FLAGS -ffast-math -ffp-contract=fast) -endif() - # ================================================================================================== # Sources and headers # ================================================================================================== diff --git a/libs/mathio/include/mathio/ostream.h b/libs/mathio/include/mathio/ostream.h index 5f29c879d2c..5628e7c8a2a 100644 --- a/libs/mathio/include/mathio/ostream.h +++ b/libs/mathio/include/mathio/ostream.h @@ -23,38 +23,36 @@ # define MATHIO_PUBLIC #endif -namespace filament { -namespace math { +namespace filament::math::details { -namespace details { template class TQuaternion; } +template class TQuaternion; template MATHIO_PUBLIC -std::ostream& operator<<(std::ostream& out, const details::TVec2& v) noexcept; +std::ostream& operator<<(std::ostream& out, const TVec2& v) noexcept; template MATHIO_PUBLIC -std::ostream& operator<<(std::ostream& out, const details::TVec3& v) noexcept; +std::ostream& operator<<(std::ostream& out, const TVec3& v) noexcept; template MATHIO_PUBLIC -std::ostream& operator<<(std::ostream& out, const details::TVec4& v) noexcept; +std::ostream& operator<<(std::ostream& out, const TVec4& v) noexcept; template MATHIO_PUBLIC -std::ostream& operator<<(std::ostream& out, const details::TMat22& v) noexcept; +std::ostream& operator<<(std::ostream& out, const TMat22& v) noexcept; template MATHIO_PUBLIC -std::ostream& operator<<(std::ostream& out, const details::TMat33& v) noexcept; +std::ostream& operator<<(std::ostream& out, const TMat33& v) noexcept; template MATHIO_PUBLIC -std::ostream& operator<<(std::ostream& out, const details::TMat44& v) noexcept; +std::ostream& operator<<(std::ostream& out, const TMat44& v) noexcept; template MATHIO_PUBLIC -std::ostream& operator<<(std::ostream& out, const details::TQuaternion& v) noexcept; +std::ostream& operator<<(std::ostream& out, const TQuaternion& v) noexcept; -} // namespace math -} // namespace filament +} // namespace filament::math::details diff --git a/libs/mathio/src/ostream.cpp b/libs/mathio/src/ostream.cpp index a3e442424a9..b6a1e11600c 100644 --- a/libs/mathio/src/ostream.cpp +++ b/libs/mathio/src/ostream.cpp @@ -25,16 +25,13 @@ #include #include - #include #include #include #include -namespace filament { -namespace math { -namespace details { +namespace filament::math::details { template std::ostream& printVector(std::ostream& stream, const T* data, size_t count) { @@ -78,90 +75,85 @@ std::ostream& printQuat(std::ostream& stream, const BASE& q) { return stream << "< " << q.w << " + " << q.x << "i + " << q.y << "j + " << q.z << "k >"; } -} // namespace details - -using namespace details; - template -std::ostream& operator<<(std::ostream& out, const details::TVec2& v) noexcept { +std::ostream& operator<<(std::ostream& out, const TVec2& v) noexcept { return printVector(out, v.v, 2); } template -std::ostream& operator<<(std::ostream& out, const details::TVec3& v) noexcept { +std::ostream& operator<<(std::ostream& out, const TVec3& v) noexcept { return printVector(out, v.v, 3); } template -std::ostream& operator<<(std::ostream& out, const details::TVec4& v) noexcept { +std::ostream& operator<<(std::ostream& out, const TVec4& v) noexcept { return printVector(out, v.v, 4); } template -std::ostream& operator<<(std::ostream& out, const details::TMat22& v) noexcept { +std::ostream& operator<<(std::ostream& out, const TMat22& v) noexcept { return printMatrix(out, v.asArray(), 2, 2); } template -std::ostream& operator<<(std::ostream& out, const details::TMat33& v) noexcept { +std::ostream& operator<<(std::ostream& out, const TMat33& v) noexcept { return printMatrix(out, v.asArray(), 3, 3); } template -std::ostream& operator<<(std::ostream& out, const details::TMat44& v) noexcept { +std::ostream& operator<<(std::ostream& out, const TMat44& v) noexcept { return printMatrix(out, v.asArray(), 4, 4); } template -std::ostream& operator<<(std::ostream& out, const details::TQuaternion& v) noexcept { +std::ostream& operator<<(std::ostream& out, const TQuaternion& v) noexcept { return printQuat(out, v); } -template std::ostream& operator<<(std::ostream& out, const details::TVec2& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec2& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec2& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec2& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec2& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec2& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec2& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec2& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec2& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec2& v) noexcept; - -template std::ostream& operator<<(std::ostream& out, const details::TVec3& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec3& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec3& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec3& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec3& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec3& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec3& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec3& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec3& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec3& v) noexcept; - -template std::ostream& operator<<(std::ostream& out, const details::TVec4& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec4& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec4& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec4& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec4& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec4& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec4& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec4& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec4& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TVec4& v) noexcept; - -template std::ostream& operator<<(std::ostream& out, const details::TMat22& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TMat22& v) noexcept; - -template std::ostream& operator<<(std::ostream& out, const details::TMat33& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TMat33& v) noexcept; - -template std::ostream& operator<<(std::ostream& out, const details::TMat44& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TMat44& v) noexcept; - -template std::ostream& operator<<(std::ostream& out, const details::TQuaternion& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TQuaternion& v) noexcept; -template std::ostream& operator<<(std::ostream& out, const details::TQuaternion& v) noexcept; - -} // namespace math -} // namespace filament +template std::ostream& operator<<(std::ostream& out, const TVec2& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec2& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec2& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec2& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec2& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec2& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec2& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec2& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec2& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec2& v) noexcept; + +template std::ostream& operator<<(std::ostream& out, const TVec3& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec3& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec3& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec3& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec3& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec3& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec3& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec3& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec3& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec3& v) noexcept; + +template std::ostream& operator<<(std::ostream& out, const TVec4& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec4& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec4& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec4& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec4& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec4& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec4& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec4& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec4& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TVec4& v) noexcept; + +template std::ostream& operator<<(std::ostream& out, const TMat22& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TMat22& v) noexcept; + +template std::ostream& operator<<(std::ostream& out, const TMat33& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TMat33& v) noexcept; + +template std::ostream& operator<<(std::ostream& out, const TMat44& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TMat44& v) noexcept; + +template std::ostream& operator<<(std::ostream& out, const TQuaternion& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TQuaternion& v) noexcept; +template std::ostream& operator<<(std::ostream& out, const TQuaternion& v) noexcept; + +} // namespace filament::math::details diff --git a/libs/uberz/src/WritableArchive.cpp b/libs/uberz/src/WritableArchive.cpp index d7fface9472..09e601f8684 100644 --- a/libs/uberz/src/WritableArchive.cpp +++ b/libs/uberz/src/WritableArchive.cpp @@ -76,6 +76,8 @@ static string_view readBlendingMode(string_view cursor, BlendingMode* blending) *blending = BlendingMode::MULTIPLY; } else if (sz = readPrefix("screen"sv, cursor); sz > 0) { *blending = BlendingMode::SCREEN; + } else if (sz = readPrefix("custom"sv, cursor); sz > 0) { + *blending = BlendingMode::CUSTOM; } return { cursor.data(), sz }; } diff --git a/libs/utils/CMakeLists.txt b/libs/utils/CMakeLists.txt index 906f7441d93..72558167b32 100644 --- a/libs/utils/CMakeLists.txt +++ b/libs/utils/CMakeLists.txt @@ -37,8 +37,9 @@ set(DIST_HDRS ${PUBLIC_HDR_DIR}/${TARGET}/PrivateImplementation-impl.h ${PUBLIC_HDR_DIR}/${TARGET}/SingleInstanceComponentManager.h ${PUBLIC_HDR_DIR}/${TARGET}/Slice.h - ${PUBLIC_HDR_DIR}/${TARGET}/SpinLock.h ${PUBLIC_HDR_DIR}/${TARGET}/StructureOfArrays.h + ${PUBLIC_HDR_DIR}/${TARGET}/Systrace.h + ${PUBLIC_HDR_DIR}/${TARGET}/sstream.h ${PUBLIC_HDR_DIR}/${TARGET}/unwindows.h ) @@ -53,6 +54,7 @@ set(DIST_GENERIC_HDRS set(SRCS src/api_level.cpp + src/architecture.cpp src/ashmem.cpp src/debug.cpp src/Allocator.cpp @@ -71,7 +73,6 @@ set(SRCS src/Profiler.cpp src/sstream.cpp src/string.cpp - src/Systrace.cpp src/ThreadUtils.cpp ) @@ -80,6 +81,8 @@ if (WIN32) endif() if (ANDROID) list(APPEND SRCS src/android/ThermalManager.cpp) + list(APPEND SRCS src/android/PerformanceHintManager.cpp) + list(APPEND SRCS src/android/Systrace.cpp) endif() if (LINUX OR ANDROID) list(APPEND SRCS src/linux/Condition.cpp) @@ -88,6 +91,10 @@ if (LINUX OR ANDROID) endif() if (APPLE) list(APPEND SRCS src/darwin/Path.mm) + list(APPEND SRCS src/darwin/Systrace.cpp) +endif() +if (WEBGL) + list(APPEND SRCS src/web/Path.cpp) endif() # ================================================================================================== @@ -111,6 +118,11 @@ if (WIN32) target_link_libraries(${TARGET} PUBLIC Shlwapi) endif() +if (APPLE) + # Needed for NSTemporaryDirectory() + target_link_libraries(${TARGET} PRIVATE "-framework Foundation") +endif() + if (LINUX) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) @@ -143,6 +155,7 @@ set(TEST_SRCS test/test_CyclicBarrier.cpp test/test_Entity.cpp test/test_FixedCapacityVector.cpp + test/test_FixedCircularBuffer.cpp test/test_Hash.cpp test/test_JobSystem.cpp test/test_QuadTreeArray.cpp diff --git a/libs/utils/benchmark/benchmark_allocators.cpp b/libs/utils/benchmark/benchmark_allocators.cpp index b37e5c0232a..f243d7953c8 100644 --- a/libs/utils/benchmark/benchmark_allocators.cpp +++ b/libs/utils/benchmark/benchmark_allocators.cpp @@ -38,7 +38,6 @@ class Allocators : public benchmark::Fixture { utils::Arena, LockingPolicy::NoLock> mPoolAllocatorNoLock; utils::Arena, std::mutex> mPoolAllocatorStdMutex; utils::Arena, utils::Mutex> mPoolAllocatorUtilsMutex; - utils::Arena, LockingPolicy::SpinLock> mPoolAllocatorSpinlock; utils::Arena, LockingPolicy::NoLock> mPoolAllocatorAtomic; }; @@ -48,7 +47,6 @@ Allocators::Allocators() : mPoolAllocatorNoLock("nolock", POOL_ITEM_COUNT * sizeof(Payload)), mPoolAllocatorStdMutex("std::mutex", POOL_ITEM_COUNT * sizeof(Payload)), mPoolAllocatorUtilsMutex("utils::Mutex", POOL_ITEM_COUNT * sizeof(Payload)), - mPoolAllocatorSpinlock("spinlock", POOL_ITEM_COUNT * sizeof(Payload)), mPoolAllocatorAtomic("atomic", POOL_ITEM_COUNT * sizeof(Payload)) { } @@ -81,15 +79,6 @@ BENCHMARK_DEFINE_F(Allocators, poolAllocator_utils_mutex)(benchmark::State& stat } } -BENCHMARK_DEFINE_F(Allocators, poolAllocator_spinlock)(benchmark::State& state) { - auto& pool = mPoolAllocatorSpinlock; - PerformanceCounters pc(state); - for (auto _ : state) { - Payload* p = pool.alloc(1); - pool.free(p); - } -} - BENCHMARK_DEFINE_F(Allocators, poolAllocator_atomic)(benchmark::State& state) { auto& pool = mPoolAllocatorAtomic; PerformanceCounters pc(state); @@ -107,10 +96,6 @@ BENCHMARK_REGISTER_F(Allocators, poolAllocator_utils_mutex) ->ThreadRange(1, 4) ->Threads(benchmark::CPUInfo::Get().num_cpus * 2); -BENCHMARK_REGISTER_F(Allocators, poolAllocator_spinlock) - ->ThreadRange(1, 4) - ->Threads(benchmark::CPUInfo::Get().num_cpus * 2); - BENCHMARK_REGISTER_F(Allocators, poolAllocator_atomic) ->ThreadRange(1, 4) ->Threads(benchmark::CPUInfo::Get().num_cpus * 2); diff --git a/libs/utils/benchmark/benchmark_mutex.cpp b/libs/utils/benchmark/benchmark_mutex.cpp index b455d424cd0..71e4f21caf8 100644 --- a/libs/utils/benchmark/benchmark_mutex.cpp +++ b/libs/utils/benchmark/benchmark_mutex.cpp @@ -41,15 +41,6 @@ static void BM_utils_mutex(benchmark::State& state) { } } -static void BM_spinlock(benchmark::State& state) { - static LockingPolicy::SpinLock l; - PerformanceCounters pc(state); - for (auto _ : state) { - l.lock(); - l.unlock(); - } -} - BENCHMARK(BM_std_mutex) ->Threads(1) ->Threads(2) @@ -61,9 +52,3 @@ BENCHMARK(BM_utils_mutex) ->Threads(2) ->Threads(8) ->ThreadPerCpu(); - -BENCHMARK(BM_spinlock) - ->Threads(1) - ->Threads(2) - ->Threads(8) - ->ThreadPerCpu(); diff --git a/libs/utils/include/utils/Allocator.h b/libs/utils/include/utils/Allocator.h index 82d1d1ccee9..8e9bed28d65 100644 --- a/libs/utils/include/utils/Allocator.h +++ b/libs/utils/include/utils/Allocator.h @@ -17,12 +17,10 @@ #ifndef TNT_UTILS_ALLOCATOR_H #define TNT_UTILS_ALLOCATOR_H - #include #include #include #include -#include #include #include @@ -31,6 +29,8 @@ #include #include +#include +#include namespace utils { @@ -44,14 +44,14 @@ static inline P* add(P* a, T b) noexcept { template static inline P* align(P* p, size_t alignment) noexcept { // alignment must be a power-of-two - assert(alignment && !(alignment & alignment-1)); + assert_invariant(alignment && !(alignment & alignment-1)); return (P*)((uintptr_t(p) + alignment - 1) & ~(alignment - 1)); } template static inline P* align(P* p, size_t alignment, size_t offset) noexcept { P* const r = align(add(p, offset), alignment); - assert(r >= add(p, offset)); + assert_invariant(r >= add(p, offset)); return r; } @@ -90,20 +90,19 @@ class LinearAllocator { // branch-less allocation void* const p = pointermath::align(current(), alignment, extra); void* const c = pointermath::add(p, size); - bool success = c <= end(); + bool const success = c <= end(); set_current(success ? c : current()); return success ? p : nullptr; } // API specific to this allocator - void *getCurrent() UTILS_RESTRICT noexcept { return current(); } // free memory back to the specified point void rewind(void* p) UTILS_RESTRICT noexcept { - assert(p>=mBegin && p= mBegin && p < end()); set_current(p); } @@ -123,16 +122,21 @@ class LinearAllocator { void swap(LinearAllocator& rhs) noexcept; void *base() noexcept { return mBegin; } + void const *base() const noexcept { return mBegin; } void free(void*, size_t) UTILS_RESTRICT noexcept { } -private: +protected: void* end() UTILS_RESTRICT noexcept { return pointermath::add(mBegin, mSize); } + void const* end() const UTILS_RESTRICT noexcept { return pointermath::add(mBegin, mSize); } + void* current() UTILS_RESTRICT noexcept { return pointermath::add(mBegin, mCur); } + void const* current() const UTILS_RESTRICT noexcept { return pointermath::add(mBegin, mCur); } + +private: void set_current(void* p) UTILS_RESTRICT noexcept { mCur = uint32_t(uintptr_t(p) - uintptr_t(mBegin)); } - void* mBegin = nullptr; uint32_t mSize = 0; uint32_t mCur = 0; @@ -153,9 +157,7 @@ class HeapAllocator { explicit HeapAllocator(const AREA&) { } // our allocator concept - void* alloc(size_t size, size_t alignment = alignof(std::max_align_t), size_t extra = 0) { - // this allocator doesn't support 'extra' - assert(extra == 0); + void* alloc(size_t size, size_t alignment = alignof(std::max_align_t)) { return aligned_alloc(size, alignment); } @@ -172,6 +174,50 @@ class HeapAllocator { void swap(HeapAllocator&) noexcept { } }; +/* ------------------------------------------------------------------------------------------------ + * LinearAllocatorWithFallback + * + * This is a LinearAllocator that falls back to a HeapAllocator when allocation fail. The Heap + * allocator memory is freed only when the LinearAllocator is reset or destroyed. + * ------------------------------------------------------------------------------------------------ + */ +class LinearAllocatorWithFallback : private LinearAllocator, private HeapAllocator { + std::vector mHeapAllocations; +public: + LinearAllocatorWithFallback(void* begin, void* end) noexcept + : LinearAllocator(begin, end) { + } + + template + explicit LinearAllocatorWithFallback(const AREA& area) + : LinearAllocatorWithFallback(area.begin(), area.end()) { + } + + ~LinearAllocatorWithFallback() noexcept { + reset(); + } + + void* alloc(size_t size, size_t alignment = alignof(std::max_align_t)); + + void *getCurrent() noexcept { + return LinearAllocator::getCurrent(); + } + + void rewind(void* p) noexcept { + if (p >= base() && p < end()) { + LinearAllocator::rewind(p); + } + } + + void reset() noexcept; + + void free(void*, size_t) noexcept { } + + bool isHeapAllocation(void* p) const noexcept { + return p < base() || p >= end(); + } +}; + // ------------------------------------------------------------------------------------------------ class FreeList { @@ -187,13 +233,13 @@ class FreeList { Node* const head = mHead; mHead = head ? head->next : nullptr; // this could indicate a use after free - assert(!mHead || mHead >= mBegin && mHead < mEnd); + assert_invariant(!mHead || mHead >= mBegin && mHead < mEnd); return head; } void push(void* p) noexcept { - assert(p); - assert(p >= mBegin && p < mEnd); + assert_invariant(p); + assert_invariant(p >= mBegin && p < mEnd); // TODO: assert this is one of our pointer (i.e.: it's address match one of ours) Node* const head = static_cast(p); head->next = mHead; @@ -204,11 +250,11 @@ class FreeList { return mHead; } -private: struct Node { Node* next; }; +private: static Node* init(void* begin, void* end, size_t elementSize, size_t alignment, size_t extra) noexcept; @@ -226,59 +272,62 @@ class AtomicFreeList { AtomicFreeList() noexcept = default; AtomicFreeList(void* begin, void* end, size_t elementSize, size_t alignment, size_t extra) noexcept; - AtomicFreeList(const FreeList& rhs) = delete; - AtomicFreeList& operator=(const FreeList& rhs) = delete; + AtomicFreeList(const AtomicFreeList& rhs) = delete; + AtomicFreeList& operator=(const AtomicFreeList& rhs) = delete; void* pop() noexcept { - Node* const storage = mStorage; + Node* const pStorage = mStorage; - HeadPtr currentHead = mHead.load(); + HeadPtr currentHead = mHead.load(std::memory_order_relaxed); while (currentHead.offset >= 0) { - // The value of "next" we load here might already contain application data if another + // The value of "pNext" we load here might already contain application data if another // thread raced ahead of us. But in that case, the computed "newHead" will be discarded - // since compare_exchange_weak fails. Then this thread will loop with the updated + // since compare_exchange_weak() fails. Then this thread will loop with the updated // value of currentHead, and try again. - Node* const next = storage[currentHead.offset].next.load(std::memory_order_relaxed); - const HeadPtr newHead{ next ? int32_t(next - storage) : -1, currentHead.tag + 1 }; - // In the rare case that the other thread that raced ahead of us already returned the - // same mHead we just loaded, but it now has a different "next" value, the tag field will not - // match, and compare_exchange_weak will fail and prevent that particular race condition. - if (mHead.compare_exchange_weak(currentHead, newHead)) { + // TSAN complains if we don't use a local variable here. + Node const node = pStorage[currentHead.offset]; + Node const* const pNext = node.next; + const HeadPtr newHead{ pNext ? int32_t(pNext - pStorage) : -1, currentHead.tag + 1 }; + // In the rare case that the other thread that raced ahead of us already returned the + // same mHead we just loaded, but it now has a different "next" value, the tag field + // will not match, and compare_exchange_weak() will fail and prevent that particular + // race condition. + // acquire: no read/write can be reordered before this + if (mHead.compare_exchange_weak(currentHead, newHead, + std::memory_order_acquire, std::memory_order_relaxed)) { // This assert needs to occur after we have validated that there was no race condition // Otherwise, next might already contain application data, if another thread // raced ahead of us after we loaded mHead, but before we loaded mHead->next. - assert(!next || next >= storage); + assert_invariant(!pNext || pNext >= pStorage); break; } } - void* p = (currentHead.offset >= 0) ? (storage + currentHead.offset) : nullptr; - assert(!p || p >= storage); + void* p = (currentHead.offset >= 0) ? (pStorage + currentHead.offset) : nullptr; + assert_invariant(!p || p >= pStorage); return p; } void push(void* p) noexcept { Node* const storage = mStorage; - assert(p && p >= storage); + assert_invariant(p && p >= storage); Node* const node = static_cast(p); - HeadPtr currentHead = mHead.load(); + HeadPtr currentHead = mHead.load(std::memory_order_relaxed); HeadPtr newHead = { int32_t(node - storage), currentHead.tag + 1 }; do { newHead.tag = currentHead.tag + 1; - Node* const n = (currentHead.offset >= 0) ? (storage + currentHead.offset) : nullptr; - node->next.store(n, std::memory_order_relaxed); - } while(!mHead.compare_exchange_weak(currentHead, newHead)); + Node* const pNext = (currentHead.offset >= 0) ? (storage + currentHead.offset) : nullptr; + node->next = pNext; // could be a race with pop, corrected by CAS + } while(!mHead.compare_exchange_weak(currentHead, newHead, + std::memory_order_release, std::memory_order_relaxed)); + // release: no read/write can be reordered after this } void* getFirst() noexcept { return mStorage + mHead.load(std::memory_order_relaxed).offset; } -private: struct Node { - // This should be a regular (non-atomic) pointer, but this causes TSAN to complain - // about a data-race that exists but is benin. We always use this atomic<> in - // relaxed mode. - // The data race TSAN complains about is when a pop() is interrupted by a + // There is a benign data race when a pop() is interrupted by a // pop() + push() just after mHead->next is read -- it appears as though it is written // without synchronization (by the push), however in that case, the pop's CAS will fail // and things will auto-correct. @@ -301,9 +350,10 @@ class AtomicFreeList { // | // CAS, tag++ // - std::atomic next; + Node* next = nullptr; }; +private: // This struct is using a 32-bit offset into the arena rather than // a direct pointer, because together with the 32-bit tag, it needs to // fit into 8 bytes. If it was any larger, it would not be possible to @@ -326,14 +376,15 @@ template < size_t OFFSET = 0, typename FREELIST = FreeList> class PoolAllocator { - static_assert(ELEMENT_SIZE >= sizeof(void*), "ELEMENT_SIZE must accommodate at least a pointer"); + static_assert(ELEMENT_SIZE >= sizeof(typename FREELIST::Node), + "ELEMENT_SIZE must accommodate at least a FreeList::Node"); public: // our allocator concept void* alloc(size_t size = ELEMENT_SIZE, size_t alignment = ALIGNMENT, size_t offset = OFFSET) noexcept { - assert(size <= ELEMENT_SIZE); - assert(alignment <= ALIGNMENT); - assert(offset == OFFSET); + assert_invariant(size <= ELEMENT_SIZE); + assert_invariant(alignment <= ALIGNMENT); + assert_invariant(offset == OFFSET); return mFreeList.pop(); } @@ -347,7 +398,11 @@ class PoolAllocator { : mFreeList(begin, end, ELEMENT_SIZE, ALIGNMENT, OFFSET) { } - template + PoolAllocator(void* begin, size_t size) noexcept + : PoolAllocator(begin, static_cast(begin) + size) { + } + + template explicit PoolAllocator(const AREA& area) noexcept : PoolAllocator(area.begin(), area.end()) { } @@ -373,6 +428,53 @@ class PoolAllocator { FREELIST mFreeList; }; +template < + size_t ELEMENT_SIZE, + size_t ALIGNMENT = alignof(std::max_align_t), + typename FREELIST = FreeList> +class PoolAllocatorWithFallback : + private PoolAllocator, + private HeapAllocator { + using PoolAllocator = PoolAllocator; + void* mBegin; + void* mEnd; +public: + PoolAllocatorWithFallback(void* begin, void* end) noexcept + : PoolAllocator(begin, end), mBegin(begin), mEnd(end) { + } + + PoolAllocatorWithFallback(void* begin, size_t size) noexcept + : PoolAllocatorWithFallback(begin, static_cast(begin) + size) { + } + + template + explicit PoolAllocatorWithFallback(const AREA& area) noexcept + : PoolAllocatorWithFallback(area.begin(), area.end()) { + } + + bool isHeapAllocation(void* p) const noexcept { + return p < mBegin || p >= mEnd; + } + + // our allocator concept + void* alloc(size_t size = ELEMENT_SIZE, size_t alignment = ALIGNMENT) noexcept { + void* p = PoolAllocator::alloc(size, alignment); + if (UTILS_UNLIKELY(!p)) { + p = HeapAllocator::alloc(size, alignment); + } + assert_invariant(p); + return p; + } + + void free(void* p, size_t size) noexcept { + if (UTILS_LIKELY(!isHeapAllocation(p))) { + PoolAllocator::free(p, size); + } else { + HeapAllocator::free(p); + } + } +}; + #define UTILS_MAX(a,b) ((a) > (b) ? (a) : (b)) template @@ -478,7 +580,6 @@ struct NoLock { void unlock() noexcept { } }; -using SpinLock = utils::SpinLock; using Mutex = utils::Mutex; } // namespace LockingPolicy @@ -587,32 +688,54 @@ class Arena { mListener(name, mArea.data(), mArea.size()) { } + template + void* alloc(size_t size, size_t alignment, size_t extra, ARGS&& ... args) noexcept { + std::lock_guard guard(mLock); + void* p = mAllocator.alloc(size, alignment, extra, std::forward(args) ...); + mListener.onAlloc(p, size, alignment, extra); + return p; + } + + // allocate memory from arena with given size and alignment // (acceptable size/alignment may depend on the allocator provided) - void* alloc(size_t size, size_t alignment = alignof(std::max_align_t), size_t extra = 0) noexcept { + void* alloc(size_t size, size_t alignment, size_t extra) noexcept { std::lock_guard guard(mLock); void* p = mAllocator.alloc(size, alignment, extra); mListener.onAlloc(p, size, alignment, extra); return p; } + void* alloc(size_t size, size_t alignment = alignof(std::max_align_t)) noexcept { + std::lock_guard guard(mLock); + void* p = mAllocator.alloc(size, alignment); + mListener.onAlloc(p, size, alignment, 0); + return p; + } + // Allocate an array of trivially destructible objects // for safety, we disable the object-based alloc method if the object type is not // trivially destructible, since free() won't call the destructor and this is allocating // an array. template ::value>::type> - T* alloc(size_t count, size_t alignment = alignof(T), size_t extra = 0) noexcept { + T* alloc(size_t count, size_t alignment, size_t extra) noexcept { return (T*)alloc(count * sizeof(T), alignment, extra); } - // return memory pointed by p to the arena - // (actual behaviour may depend on allocator provided) - void free(void* p) noexcept { + template ::value>::type> + T* alloc(size_t count, size_t alignment = alignof(T)) noexcept { + return (T*)alloc(count * sizeof(T), alignment); + } + + // some allocators require more parameters + template + void free(void* p, size_t size, ARGS&& ... args) noexcept { if (p) { std::lock_guard guard(mLock); - mListener.onFree(p); - mAllocator.free(p); + mListener.onFree(p, size); + mAllocator.free(p, size, std::forward(args) ...); } } @@ -625,6 +748,16 @@ class Arena { } } + // return memory pointed by p to the arena + // (actual behaviour may depend on allocator provided) + void free(void* p) noexcept { + if (p) { + std::lock_guard guard(mLock); + mListener.onFree(p); + mAllocator.free(p); + } + } + // some allocators don't have a free() call, but a single reset() or rewind() instead void reset() noexcept { std::lock_guard guard(mLock); @@ -722,6 +855,8 @@ class ArenaScope { } public: + using Arena = ARENA; + explicit ArenaScope(ARENA& allocator) : mArena(allocator), mRewind(allocator.getCurrent()) { } @@ -773,7 +908,7 @@ class ArenaScope { } // use with caution - ARENA& getAllocator() noexcept { return mArena; } + ARENA& getArena() noexcept { return mArena; } private: ARENA& mArena; @@ -800,7 +935,7 @@ class STLAllocator { public: // we don't make this explicit, so that we can initialize a vector using a STLAllocator - // from an Arena, avoiding to have to repeat the vector type. + // from an Arena, avoiding having to repeat the vector type. STLAllocator(ARENA& arena) : mArena(arena) { } // NOLINT(google-explicit-constructor) template diff --git a/libs/utils/include/utils/BitmaskEnum.h b/libs/utils/include/utils/BitmaskEnum.h index 1efa3941954..17f94d215be 100644 --- a/libs/utils/include/utils/BitmaskEnum.h +++ b/libs/utils/include/utils/BitmaskEnum.h @@ -17,13 +17,10 @@ #ifndef TNT_UTILS_BITMASKENUM_H #define TNT_UTILS_BITMASKENUM_H -#include - #include // for std::false_type #include #include -#include namespace utils { @@ -141,5 +138,4 @@ inline constexpr bool any(Enum lhs) noexcept { return !none(lhs); } - #endif // TNT_UTILS_BITMASKENUM_H diff --git a/libs/utils/include/utils/CString.h b/libs/utils/include/utils/CString.h index 46a823b4c13..9db39bc73fb 100644 --- a/libs/utils/include/utils/CString.h +++ b/libs/utils/include/utils/CString.h @@ -20,6 +20,7 @@ // NOTE: this header should not include STL headers #include +#include #include #include @@ -35,7 +36,7 @@ struct hashCStrings { typedef size_t result_type; result_type operator()(argument_type cstr) const noexcept { size_t hash = 5381; - while (int c = *cstr++) { + while (int const c = *cstr++) { hash = (hash * 33u) ^ size_t(c); } return hash; @@ -181,6 +182,10 @@ class UTILS_PUBLIC CString { }; private: +#if !defined(NDEBUG) + friend io::ostream& operator<<(io::ostream& out, const CString& rhs); +#endif + struct Data { size_type length; }; @@ -192,8 +197,8 @@ class UTILS_PUBLIC CString { }; int compare(const CString& rhs) const noexcept { - size_type lhs_size = size(); - size_type rhs_size = rhs.size(); + size_type const lhs_size = size(); + size_type const rhs_size = rhs.size(); if (lhs_size < rhs_size) return -1; if (lhs_size > rhs_size) return 1; return strncmp(data(), rhs.data(), size()); @@ -225,6 +230,28 @@ class UTILS_PUBLIC CString { template CString to_string(T value) noexcept; +// ------------------------------------------------------------------------------------------------ + +template +class UTILS_PUBLIC FixedSizeString { +public: + using value_type = char; + using pointer = value_type*; + using const_pointer = const value_type*; + static_assert(N > 0); + + FixedSizeString() noexcept = default; + explicit FixedSizeString(const char* str) noexcept { + strncpy(mData, str, N - 1); // leave room for the null terminator + } + + const_pointer c_str() const noexcept { return mData; } + pointer c_str() noexcept { return mData; } + +private: + value_type mData[N] = {0}; +}; + } // namespace utils #endif // TNT_UTILS_CSTRING_H diff --git a/libs/utils/include/utils/CallStack.h b/libs/utils/include/utils/CallStack.h index 291a748ce44..fa7ff72777b 100644 --- a/libs/utils/include/utils/CallStack.h +++ b/libs/utils/include/utils/CallStack.h @@ -22,7 +22,8 @@ #include #include -#include +#include +#include namespace utils { @@ -67,10 +68,10 @@ class CallStack { intptr_t operator [](size_t index) const; /** Demangles a C++ type name */ - static utils::CString demangleTypeName(const char* mangled); + static CString demangleTypeName(const char* mangled); template - static utils::CString typeName() { + static CString typeName() { #if UTILS_HAS_RTTI return demangleTypeName(typeid(T).name()); #else @@ -83,7 +84,7 @@ class CallStack { * This will print, when possible, the demangled names of functions corresponding to the * program-counter recorded. */ - friend utils::io::ostream& operator <<(utils::io::ostream& stream, const CallStack& callstack); + friend io::ostream& operator <<(io::ostream& stream, const CallStack& callstack); bool operator <(const CallStack& rhs) const; @@ -110,7 +111,7 @@ class CallStack { private: void update_gcc(size_t ignore) noexcept; - static utils::CString demangle(const char* mangled); + static CString demangle(const char* mangled); static constexpr size_t NUM_FRAMES = 20; diff --git a/libs/utils/include/utils/CountDownLatch.h b/libs/utils/include/utils/CountDownLatch.h index 6367fffc7bc..62c3110f046 100644 --- a/libs/utils/include/utils/CountDownLatch.h +++ b/libs/utils/include/utils/CountDownLatch.h @@ -17,12 +17,13 @@ #ifndef TNT_UTILS_COUNTDOWNLATCH_H #define TNT_UTILS_COUNTDOWNLATCH_H -#include - // note: we use our version of mutex/condition to keep this public header STL free #include #include +#include +#include + namespace utils { /** diff --git a/libs/utils/include/utils/EntityInstance.h b/libs/utils/include/utils/EntityInstance.h index b164ed3fb2e..75419493fed 100644 --- a/libs/utils/include/utils/EntityInstance.h +++ b/libs/utils/include/utils/EntityInstance.h @@ -23,7 +23,6 @@ #include - namespace utils { class UTILS_PUBLIC EntityInstanceBase { @@ -77,7 +76,7 @@ class UTILS_PUBLIC EntityInstance : public EntityInstanceBase { // return a value for this Instance (mostly needed for debugging constexpr uint32_t asValue() const noexcept { return mInstance; } - // auto convert to Type so it can be used as an index + // auto convert to Type, so it can be used as an index constexpr operator Type() const noexcept { return mInstance; } // NOLINT(google-explicit-constructor) // conversion from Type so we can initialize from an index diff --git a/libs/utils/include/utils/EntityManager.h b/libs/utils/include/utils/EntityManager.h index 9674cac2554..5e2eaa1b00c 100644 --- a/libs/utils/include/utils/EntityManager.h +++ b/libs/utils/include/utils/EntityManager.h @@ -17,12 +17,13 @@ #ifndef TNT_UTILS_ENTITYMANAGER_H #define TNT_UTILS_ENTITYMANAGER_H -#include -#include - #include #include +#include +#include +#include + #ifndef FILAMENT_UTILS_TRACK_ENTITIES #define FILAMENT_UTILS_TRACK_ENTITIES false #endif @@ -44,23 +45,25 @@ class UTILS_PUBLIC EntityManager { public: virtual void onEntitiesDestroyed(size_t n, Entity const* entities) noexcept = 0; protected: - ~Listener() noexcept; + virtual ~Listener() noexcept; }; - // maximum number of entities that can exist at the same time static size_t getMaxEntityCount() noexcept { // because index 0 is reserved, we only have 2^GENERATION_SHIFT - 1 valid indices return RAW_INDEX_COUNT - 1; } - // create n entities. Thread safe. + // number of active Entities + size_t getEntityCount() const noexcept; + + // Create n entities. Thread safe. void create(size_t n, Entity* entities); // destroys n entities. Thread safe. void destroy(size_t n, Entity* entities) noexcept; - // create a new Entity. Thread safe. + // Create a new Entity. Thread safe. // Return Entity.isNull() if the entity cannot be allocated. Entity create() { Entity e; @@ -68,20 +71,20 @@ class UTILS_PUBLIC EntityManager { return e; } - // destroys an Entity. Thread safe. + // Destroys an Entity. Thread safe. void destroy(Entity e) noexcept { destroy(1, &e); } - // return whether the given Entity has been destroyed (false) or not (true). + // Return whether the given Entity has been destroyed (false) or not (true). // Thread safe. bool isAlive(Entity e) const noexcept { assert(getIndex(e) < RAW_INDEX_COUNT); return (!e.isNull()) && (getGeneration(e) == mGens[getIndex(e)]); } - // registers a listener to be called when an entity is destroyed. thread safe. - // if the listener is already register, this method has no effect. + // Registers a listener to be called when an entity is destroyed. Thread safe. + // If the listener is already registered, this method has no effect. void registerListener(Listener* l) noexcept; // unregisters a listener. @@ -94,6 +97,7 @@ class UTILS_PUBLIC EntityManager { uint8_t getGenerationForIndex(size_t index) const noexcept { return mGens[index]; } + // singleton, can't be copied EntityManager(const EntityManager& rhs) = delete; EntityManager& operator=(const EntityManager& rhs) = delete; diff --git a/libs/utils/include/utils/FixedCapacityVector.h b/libs/utils/include/utils/FixedCapacityVector.h index 540b42b21d7..e45916aed3b 100644 --- a/libs/utils/include/utils/FixedCapacityVector.h +++ b/libs/utils/include/utils/FixedCapacityVector.h @@ -17,16 +17,18 @@ #ifndef TNT_UTILS_FIXEDCAPACITYVECTOR_H #define TNT_UTILS_FIXEDCAPACITYVECTOR_H +#include #include #include #include +#include #include #include #include #include -#include // TODO: is this necessary? +#include #include #include @@ -82,7 +84,7 @@ class UTILS_PUBLIC FixedCapacityVector { FixedCapacityVector() = default; explicit FixedCapacityVector(const allocator_type& allocator) noexcept - : mCapacityAllocator({}, allocator) { + : mCapacityAllocator(0, allocator) { } explicit FixedCapacityVector(size_type size, const allocator_type& allocator = allocator_type()) @@ -297,6 +299,16 @@ class UTILS_PUBLIC FixedCapacityVector { } } + UTILS_NOINLINE + void shrink_to_fit() { + if (size() < capacity()) { + FixedCapacityVector t(construct_with_capacity, size(), allocator()); + t.mSize = size(); + std::uninitialized_move(begin(), end(), t.begin()); + this->swap(t); + } + } + private: enum construct_with_capacity_tag{ construct_with_capacity }; @@ -316,9 +328,9 @@ class UTILS_PUBLIC FixedCapacityVector { iterator assertCapacityForSize(size_type s) { if constexpr(CapacityCheck || FILAMENT_FORCE_CAPACITY_CHECK) { - ASSERT_PRECONDITION(capacity() >= s, - "capacity exceeded: requested size %lu, available capacity %lu.", - (unsigned long)s, (unsigned long)capacity()); + FILAMENT_CHECK_PRECONDITION(capacity() >= s) + << "capacity exceeded: requested size " << (unsigned long)s + << "u, available capacity " << (unsigned long)capacity() << "u."; } return end(); } diff --git a/libs/utils/include/utils/FixedCircularBuffer.h b/libs/utils/include/utils/FixedCircularBuffer.h new file mode 100644 index 00000000000..dd3cb75a327 --- /dev/null +++ b/libs/utils/include/utils/FixedCircularBuffer.h @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef TNT_UTILS_FIXEDCIRCULARBUFFER_H +#define TNT_UTILS_FIXEDCIRCULARBUFFER_H + +#include + +#include +#include +#include + +#include + +namespace utils { + +template +class FixedCircularBuffer { +public: + explicit FixedCircularBuffer(size_t capacity) + : mData(std::make_unique(capacity)), mCapacity(capacity) {} + + size_t size() const noexcept { return mSize; } + size_t capacity() const noexcept { return mCapacity; } + bool full() const noexcept { return mCapacity > 0 && mSize == mCapacity; } + bool empty() const noexcept { return mSize == 0; } + + /** + * Push v into the buffer. If the buffer is already full, removes the oldest item and returns + * it. If this buffer has no capacity, simply returns v. + * @param v the new value to push into the buffer + * @return if the buffer was full, the oldest value which was displaced + */ + std::optional push(T v) noexcept { + if (mCapacity == 0) { + return v; + } + std::optional displaced = full() ? pop() : std::optional{}; + mData[mEnd] = v; + mEnd = (mEnd + 1) % mCapacity; + mSize++; + return displaced; + } + + T pop() noexcept { + assert_invariant(mSize > 0); + T result = mData[mBegin]; + mBegin = (mBegin + 1) % mCapacity; + mSize--; + return result; + } + +private: + std::unique_ptr mData; + + size_t mBegin = 0; + size_t mEnd = 0; + size_t mSize = 0; + size_t mCapacity; +}; + +} // namespace utils + +#endif // TNT_UTILS_FIXEDCIRCULARBUFFER_H diff --git a/libs/utils/include/utils/Hash.h b/libs/utils/include/utils/Hash.h index f17dfc86553..c269bb7e83e 100644 --- a/libs/utils/include/utils/Hash.h +++ b/libs/utils/include/utils/Hash.h @@ -18,12 +18,19 @@ #define TNT_UTILS_HASH_H #include // for std::hash +#include +#include #include #include namespace utils::hash { +inline size_t combine(size_t lhs, size_t rhs) noexcept { + std::pair const p{ lhs, rhs }; + return std::hash{}({ (char*)&p, sizeof(p) }); +} + // Hash function that takes an arbitrary swath of word-aligned data. inline uint32_t murmur3(const uint32_t* key, size_t wordCount, uint32_t seed) noexcept { uint32_t h = seed; @@ -53,7 +60,7 @@ inline uint32_t murmurSlow(const uint8_t* key, size_t byteCount, uint32_t seed) // The remainder is identical to murmur3() except an inner loop safely "reads" an entire word. uint32_t h = seed; - size_t i = wordCount; + size_t wc = wordCount; do { uint32_t k = 0; for (int i = 0; i < 4 && key < last; ++i, ++key) { @@ -66,7 +73,7 @@ inline uint32_t murmurSlow(const uint8_t* key, size_t byteCount, uint32_t seed) h ^= k; h = (h << 13u) | (h >> 19u); h = (h * 5u) + 0xe6546b64u; - } while (--i); + } while (--wc); h ^= wordCount; h ^= h >> 16u; h *= 0x85ebca6bu; diff --git a/libs/utils/include/utils/Invocable.h b/libs/utils/include/utils/Invocable.h index 49b43071813..2243e7872c3 100644 --- a/libs/utils/include/utils/Invocable.h +++ b/libs/utils/include/utils/Invocable.h @@ -17,6 +17,8 @@ #ifndef TNT_UTILS_INVOKABLE_H #define TNT_UTILS_INVOKABLE_H +#include + #include #include @@ -81,6 +83,11 @@ class Invocable { explicit operator bool() const noexcept; private: +#if !defined(NDEBUG) + friend io::ostream& operator<<(io::ostream& out, const Invocable&) { + return out << "Invocable<>"; // TODO: is there a way to do better here? + } +#endif void* mInvocable = nullptr; void (*mDeleter)(void*) = nullptr; R (* mInvoker)(void*, Args...) = nullptr; diff --git a/libs/utils/include/utils/JobSystem.h b/libs/utils/include/utils/JobSystem.h index e935f32a07a..a2131b4738a 100644 --- a/libs/utils/include/utils/JobSystem.h +++ b/libs/utils/include/utils/JobSystem.h @@ -17,37 +17,50 @@ #ifndef TNT_UTILS_JOBSYSTEM_H #define TNT_UTILS_JOBSYSTEM_H -#include - -#include -#include -#include -#include - -#include - #include #include #include #include -#include +#include #include #include #include +#include #include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + namespace utils { class JobSystem { - static constexpr size_t MAX_JOB_COUNT = 16384; + static constexpr size_t MAX_JOB_COUNT = 1 << 14; // 16384 + static constexpr uint32_t JOB_COUNT_MASK = MAX_JOB_COUNT - 1; + static constexpr uint32_t WAITER_COUNT_SHIFT = 24; static_assert(MAX_JOB_COUNT <= 0x7FFE, "MAX_JOB_COUNT must be <= 0x7FFE"); using WorkQueue = WorkStealingDequeue; + using Mutex = utils::Mutex; + using Condition = utils::Condition; public: class Job; + using ThreadId = uint8_t; + using JobFunc = void(*)(void*, JobSystem&, Job*); + static constexpr ThreadId invalidThreadId = 0xff; + class alignas(CACHELINE_SIZE) Job { public: Job() noexcept {} /* = default; */ /* clang bug */ // NOLINT(modernize-use-equals-default,cppcoreguidelines-pro-type-member-init) @@ -70,12 +83,18 @@ class JobSystem { void* storage[JOB_STORAGE_SIZE_WORDS]; // 48 | 48 JobFunc function; // 4 | 8 uint16_t parent; // 2 | 2 - std::atomic runningJobCount = { 1 }; // 2 | 2 - mutable std::atomic refCount = { 1 }; // 2 | 2 - // 6 | 2 (padding) + mutable ThreadId id = invalidThreadId; // 1 | 1 + mutable std::atomic refCount = { 1 }; // 1 | 1 + std::atomic runningJobCount = { 1 }; // 4 | 4 + // 4 | 0 (padding) // 64 | 64 }; +#ifndef WIN32 + // on windows std::function is bigger and forces the whole structure to be larger + static_assert(sizeof(Job) == 64); +#endif + explicit JobSystem(size_t threadCount = 0, size_t adoptableThreadsCount = 1) noexcept; ~JobSystem(); @@ -169,8 +188,9 @@ class JobSystem { // the caller must ensure the object will outlive the Job template Job* createJob(Job* parent, T* data) noexcept { - Job* job = create(parent, [](void* user, JobSystem& js, Job* job) { - (*static_cast(user)->*method)(js, job); + Job* job = create(parent, +[](void* storage, JobSystem& js, Job* job) { + T* const that = static_cast(reinterpret_cast(storage)[0]); + (that->*method)(js, job); }); if (job) { job->storage[0] = data; @@ -182,8 +202,8 @@ class JobSystem { template Job* createJob(Job* parent, T data) noexcept { static_assert(sizeof(data) <= sizeof(Job::storage), "user data too large"); - Job* job = create(parent, [](void* user, JobSystem& js, Job* job) { - T* that = static_cast(user); + Job* job = create(parent, [](void* storage, JobSystem& js, Job* job) { + T* const that = static_cast(storage); (that->*method)(js, job); that->~T(); }); @@ -193,14 +213,29 @@ class JobSystem { return job; } + // creates a job from a KNOWN method pointer w/ object passed by value + template + Job* emplaceJob(Job* parent, ARGS&& ... args) noexcept { + static_assert(sizeof(T) <= sizeof(Job::storage), "user data too large"); + Job* job = create(parent, [](void* storage, JobSystem& js, Job* job) { + T* const that = static_cast(storage); + (that->*method)(js, job); + that->~T(); + }); + if (job) { + new(job->storage) T(std::forward(args)...); + } + return job; + } + // creates a job from a functor passed by value template Job* createJob(Job* parent, T functor) noexcept { static_assert(sizeof(functor) <= sizeof(Job::storage), "functor too large"); - Job* job = create(parent, [](void* user, JobSystem& js, Job* job){ - T& that = *static_cast(user); - that(js, job); - that.~T(); + Job* job = create(parent, [](void* storage, JobSystem& js, Job* job){ + T* const that = static_cast(storage); + that->operator()(js, job); + that->~T(); }); if (job) { new(job->storage) T(std::move(functor)); @@ -208,6 +243,21 @@ class JobSystem { return job; } + // creates a job from a functor passed by value + template + Job* emplaceJob(Job* parent, ARGS&& ... args) noexcept { + static_assert(sizeof(T) <= sizeof(Job::storage), "functor too large"); + Job* job = create(parent, [](void* storage, JobSystem& js, Job* job){ + T* const that = static_cast(storage); + that->operator()(js, job); + that->~T(); + }); + if (job) { + new(job->storage) T(std::forward(args)...); + } + return job; + } + /* * Jobs are normally finished automatically, this can be used to cancel a job before it is run. @@ -224,7 +274,7 @@ class JobSystem { * * This job MUST BE waited on with waitAndRelease(), or released with release(). */ - Job* retain(Job* job) noexcept; + static Job* retain(Job* job) noexcept; /* * Releases a reference from a Job obtained with runAndRetain() or a call to retain(). @@ -238,8 +288,8 @@ class JobSystem { } /* - * Add job to this thread's execution queue. It's reference will drop automatically. - * Current thread must be owned by JobSystem's thread pool. See adopt(). + * Add job to this thread's execution queue. Its reference will drop automatically. + * The current thread must be owned by JobSystem's thread pool. See adopt(). * * The job can't be used after this call. */ @@ -249,11 +299,23 @@ class JobSystem { run(p); } - void signal() noexcept; + /* + * Add job to this thread's execution queue. Its reference will drop automatically. + * The current thread must be owned by JobSystem's thread pool. See adopt(). + * id must be the current thread id obtained with JobSystem::getThreadId(Job*). This + * API is more efficient than the methods above. + * + * The job can't be used after this call. + */ + void run(Job*& job, ThreadId id) noexcept; + void run(Job*&& job, ThreadId id) noexcept { // allows run(createJob(...)); + Job* p = job; + run(p, id); + } /* - * Add job to this thread's execution queue and and keep a reference to it. - * Current thread must be owned by JobSystem's thread pool. See adopt(). + * Add job to this thread's execution queue and keep a reference to it. + * The current thread must be owned by JobSystem's thread pool. See adopt(). * * This job MUST BE waited on with wait(), or released with release(). */ @@ -261,7 +323,7 @@ class JobSystem { /* * Wait on a job and destroys it. - * Current thread must be owned by JobSystem's thread pool. See adopt(). + * The current thread must be owned by JobSystem's thread pool. See adopt(). * * The job must first be obtained from runAndRetain() or retain(). * The job can't be used after this call. @@ -282,7 +344,7 @@ class JobSystem { } // for debugging - friend utils::io::ostream& operator << (utils::io::ostream& out, JobSystem const& js); + friend io::ostream& operator << (io::ostream& out, JobSystem const& js); // utility functions... @@ -293,7 +355,8 @@ class JobSystem { enum class Priority { NORMAL, DISPLAY, - URGENT_DISPLAY + URGENT_DISPLAY, + BACKGROUND }; static void setThreadPriority(Priority priority) noexcept; @@ -305,12 +368,29 @@ class JobSystem { size_t getThreadCount() const { return mThreadCount; } + // returns the current ThreadId, which can be used with run(). This method can only be + // called from a job's function. + static ThreadId getThreadId(Job const* job) noexcept { + assert_invariant(job->id != invalidThreadId); + return job->id; + } + private: // this is just to avoid using std::default_random_engine, since we're in a public header. class default_random_engine { static constexpr uint32_t m = 0x7fffffffu; uint32_t mState; // must be 0 < seed < 0x7fffffff public: + using result_type = uint32_t; + + static constexpr result_type min() noexcept { + return 1; + } + + static constexpr result_type max() noexcept { + return m - 1; + } + inline constexpr explicit default_random_engine(uint32_t seed = 1u) noexcept : mState(((seed % m) == 0u) ? 1u : seed % m) { } @@ -324,11 +404,10 @@ class JobSystem { WorkQueue workQueue; // these are not accessed by the worker threads - alignas(CACHELINE_SIZE) // this causes 56-bytes padding - JobSystem* js; - std::thread thread; + alignas(CACHELINE_SIZE) // this causes 56-bytes padding + JobSystem* js; // this is in fact const and always initialized + std::thread thread; // unused for adopted threads default_random_engine rndGen; - uint32_t id; }; static_assert(sizeof(ThreadState) % CACHELINE_SIZE == 0, @@ -336,41 +415,43 @@ class JobSystem { ThreadState& getState() noexcept; - void incRef(Job const* job) noexcept; + static void incRef(Job const* job) noexcept; void decRef(Job const* job) noexcept; Job* allocateJob() noexcept; - JobSystem::ThreadState* getStateToStealFrom(JobSystem::ThreadState& state) noexcept; - bool hasJobCompleted(Job const* job) noexcept; + ThreadState* getStateToStealFrom(ThreadState& state) noexcept; + static bool hasJobCompleted(Job const* job) noexcept; void requestExit() noexcept; bool exitRequested() const noexcept; bool hasActiveJobs() const noexcept; void loop(ThreadState* state) noexcept; - bool execute(JobSystem::ThreadState& state) noexcept; - Job* steal(JobSystem::ThreadState& state) noexcept; + bool execute(ThreadState& state) noexcept; + Job* steal(ThreadState& state) noexcept; void finish(Job* job) noexcept; void put(WorkQueue& workQueue, Job* job) noexcept; Job* pop(WorkQueue& workQueue) noexcept; Job* steal(WorkQueue& workQueue) noexcept; - void wait(std::unique_lock& lock, Job* job = nullptr) noexcept; + [[nodiscard]] + uint32_t wait(std::unique_lock& lock, Job* job) noexcept; + void wait(std::unique_lock& lock) noexcept; void wakeAll() noexcept; void wakeOne() noexcept; // these have thread contention, keep them together - utils::Mutex mWaiterLock; - utils::Condition mWaiterCondition; + Mutex mWaiterLock; + Condition mWaiterCondition; - std::atomic mActiveJobs = { 0 }; - utils::Arena, LockingPolicy::NoLock> mJobPool; + std::atomic mActiveJobs = { 0 }; + Arena, LockingPolicy::Mutex> mJobPool; template - using aligned_vector = std::vector>; + using aligned_vector = std::vector>; - // these are essentially const, make sure they're on a different cache-lines than the + // These are essentially const, make sure they're on a different cache-lines than the // read-write atomics. // We can't use "alignas(CACHELINE_SIZE)" because the standard allocator can't make this // guarantee. @@ -385,7 +466,7 @@ class JobSystem { uint8_t mParallelSplitCount = 0; // # of split allowable in parallel_for Job* mRootJob = nullptr; - utils::SpinLock mThreadMapLock; // this should have very little contention + Mutex mThreadMapLock; // this should have very little contention tsl::robin_map mThreadMap; }; @@ -403,12 +484,13 @@ template JobSystem::Job* createJob(JobSystem& js, JobSystem::Job* parent, CALLABLE&& func, ARGS&&... args) noexcept { struct Data { + explicit Data(std::function f) noexcept: f(std::move(f)) {} std::function f; // Renaming the method below could cause an Arrested Development. void gob(JobSystem&, JobSystem::Job*) noexcept { f(); } - } user{ std::bind(std::forward(func), - std::forward(args)...) }; - return js.createJob(parent, std::move(user)); + }; + return js.emplaceJob(parent, + std::bind(std::forward(func), std::forward(args)...)); } template f) noexcept: f(std::move(f)) {} std::function f; // Renaming the method below could cause an Arrested Development. void gob(JobSystem&, JobSystem::Job*) noexcept { f(); } - } user{ std::bind(std::forward(func), std::forward(o), - std::forward(args)...) }; - return js.createJob(parent, std::move(user)); + }; + return js.emplaceJob(parent, + std::bind(std::forward(func), std::forward(o), std::forward(args)...)); } @@ -453,8 +536,8 @@ struct ParallelForJobData { right_side: if (splitter.split(splits, count)) { const size_type lc = count / 2; - JobData ld(start, lc, splits + uint8_t(1), functor, splitter); - JobSystem::Job* l = js.createJob(parent, std::move(ld)); + JobSystem::Job* l = js.emplaceJob(parent, + start, lc, splits + uint8_t(1), functor, splitter); if (UTILS_UNLIKELY(l == nullptr)) { // couldn't create a job, just pretend we're done splitting goto execute; @@ -462,7 +545,7 @@ struct ParallelForJobData { // start the left side before attempting the right side, so we parallelize in case // of job creation failure -- rare, but still. - js.run(l); + js.run(l, JobSystem::getThreadId(parent)); // don't spawn a job for the right side, just reuse us -- spawning jobs is more // costly than we'd like. @@ -494,8 +577,8 @@ template JobSystem::Job* parallel_for(JobSystem& js, JobSystem::Job* parent, uint32_t start, uint32_t count, F functor, const S& splitter) noexcept { using JobData = details::ParallelForJobData; - JobData jobData(start, count, 0, std::move(functor), splitter); - return js.createJob(parent, std::move(jobData)); + return js.emplaceJob(parent, + start, count, 0, std::move(functor), splitter); } // parallel jobs with pointer/count @@ -506,19 +589,19 @@ JobSystem::Job* parallel_for(JobSystem& js, JobSystem::Job* parent, f(data + s, c); }; using JobData = details::ParallelForJobData; - JobData jobData(0, count, 0, std::move(user), splitter); - return js.createJob(parent, std::move(jobData)); + return js.emplaceJob(parent, + 0, count, 0, std::move(user), splitter); } // parallel jobs on a Slice<> template JobSystem::Job* parallel_for(JobSystem& js, JobSystem::Job* parent, - utils::Slice slice, F functor, const S& splitter) noexcept { + Slice slice, F functor, const S& splitter) noexcept { return parallel_for(js, parent, slice.data(), slice.size(), functor, splitter); } -template +template class CountSplitter { public: bool split(size_t splits, size_t count) const noexcept { diff --git a/libs/utils/include/utils/NameComponentManager.h b/libs/utils/include/utils/NameComponentManager.h index 9e31e4618de..403cc011a8d 100644 --- a/libs/utils/include/utils/NameComponentManager.h +++ b/libs/utils/include/utils/NameComponentManager.h @@ -24,7 +24,6 @@ #include #include -#include namespace utils { @@ -48,7 +47,7 @@ class EntityManager; * printf("%s\n", names->getName(names->getInstance(myEntity)); * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -class UTILS_PUBLIC NameComponentManager : public SingleInstanceComponentManager { +class UTILS_PUBLIC NameComponentManager : private SingleInstanceComponentManager { public: using Instance = EntityInstance; @@ -75,15 +74,6 @@ class UTILS_PUBLIC NameComponentManager : public SingleInstanceComponentManager< return { SingleInstanceComponentManager::getInstance(e) }; } - /*! \cond PRIVATE */ - // these are implemented in SingleInstanceComponentManager<>, but we need to - // reimplement them in each manager, to ensure they are generated in an implementation file - // for backward binary compatibility reasons. - size_t getComponentCount() const noexcept; - Entity const* getEntities() const noexcept; - void gc(const EntityManager& em, size_t ratio = 4) noexcept; - /*! \endcond */ - /** * Adds a name component to the given entity if it doesn't already exist. */ @@ -105,6 +95,12 @@ class UTILS_PUBLIC NameComponentManager : public SingleInstanceComponentManager< * @return pointer to the copy that was made during setName() */ const char* getName(Instance instance) const noexcept; + + void gc(EntityManager& em) noexcept { + SingleInstanceComponentManager::gc(em, [this](Entity e) { + removeComponent(e); + }); + } }; } // namespace utils diff --git a/libs/utils/include/utils/Panic.h b/libs/utils/include/utils/Panic.h index df24cac2388..6e9ac3f494e 100644 --- a/libs/utils/include/utils/Panic.h +++ b/libs/utils/include/utils/Panic.h @@ -17,14 +17,28 @@ #ifndef TNT_UTILS_PANIC_H #define TNT_UTILS_PANIC_H -#include +#ifdef FILAMENT_PANIC_USES_ABSL +# if FILAMENT_PANIC_USES_ABSL +# include "absl/log/log.h" +# define FILAMENT_CHECK_PRECONDITION CHECK +# define FILAMENT_CHECK_POSTCONDITION CHECK +# define FILAMENT_CHECK_ARITHMETIC CHECK +# endif +#endif #include #include +#include + +#include +#include #ifdef __EXCEPTIONS # define UTILS_EXCEPTIONS 1 #else +# ifdef UTILS_EXCEPTIONS +# error UTILS_EXCEPTIONS is already defined! +# endif #endif /** @@ -250,42 +264,83 @@ namespace utils { */ class UTILS_PUBLIC Panic { public: + + using PanicHandlerCallback = void(*)(void* user, Panic const& panic); + + /** + * Sets a user-defined handler for the Panic. If exceptions are enabled, the concrete Panic + * object will be thrown upon return; moreover it is acceptable to throw from the provided + * callback, but it is unsafe to throw the Panic object itself, since it's just an interface. + * It is also acceptable to abort from the callback. If exceptions are not enabled, std::abort() + * will be automatically called upon return. + * + * The PanicHandlerCallback can be called from any thread. + * + * Caveat: this API can misbehave if is used as a static library in multiple translation units, + * some of these translation units might not see the callback. + * + * @param handler pointer to the user defined handler for the Panic + * @param user user pointer given back to the callback + */ + static void setPanicHandler(PanicHandlerCallback handler, void* user) noexcept; + + virtual ~Panic() noexcept; /** - * @return a detailed description of the error + * @return a formatted and detailed description of the error including all available + * information. * @see std::exception */ virtual const char* what() const noexcept = 0; /** - * Get the function name where the panic was detected + * Get the type of the panic (e.g. "Precondition") + * @return a C string containing the type of panic + */ + virtual const char* getType() const noexcept = 0; + + /** + * Get the reason string for the panic + * @return a C string containing the reason for the panic + */ + virtual const char* getReason() const noexcept = 0; + + /** + * Get a version of the reason string that is guaranteed to be constructed from literal + * strings only; it will contain no runtime information. + */ + virtual const char* getReasonLiteral() const noexcept = 0; + + /** + * Get the function name where the panic was detected. On debug build the fully qualified + * function name is returned; on release builds only the function name is. * @return a C string containing the function name where the panic was detected */ virtual const char* getFunction() const noexcept = 0; /** - * Get the file name where the panic was detected + * Get the file name where the panic was detected. Only available on debug builds. * @return a C string containing the file name where the panic was detected */ virtual const char* getFile() const noexcept = 0; /** - * Get the line number in the file where the panic was detected + * Get the line number in the file where the panic was detected. Only available on debug builds. * @return an integer containing the line number in the file where the panic was detected */ virtual int getLine() const noexcept = 0; /** - * Logs this exception to the system-log + * Get the CallStack when the panic was detected if available. + * @return the CallStack when the panic was detected */ - virtual void log() const noexcept = 0; + virtual const CallStack& getCallStack() const noexcept = 0; /** - * Get the CallStack when the panic was detected - * @return the CallStack when the panic was detected + * Logs this exception to the system-log */ - virtual const CallStack& getCallStack() const noexcept = 0; + virtual void log() const noexcept = 0; }; // ----------------------------------------------------------------------------------------------- @@ -305,6 +360,9 @@ class UTILS_PUBLIC TPanic : public Panic { const char* what() const noexcept override; // Panic interface + const char* getType() const noexcept override; + const char* getReason() const noexcept override; + const char* getReasonLiteral() const noexcept override; const char* getFunction() const noexcept override; const char* getFile() const noexcept override; int getLine() const noexcept override; @@ -318,13 +376,14 @@ class UTILS_PUBLIC TPanic : public Panic { * @param function the name of the function where the error was detected * @param file the file where the above function in implemented * @param line the line in the above file where the error was detected + * @param literal a literal version of the error message * @param format printf style string describing the error * @see ASSERT_PRECONDITION, ASSERT_POSTCONDITION, ASSERT_ARITHMETIC * @see PANIC_PRECONDITION, PANIC_POSTCONDITION, PANIC_ARITHMETIC * @see setMode() */ - static void panic(char const* function, char const* file, int line, const char* format, ...) - UTILS_NORETURN; + static void panic(char const* function, char const* file, int line, char const* literal, + const char* format, ...) UTILS_NORETURN; /** * Depending on the mode set, either throws an exception of type T with the given reason plus @@ -333,43 +392,41 @@ class UTILS_PUBLIC TPanic : public Panic { * @param function the name of the function where the error was detected * @param file the file where the above function in implemented * @param line the line in the above file where the error was detected - * @param s std::string describing the error + * @param literal a literal version of the error message + * @param reason std::string describing the error * @see ASSERT_PRECONDITION, ASSERT_POSTCONDITION, ASSERT_ARITHMETIC * @see PANIC_PRECONDITION, PANIC_POSTCONDITION, PANIC_ARITHMETIC * @see setMode() */ - static inline void panic(char const* function, char const* file, int line, const std::string& s) - UTILS_NORETURN { - panic(function, file, line, s.c_str()); - } + static inline void panic( + char const* function, char const* file, int line, char const* literal, + std::string reason) UTILS_NORETURN; protected: - /** - * Creates a Panic. - * @param reason a description of the cause of the error - */ - explicit TPanic(std::string reason); /** * Creates a Panic with extra information about the error-site. * @param function the name of the function where the error was detected * @param file the file where the above function in implemented * @param line the line in the above file where the error was detected + * @param literal a literal version of the error message * @param reason a description of the cause of the error */ - TPanic(char const* function, char const* file, int line, std::string reason); + TPanic(char const* function, char const* file, int line, char const* literal, + std::string reason); ~TPanic() override; private: void buildMessage(); - CallStack m_callstack; - std::string m_reason; - char const* const m_function = nullptr; - char const* const m_file = nullptr; - const int m_line = -1; - mutable std::string m_msg; + char const* const mFile = nullptr; // file where the panic happened + char const* const mFunction = nullptr; // function where the panic happened + int const mLine = -1; // line where the panic happened + std::string mLiteral; // reason for the panic, built only from literals + std::string mReason; // reason for the panic + mutable std::string mWhat; // fully formatted reason + CallStack mCallstack; }; namespace details { @@ -391,6 +448,7 @@ class UTILS_PUBLIC PreconditionPanic : public TPanic { // e.g.: invalid arguments using TPanic::TPanic; friend class TPanic; + constexpr static auto type = "Precondition"; }; /** @@ -404,6 +462,7 @@ class UTILS_PUBLIC PostconditionPanic : public TPanic { // e.g.: dead-lock would occur, arithmetic errors using TPanic::TPanic; friend class TPanic; + constexpr static auto type = "Postcondition"; }; /** @@ -417,8 +476,74 @@ class UTILS_PUBLIC ArithmeticPanic : public TPanic { // e.g.: underflow, overflow, internal computations errors using TPanic::TPanic; friend class TPanic; + constexpr static auto type = "Arithmetic"; +}; + +namespace details { + +struct Voidify final { + template + void operator&&(const T&) const&& {} +}; + +class UTILS_PUBLIC PanicStream { +public: + PanicStream( + char const* function, + char const* file, + int line, + char const* message) noexcept; + + ~PanicStream(); + + PanicStream& operator<<(short value) noexcept; + PanicStream& operator<<(unsigned short value) noexcept; + + PanicStream& operator<<(char value) noexcept; + PanicStream& operator<<(unsigned char value) noexcept; + + PanicStream& operator<<(int value) noexcept; + PanicStream& operator<<(unsigned int value) noexcept; + + PanicStream& operator<<(long value) noexcept; + PanicStream& operator<<(unsigned long value) noexcept; + + PanicStream& operator<<(long long value) noexcept; + PanicStream& operator<<(unsigned long long value) noexcept; + + PanicStream& operator<<(float value) noexcept; + PanicStream& operator<<(double value) noexcept; + PanicStream& operator<<(long double value) noexcept; + + PanicStream& operator<<(bool value) noexcept; + + PanicStream& operator<<(const void* value) noexcept; + + PanicStream& operator<<(const char* string) noexcept; + PanicStream& operator<<(const unsigned char* string) noexcept; + + PanicStream& operator<<(std::string const& s) noexcept; + PanicStream& operator<<(std::string_view const& s) noexcept; + +protected: + io::sstream mStream; + char const* mFunction; + char const* mFile; + int mLine; + char const* mLiteral; }; +template +class TPanicStream : public PanicStream { +public: + using PanicStream::PanicStream; + ~TPanicStream() noexcept(false) UTILS_NORETURN { + T::panic(mFunction, mFile, mLine, mLiteral, mStream.c_str()); + } +}; + +} // namespace details + // ----------------------------------------------------------------------------------------------- } // namespace utils @@ -430,37 +555,70 @@ class UTILS_PUBLIC ArithmeticPanic : public TPanic { # define PANIC_FUNCTION __func__ #endif + +#define FILAMENT_CHECK_CONDITION_IMPL(cond) \ + switch (0) \ + case 0: \ + default: \ + UTILS_LIKELY(cond) ? (void)0 : ::utils::details::Voidify()&& + +#define FILAMENT_PANIC_IMPL(message, TYPE) \ + ::utils::details::TPanicStream<::utils::TYPE>(PANIC_FUNCTION, PANIC_FILE(__FILE__), __LINE__, message) + +#ifndef FILAMENT_CHECK_PRECONDITION +#define FILAMENT_CHECK_PRECONDITION(condition) \ + FILAMENT_CHECK_CONDITION_IMPL(condition) FILAMENT_PANIC_IMPL(#condition, PreconditionPanic) +#endif + +#ifndef FILAMENT_CHECK_POSTCONDITION +#define FILAMENT_CHECK_POSTCONDITION(condition) \ + FILAMENT_CHECK_CONDITION_IMPL(condition) FILAMENT_PANIC_IMPL(#condition, PostconditionPanic) +#endif + +#ifndef FILAMENT_CHECK_ARITHMETIC +#define FILAMENT_CHECK_ARITHMETIC(condition) \ + FILAMENT_CHECK_CONDITION_IMPL(condition) FILAMENT_PANIC_IMPL(#condition, ArithmeticPanic) +#endif + +#define PANIC_PRECONDITION_IMPL(cond, format, ...) \ + ::utils::PreconditionPanic::panic(PANIC_FUNCTION, \ + PANIC_FILE(__FILE__), __LINE__, #cond, format, ##__VA_ARGS__) + +#define PANIC_POSTCONDITION_IMPL(cond, format, ...) \ + ::utils::PostconditionPanic::panic(PANIC_FUNCTION, \ + PANIC_FILE(__FILE__), __LINE__, #cond, format, ##__VA_ARGS__) + +#define PANIC_ARITHMETIC_IMPL(cond, format, ...) \ + ::utils::ArithmeticPanic::panic(PANIC_FUNCTION, \ + PANIC_FILE(__FILE__), __LINE__, #cond, format, ##__VA_ARGS__) + +#define PANIC_LOG_IMPL(cond, format, ...) \ + ::utils::details::panicLog(PANIC_FUNCTION, \ + PANIC_FILE(__FILE__), __LINE__, format, ##__VA_ARGS__) + /** * PANIC_PRECONDITION is a macro that reports a PreconditionPanic * @param format printf-style string describing the error in more details */ -#define PANIC_PRECONDITION(format, ...) \ - ::utils::PreconditionPanic::panic(PANIC_FUNCTION, \ - PANIC_FILE(__FILE__), __LINE__, format, ##__VA_ARGS__) +#define PANIC_PRECONDITION(format, ...) PANIC_PRECONDITION_IMPL(format, format, ##__VA_ARGS__) /** * PANIC_POSTCONDITION is a macro that reports a PostconditionPanic * @param format printf-style string describing the error in more details */ -#define PANIC_POSTCONDITION(format, ...) \ - ::utils::PostconditionPanic::panic(PANIC_FUNCTION, \ - PANIC_FILE(__FILE__), __LINE__, format, ##__VA_ARGS__) +#define PANIC_POSTCONDITION(format, ...) PANIC_POSTCONDITION_IMPL(format, format, ##__VA_ARGS__) /** * PANIC_ARITHMETIC is a macro that reports a ArithmeticPanic * @param format printf-style string describing the error in more details */ -#define PANIC_ARITHMETIC(format, ...) \ - ::utils::ArithmeticPanic::panic(PANIC_FUNCTION, \ - PANIC_FILE(__FILE__), __LINE__, format, ##__VA_ARGS__) +#define PANIC_ARITHMETIC(format, ...) PANIC_ARITHMETIC_IMPL(format, format, ##__VA_ARGS__) /** * PANIC_LOG is a macro that logs a Panic, and continues as usual. * @param format printf-style string describing the error in more details */ -#define PANIC_LOG(format, ...) \ - ::utils::details::panicLog(PANIC_FUNCTION, \ - PANIC_FILE(__FILE__), __LINE__, format, ##__VA_ARGS__) +#define PANIC_LOG(format, ...) PANIC_LOG_IMPL(format, format, ##__VA_ARGS__) /** * @ingroup errors @@ -471,14 +629,14 @@ class UTILS_PUBLIC ArithmeticPanic : public TPanic { * @param format printf-style string describing the error in more details */ #define ASSERT_PRECONDITION(cond, format, ...) \ - (!UTILS_LIKELY(cond) ? PANIC_PRECONDITION(format, ##__VA_ARGS__) : (void)0) + (!UTILS_LIKELY(cond) ? PANIC_PRECONDITION_IMPL(cond, format, ##__VA_ARGS__) : (void)0) #if defined(UTILS_EXCEPTIONS) || !defined(NDEBUG) #define ASSERT_PRECONDITION_NON_FATAL(cond, format, ...) \ - (!UTILS_LIKELY(cond) ? PANIC_PRECONDITION(format, ##__VA_ARGS__), false : true) + (!UTILS_LIKELY(cond) ? PANIC_PRECONDITION_IMPL(cond, format, ##__VA_ARGS__), false : true) #else #define ASSERT_PRECONDITION_NON_FATAL(cond, format, ...) \ - (!UTILS_LIKELY(cond) ? PANIC_LOG(format, ##__VA_ARGS__), false : true) + (!UTILS_LIKELY(cond) ? PANIC_LOG_IMPL(cond, format, ##__VA_ARGS__), false : true) #endif @@ -499,14 +657,14 @@ class UTILS_PUBLIC ArithmeticPanic : public TPanic { * @endcode */ #define ASSERT_POSTCONDITION(cond, format, ...) \ - (!UTILS_LIKELY(cond) ? PANIC_POSTCONDITION(format, ##__VA_ARGS__) : (void)0) + (!UTILS_LIKELY(cond) ? PANIC_POSTCONDITION_IMPL(cond, format, ##__VA_ARGS__) : (void)0) #if defined(UTILS_EXCEPTIONS) || !defined(NDEBUG) #define ASSERT_POSTCONDITION_NON_FATAL(cond, format, ...) \ - (!UTILS_LIKELY(cond) ? PANIC_POSTCONDITION(format, ##__VA_ARGS__), false : true) + (!UTILS_LIKELY(cond) ? PANIC_POSTCONDITION_IMPL(cond, format, ##__VA_ARGS__), false : true) #else #define ASSERT_POSTCONDITION_NON_FATAL(cond, format, ...) \ - (!UTILS_LIKELY(cond) ? PANIC_LOG(format, ##__VA_ARGS__), false : true) + (!UTILS_LIKELY(cond) ? PANIC_LOG_IMPL(cond, format, ##__VA_ARGS__), false : true) #endif /** @@ -527,14 +685,14 @@ class UTILS_PUBLIC ArithmeticPanic : public TPanic { * @endcode */ #define ASSERT_ARITHMETIC(cond, format, ...) \ - (!(cond) ? PANIC_ARITHMETIC(format, ##__VA_ARGS__) : (void)0) + (!(cond) ? PANIC_ARITHMETIC_IMPL(cond, format, ##__VA_ARGS__) : (void)0) #if defined(UTILS_EXCEPTIONS) || !defined(NDEBUG) #define ASSERT_ARITHMETIC_NON_FATAL(cond, format, ...) \ - (!UTILS_LIKELY(cond) ? PANIC_ARITHMETIC(format, ##__VA_ARGS__), false : true) + (!UTILS_LIKELY(cond) ? PANIC_ARITHMETIC_IMPL(cond, format, ##__VA_ARGS__), false : true) #else #define ASSERT_ARITHMETIC_NON_FATAL(cond, format, ...) \ - (!UTILS_LIKELY(cond) ? PANIC_LOG(format, ##__VA_ARGS__), false : true) + (!UTILS_LIKELY(cond) ? PANIC_LOG_IMPL(cond, format, ##__VA_ARGS__), false : true) #endif /** @@ -558,6 +716,7 @@ class UTILS_PUBLIC ArithmeticPanic : public TPanic { * } * @endcode */ -#define ASSERT_DESTRUCTOR(cond, format, ...) (!(cond) ? PANIC_LOG(format, ##__VA_ARGS__) : (void)0) +#define ASSERT_DESTRUCTOR(cond, format, ...) \ + (!UTILS_LIKELY(cond) ? PANIC_LOG_IMPL(cond, format, ##__VA_ARGS__) : (void)0) #endif // TNT_UTILS_PANIC_H diff --git a/libs/utils/include/utils/Path.h b/libs/utils/include/utils/Path.h index 66836e460fd..48195b26e3a 100644 --- a/libs/utils/include/utils/Path.h +++ b/libs/utils/include/utils/Path.h @@ -253,6 +253,12 @@ class UTILS_PUBLIC Path { */ static Path getTemporaryDirectory(); + /** + * @return a path representing a directory where settings files can be stored, + * it is recommended to append an app specific folder name to that path + */ + static Path getUserSettingsDirectory(); + /** * Creates a directory denoted by the given path. * This is not recursive and doesn't create intermediate directories. diff --git a/libs/utils/include/utils/PrivateImplementation.h b/libs/utils/include/utils/PrivateImplementation.h index 7cb510fae43..ee0ac48aa76 100644 --- a/libs/utils/include/utils/PrivateImplementation.h +++ b/libs/utils/include/utils/PrivateImplementation.h @@ -17,8 +17,6 @@ #ifndef UTILS_PRIVATEIMPLEMENTATION_H #define UTILS_PRIVATEIMPLEMENTATION_H -#include - #include namespace utils { diff --git a/libs/utils/include/utils/Profiler.h b/libs/utils/include/utils/Profiler.h index f41bd1e9a91..0a0aa5d3486 100644 --- a/libs/utils/include/utils/Profiler.h +++ b/libs/utils/include/utils/Profiler.h @@ -17,12 +17,14 @@ #ifndef TNT_UTILS_PROFILER_H #define TNT_UTILS_PROFILER_H +#include +#include // note: This is safe (only used inline) + #include +#include #include #include -#include // note: This is safe (only used inline) - #if defined(__linux__) # include # include @@ -82,13 +84,14 @@ class Profiler { class Counters { friend class Profiler; + uint64_t nr; uint64_t time_enabled; uint64_t time_running; struct { uint64_t value; uint64_t id; - } counters[Profiler::EVENT_COUNT]; + } counters[EVENT_COUNT]; friend Counters operator-(Counters lhs, const Counters& rhs) noexcept { lhs.nr -= rhs.nr; diff --git a/libs/utils/include/utils/QuadTree.h b/libs/utils/include/utils/QuadTree.h index 14302d34e7a..036aadf6ccf 100644 --- a/libs/utils/include/utils/QuadTree.h +++ b/libs/utils/include/utils/QuadTree.h @@ -17,7 +17,6 @@ #ifndef TNT_UTILS_QUADTREE_H #define TNT_UTILS_QUADTREE_H -#include #include #include @@ -51,7 +50,7 @@ static inline constexpr uint16_t morton(uint8_t x, uint8_t y) noexcept { * @return the number of elements in the tree */ static inline constexpr size_t size(size_t height) noexcept { - return QuadTreeUtils::morton(uint8_t((1u << height) - 1u), 0u); + return morton(uint8_t((1u << height) - 1u), 0u); } /** @@ -81,6 +80,9 @@ static_assert(size(1) == 1); static_assert(size(2) == 5); static_assert(size(3) == 21); static_assert(size(4) == 85); +static_assert(size(5) == 341); +static_assert(size(6) == 1365); +static_assert(size(7) == 5461); } // namespace QuadTreeUtils @@ -115,11 +117,14 @@ class QuadTreeArray : public std::array { }; public: - using code_t = uint8_t; + // code_t needs to be able to encode the # of entries for the largest level supported + // the tree. With 7 levels, the largest one as 4096 entries, 0 to 4095 so 12 bits suffice. + using code_t = uint16_t; struct NodeId { - int8_t l; // height of the node or -1 if invalid - code_t code; // morton code of the node + int8_t l : 4; // height of the node or -1 if invalid + code_t code : 12; // morton code of the node + static_assert(12 >= (HEIGHT - 1) * 2); }; enum class TraversalResult { diff --git a/libs/utils/include/utils/Range.h b/libs/utils/include/utils/Range.h index 019ef6fadaf..328ff980269 100644 --- a/libs/utils/include/utils/Range.h +++ b/libs/utils/include/utils/Range.h @@ -17,10 +17,10 @@ #ifndef TNT_UTILS_RANGE_H #define TNT_UTILS_RANGE_H -#include - #include +#include + namespace utils { template @@ -34,7 +34,7 @@ struct Range { bool contains(const T& t) const noexcept { return first <= t && t < last; } bool overlaps(const Range& that) const noexcept { - return that.first < this->last && that.last > this->first; + return (that.first < this->last) && (that.last > this->first); } class const_iterator { diff --git a/libs/utils/include/utils/RangeMap.h b/libs/utils/include/utils/RangeMap.h index 32b59f255a6..c28b453bfe4 100644 --- a/libs/utils/include/utils/RangeMap.h +++ b/libs/utils/include/utils/RangeMap.h @@ -22,6 +22,9 @@ #include #include +#include + +#include namespace utils { @@ -116,7 +119,8 @@ class RangeMap { */ const ValueType& get(KeyType key) const { ConstIterator iter = findRange(key); - ASSERT_PRECONDITION(iter != end(), "RangeMap: No element exists at the given key."); + FILAMENT_CHECK_PRECONDITION(iter != end()) + << "RangeMap: No element exists at the given key."; return getValue(iter); } @@ -264,7 +268,7 @@ class RangeMap { Iterator shrink(Iterator iter, KeyType first, KeyType last) { assert_invariant(first < last); assert_invariant(getRange(iter).first == first || getRange(iter).last == last); - std::pair, ValueType> value = {{first, last}, iter->second.second}; + std::pair, ValueType> value = {{first, last}, iter->second.second}; mMap.erase(iter); return mMap.insert({first, value}).first; } diff --git a/libs/utils/include/utils/SingleInstanceComponentManager.h b/libs/utils/include/utils/SingleInstanceComponentManager.h index 2ed7f2c9dd9..95f6bcb7748 100644 --- a/libs/utils/include/utils/SingleInstanceComponentManager.h +++ b/libs/utils/include/utils/SingleInstanceComponentManager.h @@ -60,16 +60,19 @@ class UTILS_PUBLIC SingleInstanceComponentManager { protected: static constexpr size_t ENTITY_INDEX = sizeof ... (Elements); + public: using SoA = StructureOfArrays; + using Structure = typename SoA::Structure; + using Instance = EntityInstanceBase::Type; SingleInstanceComponentManager() noexcept { // We always start with a dummy entry because index=0 is reserved. The component // at index = 0, is guaranteed to be default-initialized. // Sub-classes can use this to their advantage. - mData.push_back(); + mData.push_back(Structure{}); } SingleInstanceComponentManager(SingleInstanceComponentManager&&) noexcept {/* = default */} @@ -95,7 +98,7 @@ class UTILS_PUBLIC SingleInstanceComponentManager { return pos != map.end() ? pos->second : 0; } - // returns the number of components (i.e. size of each arrays) + // Returns the number of components (i.e. size of each array) size_t getComponentCount() const noexcept { // The array as an extra dummy component at index 0, so the visible count is 1 less. return mData.size() - 1; @@ -105,11 +108,8 @@ class UTILS_PUBLIC SingleInstanceComponentManager { return getComponentCount() == 0; } - // returns a pointer to the Entity array. This is basically the list - // of entities this component manager handles. - // The pointer becomes invalid when adding or removing a component. Entity const* getEntities() const noexcept { - return begin(); + return data() + 1; } Entity getEntity(Instance i) const noexcept { @@ -125,14 +125,6 @@ class UTILS_PUBLIC SingleInstanceComponentManager { // This invalidates all pointers components. inline Instance removeComponent(Entity e); - // trigger one round of garbage collection. this is intended to be called on a regular - // basis. This gc gives up after it cannot randomly free 'ratio' component in a row. - void gc(const EntityManager& em, size_t ratio = 4) noexcept { - gc(em, ratio, [this](Entity e) { - removeComponent(e); - }); - } - // return the first instance Instance begin() const noexcept { return 1u; } @@ -231,24 +223,33 @@ class UTILS_PUBLIC SingleInstanceComponentManager { } } + template + void gc(const EntityManager& em, + REMOVE&& removeComponent) noexcept { + gc(em, 4, std::forward(removeComponent)); + } + template void gc(const EntityManager& em, size_t ratio, - REMOVE removeComponent) noexcept { - Entity const* entities = getEntities(); + REMOVE&& removeComponent) noexcept { + Entity const* const pEntities = begin(); size_t count = getComponentCount(); size_t aliveInARow = 0; default_random_engine& rng = mRng; UTILS_NOUNROLL while (count && aliveInARow < ratio) { + assert_invariant(count == getComponentCount()); // note: using the modulo favorizes lower number - size_t i = rng() % count; - if (UTILS_LIKELY(em.isAlive(entities[i]))) { + size_t const i = rng() % count; + Entity const entity = pEntities[i]; + assert_invariant(entity); + if (UTILS_LIKELY(em.isAlive(entity))) { ++aliveInARow; continue; } + removeComponent(entity); aliveInARow = 0; count--; - removeComponent(entities[i]); } } @@ -269,7 +270,7 @@ SingleInstanceComponentManager::addComponent(Entity e) { if (!e.isNull()) { if (!hasComponent(e)) { // this is like a push_back(e); - mData.push_back().template back() = e; + mData.push_back(Structure{}).template back() = e; // index 0 is used when the component doesn't exist ci = Instance(mData.size() - 1); mInstanceMap[e] = ci; diff --git a/libs/utils/include/utils/SpinLock.h b/libs/utils/include/utils/SpinLock.h deleted file mode 100644 index e7ce00afac5..00000000000 --- a/libs/utils/include/utils/SpinLock.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef TNT_UTILS_SPINLOCK_H -#define TNT_UTILS_SPINLOCK_H - -#include - -#include - -#include -#include - -#include -#include - -namespace utils { -namespace details { - -class SpinLock { - std::atomic_flag mLock = ATOMIC_FLAG_INIT; - -public: - void lock() noexcept { - UTILS_PREFETCHW(&mLock); -#ifdef __ARM_ACLE - // we signal an event on this CPU, so that the first yield() will be a no-op, - // and falls through the test_and_set(). This is more efficient than a while { } - // construct. - UTILS_SIGNAL_EVENT(); - do { - yield(); - } while (mLock.test_and_set(std::memory_order_acquire)); -#else - goto start; - do { - yield(); -start: ; - } while (mLock.test_and_set(std::memory_order_acquire)); -#endif - } - - void unlock() noexcept { - mLock.clear(std::memory_order_release); -#ifdef __ARM_ARCH_7A__ - // on ARMv7a SEL is needed - UTILS_SIGNAL_EVENT(); - // as well as a memory barrier is needed - __dsb(0xA); // ISHST = 0xA (b1010) -#else - // on ARMv8 we could avoid the call to SE, but we'd need to write the - // test_and_set() above by hand, so the WFE only happens without a STRX first. - UTILS_BROADCAST_EVENT(); -#endif - } - -private: - inline void yield() noexcept { - // on x86 call pause instruction, on ARM call WFE - UTILS_WAIT_FOR_EVENT(); - } -}; -} // namespace details - -#if UTILS_HAS_SANITIZE_THREAD -// Active spins with atomics slow down execution too much under ThreadSanitizer. -using SpinLock = Mutex; -#elif defined(__ARM_ARCH_7A__) -// We've had problems with "wfe" on some ARM-V7 devices, causing spurious SIGILL -using SpinLock = Mutex; -#else -using SpinLock = details::SpinLock; -#endif - -} // namespace utils - -#endif // TNT_UTILS_SPINLOCK_H diff --git a/libs/utils/include/utils/Stopwatch.h b/libs/utils/include/utils/Stopwatch.h index fcd3051232c..37f54d0a086 100644 --- a/libs/utils/include/utils/Stopwatch.h +++ b/libs/utils/include/utils/Stopwatch.h @@ -18,11 +18,13 @@ #define TNT_UTILS_STOPWATCH_H #include +#include #include #include +#include -#include +#include namespace utils { diff --git a/libs/utils/include/utils/StructureOfArrays.h b/libs/utils/include/utils/StructureOfArrays.h index 7b2d3303df1..b7fccd6cbc5 100644 --- a/libs/utils/include/utils/StructureOfArrays.h +++ b/libs/utils/include/utils/StructureOfArrays.h @@ -17,8 +17,10 @@ #ifndef TNT_UTILS_STRUCTUREOFARRAYS_H #define TNT_UTILS_STRUCTUREOFARRAYS_H +#include #include #include +#include #include #include @@ -26,8 +28,11 @@ #include #include +#include #include // note: this is safe, see how std::array is used below (inline / private) #include +#include // for std::random_access_iterator_tag +#include #include namespace utils { @@ -38,11 +43,13 @@ class StructureOfArraysBase { static constexpr const size_t kArrayCount = sizeof...(Elements); public: - using SoA = StructureOfArraysBase; + using SoA = StructureOfArraysBase; + + using Structure = std::tuple; // Type of the Nth array template - using TypeAt = typename std::tuple_element>::type; + using TypeAt = typename std::tuple_element_t; // Number of arrays static constexpr size_t getArrayCount() noexcept { return kArrayCount; } @@ -54,7 +61,7 @@ class StructureOfArraysBase { // -------------------------------------------------------------------------------------------- - class Structure; + class IteratorValue; template class Iterator; using iterator = Iterator; using const_iterator = Iterator; @@ -66,45 +73,45 @@ class StructureOfArraysBase { * In other words, it's the return type of iterator::operator*(), and since it * cannot be a C++ reference (&), it's an object that acts like it. */ - class StructureRef { - friend class Structure; + class IteratorValueRef { + friend class IteratorValue; friend iterator; friend const_iterator; StructureOfArraysBase* const UTILS_RESTRICT soa; size_t const index; - StructureRef(StructureOfArraysBase* soa, size_t index) : soa(soa), index(index) { } + IteratorValueRef(StructureOfArraysBase* soa, size_t index) : soa(soa), index(index) { } // assigns a value_type to a reference (i.e. assigns to what's pointed to by the reference) template - StructureRef& assign(Structure const& rhs, std::index_sequence); + IteratorValueRef& assign(IteratorValue const& rhs, std::index_sequence); // assigns a value_type to a reference (i.e. assigns to what's pointed to by the reference) template - StructureRef& assign(Structure&& rhs, std::index_sequence) noexcept; + IteratorValueRef& assign(IteratorValue&& rhs, std::index_sequence) noexcept; // objects pointed to by reference can be swapped, so provide the special swap() function. - friend void swap(StructureRef lhs, StructureRef rhs) { + friend void swap(IteratorValueRef lhs, IteratorValueRef rhs) { lhs.soa->swap(lhs.index, rhs.index); } public: // references can be created by copy-assignment only - StructureRef(StructureRef const& rhs) noexcept : soa(rhs.soa), index(rhs.index) { } + IteratorValueRef(IteratorValueRef const& rhs) noexcept : soa(rhs.soa), index(rhs.index) { } // copy the content of a reference to the content of this one - StructureRef& operator=(StructureRef const& rhs); + IteratorValueRef& operator=(IteratorValueRef const& rhs); // move the content of a reference to the content of this one - StructureRef& operator=(StructureRef&& rhs) noexcept; + IteratorValueRef& operator=(IteratorValueRef&& rhs) noexcept; // copy a value_type to the content of this reference - StructureRef& operator=(Structure const& rhs) { + IteratorValueRef& operator=(IteratorValue const& rhs) { return assign(rhs, std::make_index_sequence()); } // move a value_type to the content of this reference - StructureRef& operator=(Structure&& rhs) noexcept { + IteratorValueRef& operator=(IteratorValue&& rhs) noexcept { return assign(rhs, std::make_index_sequence()); } @@ -119,36 +126,36 @@ class StructureOfArraysBase { * Internally we're using a tuple<> to store the data. * This object is not trivial to construct, as it copies an entry of the SoA. */ - class Structure { - friend class StructureRef; + class IteratorValue { + friend class IteratorValueRef; friend iterator; friend const_iterator; using Type = std::tuple::type...>; Type elements; template - static Type init(StructureRef const& rhs, std::index_sequence) { + static Type init(IteratorValueRef const& rhs, std::index_sequence) { return Type{ rhs.soa->template elementAt(rhs.index)... }; } template - static Type init(StructureRef&& rhs, std::index_sequence) noexcept { + static Type init(IteratorValueRef&& rhs, std::index_sequence) noexcept { return Type{ std::move(rhs.soa->template elementAt(rhs.index))... }; } public: - Structure(Structure const& rhs) = default; - Structure(Structure&& rhs) noexcept = default; - Structure& operator=(Structure const& rhs) = default; - Structure& operator=(Structure&& rhs) noexcept = default; + IteratorValue(IteratorValue const& rhs) = default; + IteratorValue(IteratorValue&& rhs) noexcept = default; + IteratorValue& operator=(IteratorValue const& rhs) = default; + IteratorValue& operator=(IteratorValue&& rhs) noexcept = default; // initialize and assign from a StructureRef - Structure(StructureRef const& rhs) + IteratorValue(IteratorValueRef const& rhs) : elements(init(rhs, std::make_index_sequence())) {} - Structure(StructureRef&& rhs) noexcept + IteratorValue(IteratorValueRef&& rhs) noexcept : elements(init(rhs, std::make_index_sequence())) {} - Structure& operator=(StructureRef const& rhs) { return operator=(Structure(rhs)); } - Structure& operator=(StructureRef&& rhs) noexcept { return operator=(Structure(rhs)); } + IteratorValue& operator=(IteratorValueRef const& rhs) { return operator=(IteratorValue(rhs)); } + IteratorValue& operator=(IteratorValueRef&& rhs) noexcept { return operator=(IteratorValue(rhs)); } // access the elements of this value_Type (i.e. the "fields" of the structure) template TypeAt const& get() const { return std::get(elements); } @@ -171,9 +178,9 @@ class StructureOfArraysBase { Iterator(CVQualifiedSOAPointer soa, size_t index) : soa(soa), index(index) {} public: - using value_type = Structure; - using reference = StructureRef; - using pointer = StructureRef*; // FIXME: this should be a StructurePtr type + using value_type = IteratorValue; + using reference = IteratorValueRef; + using pointer = IteratorValueRef*; // FIXME: this should be a StructurePtr type using difference_type = ptrdiff_t; using iterator_category = std::random_access_iterator_tag; @@ -228,7 +235,7 @@ class StructureOfArraysBase { using std::swap; swap(mCapacity, rhs.mCapacity); swap(mSize, rhs.mSize); - swap(mArrayOffset, rhs.mArrayOffset); + swap(mArrays, rhs.mArrays); swap(mAllocator, rhs.mAllocator); } @@ -237,7 +244,7 @@ class StructureOfArraysBase { using std::swap; swap(mCapacity, rhs.mCapacity); swap(mSize, rhs.mSize); - swap(mArrayOffset, rhs.mArrayOffset); + swap(mArrays, rhs.mArrays); swap(mAllocator, rhs.mAllocator); } return *this; @@ -245,7 +252,7 @@ class StructureOfArraysBase { ~StructureOfArraysBase() { destroy_each(0, mSize); - mAllocator.free(mArrayOffset[0]); + mAllocator.free(std::get<0>(mArrays)); } // -------------------------------------------------------------------------------------------- @@ -271,14 +278,14 @@ class StructureOfArraysBase { constexpr size_t align = std::max({ std::max(alignof(std::max_align_t), alignof(Elements))... }); const size_t sizeNeeded = getNeededSize(capacity); void* buffer = mAllocator.alloc(sizeNeeded, align); + auto const oldBuffer = std::get<0>(mArrays); // move all the items (one array at a time) from the old allocation to the new // this also update the array pointers move_each(buffer, capacity); // free the old buffer - std::swap(buffer, mArrayOffset[0]); - mAllocator.free(buffer); + mAllocator.free(oldBuffer); // and make sure to update the capacity mCapacity = capacity; @@ -332,6 +339,11 @@ class StructureOfArraysBase { return *this; } + StructureOfArraysBase& push_back(Structure&& args) noexcept { + ensureCapacity(mSize + 1); + return push_back_unsafe(std::forward(args)); + } + StructureOfArraysBase& push_back(Elements const& ... args) noexcept { ensureCapacity(mSize + 1); return push_back_unsafe(args...); @@ -342,58 +354,94 @@ class StructureOfArraysBase { return push_back_unsafe(std::forward(args)...); } + template + struct ElementIndices {}; + + template + struct BuildElementIndices : BuildElementIndices {}; + + template + struct BuildElementIndices<0, Indices...> : ElementIndices {}; + + template + void push_back_unsafe(Structure&& args, ElementIndices){ + size_t last = mSize++; + // Fold expression on the comma operator + ([&]{ + new(std::get(mArrays) + last) Elements{std::get(std::forward(args))}; + }() , ...); + } + + template + void push_back_unsafe(Elements const& ... args, ElementIndices){ + size_t last = mSize++; + // Fold expression on the comma operator + ([&]{ + new(std::get(mArrays) + last) Elements{args}; + }() , ...); + } + + template + void push_back_unsafe(Elements && ... args, ElementIndices){ + size_t last = mSize++; + // Fold expression on the comma operator + ([&]{ + new(std::get(mArrays) + last) Elements{std::forward(args)}; + }() , ...); + } + + StructureOfArraysBase& push_back_unsafe(Structure&& args) noexcept { + push_back_unsafe(std::forward(args), BuildElementIndices{}); + return *this; + } + StructureOfArraysBase& push_back_unsafe(Elements const& ... args) noexcept { - const size_t last = mSize++; - size_t i = 0; - int UTILS_UNUSED dummy[] = { - (new(getArray(i) + last)Elements(args), i++, 0)... }; + push_back_unsafe(args..., BuildElementIndices{}); + return *this; } StructureOfArraysBase& push_back_unsafe(Elements&& ... args) noexcept { - const size_t last = mSize++; - size_t i = 0; - int UTILS_UNUSED dummy[] = { - (new(getArray(i) + last)Elements(std::forward(args)), i++, 0)... }; + push_back_unsafe(std::forward(args)..., BuildElementIndices{}); return *this; } template void forEach(F&& f, ARGS&& ... args) { - size_t i = 0; - int UTILS_UNUSED dummy[] = { - (f(getArray(i), std::forward(args)...), i++, 0)... }; + for_each(mArrays, [&](size_t, auto* p) { + f(p, std::forward(args)...); + }); } // return a pointer to the first element of the ElementIndex]th array template TypeAt* data() noexcept { - return getArray>(ElementIndex); + return std::get(mArrays); } template TypeAt const* data() const noexcept { - return getArray>(ElementIndex); + return std::get(mArrays); } template TypeAt* begin() noexcept { - return getArray>(ElementIndex); + return std::get(mArrays); } template TypeAt const* begin() const noexcept { - return getArray>(ElementIndex); + return std::get(mArrays); } template TypeAt* end() noexcept { - return getArray>(ElementIndex) + size(); + return std::get(mArrays) + size(); } template TypeAt const* end() const noexcept { - return getArray>(ElementIndex) + size(); + return std::get(mArrays) + size(); } template @@ -465,7 +513,7 @@ class StructureOfArraysBase { return (soa.elementAt(i) = other); } UTILS_ALWAYS_INLINE Type const& operator = (Type&& other) noexcept { - return (soa.elementAt(i) = other); + return (soa.elementAt(i) = std::forward(other)); } // comparisons UTILS_ALWAYS_INLINE bool operator==(Type const& other) const { @@ -486,18 +534,30 @@ class StructureOfArraysBase { }; private: - template - T const* getArray(size_t arrayIndex) const { - return static_cast(mArrayOffset[arrayIndex]); + template + inline typename std::enable_if::type + for_each(std::tuple&, FuncT) {} + + template + inline typename std::enable_if::type + for_each(std::tuple& t, FuncT f) { + f(I, std::get(t)); + for_each(t, f); } - template - T* getArray(size_t arrayIndex) { - return static_cast(mArrayOffset[arrayIndex]); + template + inline typename std::enable_if::type + for_each_index(std::tuple&, FuncT) {} + + template + inline typename std::enable_if::type + for_each_index(std::tuple& t, FuncT f) { + f.template operator()(std::get(t)); + for_each_index(t, f); } inline void resizeNoCheck(size_t needed) noexcept { - assert(mCapacity >= needed); + assert_invariant(mCapacity >= needed); if (needed < mSize) { // we shrink the arrays destroy_each(needed, mSize); @@ -539,8 +599,10 @@ class StructureOfArraysBase { forEach([from, to](auto p) { using T = typename std::decay::type; // note: scalar types like int/float get initialized to zero - for (size_t i = from; i < to; i++) { - new(p + i) T(); + if constexpr (!std::is_trivially_default_constructible_v) { + for (size_t i = from; i < to; i++) { + new(p + i) T(); + } } }); } @@ -548,8 +610,10 @@ class StructureOfArraysBase { void destroy_each(size_t from, size_t to) noexcept { forEach([from, to](auto p) { using T = typename std::decay::type; - for (size_t i = from; i < to; i++) { - p[i].~T(); + if constexpr (!std::is_trivially_destructible_v) { + for (size_t i = from; i < to; i++) { + p[i].~T(); + } } }); } @@ -569,25 +633,28 @@ class StructureOfArraysBase { reinterpret_cast(uintptr_t(b) + offsets[index]); // for trivial cases, just call memcpy() - if (std::is_trivially_copyable::value && - std::is_trivially_destructible::value) { + if constexpr (std::is_trivially_copyable_v && + std::is_trivially_destructible_v) { memcpy(arrayPointer, p, size * sizeof(T)); } else { for (size_t i = 0; i < size; i++) { // we move an element by using the in-place move-constructor new(arrayPointer + i) T(std::move(p[i])); - // and delete them by calling the destructor directly - p[i].~T(); + if constexpr (!std::is_trivially_destructible_v) { + // and delete them by calling the destructor directly + p[i].~T(); + } } } index++; }); } - // update the pointers (the first offset will be filled later - for (size_t i = 1; i < kArrayCount; i++) { - mArrayOffset[i] = (char*)buffer + offsets[i]; - } + // update the pointers + for_each(mArrays, [buffer, &offsets](size_t i, auto&& p) { + using Type = std::remove_reference_t; + p = Type((char*)buffer + offsets[i]); + }); } // capacity in array elements @@ -595,33 +662,34 @@ class StructureOfArraysBase { // size in array elements size_t mSize = 0; // N pointers to each arrays - void *mArrayOffset[kArrayCount] = { nullptr }; + std::tuple...> mArrays{}; Allocator mAllocator; }; + template inline -typename StructureOfArraysBase::StructureRef& -StructureOfArraysBase::StructureRef::operator=( - StructureOfArraysBase::StructureRef const& rhs) { - return operator=(Structure(rhs)); +typename StructureOfArraysBase::IteratorValueRef& +StructureOfArraysBase::IteratorValueRef::operator=( + IteratorValueRef const& rhs) { + return operator=(IteratorValue(rhs)); } template inline -typename StructureOfArraysBase::StructureRef& -StructureOfArraysBase::StructureRef::operator=( - StructureOfArraysBase::StructureRef&& rhs) noexcept { - return operator=(Structure(rhs)); +typename StructureOfArraysBase::IteratorValueRef& +StructureOfArraysBase::IteratorValueRef::operator=( + IteratorValueRef&& rhs) noexcept { + return operator=(IteratorValue(rhs)); } template template inline -typename StructureOfArraysBase::StructureRef& -StructureOfArraysBase::StructureRef::assign( - StructureOfArraysBase::Structure const& rhs, std::index_sequence) { - // implements StructureRef& StructureRef::operator=(Structure const& rhs) +typename StructureOfArraysBase::IteratorValueRef& +StructureOfArraysBase::IteratorValueRef::assign( + IteratorValue const& rhs, std::index_sequence) { + // implements IteratorValueRef& IteratorValueRef::operator=(IteratorValue const& rhs) auto UTILS_UNUSED l = { (soa->elementAt(index) = std::get(rhs.elements), 0)... }; return *this; } @@ -629,10 +697,10 @@ StructureOfArraysBase::StructureRef::assign( template template inline -typename StructureOfArraysBase::StructureRef& -StructureOfArraysBase::StructureRef::assign( - StructureOfArraysBase::Structure&& rhs, std::index_sequence) noexcept { - // implements StructureRef& StructureRef::operator=(Structure&& rhs) noexcept +typename StructureOfArraysBase::IteratorValueRef& +StructureOfArraysBase::IteratorValueRef::assign( + IteratorValue&& rhs, std::index_sequence) noexcept { + // implements IteratorValueRef& IteratorValueRef::operator=(IteratorValue&& rhs) noexcept auto UTILS_UNUSED l = { (soa->elementAt(index) = std::move(std::get(rhs.elements)), 0)... }; return *this; diff --git a/libs/utils/include/utils/Systrace.h b/libs/utils/include/utils/Systrace.h index ddcf49f28f4..9f5a7f2a59e 100644 --- a/libs/utils/include/utils/Systrace.h +++ b/libs/utils/include/utils/Systrace.h @@ -23,17 +23,6 @@ #define SYSTRACE_TAG_FILAMENT (1<<1) // don't change, used in makefiles #define SYSTRACE_TAG_JOBSYSTEM (1<<2) - -#if defined(__ANDROID__) - -#include - -#include -#include -#include - -#include - /* * The SYSTRACE_ macros use SYSTRACE_TAG as a the TAG, which should be defined * before this file is included. If not, the SYSTRACE_TAG_ALWAYS tag will be used. @@ -43,228 +32,22 @@ #define SYSTRACE_TAG (SYSTRACE_TAG_ALWAYS) #endif -// enable tracing -#define SYSTRACE_ENABLE() ::utils::details::Systrace::enable(SYSTRACE_TAG) - -// disable tracing -#define SYSTRACE_DISABLE() ::utils::details::Systrace::disable(SYSTRACE_TAG) - - -/** - * Creates a Systrace context in the current scope. needed for calling all other systrace - * commands below. - */ -#define SYSTRACE_CONTEXT() ::utils::details::Systrace ___tracer(SYSTRACE_TAG) - - -// SYSTRACE_NAME traces the beginning and end of the current scope. To trace -// the correct start and end times this macro should be declared first in the -// scope body. -// It also automatically creates a Systrace context -#define SYSTRACE_NAME(name) ::utils::details::ScopedTrace ___tracer(SYSTRACE_TAG, name) - -// SYSTRACE_CALL is an SYSTRACE_NAME that uses the current function name. -#define SYSTRACE_CALL() SYSTRACE_NAME(__FUNCTION__) - -#define SYSTRACE_NAME_BEGIN(name) \ - ___tracer.traceBegin(SYSTRACE_TAG, name) - -#define SYSTRACE_NAME_END() \ - ___tracer.traceEnd(SYSTRACE_TAG) - - -/** - * Trace the beginning of an asynchronous event. Unlike ATRACE_BEGIN/ATRACE_END - * contexts, asynchronous events do not need to be nested. The name describes - * the event, and the cookie provides a unique identifier for distinguishing - * simultaneous events. The name and cookie used to begin an event must be - * used to end it. - */ -#define SYSTRACE_ASYNC_BEGIN(name, cookie) \ - ___tracer.asyncBegin(SYSTRACE_TAG, name, cookie) - -/** - * Trace the end of an asynchronous event. - * This should have a corresponding SYSTRACE_ASYNC_BEGIN. - */ -#define SYSTRACE_ASYNC_END(name, cookie) \ - ___tracer.asyncEnd(SYSTRACE_TAG, name, cookie) - -/** - * Traces an integer counter value. name is used to identify the counter. - * This can be used to track how a value changes over time. - */ -#define SYSTRACE_VALUE32(name, val) \ - ___tracer.value(SYSTRACE_TAG, name, int32_t(val)) - -#define SYSTRACE_VALUE64(name, val) \ - ___tracer.value(SYSTRACE_TAG, name, int64_t(val)) - -// ------------------------------------------------------------------------------------------------ -// No user serviceable code below... -// ------------------------------------------------------------------------------------------------ - -namespace utils { -namespace details { - -class Systrace { -public: - - enum tags { - NEVER = SYSTRACE_TAG_NEVER, - ALWAYS = SYSTRACE_TAG_ALWAYS, - FILAMENT = SYSTRACE_TAG_FILAMENT, - JOBSYSTEM = SYSTRACE_TAG_JOBSYSTEM - // we could define more TAGS here, as we need them. - }; - - explicit Systrace(uint32_t tag) noexcept { - if (tag) init(tag); - } - - static void enable(uint32_t tags) noexcept; - static void disable(uint32_t tags) noexcept; - - - inline void traceBegin(uint32_t tag, const char* name) noexcept { - if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { - beginSection(this, name); - } - } - - inline void traceEnd(uint32_t tag) noexcept { - if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { - endSection(this); - } - } - - inline void asyncBegin(uint32_t tag, const char* name, int32_t cookie) noexcept { - if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { - beginAsyncSection(this, name, cookie); - } - } - - inline void asyncEnd(uint32_t tag, const char* name, int32_t cookie) noexcept { - if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { - endAsyncSection(this, name, cookie); - } - } - - inline void value(uint32_t tag, const char* name, int32_t value) noexcept { - if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { - setCounter(this, name, value); - } - } - - inline void value(uint32_t tag, const char* name, int64_t value) noexcept { - if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { - setCounter(this, name, value); - } - } - -private: - friend class ScopedTrace; - - // whether tracing is supported at all by the platform - - using ATrace_isEnabled_t = bool (*)(); - using ATrace_beginSection_t = void (*)(const char* sectionName); - using ATrace_endSection_t = void (*)(); - using ATrace_beginAsyncSection_t = void (*)(const char* sectionName, int32_t cookie); - using ATrace_endAsyncSection_t = void (*)(const char* sectionName, int32_t cookie); - using ATrace_setCounter_t = void (*)(const char* counterName, int64_t counterValue); - - struct GlobalState { - bool isTracingAvailable; - std::atomic isTracingEnabled; - int markerFd; - - ATrace_isEnabled_t ATrace_isEnabled; - ATrace_beginSection_t ATrace_beginSection; - ATrace_endSection_t ATrace_endSection; - ATrace_beginAsyncSection_t ATrace_beginAsyncSection; - ATrace_endAsyncSection_t ATrace_endAsyncSection; - ATrace_setCounter_t ATrace_setCounter; - - void (*beginSection)(Systrace* that, const char* name); - void (*endSection)(Systrace* that); - void (*beginAsyncSection)(Systrace* that, const char* name, int32_t cookie); - void (*endAsyncSection)(Systrace* that, const char* name, int32_t cookie); - void (*setCounter)(Systrace* that, const char* name, int64_t value); - }; - - static GlobalState sGlobalState; - - - // per-instance versions for better performance - ATrace_isEnabled_t ATrace_isEnabled; - ATrace_beginSection_t ATrace_beginSection; - ATrace_endSection_t ATrace_endSection; - ATrace_beginAsyncSection_t ATrace_beginAsyncSection; - ATrace_endAsyncSection_t ATrace_endAsyncSection; - ATrace_setCounter_t ATrace_setCounter; - - void (*beginSection)(Systrace* that, const char* name); - void (*endSection)(Systrace* that); - void (*beginAsyncSection)(Systrace* that, const char* name, int32_t cookie); - void (*endAsyncSection)(Systrace* that, const char* name, int32_t cookie); - void (*setCounter)(Systrace* that, const char* name, int64_t value); - - void init(uint32_t tag) noexcept; - - // cached values for faster access, no need to be initialized - bool mIsTracingEnabled; - int mMarkerFd = -1; - pid_t mPid; - - static void setup() noexcept; - static void init_once() noexcept; - static bool isTracingEnabled(uint32_t tag) noexcept; - - static void begin_body(int fd, int pid, const char* name) noexcept; - static void end_body(int fd, int pid) noexcept; - static void async_begin_body(int fd, int pid, const char* name, int32_t cookie) noexcept; - static void async_end_body(int fd, int pid, const char* name, int32_t cookie) noexcept; - static void int64_body(int fd, int pid, const char* name, int64_t value) noexcept; -}; - -// ------------------------------------------------------------------------------------------------ - -class ScopedTrace { -public: - // we don't inline this because it's relatively heavy due to a global check - ScopedTrace(uint32_t tag, const char* name) noexcept : mTrace(tag), mTag(tag) { - mTrace.traceBegin(tag, name); - } - - inline ~ScopedTrace() noexcept { - mTrace.traceEnd(mTag); - } - - inline void value(uint32_t tag, const char* name, int32_t v) noexcept { - mTrace.value(tag, name, v); - } - - inline void value(uint32_t tag, const char* name, int64_t v) noexcept { - mTrace.value(tag, name, v); - } - -private: - Systrace mTrace; - const uint32_t mTag; -}; - -} // namespace details -} // namespace utils +// Systrace on Apple platforms is fragile and adds overhead, should only be enabled in dev builds. +#ifndef FILAMENT_APPLE_SYSTRACE +#define FILAMENT_APPLE_SYSTRACE 0 +#endif -// ------------------------------------------------------------------------------------------------ -#else // !ANDROID -// ------------------------------------------------------------------------------------------------ +#if defined(__ANDROID__) +#include +#elif defined(__APPLE__) && FILAMENT_APPLE_SYSTRACE +#include +#else #define SYSTRACE_ENABLE() #define SYSTRACE_DISABLE() #define SYSTRACE_CONTEXT() #define SYSTRACE_NAME(name) +#define SYSTRACE_FRAME_ID(frame) #define SYSTRACE_NAME_BEGIN(name) #define SYSTRACE_NAME_END() #define SYSTRACE_CALL() diff --git a/libs/utils/include/utils/WorkStealingDequeue.h b/libs/utils/include/utils/WorkStealingDequeue.h index 73b1ce6ec79..d077e5a3b3f 100644 --- a/libs/utils/include/utils/WorkStealingDequeue.h +++ b/libs/utils/include/utils/WorkStealingDequeue.h @@ -18,9 +18,11 @@ #define TNT_UTILS_WORKSTEALINGDEQUEUE_H #include +#include #include #include +#include namespace utils { @@ -34,7 +36,13 @@ namespace utils { * steal() push(), pop() * any thread main thread * - * + * References: + * - This code is largely inspired from + * https://blog.molecular-matters.com/2015/09/25/job-system-2-0-lock-free-work-stealing-part-3-going-lock-free/ + * - other implementations + * https://github.com/ConorWilliams/ConcurrentDeque/blob/main/include/riften/deque.hpp + * https://github.com/ssbl/concurrent-deque/blob/master/include/deque.hpp + * https://github.com/taskflow/work-stealing-queue/blob/master/wsq.hpp */ template class WorkStealingDequeue { @@ -85,9 +93,11 @@ void WorkStealingDequeue::push(TYPE item) noexcept { index_t bottom = mBottom.load(std::memory_order_relaxed); setItemAt(bottom, item); - // std::memory_order_release is used because we release the item we just pushed to other + // Here we need std::memory_order_release because we release, the item we just pushed, to other // threads which are calling steal(). - mBottom.store(bottom + 1, std::memory_order_release); + // However, generally seq_cst cannot be mixed with other memory orders. So we must use seq_cst. + // see: https://plv.mpi-sws.org/scfix/paper.pdf + mBottom.store(bottom + 1, std::memory_order_seq_cst); } /* @@ -116,7 +126,7 @@ TYPE WorkStealingDequeue::pop() noexcept { index_t top = mTop.load(std::memory_order_seq_cst); if (top < bottom) { - // Queue isn't empty and it's not the last item, just return it, this is the common case. + // Queue isn't empty, and it's not the last item, just return it, this is the common case. return getItemAt(bottom); } @@ -131,13 +141,13 @@ TYPE WorkStealingDequeue::pop() noexcept { if (mTop.compare_exchange_strong(top, top + 1, std::memory_order_seq_cst, std::memory_order_relaxed)) { - // success: we stole our last item from ourself, meaning that a concurrent steal() + // Success: we stole our last item from ourselves, meaning that a concurrent steal() // would have failed. // mTop now equals top + 1, we adjust top to make the queue empty. top++; } else { - // failure: mTop was not equal to top, which means the item was stolen under our feet. - // top now equals to mTop. Simply discard the item we just popped. + // Failure: mTop was not equal to top, which means the item was stolen under our feet. + // `top` now equals to mTop. Simply discard the item we just popped. // The queue is now empty. item = TYPE(); } @@ -147,9 +157,11 @@ TYPE WorkStealingDequeue::pop() noexcept { assert(top - bottom == 1); } - // std::memory_order_relaxed used because we're not publishing any data. - // no concurrent writes to mBottom possible, it's always safe to write mBottom. - mBottom.store(top, std::memory_order_relaxed); + // Here, we only need std::memory_order_relaxed because we're not publishing any data. + // No concurrent writes to mBottom possible, it's always safe to write mBottom. + // However, generally seq_cst cannot be mixed with other memory orders. So we must use seq_cst. + // see: https://plv.mpi-sws.org/scfix/paper.pdf + mBottom.store(top, std::memory_order_seq_cst); return item; } @@ -193,6 +205,8 @@ TYPE WorkStealingDequeue::steal() noexcept { } // failure: the item we just tried to steal was pop()'ed under our feet, // simply discard it; nothing to do -- it's okay to try again. + // However, item might be corrupted, so it must be trivially destructible + static_assert(std::is_trivially_destructible_v); } } diff --git a/libs/utils/include/utils/Zip2Iterator.h b/libs/utils/include/utils/Zip2Iterator.h index 7b9f552a5c1..99eea52ecce 100644 --- a/libs/utils/include/utils/Zip2Iterator.h +++ b/libs/utils/include/utils/Zip2Iterator.h @@ -19,8 +19,9 @@ #include #include +#include -#include +#include namespace utils { diff --git a/libs/utils/include/utils/algorithm.h b/libs/utils/include/utils/algorithm.h index d92555cc99a..7a747b84ceb 100644 --- a/libs/utils/include/utils/algorithm.h +++ b/libs/utils/include/utils/algorithm.h @@ -22,6 +22,7 @@ #include // for std::enable_if #include +#include #include namespace utils { @@ -43,9 +44,15 @@ constexpr inline T clz(T x) noexcept { static_assert(sizeof(T) * CHAR_BIT <= 128, "details::clz() only support up to 128 bits"); x |= (x >> 1u); x |= (x >> 2u); - x |= (x >> 4u); - x |= (x >> 8u); - x |= (x >> 16u); + if constexpr (sizeof(T) * CHAR_BIT >= 8) { // just to silence compiler warning + x |= (x >> 4u); + } + if constexpr (sizeof(T) * CHAR_BIT >= 16) { // just to silence compiler warning + x |= (x >> 8u); + } + if constexpr (sizeof(T) * CHAR_BIT >= 32) { // just to silence compiler warning + x |= (x >> 16u); + } if constexpr (sizeof(T) * CHAR_BIT >= 64) { // just to silence compiler warning x |= (x >> 32u); } @@ -67,11 +74,15 @@ constexpr inline T ctz(T x) noexcept { x &= -x; #endif if (x) c--; - if (sizeof(T) * CHAR_BIT >= 64) { + if constexpr (sizeof(T) * CHAR_BIT >= 64) { if (x & T(0x00000000FFFFFFFF)) c -= 32; } - if (x & T(0x0000FFFF0000FFFF)) c -= 16; - if (x & T(0x00FF00FF00FF00FF)) c -= 8; + if constexpr (sizeof(T) * CHAR_BIT >= 32) { + if (x & T(0x0000FFFF0000FFFF)) c -= 16; + } + if constexpr (sizeof(T) * CHAR_BIT >= 16) { + if (x & T(0x00FF00FF00FF00FF)) c -= 8; + } if (x & T(0x0F0F0F0F0F0F0F0F)) c -= 4; if (x & T(0x3333333333333333)) c -= 2; if (x & T(0x5555555555555555)) c -= 1; @@ -80,6 +91,24 @@ constexpr inline T ctz(T x) noexcept { } // namespace details +constexpr inline UTILS_PUBLIC UTILS_PURE +unsigned int UTILS_ALWAYS_INLINE clz(unsigned char x) noexcept { +#if __has_builtin(__builtin_clz) + return __builtin_clz((unsigned int)x) - 24; +#else + return details::clz(x); +#endif +} + +constexpr inline UTILS_PUBLIC UTILS_PURE +unsigned int UTILS_ALWAYS_INLINE clz(unsigned short x) noexcept { +#if __has_builtin(__builtin_clz) + return __builtin_clz((unsigned int)x) - 16; +#else + return details::clz(x); +#endif +} + constexpr inline UTILS_PUBLIC UTILS_PURE unsigned int UTILS_ALWAYS_INLINE clz(unsigned int x) noexcept { #if __has_builtin(__builtin_clz) @@ -107,6 +136,24 @@ unsigned long long UTILS_ALWAYS_INLINE clz(unsigned long long x) noexcept { #endif } +constexpr inline UTILS_PUBLIC UTILS_PURE +unsigned int UTILS_ALWAYS_INLINE ctz(unsigned char x) noexcept { +#if __has_builtin(__builtin_ctz) + return __builtin_ctz(x); +#else + return details::ctz(x); +#endif +} + +constexpr inline UTILS_PUBLIC UTILS_PURE +unsigned int UTILS_ALWAYS_INLINE ctz(unsigned short x) noexcept { +#if __has_builtin(__builtin_ctz) + return __builtin_ctz(x); +#else + return details::ctz(x); +#endif +} + constexpr inline UTILS_PUBLIC UTILS_PURE unsigned int UTILS_ALWAYS_INLINE ctz(unsigned int x) noexcept { #if __has_builtin(__builtin_ctz) @@ -134,6 +181,24 @@ unsigned long long UTILS_ALWAYS_INLINE ctz(unsigned long long x) noexcept { #endif } +constexpr inline UTILS_PUBLIC UTILS_PURE +unsigned int UTILS_ALWAYS_INLINE popcount(unsigned char x) noexcept { +#if __has_builtin(__builtin_popcount) + return __builtin_popcount(x); +#else + return details::popcount(x); +#endif +} + +constexpr inline UTILS_PUBLIC UTILS_PURE +unsigned int UTILS_ALWAYS_INLINE popcount(unsigned short x) noexcept { +#if __has_builtin(__builtin_popcount) + return __builtin_popcount(x); +#else + return details::popcount(x); +#endif +} + constexpr inline UTILS_PUBLIC UTILS_PURE unsigned int UTILS_ALWAYS_INLINE popcount(unsigned int x) noexcept { #if __has_builtin(__builtin_popcount) @@ -161,11 +226,6 @@ unsigned long long UTILS_ALWAYS_INLINE popcount(unsigned long long x) noexcept { #endif } -constexpr inline UTILS_PUBLIC UTILS_PURE -uint8_t UTILS_ALWAYS_INLINE popcount(uint8_t x) noexcept { - return (uint8_t)popcount((unsigned int)x); -} - template::value && std::is_unsigned::value>> constexpr inline UTILS_PUBLIC UTILS_PURE @@ -199,14 +259,26 @@ RandomAccessIterator partition_point( return first; } -template -typename std::enable_if_t< - (sizeof(To) == sizeof(From)) && - std::is_trivially_copyable::value, - To> -// constexpr support needs compiler magic -bit_cast(const From &src) noexcept { - return reinterpret_cast(src); +template +#if __has_builtin(__builtin_bit_cast) +constexpr +#else +inline +#endif +Dest bit_cast(const Source& source) noexcept { +#if __has_builtin(__builtin_bit_cast) + return __builtin_bit_cast(Dest, source); +#else + static_assert(sizeof(Dest) == sizeof(Source), + "bit_cast requires source and destination to be the same size"); + static_assert(std::is_trivially_copyable_v, + "bit_cast requires the destination type to be copyable"); + static_assert(std::is_trivially_copyable_v, + "bit_cast requires the source type to be copyable"); + Dest dest; + memcpy(&dest, &source, sizeof(dest)); + return dest; +#endif } } // namespace utils diff --git a/libs/utils/include/utils/android/PerformanceHintManager.h b/libs/utils/include/utils/android/PerformanceHintManager.h new file mode 100644 index 00000000000..b5910abca1e --- /dev/null +++ b/libs/utils/include/utils/android/PerformanceHintManager.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef TNT_UTILS_ANDROID_PERFORMANCEHINTMANAGER_H +#define TNT_UTILS_ANDROID_PERFORMANCEHINTMANAGER_H + +#include +#include + +#include +#include + +namespace utils { + +namespace details { +struct PerformanceHintManager; +} // namespace details + +class UTILS_PUBLIC PerformanceHintManager : + private PrivateImplementation { + friend struct details::PerformanceHintManager; + struct SessionDetails; + +public: + class UTILS_PUBLIC Session : PrivateImplementation { + friend class PerformanceHintManager; + friend struct SessionDetails; + public: + Session() noexcept; + Session(PerformanceHintManager& manager, + int32_t const* threadIds, size_t size, + int64_t initialTargetWorkDurationNanos) noexcept; + ~Session() noexcept; + + Session(Session&& rhs) noexcept; + Session& operator=(Session&& rhs) noexcept; + Session(Session const& rhs) = delete; + Session& operator=(Session const& rhs) = delete; + + bool isValid() const; + int updateTargetWorkDuration(int64_t targetDurationNanos) noexcept; + int reportActualWorkDuration(int64_t actualDurationNanos) noexcept; + }; + + // caveat: This must be called on a Java thread + PerformanceHintManager() noexcept; + ~PerformanceHintManager() noexcept; + + // Whether PerformanceHintManager APIs are supported (which doesn't mean PerformanceHintManager + // itself is, use isValid()). + static bool isSupported() noexcept; + + // Whether PerformanceHintManager can be used. + bool isValid() const; + + int64_t getPreferredUpdateRateNanos() const noexcept; +}; + +} // namespace utils + +#endif //TNT_UTILS_ANDROID_PERFORMANCEHINTMANAGER_H diff --git a/libs/utils/include/utils/android/Systrace.h b/libs/utils/include/utils/android/Systrace.h new file mode 100644 index 00000000000..760fe5be647 --- /dev/null +++ b/libs/utils/include/utils/android/Systrace.h @@ -0,0 +1,242 @@ +/* +* Copyright (C) 2023 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#ifndef TNT_UTILS_ANDROID_SYSTRACE_H +#define TNT_UTILS_ANDROID_SYSTRACE_H + +#include + +#include +#include +#include + +#include + +// enable tracing +#define SYSTRACE_ENABLE() ::utils::details::Systrace::enable(SYSTRACE_TAG) + +// disable tracing +#define SYSTRACE_DISABLE() ::utils::details::Systrace::disable(SYSTRACE_TAG) + + +/** + * Creates a Systrace context in the current scope. needed for calling all other systrace + * commands below. + */ +#define SYSTRACE_CONTEXT() ::utils::details::Systrace ___trctx(SYSTRACE_TAG) + + +// SYSTRACE_NAME traces the beginning and end of the current scope. To trace +// the correct start and end times this macro should be declared first in the +// scope body. +// It also automatically creates a Systrace context +#define SYSTRACE_NAME(name) ::utils::details::ScopedTrace ___tracer(SYSTRACE_TAG, name) + +// Denotes that a new frame has started processing. +#define SYSTRACE_FRAME_ID(frame) \ + { /* scope for frame id trace */ \ + char buf[64]; \ + snprintf(buf, 64, "frame %u", frame); \ + SYSTRACE_NAME(buf); \ + } + +// SYSTRACE_CALL is an SYSTRACE_NAME that uses the current function name. +#define SYSTRACE_CALL() SYSTRACE_NAME(__FUNCTION__) + +#define SYSTRACE_NAME_BEGIN(name) \ + ___trctx.traceBegin(SYSTRACE_TAG, name) + +#define SYSTRACE_NAME_END() \ + ___trctx.traceEnd(SYSTRACE_TAG) + + +/** + * Trace the beginning of an asynchronous event. Unlike ATRACE_BEGIN/ATRACE_END + * contexts, asynchronous events do not need to be nested. The name describes + * the event, and the cookie provides a unique identifier for distinguishing + * simultaneous events. The name and cookie used to begin an event must be + * used to end it. + */ +#define SYSTRACE_ASYNC_BEGIN(name, cookie) \ + ___trctx.asyncBegin(SYSTRACE_TAG, name, cookie) + +/** + * Trace the end of an asynchronous event. + * This should have a corresponding SYSTRACE_ASYNC_BEGIN. + */ +#define SYSTRACE_ASYNC_END(name, cookie) \ + ___trctx.asyncEnd(SYSTRACE_TAG, name, cookie) + +/** + * Traces an integer counter value. name is used to identify the counter. + * This can be used to track how a value changes over time. + */ +#define SYSTRACE_VALUE32(name, val) \ + ___trctx.value(SYSTRACE_TAG, name, int32_t(val)) + +#define SYSTRACE_VALUE64(name, val) \ + ___trctx.value(SYSTRACE_TAG, name, int64_t(val)) + +// ------------------------------------------------------------------------------------------------ +// No user serviceable code below... +// ------------------------------------------------------------------------------------------------ + +namespace utils { +namespace details { + +class UTILS_PUBLIC Systrace { + public: + + enum tags { + NEVER = SYSTRACE_TAG_NEVER, + ALWAYS = SYSTRACE_TAG_ALWAYS, + FILAMENT = SYSTRACE_TAG_FILAMENT, + JOBSYSTEM = SYSTRACE_TAG_JOBSYSTEM + // we could define more TAGS here, as we need them. + }; + + explicit Systrace(uint32_t tag) noexcept { + if (tag) init(tag); + } + + static void enable(uint32_t tags) noexcept; + static void disable(uint32_t tags) noexcept; + + + inline void traceBegin(uint32_t tag, const char* name) noexcept { + if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { + beginSection(this, name); + } + } + + inline void traceEnd(uint32_t tag) noexcept { + if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { + endSection(this); + } + } + + inline void asyncBegin(uint32_t tag, const char* name, int32_t cookie) noexcept { + if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { + beginAsyncSection(this, name, cookie); + } + } + + inline void asyncEnd(uint32_t tag, const char* name, int32_t cookie) noexcept { + if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { + endAsyncSection(this, name, cookie); + } + } + + inline void value(uint32_t tag, const char* name, int32_t value) noexcept { + if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { + setCounter(this, name, value); + } + } + + inline void value(uint32_t tag, const char* name, int64_t value) noexcept { + if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { + setCounter(this, name, value); + } + } + + private: + friend class ScopedTrace; + + // whether tracing is supported at all by the platform + + using ATrace_isEnabled_t = bool (*)(); + using ATrace_beginSection_t = void (*)(const char* sectionName); + using ATrace_endSection_t = void (*)(); + using ATrace_beginAsyncSection_t = void (*)(const char* sectionName, int32_t cookie); + using ATrace_endAsyncSection_t = void (*)(const char* sectionName, int32_t cookie); + using ATrace_setCounter_t = void (*)(const char* counterName, int64_t counterValue); + + struct GlobalState { + bool isTracingAvailable; + std::atomic isTracingEnabled; + int markerFd; + + ATrace_isEnabled_t ATrace_isEnabled; + ATrace_beginSection_t ATrace_beginSection; + ATrace_endSection_t ATrace_endSection; + ATrace_beginAsyncSection_t ATrace_beginAsyncSection; + ATrace_endAsyncSection_t ATrace_endAsyncSection; + ATrace_setCounter_t ATrace_setCounter; + + void (*beginSection)(Systrace* that, const char* name); + void (*endSection)(Systrace* that); + void (*beginAsyncSection)(Systrace* that, const char* name, int32_t cookie); + void (*endAsyncSection)(Systrace* that, const char* name, int32_t cookie); + void (*setCounter)(Systrace* that, const char* name, int64_t value); + }; + + static GlobalState sGlobalState; + + + // per-instance versions for better performance + ATrace_isEnabled_t ATrace_isEnabled; + ATrace_beginSection_t ATrace_beginSection; + ATrace_endSection_t ATrace_endSection; + ATrace_beginAsyncSection_t ATrace_beginAsyncSection; + ATrace_endAsyncSection_t ATrace_endAsyncSection; + ATrace_setCounter_t ATrace_setCounter; + + void (*beginSection)(Systrace* that, const char* name); + void (*endSection)(Systrace* that); + void (*beginAsyncSection)(Systrace* that, const char* name, int32_t cookie); + void (*endAsyncSection)(Systrace* that, const char* name, int32_t cookie); + void (*setCounter)(Systrace* that, const char* name, int64_t value); + + void init(uint32_t tag) noexcept; + + // cached values for faster access, no need to be initialized + bool mIsTracingEnabled; + int mMarkerFd = -1; + pid_t mPid; + + static void setup() noexcept; + static void init_once() noexcept; + static bool isTracingEnabled(uint32_t tag) noexcept; + + static void begin_body(int fd, int pid, const char* name) noexcept; + static void end_body(int fd, int pid) noexcept; + static void async_begin_body(int fd, int pid, const char* name, int32_t cookie) noexcept; + static void async_end_body(int fd, int pid, const char* name, int32_t cookie) noexcept; + static void int64_body(int fd, int pid, const char* name, int64_t value) noexcept; +}; + +// ------------------------------------------------------------------------------------------------ + +class UTILS_PUBLIC ScopedTrace { +public: + // we don't inline this because it's relatively heavy due to a global check + ScopedTrace(uint32_t tag, const char* name) noexcept: mTrace(tag), mTag(tag) { + mTrace.traceBegin(tag, name); + } + + inline ~ScopedTrace() noexcept { + mTrace.traceEnd(mTag); + } + +private: + Systrace mTrace; + const uint32_t mTag; +}; + +} // namespace details +} // namespace utils + +#endif // TNT_UTILS_ANDROID_SYSTRACE_H diff --git a/libs/utils/include/utils/android/ThermalManager.h b/libs/utils/include/utils/android/ThermalManager.h index 6c303b04bba..fb951b3125a 100644 --- a/libs/utils/include/utils/android/ThermalManager.h +++ b/libs/utils/include/utils/android/ThermalManager.h @@ -17,8 +17,6 @@ #ifndef TNT_UTILS_ANDROID_THERMALMANAGER_H #define TNT_UTILS_ANDROID_THERMALMANAGER_H -#include - #include struct AThermalManager; diff --git a/libs/utils/include/utils/architecture.h b/libs/utils/include/utils/architecture.h index 83b11794068..e702cec9045 100644 --- a/libs/utils/include/utils/architecture.h +++ b/libs/utils/include/utils/architecture.h @@ -23,6 +23,11 @@ namespace utils { constexpr size_t CACHELINE_SIZE = 64; +namespace arch { + +size_t getPageSize() noexcept; + +} // namespace arch } // namespace utils #endif // TNT_UTILS_ARCHITECTURE_H diff --git a/libs/utils/include/utils/bitset.h b/libs/utils/include/utils/bitset.h index baad307b5c4..8844fdb80ac 100644 --- a/libs/utils/include/utils/bitset.h +++ b/libs/utils/include/utils/bitset.h @@ -26,6 +26,7 @@ #include #include // for std::fill +#include #include #if defined(__ARM_NEON) @@ -59,6 +60,11 @@ class UTILS_PUBLIC bitset { std::fill(std::begin(storage), std::end(storage), 0); } + template> + explicit bitset(U value) noexcept { + storage[0] = value; + } + T getBitsAt(size_t n) const noexcept { assert_invariant(n + +#include +#include +#include + +#include +#include + +#include +#include + +// enable tracing +#define SYSTRACE_ENABLE() ::utils::details::Systrace::enable(SYSTRACE_TAG) + +// disable tracing +#define SYSTRACE_DISABLE() ::utils::details::Systrace::disable(SYSTRACE_TAG) + + +/** + * Creates a Systrace context in the current scope. needed for calling all other systrace + * commands below. + */ +#define SYSTRACE_CONTEXT() ::utils::details::Systrace ___tracer(SYSTRACE_TAG) + + +// SYSTRACE_NAME traces the beginning and end of the current scope. To trace +// the correct start and end times this macro should be declared first in the +// scope body. +// It also automatically creates a Systrace context +#define SYSTRACE_NAME(name) ::utils::details::ScopedTrace ___tracer(SYSTRACE_TAG, name) + +// Denotes that a new frame has started processing. +#define SYSTRACE_FRAME_ID(frame) \ + ::utils::details::Systrace(SYSTRACE_TAG).frameId(SYSTRACE_TAG, frame) + +extern thread_local std::stack ___tracerSections; + +// SYSTRACE_CALL is an SYSTRACE_NAME that uses the current function name. +#define SYSTRACE_CALL() SYSTRACE_NAME(__PRETTY_FUNCTION__) + +#define SYSTRACE_NAME_BEGIN(name) \ + ___tracerSections.push(name) , \ + ___tracer.traceBegin(SYSTRACE_TAG, name) + +#define SYSTRACE_NAME_END() \ + ___tracer.traceEnd(SYSTRACE_TAG, ___tracerSections.top()) , \ + ___tracerSections.pop() + +/** + * Trace the beginning of an asynchronous event. Unlike ATRACE_BEGIN/ATRACE_END + * contexts, asynchronous events do not need to be nested. The name describes + * the event, and the cookie provides a unique identifier for distinguishing + * simultaneous events. The name and cookie used to begin an event must be + * used to end it. + */ +#define SYSTRACE_ASYNC_BEGIN(name, cookie) \ + ___tracer.asyncBegin(SYSTRACE_TAG, name, cookie) + +/** + * Trace the end of an asynchronous event. + * This should have a corresponding SYSTRACE_ASYNC_BEGIN. + */ +#define SYSTRACE_ASYNC_END(name, cookie) \ + ___tracer.asyncEnd(SYSTRACE_TAG, name, cookie) + +/** + * Traces an integer counter value. name is used to identify the counter. + * This can be used to track how a value changes over time. + */ +#define SYSTRACE_VALUE32(name, val) \ + ___tracer.value(SYSTRACE_TAG, name, int32_t(val)) + +#define SYSTRACE_VALUE64(name, val) \ + ___tracer.value(SYSTRACE_TAG, name, int64_t(val)) + +// ------------------------------------------------------------------------------------------------ +// No user serviceable code below... +// ------------------------------------------------------------------------------------------------ + +// This is an alternative to os_signpost_emit_with_type that allows non-compile time strings (namely +// for us, __FUNCTION__). +// The trade-off is that this doesn't allow messages to have printf-style formatting. +// It's fine to pass an empty string to __builtin_os_log_format_buffer_size and +// __builtin_os_log_format, because they return the same value for strings without any format +// specifiers. +// This is fragile, so should only be used to assist debugging and never in production. +#define APPLE_SIGNPOST_EMIT(log, type, spid, name, message) \ + if (os_signpost_enabled(log)) { \ + uint8_t _os_fmt_buf[__builtin_os_log_format_buffer_size("")]; \ + _os_signpost_emit_with_name_impl( \ + &__dso_handle, log, type, spid, \ + name, message, \ + (uint8_t *)__builtin_os_log_format(_os_fmt_buf, ""), \ + (uint32_t)sizeof(_os_fmt_buf)); \ + } + +namespace utils { +namespace details { + +class Systrace { + public: + + enum tags { + NEVER = SYSTRACE_TAG_NEVER, + ALWAYS = SYSTRACE_TAG_ALWAYS, + FILAMENT = SYSTRACE_TAG_FILAMENT, + JOBSYSTEM = SYSTRACE_TAG_JOBSYSTEM + // we could define more TAGS here, as we need them. + }; + + explicit Systrace(uint32_t tag) noexcept { + if (tag) init(tag); + } + + static void enable(uint32_t tags) noexcept; + static void disable(uint32_t tags) noexcept; + + inline void traceBegin(uint32_t tag, const char* name) noexcept { + if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { + APPLE_SIGNPOST_EMIT(sGlobalState.systraceLog, OS_SIGNPOST_INTERVAL_BEGIN, + OS_SIGNPOST_ID_EXCLUSIVE, name, name) + } + } + + inline void traceEnd(uint32_t tag, const char* name) noexcept { + if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { + APPLE_SIGNPOST_EMIT(sGlobalState.systraceLog, OS_SIGNPOST_INTERVAL_END, + OS_SIGNPOST_ID_EXCLUSIVE, name, "") + } + } + + inline void asyncBegin(uint32_t tag, const char* name, int32_t cookie) noexcept { + if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { + // TODO + } + } + + inline void asyncEnd(uint32_t tag, const char* name, int32_t cookie) noexcept { + if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { + // TODO + } + } + + inline void value(uint32_t tag, const char* name, int32_t value) noexcept { + if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { + char buf[64]; + snprintf(buf, 64, "%s - %d", name, value); + APPLE_SIGNPOST_EMIT(sGlobalState.systraceLog, OS_SIGNPOST_EVENT, + OS_SIGNPOST_ID_EXCLUSIVE, name, buf) + } + } + + inline void value(uint32_t tag, const char* name, int64_t value) noexcept { + if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { + char buf[64]; + snprintf(buf, 64, "%s - %lld", name, value); + APPLE_SIGNPOST_EMIT(sGlobalState.systraceLog, OS_SIGNPOST_EVENT, + OS_SIGNPOST_ID_EXCLUSIVE, name, buf) + } + } + + inline void frameId(uint32_t tag, uint32_t frame) noexcept { + if (tag && UTILS_UNLIKELY(mIsTracingEnabled)) { + char buf[64]; \ + snprintf(buf, 64, "frame %u", frame); \ + APPLE_SIGNPOST_EMIT(sGlobalState.frameIdLog, OS_SIGNPOST_EVENT, + OS_SIGNPOST_ID_EXCLUSIVE, "frame", buf) + } + } + + private: + friend class ScopedTrace; + + struct GlobalState { + std::atomic isTracingEnabled; + + os_log_t systraceLog; + os_log_t frameIdLog; + }; + + static GlobalState sGlobalState; + + void init(uint32_t tag) noexcept; + + // cached values for faster access, no need to be initialized + bool mIsTracingEnabled; + + static void setup() noexcept; + static void init_once() noexcept; + static bool isTracingEnabled(uint32_t tag) noexcept; +}; + +// ------------------------------------------------------------------------------------------------ + +class ScopedTrace { + public: + // we don't inline this because it's relatively heavy due to a global check + ScopedTrace(uint32_t tag, const char* name) noexcept : mTrace(tag), mName(name), mTag(tag) { + mTrace.traceBegin(tag, name); + } + + inline ~ScopedTrace() noexcept { + mTrace.traceEnd(mTag, mName); + } + + inline void value(uint32_t tag, const char* name, int32_t v) noexcept { + mTrace.value(tag, name, v); + } + + inline void value(uint32_t tag, const char* name, int64_t v) noexcept { + mTrace.value(tag, name, v); + } + + private: + Systrace mTrace; + const char* mName; + const uint32_t mTag; +}; + +} // namespace details +} // namespace utils + +#endif // TNT_UTILS_DARWIN_SYSTRACE_H diff --git a/libs/utils/include/utils/debug.h b/libs/utils/include/utils/debug.h index 4c118725177..0f6ecdb27e1 100644 --- a/libs/utils/include/utils/debug.h +++ b/libs/utils/include/utils/debug.h @@ -20,6 +20,7 @@ #include namespace utils { +UTILS_PUBLIC void panic(const char *func, const char * file, int line, const char *assertion) noexcept; } // namespace filament diff --git a/libs/utils/include/utils/generic/Condition.h b/libs/utils/include/utils/generic/Condition.h index accde2be9fa..89e05251e37 100644 --- a/libs/utils/include/utils/generic/Condition.h +++ b/libs/utils/include/utils/generic/Condition.h @@ -19,6 +19,8 @@ #include +#include + namespace utils { class Condition : public std::condition_variable { diff --git a/libs/utils/include/utils/generic/ThermalManager.h b/libs/utils/include/utils/generic/ThermalManager.h index 2d0088e5617..5d77ab5b611 100644 --- a/libs/utils/include/utils/generic/ThermalManager.h +++ b/libs/utils/include/utils/generic/ThermalManager.h @@ -17,8 +17,6 @@ #ifndef TNT_UTILS_GENERIC_THERMALMANAGER_H #define TNT_UTILS_GENERIC_THERMALMANAGER_H -#include - #include namespace utils { diff --git a/libs/utils/include/utils/linux/Mutex.h b/libs/utils/include/utils/linux/Mutex.h index 2dcc7ebc61c..f548d53effa 100644 --- a/libs/utils/include/utils/linux/Mutex.h +++ b/libs/utils/include/utils/linux/Mutex.h @@ -17,9 +17,11 @@ #ifndef TNT_UTILS_LINUX_MUTEX_H #define TNT_UTILS_LINUX_MUTEX_H +#include + #include -#include +#include namespace utils { diff --git a/libs/utils/include/utils/memalign.h b/libs/utils/include/utils/memalign.h index 4c048bffdaf..8b77170ad3e 100644 --- a/libs/utils/include/utils/memalign.h +++ b/libs/utils/include/utils/memalign.h @@ -40,7 +40,7 @@ inline void* aligned_alloc(size_t size, size_t align) noexcept { #if defined(WIN32) p = ::_aligned_malloc(size, align); #else - ::posix_memalign(&p, align, size); + (void) ::posix_memalign(&p, align, size); #endif return p; } @@ -73,8 +73,8 @@ class STLAlignedAllocator { using const_pointer = const TYPE*; using reference = TYPE&; using const_reference = const TYPE&; - using size_type = std::size_t; - using difference_type = std::ptrdiff_t; + using size_type = ::size_t; + using difference_type = ::ptrdiff_t; using propagate_on_container_move_assignment = std::true_type; using is_always_equal = std::true_type; diff --git a/libs/utils/include/utils/ostream.h b/libs/utils/include/utils/ostream.h index 0e5c4249bdd..f440e62531e 100644 --- a/libs/utils/include/utils/ostream.h +++ b/libs/utils/include/utils/ostream.h @@ -29,7 +29,7 @@ namespace utils::io { struct ostream_; -class UTILS_PUBLIC ostream : protected utils::PrivateImplementation { +class UTILS_PUBLIC ostream : protected PrivateImplementation { friend struct ostream_; public: @@ -69,6 +69,13 @@ class UTILS_PUBLIC ostream : protected utils::PrivateImplementation { ostream& dec() noexcept; ostream& hex() noexcept; + /*! @cond PRIVATE */ + // Sets a consumer of the log. The consumer is invoked on flush() and replaces the default. + // Thread safe and reentrant. + using ConsumerCallback = void(*)(void*, char const*); + void setConsumer(ConsumerCallback consumer, void* user) noexcept; + /*! @endcond */ + protected: ostream& print(const char* format, ...) noexcept; @@ -85,13 +92,14 @@ class UTILS_PUBLIC ostream : protected utils::PrivateImplementation { std::pair grow(size_t s) noexcept; void advance(ssize_t n) noexcept; void reset() noexcept; + size_t length() const noexcept; private: - void reserve(size_t newSize) noexcept; + void reserve(size_t newCapacity) noexcept; char* buffer = nullptr; // buffer address char* curr = nullptr; // current pointer - size_t size = 0; // size remaining + size_t sizeRemaining = 0; // size remaining size_t capacity = 0; // total capacity of the buffer }; @@ -104,10 +112,10 @@ class UTILS_PUBLIC ostream : protected utils::PrivateImplementation { friend ostream& hex(ostream& s) noexcept; friend ostream& dec(ostream& s) noexcept; friend ostream& endl(ostream& s) noexcept; - friend ostream& flush(ostream& s) noexcept; + UTILS_PUBLIC friend ostream& flush(ostream& s) noexcept; enum type { - SHORT, USHORT, CHAR, UCHAR, INT, UINT, LONG, ULONG, LONG_LONG, ULONG_LONG, DOUBLE, + SHORT, USHORT, CHAR, UCHAR, INT, UINT, LONG, ULONG, LONG_LONG, ULONG_LONG, FLOAT, DOUBLE, LONG_DOUBLE }; @@ -115,7 +123,7 @@ class UTILS_PUBLIC ostream : protected utils::PrivateImplementation { }; // handles utils::bitset -inline ostream& operator << (ostream& o, utils::bitset32 const& s) noexcept { +inline ostream& operator << (ostream& o, bitset32 const& s) noexcept { return o << (void*)uintptr_t(s.getValue()); } @@ -132,8 +140,7 @@ inline ostream& operator<<(ostream& stream, const VECTOR& v) { inline ostream& hex(ostream& s) noexcept { return s.hex(); } inline ostream& dec(ostream& s) noexcept { return s.dec(); } -inline ostream& endl(ostream& s) noexcept { s << '\n'; return s.flush(); } -inline ostream& flush(ostream& s) noexcept { return s.flush(); } +inline ostream& endl(ostream& s) noexcept { return flush(s << '\n'); } } // namespace utils::io diff --git a/libs/utils/include/utils/sstream.h b/libs/utils/include/utils/sstream.h index 8b0c4b4a2a6..58d14fefffb 100644 --- a/libs/utils/include/utils/sstream.h +++ b/libs/utils/include/utils/sstream.h @@ -17,14 +17,18 @@ #ifndef TNT_UTILS_SSTREAM_H #define TNT_UTILS_SSTREAM_H +#include #include +#include + namespace utils::io { -class sstream : public ostream { +class UTILS_PUBLIC sstream : public ostream { public: ostream& flush() noexcept override; const char* c_str() const noexcept; + size_t length() const noexcept; }; } // namespace utils::io diff --git a/libs/utils/include/utils/string.h b/libs/utils/include/utils/string.h index 040044c05e6..7823260b919 100644 --- a/libs/utils/include/utils/string.h +++ b/libs/utils/include/utils/string.h @@ -17,8 +17,6 @@ #ifndef TNT_UTILS_STRING_H #define TNT_UTILS_STRING_H -#include - namespace utils { float strtof_c(const char* start, char** end); diff --git a/libs/utils/src/Allocator.cpp b/libs/utils/src/Allocator.cpp index 2d7a8fcbe92..fd6e5945691 100644 --- a/libs/utils/src/Allocator.cpp +++ b/libs/utils/src/Allocator.cpp @@ -16,6 +16,8 @@ #include +#include +#include #include #include @@ -52,6 +54,29 @@ void LinearAllocator::swap(LinearAllocator& rhs) noexcept { std::swap(mCur, rhs.mCur); } + +// ------------------------------------------------------------------------------------------------ +// LinearAllocatorWithFallback +// ------------------------------------------------------------------------------------------------ + +void* LinearAllocatorWithFallback::alloc(size_t size, size_t alignment) { + void* p = LinearAllocator::alloc(size, alignment); + if (UTILS_UNLIKELY(!p)) { + p = HeapAllocator::alloc(size, alignment); + mHeapAllocations.push_back(p); + } + assert_invariant(p); + return p; +} + +void LinearAllocatorWithFallback::reset() noexcept { + LinearAllocator::reset(); + for (auto* p : mHeapAllocations) { + HeapAllocator::free(p); + } + mHeapAllocations.clear(); +} + // ------------------------------------------------------------------------------------------------ // FreeList // ------------------------------------------------------------------------------------------------ @@ -61,8 +86,8 @@ FreeList::Node* FreeList::init(void* begin, void* end, { void* const p = pointermath::align(begin, alignment, extra); void* const n = pointermath::align(pointermath::add(p, elementSize), alignment, extra); - assert(p >= begin && p < end); - assert(n >= begin && n < end && n > p); + assert_invariant(p >= begin && p < end); + assert_invariant(n >= begin && n < end && n > p); const size_t d = uintptr_t(n) - uintptr_t(p); const size_t num = (uintptr_t(end) - uintptr_t(p)) / d; @@ -77,8 +102,8 @@ FreeList::Node* FreeList::init(void* begin, void* end, cur->next = next; cur = next; } - assert(cur < end); - assert(pointermath::add(cur, d) <= end); + assert_invariant(cur < end); + assert_invariant(pointermath::add(cur, d) <= end); cur->next = nullptr; return head; } @@ -97,13 +122,13 @@ AtomicFreeList::AtomicFreeList(void* begin, void* end, { #ifdef __ANDROID__ // on some platform (e.g. web) this returns false. we really only care about mobile though. - assert(mHead.is_lock_free()); + assert_invariant(mHead.is_lock_free()); #endif void* const p = pointermath::align(begin, alignment, extra); void* const n = pointermath::align(pointermath::add(p, elementSize), alignment, extra); - assert(p >= begin && p < end); - assert(n >= begin && n < end && n > p); + assert_invariant(p >= begin && p < end); + assert_invariant(n >= begin && n < end && n > p); const size_t d = uintptr_t(n) - uintptr_t(p); const size_t num = (uintptr_t(end) - uintptr_t(p)) / d; @@ -119,8 +144,8 @@ AtomicFreeList::AtomicFreeList(void* begin, void* end, cur->next = next; cur = next; } - assert(cur < end); - assert(pointermath::add(cur, d) <= end); + assert_invariant(cur < end); + assert_invariant(pointermath::add(cur, d) <= end); cur->next = nullptr; mHead.store({ int32_t(head - mStorage), 0 }); @@ -148,22 +173,25 @@ TrackingPolicy::HighWatermark::~HighWatermark() noexcept { } void TrackingPolicy::HighWatermark::onFree(void* p, size_t size) noexcept { - assert(mCurrent >= size); + // FIXME: this code is incorrect with LinearAllocators because free() is a no-op for them + assert_invariant(mCurrent >= size); mCurrent -= uint32_t(size); } void TrackingPolicy::HighWatermark::onReset() noexcept { // we should never be here if mBase is nullptr because compilation would have failed when // Arena::onReset() tries to call the underlying allocator's onReset() - assert(mBase); + assert_invariant(mBase); mCurrent = 0; } void TrackingPolicy::HighWatermark::onRewind(void const* addr) noexcept { // we should never be here if mBase is nullptr because compilation would have failed when // Arena::onRewind() tries to call the underlying allocator's onReset() - assert(mBase); - assert(addr >= mBase); - mCurrent = uint32_t(uintptr_t(addr) - uintptr_t(mBase)); + assert_invariant(mBase); + // for LinearAllocatorWithFallback we could get pointers outside the range + if (addr >= mBase && addr < pointermath::add(mBase, mSize)) { + mCurrent = uint32_t(uintptr_t(addr) - uintptr_t(mBase)); + } } // ------------------------------------------------------------------------------------------------ @@ -183,7 +211,7 @@ void TrackingPolicy::Debug::onFree(void* p, size_t size) noexcept { void TrackingPolicy::Debug::onReset() noexcept { // we should never be here if mBase is nullptr because compilation would have failed when // Arena::onReset() tries to call the underlying allocator's onReset() - assert(mBase); + assert_invariant(mBase); memset(mBase, 0xec, mSize); } diff --git a/libs/utils/src/CString.cpp b/libs/utils/src/CString.cpp index 28b58d5f392..3e540a22e89 100644 --- a/libs/utils/src/CString.cpp +++ b/libs/utils/src/CString.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -97,4 +98,11 @@ CString& CString::replace(size_type pos, size_type len, const CString& str) noex return *this; } +#if !defined(NDEBUG) +io::ostream& operator<<(io::ostream& out, const utils::CString& rhs) { + return out << rhs.c_str_safe(); +} +#endif + } // namespace utils + diff --git a/libs/utils/src/CallStack.cpp b/libs/utils/src/CallStack.cpp index b41c18776da..47cb8558db2 100644 --- a/libs/utils/src/CallStack.cpp +++ b/libs/utils/src/CallStack.cpp @@ -15,14 +15,19 @@ */ #include -#include +#include +#include +#include -#include -#include #include #include +#include + +#include +#include +#include -// FIXME: Some platforms do not have execinfo.h (but have unwind.h) +// FIXME: Some platforms do not have execinfo.h #if !defined(__ANDROID__) && !defined(WIN32) && !defined(__EMSCRIPTEN__) #include #define HAS_EXECINFO 1 @@ -30,6 +35,13 @@ #define HAS_EXECINFO 0 #endif +// execinfo.h is available as of Android 33 +#if defined(__ANDROID__) && (__ANDROID_API__ >= 33) +#include +#undef HAS_EXECINFO +#define HAS_EXECINFO 1 +#endif + #if !defined(WIN32) && !defined(__EMSCRIPTEN__) #include #define HAS_DLADDR 1 @@ -81,19 +93,19 @@ void CallStack::update(size_t ignore) noexcept { update_gcc(ignore); } -void CallStack::update_gcc(size_t ignore) noexcept { +void CallStack::update_gcc(size_t UTILS_UNUSED ignore) noexcept { // reset the object ssize_t size = 0; - void* array[NUM_FRAMES]; #if HAS_EXECINFO + void* array[NUM_FRAMES]; size = ::backtrace(array, NUM_FRAMES); size -= ignore; -#endif for (ssize_t i = 0; i < size; i++) { m_stack[i].pc = intptr_t(array[ignore + i]); } size--; // the last one seems to always be 0x0 +#endif // update how many frames we have m_frame_count = size_t(std::max(ssize_t(0), size)); @@ -108,11 +120,11 @@ bool CallStack::operator<(const CallStack& rhs) const { // ------------------------------------------------------------------------------------------------ -utils::CString CallStack::demangle(const char* mangled) { +CString CallStack::demangle(const char* mangled) { #if !defined(NDEBUG) && !defined(WIN32) size_t len; int status; - std::unique_ptr demangled(abi::__cxa_demangle(mangled, nullptr, &len, &status)); + std::unique_ptr const demangled(abi::__cxa_demangle(mangled, nullptr, &len, &status)); if (!status && demangled) { // success return CString(demangled.get()); @@ -123,15 +135,15 @@ utils::CString CallStack::demangle(const char* mangled) { } -utils::CString CallStack::demangleTypeName(const char* mangled) { +CString CallStack::demangleTypeName(const char* mangled) { return demangle(mangled); } // ------------------------------------------------------------------------------------------------ -io::ostream& operator<<(io::ostream& stream, const CallStack& callstack) { +io::ostream& operator<<(io::ostream& stream, CallStack const& UTILS_UNUSED callstack) { #if HAS_EXECINFO - size_t size = callstack.getFrameCount(); + size_t const size = callstack.getFrameCount(); char buf[1024]; for (size_t i = 0; i < size; i++) { Dl_info info; @@ -152,7 +164,7 @@ io::ostream& operator<<(io::ostream& stream, const CallStack& callstack) { { char** symbols = ::backtrace_symbols(&pc, 1); stream << "#" << i << "\t" << symbols[0] << "\n"; - free(symbols); + free((void*)symbols); } } stream << io::endl; diff --git a/libs/utils/src/EntityManager.cpp b/libs/utils/src/EntityManager.cpp index 733eb4ec722..fda7cfeea9d 100644 --- a/libs/utils/src/EntityManager.cpp +++ b/libs/utils/src/EntityManager.cpp @@ -18,8 +18,12 @@ #include "EntityManagerImpl.h" +#include + namespace utils { +EntityManager::Listener::~Listener() noexcept = default; + EntityManager::EntityManager() : mGens(new uint8_t[RAW_INDEX_COUNT]) { // initialize all the generations to 0 @@ -30,12 +34,10 @@ EntityManager::~EntityManager() { delete [] mGens; } -EntityManager::Listener::~Listener() noexcept = default; - EntityManager& EntityManager::get() noexcept { // note: we leak the EntityManager because it's more important that it survives everything else - // the leak is really not a problem because the process is terminating anyways. - static EntityManagerImpl* instance = new EntityManagerImpl; + // the leak is really not a problem because the process is terminating anyway. + static EntityManagerImpl* instance = new(std::nothrow) EntityManagerImpl; return *instance; } @@ -47,14 +49,18 @@ void EntityManager::destroy(size_t n, Entity* entities) noexcept { static_cast(this)->destroy(n, entities); } -void EntityManager::registerListener(EntityManager::Listener* l) noexcept { +void EntityManager::registerListener(Listener* l) noexcept { static_cast(this)->registerListener(l); } -void EntityManager::unregisterListener(EntityManager::Listener* l) noexcept { +void EntityManager::unregisterListener(Listener* l) noexcept { static_cast(this)->unregisterListener(l); } +size_t EntityManager::getEntityCount() const noexcept { + return static_cast(this)->getEntityCount(); +} + #if FILAMENT_UTILS_TRACK_ENTITIES std::vector EntityManager::getActiveEntities() const { return static_cast(this)->getActiveEntities(); diff --git a/libs/utils/src/EntityManagerImpl.h b/libs/utils/src/EntityManagerImpl.h index e9c7ef1699e..f385a8a7c4e 100644 --- a/libs/utils/src/EntityManagerImpl.h +++ b/libs/utils/src/EntityManagerImpl.h @@ -48,6 +48,16 @@ class UTILS_PRIVATE EntityManagerImpl : public EntityManager { using EntityManager::create; using EntityManager::destroy; + UTILS_NOINLINE + size_t getEntityCount() const noexcept { + std::lock_guard const lock(mFreeListLock); + if (mCurrentIndex < RAW_INDEX_COUNT) { + return (mCurrentIndex - 1) - mFreeList.size(); + } else { + return getMaxEntityCount() - mFreeList.size(); + } + } + UTILS_NOINLINE void create(size_t n, Entity* entities) { Entity::Type index{}; @@ -55,12 +65,9 @@ class UTILS_PRIVATE EntityManagerImpl : public EntityManager { uint8_t* const gens = mGens; // this must be thread-safe, acquire the free-list mutex - std::lock_guard lock(mFreeListLock); + std::lock_guard const lock(mFreeListLock); Entity::Type currentIndex = mCurrentIndex; for (size_t i = 0; i < n; i++) { - // If we have more than a certain number of freed indices, get one from the list. - // this is a trade-off between how often we recycle indices and how large the free list - // can grow. if (UTILS_UNLIKELY(currentIndex >= RAW_INDEX_COUNT || freeList.size() >= MIN_FREE_INDICES)) { // this could only happen if we had gone through all the indices at least once @@ -73,10 +80,6 @@ class UTILS_PRIVATE EntityManagerImpl : public EntityManager { index = freeList.front(); freeList.pop_front(); } else { - // In the common case, we just grab the next index. - // This works only until all indices have been used once, at which point - // we're always in the slower case above. The idea is that we have enough indices - // that it doesn't happen in practice. index = currentIndex++; } entities[i] = Entity{ makeIdentity(gens[index], index) }; @@ -106,7 +109,7 @@ class UTILS_PRIVATE EntityManagerImpl : public EntityManager { // against it. We don't guarantee anything about external state -- e.g. the listeners // will be called. if (isAlive(entities[i])) { - Entity::Type index = getIndex(entities[i]); + Entity::Type const index = getIndex(entities[i]); freeList.push_back(index); // The generation update doesn't require the lock because it's only used for isAlive() @@ -129,13 +132,13 @@ class UTILS_PRIVATE EntityManagerImpl : public EntityManager { } } - void registerListener(EntityManager::Listener* l) noexcept { - std::lock_guard lock(mListenerLock); + void registerListener(Listener* l) noexcept { + std::lock_guard const lock(mListenerLock); mListeners.insert(l); } - void unregisterListener(EntityManager::Listener* l) noexcept { - std::lock_guard lock(mListenerLock); + void unregisterListener(Listener* l) noexcept { + std::lock_guard const lock(mListenerLock); mListeners.erase(l); } @@ -159,10 +162,10 @@ class UTILS_PRIVATE EntityManagerImpl : public EntityManager { #endif private: - utils::FixedCapacityVector getListeners() const noexcept { - std::lock_guard lock(mListenerLock); + FixedCapacityVector getListeners() const noexcept { + std::lock_guard const lock(mListenerLock); tsl::robin_set const& listeners = mListeners; - utils::FixedCapacityVector result(listeners.size()); + FixedCapacityVector result(listeners.size()); result.resize(result.capacity()); // unfortunately this memset() std::copy(listeners.begin(), listeners.end(), result.begin()); return result; // the c++ standard guarantees a move diff --git a/libs/utils/src/JobSystem.cpp b/libs/utils/src/JobSystem.cpp index 158f594e0b2..ae8bba5443c 100644 --- a/libs/utils/src/JobSystem.cpp +++ b/libs/utils/src/JobSystem.cpp @@ -23,19 +23,31 @@ // when SYSTRACE_TAG_JOBSYSTEM is used, enables even heavier systraces #define HEAVY_SYSTRACE 0 -// enable for catching hangs waiting on a job to finish -static constexpr bool DEBUG_FINISH_HANGS = false; - #include #include -#include +#include +#include +#include #include #include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include #include +#include +#include + #if defined(WIN32) # define NOMINMAX @@ -46,16 +58,20 @@ static constexpr bool DEBUG_FINISH_HANGS = false; #endif #ifdef __ANDROID__ + // see https://developer.android.com/topic/performance/threads#priority # include # include # ifndef ANDROID_PRIORITY_URGENT_DISPLAY -# define ANDROID_PRIORITY_URGENT_DISPLAY -8 // see include/system/thread_defs.h +# define ANDROID_PRIORITY_URGENT_DISPLAY (-8) # endif # ifndef ANDROID_PRIORITY_DISPLAY -# define ANDROID_PRIORITY_DISPLAY -4 // see include/system/thread_defs.h +# define ANDROID_PRIORITY_DISPLAY (-4) # endif # ifndef ANDROID_PRIORITY_NORMAL -# define ANDROID_PRIORITY_NORMAL 0 // see include/system/thread_defs.h +# define ANDROID_PRIORITY_NORMAL (0) +# endif +# ifndef ANDROID_PRIORITY_BACKGROUND +# define ANDROID_PRIORITY_BACKGROUND (10) # endif #elif defined(__linux__) // There is no glibc wrapper for gettid on linux so we need to syscall it. @@ -97,6 +113,9 @@ void JobSystem::setThreadPriority(Priority priority) noexcept { #ifdef __ANDROID__ int androidPriority = 0; switch (priority) { + case Priority::BACKGROUND: + androidPriority = ANDROID_PRIORITY_BACKGROUND; + break; case Priority::NORMAL: androidPriority = ANDROID_PRIORITY_NORMAL; break; @@ -107,7 +126,38 @@ void JobSystem::setThreadPriority(Priority priority) noexcept { androidPriority = ANDROID_PRIORITY_URGENT_DISPLAY; break; } - setpriority(PRIO_PROCESS, 0, androidPriority); + errno = 0; + UTILS_UNUSED_IN_RELEASE int error; + error = setpriority(PRIO_PROCESS, 0, androidPriority); +#ifndef NDEBUG + if (UTILS_UNLIKELY(error)) { + slog.w << "setpriority failed: " << strerror(errno) << io::endl; + } +#endif +#elif defined(__APPLE__) + qos_class_t qosClass = QOS_CLASS_DEFAULT; + switch (priority) { + case Priority::BACKGROUND: + qosClass = QOS_CLASS_BACKGROUND; + break; + case Priority::NORMAL: + qosClass = QOS_CLASS_DEFAULT; + break; + case Priority::DISPLAY: + qosClass = QOS_CLASS_USER_INTERACTIVE; + break; + case Priority::URGENT_DISPLAY: + qosClass = QOS_CLASS_USER_INTERACTIVE; + break; + } + errno = 0; + UTILS_UNUSED_IN_RELEASE int error; + error = pthread_set_qos_class_self_np(qosClass, 0); +#ifndef NDEBUG + if (UTILS_UNLIKELY(error)) { + slog.w << "pthread_set_qos_class_self_np failed: " << strerror(errno) << io::endl; + } +#endif #endif } @@ -126,10 +176,10 @@ JobSystem::JobSystem(const size_t userThreadCount, const size_t adoptableThreads { SYSTRACE_ENABLE(); - int threadPoolCount = userThreadCount; + unsigned int threadPoolCount = userThreadCount; if (threadPoolCount == 0) { // default value, system dependant - int hwThreads = std::thread::hardware_concurrency(); + unsigned int hwThreads = std::thread::hardware_concurrency(); if (UTILS_HAS_HYPER_THREADING) { // For now we avoid using HT, this simplifies profiling. // TODO: figure-out what to do with Hyper-threading @@ -140,9 +190,9 @@ JobSystem::JobSystem(const size_t userThreadCount, const size_t adoptableThreads threadPoolCount = hwThreads - 1; } // make sure we have at least one thread in the thread pool - threadPoolCount = std::max(1, threadPoolCount); + threadPoolCount = std::max(1u, threadPoolCount); // and also limit the pool to 32 threads - threadPoolCount = std::min(UTILS_HAS_THREADING ? 32 : 0, threadPoolCount); + threadPoolCount = std::min(UTILS_HAS_THREADING ? 32u : 0u, threadPoolCount); mThreadStates = aligned_vector(threadPoolCount + adoptableThreadsCount); mThreadCount = uint16_t(threadPoolCount); @@ -159,7 +209,6 @@ JobSystem::JobSystem(const size_t userThreadCount, const size_t adoptableThreads for (size_t i = 0, n = states.size(); i < n; i++) { auto& state = states[i]; state.rndGen = default_random_engine(rd()); - state.id = (uint32_t)i; state.js = this; if (i < hardwareThreadCount) { // don't start a thread of adoptable thread slots @@ -207,7 +256,7 @@ void JobSystem::decRef(Job const* job) noexcept { void JobSystem::requestExit() noexcept { mExitRequested.store(true); - std::lock_guard lock(mWaiterLock); + std::lock_guard const lock(mWaiterLock); mWaiterCondition.notify_all(); } @@ -220,67 +269,65 @@ inline bool JobSystem::hasActiveJobs() const noexcept { return mActiveJobs.load(std::memory_order_relaxed) > 0; } -inline bool JobSystem::hasJobCompleted(JobSystem::Job const* job) noexcept { - return job->runningJobCount.load(std::memory_order_acquire) <= 0; +inline bool JobSystem::hasJobCompleted(Job const* job) noexcept { + return (job->runningJobCount.load(std::memory_order_acquire) & JOB_COUNT_MASK) == 0; } -void JobSystem::wait(std::unique_lock& lock, Job* job) noexcept { - if constexpr (!DEBUG_FINISH_HANGS) { - mWaiterCondition.wait(lock); - } else { - do { - // we use a pretty long timeout (4s) so we're very confident that the system is hung - // and nothing else is happening. - std::cv_status status = mWaiterCondition.wait_for(lock, - std::chrono::milliseconds(4000)); - if (status == std::cv_status::no_timeout) { - break; - } +inline void JobSystem::wait(std::unique_lock& lock) noexcept { + HEAVY_SYSTRACE_CALL(); + mWaiterCondition.wait(lock); +} - // hang debugging... +inline uint32_t JobSystem::wait(std::unique_lock& lock, Job* const job) noexcept { + HEAVY_SYSTRACE_CALL(); + // signal we are waiting - // we check of we had active jobs or if the job we're waiting on had completed already. - // there is the possibility of a race condition, but our long timeout gives us some - // confidence that we're in an incorrect state. + if (hasActiveJobs() || exitRequested()) { + return job->runningJobCount.load(std::memory_order_acquire); + } - auto id = getState().id; - auto activeJobs = mActiveJobs.load(); + uint32_t runningJobCount = + job->runningJobCount.fetch_add(1 << WAITER_COUNT_SHIFT, std::memory_order_relaxed); - if (job) { - auto runningJobCount = job->runningJobCount.load(); - ASSERT_POSTCONDITION(runningJobCount > 0, - "JobSystem(%p, %d): waiting while job %p has completed and %d jobs are active!", - this, id, job, activeJobs); - } + if (runningJobCount & JOB_COUNT_MASK) { + mWaiterCondition.wait(lock); + } - ASSERT_POSTCONDITION(activeJobs <= 0, - "JobSystem(%p, %d): waiting while %d jobs are active!", - this, id, activeJobs); + runningJobCount = + job->runningJobCount.fetch_sub(1 << WAITER_COUNT_SHIFT, std::memory_order_acquire); - } while (true); - } + assert_invariant((runningJobCount >> WAITER_COUNT_SHIFT) >= 1); + + return runningJobCount; } +UTILS_NOINLINE void JobSystem::wakeAll() noexcept { - HEAVY_SYSTRACE_CALL(); - std::lock_guard lock(mWaiterLock); + // wakeAll() is called when a job finishes (to wake up any thread that might be waiting on it) + SYSTRACE_CALL(); + mWaiterLock.lock(); // this empty critical section is needed -- it guarantees that notify_all() happens - // after the condition's variables are set. + // either before the condition is checked, or after the condition variable sleeps. + mWaiterLock.unlock(); + // notify_all() can be pretty slow, and it doesn't need to be inside the lock. mWaiterCondition.notify_all(); } void JobSystem::wakeOne() noexcept { + // wakeOne() is called when a new job is added to a queue HEAVY_SYSTRACE_CALL(); - std::lock_guard lock(mWaiterLock); + mWaiterLock.lock(); // this empty critical section is needed -- it guarantees that notify_one() happens - // after the condition's variables are set. + // either before the condition is checked, or after the condition variable sleeps. + mWaiterLock.unlock(); + // notify_one() can be pretty slow, and it doesn't need to be inside the lock. mWaiterCondition.notify_one(); } inline JobSystem::ThreadState& JobSystem::getState() noexcept { - std::lock_guard lock(mThreadMapLock); + std::lock_guard const lock(mThreadMapLock); auto iter = mThreadMap.find(std::this_thread::get_id()); - ASSERT_PRECONDITION(iter != mThreadMap.end(), "This thread has not been adopted."); + FILAMENT_CHECK_PRECONDITION(iter != mThreadMap.end()) << "This thread has not been adopted."; return *iter->second; } @@ -290,77 +337,57 @@ JobSystem::Job* JobSystem::allocateJob() noexcept { void JobSystem::put(WorkQueue& workQueue, Job* job) noexcept { assert(job); - size_t index = job - mJobStorageBase; + size_t const index = job - mJobStorageBase; assert(index >= 0 && index < MAX_JOB_COUNT); - // put the job into the queue first + // put the job into the queue workQueue.push(uint16_t(index + 1)); - // then increase our active job count - uint32_t oldActiveJobs = mActiveJobs.fetch_add(1, std::memory_order_relaxed); - // but it's possible that the job has already been picked-up, so oldActiveJobs could be - // negative for instance. We signal only if that's not the case. - if (oldActiveJobs >= 0) { - wakeOne(); // wake-up a thread if needed... - } + + // increase our active job count (the order in which we're doing this must not matter + // because we're not using std::memory_order_seq_cst (here or in WorkQueue::push()). + mActiveJobs.fetch_add(1, std::memory_order_relaxed); + + // Note: it's absolutely possible for mActiveJobs to be 0 here, because the job could have + // been handled by a zealous worker already. In that case we could avoid calling wakeOne(), + // but that is not the common case. + + wakeOne(); } JobSystem::Job* JobSystem::pop(WorkQueue& workQueue) noexcept { - // decrement mActiveJobs first, this is to ensure that if there is only a single job left - // (and we're about to pick it up), other threads don't loop trying to do the same. - mActiveJobs.fetch_sub(1, std::memory_order_relaxed); - - size_t index = workQueue.pop(); + size_t const index = workQueue.pop(); assert(index <= MAX_JOB_COUNT); - Job* job = !index ? nullptr : &mJobStorageBase[index - 1]; - - // if our guess was wrong, i.e. we couldn't pick-up a job (b/c our queue was empty), we - // need to correct mActiveJobs. - if (!job) { - if (mActiveJobs.fetch_add(1, std::memory_order_relaxed) >= 0) { - // and if there are some active jobs, then we need to wake someone up. We know it - // can't be us, because we failed taking a job and we know another thread can't - // have added one in our queue. - wakeOne(); - } + Job* const job = !index ? nullptr : &mJobStorageBase[index - 1]; + if (UTILS_LIKELY(job)) { + mActiveJobs.fetch_sub(1, std::memory_order_relaxed); } return job; } JobSystem::Job* JobSystem::steal(WorkQueue& workQueue) noexcept { - // decrement mActiveJobs first, this is to ensure that if there is only a single job left - // (and we're about to pick it up), other threads don't loop trying to do the same. - mActiveJobs.fetch_sub(1, std::memory_order_relaxed); - - size_t index = workQueue.steal(); - assert(index <= MAX_JOB_COUNT); - Job* job = !index ? nullptr : &mJobStorageBase[index - 1]; - - // if we failed taking a job, we need to correct mActiveJobs - if (!job) { - if (mActiveJobs.fetch_add(1, std::memory_order_relaxed) >= 0) { - // and if there are some active jobs, then we need to wake someone up. We know it - // can't be us, because we failed taking a job and we know another thread can't - // have added one in our queue. - wakeOne(); - } + size_t const index = workQueue.steal(); + assert_invariant(index <= MAX_JOB_COUNT); + Job* const job = !index ? nullptr : &mJobStorageBase[index - 1]; + if (UTILS_LIKELY(job)) { + mActiveJobs.fetch_sub(1, std::memory_order_relaxed); } return job; } -inline JobSystem::ThreadState* JobSystem::getStateToStealFrom(JobSystem::ThreadState& state) noexcept { +inline JobSystem::ThreadState* JobSystem::getStateToStealFrom(ThreadState& state) noexcept { auto& threadStates = mThreadStates; // memory_order_relaxed is okay because we don't take any action that has data dependency // on this value (in particular mThreadStates, is always initialized properly). - uint16_t adopted = mAdoptedThreads.load(std::memory_order_relaxed); + uint16_t const adopted = mAdoptedThreads.load(std::memory_order_relaxed); uint16_t const threadCount = mThreadCount + adopted; - JobSystem::ThreadState* stateToStealFrom = nullptr; + ThreadState* stateToStealFrom = nullptr; // don't try to steal from someone else if we're the only thread (infinite loop) if (threadCount >= 2) { do { - // this is biased, but frankly, we don't care. it's fast. - uint16_t index = uint16_t(state.rndGen() % threadCount); + // This is biased, but frankly, we don't care. It's fast. + uint16_t const index = uint16_t(state.rndGen() % threadCount); assert(index < threadStates.size()); stateToStealFrom = &threadStates[index]; // don't steal from our own queue @@ -369,12 +396,12 @@ inline JobSystem::ThreadState* JobSystem::getStateToStealFrom(JobSystem::ThreadS return stateToStealFrom; } -JobSystem::Job* JobSystem::steal(JobSystem::ThreadState& state) noexcept { +JobSystem::Job* JobSystem::steal(ThreadState& state) noexcept { HEAVY_SYSTRACE_CALL(); Job* job = nullptr; do { ThreadState* const stateToStealFrom = getStateToStealFrom(state); - if (UTILS_LIKELY(stateToStealFrom)) { + if (stateToStealFrom) { job = steal(stateToStealFrom->workQueue); } // nullptr -> nothing to steal in that queue either, if there are active jobs, @@ -383,21 +410,27 @@ JobSystem::Job* JobSystem::steal(JobSystem::ThreadState& state) noexcept { return job; } -bool JobSystem::execute(JobSystem::ThreadState& state) noexcept { +bool JobSystem::execute(ThreadState& state) noexcept { HEAVY_SYSTRACE_CALL(); Job* job = pop(state.workQueue); - if (UTILS_UNLIKELY(job == nullptr)) { + + // It is beneficial for some benchmarks to poll on steal() for a bit, because going back to + // sleep and waking up is pretty expensive. However, it is unclear it helps in practice with + // larger jobs or when parallel_for is used. + constexpr size_t const STEAL_TRY_COUNT = 1; + for (size_t i = 0; UTILS_UNLIKELY(!job && i < STEAL_TRY_COUNT); i++) { // our queue is empty, try to steal a job job = steal(state); } - if (job) { - assert(job->runningJobCount.load(std::memory_order_relaxed) >= 1); - + if (UTILS_LIKELY(job)) { + assert((job->runningJobCount.load(std::memory_order_relaxed) & JOB_COUNT_MASK) >= 1); if (UTILS_LIKELY(job->function)) { HEAVY_SYSTRACE_NAME("job->function"); + job->id = std::distance(mThreadStates.data(), &state); job->function(job->storage, *this, job); + job->id = invalidThreadId; } finish(job); } @@ -408,15 +441,12 @@ void JobSystem::loop(ThreadState* state) noexcept { setThreadName("JobSystem::loop"); setThreadPriority(Priority::DISPLAY); - // set a CPU affinity on each of our JobSystem thread to prevent them from jumping from core - // to core. On Android, it looks like the affinity needs to be reset from time to time. - setThreadAffinityById(state->id); - // record our work queue - mThreadMapLock.lock(); - bool inserted = mThreadMap.emplace(std::this_thread::get_id(), state).second; - mThreadMapLock.unlock(); - ASSERT_PRECONDITION(inserted, "This thread is already in a loop."); + std::unique_lock lock(mThreadMapLock); + bool const inserted = mThreadMap.emplace(std::this_thread::get_id(), state).second; + lock.unlock(); + + FILAMENT_CHECK_PRECONDITION(inserted) << "This thread is already in a loop."; // run our main loop... do { @@ -424,7 +454,6 @@ void JobSystem::loop(ThreadState* state) noexcept { std::unique_lock lock(mWaiterLock); while (!exitRequested() && !hasActiveJobs()) { wait(lock); - setThreadAffinityById(state->id); } } } while (!exitRequested()); @@ -441,11 +470,16 @@ void JobSystem::finish(Job* job) noexcept { do { // std::memory_order_release here is needed to synchronize with JobSystem::wait() // which needs to "see" all changes that happened before the job terminated. - auto runningJobCount = job->runningJobCount.fetch_sub(1, std::memory_order_acq_rel); + uint32_t const v = job->runningJobCount.fetch_sub(1, std::memory_order_acq_rel); + uint32_t const runningJobCount = v & JOB_COUNT_MASK; assert(runningJobCount > 0); + if (runningJobCount == 1) { // no more work, destroy this job and notify its parent - notify = true; + uint32_t const waiters = v >> WAITER_COUNT_SHIFT; + if (waiters) { + notify = true; + } Job* const parent = job->parent == 0x7FFF ? nullptr : &storage[job->parent]; decRef(job); job = parent; @@ -456,7 +490,8 @@ void JobSystem::finish(Job* job) noexcept { } while (job); // wake-up all threads that could potentially be waiting on this job finishing - if (notify) { + if (UTILS_UNLIKELY(notify)) { + // but avoid calling notify_all() at all cost, because it's always expensive wakeAll(); } } @@ -465,7 +500,7 @@ void JobSystem::finish(Job* job) noexcept { // public API... -JobSystem::Job* JobSystem::create(JobSystem::Job* parent, JobFunc func) noexcept { +JobSystem::Job* JobSystem::create(Job* parent, JobFunc func) noexcept { parent = (parent == nullptr) ? mRootJob : parent; Job* const job = allocateJob(); if (UTILS_LIKELY(job)) { @@ -474,10 +509,11 @@ JobSystem::Job* JobSystem::create(JobSystem::Job* parent, JobFunc func) noexcept // add a reference to the parent to make sure it can't be terminated. // memory_order_relaxed is safe because no action is taken at this point // (the job is not started yet). - auto parentJobCount = parent->runningJobCount.fetch_add(1, std::memory_order_relaxed); + UTILS_UNUSED_IN_RELEASE auto const parentJobCount = + parent->runningJobCount.fetch_add(1, std::memory_order_relaxed); // can't create a child job of a terminated parent - assert(parentJobCount > 0); + assert((parentJobCount & JOB_COUNT_MASK) > 0); index = parent - mJobStorageBase; assert(index < MAX_JOB_COUNT); @@ -493,21 +529,17 @@ void JobSystem::cancel(Job*& job) noexcept { job = nullptr; } -JobSystem::Job* JobSystem::retain(JobSystem::Job* job) noexcept { - JobSystem::Job* retained = job; +JobSystem::Job* JobSystem::retain(Job* job) noexcept { + Job* retained = job; incRef(retained); return retained; } -void JobSystem::release(JobSystem::Job*& job) noexcept { +void JobSystem::release(Job*& job) noexcept { decRef(job); job = nullptr; } -void JobSystem::signal() noexcept { - wakeAll(); -} - void JobSystem::run(Job*& job) noexcept { HEAVY_SYSTRACE_CALL(); @@ -519,8 +551,20 @@ void JobSystem::run(Job*& job) noexcept { job = nullptr; } +void JobSystem::run(Job*& job, uint8_t id) noexcept { + HEAVY_SYSTRACE_CALL(); + + ThreadState& state = mThreadStates[id]; + assert_invariant(&state == &getState()); + + put(state.workQueue, job); + + // after run() returns, the job is virtually invalid (it'll die on its own) + job = nullptr; +} + JobSystem::Job* JobSystem::runAndRetain(Job* job) noexcept { - JobSystem::Job* retained = retain(job); + Job* retained = retain(job); run(job); return retained; } @@ -533,7 +577,7 @@ void JobSystem::waitAndRelease(Job*& job) noexcept { ThreadState& state(getState()); do { - if (!execute(state)) { + if (UTILS_UNLIKELY(!execute(state))) { // test if job has completed first, to possibly avoid taking the lock if (hasJobCompleted(job)) { break; @@ -549,11 +593,23 @@ void JobSystem::waitAndRelease(Job*& job) noexcept { // continue to handle more jobs, as they get added. std::unique_lock lock(mWaiterLock); - if (!hasJobCompleted(job) && !hasActiveJobs() && !exitRequested()) { - wait(lock, job); + uint32_t const runningJobCount = wait(lock, job); + // we could be waking up because either: + // - the job we're waiting on has completed + // - more jobs where added to the JobSystem + // - we're asked to exit + if ((runningJobCount & JOB_COUNT_MASK) == 0 || exitRequested()) { + break; } + + // if we get here, it means that + // - the job we're waiting on is still running, and + // - we're not asked to exit, and + // - there were some active jobs + // So we try to handle one. + continue; } - } while (!hasJobCompleted(job) && !exitRequested()); + } while (UTILS_LIKELY(!hasJobCompleted(job) && !exitRequested())); if (job == mRootJob) { mRootJob = nullptr; @@ -562,7 +618,8 @@ void JobSystem::waitAndRelease(Job*& job) noexcept { release(job); } -void JobSystem::runAndWait(JobSystem::Job*& job) noexcept { +void JobSystem::runAndWait(Job*& job) noexcept { + SYSTRACE_CALL(); runAndRetain(job); waitAndRelease(job); } @@ -570,28 +627,28 @@ void JobSystem::runAndWait(JobSystem::Job*& job) noexcept { void JobSystem::adopt() { const auto tid = std::this_thread::get_id(); - std::unique_lock lock(mThreadMapLock); + std::unique_lock lock(mThreadMapLock); auto iter = mThreadMap.find(tid); ThreadState* const state = iter == mThreadMap.end() ? nullptr : iter->second; lock.unlock(); if (state) { // we're already part of a JobSystem, do nothing. - ASSERT_PRECONDITION(this == state->js, - "Called adopt on a thread owned by another JobSystem (%p), this=%p!", - state->js, this); + FILAMENT_CHECK_PRECONDITION(this == state->js) + << "Called adopt on a thread owned by another JobSystem (" << state->js + << "), this=" << this << "!"; return; } // memory_order_relaxed is safe because we don't take action on this value. - uint16_t adopted = mAdoptedThreads.fetch_add(1, std::memory_order_relaxed); - size_t index = mThreadCount + adopted; + uint16_t const adopted = mAdoptedThreads.fetch_add(1, std::memory_order_relaxed); + size_t const index = mThreadCount + adopted; - ASSERT_POSTCONDITION(index < mThreadStates.size(), - "Too many calls to adopt(). No more adoptable threads!"); + FILAMENT_CHECK_POSTCONDITION(index < mThreadStates.size()) + << "Too many calls to adopt(). No more adoptable threads!"; // all threads adopted by the JobSystem need to run at the same priority - JobSystem::setThreadPriority(JobSystem::Priority::DISPLAY); + setThreadPriority(Priority::DISPLAY); // This thread's queue will be selectable immediately (i.e.: before we set its TLS) // however, it's not a problem since mThreadState is pre-initialized and valid @@ -603,17 +660,18 @@ void JobSystem::adopt() { void JobSystem::emancipate() { const auto tid = std::this_thread::get_id(); - std::lock_guard lock(mThreadMapLock); + std::unique_lock const lock(mThreadMapLock); auto iter = mThreadMap.find(tid); ThreadState* const state = iter == mThreadMap.end() ? nullptr : iter->second; - ASSERT_PRECONDITION(state, "this thread is not an adopted thread"); - ASSERT_PRECONDITION(state->js == this, "this thread is not adopted by us"); + FILAMENT_CHECK_PRECONDITION(state) << "this thread is not an adopted thread"; + FILAMENT_CHECK_PRECONDITION(state->js == this) << "this thread is not adopted by us"; mThreadMap.erase(iter); } io::ostream& operator<<(io::ostream& out, JobSystem const& js) { for (auto const& item : js.mThreadStates) { - out << size_t(item.id) << ": " << item.workQueue.getCount() << io::endl; + size_t const id = std::distance(js.mThreadStates.data(), &item); + out << id << ": " << item.workQueue.getCount() << io::endl; } return out; } diff --git a/libs/utils/src/Log.cpp b/libs/utils/src/Log.cpp index 6571774ecba..86eaa5531ca 100644 --- a/libs/utils/src/Log.cpp +++ b/libs/utils/src/Log.cpp @@ -27,6 +27,12 @@ # endif #endif +#if defined(__EMSCRIPTEN__) +#include +#endif + +#include + namespace utils { namespace io { @@ -42,47 +48,61 @@ class LogStream : public ostream { ostream& flush() noexcept override; private: - Priority mPriority; + const Priority mPriority; }; ostream& LogStream::flush() noexcept { - std::lock_guard lock(mImpl->mLock); + std::lock_guard const lock(mImpl->mLock); Buffer& buf = getBuffer(); + char const* const str = buf.get(); + if (UTILS_UNLIKELY(!str)) { + // this can happen if the log hasn't been written ever + return *this; + } + #ifdef __ANDROID__ + int prio = ANDROID_LOG_UNKNOWN; + switch (mPriority) { + case LOG_DEBUG: prio = ANDROID_LOG_DEBUG; break; + case LOG_ERROR: prio = ANDROID_LOG_ERROR; break; + case LOG_WARNING: prio = ANDROID_LOG_WARN; break; + case LOG_INFO: prio = ANDROID_LOG_INFO; break; + case LOG_VERBOSE: prio = ANDROID_LOG_VERBOSE; break; + } + __android_log_write(prio, UTILS_LOG_TAG, str); +#elif defined(__EMSCRIPTEN__) switch (mPriority) { case LOG_DEBUG: - __android_log_write(ANDROID_LOG_DEBUG, UTILS_LOG_TAG, buf.get()); - break; - case LOG_ERROR: - __android_log_write(ANDROID_LOG_ERROR, UTILS_LOG_TAG, buf.get()); - break; case LOG_WARNING: - __android_log_write(ANDROID_LOG_WARN, UTILS_LOG_TAG, buf.get()); - break; case LOG_INFO: - __android_log_write(ANDROID_LOG_INFO, UTILS_LOG_TAG, buf.get()); + _emscripten_out(str); + break; + case LOG_ERROR: + _emscripten_err(str); break; case LOG_VERBOSE: - __android_log_write(ANDROID_LOG_VERBOSE, UTILS_LOG_TAG, buf.get()); +#ifndef NFIL_DEBUG + _emscripten_out(str); +#endif break; } -#else // ANDROID +#else // not ANDROID or EMSCRIPTEN switch (mPriority) { case LOG_DEBUG: case LOG_WARNING: case LOG_INFO: - fprintf(stdout, "%s", buf.get()); + fprintf(stdout, "%s", str); break; case LOG_ERROR: - fprintf(stderr, "%s", buf.get()); + fprintf(stderr, "%s", str); break; case LOG_VERBOSE: #ifndef NDEBUG - fprintf(stdout, "%s", buf.get()); + fprintf(stdout, "%s", str); #endif break; } -#endif // __ANDROID__ +#endif // __ANDROID__ or __EMSCRIPTEN__ buf.reset(); return *this; } diff --git a/libs/utils/src/NameComponentManager.cpp b/libs/utils/src/NameComponentManager.cpp index 98bb3839a32..eae5df4a163 100644 --- a/libs/utils/src/NameComponentManager.cpp +++ b/libs/utils/src/NameComponentManager.cpp @@ -21,7 +21,7 @@ namespace utils { static constexpr size_t NAME = 0; -NameComponentManager::NameComponentManager(EntityManager& em) { +NameComponentManager::NameComponentManager(EntityManager&) { } NameComponentManager::~NameComponentManager() = default; @@ -36,14 +36,6 @@ const char* NameComponentManager::getName(Instance instance) const noexcept { return elementAt(instance).c_str(); } -size_t NameComponentManager::getComponentCount() const noexcept { - return SingleInstanceComponentManager::getComponentCount(); -} - -Entity const* NameComponentManager::getEntities() const noexcept { - return SingleInstanceComponentManager::getEntities(); -} - void NameComponentManager::addComponent(Entity e) { SingleInstanceComponentManager::addComponent(e); } @@ -52,8 +44,4 @@ void NameComponentManager::removeComponent(Entity e) { SingleInstanceComponentManager::removeComponent(e); } -void NameComponentManager::gc(const EntityManager& em, size_t ratio) noexcept { - SingleInstanceComponentManager::gc(em, ratio); -} - } // namespace utils diff --git a/libs/utils/src/Panic.cpp b/libs/utils/src/Panic.cpp index 023a79b2477..1b8921ac068 100644 --- a/libs/utils/src/Panic.cpp +++ b/libs/utils/src/Panic.cpp @@ -16,18 +16,69 @@ #include -#include -#include -#include -#include +#include "ostream_.h" +#include #include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include namespace utils { -static std::string formatString(const char* format, va_list args) noexcept { - std::string reason; +// ------------------------------------------------------------------------------------------------ + +class UserPanicHandler { + struct CallBack { + Panic::PanicHandlerCallback handler = nullptr; + void* user = nullptr; + void call(Panic const& panic) const noexcept { + if (UTILS_UNLIKELY(handler)) { + handler(user, panic); + } + } + }; + + mutable std::mutex mLock{}; + CallBack mCallBack{}; + + CallBack getCallback() const noexcept { + std::lock_guard const lock(mLock); + return mCallBack; + } + +public: + static UserPanicHandler& get() noexcept { + static UserPanicHandler data; + return data; + } + + void call(Panic const& panic) const noexcept { + getCallback().call(panic); + } + + void set(Panic::PanicHandlerCallback handler, void* user) noexcept { + std::lock_guard const lock(mLock); + mCallBack = { handler, user }; + } +}; + +// ------------------------------------------------------------------------------------------------ +UTILS_NOINLINE +static std::string sprintfToString(const char* format, va_list args) noexcept { + std::string s; va_list tmp; va_copy(tmp, args); int n = vsnprintf(nullptr, 0, format, tmp); @@ -35,94 +86,105 @@ static std::string formatString(const char* format, va_list args) noexcept { if (n >= 0) { ++n; // for the nul-terminating char - char* buf = new char[n]; - vsnprintf(buf, size_t(n), format, args); - reason.assign(buf); - delete [] buf; + char* const buf = new(std::nothrow) char[n]; + if (buf) { + vsnprintf(buf, size_t(n), format, args); + s.assign(buf); + delete [] buf; + } } - return reason; + return s; } -static std::string formatString(const char* format, ...) noexcept { +static inline std::string sprintfToString(const char* format, ...) noexcept { va_list args; va_start(args, format); - std::string s(formatString(format, args)); + std::string const s{ sprintfToString(format, args) }; va_end(args); return s; } -static std::string panicString( - const std::string& msg, const char* function, int line, +static std::string buildPanicString( + std::string_view const& msg, const char* function, int line, const char* file, const char* reason) { #ifndef NDEBUG - return formatString("%s\nin %s:%d\nin file %s\nreason: %s", - msg.c_str(), function, line, file, reason); + return sprintfToString("%.*s\nin %s:%d\nin file %s\nreason: %s", + msg.size(), msg.data(), function, line, file, reason); #else - return formatString("%s\nin %s:%d\nreason: %s", - msg.c_str(), function, line, reason); + return sprintfToString("%.*s\nin %s:%d\nreason: %s", + msg.size(), msg.data(), function, line, reason); #endif } +// ------------------------------------------------------------------------------------------------ + Panic::~Panic() noexcept = default; +void Panic::setPanicHandler(PanicHandlerCallback handler, void* user) noexcept { + UserPanicHandler::get().set(handler, user); +} + +// ------------------------------------------------------------------------------------------------ + template -TPanic::TPanic(std::string reason) : - m_reason(std::move(reason)) { - m_callstack.update(1); - buildMessage(); +TPanic::TPanic(const char* function, const char* file, int line, char const* literal, + std::string reason) + : mFile(file), + mFunction(function), + mLine(line), + mLiteral(literal), + mReason(std::move(reason)) { + mCallstack.update(1); + mWhat = buildPanicString(T::type, mFunction, mLine, mFile, mReason.c_str()); } template -TPanic::TPanic(const char* function, const char* file, int line, std::string reason) - : m_reason(std::move(reason)), m_function(function), m_file(file), m_line(line) { - m_callstack.update(1); - buildMessage(); +TPanic::~TPanic() = default; + +template +const char* TPanic::what() const noexcept { + return mWhat.c_str(); } template -TPanic::~TPanic() { +const char* TPanic::getType() const noexcept { + return T::type; } template -const char* TPanic::what() const noexcept { - return m_msg.c_str(); +const char* TPanic::getReason() const noexcept { + return mReason.c_str(); +} + +template +const char* TPanic::getReasonLiteral() const noexcept { + return mLiteral.c_str(); } template const char* TPanic::getFunction() const noexcept { - return m_function; + return mFunction; } template const char* TPanic::getFile() const noexcept { - return m_file; + return mFile; } template int TPanic::getLine() const noexcept { - return m_line; + return mLine; } template const CallStack& TPanic::getCallStack() const noexcept { - return m_callstack; + return mCallstack; } template void TPanic::log() const noexcept { slog.e << what() << io::endl; - slog.e << m_callstack << io::endl; -} - -template -void TPanic::buildMessage() { - std::string type; -#if UTILS_HAS_RTTI - type = CallStack::demangleTypeName(typeid(T).name()).c_str(); -#else - type = "Panic"; -#endif - m_msg = panicString(type, m_function, m_line, m_file, m_reason.c_str()); + slog.e << mCallstack << io::endl; } UTILS_ALWAYS_INLINE @@ -132,16 +194,38 @@ inline static const char* formatFile(char const* file) noexcept { } template -void TPanic::panic(char const* function, char const* file, int line, const char* format, ...) { +void TPanic::panic(char const* function, char const* file, int line, char const* literal, + const char* format, ...) { va_list args; va_start(args, format); - std::string reason(formatString(format, args)); + std::string reason{ sprintfToString(format, args) }; va_end(args); - T e(function, formatFile(file), line, reason); + + panic(function, file, line, literal, std::move(reason)); +} + +template +void TPanic::panic(char const* function, char const* file, int line, char const* literal, + std::string reason) { + + if (reason.empty()) { + reason = literal; + } + + T e(function, formatFile(file), line, literal, std::move(reason)); + + // always log the Panic at the point it is detected e.log(); + + // Call the user provided handler + UserPanicHandler::get().call(e); + + // if exceptions are enabled, throw now. #ifdef __EXCEPTIONS - throw e; + throw e; #endif + + // and finally abort if we somehow get here std::abort(); } @@ -152,16 +236,121 @@ namespace details { void panicLog(char const* function, char const* file, int line, const char* format, ...) noexcept { va_list args; va_start(args, format); - std::string reason(formatString(format, args)); + std::string const reason{ sprintfToString(format, args) }; va_end(args); - const std::string msg = panicString("" /* no extra message */, + std::string const msg = buildPanicString("PanicLog", function, line, file, reason.c_str()); slog.e << msg << io::endl; slog.e << CallStack::unwind(1) << io::endl; } +PanicStream::PanicStream( + char const* function, + char const* file, + int line, + char const* condition) noexcept + : mFunction(function), mFile(file), mLine(line), mLiteral(condition) { +} + +PanicStream::~PanicStream() = default; + +PanicStream& PanicStream::operator<<(short value) noexcept { + mStream << value; + return *this; +} + +PanicStream& PanicStream::operator<<(unsigned short value) noexcept { + mStream << value; + return *this; +} + +PanicStream& PanicStream::operator<<(char value) noexcept { + mStream << value; + return *this; +} + +PanicStream& PanicStream::operator<<(unsigned char value) noexcept { + mStream << value; + return *this; +} + +PanicStream& PanicStream::operator<<(int value) noexcept { + mStream << value; + return *this; +} + +PanicStream& PanicStream::operator<<(unsigned int value) noexcept { + mStream << value; + return *this; +} + +PanicStream& PanicStream::operator<<(long value) noexcept { + mStream << value; + return *this; +} + +PanicStream& PanicStream::operator<<(unsigned long value) noexcept { + mStream << value; + return *this; +} + +PanicStream& PanicStream::operator<<(long long int value) noexcept { + mStream << value; + return *this; +} + +PanicStream& PanicStream::operator<<(unsigned long long int value) noexcept { + mStream << value; + return *this; +} + +PanicStream& PanicStream::operator<<(float value) noexcept { + mStream << value; + return *this; +} + +PanicStream& PanicStream::operator<<(double value) noexcept { + mStream << value; + return *this; +} + +PanicStream& PanicStream::operator<<(long double value) noexcept { + mStream << value; + return *this; +} + +PanicStream& PanicStream::operator<<(bool value) noexcept { + mStream << value; + return *this; +} + +PanicStream& PanicStream::operator<<(void const* value) noexcept { + mStream << value; + return *this; +} + +PanicStream& PanicStream::operator<<(char const* value) noexcept { + mStream << value; + return *this; +} + +PanicStream& PanicStream::operator<<(unsigned char const* value) noexcept { + mStream << value; + return *this; +} + +PanicStream& PanicStream::operator<<(std::string const& value) noexcept { + mStream << value; + return *this; +} + +PanicStream& PanicStream::operator<<(std::string_view const& value) noexcept { + mStream << value; + return *this; +} + } // namespace details // ----------------------------------------------------------------------------------------------- diff --git a/libs/utils/src/Path.cpp b/libs/utils/src/Path.cpp index ae94641e1b0..be70140fad5 100644 --- a/libs/utils/src/Path.cpp +++ b/libs/utils/src/Path.cpp @@ -50,8 +50,13 @@ Path::Path(const std::string& path) } bool Path::exists() const { +#if defined(_WIN64) || defined(_M_X64) + struct _stat64 file; + return _stat64(c_str(), &file) == 0; +#else struct stat file; return stat(c_str(), &file) == 0; +#endif } bool Path::isFile() const { diff --git a/libs/utils/src/Profiler.cpp b/libs/utils/src/Profiler.cpp index 75caf877862..f509d72248e 100644 --- a/libs/utils/src/Profiler.cpp +++ b/libs/utils/src/Profiler.cpp @@ -27,6 +27,7 @@ #endif #include +#include #include #if defined(__linux__) @@ -58,7 +59,7 @@ Profiler::Profiler() noexcept { } Profiler::Profiler(uint32_t eventMask) noexcept : Profiler() { - Profiler::resetEvents(eventMask); + resetEvents(eventMask); } Profiler::~Profiler() noexcept { diff --git a/libs/utils/src/Systrace.cpp b/libs/utils/src/Systrace.cpp deleted file mode 100644 index 6b2512a24ea..00000000000 --- a/libs/utils/src/Systrace.cpp +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include - -#if defined(__ANDROID__) - -#include - -#include - -#include -#include -#include -#include - -namespace utils { -namespace details { - -static pthread_once_t atrace_once_control = PTHREAD_ONCE_INIT; - -template -static void loadSymbol(T*& pfn, const char *symbol) noexcept { - pfn = (T*)dlsym(RTLD_DEFAULT, symbol); -} - -Systrace::GlobalState Systrace::sGlobalState = {}; - -void Systrace::init_once() noexcept { - GlobalState& s = sGlobalState; - - s.markerFd = -1; - - // API 23 - loadSymbol(s.ATrace_isEnabled, "ATrace_isEnabled"); - loadSymbol(s.ATrace_beginSection, "ATrace_beginSection"); - loadSymbol(s.ATrace_endSection, "ATrace_endSection"); - // API 29 - loadSymbol(s.ATrace_beginAsyncSection, "ATrace_beginAsyncSection"); - loadSymbol(s.ATrace_endAsyncSection, "ATrace_endAsyncSection"); - loadSymbol(s.ATrace_setCounter, "ATrace_setCounter"); - - - const bool hasBasicAtrace = s.ATrace_isEnabled && - s.ATrace_beginSection && - s.ATrace_endSection; - - const bool hasFullATrace = hasBasicAtrace && - s.ATrace_beginAsyncSection && - s.ATrace_endAsyncSection && - s.ATrace_setCounter; - - if (!hasFullATrace) { - s.markerFd = open("/sys/kernel/debug/tracing/trace_marker", O_WRONLY | O_CLOEXEC); - } - - if (hasBasicAtrace && !hasFullATrace) { - // no-op if we don't have all these - s.ATrace_beginAsyncSection = [](const char* sectionName, int32_t cookie){}; - s.ATrace_endAsyncSection = [](const char* sectionName, int32_t cookie){}; - s.ATrace_setCounter = [](const char* sectionName, int64_t counterValue){}; - } - - const bool hasLegacySystrace = s.markerFd != -1; - - if (hasLegacySystrace && !hasFullATrace) { - // use legacy - s.beginSection = [](Systrace* that, const char* name) { - begin_body(that->mMarkerFd, that->mPid, name); - }; - s.endSection = [](Systrace* that) { - end_body(that->mMarkerFd, that->mPid); - }; - s.beginAsyncSection = [](Systrace* that, const char* name, int32_t cookie) { - async_begin_body(that->mMarkerFd, that->mPid, name, cookie); - }; - s.endAsyncSection = [](Systrace* that, const char* name, int32_t cookie) { - async_end_body(that->mMarkerFd, that->mPid, name, cookie); - }; - s.setCounter = [](Systrace* that, const char* name, int64_t value) { - int64_body(that->mMarkerFd, that->mPid, name, value); - }; - } else if (hasBasicAtrace) { - // we have at least basic ATrace - s.beginSection = [](Systrace* that, const char* name) { - that->ATrace_beginSection(name); - }; - s.endSection = [](Systrace* that) { - that->ATrace_endSection(); - }; - s.beginAsyncSection = [](Systrace* that, const char* name, int32_t cookie) { - that->ATrace_beginAsyncSection(name, cookie); - }; - s.endAsyncSection = [](Systrace* that, const char* name, int32_t cookie) { - that->ATrace_endAsyncSection(name, cookie); - }; - s.setCounter = [](Systrace* that, const char* name, int64_t value) { - that->ATrace_setCounter(name, value); - }; - } - - s.isTracingAvailable = hasLegacySystrace || hasFullATrace || hasBasicAtrace; -} - -void Systrace::setup() noexcept { - pthread_once(&atrace_once_control, init_once); -} - -void Systrace::enable(uint32_t tags) noexcept { - setup(); - if (UTILS_LIKELY(sGlobalState.isTracingAvailable)) { - sGlobalState.isTracingEnabled.fetch_or(tags, std::memory_order_relaxed); - } -} - -void Systrace::disable(uint32_t tags) noexcept { - sGlobalState.isTracingEnabled.fetch_and(~tags, std::memory_order_relaxed); -} - -// unfortunately, this generates quite a bit of code because reading a global is not -// trivial. For this reason, we do not inline this method. -bool Systrace::isTracingEnabled(uint32_t tag) noexcept { - if (tag) { - setup(); - return bool((sGlobalState.isTracingEnabled.load(std::memory_order_relaxed) | SYSTRACE_TAG_ALWAYS) & tag); - } - return false; -} - -// ------------------------------------------------------------------------------------------------ - -void Systrace::init(uint32_t tag) noexcept { - // must be called first - mIsTracingEnabled = isTracingEnabled(tag); - - // cache static variables for better efficiency - GlobalState& s = sGlobalState; - ATrace_isEnabled = s.ATrace_isEnabled; - ATrace_beginSection = s.ATrace_beginSection; - ATrace_endSection = s.ATrace_endSection; - ATrace_beginAsyncSection = s.ATrace_beginAsyncSection; - ATrace_endAsyncSection = s.ATrace_endAsyncSection; - ATrace_setCounter = s.ATrace_setCounter; - - beginSection = s.beginSection; - endSection = s.endSection; - beginAsyncSection = s.beginAsyncSection; - endAsyncSection = s.endAsyncSection; - setCounter = s.setCounter; - - mMarkerFd = s.markerFd; - - mPid = getpid(); -} - -// ------------------------------------------------------------------------------------------------ - -/** - * Maximum size of a message that can be logged to the trace buffer. - * Note this message includes a tag, the pid, and the string given as the name. - * Names should be kept short to get the most use of the trace buffer. - */ -#define ATRACE_MESSAGE_LENGTH 512 - -#define WRITE_MSG(format_begin, format_end, pid, name, value) { \ - char buf[ATRACE_MESSAGE_LENGTH]; \ - int len = snprintf(buf, sizeof(buf), format_begin "%s" format_end, pid, \ - name, value); \ - if (len >= (int) sizeof(buf)) { \ - /* Given the sizeof(buf), and all of the current format buffers, \ - * it is impossible for name_len to be < 0 if len >= sizeof(buf). */ \ - int name_len = strlen(name) - (len - sizeof(buf)) - 1; \ - /* Truncate the name to make the message fit. */ \ - len = snprintf(buf, sizeof(buf), format_begin "%.*s" format_end, pid, \ - name_len, name, value); \ - } \ - write(fd, buf, len); \ -} - -void Systrace::begin_body(int fd, int pid, const char* name) noexcept { - char buf[ATRACE_MESSAGE_LENGTH]; - ssize_t len = snprintf(buf, sizeof(buf), "B|%d|%s", pid, name); - if (len >= sizeof(buf)) { - len = sizeof(buf) - 1; - } - write(fd, buf, size_t(len)); -} - -void Systrace::end_body(int fd, int pid) noexcept { - const char END_TAG = 'E'; - write(fd, &END_TAG, 1); -} - -void Systrace::async_begin_body(int fd, int pid, const char* name, int32_t cookie) noexcept { - WRITE_MSG("S|%d|", "|%" PRId32, pid, name, cookie); -} - -void Systrace::async_end_body(int fd, int pid, const char* name, int32_t cookie) noexcept { - WRITE_MSG("F|%d|", "|%" PRId32, pid, name, cookie); -} - -void Systrace::int64_body(int fd, int pid, const char* name, int64_t value) noexcept { - WRITE_MSG("C|%d|", "|%" PRId64, pid, name, value); -} - -} // namespace details -} // namespace utils - -#endif // ANDROID diff --git a/libs/utils/src/android/PerformanceHintManager.cpp b/libs/utils/src/android/PerformanceHintManager.cpp new file mode 100644 index 00000000000..4b8dd08d83e --- /dev/null +++ b/libs/utils/src/android/PerformanceHintManager.cpp @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include +#include + +#include +#include + +#define UTILS_PRIVATE_IMPLEMENTATION_NON_COPYABLE +#include + +namespace utils { + +namespace details { +struct PerformanceHintManager { + APerformanceHintManager* mManager = nullptr; +}; +} // namespace details + + +struct PerformanceHintManager::SessionDetails { + APerformanceHintSession* mSession = nullptr; +}; + +PerformanceHintManager::PerformanceHintManager() noexcept { + if (__builtin_available(android __ANDROID_API_T__, *)) { + mImpl->mManager = APerformanceHint_getManager(); + } +} + +PerformanceHintManager::~PerformanceHintManager() noexcept = default; + +bool PerformanceHintManager::isSupported() noexcept { + if (__builtin_available(android __ANDROID_API_T__, *)) { + return true; + } + return false; +} + +bool PerformanceHintManager::isValid() const { + return mImpl->mManager != nullptr; +} + +int64_t PerformanceHintManager::getPreferredUpdateRateNanos() const noexcept { + if (__builtin_available(android __ANDROID_API_T__, *)) { + if (UTILS_LIKELY(mImpl->mManager)) { + return APerformanceHint_getPreferredUpdateRateNanos(mImpl->mManager); + } + } + return -1; +} + +// ------------------------------------------------------------------------------------------------ + +PerformanceHintManager::Session::Session() noexcept = default; + +PerformanceHintManager::Session::Session(PerformanceHintManager& manager, int32_t const* threadIds, + size_t size, int64_t initialTargetWorkDurationNanos) noexcept { + if (__builtin_available(android __ANDROID_API_T__, *)) { + if (UTILS_LIKELY(manager.isValid())) { + mImpl->mSession = APerformanceHint_createSession( + manager->mManager, threadIds, size, initialTargetWorkDurationNanos); + } + } +} + +PerformanceHintManager::Session::Session(Session&& rhs) noexcept = default; + +PerformanceHintManager::Session& PerformanceHintManager::Session::operator=(Session&& rhs) noexcept = default; + +PerformanceHintManager::Session::~Session() noexcept { + if (__builtin_available(android __ANDROID_API_T__, *)) { + if (UTILS_LIKELY(mImpl->mSession)) { + APerformanceHint_closeSession(mImpl->mSession); + } + } +} + +bool PerformanceHintManager::Session::isValid() const { + return mImpl->mSession != nullptr; +} + +int PerformanceHintManager::Session::updateTargetWorkDuration( + int64_t targetDurationNanos) noexcept { + if (__builtin_available(android __ANDROID_API_T__, *)) { + if (UTILS_LIKELY(mImpl->mSession)) { + return APerformanceHint_updateTargetWorkDuration(mImpl->mSession, targetDurationNanos); + } + } + return -1; +} + +int PerformanceHintManager::Session::reportActualWorkDuration( + int64_t actualDurationNanos) noexcept { + if (__builtin_available(android __ANDROID_API_T__, *)) { + if (UTILS_LIKELY(mImpl->mSession)) { + return APerformanceHint_updateTargetWorkDuration(mImpl->mSession, actualDurationNanos); + } + } + return -1; +} + +} // namespace utils + diff --git a/libs/utils/src/android/Systrace.cpp b/libs/utils/src/android/Systrace.cpp new file mode 100644 index 00000000000..0b03d4951da --- /dev/null +++ b/libs/utils/src/android/Systrace.cpp @@ -0,0 +1,219 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include + +#include + +#include +#include +#include +#include + +namespace utils { +namespace details { + +static pthread_once_t atrace_once_control = PTHREAD_ONCE_INIT; + +template +static void loadSymbol(T*& pfn, const char *symbol) noexcept { + pfn = (T*)dlsym(RTLD_DEFAULT, symbol); +} + +Systrace::GlobalState Systrace::sGlobalState = {}; + +void Systrace::init_once() noexcept { + GlobalState& s = sGlobalState; + + s.markerFd = -1; + + // API 23 + loadSymbol(s.ATrace_isEnabled, "ATrace_isEnabled"); + loadSymbol(s.ATrace_beginSection, "ATrace_beginSection"); + loadSymbol(s.ATrace_endSection, "ATrace_endSection"); + // API 29 + loadSymbol(s.ATrace_beginAsyncSection, "ATrace_beginAsyncSection"); + loadSymbol(s.ATrace_endAsyncSection, "ATrace_endAsyncSection"); + loadSymbol(s.ATrace_setCounter, "ATrace_setCounter"); + + + const bool hasBasicAtrace = s.ATrace_isEnabled && + s.ATrace_beginSection && + s.ATrace_endSection; + + const bool hasFullATrace = hasBasicAtrace && + s.ATrace_beginAsyncSection && + s.ATrace_endAsyncSection && + s.ATrace_setCounter; + + if (!hasFullATrace) { + s.markerFd = open("/sys/kernel/debug/tracing/trace_marker", O_WRONLY | O_CLOEXEC); + } + + if (hasBasicAtrace && !hasFullATrace) { + // no-op if we don't have all these + s.ATrace_beginAsyncSection = [](const char* sectionName, int32_t cookie){}; + s.ATrace_endAsyncSection = [](const char* sectionName, int32_t cookie){}; + s.ATrace_setCounter = [](const char* sectionName, int64_t counterValue){}; + } + + const bool hasLegacySystrace = s.markerFd != -1; + + if (hasLegacySystrace && !hasFullATrace) { + // use legacy + s.beginSection = [](Systrace* that, const char* name) { + begin_body(that->mMarkerFd, that->mPid, name); + }; + s.endSection = [](Systrace* that) { + end_body(that->mMarkerFd, that->mPid); + }; + s.beginAsyncSection = [](Systrace* that, const char* name, int32_t cookie) { + async_begin_body(that->mMarkerFd, that->mPid, name, cookie); + }; + s.endAsyncSection = [](Systrace* that, const char* name, int32_t cookie) { + async_end_body(that->mMarkerFd, that->mPid, name, cookie); + }; + s.setCounter = [](Systrace* that, const char* name, int64_t value) { + int64_body(that->mMarkerFd, that->mPid, name, value); + }; + } else if (hasBasicAtrace) { + // we have at least basic ATrace + s.beginSection = [](Systrace* that, const char* name) { + that->ATrace_beginSection(name); + }; + s.endSection = [](Systrace* that) { + that->ATrace_endSection(); + }; + s.beginAsyncSection = [](Systrace* that, const char* name, int32_t cookie) { + that->ATrace_beginAsyncSection(name, cookie); + }; + s.endAsyncSection = [](Systrace* that, const char* name, int32_t cookie) { + that->ATrace_endAsyncSection(name, cookie); + }; + s.setCounter = [](Systrace* that, const char* name, int64_t value) { + that->ATrace_setCounter(name, value); + }; + } + + s.isTracingAvailable = hasLegacySystrace || hasFullATrace || hasBasicAtrace; +} + +void Systrace::setup() noexcept { + pthread_once(&atrace_once_control, init_once); +} + +void Systrace::enable(uint32_t tags) noexcept { + setup(); + if (UTILS_LIKELY(sGlobalState.isTracingAvailable)) { + sGlobalState.isTracingEnabled.fetch_or(tags, std::memory_order_relaxed); + } +} + +void Systrace::disable(uint32_t tags) noexcept { + sGlobalState.isTracingEnabled.fetch_and(~tags, std::memory_order_relaxed); +} + +// unfortunately, this generates quite a bit of code because reading a global is not +// trivial. For this reason, we do not inline this method. +bool Systrace::isTracingEnabled(uint32_t tag) noexcept { + if (tag) { + setup(); + return bool((sGlobalState.isTracingEnabled.load(std::memory_order_relaxed) | SYSTRACE_TAG_ALWAYS) & tag); + } + return false; +} + +// ------------------------------------------------------------------------------------------------ + +void Systrace::init(uint32_t tag) noexcept { + // must be called first + mIsTracingEnabled = isTracingEnabled(tag); + + // cache static variables for better efficiency + GlobalState& s = sGlobalState; + ATrace_isEnabled = s.ATrace_isEnabled; + ATrace_beginSection = s.ATrace_beginSection; + ATrace_endSection = s.ATrace_endSection; + ATrace_beginAsyncSection = s.ATrace_beginAsyncSection; + ATrace_endAsyncSection = s.ATrace_endAsyncSection; + ATrace_setCounter = s.ATrace_setCounter; + + beginSection = s.beginSection; + endSection = s.endSection; + beginAsyncSection = s.beginAsyncSection; + endAsyncSection = s.endAsyncSection; + setCounter = s.setCounter; + + mMarkerFd = s.markerFd; + + mPid = getpid(); +} + +// ------------------------------------------------------------------------------------------------ + +/** + * Maximum size of a message that can be logged to the trace buffer. + * Note this message includes a tag, the pid, and the string given as the name. + * Names should be kept short to get the most use of the trace buffer. + */ +#define ATRACE_MESSAGE_LENGTH 512 + +#define WRITE_MSG(format_begin, format_end, pid, name, value) { \ + char buf[ATRACE_MESSAGE_LENGTH]; \ + int len = snprintf(buf, sizeof(buf), format_begin "%s" format_end, pid, \ + name, value); \ + if (len >= (int) sizeof(buf)) { \ + /* Given the sizeof(buf), and all of the current format buffers, \ + * it is impossible for name_len to be < 0 if len >= sizeof(buf). */ \ + int name_len = strlen(name) - (len - sizeof(buf)) - 1; \ + /* Truncate the name to make the message fit. */ \ + len = snprintf(buf, sizeof(buf), format_begin "%.*s" format_end, pid, \ + name_len, name, value); \ + } \ + write(fd, buf, len); \ +} + +void Systrace::begin_body(int fd, int pid, const char* name) noexcept { + char buf[ATRACE_MESSAGE_LENGTH]; + ssize_t len = snprintf(buf, sizeof(buf), "B|%d|%s", pid, name); + if (len >= sizeof(buf)) { + len = sizeof(buf) - 1; + } + write(fd, buf, size_t(len)); +} + +void Systrace::end_body(int fd, int pid) noexcept { + const char END_TAG = 'E'; + write(fd, &END_TAG, 1); +} + +void Systrace::async_begin_body(int fd, int pid, const char* name, int32_t cookie) noexcept { + WRITE_MSG("S|%d|", "|%" PRId32, pid, name, cookie); +} + +void Systrace::async_end_body(int fd, int pid, const char* name, int32_t cookie) noexcept { + WRITE_MSG("F|%d|", "|%" PRId32, pid, name, cookie); +} + +void Systrace::int64_body(int fd, int pid, const char* name, int64_t value) noexcept { + WRITE_MSG("C|%d|", "|%" PRId64, pid, name, value); +} + +} // namespace details +} // namespace utils diff --git a/libs/utils/src/android/ThermalManager.cpp b/libs/utils/src/android/ThermalManager.cpp index 20c27b9e9b4..5ef088aa8d1 100644 --- a/libs/utils/src/android/ThermalManager.cpp +++ b/libs/utils/src/android/ThermalManager.cpp @@ -46,7 +46,7 @@ ThermalManager& ThermalManager::operator=(ThermalManager&& rhs) noexcept { ThermalManager::ThermalStatus ThermalManager::getCurrentThermalStatus() const noexcept { if (__builtin_available(android 30, *)) { - return (ThermalManager::ThermalStatus)AThermal_getCurrentThermalStatus(mThermalManager); + return (ThermalStatus)AThermal_getCurrentThermalStatus(mThermalManager); } else { return ThermalStatus::NONE; } diff --git a/libs/utils/src/architecture.cpp b/libs/utils/src/architecture.cpp new file mode 100644 index 00000000000..bdcc9d5d7be --- /dev/null +++ b/libs/utils/src/architecture.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) +# include +#elif defined(WIN32) +# include +#endif + +namespace utils::arch { + +size_t getPageSize() noexcept { +#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) + return size_t(sysconf(_SC_PAGESIZE)); +#elif defined(WIN32) + SYSTEM_INFO sysInfo; + GetSystemInfo(&sysInfo); + return size_t(sysInfo.dwPageSize); +#else + return 4096u; +#endif +} + +} // namespace utils::arch diff --git a/libs/utils/src/darwin/Path.mm b/libs/utils/src/darwin/Path.mm index 1e88c763528..ccd458d0bfd 100644 --- a/libs/utils/src/darwin/Path.mm +++ b/libs/utils/src/darwin/Path.mm @@ -19,6 +19,8 @@ #include #include +#include +#include #include #include @@ -49,6 +51,17 @@ return Path([tempDir cStringUsingEncoding:NSUTF8StringEncoding]); } +Path Path::getUserSettingsDirectory() { + const char* home = getenv("HOME"); + if (!home) { + struct passwd* pwd = getpwuid(getuid()); + if (pwd) { + home = pwd->pw_dir; + } + } + return Path(home); +} + std::vector Path::listContents() const { // Return an empty vector if the path doesn't exist or is not a directory if (!isDirectory() || !exists()) { diff --git a/libs/utils/src/darwin/Systrace.cpp b/libs/utils/src/darwin/Systrace.cpp new file mode 100644 index 00000000000..523b7ebd02d --- /dev/null +++ b/libs/utils/src/darwin/Systrace.cpp @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#if FILAMENT_APPLE_SYSTRACE + +#include + +static pthread_once_t atrace_once_control = PTHREAD_ONCE_INIT; + +thread_local std::stack ___tracerSections; + +namespace utils { +namespace details { + +Systrace::GlobalState Systrace::sGlobalState = {}; + +void Systrace::init_once() noexcept { + GlobalState& s = sGlobalState; + + s.systraceLog = os_log_create("com.google.filament", "systrace"); + s.frameIdLog = os_log_create("com.google.filament", "frameId"); +} + +void Systrace::setup() noexcept { + pthread_once(&atrace_once_control, init_once); +} + +void Systrace::enable(uint32_t tags) noexcept { + setup(); + sGlobalState.isTracingEnabled.fetch_or(tags, std::memory_order_relaxed); +} + +void Systrace::disable(uint32_t tags) noexcept { + sGlobalState.isTracingEnabled.fetch_and(~tags, std::memory_order_relaxed); +} + +// unfortunately, this generates quite a bit of code because reading a global is not +// trivial. For this reason, we do not inline this method. +bool Systrace::isTracingEnabled(uint32_t tag) noexcept { + if (tag) { + setup(); + return bool((sGlobalState.isTracingEnabled.load(std::memory_order_relaxed) | SYSTRACE_TAG_ALWAYS) & tag); + } + return false; +} + +// ------------------------------------------------------------------------------------------------ + +void Systrace::init(uint32_t tag) noexcept { + // must be called first + mIsTracingEnabled = isTracingEnabled(tag); +} + +} // namespace details +} // namespace utils + +#endif // FILAMENT_APPLE_SYSTRACE diff --git a/libs/utils/src/debug.cpp b/libs/utils/src/debug.cpp index f033770a01f..2a494d71305 100644 --- a/libs/utils/src/debug.cpp +++ b/libs/utils/src/debug.cpp @@ -18,6 +18,8 @@ #include +#include + namespace utils { // we use a non-inlined, not marked as "no return" function for aborting so that we can set @@ -29,7 +31,7 @@ void abort() noexcept { } void panic(const char *func, const char * file, int line, const char *assertion) noexcept { - PANIC_LOG("%s:%d: failed assertion `%s'\n", file, line, assertion); + PANIC_LOG("%s:%d: failed assertion '%s'\n", file, line, assertion); abort(); // set a breakpoint here return; // this line is needed to be able to move the cursor here in the debugger } diff --git a/libs/utils/src/linux/Path.cpp b/libs/utils/src/linux/Path.cpp index 5bbc8e7ba07..ebc4502d1d1 100644 --- a/libs/utils/src/linux/Path.cpp +++ b/libs/utils/src/linux/Path.cpp @@ -17,9 +17,13 @@ #include #include +#include +#include #include #include +#include + namespace utils { bool Path::mkdir() const { @@ -45,6 +49,17 @@ Path Path::getTemporaryDirectory() { return Path("/tmp/"); } +Path Path::getUserSettingsDirectory() { + const char* home = getenv("HOME"); + if (!home) { + struct passwd* pwd = getpwuid(getuid()); + if (pwd) { + home = pwd->pw_dir; + } + } + return Path(home); +} + std::vector Path::listContents() const { // Return an empty vector if the path doesn't exist or is not a directory if (!isDirectory() || !exists()) { diff --git a/libs/utils/src/ostream.cpp b/libs/utils/src/ostream.cpp index 4f47671160b..ebc3a319d2f 100644 --- a/libs/utils/src/ostream.cpp +++ b/libs/utils/src/ostream.cpp @@ -24,10 +24,14 @@ #include #include +#include #include #include +#include +#include #include +#include template class utils::PrivateImplementation; @@ -35,6 +39,34 @@ namespace utils::io { ostream::~ostream() = default; +void ostream::setConsumer(ConsumerCallback consumer, void* user) noexcept { + auto* const pImpl = mImpl; + std::lock_guard const lock(pImpl->mLock); + pImpl->mConsumer = { consumer, user }; +} + +ostream& flush(ostream& s) noexcept { + auto* const pImpl = s.mImpl; + pImpl->mLock.lock(); + auto const callback = pImpl->mConsumer; + if (UTILS_UNLIKELY(callback.first)) { + auto& buf = s.getBuffer(); + char const* const data = buf.get(); + if (UTILS_LIKELY(data)) { + char* const str = strdup(data); + buf.reset(); + pImpl->mLock.unlock(); + // call ConsumerCallback without lock held + callback.first(callback.second, str); + ::free(str); + return s; + } + } + pImpl->mLock.unlock(); + + return s.flush(); +} + ostream::Buffer& ostream::getBuffer() noexcept { return mImpl->mData; } @@ -43,20 +75,21 @@ ostream::Buffer const& ostream::getBuffer() const noexcept { return mImpl->mData; } -const char* ostream::getFormat(ostream::type t) const noexcept { +const char* ostream::getFormat(type t) const noexcept { switch (t) { - case type::SHORT: return mImpl->mShowHex ? "0x%hx" : "%hd"; - case type::USHORT: return mImpl->mShowHex ? "0x%hx" : "%hu"; - case type::CHAR: return "%c"; - case type::UCHAR: return "%c"; - case type::INT: return mImpl->mShowHex ? "0x%x" : "%d"; - case type::UINT: return mImpl->mShowHex ? "0x%x" : "%u"; - case type::LONG: return mImpl->mShowHex ? "0x%lx" : "%ld"; - case type::ULONG: return mImpl->mShowHex ? "0x%lx" : "%lu"; - case type::LONG_LONG: return mImpl->mShowHex ? "0x%llx" : "%lld"; - case type::ULONG_LONG: return mImpl->mShowHex ? "0x%llx" : "%llu"; - case type::DOUBLE: return "%f"; - case type::LONG_DOUBLE: return "%Lf"; + case SHORT: return mImpl->mShowHex ? "0x%hx" : "%hd"; + case USHORT: return mImpl->mShowHex ? "0x%hx" : "%hu"; + case CHAR: return "%c"; + case UCHAR: return "%c"; + case INT: return mImpl->mShowHex ? "0x%x" : "%d"; + case UINT: return mImpl->mShowHex ? "0x%x" : "%u"; + case LONG: return mImpl->mShowHex ? "0x%lx" : "%ld"; + case ULONG: return mImpl->mShowHex ? "0x%lx" : "%lu"; + case LONG_LONG: return mImpl->mShowHex ? "0x%llx" : "%lld"; + case ULONG_LONG: return mImpl->mShowHex ? "0x%llx" : "%llu"; + case FLOAT: return "%.9g"; + case DOUBLE: return "%.17g"; + case LONG_DOUBLE: return "%Lf"; } } @@ -68,12 +101,12 @@ ostream& ostream::print(const char* format, ...) noexcept { // figure out how much size to we need va_start(args0, format); va_copy(args1, args0); - ssize_t s = vsnprintf(nullptr, 0, format, args0); + ssize_t const s = vsnprintf(nullptr, 0, format, args0); va_end(args0); { // scope for the lock - std::lock_guard lock(mImpl->mLock); + std::lock_guard const lock(mImpl->mLock); Buffer& buf = getBuffer(); @@ -93,66 +126,67 @@ ostream& ostream::print(const char* format, ...) noexcept { } ostream& ostream::operator<<(short value) noexcept { - const char* format = getFormat(type::SHORT); + const char* format = getFormat(SHORT); return print(format, value); } ostream& ostream::operator<<(unsigned short value) noexcept { - const char* format = getFormat(type::USHORT); + const char* format = getFormat(USHORT); return print(format, value); } ostream& ostream::operator<<(char value) noexcept { - const char* format = getFormat(type::CHAR); + const char* format = getFormat(CHAR); return print(format, value); } ostream& ostream::operator<<(unsigned char value) noexcept { - const char* format = getFormat(type::UCHAR); + const char* format = getFormat(UCHAR); return print(format, value); } ostream& ostream::operator<<(int value) noexcept { - const char* format = getFormat(type::INT); + const char* format = getFormat(INT); return print(format, value); } ostream& ostream::operator<<(unsigned int value) noexcept { - const char* format = getFormat(type::UINT); + const char* format = getFormat(UINT); return print(format, value); } ostream& ostream::operator<<(long value) noexcept { - const char* format = getFormat(type::LONG); + const char* format = getFormat(LONG); return print(format, value); } ostream& ostream::operator<<(unsigned long value) noexcept { - const char* format = getFormat(type::ULONG); + const char* format = getFormat(ULONG); return print(format, value); } ostream& ostream::operator<<(long long value) noexcept { - const char* format = getFormat(type::LONG_LONG); + const char* format = getFormat(LONG_LONG); return print(format, value); } ostream& ostream::operator<<(unsigned long long value) noexcept { - const char* format = getFormat(type::ULONG_LONG); + const char* format = getFormat(ULONG_LONG); return print(format, value); } ostream& ostream::operator<<(float value) noexcept { - return operator<<((double)value); + const char* format = getFormat(FLOAT); + return print(format, value); } ostream& ostream::operator<<(double value) noexcept { - const char* format = getFormat(type::DOUBLE); + const char* format = getFormat(DOUBLE); return print(format, value); } ostream& ostream::operator<<(long double value) noexcept { - const char* format = getFormat(type::LONG_DOUBLE); + const char* format = getFormat(LONG_DOUBLE); return print(format, value); } @@ -203,23 +237,23 @@ ostream::Buffer::~Buffer() noexcept { void ostream::Buffer::advance(ssize_t n) noexcept { if (n > 0) { - size_t written = n < size ? size_t(n) : size; + size_t const written = n < sizeRemaining ? size_t(n) : sizeRemaining; curr += written; - size -= written; + sizeRemaining -= written; } } -void ostream::Buffer::reserve(size_t newSize) noexcept { - size_t offset = curr - buffer; +void ostream::Buffer::reserve(size_t newCapacity) noexcept { + size_t const offset = curr - buffer; if (buffer == nullptr) { - buffer = (char*)malloc(newSize); + buffer = (char*)malloc(newCapacity); } else { - buffer = (char*)realloc(buffer, newSize); + buffer = (char*)realloc(buffer, newCapacity); } assert(buffer); - capacity = newSize; + capacity = newCapacity; curr = buffer + offset; - size = capacity - offset; + sizeRemaining = capacity - offset; } void ostream::Buffer::reset() noexcept { @@ -230,17 +264,22 @@ void ostream::Buffer::reset() noexcept { capacity = 1024; } curr = buffer; - size = capacity; + sizeRemaining = capacity; +} + +size_t ostream::Buffer::length() const noexcept { + return curr - buffer; } std::pair ostream::Buffer::grow(size_t s) noexcept { - if (UTILS_UNLIKELY(size < s)) { - size_t used = curr - buffer; - size_t newCapacity = std::max(size_t(32), used + (s * 3 + 1) / 2); // 32 bytes minimum + if (UTILS_UNLIKELY(sizeRemaining < s)) { + size_t const usedSize = curr - buffer; + size_t const neededCapacity = usedSize + s; + size_t const newCapacity = std::max(size_t(32), (neededCapacity * 3 + 1) / 2); // 32 bytes minimum reserve(newCapacity); - assert(size >= s); + assert(sizeRemaining >= s); } - return { curr, size }; + return { curr, sizeRemaining }; } } // namespace utils::io diff --git a/libs/utils/src/ostream_.h b/libs/utils/src/ostream_.h index a417cde70bb..19f29572878 100644 --- a/libs/utils/src/ostream_.h +++ b/libs/utils/src/ostream_.h @@ -25,6 +25,7 @@ namespace utils::io { struct ostream_ { std::mutex mLock; ostream::Buffer mData; + std::pair mConsumer{}; bool mShowHex = false; }; diff --git a/libs/utils/src/sstream.cpp b/libs/utils/src/sstream.cpp index 1c02fd862bb..c7bd0a5b5ed 100644 --- a/libs/utils/src/sstream.cpp +++ b/libs/utils/src/sstream.cpp @@ -15,10 +15,13 @@ */ #include +#include + +#include "ostream_.h" namespace utils::io { -utils::io::ostream& sstream::flush() noexcept { +ostream& sstream::flush() noexcept { // no-op. return *this; } @@ -28,4 +31,8 @@ const char* sstream::c_str() const noexcept { return buffer ? buffer : ""; } +size_t sstream::length() const noexcept { + return getBuffer().length(); +} + } // namespace utils::io diff --git a/libs/utils/src/web/Path.cpp b/libs/utils/src/web/Path.cpp new file mode 100644 index 00000000000..24b3220055d --- /dev/null +++ b/libs/utils/src/web/Path.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +namespace utils { + +bool Path::mkdir() const { + return true; +} + +Path Path::getCurrentExecutable() { + return Path("filament-wasm"); +} + +Path Path::getUserSettingsDirectory() { + return Path("."); +} + +} // namespace utils diff --git a/libs/utils/src/win32/Path.cpp b/libs/utils/src/win32/Path.cpp index 7541302ef84..f48edb4890c 100644 --- a/libs/utils/src/win32/Path.cpp +++ b/libs/utils/src/win32/Path.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -46,6 +47,12 @@ Path Path::getTemporaryDirectory() { return Path(lpTempPathBuffer); } +Path Path::getUserSettingsDirectory() { + TCHAR home[MAX_PATH]; + SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, home); + return Path(home); +} + std::vector Path::listContents() const { // Return an empty vector if the path doesn't exist or is not a directory if (!isDirectory() || !exists()) { diff --git a/libs/utils/test/test_CString.cpp b/libs/utils/test/test_CString.cpp index 759f30a4527..a19de9b7a45 100644 --- a/libs/utils/test/test_CString.cpp +++ b/libs/utils/test/test_CString.cpp @@ -93,3 +93,25 @@ TEST(CString, ReplacePastEndOfString) { EXPECT_STREQ("foo bar bat", str.c_str()); } } + +TEST(FixedSizeString, EmptyString) { + { + FixedSizeString<32> str; + EXPECT_STREQ("", str.c_str()); + } + { + FixedSizeString<32> str(""); + EXPECT_STREQ("", str.c_str()); + } +} + +TEST(FixedSizeString, Constructors) { + { + FixedSizeString<32> str("short string"); + EXPECT_STREQ("short string", str.c_str()); + } + { + FixedSizeString<16> str("a long string abcdefghijklmnopqrst"); + EXPECT_STREQ("a long string a", str.c_str()); + } +} diff --git a/libs/utils/test/test_FixedCircularBuffer.cpp b/libs/utils/test/test_FixedCircularBuffer.cpp new file mode 100644 index 00000000000..8749dfb89a1 --- /dev/null +++ b/libs/utils/test/test_FixedCircularBuffer.cpp @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include + +using namespace utils; + +TEST(FixedCircularBufferTest, Simple) { + FixedCircularBuffer circularBuffer(4); + EXPECT_EQ(circularBuffer.size(), 0); + + EXPECT_FALSE(circularBuffer.push(1).has_value()); + EXPECT_FALSE(circularBuffer.push(2).has_value()); + EXPECT_FALSE(circularBuffer.push(3).has_value()); + EXPECT_EQ(circularBuffer.size(), 3); + EXPECT_EQ(circularBuffer.pop(), 1); + EXPECT_EQ(circularBuffer.pop(), 2); + EXPECT_EQ(circularBuffer.pop(), 3); + EXPECT_EQ(circularBuffer.size(), 0); + + EXPECT_FALSE(circularBuffer.push(4).has_value()); + EXPECT_FALSE(circularBuffer.push(5).has_value()); + EXPECT_FALSE(circularBuffer.push(6).has_value()); + EXPECT_FALSE(circularBuffer.push(7).has_value()); + EXPECT_EQ(circularBuffer.size(), 4); + EXPECT_TRUE(circularBuffer.full()); + EXPECT_EQ(circularBuffer.pop(), 4); + EXPECT_EQ(circularBuffer.pop(), 5); + EXPECT_EQ(circularBuffer.pop(), 6); + EXPECT_EQ(circularBuffer.pop(), 7); +} + +TEST(FixedCircularBufferTest, Displace) { + FixedCircularBuffer circularBuffer(4); + EXPECT_EQ(circularBuffer.size(), 0); + EXPECT_FALSE(circularBuffer.push(1).has_value()); + EXPECT_FALSE(circularBuffer.push(2).has_value()); + EXPECT_FALSE(circularBuffer.push(3).has_value()); + EXPECT_FALSE(circularBuffer.push(4).has_value()); + EXPECT_TRUE(circularBuffer.full()); + + { + auto v = circularBuffer.push(5); + EXPECT_EQ(v.value(), 1); + } + { + auto v = circularBuffer.push(6); + EXPECT_EQ(v.value(), 2); + } + EXPECT_TRUE(circularBuffer.full()); + + EXPECT_EQ(circularBuffer.pop(), 3); + EXPECT_EQ(circularBuffer.size(), 3); +} + +TEST(FixedCircularBufferTest, ZeroCapacity) { + FixedCircularBuffer circularBuffer(0); + EXPECT_EQ(circularBuffer.size(), 0); + EXPECT_EQ(circularBuffer.full(), false); + + auto v = circularBuffer.push(1); + EXPECT_EQ(v.value(), 1); + EXPECT_EQ(circularBuffer.size(), 0); + EXPECT_EQ(circularBuffer.full(), false); +} + +TEST(FixedCircularBufferTest, Exceptions) { +#if !defined(NDEBUG) && defined(GTEST_HAS_DEATH_TEST) + FixedCircularBuffer circularBuffer(4); + + EXPECT_DEATH({ + circularBuffer.pop(); // should assert + }, "failed assertion"); + + circularBuffer.push(1); + circularBuffer.push(2); + circularBuffer.push(3); + circularBuffer.push(4); + circularBuffer.push(5); // should not assert +#endif +} diff --git a/libs/utils/test/test_StructureOfArrays.cpp b/libs/utils/test/test_StructureOfArrays.cpp index 0b435e7656f..652d9d37fe1 100644 --- a/libs/utils/test/test_StructureOfArrays.cpp +++ b/libs/utils/test/test_StructureOfArrays.cpp @@ -173,3 +173,13 @@ TEST(StructureOfArraysTest, Simple) { soa.push_back(0.0f, 1.0, std::move(destroyedFloat4)); } +TEST(StructureOfArraysTest, MoveOnly) { + StructureOfArrays> soa; + soa.setCapacity(2); + soa.push_back(1.0f, std::make_unique(1)); + soa.push_back(2.0f, std::make_unique(2)); + EXPECT_EQ(soa.size(), 2); + EXPECT_EQ(*soa.elementAt<1>(0).get(), 1); + EXPECT_EQ(*soa.elementAt<1>(1).get(), 2); +} + diff --git a/libs/utils/test/test_algorithm.cpp b/libs/utils/test/test_algorithm.cpp index fa36aff0dce..83dcc7b65bc 100644 --- a/libs/utils/test/test_algorithm.cpp +++ b/libs/utils/test/test_algorithm.cpp @@ -20,6 +20,8 @@ #include +#include + using namespace utils; template @@ -58,6 +60,20 @@ TEST(AlgorithmTest, clz) { EXPECT_EQ(j, details::clz(i|1)); EXPECT_EQ(j, count_leading_zeros(i)); } + for (uint16_t i = 1, j = 15; j < 16; i *= 2, j--) { + EXPECT_EQ(j, clz(i)); + EXPECT_EQ(j, clz(uint16_t(i|1))); + EXPECT_EQ(j, details::clz(i)); + EXPECT_EQ(j, details::clz(uint16_t(i|1))); + EXPECT_EQ(j, count_leading_zeros(i)); + } + for (uint8_t i = 1, j = 7; j < 8; i *= 2, j--) { + EXPECT_EQ(j, clz(i)); + EXPECT_EQ(j, clz(uint8_t(i|1))); + EXPECT_EQ(j, details::clz(i)); + EXPECT_EQ(j, details::clz(uint8_t(i|1))); + EXPECT_EQ(j, count_leading_zeros(i)); + } } TEST(AlgorithmTest, details_ctz) { @@ -80,6 +96,16 @@ TEST(AlgorithmTest, ctz) { EXPECT_EQ(j, details::ctz(i)); EXPECT_EQ(j, count_trailing_zeros(i)); } + for (uint16_t i = 1, j = 0; j < 16; i *= 2, j++) { + EXPECT_EQ(j, ctz(i)); + EXPECT_EQ(j, details::ctz(i)); + EXPECT_EQ(j, count_trailing_zeros(i)); + } + for (uint8_t i = 1, j = 0; j < 8; i *= 2, j++) { + EXPECT_EQ(j, ctz(i)); + EXPECT_EQ(j, details::ctz(i)); + EXPECT_EQ(j, count_trailing_zeros(i)); + } } TEST(AlgorithmTest, details_popcount) { diff --git a/libs/utils/test/test_sstream.cpp b/libs/utils/test/test_sstream.cpp index 0c07a8d2d89..9a832faf2ed 100644 --- a/libs/utils/test/test_sstream.cpp +++ b/libs/utils/test/test_sstream.cpp @@ -18,8 +18,33 @@ #include +#include + +using namespace utils; using namespace utils::io; +TEST(ostream, setConsumer) { + slog.d.setConsumer(+[](void*, char const*) { + GTEST_FAIL(); + }, nullptr); + // we test that we don't crash if the log is empty and that we don't call the consumer. + flush(slog.d); + + slog.d.setConsumer(nullptr, nullptr); + slog.d << "hello world"; + // we test that after resetting the consumer, it's not called on flush. + flush(slog.d); + + const char* str = "hello world!"; + slog.d.setConsumer(+[](void* user, char const* str) { + ASSERT_STREQ(str, (const char*)user); + }, (void*)str); + slog.d << str; + // we test that the comsumer is called with the right string + flush(slog.d); + slog.d.setConsumer(nullptr, nullptr); +} + TEST(sstream, EmptyString) { sstream ss; EXPECT_STREQ("", ss.c_str()); @@ -78,13 +103,13 @@ TEST(sstream, Formatting) { } { sstream ss; - ss << (float) 3.14; - EXPECT_STREQ("3.140000", ss.c_str()); + ss << (float) 3.14; // 3.14 can't be represented exactly by a float + EXPECT_STREQ("3.1400001", ss.c_str()); } { sstream ss; ss << (double) -1; - EXPECT_STREQ("-1.000000", ss.c_str()); + EXPECT_STREQ("-1", ss.c_str()); } { sstream ss; @@ -119,6 +144,7 @@ TEST(sstream, LargeBuffer) { } EXPECT_EQ(1024 * 1024 * 16, strlen(ss.c_str())); + EXPECT_EQ(1024 * 1024 * 16, ss.length()); } TEST(sstream, LargeString) { @@ -133,6 +159,7 @@ TEST(sstream, LargeString) { ss << filler; EXPECT_EQ(size, strlen(ss.c_str())); + EXPECT_EQ(size, ss.length()); EXPECT_STREQ(filler, ss.c_str()); free(filler); @@ -157,7 +184,18 @@ TEST(sstream, SeveralStrings) { ss << fillerB; EXPECT_EQ(sizeA + sizeB, strlen(ss.c_str())); + EXPECT_EQ(sizeA + sizeB, ss.length()); free(fillerA); free(fillerB); } + +TEST(sstream, length) { + sstream ss; + + EXPECT_EQ(0, ss.length()); + ss << "Hello, world\n"; + EXPECT_EQ(13, ss.length()); + ss << "Foo bar\n"; + EXPECT_EQ(13 + 8, ss.length()); +} diff --git a/libs/viewer/CMakeLists.txt b/libs/viewer/CMakeLists.txt index 621bb24981d..58fe66c98fe 100644 --- a/libs/viewer/CMakeLists.txt +++ b/libs/viewer/CMakeLists.txt @@ -34,13 +34,17 @@ target_link_libraries(${TARGET} PUBLIC imgui filament gltfio_core filagui jsmn c target_include_directories(${TARGET} PUBLIC ${PUBLIC_HDR_DIR}) set_target_properties(${TARGET} PROPERTIES FOLDER Libs) +if (FILAMENT_SAMPLES_STEREO_TYPE STREQUAL "instanced") + add_definitions(-DFILAMENT_SAMPLES_STEREO_TYPE_INSTANCED) +elseif (FILAMENT_SAMPLES_STEREO_TYPE STREQUAL "multiview") + add_definitions(-DFILAMENT_SAMPLES_STEREO_TYPE_MULTIVIEW) +endif () + # ================================================================================================== # Compiler flags # ================================================================================================== if (MSVC) - target_compile_options(${TARGET} PRIVATE $<$:/fp:fast>) else() - target_compile_options(${TARGET} PRIVATE $<$:-ffast-math>) target_compile_options(${TARGET} PRIVATE -Wno-deprecated-register) endif() diff --git a/libs/viewer/include/viewer/AutomationEngine.h b/libs/viewer/include/viewer/AutomationEngine.h index 8747f59d8da..f0d907a0f7a 100644 --- a/libs/viewer/include/viewer/AutomationEngine.h +++ b/libs/viewer/include/viewer/AutomationEngine.h @@ -224,6 +224,9 @@ class UTILS_PUBLIC AutomationEngine { */ static void exportSettings(const Settings& settings, const char* filename); + static void exportScreenshot(View* view, Renderer* renderer, std::string filename, + bool autoclose, AutomationEngine* automationEngine); + Options getOptions() const { return mOptions; } bool isRunning() const { return mIsRunning; } size_t currentTest() const { return mCurrentTest; } diff --git a/libs/viewer/include/viewer/Settings.h b/libs/viewer/include/viewer/Settings.h index dc54c667fbc..2094296bd75 100644 --- a/libs/viewer/include/viewer/Settings.h +++ b/libs/viewer/include/viewer/Settings.h @@ -18,6 +18,7 @@ #define VIEWER_SETTINGS_H #include +#include #include #include #include @@ -36,6 +37,8 @@ namespace filament { +using namespace color; + class Skybox; class Renderer; @@ -54,8 +57,10 @@ enum class ToneMapping : uint8_t { ACES_LEGACY = 1, ACES = 2, FILMIC = 3, - GENERIC = 4, - DISPLAY_RANGE = 5, + AGX = 4, + GENERIC = 5, + PBR_NEUTRAL = 6, + DISPLAY_RANGE = 7, }; using AmbientOcclusionOptions = filament::View::AmbientOcclusionOptions; @@ -73,13 +78,14 @@ using TemporalAntiAliasingOptions = filament::View::TemporalAntiAliasingOptions; using VignetteOptions = filament::View::VignetteOptions; using VsmShadowOptions = filament::View::VsmShadowOptions; using GuardBandOptions = filament::View::GuardBandOptions; +using StereoscopicOptions = filament::View::StereoscopicOptions; using LightManager = filament::LightManager; // These functions push all editable property values to their respective Filament objects. void applySettings(Engine* engine, const ViewSettings& settings, View* dest); void applySettings(Engine* engine, const MaterialSettings& settings, MaterialInstance* dest); void applySettings(Engine* engine, const LightSettings& settings, IndirectLight* ibl, utils::Entity sunlight, - utils::Entity* sceneLights, size_t sceneLightCount, LightManager* lm, Scene* scene, View* view); + const utils::Entity* sceneLights, size_t sceneLightCount, LightManager* lm, Scene* scene, View* view); void applySettings(Engine* engine, const ViewerOptions& settings, Camera* camera, Skybox* skybox, Renderer* renderer); @@ -111,38 +117,49 @@ struct GenericToneMapperSettings { float midGrayIn = 0.18f; float midGrayOut = 0.215f; float hdrMax = 10.0f; - bool operator!=(const GenericToneMapperSettings &rhs) const { return !(rhs == *this); } - bool operator==(const GenericToneMapperSettings &rhs) const; + bool operator!=(const GenericToneMapperSettings& rhs) const { return !(rhs == *this); } + bool operator==(const GenericToneMapperSettings& rhs) const; +}; + +struct AgxToneMapperSettings { + AgxToneMapper::AgxLook look = AgxToneMapper::AgxLook::NONE; + bool operator!=(const AgxToneMapperSettings& rhs) const { return !(rhs == *this); } + bool operator==(const AgxToneMapperSettings& rhs) const; }; struct ColorGradingSettings { + // fields are ordered to avoid padding bool enabled = true; + bool linkedCurves = false; + bool luminanceScaling = false; + bool gamutMapping = false; filament::ColorGrading::QualityLevel quality = filament::ColorGrading::QualityLevel::MEDIUM; ToneMapping toneMapping = ToneMapping::ACES_LEGACY; + bool padding0{}; + AgxToneMapperSettings agxToneMapper; + color::ColorSpace colorspace = Rec709-sRGB-D65; GenericToneMapperSettings genericToneMapper; - bool luminanceScaling = false; - bool gamutMapping = false; - float exposure = 0.0f; - float nightAdaptation = 0.0f; - float temperature = 0.0f; - float tint = 0.0f; - math::float3 outRed{1.0f, 0.0f, 0.0f}; - math::float3 outGreen{0.0f, 1.0f, 0.0f}; - math::float3 outBlue{0.0f, 0.0f, 1.0f}; math::float4 shadows{1.0f, 1.0f, 1.0f, 0.0f}; math::float4 midtones{1.0f, 1.0f, 1.0f, 0.0f}; math::float4 highlights{1.0f, 1.0f, 1.0f, 0.0f}; math::float4 ranges{0.0f, 0.333f, 0.550f, 1.0f}; - float contrast = 1.0f; - float vibrance = 1.0f; - float saturation = 1.0f; + math::float3 outRed{1.0f, 0.0f, 0.0f}; + math::float3 outGreen{0.0f, 1.0f, 0.0f}; + math::float3 outBlue{0.0f, 0.0f, 1.0f}; math::float3 slope{1.0f}; math::float3 offset{0.0f}; math::float3 power{1.0f}; math::float3 gamma{1.0f}; math::float3 midPoint{1.0f}; math::float3 scale{1.0f}; - bool linkedCurves = false; + float exposure = 0.0f; + float nightAdaptation = 0.0f; + float temperature = 0.0f; + float tint = 0.0f; + float contrast = 1.0f; + float vibrance = 1.0f; + float saturation = 1.0f; + bool operator!=(const ColorGradingSettings &rhs) const { return !(rhs == *this); } bool operator==(const ColorGradingSettings &rhs) const; }; @@ -152,6 +169,10 @@ struct DynamicLightingSettings { float zLightFar = 100; }; +struct FogSettings { + Texture* fogColorTexture = nullptr; +}; + // This defines fields in the same order as the setter methods in filament::View. struct ViewSettings { // standalone View settings @@ -173,10 +194,12 @@ struct ViewSettings { VignetteOptions vignette; VsmShadowOptions vsmShadowOptions; GuardBandOptions guardBand; + StereoscopicOptions stereoscopicOptions; // Custom View Options ColorGradingSettings colorGrading; DynamicLightingSettings dynamicLighting; + FogSettings fogSettings; }; template @@ -196,6 +219,9 @@ struct LightSettings { LightManager::ShadowOptions shadowOptions; SoftShadowOptions softShadowOptions; float sunlightIntensity = 100000.0f; + float sunlightHaloSize = 10.0f; + float sunlightHaloFalloff = 80.0f; + float sunlightAngularRadius = 1.9f; math::float3 sunlightDirection = {0.6, -1.0, -0.8}; math::float3 sunlightColor = filament::Color::toLinear({ 0.98, 0.92, 0.89}); float iblIntensity = 30000.0f; @@ -206,6 +232,10 @@ struct ViewerOptions { float cameraAperture = 16.0f; float cameraSpeed = 125.0f; float cameraISO = 100.0f; + float cameraNear = 0.1f; + float cameraFar = 100.0f; + float cameraEyeOcularDistance = 0.0f; + float cameraEyeToeIn = 0.0f; float groundShadowStrength = 0.75f; bool groundPlaneEnabled = false; bool skyboxEnabled = true; diff --git a/libs/viewer/include/viewer/ViewerGui.h b/libs/viewer/include/viewer/ViewerGui.h index bb7c434815d..8f84335747c 100644 --- a/libs/viewer/include/viewer/ViewerGui.h +++ b/libs/viewer/include/viewer/ViewerGui.h @@ -227,15 +227,13 @@ class UTILS_PUBLIC ViewerGui { */ Settings& getSettings() { return mSettings; } - void stopAnimation() { mCurrentAnimation = 0; } + void stopAnimation() { mCurrentAnimation = -1; } int getCurrentCamera() const { return mCurrentCamera; } private: using SceneMask = gltfio::NodeManager::SceneMask; - void updateIndirectLight(); - bool isRemoteMode() const { return mAsset == nullptr; } void sceneSelectionUI(); @@ -256,7 +254,7 @@ class UTILS_PUBLIC ViewerGui { std::function mCustomUI; // Properties that can be changed from the UI. - int mCurrentAnimation = 1; // It is a 1-based index and 0 means not playing animation + int mCurrentAnimation = 0; // -1 means not playing animation and count means plays all of them (0-based index) int mCurrentVariant = 0; bool mEnableWireframe = false; int mVsmMsaaSamplesLog2 = 1; @@ -273,7 +271,7 @@ class UTILS_PUBLIC ViewerGui { // Cross fade animation parameters. float mCrossFadeDuration = 0.5f; // number of seconds to transition between animations - int mPreviousAnimation = 0; // one-based index of the previous animation + int mPreviousAnimation = -1; // zero-based index of the previous animation double mCurrentStartTime = 0.0f; // start time of most recent cross-fade (seconds) double mPreviousStartTime = 0.0f; // start time of previous cross-fade (seconds) bool mResetAnimation = true; // set when building ImGui widgets, honored in applyAnimation diff --git a/libs/viewer/src/AutomationEngine.cpp b/libs/viewer/src/AutomationEngine.cpp index 19d23ef1681..810df99dbb8 100644 --- a/libs/viewer/src/AutomationEngine.cpp +++ b/libs/viewer/src/AutomationEngine.cpp @@ -56,7 +56,7 @@ static void convertRGBAtoRGB(void* buffer, uint32_t width, uint32_t height) { } } -static void exportScreenshot(View* view, Renderer* renderer, std::string filename, +void AutomationEngine::exportScreenshot(View* view, Renderer* renderer, std::string filename, bool autoclose, AutomationEngine* automationEngine) { const Viewport& vp = view->getViewport(); const size_t byteCount = vp.width * vp.height * 4; @@ -244,7 +244,8 @@ void AutomationEngine::tick(Engine* engine, const ViewerContent& content, float } if (mOptions.exportScreenshots) { - exportScreenshot(content.view, content.renderer, prefix + ".ppm", isLastTest, this); + AutomationEngine::exportScreenshot( + content.view, content.renderer, prefix + ".ppm", isLastTest, this); } if (isLastTest) { diff --git a/libs/viewer/src/Settings.cpp b/libs/viewer/src/Settings.cpp index c75e2f468a4..639d07a2c93 100644 --- a/libs/viewer/src/Settings.cpp +++ b/libs/viewer/src/Settings.cpp @@ -38,6 +38,17 @@ using namespace utils; namespace filament::viewer { +std::string_view to_string(color::ColorSpace const& colorspace) noexcept { + using namespace color; + if (colorspace == Rec709-Linear-D65) { + return "Rec709-Linear-D65"; + } + if (colorspace == Rec709-sRGB-D65) { + return "Rec709-sRGB-D65"; + } + return "unknown"; +} + // Skips over an unused token. int parse(jsmntok_t const* tokens, int i) { int end = i + 1; @@ -75,7 +86,9 @@ static int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, ToneMapp else if (0 == compare(tokens[i], jsonChunk, "ACES_LEGACY")) { *out = ToneMapping::ACES_LEGACY; } else if (0 == compare(tokens[i], jsonChunk, "ACES")) { *out = ToneMapping::ACES; } else if (0 == compare(tokens[i], jsonChunk, "FILMIC")) { *out = ToneMapping::FILMIC; } + else if (0 == compare(tokens[i], jsonChunk, "AGX")) { *out = ToneMapping::AGX; } else if (0 == compare(tokens[i], jsonChunk, "GENERIC")) { *out = ToneMapping::GENERIC; } + else if (0 == compare(tokens[i], jsonChunk, "PBR_NEUTRAL")) { *out = ToneMapping::PBR_NEUTRAL; } else if (0 == compare(tokens[i], jsonChunk, "DISPLAY_RANGE")) { *out = ToneMapping::DISPLAY_RANGE; } else { slog.w << "Invalid ToneMapping: '" << STR(tokens[i], jsonChunk) << "'" << io::endl; @@ -83,6 +96,16 @@ static int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, ToneMapp return i + 1; } +static int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, color::ColorSpace* out) { + using namespace filament::color; + if (0 == compare(tokens[i], jsonChunk, "Rec709-Linear-D65")) { *out = Rec709-Linear-D65; } + else if (0 == compare(tokens[i], jsonChunk, "Rec709-sRGB-D65")) { *out = Rec709-sRGB-D65; } + else { + slog.w << "Invalid ColorSpace: '" << STR(tokens[i], jsonChunk) << "'" << io::endl; + } + return i + 1; +} + static int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, GenericToneMapperSettings* out) { CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); int size = tokens[i++].size; @@ -109,6 +132,36 @@ static int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, GenericT return i; } +static int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, AgxToneMapper::AgxLook* out) { + if (0 == compare(tokens[i], jsonChunk, "NONE")) { *out = AgxToneMapper::AgxLook::NONE; } + else if (0 == compare(tokens[i], jsonChunk, "PUNCHY")) { *out = AgxToneMapper::AgxLook::PUNCHY; } + else if (0 == compare(tokens[i], jsonChunk, "GOLDEN")) { *out = AgxToneMapper::AgxLook::GOLDEN; } + else { + slog.w << "Invalid AgxLook: '" << STR(tokens[i], jsonChunk) << "'" << io::endl; + } + return i + 1; +} + +static int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, AgxToneMapperSettings* out) { + CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); + int size = tokens[i++].size; + for (int j = 0; j < size; ++j) { + const jsmntok_t tok = tokens[i]; + CHECK_KEY(tok); + if (compare(tok, jsonChunk, "look") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->look); + } else { + slog.w << "Invalid AgX tone mapper key: '" << STR(tok, jsonChunk) << "'" << io::endl; + i = parse(tokens, i + 1); + } + if (i < 0) { + slog.e << "Invalid AgX tone mapper value: '" << STR(tok, jsonChunk) << "'" << io::endl; + return i; + } + } + return i; +} + static int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, ColorGradingSettings* out) { CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); int size = tokens[i++].size; @@ -117,12 +170,16 @@ static int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, ColorGra CHECK_KEY(tok); if (compare(tok, jsonChunk, "enabled") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->enabled); + } else if (compare(tok, jsonChunk, "colorspace") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->colorspace); } else if (compare(tok, jsonChunk, "quality") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->quality); } else if (compare(tok, jsonChunk, "toneMapping") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->toneMapping); } else if (compare(tok, jsonChunk, "genericToneMapper") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->genericToneMapper); + } else if (compare(tok, jsonChunk, "agxToneMapper") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->agxToneMapper); } else if (compare(tok, jsonChunk, "luminanceScaling") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->luminanceScaling); } else if (compare(tok, jsonChunk, "gamutMapping") == 0) { @@ -246,6 +303,8 @@ static int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, ViewSett i = parse(tokens, i + 1, jsonChunk, &out->vsmShadowOptions); } else if (compare(tok, jsonChunk, "postProcessingEnabled") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->postProcessingEnabled); + } else if (compare(tok, jsonChunk, "stereoscopicOptions") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->stereoscopicOptions); } else { slog.w << "Invalid view setting key: '" << STR(tok, jsonChunk) << "'" << io::endl; i = parse(tokens, i + 1); @@ -339,19 +398,13 @@ static int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, static int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, LightManager::ShadowOptions* out) { CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); - int size = tokens[i++].size; + int const size = tokens[i++].size; math::float3 splitsVector; for (int j = 0; j < size; ++j) { const jsmntok_t tok = tokens[i]; CHECK_KEY(tok); if (compare(tok, jsonChunk, "mapSize") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->mapSize); - } else if (compare(tok, jsonChunk, "stable") == 0) { - i = parse(tokens, i + 1, jsonChunk, &out->stable); - } else if (compare(tok, jsonChunk, "lispsm") == 0) { - i = parse(tokens, i + 1, jsonChunk, &out->lispsm); - } else if (compare(tok, jsonChunk, "screenSpaceContactShadows") == 0) { - i = parse(tokens, i + 1, jsonChunk, &out->screenSpaceContactShadows); } else if (compare(tok, jsonChunk, "shadowCascades") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->shadowCascades); } else if (compare(tok, jsonChunk, "cascadeSplitPositions") == 0) { @@ -359,8 +412,27 @@ static int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, out->cascadeSplitPositions[0] = splitsVector[0]; out->cascadeSplitPositions[1] = splitsVector[1]; out->cascadeSplitPositions[2] = splitsVector[2]; + // TODO: constantBias + // TODO: normalBias + // TODO: shadowFar + // TODO: shadowNearHint + // TODO: shadowFarHint + } else if (compare(tok, jsonChunk, "stable") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->stable); + } else if (compare(tok, jsonChunk, "lispsm") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->lispsm); + // TODO: polygonOffsetConstant + // TODO: polygonOffsetSlope + } else if (compare(tok, jsonChunk, "screenSpaceContactShadows") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->screenSpaceContactShadows); + // TODO: stepCount + // TODO: maxShadowDistance } else if (compare(tok, jsonChunk, "vsm") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->vsm); + } else if (compare(tok, jsonChunk, "shadowBulbRadius") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->shadowBulbRadius); + } else if (compare(tok, jsonChunk, "transform") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->transform.xyzw); } else { slog.w << "Invalid shadow options key: '" << STR(tok, jsonChunk) << "'" << io::endl; i = parse(tokens, i + 1); @@ -389,6 +461,12 @@ static int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, LightSet i = parse(tokens, i + 1, jsonChunk, &out->softShadowOptions); } else if (compare(tok, jsonChunk, "sunlightIntensity") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->sunlightIntensity); + } else if (compare(tok, jsonChunk, "sunlightHaloSize") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->sunlightHaloSize); + } else if (compare(tok, jsonChunk, "sunlightHaloFalloff") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->sunlightHaloFalloff); + } else if (compare(tok, jsonChunk, "sunlightAngularRadius") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->sunlightAngularRadius); } else if (compare(tok, jsonChunk, "sunlightDirection") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->sunlightDirection); } else if (compare(tok, jsonChunk, "sunlightColor") == 0) { @@ -421,6 +499,14 @@ static int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, ViewerOp i = parse(tokens, i + 1, jsonChunk, &out->cameraSpeed); } else if (compare(tok, jsonChunk, "cameraISO") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->cameraISO); + } else if (compare(tok, jsonChunk, "cameraNear") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->cameraNear); + } else if (compare(tok, jsonChunk, "cameraFar") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->cameraFar); + } else if (compare(tok, jsonChunk, "cameraEyeOcularDistance") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->cameraEyeOcularDistance); + } else if (compare(tok, jsonChunk, "cameraEyeToeIn") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->cameraEyeToeIn); } else if (compare(tok, jsonChunk, "groundShadowStrength") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->groundShadowStrength); } else if (compare(tok, jsonChunk, "groundPlaneEnabled") == 0) { @@ -493,6 +579,7 @@ void applySettings(Engine* engine, const ViewSettings& settings, View* dest) { dest->setShadowType(settings.shadowType); dest->setVsmShadowOptions(settings.vsmShadowOptions); dest->setGuardBandOptions(settings.guardBand); + dest->setStereoscopicOptions(settings.stereoscopicOptions); dest->setPostProcessingEnabled(settings.postProcessingEnabled); } @@ -510,7 +597,7 @@ void applySettings(Engine* engine, const MaterialSettings& settings, MaterialIns } void applySettings(Engine* engine, const LightSettings& settings, IndirectLight* ibl, utils::Entity sunlight, - utils::Entity* sceneLights, size_t sceneLightCount, LightManager* lm, Scene* scene, View* view) { + const utils::Entity* sceneLights, size_t sceneLightCount, LightManager* lm, Scene* scene, View* view) { auto light = lm->getInstance(sunlight); if (light) { if (settings.enableSunlight) { @@ -519,6 +606,9 @@ void applySettings(Engine* engine, const LightSettings& settings, IndirectLight* scene->remove(sunlight); } lm->setIntensity(light, settings.sunlightIntensity); + lm->setSunHaloSize(light, settings.sunlightHaloSize); + lm->setSunHaloFalloff(light, settings.sunlightHaloFalloff); + lm->setSunAngularRadius(light, settings.sunlightAngularRadius); lm->setDirection(light, normalize(settings.sunlightDirection)); lm->setColor(light, settings.sunlightColor); lm->setShadowCaster(light, settings.enableShadows); @@ -529,11 +619,11 @@ void applySettings(Engine* engine, const LightSettings& settings, IndirectLight* ibl->setRotation(math::mat3f::rotation(settings.iblRotation, math::float3 { 0, 1, 0 })); } for (size_t i = 0; i < sceneLightCount; i++) { - light = lm->getInstance(sceneLights[i]); - if (lm->isSpotLight(light)) { - lm->setShadowCaster(light, settings.enableShadows); + auto const li = lm->getInstance(sceneLights[i]); + if (li) { + lm->setShadowCaster(li, settings.enableShadows); + lm->setShadowOptions(li, settings.shadowOptions); } - lm->setShadowOptions(light, settings.shadowOptions); } view->setSoftShadowOptions(settings.softShadowOptions); } @@ -564,6 +654,22 @@ void applySettings(Engine* engine, const ViewerOptions& settings, Camera* camera camera->setFocusDistance(settings.cameraFocusDistance); } engine->setAutomaticInstancingEnabled(settings.autoInstancingEnabled); + + // Eyes are rendered from left-to-right, i.e., eye 0 is rendered to the left side of the + // window. + // For testing, we want to render a side-by-side layout so users can view with + // "cross-eyed" stereo. + // For cross-eyed stereo, Eye 0 is really the RIGHT eye, while Eye 1 is the LEFT eye. + const auto od = settings.cameraEyeOcularDistance; + const auto toeIn = settings.cameraEyeToeIn; + const auto eyeCount = engine->getConfig().stereoscopicEyeCount; + const double3 up = double3(0.0, 1.0, 0.0); + const mat4 rightEye = mat4::translation(double3{ od, 0.0, 0.0}) * mat4::rotation( toeIn, up); + const mat4 leftEye = mat4::translation(double3{-od, 0.0, 0.0}) * mat4::rotation(-toeIn, up); + const mat4 modelMatrices[2] = { rightEye, leftEye }; + for (int i = 0; i < eyeCount; i++) { + camera->setEyeModelMatrix(i, modelMatrices[i % 2]); + } } constexpr ToneMapper* createToneMapper(const ColorGradingSettings& settings) noexcept { @@ -572,12 +678,14 @@ constexpr ToneMapper* createToneMapper(const ColorGradingSettings& settings) noe case ToneMapping::ACES_LEGACY: return new ACESLegacyToneMapper; case ToneMapping::ACES: return new ACESToneMapper; case ToneMapping::FILMIC: return new FilmicToneMapper; + case ToneMapping::AGX: return new AgxToneMapper(settings.agxToneMapper.look); case ToneMapping::GENERIC: return new GenericToneMapper( - settings.genericToneMapper.contrast, - settings.genericToneMapper.midGrayIn, - settings.genericToneMapper.midGrayOut, - settings.genericToneMapper.hdrMax + settings.genericToneMapper.contrast, + settings.genericToneMapper.midGrayIn, + settings.genericToneMapper.midGrayOut, + settings.genericToneMapper.hdrMax ); + case ToneMapping::PBR_NEUTRAL: return new PBRNeutralToneMapper; case ToneMapping::DISPLAY_RANGE: return new DisplayRangeToneMapper; } } @@ -604,6 +712,7 @@ ColorGrading* createColorGrading(const ColorGradingSettings& settings, Engine* e .toneMapper(toneMapper) .luminanceScaling(settings.luminanceScaling) .gamutMapping(settings.gamutMapping) + .outputColorSpace(settings.colorspace) .build(*engine); delete toneMapper; return colorGrading; @@ -625,7 +734,9 @@ static std::ostream& operator<<(std::ostream& out, ToneMapping in) { case ToneMapping::ACES_LEGACY: return out << "\"ACES_LEGACY\""; case ToneMapping::ACES: return out << "\"ACES\""; case ToneMapping::FILMIC: return out << "\"FILMIC\""; + case ToneMapping::AGX: return out << "\"AGX\""; case ToneMapping::GENERIC: return out << "\"GENERIC\""; + case ToneMapping::PBR_NEUTRAL: return out << "\"PBR_NEUTRAL\""; case ToneMapping::DISPLAY_RANGE: return out << "\"DISPLAY_RANGE\""; } return out << "\"INVALID\""; @@ -640,12 +751,29 @@ static std::ostream& operator<<(std::ostream& out, const GenericToneMapperSettin << "}"; } +static std::ostream& operator<<(std::ostream& out, AgxToneMapper::AgxLook in) { + switch (in) { + case AgxToneMapper::AgxLook::NONE: return out << "\"NONE\""; + case AgxToneMapper::AgxLook::PUNCHY: return out << "\"PUNCHY\""; + case AgxToneMapper::AgxLook::GOLDEN: return out << "\"GOLDEN\""; + } + return out << "\"INVALID\""; +} + +static std::ostream& operator<<(std::ostream& out, const AgxToneMapperSettings& in) { + return out << "{\n" + << "\"look\": " << (in.look) << ",\n" + << "}"; +} + static std::ostream& operator<<(std::ostream& out, const ColorGradingSettings& in) { return out << "{\n" << "\"enabled\": " << to_string(in.enabled) << ",\n" + << "\"colorspace\": " << to_string(in.colorspace) << ",\n" << "\"quality\": " << (in.quality) << ",\n" << "\"toneMapping\": " << (in.toneMapping) << ",\n" << "\"genericToneMapper\": " << (in.genericToneMapper) << ",\n" + << "\"agxToneMapper\": " << (in.agxToneMapper) << ",\n" << "\"luminanceScaling\": " << to_string(in.luminanceScaling) << ",\n" << "\"gamutMapping\": " << to_string(in.gamutMapping) << ",\n" << "\"exposure\": " << (in.exposure) << ",\n" @@ -674,18 +802,20 @@ static std::ostream& operator<<(std::ostream& out, const ColorGradingSettings& i static std::ostream& operator<<(std::ostream& out, const LightManager::ShadowOptions& in) { const float* splits = in.cascadeSplitPositions; - math::float3 splitsVector = { splits[0], splits[1], splits[2] }; + math::float3 const splitsVector = { splits[0], splits[1], splits[2] }; return out << "{\n" << "\"vsm\": {\n" << "\"elvsm\": " << to_string(in.vsm.elvsm) << ",\n" << "\"blurWidth\": " << in.vsm.blurWidth << "\n" << "},\n" << "\"mapSize\": " << in.mapSize << ",\n" + << "\"shadowCascades\": " << int(in.shadowCascades) << ",\n" + << "\"cascadeSplitPositions\": " << (splitsVector) << "\n" << "\"stable\": " << to_string(in.stable) << ",\n" << "\"lispsm\": " << to_string(in.lispsm) << ",\n" << "\"screenSpaceContactShadows\": " << to_string(in.screenSpaceContactShadows) << ",\n" - << "\"shadowCascades\": " << int(in.shadowCascades) << ",\n" - << "\"cascadeSplitPositions\": " << (splitsVector) << "\n" + << "\"shadowBulbRadius\": " << in.shadowBulbRadius << ",\n" + << "\"transform\": " << in.transform.xyzw << ",\n" << "}"; } @@ -736,6 +866,9 @@ static std::ostream& operator<<(std::ostream& out, const LightSettings& in) { << "\"shadowOptions\": " << (in.shadowOptions) << ",\n" << "\"softShadowOptions\": " << (in.softShadowOptions) << ",\n" << "\"sunlightIntensity\": " << (in.sunlightIntensity) << ",\n" + << "\"sunlightHaloSize\": " << (in.sunlightHaloSize) << ",\n" + << "\"sunlightHaloFalloff\": " << (in.sunlightHaloFalloff) << ",\n" + << "\"sunlightAngularRadius\": " << (in.sunlightAngularRadius) << ",\n" << "\"sunlightDirection\": " << (in.sunlightDirection) << ",\n" << "\"sunlightColor\": " << (in.sunlightColor) << ",\n" << "\"iblIntensity\": " << (in.iblIntensity) << ",\n" @@ -748,6 +881,10 @@ static std::ostream& operator<<(std::ostream& out, const ViewerOptions& in) { << "\"cameraAperture\": " << (in.cameraAperture) << ",\n" << "\"cameraSpeed\": " << (in.cameraSpeed) << ",\n" << "\"cameraISO\": " << (in.cameraISO) << ",\n" + << "\"cameraNear\": " << (in.cameraNear) << ",\n" + << "\"cameraFar\": " << (in.cameraFar) << ",\n" + << "\"cameraEyeOcularDistance\": " << (in.cameraEyeOcularDistance) << ",\n" + << "\"cameraEyeToeIn\": " << (in.cameraEyeToeIn) << ",\n" << "\"groundShadowStrength\": " << (in.groundShadowStrength) << ",\n" << "\"groundPlaneEnabled\": " << to_string(in.groundPlaneEnabled) << ",\n" << "\"skyboxEnabled\": " << to_string(in.skyboxEnabled) << ",\n" @@ -785,6 +922,7 @@ static std::ostream& operator<<(std::ostream& out, const ViewSettings& in) { << "\"shadowType\": " << (in.shadowType) << ",\n" << "\"vsmShadowOptions\": " << (in.vsmShadowOptions) << ",\n" << "\"guardBand\": " << (in.guardBand) << ",\n" + << "\"stereoscopicOptions\": " << (in.stereoscopicOptions) << ",\n" << "\"postProcessingEnabled\": " << to_string(in.postProcessingEnabled) << "\n" << "}"; } @@ -798,7 +936,7 @@ static std::ostream& operator<<(std::ostream& out, const Settings& in) { << "}"; } -bool GenericToneMapperSettings::operator==(const GenericToneMapperSettings &rhs) const { +bool GenericToneMapperSettings::operator==(const GenericToneMapperSettings& rhs) const { static_assert(sizeof(GenericToneMapperSettings) == 16, "Please update Settings.cpp"); return contrast == rhs.contrast && midGrayIn == rhs.midGrayIn && @@ -806,14 +944,21 @@ bool GenericToneMapperSettings::operator==(const GenericToneMapperSettings &rhs) hdrMax == rhs.hdrMax; } -bool ColorGradingSettings::operator==(const ColorGradingSettings &rhs) const { +bool AgxToneMapperSettings::operator==(const AgxToneMapperSettings& rhs) const { + static_assert(sizeof(AgxToneMapperSettings) == 1, "Please update Settings.cpp"); + return look == rhs.look; +} + +bool ColorGradingSettings::operator==(const ColorGradingSettings& rhs) const { // If you had to fix the following codeline, then you likely also need to update the // implementation of operator==. - static_assert(sizeof(ColorGradingSettings) == 228, "Please update Settings.cpp"); + static_assert(sizeof(ColorGradingSettings) == 312, "Please update Settings.cpp"); return enabled == rhs.enabled && + colorspace == rhs.colorspace && quality == rhs.quality && toneMapping == rhs.toneMapping && genericToneMapper == rhs.genericToneMapper && + agxToneMapper == rhs.agxToneMapper && luminanceScaling == rhs.luminanceScaling && gamutMapping == rhs.gamutMapping && exposure == rhs.exposure && diff --git a/libs/viewer/src/Settings_generated.cpp b/libs/viewer/src/Settings_generated.cpp index cac1d5f2da0..ba7705e2997 100644 --- a/libs/viewer/src/Settings_generated.cpp +++ b/libs/viewer/src/Settings_generated.cpp @@ -6,6 +6,7 @@ #include #include +#include #include "jsonParseUtils.h" @@ -237,8 +238,6 @@ int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, BloomOptions* o i = parse(tokens, i + 1, jsonChunk, &out->strength); } else if (compare(tok, jsonChunk, "resolution") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->resolution); - } else if (compare(tok, jsonChunk, "anamorphism") == 0) { - i = parse(tokens, i + 1, jsonChunk, &out->anamorphism); } else if (compare(tok, jsonChunk, "levels") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->levels); } else if (compare(tok, jsonChunk, "blendMode") == 0) { @@ -249,6 +248,8 @@ int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, BloomOptions* o i = parse(tokens, i + 1, jsonChunk, &out->enabled); } else if (compare(tok, jsonChunk, "highlight") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->highlight); + } else if (compare(tok, jsonChunk, "quality") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->quality); } else if (compare(tok, jsonChunk, "lensFlare") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->lensFlare); } else if (compare(tok, jsonChunk, "starburst") == 0) { @@ -285,12 +286,12 @@ std::ostream& operator<<(std::ostream& out, const BloomOptions& in) { // JSON serialization for dirtStrength is not supported. << "\"strength\": " << (in.strength) << ",\n" << "\"resolution\": " << (in.resolution) << ",\n" - << "\"anamorphism\": " << (in.anamorphism) << ",\n" << "\"levels\": " << int(in.levels) << ",\n" << "\"blendMode\": " << (in.blendMode) << ",\n" << "\"threshold\": " << to_string(in.threshold) << ",\n" << "\"enabled\": " << to_string(in.enabled) << ",\n" << "\"highlight\": " << (in.highlight) << ",\n" + << "\"quality\": " << (in.quality) << ",\n" << "\"lensFlare\": " << to_string(in.lensFlare) << ",\n" << "\"starburst\": " << to_string(in.starburst) << ",\n" << "\"chromaticAberration\": " << (in.chromaticAberration) << ",\n" @@ -311,6 +312,8 @@ int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, FogOptions* out CHECK_KEY(tok); if (compare(tok, jsonChunk, "distance") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->distance); + } else if (compare(tok, jsonChunk, "cutOffDistance") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->cutOffDistance); } else if (compare(tok, jsonChunk, "maximumOpacity") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->maximumOpacity); } else if (compare(tok, jsonChunk, "height") == 0) { @@ -327,6 +330,10 @@ int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, FogOptions* out i = parse(tokens, i + 1, jsonChunk, &out->inScatteringSize); } else if (compare(tok, jsonChunk, "fogColorFromIbl") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->fogColorFromIbl); + } else if (compare(tok, jsonChunk, "skyColor") == 0) { + // JSON serialization for skyColor is not supported. + int unused; + i = parse(tokens, i + 1, jsonChunk, &unused); } else if (compare(tok, jsonChunk, "enabled") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->enabled); } else { @@ -344,6 +351,7 @@ int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, FogOptions* out std::ostream& operator<<(std::ostream& out, const FogOptions& in) { return out << "{\n" << "\"distance\": " << (in.distance) << ",\n" + << "\"cutOffDistance\": " << (in.cutOffDistance) << ",\n" << "\"maximumOpacity\": " << (in.maximumOpacity) << ",\n" << "\"height\": " << (in.height) << ",\n" << "\"heightFalloff\": " << (in.heightFalloff) << ",\n" @@ -352,6 +360,7 @@ std::ostream& operator<<(std::ostream& out, const FogOptions& in) { << "\"inScatteringStart\": " << (in.inScatteringStart) << ",\n" << "\"inScatteringSize\": " << (in.inScatteringSize) << ",\n" << "\"fogColorFromIbl\": " << to_string(in.fogColorFromIbl) << ",\n" + // JSON serialization for skyColor is not supported. << "\"enabled\": " << to_string(in.enabled) << "\n" << "}"; } @@ -383,6 +392,8 @@ int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, DepthOfFieldOpt CHECK_KEY(tok); if (compare(tok, jsonChunk, "cocScale") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->cocScale); + } else if (compare(tok, jsonChunk, "cocAspectRatio") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->cocAspectRatio); } else if (compare(tok, jsonChunk, "maxApertureDiameter") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->maxApertureDiameter); } else if (compare(tok, jsonChunk, "enabled") == 0) { @@ -416,6 +427,7 @@ int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, DepthOfFieldOpt std::ostream& operator<<(std::ostream& out, const DepthOfFieldOptions& in) { return out << "{\n" << "\"cocScale\": " << (in.cocScale) << ",\n" + << "\"cocAspectRatio\": " << (in.cocAspectRatio) << ",\n" << "\"maxApertureDiameter\": " << (in.maxApertureDiameter) << ",\n" << "\"enabled\": " << to_string(in.enabled) << ",\n" << "\"filter\": " << (in.filter) << ",\n" @@ -639,6 +651,67 @@ std::ostream& operator<<(std::ostream& out, const MultiSampleAntiAliasingOptions << "}"; } +int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, TemporalAntiAliasingOptions::BoxType* out) { + if (0 == compare(tokens[i], jsonChunk, "AABB")) { *out = TemporalAntiAliasingOptions::BoxType::AABB; } + else if (0 == compare(tokens[i], jsonChunk, "VARIANCE")) { *out = TemporalAntiAliasingOptions::BoxType::VARIANCE; } + else if (0 == compare(tokens[i], jsonChunk, "AABB_VARIANCE")) { *out = TemporalAntiAliasingOptions::BoxType::AABB_VARIANCE; } + else { + slog.w << "Invalid TemporalAntiAliasingOptions::BoxType: '" << STR(tokens[i], jsonChunk) << "'" << io::endl; + } + return i + 1; +} + +std::ostream& operator<<(std::ostream& out, TemporalAntiAliasingOptions::BoxType in) { + switch (in) { + case TemporalAntiAliasingOptions::BoxType::AABB: return out << "\"AABB\""; + case TemporalAntiAliasingOptions::BoxType::VARIANCE: return out << "\"VARIANCE\""; + case TemporalAntiAliasingOptions::BoxType::AABB_VARIANCE: return out << "\"AABB_VARIANCE\""; + } + return out << "\"INVALID\""; +} + +int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, TemporalAntiAliasingOptions::BoxClipping* out) { + if (0 == compare(tokens[i], jsonChunk, "ACCURATE")) { *out = TemporalAntiAliasingOptions::BoxClipping::ACCURATE; } + else if (0 == compare(tokens[i], jsonChunk, "CLAMP")) { *out = TemporalAntiAliasingOptions::BoxClipping::CLAMP; } + else if (0 == compare(tokens[i], jsonChunk, "NONE")) { *out = TemporalAntiAliasingOptions::BoxClipping::NONE; } + else { + slog.w << "Invalid TemporalAntiAliasingOptions::BoxClipping: '" << STR(tokens[i], jsonChunk) << "'" << io::endl; + } + return i + 1; +} + +std::ostream& operator<<(std::ostream& out, TemporalAntiAliasingOptions::BoxClipping in) { + switch (in) { + case TemporalAntiAliasingOptions::BoxClipping::ACCURATE: return out << "\"ACCURATE\""; + case TemporalAntiAliasingOptions::BoxClipping::CLAMP: return out << "\"CLAMP\""; + case TemporalAntiAliasingOptions::BoxClipping::NONE: return out << "\"NONE\""; + } + return out << "\"INVALID\""; +} + +int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, TemporalAntiAliasingOptions::JitterPattern* out) { + if (0 == compare(tokens[i], jsonChunk, "RGSS_X4")) { *out = TemporalAntiAliasingOptions::JitterPattern::RGSS_X4; } + else if (0 == compare(tokens[i], jsonChunk, "UNIFORM_HELIX_X4")) { *out = TemporalAntiAliasingOptions::JitterPattern::UNIFORM_HELIX_X4; } + else if (0 == compare(tokens[i], jsonChunk, "HALTON_23_X8")) { *out = TemporalAntiAliasingOptions::JitterPattern::HALTON_23_X8; } + else if (0 == compare(tokens[i], jsonChunk, "HALTON_23_X16")) { *out = TemporalAntiAliasingOptions::JitterPattern::HALTON_23_X16; } + else if (0 == compare(tokens[i], jsonChunk, "HALTON_23_X32")) { *out = TemporalAntiAliasingOptions::JitterPattern::HALTON_23_X32; } + else { + slog.w << "Invalid TemporalAntiAliasingOptions::JitterPattern: '" << STR(tokens[i], jsonChunk) << "'" << io::endl; + } + return i + 1; +} + +std::ostream& operator<<(std::ostream& out, TemporalAntiAliasingOptions::JitterPattern in) { + switch (in) { + case TemporalAntiAliasingOptions::JitterPattern::RGSS_X4: return out << "\"RGSS_X4\""; + case TemporalAntiAliasingOptions::JitterPattern::UNIFORM_HELIX_X4: return out << "\"UNIFORM_HELIX_X4\""; + case TemporalAntiAliasingOptions::JitterPattern::HALTON_23_X8: return out << "\"HALTON_23_X8\""; + case TemporalAntiAliasingOptions::JitterPattern::HALTON_23_X16: return out << "\"HALTON_23_X16\""; + case TemporalAntiAliasingOptions::JitterPattern::HALTON_23_X32: return out << "\"HALTON_23_X32\""; + } + return out << "\"INVALID\""; +} + int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, TemporalAntiAliasingOptions* out) { CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); int size = tokens[i++].size; @@ -649,8 +722,32 @@ int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, TemporalAntiAli i = parse(tokens, i + 1, jsonChunk, &out->filterWidth); } else if (compare(tok, jsonChunk, "feedback") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->feedback); + } else if (compare(tok, jsonChunk, "lodBias") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->lodBias); + } else if (compare(tok, jsonChunk, "sharpness") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->sharpness); } else if (compare(tok, jsonChunk, "enabled") == 0) { i = parse(tokens, i + 1, jsonChunk, &out->enabled); + } else if (compare(tok, jsonChunk, "upscaling") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->upscaling); + } else if (compare(tok, jsonChunk, "filterHistory") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->filterHistory); + } else if (compare(tok, jsonChunk, "filterInput") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->filterInput); + } else if (compare(tok, jsonChunk, "useYCoCg") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->useYCoCg); + } else if (compare(tok, jsonChunk, "boxType") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->boxType); + } else if (compare(tok, jsonChunk, "boxClipping") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->boxClipping); + } else if (compare(tok, jsonChunk, "jitterPattern") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->jitterPattern); + } else if (compare(tok, jsonChunk, "varianceGamma") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->varianceGamma); + } else if (compare(tok, jsonChunk, "preventFlickering") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->preventFlickering); + } else if (compare(tok, jsonChunk, "historyReprojection") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->historyReprojection); } else { slog.w << "Invalid TemporalAntiAliasingOptions key: '" << STR(tok, jsonChunk) << "'" << io::endl; i = parse(tokens, i + 1); @@ -667,7 +764,19 @@ std::ostream& operator<<(std::ostream& out, const TemporalAntiAliasingOptions& i return out << "{\n" << "\"filterWidth\": " << (in.filterWidth) << ",\n" << "\"feedback\": " << (in.feedback) << ",\n" - << "\"enabled\": " << to_string(in.enabled) << "\n" + << "\"lodBias\": " << (in.lodBias) << ",\n" + << "\"sharpness\": " << (in.sharpness) << ",\n" + << "\"enabled\": " << to_string(in.enabled) << ",\n" + << "\"upscaling\": " << to_string(in.upscaling) << ",\n" + << "\"filterHistory\": " << to_string(in.filterHistory) << ",\n" + << "\"filterInput\": " << to_string(in.filterInput) << ",\n" + << "\"useYCoCg\": " << to_string(in.useYCoCg) << ",\n" + << "\"boxType\": " << (in.boxType) << ",\n" + << "\"boxClipping\": " << (in.boxClipping) << ",\n" + << "\"jitterPattern\": " << (in.jitterPattern) << ",\n" + << "\"varianceGamma\": " << (in.varianceGamma) << ",\n" + << "\"preventFlickering\": " << to_string(in.preventFlickering) << ",\n" + << "\"historyReprojection\": " << to_string(in.historyReprojection) << "\n" << "}"; } @@ -774,6 +883,7 @@ int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, ShadowType* out else if (0 == compare(tokens[i], jsonChunk, "VSM")) { *out = ShadowType::VSM; } else if (0 == compare(tokens[i], jsonChunk, "DPCF")) { *out = ShadowType::DPCF; } else if (0 == compare(tokens[i], jsonChunk, "PCSS")) { *out = ShadowType::PCSS; } + else if (0 == compare(tokens[i], jsonChunk, "PCFd")) { *out = ShadowType::PCFd; } else { slog.w << "Invalid ShadowType: '" << STR(tokens[i], jsonChunk) << "'" << io::endl; } @@ -786,6 +896,7 @@ std::ostream& operator<<(std::ostream& out, ShadowType in) { case ShadowType::VSM: return out << "\"VSM\""; case ShadowType::DPCF: return out << "\"DPCF\""; case ShadowType::PCSS: return out << "\"PCSS\""; + case ShadowType::PCFd: return out << "\"PCFd\""; } return out << "\"INVALID\""; } @@ -860,4 +971,30 @@ std::ostream& operator<<(std::ostream& out, const SoftShadowOptions& in) { << "}"; } +int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, StereoscopicOptions* out) { + CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); + int size = tokens[i++].size; + for (int j = 0; j < size; ++j) { + const jsmntok_t tok = tokens[i]; + CHECK_KEY(tok); + if (compare(tok, jsonChunk, "enabled") == 0) { + i = parse(tokens, i + 1, jsonChunk, &out->enabled); + } else { + slog.w << "Invalid StereoscopicOptions key: '" << STR(tok, jsonChunk) << "'" << io::endl; + i = parse(tokens, i + 1); + } + if (i < 0) { + slog.e << "Invalid StereoscopicOptions value: '" << STR(tok, jsonChunk) << "'" << io::endl; + return i; + } + } + return i; +} + +std::ostream& operator<<(std::ostream& out, const StereoscopicOptions& in) { + return out << "{\n" + << "\"enabled\": " << to_string(in.enabled) << "\n" + << "}"; +} + } // namespace filament::viewer diff --git a/libs/viewer/src/Settings_generated.h b/libs/viewer/src/Settings_generated.h index 1bd401ada10..1215a147eee 100644 --- a/libs/viewer/src/Settings_generated.h +++ b/libs/viewer/src/Settings_generated.h @@ -69,6 +69,15 @@ std::ostream& operator<<(std::ostream& out, const AmbientOcclusionOptions& in); int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, MultiSampleAntiAliasingOptions* out); std::ostream& operator<<(std::ostream& out, const MultiSampleAntiAliasingOptions& in); +int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, TemporalAntiAliasingOptions::BoxType* out); +std::ostream& operator<<(std::ostream& out, TemporalAntiAliasingOptions::BoxType in); + +int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, TemporalAntiAliasingOptions::BoxClipping* out); +std::ostream& operator<<(std::ostream& out, TemporalAntiAliasingOptions::BoxClipping in); + +int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, TemporalAntiAliasingOptions::JitterPattern* out); +std::ostream& operator<<(std::ostream& out, TemporalAntiAliasingOptions::JitterPattern in); + int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, TemporalAntiAliasingOptions* out); std::ostream& operator<<(std::ostream& out, const TemporalAntiAliasingOptions& in); @@ -93,4 +102,7 @@ std::ostream& operator<<(std::ostream& out, const VsmShadowOptions& in); int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, SoftShadowOptions* out); std::ostream& operator<<(std::ostream& out, const SoftShadowOptions& in); +int parse(jsmntok_t const* tokens, int i, const char* jsonChunk, StereoscopicOptions* out); +std::ostream& operator<<(std::ostream& out, const StereoscopicOptions& in); + } // namespace filament::viewer diff --git a/libs/viewer/src/ViewerGui.cpp b/libs/viewer/src/ViewerGui.cpp index ec41977f73c..826d18c9446 100644 --- a/libs/viewer/src/ViewerGui.cpp +++ b/libs/viewer/src/ViewerGui.cpp @@ -133,6 +133,9 @@ static void computeToneMapPlot(ColorGradingSettings& settings, float* plot) { case ToneMapping::FILMIC: mapper = new FilmicToneMapper; break; + case ToneMapping::AGX: + mapper = new AgxToneMapper(settings.agxToneMapper.look); + break; case ToneMapping::GENERIC: mapper = new GenericToneMapper( settings.genericToneMapper.contrast, @@ -142,6 +145,9 @@ static void computeToneMapPlot(ColorGradingSettings& settings, float* plot) { ); hdrMax = settings.genericToneMapper.hdrMax; break; + case ToneMapping::PBR_NEUTRAL: + mapper = new PBRNeutralToneMapper; + break; case ToneMapping::DISPLAY_RANGE: mapper = new DisplayRangeToneMapper; break; @@ -187,9 +193,13 @@ static void colorGradingUI(Settings& settings, float* rangePlot, float* curvePlo ImGui::Combo("Quality##colorGradingQuality", &quality, "Low\0Medium\0High\0Ultra\0\0"); colorGrading.quality = (decltype(colorGrading.quality)) quality; + int colorspace = (colorGrading.colorspace == Rec709-Linear-D65) ? 0 : 1; + ImGui::Combo("Output color space", &colorspace, "Rec709-Linear-D65\0Rec709-sRGB-D65\0\0"); + colorGrading.colorspace = (colorspace == 0) ? Rec709-Linear-D65 : Rec709-sRGB-D65; + int toneMapping = (int) colorGrading.toneMapping; ImGui::Combo("Tone-mapping", &toneMapping, - "Linear\0ACES (legacy)\0ACES\0Filmic\0Generic\0Display Range\0\0"); + "Linear\0ACES (legacy)\0ACES\0Filmic\0AgX\0Generic\0PBR Neutral\0Display Range\0\0"); colorGrading.toneMapping = (decltype(colorGrading.toneMapping)) toneMapping; if (colorGrading.toneMapping == ToneMapping::GENERIC) { if (ImGui::CollapsingHeader("Tonemap parameters")) { @@ -200,6 +210,11 @@ static void colorGradingUI(Settings& settings, float* rangePlot, float* curvePlo ImGui::SliderFloat("HDR max", &generic.hdrMax, 1.0f, 64.0f); } } + if (colorGrading.toneMapping == ToneMapping::AGX) { + int agxLook = (int) colorGrading.agxToneMapper.look; + ImGui::Combo("AgX Look", &agxLook, "None\0Punchy\0Golden\0\0"); + colorGrading.agxToneMapper.look = (decltype(colorGrading.agxToneMapper.look)) agxLook; + } computeToneMapPlot(colorGrading, toneMapPlot); @@ -372,15 +387,18 @@ ViewerGui::ViewerGui(filament::Engine* engine, filament::Scene* scene, filament: mSettings.view.ssao.enabled = true; mSettings.view.bloom.enabled = true; + DebugRegistry& debug = mEngine->getDebugRegistry(); + *debug.getPropertyAddress("d.stereo.combine_multiview_images") = true; + using namespace filament; LightManager::Builder(LightManager::Type::SUN) .color(mSettings.lighting.sunlightColor) .intensity(mSettings.lighting.sunlightIntensity) .direction(normalize(mSettings.lighting.sunlightDirection)) .castShadows(true) - .sunAngularRadius(1.0f) - .sunHaloSize(2.0f) - .sunHaloFalloff(80.0f) + .sunAngularRadius(mSettings.lighting.sunlightAngularRadius) + .sunHaloSize(mSettings.lighting.sunlightHaloSize) + .sunHaloFalloff(mSettings.lighting.sunlightHaloFalloff) .build(*engine, mSunlight); if (mSettings.lighting.enableSunlight) { mScene->addEntity(mSunlight); @@ -434,19 +452,30 @@ void ViewerGui::removeAsset() { } } +UTILS_NOINLINE +static bool notequal(float a, float b) noexcept { + return a != b; +} + +// we do this to circumvent -ffast-math ignoring NaNs +static bool is_not_a_number(float v) noexcept { + return notequal(v, v); +} + void ViewerGui::setIndirectLight(filament::IndirectLight* ibl, filament::math::float3 const* sh3) { using namespace filament::math; mSettings.view.fog.color = sh3[0]; mIndirectLight = ibl; if (ibl) { - float3 d = filament::IndirectLight::getDirectionEstimate(sh3); - float4 c = filament::IndirectLight::getColorEstimate(sh3, d); - if (!std::isnan(d.x * d.y * d.z)) { + float3 const d = filament::IndirectLight::getDirectionEstimate(sh3); + float4 const c = filament::IndirectLight::getColorEstimate(sh3, d); + bool const dIsValid = std::none_of(std::begin(d.v), std::end(d.v), is_not_a_number); + bool const cIsValid = std::none_of(std::begin(c.v), std::end(c.v), is_not_a_number); + if (dIsValid && cIsValid) { mSettings.lighting.sunlightDirection = d; mSettings.lighting.sunlightColor = c.rgb; mSettings.lighting.sunlightIntensity = c[3] * ibl->getIntensity(); - updateIndirectLight(); } } } @@ -466,14 +495,6 @@ void ViewerGui::updateRootTransform() { tcm.setTransform(root, transform); } -void ViewerGui::updateIndirectLight() { - using namespace filament::math; - if (mIndirectLight) { - mIndirectLight->setIntensity(mSettings.lighting.iblIntensity); - mIndirectLight->setRotation(mat3f::rotation(mSettings.lighting.iblRotation, float3{ 0, 1, 0 })); - } -} - void ViewerGui::sceneSelectionUI() { // Build a list of checkboxes, one for each glTF scene. bool changed = false; @@ -509,19 +530,25 @@ void ViewerGui::applyAnimation(double currentTime, FilamentInstance* instance) { return; } Animator& animator = *instance->getAnimator(); - const size_t numAnimations = animator.getAnimationCount(); + const size_t animationCount = animator.getAnimationCount(); if (mResetAnimation) { mPreviousStartTime = mCurrentStartTime; mCurrentStartTime = currentTime; mResetAnimation = false; } const double elapsedSeconds = currentTime - mCurrentStartTime; - if (numAnimations > 0 && mCurrentAnimation > 0) { - animator.applyAnimation(mCurrentAnimation - 1, elapsedSeconds); - if (elapsedSeconds < mCrossFadeDuration && mPreviousAnimation > 0) { + if (animationCount > 0 && mCurrentAnimation >= 0) { + if (mCurrentAnimation == animationCount) { + for (size_t i = 0; i < animationCount; i++) { + animator.applyAnimation(i, elapsedSeconds); + } + } else { + animator.applyAnimation(mCurrentAnimation, elapsedSeconds); + } + if (elapsedSeconds < mCrossFadeDuration && mPreviousAnimation >= 0 && mPreviousAnimation != animationCount) { const double previousSeconds = currentTime - mPreviousStartTime; const float lerpFactor = elapsedSeconds / mCrossFadeDuration; - animator.applyCrossFade(mPreviousAnimation - 1, previousSeconds, lerpFactor); + animator.applyCrossFade(mPreviousAnimation, previousSeconds, lerpFactor); } } if (mShowingRestPose) { @@ -731,8 +758,6 @@ void ViewerGui::updateUserInterface() { ImGui::Checkbox("Dithering", &dither); enableDithering(dither); ImGui::Checkbox("Bloom", &mSettings.view.bloom.enabled); - ImGui::Checkbox("Flare", &mSettings.view.bloom.lensFlare); - ImGui::Checkbox("TAA", &mSettings.view.taa.enabled); // this clutters the UI and isn't that useful (except when working on TAA) //ImGui::Indent(); @@ -751,56 +776,95 @@ void ViewerGui::updateUserInterface() { ImGui::Unindent(); ImGui::Checkbox("SSAO", &mSettings.view.ssao.enabled); - if (ImGui::CollapsingHeader("SSAO Options")) { - auto& ssao = mSettings.view.ssao; - - int quality = (int) ssao.quality; - int lowpass = (int) ssao.lowPassFilter; - bool upsampling = ssao.upsampling != View::QualityLevel::LOW; - - bool halfRes = ssao.resolution == 1.0f ? false : true; - ImGui::SliderInt("Quality", &quality, 0, 3); - ImGui::SliderInt("Low Pass", &lowpass, 0, 2); - ImGui::Checkbox("Bent Normals", &ssao.bentNormals); - ImGui::Checkbox("High quality upsampling", &upsampling); - ImGui::SliderFloat("Min Horizon angle", &ssao.minHorizonAngleRad, 0.0f, (float)M_PI_4); - ImGui::SliderFloat("Bilateral Threshold", &ssao.bilateralThreshold, 0.0f, 0.1f); - ImGui::Checkbox("Half resolution", &halfRes); - ssao.resolution = halfRes ? 0.5f : 1.0f; - - - ssao.upsampling = upsampling ? View::QualityLevel::HIGH : View::QualityLevel::LOW; - ssao.lowPassFilter = (View::QualityLevel) lowpass; - ssao.quality = (View::QualityLevel) quality; - - if (ImGui::CollapsingHeader("Dominant Light Shadows (experimental)")) { - int sampleCount = ssao.ssct.sampleCount; - ImGui::Checkbox("Enabled##dls", &ssao.ssct.enabled); - ImGui::SliderFloat("Cone angle", &ssao.ssct.lightConeRad, 0.0f, (float)M_PI_2); - ImGui::SliderFloat("Shadow Distance", &ssao.ssct.shadowDistance, 0.0f, 10.0f); - ImGui::SliderFloat("Contact dist max", &ssao.ssct.contactDistanceMax, 0.0f, 100.0f); - ImGui::SliderFloat("Intensity##dls", &ssao.ssct.intensity, 0.0f, 10.0f); - ImGui::SliderFloat("Depth bias", &ssao.ssct.depthBias, 0.0f, 1.0f); - ImGui::SliderFloat("Depth slope bias", &ssao.ssct.depthSlopeBias, 0.0f, 1.0f); - ImGui::SliderInt("Sample Count", &sampleCount, 1, 32); - ImGuiExt::DirectionWidget("Direction##dls", ssao.ssct.lightDirection.v); - ssao.ssct.sampleCount = sampleCount; - } - } ImGui::Checkbox("Screen-space reflections", &mSettings.view.screenSpaceReflections.enabled); - if (ImGui::CollapsingHeader("Screen-space reflections Options")) { - auto& ssrefl = mSettings.view.screenSpaceReflections; - ImGui::SliderFloat("Ray thickness", &ssrefl.thickness, 0.001f, 0.2f); - ImGui::SliderFloat("Bias", &ssrefl.bias, 0.001f, 0.5f); - ImGui::SliderFloat("Max distance", &ssrefl.maxDistance, 0.1, 10.0f); - ImGui::SliderFloat("Stride", &ssrefl.stride, 1.0, 10.0f); - } ImGui::Unindent(); ImGui::Checkbox("Screen-space Guard Band", &mSettings.view.guardBand.enabled); } + if (ImGui::CollapsingHeader("Bloom Options")) { + ImGui::SliderFloat("Strength", &mSettings.view.bloom.strength, 0.0f, 1.0f); + ImGui::Checkbox("Threshold", &mSettings.view.bloom.threshold); + + int levels = mSettings.view.bloom.levels; + ImGui::SliderInt("Levels", &levels, 3, 11); + mSettings.view.bloom.levels = levels; + + int quality = (int) mSettings.view.bloom.quality; + ImGui::SliderInt("Bloom Quality", &quality, 0, 3); + mSettings.view.bloom.quality = (View::QualityLevel) quality; + + ImGui::Checkbox("Lens Flare", &mSettings.view.bloom.lensFlare); + } + + if (ImGui::CollapsingHeader("TAA Options")) { + ImGui::Checkbox("Upscaling", &mSettings.view.taa.upscaling); + ImGui::Checkbox("History Reprojection", &mSettings.view.taa.historyReprojection); + ImGui::SliderFloat("Feedback", &mSettings.view.taa.feedback, 0.0f, 1.0f); + ImGui::Checkbox("Filter History", &mSettings.view.taa.filterHistory); + ImGui::Checkbox("Filter Input", &mSettings.view.taa.filterInput); + ImGui::SliderFloat("FilterWidth", &mSettings.view.taa.filterWidth, 0.2f, 2.0f); + ImGui::SliderFloat("LOD bias", &mSettings.view.taa.lodBias, -8.0f, 0.0f); + ImGui::Checkbox("Use YCoCg", &mSettings.view.taa.useYCoCg); + ImGui::Checkbox("Prevent Flickering", &mSettings.view.taa.preventFlickering); + int jitterSequence = (int)mSettings.view.taa.jitterPattern; + int boxClipping = (int)mSettings.view.taa.boxClipping; + int boxType = (int)mSettings.view.taa.boxType; + ImGui::Combo("Jitter Pattern", &jitterSequence, "RGSS x4\0Uniform Helix x4\0Halton x8\0Halton x16\0Halton x32\0\0"); + ImGui::Combo("Box Clipping", &boxClipping, "Accurate\0Clamp\0None\0\0"); + ImGui::Combo("Box Type", &boxType, "AABB\0Variance\0Both\0\0"); + ImGui::SliderFloat("Variance Gamma", &mSettings.view.taa.varianceGamma, 0.75f, 1.25f); + ImGui::SliderFloat("RCAS", &mSettings.view.taa.sharpness, 0.0f, 1.0f); + mSettings.view.taa.boxClipping = (TemporalAntiAliasingOptions::BoxClipping)boxClipping; + mSettings.view.taa.boxType = (TemporalAntiAliasingOptions::BoxType)boxType; + mSettings.view.taa.jitterPattern = (TemporalAntiAliasingOptions::JitterPattern)jitterSequence; + } + + if (ImGui::CollapsingHeader("SSAO Options")) { + auto& ssao = mSettings.view.ssao; + + int quality = (int) ssao.quality; + int lowpass = (int) ssao.lowPassFilter; + bool upsampling = ssao.upsampling != View::QualityLevel::LOW; + + bool halfRes = ssao.resolution != 1.0f; + ImGui::SliderInt("Quality", &quality, 0, 3); + ImGui::SliderInt("Low Pass", &lowpass, 0, 2); + ImGui::Checkbox("Bent Normals", &ssao.bentNormals); + ImGui::Checkbox("High quality upsampling", &upsampling); + ImGui::SliderFloat("Min Horizon angle", &ssao.minHorizonAngleRad, 0.0f, (float)M_PI_4); + ImGui::SliderFloat("Bilateral Threshold", &ssao.bilateralThreshold, 0.0f, 0.1f); + ImGui::Checkbox("Half resolution", &halfRes); + ssao.resolution = halfRes ? 0.5f : 1.0f; + + ssao.upsampling = upsampling ? View::QualityLevel::HIGH : View::QualityLevel::LOW; + ssao.lowPassFilter = (View::QualityLevel) lowpass; + ssao.quality = (View::QualityLevel) quality; + + if (ImGui::CollapsingHeader("Dominant Light Shadows (experimental)")) { + int sampleCount = ssao.ssct.sampleCount; + ImGui::Checkbox("Enabled##dls", &ssao.ssct.enabled); + ImGui::SliderFloat("Cone angle", &ssao.ssct.lightConeRad, 0.0f, (float)M_PI_2); + ImGui::SliderFloat("Shadow Distance", &ssao.ssct.shadowDistance, 0.0f, 10.0f); + ImGui::SliderFloat("Contact dist max", &ssao.ssct.contactDistanceMax, 0.0f, 100.0f); + ImGui::SliderFloat("Intensity##dls", &ssao.ssct.intensity, 0.0f, 10.0f); + ImGui::SliderFloat("Depth bias", &ssao.ssct.depthBias, 0.0f, 1.0f); + ImGui::SliderFloat("Depth slope bias", &ssao.ssct.depthSlopeBias, 0.0f, 1.0f); + ImGui::SliderInt("Sample Count", &sampleCount, 1, 32); + ImGuiExt::DirectionWidget("Direction##dls", ssao.ssct.lightDirection.v); + ssao.ssct.sampleCount = sampleCount; + } + } + + if (ImGui::CollapsingHeader("Screen-space reflections Options")) { + auto& ssrefl = mSettings.view.screenSpaceReflections; + ImGui::SliderFloat("Ray thickness", &ssrefl.thickness, 0.001f, 0.2f); + ImGui::SliderFloat("Bias", &ssrefl.bias, 0.001f, 0.5f); + ImGui::SliderFloat("Max distance", &ssrefl.maxDistance, 0.1, 10.0f); + ImGui::SliderFloat("Stride", &ssrefl.stride, 1.0, 10.0f); + } + if (ImGui::CollapsingHeader("Dynamic Resolution")) { auto& dsr = mSettings.view.dsr; int quality = (int)dsr.quality; @@ -825,10 +889,25 @@ void ViewerGui::updateUserInterface() { } if (ImGui::CollapsingHeader("Sunlight")) { ImGui::Checkbox("Enable sunlight", &light.enableSunlight); - ImGui::SliderFloat("Sun intensity", &light.sunlightIntensity, 50000.0, 150000.0f); + ImGui::SliderFloat("Sun intensity", &light.sunlightIntensity, 0.0f, 150000.0f); + ImGui::SliderFloat("Halo size", &light.sunlightHaloSize, 1.01f, 40.0f); + ImGui::SliderFloat("Halo falloff", &light.sunlightHaloFalloff, 4.0f, 1024.0f); + ImGui::SliderFloat("Sun radius", &light.sunlightAngularRadius, 0.1f, 10.0f); ImGuiExt::DirectionWidget("Sun direction", light.sunlightDirection.v); + ImGui::SliderFloat("Shadow Far", &light.shadowOptions.shadowFar, 0.0f, + mSettings.viewer.cameraFar); + + if (ImGui::CollapsingHeader("Shadow direction")) { + float3 shadowDirection = light.shadowOptions.transform * light.sunlightDirection; + ImGuiExt::DirectionWidget("Shadow direction", shadowDirection.v); + light.shadowOptions.transform = normalize(quatf{ + cross(light.sunlightDirection, shadowDirection), + sqrt(length2(light.sunlightDirection) * length2(shadowDirection)) + + dot(light.sunlightDirection, shadowDirection) + }); + } } - if (ImGui::CollapsingHeader("All lights")) { + if (ImGui::CollapsingHeader("Shadows")) { ImGui::Checkbox("Enable shadows", &light.enableShadows); int mapSize = light.shadowOptions.mapSize; ImGui::SliderInt("Shadow map size", &mapSize, 32, 1024); @@ -837,7 +916,7 @@ void ViewerGui::updateUserInterface() { ImGui::Checkbox("Enable LiSPSM", &light.shadowOptions.lispsm); int shadowType = (int)mSettings.view.shadowType; - ImGui::Combo("Shadow type", &shadowType, "PCF\0VSM\0DPCF\0PCSS\0\0"); + ImGui::Combo("Shadow type", &shadowType, "PCF\0VSM\0DPCF\0PCSS\0PCFd\0\0"); mSettings.view.shadowType = (ShadowType)shadowType; if (mSettings.view.shadowType == ShadowType::VSM) { @@ -879,17 +958,42 @@ void ViewerGui::updateUserInterface() { } if (ImGui::CollapsingHeader("Fog")) { + int fogColorSource = 0; + if (mSettings.view.fog.skyColor) { + fogColorSource = 2; + } else if (mSettings.view.fog.fogColorFromIbl) { + fogColorSource = 1; + } + + bool excludeSkybox = !std::isinf(mSettings.view.fog.cutOffDistance); ImGui::Indent(); - ImGui::Checkbox("Enable fog", &mSettings.view.fog.enabled); - ImGui::SliderFloat("Start", &mSettings.view.fog.distance, 0.0f, 100.0f); - ImGui::SliderFloat("Density", &mSettings.view.fog.density, 0.0f, 1.0f); - ImGui::SliderFloat("Height", &mSettings.view.fog.height, 0.0f, 100.0f); - ImGui::SliderFloat("Height falloff", &mSettings.view.fog.heightFalloff, 0.0f, 10.0f); - ImGui::SliderFloat("Scattering start", &mSettings.view.fog.inScatteringStart, 0.0f, 100.0f); - ImGui::SliderFloat("Scattering size", &mSettings.view.fog.inScatteringSize, 0.1f, 100.0f); - ImGui::Checkbox("Color from IBL", &mSettings.view.fog.fogColorFromIbl); + ImGui::Checkbox("Enable large-scale fog", &mSettings.view.fog.enabled); + ImGui::SliderFloat("Start [m]", &mSettings.view.fog.distance, 0.0f, 100.0f); + ImGui::SliderFloat("Extinction [1/m]", &mSettings.view.fog.density, 0.0f, 1.0f); + ImGui::SliderFloat("Floor [m]", &mSettings.view.fog.height, 0.0f, 100.0f); + ImGui::SliderFloat("Height falloff [1/m]", &mSettings.view.fog.heightFalloff, 0.0f, 4.0f); + ImGui::SliderFloat("Sun Scattering start [m]", &mSettings.view.fog.inScatteringStart, 0.0f, 100.0f); + ImGui::SliderFloat("Sun Scattering size", &mSettings.view.fog.inScatteringSize, 0.1f, 100.0f); + ImGui::Checkbox("Exclude Skybox", &excludeSkybox); + ImGui::Combo("Color##fogColor", &fogColorSource, "Constant\0IBL\0Skybox\0\0"); ImGui::ColorPicker3("Color", mSettings.view.fog.color.v); ImGui::Unindent(); + mSettings.view.fog.cutOffDistance = + excludeSkybox ? 1e6f : std::numeric_limits::infinity(); + switch (fogColorSource) { + case 0: + mSettings.view.fog.skyColor = nullptr; + mSettings.view.fog.fogColorFromIbl = false; + break; + case 1: + mSettings.view.fog.skyColor = nullptr; + mSettings.view.fog.fogColorFromIbl = true; + break; + case 2: + mSettings.view.fog.skyColor = mSettings.view.fogSettings.fogColorTexture; + mSettings.view.fog.fogColorFromIbl = false; + break; + } } if (ImGui::CollapsingHeader("Scene")) { @@ -923,34 +1027,36 @@ void ViewerGui::updateUserInterface() { if (ImGui::CollapsingHeader("Camera")) { ImGui::Indent(); - ImGui::SliderFloat("Focal length (mm)", &mSettings.viewer.cameraFocalLength, - 16.0f, 90.0f); - - bool dofMedian = mSettings.view.dof.filter == View::DepthOfFieldOptions::Filter::MEDIAN; - int dofRingCount = mSettings.view.dof.fastGatherRingCount; - int dofMaxCoC = mSettings.view.dof.maxForegroundCOC; - if (!dofRingCount) dofRingCount = 5; - if (!dofMaxCoC) dofMaxCoC = 32; - + ImGui::SliderFloat("Focal length (mm)", &mSettings.viewer.cameraFocalLength, 16.0f, 90.0f); ImGui::SliderFloat("Aperture", &mSettings.viewer.cameraAperture, 1.0f, 32.0f); ImGui::SliderFloat("Speed (1/s)", &mSettings.viewer.cameraSpeed, 1000.0f, 1.0f); ImGui::SliderFloat("ISO", &mSettings.viewer.cameraISO, 25.0f, 6400.0f); - ImGui::Checkbox("DoF", &mSettings.view.dof.enabled); - ImGui::SliderFloat("Focus distance", &mSettings.viewer.cameraFocusDistance, 0.0f, 30.0f); - ImGui::SliderFloat("Blur scale", &mSettings.view.dof.cocScale, 0.1f, 10.0f); - ImGui::SliderInt("Ring count", &dofRingCount, 1, 17); - ImGui::SliderInt("Max CoC", &dofMaxCoC, 1, 32); - ImGui::Checkbox("Native Resolution", &mSettings.view.dof.nativeResolution); - ImGui::Checkbox("Median Filter", &dofMedian); - - mSettings.view.dof.filter = dofMedian ? - View::DepthOfFieldOptions::Filter::MEDIAN : - View::DepthOfFieldOptions::Filter::NONE; - mSettings.view.dof.backgroundRingCount = dofRingCount; - mSettings.view.dof.foregroundRingCount = dofRingCount; - mSettings.view.dof.fastGatherRingCount = dofRingCount; - mSettings.view.dof.maxForegroundCOC = dofMaxCoC; - mSettings.view.dof.maxBackgroundCOC = dofMaxCoC; + ImGui::SliderFloat("Near", &mSettings.viewer.cameraNear, 0.001f, 1.0f); + ImGui::SliderFloat("Far", &mSettings.viewer.cameraFar, 1.0f, 10000.0f); + + if (ImGui::CollapsingHeader("DoF")) { + bool dofMedian = mSettings.view.dof.filter == View::DepthOfFieldOptions::Filter::MEDIAN; + int dofRingCount = mSettings.view.dof.fastGatherRingCount; + int dofMaxCoC = mSettings.view.dof.maxForegroundCOC; + if (!dofRingCount) dofRingCount = 5; + if (!dofMaxCoC) dofMaxCoC = 32; + ImGui::Checkbox("Enabled##dofEnabled", &mSettings.view.dof.enabled); + ImGui::SliderFloat("Focus distance", &mSettings.viewer.cameraFocusDistance, 0.0f, 30.0f); + ImGui::SliderFloat("Blur scale", &mSettings.view.dof.cocScale, 0.1f, 10.0f); + ImGui::SliderFloat("CoC aspect-ratio", &mSettings.view.dof.cocAspectRatio, 0.25f, 4.0f); + ImGui::SliderInt("Ring count", &dofRingCount, 1, 17); + ImGui::SliderInt("Max CoC", &dofMaxCoC, 1, 32); + ImGui::Checkbox("Native Resolution", &mSettings.view.dof.nativeResolution); + ImGui::Checkbox("Median Filter", &dofMedian); + mSettings.view.dof.filter = dofMedian ? + View::DepthOfFieldOptions::Filter::MEDIAN : + View::DepthOfFieldOptions::Filter::NONE; + mSettings.view.dof.backgroundRingCount = dofRingCount; + mSettings.view.dof.foregroundRingCount = dofRingCount; + mSettings.view.dof.fastGatherRingCount = dofRingCount; + mSettings.view.dof.maxForegroundCOC = dofMaxCoC; + mSettings.view.dof.maxBackgroundCOC = dofMaxCoC; + } if (ImGui::CollapsingHeader("Vignette")) { ImGui::Checkbox("Enabled##vignetteEnabled", &mSettings.view.vignette.enabled); @@ -969,7 +1075,7 @@ void ViewerGui::updateUserInterface() { std::vector names; names.reserve(cameraCount + 1); - names.push_back("Free camera"); + names.emplace_back("Free camera"); int c = 0; for (size_t i = 0; i < cameraCount; i++) { const char* n = mAsset->getName(cameras[i]); @@ -984,13 +1090,30 @@ void ViewerGui::updateUserInterface() { std::vector cstrings; cstrings.reserve(names.size()); - for (size_t i = 0; i < names.size(); i++) { - cstrings.push_back(names[i].c_str()); + for (const auto & name : names) { + cstrings.push_back(name.c_str()); } ImGui::ListBox("Cameras", &mCurrentCamera, cstrings.data(), cstrings.size()); } +#if defined(FILAMENT_SAMPLES_STEREO_TYPE_INSTANCED) \ + || defined(FILAMENT_SAMPLES_STEREO_TYPE_MULTIVIEW) + ImGui::Checkbox("Stereo mode", &mSettings.view.stereoscopicOptions.enabled); +#if defined(FILAMENT_SAMPLES_STEREO_TYPE_MULTIVIEW) + ImGui::Indent(); + ImGui::Checkbox("Combine Multiview Images", + debug.getPropertyAddress("d.stereo.combine_multiview_images")); + ImGui::Unindent(); +#endif +#endif + ImGui::SliderFloat("Ocular distance", &mSettings.viewer.cameraEyeOcularDistance, 0.0f, + 1.0f); + + float toeInDegrees = mSettings.viewer.cameraEyeToeIn / f::PI * 180.0f; + ImGui::SliderFloat("Toe in", &toeInDegrees, 0.0f, 30.0, "%.3f°"); + mSettings.viewer.cameraEyeToeIn = toeInDegrees / 180.0f * f::PI; + ImGui::Unindent(); } @@ -1000,25 +1123,16 @@ void ViewerGui::updateUserInterface() { // so we can now push them into the Filament View. applySettings(mEngine, mSettings.view, mView); - mView->setSoftShadowOptions(mSettings.lighting.softShadowOptions); - - if (light.enableSunlight) { - mScene->addEntity(mSunlight); - auto sun = lm.getInstance(mSunlight); - lm.setIntensity(sun, light.sunlightIntensity); - lm.setDirection(sun, normalize(light.sunlightDirection)); - lm.setColor(sun, light.sunlightColor); - lm.setShadowCaster(sun, light.enableShadows); - lm.setShadowOptions(sun, light.shadowOptions); - } else { - mScene->remove(mSunlight); - } - - lm.forEachComponent([this, &lm, &light](utils::Entity e, LightManager::Instance ci) { - lm.setShadowOptions(ci, light.shadowOptions); - lm.setShadowCaster(ci, light.enableShadows); + auto lights = utils::FixedCapacityVector::with_capacity(mScene->getEntityCount()); + mScene->forEach([&](utils::Entity entity) { + if (lm.hasComponent(entity)) { + lights.push_back(entity); + } }); + applySettings(mEngine, mSettings.lighting, mIndirectLight, mSunlight, + lights.data(), lights.size(), &lm, mScene, mView); + // TODO(prideout): add support for hierarchy, animation and variant selection in remote mode. To // support these features, we will need to send a message (list of strings) from DebugServer to // the WebSockets client. @@ -1045,18 +1159,20 @@ void ViewerGui::updateUserInterface() { } Animator& animator = *mInstance->getAnimator(); - if (animator.getAnimationCount() > 0 && ImGui::CollapsingHeader("Animation")) { + const size_t animationCount = animator.getAnimationCount(); + if (animationCount > 0 && ImGui::CollapsingHeader("Animation")) { ImGui::Indent(); int selectedAnimation = mCurrentAnimation; - ImGui::RadioButton("Disable", &selectedAnimation, 0); + ImGui::RadioButton("Disable", &selectedAnimation, -1); + ImGui::RadioButton("Apply all animations", &selectedAnimation, animationCount); ImGui::SliderFloat("Cross fade", &mCrossFadeDuration, 0.0f, 2.0f, "%4.2f seconds", ImGuiSliderFlags_AlwaysClamp); - for (size_t i = 0, count = animator.getAnimationCount(); i < count; ++i) { + for (size_t i = 0; i < animationCount; ++i) { std::string label = animator.getAnimationName(i); if (label.empty()) { label = "Unnamed " + std::to_string(i); } - ImGui::RadioButton(label.c_str(), &selectedAnimation, i + 1); + ImGui::RadioButton(label.c_str(), &selectedAnimation, i); } if (selectedAnimation != mCurrentAnimation) { mPreviousAnimation = mCurrentAnimation; @@ -1095,8 +1211,6 @@ void ViewerGui::updateUserInterface() { mSidebarWidth = ImGui::GetWindowWidth(); ImGui::End(); - - updateIndirectLight(); } } // namespace viewer diff --git a/libs/viewer/tests/test_settings.cpp b/libs/viewer/tests/test_settings.cpp index 4bd134c101a..1b078b4c79b 100644 --- a/libs/viewer/tests/test_settings.cpp +++ b/libs/viewer/tests/test_settings.cpp @@ -106,7 +106,6 @@ static const char* JSON_TEST_DEFAULTS = R"TXT( "enabled": false, "strength": 0.10, "resolution": 360, - "anamorphism": 1.0, "levels": 6, "blendMode": "ADD", "threshold": true, diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt index e365ec96c2e..0ff03049a7e 100644 --- a/samples/CMakeLists.txt +++ b/samples/CMakeLists.txt @@ -22,6 +22,7 @@ set(MATERIAL_SRCS materials/bakedTexture.mat materials/pointSprites.mat materials/aoPreview.mat + materials/arrayTexture.mat materials/groundShadow.mat materials/heightfield.mat materials/image.mat @@ -47,13 +48,22 @@ endif() file(MAKE_DIRECTORY ${MATERIAL_DIR}) +set (MATC_FLAGS ${MATC_BASE_FLAGS}) +if (FILAMENT_SAMPLES_STEREO_TYPE STREQUAL "instanced") + set (MATC_FLAGS ${MATC_FLAGS} -PstereoscopicType=instanced) + add_definitions(-DFILAMENT_SAMPLES_STEREO_TYPE_INSTANCED) +elseif (FILAMENT_SAMPLES_STEREO_TYPE STREQUAL "multiview") + set (MATC_FLAGS ${MATC_FLAGS} -PstereoscopicType=multiview) + add_definitions(-DFILAMENT_SAMPLES_STEREO_TYPE_MULTIVIEW) +endif () + foreach (mat_src ${MATERIAL_SRCS}) get_filename_component(localname "${mat_src}" NAME_WE) get_filename_component(fullname "${mat_src}" ABSOLUTE) set(output_path "${MATERIAL_DIR}/${localname}.filamat") add_custom_command( OUTPUT ${output_path} - COMMAND matc ${MATC_BASE_FLAGS} -o ${output_path} ${fullname} + COMMAND matc ${MATC_FLAGS} -o ${output_path} ${fullname} MAIN_DEPENDENCY ${mat_src} DEPENDS matc COMMENT "Compiling material ${mat_src} to ${output_path}" @@ -151,7 +161,7 @@ endfunction() add_mesh("assets/models/monkey/monkey.obj" "suzanne.filamesh") set (COMPRESSION "--compression=uastc") -add_ktxfiles("assets/models/monkey/albedo.png" "albedo.ktx2" "${COMPRESSION}") +add_ktxfiles("assets/models/monkey/color.png" "albedo.ktx2" "${COMPRESSION}") add_ktxfiles("assets/models/monkey/roughness.png" "roughness.ktx2" "${COMPRESSION};--grayscale;--linear") add_ktxfiles("assets/models/monkey/metallic.png" "metallic.ktx2" "${COMPRESSION};--grayscale;--linear") add_ktxfiles("assets/models/monkey/ao.png" "ao.ktx2" "${COMPRESSION};--grayscale;--linear") @@ -206,12 +216,10 @@ target_sources(gltf-demo-resources PRIVATE ${RESGEN_SOURCE}) # ================================================================================================== if (MSVC) - set(COMPILER_FLAGS $<$:/fp:fast>) else() set(COMPILER_FLAGS -Wno-extern-c-compat - $<$>:-Wno-address-of-packed-member> - $<$:-ffast-math>) + $<$>:-Wno-address-of-packed-member>) endif() # ================================================================================================== @@ -224,6 +232,12 @@ function(add_demo NAME) target_link_libraries(${NAME} PRIVATE sample-resources filamentapp) target_compile_options(${NAME} PRIVATE ${COMPILER_FLAGS}) set_target_properties(${NAME} PROPERTIES FOLDER Samples) + + # This is needed after XCode 15.3 + if (APPLE) + set_target_properties(${NAME} PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE) + set_target_properties(${NAME} PROPERTIES INSTALL_RPATH /usr/local/lib) + endif() endfunction() if (NOT ANDROID) @@ -233,8 +247,13 @@ if (NOT ANDROID) add_demo(gltf_viewer) add_demo(gltf_instances) add_demo(heightfield) + add_demo(hellomorphing) add_demo(hellopbr) add_demo(hellotriangle) + add_demo(helloskinning) + add_demo(helloskinningbuffer) + add_demo(helloskinningbuffer_morebones) + add_demo(hellostereo) add_demo(image_viewer) add_demo(lightbulb) add_demo(material_sandbox) @@ -245,6 +264,7 @@ if (NOT ANDROID) add_demo(sample_full_pbr) add_demo(sample_normal_map) add_demo(shadowtest) + add_demo(skinningtest) add_demo(strobecolor) add_demo(suzanne) add_demo(texturedquad) @@ -256,6 +276,7 @@ if (NOT ANDROID) target_link_libraries(gltf_viewer PRIVATE gltf-demo-resources uberarchive gltfio viewer) target_link_libraries(gltf_instances PRIVATE gltf-demo-resources uberarchive gltfio viewer) target_link_libraries(hellopbr PRIVATE filameshio suzanne-resources) + target_link_libraries(hellostereo PRIVATE filameshio suzanne-resources) target_link_libraries(image_viewer PRIVATE viewer imageio) target_link_libraries(multiple_windows PRIVATE filameshio suzanne-resources) target_link_libraries(rendertarget PRIVATE filameshio suzanne-resources) @@ -263,6 +284,12 @@ if (NOT ANDROID) target_link_libraries(sample_normal_map PRIVATE filameshio) target_link_libraries(suzanne PRIVATE filameshio suzanne-resources) + if (FILAMENT_DISABLE_MATOPT) + add_definitions(-DFILAMENT_DISABLE_MATOPT=1) + else() + add_definitions(-DFILAMENT_DISABLE_MATOPT=0) + endif() + # ============================================================================================== # Installation # ============================================================================================== diff --git a/samples/depthtesting.cpp b/samples/depthtesting.cpp index 8b678466761..77fae2233f1 100644 --- a/samples/depthtesting.cpp +++ b/samples/depthtesting.cpp @@ -26,6 +26,8 @@ #include #include +#include + #include #include @@ -48,6 +50,7 @@ struct App { Skybox* skybox; Entity whiteTriangle; Entity colorTriangle; + MaterialInstance::DepthFunc depthFunc; }; struct Vertex { @@ -115,8 +118,11 @@ int main(int argc, char** argv) { .culling(false) .receiveShadows(false) .castShadows(false) + .priority(5) // draw after whiteTriangle. .build(*engine, app.colorTriangle); scene->addEntity(app.colorTriangle); + + app.depthFunc = MaterialInstance::DepthFunc::GE; }; auto cleanup = [&app](Engine* engine, View*, Scene*) { @@ -131,6 +137,17 @@ int main(int argc, char** argv) { utils::EntityManager::get().destroy(app.camera); }; + auto gui = [&app](Engine* engine, View* view) { + int depthFuncSelection = (int) app.depthFunc; + ImGui::Combo("Depth Function", &depthFuncSelection, + "Less or equal\0Greater or equal\0Strictly less than\0" + "Strictly greater than\0Equal\0Not equal\0Always\0Never\0\0"); + if (depthFuncSelection != (int) app.depthFunc) { + app.depthFunc = (MaterialInstance::DepthFunc) depthFuncSelection; + app.mat->getDefaultInstance()->setDepthFunc(app.depthFunc); + } + }; + FilamentApp::get().animate([&app](Engine* engine, View* view, double now) { constexpr float ZOOM = 1.5f; const uint32_t w = view->getViewport().width; @@ -144,7 +161,7 @@ int main(int argc, char** argv) { filament::math::mat4f::rotation(now, filament::math::float3{ 0, 1, 0 })); }); - FilamentApp::get().run(config, setup, cleanup); + FilamentApp::get().run(config, setup, cleanup, gui); return 0; } diff --git a/samples/gltf_viewer.cpp b/samples/gltf_viewer.cpp index abde164a72e..bdde92b0f66 100644 --- a/samples/gltf_viewer.cpp +++ b/samples/gltf_viewer.cpp @@ -41,9 +41,12 @@ #include +#include + #include #include +#include #include #include @@ -53,14 +56,26 @@ #include #include +#include + +#include #include #include +#include #include +#include +#include #include #include "generated/resources/gltf_demo.h" #include "materials/uberarchive.h" +#if FILAMENT_DISABLE_MATOPT +# define OPTIMIZE_MATERIALS false +#else +# define OPTIMIZE_MATERIALS true +#endif + using namespace filament; using namespace filament::math; using namespace filament::viewer; @@ -78,6 +93,7 @@ struct App { ViewerGui* viewer; Config config; Camera* mainCamera; + Entity rootTransformEntity; AssetLoader* assetLoader; FilamentAsset* asset = nullptr; @@ -93,6 +109,8 @@ struct App { bool recomputeAabb = false; bool actualSize = false; + bool originIsFarAway = false; + float originDistance = 1.0f; struct Scene { Entity groundPlane; @@ -110,8 +128,7 @@ struct App { IndexBuffer* fullScreenTriangleIndexBuffer; } scene; - // zero-initialized so that the first time through is always dirty. - ColorGradingSettings lastColorGradingOptions = { 0 }; + ColorGradingSettings lastColorGradingOptions = { .enabled = false }; ColorGrading* colorGrading = nullptr; @@ -122,12 +139,14 @@ struct App { AutomationSpec* automationSpec = nullptr; AutomationEngine* automationEngine = nullptr; + bool screenshot = false; + uint8_t screenshotSeq = 0; }; static const char* DEFAULT_IBL = "assets/ibl/lightroom_14b"; static void printUsage(char* name) { - std::string exec_name(Path(name).getName()); + std::string const exec_name(Path(name).getName()); std::string usage( "SHOWCASE renders the specified glTF file, or a built-in file if none is specified\n" "Usage:\n" @@ -136,7 +155,18 @@ static void printUsage(char* name) { " --help, -h\n" " Prints this message\n\n" " --api, -a\n" - " Specify the backend API: opengl (default), vulkan, or metal\n\n" + " Specify the backend API: " + +// Matches logic in filament/backend/src/PlatformFactory.cpp for Backend::DEFAULT +#if defined(FILAMENT_IOS) || defined(__APPLE__) + "opengl, vulkan, or metal (default)" +#elif defined(FILAMENT_DRIVER_SUPPORTS_VULKAN) + "opengl, vulkan (default), or metal" +#else + "opengl (default), vulkan, or metal" +#endif + "\n\n" + " --feature-level=<1|2|3>, -f <1|2|3>\n" " Specify the feature level to use. The default is the highest supported feature level.\n\n" " --batch=, -b\n" @@ -159,12 +189,19 @@ static void printUsage(char* name) { " Set the camera mode: orbit (default) or flight\n" " Flight mode uses the following controls:\n" " Click and drag the mouse to pan the camera\n" - " Use the scroll weel to adjust movement speed\n" + " Use the scroll wheel to adjust movement speed\n" " W / S: forward / backward\n" " A / D: left / right\n" " E / Q: up / down\n\n" + " --eyes=, -y \n" + " Sets the number of stereoscopic eyes (default: 2) when stereoscopic rendering is\n" + " enabled.\n\n" " --split-view, -v\n" - " Splits the window into 4 views\n" + " Splits the window into 4 views\n\n" + " --vulkan-gpu-hint=, -g\n" + " Vulkan backend allows user to choose their GPU.\n" + " You can provide the index of the GPU or\n" + " a substring to match against the device name\n\n" ); const std::string from("SHOWCASE"); for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) { @@ -179,26 +216,28 @@ static std::ifstream::pos_type getFileSize(const char* filename) { } static int handleCommandLineArguments(int argc, char* argv[], App* app) { - static constexpr const char* OPTSTR = "ha:f:i:usc:rt:b:ev"; + static constexpr const char* OPTSTR = "ha:f:i:usc:rt:b:evg:"; static const struct option OPTIONS[] = { - { "help", no_argument, nullptr, 'h' }, - { "api", required_argument, nullptr, 'a' }, - { "feature-level",required_argument, nullptr, 'f' }, - { "batch", required_argument, nullptr, 'b' }, - { "headless", no_argument, nullptr, 'e' }, - { "ibl", required_argument, nullptr, 'i' }, - { "ubershader", no_argument, nullptr, 'u' }, - { "actual-size", no_argument, nullptr, 's' }, - { "camera", required_argument, nullptr, 'c' }, - { "recompute-aabb", no_argument, nullptr, 'r' }, - { "settings", required_argument, nullptr, 't' }, - { "split-view", no_argument, nullptr, 'v' }, + { "help", no_argument, nullptr, 'h' }, + { "api", required_argument, nullptr, 'a' }, + { "feature-level", required_argument, nullptr, 'f' }, + { "batch", required_argument, nullptr, 'b' }, + { "headless", no_argument, nullptr, 'e' }, + { "ibl", required_argument, nullptr, 'i' }, + { "ubershader", no_argument, nullptr, 'u' }, + { "actual-size", no_argument, nullptr, 's' }, + { "camera", required_argument, nullptr, 'c' }, + { "eyes", required_argument, nullptr, 'y' }, + { "recompute-aabb", no_argument, nullptr, 'r' }, + { "settings", required_argument, nullptr, 't' }, + { "split-view", no_argument, nullptr, 'v' }, + { "vulkan-gpu-hint", required_argument, nullptr, 'g' }, { nullptr, 0, nullptr, 0 } }; int opt; int option_index = 0; while ((opt = getopt_long(argc, argv, OPTSTR, OPTIONS, &option_index)) >= 0) { - std::string arg(optarg ? optarg : ""); + std::string const arg(optarg ? optarg : ""); switch (opt) { default: case 'h': @@ -235,6 +274,19 @@ static int handleCommandLineArguments(int argc, char* argv[], App* app) { std::cerr << "Unrecognized camera mode. Must be 'flight'|'orbit'.\n"; } break; + case 'y': { + int eyeCount = 0; + try { + eyeCount = std::stoi(arg); + } catch (std::invalid_argument &e) { } + if (eyeCount >= 1 && eyeCount <= CONFIG_MAX_STEREOSCOPIC_EYES) { + app->config.stereoscopicEyeCount = eyeCount; + } else { + std::cerr << "Eye count must be between 1 and CONFIG_MAX_STEREOSCOPIC_EYES (" + << (int) CONFIG_MAX_STEREOSCOPIC_EYES << ") (inclusive).\n"; + } + break; + } case 'e': app->config.headless = true; break; @@ -261,6 +313,10 @@ static int handleCommandLineArguments(int argc, char* argv[], App* app) { app->config.splitView = true; break; } + case 'g': { + app->config.vulkanGPUHint = arg; + break; + } } } if (app->config.headless && app->batchFile.empty()) { @@ -298,7 +354,7 @@ static void createGroundPlane(Engine* engine, Scene* scene, App& app) { Aabb aabb = app.asset->getBoundingBox(); if (!app.actualSize) { - mat4f transform = fitIntoUnitCube(aabb, 4); + mat4f const transform = fitIntoUnitCube(aabb, 4); aabb = aabb.transform(transform); } @@ -311,7 +367,7 @@ static void createGroundPlane(Engine* engine, Scene* scene, App& app) { { planeExtent.x, 0, -planeExtent.z }, }; - short4 tbn = packSnorm16( + short4 const tbn = packSnorm16( mat3f::packTangentFrame( mat3f{ float3{ 1.0f, 0.0f, 0.0f }, @@ -344,7 +400,7 @@ static void createGroundPlane(Engine* engine, Scene* scene, App& app) { indexBuffer->setBuffer(*engine, IndexBuffer::BufferDescriptor( indices, indexBuffer->getIndexCount() * sizeof(uint32_t))); - Entity groundPlane = em.create(); + Entity const groundPlane = em.create(); RenderableManager::Builder(1) .boundingBox({ {}, { planeExtent.x, 1e-4f, planeExtent.z } @@ -457,40 +513,106 @@ static void onClick(App& app, View* view, ImVec2 pos) { }); } +static utils::Path getPathForIBLAsset(std::string_view string) { + auto isIBL = [] (utils::Path file) -> bool { + return file.getExtension() == "ktx" || file.getExtension() == "hdr" || + file.getExtension() == "exr"; + + }; + + utils::Path filename{ string }; + if (!filename.exists()) { + std::cerr << "file " << filename << " not found!" << std::endl; + return {}; + } + + if (filename.isDirectory()) { + std::vector files = filename.listContents(); + if (std::none_of(files.cbegin(), files.cend(), isIBL)) { + return {}; + } + } else if (!isIBL(filename)) { + return {}; + } + + return filename; +} + +static utils::Path getPathForGLTFAsset(std::string_view string) { + auto isGLTF = [] (utils::Path file) -> bool { + return file.getExtension() == "gltf" || file.getExtension() == "glb"; + }; + + utils::Path filename{ string }; + if (!filename.exists()) { + std::cerr << "file " << filename << " not found!" << std::endl; + return {}; + } + + if (filename.isDirectory()) { + std::vector files = filename.listContents(); + auto it = std::find_if(files.cbegin(), files.cend(), isGLTF); + if (it == files.end()) { + return {}; + } + filename = *it; + } else if (!isGLTF(filename)) { + return {}; + } + + return filename; +} + +static bool checkGLTFAsset(const utils::Path& filename) { + // Peek at the file size to allow pre-allocation. + long const contentSize = static_cast(getFileSize(filename.c_str())); + if (contentSize <= 0) { + std::cerr << "Unable to open " << filename << std::endl; + return false; + } + + // Consume the glTF file. + std::ifstream in(filename.c_str(), std::ifstream::binary | std::ifstream::in); + std::vector buffer(static_cast(contentSize)); + if (!in.read((char*) buffer.data(), contentSize)) { + std::cerr << "Unable to read " << filename << std::endl; + return false; + } + + // Try parsing the glTF file to check the validity of the file format. + cgltf_options options{}; + cgltf_data* sourceAsset = nullptr; + cgltf_result result = cgltf_parse(&options, buffer.data(), contentSize, &sourceAsset); + cgltf_free(sourceAsset); + if (result != cgltf_result_success) { + slog.e << "Unable to parse glTF file." << io::endl; + return false; + } + return true; +}; + + int main(int argc, char** argv) { App app; app.config.title = "Filament"; app.config.iblDirectory = FilamentApp::getRootAssetsPath() + DEFAULT_IBL; - int optionIndex = handleCommandLineArguments(argc, argv, &app); + int const optionIndex = handleCommandLineArguments(argc, argv, &app); utils::Path filename; - int num_args = argc - optionIndex; + int const num_args = argc - optionIndex; if (num_args >= 1) { - filename = argv[optionIndex]; - if (!filename.exists()) { - std::cerr << "file " << filename << " not found!" << std::endl; + filename = getPathForGLTFAsset(argv[optionIndex]); + if (filename.isEmpty()) { + std::cerr << "no glTF file found in " << filename << std::endl; return 1; } - if (filename.isDirectory()) { - auto files = filename.listContents(); - for (auto file : files) { - if (file.getExtension() == "gltf" || file.getExtension() == "glb") { - filename = file; - break; - } - } - if (filename.isDirectory()) { - std::cerr << "no glTF file found in " << filename << std::endl; - return 1; - } - } } - auto loadAsset = [&app](utils::Path filename) { + auto loadAsset = [&app](const utils::Path& filename) { // Peek at the file size to allow pre-allocation. - long contentSize = static_cast(getFileSize(filename.c_str())); + long const contentSize = static_cast(getFileSize(filename.c_str())); if (contentSize <= 0) { std::cerr << "Unable to open " << filename << std::endl; exit(1); @@ -506,19 +628,62 @@ int main(int argc, char** argv) { // Parse the glTF file and create Filament entities. app.asset = app.assetLoader->createAsset(buffer.data(), buffer.size()); + if (!app.asset) { + std::cerr << "Unable to parse " << filename << std::endl; + exit(1); + } + + // pre-compile all material variants + std::set materials; + RenderableManager const& rcm = app.engine->getRenderableManager(); + Slice const renderables{ + app.asset->getRenderableEntities(), app.asset->getRenderableEntityCount() }; + for (Entity const e: renderables) { + auto ri = rcm.getInstance(e); + size_t const c = rcm.getPrimitiveCount(ri); + for (size_t i = 0; i < c; i++) { + MaterialInstance* const mi = rcm.getMaterialInstanceAt(ri, i); + Material* ma = const_cast(mi->getMaterial()); + materials.insert(ma); + } + } + for (Material* ma : materials) { + // Don't attempt to precompile shaders on WebGL. + // Chrome already suffers from slow shader compilation: + // https://github.com/google/filament/issues/6615 + // Precompiling shaders exacerbates the problem. +#if !defined(__EMSCRIPTEN__) + // First compile high priority variants + ma->compile(Material::CompilerPriorityQueue::HIGH, + UserVariantFilterBit::DIRECTIONAL_LIGHTING | + UserVariantFilterBit::DYNAMIC_LIGHTING | + UserVariantFilterBit::SHADOW_RECEIVER); + + // and then, everything else at low priority, except STE, which is very uncommon. + ma->compile(Material::CompilerPriorityQueue::LOW, + UserVariantFilterBit::FOG | + UserVariantFilterBit::SKINNING | + UserVariantFilterBit::SSR | + UserVariantFilterBit::VSM); +#endif + } + app.instance = app.asset->getInstance(); buffer.clear(); buffer.shrink_to_fit(); + }; - if (!app.asset) { - std::cerr << "Unable to parse " << filename << std::endl; - exit(1); + auto setupIBL = [&app]() { + auto ibl = FilamentApp::get().getIBL(); + if (ibl) { + app.viewer->setIndirectLight(ibl->getIndirectLight(), ibl->getSphericalHarmonics()); + app.viewer->getSettings().view.fogSettings.fogColorTexture = ibl->getFogTexture(); } }; - auto loadResources = [&app] (utils::Path filename) { + auto loadResources = [&app, &setupIBL] (const utils::Path& filename) { // Load external textures and buffers. - std::string gltfPath = filename.getAbsolutePath(); + std::string const gltfPath = filename.getAbsolutePath(); ResourceConfiguration configuration = {}; configuration.engine = app.engine; configuration.gltfPath = gltfPath.c_str(); @@ -531,6 +696,8 @@ int main(int argc, char** argv) { app.resourceLoader->addTextureProvider("image/png", app.stbDecoder); app.resourceLoader->addTextureProvider("image/jpeg", app.stbDecoder); app.resourceLoader->addTextureProvider("image/ktx2", app.ktxDecoder); + } else { + app.resourceLoader->setConfiguration(configuration); } if (!app.resourceLoader->asyncBeginLoad(app.asset)) { @@ -551,11 +718,7 @@ int main(int argc, char** argv) { instances[mi]->setStencilWrite(true); instances[mi]->setStencilOpDepthStencilPass(MaterialInstance::StencilOperation::INCR); } - - auto ibl = FilamentApp::get().getIBL(); - if (ibl) { - app.viewer->setIndirectLight(ibl->getIndirectLight(), ibl->getSphericalHarmonics()); - } + setupIBL(); }; auto setup = [&](Engine* engine, View* view, Scene* scene) { @@ -564,6 +727,12 @@ int main(int argc, char** argv) { app.viewer = new ViewerGui(engine, scene, view, 410); app.viewer->getSettings().viewer.autoScaleEnabled = !app.actualSize; + engine->enableAccurateTranslations(); + auto& tcm = engine->getTransformManager(); + app.rootTransformEntity = engine->getEntityManager().create(); + tcm.create(app.rootTransformEntity); + tcm.create(view->getFogEntity()); + const bool batchMode = !app.batchFile.empty(); // First check if a custom automation spec has been provided. If it fails to load, the app @@ -602,8 +771,8 @@ int main(int argc, char** argv) { app.viewer->stopAnimation(); } - if (app.settingsFile.size() > 0) { - bool success = loadSettings(app.settingsFile.c_str(), &app.viewer->getSettings()); + if (!app.settingsFile.empty()) { + bool const success = loadSettings(app.settingsFile.c_str(), &app.viewer->getSettings()); if (success) { std::cout << "Loaded settings from " << app.settingsFile << std::endl; } else { @@ -611,7 +780,8 @@ int main(int argc, char** argv) { } } - app.materials = (app.materialSource == JITSHADER) ? createJitShaderProvider(engine) : + app.materials = (app.materialSource == JITSHADER) ? + createJitShaderProvider(engine, OPTIMIZE_MATERIALS) : createUbershaderProvider(engine, UBERARCHIVE_DEFAULT_DATA, UBERARCHIVE_DEFAULT_SIZE); app.assetLoader = AssetLoader::create({engine, app.materials, app.names }); @@ -652,7 +822,7 @@ int main(int argc, char** argv) { ImGui::Spacing(); } - float progress = app.resourceLoader->asyncGetLoadProgress(); + float const progress = app.resourceLoader->asyncGetLoadProgress(); if (progress < 1.0) { ImGui::ProgressBar(progress); } else { @@ -699,7 +869,7 @@ int main(int argc, char** argv) { } if (ImGui::Button("Export view settings")) { - automation.exportSettings(app.viewer->getSettings(), "settings.json"); + AutomationEngine::exportSettings(app.viewer->getSettings(), "settings.json"); app.messageBoxText = automation.getStatusMessage(); ImGui::OpenPopup("MessageBox"); } @@ -716,13 +886,69 @@ int main(int argc, char** argv) { if (ImGui::CollapsingHeader("Debug")) { auto& debug = engine->getDebugRegistry(); - if (ImGui::Button("Capture frame")) { - bool* captureFrame = - debug.getPropertyAddress("d.renderer.doFrameCapture"); - *captureFrame = true; + if (engine->getBackend() == Engine::Backend::METAL) { + if (ImGui::Button("Capture frame")) { + bool* captureFrame = + debug.getPropertyAddress("d.renderer.doFrameCapture"); + *captureFrame = true; + } + } + if (ImGui::Button("Screenshot")) { + app.screenshot = true; + } + ImGui::Checkbox("Disable buffer padding", + debug.getPropertyAddress("d.renderer.disable_buffer_padding")); + ImGui::Checkbox("Disable sub-passes", + debug.getPropertyAddress("d.renderer.disable_subpasses")); + ImGui::Checkbox("Camera at origin", + debug.getPropertyAddress("d.view.camera_at_origin")); + ImGui::Checkbox("Far Origin", &app.originIsFarAway); + ImGui::SliderFloat("Origin", &app.originDistance, 0, 1); + ImGui::Checkbox("Far uses shadow casters", + debug.getPropertyAddress("d.shadowmap.far_uses_shadowcasters")); + ImGui::Checkbox("Focus shadow casters", + debug.getPropertyAddress("d.shadowmap.focus_shadowcasters")); + ImGui::Checkbox("Disable light frustum alignment", + debug.getPropertyAddress("d.shadowmap.disable_light_frustum_align")); + ImGui::Checkbox("Depth clamp", + debug.getPropertyAddress("d.shadowmap.depth_clamp")); + + bool debugDirectionalShadowmap; + if (debug.getProperty("d.shadowmap.debug_directional_shadowmap", + &debugDirectionalShadowmap)) { + ImGui::Checkbox("Debug DIR shadowmap", &debugDirectionalShadowmap); + debug.setProperty("d.shadowmap.debug_directional_shadowmap", + debugDirectionalShadowmap); } - ImGui::Checkbox("Disable buffer padding", debug.getPropertyAddress("d.renderer.disable_buffer_padding")); - ImGui::Checkbox("Camera at origin", debug.getPropertyAddress("d.view.camera_at_origin")); + + ImGui::Checkbox("Display Shadow Texture", + debug.getPropertyAddress("d.shadowmap.display_shadow_texture")); + if (*debug.getPropertyAddress("d.shadowmap.display_shadow_texture")) { + int layerCount; + int levelCount; + debug.getProperty("d.shadowmap.display_shadow_texture_layer_count", &layerCount); + debug.getProperty("d.shadowmap.display_shadow_texture_level_count", &levelCount); + ImGui::Indent(); + ImGui::SliderFloat("scale", debug.getPropertyAddress( + "d.shadowmap.display_shadow_texture_scale"), 0.0f, 8.0f); + ImGui::SliderFloat("contrast", debug.getPropertyAddress( + "d.shadowmap.display_shadow_texture_power"), 0.0f, 2.0f); + ImGui::SliderInt("layer", debug.getPropertyAddress( + "d.shadowmap.display_shadow_texture_layer"), 0, layerCount - 1); + ImGui::SliderInt("level", debug.getPropertyAddress( + "d.shadowmap.display_shadow_texture_level"), 0, levelCount - 1); + ImGui::SliderInt("channel", debug.getPropertyAddress( + "d.shadowmap.display_shadow_texture_channel"), 0, 3); + ImGui::Unindent(); + } + bool debugFroxelVisualization; + if (debug.getProperty("d.lighting.debug_froxel_visualization", + &debugFroxelVisualization)) { + ImGui::Checkbox("Froxel Visualization", &debugFroxelVisualization); + debug.setProperty("d.lighting.debug_froxel_visualization", + debugFroxelVisualization); + } + auto dataSource = debug.getDataSource("d.view.frame_info"); if (dataSource.data) { ImGuiExt::PlotLinesSeries("FrameInfo", 6, @@ -775,7 +1001,7 @@ int main(int argc, char** argv) { view->setStencilBufferEnabled(visualizeOverdraw); } - if (ImGui::BeginPopupModal("MessageBox", NULL, ImGuiWindowFlags_AlwaysAutoResize)) { + if (ImGui::BeginPopupModal("MessageBox", nullptr, ImGuiWindowFlags_AlwaysAutoResize)) { ImGui::Text("%s", app.messageBoxText.c_str()); if (ImGui::Button("OK", ImVec2(120, 0))) { ImGui::CloseCurrentPopup(); @@ -817,11 +1043,13 @@ int main(int argc, char** argv) { delete app.resourceLoader; delete app.stbDecoder; delete app.ktxDecoder; + delete app.automationSpec; + delete app.automationEngine; AssetLoader::destroy(&app.assetLoader); }; - auto animate = [&app](Engine* engine, View* view, double now) { + auto animate = [&app](Engine*, View*, double now) { app.resourceLoader->asyncUpdateLoad(); // Optionally fit the model into a unit cube at the origin. @@ -833,7 +1061,7 @@ int main(int argc, char** argv) { app.viewer->applyAnimation(now); }; - auto resize = [&app](Engine* engine, View* view) { + auto resize = [&app](Engine*, View* view) { Camera& camera = view->getCamera(); if (&camera == app.mainCamera) { // Don't adjust the aspect ratio of the main camera, this is done inside of @@ -841,11 +1069,11 @@ int main(int argc, char** argv) { return; } const Viewport& vp = view->getViewport(); - double aspectRatio = (double) vp.width / vp.height; + double const aspectRatio = (double) vp.width / vp.height; camera.setScaling({1.0 / aspectRatio, 1.0 }); }; - auto gui = [&app](Engine* engine, View* view) { + auto gui = [&app](Engine*, View*) { app.viewer->updateUserInterface(); FilamentApp::get().setSidebarWidth(app.viewer->getSidebarWidth()); @@ -855,7 +1083,6 @@ int main(int argc, char** argv) { auto& rcm = engine->getRenderableManager(); auto instance = rcm.getInstance(app.scene.groundPlane); const auto viewerOptions = app.automationEngine->getViewerOptions(); - const auto& dofOptions = app.viewer->getSettings().view.dof; rcm.setLayerMask(instance, 0xff, viewerOptions.groundPlaneEnabled ? 0xff : 0x00); @@ -863,7 +1090,8 @@ int main(int argc, char** argv) { // Note that this focal length might be different from the slider value because the // automation engine applies Camera::computeEffectiveFocalLength when DoF is enabled. - FilamentApp::get().getCameraFocalLength() = viewerOptions.cameraFocalLength; + FilamentApp::get().setCameraFocalLength(viewerOptions.cameraFocalLength); + FilamentApp::get().setCameraNearFar(viewerOptions.cameraNear, viewerOptions.cameraFar); const size_t cameraCount = app.asset->getCameraEntityCount(); view->setCamera(app.mainCamera); @@ -878,10 +1106,17 @@ int main(int argc, char** argv) { // Override the aspect ratio in the glTF file and adjust the aspect ratio of this // camera to the viewport. const Viewport& vp = view->getViewport(); - double aspectRatio = (double) vp.width / vp.height; + double const aspectRatio = (double) vp.width / vp.height; camera->setScaling({1.0 / aspectRatio, 1.0}); } + static bool stereoscopicEnabled = false; + if (stereoscopicEnabled != view->getStereoscopicOptions().enabled) { + // Stereo was turned on/off. + FilamentApp::get().reconfigureCameras(); + stereoscopicEnabled = view->getStereoscopicOptions().enabled; + } + app.scene.groundMaterial->setDefaultParameter( "strength", viewerOptions.groundShadowStrength); @@ -890,8 +1125,21 @@ int main(int argc, char** argv) { Skybox* skybox = scene->getSkybox(); applySettings(engine, app.viewer->getSettings().viewer, &camera, skybox, renderer); + // technically we don't need to do this each frame + auto& tcm = engine->getTransformManager(); + TransformManager::Instance const& root = tcm.getInstance(app.rootTransformEntity); + tcm.setParent(tcm.getInstance(camera.getEntity()), root); + tcm.setParent(tcm.getInstance(app.asset->getRoot()), root); + tcm.setParent(tcm.getInstance(view->getFogEntity()), root); + + // these values represent a point somewhere on Earth's surface + float const d = app.originIsFarAway ? app.originDistance : 0.0f; +// tcm.setTransform(root, mat4::translation(double3{ 67.0, -6366759.0, -21552.0 } * d)); + tcm.setTransform(root, mat4::translation( + double3{ 2304097.1410110965, -4688442.9915525438, -3639452.5611694567 } * d)); + // Check if color grading has changed. - ColorGradingSettings& options = app.viewer->getSettings().view.colorGrading; + ColorGradingSettings const& options = app.viewer->getSettings().view.colorGrading; if (options.enabled) { if (options != app.lastColorGradingOptions) { ColorGrading *colorGrading = createColorGrading(options, engine); @@ -905,12 +1153,20 @@ int main(int argc, char** argv) { } }; - auto postRender = [&app](Engine* engine, View* view, Scene* scene, Renderer* renderer) { + auto postRender = [&app](Engine* engine, View* view, Scene*, Renderer* renderer) { + if (app.screenshot) { + std::ostringstream stringStream; + stringStream << "screenshot" << std::setfill('0') << std::setw(2) << +app.screenshotSeq; + AutomationEngine::exportScreenshot( + view, renderer, stringStream.str() + ".ppm", false, app.automationEngine); + ++app.screenshotSeq; + app.screenshot = false; + } if (app.automationEngine->shouldClose()) { FilamentApp::get().close(); return; } - AutomationEngine::ViewerContent content = { + AutomationEngine::ViewerContent const content = { .view = view, .renderer = renderer, .materials = app.instance->getMaterialInstances(), @@ -923,14 +1179,26 @@ int main(int argc, char** argv) { filamentApp.animate(animate); filamentApp.resize(resize); - filamentApp.setDropHandler([&] (std::string_view path) { - app.resourceLoader->asyncCancelLoad(); - app.resourceLoader->evictResourceData(); - app.viewer->removeAsset(); - app.assetLoader->destroyAsset(app.asset); - loadAsset(path); - loadResources(path); - app.viewer->setAsset(app.asset, app.instance); + filamentApp.setDropHandler([&](std::string_view path) { + utils::Path filename = getPathForGLTFAsset(path); + if (!filename.isEmpty()) { + if (checkGLTFAsset(filename)) { + app.resourceLoader->asyncCancelLoad(); + app.resourceLoader->evictResourceData(); + app.viewer->removeAsset(); + app.assetLoader->destroyAsset(app.asset); + loadAsset(filename); + loadResources(filename); + app.viewer->setAsset(app.asset, app.instance); + } + return; + } + + filename = getPathForIBLAsset(path); + if (!filename.isEmpty()) { + FilamentApp::get().loadIBL(path); + setupIBL(); + } }); filamentApp.run(app.config, setup, cleanup, gui, preRender, postRender); diff --git a/samples/hellomorphing.cpp b/samples/hellomorphing.cpp new file mode 100644 index 00000000000..54ce244984f --- /dev/null +++ b/samples/hellomorphing.cpp @@ -0,0 +1,247 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include + +#include +#include + +#include "generated/resources/resources.h" + +using namespace filament; +using utils::Entity; +using utils::EntityManager; +using utils::Path; +using namespace filament::math; + +struct App { + VertexBuffer* vb; + IndexBuffer* ib; + Material* mat; + Camera* cam; + Entity camera; + Skybox* skybox; + Entity renderable; + MorphTargetBuffer *mt1; +}; + +struct Vertex { + float2 position; + uint32_t color; +}; + +static const Vertex TRIANGLE_VERTICES[3] = { + {{1, 0}, 0xffff0000u}, // blue one (ABGR) + {{cos(M_PI * 2 / 3), sin(M_PI * 2 / 3)}, 0xff00ff00u}, // green one + {{cos(M_PI * 4 / 3), sin(M_PI * 4 / 3)}, 0xff0000ffu}, // red one +}; + +static const float3 targets_pos1[9] = { + {-2, 0, 0},{0, 2, 0},{1, 0, 0}, // 1st position for 1st, 2nd and 3rd point of the first primitive + {1, 1, 0},{-1, 0, 0},{-1, 0, 0}, // 2nd ... + {0, 0, 0},{0, 0, 0},{0, 0, 0} // no position change +}; + +static const float3 targets_pos2[9] = { + {0, 2, 0},{-2, 0, 0},{1, 0, 0}, // 1st position for 1st, 2nd and 3rd point of the second primitive + {-1, 0, 0},{1, 1, 0},{-1, 0, 0}, // position of th 3rd point is same for both morph targets + {0, 0, 0},{0, 0, 0}, {0, 0, 0} +}; + +static const short4 targets_tan[9] = { + {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} +}; + +static constexpr uint16_t TRIANGLE_INDICES[3] = { 0, 1, 2 }; + +static void printUsage(char* name) { + std::string exec_name(Path(name).getName()); + std::string usage( + "SAMPLE is a command-line tool for testing Filament skinning buffers.\n" + "Usage:\n" + " SAMPLE [options]\n" + "Options:\n" + " --help, -h\n" + " Prints this message\n\n" + " --api, -a\n" + " Specify the backend API: opengl (default), vulkan, or metal\n\n" + ); + const std::string from("SAMPLE"); + for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) { + usage.replace(pos, from.length(), exec_name); + } + std::cout << usage; +} + +static int handleCommandLineArgments(int argc, char* argv[], Config* config) { + static constexpr const char* OPTSTR = "ha:"; + static const struct option OPTIONS[] = { + { "help", no_argument, nullptr, 'h' }, + { "api", required_argument, nullptr, 'a' }, + { nullptr, 0, nullptr, 0 } // termination of the option list + }; + int opt; + int option_index = 0; + while ((opt = getopt_long(argc, argv, OPTSTR, OPTIONS, &option_index)) >= 0) { + std::string arg(optarg != nullptr ? optarg : ""); + switch (opt) { + default: + case 'h': + printUsage(argv[0]); + exit(0); + case 'a': + if (arg == "opengl") { + config->backend = Engine::Backend::OPENGL; + } else if (arg == "vulkan") { + config->backend = Engine::Backend::VULKAN; + } else if (arg == "metal") { + config->backend = Engine::Backend::METAL; + } else { + std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'." + << std::endl; + } + break; + } + } + + return optind; +} + +int main(int argc, char** argv) { + Config config; + config.title = "helloMorphing"; + + handleCommandLineArgments(argc, argv, &config); + + App app; + auto setup = [&app](Engine* engine, View* view, Scene* scene) { + app.skybox = Skybox::Builder().color({0.1, 0.125, 0.25, 1.0}).build(*engine); + + scene->setSkybox(app.skybox); + view->setPostProcessingEnabled(false); + static_assert(sizeof(Vertex) == 12, "Strange vertex size."); + app.vb = VertexBuffer::Builder() + .vertexCount(3) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT2, 0, 12) + .attribute(VertexAttribute::COLOR, 0, VertexBuffer::AttributeType::UBYTE4, 8, 12) + .normalized(VertexAttribute::COLOR) + .build(*engine); + app.vb->setBufferAt(*engine, 0, + VertexBuffer::BufferDescriptor(TRIANGLE_VERTICES, 36, nullptr)); + app.ib = IndexBuffer::Builder() + .indexCount(3) + .bufferType(IndexBuffer::IndexType::USHORT) + .build(*engine); + app.ib->setBuffer(*engine, + IndexBuffer::BufferDescriptor(TRIANGLE_INDICES, 6, nullptr)); + app.mat = Material::Builder() + .package(RESOURCES_BAKEDCOLOR_DATA, RESOURCES_BAKEDCOLOR_SIZE) + .build(*engine); + + app.mt1 = MorphTargetBuffer::Builder() + .vertexCount(9 * 2) + .count(3) + .build(*engine); + + app.mt1->setPositionsAt(*engine,0, targets_pos1, 3, 0); + app.mt1->setPositionsAt(*engine,1, targets_pos1+3, 3, 0); + app.mt1->setPositionsAt(*engine,2, targets_pos1+6, 3, 0); + app.mt1->setTangentsAt(*engine,0, targets_tan, 3, 0); + app.mt1->setTangentsAt(*engine,1, targets_tan+3, 3, 0); + app.mt1->setTangentsAt(*engine,2, targets_tan+6, 3, 0); + + app.mt1->setPositionsAt(*engine,0, targets_pos2, 3, 9); + app.mt1->setPositionsAt(*engine,1, targets_pos2+3, 3, 9); + app.mt1->setPositionsAt(*engine,2, targets_pos2+6, 3, 9); + app.mt1->setTangentsAt(*engine,0, targets_tan, 3, 9); + app.mt1->setTangentsAt(*engine,1, targets_tan+3, 3, 9); + app.mt1->setTangentsAt(*engine,2, targets_tan+6, 3, 9); + + app.renderable = EntityManager::get().create(); + + RenderableManager::Builder(2) + .boundingBox({{ -1, -1, -1 }, { 1, 1, 1 }}) + .material(0, app.mat->getDefaultInstance()) + .material(1, app.mat->getDefaultInstance()) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, app.vb, app.ib, 0, 3) + .geometry(1, RenderableManager::PrimitiveType::TRIANGLES, app.vb, app.ib, 0, 3) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .morphing(app.mt1) + .morphing(0, 0, 0) + .morphing(0, 1, 9) + .build(*engine, app.renderable); + + scene->addEntity(app.renderable); + app.camera = utils::EntityManager::get().create(); + app.cam = engine->createCamera(app.camera); + view->setCamera(app.cam); + }; + + auto cleanup = [&app](Engine* engine, View*, Scene*) { + engine->destroy(app.skybox); + engine->destroy(app.renderable); + engine->destroy(app.mat); + engine->destroy(app.vb); + engine->destroy(app.ib); + engine->destroy(app.mt1); + engine->destroyCameraComponent(app.camera); + utils::EntityManager::get().destroy(app.camera); + }; + + FilamentApp::get().animate([&app](Engine* engine, View* view, double now) { + constexpr float ZOOM = 1.5f; + const uint32_t w = view->getViewport().width; + const uint32_t h = view->getViewport().height; + const float aspect = (float) w / h; + app.cam->setProjection(Camera::Projection::ORTHO, + -aspect * ZOOM, aspect * ZOOM, + -ZOOM, ZOOM, 0, 1); + + auto& rm = engine->getRenderableManager(); + // morphTarget/blendshapes animation defined for all primitives + float z = (float)(sin(now)/2.f + 0.5f); + float weights[] = {1 - z, z/2, z/2}; + // set global weights of all morph targets + rm.setMorphWeights(rm.getInstance(app.renderable), weights, 3, 0); + }); + + FilamentApp::get().run(config, setup, cleanup); + + return 0; +} diff --git a/samples/hellopbr.cpp b/samples/hellopbr.cpp index c38eca6dbbc..f5cae37706e 100644 --- a/samples/hellopbr.cpp +++ b/samples/hellopbr.cpp @@ -29,6 +29,10 @@ #include #include +#include + +#include + #include "generated/resources/resources.h" #include "generated/resources/monkey.h" @@ -39,6 +43,7 @@ using namespace filament::math; using Backend = Engine::Backend; struct App { + Config config; utils::Entity light; Material* material; MaterialInstance* materialInstance; @@ -48,13 +53,65 @@ struct App { static const char* IBL_FOLDER = "assets/ibl/lightroom_14b"; -int main(int argc, char** argv) { - Config config; - config.title = "hellopbr"; - config.iblDirectory = FilamentApp::getRootAssetsPath() + IBL_FOLDER; +static void printUsage(char* name) { + std::string exec_name(utils::Path(name).getName()); + std::string usage( + "EXEC renders a simple PBR example\n" + "Usage:\n" + " EXEC [options]\n" + "Options:\n" + " --help, -h\n" + " Prints this message\n\n" + " --api, -a\n" + " Specify the backend API: opengl, vulkan, or metal\n" + ); + const std::string from("EXEC"); + for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) { + usage.replace(pos, from.length(), exec_name); + } + std::cout << usage; +} +static int handleCommandLineArguments(int argc, char* argv[], App* app) { + static constexpr const char* OPTSTR = "ha:"; + static const struct option OPTIONS[] = { + { "help", no_argument, nullptr, 'h' }, + { "api", required_argument, nullptr, 'a' }, + { nullptr, 0, nullptr, 0 } + }; + int opt; + int option_index = 0; + while ((opt = getopt_long(argc, argv, OPTSTR, OPTIONS, &option_index)) >= 0) { + std::string arg(optarg ? optarg : ""); + switch (opt) { + default: + case 'h': + printUsage(argv[0]); + exit(0); + case 'a': + if (arg == "opengl") { + app->config.backend = Engine::Backend::OPENGL; + } else if (arg == "vulkan") { + app->config.backend = Engine::Backend::VULKAN; + } else if (arg == "metal") { + app->config.backend = Engine::Backend::METAL; + } else { + std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'.\n"; + exit(1); + } + break; + } + } + return optind; +} + +int main(int argc, char** argv) { App app; - auto setup = [config, &app](Engine* engine, View* view, Scene* scene) { + app.config.title = "hellopbr"; + app.config.iblDirectory = FilamentApp::getRootAssetsPath() + IBL_FOLDER; + handleCommandLineArguments(argc, argv, &app); + + auto setup = [config=app.config, &app](Engine* engine, View* view, Scene* scene) { auto& tcm = engine->getTransformManager(); auto& rcm = engine->getRenderableManager(); auto& em = utils::EntityManager::get(); @@ -100,7 +157,7 @@ int main(int argc, char** argv) { tcm.setTransform(ti, app.transform * mat4f::rotation(now, float3{ 0, 1, 0 })); }); - FilamentApp::get().run(config, setup, cleanup); + FilamentApp::get().run(app.config, setup, cleanup); return 0; } diff --git a/samples/helloskinning.cpp b/samples/helloskinning.cpp new file mode 100644 index 00000000000..f3d50464a0d --- /dev/null +++ b/samples/helloskinning.cpp @@ -0,0 +1,237 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include + +#include + +#include "generated/resources/resources.h" + +using namespace filament; +using utils::Entity; +using utils::EntityManager; +using utils::Path; +using namespace filament::math; + +struct App { + VertexBuffer* vb; + VertexBuffer* vb2; + IndexBuffer* ib; + Material* mat; + Camera* cam; + Entity camera; + Skybox* skybox; + Entity renderable; +}; + +struct VertexWithBones { + float2 position; + uint32_t color; + filament::math::ushort4 joints; + filament::math::float4 weighs; +}; + +static void printUsage(char* name) { + std::string exec_name(Path(name).getName()); + std::string usage( + "SAMPLE is a command-line tool for testing Filament skinning.\n" + "Usage:\n" + " SAMPLE [options]\n" + "Options:\n" + " --help, -h\n" + " Prints this message\n\n" + " --api, -a\n" + " Specify the backend API: opengl (default), vulkan, or metal\n\n" + ); + const std::string from("SAMPLE"); + for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) { + usage.replace(pos, from.length(), exec_name); + } + std::cout << usage; +} + +static int handleCommandLineArgments(int argc, char* argv[], Config* config) { + static constexpr const char* OPTSTR = "ha:"; + static const struct option OPTIONS[] = { + { "help", no_argument, nullptr, 'h' }, + { "api", required_argument, nullptr, 'a' }, + { nullptr, 0, nullptr, 0 } // termination of the option list + }; + int opt; + int option_index = 0; + while ((opt = getopt_long(argc, argv, OPTSTR, OPTIONS, &option_index)) >= 0) { + std::string arg(optarg != nullptr ? optarg : ""); + switch (opt) { + default: + case 'h': + printUsage(argv[0]); + exit(0); + case 'a': + if (arg == "opengl") { + config->backend = Engine::Backend::OPENGL; + } else if (arg == "vulkan") { + config->backend = Engine::Backend::VULKAN; + } else if (arg == "metal") { + config->backend = Engine::Backend::METAL; + } else { + std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'." + << std::endl; + } + break; + } + } + + return optind; +} + + +static const VertexWithBones TRIANGLE_VERTICES_WITHBONES[6] = { + {{1, 0}, 0xffff0000u, {0,1,0,0}, {1.0f,0.f,0.f,0.f}}, + {{cos(M_PI * 2 / 3), sin(M_PI * 2 / 3)}, 0xff00ff00u, {0,1,0,0}, {0.f,1.f,0.f,0.f}}, + {{cos(M_PI * 4 / 3), sin(M_PI * 4 / 3)}, 0xff0000ffu,{0,1,0,0}, {0.5f,0.5f,0.f,0.f}}, + {{1, -1}, 0xffffff00u, {0,2,0,0}, {0.0f,1.f,0.f,0.f}}, + {{-cos(M_PI * 2 / 3), sin(M_PI * 2 / 3)}, 0xff00ffffu, {0,1,0,0}, {0.f,1.f,0.f,0.f}}, + {{-cos(M_PI * 4 / 3), sin(M_PI * 4 / 3)}, 0xffff00ffu,{0,1,0,0}, {0.f,0.f,0.5f,0.5f}}, +}; + +static constexpr uint16_t TRIANGLE_INDICES[6] = { 0, 1, 2, 3}; + +mat4f transforms[] = {mat4f(1), + mat4f::translation(float3(1, 0, 0)), + mat4f::translation(float3(1, 1, 0)), + mat4f::translation(float3(0, 1, 0))}; + +int main(int argc, char** argv) { + Config config; + config.title = "hello skinning"; + + handleCommandLineArgments(argc, argv, &config); + + App app; + auto setup = [&app](Engine* engine, View* view, Scene* scene) { + app.skybox = Skybox::Builder().color({0.1, 0.125, 0.25, 1.0}).build(*engine); + + scene->setSkybox(app.skybox); + view->setPostProcessingEnabled(false); + static_assert(sizeof(VertexWithBones) == 36, "Strange vertex size."); + app.vb = VertexBuffer::Builder() + .vertexCount(4) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT2, 0, 36) + .attribute(VertexAttribute::COLOR, 0, VertexBuffer::AttributeType::UBYTE4, 8, 36) + .normalized(VertexAttribute::COLOR) + .attribute(VertexAttribute::BONE_INDICES, 0, VertexBuffer::AttributeType::USHORT4, 12, 36) + .attribute(VertexAttribute::BONE_WEIGHTS, 0, VertexBuffer::AttributeType::FLOAT4, 20, 36) + .build(*engine); + app.vb2 = VertexBuffer::Builder() + .vertexCount(3) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT2, 0, 36) + .attribute(VertexAttribute::COLOR, 0, VertexBuffer::AttributeType::UBYTE4, 8, 36) + .normalized(VertexAttribute::COLOR) + .attribute(VertexAttribute::BONE_INDICES, 0, VertexBuffer::AttributeType::USHORT4, 12, 36) + .attribute(VertexAttribute::BONE_WEIGHTS, 0, VertexBuffer::AttributeType::FLOAT4, 20, 36) + .build(*engine); + app.vb->setBufferAt(*engine, 0, + VertexBuffer::BufferDescriptor(TRIANGLE_VERTICES_WITHBONES, 154, nullptr)); + app.vb2->setBufferAt(*engine, 0, + VertexBuffer::BufferDescriptor(TRIANGLE_VERTICES_WITHBONES + 3, 108, nullptr)); + app.ib = IndexBuffer::Builder() + .indexCount(4) + .bufferType(IndexBuffer::IndexType::USHORT) + .build(*engine); + app.ib->setBuffer(*engine, + IndexBuffer::BufferDescriptor(TRIANGLE_INDICES, 8, nullptr)); + app.mat = Material::Builder() + .package(RESOURCES_BAKEDCOLOR_DATA, RESOURCES_BAKEDCOLOR_SIZE) + .build(*engine); + + app.renderable = EntityManager::get().create(); + + RenderableManager::Builder(2) + .boundingBox({{ -1, -1, -1 }, { 1, 1, 1 }}) + .material(0, app.mat->getDefaultInstance()) + .material(1, app.mat->getDefaultInstance()) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLE_STRIP, app.vb, app.ib, 0, 4) + .geometry(1, RenderableManager::PrimitiveType::TRIANGLES, app.vb2, app.ib, 0, 3) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .skinning(4, transforms) + .enableSkinningBuffers(false) + .build(*engine, app.renderable); + + scene->addEntity(app.renderable); + app.camera = utils::EntityManager::get().create(); + app.cam = engine->createCamera(app.camera); + view->setCamera(app.cam); + }; + + auto cleanup = [&app](Engine* engine, View*, Scene*) { + engine->destroy(app.skybox); + engine->destroy(app.renderable); + engine->destroy(app.mat); + engine->destroy(app.vb); + engine->destroy(app.vb2); + engine->destroy(app.ib); + engine->destroyCameraComponent(app.camera); + utils::EntityManager::get().destroy(app.camera); + }; + + FilamentApp::get().animate([&app](Engine* engine, View* view, double now) { + constexpr float ZOOM = 1.5f; + const uint32_t w = view->getViewport().width; + const uint32_t h = view->getViewport().height; + const float aspect = (float) w / h; + app.cam->setProjection(Camera::Projection::ORTHO, + -aspect * ZOOM, aspect * ZOOM, + -ZOOM, ZOOM, 0, 1); + + auto& rm = engine->getRenderableManager(); + + // Bone skinning animation + float tr = (float)(sin(now)); + mat4f trans[] = {filament::math::mat4f::translation(filament::math::float3{tr, 0, 0}), + filament::math::mat4f::translation(filament::math::float3{-1, tr, 0}), + filament::math::mat4f(1.f)}; + rm.setBones(rm.getInstance(app.renderable), trans, 3, 0); + + + }); + + FilamentApp::get().run(config, setup, cleanup); + + return 0; +} diff --git a/samples/helloskinningbuffer.cpp b/samples/helloskinningbuffer.cpp new file mode 100644 index 00000000000..175c62c81a2 --- /dev/null +++ b/samples/helloskinningbuffer.cpp @@ -0,0 +1,299 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include + +#include +#include + +#include "generated/resources/resources.h" + +using namespace filament; +using utils::Entity; +using utils::EntityManager; +using utils::Path; +using namespace filament::math; + +struct App { + VertexBuffer *vb, *vb2; + IndexBuffer* ib; + Material* mat; + Camera* cam; + Entity camera; + Skybox* skybox; + Entity renderable1; + Entity renderable2; + SkinningBuffer *sb; +}; + +struct Vertex { + float2 position; + uint32_t color; +}; + +static const Vertex TRIANGLE_VERTICES[3] = { + {{1, 0}, 0xffff0000u}, + {{cos(M_PI * 2 / 3), sin(M_PI * 2 / 3)}, 0xff00ff00u}, + {{cos(M_PI * 4 / 3), sin(M_PI * 4 / 3)}, 0xff0000ffu}, +}; + +static const uint16_t skinJoints[] = { 0, 1, 2, 3, + 0, 1, 2, 3, + 0, 1, 2, 3 +}; + +static const float skinWeights[] = { 0.25f, 0.25f, 0.25f, 0.25f, + 0.25f, 0.25f, 0.25f, 0.25f, + 0.25f, 0.25f, 0.25f, 0.25f +}; + +static constexpr uint16_t TRIANGLE_INDICES[] = { 0, 1, 2, 3 }; + +mat4f transforms[] = {math::mat4f(1.f), + mat4f::translation(float3(1, 0, 0)), + mat4f::translation(float3(1, 1, 0)), + mat4f::translation(float3(0, 1, 0)), + mat4f::translation(float3(-1, 1, 0)), + mat4f::translation(float3(-1, 0, 0)), + mat4f::translation(float3(-1, -1, 0)), + mat4f::translation(float3(0, -1, 0)), + mat4f::translation(float3(1, -1, 0))}; + +static void printUsage(char* name) { + std::string exec_name(Path(name).getName()); + std::string usage( + "SAMPLE is a command-line tool for testing Filament skinning buffers.\n" + "Usage:\n" + " SAMPLE [options]\n" + "Options:\n" + " --help, -h\n" + " Prints this message\n\n" + " --api, -a\n" + " Specify the backend API: opengl (default), vulkan, or metal\n\n" + ); + const std::string from("SAMPLE"); + for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) { + usage.replace(pos, from.length(), exec_name); + } + std::cout << usage; +} + +static int handleCommandLineArgments(int argc, char* argv[], Config* config) { + static constexpr const char* OPTSTR = "ha:"; + static const struct option OPTIONS[] = { + { "help", no_argument, nullptr, 'h' }, + { "api", required_argument, nullptr, 'a' }, + { nullptr, 0, nullptr, 0 } // termination of the option list + }; + int opt; + int option_index = 0; + while ((opt = getopt_long(argc, argv, OPTSTR, OPTIONS, &option_index)) >= 0) { + std::string arg(optarg != nullptr ? optarg : ""); + switch (opt) { + default: + case 'h': + printUsage(argv[0]); + exit(0); + case 'a': + if (arg == "opengl") { + config->backend = Engine::Backend::OPENGL; + } else if (arg == "vulkan") { + config->backend = Engine::Backend::VULKAN; + } else if (arg == "metal") { + config->backend = Engine::Backend::METAL; + } else { + std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'." + << std::endl; + } + break; + } + } + + return optind; +} + +int main(int argc, char** argv) { + Config config; + config.title = "skinning buffer common for two renderables"; + + handleCommandLineArgments(argc, argv, &config); + + App app; + auto setup = [&app](Engine* engine, View* view, Scene* scene) { + app.skybox = Skybox::Builder().color({0.1, 0.125, 0.25, 1.0}).build(*engine); + + scene->setSkybox(app.skybox); + view->setPostProcessingEnabled(false); + static_assert(sizeof(Vertex) == 12, "Strange vertex size."); + app.vb = VertexBuffer::Builder() + .vertexCount(3) + .bufferCount(3) + .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT2, 0, 12) + .attribute(VertexAttribute::COLOR, 0, VertexBuffer::AttributeType::UBYTE4, 8, 12) + .normalized(VertexAttribute::COLOR) + .attribute(VertexAttribute::BONE_INDICES, 1, VertexBuffer::AttributeType::USHORT4, 0, 8) + .attribute(VertexAttribute::BONE_WEIGHTS, 2, VertexBuffer::AttributeType::FLOAT4, 0, 16) + .build(*engine); + app.vb->setBufferAt(*engine, 0, + VertexBuffer::BufferDescriptor(TRIANGLE_VERTICES, 36, nullptr)); + app.vb->setBufferAt(*engine, 1, + VertexBuffer::BufferDescriptor(skinJoints, 24, nullptr)); + app.vb->setBufferAt(*engine, 2, + VertexBuffer::BufferDescriptor(skinWeights, 48, nullptr)); + + app.vb2 = VertexBuffer::Builder() + .vertexCount(3) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT2, 0, 12) + .attribute(VertexAttribute::COLOR, 0, VertexBuffer::AttributeType::UBYTE4, 8, 12) + .normalized(VertexAttribute::COLOR) + .build(*engine); + app.vb2->setBufferAt(*engine, 0, + VertexBuffer::BufferDescriptor(TRIANGLE_VERTICES, 36, nullptr)); + app.ib = IndexBuffer::Builder() + .indexCount(3) + .bufferType(IndexBuffer::IndexType::USHORT) + .build(*engine); + app.ib->setBuffer(*engine, + IndexBuffer::BufferDescriptor(TRIANGLE_INDICES, 6, nullptr)); + app.mat = Material::Builder() + .package(RESOURCES_BAKEDCOLOR_DATA, RESOURCES_BAKEDCOLOR_SIZE) + .build(*engine); + + app.sb = SkinningBuffer::Builder() + .boneCount(9) + .initialize() + .build(*engine); + app.sb->setBones(*engine, transforms,9,0); + + app.renderable1 = EntityManager::get().create(); + app.renderable2 = EntityManager::get().create(); + + RenderableManager::Builder(1) + .boundingBox({{ -1, -1, -1 }, { 1, 1, 1 }}) + .material(0, app.mat->getDefaultInstance()) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, app.vb, app.ib, 0, 3) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .enableSkinningBuffers(true) + .skinning(app.sb, 9, 0) + .build(*engine, app.renderable1); + + RenderableManager::Builder(2) + .boundingBox({{ -1, -1, -1 }, { 1, 1, 1 }}) + .material(0, app.mat->getDefaultInstance()) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, app.vb, app.ib, 0, 3) + .geometry(1, RenderableManager::PrimitiveType::TRIANGLES, app.vb2, app.ib, 0, 3) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .enableSkinningBuffers(true) + .skinning(app.sb, 9, 0) + .build(*engine, app.renderable2); + + scene->addEntity(app.renderable1); + scene->addEntity(app.renderable2); + app.camera = utils::EntityManager::get().create(); + app.cam = engine->createCamera(app.camera); + view->setCamera(app.cam); + }; + + auto cleanup = [&app](Engine* engine, View*, Scene*) { + engine->destroy(app.skybox); + engine->destroy(app.renderable1); + engine->destroy(app.renderable2); + engine->destroy(app.mat); + engine->destroy(app.vb); + engine->destroy(app.vb2); + engine->destroy(app.ib); + engine->destroy(app.sb); + engine->destroyCameraComponent(app.camera); + utils::EntityManager::get().destroy(app.camera); + }; + + FilamentApp::get().animate([&app](Engine* engine, View* view, double now) { + constexpr float ZOOM = 1.5f; + const uint32_t w = view->getViewport().width; + const uint32_t h = view->getViewport().height; + const float aspect = (float) w / h; + app.cam->setProjection(Camera::Projection::ORTHO, + -aspect * ZOOM, aspect * ZOOM, + -ZOOM, ZOOM, 0, 1); + auto& tcm = engine->getTransformManager(); + + // Transformation of both renderables + tcm.setTransform(tcm.getInstance(app.renderable1), + filament::math::mat4f::translation(filament::math::float3{ 0.5, 0, 0 })); + tcm.setTransform(tcm.getInstance(app.renderable2), + filament::math::mat4f::translation(filament::math::float3{ 0, 0.5, 0 })); + + auto& rm = engine->getRenderableManager(); + + // Bone skinning animation + float t = (float)(now - (int)now); + float s = sin(t * f::PI * 2.f); + float c = cos(t * f::PI * 2.f); + + mat4f translate[] = {mat4f::translation(float3(s, c, 0))}; + + mat4f trans1of8[9] = {}; + for (size_t i = 0; i < 9; i++) { + trans1of8[i] = filament::math::mat4f(1); + } + s *= 5; + mat4f transA[] = { + mat4f::translation(float3(s, 0, 0)), + mat4f::translation(float3(s, s, 0)), + mat4f::translation(float3(0, s, 0)), + mat4f::translation(float3(-s, s, 0)), + mat4f::translation(float3(-s, 0, 0)), + mat4f::translation(float3(-s, -s, 0)), + mat4f::translation(float3(0, -s, 0)), + mat4f::translation(float3(s, -s, 0)), + filament::math::mat4f(1)}; + size_t offset = ((size_t)now) % 8; + trans1of8[offset] = transA[offset]; + + // Set transformation of the first bone + app.sb->setBones(*engine, translate, 1, 0); + + // Set transformation of the other bones, only 3 of them can be used, do to limitation + app.sb->setBones(*engine,trans1of8, 8, 1); + }); + + FilamentApp::get().run(config, setup, cleanup); + + return 0; +} diff --git a/samples/helloskinningbuffer_morebones.cpp b/samples/helloskinningbuffer_morebones.cpp new file mode 100644 index 00000000000..184d799b7f1 --- /dev/null +++ b/samples/helloskinningbuffer_morebones.cpp @@ -0,0 +1,309 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include + +#include +#include + +#include "generated/resources/resources.h" + +using namespace filament; +using utils::Entity; +using utils::EntityManager; +using utils::Path; +using namespace filament::math; + +struct App { + VertexBuffer *vb1, *vb2; + IndexBuffer *ib1, *ib2; + Material* mat; + Camera* cam; + Entity camera; + Skybox* skybox; + Entity renderable1, renderable2; + SkinningBuffer *sb; +}; + +struct Vertex { + float2 position; + uint32_t color; +}; + +static const Vertex TRIANGLE_VERTICES[3] = { + {{1, 0}, 0xffff0000u}, + {{cos(M_PI * 2 / 3), sin(M_PI * 2 / 3)}, 0xff00ff00u}, + {{cos(M_PI * 4 / 3), sin(M_PI * 4 / 3)}, 0xff0000ffu}, +}; + +static constexpr uint16_t TRIANGLE_INDICES[] = { 0, 1, 2, 3 }; + +mat4f transforms[] = {math::mat4f(1.f), + mat4f::translation(float3(1, 0, 0)), + mat4f::translation(float3(1, 1, 0)), + mat4f::translation(float3(0, 1, 0)), + mat4f::translation(float3(-1, 1, 0)), + mat4f::translation(float3(-1, 0, 0)), + mat4f::translation(float3(-1, -1, 0)), + mat4f::translation(float3(0, -1, 0)), + mat4f::translation(float3(1, -1, 0))}; + + +utils::FixedCapacityVector> boneDataPerPrimitive(3); + +static void printUsage(char* name) { + std::string exec_name(Path(name).getName()); + std::string usage( + "SAMPLE is a command-line tool for testing Filament skinning buffers.\n" + "Usage:\n" + " SAMPLE [options]\n" + "Options:\n" + " --help, -h\n" + " Prints this message\n\n" + " --api, -a\n" + " Specify the backend API: opengl (default), vulkan, or metal\n\n" + ); + const std::string from("SAMPLE"); + for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) { + usage.replace(pos, from.length(), exec_name); + } + std::cout << usage; +} + +static int handleCommandLineArgments(int argc, char* argv[], Config* config) { + static constexpr const char* OPTSTR = "ha:"; + static const struct option OPTIONS[] = { + { "help", no_argument, nullptr, 'h' }, + { "api", required_argument, nullptr, 'a' }, + { nullptr, 0, nullptr, 0 } // termination of the option list + }; + int opt; + int option_index = 0; + while ((opt = getopt_long(argc, argv, OPTSTR, OPTIONS, &option_index)) >= 0) { + std::string arg(optarg != nullptr ? optarg : ""); + switch (opt) { + default: + case 'h': + printUsage(argv[0]); + exit(0); + case 'a': + if (arg == "opengl") { + config->backend = Engine::Backend::OPENGL; + } else if (arg == "vulkan") { + config->backend = Engine::Backend::VULKAN; + } else if (arg == "metal") { + config->backend = Engine::Backend::METAL; + } else { + std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'." + << std::endl; + } + break; + } + } + + return optind; +} + +int main(int argc, char** argv) { + Config config; + config.title = "skinning buffer common for two renderables"; + + handleCommandLineArgments(argc, argv, &config); + + size_t boneCount = 9; + utils::FixedCapacityVector boneDataPerVertex(9); + float weight = 1.f / boneCount; + for (size_t idx = 0; idx < boneCount; idx++) { + boneDataPerVertex[idx] = float2(idx, weight); + } + auto idx = 0; + boneDataPerPrimitive[idx++] = boneDataPerVertex; + boneDataPerPrimitive[idx++] = boneDataPerVertex; + boneDataPerPrimitive[idx++] = boneDataPerVertex; + + App app; + auto setup = [&app](Engine* engine, View* view, Scene* scene) { + app.skybox = Skybox::Builder().color({0.1, 0.125, 0.25, 1.0}).build(*engine); + + scene->setSkybox(app.skybox); + view->setPostProcessingEnabled(false); + static_assert(sizeof(Vertex) == 12, "Strange vertex size."); + app.vb1 = VertexBuffer::Builder() + .vertexCount(3) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT2, 0, 12) + .attribute(VertexAttribute::COLOR, 0, VertexBuffer::AttributeType::UBYTE4, 8, 12) + .normalized(VertexAttribute::COLOR) + .advancedSkinning(true) + .build(*engine); + app.vb1->setBufferAt(*engine, 0, + VertexBuffer::BufferDescriptor(TRIANGLE_VERTICES, 36, nullptr)); + app.vb2 = VertexBuffer::Builder() + .vertexCount(3) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT2, 0, 12) + .attribute(VertexAttribute::COLOR, 0, VertexBuffer::AttributeType::UBYTE4, 8, 12) + .normalized(VertexAttribute::COLOR) + .advancedSkinning(true) + .build(*engine); + app.vb2->setBufferAt(*engine, 0, + VertexBuffer::BufferDescriptor(TRIANGLE_VERTICES, 36, nullptr)); + + app.ib1 = IndexBuffer::Builder() + .indexCount(3) + .bufferType(IndexBuffer::IndexType::USHORT) + .build(*engine); + app.ib2 = IndexBuffer::Builder() + .indexCount(3) + .bufferType(IndexBuffer::IndexType::USHORT) + .build(*engine); + app.ib1->setBuffer(*engine, + IndexBuffer::BufferDescriptor(TRIANGLE_INDICES, 6, nullptr)); + app.ib2->setBuffer(*engine, + IndexBuffer::BufferDescriptor(TRIANGLE_INDICES, 6, nullptr)); + app.mat = Material::Builder() + .package(RESOURCES_BAKEDCOLOR_DATA, RESOURCES_BAKEDCOLOR_SIZE) + .build(*engine); + + app.sb = SkinningBuffer::Builder() + .boneCount(256) + .initialize() + .build(*engine); + app.sb->setBones(*engine, transforms,9,0); + + app.renderable1 = EntityManager::get().create(); + app.renderable2 = EntityManager::get().create(); + + RenderableManager::Builder(1) + .boundingBox({{ -1, -1, -1 }, { 1, 1, 1 }}) + .material(0, app.mat->getDefaultInstance()) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, app.vb1, app.ib1, 0, 3) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .enableSkinningBuffers(true) + .skinning(app.sb, 9, 0) + // Set bone indices and weight for 3 vertices, 9 bones per vertx + .boneIndicesAndWeights(0, boneDataPerPrimitive) + .build(*engine, app.renderable1); + + RenderableManager::Builder(1) + .boundingBox({{ -1, -1, -1 }, { 1, 1, 1 }}) + .material(0, app.mat->getDefaultInstance()) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, app.vb2, app.ib2, 0, 3) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .enableSkinningBuffers(true) + .skinning(app.sb, 9, 0) + // Set bone indices and weight for 3 vertices, 9 bones per vertx + .boneIndicesAndWeights(0, boneDataPerPrimitive) + .build(*engine, app.renderable2); + + scene->addEntity(app.renderable1); + scene->addEntity(app.renderable2); + app.camera = utils::EntityManager::get().create(); + app.cam = engine->createCamera(app.camera); + view->setCamera(app.cam); + }; + + auto cleanup = [&app](Engine* engine, View*, Scene*) { + engine->destroy(app.skybox); + engine->destroy(app.renderable1); + engine->destroy(app.renderable2); + engine->destroy(app.mat); + engine->destroy(app.vb1); + engine->destroy(app.ib1); + engine->destroy(app.vb2); + engine->destroy(app.ib2); + engine->destroy(app.sb); + engine->destroyCameraComponent(app.camera); + utils::EntityManager::get().destroy(app.camera); + }; + + FilamentApp::get().animate([&app](Engine* engine, View* view, double now) { + constexpr float ZOOM = 1.5f; + const uint32_t w = view->getViewport().width; + const uint32_t h = view->getViewport().height; + const float aspect = (float) w / h; + app.cam->setProjection(Camera::Projection::ORTHO, + -aspect * ZOOM, aspect * ZOOM, + -ZOOM, ZOOM, 0, 1); + auto& tcm = engine->getTransformManager(); + + // Transformation of both renderables + tcm.setTransform(tcm.getInstance(app.renderable1), + filament::math::mat4f::translation(filament::math::float3{ 0.5, 0, 0 })); + tcm.setTransform(tcm.getInstance(app.renderable2), + filament::math::mat4f::translation(filament::math::float3{ 0, 0.5, 0 })); + + auto& rm = engine->getRenderableManager(); + + // Bone skinning animation + float t = (float)(now - (int)now); + float s = sin(t * f::PI * 2.f); + float c = cos(t * f::PI * 2.f); + + mat4f translate[] = {mat4f::translation(float3(s, c, 0))}; + + mat4f trans[9] = {}; + for (size_t i = 0; i < 9; i++) { + trans[i] = filament::math::mat4f(1); + } + s *= 8; + mat4f transA[] = { + mat4f::translation(float3(s, 0, 0)), + mat4f::translation(float3(s, s, 0)), + mat4f::translation(float3(0, s, 0)), + mat4f::translation(float3(-s, s, 0)), + mat4f::translation(float3(-s, 0, 0)), + mat4f::translation(float3(-s, -s, 0)), + mat4f::translation(float3(0, -s, 0)), + mat4f::translation(float3(s, -s, 0)), + filament::math::mat4f(1)}; + size_t offset = ((size_t)now) % 8; + trans[offset] = transA[offset]; + + // Set transformation of the first bone + app.sb->setBones(*engine, translate, 1, 0); + + // Set transformation of the others bones + app.sb->setBones(*engine,trans, 8, 1); + + }); + + FilamentApp::get().run(config, setup, cleanup); + + return 0; +} diff --git a/samples/hellostereo.cpp b/samples/hellostereo.cpp new file mode 100644 index 00000000000..06936241a85 --- /dev/null +++ b/samples/hellostereo.cpp @@ -0,0 +1,368 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include + +#include +#include + +#include + +#include +#include + +#include "generated/resources/resources.h" +#include "generated/resources/monkey.h" + +using namespace filament; +using namespace filamesh; +using namespace filament::math; + +struct Vertex { + float3 position; + float2 uv; +}; + +struct App { + Config config; + + Material* monkeyMaterial; + MaterialInstance* monkeyMatInstance; + MeshReader::Mesh monkeyMesh; + mat4f monkeyTransform; + utils::Entity lightEntity; + + View* stereoView = nullptr; + Scene* stereoScene = nullptr; + Camera* stereoCamera = nullptr; + Texture* stereoColorTexture = nullptr; + Texture* stereoDepthTexture = nullptr; + RenderTarget* stereoRenderTarget = nullptr; + + VertexBuffer* quadVb = nullptr; + IndexBuffer* quadIb = nullptr; + Material* quadMaterial = nullptr; + std::vector quadEntities; + std::vector quadMatInstances; +}; + +static void printUsage(char* name) { + std::string exec_name(utils::Path(name).getName()); + std::string usage( + "SHOWCASE renders multiple quads displaying the contents of stereoscopic rendering\n" + "Usage:\n" + " SHOWCASE [options]\n" + "Options:\n" + " --help, -h\n" + " Prints this message\n\n" + " --api, -a\n" + " Specify the backend API: opengl (default), vulkan, or metal\n" + " --eyes=, -y \n" + " Sets the number of stereoscopic eyes (default: 2) when stereoscopic rendering is\n" + " enabled.\n\n" + ); + const std::string from("SHOWCASE"); + for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) { + usage.replace(pos, from.length(), exec_name); + } + std::cout << usage; +} + +static int handleCommandLineArguments(int argc, char* argv[], App* app) { + static constexpr const char* OPTSTR = "ha:y:"; + static const struct option OPTIONS[] = { + { "help", no_argument, nullptr, 'h' }, + { "api", required_argument, nullptr, 'a' }, + { "eyes", required_argument, nullptr, 'y' }, + { nullptr, 0, nullptr, 0 } + }; + int opt; + int option_index = 0; + while ((opt = getopt_long(argc, argv, OPTSTR, OPTIONS, &option_index)) >= 0) { + std::string arg(optarg ? optarg : ""); + switch (opt) { + default: + case 'h': + printUsage(argv[0]); + exit(0); + case 'a': + if (arg == "opengl") { + app->config.backend = Engine::Backend::OPENGL; + } else if (arg == "vulkan") { + app->config.backend = Engine::Backend::VULKAN; + } else if (arg == "metal") { + app->config.backend = Engine::Backend::METAL; + } else { + std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'.\n"; + exit(1); + } + break; + case 'y': { + int eyeCount = 0; + try { + eyeCount = std::stoi(arg); + } catch (std::invalid_argument &e) { } + if (eyeCount >= 2 && eyeCount <= CONFIG_MAX_STEREOSCOPIC_EYES) { + app->config.stereoscopicEyeCount = eyeCount; + } else { + std::cerr << "Eye count must be between 2 and CONFIG_MAX_STEREOSCOPIC_EYES (" + << (int)CONFIG_MAX_STEREOSCOPIC_EYES << ") (inclusive).\n"; + exit(1); + } + break; + } + } + } + return optind; +} + +int main(int argc, char** argv) { + +#if !defined(FILAMENT_SAMPLES_STEREO_TYPE_MULTIVIEW) + std::cerr << "This sample only works with multiview enabled.\n"; + exit(1); +#endif + + App app{}; + app.config.title = "stereoscopic rendering"; + handleCommandLineArguments(argc, argv, &app); + + auto setup = [&app](Engine* engine, View* view, Scene* scene) { + auto& tcm = engine->getTransformManager(); + auto& rcm = engine->getRenderableManager(); + auto& em = utils::EntityManager::get(); + auto vp = view->getViewport(); + + constexpr float3 monkeyPosition{ 0, 0, -4}; + constexpr float3 upVector{ 0, 1, 0}; + const int eyeCount = app.config.stereoscopicEyeCount; + + // Create a mesh material and an instance. + app.monkeyMaterial = Material::Builder() + .package(RESOURCES_AIDEFAULTMAT_DATA, RESOURCES_AIDEFAULTMAT_SIZE) + .build(*engine); + auto mi = app.monkeyMatInstance = app.monkeyMaterial->createInstance(); + mi->setParameter("baseColor", RgbType::LINEAR, {0.8, 1.0, 1.0}); + mi->setParameter("metallic", 0.0f); + mi->setParameter("roughness", 0.4f); + mi->setParameter("reflectance", 0.5f); + + // Add a monkey and a light source into the main scene. + app.monkeyMesh = MeshReader::loadMeshFromBuffer( + engine, MONKEY_SUZANNE_DATA, nullptr, nullptr, mi); + auto ti = tcm.getInstance(app.monkeyMesh.renderable); + app.monkeyTransform = mat4f{mat3f(1), monkeyPosition } * tcm.getWorldTransform(ti); + rcm.setCastShadows(rcm.getInstance(app.monkeyMesh.renderable), false); + scene->addEntity(app.monkeyMesh.renderable); + + app.lightEntity = em.create(); + LightManager::Builder(LightManager::Type::SUN) + .color(Color::toLinear(sRGBColor(0.98f, 0.92f, 0.89f))) + .intensity(110000) + .direction({ 0.7, -1, -0.8 }) + .sunAngularRadius(1.9f) + .castShadows(false) + .build(*engine, app.lightEntity); + scene->addEntity(app.lightEntity); + + // Create a stereo render target that will be rendered as an offscreen view. + app.stereoScene = engine->createScene(); + app.stereoScene->addEntity(app.monkeyMesh.renderable); + app.stereoScene->addEntity(app.lightEntity); + app.stereoView = engine->createView(); + app.stereoView->setScene(app.stereoScene); + app.stereoView->setPostProcessingEnabled(false); + app.stereoColorTexture = Texture::Builder() + .width(vp.width) + .height(vp.height) + .depth(eyeCount) + .levels(1) + .sampler(Texture::Sampler::SAMPLER_2D_ARRAY) + .format(Texture::InternalFormat::RGBA8) + .usage(Texture::Usage::COLOR_ATTACHMENT | Texture::Usage::SAMPLEABLE) + .build(*engine); + app.stereoDepthTexture = Texture::Builder() + .width(vp.width) + .height(vp.height) + .depth(eyeCount) + .levels(1) + .sampler(Texture::Sampler::SAMPLER_2D_ARRAY) + .format(Texture::InternalFormat::DEPTH24) + .usage(Texture::Usage::DEPTH_ATTACHMENT) + .build(*engine); + app.stereoRenderTarget = RenderTarget::Builder() + .texture(RenderTarget::AttachmentPoint::COLOR, app.stereoColorTexture) + .texture(RenderTarget::AttachmentPoint::DEPTH, app.stereoDepthTexture) + .multiview(RenderTarget::AttachmentPoint::COLOR, eyeCount, 0) + .multiview(RenderTarget::AttachmentPoint::DEPTH, eyeCount, 0) + .build(*engine); + app.stereoView->setRenderTarget(app.stereoRenderTarget); + app.stereoView->setViewport({0, 0, vp.width, vp.height}); + app.stereoCamera = engine->createCamera(em.create()); + app.stereoView->setCamera(app.stereoCamera); + app.stereoView->setStereoscopicOptions({.enabled = true}); + FilamentApp::get().addOffscreenView(app.stereoView); + + // Camera settings for the stereo render target + constexpr double projNear = 0.1; + constexpr double projFar = 100; + + mat4 projections[CONFIG_MAX_STEREOSCOPIC_EYES]; + mat4 eyeModels[CONFIG_MAX_STEREOSCOPIC_EYES]; + static_assert(CONFIG_MAX_STEREOSCOPIC_EYES == 4, "Update matrices"); + projections[0] = Camera::projection(24, 1.0, projNear, projFar); + projections[1] = Camera::projection(70, 1.0, projNear, projFar); + projections[2] = Camera::projection(50, 1.0, projNear, projFar); + projections[3] = Camera::projection(35, 1.0, projNear, projFar); + app.stereoCamera->setCustomEyeProjection(projections, 4, projections[0], projNear, projFar); + + eyeModels[0] = mat4::lookAt(float3{ -4, 0, 0 }, monkeyPosition, upVector); + eyeModels[1] = mat4::lookAt(float3{ 4, 0, 0 }, monkeyPosition, upVector); + eyeModels[2] = mat4::lookAt(float3{ 0, 3, 0 }, monkeyPosition, upVector); + eyeModels[3] = mat4::lookAt(float3{ 0, -3, 0 }, monkeyPosition, upVector); + for (int i = 0; i < eyeCount; ++i) { + app.stereoCamera->setEyeModelMatrix(i, eyeModels[i]); + } + + // Create a vertex buffer and an index buffer for a quad. This will be used to display the contents + // of each layer of the stereo texture. + float3 quadCenter = {0, 0, 0}; + float3 quadNormal = normalize(float3 {0, 0, 1}); + float3 u = normalize(cross(quadNormal, upVector)); + float3 v = cross(quadNormal, u); + static Vertex quadVertices[4] = { + {{quadCenter - u - v}, {1, 0}}, + {{quadCenter + u - v}, {0, 0}}, + {{quadCenter - u + v}, {1, 1}}, + {{quadCenter + u + v}, {0, 1}} + }; + + static_assert(sizeof(Vertex) == 20, "Strange vertex size."); + app.quadVb = VertexBuffer::Builder() + .vertexCount(4) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, VertexBuffer::AttributeType::FLOAT3, 0, sizeof(Vertex)) + .attribute(VertexAttribute::UV0, 0, VertexBuffer::AttributeType::FLOAT2, 12, sizeof(Vertex)) + .build(*engine); + app.quadVb->setBufferAt(*engine, 0, + VertexBuffer::BufferDescriptor(quadVertices, sizeof(Vertex) * 4, nullptr)); + + static constexpr uint16_t quadIndices[6] = { 0, 1, 2, 3, 2, 1 }; + app.quadIb = IndexBuffer::Builder() + .indexCount(6) + .bufferType(IndexBuffer::IndexType::USHORT) + .build(*engine); + app.quadIb->setBuffer(*engine, IndexBuffer::BufferDescriptor(quadIndices, 12, nullptr)); + + // Create quad material instances and renderables. + app.quadMaterial = Material::Builder() + .package(RESOURCES_ARRAYTEXTURE_DATA, RESOURCES_ARRAYTEXTURE_SIZE) + .build(*engine); + + for (int i = 0; i < eyeCount; ++i) { + MaterialInstance* quadMatInst = app.quadMaterial->createInstance(); + TextureSampler sampler(TextureSampler::MinFilter::LINEAR, TextureSampler::MagFilter::LINEAR); + quadMatInst->setParameter("image", app.stereoColorTexture, sampler); + quadMatInst->setParameter("layerIndex", i); + quadMatInst->setParameter("borderEffect", true); + app.quadMatInstances.push_back(quadMatInst); + + utils::Entity quadEntity = em.create(); + app.quadEntities.push_back(quadEntity); + RenderableManager::Builder(1) + .boundingBox({{ -1, -1, -1 }, { 1, 1, 1 }}) + .material(0, quadMatInst) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, app.quadVb, app.quadIb, 0, 6) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .build(*engine, quadEntity); + scene->addEntity(quadEntity); + + // Place quads at equal intervals. + TransformManager::Instance quadTi = tcm.getInstance(quadEntity); + mat4f quadWorld = tcm.getWorldTransform(quadTi); + constexpr float leftMostPos = -4; + constexpr float rightMostPos = 4; + float xpos = leftMostPos + ( (rightMostPos - leftMostPos) / (eyeCount - 1) ) * i; + tcm.setTransform(quadTi, mat4f::translation(float3(xpos, 2, -8)) * quadWorld); + } + }; + + auto cleanup = [&app](Engine* engine, View*, Scene*) { + + auto& em = utils::EntityManager::get(); + + for (MaterialInstance* mi : app.quadMatInstances) { + engine->destroy(mi); + } + for (utils::Entity e : app.quadEntities) { + engine->destroy(e); + } + engine->destroy(app.quadMaterial); + engine->destroy(app.quadIb); + engine->destroy(app.quadVb); + engine->destroy(app.stereoRenderTarget); + engine->destroy(app.stereoDepthTexture); + engine->destroy(app.stereoColorTexture); + auto camera = app.stereoCamera->getEntity(); + engine->destroyCameraComponent(camera); + em.destroy(camera); + engine->destroy(app.stereoScene); + engine->destroy(app.stereoView); + engine->destroy(app.lightEntity); + engine->destroy(app.monkeyMesh.renderable); + engine->destroy(app.monkeyMesh.indexBuffer); + engine->destroy(app.monkeyMesh.vertexBuffer); + engine->destroy(app.monkeyMatInstance); + engine->destroy(app.monkeyMaterial); + }; + + auto preRender = [&app](Engine*, View*, Scene*, Renderer* renderer) { + renderer->setClearOptions({.clearColor = {0.1,0.2,0.4,1.0}, .clear = true}); + }; + + FilamentApp::get().animate([&app](Engine* engine, View* view, double now) { + auto& tcm = engine->getTransformManager(); + + // Animate the monkey by spinning and sliding back and forth along Z. + auto ti = tcm.getInstance(app.monkeyMesh.renderable); + mat4f xform = app.monkeyTransform * mat4f::rotation(now, float3{0, 1, 0 }); + tcm.setTransform(ti, xform); + }); + + FilamentApp::get().run(app.config, setup, cleanup, FilamentApp::ImGuiCallback(), preRender); + + return 0; +} diff --git a/samples/hellotriangle.cpp b/samples/hellotriangle.cpp index 8c237c68b15..4477429dd63 100644 --- a/samples/hellotriangle.cpp +++ b/samples/hellotriangle.cpp @@ -31,7 +31,11 @@ #include #include +#include + #include +#include + #include "generated/resources/resources.h" @@ -40,6 +44,7 @@ using utils::Entity; using utils::EntityManager; struct App { + Config config; VertexBuffer* vb; IndexBuffer* ib; Material* mat; @@ -62,11 +67,64 @@ static const Vertex TRIANGLE_VERTICES[3] = { static constexpr uint16_t TRIANGLE_INDICES[3] = { 0, 1, 2 }; +static void printUsage(char* name) { + std::string exec_name(utils::Path(name).getName()); + std::string usage( + "HELLOTRIANGLE renders a spinning colored triangle\n" + "Usage:\n" + " HELLOTRIANGLE [options]\n" + "Options:\n" + " --help, -h\n" + " Prints this message\n\n" + " --api, -a\n" + " Specify the backend API: opengl, vulkan, or metal\n" + ); + const std::string from("HELLOTRIANGLE"); + for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) { + usage.replace(pos, from.length(), exec_name); + } + std::cout << usage; +} + +static int handleCommandLineArguments(int argc, char* argv[], App* app) { + static constexpr const char* OPTSTR = "ha:"; + static const struct option OPTIONS[] = { + { "help", no_argument, nullptr, 'h' }, + { "api", required_argument, nullptr, 'a' }, + { nullptr, 0, nullptr, 0 } + }; + int opt; + int option_index = 0; + while ((opt = getopt_long(argc, argv, OPTSTR, OPTIONS, &option_index)) >= 0) { + std::string arg(optarg ? optarg : ""); + switch (opt) { + default: + case 'h': + printUsage(argv[0]); + exit(0); + case 'a': + if (arg == "opengl") { + app->config.backend = Engine::Backend::OPENGL; + } else if (arg == "vulkan") { + app->config.backend = Engine::Backend::VULKAN; + } else if (arg == "metal") { + app->config.backend = Engine::Backend::METAL; + } else { + std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'.\n"; + exit(1); + } + break; + } + } + return optind; +} + int main(int argc, char** argv) { - Config config; - config.title = "hellotriangle"; + App app{}; + app.config.title = "hellotriangle"; + app.config.featureLevel = backend::FeatureLevel::FEATURE_LEVEL_0; + handleCommandLineArguments(argc, argv, &app); - App app; auto setup = [&app](Engine* engine, View* view, Scene* scene) { app.skybox = Skybox::Builder().color({0.1, 0.125, 0.25, 1.0}).build(*engine); scene->setSkybox(app.skybox); @@ -128,7 +186,7 @@ int main(int argc, char** argv) { filament::math::mat4f::rotation(now, filament::math::float3{ 0, 0, 1 })); }); - FilamentApp::get().run(config, setup, cleanup); + FilamentApp::get().run(app.config, setup, cleanup); return 0; } diff --git a/samples/image_viewer.cpp b/samples/image_viewer.cpp index 5474db7cf81..d380aae4112 100644 --- a/samples/image_viewer.cpp +++ b/samples/image_viewer.cpp @@ -80,8 +80,7 @@ struct App { bool showImage = false; float3 backgroundColor = float3(0.0f); - // zero-initialized so that the first time through is always dirty. - ColorGradingSettings lastColorGradingOptions = { 0 }; + ColorGradingSettings lastColorGradingOptions = { .enabled = false }; ColorGrading* colorGrading = nullptr; }; diff --git a/samples/material_sandbox.cpp b/samples/material_sandbox.cpp index 7df322fc1d9..77782464680 100644 --- a/samples/material_sandbox.cpp +++ b/samples/material_sandbox.cpp @@ -333,10 +333,16 @@ static void setup(Engine* engine, View*, Scene* scene) { if (ibl) { auto& params = g_params; IndirectLight* const pIndirectLight = ibl->getIndirectLight(); - params.lightDirection = IndirectLight::getDirectionEstimate(ibl->getSphericalHarmonics()); - float4 c = pIndirectLight->getColorEstimate(ibl->getSphericalHarmonics(), params.lightDirection); - params.lightIntensity = c.w * pIndirectLight->getIntensity(); - params.lightColor = c.rgb; + // If we loaded an equirectangular IBL, we don't have spherical harmonics. In that case, + // simply skip the estimates. + if (ibl->hasSphericalHarmonics()) { + params.lightDirection = + IndirectLight::getDirectionEstimate(ibl->getSphericalHarmonics()); + float4 c = pIndirectLight->getColorEstimate( + ibl->getSphericalHarmonics(), params.lightDirection); + params.lightIntensity = c.w * pIndirectLight->getIntensity(); + params.lightColor = c.rgb; + } } g_params.bloomOptions.dirt = FilamentApp::get().getDirtTexture(); @@ -596,11 +602,16 @@ static void gui(filament::Engine* engine, filament::View*) { if (ImGui::CollapsingHeader("Camera")) { ImGui::Indent(); - ImGui::SliderFloat("Focal length", &FilamentApp::get().getCameraFocalLength(), 16.0f, 90.0f); + ImGui::SliderFloat("Focal length", ¶ms.cameraFocalLength, 16.0f, 90.0f); ImGui::SliderFloat("Aperture", ¶ms.cameraAperture, 1.0f, 32.0f); ImGui::SliderFloat("Speed", ¶ms.cameraSpeed, 800.0f, 1.0f); ImGui::SliderFloat("ISO", ¶ms.cameraISO, 25.0f, 6400.0f); + ImGui::SliderFloat("Near", ¶ms.cameraNear, 0.01f, 1.0f); + ImGui::SliderFloat("Far", ¶ms.cameraFar, 1.0f, 10000.0f); ImGui::Unindent(); + + FilamentApp::get().setCameraFocalLength(params.cameraFocalLength); + FilamentApp::get().setCameraNearFar(params.cameraNear, params.cameraFar); } if (ImGui::CollapsingHeader("Indirect Light")) { diff --git a/samples/material_sandbox.h b/samples/material_sandbox.h index 273ba788fc5..2bc0a243150 100644 --- a/samples/material_sandbox.h +++ b/samples/material_sandbox.h @@ -184,6 +184,9 @@ struct SandboxParameters { float cameraAperture = 16.0f; float cameraSpeed = 125.0f; float cameraISO = 100.0f; + float cameraFocalLength = 28.0f; + float cameraNear = 0.1f; + float cameraFar = 100.0f; bool colorGrading = true; ColorGradingOptions colorGradingOptions; }; diff --git a/samples/materials/arrayTexture.mat b/samples/materials/arrayTexture.mat new file mode 100644 index 00000000000..f14a86bc864 --- /dev/null +++ b/samples/materials/arrayTexture.mat @@ -0,0 +1,39 @@ +material { + name : ArrayTexture, + parameters : [ + { + type : sampler2dArray, + name : image + }, + { + type : int, + name : layerIndex + }, + { + type : bool, + name : borderEffect + } + ], + requires : [ + uv0 + ], + shadingModel : unlit, + culling : none +} + +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + float3 v = texture(materialParams_image, vec3(getUV0(), materialParams.layerIndex)).rgb; + material.baseColor.rgb = v; + + // Add black border effect. + if (materialParams.borderEffect) { + vec2 st = getUV0(); + float minDist0 = min(st.x, st.y); + float minDist1 = min(1.0 - st.x, 1.0 - st.y); + float minDist = min(minDist0, minDist1); + material.baseColor.rgb *= smoothstep(0.0, 0.1, minDist); + } + } +} diff --git a/samples/materials/bakedColor.mat b/samples/materials/bakedColor.mat index ee10a3035ea..c78cef16ac6 100644 --- a/samples/materials/bakedColor.mat +++ b/samples/materials/bakedColor.mat @@ -4,7 +4,8 @@ material { color ], shadingModel : unlit, - culling : none + culling : none, + featureLevel : 0 } fragment { diff --git a/samples/multiple_windows.cpp b/samples/multiple_windows.cpp index 80adb67a90b..de3710ebe9f 100644 --- a/samples/multiple_windows.cpp +++ b/samples/multiple_windows.cpp @@ -92,7 +92,7 @@ extern "C" #endif int main(int argc, char *argv[]) { // ---- initialize ---- - ASSERT_POSTCONDITION(SDL_Init(SDL_INIT_EVENTS) == 0, "SDL_Init Failure"); + FILAMENT_CHECK_POSTCONDITION(SDL_Init(SDL_INIT_EVENTS) == 0) << "SDL_Init Failure"; std::vector windows = { Window(), Window() }; uint32_t windowFlags = SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI diff --git a/samples/sample_full_pbr.cpp b/samples/sample_full_pbr.cpp index bbce18a2187..77c08ec1999 100644 --- a/samples/sample_full_pbr.cpp +++ b/samples/sample_full_pbr.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -76,13 +77,13 @@ struct PbrMap { }; static std::array g_maps = { - PbrMap { "_color", "baseColorMap", true, nullptr }, - PbrMap { "_ao", "aoMap", false, nullptr }, - PbrMap { "_roughness", "roughnessMap", false, nullptr }, - PbrMap { "_metallic", "metallicMap", false, nullptr }, - PbrMap { "_normal", "normalMap", false, nullptr }, - PbrMap { "_bentNormal", "bentNormalMap", false, nullptr }, - PbrMap { "_height", "heightMap", false, nullptr }, + PbrMap { "color", "baseColorMap", true, nullptr }, + PbrMap { "ao", "aoMap", false, nullptr }, + PbrMap { "roughness", "roughnessMap", false, nullptr }, + PbrMap { "metallic", "metallicMap", false, nullptr }, + PbrMap { "normal", "normalMap", false, nullptr }, + PbrMap { "bentNormal", "bentNormalMap", false, nullptr }, + PbrMap { "height", "heightMap", false, nullptr }, }; static Config g_config; @@ -93,7 +94,7 @@ static struct PbrConfig { } g_pbrConfig; static void printUsage(char* name) { - std::string exec_name(Path(name).getName()); + std::string const exec_name(Path(name).getName()); std::string usage( "SAMPLE_PBR is an example of loading PBR assets with base color + packed metallic/roughness\n" "Usage:\n" @@ -143,12 +144,12 @@ static int handleCommandLineArgments(int argc, char* argv[], Config* config) { { "material", required_argument, nullptr, 'm' }, { "clear-coat", no_argument, nullptr, 'c' }, { "anisotropy", no_argument, nullptr, 'A' }, - { 0, 0, 0, 0 } // termination of the option list + { nullptr, 0, nullptr, 0 } // termination of the option list }; int opt; int option_index = 0; while ((opt = getopt_long(argc, argv, OPTSTR, OPTIONS, &option_index)) >= 0) { - std::string arg(optarg ? optarg : ""); + std::string const arg(optarg ? optarg : ""); switch (opt) { default: case 'h': @@ -210,9 +211,9 @@ static void cleanup(Engine* engine, View*, Scene*) { em.destroy(g_light); } -void loadTexture(Engine* engine, const std::string& filePath, Texture** map, bool sRGB = true) { +bool loadTexture(Engine* engine, const std::string& filePath, Texture** map, bool sRGB = true) { if (!filePath.empty()) { - Path path(filePath); + Path const path(filePath); if (path.exists()) { int w, h, n; unsigned char* data = stbi_load(path.getAbsolutePath().c_str(), &w, &h, &n, 3); @@ -228,18 +229,18 @@ void loadTexture(Engine* engine, const std::string& filePath, Texture** map, boo (Texture::PixelBufferDescriptor::Callback) &stbi_image_free); (*map)->setImage(*engine, 0, std::move(buffer)); (*map)->generateMipmaps(*engine); + return true; } else { std::cout << "The texture " << path << " could not be loaded" << std::endl; } - } else { - std::cout << "The texture " << path << " does not exist" << std::endl; } } + return false; } static void setup(Engine* engine, View* view, Scene* scene) { - Path path(g_pbrConfig.materialDir); - std::string name(path.getName()); + Path const path(g_pbrConfig.materialDir); + std::string const name(path.getName()); view->setAmbientOcclusionOptions({ .radius = 0.01f, @@ -252,17 +253,21 @@ static void setup(Engine* engine, View* view, Scene* scene) { bool hasUV = false; for (auto& map: g_maps) { - loadTexture(engine, path.concat(name + map.suffix + ".png"), &map.texture, map.sRGB); + if (!loadTexture(engine, path.concat(name + "_" + map.suffix + ".png"), &map.texture, map.sRGB)) { + if (!loadTexture(engine, path.concat(std::string(map.suffix) + ".png"), &map.texture, map.sRGB)) { + std::cout << "The texture " << map.suffix << " does not exist" << std::endl; + } + } if (map.texture != nullptr) hasUV = true; } - bool hasBaseColorMap = g_maps[MAP_COLOR].texture != nullptr; - bool hasMetallicMap = g_maps[MAP_METALLIC].texture != nullptr; - bool hasRoughnessMap = g_maps[MAP_ROUGHNESS].texture != nullptr; - bool hasAOMap = g_maps[MAP_AO].texture != nullptr; - bool hasNormalMap = g_maps[MAP_NORMAL].texture != nullptr; - bool hasBentNormalMap = g_maps[MAP_BENT_NORMAL].texture != nullptr; - bool hasHeightMap = g_maps[MAP_HEIGHT].texture != nullptr; + bool const hasBaseColorMap = g_maps[MAP_COLOR].texture != nullptr; + bool const hasMetallicMap = g_maps[MAP_METALLIC].texture != nullptr; + bool const hasRoughnessMap = g_maps[MAP_ROUGHNESS].texture != nullptr; + bool const hasAOMap = g_maps[MAP_AO].texture != nullptr; + bool const hasNormalMap = g_maps[MAP_NORMAL].texture != nullptr; + bool const hasBentNormalMap = g_maps[MAP_BENT_NORMAL].texture != nullptr; + bool const hasHeightMap = g_maps[MAP_HEIGHT].texture != nullptr; std::string shader = R"SHADER( void material(inout MaterialInputs material) { @@ -281,9 +286,7 @@ static void setup(Engine* engine, View* view, Scene* scene) { vec2 uvDy = dFdy(uv0); mat3 tangentFromWorld = transpose(getWorldTangentFrame()); - vec3 tangentCameraPosition = tangentFromWorld * getWorldCameraPosition(); - vec3 tangentFragPosition = tangentFromWorld * getWorldPosition(); - vec3 v = normalize(tangentCameraPosition - tangentFragPosition); + vec3 v = tangentFromWorld * getWorldViewVector(); float minLayers = 8.0; float maxLayers = 48.0; @@ -297,7 +300,7 @@ static void setup(Engine* engine, View* view, Scene* scene) { vec2 deltaUV = v.xy * heightScale / (v.z * numLayers); vec2 currUV = uv0; float height = 1.0 - textureGrad(materialParams_heightMap, currUV, uvDx, uvDy).r; - for (int i = 0; i < numLayers; i++) { + for (int i = 0; i < int(numLayers); i++) { currLayerDepth += layerDepth; currUV -= deltaUV; height = 1.0 - textureGrad(materialParams_heightMap, currUV, uvDx, uvDy).r; @@ -404,7 +407,7 @@ static void setup(Engine* engine, View* view, Scene* scene) { } } - Package pkg = builder.build(engine->getJobSystem()); + Package const pkg = builder.build(engine->getJobSystem()); g_material = Material::Builder().package(pkg.getData(), pkg.getSize()).build(*engine); g_materialInstances["DefaultMaterial"] = g_material->createInstance(); @@ -445,19 +448,29 @@ static void setup(Engine* engine, View* view, Scene* scene) { .direction({0.6, -1, -0.8}) .castShadows(true) .build(*engine, g_light); - //scene->addEntity(g_light); + scene->addEntity(g_light); +} + +static void preRender(filament::Engine*, filament::View*, filament::Scene*, + filament::Renderer* renderer) { + + // Without an IBL, we must clear the swapchain to black before each frame. + renderer->setClearOptions({ + .clearColor = { 0.5f, 0.5f, 0.5f, 1.0f }, + .clear = !FilamentApp::get().getIBL() }); + } int main(int argc, char* argv[]) { - int option_index = handleCommandLineArgments(argc, argv, &g_config); - int num_args = argc - option_index; + int const option_index = handleCommandLineArgments(argc, argv, &g_config); + int const num_args = argc - option_index; if (num_args < 1) { printUsage(argv[0]); return 1; } for (int i = option_index; i < argc; i++) { - utils::Path filename = argv[i]; + utils::Path const filename = argv[i]; if (!filename.exists()) { std::cerr << "file " << argv[i] << " not found!" << std::endl; return 1; @@ -467,7 +480,7 @@ int main(int argc, char* argv[]) { g_config.title = "PBR"; FilamentApp& filamentApp = FilamentApp::get(); - filamentApp.run(g_config, setup, cleanup); + filamentApp.run(g_config, setup, cleanup, FilamentApp::ImGuiCallback(), preRender); return 0; } diff --git a/samples/skinningtest.cpp b/samples/skinningtest.cpp new file mode 100644 index 00000000000..a2da0b1b5b5 --- /dev/null +++ b/samples/skinningtest.cpp @@ -0,0 +1,714 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include + +#include +#include + +#include "generated/resources/resources.h" + +using namespace filament; +using utils::Entity; +using utils::EntityManager; +using utils::Path; +using utils::FixedCapacityVector; +using namespace filament::math; + +struct App { + VertexBuffer* vbs[10]; + size_t vbCount = 0; + IndexBuffer *ib, *ib2; + Material* mat; + Camera* cam; + Entity camera; + Skybox* skybox; + Entity renderables[4]; + SkinningBuffer *sb, *sb2; + MorphTargetBuffer *mt; + BufferObject* bos[10]; + size_t boCount = 0; + size_t bonesPerVertex; + FixedCapacityVector> + boneDataPerPrimitive, + boneDataPerPrimitiveMulti; +}; + +struct Vertex { + float2 position; + uint32_t color; +}; + +static const Vertex TRIANGLE_VERTICES_1[6] = { + {{ 1, 0}, 0xff00ff00u}, + {{ cos(M_PI * 1 / 3), sin(M_PI * 1 / 3)}, 0xff330088u}, + {{ cos(M_PI * 2 / 3), sin(M_PI * 2 / 3)}, 0xff880033u}, + {{-1, 0}, 0xff00ff00u}, + {{ cos(M_PI * 4 / 3), sin(M_PI * 4 / 3)}, 0xff330088u}, + {{ cos(M_PI * 5 / 3), sin(M_PI * 5 / 3)}, 0xff880033u}, +}; + +static const Vertex TRIANGLE_VERTICES_2[6] = { + {{ 1, 0}, 0xff0000ffu}, + {{ cos(M_PI * 1 / 3), sin(M_PI * 1 / 3)}, 0xfff055ffu}, + {{ cos(M_PI * 2 / 3), sin(M_PI * 2 / 3)}, 0xff880088u}, + {{-1, 0}, 0xff0000ffu}, + {{ cos(M_PI * 4 / 3), sin(M_PI * 4 / 3)}, 0xfff055ffu}, + {{ cos(M_PI * 5 / 3), sin(M_PI * 5 / 3)}, 0xff880088u}, +}; + +static const Vertex TRIANGLE_VERTICES_3[6] = { + {{ 1, 0}, 0xfff00f88u}, + {{ cos(M_PI * 1 / 3), sin(M_PI * 1 / 3)}, 0xff00ffaau}, + {{ cos(M_PI * 2 / 3), sin(M_PI * 2 / 3)}, 0xff00ffffu}, + {{-1, 0}, 0xfff00f88u}, + {{ cos(M_PI * 4 / 3), sin(M_PI * 4 / 3)}, 0xff00ffaau}, + {{ cos(M_PI * 5 / 3), sin(M_PI * 5 / 3)}, 0xff00ffffu}, +}; + + +static const float3 targets_pos[9] = { + { -2, 0, 0},{ 0, 2, 0},{ 1, 0, 0}, + { 1, 1, 0},{ -1, 0, 0},{ -1, 0, 0}, + { 0, 0, 0},{ 0, 0, 0},{ 0, 0, 0} +}; + +static const short4 targets_tan[9] = { + { 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}}; + +static const uint16_t skinJoints[] = { 0, 1, 2, 5, + 0, 2, 3, 5, + 0, 3, 1, 5}; + +static const float skinWeights[] = { 0.5f, 0.0f, 0.0f, 0.5f, + 0.5f, 0.0f, 0.f, 0.5f, + 0.5f, 0.0f, 0.f, 0.5f,}; + +static float2 boneDataArray[48] = {}; //indices and weights for up to 3 vertices with 8 bones + +static constexpr uint16_t TRIANGLE_INDICES[3] = { 0, 1, 2 }, +TRIANGLE_INDICES_2[6] = { 0, 2, 4, 1, 3, 5 }; + +mat4f transforms[] = {math::mat4f(1), + mat4f::translation(float3(1, 0, 0)), + mat4f::translation(float3(1, 1, 0)), + mat4f::translation(float3(0, 1, 0)), + mat4f::translation(float3(-1, 1, 0)), + mat4f::translation(float3(-1, 0, 0)), + mat4f::translation(float3(-1, -1, 0)), + mat4f::translation(float3(0, -1, 0)), + mat4f::translation(float3(1, -1, 0))}; + + +static void printUsage(char* name) { + std::string exec_name(Path(name).getName()); + std::string usage( + "SAMPLE is a command-line tool for testing Filament skinning buffers.\n" + "Usage:\n" + " SAMPLE [options]\n" + "Options:\n" + " --help, -h\n" + " Prints this message\n\n" + " --api, -a\n" + " Specify the backend API: opengl (default), vulkan, or metal\n\n" + ); + const std::string from("SAMPLE"); + for (size_t pos = usage.find(from); pos != std::string::npos; pos = usage.find(from, pos)) { + usage.replace(pos, from.length(), exec_name); + } + std::cout << usage; +} + +static int handleCommandLineArgments(int argc, char* argv[], Config* config) { + static constexpr const char* OPTSTR = "ha:"; + static const struct option OPTIONS[] = { + { "help", no_argument, nullptr, 'h' }, + { "api", required_argument, nullptr, 'a' }, + { nullptr, 0, nullptr, 0 } // termination of the option list + }; + int opt; + int option_index = 0; + while ((opt = getopt_long(argc, argv, OPTSTR, OPTIONS, &option_index)) >= 0) { + std::string arg(optarg != nullptr ? optarg : ""); + switch (opt) { + default: + case 'h': + printUsage(argv[0]); + exit(0); + case 'a': + if (arg == "opengl") { + config->backend = Engine::Backend::OPENGL; + } else if (arg == "vulkan") { + config->backend = Engine::Backend::VULKAN; + } else if (arg == "metal") { + config->backend = Engine::Backend::METAL; + } else { + std::cerr << "Unrecognized backend. Must be 'opengl'|'vulkan'|'metal'." + << std::endl; + } + break; + } + } + + return optind; +} + +int main(int argc, char** argv) { + App app; + + app.boneDataPerPrimitive = FixedCapacityVector>(3); + app.boneDataPerPrimitiveMulti = FixedCapacityVector>(6); + app.bonesPerVertex = 8; + + Config config; + config.title = "skinning test with more than 4 bones per vertex"; + + handleCommandLineArgments(argc, argv, &config); + + size_t boneCount = app.bonesPerVertex; + float weight = 1.f / boneCount; + FixedCapacityVector boneDataPerVertex(boneCount); + for (size_t idx = 0; idx < boneCount; idx++) { + boneDataPerVertex[idx] = float2(idx, weight); + boneDataArray[idx] = float2(idx, weight); + boneDataArray[idx + boneCount] = float2(idx, weight); + boneDataArray[idx + 2 * boneCount] = float2(idx, weight); + boneDataArray[idx + 3 * boneCount] = float2(idx, weight); + boneDataArray[idx + 4 * boneCount] = float2(idx, weight); + boneDataArray[idx + 5 * boneCount] = float2(idx, weight); + } + + auto idx = 0; + app.boneDataPerPrimitive[idx++] = boneDataPerVertex; + app.boneDataPerPrimitive[idx++] = boneDataPerVertex; + app.boneDataPerPrimitive[idx++] = boneDataPerVertex; + + for (size_t vertex_idx = 0; vertex_idx < 6; vertex_idx++) { + boneCount = vertex_idx % app.bonesPerVertex + 1; + weight = 1.f / boneCount; + FixedCapacityVector boneDataPerVertex1(boneCount); + for (size_t idx = 0; idx < boneCount; idx++) { + boneDataPerVertex1[idx] = float2(idx, weight); + } + app.boneDataPerPrimitiveMulti[vertex_idx] = boneDataPerVertex1; + } + + auto setup = + [&app](Engine* engine, View* view, Scene* scene) { + app.skybox = Skybox::Builder().color({ 0.1, 0.125, 0.25, 1.0}) + .build(*engine); + + scene->setSkybox(app.skybox); + view->setPostProcessingEnabled(false); + static_assert(sizeof(Vertex) == 12, "Strange vertex size."); + + // primitives for renderable 0 ------------------------- + // primitive 0/1, triangle without skinning + app.vbs[app.vbCount] = VertexBuffer::Builder() + .vertexCount(3) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, + VertexBuffer::AttributeType::FLOAT2, 0, 12) + .attribute(VertexAttribute::COLOR, 0, + VertexBuffer::AttributeType::UBYTE4, 8, 12) + .normalized(VertexAttribute::COLOR) + .build(*engine); + app.vbs[app.vbCount]->setBufferAt(*engine, 0, + VertexBuffer::BufferDescriptor(TRIANGLE_VERTICES_1, 36, + nullptr)); + app.vbCount++; + + // primitive 0/2, triangle without skinning, buffer objects enabled + app.vbs[app.vbCount] = VertexBuffer::Builder() + .vertexCount(3) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, + VertexBuffer::AttributeType::FLOAT2, 0, 12) + .attribute(VertexAttribute::COLOR, 0, + VertexBuffer::AttributeType::UBYTE4, 8, 12) + .normalized(VertexAttribute::COLOR) + .enableBufferObjects() + .build(*engine); + app.bos[app.boCount] = BufferObject::Builder() + .size(3 * sizeof(Vertex)) + .build(*engine); + app.bos[app.boCount]->setBuffer(*engine, BufferObject::BufferDescriptor( + TRIANGLE_VERTICES_1 + 3, app.bos[app.boCount]->getByteCount(), + nullptr)); + app.vbs[app.vbCount]->setBufferObjectAt(*engine, 0, + app.bos[app.boCount]); + app.vbCount++; + app.boCount++; + + // primitives for renderable 1 ------------------------- + // primitive 1/1, triangle with skinning vertex attributes (only 4 bones), + // buffer object disabled + app.vbs[app.vbCount] = VertexBuffer::Builder() + .vertexCount(3) + .bufferCount(3) + .attribute(VertexAttribute::POSITION, 0, + VertexBuffer::AttributeType::FLOAT2, 0, 12) + .attribute(VertexAttribute::COLOR, 0, + VertexBuffer::AttributeType::UBYTE4, 8, 12) + .normalized(VertexAttribute::COLOR) + .attribute(VertexAttribute::BONE_INDICES, 1, + VertexBuffer::AttributeType::USHORT4, 0, 8) + .attribute(VertexAttribute::BONE_WEIGHTS, 2, + VertexBuffer::AttributeType::FLOAT4, 0, 16) + .build(*engine); + app.vbs[app.vbCount]->setBufferAt(*engine, 0, + VertexBuffer::BufferDescriptor(TRIANGLE_VERTICES_2, 36, + nullptr)); + app.vbs[app.vbCount]->setBufferAt(*engine, 1, + VertexBuffer::BufferDescriptor(skinJoints, 24, nullptr)); + app.vbs[app.vbCount]->setBufferAt(*engine, 2, + VertexBuffer::BufferDescriptor(skinWeights, 48, nullptr)); + app.vbCount++; + + // primitive 1/2, triangle with skinning vertex attributes (only 4 bones), + // buffer objects enabled + app.vbs[app.vbCount] = VertexBuffer::Builder() + .vertexCount(3) + .bufferCount(3) + .attribute(VertexAttribute::POSITION, 0, + VertexBuffer::AttributeType::FLOAT2, 0, 12) + .attribute(VertexAttribute::COLOR, 0, + VertexBuffer::AttributeType::UBYTE4, 8, 12) + .normalized(VertexAttribute::COLOR) + .attribute(VertexAttribute::BONE_INDICES, 1, + VertexBuffer::AttributeType::USHORT4, 0, 8) + .attribute(VertexAttribute::BONE_WEIGHTS, 2, + VertexBuffer::AttributeType::FLOAT4, 0, 16) + .enableBufferObjects() + .build(*engine); + app.bos[app.boCount] = BufferObject::Builder() + .size(3 * sizeof(Vertex)) + .build(*engine); + app.bos[app.boCount]->setBuffer(*engine, BufferObject::BufferDescriptor( + TRIANGLE_VERTICES_2 + 2, app.bos[app.boCount]->getByteCount(), + nullptr)); + app.vbs[app.vbCount]->setBufferObjectAt(*engine, 0, + app.bos[app.boCount]); + app.boCount++; + app.bos[app.boCount] = BufferObject::Builder() + .size(24) + .build(*engine); + app.bos[app.boCount]->setBuffer(*engine, BufferObject::BufferDescriptor( + skinJoints, app.bos[app.boCount]->getByteCount(), nullptr)); + app.vbs[app.vbCount]->setBufferObjectAt(*engine, 1, + app.bos[app.boCount]); + app.boCount++; + app.bos[app.boCount] = BufferObject::Builder() + .size(48) + .build(*engine); + app.bos[app.boCount]->setBuffer(*engine, BufferObject::BufferDescriptor( + skinWeights, app.bos[app.boCount]->getByteCount(), nullptr)); + app.vbs[app.vbCount]->setBufferObjectAt(*engine, 2, + app.bos[app.boCount]); + app.boCount++; + app.vbCount++; + + // primitives for renderable 2 ------------------------- + // primitive 2/1, triangle with advanced skinning, buffer objects enabled + app.vbs[app.vbCount] = VertexBuffer::Builder() + .vertexCount(3) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, + VertexBuffer::AttributeType::FLOAT2, 0, 12) + .attribute(VertexAttribute::COLOR, 0, + VertexBuffer::AttributeType::UBYTE4, 8, 12) + .normalized(VertexAttribute::COLOR) + .enableBufferObjects() + .advancedSkinning(true) + .build(*engine); + app.bos[app.boCount] = BufferObject::Builder() + .size(3 * sizeof(Vertex)) + .build(*engine); + app.bos[app.boCount]->setBuffer(*engine, BufferObject::BufferDescriptor( + TRIANGLE_VERTICES_3, app.bos[app.boCount]->getByteCount(), nullptr)); + app.vbs[app.vbCount]->setBufferObjectAt(*engine, 0, + app.bos[app.boCount]); + app.boCount++; + app.vbCount++; + + // primitive 2/2, triangle with advanced skinning, buffer objects enabled, for morph + app.vbs[app.vbCount] = VertexBuffer::Builder() + .vertexCount(3) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, + VertexBuffer::AttributeType::FLOAT2, 0, 12) + .attribute(VertexAttribute::COLOR, 0, + VertexBuffer::AttributeType::UBYTE4, 8, 12) + .normalized(VertexAttribute::COLOR) + .enableBufferObjects() + .advancedSkinning(true) + .build(*engine); + app.bos[app.boCount] = BufferObject::Builder() + .size(3 * sizeof(Vertex)) + .build(*engine); + app.bos[app.boCount]->setBuffer(*engine, BufferObject::BufferDescriptor( + TRIANGLE_VERTICES_3 + 1, app.bos[app.boCount]->getByteCount(), + nullptr)); + app.vbs[app.vbCount]->setBufferObjectAt(*engine, 0, + app.bos[app.boCount]); + app.boCount++; + app.vbCount++; + + // primitive 2/3, triangle with advanced skinning, buffer objects enabled, + app.vbs[app.vbCount] = VertexBuffer::Builder() + .vertexCount(3) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, + VertexBuffer::AttributeType::FLOAT2, 0, 12) + .attribute(VertexAttribute::COLOR, 0, + VertexBuffer::AttributeType::UBYTE4, 8, 12) + .normalized(VertexAttribute::COLOR) + .enableBufferObjects() + .advancedSkinning(true) + .build(*engine); + app.bos[app.boCount] = BufferObject::Builder() + .size(3 * sizeof(Vertex)) + .build(*engine); + app.bos[app.boCount]->setBuffer(*engine, BufferObject::BufferDescriptor( + TRIANGLE_VERTICES_3 + 2, app.bos[app.boCount]->getByteCount(), + nullptr)); + app.vbs[app.vbCount]->setBufferObjectAt(*engine, 0, + app.bos[app.boCount]); + app.boCount++; + app.vbCount++; + + // primitives for renderable 3 ------------------------- + // primitive 3/1, two triangles with advanced skinning, buffer objects enabled, + app.vbs[app.vbCount] = VertexBuffer::Builder() + .vertexCount(6) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, + VertexBuffer::AttributeType::FLOAT2, 0, 12) + .attribute(VertexAttribute::COLOR, 0, + VertexBuffer::AttributeType::UBYTE4, 8, 12) + .normalized(VertexAttribute::COLOR) + .enableBufferObjects() + .advancedSkinning(true) + .build(*engine); + app.bos[app.boCount] = BufferObject::Builder() + .size(6 * sizeof(Vertex)) + .build(*engine); + app.bos[app.boCount]->setBuffer(*engine, BufferObject::BufferDescriptor( + TRIANGLE_VERTICES_1, app.bos[app.boCount]->getByteCount(), + nullptr)); + app.vbs[app.vbCount]->setBufferObjectAt(*engine, 0, + app.bos[app.boCount]); + app.boCount++; + app.vbCount++; + // primitive 3/2, triangle with advanced skinning and morph, buffer objects enabled, + app.vbs[app.vbCount] = VertexBuffer::Builder() + .vertexCount(3) + .bufferCount(1) + .attribute(VertexAttribute::POSITION, 0, + VertexBuffer::AttributeType::FLOAT2, 0, 12) + .attribute(VertexAttribute::COLOR, 0, + VertexBuffer::AttributeType::UBYTE4, 8, 12) + .normalized(VertexAttribute::COLOR) + .enableBufferObjects() + .advancedSkinning(true) + .build(*engine); + app.bos[app.boCount] = BufferObject::Builder() + .size(3 * sizeof(Vertex)) + .build(*engine); + app.bos[app.boCount]->setBuffer(*engine, BufferObject::BufferDescriptor( + TRIANGLE_VERTICES_3 + 2, app.bos[app.boCount]->getByteCount(), + nullptr)); + app.vbs[app.vbCount]->setBufferObjectAt(*engine, 0, + app.bos[app.boCount]); + app.boCount++; + app.vbCount++; + + // Index buffer data + app.ib = IndexBuffer::Builder() + .indexCount(3) + .bufferType(IndexBuffer::IndexType::USHORT) + .build(*engine); + app.ib->setBuffer(*engine, + IndexBuffer::BufferDescriptor(TRIANGLE_INDICES, + 3 * sizeof(uint16_t),nullptr)); + + app.ib2 = IndexBuffer::Builder() + .indexCount(6) + .bufferType(IndexBuffer::IndexType::USHORT) + .build(*engine); + app.ib2->setBuffer(*engine, + IndexBuffer::BufferDescriptor(TRIANGLE_INDICES_2, + 6 * sizeof(uint16_t),nullptr)); + + app.mat = Material::Builder() + .package(RESOURCES_BAKEDCOLOR_DATA, RESOURCES_BAKEDCOLOR_SIZE) + .build(*engine); + +// Skinning buffer for renderable 2 + app.sb = SkinningBuffer::Builder() + .boneCount(9) + .initialize(true) + .build(*engine); + +// Skinning buffer common for renderable 3 + app.sb2 = SkinningBuffer::Builder() + .boneCount(9) + .initialize(true) + .build(*engine); + + app.sb->setBones(*engine, transforms,9,0); + +// Morph target definition to check combination bone skinning and blend shapes + app.mt = MorphTargetBuffer::Builder() + .vertexCount(9) + .count(3) + .build( *engine); + + app.mt->setPositionsAt(*engine,0, targets_pos, 3, 0); + app.mt->setPositionsAt(*engine,1, targets_pos+3, 3, 0); + app.mt->setPositionsAt(*engine,2, targets_pos+6, 3, 0); + app.mt->setTangentsAt(*engine,0, targets_tan, 9, 0); + app.mt->setTangentsAt(*engine,1, targets_tan, 9, 0); + app.mt->setTangentsAt(*engine,2, targets_tan, 9, 0); + +// renderable 0: no skinning +// primitive 0 = triangle, no skinning, no morph target +// primitive 1 = triangle, no skinning, morph target +// primitive 2 = triangle, no skinning, no morph target, buffer objects enabled +// primitive 3 = triangle, no skinning, morph target, buffer objects enabled + app.renderables[0] = EntityManager::get().create(); + RenderableManager::Builder(4) + .boundingBox({{ -1, -1, -1 }, + { 1, 1, 1 }}) + .material(0, app.mat->getDefaultInstance()) + .material(1, app.mat->getDefaultInstance()) + .material(2, app.mat->getDefaultInstance()) + .material(3, app.mat->getDefaultInstance()) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, + app.vbs[0], app.ib, 0, 3) + .geometry(1, RenderableManager::PrimitiveType::TRIANGLES, + app.vbs[0], app.ib, 0, 3) + .geometry(2, RenderableManager::PrimitiveType::TRIANGLES, + app.vbs[1], app.ib, 0, 3) + .geometry(3, RenderableManager::PrimitiveType::TRIANGLES, + app.vbs[1], app.ib, 0, 3) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .morphing(app.mt) + .morphing(0, 1, 0) + .morphing(0, 3, 0) + .build(*engine, app.renderables[0]); + +// renderable 1: attribute bone data definitions skinning +// primitive 0 = triangle with skinning and with morphing, bone data defined as vertex attributes (buffer object) +// primitive 1 = trinagle with skinning, bone data defined as vertex attributes +// primitive 3 = triangle with skinning, bone data defined as vertex attributes (buffer object) +// primitive 2 = triangle with skinning and with morphing, bone data defined as vertex attributes + app.renderables[1] = EntityManager::get().create(); + RenderableManager::Builder(4) + .boundingBox({{ -1, -1, -1 }, + { 1, 1, 1 }}) + .material(0, app.mat->getDefaultInstance()) + .material(1, app.mat->getDefaultInstance()) + .material(2, app.mat->getDefaultInstance()) + .material(3, app.mat->getDefaultInstance()) + .geometry(1, RenderableManager::PrimitiveType::TRIANGLES, + app.vbs[2], app.ib, 0, 3) + .geometry(2, RenderableManager::PrimitiveType::TRIANGLES, + app.vbs[2], app.ib, 0, 3) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, + app.vbs[3], app.ib, 0, 3) + .geometry(3, RenderableManager::PrimitiveType::TRIANGLES, + app.vbs[3], app.ib, 0, 3) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .enableSkinningBuffers(true) + .skinning(app.sb, 9, 0) + .morphing(app.mt) + .morphing(0, 2, 0) + .morphing(0, 0, 0) + .build(*engine, app.renderables[1]); + +// renderable 2: various ways of skinning definitions +// primitive 0 = skinned triangle, advanced bone data defined as array per primitive, +// primitive 1 = skinned triangle, advanced bone data defined as vector per primitive, +// primitive 2 = triangle with skinning and with morphing, advanced bone data +// defined as vector per primitive + app.renderables[2] = EntityManager::get().create(); + RenderableManager::Builder(3) + .boundingBox({{ -1, -1, -1 }, + { 1, 1, 1 }}) + .material(0, app.mat->getDefaultInstance()) + .material(1, app.mat->getDefaultInstance()) + .material(2, app.mat->getDefaultInstance()) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, + app.vbs[4], app.ib, 0, 3) + .geometry(1, RenderableManager::PrimitiveType::TRIANGLES, + app.vbs[5], app.ib, 0, 3) + .geometry(2, RenderableManager::PrimitiveType::TRIANGLES, + app.vbs[6], app.ib, 0, 3) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .enableSkinningBuffers(true) + .skinning(app.sb, 9, 0) + + .boneIndicesAndWeights(0, boneDataArray, + 3 * app.bonesPerVertex, app.bonesPerVertex) + .boneIndicesAndWeights(1, app.boneDataPerPrimitive) + .boneIndicesAndWeights(2, app.boneDataPerPrimitive) + + .morphing(app.mt) + .morphing(0, 2, 0) + .build(*engine, app.renderables[2]); + +// renderable 3: combination attribute and advance bone data +// primitive 0 = triangle with skinning and morphing, bone data defined as vertex attributes +// primitive 1 = skinning of two triangles, advanced bone data defined as vector per primitive, +// various number of bones per vertex 1, 2, ... 6 +// primitive 2 = triangle with skinning and morphing, advanced bone data defined +// as vector per primitive + app.renderables[3] = EntityManager::get().create(); + RenderableManager::Builder(3) + .boundingBox({{ -1, -1, -1 }, + { 1, 1, 1 }}) + .material(0, app.mat->getDefaultInstance()) + .material(1, app.mat->getDefaultInstance()) + .material(2, app.mat->getDefaultInstance()) + .geometry(0, RenderableManager::PrimitiveType::TRIANGLES, + app.vbs[2], app.ib, 0, 3) + .geometry(1, RenderableManager::PrimitiveType::TRIANGLES, + app.vbs[7], app.ib2, 0, 6) + .geometry(2, RenderableManager::PrimitiveType::TRIANGLES, + app.vbs[8], app.ib, 0, 3) + .culling(false) + .receiveShadows(false) + .castShadows(false) + .enableSkinningBuffers(true) + .skinning(app.sb, 9, 0) + .boneIndicesAndWeights(1, app.boneDataPerPrimitiveMulti) + .boneIndicesAndWeights(2, app.boneDataPerPrimitive) + .morphing(app.mt) + .morphing(0, 0, 0) + .morphing(0, 2, 0) + .build(*engine, app.renderables[3]); + + scene->addEntity(app.renderables[0]); + scene->addEntity(app.renderables[1]); + scene->addEntity(app.renderables[2]); + scene->addEntity(app.renderables[3]); + app.camera = EntityManager::get().create(); + app.cam = engine->createCamera(app.camera); + view->setCamera(app.cam); + }; + + auto cleanup = [&app](Engine* engine, View*, Scene*) { + engine->destroy(app.skybox); + engine->destroy(app.mat); + engine->destroy(app.ib); + engine->destroy(app.ib2); + engine->destroy(app.sb); + engine->destroy(app.sb2); + engine->destroy(app.mt); + engine->destroyCameraComponent(app.camera); + EntityManager::get().destroy(app.camera); + for (auto i = 0; i < app.vbCount; i++) { + engine->destroy(app.vbs[i]); + } + for ( auto i = 0; i < app.boCount; i++) { + engine->destroy(app.bos[i]); + } + for ( auto i = 0; i < 4; i++) { + engine->destroy(app.renderables[i]); + } + }; + + FilamentApp::get().animate([&app](Engine* engine, View* view, double now) { + constexpr float ZOOM = 1.5f; + const uint32_t w = view->getViewport().width; + const uint32_t h = view->getViewport().height; + const float aspect = (float) w / h; + app.cam->setProjection(Camera::Projection::ORTHO, + -aspect * ZOOM, aspect * ZOOM, + -ZOOM, ZOOM, 0, 1); + + auto& rm = engine->getRenderableManager(); + + // Bone skinning animation for more than four bones per vertex + float t = (float)(now - (int)now); + size_t offset = ((size_t)now) % 9; + float s = sin(t * f::PI * 2.f) * 10; + mat4f trans[9] = {}; + for (size_t i = 0; i < 9; i++) { + trans[i] = filament::math::mat4f(1); + } + mat4f trans2[9] = {}; + for (size_t i = 0; i < 9; i++) { + trans2[i] = filament::math::mat4f(1); + } + mat4f transA[] = { + mat4f::scaling(float3(s / 10.f,s / 10.f, 1.f)), + mat4f::translation(float3(s, 0, 0)), + mat4f::translation(float3(s, s, 0)), + mat4f::translation(float3(0, s, 0)), + mat4f::translation(float3(-s, s, 0)), + mat4f::translation(float3(-s, 0, 0)), + mat4f::translation(float3(-s, -s, 0)), + mat4f::translation(float3(0, -s, 0)), + mat4f::translation(float3(s, -s, 0)), + filament::math::mat4f(1)}; + trans[offset] = transA[offset]; + trans2[offset] = transA[(offset + 3) % 9]; + + app.sb->setBones(*engine,trans, 9, 0); + app.sb2->setBones(*engine,trans2, 9, 0); + + // Morph targets (blendshapes) animation + float z = (float)(sin(now)/2.f + 0.5f); + float weights[] = { 1 - z, 0, z}; + rm.setMorphWeights(rm.getInstance(app.renderables[0]), weights, 3, 0); + rm.setMorphWeights(rm.getInstance(app.renderables[1]), weights, 3, 0); + rm.setMorphWeights(rm.getInstance(app.renderables[2]), weights, 3, 0); + rm.setMorphWeights(rm.getInstance(app.renderables[3]), weights, 3, 0); + }); + + FilamentApp::get().run(config, setup, cleanup); + + return 0; +} diff --git a/shaders/CMakeLists.txt b/shaders/CMakeLists.txt index d6b62d9346e..dbabd77ab38 100644 --- a/shaders/CMakeLists.txt +++ b/shaders/CMakeLists.txt @@ -12,7 +12,6 @@ endif() # ================================================================================================== set(SHADERS src/ambient_occlusion.fs - src/attributes.vs src/brdf.fs src/common_defines.glsl src/common_getters.glsl diff --git a/shaders/src/ambient_occlusion.fs b/shaders/src/ambient_occlusion.fs index 32f6421986e..54acfd0f8b3 100644 --- a/shaders/src/ambient_occlusion.fs +++ b/shaders/src/ambient_occlusion.fs @@ -35,18 +35,18 @@ float evaluateSSAO(inout SSAOInterpolationCache cache) { // filter. This adds about 2.0ms @ 250MHz on Pixel 4. if (frameUniforms.aoSamplingQualityAndEdgeDistance > 0.0) { - highp vec2 size = vec2(textureSize(light_ssao, 0)); + highp vec2 size = vec2(textureSize(sampler0_ssao, 0)); // Read four AO samples and their depths values #if defined(FILAMENT_HAS_FEATURE_TEXTURE_GATHER) - vec4 ao = textureGather(light_ssao, vec3(cache.uv, 0.0), 0); - vec4 dg = textureGather(light_ssao, vec3(cache.uv, 0.0), 1); - vec4 db = textureGather(light_ssao, vec3(cache.uv, 0.0), 2); + vec4 ao = textureGather(sampler0_ssao, vec3(cache.uv, 0.0), 0); + vec4 dg = textureGather(sampler0_ssao, vec3(cache.uv, 0.0), 1); + vec4 db = textureGather(sampler0_ssao, vec3(cache.uv, 0.0), 2); #else - vec3 s01 = textureLodOffset(light_ssao, vec3(cache.uv, 0.0), 0.0, ivec2(0, 1)).rgb; - vec3 s11 = textureLodOffset(light_ssao, vec3(cache.uv, 0.0), 0.0, ivec2(1, 1)).rgb; - vec3 s10 = textureLodOffset(light_ssao, vec3(cache.uv, 0.0), 0.0, ivec2(1, 0)).rgb; - vec3 s00 = textureLodOffset(light_ssao, vec3(cache.uv, 0.0), 0.0, ivec2(0, 0)).rgb; + vec3 s01 = textureLodOffset(sampler0_ssao, vec3(cache.uv, 0.0), 0.0, ivec2(0, 1)).rgb; + vec3 s11 = textureLodOffset(sampler0_ssao, vec3(cache.uv, 0.0), 0.0, ivec2(1, 1)).rgb; + vec3 s10 = textureLodOffset(sampler0_ssao, vec3(cache.uv, 0.0), 0.0, ivec2(1, 0)).rgb; + vec3 s00 = textureLodOffset(sampler0_ssao, vec3(cache.uv, 0.0), 0.0, ivec2(0, 0)).rgb; vec4 ao = vec4(s01.r, s11.r, s10.r, s00.r); vec4 dg = vec4(s01.g, s11.g, s10.g, s00.g); vec4 db = vec4(s01.b, s11.b, s10.b, s00.b); @@ -74,7 +74,7 @@ float evaluateSSAO(inout SSAOInterpolationCache cache) { cache.weights = w / (w.x + w.y + w.z + w.w); return dot(ao, cache.weights); } else { - return textureLod(light_ssao, vec3(cache.uv, 0.0), 0.0).r; + return textureLod(sampler0_ssao, vec3(cache.uv, 0.0), 0.0).r; } #else // SSAO is not applied when blending is enabled @@ -160,14 +160,14 @@ float specularAO(float NoV, float visibility, float roughness, const in SSAOInte vec3 bn; if (frameUniforms.aoSamplingQualityAndEdgeDistance > 0.0) { #if defined(FILAMENT_HAS_FEATURE_TEXTURE_GATHER) - vec4 bnr = textureGather(light_ssao, vec3(cache.uv, 1.0), 0); - vec4 bng = textureGather(light_ssao, vec3(cache.uv, 1.0), 1); - vec4 bnb = textureGather(light_ssao, vec3(cache.uv, 1.0), 2); + vec4 bnr = textureGather(sampler0_ssao, vec3(cache.uv, 1.0), 0); + vec4 bng = textureGather(sampler0_ssao, vec3(cache.uv, 1.0), 1); + vec4 bnb = textureGather(sampler0_ssao, vec3(cache.uv, 1.0), 2); #else - vec3 s01 = textureLodOffset(light_ssao, vec3(cache.uv, 1.0), 0.0, ivec2(0, 1)).rgb; - vec3 s11 = textureLodOffset(light_ssao, vec3(cache.uv, 1.0), 0.0, ivec2(1, 1)).rgb; - vec3 s10 = textureLodOffset(light_ssao, vec3(cache.uv, 1.0), 0.0, ivec2(1, 0)).rgb; - vec3 s00 = textureLodOffset(light_ssao, vec3(cache.uv, 1.0), 0.0, ivec2(0, 0)).rgb; + vec3 s01 = textureLodOffset(sampler0_ssao, vec3(cache.uv, 1.0), 0.0, ivec2(0, 1)).rgb; + vec3 s11 = textureLodOffset(sampler0_ssao, vec3(cache.uv, 1.0), 0.0, ivec2(1, 1)).rgb; + vec3 s10 = textureLodOffset(sampler0_ssao, vec3(cache.uv, 1.0), 0.0, ivec2(1, 0)).rgb; + vec3 s00 = textureLodOffset(sampler0_ssao, vec3(cache.uv, 1.0), 0.0, ivec2(0, 0)).rgb; vec4 bnr = vec4(s01.r, s11.r, s10.r, s00.r); vec4 bng = vec4(s01.g, s11.g, s10.g, s00.g); vec4 bnb = vec4(s01.b, s11.b, s10.b, s00.b); @@ -176,7 +176,7 @@ float specularAO(float NoV, float visibility, float roughness, const in SSAOInte bn.g = dot(bng, cache.weights); bn.b = dot(bnb, cache.weights); } else { - bn = textureLod(light_ssao, vec3(cache.uv, 1.0), 0.0).xyz; + bn = textureLod(sampler0_ssao, vec3(cache.uv, 1.0), 0.0).xyz; } bn = unpackBentNormal(bn); diff --git a/shaders/src/attributes.vs b/shaders/src/attributes.vs deleted file mode 100644 index 2ad12cdc759..00000000000 --- a/shaders/src/attributes.vs +++ /dev/null @@ -1,61 +0,0 @@ -//------------------------------------------------------------------------------ -// Attributes -//------------------------------------------------------------------------------ - -layout(location = LOCATION_POSITION) in vec4 mesh_position; - -#if defined(HAS_ATTRIBUTE_TANGENTS) -layout(location = LOCATION_TANGENTS) in vec4 mesh_tangents; -#endif - -#if defined(HAS_ATTRIBUTE_COLOR) -layout(location = LOCATION_COLOR) in vec4 mesh_color; -#endif - -#if defined(HAS_ATTRIBUTE_UV0) -layout(location = LOCATION_UV0) in vec2 mesh_uv0; -#endif - -#if defined(HAS_ATTRIBUTE_UV1) -layout(location = LOCATION_UV1) in vec2 mesh_uv1; -#endif - -#if defined(HAS_ATTRIBUTE_BONE_INDICES) -layout(location = LOCATION_BONE_INDICES) in uvec4 mesh_bone_indices; -#endif - -#if defined(HAS_ATTRIBUTE_BONE_WEIGHTS) -layout(location = LOCATION_BONE_WEIGHTS) in vec4 mesh_bone_weights; -#endif - -#if defined(HAS_ATTRIBUTE_CUSTOM0) -layout(location = LOCATION_CUSTOM0) in vec4 mesh_custom0; -#endif - -#if defined(HAS_ATTRIBUTE_CUSTOM1) -layout(location = LOCATION_CUSTOM1) in vec4 mesh_custom1; -#endif - -#if defined(HAS_ATTRIBUTE_CUSTOM2) -layout(location = LOCATION_CUSTOM2) in vec4 mesh_custom2; -#endif - -#if defined(HAS_ATTRIBUTE_CUSTOM3) -layout(location = LOCATION_CUSTOM3) in vec4 mesh_custom3; -#endif - -#if defined(HAS_ATTRIBUTE_CUSTOM4) -layout(location = LOCATION_CUSTOM4) in vec4 mesh_custom4; -#endif - -#if defined(HAS_ATTRIBUTE_CUSTOM5) -layout(location = LOCATION_CUSTOM5) in vec4 mesh_custom5; -#endif - -#if defined(HAS_ATTRIBUTE_CUSTOM6) -layout(location = LOCATION_CUSTOM6) in vec4 mesh_custom6; -#endif - -#if defined(HAS_ATTRIBUTE_CUSTOM7) -layout(location = LOCATION_CUSTOM7) in vec4 mesh_custom7; -#endif diff --git a/shaders/src/brdf.fs b/shaders/src/brdf.fs index f4204cf44de..2f4d1522555 100644 --- a/shaders/src/brdf.fs +++ b/shaders/src/brdf.fs @@ -181,6 +181,16 @@ vec3 fresnel(const vec3 f0, float LoH) { #endif } +vec3 fresnel(const vec3 f0, const float f90, float LoH) { +#if BRDF_SPECULAR_F == SPECULAR_F_SCHLICK +#if FILAMENT_QUALITY == FILAMENT_QUALITY_LOW + return F_Schlick(f0, LoH); // f90 = 1.0 +#else + return F_Schlick(f0, f90, LoH); +#endif +#endif +} + float distributionAnisotropic(float at, float ab, float ToH, float BoH, float NoH) { #if BRDF_ANISOTROPIC_D == SPECULAR_D_GGX_ANISOTROPIC return D_GGX_Anisotropic(at, ab, ToH, BoH, NoH); diff --git a/shaders/src/common_defines.glsl b/shaders/src/common_defines.glsl index a28a6da7ccf..eb855244105 100644 --- a/shaders/src/common_defines.glsl +++ b/shaders/src/common_defines.glsl @@ -22,3 +22,13 @@ #define float3x3 mat3 #define float4x4 mat4 + +// To workaround an adreno crash (#5294), we need ensure that a method with +// parameter 'const mat4' does not call another method also with a 'const mat4' +// parameter (i.e. mulMat4x4Float3). So we remove the const modifier for +// materials compiled for vulkan+mobile. +#if defined(TARGET_VULKAN_ENVIRONMENT) && defined(TARGET_MOBILE) + #define highp_mat4 highp mat4 +#else + #define highp_mat4 const highp mat4 +#endif diff --git a/shaders/src/common_getters.glsl b/shaders/src/common_getters.glsl index 4ee94e5df99..23a365549af 100644 --- a/shaders/src/common_getters.glsl +++ b/shaders/src/common_getters.glsl @@ -24,7 +24,14 @@ highp mat4 getViewFromClipMatrix() { /** @public-api */ highp mat4 getClipFromWorldMatrix() { - return frameUniforms.clipFromWorldMatrix; +#if defined(VARIANT_HAS_STEREO) && defined(FILAMENT_STEREO_INSTANCED) + int eye = instance_index % CONFIG_STEREO_EYE_COUNT; + return frameUniforms.clipFromWorldMatrix[eye]; +#elif defined(VARIANT_HAS_STEREO) && defined(FILAMENT_STEREO_MULTIVIEW) + return frameUniforms.clipFromWorldMatrix[gl_ViewID_OVR]; +#else + return frameUniforms.clipFromWorldMatrix[0]; +#endif } /** @public-api */ @@ -32,6 +39,11 @@ highp mat4 getWorldFromClipMatrix() { return frameUniforms.worldFromClipMatrix; } +/** @public-api */ +highp mat4 getUserWorldFromWorldMatrix() { + return frameUniforms.userWorldFromWorldMatrix; +} + /** @public-api */ float getTime() { return frameUniforms.time; @@ -70,10 +82,6 @@ highp vec2 uvToRenderTargetUV(const highp vec2 uv) { // TODO: below shouldn't be accessible from post-process materials -#define FILAMENT_OBJECT_SKINNING_ENABLED_BIT 0x100u -#define FILAMENT_OBJECT_MORPHING_ENABLED_BIT 0x200u -#define FILAMENT_OBJECT_CONTACT_SHADOWS_BIT 0x400u - /** @public-api */ highp vec4 getResolution() { return frameUniforms.resolution; @@ -81,12 +89,12 @@ highp vec4 getResolution() { /** @public-api */ highp vec3 getWorldCameraPosition() { - return frameUniforms.cameraPosition; + return frameUniforms.worldFromViewMatrix[3].xyz; } -/** @public-api */ +/** @public-api, @deprecated use getUserWorldPosition() or getUserWorldFromWorldMatrix() instead */ highp vec3 getWorldOffset() { - return frameUniforms.worldOffset; + return getUserWorldFromWorldMatrix()[3].xyz; } /** @public-api */ @@ -100,3 +108,23 @@ float getExposure() { float getEV100() { return frameUniforms.ev100; } + +//------------------------------------------------------------------------------ +// user defined globals +//------------------------------------------------------------------------------ + +highp vec4 getMaterialGlobal0() { + return frameUniforms.custom[0]; +} + +highp vec4 getMaterialGlobal1() { + return frameUniforms.custom[1]; +} + +highp vec4 getMaterialGlobal2() { + return frameUniforms.custom[2]; +} + +highp vec4 getMaterialGlobal3() { + return frameUniforms.custom[3]; +} diff --git a/shaders/src/common_graphics.fs b/shaders/src/common_graphics.fs index 032686f4c49..3cebbb4d55a 100644 --- a/shaders/src/common_graphics.fs +++ b/shaders/src/common_graphics.fs @@ -110,22 +110,3 @@ vec3 heatmap(float v) { vec3 r = v * 2.1 - vec3(1.8, 1.14, 0.3); return 1.0 - r * r; } - -vec3 uintToColorDebug(uint v) { - if (v == 0u) { - return vec3(0.0, 1.0, 0.0); // green - } else if (v == 1u) { - return vec3(0.0, 0.0, 1.0); // blue - } else if (v == 2u) { - return vec3(1.0, 1.0, 0.0); // yellow - } else if (v == 3u) { - return vec3(1.0, 0.0, 0.0); // red - } else if (v == 4u) { - return vec3(1.0, 0.0, 1.0); // purple - } else if (v == 5u) { - return vec3(0.0, 1.0, 1.0); // cyan - } - - // fallback to handle "not all code-paths return" warnings - return vec3(0.0, 0.0, 0.0); -} diff --git a/shaders/src/common_instancing.glsl b/shaders/src/common_instancing.glsl index 3ed14541be2..16763231f02 100644 --- a/shaders/src/common_instancing.glsl +++ b/shaders/src/common_instancing.glsl @@ -2,34 +2,54 @@ // Instancing // ------------------------------------------------------------------------------------------------ -PerRenderableData object_uniforms; - -void initObjectUniforms(out PerRenderableData p) { -#if defined(MATERIAL_HAS_INSTANCES) - // the material manages instancing, all instances share the same uniform block. - p = objectUniforms.data[0]; -#else - // automatic instancing was used, each instance has its own uniform block. - - // We're copying each field separately to workaround an issue in some Adreno drivers - // that fail on non-const array access in a UBO. Accessing the fields works however. - // e.g.: this fails `p = objectUniforms.data[instance_index];` - p.worldFromModelMatrix = objectUniforms.data[instance_index].worldFromModelMatrix; - p.worldFromModelNormalMatrix = objectUniforms.data[instance_index].worldFromModelNormalMatrix; - p.morphTargetCount = objectUniforms.data[instance_index].morphTargetCount; - p.flagsChannels = objectUniforms.data[instance_index].flagsChannels; - p.objectId = objectUniforms.data[instance_index].objectId; - p.userData = objectUniforms.data[instance_index].userData; -#endif -} +highp mat4 object_uniforms_worldFromModelMatrix; +highp mat3 object_uniforms_worldFromModelNormalMatrix; +highp int object_uniforms_morphTargetCount; +highp int object_uniforms_flagsChannels; // see packFlags() below (0x00000fll) +highp int object_uniforms_objectId; // used for picking +highp float object_uniforms_userData; // TODO: We need a better solution, this currently holds the average local scale for the renderable //------------------------------------------------------------------------------ // Instance access //------------------------------------------------------------------------------ -#if defined(MATERIAL_HAS_INSTANCES) +void initObjectUniforms() { + // Adreno drivers workarounds: + // - We need to copy each field separately because non-const array access in a UBO fails + // e.g.: this fails `p = objectUniforms.data[instance_index];` + // - We can't use a struct to hold the result because Adreno driver ignore precision qualifiers + // on fields of structs, unless they're in a UBO (which we just copied out of). + +#if defined(FILAMENT_HAS_FEATURE_INSTANCING) + highp int i; +# if defined(MATERIAL_HAS_INSTANCES) + // instancing handled by the material + if ((objectUniforms.data[0].flagsChannels & FILAMENT_OBJECT_INSTANCE_BUFFER_BIT) != 0) { + // hybrid instancing, we have a instance buffer per object + i = logical_instance_index; + } else { + // fully manual instancing + i = 0; + } +# else + // automatic instancing + i = logical_instance_index; +# endif +#else + // we don't support instancing (e.g. ES2) + const int i = 0; +#endif + object_uniforms_worldFromModelMatrix = objectUniforms.data[i].worldFromModelMatrix; + object_uniforms_worldFromModelNormalMatrix = objectUniforms.data[i].worldFromModelNormalMatrix; + object_uniforms_morphTargetCount = objectUniforms.data[i].morphTargetCount; + object_uniforms_flagsChannels = objectUniforms.data[i].flagsChannels; + object_uniforms_objectId = objectUniforms.data[i].objectId; + object_uniforms_userData = objectUniforms.data[i].userData; +} + +#if defined(FILAMENT_HAS_FEATURE_INSTANCING) && defined(MATERIAL_HAS_INSTANCES) /** @public-api */ -int getInstanceIndex() { - return instance_index; +highp int getInstanceIndex() { + return logical_instance_index; } #endif diff --git a/shaders/src/common_lighting.fs b/shaders/src/common_lighting.fs index d4ff7489487..43df890838d 100644 --- a/shaders/src/common_lighting.fs +++ b/shaders/src/common_lighting.fs @@ -9,8 +9,8 @@ struct Light { bool castsShadows; bool contactShadows; uint type; - uint shadowIndex; - uint channels; + int shadowIndex; + int channels; }; struct PixelParams { @@ -18,6 +18,11 @@ struct PixelParams { float perceptualRoughness; float perceptualRoughnessUnclamped; vec3 f0; +#if defined(MATERIAL_HAS_SPECULAR_COLOR_FACTOR) || defined(MATERIAL_HAS_SPECULAR_FACTOR) + float f90; + float specular; + vec3 specularColor; +#endif float roughness; vec3 dfg; vec3 energyCompensation; diff --git a/shaders/src/common_math.glsl b/shaders/src/common_math.glsl index 98b205f65dc..28d04685d16 100644 --- a/shaders/src/common_math.glsl +++ b/shaders/src/common_math.glsl @@ -19,7 +19,6 @@ #endif #define saturate(x) clamp(x, 0.0, 1.0) -#define atan2(x, y) atan(y, x) //------------------------------------------------------------------------------ // Scalar operations diff --git a/shaders/src/common_shading.fs b/shaders/src/common_shading.fs index ae1c4ab6f94..c95a99e7b69 100644 --- a/shaders/src/common_shading.fs +++ b/shaders/src/common_shading.fs @@ -3,6 +3,7 @@ highp mat3 shading_tangentToWorld; // TBN matrix highp vec3 shading_position; // position of the fragment in world space vec3 shading_view; // normalized vector from the fragment to the eye +#if defined(HAS_ATTRIBUTE_TANGENTS) vec3 shading_normal; // normalized transformed normal, in world space vec3 shading_geometricNormal; // normalized geometric normal, in world space vec3 shading_reflected; // reflection of view about normal @@ -15,5 +16,6 @@ highp vec3 shading_position; // position of the fragment in world space #if defined(MATERIAL_HAS_CLEAR_COAT) vec3 shading_clearCoatNormal; // normalized clear coat layer normal, in world space #endif +#endif highp vec2 shading_normalizedViewportCoord; diff --git a/shaders/src/common_shadowing.glsl b/shaders/src/common_shadowing.glsl index f8823473132..66ee6320e99 100644 --- a/shaders/src/common_shadowing.glsl +++ b/shaders/src/common_shadowing.glsl @@ -12,7 +12,7 @@ */ highp vec4 computeLightSpacePosition(highp vec3 p, const highp vec3 n, - const highp vec3 dir, const float b, const highp mat4 lightFromWorldMatrix) { + const highp vec3 dir, const float b, highp_mat4 lightFromWorldMatrix) { #if !defined(VARIANT_HAS_VSM) highp float cosTheta = saturate(dot(n, dir)); diff --git a/shaders/src/common_types.glsl b/shaders/src/common_types.glsl index 76ca98705fa..3208c1ba955 100644 --- a/shaders/src/common_types.glsl +++ b/shaders/src/common_types.glsl @@ -1,5 +1,6 @@ +#if defined(VARIANT_HAS_SHADOWING) // Adreno drivers seem to ignore precision qualifiers in structs, unless they're used in -// UBOs, which is is the case here. +// UBOs, which is the case here. struct ShadowData { highp mat4 lightFromWorldMatrix; highp vec4 lightFromWorldZ; @@ -13,18 +14,28 @@ struct ShadowData { mediump uint reserved1; mediump uint reserved2; }; +#endif +#if defined(VARIANT_HAS_SKINNING_OR_MORPHING) struct BoneData { highp mat3x4 transform; // bone transform is mat4x3 stored in row-major (last row [0,0,0,1]) - highp uvec4 cof; // 8 first cofactor matrix of transform's upper left + highp float3 cof0; // 3 first cofactor matrix of transform's upper left + highp float cof1x; // 4th cofactor }; +#endif struct PerRenderableData { highp mat4 worldFromModelMatrix; highp mat3 worldFromModelNormalMatrix; - highp uint morphTargetCount; - highp uint flagsChannels; // see packFlags() below (0x00000fll) - highp uint objectId; // used for picking + highp int morphTargetCount; + highp int flagsChannels; // see packFlags() below (0x00000fll) + highp int objectId; // used for picking highp float userData; // TODO: We need a better solution, this currently holds the average local scale for the renderable highp vec4 reserved[8]; }; + +// Bits for flagsChannels +#define FILAMENT_OBJECT_SKINNING_ENABLED_BIT 0x100 +#define FILAMENT_OBJECT_MORPHING_ENABLED_BIT 0x200 +#define FILAMENT_OBJECT_CONTACT_SHADOWS_BIT 0x400 +#define FILAMENT_OBJECT_INSTANCE_BUFFER_BIT 0x800 diff --git a/shaders/src/depth_main.fs b/shaders/src/depth_main.fs index 4d7455a4af8..e50d7620f17 100644 --- a/shaders/src/depth_main.fs +++ b/shaders/src/depth_main.fs @@ -1,7 +1,15 @@ #if defined(VARIANT_HAS_VSM) -layout(location = 0) out vec4 fragColor; +layout(location = 0) out highp vec4 fragColor; #elif defined(VARIANT_HAS_PICKING) -layout(location = 0) out highp uint2 outPicking; +# if __VERSION__ == 100 +highp vec4 outPicking; +# else +# if MATERIAL_FEATURE_LEVEL == 0 +layout(location = 0) out highp vec4 outPicking; +# else +layout(location = 0) out highp vec2 outPicking; +# endif +# endif #else // not color output #endif @@ -17,7 +25,9 @@ highp vec2 computeDepthMomentsVSM(const highp float depth); void main() { filament_lodBias = frameUniforms.lodBias; -#if defined(BLEND_MODE_MASKED) || ((defined(BLEND_MODE_TRANSPARENT) || defined(BLEND_MODE_FADE)) && defined(MATERIAL_HAS_TRANSPARENT_SHADOW)) + initObjectUniforms(); + +#if defined(MATERIAL_HAS_CUSTOM_DEPTH) || defined(BLEND_MODE_MASKED) || ((defined(BLEND_MODE_TRANSPARENT) || defined(BLEND_MODE_FADE)) && defined(MATERIAL_HAS_TRANSPARENT_SHADOW)) MaterialInputs inputs; initMaterial(inputs); material(inputs); @@ -47,8 +57,18 @@ void main() { fragColor.xy = computeDepthMomentsVSM(depth); fragColor.zw = computeDepthMomentsVSM(-1.0 / depth); // requires at least RGBA16F #elif defined(VARIANT_HAS_PICKING) - outPicking.x = object_uniforms.objectId; - outPicking.y = floatBitsToUint(vertex_position.z / vertex_position.w); +#if FILAMENT_EFFECTIVE_VERSION == 100 + outPicking.a = mod(float(object_uniforms_objectId / 65536), 256.0) / 255.0; + outPicking.b = mod(float(object_uniforms_objectId / 256), 256.0) / 255.0; + outPicking.g = mod(float(object_uniforms_objectId) , 256.0) / 255.0; + outPicking.r = vertex_position.z / vertex_position.w; +#else + outPicking.x = intBitsToFloat(object_uniforms_objectId); + outPicking.y = vertex_position.z / vertex_position.w; +#endif +#if __VERSION__ == 100 + gl_FragData[0] = outPicking; +#endif #else // that's it #endif diff --git a/shaders/src/fog.fs b/shaders/src/fog.fs index be347b4e321..d724db11750 100644 --- a/shaders/src/fog.fs +++ b/shaders/src/fog.fs @@ -1,62 +1,98 @@ //------------------------------------------------------------------------------ // Fog +// see: Real-time Atmospheric Effects in Games (Carsten Wenzel) //------------------------------------------------------------------------------ -vec4 fog(vec4 color, vec3 view) { - if (frameUniforms.fogDensity > 0.0) { - float A = frameUniforms.fogDensity; - float B = frameUniforms.fogHeightFalloff; +vec4 fog(vec4 color, highp vec3 view) { + // note: d can be +inf with the skybox + highp float d = length(view); - float d = length(view); + // early exit for object "in front" of the fog + if (d < frameUniforms.fogStart) { + return color; + } + + // fogCutOffDistance is set to +inf to disable the cutoff distance + if (d > frameUniforms.fogCutOffDistance) { + return color; + } - float h = max(0.001, view.y); - // The function below is continuous at h=0, so to avoid a divide-by-zero, we just clamp h - float fogIntegralFunctionOfDistance = A * ((1.0 - exp(-B * h)) / h); - float fogIntegral = fogIntegralFunctionOfDistance * max(d - frameUniforms.fogStart, 0.0); - float fogOpacity = max(1.0 - exp2(-fogIntegral), 0.0); + // .x = density + // .y = -fallof*(y-height) + // .z = density * exp(-fallof*(y-height)) + highp vec3 density = frameUniforms.fogDensity; - // don't go above requested max opacity - fogOpacity = min(fogOpacity, frameUniforms.fogMaxOpacity); + // height falloff [1/m] + highp float falloff = frameUniforms.fogHeightFalloff; + + // Compute the fog's optical path (unitless) at a distance of 1m at a given height. + highp float fogOpticalPathAtOneMeter = density.z; + highp float fh = falloff * view.y; + if (abs(fh) > 0.00125) { + // The function below is continuous at fh=0, so to avoid a divide-by-zero, we just clamp fh + fogOpticalPathAtOneMeter = (density.z - density.x * exp(density.y - fh)) / fh; + } - // compute fog color - vec3 fogColor = frameUniforms.fogColor; + // Compute the integral of the fog density at a given height from fogStart to the fragment + highp float fogOpticalPath = fogOpticalPathAtOneMeter * max(d - frameUniforms.fogStart, 0.0); - if (frameUniforms.fogColorFromIbl > 0.0) { - // get fog color from envmap - float lod = frameUniforms.iblRoughnessOneLevel; - fogColor *= textureLod(light_iblSpecular, view, lod).rgb * frameUniforms.iblLuminance; - } + // Compute the transmittance [0,1] using the Beer-Lambert Law + float fogTransmittance = exp(-fogOpticalPath); - fogColor *= fogOpacity; - if (frameUniforms.fogInscatteringSize > 0.0) { - // compute a new line-integral for a different start distance - float inscatteringIntegral = fogIntegralFunctionOfDistance * - max(d - frameUniforms.fogInscatteringStart, 0.0); - float inscatteringOpacity = max(1.0 - exp2(-inscatteringIntegral), 0.0); + // Compute the opacity from the transmittance + float fogOpacity = min(1.0 - fogTransmittance, frameUniforms.fogMaxOpacity); - // Add sun colored fog when looking towards the sun - vec3 sunColor = frameUniforms.lightColorIntensity.rgb * frameUniforms.lightColorIntensity.w; - float sunAmount = max(dot(view, frameUniforms.lightDirection) / d, 0.0); // between 0 and 1 - float sunInscattering = pow(sunAmount, frameUniforms.fogInscatteringSize); + // compute fog color + vec3 fogColor = frameUniforms.fogColor; + +#if MATERIAL_FEATURE_LEVEL > 0 + if (frameUniforms.fogColorFromIbl > 0.0) { + float normalizedDepth = d * frameUniforms.fogOneOverFarMinusNear - frameUniforms.fogNearOverFarMinusNear; + lowp vec2 minMaxMip = unpackHalf2x16(frameUniforms.fogMinMaxMip); + lowp float lod = mix(minMaxMip.y, minMaxMip.x, saturate(normalizedDepth)); + + // when sampling the IBL we need to take into account the IBL transform. We know it's a + // a rigid transform, so we can take the transpose instead of the inverse, and for the + // same reason we can use it directly instead of taking the cof() to transform a vector. + highp mat3 worldFromUserWorldMatrix = transpose(mat3(frameUniforms.userWorldFromWorldMatrix)); + fogColor *= textureLod(sampler0_fog, worldFromUserWorldMatrix * view, lod).rgb; + } +#endif - fogColor += sunColor * (sunInscattering * inscatteringOpacity); - } + fogColor *= frameUniforms.iblLuminance * fogOpacity; + + if (frameUniforms.fogInscatteringSize > 0.0) { + // compute a new line-integral for a different start distance + highp float sunOpticalPath = + fogOpticalPathAtOneMeter * max(d - frameUniforms.fogInscatteringStart, 0.0); + + // Compute the transmittance using the Beer-Lambert Law + float sunTransmittance = exp(-sunOpticalPath); + + // Add sun colored fog when looking towards the sun + vec3 sunColor = frameUniforms.lightColorIntensity.rgb * frameUniforms.lightColorIntensity.w; + + float sunAmount = max(dot(normalize(view), frameUniforms.lightDirection), 0.0); // between 0 and 1 + float sunInscattering = pow(sunAmount, frameUniforms.fogInscatteringSize); + + fogColor += sunColor * (sunInscattering * (1.0 - sunTransmittance)); + } #if defined(BLEND_MODE_OPAQUE) - // nothing to do here + // nothing to do here #elif defined(BLEND_MODE_TRANSPARENT) - fogColor *= color.a; + fogColor *= color.a; #elif defined(BLEND_MODE_ADD) - fogColor = vec3(0.0); + fogColor = vec3(0.0); #elif defined(BLEND_MODE_MASKED) - // nothing to do here + // nothing to do here #elif defined(BLEND_MODE_MULTIPLY) - // FIXME: unclear what to do here + // FIXME: unclear what to do here #elif defined(BLEND_MODE_SCREEN) - // FIXME: unclear what to do here + // FIXME: unclear what to do here #endif - color.rgb = color.rgb * (1.0 - fogOpacity) + fogColor; - } + color.rgb = color.rgb * (1.0 - fogOpacity) + fogColor; + return color; } diff --git a/shaders/src/getters.fs b/shaders/src/getters.fs index 6b675348c61..a6254764eb9 100644 --- a/shaders/src/getters.fs +++ b/shaders/src/getters.fs @@ -4,7 +4,7 @@ /** sort-of public */ float getObjectUserData() { - return object_uniforms.userData; + return object_uniforms_userData; } //------------------------------------------------------------------------------ @@ -49,11 +49,22 @@ highp vec3 getWorldPosition() { return shading_position; } +/** @public-api */ +highp vec3 getUserWorldPosition() { + return mulMat4x4Float3(getUserWorldFromWorldMatrix(), getWorldPosition()).xyz; +} + /** @public-api */ vec3 getWorldViewVector() { return shading_view; } +bool isPerspectiveProjection() { + return frameUniforms.clipFromViewMatrix[2].w != 0.0; +} + +#if defined(HAS_ATTRIBUTE_TANGENTS) + /** @public-api */ vec3 getWorldNormalVector() { return shading_normal; @@ -74,6 +85,8 @@ float getNdotV() { return shading_NoV; } +#endif + highp vec3 getNormalizedPhysicalViewportCoord() { // make sure to handle our reversed-z return vec3(shading_normalizedViewportCoord, gl_FragCoord.z); @@ -94,13 +107,13 @@ highp vec3 getNormalizedViewportCoord() { } #if defined(VARIANT_HAS_SHADOWING) && defined(VARIANT_HAS_DYNAMIC_LIGHTING) -highp vec4 getSpotLightSpacePosition(uint index, highp vec3 dir, highp float zLight) { +highp vec4 getSpotLightSpacePosition(int index, highp vec3 dir, highp float zLight) { highp mat4 lightFromWorldMatrix = shadowUniforms.shadows[index].lightFromWorldMatrix; // for spotlights, the bias depends on z float bias = shadowUniforms.shadows[index].normalBias * zLight; - return computeLightSpacePosition(getWorldPosition(), getWorldNormalVector(), + return computeLightSpacePosition(getWorldPosition(), getWorldGeometricNormalVector(), dir, bias, lightFromWorldMatrix); } #endif @@ -111,28 +124,28 @@ bool isDoubleSided() { } #endif +#if defined(VARIANT_HAS_SHADOWING) && defined(VARIANT_HAS_DIRECTIONAL_LIGHTING) + /** * Returns the cascade index for this fragment (between 0 and CONFIG_MAX_SHADOW_CASCADES - 1). */ -uint getShadowCascade() { - vec3 viewPos = mulMat4x4Float3(getViewFromWorldMatrix(), getWorldPosition()).xyz; - bvec4 greaterZ = greaterThan(frameUniforms.cascadeSplits, vec4(viewPos.z)); - uint cascadeCount = frameUniforms.cascades & 0xFu; - return clamp(uint(dot(vec4(greaterZ), vec4(1.0))), 0u, cascadeCount - 1u); +int getShadowCascade() { + highp float z = mulMat4x4Float3(getViewFromWorldMatrix(), getWorldPosition()).z; + ivec4 greaterZ = ivec4(greaterThan(frameUniforms.cascadeSplits, vec4(z))); + int cascadeCount = frameUniforms.cascades & 0xF; + return clamp(greaterZ.x + greaterZ.y + greaterZ.z + greaterZ.w, 0, cascadeCount - 1); } -#if defined(VARIANT_HAS_SHADOWING) && defined(VARIANT_HAS_DIRECTIONAL_LIGHTING) - -highp vec4 getCascadeLightSpacePosition(uint cascade) { +highp vec4 getCascadeLightSpacePosition(int cascade) { // For the first cascade, return the interpolated light space position. // This branch will be coherent (mostly) for neighboring fragments, and it's worth avoiding // the matrix multiply inside computeLightSpacePosition. - if (cascade == 0u) { + if (cascade == 0) { // Note: this branch may cause issues with derivatives return vertex_lightSpacePosition; } - return computeLightSpacePosition(getWorldPosition(), getWorldNormalVector(), + return computeLightSpacePosition(getWorldPosition(), getWorldGeometricNormalVector(), frameUniforms.lightDirection, shadowUniforms.shadows[cascade].normalBias, shadowUniforms.shadows[cascade].lightFromWorldMatrix); diff --git a/shaders/src/getters.vs b/shaders/src/getters.vs index ea3e198b2ba..09569c61554 100644 --- a/shaders/src/getters.vs +++ b/shaders/src/getters.vs @@ -4,23 +4,24 @@ /** @public-api */ mat4 getWorldFromModelMatrix() { - return object_uniforms.worldFromModelMatrix; + return object_uniforms_worldFromModelMatrix; } /** @public-api */ mat3 getWorldFromModelNormalMatrix() { - return object_uniforms.worldFromModelNormalMatrix; + return object_uniforms_worldFromModelNormalMatrix; } /** sort-of public */ float getObjectUserData() { - return object_uniforms.userData; + return object_uniforms_userData; } //------------------------------------------------------------------------------ // Attributes access //------------------------------------------------------------------------------ +#if __VERSION__ >= 300 /** @public-api */ int getVertexIndex() { #if defined(TARGET_METAL_ENVIRONMENT) || defined(TARGET_VULKAN_ENVIRONMENT) @@ -29,27 +30,36 @@ int getVertexIndex() { return gl_VertexID; #endif } +#endif #if defined(VARIANT_HAS_SKINNING_OR_MORPHING) -vec3 mulBoneNormal(vec3 n, uint i) { +#define MAX_SKINNING_BUFFER_WIDTH 2048u +vec3 mulBoneNormal(vec3 n, uint j) { highp mat3 cof; - // the first 8 elements of the cofactor matrix are stored as fp16 - highp vec2 x0y0 = unpackHalf2x16(bonesUniforms.bones[i].cof[0]); - highp vec2 z0x1 = unpackHalf2x16(bonesUniforms.bones[i].cof[1]); - highp vec2 y1z1 = unpackHalf2x16(bonesUniforms.bones[i].cof[2]); - highp vec2 x2y2 = unpackHalf2x16(bonesUniforms.bones[i].cof[3]); - // the last element must be computed by hand - highp float a = bonesUniforms.bones[i].transform[0][0]; - highp float b = bonesUniforms.bones[i].transform[0][1]; - highp float d = bonesUniforms.bones[i].transform[1][0]; - highp float e = bonesUniforms.bones[i].transform[1][1]; + highp float a = bonesUniforms.bones[j].transform[0][0]; + highp float b = bonesUniforms.bones[j].transform[0][1]; + highp float c = bonesUniforms.bones[j].transform[0][2]; + highp float d = bonesUniforms.bones[j].transform[1][0]; + highp float e = bonesUniforms.bones[j].transform[1][1]; + highp float f = bonesUniforms.bones[j].transform[1][2]; + highp float g = bonesUniforms.bones[j].transform[2][0]; + highp float h = bonesUniforms.bones[j].transform[2][1]; + highp float i = bonesUniforms.bones[j].transform[2][2]; + + cof[0] = bonesUniforms.bones[j].cof0; - cof[0].xyz = vec3(x0y0, z0x1.x); - cof[1].xyz = vec3(z0x1.y, y1z1); - cof[2].xyz = vec3(x2y2, a * e - b * d); + cof[1].xyz = vec3( + bonesUniforms.bones[j].cof1x, + a * i - c * g, + c * d - a * f); + + cof[2].xyz = vec3( + d * h - e * g, + b * g - a * h, + a * e - b * d); return normalize(cof * n); } @@ -60,43 +70,111 @@ vec3 mulBoneVertex(vec3 v, uint i) { return v.x * m[0].xyz + (v.y * m[1].xyz + (v.z * m[2].xyz + m[3].xyz)); } +void skinPosition(inout vec3 p, const uvec4 ids, const vec4 weights) { + // standard skinning for 4 weights, some of them could be zero + if (weights.w >= 0.0) { + p = weights.x * mulBoneVertex(p, uint(ids.x)) + + weights.y * mulBoneVertex(p, uint(ids.y)) + + weights.z * mulBoneVertex(p, uint(ids.z)) + + weights.w * mulBoneVertex(p, uint(ids.w)); + return; + } + // skinning for >4 weights + vec3 posSum = weights.x * mulBoneVertex(p, uint(ids.x)); + posSum += weights.y * mulBoneVertex(p, uint(ids.y)); + posSum += weights.z * mulBoneVertex(p, uint(ids.z)); + uint pairIndex = uint(-weights.w - 1.); + uint pairStop = pairIndex + uint(ids.w - 3u); + for (uint i = pairIndex; i < pairStop; ++i) { + ivec2 texcoord = ivec2(i % MAX_SKINNING_BUFFER_WIDTH, i / MAX_SKINNING_BUFFER_WIDTH); + vec2 indexWeight = texelFetch(sampler1_indicesAndWeights, texcoord, 0).rg; + posSum += mulBoneVertex(p, uint(indexWeight.r)) * indexWeight.g; + } + p = posSum; +} + void skinNormal(inout vec3 n, const uvec4 ids, const vec4 weights) { - n = mulBoneNormal(n, ids.x) * weights.x - + mulBoneNormal(n, ids.y) * weights.y - + mulBoneNormal(n, ids.z) * weights.z - + mulBoneNormal(n, ids.w) * weights.w; + // standard skinning for 4 weights, some of them could be zero + if (weights.w >= 0.0) { + n = weights.x * mulBoneNormal(n, uint(ids.x)) + + weights.y * mulBoneNormal(n, uint(ids.y)) + + weights.z * mulBoneNormal(n, uint(ids.z)) + + weights.w * mulBoneNormal(n, uint(ids.w)); + return; + } + // skinning for >4 weights + vec3 normSum = weights.x * mulBoneNormal(n, uint(ids.x)); + normSum += weights.y * mulBoneNormal(n, uint(ids.y)); + normSum += weights.z * mulBoneNormal(n, uint(ids.z)); + uint pairIndex = uint(-weights.w - 1.); + uint pairStop = pairIndex + uint(ids.w - 3u); + for (uint i = pairIndex; i < pairStop; i = i + 1u) { + ivec2 texcoord = ivec2(i % MAX_SKINNING_BUFFER_WIDTH, i / MAX_SKINNING_BUFFER_WIDTH); + vec2 indexWeight = texelFetch(sampler1_indicesAndWeights, texcoord, 0).rg; + + normSum += mulBoneNormal(n, uint(indexWeight.r)) * indexWeight.g; + } + n = normSum; } -void skinPosition(inout vec3 p, const uvec4 ids, const vec4 weights) { - p = mulBoneVertex(p, ids.x) * weights.x - + mulBoneVertex(p, ids.y) * weights.y - + mulBoneVertex(p, ids.z) * weights.z - + mulBoneVertex(p, ids.w) * weights.w; +void skinNormalTangent(inout vec3 n, inout vec3 t, const uvec4 ids, const vec4 weights) { + // standard skinning for 4 weights, some of them could be zero + if (weights.w >= 0.0) { + n = weights.x * mulBoneNormal(n, uint(ids.x)) + + weights.y * mulBoneNormal(n, uint(ids.y)) + + weights.z * mulBoneNormal(n, uint(ids.z)) + + weights.w * mulBoneNormal(n, uint(ids.w)); + t = weights.x * mulBoneNormal(t, uint(ids.x)) + + weights.y * mulBoneNormal(t, uint(ids.y)) + + weights.z * mulBoneNormal(t, uint(ids.z)) + + weights.w * mulBoneNormal(t, uint(ids.w)); + return; + } + // skinning for >4 weights + vec3 normSum = weights.x * mulBoneNormal(n, uint(ids.x)); + normSum += weights.y * mulBoneNormal(n, uint(ids.y)) ; + normSum += weights.z * mulBoneNormal(n, uint(ids.z)); + vec3 tangSum = weights.x * mulBoneNormal(t, uint(ids.x)); + tangSum += weights.y * mulBoneNormal(t, uint(ids.y)); + tangSum += weights.z * mulBoneNormal(t, uint(ids.z)); + uint pairIndex = uint(-weights.w - 1.); + uint pairStop = pairIndex + uint(ids.w - 3u); + for (uint i = pairIndex; i < pairStop; i = i + 1u) { + ivec2 texcoord = ivec2(i % MAX_SKINNING_BUFFER_WIDTH, i / MAX_SKINNING_BUFFER_WIDTH); + vec2 indexWeight = texelFetch(sampler1_indicesAndWeights, texcoord, 0).rg; + + normSum += mulBoneNormal(n, uint(indexWeight.r)) * indexWeight.g; + tangSum += mulBoneNormal(t, uint(indexWeight.r)) * indexWeight.g; + } + n = normSum; + t = tangSum; } #define MAX_MORPH_TARGET_BUFFER_WIDTH 2048 void morphPosition(inout vec4 p) { - ivec3 texcoord = ivec3(getVertexIndex() % MAX_MORPH_TARGET_BUFFER_WIDTH, getVertexIndex() / MAX_MORPH_TARGET_BUFFER_WIDTH, 0); - uint c = object_uniforms.morphTargetCount; - for (uint i = 0u; i < c; ++i) { + int index = getVertexIndex() + pushConstants.morphingBufferOffset; + ivec3 texcoord = ivec3(index % MAX_MORPH_TARGET_BUFFER_WIDTH, index / MAX_MORPH_TARGET_BUFFER_WIDTH, 0); + int c = object_uniforms_morphTargetCount; + for (int i = 0; i < c; ++i) { float w = morphingUniforms.weights[i][0]; if (w != 0.0) { - texcoord.z = int(i); - p += w * texelFetch(morphTargetBuffer_positions, texcoord, 0); + texcoord.z = i; + p += w * texelFetch(sampler1_positions, texcoord, 0); } } } void morphNormal(inout vec3 n) { vec3 baseNormal = n; - ivec3 texcoord = ivec3(getVertexIndex() % MAX_MORPH_TARGET_BUFFER_WIDTH, getVertexIndex() / MAX_MORPH_TARGET_BUFFER_WIDTH, 0); - uint c = object_uniforms.morphTargetCount; - for (uint i = 0u; i < c; ++i) { + int index = getVertexIndex() + pushConstants.morphingBufferOffset; + ivec3 texcoord = ivec3(index % MAX_MORPH_TARGET_BUFFER_WIDTH, index / MAX_MORPH_TARGET_BUFFER_WIDTH, 0); + int c = object_uniforms_morphTargetCount; + for (int i = 0; i < c; ++i) { float w = morphingUniforms.weights[i][0]; if (w != 0.0) { - texcoord.z = int(i); - ivec4 tangent = texelFetch(morphTargetBuffer_tangents, texcoord, 0); + texcoord.z = i; + ivec4 tangent = texelFetch(sampler1_tangents, texcoord, 0); vec3 normal; toTangentFrame(float4(tangent) * (1.0 / 32767.0), normal); n += w * (normal - baseNormal); @@ -111,7 +189,7 @@ vec4 getPosition() { #if defined(VARIANT_HAS_SKINNING_OR_MORPHING) - if ((object_uniforms.flagsChannels & FILAMENT_OBJECT_MORPHING_ENABLED_BIT) != 0u) { + if ((object_uniforms_flagsChannels & FILAMENT_OBJECT_MORPHING_ENABLED_BIT) != 0) { #if defined(LEGACY_MORPHING) pos += morphingUniforms.weights[0] * mesh_custom0; pos += morphingUniforms.weights[1] * mesh_custom1; @@ -122,7 +200,7 @@ vec4 getPosition() { #endif } - if ((object_uniforms.flagsChannels & FILAMENT_OBJECT_SKINNING_ENABLED_BIT) != 0u) { + if ((object_uniforms_flagsChannels & FILAMENT_OBJECT_SKINNING_ENABLED_BIT) != 0) { skinPosition(pos.xyz, mesh_bone_indices, mesh_bone_weights); } @@ -185,11 +263,29 @@ vec4 computeWorldPosition() { // GL convention to inverted DX convention p.z = p.z * -0.5 + 0.5; vec4 position = transform * p; - if (abs(position.w) < MEDIUMP_FLT_MIN) { - position.w = position.w < 0.0 ? -MEDIUMP_FLT_MIN : MEDIUMP_FLT_MIN; + // w could be zero (e.g.: with the skybox) which corresponds to an infinite distance in + // world-space. However, we want to avoid infinites and divides-by-zero, so we use a very + // small number instead in that case (2^-63 seem to work well). + const highp float ALMOST_ZERO_FLT = 1.08420217249e-19; + if (abs(position.w) < ALMOST_ZERO_FLT) { + position.w = position.w < 0.0 ? -ALMOST_ZERO_FLT : ALMOST_ZERO_FLT; } return position * (1.0 / position.w); #else #error Unknown Vertex Domain #endif } + +/** + * Index of the eye being rendered, starting at 0. + * @public-api + */ +int getEyeIndex() { +#if defined(VARIANT_HAS_STEREO) && defined(FILAMENT_STEREO_INSTANCED) + return instance_index % CONFIG_STEREO_EYE_COUNT; +#elif defined(VARIANT_HAS_STEREO) && defined(FILAMENT_STEREO_MULTIVIEW) + // gl_ViewID_OVR is of uint type, which needs an explicit conversion. + return int(gl_ViewID_OVR); +#endif + return 0; +} diff --git a/shaders/src/light_directional.fs b/shaders/src/light_directional.fs index 3e336f5d5b9..9ef63c79e86 100644 --- a/shaders/src/light_directional.fs +++ b/shaders/src/light_directional.fs @@ -2,7 +2,7 @@ // Directional light evaluation //------------------------------------------------------------------------------ -#if FILAMENT_QUALITY < FILAMENT_QUALITY_HIGH +#if FILAMENT_QUALITY >= FILAMENT_QUALITY_HIGH #define SUN_AS_AREA_LIGHT #endif @@ -27,7 +27,7 @@ Light getDirectionalLight() { light.l = sampleSunAreaLight(frameUniforms.lightDirection); light.attenuation = 1.0; light.NoL = saturate(dot(shading_normal, light.l)); - light.channels = frameUniforms.lightChannels & 0xFFu; + light.channels = frameUniforms.lightChannels & 0xFF; return light; } @@ -36,8 +36,8 @@ void evaluateDirectionalLight(const MaterialInputs material, Light light = getDirectionalLight(); - uint channels = object_uniforms.flagsChannels & 0xFFu; - if ((light.channels & channels) == 0u) { + int channels = object_uniforms_flagsChannels & 0xFF; + if ((light.channels & channels) == 0) { return; } @@ -52,15 +52,21 @@ void evaluateDirectionalLight(const MaterialInputs material, if (light.NoL > 0.0) { float ssContactShadowOcclusion = 0.0; - uint cascade = getShadowCascade(); - bool cascadeHasVisibleShadows = bool(frameUniforms.cascades & ((1u << cascade) << 8u)); - bool hasDirectionalShadows = bool(frameUniforms.directionalShadows & 1u); + int cascade = getShadowCascade(); + bool cascadeHasVisibleShadows = bool(frameUniforms.cascades & ((1 << cascade) << 8)); + bool hasDirectionalShadows = bool(frameUniforms.directionalShadows & 1); if (hasDirectionalShadows && cascadeHasVisibleShadows) { highp vec4 shadowPosition = getShadowPosition(cascade); - visibility = shadow(true, light_shadowMap, cascade, shadowPosition, 0.0f); + visibility = shadow(true, sampler0_shadowMap, cascade, shadowPosition, 0.0); + // shadow far attenuation + highp vec3 v = getWorldPosition() - getWorldCameraPosition(); + // (viewFromWorld * v).z == dot(transpose(viewFromWorld), v) + highp float z = dot(transpose(getViewFromWorldMatrix())[2].xyz, v); + highp vec2 p = frameUniforms.shadowFarAttenuationParams; + visibility = 1.0 - ((1.0 - visibility) * saturate(p.x - z * z * p.y)); } - if ((frameUniforms.directionalShadows & 0x2u) != 0u && visibility > 0.0) { - if ((object_uniforms.flagsChannels & FILAMENT_OBJECT_CONTACT_SHADOWS_BIT) != 0u) { + if ((frameUniforms.directionalShadows & 0x2) != 0 && visibility > 0.0) { + if ((object_uniforms_flagsChannels & FILAMENT_OBJECT_CONTACT_SHADOWS_BIT) != 0) { ssContactShadowOcclusion = screenSpaceContactShadow(light.l); } } diff --git a/shaders/src/light_indirect.fs b/shaders/src/light_indirect.fs index 1c5a7f14191..ac0dc1cb2f3 100644 --- a/shaders/src/light_indirect.fs +++ b/shaders/src/light_indirect.fs @@ -2,9 +2,6 @@ // Image based lighting configuration //------------------------------------------------------------------------------ -// Number of spherical harmonics bands (1, 2 or 3) -#define SPHERICAL_HARMONICS_BANDS 3 - // IBL integration algorithm #define IBL_INTEGRATION_PREFILTERED_CUBEMAP 0 #define IBL_INTEGRATION_IMPORTANCE_SAMPLING 1 @@ -27,7 +24,7 @@ vec3 decodeDataForIBL(const vec4 data) { vec3 PrefilteredDFG_LUT(float lod, float NoV) { // coord = sqrt(linear_roughness), which is the mapping used by cmgen. - return textureLod(light_iblDFG, vec2(NoV, lod), 0.0).rgb; + return textureLod(sampler0_iblDFG, vec2(NoV, lod), 0.0).rgb; } //------------------------------------------------------------------------------ @@ -44,26 +41,30 @@ vec3 prefilteredDFG(float perceptualRoughness, float NoV) { //------------------------------------------------------------------------------ vec3 Irradiance_SphericalHarmonics(const vec3 n) { - return max( - frameUniforms.iblSH[0] -#if SPHERICAL_HARMONICS_BANDS >= 2 - + frameUniforms.iblSH[1] * (n.y) - + frameUniforms.iblSH[2] * (n.z) - + frameUniforms.iblSH[3] * (n.x) -#endif -#if SPHERICAL_HARMONICS_BANDS >= 3 - + frameUniforms.iblSH[4] * (n.y * n.x) - + frameUniforms.iblSH[5] * (n.y * n.z) - + frameUniforms.iblSH[6] * (3.0 * n.z * n.z - 1.0) - + frameUniforms.iblSH[7] * (n.z * n.x) - + frameUniforms.iblSH[8] * (n.x * n.x - n.y * n.y) -#endif - , 0.0); + vec3 sphericalHarmonics = frameUniforms.iblSH[0]; + + if (CONFIG_SH_BANDS_COUNT >= 2) { + sphericalHarmonics += + frameUniforms.iblSH[1] * (n.y) + + frameUniforms.iblSH[2] * (n.z) + + frameUniforms.iblSH[3] * (n.x); + } + + if (CONFIG_SH_BANDS_COUNT >= 3) { + sphericalHarmonics += + frameUniforms.iblSH[4] * (n.y * n.x) + + frameUniforms.iblSH[5] * (n.y * n.z) + + frameUniforms.iblSH[6] * (3.0 * n.z * n.z - 1.0) + + frameUniforms.iblSH[7] * (n.z * n.x) + + frameUniforms.iblSH[8] * (n.x * n.x - n.y * n.y); + } + + return max(sphericalHarmonics, 0.0); } vec3 Irradiance_RoughnessOne(const vec3 n) { // note: lod used is always integer, hopefully the hardware skips tri-linear filtering - return decodeDataForIBL(textureLod(light_iblSpecular, n, frameUniforms.iblRoughnessOneLevel)); + return decodeDataForIBL(textureLod(sampler0_iblSpecular, n, frameUniforms.iblRoughnessOneLevel)); } //------------------------------------------------------------------------------ @@ -71,11 +72,24 @@ vec3 Irradiance_RoughnessOne(const vec3 n) { //------------------------------------------------------------------------------ vec3 diffuseIrradiance(const vec3 n) { + // On Metal devices with certain chipsets, this light_iblSpecular texture sample must be pulled + // outside the frameUniforms.iblSH check. This is to avoid a Metal pipeline compilation error + // with the message: "Could not statically determine the target of a texture". + // The reason for this is unknown, and is possibly a bug that exhibits only on these devices. + vec3 irradianceRoughnessOne; + if (CONFIG_STATIC_TEXTURE_TARGET_WORKAROUND) { + irradianceRoughnessOne = Irradiance_RoughnessOne(n); + } + if (frameUniforms.iblSH[0].x == 65504.0) { #if FILAMENT_QUALITY < FILAMENT_QUALITY_HIGH - return Irradiance_RoughnessOne(n); + if (CONFIG_STATIC_TEXTURE_TARGET_WORKAROUND) { + return irradianceRoughnessOne; + } else { + return Irradiance_RoughnessOne(n); + } #else - ivec2 s = textureSize(light_iblSpecular, int(frameUniforms.iblRoughnessOneLevel)); + ivec2 s = textureSize(sampler0_iblSpecular, int(frameUniforms.iblRoughnessOneLevel)); float du = 1.0 / float(s.x); float dv = 1.0 / float(s.y); vec3 m0 = normalize(cross(n, vec3(0.0, 1.0, 0.0))); @@ -107,12 +121,12 @@ float perceptualRoughnessToLod(float perceptualRoughness) { vec3 prefilteredRadiance(const vec3 r, float perceptualRoughness) { float lod = perceptualRoughnessToLod(perceptualRoughness); - return decodeDataForIBL(textureLod(light_iblSpecular, r, lod)); + return decodeDataForIBL(textureLod(sampler0_iblSpecular, r, lod)); } vec3 prefilteredRadiance(const vec3 r, float roughness, float offset) { float lod = frameUniforms.iblRoughnessOneLevel * roughness; - return decodeDataForIBL(textureLod(light_iblSpecular, r, lod + offset)); + return decodeDataForIBL(textureLod(sampler0_iblSpecular, r, lod + offset)); } vec3 getSpecularDominantDirection(const vec3 n, const vec3 r, float roughness) { @@ -122,9 +136,13 @@ vec3 getSpecularDominantDirection(const vec3 n, const vec3 r, float roughness) { vec3 specularDFG(const PixelParams pixel) { #if defined(SHADING_MODEL_CLOTH) return pixel.f0 * pixel.dfg.z; +#else +#if defined(MATERIAL_HAS_SPECULAR_COLOR_FACTOR) || defined(MATERIAL_HAS_SPECULAR_FACTOR) + return mix(pixel.dfg.xxx, pixel.dfg.yyy, pixel.f0) * pixel.specular; #else return mix(pixel.dfg.xxx, pixel.dfg.yyy, pixel.f0); #endif +#endif } vec3 getReflectedVector(const PixelParams pixel, const vec3 n) { @@ -165,7 +183,7 @@ vec3 importanceSamplingNdfDggx(vec2 u, float roughness) { } vec3 hemisphereCosSample(vec2 u) { - float phi = 2.0f * PI * u.x; + float phi = 2.0 * PI * u.x; float cosTheta2 = 1.0 - u.y; float cosTheta = sqrt(cosTheta2); float sinTheta = sqrt(1.0 - cosTheta2); @@ -211,7 +229,7 @@ float prefilteredImportanceSampling(float ipdf, float omegaP) { } vec3 isEvaluateSpecularIBL(const PixelParams pixel, const vec3 n, const vec3 v, const float NoV) { - const uint numSamples = uint(IBL_INTEGRATION_IMPORTANCE_SAMPLING_COUNT); + const int numSamples = IBL_INTEGRATION_IMPORTANCE_SAMPLING_COUNT; const float invNumSamples = 1.0 / float(numSamples); const vec3 up = vec3(0.0, 0.0, 1.0); @@ -234,11 +252,11 @@ vec3 isEvaluateSpecularIBL(const PixelParams pixel, const vec3 n, const vec3 v, T *= R; float roughness = pixel.roughness; - float dim = float(textureSize(light_iblSpecular, 0).x); + float dim = float(textureSize(sampler0_iblSpecular, 0).x); float omegaP = (4.0 * PI) / (6.0 * dim * dim); vec3 indirectSpecular = vec3(0.0); - for (uint i = 0u; i < numSamples; i++) { + for (int i = 0; i < numSamples; i++) { vec2 u = hammersley(i); vec3 h = T * importanceSamplingNdfDggx(u, roughness); @@ -255,7 +273,7 @@ vec3 isEvaluateSpecularIBL(const PixelParams pixel, const vec3 n, const vec3 v, // PDF inverse (we must use D_GGX() here, which is used to generate samples) float ipdf = (4.0 * LoH) / (D_GGX(roughness, NoH, h) * NoH); float mipLevel = prefilteredImportanceSampling(ipdf, omegaP); - vec3 L = decodeDataForIBL(textureLod(light_iblSpecular, l, mipLevel)); + vec3 L = decodeDataForIBL(textureLod(sampler0_iblSpecular, l, mipLevel)); float D = distribution(roughness, NoH, h); float V = visibility(roughness, NoV, NoL); @@ -270,7 +288,7 @@ vec3 isEvaluateSpecularIBL(const PixelParams pixel, const vec3 n, const vec3 v, } vec3 isEvaluateDiffuseIBL(const PixelParams pixel, vec3 n, vec3 v) { - const uint numSamples = uint(IBL_INTEGRATION_IMPORTANCE_SAMPLING_COUNT); + const int numSamples = IBL_INTEGRATION_IMPORTANCE_SAMPLING_COUNT; const float invNumSamples = 1.0 / float(numSamples); const vec3 up = vec3(0.0, 0.0, 1.0); @@ -292,11 +310,11 @@ vec3 isEvaluateDiffuseIBL(const PixelParams pixel, vec3 n, vec3 v) { R[2] = vec3( 0, 0, 1); T *= R; - float dim = float(textureSize(light_iblSpecular, 0).x); + float dim = float(textureSize(sampler0_iblSpecular, 0).x); float omegaP = (4.0 * PI) / (6.0 * dim * dim); vec3 indirectDiffuse = vec3(0.0); - for (uint i = 0u; i < numSamples; i++) { + for (int i = 0; i < numSamples; i++) { vec2 u = hammersley(i); vec3 h = T * hemisphereCosSample(u); @@ -311,7 +329,7 @@ vec3 isEvaluateDiffuseIBL(const PixelParams pixel, vec3 n, vec3 v) { float ipdf = PI / NoL; // we have to bias the mipLevel (+1) to help with very strong highlights float mipLevel = prefilteredImportanceSampling(ipdf, omegaP) + 1.0; - vec3 L = decodeDataForIBL(textureLod(light_iblSpecular, l, mipLevel)); + vec3 L = decodeDataForIBL(textureLod(sampler0_iblSpecular, l, mipLevel)); indirectDiffuse += L; } } @@ -524,8 +542,8 @@ vec3 evaluateRefraction( // distance to camera plane const float invLog2sqrt5 = 0.8614; - float lod = max(0.0, (2.0f * log2(perceptualRoughness) + frameUniforms.refractionLodOffset) * invLog2sqrt5); - Ft = textureLod(light_ssr, vec3(p.xy, 0.0), lod).rgb; + float lod = max(0.0, (2.0 * log2(perceptualRoughness) + frameUniforms.refractionLodOffset) * invLog2sqrt5); + Ft = textureLod(sampler0_ssr, vec3(p.xy, 0.0), lod).rgb; #endif // base color changes the amount of light passing through the boundary @@ -545,7 +563,7 @@ vec3 evaluateRefraction( void evaluateIBL(const MaterialInputs material, const PixelParams pixel, inout vec3 color) { // specular layer - vec3 Fr = vec3(0.0f); + vec3 Fr = vec3(0.0); SSAOInterpolationCache interpolationCache; #if defined(BLEND_MODE_OPAQUE) || defined(BLEND_MODE_MASKED) || defined(MATERIAL_HAS_REFLECTIONS) @@ -554,10 +572,10 @@ void evaluateIBL(const MaterialInputs material, const PixelParams pixel, inout v // screen-space reflections #if defined(MATERIAL_HAS_REFLECTIONS) - vec4 ssrFr = vec4(0.0f); + vec4 ssrFr = vec4(0.0); #if defined(BLEND_MODE_OPAQUE) || defined(BLEND_MODE_MASKED) // do the uniform based test first - if (frameUniforms.ssrDistance > 0.0f) { + if (frameUniforms.ssrDistance > 0.0) { // There is no point doing SSR for very high roughness because we're limited by the fov // of the screen, in addition it doesn't really add much to the final image. // TODO: maybe make this a parameter @@ -567,28 +585,28 @@ void evaluateIBL(const MaterialInputs material, const PixelParams pixel, inout v const float invLog2sqrt5 = 0.8614; float d = -mulMat4x4Float3(getViewFromWorldMatrix(), getWorldPosition()).z; float lod = max(0.0, (log2(pixel.roughness / d) + frameUniforms.refractionLodOffset) * invLog2sqrt5); - ssrFr = textureLod(light_ssr, vec3(interpolationCache.uv, 1.0), lod); + ssrFr = textureLod(sampler0_ssr, vec3(interpolationCache.uv, 1.0), lod); } } #else // BLEND_MODE_OPAQUE // TODO: for blended transparency, we have to ray-march here (limited to mirror reflections) #endif #else // MATERIAL_HAS_REFLECTIONS - const vec4 ssrFr = vec4(0.0f); + const vec4 ssrFr = vec4(0.0); #endif - // If screen-space reflections are turned on and have full contribution (ssr.a == 1.0f), then we + // If screen-space reflections are turned on and have full contribution (ssr.a == 1.0), then we // skip sampling the IBL down below. #if IBL_INTEGRATION == IBL_INTEGRATION_PREFILTERED_CUBEMAP vec3 E = specularDFG(pixel); - if (ssrFr.a < 1.0f) { // prevent reading the IBL if possible + if (ssrFr.a < 1.0) { // prevent reading the IBL if possible vec3 r = getReflectedVector(pixel, shading_normal); Fr = E * prefilteredRadiance(r, pixel.perceptualRoughness); } #elif IBL_INTEGRATION == IBL_INTEGRATION_IMPORTANCE_SAMPLING vec3 E = vec3(0.0); // TODO: fix for importance sampling - if (ssrFr.a < 1.0f) { // prevent evaluating the IBL if possible + if (ssrFr.a < 1.0) { // prevent evaluating the IBL if possible Fr = isEvaluateSpecularIBL(pixel, shading_normal, shading_view, shading_NoV); } #endif @@ -649,7 +667,6 @@ void evaluateIBL(const MaterialInputs material, const PixelParams pixel, inout v // Combine all terms // Note: iblLuminance is already premultiplied by the exposure - color.rgb += Fr + Fd; #if defined(MATERIAL_HAS_REFRACTION) color.rgb += Ft; diff --git a/shaders/src/light_punctual.fs b/shaders/src/light_punctual.fs index 74f144fce22..fa55b057281 100644 --- a/shaders/src/light_punctual.fs +++ b/shaders/src/light_punctual.fs @@ -46,8 +46,7 @@ uvec3 getFroxelCoords(const highp vec3 fragCoords) { /** * Computes the froxel index of the fragment at the specified coordinates. * The froxel index is computed from the 3D coordinates of the froxel in the - * froxel grid and later used to fetch from the froxel data texture - * (light_froxels). + * froxel grid and later used to fetch from the froxel buffer. */ uint getFroxelIndex(const highp vec3 fragCoords) { uvec3 froxelCoord = getFroxelCoords(fragCoords); @@ -65,15 +64,16 @@ ivec2 getFroxelTexCoord(uint froxelIndex) { /** * Returns the froxel data for the given froxel index. The data is fetched - * from the light_froxels texture. + * from FroxelsUniforms UBO. */ -FroxelParams getFroxelParams(uint froxelIndex) { - ivec2 texCoord = getFroxelTexCoord(froxelIndex); - uvec2 entry = texelFetch(light_froxels, texCoord, 0).rg; - +FroxelParams getFroxelParams(const uint froxelIndex) { + uint w = froxelIndex >> 2u; + uint c = froxelIndex & 0x3u; + highp uvec4 d = froxelsUniforms.records[w]; + highp uint f = d[c]; FroxelParams froxel; - froxel.recordOffset = entry.r; - froxel.count = entry.g & 0xFFu; + froxel.recordOffset = f >> 16u; + froxel.count = f & 0xFFu; return froxel; } @@ -103,8 +103,7 @@ float getDistanceAttenuation(const highp vec3 posToLight, float falloff) { float attenuation = getSquareFalloffAttenuation(distanceSquare, falloff); // light far attenuation highp vec3 v = getWorldPosition() - getWorldCameraPosition(); - float d = dot(v, v); - attenuation *= saturate(frameUniforms.lightFarAttenuationParams.x - d * frameUniforms.lightFarAttenuationParams.y); + attenuation *= saturate(frameUniforms.lightFarAttenuationParams.x - dot(v, v) * frameUniforms.lightFarAttenuationParams.y); // Assume a punctual light occupies a volume of 1cm to avoid a division by 0 return attenuation / max(distanceSquare, 1e-4); } @@ -153,12 +152,12 @@ Light getLight(const uint lightIndex) { light.direction = direction; light.NoL = saturate(dot(shading_normal, light.l)); light.worldPosition = positionFalloff.xyz; - light.channels = channels; + light.channels = int(channels); light.contactShadows = bool(typeShadow & 0x10u); #if defined(VARIANT_HAS_DYNAMIC_LIGHTING) light.type = (typeShadow & 0x1u); #if defined(VARIANT_HAS_SHADOWING) - light.shadowIndex = (typeShadow >> 8u) & 0xFFu; + light.shadowIndex = int((typeShadow >> 8u) & 0xFFu); light.castsShadows = bool(channels & 0x10000u); if (light.type == LIGHT_TYPE_SPOT) { light.zLight = dot(shadowUniforms.shadows[light.shadowIndex].lightFromWorldZ, vec4(worldPosition, 1.0)); @@ -191,13 +190,13 @@ void evaluatePunctualLights(const MaterialInputs material, uint index = froxel.recordOffset; uint end = index + froxel.count; - uint channels = object_uniforms.flagsChannels & 0xFFu; + int channels = object_uniforms_flagsChannels & 0xFF; // Iterate point lights for ( ; index < end; index++) { uint lightIndex = getLightIndex(index); Light light = getLight(lightIndex); - if ((light.channels & channels) == 0u) { + if ((light.channels & channels) == 0) { continue; } @@ -211,21 +210,21 @@ void evaluatePunctualLights(const MaterialInputs material, #if defined(VARIANT_HAS_SHADOWING) if (light.NoL > 0.0) { if (light.castsShadows) { - uint shadowIndex = light.shadowIndex; + int shadowIndex = light.shadowIndex; if (light.type == LIGHT_TYPE_POINT) { // point-light shadows are sampled from a direction highp vec3 r = getWorldPosition() - light.worldPosition; - uint face = getPointLightFace(r); + int face = getPointLightFace(r); shadowIndex += face; light.zLight = dot(shadowUniforms.shadows[shadowIndex].lightFromWorldZ, vec4(getWorldPosition(), 1.0)); } highp vec4 shadowPosition = getShadowPosition(shadowIndex, light.direction, light.zLight); - visibility = shadow(false, light_shadowMap, shadowIndex, + visibility = shadow(false, sampler0_shadowMap, shadowIndex, shadowPosition, light.zLight); } if (light.contactShadows && visibility > 0.0) { - if ((object_uniforms.flagsChannels & FILAMENT_OBJECT_CONTACT_SHADOWS_BIT) != 0u) { + if ((object_uniforms_flagsChannels & FILAMENT_OBJECT_CONTACT_SHADOWS_BIT) != 0) { visibility *= 1.0 - screenSpaceContactShadow(light.l); } } @@ -243,4 +242,29 @@ void evaluatePunctualLights(const MaterialInputs material, color.rgb += surfaceShading(pixel, light, visibility); #endif } + + if (CONFIG_DEBUG_FROXEL_VISUALIZATION) { + if (froxel.count > 0u) { + const vec3 debugColors[17] = vec3[]( + vec3(0.0, 0.0, 0.0), // black + vec3(0.0, 0.0, 0.1647), // darkest blue + vec3(0.0, 0.0, 0.3647), // darker blue + vec3(0.0, 0.0, 0.6647), // dark blue + vec3(0.0, 0.0, 0.9647), // blue + vec3(0.0, 0.9255, 0.9255), // cyan + vec3(0.0, 0.5647, 0.0), // dark green + vec3(0.0, 0.7843, 0.0), // green + vec3(1.0, 1.0, 0.0), // yellow + vec3(0.90588, 0.75294, 0.0), // yellow-orange + vec3(1.0, 0.5647, 0.0), // orange + vec3(1.0, 0.0, 0.0), // bright red + vec3(0.8392, 0.0, 0.0), // red + vec3(1.0, 0.0, 1.0), // magenta + vec3(0.6, 0.3333, 0.7882), // purple + vec3(1.0, 1.0, 1.0), // white + vec3(1.0, 1.0, 1.0) // white + ); + color = mix(color, debugColors[clamp(froxel.count, 0u, 16u)], 0.8); + } + } } diff --git a/shaders/src/light_reflections.fs b/shaders/src/light_reflections.fs index 816fc8ab67e..b2f9d3cc729 100644 --- a/shaders/src/light_reflections.fs +++ b/shaders/src/light_reflections.fs @@ -58,7 +58,7 @@ highp float distanceSquared(highp vec2 a, highp vec2 b) { // Note: McGuire and Mara use the "cs" prefix to stand for "camera space", equivalent to Filament's // "view space". "cs" has been replaced with "vs" to avoid confusion. bool traceScreenSpaceRay(const highp vec3 vsOrigin, const highp vec3 vsDirection, - const highp mat4 uvFromViewMatrix, const highp sampler2D vsZBuffer, + highp_mat4 uvFromViewMatrix, const highp sampler2D vsZBuffer, const float vsZThickness, const highp float nearPlaneZ, const float stride, const float jitterFraction, const highp float maxSteps, const float maxRayTraceDistance, out highp vec2 hitPixel, out highp vec3 vsHitPoint) { @@ -182,11 +182,11 @@ bool traceScreenSpaceRay(const highp vec3 vsOrigin, const highp vec3 vsDirection // -- end "BSD 2-clause license" ------------------------------------------------------------------- highp mat4 scaleMatrix(const highp float x, const highp float y) { - mat4 m = mat4(1.0f); + mat4 m = mat4(1.0); m[0].x = x; m[1].y = y; - m[2].z = 1.0f; - m[3].w = 1.0f; + m[2].z = 1.0; + m[3].w = 1.0; return m; } @@ -195,13 +195,13 @@ highp mat4 scaleMatrix(const highp float x, const highp float y) { * wsRayDirection is the desired reflected vector. * * The returned color's alpha is set to a value between [0, 1] representing the "opacity" of the - * reflection. 1.0f is full screen-space reflection. Values < 1.0f should be blended with the + * reflection. 1.0 is full screen-space reflection. Values < 1.0 should be blended with the * scene's IBL. * * If there is no hit, the return value is vec4(0). */ vec4 evaluateScreenSpaceReflections(const highp vec3 wsRayDirection) { - vec4 Fr = vec4(0.0f); + vec4 Fr = vec4(0.0); highp vec3 wsRayStart = shading_position + frameUniforms.ssrBias * wsRayDirection; // ray start/end in view space @@ -220,7 +220,7 @@ vec4 evaluateScreenSpaceReflections(const highp vec3 wsRayDirection) { float maxRayTraceDistance = frameUniforms.ssrDistance; - highp vec2 res = vec2(textureSize(light_structure, 0).xy); + highp vec2 res = vec2(textureSize(sampler0_structure, 0).xy); highp mat4 uvFromViewMatrix = scaleMatrix(res.x, res.y) * frameUniforms.ssrUvFromViewMatrix; @@ -231,7 +231,7 @@ vec4 evaluateScreenSpaceReflections(const highp vec3 wsRayDirection) { highp vec2 hitPixel; // not currently used highp vec3 vsHitPoint; - if (traceScreenSpaceRay(vsOrigin, vsDirection, uvFromViewMatrix, light_structure, + if (traceScreenSpaceRay(vsOrigin, vsDirection, uvFromViewMatrix, sampler0_structure, vsZThickness, nearPlaneZ, stride, jitterFraction, maxSteps, maxRayTraceDistance, hitPixel, vsHitPoint)) { highp vec4 reprojected = mulMat4x4Float3(frameUniforms.ssrReprojection, vsHitPoint); @@ -240,11 +240,11 @@ vec4 evaluateScreenSpaceReflections(const highp vec3 wsRayDirection) { // Compute the screen-space reflection's contribution. // TODO: parameterize fadeRate. - const float fadeRateEdge = 12.0f; - const float fadeRateDistance = 4.0f; + const float fadeRateEdge = 12.0; + const float fadeRateDistance = 4.0; // Fade the reflections out near the edges. - vec2 edgeFactor = max(fadeRateEdge * abs(reprojected.xy - 0.5f) - (fadeRateEdge * 0.5f - 1.0f), 0.0f); + vec2 edgeFactor = max(fadeRateEdge * abs(reprojected.xy - 0.5) - (fadeRateEdge * 0.5 - 1.0), 0.0); float fade = saturate(1.0 - dot(edgeFactor, edgeFactor)); // Fade the reflections out near maxRayTraceDistance. @@ -256,7 +256,7 @@ vec4 evaluateScreenSpaceReflections(const highp vec3 wsRayDirection) { fade *= (1.0 - max(0.0, vsDirection.z)); // we output a premultiplied alpha color because this is going to be mipmapped - Fr = vec4(textureLod(light_ssr, reprojected.xy, 0.0).rgb * fade, fade); + Fr = vec4(textureLod(sampler0_ssr, reprojected.xy, 0.0).rgb * fade, fade); } return Fr; } diff --git a/shaders/src/main.fs b/shaders/src/main.fs index 54e554d9bd0..c0d6bdb61f8 100644 --- a/shaders/src/main.fs +++ b/shaders/src/main.fs @@ -1,25 +1,47 @@ +#if __VERSION__ == 100 +vec4 fragColor; +#else layout(location = 0) out vec4 fragColor; +#endif #if defined(MATERIAL_HAS_POST_LIGHTING_COLOR) void blendPostLightingColor(const MaterialInputs material, inout vec4 color) { + vec4 blend = color; #if defined(POST_LIGHTING_BLEND_MODE_OPAQUE) - color = material.postLightingColor; + blend = material.postLightingColor; #elif defined(POST_LIGHTING_BLEND_MODE_TRANSPARENT) - color = material.postLightingColor + color * (1.0 - material.postLightingColor.a); + blend = material.postLightingColor + color * (1.0 - material.postLightingColor.a); #elif defined(POST_LIGHTING_BLEND_MODE_ADD) - color += material.postLightingColor; + blend += material.postLightingColor; #elif defined(POST_LIGHTING_BLEND_MODE_MULTIPLY) - color *= material.postLightingColor; + blend *= material.postLightingColor; #elif defined(POST_LIGHTING_BLEND_MODE_SCREEN) - color += material.postLightingColor * (1.0 - color); + blend += material.postLightingColor * (1.0 - color); +#endif + color = mix(color, blend, material.postLightingMixFactor); +} #endif + +#if defined(BLEND_MODE_MASKED) +void applyAlphaMask(inout vec4 baseColor) { + // Use derivatives to sharpen alpha tested edges, combined with alpha to + // coverage to smooth the result + baseColor.a = (baseColor.a - getMaskThreshold()) / max(fwidth(baseColor.a), 1e-3) + 0.5; + if (baseColor.a <= getMaskThreshold()) { + discard; + } } +#else +void applyAlphaMask(inout vec4 baseColor) {} #endif void main() { filament_lodBias = frameUniforms.lodBias; +#if defined(FILAMENT_HAS_FEATURE_INSTANCING) + logical_instance_index = instance_index; +#endif - initObjectUniforms(object_uniforms); + initObjectUniforms(); // See shading_parameters.fs // Computes global variables we need to evaluate material and lighting @@ -32,21 +54,50 @@ void main() { // Invoke user code material(inputs); + applyAlphaMask(inputs.baseColor); + fragColor = evaluateMaterial(inputs); -#if defined(VARIANT_HAS_DIRECTIONAL_LIGHTING) && defined(VARIANT_HAS_SHADOWING) - bool visualizeCascades = bool(frameUniforms.cascades & 0x10u); - if (visualizeCascades) { - fragColor.rgb *= uintToColorDebug(getShadowCascade()); - } +#if defined(MATERIAL_HAS_POST_LIGHTING_COLOR) && !defined(MATERIAL_HAS_REFLECTIONS) + blendPostLightingColor(inputs, fragColor); #endif #if defined(VARIANT_HAS_FOG) - vec3 view = getWorldPosition() - getWorldCameraPosition(); + highp vec3 view = getWorldPosition() - getWorldCameraPosition(); + view = frameUniforms.fogFromWorldMatrix * view; fragColor = fog(fragColor, view); #endif -#if defined(MATERIAL_HAS_POST_LIGHTING_COLOR) && !defined(MATERIAL_HAS_REFLECTIONS) - blendPostLightingColor(inputs, fragColor); +#if defined(VARIANT_HAS_SHADOWING) && defined(VARIANT_HAS_DIRECTIONAL_LIGHTING) + if (CONFIG_DEBUG_DIRECTIONAL_SHADOWMAP) { + float a = fragColor.a; + highp vec4 p = getShadowPosition(getShadowCascade()); + p.xy = p.xy * (1.0 / p.w); + if (p.xy != saturate(p.xy)) { + vec4 c = vec4(1.0, 0, 1.0, 1.0) * a; + fragColor = mix(fragColor, c, 0.2); + } else { + highp vec2 size = vec2(textureSize(sampler0_shadowMap, 0)); + highp int ix = int(floor(p.x * size.x)); + highp int iy = int(floor(p.y * size.y)); + float t = float((ix ^ iy) & 1) * 0.2; + vec4 c = vec4(vec3(t * a), a); + fragColor = mix(fragColor, c, 0.5); + } + } +#endif + +#if MATERIAL_FEATURE_LEVEL == 0 + if (CONFIG_SRGB_SWAPCHAIN_EMULATION) { + if (frameUniforms.rec709 != 0) { + fragColor.r = pow(fragColor.r, 0.45454); + fragColor.g = pow(fragColor.g, 0.45454); + fragColor.b = pow(fragColor.b, 0.45454); + } + } +#endif + +#if __VERSION__ == 100 + gl_FragData[0] = fragColor; #endif } diff --git a/shaders/src/main.vs b/shaders/src/main.vs index e3cfbc570e2..bbb9230fc8d 100644 --- a/shaders/src/main.vs +++ b/shaders/src/main.vs @@ -7,13 +7,31 @@ */ void main() { -#if defined(TARGET_METAL_ENVIRONMENT) || defined(TARGET_VULKAN_ENVIRONMENT) +#if defined(FILAMENT_HAS_FEATURE_INSTANCING) +# if defined(TARGET_METAL_ENVIRONMENT) || defined(TARGET_VULKAN_ENVIRONMENT) instance_index = gl_InstanceIndex; -#else - instance_index = gl_InstanceID; +# else + // PowerVR drivers don't initialize gl_InstanceID correctly if it's assigned to the varying + // directly and early in the shader. Adding a bit of extra integer math, works around it. + // Using an intermediate variable doesn't work because of spirv-opt. + if (CONFIG_POWER_VR_SHADER_WORKAROUNDS) { + instance_index = (1 + gl_InstanceID) - 1; + } else { + instance_index = gl_InstanceID; + } +# endif + logical_instance_index = instance_index; +#endif + +#if defined(VARIANT_HAS_STEREO) && defined(FILAMENT_STEREO_INSTANCED) +#if !defined(FILAMENT_HAS_FEATURE_INSTANCING) +#error Instanced stereo not supported at this feature level +#endif + // Calculate the logical instance index, which is the instance index within a single eye. + logical_instance_index = instance_index / CONFIG_STEREO_EYE_COUNT; #endif - initObjectUniforms(object_uniforms); + initObjectUniforms(); // Initialize the inputs to sensible default values, see material_inputs.vs #if defined(USE_OPTIMIZED_DEPTH_VERTEX_SHADER) @@ -43,7 +61,7 @@ void main() { toTangentFrame(mesh_tangents, material.worldNormal, vertex_worldTangent.xyz); #if defined(VARIANT_HAS_SKINNING_OR_MORPHING) - if ((object_uniforms.flagsChannels & FILAMENT_OBJECT_MORPHING_ENABLED_BIT) != 0u) { + if ((object_uniforms_flagsChannels & FILAMENT_OBJECT_MORPHING_ENABLED_BIT) != 0) { #if defined(LEGACY_MORPHING) vec3 normal0, normal1, normal2, normal3; toTangentFrame(mesh_custom4, normal0); @@ -61,9 +79,8 @@ void main() { #endif } - if ((object_uniforms.flagsChannels & FILAMENT_OBJECT_SKINNING_ENABLED_BIT) != 0u) { - skinNormal(material.worldNormal, mesh_bone_indices, mesh_bone_weights); - skinNormal(vertex_worldTangent.xyz, mesh_bone_indices, mesh_bone_weights); + if ((object_uniforms_flagsChannels & FILAMENT_OBJECT_SKINNING_ENABLED_BIT) != 0) { + skinNormalTangent(material.worldNormal, vertex_worldTangent.xyz, mesh_bone_indices, mesh_bone_weights); } #endif @@ -79,7 +96,7 @@ void main() { toTangentFrame(mesh_tangents, material.worldNormal); #if defined(VARIANT_HAS_SKINNING_OR_MORPHING) - if ((object_uniforms.flagsChannels & FILAMENT_OBJECT_MORPHING_ENABLED_BIT) != 0u) { + if ((object_uniforms_flagsChannels & FILAMENT_OBJECT_MORPHING_ENABLED_BIT) != 0) { #if defined(LEGACY_MORPHING) vec3 normal0, normal1, normal2, normal3; toTangentFrame(mesh_custom4, normal0); @@ -97,7 +114,7 @@ void main() { #endif } - if ((object_uniforms.flagsChannels & FILAMENT_OBJECT_SKINNING_ENABLED_BIT) != 0u) { + if ((object_uniforms_flagsChannels & FILAMENT_OBJECT_SKINNING_ENABLED_BIT) != 0) { skinNormal(material.worldNormal, mesh_bone_indices, mesh_bone_weights); } #endif @@ -152,28 +169,29 @@ void main() { #endif // !defined(USE_OPTIMIZED_DEPTH_VERTEX_SHADER) + vec4 position; #if defined(VERTEX_DOMAIN_DEVICE) // The other vertex domains are handled in initMaterialVertex()->computeWorldPosition() - gl_Position = getPosition(); + position = getPosition(); #if !defined(USE_OPTIMIZED_DEPTH_VERTEX_SHADER) #if defined(MATERIAL_HAS_CLIP_SPACE_TRANSFORM) - gl_Position = getMaterialClipSpaceTransform(material) * gl_Position; + position = getMaterialClipSpaceTransform(material) * position; #endif #endif // !USE_OPTIMIZED_DEPTH_VERTEX_SHADER #if defined(MATERIAL_HAS_VERTEX_DOMAIN_DEVICE_JITTERED) // Apply the clip-space transform which is normally part of the projection - gl_Position.xy = gl_Position.xy * frameUniforms.clipTransform.xy + (gl_Position.w * frameUniforms.clipTransform.zw); + position.xy = position.xy * frameUniforms.clipTransform.xy + (position.w * frameUniforms.clipTransform.zw); #endif #else - gl_Position = getClipFromWorldMatrix() * getWorldPosition(material); + position = getClipFromWorldMatrix() * getWorldPosition(material); #endif #if defined(VERTEX_DOMAIN_DEVICE) // GL convention to inverted DX convention (must happen after clipSpaceTransform) - gl_Position.z = gl_Position.z * -0.5 + 0.5; + position.z = position.z * -0.5 + 0.5; #endif #if defined(VARIANT_HAS_VSM) @@ -195,15 +213,48 @@ void main() { #endif // this must happen before we compensate for vulkan below - vertex_position = gl_Position; + vertex_position = position; + +#if defined(VARIANT_HAS_STEREO) && defined(FILAMENT_STEREO_INSTANCED) + // We're transforming a vertex whose x coordinate is within the range (-w to w). + // To move it to the correct portion of the viewport, we need to modify the x coordinate. + // It's important to do this after computing vertex_position. + int eyeIndex = instance_index % CONFIG_STEREO_EYE_COUNT; + + float ndcViewportWidth = 2.0 / float(CONFIG_STEREO_EYE_COUNT); // the width of ndc space is 2 + float eyeZeroMidpoint = -1.0f + ndcViewportWidth / 2.0; + + float transform = eyeZeroMidpoint + ndcViewportWidth * float(eyeIndex); + position.x *= 1.0 / float(CONFIG_STEREO_EYE_COUNT); + position.x += transform * position.w; + + // A fragment is clipped when gl_ClipDistance is negative (outside the clip plane). + + float leftClip = position.x + + (1.0 - ndcViewportWidth * float(eyeIndex)) * position.w; + float rightClip = position.x + + (1.0 - ndcViewportWidth * float(eyeIndex + 1)) * position.w; + FILAMENT_CLIPDISTANCE[0] = leftClip; + FILAMENT_CLIPDISTANCE[1] = -rightClip; +#endif #if defined(TARGET_VULKAN_ENVIRONMENT) // In Vulkan, clip space is Y-down. In OpenGL and Metal, clip space is Y-up. - gl_Position.y = -gl_Position.y; + position.y = -position.y; #endif #if !defined(TARGET_VULKAN_ENVIRONMENT) && !defined(TARGET_METAL_ENVIRONMENT) // This is not needed in Vulkan or Metal because clipControl is always (1, 0) - gl_Position.z = dot(gl_Position.zw, frameUniforms.clipControl); + // (We don't use a dot() here because it workaround a spirv-opt optimization that in turn + // causes a crash on PowerVR, see #5118) + position.z = position.z * frameUniforms.clipControl.x + position.w * frameUniforms.clipControl.y; +#endif + + // some PowerVR drivers crash when gl_Position is written more than once + gl_Position = position; + +#if defined(VARIANT_HAS_STEREO) && defined(FILAMENT_STEREO_INSTANCED) + // Fragment shaders filter out the stereo variant, so we need to set instance_index here. + instance_index = logical_instance_index; #endif } diff --git a/shaders/src/material_inputs.fs b/shaders/src/material_inputs.fs index 3844df9f2bc..32923dc90a1 100644 --- a/shaders/src/material_inputs.fs +++ b/shaders/src/material_inputs.fs @@ -66,6 +66,7 @@ struct MaterialInputs { #if defined(MATERIAL_HAS_POST_LIGHTING_COLOR) vec4 postLightingColor; + float postLightingMixFactor; #endif #if !defined(SHADING_MODEL_CLOTH) && !defined(SHADING_MODEL_SUBSURFACE) && !defined(SHADING_MODEL_UNLIT) @@ -88,6 +89,15 @@ struct MaterialInputs { #endif #endif #endif + +#if defined(MATERIAL_HAS_SPECULAR_FACTOR) + float specularFactor; +#endif + +#if defined(MATERIAL_HAS_SPECULAR_COLOR_FACTOR) + vec3 specularColorFactor; +#endif + }; void initMaterial(out MaterialInputs material) { @@ -153,6 +163,7 @@ void initMaterial(out MaterialInputs material) { #if defined(MATERIAL_HAS_POST_LIGHTING_COLOR) material.postLightingColor = vec4(0.0); + material.postLightingMixFactor = 1.0; #endif #if !defined(SHADING_MODEL_CLOTH) && !defined(SHADING_MODEL_SUBSURFACE) && !defined(SHADING_MODEL_UNLIT) @@ -175,6 +186,15 @@ void initMaterial(out MaterialInputs material) { #endif #endif #endif + +#if defined(MATERIAL_HAS_SPECULAR_FACTOR) + material.specularFactor = 1.0; +#endif + +#if defined(MATERIAL_HAS_SPECULAR_COLOR_FACTOR) + material.specularColorFactor = vec3(1.0); +#endif + } #if defined(MATERIAL_HAS_CUSTOM_SURFACE_SHADING) diff --git a/shaders/src/post_process.fs b/shaders/src/post_process.fs index c96641d6176..3ad63266a92 100644 --- a/shaders/src/post_process.fs +++ b/shaders/src/post_process.fs @@ -4,33 +4,6 @@ void main() { // Invoke user code postProcess(inputs); -#if defined(TARGET_MOBILE) -#if defined(FRAG_OUTPUT0) - inputs.FRAG_OUTPUT0 = clamp(inputs.FRAG_OUTPUT0, -MEDIUMP_FLT_MAX, MEDIUMP_FLT_MAX); -#endif -#if defined(FRAG_OUTPUT1) - inputs.FRAG_OUTPUT1 = clamp(inputs.FRAG_OUTPUT1, -MEDIUMP_FLT_MAX, MEDIUMP_FLT_MAX); -#endif -#if defined(FRAG_OUTPUT2) - inputs.FRAG_OUTPUT2 = clamp(inputs.FRAG_OUTPUT2, -MEDIUMP_FLT_MAX, MEDIUMP_FLT_MAX); -#endif -#if defined(FRAG_OUTPUT3) - inputs.FRAG_OUTPUT3 = clamp(inputs.FRAG_OUTPUT3, -MEDIUMP_FLT_MAX, MEDIUMP_FLT_MAX); -#endif -#if defined(FRAG_OUTPUT4) - inputs.FRAG_OUTPUT4 = clamp(inputs.FRAG_OUTPUT4, -MEDIUMP_FLT_MAX, MEDIUMP_FLT_MAX); -#endif -#if defined(FRAG_OUTPUT5) - inputs.FRAG_OUTPUT5 = clamp(inputs.FRAG_OUTPUT5, -MEDIUMP_FLT_MAX, MEDIUMP_FLT_MAX); -#endif -#if defined(FRAG_OUTPUT6) - inputs.FRAG_OUTPUT6 = clamp(inputs.FRAG_OUTPUT6, -MEDIUMP_FLT_MAX, MEDIUMP_FLT_MAX); -#endif -#if defined(FRAG_OUTPUT7) - inputs.FRAG_OUTPUT7 = clamp(inputs.FRAG_OUTPUT7, -MEDIUMP_FLT_MAX, MEDIUMP_FLT_MAX); -#endif -#endif - #if defined(FRAG_OUTPUT0) FRAG_OUTPUT_AT0 FRAG_OUTPUT_SWIZZLE0 = inputs.FRAG_OUTPUT0; #endif diff --git a/shaders/src/post_process.vs b/shaders/src/post_process.vs index 893a7da00f3..c9b80e244ee 100644 --- a/shaders/src/post_process.vs +++ b/shaders/src/post_process.vs @@ -5,19 +5,27 @@ void main() { inputs.normalizedUV = position.xy * 0.5 + 0.5; - gl_Position = getPosition(); - // GL convention to inverted DX convention - gl_Position.z = gl_Position.z * -0.5 + 0.5; + inputs.position = getPosition(); + + // Invoke user code + postProcessVertex(inputs); + + // (vertex domain) GL convention to inverted DX convention + inputs.position.z = inputs.position.z * -0.5 + 0.5; + +#if defined(TARGET_VULKAN_ENVIRONMENT) + // In Vulkan, clip space is Y-down. In OpenGL and Metal, clip space is Y-up. + inputs.position.y = -inputs.position.y; +#endif // Adjust clip-space #if !defined(TARGET_VULKAN_ENVIRONMENT) && !defined(TARGET_METAL_ENVIRONMENT) // This is not needed in Vulkan or Metal because clipControl is always (1, 0) - gl_Position.z = dot(gl_Position.zw, frameUniforms.clipControl); + // (We don't use a dot() here because it works around a spirv-opt optimization that in turn + // causes a crash on PowerVR, see #5118) + inputs.position.z = inputs.position.z * frameUniforms.clipControl.x + inputs.position.w * frameUniforms.clipControl.y; #endif - // Invoke user code - postProcessVertex(inputs); - // Handle user-defined interpolated attributes #if defined(VARIABLE_CUSTOM0) VARIABLE_CUSTOM_AT0 = inputs.VARIABLE_CUSTOM0; @@ -31,4 +39,7 @@ void main() { #if defined(VARIABLE_CUSTOM3) VARIABLE_CUSTOM_AT3 = inputs.VARIABLE_CUSTOM3; #endif + + // some PowerVR drivers crash when gl_Position is written more than once + gl_Position = inputs.position; } diff --git a/shaders/src/post_process_getters.vs b/shaders/src/post_process_getters.vs index 47cd2544bef..8b641e5bdfc 100644 --- a/shaders/src/post_process_getters.vs +++ b/shaders/src/post_process_getters.vs @@ -1,11 +1,4 @@ /** @public-api */ vec4 getPosition() { - vec4 pos = position; - -// In Vulkan, clip space is Y-down. In OpenGL and Metal, clip space is Y-up. -#if defined(TARGET_VULKAN_ENVIRONMENT) - pos.y = -pos.y; -#endif - - return pos; + return position; } diff --git a/shaders/src/post_process_inputs.fs b/shaders/src/post_process_inputs.fs index c6c548c1332..38ad14639d8 100644 --- a/shaders/src/post_process_inputs.fs +++ b/shaders/src/post_process_inputs.fs @@ -1,28 +1,28 @@ struct PostProcessInputs { #if defined(FRAG_OUTPUT0) - FRAG_OUTPUT_MATERIAL_TYPE0 FRAG_OUTPUT0; + FRAG_OUTPUT_PRECISION0 FRAG_OUTPUT_MATERIAL_TYPE0 FRAG_OUTPUT0; #endif #if defined(FRAG_OUTPUT1) - FRAG_OUTPUT_MATERIAL_TYPE1 FRAG_OUTPUT1; + FRAG_OUTPUT_PRECISION1 FRAG_OUTPUT_MATERIAL_TYPE1 FRAG_OUTPUT1; #endif #if defined(FRAG_OUTPUT2) - FRAG_OUTPUT_MATERIAL_TYPE2 FRAG_OUTPUT2; + FRAG_OUTPUT_PRECISION2 FRAG_OUTPUT_MATERIAL_TYPE2 FRAG_OUTPUT2; #endif #if defined(FRAG_OUTPUT3) - FRAG_OUTPUT_MATERIAL_TYPE3 FRAG_OUTPUT3; + FRAG_OUTPUT_PRECISION3 FRAG_OUTPUT_MATERIAL_TYPE3 FRAG_OUTPUT3; #endif #if defined(FRAG_OUTPUT4) - FRAG_OUTPUT_MATERIAL_TYPE4 FRAG_OUTPUT4; + FRAG_OUTPUT_PRECISION4 FRAG_OUTPUT_MATERIAL_TYPE4 FRAG_OUTPUT4; #endif #if defined(FRAG_OUTPUT5) - FRAG_OUTPUT_MATERIAL_TYPE5 FRAG_OUTPUT5; + FRAG_OUTPUT_PRECISION5 FRAG_OUTPUT_MATERIAL_TYPE5 FRAG_OUTPUT5; #endif #if defined(FRAG_OUTPUT6) - FRAG_OUTPUT_MATERIAL_TYPE6 FRAG_OUTPUT6; + FRAG_OUTPUT_PRECISION6 FRAG_OUTPUT_MATERIAL_TYPE6 FRAG_OUTPUT6; #endif #if defined(FRAG_OUTPUT7) - FRAG_OUTPUT_MATERIAL_TYPE7 FRAG_OUTPUT7; + FRAG_OUTPUT_PRECISION7 FRAG_OUTPUT_MATERIAL_TYPE7 FRAG_OUTPUT7; #endif #if defined(FRAG_OUTPUT_DEPTH) float depth; diff --git a/shaders/src/post_process_inputs.vs b/shaders/src/post_process_inputs.vs index 1bbb1256a0b..eb2af8ab084 100644 --- a/shaders/src/post_process_inputs.vs +++ b/shaders/src/post_process_inputs.vs @@ -1,10 +1,13 @@ -LAYOUT_LOCATION(LOCATION_POSITION) in vec4 position; +LAYOUT_LOCATION(LOCATION_POSITION) ATTRIBUTE vec4 position; struct PostProcessVertexInputs { // We provide normalized texture coordinates to custom vertex shaders. vec2 normalizedUV; + // vertex position, can be modified by the user code + vec4 position; + #ifdef VARIABLE_CUSTOM0 vec4 VARIABLE_CUSTOM0; #endif diff --git a/shaders/src/shading_lit.fs b/shaders/src/shading_lit.fs index 7a1d4e7b677..103005845cf 100644 --- a/shaders/src/shading_lit.fs +++ b/shaders/src/shading_lit.fs @@ -3,11 +3,6 @@ //------------------------------------------------------------------------------ #if defined(BLEND_MODE_MASKED) -float computeMaskedAlpha(float a) { - // Use derivatives to smooth alpha tested edges - return (a - getMaskThreshold()) / max(fwidth(a), 1e-3) + 0.5; -} - float computeDiffuseAlpha(float a) { // If we reach this point in the code, we already know that the fragment is not discarded due // to the threshold factor. Therefore we can just output 1.0, which prevents a "punch through" @@ -15,14 +10,6 @@ float computeDiffuseAlpha(float a) { // of ALPHA_TO_COVERAGE. return (frameUniforms.needsAlphaChannel == 1.0) ? 1.0 : a; } - -void applyAlphaMask(inout vec4 baseColor) { - baseColor.a = computeMaskedAlpha(baseColor.a); - if (baseColor.a <= 0.0) { - discard; - } -} - #else // not masked float computeDiffuseAlpha(float a) { @@ -32,9 +19,6 @@ float computeDiffuseAlpha(float a) { return 1.0; #endif } - -void applyAlphaMask(inout vec4 baseColor) {} - #endif #if defined(GEOMETRIC_SPECULAR_AA) @@ -53,8 +37,11 @@ float normalFiltering(float perceptualRoughness, const vec3 worldNormal) { vec3 du = dFdx(worldNormal); vec3 dv = dFdy(worldNormal); - float variance = materialParams._specularAntiAliasingVariance * (dot(du, du) + dot(dv, dv)); + // specular AA factor to correct for resolution scaling (DSR and TAAx4) + du *= frameUniforms.derivativesScale.x; + dv *= frameUniforms.derivativesScale.y; + float variance = materialParams._specularAntiAliasingVariance * (dot(du, du) + dot(dv, dv)); float roughness = perceptualRoughnessToRoughness(perceptualRoughness); float kernelRoughness = min(2.0 * variance, materialParams._specularAntiAliasingThreshold); float squareRoughness = saturate(roughness * roughness + kernelRoughness); @@ -65,7 +52,6 @@ float normalFiltering(float perceptualRoughness, const vec3 worldNormal) { void getCommonPixelParams(const MaterialInputs material, inout PixelParams pixel) { vec4 baseColor = material.baseColor; - applyAlphaMask(baseColor); #if defined(BLEND_MODE_FADE) && !defined(SHADING_MODEL_UNLIT) // Since we work in premultiplied alpha mode, we need to un-premultiply @@ -89,7 +75,21 @@ void getCommonPixelParams(const MaterialInputs material, inout PixelParams pixel // Assumes an interface from air to an IOR of 1.5 for dielectrics float reflectance = computeDielectricF0(material.reflectance); #endif +#if !defined(MATERIAL_HAS_SPECULAR_FACTOR) && !defined(MATERIAL_HAS_SPECULAR_COLOR_FACTOR) pixel.f0 = computeF0(baseColor, material.metallic, reflectance); +#else + vec3 dielectricSpecularF0 = vec3(0.0); + float dielectricSpecularF90 = 0.0; +#if defined(MATERIAL_HAS_SPECULAR_COLOR_FACTOR) + dielectricSpecularF0 = min(reflectance * material.specularColorFactor, vec3(1.0)); +#endif +#if defined(MATERIAL_HAS_SPECULAR_FACTOR) + dielectricSpecularF0 *= material.specularFactor; + dielectricSpecularF90 = material.specularFactor; +#endif + pixel.f0 = baseColor.rgb * material.metallic + dielectricSpecularF0 * (1.0 - material.metallic); + pixel.f90 = material.metallic + dielectricSpecularF90 * (1.0 - material.metallic); +#endif #else pixel.diffuseColor = baseColor.rgb; pixel.f0 = material.sheenColor; @@ -137,6 +137,16 @@ void getCommonPixelParams(const MaterialInputs material, inout PixelParams pixel #endif } +void getSpecularPixelParams(const MaterialInputs material, inout PixelParams pixel) { +#if defined(MATERIAL_HAS_SPECULAR_FACTOR) + pixel.specular = material.specularFactor; +#endif + +#if defined(MATERIAL_HAS_SPECULAR_COLOR_FACTOR) + pixel.specularColor = material.specularColorFactor; +#endif +} + void getSheenPixelParams(const MaterialInputs material, inout PixelParams pixel) { #if defined(MATERIAL_HAS_SHEEN_COLOR) && !defined(SHADING_MODEL_CLOTH) && !defined(SHADING_MODEL_SUBSURFACE) pixel.sheenColor = material.sheenColor; @@ -246,6 +256,7 @@ void getEnergyCompensationPixelParams(inout PixelParams pixel) { * testing fails. */ void getPixelParams(const MaterialInputs material, out PixelParams pixel) { + getSpecularPixelParams(material, pixel); getCommonPixelParams(material, pixel); getSheenPixelParams(material, pixel); getClearCoatPixelParams(material, pixel); @@ -299,7 +310,10 @@ void addEmissive(const MaterialInputs material, inout vec4 color) { #if defined(MATERIAL_HAS_EMISSIVE) highp vec4 emissive = material.emissive; highp float attenuation = mix(1.0, getExposure(), emissive.w); - color.rgb += emissive.rgb * (attenuation * color.a); +#if defined(BLEND_MODE_TRANSPARENT) || defined(BLEND_MODE_FADE) + attenuation *= color.a; +#endif + color.rgb += emissive.rgb * attenuation; #endif } diff --git a/shaders/src/shading_model_standard.fs b/shaders/src/shading_model_standard.fs index 025295ba279..ca71d1de0fe 100644 --- a/shaders/src/shading_model_standard.fs +++ b/shaders/src/shading_model_standard.fs @@ -63,8 +63,11 @@ vec3 isotropicLobe(const PixelParams pixel, const Light light, const vec3 h, float D = distribution(pixel.roughness, NoH, h); float V = visibility(pixel.roughness, NoV, NoL); +#if defined(MATERIAL_HAS_SPECULAR_COLOR_FACTOR) || defined(MATERIAL_HAS_SPECULAR_FACTOR) + vec3 F = fresnel(pixel.f0, pixel.f90, LoH); +#else vec3 F = fresnel(pixel.f0, LoH); - +#endif return (D * V) * F; } @@ -144,7 +147,6 @@ vec3 surfaceShading(const PixelParams pixel, const Light light, float occlusion) color += clearCoat; #endif #endif - return (color * light.colorIntensity.rgb) * (light.colorIntensity.w * light.attenuation * NoL * occlusion); } diff --git a/shaders/src/shading_parameters.fs b/shaders/src/shading_parameters.fs index 34fc2496832..3c7d3aa31bc 100644 --- a/shaders/src/shading_parameters.fs +++ b/shaders/src/shading_parameters.fs @@ -33,7 +33,13 @@ void computeShadingParams() { #endif shading_position = vertex_worldPosition.xyz; - shading_view = normalize(frameUniforms.cameraPosition - shading_position); + + // With perspective camera, the view vector is cast from the fragment pos to the eye position, + // With ortho camera, however, the view vector is the same for all fragments: + highp vec3 sv = isPerspectiveProjection() ? + (frameUniforms.worldFromViewMatrix[3].xyz - shading_position) : + frameUniforms.worldFromViewMatrix[2].xyz; // ortho camera backward dir + shading_view = normalize(sv); // we do this so we avoid doing (matrix multiply), but we burn 4 varyings: // p = clipFromWorldMatrix * shading_position; diff --git a/shaders/src/shading_unlit.fs b/shaders/src/shading_unlit.fs index b7d0bd70547..a3ff0059c86 100644 --- a/shaders/src/shading_unlit.fs +++ b/shaders/src/shading_unlit.fs @@ -2,16 +2,24 @@ void addEmissive(const MaterialInputs material, inout vec4 color) { #if defined(MATERIAL_HAS_EMISSIVE) highp vec4 emissive = material.emissive; highp float attenuation = mix(1.0, getExposure(), emissive.w); - color.rgb += emissive.rgb * (attenuation * color.a); +#if defined(BLEND_MODE_TRANSPARENT) || defined(BLEND_MODE_FADE) + attenuation *= color.a; +#endif + color.rgb += emissive.rgb * attenuation; #endif } +vec4 fixupAlpha(vec4 color) { #if defined(BLEND_MODE_MASKED) -float computeMaskedAlpha(float a) { - // Use derivatives to smooth alpha tested edges - return (a - getMaskThreshold()) / max(fwidth(a), 1e-3) + 0.5; -} + // If we reach this point in the code, we already know that the fragment is not discarded due + // to the threshold factor. Therefore we can just output 1.0, which prevents a "punch through" + // effect from occuring. We do this only for TRANSLUCENT views in order to prevent breakage + // of ALPHA_TO_COVERAGE. + return vec4(color.rgb, (frameUniforms.needsAlphaChannel == 1.0) ? 1.0 : color.a); +#else + return color; #endif +} /** * Evaluates unlit materials. In this lighting model, only the base color and @@ -30,31 +38,24 @@ float computeMaskedAlpha(float a) { vec4 evaluateMaterial(const MaterialInputs material) { vec4 color = material.baseColor; -#if defined(BLEND_MODE_MASKED) - color.a = computeMaskedAlpha(color.a); - if (color.a <= 0.0) { - discard; - } - - // Output 1.0 for translucent view to prevent "punch through" artifacts. We do not do this - // for opaque views to enable proper usage of ALPHA_TO_COVERAGE. - if (frameUniforms.needsAlphaChannel == 1.0) { - color.a = 1.0; - } -#endif - #if defined(VARIANT_HAS_DIRECTIONAL_LIGHTING) #if defined(VARIANT_HAS_SHADOWING) float visibility = 1.0; - uint cascade = getShadowCascade(); - bool cascadeHasVisibleShadows = bool(frameUniforms.cascades & ((1u << cascade) << 8u)); - bool hasDirectionalShadows = bool(frameUniforms.directionalShadows & 1u); + int cascade = getShadowCascade(); + bool cascadeHasVisibleShadows = bool(frameUniforms.cascades & ((1 << cascade) << 8)); + bool hasDirectionalShadows = bool(frameUniforms.directionalShadows & 1); if (hasDirectionalShadows && cascadeHasVisibleShadows) { highp vec4 shadowPosition = getShadowPosition(cascade); - visibility = shadow(true, light_shadowMap, cascade, shadowPosition, 0.0f); + visibility = shadow(true, sampler0_shadowMap, cascade, shadowPosition, 0.0); + // shadow far attenuation + highp vec3 v = getWorldPosition() - getWorldCameraPosition(); + // (viewFromWorld * v).z == dot(transpose(viewFromWorld), v) + highp float z = dot(transpose(getViewFromWorldMatrix())[2].xyz, v); + highp vec2 p = frameUniforms.shadowFarAttenuationParams; + visibility = 1.0 - ((1.0 - visibility) * saturate(p.x - z * z * p.y)); } - if ((frameUniforms.directionalShadows & 0x2u) != 0u && visibility > 0.0) { - if ((object_uniforms.flagsChannels & FILAMENT_OBJECT_CONTACT_SHADOWS_BIT) != 0u) { + if ((frameUniforms.directionalShadows & 0x2) != 0 && visibility > 0.0) { + if ((object_uniforms_flagsChannels & FILAMENT_OBJECT_CONTACT_SHADOWS_BIT) != 0) { visibility *= (1.0 - screenSpaceContactShadow(frameUniforms.lightDirection)); } } @@ -68,5 +69,5 @@ vec4 evaluateMaterial(const MaterialInputs material) { addEmissive(material, color); - return color; + return fixupAlpha(color); } diff --git a/shaders/src/shadowing.fs b/shaders/src/shadowing.fs index fdcf0ee174a..cde6d8a9ee1 100644 --- a/shaders/src/shadowing.fs +++ b/shaders/src/shadowing.fs @@ -8,10 +8,8 @@ #define SHADOW_SAMPLING_RUNTIME_DPCF 2u #define SHADOW_SAMPLING_RUNTIME_PCSS 3u -// TODO: this should be user-settable, maybe at the material level #define SHADOW_SAMPLING_PCF_HARD 0 #define SHADOW_SAMPLING_PCF_LOW 1 -#define SHADOW_SAMPLING_METHOD SHADOW_SAMPLING_PCF_LOW //------------------------------------------------------------------------------ // PCF Shadow Sampling @@ -19,7 +17,7 @@ float sampleDepth(const mediump sampler2DArrayShadow map, const highp vec4 scissorNormalized, - const uint layer, highp vec2 uv, float depth) { + const uint layer, highp vec2 uv, highp float depth) { // clamp needed for directional lights and/or large kernels uv = clamp(uv, scissorNormalized.xy, scissorNormalized.zw); @@ -29,7 +27,6 @@ float sampleDepth(const mediump sampler2DArrayShadow map, return texture(map, vec4(uv, layer, saturate(depth))); } -#if SHADOW_SAMPLING_METHOD == SHADOW_SAMPLING_PCF_HARD // use hardware assisted PCF float ShadowSample_PCF_Hard(const mediump sampler2DArrayShadow map, const highp vec4 scissorNormalized, @@ -38,9 +35,7 @@ float ShadowSample_PCF_Hard(const mediump sampler2DArrayShadow map, // note: shadowPosition.z is in the [1, 0] range (reversed Z) return sampleDepth(map, scissorNormalized, layer, position.xy, position.z); } -#endif -#if SHADOW_SAMPLING_METHOD == SHADOW_SAMPLING_PCF_LOW // use hardware assisted PCF + 3x3 gaussian filter float ShadowSample_PCF_Low(const mediump sampler2DArrayShadow map, const highp vec4 scissorNormalized, @@ -51,7 +46,7 @@ float ShadowSample_PCF_Low(const mediump sampler2DArrayShadow map, highp vec2 texelSize = vec2(1.0) / size; // Castaño, 2013, "Shadow Mapping Summary Part 1" - float depth = position.z; + highp float depth = position.z; // clamp position to avoid overflows below, which cause some GPUs to abort position.xy = clamp(position.xy, vec2(-1.0), vec2(2.0)); @@ -77,7 +72,6 @@ float ShadowSample_PCF_Low(const mediump sampler2DArrayShadow map, sum += uw.y * vw.y * sampleDepth(map, scissorNormalized, layer, base + vec2(u.y, v.y), depth); return sum * (1.0 / 16.0); } -#endif // use manual PCF float ShadowSample_PCF(const mediump sampler2DArray map, @@ -85,24 +79,8 @@ float ShadowSample_PCF(const mediump sampler2DArray map, const uint layer, const highp vec4 shadowPosition) { highp vec3 position = shadowPosition.xyz * (1.0 / shadowPosition.w); // note: shadowPosition.z is in the [1, 0] range (reversed Z) - highp vec2 size = vec2(textureSize(map, 0)); highp vec2 tc = clamp(position.xy, scissorNormalized.xy, scissorNormalized.zw); - highp vec2 st = tc.xy * size - 0.5; - - vec4 d; -#if defined(FILAMENT_HAS_FEATURE_TEXTURE_GATHER) - d = textureGather(map, vec3(tc, layer), 0); // 01, 11, 10, 00 -#else - // we must use texelFetchOffset before texelLodOffset filters - d[0] = texelFetchOffset(map, ivec3(st, layer), 0, ivec2(0, 1)).r; - d[1] = texelFetchOffset(map, ivec3(st, layer), 0, ivec2(1, 1)).r; - d[2] = texelFetchOffset(map, ivec3(st, layer), 0, ivec2(1, 0)).r; - d[3] = texelFetchOffset(map, ivec3(st, layer), 0, ivec2(0, 0)).r; -#endif - - vec4 pcf = step(0.0, position.zzzz - d); - highp vec2 grad = fract(st); - return mix(mix(pcf.w, pcf.z, grad.x), mix(pcf.x, pcf.y, grad.x), grad.y); + return step(0.0, position.z - textureLod(map, vec3(tc, layer), 0.0).r); } //------------------------------------------------------------------------------ @@ -167,7 +145,7 @@ mat2 getRandomRotationMatrix(highp vec2 fragCoord) { return R; } -float getPenumbraLs(const bool DIRECTIONAL, const uint index, const highp float zLight) { +float getPenumbraLs(const bool DIRECTIONAL, const int index, const highp float zLight) { float penumbra; // This conditional is resolved at compile time if (DIRECTIONAL) { @@ -179,7 +157,7 @@ float getPenumbraLs(const bool DIRECTIONAL, const uint index, const highp float return penumbra; } -float getPenumbraRatio(const bool DIRECTIONAL, const uint index, +float getPenumbraRatio(const bool DIRECTIONAL, const int index, float z_receiver, float z_blocker) { // z_receiver/z_blocker are not linear depths (i.e. they're not distances) // Penumbra ratio for PCSS is given by: pr = (d_receiver - d_blocker) / d_blocker @@ -237,7 +215,7 @@ float filterPCSS(const mediump sampler2DArray map, const highp vec2 filterRadii, const mat2 R, const highp vec2 dz_duv, const uint tapCount) { - float occludedCount = 0.0; + float occludedCount = 0.0; // must be highp to workaround a spirv-tools issue for (uint i = 0u; i < tapCount; i++) { highp vec2 duv = R * (poissonDisk[i] * filterRadii); @@ -273,7 +251,7 @@ float filterPCSS(const mediump sampler2DArray map, float ShadowSample_DPCF(const bool DIRECTIONAL, const mediump sampler2DArray map, const highp vec4 scissorNormalized, - const uint layer, const uint index, + const uint layer, const int index, const highp vec4 shadowPosition, const highp float zLight) { highp vec3 position = shadowPosition.xyz * (1.0 / shadowPosition.w); highp vec2 texelSize = vec2(1.0) / vec2(textureSize(map, 0)); @@ -320,7 +298,7 @@ float ShadowSample_DPCF(const bool DIRECTIONAL, float ShadowSample_PCSS(const bool DIRECTIONAL, const mediump sampler2DArray map, const highp vec4 scissorNormalized, - const uint layer, const uint index, + const uint layer, const int index, const highp vec4 shadowPosition, const highp float zLight) { highp vec2 size = vec2(textureSize(map, 0)); highp vec2 texelSize = vec2(1.0) / size; @@ -395,7 +373,7 @@ void initScreenSpaceRay(out ScreenSpaceRay ray, highp vec3 wsRayStart, vec3 wsRa float screenSpaceContactShadow(vec3 lightDirection) { // cast a ray in the direction of the light float occlusion = 0.0; - uint kStepCount = (frameUniforms.directionalShadows >> 8u) & 0xFFu; + int kStepCount = (frameUniforms.directionalShadows >> 8) & 0xFF; float kDistanceMax = frameUniforms.ssContactShadowDistance; ScreenSpaceRay rayData; @@ -414,9 +392,9 @@ float screenSpaceContactShadow(vec3 lightDirection) { highp float t = dt * dither + dt; highp vec3 ray; - for (uint i = 0u ; i < kStepCount ; i++, t += dt) { + for (int i = 0 ; i < kStepCount ; i++, t += dt) { ray = rayData.uvRayStart + rayData.uvRay * t; - highp float z = textureLod(light_structure, uvToRenderTargetUV(ray.xy), 0.0).r; + highp float z = textureLod(sampler0_structure, uvToRenderTargetUV(ray.xy), 0.0).r; highp float dz = z - ray.z; if (abs(tolerance - dz) < tolerance) { occlusion = 1.0; @@ -466,7 +444,7 @@ float evaluateShadowVSM(const highp vec2 moments, const highp float depth) { return chebyshevUpperBound(moments, depth, minVariance, frameUniforms.vsmLightBleedReduction); } -float ShadowSample_VSM(const bool ELVSM, const mediump sampler2DArray shadowMap, +float ShadowSample_VSM(const bool ELVSM, const highp sampler2DArray shadowMap, const highp vec4 scissorNormalized, const uint layer, const highp vec4 shadowPosition) { @@ -507,49 +485,50 @@ float ShadowSample_VSM(const bool ELVSM, const mediump sampler2DArray shadowMap, // get texture coordinate for directional and spot shadow maps #if defined(VARIANT_HAS_DIRECTIONAL_LIGHTING) -highp vec4 getShadowPosition(const uint cascade) { +highp vec4 getShadowPosition(const int cascade) { return getCascadeLightSpacePosition(cascade); } #endif #if defined(VARIANT_HAS_DYNAMIC_LIGHTING) -highp vec4 getShadowPosition(const uint index, const highp vec3 dir, const highp float zLight) { +highp vec4 getShadowPosition(const int index, const highp vec3 dir, const highp float zLight) { return getSpotLightSpacePosition(index, dir, zLight); } #endif -uint getPointLightFace(const highp vec3 r) { +int getPointLightFace(const highp vec3 r) { highp vec4 tc; highp float rx = abs(r.x); highp float ry = abs(r.y); highp float rz = abs(r.z); highp float d = max(rx, max(ry, rz)); if (d == rx) { - return (r.x >= 0.0 ? 0u : 1u); + return (r.x >= 0.0 ? 0 : 1); } else if (d == ry) { - return (r.y >= 0.0 ? 2u : 3u); + return (r.y >= 0.0 ? 2 : 3); } else { - return (r.z >= 0.0 ? 4u : 5u); + return (r.z >= 0.0 ? 4 : 5); } } // PCF sampling float shadow(const bool DIRECTIONAL, const mediump sampler2DArrayShadow shadowMap, - const uint index, highp vec4 shadowPosition, highp float zLight) { + const int index, highp vec4 shadowPosition, highp float zLight) { highp vec4 scissorNormalized = shadowUniforms.shadows[index].scissorNormalized; uint layer = shadowUniforms.shadows[index].layer; -#if SHADOW_SAMPLING_METHOD == SHADOW_SAMPLING_PCF_HARD - return ShadowSample_PCF_Hard(shadowMap, scissorNormalized, layer, shadowPosition); -#elif SHADOW_SAMPLING_METHOD == SHADOW_SAMPLING_PCF_LOW - return ShadowSample_PCF_Low(shadowMap, scissorNormalized, layer, shadowPosition); -#endif + + if (CONFIG_SHADOW_SAMPLING_METHOD == SHADOW_SAMPLING_PCF_HARD) { + return ShadowSample_PCF_Hard(shadowMap, scissorNormalized, layer, shadowPosition); + } else if (CONFIG_SHADOW_SAMPLING_METHOD == SHADOW_SAMPLING_PCF_LOW) { + return ShadowSample_PCF_Low(shadowMap, scissorNormalized, layer, shadowPosition); + } } // Shadow requiring a sampler2D sampler (VSM, DPCF and PCSS) float shadow(const bool DIRECTIONAL, - const mediump sampler2DArray shadowMap, - const uint index, highp vec4 shadowPosition, highp float zLight) { + const highp sampler2DArray shadowMap, + const int index, highp vec4 shadowPosition, highp float zLight) { highp vec4 scissorNormalized = shadowUniforms.shadows[index].scissorNormalized; uint layer = shadowUniforms.shadows[index].layer; // This conditional is resolved at compile time diff --git a/shaders/src/varyings.glsl b/shaders/src/varyings.glsl index 91ecade3fc3..a0478838ded 100644 --- a/shaders/src/varyings.glsl +++ b/shaders/src/varyings.glsl @@ -13,7 +13,10 @@ LAYOUT_LOCATION(6) SHADING_INTERPOLATION VARYING mediump vec4 vertex_worldTangen LAYOUT_LOCATION(7) VARYING highp vec4 vertex_position; +#if defined(FILAMENT_HAS_FEATURE_INSTANCING) LAYOUT_LOCATION(8) flat VARYING highp int instance_index; +highp int logical_instance_index; +#endif #if defined(HAS_ATTRIBUTE_COLOR) LAYOUT_LOCATION(9) VARYING mediump vec4 vertex_color; @@ -30,3 +33,17 @@ LAYOUT_LOCATION(11) VARYING highp vec4 vertex_lightSpacePosition; #endif // Note that fragColor is an output and is not declared here; see main.fs and depth_main.fs + +#if defined(VARIANT_HAS_STEREO) && defined(FILAMENT_STEREO_INSTANCED) +#if defined(GL_ES) && defined(FILAMENT_GLSLANG) +// On ES, gl_ClipDistance is not a built-in, so we have to rely on EXT_clip_cull_distance +// However, this extension is not supported by glslang, so we instead write to +// filament_gl_ClipDistance, which will get decorated at the SPIR-V stage to refer to the built-in. +// The location here does not matter, so long as it doesn't conflict with others. +LAYOUT_LOCATION(100) out float filament_gl_ClipDistance[2]; +#define FILAMENT_CLIPDISTANCE filament_gl_ClipDistance +#else +// If we're on Desktop GL (or not running shaders through glslang), we're free to use gl_ClipDistance +#define FILAMENT_CLIPDISTANCE gl_ClipDistance +#endif // GL_ES && FILAMENT_GLSLANG +#endif // VARIANT_HAS_STEREO diff --git a/site/content/posts/cocoapods.md b/site/content/posts/cocoapods.md deleted file mode 100644 index 25d279c9dfe..00000000000 --- a/site/content/posts/cocoapods.md +++ /dev/null @@ -1,507 +0,0 @@ ---- -title: "CocoaPods Hello Triangle" -date: 2020-07-09T14:48:51-07:00 ---- - -As of release 1.8.0, you can install Filament in your iOS application using CocoaPods. - -This guide will walk you through creating a basic "hello triangle" iOS application using Filament and the Metal backend. - -![a rotating triangle](rotating-triangle.gif) - -The full source for this example is [here](https://github.com/google/filament/tree/main/ios/samples/HelloCocoaPods). If you're just looking to get something up and running quickly, download the project, `pod install`, build, and run. - -We'll be walking through 7 steps to get the rotating triangle up and running. All of the code we'll be writing will be in a single ViewController.mm file, and you can follow along [here](https://github.com/google/filament/blob/main/ios/samples/HelloCocoaPods/HelloCocoaPods/ViewController.mm). - -- [1. Creating a Boilerplate App]({{< ref "#creating-a-boilerplate-app-with-filament" >}}) -- [2. Instantiating Filament]({{< ref "#instantiating-the-filament-engine" >}}) -- [3. Creating a SwapChain]({{< ref "#creating-a-swapchain" >}}) -- [4. Clearing the Screen]({{< ref "#clearing-the-screen" >}}) -- [5. Drawing a Triangle]({{< ref "#drawing-a-triangle" >}}) -- [6. Compiling a Custom Material]({{< ref "#compiling-a-custom-material" >}}) -- [7. Animating the Triangle]({{< ref "#animating-the-triangle" >}}) - -## Creating a Boilerplate App with Filament - -We'll start fresh by creating a new Single View App in Xcode. - -![create a single view app in Xcodde](single-view-app.png) - -Give your app a name, and use the default options. - -![use the default options in Xcode](default-options.png) - -If you haven't used CocoaPods before, I recommend watching [this Route 85 video](https://www.youtube.com/watch?v=iEAjvNRdZa0) to help you get set up. - -Create a Podfile in the Xcode project directory with the following: - -``` -platform :ios, '11.0' - -target 'HelloCocoaPods' do - pod 'Filament' -end -``` - -Then run: - -``` -$ pod install -``` - -Close the project and then re-open the newly created HelloCocoaPods.xcworkspace file. - -## Instantiating the Filament Engine - -Before we do anything with Filament, we first need to include the appropriate headers. Filament exposes a C++ API, so any files that include Filament headers need to be compiled in a variant of C++. We'll be using Objective-C++. - -You should be able to simply change the extension of the default ViewController from .m to .mm, though I've found Xcode to be buggy with this on occasion. To make sure Xcode recognizes it as an Objective-C++ file, check that the type of file is "Objective-C++ Source". - -![change the type of ViewController.m to Objective-C++](obj-cpp.png) - -Then, add the following to the top of ViewController. - -```obj-c -#include - -using namespace filament; -``` - -We'll need to keep track of a few Filament objects, so let's add a section for private instance variables and add a pointer for our `Engine` instance. - -```obj-c -@implementation Viewcontroller { - Engine* _engine; -} -``` - -The Filament `Engine` is our main entrypoint into Filament. We start by instantiating it inside `viewDidLoad`. - -```obj-c -- (void)viewDidLoad { - [super viewDidLoad]; - - _engine = Engine::create(Engine::Backend::METAL); -} -``` - -We specify `Engine::Backend::METAL` to select the Metal backend. Filament also supports OpenGL on iOS, but we strongly recommend sticking to Metal. - -Every Filament object we create must also be destroyed. Add the `dealloc` method and the following: - -```obj-c -- (void)dealloc { - _engine->destroy(&_engine); -} -``` - -If you compile and run the app now you should see output similar to the following: - -``` -FEngine (64 bits) created at 0x10ab94000 (threading is enabled) -FEngine resolved backend: Metal -``` - -## Creating a SwapChain - -Before we can render anything, we'll first need to create a `SwapChain`. The `SwapChain` represents a platform-specific surface that can be rendered into. On iOS with Metal, it's a [`CAMetalLayer`](https://developer.apple.com/documentation/quartzcore/cametallayer). - -We could set up our own `CAMetalLayer` if we wanted to, but Apple provides a `MTKView` that is already backed by a `CAMetalLayer`. It also has a delegate protocol with some methods that will make things easier for us. - -Inside Main.storyboard, change the type of ViewController's view to a `MTKView`. - -![ViewController view](view.png) - -![change type of MTKView](mtkview.gif) - -Include the SwapChain.h and MTKView.h headers and make the `ViewController` conform to the `MTKViewDelegate` protocol. - -```obj-c -#include - -#import - -@interface ViewController () - -@end -``` - -Add a new private var: - -```obj-c -SwapChain* _swapChain; -``` - -Inside `viewDidLoad`, we'll set our `ViewController` as the `MTKView` delegate and instantiate our `SwapChain`. To instantiate the `SwapChain`, we pass in `view.layer` which, because we set our `View` to a `MTKView`, will be a `CAMetalLayer`. Filament's API is platform-agnostic, which is why we need to cast the layer to a `void*`. - -```obj-c -MTKView* mtkView = (MTKView*) self.view; -mtkView.delegate = self; -_swapChain = _engine->createSwapChain((__bridge void*) mtkView.layer); -``` - -The `SwapChain` needs to be destroyed in our `dealloc` function. We'll destroy the objects in the reverse order we created them; the `Engine` object should always be the the last object we destroy. - -```obj-c -_engine->destroy(_swapChain); -_engine->destroy(&_engine); -``` - -Finally, add stubs for some `MTKViewDelegate` methods, which we'll fill in later. - -```obj-c -- (void)mtkView:(nonnull MTKView*)view drawableSizeWillChange:(CGSize)size { - // todo -} - -- (void)drawInMTKView:(nonnull MTKView*)view { - // todo -} -``` - -## Clearing The Screen - -We now have a Filament `Engine` and `SwapChain` set up. We'll need a few more objects before we can render anything. - -A Filament `Renderer` gives us an API to render frames into the `SwapChain`. It takes a `View`, which defines a `Viewport`, `Scene` and `Camera` for rendering. The `Camera` represents a vantage point into a `Scene`, which contains references to all the entities we want to render. - -Creating these are objects is straightforward. First, include the appropriate headers - -```c++ -#include -#include -#include -#include -#include - -#include -#include - -using namespace utils; -``` - -add the following private vars - -```obj-c -Renderer* _renderer; -View* _view; -Scene* _scene; -Camera* _camera; -Entity _cameraEntity; -``` - -and then instantiate them - -```obj-c -_renderer = _engine->createRenderer(); -_view = _engine->createView(); -_scene = _engine->createScene(); -``` - -The camera is a bit special. Filament uses an entity-component system, so we'll first need to create an `Entity` which we then attach a `Camera` component to. - -```obj-c -_cameraEntity = EntityManager::get().create(); -_camera = _engine->createCamera(_cameraEntity); -``` - -Let's also inform our `Renderer` to clear to a light blue clear color, so we can know everything is working. - -```obj-c -_renderer->setClearOptions({ - .clearColor = {0.25f, 0.5f, 1.0f, 1.0f}, - .clear = true -}); -``` - -The `Camera` and `Scene` need to be wired up to the `View`. - -```obj-c -_view->setScene(_scene); -_view->setCamera(_camera); -``` - -Our newly created objects get cleaned up inside `dealloc`. - -```obj-c -_engine->destroyCameraComponent(_cameraEntity); -EntityManager::get().destroy(_cameraEntity); -_engine->destroy(_scene); -_engine->destroy(_view); -_engine->destroy(_renderer); -``` - -We need to set the `Viewport` on our `View`, which we want to do whenever the size of our `SwapChain` changes. We'll also update the projection matrix on our camera. - -Let's create a new method, `resize:`, which will update the `Viewport` on our `View` to a given size. We'll call it in the `mtkView:drawableSizeWillChange:` delegate method, and at the end of `viewDidLoad`: - -```obj-c -- (void)resize:(CGSize)size { - _view->setViewport({0, 0, (uint32_t) size.width, (uint32_t) size.height}); - - const double aspect = size.width / size.height; - const double left = -2.0 * aspect; - const double right = 2.0 * aspect; - const double bottom = -2.0; - const double top = 2.0; - const double near = 0.0; - const double far = 1.0; - _camera->setProjection(Camera::Projection::ORTHO, left, right, bottom, top, near, far); -} - -- (void)viewDidLoad { - ... - - // Give our View a starting size based on the drawable size. - [self resize:mtkView.drawableSize]; -} - -- (void)mtkView(nonnull MTKView*)view drawableSizeWillChange:(CGSize)size { - [self resize:size]; -} -``` - -Lastly, in order to render, we'll call a few Filament API methods inside the `drawInMTKView:` method: - -```obj-c -- (void)drawInMTKView:(nonnull MTKView*)view { - if (_renderer->beginFrame(_swapChain)) { - _renderer->render(_view); - _renderer->endFrame(); - } -} -``` - -The `beginFrame` method instructs Filament to start rendering to our specific `SwapChain` instance. It returns `true` if the engine is ready for another frame. It returns `false` to signal us to skip this frame, which could happen if we're sending frames down too quickly for the GPU to process. - -At this point, you should be able to build and run the app, and you'll see a blue screen. - -![blue screen after clearing](blue-screen.png) - -## Drawing a Triangle - -In order to draw a triangle, we need to create vertex and index buffers to define its geometry. We'll then create a `Renderable` component. - -We'll start by including some additional headers and adding a few new private vars: - -```obj-c -#include -#include -#include - -... - -VertexBuffer* _vertexBuffer; -IndexBuffer* _indexBuffer; -Entity _triangle; -``` - -First, we'll define the data for a single vertex. - -```obj-c -struct Vertex { - math::float2 position; - math::float3 color; -}; -``` - -Creating a `VertexBuffer` and `IndexBuffer` is a matter of giving Filament a pointer to the data, along with information on its layout and size. Filament uses `BufferDescriptors` to accomplish this. - -Inside `viewDidLoad`, we'll statically define some verticies and indices and create a `BufferDescriptor` for each. - -```obj-c -static const Vertex TRIANGLE_VERTICES[3] = { - { { 0.867, -0.500}, {1.0, 0.0, 0.0} }, - { { 0.000, 1.000}, {0.0, 1.0, 0.0} }, - { {-0.867, -0.500}, {0.0, 0.0, 1.0} }, -}; -static const uint16_t TRIANGLE_INDICES[3] = { 0, 1, 2 }; - -VertexBuffer::BufferDescriptor vertices(TRIANGLE_VERTICES, sizeof(Vertex) * 3, nullptr); -IndexBuffer::BufferDescriptor indices(TRIANGLE_INDICES, sizeof(uint16_t) * 3, nullptr); -``` - -The last argument is an optional callback function, which will be called after Filament is done uploading the data to the GPU. Inside the callback, you'd typically release the memory of any buffers via a `free` or `delete` call. We pass `nullptr` because we don't need a callback as our vertex and index buffer memory is static. - -Now we can instantiate our `VertexBuffer` and `IndexBuffer`. - -```obj-c -using Type = VertexBuffer::AttributeType; - -const uint8_t stride = sizeof(Vertex); -_vertexBuffer = VertexBuffer::Builder() - .vertexCount(3) - .bufferCount(1) - .attribute(VertexAttribute::POSITION, 0, Type::FLOAT2, offsetof(Vertex, position), stride) - .attribute(VertexAttribute::COLOR, 0, Type::FLOAT3, offsetof(Vertex, color), stride) - .build(*_engine); - -_indexBuffer = IndexBuffer::Builder() - .indexCount(3) - .bufferType(IndexBuffer::IndexType::USHORT) - .build(*_engine); - -_vertexBuffer->setBufferAt(*_engine, 0, std::move(vertices)); -_indexBuffer->setBuffer(*_engine, std::move(indices)); -``` - -We first create an `Entity` like we did for our camera. This time, we're attaching a `Renderable` component to the entity. The `Renderable` component takes geometry defined by our vertex and index buffers, and makes the entity visible in our scene. - -```obj-c -_triangle = utils::EntityManager::get().create(); - -using Primitive = RenderableManager::PrimitiveType; -RenderableManager::Builder(1) - .geometry(0, Primitive::TRIANGLES, _vertexBuffer, _indexBuffer, 0, 3) - .culling(false) - .receiveShadows(false) - .castShadows(false) - .build(*_engine, _triangle); - -// Add the triangle to the scene. -_scene->addEntity(_triangle); -``` - -Destroy the entity and buffers in `dealloc`. - -```obj-c -_engine->destroy(_triangle); -EntityManager::get().destroy(_triangle); -_engine->destroy(_indexBuffer); -_engine->destroy(_vertexBuffer); -``` - -If you build and run the app now, you should see a plain white triangle. When we created the renderable, we didn't specify any specific `Material` to use, so Filament used a default, white material. Let's create a custom material to color the triangle. - -![a white triangle](white-triangle.png) - -## Compiling a Custom Material - -For simplicity, we're going to compile a custom material at runtime. For production, we recommend using our matc tool to compile materials offline. You can download it as part of one of our [releases](https://github.com/google/filament/releases). - -First, add a few more headers. We'll be using Filament's filamat library to compile a custom material. - -```c++ -#include -#include - -#include -``` - -We'll store our material in a new private var. We'll also need one to store a material _instance_. You can think of a material as a "template", where a material instance is an instantiation of the template (similar to OOP classes and instances). For more information on Filament materials, read the [Filament Materials Guide](https://google.github.io/filament/Materials.html). - -```obj-c -Material* _material; -MaterialInstance* _materialInstance; -``` - -We'll use the filamat library to compile a material into a package, which we can then load into Filament. The material will be simple; it will load the interpolated color attribute and set it as the `baseColor`. - -Make sure to insert this code into `viewDidLoad` _before_ we create our `Renderable`. - -```obj-c -// init must be called before we can build any materials. -filamat::MaterialBuilder::init(); - -// Compile a custom material to use on the triangle. -filamat::Package pkg = filamat::MaterialBuilder() - // The material name, only used for debugging purposes. - .name("Triangle material") - // Use the unlit shading mode, because we don't have any lights in our scene. - .shading(filamat::MaterialBuilder::Shading::UNLIT) - // Expose the COLOR attribute visible to our shader code. - .require(VertexAttribute::COLOR) - // Custom GLSL fragment shader - .material("void material (inout MaterialInputs material) {" - " prepareMaterial(material);" - " material.baseColor = getColor();" - "}") - // Compile for Metal on mobile platforms. - .targetApi(filamat::MaterialBuilder::TargetApi::METAL) - .platform(filamat::MaterialBuilder::Platform::MOBILE) - .build(); -assert(pkg.isValid()); - -// shutdown should be called after all materials are built. -filamat::MaterialBuilder::shutdown(); -``` - -Now that we have a `filamat::Package` representing the material, we can use it to instantiate a Filament `Material`. Note that again, we recommend using the matc command-line tool to compile material packages during your app's compilation phase if possible, instead of at run-time. - -```obj-c -// Create a Filament material from the Package. -_material = Material::Builder() - .package(pkg.getData(), pkg.getSize()) - .build(*_engine); -_materialInstance = _material->getDefaultInstance(); -``` - -Now we can use the `MaterialInstance` when creating our `Renderable`. - -```obj-c -// Create a renderable using our geometry and material. -using Primitive = RenderableManager::PrimitiveType; -RenderableManager::Builder(1) - .geometry(0, Primitive::TRIANGLES, _vertexBuffer, _indexBuffer, 0, 3) - // Use the MaterialInstance we just created. - .material(0, _materialInstance) - .culling(false) - .receiveShadows(false) - .castShadows(false) - .build(*_engine, _triangle); -``` - -Lastly, we make sure to destroy everything inside `dealloc`. - -```obj-c -_engine->destroy(_materialInstance); -_engine->destroy(_material); -``` - -Build and run. You should see the same triangle, but with colors. - -![the triangle with our custom material](colored-triangle.png) - -## Animating the Triangle - -We'll do this by animating a transform on our triangle entity. First, include a new header. - -```obj-c -#include -``` - -When we create our triangle entity, we'll also attach a transform component. We've already seen two other components: `Renderable` and `Camera`. The `Transform` component allows us to set world-space transformations on entities. - -Inside `viewDidLoad`, after we create the triangle entity's `Renderable` component, we'll also attach a `Transform` component. - -```obj-c -// Add a Transform component to the triangle, so we can animate it. -_engine->getTransformManager().create(_triangle); -``` - -Create a new function, `update`, and add call it inside the `drawInMTKView:` method. - -```obj-c -- (void)update { - auto& tm = _engine->getTransformManager(); - auto i = tm.getInstance(_triangle); - const auto time = CACurrentMediaTime(); - tm.setTransform(i, math::mat4f::rotation(time, math::float3 {0.0, 0.0, 1.0})); -} - -- (void)drawInMTKView:(nonnull MTKView*)view { - [self update]; - if (_renderer->beginFrame(_swapChain)) { - _renderer->render(_view); - _renderer->endFrame(); - } -} -``` - -Now we should see the triangle rotate around its z axis. - -![a rotating triangle](rotating-triangle.gif) - -## Next Steps - -In this guide we've covered how to install Filament with CocoaPods and get rendering using the Metal backend. We also compiled a custom material. Again, here's the [complete sample code](https://github.com/google/filament/tree/main/ios/samples/HelloCocoaPods) for the app. If you're interesting in learning more, check out Filament's additional [iOS samples](https://github.com/google/filament/tree/main/ios/samples). If you have any problems, feel free to open an [issue](https://github.com/google/filament/issues). diff --git a/site/content/webgl/index.md b/site/content/webgl/index.md deleted file mode 100644 index eb8dfcd224a..00000000000 --- a/site/content/webgl/index.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "Web Docs / Demos" -date: 2018-10-30T13:13:14-07:00 -menu: main ---- - -## tutorials - -1. [Triangle Tutorial](tutorial_triangle.html) -2. [Redball Tutorial](tutorial_redball.html) -3. [Suzanne Tutorial](tutorial_suzanne.html) - -## demos - -- [parquet](parquet.html) -- [suzanne](suzanne.html) -- [helmet](helmet.html) -- [knotess](https://prideout.net/knotess/) - -## other documentation - -- [JavaScript API reference](reference.html) -- [WebGL Meetup Slides](https://prideout.net/slides/filawasm) (2018) diff --git a/test/renderdiff/README.md b/test/renderdiff/README.md new file mode 100644 index 00000000000..f90f2970636 --- /dev/null +++ b/test/renderdiff/README.md @@ -0,0 +1,17 @@ +# Rendering Difference Test + +We created a few scripts to run `gltf_viewer` and produce headless renderings. + +This is mainly useful for continuous integration where GPUs are generally not available on cloud +machines. To perform software rasterization, these scripts are centered around [Mesa]'s software +rasterizers, but nothing bars us from using another rasterizer like [SwiftShader]. Additionally, +we should be able to use GPUs where available (though this is more of a future work). + +The script `run.py` contains the core logic for taking input parameters (such as the test +description file) and then running gltf_viewer to produce the results. + +In the `test` directory is a list of test descriptions that are specified in json. Please see +`sample.json` to parse the structure. + +[Mesa]: https://docs.mesa3d.org +[SwiftShader]: https://github.com/google/swiftshader \ No newline at end of file diff --git a/test/renderdiff/src/parse_test_json.py b/test/renderdiff/src/parse_test_json.py new file mode 100644 index 00000000000..36e7e6521f6 --- /dev/null +++ b/test/renderdiff/src/parse_test_json.py @@ -0,0 +1,143 @@ +# Copyright (C) 2024 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from utils import execute, ArgParseImpl + +import glob +from itertools import chain +import json +import sys +import os +from os import path + +def _is_list_of_strings(field): + return isinstance(field, list) and\ + all(isinstance(item, str) for item in field) + +def _is_string(s): + return isinstance(s, str) + +def _is_dict(s): + return isinstance(s, dict) + +class RenderingConfig(): + def __init__(self, data): + assert 'name' in data + assert _is_string(data['name']) + self.name = data['name'] + + assert 'rendering' in data + assert _is_dict(data['rendering']) + self.rendering = data['rendering'] + +class PresetConfig(RenderingConfig): + def __init__(self, data, existing_models): + RenderingConfig.__init__(self, data) + models = data.get('models') + if models: + assert _is_list_of_strings(models) + assert all(m in existing_models for m in models) + self.models = models + +class TestConfig(RenderingConfig): + def __init__(self, data, existing_models, presets): + RenderingConfig.__init__(self, data) + description = data.get('description') + if description: + assert _is_string(description) + self.description = description + + apply_presets = data.get('apply_presets') + rendering = {} + preset_models = [] + if apply_presets: + given_presets = {p.name: p for p in presets} + assert all((name in given_presets) for name in apply_presets),\ + f'used preset {name} which is not in {given_presets}' + for preset in apply_presets: + rendering.update(given_presets[preset].rendering) + preset_models += given_presets[preset].models + + assert 'rendering' in data + rendering.update(data['rendering']) + self.rendering = rendering + + models = data.get('models') + self.models = preset_models + if models: + assert _is_list_of_strings(models) + assert all(m in existing_models for m in models) + self.models = set(models + self.models) + + def to_filament_format(self): + json_out = { + 'name': self.name, + 'base': self.rendering + } + return json.dumps(json_out) + +class RenderTestConfig(): + def __init__(self, data): + assert 'name' in data + name = data['name'] + assert _is_string(name) + self.name = name + + assert 'backends' in data + backends = data['backends'] + assert _is_list_of_strings(backends) + self.backends = backends + + assert 'model_search_paths' in data + model_search_paths = data.get('model_search_paths') + assert _is_list_of_strings(model_search_paths) + assert all(path.isdir(p) for p in model_search_paths) + + model_paths = list( + chain(*(glob.glob(f'{d}/**/*.glb', recursive=True) for d in model_search_paths))) + # This flatten the output for glob.glob + self.models = {path.splitext(path.basename(model))[0]: model for model in model_paths} + + preset_data = data.get('presets') + presets = [] + if preset_data: + presets = [PresetConfig(p, self.models) for p in preset_data] + + assert 'tests' in data + self.tests = [TestConfig(t, self.models, presets) for t in data['tests']] + test_names = list([t.name for t in self.tests]) + + # We cannot have duplicate test names + assert len(test_names) == len(set(test_names)) + +def _remove_comments_from_json_txt(json_txt): + res = [] + for line in json_txt.split('\n'): + if '//' in line: + line = line.split('//')[0] + res.append(line) + return '\n'.join(res) + +def parse_test_config_from_path(config_path): + with open(config_path, 'r') as f: + json_txt = json.loads(_remove_comments_from_json_txt(f.read())) + return RenderTestConfig(json_txt) + + +if __name__ == "__main__": + parser = ArgParseImpl() + parser.add_argument('--test', help='Configuration of the test', required=True) + + args, _ = parser.parse_known_args(sys.argv[1:]) + test = parse_test_config_from_path(args.test) diff --git a/test/renderdiff/src/run.py b/test/renderdiff/src/run.py new file mode 100644 index 00000000000..be90073709c --- /dev/null +++ b/test/renderdiff/src/run.py @@ -0,0 +1,111 @@ +# Copyright (C) 2024 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys +import os + +from utils import execute, ArgParseImpl +from parse_test_json import parse_test_config_from_path + +def important_print(msg): + lines = msg.split('\n') + max_len = max([len(l) for l in lines]) + print('-' * (max_len + 8)) + for line in lines: + diff = max_len - len(line) + information = f'--- {line} ' + (' ' * diff) + '---' + print(information) + print('-' * (max_len + 8)) + +def render_test(gltf_viewer, test_config, output_dir, + opengl_lib=None, vk_icd=None): + assert os.path.isdir(output_dir), f"output directory {output_dir} does not exist" + assert os.access(gltf_viewer, os.X_OK) + + named_output_dir = os.path.join(output_dir, test_config.name) + execute(f'mkdir -p {named_output_dir}') + + results = [] + for test in test_config.tests: + test_json_path = f'{named_output_dir}/{test.name}.simplified.json' + + with open(test_json_path, 'w') as f: + f.write(f'[{test.to_filament_format()}]') + + for backend in test_config.backends: + env = None + if backend == 'opengl' and opengl_lib and os.path.isdir(opengl_lib): + env = {'LD_LIBRARY_PATH': opengl_lib} + + for model in test.models: + model_path = test_config.models[model] + out_name = f'{test.name}.{backend}.{model}' + test_desc = out_name + + important_print(f'Rendering {test_desc}') + + res, _ = execute(f'{gltf_viewer} -a {backend} --batch={test_json_path} -e {model_path} --headless', + env=env, capture_output=False) + + if res == 0: + execute(f'mv -f {test.name}0.ppm {named_output_dir}/{out_name}.ppm', capture_output=False) + execute(f'mv -f {test.name}0.json {named_output_dir}/{test.name}.json', capture_output=False) + else: + important_print(f'{test_desc} failed with error={res}') + print('') + + results.append((out_name, res)) + return results + +GOLDENS_DIR = 'renderdiff_goldens' + +# We pull the goldens from the filament-assets repo +def pull_goldens(output_dir): + assert os.path.isdir(output_dir), f"output directory {output_dir} does not exist" + golden_dir = os.path.join(output_dir, "golden") + assets_dir = os.path.join(output_dir, "filament-assets") + + if not os.path.exists(assets_dir): + execute('git clone --depth 1 git@github.com:google/filament-assets.git', cwd=output_dir) + else: + execute('git fetch', cwd=assets_dir) + execute('git checkout main ', cwd=assets_dir) + execute('git rebase', cwd=assets_dir) + + if os.path.exists(golden_dir): + execute('rm -f goldens/*', cwd=output_dir) + execute(f'cp filament-assets/{GOLDENS_DIR}/* goldens', cwd=output_dir) + +def push_goldens(output_dir, test_name, filter_func=lambda a:True): + for test in test_config.tests: + for backend in test_config.backends: + for model in test.models: + pass + +if __name__ == "__main__": + parser = ArgParseImpl() + parser.add_argument('--test', help='Configuration of the test', required=True) + parser.add_argument('--gltf_viewer', help='Path to the gltf_viewer', required=True) + parser.add_argument('--output_dir', help='Output Directory', required=True) + parser.add_argument('--opengl_lib', help='Path to the folder containing OpenGL driver lib (for LD_LIBRARY_PATH)') + parser.add_argument('--vk_icd', help='Path to VK ICD file') + + args, _ = parser.parse_known_args(sys.argv[1:]) + test = parse_test_config_from_path(args.test) + render_result = render_test(args.gltf_viewer, test, args.output_dir, opengl_lib=args.opengl_lib, vk_icd=args.vk_icd) + + failed = [f' {tname}' for tname, res in render_result if res != 0] + success_count = len(render_result) - len(failed ) + important_print(f'Successfully rendered {success_count} / {len(render_result)}' + + ('\nFailed:\n' + ('\n'.join(failed)) if len(failed) > 0 else '')) diff --git a/test/renderdiff/src/utils.py b/test/renderdiff/src/utils.py new file mode 100644 index 00000000000..f708d7a6596 --- /dev/null +++ b/test/renderdiff/src/utils.py @@ -0,0 +1,68 @@ +# Copyright (C) 2024 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import subprocess +import os +import argparse +import sys + +def execute(cmd, + cwd=None, + capture_output=True, + stdin=None, + env=None, + raise_errors=False): + in_env = os.environ + in_env.update(env if env else {}) + home = os.environ['HOME'] + if f'{home}/bin' not in in_env['PATH']: + in_env['PATH'] = in_env['PATH'] + f':{home}/bin' + + stdout = subprocess.PIPE if capture_output else sys.stdout + stderr = subprocess.PIPE if capture_output else sys.stdout + output = '' + err_output = '' + return_code = -1 + kwargs = { + 'cwd': cwd, + 'env': in_env, + 'stdout': stdout, + 'stderr': stderr, + 'stdin': stdin, + 'universal_newlines': True + } + if capture_output: + process = subprocess.Popen(cmd.split(' '), **kwargs) + output, err_output = process.communicate() + return_code = process.returncode + else: + return_code = subprocess.call(cmd.split(' '), **kwargs) + + if return_code: + # Error + if raise_errors: + raise subprocess.CalledProcessError(return_code, cmd) + if output: + if type(output) != str: + try: + output = output.decode('utf-8').strip() + except UnicodeDecodeError as e: + print('cannot decode ', output, file=sys.stderr) + return return_code, (output if return_code == 0 else err_output) + +class ArgParseImpl(argparse.ArgumentParser): + def error(self, message): + sys.stderr.write('error: %s\n' % message) + self.print_help() + sys.exit(1) diff --git a/test/renderdiff/src/workflow_presubmit_msg.py b/test/renderdiff/src/workflow_presubmit_msg.py new file mode 100644 index 00000000000..06d8975364f --- /dev/null +++ b/test/renderdiff/src/workflow_presubmit_msg.py @@ -0,0 +1,46 @@ +# Copyright (C) 2025 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from utils import execute + +def get_last_commit(): + res, o = execute('git log -1') + commit, author, date, _, title, *desc = o.split('\n') + + desc = [l.strip() for l in desc[1:]] + if len(desc) > 0 and len(desc[0]) == 0: + desc = desc[1:] + + return ( + commit.split(' ')[1], + title.strip(), + desc) + +def sanitized_split(line, split_atom='\n'): + return list(filter(lambda x: len(x) > 0, map(lambda x: x.strip(), line.split(split_atom)))) + +RDIFF_UPDATE_GOLDEN_STR = 'RDIFF_UPDATE_GOLDEN' + +if __name__ == "__main__": + RE_STR = f'{RDIFF_UPDATE_GOLDEN_STR}(?:S)?=[\[]?([a-zA-Z0-9,\s]+)[\]]?' + + to_update = [] + commit, title, description = get_last_commit() + for line in description: + m = re.match(RE_STR, line) + if not m: + continue + + to_update += sanitize_split(m.group(1).replace(',', ' '), ' ') + print(','.join(to_update)) diff --git a/test/renderdiff/test.sh b/test/renderdiff/test.sh new file mode 100755 index 00000000000..7321a468ae0 --- /dev/null +++ b/test/renderdiff/test.sh @@ -0,0 +1,43 @@ +# Copyright (C) 2024 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#!/usr/bin/bash + +OUTPUT_DIR="$(pwd)/out/renderdiff_tests" +RENDERDIFF_TEST_DIR="$(pwd)/test/renderdiff" +TEST_UTILS_DIR="$(pwd)/test/utils" +MESA_DIR="$(pwd)/mesa/out/" +MESA_LIB_DIR="${MESA_DIR}/lib/x86_64-linux-gnu" + +function prepare_mesa() { + if [ ! -d ${MESA_LIB_DIR} ]; then + rm -rf mesa + bash ${TEST_UTILS_DIR}/get_mesa.sh + fi +} + +# Following steps are taken: +# - Get and build mesa +# - Build gltf_viewer +# - Run the python script that runs the test +# - Zip up the result + +set -e && set -x && prepare_mesa && \ + mkdir -p ${OUTPUT_DIR} && \ + ./build.sh -X ${MESA_DIR} -p desktop debug gltf_viewer && \ + python3 ${RENDERDIFF_TEST_DIR}/src/run.py \ + --gltf_viewer="$(pwd)/out/cmake-debug/samples/gltf_viewer" \ + --test=${RENDERDIFF_TEST_DIR}/tests/presubmit.json \ + --output_dir=${OUTPUT_DIR} \ + --opengl_lib=${MESA_LIB_DIR} diff --git a/test/renderdiff/tests/presubmit.json b/test/renderdiff/tests/presubmit.json new file mode 100644 index 00000000000..761f043fc5d --- /dev/null +++ b/test/renderdiff/tests/presubmit.json @@ -0,0 +1,34 @@ +{ + "name": "presubmit", + "backends": ["opengl"], + "model_search_paths": ["third_party/models"], + "presets": [ + { + "name": "base", + "models": ["lucy", "DamagedHelmet"], + "rendering": { + "viewer.cameraFocusDistance": 0, + "view.postProcessingEnabled": true + } + } + ], + "tests": [ + { + "name": "BloomFlare", + "description": "Testing bloom and flare", + "apply_presets": ["base"], + "rendering": { + "view.bloom.enabled": true, + "view.bloom.lensFlare": true + } + }, + { + "name": "MSAA", + "description": "Testing multisampling anti-aliasing", + "apply_presets": ["base"], + "rendering": { + "view.msaa.enabled": true + } + } + ] +} diff --git a/test/renderdiff/tests/sample.json b/test/renderdiff/tests/sample.json new file mode 100644 index 00000000000..eb689d8102d --- /dev/null +++ b/test/renderdiff/tests/sample.json @@ -0,0 +1,34 @@ +{ + "name": "SampleTest" , // [required] + "backends": ["opengl"], // [required] Specifies the backend that will be used to render + // this test + "model_search_paths": ["third_party/models"], // [optional] Base iirectory from which we will glob for + // .glb files and try to match against names in the 'models' + // field. + "presets": [ // [optional] A list of preset configurations that tests can + // inherit from. + { + "name": "Standard", // [required] + "models": ["lucy", "DamagedHelmet"], // [optional] Base name for the gltf file used in the test. For + // example, source files are lucy.glb and DamagedHelmet.gltf + "rendering": { // [required] Rendering settings used in the test. The json format + "viewer.cameraFocusDistance": 0, // is taken from AutomationSpec in libs/viewer + "view.postProcessingEnabled": true + } + } + ], + "tests": [ // [required] List of test configurations + { + "name": "BloomFlare", // [required] + "description": "Testing bloom and flare", // [optional] + "apply_presets": ["Standard"], // [optional] Applies the preset in order. Item must be in + // 'presets' field in the top-level struct. + "model": [], // [optional] List of models used in this test. The list is + // *appended* onto the lists provided by the presets. + "rendering": { // [required] See description in 'presets' + "view.bloom.enabled": true, + "view.bloom.lensFlare": true + } + } + ] +} diff --git a/test/utils/get_mesa.sh b/test/utils/get_mesa.sh new file mode 100755 index 00000000000..79fa87f348f --- /dev/null +++ b/test/utils/get_mesa.sh @@ -0,0 +1,68 @@ +# Copyright (C) 2024 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#!/usr/bin/bash + +set -xe + +# GITHUB_CLANG_VERSION is set in build/linux/ci-common.sh + +if [[ "$GITHUB_WORKFLOW" ]]; then + # We only want to do this if it is a CI machine. + sudo apt-get -y remove llvm-* + + # We do a manual install of dependencies instead of `apt-get -y build-dep mesa` + # because this allows us to compile an older mesa, and also because build-deps + # is constantly being updated and sometimes not compatible with the current + # linux platform. + # Note that we assume this platform is compatible with ubuntu-22.04 x86_64 + sudo apt-get -y install \ + autoconf automake autopoint autotools-dev bindgen bison build-essential bzip2 cpp cpp-11 debhelper debugedit dh-autoreconf dh-strip-nondeterminism diffstat directx-headers-dev dpkg-dev dwz flex g++ g++-11 gcc gcc-11 gcc-11-base:amd64 gettext glslang-tools icu-devtools intltool-debian lib32gcc-s1 lib32stdc++6 libarchive-zip-perl libasan6:amd64 libatomic1:amd64 libc-dev-bin libc6-dbg:amd64 libc6-dev:amd64 libc6-i386 libcc1-0:amd64 libclang-${GITHUB_CLANG_VERSION}-dev libclang-common-${GITHUB_CLANG_VERSION}-dev libclang-cpp${GITHUB_CLANG_VERSION} libclang-cpp${GITHUB_CLANG_VERSION}-dev libclang1-14 libclang1-${GITHUB_CLANG_VERSION} libclc-${GITHUB_CLANG_VERSION} libclc-${GITHUB_CLANG_VERSION}-dev libcrypt-dev:amd64 libdebhelper-perl libdpkg-perl libdrm-amdgpu1:amd64 libdrm-dev:amd64 libdrm-intel1:amd64 libdrm-nouveau2:amd64 libdrm-radeon1:amd64 libelf-dev:amd64 libexpat1-dev:amd64 libffi-dev:amd64 libfile-stripnondeterminism-perl libgc1:amd64 libgcc-11-dev:amd64 libgl1:amd64 libgl1-mesa-dri:amd64 libglapi-mesa:amd64 libglvnd-core-dev:amd64 libglvnd0:amd64 libglx-mesa0:amd64 libglx0:amd64 libgomp1:amd64 libicu-dev:amd64 libisl23:amd64 libitm1:amd64 libllvm14:amd64 libllvm${GITHUB_CLANG_VERSION}:amd64 libllvmspirvlib-${GITHUB_CLANG_VERSION}-dev:amd64 libllvmspirvlib${GITHUB_CLANG_VERSION}:amd64 liblsan0:amd64 libmpc3:amd64 libncurses-dev:amd64 libnsl-dev:amd64 libobjc-11-dev:amd64 libobjc4:amd64 libpciaccess-dev:amd64 libpciaccess0:amd64 libpfm4:amd64 libpthread-stubs0-dev:amd64 libquadmath0:amd64 libsensors-config libsensors-dev:amd64 libsensors5:amd64 libset-scalar-perl libstd-rust-1.75:amd64 libstd-rust-dev:amd64 libstdc++-11-dev:amd64 libsub-override-perl libtinfo-dev:amd64 libtirpc-dev:amd64 libtool libtsan0:amd64 libubsan1:amd64 libva-dev:amd64 libva-drm2:amd64 libva-glx2:amd64 libva-wayland2:amd64 libva-x11-2:amd64 libva2:amd64 libvdpau-dev:amd64 libvdpau1:amd64 libvulkan-dev:amd64 libvulkan1:amd64 libwayland-bin libwayland-client0:amd64 libwayland-cursor0:amd64 libwayland-dev:amd64 libwayland-egl-backend-dev:amd64 libwayland-egl1:amd64 libwayland-server0:amd64 libx11-dev:amd64 libx11-xcb-dev:amd64 libx11-xcb1:amd64 libxau-dev:amd64 libxcb-dri2-0:amd64 libxcb-dri2-0-dev:amd64 libxcb-dri3-0:amd64 libxcb-dri3-dev:amd64 libxcb-glx0:amd64 libxcb-glx0-dev:amd64 libxcb-present-dev:amd64 libxcb-present0:amd64 libxcb-randr0:amd64 libxcb-randr0-dev:amd64 libxcb-render0:amd64 libxcb-render0-dev:amd64 libxcb-shape0:amd64 libxcb-shape0-dev:amd64 libxcb-shm0:amd64 libxcb-shm0-dev:amd64 libxcb-sync-dev:amd64 libxcb-sync1:amd64 libxcb-xfixes0:amd64 libxcb-xfixes0-dev:amd64 libxcb1-dev:amd64 libxdmcp-dev:amd64 libxext-dev:amd64 libxfixes-dev:amd64 libxfixes3:amd64 libxml2-dev:amd64 libxrandr-dev:amd64 libxrandr2:amd64 libxrender-dev:amd64 libxrender1:amd64 libxshmfence-dev:amd64 libxshmfence1:amd64 libxxf86vm-dev:amd64 libxxf86vm1:amd64 libz3-4:amd64 libz3-dev:amd64 libzstd-dev:amd64 linux-libc-dev:amd64 llvm-${GITHUB_CLANG_VERSION} llvm-${GITHUB_CLANG_VERSION}-dev llvm-${GITHUB_CLANG_VERSION}-linker-tools llvm-${GITHUB_CLANG_VERSION}-runtime llvm-${GITHUB_CLANG_VERSION}-tools llvm-spirv-${GITHUB_CLANG_VERSION} lto-disabled-list m4 make meson ninja-build pkg-config po-debconf python3-mako python3-ply python3-pygments quilt rpcsvc-proto rustc spirv-tools valgrind wayland-protocols x11proto-dev xorg-sgml-doctools xtrans-dev zlib1g-dev:amd64 \ + clang-$GITHUB_CLANG_VERSION libc++-$GITHUB_CLANG_VERSION-dev libc++abi-$GITHUB_CLANG_VERSION-dev + + sudo update-alternatives --install /usr/bin/cc cc /usr/bin/clang-${GITHUB_CLANG_VERSION} 100 + sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++-${GITHUB_CLANG_VERSION} 100 +else + set +e + apt-get -y build-dep mesa + sudo apt -y remove llvm-18 llvm-18-* + set -e + + sudo apt-get -y install clang-${GITHUB_CLANG_VERSION} \ + libc++-${GITHUB_CLANG_VERSION}-dev \ + libc++abi-${GITHUB_CLANG_VERSION}-dev \ + llvm-${GITHUB_CLANG_VERSION} \ + llvm-${GITHUB_CLANG_VERSION}-{dev,tools,runtime} +fi + + +export CXX=`which clang++` && export CC=`which clang` + +git clone https://gitlab.freedesktop.org/mesa/mesa.git + +pushd . + +cd mesa + +git checkout mesa-23.2.1 + +mkdir -p out + +# -Dosmesa=true => builds OSMesa, which is an offscreen GL context +# -Dgallium-drivers=swrast => builds GL software rasterizer +# -Dvulkan-drivers=swrast => builds VK software rasterizer +meson setup builddir/ -Dprefix="$(pwd)/out" -Dosmesa=true -Dglx=xlib -Dgallium-drivers=swrast -Dvulkan-drivers=swrast +meson install -C builddir/ + +popd diff --git a/third_party/basisu/encoder/basisu_enc.cpp b/third_party/basisu/encoder/basisu_enc.cpp index b427215ee33..8ee1b524b0b 100644 --- a/third_party/basisu/encoder/basisu_enc.cpp +++ b/third_party/basisu/encoder/basisu_enc.cpp @@ -227,7 +227,7 @@ namespace basisu { QueryPerformanceFrequency(reinterpret_cast(pTicks)); } -#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) +#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__wasm__) #include inline void query_counter(timer_ticks* pTicks) { diff --git a/third_party/basisu/tnt/README.md b/third_party/basisu/tnt/README.md index 312116cba47..7e4b43282a1 100644 --- a/third_party/basisu/tnt/README.md +++ b/third_party/basisu/tnt/README.md @@ -9,6 +9,23 @@ This folder was last updated as follows: rm -rf ${ver}.zip basis_new git add basisu ; git status +!!! IMPORTANT: +If using a version of basisu <= 1.16.3, the following patch is required: + https://github.com/BinomialLLC/basis_universal/commit/53372fc512e6b91c06b28fd47248f269b9b5b010 + +!!! IMPORTANT: +If basisu doesn't have that change, in basisu_containers.h, update the following macro: + + #if defined(__GNUC__) && __GNUC__<5 + #define BASISU_IS_TRIVIALLY_COPYABLE(...) __has_trivial_copy(__VA_ARGS__) + +to: + + #if defined(__GNUC__) && __GNUC__<5 + #define BASISU_IS_TRIVIALLY_COPYABLE(...) __is_trivially_copyable(__VA_ARGS__) + + + Our CMakeLists differs from the one in basisu as follows. (1) diff --git a/third_party/basisu/transcoder/basisu_containers.h b/third_party/basisu/transcoder/basisu_containers.h index d3e14369ba0..b477f16b310 100644 --- a/third_party/basisu/transcoder/basisu_containers.h +++ b/third_party/basisu/transcoder/basisu_containers.h @@ -189,7 +189,7 @@ namespace basisu #define BASISU_IS_SCALAR_TYPE(T) (scalar_type::cFlag) #if defined(__GNUC__) && __GNUC__<5 - #define BASISU_IS_TRIVIALLY_COPYABLE(...) __has_trivial_copy(__VA_ARGS__) + #define BASISU_IS_TRIVIALLY_COPYABLE(...) __is_trivially_copyable(__VA_ARGS__) #else #define BASISU_IS_TRIVIALLY_COPYABLE(...) std::is_trivially_copyable<__VA_ARGS__>::value #endif diff --git a/third_party/cgltf/README.md b/third_party/cgltf/README.md index ab7d439faf7..02e611cf8fa 100644 --- a/third_party/cgltf/README.md +++ b/third_party/cgltf/README.md @@ -103,7 +103,9 @@ cgltf also supports some glTF extensions: - EXT_meshopt_compression - KHR_draco_mesh_compression (requires a library like [Google's Draco](https://github.com/google/draco) for decompression though) - KHR_lights_punctual +- KHR_materials_anisotropy - KHR_materials_clearcoat +- KHR_materials_dispersion - KHR_materials_emissive_strength - KHR_materials_ior - KHR_materials_iridescence diff --git a/third_party/cgltf/cgltf.h b/third_party/cgltf/cgltf.h index a534cefb4f4..17dc0ca5d28 100644 --- a/third_party/cgltf/cgltf.h +++ b/third_party/cgltf/cgltf.h @@ -1,7 +1,7 @@ /** * cgltf - a single-file glTF 2.0 parser written in C99. * - * Version: 1.13 + * Version: 1.14 * * Website: https://github.com/jkuhlmann/cgltf * @@ -63,9 +63,15 @@ * By passing null for the output pointer, users can find out how many floats are required in the * output buffer. * + * `cgltf_accessor_unpack_indices` reads in the index data from an accessor. Assumes that + * `cgltf_load_buffers` has already been called. By passing null for the output pointer, users can + * find out how many indices are required in the output buffer. Returns 0 if the accessor is + * sparse or if the output component size is less than the accessor's component size. + * * `cgltf_num_components` is a tiny utility that tells you the dimensionality of * a certain accessor type. This can be used before `cgltf_accessor_unpack_floats` to help allocate - * the necessary amount of memory. + * the necessary amount of memory. `cgltf_component_size` and `cgltf_calc_size` exist for + * similar purposes. * * `cgltf_accessor_read_float` reads a certain element from a non-sparse accessor and converts it to * floating point, assuming that `cgltf_load_buffers` has already been called. The passed-in element @@ -74,7 +80,7 @@ * * `cgltf_accessor_read_uint` is similar to its floating-point counterpart, but limited to reading * vector types and does not support matrix types. The passed-in element size is the number of uints - * in the output buffer, which should be in the range [1, 4]. Returns false if the passed-in + * in the output buffer, which should be in the range [1, 4]. Returns false if the passed-in * element_size is too small, or if the accessor is sparse. * * `cgltf_accessor_read_index` is similar to its floating-point counterpart, but it returns size_t @@ -89,6 +95,7 @@ #define CGLTF_H_INCLUDED__ #include +#include /* For uint8_t, uint32_t */ #ifdef __cplusplus extern "C" { @@ -195,6 +202,7 @@ typedef enum cgltf_type typedef enum cgltf_primitive_type { + cgltf_primitive_type_invalid, cgltf_primitive_type_points, cgltf_primitive_type_lines, cgltf_primitive_type_line_loop, @@ -326,15 +334,6 @@ typedef struct cgltf_accessor_sparse cgltf_component_type indices_component_type; cgltf_buffer_view* values_buffer_view; cgltf_size values_byte_offset; - cgltf_extras extras; - cgltf_extras indices_extras; - cgltf_extras values_extras; - cgltf_size extensions_count; - cgltf_extension* extensions; - cgltf_size indices_extensions_count; - cgltf_extension* indices_extensions; - cgltf_size values_extensions_count; - cgltf_extension* values_extensions; } cgltf_accessor_sparse; typedef struct cgltf_accessor @@ -417,9 +416,6 @@ typedef struct cgltf_texture_view cgltf_float scale; /* equivalent to strength for occlusion_texture */ cgltf_bool has_transform; cgltf_texture_transform transform; - cgltf_extras extras; - cgltf_size extensions_count; - cgltf_extension* extensions; } cgltf_texture_view; typedef struct cgltf_pbr_metallic_roughness @@ -502,6 +498,18 @@ typedef struct cgltf_iridescence cgltf_texture_view iridescence_thickness_texture; } cgltf_iridescence; +typedef struct cgltf_anisotropy +{ + cgltf_float anisotropy_strength; + cgltf_float anisotropy_rotation; + cgltf_texture_view anisotropy_texture; +} cgltf_anisotropy; + +typedef struct cgltf_dispersion +{ + cgltf_float dispersion; +} cgltf_dispersion; + typedef struct cgltf_material { char* name; @@ -515,6 +523,8 @@ typedef struct cgltf_material cgltf_bool has_sheen; cgltf_bool has_emissive_strength; cgltf_bool has_iridescence; + cgltf_bool has_anisotropy; + cgltf_bool has_dispersion; cgltf_pbr_metallic_roughness pbr_metallic_roughness; cgltf_pbr_specular_glossiness pbr_specular_glossiness; cgltf_clearcoat clearcoat; @@ -525,6 +535,8 @@ typedef struct cgltf_material cgltf_volume volume; cgltf_emissive_strength emissive_strength; cgltf_iridescence iridescence; + cgltf_anisotropy anisotropy; + cgltf_dispersion dispersion; cgltf_texture_view normal_texture; cgltf_texture_view occlusion_texture; cgltf_texture_view emissive_texture; @@ -557,7 +569,6 @@ typedef struct cgltf_draco_mesh_compression { } cgltf_draco_mesh_compression; typedef struct cgltf_mesh_gpu_instancing { - cgltf_buffer_view* buffer_view; cgltf_attribute* attributes; cgltf_size attributes_count; } cgltf_mesh_gpu_instancing; @@ -829,17 +840,39 @@ void cgltf_free(cgltf_data* data); void cgltf_node_transform_local(const cgltf_node* node, cgltf_float* out_matrix); void cgltf_node_transform_world(const cgltf_node* node, cgltf_float* out_matrix); +const uint8_t* cgltf_buffer_view_data(const cgltf_buffer_view* view); + cgltf_bool cgltf_accessor_read_float(const cgltf_accessor* accessor, cgltf_size index, cgltf_float* out, cgltf_size element_size); cgltf_bool cgltf_accessor_read_uint(const cgltf_accessor* accessor, cgltf_size index, cgltf_uint* out, cgltf_size element_size); cgltf_size cgltf_accessor_read_index(const cgltf_accessor* accessor, cgltf_size index); cgltf_size cgltf_num_components(cgltf_type type); +cgltf_size cgltf_component_size(cgltf_component_type component_type); +cgltf_size cgltf_calc_size(cgltf_type type, cgltf_component_type component_type); cgltf_size cgltf_accessor_unpack_floats(const cgltf_accessor* accessor, cgltf_float* out, cgltf_size float_count); +cgltf_size cgltf_accessor_unpack_indices(const cgltf_accessor* accessor, void* out, cgltf_size out_component_size, cgltf_size index_count); /* this function is deprecated and will be removed in the future; use cgltf_extras::data instead */ cgltf_result cgltf_copy_extras_json(const cgltf_data* data, const cgltf_extras* extras, char* dest, cgltf_size* dest_size); +cgltf_size cgltf_mesh_index(const cgltf_data* data, const cgltf_mesh* object); +cgltf_size cgltf_material_index(const cgltf_data* data, const cgltf_material* object); +cgltf_size cgltf_accessor_index(const cgltf_data* data, const cgltf_accessor* object); +cgltf_size cgltf_buffer_view_index(const cgltf_data* data, const cgltf_buffer_view* object); +cgltf_size cgltf_buffer_index(const cgltf_data* data, const cgltf_buffer* object); +cgltf_size cgltf_image_index(const cgltf_data* data, const cgltf_image* object); +cgltf_size cgltf_texture_index(const cgltf_data* data, const cgltf_texture* object); +cgltf_size cgltf_sampler_index(const cgltf_data* data, const cgltf_sampler* object); +cgltf_size cgltf_skin_index(const cgltf_data* data, const cgltf_skin* object); +cgltf_size cgltf_camera_index(const cgltf_data* data, const cgltf_camera* object); +cgltf_size cgltf_light_index(const cgltf_data* data, const cgltf_light* object); +cgltf_size cgltf_node_index(const cgltf_data* data, const cgltf_node* object); +cgltf_size cgltf_scene_index(const cgltf_data* data, const cgltf_scene* object); +cgltf_size cgltf_animation_index(const cgltf_data* data, const cgltf_animation* object); +cgltf_size cgltf_animation_sampler_index(const cgltf_animation* animation, const cgltf_animation_sampler* object); +cgltf_size cgltf_animation_channel_index(const cgltf_animation* animation, const cgltf_animation_channel* object); + #ifdef __cplusplus } #endif @@ -860,7 +893,7 @@ cgltf_result cgltf_copy_extras_json(const cgltf_data* data, const cgltf_extras* #ifdef CGLTF_IMPLEMENTATION -#include /* For uint8_t, uint32_t */ +#include /* For assert */ #include /* For strncpy */ #include /* For fopen */ #include /* For UINT_MAX etc */ @@ -870,10 +903,6 @@ cgltf_result cgltf_copy_extras_json(const cgltf_data* data, const cgltf_extras* #include /* For malloc, free, atoi, atof */ #endif -#if CGLTF_VALIDATE_ENABLE_ASSERTS -#include -#endif - /* JSMN_PARENT_LINKS is necessary to make parsing large structures linear in input size */ #define JSMN_PARENT_LINKS @@ -902,15 +931,15 @@ enum jsmnerr { }; typedef struct { jsmntype_t type; - int start; - int end; + ptrdiff_t start; + ptrdiff_t end; int size; #ifdef JSMN_PARENT_LINKS int parent; #endif } jsmntok_t; typedef struct { - unsigned int pos; /* offset in the JSON string */ + size_t pos; /* offset in the JSON string */ unsigned int toknext; /* next token to allocate */ int toksuper; /* superior token node, e.g parent object or array */ } jsmn_parser; @@ -922,8 +951,8 @@ static int jsmn_parse(jsmn_parser *parser, const char *js, size_t len, jsmntok_t #ifndef CGLTF_CONSTS -static const cgltf_size GlbHeaderSize = 12; -static const cgltf_size GlbChunkHeaderSize = 8; +#define GlbHeaderSize 12 +#define GlbChunkHeaderSize 8 static const uint32_t GlbVersion = 2; static const uint32_t GlbMagic = 0x46546C67; static const uint32_t GlbMagicJsonChunk = 0x4E4F534A; @@ -995,7 +1024,7 @@ static cgltf_result cgltf_default_file_read(const struct cgltf_memory_options* m { fseek(file, 0, SEEK_END); -#ifdef _WIN32 +#ifdef _MSC_VER __int64 length = _ftelli64(file); #else long length = ftell(file); @@ -1017,7 +1046,7 @@ static cgltf_result cgltf_default_file_read(const struct cgltf_memory_options* m fclose(file); return cgltf_result_out_of_memory; } - + cgltf_size read_size = fread(file_data, 1, file_size, file); fclose(file); @@ -1125,7 +1154,7 @@ cgltf_result cgltf_parse(const cgltf_options* options, const void* data, cgltf_s // JSON chunk: length uint32_t json_length; memcpy(&json_length, json_chunk, 4); - if (GlbHeaderSize + GlbChunkHeaderSize + json_length > size) + if (json_length > size - GlbHeaderSize - GlbChunkHeaderSize) { return cgltf_result_data_too_short; } @@ -1139,10 +1168,10 @@ cgltf_result cgltf_parse(const cgltf_options* options, const void* data, cgltf_s json_chunk += GlbChunkHeaderSize; - const void* bin = 0; + const void* bin = NULL; cgltf_size bin_size = 0; - if (GlbHeaderSize + GlbChunkHeaderSize + json_length + GlbChunkHeaderSize <= size) + if (GlbChunkHeaderSize <= size - GlbHeaderSize - GlbChunkHeaderSize - json_length) { // We can read another chunk const uint8_t* bin_chunk = json_chunk + json_length; @@ -1150,7 +1179,7 @@ cgltf_result cgltf_parse(const cgltf_options* options, const void* data, cgltf_s // Bin chunk: length uint32_t bin_length; memcpy(&bin_length, bin_chunk, 4); - if (GlbHeaderSize + GlbChunkHeaderSize + json_length + GlbChunkHeaderSize + bin_length > size) + if (bin_length > size - GlbHeaderSize - GlbChunkHeaderSize - json_length - GlbChunkHeaderSize) { return cgltf_result_data_too_short; } @@ -1486,8 +1515,6 @@ cgltf_result cgltf_load_buffers(const cgltf_options* options, cgltf_data* data, return cgltf_result_success; } -static cgltf_size cgltf_calc_size(cgltf_type type, cgltf_component_type component_type); - static cgltf_size cgltf_calc_index_bound(cgltf_buffer_view* buffer_view, cgltf_size offset, cgltf_component_type component_type, cgltf_size count) { char* data = (char*)buffer_view->buffer->data + offset + buffer_view->offset; @@ -1538,6 +1565,9 @@ cgltf_result cgltf_validate(cgltf_data* data) { cgltf_accessor* accessor = &data->accessors[i]; + CGLTF_ASSERT_IF(data->accessors[i].component_type == cgltf_component_type_invalid, cgltf_result_invalid_gltf); + CGLTF_ASSERT_IF(data->accessors[i].type == cgltf_type_invalid, cgltf_result_invalid_gltf); + cgltf_size element_size = cgltf_calc_size(accessor->type, accessor->component_type); if (accessor->buffer_view) @@ -1551,7 +1581,7 @@ cgltf_result cgltf_validate(cgltf_data* data) { cgltf_accessor_sparse* sparse = &accessor->sparse; - cgltf_size indices_component_size = cgltf_calc_size(cgltf_type_scalar, sparse->indices_component_type); + cgltf_size indices_component_size = cgltf_component_size(sparse->indices_component_type); cgltf_size indices_req_size = sparse->indices_byte_offset + indices_component_size * sparse->count; cgltf_size values_req_size = sparse->values_byte_offset + element_size * sparse->count; @@ -1617,43 +1647,48 @@ cgltf_result cgltf_validate(cgltf_data* data) for (cgltf_size j = 0; j < data->meshes[i].primitives_count; ++j) { + CGLTF_ASSERT_IF(data->meshes[i].primitives[j].type == cgltf_primitive_type_invalid, cgltf_result_invalid_gltf); CGLTF_ASSERT_IF(data->meshes[i].primitives[j].targets_count != data->meshes[i].primitives[0].targets_count, cgltf_result_invalid_gltf); - if (data->meshes[i].primitives[j].attributes_count) + CGLTF_ASSERT_IF(data->meshes[i].primitives[j].attributes_count == 0, cgltf_result_invalid_gltf); + + cgltf_accessor* first = data->meshes[i].primitives[j].attributes[0].data; + + CGLTF_ASSERT_IF(first->count == 0, cgltf_result_invalid_gltf); + + for (cgltf_size k = 0; k < data->meshes[i].primitives[j].attributes_count; ++k) { - cgltf_accessor* first = data->meshes[i].primitives[j].attributes[0].data; + CGLTF_ASSERT_IF(data->meshes[i].primitives[j].attributes[k].data->count != first->count, cgltf_result_invalid_gltf); + } - for (cgltf_size k = 0; k < data->meshes[i].primitives[j].attributes_count; ++k) + for (cgltf_size k = 0; k < data->meshes[i].primitives[j].targets_count; ++k) + { + for (cgltf_size m = 0; m < data->meshes[i].primitives[j].targets[k].attributes_count; ++m) { - CGLTF_ASSERT_IF(data->meshes[i].primitives[j].attributes[k].data->count != first->count, cgltf_result_invalid_gltf); + CGLTF_ASSERT_IF(data->meshes[i].primitives[j].targets[k].attributes[m].data->count != first->count, cgltf_result_invalid_gltf); } + } - for (cgltf_size k = 0; k < data->meshes[i].primitives[j].targets_count; ++k) - { - for (cgltf_size m = 0; m < data->meshes[i].primitives[j].targets[k].attributes_count; ++m) - { - CGLTF_ASSERT_IF(data->meshes[i].primitives[j].targets[k].attributes[m].data->count != first->count, cgltf_result_invalid_gltf); - } - } + cgltf_accessor* indices = data->meshes[i].primitives[j].indices; - cgltf_accessor* indices = data->meshes[i].primitives[j].indices; + CGLTF_ASSERT_IF(indices && + indices->component_type != cgltf_component_type_r_8u && + indices->component_type != cgltf_component_type_r_16u && + indices->component_type != cgltf_component_type_r_32u, cgltf_result_invalid_gltf); - CGLTF_ASSERT_IF(indices && - indices->component_type != cgltf_component_type_r_8u && - indices->component_type != cgltf_component_type_r_16u && - indices->component_type != cgltf_component_type_r_32u, cgltf_result_invalid_gltf); + CGLTF_ASSERT_IF(indices && indices->type != cgltf_type_scalar, cgltf_result_invalid_gltf); + CGLTF_ASSERT_IF(indices && indices->stride != cgltf_component_size(indices->component_type), cgltf_result_invalid_gltf); - if (indices && indices->buffer_view && indices->buffer_view->buffer->data) - { - cgltf_size index_bound = cgltf_calc_index_bound(indices->buffer_view, indices->offset, indices->component_type, indices->count); + if (indices && indices->buffer_view && indices->buffer_view->buffer->data) + { + cgltf_size index_bound = cgltf_calc_index_bound(indices->buffer_view, indices->offset, indices->component_type, indices->count); - CGLTF_ASSERT_IF(index_bound >= first->count, cgltf_result_data_too_short); - } + CGLTF_ASSERT_IF(index_bound >= first->count, cgltf_result_data_too_short); + } - for (cgltf_size k = 0; k < data->meshes[i].primitives[j].mappings_count; ++k) - { - CGLTF_ASSERT_IF(data->meshes[i].primitives[j].mappings[k].variant >= data->variants_count, cgltf_result_invalid_gltf); - } + for (cgltf_size k = 0; k < data->meshes[i].primitives[j].mappings_count; ++k) + { + CGLTF_ASSERT_IF(data->meshes[i].primitives[j].mappings[k].variant >= data->variants_count, cgltf_result_invalid_gltf); } } } @@ -1710,10 +1745,15 @@ cgltf_result cgltf_validate(cgltf_data* data) cgltf_size values = channel->sampler->interpolation == cgltf_interpolation_type_cubic_spline ? 3 : 1; - CGLTF_ASSERT_IF(channel->sampler->input->count * components * values != channel->sampler->output->count, cgltf_result_data_too_short); + CGLTF_ASSERT_IF(channel->sampler->input->count * components * values != channel->sampler->output->count, cgltf_result_invalid_gltf); } } + for (cgltf_size i = 0; i < data->variants_count; ++i) + { + CGLTF_ASSERT_IF(!data->variants[i].name, cgltf_result_invalid_gltf); + } + return cgltf_result_success; } @@ -1760,12 +1800,6 @@ static void cgltf_free_extensions(cgltf_data* data, cgltf_extension* extensions, data->memory.free_func(data->memory.user_data, extensions); } -static void cgltf_free_texture_view(cgltf_data* data, cgltf_texture_view* view) -{ - cgltf_free_extensions(data, view->extensions, view->extensions_count); - cgltf_free_extras(data, &view->extras); -} - void cgltf_free(cgltf_data* data) { if (!data) @@ -1787,15 +1821,6 @@ void cgltf_free(cgltf_data* data) { data->memory.free_func(data->memory.user_data, data->accessors[i].name); - if(data->accessors[i].is_sparse) - { - cgltf_free_extensions(data, data->accessors[i].sparse.extensions, data->accessors[i].sparse.extensions_count); - cgltf_free_extensions(data, data->accessors[i].sparse.indices_extensions, data->accessors[i].sparse.indices_extensions_count); - cgltf_free_extensions(data, data->accessors[i].sparse.values_extensions, data->accessors[i].sparse.values_extensions_count); - cgltf_free_extras(data, &data->accessors[i].sparse.extras); - cgltf_free_extras(data, &data->accessors[i].sparse.indices_extras); - cgltf_free_extras(data, &data->accessors[i].sparse.values_extras); - } cgltf_free_extensions(data, data->accessors[i].extensions, data->accessors[i].extensions_count); cgltf_free_extras(data, &data->accessors[i].extras); } @@ -1897,57 +1922,13 @@ void cgltf_free(cgltf_data* data) { data->memory.free_func(data->memory.user_data, data->materials[i].name); - if(data->materials[i].has_pbr_metallic_roughness) - { - cgltf_free_texture_view(data, &data->materials[i].pbr_metallic_roughness.metallic_roughness_texture); - cgltf_free_texture_view(data, &data->materials[i].pbr_metallic_roughness.base_color_texture); - } - if(data->materials[i].has_pbr_specular_glossiness) - { - cgltf_free_texture_view(data, &data->materials[i].pbr_specular_glossiness.diffuse_texture); - cgltf_free_texture_view(data, &data->materials[i].pbr_specular_glossiness.specular_glossiness_texture); - } - if(data->materials[i].has_clearcoat) - { - cgltf_free_texture_view(data, &data->materials[i].clearcoat.clearcoat_texture); - cgltf_free_texture_view(data, &data->materials[i].clearcoat.clearcoat_roughness_texture); - cgltf_free_texture_view(data, &data->materials[i].clearcoat.clearcoat_normal_texture); - } - if(data->materials[i].has_specular) - { - cgltf_free_texture_view(data, &data->materials[i].specular.specular_texture); - cgltf_free_texture_view(data, &data->materials[i].specular.specular_color_texture); - } - if(data->materials[i].has_transmission) - { - cgltf_free_texture_view(data, &data->materials[i].transmission.transmission_texture); - } - if (data->materials[i].has_volume) - { - cgltf_free_texture_view(data, &data->materials[i].volume.thickness_texture); - } - if(data->materials[i].has_sheen) - { - cgltf_free_texture_view(data, &data->materials[i].sheen.sheen_color_texture); - cgltf_free_texture_view(data, &data->materials[i].sheen.sheen_roughness_texture); - } - if(data->materials[i].has_iridescence) - { - cgltf_free_texture_view(data, &data->materials[i].iridescence.iridescence_texture); - cgltf_free_texture_view(data, &data->materials[i].iridescence.iridescence_thickness_texture); - } - - cgltf_free_texture_view(data, &data->materials[i].normal_texture); - cgltf_free_texture_view(data, &data->materials[i].occlusion_texture); - cgltf_free_texture_view(data, &data->materials[i].emissive_texture); - cgltf_free_extensions(data, data->materials[i].extensions, data->materials[i].extensions_count); cgltf_free_extras(data, &data->materials[i].extras); } data->memory.free_func(data->memory.user_data, data->materials); - for (cgltf_size i = 0; i < data->images_count; ++i) + for (cgltf_size i = 0; i < data->images_count; ++i) { data->memory.free_func(data->memory.user_data, data->images[i].name); data->memory.free_func(data->memory.user_data, data->images[i].uri); @@ -2195,8 +2176,6 @@ static cgltf_ssize cgltf_component_read_integer(const void* in, cgltf_component_ return *((const uint16_t*) in); case cgltf_component_type_r_32u: return *((const uint32_t*) in); - case cgltf_component_type_r_32f: - return (cgltf_ssize)*((const float*) in); case cgltf_component_type_r_8: return *((const int8_t*) in); case cgltf_component_type_r_8u: @@ -2214,8 +2193,6 @@ static cgltf_size cgltf_component_read_index(const void* in, cgltf_component_typ return *((const uint16_t*) in); case cgltf_component_type_r_32u: return *((const uint32_t*) in); - case cgltf_component_type_r_32f: - return (cgltf_size)*((const float*) in); case cgltf_component_type_r_8u: return *((const uint8_t*) in); default: @@ -2251,8 +2228,6 @@ static cgltf_float cgltf_component_read_float(const void* in, cgltf_component_ty return (cgltf_float)cgltf_component_read_integer(in, component_type); } -static cgltf_size cgltf_component_size(cgltf_component_type component_type); - static cgltf_bool cgltf_element_read_float(const uint8_t* element, cgltf_type type, cgltf_component_type component_type, cgltf_bool normalized, cgltf_float* out, cgltf_size element_size) { cgltf_size num_components = cgltf_num_components(type); @@ -2355,21 +2330,41 @@ cgltf_size cgltf_accessor_unpack_floats(const cgltf_accessor* accessor, cgltf_fl cgltf_size element_count = float_count / floats_per_element; // First pass: convert each element in the base accessor. - cgltf_float* dest = out; - cgltf_accessor dense = *accessor; - dense.is_sparse = 0; - for (cgltf_size index = 0; index < element_count; index++, dest += floats_per_element) + if (accessor->buffer_view == NULL) { - if (!cgltf_accessor_read_float(&dense, index, dest, floats_per_element)) + memset(out, 0, element_count * floats_per_element * sizeof(cgltf_float)); + } + else + { + const uint8_t* element = cgltf_buffer_view_data(accessor->buffer_view); + if (element == NULL) { return 0; } + element += accessor->offset; + + if (accessor->component_type == cgltf_component_type_r_32f && accessor->stride == floats_per_element * sizeof(cgltf_float)) + { + memcpy(out, element, element_count * floats_per_element * sizeof(cgltf_float)); + } + else + { + cgltf_float* dest = out; + + for (cgltf_size index = 0; index < element_count; index++, dest += floats_per_element, element += accessor->stride) + { + if (!cgltf_element_read_float(element, accessor->type, accessor->component_type, accessor->normalized, dest, floats_per_element)) + { + return 0; + } + } + } } // Second pass: write out each element in the sparse accessor. if (accessor->is_sparse) { - const cgltf_accessor_sparse* sparse = &dense.sparse; + const cgltf_accessor_sparse* sparse = &accessor->sparse; const uint8_t* index_data = cgltf_buffer_view_data(sparse->indices_buffer_view); const uint8_t* reader_head = cgltf_buffer_view_data(sparse->values_buffer_view); @@ -2383,17 +2378,15 @@ cgltf_size cgltf_accessor_unpack_floats(const cgltf_accessor* accessor, cgltf_fl reader_head += sparse->values_byte_offset; cgltf_size index_stride = cgltf_component_size(sparse->indices_component_type); - for (cgltf_size reader_index = 0; reader_index < sparse->count; reader_index++, index_data += index_stride) + for (cgltf_size reader_index = 0; reader_index < sparse->count; reader_index++, index_data += index_stride, reader_head += accessor->stride) { size_t writer_index = cgltf_component_read_index(index_data, sparse->indices_component_type); float* writer_head = out + writer_index * floats_per_element; - if (!cgltf_element_read_float(reader_head, dense.type, dense.component_type, dense.normalized, writer_head, floats_per_element)) + if (!cgltf_element_read_float(reader_head, accessor->type, accessor->component_type, accessor->normalized, writer_head, floats_per_element)) { return 0; } - - reader_head += dense.stride; } } @@ -2487,12 +2480,165 @@ cgltf_size cgltf_accessor_read_index(const cgltf_accessor* accessor, cgltf_size return cgltf_component_read_index(element, accessor->component_type); } +cgltf_size cgltf_mesh_index(const cgltf_data* data, const cgltf_mesh* object) +{ + assert(object && (cgltf_size)(object - data->meshes) < data->meshes_count); + return (cgltf_size)(object - data->meshes); +} + +cgltf_size cgltf_material_index(const cgltf_data* data, const cgltf_material* object) +{ + assert(object && (cgltf_size)(object - data->materials) < data->materials_count); + return (cgltf_size)(object - data->materials); +} + +cgltf_size cgltf_accessor_index(const cgltf_data* data, const cgltf_accessor* object) +{ + assert(object && (cgltf_size)(object - data->accessors) < data->accessors_count); + return (cgltf_size)(object - data->accessors); +} + +cgltf_size cgltf_buffer_view_index(const cgltf_data* data, const cgltf_buffer_view* object) +{ + assert(object && (cgltf_size)(object - data->buffer_views) < data->buffer_views_count); + return (cgltf_size)(object - data->buffer_views); +} + +cgltf_size cgltf_buffer_index(const cgltf_data* data, const cgltf_buffer* object) +{ + assert(object && (cgltf_size)(object - data->buffers) < data->buffers_count); + return (cgltf_size)(object - data->buffers); +} + +cgltf_size cgltf_image_index(const cgltf_data* data, const cgltf_image* object) +{ + assert(object && (cgltf_size)(object - data->images) < data->images_count); + return (cgltf_size)(object - data->images); +} + +cgltf_size cgltf_texture_index(const cgltf_data* data, const cgltf_texture* object) +{ + assert(object && (cgltf_size)(object - data->textures) < data->textures_count); + return (cgltf_size)(object - data->textures); +} + +cgltf_size cgltf_sampler_index(const cgltf_data* data, const cgltf_sampler* object) +{ + assert(object && (cgltf_size)(object - data->samplers) < data->samplers_count); + return (cgltf_size)(object - data->samplers); +} + +cgltf_size cgltf_skin_index(const cgltf_data* data, const cgltf_skin* object) +{ + assert(object && (cgltf_size)(object - data->skins) < data->skins_count); + return (cgltf_size)(object - data->skins); +} + +cgltf_size cgltf_camera_index(const cgltf_data* data, const cgltf_camera* object) +{ + assert(object && (cgltf_size)(object - data->cameras) < data->cameras_count); + return (cgltf_size)(object - data->cameras); +} + +cgltf_size cgltf_light_index(const cgltf_data* data, const cgltf_light* object) +{ + assert(object && (cgltf_size)(object - data->lights) < data->lights_count); + return (cgltf_size)(object - data->lights); +} + +cgltf_size cgltf_node_index(const cgltf_data* data, const cgltf_node* object) +{ + assert(object && (cgltf_size)(object - data->nodes) < data->nodes_count); + return (cgltf_size)(object - data->nodes); +} + +cgltf_size cgltf_scene_index(const cgltf_data* data, const cgltf_scene* object) +{ + assert(object && (cgltf_size)(object - data->scenes) < data->scenes_count); + return (cgltf_size)(object - data->scenes); +} + +cgltf_size cgltf_animation_index(const cgltf_data* data, const cgltf_animation* object) +{ + assert(object && (cgltf_size)(object - data->animations) < data->animations_count); + return (cgltf_size)(object - data->animations); +} + +cgltf_size cgltf_animation_sampler_index(const cgltf_animation* animation, const cgltf_animation_sampler* object) +{ + assert(object && (cgltf_size)(object - animation->samplers) < animation->samplers_count); + return (cgltf_size)(object - animation->samplers); +} + +cgltf_size cgltf_animation_channel_index(const cgltf_animation* animation, const cgltf_animation_channel* object) +{ + assert(object && (cgltf_size)(object - animation->channels) < animation->channels_count); + return (cgltf_size)(object - animation->channels); +} + +cgltf_size cgltf_accessor_unpack_indices(const cgltf_accessor* accessor, void* out, cgltf_size out_component_size, cgltf_size index_count) +{ + if (out == NULL) + { + return accessor->count; + } + + index_count = accessor->count < index_count ? accessor->count : index_count; + cgltf_size index_component_size = cgltf_component_size(accessor->component_type); + + if (accessor->is_sparse) + { + return 0; + } + if (accessor->buffer_view == NULL) + { + return 0; + } + if (index_component_size > out_component_size) + { + return 0; + } + const uint8_t* element = cgltf_buffer_view_data(accessor->buffer_view); + if (element == NULL) + { + return 0; + } + element += accessor->offset; + + if (index_component_size == out_component_size && accessor->stride == out_component_size) + { + memcpy(out, element, index_count * index_component_size); + return index_count; + } + + // The component size of the output array is larger than the component size of the index data, so index data will be padded. + switch (out_component_size) + { + case 2: + for (cgltf_size index = 0; index < index_count; index++, element += accessor->stride) + { + ((uint16_t*)out)[index] = (uint16_t)cgltf_component_read_index(element, accessor->component_type); + } + break; + case 4: + for (cgltf_size index = 0; index < index_count; index++, element += accessor->stride) + { + ((uint32_t*)out)[index] = (uint32_t)cgltf_component_read_index(element, accessor->component_type); + } + break; + default: + break; + } + + return index_count; +} + #define CGLTF_ERROR_JSON -1 #define CGLTF_ERROR_NOMEM -2 #define CGLTF_ERROR_LEGACY -3 #define CGLTF_CHECK_TOKTYPE(tok_, type_) if ((tok_).type != (type_)) { return CGLTF_ERROR_JSON; } -#define CGLTF_CHECK_TOKTYPE_RETTYPE(tok_, type_, ret_) if ((tok_).type != (type_)) { return (ret_)CGLTF_ERROR_JSON; } +#define CGLTF_CHECK_TOKTYPE_RET(tok_, type_, ret_) if ((tok_).type != (type_)) { return ret_; } #define CGLTF_CHECK_KEY(tok_) if ((tok_).type != JSMN_STRING || (tok_).size == 0) { return CGLTF_ERROR_JSON; } /* checking size for 0 verifies that a value follows the key */ #define CGLTF_PTRINDEX(type, idx) (type*)((cgltf_size)idx + 1) @@ -2503,7 +2649,7 @@ static int cgltf_json_strcmp(jsmntok_t const* tok, const uint8_t* json_chunk, co { CGLTF_CHECK_TOKTYPE(*tok, JSMN_STRING); size_t const str_len = strlen(str); - size_t const name_length = tok->end - tok->start; + size_t const name_length = (size_t)(tok->end - tok->start); return (str_len == name_length) ? strncmp((const char*)json_chunk + tok->start, str, str_len) : 128; } @@ -2511,7 +2657,7 @@ static int cgltf_json_to_int(jsmntok_t const* tok, const uint8_t* json_chunk) { CGLTF_CHECK_TOKTYPE(*tok, JSMN_PRIMITIVE); char tmp[128]; - int size = (cgltf_size)(tok->end - tok->start) < sizeof(tmp) ? tok->end - tok->start : (int)(sizeof(tmp) - 1); + int size = (size_t)(tok->end - tok->start) < sizeof(tmp) ? (int)(tok->end - tok->start) : (int)(sizeof(tmp) - 1); strncpy(tmp, (const char*)json_chunk + tok->start, size); tmp[size] = 0; return CGLTF_ATOI(tmp); @@ -2519,19 +2665,20 @@ static int cgltf_json_to_int(jsmntok_t const* tok, const uint8_t* json_chunk) static cgltf_size cgltf_json_to_size(jsmntok_t const* tok, const uint8_t* json_chunk) { - CGLTF_CHECK_TOKTYPE_RETTYPE(*tok, JSMN_PRIMITIVE, cgltf_size); + CGLTF_CHECK_TOKTYPE_RET(*tok, JSMN_PRIMITIVE, 0); char tmp[128]; - int size = (cgltf_size)(tok->end - tok->start) < sizeof(tmp) ? tok->end - tok->start : (int)(sizeof(tmp) - 1); + int size = (size_t)(tok->end - tok->start) < sizeof(tmp) ? (int)(tok->end - tok->start) : (int)(sizeof(tmp) - 1); strncpy(tmp, (const char*)json_chunk + tok->start, size); tmp[size] = 0; - return (cgltf_size)CGLTF_ATOLL(tmp); + long long res = CGLTF_ATOLL(tmp); + return res < 0 ? 0 : (cgltf_size)res; } static cgltf_float cgltf_json_to_float(jsmntok_t const* tok, const uint8_t* json_chunk) { CGLTF_CHECK_TOKTYPE(*tok, JSMN_PRIMITIVE); char tmp[128]; - int size = (cgltf_size)(tok->end - tok->start) < sizeof(tmp) ? tok->end - tok->start : (int)(sizeof(tmp) - 1); + int size = (size_t)(tok->end - tok->start) < sizeof(tmp) ? (int)(tok->end - tok->start) : (int)(sizeof(tmp) - 1); strncpy(tmp, (const char*)json_chunk + tok->start, size); tmp[size] = 0; return (cgltf_float)CGLTF_ATOF(tmp); @@ -2539,7 +2686,7 @@ static cgltf_float cgltf_json_to_float(jsmntok_t const* tok, const uint8_t* json static cgltf_bool cgltf_json_to_bool(jsmntok_t const* tok, const uint8_t* json_chunk) { - int size = tok->end - tok->start; + int size = (int)(tok->end - tok->start); return size == 4 && memcmp(json_chunk + tok->start, "true", 4) == 0; } @@ -2605,7 +2752,7 @@ static int cgltf_parse_json_string(cgltf_options* options, jsmntok_t const* toke { return CGLTF_ERROR_JSON; } - int size = tokens[i].end - tokens[i].start; + int size = (int)(tokens[i].end - tokens[i].start); char* result = (char*)options->memory.alloc_func(options->memory.user_data, size + 1); if (!result) { @@ -2706,6 +2853,11 @@ static void cgltf_parse_attribute_type(const char* name, cgltf_attribute_type* o if (us && *out_type != cgltf_attribute_type_invalid) { *out_index = CGLTF_ATOI(us + 1); + if (*out_index < 0) + { + *out_type = cgltf_attribute_type_invalid; + *out_index = 0; + } } } @@ -2863,6 +3015,10 @@ static int cgltf_parse_json_draco_mesh_compression(cgltf_options* options, jsmnt out_draco_mesh_compression->buffer_view = CGLTF_PTRINDEX(cgltf_buffer_view, cgltf_json_to_int(tokens + i, json_chunk)); ++i; } + else + { + i = cgltf_skip_json(tokens, i+1); + } if (i < 0) { @@ -2888,11 +3044,9 @@ static int cgltf_parse_json_mesh_gpu_instancing(cgltf_options* options, jsmntok_ { i = cgltf_parse_json_attribute_list(options, tokens, i + 1, json_chunk, &out_mesh_gpu_instancing->attributes, &out_mesh_gpu_instancing->attributes_count); } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "bufferView") == 0) + else { - ++i; - out_mesh_gpu_instancing->buffer_view = CGLTF_PTRINDEX(cgltf_buffer_view, cgltf_json_to_int(tokens + i, json_chunk)); - ++i; + i = cgltf_skip_json(tokens, i+1); } if (i < 0) @@ -3036,6 +3190,31 @@ static int cgltf_parse_json_material_mappings(cgltf_options* options, jsmntok_t return i; } +static cgltf_primitive_type cgltf_json_to_primitive_type(jsmntok_t const* tok, const uint8_t* json_chunk) +{ + int type = cgltf_json_to_int(tok, json_chunk); + + switch (type) + { + case 0: + return cgltf_primitive_type_points; + case 1: + return cgltf_primitive_type_lines; + case 2: + return cgltf_primitive_type_line_loop; + case 3: + return cgltf_primitive_type_line_strip; + case 4: + return cgltf_primitive_type_triangles; + case 5: + return cgltf_primitive_type_triangle_strip; + case 6: + return cgltf_primitive_type_triangle_fan; + default: + return cgltf_primitive_type_invalid; + } +} + static int cgltf_parse_json_primitive(cgltf_options* options, jsmntok_t const* tokens, int i, const uint8_t* json_chunk, cgltf_primitive* out_prim) { CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); @@ -3052,9 +3231,7 @@ static int cgltf_parse_json_primitive(cgltf_options* options, jsmntok_t const* t if (cgltf_json_strcmp(tokens+i, json_chunk, "mode") == 0) { ++i; - out_prim->type - = (cgltf_primitive_type) - cgltf_json_to_int(tokens+i, json_chunk); + out_prim->type = cgltf_json_to_primitive_type(tokens+i, json_chunk); ++i; } else if (cgltf_json_strcmp(tokens+i, json_chunk, "indices") == 0) @@ -3290,7 +3467,7 @@ static cgltf_component_type cgltf_json_to_component_type(jsmntok_t const* tok, c } } -static int cgltf_parse_json_accessor_sparse(cgltf_options* options, jsmntok_t const* tokens, int i, const uint8_t* json_chunk, cgltf_accessor_sparse* out_sparse) +static int cgltf_parse_json_accessor_sparse(jsmntok_t const* tokens, int i, const uint8_t* json_chunk, cgltf_accessor_sparse* out_sparse) { CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); @@ -3304,7 +3481,7 @@ static int cgltf_parse_json_accessor_sparse(cgltf_options* options, jsmntok_t co if (cgltf_json_strcmp(tokens+i, json_chunk, "count") == 0) { ++i; - out_sparse->count = cgltf_json_to_int(tokens + i, json_chunk); + out_sparse->count = cgltf_json_to_size(tokens + i, json_chunk); ++i; } else if (cgltf_json_strcmp(tokens+i, json_chunk, "indices") == 0) @@ -3337,14 +3514,6 @@ static int cgltf_parse_json_accessor_sparse(cgltf_options* options, jsmntok_t co out_sparse->indices_component_type = cgltf_json_to_component_type(tokens + i, json_chunk); ++i; } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "extras") == 0) - { - i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_sparse->indices_extras); - } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "extensions") == 0) - { - i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_sparse->indices_extensions_count, &out_sparse->indices_extensions); - } else { i = cgltf_skip_json(tokens, i+1); @@ -3380,14 +3549,6 @@ static int cgltf_parse_json_accessor_sparse(cgltf_options* options, jsmntok_t co out_sparse->values_byte_offset = cgltf_json_to_size(tokens + i, json_chunk); ++i; } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "extras") == 0) - { - i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_sparse->values_extras); - } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "extensions") == 0) - { - i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_sparse->values_extensions_count, &out_sparse->values_extensions); - } else { i = cgltf_skip_json(tokens, i+1); @@ -3399,14 +3560,6 @@ static int cgltf_parse_json_accessor_sparse(cgltf_options* options, jsmntok_t co } } } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "extras") == 0) - { - i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_sparse->extras); - } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "extensions") == 0) - { - i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_sparse->extensions_count, &out_sparse->extensions); - } else { i = cgltf_skip_json(tokens, i+1); @@ -3464,8 +3617,7 @@ static int cgltf_parse_json_accessor(cgltf_options* options, jsmntok_t const* to else if (cgltf_json_strcmp(tokens+i, json_chunk, "count") == 0) { ++i; - out_accessor->count = - cgltf_json_to_int(tokens+i, json_chunk); + out_accessor->count = cgltf_json_to_size(tokens+i, json_chunk); ++i; } else if (cgltf_json_strcmp(tokens+i, json_chunk, "type") == 0) @@ -3520,7 +3672,7 @@ static int cgltf_parse_json_accessor(cgltf_options* options, jsmntok_t const* to else if (cgltf_json_strcmp(tokens + i, json_chunk, "sparse") == 0) { out_accessor->is_sparse = 1; - i = cgltf_parse_json_accessor_sparse(options, tokens, i + 1, json_chunk, &out_accessor->sparse); + i = cgltf_parse_json_accessor_sparse(tokens, i + 1, json_chunk, &out_accessor->sparse); } else if (cgltf_json_strcmp(tokens + i, json_chunk, "extras") == 0) { @@ -3592,6 +3744,8 @@ static int cgltf_parse_json_texture_transform(jsmntok_t const* tokens, int i, co static int cgltf_parse_json_texture_view(cgltf_options* options, jsmntok_t const* tokens, int i, const uint8_t* json_chunk, cgltf_texture_view* out_texture_view) { + (void)options; + CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); out_texture_view->scale = 1.0f; @@ -3616,7 +3770,7 @@ static int cgltf_parse_json_texture_view(cgltf_options* options, jsmntok_t const out_texture_view->texcoord = cgltf_json_to_int(tokens + i, json_chunk); ++i; } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "scale") == 0) + else if (cgltf_json_strcmp(tokens + i, json_chunk, "scale") == 0) { ++i; out_texture_view->scale = cgltf_json_to_float(tokens + i, json_chunk); @@ -3628,28 +3782,12 @@ static int cgltf_parse_json_texture_view(cgltf_options* options, jsmntok_t const out_texture_view->scale = cgltf_json_to_float(tokens + i, json_chunk); ++i; } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "extras") == 0) - { - i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_texture_view->extras); - } else if (cgltf_json_strcmp(tokens + i, json_chunk, "extensions") == 0) { ++i; CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); - if(out_texture_view->extensions) - { - return CGLTF_ERROR_JSON; - } - int extensions_size = tokens[i].size; - out_texture_view->extensions_count = 0; - out_texture_view->extensions = (cgltf_extension*)cgltf_calloc(options, sizeof(cgltf_extension), extensions_size); - - if (!out_texture_view->extensions) - { - return CGLTF_ERROR_NOMEM; - } ++i; @@ -3664,7 +3802,7 @@ static int cgltf_parse_json_texture_view(cgltf_options* options, jsmntok_t const } else { - i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_texture_view->extensions[out_texture_view->extensions_count++])); + i = cgltf_skip_json(tokens, i + 1); } if (i < 0) @@ -3701,11 +3839,11 @@ static int cgltf_parse_json_pbr_metallic_roughness(cgltf_options* options, jsmnt if (cgltf_json_strcmp(tokens+i, json_chunk, "metallicFactor") == 0) { ++i; - out_pbr->metallic_factor = + out_pbr->metallic_factor = cgltf_json_to_float(tokens + i, json_chunk); ++i; } - else if (cgltf_json_strcmp(tokens+i, json_chunk, "roughnessFactor") == 0) + else if (cgltf_json_strcmp(tokens+i, json_chunk, "roughnessFactor") == 0) { ++i; out_pbr->roughness_factor = @@ -3718,13 +3856,11 @@ static int cgltf_parse_json_pbr_metallic_roughness(cgltf_options* options, jsmnt } else if (cgltf_json_strcmp(tokens+i, json_chunk, "baseColorTexture") == 0) { - i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, - &out_pbr->base_color_texture); + i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_pbr->base_color_texture); } else if (cgltf_json_strcmp(tokens + i, json_chunk, "metallicRoughnessTexture") == 0) { - i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, - &out_pbr->metallic_roughness_texture); + i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_pbr->metallic_roughness_texture); } else { @@ -4127,6 +4263,78 @@ static int cgltf_parse_json_iridescence(cgltf_options* options, jsmntok_t const* return i; } +static int cgltf_parse_json_anisotropy(cgltf_options* options, jsmntok_t const* tokens, int i, const uint8_t* json_chunk, cgltf_anisotropy* out_anisotropy) +{ + CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); + int size = tokens[i].size; + ++i; + + + for (int j = 0; j < size; ++j) + { + CGLTF_CHECK_KEY(tokens[i]); + + if (cgltf_json_strcmp(tokens + i, json_chunk, "anisotropyStrength") == 0) + { + ++i; + out_anisotropy->anisotropy_strength = cgltf_json_to_float(tokens + i, json_chunk); + ++i; + } + else if (cgltf_json_strcmp(tokens + i, json_chunk, "anisotropyRotation") == 0) + { + ++i; + out_anisotropy->anisotropy_rotation = cgltf_json_to_float(tokens + i, json_chunk); + ++i; + } + else if (cgltf_json_strcmp(tokens + i, json_chunk, "anisotropyTexture") == 0) + { + i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_anisotropy->anisotropy_texture); + } + else + { + i = cgltf_skip_json(tokens, i + 1); + } + + if (i < 0) + { + return i; + } + } + + return i; +} + +static int cgltf_parse_json_dispersion(jsmntok_t const* tokens, int i, const uint8_t* json_chunk, cgltf_dispersion* out_dispersion) +{ + CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); + int size = tokens[i].size; + ++i; + + + for (int j = 0; j < size; ++j) + { + CGLTF_CHECK_KEY(tokens[i]); + + if (cgltf_json_strcmp(tokens + i, json_chunk, "dispersion") == 0) + { + ++i; + out_dispersion->dispersion = cgltf_json_to_float(tokens + i, json_chunk); + ++i; + } + else + { + i = cgltf_skip_json(tokens, i + 1); + } + + if (i < 0) + { + return i; + } + } + + return i; +} + static int cgltf_parse_json_image(cgltf_options* options, jsmntok_t const* tokens, int i, const uint8_t* json_chunk, cgltf_image* out_image) { CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); @@ -4134,11 +4342,11 @@ static int cgltf_parse_json_image(cgltf_options* options, jsmntok_t const* token int size = tokens[i].size; ++i; - for (int j = 0; j < size; ++j) + for (int j = 0; j < size; ++j) { CGLTF_CHECK_KEY(tokens[i]); - if (cgltf_json_strcmp(tokens + i, json_chunk, "uri") == 0) + if (cgltf_json_strcmp(tokens + i, json_chunk, "uri") == 0) { i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_image->uri); } @@ -4218,7 +4426,7 @@ static int cgltf_parse_json_sampler(cgltf_options* options, jsmntok_t const* tok = cgltf_json_to_int(tokens + i, json_chunk); ++i; } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "wrapT") == 0) + else if (cgltf_json_strcmp(tokens + i, json_chunk, "wrapT") == 0) { ++i; out_sampler->wrap_t @@ -4268,7 +4476,7 @@ static int cgltf_parse_json_texture(cgltf_options* options, jsmntok_t const* tok out_texture->sampler = CGLTF_PTRINDEX(cgltf_sampler, cgltf_json_to_int(tokens + i, json_chunk)); ++i; } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "source") == 0) + else if (cgltf_json_strcmp(tokens + i, json_chunk, "source") == 0) { ++i; out_texture->image = CGLTF_PTRINDEX(cgltf_image, cgltf_json_to_int(tokens + i, json_chunk)); @@ -4515,6 +4723,16 @@ static int cgltf_parse_json_material(cgltf_options* options, jsmntok_t const* to out_material->has_iridescence = 1; i = cgltf_parse_json_iridescence(options, tokens, i + 1, json_chunk, &out_material->iridescence); } + else if (cgltf_json_strcmp(tokens + i, json_chunk, "KHR_materials_anisotropy") == 0) + { + out_material->has_anisotropy = 1; + i = cgltf_parse_json_anisotropy(options, tokens, i + 1, json_chunk, &out_material->anisotropy); + } + else if (cgltf_json_strcmp(tokens + i, json_chunk, "KHR_materials_dispersion") == 0) + { + out_material->has_dispersion = 1; + i = cgltf_parse_json_dispersion(tokens, i + 1, json_chunk, &out_material->dispersion); + } else { i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_material->extensions[out_material->extensions_count++])); @@ -4674,7 +4892,7 @@ static int cgltf_parse_json_meshopt_compression(cgltf_options* options, jsmntok_ else if (cgltf_json_strcmp(tokens+i, json_chunk, "count") == 0) { ++i; - out_meshopt_compression->count = cgltf_json_to_int(tokens+i, json_chunk); + out_meshopt_compression->count = cgltf_json_to_size(tokens+i, json_chunk); ++i; } else if (cgltf_json_strcmp(tokens+i, json_chunk, "mode") == 0) @@ -5963,7 +6181,7 @@ cgltf_size cgltf_num_components(cgltf_type type) { } } -static cgltf_size cgltf_component_size(cgltf_component_type component_type) { +cgltf_size cgltf_component_size(cgltf_component_type component_type) { switch (component_type) { case cgltf_component_type_r_8: @@ -5981,7 +6199,7 @@ static cgltf_size cgltf_component_size(cgltf_component_type component_type) { } } -static cgltf_size cgltf_calc_size(cgltf_type type, cgltf_component_type component_type) +cgltf_size cgltf_calc_size(cgltf_type type, cgltf_component_type component_type) { cgltf_size component_size = cgltf_component_size(component_type); if (type == cgltf_type_mat2 && component_size == 1) @@ -6366,6 +6584,8 @@ static int cgltf_fixup_pointers(cgltf_data* data) CGLTF_PTRFIXUP(data->materials[i].iridescence.iridescence_texture.texture, data->textures, data->textures_count); CGLTF_PTRFIXUP(data->materials[i].iridescence.iridescence_thickness_texture.texture, data->textures, data->textures_count); + + CGLTF_PTRFIXUP(data->materials[i].anisotropy.anisotropy_texture.texture, data->textures, data->textures_count); } for (cgltf_size i = 0; i < data->buffer_views_count; ++i) @@ -6410,7 +6630,6 @@ static int cgltf_fixup_pointers(cgltf_data* data) if (data->nodes[i].has_mesh_gpu_instancing) { - CGLTF_PTRFIXUP_REQ(data->nodes[i].mesh_gpu_instancing.buffer_view, data->buffer_views, data->buffer_views_count); for (cgltf_size m = 0; m < data->nodes[i].mesh_gpu_instancing.attributes_count; ++m) { CGLTF_PTRFIXUP_REQ(data->nodes[i].mesh_gpu_instancing.attributes[m].data, data->accessors, data->accessors_count); @@ -6499,7 +6718,7 @@ static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser, * Fills token type and boundaries. */ static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type, - int start, int end) { + ptrdiff_t start, ptrdiff_t end) { token->type = type; token->start = start; token->end = end; @@ -6512,7 +6731,7 @@ static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type, static int jsmn_parse_primitive(jsmn_parser *parser, const char *js, size_t len, jsmntok_t *tokens, size_t num_tokens) { jsmntok_t *token; - int start; + ptrdiff_t start; start = parser->pos; @@ -6562,7 +6781,7 @@ static int jsmn_parse_string(jsmn_parser *parser, const char *js, size_t len, jsmntok_t *tokens, size_t num_tokens) { jsmntok_t *token; - int start = parser->pos; + ptrdiff_t start = parser->pos; parser->pos++; diff --git a/third_party/cgltf/cgltf_write.h b/third_party/cgltf/cgltf_write.h index 033b0d1ccab..aa648a479a7 100644 --- a/third_party/cgltf/cgltf_write.h +++ b/third_party/cgltf/cgltf_write.h @@ -1,7 +1,7 @@ /** * cgltf_write - a single-file glTF 2.0 writer written in C99. * - * Version: 1.13 + * Version: 1.14 * * Website: https://github.com/jkuhlmann/cgltf * @@ -85,6 +85,8 @@ cgltf_size cgltf_write(const cgltf_options* options, char* buffer, cgltf_size si #define CGLTF_EXTENSION_FLAG_MATERIALS_EMISSIVE_STRENGTH (1 << 13) #define CGLTF_EXTENSION_FLAG_MESH_GPU_INSTANCING (1 << 14) #define CGLTF_EXTENSION_FLAG_MATERIALS_IRIDESCENCE (1 << 15) +#define CGLTF_EXTENSION_FLAG_MATERIALS_ANISOTROPY (1 << 16) +#define CGLTF_EXTENSION_FLAG_MATERIALS_DISPERSION (1 << 17) typedef struct { char* buffer; @@ -152,7 +154,6 @@ typedef struct { context->extension_flags |= CGLTF_EXTENSION_FLAG_TEXTURE_TRANSFORM; \ cgltf_write_texture_transform(context, &info.transform); \ } \ - cgltf_write_extras(context, &info.extras); \ cgltf_write_line(context, "}"); } #define CGLTF_WRITE_NORMAL_TEXTURE_INFO(label, info) if (info.texture) { \ @@ -164,7 +165,6 @@ typedef struct { context->extension_flags |= CGLTF_EXTENSION_FLAG_TEXTURE_TRANSFORM; \ cgltf_write_texture_transform(context, &info.transform); \ } \ - cgltf_write_extras(context, &info.extras); \ cgltf_write_line(context, "}"); } #define CGLTF_WRITE_OCCLUSION_TEXTURE_INFO(label, info) if (info.texture) { \ @@ -176,12 +176,11 @@ typedef struct { context->extension_flags |= CGLTF_EXTENSION_FLAG_TEXTURE_TRANSFORM; \ cgltf_write_texture_transform(context, &info.transform); \ } \ - cgltf_write_extras(context, &info.extras); \ cgltf_write_line(context, "}"); } #ifndef CGLTF_CONSTS -static const cgltf_size GlbHeaderSize = 12; -static const cgltf_size GlbChunkHeaderSize = 8; +#define GlbHeaderSize 12 +#define GlbChunkHeaderSize 8 static const uint32_t GlbVersion = 2; static const uint32_t GlbMagic = 0x46546C67; static const uint32_t GlbMagicJsonChunk = 0x4E4F534A; @@ -360,6 +359,21 @@ static int cgltf_int_from_component_type(cgltf_component_type ctype) } } +static int cgltf_int_from_primitive_type(cgltf_primitive_type ctype) +{ + switch (ctype) + { + case cgltf_primitive_type_points: return 0; + case cgltf_primitive_type_lines: return 1; + case cgltf_primitive_type_line_loop: return 2; + case cgltf_primitive_type_line_strip: return 3; + case cgltf_primitive_type_triangles: return 4; + case cgltf_primitive_type_triangle_strip: return 5; + case cgltf_primitive_type_triangle_fan: return 6; + default: return -1; + } +} + static const char* cgltf_str_from_alpha_mode(cgltf_alpha_mode alpha_mode) { switch (alpha_mode) @@ -455,7 +469,7 @@ static void cgltf_write_asset(cgltf_write_context* context, const cgltf_asset* a static void cgltf_write_primitive(cgltf_write_context* context, const cgltf_primitive* prim) { - cgltf_write_intprop(context, "mode", (int) prim->type, 4); + cgltf_write_intprop(context, "mode", cgltf_int_from_primitive_type(prim->type), 4); CGLTF_WRITE_IDXPROP("indices", prim->indices, context->data->accessors); CGLTF_WRITE_IDXPROP("material", prim->material, context->data->materials); cgltf_write_line(context, "\"attributes\": {"); @@ -641,6 +655,16 @@ static void cgltf_write_material(cgltf_write_context* context, const cgltf_mater context->extension_flags |= CGLTF_EXTENSION_FLAG_MATERIALS_IRIDESCENCE; } + if (material->has_anisotropy) + { + context->extension_flags |= CGLTF_EXTENSION_FLAG_MATERIALS_ANISOTROPY; + } + + if (material->has_dispersion) + { + context->extension_flags |= CGLTF_EXTENSION_FLAG_MATERIALS_DISPERSION; + } + if (material->has_pbr_metallic_roughness) { const cgltf_pbr_metallic_roughness* params = &material->pbr_metallic_roughness; @@ -656,7 +680,7 @@ static void cgltf_write_material(cgltf_write_context* context, const cgltf_mater cgltf_write_line(context, "}"); } - if (material->unlit || material->has_pbr_specular_glossiness || material->has_clearcoat || material->has_ior || material->has_specular || material->has_transmission || material->has_sheen || material->has_volume || material->has_emissive_strength || material->has_iridescence) + if (material->unlit || material->has_pbr_specular_glossiness || material->has_clearcoat || material->has_ior || material->has_specular || material->has_transmission || material->has_sheen || material->has_volume || material->has_emissive_strength || material->has_iridescence || material->has_anisotropy || material->has_dispersion) { cgltf_write_line(context, "\"extensions\": {"); if (material->has_clearcoat) @@ -767,6 +791,22 @@ static void cgltf_write_material(cgltf_write_context* context, const cgltf_mater CGLTF_WRITE_TEXTURE_INFO("iridescenceThicknessTexture", params->iridescence_thickness_texture); cgltf_write_line(context, "}"); } + if (material->has_anisotropy) + { + cgltf_write_line(context, "\"KHR_materials_anisotropy\": {"); + const cgltf_anisotropy* params = &material->anisotropy; + cgltf_write_floatprop(context, "anisotropyFactor", params->anisotropy_strength, 0.f); + cgltf_write_floatprop(context, "anisotropyRotation", params->anisotropy_rotation, 0.f); + CGLTF_WRITE_TEXTURE_INFO("anisotropyTexture", params->anisotropy_texture); + cgltf_write_line(context, "}"); + } + if (material->has_dispersion) + { + cgltf_write_line(context, "\"KHR_materials_dispersion\": {"); + const cgltf_dispersion* params = &material->dispersion; + cgltf_write_floatprop(context, "dispersion", params->dispersion, 0.f); + cgltf_write_line(context, "}"); + } cgltf_write_line(context, "}"); } @@ -977,7 +1017,6 @@ static void cgltf_write_node(cgltf_write_context* context, const cgltf_node* nod cgltf_write_line(context, "\"EXT_mesh_gpu_instancing\": {"); { - CGLTF_WRITE_IDXPROP("bufferView", node->mesh_gpu_instancing.buffer_view, context->data->buffer_views); cgltf_write_line(context, "\"attributes\": {"); { for (cgltf_size i = 0; i < node->mesh_gpu_instancing.attributes_count; ++i) @@ -1044,14 +1083,11 @@ static void cgltf_write_accessor(cgltf_write_context* context, const cgltf_acces cgltf_write_sizeprop(context, "byteOffset", (int)accessor->sparse.indices_byte_offset, 0); CGLTF_WRITE_IDXPROP("bufferView", accessor->sparse.indices_buffer_view, context->data->buffer_views); cgltf_write_intprop(context, "componentType", cgltf_int_from_component_type(accessor->sparse.indices_component_type), 0); - cgltf_write_extras(context, &accessor->sparse.indices_extras); cgltf_write_line(context, "}"); cgltf_write_line(context, "\"values\": {"); cgltf_write_sizeprop(context, "byteOffset", (int)accessor->sparse.values_byte_offset, 0); CGLTF_WRITE_IDXPROP("bufferView", accessor->sparse.values_buffer_view, context->data->buffer_views); - cgltf_write_extras(context, &accessor->sparse.values_extras); cgltf_write_line(context, "}"); - cgltf_write_extras(context, &accessor->sparse.extras); cgltf_write_line(context, "}"); } cgltf_write_extras(context, &accessor->extras); @@ -1123,6 +1159,7 @@ static void cgltf_write_light(cgltf_write_context* context, const cgltf_light* l cgltf_write_floatprop(context, "outerConeAngle", light->spot_outer_cone_angle, 3.14159265358979323846f/4.0f); cgltf_write_line(context, "}"); } + cgltf_write_extras( context, &light->extras ); cgltf_write_line(context, "}"); } @@ -1249,9 +1286,15 @@ static void cgltf_write_extensions(cgltf_write_context* context, uint32_t extens if (extension_flags & CGLTF_EXTENSION_FLAG_MATERIALS_IRIDESCENCE) { cgltf_write_stritem(context, "KHR_materials_iridescence"); } + if (extension_flags & CGLTF_EXTENSION_FLAG_MATERIALS_ANISOTROPY) { + cgltf_write_stritem(context, "KHR_materials_anisotropy"); + } if (extension_flags & CGLTF_EXTENSION_FLAG_MESH_GPU_INSTANCING) { cgltf_write_stritem(context, "EXT_mesh_gpu_instancing"); } + if (extension_flags & CGLTF_EXTENSION_FLAG_MATERIALS_DISPERSION) { + cgltf_write_stritem(context, "KHR_materials_dispersion"); + } } cgltf_size cgltf_write(const cgltf_options* options, char* buffer, cgltf_size size, const cgltf_data* data) diff --git a/third_party/cgltf/test/test_all.py b/third_party/cgltf/test/test_all.py index ac0882f5d82..64b89566f0a 100755 --- a/third_party/cgltf/test/test_all.py +++ b/third_party/cgltf/test/test_all.py @@ -52,7 +52,7 @@ def collect_files(path, type, name): f = open(".git/info/sparse-checkout", "w+") f.write("2.0/*\n") f.close() - os.system("git pull --depth=1 origin master") + os.system("git pull --depth=1 origin main") os.chdir("..") collect_files("glTF-Sample-Models/2.0/", ".glb", "cgltf_test") collect_files("glTF-Sample-Models/2.0/", ".gltf", "cgltf_test") diff --git a/third_party/cgltf/test/test_conversion.cpp b/third_party/cgltf/test/test_conversion.cpp index e5217f33c39..c00b50e94c2 100644 --- a/third_party/cgltf/test/test_conversion.cpp +++ b/third_party/cgltf/test/test_conversion.cpp @@ -26,11 +26,13 @@ int main(int argc, char** argv) if (result == cgltf_result_success) result = cgltf_load_buffers(&options, data, argv[1]); - if (strstr(argv[1], "Draco")) - { - cgltf_free(data); - return 0; - } + // Skip files that use mesh compression since they require extra code to decompress accessor data + for (size_t i = 0; i < data->extensions_used_count; ++i) + if (strcmp(data->extensions_used[i], "KHR_draco_mesh_compression") == 0 || strcmp(data->extensions_used[i], "EXT_meshopt_compression") == 0) + { + cgltf_free(data); + return 0; + } if (result != cgltf_result_success) return result; diff --git a/third_party/cgltf/tnt/README b/third_party/cgltf/tnt/README index 1e992ce14c7..fbfc97e770e 100644 --- a/third_party/cgltf/tnt/README +++ b/third_party/cgltf/tnt/README @@ -1,10 +1,10 @@ This folder was last updated as follows: - export sha=280ab89 + export tag=v1.13 cd third_party - curl -L -O https://github.com/jkuhlmann/cgltf/archive/${sha}.zip - unzip ${sha}.zip + curl -L -O https://github.com/jkuhlmann/cgltf/archive/refs/tags/${tag}.zip + unzip ${tag}.zip mv cgltf-* cgltf_new rsync -r cgltf_new/ cgltf/ --delete --exclude tnt - rm -rf ${sha}.zip cgltf_new + rm -rf ${tag}.zip cgltf_new git add cgltf ; git status diff --git a/third_party/clang/iOS.cmake b/third_party/clang/iOS.cmake index a5619558834..a935c08f663 100644 --- a/third_party/clang/iOS.cmake +++ b/third_party/clang/iOS.cmake @@ -13,7 +13,7 @@ set(CMAKE_OSX_ARCHITECTURES ${IOS_ARCH} CACHE STRING "Build architecture for iOS # Necessary for correct install location set(DIST_ARCH ${IOS_ARCH}) -add_definitions(-DIOS) +add_definitions(-DFILAMENT_IOS) set(IOS_MIN_TARGET "11.0") @@ -108,11 +108,3 @@ SET(IOS_COMMON_FLAGS "-m${PLATFORM_FLAG_NAME}-version-min=${IOS_MIN_TARGET}") SET(CMAKE_C_FLAGS_INIT "${IOS_COMMON_FLAGS}") SET(CMAKE_CXX_FLAGS_INIT "${IOS_COMMON_FLAGS}") SET(CMAKE_ASM_FLAGS_INIT "${IOS_COMMON_FLAGS}") - -SET(CMAKE_C_FLAGS_DEBUG_INIT "-fembed-bitcode-marker") -SET(CMAKE_CXX_FLAGS_DEBUG_INIT "-fembed-bitcode-marker") -SET(CMAKE_ASM_FLAGS_DEBUG_INIT "-fembed-bitcode-marker") - -SET(CMAKE_C_FLAGS_RELEASE_INIT "-fembed-bitcode") -SET(CMAKE_CXX_FLAGS_RELEASE_INIT "-fembed-bitcode") -SET(CMAKE_ASM_FLAGS_RELEASE_INIT "-fembed-bitcode") diff --git a/third_party/draco/src/draco/io/file_utils.h b/third_party/draco/src/draco/io/file_utils.h index 4b734e049f5..47aaa40ff3b 100644 --- a/third_party/draco/src/draco/io/file_utils.h +++ b/third_party/draco/src/draco/io/file_utils.h @@ -15,6 +15,7 @@ #ifndef DRACO_IO_FILE_UTILS_H_ #define DRACO_IO_FILE_UTILS_H_ +#include #include #include diff --git a/third_party/getopt/LICENSE b/third_party/getopt/LICENSE index 0d74ae4f3b2..220832e735e 100644 --- a/third_party/getopt/LICENSE +++ b/third_party/getopt/LICENSE @@ -1,26 +1,20 @@ -Copyright (c) 1987, 1993, 1994, 1995 - The Regents of the University of California. All rights reserved. +Copyright © 2005-2014 Rich Felker, et al. -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. Neither the names of the copyright holders nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -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 REGENTS 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 above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +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 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 +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/third_party/getopt/include/getopt/getopt.h b/third_party/getopt/include/getopt/getopt.h old mode 100755 new mode 100644 index f359ab006e9..c1d0df928f7 --- a/third_party/getopt/include/getopt/getopt.h +++ b/third_party/getopt/include/getopt/getopt.h @@ -1,62 +1,31 @@ -/* - * Copyright (c) 1987, 1993, 1994, 1995 - * The Regents of the University of California. All rights reserved. - * - * 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. Neither the names of the copyright holders 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 REGENTS 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 __GETOPT_H__ -#define __GETOPT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int opterr; /* if error message should be printed */ -extern int optind; /* index into parent argv vector */ -extern int optopt; /* character checked for validity */ -extern int optreset; /* reset getopt */ -extern char *optarg; /* argument associated with option */ - -struct option { - const char *name; - int has_arg; - int *flag; - int val; -}; - -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -int getopt(int, char **, const char *); - -int getopt_long(int, char **, const char *, const struct option *, int *); - -#ifdef __cplusplus -} -#endif - -#endif /* __GETOPT_H__ */ \ No newline at end of file +#ifndef _GETOPT_H +#define _GETOPT_H + +#ifdef __cplusplus +extern "C" { +#endif + +int getopt(int, char * const [], const char *); +extern char *optarg; +extern int optind, opterr, optopt, optreset; + +struct option +{ + const char *name; + int has_arg; + int *flag; + int val; +}; + +int getopt_long(int, char *const *, const char *, const struct option *, int *); +int getopt_long_only(int, char *const *, const char *, const struct option *, int *); + +#define no_argument 0 +#define required_argument 1 +#define optional_argument 2 + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/third_party/getopt/src/getopt.c b/third_party/getopt/src/getopt.c old mode 100755 new mode 100644 index 31d7f70aec8..cf2984af0fa --- a/third_party/getopt/src/getopt.c +++ b/third_party/getopt/src/getopt.c @@ -1,139 +1,82 @@ -/* - * Copyright (c) 1987, 1993, 1994, 1995 - * The Regents of the University of California. All rights reserved. - * - * 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. Neither the names of the copyright holders 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 REGENTS 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 -#include - -#ifndef __P -#define __P(x) x -#endif -#define _DIAGASSERT(x) assert(x) - -#ifdef __weak_alias -__weak_alias(getopt, _getopt); -#endif - -int opterr = 1, /* if error message should be printed */ - optind = 1, /* index into parent argv vector */ - optopt, /* character checked for validity */ - optreset; /* reset getopt */ -char *optarg; /* argument associated with option */ - -static char *_progname __P((char *)); - -int getopt_internal __P((int, char *const *, const char *)); - -static char *_progname(nargv0) - - char *nargv0; -{ - char *tmp; - - _DIAGASSERT(nargv0 != NULL); - - tmp = strrchr(nargv0, '/'); - if (tmp) - tmp++; - else - tmp = nargv0; - return (tmp); -} - -#define BADCH (int)'?' -#define BADARG (int)':' -#define EMSG "" - -/* - * getopt -- - * Parse argc/argv argument vector. - */ -int getopt(nargc, nargv, ostr) - - int nargc; -char *const nargv[]; -const char *ostr; -{ - static char *__progname = 0; - static char *place = EMSG; /* option letter processing */ - char *oli; /* option letter list index */ - __progname = __progname ? __progname : _progname(*nargv); - - _DIAGASSERT(nargv != NULL); - _DIAGASSERT(ostr != NULL); - - if (optreset || !*place) { /* update scanning pointer */ - optreset = 0; - if (optind >= nargc || *(place = nargv[optind]) != '-') { - place = EMSG; - return (-1); - } - if (place[1] && *++place == '-' /* found "--" */ - && place[1] == '\0') { - ++optind; - place = EMSG; - return (-1); - } - } /* option letter okay? */ - if ((optopt = (int)*place++) == (int)':' || !(oli = strchr(ostr, optopt))) { - /* - * if the user didn't specify '-' as an option, - * assume it means -1. - */ - if (optopt == (int)'-') - return (-1); - if (!*place) - ++optind; - if (opterr && *ostr != ':') - (void)fprintf(stderr, "%s: illegal option -- %c\n", __progname, optopt); - return (BADCH); - } - if (*++oli != ':') { /* don't need argument */ - optarg = NULL; - if (!*place) - ++optind; - } else { /* need an argument */ - if (*place) /* no white space */ - optarg = place; - else if (nargc <= ++optind) { /* no arg */ - place = EMSG; - if (*ostr == ':') - return (BADARG); - if (opterr) - (void)fprintf(stderr, "%s: option requires an argument -- %c\n", - __progname, optopt); - return (BADCH); - } else /* white space */ - optarg = nargv[optind]; - place = EMSG; - ++optind; - } - return (optopt); /* dump back option letter */ -} +#ifdef _WIN32 +#include +#else +#include +#endif +#include +#include +#include +#include +#include "libc.h" + +char *optarg; +int optind=1, opterr=1, optopt, __optpos, __optreset=0; + +#define optpos __optpos +#ifndef _WIN32 +weak_alias(__optreset, optreset); +#endif + +int getopt(int argc, char * const argv[], const char *optstring) +{ + int i; + wchar_t c, d; + int k, l; + char *optchar; + + if (!optind || __optreset) { + __optreset = 0; + __optpos = 0; + optind = 1; + } + + if (optind >= argc || !argv[optind] || argv[optind][0] != '-' || !argv[optind][1]) + return -1; + if (argv[optind][1] == '-' && !argv[optind][2]) + return optind++, -1; + + if (!optpos) optpos++; + if ((k = mbtowc(&c, argv[optind]+optpos, MB_LEN_MAX)) < 0) { + k = 1; + c = 0xfffd; /* replacement char */ + } + optchar = argv[optind]+optpos; + optopt = c; + optpos += k; + + if (!argv[optind][optpos]) { + optind++; + optpos = 0; + } + + for (i=0; (l = mbtowc(&d, optstring+i, MB_LEN_MAX)) && d!=c; i+=l>0?l:1); + + if (d != c) { + if (optstring[0] != ':' && opterr) { + write(2, argv[0], strlen(argv[0])); + write(2, ": illegal option: ", 18); + write(2, optchar, k); + write(2, "\n", 1); + } + return '?'; + } + if (optstring[i+1] == ':') { + if (optind >= argc) { + if (optstring[0] == ':') return ':'; + if (opterr) { + write(2, argv[0], strlen(argv[0])); + write(2, ": option requires an argument: ", 31); + write(2, optchar, k); + write(2, "\n", 1); + } + return '?'; + } + optarg = argv[optind++] + optpos; + optpos = 0; + } + return c; +} + +#ifndef _WIN32 +weak_alias(getopt, __posix_getopt); +#endif diff --git a/third_party/getopt/src/getopt_long.c b/third_party/getopt/src/getopt_long.c old mode 100755 new mode 100644 index 0f699ee4165..29cdd96bedf --- a/third_party/getopt/src/getopt_long.c +++ b/third_party/getopt/src/getopt_long.c @@ -1,231 +1,59 @@ -/* - * Copyright (c) 1987, 1993, 1994, 1996 - * The Regents of the University of California. All rights reserved. - * - * 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. Neither the names of the copyright holders 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 REGENTS 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 "getopt/getopt.h" - -#include -#include -#include -#include -#include - -extern int opterr; /* if error message should be printed */ -extern int optind; /* index into parent argv vector */ -extern int optopt; /* character checked for validity */ -extern int optreset; /* reset getopt */ -extern char *optarg; /* argument associated with option */ - -#ifndef __P -#define __P(x) x -#endif -#define _DIAGASSERT(x) assert(x) - -static char *__progname __P((char *)); - -int getopt_internal __P((int, char *const *, const char *)); - -static char *__progname(nargv0) - - char *nargv0; -{ - char *tmp; - - _DIAGASSERT(nargv0 != NULL); - - tmp = strrchr(nargv0, '/'); - if (tmp) - tmp++; - else - tmp = nargv0; - return (tmp); -} - -#define BADCH (int)'?' -#define BADARG (int)':' -#define EMSG "" - -/* - * getopt -- - * Parse argc/argv argument vector. - */ -int getopt_internal(nargc, nargv, ostr) - - int nargc; -char *const *nargv; -const char *ostr; -{ - static char *place = EMSG; /* option letter processing */ - char *oli; /* option letter list index */ - - _DIAGASSERT(nargv != NULL); - _DIAGASSERT(ostr != NULL); - - if (optreset || !*place) { /* update scanning pointer */ - optreset = 0; - if (optind >= nargc || *(place = nargv[optind]) != '-') { - place = EMSG; - return (-1); - } - if (place[1] && *++place == '-') { /* found "--" */ - /* ++optind; */ - place = EMSG; - return (-2); - } - } /* option letter okay? */ - if ((optopt = (int)*place++) == (int)':' || !(oli = strchr(ostr, optopt))) { - /* - * if the user didn't specify '-' as an option, - * assume it means -1. - */ - if (optopt == (int)'-') - return (-1); - if (!*place) - ++optind; - if (opterr && *ostr != ':') - (void)fprintf(stderr, "%s: illegal option -- %c\n", __progname(nargv[0]), - optopt); - return (BADCH); - } - if (*++oli != ':') { /* don't need argument */ - optarg = NULL; - if (!*place) - ++optind; - } else { /* need an argument */ - if (*place) /* no white space */ - optarg = place; - else if (nargc <= ++optind) { /* no arg */ - place = EMSG; - if ((opterr) && (*ostr != ':')) - (void)fprintf(stderr, "%s: option requires an argument -- %c\n", - __progname(nargv[0]), optopt); - return (BADARG); - } else /* white space */ - optarg = nargv[optind]; - place = EMSG; - ++optind; - } - return (optopt); /* dump back option letter */ -} - -#if 0 -/* - * getopt -- - * Parse argc/argv argument vector. - */ -int -getopt2(nargc, nargv, ostr) - int nargc; - char * const *nargv; - const char *ostr; -{ - int retval; - if ((retval = getopt_internal(nargc, nargv, ostr)) == -2) { - retval = -1; - ++optind; - } - return(retval); -} -#endif - -/* - * getopt_long -- - * Parse argc/argv argument vector. - */ -int getopt_long(nargc, nargv, options, long_options, index) int nargc; -char **nargv; -const char *options; -const struct option *long_options; -int *index; -{ - int retval; - - _DIAGASSERT(nargv != NULL); - _DIAGASSERT(options != NULL); - _DIAGASSERT(long_options != NULL); - /* index may be NULL */ - - if ((retval = getopt_internal(nargc, nargv, options)) == -2) { - char *current_argv = nargv[optind++] + 2, *has_equal; - int i, current_argv_len, match = -1; - - if (*current_argv == '\0') { - return (-1); - } - if ((has_equal = strchr(current_argv, '=')) != NULL) { - current_argv_len = has_equal - current_argv; - has_equal++; - } else - current_argv_len = strlen(current_argv); - - for (i = 0; long_options[i].name; i++) { - if (strncmp(current_argv, long_options[i].name, current_argv_len)) - continue; - - if (strlen(long_options[i].name) == (unsigned)current_argv_len) { - match = i; - break; - } - if (match == -1) - match = i; - } - if (match != -1) { - if (long_options[match].has_arg == required_argument || - long_options[match].has_arg == optional_argument) { - if (has_equal) - optarg = has_equal; - else - optarg = nargv[optind++]; - } - if ((long_options[match].has_arg == required_argument) && - (optarg == NULL)) { - /* - * Missing argument, leading : - * indicates no error should be generated - */ - if ((opterr) && (*options != ':')) - (void)fprintf(stderr, "%s: option requires an argument -- %s\n", - __progname(nargv[0]), current_argv); - return (BADARG); - } - } else { /* No matching argument */ - if ((opterr) && (*options != ':')) - (void)fprintf(stderr, "%s: illegal option -- %s\n", - __progname(nargv[0]), current_argv); - return (BADCH); - } - if (long_options[match].flag) { - *long_options[match].flag = long_options[match].val; - retval = 0; - } else - retval = long_options[match].val; - if (index) - *index = match; - } - return (retval); -} \ No newline at end of file +#define _GNU_SOURCE +#include +#include +#include + +extern int __optpos, __optreset; + +static int __getopt_long(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly) +{ + if (!optind || __optreset) { + __optreset = 0; + __optpos = 0; + optind = 1; + } + if (optind >= argc || !argv[optind] || argv[optind][0] != '-') return -1; + if ((longonly && argv[optind][1]) || + (argv[optind][1] == '-' && argv[optind][2])) + { + int i; + for (i=0; longopts[i].name; i++) { + const char *name = longopts[i].name; + char *opt = argv[optind]+1; + if (*opt == '-') opt++; + for (; *name && *name == *opt; name++, opt++); + if (*name || (*opt && *opt != '=')) continue; + if (*opt == '=') { + if (!longopts[i].has_arg) continue; + optarg = opt+1; + } else { + if (longopts[i].has_arg == required_argument) { + if (!(optarg = argv[++optind])) + return ':'; + } else optarg = NULL; + } + optind++; + if (idx) *idx = i; + if (longopts[i].flag) { + *longopts[i].flag = longopts[i].val; + return 0; + } + return longopts[i].val; + } + if (argv[optind][1] == '-') { + optind++; + return '?'; + } + } + return getopt(argc, argv, optstring); +} + +int getopt_long(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx) +{ + return __getopt_long(argc, argv, optstring, longopts, idx, 0); +} + +int getopt_long_only(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx) +{ + return __getopt_long(argc, argv, optstring, longopts, idx, 1); +} diff --git a/third_party/getopt/src/libc.h b/third_party/getopt/src/libc.h new file mode 100644 index 00000000000..af1a5307f97 --- /dev/null +++ b/third_party/getopt/src/libc.h @@ -0,0 +1,74 @@ +#ifndef LIBC_H +#define LIBC_H + +#include +#include +#include + +struct __libc { + int has_thread_pointer; + int can_do_threads; + int threaded; + int secure; + size_t *auxv; + volatile int threads_minus_1; + FILE *ofl_head; + int ofl_lock[2]; + size_t tls_size; + size_t page_size; +}; + +extern size_t __hwcap; + +#ifndef PAGE_SIZE +#define PAGE_SIZE libc.page_size +#endif + +#if !defined(__PIC__) || (100*__GNUC__+__GNUC_MINOR__ >= 303 && !defined(__PCC__)) + +#ifdef __PIC__ +#if __GNUC__ < 4 +#define BROKEN_VISIBILITY 1 +#endif +#define ATTR_LIBC_VISIBILITY __attribute__((visibility("hidden"))) +#else +#define ATTR_LIBC_VISIBILITY +#endif + +extern struct __libc __libc ATTR_LIBC_VISIBILITY; +#define libc __libc + +#else + +#define USE_LIBC_ACCESSOR +#define ATTR_LIBC_VISIBILITY +extern struct __libc *__libc_loc(void) __attribute__((const)); +#define libc (*__libc_loc()) + +#endif + + +/* Designed to avoid any overhead in non-threaded processes */ +void __lock(volatile int *) ATTR_LIBC_VISIBILITY; +void __unlock(volatile int *) ATTR_LIBC_VISIBILITY; +int __lockfile(FILE *) ATTR_LIBC_VISIBILITY; +void __unlockfile(FILE *) ATTR_LIBC_VISIBILITY; +#define LOCK(x) __lock(x) +#define UNLOCK(x) __unlock(x) + +void __synccall(void (*)(void *), void *); +int __setxid(int, int, int, int); + +extern char **__environ; + +#undef weak_alias +#define weak_alias(old, new) \ + extern __typeof(old) new __attribute__((weak)) + +#undef LFS64_2 +#define LFS64_2(x, y) weak_alias(x, y) + +#undef LFS64 +#define LFS64(x) LFS64_2(x, x##64) + +#endif diff --git a/third_party/getopt/tnt/README.md b/third_party/getopt/tnt/README.md new file mode 100644 index 00000000000..2a89178a7c6 --- /dev/null +++ b/third_party/getopt/tnt/README.md @@ -0,0 +1,4 @@ +Implementation from musl-1.1.0: +https://musl.libc.org/ +https://musl.libc.org/releases.html + diff --git a/third_party/glslang/.appveyor.yml b/third_party/glslang/.appveyor.yml deleted file mode 100644 index b08c47b9d3f..00000000000 --- a/third_party/glslang/.appveyor.yml +++ /dev/null @@ -1,108 +0,0 @@ -# Windows Build Configuration for AppVeyor -# http://www.appveyor.com/docs/appveyor-yml - -# build version format -version: "{build}" - -os: Visual Studio 2015 - -platform: - - x64 - -configuration: - - Debug - - Release - -branches: - only: - - master - -# changes to these files don't need to trigger testing -skip_commits: - files: - - README.md - - README-spirv-remap.txt - - LICENSE.txt - - CODE_OF_CONDUCT.md - - BUILD.* - - WORKSPACE - - kokoro/* - - make-revision - - Android.mk - - _config.yml - -# Travis advances the master-tot tag to current top of the tree after -# each push into the master branch, because it relies on that tag to -# upload build artifacts to the master-tot release. This will cause -# double testing for each push on Appveyor: one for the push, one for -# the tag advance. Disable testing tags. -skip_tags: true - -clone_depth: 5 - -matrix: - fast_finish: true # Show final status immediately if a test fails. - -# scripts that run after cloning repository -install: - - C:/Python27/python.exe update_glslang_sources.py - - set PATH=C:\ninja;C:\Python36;%PATH% - - git clone https://github.com/google/googletest.git External/googletest - -build: - parallel: true # enable MSBuild parallel builds - verbosity: minimal - -build_script: - - mkdir build && cd build - - cmake -G "Visual Studio 14 2015 Win64" -DCMAKE_INSTALL_PREFIX=install .. - - cmake --build . --config %CONFIGURATION% --target install - -test_script: - - ctest -C %CONFIGURATION% --output-on-failure - - cd ../Test && bash runtests - - cd ../build - -after_test: - # For debug build, the generated dll has a postfix "d" in its name. - - ps: >- - If ($env:configuration -Match "Debug") { - $env:SUFFIX="d" - } Else { - $env:SUFFIX="" - } - - cd install - # Zip all glslang artifacts for uploading and deploying - - 7z a glslang-master-windows-"%PLATFORM%"-"%CONFIGURATION%".zip - bin\glslangValidator.exe - bin\spirv-remap.exe - include\glslang\* - lib\GenericCodeGen%SUFFIX%.lib - lib\glslang%SUFFIX%.lib - lib\glslang-default-resource-limits%SUFFIX%.lib - lib\HLSL%SUFFIX%.lib - lib\MachineIndependent%SUFFIX%.lib - lib\OGLCompiler%SUFFIX%.lib - lib\OSDependent%SUFFIX%.lib - lib\SPIRV%SUFFIX%.lib - lib\SPVRemapper%SUFFIX%.lib - lib\SPIRV-Tools%SUFFIX%.lib - lib\SPIRV-Tools-opt%SUFFIX%.lib - -artifacts: - - path: build\install\*.zip - name: artifacts-zip - -deploy: - - provider: GitHub - auth_token: - secure: YglcSYdl0TylEa59H4K6lylBEDr586NAt2EMgZquSo+iuPrwgZQuJLPCoihSm9y6 - release: master-tot - description: "Continuous build of the latest master branch by Appveyor and Github" - artifact: artifacts-zip - draft: false - prerelease: false - force_update: true - on: - branch: master - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 diff --git a/third_party/glslang/.github/dependabot.yml b/third_party/glslang/.github/dependabot.yml new file mode 100644 index 00000000000..2190055972e --- /dev/null +++ b/third_party/glslang/.github/dependabot.yml @@ -0,0 +1,22 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +version: 2 +updates: + - package-ecosystem: "github-actions" # Necessary to update action hashes + directory: "/" + schedule: + interval: "weekly" + # Allow up to 3 opened pull requests for github-actions versions + open-pull-requests-limit: 3 diff --git a/third_party/glslang/.github/workflows/continuous_deployment.yml b/third_party/glslang/.github/workflows/continuous_deployment.yml index c375ac4505d..68cad7a3d3b 100644 --- a/third_party/glslang/.github/workflows/continuous_deployment.yml +++ b/third_party/glslang/.github/workflows/continuous_deployment.yml @@ -20,11 +20,26 @@ on: workflow_dispatch: push: branches: - - master + - main + paths-ignore: + - 'README.md' + - 'README-spirv-remap.txt' + - 'LICENSE.txt' + - 'CODE_OF_CONDUCT.md' + - 'BUILD.*' + - 'WORKSPACE' + - 'kokoro/*' + - 'make-revision' + - 'Android.mk' + - '_config.yml' + +permissions: read-all jobs: linux: runs-on: ${{matrix.os.genus}} + permissions: + contents: write strategy: fail-fast: false matrix: @@ -32,8 +47,9 @@ jobs: compiler: [{cc: clang, cxx: clang++}, {cc: gcc, cxx: g++}] cmake_build_type: [Debug, Release] steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 + - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: lukka/get-cmake@8be6cca406b575906541e8e3b885d46f416bba39 # v3.27.7 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 with: python-version: '3.7' - name: Install Ubuntu Package Dependencies @@ -71,10 +87,11 @@ jobs: - name: Zip if: ${{ matrix.compiler.cc == 'clang' }} env: - ARCHIVE: glslang-master-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip + ARCHIVE: glslang-main-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip run: | cd build/install zip ${ARCHIVE} \ + bin/glslang \ bin/glslangValidator \ include/glslang/* \ include/glslang/**/* \ @@ -92,8 +109,8 @@ jobs: - name: Deploy if: ${{ matrix.compiler.cc == 'clang' }} env: - ARCHIVE: glslang-master-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip - uses: actions/github-script@v5 + ARCHIVE: glslang-main-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip + uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1 with: script: | const script = require('.github/workflows/deploy.js') @@ -101,6 +118,8 @@ jobs: macos: runs-on: ${{matrix.os.genus}} + permissions: + contents: write strategy: fail-fast: false matrix: @@ -108,8 +127,9 @@ jobs: compiler: [{cc: clang, cxx: clang++}] cmake_build_type: [Debug, Release] steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 + - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: lukka/get-cmake@8be6cca406b575906541e8e3b885d46f416bba39 # v3.27.7 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 with: python-version: '3.7' - name: Install GoogleTest @@ -142,10 +162,11 @@ jobs: cd ../Test && ./runtests - name: Zip env: - ARCHIVE: glslang-master-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip + ARCHIVE: glslang-main-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip run: | cd build/install zip ${ARCHIVE} \ + bin/glslang \ bin/glslangValidator \ include/glslang/* \ include/glslang/**/* \ @@ -160,10 +181,102 @@ jobs: lib/libSPVRemapper.a \ lib/libSPIRV-Tools.a \ lib/libSPIRV-Tools-opt.a + - name: Deploy + env: + ARCHIVE: glslang-main-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip + uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1 + with: + script: | + const script = require('.github/workflows/deploy.js') + await script({github, context, core}) + + windows: + runs-on: ${{matrix.os.genus}} + permissions: + contents: write + strategy: + fail-fast: false + matrix: + os: [{genus: windows-2019, family: windows}] + cmake_build_type: [Debug, Release] + steps: + - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: lukka/get-cmake@8be6cca406b575906541e8e3b885d46f416bba39 # v3.27.7 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: '3.7' + - name: Install GoogleTest + run: | + # check out pre-breakage version of googletest; can be deleted when + # issue 3128 is fixed + # git clone --depth=1 https://github.com/google/googletest.git External/googletest + mkdir -p External/googletest + cd External/googletest + git init + git remote add origin https://github.com/google/googletest.git + git fetch --depth 1 origin 0c400f67fcf305869c5fb113dd296eca266c9725 + git reset --hard FETCH_HEAD + cd ../.. + - name: Update Glslang Sources + run: | + python update_glslang_sources.py + - name: Build + run: | + cmake -S. -Bbuild -G "Visual Studio 16 2019" -A x64 -DCMAKE_INSTALL_PREFIX="$PWD/build/install" + cmake --build build --config ${{matrix.cmake_build_type}} --target install + - name: Test + run: | + cd build + ctest -C ${{matrix.cmake_build_type}} --output-on-failure + cd ../Test && bash runtests + - name: Zip + if: ${{ matrix.cmake_build_type == 'Debug' }} + env: + ARCHIVE: glslang-master-${{matrix.os.family}}-Debug.zip + run: | + cd build/install + 7z a ${{env.ARCHIVE}} ` + bin/glslang.exe ` + bin/glslangValidator.exe ` + bin/spirv-remap.exe ` + include/glslang/* ` + lib/GenericCodeGend.lib ` + lib/glslangd.lib ` + lib/glslang-default-resource-limitsd.lib ` + lib/HLSLd.lib ` + lib/MachineIndependentd.lib ` + lib/OGLCompilerd.lib ` + lib/OSDependentd.lib ` + lib/SPIRVd.lib ` + lib/SPVRemapperd.lib ` + lib/SPIRV-Toolsd.lib ` + lib/SPIRV-Tools-optd.lib + - name: Zip + if: ${{ matrix.cmake_build_type == 'Release' }} + env: + ARCHIVE: glslang-master-${{matrix.os.family}}-Release.zip + run: | + cd build/install + 7z a ${{env.ARCHIVE}} ` + bin/glslang.exe ` + bin/glslangValidator.exe ` + bin/spirv-remap.exe ` + include/glslang/* ` + lib/GenericCodeGen.lib ` + lib/glslang.lib ` + lib/glslang-default-resource-limits.lib ` + lib/HLSL.lib ` + lib/MachineIndependent.lib ` + lib/OGLCompiler.lib ` + lib/OSDependent.lib ` + lib/SPIRV.lib ` + lib/SPVRemapper.lib ` + lib/SPIRV-Tools.lib ` + lib/SPIRV-Tools-opt.lib - name: Deploy env: ARCHIVE: glslang-master-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip - uses: actions/github-script@v5 + uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1 with: script: | const script = require('.github/workflows/deploy.js') diff --git a/third_party/glslang/.github/workflows/continuous_integration.yml b/third_party/glslang/.github/workflows/continuous_integration.yml index 7c36c688439..ca0b9a42b51 100644 --- a/third_party/glslang/.github/workflows/continuous_integration.yml +++ b/third_party/glslang/.github/workflows/continuous_integration.yml @@ -10,26 +10,28 @@ on: workflow_dispatch: pull_request: branches: - - master + - main + +permissions: read-all jobs: linux: - runs-on: ${{matrix.os}} + runs-on: ubuntu-22.04 strategy: fail-fast: false matrix: - os: [ubuntu-20.04] compiler: [{cc: clang, cxx: clang++}, {cc: gcc, cxx: g++}] cmake_build_type: [Debug, Release] steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 + - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: lukka/get-cmake@8be6cca406b575906541e8e3b885d46f416bba39 # v3.27.7 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 with: python-version: '3.7' - - name: Install Ubuntu Package Dependencies - run: | - sudo apt-get -qq update - sudo apt-get install -y clang-6.0 + - name: Setup ccache + uses: hendrikmuhs/ccache-action@6d1841ec156c39a52b1b23a810da917ab98da1f4 # v1.2.10 + with: + key: ubuntu-22-${{ matrix.cmake_build_type }}-${{ matrix.compiler.cc }}-${{matrix.compiler.cxx}} - name: Install GoogleTest run: | # check out pre-breakage version of googletest; can be deleted when @@ -43,35 +45,137 @@ jobs: git reset --hard FETCH_HEAD cd ../.. - name: Update Glslang Sources - run: | - ./update_glslang_sources.py - - name: Build + run: ./update_glslang_sources.py + - name: Configure + run: cmake -S . -B build -D CMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} env: - CC: ${{matrix.compiler.cc}} - CXX: ${{matrix.compiler.cxx}} + CC: ${{matrix.compiler.cc}} + CXX: ${{matrix.compiler.cxx}} + CMAKE_GENERATOR: Ninja + CMAKE_C_COMPILER_LAUNCHER: ccache + CMAKE_CXX_COMPILER_LAUNCHER: ccache + - name: Build + run: cmake --build build + - name: Install + run: cmake --install build --prefix build/install + - name: Test + run: | + cd build + ctest --output-on-failure && + cd ../Test && ./runtests + + linux-asan: + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + compiler: [{cc: gcc, cxx: g++}] + cmake_build_type: [Debug] + flags: ['-fsanitize=address', '-fsanitize=thread'] + steps: + - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: lukka/get-cmake@8be6cca406b575906541e8e3b885d46f416bba39 # v3.27.7 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: '3.7' + - name: Setup ccache + uses: hendrikmuhs/ccache-action@6d1841ec156c39a52b1b23a810da917ab98da1f4 # v1.2.10 + with: + key: ubuntu-22-${{ matrix.cmake_build_type }}-${{ matrix.compiler.cc }}-${{matrix.compiler.cxx}}-${{matrix.flags}} + - name: Install GoogleTest run: | - mkdir build && cd build - cmake -DCMAKE_BUILD_TYPE=${{matrix.cmake_build_type}} -DCMAKE_INSTALL_PREFIX=`pwd`/install .. - make -j4 install + # check out pre-breakage version of googletest; can be deleted when + # issue 3128 is fixed + # git clone --depth=1 https://github.com/google/googletest.git External/googletest + mkdir -p External/googletest + cd External/googletest + git init + git remote add origin https://github.com/google/googletest.git + git fetch --depth 1 origin 0c400f67fcf305869c5fb113dd296eca266c9725 + git reset --hard FETCH_HEAD + cd ../.. + - name: Update Glslang Sources + run: ./update_glslang_sources.py + - name: Configure + run: cmake -S . -B build -D CMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} + env: + CC: ${{matrix.compiler.cc}} + CXX: ${{matrix.compiler.cxx}} + CMAKE_GENERATOR: Ninja + CMAKE_C_COMPILER_LAUNCHER: ccache + CMAKE_CXX_COMPILER_LAUNCHER: ccache + CFLAGS: ${{matrix.flags}} + CXXFLAGS: ${{matrix.flags}} + LDFLAGS: ${{matrix.flags}} + - name: Build + run: cmake --build build + - name: Install + run: cmake --install build --prefix build/install - name: Test run: | cd build ctest --output-on-failure && cd ../Test && ./runtests + # Ensure we can compile/run on an older distro + linux_min: + name: Linux Backcompat + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: '3.7' + - uses: lukka/get-cmake@8be6cca406b575906541e8e3b885d46f416bba39 # v3.27.7 + with: + cmakeVersion: 3.17.2 + - name: Setup ccache + uses: hendrikmuhs/ccache-action@6d1841ec156c39a52b1b23a810da917ab98da1f4 # v1.2.10 + with: + key: linux_backcompat + - name: Install GoogleTest + run: | + # check out pre-breakage version of googletest; can be deleted when + # issue 3128 is fixed + # git clone --depth=1 https://github.com/google/googletest.git External/googletest + mkdir -p External/googletest + cd External/googletest + git init + git remote add origin https://github.com/google/googletest.git + git fetch --depth 1 origin 0c400f67fcf305869c5fb113dd296eca266c9725 + git reset --hard FETCH_HEAD + cd ../.. + - name: Update Glslang Sources + run: ./update_glslang_sources.py + - name: Configure + run: cmake -S . -B build -D CMAKE_BUILD_TYPE=Release + env: + CMAKE_C_COMPILER_LAUNCHER: ccache + CMAKE_CXX_COMPILER_LAUNCHER: ccache + - name: Build + run: cmake --build build + - name: Install + run: cmake --install build --prefix build/install + - name: Test + run: | + cd build + ctest --output-on-failure && + cd ../Test && ./runtests + macos: runs-on: ${{matrix.os}} strategy: fail-fast: false matrix: - os: [macos-11] - compiler: [{cc: clang, cxx: clang++}] + os: [macos-11, macos-12] + compiler: [{cc: clang, cxx: clang++}, {cc: gcc, cxx: g++}] cmake_build_type: [Debug, Release] steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 + - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 with: python-version: '3.7' + - uses: lukka/get-cmake@8be6cca406b575906541e8e3b885d46f416bba39 # v3.27.7 - name: Install GoogleTest run: | # check out pre-breakage version of googletest; can be deleted when @@ -85,49 +189,37 @@ jobs: git reset --hard FETCH_HEAD cd ../.. - name: Update Glslang Sources - run: | - ./update_glslang_sources.py - - name: Build + run: ./update_glslang_sources.py + - name: Configure + run: cmake -S . -B build -D CMAKE_BUILD_TYPE=${{matrix.cmake_build_type}} -G "Ninja" env: CC: ${{matrix.compiler.cc}} CXX: ${{matrix.compiler.cxx}} - run: | - mkdir build && cd build - cmake -DCMAKE_BUILD_TYPE=${{matrix.cmake_build_type}} -DCMAKE_INSTALL_PREFIX=`pwd`/install .. - make -j4 install + - name: Build + run: cmake --build build + - name: Install + run: cmake --install build --prefix build/install - name: Test run: | cd build ctest --output-on-failure && cd ../Test && ./runtests - android: - runs-on: ${{matrix.os}} + windows: + runs-on: ${{matrix.os.genus}} + permissions: + contents: write strategy: fail-fast: false matrix: - os: [ubuntu-20.04] - compiler: [{cc: clang, cxx: clang++}] - cmake_build_type: [Release] + os: [{genus: windows-2019, family: windows}] + cmake_build_type: [Debug, Release] steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 + - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: lukka/get-cmake@8be6cca406b575906541e8e3b885d46f416bba39 # v3.27.7 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 with: python-version: '3.7' - - name: Install Ubuntu Package Dependencies - if: ${{matrix.os == 'ubuntu-20.04'}} - run: | - sudo apt-get -qq update - sudo apt-get install -y clang-6.0 - - name: Install Android NDK - run: | - export ANDROID_NDK=$HOME/android-ndk - git init $ANDROID_NDK - pushd $ANDROID_NDK - git remote add dneto0 https://github.com/dneto0/android-ndk.git - git fetch --depth=1 dneto0 r17b-strip - git checkout FETCH_HEAD - popd - name: Install GoogleTest run: | # check out pre-breakage version of googletest; can be deleted when @@ -142,16 +234,74 @@ jobs: cd ../.. - name: Update Glslang Sources run: | - ./update_glslang_sources.py + python update_glslang_sources.py - name: Build - env: - CC: ${{matrix.compiler.cc}} - CXX: ${{matrix.compiler.cxx}} run: | - export ANDROID_NDK=$HOME/android-ndk - export TOOLCHAIN_PATH=$ANDROID_NDK/build/cmake/android.toolchain.cmake - echo $ANDROID_NDK - echo $TOOLCHAIN_PATH - mkdir build && cd build - cmake -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_PATH} -DANDROID_NATIVE_API_LEVEL=android-14 -DCMAKE_BUILD_TYPE=${{matrix.cmake_build_type}} -DANDROID_ABI="armeabi-v7a with NEON" -DBUILD_TESTING=OFF .. - make -j4 + cmake -S. -Bbuild -G "Visual Studio 16 2019" -A x64 -DCMAKE_INSTALL_PREFIX="$PWD/build/install" + cmake --build build --config ${{matrix.cmake_build_type}} --target install + - name: Test + run: | + cd build + ctest -C ${{matrix.cmake_build_type}} --output-on-failure + cd ../Test && bash runtests + + android: + runs-on: ubuntu-22.04 + strategy: + matrix: + # Android NDK currently offers 2 different toolchains. + # Test both to ensure we are compatible with either approach. + LEGACY: [ON, OFF] + # Oldest/newest NDK currently provided by GitHub runners + # https://github.com/actions/runner-images/blob/main/images/linux/Ubuntu2204-Readme.md#android + NDK: [23.2.8568313, 25.2.9519653] + steps: + - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: '3.7' + - uses: lukka/get-cmake@8be6cca406b575906541e8e3b885d46f416bba39 # v3.27.7 + - name: Setup ccache + uses: hendrikmuhs/ccache-action@6d1841ec156c39a52b1b23a810da917ab98da1f4 # v1.2.10 + with: + key: android-${{ matrix.LEGACY }}-${{ matrix.NDK }} + - name: Update Glslang Sources + run: ./update_glslang_sources.py + - name: Configure + run: | + cmake -S . -B build/ \ + --toolchain $ANDROID_HOME/ndk/${{ matrix.NDK }}/build/cmake/android.toolchain.cmake \ + -D CMAKE_BUILD_TYPE=Release \ + -D ANDROID_ABI=armeabi-v7a \ + -D ANDROID_USE_LEGACY_TOOLCHAIN_FILE=${{ matrix.LEGACY }} \ + -D BUILD_TESTING=OFF + env: + CMAKE_GENERATOR: Ninja + CMAKE_C_COMPILER_LAUNCHER: ccache + CMAKE_CXX_COMPILER_LAUNCHER: ccache + - name: Build + run: cmake --build build/ + + emscripten: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + with: + python-version: '3.7' + - uses: lukka/get-cmake@8be6cca406b575906541e8e3b885d46f416bba39 # v3.27.7 + - name: Setup ccache + uses: hendrikmuhs/ccache-action@6d1841ec156c39a52b1b23a810da917ab98da1f4 # v1.2.10 + with: + key: ubuntu-emscripten + - uses: mymindstorm/setup-emsdk@ab889da2abbcbb280f91ec4c215d3bb4f3a8f775 # v12 + - name: Update Glslang Sources + run: ./update_glslang_sources.py + - name: Configure + run: emcmake cmake -GNinja -Bbuild/web -DCMAKE_BUILD_TYPE=Release -DENABLE_GLSLANG_JS=ON -DBUILD_TESTING=OFF -DENABLE_OPT=OFF + env: + CMAKE_GENERATOR: Ninja + CMAKE_C_COMPILER_LAUNCHER: ccache + CMAKE_CXX_COMPILER_LAUNCHER: ccache + - name: Build + run: cmake --build build/web diff --git a/third_party/glslang/.github/workflows/deploy.js b/third_party/glslang/.github/workflows/deploy.js index 9f8d24249c5..3f1b7e4b4e3 100644 --- a/third_party/glslang/.github/workflows/deploy.js +++ b/third_party/glslang/.github/workflows/deploy.js @@ -3,11 +3,11 @@ module.exports = async ({github, context, core}) => { await github.rest.git.updateRef({ owner: context.repo.owner, repo: context.repo.repo, - ref: 'tags/master-tot', + ref: 'tags/main-tot', sha: context.sha }) } catch (error) { - core.setFailed(`upload master-tot tag; ${error.name}; ${error.message}`) + core.setFailed(`upload main-tot tag; ${error.name}; ${error.message}`) } let release @@ -15,10 +15,10 @@ module.exports = async ({github, context, core}) => { release = await github.rest.repos.getReleaseByTag({ owner: context.repo.owner, repo: context.repo.repo, - tag: 'master-tot' + tag: 'main-tot' }) } catch (error) { - core.setFailed(`get the master release; ${error.name}; ${error.message}`) + core.setFailed(`get the main release; ${error.name}; ${error.message}`) } try { @@ -28,7 +28,7 @@ module.exports = async ({github, context, core}) => { release_id: release.data.id }) } catch (error) { - core.setFailed(`update the master release; ${error.name}; ${error.message}`) + core.setFailed(`update the main release; ${error.name}; ${error.message}`) } let release_assets diff --git a/third_party/glslang/.github/workflows/scorecard.yml b/third_party/glslang/.github/workflows/scorecard.yml new file mode 100644 index 00000000000..fe3833a5ba8 --- /dev/null +++ b/third_party/glslang/.github/workflows/scorecard.yml @@ -0,0 +1,53 @@ +name: Scorecard supply-chain security +on: + # For Branch-Protection check. Only the default branch is supported. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection + branch_protection_rule: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + schedule: + - cron: '36 17 * * 5' + push: + branches: [ "main" ] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecard analysis + runs-on: ubuntu-latest + permissions: + security-events: write # to upload the results to code-scanning dashboard + id-token: write # to publish results and get a badge + + steps: + - name: "Checkout code" + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@483ef80eb98fb506c348f7d62e28055e49fe2398 # v2.3.0 + with: + results_file: results.sarif + results_format: sarif + # To enable Branch-Protection uncomment the `repo_token` line below + # To create the Fine-grained PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-fine-grained-pat-optional. + # repo_token: ${{ secrets.SCORECARD_TOKEN }} + publish_results: true # allows the repo to include the Scorecard badge + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard. + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@2cb752a87e96af96708ab57187ab6372ee1973ab # v2.22.0 + with: + sarif_file: results.sarif diff --git a/third_party/glslang/.gitignore b/third_party/glslang/.gitignore index 333fb762727..732b345973c 100644 --- a/third_party/glslang/.gitignore +++ b/third_party/glslang/.gitignore @@ -11,6 +11,7 @@ Test/localResults/ External/googletest External/spirv-tools out/ +CMakeUserPresets.json # GN generated files .cipd/ diff --git a/third_party/glslang/.mailmap b/third_party/glslang/.mailmap new file mode 100644 index 00000000000..946b24095f5 --- /dev/null +++ b/third_party/glslang/.mailmap @@ -0,0 +1,3 @@ +Faith Ekstrand +Faith Ekstrand +Faith Ekstrand diff --git a/third_party/glslang/Android.mk b/third_party/glslang/Android.mk index 40cddb75848..6787a972a7b 100644 --- a/third_party/glslang/Android.mk +++ b/third_party/glslang/Android.mk @@ -1,4 +1,4 @@ -# Copyright (C) 2020 The Khronos Group Inc. +# Copyright (C) 2020-2023 The Khronos Group Inc. # # All rights reserved. # @@ -53,11 +53,11 @@ $(eval $(call gen_glslang_build_info_h)) GLSLANG_OS_FLAGS := -DGLSLANG_OSINCLUDE_UNIX # AMD and NV extensions are turned on by default in upstream Glslang. -GLSLANG_DEFINES:= -DAMD_EXTENSIONS -DNV_EXTENSIONS -DENABLE_HLSL $(GLSLANG_OS_FLAGS) +GLSLANG_DEFINES:= -DENABLE_HLSL $(GLSLANG_OS_FLAGS) include $(CLEAR_VARS) LOCAL_MODULE:=OSDependent -LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti $(GLSLANG_DEFINES) +LOCAL_CXXFLAGS:=-std=c++17 -fno-exceptions -fno-rtti $(GLSLANG_DEFINES) LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH) LOCAL_SRC_FILES:=glslang/OSDependent/Unix/ossource.cpp LOCAL_C_INCLUDES:=$(LOCAL_PATH) $(LOCAL_PATH)/glslang/OSDependent/Unix/ @@ -66,7 +66,7 @@ include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE:=OGLCompiler -LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti $(GLSLANG_DEFINES) +LOCAL_CXXFLAGS:=-std=c++17 -fno-exceptions -fno-rtti $(GLSLANG_DEFINES) LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH) LOCAL_SRC_FILES:=OGLCompilersDLL/InitializeDll.cpp LOCAL_C_INCLUDES:=$(LOCAL_PATH)/OGLCompiler @@ -78,7 +78,7 @@ include $(BUILD_STATIC_LIBRARY) # instead. include $(CLEAR_VARS) LOCAL_MODULE:=HLSL -LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti $(GLSLANG_DEFINES) +LOCAL_CXXFLAGS:=-std=c++17 -fno-exceptions -fno-rtti $(GLSLANG_DEFINES) LOCAL_SRC_FILES:= \ hlsl/stub.cpp LOCAL_C_INCLUDES:=$(LOCAL_PATH) \ @@ -93,7 +93,7 @@ $(LOCAL_PATH)/glslang/MachineIndependent/ShaderLang.cpp: \ $(GLSLANG_BUILD_INFO_H) LOCAL_MODULE:=glslang -LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti $(GLSLANG_DEFINES) +LOCAL_CXXFLAGS:=-std=c++17 -fno-exceptions -fno-rtti $(GLSLANG_DEFINES) LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH) LOCAL_SRC_FILES:= \ glslang/CInterface/glslang_c_interface.cpp \ @@ -148,7 +148,7 @@ $(LOCAL_PATH)/SPIRV/GlslangToSpv.cpp: \ $(GLSLANG_BUILD_INFO_H) LOCAL_MODULE:=SPIRV -LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti -Werror $(GLSLANG_DEFINES) +LOCAL_CXXFLAGS:=-std=c++17 -fno-exceptions -fno-rtti -Werror $(GLSLANG_DEFINES) LOCAL_SRC_FILES:= \ SPIRV/CInterface/spirv_c_interface.cpp \ SPIRV/GlslangToSpv.cpp \ diff --git a/third_party/glslang/BUILD.bazel b/third_party/glslang/BUILD.bazel deleted file mode 100644 index 12168fae1bb..00000000000 --- a/third_party/glslang/BUILD.bazel +++ /dev/null @@ -1,311 +0,0 @@ -# Copyright (C) 2020 The Khronos Group 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 The Khronos Group 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 HOLDERS 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. - -package( - default_visibility = ["//visibility:public"], -) - -# Description: -# -# Khronos reference front-end for GLSL and ESSL, and sample SPIR-V generator. - -licenses(["notice"]) - -exports_files(["LICENSE"]) - -# Build information generation script -py_binary( - name = "build_info", - srcs = ["build_info.py"], -) - -py_binary( - name = "gen_extension_headers", - srcs = ["gen_extension_headers.py"], -) - -genrule( - name = "gen_build_info_h", - srcs = ["CHANGES.md", "build_info.h.tmpl"], - outs = ["glslang/build_info.h"], - cmd_bash = "$(location build_info) $$(dirname $(location CHANGES.md)) -i $(location build_info.h.tmpl) -o $(location glslang/build_info.h)", - cmd_bat = "for %F in ($(location CHANGES.md)) do $(location build_info) %~dpF -i $(location build_info.h.tmpl) -o $(location glslang/build_info.h)", - tools = [":build_info"], -) - -genrule( - name = "gen_extension_headers_h", - srcs = ["glslang/ExtensionHeaders", "gen_extension_headers.py"], - outs = ["glslang/glsl_intrinsic_header.h"], - cmd_bash = "$(location gen_extension_headers) -i $(location glslang/ExtensionHeaders) -o $(location glslang/glsl_intrinsic_header.h)", - tools = [":gen_extension_headers"], -) - -COMMON_COPTS = select({ - "@bazel_tools//src/conditions:windows": [""], - "//conditions:default": [ - "-Wall", - "-Wuninitialized", - "-Wunused", - "-Wunused-local-typedefs", - "-Wunused-parameter", - "-Wunused-value", - "-Wunused-variable", - "-Wno-reorder", - "-std=c++11", - "-fvisibility=hidden", - "-fvisibility-inlines-hidden", - "-fno-exceptions", - "-fno-rtti", - ], -}) - -cc_library( - name = "glslang", - srcs = glob( - [ - "glslang/GenericCodeGen/*.cpp", - "glslang/HLSL/*.cpp", - "glslang/MachineIndependent/*.cpp", - "glslang/MachineIndependent/preprocessor/*.cpp", - ], - exclude = [ - "glslang/HLSL/pch.h", - "glslang/MachineIndependent/pch.h", - ], - ) + [ - "OGLCompilersDLL/InitializeDll.cpp", - ] + select({ - "@bazel_tools//src/conditions:windows": - ["glslang/OSDependent/Windows/ossource.cpp"], - "//conditions:default": - ["glslang/OSDependent/Unix/ossource.cpp"], - }), - hdrs = glob([ - "glslang/HLSL/*.h", - "glslang/Include/*.h", - "glslang/MachineIndependent/*.h", - "glslang/MachineIndependent/preprocessor/*.h", - ]) + [ - "OGLCompilersDLL/InitializeDll.h", - "StandAlone/DirStackFileIncluder.h", - "glslang/OSDependent/osinclude.h", - "glslang/Public/ShaderLang.h", - ":gen_build_info_h", - ], - copts = COMMON_COPTS, - defines = [ - "AMD_EXTENSIONS", - "ENABLE_HLSL=0", - "ENABLE_OPT=0", - "NV_EXTENSIONS", - ], - linkopts = select({ - "@bazel_tools//src/conditions:windows": [""], - "//conditions:default": ["-lm", "-lpthread"], - }), - linkstatic = 1, -) - -genrule( - name = "export_spirv_headers", - srcs = [ - "SPIRV/GLSL.ext.AMD.h", - "SPIRV/GLSL.ext.EXT.h", - "SPIRV/GLSL.ext.KHR.h", - "SPIRV/GLSL.ext.NV.h", - "SPIRV/GLSL.std.450.h", - "SPIRV/NonSemanticDebugPrintf.h", - "SPIRV/NonSemanticShaderDebugInfo100.h", - "SPIRV/spirv.hpp", - ], - outs = [ - "include/SPIRV/GLSL.ext.AMD.h", - "include/SPIRV/GLSL.ext.EXT.h", - "include/SPIRV/GLSL.ext.KHR.h", - "include/SPIRV/GLSL.ext.NV.h", - "include/SPIRV/GLSL.std.450.h", - "include/SPIRV/NonSemanticDebugPrintf.h", - "include/SPIRV/NonSemanticShaderDebugInfo100.h", - "include/SPIRV/spirv.hpp", - ], - cmd_bash = "mkdir -p $(@D)/include/SPIRV && cp $(SRCS) $(@D)/include/SPIRV/", - cmd_bat = "(if not exist $(@D)\\include\\SPIRV mkdir $(@D)\\include\\SPIRV) && (for %S in ($(SRCS)) do @xcopy /q %S $(@D)\\include\\SPIRV\\ >NUL)", -) - -cc_library( - name = "SPIRV_headers", - hdrs = [":export_spirv_headers"], - copts = COMMON_COPTS, - includes = [ - "include", - "include/SPIRV", - ], - linkstatic = 1, -) - -cc_library( - name = "SPIRV", - srcs = glob( - ["SPIRV/*.cpp"], - exclude = [ - "SPIRV/SpvTools.cpp", - ], - ), - hdrs = [ - "SPIRV/GlslangToSpv.h", - "SPIRV/Logger.h", - "SPIRV/SPVRemapper.h", - "SPIRV/SpvBuilder.h", - "SPIRV/SpvTools.h", - "SPIRV/bitutils.h", - "SPIRV/disassemble.h", - "SPIRV/doc.h", - "SPIRV/hex_float.h", - "SPIRV/spvIR.h", - ], - copts = COMMON_COPTS, - includes = ["SPIRV"], - linkopts = select({ - "@bazel_tools//src/conditions:windows": [""], - "//conditions:default": ["-lm"], - }), - linkstatic = 1, - deps = [ - ":SPIRV_headers", - ":glslang", - ], -) - -cc_library( - name = "glslang-default-resource-limits", - srcs = ["StandAlone/ResourceLimits.cpp"], - hdrs = ["StandAlone/ResourceLimits.h"], - copts = COMMON_COPTS, - linkstatic = 1, - deps = [":glslang"], -) - -cc_binary( - name = "glslangValidator", - srcs = [ - "StandAlone/StandAlone.cpp", - "StandAlone/Worklist.h", - ":glslang/glsl_intrinsic_header.h" - ], - copts = COMMON_COPTS, - deps = [ - ":SPIRV", - ":glslang", - ":glslang-default-resource-limits", - ], -) - -cc_binary( - name = "spirv-remap", - srcs = ["StandAlone/spirv-remap.cpp"], - copts = COMMON_COPTS, - deps = [ - ":SPIRV", - ":glslang", - ":glslang-default-resource-limits", - ], -) - -filegroup( - name = "test_files", - srcs = glob( - ["Test/**"], - exclude = [ - "Test/bump", - "Test/glslangValidator", - "Test/runtests", - ], - ), -) - -cc_library( - name = "glslang_test_lib", - testonly = 1, - srcs = [ - "gtests/HexFloat.cpp", - "gtests/Initializer.h", - "gtests/Settings.cpp", - "gtests/Settings.h", - "gtests/TestFixture.cpp", - "gtests/TestFixture.h", - "gtests/main.cpp", - ], - copts = COMMON_COPTS, - data = [":test_files"], - defines = select({ - # Unfortunately we can't use $(location) in cc_library at the moment. - # See https://github.com/bazelbuild/bazel/issues/1023 - # So we'll specify the path manually. - "@bazel_tools//src/conditions:windows": - ["GLSLANG_TEST_DIRECTORY='\"../../../../../Test\"'"], - "//conditions:default": - ["GLSLANG_TEST_DIRECTORY='\"Test\"'"], - }), - linkstatic = 1, - deps = [ - ":SPIRV", - ":glslang", - ":glslang-default-resource-limits", - "@com_google_googletest//:gtest", - ], -) - -GLSLANG_TESTS = glob( - ["gtests/*.FromFile.cpp"], - # Since we are not building the SPIRV-Tools dependency, the following tests - # cannot be performed. - exclude = [ - "gtests/Hlsl.FromFile.cpp", - "gtests/Spv.FromFile.cpp", - ], -) - -[cc_test( - name = test_file.replace("gtests/", "").replace(".FromFile.cpp", "") + "_test", - srcs = [test_file], - copts = COMMON_COPTS, - data = [ - ":test_files", - ], - deps = [ - ":SPIRV", - ":glslang", - ":glslang_test_lib", - ], -) for test_file in GLSLANG_TESTS] diff --git a/third_party/glslang/BUILD.gn b/third_party/glslang/BUILD.gn index 29328d4076a..0bb0d42ec8e 100644 --- a/third_party/glslang/BUILD.gn +++ b/third_party/glslang/BUILD.gn @@ -96,9 +96,6 @@ action("glslang_extension_headers") { } spirv_tools_dir = glslang_spirv_tools_dir -if (!defined(glslang_angle)) { - glslang_angle = false -} config("glslang_public") { include_dirs = [ "." ] @@ -126,6 +123,8 @@ template("glslang_sources_common") { "SPIRV/GLSL.ext.EXT.h", "SPIRV/GLSL.ext.KHR.h", "SPIRV/GLSL.ext.NV.h", + "SPIRV/GLSL.ext.ARM.h", + "SPIRV/GLSL.ext.QCOM.h", "SPIRV/GLSL.std.450.h", "SPIRV/GlslangToSpv.cpp", "SPIRV/GlslangToSpv.h", @@ -242,9 +241,6 @@ template("glslang_sources_common") { sources += [ "SPIRV/SpvTools.cpp" ] defines += [ "ENABLE_OPT=1" ] } - if (invoker.is_angle) { - defines += [ "GLSLANG_ANGLE" ] - } if (is_win) { sources += [ "glslang/OSDependent/Windows/ossource.cpp" ] @@ -293,21 +289,19 @@ template("glslang_sources_common") { } glslang_sources_common("glslang_lib_sources") { - enable_opt = !glslang_angle - enable_hlsl = !glslang_angle - is_angle = glslang_angle + enable_opt = true + enable_hlsl = true } glslang_sources_common("glslang_sources") { enable_opt = true enable_hlsl = true - is_angle = false } source_set("glslang_default_resource_limits_sources") { sources = [ - "StandAlone/ResourceLimits.cpp", - "StandAlone/ResourceLimits.h", + "glslang/ResourceLimits/ResourceLimits.cpp", + "glslang/Public/ResourceLimits.h", "glslang/Include/ResourceLimits.h", ] public_configs = [ ":glslang_public" ] diff --git a/third_party/glslang/CHANGES.md b/third_party/glslang/CHANGES.md index 292147c3c9a..74c454202bb 100644 --- a/third_party/glslang/CHANGES.md +++ b/third_party/glslang/CHANGES.md @@ -3,6 +3,93 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). +## 13.0.0 2023-08-23 + +### Breaking changes +* Simplify PoolAlloc via thread_local + * Remove InitializeDLL functions + * Remove OSDependent TLS functions +* Remove GLSLANG_WEB and GLSLANG_WEB_DEVEL code paths + +### Other changes +* Raise CMAKE minimum to 3.17.2 +* Support GL_KHR_cooperative_matrix +* Support GL_QCOM_image_processing_support +* Support outputting each module to a filename with spirv-remap +* Generate an error when gl_PrimitiveShaderRateEXT is used without enabling the extension +* Improve layout checking when GL_EXT_spirv_intrinsics is enabled + +## 12.3.1 2023-07-20 + +### Other changes +* Improve backward compatibility for glslangValidator rename on Windows + +## 12.3.0 2023-07-19 + +### Other changes +* Rename glslangValidator to glslang and create glslangValidator symlink +* Support HLSL binary literals +* Add missing initialization members for web +* Improve push_constant upgrading +* Fix race condition in spirv remap +* Support pre and post HLSL qualifier validation +* Force generateDebugInfo when non-semantic debug info is enabled +* Exit with error if output file cannot be written +* Fix struct member buffer reference decorations + +## 12.2.0 2023-05-17 + +### Other changes +* Support GLSL_EXT_shader_tile_image +* Support GL_EXT_ray_tracing_position_fetch +* Support custom include callbacks via the C API +* Add preamble-text command-line option +* Accept variables as parameters of spirv_decorate_id +* Fix generation of conditionals with a struct result +* Fix double expansion of macros +* Fix DebugCompilationUnit scope +* Improve line information + +## 12.1.0 2023-03-21 + +### Other changes +* Reject non-float inputs/outputs for version less than 120 +* Fix invalid BufferBlock decoration for SPIR-V 1.3 and above +* Add HLSL relaxed-precision float/int matrix expansions +* Block decorate Vulkan structs with RuntimeArrays +* Support InterlockedAdd on float types + +## 12.0.0 2023-01-18 + +### Breaking changes +* An ABI was accidentally broken in #3014. Consequently, we have incremented the major revision number. + +### Other changes +* Add support for ARB_bindless_texture. +* Add support for GL_NV_shader_invocation_reorder. +* Fix const parameter debug types when using NonSemantic.Shader.DebugInfo.100. +* Fix NonSemantic.Shader.DebugInfo.100 disassembly. +* Fix MaxDualSourceDrawBuffersEXT usage. +* Fix structure member reference crash. + +## 11.13.0 2022-12-06 + +### Other changes +* Make HelperInvocation accesses volatile for SPIR-V 1.6. +* Improve forward compatibility of ResourceLimits interface +* Remove GLSLANG_ANGLE + +## 11.12.0 2022-10-12 + +### Other changes +* Update generator version +* Add support for GL_EXT_mesh_shader +* Add support for NonSemantic.Shader.DebugInfo.100 +* Make OpEmitMeshTasksEXT a terminal instruction +* Make gl_SubGroupARB a flat in int in Vulkan +* Add support for GL_EXT_opacity_micromap +* Add preamble support to C interface + ## 11.11.0 2022-08-11 ### Other changes diff --git a/third_party/glslang/CMakeLists.txt b/third_party/glslang/CMakeLists.txt index b7fe3d77528..a734ad1f872 100644 --- a/third_party/glslang/CMakeLists.txt +++ b/third_party/glslang/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2020 The Khronos Group Inc. +# Copyright (C) 2020-2023 The Khronos Group Inc. # # All rights reserved. # @@ -30,24 +30,11 @@ # 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. - -# increase to 3.1 once all major distributions -# include a version of CMake >= 3.1 -cmake_minimum_required(VERSION 3.14.0) -if (POLICY CMP0048) - cmake_policy(SET CMP0048 NEW) -endif() -if(POLICY CMP0054) - cmake_policy(SET CMP0054 NEW) -endif() - -project(glslang LANGUAGES CXX) +cmake_minimum_required(VERSION 3.17.2) +project(glslang) set_property(GLOBAL PROPERTY USE_FOLDERS ON) -# Enable compile commands database -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - # Adhere to GNU filesystem layout conventions include(GNUInstallDirs) include(CMakePackageConfigHelpers) @@ -78,18 +65,10 @@ if(NOT ${SKIP_GLSLANG_INSTALL}) endif() option(ENABLE_SPVREMAPPER "Enables building of SPVRemapper" ON) -option(ENABLE_GLSLANG_BINARIES "Builds glslangValidator and spirv-remap" ON) +option(ENABLE_GLSLANG_BINARIES "Builds glslang and spirv-remap" ON) option(ENABLE_GLSLANG_JS "If using Emscripten, build glslang.js. Otherwise, builds a sample executable for binary-size testing." OFF) -CMAKE_DEPENDENT_OPTION(ENABLE_GLSLANG_WEBMIN - "Reduces glslang to minimum needed for web use" - OFF "ENABLE_GLSLANG_JS" - OFF) -CMAKE_DEPENDENT_OPTION(ENABLE_GLSLANG_WEBMIN_DEVEL - "For ENABLE_GLSLANG_WEBMIN builds, enables compilation error messages" - OFF "ENABLE_GLSLANG_WEBMIN" - OFF) CMAKE_DEPENDENT_OPTION(ENABLE_EMSCRIPTEN_SINGLE_FILE "If using Emscripten, enables SINGLE_FILE build" OFF "ENABLE_GLSLANG_JS AND EMSCRIPTEN" @@ -99,11 +78,7 @@ CMAKE_DEPENDENT_OPTION(ENABLE_EMSCRIPTEN_ENVIRONMENT_NODE OFF "ENABLE_GLSLANG_JS AND EMSCRIPTEN" OFF) -CMAKE_DEPENDENT_OPTION(ENABLE_HLSL - "Enables HLSL input support" - ON "NOT ENABLE_GLSLANG_WEBMIN" - OFF) - +option(ENABLE_HLSL "Enables HLSL input support" ON) option(ENABLE_RTTI "Enables RTTI" OFF) option(ENABLE_EXCEPTIONS "Enables Exceptions" OFF) option(ENABLE_OPT "Enables spirv-opt capability if present" ON) @@ -117,18 +92,6 @@ else() endif() option(ENABLE_CTEST "Enables testing" ON) -if(ENABLE_GLSLANG_INSTALL AND CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND WIN32) - set(CMAKE_INSTALL_PREFIX "install" CACHE STRING "..." FORCE) -endif() - -option(USE_CCACHE "Use ccache" OFF) -if(USE_CCACHE) - find_program(CCACHE_FOUND ccache) - if(CCACHE_FOUND) - set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) - endif() -endif() - if(ENABLE_CTEST) include(CTest) endif() @@ -137,13 +100,6 @@ if(ENABLE_HLSL) add_definitions(-DENABLE_HLSL) endif() -if(ENABLE_GLSLANG_WEBMIN) - add_definitions(-DGLSLANG_WEB) - if(ENABLE_GLSLANG_WEBMIN_DEVEL) - add_definitions(-DGLSLANG_WEB_DEVEL) - endif() -endif() - if(WIN32) set(CMAKE_DEBUG_POSTFIX "d") option(OVERRIDE_MSVCCRT "Overrides runtime of MSVC " ON) @@ -151,7 +107,7 @@ if(WIN32) include(ChooseMSVCCRT.cmake) endif() add_definitions(-DGLSLANG_OSINCLUDE_WIN32) -elseif(UNIX) +elseif(UNIX OR ANDROID) add_definitions(-DGLSLANG_OSINCLUDE_UNIX) else() message("unknown platform") @@ -160,7 +116,6 @@ endif() if(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU") add_compile_options(-Wall -Wmaybe-uninitialized -Wuninitialized -Wunused -Wunused-local-typedefs -Wunused-parameter -Wunused-value -Wunused-variable -Wunused-but-set-parameter -Wunused-but-set-variable -fno-exceptions) - add_compile_options(-Wno-reorder) # disable this from -Wall, since it happens all over. if(NOT ENABLE_RTTI) add_compile_options(-fno-rtti) endif() @@ -171,16 +126,13 @@ if(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU") add_compile_options(-Werror=deprecated-copy) endif() - if(NOT CMAKE_VERSION VERSION_LESS "3.13" AND NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin") + if(NOT CMAKE_SYSTEM_NAME STREQUAL "OpenBSD" AND NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin") # Error if there's symbols that are not found at link time. - # add_link_options() was added in CMake 3.13 - if using an earlier - # version don't set this - it should be caught by presubmits anyway. add_link_options("-Wl,--no-undefined") endif() elseif(${CMAKE_CXX_COMPILER_ID} MATCHES "Clang" AND NOT MSVC) add_compile_options(-Wall -Wuninitialized -Wunused -Wunused-local-typedefs -Wunused-parameter -Wunused-value -Wunused-variable) - add_compile_options(-Wno-reorder) # disable this from -Wall, since it happens all over. if(NOT ENABLE_RTTI) add_compile_options(-fno-rtti) endif() @@ -188,14 +140,12 @@ elseif(${CMAKE_CXX_COMPILER_ID} MATCHES "Clang" AND NOT MSVC) add_compile_options(-fno-exceptions) endif() - if(NOT CMAKE_VERSION VERSION_LESS "3.13") - # Error if there's symbols that are not found at link time. - # add_link_options() was added in CMake 3.13 - if using an earlier - # version don't set this - it should be caught by presubmits anyway. - if (WIN32) - add_link_options("-Wl,--no-undefined") - else() + if(NOT (CMAKE_SYSTEM_NAME STREQUAL "OpenBSD" OR CMAKE_SYSTEM_NAME STREQUAL "Emscripten")) + # Error if there's symbols that are not found at link time. Some linkers do not support this flag. + if (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") add_link_options("-Wl,-undefined,error") + elseif(NOT APPLE) + add_link_options("-Wl,--no-undefined") endif() endif() elseif(MSVC) @@ -227,21 +177,16 @@ if(ENABLE_GLSLANG_JS) endif() endif() -# Request C++11 -if(${CMAKE_VERSION} VERSION_LESS 3.1) - # CMake versions before 3.1 do not understand CMAKE_CXX_STANDARD - # remove this block once CMake >=3.1 has fixated in the ecosystem - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") -else() - set(CMAKE_CXX_STANDARD 11) - set(CMAKE_CXX_STANDARD_REQUIRED ON) - set(CMAKE_CXX_EXTENSIONS OFF) -endif() +# Request C++17 +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) function(glslang_set_link_args TARGET) # For MinGW compiles, statically link against the GCC and C++ runtimes. # This avoids the need to ship those runtimes as DLLs. - if(WIN32 AND ${CMAKE_CXX_COMPILER_ID} MATCHES "GNU") + # This is supported by GCC and Clang. + if(WIN32 AND NOT MSVC) set_target_properties(${TARGET} PROPERTIES LINK_FLAGS "-static -static-libgcc -static-libstdc++") endif() @@ -289,10 +234,9 @@ endfunction() function(glslang_only_export_explicit_symbols target) if(BUILD_SHARED_LIBS) target_compile_definitions(${target} PUBLIC "GLSLANG_IS_SHARED_LIBRARY=1") + set_target_properties(${target} PROPERTIES CMAKE_CXX_VISIBILITY_PRESET hidden) if(WIN32) target_compile_definitions(${target} PRIVATE "GLSLANG_EXPORTING=1") - else() - target_compile_options(${target} PRIVATE "-fvisibility=hidden") endif() endif() endfunction() @@ -313,14 +257,30 @@ else() endif() if(BUILD_EXTERNAL AND IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/External) - find_host_package(PythonInterp 3 REQUIRED) + find_host_package(Python3 REQUIRED) # We depend on these for later projects, so they should come first. add_subdirectory(External) endif() +option(ALLOW_EXTERNAL_SPIRV_TOOLS "Allows to build against installed SPIRV-Tools-opt" OFF) if(NOT TARGET SPIRV-Tools-opt) - set(ENABLE_OPT OFF) + if(ALLOW_EXTERNAL_SPIRV_TOOLS) + # Look for external SPIR-V Tools build, if not building in-tree + message(STATUS "Trying to find local SPIR-V tools") + find_package(SPIRV-Tools-opt) + if(NOT TARGET SPIRV-Tools-opt) + if(ENABLE_OPT) + message(WARNING "ENABLE_OPT set but SPIR-V tools not found! Disabling SPIR-V optimization.") + endif() + set(ENABLE_OPT OFF) + endif() + else() + if(ENABLE_OPT) + message(SEND_ERROR "ENABLE_OPT set but SPIR-V tools not found. Please run update_glslang_sources.py, " + "set the ALLOW_EXTERNAL_SPIRV_TOOLS option to use a local install of SPIRV-Tools, or set ENABLE_OPT=0.") + endif() + endif() endif() if(ENABLE_OPT) @@ -355,12 +315,12 @@ if(ENABLE_CTEST AND BUILD_TESTING) endif() if (CMAKE_CONFIGURATION_TYPES) - set(RESULTS_PATH ${CMAKE_CURRENT_BINARY_DIR}/$/localResults) - set(VALIDATOR_PATH ${CMAKE_CURRENT_BINARY_DIR}/StandAlone/$/glslangValidator) - set(REMAP_PATH ${CMAKE_CURRENT_BINARY_DIR}/StandAlone/$/spirv-remap) + set(RESULTS_PATH ${CMAKE_CURRENT_BINARY_DIR}/$/localResults) + set(VALIDATOR_PATH ${CMAKE_CURRENT_BINARY_DIR}/StandAlone/$/glslang) + set(REMAP_PATH ${CMAKE_CURRENT_BINARY_DIR}/StandAlone/$/spirv-remap) else() set(RESULTS_PATH ${CMAKE_CURRENT_BINARY_DIR}/localResults) - set(VALIDATOR_PATH ${CMAKE_CURRENT_BINARY_DIR}/StandAlone/glslangValidator) + set(VALIDATOR_PATH ${CMAKE_CURRENT_BINARY_DIR}/StandAlone/glslang) set(REMAP_PATH ${CMAKE_CURRENT_BINARY_DIR}/StandAlone/spirv-remap) endif() @@ -372,34 +332,42 @@ endif() if(ENABLE_GLSLANG_INSTALL) file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/glslang-config.cmake.in" [=[ @PACKAGE_INIT@ + @INSTALL_CONFIG_UNIX@ include("@PACKAGE_PATH_EXPORT_TARGETS@") ]=]) - - set(PATH_EXPORT_TARGETS "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/glslang-targets.cmake") + + set(PATH_EXPORT_TARGETS "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}/glslang-targets.cmake") + if(UNIX OR "${CMAKE_SYSTEM_NAME}" STREQUAL "Fuchsia") + set(INSTALL_CONFIG_UNIX [=[ + include(CMakeFindDependencyMacro) + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_dependency(Threads REQUIRED) + ]=]) + endif() configure_package_config_file( "${CMAKE_CURRENT_BINARY_DIR}/glslang-config.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/glslang-config.cmake" PATH_VARS PATH_EXPORT_TARGETS - INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME} + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} ) - + write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/glslang-config-version.cmake" VERSION ${GLSLANG_VERSION} COMPATIBILITY SameMajorVersion ) - + install( EXPORT glslang-targets NAMESPACE "glslang::" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" ) - + install( FILES "${CMAKE_CURRENT_BINARY_DIR}/glslang-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/glslang-config-version.cmake" DESTINATION - "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}" + "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" ) -endif() \ No newline at end of file +endif() diff --git a/third_party/glslang/OGLCompilersDLL/CMakeLists.txt b/third_party/glslang/OGLCompilersDLL/CMakeLists.txt index 841b3e2c6bb..71a5675d152 100644 --- a/third_party/glslang/OGLCompilersDLL/CMakeLists.txt +++ b/third_party/glslang/OGLCompilersDLL/CMakeLists.txt @@ -41,7 +41,7 @@ if(WIN32) source_group("Source" FILES ${SOURCES}) endif(WIN32) -if(ENABLE_GLSLANG_INSTALL) +if(ENABLE_GLSLANG_INSTALL AND NOT BUILD_SHARED_LIBS) install(TARGETS OGLCompiler EXPORT glslang-targets) # Backward compatibility @@ -49,11 +49,11 @@ if(ENABLE_GLSLANG_INSTALL) message(WARNING \"Using `OGLCompilerTargets.cmake` is deprecated: use `find_package(glslang)` to find glslang CMake targets.\") if (NOT TARGET glslang::OGLCompiler) - include(\"\${CMAKE_CURRENT_LIST_DIR}/../../${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/glslang-targets.cmake\") + include(\"${CMAKE_INSTALL_FULL_LIBDIR}/cmake/${PROJECT_NAME}/glslang-targets.cmake\") endif() add_library(OGLCompiler ALIAS glslang::OGLCompiler) ") install(FILES "${CMAKE_CURRENT_BINARY_DIR}/OGLCompilerTargets.cmake" DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake) -endif(ENABLE_GLSLANG_INSTALL) +endif() diff --git a/third_party/glslang/OGLCompilersDLL/InitializeDll.cpp b/third_party/glslang/OGLCompilersDLL/InitializeDll.cpp index abea9108b15..ab3762e011f 100644 --- a/third_party/glslang/OGLCompilersDLL/InitializeDll.cpp +++ b/third_party/glslang/OGLCompilersDLL/InitializeDll.cpp @@ -32,134 +32,6 @@ // POSSIBILITY OF SUCH DAMAGE. // -#define SH_EXPORTING - -#include - -#include "InitializeDll.h" -#include "../glslang/Include/InitializeGlobals.h" -#include "../glslang/Public/ShaderLang.h" -#include "../glslang/Include/PoolAlloc.h" - namespace glslang { -OS_TLSIndex ThreadInitializeIndex = OS_INVALID_TLS_INDEX; - -// Per-process initialization. -// Needs to be called at least once before parsing, etc. is done. -// Will also do thread initialization for the calling thread; other -// threads will need to do that explicitly. -bool InitProcess() -{ - glslang::GetGlobalLock(); - - if (ThreadInitializeIndex != OS_INVALID_TLS_INDEX) { - // - // Function is re-entrant. - // - - glslang::ReleaseGlobalLock(); - return true; - } - - ThreadInitializeIndex = OS_AllocTLSIndex(); - - if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX) { - assert(0 && "InitProcess(): Failed to allocate TLS area for init flag"); - - glslang::ReleaseGlobalLock(); - return false; - } - - if (! InitializePoolIndex()) { - assert(0 && "InitProcess(): Failed to initialize global pool"); - - glslang::ReleaseGlobalLock(); - return false; - } - - if (! InitThread()) { - assert(0 && "InitProcess(): Failed to initialize thread"); - - glslang::ReleaseGlobalLock(); - return false; - } - - glslang::ReleaseGlobalLock(); - return true; -} - -// Per-thread scoped initialization. -// Must be called at least once by each new thread sharing the -// symbol tables, etc., needed to parse. -bool InitThread() -{ - // - // This function is re-entrant - // - if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX) { - assert(0 && "InitThread(): Process hasn't been initalised."); - return false; - } - - if (OS_GetTLSValue(ThreadInitializeIndex) != 0) - return true; - - if (! OS_SetTLSValue(ThreadInitializeIndex, (void *)1)) { - assert(0 && "InitThread(): Unable to set init flag."); - return false; - } - - glslang::SetThreadPoolAllocator(nullptr); - - return true; -} - -// Not necessary to call this: InitThread() is reentrant, and the need -// to do per thread tear down has been removed. -// -// This is kept, with memory management removed, to satisfy any exiting -// calls to it that rely on it. -bool DetachThread() -{ - bool success = true; - - if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX) - return true; - - // - // Function is re-entrant and this thread may not have been initialized. - // - if (OS_GetTLSValue(ThreadInitializeIndex) != 0) { - if (!OS_SetTLSValue(ThreadInitializeIndex, (void *)0)) { - assert(0 && "DetachThread(): Unable to clear init flag."); - success = false; - } - } - - return success; -} - -// Not necessary to call this: InitProcess() is reentrant. -// -// This is kept, with memory management removed, to satisfy any exiting -// calls to it that rely on it. -// -// Users of glslang should call shFinalize() or glslang::FinalizeProcess() for -// process-scoped memory tear down. -bool DetachProcess() -{ - bool success = true; - - if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX) - return true; - - success = DetachThread(); - - OS_FreeTLSIndex(ThreadInitializeIndex); - ThreadInitializeIndex = OS_INVALID_TLS_INDEX; - - return success; -} - } // end namespace glslang diff --git a/third_party/glslang/OGLCompilersDLL/InitializeDll.h b/third_party/glslang/OGLCompilersDLL/InitializeDll.h index 661cee4d240..b18e2ab3c5b 100644 --- a/third_party/glslang/OGLCompilersDLL/InitializeDll.h +++ b/third_party/glslang/OGLCompilersDLL/InitializeDll.h @@ -38,10 +38,10 @@ namespace glslang { -bool InitProcess(); -bool InitThread(); -bool DetachThread(); // not called from standalone, perhaps other tools rely on parts of it -bool DetachProcess(); // not called from standalone, perhaps other tools rely on parts of it +inline bool InitProcess() { return true; } // DEPRECATED +inline bool InitThread() { return true; } // DEPRECATED +inline bool DetachThread() { return true; } // DEPRECATED +inline bool DetachProcess() { return true; } // DEPRECATED } // end namespace glslang diff --git a/third_party/glslang/README-spirv-remap.txt b/third_party/glslang/README-spirv-remap.txt index 3e5288aac54..f3efee83683 100644 --- a/third_party/glslang/README-spirv-remap.txt +++ b/third_party/glslang/README-spirv-remap.txt @@ -112,7 +112,7 @@ BUILD DEPENDENCIES: BUILDING -------------------------------------------------------------------------------- -The standalone remapper is built along side glslangValidator through its +The standalone remapper is built along side glslang through its normal build process. diff --git a/third_party/glslang/README.md b/third_party/glslang/README.md index 5e642e69087..ea1e867b460 100755 --- a/third_party/glslang/README.md +++ b/third_party/glslang/README.md @@ -1,26 +1,19 @@ # News -1. Visual Studio 2013 is no longer supported +1. [As discussed in #3107](https://github.com/KhronosGroup/glslang/issues/3107), the default branch of this repository is now 'main'. This change should be transparent to repository users, since github rewrites many references to the old 'master' branch to 'main'. However, if you have a checked-out local clone, you may wish to take the following steps as recommended by github: - [As scheduled](https://github.com/KhronosGroup/glslang/blob/9eef54b2513ca6b40b47b07d24f453848b65c0df/README.md#planned-deprecationsremovals), -Microsoft Visual Studio 2013 is no longer officially supported. \ - Please upgrade to at least Visual Studio 2015. - -2. The versioning scheme is being improved, and you might notice some differences. This is currently WIP, but will be coming soon. See, for example, PR #2277. - -3. If you get a new **compilation error due to a missing header**, it might be caused by this planned removal: - -**SPIRV Folder, 1-May, 2020.** Glslang, when installed through CMake, -will install a `SPIRV` folder into `${CMAKE_INSTALL_INCLUDEDIR}`. -This `SPIRV` folder is being moved to `glslang/SPIRV`. -During the transition the `SPIRV` folder will be installed into both locations. -The old install of `SPIRV/` will be removed as a CMake install target no sooner than May 1, 2020. -See issue #1964. +```sh +git branch -m master main +git fetch origin +git branch -u origin/main main +git remote set-head origin -a +``` -If people are only using this location to get spirv.hpp, I recommend they get that from [SPIRV-Headers](https://github.com/KhronosGroup/SPIRV-Headers) instead. +2. C++17 (all platforms) and Visual Studio 2019 (Windows) are now required. This change was driven by the external dependency on SPIRV-Tools. -[![appveyor status](https://ci.appveyor.com/api/projects/status/q6fi9cb0qnhkla68/branch/master?svg=true)](https://ci.appveyor.com/project/Khronoswebmaster/glslang/branch/master) +![Continuous Integration](https://github.com/KhronosGroup/glslang/actions/workflows/continuous_integration.yml/badge.svg) ![Continuous Deployment](https://github.com/KhronosGroup/glslang/actions/workflows/continuous_deployment.yml/badge.svg) +[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/KhronosGroup/glslang/badge)](https://securityscorecards.dev/viewer/?uri=github.com/KhronosGroup/glslang) # Glslang Components and Status @@ -55,7 +48,7 @@ An API for getting reflection information from the AST, reflection types/variabl ### Standalone Wrapper -`glslangValidator` is command-line tool for accessing the functionality above. +`glslang` is command-line tool for accessing the functionality above. Status: Complete. @@ -73,7 +66,7 @@ The above page, while not kept up to date, includes additional information regar ## Execution of Standalone Wrapper -To use the standalone binary form, execute `glslangValidator`, and it will print +To use the standalone binary form, execute `glslang`, and it will print a usage statement. Basic operation is to give it a file containing a shader, and it will print out warnings/errors and optionally an AST. @@ -99,15 +92,15 @@ There is also a non-shader extension: ## Building (CMake) Instead of building manually, you can also download the binaries for your -platform directly from the [master-tot release][master-tot-release] on GitHub. +platform directly from the [main-tot release][main-tot-release] on GitHub. Those binaries are automatically uploaded by the buildbots after successful -testing and they always reflect the current top of the tree of the master +testing and they always reflect the current top of the tree of the main branch. ### Dependencies -* A C++11 compiler. - (For MSVS: use 2015 or later.) +* A C++17 compiler. + (For MSVS: use 2019 or later.) * [CMake][cmake]: for generating compilation targets. * make: _Linux_, ninja is an alternative, if configured. * [Python 3.x][python]: for executing SPIRV-Tools scripts. (Optional if not using SPIRV-Tools and the 'External' subdirectory does not exist.) @@ -242,16 +235,13 @@ changes are quite infrequent. For windows you can get binaries from The command to rebuild is: ```bash -m4 -P MachineIndependent/glslang.m4 > MachineIndependent/glslang.y bison --defines=MachineIndependent/glslang_tab.cpp.h -t MachineIndependent/glslang.y -o MachineIndependent/glslang_tab.cpp ``` -The above commands are also available in the bash script in `updateGrammar`, +The above command is also available in the bash script in `updateGrammar`, when executed from the glslang subdirectory of the glslang repository. -With no arguments it builds the full grammar, and with a "web" argument, -the web grammar subset (see more about the web subset in the next section). ### Building to WASM for the Web and Node ### Building a standalone JS/WASM library for the Web and Node @@ -261,15 +251,9 @@ Use the steps in [Build Steps](#build-steps), with the following notes/exception Bash-like environments: + [Instructions located here](https://emscripten.org/docs/getting_started/downloads.html#sdk-download-and-install) * Wrap cmake call: `emcmake cmake` -* Set `-DBUILD_TESTING=OFF -DENABLE_OPT=OFF -DINSTALL_GTEST=OFF`. +* Set `-DBUILD_TESTING=OFF -DENABLE_OPT=OFF`. * Set `-DENABLE_HLSL=OFF` if HLSL is not needed. * For a standalone JS/WASM library, turn on `-DENABLE_GLSLANG_JS=ON`. -* For building a minimum-size web subset of core glslang: - + turn on `-DENABLE_GLSLANG_WEBMIN=ON` (disables HLSL) - + execute `updateGrammar web` from the glslang subdirectory - (or if using your own scripts, `m4` needs a `-DGLSLANG_WEB` argument) - + optionally, for GLSL compilation error messages, turn on - `-DENABLE_GLSLANG_WEBMIN_DEVEL=ON` * To get a fully minimized build, make sure to use `brotli` to compress the .js and .wasm files @@ -277,7 +261,7 @@ Example: ```sh emcmake cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_GLSLANG_JS=ON \ - -DENABLE_HLSL=OFF -DBUILD_TESTING=OFF -DENABLE_OPT=OFF -DINSTALL_GTEST=OFF .. + -DENABLE_HLSL=OFF -DBUILD_TESTING=OFF -DENABLE_OPT=OFF .. ``` ## Building glslang - Using vcpkg @@ -433,9 +417,18 @@ warning/error and other options for controlling compilation. This interface is located `glslang_c_interface.h` and exposes functionality similar to the C++ interface. The following snippet is a complete example showing how to compile GLSL into SPIR-V 1.5 for Vulkan 1.2. -```cxx -std::vector compileShaderToSPIRV_Vulkan(glslang_stage_t stage, const char* shaderSource, const char* fileName) -{ +```c +#include + +// Required for use of glslang_default_resource +#include + +typedef struct SpirVBinary { + uint32_t *words; // SPIR-V words + int size; // number of words in SPIR-V binary +} SpirVBinary; + +SpirVBinary compileShaderToSPIRV_Vulkan(glslang_stage_t stage, const char* shaderSource, const char* fileName) { const glslang_input_t input = { .language = GLSLANG_SOURCE_GLSL, .stage = stage, @@ -449,18 +442,22 @@ std::vector compileShaderToSPIRV_Vulkan(glslang_stage_t stage, const c .force_default_version_and_profile = false, .forward_compatible = false, .messages = GLSLANG_MSG_DEFAULT_BIT, - .resource = reinterpret_cast(&glslang::DefaultTBuiltInResource), + .resource = glslang_default_resource(), }; glslang_shader_t* shader = glslang_shader_create(&input); + SpirVBinary bin = { + .words = NULL, + .size = 0, + }; if (!glslang_shader_preprocess(shader, &input)) { printf("GLSL preprocessing failed %s\n", fileName); printf("%s\n", glslang_shader_get_info_log(shader)); printf("%s\n", glslang_shader_get_info_debug_log(shader)); printf("%s\n", input.code); glslang_shader_delete(shader); - return std::vector(); + return bin; } if (!glslang_shader_parse(shader, &input)) { @@ -469,7 +466,7 @@ std::vector compileShaderToSPIRV_Vulkan(glslang_stage_t stage, const c printf("%s\n", glslang_shader_get_info_debug_log(shader)); printf("%s\n", glslang_shader_get_preprocessed_code(shader)); glslang_shader_delete(shader); - return std::vector(); + return bin; } glslang_program_t* program = glslang_program_create(); @@ -481,13 +478,14 @@ std::vector compileShaderToSPIRV_Vulkan(glslang_stage_t stage, const c printf("%s\n", glslang_program_get_info_debug_log(program)); glslang_program_delete(program); glslang_shader_delete(shader); - return std::vector(); + return bin; } glslang_program_SPIRV_generate(program, stage); - std::vector outShaderModule(glslang_program_SPIRV_get_size(program)); - glslang_program_SPIRV_get(program, outShaderModule.data()); + bin.size = glslang_program_SPIRV_get_size(program); + bin.words = malloc(bin.size * sizeof(uint32_t)); + glslang_program_SPIRV_get(program, bin.words); const char* spirv_messages = glslang_program_SPIRV_get_messages(program); if (spirv_messages) @@ -496,7 +494,7 @@ std::vector compileShaderToSPIRV_Vulkan(glslang_stage_t stage, const c glslang_program_delete(program); glslang_shader_delete(shader); - return outShaderModule; + return bin; } ``` @@ -555,4 +553,4 @@ std::vector compileShaderToSPIRV_Vulkan(glslang_stage_t stage, const c [bison]: https://www.gnu.org/software/bison/ [googletest]: https://github.com/google/googletest [bison-gnu-win32]: http://gnuwin32.sourceforge.net/packages/bison.htm -[master-tot-release]: https://github.com/KhronosGroup/glslang/releases/tag/master-tot +[main-tot-release]: https://github.com/KhronosGroup/glslang/releases/tag/main-tot diff --git a/third_party/glslang/SECURITY.md b/third_party/glslang/SECURITY.md new file mode 100644 index 00000000000..ffa39bf7a20 --- /dev/null +++ b/third_party/glslang/SECURITY.md @@ -0,0 +1,6 @@ +# Security Policy + +To report a security issue, please disclose it at [security advisory](https://github.com/KhronosGroup/glslang/security/advisories/new). + +This project is maintained by a team of volunteers on a reasonable-effort basis. As +such, please give us at least 90 days to work on a fix before public exposure. diff --git a/third_party/glslang/SPIRV/CMakeLists.txt b/third_party/glslang/SPIRV/CMakeLists.txt index 2408e4cce10..a80e74ed03e 100644 --- a/third_party/glslang/SPIRV/CMakeLists.txt +++ b/third_party/glslang/SPIRV/CMakeLists.txt @@ -62,6 +62,7 @@ set(HEADERS disassemble.h GLSL.ext.AMD.h GLSL.ext.NV.h + GLSL.ext.ARM.h NonSemanticDebugPrintf.h NonSemanticShaderDebugInfo100.h) @@ -70,8 +71,11 @@ set(SPVREMAP_HEADERS doc.h) add_library(SPIRV ${LIB_TYPE} ${SOURCES} ${HEADERS}) -set_property(TARGET SPIRV PROPERTY FOLDER glslang) -set_property(TARGET SPIRV PROPERTY POSITION_INDEPENDENT_CODE ON) +set_target_properties(SPIRV PROPERTIES + FOLDER glslang + POSITION_INDEPENDENT_CODE ON + VERSION "${GLSLANG_VERSION}" + SOVERSION "${GLSLANG_VERSION_MAJOR}") target_include_directories(SPIRV PUBLIC $ $) @@ -80,8 +84,11 @@ glslang_add_build_info_dependency(SPIRV) if (ENABLE_SPVREMAPPER) add_library(SPVRemapper ${LIB_TYPE} ${SPVREMAP_SOURCES} ${SPVREMAP_HEADERS}) - set_property(TARGET SPVRemapper PROPERTY FOLDER glslang) - set_property(TARGET SPVRemapper PROPERTY POSITION_INDEPENDENT_CODE ON) + set_target_properties(SPVRemapper PROPERTIES + FOLDER glslang + POSITION_INDEPENDENT_CODE ON + VERSION "${GLSLANG_VERSION}" + SOVERSION "${GLSLANG_VERSION_MAJOR}") endif() if(WIN32 AND BUILD_SHARED_LIBS) @@ -122,7 +129,7 @@ if(ENABLE_GLSLANG_INSTALL) message(WARNING \"Using `SPVRemapperTargets.cmake` is deprecated: use `find_package(glslang)` to find glslang CMake targets.\") if (NOT TARGET glslang::SPVRemapper) - include(\"\${CMAKE_CURRENT_LIST_DIR}/../../${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/glslang-targets.cmake\") + include(\"${CMAKE_INSTALL_FULL_LIBDIR}/cmake/${PROJECT_NAME}/glslang-targets.cmake\") endif() add_library(SPVRemapper ALIAS glslang::SPVRemapper) @@ -134,7 +141,7 @@ if(ENABLE_GLSLANG_INSTALL) message(WARNING \"Using `SPIRVTargets.cmake` is deprecated: use `find_package(glslang)` to find glslang CMake targets.\") if (NOT TARGET glslang::SPIRV) - include(\"\${CMAKE_CURRENT_LIST_DIR}/../../${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/glslang-targets.cmake\") + include(\"${CMAKE_INSTALL_FULL_LIBDIR}/cmake/${PROJECT_NAME}/glslang-targets.cmake\") endif() add_library(SPIRV ALIAS glslang::SPIRV) diff --git a/third_party/glslang/SPIRV/GLSL.ext.ARM.h b/third_party/glslang/SPIRV/GLSL.ext.ARM.h new file mode 100644 index 00000000000..14425be1e3e --- /dev/null +++ b/third_party/glslang/SPIRV/GLSL.ext.ARM.h @@ -0,0 +1,35 @@ +/* +** Copyright (c) 2022 ARM Limited +** +** 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. +** +** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS +** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND +** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +** +** 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 GLSLextARM_H +#define GLSLextARM_H + +static const int GLSLextARMVersion = 100; +static const int GLSLextARMRevision = 1; + +static const char * const E_SPV_ARM_core_builtins = "SPV_ARM_core_builtins"; + +#endif // #ifndef GLSLextARM_H diff --git a/third_party/glslang/SPIRV/GLSL.ext.EXT.h b/third_party/glslang/SPIRV/GLSL.ext.EXT.h index a247b4cd131..caab2793823 100644 --- a/third_party/glslang/SPIRV/GLSL.ext.EXT.h +++ b/third_party/glslang/SPIRV/GLSL.ext.EXT.h @@ -39,6 +39,7 @@ static const char* const E_SPV_EXT_shader_atomic_float_add = "SPV_EXT_shader_ato static const char* const E_SPV_EXT_shader_atomic_float16_add = "SPV_EXT_shader_atomic_float16_add"; static const char* const E_SPV_EXT_shader_atomic_float_min_max = "SPV_EXT_shader_atomic_float_min_max"; static const char* const E_SPV_EXT_shader_image_int64 = "SPV_EXT_shader_image_int64"; +static const char* const E_SPV_EXT_shader_tile_image = "SPV_EXT_shader_tile_image"; static const char* const E_SPV_EXT_mesh_shader = "SPV_EXT_mesh_shader"; #endif // #ifndef GLSLextEXT_H diff --git a/third_party/glslang/SPIRV/GLSL.ext.KHR.h b/third_party/glslang/SPIRV/GLSL.ext.KHR.h index d5c670f0e12..121defa16a2 100644 --- a/third_party/glslang/SPIRV/GLSL.ext.KHR.h +++ b/third_party/glslang/SPIRV/GLSL.ext.KHR.h @@ -54,5 +54,7 @@ static const char* const E_SPV_KHR_workgroup_memory_explicit_layout = "SPV_KHR_w static const char* const E_SPV_KHR_subgroup_uniform_control_flow = "SPV_KHR_subgroup_uniform_control_flow"; static const char* const E_SPV_KHR_fragment_shader_barycentric = "SPV_KHR_fragment_shader_barycentric"; static const char* const E_SPV_AMD_shader_early_and_late_fragment_tests = "SPV_AMD_shader_early_and_late_fragment_tests"; +static const char* const E_SPV_KHR_ray_tracing_position_fetch = "SPV_KHR_ray_tracing_position_fetch"; +static const char* const E_SPV_KHR_cooperative_matrix = "SPV_KHR_cooperative_matrix"; #endif // #ifndef GLSLextKHR_H diff --git a/third_party/glslang/SPIRV/GLSL.ext.NV.h b/third_party/glslang/SPIRV/GLSL.ext.NV.h index 93c98bf6269..9889bc9f9b1 100644 --- a/third_party/glslang/SPIRV/GLSL.ext.NV.h +++ b/third_party/glslang/SPIRV/GLSL.ext.NV.h @@ -81,4 +81,10 @@ const char* const E_SPV_NV_cooperative_matrix = "SPV_NV_cooperative_matrix"; //SPV_NV_shader_sm_builtins const char* const E_SPV_NV_shader_sm_builtins = "SPV_NV_shader_sm_builtins"; +//SPV_NV_shader_execution_reorder +const char* const E_SPV_NV_shader_invocation_reorder = "SPV_NV_shader_invocation_reorder"; + +//SPV_NV_displacement_micromap +const char* const E_SPV_NV_displacement_micromap = "SPV_NV_displacement_micromap"; + #endif // #ifndef GLSLextNV_H diff --git a/third_party/glslang/SPIRV/GLSL.ext.QCOM.h b/third_party/glslang/SPIRV/GLSL.ext.QCOM.h new file mode 100644 index 00000000000..f13bb69359d --- /dev/null +++ b/third_party/glslang/SPIRV/GLSL.ext.QCOM.h @@ -0,0 +1,41 @@ +/* +** Copyright (c) 2021 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. +** +** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS +** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND +** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +** +** 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 GLSLextQCOM_H +#define GLSLextQCOM_H + +enum BuiltIn; +enum Decoration; +enum Op; +enum Capability; + +static const int GLSLextQCOMVersion = 100; +static const int GLSLextQCOMRevision = 1; + +//SPV_QCOM_image_processing +const char* const E_SPV_QCOM_image_processing = "SPV_QCOM_image_processing"; + +#endif // #ifndef GLSLextQCOM_H diff --git a/third_party/glslang/SPIRV/GLSL.std.450.h b/third_party/glslang/SPIRV/GLSL.std.450.h index df31092bec0..86d3da80654 100644 --- a/third_party/glslang/SPIRV/GLSL.std.450.h +++ b/third_party/glslang/SPIRV/GLSL.std.450.h @@ -13,7 +13,7 @@ ** ** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS ** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND -** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ ** ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, diff --git a/third_party/glslang/SPIRV/GlslangToSpv.cpp b/third_party/glslang/SPIRV/GlslangToSpv.cpp index 9af024f89b4..6eae76d6899 100644 --- a/third_party/glslang/SPIRV/GlslangToSpv.cpp +++ b/third_party/glslang/SPIRV/GlslangToSpv.cpp @@ -49,6 +49,8 @@ namespace spv { #include "GLSL.ext.EXT.h" #include "GLSL.ext.AMD.h" #include "GLSL.ext.NV.h" + #include "GLSL.ext.ARM.h" + #include "GLSL.ext.QCOM.h" #include "NonSemanticDebugPrintf.h" } @@ -94,26 +96,18 @@ struct OpDecorations { public: OpDecorations(spv::Decoration precision, spv::Decoration noContraction, spv::Decoration nonUniform) : precision(precision) -#ifndef GLSLANG_WEB , noContraction(noContraction), nonUniform(nonUniform) -#endif { } spv::Decoration precision; -#ifdef GLSLANG_WEB - void addNoContraction(spv::Builder&, spv::Id) const { } - void addNonUniform(spv::Builder&, spv::Id) const { } -#else void addNoContraction(spv::Builder& builder, spv::Id t) { builder.addDecoration(t, noContraction); } void addNonUniform(spv::Builder& builder, spv::Id t) { builder.addDecoration(t, nonUniform); } protected: spv::Decoration noContraction; spv::Decoration nonUniform; -#endif - }; } // namespace @@ -139,7 +133,7 @@ class TGlslangToSpvTraverser : public glslang::TIntermTraverser { bool visitLoop(glslang::TVisit, glslang::TIntermLoop*); bool visitBranch(glslang::TVisit visit, glslang::TIntermBranch*); - void finishSpv(); + void finishSpv(bool compileOnly); void dumpSpv(std::vector& out); protected: @@ -173,9 +167,10 @@ class TGlslangToSpvTraverser : public glslang::TIntermTraverser { bool filterMember(const glslang::TType& member); spv::Id convertGlslangStructToSpvType(const glslang::TType&, const glslang::TTypeList* glslangStruct, glslang::TLayoutPacking, const glslang::TQualifier&); + spv::LinkageType convertGlslangLinkageToSpv(glslang::TLinkType glslangLinkType); void decorateStructType(const glslang::TType&, const glslang::TTypeList* glslangStruct, glslang::TLayoutPacking, - const glslang::TQualifier&, spv::Id); - spv::Id makeArraySizeId(const glslang::TArraySizes&, int dim); + const glslang::TQualifier&, spv::Id, const std::vector& spvMembers); + spv::Id makeArraySizeId(const glslang::TArraySizes&, int dim, bool allowZero = false); spv::Id accessChainLoad(const glslang::TType& type); void accessChainStore(const glslang::TType& type, spv::Id rvalue); void multiTypeStore(const glslang::TType&, spv::Id rValue); @@ -211,7 +206,7 @@ class TGlslangToSpvTraverser : public glslang::TIntermTraverser { glslang::TBasicType typeProxy); spv::Id createConversion(glslang::TOperator op, OpDecorations&, spv::Id destTypeId, spv::Id operand, glslang::TBasicType typeProxy); - spv::Id createIntWidthConversion(glslang::TOperator op, spv::Id operand, int vectorSize); + spv::Id createIntWidthConversion(glslang::TOperator op, spv::Id operand, int vectorSize, spv::Id destType); spv::Id makeSmearedConstant(spv::Id constant, int vectorSize); spv::Id createAtomicOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector& operands, glslang::TBasicType typeProxy, @@ -227,6 +222,7 @@ class TGlslangToSpvTraverser : public glslang::TIntermTraverser { spv::Id createNoArgOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId); spv::Id getSymbolId(const glslang::TIntermSymbol* node); void addMeshNVDecoration(spv::Id id, int member, const glslang::TQualifier & qualifier); + void addImageProcessingQCOMDecoration(spv::Id id, spv::Decoration decor); spv::Id createSpvConstant(const glslang::TIntermTyped&); spv::Id createSpvConstantFromConstUnionArray(const glslang::TType& type, const glslang::TConstUnionArray&, int& nextConst, bool specConstant); @@ -277,12 +273,10 @@ class TGlslangToSpvTraverser : public glslang::TIntermTraverser { // requiring local translation to and from SPIR-V type on every access. // Maps AST-required-type-id> std::unordered_map forceType; - - // Used later for generating OpTraceKHR/OpExecuteCallableKHR - std::unordered_map locationToSymbol[2]; - // Used by Task shader while generating opearnds for OpEmitMeshTasksEXT spv::Id taskPayloadID; + // Used later for generating OpTraceKHR/OpExecuteCallableKHR/OpHitObjectRecordHit*/OpHitObjectGetShaderBindingTableData + std::unordered_map locationToSymbol[4]; }; // @@ -292,12 +286,6 @@ class TGlslangToSpvTraverser : public glslang::TIntermTraverser { // Translate glslang profile to SPIR-V source language. spv::SourceLanguage TranslateSourceLanguage(glslang::EShSource source, EProfile profile) { -#ifdef GLSLANG_WEB - return spv::SourceLanguageESSL; -#elif defined(GLSLANG_ANGLE) - return spv::SourceLanguageGLSL; -#endif - switch (source) { case glslang::EShSourceGlsl: switch (profile) { @@ -324,7 +312,6 @@ spv::ExecutionModel TranslateExecutionModel(EShLanguage stage, bool isMeshShader case EShLangVertex: return spv::ExecutionModelVertex; case EShLangFragment: return spv::ExecutionModelFragment; case EShLangCompute: return spv::ExecutionModelGLCompute; -#ifndef GLSLANG_WEB case EShLangTessControl: return spv::ExecutionModelTessellationControl; case EShLangTessEvaluation: return spv::ExecutionModelTessellationEvaluation; case EShLangGeometry: return spv::ExecutionModelGeometry; @@ -336,7 +323,6 @@ spv::ExecutionModel TranslateExecutionModel(EShLanguage stage, bool isMeshShader case EShLangCallable: return spv::ExecutionModelCallableKHR; case EShLangTask: return (isMeshShaderEXT)? spv::ExecutionModelTaskEXT : spv::ExecutionModelTaskNV; case EShLangMesh: return (isMeshShaderEXT)? spv::ExecutionModelMeshEXT: spv::ExecutionModelMeshNV; -#endif default: assert(0); return spv::ExecutionModelFragment; @@ -354,6 +340,7 @@ spv::Dim TranslateDimensionality(const glslang::TSampler& sampler) case glslang::EsdRect: return spv::DimRect; case glslang::EsdBuffer: return spv::DimBuffer; case glslang::EsdSubpass: return spv::DimSubpassData; + case glslang::EsdAttachmentEXT: return spv::DimTileImageDataEXT; default: assert(0); return spv::Dim2D; @@ -378,26 +365,23 @@ spv::Decoration TranslatePrecisionDecoration(const glslang::TType& type) } // Translate glslang type to SPIR-V block decorations. -spv::Decoration TranslateBlockDecoration(const glslang::TType& type, bool useStorageBuffer) +spv::Decoration TranslateBlockDecoration(const glslang::TStorageQualifier storage, bool useStorageBuffer) { - if (type.getBasicType() == glslang::EbtBlock) { - switch (type.getQualifier().storage) { - case glslang::EvqUniform: return spv::DecorationBlock; - case glslang::EvqBuffer: return useStorageBuffer ? spv::DecorationBlock : spv::DecorationBufferBlock; - case glslang::EvqVaryingIn: return spv::DecorationBlock; - case glslang::EvqVaryingOut: return spv::DecorationBlock; - case glslang::EvqShared: return spv::DecorationBlock; -#ifndef GLSLANG_WEB - case glslang::EvqPayload: return spv::DecorationBlock; - case glslang::EvqPayloadIn: return spv::DecorationBlock; - case glslang::EvqHitAttr: return spv::DecorationBlock; - case glslang::EvqCallableData: return spv::DecorationBlock; - case glslang::EvqCallableDataIn: return spv::DecorationBlock; -#endif - default: - assert(0); - break; - } + switch (storage) { + case glslang::EvqUniform: return spv::DecorationBlock; + case glslang::EvqBuffer: return useStorageBuffer ? spv::DecorationBlock : spv::DecorationBufferBlock; + case glslang::EvqVaryingIn: return spv::DecorationBlock; + case glslang::EvqVaryingOut: return spv::DecorationBlock; + case glslang::EvqShared: return spv::DecorationBlock; + case glslang::EvqPayload: return spv::DecorationBlock; + case glslang::EvqPayloadIn: return spv::DecorationBlock; + case glslang::EvqHitAttr: return spv::DecorationBlock; + case glslang::EvqCallableData: return spv::DecorationBlock; + case glslang::EvqCallableDataIn: return spv::DecorationBlock; + case glslang::EvqHitObjectAttrNV: return spv::DecorationBlock; + default: + assert(0); + break; } return spv::DecorationMax; @@ -464,14 +448,13 @@ spv::Decoration TranslateLayoutDecoration(const glslang::TType& type, glslang::T assert(type.getQualifier().layoutPacking == glslang::ElpNone); } return spv::DecorationMax; -#ifndef GLSLANG_WEB case glslang::EvqPayload: case glslang::EvqPayloadIn: case glslang::EvqHitAttr: case glslang::EvqCallableData: case glslang::EvqCallableDataIn: + case glslang::EvqHitObjectAttrNV: return spv::DecorationMax; -#endif default: assert(0); return spv::DecorationMax; @@ -507,14 +490,12 @@ spv::Decoration TGlslangToSpvTraverser::TranslateAuxiliaryStorageDecoration(cons { if (qualifier.centroid) return spv::DecorationCentroid; -#ifndef GLSLANG_WEB else if (qualifier.patch) return spv::DecorationPatch; else if (qualifier.sample) { builder.addCapability(spv::CapabilitySampleRateShading); return spv::DecorationSample; } -#endif return spv::DecorationMax; } @@ -531,24 +512,20 @@ spv::Decoration TranslateInvariantDecoration(const glslang::TQualifier& qualifie // If glslang type is noContraction, return SPIR-V NoContraction decoration. spv::Decoration TranslateNoContractionDecoration(const glslang::TQualifier& qualifier) { -#ifndef GLSLANG_WEB if (qualifier.isNoContraction()) return spv::DecorationNoContraction; else -#endif return spv::DecorationMax; } // If glslang type is nonUniform, return SPIR-V NonUniform decoration. spv::Decoration TGlslangToSpvTraverser::TranslateNonUniformDecoration(const glslang::TQualifier& qualifier) { -#ifndef GLSLANG_WEB if (qualifier.isNonUniform()) { builder.addIncorporatedExtension("SPV_EXT_descriptor_indexing", spv::Spv_1_5); builder.addCapability(spv::CapabilityShaderNonUniformEXT); return spv::DecorationNonUniformEXT; } else -#endif return spv::DecorationMax; } @@ -556,13 +533,11 @@ spv::Decoration TGlslangToSpvTraverser::TranslateNonUniformDecoration(const glsl spv::Decoration TGlslangToSpvTraverser::TranslateNonUniformDecoration( const spv::Builder::AccessChain::CoherentFlags& coherentFlags) { -#ifndef GLSLANG_WEB if (coherentFlags.isNonUniform()) { builder.addIncorporatedExtension("SPV_EXT_descriptor_indexing", spv::Spv_1_5); builder.addCapability(spv::CapabilityShaderNonUniformEXT); return spv::DecorationNonUniformEXT; } else -#endif return spv::DecorationMax; } @@ -571,7 +546,6 @@ spv::MemoryAccessMask TGlslangToSpvTraverser::TranslateMemoryAccess( { spv::MemoryAccessMask mask = spv::MemoryAccessMaskNone; -#ifndef GLSLANG_WEB if (!glslangIntermediate->usingVulkanMemoryModel() || coherentFlags.isImage) return mask; @@ -589,7 +563,6 @@ spv::MemoryAccessMask TGlslangToSpvTraverser::TranslateMemoryAccess( if (mask != spv::MemoryAccessMaskNone) { builder.addCapability(spv::CapabilityVulkanMemoryModelKHR); } -#endif return mask; } @@ -599,7 +572,6 @@ spv::ImageOperandsMask TGlslangToSpvTraverser::TranslateImageOperands( { spv::ImageOperandsMask mask = spv::ImageOperandsMaskNone; -#ifndef GLSLANG_WEB if (!glslangIntermediate->usingVulkanMemoryModel()) return mask; @@ -617,7 +589,6 @@ spv::ImageOperandsMask TGlslangToSpvTraverser::TranslateImageOperands( if (mask != spv::ImageOperandsMaskNone) { builder.addCapability(spv::CapabilityVulkanMemoryModelKHR); } -#endif return mask; } @@ -625,7 +596,6 @@ spv::ImageOperandsMask TGlslangToSpvTraverser::TranslateImageOperands( spv::Builder::AccessChain::CoherentFlags TGlslangToSpvTraverser::TranslateCoherent(const glslang::TType& type) { spv::Builder::AccessChain::CoherentFlags flags = {}; -#ifndef GLSLANG_WEB flags.coherent = type.getQualifier().coherent; flags.devicecoherent = type.getQualifier().devicecoherent; flags.queuefamilycoherent = type.getQualifier().queuefamilycoherent; @@ -640,7 +610,6 @@ spv::Builder::AccessChain::CoherentFlags TGlslangToSpvTraverser::TranslateCohere flags.anyCoherent() || flags.volatil; flags.isImage = type.getBasicType() == glslang::EbtSampler; -#endif flags.nonUniform = type.getQualifier().nonUniform; return flags; } @@ -650,7 +619,6 @@ spv::Scope TGlslangToSpvTraverser::TranslateMemoryScope( { spv::Scope scope = spv::ScopeMax; -#ifndef GLSLANG_WEB if (coherentFlags.volatil || coherentFlags.coherent) { // coherent defaults to Device scope in the old model, QueueFamilyKHR scope in the new model scope = glslangIntermediate->usingVulkanMemoryModel() ? spv::ScopeQueueFamilyKHR : spv::ScopeDevice; @@ -668,7 +636,6 @@ spv::Scope TGlslangToSpvTraverser::TranslateMemoryScope( if (glslangIntermediate->usingVulkanMemoryModel() && scope == spv::ScopeDevice) { builder.addCapability(spv::CapabilityVulkanMemoryModelDeviceScopeKHR); } -#endif return scope; } @@ -683,7 +650,6 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI { switch (builtIn) { case glslang::EbvPointSize: -#ifndef GLSLANG_WEB // Defer adding the capability until the built-in is actually used. if (! memberDeclaration) { switch (glslangIntermediate->getStage()) { @@ -698,7 +664,6 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI break; } } -#endif return spv::BuiltInPointSize; case glslang::EbvPosition: return spv::BuiltInPosition; @@ -719,7 +684,6 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI case glslang::EbvLocalInvocationIndex: return spv::BuiltInLocalInvocationIndex; case glslang::EbvGlobalInvocationId: return spv::BuiltInGlobalInvocationId; -#ifndef GLSLANG_WEB // These *Distance capabilities logically belong here, but if the member is declared and // then never used, consumers of SPIR-V prefer the capability not be declared. // They are now generated when used, rather than here when declared. @@ -1013,6 +977,8 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI return spv::BuiltInRayTmaxKHR; case glslang::EbvCullMask: return spv::BuiltInCullMaskKHR; + case glslang::EbvPositionFetch: + return spv::BuiltInHitTriangleVertexPositionsKHR; case glslang::EbvInstanceCustomIndex: return spv::BuiltInInstanceCustomIndexKHR; case glslang::EbvHitT: @@ -1043,6 +1009,22 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI builder.addExtension(spv::E_SPV_NV_ray_tracing_motion_blur); builder.addCapability(spv::CapabilityRayTracingMotionBlurNV); return spv::BuiltInCurrentRayTimeNV; + case glslang::EbvMicroTrianglePositionNV: + builder.addCapability(spv::CapabilityRayTracingDisplacementMicromapNV); + builder.addExtension("SPV_NV_displacement_micromap"); + return spv::BuiltInHitMicroTriangleVertexPositionsNV; + case glslang::EbvMicroTriangleBaryNV: + builder.addCapability(spv::CapabilityRayTracingDisplacementMicromapNV); + builder.addExtension("SPV_NV_displacement_micromap"); + return spv::BuiltInHitMicroTriangleVertexBarycentricsNV; + case glslang::EbvHitKindFrontFacingMicroTriangleNV: + builder.addCapability(spv::CapabilityRayTracingDisplacementMicromapNV); + builder.addExtension("SPV_NV_displacement_micromap"); + return spv::BuiltInHitKindFrontFacingMicroTriangleNV; + case glslang::EbvHitKindBackFacingMicroTriangleNV: + builder.addCapability(spv::CapabilityRayTracingDisplacementMicromapNV); + builder.addExtension("SPV_NV_displacement_micromap"); + return spv::BuiltInHitKindBackFacingMicroTriangleNV; // barycentrics case glslang::EbvBaryCoordNV: @@ -1108,7 +1090,28 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI builder.addExtension(spv::E_SPV_NV_shader_sm_builtins); builder.addCapability(spv::CapabilityShaderSMBuiltinsNV); return spv::BuiltInSMIDNV; -#endif + + // ARM builtins + case glslang::EbvCoreCountARM: + builder.addExtension(spv::E_SPV_ARM_core_builtins); + builder.addCapability(spv::CapabilityCoreBuiltinsARM); + return spv::BuiltInCoreCountARM; + case glslang::EbvCoreIDARM: + builder.addExtension(spv::E_SPV_ARM_core_builtins); + builder.addCapability(spv::CapabilityCoreBuiltinsARM); + return spv::BuiltInCoreIDARM; + case glslang::EbvCoreMaxIDARM: + builder.addExtension(spv::E_SPV_ARM_core_builtins); + builder.addCapability(spv::CapabilityCoreBuiltinsARM); + return spv::BuiltInCoreMaxIDARM; + case glslang::EbvWarpIDARM: + builder.addExtension(spv::E_SPV_ARM_core_builtins); + builder.addCapability(spv::CapabilityCoreBuiltinsARM); + return spv::BuiltInWarpIDARM; + case glslang::EbvWarpMaxIDARM: + builder.addExtension(spv::E_SPV_ARM_core_builtins); + builder.addCapability(spv::CapabilityCoreBuiltinsARM); + return spv::BuiltInWarpMaxIDARM; default: return spv::BuiltInMax; @@ -1120,10 +1123,6 @@ spv::ImageFormat TGlslangToSpvTraverser::TranslateImageFormat(const glslang::TTy { assert(type.getBasicType() == glslang::EbtSampler); -#ifdef GLSLANG_WEB - return spv::ImageFormatUnknown; -#endif - // Check for capabilities switch (type.getQualifier().getFormat()) { case glslang::ElfRg32f: @@ -1278,24 +1277,27 @@ spv::LoopControlMask TGlslangToSpvTraverser::TranslateLoopControl(const glslang: // Translate glslang type to SPIR-V storage class. spv::StorageClass TGlslangToSpvTraverser::TranslateStorageClass(const glslang::TType& type) { - if (type.getBasicType() == glslang::EbtRayQuery) + if (type.getBasicType() == glslang::EbtRayQuery || type.getBasicType() == glslang::EbtHitObjectNV) return spv::StorageClassPrivate; -#ifndef GLSLANG_WEB if (type.getQualifier().isSpirvByReference()) { if (type.getQualifier().isParamInput() || type.getQualifier().isParamOutput()) return spv::StorageClassFunction; } -#endif if (type.getQualifier().isPipeInput()) return spv::StorageClassInput; if (type.getQualifier().isPipeOutput()) return spv::StorageClassOutput; + if (type.getQualifier().storage == glslang::EvqTileImageEXT || type.isAttachmentEXT()) { + builder.addExtension(spv::E_SPV_EXT_shader_tile_image); + builder.addCapability(spv::CapabilityTileImageColorReadAccessEXT); + return spv::StorageClassTileImageEXT; + } if (glslangIntermediate->getSource() != glslang::EShSourceHlsl || type.getQualifier().storage == glslang::EvqUniform) { if (type.isAtomic()) return spv::StorageClassAtomicCounter; - if (type.containsOpaque()) + if (type.containsOpaque() && !glslangIntermediate->getBindlessMode()) return spv::StorageClassUniformConstant; } @@ -1328,15 +1330,14 @@ spv::StorageClass TGlslangToSpvTraverser::TranslateStorageClass(const glslang::T case glslang::EvqConstReadOnly: return spv::StorageClassFunction; case glslang::EvqTemporary: return spv::StorageClassFunction; case glslang::EvqShared: return spv::StorageClassWorkgroup; -#ifndef GLSLANG_WEB case glslang::EvqPayload: return spv::StorageClassRayPayloadKHR; case glslang::EvqPayloadIn: return spv::StorageClassIncomingRayPayloadKHR; case glslang::EvqHitAttr: return spv::StorageClassHitAttributeKHR; case glslang::EvqCallableData: return spv::StorageClassCallableDataKHR; case glslang::EvqCallableDataIn: return spv::StorageClassIncomingCallableDataKHR; case glslang::EvqtaskPayloadSharedEXT : return spv::StorageClassTaskPayloadWorkgroupEXT; + case glslang::EvqHitObjectAttrNV: return spv::StorageClassHitObjectAttributeNV; case glslang::EvqSpirvStorageClass: return static_cast(type.getQualifier().spirvStorageClass); -#endif default: assert(0); break; @@ -1397,7 +1398,6 @@ void TGlslangToSpvTraverser::TranslateLiterals(const glslang::TVectorgetSource(), glslangIntermediate->getProfile()), glslangIntermediate->getVersion()); - if (options.generateDebugInfo) { + if (options.emitNonSemanticShaderDebugSource) + this->options.emitNonSemanticShaderDebugInfo = true; + if (options.emitNonSemanticShaderDebugInfo) + this->options.generateDebugInfo = true; + + if (this->options.generateDebugInfo) { builder.setEmitOpLines(); builder.setSourceFile(glslangIntermediate->getSourceFile()); @@ -1579,8 +1581,8 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, builder.addInclude(iItr->first, iItr->second); } - builder.setEmitNonSemanticShaderDebugInfo(options.emitNonSemanticShaderDebugInfo); - builder.setEmitNonSemanticShaderDebugSource(options.emitNonSemanticShaderDebugSource); + builder.setEmitNonSemanticShaderDebugInfo(this->options.emitNonSemanticShaderDebugInfo); + builder.setEmitNonSemanticShaderDebugSource(this->options.emitNonSemanticShaderDebugSource); stdBuiltins = builder.import("GLSL.std.450"); @@ -1603,8 +1605,12 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, builder.addCapability(spv::CapabilityVariablePointers); } - shaderEntry = builder.makeEntryPoint(glslangIntermediate->getEntryPointName().c_str()); - entryPoint = builder.addEntryPoint(executionModel, shaderEntry, glslangIntermediate->getEntryPointName().c_str()); + // If not linking, there is no entry point + if (!options.compileOnly) { + shaderEntry = builder.makeEntryPoint(glslangIntermediate->getEntryPointName().c_str()); + entryPoint = + builder.addEntryPoint(executionModel, shaderEntry, glslangIntermediate->getEntryPointName().c_str()); + } // Add the source extensions const auto& sourceExtensions = glslangIntermediate->getRequestedExtensions(); @@ -1622,12 +1628,10 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, builder.addCapability(spv::CapabilityRayTraversalPrimitiveCullingKHR); } -#ifndef GLSLANG_WEB if (glslangIntermediate->getSubgroupUniformControlFlow()) { builder.addExtension(spv::E_SPV_KHR_subgroup_uniform_control_flow); builder.addExecutionMode(shaderEntry, spv::ExecutionModeSubgroupUniformControlFlowKHR); } -#endif unsigned int mode; switch (glslangIntermediate->getStage()) { @@ -1660,14 +1664,30 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, builder.addExtension(spv::E_SPV_KHR_post_depth_coverage); } + if (glslangIntermediate->getNonCoherentColorAttachmentReadEXT()) { + builder.addCapability(spv::CapabilityTileImageColorReadAccessEXT); + builder.addExecutionMode(shaderEntry, spv::ExecutionModeNonCoherentColorAttachmentReadEXT); + builder.addExtension(spv::E_SPV_EXT_shader_tile_image); + } + + if (glslangIntermediate->getNonCoherentDepthAttachmentReadEXT()) { + builder.addCapability(spv::CapabilityTileImageDepthReadAccessEXT); + builder.addExecutionMode(shaderEntry, spv::ExecutionModeNonCoherentDepthAttachmentReadEXT); + builder.addExtension(spv::E_SPV_EXT_shader_tile_image); + } + + if (glslangIntermediate->getNonCoherentStencilAttachmentReadEXT()) { + builder.addCapability(spv::CapabilityTileImageStencilReadAccessEXT); + builder.addExecutionMode(shaderEntry, spv::ExecutionModeNonCoherentStencilAttachmentReadEXT); + builder.addExtension(spv::E_SPV_EXT_shader_tile_image); + } + if (glslangIntermediate->isDepthReplacing()) builder.addExecutionMode(shaderEntry, spv::ExecutionModeDepthReplacing); if (glslangIntermediate->isStencilReplacing()) builder.addExecutionMode(shaderEntry, spv::ExecutionModeStencilRefReplacingEXT); -#ifndef GLSLANG_WEB - switch(glslangIntermediate->getDepth()) { case glslang::EldGreater: mode = spv::ExecutionModeDepthGreater; break; case glslang::EldLess: mode = spv::ExecutionModeDepthLess; break; @@ -1719,7 +1739,6 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, } builder.addExtension(spv::E_SPV_EXT_fragment_shader_interlock); } -#endif break; case EShLangCompute: @@ -1750,7 +1769,6 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, builder.addExtension(spv::E_SPV_NV_compute_shader_derivatives); } break; -#ifndef GLSLANG_WEB case EShLangTessEvaluation: case EShLangTessControl: builder.addCapability(spv::CapabilityTessellation); @@ -1837,13 +1855,16 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, builder.addCapability(spv::CapabilityRayTracingNV); builder.addExtension("SPV_NV_ray_tracing"); } - if (glslangIntermediate->getStage() != EShLangRayGen && glslangIntermediate->getStage() != EShLangCallable) - { - if (extensions.find("GL_EXT_ray_cull_mask") != extensions.end()) { - builder.addCapability(spv::CapabilityRayCullMaskKHR); - builder.addExtension("SPV_KHR_ray_cull_mask"); - } - } + if (glslangIntermediate->getStage() != EShLangRayGen && glslangIntermediate->getStage() != EShLangCallable) { + if (extensions.find("GL_EXT_ray_cull_mask") != extensions.end()) { + builder.addCapability(spv::CapabilityRayCullMaskKHR); + builder.addExtension("SPV_KHR_ray_cull_mask"); + } + if (extensions.find("GL_EXT_ray_tracing_position_fetch") != extensions.end()) { + builder.addCapability(spv::CapabilityRayTracingPositionFetchKHR); + builder.addExtension("SPV_KHR_ray_tracing_position_fetch"); + } + } break; } case EShLangTask: @@ -1887,13 +1908,11 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode); } break; -#endif default: break; } -#ifndef GLSLANG_WEB // // Add SPIR-V requirements (GL_EXT_spirv_intrinsics) // @@ -1938,27 +1957,29 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, builder.addExecutionModeId(shaderEntry, static_cast(modeId.first), operandIds); } } -#endif } // Finish creating SPV, after the traversal is complete. -void TGlslangToSpvTraverser::finishSpv() +void TGlslangToSpvTraverser::finishSpv(bool compileOnly) { - // Finish the entry point function - if (! entryPointTerminated) { - builder.setBuildPoint(shaderEntry->getLastBlock()); - builder.leaveFunction(); - } + // If not linking, an entry point is not expected + if (!compileOnly) { + // Finish the entry point function + if (!entryPointTerminated) { + builder.setBuildPoint(shaderEntry->getLastBlock()); + builder.leaveFunction(); + } - // finish off the entry-point SPV instruction by adding the Input/Output - for (auto it = iOSet.cbegin(); it != iOSet.cend(); ++it) - entryPoint->addIdOperand(*it); + // finish off the entry-point SPV instruction by adding the Input/Output + for (auto it = iOSet.cbegin(); it != iOSet.cend(); ++it) + entryPoint->addIdOperand(*it); + } // Add capabilities, extensions, remove unneeded decorations, etc., // based on the resulting SPIR-V. // Note: WebGPU code generation must have the opportunity to aggressively // prune unreachable merge blocks and continue targets. - builder.postProcess(); + builder.postProcess(compileOnly); } // Write the SPV into 'out'. @@ -1984,6 +2005,10 @@ void TGlslangToSpvTraverser::dumpSpv(std::vector& out) // void TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol) { + // We update the line information even though no code might be generated here + // This is helpful to yield correct lines for control flow instructions + builder.setLine(symbol->getLoc().line, symbol->getLoc().getFilename()); + SpecConstantOpModeGuard spec_constant_op_mode_setter(&builder); if (symbol->getType().isStruct()) glslangTypeToIdMap[symbol->getType().getStruct()] = symbol->getId(); @@ -2013,7 +2038,7 @@ void TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol) spv::StorageClass sc = builder.getStorageClass(id); // Before SPIR-V 1.4, we only want to include Input and Output. // Starting with SPIR-V 1.4, we want all globals. - if ((glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4 && builder.isGlobalStorage(id)) || + if ((glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4 && builder.isGlobalVariable(id)) || (sc == spv::StorageClassInput || sc == spv::StorageClassOutput)) { iOSet.insert(id); } @@ -2135,6 +2160,9 @@ bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::T node->getRight()->traverse(this); spv::Id rValue = accessChainLoad(node->getRight()->getType()); + // reset line number for assignment + builder.setLine(node->getLoc().line, node->getLoc().getFilename()); + if (node->getOp() != glslang::EOpAssign) { // the left is also an r-value builder.setAccessChain(lValue); @@ -2499,12 +2527,15 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI spv::Id length; if (node->getOperand()->getType().isCoopMat()) { - spec_constant_op_mode_setter.turnOnSpecConstantOpMode(); - spv::Id typeId = convertGlslangToSpvType(node->getOperand()->getType()); assert(builder.isCooperativeMatrixType(typeId)); - length = builder.createCooperativeMatrixLength(typeId); + if (node->getOperand()->getType().isCoopMatKHR()) { + length = builder.createCooperativeMatrixLengthKHR(typeId); + } else { + spec_constant_op_mode_setter.turnOnSpecConstantOpMode(); + length = builder.createCooperativeMatrixLengthNV(typeId); + } } else { glslang::TIntermTyped* block = node->getOperand()->getAsBinaryNode()->getLeft(); block->traverse(this); @@ -2561,7 +2592,35 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI spv::Builder::AccessChain::CoherentFlags lvalueCoherentFlags; -#ifndef GLSLANG_WEB + const auto hitObjectOpsWithLvalue = [](glslang::TOperator op) { + switch(op) { + case glslang::EOpReorderThreadNV: + case glslang::EOpHitObjectGetCurrentTimeNV: + case glslang::EOpHitObjectGetHitKindNV: + case glslang::EOpHitObjectGetPrimitiveIndexNV: + case glslang::EOpHitObjectGetGeometryIndexNV: + case glslang::EOpHitObjectGetInstanceIdNV: + case glslang::EOpHitObjectGetInstanceCustomIndexNV: + case glslang::EOpHitObjectGetObjectRayDirectionNV: + case glslang::EOpHitObjectGetObjectRayOriginNV: + case glslang::EOpHitObjectGetWorldRayDirectionNV: + case glslang::EOpHitObjectGetWorldRayOriginNV: + case glslang::EOpHitObjectGetWorldToObjectNV: + case glslang::EOpHitObjectGetObjectToWorldNV: + case glslang::EOpHitObjectGetRayTMaxNV: + case glslang::EOpHitObjectGetRayTMinNV: + case glslang::EOpHitObjectIsEmptyNV: + case glslang::EOpHitObjectIsHitNV: + case glslang::EOpHitObjectIsMissNV: + case glslang::EOpHitObjectRecordEmptyNV: + case glslang::EOpHitObjectGetShaderBindingTableRecordIndexNV: + case glslang::EOpHitObjectGetShaderRecordBufferHandleNV: + return true; + default: + return false; + } + }; + if (node->getOp() == glslang::EOpAtomicCounterIncrement || node->getOp() == glslang::EOpAtomicCounterDecrement || node->getOp() == glslang::EOpAtomicCounter || @@ -2575,16 +2634,15 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI node->getOp() == glslang::EOpRayQueryGetIntersectionCandidateAABBOpaque || node->getOp() == glslang::EOpRayQueryTerminate || node->getOp() == glslang::EOpRayQueryConfirmIntersection || - (node->getOp() == glslang::EOpSpirvInst && operandNode->getAsTyped()->getQualifier().isSpirvByReference())) { + (node->getOp() == glslang::EOpSpirvInst && operandNode->getAsTyped()->getQualifier().isSpirvByReference()) || + hitObjectOpsWithLvalue(node->getOp())) { operand = builder.accessChainGetLValue(); // Special case l-value operands lvalueCoherentFlags = builder.getAccessChain().coherentFlags; lvalueCoherentFlags |= TranslateCoherent(operandNode->getAsTyped()->getType()); } else if (operandNode->getAsTyped()->getQualifier().isSpirvLiteral()) { // Will be translated to a literal value, make a placeholder here operand = spv::NoResult; - } else -#endif - { + } else { operand = accessChainLoad(node->getOperand()->getType()); } @@ -2602,7 +2660,6 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI result = createUnaryOperation(node->getOp(), decorations, resultType(), operand, node->getOperand()->getBasicType(), lvalueCoherentFlags); -#ifndef GLSLANG_WEB // it could be attached to a SPIR-V intruction if (!result) { if (node->getOp() == glslang::EOpSpirvInst) { @@ -2632,7 +2689,6 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI return false; // done with this node } } -#endif if (result) { if (invertedType) { @@ -2657,7 +2713,6 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI spv::Id one = 0; if (node->getBasicType() == glslang::EbtFloat) one = builder.makeFloatConstant(1.0F); -#ifndef GLSLANG_WEB else if (node->getBasicType() == glslang::EbtDouble) one = builder.makeDoubleConstant(1.0); else if (node->getBasicType() == glslang::EbtFloat16) @@ -2668,7 +2723,6 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI one = builder.makeInt16Constant(1); else if (node->getBasicType() == glslang::EbtInt64 || node->getBasicType() == glslang::EbtUint64) one = builder.makeInt64Constant(1); -#endif else one = builder.makeIntConstant(1); glslang::TOperator op; @@ -2697,7 +2751,6 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI return false; -#ifndef GLSLANG_WEB case glslang::EOpEmitStreamVertex: builder.createNoResultOp(spv::OpEmitStreamVertex, operand); return false; @@ -2710,7 +2763,12 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI case glslang::EOpRayQueryConfirmIntersection: builder.createNoResultOp(spv::OpRayQueryConfirmIntersectionKHR, operand); return false; -#endif + case glslang::EOpReorderThreadNV: + builder.createNoResultOp(spv::OpReorderThreadWithHitObjectNV, operand); + return false; + case glslang::EOpHitObjectRecordEmptyNV: + builder.createNoResultOp(spv::OpHitObjectRecordEmptyNV, operand); + return false; default: logger->missingFunctionality("unknown glslang unary"); @@ -2775,15 +2833,12 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt builder.setAccessChainRValue(result); return false; - } -#ifndef GLSLANG_WEB - else if (node->getOp() == glslang::EOpImageStore || + } else if (node->getOp() == glslang::EOpImageStore || node->getOp() == glslang::EOpImageStoreLod || node->getOp() == glslang::EOpImageAtomicStore) { // "imageStore" is a special case, which has no result return false; } -#endif glslang::TOperator binOp = glslang::EOpNull; bool reduceComparison = true; @@ -2809,9 +2864,12 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt // In all cases, still let the traverser visit the children for us. makeFunctions(node->getAsAggregate()->getSequence()); - // Also, we want all globals initializers to go into the beginning of the entry point, before - // anything else gets there, so visit out of order, doing them all now. - makeGlobalInitializers(node->getAsAggregate()->getSequence()); + // Global initializers is specific to the shader entry point, which does not exist in compile-only mode + if (!options.compileOnly) { + // Also, we want all globals initializers to go into the beginning of the entry point, before + // anything else gets there, so visit out of order, doing them all now. + makeGlobalInitializers(node->getAsAggregate()->getSequence()); + } //Pre process linker objects for ray tracing stages if (glslangIntermediate->isRayTracingStage()) @@ -2865,7 +2923,9 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt } if (options.generateDebugInfo) { const auto& loc = node->getLoc(); - currentFunction->setDebugLineInfo(builder.getSourceFile(), loc.line, loc.column); + const char* sourceFileName = loc.getFilename(); + spv::Id sourceFileId = sourceFileName ? builder.getStringId(sourceFileName) : builder.getSourceFile(); + currentFunction->setDebugLineInfo(sourceFileId, loc.line, loc.column); } } else { if (inEntryPoint) @@ -3000,7 +3060,8 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt case glslang::EOpConstructStruct: case glslang::EOpConstructTextureSampler: case glslang::EOpConstructReference: - case glslang::EOpConstructCooperativeMatrix: + case glslang::EOpConstructCooperativeMatrixNV: + case glslang::EOpConstructCooperativeMatrixKHR: { builder.setLine(node->getLoc().line, node->getLoc().getFilename()); std::vector arguments; @@ -3017,7 +3078,8 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt } else constructed = builder.createOp(spv::OpSampledImage, resultType(), arguments); } else if (node->getOp() == glslang::EOpConstructStruct || - node->getOp() == glslang::EOpConstructCooperativeMatrix || + node->getOp() == glslang::EOpConstructCooperativeMatrixNV || + node->getOp() == glslang::EOpConstructCooperativeMatrixKHR || node->getType().isArray()) { std::vector constituents; for (int c = 0; c < (int)arguments.size(); ++c) @@ -3115,7 +3177,6 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt atomic = true; break; -#ifndef GLSLANG_WEB case glslang::EOpAtomicStore: noReturnValue = true; // fallthrough @@ -3192,6 +3253,8 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt break; case glslang::EOpCooperativeMatrixLoad: case glslang::EOpCooperativeMatrixStore: + case glslang::EOpCooperativeMatrixLoadNV: + case glslang::EOpCooperativeMatrixStoreNV: noReturnValue = true; break; case glslang::EOpBeginInvocationInterlock: @@ -3199,7 +3262,68 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt builder.addExtension(spv::E_SPV_EXT_fragment_shader_interlock); noReturnValue = true; break; -#endif + + case glslang::EOpHitObjectTraceRayNV: + case glslang::EOpHitObjectTraceRayMotionNV: + case glslang::EOpHitObjectGetAttributesNV: + case glslang::EOpHitObjectExecuteShaderNV: + case glslang::EOpHitObjectRecordEmptyNV: + case glslang::EOpHitObjectRecordMissNV: + case glslang::EOpHitObjectRecordMissMotionNV: + case glslang::EOpHitObjectRecordHitNV: + case glslang::EOpHitObjectRecordHitMotionNV: + case glslang::EOpHitObjectRecordHitWithIndexNV: + case glslang::EOpHitObjectRecordHitWithIndexMotionNV: + case glslang::EOpReorderThreadNV: + noReturnValue = true; + //Fallthrough + case glslang::EOpHitObjectIsEmptyNV: + case glslang::EOpHitObjectIsMissNV: + case glslang::EOpHitObjectIsHitNV: + case glslang::EOpHitObjectGetRayTMinNV: + case glslang::EOpHitObjectGetRayTMaxNV: + case glslang::EOpHitObjectGetObjectRayOriginNV: + case glslang::EOpHitObjectGetObjectRayDirectionNV: + case glslang::EOpHitObjectGetWorldRayOriginNV: + case glslang::EOpHitObjectGetWorldRayDirectionNV: + case glslang::EOpHitObjectGetObjectToWorldNV: + case glslang::EOpHitObjectGetWorldToObjectNV: + case glslang::EOpHitObjectGetInstanceCustomIndexNV: + case glslang::EOpHitObjectGetInstanceIdNV: + case glslang::EOpHitObjectGetGeometryIndexNV: + case glslang::EOpHitObjectGetPrimitiveIndexNV: + case glslang::EOpHitObjectGetHitKindNV: + case glslang::EOpHitObjectGetCurrentTimeNV: + case glslang::EOpHitObjectGetShaderBindingTableRecordIndexNV: + case glslang::EOpHitObjectGetShaderRecordBufferHandleNV: + builder.addExtension(spv::E_SPV_NV_shader_invocation_reorder); + builder.addCapability(spv::CapabilityShaderInvocationReorderNV); + break; + case glslang::EOpRayQueryGetIntersectionTriangleVertexPositionsEXT: + builder.addExtension(spv::E_SPV_KHR_ray_tracing_position_fetch); + builder.addCapability(spv::CapabilityRayQueryPositionFetchKHR); + noReturnValue = true; + break; + + case glslang::EOpImageSampleWeightedQCOM: + builder.addCapability(spv::CapabilityTextureSampleWeightedQCOM); + builder.addExtension(spv::E_SPV_QCOM_image_processing); + break; + case glslang::EOpImageBoxFilterQCOM: + builder.addCapability(spv::CapabilityTextureBoxFilterQCOM); + builder.addExtension(spv::E_SPV_QCOM_image_processing); + break; + case glslang::EOpImageBlockMatchSADQCOM: + case glslang::EOpImageBlockMatchSSDQCOM: + builder.addCapability(spv::CapabilityTextureBlockMatchQCOM); + builder.addExtension(spv::E_SPV_QCOM_image_processing); + break; + + case glslang::EOpFetchMicroTriangleVertexPositionNV: + case glslang::EOpFetchMicroTriangleVertexBarycentricNV: + builder.addExtension(spv::E_SPV_NV_displacement_micromap); + builder.addCapability(spv::CapabilityDisplacementMicromapNV); + break; case glslang::EOpDebugPrintf: noReturnValue = true; @@ -3256,6 +3380,22 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt lvalue = true; break; + + + case glslang::EOpHitObjectRecordHitNV: + case glslang::EOpHitObjectRecordHitMotionNV: + case glslang::EOpHitObjectRecordHitWithIndexNV: + case glslang::EOpHitObjectRecordHitWithIndexMotionNV: + case glslang::EOpHitObjectTraceRayNV: + case glslang::EOpHitObjectTraceRayMotionNV: + case glslang::EOpHitObjectExecuteShaderNV: + case glslang::EOpHitObjectRecordMissNV: + case glslang::EOpHitObjectRecordMissMotionNV: + case glslang::EOpHitObjectGetAttributesNV: + if (arg == 0) + lvalue = true; + break; + case glslang::EOpRayQueryInitialize: case glslang::EOpRayQueryTerminate: case glslang::EOpRayQueryConfirmIntersection: @@ -3291,7 +3431,6 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt lvalue = true; break; -#ifndef GLSLANG_WEB case glslang::EOpFrexp: if (arg == 1) lvalue = true; @@ -3345,10 +3484,12 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt lvalue = true; break; case glslang::EOpCooperativeMatrixLoad: + case glslang::EOpCooperativeMatrixLoadNV: if (arg == 0 || arg == 1) lvalue = true; break; case glslang::EOpCooperativeMatrixStore: + case glslang::EOpCooperativeMatrixStoreNV: if (arg == 1) lvalue = true; break; @@ -3356,7 +3497,15 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt if (glslangOperands[arg]->getAsTyped()->getQualifier().isSpirvByReference()) lvalue = true; break; -#endif + case glslang::EOpReorderThreadNV: + //Three variants of reorderThreadNV, two of them use hitObjectNV + if (arg == 0 && glslangOperands.size() != 2) + lvalue = true; + break; + case glslang::EOpRayQueryGetIntersectionTriangleVertexPositionsEXT: + if (arg == 0 || arg == 2) + lvalue = true; + break; default: break; } @@ -3366,9 +3515,10 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt else glslangOperands[arg]->traverse(this); -#ifndef GLSLANG_WEB if (node->getOp() == glslang::EOpCooperativeMatrixLoad || - node->getOp() == glslang::EOpCooperativeMatrixStore) { + node->getOp() == glslang::EOpCooperativeMatrixStore || + node->getOp() == glslang::EOpCooperativeMatrixLoadNV || + node->getOp() == glslang::EOpCooperativeMatrixStoreNV) { if (arg == 1) { // fold "element" parameter into the access chain @@ -3389,9 +3539,11 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt unsigned int alignment = builder.getAccessChain().alignment; int memoryAccess = TranslateMemoryAccess(coherentFlags); - if (node->getOp() == glslang::EOpCooperativeMatrixLoad) + if (node->getOp() == glslang::EOpCooperativeMatrixLoad || + node->getOp() == glslang::EOpCooperativeMatrixLoadNV) memoryAccess &= ~spv::MemoryAccessMakePointerAvailableKHRMask; - if (node->getOp() == glslang::EOpCooperativeMatrixStore) + if (node->getOp() == glslang::EOpCooperativeMatrixStore || + node->getOp() == glslang::EOpCooperativeMatrixStoreNV) memoryAccess &= ~spv::MemoryAccessMakePointerVisibleKHRMask; if (builder.getStorageClass(builder.getAccessChain().base) == spv::StorageClassPhysicalStorageBufferEXT) { @@ -3413,7 +3565,6 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt continue; } } -#endif // for l-values, pass the address, for r-values, pass the value if (lvalue) { @@ -3448,26 +3599,37 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt glslangOp == glslang::EOpRayQueryGetIntersectionObjectRayDirection || glslangOp == glslang::EOpRayQueryGetIntersectionObjectRayOrigin || glslangOp == glslang::EOpRayQueryGetIntersectionObjectToWorld || - glslangOp == glslang::EOpRayQueryGetIntersectionWorldToObject + glslangOp == glslang::EOpRayQueryGetIntersectionWorldToObject || + glslangOp == glslang::EOpRayQueryGetIntersectionTriangleVertexPositionsEXT )) { bool cond = glslangOperands[arg]->getAsConstantUnion()->getConstArray()[0].getBConst(); operands.push_back(builder.makeIntConstant(cond ? 1 : 0)); } else if ((arg == 10 && glslangOp == glslang::EOpTraceKHR) || (arg == 11 && glslangOp == glslang::EOpTraceRayMotionNV) || - (arg == 1 && glslangOp == glslang::EOpExecuteCallableKHR)) { - const int opdNum = glslangOp == glslang::EOpTraceKHR ? 10 : (glslangOp == glslang::EOpTraceRayMotionNV ? 11 : 1); + (arg == 1 && glslangOp == glslang::EOpExecuteCallableKHR) || + (arg == 1 && glslangOp == glslang::EOpHitObjectExecuteShaderNV) || + (arg == 11 && glslangOp == glslang::EOpHitObjectTraceRayNV) || + (arg == 12 && glslangOp == glslang::EOpHitObjectTraceRayMotionNV)) { const int set = glslangOp == glslang::EOpExecuteCallableKHR ? 1 : 0; - - const int location = glslangOperands[opdNum]->getAsConstantUnion()->getConstArray()[0].getUConst(); + const int location = glslangOperands[arg]->getAsConstantUnion()->getConstArray()[0].getUConst(); + auto itNode = locationToSymbol[set].find(location); + visitSymbol(itNode->second); + spv::Id symId = getSymbolId(itNode->second); + operands.push_back(symId); + } else if ((arg == 12 && glslangOp == glslang::EOpHitObjectRecordHitNV) || + (arg == 13 && glslangOp == glslang::EOpHitObjectRecordHitMotionNV) || + (arg == 11 && glslangOp == glslang::EOpHitObjectRecordHitWithIndexNV) || + (arg == 12 && glslangOp == glslang::EOpHitObjectRecordHitWithIndexMotionNV) || + (arg == 1 && glslangOp == glslang::EOpHitObjectGetAttributesNV)) { + const int location = glslangOperands[arg]->getAsConstantUnion()->getConstArray()[0].getUConst(); + const int set = 2; auto itNode = locationToSymbol[set].find(location); visitSymbol(itNode->second); spv::Id symId = getSymbolId(itNode->second); operands.push_back(symId); -#ifndef GLSLANG_WEB } else if (glslangOperands[arg]->getAsTyped()->getQualifier().isSpirvLiteral()) { // Will be translated to a literal value, make a placeholder here operands.push_back(spv::NoResult); -#endif } else { operands.push_back(accessChainLoad(glslangOperands[arg]->getAsTyped()->getType())); } @@ -3475,42 +3637,97 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt } builder.setLine(node->getLoc().line, node->getLoc().getFilename()); -#ifndef GLSLANG_WEB - if (node->getOp() == glslang::EOpCooperativeMatrixLoad) { + if (node->getOp() == glslang::EOpCooperativeMatrixLoad || + node->getOp() == glslang::EOpCooperativeMatrixLoadNV) { std::vector idImmOps; idImmOps.push_back(spv::IdImmediate(true, operands[1])); // buf - idImmOps.push_back(spv::IdImmediate(true, operands[2])); // stride - idImmOps.push_back(spv::IdImmediate(true, operands[3])); // colMajor + if (node->getOp() == glslang::EOpCooperativeMatrixLoad) { + idImmOps.push_back(spv::IdImmediate(true, operands[3])); // matrixLayout + idImmOps.push_back(spv::IdImmediate(true, operands[2])); // stride + } else { + idImmOps.push_back(spv::IdImmediate(true, operands[2])); // stride + idImmOps.push_back(spv::IdImmediate(true, operands[3])); // colMajor + } idImmOps.insert(idImmOps.end(), memoryAccessOperands.begin(), memoryAccessOperands.end()); // get the pointee type spv::Id typeId = builder.getContainedTypeId(builder.getTypeId(operands[0])); assert(builder.isCooperativeMatrixType(typeId)); // do the op - spv::Id result = builder.createOp(spv::OpCooperativeMatrixLoadNV, typeId, idImmOps); + spv::Id result = node->getOp() == glslang::EOpCooperativeMatrixLoad + ? builder.createOp(spv::OpCooperativeMatrixLoadKHR, typeId, idImmOps) + : builder.createOp(spv::OpCooperativeMatrixLoadNV, typeId, idImmOps); // store the result to the pointer (out param 'm') builder.createStore(result, operands[0]); result = 0; - } else if (node->getOp() == glslang::EOpCooperativeMatrixStore) { + } else if (node->getOp() == glslang::EOpCooperativeMatrixStore || + node->getOp() == glslang::EOpCooperativeMatrixStoreNV) { std::vector idImmOps; idImmOps.push_back(spv::IdImmediate(true, operands[1])); // buf idImmOps.push_back(spv::IdImmediate(true, operands[0])); // object - idImmOps.push_back(spv::IdImmediate(true, operands[2])); // stride - idImmOps.push_back(spv::IdImmediate(true, operands[3])); // colMajor + if (node->getOp() == glslang::EOpCooperativeMatrixStore) { + idImmOps.push_back(spv::IdImmediate(true, operands[3])); // matrixLayout + idImmOps.push_back(spv::IdImmediate(true, operands[2])); // stride + } else { + idImmOps.push_back(spv::IdImmediate(true, operands[2])); // stride + idImmOps.push_back(spv::IdImmediate(true, operands[3])); // colMajor + } idImmOps.insert(idImmOps.end(), memoryAccessOperands.begin(), memoryAccessOperands.end()); - builder.createNoResultOp(spv::OpCooperativeMatrixStoreNV, idImmOps); + if (node->getOp() == glslang::EOpCooperativeMatrixStore) + builder.createNoResultOp(spv::OpCooperativeMatrixStoreKHR, idImmOps); + else + builder.createNoResultOp(spv::OpCooperativeMatrixStoreNV, idImmOps); result = 0; - } else -#endif - if (atomic) { + } else if (node->getOp() == glslang::EOpRayQueryGetIntersectionTriangleVertexPositionsEXT) { + std::vector idImmOps; + + idImmOps.push_back(spv::IdImmediate(true, operands[0])); // q + idImmOps.push_back(spv::IdImmediate(true, operands[1])); // committed + + spv::Id typeId = builder.makeArrayType(builder.makeVectorType(builder.makeFloatType(32), 3), + builder.makeUintConstant(3), 0); + // do the op + + spv::Op spvOp = spv::OpRayQueryGetIntersectionTriangleVertexPositionsKHR; + + spv::Id result = builder.createOp(spvOp, typeId, idImmOps); + // store the result to the pointer (out param 'm') + builder.createStore(result, operands[2]); + result = 0; + } else if (node->getOp() == glslang::EOpCooperativeMatrixMulAdd) { + uint32_t matrixOperands = 0; + + // If the optional operand is present, initialize matrixOperands to that value. + if (glslangOperands.size() == 4 && glslangOperands[3]->getAsConstantUnion()) { + matrixOperands = glslangOperands[3]->getAsConstantUnion()->getConstArray()[0].getIConst(); + } + + // Determine Cooperative Matrix Operands bits from the signedness of the types. + if (isTypeSignedInt(glslangOperands[0]->getAsTyped()->getBasicType())) + matrixOperands |= spv::CooperativeMatrixOperandsMatrixASignedComponentsMask; + if (isTypeSignedInt(glslangOperands[1]->getAsTyped()->getBasicType())) + matrixOperands |= spv::CooperativeMatrixOperandsMatrixBSignedComponentsMask; + if (isTypeSignedInt(glslangOperands[2]->getAsTyped()->getBasicType())) + matrixOperands |= spv::CooperativeMatrixOperandsMatrixCSignedComponentsMask; + if (isTypeSignedInt(node->getBasicType())) + matrixOperands |= spv::CooperativeMatrixOperandsMatrixResultSignedComponentsMask; + + std::vector idImmOps; + idImmOps.push_back(spv::IdImmediate(true, operands[0])); + idImmOps.push_back(spv::IdImmediate(true, operands[1])); + idImmOps.push_back(spv::IdImmediate(true, operands[2])); + if (matrixOperands != 0) + idImmOps.push_back(spv::IdImmediate(false, matrixOperands)); + + result = builder.createOp(spv::OpCooperativeMatrixMulAddKHR, resultType(), idImmOps); + } else if (atomic) { // Handle all atomics glslang::TBasicType typeProxy = (node->getOp() == glslang::EOpAtomicStore) ? node->getSequence()[0]->getAsTyped()->getBasicType() : node->getBasicType(); result = createAtomicOperation(node->getOp(), precision, resultType(), operands, typeProxy, lvalueCoherentFlags); -#ifndef GLSLANG_WEB } else if (node->getOp() == glslang::EOpSpirvInst) { const auto& spirvInst = node->getSpirvInstruction(); if (spirvInst.set == "") { @@ -3537,7 +3754,6 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt spirvInst.id, operands); } noReturnValue = node->getBasicType() == glslang::EbtVoid; -#endif } else if (node->getOp() == glslang::EOpDebugPrintf) { if (!nonSemanticDebugPrintf) { nonSemanticDebugPrintf = builder.import("NonSemantic.DebugPrintf"); @@ -3654,10 +3870,11 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang // Find a way of executing both sides and selecting the right result. const auto executeBothSides = [&]() -> void { // execute both sides + spv::Id resultType = convertGlslangToSpvType(node->getType()); node->getTrueBlock()->traverse(this); spv::Id trueValue = accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()); node->getFalseBlock()->traverse(this); - spv::Id falseValue = accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()); + spv::Id falseValue = accessChainLoad(node->getFalseBlock()->getAsTyped()->getType()); builder.setLine(node->getLoc().line, node->getLoc().getFilename()); @@ -3666,8 +3883,8 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang return; // emit code to select between trueValue and falseValue - - // see if OpSelect can handle it + // see if OpSelect can handle the result type, and that the SPIR-V types + // of the inputs match the result type. if (isOpSelectable()) { // Emit OpSelect for this selection. @@ -3679,10 +3896,18 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang builder.getNumComponents(trueValue))); } + // If the types do not match, it is because of mismatched decorations on aggregates. + // Since isOpSelectable only lets us get here for SPIR-V >= 1.4, we can use OpCopyObject + // to get matching types. + if (builder.getTypeId(trueValue) != resultType) { + trueValue = builder.createUnaryOp(spv::OpCopyLogical, resultType, trueValue); + } + if (builder.getTypeId(falseValue) != resultType) { + falseValue = builder.createUnaryOp(spv::OpCopyLogical, resultType, falseValue); + } + // OpSelect - result = builder.createTriOp(spv::OpSelect, - convertGlslangToSpvType(node->getType()), condition, - trueValue, falseValue); + result = builder.createTriOp(spv::OpSelect, resultType, condition, trueValue, falseValue); builder.clearAccessChain(); builder.setAccessChainRValue(result); @@ -3690,7 +3915,7 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang // We need control flow to select the result. // TODO: Once SPIR-V OpSelect allows arbitrary types, eliminate this path. result = builder.createVariable(TranslatePrecisionDecoration(node->getType()), - spv::StorageClassFunction, convertGlslangToSpvType(node->getType())); + spv::StorageClassFunction, resultType); // Selection control: const spv::SelectionControlMask control = TranslateSelectionControl(*node); @@ -3699,10 +3924,15 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang spv::Builder::If ifBuilder(condition, control, builder); // emit the "then" statement - builder.createStore(trueValue, result); + builder.clearAccessChain(); + builder.setAccessChainLValue(result); + multiTypeStore(node->getType(), trueValue); + ifBuilder.makeBeginElse(); // emit the "else" statement - builder.createStore(falseValue, result); + builder.clearAccessChain(); + builder.setAccessChainLValue(result); + multiTypeStore(node->getType(), falseValue); // finish off the control flow ifBuilder.makeEndIf(); @@ -3729,16 +3959,26 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang // emit the "then" statement if (node->getTrueBlock() != nullptr) { node->getTrueBlock()->traverse(this); - if (result != spv::NoResult) - builder.createStore(accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()), result); + if (result != spv::NoResult) { + spv::Id load = accessChainLoad(node->getTrueBlock()->getAsTyped()->getType()); + + builder.clearAccessChain(); + builder.setAccessChainLValue(result); + multiTypeStore(node->getType(), load); + } } if (node->getFalseBlock() != nullptr) { ifBuilder.makeBeginElse(); // emit the "else" statement node->getFalseBlock()->traverse(this); - if (result != spv::NoResult) - builder.createStore(accessChainLoad(node->getFalseBlock()->getAsTyped()->getType()), result); + if (result != spv::NoResult) { + spv::Id load = accessChainLoad(node->getFalseBlock()->getAsTyped()->getType()); + + builder.clearAccessChain(); + builder.setAccessChainLValue(result); + multiTypeStore(node->getType(), load); + } } // finish off the control flow @@ -3818,10 +4058,8 @@ bool TGlslangToSpvTraverser::visitSwitch(glslang::TVisit /* visit */, glslang::T void TGlslangToSpvTraverser::visitConstantUnion(glslang::TIntermConstantUnion* node) { -#ifndef GLSLANG_WEB if (node->getQualifier().isSpirvLiteral()) return; // Translated to a literal value, skip further processing -#endif int nextConst = 0; spv::Id constant = createSpvConstantFromConstUnionArray(node->getType(), node->getConstArray(), nextConst, false); @@ -3952,7 +4190,6 @@ bool TGlslangToSpvTraverser::visitBranch(glslang::TVisit /* visit */, glslang::T builder.clearAccessChain(); break; -#ifndef GLSLANG_WEB case glslang::EOpDemote: builder.createNoResultOp(spv::OpDemoteToHelperInvocationEXT); builder.addExtension(spv::E_SPV_EXT_demote_to_helper_invocation); @@ -3964,7 +4201,6 @@ bool TGlslangToSpvTraverser::visitBranch(glslang::TVisit /* visit */, glslang::T case glslang::EOpIgnoreIntersectionKHR: builder.makeStatementTerminator(spv::OpIgnoreIntersectionKHR, "post-ignoreIntersectionKHR"); break; -#endif default: assert(0); @@ -4006,7 +4242,6 @@ spv::Id TGlslangToSpvTraverser::createSpvVariable(const glslang::TIntermSymbol* else builder.addCapability(spv::CapabilityStorageUniform16); break; -#ifndef GLSLANG_WEB case spv::StorageClassPushConstant: builder.addIncorporatedExtension(spv::E_SPV_KHR_16bit_storage, spv::Spv_1_3); builder.addCapability(spv::CapabilityStoragePushConstant16); @@ -4016,7 +4251,6 @@ spv::Id TGlslangToSpvTraverser::createSpvVariable(const glslang::TIntermSymbol* builder.addIncorporatedExtension(spv::E_SPV_KHR_16bit_storage, spv::Spv_1_3); builder.addCapability(spv::CapabilityStorageUniformBufferBlock16); break; -#endif default: if (storageClass == spv::StorageClassWorkgroup && node->getType().getBasicType() == glslang::EbtBlock) { @@ -4075,7 +4309,6 @@ spv::Id TGlslangToSpvTraverser::getSampledType(const glslang::TSampler& sampler) case glslang::EbtInt: return builder.makeIntType(32); case glslang::EbtUint: return builder.makeUintType(32); case glslang::EbtFloat: return builder.makeFloatType(32); -#ifndef GLSLANG_WEB case glslang::EbtFloat16: builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float_fetch); builder.addCapability(spv::CapabilityFloat16ImageAMD); @@ -4088,7 +4321,6 @@ spv::Id TGlslangToSpvTraverser::getSampledType(const glslang::TSampler& sampler) builder.addExtension(spv::E_SPV_EXT_shader_image_int64); builder.addCapability(spv::CapabilityInt64ImageEXT); return builder.makeUintType(64); -#endif default: assert(0); return builder.makeFloatType(32); @@ -4133,6 +4365,16 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty return convertGlslangToSpvType(type, getExplicitLayout(type), type.getQualifier(), false, forwardReferenceOnly); } +spv::LinkageType TGlslangToSpvTraverser::convertGlslangLinkageToSpv(glslang::TLinkType linkType) +{ + switch (linkType) { + case glslang::ELinkExport: + return spv::LinkageTypeExport; + default: + return spv::LinkageTypeMax; + } +} + // Do full recursive conversion of an arbitrary glslang type to a SPIR-V Id. // explicitLayout can be kept the same throughout the hierarchical recursive walk. // Mutually recursive with convertGlslangStructToSpvType(). @@ -4164,7 +4406,6 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty case glslang::EbtFloat: spvType = builder.makeFloatType(32); break; -#ifndef GLSLANG_WEB case glslang::EbtDouble: spvType = builder.makeFloatType(64); break; @@ -4242,7 +4483,6 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty } } break; -#endif case glslang::EbtSampler: { const glslang::TSampler& sampler = type.getSampler(); @@ -4284,7 +4524,13 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty case glslang::EbtString: // no type used for OpString return 0; -#ifndef GLSLANG_WEB + + case glslang::EbtHitObjectNV: { + builder.addExtension(spv::E_SPV_NV_shader_invocation_reorder); + builder.addCapability(spv::CapabilityShaderInvocationReorderNV); + spvType = builder.makeHitObjectNVType(); + } + break; case glslang::EbtSpirvType: { // GL_EXT_spirv_intrinsics const auto& spirvType = type.getSpirvType(); @@ -4292,50 +4538,57 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty std::vector operands; for (const auto& typeParam : spirvType.typeParams) { - // Constant expression - if (typeParam.constant->isLiteral()) { - if (typeParam.constant->getBasicType() == glslang::EbtFloat) { - float floatValue = static_cast(typeParam.constant->getConstArray()[0].getDConst()); - unsigned literal; - static_assert(sizeof(literal) == sizeof(floatValue), "sizeof(unsigned) != sizeof(float)"); - memcpy(&literal, &floatValue, sizeof(literal)); - operands.push_back({false, literal}); - } else if (typeParam.constant->getBasicType() == glslang::EbtInt) { - unsigned literal = typeParam.constant->getConstArray()[0].getIConst(); - operands.push_back({false, literal}); - } else if (typeParam.constant->getBasicType() == glslang::EbtUint) { - unsigned literal = typeParam.constant->getConstArray()[0].getUConst(); - operands.push_back({false, literal}); - } else if (typeParam.constant->getBasicType() == glslang::EbtBool) { - unsigned literal = typeParam.constant->getConstArray()[0].getBConst(); - operands.push_back({false, literal}); - } else if (typeParam.constant->getBasicType() == glslang::EbtString) { - auto str = typeParam.constant->getConstArray()[0].getSConst()->c_str(); - unsigned literal = 0; - char* literalPtr = reinterpret_cast(&literal); - unsigned charCount = 0; - char ch = 0; - do { - ch = *(str++); - *(literalPtr++) = ch; - ++charCount; - if (charCount == 4) { + if (typeParam.getAsConstant() != nullptr) { + // Constant expression + auto constant = typeParam.getAsConstant(); + if (constant->isLiteral()) { + if (constant->getBasicType() == glslang::EbtFloat) { + float floatValue = static_cast(constant->getConstArray()[0].getDConst()); + unsigned literal; + static_assert(sizeof(literal) == sizeof(floatValue), "sizeof(unsigned) != sizeof(float)"); + memcpy(&literal, &floatValue, sizeof(literal)); + operands.push_back({false, literal}); + } else if (constant->getBasicType() == glslang::EbtInt) { + unsigned literal = constant->getConstArray()[0].getIConst(); + operands.push_back({false, literal}); + } else if (constant->getBasicType() == glslang::EbtUint) { + unsigned literal = constant->getConstArray()[0].getUConst(); + operands.push_back({false, literal}); + } else if (constant->getBasicType() == glslang::EbtBool) { + unsigned literal = constant->getConstArray()[0].getBConst(); + operands.push_back({false, literal}); + } else if (constant->getBasicType() == glslang::EbtString) { + auto str = constant->getConstArray()[0].getSConst()->c_str(); + unsigned literal = 0; + char* literalPtr = reinterpret_cast(&literal); + unsigned charCount = 0; + char ch = 0; + do { + ch = *(str++); + *(literalPtr++) = ch; + ++charCount; + if (charCount == 4) { + operands.push_back({false, literal}); + literalPtr = reinterpret_cast(&literal); + charCount = 0; + } + } while (ch != 0); + + // Partial literal is padded with 0 + if (charCount > 0) { + for (; charCount < 4; ++charCount) + *(literalPtr++) = 0; operands.push_back({false, literal}); - literalPtr = reinterpret_cast(&literal); - charCount = 0; } - } while (ch != 0); - - // Partial literal is padded with 0 - if (charCount > 0) { - for (; charCount < 4; ++charCount) - *(literalPtr++) = 0; - operands.push_back({false, literal}); - } + } else + assert(0); // Unexpected type } else - assert(0); // Unexpected type - } else - operands.push_back({true, createSpvConstant(*typeParam.constant)}); + operands.push_back({true, createSpvConstant(*constant)}); + } else { + // Type specifier + assert(typeParam.getAsType() != nullptr); + operands.push_back({true, convertGlslangToSpvType(*typeParam.getAsType())}); + } } assert(spirvInst.set == ""); // Currently, couldn't be extended instructions. @@ -4343,7 +4596,6 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty break; } -#endif default: assert(0); break; @@ -4357,9 +4609,10 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty spvType = builder.makeVectorType(spvType, type.getVectorSize()); } - if (type.isCoopMat()) { + if (type.isCoopMatNV()) { builder.addCapability(spv::CapabilityCooperativeMatrixNV); builder.addExtension(spv::E_SPV_NV_cooperative_matrix); + if (type.getBasicType() == glslang::EbtFloat16) builder.addCapability(spv::CapabilityFloat16); if (type.getBasicType() == glslang::EbtUint8 || @@ -4367,11 +4620,29 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty builder.addCapability(spv::CapabilityInt8); } - spv::Id scope = makeArraySizeId(*type.getTypeParameters(), 1); - spv::Id rows = makeArraySizeId(*type.getTypeParameters(), 2); - spv::Id cols = makeArraySizeId(*type.getTypeParameters(), 3); + spv::Id scope = makeArraySizeId(*type.getTypeParameters()->arraySizes, 1); + spv::Id rows = makeArraySizeId(*type.getTypeParameters()->arraySizes, 2); + spv::Id cols = makeArraySizeId(*type.getTypeParameters()->arraySizes, 3); - spvType = builder.makeCooperativeMatrixType(spvType, scope, rows, cols); + spvType = builder.makeCooperativeMatrixTypeNV(spvType, scope, rows, cols); + } + + if (type.isCoopMatKHR()) { + builder.addCapability(spv::CapabilityCooperativeMatrixKHR); + builder.addExtension(spv::E_SPV_KHR_cooperative_matrix); + + if (type.getBasicType() == glslang::EbtFloat16) + builder.addCapability(spv::CapabilityFloat16); + if (type.getBasicType() == glslang::EbtUint8 || type.getBasicType() == glslang::EbtInt8) { + builder.addCapability(spv::CapabilityInt8); + } + + spv::Id scope = makeArraySizeId(*type.getTypeParameters()->arraySizes, 0); + spv::Id rows = makeArraySizeId(*type.getTypeParameters()->arraySizes, 1); + spv::Id cols = makeArraySizeId(*type.getTypeParameters()->arraySizes, 2); + spv::Id use = builder.makeUintConstant(type.getCoopMatKHRuse()); + + spvType = builder.makeCooperativeMatrixTypeKHR(spvType, scope, rows, cols, use); } if (type.isArray()) { @@ -4412,12 +4683,10 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty if (type.isSizedArray()) spvType = builder.makeArrayType(spvType, makeArraySizeId(*type.getArraySizes(), 0), stride); else { -#ifndef GLSLANG_WEB if (!lastBufferBlockMember) { builder.addIncorporatedExtension("SPV_EXT_descriptor_indexing", spv::Spv_1_5); builder.addCapability(spv::CapabilityRuntimeDescriptorArrayEXT); } -#endif spvType = builder.makeRuntimeArray(spvType); } if (stride > 0) @@ -4433,7 +4702,6 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty // bool TGlslangToSpvTraverser::filterMember(const glslang::TType& member) { -#ifndef GLSLANG_WEB auto& extensions = glslangIntermediate->getRequestedExtensions(); if (member.getFieldName() == "gl_SecondaryViewportMaskNV" && @@ -4443,6 +4711,12 @@ bool TGlslangToSpvTraverser::filterMember(const glslang::TType& member) extensions.find("GL_NV_stereo_view_rendering") == extensions.end()) return true; + if (glslangIntermediate->getStage() == EShLangMesh) { + if (member.getFieldName() == "gl_PrimitiveShadingRateEXT" && + extensions.find("GL_EXT_fragment_shading_rate") == extensions.end()) + return true; + } + if (glslangIntermediate->getStage() != EShLangMesh) { if (member.getFieldName() == "gl_ViewportMask" && extensions.find("GL_NV_viewport_array2") == extensions.end()) @@ -4454,7 +4728,6 @@ bool TGlslangToSpvTraverser::filterMember(const glslang::TType& member) extensions.find("GL_NVX_multiview_per_view_attributes") == extensions.end()) return true; } -#endif return false; }; @@ -4535,7 +4808,7 @@ spv::Id TGlslangToSpvTraverser::convertGlslangStructToSpvType(const glslang::TTy structMap[explicitLayout][qualifier.layoutMatrix][glslangMembers] = spvType; // Decorate it - decorateStructType(type, glslangMembers, explicitLayout, qualifier, spvType); + decorateStructType(type, glslangMembers, explicitLayout, qualifier, spvType, spvMembers); for (int i = 0; i < (int)deferredForwardPointers.size(); ++i) { auto it = deferredForwardPointers[i]; @@ -4549,7 +4822,8 @@ void TGlslangToSpvTraverser::decorateStructType(const glslang::TType& type, const glslang::TTypeList* glslangMembers, glslang::TLayoutPacking explicitLayout, const glslang::TQualifier& qualifier, - spv::Id spvType) + spv::Id spvType, + const std::vector& spvMembers) { // Name and decorate the non-hidden members int offset = -1; @@ -4584,14 +4858,11 @@ void TGlslangToSpvTraverser::decorateStructType(const glslang::TType& type, glslangIntermediate->getSource() == glslang::EShSourceHlsl) { builder.addMemberDecoration(spvType, member, TranslateInterpolationDecoration(memberQualifier)); builder.addMemberDecoration(spvType, member, TranslateAuxiliaryStorageDecoration(memberQualifier)); -#ifndef GLSLANG_WEB addMeshNVDecoration(spvType, member, memberQualifier); -#endif } } builder.addMemberDecoration(spvType, member, TranslateInvariantDecoration(memberQualifier)); -#ifndef GLSLANG_WEB if (type.getBasicType() == glslang::EbtBlock && qualifier.storage == glslang::EvqBuffer) { // Add memory decorations only to top-level members of shader storage block @@ -4601,8 +4872,6 @@ void TGlslangToSpvTraverser::decorateStructType(const glslang::TType& type, builder.addMemberDecoration(spvType, member, memory[i]); } -#endif - // Location assignment was already completed correctly by the front end, // just track whether a member needs to be decorated. // Ignore member locations if the container is an array, as that's @@ -4635,7 +4904,6 @@ void TGlslangToSpvTraverser::decorateStructType(const glslang::TType& type, if (builtIn != spv::BuiltInMax) builder.addMemberDecoration(spvType, member, spv::DecorationBuiltIn, (int)builtIn); -#ifndef GLSLANG_WEB // nonuniform builder.addMemberDecoration(spvType, member, TranslateNonUniformDecoration(glslangMember.getQualifier())); @@ -4697,19 +4965,30 @@ void TGlslangToSpvTraverser::decorateStructType(const glslang::TType& type, builder.addDecoration(spvType, static_cast(decorateString.first), strings); } } -#endif } // Decorate the structure builder.addDecoration(spvType, TranslateLayoutDecoration(type, qualifier.layoutMatrix)); - builder.addDecoration(spvType, TranslateBlockDecoration(type, glslangIntermediate->usingStorageBuffer())); + const auto basicType = type.getBasicType(); + const auto typeStorageQualifier = type.getQualifier().storage; + if (basicType == glslang::EbtBlock) { + builder.addDecoration(spvType, TranslateBlockDecoration(typeStorageQualifier, glslangIntermediate->usingStorageBuffer())); + } else if (basicType == glslang::EbtStruct && glslangIntermediate->getSpv().vulkan > 0) { + const auto hasRuntimeArray = !spvMembers.empty() && builder.getOpCode(spvMembers.back()) == spv::OpTypeRuntimeArray; + if (hasRuntimeArray) { + builder.addDecoration(spvType, TranslateBlockDecoration(typeStorageQualifier, glslangIntermediate->usingStorageBuffer())); + } + } + + if (qualifier.hasHitObjectShaderRecordNV()) + builder.addDecoration(spvType, spv::DecorationHitObjectShaderRecordBufferNV); } // Turn the expression forming the array size into an id. // This is not quite trivial, because of specialization constants. // Sometimes, a raw constant is turned into an Id, and sometimes // a specialization constant expression is. -spv::Id TGlslangToSpvTraverser::makeArraySizeId(const glslang::TArraySizes& arraySizes, int dim) +spv::Id TGlslangToSpvTraverser::makeArraySizeId(const glslang::TArraySizes& arraySizes, int dim, bool allowZero) { // First, see if this is sized with a node, meaning a specialization constant: glslang::TIntermTyped* specNode = arraySizes.getDimNode(dim); @@ -4723,7 +5002,10 @@ spv::Id TGlslangToSpvTraverser::makeArraySizeId(const glslang::TArraySizes& arra // Otherwise, need a compile-time (front end) size, get it: int size = arraySizes.getDimSize(dim); - assert(size > 0); + + if (!allowZero) + assert(size > 0); + return builder.makeUintConstant(size); } @@ -4739,6 +5021,16 @@ spv::Id TGlslangToSpvTraverser::accessChainLoad(const glslang::TType& type) spv::Builder::AccessChain::CoherentFlags coherentFlags = builder.getAccessChain().coherentFlags; coherentFlags |= TranslateCoherent(type); + spv::MemoryAccessMask accessMask = spv::MemoryAccessMask(TranslateMemoryAccess(coherentFlags) & ~spv::MemoryAccessMakePointerAvailableKHRMask); + // If the value being loaded is HelperInvocation, SPIR-V 1.6 is being generated (so that + // SPV_EXT_demote_to_helper_invocation is in core) and the memory model is in use, add + // the Volatile MemoryAccess semantic. + if (type.getQualifier().builtIn == glslang::EbvHelperInvocation && + glslangIntermediate->usingVulkanMemoryModel() && + glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6) { + accessMask = spv::MemoryAccessMask(accessMask | spv::MemoryAccessVolatileMask); + } + unsigned int alignment = builder.getAccessChain().alignment; alignment |= type.getBufferReferenceAlignment(); @@ -4746,7 +5038,7 @@ spv::Id TGlslangToSpvTraverser::accessChainLoad(const glslang::TType& type) TranslateNonUniformDecoration(builder.getAccessChain().coherentFlags), TranslateNonUniformDecoration(type.getQualifier()), nominalTypeId, - spv::MemoryAccessMask(TranslateMemoryAccess(coherentFlags) & ~spv::MemoryAccessMakePointerAvailableKHRMask), + accessMask, TranslateMemoryScope(coherentFlags), alignment); @@ -5018,7 +5310,6 @@ void TGlslangToSpvTraverser::declareUseOfStructMember(const glslang::TTypeList& switch (glslangBuiltIn) { case glslang::EbvPointSize: -#ifndef GLSLANG_WEB case glslang::EbvClipDistance: case glslang::EbvCullDistance: case glslang::EbvViewportMaskNV: @@ -5034,7 +5325,6 @@ void TGlslangToSpvTraverser::declareUseOfStructMember(const glslang::TTypeList& case glslang::EbvLayerPerViewNV: case glslang::EbvMeshViewCountNV: case glslang::EbvMeshViewIndicesNV: -#endif // Generate the associated capability. Delegate to TranslateBuiltInDecoration. // Alternately, we could just call this for any glslang built-in, since the // capability already guards against duplicates. @@ -5073,10 +5363,8 @@ bool TGlslangToSpvTraverser::originalParam(glslang::TStorageQualifier qualifier, return true; if (glslangIntermediate->getSource() == glslang::EShSourceHlsl) return paramType.getBasicType() == glslang::EbtBlock; - return paramType.containsOpaque() || // sampler, etc. -#ifndef GLSLANG_WEB + return (paramType.containsOpaque() && !glslangIntermediate->getBindlessMode()) || // sampler, etc. paramType.getQualifier().isSpirvByReference() || // spirv_by_reference -#endif (paramType.getBasicType() == glslang::EbtBlock && qualifier == glslang::EvqBuffer); // SSBO } @@ -5154,10 +5442,10 @@ void TGlslangToSpvTraverser::makeFunctions(const glslang::TIntermSequence& glslF } spv::Block* functionBlock; - spv::Function *function = builder.makeFunctionEntry(TranslatePrecisionDecoration(glslFunction->getType()), - convertGlslangToSpvType(glslFunction->getType()), - glslFunction->getName().c_str(), paramTypes, paramNames, - paramDecorations, &functionBlock); + spv::Function* function = builder.makeFunctionEntry( + TranslatePrecisionDecoration(glslFunction->getType()), convertGlslangToSpvType(glslFunction->getType()), + glslFunction->getName().c_str(), convertGlslangLinkageToSpv(glslFunction->getLinkType()), paramTypes, + paramNames, paramDecorations, &functionBlock); if (implicitThis) function->setImplicitThis(); @@ -5220,6 +5508,10 @@ void TGlslangToSpvTraverser::collectRayTracingLinkerObjects() set = 1; break; + case glslang::EvqHitObjectAttrNV: + set = 2; + break; + default: set = -1; } @@ -5256,23 +5548,18 @@ void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate& glslang::TSampler sampler = {}; bool cubeCompare = false; -#ifndef GLSLANG_WEB bool f16ShadowCompare = false; -#endif if (node.isTexture() || node.isImage()) { sampler = glslangArguments[0]->getAsTyped()->getType().getSampler(); cubeCompare = sampler.dim == glslang::EsdCube && sampler.arrayed && sampler.shadow; -#ifndef GLSLANG_WEB f16ShadowCompare = sampler.shadow && glslangArguments[1]->getAsTyped()->getType().getBasicType() == glslang::EbtFloat16; -#endif } for (int i = 0; i < (int)glslangArguments.size(); ++i) { builder.clearAccessChain(); glslangArguments[i]->traverse(this); -#ifndef GLSLANG_WEB // Special case l-value operands bool lvalue = false; switch (node.getOp()) { @@ -5368,6 +5655,10 @@ void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate& if (i == 7) lvalue = true; break; + case glslang::EOpRayQueryGetIntersectionTriangleVertexPositionsEXT: + if (i == 2) + lvalue = true; + break; default: break; } @@ -5379,7 +5670,6 @@ void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate& builder.addDecoration(lvalue_id, TranslateNonUniformDecoration(lvalueCoherentFlags)); lvalueCoherentFlags |= TranslateCoherent(glslangArguments[i]->getAsTyped()->getType()); } else -#endif arguments.push_back(accessChainLoad(glslangArguments[i]->getAsTyped()->getType())); } } @@ -5404,13 +5694,9 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO ? node->getAsAggregate()->getSequence()[0]->getAsTyped()->getType() : node->getAsUnaryNode()->getOperand()->getAsTyped()->getType(); const glslang::TSampler sampler = imageType.getSampler(); -#ifdef GLSLANG_WEB - const bool f16ShadowCompare = false; -#else bool f16ShadowCompare = (sampler.shadow && node->getAsAggregate()) ? node->getAsAggregate()->getSequence()[1]->getAsTyped()->getType().getBasicType() == glslang::EbtFloat16 : false; -#endif const auto signExtensionMask = [&]() { if (builder.getSpvVersion() >= spv::Spv_1_4) { @@ -5456,7 +5742,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO return builder.createTextureQueryCall(spv::OpImageQuerySizeLod, params, isUnsignedResult); } else return builder.createTextureQueryCall(spv::OpImageQuerySize, params, isUnsignedResult); -#ifndef GLSLANG_WEB case glslang::EOpImageQuerySamples: case glslang::EOpTextureQuerySamples: return builder.createTextureQueryCall(spv::OpImageQuerySamples, params, isUnsignedResult); @@ -5467,7 +5752,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO return builder.createTextureQueryCall(spv::OpImageQueryLevels, params, isUnsignedResult); case glslang::EOpSparseTexelsResident: return builder.createUnaryOp(spv::OpImageSparseTexelsResident, builder.makeBoolType(), arguments[0]); -#endif default: assert(0); break; @@ -5527,6 +5811,17 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO return result; } + if (cracked.attachmentEXT) { + if (opIt != arguments.end()) { + spv::IdImmediate sample = { true, *opIt }; + operands.push_back(sample); + } + spv::Id result = builder.createOp(spv::OpColorAttachmentReadEXT, resultType(), operands); + builder.addExtension(spv::E_SPV_EXT_shader_tile_image); + builder.setPrecision(result, precision); + return result; + } + spv::IdImmediate coord = { true, *(opIt++) }; operands.push_back(coord); if (node->getOp() == glslang::EOpImageLoad || node->getOp() == glslang::EOpImageLoadLod) { @@ -5698,7 +5993,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO } } -#ifndef GLSLANG_WEB // Check for fragment mask functions other than queries if (cracked.fragMask) { assert(sampler.ms); @@ -5732,7 +6026,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO builder.addCapability(spv::CapabilityFragmentMaskAMD); return builder.createOp(fragMaskOp, resultType(), operands); } -#endif // Check for texture functions other than queries bool sparse = node->isSparseTexture(); @@ -5766,7 +6059,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO bias = true; } -#ifndef GLSLANG_WEB if (cracked.gather) { const auto& sourceExtensions = glslangIntermediate->getRequestedExtensions(); if (bias || cracked.lod || @@ -5775,7 +6067,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO builder.addCapability(spv::CapabilityImageGatherBiasLodAMD); } } -#endif // set the rest of the arguments @@ -5835,7 +6126,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO ++extraArgs; } -#ifndef GLSLANG_WEB // lod clamp if (cracked.lodClamp) { params.lodClamp = arguments[2 + extraArgs]; @@ -5864,14 +6154,13 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO resultStruct = arguments[4 + extraArgs]; extraArgs += 3; } -#endif + // bias if (bias) { params.bias = arguments[2 + extraArgs]; ++extraArgs; } -#ifndef GLSLANG_WEB if (imageFootprint) { builder.addExtension(spv::E_SPV_NV_shader_image_footprint); builder.addCapability(spv::CapabilityImageFootprintNV); @@ -5929,7 +6218,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO } return builder.createCompositeExtract(res, resultType(), 0); } -#endif // projective component (might not to move) // GLSL: "The texture coordinates consumed from P, not including the last component of P, @@ -5954,7 +6242,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO } } -#ifndef GLSLANG_WEB // nonprivate if (imageType.getQualifier().nonprivate) { params.nonprivate = true; @@ -5964,7 +6251,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO if (imageType.getQualifier().volatil) { params.volatil = true; } -#endif std::vector result( 1, builder.createTextureCall(precision, resultType(), sparse, cracked.fetch, cracked.proj, cracked.gather, @@ -6618,7 +6904,6 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDe case glslang::EOpUnpackHalf2x16: libCall = spv::GLSLstd450UnpackHalf2x16; break; -#ifndef GLSLANG_WEB case glslang::EOpPackSnorm4x8: libCall = spv::GLSLstd450PackSnorm4x8; break; @@ -6637,7 +6922,6 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDe case glslang::EOpUnpackDouble2x32: libCall = spv::GLSLstd450UnpackDouble2x32; break; -#endif case glslang::EOpPackInt2x32: case glslang::EOpUnpackInt2x32: @@ -6692,7 +6976,6 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDe libCall = spv::GLSLstd450SSign; break; -#ifndef GLSLANG_WEB case glslang::EOpDPdxFine: unaryOp = spv::OpDPdxFine; break; @@ -6864,12 +7147,108 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDe case glslang::EOpConvUvec2ToAccStruct: unaryOp = spv::OpConvertUToAccelerationStructureKHR; break; -#endif + + case glslang::EOpHitObjectIsEmptyNV: + unaryOp = spv::OpHitObjectIsEmptyNV; + break; + + case glslang::EOpHitObjectIsMissNV: + unaryOp = spv::OpHitObjectIsMissNV; + break; + + case glslang::EOpHitObjectIsHitNV: + unaryOp = spv::OpHitObjectIsHitNV; + break; + + case glslang::EOpHitObjectGetObjectRayOriginNV: + unaryOp = spv::OpHitObjectGetObjectRayOriginNV; + break; + + case glslang::EOpHitObjectGetObjectRayDirectionNV: + unaryOp = spv::OpHitObjectGetObjectRayDirectionNV; + break; + + case glslang::EOpHitObjectGetWorldRayOriginNV: + unaryOp = spv::OpHitObjectGetWorldRayOriginNV; + break; + + case glslang::EOpHitObjectGetWorldRayDirectionNV: + unaryOp = spv::OpHitObjectGetWorldRayDirectionNV; + break; + + case glslang::EOpHitObjectGetObjectToWorldNV: + unaryOp = spv::OpHitObjectGetObjectToWorldNV; + break; + + case glslang::EOpHitObjectGetWorldToObjectNV: + unaryOp = spv::OpHitObjectGetWorldToObjectNV; + break; + + case glslang::EOpHitObjectGetRayTMinNV: + unaryOp = spv::OpHitObjectGetRayTMinNV; + break; + + case glslang::EOpHitObjectGetRayTMaxNV: + unaryOp = spv::OpHitObjectGetRayTMaxNV; + break; + + case glslang::EOpHitObjectGetPrimitiveIndexNV: + unaryOp = spv::OpHitObjectGetPrimitiveIndexNV; + break; + + case glslang::EOpHitObjectGetInstanceIdNV: + unaryOp = spv::OpHitObjectGetInstanceIdNV; + break; + + case glslang::EOpHitObjectGetInstanceCustomIndexNV: + unaryOp = spv::OpHitObjectGetInstanceCustomIndexNV; + break; + + case glslang::EOpHitObjectGetGeometryIndexNV: + unaryOp = spv::OpHitObjectGetGeometryIndexNV; + break; + + case glslang::EOpHitObjectGetHitKindNV: + unaryOp = spv::OpHitObjectGetHitKindNV; + break; + + case glslang::EOpHitObjectGetCurrentTimeNV: + unaryOp = spv::OpHitObjectGetCurrentTimeNV; + break; + + case glslang::EOpHitObjectGetShaderBindingTableRecordIndexNV: + unaryOp = spv::OpHitObjectGetShaderBindingTableRecordIndexNV; + break; + + case glslang::EOpHitObjectGetShaderRecordBufferHandleNV: + unaryOp = spv::OpHitObjectGetShaderRecordBufferHandleNV; + break; + + case glslang::EOpFetchMicroTriangleVertexPositionNV: + unaryOp = spv::OpFetchMicroTriangleVertexPositionNV; + break; + + case glslang::EOpFetchMicroTriangleVertexBarycentricNV: + unaryOp = spv::OpFetchMicroTriangleVertexBarycentricNV; + break; case glslang::EOpCopyObject: unaryOp = spv::OpCopyObject; break; + case glslang::EOpDepthAttachmentReadEXT: + builder.addExtension(spv::E_SPV_EXT_shader_tile_image); + builder.addCapability(spv::CapabilityTileImageDepthReadAccessEXT); + unaryOp = spv::OpDepthAttachmentReadEXT; + decorations.precision = spv::NoPrecision; + break; + case glslang::EOpStencilAttachmentReadEXT: + builder.addExtension(spv::E_SPV_EXT_shader_tile_image); + builder.addCapability(spv::CapabilityTileImageStencilReadAccessEXT); + unaryOp = spv::OpStencilAttachmentReadEXT; + decorations.precision = spv::DecorationRelaxedPrecision; + break; + default: return 0; } @@ -6926,7 +7305,9 @@ spv::Id TGlslangToSpvTraverser::createUnaryMatrixOperation(spv::Op op, OpDecorat // For converting integers where both the bitwidth and the signedness could // change, but only do the width change here. The caller is still responsible // for the signedness conversion. -spv::Id TGlslangToSpvTraverser::createIntWidthConversion(glslang::TOperator op, spv::Id operand, int vectorSize) +// destType is the final type that will be converted to, but this function +// may only be doing part of that conversion. +spv::Id TGlslangToSpvTraverser::createIntWidthConversion(glslang::TOperator op, spv::Id operand, int vectorSize, spv::Id destType) { // Get the result type width, based on the type to convert to. int width = 32; @@ -6997,6 +7378,11 @@ spv::Id TGlslangToSpvTraverser::createIntWidthConversion(glslang::TOperator op, if (vectorSize > 0) type = builder.makeVectorType(type, vectorSize); + else if (builder.getOpCode(destType) == spv::OpTypeCooperativeMatrixKHR || + builder.getOpCode(destType) == spv::OpTypeCooperativeMatrixNV) { + + type = builder.makeCooperativeMatrixTypeWithSameShape(type, destType); + } return builder.createUnaryOp(convOp, type, operand); } @@ -7028,13 +7414,10 @@ spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, OpDecora case glslang::EOpConvBoolToInt: case glslang::EOpConvBoolToInt64: -#ifndef GLSLANG_WEB if (op == glslang::EOpConvBoolToInt64) { zero = builder.makeInt64Constant(0); one = builder.makeInt64Constant(1); - } else -#endif - { + } else { zero = builder.makeIntConstant(0); one = builder.makeIntConstant(1); } @@ -7044,13 +7427,10 @@ spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, OpDecora case glslang::EOpConvBoolToUint: case glslang::EOpConvBoolToUint64: -#ifndef GLSLANG_WEB if (op == glslang::EOpConvBoolToUint64) { zero = builder.makeUint64Constant(0); one = builder.makeUint64Constant(1); - } else -#endif - { + } else { zero = builder.makeUintConstant(0); one = builder.makeUintConstant(1); } @@ -7113,16 +7493,13 @@ spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, OpDecora case glslang::EOpConvInt64ToUint64: if (builder.isInSpecConstCodeGenMode()) { // Build zero scalar or vector for OpIAdd. -#ifndef GLSLANG_WEB if(op == glslang::EOpConvUint8ToInt8 || op == glslang::EOpConvInt8ToUint8) { zero = builder.makeUint8Constant(0); } else if (op == glslang::EOpConvUint16ToInt16 || op == glslang::EOpConvInt16ToUint16) { zero = builder.makeUint16Constant(0); } else if (op == glslang::EOpConvUint64ToInt64 || op == glslang::EOpConvInt64ToUint64) { zero = builder.makeUint64Constant(0); - } else -#endif - { + } else { zero = builder.makeUintConstant(0); } zero = makeSmearedConstant(zero, vectorSize); @@ -7149,7 +7526,6 @@ spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, OpDecora convOp = spv::OpConvertFToU; break; -#ifndef GLSLANG_WEB case glslang::EOpConvInt8ToBool: case glslang::EOpConvUint8ToBool: zero = builder.makeUint8Constant(0); @@ -7269,7 +7645,7 @@ spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, OpDecora case glslang::EOpConvUint64ToInt16: case glslang::EOpConvUint64ToInt: // OpSConvert/OpUConvert + OpBitCast - operand = createIntWidthConversion(op, operand, vectorSize); + operand = createIntWidthConversion(op, operand, vectorSize, destType); if (builder.isInSpecConstCodeGenMode()) { // Build zero scalar or vector for OpIAdd. @@ -7328,7 +7704,6 @@ spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, OpDecora case glslang::EOpConvUvec2ToPtr: convOp = spv::OpBitcast; break; -#endif default: break; @@ -8320,7 +8695,6 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv:: } break; -#ifndef GLSLANG_WEB case glslang::EOpInterpolateAtSample: if (typeProxy == glslang::EbtFloat16) builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float); @@ -8602,10 +8976,157 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv:: case glslang::EOpSetMeshOutputsEXT: builder.createNoResultOp(spv::OpSetMeshOutputsEXT, operands); return 0; - case glslang::EOpCooperativeMatrixMulAdd: + case glslang::EOpCooperativeMatrixMulAddNV: opCode = spv::OpCooperativeMatrixMulAddNV; break; -#endif // GLSLANG_WEB + case glslang::EOpHitObjectTraceRayNV: + builder.createNoResultOp(spv::OpHitObjectTraceRayNV, operands); + return 0; + case glslang::EOpHitObjectTraceRayMotionNV: + builder.createNoResultOp(spv::OpHitObjectTraceRayMotionNV, operands); + return 0; + case glslang::EOpHitObjectRecordHitNV: + builder.createNoResultOp(spv::OpHitObjectRecordHitNV, operands); + return 0; + case glslang::EOpHitObjectRecordHitMotionNV: + builder.createNoResultOp(spv::OpHitObjectRecordHitMotionNV, operands); + return 0; + case glslang::EOpHitObjectRecordHitWithIndexNV: + builder.createNoResultOp(spv::OpHitObjectRecordHitWithIndexNV, operands); + return 0; + case glslang::EOpHitObjectRecordHitWithIndexMotionNV: + builder.createNoResultOp(spv::OpHitObjectRecordHitWithIndexMotionNV, operands); + return 0; + case glslang::EOpHitObjectRecordMissNV: + builder.createNoResultOp(spv::OpHitObjectRecordMissNV, operands); + return 0; + case glslang::EOpHitObjectRecordMissMotionNV: + builder.createNoResultOp(spv::OpHitObjectRecordMissMotionNV, operands); + return 0; + case glslang::EOpHitObjectExecuteShaderNV: + builder.createNoResultOp(spv::OpHitObjectExecuteShaderNV, operands); + return 0; + case glslang::EOpHitObjectIsEmptyNV: + typeId = builder.makeBoolType(); + opCode = spv::OpHitObjectIsEmptyNV; + break; + case glslang::EOpHitObjectIsMissNV: + typeId = builder.makeBoolType(); + opCode = spv::OpHitObjectIsMissNV; + break; + case glslang::EOpHitObjectIsHitNV: + typeId = builder.makeBoolType(); + opCode = spv::OpHitObjectIsHitNV; + break; + case glslang::EOpHitObjectGetRayTMinNV: + typeId = builder.makeFloatType(32); + opCode = spv::OpHitObjectGetRayTMinNV; + break; + case glslang::EOpHitObjectGetRayTMaxNV: + typeId = builder.makeFloatType(32); + opCode = spv::OpHitObjectGetRayTMaxNV; + break; + case glslang::EOpHitObjectGetObjectRayOriginNV: + typeId = builder.makeVectorType(builder.makeFloatType(32), 3); + opCode = spv::OpHitObjectGetObjectRayOriginNV; + break; + case glslang::EOpHitObjectGetObjectRayDirectionNV: + typeId = builder.makeVectorType(builder.makeFloatType(32), 3); + opCode = spv::OpHitObjectGetObjectRayDirectionNV; + break; + case glslang::EOpHitObjectGetWorldRayOriginNV: + typeId = builder.makeVectorType(builder.makeFloatType(32), 3); + opCode = spv::OpHitObjectGetWorldRayOriginNV; + break; + case glslang::EOpHitObjectGetWorldRayDirectionNV: + typeId = builder.makeVectorType(builder.makeFloatType(32), 3); + opCode = spv::OpHitObjectGetWorldRayDirectionNV; + break; + case glslang::EOpHitObjectGetWorldToObjectNV: + typeId = builder.makeMatrixType(builder.makeFloatType(32), 4, 3); + opCode = spv::OpHitObjectGetWorldToObjectNV; + break; + case glslang::EOpHitObjectGetObjectToWorldNV: + typeId = builder.makeMatrixType(builder.makeFloatType(32), 4, 3); + opCode = spv::OpHitObjectGetObjectToWorldNV; + break; + case glslang::EOpHitObjectGetInstanceCustomIndexNV: + typeId = builder.makeIntegerType(32, 1); + opCode = spv::OpHitObjectGetInstanceCustomIndexNV; + break; + case glslang::EOpHitObjectGetInstanceIdNV: + typeId = builder.makeIntegerType(32, 1); + opCode = spv::OpHitObjectGetInstanceIdNV; + break; + case glslang::EOpHitObjectGetGeometryIndexNV: + typeId = builder.makeIntegerType(32, 1); + opCode = spv::OpHitObjectGetGeometryIndexNV; + break; + case glslang::EOpHitObjectGetPrimitiveIndexNV: + typeId = builder.makeIntegerType(32, 1); + opCode = spv::OpHitObjectGetPrimitiveIndexNV; + break; + case glslang::EOpHitObjectGetHitKindNV: + typeId = builder.makeIntegerType(32, 0); + opCode = spv::OpHitObjectGetHitKindNV; + break; + case glslang::EOpHitObjectGetCurrentTimeNV: + typeId = builder.makeFloatType(32); + opCode = spv::OpHitObjectGetCurrentTimeNV; + break; + case glslang::EOpHitObjectGetShaderBindingTableRecordIndexNV: + typeId = builder.makeIntegerType(32, 0); + opCode = spv::OpHitObjectGetShaderBindingTableRecordIndexNV; + return 0; + case glslang::EOpHitObjectGetAttributesNV: + builder.createNoResultOp(spv::OpHitObjectGetAttributesNV, operands); + return 0; + case glslang::EOpHitObjectGetShaderRecordBufferHandleNV: + typeId = builder.makeVectorType(builder.makeUintType(32), 2); + opCode = spv::OpHitObjectGetShaderRecordBufferHandleNV; + break; + case glslang::EOpReorderThreadNV: { + if (operands.size() == 2) { + builder.createNoResultOp(spv::OpReorderThreadWithHintNV, operands); + } else { + builder.createNoResultOp(spv::OpReorderThreadWithHitObjectNV, operands); + } + return 0; + + } + + case glslang::EOpImageSampleWeightedQCOM: + typeId = builder.makeVectorType(builder.makeFloatType(32), 4); + opCode = spv::OpImageSampleWeightedQCOM; + addImageProcessingQCOMDecoration(operands[2], spv::DecorationWeightTextureQCOM); + break; + case glslang::EOpImageBoxFilterQCOM: + typeId = builder.makeVectorType(builder.makeFloatType(32), 4); + opCode = spv::OpImageBoxFilterQCOM; + break; + case glslang::EOpImageBlockMatchSADQCOM: + typeId = builder.makeVectorType(builder.makeFloatType(32), 4); + opCode = spv::OpImageBlockMatchSADQCOM; + addImageProcessingQCOMDecoration(operands[0], spv::DecorationBlockMatchTextureQCOM); + addImageProcessingQCOMDecoration(operands[2], spv::DecorationBlockMatchTextureQCOM); + break; + case glslang::EOpImageBlockMatchSSDQCOM: + typeId = builder.makeVectorType(builder.makeFloatType(32), 4); + opCode = spv::OpImageBlockMatchSSDQCOM; + addImageProcessingQCOMDecoration(operands[0], spv::DecorationBlockMatchTextureQCOM); + addImageProcessingQCOMDecoration(operands[2], spv::DecorationBlockMatchTextureQCOM); + break; + + case glslang::EOpFetchMicroTriangleVertexBarycentricNV: + typeId = builder.makeVectorType(builder.makeFloatType(32), 2); + opCode = spv::OpFetchMicroTriangleVertexBarycentricNV; + break; + + case glslang::EOpFetchMicroTriangleVertexPositionNV: + typeId = builder.makeVectorType(builder.makeFloatType(32), 3); + opCode = spv::OpFetchMicroTriangleVertexPositionNV; + break; + default: return 0; } @@ -8649,7 +9170,6 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv:: } } -#ifndef GLSLANG_WEB // Decode the return types that were structures switch (op) { case glslang::EOpAddCarry: @@ -8679,7 +9199,6 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv:: default: break; } -#endif return builder.setPrecision(id, precision); } @@ -8724,7 +9243,6 @@ spv::Id TGlslangToSpvTraverser::createNoArgOperation(glslang::TOperator op, spv: builder.createMemoryBarrier(spv::ScopeWorkgroup, spv::MemorySemanticsAllMemory | spv::MemorySemanticsAcquireReleaseMask); return 0; -#ifndef GLSLANG_WEB case glslang::EOpMemoryBarrierAtomicCounter: builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsAtomicCounterMemoryMask | spv::MemorySemanticsAcquireReleaseMask); @@ -8843,7 +9361,30 @@ spv::Id TGlslangToSpvTraverser::createNoArgOperation(glslang::TOperator op, spv: builder.addCapability(spv::CapabilityShaderClockKHR); return builder.createOp(spv::OpReadClockKHR, typeId, args); } -#endif + case glslang::EOpStencilAttachmentReadEXT: + case glslang::EOpDepthAttachmentReadEXT: + { + builder.addExtension(spv::E_SPV_EXT_shader_tile_image); + + spv::Decoration precision; + spv::Op spv_op; + if (op == glslang::EOpStencilAttachmentReadEXT) + { + precision = spv::DecorationRelaxedPrecision; + spv_op = spv::OpStencilAttachmentReadEXT; + builder.addCapability(spv::CapabilityTileImageStencilReadAccessEXT); + } + else + { + precision = spv::NoPrecision; + spv_op = spv::OpDepthAttachmentReadEXT; + builder.addCapability(spv::CapabilityTileImageDepthReadAccessEXT); + } + + std::vector args; // Dummy args + spv::Id result = builder.createOp(spv_op, typeId, args); + return builder.setPrecision(result, precision); + } default: break; } @@ -8899,13 +9440,11 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol builder.addDecoration(id, TranslatePrecisionDecoration(symbol->getType())); builder.addDecoration(id, TranslateInterpolationDecoration(symbol->getType().getQualifier())); builder.addDecoration(id, TranslateAuxiliaryStorageDecoration(symbol->getType().getQualifier())); -#ifndef GLSLANG_WEB addMeshNVDecoration(id, /*member*/ -1, symbol->getType().getQualifier()); if (symbol->getQualifier().hasComponent()) builder.addDecoration(id, spv::DecorationComponent, symbol->getQualifier().layoutComponent); if (symbol->getQualifier().hasIndex()) builder.addDecoration(id, spv::DecorationIndex, symbol->getQualifier().layoutIndex); -#endif if (symbol->getType().getQualifier().hasSpecConstantId()) builder.addDecoration(id, spv::DecorationSpecId, symbol->getType().getQualifier().layoutSpecConstantId); // atomic counters use this: @@ -8914,13 +9453,17 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol } if (symbol->getQualifier().hasLocation()) { - if (!(glslangIntermediate->isRayTracingStage() && glslangIntermediate->IsRequestedExtension(glslang::E_GL_EXT_ray_tracing) + if (!(glslangIntermediate->isRayTracingStage() && + (glslangIntermediate->IsRequestedExtension(glslang::E_GL_EXT_ray_tracing) || + glslangIntermediate->IsRequestedExtension(glslang::E_GL_NV_shader_invocation_reorder)) && (builder.getStorageClass(id) == spv::StorageClassRayPayloadKHR || builder.getStorageClass(id) == spv::StorageClassIncomingRayPayloadKHR || builder.getStorageClass(id) == spv::StorageClassCallableDataKHR || - builder.getStorageClass(id) == spv::StorageClassIncomingCallableDataKHR))) { - // Location values are used to link TraceRayKHR and ExecuteCallableKHR to corresponding variables - // but are not valid in SPIRV since they are supported only for Input/Output Storage classes. + builder.getStorageClass(id) == spv::StorageClassIncomingCallableDataKHR || + builder.getStorageClass(id) == spv::StorageClassHitObjectAttributeNV))) { + // Location values are used to link TraceRayKHR/ExecuteCallableKHR/HitObjectGetAttributesNV + // to corresponding variables but are not valid in SPIRV since they are supported only + // for Input/Output Storage classes. builder.addDecoration(id, spv::DecorationLocation, symbol->getQualifier().layoutLocation); } } @@ -8966,11 +9509,11 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol // Add volatile decoration to HelperInvocation for spirv1.6 and beyond if (builtIn == spv::BuiltInHelperInvocation && + !glslangIntermediate->usingVulkanMemoryModel() && glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6) { builder.addDecoration(id, spv::DecorationVolatile); } -#ifndef GLSLANG_WEB // Subgroup builtins which have input storage class are volatile for ray tracing stages. if (symbol->getType().isImage() || symbol->getQualifier().isPipeInput()) { std::vector memory; @@ -9058,10 +9601,10 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol std::vector operandIds; assert(!decorateId.second.empty()); for (auto extraOperand : decorateId.second) { - if (extraOperand->getQualifier().isSpecConstant()) - operandIds.push_back(getSymbolId(extraOperand->getAsSymbolNode())); - else + if (extraOperand->getQualifier().isFrontEndConstant()) operandIds.push_back(createSpvConstant(*extraOperand)); + else + operandIds.push_back(getSymbolId(extraOperand->getAsSymbolNode())); } builder.addDecorationId(id, static_cast(decorateId.first), operandIds); } @@ -9077,12 +9620,10 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol builder.addDecoration(id, static_cast(decorateString.first), strings); } } -#endif return id; } -#ifndef GLSLANG_WEB // add per-primitive, per-view. per-task decorations to a struct member (member >= 0) or an object void TGlslangToSpvTraverser::addMeshNVDecoration(spv::Id id, int member, const glslang::TQualifier& qualifier) { @@ -9129,7 +9670,20 @@ void TGlslangToSpvTraverser::addMeshNVDecoration(spv::Id id, int member, const g builder.addDecoration(id, spv::DecorationPerTaskNV); } } -#endif + +void TGlslangToSpvTraverser::addImageProcessingQCOMDecoration(spv::Id id, spv::Decoration decor) +{ + spv::Op opc = builder.getOpCode(id); + if (opc == spv::OpSampledImage) { + id = builder.getIdOperand(id, 0); + opc = builder.getOpCode(id); + } + + if (opc == spv::OpLoad) { + spv::Id texid = builder.getIdOperand(id, 0); + builder.addDecoration(texid, decor); + } +} // Make a full tree of instructions to build a SPIR-V specialization constant, // or regular constant if possible. @@ -9257,7 +9811,6 @@ spv::Id TGlslangToSpvTraverser::createSpvConstantFromConstUnionArray(const glsla case glslang::EbtBool: spvConsts.push_back(builder.makeBoolConstant(zero ? false : consts[nextConst].getBConst())); break; -#ifndef GLSLANG_WEB case glslang::EbtInt8: builder.addCapability(spv::CapabilityInt8); spvConsts.push_back(builder.makeInt8Constant(zero ? 0 : consts[nextConst].getI8Const())); @@ -9287,7 +9840,6 @@ spv::Id TGlslangToSpvTraverser::createSpvConstantFromConstUnionArray(const glsla builder.addCapability(spv::CapabilityFloat16); spvConsts.push_back(builder.makeFloat16Constant(zero ? 0.0F : (float)consts[nextConst].getDConst())); break; -#endif default: assert(0); break; @@ -9311,7 +9863,6 @@ spv::Id TGlslangToSpvTraverser::createSpvConstantFromConstUnionArray(const glsla case glslang::EbtBool: scalar = builder.makeBoolConstant(zero ? false : consts[nextConst].getBConst(), specConstant); break; -#ifndef GLSLANG_WEB case glslang::EbtInt8: builder.addCapability(spv::CapabilityInt8); scalar = builder.makeInt8Constant(zero ? 0 : consts[nextConst].getI8Const(), specConstant); @@ -9345,7 +9896,6 @@ spv::Id TGlslangToSpvTraverser::createSpvConstantFromConstUnionArray(const glsla scalar = builder.makeUint64Constant(zero ? 0 : consts[nextConst].getU64Const(), specConstant); scalar = builder.createUnaryOp(spv::OpBitcast, typeId, scalar); break; -#endif case glslang::EbtString: scalar = builder.getStringId(consts[nextConst].getSConst()->c_str()); break; @@ -9493,7 +10043,6 @@ spv::Id TGlslangToSpvTraverser::createShortCircuit(glslang::TOperator op, glslan return builder.createOp(spv::OpPhi, boolTypeId, phiOperands); } -#ifndef GLSLANG_WEB // Return type Id of the imported set of extended instructions corresponds to the name. // Import this set if it has not been imported yet. spv::Id TGlslangToSpvTraverser::getExtBuiltins(const char* name) @@ -9507,7 +10056,6 @@ spv::Id TGlslangToSpvTraverser::getExtBuiltins(const char* name) return extBuiltins; } } -#endif }; // end anonymous namespace @@ -9536,31 +10084,36 @@ int GetSpirvGeneratorVersion() // return 7; // GLSL volatile keyword maps to both SPIR-V decorations Volatile and Coherent // return 8; // switch to new dead block eliminator; use OpUnreachable // return 9; // don't include opaque function parameters in OpEntryPoint global's operand list - return 10; // Generate OpFUnordNotEqual for != comparisons + // return 10; // Generate OpFUnordNotEqual for != comparisons + return 11; // Make OpEmitMeshTasksEXT a terminal instruction } // Write SPIR-V out to a binary file -void OutputSpvBin(const std::vector& spirv, const char* baseName) +bool OutputSpvBin(const std::vector& spirv, const char* baseName) { std::ofstream out; out.open(baseName, std::ios::binary | std::ios::out); - if (out.fail()) + if (out.fail()) { printf("ERROR: Failed to open file: %s\n", baseName); + return false; + } for (int i = 0; i < (int)spirv.size(); ++i) { unsigned int word = spirv[i]; out.write((const char*)&word, 4); } out.close(); + return true; } // Write SPIR-V out to a text file with 32-bit hexadecimal words -void OutputSpvHex(const std::vector& spirv, const char* baseName, const char* varName) +bool OutputSpvHex(const std::vector& spirv, const char* baseName, const char* varName) { -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) std::ofstream out; out.open(baseName, std::ios::binary | std::ios::out); - if (out.fail()) + if (out.fail()) { printf("ERROR: Failed to open file: %s\n", baseName); + return false; + } out << "\t// " << GetSpirvGeneratorVersion() << GLSLANG_VERSION_MAJOR << "." << GLSLANG_VERSION_MINOR << "." << GLSLANG_VERSION_PATCH << @@ -9586,7 +10139,7 @@ void OutputSpvHex(const std::vector& spirv, const char* baseName, out << std::endl; } out.close(); -#endif + return true; } // @@ -9603,7 +10156,7 @@ void GlslangToSpv(const TIntermediate& intermediate, std::vector& { TIntermNode* root = intermediate.getTreeRoot(); - if (root == 0) + if (root == nullptr) return; SpvOptions defaultOptions; @@ -9614,7 +10167,7 @@ void GlslangToSpv(const TIntermediate& intermediate, std::vector& TGlslangToSpvTraverser it(intermediate.getSpv().spv, &intermediate, logger, *options); root->traverse(&it); - it.finishSpv(); + it.finishSpv(options->compileOnly); it.dumpSpv(spirv); #if ENABLE_OPT diff --git a/third_party/glslang/SPIRV/GlslangToSpv.h b/third_party/glslang/SPIRV/GlslangToSpv.h index 3907be43b75..b9736d7c98a 100755 --- a/third_party/glslang/SPIRV/GlslangToSpv.h +++ b/third_party/glslang/SPIRV/GlslangToSpv.h @@ -55,7 +55,7 @@ void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector& spirv, spv::SpvBuildLogger* logger, SpvOptions* options = nullptr); -void OutputSpvBin(const std::vector& spirv, const char* baseName); -void OutputSpvHex(const std::vector& spirv, const char* baseName, const char* varName); +bool OutputSpvBin(const std::vector& spirv, const char* baseName); +bool OutputSpvHex(const std::vector& spirv, const char* baseName, const char* varName); } diff --git a/third_party/glslang/SPIRV/Logger.cpp b/third_party/glslang/SPIRV/Logger.cpp index cdc8469c447..48bd4e3ade6 100644 --- a/third_party/glslang/SPIRV/Logger.cpp +++ b/third_party/glslang/SPIRV/Logger.cpp @@ -32,8 +32,6 @@ // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. -#ifndef GLSLANG_WEB - #include "Logger.h" #include @@ -68,5 +66,3 @@ std::string SpvBuildLogger::getAllMessages() const { } } // end spv namespace - -#endif diff --git a/third_party/glslang/SPIRV/Logger.h b/third_party/glslang/SPIRV/Logger.h index 411367c030f..2e4ddaf517b 100644 --- a/third_party/glslang/SPIRV/Logger.h +++ b/third_party/glslang/SPIRV/Logger.h @@ -46,14 +46,6 @@ class SpvBuildLogger { public: SpvBuildLogger() {} -#ifdef GLSLANG_WEB - void tbdFunctionality(const std::string& f) { } - void missingFunctionality(const std::string& f) { } - void warning(const std::string& w) { } - void error(const std::string& e) { errors.push_back(e); } - std::string getAllMessages() { return ""; } -#else - // Registers a TBD functionality. void tbdFunctionality(const std::string& f); // Registers a missing functionality. @@ -67,7 +59,6 @@ class SpvBuildLogger { // Returns all messages accumulated in the order of: // TBD functionalities, missing functionalities, warnings, errors. std::string getAllMessages() const; -#endif private: SpvBuildLogger(const SpvBuildLogger&); diff --git a/third_party/glslang/SPIRV/NonSemanticDebugPrintf.h b/third_party/glslang/SPIRV/NonSemanticDebugPrintf.h index 83796d75e56..3ca7247f2b0 100644 --- a/third_party/glslang/SPIRV/NonSemanticDebugPrintf.h +++ b/third_party/glslang/SPIRV/NonSemanticDebugPrintf.h @@ -1,5 +1,5 @@ // Copyright (c) 2020 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 @@ -7,15 +7,15 @@ // 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. -// +// // MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS // KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS // SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT // https://www.khronos.org/registry/ -// +// // 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. @@ -23,7 +23,7 @@ // 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 SPIRV_UNIFIED1_NonSemanticDebugPrintf_H_ #define SPIRV_UNIFIED1_NonSemanticDebugPrintf_H_ diff --git a/third_party/glslang/SPIRV/NonSemanticShaderDebugInfo100.h b/third_party/glslang/SPIRV/NonSemanticShaderDebugInfo100.h index c52f32f8090..f74abcb6466 100644 --- a/third_party/glslang/SPIRV/NonSemanticShaderDebugInfo100.h +++ b/third_party/glslang/SPIRV/NonSemanticShaderDebugInfo100.h @@ -1,19 +1,19 @@ // Copyright (c) 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. -// +// // MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS // STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND -// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ -// +// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +// // 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 diff --git a/third_party/glslang/SPIRV/SPVRemapper.cpp b/third_party/glslang/SPIRV/SPVRemapper.cpp index 6aca8cbcf08..f8f50a95163 100644 --- a/third_party/glslang/SPIRV/SPVRemapper.cpp +++ b/third_party/glslang/SPIRV/SPVRemapper.cpp @@ -36,10 +36,6 @@ #include "SPVRemapper.h" #include "doc.h" -#if !defined (use_cpp11) -// ... not supported before C++11 -#else // defined (use_cpp11) - #include #include #include "../glslang/Include/Common.h" @@ -684,6 +680,7 @@ namespace spv { case spv::OperandKernelEnqueueFlags: case spv::OperandKernelProfilingInfo: case spv::OperandCapability: + case spv::OperandCooperativeMatrixOperands: ++word; break; @@ -1528,5 +1525,3 @@ namespace spv { } // namespace SPV -#endif // defined (use_cpp11) - diff --git a/third_party/glslang/SPIRV/SPVRemapper.h b/third_party/glslang/SPIRV/SPVRemapper.h index d21694635ac..42b01686ee4 100644 --- a/third_party/glslang/SPIRV/SPVRemapper.h +++ b/third_party/glslang/SPIRV/SPVRemapper.h @@ -43,12 +43,6 @@ namespace spv { -// MSVC defines __cplusplus as an older value, even when it supports almost all of 11. -// We handle that here by making our own symbol. -#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1700) -# define use_cpp11 1 -#endif - class spirvbin_base_t { public: @@ -74,27 +68,6 @@ class spirvbin_base_t } // namespace SPV -#if !defined (use_cpp11) -#include -#include - -namespace spv { -class spirvbin_t : public spirvbin_base_t -{ -public: - spirvbin_t(int /*verbose = 0*/) { } - - void remap(std::vector& /*spv*/, unsigned int /*opts = 0*/) - { - printf("Tool not compiled for C++11, which is required for SPIR-V remapping.\n"); - exit(5); - } -}; - -} // namespace SPV - -#else // defined (use_cpp11) - #include #include #include @@ -308,5 +281,4 @@ class spirvbin_t : public spirvbin_base_t } // namespace SPV -#endif // defined (use_cpp11) #endif // SPIRVREMAPPER_H diff --git a/third_party/glslang/SPIRV/SpvBuilder.cpp b/third_party/glslang/SPIRV/SpvBuilder.cpp index 743eed86042..49244bb393d 100644 --- a/third_party/glslang/SPIRV/SpvBuilder.cpp +++ b/third_party/glslang/SPIRV/SpvBuilder.cpp @@ -46,10 +46,7 @@ #include #include "SpvBuilder.h" - -#ifndef GLSLANG_WEB #include "hex_float.h" -#endif #ifndef _WIN32 #include @@ -71,9 +68,9 @@ Builder::Builder(unsigned int spvVersion, unsigned int magicNumber, SpvBuildLogg addressModel(AddressingModelLogical), memoryModel(MemoryModelGLSL450), builderNumber(magicNumber), - buildPoint(0), + buildPoint(nullptr), uniqueId(0), - entryPointFunction(0), + entryPointFunction(nullptr), generatingOpCodeForSpecConst(false), logger(buildLogger) { @@ -144,6 +141,7 @@ void Builder::addLine(Id fileName, int lineNum, int column) void Builder::addDebugScopeAndLine(Id fileName, int lineNum, int column) { + assert(!currentDebugScopeId.empty()); if (currentDebugScopeId.top() != lastDebugScopeId) { spv::Id resultId = getUniqueId(); Instruction* scopeInst = new Instruction(resultId, makeVoidType(), OpExtInst); @@ -282,11 +280,6 @@ Id Builder::makePointerFromForwardPointer(StorageClass storageClass, Id forwardP Id Builder::makeIntegerType(int width, bool hasSign) { -#ifdef GLSLANG_WEB - assert(width == 32); - width = 32; -#endif - // try to find it Instruction* type; for (int t = 0; t < (int)groupedTypes[OpTypeInt].size(); ++t) { @@ -328,11 +321,6 @@ Id Builder::makeIntegerType(int width, bool hasSign) Id Builder::makeFloatType(int width) { -#ifdef GLSLANG_WEB - assert(width == 32); - width = 32; -#endif - // try to find it Instruction* type; for (int t = 0; t < (int)groupedTypes[OpTypeFloat].size(); ++t) { @@ -480,15 +468,41 @@ Id Builder::makeMatrixType(Id component, int cols, int rows) return type->getResultId(); } -Id Builder::makeCooperativeMatrixType(Id component, Id scope, Id rows, Id cols) +Id Builder::makeCooperativeMatrixTypeKHR(Id component, Id scope, Id rows, Id cols, Id use) { // try to find it Instruction* type; - for (int t = 0; t < (int)groupedTypes[OpTypeCooperativeMatrixNV].size(); ++t) { - type = groupedTypes[OpTypeCooperativeMatrixNV][t]; + for (int t = 0; t < (int)groupedTypes[OpTypeCooperativeMatrixKHR].size(); ++t) { + type = groupedTypes[OpTypeCooperativeMatrixKHR][t]; if (type->getIdOperand(0) == component && type->getIdOperand(1) == scope && type->getIdOperand(2) == rows && + type->getIdOperand(3) == cols && + type->getIdOperand(4) == use) + return type->getResultId(); + } + + // not found, make it + type = new Instruction(getUniqueId(), NoType, OpTypeCooperativeMatrixKHR); + type->addIdOperand(component); + type->addIdOperand(scope); + type->addIdOperand(rows); + type->addIdOperand(cols); + type->addIdOperand(use); + groupedTypes[OpTypeCooperativeMatrixKHR].push_back(type); + constantsTypesGlobals.push_back(std::unique_ptr(type)); + module.mapInstruction(type); + + return type->getResultId(); +} + +Id Builder::makeCooperativeMatrixTypeNV(Id component, Id scope, Id rows, Id cols) +{ + // try to find it + Instruction* type; + for (int t = 0; t < (int)groupedTypes[OpTypeCooperativeMatrixNV].size(); ++t) { + type = groupedTypes[OpTypeCooperativeMatrixNV][t]; + if (type->getIdOperand(0) == component && type->getIdOperand(1) == scope && type->getIdOperand(2) == rows && type->getIdOperand(3) == cols) return type->getResultId(); } @@ -506,6 +520,17 @@ Id Builder::makeCooperativeMatrixType(Id component, Id scope, Id rows, Id cols) return type->getResultId(); } +Id Builder::makeCooperativeMatrixTypeWithSameShape(Id component, Id otherType) +{ + Instruction* instr = module.getInstruction(otherType); + if (instr->getOpCode() == OpTypeCooperativeMatrixNV) { + return makeCooperativeMatrixTypeNV(component, instr->getIdOperand(1), instr->getIdOperand(2), instr->getIdOperand(3)); + } else { + assert(instr->getOpCode() == OpTypeCooperativeMatrixKHR); + return makeCooperativeMatrixTypeKHR(component, instr->getIdOperand(1), instr->getIdOperand(2), instr->getIdOperand(3), instr->getIdOperand(4)); + } +} + Id Builder::makeGenericType(spv::Op opcode, std::vector& operands) { // try to find it @@ -650,8 +675,12 @@ Id Builder::makeDebugFunctionType(Id returnType, const std::vector& paramTyp type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100FlagIsPublic)); type->addIdOperand(debugId[returnType]); for (auto const paramType : paramTypes) { - assert(isPointerType(paramType) || isArrayType(paramType)); - type->addIdOperand(debugId[getContainedTypeId(paramType)]); + if (isPointerType(paramType) || isArrayType(paramType)) { + type->addIdOperand(debugId[getContainedTypeId(paramType)]); + } + else { + type->addIdOperand(debugId[paramType]); + } } constantsTypesGlobals.push_back(std::unique_ptr(type)); module.mapInstruction(type); @@ -691,7 +720,6 @@ Id Builder::makeImageType(Id sampledType, Dim dim, bool depth, bool arrayed, boo constantsTypesGlobals.push_back(std::unique_ptr(type)); module.mapInstruction(type); -#ifndef GLSLANG_WEB // deal with capabilities switch (dim) { case DimBuffer: @@ -737,7 +765,6 @@ Id Builder::makeImageType(Id sampledType, Dim dim, bool depth, bool arrayed, boo addCapability(CapabilityImageMSArray); } } -#endif if (emitNonSemanticShaderDebugInfo) { @@ -832,11 +859,19 @@ Id Builder::makeBoolDebugType(int const size) Id Builder::makeIntegerDebugType(int const width, bool const hasSign) { + const char* typeName = nullptr; + switch (width) { + case 8: typeName = hasSign ? "int8_t" : "uint8_t"; break; + case 16: typeName = hasSign ? "int16_t" : "uint16_t"; break; + case 64: typeName = hasSign ? "int64_t" : "uint64_t"; break; + default: typeName = hasSign ? "int" : "uint"; + } + auto nameId = getStringId(typeName); // try to find it Instruction* type; for (int t = 0; t < (int)groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic].size(); ++t) { type = groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic][t]; - if (type->getIdOperand(0) == (hasSign ? getStringId("int") : getStringId("uint")) && + if (type->getIdOperand(0) == nameId && type->getIdOperand(1) == static_cast(width) && type->getIdOperand(2) == (hasSign ? NonSemanticShaderDebugInfo100Signed : NonSemanticShaderDebugInfo100Unsigned)) return type->getResultId(); @@ -846,11 +881,7 @@ Id Builder::makeIntegerDebugType(int const width, bool const hasSign) type = new Instruction(getUniqueId(), makeVoidType(), OpExtInst); type->addIdOperand(nonSemanticShaderDebugInfo); type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypeBasic); - if(hasSign == true) { - type->addIdOperand(getStringId("int")); // name id - } else { - type->addIdOperand(getStringId("uint")); // name id - } + type->addIdOperand(nameId); // name id type->addIdOperand(makeUintConstant(width)); // size id if(hasSign == true) { type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100Signed)); // encoding id @@ -868,11 +899,18 @@ Id Builder::makeIntegerDebugType(int const width, bool const hasSign) Id Builder::makeFloatDebugType(int const width) { + const char* typeName = nullptr; + switch (width) { + case 16: typeName = "float16_t"; break; + case 64: typeName = "double"; break; + default: typeName = "float"; break; + } + auto nameId = getStringId(typeName); // try to find it Instruction* type; for (int t = 0; t < (int)groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic].size(); ++t) { type = groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypeBasic][t]; - if (type->getIdOperand(0) == getStringId("float") && + if (type->getIdOperand(0) == nameId && type->getIdOperand(1) == static_cast(width) && type->getIdOperand(2) == NonSemanticShaderDebugInfo100Float) return type->getResultId(); @@ -882,7 +920,7 @@ Id Builder::makeFloatDebugType(int const width) type = new Instruction(getUniqueId(), makeVoidType(), OpExtInst); type->addIdOperand(nonSemanticShaderDebugInfo); type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypeBasic); - type->addIdOperand(getStringId("float")); // name id + type->addIdOperand(nameId); // name id type->addIdOperand(makeUintConstant(width)); // size id type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100Float)); // encoding id type->addIdOperand(makeUintConstant(NonSemanticShaderDebugInfo100None)); // flags id @@ -929,7 +967,7 @@ Id Builder::makeArrayDebugType(Id const baseType, Id const componentCount) Id Builder::makeVectorDebugType(Id const baseType, int const componentCount) { - return makeSequentialDebugType(baseType, makeUintConstant(componentCount), NonSemanticShaderDebugInfo100DebugTypeVector);; + return makeSequentialDebugType(baseType, makeUintConstant(componentCount), NonSemanticShaderDebugInfo100DebugTypeVector); } Id Builder::makeMatrixDebugType(Id const vectorType, int const vectorCount, bool columnMajor) @@ -1067,6 +1105,12 @@ Id Builder::makeDebugCompilationUnit() { constantsTypesGlobals.push_back(std::unique_ptr(sourceInst)); module.mapInstruction(sourceInst); nonSemanticShaderCompilationUnitId = resultId; + + // We can reasonably assume that makeDebugCompilationUnit will be called before any of + // debug-scope stack. Function scopes and lexical scopes will occur afterward. + assert(currentDebugScopeId.empty()); + currentDebugScopeId.push(nonSemanticShaderCompilationUnitId); + return resultId; } @@ -1096,6 +1140,8 @@ Id Builder::createDebugGlobalVariable(Id const type, char const*const name, Id c Id Builder::createDebugLocalVariable(Id type, char const*const name, size_t const argNumber) { assert(name != nullptr); + assert(!currentDebugScopeId.empty()); + Instruction* inst = new Instruction(getUniqueId(), makeVoidType(), OpExtInst); inst->addIdOperand(nonSemanticShaderDebugInfo); inst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugLocalVariable); @@ -1146,20 +1192,6 @@ Id Builder::makeDebugDeclare(Id const debugLocalVariable, Id const localVariable return inst->getResultId(); } -Id Builder::makeDebugValue(Id const debugLocalVariable, Id const value) -{ - Instruction* inst = new Instruction(getUniqueId(), makeVoidType(), OpExtInst); - inst->addIdOperand(nonSemanticShaderDebugInfo); - inst->addImmediateOperand(NonSemanticShaderDebugInfo100DebugValue); - inst->addIdOperand(debugLocalVariable); // debug local variable id - inst->addIdOperand(value); // value id - inst->addIdOperand(makeDebugExpression()); // expression id - buildPoint->addInstruction(std::unique_ptr(inst)); - - return inst->getResultId(); -} - -#ifndef GLSLANG_WEB Id Builder::makeAccelerationStructureType() { Instruction *type; @@ -1189,7 +1221,21 @@ Id Builder::makeRayQueryType() return type->getResultId(); } -#endif + +Id Builder::makeHitObjectNVType() +{ + Instruction *type; + if (groupedTypes[OpTypeHitObjectNV].size() == 0) { + type = new Instruction(getUniqueId(), NoType, OpTypeHitObjectNV); + groupedTypes[OpTypeHitObjectNV].push_back(type); + constantsTypesGlobals.push_back(std::unique_ptr(type)); + module.mapInstruction(type); + } else { + type = groupedTypes[OpTypeHitObjectNV].back(); + } + + return type->getResultId(); +} Id Builder::getDerefTypeId(Id resultId) const { @@ -1239,6 +1285,7 @@ int Builder::getNumTypeConstituents(Id typeId) const } case OpTypeStruct: return instr->getNumOperands(); + case OpTypeCooperativeMatrixKHR: case OpTypeCooperativeMatrixNV: // has only one constituent when used with OpCompositeConstruct. return 1; @@ -1288,6 +1335,7 @@ Id Builder::getContainedTypeId(Id typeId, int member) const case OpTypeMatrix: case OpTypeArray: case OpTypeRuntimeArray: + case OpTypeCooperativeMatrixKHR: case OpTypeCooperativeMatrixNV: return instr->getIdOperand(0); case OpTypePointer: @@ -1358,7 +1406,7 @@ bool Builder::containsType(Id typeId, spv::Op typeOp, unsigned int width) const } // return true if the type is a pointer to PhysicalStorageBufferEXT or an -// array of such pointers. These require restrict/aliased decorations. +// contains such a pointer. These require restrict/aliased decorations. bool Builder::containsPhysicalStorageBufferOrArray(Id typeId) const { const Instruction& instr = *module.getInstruction(typeId); @@ -1370,6 +1418,12 @@ bool Builder::containsPhysicalStorageBufferOrArray(Id typeId) const return getTypeStorageClass(typeId) == StorageClassPhysicalStorageBufferEXT; case OpTypeArray: return containsPhysicalStorageBufferOrArray(getContainedTypeId(typeId)); + case OpTypeStruct: + for (int m = 0; m < instr.getNumOperands(); ++m) { + if (containsPhysicalStorageBufferOrArray(instr.getIdOperand(m))) + return true; + } + return false; default: return false; } @@ -1583,10 +1637,6 @@ Id Builder::makeFloatConstant(float f, bool specConstant) Id Builder::makeDoubleConstant(double d, bool specConstant) { -#ifdef GLSLANG_WEB - assert(0); - return NoResult; -#else Op opcode = specConstant ? OpSpecConstant : OpConstant; Id typeId = makeFloatType(64); union { double db; unsigned long long ull; } u; @@ -1611,15 +1661,10 @@ Id Builder::makeDoubleConstant(double d, bool specConstant) module.mapInstruction(c); return c->getResultId(); -#endif } Id Builder::makeFloat16Constant(float f16, bool specConstant) { -#ifdef GLSLANG_WEB - assert(0); - return NoResult; -#else Op opcode = specConstant ? OpSpecConstant : OpConstant; Id typeId = makeFloatType(16); @@ -1644,17 +1689,11 @@ Id Builder::makeFloat16Constant(float f16, bool specConstant) module.mapInstruction(c); return c->getResultId(); -#endif } Id Builder::makeFpConstant(Id type, double d, bool specConstant) { -#ifdef GLSLANG_WEB - const int width = 32; - assert(width == getScalarTypeWidth(type)); -#else const int width = getScalarTypeWidth(type); -#endif assert(isFloatType(type)); @@ -1688,7 +1727,7 @@ Id Builder::importNonSemanticShaderDebugInfoInstructions() Id Builder::findCompositeConstant(Op typeClass, Id typeId, const std::vector& comps) { - Instruction* constant = 0; + Instruction* constant = nullptr; bool found = false; for (int i = 0; i < (int)groupedConstants[typeClass].size(); ++i) { constant = groupedConstants[typeClass][i]; @@ -1715,7 +1754,7 @@ Id Builder::findCompositeConstant(Op typeClass, Id typeId, const std::vector Id Builder::findStructConstant(Id typeId, const std::vector& comps) { - Instruction* constant = 0; + Instruction* constant = nullptr; bool found = false; for (int i = 0; i < (int)groupedStructConstants[typeId].size(); ++i) { constant = groupedStructConstants[typeId][i]; @@ -1748,6 +1787,7 @@ Id Builder::makeCompositeConstant(Id typeId, const std::vector& members, boo case OpTypeVector: case OpTypeArray: case OpTypeMatrix: + case OpTypeCooperativeMatrixKHR: case OpTypeCooperativeMatrixNV: if (! specConstant) { Id existing = findCompositeConstant(typeClass, typeId, members); @@ -1795,6 +1835,10 @@ Instruction* Builder::addEntryPoint(ExecutionModel model, Function* function, co // Currently relying on the fact that all 'value' of interest are small non-negative values. void Builder::addExecutionMode(Function* entryPoint, ExecutionMode mode, int value1, int value2, int value3) { + // entryPoint can be null if we are in compile-only mode + if (!entryPoint) + return; + Instruction* instr = new Instruction(OpExecutionMode); instr->addIdOperand(entryPoint->getId()); instr->addImmediateOperand(mode); @@ -1810,6 +1854,10 @@ void Builder::addExecutionMode(Function* entryPoint, ExecutionMode mode, int val void Builder::addExecutionMode(Function* entryPoint, ExecutionMode mode, const std::vector& literals) { + // entryPoint can be null if we are in compile-only mode + if (!entryPoint) + return; + Instruction* instr = new Instruction(OpExecutionMode); instr->addIdOperand(entryPoint->getId()); instr->addImmediateOperand(mode); @@ -1821,6 +1869,10 @@ void Builder::addExecutionMode(Function* entryPoint, ExecutionMode mode, const s void Builder::addExecutionModeId(Function* entryPoint, ExecutionMode mode, const std::vector& operandIds) { + // entryPoint can be null if we are in compile-only mode + if (!entryPoint) + return; + Instruction* instr = new Instruction(OpExecutionModeId); instr->addIdOperand(entryPoint->getId()); instr->addImmediateOperand(mode); @@ -1904,6 +1956,16 @@ void Builder::addDecoration(Id id, Decoration decoration, const std::vector(dec)); } +void Builder::addLinkageDecoration(Id id, const char* name, spv::LinkageType linkType) { + Instruction* dec = new Instruction(OpDecorate); + dec->addIdOperand(id); + dec->addImmediateOperand(spv::DecorationLinkageAttributes); + dec->addStringOperand(name); + dec->addImmediateOperand(linkType); + + decorations.push_back(std::unique_ptr(dec)); +} + void Builder::addDecorationId(Id id, Decoration decoration, Id idDecoration) { if (decoration == spv::DecorationMax) @@ -2008,7 +2070,7 @@ Function* Builder::makeEntryPoint(const char* entryPoint) emitNonSemanticShaderDebugInfo = false; } - entryPointFunction = makeFunctionEntry(NoPrecision, returnType, entryPoint, paramsTypes, paramNames, decorations, &entry); + entryPointFunction = makeFunctionEntry(NoPrecision, returnType, entryPoint, LinkageTypeMax, paramsTypes, paramNames, decorations, &entry); emitNonSemanticShaderDebugInfo = restoreNonSemanticShaderDebugInfo; @@ -2016,7 +2078,7 @@ Function* Builder::makeEntryPoint(const char* entryPoint) } // Comments in header -Function* Builder::makeFunctionEntry(Decoration precision, Id returnType, const char* name, +Function* Builder::makeFunctionEntry(Decoration precision, Id returnType, const char* name, LinkageType linkType, const std::vector& paramTypes, const std::vector& paramNames, const std::vector>& decorations, Block **entry) { @@ -2024,7 +2086,7 @@ Function* Builder::makeFunctionEntry(Decoration precision, Id returnType, const Id typeId = makeFunctionType(returnType, paramTypes); Id firstParamId = paramTypes.size() == 0 ? 0 : getUniqueIds((int)paramTypes.size()); Id funcId = getUniqueId(); - Function* function = new Function(funcId, returnType, typeId, firstParamId, module); + Function* function = new Function(funcId, returnType, typeId, firstParamId, linkType, name, module); // Set up the precisions setPrecision(function->getId(), precision); @@ -2060,11 +2122,16 @@ Function* Builder::makeFunctionEntry(Decoration precision, Id returnType, const assert(paramTypes.size() == paramNames.size()); for(size_t p = 0; p < paramTypes.size(); ++p) { - auto const& paramType = paramTypes[p]; - assert(isPointerType(paramType) || isArrayType(paramType)); - assert(debugId[getContainedTypeId(paramType)] != 0); + auto getParamTypeId = [this](Id const& typeId) { + if (isPointerType(typeId) || isArrayType(typeId)) { + return getContainedTypeId(typeId); + } + else { + return typeId; + } + }; auto const& paramName = paramNames[p]; - auto const debugLocalVariableId = createDebugLocalVariable(debugId[getContainedTypeId(paramType)], paramName, p+1); + auto const debugLocalVariableId = createDebugLocalVariable(debugId[getParamTypeId(paramTypes[p])], paramName, p+1); debugId[firstParamId + p] = debugLocalVariableId; makeDebugDeclare(debugLocalVariableId, firstParamId + p); @@ -2083,7 +2150,8 @@ Function* Builder::makeFunctionEntry(Decoration precision, Id returnType, const return function; } -Id Builder::makeDebugFunction(Function* function, Id nameId, Id funcTypeId) { +Id Builder::makeDebugFunction([[maybe_unused]] Function* function, Id nameId, Id funcTypeId) +{ assert(function != nullptr); assert(nameId != 0); assert(funcTypeId != 0); @@ -2108,6 +2176,8 @@ Id Builder::makeDebugFunction(Function* function, Id nameId, Id funcTypeId) { } Id Builder::makeDebugLexicalBlock(uint32_t line) { + assert(!currentDebugScopeId.empty()); + Id lexId = getUniqueId(); auto lex = new Instruction(lexId, makeVoidType(), OpExtInst); lex->addIdOperand(nonSemanticShaderDebugInfo); @@ -2186,6 +2256,12 @@ void Builder::enterFunction(Function const* function) defInst->addIdOperand(funcId); buildPoint->addInstruction(std::unique_ptr(defInst)); } + + if (auto linkType = function->getLinkType(); linkType != LinkageTypeMax) { + Id funcId = function->getFuncId(); + addCapability(CapabilityLinkage); + addLinkageDecoration(funcId, function->getExportName(), linkType); + } } // Comments in header @@ -2248,8 +2324,7 @@ Id Builder::createVariable(Decoration precision, StorageClass storageClass, Id t auto const debugLocalVariableId = createDebugLocalVariable(debugId[type], name); debugId[inst->getResultId()] = debugLocalVariableId; - // TODO: Remove? - // makeDebugDeclare(debugLocalVariableId, inst->getResultId()); + makeDebugDeclare(debugLocalVariableId, inst->getResultId()); } break; @@ -2322,15 +2397,6 @@ void Builder::createStore(Id rValue, Id lValue, spv::MemoryAccessMask memoryAcce } buildPoint->addInstruction(std::unique_ptr(store)); - - if (emitNonSemanticShaderDebugInfo && !isGlobalVariable(lValue)) - { - if(debugId.find(lValue) != debugId.end()) - { - auto const debugLocalVariableId = debugId[lValue]; - makeDebugValue(debugLocalVariableId, rValue); - } - } } // Comments in header @@ -2386,7 +2452,24 @@ Id Builder::createArrayLength(Id base, unsigned int member) return length->getResultId(); } -Id Builder::createCooperativeMatrixLength(Id type) +Id Builder::createCooperativeMatrixLengthKHR(Id type) +{ + spv::Id intType = makeUintType(32); + + // Generate code for spec constants if in spec constant operation + // generation mode. + if (generatingOpCodeForSpecConst) { + return createSpecConstantOp(OpCooperativeMatrixLengthKHR, intType, std::vector(1, type), std::vector()); + } + + Instruction* length = new Instruction(getUniqueId(), intType, OpCooperativeMatrixLengthKHR); + length->addIdOperand(type); + buildPoint->addInstruction(std::unique_ptr(length)); + + return length->getResultId(); +} + +Id Builder::createCooperativeMatrixLengthNV(Id type) { spv::Id intType = makeUintType(32); @@ -2757,52 +2840,47 @@ Id Builder::createBuiltinCall(Id resultType, Id builtins, int entryPoint, const Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse, bool fetch, bool proj, bool gather, bool noImplicitLod, const TextureParameters& parameters, ImageOperandsMask signExtensionMask) { - static const int maxTextureArgs = 10; - Id texArgs[maxTextureArgs] = {}; + std::vector texArgs; // // Set up the fixed arguments // - int numArgs = 0; bool explicitLod = false; - texArgs[numArgs++] = parameters.sampler; - texArgs[numArgs++] = parameters.coords; + texArgs.push_back(parameters.sampler); + texArgs.push_back(parameters.coords); if (parameters.Dref != NoResult) - texArgs[numArgs++] = parameters.Dref; + texArgs.push_back(parameters.Dref); if (parameters.component != NoResult) - texArgs[numArgs++] = parameters.component; + texArgs.push_back(parameters.component); -#ifndef GLSLANG_WEB if (parameters.granularity != NoResult) - texArgs[numArgs++] = parameters.granularity; + texArgs.push_back(parameters.granularity); if (parameters.coarse != NoResult) - texArgs[numArgs++] = parameters.coarse; -#endif + texArgs.push_back(parameters.coarse); // // Set up the optional arguments // - int optArgNum = numArgs; // track which operand, if it exists, is the mask of optional arguments - ++numArgs; // speculatively make room for the mask operand + size_t optArgNum = texArgs.size(); // the position of the mask for the optional arguments, if any. ImageOperandsMask mask = ImageOperandsMaskNone; // the mask operand if (parameters.bias) { mask = (ImageOperandsMask)(mask | ImageOperandsBiasMask); - texArgs[numArgs++] = parameters.bias; + texArgs.push_back(parameters.bias); } if (parameters.lod) { mask = (ImageOperandsMask)(mask | ImageOperandsLodMask); - texArgs[numArgs++] = parameters.lod; + texArgs.push_back(parameters.lod); explicitLod = true; } else if (parameters.gradX) { mask = (ImageOperandsMask)(mask | ImageOperandsGradMask); - texArgs[numArgs++] = parameters.gradX; - texArgs[numArgs++] = parameters.gradY; + texArgs.push_back(parameters.gradX); + texArgs.push_back(parameters.gradY); explicitLod = true; } else if (noImplicitLod && ! fetch && ! gather) { // have to explicitly use lod of 0 if not allowed to have them be implicit, and // we would otherwise be about to issue an implicit instruction mask = (ImageOperandsMask)(mask | ImageOperandsLodMask); - texArgs[numArgs++] = makeFloatConstant(0.0); + texArgs.push_back(makeFloatConstant(0.0)); explicitLod = true; } if (parameters.offset) { @@ -2812,24 +2890,23 @@ Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse, addCapability(CapabilityImageGatherExtended); mask = (ImageOperandsMask)(mask | ImageOperandsOffsetMask); } - texArgs[numArgs++] = parameters.offset; + texArgs.push_back(parameters.offset); } if (parameters.offsets) { addCapability(CapabilityImageGatherExtended); mask = (ImageOperandsMask)(mask | ImageOperandsConstOffsetsMask); - texArgs[numArgs++] = parameters.offsets; + texArgs.push_back(parameters.offsets); } -#ifndef GLSLANG_WEB if (parameters.sample) { mask = (ImageOperandsMask)(mask | ImageOperandsSampleMask); - texArgs[numArgs++] = parameters.sample; + texArgs.push_back(parameters.sample); } if (parameters.lodClamp) { // capability if this bit is used addCapability(CapabilityMinLod); mask = (ImageOperandsMask)(mask | ImageOperandsMinLodMask); - texArgs[numArgs++] = parameters.lodClamp; + texArgs.push_back(parameters.lodClamp); } if (parameters.nonprivate) { mask = mask | ImageOperandsNonPrivateTexelKHRMask; @@ -2837,12 +2914,10 @@ Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse, if (parameters.volatil) { mask = mask | ImageOperandsVolatileTexelKHRMask; } -#endif mask = mask | signExtensionMask; - if (mask == ImageOperandsMaskNone) - --numArgs; // undo speculative reservation for the mask argument - else - texArgs[optArgNum] = mask; + // insert the operand for the mask, if any bits were set. + if (mask != ImageOperandsMaskNone) + texArgs.insert(texArgs.begin() + optArgNum, mask); // // Set up the instruction @@ -2853,7 +2928,6 @@ Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse, opCode = OpImageSparseFetch; else opCode = OpImageFetch; -#ifndef GLSLANG_WEB } else if (parameters.granularity && parameters.coarse) { opCode = OpImageSampleFootprintNV; } else if (gather) { @@ -2867,7 +2941,6 @@ Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse, opCode = OpImageSparseGather; else opCode = OpImageGather; -#endif } else if (explicitLod) { if (parameters.Dref) { if (proj) @@ -2946,11 +3019,11 @@ Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse, // Build the SPIR-V instruction Instruction* textureInst = new Instruction(getUniqueId(), resultType, opCode); - for (int op = 0; op < optArgNum; ++op) + for (size_t op = 0; op < optArgNum; ++op) textureInst->addIdOperand(texArgs[op]); - if (optArgNum < numArgs) + if (optArgNum < texArgs.size()) textureInst->addImmediateOperand(texArgs[optArgNum]); - for (int op = optArgNum + 1; op < numArgs; ++op) + for (size_t op = optArgNum + 1; op < texArgs.size(); ++op) textureInst->addIdOperand(texArgs[op]); setPrecision(textureInst->getResultId(), precision); buildPoint->addInstruction(std::unique_ptr(textureInst)); @@ -3230,12 +3303,7 @@ Id Builder::createMatrixConstructor(Decoration precision, const std::vector& int numRows = getTypeNumRows(resultTypeId); Instruction* instr = module.getInstruction(componentTypeId); -#ifdef GLSLANG_WEB - const unsigned bitCount = 32; - assert(bitCount == instr->getImmediateOperand(0)); -#else const unsigned bitCount = instr->getImmediateOperand(0); -#endif // Optimize matrix constructed from a bigger matrix if (isMatrix(sources[0]) && getNumColumns(sources[0]) >= numCols && getNumRows(sources[0]) >= numRows) { @@ -3355,7 +3423,7 @@ Builder::If::If(Id cond, unsigned int ctrl, Builder& gb) : builder(gb), condition(cond), control(ctrl), - elseBlock(0) + elseBlock(nullptr) { function = &builder.getBuildPoint()->getParent(); @@ -4056,4 +4124,4 @@ void Builder::dumpModuleProcesses(std::vector& out) const } } -}; // end spv namespace +} // end spv namespace diff --git a/third_party/glslang/SPIRV/SpvBuilder.h b/third_party/glslang/SPIRV/SpvBuilder.h index f7fdc6ad840..2e1c07d49d6 100644 --- a/third_party/glslang/SPIRV/SpvBuilder.h +++ b/third_party/glslang/SPIRV/SpvBuilder.h @@ -103,7 +103,7 @@ class Builder { stringIds[file_c_str] = strId; return strId; } - spv::Id getSourceFile() const + spv::Id getSourceFile() const { return sourceFileStringId; } @@ -203,7 +203,9 @@ class Builder { Id makeImageType(Id sampledType, Dim, bool depth, bool arrayed, bool ms, unsigned sampled, ImageFormat format); Id makeSamplerType(); Id makeSampledImageType(Id imageType); - Id makeCooperativeMatrixType(Id component, Id scope, Id rows, Id cols); + Id makeCooperativeMatrixTypeKHR(Id component, Id scope, Id rows, Id cols, Id use); + Id makeCooperativeMatrixTypeNV(Id component, Id scope, Id rows, Id cols); + Id makeCooperativeMatrixTypeWithSameShape(Id component, Id otherType); Id makeGenericType(spv::Op opcode, std::vector& operands); // SPIR-V NonSemantic Shader DebugInfo Instructions @@ -240,6 +242,8 @@ class Builder { Id makeAccelerationStructureType(); // rayQueryEXT type Id makeRayQueryType(); + // hitObjectNV type + Id makeHitObjectNVType(); // For querying about types. Id getTypeId(Id resultId) const { return module.getTypeId(resultId); } @@ -257,6 +261,7 @@ class Builder { ImageFormat getImageTypeFormat(Id typeId) const { return (ImageFormat)module.getInstruction(typeId)->getImmediateOperand(6); } Id getResultingAccessChainType() const; + Id getIdOperand(Id resultId, int idx) { return module.getInstruction(resultId)->getIdOperand(idx); } bool isPointer(Id resultId) const { return isPointerType(getTypeId(resultId)); } bool isScalar(Id resultId) const { return isScalarType(getTypeId(resultId)); } @@ -281,11 +286,10 @@ class Builder { bool isMatrixType(Id typeId) const { return getTypeClass(typeId) == OpTypeMatrix; } bool isStructType(Id typeId) const { return getTypeClass(typeId) == OpTypeStruct; } bool isArrayType(Id typeId) const { return getTypeClass(typeId) == OpTypeArray; } -#ifdef GLSLANG_WEB - bool isCooperativeMatrixType(Id typeId)const { return false; } -#else - bool isCooperativeMatrixType(Id typeId)const { return getTypeClass(typeId) == OpTypeCooperativeMatrixNV; } -#endif + bool isCooperativeMatrixType(Id typeId)const + { + return getTypeClass(typeId) == OpTypeCooperativeMatrixKHR || getTypeClass(typeId) == OpTypeCooperativeMatrixNV; + } bool isAggregateType(Id typeId) const { return isArrayType(typeId) || isStructType(typeId) || isCooperativeMatrixType(typeId); } bool isImageType(Id typeId) const { return getTypeClass(typeId) == OpTypeImage; } @@ -389,6 +393,7 @@ class Builder { void addDecoration(Id, Decoration, const char*); void addDecoration(Id, Decoration, const std::vector& literals); void addDecoration(Id, Decoration, const std::vector& strings); + void addLinkageDecoration(Id id, const char* name, spv::LinkageType linkType); void addDecorationId(Id id, Decoration, Id idDecoration); void addDecorationId(Id id, Decoration, const std::vector& operandIds); void addMemberDecoration(Id, unsigned int member, Decoration, int num = -1); @@ -413,8 +418,9 @@ class Builder { // Return the function, pass back the entry. // The returned pointer is only valid for the lifetime of this builder. Function* makeFunctionEntry(Decoration precision, Id returnType, const char* name, - const std::vector& paramTypes, const std::vector& paramNames, - const std::vector>& precisions, Block **entry = 0); + LinkageType linkType, const std::vector& paramTypes, + const std::vector& paramNames, + const std::vector>& precisions, Block **entry = nullptr); // Create a return. An 'implicit' return is one not appearing in the source // code. In the case of an implicit return, no post-return block is inserted. @@ -462,8 +468,10 @@ class Builder { // Create an OpArrayLength instruction Id createArrayLength(Id base, unsigned int member); + // Create an OpCooperativeMatrixLengthKHR instruction + Id createCooperativeMatrixLengthKHR(Id type); // Create an OpCooperativeMatrixLengthNV instruction - Id createCooperativeMatrixLength(Id type); + Id createCooperativeMatrixLengthNV(Id type); // Create an OpCompositeExtract instruction Id createCompositeExtract(Id composite, Id typeId, unsigned index); @@ -698,11 +706,6 @@ class Builder { // Accumulate whether anything in the chain of structures has coherent decorations. struct CoherentFlags { CoherentFlags() { clear(); } -#ifdef GLSLANG_WEB - void clear() { } - bool isVolatile() const { return false; } - CoherentFlags operator |=(const CoherentFlags &other) { return *this; } -#else bool isVolatile() const { return volatil; } bool isNonUniform() const { return nonUniform; } bool anyCoherent() const { @@ -747,7 +750,6 @@ class Builder { nonUniform |= other.nonUniform; return *this; } -#endif }; CoherentFlags coherentFlags; }; @@ -828,19 +830,17 @@ class Builder { // Add capabilities, extensions, remove unneeded decorations, etc., // based on the resulting SPIR-V. - void postProcess(); + void postProcess(bool compileOnly); // Prune unreachable blocks in the CFG and remove unneeded decorations. void postProcessCFG(); -#ifndef GLSLANG_WEB // Add capabilities, extensions based on instructions in the module. void postProcessFeatures(); // Hook to visit each instruction in a block in a function void postProcess(Instruction&); // Hook to visit each non-32-bit sized float/int operation in a block. void postProcessType(const Instruction&, spv::Id typeId); -#endif void dump(std::vector&) const; diff --git a/third_party/glslang/SPIRV/SpvPostProcess.cpp b/third_party/glslang/SPIRV/SpvPostProcess.cpp index dd6dabce0da..13001a67a18 100644 --- a/third_party/glslang/SPIRV/SpvPostProcess.cpp +++ b/third_party/glslang/SPIRV/SpvPostProcess.cpp @@ -52,11 +52,12 @@ namespace spv { #include "GLSL.ext.EXT.h" #include "GLSL.ext.AMD.h" #include "GLSL.ext.NV.h" + #include "GLSL.ext.ARM.h" + #include "GLSL.ext.QCOM.h" } namespace spv { -#ifndef GLSLANG_WEB // Hook to visit each operand type and result type of an instruction. // Will be called multiple times for one instruction, once for each typed // operand and the result. @@ -333,7 +334,6 @@ void Builder::postProcess(Instruction& inst) } } } -#endif // comment in header void Builder::postProcessCFG() @@ -394,7 +394,6 @@ void Builder::postProcessCFG() decorations.end()); } -#ifndef GLSLANG_WEB // comment in header void Builder::postProcessFeatures() { // Add per-instruction capabilities, extensions, etc., @@ -482,14 +481,15 @@ void Builder::postProcessFeatures() { } } } -#endif // comment in header -void Builder::postProcess() { - postProcessCFG(); -#ifndef GLSLANG_WEB - postProcessFeatures(); -#endif +void Builder::postProcess(bool compileOnly) +{ + // postProcessCFG needs an entrypoint to determine what is reachable, but if we are not creating an "executable" shader, we don't have an entrypoint + if (!compileOnly) + postProcessCFG(); + + postProcessFeatures(); } }; // end spv namespace diff --git a/third_party/glslang/SPIRV/SpvTools.cpp b/third_party/glslang/SPIRV/SpvTools.cpp index 8cc17cca934..ff04f4f9677 100644 --- a/third_party/glslang/SPIRV/SpvTools.cpp +++ b/third_party/glslang/SPIRV/SpvTools.cpp @@ -212,7 +212,7 @@ void SpirvToolsTransform(const glslang::TIntermediate& intermediate, std::vector optimizer.RegisterPass(spvtools::CreateInterpolateFixupPass()); if (options->optimizeSize) { optimizer.RegisterPass(spvtools::CreateRedundancyEliminationPass()); - optimizer.RegisterPass(spvtools::CreateEliminateDeadInputComponentsPass()); + optimizer.RegisterPass(spvtools::CreateEliminateDeadInputComponentsSafePass()); } optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); optimizer.RegisterPass(spvtools::CreateCFGCleanupPass()); @@ -223,6 +223,56 @@ void SpirvToolsTransform(const glslang::TIntermediate& intermediate, std::vector optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions); } +bool SpirvToolsAnalyzeDeadOutputStores(spv_target_env target_env, std::vector& spirv, + std::unordered_set* live_locs, + std::unordered_set* live_builtins, + spv::SpvBuildLogger*) +{ + spvtools::Optimizer optimizer(target_env); + optimizer.SetMessageConsumer(OptimizerMesssageConsumer); + + optimizer.RegisterPass(spvtools::CreateAnalyzeLiveInputPass(live_locs, live_builtins)); + + spvtools::OptimizerOptions spvOptOptions; + optimizer.SetTargetEnv(target_env); + spvOptOptions.set_run_validator(false); + return optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions); +} + +void SpirvToolsEliminateDeadOutputStores(spv_target_env target_env, std::vector& spirv, + std::unordered_set* live_locs, + std::unordered_set* live_builtins, + spv::SpvBuildLogger*) +{ + spvtools::Optimizer optimizer(target_env); + optimizer.SetMessageConsumer(OptimizerMesssageConsumer); + + optimizer.RegisterPass(spvtools::CreateEliminateDeadOutputStoresPass(live_locs, live_builtins)); + optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass(false, true)); + optimizer.RegisterPass(spvtools::CreateEliminateDeadOutputComponentsPass()); + optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass(false, true)); + + spvtools::OptimizerOptions spvOptOptions; + optimizer.SetTargetEnv(target_env); + spvOptOptions.set_run_validator(false); + optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions); +} + +void SpirvToolsEliminateDeadInputComponents(spv_target_env target_env, std::vector& spirv, + spv::SpvBuildLogger*) +{ + spvtools::Optimizer optimizer(target_env); + optimizer.SetMessageConsumer(OptimizerMesssageConsumer); + + optimizer.RegisterPass(spvtools::CreateEliminateDeadInputComponentsPass()); + optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); + + spvtools::OptimizerOptions spvOptOptions; + optimizer.SetTargetEnv(target_env); + spvOptOptions.set_run_validator(false); + optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions); +} + // Apply the SPIRV-Tools optimizer to strip debug info from SPIR-V. This is implicitly done by // SpirvToolsTransform if spvOptions->stripDebugInfo is set, but can be called separately if // optimization is disabled. diff --git a/third_party/glslang/SPIRV/SpvTools.h b/third_party/glslang/SPIRV/SpvTools.h index 5386048ab66..a4ce11b8879 100644 --- a/third_party/glslang/SPIRV/SpvTools.h +++ b/third_party/glslang/SPIRV/SpvTools.h @@ -61,10 +61,14 @@ struct SpvOptions { bool validate {false}; bool emitNonSemanticShaderDebugInfo {false}; bool emitNonSemanticShaderDebugSource{ false }; + bool compileOnly{false}; }; #if ENABLE_OPT +// Translate glslang's view of target versioning to what SPIRV-Tools uses. +spv_target_env MapToSpirvToolsEnv(const SpvVersion& spvVersion, spv::SpvBuildLogger* logger); + // Use the SPIRV-Tools disassembler to print SPIR-V using a SPV_ENV_UNIVERSAL_1_3 environment. void SpirvToolsDisassemble(std::ostream& out, const std::vector& spirv); @@ -80,6 +84,22 @@ void SpirvToolsValidate(const glslang::TIntermediate& intermediate, std::vector< void SpirvToolsTransform(const glslang::TIntermediate& intermediate, std::vector& spirv, spv::SpvBuildLogger*, const SpvOptions*); +// Apply the SPIRV-Tools EliminateDeadInputComponents pass to generated SPIR-V. Put result in |spirv|. +void SpirvToolsEliminateDeadInputComponents(spv_target_env target_env, std::vector& spirv, + spv::SpvBuildLogger*); + +// Apply the SPIRV-Tools AnalyzeDeadOutputStores pass to generated SPIR-V. Put result in |live_locs|. +// Return true if the result is valid. +bool SpirvToolsAnalyzeDeadOutputStores(spv_target_env target_env, std::vector& spirv, + std::unordered_set* live_locs, + std::unordered_set* live_builtins, spv::SpvBuildLogger*); + +// Apply the SPIRV-Tools EliminateDeadOutputStores and AggressiveDeadCodeElimination passes to generated SPIR-V using +// |live_locs|. Put result in |spirv|. +void SpirvToolsEliminateDeadOutputStores(spv_target_env target_env, std::vector& spirv, + std::unordered_set* live_locs, + std::unordered_set* live_builtins, spv::SpvBuildLogger*); + // Apply the SPIRV-Tools optimizer to strip debug info from SPIR-V. This is implicitly done by // SpirvToolsTransform if spvOptions->stripDebugInfo is set, but can be called separately if // optimization is disabled. diff --git a/third_party/glslang/SPIRV/disassemble.cpp b/third_party/glslang/SPIRV/disassemble.cpp index 74dd605409f..c5e961cf02e 100644 --- a/third_party/glslang/SPIRV/disassemble.cpp +++ b/third_party/glslang/SPIRV/disassemble.cpp @@ -54,6 +54,9 @@ namespace spv { #include "GLSL.std.450.h" #include "GLSL.ext.AMD.h" #include "GLSL.ext.NV.h" + #include "GLSL.ext.ARM.h" + #include "NonSemanticShaderDebugInfo100.h" + #include "GLSL.ext.QCOM.h" } } const char* GlslStd450DebugNames[spv::GLSLstd450Count]; @@ -62,6 +65,7 @@ namespace spv { static const char* GLSLextAMDGetDebugNames(const char*, unsigned); static const char* GLSLextNVGetDebugNames(const char*, unsigned); +static const char* NonSemanticShaderDebugInfo100GetDebugNames(unsigned); static void Kill(std::ostream& out, const char* message) { @@ -76,6 +80,7 @@ enum ExtInstSet { GLSLextNVInst, OpenCLExtInst, NonSemanticDebugPrintfExtInst, + NonSemanticShaderDebugInfo100 }; // Container class for a single instance of a SPIR-V stream, with methods for disassembly. @@ -501,6 +506,8 @@ void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode, extInstSet = OpenCLExtInst; } else if (strcmp("NonSemantic.DebugPrintf", name) == 0) { extInstSet = NonSemanticDebugPrintfExtInst; + } else if (strcmp("NonSemantic.Shader.DebugInfo.100", name) == 0) { + extInstSet = NonSemanticShaderDebugInfo100; } else if (strcmp(spv::E_SPV_AMD_shader_ballot, name) == 0 || strcmp(spv::E_SPV_AMD_shader_trinary_minmax, name) == 0 || strcmp(spv::E_SPV_AMD_shader_explicit_vertex_parameter, name) == 0 || @@ -509,7 +516,7 @@ void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode, } else if (strcmp(spv::E_SPV_NV_sample_mask_override_coverage, name) == 0 || strcmp(spv::E_SPV_NV_geometry_shader_passthrough, name) == 0 || strcmp(spv::E_SPV_NV_viewport_array2, name) == 0 || - strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0 || + strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0 || strcmp(spv::E_SPV_NV_fragment_shader_barycentric, name) == 0 || strcmp(spv::E_SPV_NV_mesh_shader, name) == 0) { extInstSet = GLSLextNVInst; @@ -526,6 +533,8 @@ void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode, out << "(" << GLSLextNVGetDebugNames(name, entrypoint) << ")"; } else if (extInstSet == NonSemanticDebugPrintfExtInst) { out << "(DebugPrintf)"; + } else if (extInstSet == NonSemanticShaderDebugInfo100) { + out << "(" << NonSemanticShaderDebugInfo100GetDebugNames(entrypoint) << ")"; } } break; @@ -749,6 +758,59 @@ static const char* GLSLextNVGetDebugNames(const char* name, unsigned entrypoint) return "Bad"; } +static const char* NonSemanticShaderDebugInfo100GetDebugNames(unsigned entrypoint) +{ + switch (entrypoint) { + case NonSemanticShaderDebugInfo100DebugInfoNone: return "DebugInfoNone"; + case NonSemanticShaderDebugInfo100DebugCompilationUnit: return "DebugCompilationUnit"; + case NonSemanticShaderDebugInfo100DebugTypeBasic: return "DebugTypeBasic"; + case NonSemanticShaderDebugInfo100DebugTypePointer: return "DebugTypePointer"; + case NonSemanticShaderDebugInfo100DebugTypeQualifier: return "DebugTypeQualifier"; + case NonSemanticShaderDebugInfo100DebugTypeArray: return "DebugTypeArray"; + case NonSemanticShaderDebugInfo100DebugTypeVector: return "DebugTypeVector"; + case NonSemanticShaderDebugInfo100DebugTypedef: return "DebugTypedef"; + case NonSemanticShaderDebugInfo100DebugTypeFunction: return "DebugTypeFunction"; + case NonSemanticShaderDebugInfo100DebugTypeEnum: return "DebugTypeEnum"; + case NonSemanticShaderDebugInfo100DebugTypeComposite: return "DebugTypeComposite"; + case NonSemanticShaderDebugInfo100DebugTypeMember: return "DebugTypeMember"; + case NonSemanticShaderDebugInfo100DebugTypeInheritance: return "DebugTypeInheritance"; + case NonSemanticShaderDebugInfo100DebugTypePtrToMember: return "DebugTypePtrToMember"; + case NonSemanticShaderDebugInfo100DebugTypeTemplate: return "DebugTypeTemplate"; + case NonSemanticShaderDebugInfo100DebugTypeTemplateParameter: return "DebugTypeTemplateParameter"; + case NonSemanticShaderDebugInfo100DebugTypeTemplateTemplateParameter: return "DebugTypeTemplateTemplateParameter"; + case NonSemanticShaderDebugInfo100DebugTypeTemplateParameterPack: return "DebugTypeTemplateParameterPack"; + case NonSemanticShaderDebugInfo100DebugGlobalVariable: return "DebugGlobalVariable"; + case NonSemanticShaderDebugInfo100DebugFunctionDeclaration: return "DebugFunctionDeclaration"; + case NonSemanticShaderDebugInfo100DebugFunction: return "DebugFunction"; + case NonSemanticShaderDebugInfo100DebugLexicalBlock: return "DebugLexicalBlock"; + case NonSemanticShaderDebugInfo100DebugLexicalBlockDiscriminator: return "DebugLexicalBlockDiscriminator"; + case NonSemanticShaderDebugInfo100DebugScope: return "DebugScope"; + case NonSemanticShaderDebugInfo100DebugNoScope: return "DebugNoScope"; + case NonSemanticShaderDebugInfo100DebugInlinedAt: return "DebugInlinedAt"; + case NonSemanticShaderDebugInfo100DebugLocalVariable: return "DebugLocalVariable"; + case NonSemanticShaderDebugInfo100DebugInlinedVariable: return "DebugInlinedVariable"; + case NonSemanticShaderDebugInfo100DebugDeclare: return "DebugDeclare"; + case NonSemanticShaderDebugInfo100DebugValue: return "DebugValue"; + case NonSemanticShaderDebugInfo100DebugOperation: return "DebugOperation"; + case NonSemanticShaderDebugInfo100DebugExpression: return "DebugExpression"; + case NonSemanticShaderDebugInfo100DebugMacroDef: return "DebugMacroDef"; + case NonSemanticShaderDebugInfo100DebugMacroUndef: return "DebugMacroUndef"; + case NonSemanticShaderDebugInfo100DebugImportedEntity: return "DebugImportedEntity"; + case NonSemanticShaderDebugInfo100DebugSource: return "DebugSource"; + case NonSemanticShaderDebugInfo100DebugFunctionDefinition: return "DebugFunctionDefinition"; + case NonSemanticShaderDebugInfo100DebugSourceContinued: return "DebugSourceContinued"; + case NonSemanticShaderDebugInfo100DebugLine: return "DebugLine"; + case NonSemanticShaderDebugInfo100DebugNoLine: return "DebugNoLine"; + case NonSemanticShaderDebugInfo100DebugBuildIdentifier: return "DebugBuildIdentifier"; + case NonSemanticShaderDebugInfo100DebugStoragePath: return "DebugStoragePath"; + case NonSemanticShaderDebugInfo100DebugEntryPoint: return "DebugEntryPoint"; + case NonSemanticShaderDebugInfo100DebugTypeMatrix: return "DebugTypeMatrix"; + default: return "Bad"; + } + + return "Bad"; +} + void Disassemble(std::ostream& out, const std::vector& stream) { SpirvStream SpirvStream(out, stream); diff --git a/third_party/glslang/SPIRV/doc.cpp b/third_party/glslang/SPIRV/doc.cpp index b7fe3e74246..53ce9e152b3 100644 --- a/third_party/glslang/SPIRV/doc.cpp +++ b/third_party/glslang/SPIRV/doc.cpp @@ -45,6 +45,7 @@ #include #include #include +#include namespace spv { extern "C" { @@ -53,6 +54,8 @@ namespace spv { #include "GLSL.ext.EXT.h" #include "GLSL.ext.AMD.h" #include "GLSL.ext.NV.h" + #include "GLSL.ext.ARM.h" + #include "GLSL.ext.QCOM.h" } } @@ -214,6 +217,10 @@ const char* ExecutionModeString(int mode) case ExecutionModeNoGlobalOffsetINTEL: return "NoGlobalOffsetINTEL"; case ExecutionModeNumSIMDWorkitemsINTEL: return "NumSIMDWorkitemsINTEL"; + case ExecutionModeNonCoherentColorAttachmentReadEXT: return "NonCoherentColorAttachmentReadEXT"; + case ExecutionModeNonCoherentDepthAttachmentReadEXT: return "NonCoherentDepthAttachmentReadEXT"; + case ExecutionModeNonCoherentStencilAttachmentReadEXT: return "NonCoherentStencilAttachmentReadEXT"; + case ExecutionModeCeiling: default: return "Bad"; } @@ -245,6 +252,8 @@ const char* StorageClassString(int StorageClass) case StorageClassPhysicalStorageBufferEXT: return "PhysicalStorageBufferEXT"; case StorageClassTaskPayloadWorkgroupEXT: return "TaskPayloadWorkgroupEXT"; + case StorageClassHitObjectAttributeNV: return "HitObjectAttributeNV"; + case StorageClassTileImageEXT: return "TileImageEXT"; default: return "Bad"; } } @@ -303,7 +312,9 @@ const char* DecorationString(int decoration) case DecorationCeiling: default: return "Bad"; - case DecorationExplicitInterpAMD: return "ExplicitInterpAMD"; + case DecorationWeightTextureQCOM: return "DecorationWeightTextureQCOM"; + case DecorationBlockMatchTextureQCOM: return "DecorationBlockMatchTextureQCOM"; + case DecorationExplicitInterpAMD: return "ExplicitInterpAMD"; case DecorationOverrideCoverageNV: return "OverrideCoverageNV"; case DecorationPassthroughNV: return "PassthroughNV"; case DecorationViewportRelativeNV: return "ViewportRelativeNV"; @@ -311,7 +322,7 @@ const char* DecorationString(int decoration) case DecorationPerPrimitiveNV: return "PerPrimitiveNV"; case DecorationPerViewNV: return "PerViewNV"; case DecorationPerTaskNV: return "PerTaskNV"; - + case DecorationPerVertexKHR: return "PerVertexKHR"; case DecorationNonUniformEXT: return "DecorationNonUniformEXT"; @@ -319,6 +330,8 @@ const char* DecorationString(int decoration) case DecorationHlslSemanticGOOGLE: return "DecorationHlslSemanticGOOGLE"; case DecorationRestrictPointerEXT: return "DecorationRestrictPointerEXT"; case DecorationAliasedPointerEXT: return "DecorationAliasedPointerEXT"; + + case DecorationHitObjectShaderRecordBufferNV: return "DecorationHitObjectShaderRecordBufferNV"; } } @@ -400,6 +413,11 @@ const char* BuiltInString(int builtIn) case BuiltInRayTminKHR: return "RayTminKHR"; case BuiltInRayTmaxKHR: return "RayTmaxKHR"; case BuiltInCullMaskKHR: return "CullMaskKHR"; + case BuiltInHitTriangleVertexPositionsKHR: return "HitTriangleVertexPositionsKHR"; + case BuiltInHitMicroTriangleVertexPositionsNV: return "HitMicroTriangleVertexPositionsNV"; + case BuiltInHitMicroTriangleVertexBarycentricsNV: return "HitMicroTriangleVertexBarycentricsNV"; + case BuiltInHitKindFrontFacingMicroTriangleNV: return "HitKindFrontFacingMicroTriangleNV"; + case BuiltInHitKindBackFacingMicroTriangleNV: return "HitKindBackFacingMicroTriangleNV"; case BuiltInInstanceCustomIndexKHR: return "InstanceCustomIndexKHR"; case BuiltInRayGeometryIndexKHR: return "RayGeometryIndexKHR"; case BuiltInObjectToWorldKHR: return "ObjectToWorldKHR"; @@ -439,6 +457,11 @@ const char* BuiltInString(int builtIn) case BuiltInPrimitiveLineIndicesEXT: return "PrimitiveLineIndicesEXT"; case BuiltInPrimitiveTriangleIndicesEXT: return "PrimitiveTriangleIndicesEXT"; case BuiltInCullPrimitiveEXT: return "CullPrimitiveEXT"; + case BuiltInCoreCountARM: return "CoreCountARM"; + case BuiltInCoreIDARM: return "CoreIDARM"; + case BuiltInCoreMaxIDARM: return "CoreMaxIDARM"; + case BuiltInWarpIDARM: return "WarpIDARM"; + case BuiltInWarpMaxIDARM: return "BuiltInWarpMaxIDARM"; default: return "Bad"; } @@ -454,6 +477,7 @@ const char* DimensionString(int dim) case 4: return "Rect"; case 5: return "Buffer"; case 6: return "SubpassData"; + case DimTileImageDataEXT: return "TileImageDataEXT"; default: return "Bad"; } @@ -568,7 +592,7 @@ const char* ImageChannelOrderString(int format) case 17: return "sRGBA"; case 18: return "sBGRA"; - default: + default: return "Bad"; } } @@ -773,6 +797,21 @@ const char* MemoryAccessString(int mem) } } +const int CooperativeMatrixOperandsCeiling = 6; + +const char* CooperativeMatrixOperandsString(int op) +{ + switch (op) { + case CooperativeMatrixOperandsMatrixASignedComponentsShift: return "ASignedComponents"; + case CooperativeMatrixOperandsMatrixBSignedComponentsShift: return "BSignedComponents"; + case CooperativeMatrixOperandsMatrixCSignedComponentsShift: return "CSignedComponents"; + case CooperativeMatrixOperandsMatrixResultSignedComponentsShift: return "ResultSignedComponents"; + case CooperativeMatrixOperandsSaturatingAccumulationShift: return "SaturatingAccumulation"; + + default: return "Bad"; + } +} + const char* ScopeString(int mem) { switch (mem) { @@ -854,7 +893,7 @@ const char* CapabilityString(int info) case 22: return "Int16"; case 23: return "TessellationPointSize"; case 24: return "GeometryPointSize"; - case 25: return "ImageGatherExtended"; + case 25: return "ImageGatherExtended"; case 26: return "Bad"; case 27: return "StorageImageMultisample"; case 28: return "UniformBufferArrayDynamicIndexing"; @@ -941,6 +980,10 @@ const char* CapabilityString(int info) case CapabilityRayQueryKHR: return "RayQueryKHR"; case CapabilityRayTracingProvisionalKHR: return "RayTracingProvisionalKHR"; case CapabilityRayTraversalPrimitiveCullingKHR: return "RayTraversalPrimitiveCullingKHR"; + case CapabilityRayTracingPositionFetchKHR: return "RayTracingPositionFetchKHR"; + case CapabilityDisplacementMicromapNV: return "DisplacementMicromapNV"; + case CapabilityRayTracingDisplacementMicromapNV: return "CapabilityRayTracingDisplacementMicromapNV"; + case CapabilityRayQueryPositionFetchKHR: return "RayQueryPositionFetchKHR"; case CapabilityComputeDerivativeGroupQuadsNV: return "ComputeDerivativeGroupQuadsNV"; case CapabilityComputeDerivativeGroupLinearNV: return "ComputeDerivativeGroupLinearNV"; case CapabilityFragmentBarycentricKHR: return "FragmentBarycentricKHR"; @@ -974,12 +1017,17 @@ const char* CapabilityString(int info) case CapabilityVariablePointers: return "VariablePointers"; case CapabilityCooperativeMatrixNV: return "CooperativeMatrixNV"; + case CapabilityCooperativeMatrixKHR: return "CooperativeMatrixKHR"; case CapabilityShaderSMBuiltinsNV: return "ShaderSMBuiltinsNV"; case CapabilityFragmentShaderSampleInterlockEXT: return "CapabilityFragmentShaderSampleInterlockEXT"; case CapabilityFragmentShaderPixelInterlockEXT: return "CapabilityFragmentShaderPixelInterlockEXT"; case CapabilityFragmentShaderShadingRateInterlockEXT: return "CapabilityFragmentShaderShadingRateInterlockEXT"; + case CapabilityTileImageColorReadAccessEXT: return "TileImageColorReadAccessEXT"; + case CapabilityTileImageDepthReadAccessEXT: return "TileImageDepthReadAccessEXT"; + case CapabilityTileImageStencilReadAccessEXT: return "TileImageStencilReadAccessEXT"; + case CapabilityFragmentShadingRateKHR: return "FragmentShadingRateKHR"; case CapabilityDemoteToHelperInvocationEXT: return "DemoteToHelperInvocationEXT"; @@ -998,6 +1046,13 @@ const char* CapabilityString(int info) case CapabilityWorkgroupMemoryExplicitLayoutKHR: return "CapabilityWorkgroupMemoryExplicitLayoutKHR"; case CapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR: return "CapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR"; case CapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR: return "CapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR"; + case CapabilityCoreBuiltinsARM: return "CoreBuiltinsARM"; + + case CapabilityShaderInvocationReorderNV: return "ShaderInvocationReorderNV"; + + case CapabilityTextureSampleWeightedQCOM: return "TextureSampleWeightedQCOM"; + case CapabilityTextureBoxFilterQCOM: return "TextureBoxFilterQCOM"; + case CapabilityTextureBlockMatchQCOM: return "TextureBlockMatchQCOM"; default: return "Bad"; } @@ -1441,18 +1496,70 @@ const char* OpcodeString(int op) case OpRayQueryGetWorldRayOriginKHR: return "OpRayQueryGetWorldRayOriginKHR"; case OpRayQueryGetIntersectionObjectToWorldKHR: return "OpRayQueryGetIntersectionObjectToWorldKHR"; case OpRayQueryGetIntersectionWorldToObjectKHR: return "OpRayQueryGetIntersectionWorldToObjectKHR"; + case OpRayQueryGetIntersectionTriangleVertexPositionsKHR: return "OpRayQueryGetIntersectionTriangleVertexPositionsKHR"; case OpTypeCooperativeMatrixNV: return "OpTypeCooperativeMatrixNV"; case OpCooperativeMatrixLoadNV: return "OpCooperativeMatrixLoadNV"; case OpCooperativeMatrixStoreNV: return "OpCooperativeMatrixStoreNV"; case OpCooperativeMatrixMulAddNV: return "OpCooperativeMatrixMulAddNV"; case OpCooperativeMatrixLengthNV: return "OpCooperativeMatrixLengthNV"; + case OpTypeCooperativeMatrixKHR: return "OpTypeCooperativeMatrixKHR"; + case OpCooperativeMatrixLoadKHR: return "OpCooperativeMatrixLoadKHR"; + case OpCooperativeMatrixStoreKHR: return "OpCooperativeMatrixStoreKHR"; + case OpCooperativeMatrixMulAddKHR: return "OpCooperativeMatrixMulAddKHR"; + case OpCooperativeMatrixLengthKHR: return "OpCooperativeMatrixLengthKHR"; case OpDemoteToHelperInvocationEXT: return "OpDemoteToHelperInvocationEXT"; case OpIsHelperInvocationEXT: return "OpIsHelperInvocationEXT"; case OpBeginInvocationInterlockEXT: return "OpBeginInvocationInterlockEXT"; case OpEndInvocationInterlockEXT: return "OpEndInvocationInterlockEXT"; + case OpTypeHitObjectNV: return "OpTypeHitObjectNV"; + case OpHitObjectTraceRayNV: return "OpHitObjectTraceRayNV"; + case OpHitObjectTraceRayMotionNV: return "OpHitObjectTraceRayMotionNV"; + case OpHitObjectRecordHitNV: return "OpHitObjectRecordHitNV"; + case OpHitObjectRecordHitMotionNV: return "OpHitObjectRecordHitMotionNV"; + case OpHitObjectRecordHitWithIndexNV: return "OpHitObjectRecordHitWithIndexNV"; + case OpHitObjectRecordHitWithIndexMotionNV: return "OpHitObjectRecordHitWithIndexMotionNV"; + case OpHitObjectRecordMissNV: return "OpHitObjectRecordMissNV"; + case OpHitObjectRecordMissMotionNV: return "OpHitObjectRecordMissMotionNV"; + case OpHitObjectRecordEmptyNV: return "OpHitObjectRecordEmptyNV"; + case OpHitObjectExecuteShaderNV: return "OpHitObjectExecuteShaderNV"; + case OpReorderThreadWithHintNV: return "OpReorderThreadWithHintNV"; + case OpReorderThreadWithHitObjectNV: return "OpReorderThreadWithHitObjectNV"; + case OpHitObjectGetCurrentTimeNV: return "OpHitObjectGetCurrentTimeNV"; + case OpHitObjectGetAttributesNV: return "OpHitObjectGetAttributesNV"; + case OpHitObjectGetHitKindNV: return "OpHitObjectGetFrontFaceNV"; + case OpHitObjectGetPrimitiveIndexNV: return "OpHitObjectGetPrimitiveIndexNV"; + case OpHitObjectGetGeometryIndexNV: return "OpHitObjectGetGeometryIndexNV"; + case OpHitObjectGetInstanceIdNV: return "OpHitObjectGetInstanceIdNV"; + case OpHitObjectGetInstanceCustomIndexNV: return "OpHitObjectGetInstanceCustomIndexNV"; + case OpHitObjectGetObjectRayDirectionNV: return "OpHitObjectGetObjectRayDirectionNV"; + case OpHitObjectGetObjectRayOriginNV: return "OpHitObjectGetObjectRayOriginNV"; + case OpHitObjectGetWorldRayDirectionNV: return "OpHitObjectGetWorldRayDirectionNV"; + case OpHitObjectGetWorldRayOriginNV: return "OpHitObjectGetWorldRayOriginNV"; + case OpHitObjectGetWorldToObjectNV: return "OpHitObjectGetWorldToObjectNV"; + case OpHitObjectGetObjectToWorldNV: return "OpHitObjectGetObjectToWorldNV"; + case OpHitObjectGetRayTMaxNV: return "OpHitObjectGetRayTMaxNV"; + case OpHitObjectGetRayTMinNV: return "OpHitObjectGetRayTMinNV"; + case OpHitObjectIsEmptyNV: return "OpHitObjectIsEmptyNV"; + case OpHitObjectIsHitNV: return "OpHitObjectIsHitNV"; + case OpHitObjectIsMissNV: return "OpHitObjectIsMissNV"; + case OpHitObjectGetShaderBindingTableRecordIndexNV: return "OpHitObjectGetShaderBindingTableRecordIndexNV"; + case OpHitObjectGetShaderRecordBufferHandleNV: return "OpHitObjectGetShaderRecordBufferHandleNV"; + + case OpFetchMicroTriangleVertexBarycentricNV: return "OpFetchMicroTriangleVertexBarycentricNV"; + case OpFetchMicroTriangleVertexPositionNV: return "OpFetchMicroTriangleVertexPositionNV"; + + case OpColorAttachmentReadEXT: return "OpColorAttachmentReadEXT"; + case OpDepthAttachmentReadEXT: return "OpDepthAttachmentReadEXT"; + case OpStencilAttachmentReadEXT: return "OpStencilAttachmentReadEXT"; + + case OpImageSampleWeightedQCOM: return "OpImageSampleWeightedQCOM"; + case OpImageBoxFilterQCOM: return "OpImageBoxFilterQCOM"; + case OpImageBlockMatchSADQCOM: return "OpImageBlockMatchSADQCOM"; + case OpImageBlockMatchSSDQCOM: return "OpImageBlockMatchSSDQCOM"; + default: return "Bad"; } @@ -1472,1564 +1579,1831 @@ EnumParameters LoopControlParams[FunctionControlCeiling]; EnumParameters SelectionControlParams[SelectControlCeiling]; EnumParameters FunctionControlParams[FunctionControlCeiling]; EnumParameters MemoryAccessParams[MemoryAccessCeiling]; +EnumParameters CooperativeMatrixOperandsParams[CooperativeMatrixOperandsCeiling]; // Set up all the parameterizing descriptions of the opcodes, operands, etc. void Parameterize() { // only do this once. - static bool initialized = false; - if (initialized) - return; - initialized = true; - - // Exceptions to having a result and a resulting type . - // (Everything is initialized to have both). - - InstructionDesc[OpNop].setResultAndType(false, false); - InstructionDesc[OpSource].setResultAndType(false, false); - InstructionDesc[OpSourceContinued].setResultAndType(false, false); - InstructionDesc[OpSourceExtension].setResultAndType(false, false); - InstructionDesc[OpExtension].setResultAndType(false, false); - InstructionDesc[OpExtInstImport].setResultAndType(true, false); - InstructionDesc[OpCapability].setResultAndType(false, false); - InstructionDesc[OpMemoryModel].setResultAndType(false, false); - InstructionDesc[OpEntryPoint].setResultAndType(false, false); - InstructionDesc[OpExecutionMode].setResultAndType(false, false); - InstructionDesc[OpExecutionModeId].setResultAndType(false, false); - InstructionDesc[OpTypeVoid].setResultAndType(true, false); - InstructionDesc[OpTypeBool].setResultAndType(true, false); - InstructionDesc[OpTypeInt].setResultAndType(true, false); - InstructionDesc[OpTypeFloat].setResultAndType(true, false); - InstructionDesc[OpTypeVector].setResultAndType(true, false); - InstructionDesc[OpTypeMatrix].setResultAndType(true, false); - InstructionDesc[OpTypeImage].setResultAndType(true, false); - InstructionDesc[OpTypeSampler].setResultAndType(true, false); - InstructionDesc[OpTypeSampledImage].setResultAndType(true, false); - InstructionDesc[OpTypeArray].setResultAndType(true, false); - InstructionDesc[OpTypeRuntimeArray].setResultAndType(true, false); - InstructionDesc[OpTypeStruct].setResultAndType(true, false); - InstructionDesc[OpTypeOpaque].setResultAndType(true, false); - InstructionDesc[OpTypePointer].setResultAndType(true, false); - InstructionDesc[OpTypeForwardPointer].setResultAndType(false, false); - InstructionDesc[OpTypeFunction].setResultAndType(true, false); - InstructionDesc[OpTypeEvent].setResultAndType(true, false); - InstructionDesc[OpTypeDeviceEvent].setResultAndType(true, false); - InstructionDesc[OpTypeReserveId].setResultAndType(true, false); - InstructionDesc[OpTypeQueue].setResultAndType(true, false); - InstructionDesc[OpTypePipe].setResultAndType(true, false); - InstructionDesc[OpFunctionEnd].setResultAndType(false, false); - InstructionDesc[OpStore].setResultAndType(false, false); - InstructionDesc[OpImageWrite].setResultAndType(false, false); - InstructionDesc[OpDecorationGroup].setResultAndType(true, false); - InstructionDesc[OpDecorate].setResultAndType(false, false); - InstructionDesc[OpDecorateId].setResultAndType(false, false); - InstructionDesc[OpDecorateStringGOOGLE].setResultAndType(false, false); - InstructionDesc[OpMemberDecorate].setResultAndType(false, false); - InstructionDesc[OpMemberDecorateStringGOOGLE].setResultAndType(false, false); - InstructionDesc[OpGroupDecorate].setResultAndType(false, false); - InstructionDesc[OpGroupMemberDecorate].setResultAndType(false, false); - InstructionDesc[OpName].setResultAndType(false, false); - InstructionDesc[OpMemberName].setResultAndType(false, false); - InstructionDesc[OpString].setResultAndType(true, false); - InstructionDesc[OpLine].setResultAndType(false, false); - InstructionDesc[OpNoLine].setResultAndType(false, false); - InstructionDesc[OpCopyMemory].setResultAndType(false, false); - InstructionDesc[OpCopyMemorySized].setResultAndType(false, false); - InstructionDesc[OpEmitVertex].setResultAndType(false, false); - InstructionDesc[OpEndPrimitive].setResultAndType(false, false); - InstructionDesc[OpEmitStreamVertex].setResultAndType(false, false); - InstructionDesc[OpEndStreamPrimitive].setResultAndType(false, false); - InstructionDesc[OpControlBarrier].setResultAndType(false, false); - InstructionDesc[OpMemoryBarrier].setResultAndType(false, false); - InstructionDesc[OpAtomicStore].setResultAndType(false, false); - InstructionDesc[OpLoopMerge].setResultAndType(false, false); - InstructionDesc[OpSelectionMerge].setResultAndType(false, false); - InstructionDesc[OpLabel].setResultAndType(true, false); - InstructionDesc[OpBranch].setResultAndType(false, false); - InstructionDesc[OpBranchConditional].setResultAndType(false, false); - InstructionDesc[OpSwitch].setResultAndType(false, false); - InstructionDesc[OpKill].setResultAndType(false, false); - InstructionDesc[OpTerminateInvocation].setResultAndType(false, false); - InstructionDesc[OpReturn].setResultAndType(false, false); - InstructionDesc[OpReturnValue].setResultAndType(false, false); - InstructionDesc[OpUnreachable].setResultAndType(false, false); - InstructionDesc[OpLifetimeStart].setResultAndType(false, false); - InstructionDesc[OpLifetimeStop].setResultAndType(false, false); - InstructionDesc[OpCommitReadPipe].setResultAndType(false, false); - InstructionDesc[OpCommitWritePipe].setResultAndType(false, false); - InstructionDesc[OpGroupCommitWritePipe].setResultAndType(false, false); - InstructionDesc[OpGroupCommitReadPipe].setResultAndType(false, false); - InstructionDesc[OpCaptureEventProfilingInfo].setResultAndType(false, false); - InstructionDesc[OpSetUserEventStatus].setResultAndType(false, false); - InstructionDesc[OpRetainEvent].setResultAndType(false, false); - InstructionDesc[OpReleaseEvent].setResultAndType(false, false); - InstructionDesc[OpGroupWaitEvents].setResultAndType(false, false); - InstructionDesc[OpAtomicFlagClear].setResultAndType(false, false); - InstructionDesc[OpModuleProcessed].setResultAndType(false, false); - InstructionDesc[OpTypeCooperativeMatrixNV].setResultAndType(true, false); - InstructionDesc[OpCooperativeMatrixStoreNV].setResultAndType(false, false); - InstructionDesc[OpBeginInvocationInterlockEXT].setResultAndType(false, false); - InstructionDesc[OpEndInvocationInterlockEXT].setResultAndType(false, false); - - // Specific additional context-dependent operands - - ExecutionModeOperands[ExecutionModeInvocations].push(OperandLiteralNumber, "'Number of <>'"); - - ExecutionModeOperands[ExecutionModeLocalSize].push(OperandLiteralNumber, "'x size'"); - ExecutionModeOperands[ExecutionModeLocalSize].push(OperandLiteralNumber, "'y size'"); - ExecutionModeOperands[ExecutionModeLocalSize].push(OperandLiteralNumber, "'z size'"); - - ExecutionModeOperands[ExecutionModeLocalSizeHint].push(OperandLiteralNumber, "'x size'"); - ExecutionModeOperands[ExecutionModeLocalSizeHint].push(OperandLiteralNumber, "'y size'"); - ExecutionModeOperands[ExecutionModeLocalSizeHint].push(OperandLiteralNumber, "'z size'"); - - ExecutionModeOperands[ExecutionModeOutputVertices].push(OperandLiteralNumber, "'Vertex count'"); - ExecutionModeOperands[ExecutionModeVecTypeHint].push(OperandLiteralNumber, "'Vector type'"); - - DecorationOperands[DecorationStream].push(OperandLiteralNumber, "'Stream Number'"); - DecorationOperands[DecorationLocation].push(OperandLiteralNumber, "'Location'"); - DecorationOperands[DecorationComponent].push(OperandLiteralNumber, "'Component'"); - DecorationOperands[DecorationIndex].push(OperandLiteralNumber, "'Index'"); - DecorationOperands[DecorationBinding].push(OperandLiteralNumber, "'Binding Point'"); - DecorationOperands[DecorationDescriptorSet].push(OperandLiteralNumber, "'Descriptor Set'"); - DecorationOperands[DecorationOffset].push(OperandLiteralNumber, "'Byte Offset'"); - DecorationOperands[DecorationXfbBuffer].push(OperandLiteralNumber, "'XFB Buffer Number'"); - DecorationOperands[DecorationXfbStride].push(OperandLiteralNumber, "'XFB Stride'"); - DecorationOperands[DecorationArrayStride].push(OperandLiteralNumber, "'Array Stride'"); - DecorationOperands[DecorationMatrixStride].push(OperandLiteralNumber, "'Matrix Stride'"); - DecorationOperands[DecorationBuiltIn].push(OperandLiteralNumber, "See <>"); - DecorationOperands[DecorationFPRoundingMode].push(OperandFPRoundingMode, "'Floating-Point Rounding Mode'"); - DecorationOperands[DecorationFPFastMathMode].push(OperandFPFastMath, "'Fast-Math Mode'"); - DecorationOperands[DecorationLinkageAttributes].push(OperandLiteralString, "'Name'"); - DecorationOperands[DecorationLinkageAttributes].push(OperandLinkageType, "'Linkage Type'"); - DecorationOperands[DecorationFuncParamAttr].push(OperandFuncParamAttr, "'Function Parameter Attribute'"); - DecorationOperands[DecorationSpecId].push(OperandLiteralNumber, "'Specialization Constant ID'"); - DecorationOperands[DecorationInputAttachmentIndex].push(OperandLiteralNumber, "'Attachment Index'"); - DecorationOperands[DecorationAlignment].push(OperandLiteralNumber, "'Alignment'"); - - OperandClassParams[OperandSource].set(0, SourceString, 0); - OperandClassParams[OperandExecutionModel].set(0, ExecutionModelString, nullptr); - OperandClassParams[OperandAddressing].set(0, AddressingString, nullptr); - OperandClassParams[OperandMemory].set(0, MemoryString, nullptr); - OperandClassParams[OperandExecutionMode].set(ExecutionModeCeiling, ExecutionModeString, ExecutionModeParams); - OperandClassParams[OperandExecutionMode].setOperands(ExecutionModeOperands); - OperandClassParams[OperandStorage].set(0, StorageClassString, nullptr); - OperandClassParams[OperandDimensionality].set(0, DimensionString, nullptr); - OperandClassParams[OperandSamplerAddressingMode].set(0, SamplerAddressingModeString, nullptr); - OperandClassParams[OperandSamplerFilterMode].set(0, SamplerFilterModeString, nullptr); - OperandClassParams[OperandSamplerImageFormat].set(0, ImageFormatString, nullptr); - OperandClassParams[OperandImageChannelOrder].set(0, ImageChannelOrderString, nullptr); - OperandClassParams[OperandImageChannelDataType].set(0, ImageChannelDataTypeString, nullptr); - OperandClassParams[OperandImageOperands].set(ImageOperandsCeiling, ImageOperandsString, ImageOperandsParams, true); - OperandClassParams[OperandFPFastMath].set(0, FPFastMathString, nullptr, true); - OperandClassParams[OperandFPRoundingMode].set(0, FPRoundingModeString, nullptr); - OperandClassParams[OperandLinkageType].set(0, LinkageTypeString, nullptr); - OperandClassParams[OperandFuncParamAttr].set(0, FuncParamAttrString, nullptr); - OperandClassParams[OperandAccessQualifier].set(0, AccessQualifierString, nullptr); - OperandClassParams[OperandDecoration].set(DecorationCeiling, DecorationString, DecorationParams); - OperandClassParams[OperandDecoration].setOperands(DecorationOperands); - OperandClassParams[OperandBuiltIn].set(0, BuiltInString, nullptr); - OperandClassParams[OperandSelect].set(SelectControlCeiling, SelectControlString, SelectionControlParams, true); - OperandClassParams[OperandLoop].set(LoopControlCeiling, LoopControlString, LoopControlParams, true); - OperandClassParams[OperandFunction].set(FunctionControlCeiling, FunctionControlString, FunctionControlParams, true); - OperandClassParams[OperandMemorySemantics].set(0, MemorySemanticsString, nullptr, true); - OperandClassParams[OperandMemoryAccess].set(MemoryAccessCeiling, MemoryAccessString, MemoryAccessParams, true); - OperandClassParams[OperandScope].set(0, ScopeString, nullptr); - OperandClassParams[OperandGroupOperation].set(0, GroupOperationString, nullptr); - OperandClassParams[OperandKernelEnqueueFlags].set(0, KernelEnqueueFlagsString, nullptr); - OperandClassParams[OperandKernelProfilingInfo].set(0, KernelProfilingInfoString, nullptr, true); - OperandClassParams[OperandCapability].set(0, CapabilityString, nullptr); - OperandClassParams[OperandOpcode].set(OpCodeMask + 1, OpcodeString, 0); - - // set name of operator, an initial set of style operands, and the description - - InstructionDesc[OpSource].operands.push(OperandSource, ""); - InstructionDesc[OpSource].operands.push(OperandLiteralNumber, "'Version'"); - InstructionDesc[OpSource].operands.push(OperandId, "'File'", true); - InstructionDesc[OpSource].operands.push(OperandLiteralString, "'Source'", true); - - InstructionDesc[OpSourceContinued].operands.push(OperandLiteralString, "'Continued Source'"); - - InstructionDesc[OpSourceExtension].operands.push(OperandLiteralString, "'Extension'"); - - InstructionDesc[OpName].operands.push(OperandId, "'Target'"); - InstructionDesc[OpName].operands.push(OperandLiteralString, "'Name'"); - - InstructionDesc[OpMemberName].operands.push(OperandId, "'Type'"); - InstructionDesc[OpMemberName].operands.push(OperandLiteralNumber, "'Member'"); - InstructionDesc[OpMemberName].operands.push(OperandLiteralString, "'Name'"); - - InstructionDesc[OpString].operands.push(OperandLiteralString, "'String'"); - - InstructionDesc[OpLine].operands.push(OperandId, "'File'"); - InstructionDesc[OpLine].operands.push(OperandLiteralNumber, "'Line'"); - InstructionDesc[OpLine].operands.push(OperandLiteralNumber, "'Column'"); - - InstructionDesc[OpExtension].operands.push(OperandLiteralString, "'Name'"); - - InstructionDesc[OpExtInstImport].operands.push(OperandLiteralString, "'Name'"); - - InstructionDesc[OpCapability].operands.push(OperandCapability, "'Capability'"); + static std::once_flag initialized; + std::call_once(initialized, [](){ + + // Exceptions to having a result and a resulting type . + // (Everything is initialized to have both). + + InstructionDesc[OpNop].setResultAndType(false, false); + InstructionDesc[OpSource].setResultAndType(false, false); + InstructionDesc[OpSourceContinued].setResultAndType(false, false); + InstructionDesc[OpSourceExtension].setResultAndType(false, false); + InstructionDesc[OpExtension].setResultAndType(false, false); + InstructionDesc[OpExtInstImport].setResultAndType(true, false); + InstructionDesc[OpCapability].setResultAndType(false, false); + InstructionDesc[OpMemoryModel].setResultAndType(false, false); + InstructionDesc[OpEntryPoint].setResultAndType(false, false); + InstructionDesc[OpExecutionMode].setResultAndType(false, false); + InstructionDesc[OpExecutionModeId].setResultAndType(false, false); + InstructionDesc[OpTypeVoid].setResultAndType(true, false); + InstructionDesc[OpTypeBool].setResultAndType(true, false); + InstructionDesc[OpTypeInt].setResultAndType(true, false); + InstructionDesc[OpTypeFloat].setResultAndType(true, false); + InstructionDesc[OpTypeVector].setResultAndType(true, false); + InstructionDesc[OpTypeMatrix].setResultAndType(true, false); + InstructionDesc[OpTypeImage].setResultAndType(true, false); + InstructionDesc[OpTypeSampler].setResultAndType(true, false); + InstructionDesc[OpTypeSampledImage].setResultAndType(true, false); + InstructionDesc[OpTypeArray].setResultAndType(true, false); + InstructionDesc[OpTypeRuntimeArray].setResultAndType(true, false); + InstructionDesc[OpTypeStruct].setResultAndType(true, false); + InstructionDesc[OpTypeOpaque].setResultAndType(true, false); + InstructionDesc[OpTypePointer].setResultAndType(true, false); + InstructionDesc[OpTypeForwardPointer].setResultAndType(false, false); + InstructionDesc[OpTypeFunction].setResultAndType(true, false); + InstructionDesc[OpTypeEvent].setResultAndType(true, false); + InstructionDesc[OpTypeDeviceEvent].setResultAndType(true, false); + InstructionDesc[OpTypeReserveId].setResultAndType(true, false); + InstructionDesc[OpTypeQueue].setResultAndType(true, false); + InstructionDesc[OpTypePipe].setResultAndType(true, false); + InstructionDesc[OpFunctionEnd].setResultAndType(false, false); + InstructionDesc[OpStore].setResultAndType(false, false); + InstructionDesc[OpImageWrite].setResultAndType(false, false); + InstructionDesc[OpDecorationGroup].setResultAndType(true, false); + InstructionDesc[OpDecorate].setResultAndType(false, false); + InstructionDesc[OpDecorateId].setResultAndType(false, false); + InstructionDesc[OpDecorateStringGOOGLE].setResultAndType(false, false); + InstructionDesc[OpMemberDecorate].setResultAndType(false, false); + InstructionDesc[OpMemberDecorateStringGOOGLE].setResultAndType(false, false); + InstructionDesc[OpGroupDecorate].setResultAndType(false, false); + InstructionDesc[OpGroupMemberDecorate].setResultAndType(false, false); + InstructionDesc[OpName].setResultAndType(false, false); + InstructionDesc[OpMemberName].setResultAndType(false, false); + InstructionDesc[OpString].setResultAndType(true, false); + InstructionDesc[OpLine].setResultAndType(false, false); + InstructionDesc[OpNoLine].setResultAndType(false, false); + InstructionDesc[OpCopyMemory].setResultAndType(false, false); + InstructionDesc[OpCopyMemorySized].setResultAndType(false, false); + InstructionDesc[OpEmitVertex].setResultAndType(false, false); + InstructionDesc[OpEndPrimitive].setResultAndType(false, false); + InstructionDesc[OpEmitStreamVertex].setResultAndType(false, false); + InstructionDesc[OpEndStreamPrimitive].setResultAndType(false, false); + InstructionDesc[OpControlBarrier].setResultAndType(false, false); + InstructionDesc[OpMemoryBarrier].setResultAndType(false, false); + InstructionDesc[OpAtomicStore].setResultAndType(false, false); + InstructionDesc[OpLoopMerge].setResultAndType(false, false); + InstructionDesc[OpSelectionMerge].setResultAndType(false, false); + InstructionDesc[OpLabel].setResultAndType(true, false); + InstructionDesc[OpBranch].setResultAndType(false, false); + InstructionDesc[OpBranchConditional].setResultAndType(false, false); + InstructionDesc[OpSwitch].setResultAndType(false, false); + InstructionDesc[OpKill].setResultAndType(false, false); + InstructionDesc[OpTerminateInvocation].setResultAndType(false, false); + InstructionDesc[OpReturn].setResultAndType(false, false); + InstructionDesc[OpReturnValue].setResultAndType(false, false); + InstructionDesc[OpUnreachable].setResultAndType(false, false); + InstructionDesc[OpLifetimeStart].setResultAndType(false, false); + InstructionDesc[OpLifetimeStop].setResultAndType(false, false); + InstructionDesc[OpCommitReadPipe].setResultAndType(false, false); + InstructionDesc[OpCommitWritePipe].setResultAndType(false, false); + InstructionDesc[OpGroupCommitWritePipe].setResultAndType(false, false); + InstructionDesc[OpGroupCommitReadPipe].setResultAndType(false, false); + InstructionDesc[OpCaptureEventProfilingInfo].setResultAndType(false, false); + InstructionDesc[OpSetUserEventStatus].setResultAndType(false, false); + InstructionDesc[OpRetainEvent].setResultAndType(false, false); + InstructionDesc[OpReleaseEvent].setResultAndType(false, false); + InstructionDesc[OpGroupWaitEvents].setResultAndType(false, false); + InstructionDesc[OpAtomicFlagClear].setResultAndType(false, false); + InstructionDesc[OpModuleProcessed].setResultAndType(false, false); + InstructionDesc[OpTypeCooperativeMatrixNV].setResultAndType(true, false); + InstructionDesc[OpCooperativeMatrixStoreNV].setResultAndType(false, false); + InstructionDesc[OpTypeCooperativeMatrixKHR].setResultAndType(true, false); + InstructionDesc[OpCooperativeMatrixStoreKHR].setResultAndType(false, false); + InstructionDesc[OpBeginInvocationInterlockEXT].setResultAndType(false, false); + InstructionDesc[OpEndInvocationInterlockEXT].setResultAndType(false, false); + + // Specific additional context-dependent operands + + ExecutionModeOperands[ExecutionModeInvocations].push(OperandLiteralNumber, "'Number of <>'"); + + ExecutionModeOperands[ExecutionModeLocalSize].push(OperandLiteralNumber, "'x size'"); + ExecutionModeOperands[ExecutionModeLocalSize].push(OperandLiteralNumber, "'y size'"); + ExecutionModeOperands[ExecutionModeLocalSize].push(OperandLiteralNumber, "'z size'"); + + ExecutionModeOperands[ExecutionModeLocalSizeHint].push(OperandLiteralNumber, "'x size'"); + ExecutionModeOperands[ExecutionModeLocalSizeHint].push(OperandLiteralNumber, "'y size'"); + ExecutionModeOperands[ExecutionModeLocalSizeHint].push(OperandLiteralNumber, "'z size'"); + + ExecutionModeOperands[ExecutionModeOutputVertices].push(OperandLiteralNumber, "'Vertex count'"); + ExecutionModeOperands[ExecutionModeVecTypeHint].push(OperandLiteralNumber, "'Vector type'"); + + DecorationOperands[DecorationStream].push(OperandLiteralNumber, "'Stream Number'"); + DecorationOperands[DecorationLocation].push(OperandLiteralNumber, "'Location'"); + DecorationOperands[DecorationComponent].push(OperandLiteralNumber, "'Component'"); + DecorationOperands[DecorationIndex].push(OperandLiteralNumber, "'Index'"); + DecorationOperands[DecorationBinding].push(OperandLiteralNumber, "'Binding Point'"); + DecorationOperands[DecorationDescriptorSet].push(OperandLiteralNumber, "'Descriptor Set'"); + DecorationOperands[DecorationOffset].push(OperandLiteralNumber, "'Byte Offset'"); + DecorationOperands[DecorationXfbBuffer].push(OperandLiteralNumber, "'XFB Buffer Number'"); + DecorationOperands[DecorationXfbStride].push(OperandLiteralNumber, "'XFB Stride'"); + DecorationOperands[DecorationArrayStride].push(OperandLiteralNumber, "'Array Stride'"); + DecorationOperands[DecorationMatrixStride].push(OperandLiteralNumber, "'Matrix Stride'"); + DecorationOperands[DecorationBuiltIn].push(OperandLiteralNumber, "See <>"); + DecorationOperands[DecorationFPRoundingMode].push(OperandFPRoundingMode, "'Floating-Point Rounding Mode'"); + DecorationOperands[DecorationFPFastMathMode].push(OperandFPFastMath, "'Fast-Math Mode'"); + DecorationOperands[DecorationLinkageAttributes].push(OperandLiteralString, "'Name'"); + DecorationOperands[DecorationLinkageAttributes].push(OperandLinkageType, "'Linkage Type'"); + DecorationOperands[DecorationFuncParamAttr].push(OperandFuncParamAttr, "'Function Parameter Attribute'"); + DecorationOperands[DecorationSpecId].push(OperandLiteralNumber, "'Specialization Constant ID'"); + DecorationOperands[DecorationInputAttachmentIndex].push(OperandLiteralNumber, "'Attachment Index'"); + DecorationOperands[DecorationAlignment].push(OperandLiteralNumber, "'Alignment'"); + + OperandClassParams[OperandSource].set(0, SourceString, nullptr); + OperandClassParams[OperandExecutionModel].set(0, ExecutionModelString, nullptr); + OperandClassParams[OperandAddressing].set(0, AddressingString, nullptr); + OperandClassParams[OperandMemory].set(0, MemoryString, nullptr); + OperandClassParams[OperandExecutionMode].set(ExecutionModeCeiling, ExecutionModeString, ExecutionModeParams); + OperandClassParams[OperandExecutionMode].setOperands(ExecutionModeOperands); + OperandClassParams[OperandStorage].set(0, StorageClassString, nullptr); + OperandClassParams[OperandDimensionality].set(0, DimensionString, nullptr); + OperandClassParams[OperandSamplerAddressingMode].set(0, SamplerAddressingModeString, nullptr); + OperandClassParams[OperandSamplerFilterMode].set(0, SamplerFilterModeString, nullptr); + OperandClassParams[OperandSamplerImageFormat].set(0, ImageFormatString, nullptr); + OperandClassParams[OperandImageChannelOrder].set(0, ImageChannelOrderString, nullptr); + OperandClassParams[OperandImageChannelDataType].set(0, ImageChannelDataTypeString, nullptr); + OperandClassParams[OperandImageOperands].set(ImageOperandsCeiling, ImageOperandsString, ImageOperandsParams, true); + OperandClassParams[OperandFPFastMath].set(0, FPFastMathString, nullptr, true); + OperandClassParams[OperandFPRoundingMode].set(0, FPRoundingModeString, nullptr); + OperandClassParams[OperandLinkageType].set(0, LinkageTypeString, nullptr); + OperandClassParams[OperandFuncParamAttr].set(0, FuncParamAttrString, nullptr); + OperandClassParams[OperandAccessQualifier].set(0, AccessQualifierString, nullptr); + OperandClassParams[OperandDecoration].set(DecorationCeiling, DecorationString, DecorationParams); + OperandClassParams[OperandDecoration].setOperands(DecorationOperands); + OperandClassParams[OperandBuiltIn].set(0, BuiltInString, nullptr); + OperandClassParams[OperandSelect].set(SelectControlCeiling, SelectControlString, SelectionControlParams, true); + OperandClassParams[OperandLoop].set(LoopControlCeiling, LoopControlString, LoopControlParams, true); + OperandClassParams[OperandFunction].set(FunctionControlCeiling, FunctionControlString, FunctionControlParams, true); + OperandClassParams[OperandMemorySemantics].set(0, MemorySemanticsString, nullptr, true); + OperandClassParams[OperandMemoryAccess].set(MemoryAccessCeiling, MemoryAccessString, MemoryAccessParams, true); + OperandClassParams[OperandScope].set(0, ScopeString, nullptr); + OperandClassParams[OperandGroupOperation].set(0, GroupOperationString, nullptr); + OperandClassParams[OperandKernelEnqueueFlags].set(0, KernelEnqueueFlagsString, nullptr); + OperandClassParams[OperandKernelProfilingInfo].set(0, KernelProfilingInfoString, nullptr, true); + OperandClassParams[OperandCapability].set(0, CapabilityString, nullptr); + OperandClassParams[OperandCooperativeMatrixOperands].set(CooperativeMatrixOperandsCeiling, CooperativeMatrixOperandsString, CooperativeMatrixOperandsParams, true); + OperandClassParams[OperandOpcode].set(OpCodeMask + 1, OpcodeString, nullptr); + + // set name of operator, an initial set of style operands, and the description + + InstructionDesc[OpSource].operands.push(OperandSource, ""); + InstructionDesc[OpSource].operands.push(OperandLiteralNumber, "'Version'"); + InstructionDesc[OpSource].operands.push(OperandId, "'File'", true); + InstructionDesc[OpSource].operands.push(OperandLiteralString, "'Source'", true); + + InstructionDesc[OpSourceContinued].operands.push(OperandLiteralString, "'Continued Source'"); + + InstructionDesc[OpSourceExtension].operands.push(OperandLiteralString, "'Extension'"); + + InstructionDesc[OpName].operands.push(OperandId, "'Target'"); + InstructionDesc[OpName].operands.push(OperandLiteralString, "'Name'"); + + InstructionDesc[OpMemberName].operands.push(OperandId, "'Type'"); + InstructionDesc[OpMemberName].operands.push(OperandLiteralNumber, "'Member'"); + InstructionDesc[OpMemberName].operands.push(OperandLiteralString, "'Name'"); + + InstructionDesc[OpString].operands.push(OperandLiteralString, "'String'"); + + InstructionDesc[OpLine].operands.push(OperandId, "'File'"); + InstructionDesc[OpLine].operands.push(OperandLiteralNumber, "'Line'"); + InstructionDesc[OpLine].operands.push(OperandLiteralNumber, "'Column'"); + + InstructionDesc[OpExtension].operands.push(OperandLiteralString, "'Name'"); + + InstructionDesc[OpExtInstImport].operands.push(OperandLiteralString, "'Name'"); + + InstructionDesc[OpCapability].operands.push(OperandCapability, "'Capability'"); + + InstructionDesc[OpMemoryModel].operands.push(OperandAddressing, ""); + InstructionDesc[OpMemoryModel].operands.push(OperandMemory, ""); + + InstructionDesc[OpEntryPoint].operands.push(OperandExecutionModel, ""); + InstructionDesc[OpEntryPoint].operands.push(OperandId, "'Entry Point'"); + InstructionDesc[OpEntryPoint].operands.push(OperandLiteralString, "'Name'"); + InstructionDesc[OpEntryPoint].operands.push(OperandVariableIds, "'Interface'"); + + InstructionDesc[OpExecutionMode].operands.push(OperandId, "'Entry Point'"); + InstructionDesc[OpExecutionMode].operands.push(OperandExecutionMode, "'Mode'"); + InstructionDesc[OpExecutionMode].operands.push(OperandOptionalLiteral, "See <>"); + + InstructionDesc[OpExecutionModeId].operands.push(OperandId, "'Entry Point'"); + InstructionDesc[OpExecutionModeId].operands.push(OperandExecutionMode, "'Mode'"); + InstructionDesc[OpExecutionModeId].operands.push(OperandVariableIds, "See <>"); + + InstructionDesc[OpTypeInt].operands.push(OperandLiteralNumber, "'Width'"); + InstructionDesc[OpTypeInt].operands.push(OperandLiteralNumber, "'Signedness'"); + + InstructionDesc[OpTypeFloat].operands.push(OperandLiteralNumber, "'Width'"); + + InstructionDesc[OpTypeVector].operands.push(OperandId, "'Component Type'"); + InstructionDesc[OpTypeVector].operands.push(OperandLiteralNumber, "'Component Count'"); + + InstructionDesc[OpTypeMatrix].operands.push(OperandId, "'Column Type'"); + InstructionDesc[OpTypeMatrix].operands.push(OperandLiteralNumber, "'Column Count'"); + + InstructionDesc[OpTypeImage].operands.push(OperandId, "'Sampled Type'"); + InstructionDesc[OpTypeImage].operands.push(OperandDimensionality, ""); + InstructionDesc[OpTypeImage].operands.push(OperandLiteralNumber, "'Depth'"); + InstructionDesc[OpTypeImage].operands.push(OperandLiteralNumber, "'Arrayed'"); + InstructionDesc[OpTypeImage].operands.push(OperandLiteralNumber, "'MS'"); + InstructionDesc[OpTypeImage].operands.push(OperandLiteralNumber, "'Sampled'"); + InstructionDesc[OpTypeImage].operands.push(OperandSamplerImageFormat, ""); + InstructionDesc[OpTypeImage].operands.push(OperandAccessQualifier, "", true); + + InstructionDesc[OpTypeSampledImage].operands.push(OperandId, "'Image Type'"); + + InstructionDesc[OpTypeArray].operands.push(OperandId, "'Element Type'"); + InstructionDesc[OpTypeArray].operands.push(OperandId, "'Length'"); + + InstructionDesc[OpTypeRuntimeArray].operands.push(OperandId, "'Element Type'"); + + InstructionDesc[OpTypeStruct].operands.push(OperandVariableIds, "'Member 0 type', +\n'member 1 type', +\n..."); + + InstructionDesc[OpTypeOpaque].operands.push(OperandLiteralString, "The name of the opaque type."); + + InstructionDesc[OpTypePointer].operands.push(OperandStorage, ""); + InstructionDesc[OpTypePointer].operands.push(OperandId, "'Type'"); + + InstructionDesc[OpTypeForwardPointer].operands.push(OperandId, "'Pointer Type'"); + InstructionDesc[OpTypeForwardPointer].operands.push(OperandStorage, ""); + + InstructionDesc[OpTypePipe].operands.push(OperandAccessQualifier, "'Qualifier'"); - InstructionDesc[OpMemoryModel].operands.push(OperandAddressing, ""); - InstructionDesc[OpMemoryModel].operands.push(OperandMemory, ""); - - InstructionDesc[OpEntryPoint].operands.push(OperandExecutionModel, ""); - InstructionDesc[OpEntryPoint].operands.push(OperandId, "'Entry Point'"); - InstructionDesc[OpEntryPoint].operands.push(OperandLiteralString, "'Name'"); - InstructionDesc[OpEntryPoint].operands.push(OperandVariableIds, "'Interface'"); - - InstructionDesc[OpExecutionMode].operands.push(OperandId, "'Entry Point'"); - InstructionDesc[OpExecutionMode].operands.push(OperandExecutionMode, "'Mode'"); - InstructionDesc[OpExecutionMode].operands.push(OperandOptionalLiteral, "See <>"); - - InstructionDesc[OpExecutionModeId].operands.push(OperandId, "'Entry Point'"); - InstructionDesc[OpExecutionModeId].operands.push(OperandExecutionMode, "'Mode'"); - InstructionDesc[OpExecutionModeId].operands.push(OperandVariableIds, "See <>"); - - InstructionDesc[OpTypeInt].operands.push(OperandLiteralNumber, "'Width'"); - InstructionDesc[OpTypeInt].operands.push(OperandLiteralNumber, "'Signedness'"); - - InstructionDesc[OpTypeFloat].operands.push(OperandLiteralNumber, "'Width'"); - - InstructionDesc[OpTypeVector].operands.push(OperandId, "'Component Type'"); - InstructionDesc[OpTypeVector].operands.push(OperandLiteralNumber, "'Component Count'"); + InstructionDesc[OpTypeFunction].operands.push(OperandId, "'Return Type'"); + InstructionDesc[OpTypeFunction].operands.push(OperandVariableIds, "'Parameter 0 Type', +\n'Parameter 1 Type', +\n..."); - InstructionDesc[OpTypeMatrix].operands.push(OperandId, "'Column Type'"); - InstructionDesc[OpTypeMatrix].operands.push(OperandLiteralNumber, "'Column Count'"); + InstructionDesc[OpConstant].operands.push(OperandVariableLiterals, "'Value'"); - InstructionDesc[OpTypeImage].operands.push(OperandId, "'Sampled Type'"); - InstructionDesc[OpTypeImage].operands.push(OperandDimensionality, ""); - InstructionDesc[OpTypeImage].operands.push(OperandLiteralNumber, "'Depth'"); - InstructionDesc[OpTypeImage].operands.push(OperandLiteralNumber, "'Arrayed'"); - InstructionDesc[OpTypeImage].operands.push(OperandLiteralNumber, "'MS'"); - InstructionDesc[OpTypeImage].operands.push(OperandLiteralNumber, "'Sampled'"); - InstructionDesc[OpTypeImage].operands.push(OperandSamplerImageFormat, ""); - InstructionDesc[OpTypeImage].operands.push(OperandAccessQualifier, "", true); + InstructionDesc[OpConstantComposite].operands.push(OperandVariableIds, "'Constituents'"); - InstructionDesc[OpTypeSampledImage].operands.push(OperandId, "'Image Type'"); + InstructionDesc[OpConstantSampler].operands.push(OperandSamplerAddressingMode, ""); + InstructionDesc[OpConstantSampler].operands.push(OperandLiteralNumber, "'Param'"); + InstructionDesc[OpConstantSampler].operands.push(OperandSamplerFilterMode, ""); - InstructionDesc[OpTypeArray].operands.push(OperandId, "'Element Type'"); - InstructionDesc[OpTypeArray].operands.push(OperandId, "'Length'"); + InstructionDesc[OpSpecConstant].operands.push(OperandVariableLiterals, "'Value'"); - InstructionDesc[OpTypeRuntimeArray].operands.push(OperandId, "'Element Type'"); + InstructionDesc[OpSpecConstantComposite].operands.push(OperandVariableIds, "'Constituents'"); - InstructionDesc[OpTypeStruct].operands.push(OperandVariableIds, "'Member 0 type', +\n'member 1 type', +\n..."); + InstructionDesc[OpSpecConstantOp].operands.push(OperandLiteralNumber, "'Opcode'"); + InstructionDesc[OpSpecConstantOp].operands.push(OperandVariableIds, "'Operands'"); - InstructionDesc[OpTypeOpaque].operands.push(OperandLiteralString, "The name of the opaque type."); + InstructionDesc[OpVariable].operands.push(OperandStorage, ""); + InstructionDesc[OpVariable].operands.push(OperandId, "'Initializer'", true); - InstructionDesc[OpTypePointer].operands.push(OperandStorage, ""); - InstructionDesc[OpTypePointer].operands.push(OperandId, "'Type'"); + InstructionDesc[OpFunction].operands.push(OperandFunction, ""); + InstructionDesc[OpFunction].operands.push(OperandId, "'Function Type'"); - InstructionDesc[OpTypeForwardPointer].operands.push(OperandId, "'Pointer Type'"); - InstructionDesc[OpTypeForwardPointer].operands.push(OperandStorage, ""); + InstructionDesc[OpFunctionCall].operands.push(OperandId, "'Function'"); + InstructionDesc[OpFunctionCall].operands.push(OperandVariableIds, "'Argument 0', +\n'Argument 1', +\n..."); - InstructionDesc[OpTypePipe].operands.push(OperandAccessQualifier, "'Qualifier'"); + InstructionDesc[OpExtInst].operands.push(OperandId, "'Set'"); + InstructionDesc[OpExtInst].operands.push(OperandLiteralNumber, "'Instruction'"); + InstructionDesc[OpExtInst].operands.push(OperandVariableIds, "'Operand 1', +\n'Operand 2', +\n..."); - InstructionDesc[OpTypeFunction].operands.push(OperandId, "'Return Type'"); - InstructionDesc[OpTypeFunction].operands.push(OperandVariableIds, "'Parameter 0 Type', +\n'Parameter 1 Type', +\n..."); + InstructionDesc[OpLoad].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpLoad].operands.push(OperandMemoryAccess, "", true); + InstructionDesc[OpLoad].operands.push(OperandLiteralNumber, "", true); + InstructionDesc[OpLoad].operands.push(OperandId, "", true); - InstructionDesc[OpConstant].operands.push(OperandVariableLiterals, "'Value'"); + InstructionDesc[OpStore].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpStore].operands.push(OperandId, "'Object'"); + InstructionDesc[OpStore].operands.push(OperandMemoryAccess, "", true); + InstructionDesc[OpStore].operands.push(OperandLiteralNumber, "", true); + InstructionDesc[OpStore].operands.push(OperandId, "", true); - InstructionDesc[OpConstantComposite].operands.push(OperandVariableIds, "'Constituents'"); + InstructionDesc[OpPhi].operands.push(OperandVariableIds, "'Variable, Parent, ...'"); - InstructionDesc[OpConstantSampler].operands.push(OperandSamplerAddressingMode, ""); - InstructionDesc[OpConstantSampler].operands.push(OperandLiteralNumber, "'Param'"); - InstructionDesc[OpConstantSampler].operands.push(OperandSamplerFilterMode, ""); + InstructionDesc[OpDecorate].operands.push(OperandId, "'Target'"); + InstructionDesc[OpDecorate].operands.push(OperandDecoration, ""); + InstructionDesc[OpDecorate].operands.push(OperandVariableLiterals, "See <>."); - InstructionDesc[OpSpecConstant].operands.push(OperandVariableLiterals, "'Value'"); + InstructionDesc[OpDecorateId].operands.push(OperandId, "'Target'"); + InstructionDesc[OpDecorateId].operands.push(OperandDecoration, ""); + InstructionDesc[OpDecorateId].operands.push(OperandVariableIds, "See <>."); - InstructionDesc[OpSpecConstantComposite].operands.push(OperandVariableIds, "'Constituents'"); + InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandId, "'Target'"); + InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandDecoration, ""); + InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandVariableLiteralStrings, "'Literal Strings'"); - InstructionDesc[OpSpecConstantOp].operands.push(OperandLiteralNumber, "'Opcode'"); - InstructionDesc[OpSpecConstantOp].operands.push(OperandVariableIds, "'Operands'"); + InstructionDesc[OpMemberDecorate].operands.push(OperandId, "'Structure Type'"); + InstructionDesc[OpMemberDecorate].operands.push(OperandLiteralNumber, "'Member'"); + InstructionDesc[OpMemberDecorate].operands.push(OperandDecoration, ""); + InstructionDesc[OpMemberDecorate].operands.push(OperandVariableLiterals, "See <>."); - InstructionDesc[OpVariable].operands.push(OperandStorage, ""); - InstructionDesc[OpVariable].operands.push(OperandId, "'Initializer'", true); + InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandId, "'Structure Type'"); + InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandLiteralNumber, "'Member'"); + InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandDecoration, ""); + InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandVariableLiteralStrings, "'Literal Strings'"); - InstructionDesc[OpFunction].operands.push(OperandFunction, ""); - InstructionDesc[OpFunction].operands.push(OperandId, "'Function Type'"); + InstructionDesc[OpGroupDecorate].operands.push(OperandId, "'Decoration Group'"); + InstructionDesc[OpGroupDecorate].operands.push(OperandVariableIds, "'Targets'"); - InstructionDesc[OpFunctionCall].operands.push(OperandId, "'Function'"); - InstructionDesc[OpFunctionCall].operands.push(OperandVariableIds, "'Argument 0', +\n'Argument 1', +\n..."); + InstructionDesc[OpGroupMemberDecorate].operands.push(OperandId, "'Decoration Group'"); + InstructionDesc[OpGroupMemberDecorate].operands.push(OperandVariableIdLiteral, "'Targets'"); - InstructionDesc[OpExtInst].operands.push(OperandId, "'Set'"); - InstructionDesc[OpExtInst].operands.push(OperandLiteralNumber, "'Instruction'"); - InstructionDesc[OpExtInst].operands.push(OperandVariableIds, "'Operand 1', +\n'Operand 2', +\n..."); + InstructionDesc[OpVectorExtractDynamic].operands.push(OperandId, "'Vector'"); + InstructionDesc[OpVectorExtractDynamic].operands.push(OperandId, "'Index'"); - InstructionDesc[OpLoad].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpLoad].operands.push(OperandMemoryAccess, "", true); - InstructionDesc[OpLoad].operands.push(OperandLiteralNumber, "", true); - InstructionDesc[OpLoad].operands.push(OperandId, "", true); + InstructionDesc[OpVectorInsertDynamic].operands.push(OperandId, "'Vector'"); + InstructionDesc[OpVectorInsertDynamic].operands.push(OperandId, "'Component'"); + InstructionDesc[OpVectorInsertDynamic].operands.push(OperandId, "'Index'"); - InstructionDesc[OpStore].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpStore].operands.push(OperandId, "'Object'"); - InstructionDesc[OpStore].operands.push(OperandMemoryAccess, "", true); - InstructionDesc[OpStore].operands.push(OperandLiteralNumber, "", true); - InstructionDesc[OpStore].operands.push(OperandId, "", true); + InstructionDesc[OpVectorShuffle].operands.push(OperandId, "'Vector 1'"); + InstructionDesc[OpVectorShuffle].operands.push(OperandId, "'Vector 2'"); + InstructionDesc[OpVectorShuffle].operands.push(OperandVariableLiterals, "'Components'"); - InstructionDesc[OpPhi].operands.push(OperandVariableIds, "'Variable, Parent, ...'"); + InstructionDesc[OpCompositeConstruct].operands.push(OperandVariableIds, "'Constituents'"); - InstructionDesc[OpDecorate].operands.push(OperandId, "'Target'"); - InstructionDesc[OpDecorate].operands.push(OperandDecoration, ""); - InstructionDesc[OpDecorate].operands.push(OperandVariableLiterals, "See <>."); + InstructionDesc[OpCompositeExtract].operands.push(OperandId, "'Composite'"); + InstructionDesc[OpCompositeExtract].operands.push(OperandVariableLiterals, "'Indexes'"); - InstructionDesc[OpDecorateId].operands.push(OperandId, "'Target'"); - InstructionDesc[OpDecorateId].operands.push(OperandDecoration, ""); - InstructionDesc[OpDecorateId].operands.push(OperandVariableIds, "See <>."); + InstructionDesc[OpCompositeInsert].operands.push(OperandId, "'Object'"); + InstructionDesc[OpCompositeInsert].operands.push(OperandId, "'Composite'"); + InstructionDesc[OpCompositeInsert].operands.push(OperandVariableLiterals, "'Indexes'"); - InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandId, "'Target'"); - InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandDecoration, ""); - InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandVariableLiteralStrings, "'Literal Strings'"); + InstructionDesc[OpCopyObject].operands.push(OperandId, "'Operand'"); - InstructionDesc[OpMemberDecorate].operands.push(OperandId, "'Structure Type'"); - InstructionDesc[OpMemberDecorate].operands.push(OperandLiteralNumber, "'Member'"); - InstructionDesc[OpMemberDecorate].operands.push(OperandDecoration, ""); - InstructionDesc[OpMemberDecorate].operands.push(OperandVariableLiterals, "See <>."); + InstructionDesc[OpCopyMemory].operands.push(OperandId, "'Target'"); + InstructionDesc[OpCopyMemory].operands.push(OperandId, "'Source'"); + InstructionDesc[OpCopyMemory].operands.push(OperandMemoryAccess, "", true); - InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandId, "'Structure Type'"); - InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandLiteralNumber, "'Member'"); - InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandDecoration, ""); - InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandVariableLiteralStrings, "'Literal Strings'"); + InstructionDesc[OpCopyMemorySized].operands.push(OperandId, "'Target'"); + InstructionDesc[OpCopyMemorySized].operands.push(OperandId, "'Source'"); + InstructionDesc[OpCopyMemorySized].operands.push(OperandId, "'Size'"); + InstructionDesc[OpCopyMemorySized].operands.push(OperandMemoryAccess, "", true); + + InstructionDesc[OpSampledImage].operands.push(OperandId, "'Image'"); + InstructionDesc[OpSampledImage].operands.push(OperandId, "'Sampler'"); + + InstructionDesc[OpImage].operands.push(OperandId, "'Sampled Image'"); + + InstructionDesc[OpImageRead].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageRead].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageRead].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageRead].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageWrite].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageWrite].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageWrite].operands.push(OperandId, "'Texel'"); + InstructionDesc[OpImageWrite].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageWrite].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageFetch].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageFetch].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageFetch].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageFetch].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageGather].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageGather].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageGather].operands.push(OperandId, "'Component'"); + InstructionDesc[OpImageGather].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageGather].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageDrefGather].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageDrefGather].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageDrefGather].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageDrefGather].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageDrefGather].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpGroupDecorate].operands.push(OperandId, "'Decoration Group'"); - InstructionDesc[OpGroupDecorate].operands.push(OperandVariableIds, "'Targets'"); + InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpGroupMemberDecorate].operands.push(OperandId, "'Decoration Group'"); - InstructionDesc[OpGroupMemberDecorate].operands.push(OperandVariableIdLiteral, "'Targets'"); + InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpVectorExtractDynamic].operands.push(OperandId, "'Vector'"); - InstructionDesc[OpVectorExtractDynamic].operands.push(OperandId, "'Index'"); + InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpVectorInsertDynamic].operands.push(OperandId, "'Vector'"); - InstructionDesc[OpVectorInsertDynamic].operands.push(OperandId, "'Component'"); - InstructionDesc[OpVectorInsertDynamic].operands.push(OperandId, "'Index'"); + InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpVectorShuffle].operands.push(OperandId, "'Vector 1'"); - InstructionDesc[OpVectorShuffle].operands.push(OperandId, "'Vector 2'"); - InstructionDesc[OpVectorShuffle].operands.push(OperandVariableLiterals, "'Components'"); + InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpCompositeConstruct].operands.push(OperandVariableIds, "'Constituents'"); + InstructionDesc[OpImageSparseFetch].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageSparseFetch].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseFetch].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseFetch].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpCompositeExtract].operands.push(OperandId, "'Composite'"); - InstructionDesc[OpCompositeExtract].operands.push(OperandVariableLiterals, "'Indexes'"); + InstructionDesc[OpImageSparseGather].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseGather].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseGather].operands.push(OperandId, "'Component'"); + InstructionDesc[OpImageSparseGather].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseGather].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpCompositeInsert].operands.push(OperandId, "'Object'"); - InstructionDesc[OpCompositeInsert].operands.push(OperandId, "'Composite'"); - InstructionDesc[OpCompositeInsert].operands.push(OperandVariableLiterals, "'Indexes'"); + InstructionDesc[OpImageSparseDrefGather].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSparseDrefGather].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseDrefGather].operands.push(OperandId, "'D~ref~'"); + InstructionDesc[OpImageSparseDrefGather].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseDrefGather].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpCopyObject].operands.push(OperandId, "'Operand'"); + InstructionDesc[OpImageSparseRead].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageSparseRead].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSparseRead].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSparseRead].operands.push(OperandVariableIds, "", true); - InstructionDesc[OpCopyMemory].operands.push(OperandId, "'Target'"); - InstructionDesc[OpCopyMemory].operands.push(OperandId, "'Source'"); - InstructionDesc[OpCopyMemory].operands.push(OperandMemoryAccess, "", true); + InstructionDesc[OpImageSparseTexelsResident].operands.push(OperandId, "'Resident Code'"); - InstructionDesc[OpCopyMemorySized].operands.push(OperandId, "'Target'"); - InstructionDesc[OpCopyMemorySized].operands.push(OperandId, "'Source'"); - InstructionDesc[OpCopyMemorySized].operands.push(OperandId, "'Size'"); - InstructionDesc[OpCopyMemorySized].operands.push(OperandMemoryAccess, "", true); - - InstructionDesc[OpSampledImage].operands.push(OperandId, "'Image'"); - InstructionDesc[OpSampledImage].operands.push(OperandId, "'Sampler'"); - - InstructionDesc[OpImage].operands.push(OperandId, "'Sampled Image'"); - - InstructionDesc[OpImageRead].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageRead].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageRead].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageRead].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageWrite].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageWrite].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageWrite].operands.push(OperandId, "'Texel'"); - InstructionDesc[OpImageWrite].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageWrite].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSampleImplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSampleExplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSampleDrefImplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSampleDrefExplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSampleProjImplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSampleProjExplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSampleProjDrefImplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSampleProjDrefExplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageFetch].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageFetch].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageFetch].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageFetch].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageGather].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageGather].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageGather].operands.push(OperandId, "'Component'"); - InstructionDesc[OpImageGather].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageGather].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageDrefGather].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageDrefGather].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageDrefGather].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageDrefGather].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageDrefGather].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseSampleImplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseSampleExplicitLod].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseSampleDrefImplicitLod].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpImageQuerySizeLod].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageQuerySizeLod].operands.push(OperandId, "'Level of Detail'"); - InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseSampleDrefExplicitLod].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpImageQuerySize].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseSampleProjImplicitLod].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpImageQueryLod].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageQueryLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseSampleProjExplicitLod].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpImageQueryLevels].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseSampleProjDrefImplicitLod].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpImageQuerySamples].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseSampleProjDrefExplicitLod].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpImageQueryFormat].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageSparseFetch].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageSparseFetch].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseFetch].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseFetch].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpImageQueryOrder].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageSparseGather].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseGather].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseGather].operands.push(OperandId, "'Component'"); - InstructionDesc[OpImageSparseGather].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseGather].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpAccessChain].operands.push(OperandId, "'Base'"); + InstructionDesc[OpAccessChain].operands.push(OperandVariableIds, "'Indexes'"); - InstructionDesc[OpImageSparseDrefGather].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSparseDrefGather].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseDrefGather].operands.push(OperandId, "'D~ref~'"); - InstructionDesc[OpImageSparseDrefGather].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseDrefGather].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpInBoundsAccessChain].operands.push(OperandId, "'Base'"); + InstructionDesc[OpInBoundsAccessChain].operands.push(OperandVariableIds, "'Indexes'"); - InstructionDesc[OpImageSparseRead].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageSparseRead].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSparseRead].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSparseRead].operands.push(OperandVariableIds, "", true); + InstructionDesc[OpPtrAccessChain].operands.push(OperandId, "'Base'"); + InstructionDesc[OpPtrAccessChain].operands.push(OperandId, "'Element'"); + InstructionDesc[OpPtrAccessChain].operands.push(OperandVariableIds, "'Indexes'"); - InstructionDesc[OpImageSparseTexelsResident].operands.push(OperandId, "'Resident Code'"); + InstructionDesc[OpInBoundsPtrAccessChain].operands.push(OperandId, "'Base'"); + InstructionDesc[OpInBoundsPtrAccessChain].operands.push(OperandId, "'Element'"); + InstructionDesc[OpInBoundsPtrAccessChain].operands.push(OperandVariableIds, "'Indexes'"); - InstructionDesc[OpImageQuerySizeLod].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageQuerySizeLod].operands.push(OperandId, "'Level of Detail'"); + InstructionDesc[OpSNegate].operands.push(OperandId, "'Operand'"); - InstructionDesc[OpImageQuerySize].operands.push(OperandId, "'Image'"); + InstructionDesc[OpFNegate].operands.push(OperandId, "'Operand'"); - InstructionDesc[OpImageQueryLod].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageQueryLod].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpNot].operands.push(OperandId, "'Operand'"); - InstructionDesc[OpImageQueryLevels].operands.push(OperandId, "'Image'"); + InstructionDesc[OpAny].operands.push(OperandId, "'Vector'"); - InstructionDesc[OpImageQuerySamples].operands.push(OperandId, "'Image'"); + InstructionDesc[OpAll].operands.push(OperandId, "'Vector'"); - InstructionDesc[OpImageQueryFormat].operands.push(OperandId, "'Image'"); + InstructionDesc[OpConvertFToU].operands.push(OperandId, "'Float Value'"); - InstructionDesc[OpImageQueryOrder].operands.push(OperandId, "'Image'"); + InstructionDesc[OpConvertFToS].operands.push(OperandId, "'Float Value'"); - InstructionDesc[OpAccessChain].operands.push(OperandId, "'Base'"); - InstructionDesc[OpAccessChain].operands.push(OperandVariableIds, "'Indexes'"); + InstructionDesc[OpConvertSToF].operands.push(OperandId, "'Signed Value'"); - InstructionDesc[OpInBoundsAccessChain].operands.push(OperandId, "'Base'"); - InstructionDesc[OpInBoundsAccessChain].operands.push(OperandVariableIds, "'Indexes'"); + InstructionDesc[OpConvertUToF].operands.push(OperandId, "'Unsigned Value'"); - InstructionDesc[OpPtrAccessChain].operands.push(OperandId, "'Base'"); - InstructionDesc[OpPtrAccessChain].operands.push(OperandId, "'Element'"); - InstructionDesc[OpPtrAccessChain].operands.push(OperandVariableIds, "'Indexes'"); + InstructionDesc[OpUConvert].operands.push(OperandId, "'Unsigned Value'"); - InstructionDesc[OpInBoundsPtrAccessChain].operands.push(OperandId, "'Base'"); - InstructionDesc[OpInBoundsPtrAccessChain].operands.push(OperandId, "'Element'"); - InstructionDesc[OpInBoundsPtrAccessChain].operands.push(OperandVariableIds, "'Indexes'"); + InstructionDesc[OpSConvert].operands.push(OperandId, "'Signed Value'"); - InstructionDesc[OpSNegate].operands.push(OperandId, "'Operand'"); + InstructionDesc[OpFConvert].operands.push(OperandId, "'Float Value'"); - InstructionDesc[OpFNegate].operands.push(OperandId, "'Operand'"); + InstructionDesc[OpSatConvertSToU].operands.push(OperandId, "'Signed Value'"); - InstructionDesc[OpNot].operands.push(OperandId, "'Operand'"); + InstructionDesc[OpSatConvertUToS].operands.push(OperandId, "'Unsigned Value'"); - InstructionDesc[OpAny].operands.push(OperandId, "'Vector'"); + InstructionDesc[OpConvertPtrToU].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAll].operands.push(OperandId, "'Vector'"); + InstructionDesc[OpConvertUToPtr].operands.push(OperandId, "'Integer Value'"); - InstructionDesc[OpConvertFToU].operands.push(OperandId, "'Float Value'"); + InstructionDesc[OpPtrCastToGeneric].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpConvertFToS].operands.push(OperandId, "'Float Value'"); + InstructionDesc[OpGenericCastToPtr].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpConvertSToF].operands.push(OperandId, "'Signed Value'"); + InstructionDesc[OpGenericCastToPtrExplicit].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpGenericCastToPtrExplicit].operands.push(OperandStorage, "'Storage'"); - InstructionDesc[OpConvertUToF].operands.push(OperandId, "'Unsigned Value'"); + InstructionDesc[OpGenericPtrMemSemantics].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpUConvert].operands.push(OperandId, "'Unsigned Value'"); + InstructionDesc[OpBitcast].operands.push(OperandId, "'Operand'"); - InstructionDesc[OpSConvert].operands.push(OperandId, "'Signed Value'"); + InstructionDesc[OpQuantizeToF16].operands.push(OperandId, "'Value'"); - InstructionDesc[OpFConvert].operands.push(OperandId, "'Float Value'"); + InstructionDesc[OpTranspose].operands.push(OperandId, "'Matrix'"); - InstructionDesc[OpSatConvertSToU].operands.push(OperandId, "'Signed Value'"); + InstructionDesc[OpCopyLogical].operands.push(OperandId, "'Operand'"); - InstructionDesc[OpSatConvertUToS].operands.push(OperandId, "'Unsigned Value'"); + InstructionDesc[OpIsNan].operands.push(OperandId, "'x'"); - InstructionDesc[OpConvertPtrToU].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpIsInf].operands.push(OperandId, "'x'"); - InstructionDesc[OpConvertUToPtr].operands.push(OperandId, "'Integer Value'"); + InstructionDesc[OpIsFinite].operands.push(OperandId, "'x'"); - InstructionDesc[OpPtrCastToGeneric].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpIsNormal].operands.push(OperandId, "'x'"); - InstructionDesc[OpGenericCastToPtr].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpSignBitSet].operands.push(OperandId, "'x'"); - InstructionDesc[OpGenericCastToPtrExplicit].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpGenericCastToPtrExplicit].operands.push(OperandStorage, "'Storage'"); + InstructionDesc[OpLessOrGreater].operands.push(OperandId, "'x'"); + InstructionDesc[OpLessOrGreater].operands.push(OperandId, "'y'"); - InstructionDesc[OpGenericPtrMemSemantics].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpOrdered].operands.push(OperandId, "'x'"); + InstructionDesc[OpOrdered].operands.push(OperandId, "'y'"); - InstructionDesc[OpBitcast].operands.push(OperandId, "'Operand'"); + InstructionDesc[OpUnordered].operands.push(OperandId, "'x'"); + InstructionDesc[OpUnordered].operands.push(OperandId, "'y'"); - InstructionDesc[OpQuantizeToF16].operands.push(OperandId, "'Value'"); + InstructionDesc[OpArrayLength].operands.push(OperandId, "'Structure'"); + InstructionDesc[OpArrayLength].operands.push(OperandLiteralNumber, "'Array member'"); - InstructionDesc[OpTranspose].operands.push(OperandId, "'Matrix'"); + InstructionDesc[OpIAdd].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpIAdd].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpCopyLogical].operands.push(OperandId, "'Operand'"); + InstructionDesc[OpFAdd].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFAdd].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpIsNan].operands.push(OperandId, "'x'"); + InstructionDesc[OpISub].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpISub].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpIsInf].operands.push(OperandId, "'x'"); + InstructionDesc[OpFSub].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFSub].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpIsFinite].operands.push(OperandId, "'x'"); + InstructionDesc[OpIMul].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpIMul].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpIsNormal].operands.push(OperandId, "'x'"); + InstructionDesc[OpFMul].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFMul].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpSignBitSet].operands.push(OperandId, "'x'"); + InstructionDesc[OpUDiv].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpUDiv].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpLessOrGreater].operands.push(OperandId, "'x'"); - InstructionDesc[OpLessOrGreater].operands.push(OperandId, "'y'"); + InstructionDesc[OpSDiv].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpSDiv].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpOrdered].operands.push(OperandId, "'x'"); - InstructionDesc[OpOrdered].operands.push(OperandId, "'y'"); + InstructionDesc[OpFDiv].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFDiv].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpUnordered].operands.push(OperandId, "'x'"); - InstructionDesc[OpUnordered].operands.push(OperandId, "'y'"); + InstructionDesc[OpUMod].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpUMod].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpArrayLength].operands.push(OperandId, "'Structure'"); - InstructionDesc[OpArrayLength].operands.push(OperandLiteralNumber, "'Array member'"); + InstructionDesc[OpSRem].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpSRem].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpIAdd].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpIAdd].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpSMod].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpSMod].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFAdd].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFAdd].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFRem].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFRem].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpISub].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpISub].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFMod].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFMod].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFSub].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFSub].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpVectorTimesScalar].operands.push(OperandId, "'Vector'"); + InstructionDesc[OpVectorTimesScalar].operands.push(OperandId, "'Scalar'"); - InstructionDesc[OpIMul].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpIMul].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpMatrixTimesScalar].operands.push(OperandId, "'Matrix'"); + InstructionDesc[OpMatrixTimesScalar].operands.push(OperandId, "'Scalar'"); - InstructionDesc[OpFMul].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFMul].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpVectorTimesMatrix].operands.push(OperandId, "'Vector'"); + InstructionDesc[OpVectorTimesMatrix].operands.push(OperandId, "'Matrix'"); - InstructionDesc[OpUDiv].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpUDiv].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpMatrixTimesVector].operands.push(OperandId, "'Matrix'"); + InstructionDesc[OpMatrixTimesVector].operands.push(OperandId, "'Vector'"); - InstructionDesc[OpSDiv].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpSDiv].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpMatrixTimesMatrix].operands.push(OperandId, "'LeftMatrix'"); + InstructionDesc[OpMatrixTimesMatrix].operands.push(OperandId, "'RightMatrix'"); - InstructionDesc[OpFDiv].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFDiv].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpOuterProduct].operands.push(OperandId, "'Vector 1'"); + InstructionDesc[OpOuterProduct].operands.push(OperandId, "'Vector 2'"); - InstructionDesc[OpUMod].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpUMod].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpDot].operands.push(OperandId, "'Vector 1'"); + InstructionDesc[OpDot].operands.push(OperandId, "'Vector 2'"); - InstructionDesc[OpSRem].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpSRem].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpIAddCarry].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpIAddCarry].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpSMod].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpSMod].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpISubBorrow].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpISubBorrow].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFRem].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFRem].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpUMulExtended].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpUMulExtended].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFMod].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFMod].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpSMulExtended].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpSMulExtended].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpVectorTimesScalar].operands.push(OperandId, "'Vector'"); - InstructionDesc[OpVectorTimesScalar].operands.push(OperandId, "'Scalar'"); + InstructionDesc[OpShiftRightLogical].operands.push(OperandId, "'Base'"); + InstructionDesc[OpShiftRightLogical].operands.push(OperandId, "'Shift'"); - InstructionDesc[OpMatrixTimesScalar].operands.push(OperandId, "'Matrix'"); - InstructionDesc[OpMatrixTimesScalar].operands.push(OperandId, "'Scalar'"); + InstructionDesc[OpShiftRightArithmetic].operands.push(OperandId, "'Base'"); + InstructionDesc[OpShiftRightArithmetic].operands.push(OperandId, "'Shift'"); - InstructionDesc[OpVectorTimesMatrix].operands.push(OperandId, "'Vector'"); - InstructionDesc[OpVectorTimesMatrix].operands.push(OperandId, "'Matrix'"); + InstructionDesc[OpShiftLeftLogical].operands.push(OperandId, "'Base'"); + InstructionDesc[OpShiftLeftLogical].operands.push(OperandId, "'Shift'"); - InstructionDesc[OpMatrixTimesVector].operands.push(OperandId, "'Matrix'"); - InstructionDesc[OpMatrixTimesVector].operands.push(OperandId, "'Vector'"); + InstructionDesc[OpLogicalOr].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpLogicalOr].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpMatrixTimesMatrix].operands.push(OperandId, "'LeftMatrix'"); - InstructionDesc[OpMatrixTimesMatrix].operands.push(OperandId, "'RightMatrix'"); + InstructionDesc[OpLogicalAnd].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpLogicalAnd].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpOuterProduct].operands.push(OperandId, "'Vector 1'"); - InstructionDesc[OpOuterProduct].operands.push(OperandId, "'Vector 2'"); + InstructionDesc[OpLogicalEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpLogicalEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpDot].operands.push(OperandId, "'Vector 1'"); - InstructionDesc[OpDot].operands.push(OperandId, "'Vector 2'"); + InstructionDesc[OpLogicalNotEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpLogicalNotEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpIAddCarry].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpIAddCarry].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpLogicalNot].operands.push(OperandId, "'Operand'"); - InstructionDesc[OpISubBorrow].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpISubBorrow].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpBitwiseOr].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpBitwiseOr].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpUMulExtended].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpUMulExtended].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpBitwiseXor].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpBitwiseXor].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpSMulExtended].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpSMulExtended].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpBitwiseAnd].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpBitwiseAnd].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpShiftRightLogical].operands.push(OperandId, "'Base'"); - InstructionDesc[OpShiftRightLogical].operands.push(OperandId, "'Shift'"); + InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Base'"); + InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Insert'"); + InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Offset'"); + InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Count'"); - InstructionDesc[OpShiftRightArithmetic].operands.push(OperandId, "'Base'"); - InstructionDesc[OpShiftRightArithmetic].operands.push(OperandId, "'Shift'"); + InstructionDesc[OpBitFieldSExtract].operands.push(OperandId, "'Base'"); + InstructionDesc[OpBitFieldSExtract].operands.push(OperandId, "'Offset'"); + InstructionDesc[OpBitFieldSExtract].operands.push(OperandId, "'Count'"); - InstructionDesc[OpShiftLeftLogical].operands.push(OperandId, "'Base'"); - InstructionDesc[OpShiftLeftLogical].operands.push(OperandId, "'Shift'"); + InstructionDesc[OpBitFieldUExtract].operands.push(OperandId, "'Base'"); + InstructionDesc[OpBitFieldUExtract].operands.push(OperandId, "'Offset'"); + InstructionDesc[OpBitFieldUExtract].operands.push(OperandId, "'Count'"); - InstructionDesc[OpLogicalOr].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpLogicalOr].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpBitReverse].operands.push(OperandId, "'Base'"); - InstructionDesc[OpLogicalAnd].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpLogicalAnd].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpBitCount].operands.push(OperandId, "'Base'"); - InstructionDesc[OpLogicalEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpLogicalEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpSelect].operands.push(OperandId, "'Condition'"); + InstructionDesc[OpSelect].operands.push(OperandId, "'Object 1'"); + InstructionDesc[OpSelect].operands.push(OperandId, "'Object 2'"); - InstructionDesc[OpLogicalNotEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpLogicalNotEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpIEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpIEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpLogicalNot].operands.push(OperandId, "'Operand'"); + InstructionDesc[OpFOrdEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFOrdEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpBitwiseOr].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpBitwiseOr].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFUnordEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFUnordEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpBitwiseXor].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpBitwiseXor].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpINotEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpINotEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpBitwiseAnd].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpBitwiseAnd].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFOrdNotEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFOrdNotEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Base'"); - InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Insert'"); - InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Offset'"); - InstructionDesc[OpBitFieldInsert].operands.push(OperandId, "'Count'"); + InstructionDesc[OpFUnordNotEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFUnordNotEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpBitFieldSExtract].operands.push(OperandId, "'Base'"); - InstructionDesc[OpBitFieldSExtract].operands.push(OperandId, "'Offset'"); - InstructionDesc[OpBitFieldSExtract].operands.push(OperandId, "'Count'"); - - InstructionDesc[OpBitFieldUExtract].operands.push(OperandId, "'Base'"); - InstructionDesc[OpBitFieldUExtract].operands.push(OperandId, "'Offset'"); - InstructionDesc[OpBitFieldUExtract].operands.push(OperandId, "'Count'"); - - InstructionDesc[OpBitReverse].operands.push(OperandId, "'Base'"); + InstructionDesc[OpULessThan].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpULessThan].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpBitCount].operands.push(OperandId, "'Base'"); + InstructionDesc[OpSLessThan].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpSLessThan].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpSelect].operands.push(OperandId, "'Condition'"); - InstructionDesc[OpSelect].operands.push(OperandId, "'Object 1'"); - InstructionDesc[OpSelect].operands.push(OperandId, "'Object 2'"); + InstructionDesc[OpFOrdLessThan].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFOrdLessThan].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpIEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpIEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFUnordLessThan].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFUnordLessThan].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFOrdEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFOrdEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpUGreaterThan].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpUGreaterThan].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFUnordEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFUnordEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpSGreaterThan].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpSGreaterThan].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpINotEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpINotEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFOrdGreaterThan].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFOrdGreaterThan].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFOrdNotEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFOrdNotEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFUnordGreaterThan].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFUnordGreaterThan].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFUnordNotEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFUnordNotEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpULessThanEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpULessThanEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpULessThan].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpULessThan].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpSLessThanEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpSLessThanEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpSLessThan].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpSLessThan].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFOrdLessThanEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFOrdLessThanEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFOrdLessThan].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFOrdLessThan].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFUnordLessThanEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFUnordLessThanEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFUnordLessThan].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFUnordLessThan].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpUGreaterThanEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpUGreaterThanEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpUGreaterThan].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpUGreaterThan].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpSGreaterThanEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpSGreaterThanEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpSGreaterThan].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpSGreaterThan].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFOrdGreaterThanEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFOrdGreaterThanEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFOrdGreaterThan].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFOrdGreaterThan].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFUnordGreaterThanEqual].operands.push(OperandId, "'Operand 1'"); + InstructionDesc[OpFUnordGreaterThanEqual].operands.push(OperandId, "'Operand 2'"); - InstructionDesc[OpFUnordGreaterThan].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFUnordGreaterThan].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpDPdx].operands.push(OperandId, "'P'"); - InstructionDesc[OpULessThanEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpULessThanEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpDPdy].operands.push(OperandId, "'P'"); - InstructionDesc[OpSLessThanEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpSLessThanEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFwidth].operands.push(OperandId, "'P'"); - InstructionDesc[OpFOrdLessThanEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFOrdLessThanEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpDPdxFine].operands.push(OperandId, "'P'"); - InstructionDesc[OpFUnordLessThanEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFUnordLessThanEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpDPdyFine].operands.push(OperandId, "'P'"); - InstructionDesc[OpUGreaterThanEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpUGreaterThanEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFwidthFine].operands.push(OperandId, "'P'"); - InstructionDesc[OpSGreaterThanEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpSGreaterThanEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpDPdxCoarse].operands.push(OperandId, "'P'"); - InstructionDesc[OpFOrdGreaterThanEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFOrdGreaterThanEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpDPdyCoarse].operands.push(OperandId, "'P'"); - InstructionDesc[OpFUnordGreaterThanEqual].operands.push(OperandId, "'Operand 1'"); - InstructionDesc[OpFUnordGreaterThanEqual].operands.push(OperandId, "'Operand 2'"); + InstructionDesc[OpFwidthCoarse].operands.push(OperandId, "'P'"); - InstructionDesc[OpDPdx].operands.push(OperandId, "'P'"); + InstructionDesc[OpEmitStreamVertex].operands.push(OperandId, "'Stream'"); - InstructionDesc[OpDPdy].operands.push(OperandId, "'P'"); + InstructionDesc[OpEndStreamPrimitive].operands.push(OperandId, "'Stream'"); - InstructionDesc[OpFwidth].operands.push(OperandId, "'P'"); + InstructionDesc[OpControlBarrier].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpControlBarrier].operands.push(OperandScope, "'Memory'"); + InstructionDesc[OpControlBarrier].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpDPdxFine].operands.push(OperandId, "'P'"); + InstructionDesc[OpMemoryBarrier].operands.push(OperandScope, "'Memory'"); + InstructionDesc[OpMemoryBarrier].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpDPdyFine].operands.push(OperandId, "'P'"); + InstructionDesc[OpImageTexelPointer].operands.push(OperandId, "'Image'"); + InstructionDesc[OpImageTexelPointer].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageTexelPointer].operands.push(OperandId, "'Sample'"); - InstructionDesc[OpFwidthFine].operands.push(OperandId, "'P'"); + InstructionDesc[OpAtomicLoad].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicLoad].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicLoad].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpDPdxCoarse].operands.push(OperandId, "'P'"); + InstructionDesc[OpAtomicStore].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicStore].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicStore].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicStore].operands.push(OperandId, "'Value'"); - InstructionDesc[OpDPdyCoarse].operands.push(OperandId, "'P'"); + InstructionDesc[OpAtomicExchange].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicExchange].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicExchange].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicExchange].operands.push(OperandId, "'Value'"); - InstructionDesc[OpFwidthCoarse].operands.push(OperandId, "'P'"); + InstructionDesc[OpAtomicCompareExchange].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicCompareExchange].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicCompareExchange].operands.push(OperandMemorySemantics, "'Equal'"); + InstructionDesc[OpAtomicCompareExchange].operands.push(OperandMemorySemantics, "'Unequal'"); + InstructionDesc[OpAtomicCompareExchange].operands.push(OperandId, "'Value'"); + InstructionDesc[OpAtomicCompareExchange].operands.push(OperandId, "'Comparator'"); - InstructionDesc[OpEmitStreamVertex].operands.push(OperandId, "'Stream'"); + InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandMemorySemantics, "'Equal'"); + InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandMemorySemantics, "'Unequal'"); + InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Value'"); + InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Comparator'"); - InstructionDesc[OpEndStreamPrimitive].operands.push(OperandId, "'Stream'"); + InstructionDesc[OpAtomicIIncrement].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicIIncrement].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicIIncrement].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpControlBarrier].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpControlBarrier].operands.push(OperandScope, "'Memory'"); - InstructionDesc[OpControlBarrier].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicIDecrement].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicIDecrement].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicIDecrement].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpMemoryBarrier].operands.push(OperandScope, "'Memory'"); - InstructionDesc[OpMemoryBarrier].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicIAdd].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicIAdd].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicIAdd].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicIAdd].operands.push(OperandId, "'Value'"); - InstructionDesc[OpImageTexelPointer].operands.push(OperandId, "'Image'"); - InstructionDesc[OpImageTexelPointer].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageTexelPointer].operands.push(OperandId, "'Sample'"); + InstructionDesc[OpAtomicFAddEXT].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicFAddEXT].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicFAddEXT].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicFAddEXT].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicLoad].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicLoad].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicLoad].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicISub].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicISub].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicISub].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicISub].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicStore].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicStore].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicStore].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicStore].operands.push(OperandId, "'Value'"); + InstructionDesc[OpAtomicUMin].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicUMin].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicUMin].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicUMin].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicExchange].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicExchange].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicExchange].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicExchange].operands.push(OperandId, "'Value'"); + InstructionDesc[OpAtomicUMax].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicUMax].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicUMax].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicUMax].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicCompareExchange].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicCompareExchange].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicCompareExchange].operands.push(OperandMemorySemantics, "'Equal'"); - InstructionDesc[OpAtomicCompareExchange].operands.push(OperandMemorySemantics, "'Unequal'"); - InstructionDesc[OpAtomicCompareExchange].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicCompareExchange].operands.push(OperandId, "'Comparator'"); + InstructionDesc[OpAtomicSMin].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicSMin].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicSMin].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicSMin].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandMemorySemantics, "'Equal'"); - InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandMemorySemantics, "'Unequal'"); - InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Comparator'"); + InstructionDesc[OpAtomicSMax].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicSMax].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicSMax].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicSMax].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicIIncrement].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicIIncrement].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicIIncrement].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicFMinEXT].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicFMinEXT].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicFMinEXT].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicFMinEXT].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicIDecrement].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicIDecrement].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicIDecrement].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicFMaxEXT].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicFMaxEXT].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicFMaxEXT].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicFMaxEXT].operands.push(OperandId, "'Value'"); - InstructionDesc[OpAtomicIAdd].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicIAdd].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicIAdd].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicIAdd].operands.push(OperandId, "'Value'"); + InstructionDesc[OpAtomicAnd].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicAnd].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicAnd].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicAnd].operands.push(OperandId, "'Value'"); + + InstructionDesc[OpAtomicOr].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicOr].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicOr].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicOr].operands.push(OperandId, "'Value'"); + + InstructionDesc[OpAtomicXor].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicXor].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicXor].operands.push(OperandMemorySemantics, "'Semantics'"); + InstructionDesc[OpAtomicXor].operands.push(OperandId, "'Value'"); + + InstructionDesc[OpAtomicFlagTestAndSet].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicFlagTestAndSet].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicFlagTestAndSet].operands.push(OperandMemorySemantics, "'Semantics'"); + + InstructionDesc[OpAtomicFlagClear].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpAtomicFlagClear].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpAtomicFlagClear].operands.push(OperandMemorySemantics, "'Semantics'"); + + InstructionDesc[OpLoopMerge].operands.push(OperandId, "'Merge Block'"); + InstructionDesc[OpLoopMerge].operands.push(OperandId, "'Continue Target'"); + InstructionDesc[OpLoopMerge].operands.push(OperandLoop, ""); + InstructionDesc[OpLoopMerge].operands.push(OperandOptionalLiteral, ""); + + InstructionDesc[OpSelectionMerge].operands.push(OperandId, "'Merge Block'"); + InstructionDesc[OpSelectionMerge].operands.push(OperandSelect, ""); + + InstructionDesc[OpBranch].operands.push(OperandId, "'Target Label'"); + + InstructionDesc[OpBranchConditional].operands.push(OperandId, "'Condition'"); + InstructionDesc[OpBranchConditional].operands.push(OperandId, "'True Label'"); + InstructionDesc[OpBranchConditional].operands.push(OperandId, "'False Label'"); + InstructionDesc[OpBranchConditional].operands.push(OperandVariableLiterals, "'Branch weights'"); + + InstructionDesc[OpSwitch].operands.push(OperandId, "'Selector'"); + InstructionDesc[OpSwitch].operands.push(OperandId, "'Default'"); + InstructionDesc[OpSwitch].operands.push(OperandVariableLiteralId, "'Target'"); + + + InstructionDesc[OpReturnValue].operands.push(OperandId, "'Value'"); + + InstructionDesc[OpLifetimeStart].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpLifetimeStart].operands.push(OperandLiteralNumber, "'Size'"); + + InstructionDesc[OpLifetimeStop].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpLifetimeStop].operands.push(OperandLiteralNumber, "'Size'"); + + InstructionDesc[OpGroupAsyncCopy].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Destination'"); + InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Source'"); + InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Num Elements'"); + InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Stride'"); + InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Event'"); + + InstructionDesc[OpGroupWaitEvents].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupWaitEvents].operands.push(OperandId, "'Num Events'"); + InstructionDesc[OpGroupWaitEvents].operands.push(OperandId, "'Events List'"); + + InstructionDesc[OpGroupAll].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupAll].operands.push(OperandId, "'Predicate'"); + + InstructionDesc[OpGroupAny].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupAny].operands.push(OperandId, "'Predicate'"); + + InstructionDesc[OpGroupBroadcast].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupBroadcast].operands.push(OperandId, "'Value'"); + InstructionDesc[OpGroupBroadcast].operands.push(OperandId, "'LocalId'"); + + InstructionDesc[OpGroupIAdd].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupIAdd].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupIAdd].operands.push(OperandId, "'X'"); + + InstructionDesc[OpGroupFAdd].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupFAdd].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupFAdd].operands.push(OperandId, "'X'"); + + InstructionDesc[OpGroupUMin].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupUMin].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupUMin].operands.push(OperandId, "'X'"); + + InstructionDesc[OpGroupSMin].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupSMin].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupSMin].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupFMin].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupFMin].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupFMin].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupUMax].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupUMax].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupUMax].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupSMax].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupSMax].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupSMax].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupFMax].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupFMax].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupFMax].operands.push(OperandId, "X"); + + InstructionDesc[OpReadPipe].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpReadPipe].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpReadPipe].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpReadPipe].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpWritePipe].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpWritePipe].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpWritePipe].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpWritePipe].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Reserve Id'"); + InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Index'"); + InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Reserve Id'"); + InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Index'"); + InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Num Packets'"); + InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Num Packets'"); + InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Reserve Id'"); + InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Reserve Id'"); + InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpIsValidReserveId].operands.push(OperandId, "'Reserve Id'"); + + InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Num Packets'"); + InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Num Packets'"); + InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Reserve Id'"); + InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Pipe'"); + InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Reserve Id'"); + InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Packet Size'"); + InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Packet Alignment'"); + + InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'GlobalWorkSize'"); + InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'LocalWorkSize'"); + InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'GlobalWorkOffset'"); + + InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'Event'"); + InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'Profiling Info'"); + InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'Value'"); + + InstructionDesc[OpSetUserEventStatus].operands.push(OperandId, "'Event'"); + InstructionDesc[OpSetUserEventStatus].operands.push(OperandId, "'Status'"); + + InstructionDesc[OpIsValidEvent].operands.push(OperandId, "'Event'"); + + InstructionDesc[OpRetainEvent].operands.push(OperandId, "'Event'"); + + InstructionDesc[OpReleaseEvent].operands.push(OperandId, "'Event'"); + + InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Invoke'"); + InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Param'"); + InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Param Size'"); + InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Param Align'"); + + InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Invoke'"); + InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Param'"); + InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Param Size'"); + InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Param Align'"); + + InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'ND Range'"); + InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Invoke'"); + InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Param'"); + InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Param Size'"); + InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Param Align'"); + + InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'ND Range'"); + InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Invoke'"); + InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Param'"); + InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Param Size'"); + InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Param Align'"); + + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Queue'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Flags'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'ND Range'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Num Events'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Wait Events'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Ret Event'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Invoke'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Param'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Param Size'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Param Align'"); + InstructionDesc[OpEnqueueKernel].operands.push(OperandVariableIds, "'Local Size'"); + + InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Queue'"); + InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Num Events'"); + InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Wait Events'"); + InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Ret Event'"); + + InstructionDesc[OpGroupNonUniformElect].operands.push(OperandScope, "'Execution'"); + + InstructionDesc[OpGroupNonUniformAll].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformAll].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformAny].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformAny].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformAllEqual].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformAllEqual].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformBroadcast].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBroadcast].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformBroadcast].operands.push(OperandId, "ID"); + + InstructionDesc[OpGroupNonUniformBroadcastFirst].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBroadcastFirst].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformBallot].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBallot].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformInverseBallot].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformInverseBallot].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformBallotBitExtract].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBallotBitExtract].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformBallotBitExtract].operands.push(OperandId, "Bit"); + + InstructionDesc[OpGroupNonUniformBallotBitCount].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBallotBitCount].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformBallotBitCount].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformBallotFindLSB].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBallotFindLSB].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformBallotFindMSB].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBallotFindMSB].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupNonUniformShuffle].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformShuffle].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformShuffle].operands.push(OperandId, "'Id'"); + + InstructionDesc[OpGroupNonUniformShuffleXor].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformShuffleXor].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformShuffleXor].operands.push(OperandId, "Mask"); + + InstructionDesc[OpGroupNonUniformShuffleUp].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformShuffleUp].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformShuffleUp].operands.push(OperandId, "Offset"); + + InstructionDesc[OpGroupNonUniformShuffleDown].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformShuffleDown].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformShuffleDown].operands.push(OperandId, "Offset"); + + InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandId, "'ClusterSize'", true); - InstructionDesc[OpAtomicFAddEXT].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicFAddEXT].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicFAddEXT].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicFAddEXT].operands.push(OperandId, "'Value'"); + InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandId, "'ClusterSize'", true); - InstructionDesc[OpAtomicISub].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicISub].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicISub].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicISub].operands.push(OperandId, "'Value'"); + InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandId, "'ClusterSize'", true); - InstructionDesc[OpAtomicUMin].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicUMin].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicUMin].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicUMin].operands.push(OperandId, "'Value'"); + InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandId, "'ClusterSize'", true); - InstructionDesc[OpAtomicUMax].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicUMax].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicUMax].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicUMax].operands.push(OperandId, "'Value'"); + InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandId, "'ClusterSize'", true); - InstructionDesc[OpAtomicSMin].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicSMin].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicSMin].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicSMin].operands.push(OperandId, "'Value'"); + InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandId, "'ClusterSize'", true); + + InstructionDesc[OpGroupNonUniformQuadBroadcast].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformQuadBroadcast].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformQuadBroadcast].operands.push(OperandId, "'Id'"); + + InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandId, "X"); + InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandId, "'Direction'"); + + InstructionDesc[OpSubgroupBallotKHR].operands.push(OperandId, "'Predicate'"); + + InstructionDesc[OpSubgroupFirstInvocationKHR].operands.push(OperandId, "'Value'"); + + InstructionDesc[OpSubgroupAnyKHR].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpSubgroupAnyKHR].operands.push(OperandId, "'Predicate'"); + + InstructionDesc[OpSubgroupAllKHR].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpSubgroupAllKHR].operands.push(OperandId, "'Predicate'"); + + InstructionDesc[OpSubgroupAllEqualKHR].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpSubgroupAllEqualKHR].operands.push(OperandId, "'Predicate'"); + + InstructionDesc[OpSubgroupReadInvocationKHR].operands.push(OperandId, "'Value'"); + InstructionDesc[OpSubgroupReadInvocationKHR].operands.push(OperandId, "'Index'"); + + InstructionDesc[OpModuleProcessed].operands.push(OperandLiteralString, "'process'"); + + InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandId, "'X'"); + + InstructionDesc[OpGroupFAddNonUniformAMD].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupFAddNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupFAddNonUniformAMD].operands.push(OperandId, "'X'"); + + InstructionDesc[OpGroupUMinNonUniformAMD].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupUMinNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupUMinNonUniformAMD].operands.push(OperandId, "'X'"); + + InstructionDesc[OpGroupSMinNonUniformAMD].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupSMinNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupSMinNonUniformAMD].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupFMinNonUniformAMD].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupFMinNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupFMinNonUniformAMD].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupUMaxNonUniformAMD].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupUMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupUMaxNonUniformAMD].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupSMaxNonUniformAMD].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupSMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupSMaxNonUniformAMD].operands.push(OperandId, "X"); + + InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandScope, "'Execution'"); + InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); + InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandId, "X"); + + InstructionDesc[OpFragmentMaskFetchAMD].operands.push(OperandId, "'Image'"); + InstructionDesc[OpFragmentMaskFetchAMD].operands.push(OperandId, "'Coordinate'"); + + InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Image'"); + InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Fragment Index'"); + + InstructionDesc[OpGroupNonUniformPartitionNV].operands.push(OperandId, "X"); + + InstructionDesc[OpTypeAccelerationStructureKHR].setResultAndType(true, false); + + InstructionDesc[OpTraceNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Flags'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'Cull Mask'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'SBT Record Offset'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'SBT Record Stride'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'Miss Index'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Origin'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Direction'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpTraceNV].operands.push(OperandId, "'Payload'"); + InstructionDesc[OpTraceNV].setResultAndType(false, false); + + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Ray Flags'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Cull Mask'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'SBT Record Offset'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'SBT Record Stride'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Miss Index'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Ray Origin'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Ray Direction'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Time'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Payload'"); + InstructionDesc[OpTraceRayMotionNV].setResultAndType(false, false); + + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Ray Flags'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Cull Mask'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'SBT Record Offset'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'SBT Record Stride'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Miss Index'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Ray Origin'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Ray Direction'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Payload'"); + InstructionDesc[OpTraceRayKHR].setResultAndType(false, false); + + InstructionDesc[OpReportIntersectionKHR].operands.push(OperandId, "'Hit Parameter'"); + InstructionDesc[OpReportIntersectionKHR].operands.push(OperandId, "'Hit Kind'"); + + InstructionDesc[OpIgnoreIntersectionNV].setResultAndType(false, false); + + InstructionDesc[OpIgnoreIntersectionKHR].setResultAndType(false, false); + + InstructionDesc[OpTerminateRayNV].setResultAndType(false, false); + + InstructionDesc[OpTerminateRayKHR].setResultAndType(false, false); + + InstructionDesc[OpExecuteCallableNV].operands.push(OperandId, "SBT Record Index"); + InstructionDesc[OpExecuteCallableNV].operands.push(OperandId, "CallableData ID"); + InstructionDesc[OpExecuteCallableNV].setResultAndType(false, false); + + InstructionDesc[OpExecuteCallableKHR].operands.push(OperandId, "SBT Record Index"); + InstructionDesc[OpExecuteCallableKHR].operands.push(OperandId, "CallableData"); + InstructionDesc[OpExecuteCallableKHR].setResultAndType(false, false); + + InstructionDesc[OpConvertUToAccelerationStructureKHR].operands.push(OperandId, "Value"); + InstructionDesc[OpConvertUToAccelerationStructureKHR].setResultAndType(true, true); + + // Ray Query + InstructionDesc[OpTypeAccelerationStructureKHR].setResultAndType(true, false); + InstructionDesc[OpTypeRayQueryKHR].setResultAndType(true, false); + + InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'AccelerationS'"); + InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'RayFlags'"); + InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'CullMask'"); + InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'Origin'"); + InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'Tmin'"); + InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'Direction'"); + InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'Tmax'"); + InstructionDesc[OpRayQueryInitializeKHR].setResultAndType(false, false); + + InstructionDesc[OpRayQueryTerminateKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryTerminateKHR].setResultAndType(false, false); + + InstructionDesc[OpRayQueryGenerateIntersectionKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGenerateIntersectionKHR].operands.push(OperandId, "'THit'"); + InstructionDesc[OpRayQueryGenerateIntersectionKHR].setResultAndType(false, false); + + InstructionDesc[OpRayQueryConfirmIntersectionKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryConfirmIntersectionKHR].setResultAndType(false, false); + + InstructionDesc[OpRayQueryProceedKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryProceedKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionTypeKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionTypeKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionTypeKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetRayTMinKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetRayTMinKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetRayFlagsKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetRayFlagsKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionTKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionTKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionTKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionInstanceCustomIndexKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionInstanceCustomIndexKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionInstanceCustomIndexKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionInstanceIdKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionInstanceIdKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionInstanceIdKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionGeometryIndexKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionGeometryIndexKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionGeometryIndexKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionPrimitiveIndexKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionPrimitiveIndexKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionPrimitiveIndexKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionBarycentricsKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionBarycentricsKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionBarycentricsKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionFrontFaceKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionFrontFaceKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionFrontFaceKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionCandidateAABBOpaqueKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionCandidateAABBOpaqueKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionObjectRayDirectionKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionObjectRayDirectionKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionObjectRayDirectionKHR].setResultAndType(true, true); - InstructionDesc[OpAtomicSMax].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicSMax].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicSMax].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicSMax].operands.push(OperandId, "'Value'"); + InstructionDesc[OpRayQueryGetIntersectionObjectRayOriginKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionObjectRayOriginKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionObjectRayOriginKHR].setResultAndType(true, true); - InstructionDesc[OpAtomicFMinEXT].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicFMinEXT].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicFMinEXT].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicFMinEXT].operands.push(OperandId, "'Value'"); + InstructionDesc[OpRayQueryGetWorldRayDirectionKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetWorldRayDirectionKHR].setResultAndType(true, true); - InstructionDesc[OpAtomicFMaxEXT].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicFMaxEXT].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicFMaxEXT].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicFMaxEXT].operands.push(OperandId, "'Value'"); + InstructionDesc[OpRayQueryGetWorldRayOriginKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetWorldRayOriginKHR].setResultAndType(true, true); - InstructionDesc[OpAtomicAnd].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicAnd].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicAnd].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicAnd].operands.push(OperandId, "'Value'"); - - InstructionDesc[OpAtomicOr].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicOr].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicOr].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicOr].operands.push(OperandId, "'Value'"); - - InstructionDesc[OpAtomicXor].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicXor].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicXor].operands.push(OperandMemorySemantics, "'Semantics'"); - InstructionDesc[OpAtomicXor].operands.push(OperandId, "'Value'"); - - InstructionDesc[OpAtomicFlagTestAndSet].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicFlagTestAndSet].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicFlagTestAndSet].operands.push(OperandMemorySemantics, "'Semantics'"); - - InstructionDesc[OpAtomicFlagClear].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpAtomicFlagClear].operands.push(OperandScope, "'Scope'"); - InstructionDesc[OpAtomicFlagClear].operands.push(OperandMemorySemantics, "'Semantics'"); - - InstructionDesc[OpLoopMerge].operands.push(OperandId, "'Merge Block'"); - InstructionDesc[OpLoopMerge].operands.push(OperandId, "'Continue Target'"); - InstructionDesc[OpLoopMerge].operands.push(OperandLoop, ""); - InstructionDesc[OpLoopMerge].operands.push(OperandOptionalLiteral, ""); - - InstructionDesc[OpSelectionMerge].operands.push(OperandId, "'Merge Block'"); - InstructionDesc[OpSelectionMerge].operands.push(OperandSelect, ""); - - InstructionDesc[OpBranch].operands.push(OperandId, "'Target Label'"); - - InstructionDesc[OpBranchConditional].operands.push(OperandId, "'Condition'"); - InstructionDesc[OpBranchConditional].operands.push(OperandId, "'True Label'"); - InstructionDesc[OpBranchConditional].operands.push(OperandId, "'False Label'"); - InstructionDesc[OpBranchConditional].operands.push(OperandVariableLiterals, "'Branch weights'"); - - InstructionDesc[OpSwitch].operands.push(OperandId, "'Selector'"); - InstructionDesc[OpSwitch].operands.push(OperandId, "'Default'"); - InstructionDesc[OpSwitch].operands.push(OperandVariableLiteralId, "'Target'"); - - - InstructionDesc[OpReturnValue].operands.push(OperandId, "'Value'"); - - InstructionDesc[OpLifetimeStart].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpLifetimeStart].operands.push(OperandLiteralNumber, "'Size'"); - - InstructionDesc[OpLifetimeStop].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpLifetimeStop].operands.push(OperandLiteralNumber, "'Size'"); - - InstructionDesc[OpGroupAsyncCopy].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Destination'"); - InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Source'"); - InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Num Elements'"); - InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Stride'"); - InstructionDesc[OpGroupAsyncCopy].operands.push(OperandId, "'Event'"); - - InstructionDesc[OpGroupWaitEvents].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupWaitEvents].operands.push(OperandId, "'Num Events'"); - InstructionDesc[OpGroupWaitEvents].operands.push(OperandId, "'Events List'"); - - InstructionDesc[OpGroupAll].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupAll].operands.push(OperandId, "'Predicate'"); - - InstructionDesc[OpGroupAny].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupAny].operands.push(OperandId, "'Predicate'"); - - InstructionDesc[OpGroupBroadcast].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupBroadcast].operands.push(OperandId, "'Value'"); - InstructionDesc[OpGroupBroadcast].operands.push(OperandId, "'LocalId'"); - - InstructionDesc[OpGroupIAdd].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupIAdd].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupIAdd].operands.push(OperandId, "'X'"); - - InstructionDesc[OpGroupFAdd].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupFAdd].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupFAdd].operands.push(OperandId, "'X'"); - - InstructionDesc[OpGroupUMin].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupUMin].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupUMin].operands.push(OperandId, "'X'"); - - InstructionDesc[OpGroupSMin].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupSMin].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupSMin].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupFMin].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupFMin].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupFMin].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupUMax].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupUMax].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupUMax].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupSMax].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupSMax].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupSMax].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupFMax].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupFMax].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupFMax].operands.push(OperandId, "X"); - - InstructionDesc[OpReadPipe].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpReadPipe].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpReadPipe].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpReadPipe].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpWritePipe].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpWritePipe].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpWritePipe].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpWritePipe].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Reserve Id'"); - InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Index'"); - InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Reserve Id'"); - InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Index'"); - InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Num Packets'"); - InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Num Packets'"); - InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Reserve Id'"); - InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Reserve Id'"); - InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpIsValidReserveId].operands.push(OperandId, "'Reserve Id'"); - - InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Num Packets'"); - InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Num Packets'"); - InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Reserve Id'"); - InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Pipe'"); - InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Reserve Id'"); - InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Packet Size'"); - InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'Packet Alignment'"); - - InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'GlobalWorkSize'"); - InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'LocalWorkSize'"); - InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'GlobalWorkOffset'"); - - InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'Event'"); - InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'Profiling Info'"); - InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'Value'"); - - InstructionDesc[OpSetUserEventStatus].operands.push(OperandId, "'Event'"); - InstructionDesc[OpSetUserEventStatus].operands.push(OperandId, "'Status'"); - - InstructionDesc[OpIsValidEvent].operands.push(OperandId, "'Event'"); - - InstructionDesc[OpRetainEvent].operands.push(OperandId, "'Event'"); - - InstructionDesc[OpReleaseEvent].operands.push(OperandId, "'Event'"); - - InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Invoke'"); - InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Param'"); - InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Param Size'"); - InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Param Align'"); - - InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Invoke'"); - InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Param'"); - InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Param Size'"); - InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Param Align'"); - - InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'ND Range'"); - InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Invoke'"); - InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Param'"); - InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Param Size'"); - InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Param Align'"); - - InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'ND Range'"); - InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Invoke'"); - InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Param'"); - InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Param Size'"); - InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Param Align'"); - - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Queue'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Flags'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'ND Range'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Num Events'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Wait Events'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Ret Event'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Invoke'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Param'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Param Size'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Param Align'"); - InstructionDesc[OpEnqueueKernel].operands.push(OperandVariableIds, "'Local Size'"); - - InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Queue'"); - InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Num Events'"); - InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Wait Events'"); - InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Ret Event'"); - - InstructionDesc[OpGroupNonUniformElect].operands.push(OperandScope, "'Execution'"); - - InstructionDesc[OpGroupNonUniformAll].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformAll].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupNonUniformAny].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformAny].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupNonUniformAllEqual].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformAllEqual].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupNonUniformBroadcast].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBroadcast].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformBroadcast].operands.push(OperandId, "ID"); - - InstructionDesc[OpGroupNonUniformBroadcastFirst].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBroadcastFirst].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupNonUniformBallot].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBallot].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupNonUniformInverseBallot].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformInverseBallot].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupNonUniformBallotBitExtract].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBallotBitExtract].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformBallotBitExtract].operands.push(OperandId, "Bit"); - - InstructionDesc[OpGroupNonUniformBallotBitCount].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBallotBitCount].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformBallotBitCount].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupNonUniformBallotFindLSB].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBallotFindLSB].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupNonUniformBallotFindMSB].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBallotFindMSB].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupNonUniformShuffle].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformShuffle].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformShuffle].operands.push(OperandId, "'Id'"); - - InstructionDesc[OpGroupNonUniformShuffleXor].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformShuffleXor].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformShuffleXor].operands.push(OperandId, "Mask"); - - InstructionDesc[OpGroupNonUniformShuffleUp].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformShuffleUp].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformShuffleUp].operands.push(OperandId, "Offset"); - - InstructionDesc[OpGroupNonUniformShuffleDown].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformShuffleDown].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformShuffleDown].operands.push(OperandId, "Offset"); - - InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformIAdd].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformFAdd].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformIMul].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformFMul].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformSMin].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformUMin].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformFMin].operands.push(OperandId, "'ClusterSize'", true); + InstructionDesc[OpRayQueryGetIntersectionObjectToWorldKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionObjectToWorldKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionObjectToWorldKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionWorldToObjectKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionWorldToObjectKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionWorldToObjectKHR].setResultAndType(true, true); + + InstructionDesc[OpRayQueryGetIntersectionTriangleVertexPositionsKHR].operands.push(OperandId, "'RayQuery'"); + InstructionDesc[OpRayQueryGetIntersectionTriangleVertexPositionsKHR].operands.push(OperandId, "'Committed'"); + InstructionDesc[OpRayQueryGetIntersectionTriangleVertexPositionsKHR].setResultAndType(true, true); + + InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Sampled Image'"); + InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Coordinate'"); + InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Granularity'"); + InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Coarse'"); + InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandVariableIds, "", true); + + InstructionDesc[OpWritePackedPrimitiveIndices4x8NV].operands.push(OperandId, "'Index Offset'"); + InstructionDesc[OpWritePackedPrimitiveIndices4x8NV].operands.push(OperandId, "'Packed Indices'"); - InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformSMax].operands.push(OperandId, "'ClusterSize'", true); + InstructionDesc[OpEmitMeshTasksEXT].operands.push(OperandId, "'groupCountX'"); + InstructionDesc[OpEmitMeshTasksEXT].operands.push(OperandId, "'groupCountY'"); + InstructionDesc[OpEmitMeshTasksEXT].operands.push(OperandId, "'groupCountZ'"); + InstructionDesc[OpEmitMeshTasksEXT].operands.push(OperandId, "'Payload'"); + InstructionDesc[OpEmitMeshTasksEXT].setResultAndType(false, false); - InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformUMax].operands.push(OperandId, "'ClusterSize'", true); + InstructionDesc[OpSetMeshOutputsEXT].operands.push(OperandId, "'vertexCount'"); + InstructionDesc[OpSetMeshOutputsEXT].operands.push(OperandId, "'primitiveCount'"); + InstructionDesc[OpSetMeshOutputsEXT].setResultAndType(false, false); - InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformFMax].operands.push(OperandId, "'ClusterSize'", true); - InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformBitwiseAnd].operands.push(OperandId, "'ClusterSize'", true); + InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Component Type'"); + InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Scope'"); + InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Rows'"); + InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Columns'"); - InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformBitwiseOr].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformBitwiseXor].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformLogicalAnd].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformLogicalOr].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformLogicalXor].operands.push(OperandId, "'ClusterSize'", true); - - InstructionDesc[OpGroupNonUniformQuadBroadcast].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformQuadBroadcast].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformQuadBroadcast].operands.push(OperandId, "'Id'"); - - InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandId, "X"); - InstructionDesc[OpGroupNonUniformQuadSwap].operands.push(OperandId, "'Direction'"); - - InstructionDesc[OpSubgroupBallotKHR].operands.push(OperandId, "'Predicate'"); - - InstructionDesc[OpSubgroupFirstInvocationKHR].operands.push(OperandId, "'Value'"); - - InstructionDesc[OpSubgroupAnyKHR].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpSubgroupAnyKHR].operands.push(OperandId, "'Predicate'"); - - InstructionDesc[OpSubgroupAllKHR].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpSubgroupAllKHR].operands.push(OperandId, "'Predicate'"); - - InstructionDesc[OpSubgroupAllEqualKHR].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpSubgroupAllEqualKHR].operands.push(OperandId, "'Predicate'"); - - InstructionDesc[OpSubgroupReadInvocationKHR].operands.push(OperandId, "'Value'"); - InstructionDesc[OpSubgroupReadInvocationKHR].operands.push(OperandId, "'Index'"); - - InstructionDesc[OpModuleProcessed].operands.push(OperandLiteralString, "'process'"); - - InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandId, "'X'"); - - InstructionDesc[OpGroupFAddNonUniformAMD].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupFAddNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupFAddNonUniformAMD].operands.push(OperandId, "'X'"); - - InstructionDesc[OpGroupUMinNonUniformAMD].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupUMinNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupUMinNonUniformAMD].operands.push(OperandId, "'X'"); - - InstructionDesc[OpGroupSMinNonUniformAMD].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupSMinNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupSMinNonUniformAMD].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupFMinNonUniformAMD].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupFMinNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupFMinNonUniformAMD].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupUMaxNonUniformAMD].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupUMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupUMaxNonUniformAMD].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupSMaxNonUniformAMD].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupSMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupSMaxNonUniformAMD].operands.push(OperandId, "X"); - - InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandScope, "'Execution'"); - InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'"); - InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandId, "X"); - - InstructionDesc[OpFragmentMaskFetchAMD].operands.push(OperandId, "'Image'"); - InstructionDesc[OpFragmentMaskFetchAMD].operands.push(OperandId, "'Coordinate'"); - - InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Image'"); - InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Fragment Index'"); - - InstructionDesc[OpGroupNonUniformPartitionNV].operands.push(OperandId, "X"); - - InstructionDesc[OpTypeAccelerationStructureKHR].setResultAndType(true, false); - - InstructionDesc[OpTraceNV].operands.push(OperandId, "'Acceleration Structure'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Flags'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'Cull Mask'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'SBT Record Offset'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'SBT Record Stride'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'Miss Index'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Origin'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'TMin'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'Ray Direction'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'TMax'"); - InstructionDesc[OpTraceNV].operands.push(OperandId, "'Payload'"); - InstructionDesc[OpTraceNV].setResultAndType(false, false); - - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Acceleration Structure'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Ray Flags'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Cull Mask'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'SBT Record Offset'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'SBT Record Stride'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Miss Index'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Ray Origin'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'TMin'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Ray Direction'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'TMax'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Time'"); - InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Payload'"); - InstructionDesc[OpTraceRayMotionNV].setResultAndType(false, false); - - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Acceleration Structure'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Ray Flags'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Cull Mask'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'SBT Record Offset'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'SBT Record Stride'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Miss Index'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Ray Origin'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'TMin'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Ray Direction'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'TMax'"); - InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Payload'"); - InstructionDesc[OpTraceRayKHR].setResultAndType(false, false); - - InstructionDesc[OpReportIntersectionKHR].operands.push(OperandId, "'Hit Parameter'"); - InstructionDesc[OpReportIntersectionKHR].operands.push(OperandId, "'Hit Kind'"); - - InstructionDesc[OpIgnoreIntersectionNV].setResultAndType(false, false); - - InstructionDesc[OpIgnoreIntersectionKHR].setResultAndType(false, false); - - InstructionDesc[OpTerminateRayNV].setResultAndType(false, false); - - InstructionDesc[OpTerminateRayKHR].setResultAndType(false, false); - - InstructionDesc[OpExecuteCallableNV].operands.push(OperandId, "SBT Record Index"); - InstructionDesc[OpExecuteCallableNV].operands.push(OperandId, "CallableData ID"); - InstructionDesc[OpExecuteCallableNV].setResultAndType(false, false); - - InstructionDesc[OpExecuteCallableKHR].operands.push(OperandId, "SBT Record Index"); - InstructionDesc[OpExecuteCallableKHR].operands.push(OperandId, "CallableData"); - InstructionDesc[OpExecuteCallableKHR].setResultAndType(false, false); - - InstructionDesc[OpConvertUToAccelerationStructureKHR].operands.push(OperandId, "Value"); - InstructionDesc[OpConvertUToAccelerationStructureKHR].setResultAndType(true, true); - - // Ray Query - InstructionDesc[OpTypeAccelerationStructureKHR].setResultAndType(true, false); - InstructionDesc[OpTypeRayQueryKHR].setResultAndType(true, false); - - InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'AccelerationS'"); - InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'RayFlags'"); - InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'CullMask'"); - InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'Origin'"); - InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'Tmin'"); - InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'Direction'"); - InstructionDesc[OpRayQueryInitializeKHR].operands.push(OperandId, "'Tmax'"); - InstructionDesc[OpRayQueryInitializeKHR].setResultAndType(false, false); - - InstructionDesc[OpRayQueryTerminateKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryTerminateKHR].setResultAndType(false, false); - - InstructionDesc[OpRayQueryGenerateIntersectionKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGenerateIntersectionKHR].operands.push(OperandId, "'THit'"); - InstructionDesc[OpRayQueryGenerateIntersectionKHR].setResultAndType(false, false); - - InstructionDesc[OpRayQueryConfirmIntersectionKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryConfirmIntersectionKHR].setResultAndType(false, false); - - InstructionDesc[OpRayQueryProceedKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryProceedKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionTypeKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionTypeKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionTypeKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetRayTMinKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetRayTMinKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetRayFlagsKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetRayFlagsKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionTKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionTKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionTKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionInstanceCustomIndexKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionInstanceCustomIndexKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionInstanceCustomIndexKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionInstanceIdKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionInstanceIdKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionInstanceIdKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionGeometryIndexKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionGeometryIndexKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionGeometryIndexKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionPrimitiveIndexKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionPrimitiveIndexKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionPrimitiveIndexKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionBarycentricsKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionBarycentricsKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionBarycentricsKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionFrontFaceKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionFrontFaceKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionFrontFaceKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionCandidateAABBOpaqueKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionCandidateAABBOpaqueKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionObjectRayDirectionKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionObjectRayDirectionKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionObjectRayDirectionKHR].setResultAndType(true, true); + InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandId, "'Stride'"); + InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandId, "'Column Major'"); + InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandMemoryAccess, "'Memory Access'"); + InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandLiteralNumber, "", true); + InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandId, "", true); - InstructionDesc[OpRayQueryGetIntersectionObjectRayOriginKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionObjectRayOriginKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionObjectRayOriginKHR].setResultAndType(true, true); + InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "'Object'"); + InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "'Stride'"); + InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "'Column Major'"); + InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandMemoryAccess, "'Memory Access'"); + InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandLiteralNumber, "", true); + InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "", true); - InstructionDesc[OpRayQueryGetWorldRayDirectionKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetWorldRayDirectionKHR].setResultAndType(true, true); + InstructionDesc[OpCooperativeMatrixMulAddNV].operands.push(OperandId, "'A'"); + InstructionDesc[OpCooperativeMatrixMulAddNV].operands.push(OperandId, "'B'"); + InstructionDesc[OpCooperativeMatrixMulAddNV].operands.push(OperandId, "'C'"); - InstructionDesc[OpRayQueryGetWorldRayOriginKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetWorldRayOriginKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionObjectToWorldKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionObjectToWorldKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionObjectToWorldKHR].setResultAndType(true, true); - - InstructionDesc[OpRayQueryGetIntersectionWorldToObjectKHR].operands.push(OperandId, "'RayQuery'"); - InstructionDesc[OpRayQueryGetIntersectionWorldToObjectKHR].operands.push(OperandId, "'Committed'"); - InstructionDesc[OpRayQueryGetIntersectionWorldToObjectKHR].setResultAndType(true, true); - - InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Sampled Image'"); - InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Coordinate'"); - InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Granularity'"); - InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Coarse'"); - InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandImageOperands, "", true); - InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandVariableIds, "", true); - - InstructionDesc[OpWritePackedPrimitiveIndices4x8NV].operands.push(OperandId, "'Index Offset'"); - InstructionDesc[OpWritePackedPrimitiveIndices4x8NV].operands.push(OperandId, "'Packed Indices'"); - - InstructionDesc[OpEmitMeshTasksEXT].operands.push(OperandId, "'groupCountX'"); - InstructionDesc[OpEmitMeshTasksEXT].operands.push(OperandId, "'groupCountY'"); - InstructionDesc[OpEmitMeshTasksEXT].operands.push(OperandId, "'groupCountZ'"); - InstructionDesc[OpEmitMeshTasksEXT].operands.push(OperandId, "'Payload'"); - InstructionDesc[OpEmitMeshTasksEXT].setResultAndType(false, false); + InstructionDesc[OpCooperativeMatrixLengthNV].operands.push(OperandId, "'Type'"); - InstructionDesc[OpSetMeshOutputsEXT].operands.push(OperandId, "'vertexCount'"); - InstructionDesc[OpSetMeshOutputsEXT].operands.push(OperandId, "'primitiveCount'"); - InstructionDesc[OpSetMeshOutputsEXT].setResultAndType(false, false); + InstructionDesc[OpTypeCooperativeMatrixKHR].operands.push(OperandId, "'Component Type'"); + InstructionDesc[OpTypeCooperativeMatrixKHR].operands.push(OperandId, "'Scope'"); + InstructionDesc[OpTypeCooperativeMatrixKHR].operands.push(OperandId, "'Rows'"); + InstructionDesc[OpTypeCooperativeMatrixKHR].operands.push(OperandId, "'Columns'"); + InstructionDesc[OpTypeCooperativeMatrixKHR].operands.push(OperandId, "'Use'"); + InstructionDesc[OpCooperativeMatrixLoadKHR].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpCooperativeMatrixLoadKHR].operands.push(OperandId, "'Memory Layout'"); + InstructionDesc[OpCooperativeMatrixLoadKHR].operands.push(OperandId, "'Stride'"); + InstructionDesc[OpCooperativeMatrixLoadKHR].operands.push(OperandMemoryAccess, "'Memory Access'"); + InstructionDesc[OpCooperativeMatrixLoadKHR].operands.push(OperandLiteralNumber, "", true); + InstructionDesc[OpCooperativeMatrixLoadKHR].operands.push(OperandId, "", true); - InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Component Type'"); - InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Scope'"); - InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Rows'"); - InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Columns'"); + InstructionDesc[OpCooperativeMatrixStoreKHR].operands.push(OperandId, "'Pointer'"); + InstructionDesc[OpCooperativeMatrixStoreKHR].operands.push(OperandId, "'Object'"); + InstructionDesc[OpCooperativeMatrixStoreKHR].operands.push(OperandId, "'Memory Layout'"); + InstructionDesc[OpCooperativeMatrixStoreKHR].operands.push(OperandId, "'Stride'"); + InstructionDesc[OpCooperativeMatrixStoreKHR].operands.push(OperandMemoryAccess, "'Memory Access'"); + InstructionDesc[OpCooperativeMatrixStoreKHR].operands.push(OperandLiteralNumber, "", true); + InstructionDesc[OpCooperativeMatrixStoreKHR].operands.push(OperandId, "", true); - InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandId, "'Stride'"); - InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandId, "'Column Major'"); - InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandMemoryAccess, "'Memory Access'"); - InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandLiteralNumber, "", true); - InstructionDesc[OpCooperativeMatrixLoadNV].operands.push(OperandId, "", true); + InstructionDesc[OpCooperativeMatrixMulAddKHR].operands.push(OperandId, "'A'"); + InstructionDesc[OpCooperativeMatrixMulAddKHR].operands.push(OperandId, "'B'"); + InstructionDesc[OpCooperativeMatrixMulAddKHR].operands.push(OperandId, "'C'"); + InstructionDesc[OpCooperativeMatrixMulAddKHR].operands.push(OperandCooperativeMatrixOperands, "'Cooperative Matrix Operands'", true); - InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "'Pointer'"); - InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "'Object'"); - InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "'Stride'"); - InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "'Column Major'"); - InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandMemoryAccess, "'Memory Access'"); - InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandLiteralNumber, "", true); - InstructionDesc[OpCooperativeMatrixStoreNV].operands.push(OperandId, "", true); - - InstructionDesc[OpCooperativeMatrixMulAddNV].operands.push(OperandId, "'A'"); - InstructionDesc[OpCooperativeMatrixMulAddNV].operands.push(OperandId, "'B'"); - InstructionDesc[OpCooperativeMatrixMulAddNV].operands.push(OperandId, "'C'"); - - InstructionDesc[OpCooperativeMatrixLengthNV].operands.push(OperandId, "'Type'"); - - InstructionDesc[OpDemoteToHelperInvocationEXT].setResultAndType(false, false); - - InstructionDesc[OpReadClockKHR].operands.push(OperandScope, "'Scope'"); + InstructionDesc[OpCooperativeMatrixLengthKHR].operands.push(OperandId, "'Type'"); + + InstructionDesc[OpDemoteToHelperInvocationEXT].setResultAndType(false, false); + + InstructionDesc[OpReadClockKHR].operands.push(OperandScope, "'Scope'"); + + InstructionDesc[OpTypeHitObjectNV].setResultAndType(true, false); + + InstructionDesc[OpHitObjectGetShaderRecordBufferHandleNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetShaderRecordBufferHandleNV].setResultAndType(true, true); + + InstructionDesc[OpReorderThreadWithHintNV].operands.push(OperandId, "'Hint'"); + InstructionDesc[OpReorderThreadWithHintNV].operands.push(OperandId, "'Bits'"); + InstructionDesc[OpReorderThreadWithHintNV].setResultAndType(false, false); + + InstructionDesc[OpReorderThreadWithHitObjectNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpReorderThreadWithHitObjectNV].operands.push(OperandId, "'Hint'"); + InstructionDesc[OpReorderThreadWithHitObjectNV].operands.push(OperandId, "'Bits'"); + InstructionDesc[OpReorderThreadWithHitObjectNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectGetCurrentTimeNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetCurrentTimeNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetHitKindNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetHitKindNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetPrimitiveIndexNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetPrimitiveIndexNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetGeometryIndexNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetGeometryIndexNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetInstanceIdNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetInstanceIdNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetInstanceCustomIndexNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetInstanceCustomIndexNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetObjectRayDirectionNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetObjectRayDirectionNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetObjectRayOriginNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetObjectRayOriginNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetWorldRayDirectionNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetWorldRayDirectionNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetWorldRayOriginNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetWorldRayOriginNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetWorldToObjectNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetWorldToObjectNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetObjectToWorldNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetObjectToWorldNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetRayTMaxNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetRayTMaxNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetRayTMinNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetRayTMinNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetShaderBindingTableRecordIndexNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetShaderBindingTableRecordIndexNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectIsEmptyNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectIsEmptyNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectIsHitNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectIsHitNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectIsMissNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectIsMissNV].setResultAndType(true, true); + + InstructionDesc[OpHitObjectGetAttributesNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectGetAttributesNV].operands.push(OperandId, "'HitObjectAttribute'"); + InstructionDesc[OpHitObjectGetAttributesNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectExecuteShaderNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectExecuteShaderNV].operands.push(OperandId, "'Payload'"); + InstructionDesc[OpHitObjectExecuteShaderNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'InstanceId'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'PrimitiveId'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'GeometryIndex'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'HitKind'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'SBT Record Offset'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'SBT Record Stride'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'Origin'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'Direction'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpHitObjectRecordHitNV].operands.push(OperandId, "'HitObject Attribute'"); + InstructionDesc[OpHitObjectRecordHitNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'InstanceId'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'PrimitiveId'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'GeometryIndex'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'HitKind'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'SBT Record Offset'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'SBT Record Stride'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'Origin'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'Direction'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'Current Time'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].operands.push(OperandId, "'HitObject Attribute'"); + InstructionDesc[OpHitObjectRecordHitMotionNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'InstanceId'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'PrimitiveId'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'GeometryIndex'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'HitKind'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'SBT Record Index'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'Origin'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'Direction'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].operands.push(OperandId, "'HitObject Attribute'"); + InstructionDesc[OpHitObjectRecordHitWithIndexNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'InstanceId'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'PrimitiveId'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'GeometryIndex'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'HitKind'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'SBT Record Index'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'Origin'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'Direction'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'Current Time'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].operands.push(OperandId, "'HitObject Attribute'"); + InstructionDesc[OpHitObjectRecordHitWithIndexMotionNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectRecordMissNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectRecordMissNV].operands.push(OperandId, "'SBT Index'"); + InstructionDesc[OpHitObjectRecordMissNV].operands.push(OperandId, "'Origin'"); + InstructionDesc[OpHitObjectRecordMissNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpHitObjectRecordMissNV].operands.push(OperandId, "'Direction'"); + InstructionDesc[OpHitObjectRecordMissNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpHitObjectRecordMissNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectRecordMissMotionNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectRecordMissMotionNV].operands.push(OperandId, "'SBT Index'"); + InstructionDesc[OpHitObjectRecordMissMotionNV].operands.push(OperandId, "'Origin'"); + InstructionDesc[OpHitObjectRecordMissMotionNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpHitObjectRecordMissMotionNV].operands.push(OperandId, "'Direction'"); + InstructionDesc[OpHitObjectRecordMissMotionNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpHitObjectRecordMissMotionNV].operands.push(OperandId, "'Current Time'"); + InstructionDesc[OpHitObjectRecordMissMotionNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectRecordEmptyNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectRecordEmptyNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'RayFlags'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'Cullmask'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'SBT Record Offset'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'SBT Record Stride'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'Miss Index'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'Origin'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'Direction'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpHitObjectTraceRayNV].operands.push(OperandId, "'Payload'"); + InstructionDesc[OpHitObjectTraceRayNV].setResultAndType(false, false); + + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'HitObject'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'RayFlags'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'Cullmask'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'SBT Record Offset'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'SBT Record Stride'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'Miss Index'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'Origin'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'Direction'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'Time'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'Payload'"); + InstructionDesc[OpHitObjectTraceRayMotionNV].setResultAndType(false, false); + + InstructionDesc[OpFetchMicroTriangleVertexBarycentricNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpFetchMicroTriangleVertexBarycentricNV].operands.push(OperandId, "'Instance ID'"); + InstructionDesc[OpFetchMicroTriangleVertexBarycentricNV].operands.push(OperandId, "'Geometry Index'"); + InstructionDesc[OpFetchMicroTriangleVertexBarycentricNV].operands.push(OperandId, "'Primitive Index'"); + InstructionDesc[OpFetchMicroTriangleVertexBarycentricNV].operands.push(OperandId, "'Barycentrics'"); + InstructionDesc[OpFetchMicroTriangleVertexBarycentricNV].setResultAndType(true, true); + + InstructionDesc[OpFetchMicroTriangleVertexPositionNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpFetchMicroTriangleVertexPositionNV].operands.push(OperandId, "'Instance ID'"); + InstructionDesc[OpFetchMicroTriangleVertexPositionNV].operands.push(OperandId, "'Geometry Index'"); + InstructionDesc[OpFetchMicroTriangleVertexPositionNV].operands.push(OperandId, "'Primitive Index'"); + InstructionDesc[OpFetchMicroTriangleVertexPositionNV].operands.push(OperandId, "'Barycentrics'"); + InstructionDesc[OpFetchMicroTriangleVertexPositionNV].setResultAndType(true, true); + + InstructionDesc[OpColorAttachmentReadEXT].operands.push(OperandId, "'Attachment'"); + InstructionDesc[OpColorAttachmentReadEXT].operands.push(OperandId, "'Sample'", true); + InstructionDesc[OpStencilAttachmentReadEXT].operands.push(OperandId, "'Sample'", true); + InstructionDesc[OpDepthAttachmentReadEXT].operands.push(OperandId, "'Sample'", true); + + InstructionDesc[OpImageSampleWeightedQCOM].operands.push(OperandId, "'source texture'"); + InstructionDesc[OpImageSampleWeightedQCOM].operands.push(OperandId, "'texture coordinates'"); + InstructionDesc[OpImageSampleWeightedQCOM].operands.push(OperandId, "'weights texture'"); + InstructionDesc[OpImageSampleWeightedQCOM].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageSampleWeightedQCOM].setResultAndType(true, true); + + InstructionDesc[OpImageBoxFilterQCOM].operands.push(OperandId, "'source texture'"); + InstructionDesc[OpImageBoxFilterQCOM].operands.push(OperandId, "'texture coordinates'"); + InstructionDesc[OpImageBoxFilterQCOM].operands.push(OperandId, "'box size'"); + InstructionDesc[OpImageBoxFilterQCOM].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageBoxFilterQCOM].setResultAndType(true, true); + + InstructionDesc[OpImageBlockMatchSADQCOM].operands.push(OperandId, "'target texture'"); + InstructionDesc[OpImageBlockMatchSADQCOM].operands.push(OperandId, "'target coordinates'"); + InstructionDesc[OpImageBlockMatchSADQCOM].operands.push(OperandId, "'reference texture'"); + InstructionDesc[OpImageBlockMatchSADQCOM].operands.push(OperandId, "'reference coordinates'"); + InstructionDesc[OpImageBlockMatchSADQCOM].operands.push(OperandId, "'block size'"); + InstructionDesc[OpImageBlockMatchSADQCOM].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageBlockMatchSADQCOM].setResultAndType(true, true); + + InstructionDesc[OpImageBlockMatchSSDQCOM].operands.push(OperandId, "'target texture'"); + InstructionDesc[OpImageBlockMatchSSDQCOM].operands.push(OperandId, "'target coordinates'"); + InstructionDesc[OpImageBlockMatchSSDQCOM].operands.push(OperandId, "'reference texture'"); + InstructionDesc[OpImageBlockMatchSSDQCOM].operands.push(OperandId, "'reference coordinates'"); + InstructionDesc[OpImageBlockMatchSSDQCOM].operands.push(OperandId, "'block size'"); + InstructionDesc[OpImageBlockMatchSSDQCOM].operands.push(OperandImageOperands, "", true); + InstructionDesc[OpImageBlockMatchSSDQCOM].setResultAndType(true, true); + }); } }; // end spv namespace diff --git a/third_party/glslang/SPIRV/doc.h b/third_party/glslang/SPIRV/doc.h index 2a0b28c6b3a..b60ad340185 100644 --- a/third_party/glslang/SPIRV/doc.h +++ b/third_party/glslang/SPIRV/doc.h @@ -156,6 +156,7 @@ enum OperandClass { OperandKernelEnqueueFlags, OperandKernelProfilingInfo, OperandCapability, + OperandCooperativeMatrixOperands, OperandOpcode, @@ -190,15 +191,15 @@ class OperandParameters { // Parameterize an enumerant class EnumParameters { public: - EnumParameters() : desc(0) { } + EnumParameters() : desc(nullptr) { } const char* desc; }; // Parameterize a set of enumerants that form an enum class EnumDefinition : public EnumParameters { public: - EnumDefinition() : - ceiling(0), bitmask(false), getName(0), enumParams(0), operandParams(0) { } + EnumDefinition() : + ceiling(0), bitmask(false), getName(nullptr), enumParams(nullptr), operandParams(nullptr) { } void set(int ceil, const char* (*name)(int), EnumParameters* ep, bool mask = false) { ceiling = ceil; diff --git a/third_party/glslang/SPIRV/hex_float.h b/third_party/glslang/SPIRV/hex_float.h index 8be8e9f7e36..785e8af11fe 100644 --- a/third_party/glslang/SPIRV/hex_float.h +++ b/third_party/glslang/SPIRV/hex_float.h @@ -23,19 +23,6 @@ #include #include -#if defined(_MSC_VER) && _MSC_VER < 1800 -namespace std { -bool isnan(double f) -{ - return ::_isnan(f) != 0; -} -bool isinf(double f) -{ - return ::_finite(f) == 0; -} -} -#endif - #include "bitutils.h" namespace spvutils { diff --git a/third_party/glslang/SPIRV/spirv.hpp b/third_party/glslang/SPIRV/spirv.hpp index 0e40544bda5..02c1eded733 100644 --- a/third_party/glslang/SPIRV/spirv.hpp +++ b/third_party/glslang/SPIRV/spirv.hpp @@ -1,2533 +1,2796 @@ -// Copyright (c) 2014-2020 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. -// -// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS -// STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND -// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ -// -// 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 automatically generated by the same tool that creates -// the Binary Section of the SPIR-V specification. - -// Enumeration tokens for SPIR-V, in various styles: -// C, C++, C++11, JSON, Lua, Python, C#, D -// -// - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL -// - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL -// - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL -// - Lua will use tables, e.g.: spv.SourceLanguage.GLSL -// - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL'] -// - C# will use enum classes in the Specification class located in the "Spv" namespace, -// e.g.: Spv.Specification.SourceLanguage.GLSL -// - D will have tokens under the "spv" module, e.g: spv.SourceLanguage.GLSL -// -// Some tokens act like mask values, which can be OR'd together, -// while others are mutually exclusive. The mask-like ones have -// "Mask" in their name, and a parallel enum that has the shift -// amount (1 << x) for each corresponding enumerant. - -#ifndef spirv_HPP -#define spirv_HPP - -namespace spv { - -typedef unsigned int Id; - -#define SPV_VERSION 0x10600 -#define SPV_REVISION 1 - -static const unsigned int MagicNumber = 0x07230203; -static const unsigned int Version = 0x00010600; -static const unsigned int Revision = 1; -static const unsigned int OpCodeMask = 0xffff; -static const unsigned int WordCountShift = 16; - -enum SourceLanguage { - SourceLanguageUnknown = 0, - SourceLanguageESSL = 1, - SourceLanguageGLSL = 2, - SourceLanguageOpenCL_C = 3, - SourceLanguageOpenCL_CPP = 4, - SourceLanguageHLSL = 5, - SourceLanguageCPP_for_OpenCL = 6, - SourceLanguageMax = 0x7fffffff, -}; - -enum ExecutionModel { - ExecutionModelVertex = 0, - ExecutionModelTessellationControl = 1, - ExecutionModelTessellationEvaluation = 2, - ExecutionModelGeometry = 3, - ExecutionModelFragment = 4, - ExecutionModelGLCompute = 5, - ExecutionModelKernel = 6, - ExecutionModelTaskNV = 5267, - ExecutionModelMeshNV = 5268, - ExecutionModelRayGenerationKHR = 5313, - ExecutionModelRayGenerationNV = 5313, - ExecutionModelIntersectionKHR = 5314, - ExecutionModelIntersectionNV = 5314, - ExecutionModelAnyHitKHR = 5315, - ExecutionModelAnyHitNV = 5315, - ExecutionModelClosestHitKHR = 5316, - ExecutionModelClosestHitNV = 5316, - ExecutionModelMissKHR = 5317, - ExecutionModelMissNV = 5317, - ExecutionModelCallableKHR = 5318, - ExecutionModelCallableNV = 5318, - ExecutionModelTaskEXT = 5364, - ExecutionModelMeshEXT = 5365, - ExecutionModelMax = 0x7fffffff, -}; - -enum AddressingModel { - AddressingModelLogical = 0, - AddressingModelPhysical32 = 1, - AddressingModelPhysical64 = 2, - AddressingModelPhysicalStorageBuffer64 = 5348, - AddressingModelPhysicalStorageBuffer64EXT = 5348, - AddressingModelMax = 0x7fffffff, -}; - -enum MemoryModel { - MemoryModelSimple = 0, - MemoryModelGLSL450 = 1, - MemoryModelOpenCL = 2, - MemoryModelVulkan = 3, - MemoryModelVulkanKHR = 3, - MemoryModelMax = 0x7fffffff, -}; - -enum ExecutionMode { - ExecutionModeInvocations = 0, - ExecutionModeSpacingEqual = 1, - ExecutionModeSpacingFractionalEven = 2, - ExecutionModeSpacingFractionalOdd = 3, - ExecutionModeVertexOrderCw = 4, - ExecutionModeVertexOrderCcw = 5, - ExecutionModePixelCenterInteger = 6, - ExecutionModeOriginUpperLeft = 7, - ExecutionModeOriginLowerLeft = 8, - ExecutionModeEarlyFragmentTests = 9, - ExecutionModePointMode = 10, - ExecutionModeXfb = 11, - ExecutionModeDepthReplacing = 12, - ExecutionModeDepthGreater = 14, - ExecutionModeDepthLess = 15, - ExecutionModeDepthUnchanged = 16, - ExecutionModeLocalSize = 17, - ExecutionModeLocalSizeHint = 18, - ExecutionModeInputPoints = 19, - ExecutionModeInputLines = 20, - ExecutionModeInputLinesAdjacency = 21, - ExecutionModeTriangles = 22, - ExecutionModeInputTrianglesAdjacency = 23, - ExecutionModeQuads = 24, - ExecutionModeIsolines = 25, - ExecutionModeOutputVertices = 26, - ExecutionModeOutputPoints = 27, - ExecutionModeOutputLineStrip = 28, - ExecutionModeOutputTriangleStrip = 29, - ExecutionModeVecTypeHint = 30, - ExecutionModeContractionOff = 31, - ExecutionModeInitializer = 33, - ExecutionModeFinalizer = 34, - ExecutionModeSubgroupSize = 35, - ExecutionModeSubgroupsPerWorkgroup = 36, - ExecutionModeSubgroupsPerWorkgroupId = 37, - ExecutionModeLocalSizeId = 38, - ExecutionModeLocalSizeHintId = 39, - ExecutionModeSubgroupUniformControlFlowKHR = 4421, - ExecutionModePostDepthCoverage = 4446, - ExecutionModeDenormPreserve = 4459, - ExecutionModeDenormFlushToZero = 4460, - ExecutionModeSignedZeroInfNanPreserve = 4461, - ExecutionModeRoundingModeRTE = 4462, - ExecutionModeRoundingModeRTZ = 4463, - ExecutionModeEarlyAndLateFragmentTestsAMD = 5017, - ExecutionModeStencilRefReplacingEXT = 5027, - ExecutionModeStencilRefUnchangedFrontAMD = 5079, - ExecutionModeStencilRefGreaterFrontAMD = 5080, - ExecutionModeStencilRefLessFrontAMD = 5081, - ExecutionModeStencilRefUnchangedBackAMD = 5082, - ExecutionModeStencilRefGreaterBackAMD = 5083, - ExecutionModeStencilRefLessBackAMD = 5084, - ExecutionModeOutputLinesEXT = 5269, - ExecutionModeOutputLinesNV = 5269, - ExecutionModeOutputPrimitivesEXT = 5270, - ExecutionModeOutputPrimitivesNV = 5270, - ExecutionModeDerivativeGroupQuadsNV = 5289, - ExecutionModeDerivativeGroupLinearNV = 5290, - ExecutionModeOutputTrianglesEXT = 5298, - ExecutionModeOutputTrianglesNV = 5298, - ExecutionModePixelInterlockOrderedEXT = 5366, - ExecutionModePixelInterlockUnorderedEXT = 5367, - ExecutionModeSampleInterlockOrderedEXT = 5368, - ExecutionModeSampleInterlockUnorderedEXT = 5369, - ExecutionModeShadingRateInterlockOrderedEXT = 5370, - ExecutionModeShadingRateInterlockUnorderedEXT = 5371, - ExecutionModeSharedLocalMemorySizeINTEL = 5618, - ExecutionModeRoundingModeRTPINTEL = 5620, - ExecutionModeRoundingModeRTNINTEL = 5621, - ExecutionModeFloatingPointModeALTINTEL = 5622, - ExecutionModeFloatingPointModeIEEEINTEL = 5623, - ExecutionModeMaxWorkgroupSizeINTEL = 5893, - ExecutionModeMaxWorkDimINTEL = 5894, - ExecutionModeNoGlobalOffsetINTEL = 5895, - ExecutionModeNumSIMDWorkitemsINTEL = 5896, - ExecutionModeSchedulerTargetFmaxMhzINTEL = 5903, - ExecutionModeMax = 0x7fffffff, -}; - -enum StorageClass { - StorageClassUniformConstant = 0, - StorageClassInput = 1, - StorageClassUniform = 2, - StorageClassOutput = 3, - StorageClassWorkgroup = 4, - StorageClassCrossWorkgroup = 5, - StorageClassPrivate = 6, - StorageClassFunction = 7, - StorageClassGeneric = 8, - StorageClassPushConstant = 9, - StorageClassAtomicCounter = 10, - StorageClassImage = 11, - StorageClassStorageBuffer = 12, - StorageClassCallableDataKHR = 5328, - StorageClassCallableDataNV = 5328, - StorageClassIncomingCallableDataKHR = 5329, - StorageClassIncomingCallableDataNV = 5329, - StorageClassRayPayloadKHR = 5338, - StorageClassRayPayloadNV = 5338, - StorageClassHitAttributeKHR = 5339, - StorageClassHitAttributeNV = 5339, - StorageClassIncomingRayPayloadKHR = 5342, - StorageClassIncomingRayPayloadNV = 5342, - StorageClassShaderRecordBufferKHR = 5343, - StorageClassShaderRecordBufferNV = 5343, - StorageClassPhysicalStorageBuffer = 5349, - StorageClassPhysicalStorageBufferEXT = 5349, - StorageClassTaskPayloadWorkgroupEXT = 5402, - StorageClassCodeSectionINTEL = 5605, - StorageClassDeviceOnlyINTEL = 5936, - StorageClassHostOnlyINTEL = 5937, - StorageClassMax = 0x7fffffff, -}; - -enum Dim { - Dim1D = 0, - Dim2D = 1, - Dim3D = 2, - DimCube = 3, - DimRect = 4, - DimBuffer = 5, - DimSubpassData = 6, - DimMax = 0x7fffffff, -}; - -enum SamplerAddressingMode { - SamplerAddressingModeNone = 0, - SamplerAddressingModeClampToEdge = 1, - SamplerAddressingModeClamp = 2, - SamplerAddressingModeRepeat = 3, - SamplerAddressingModeRepeatMirrored = 4, - SamplerAddressingModeMax = 0x7fffffff, -}; - -enum SamplerFilterMode { - SamplerFilterModeNearest = 0, - SamplerFilterModeLinear = 1, - SamplerFilterModeMax = 0x7fffffff, -}; - -enum ImageFormat { - ImageFormatUnknown = 0, - ImageFormatRgba32f = 1, - ImageFormatRgba16f = 2, - ImageFormatR32f = 3, - ImageFormatRgba8 = 4, - ImageFormatRgba8Snorm = 5, - ImageFormatRg32f = 6, - ImageFormatRg16f = 7, - ImageFormatR11fG11fB10f = 8, - ImageFormatR16f = 9, - ImageFormatRgba16 = 10, - ImageFormatRgb10A2 = 11, - ImageFormatRg16 = 12, - ImageFormatRg8 = 13, - ImageFormatR16 = 14, - ImageFormatR8 = 15, - ImageFormatRgba16Snorm = 16, - ImageFormatRg16Snorm = 17, - ImageFormatRg8Snorm = 18, - ImageFormatR16Snorm = 19, - ImageFormatR8Snorm = 20, - ImageFormatRgba32i = 21, - ImageFormatRgba16i = 22, - ImageFormatRgba8i = 23, - ImageFormatR32i = 24, - ImageFormatRg32i = 25, - ImageFormatRg16i = 26, - ImageFormatRg8i = 27, - ImageFormatR16i = 28, - ImageFormatR8i = 29, - ImageFormatRgba32ui = 30, - ImageFormatRgba16ui = 31, - ImageFormatRgba8ui = 32, - ImageFormatR32ui = 33, - ImageFormatRgb10a2ui = 34, - ImageFormatRg32ui = 35, - ImageFormatRg16ui = 36, - ImageFormatRg8ui = 37, - ImageFormatR16ui = 38, - ImageFormatR8ui = 39, - ImageFormatR64ui = 40, - ImageFormatR64i = 41, - ImageFormatMax = 0x7fffffff, -}; - -enum ImageChannelOrder { - ImageChannelOrderR = 0, - ImageChannelOrderA = 1, - ImageChannelOrderRG = 2, - ImageChannelOrderRA = 3, - ImageChannelOrderRGB = 4, - ImageChannelOrderRGBA = 5, - ImageChannelOrderBGRA = 6, - ImageChannelOrderARGB = 7, - ImageChannelOrderIntensity = 8, - ImageChannelOrderLuminance = 9, - ImageChannelOrderRx = 10, - ImageChannelOrderRGx = 11, - ImageChannelOrderRGBx = 12, - ImageChannelOrderDepth = 13, - ImageChannelOrderDepthStencil = 14, - ImageChannelOrdersRGB = 15, - ImageChannelOrdersRGBx = 16, - ImageChannelOrdersRGBA = 17, - ImageChannelOrdersBGRA = 18, - ImageChannelOrderABGR = 19, - ImageChannelOrderMax = 0x7fffffff, -}; - -enum ImageChannelDataType { - ImageChannelDataTypeSnormInt8 = 0, - ImageChannelDataTypeSnormInt16 = 1, - ImageChannelDataTypeUnormInt8 = 2, - ImageChannelDataTypeUnormInt16 = 3, - ImageChannelDataTypeUnormShort565 = 4, - ImageChannelDataTypeUnormShort555 = 5, - ImageChannelDataTypeUnormInt101010 = 6, - ImageChannelDataTypeSignedInt8 = 7, - ImageChannelDataTypeSignedInt16 = 8, - ImageChannelDataTypeSignedInt32 = 9, - ImageChannelDataTypeUnsignedInt8 = 10, - ImageChannelDataTypeUnsignedInt16 = 11, - ImageChannelDataTypeUnsignedInt32 = 12, - ImageChannelDataTypeHalfFloat = 13, - ImageChannelDataTypeFloat = 14, - ImageChannelDataTypeUnormInt24 = 15, - ImageChannelDataTypeUnormInt101010_2 = 16, - ImageChannelDataTypeMax = 0x7fffffff, -}; - -enum ImageOperandsShift { - ImageOperandsBiasShift = 0, - ImageOperandsLodShift = 1, - ImageOperandsGradShift = 2, - ImageOperandsConstOffsetShift = 3, - ImageOperandsOffsetShift = 4, - ImageOperandsConstOffsetsShift = 5, - ImageOperandsSampleShift = 6, - ImageOperandsMinLodShift = 7, - ImageOperandsMakeTexelAvailableShift = 8, - ImageOperandsMakeTexelAvailableKHRShift = 8, - ImageOperandsMakeTexelVisibleShift = 9, - ImageOperandsMakeTexelVisibleKHRShift = 9, - ImageOperandsNonPrivateTexelShift = 10, - ImageOperandsNonPrivateTexelKHRShift = 10, - ImageOperandsVolatileTexelShift = 11, - ImageOperandsVolatileTexelKHRShift = 11, - ImageOperandsSignExtendShift = 12, - ImageOperandsZeroExtendShift = 13, - ImageOperandsNontemporalShift = 14, - ImageOperandsOffsetsShift = 16, - ImageOperandsMax = 0x7fffffff, -}; - -enum ImageOperandsMask { - ImageOperandsMaskNone = 0, - ImageOperandsBiasMask = 0x00000001, - ImageOperandsLodMask = 0x00000002, - ImageOperandsGradMask = 0x00000004, - ImageOperandsConstOffsetMask = 0x00000008, - ImageOperandsOffsetMask = 0x00000010, - ImageOperandsConstOffsetsMask = 0x00000020, - ImageOperandsSampleMask = 0x00000040, - ImageOperandsMinLodMask = 0x00000080, - ImageOperandsMakeTexelAvailableMask = 0x00000100, - ImageOperandsMakeTexelAvailableKHRMask = 0x00000100, - ImageOperandsMakeTexelVisibleMask = 0x00000200, - ImageOperandsMakeTexelVisibleKHRMask = 0x00000200, - ImageOperandsNonPrivateTexelMask = 0x00000400, - ImageOperandsNonPrivateTexelKHRMask = 0x00000400, - ImageOperandsVolatileTexelMask = 0x00000800, - ImageOperandsVolatileTexelKHRMask = 0x00000800, - ImageOperandsSignExtendMask = 0x00001000, - ImageOperandsZeroExtendMask = 0x00002000, - ImageOperandsNontemporalMask = 0x00004000, - ImageOperandsOffsetsMask = 0x00010000, -}; - -enum FPFastMathModeShift { - FPFastMathModeNotNaNShift = 0, - FPFastMathModeNotInfShift = 1, - FPFastMathModeNSZShift = 2, - FPFastMathModeAllowRecipShift = 3, - FPFastMathModeFastShift = 4, - FPFastMathModeAllowContractFastINTELShift = 16, - FPFastMathModeAllowReassocINTELShift = 17, - FPFastMathModeMax = 0x7fffffff, -}; - -enum FPFastMathModeMask { - FPFastMathModeMaskNone = 0, - FPFastMathModeNotNaNMask = 0x00000001, - FPFastMathModeNotInfMask = 0x00000002, - FPFastMathModeNSZMask = 0x00000004, - FPFastMathModeAllowRecipMask = 0x00000008, - FPFastMathModeFastMask = 0x00000010, - FPFastMathModeAllowContractFastINTELMask = 0x00010000, - FPFastMathModeAllowReassocINTELMask = 0x00020000, -}; - -enum FPRoundingMode { - FPRoundingModeRTE = 0, - FPRoundingModeRTZ = 1, - FPRoundingModeRTP = 2, - FPRoundingModeRTN = 3, - FPRoundingModeMax = 0x7fffffff, -}; - -enum LinkageType { - LinkageTypeExport = 0, - LinkageTypeImport = 1, - LinkageTypeLinkOnceODR = 2, - LinkageTypeMax = 0x7fffffff, -}; - -enum AccessQualifier { - AccessQualifierReadOnly = 0, - AccessQualifierWriteOnly = 1, - AccessQualifierReadWrite = 2, - AccessQualifierMax = 0x7fffffff, -}; - -enum FunctionParameterAttribute { - FunctionParameterAttributeZext = 0, - FunctionParameterAttributeSext = 1, - FunctionParameterAttributeByVal = 2, - FunctionParameterAttributeSret = 3, - FunctionParameterAttributeNoAlias = 4, - FunctionParameterAttributeNoCapture = 5, - FunctionParameterAttributeNoWrite = 6, - FunctionParameterAttributeNoReadWrite = 7, - FunctionParameterAttributeMax = 0x7fffffff, -}; - -enum Decoration { - DecorationRelaxedPrecision = 0, - DecorationSpecId = 1, - DecorationBlock = 2, - DecorationBufferBlock = 3, - DecorationRowMajor = 4, - DecorationColMajor = 5, - DecorationArrayStride = 6, - DecorationMatrixStride = 7, - DecorationGLSLShared = 8, - DecorationGLSLPacked = 9, - DecorationCPacked = 10, - DecorationBuiltIn = 11, - DecorationNoPerspective = 13, - DecorationFlat = 14, - DecorationPatch = 15, - DecorationCentroid = 16, - DecorationSample = 17, - DecorationInvariant = 18, - DecorationRestrict = 19, - DecorationAliased = 20, - DecorationVolatile = 21, - DecorationConstant = 22, - DecorationCoherent = 23, - DecorationNonWritable = 24, - DecorationNonReadable = 25, - DecorationUniform = 26, - DecorationUniformId = 27, - DecorationSaturatedConversion = 28, - DecorationStream = 29, - DecorationLocation = 30, - DecorationComponent = 31, - DecorationIndex = 32, - DecorationBinding = 33, - DecorationDescriptorSet = 34, - DecorationOffset = 35, - DecorationXfbBuffer = 36, - DecorationXfbStride = 37, - DecorationFuncParamAttr = 38, - DecorationFPRoundingMode = 39, - DecorationFPFastMathMode = 40, - DecorationLinkageAttributes = 41, - DecorationNoContraction = 42, - DecorationInputAttachmentIndex = 43, - DecorationAlignment = 44, - DecorationMaxByteOffset = 45, - DecorationAlignmentId = 46, - DecorationMaxByteOffsetId = 47, - DecorationNoSignedWrap = 4469, - DecorationNoUnsignedWrap = 4470, - DecorationExplicitInterpAMD = 4999, - DecorationOverrideCoverageNV = 5248, - DecorationPassthroughNV = 5250, - DecorationViewportRelativeNV = 5252, - DecorationSecondaryViewportRelativeNV = 5256, - DecorationPerPrimitiveEXT = 5271, - DecorationPerPrimitiveNV = 5271, - DecorationPerViewNV = 5272, - DecorationPerTaskNV = 5273, - DecorationPerVertexKHR = 5285, - DecorationPerVertexNV = 5285, - DecorationNonUniform = 5300, - DecorationNonUniformEXT = 5300, - DecorationRestrictPointer = 5355, - DecorationRestrictPointerEXT = 5355, - DecorationAliasedPointer = 5356, - DecorationAliasedPointerEXT = 5356, - DecorationBindlessSamplerNV = 5398, - DecorationBindlessImageNV = 5399, - DecorationBoundSamplerNV = 5400, - DecorationBoundImageNV = 5401, - DecorationSIMTCallINTEL = 5599, - DecorationReferencedIndirectlyINTEL = 5602, - DecorationClobberINTEL = 5607, - DecorationSideEffectsINTEL = 5608, - DecorationVectorComputeVariableINTEL = 5624, - DecorationFuncParamIOKindINTEL = 5625, - DecorationVectorComputeFunctionINTEL = 5626, - DecorationStackCallINTEL = 5627, - DecorationGlobalVariableOffsetINTEL = 5628, - DecorationCounterBuffer = 5634, - DecorationHlslCounterBufferGOOGLE = 5634, - DecorationHlslSemanticGOOGLE = 5635, - DecorationUserSemantic = 5635, - DecorationUserTypeGOOGLE = 5636, - DecorationFunctionRoundingModeINTEL = 5822, - DecorationFunctionDenormModeINTEL = 5823, - DecorationRegisterINTEL = 5825, - DecorationMemoryINTEL = 5826, - DecorationNumbanksINTEL = 5827, - DecorationBankwidthINTEL = 5828, - DecorationMaxPrivateCopiesINTEL = 5829, - DecorationSinglepumpINTEL = 5830, - DecorationDoublepumpINTEL = 5831, - DecorationMaxReplicatesINTEL = 5832, - DecorationSimpleDualPortINTEL = 5833, - DecorationMergeINTEL = 5834, - DecorationBankBitsINTEL = 5835, - DecorationForcePow2DepthINTEL = 5836, - DecorationBurstCoalesceINTEL = 5899, - DecorationCacheSizeINTEL = 5900, - DecorationDontStaticallyCoalesceINTEL = 5901, - DecorationPrefetchINTEL = 5902, - DecorationStallEnableINTEL = 5905, - DecorationFuseLoopsInFunctionINTEL = 5907, - DecorationBufferLocationINTEL = 5921, - DecorationIOPipeStorageINTEL = 5944, - DecorationFunctionFloatingPointModeINTEL = 6080, - DecorationSingleElementVectorINTEL = 6085, - DecorationVectorComputeCallableFunctionINTEL = 6087, - DecorationMediaBlockIOINTEL = 6140, - DecorationMax = 0x7fffffff, -}; - -enum BuiltIn { - BuiltInPosition = 0, - BuiltInPointSize = 1, - BuiltInClipDistance = 3, - BuiltInCullDistance = 4, - BuiltInVertexId = 5, - BuiltInInstanceId = 6, - BuiltInPrimitiveId = 7, - BuiltInInvocationId = 8, - BuiltInLayer = 9, - BuiltInViewportIndex = 10, - BuiltInTessLevelOuter = 11, - BuiltInTessLevelInner = 12, - BuiltInTessCoord = 13, - BuiltInPatchVertices = 14, - BuiltInFragCoord = 15, - BuiltInPointCoord = 16, - BuiltInFrontFacing = 17, - BuiltInSampleId = 18, - BuiltInSamplePosition = 19, - BuiltInSampleMask = 20, - BuiltInFragDepth = 22, - BuiltInHelperInvocation = 23, - BuiltInNumWorkgroups = 24, - BuiltInWorkgroupSize = 25, - BuiltInWorkgroupId = 26, - BuiltInLocalInvocationId = 27, - BuiltInGlobalInvocationId = 28, - BuiltInLocalInvocationIndex = 29, - BuiltInWorkDim = 30, - BuiltInGlobalSize = 31, - BuiltInEnqueuedWorkgroupSize = 32, - BuiltInGlobalOffset = 33, - BuiltInGlobalLinearId = 34, - BuiltInSubgroupSize = 36, - BuiltInSubgroupMaxSize = 37, - BuiltInNumSubgroups = 38, - BuiltInNumEnqueuedSubgroups = 39, - BuiltInSubgroupId = 40, - BuiltInSubgroupLocalInvocationId = 41, - BuiltInVertexIndex = 42, - BuiltInInstanceIndex = 43, - BuiltInSubgroupEqMask = 4416, - BuiltInSubgroupEqMaskKHR = 4416, - BuiltInSubgroupGeMask = 4417, - BuiltInSubgroupGeMaskKHR = 4417, - BuiltInSubgroupGtMask = 4418, - BuiltInSubgroupGtMaskKHR = 4418, - BuiltInSubgroupLeMask = 4419, - BuiltInSubgroupLeMaskKHR = 4419, - BuiltInSubgroupLtMask = 4420, - BuiltInSubgroupLtMaskKHR = 4420, - BuiltInBaseVertex = 4424, - BuiltInBaseInstance = 4425, - BuiltInDrawIndex = 4426, - BuiltInPrimitiveShadingRateKHR = 4432, - BuiltInDeviceIndex = 4438, - BuiltInViewIndex = 4440, - BuiltInShadingRateKHR = 4444, - BuiltInBaryCoordNoPerspAMD = 4992, - BuiltInBaryCoordNoPerspCentroidAMD = 4993, - BuiltInBaryCoordNoPerspSampleAMD = 4994, - BuiltInBaryCoordSmoothAMD = 4995, - BuiltInBaryCoordSmoothCentroidAMD = 4996, - BuiltInBaryCoordSmoothSampleAMD = 4997, - BuiltInBaryCoordPullModelAMD = 4998, - BuiltInFragStencilRefEXT = 5014, - BuiltInViewportMaskNV = 5253, - BuiltInSecondaryPositionNV = 5257, - BuiltInSecondaryViewportMaskNV = 5258, - BuiltInPositionPerViewNV = 5261, - BuiltInViewportMaskPerViewNV = 5262, - BuiltInFullyCoveredEXT = 5264, - BuiltInTaskCountNV = 5274, - BuiltInPrimitiveCountNV = 5275, - BuiltInPrimitiveIndicesNV = 5276, - BuiltInClipDistancePerViewNV = 5277, - BuiltInCullDistancePerViewNV = 5278, - BuiltInLayerPerViewNV = 5279, - BuiltInMeshViewCountNV = 5280, - BuiltInMeshViewIndicesNV = 5281, - BuiltInBaryCoordKHR = 5286, - BuiltInBaryCoordNV = 5286, - BuiltInBaryCoordNoPerspKHR = 5287, - BuiltInBaryCoordNoPerspNV = 5287, - BuiltInFragSizeEXT = 5292, - BuiltInFragmentSizeNV = 5292, - BuiltInFragInvocationCountEXT = 5293, - BuiltInInvocationsPerPixelNV = 5293, - BuiltInPrimitivePointIndicesEXT = 5294, - BuiltInPrimitiveLineIndicesEXT = 5295, - BuiltInPrimitiveTriangleIndicesEXT = 5296, - BuiltInCullPrimitiveEXT = 5299, - BuiltInLaunchIdKHR = 5319, - BuiltInLaunchIdNV = 5319, - BuiltInLaunchSizeKHR = 5320, - BuiltInLaunchSizeNV = 5320, - BuiltInWorldRayOriginKHR = 5321, - BuiltInWorldRayOriginNV = 5321, - BuiltInWorldRayDirectionKHR = 5322, - BuiltInWorldRayDirectionNV = 5322, - BuiltInObjectRayOriginKHR = 5323, - BuiltInObjectRayOriginNV = 5323, - BuiltInObjectRayDirectionKHR = 5324, - BuiltInObjectRayDirectionNV = 5324, - BuiltInRayTminKHR = 5325, - BuiltInRayTminNV = 5325, - BuiltInRayTmaxKHR = 5326, - BuiltInRayTmaxNV = 5326, - BuiltInInstanceCustomIndexKHR = 5327, - BuiltInInstanceCustomIndexNV = 5327, - BuiltInObjectToWorldKHR = 5330, - BuiltInObjectToWorldNV = 5330, - BuiltInWorldToObjectKHR = 5331, - BuiltInWorldToObjectNV = 5331, - BuiltInHitTNV = 5332, - BuiltInHitKindKHR = 5333, - BuiltInHitKindNV = 5333, - BuiltInCurrentRayTimeNV = 5334, - BuiltInIncomingRayFlagsKHR = 5351, - BuiltInIncomingRayFlagsNV = 5351, - BuiltInRayGeometryIndexKHR = 5352, - BuiltInWarpsPerSMNV = 5374, - BuiltInSMCountNV = 5375, - BuiltInWarpIDNV = 5376, - BuiltInSMIDNV = 5377, - BuiltInCullMaskKHR = 6021, - BuiltInMax = 0x7fffffff, -}; - -enum SelectionControlShift { - SelectionControlFlattenShift = 0, - SelectionControlDontFlattenShift = 1, - SelectionControlMax = 0x7fffffff, -}; - -enum SelectionControlMask { - SelectionControlMaskNone = 0, - SelectionControlFlattenMask = 0x00000001, - SelectionControlDontFlattenMask = 0x00000002, -}; - -enum LoopControlShift { - LoopControlUnrollShift = 0, - LoopControlDontUnrollShift = 1, - LoopControlDependencyInfiniteShift = 2, - LoopControlDependencyLengthShift = 3, - LoopControlMinIterationsShift = 4, - LoopControlMaxIterationsShift = 5, - LoopControlIterationMultipleShift = 6, - LoopControlPeelCountShift = 7, - LoopControlPartialCountShift = 8, - LoopControlInitiationIntervalINTELShift = 16, - LoopControlMaxConcurrencyINTELShift = 17, - LoopControlDependencyArrayINTELShift = 18, - LoopControlPipelineEnableINTELShift = 19, - LoopControlLoopCoalesceINTELShift = 20, - LoopControlMaxInterleavingINTELShift = 21, - LoopControlSpeculatedIterationsINTELShift = 22, - LoopControlNoFusionINTELShift = 23, - LoopControlMax = 0x7fffffff, -}; - -enum LoopControlMask { - LoopControlMaskNone = 0, - LoopControlUnrollMask = 0x00000001, - LoopControlDontUnrollMask = 0x00000002, - LoopControlDependencyInfiniteMask = 0x00000004, - LoopControlDependencyLengthMask = 0x00000008, - LoopControlMinIterationsMask = 0x00000010, - LoopControlMaxIterationsMask = 0x00000020, - LoopControlIterationMultipleMask = 0x00000040, - LoopControlPeelCountMask = 0x00000080, - LoopControlPartialCountMask = 0x00000100, - LoopControlInitiationIntervalINTELMask = 0x00010000, - LoopControlMaxConcurrencyINTELMask = 0x00020000, - LoopControlDependencyArrayINTELMask = 0x00040000, - LoopControlPipelineEnableINTELMask = 0x00080000, - LoopControlLoopCoalesceINTELMask = 0x00100000, - LoopControlMaxInterleavingINTELMask = 0x00200000, - LoopControlSpeculatedIterationsINTELMask = 0x00400000, - LoopControlNoFusionINTELMask = 0x00800000, -}; - -enum FunctionControlShift { - FunctionControlInlineShift = 0, - FunctionControlDontInlineShift = 1, - FunctionControlPureShift = 2, - FunctionControlConstShift = 3, - FunctionControlOptNoneINTELShift = 16, - FunctionControlMax = 0x7fffffff, -}; - -enum FunctionControlMask { - FunctionControlMaskNone = 0, - FunctionControlInlineMask = 0x00000001, - FunctionControlDontInlineMask = 0x00000002, - FunctionControlPureMask = 0x00000004, - FunctionControlConstMask = 0x00000008, - FunctionControlOptNoneINTELMask = 0x00010000, -}; - -enum MemorySemanticsShift { - MemorySemanticsAcquireShift = 1, - MemorySemanticsReleaseShift = 2, - MemorySemanticsAcquireReleaseShift = 3, - MemorySemanticsSequentiallyConsistentShift = 4, - MemorySemanticsUniformMemoryShift = 6, - MemorySemanticsSubgroupMemoryShift = 7, - MemorySemanticsWorkgroupMemoryShift = 8, - MemorySemanticsCrossWorkgroupMemoryShift = 9, - MemorySemanticsAtomicCounterMemoryShift = 10, - MemorySemanticsImageMemoryShift = 11, - MemorySemanticsOutputMemoryShift = 12, - MemorySemanticsOutputMemoryKHRShift = 12, - MemorySemanticsMakeAvailableShift = 13, - MemorySemanticsMakeAvailableKHRShift = 13, - MemorySemanticsMakeVisibleShift = 14, - MemorySemanticsMakeVisibleKHRShift = 14, - MemorySemanticsVolatileShift = 15, - MemorySemanticsMax = 0x7fffffff, -}; - -enum MemorySemanticsMask { - MemorySemanticsMaskNone = 0, - MemorySemanticsAcquireMask = 0x00000002, - MemorySemanticsReleaseMask = 0x00000004, - MemorySemanticsAcquireReleaseMask = 0x00000008, - MemorySemanticsSequentiallyConsistentMask = 0x00000010, - MemorySemanticsUniformMemoryMask = 0x00000040, - MemorySemanticsSubgroupMemoryMask = 0x00000080, - MemorySemanticsWorkgroupMemoryMask = 0x00000100, - MemorySemanticsCrossWorkgroupMemoryMask = 0x00000200, - MemorySemanticsAtomicCounterMemoryMask = 0x00000400, - MemorySemanticsImageMemoryMask = 0x00000800, - MemorySemanticsOutputMemoryMask = 0x00001000, - MemorySemanticsOutputMemoryKHRMask = 0x00001000, - MemorySemanticsMakeAvailableMask = 0x00002000, - MemorySemanticsMakeAvailableKHRMask = 0x00002000, - MemorySemanticsMakeVisibleMask = 0x00004000, - MemorySemanticsMakeVisibleKHRMask = 0x00004000, - MemorySemanticsVolatileMask = 0x00008000, -}; - -enum MemoryAccessShift { - MemoryAccessVolatileShift = 0, - MemoryAccessAlignedShift = 1, - MemoryAccessNontemporalShift = 2, - MemoryAccessMakePointerAvailableShift = 3, - MemoryAccessMakePointerAvailableKHRShift = 3, - MemoryAccessMakePointerVisibleShift = 4, - MemoryAccessMakePointerVisibleKHRShift = 4, - MemoryAccessNonPrivatePointerShift = 5, - MemoryAccessNonPrivatePointerKHRShift = 5, - MemoryAccessMax = 0x7fffffff, -}; - -enum MemoryAccessMask { - MemoryAccessMaskNone = 0, - MemoryAccessVolatileMask = 0x00000001, - MemoryAccessAlignedMask = 0x00000002, - MemoryAccessNontemporalMask = 0x00000004, - MemoryAccessMakePointerAvailableMask = 0x00000008, - MemoryAccessMakePointerAvailableKHRMask = 0x00000008, - MemoryAccessMakePointerVisibleMask = 0x00000010, - MemoryAccessMakePointerVisibleKHRMask = 0x00000010, - MemoryAccessNonPrivatePointerMask = 0x00000020, - MemoryAccessNonPrivatePointerKHRMask = 0x00000020, -}; - -enum Scope { - ScopeCrossDevice = 0, - ScopeDevice = 1, - ScopeWorkgroup = 2, - ScopeSubgroup = 3, - ScopeInvocation = 4, - ScopeQueueFamily = 5, - ScopeQueueFamilyKHR = 5, - ScopeShaderCallKHR = 6, - ScopeMax = 0x7fffffff, -}; - -enum GroupOperation { - GroupOperationReduce = 0, - GroupOperationInclusiveScan = 1, - GroupOperationExclusiveScan = 2, - GroupOperationClusteredReduce = 3, - GroupOperationPartitionedReduceNV = 6, - GroupOperationPartitionedInclusiveScanNV = 7, - GroupOperationPartitionedExclusiveScanNV = 8, - GroupOperationMax = 0x7fffffff, -}; - -enum KernelEnqueueFlags { - KernelEnqueueFlagsNoWait = 0, - KernelEnqueueFlagsWaitKernel = 1, - KernelEnqueueFlagsWaitWorkGroup = 2, - KernelEnqueueFlagsMax = 0x7fffffff, -}; - -enum KernelProfilingInfoShift { - KernelProfilingInfoCmdExecTimeShift = 0, - KernelProfilingInfoMax = 0x7fffffff, -}; - -enum KernelProfilingInfoMask { - KernelProfilingInfoMaskNone = 0, - KernelProfilingInfoCmdExecTimeMask = 0x00000001, -}; - -enum Capability { - CapabilityMatrix = 0, - CapabilityShader = 1, - CapabilityGeometry = 2, - CapabilityTessellation = 3, - CapabilityAddresses = 4, - CapabilityLinkage = 5, - CapabilityKernel = 6, - CapabilityVector16 = 7, - CapabilityFloat16Buffer = 8, - CapabilityFloat16 = 9, - CapabilityFloat64 = 10, - CapabilityInt64 = 11, - CapabilityInt64Atomics = 12, - CapabilityImageBasic = 13, - CapabilityImageReadWrite = 14, - CapabilityImageMipmap = 15, - CapabilityPipes = 17, - CapabilityGroups = 18, - CapabilityDeviceEnqueue = 19, - CapabilityLiteralSampler = 20, - CapabilityAtomicStorage = 21, - CapabilityInt16 = 22, - CapabilityTessellationPointSize = 23, - CapabilityGeometryPointSize = 24, - CapabilityImageGatherExtended = 25, - CapabilityStorageImageMultisample = 27, - CapabilityUniformBufferArrayDynamicIndexing = 28, - CapabilitySampledImageArrayDynamicIndexing = 29, - CapabilityStorageBufferArrayDynamicIndexing = 30, - CapabilityStorageImageArrayDynamicIndexing = 31, - CapabilityClipDistance = 32, - CapabilityCullDistance = 33, - CapabilityImageCubeArray = 34, - CapabilitySampleRateShading = 35, - CapabilityImageRect = 36, - CapabilitySampledRect = 37, - CapabilityGenericPointer = 38, - CapabilityInt8 = 39, - CapabilityInputAttachment = 40, - CapabilitySparseResidency = 41, - CapabilityMinLod = 42, - CapabilitySampled1D = 43, - CapabilityImage1D = 44, - CapabilitySampledCubeArray = 45, - CapabilitySampledBuffer = 46, - CapabilityImageBuffer = 47, - CapabilityImageMSArray = 48, - CapabilityStorageImageExtendedFormats = 49, - CapabilityImageQuery = 50, - CapabilityDerivativeControl = 51, - CapabilityInterpolationFunction = 52, - CapabilityTransformFeedback = 53, - CapabilityGeometryStreams = 54, - CapabilityStorageImageReadWithoutFormat = 55, - CapabilityStorageImageWriteWithoutFormat = 56, - CapabilityMultiViewport = 57, - CapabilitySubgroupDispatch = 58, - CapabilityNamedBarrier = 59, - CapabilityPipeStorage = 60, - CapabilityGroupNonUniform = 61, - CapabilityGroupNonUniformVote = 62, - CapabilityGroupNonUniformArithmetic = 63, - CapabilityGroupNonUniformBallot = 64, - CapabilityGroupNonUniformShuffle = 65, - CapabilityGroupNonUniformShuffleRelative = 66, - CapabilityGroupNonUniformClustered = 67, - CapabilityGroupNonUniformQuad = 68, - CapabilityShaderLayer = 69, - CapabilityShaderViewportIndex = 70, - CapabilityUniformDecoration = 71, - CapabilityFragmentShadingRateKHR = 4422, - CapabilitySubgroupBallotKHR = 4423, - CapabilityDrawParameters = 4427, - CapabilityWorkgroupMemoryExplicitLayoutKHR = 4428, - CapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR = 4429, - CapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR = 4430, - CapabilitySubgroupVoteKHR = 4431, - CapabilityStorageBuffer16BitAccess = 4433, - CapabilityStorageUniformBufferBlock16 = 4433, - CapabilityStorageUniform16 = 4434, - CapabilityUniformAndStorageBuffer16BitAccess = 4434, - CapabilityStoragePushConstant16 = 4435, - CapabilityStorageInputOutput16 = 4436, - CapabilityDeviceGroup = 4437, - CapabilityMultiView = 4439, - CapabilityVariablePointersStorageBuffer = 4441, - CapabilityVariablePointers = 4442, - CapabilityAtomicStorageOps = 4445, - CapabilitySampleMaskPostDepthCoverage = 4447, - CapabilityStorageBuffer8BitAccess = 4448, - CapabilityUniformAndStorageBuffer8BitAccess = 4449, - CapabilityStoragePushConstant8 = 4450, - CapabilityDenormPreserve = 4464, - CapabilityDenormFlushToZero = 4465, - CapabilitySignedZeroInfNanPreserve = 4466, - CapabilityRoundingModeRTE = 4467, - CapabilityRoundingModeRTZ = 4468, - CapabilityRayQueryProvisionalKHR = 4471, - CapabilityRayQueryKHR = 4472, - CapabilityRayTraversalPrimitiveCullingKHR = 4478, - CapabilityRayTracingKHR = 4479, - CapabilityFloat16ImageAMD = 5008, - CapabilityImageGatherBiasLodAMD = 5009, - CapabilityFragmentMaskAMD = 5010, - CapabilityStencilExportEXT = 5013, - CapabilityImageReadWriteLodAMD = 5015, - CapabilityInt64ImageEXT = 5016, - CapabilityShaderClockKHR = 5055, - CapabilitySampleMaskOverrideCoverageNV = 5249, - CapabilityGeometryShaderPassthroughNV = 5251, - CapabilityShaderViewportIndexLayerEXT = 5254, - CapabilityShaderViewportIndexLayerNV = 5254, - CapabilityShaderViewportMaskNV = 5255, - CapabilityShaderStereoViewNV = 5259, - CapabilityPerViewAttributesNV = 5260, - CapabilityFragmentFullyCoveredEXT = 5265, - CapabilityMeshShadingNV = 5266, - CapabilityImageFootprintNV = 5282, - CapabilityMeshShadingEXT = 5283, - CapabilityFragmentBarycentricKHR = 5284, - CapabilityFragmentBarycentricNV = 5284, - CapabilityComputeDerivativeGroupQuadsNV = 5288, - CapabilityFragmentDensityEXT = 5291, - CapabilityShadingRateNV = 5291, - CapabilityGroupNonUniformPartitionedNV = 5297, - CapabilityShaderNonUniform = 5301, - CapabilityShaderNonUniformEXT = 5301, - CapabilityRuntimeDescriptorArray = 5302, - CapabilityRuntimeDescriptorArrayEXT = 5302, - CapabilityInputAttachmentArrayDynamicIndexing = 5303, - CapabilityInputAttachmentArrayDynamicIndexingEXT = 5303, - CapabilityUniformTexelBufferArrayDynamicIndexing = 5304, - CapabilityUniformTexelBufferArrayDynamicIndexingEXT = 5304, - CapabilityStorageTexelBufferArrayDynamicIndexing = 5305, - CapabilityStorageTexelBufferArrayDynamicIndexingEXT = 5305, - CapabilityUniformBufferArrayNonUniformIndexing = 5306, - CapabilityUniformBufferArrayNonUniformIndexingEXT = 5306, - CapabilitySampledImageArrayNonUniformIndexing = 5307, - CapabilitySampledImageArrayNonUniformIndexingEXT = 5307, - CapabilityStorageBufferArrayNonUniformIndexing = 5308, - CapabilityStorageBufferArrayNonUniformIndexingEXT = 5308, - CapabilityStorageImageArrayNonUniformIndexing = 5309, - CapabilityStorageImageArrayNonUniformIndexingEXT = 5309, - CapabilityInputAttachmentArrayNonUniformIndexing = 5310, - CapabilityInputAttachmentArrayNonUniformIndexingEXT = 5310, - CapabilityUniformTexelBufferArrayNonUniformIndexing = 5311, - CapabilityUniformTexelBufferArrayNonUniformIndexingEXT = 5311, - CapabilityStorageTexelBufferArrayNonUniformIndexing = 5312, - CapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312, - CapabilityRayTracingNV = 5340, - CapabilityRayTracingMotionBlurNV = 5341, - CapabilityVulkanMemoryModel = 5345, - CapabilityVulkanMemoryModelKHR = 5345, - CapabilityVulkanMemoryModelDeviceScope = 5346, - CapabilityVulkanMemoryModelDeviceScopeKHR = 5346, - CapabilityPhysicalStorageBufferAddresses = 5347, - CapabilityPhysicalStorageBufferAddressesEXT = 5347, - CapabilityComputeDerivativeGroupLinearNV = 5350, - CapabilityRayTracingProvisionalKHR = 5353, - CapabilityCooperativeMatrixNV = 5357, - CapabilityFragmentShaderSampleInterlockEXT = 5363, - CapabilityFragmentShaderShadingRateInterlockEXT = 5372, - CapabilityShaderSMBuiltinsNV = 5373, - CapabilityFragmentShaderPixelInterlockEXT = 5378, - CapabilityDemoteToHelperInvocation = 5379, - CapabilityDemoteToHelperInvocationEXT = 5379, - CapabilityBindlessTextureNV = 5390, - CapabilitySubgroupShuffleINTEL = 5568, - CapabilitySubgroupBufferBlockIOINTEL = 5569, - CapabilitySubgroupImageBlockIOINTEL = 5570, - CapabilitySubgroupImageMediaBlockIOINTEL = 5579, - CapabilityRoundToInfinityINTEL = 5582, - CapabilityFloatingPointModeINTEL = 5583, - CapabilityIntegerFunctions2INTEL = 5584, - CapabilityFunctionPointersINTEL = 5603, - CapabilityIndirectReferencesINTEL = 5604, - CapabilityAsmINTEL = 5606, - CapabilityAtomicFloat32MinMaxEXT = 5612, - CapabilityAtomicFloat64MinMaxEXT = 5613, - CapabilityAtomicFloat16MinMaxEXT = 5616, - CapabilityVectorComputeINTEL = 5617, - CapabilityVectorAnyINTEL = 5619, - CapabilityExpectAssumeKHR = 5629, - CapabilitySubgroupAvcMotionEstimationINTEL = 5696, - CapabilitySubgroupAvcMotionEstimationIntraINTEL = 5697, - CapabilitySubgroupAvcMotionEstimationChromaINTEL = 5698, - CapabilityVariableLengthArrayINTEL = 5817, - CapabilityFunctionFloatControlINTEL = 5821, - CapabilityFPGAMemoryAttributesINTEL = 5824, - CapabilityFPFastMathModeINTEL = 5837, - CapabilityArbitraryPrecisionIntegersINTEL = 5844, - CapabilityArbitraryPrecisionFloatingPointINTEL = 5845, - CapabilityUnstructuredLoopControlsINTEL = 5886, - CapabilityFPGALoopControlsINTEL = 5888, - CapabilityKernelAttributesINTEL = 5892, - CapabilityFPGAKernelAttributesINTEL = 5897, - CapabilityFPGAMemoryAccessesINTEL = 5898, - CapabilityFPGAClusterAttributesINTEL = 5904, - CapabilityLoopFuseINTEL = 5906, - CapabilityFPGABufferLocationINTEL = 5920, - CapabilityArbitraryPrecisionFixedPointINTEL = 5922, - CapabilityUSMStorageClassesINTEL = 5935, - CapabilityIOPipesINTEL = 5943, - CapabilityBlockingPipesINTEL = 5945, - CapabilityFPGARegINTEL = 5948, - CapabilityDotProductInputAll = 6016, - CapabilityDotProductInputAllKHR = 6016, - CapabilityDotProductInput4x8Bit = 6017, - CapabilityDotProductInput4x8BitKHR = 6017, - CapabilityDotProductInput4x8BitPacked = 6018, - CapabilityDotProductInput4x8BitPackedKHR = 6018, - CapabilityDotProduct = 6019, - CapabilityDotProductKHR = 6019, - CapabilityRayCullMaskKHR = 6020, - CapabilityBitInstructions = 6025, - CapabilityAtomicFloat32AddEXT = 6033, - CapabilityAtomicFloat64AddEXT = 6034, - CapabilityLongConstantCompositeINTEL = 6089, - CapabilityOptNoneINTEL = 6094, - CapabilityAtomicFloat16AddEXT = 6095, - CapabilityDebugInfoModuleINTEL = 6114, - CapabilityMax = 0x7fffffff, -}; - -enum RayFlagsShift { - RayFlagsOpaqueKHRShift = 0, - RayFlagsNoOpaqueKHRShift = 1, - RayFlagsTerminateOnFirstHitKHRShift = 2, - RayFlagsSkipClosestHitShaderKHRShift = 3, - RayFlagsCullBackFacingTrianglesKHRShift = 4, - RayFlagsCullFrontFacingTrianglesKHRShift = 5, - RayFlagsCullOpaqueKHRShift = 6, - RayFlagsCullNoOpaqueKHRShift = 7, - RayFlagsSkipTrianglesKHRShift = 8, - RayFlagsSkipAABBsKHRShift = 9, - RayFlagsMax = 0x7fffffff, -}; - -enum RayFlagsMask { - RayFlagsMaskNone = 0, - RayFlagsOpaqueKHRMask = 0x00000001, - RayFlagsNoOpaqueKHRMask = 0x00000002, - RayFlagsTerminateOnFirstHitKHRMask = 0x00000004, - RayFlagsSkipClosestHitShaderKHRMask = 0x00000008, - RayFlagsCullBackFacingTrianglesKHRMask = 0x00000010, - RayFlagsCullFrontFacingTrianglesKHRMask = 0x00000020, - RayFlagsCullOpaqueKHRMask = 0x00000040, - RayFlagsCullNoOpaqueKHRMask = 0x00000080, - RayFlagsSkipTrianglesKHRMask = 0x00000100, - RayFlagsSkipAABBsKHRMask = 0x00000200, -}; - -enum RayQueryIntersection { - RayQueryIntersectionRayQueryCandidateIntersectionKHR = 0, - RayQueryIntersectionRayQueryCommittedIntersectionKHR = 1, - RayQueryIntersectionMax = 0x7fffffff, -}; - -enum RayQueryCommittedIntersectionType { - RayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionNoneKHR = 0, - RayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionTriangleKHR = 1, - RayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionGeneratedKHR = 2, - RayQueryCommittedIntersectionTypeMax = 0x7fffffff, -}; - -enum RayQueryCandidateIntersectionType { - RayQueryCandidateIntersectionTypeRayQueryCandidateIntersectionTriangleKHR = 0, - RayQueryCandidateIntersectionTypeRayQueryCandidateIntersectionAABBKHR = 1, - RayQueryCandidateIntersectionTypeMax = 0x7fffffff, -}; - -enum FragmentShadingRateShift { - FragmentShadingRateVertical2PixelsShift = 0, - FragmentShadingRateVertical4PixelsShift = 1, - FragmentShadingRateHorizontal2PixelsShift = 2, - FragmentShadingRateHorizontal4PixelsShift = 3, - FragmentShadingRateMax = 0x7fffffff, -}; - -enum FragmentShadingRateMask { - FragmentShadingRateMaskNone = 0, - FragmentShadingRateVertical2PixelsMask = 0x00000001, - FragmentShadingRateVertical4PixelsMask = 0x00000002, - FragmentShadingRateHorizontal2PixelsMask = 0x00000004, - FragmentShadingRateHorizontal4PixelsMask = 0x00000008, -}; - -enum FPDenormMode { - FPDenormModePreserve = 0, - FPDenormModeFlushToZero = 1, - FPDenormModeMax = 0x7fffffff, -}; - -enum FPOperationMode { - FPOperationModeIEEE = 0, - FPOperationModeALT = 1, - FPOperationModeMax = 0x7fffffff, -}; - -enum QuantizationModes { - QuantizationModesTRN = 0, - QuantizationModesTRN_ZERO = 1, - QuantizationModesRND = 2, - QuantizationModesRND_ZERO = 3, - QuantizationModesRND_INF = 4, - QuantizationModesRND_MIN_INF = 5, - QuantizationModesRND_CONV = 6, - QuantizationModesRND_CONV_ODD = 7, - QuantizationModesMax = 0x7fffffff, -}; - -enum OverflowModes { - OverflowModesWRAP = 0, - OverflowModesSAT = 1, - OverflowModesSAT_ZERO = 2, - OverflowModesSAT_SYM = 3, - OverflowModesMax = 0x7fffffff, -}; - -enum PackedVectorFormat { - PackedVectorFormatPackedVectorFormat4x8Bit = 0, - PackedVectorFormatPackedVectorFormat4x8BitKHR = 0, - PackedVectorFormatMax = 0x7fffffff, -}; - -enum Op { - OpNop = 0, - OpUndef = 1, - OpSourceContinued = 2, - OpSource = 3, - OpSourceExtension = 4, - OpName = 5, - OpMemberName = 6, - OpString = 7, - OpLine = 8, - OpExtension = 10, - OpExtInstImport = 11, - OpExtInst = 12, - OpMemoryModel = 14, - OpEntryPoint = 15, - OpExecutionMode = 16, - OpCapability = 17, - OpTypeVoid = 19, - OpTypeBool = 20, - OpTypeInt = 21, - OpTypeFloat = 22, - OpTypeVector = 23, - OpTypeMatrix = 24, - OpTypeImage = 25, - OpTypeSampler = 26, - OpTypeSampledImage = 27, - OpTypeArray = 28, - OpTypeRuntimeArray = 29, - OpTypeStruct = 30, - OpTypeOpaque = 31, - OpTypePointer = 32, - OpTypeFunction = 33, - OpTypeEvent = 34, - OpTypeDeviceEvent = 35, - OpTypeReserveId = 36, - OpTypeQueue = 37, - OpTypePipe = 38, - OpTypeForwardPointer = 39, - OpConstantTrue = 41, - OpConstantFalse = 42, - OpConstant = 43, - OpConstantComposite = 44, - OpConstantSampler = 45, - OpConstantNull = 46, - OpSpecConstantTrue = 48, - OpSpecConstantFalse = 49, - OpSpecConstant = 50, - OpSpecConstantComposite = 51, - OpSpecConstantOp = 52, - OpFunction = 54, - OpFunctionParameter = 55, - OpFunctionEnd = 56, - OpFunctionCall = 57, - OpVariable = 59, - OpImageTexelPointer = 60, - OpLoad = 61, - OpStore = 62, - OpCopyMemory = 63, - OpCopyMemorySized = 64, - OpAccessChain = 65, - OpInBoundsAccessChain = 66, - OpPtrAccessChain = 67, - OpArrayLength = 68, - OpGenericPtrMemSemantics = 69, - OpInBoundsPtrAccessChain = 70, - OpDecorate = 71, - OpMemberDecorate = 72, - OpDecorationGroup = 73, - OpGroupDecorate = 74, - OpGroupMemberDecorate = 75, - OpVectorExtractDynamic = 77, - OpVectorInsertDynamic = 78, - OpVectorShuffle = 79, - OpCompositeConstruct = 80, - OpCompositeExtract = 81, - OpCompositeInsert = 82, - OpCopyObject = 83, - OpTranspose = 84, - OpSampledImage = 86, - OpImageSampleImplicitLod = 87, - OpImageSampleExplicitLod = 88, - OpImageSampleDrefImplicitLod = 89, - OpImageSampleDrefExplicitLod = 90, - OpImageSampleProjImplicitLod = 91, - OpImageSampleProjExplicitLod = 92, - OpImageSampleProjDrefImplicitLod = 93, - OpImageSampleProjDrefExplicitLod = 94, - OpImageFetch = 95, - OpImageGather = 96, - OpImageDrefGather = 97, - OpImageRead = 98, - OpImageWrite = 99, - OpImage = 100, - OpImageQueryFormat = 101, - OpImageQueryOrder = 102, - OpImageQuerySizeLod = 103, - OpImageQuerySize = 104, - OpImageQueryLod = 105, - OpImageQueryLevels = 106, - OpImageQuerySamples = 107, - OpConvertFToU = 109, - OpConvertFToS = 110, - OpConvertSToF = 111, - OpConvertUToF = 112, - OpUConvert = 113, - OpSConvert = 114, - OpFConvert = 115, - OpQuantizeToF16 = 116, - OpConvertPtrToU = 117, - OpSatConvertSToU = 118, - OpSatConvertUToS = 119, - OpConvertUToPtr = 120, - OpPtrCastToGeneric = 121, - OpGenericCastToPtr = 122, - OpGenericCastToPtrExplicit = 123, - OpBitcast = 124, - OpSNegate = 126, - OpFNegate = 127, - OpIAdd = 128, - OpFAdd = 129, - OpISub = 130, - OpFSub = 131, - OpIMul = 132, - OpFMul = 133, - OpUDiv = 134, - OpSDiv = 135, - OpFDiv = 136, - OpUMod = 137, - OpSRem = 138, - OpSMod = 139, - OpFRem = 140, - OpFMod = 141, - OpVectorTimesScalar = 142, - OpMatrixTimesScalar = 143, - OpVectorTimesMatrix = 144, - OpMatrixTimesVector = 145, - OpMatrixTimesMatrix = 146, - OpOuterProduct = 147, - OpDot = 148, - OpIAddCarry = 149, - OpISubBorrow = 150, - OpUMulExtended = 151, - OpSMulExtended = 152, - OpAny = 154, - OpAll = 155, - OpIsNan = 156, - OpIsInf = 157, - OpIsFinite = 158, - OpIsNormal = 159, - OpSignBitSet = 160, - OpLessOrGreater = 161, - OpOrdered = 162, - OpUnordered = 163, - OpLogicalEqual = 164, - OpLogicalNotEqual = 165, - OpLogicalOr = 166, - OpLogicalAnd = 167, - OpLogicalNot = 168, - OpSelect = 169, - OpIEqual = 170, - OpINotEqual = 171, - OpUGreaterThan = 172, - OpSGreaterThan = 173, - OpUGreaterThanEqual = 174, - OpSGreaterThanEqual = 175, - OpULessThan = 176, - OpSLessThan = 177, - OpULessThanEqual = 178, - OpSLessThanEqual = 179, - OpFOrdEqual = 180, - OpFUnordEqual = 181, - OpFOrdNotEqual = 182, - OpFUnordNotEqual = 183, - OpFOrdLessThan = 184, - OpFUnordLessThan = 185, - OpFOrdGreaterThan = 186, - OpFUnordGreaterThan = 187, - OpFOrdLessThanEqual = 188, - OpFUnordLessThanEqual = 189, - OpFOrdGreaterThanEqual = 190, - OpFUnordGreaterThanEqual = 191, - OpShiftRightLogical = 194, - OpShiftRightArithmetic = 195, - OpShiftLeftLogical = 196, - OpBitwiseOr = 197, - OpBitwiseXor = 198, - OpBitwiseAnd = 199, - OpNot = 200, - OpBitFieldInsert = 201, - OpBitFieldSExtract = 202, - OpBitFieldUExtract = 203, - OpBitReverse = 204, - OpBitCount = 205, - OpDPdx = 207, - OpDPdy = 208, - OpFwidth = 209, - OpDPdxFine = 210, - OpDPdyFine = 211, - OpFwidthFine = 212, - OpDPdxCoarse = 213, - OpDPdyCoarse = 214, - OpFwidthCoarse = 215, - OpEmitVertex = 218, - OpEndPrimitive = 219, - OpEmitStreamVertex = 220, - OpEndStreamPrimitive = 221, - OpControlBarrier = 224, - OpMemoryBarrier = 225, - OpAtomicLoad = 227, - OpAtomicStore = 228, - OpAtomicExchange = 229, - OpAtomicCompareExchange = 230, - OpAtomicCompareExchangeWeak = 231, - OpAtomicIIncrement = 232, - OpAtomicIDecrement = 233, - OpAtomicIAdd = 234, - OpAtomicISub = 235, - OpAtomicSMin = 236, - OpAtomicUMin = 237, - OpAtomicSMax = 238, - OpAtomicUMax = 239, - OpAtomicAnd = 240, - OpAtomicOr = 241, - OpAtomicXor = 242, - OpPhi = 245, - OpLoopMerge = 246, - OpSelectionMerge = 247, - OpLabel = 248, - OpBranch = 249, - OpBranchConditional = 250, - OpSwitch = 251, - OpKill = 252, - OpReturn = 253, - OpReturnValue = 254, - OpUnreachable = 255, - OpLifetimeStart = 256, - OpLifetimeStop = 257, - OpGroupAsyncCopy = 259, - OpGroupWaitEvents = 260, - OpGroupAll = 261, - OpGroupAny = 262, - OpGroupBroadcast = 263, - OpGroupIAdd = 264, - OpGroupFAdd = 265, - OpGroupFMin = 266, - OpGroupUMin = 267, - OpGroupSMin = 268, - OpGroupFMax = 269, - OpGroupUMax = 270, - OpGroupSMax = 271, - OpReadPipe = 274, - OpWritePipe = 275, - OpReservedReadPipe = 276, - OpReservedWritePipe = 277, - OpReserveReadPipePackets = 278, - OpReserveWritePipePackets = 279, - OpCommitReadPipe = 280, - OpCommitWritePipe = 281, - OpIsValidReserveId = 282, - OpGetNumPipePackets = 283, - OpGetMaxPipePackets = 284, - OpGroupReserveReadPipePackets = 285, - OpGroupReserveWritePipePackets = 286, - OpGroupCommitReadPipe = 287, - OpGroupCommitWritePipe = 288, - OpEnqueueMarker = 291, - OpEnqueueKernel = 292, - OpGetKernelNDrangeSubGroupCount = 293, - OpGetKernelNDrangeMaxSubGroupSize = 294, - OpGetKernelWorkGroupSize = 295, - OpGetKernelPreferredWorkGroupSizeMultiple = 296, - OpRetainEvent = 297, - OpReleaseEvent = 298, - OpCreateUserEvent = 299, - OpIsValidEvent = 300, - OpSetUserEventStatus = 301, - OpCaptureEventProfilingInfo = 302, - OpGetDefaultQueue = 303, - OpBuildNDRange = 304, - OpImageSparseSampleImplicitLod = 305, - OpImageSparseSampleExplicitLod = 306, - OpImageSparseSampleDrefImplicitLod = 307, - OpImageSparseSampleDrefExplicitLod = 308, - OpImageSparseSampleProjImplicitLod = 309, - OpImageSparseSampleProjExplicitLod = 310, - OpImageSparseSampleProjDrefImplicitLod = 311, - OpImageSparseSampleProjDrefExplicitLod = 312, - OpImageSparseFetch = 313, - OpImageSparseGather = 314, - OpImageSparseDrefGather = 315, - OpImageSparseTexelsResident = 316, - OpNoLine = 317, - OpAtomicFlagTestAndSet = 318, - OpAtomicFlagClear = 319, - OpImageSparseRead = 320, - OpSizeOf = 321, - OpTypePipeStorage = 322, - OpConstantPipeStorage = 323, - OpCreatePipeFromPipeStorage = 324, - OpGetKernelLocalSizeForSubgroupCount = 325, - OpGetKernelMaxNumSubgroups = 326, - OpTypeNamedBarrier = 327, - OpNamedBarrierInitialize = 328, - OpMemoryNamedBarrier = 329, - OpModuleProcessed = 330, - OpExecutionModeId = 331, - OpDecorateId = 332, - OpGroupNonUniformElect = 333, - OpGroupNonUniformAll = 334, - OpGroupNonUniformAny = 335, - OpGroupNonUniformAllEqual = 336, - OpGroupNonUniformBroadcast = 337, - OpGroupNonUniformBroadcastFirst = 338, - OpGroupNonUniformBallot = 339, - OpGroupNonUniformInverseBallot = 340, - OpGroupNonUniformBallotBitExtract = 341, - OpGroupNonUniformBallotBitCount = 342, - OpGroupNonUniformBallotFindLSB = 343, - OpGroupNonUniformBallotFindMSB = 344, - OpGroupNonUniformShuffle = 345, - OpGroupNonUniformShuffleXor = 346, - OpGroupNonUniformShuffleUp = 347, - OpGroupNonUniformShuffleDown = 348, - OpGroupNonUniformIAdd = 349, - OpGroupNonUniformFAdd = 350, - OpGroupNonUniformIMul = 351, - OpGroupNonUniformFMul = 352, - OpGroupNonUniformSMin = 353, - OpGroupNonUniformUMin = 354, - OpGroupNonUniformFMin = 355, - OpGroupNonUniformSMax = 356, - OpGroupNonUniformUMax = 357, - OpGroupNonUniformFMax = 358, - OpGroupNonUniformBitwiseAnd = 359, - OpGroupNonUniformBitwiseOr = 360, - OpGroupNonUniformBitwiseXor = 361, - OpGroupNonUniformLogicalAnd = 362, - OpGroupNonUniformLogicalOr = 363, - OpGroupNonUniformLogicalXor = 364, - OpGroupNonUniformQuadBroadcast = 365, - OpGroupNonUniformQuadSwap = 366, - OpCopyLogical = 400, - OpPtrEqual = 401, - OpPtrNotEqual = 402, - OpPtrDiff = 403, - OpTerminateInvocation = 4416, - OpSubgroupBallotKHR = 4421, - OpSubgroupFirstInvocationKHR = 4422, - OpSubgroupAllKHR = 4428, - OpSubgroupAnyKHR = 4429, - OpSubgroupAllEqualKHR = 4430, - OpSubgroupReadInvocationKHR = 4432, - OpTraceRayKHR = 4445, - OpExecuteCallableKHR = 4446, - OpConvertUToAccelerationStructureKHR = 4447, - OpIgnoreIntersectionKHR = 4448, - OpTerminateRayKHR = 4449, - OpSDot = 4450, - OpSDotKHR = 4450, - OpUDot = 4451, - OpUDotKHR = 4451, - OpSUDot = 4452, - OpSUDotKHR = 4452, - OpSDotAccSat = 4453, - OpSDotAccSatKHR = 4453, - OpUDotAccSat = 4454, - OpUDotAccSatKHR = 4454, - OpSUDotAccSat = 4455, - OpSUDotAccSatKHR = 4455, - OpTypeRayQueryKHR = 4472, - OpRayQueryInitializeKHR = 4473, - OpRayQueryTerminateKHR = 4474, - OpRayQueryGenerateIntersectionKHR = 4475, - OpRayQueryConfirmIntersectionKHR = 4476, - OpRayQueryProceedKHR = 4477, - OpRayQueryGetIntersectionTypeKHR = 4479, - OpGroupIAddNonUniformAMD = 5000, - OpGroupFAddNonUniformAMD = 5001, - OpGroupFMinNonUniformAMD = 5002, - OpGroupUMinNonUniformAMD = 5003, - OpGroupSMinNonUniformAMD = 5004, - OpGroupFMaxNonUniformAMD = 5005, - OpGroupUMaxNonUniformAMD = 5006, - OpGroupSMaxNonUniformAMD = 5007, - OpFragmentMaskFetchAMD = 5011, - OpFragmentFetchAMD = 5012, - OpReadClockKHR = 5056, - OpImageSampleFootprintNV = 5283, - OpEmitMeshTasksEXT = 5294, - OpSetMeshOutputsEXT = 5295, - OpGroupNonUniformPartitionNV = 5296, - OpWritePackedPrimitiveIndices4x8NV = 5299, - OpReportIntersectionKHR = 5334, - OpReportIntersectionNV = 5334, - OpIgnoreIntersectionNV = 5335, - OpTerminateRayNV = 5336, - OpTraceNV = 5337, - OpTraceMotionNV = 5338, - OpTraceRayMotionNV = 5339, - OpTypeAccelerationStructureKHR = 5341, - OpTypeAccelerationStructureNV = 5341, - OpExecuteCallableNV = 5344, - OpTypeCooperativeMatrixNV = 5358, - OpCooperativeMatrixLoadNV = 5359, - OpCooperativeMatrixStoreNV = 5360, - OpCooperativeMatrixMulAddNV = 5361, - OpCooperativeMatrixLengthNV = 5362, - OpBeginInvocationInterlockEXT = 5364, - OpEndInvocationInterlockEXT = 5365, - OpDemoteToHelperInvocation = 5380, - OpDemoteToHelperInvocationEXT = 5380, - OpIsHelperInvocationEXT = 5381, - OpConvertUToImageNV = 5391, - OpConvertUToSamplerNV = 5392, - OpConvertImageToUNV = 5393, - OpConvertSamplerToUNV = 5394, - OpConvertUToSampledImageNV = 5395, - OpConvertSampledImageToUNV = 5396, - OpSamplerImageAddressingModeNV = 5397, - OpSubgroupShuffleINTEL = 5571, - OpSubgroupShuffleDownINTEL = 5572, - OpSubgroupShuffleUpINTEL = 5573, - OpSubgroupShuffleXorINTEL = 5574, - OpSubgroupBlockReadINTEL = 5575, - OpSubgroupBlockWriteINTEL = 5576, - OpSubgroupImageBlockReadINTEL = 5577, - OpSubgroupImageBlockWriteINTEL = 5578, - OpSubgroupImageMediaBlockReadINTEL = 5580, - OpSubgroupImageMediaBlockWriteINTEL = 5581, - OpUCountLeadingZerosINTEL = 5585, - OpUCountTrailingZerosINTEL = 5586, - OpAbsISubINTEL = 5587, - OpAbsUSubINTEL = 5588, - OpIAddSatINTEL = 5589, - OpUAddSatINTEL = 5590, - OpIAverageINTEL = 5591, - OpUAverageINTEL = 5592, - OpIAverageRoundedINTEL = 5593, - OpUAverageRoundedINTEL = 5594, - OpISubSatINTEL = 5595, - OpUSubSatINTEL = 5596, - OpIMul32x16INTEL = 5597, - OpUMul32x16INTEL = 5598, - OpConstantFunctionPointerINTEL = 5600, - OpFunctionPointerCallINTEL = 5601, - OpAsmTargetINTEL = 5609, - OpAsmINTEL = 5610, - OpAsmCallINTEL = 5611, - OpAtomicFMinEXT = 5614, - OpAtomicFMaxEXT = 5615, - OpAssumeTrueKHR = 5630, - OpExpectKHR = 5631, - OpDecorateString = 5632, - OpDecorateStringGOOGLE = 5632, - OpMemberDecorateString = 5633, - OpMemberDecorateStringGOOGLE = 5633, - OpVmeImageINTEL = 5699, - OpTypeVmeImageINTEL = 5700, - OpTypeAvcImePayloadINTEL = 5701, - OpTypeAvcRefPayloadINTEL = 5702, - OpTypeAvcSicPayloadINTEL = 5703, - OpTypeAvcMcePayloadINTEL = 5704, - OpTypeAvcMceResultINTEL = 5705, - OpTypeAvcImeResultINTEL = 5706, - OpTypeAvcImeResultSingleReferenceStreamoutINTEL = 5707, - OpTypeAvcImeResultDualReferenceStreamoutINTEL = 5708, - OpTypeAvcImeSingleReferenceStreaminINTEL = 5709, - OpTypeAvcImeDualReferenceStreaminINTEL = 5710, - OpTypeAvcRefResultINTEL = 5711, - OpTypeAvcSicResultINTEL = 5712, - OpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL = 5713, - OpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL = 5714, - OpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL = 5715, - OpSubgroupAvcMceSetInterShapePenaltyINTEL = 5716, - OpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL = 5717, - OpSubgroupAvcMceSetInterDirectionPenaltyINTEL = 5718, - OpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL = 5719, - OpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL = 5720, - OpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL = 5721, - OpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL = 5722, - OpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL = 5723, - OpSubgroupAvcMceSetMotionVectorCostFunctionINTEL = 5724, - OpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL = 5725, - OpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL = 5726, - OpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL = 5727, - OpSubgroupAvcMceSetAcOnlyHaarINTEL = 5728, - OpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL = 5729, - OpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL = 5730, - OpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL = 5731, - OpSubgroupAvcMceConvertToImePayloadINTEL = 5732, - OpSubgroupAvcMceConvertToImeResultINTEL = 5733, - OpSubgroupAvcMceConvertToRefPayloadINTEL = 5734, - OpSubgroupAvcMceConvertToRefResultINTEL = 5735, - OpSubgroupAvcMceConvertToSicPayloadINTEL = 5736, - OpSubgroupAvcMceConvertToSicResultINTEL = 5737, - OpSubgroupAvcMceGetMotionVectorsINTEL = 5738, - OpSubgroupAvcMceGetInterDistortionsINTEL = 5739, - OpSubgroupAvcMceGetBestInterDistortionsINTEL = 5740, - OpSubgroupAvcMceGetInterMajorShapeINTEL = 5741, - OpSubgroupAvcMceGetInterMinorShapeINTEL = 5742, - OpSubgroupAvcMceGetInterDirectionsINTEL = 5743, - OpSubgroupAvcMceGetInterMotionVectorCountINTEL = 5744, - OpSubgroupAvcMceGetInterReferenceIdsINTEL = 5745, - OpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL = 5746, - OpSubgroupAvcImeInitializeINTEL = 5747, - OpSubgroupAvcImeSetSingleReferenceINTEL = 5748, - OpSubgroupAvcImeSetDualReferenceINTEL = 5749, - OpSubgroupAvcImeRefWindowSizeINTEL = 5750, - OpSubgroupAvcImeAdjustRefOffsetINTEL = 5751, - OpSubgroupAvcImeConvertToMcePayloadINTEL = 5752, - OpSubgroupAvcImeSetMaxMotionVectorCountINTEL = 5753, - OpSubgroupAvcImeSetUnidirectionalMixDisableINTEL = 5754, - OpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL = 5755, - OpSubgroupAvcImeSetWeightedSadINTEL = 5756, - OpSubgroupAvcImeEvaluateWithSingleReferenceINTEL = 5757, - OpSubgroupAvcImeEvaluateWithDualReferenceINTEL = 5758, - OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL = 5759, - OpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL = 5760, - OpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL = 5761, - OpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL = 5762, - OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL = 5763, - OpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL = 5764, - OpSubgroupAvcImeConvertToMceResultINTEL = 5765, - OpSubgroupAvcImeGetSingleReferenceStreaminINTEL = 5766, - OpSubgroupAvcImeGetDualReferenceStreaminINTEL = 5767, - OpSubgroupAvcImeStripSingleReferenceStreamoutINTEL = 5768, - OpSubgroupAvcImeStripDualReferenceStreamoutINTEL = 5769, - OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL = 5770, - OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL = 5771, - OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL = 5772, - OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL = 5773, - OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL = 5774, - OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL = 5775, - OpSubgroupAvcImeGetBorderReachedINTEL = 5776, - OpSubgroupAvcImeGetTruncatedSearchIndicationINTEL = 5777, - OpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL = 5778, - OpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL = 5779, - OpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL = 5780, - OpSubgroupAvcFmeInitializeINTEL = 5781, - OpSubgroupAvcBmeInitializeINTEL = 5782, - OpSubgroupAvcRefConvertToMcePayloadINTEL = 5783, - OpSubgroupAvcRefSetBidirectionalMixDisableINTEL = 5784, - OpSubgroupAvcRefSetBilinearFilterEnableINTEL = 5785, - OpSubgroupAvcRefEvaluateWithSingleReferenceINTEL = 5786, - OpSubgroupAvcRefEvaluateWithDualReferenceINTEL = 5787, - OpSubgroupAvcRefEvaluateWithMultiReferenceINTEL = 5788, - OpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL = 5789, - OpSubgroupAvcRefConvertToMceResultINTEL = 5790, - OpSubgroupAvcSicInitializeINTEL = 5791, - OpSubgroupAvcSicConfigureSkcINTEL = 5792, - OpSubgroupAvcSicConfigureIpeLumaINTEL = 5793, - OpSubgroupAvcSicConfigureIpeLumaChromaINTEL = 5794, - OpSubgroupAvcSicGetMotionVectorMaskINTEL = 5795, - OpSubgroupAvcSicConvertToMcePayloadINTEL = 5796, - OpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL = 5797, - OpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL = 5798, - OpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL = 5799, - OpSubgroupAvcSicSetBilinearFilterEnableINTEL = 5800, - OpSubgroupAvcSicSetSkcForwardTransformEnableINTEL = 5801, - OpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL = 5802, - OpSubgroupAvcSicEvaluateIpeINTEL = 5803, - OpSubgroupAvcSicEvaluateWithSingleReferenceINTEL = 5804, - OpSubgroupAvcSicEvaluateWithDualReferenceINTEL = 5805, - OpSubgroupAvcSicEvaluateWithMultiReferenceINTEL = 5806, - OpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL = 5807, - OpSubgroupAvcSicConvertToMceResultINTEL = 5808, - OpSubgroupAvcSicGetIpeLumaShapeINTEL = 5809, - OpSubgroupAvcSicGetBestIpeLumaDistortionINTEL = 5810, - OpSubgroupAvcSicGetBestIpeChromaDistortionINTEL = 5811, - OpSubgroupAvcSicGetPackedIpeLumaModesINTEL = 5812, - OpSubgroupAvcSicGetIpeChromaModeINTEL = 5813, - OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL = 5814, - OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL = 5815, - OpSubgroupAvcSicGetInterRawSadsINTEL = 5816, - OpVariableLengthArrayINTEL = 5818, - OpSaveMemoryINTEL = 5819, - OpRestoreMemoryINTEL = 5820, - OpArbitraryFloatSinCosPiINTEL = 5840, - OpArbitraryFloatCastINTEL = 5841, - OpArbitraryFloatCastFromIntINTEL = 5842, - OpArbitraryFloatCastToIntINTEL = 5843, - OpArbitraryFloatAddINTEL = 5846, - OpArbitraryFloatSubINTEL = 5847, - OpArbitraryFloatMulINTEL = 5848, - OpArbitraryFloatDivINTEL = 5849, - OpArbitraryFloatGTINTEL = 5850, - OpArbitraryFloatGEINTEL = 5851, - OpArbitraryFloatLTINTEL = 5852, - OpArbitraryFloatLEINTEL = 5853, - OpArbitraryFloatEQINTEL = 5854, - OpArbitraryFloatRecipINTEL = 5855, - OpArbitraryFloatRSqrtINTEL = 5856, - OpArbitraryFloatCbrtINTEL = 5857, - OpArbitraryFloatHypotINTEL = 5858, - OpArbitraryFloatSqrtINTEL = 5859, - OpArbitraryFloatLogINTEL = 5860, - OpArbitraryFloatLog2INTEL = 5861, - OpArbitraryFloatLog10INTEL = 5862, - OpArbitraryFloatLog1pINTEL = 5863, - OpArbitraryFloatExpINTEL = 5864, - OpArbitraryFloatExp2INTEL = 5865, - OpArbitraryFloatExp10INTEL = 5866, - OpArbitraryFloatExpm1INTEL = 5867, - OpArbitraryFloatSinINTEL = 5868, - OpArbitraryFloatCosINTEL = 5869, - OpArbitraryFloatSinCosINTEL = 5870, - OpArbitraryFloatSinPiINTEL = 5871, - OpArbitraryFloatCosPiINTEL = 5872, - OpArbitraryFloatASinINTEL = 5873, - OpArbitraryFloatASinPiINTEL = 5874, - OpArbitraryFloatACosINTEL = 5875, - OpArbitraryFloatACosPiINTEL = 5876, - OpArbitraryFloatATanINTEL = 5877, - OpArbitraryFloatATanPiINTEL = 5878, - OpArbitraryFloatATan2INTEL = 5879, - OpArbitraryFloatPowINTEL = 5880, - OpArbitraryFloatPowRINTEL = 5881, - OpArbitraryFloatPowNINTEL = 5882, - OpLoopControlINTEL = 5887, - OpFixedSqrtINTEL = 5923, - OpFixedRecipINTEL = 5924, - OpFixedRsqrtINTEL = 5925, - OpFixedSinINTEL = 5926, - OpFixedCosINTEL = 5927, - OpFixedSinCosINTEL = 5928, - OpFixedSinPiINTEL = 5929, - OpFixedCosPiINTEL = 5930, - OpFixedSinCosPiINTEL = 5931, - OpFixedLogINTEL = 5932, - OpFixedExpINTEL = 5933, - OpPtrCastToCrossWorkgroupINTEL = 5934, - OpCrossWorkgroupCastToPtrINTEL = 5938, - OpReadPipeBlockingINTEL = 5946, - OpWritePipeBlockingINTEL = 5947, - OpFPGARegINTEL = 5949, - OpRayQueryGetRayTMinKHR = 6016, - OpRayQueryGetRayFlagsKHR = 6017, - OpRayQueryGetIntersectionTKHR = 6018, - OpRayQueryGetIntersectionInstanceCustomIndexKHR = 6019, - OpRayQueryGetIntersectionInstanceIdKHR = 6020, - OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR = 6021, - OpRayQueryGetIntersectionGeometryIndexKHR = 6022, - OpRayQueryGetIntersectionPrimitiveIndexKHR = 6023, - OpRayQueryGetIntersectionBarycentricsKHR = 6024, - OpRayQueryGetIntersectionFrontFaceKHR = 6025, - OpRayQueryGetIntersectionCandidateAABBOpaqueKHR = 6026, - OpRayQueryGetIntersectionObjectRayDirectionKHR = 6027, - OpRayQueryGetIntersectionObjectRayOriginKHR = 6028, - OpRayQueryGetWorldRayDirectionKHR = 6029, - OpRayQueryGetWorldRayOriginKHR = 6030, - OpRayQueryGetIntersectionObjectToWorldKHR = 6031, - OpRayQueryGetIntersectionWorldToObjectKHR = 6032, - OpAtomicFAddEXT = 6035, - OpTypeBufferSurfaceINTEL = 6086, - OpTypeStructContinuedINTEL = 6090, - OpConstantCompositeContinuedINTEL = 6091, - OpSpecConstantCompositeContinuedINTEL = 6092, - OpMax = 0x7fffffff, -}; - -#ifdef SPV_ENABLE_UTILITY_CODE -inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) { - *hasResult = *hasResultType = false; - switch (opcode) { - default: /* unknown opcode */ break; - case OpNop: *hasResult = false; *hasResultType = false; break; - case OpUndef: *hasResult = true; *hasResultType = true; break; - case OpSourceContinued: *hasResult = false; *hasResultType = false; break; - case OpSource: *hasResult = false; *hasResultType = false; break; - case OpSourceExtension: *hasResult = false; *hasResultType = false; break; - case OpName: *hasResult = false; *hasResultType = false; break; - case OpMemberName: *hasResult = false; *hasResultType = false; break; - case OpString: *hasResult = true; *hasResultType = false; break; - case OpLine: *hasResult = false; *hasResultType = false; break; - case OpExtension: *hasResult = false; *hasResultType = false; break; - case OpExtInstImport: *hasResult = true; *hasResultType = false; break; - case OpExtInst: *hasResult = true; *hasResultType = true; break; - case OpMemoryModel: *hasResult = false; *hasResultType = false; break; - case OpEntryPoint: *hasResult = false; *hasResultType = false; break; - case OpExecutionMode: *hasResult = false; *hasResultType = false; break; - case OpCapability: *hasResult = false; *hasResultType = false; break; - case OpTypeVoid: *hasResult = true; *hasResultType = false; break; - case OpTypeBool: *hasResult = true; *hasResultType = false; break; - case OpTypeInt: *hasResult = true; *hasResultType = false; break; - case OpTypeFloat: *hasResult = true; *hasResultType = false; break; - case OpTypeVector: *hasResult = true; *hasResultType = false; break; - case OpTypeMatrix: *hasResult = true; *hasResultType = false; break; - case OpTypeImage: *hasResult = true; *hasResultType = false; break; - case OpTypeSampler: *hasResult = true; *hasResultType = false; break; - case OpTypeSampledImage: *hasResult = true; *hasResultType = false; break; - case OpTypeArray: *hasResult = true; *hasResultType = false; break; - case OpTypeRuntimeArray: *hasResult = true; *hasResultType = false; break; - case OpTypeStruct: *hasResult = true; *hasResultType = false; break; - case OpTypeOpaque: *hasResult = true; *hasResultType = false; break; - case OpTypePointer: *hasResult = true; *hasResultType = false; break; - case OpTypeFunction: *hasResult = true; *hasResultType = false; break; - case OpTypeEvent: *hasResult = true; *hasResultType = false; break; - case OpTypeDeviceEvent: *hasResult = true; *hasResultType = false; break; - case OpTypeReserveId: *hasResult = true; *hasResultType = false; break; - case OpTypeQueue: *hasResult = true; *hasResultType = false; break; - case OpTypePipe: *hasResult = true; *hasResultType = false; break; - case OpTypeForwardPointer: *hasResult = false; *hasResultType = false; break; - case OpConstantTrue: *hasResult = true; *hasResultType = true; break; - case OpConstantFalse: *hasResult = true; *hasResultType = true; break; - case OpConstant: *hasResult = true; *hasResultType = true; break; - case OpConstantComposite: *hasResult = true; *hasResultType = true; break; - case OpConstantSampler: *hasResult = true; *hasResultType = true; break; - case OpConstantNull: *hasResult = true; *hasResultType = true; break; - case OpSpecConstantTrue: *hasResult = true; *hasResultType = true; break; - case OpSpecConstantFalse: *hasResult = true; *hasResultType = true; break; - case OpSpecConstant: *hasResult = true; *hasResultType = true; break; - case OpSpecConstantComposite: *hasResult = true; *hasResultType = true; break; - case OpSpecConstantOp: *hasResult = true; *hasResultType = true; break; - case OpFunction: *hasResult = true; *hasResultType = true; break; - case OpFunctionParameter: *hasResult = true; *hasResultType = true; break; - case OpFunctionEnd: *hasResult = false; *hasResultType = false; break; - case OpFunctionCall: *hasResult = true; *hasResultType = true; break; - case OpVariable: *hasResult = true; *hasResultType = true; break; - case OpImageTexelPointer: *hasResult = true; *hasResultType = true; break; - case OpLoad: *hasResult = true; *hasResultType = true; break; - case OpStore: *hasResult = false; *hasResultType = false; break; - case OpCopyMemory: *hasResult = false; *hasResultType = false; break; - case OpCopyMemorySized: *hasResult = false; *hasResultType = false; break; - case OpAccessChain: *hasResult = true; *hasResultType = true; break; - case OpInBoundsAccessChain: *hasResult = true; *hasResultType = true; break; - case OpPtrAccessChain: *hasResult = true; *hasResultType = true; break; - case OpArrayLength: *hasResult = true; *hasResultType = true; break; - case OpGenericPtrMemSemantics: *hasResult = true; *hasResultType = true; break; - case OpInBoundsPtrAccessChain: *hasResult = true; *hasResultType = true; break; - case OpDecorate: *hasResult = false; *hasResultType = false; break; - case OpMemberDecorate: *hasResult = false; *hasResultType = false; break; - case OpDecorationGroup: *hasResult = true; *hasResultType = false; break; - case OpGroupDecorate: *hasResult = false; *hasResultType = false; break; - case OpGroupMemberDecorate: *hasResult = false; *hasResultType = false; break; - case OpVectorExtractDynamic: *hasResult = true; *hasResultType = true; break; - case OpVectorInsertDynamic: *hasResult = true; *hasResultType = true; break; - case OpVectorShuffle: *hasResult = true; *hasResultType = true; break; - case OpCompositeConstruct: *hasResult = true; *hasResultType = true; break; - case OpCompositeExtract: *hasResult = true; *hasResultType = true; break; - case OpCompositeInsert: *hasResult = true; *hasResultType = true; break; - case OpCopyObject: *hasResult = true; *hasResultType = true; break; - case OpTranspose: *hasResult = true; *hasResultType = true; break; - case OpSampledImage: *hasResult = true; *hasResultType = true; break; - case OpImageSampleImplicitLod: *hasResult = true; *hasResultType = true; break; - case OpImageSampleExplicitLod: *hasResult = true; *hasResultType = true; break; - case OpImageSampleDrefImplicitLod: *hasResult = true; *hasResultType = true; break; - case OpImageSampleDrefExplicitLod: *hasResult = true; *hasResultType = true; break; - case OpImageSampleProjImplicitLod: *hasResult = true; *hasResultType = true; break; - case OpImageSampleProjExplicitLod: *hasResult = true; *hasResultType = true; break; - case OpImageSampleProjDrefImplicitLod: *hasResult = true; *hasResultType = true; break; - case OpImageSampleProjDrefExplicitLod: *hasResult = true; *hasResultType = true; break; - case OpImageFetch: *hasResult = true; *hasResultType = true; break; - case OpImageGather: *hasResult = true; *hasResultType = true; break; - case OpImageDrefGather: *hasResult = true; *hasResultType = true; break; - case OpImageRead: *hasResult = true; *hasResultType = true; break; - case OpImageWrite: *hasResult = false; *hasResultType = false; break; - case OpImage: *hasResult = true; *hasResultType = true; break; - case OpImageQueryFormat: *hasResult = true; *hasResultType = true; break; - case OpImageQueryOrder: *hasResult = true; *hasResultType = true; break; - case OpImageQuerySizeLod: *hasResult = true; *hasResultType = true; break; - case OpImageQuerySize: *hasResult = true; *hasResultType = true; break; - case OpImageQueryLod: *hasResult = true; *hasResultType = true; break; - case OpImageQueryLevels: *hasResult = true; *hasResultType = true; break; - case OpImageQuerySamples: *hasResult = true; *hasResultType = true; break; - case OpConvertFToU: *hasResult = true; *hasResultType = true; break; - case OpConvertFToS: *hasResult = true; *hasResultType = true; break; - case OpConvertSToF: *hasResult = true; *hasResultType = true; break; - case OpConvertUToF: *hasResult = true; *hasResultType = true; break; - case OpUConvert: *hasResult = true; *hasResultType = true; break; - case OpSConvert: *hasResult = true; *hasResultType = true; break; - case OpFConvert: *hasResult = true; *hasResultType = true; break; - case OpQuantizeToF16: *hasResult = true; *hasResultType = true; break; - case OpConvertPtrToU: *hasResult = true; *hasResultType = true; break; - case OpSatConvertSToU: *hasResult = true; *hasResultType = true; break; - case OpSatConvertUToS: *hasResult = true; *hasResultType = true; break; - case OpConvertUToPtr: *hasResult = true; *hasResultType = true; break; - case OpPtrCastToGeneric: *hasResult = true; *hasResultType = true; break; - case OpGenericCastToPtr: *hasResult = true; *hasResultType = true; break; - case OpGenericCastToPtrExplicit: *hasResult = true; *hasResultType = true; break; - case OpBitcast: *hasResult = true; *hasResultType = true; break; - case OpSNegate: *hasResult = true; *hasResultType = true; break; - case OpFNegate: *hasResult = true; *hasResultType = true; break; - case OpIAdd: *hasResult = true; *hasResultType = true; break; - case OpFAdd: *hasResult = true; *hasResultType = true; break; - case OpISub: *hasResult = true; *hasResultType = true; break; - case OpFSub: *hasResult = true; *hasResultType = true; break; - case OpIMul: *hasResult = true; *hasResultType = true; break; - case OpFMul: *hasResult = true; *hasResultType = true; break; - case OpUDiv: *hasResult = true; *hasResultType = true; break; - case OpSDiv: *hasResult = true; *hasResultType = true; break; - case OpFDiv: *hasResult = true; *hasResultType = true; break; - case OpUMod: *hasResult = true; *hasResultType = true; break; - case OpSRem: *hasResult = true; *hasResultType = true; break; - case OpSMod: *hasResult = true; *hasResultType = true; break; - case OpFRem: *hasResult = true; *hasResultType = true; break; - case OpFMod: *hasResult = true; *hasResultType = true; break; - case OpVectorTimesScalar: *hasResult = true; *hasResultType = true; break; - case OpMatrixTimesScalar: *hasResult = true; *hasResultType = true; break; - case OpVectorTimesMatrix: *hasResult = true; *hasResultType = true; break; - case OpMatrixTimesVector: *hasResult = true; *hasResultType = true; break; - case OpMatrixTimesMatrix: *hasResult = true; *hasResultType = true; break; - case OpOuterProduct: *hasResult = true; *hasResultType = true; break; - case OpDot: *hasResult = true; *hasResultType = true; break; - case OpIAddCarry: *hasResult = true; *hasResultType = true; break; - case OpISubBorrow: *hasResult = true; *hasResultType = true; break; - case OpUMulExtended: *hasResult = true; *hasResultType = true; break; - case OpSMulExtended: *hasResult = true; *hasResultType = true; break; - case OpAny: *hasResult = true; *hasResultType = true; break; - case OpAll: *hasResult = true; *hasResultType = true; break; - case OpIsNan: *hasResult = true; *hasResultType = true; break; - case OpIsInf: *hasResult = true; *hasResultType = true; break; - case OpIsFinite: *hasResult = true; *hasResultType = true; break; - case OpIsNormal: *hasResult = true; *hasResultType = true; break; - case OpSignBitSet: *hasResult = true; *hasResultType = true; break; - case OpLessOrGreater: *hasResult = true; *hasResultType = true; break; - case OpOrdered: *hasResult = true; *hasResultType = true; break; - case OpUnordered: *hasResult = true; *hasResultType = true; break; - case OpLogicalEqual: *hasResult = true; *hasResultType = true; break; - case OpLogicalNotEqual: *hasResult = true; *hasResultType = true; break; - case OpLogicalOr: *hasResult = true; *hasResultType = true; break; - case OpLogicalAnd: *hasResult = true; *hasResultType = true; break; - case OpLogicalNot: *hasResult = true; *hasResultType = true; break; - case OpSelect: *hasResult = true; *hasResultType = true; break; - case OpIEqual: *hasResult = true; *hasResultType = true; break; - case OpINotEqual: *hasResult = true; *hasResultType = true; break; - case OpUGreaterThan: *hasResult = true; *hasResultType = true; break; - case OpSGreaterThan: *hasResult = true; *hasResultType = true; break; - case OpUGreaterThanEqual: *hasResult = true; *hasResultType = true; break; - case OpSGreaterThanEqual: *hasResult = true; *hasResultType = true; break; - case OpULessThan: *hasResult = true; *hasResultType = true; break; - case OpSLessThan: *hasResult = true; *hasResultType = true; break; - case OpULessThanEqual: *hasResult = true; *hasResultType = true; break; - case OpSLessThanEqual: *hasResult = true; *hasResultType = true; break; - case OpFOrdEqual: *hasResult = true; *hasResultType = true; break; - case OpFUnordEqual: *hasResult = true; *hasResultType = true; break; - case OpFOrdNotEqual: *hasResult = true; *hasResultType = true; break; - case OpFUnordNotEqual: *hasResult = true; *hasResultType = true; break; - case OpFOrdLessThan: *hasResult = true; *hasResultType = true; break; - case OpFUnordLessThan: *hasResult = true; *hasResultType = true; break; - case OpFOrdGreaterThan: *hasResult = true; *hasResultType = true; break; - case OpFUnordGreaterThan: *hasResult = true; *hasResultType = true; break; - case OpFOrdLessThanEqual: *hasResult = true; *hasResultType = true; break; - case OpFUnordLessThanEqual: *hasResult = true; *hasResultType = true; break; - case OpFOrdGreaterThanEqual: *hasResult = true; *hasResultType = true; break; - case OpFUnordGreaterThanEqual: *hasResult = true; *hasResultType = true; break; - case OpShiftRightLogical: *hasResult = true; *hasResultType = true; break; - case OpShiftRightArithmetic: *hasResult = true; *hasResultType = true; break; - case OpShiftLeftLogical: *hasResult = true; *hasResultType = true; break; - case OpBitwiseOr: *hasResult = true; *hasResultType = true; break; - case OpBitwiseXor: *hasResult = true; *hasResultType = true; break; - case OpBitwiseAnd: *hasResult = true; *hasResultType = true; break; - case OpNot: *hasResult = true; *hasResultType = true; break; - case OpBitFieldInsert: *hasResult = true; *hasResultType = true; break; - case OpBitFieldSExtract: *hasResult = true; *hasResultType = true; break; - case OpBitFieldUExtract: *hasResult = true; *hasResultType = true; break; - case OpBitReverse: *hasResult = true; *hasResultType = true; break; - case OpBitCount: *hasResult = true; *hasResultType = true; break; - case OpDPdx: *hasResult = true; *hasResultType = true; break; - case OpDPdy: *hasResult = true; *hasResultType = true; break; - case OpFwidth: *hasResult = true; *hasResultType = true; break; - case OpDPdxFine: *hasResult = true; *hasResultType = true; break; - case OpDPdyFine: *hasResult = true; *hasResultType = true; break; - case OpFwidthFine: *hasResult = true; *hasResultType = true; break; - case OpDPdxCoarse: *hasResult = true; *hasResultType = true; break; - case OpDPdyCoarse: *hasResult = true; *hasResultType = true; break; - case OpFwidthCoarse: *hasResult = true; *hasResultType = true; break; - case OpEmitVertex: *hasResult = false; *hasResultType = false; break; - case OpEndPrimitive: *hasResult = false; *hasResultType = false; break; - case OpEmitStreamVertex: *hasResult = false; *hasResultType = false; break; - case OpEndStreamPrimitive: *hasResult = false; *hasResultType = false; break; - case OpControlBarrier: *hasResult = false; *hasResultType = false; break; - case OpMemoryBarrier: *hasResult = false; *hasResultType = false; break; - case OpAtomicLoad: *hasResult = true; *hasResultType = true; break; - case OpAtomicStore: *hasResult = false; *hasResultType = false; break; - case OpAtomicExchange: *hasResult = true; *hasResultType = true; break; - case OpAtomicCompareExchange: *hasResult = true; *hasResultType = true; break; - case OpAtomicCompareExchangeWeak: *hasResult = true; *hasResultType = true; break; - case OpAtomicIIncrement: *hasResult = true; *hasResultType = true; break; - case OpAtomicIDecrement: *hasResult = true; *hasResultType = true; break; - case OpAtomicIAdd: *hasResult = true; *hasResultType = true; break; - case OpAtomicISub: *hasResult = true; *hasResultType = true; break; - case OpAtomicSMin: *hasResult = true; *hasResultType = true; break; - case OpAtomicUMin: *hasResult = true; *hasResultType = true; break; - case OpAtomicSMax: *hasResult = true; *hasResultType = true; break; - case OpAtomicUMax: *hasResult = true; *hasResultType = true; break; - case OpAtomicAnd: *hasResult = true; *hasResultType = true; break; - case OpAtomicOr: *hasResult = true; *hasResultType = true; break; - case OpAtomicXor: *hasResult = true; *hasResultType = true; break; - case OpPhi: *hasResult = true; *hasResultType = true; break; - case OpLoopMerge: *hasResult = false; *hasResultType = false; break; - case OpSelectionMerge: *hasResult = false; *hasResultType = false; break; - case OpLabel: *hasResult = true; *hasResultType = false; break; - case OpBranch: *hasResult = false; *hasResultType = false; break; - case OpBranchConditional: *hasResult = false; *hasResultType = false; break; - case OpSwitch: *hasResult = false; *hasResultType = false; break; - case OpKill: *hasResult = false; *hasResultType = false; break; - case OpReturn: *hasResult = false; *hasResultType = false; break; - case OpReturnValue: *hasResult = false; *hasResultType = false; break; - case OpUnreachable: *hasResult = false; *hasResultType = false; break; - case OpLifetimeStart: *hasResult = false; *hasResultType = false; break; - case OpLifetimeStop: *hasResult = false; *hasResultType = false; break; - case OpGroupAsyncCopy: *hasResult = true; *hasResultType = true; break; - case OpGroupWaitEvents: *hasResult = false; *hasResultType = false; break; - case OpGroupAll: *hasResult = true; *hasResultType = true; break; - case OpGroupAny: *hasResult = true; *hasResultType = true; break; - case OpGroupBroadcast: *hasResult = true; *hasResultType = true; break; - case OpGroupIAdd: *hasResult = true; *hasResultType = true; break; - case OpGroupFAdd: *hasResult = true; *hasResultType = true; break; - case OpGroupFMin: *hasResult = true; *hasResultType = true; break; - case OpGroupUMin: *hasResult = true; *hasResultType = true; break; - case OpGroupSMin: *hasResult = true; *hasResultType = true; break; - case OpGroupFMax: *hasResult = true; *hasResultType = true; break; - case OpGroupUMax: *hasResult = true; *hasResultType = true; break; - case OpGroupSMax: *hasResult = true; *hasResultType = true; break; - case OpReadPipe: *hasResult = true; *hasResultType = true; break; - case OpWritePipe: *hasResult = true; *hasResultType = true; break; - case OpReservedReadPipe: *hasResult = true; *hasResultType = true; break; - case OpReservedWritePipe: *hasResult = true; *hasResultType = true; break; - case OpReserveReadPipePackets: *hasResult = true; *hasResultType = true; break; - case OpReserveWritePipePackets: *hasResult = true; *hasResultType = true; break; - case OpCommitReadPipe: *hasResult = false; *hasResultType = false; break; - case OpCommitWritePipe: *hasResult = false; *hasResultType = false; break; - case OpIsValidReserveId: *hasResult = true; *hasResultType = true; break; - case OpGetNumPipePackets: *hasResult = true; *hasResultType = true; break; - case OpGetMaxPipePackets: *hasResult = true; *hasResultType = true; break; - case OpGroupReserveReadPipePackets: *hasResult = true; *hasResultType = true; break; - case OpGroupReserveWritePipePackets: *hasResult = true; *hasResultType = true; break; - case OpGroupCommitReadPipe: *hasResult = false; *hasResultType = false; break; - case OpGroupCommitWritePipe: *hasResult = false; *hasResultType = false; break; - case OpEnqueueMarker: *hasResult = true; *hasResultType = true; break; - case OpEnqueueKernel: *hasResult = true; *hasResultType = true; break; - case OpGetKernelNDrangeSubGroupCount: *hasResult = true; *hasResultType = true; break; - case OpGetKernelNDrangeMaxSubGroupSize: *hasResult = true; *hasResultType = true; break; - case OpGetKernelWorkGroupSize: *hasResult = true; *hasResultType = true; break; - case OpGetKernelPreferredWorkGroupSizeMultiple: *hasResult = true; *hasResultType = true; break; - case OpRetainEvent: *hasResult = false; *hasResultType = false; break; - case OpReleaseEvent: *hasResult = false; *hasResultType = false; break; - case OpCreateUserEvent: *hasResult = true; *hasResultType = true; break; - case OpIsValidEvent: *hasResult = true; *hasResultType = true; break; - case OpSetUserEventStatus: *hasResult = false; *hasResultType = false; break; - case OpCaptureEventProfilingInfo: *hasResult = false; *hasResultType = false; break; - case OpGetDefaultQueue: *hasResult = true; *hasResultType = true; break; - case OpBuildNDRange: *hasResult = true; *hasResultType = true; break; - case OpImageSparseSampleImplicitLod: *hasResult = true; *hasResultType = true; break; - case OpImageSparseSampleExplicitLod: *hasResult = true; *hasResultType = true; break; - case OpImageSparseSampleDrefImplicitLod: *hasResult = true; *hasResultType = true; break; - case OpImageSparseSampleDrefExplicitLod: *hasResult = true; *hasResultType = true; break; - case OpImageSparseSampleProjImplicitLod: *hasResult = true; *hasResultType = true; break; - case OpImageSparseSampleProjExplicitLod: *hasResult = true; *hasResultType = true; break; - case OpImageSparseSampleProjDrefImplicitLod: *hasResult = true; *hasResultType = true; break; - case OpImageSparseSampleProjDrefExplicitLod: *hasResult = true; *hasResultType = true; break; - case OpImageSparseFetch: *hasResult = true; *hasResultType = true; break; - case OpImageSparseGather: *hasResult = true; *hasResultType = true; break; - case OpImageSparseDrefGather: *hasResult = true; *hasResultType = true; break; - case OpImageSparseTexelsResident: *hasResult = true; *hasResultType = true; break; - case OpNoLine: *hasResult = false; *hasResultType = false; break; - case OpAtomicFlagTestAndSet: *hasResult = true; *hasResultType = true; break; - case OpAtomicFlagClear: *hasResult = false; *hasResultType = false; break; - case OpImageSparseRead: *hasResult = true; *hasResultType = true; break; - case OpSizeOf: *hasResult = true; *hasResultType = true; break; - case OpTypePipeStorage: *hasResult = true; *hasResultType = false; break; - case OpConstantPipeStorage: *hasResult = true; *hasResultType = true; break; - case OpCreatePipeFromPipeStorage: *hasResult = true; *hasResultType = true; break; - case OpGetKernelLocalSizeForSubgroupCount: *hasResult = true; *hasResultType = true; break; - case OpGetKernelMaxNumSubgroups: *hasResult = true; *hasResultType = true; break; - case OpTypeNamedBarrier: *hasResult = true; *hasResultType = false; break; - case OpNamedBarrierInitialize: *hasResult = true; *hasResultType = true; break; - case OpMemoryNamedBarrier: *hasResult = false; *hasResultType = false; break; - case OpModuleProcessed: *hasResult = false; *hasResultType = false; break; - case OpExecutionModeId: *hasResult = false; *hasResultType = false; break; - case OpDecorateId: *hasResult = false; *hasResultType = false; break; - case OpGroupNonUniformElect: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformAll: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformAny: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformAllEqual: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformBroadcast: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformBroadcastFirst: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformBallot: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformInverseBallot: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformBallotBitExtract: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformBallotBitCount: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformBallotFindLSB: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformBallotFindMSB: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformShuffle: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformShuffleXor: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformShuffleUp: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformShuffleDown: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformIAdd: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformFAdd: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformIMul: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformFMul: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformSMin: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformUMin: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformFMin: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformSMax: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformUMax: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformFMax: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformBitwiseAnd: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformBitwiseOr: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformBitwiseXor: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformLogicalAnd: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformLogicalOr: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformLogicalXor: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformQuadBroadcast: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformQuadSwap: *hasResult = true; *hasResultType = true; break; - case OpCopyLogical: *hasResult = true; *hasResultType = true; break; - case OpPtrEqual: *hasResult = true; *hasResultType = true; break; - case OpPtrNotEqual: *hasResult = true; *hasResultType = true; break; - case OpPtrDiff: *hasResult = true; *hasResultType = true; break; - case OpTerminateInvocation: *hasResult = false; *hasResultType = false; break; - case OpSubgroupBallotKHR: *hasResult = true; *hasResultType = true; break; - case OpSubgroupFirstInvocationKHR: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAllKHR: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAnyKHR: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAllEqualKHR: *hasResult = true; *hasResultType = true; break; - case OpSubgroupReadInvocationKHR: *hasResult = true; *hasResultType = true; break; - case OpTraceRayKHR: *hasResult = false; *hasResultType = false; break; - case OpExecuteCallableKHR: *hasResult = false; *hasResultType = false; break; - case OpConvertUToAccelerationStructureKHR: *hasResult = true; *hasResultType = true; break; - case OpIgnoreIntersectionKHR: *hasResult = false; *hasResultType = false; break; - case OpTerminateRayKHR: *hasResult = false; *hasResultType = false; break; - case OpSDot: *hasResult = true; *hasResultType = true; break; - case OpUDot: *hasResult = true; *hasResultType = true; break; - case OpSUDot: *hasResult = true; *hasResultType = true; break; - case OpSDotAccSat: *hasResult = true; *hasResultType = true; break; - case OpUDotAccSat: *hasResult = true; *hasResultType = true; break; - case OpSUDotAccSat: *hasResult = true; *hasResultType = true; break; - case OpTypeRayQueryKHR: *hasResult = true; *hasResultType = false; break; - case OpRayQueryInitializeKHR: *hasResult = false; *hasResultType = false; break; - case OpRayQueryTerminateKHR: *hasResult = false; *hasResultType = false; break; - case OpRayQueryGenerateIntersectionKHR: *hasResult = false; *hasResultType = false; break; - case OpRayQueryConfirmIntersectionKHR: *hasResult = false; *hasResultType = false; break; - case OpRayQueryProceedKHR: *hasResult = true; *hasResultType = true; break; - case OpRayQueryGetIntersectionTypeKHR: *hasResult = true; *hasResultType = true; break; - case OpGroupIAddNonUniformAMD: *hasResult = true; *hasResultType = true; break; - case OpGroupFAddNonUniformAMD: *hasResult = true; *hasResultType = true; break; - case OpGroupFMinNonUniformAMD: *hasResult = true; *hasResultType = true; break; - case OpGroupUMinNonUniformAMD: *hasResult = true; *hasResultType = true; break; - case OpGroupSMinNonUniformAMD: *hasResult = true; *hasResultType = true; break; - case OpGroupFMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break; - case OpGroupUMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break; - case OpGroupSMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break; - case OpFragmentMaskFetchAMD: *hasResult = true; *hasResultType = true; break; - case OpFragmentFetchAMD: *hasResult = true; *hasResultType = true; break; - case OpReadClockKHR: *hasResult = true; *hasResultType = true; break; - case OpImageSampleFootprintNV: *hasResult = true; *hasResultType = true; break; - case OpGroupNonUniformPartitionNV: *hasResult = true; *hasResultType = true; break; - case OpEmitMeshTasksEXT: *hasResult = false; *hasResultType = false; break; - case OpSetMeshOutputsEXT: *hasResult = false; *hasResultType = false; break; - case OpWritePackedPrimitiveIndices4x8NV: *hasResult = false; *hasResultType = false; break; - case OpReportIntersectionNV: *hasResult = true; *hasResultType = true; break; - case OpIgnoreIntersectionNV: *hasResult = false; *hasResultType = false; break; - case OpTerminateRayNV: *hasResult = false; *hasResultType = false; break; - case OpTraceNV: *hasResult = false; *hasResultType = false; break; - case OpTraceMotionNV: *hasResult = false; *hasResultType = false; break; - case OpTraceRayMotionNV: *hasResult = false; *hasResultType = false; break; - case OpTypeAccelerationStructureNV: *hasResult = true; *hasResultType = false; break; - case OpExecuteCallableNV: *hasResult = false; *hasResultType = false; break; - case OpTypeCooperativeMatrixNV: *hasResult = true; *hasResultType = false; break; - case OpCooperativeMatrixLoadNV: *hasResult = true; *hasResultType = true; break; - case OpCooperativeMatrixStoreNV: *hasResult = false; *hasResultType = false; break; - case OpCooperativeMatrixMulAddNV: *hasResult = true; *hasResultType = true; break; - case OpCooperativeMatrixLengthNV: *hasResult = true; *hasResultType = true; break; - case OpBeginInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break; - case OpEndInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break; - case OpDemoteToHelperInvocation: *hasResult = false; *hasResultType = false; break; - case OpIsHelperInvocationEXT: *hasResult = true; *hasResultType = true; break; - case OpConvertUToImageNV: *hasResult = true; *hasResultType = true; break; - case OpConvertUToSamplerNV: *hasResult = true; *hasResultType = true; break; - case OpConvertImageToUNV: *hasResult = true; *hasResultType = true; break; - case OpConvertSamplerToUNV: *hasResult = true; *hasResultType = true; break; - case OpConvertUToSampledImageNV: *hasResult = true; *hasResultType = true; break; - case OpConvertSampledImageToUNV: *hasResult = true; *hasResultType = true; break; - case OpSamplerImageAddressingModeNV: *hasResult = false; *hasResultType = false; break; - case OpSubgroupShuffleINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupShuffleDownINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupShuffleUpINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupShuffleXorINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupBlockReadINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupBlockWriteINTEL: *hasResult = false; *hasResultType = false; break; - case OpSubgroupImageBlockReadINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupImageBlockWriteINTEL: *hasResult = false; *hasResultType = false; break; - case OpSubgroupImageMediaBlockReadINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupImageMediaBlockWriteINTEL: *hasResult = false; *hasResultType = false; break; - case OpUCountLeadingZerosINTEL: *hasResult = true; *hasResultType = true; break; - case OpUCountTrailingZerosINTEL: *hasResult = true; *hasResultType = true; break; - case OpAbsISubINTEL: *hasResult = true; *hasResultType = true; break; - case OpAbsUSubINTEL: *hasResult = true; *hasResultType = true; break; - case OpIAddSatINTEL: *hasResult = true; *hasResultType = true; break; - case OpUAddSatINTEL: *hasResult = true; *hasResultType = true; break; - case OpIAverageINTEL: *hasResult = true; *hasResultType = true; break; - case OpUAverageINTEL: *hasResult = true; *hasResultType = true; break; - case OpIAverageRoundedINTEL: *hasResult = true; *hasResultType = true; break; - case OpUAverageRoundedINTEL: *hasResult = true; *hasResultType = true; break; - case OpISubSatINTEL: *hasResult = true; *hasResultType = true; break; - case OpUSubSatINTEL: *hasResult = true; *hasResultType = true; break; - case OpIMul32x16INTEL: *hasResult = true; *hasResultType = true; break; - case OpUMul32x16INTEL: *hasResult = true; *hasResultType = true; break; - case OpConstantFunctionPointerINTEL: *hasResult = true; *hasResultType = true; break; - case OpFunctionPointerCallINTEL: *hasResult = true; *hasResultType = true; break; - case OpAsmTargetINTEL: *hasResult = true; *hasResultType = true; break; - case OpAsmINTEL: *hasResult = true; *hasResultType = true; break; - case OpAsmCallINTEL: *hasResult = true; *hasResultType = true; break; - case OpAtomicFMinEXT: *hasResult = true; *hasResultType = true; break; - case OpAtomicFMaxEXT: *hasResult = true; *hasResultType = true; break; - case OpAssumeTrueKHR: *hasResult = false; *hasResultType = false; break; - case OpExpectKHR: *hasResult = true; *hasResultType = true; break; - case OpDecorateString: *hasResult = false; *hasResultType = false; break; - case OpMemberDecorateString: *hasResult = false; *hasResultType = false; break; - case OpVmeImageINTEL: *hasResult = true; *hasResultType = true; break; - case OpTypeVmeImageINTEL: *hasResult = true; *hasResultType = false; break; - case OpTypeAvcImePayloadINTEL: *hasResult = true; *hasResultType = false; break; - case OpTypeAvcRefPayloadINTEL: *hasResult = true; *hasResultType = false; break; - case OpTypeAvcSicPayloadINTEL: *hasResult = true; *hasResultType = false; break; - case OpTypeAvcMcePayloadINTEL: *hasResult = true; *hasResultType = false; break; - case OpTypeAvcMceResultINTEL: *hasResult = true; *hasResultType = false; break; - case OpTypeAvcImeResultINTEL: *hasResult = true; *hasResultType = false; break; - case OpTypeAvcImeResultSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = false; break; - case OpTypeAvcImeResultDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = false; break; - case OpTypeAvcImeSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = false; break; - case OpTypeAvcImeDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = false; break; - case OpTypeAvcRefResultINTEL: *hasResult = true; *hasResultType = false; break; - case OpTypeAvcSicResultINTEL: *hasResult = true; *hasResultType = false; break; - case OpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceSetInterShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceSetInterDirectionPenaltyINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceSetMotionVectorCostFunctionINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceSetAcOnlyHaarINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceConvertToImePayloadINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceConvertToImeResultINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceConvertToRefPayloadINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceConvertToRefResultINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceConvertToSicPayloadINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceConvertToSicResultINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetInterDistortionsINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetBestInterDistortionsINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetInterMajorShapeINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetInterMinorShapeINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetInterDirectionsINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetInterMotionVectorCountINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetInterReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeInitializeINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeSetSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeSetDualReferenceINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeRefWindowSizeINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeAdjustRefOffsetINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeSetMaxMotionVectorCountINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeSetUnidirectionalMixDisableINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeSetWeightedSadINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeGetSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeGetDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeStripSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeStripDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeGetBorderReachedINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeGetTruncatedSearchIndicationINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcFmeInitializeINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcBmeInitializeINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcRefConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcRefSetBidirectionalMixDisableINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcRefSetBilinearFilterEnableINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcRefEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcRefEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcRefEvaluateWithMultiReferenceINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcRefConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicInitializeINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicConfigureSkcINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicConfigureIpeLumaINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicConfigureIpeLumaChromaINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicGetMotionVectorMaskINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicSetBilinearFilterEnableINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicSetSkcForwardTransformEnableINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicEvaluateIpeINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicEvaluateWithMultiReferenceINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicGetIpeLumaShapeINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicGetBestIpeLumaDistortionINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicGetBestIpeChromaDistortionINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicGetPackedIpeLumaModesINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicGetIpeChromaModeINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL: *hasResult = true; *hasResultType = true; break; - case OpSubgroupAvcSicGetInterRawSadsINTEL: *hasResult = true; *hasResultType = true; break; - case OpVariableLengthArrayINTEL: *hasResult = true; *hasResultType = true; break; - case OpSaveMemoryINTEL: *hasResult = true; *hasResultType = true; break; - case OpRestoreMemoryINTEL: *hasResult = false; *hasResultType = false; break; - case OpArbitraryFloatSinCosPiINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatCastINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatCastFromIntINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatCastToIntINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatAddINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatSubINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatMulINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatDivINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatGTINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatGEINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatLTINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatLEINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatEQINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatRecipINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatRSqrtINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatCbrtINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatHypotINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatSqrtINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatLogINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatLog2INTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatLog10INTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatLog1pINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatExpINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatExp2INTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatExp10INTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatExpm1INTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatSinINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatCosINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatSinCosINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatSinPiINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatCosPiINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatASinINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatASinPiINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatACosINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatACosPiINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatATanINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatATanPiINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatATan2INTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatPowINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatPowRINTEL: *hasResult = true; *hasResultType = true; break; - case OpArbitraryFloatPowNINTEL: *hasResult = true; *hasResultType = true; break; - case OpLoopControlINTEL: *hasResult = false; *hasResultType = false; break; - case OpFixedSqrtINTEL: *hasResult = true; *hasResultType = true; break; - case OpFixedRecipINTEL: *hasResult = true; *hasResultType = true; break; - case OpFixedRsqrtINTEL: *hasResult = true; *hasResultType = true; break; - case OpFixedSinINTEL: *hasResult = true; *hasResultType = true; break; - case OpFixedCosINTEL: *hasResult = true; *hasResultType = true; break; - case OpFixedSinCosINTEL: *hasResult = true; *hasResultType = true; break; - case OpFixedSinPiINTEL: *hasResult = true; *hasResultType = true; break; - case OpFixedCosPiINTEL: *hasResult = true; *hasResultType = true; break; - case OpFixedSinCosPiINTEL: *hasResult = true; *hasResultType = true; break; - case OpFixedLogINTEL: *hasResult = true; *hasResultType = true; break; - case OpFixedExpINTEL: *hasResult = true; *hasResultType = true; break; - case OpPtrCastToCrossWorkgroupINTEL: *hasResult = true; *hasResultType = true; break; - case OpCrossWorkgroupCastToPtrINTEL: *hasResult = true; *hasResultType = true; break; - case OpReadPipeBlockingINTEL: *hasResult = true; *hasResultType = true; break; - case OpWritePipeBlockingINTEL: *hasResult = true; *hasResultType = true; break; - case OpFPGARegINTEL: *hasResult = true; *hasResultType = true; break; - case OpRayQueryGetRayTMinKHR: *hasResult = true; *hasResultType = true; break; - case OpRayQueryGetRayFlagsKHR: *hasResult = true; *hasResultType = true; break; - case OpRayQueryGetIntersectionTKHR: *hasResult = true; *hasResultType = true; break; - case OpRayQueryGetIntersectionInstanceCustomIndexKHR: *hasResult = true; *hasResultType = true; break; - case OpRayQueryGetIntersectionInstanceIdKHR: *hasResult = true; *hasResultType = true; break; - case OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR: *hasResult = true; *hasResultType = true; break; - case OpRayQueryGetIntersectionGeometryIndexKHR: *hasResult = true; *hasResultType = true; break; - case OpRayQueryGetIntersectionPrimitiveIndexKHR: *hasResult = true; *hasResultType = true; break; - case OpRayQueryGetIntersectionBarycentricsKHR: *hasResult = true; *hasResultType = true; break; - case OpRayQueryGetIntersectionFrontFaceKHR: *hasResult = true; *hasResultType = true; break; - case OpRayQueryGetIntersectionCandidateAABBOpaqueKHR: *hasResult = true; *hasResultType = true; break; - case OpRayQueryGetIntersectionObjectRayDirectionKHR: *hasResult = true; *hasResultType = true; break; - case OpRayQueryGetIntersectionObjectRayOriginKHR: *hasResult = true; *hasResultType = true; break; - case OpRayQueryGetWorldRayDirectionKHR: *hasResult = true; *hasResultType = true; break; - case OpRayQueryGetWorldRayOriginKHR: *hasResult = true; *hasResultType = true; break; - case OpRayQueryGetIntersectionObjectToWorldKHR: *hasResult = true; *hasResultType = true; break; - case OpRayQueryGetIntersectionWorldToObjectKHR: *hasResult = true; *hasResultType = true; break; - case OpAtomicFAddEXT: *hasResult = true; *hasResultType = true; break; - case OpTypeBufferSurfaceINTEL: *hasResult = true; *hasResultType = false; break; - case OpTypeStructContinuedINTEL: *hasResult = false; *hasResultType = false; break; - case OpConstantCompositeContinuedINTEL: *hasResult = false; *hasResultType = false; break; - case OpSpecConstantCompositeContinuedINTEL: *hasResult = false; *hasResultType = false; break; - } -} -#endif /* SPV_ENABLE_UTILITY_CODE */ - -// Overload operator| for mask bit combining - -inline ImageOperandsMask operator|(ImageOperandsMask a, ImageOperandsMask b) { return ImageOperandsMask(unsigned(a) | unsigned(b)); } -inline FPFastMathModeMask operator|(FPFastMathModeMask a, FPFastMathModeMask b) { return FPFastMathModeMask(unsigned(a) | unsigned(b)); } -inline SelectionControlMask operator|(SelectionControlMask a, SelectionControlMask b) { return SelectionControlMask(unsigned(a) | unsigned(b)); } -inline LoopControlMask operator|(LoopControlMask a, LoopControlMask b) { return LoopControlMask(unsigned(a) | unsigned(b)); } -inline FunctionControlMask operator|(FunctionControlMask a, FunctionControlMask b) { return FunctionControlMask(unsigned(a) | unsigned(b)); } -inline MemorySemanticsMask operator|(MemorySemanticsMask a, MemorySemanticsMask b) { return MemorySemanticsMask(unsigned(a) | unsigned(b)); } -inline MemoryAccessMask operator|(MemoryAccessMask a, MemoryAccessMask b) { return MemoryAccessMask(unsigned(a) | unsigned(b)); } -inline KernelProfilingInfoMask operator|(KernelProfilingInfoMask a, KernelProfilingInfoMask b) { return KernelProfilingInfoMask(unsigned(a) | unsigned(b)); } -inline RayFlagsMask operator|(RayFlagsMask a, RayFlagsMask b) { return RayFlagsMask(unsigned(a) | unsigned(b)); } -inline FragmentShadingRateMask operator|(FragmentShadingRateMask a, FragmentShadingRateMask b) { return FragmentShadingRateMask(unsigned(a) | unsigned(b)); } - -} // end namespace spv - -#endif // #ifndef spirv_HPP +// Copyright (c) 2014-2020 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. +// +// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS +// STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND +// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +// +// 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 automatically generated by the same tool that creates +// the Binary Section of the SPIR-V specification. + +// Enumeration tokens for SPIR-V, in various styles: +// C, C++, C++11, JSON, Lua, Python, C#, D, Beef +// +// - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL +// - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL +// - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL +// - Lua will use tables, e.g.: spv.SourceLanguage.GLSL +// - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL'] +// - C# will use enum classes in the Specification class located in the "Spv" namespace, +// e.g.: Spv.Specification.SourceLanguage.GLSL +// - D will have tokens under the "spv" module, e.g: spv.SourceLanguage.GLSL +// - Beef will use enum classes in the Specification class located in the "Spv" namespace, +// e.g.: Spv.Specification.SourceLanguage.GLSL +// +// Some tokens act like mask values, which can be OR'd together, +// while others are mutually exclusive. The mask-like ones have +// "Mask" in their name, and a parallel enum that has the shift +// amount (1 << x) for each corresponding enumerant. + +#ifndef spirv_HPP +#define spirv_HPP + +namespace spv { + +typedef unsigned int Id; + +#define SPV_VERSION 0x10600 +#define SPV_REVISION 1 + +static const unsigned int MagicNumber = 0x07230203; +static const unsigned int Version = 0x00010600; +static const unsigned int Revision = 1; +static const unsigned int OpCodeMask = 0xffff; +static const unsigned int WordCountShift = 16; + +enum SourceLanguage { + SourceLanguageUnknown = 0, + SourceLanguageESSL = 1, + SourceLanguageGLSL = 2, + SourceLanguageOpenCL_C = 3, + SourceLanguageOpenCL_CPP = 4, + SourceLanguageHLSL = 5, + SourceLanguageCPP_for_OpenCL = 6, + SourceLanguageSYCL = 7, + SourceLanguageMax = 0x7fffffff, +}; + +enum ExecutionModel { + ExecutionModelVertex = 0, + ExecutionModelTessellationControl = 1, + ExecutionModelTessellationEvaluation = 2, + ExecutionModelGeometry = 3, + ExecutionModelFragment = 4, + ExecutionModelGLCompute = 5, + ExecutionModelKernel = 6, + ExecutionModelTaskNV = 5267, + ExecutionModelMeshNV = 5268, + ExecutionModelRayGenerationKHR = 5313, + ExecutionModelRayGenerationNV = 5313, + ExecutionModelIntersectionKHR = 5314, + ExecutionModelIntersectionNV = 5314, + ExecutionModelAnyHitKHR = 5315, + ExecutionModelAnyHitNV = 5315, + ExecutionModelClosestHitKHR = 5316, + ExecutionModelClosestHitNV = 5316, + ExecutionModelMissKHR = 5317, + ExecutionModelMissNV = 5317, + ExecutionModelCallableKHR = 5318, + ExecutionModelCallableNV = 5318, + ExecutionModelTaskEXT = 5364, + ExecutionModelMeshEXT = 5365, + ExecutionModelMax = 0x7fffffff, +}; + +enum AddressingModel { + AddressingModelLogical = 0, + AddressingModelPhysical32 = 1, + AddressingModelPhysical64 = 2, + AddressingModelPhysicalStorageBuffer64 = 5348, + AddressingModelPhysicalStorageBuffer64EXT = 5348, + AddressingModelMax = 0x7fffffff, +}; + +enum MemoryModel { + MemoryModelSimple = 0, + MemoryModelGLSL450 = 1, + MemoryModelOpenCL = 2, + MemoryModelVulkan = 3, + MemoryModelVulkanKHR = 3, + MemoryModelMax = 0x7fffffff, +}; + +enum ExecutionMode { + ExecutionModeInvocations = 0, + ExecutionModeSpacingEqual = 1, + ExecutionModeSpacingFractionalEven = 2, + ExecutionModeSpacingFractionalOdd = 3, + ExecutionModeVertexOrderCw = 4, + ExecutionModeVertexOrderCcw = 5, + ExecutionModePixelCenterInteger = 6, + ExecutionModeOriginUpperLeft = 7, + ExecutionModeOriginLowerLeft = 8, + ExecutionModeEarlyFragmentTests = 9, + ExecutionModePointMode = 10, + ExecutionModeXfb = 11, + ExecutionModeDepthReplacing = 12, + ExecutionModeDepthGreater = 14, + ExecutionModeDepthLess = 15, + ExecutionModeDepthUnchanged = 16, + ExecutionModeLocalSize = 17, + ExecutionModeLocalSizeHint = 18, + ExecutionModeInputPoints = 19, + ExecutionModeInputLines = 20, + ExecutionModeInputLinesAdjacency = 21, + ExecutionModeTriangles = 22, + ExecutionModeInputTrianglesAdjacency = 23, + ExecutionModeQuads = 24, + ExecutionModeIsolines = 25, + ExecutionModeOutputVertices = 26, + ExecutionModeOutputPoints = 27, + ExecutionModeOutputLineStrip = 28, + ExecutionModeOutputTriangleStrip = 29, + ExecutionModeVecTypeHint = 30, + ExecutionModeContractionOff = 31, + ExecutionModeInitializer = 33, + ExecutionModeFinalizer = 34, + ExecutionModeSubgroupSize = 35, + ExecutionModeSubgroupsPerWorkgroup = 36, + ExecutionModeSubgroupsPerWorkgroupId = 37, + ExecutionModeLocalSizeId = 38, + ExecutionModeLocalSizeHintId = 39, + ExecutionModeNonCoherentColorAttachmentReadEXT = 4169, + ExecutionModeNonCoherentDepthAttachmentReadEXT = 4170, + ExecutionModeNonCoherentStencilAttachmentReadEXT = 4171, + ExecutionModeSubgroupUniformControlFlowKHR = 4421, + ExecutionModePostDepthCoverage = 4446, + ExecutionModeDenormPreserve = 4459, + ExecutionModeDenormFlushToZero = 4460, + ExecutionModeSignedZeroInfNanPreserve = 4461, + ExecutionModeRoundingModeRTE = 4462, + ExecutionModeRoundingModeRTZ = 4463, + ExecutionModeEarlyAndLateFragmentTestsAMD = 5017, + ExecutionModeStencilRefReplacingEXT = 5027, + ExecutionModeStencilRefUnchangedFrontAMD = 5079, + ExecutionModeStencilRefGreaterFrontAMD = 5080, + ExecutionModeStencilRefLessFrontAMD = 5081, + ExecutionModeStencilRefUnchangedBackAMD = 5082, + ExecutionModeStencilRefGreaterBackAMD = 5083, + ExecutionModeStencilRefLessBackAMD = 5084, + ExecutionModeOutputLinesEXT = 5269, + ExecutionModeOutputLinesNV = 5269, + ExecutionModeOutputPrimitivesEXT = 5270, + ExecutionModeOutputPrimitivesNV = 5270, + ExecutionModeDerivativeGroupQuadsNV = 5289, + ExecutionModeDerivativeGroupLinearNV = 5290, + ExecutionModeOutputTrianglesEXT = 5298, + ExecutionModeOutputTrianglesNV = 5298, + ExecutionModePixelInterlockOrderedEXT = 5366, + ExecutionModePixelInterlockUnorderedEXT = 5367, + ExecutionModeSampleInterlockOrderedEXT = 5368, + ExecutionModeSampleInterlockUnorderedEXT = 5369, + ExecutionModeShadingRateInterlockOrderedEXT = 5370, + ExecutionModeShadingRateInterlockUnorderedEXT = 5371, + ExecutionModeSharedLocalMemorySizeINTEL = 5618, + ExecutionModeRoundingModeRTPINTEL = 5620, + ExecutionModeRoundingModeRTNINTEL = 5621, + ExecutionModeFloatingPointModeALTINTEL = 5622, + ExecutionModeFloatingPointModeIEEEINTEL = 5623, + ExecutionModeMaxWorkgroupSizeINTEL = 5893, + ExecutionModeMaxWorkDimINTEL = 5894, + ExecutionModeNoGlobalOffsetINTEL = 5895, + ExecutionModeNumSIMDWorkitemsINTEL = 5896, + ExecutionModeSchedulerTargetFmaxMhzINTEL = 5903, + ExecutionModeStreamingInterfaceINTEL = 6154, + ExecutionModeNamedBarrierCountINTEL = 6417, + ExecutionModeMax = 0x7fffffff, +}; + +enum StorageClass { + StorageClassUniformConstant = 0, + StorageClassInput = 1, + StorageClassUniform = 2, + StorageClassOutput = 3, + StorageClassWorkgroup = 4, + StorageClassCrossWorkgroup = 5, + StorageClassPrivate = 6, + StorageClassFunction = 7, + StorageClassGeneric = 8, + StorageClassPushConstant = 9, + StorageClassAtomicCounter = 10, + StorageClassImage = 11, + StorageClassStorageBuffer = 12, + StorageClassTileImageEXT = 4172, + StorageClassCallableDataKHR = 5328, + StorageClassCallableDataNV = 5328, + StorageClassIncomingCallableDataKHR = 5329, + StorageClassIncomingCallableDataNV = 5329, + StorageClassRayPayloadKHR = 5338, + StorageClassRayPayloadNV = 5338, + StorageClassHitAttributeKHR = 5339, + StorageClassHitAttributeNV = 5339, + StorageClassIncomingRayPayloadKHR = 5342, + StorageClassIncomingRayPayloadNV = 5342, + StorageClassShaderRecordBufferKHR = 5343, + StorageClassShaderRecordBufferNV = 5343, + StorageClassPhysicalStorageBuffer = 5349, + StorageClassPhysicalStorageBufferEXT = 5349, + StorageClassHitObjectAttributeNV = 5385, + StorageClassTaskPayloadWorkgroupEXT = 5402, + StorageClassCodeSectionINTEL = 5605, + StorageClassDeviceOnlyINTEL = 5936, + StorageClassHostOnlyINTEL = 5937, + StorageClassMax = 0x7fffffff, +}; + +enum Dim { + Dim1D = 0, + Dim2D = 1, + Dim3D = 2, + DimCube = 3, + DimRect = 4, + DimBuffer = 5, + DimSubpassData = 6, + DimTileImageDataEXT = 4173, + DimMax = 0x7fffffff, +}; + +enum SamplerAddressingMode { + SamplerAddressingModeNone = 0, + SamplerAddressingModeClampToEdge = 1, + SamplerAddressingModeClamp = 2, + SamplerAddressingModeRepeat = 3, + SamplerAddressingModeRepeatMirrored = 4, + SamplerAddressingModeMax = 0x7fffffff, +}; + +enum SamplerFilterMode { + SamplerFilterModeNearest = 0, + SamplerFilterModeLinear = 1, + SamplerFilterModeMax = 0x7fffffff, +}; + +enum ImageFormat { + ImageFormatUnknown = 0, + ImageFormatRgba32f = 1, + ImageFormatRgba16f = 2, + ImageFormatR32f = 3, + ImageFormatRgba8 = 4, + ImageFormatRgba8Snorm = 5, + ImageFormatRg32f = 6, + ImageFormatRg16f = 7, + ImageFormatR11fG11fB10f = 8, + ImageFormatR16f = 9, + ImageFormatRgba16 = 10, + ImageFormatRgb10A2 = 11, + ImageFormatRg16 = 12, + ImageFormatRg8 = 13, + ImageFormatR16 = 14, + ImageFormatR8 = 15, + ImageFormatRgba16Snorm = 16, + ImageFormatRg16Snorm = 17, + ImageFormatRg8Snorm = 18, + ImageFormatR16Snorm = 19, + ImageFormatR8Snorm = 20, + ImageFormatRgba32i = 21, + ImageFormatRgba16i = 22, + ImageFormatRgba8i = 23, + ImageFormatR32i = 24, + ImageFormatRg32i = 25, + ImageFormatRg16i = 26, + ImageFormatRg8i = 27, + ImageFormatR16i = 28, + ImageFormatR8i = 29, + ImageFormatRgba32ui = 30, + ImageFormatRgba16ui = 31, + ImageFormatRgba8ui = 32, + ImageFormatR32ui = 33, + ImageFormatRgb10a2ui = 34, + ImageFormatRg32ui = 35, + ImageFormatRg16ui = 36, + ImageFormatRg8ui = 37, + ImageFormatR16ui = 38, + ImageFormatR8ui = 39, + ImageFormatR64ui = 40, + ImageFormatR64i = 41, + ImageFormatMax = 0x7fffffff, +}; + +enum ImageChannelOrder { + ImageChannelOrderR = 0, + ImageChannelOrderA = 1, + ImageChannelOrderRG = 2, + ImageChannelOrderRA = 3, + ImageChannelOrderRGB = 4, + ImageChannelOrderRGBA = 5, + ImageChannelOrderBGRA = 6, + ImageChannelOrderARGB = 7, + ImageChannelOrderIntensity = 8, + ImageChannelOrderLuminance = 9, + ImageChannelOrderRx = 10, + ImageChannelOrderRGx = 11, + ImageChannelOrderRGBx = 12, + ImageChannelOrderDepth = 13, + ImageChannelOrderDepthStencil = 14, + ImageChannelOrdersRGB = 15, + ImageChannelOrdersRGBx = 16, + ImageChannelOrdersRGBA = 17, + ImageChannelOrdersBGRA = 18, + ImageChannelOrderABGR = 19, + ImageChannelOrderMax = 0x7fffffff, +}; + +enum ImageChannelDataType { + ImageChannelDataTypeSnormInt8 = 0, + ImageChannelDataTypeSnormInt16 = 1, + ImageChannelDataTypeUnormInt8 = 2, + ImageChannelDataTypeUnormInt16 = 3, + ImageChannelDataTypeUnormShort565 = 4, + ImageChannelDataTypeUnormShort555 = 5, + ImageChannelDataTypeUnormInt101010 = 6, + ImageChannelDataTypeSignedInt8 = 7, + ImageChannelDataTypeSignedInt16 = 8, + ImageChannelDataTypeSignedInt32 = 9, + ImageChannelDataTypeUnsignedInt8 = 10, + ImageChannelDataTypeUnsignedInt16 = 11, + ImageChannelDataTypeUnsignedInt32 = 12, + ImageChannelDataTypeHalfFloat = 13, + ImageChannelDataTypeFloat = 14, + ImageChannelDataTypeUnormInt24 = 15, + ImageChannelDataTypeUnormInt101010_2 = 16, + ImageChannelDataTypeMax = 0x7fffffff, +}; + +enum ImageOperandsShift { + ImageOperandsBiasShift = 0, + ImageOperandsLodShift = 1, + ImageOperandsGradShift = 2, + ImageOperandsConstOffsetShift = 3, + ImageOperandsOffsetShift = 4, + ImageOperandsConstOffsetsShift = 5, + ImageOperandsSampleShift = 6, + ImageOperandsMinLodShift = 7, + ImageOperandsMakeTexelAvailableShift = 8, + ImageOperandsMakeTexelAvailableKHRShift = 8, + ImageOperandsMakeTexelVisibleShift = 9, + ImageOperandsMakeTexelVisibleKHRShift = 9, + ImageOperandsNonPrivateTexelShift = 10, + ImageOperandsNonPrivateTexelKHRShift = 10, + ImageOperandsVolatileTexelShift = 11, + ImageOperandsVolatileTexelKHRShift = 11, + ImageOperandsSignExtendShift = 12, + ImageOperandsZeroExtendShift = 13, + ImageOperandsNontemporalShift = 14, + ImageOperandsOffsetsShift = 16, + ImageOperandsMax = 0x7fffffff, +}; + +enum ImageOperandsMask { + ImageOperandsMaskNone = 0, + ImageOperandsBiasMask = 0x00000001, + ImageOperandsLodMask = 0x00000002, + ImageOperandsGradMask = 0x00000004, + ImageOperandsConstOffsetMask = 0x00000008, + ImageOperandsOffsetMask = 0x00000010, + ImageOperandsConstOffsetsMask = 0x00000020, + ImageOperandsSampleMask = 0x00000040, + ImageOperandsMinLodMask = 0x00000080, + ImageOperandsMakeTexelAvailableMask = 0x00000100, + ImageOperandsMakeTexelAvailableKHRMask = 0x00000100, + ImageOperandsMakeTexelVisibleMask = 0x00000200, + ImageOperandsMakeTexelVisibleKHRMask = 0x00000200, + ImageOperandsNonPrivateTexelMask = 0x00000400, + ImageOperandsNonPrivateTexelKHRMask = 0x00000400, + ImageOperandsVolatileTexelMask = 0x00000800, + ImageOperandsVolatileTexelKHRMask = 0x00000800, + ImageOperandsSignExtendMask = 0x00001000, + ImageOperandsZeroExtendMask = 0x00002000, + ImageOperandsNontemporalMask = 0x00004000, + ImageOperandsOffsetsMask = 0x00010000, +}; + +enum FPFastMathModeShift { + FPFastMathModeNotNaNShift = 0, + FPFastMathModeNotInfShift = 1, + FPFastMathModeNSZShift = 2, + FPFastMathModeAllowRecipShift = 3, + FPFastMathModeFastShift = 4, + FPFastMathModeAllowContractFastINTELShift = 16, + FPFastMathModeAllowReassocINTELShift = 17, + FPFastMathModeMax = 0x7fffffff, +}; + +enum FPFastMathModeMask { + FPFastMathModeMaskNone = 0, + FPFastMathModeNotNaNMask = 0x00000001, + FPFastMathModeNotInfMask = 0x00000002, + FPFastMathModeNSZMask = 0x00000004, + FPFastMathModeAllowRecipMask = 0x00000008, + FPFastMathModeFastMask = 0x00000010, + FPFastMathModeAllowContractFastINTELMask = 0x00010000, + FPFastMathModeAllowReassocINTELMask = 0x00020000, +}; + +enum FPRoundingMode { + FPRoundingModeRTE = 0, + FPRoundingModeRTZ = 1, + FPRoundingModeRTP = 2, + FPRoundingModeRTN = 3, + FPRoundingModeMax = 0x7fffffff, +}; + +enum LinkageType { + LinkageTypeExport = 0, + LinkageTypeImport = 1, + LinkageTypeLinkOnceODR = 2, + LinkageTypeMax = 0x7fffffff, +}; + +enum AccessQualifier { + AccessQualifierReadOnly = 0, + AccessQualifierWriteOnly = 1, + AccessQualifierReadWrite = 2, + AccessQualifierMax = 0x7fffffff, +}; + +enum FunctionParameterAttribute { + FunctionParameterAttributeZext = 0, + FunctionParameterAttributeSext = 1, + FunctionParameterAttributeByVal = 2, + FunctionParameterAttributeSret = 3, + FunctionParameterAttributeNoAlias = 4, + FunctionParameterAttributeNoCapture = 5, + FunctionParameterAttributeNoWrite = 6, + FunctionParameterAttributeNoReadWrite = 7, + FunctionParameterAttributeRuntimeAlignedINTEL = 5940, + FunctionParameterAttributeMax = 0x7fffffff, +}; + +enum Decoration { + DecorationRelaxedPrecision = 0, + DecorationSpecId = 1, + DecorationBlock = 2, + DecorationBufferBlock = 3, + DecorationRowMajor = 4, + DecorationColMajor = 5, + DecorationArrayStride = 6, + DecorationMatrixStride = 7, + DecorationGLSLShared = 8, + DecorationGLSLPacked = 9, + DecorationCPacked = 10, + DecorationBuiltIn = 11, + DecorationNoPerspective = 13, + DecorationFlat = 14, + DecorationPatch = 15, + DecorationCentroid = 16, + DecorationSample = 17, + DecorationInvariant = 18, + DecorationRestrict = 19, + DecorationAliased = 20, + DecorationVolatile = 21, + DecorationConstant = 22, + DecorationCoherent = 23, + DecorationNonWritable = 24, + DecorationNonReadable = 25, + DecorationUniform = 26, + DecorationUniformId = 27, + DecorationSaturatedConversion = 28, + DecorationStream = 29, + DecorationLocation = 30, + DecorationComponent = 31, + DecorationIndex = 32, + DecorationBinding = 33, + DecorationDescriptorSet = 34, + DecorationOffset = 35, + DecorationXfbBuffer = 36, + DecorationXfbStride = 37, + DecorationFuncParamAttr = 38, + DecorationFPRoundingMode = 39, + DecorationFPFastMathMode = 40, + DecorationLinkageAttributes = 41, + DecorationNoContraction = 42, + DecorationInputAttachmentIndex = 43, + DecorationAlignment = 44, + DecorationMaxByteOffset = 45, + DecorationAlignmentId = 46, + DecorationMaxByteOffsetId = 47, + DecorationNoSignedWrap = 4469, + DecorationNoUnsignedWrap = 4470, + DecorationWeightTextureQCOM = 4487, + DecorationBlockMatchTextureQCOM = 4488, + DecorationExplicitInterpAMD = 4999, + DecorationOverrideCoverageNV = 5248, + DecorationPassthroughNV = 5250, + DecorationViewportRelativeNV = 5252, + DecorationSecondaryViewportRelativeNV = 5256, + DecorationPerPrimitiveEXT = 5271, + DecorationPerPrimitiveNV = 5271, + DecorationPerViewNV = 5272, + DecorationPerTaskNV = 5273, + DecorationPerVertexKHR = 5285, + DecorationPerVertexNV = 5285, + DecorationNonUniform = 5300, + DecorationNonUniformEXT = 5300, + DecorationRestrictPointer = 5355, + DecorationRestrictPointerEXT = 5355, + DecorationAliasedPointer = 5356, + DecorationAliasedPointerEXT = 5356, + DecorationHitObjectShaderRecordBufferNV = 5386, + DecorationBindlessSamplerNV = 5398, + DecorationBindlessImageNV = 5399, + DecorationBoundSamplerNV = 5400, + DecorationBoundImageNV = 5401, + DecorationSIMTCallINTEL = 5599, + DecorationReferencedIndirectlyINTEL = 5602, + DecorationClobberINTEL = 5607, + DecorationSideEffectsINTEL = 5608, + DecorationVectorComputeVariableINTEL = 5624, + DecorationFuncParamIOKindINTEL = 5625, + DecorationVectorComputeFunctionINTEL = 5626, + DecorationStackCallINTEL = 5627, + DecorationGlobalVariableOffsetINTEL = 5628, + DecorationCounterBuffer = 5634, + DecorationHlslCounterBufferGOOGLE = 5634, + DecorationHlslSemanticGOOGLE = 5635, + DecorationUserSemantic = 5635, + DecorationUserTypeGOOGLE = 5636, + DecorationFunctionRoundingModeINTEL = 5822, + DecorationFunctionDenormModeINTEL = 5823, + DecorationRegisterINTEL = 5825, + DecorationMemoryINTEL = 5826, + DecorationNumbanksINTEL = 5827, + DecorationBankwidthINTEL = 5828, + DecorationMaxPrivateCopiesINTEL = 5829, + DecorationSinglepumpINTEL = 5830, + DecorationDoublepumpINTEL = 5831, + DecorationMaxReplicatesINTEL = 5832, + DecorationSimpleDualPortINTEL = 5833, + DecorationMergeINTEL = 5834, + DecorationBankBitsINTEL = 5835, + DecorationForcePow2DepthINTEL = 5836, + DecorationBurstCoalesceINTEL = 5899, + DecorationCacheSizeINTEL = 5900, + DecorationDontStaticallyCoalesceINTEL = 5901, + DecorationPrefetchINTEL = 5902, + DecorationStallEnableINTEL = 5905, + DecorationFuseLoopsInFunctionINTEL = 5907, + DecorationMathOpDSPModeINTEL = 5909, + DecorationAliasScopeINTEL = 5914, + DecorationNoAliasINTEL = 5915, + DecorationInitiationIntervalINTEL = 5917, + DecorationMaxConcurrencyINTEL = 5918, + DecorationPipelineEnableINTEL = 5919, + DecorationBufferLocationINTEL = 5921, + DecorationIOPipeStorageINTEL = 5944, + DecorationFunctionFloatingPointModeINTEL = 6080, + DecorationSingleElementVectorINTEL = 6085, + DecorationVectorComputeCallableFunctionINTEL = 6087, + DecorationMediaBlockIOINTEL = 6140, + DecorationConduitKernelArgumentINTEL = 6175, + DecorationRegisterMapKernelArgumentINTEL = 6176, + DecorationMMHostInterfaceAddressWidthINTEL = 6177, + DecorationMMHostInterfaceDataWidthINTEL = 6178, + DecorationMMHostInterfaceLatencyINTEL = 6179, + DecorationMMHostInterfaceReadWriteModeINTEL = 6180, + DecorationMMHostInterfaceMaxBurstINTEL = 6181, + DecorationMMHostInterfaceWaitRequestINTEL = 6182, + DecorationStableKernelArgumentINTEL = 6183, + DecorationMax = 0x7fffffff, +}; + +enum BuiltIn { + BuiltInPosition = 0, + BuiltInPointSize = 1, + BuiltInClipDistance = 3, + BuiltInCullDistance = 4, + BuiltInVertexId = 5, + BuiltInInstanceId = 6, + BuiltInPrimitiveId = 7, + BuiltInInvocationId = 8, + BuiltInLayer = 9, + BuiltInViewportIndex = 10, + BuiltInTessLevelOuter = 11, + BuiltInTessLevelInner = 12, + BuiltInTessCoord = 13, + BuiltInPatchVertices = 14, + BuiltInFragCoord = 15, + BuiltInPointCoord = 16, + BuiltInFrontFacing = 17, + BuiltInSampleId = 18, + BuiltInSamplePosition = 19, + BuiltInSampleMask = 20, + BuiltInFragDepth = 22, + BuiltInHelperInvocation = 23, + BuiltInNumWorkgroups = 24, + BuiltInWorkgroupSize = 25, + BuiltInWorkgroupId = 26, + BuiltInLocalInvocationId = 27, + BuiltInGlobalInvocationId = 28, + BuiltInLocalInvocationIndex = 29, + BuiltInWorkDim = 30, + BuiltInGlobalSize = 31, + BuiltInEnqueuedWorkgroupSize = 32, + BuiltInGlobalOffset = 33, + BuiltInGlobalLinearId = 34, + BuiltInSubgroupSize = 36, + BuiltInSubgroupMaxSize = 37, + BuiltInNumSubgroups = 38, + BuiltInNumEnqueuedSubgroups = 39, + BuiltInSubgroupId = 40, + BuiltInSubgroupLocalInvocationId = 41, + BuiltInVertexIndex = 42, + BuiltInInstanceIndex = 43, + BuiltInCoreIDARM = 4160, + BuiltInCoreCountARM = 4161, + BuiltInCoreMaxIDARM = 4162, + BuiltInWarpIDARM = 4163, + BuiltInWarpMaxIDARM = 4164, + BuiltInSubgroupEqMask = 4416, + BuiltInSubgroupEqMaskKHR = 4416, + BuiltInSubgroupGeMask = 4417, + BuiltInSubgroupGeMaskKHR = 4417, + BuiltInSubgroupGtMask = 4418, + BuiltInSubgroupGtMaskKHR = 4418, + BuiltInSubgroupLeMask = 4419, + BuiltInSubgroupLeMaskKHR = 4419, + BuiltInSubgroupLtMask = 4420, + BuiltInSubgroupLtMaskKHR = 4420, + BuiltInBaseVertex = 4424, + BuiltInBaseInstance = 4425, + BuiltInDrawIndex = 4426, + BuiltInPrimitiveShadingRateKHR = 4432, + BuiltInDeviceIndex = 4438, + BuiltInViewIndex = 4440, + BuiltInShadingRateKHR = 4444, + BuiltInBaryCoordNoPerspAMD = 4992, + BuiltInBaryCoordNoPerspCentroidAMD = 4993, + BuiltInBaryCoordNoPerspSampleAMD = 4994, + BuiltInBaryCoordSmoothAMD = 4995, + BuiltInBaryCoordSmoothCentroidAMD = 4996, + BuiltInBaryCoordSmoothSampleAMD = 4997, + BuiltInBaryCoordPullModelAMD = 4998, + BuiltInFragStencilRefEXT = 5014, + BuiltInViewportMaskNV = 5253, + BuiltInSecondaryPositionNV = 5257, + BuiltInSecondaryViewportMaskNV = 5258, + BuiltInPositionPerViewNV = 5261, + BuiltInViewportMaskPerViewNV = 5262, + BuiltInFullyCoveredEXT = 5264, + BuiltInTaskCountNV = 5274, + BuiltInPrimitiveCountNV = 5275, + BuiltInPrimitiveIndicesNV = 5276, + BuiltInClipDistancePerViewNV = 5277, + BuiltInCullDistancePerViewNV = 5278, + BuiltInLayerPerViewNV = 5279, + BuiltInMeshViewCountNV = 5280, + BuiltInMeshViewIndicesNV = 5281, + BuiltInBaryCoordKHR = 5286, + BuiltInBaryCoordNV = 5286, + BuiltInBaryCoordNoPerspKHR = 5287, + BuiltInBaryCoordNoPerspNV = 5287, + BuiltInFragSizeEXT = 5292, + BuiltInFragmentSizeNV = 5292, + BuiltInFragInvocationCountEXT = 5293, + BuiltInInvocationsPerPixelNV = 5293, + BuiltInPrimitivePointIndicesEXT = 5294, + BuiltInPrimitiveLineIndicesEXT = 5295, + BuiltInPrimitiveTriangleIndicesEXT = 5296, + BuiltInCullPrimitiveEXT = 5299, + BuiltInLaunchIdKHR = 5319, + BuiltInLaunchIdNV = 5319, + BuiltInLaunchSizeKHR = 5320, + BuiltInLaunchSizeNV = 5320, + BuiltInWorldRayOriginKHR = 5321, + BuiltInWorldRayOriginNV = 5321, + BuiltInWorldRayDirectionKHR = 5322, + BuiltInWorldRayDirectionNV = 5322, + BuiltInObjectRayOriginKHR = 5323, + BuiltInObjectRayOriginNV = 5323, + BuiltInObjectRayDirectionKHR = 5324, + BuiltInObjectRayDirectionNV = 5324, + BuiltInRayTminKHR = 5325, + BuiltInRayTminNV = 5325, + BuiltInRayTmaxKHR = 5326, + BuiltInRayTmaxNV = 5326, + BuiltInInstanceCustomIndexKHR = 5327, + BuiltInInstanceCustomIndexNV = 5327, + BuiltInObjectToWorldKHR = 5330, + BuiltInObjectToWorldNV = 5330, + BuiltInWorldToObjectKHR = 5331, + BuiltInWorldToObjectNV = 5331, + BuiltInHitTNV = 5332, + BuiltInHitKindKHR = 5333, + BuiltInHitKindNV = 5333, + BuiltInCurrentRayTimeNV = 5334, + BuiltInHitTriangleVertexPositionsKHR = 5335, + BuiltInHitMicroTriangleVertexPositionsNV = 5337, + BuiltInHitMicroTriangleVertexBarycentricsNV = 5344, + BuiltInHitKindFrontFacingMicroTriangleNV = 5405, + BuiltInHitKindBackFacingMicroTriangleNV = 5406, + BuiltInIncomingRayFlagsKHR = 5351, + BuiltInIncomingRayFlagsNV = 5351, + BuiltInRayGeometryIndexKHR = 5352, + BuiltInWarpsPerSMNV = 5374, + BuiltInSMCountNV = 5375, + BuiltInWarpIDNV = 5376, + BuiltInSMIDNV = 5377, + BuiltInCullMaskKHR = 6021, + BuiltInMax = 0x7fffffff, +}; + +enum SelectionControlShift { + SelectionControlFlattenShift = 0, + SelectionControlDontFlattenShift = 1, + SelectionControlMax = 0x7fffffff, +}; + +enum SelectionControlMask { + SelectionControlMaskNone = 0, + SelectionControlFlattenMask = 0x00000001, + SelectionControlDontFlattenMask = 0x00000002, +}; + +enum LoopControlShift { + LoopControlUnrollShift = 0, + LoopControlDontUnrollShift = 1, + LoopControlDependencyInfiniteShift = 2, + LoopControlDependencyLengthShift = 3, + LoopControlMinIterationsShift = 4, + LoopControlMaxIterationsShift = 5, + LoopControlIterationMultipleShift = 6, + LoopControlPeelCountShift = 7, + LoopControlPartialCountShift = 8, + LoopControlInitiationIntervalINTELShift = 16, + LoopControlMaxConcurrencyINTELShift = 17, + LoopControlDependencyArrayINTELShift = 18, + LoopControlPipelineEnableINTELShift = 19, + LoopControlLoopCoalesceINTELShift = 20, + LoopControlMaxInterleavingINTELShift = 21, + LoopControlSpeculatedIterationsINTELShift = 22, + LoopControlNoFusionINTELShift = 23, + LoopControlLoopCountINTELShift = 24, + LoopControlMaxReinvocationDelayINTELShift = 25, + LoopControlMax = 0x7fffffff, +}; + +enum LoopControlMask { + LoopControlMaskNone = 0, + LoopControlUnrollMask = 0x00000001, + LoopControlDontUnrollMask = 0x00000002, + LoopControlDependencyInfiniteMask = 0x00000004, + LoopControlDependencyLengthMask = 0x00000008, + LoopControlMinIterationsMask = 0x00000010, + LoopControlMaxIterationsMask = 0x00000020, + LoopControlIterationMultipleMask = 0x00000040, + LoopControlPeelCountMask = 0x00000080, + LoopControlPartialCountMask = 0x00000100, + LoopControlInitiationIntervalINTELMask = 0x00010000, + LoopControlMaxConcurrencyINTELMask = 0x00020000, + LoopControlDependencyArrayINTELMask = 0x00040000, + LoopControlPipelineEnableINTELMask = 0x00080000, + LoopControlLoopCoalesceINTELMask = 0x00100000, + LoopControlMaxInterleavingINTELMask = 0x00200000, + LoopControlSpeculatedIterationsINTELMask = 0x00400000, + LoopControlNoFusionINTELMask = 0x00800000, + LoopControlLoopCountINTELMask = 0x01000000, + LoopControlMaxReinvocationDelayINTELMask = 0x02000000, +}; + +enum FunctionControlShift { + FunctionControlInlineShift = 0, + FunctionControlDontInlineShift = 1, + FunctionControlPureShift = 2, + FunctionControlConstShift = 3, + FunctionControlOptNoneINTELShift = 16, + FunctionControlMax = 0x7fffffff, +}; + +enum FunctionControlMask { + FunctionControlMaskNone = 0, + FunctionControlInlineMask = 0x00000001, + FunctionControlDontInlineMask = 0x00000002, + FunctionControlPureMask = 0x00000004, + FunctionControlConstMask = 0x00000008, + FunctionControlOptNoneINTELMask = 0x00010000, +}; + +enum MemorySemanticsShift { + MemorySemanticsAcquireShift = 1, + MemorySemanticsReleaseShift = 2, + MemorySemanticsAcquireReleaseShift = 3, + MemorySemanticsSequentiallyConsistentShift = 4, + MemorySemanticsUniformMemoryShift = 6, + MemorySemanticsSubgroupMemoryShift = 7, + MemorySemanticsWorkgroupMemoryShift = 8, + MemorySemanticsCrossWorkgroupMemoryShift = 9, + MemorySemanticsAtomicCounterMemoryShift = 10, + MemorySemanticsImageMemoryShift = 11, + MemorySemanticsOutputMemoryShift = 12, + MemorySemanticsOutputMemoryKHRShift = 12, + MemorySemanticsMakeAvailableShift = 13, + MemorySemanticsMakeAvailableKHRShift = 13, + MemorySemanticsMakeVisibleShift = 14, + MemorySemanticsMakeVisibleKHRShift = 14, + MemorySemanticsVolatileShift = 15, + MemorySemanticsMax = 0x7fffffff, +}; + +enum MemorySemanticsMask { + MemorySemanticsMaskNone = 0, + MemorySemanticsAcquireMask = 0x00000002, + MemorySemanticsReleaseMask = 0x00000004, + MemorySemanticsAcquireReleaseMask = 0x00000008, + MemorySemanticsSequentiallyConsistentMask = 0x00000010, + MemorySemanticsUniformMemoryMask = 0x00000040, + MemorySemanticsSubgroupMemoryMask = 0x00000080, + MemorySemanticsWorkgroupMemoryMask = 0x00000100, + MemorySemanticsCrossWorkgroupMemoryMask = 0x00000200, + MemorySemanticsAtomicCounterMemoryMask = 0x00000400, + MemorySemanticsImageMemoryMask = 0x00000800, + MemorySemanticsOutputMemoryMask = 0x00001000, + MemorySemanticsOutputMemoryKHRMask = 0x00001000, + MemorySemanticsMakeAvailableMask = 0x00002000, + MemorySemanticsMakeAvailableKHRMask = 0x00002000, + MemorySemanticsMakeVisibleMask = 0x00004000, + MemorySemanticsMakeVisibleKHRMask = 0x00004000, + MemorySemanticsVolatileMask = 0x00008000, +}; + +enum MemoryAccessShift { + MemoryAccessVolatileShift = 0, + MemoryAccessAlignedShift = 1, + MemoryAccessNontemporalShift = 2, + MemoryAccessMakePointerAvailableShift = 3, + MemoryAccessMakePointerAvailableKHRShift = 3, + MemoryAccessMakePointerVisibleShift = 4, + MemoryAccessMakePointerVisibleKHRShift = 4, + MemoryAccessNonPrivatePointerShift = 5, + MemoryAccessNonPrivatePointerKHRShift = 5, + MemoryAccessAliasScopeINTELMaskShift = 16, + MemoryAccessNoAliasINTELMaskShift = 17, + MemoryAccessMax = 0x7fffffff, +}; + +enum MemoryAccessMask { + MemoryAccessMaskNone = 0, + MemoryAccessVolatileMask = 0x00000001, + MemoryAccessAlignedMask = 0x00000002, + MemoryAccessNontemporalMask = 0x00000004, + MemoryAccessMakePointerAvailableMask = 0x00000008, + MemoryAccessMakePointerAvailableKHRMask = 0x00000008, + MemoryAccessMakePointerVisibleMask = 0x00000010, + MemoryAccessMakePointerVisibleKHRMask = 0x00000010, + MemoryAccessNonPrivatePointerMask = 0x00000020, + MemoryAccessNonPrivatePointerKHRMask = 0x00000020, + MemoryAccessAliasScopeINTELMaskMask = 0x00010000, + MemoryAccessNoAliasINTELMaskMask = 0x00020000, +}; + +enum Scope { + ScopeCrossDevice = 0, + ScopeDevice = 1, + ScopeWorkgroup = 2, + ScopeSubgroup = 3, + ScopeInvocation = 4, + ScopeQueueFamily = 5, + ScopeQueueFamilyKHR = 5, + ScopeShaderCallKHR = 6, + ScopeMax = 0x7fffffff, +}; + +enum GroupOperation { + GroupOperationReduce = 0, + GroupOperationInclusiveScan = 1, + GroupOperationExclusiveScan = 2, + GroupOperationClusteredReduce = 3, + GroupOperationPartitionedReduceNV = 6, + GroupOperationPartitionedInclusiveScanNV = 7, + GroupOperationPartitionedExclusiveScanNV = 8, + GroupOperationMax = 0x7fffffff, +}; + +enum KernelEnqueueFlags { + KernelEnqueueFlagsNoWait = 0, + KernelEnqueueFlagsWaitKernel = 1, + KernelEnqueueFlagsWaitWorkGroup = 2, + KernelEnqueueFlagsMax = 0x7fffffff, +}; + +enum KernelProfilingInfoShift { + KernelProfilingInfoCmdExecTimeShift = 0, + KernelProfilingInfoMax = 0x7fffffff, +}; + +enum KernelProfilingInfoMask { + KernelProfilingInfoMaskNone = 0, + KernelProfilingInfoCmdExecTimeMask = 0x00000001, +}; + +enum Capability { + CapabilityMatrix = 0, + CapabilityShader = 1, + CapabilityGeometry = 2, + CapabilityTessellation = 3, + CapabilityAddresses = 4, + CapabilityLinkage = 5, + CapabilityKernel = 6, + CapabilityVector16 = 7, + CapabilityFloat16Buffer = 8, + CapabilityFloat16 = 9, + CapabilityFloat64 = 10, + CapabilityInt64 = 11, + CapabilityInt64Atomics = 12, + CapabilityImageBasic = 13, + CapabilityImageReadWrite = 14, + CapabilityImageMipmap = 15, + CapabilityPipes = 17, + CapabilityGroups = 18, + CapabilityDeviceEnqueue = 19, + CapabilityLiteralSampler = 20, + CapabilityAtomicStorage = 21, + CapabilityInt16 = 22, + CapabilityTessellationPointSize = 23, + CapabilityGeometryPointSize = 24, + CapabilityImageGatherExtended = 25, + CapabilityStorageImageMultisample = 27, + CapabilityUniformBufferArrayDynamicIndexing = 28, + CapabilitySampledImageArrayDynamicIndexing = 29, + CapabilityStorageBufferArrayDynamicIndexing = 30, + CapabilityStorageImageArrayDynamicIndexing = 31, + CapabilityClipDistance = 32, + CapabilityCullDistance = 33, + CapabilityImageCubeArray = 34, + CapabilitySampleRateShading = 35, + CapabilityImageRect = 36, + CapabilitySampledRect = 37, + CapabilityGenericPointer = 38, + CapabilityInt8 = 39, + CapabilityInputAttachment = 40, + CapabilitySparseResidency = 41, + CapabilityMinLod = 42, + CapabilitySampled1D = 43, + CapabilityImage1D = 44, + CapabilitySampledCubeArray = 45, + CapabilitySampledBuffer = 46, + CapabilityImageBuffer = 47, + CapabilityImageMSArray = 48, + CapabilityStorageImageExtendedFormats = 49, + CapabilityImageQuery = 50, + CapabilityDerivativeControl = 51, + CapabilityInterpolationFunction = 52, + CapabilityTransformFeedback = 53, + CapabilityGeometryStreams = 54, + CapabilityStorageImageReadWithoutFormat = 55, + CapabilityStorageImageWriteWithoutFormat = 56, + CapabilityMultiViewport = 57, + CapabilitySubgroupDispatch = 58, + CapabilityNamedBarrier = 59, + CapabilityPipeStorage = 60, + CapabilityGroupNonUniform = 61, + CapabilityGroupNonUniformVote = 62, + CapabilityGroupNonUniformArithmetic = 63, + CapabilityGroupNonUniformBallot = 64, + CapabilityGroupNonUniformShuffle = 65, + CapabilityGroupNonUniformShuffleRelative = 66, + CapabilityGroupNonUniformClustered = 67, + CapabilityGroupNonUniformQuad = 68, + CapabilityShaderLayer = 69, + CapabilityShaderViewportIndex = 70, + CapabilityUniformDecoration = 71, + CapabilityCoreBuiltinsARM = 4165, + CapabilityTileImageColorReadAccessEXT = 4166, + CapabilityTileImageDepthReadAccessEXT = 4167, + CapabilityTileImageStencilReadAccessEXT = 4168, + CapabilityFragmentShadingRateKHR = 4422, + CapabilitySubgroupBallotKHR = 4423, + CapabilityDrawParameters = 4427, + CapabilityWorkgroupMemoryExplicitLayoutKHR = 4428, + CapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR = 4429, + CapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR = 4430, + CapabilitySubgroupVoteKHR = 4431, + CapabilityStorageBuffer16BitAccess = 4433, + CapabilityStorageUniformBufferBlock16 = 4433, + CapabilityStorageUniform16 = 4434, + CapabilityUniformAndStorageBuffer16BitAccess = 4434, + CapabilityStoragePushConstant16 = 4435, + CapabilityStorageInputOutput16 = 4436, + CapabilityDeviceGroup = 4437, + CapabilityMultiView = 4439, + CapabilityVariablePointersStorageBuffer = 4441, + CapabilityVariablePointers = 4442, + CapabilityAtomicStorageOps = 4445, + CapabilitySampleMaskPostDepthCoverage = 4447, + CapabilityStorageBuffer8BitAccess = 4448, + CapabilityUniformAndStorageBuffer8BitAccess = 4449, + CapabilityStoragePushConstant8 = 4450, + CapabilityDenormPreserve = 4464, + CapabilityDenormFlushToZero = 4465, + CapabilitySignedZeroInfNanPreserve = 4466, + CapabilityRoundingModeRTE = 4467, + CapabilityRoundingModeRTZ = 4468, + CapabilityRayQueryProvisionalKHR = 4471, + CapabilityRayQueryKHR = 4472, + CapabilityRayTraversalPrimitiveCullingKHR = 4478, + CapabilityRayTracingKHR = 4479, + CapabilityTextureSampleWeightedQCOM = 4484, + CapabilityTextureBoxFilterQCOM = 4485, + CapabilityTextureBlockMatchQCOM = 4486, + CapabilityFloat16ImageAMD = 5008, + CapabilityImageGatherBiasLodAMD = 5009, + CapabilityFragmentMaskAMD = 5010, + CapabilityStencilExportEXT = 5013, + CapabilityImageReadWriteLodAMD = 5015, + CapabilityInt64ImageEXT = 5016, + CapabilityShaderClockKHR = 5055, + CapabilitySampleMaskOverrideCoverageNV = 5249, + CapabilityGeometryShaderPassthroughNV = 5251, + CapabilityShaderViewportIndexLayerEXT = 5254, + CapabilityShaderViewportIndexLayerNV = 5254, + CapabilityShaderViewportMaskNV = 5255, + CapabilityShaderStereoViewNV = 5259, + CapabilityPerViewAttributesNV = 5260, + CapabilityFragmentFullyCoveredEXT = 5265, + CapabilityMeshShadingNV = 5266, + CapabilityImageFootprintNV = 5282, + CapabilityMeshShadingEXT = 5283, + CapabilityFragmentBarycentricKHR = 5284, + CapabilityFragmentBarycentricNV = 5284, + CapabilityComputeDerivativeGroupQuadsNV = 5288, + CapabilityFragmentDensityEXT = 5291, + CapabilityShadingRateNV = 5291, + CapabilityGroupNonUniformPartitionedNV = 5297, + CapabilityShaderNonUniform = 5301, + CapabilityShaderNonUniformEXT = 5301, + CapabilityRuntimeDescriptorArray = 5302, + CapabilityRuntimeDescriptorArrayEXT = 5302, + CapabilityInputAttachmentArrayDynamicIndexing = 5303, + CapabilityInputAttachmentArrayDynamicIndexingEXT = 5303, + CapabilityUniformTexelBufferArrayDynamicIndexing = 5304, + CapabilityUniformTexelBufferArrayDynamicIndexingEXT = 5304, + CapabilityStorageTexelBufferArrayDynamicIndexing = 5305, + CapabilityStorageTexelBufferArrayDynamicIndexingEXT = 5305, + CapabilityUniformBufferArrayNonUniformIndexing = 5306, + CapabilityUniformBufferArrayNonUniformIndexingEXT = 5306, + CapabilitySampledImageArrayNonUniformIndexing = 5307, + CapabilitySampledImageArrayNonUniformIndexingEXT = 5307, + CapabilityStorageBufferArrayNonUniformIndexing = 5308, + CapabilityStorageBufferArrayNonUniformIndexingEXT = 5308, + CapabilityStorageImageArrayNonUniformIndexing = 5309, + CapabilityStorageImageArrayNonUniformIndexingEXT = 5309, + CapabilityInputAttachmentArrayNonUniformIndexing = 5310, + CapabilityInputAttachmentArrayNonUniformIndexingEXT = 5310, + CapabilityUniformTexelBufferArrayNonUniformIndexing = 5311, + CapabilityUniformTexelBufferArrayNonUniformIndexingEXT = 5311, + CapabilityStorageTexelBufferArrayNonUniformIndexing = 5312, + CapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312, + CapabilityRayTracingPositionFetchKHR = 5336, + CapabilityRayTracingNV = 5340, + CapabilityRayTracingMotionBlurNV = 5341, + CapabilityVulkanMemoryModel = 5345, + CapabilityVulkanMemoryModelKHR = 5345, + CapabilityVulkanMemoryModelDeviceScope = 5346, + CapabilityVulkanMemoryModelDeviceScopeKHR = 5346, + CapabilityPhysicalStorageBufferAddresses = 5347, + CapabilityPhysicalStorageBufferAddressesEXT = 5347, + CapabilityComputeDerivativeGroupLinearNV = 5350, + CapabilityRayTracingProvisionalKHR = 5353, + CapabilityCooperativeMatrixNV = 5357, + CapabilityFragmentShaderSampleInterlockEXT = 5363, + CapabilityFragmentShaderShadingRateInterlockEXT = 5372, + CapabilityShaderSMBuiltinsNV = 5373, + CapabilityFragmentShaderPixelInterlockEXT = 5378, + CapabilityDemoteToHelperInvocation = 5379, + CapabilityDemoteToHelperInvocationEXT = 5379, + CapabilityDisplacementMicromapNV = 5380, + CapabilityRayTracingDisplacementMicromapNV = 5409, + CapabilityRayTracingOpacityMicromapEXT = 5381, + CapabilityShaderInvocationReorderNV = 5383, + CapabilityBindlessTextureNV = 5390, + CapabilityRayQueryPositionFetchKHR = 5391, + CapabilitySubgroupShuffleINTEL = 5568, + CapabilitySubgroupBufferBlockIOINTEL = 5569, + CapabilitySubgroupImageBlockIOINTEL = 5570, + CapabilitySubgroupImageMediaBlockIOINTEL = 5579, + CapabilityRoundToInfinityINTEL = 5582, + CapabilityFloatingPointModeINTEL = 5583, + CapabilityIntegerFunctions2INTEL = 5584, + CapabilityFunctionPointersINTEL = 5603, + CapabilityIndirectReferencesINTEL = 5604, + CapabilityAsmINTEL = 5606, + CapabilityAtomicFloat32MinMaxEXT = 5612, + CapabilityAtomicFloat64MinMaxEXT = 5613, + CapabilityAtomicFloat16MinMaxEXT = 5616, + CapabilityVectorComputeINTEL = 5617, + CapabilityVectorAnyINTEL = 5619, + CapabilityExpectAssumeKHR = 5629, + CapabilitySubgroupAvcMotionEstimationINTEL = 5696, + CapabilitySubgroupAvcMotionEstimationIntraINTEL = 5697, + CapabilitySubgroupAvcMotionEstimationChromaINTEL = 5698, + CapabilityVariableLengthArrayINTEL = 5817, + CapabilityFunctionFloatControlINTEL = 5821, + CapabilityFPGAMemoryAttributesINTEL = 5824, + CapabilityFPFastMathModeINTEL = 5837, + CapabilityArbitraryPrecisionIntegersINTEL = 5844, + CapabilityArbitraryPrecisionFloatingPointINTEL = 5845, + CapabilityUnstructuredLoopControlsINTEL = 5886, + CapabilityFPGALoopControlsINTEL = 5888, + CapabilityKernelAttributesINTEL = 5892, + CapabilityFPGAKernelAttributesINTEL = 5897, + CapabilityFPGAMemoryAccessesINTEL = 5898, + CapabilityFPGAClusterAttributesINTEL = 5904, + CapabilityLoopFuseINTEL = 5906, + CapabilityFPGADSPControlINTEL = 5908, + CapabilityMemoryAccessAliasingINTEL = 5910, + CapabilityFPGAInvocationPipeliningAttributesINTEL = 5916, + CapabilityFPGABufferLocationINTEL = 5920, + CapabilityArbitraryPrecisionFixedPointINTEL = 5922, + CapabilityUSMStorageClassesINTEL = 5935, + CapabilityRuntimeAlignedAttributeINTEL = 5939, + CapabilityIOPipesINTEL = 5943, + CapabilityBlockingPipesINTEL = 5945, + CapabilityFPGARegINTEL = 5948, + CapabilityDotProductInputAll = 6016, + CapabilityDotProductInputAllKHR = 6016, + CapabilityDotProductInput4x8Bit = 6017, + CapabilityDotProductInput4x8BitKHR = 6017, + CapabilityDotProductInput4x8BitPacked = 6018, + CapabilityDotProductInput4x8BitPackedKHR = 6018, + CapabilityDotProduct = 6019, + CapabilityDotProductKHR = 6019, + CapabilityRayCullMaskKHR = 6020, + CapabilityCooperativeMatrixKHR = 6022, + CapabilityBitInstructions = 6025, + CapabilityGroupNonUniformRotateKHR = 6026, + CapabilityAtomicFloat32AddEXT = 6033, + CapabilityAtomicFloat64AddEXT = 6034, + CapabilityLongConstantCompositeINTEL = 6089, + CapabilityOptNoneINTEL = 6094, + CapabilityAtomicFloat16AddEXT = 6095, + CapabilityDebugInfoModuleINTEL = 6114, + CapabilitySplitBarrierINTEL = 6141, + CapabilityFPGAArgumentInterfacesINTEL = 6174, + CapabilityGroupUniformArithmeticKHR = 6400, + CapabilityMax = 0x7fffffff, +}; + +enum RayFlagsShift { + RayFlagsOpaqueKHRShift = 0, + RayFlagsNoOpaqueKHRShift = 1, + RayFlagsTerminateOnFirstHitKHRShift = 2, + RayFlagsSkipClosestHitShaderKHRShift = 3, + RayFlagsCullBackFacingTrianglesKHRShift = 4, + RayFlagsCullFrontFacingTrianglesKHRShift = 5, + RayFlagsCullOpaqueKHRShift = 6, + RayFlagsCullNoOpaqueKHRShift = 7, + RayFlagsSkipTrianglesKHRShift = 8, + RayFlagsSkipAABBsKHRShift = 9, + RayFlagsForceOpacityMicromap2StateEXTShift = 10, + RayFlagsMax = 0x7fffffff, +}; + +enum RayFlagsMask { + RayFlagsMaskNone = 0, + RayFlagsOpaqueKHRMask = 0x00000001, + RayFlagsNoOpaqueKHRMask = 0x00000002, + RayFlagsTerminateOnFirstHitKHRMask = 0x00000004, + RayFlagsSkipClosestHitShaderKHRMask = 0x00000008, + RayFlagsCullBackFacingTrianglesKHRMask = 0x00000010, + RayFlagsCullFrontFacingTrianglesKHRMask = 0x00000020, + RayFlagsCullOpaqueKHRMask = 0x00000040, + RayFlagsCullNoOpaqueKHRMask = 0x00000080, + RayFlagsSkipTrianglesKHRMask = 0x00000100, + RayFlagsSkipAABBsKHRMask = 0x00000200, + RayFlagsForceOpacityMicromap2StateEXTMask = 0x00000400, +}; + +enum RayQueryIntersection { + RayQueryIntersectionRayQueryCandidateIntersectionKHR = 0, + RayQueryIntersectionRayQueryCommittedIntersectionKHR = 1, + RayQueryIntersectionMax = 0x7fffffff, +}; + +enum RayQueryCommittedIntersectionType { + RayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionNoneKHR = 0, + RayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionTriangleKHR = 1, + RayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionGeneratedKHR = 2, + RayQueryCommittedIntersectionTypeMax = 0x7fffffff, +}; + +enum RayQueryCandidateIntersectionType { + RayQueryCandidateIntersectionTypeRayQueryCandidateIntersectionTriangleKHR = 0, + RayQueryCandidateIntersectionTypeRayQueryCandidateIntersectionAABBKHR = 1, + RayQueryCandidateIntersectionTypeMax = 0x7fffffff, +}; + +enum FragmentShadingRateShift { + FragmentShadingRateVertical2PixelsShift = 0, + FragmentShadingRateVertical4PixelsShift = 1, + FragmentShadingRateHorizontal2PixelsShift = 2, + FragmentShadingRateHorizontal4PixelsShift = 3, + FragmentShadingRateMax = 0x7fffffff, +}; + +enum FragmentShadingRateMask { + FragmentShadingRateMaskNone = 0, + FragmentShadingRateVertical2PixelsMask = 0x00000001, + FragmentShadingRateVertical4PixelsMask = 0x00000002, + FragmentShadingRateHorizontal2PixelsMask = 0x00000004, + FragmentShadingRateHorizontal4PixelsMask = 0x00000008, +}; + +enum FPDenormMode { + FPDenormModePreserve = 0, + FPDenormModeFlushToZero = 1, + FPDenormModeMax = 0x7fffffff, +}; + +enum FPOperationMode { + FPOperationModeIEEE = 0, + FPOperationModeALT = 1, + FPOperationModeMax = 0x7fffffff, +}; + +enum QuantizationModes { + QuantizationModesTRN = 0, + QuantizationModesTRN_ZERO = 1, + QuantizationModesRND = 2, + QuantizationModesRND_ZERO = 3, + QuantizationModesRND_INF = 4, + QuantizationModesRND_MIN_INF = 5, + QuantizationModesRND_CONV = 6, + QuantizationModesRND_CONV_ODD = 7, + QuantizationModesMax = 0x7fffffff, +}; + +enum OverflowModes { + OverflowModesWRAP = 0, + OverflowModesSAT = 1, + OverflowModesSAT_ZERO = 2, + OverflowModesSAT_SYM = 3, + OverflowModesMax = 0x7fffffff, +}; + +enum PackedVectorFormat { + PackedVectorFormatPackedVectorFormat4x8Bit = 0, + PackedVectorFormatPackedVectorFormat4x8BitKHR = 0, + PackedVectorFormatMax = 0x7fffffff, +}; + +enum CooperativeMatrixOperandsShift { + CooperativeMatrixOperandsMatrixASignedComponentsShift = 0, + CooperativeMatrixOperandsMatrixBSignedComponentsShift = 1, + CooperativeMatrixOperandsMatrixCSignedComponentsShift = 2, + CooperativeMatrixOperandsMatrixResultSignedComponentsShift = 3, + CooperativeMatrixOperandsSaturatingAccumulationShift = 4, + CooperativeMatrixOperandsMax = 0x7fffffff, +}; + +enum CooperativeMatrixOperandsMask { + CooperativeMatrixOperandsMaskNone = 0, + CooperativeMatrixOperandsMatrixASignedComponentsMask = 0x00000001, + CooperativeMatrixOperandsMatrixBSignedComponentsMask = 0x00000002, + CooperativeMatrixOperandsMatrixCSignedComponentsMask = 0x00000004, + CooperativeMatrixOperandsMatrixResultSignedComponentsMask = 0x00000008, + CooperativeMatrixOperandsSaturatingAccumulationMask = 0x00000010, +}; + +enum CooperativeMatrixLayout { + CooperativeMatrixLayoutCooperativeMatrixRowMajorKHR = 0, + CooperativeMatrixLayoutCooperativeMatrixColumnMajorKHR = 1, + CooperativeMatrixLayoutMax = 0x7fffffff, +}; + +enum CooperativeMatrixUse { + CooperativeMatrixUseMatrixAKHR = 0, + CooperativeMatrixUseMatrixBKHR = 1, + CooperativeMatrixUseMatrixAccumulatorKHR = 2, + CooperativeMatrixUseMax = 0x7fffffff, +}; + +enum Op { + OpNop = 0, + OpUndef = 1, + OpSourceContinued = 2, + OpSource = 3, + OpSourceExtension = 4, + OpName = 5, + OpMemberName = 6, + OpString = 7, + OpLine = 8, + OpExtension = 10, + OpExtInstImport = 11, + OpExtInst = 12, + OpMemoryModel = 14, + OpEntryPoint = 15, + OpExecutionMode = 16, + OpCapability = 17, + OpTypeVoid = 19, + OpTypeBool = 20, + OpTypeInt = 21, + OpTypeFloat = 22, + OpTypeVector = 23, + OpTypeMatrix = 24, + OpTypeImage = 25, + OpTypeSampler = 26, + OpTypeSampledImage = 27, + OpTypeArray = 28, + OpTypeRuntimeArray = 29, + OpTypeStruct = 30, + OpTypeOpaque = 31, + OpTypePointer = 32, + OpTypeFunction = 33, + OpTypeEvent = 34, + OpTypeDeviceEvent = 35, + OpTypeReserveId = 36, + OpTypeQueue = 37, + OpTypePipe = 38, + OpTypeForwardPointer = 39, + OpConstantTrue = 41, + OpConstantFalse = 42, + OpConstant = 43, + OpConstantComposite = 44, + OpConstantSampler = 45, + OpConstantNull = 46, + OpSpecConstantTrue = 48, + OpSpecConstantFalse = 49, + OpSpecConstant = 50, + OpSpecConstantComposite = 51, + OpSpecConstantOp = 52, + OpFunction = 54, + OpFunctionParameter = 55, + OpFunctionEnd = 56, + OpFunctionCall = 57, + OpVariable = 59, + OpImageTexelPointer = 60, + OpLoad = 61, + OpStore = 62, + OpCopyMemory = 63, + OpCopyMemorySized = 64, + OpAccessChain = 65, + OpInBoundsAccessChain = 66, + OpPtrAccessChain = 67, + OpArrayLength = 68, + OpGenericPtrMemSemantics = 69, + OpInBoundsPtrAccessChain = 70, + OpDecorate = 71, + OpMemberDecorate = 72, + OpDecorationGroup = 73, + OpGroupDecorate = 74, + OpGroupMemberDecorate = 75, + OpVectorExtractDynamic = 77, + OpVectorInsertDynamic = 78, + OpVectorShuffle = 79, + OpCompositeConstruct = 80, + OpCompositeExtract = 81, + OpCompositeInsert = 82, + OpCopyObject = 83, + OpTranspose = 84, + OpSampledImage = 86, + OpImageSampleImplicitLod = 87, + OpImageSampleExplicitLod = 88, + OpImageSampleDrefImplicitLod = 89, + OpImageSampleDrefExplicitLod = 90, + OpImageSampleProjImplicitLod = 91, + OpImageSampleProjExplicitLod = 92, + OpImageSampleProjDrefImplicitLod = 93, + OpImageSampleProjDrefExplicitLod = 94, + OpImageFetch = 95, + OpImageGather = 96, + OpImageDrefGather = 97, + OpImageRead = 98, + OpImageWrite = 99, + OpImage = 100, + OpImageQueryFormat = 101, + OpImageQueryOrder = 102, + OpImageQuerySizeLod = 103, + OpImageQuerySize = 104, + OpImageQueryLod = 105, + OpImageQueryLevels = 106, + OpImageQuerySamples = 107, + OpConvertFToU = 109, + OpConvertFToS = 110, + OpConvertSToF = 111, + OpConvertUToF = 112, + OpUConvert = 113, + OpSConvert = 114, + OpFConvert = 115, + OpQuantizeToF16 = 116, + OpConvertPtrToU = 117, + OpSatConvertSToU = 118, + OpSatConvertUToS = 119, + OpConvertUToPtr = 120, + OpPtrCastToGeneric = 121, + OpGenericCastToPtr = 122, + OpGenericCastToPtrExplicit = 123, + OpBitcast = 124, + OpSNegate = 126, + OpFNegate = 127, + OpIAdd = 128, + OpFAdd = 129, + OpISub = 130, + OpFSub = 131, + OpIMul = 132, + OpFMul = 133, + OpUDiv = 134, + OpSDiv = 135, + OpFDiv = 136, + OpUMod = 137, + OpSRem = 138, + OpSMod = 139, + OpFRem = 140, + OpFMod = 141, + OpVectorTimesScalar = 142, + OpMatrixTimesScalar = 143, + OpVectorTimesMatrix = 144, + OpMatrixTimesVector = 145, + OpMatrixTimesMatrix = 146, + OpOuterProduct = 147, + OpDot = 148, + OpIAddCarry = 149, + OpISubBorrow = 150, + OpUMulExtended = 151, + OpSMulExtended = 152, + OpAny = 154, + OpAll = 155, + OpIsNan = 156, + OpIsInf = 157, + OpIsFinite = 158, + OpIsNormal = 159, + OpSignBitSet = 160, + OpLessOrGreater = 161, + OpOrdered = 162, + OpUnordered = 163, + OpLogicalEqual = 164, + OpLogicalNotEqual = 165, + OpLogicalOr = 166, + OpLogicalAnd = 167, + OpLogicalNot = 168, + OpSelect = 169, + OpIEqual = 170, + OpINotEqual = 171, + OpUGreaterThan = 172, + OpSGreaterThan = 173, + OpUGreaterThanEqual = 174, + OpSGreaterThanEqual = 175, + OpULessThan = 176, + OpSLessThan = 177, + OpULessThanEqual = 178, + OpSLessThanEqual = 179, + OpFOrdEqual = 180, + OpFUnordEqual = 181, + OpFOrdNotEqual = 182, + OpFUnordNotEqual = 183, + OpFOrdLessThan = 184, + OpFUnordLessThan = 185, + OpFOrdGreaterThan = 186, + OpFUnordGreaterThan = 187, + OpFOrdLessThanEqual = 188, + OpFUnordLessThanEqual = 189, + OpFOrdGreaterThanEqual = 190, + OpFUnordGreaterThanEqual = 191, + OpShiftRightLogical = 194, + OpShiftRightArithmetic = 195, + OpShiftLeftLogical = 196, + OpBitwiseOr = 197, + OpBitwiseXor = 198, + OpBitwiseAnd = 199, + OpNot = 200, + OpBitFieldInsert = 201, + OpBitFieldSExtract = 202, + OpBitFieldUExtract = 203, + OpBitReverse = 204, + OpBitCount = 205, + OpDPdx = 207, + OpDPdy = 208, + OpFwidth = 209, + OpDPdxFine = 210, + OpDPdyFine = 211, + OpFwidthFine = 212, + OpDPdxCoarse = 213, + OpDPdyCoarse = 214, + OpFwidthCoarse = 215, + OpEmitVertex = 218, + OpEndPrimitive = 219, + OpEmitStreamVertex = 220, + OpEndStreamPrimitive = 221, + OpControlBarrier = 224, + OpMemoryBarrier = 225, + OpAtomicLoad = 227, + OpAtomicStore = 228, + OpAtomicExchange = 229, + OpAtomicCompareExchange = 230, + OpAtomicCompareExchangeWeak = 231, + OpAtomicIIncrement = 232, + OpAtomicIDecrement = 233, + OpAtomicIAdd = 234, + OpAtomicISub = 235, + OpAtomicSMin = 236, + OpAtomicUMin = 237, + OpAtomicSMax = 238, + OpAtomicUMax = 239, + OpAtomicAnd = 240, + OpAtomicOr = 241, + OpAtomicXor = 242, + OpPhi = 245, + OpLoopMerge = 246, + OpSelectionMerge = 247, + OpLabel = 248, + OpBranch = 249, + OpBranchConditional = 250, + OpSwitch = 251, + OpKill = 252, + OpReturn = 253, + OpReturnValue = 254, + OpUnreachable = 255, + OpLifetimeStart = 256, + OpLifetimeStop = 257, + OpGroupAsyncCopy = 259, + OpGroupWaitEvents = 260, + OpGroupAll = 261, + OpGroupAny = 262, + OpGroupBroadcast = 263, + OpGroupIAdd = 264, + OpGroupFAdd = 265, + OpGroupFMin = 266, + OpGroupUMin = 267, + OpGroupSMin = 268, + OpGroupFMax = 269, + OpGroupUMax = 270, + OpGroupSMax = 271, + OpReadPipe = 274, + OpWritePipe = 275, + OpReservedReadPipe = 276, + OpReservedWritePipe = 277, + OpReserveReadPipePackets = 278, + OpReserveWritePipePackets = 279, + OpCommitReadPipe = 280, + OpCommitWritePipe = 281, + OpIsValidReserveId = 282, + OpGetNumPipePackets = 283, + OpGetMaxPipePackets = 284, + OpGroupReserveReadPipePackets = 285, + OpGroupReserveWritePipePackets = 286, + OpGroupCommitReadPipe = 287, + OpGroupCommitWritePipe = 288, + OpEnqueueMarker = 291, + OpEnqueueKernel = 292, + OpGetKernelNDrangeSubGroupCount = 293, + OpGetKernelNDrangeMaxSubGroupSize = 294, + OpGetKernelWorkGroupSize = 295, + OpGetKernelPreferredWorkGroupSizeMultiple = 296, + OpRetainEvent = 297, + OpReleaseEvent = 298, + OpCreateUserEvent = 299, + OpIsValidEvent = 300, + OpSetUserEventStatus = 301, + OpCaptureEventProfilingInfo = 302, + OpGetDefaultQueue = 303, + OpBuildNDRange = 304, + OpImageSparseSampleImplicitLod = 305, + OpImageSparseSampleExplicitLod = 306, + OpImageSparseSampleDrefImplicitLod = 307, + OpImageSparseSampleDrefExplicitLod = 308, + OpImageSparseSampleProjImplicitLod = 309, + OpImageSparseSampleProjExplicitLod = 310, + OpImageSparseSampleProjDrefImplicitLod = 311, + OpImageSparseSampleProjDrefExplicitLod = 312, + OpImageSparseFetch = 313, + OpImageSparseGather = 314, + OpImageSparseDrefGather = 315, + OpImageSparseTexelsResident = 316, + OpNoLine = 317, + OpAtomicFlagTestAndSet = 318, + OpAtomicFlagClear = 319, + OpImageSparseRead = 320, + OpSizeOf = 321, + OpTypePipeStorage = 322, + OpConstantPipeStorage = 323, + OpCreatePipeFromPipeStorage = 324, + OpGetKernelLocalSizeForSubgroupCount = 325, + OpGetKernelMaxNumSubgroups = 326, + OpTypeNamedBarrier = 327, + OpNamedBarrierInitialize = 328, + OpMemoryNamedBarrier = 329, + OpModuleProcessed = 330, + OpExecutionModeId = 331, + OpDecorateId = 332, + OpGroupNonUniformElect = 333, + OpGroupNonUniformAll = 334, + OpGroupNonUniformAny = 335, + OpGroupNonUniformAllEqual = 336, + OpGroupNonUniformBroadcast = 337, + OpGroupNonUniformBroadcastFirst = 338, + OpGroupNonUniformBallot = 339, + OpGroupNonUniformInverseBallot = 340, + OpGroupNonUniformBallotBitExtract = 341, + OpGroupNonUniformBallotBitCount = 342, + OpGroupNonUniformBallotFindLSB = 343, + OpGroupNonUniformBallotFindMSB = 344, + OpGroupNonUniformShuffle = 345, + OpGroupNonUniformShuffleXor = 346, + OpGroupNonUniformShuffleUp = 347, + OpGroupNonUniformShuffleDown = 348, + OpGroupNonUniformIAdd = 349, + OpGroupNonUniformFAdd = 350, + OpGroupNonUniformIMul = 351, + OpGroupNonUniformFMul = 352, + OpGroupNonUniformSMin = 353, + OpGroupNonUniformUMin = 354, + OpGroupNonUniformFMin = 355, + OpGroupNonUniformSMax = 356, + OpGroupNonUniformUMax = 357, + OpGroupNonUniformFMax = 358, + OpGroupNonUniformBitwiseAnd = 359, + OpGroupNonUniformBitwiseOr = 360, + OpGroupNonUniformBitwiseXor = 361, + OpGroupNonUniformLogicalAnd = 362, + OpGroupNonUniformLogicalOr = 363, + OpGroupNonUniformLogicalXor = 364, + OpGroupNonUniformQuadBroadcast = 365, + OpGroupNonUniformQuadSwap = 366, + OpCopyLogical = 400, + OpPtrEqual = 401, + OpPtrNotEqual = 402, + OpPtrDiff = 403, + OpColorAttachmentReadEXT = 4160, + OpDepthAttachmentReadEXT = 4161, + OpStencilAttachmentReadEXT = 4162, + OpTerminateInvocation = 4416, + OpSubgroupBallotKHR = 4421, + OpSubgroupFirstInvocationKHR = 4422, + OpSubgroupAllKHR = 4428, + OpSubgroupAnyKHR = 4429, + OpSubgroupAllEqualKHR = 4430, + OpGroupNonUniformRotateKHR = 4431, + OpSubgroupReadInvocationKHR = 4432, + OpTraceRayKHR = 4445, + OpExecuteCallableKHR = 4446, + OpConvertUToAccelerationStructureKHR = 4447, + OpIgnoreIntersectionKHR = 4448, + OpTerminateRayKHR = 4449, + OpSDot = 4450, + OpSDotKHR = 4450, + OpUDot = 4451, + OpUDotKHR = 4451, + OpSUDot = 4452, + OpSUDotKHR = 4452, + OpSDotAccSat = 4453, + OpSDotAccSatKHR = 4453, + OpUDotAccSat = 4454, + OpUDotAccSatKHR = 4454, + OpSUDotAccSat = 4455, + OpSUDotAccSatKHR = 4455, + OpTypeCooperativeMatrixKHR = 4456, + OpCooperativeMatrixLoadKHR = 4457, + OpCooperativeMatrixStoreKHR = 4458, + OpCooperativeMatrixMulAddKHR = 4459, + OpCooperativeMatrixLengthKHR = 4460, + OpTypeRayQueryKHR = 4472, + OpRayQueryInitializeKHR = 4473, + OpRayQueryTerminateKHR = 4474, + OpRayQueryGenerateIntersectionKHR = 4475, + OpRayQueryConfirmIntersectionKHR = 4476, + OpRayQueryProceedKHR = 4477, + OpRayQueryGetIntersectionTypeKHR = 4479, + OpImageSampleWeightedQCOM = 4480, + OpImageBoxFilterQCOM = 4481, + OpImageBlockMatchSSDQCOM = 4482, + OpImageBlockMatchSADQCOM = 4483, + OpGroupIAddNonUniformAMD = 5000, + OpGroupFAddNonUniformAMD = 5001, + OpGroupFMinNonUniformAMD = 5002, + OpGroupUMinNonUniformAMD = 5003, + OpGroupSMinNonUniformAMD = 5004, + OpGroupFMaxNonUniformAMD = 5005, + OpGroupUMaxNonUniformAMD = 5006, + OpGroupSMaxNonUniformAMD = 5007, + OpFragmentMaskFetchAMD = 5011, + OpFragmentFetchAMD = 5012, + OpReadClockKHR = 5056, + OpHitObjectRecordHitMotionNV = 5249, + OpHitObjectRecordHitWithIndexMotionNV = 5250, + OpHitObjectRecordMissMotionNV = 5251, + OpHitObjectGetWorldToObjectNV = 5252, + OpHitObjectGetObjectToWorldNV = 5253, + OpHitObjectGetObjectRayDirectionNV = 5254, + OpHitObjectGetObjectRayOriginNV = 5255, + OpHitObjectTraceRayMotionNV = 5256, + OpHitObjectGetShaderRecordBufferHandleNV = 5257, + OpHitObjectGetShaderBindingTableRecordIndexNV = 5258, + OpHitObjectRecordEmptyNV = 5259, + OpHitObjectTraceRayNV = 5260, + OpHitObjectRecordHitNV = 5261, + OpHitObjectRecordHitWithIndexNV = 5262, + OpHitObjectRecordMissNV = 5263, + OpHitObjectExecuteShaderNV = 5264, + OpHitObjectGetCurrentTimeNV = 5265, + OpHitObjectGetAttributesNV = 5266, + OpHitObjectGetHitKindNV = 5267, + OpHitObjectGetPrimitiveIndexNV = 5268, + OpHitObjectGetGeometryIndexNV = 5269, + OpHitObjectGetInstanceIdNV = 5270, + OpHitObjectGetInstanceCustomIndexNV = 5271, + OpHitObjectGetWorldRayDirectionNV = 5272, + OpHitObjectGetWorldRayOriginNV = 5273, + OpHitObjectGetRayTMaxNV = 5274, + OpHitObjectGetRayTMinNV = 5275, + OpHitObjectIsEmptyNV = 5276, + OpHitObjectIsHitNV = 5277, + OpHitObjectIsMissNV = 5278, + OpReorderThreadWithHitObjectNV = 5279, + OpReorderThreadWithHintNV = 5280, + OpTypeHitObjectNV = 5281, + OpImageSampleFootprintNV = 5283, + OpEmitMeshTasksEXT = 5294, + OpSetMeshOutputsEXT = 5295, + OpGroupNonUniformPartitionNV = 5296, + OpWritePackedPrimitiveIndices4x8NV = 5299, + OpFetchMicroTriangleVertexPositionNV = 5300, + OpFetchMicroTriangleVertexBarycentricNV = 5301, + OpReportIntersectionKHR = 5334, + OpReportIntersectionNV = 5334, + OpIgnoreIntersectionNV = 5335, + OpTerminateRayNV = 5336, + OpTraceNV = 5337, + OpTraceMotionNV = 5338, + OpTraceRayMotionNV = 5339, + OpRayQueryGetIntersectionTriangleVertexPositionsKHR = 5340, + OpTypeAccelerationStructureKHR = 5341, + OpTypeAccelerationStructureNV = 5341, + OpExecuteCallableNV = 5344, + OpTypeCooperativeMatrixNV = 5358, + OpCooperativeMatrixLoadNV = 5359, + OpCooperativeMatrixStoreNV = 5360, + OpCooperativeMatrixMulAddNV = 5361, + OpCooperativeMatrixLengthNV = 5362, + OpBeginInvocationInterlockEXT = 5364, + OpEndInvocationInterlockEXT = 5365, + OpDemoteToHelperInvocation = 5380, + OpDemoteToHelperInvocationEXT = 5380, + OpIsHelperInvocationEXT = 5381, + OpConvertUToImageNV = 5391, + OpConvertUToSamplerNV = 5392, + OpConvertImageToUNV = 5393, + OpConvertSamplerToUNV = 5394, + OpConvertUToSampledImageNV = 5395, + OpConvertSampledImageToUNV = 5396, + OpSamplerImageAddressingModeNV = 5397, + OpSubgroupShuffleINTEL = 5571, + OpSubgroupShuffleDownINTEL = 5572, + OpSubgroupShuffleUpINTEL = 5573, + OpSubgroupShuffleXorINTEL = 5574, + OpSubgroupBlockReadINTEL = 5575, + OpSubgroupBlockWriteINTEL = 5576, + OpSubgroupImageBlockReadINTEL = 5577, + OpSubgroupImageBlockWriteINTEL = 5578, + OpSubgroupImageMediaBlockReadINTEL = 5580, + OpSubgroupImageMediaBlockWriteINTEL = 5581, + OpUCountLeadingZerosINTEL = 5585, + OpUCountTrailingZerosINTEL = 5586, + OpAbsISubINTEL = 5587, + OpAbsUSubINTEL = 5588, + OpIAddSatINTEL = 5589, + OpUAddSatINTEL = 5590, + OpIAverageINTEL = 5591, + OpUAverageINTEL = 5592, + OpIAverageRoundedINTEL = 5593, + OpUAverageRoundedINTEL = 5594, + OpISubSatINTEL = 5595, + OpUSubSatINTEL = 5596, + OpIMul32x16INTEL = 5597, + OpUMul32x16INTEL = 5598, + OpConstantFunctionPointerINTEL = 5600, + OpFunctionPointerCallINTEL = 5601, + OpAsmTargetINTEL = 5609, + OpAsmINTEL = 5610, + OpAsmCallINTEL = 5611, + OpAtomicFMinEXT = 5614, + OpAtomicFMaxEXT = 5615, + OpAssumeTrueKHR = 5630, + OpExpectKHR = 5631, + OpDecorateString = 5632, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateString = 5633, + OpMemberDecorateStringGOOGLE = 5633, + OpVmeImageINTEL = 5699, + OpTypeVmeImageINTEL = 5700, + OpTypeAvcImePayloadINTEL = 5701, + OpTypeAvcRefPayloadINTEL = 5702, + OpTypeAvcSicPayloadINTEL = 5703, + OpTypeAvcMcePayloadINTEL = 5704, + OpTypeAvcMceResultINTEL = 5705, + OpTypeAvcImeResultINTEL = 5706, + OpTypeAvcImeResultSingleReferenceStreamoutINTEL = 5707, + OpTypeAvcImeResultDualReferenceStreamoutINTEL = 5708, + OpTypeAvcImeSingleReferenceStreaminINTEL = 5709, + OpTypeAvcImeDualReferenceStreaminINTEL = 5710, + OpTypeAvcRefResultINTEL = 5711, + OpTypeAvcSicResultINTEL = 5712, + OpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL = 5713, + OpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL = 5714, + OpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL = 5715, + OpSubgroupAvcMceSetInterShapePenaltyINTEL = 5716, + OpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL = 5717, + OpSubgroupAvcMceSetInterDirectionPenaltyINTEL = 5718, + OpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL = 5719, + OpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL = 5720, + OpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL = 5721, + OpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL = 5722, + OpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL = 5723, + OpSubgroupAvcMceSetMotionVectorCostFunctionINTEL = 5724, + OpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL = 5725, + OpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL = 5726, + OpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL = 5727, + OpSubgroupAvcMceSetAcOnlyHaarINTEL = 5728, + OpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL = 5729, + OpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL = 5730, + OpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL = 5731, + OpSubgroupAvcMceConvertToImePayloadINTEL = 5732, + OpSubgroupAvcMceConvertToImeResultINTEL = 5733, + OpSubgroupAvcMceConvertToRefPayloadINTEL = 5734, + OpSubgroupAvcMceConvertToRefResultINTEL = 5735, + OpSubgroupAvcMceConvertToSicPayloadINTEL = 5736, + OpSubgroupAvcMceConvertToSicResultINTEL = 5737, + OpSubgroupAvcMceGetMotionVectorsINTEL = 5738, + OpSubgroupAvcMceGetInterDistortionsINTEL = 5739, + OpSubgroupAvcMceGetBestInterDistortionsINTEL = 5740, + OpSubgroupAvcMceGetInterMajorShapeINTEL = 5741, + OpSubgroupAvcMceGetInterMinorShapeINTEL = 5742, + OpSubgroupAvcMceGetInterDirectionsINTEL = 5743, + OpSubgroupAvcMceGetInterMotionVectorCountINTEL = 5744, + OpSubgroupAvcMceGetInterReferenceIdsINTEL = 5745, + OpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL = 5746, + OpSubgroupAvcImeInitializeINTEL = 5747, + OpSubgroupAvcImeSetSingleReferenceINTEL = 5748, + OpSubgroupAvcImeSetDualReferenceINTEL = 5749, + OpSubgroupAvcImeRefWindowSizeINTEL = 5750, + OpSubgroupAvcImeAdjustRefOffsetINTEL = 5751, + OpSubgroupAvcImeConvertToMcePayloadINTEL = 5752, + OpSubgroupAvcImeSetMaxMotionVectorCountINTEL = 5753, + OpSubgroupAvcImeSetUnidirectionalMixDisableINTEL = 5754, + OpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL = 5755, + OpSubgroupAvcImeSetWeightedSadINTEL = 5756, + OpSubgroupAvcImeEvaluateWithSingleReferenceINTEL = 5757, + OpSubgroupAvcImeEvaluateWithDualReferenceINTEL = 5758, + OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL = 5759, + OpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL = 5760, + OpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL = 5761, + OpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL = 5762, + OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL = 5763, + OpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL = 5764, + OpSubgroupAvcImeConvertToMceResultINTEL = 5765, + OpSubgroupAvcImeGetSingleReferenceStreaminINTEL = 5766, + OpSubgroupAvcImeGetDualReferenceStreaminINTEL = 5767, + OpSubgroupAvcImeStripSingleReferenceStreamoutINTEL = 5768, + OpSubgroupAvcImeStripDualReferenceStreamoutINTEL = 5769, + OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL = 5770, + OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL = 5771, + OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL = 5772, + OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL = 5773, + OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL = 5774, + OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL = 5775, + OpSubgroupAvcImeGetBorderReachedINTEL = 5776, + OpSubgroupAvcImeGetTruncatedSearchIndicationINTEL = 5777, + OpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL = 5778, + OpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL = 5779, + OpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL = 5780, + OpSubgroupAvcFmeInitializeINTEL = 5781, + OpSubgroupAvcBmeInitializeINTEL = 5782, + OpSubgroupAvcRefConvertToMcePayloadINTEL = 5783, + OpSubgroupAvcRefSetBidirectionalMixDisableINTEL = 5784, + OpSubgroupAvcRefSetBilinearFilterEnableINTEL = 5785, + OpSubgroupAvcRefEvaluateWithSingleReferenceINTEL = 5786, + OpSubgroupAvcRefEvaluateWithDualReferenceINTEL = 5787, + OpSubgroupAvcRefEvaluateWithMultiReferenceINTEL = 5788, + OpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL = 5789, + OpSubgroupAvcRefConvertToMceResultINTEL = 5790, + OpSubgroupAvcSicInitializeINTEL = 5791, + OpSubgroupAvcSicConfigureSkcINTEL = 5792, + OpSubgroupAvcSicConfigureIpeLumaINTEL = 5793, + OpSubgroupAvcSicConfigureIpeLumaChromaINTEL = 5794, + OpSubgroupAvcSicGetMotionVectorMaskINTEL = 5795, + OpSubgroupAvcSicConvertToMcePayloadINTEL = 5796, + OpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL = 5797, + OpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL = 5798, + OpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL = 5799, + OpSubgroupAvcSicSetBilinearFilterEnableINTEL = 5800, + OpSubgroupAvcSicSetSkcForwardTransformEnableINTEL = 5801, + OpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL = 5802, + OpSubgroupAvcSicEvaluateIpeINTEL = 5803, + OpSubgroupAvcSicEvaluateWithSingleReferenceINTEL = 5804, + OpSubgroupAvcSicEvaluateWithDualReferenceINTEL = 5805, + OpSubgroupAvcSicEvaluateWithMultiReferenceINTEL = 5806, + OpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL = 5807, + OpSubgroupAvcSicConvertToMceResultINTEL = 5808, + OpSubgroupAvcSicGetIpeLumaShapeINTEL = 5809, + OpSubgroupAvcSicGetBestIpeLumaDistortionINTEL = 5810, + OpSubgroupAvcSicGetBestIpeChromaDistortionINTEL = 5811, + OpSubgroupAvcSicGetPackedIpeLumaModesINTEL = 5812, + OpSubgroupAvcSicGetIpeChromaModeINTEL = 5813, + OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL = 5814, + OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL = 5815, + OpSubgroupAvcSicGetInterRawSadsINTEL = 5816, + OpVariableLengthArrayINTEL = 5818, + OpSaveMemoryINTEL = 5819, + OpRestoreMemoryINTEL = 5820, + OpArbitraryFloatSinCosPiINTEL = 5840, + OpArbitraryFloatCastINTEL = 5841, + OpArbitraryFloatCastFromIntINTEL = 5842, + OpArbitraryFloatCastToIntINTEL = 5843, + OpArbitraryFloatAddINTEL = 5846, + OpArbitraryFloatSubINTEL = 5847, + OpArbitraryFloatMulINTEL = 5848, + OpArbitraryFloatDivINTEL = 5849, + OpArbitraryFloatGTINTEL = 5850, + OpArbitraryFloatGEINTEL = 5851, + OpArbitraryFloatLTINTEL = 5852, + OpArbitraryFloatLEINTEL = 5853, + OpArbitraryFloatEQINTEL = 5854, + OpArbitraryFloatRecipINTEL = 5855, + OpArbitraryFloatRSqrtINTEL = 5856, + OpArbitraryFloatCbrtINTEL = 5857, + OpArbitraryFloatHypotINTEL = 5858, + OpArbitraryFloatSqrtINTEL = 5859, + OpArbitraryFloatLogINTEL = 5860, + OpArbitraryFloatLog2INTEL = 5861, + OpArbitraryFloatLog10INTEL = 5862, + OpArbitraryFloatLog1pINTEL = 5863, + OpArbitraryFloatExpINTEL = 5864, + OpArbitraryFloatExp2INTEL = 5865, + OpArbitraryFloatExp10INTEL = 5866, + OpArbitraryFloatExpm1INTEL = 5867, + OpArbitraryFloatSinINTEL = 5868, + OpArbitraryFloatCosINTEL = 5869, + OpArbitraryFloatSinCosINTEL = 5870, + OpArbitraryFloatSinPiINTEL = 5871, + OpArbitraryFloatCosPiINTEL = 5872, + OpArbitraryFloatASinINTEL = 5873, + OpArbitraryFloatASinPiINTEL = 5874, + OpArbitraryFloatACosINTEL = 5875, + OpArbitraryFloatACosPiINTEL = 5876, + OpArbitraryFloatATanINTEL = 5877, + OpArbitraryFloatATanPiINTEL = 5878, + OpArbitraryFloatATan2INTEL = 5879, + OpArbitraryFloatPowINTEL = 5880, + OpArbitraryFloatPowRINTEL = 5881, + OpArbitraryFloatPowNINTEL = 5882, + OpLoopControlINTEL = 5887, + OpAliasDomainDeclINTEL = 5911, + OpAliasScopeDeclINTEL = 5912, + OpAliasScopeListDeclINTEL = 5913, + OpFixedSqrtINTEL = 5923, + OpFixedRecipINTEL = 5924, + OpFixedRsqrtINTEL = 5925, + OpFixedSinINTEL = 5926, + OpFixedCosINTEL = 5927, + OpFixedSinCosINTEL = 5928, + OpFixedSinPiINTEL = 5929, + OpFixedCosPiINTEL = 5930, + OpFixedSinCosPiINTEL = 5931, + OpFixedLogINTEL = 5932, + OpFixedExpINTEL = 5933, + OpPtrCastToCrossWorkgroupINTEL = 5934, + OpCrossWorkgroupCastToPtrINTEL = 5938, + OpReadPipeBlockingINTEL = 5946, + OpWritePipeBlockingINTEL = 5947, + OpFPGARegINTEL = 5949, + OpRayQueryGetRayTMinKHR = 6016, + OpRayQueryGetRayFlagsKHR = 6017, + OpRayQueryGetIntersectionTKHR = 6018, + OpRayQueryGetIntersectionInstanceCustomIndexKHR = 6019, + OpRayQueryGetIntersectionInstanceIdKHR = 6020, + OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR = 6021, + OpRayQueryGetIntersectionGeometryIndexKHR = 6022, + OpRayQueryGetIntersectionPrimitiveIndexKHR = 6023, + OpRayQueryGetIntersectionBarycentricsKHR = 6024, + OpRayQueryGetIntersectionFrontFaceKHR = 6025, + OpRayQueryGetIntersectionCandidateAABBOpaqueKHR = 6026, + OpRayQueryGetIntersectionObjectRayDirectionKHR = 6027, + OpRayQueryGetIntersectionObjectRayOriginKHR = 6028, + OpRayQueryGetWorldRayDirectionKHR = 6029, + OpRayQueryGetWorldRayOriginKHR = 6030, + OpRayQueryGetIntersectionObjectToWorldKHR = 6031, + OpRayQueryGetIntersectionWorldToObjectKHR = 6032, + OpAtomicFAddEXT = 6035, + OpTypeBufferSurfaceINTEL = 6086, + OpTypeStructContinuedINTEL = 6090, + OpConstantCompositeContinuedINTEL = 6091, + OpSpecConstantCompositeContinuedINTEL = 6092, + OpControlBarrierArriveINTEL = 6142, + OpControlBarrierWaitINTEL = 6143, + OpGroupIMulKHR = 6401, + OpGroupFMulKHR = 6402, + OpGroupBitwiseAndKHR = 6403, + OpGroupBitwiseOrKHR = 6404, + OpGroupBitwiseXorKHR = 6405, + OpGroupLogicalAndKHR = 6406, + OpGroupLogicalOrKHR = 6407, + OpGroupLogicalXorKHR = 6408, + OpMax = 0x7fffffff, +}; + +#ifdef SPV_ENABLE_UTILITY_CODE +#ifndef __cplusplus +#include +#endif +inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) { + *hasResult = *hasResultType = false; + switch (opcode) { + default: /* unknown opcode */ break; + case OpNop: *hasResult = false; *hasResultType = false; break; + case OpUndef: *hasResult = true; *hasResultType = true; break; + case OpSourceContinued: *hasResult = false; *hasResultType = false; break; + case OpSource: *hasResult = false; *hasResultType = false; break; + case OpSourceExtension: *hasResult = false; *hasResultType = false; break; + case OpName: *hasResult = false; *hasResultType = false; break; + case OpMemberName: *hasResult = false; *hasResultType = false; break; + case OpString: *hasResult = true; *hasResultType = false; break; + case OpLine: *hasResult = false; *hasResultType = false; break; + case OpExtension: *hasResult = false; *hasResultType = false; break; + case OpExtInstImport: *hasResult = true; *hasResultType = false; break; + case OpExtInst: *hasResult = true; *hasResultType = true; break; + case OpMemoryModel: *hasResult = false; *hasResultType = false; break; + case OpEntryPoint: *hasResult = false; *hasResultType = false; break; + case OpExecutionMode: *hasResult = false; *hasResultType = false; break; + case OpCapability: *hasResult = false; *hasResultType = false; break; + case OpTypeVoid: *hasResult = true; *hasResultType = false; break; + case OpTypeBool: *hasResult = true; *hasResultType = false; break; + case OpTypeInt: *hasResult = true; *hasResultType = false; break; + case OpTypeFloat: *hasResult = true; *hasResultType = false; break; + case OpTypeVector: *hasResult = true; *hasResultType = false; break; + case OpTypeMatrix: *hasResult = true; *hasResultType = false; break; + case OpTypeImage: *hasResult = true; *hasResultType = false; break; + case OpTypeSampler: *hasResult = true; *hasResultType = false; break; + case OpTypeSampledImage: *hasResult = true; *hasResultType = false; break; + case OpTypeArray: *hasResult = true; *hasResultType = false; break; + case OpTypeRuntimeArray: *hasResult = true; *hasResultType = false; break; + case OpTypeStruct: *hasResult = true; *hasResultType = false; break; + case OpTypeOpaque: *hasResult = true; *hasResultType = false; break; + case OpTypePointer: *hasResult = true; *hasResultType = false; break; + case OpTypeFunction: *hasResult = true; *hasResultType = false; break; + case OpTypeEvent: *hasResult = true; *hasResultType = false; break; + case OpTypeDeviceEvent: *hasResult = true; *hasResultType = false; break; + case OpTypeReserveId: *hasResult = true; *hasResultType = false; break; + case OpTypeQueue: *hasResult = true; *hasResultType = false; break; + case OpTypePipe: *hasResult = true; *hasResultType = false; break; + case OpTypeForwardPointer: *hasResult = false; *hasResultType = false; break; + case OpConstantTrue: *hasResult = true; *hasResultType = true; break; + case OpConstantFalse: *hasResult = true; *hasResultType = true; break; + case OpConstant: *hasResult = true; *hasResultType = true; break; + case OpConstantComposite: *hasResult = true; *hasResultType = true; break; + case OpConstantSampler: *hasResult = true; *hasResultType = true; break; + case OpConstantNull: *hasResult = true; *hasResultType = true; break; + case OpSpecConstantTrue: *hasResult = true; *hasResultType = true; break; + case OpSpecConstantFalse: *hasResult = true; *hasResultType = true; break; + case OpSpecConstant: *hasResult = true; *hasResultType = true; break; + case OpSpecConstantComposite: *hasResult = true; *hasResultType = true; break; + case OpSpecConstantOp: *hasResult = true; *hasResultType = true; break; + case OpFunction: *hasResult = true; *hasResultType = true; break; + case OpFunctionParameter: *hasResult = true; *hasResultType = true; break; + case OpFunctionEnd: *hasResult = false; *hasResultType = false; break; + case OpFunctionCall: *hasResult = true; *hasResultType = true; break; + case OpVariable: *hasResult = true; *hasResultType = true; break; + case OpImageTexelPointer: *hasResult = true; *hasResultType = true; break; + case OpLoad: *hasResult = true; *hasResultType = true; break; + case OpStore: *hasResult = false; *hasResultType = false; break; + case OpCopyMemory: *hasResult = false; *hasResultType = false; break; + case OpCopyMemorySized: *hasResult = false; *hasResultType = false; break; + case OpAccessChain: *hasResult = true; *hasResultType = true; break; + case OpInBoundsAccessChain: *hasResult = true; *hasResultType = true; break; + case OpPtrAccessChain: *hasResult = true; *hasResultType = true; break; + case OpArrayLength: *hasResult = true; *hasResultType = true; break; + case OpGenericPtrMemSemantics: *hasResult = true; *hasResultType = true; break; + case OpInBoundsPtrAccessChain: *hasResult = true; *hasResultType = true; break; + case OpDecorate: *hasResult = false; *hasResultType = false; break; + case OpMemberDecorate: *hasResult = false; *hasResultType = false; break; + case OpDecorationGroup: *hasResult = true; *hasResultType = false; break; + case OpGroupDecorate: *hasResult = false; *hasResultType = false; break; + case OpGroupMemberDecorate: *hasResult = false; *hasResultType = false; break; + case OpVectorExtractDynamic: *hasResult = true; *hasResultType = true; break; + case OpVectorInsertDynamic: *hasResult = true; *hasResultType = true; break; + case OpVectorShuffle: *hasResult = true; *hasResultType = true; break; + case OpCompositeConstruct: *hasResult = true; *hasResultType = true; break; + case OpCompositeExtract: *hasResult = true; *hasResultType = true; break; + case OpCompositeInsert: *hasResult = true; *hasResultType = true; break; + case OpCopyObject: *hasResult = true; *hasResultType = true; break; + case OpTranspose: *hasResult = true; *hasResultType = true; break; + case OpSampledImage: *hasResult = true; *hasResultType = true; break; + case OpImageSampleImplicitLod: *hasResult = true; *hasResultType = true; break; + case OpImageSampleExplicitLod: *hasResult = true; *hasResultType = true; break; + case OpImageSampleDrefImplicitLod: *hasResult = true; *hasResultType = true; break; + case OpImageSampleDrefExplicitLod: *hasResult = true; *hasResultType = true; break; + case OpImageSampleProjImplicitLod: *hasResult = true; *hasResultType = true; break; + case OpImageSampleProjExplicitLod: *hasResult = true; *hasResultType = true; break; + case OpImageSampleProjDrefImplicitLod: *hasResult = true; *hasResultType = true; break; + case OpImageSampleProjDrefExplicitLod: *hasResult = true; *hasResultType = true; break; + case OpImageFetch: *hasResult = true; *hasResultType = true; break; + case OpImageGather: *hasResult = true; *hasResultType = true; break; + case OpImageDrefGather: *hasResult = true; *hasResultType = true; break; + case OpImageRead: *hasResult = true; *hasResultType = true; break; + case OpImageWrite: *hasResult = false; *hasResultType = false; break; + case OpImage: *hasResult = true; *hasResultType = true; break; + case OpImageQueryFormat: *hasResult = true; *hasResultType = true; break; + case OpImageQueryOrder: *hasResult = true; *hasResultType = true; break; + case OpImageQuerySizeLod: *hasResult = true; *hasResultType = true; break; + case OpImageQuerySize: *hasResult = true; *hasResultType = true; break; + case OpImageQueryLod: *hasResult = true; *hasResultType = true; break; + case OpImageQueryLevels: *hasResult = true; *hasResultType = true; break; + case OpImageQuerySamples: *hasResult = true; *hasResultType = true; break; + case OpConvertFToU: *hasResult = true; *hasResultType = true; break; + case OpConvertFToS: *hasResult = true; *hasResultType = true; break; + case OpConvertSToF: *hasResult = true; *hasResultType = true; break; + case OpConvertUToF: *hasResult = true; *hasResultType = true; break; + case OpUConvert: *hasResult = true; *hasResultType = true; break; + case OpSConvert: *hasResult = true; *hasResultType = true; break; + case OpFConvert: *hasResult = true; *hasResultType = true; break; + case OpQuantizeToF16: *hasResult = true; *hasResultType = true; break; + case OpConvertPtrToU: *hasResult = true; *hasResultType = true; break; + case OpSatConvertSToU: *hasResult = true; *hasResultType = true; break; + case OpSatConvertUToS: *hasResult = true; *hasResultType = true; break; + case OpConvertUToPtr: *hasResult = true; *hasResultType = true; break; + case OpPtrCastToGeneric: *hasResult = true; *hasResultType = true; break; + case OpGenericCastToPtr: *hasResult = true; *hasResultType = true; break; + case OpGenericCastToPtrExplicit: *hasResult = true; *hasResultType = true; break; + case OpBitcast: *hasResult = true; *hasResultType = true; break; + case OpSNegate: *hasResult = true; *hasResultType = true; break; + case OpFNegate: *hasResult = true; *hasResultType = true; break; + case OpIAdd: *hasResult = true; *hasResultType = true; break; + case OpFAdd: *hasResult = true; *hasResultType = true; break; + case OpISub: *hasResult = true; *hasResultType = true; break; + case OpFSub: *hasResult = true; *hasResultType = true; break; + case OpIMul: *hasResult = true; *hasResultType = true; break; + case OpFMul: *hasResult = true; *hasResultType = true; break; + case OpUDiv: *hasResult = true; *hasResultType = true; break; + case OpSDiv: *hasResult = true; *hasResultType = true; break; + case OpFDiv: *hasResult = true; *hasResultType = true; break; + case OpUMod: *hasResult = true; *hasResultType = true; break; + case OpSRem: *hasResult = true; *hasResultType = true; break; + case OpSMod: *hasResult = true; *hasResultType = true; break; + case OpFRem: *hasResult = true; *hasResultType = true; break; + case OpFMod: *hasResult = true; *hasResultType = true; break; + case OpVectorTimesScalar: *hasResult = true; *hasResultType = true; break; + case OpMatrixTimesScalar: *hasResult = true; *hasResultType = true; break; + case OpVectorTimesMatrix: *hasResult = true; *hasResultType = true; break; + case OpMatrixTimesVector: *hasResult = true; *hasResultType = true; break; + case OpMatrixTimesMatrix: *hasResult = true; *hasResultType = true; break; + case OpOuterProduct: *hasResult = true; *hasResultType = true; break; + case OpDot: *hasResult = true; *hasResultType = true; break; + case OpIAddCarry: *hasResult = true; *hasResultType = true; break; + case OpISubBorrow: *hasResult = true; *hasResultType = true; break; + case OpUMulExtended: *hasResult = true; *hasResultType = true; break; + case OpSMulExtended: *hasResult = true; *hasResultType = true; break; + case OpAny: *hasResult = true; *hasResultType = true; break; + case OpAll: *hasResult = true; *hasResultType = true; break; + case OpIsNan: *hasResult = true; *hasResultType = true; break; + case OpIsInf: *hasResult = true; *hasResultType = true; break; + case OpIsFinite: *hasResult = true; *hasResultType = true; break; + case OpIsNormal: *hasResult = true; *hasResultType = true; break; + case OpSignBitSet: *hasResult = true; *hasResultType = true; break; + case OpLessOrGreater: *hasResult = true; *hasResultType = true; break; + case OpOrdered: *hasResult = true; *hasResultType = true; break; + case OpUnordered: *hasResult = true; *hasResultType = true; break; + case OpLogicalEqual: *hasResult = true; *hasResultType = true; break; + case OpLogicalNotEqual: *hasResult = true; *hasResultType = true; break; + case OpLogicalOr: *hasResult = true; *hasResultType = true; break; + case OpLogicalAnd: *hasResult = true; *hasResultType = true; break; + case OpLogicalNot: *hasResult = true; *hasResultType = true; break; + case OpSelect: *hasResult = true; *hasResultType = true; break; + case OpIEqual: *hasResult = true; *hasResultType = true; break; + case OpINotEqual: *hasResult = true; *hasResultType = true; break; + case OpUGreaterThan: *hasResult = true; *hasResultType = true; break; + case OpSGreaterThan: *hasResult = true; *hasResultType = true; break; + case OpUGreaterThanEqual: *hasResult = true; *hasResultType = true; break; + case OpSGreaterThanEqual: *hasResult = true; *hasResultType = true; break; + case OpULessThan: *hasResult = true; *hasResultType = true; break; + case OpSLessThan: *hasResult = true; *hasResultType = true; break; + case OpULessThanEqual: *hasResult = true; *hasResultType = true; break; + case OpSLessThanEqual: *hasResult = true; *hasResultType = true; break; + case OpFOrdEqual: *hasResult = true; *hasResultType = true; break; + case OpFUnordEqual: *hasResult = true; *hasResultType = true; break; + case OpFOrdNotEqual: *hasResult = true; *hasResultType = true; break; + case OpFUnordNotEqual: *hasResult = true; *hasResultType = true; break; + case OpFOrdLessThan: *hasResult = true; *hasResultType = true; break; + case OpFUnordLessThan: *hasResult = true; *hasResultType = true; break; + case OpFOrdGreaterThan: *hasResult = true; *hasResultType = true; break; + case OpFUnordGreaterThan: *hasResult = true; *hasResultType = true; break; + case OpFOrdLessThanEqual: *hasResult = true; *hasResultType = true; break; + case OpFUnordLessThanEqual: *hasResult = true; *hasResultType = true; break; + case OpFOrdGreaterThanEqual: *hasResult = true; *hasResultType = true; break; + case OpFUnordGreaterThanEqual: *hasResult = true; *hasResultType = true; break; + case OpShiftRightLogical: *hasResult = true; *hasResultType = true; break; + case OpShiftRightArithmetic: *hasResult = true; *hasResultType = true; break; + case OpShiftLeftLogical: *hasResult = true; *hasResultType = true; break; + case OpBitwiseOr: *hasResult = true; *hasResultType = true; break; + case OpBitwiseXor: *hasResult = true; *hasResultType = true; break; + case OpBitwiseAnd: *hasResult = true; *hasResultType = true; break; + case OpNot: *hasResult = true; *hasResultType = true; break; + case OpBitFieldInsert: *hasResult = true; *hasResultType = true; break; + case OpBitFieldSExtract: *hasResult = true; *hasResultType = true; break; + case OpBitFieldUExtract: *hasResult = true; *hasResultType = true; break; + case OpBitReverse: *hasResult = true; *hasResultType = true; break; + case OpBitCount: *hasResult = true; *hasResultType = true; break; + case OpDPdx: *hasResult = true; *hasResultType = true; break; + case OpDPdy: *hasResult = true; *hasResultType = true; break; + case OpFwidth: *hasResult = true; *hasResultType = true; break; + case OpDPdxFine: *hasResult = true; *hasResultType = true; break; + case OpDPdyFine: *hasResult = true; *hasResultType = true; break; + case OpFwidthFine: *hasResult = true; *hasResultType = true; break; + case OpDPdxCoarse: *hasResult = true; *hasResultType = true; break; + case OpDPdyCoarse: *hasResult = true; *hasResultType = true; break; + case OpFwidthCoarse: *hasResult = true; *hasResultType = true; break; + case OpEmitVertex: *hasResult = false; *hasResultType = false; break; + case OpEndPrimitive: *hasResult = false; *hasResultType = false; break; + case OpEmitStreamVertex: *hasResult = false; *hasResultType = false; break; + case OpEndStreamPrimitive: *hasResult = false; *hasResultType = false; break; + case OpControlBarrier: *hasResult = false; *hasResultType = false; break; + case OpMemoryBarrier: *hasResult = false; *hasResultType = false; break; + case OpAtomicLoad: *hasResult = true; *hasResultType = true; break; + case OpAtomicStore: *hasResult = false; *hasResultType = false; break; + case OpAtomicExchange: *hasResult = true; *hasResultType = true; break; + case OpAtomicCompareExchange: *hasResult = true; *hasResultType = true; break; + case OpAtomicCompareExchangeWeak: *hasResult = true; *hasResultType = true; break; + case OpAtomicIIncrement: *hasResult = true; *hasResultType = true; break; + case OpAtomicIDecrement: *hasResult = true; *hasResultType = true; break; + case OpAtomicIAdd: *hasResult = true; *hasResultType = true; break; + case OpAtomicISub: *hasResult = true; *hasResultType = true; break; + case OpAtomicSMin: *hasResult = true; *hasResultType = true; break; + case OpAtomicUMin: *hasResult = true; *hasResultType = true; break; + case OpAtomicSMax: *hasResult = true; *hasResultType = true; break; + case OpAtomicUMax: *hasResult = true; *hasResultType = true; break; + case OpAtomicAnd: *hasResult = true; *hasResultType = true; break; + case OpAtomicOr: *hasResult = true; *hasResultType = true; break; + case OpAtomicXor: *hasResult = true; *hasResultType = true; break; + case OpPhi: *hasResult = true; *hasResultType = true; break; + case OpLoopMerge: *hasResult = false; *hasResultType = false; break; + case OpSelectionMerge: *hasResult = false; *hasResultType = false; break; + case OpLabel: *hasResult = true; *hasResultType = false; break; + case OpBranch: *hasResult = false; *hasResultType = false; break; + case OpBranchConditional: *hasResult = false; *hasResultType = false; break; + case OpSwitch: *hasResult = false; *hasResultType = false; break; + case OpKill: *hasResult = false; *hasResultType = false; break; + case OpReturn: *hasResult = false; *hasResultType = false; break; + case OpReturnValue: *hasResult = false; *hasResultType = false; break; + case OpUnreachable: *hasResult = false; *hasResultType = false; break; + case OpLifetimeStart: *hasResult = false; *hasResultType = false; break; + case OpLifetimeStop: *hasResult = false; *hasResultType = false; break; + case OpGroupAsyncCopy: *hasResult = true; *hasResultType = true; break; + case OpGroupWaitEvents: *hasResult = false; *hasResultType = false; break; + case OpGroupAll: *hasResult = true; *hasResultType = true; break; + case OpGroupAny: *hasResult = true; *hasResultType = true; break; + case OpGroupBroadcast: *hasResult = true; *hasResultType = true; break; + case OpGroupIAdd: *hasResult = true; *hasResultType = true; break; + case OpGroupFAdd: *hasResult = true; *hasResultType = true; break; + case OpGroupFMin: *hasResult = true; *hasResultType = true; break; + case OpGroupUMin: *hasResult = true; *hasResultType = true; break; + case OpGroupSMin: *hasResult = true; *hasResultType = true; break; + case OpGroupFMax: *hasResult = true; *hasResultType = true; break; + case OpGroupUMax: *hasResult = true; *hasResultType = true; break; + case OpGroupSMax: *hasResult = true; *hasResultType = true; break; + case OpReadPipe: *hasResult = true; *hasResultType = true; break; + case OpWritePipe: *hasResult = true; *hasResultType = true; break; + case OpReservedReadPipe: *hasResult = true; *hasResultType = true; break; + case OpReservedWritePipe: *hasResult = true; *hasResultType = true; break; + case OpReserveReadPipePackets: *hasResult = true; *hasResultType = true; break; + case OpReserveWritePipePackets: *hasResult = true; *hasResultType = true; break; + case OpCommitReadPipe: *hasResult = false; *hasResultType = false; break; + case OpCommitWritePipe: *hasResult = false; *hasResultType = false; break; + case OpIsValidReserveId: *hasResult = true; *hasResultType = true; break; + case OpGetNumPipePackets: *hasResult = true; *hasResultType = true; break; + case OpGetMaxPipePackets: *hasResult = true; *hasResultType = true; break; + case OpGroupReserveReadPipePackets: *hasResult = true; *hasResultType = true; break; + case OpGroupReserveWritePipePackets: *hasResult = true; *hasResultType = true; break; + case OpGroupCommitReadPipe: *hasResult = false; *hasResultType = false; break; + case OpGroupCommitWritePipe: *hasResult = false; *hasResultType = false; break; + case OpEnqueueMarker: *hasResult = true; *hasResultType = true; break; + case OpEnqueueKernel: *hasResult = true; *hasResultType = true; break; + case OpGetKernelNDrangeSubGroupCount: *hasResult = true; *hasResultType = true; break; + case OpGetKernelNDrangeMaxSubGroupSize: *hasResult = true; *hasResultType = true; break; + case OpGetKernelWorkGroupSize: *hasResult = true; *hasResultType = true; break; + case OpGetKernelPreferredWorkGroupSizeMultiple: *hasResult = true; *hasResultType = true; break; + case OpRetainEvent: *hasResult = false; *hasResultType = false; break; + case OpReleaseEvent: *hasResult = false; *hasResultType = false; break; + case OpCreateUserEvent: *hasResult = true; *hasResultType = true; break; + case OpIsValidEvent: *hasResult = true; *hasResultType = true; break; + case OpSetUserEventStatus: *hasResult = false; *hasResultType = false; break; + case OpCaptureEventProfilingInfo: *hasResult = false; *hasResultType = false; break; + case OpGetDefaultQueue: *hasResult = true; *hasResultType = true; break; + case OpBuildNDRange: *hasResult = true; *hasResultType = true; break; + case OpImageSparseSampleImplicitLod: *hasResult = true; *hasResultType = true; break; + case OpImageSparseSampleExplicitLod: *hasResult = true; *hasResultType = true; break; + case OpImageSparseSampleDrefImplicitLod: *hasResult = true; *hasResultType = true; break; + case OpImageSparseSampleDrefExplicitLod: *hasResult = true; *hasResultType = true; break; + case OpImageSparseSampleProjImplicitLod: *hasResult = true; *hasResultType = true; break; + case OpImageSparseSampleProjExplicitLod: *hasResult = true; *hasResultType = true; break; + case OpImageSparseSampleProjDrefImplicitLod: *hasResult = true; *hasResultType = true; break; + case OpImageSparseSampleProjDrefExplicitLod: *hasResult = true; *hasResultType = true; break; + case OpImageSparseFetch: *hasResult = true; *hasResultType = true; break; + case OpImageSparseGather: *hasResult = true; *hasResultType = true; break; + case OpImageSparseDrefGather: *hasResult = true; *hasResultType = true; break; + case OpImageSparseTexelsResident: *hasResult = true; *hasResultType = true; break; + case OpNoLine: *hasResult = false; *hasResultType = false; break; + case OpAtomicFlagTestAndSet: *hasResult = true; *hasResultType = true; break; + case OpAtomicFlagClear: *hasResult = false; *hasResultType = false; break; + case OpImageSparseRead: *hasResult = true; *hasResultType = true; break; + case OpSizeOf: *hasResult = true; *hasResultType = true; break; + case OpTypePipeStorage: *hasResult = true; *hasResultType = false; break; + case OpConstantPipeStorage: *hasResult = true; *hasResultType = true; break; + case OpCreatePipeFromPipeStorage: *hasResult = true; *hasResultType = true; break; + case OpGetKernelLocalSizeForSubgroupCount: *hasResult = true; *hasResultType = true; break; + case OpGetKernelMaxNumSubgroups: *hasResult = true; *hasResultType = true; break; + case OpTypeNamedBarrier: *hasResult = true; *hasResultType = false; break; + case OpNamedBarrierInitialize: *hasResult = true; *hasResultType = true; break; + case OpMemoryNamedBarrier: *hasResult = false; *hasResultType = false; break; + case OpModuleProcessed: *hasResult = false; *hasResultType = false; break; + case OpExecutionModeId: *hasResult = false; *hasResultType = false; break; + case OpDecorateId: *hasResult = false; *hasResultType = false; break; + case OpGroupNonUniformElect: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformAll: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformAny: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformAllEqual: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformBroadcast: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformBroadcastFirst: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformBallot: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformInverseBallot: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformBallotBitExtract: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformBallotBitCount: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformBallotFindLSB: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformBallotFindMSB: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformShuffle: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformShuffleXor: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformShuffleUp: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformShuffleDown: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformIAdd: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformFAdd: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformIMul: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformFMul: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformSMin: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformUMin: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformFMin: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformSMax: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformUMax: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformFMax: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformBitwiseAnd: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformBitwiseOr: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformBitwiseXor: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformLogicalAnd: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformLogicalOr: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformLogicalXor: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformQuadBroadcast: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformQuadSwap: *hasResult = true; *hasResultType = true; break; + case OpCopyLogical: *hasResult = true; *hasResultType = true; break; + case OpPtrEqual: *hasResult = true; *hasResultType = true; break; + case OpPtrNotEqual: *hasResult = true; *hasResultType = true; break; + case OpPtrDiff: *hasResult = true; *hasResultType = true; break; + case OpColorAttachmentReadEXT: *hasResult = true; *hasResultType = true; break; + case OpDepthAttachmentReadEXT: *hasResult = true; *hasResultType = true; break; + case OpStencilAttachmentReadEXT: *hasResult = true; *hasResultType = true; break; + case OpTerminateInvocation: *hasResult = false; *hasResultType = false; break; + case OpSubgroupBallotKHR: *hasResult = true; *hasResultType = true; break; + case OpSubgroupFirstInvocationKHR: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAllKHR: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAnyKHR: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAllEqualKHR: *hasResult = true; *hasResultType = true; break; + case OpGroupNonUniformRotateKHR: *hasResult = true; *hasResultType = true; break; + case OpSubgroupReadInvocationKHR: *hasResult = true; *hasResultType = true; break; + case OpTraceRayKHR: *hasResult = false; *hasResultType = false; break; + case OpExecuteCallableKHR: *hasResult = false; *hasResultType = false; break; + case OpConvertUToAccelerationStructureKHR: *hasResult = true; *hasResultType = true; break; + case OpIgnoreIntersectionKHR: *hasResult = false; *hasResultType = false; break; + case OpTerminateRayKHR: *hasResult = false; *hasResultType = false; break; + case OpSDot: *hasResult = true; *hasResultType = true; break; + case OpUDot: *hasResult = true; *hasResultType = true; break; + case OpSUDot: *hasResult = true; *hasResultType = true; break; + case OpSDotAccSat: *hasResult = true; *hasResultType = true; break; + case OpUDotAccSat: *hasResult = true; *hasResultType = true; break; + case OpSUDotAccSat: *hasResult = true; *hasResultType = true; break; + case OpTypeCooperativeMatrixKHR: *hasResult = true; *hasResultType = false; break; + case OpCooperativeMatrixLoadKHR: *hasResult = true; *hasResultType = true; break; + case OpCooperativeMatrixStoreKHR: *hasResult = false; *hasResultType = false; break; + case OpCooperativeMatrixMulAddKHR: *hasResult = true; *hasResultType = true; break; + case OpCooperativeMatrixLengthKHR: *hasResult = true; *hasResultType = true; break; + case OpTypeRayQueryKHR: *hasResult = true; *hasResultType = false; break; + case OpRayQueryInitializeKHR: *hasResult = false; *hasResultType = false; break; + case OpRayQueryTerminateKHR: *hasResult = false; *hasResultType = false; break; + case OpRayQueryGenerateIntersectionKHR: *hasResult = false; *hasResultType = false; break; + case OpRayQueryConfirmIntersectionKHR: *hasResult = false; *hasResultType = false; break; + case OpRayQueryProceedKHR: *hasResult = true; *hasResultType = true; break; + case OpRayQueryGetIntersectionTypeKHR: *hasResult = true; *hasResultType = true; break; + case OpImageSampleWeightedQCOM: *hasResult = true; *hasResultType = true; break; + case OpImageBoxFilterQCOM: *hasResult = true; *hasResultType = true; break; + case OpImageBlockMatchSSDQCOM: *hasResult = true; *hasResultType = true; break; + case OpImageBlockMatchSADQCOM: *hasResult = true; *hasResultType = true; break; + case OpGroupIAddNonUniformAMD: *hasResult = true; *hasResultType = true; break; + case OpGroupFAddNonUniformAMD: *hasResult = true; *hasResultType = true; break; + case OpGroupFMinNonUniformAMD: *hasResult = true; *hasResultType = true; break; + case OpGroupUMinNonUniformAMD: *hasResult = true; *hasResultType = true; break; + case OpGroupSMinNonUniformAMD: *hasResult = true; *hasResultType = true; break; + case OpGroupFMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break; + case OpGroupUMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break; + case OpGroupSMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break; + case OpFragmentMaskFetchAMD: *hasResult = true; *hasResultType = true; break; + case OpFragmentFetchAMD: *hasResult = true; *hasResultType = true; break; + case OpReadClockKHR: *hasResult = true; *hasResultType = true; break; + case OpHitObjectRecordHitMotionNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectRecordHitWithIndexMotionNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectRecordMissMotionNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectGetWorldToObjectNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetObjectToWorldNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetObjectRayDirectionNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetObjectRayOriginNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectTraceRayMotionNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectGetShaderRecordBufferHandleNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetShaderBindingTableRecordIndexNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectRecordEmptyNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectTraceRayNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectRecordHitNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectRecordHitWithIndexNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectRecordMissNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectExecuteShaderNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectGetCurrentTimeNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetAttributesNV: *hasResult = false; *hasResultType = false; break; + case OpHitObjectGetHitKindNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetPrimitiveIndexNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetGeometryIndexNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetInstanceIdNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetInstanceCustomIndexNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetWorldRayDirectionNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetWorldRayOriginNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetRayTMaxNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectGetRayTMinNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectIsEmptyNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectIsHitNV: *hasResult = true; *hasResultType = true; break; + case OpHitObjectIsMissNV: *hasResult = true; *hasResultType = true; break; + case OpReorderThreadWithHitObjectNV: *hasResult = false; *hasResultType = false; break; + case OpReorderThreadWithHintNV: *hasResult = false; *hasResultType = false; break; + case OpTypeHitObjectNV: *hasResult = true; *hasResultType = false; break; + case OpImageSampleFootprintNV: *hasResult = true; *hasResultType = true; break; + case OpEmitMeshTasksEXT: *hasResult = false; *hasResultType = false; break; + case OpSetMeshOutputsEXT: *hasResult = false; *hasResultType = false; break; + case OpGroupNonUniformPartitionNV: *hasResult = true; *hasResultType = true; break; + case OpWritePackedPrimitiveIndices4x8NV: *hasResult = false; *hasResultType = false; break; + case OpReportIntersectionNV: *hasResult = true; *hasResultType = true; break; + case OpIgnoreIntersectionNV: *hasResult = false; *hasResultType = false; break; + case OpTerminateRayNV: *hasResult = false; *hasResultType = false; break; + case OpTraceNV: *hasResult = false; *hasResultType = false; break; + case OpTraceMotionNV: *hasResult = false; *hasResultType = false; break; + case OpTraceRayMotionNV: *hasResult = false; *hasResultType = false; break; + case OpRayQueryGetIntersectionTriangleVertexPositionsKHR: *hasResult = true; *hasResultType = true; break; + case OpTypeAccelerationStructureNV: *hasResult = true; *hasResultType = false; break; + case OpExecuteCallableNV: *hasResult = false; *hasResultType = false; break; + case OpTypeCooperativeMatrixNV: *hasResult = true; *hasResultType = false; break; + case OpCooperativeMatrixLoadNV: *hasResult = true; *hasResultType = true; break; + case OpCooperativeMatrixStoreNV: *hasResult = false; *hasResultType = false; break; + case OpCooperativeMatrixMulAddNV: *hasResult = true; *hasResultType = true; break; + case OpCooperativeMatrixLengthNV: *hasResult = true; *hasResultType = true; break; + case OpBeginInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break; + case OpEndInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break; + case OpDemoteToHelperInvocation: *hasResult = false; *hasResultType = false; break; + case OpIsHelperInvocationEXT: *hasResult = true; *hasResultType = true; break; + case OpConvertUToImageNV: *hasResult = true; *hasResultType = true; break; + case OpConvertUToSamplerNV: *hasResult = true; *hasResultType = true; break; + case OpConvertImageToUNV: *hasResult = true; *hasResultType = true; break; + case OpConvertSamplerToUNV: *hasResult = true; *hasResultType = true; break; + case OpConvertUToSampledImageNV: *hasResult = true; *hasResultType = true; break; + case OpConvertSampledImageToUNV: *hasResult = true; *hasResultType = true; break; + case OpSamplerImageAddressingModeNV: *hasResult = false; *hasResultType = false; break; + case OpSubgroupShuffleINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupShuffleDownINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupShuffleUpINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupShuffleXorINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupBlockReadINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupBlockWriteINTEL: *hasResult = false; *hasResultType = false; break; + case OpSubgroupImageBlockReadINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupImageBlockWriteINTEL: *hasResult = false; *hasResultType = false; break; + case OpSubgroupImageMediaBlockReadINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupImageMediaBlockWriteINTEL: *hasResult = false; *hasResultType = false; break; + case OpUCountLeadingZerosINTEL: *hasResult = true; *hasResultType = true; break; + case OpUCountTrailingZerosINTEL: *hasResult = true; *hasResultType = true; break; + case OpAbsISubINTEL: *hasResult = true; *hasResultType = true; break; + case OpAbsUSubINTEL: *hasResult = true; *hasResultType = true; break; + case OpIAddSatINTEL: *hasResult = true; *hasResultType = true; break; + case OpUAddSatINTEL: *hasResult = true; *hasResultType = true; break; + case OpIAverageINTEL: *hasResult = true; *hasResultType = true; break; + case OpUAverageINTEL: *hasResult = true; *hasResultType = true; break; + case OpIAverageRoundedINTEL: *hasResult = true; *hasResultType = true; break; + case OpUAverageRoundedINTEL: *hasResult = true; *hasResultType = true; break; + case OpISubSatINTEL: *hasResult = true; *hasResultType = true; break; + case OpUSubSatINTEL: *hasResult = true; *hasResultType = true; break; + case OpIMul32x16INTEL: *hasResult = true; *hasResultType = true; break; + case OpUMul32x16INTEL: *hasResult = true; *hasResultType = true; break; + case OpConstantFunctionPointerINTEL: *hasResult = true; *hasResultType = true; break; + case OpFunctionPointerCallINTEL: *hasResult = true; *hasResultType = true; break; + case OpAsmTargetINTEL: *hasResult = true; *hasResultType = true; break; + case OpAsmINTEL: *hasResult = true; *hasResultType = true; break; + case OpAsmCallINTEL: *hasResult = true; *hasResultType = true; break; + case OpAtomicFMinEXT: *hasResult = true; *hasResultType = true; break; + case OpAtomicFMaxEXT: *hasResult = true; *hasResultType = true; break; + case OpAssumeTrueKHR: *hasResult = false; *hasResultType = false; break; + case OpExpectKHR: *hasResult = true; *hasResultType = true; break; + case OpDecorateString: *hasResult = false; *hasResultType = false; break; + case OpMemberDecorateString: *hasResult = false; *hasResultType = false; break; + case OpVmeImageINTEL: *hasResult = true; *hasResultType = true; break; + case OpTypeVmeImageINTEL: *hasResult = true; *hasResultType = false; break; + case OpTypeAvcImePayloadINTEL: *hasResult = true; *hasResultType = false; break; + case OpTypeAvcRefPayloadINTEL: *hasResult = true; *hasResultType = false; break; + case OpTypeAvcSicPayloadINTEL: *hasResult = true; *hasResultType = false; break; + case OpTypeAvcMcePayloadINTEL: *hasResult = true; *hasResultType = false; break; + case OpTypeAvcMceResultINTEL: *hasResult = true; *hasResultType = false; break; + case OpTypeAvcImeResultINTEL: *hasResult = true; *hasResultType = false; break; + case OpTypeAvcImeResultSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = false; break; + case OpTypeAvcImeResultDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = false; break; + case OpTypeAvcImeSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = false; break; + case OpTypeAvcImeDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = false; break; + case OpTypeAvcRefResultINTEL: *hasResult = true; *hasResultType = false; break; + case OpTypeAvcSicResultINTEL: *hasResult = true; *hasResultType = false; break; + case OpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceSetInterShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceSetInterDirectionPenaltyINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceSetMotionVectorCostFunctionINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceSetAcOnlyHaarINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceConvertToImePayloadINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceConvertToImeResultINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceConvertToRefPayloadINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceConvertToRefResultINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceConvertToSicPayloadINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceConvertToSicResultINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetInterDistortionsINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetBestInterDistortionsINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetInterMajorShapeINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetInterMinorShapeINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetInterDirectionsINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetInterMotionVectorCountINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetInterReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeInitializeINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeSetSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeSetDualReferenceINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeRefWindowSizeINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeAdjustRefOffsetINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeSetMaxMotionVectorCountINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeSetUnidirectionalMixDisableINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeSetWeightedSadINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeGetSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeGetDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeStripSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeStripDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeGetBorderReachedINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeGetTruncatedSearchIndicationINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcFmeInitializeINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcBmeInitializeINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcRefConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcRefSetBidirectionalMixDisableINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcRefSetBilinearFilterEnableINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcRefEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcRefEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcRefEvaluateWithMultiReferenceINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcRefConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicInitializeINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicConfigureSkcINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicConfigureIpeLumaINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicConfigureIpeLumaChromaINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicGetMotionVectorMaskINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicSetBilinearFilterEnableINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicSetSkcForwardTransformEnableINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicEvaluateIpeINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicEvaluateWithMultiReferenceINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicGetIpeLumaShapeINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicGetBestIpeLumaDistortionINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicGetBestIpeChromaDistortionINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicGetPackedIpeLumaModesINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicGetIpeChromaModeINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL: *hasResult = true; *hasResultType = true; break; + case OpSubgroupAvcSicGetInterRawSadsINTEL: *hasResult = true; *hasResultType = true; break; + case OpVariableLengthArrayINTEL: *hasResult = true; *hasResultType = true; break; + case OpSaveMemoryINTEL: *hasResult = true; *hasResultType = true; break; + case OpRestoreMemoryINTEL: *hasResult = false; *hasResultType = false; break; + case OpArbitraryFloatSinCosPiINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatCastINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatCastFromIntINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatCastToIntINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatAddINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatSubINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatMulINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatDivINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatGTINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatGEINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatLTINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatLEINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatEQINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatRecipINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatRSqrtINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatCbrtINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatHypotINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatSqrtINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatLogINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatLog2INTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatLog10INTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatLog1pINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatExpINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatExp2INTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatExp10INTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatExpm1INTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatSinINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatCosINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatSinCosINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatSinPiINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatCosPiINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatASinINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatASinPiINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatACosINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatACosPiINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatATanINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatATanPiINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatATan2INTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatPowINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatPowRINTEL: *hasResult = true; *hasResultType = true; break; + case OpArbitraryFloatPowNINTEL: *hasResult = true; *hasResultType = true; break; + case OpLoopControlINTEL: *hasResult = false; *hasResultType = false; break; + case OpAliasDomainDeclINTEL: *hasResult = true; *hasResultType = false; break; + case OpAliasScopeDeclINTEL: *hasResult = true; *hasResultType = false; break; + case OpAliasScopeListDeclINTEL: *hasResult = true; *hasResultType = false; break; + case OpFixedSqrtINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedRecipINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedRsqrtINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedSinINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedCosINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedSinCosINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedSinPiINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedCosPiINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedSinCosPiINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedLogINTEL: *hasResult = true; *hasResultType = true; break; + case OpFixedExpINTEL: *hasResult = true; *hasResultType = true; break; + case OpPtrCastToCrossWorkgroupINTEL: *hasResult = true; *hasResultType = true; break; + case OpCrossWorkgroupCastToPtrINTEL: *hasResult = true; *hasResultType = true; break; + case OpReadPipeBlockingINTEL: *hasResult = true; *hasResultType = true; break; + case OpWritePipeBlockingINTEL: *hasResult = true; *hasResultType = true; break; + case OpFPGARegINTEL: *hasResult = true; *hasResultType = true; break; + case OpRayQueryGetRayTMinKHR: *hasResult = true; *hasResultType = true; break; + case OpRayQueryGetRayFlagsKHR: *hasResult = true; *hasResultType = true; break; + case OpRayQueryGetIntersectionTKHR: *hasResult = true; *hasResultType = true; break; + case OpRayQueryGetIntersectionInstanceCustomIndexKHR: *hasResult = true; *hasResultType = true; break; + case OpRayQueryGetIntersectionInstanceIdKHR: *hasResult = true; *hasResultType = true; break; + case OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR: *hasResult = true; *hasResultType = true; break; + case OpRayQueryGetIntersectionGeometryIndexKHR: *hasResult = true; *hasResultType = true; break; + case OpRayQueryGetIntersectionPrimitiveIndexKHR: *hasResult = true; *hasResultType = true; break; + case OpRayQueryGetIntersectionBarycentricsKHR: *hasResult = true; *hasResultType = true; break; + case OpRayQueryGetIntersectionFrontFaceKHR: *hasResult = true; *hasResultType = true; break; + case OpRayQueryGetIntersectionCandidateAABBOpaqueKHR: *hasResult = true; *hasResultType = true; break; + case OpRayQueryGetIntersectionObjectRayDirectionKHR: *hasResult = true; *hasResultType = true; break; + case OpRayQueryGetIntersectionObjectRayOriginKHR: *hasResult = true; *hasResultType = true; break; + case OpRayQueryGetWorldRayDirectionKHR: *hasResult = true; *hasResultType = true; break; + case OpRayQueryGetWorldRayOriginKHR: *hasResult = true; *hasResultType = true; break; + case OpRayQueryGetIntersectionObjectToWorldKHR: *hasResult = true; *hasResultType = true; break; + case OpRayQueryGetIntersectionWorldToObjectKHR: *hasResult = true; *hasResultType = true; break; + case OpAtomicFAddEXT: *hasResult = true; *hasResultType = true; break; + case OpTypeBufferSurfaceINTEL: *hasResult = true; *hasResultType = false; break; + case OpTypeStructContinuedINTEL: *hasResult = false; *hasResultType = false; break; + case OpConstantCompositeContinuedINTEL: *hasResult = false; *hasResultType = false; break; + case OpSpecConstantCompositeContinuedINTEL: *hasResult = false; *hasResultType = false; break; + case OpControlBarrierArriveINTEL: *hasResult = false; *hasResultType = false; break; + case OpControlBarrierWaitINTEL: *hasResult = false; *hasResultType = false; break; + case OpGroupIMulKHR: *hasResult = true; *hasResultType = true; break; + case OpGroupFMulKHR: *hasResult = true; *hasResultType = true; break; + case OpGroupBitwiseAndKHR: *hasResult = true; *hasResultType = true; break; + case OpGroupBitwiseOrKHR: *hasResult = true; *hasResultType = true; break; + case OpGroupBitwiseXorKHR: *hasResult = true; *hasResultType = true; break; + case OpGroupLogicalAndKHR: *hasResult = true; *hasResultType = true; break; + case OpGroupLogicalOrKHR: *hasResult = true; *hasResultType = true; break; + case OpGroupLogicalXorKHR: *hasResult = true; *hasResultType = true; break; + } +} +#endif /* SPV_ENABLE_UTILITY_CODE */ + +// Overload bitwise operators for mask bit combining + +inline ImageOperandsMask operator|(ImageOperandsMask a, ImageOperandsMask b) { return ImageOperandsMask(unsigned(a) | unsigned(b)); } +inline ImageOperandsMask operator&(ImageOperandsMask a, ImageOperandsMask b) { return ImageOperandsMask(unsigned(a) & unsigned(b)); } +inline ImageOperandsMask operator^(ImageOperandsMask a, ImageOperandsMask b) { return ImageOperandsMask(unsigned(a) ^ unsigned(b)); } +inline ImageOperandsMask operator~(ImageOperandsMask a) { return ImageOperandsMask(~unsigned(a)); } +inline FPFastMathModeMask operator|(FPFastMathModeMask a, FPFastMathModeMask b) { return FPFastMathModeMask(unsigned(a) | unsigned(b)); } +inline FPFastMathModeMask operator&(FPFastMathModeMask a, FPFastMathModeMask b) { return FPFastMathModeMask(unsigned(a) & unsigned(b)); } +inline FPFastMathModeMask operator^(FPFastMathModeMask a, FPFastMathModeMask b) { return FPFastMathModeMask(unsigned(a) ^ unsigned(b)); } +inline FPFastMathModeMask operator~(FPFastMathModeMask a) { return FPFastMathModeMask(~unsigned(a)); } +inline SelectionControlMask operator|(SelectionControlMask a, SelectionControlMask b) { return SelectionControlMask(unsigned(a) | unsigned(b)); } +inline SelectionControlMask operator&(SelectionControlMask a, SelectionControlMask b) { return SelectionControlMask(unsigned(a) & unsigned(b)); } +inline SelectionControlMask operator^(SelectionControlMask a, SelectionControlMask b) { return SelectionControlMask(unsigned(a) ^ unsigned(b)); } +inline SelectionControlMask operator~(SelectionControlMask a) { return SelectionControlMask(~unsigned(a)); } +inline LoopControlMask operator|(LoopControlMask a, LoopControlMask b) { return LoopControlMask(unsigned(a) | unsigned(b)); } +inline LoopControlMask operator&(LoopControlMask a, LoopControlMask b) { return LoopControlMask(unsigned(a) & unsigned(b)); } +inline LoopControlMask operator^(LoopControlMask a, LoopControlMask b) { return LoopControlMask(unsigned(a) ^ unsigned(b)); } +inline LoopControlMask operator~(LoopControlMask a) { return LoopControlMask(~unsigned(a)); } +inline FunctionControlMask operator|(FunctionControlMask a, FunctionControlMask b) { return FunctionControlMask(unsigned(a) | unsigned(b)); } +inline FunctionControlMask operator&(FunctionControlMask a, FunctionControlMask b) { return FunctionControlMask(unsigned(a) & unsigned(b)); } +inline FunctionControlMask operator^(FunctionControlMask a, FunctionControlMask b) { return FunctionControlMask(unsigned(a) ^ unsigned(b)); } +inline FunctionControlMask operator~(FunctionControlMask a) { return FunctionControlMask(~unsigned(a)); } +inline MemorySemanticsMask operator|(MemorySemanticsMask a, MemorySemanticsMask b) { return MemorySemanticsMask(unsigned(a) | unsigned(b)); } +inline MemorySemanticsMask operator&(MemorySemanticsMask a, MemorySemanticsMask b) { return MemorySemanticsMask(unsigned(a) & unsigned(b)); } +inline MemorySemanticsMask operator^(MemorySemanticsMask a, MemorySemanticsMask b) { return MemorySemanticsMask(unsigned(a) ^ unsigned(b)); } +inline MemorySemanticsMask operator~(MemorySemanticsMask a) { return MemorySemanticsMask(~unsigned(a)); } +inline MemoryAccessMask operator|(MemoryAccessMask a, MemoryAccessMask b) { return MemoryAccessMask(unsigned(a) | unsigned(b)); } +inline MemoryAccessMask operator&(MemoryAccessMask a, MemoryAccessMask b) { return MemoryAccessMask(unsigned(a) & unsigned(b)); } +inline MemoryAccessMask operator^(MemoryAccessMask a, MemoryAccessMask b) { return MemoryAccessMask(unsigned(a) ^ unsigned(b)); } +inline MemoryAccessMask operator~(MemoryAccessMask a) { return MemoryAccessMask(~unsigned(a)); } +inline KernelProfilingInfoMask operator|(KernelProfilingInfoMask a, KernelProfilingInfoMask b) { return KernelProfilingInfoMask(unsigned(a) | unsigned(b)); } +inline KernelProfilingInfoMask operator&(KernelProfilingInfoMask a, KernelProfilingInfoMask b) { return KernelProfilingInfoMask(unsigned(a) & unsigned(b)); } +inline KernelProfilingInfoMask operator^(KernelProfilingInfoMask a, KernelProfilingInfoMask b) { return KernelProfilingInfoMask(unsigned(a) ^ unsigned(b)); } +inline KernelProfilingInfoMask operator~(KernelProfilingInfoMask a) { return KernelProfilingInfoMask(~unsigned(a)); } +inline RayFlagsMask operator|(RayFlagsMask a, RayFlagsMask b) { return RayFlagsMask(unsigned(a) | unsigned(b)); } +inline RayFlagsMask operator&(RayFlagsMask a, RayFlagsMask b) { return RayFlagsMask(unsigned(a) & unsigned(b)); } +inline RayFlagsMask operator^(RayFlagsMask a, RayFlagsMask b) { return RayFlagsMask(unsigned(a) ^ unsigned(b)); } +inline RayFlagsMask operator~(RayFlagsMask a) { return RayFlagsMask(~unsigned(a)); } +inline FragmentShadingRateMask operator|(FragmentShadingRateMask a, FragmentShadingRateMask b) { return FragmentShadingRateMask(unsigned(a) | unsigned(b)); } +inline FragmentShadingRateMask operator&(FragmentShadingRateMask a, FragmentShadingRateMask b) { return FragmentShadingRateMask(unsigned(a) & unsigned(b)); } +inline FragmentShadingRateMask operator^(FragmentShadingRateMask a, FragmentShadingRateMask b) { return FragmentShadingRateMask(unsigned(a) ^ unsigned(b)); } +inline FragmentShadingRateMask operator~(FragmentShadingRateMask a) { return FragmentShadingRateMask(~unsigned(a)); } +inline CooperativeMatrixOperandsMask operator|(CooperativeMatrixOperandsMask a, CooperativeMatrixOperandsMask b) { return CooperativeMatrixOperandsMask(unsigned(a) | unsigned(b)); } +inline CooperativeMatrixOperandsMask operator&(CooperativeMatrixOperandsMask a, CooperativeMatrixOperandsMask b) { return CooperativeMatrixOperandsMask(unsigned(a) & unsigned(b)); } +inline CooperativeMatrixOperandsMask operator^(CooperativeMatrixOperandsMask a, CooperativeMatrixOperandsMask b) { return CooperativeMatrixOperandsMask(unsigned(a) ^ unsigned(b)); } +inline CooperativeMatrixOperandsMask operator~(CooperativeMatrixOperandsMask a) { return CooperativeMatrixOperandsMask(~unsigned(a)); } + +} // end namespace spv + +#endif // #ifndef spirv_HPP + diff --git a/third_party/glslang/SPIRV/spvIR.h b/third_party/glslang/SPIRV/spvIR.h index 09691273abf..1f8e28ff469 100755 --- a/third_party/glslang/SPIRV/spvIR.h +++ b/third_party/glslang/SPIRV/spvIR.h @@ -97,6 +97,8 @@ class Instruction { explicit Instruction(Op opCode) : resultId(NoResult), typeId(NoType), opCode(opCode), block(nullptr) { } virtual ~Instruction() {} void addIdOperand(Id id) { + // ids can't be 0 + assert(id); operands.push_back(id); idOperand.push_back(true); } @@ -321,7 +323,7 @@ void inReadableOrder(Block* root, std::functiondump(out); } - + // OpFunction functionInstruction.dump(out); @@ -400,6 +402,9 @@ class Function { end.dump(out); } + LinkageType getLinkType() const { return linkType; } + const char* getExportName() const { return exportName.c_str(); } + protected: Function(const Function&); Function& operator=(Function&); @@ -412,6 +417,8 @@ class Function { bool implicitThis; // true if this is a member function expecting to be passed a 'this' as the first argument bool reducedPrecisionReturn; std::set reducedPrecisionParams; // list of parameter indexes that need a relaxed precision arg + LinkageType linkType; + std::string exportName; }; // @@ -471,10 +478,11 @@ class Module { // Add both // - the OpFunction instruction // - all the OpFunctionParameter instructions -__inline Function::Function(Id id, Id resultType, Id functionType, Id firstParamId, Module& parent) +__inline Function::Function(Id id, Id resultType, Id functionType, Id firstParamId, LinkageType linkage, const std::string& name, Module& parent) : parent(parent), lineInstruction(nullptr), functionInstruction(id, resultType, OpFunction), implicitThis(false), - reducedPrecisionReturn(false) + reducedPrecisionReturn(false), + linkType(linkage) { // OpFunction functionInstruction.addImmediateOperand(FunctionControlMaskNone); @@ -490,6 +498,11 @@ __inline Function::Function(Id id, Id resultType, Id functionType, Id firstParam parent.mapInstruction(param); parameterInstructions.push_back(param); } + + // If importing/exporting, save the function name (without the mangled parameters) for the linkage decoration + if (linkType != LinkageTypeMax) { + exportName = name.substr(0, name.find_first_of('(')); + } } __inline void Function::addLocalVariable(std::unique_ptr inst) diff --git a/third_party/glslang/StandAlone/CMakeLists.txt b/third_party/glslang/StandAlone/CMakeLists.txt index d54a1df8c05..ad88442c91c 100644 --- a/third_party/glslang/StandAlone/CMakeLists.txt +++ b/third_party/glslang/StandAlone/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2020 The Khronos Group Inc. +# Copyright (C) 2020-2023 The Khronos Group Inc. # # All rights reserved. # @@ -31,7 +31,7 @@ # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -find_host_package(PythonInterp 3 REQUIRED) +find_host_package(Python3 REQUIRED) set(GLSLANG_INTRINSIC_H "${GLSLANG_GENERATED_INCLUDEDIR}/glslang/glsl_intrinsic_header.h") set(GLSLANG_INTRINSIC_PY "${CMAKE_CURRENT_SOURCE_DIR}/../gen_extension_headers.py") @@ -39,54 +39,40 @@ set(GLSLANG_INTRINSIC_HEADER_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../glslang/Extensi add_custom_command( OUTPUT ${GLSLANG_INTRINSIC_H} - COMMAND ${PYTHON_EXECUTABLE} "${GLSLANG_INTRINSIC_PY}" + COMMAND Python3::Interpreter "${GLSLANG_INTRINSIC_PY}" "-i" ${GLSLANG_INTRINSIC_HEADER_DIR} "-o" ${GLSLANG_INTRINSIC_H} DEPENDS ${GLSLANG_INTRINSIC_PY} COMMENT "Generating ${GLSLANG_INTRINSIC_H}") -#add_custom_target(glslangValidator DEPENDS ${GLSLANG_INTRINSIC_H}) - -add_library(glslang-default-resource-limits - ${CMAKE_CURRENT_SOURCE_DIR}/ResourceLimits.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/resource_limits_c.cpp) -set_property(TARGET glslang-default-resource-limits PROPERTY FOLDER glslang) -set_property(TARGET glslang-default-resource-limits PROPERTY POSITION_INDEPENDENT_CODE ON) - -target_include_directories(glslang-default-resource-limits - PUBLIC $ - PUBLIC $) - set(SOURCES StandAlone.cpp DirStackFileIncluder.h ${GLSLANG_INTRINSIC_H}) -add_executable(glslangValidator ${SOURCES}) -set_property(TARGET glslangValidator PROPERTY FOLDER tools) -glslang_set_link_args(glslangValidator) +add_executable(glslang-standalone ${SOURCES}) +set_property(TARGET glslang-standalone PROPERTY FOLDER tools) +set_property(TARGET glslang-standalone PROPERTY OUTPUT_NAME glslang) +glslang_set_link_args(glslang-standalone) set(LIBRARIES glslang + OSDependent SPIRV glslang-default-resource-limits) -if(ENABLE_SPVREMAPPER) - set(LIBRARIES ${LIBRARIES} SPVRemapper) -endif() - if(WIN32) set(LIBRARIES ${LIBRARIES} psapi) elseif(UNIX) - if(NOT ANDROID) + if(NOT ANDROID AND NOT QNX) set(LIBRARIES ${LIBRARIES} pthread) endif() endif() -target_link_libraries(glslangValidator ${LIBRARIES}) -target_include_directories(glslangValidator PUBLIC +target_link_libraries(glslang-standalone ${LIBRARIES}) +target_include_directories(glslang-standalone PUBLIC $ $) if(ENABLE_OPT) - target_include_directories(glslangValidator + target_include_directories(glslang-standalone PRIVATE ${spirv-tools_SOURCE_DIR}/include ) endif() @@ -96,7 +82,7 @@ if(ENABLE_SPVREMAPPER) add_executable(spirv-remap ${REMAPPER_SOURCES}) set_property(TARGET spirv-remap PROPERTY FOLDER tools) glslang_set_link_args(spirv-remap) - target_link_libraries(spirv-remap ${LIBRARIES}) + target_link_libraries(spirv-remap SPVRemapper ${LIBRARIES}) endif() if(WIN32) @@ -104,19 +90,35 @@ if(WIN32) endif() if(ENABLE_GLSLANG_INSTALL) - install(TARGETS glslangValidator EXPORT glslang-targets) + install(TARGETS glslang-standalone EXPORT glslang-targets) # Backward compatibility - file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/glslangValidatorTargets.cmake" " - message(WARNING \"Using `glslangValidatorTargets.cmake` is deprecated: use `find_package(glslang)` to find glslang CMake targets.\") + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/glslang-standaloneTargets.cmake" " + message(WARNING \"Using `glslang-standaloneTargets.cmake` is deprecated: use `find_package(glslang)` to find glslang CMake targets.\") - if (NOT TARGET glslang::glslangValidator) - include(\"\${CMAKE_CURRENT_LIST_DIR}/../../${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/glslang-targets.cmake\") + if (NOT TARGET glslang::glslang-standalone) + include(\"${CMAKE_INSTALL_FULL_LIBDIR}/cmake/${PROJECT_NAME}/glslang-targets.cmake\") endif() - add_library(glslangValidator ALIAS glslang::glslangValidator) + add_library(glslang-standalone ALIAS glslang::glslang-standalone) ") - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/glslangValidatorTargets.cmake" DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/glslang-standaloneTargets.cmake" DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake) + + # Create a symbolic link to glslang named glslangValidator for backwards compatibility + set(legacy_glslang_name "glslangValidator${CMAKE_EXECUTABLE_SUFFIX}") + set(link_method create_symlink) + if (WIN32 OR MINGW) + set(link_method copy_if_different) + endif() + add_custom_command(TARGET glslang-standalone + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E ${link_method} $ ${legacy_glslang_name} + WORKING_DIRECTORY $) + + # Create the same symlink at install time + install(CODE "execute_process( \ + COMMAND ${CMAKE_COMMAND} -E ${link_method} $ ${legacy_glslang_name} \ + WORKING_DIRECTORY \$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR})") if(ENABLE_SPVREMAPPER) install(TARGETS spirv-remap EXPORT glslang-targets) @@ -126,7 +128,7 @@ if(ENABLE_GLSLANG_INSTALL) message(WARNING \"Using `spirv-remapTargets.cmake` is deprecated: use `find_package(glslang)` to find glslang CMake targets.\") if (NOT TARGET glslang::spirv-remap) - include(\"\${CMAKE_CURRENT_LIST_DIR}/../../${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/glslang-targets.cmake\") + include(\"${CMAKE_INSTALL_FULL_LIBDIR}/cmake/${PROJECT_NAME}/glslang-targets.cmake\") endif() add_library(spirv-remap ALIAS glslang::spirv-remap) @@ -134,18 +136,4 @@ if(ENABLE_GLSLANG_INSTALL) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/spirv-remapTargets.cmake" DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake) endif() - install(TARGETS glslang-default-resource-limits EXPORT glslang-targets) - - # Backward compatibility - file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/glslang-default-resource-limitsTargets.cmake" " - message(WARNING \"Using `glslang-default-resource-limitsTargets.cmake` is deprecated: use `find_package(glslang)` to find glslang CMake targets.\") - - if (NOT TARGET glslang::glslang-default-resource-limits) - include(\"\${CMAKE_CURRENT_LIST_DIR}/../../${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/glslang-targets.cmake\") - endif() - - add_library(glslang-default-resource-limits ALIAS glslang::glslang-default-resource-limits) - ") - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/glslang-default-resource-limitsTargets.cmake" DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake) - endif() diff --git a/third_party/glslang/StandAlone/StandAlone.cpp b/third_party/glslang/StandAlone/StandAlone.cpp index edde81e281d..b31a6449410 100644 --- a/third_party/glslang/StandAlone/StandAlone.cpp +++ b/third_party/glslang/StandAlone/StandAlone.cpp @@ -41,7 +41,7 @@ #define _CRT_SECURE_NO_WARNINGS #endif -#include "ResourceLimits.h" +#include "glslang/Public/ResourceLimits.h" #include "Worklist.h" #include "DirStackFileIncluder.h" #include "./../glslang/Include/ShHandle.h" @@ -51,15 +51,16 @@ #include "../SPIRV/doc.h" #include "../SPIRV/disassemble.h" -#include -#include +#include +#include #include #include -#include +#include +#include #include #include -#include #include +#include #include "../glslang/OSDependent/osinclude.h" @@ -73,40 +74,41 @@ extern "C" { } // Command-line options -enum TOptions { - EOptionNone = 0, - EOptionIntermediate = (1 << 0), - EOptionSuppressInfolog = (1 << 1), - EOptionMemoryLeakMode = (1 << 2), - EOptionRelaxedErrors = (1 << 3), - EOptionGiveWarnings = (1 << 4), - EOptionLinkProgram = (1 << 5), - EOptionMultiThreaded = (1 << 6), - EOptionDumpConfig = (1 << 7), - EOptionDumpReflection = (1 << 8), - EOptionSuppressWarnings = (1 << 9), - EOptionDumpVersions = (1 << 10), - EOptionSpv = (1 << 11), - EOptionHumanReadableSpv = (1 << 12), - EOptionVulkanRules = (1 << 13), - EOptionDefaultDesktop = (1 << 14), - EOptionOutputPreprocessed = (1 << 15), - EOptionOutputHexadecimal = (1 << 16), - EOptionReadHlsl = (1 << 17), - EOptionCascadingErrors = (1 << 18), - EOptionAutoMapBindings = (1 << 19), - EOptionFlattenUniformArrays = (1 << 20), - EOptionNoStorageFormat = (1 << 21), - EOptionKeepUncalled = (1 << 22), - EOptionHlslOffsets = (1 << 23), - EOptionHlslIoMapping = (1 << 24), - EOptionAutoMapLocations = (1 << 25), - EOptionDebug = (1 << 26), - EOptionStdin = (1 << 27), - EOptionOptimizeDisable = (1 << 28), - EOptionOptimizeSize = (1 << 29), - EOptionInvertY = (1 << 30), - EOptionDumpBareVersion = (1 << 31), +enum TOptions : uint64_t { + EOptionNone = 0, + EOptionIntermediate = (1ull << 0), + EOptionSuppressInfolog = (1ull << 1), + EOptionMemoryLeakMode = (1ull << 2), + EOptionRelaxedErrors = (1ull << 3), + EOptionGiveWarnings = (1ull << 4), + EOptionLinkProgram = (1ull << 5), + EOptionMultiThreaded = (1ull << 6), + EOptionDumpConfig = (1ull << 7), + EOptionDumpReflection = (1ull << 8), + EOptionSuppressWarnings = (1ull << 9), + EOptionDumpVersions = (1ull << 10), + EOptionSpv = (1ull << 11), + EOptionHumanReadableSpv = (1ull << 12), + EOptionVulkanRules = (1ull << 13), + EOptionDefaultDesktop = (1ull << 14), + EOptionOutputPreprocessed = (1ull << 15), + EOptionOutputHexadecimal = (1ull << 16), + EOptionReadHlsl = (1ull << 17), + EOptionCascadingErrors = (1ull << 18), + EOptionAutoMapBindings = (1ull << 19), + EOptionFlattenUniformArrays = (1ull << 20), + EOptionNoStorageFormat = (1ull << 21), + EOptionKeepUncalled = (1ull << 22), + EOptionHlslOffsets = (1ull << 23), + EOptionHlslIoMapping = (1ull << 24), + EOptionAutoMapLocations = (1ull << 25), + EOptionDebug = (1ull << 26), + EOptionStdin = (1ull << 27), + EOptionOptimizeDisable = (1ull << 28), + EOptionOptimizeSize = (1ull << 29), + EOptionInvertY = (1ull << 30), + EOptionDumpBareVersion = (1ull << 31), + EOptionCompileOnly = (1ull << 32), }; bool targetHlslFunctionality1 = false; bool SpvToolsDisassembler = false; @@ -143,13 +145,13 @@ void FreeFileData(char* data); void InfoLogMsg(const char* msg, const char* name, const int num); // Globally track if any compile or link failure. -bool CompileFailed = false; -bool LinkFailed = false; +std::atomic CompileFailed{0}; +std::atomic LinkFailed{0}; +std::atomic CompileOrLinkFailed{0}; // array of unique places to leave the shader names and infologs for the asynchronous compiles std::vector> WorkItems; -TBuiltInResource Resources; std::string ConfigFile; // @@ -158,18 +160,16 @@ std::string ConfigFile; void ProcessConfigFile() { if (ConfigFile.size() == 0) - Resources = glslang::DefaultTBuiltInResource; -#ifndef GLSLANG_WEB + *GetResources() = *GetDefaultResources(); else { char* configString = ReadFileData(ConfigFile.c_str()); - glslang::DecodeResourceLimits(&Resources, configString); + DecodeResourceLimits(GetResources(), configString); FreeFileData(configString); } -#endif } int ReflectOptions = EShReflectionDefault; -int Options = 0; +std::underlying_type_t Options = EOptionNone; const char* ExecutableName = nullptr; const char* binaryFileName = nullptr; const char* depencyFileName = nullptr; @@ -259,6 +259,17 @@ class TPreamble { text.append("\n"); } + void addText(std::string preambleText) + { + fixLine(preambleText); + + Processes.push_back("preamble-text"); + Processes.back().append(preambleText); + + text.append(preambleText); + text.append("\n"); + } + protected: void fixLine(std::string& line) { @@ -505,7 +516,7 @@ void ProcessGlobalBlockSettings(int& argc, char**& argv, std::string* name, unsi if (set) { errno = 0; - int setVal = ::strtol(argv[curArg], NULL, 10); + int setVal = ::strtol(argv[curArg], nullptr, 10); if (errno || setVal < 0) { printf("%s: invalid set\n", argv[curArg]); usage(); @@ -517,7 +528,7 @@ void ProcessGlobalBlockSettings(int& argc, char**& argv, std::string* name, unsi if (binding) { errno = 0; - int bindingVal = ::strtol(argv[curArg], NULL, 10); + int bindingVal = ::strtol(argv[curArg], nullptr, 10); if (errno || bindingVal < 0) { printf("%s: invalid binding\n", argv[curArg]); usage(); @@ -595,12 +606,12 @@ void ProcessArguments(std::vector>& workItem const auto getUniformOverride = [getStringOperand]() { const char *arg = getStringOperand("-u:"); const char *split = strchr(arg, ':'); - if (split == NULL) { + if (split == nullptr) { printf("%s: missing location\n", arg); exit(EFailUsage); } errno = 0; - int location = ::strtol(split + 1, NULL, 10); + int location = ::strtol(split + 1, nullptr, 10); if (errno) { printf("%s: invalid location\n", arg); exit(EFailUsage); @@ -627,7 +638,7 @@ void ProcessArguments(std::vector>& workItem } else if (lowerword == "uniform-base") { if (argc <= 1) Error("no provided", lowerword.c_str()); - uniformBase = ::strtol(argv[1], NULL, 10); + uniformBase = ::strtol(argv[1], nullptr, 10); bumpArg(); break; } else if (lowerword == "client") { @@ -715,7 +726,7 @@ void ProcessArguments(std::vector>& workItem HlslDxPositionW = true; } else if (lowerword == "enhanced-msgs") { EnhancedMsgs = true; - } else if (lowerword == "auto-sampled-textures") { + } else if (lowerword == "auto-sampled-textures") { autoSampledTextures = true; } else if (lowerword == "invert-y" || // synonyms lowerword == "iy") { @@ -728,6 +739,13 @@ void ProcessArguments(std::vector>& workItem } else if (lowerword == "no-storage-format" || // synonyms lowerword == "nsf") { Options |= EOptionNoStorageFormat; + } else if (lowerword == "preamble-text" || + lowerword == "p") { + if (argc > 1) + UserPreamble.addText(argv[1]); + else + Error("expects ", argv[0]); + bumpArg(); } else if (lowerword == "relaxed-errors") { Options |= EOptionRelaxedErrors; } else if (lowerword == "reflect-strict-array-suffix") { @@ -874,6 +892,8 @@ void ProcessArguments(std::vector>& workItem bumpArg(); } else if (lowerword == "version") { Options |= EOptionDumpVersions; + } else if (lowerword == "no-link") { + Options |= EOptionCompileOnly; } else if (lowerword == "help") { usage(); break; @@ -927,6 +947,9 @@ void ProcessArguments(std::vector>& workItem else Error("unknown -O option"); break; + case 'P': + UserPreamble.addText(getStringOperand("-P")); + break; case 'R': VulkanRulesRelaxed = true; break; @@ -1145,6 +1168,7 @@ void CompileShaders(glslang::TWorklist& worklist) if (Options & EOptionDebug) Error("cannot generate debug information unless linking to generate code"); + // NOTE: TWorkList::remove is thread-safe glslang::TWorkItem* workItem; if (Options & EOptionStdin) { if (worklist.remove(workItem)) { @@ -1162,7 +1186,7 @@ void CompileShaders(glslang::TWorklist& worklist) } else { while (worklist.remove(workItem)) { ShHandle compiler = ShConstructCompiler(FindLanguage(workItem->name), Options); - if (compiler == 0) + if (compiler == nullptr) return; CompileFile(workItem->name.c_str(), compiler); @@ -1292,13 +1316,14 @@ void CompileAndLinkShaderUnits(std::vector compUnits) // glslang::TProgram& program = *new glslang::TProgram; + const bool compileOnly = (Options & EOptionCompileOnly) != 0; for (auto it = compUnits.cbegin(); it != compUnits.cend(); ++it) { const auto &compUnit = *it; for (int i = 0; i < compUnit.count; i++) { sources.push_back(compUnit.fileNameList[i]); } glslang::TShader* shader = new glslang::TShader(compUnit.stage); - shader->setStringsWithLengthsAndNames(compUnit.text, NULL, compUnit.fileNameList, compUnit.count); + shader->setStringsWithLengthsAndNames(compUnit.text, nullptr, compUnit.fileNameList, compUnit.count); if (entryPointName) shader->setEntryPoint(entryPointName); if (sourceEntryPointName) { @@ -1308,6 +1333,9 @@ void CompileAndLinkShaderUnits(std::vector compUnits) shader->setSourceEntryPoint(sourceEntryPointName); } + if (compileOnly) + shader->setCompileOnly(); + shader->setOverrideVersion(GlslVersion); std::string intrinsicString = getIntrinsic(compUnit.text, compUnit.count); @@ -1322,7 +1350,6 @@ void CompileAndLinkShaderUnits(std::vector compUnits) shader->setPreamble(PreambleString.c_str()); shader->addProcesses(Processes); -#ifndef GLSLANG_WEB // Set IO mapper binding shift values for (int r = 0; r < glslang::EResCount; ++r) { const glslang::TResourceType res = glslang::TResourceType(r); @@ -1354,7 +1381,6 @@ void CompileAndLinkShaderUnits(std::vector compUnits) } shader->setUniformLocationBase(uniformBase); -#endif if (VulkanRulesRelaxed) { for (auto& storageOverride : blockStorageOverrides) { @@ -1414,24 +1440,23 @@ void CompileAndLinkShaderUnits(std::vector compUnits) const int defaultVersion = Options & EOptionDefaultDesktop ? 110 : 100; -#ifndef GLSLANG_WEB if (Options & EOptionOutputPreprocessed) { std::string str; - if (shader->preprocess(&Resources, defaultVersion, ENoProfile, false, false, messages, &str, includer)) { + if (shader->preprocess(GetResources(), defaultVersion, ENoProfile, false, false, messages, &str, includer)) { PutsIfNonEmpty(str.c_str()); } else { - CompileFailed = true; + CompileFailed = 1; } StderrIfNonEmpty(shader->getInfoLog()); StderrIfNonEmpty(shader->getInfoDebugLog()); continue; } -#endif - if (! shader->parse(&Resources, defaultVersion, false, messages, includer)) - CompileFailed = true; + if (! shader->parse(GetResources(), defaultVersion, false, messages, includer)) + CompileFailed = 1; - program.addShader(shader); + if (!compileOnly) + program.addShader(shader); if (! (Options & EOptionSuppressInfolog) && ! (Options & EOptionMemoryLeakMode)) { @@ -1446,83 +1471,98 @@ void CompileAndLinkShaderUnits(std::vector compUnits) // Program-level processing... // - // Link - if (! (Options & EOptionOutputPreprocessed) && ! program.link(messages)) - LinkFailed = true; - -#ifndef GLSLANG_WEB - // Map IO - if (Options & EOptionSpv) { - if (!program.mapIO()) + if (!compileOnly) { + // Link + if (!(Options & EOptionOutputPreprocessed) && !program.link(messages)) LinkFailed = true; - } -#endif - // Report - if (! (Options & EOptionSuppressInfolog) && - ! (Options & EOptionMemoryLeakMode)) { - PutsIfNonEmpty(program.getInfoLog()); - PutsIfNonEmpty(program.getInfoDebugLog()); - } + // Map IO + if (Options & EOptionSpv) { + if (!program.mapIO()) + LinkFailed = true; + } -#ifndef GLSLANG_WEB - // Reflect - if (Options & EOptionDumpReflection) { - program.buildReflection(ReflectOptions); - program.dumpReflection(); + // Report + if (!(Options & EOptionSuppressInfolog) && !(Options & EOptionMemoryLeakMode)) { + PutsIfNonEmpty(program.getInfoLog()); + PutsIfNonEmpty(program.getInfoDebugLog()); + } + + // Reflect + if (Options & EOptionDumpReflection) { + program.buildReflection(ReflectOptions); + program.dumpReflection(); + } } -#endif std::vector outputFiles; // Dump SPIR-V if (Options & EOptionSpv) { - if (CompileFailed || LinkFailed) + CompileOrLinkFailed.fetch_or(CompileFailed); + CompileOrLinkFailed.fetch_or(LinkFailed); + if (static_cast(CompileOrLinkFailed.load())) printf("SPIR-V is not generated for failed compile or link\n"); else { - for (int stage = 0; stage < EShLangCount; ++stage) { - if (program.getIntermediate((EShLanguage)stage)) { - std::vector spirv; - spv::SpvBuildLogger logger; - glslang::SpvOptions spvOptions; - if (Options & EOptionDebug) { - spvOptions.generateDebugInfo = true; - if (emitNonSemanticShaderDebugInfo) { - spvOptions.emitNonSemanticShaderDebugInfo = true; - if (emitNonSemanticShaderDebugSource) { - spvOptions.emitNonSemanticShaderDebugSource = true; - } - } - } else if (stripDebugInfo) - spvOptions.stripDebugInfo = true; - spvOptions.disableOptimizer = (Options & EOptionOptimizeDisable) != 0; - spvOptions.optimizeSize = (Options & EOptionOptimizeSize) != 0; - spvOptions.disassemble = SpvToolsDisassembler; - spvOptions.validate = SpvToolsValidate; - glslang::GlslangToSpv(*program.getIntermediate((EShLanguage)stage), spirv, &logger, &spvOptions); - - // Dump the spv to a file or stdout, etc., but only if not doing - // memory/perf testing, as it's not internal to programmatic use. - if (! (Options & EOptionMemoryLeakMode)) { - printf("%s", logger.getAllMessages().c_str()); - if (Options & EOptionOutputHexadecimal) { - glslang::OutputSpvHex(spirv, GetBinaryName((EShLanguage)stage), variableName); - } else { - glslang::OutputSpvBin(spirv, GetBinaryName((EShLanguage)stage)); + std::vector intermediates; + if (!compileOnly) { + for (int stage = 0; stage < EShLangCount; ++stage) { + if (auto* i = program.getIntermediate((EShLanguage)stage)) { + intermediates.emplace_back(i); + } + } + } else { + for (const auto* shader : shaders) { + if (auto* i = shader->getIntermediate()) { + intermediates.emplace_back(i); + } + } + } + for (auto* intermediate : intermediates) { + std::vector spirv; + spv::SpvBuildLogger logger; + glslang::SpvOptions spvOptions; + if (Options & EOptionDebug) { + spvOptions.generateDebugInfo = true; + if (emitNonSemanticShaderDebugInfo) { + spvOptions.emitNonSemanticShaderDebugInfo = true; + if (emitNonSemanticShaderDebugSource) { + spvOptions.emitNonSemanticShaderDebugSource = true; } - - outputFiles.push_back(GetBinaryName((EShLanguage)stage)); -#ifndef GLSLANG_WEB - if (!SpvToolsDisassembler && (Options & EOptionHumanReadableSpv)) - spv::Disassemble(std::cout, spirv); -#endif } + } else if (stripDebugInfo) + spvOptions.stripDebugInfo = true; + spvOptions.disableOptimizer = (Options & EOptionOptimizeDisable) != 0; + spvOptions.optimizeSize = (Options & EOptionOptimizeSize) != 0; + spvOptions.disassemble = SpvToolsDisassembler; + spvOptions.validate = SpvToolsValidate; + spvOptions.compileOnly = compileOnly; + glslang::GlslangToSpv(*intermediate, spirv, &logger, &spvOptions); + + // Dump the spv to a file or stdout, etc., but only if not doing + // memory/perf testing, as it's not internal to programmatic use. + if (!(Options & EOptionMemoryLeakMode)) { + printf("%s", logger.getAllMessages().c_str()); + const auto filename = GetBinaryName(intermediate->getStage()); + if (Options & EOptionOutputHexadecimal) { + if (!glslang::OutputSpvHex(spirv, filename, variableName)) + exit(EFailUsage); + } else { + if (!glslang::OutputSpvBin(spirv, filename)) + exit(EFailUsage); + } + + outputFiles.push_back(filename); + if (!SpvToolsDisassembler && (Options & EOptionHumanReadableSpv)) + spv::Disassemble(std::cout, spirv); } } } } - if (depencyFileName && !(CompileFailed || LinkFailed)) { + CompileOrLinkFailed.fetch_or(CompileFailed); + CompileOrLinkFailed.fetch_or(LinkFailed); + if (depencyFileName && !static_cast(CompileOrLinkFailed.load())) { std::set includedFiles = includer.getIncludedFiles(); sources.insert(sources.end(), includedFiles.begin(), includedFiles.end()); @@ -1610,13 +1650,11 @@ int singleMain() workList.add(item.get()); }); -#ifndef GLSLANG_WEB if (Options & EOptionDumpConfig) { - printf("%s", glslang::GetDefaultTBuiltInResourceString().c_str()); + printf("%s", GetDefaultTBuiltInResourceString().c_str()); if (workList.empty()) return ESuccess; } -#endif if (Options & EOptionDumpBareVersion) { printf("%d:%d.%d.%d%s\n", glslang::GetSpirvGeneratorVersion(), GLSLANG_VERSION_MAJOR, GLSLANG_VERSION_MINOR, @@ -1700,9 +1738,9 @@ int singleMain() ShFinalize(); } - if (CompileFailed) + if (CompileFailed.load()) return EFailCompile; - if (LinkFailed) + if (LinkFailed.load()) return EFailLink; return 0; @@ -1833,12 +1871,12 @@ void CompileFile(const char* fileName, ShHandle compiler) SetMessageOptions(messages); if (UserPreamble.isSet()) - Error("-D and -U options require -l (linking)\n"); + Error("-D, -U and -P options require -l (linking)\n"); for (int i = 0; i < ((Options & EOptionMemoryLeakMode) ? 100 : 1); ++i) { for (int j = 0; j < ((Options & EOptionMemoryLeakMode) ? 100 : 1); ++j) { // ret = ShCompile(compiler, shaderStrings, NumShaderStrings, lengths, EShOptNone, &Resources, Options, (Options & EOptionDefaultDesktop) ? 110 : 100, false, messages); - ret = ShCompile(compiler, &shaderString, 1, nullptr, EShOptNone, &Resources, Options, (Options & EOptionDefaultDesktop) ? 110 : 100, false, messages); + ret = ShCompile(compiler, &shaderString, 1, nullptr, EShOptNone, GetResources(), Options, (Options & EOptionDefaultDesktop) ? 110 : 100, false, messages); // const char* multi[12] = { "# ve", "rsion", " 300 e", "s", "\n#err", // "or should be l", "ine 1", "string 5\n", "float glo", "bal", // ";\n#error should be line 2\n void main() {", "global = 2.3;}" }; @@ -1862,7 +1900,7 @@ void CompileFile(const char* fileName, ShHandle compiler) // void usage() { - printf("Usage: glslangValidator [option]... [file]...\n" + printf("Usage: glslang [option]... [file]...\n" "\n" "'file' can end in . for auto-stage classification, where is:\n" " .conf to provide a config file that replaces the default configuration\n" @@ -1903,6 +1941,9 @@ void usage() " is searched first, followed by left-to-right order of -I\n" " -Od disables optimization; may cause illegal SPIR-V for HLSL\n" " -Os optimizes SPIR-V to minimize size\n" + " -P | --preamble-text | --P \n" + " inject custom preamble text, which is treated as if it\n" + " appeared immediately after the version declaration (if any).\n" " -R use relaxed verification rules for generating Vulkan SPIR-V,\n" " allowing the use of default uniforms, atomic_uints, and\n" " gl_VertexID and gl_InstanceID keywords.\n" @@ -1950,7 +1991,7 @@ void usage() " without explicit bindings\n" " --auto-map-locations | --aml automatically locate input/output lacking\n" " 'location' (fragile, not cross stage)\n" - " --auto-sampled-textures Removes sampler variables and converts\n" + " --auto-sampled-textures Removes sampler variables and converts\n" " existing textures to sampled textures\n" " --client {vulkan|opengl} see -V and -G\n" " --depfile writes depfile for build systems\n" @@ -2065,7 +2106,9 @@ void usage() " --vn creates a C header file that contains a\n" " uint32_t array named \n" " initialized with the shader binary code\n" - ); + " --no-link Only compile shader; do not link (GLSL-only)\n" + " NOTE: this option will set the export linkage\n" + " attribute on all functions\n"); exit(EFailUsage); } diff --git a/third_party/glslang/StandAlone/spirv-remap.cpp b/third_party/glslang/StandAlone/spirv-remap.cpp index 15c3ac513bd..1bd4a2d6a61 100644 --- a/third_party/glslang/StandAlone/spirv-remap.cpp +++ b/third_party/glslang/StandAlone/spirv-remap.cpp @@ -37,7 +37,11 @@ #include #include #include +#include +// +// Include remapper +// #include "../SPIRV/SPVRemapper.h" namespace { @@ -157,7 +161,7 @@ namespace { } // Print helpful usage message to stdout, and exit - void usage(const char* const name, const char* const msg = 0) + void usage(const char* const name, const char* const msg = nullptr) { if (msg) std::cout << msg << std::endl << std::endl; @@ -172,7 +176,7 @@ namespace { << " [--strip-all | --strip all | -s]" << " [--strip-white-list]" << " [--do-everything]" - << " --input | -i file1 [file2...] --output|-o DESTDIR" + << " --input | -i file1 [file2...] --output|-o DESTDIR | destfile1 [destfile2...]" << std::endl; std::cout << " " << basename(name) << " [--version | -V]" << std::endl; @@ -182,32 +186,45 @@ namespace { } // grind through each SPIR in turn - void execute(const std::vector& inputFile, const std::string& outputDir, - const std::string& whiteListFile, int opts, int verbosity) + void execute(const std::vector& inputFiles, + const std::vector& outputDirOrFiles, + const bool isSingleOutputDir, + const std::string& whiteListFile, + int opts, + int verbosity) { std::vector whiteListStrings; - if(!whiteListFile.empty()) + if (!whiteListFile.empty()) read(whiteListStrings, whiteListFile, verbosity); - for (auto it = inputFile.cbegin(); it != inputFile.cend(); ++it) { - const std::string &filename = *it; + for (std::size_t ii=0; ii spv; - read(spv, filename, verbosity); + read(spv, inputFiles[ii], verbosity); + spv::spirvbin_t(verbosity).remap(spv, whiteListStrings, opts); - const std::string outfile = outputDir + path_sep_char() + basename(filename); - write(spv, outfile, verbosity); + + if (isSingleOutputDir) { + // write all outputs to same directory + const std::string outFile = outputDirOrFiles[0] + path_sep_char() + basename(inputFiles[ii]); + write(spv, outFile, verbosity); + } else { + // write each input to its associated output + write(spv, outputDirOrFiles[ii], verbosity); + } } if (verbosity > 0) - std::cout << "Done: " << inputFile.size() << " file(s) processed" << std::endl; + std::cout << "Done: " << inputFiles.size() << " file(s) processed" << std::endl; } // Parse command line options - void parseCmdLine(int argc, char** argv, std::vector& inputFile, - std::string& outputDir, - std::string& stripWhiteListFile, - int& options, - int& verbosity) + void parseCmdLine(int argc, + char** argv, + std::vector& inputFiles, + std::vector& outputDirOrFiles, + std::string& stripWhiteListFile, + int& options, + int& verbosity) { if (argc < 2) usage(argv[0]); @@ -222,18 +239,19 @@ namespace { const std::string arg = argv[a]; if (arg == "--output" || arg == "-o") { - // Output directory - if (++a >= argc) - usage(argv[0], "--output requires an argument"); - if (!outputDir.empty()) - usage(argv[0], "--output can be provided only once"); - - outputDir = argv[a++]; + // Collect output dirs or files + for (++a; a < argc && argv[a][0] != '-'; ++a) + outputDirOrFiles.push_back(argv[a]); - // Remove trailing directory separator characters - while (!outputDir.empty() && outputDir.back() == path_sep_char()) - outputDir.pop_back(); + if (outputDirOrFiles.size() == 0) + usage(argv[0], "--output requires an argument"); + // Remove trailing directory separator characters from all paths + for (std::size_t ii=0; ii inputFile; - std::string outputDir; + std::vector inputFiles; + std::vector outputDirOrFiles; std::string whiteListFile; int opts; int verbosity; -#ifdef use_cpp11 // handle errors by exiting spv::spirvbin_t::registerErrorHandler(errHandler); // Log messages to std::cout spv::spirvbin_t::registerLogHandler(logHandler); -#endif if (argc < 2) usage(argv[0]); - parseCmdLine(argc, argv, inputFile, outputDir, whiteListFile, opts, verbosity); + parseCmdLine(argc, argv, inputFiles, outputDirOrFiles, whiteListFile, opts, verbosity); + + if (outputDirOrFiles.empty()) + usage(argv[0], "Output directory or file(s) required."); + + const bool isMultiInput = inputFiles.size() > 1; + const bool isMultiOutput = outputDirOrFiles.size() > 1; + const bool isSingleOutputDir = !isMultiOutput && std::filesystem::is_directory(outputDirOrFiles[0]); + + if (isMultiInput && !isMultiOutput && !isSingleOutputDir) + usage(argv[0], "Output is not a directory."); + - if (outputDir.empty()) - usage(argv[0], "Output directory required"); + if (isMultiInput && isMultiOutput && (outputDirOrFiles.size() != inputFiles.size())) + usage(argv[0], "Output must be either a single directory or one output file per input."); // Main operations: read, remap, and write. - execute(inputFile, outputDir, whiteListFile, opts, verbosity); + execute(inputFiles, outputDirOrFiles, isSingleOutputDir, whiteListFile, opts, verbosity); // If we get here, everything went OK! Nothing more to be done. } diff --git a/third_party/glslang/WORKSPACE b/third_party/glslang/WORKSPACE deleted file mode 100644 index 488546c7cdd..00000000000 --- a/third_party/glslang/WORKSPACE +++ /dev/null @@ -1,27 +0,0 @@ -workspace(name = "org_khronos_glslang") -load( - "@bazel_tools//tools/build_defs/repo:http.bzl", - "http_archive", -) - -http_archive( - name = "com_google_googletest", - sha256 = "94c634d499558a76fa649edb13721dce6e98fb1e7018dfaeba3cd7a083945e91", - strip_prefix = "googletest-release-1.10.0", - urls = ["https://github.com/google/googletest/archive/release-1.10.0.zip"], # 3-Oct-2019 -) - -http_archive( - name = "com_googlesource_code_re2", - sha256 = "b885bb965ab4b6cf8718bbb8154d8f6474cd00331481b6d3e390babb3532263e", - strip_prefix = "re2-e860767c86e577b87deadf24cc4567ea83c4f162/", - urls = ["https://github.com/google/re2/archive/e860767c86e577b87deadf24cc4567ea83c4f162.zip"], -) - -http_archive( - name = "com_google_effcee", - build_file = "BUILD.effcee.bazel", - sha256 = "b0c21a01995fdf9792510566d78d5e7fe6f83cb4ba986eba691f4926f127cb34", - strip_prefix = "effcee-8f0a61dc95e0df18c18e0ac56d83b3fa9d2fe90b/", - urls = ["https://github.com/google/effcee/archive/8f0a61dc95e0df18c18e0ac56d83b3fa9d2fe90b.zip"], -) diff --git a/third_party/glslang/gen_extension_headers.py b/third_party/glslang/gen_extension_headers.py index 2838c9622e8..0638720a074 100644 --- a/third_party/glslang/gen_extension_headers.py +++ b/third_party/glslang/gen_extension_headers.py @@ -57,7 +57,7 @@ def generate_main(glsl_files, output_header_file): contents += '\tfor (int i = 0; i < n; i++) {\n' for symbol_name in symbol_name_list: - contents += '\t\tif (strstr(shaders[i], "%s") != NULL) {\n' % (symbol_name) + contents += '\t\tif (strstr(shaders[i], "%s") != nullptr) {\n' % (symbol_name) contents += '\t\t shaderString.append(%s_GLSL);\n' % (symbol_name) contents += '\t\t}\n' diff --git a/third_party/glslang/glslang/CInterface/glslang_c_interface.cpp b/third_party/glslang/glslang/CInterface/glslang_c_interface.cpp index ead005c32f8..870698f2a8d 100644 --- a/third_party/glslang/glslang/CInterface/glslang_c_interface.cpp +++ b/third_party/glslang/glslang/CInterface/glslang_c_interface.cpp @@ -33,7 +33,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "glslang/Include/glslang_c_interface.h" #include "StandAlone/DirStackFileIncluder.h" -#include "StandAlone/ResourceLimits.h" +#include "glslang/Public/ResourceLimits.h" #include "glslang/Include/ShHandle.h" #include "glslang/Include/ResourceLimits.h" @@ -80,25 +80,6 @@ typedef struct glslang_program_s { (CallbackIncluder::callbacks::free_include_result) */ class CallbackIncluder : public glslang::TShader::Includer { -public: - /* Wrapper of IncludeResult which stores a glsl_include_result object internally */ - class CallbackIncludeResult : public glslang::TShader::Includer::IncludeResult { - public: - CallbackIncludeResult(const std::string& headerName, const char* const headerData, const size_t headerLength, - void* userData, glsl_include_result_t* includeResult) - : glslang::TShader::Includer::IncludeResult(headerName, headerData, headerLength, userData), - includeResult(includeResult) - { - } - - virtual ~CallbackIncludeResult() {} - - protected: - friend class CallbackIncluder; - - glsl_include_result_t* includeResult; - }; - public: CallbackIncluder(glsl_include_callbacks_t _callbacks, void* _context) : callbacks(_callbacks), context(_context) {} @@ -110,9 +91,7 @@ class CallbackIncluder : public glslang::TShader::Includer { if (this->callbacks.include_system) { glsl_include_result_t* result = this->callbacks.include_system(this->context, headerName, includerName, inclusionDepth); - - return new CallbackIncludeResult(std::string(headerName), result->header_data, result->header_length, - nullptr, result); + return makeIncludeResult(result); } return glslang::TShader::Includer::includeSystem(headerName, includerName, inclusionDepth); @@ -124,9 +103,7 @@ class CallbackIncluder : public glslang::TShader::Includer { if (this->callbacks.include_local) { glsl_include_result_t* result = this->callbacks.include_local(this->context, headerName, includerName, inclusionDepth); - - return new CallbackIncludeResult(std::string(headerName), result->header_data, result->header_length, - nullptr, result); + return makeIncludeResult(result); } return glslang::TShader::Includer::includeLocal(headerName, includerName, inclusionDepth); @@ -139,22 +116,25 @@ class CallbackIncluder : public glslang::TShader::Includer { if (result == nullptr) return; - if (this->callbacks.free_include_result && (result->userData == nullptr)) { - CallbackIncludeResult* innerResult = static_cast(result); - /* use internal free() function */ - this->callbacks.free_include_result(this->context, innerResult->includeResult); - /* ignore internal fields of TShader::Includer::IncludeResult */ - delete result; - return; + if (this->callbacks.free_include_result) { + this->callbacks.free_include_result(this->context, static_cast(result->userData)); } - delete[] static_cast(result->userData); delete result; } private: CallbackIncluder() {} + IncludeResult* makeIncludeResult(glsl_include_result_t* result) { + if (!result) { + return nullptr; + } + + return new glslang::TShader::Includer::IncludeResult( + std::string(result->header_name), result->header_data, result->header_length, result); + } + /* C callback pointers */ glsl_include_callbacks_t callbacks; /* User-defined context */ @@ -351,6 +331,10 @@ GLSLANG_EXPORT glslang_shader_t* glslang_shader_create(const glslang_input_t* in return shader; } +GLSLANG_EXPORT void glslang_shader_set_preamble(glslang_shader_t* shader, const char* s) { + shader->shader->setPreamble(s); +} + GLSLANG_EXPORT void glslang_shader_shift_binding(glslang_shader_t* shader, glslang_resource_type_t res, unsigned int base) { const glslang::TResourceType res_type = glslang::TResourceType(res); @@ -390,8 +374,11 @@ GLSLANG_EXPORT const char* glslang_shader_get_preprocessed_code(glslang_shader_t GLSLANG_EXPORT int glslang_shader_preprocess(glslang_shader_t* shader, const glslang_input_t* input) { - DirStackFileIncluder Includer; - /* TODO: use custom callbacks if they are available in 'i->callbacks' */ + DirStackFileIncluder dirStackFileIncluder; + CallbackIncluder callbackIncluder(input->callbacks, input->callbacks_ctx); + glslang::TShader::Includer& Includer = (input->callbacks.include_local||input->callbacks.include_system) + ? static_cast(callbackIncluder) + : static_cast(dirStackFileIncluder); return shader->shader->preprocess( reinterpret_cast(input->resource), input->default_version, diff --git a/third_party/glslang/glslang/CMakeLists.txt b/third_party/glslang/glslang/CMakeLists.txt index f63e8fc328e..57fb1b9ea58 100644 --- a/third_party/glslang/glslang/CMakeLists.txt +++ b/third_party/glslang/glslang/CMakeLists.txt @@ -33,7 +33,7 @@ if(WIN32) add_subdirectory(OSDependent/Windows) -elseif(UNIX OR "${CMAKE_SYSTEM_NAME}" STREQUAL "Fuchsia") +elseif(UNIX OR "${CMAKE_SYSTEM_NAME}" STREQUAL "Fuchsia" OR ANDROID) add_subdirectory(OSDependent/Unix) else() message("unknown platform") @@ -57,7 +57,6 @@ set_property(TARGET GenericCodeGen PROPERTY FOLDER glslang) # MachineIndependent ################################################################################ set(MACHINEINDEPENDENT_SOURCES - MachineIndependent/glslang.m4 MachineIndependent/glslang.y MachineIndependent/glslang_tab.cpp MachineIndependent/attribute.cpp @@ -183,6 +182,30 @@ if(WIN32 AND BUILD_SHARED_LIBS) set_target_properties(glslang PROPERTIES PREFIX "") endif() +################################################################################ +# ResourceLimits +################################################################################ +set(RESOURCELIMITS_SOURCES + ResourceLimits/ResourceLimits.cpp + ResourceLimits/resource_limits_c.cpp +) + +set(RESOURCELIMITS_HEADERS + Public/ResourceLimits.h + Public/resource_limits_c.h +) + +add_library(glslang-default-resource-limits ${RESOURCELIMITS_SOURCES} ${RESOURCELIMITS_HEADERS}) +set_target_properties(glslang-default-resource-limits PROPERTIES + VERSION "${GLSLANG_VERSION}" + SOVERSION "${GLSLANG_VERSION_MAJOR}" + FOLDER glslang + POSITION_INDEPENDENT_CODE ON) + +target_include_directories(glslang-default-resource-limits PUBLIC + $ + $) + ################################################################################ # source_groups ################################################################################ @@ -201,30 +224,33 @@ endif() ################################################################################ if(ENABLE_GLSLANG_INSTALL) install(TARGETS glslang EXPORT glslang-targets) - install(TARGETS MachineIndependent EXPORT glslang-targets) - install(TARGETS GenericCodeGen EXPORT glslang-targets) + if(NOT BUILD_SHARED_LIBS) + install(TARGETS MachineIndependent EXPORT glslang-targets) + install(TARGETS GenericCodeGen EXPORT glslang-targets) - # Backward compatibility - file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/glslangTargets.cmake" " - message(WARNING \"Using `glslangTargets.cmake` is deprecated: use `find_package(glslang)` to find glslang CMake targets.\") + # Backward compatibility + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/glslangTargets.cmake" " + message(WARNING \"Using `glslangTargets.cmake` is deprecated: use `find_package(glslang)` to find glslang CMake targets.\") - if (NOT TARGET glslang::glslang) - include(\"\${CMAKE_CURRENT_LIST_DIR}/../../${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/glslang-targets.cmake\") - endif() + if (NOT TARGET glslang::glslang) + include(\"${CMAKE_INSTALL_FULL_LIBDIR}/cmake/${PROJECT_NAME}/glslang-targets.cmake\") + endif() - if(${BUILD_SHARED_LIBS}) - add_library(glslang ALIAS glslang::glslang) - else() - add_library(glslang ALIAS glslang::glslang) - add_library(MachineIndependent ALIAS glslang::MachineIndependent) - add_library(GenericCodeGen ALIAS glslang::GenericCodeGen) - endif() - ") - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/glslangTargets.cmake" DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake) + if(${BUILD_SHARED_LIBS}) + add_library(glslang ALIAS glslang::glslang) + else() + add_library(glslang ALIAS glslang::glslang) + add_library(MachineIndependent ALIAS glslang::MachineIndependent) + add_library(GenericCodeGen ALIAS glslang::GenericCodeGen) + endif() + ") + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/glslangTargets.cmake" DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake) + endif() set(ALL_HEADERS ${GLSLANG_HEADERS} - ${MACHINEINDEPENDENT_HEADERS}) + ${MACHINEINDEPENDENT_HEADERS} + ${RESOURCELIMITS_HEADERS}) foreach(file ${ALL_HEADERS}) get_filename_component(dir ${file} DIRECTORY) @@ -233,4 +259,18 @@ if(ENABLE_GLSLANG_INSTALL) install(FILES ${GLSLANG_BUILD_INFO_H} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/glslang) + install(TARGETS glslang-default-resource-limits EXPORT glslang-targets) + + # Backward compatibility + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/glslang-default-resource-limitsTargets.cmake" " + message(WARNING \"Using `glslang-default-resource-limitsTargets.cmake` is deprecated: use `find_package(glslang)` to find glslang CMake targets.\") + + if (NOT TARGET glslang::glslang-default-resource-limits) + include(\"\${CMAKE_INSTALL_FULL_LIBDIR}/cmake/${PROJECT_NAME}/glslang-targets.cmake\") + endif() + + add_library(glslang-default-resource-limits ALIAS glslang::glslang-default-resource-limits) + ") + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/glslang-default-resource-limitsTargets.cmake" DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake) + endif() diff --git a/third_party/glslang/glslang/GenericCodeGen/Link.cpp b/third_party/glslang/glslang/GenericCodeGen/Link.cpp index c38db0f69fb..5e28405f046 100644 --- a/third_party/glslang/glslang/GenericCodeGen/Link.cpp +++ b/third_party/glslang/glslang/GenericCodeGen/Link.cpp @@ -82,7 +82,7 @@ void DeleteUniformMap(TUniformMap* map) TShHandleBase* ConstructBindings() { - return 0; + return nullptr; } void DeleteBindingList(TShHandleBase* bindingList) diff --git a/third_party/glslang/glslang/HLSL/hlslAttributes.cpp b/third_party/glslang/glslang/HLSL/hlslAttributes.cpp index 0cc0d3f4fcb..973054931c2 100644 --- a/third_party/glslang/glslang/HLSL/hlslAttributes.cpp +++ b/third_party/glslang/glslang/HLSL/hlslAttributes.cpp @@ -101,6 +101,8 @@ namespace glslang { if (name == "nonwritable") return EatNonWritable; if (name == "nonreadable") return EatNonReadable; + + if (name == "export") return EatExport; } else if (nameSpace.size() > 0) return EatNone; diff --git a/third_party/glslang/glslang/HLSL/hlslGrammar.cpp b/third_party/glslang/glslang/HLSL/hlslGrammar.cpp index a01f24035d0..11c0e45e9db 100644 --- a/third_party/glslang/glslang/HLSL/hlslGrammar.cpp +++ b/third_party/glslang/glslang/HLSL/hlslGrammar.cpp @@ -1,6 +1,7 @@ // // Copyright (C) 2016-2018 Google, Inc. // Copyright (C) 2016 LunarG, Inc. +// Copyright (C) 2023 Mobica Limited. // // All rights reserved. // @@ -594,6 +595,7 @@ bool HlslGrammar::acceptControlDeclaration(TIntermNode*& node) // fully_specified_type // : type_specifier // | type_qualifier type_specifier +// | type_specifier type_qualifier // bool HlslGrammar::acceptFullySpecifiedType(TType& type, const TAttributes& attributes) { @@ -605,7 +607,7 @@ bool HlslGrammar::acceptFullySpecifiedType(TType& type, TIntermNode*& nodeList, // type_qualifier TQualifier qualifier; qualifier.clear(); - if (! acceptQualifier(qualifier)) + if (! acceptPreQualifier(qualifier)) return false; TSourceLoc loc = token.loc; @@ -620,6 +622,10 @@ bool HlslGrammar::acceptFullySpecifiedType(TType& type, TIntermNode*& nodeList, return false; } + // type_qualifier + if (! acceptPostQualifier(qualifier)) + return false; + if (type.getBasicType() == EbtBlock) { // the type was a block, which set some parts of the qualifier parseContext.mergeQualifiers(type.getQualifier(), qualifier); @@ -634,7 +640,7 @@ bool HlslGrammar::acceptFullySpecifiedType(TType& type, TIntermNode*& nodeList, parseContext.declareBlock(loc, type); } else { // Some qualifiers are set when parsing the type. Merge those with - // whatever comes from acceptQualifier. + // whatever comes from acceptPreQualifier and acceptPostQualifier. assert(qualifier.layoutFormat == ElfNone); qualifier.layoutFormat = type.getQualifier().layoutFormat; @@ -660,7 +666,7 @@ bool HlslGrammar::acceptFullySpecifiedType(TType& type, TIntermNode*& nodeList, // // Zero or more of these, so this can't return false. // -bool HlslGrammar::acceptQualifier(TQualifier& qualifier) +bool HlslGrammar::acceptPreQualifier(TQualifier& qualifier) { do { switch (peek()) { @@ -766,6 +772,25 @@ bool HlslGrammar::acceptQualifier(TQualifier& qualifier) } while (true); } +// type_qualifier +// : qualifier qualifier ... +// +// Zero or more of these, so this can't return false. +// +bool HlslGrammar::acceptPostQualifier(TQualifier& qualifier) +{ + do { + switch (peek()) { + case EHTokConst: + qualifier.storage = EvqConst; + break; + default: + return true; + } + advanceToken(); + } while (true); +} + // layout_qualifier_list // : LAYOUT LEFT_PAREN layout_qualifier COMMA layout_qualifier ... RIGHT_PAREN // @@ -823,8 +848,10 @@ bool HlslGrammar::acceptLayoutQualifierList(TQualifier& qualifier) // | UINT // | BOOL // -bool HlslGrammar::acceptTemplateVecMatBasicType(TBasicType& basicType) +bool HlslGrammar::acceptTemplateVecMatBasicType(TBasicType& basicType, + TPrecisionQualifier& precision) { + precision = EpqNone; switch (peek()) { case EHTokFloat: basicType = EbtFloat; @@ -842,6 +869,23 @@ bool HlslGrammar::acceptTemplateVecMatBasicType(TBasicType& basicType) case EHTokBool: basicType = EbtBool; break; + case EHTokHalf: + basicType = parseContext.hlslEnable16BitTypes() ? EbtFloat16 : EbtFloat; + break; + case EHTokMin16float: + case EHTokMin10float: + basicType = parseContext.hlslEnable16BitTypes() ? EbtFloat16 : EbtFloat; + precision = EpqMedium; + break; + case EHTokMin16int: + case EHTokMin12int: + basicType = parseContext.hlslEnable16BitTypes() ? EbtInt16 : EbtInt; + precision = EpqMedium; + break; + case EHTokMin16uint: + basicType = parseContext.hlslEnable16BitTypes() ? EbtUint16 : EbtUint; + precision = EpqMedium; + break; default: return false; } @@ -867,7 +911,8 @@ bool HlslGrammar::acceptVectorTemplateType(TType& type) } TBasicType basicType; - if (! acceptTemplateVecMatBasicType(basicType)) { + TPrecisionQualifier precision; + if (! acceptTemplateVecMatBasicType(basicType, precision)) { expected("scalar type"); return false; } @@ -890,7 +935,7 @@ bool HlslGrammar::acceptVectorTemplateType(TType& type) const int vecSizeI = vecSize->getAsConstantUnion()->getConstArray()[0].getIConst(); - new(&type) TType(basicType, EvqTemporary, vecSizeI); + new(&type) TType(basicType, EvqTemporary, precision, vecSizeI); if (vecSizeI == 1) type.makeVector(); @@ -919,7 +964,8 @@ bool HlslGrammar::acceptMatrixTemplateType(TType& type) } TBasicType basicType; - if (! acceptTemplateVecMatBasicType(basicType)) { + TPrecisionQualifier precision; + if (! acceptTemplateVecMatBasicType(basicType, precision)) { expected("scalar type"); return false; } @@ -956,7 +1002,7 @@ bool HlslGrammar::acceptMatrixTemplateType(TType& type) if (! acceptLiteral(cols)) return false; - new(&type) TType(basicType, EvqTemporary, 0, + new(&type) TType(basicType, EvqTemporary, precision, 0, rows->getAsConstantUnion()->getConstArray()[0].getIConst(), cols->getAsConstantUnion()->getConstArray()[0].getIConst()); @@ -2064,6 +2110,251 @@ bool HlslGrammar::acceptType(TType& type, TIntermNode*& nodeList) new(&type) TType(EbtDouble, EvqTemporary, 0, 4, 4); break; + case EHTokMin16float1x1: + new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 0, 1, 1); + break; + case EHTokMin16float1x2: + new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 0, 1, 2); + break; + case EHTokMin16float1x3: + new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 0, 1, 3); + break; + case EHTokMin16float1x4: + new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 0, 1, 4); + break; + case EHTokMin16float2x1: + new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 0, 2, 1); + break; + case EHTokMin16float2x2: + new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 0, 2, 2); + break; + case EHTokMin16float2x3: + new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 0, 2, 3); + break; + case EHTokMin16float2x4: + new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 0, 2, 4); + break; + case EHTokMin16float3x1: + new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 0, 3, 1); + break; + case EHTokMin16float3x2: + new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 0, 3, 2); + break; + case EHTokMin16float3x3: + new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 0, 3, 3); + break; + case EHTokMin16float3x4: + new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 0, 3, 4); + break; + case EHTokMin16float4x1: + new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 0, 4, 1); + break; + case EHTokMin16float4x2: + new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 0, 4, 2); + break; + case EHTokMin16float4x3: + new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 0, 4, 3); + break; + case EHTokMin16float4x4: + new(&type) TType(min16float_bt, EvqTemporary, EpqMedium, 0, 4, 4); + break; + + case EHTokMin10float1x1: + new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 0, 1, 1); + break; + case EHTokMin10float1x2: + new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 0, 1, 2); + break; + case EHTokMin10float1x3: + new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 0, 1, 3); + break; + case EHTokMin10float1x4: + new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 0, 1, 4); + break; + case EHTokMin10float2x1: + new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 0, 2, 1); + break; + case EHTokMin10float2x2: + new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 0, 2, 2); + break; + case EHTokMin10float2x3: + new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 0, 2, 3); + break; + case EHTokMin10float2x4: + new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 0, 2, 4); + break; + case EHTokMin10float3x1: + new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 0, 3, 1); + break; + case EHTokMin10float3x2: + new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 0, 3, 2); + break; + case EHTokMin10float3x3: + new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 0, 3, 3); + break; + case EHTokMin10float3x4: + new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 0, 3, 4); + break; + case EHTokMin10float4x1: + new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 0, 4, 1); + break; + case EHTokMin10float4x2: + new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 0, 4, 2); + break; + case EHTokMin10float4x3: + new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 0, 4, 3); + break; + case EHTokMin10float4x4: + new(&type) TType(min10float_bt, EvqTemporary, EpqMedium, 0, 4, 4); + break; + + case EHTokMin16int1x1: + new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 0, 1, 1); + break; + case EHTokMin16int1x2: + new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 0, 1, 2); + break; + case EHTokMin16int1x3: + new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 0, 1, 3); + break; + case EHTokMin16int1x4: + new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 0, 1, 4); + break; + case EHTokMin16int2x1: + new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 0, 2, 1); + break; + case EHTokMin16int2x2: + new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 0, 2, 2); + break; + case EHTokMin16int2x3: + new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 0, 2, 3); + break; + case EHTokMin16int2x4: + new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 0, 2, 4); + break; + case EHTokMin16int3x1: + new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 0, 3, 1); + break; + case EHTokMin16int3x2: + new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 0, 3, 2); + break; + case EHTokMin16int3x3: + new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 0, 3, 3); + break; + case EHTokMin16int3x4: + new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 0, 3, 4); + break; + case EHTokMin16int4x1: + new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 0, 4, 1); + break; + case EHTokMin16int4x2: + new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 0, 4, 2); + break; + case EHTokMin16int4x3: + new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 0, 4, 3); + break; + case EHTokMin16int4x4: + new(&type) TType(min16int_bt, EvqTemporary, EpqMedium, 0, 4, 4); + break; + + case EHTokMin12int1x1: + new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 0, 1, 1); + break; + case EHTokMin12int1x2: + new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 0, 1, 2); + break; + case EHTokMin12int1x3: + new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 0, 1, 3); + break; + case EHTokMin12int1x4: + new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 0, 1, 4); + break; + case EHTokMin12int2x1: + new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 0, 2, 1); + break; + case EHTokMin12int2x2: + new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 0, 2, 2); + break; + case EHTokMin12int2x3: + new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 0, 2, 3); + break; + case EHTokMin12int2x4: + new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 0, 2, 4); + break; + case EHTokMin12int3x1: + new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 0, 3, 1); + break; + case EHTokMin12int3x2: + new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 0, 3, 2); + break; + case EHTokMin12int3x3: + new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 0, 3, 3); + break; + case EHTokMin12int3x4: + new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 0, 3, 4); + break; + case EHTokMin12int4x1: + new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 0, 4, 1); + break; + case EHTokMin12int4x2: + new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 0, 4, 2); + break; + case EHTokMin12int4x3: + new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 0, 4, 3); + break; + case EHTokMin12int4x4: + new(&type) TType(min12int_bt, EvqTemporary, EpqMedium, 0, 4, 4); + break; + + case EHTokMin16uint1x1: + new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 0, 1, 1); + break; + case EHTokMin16uint1x2: + new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 0, 1, 2); + break; + case EHTokMin16uint1x3: + new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 0, 1, 3); + break; + case EHTokMin16uint1x4: + new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 0, 1, 4); + break; + case EHTokMin16uint2x1: + new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 0, 2, 1); + break; + case EHTokMin16uint2x2: + new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 0, 2, 2); + break; + case EHTokMin16uint2x3: + new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 0, 2, 3); + break; + case EHTokMin16uint2x4: + new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 0, 2, 4); + break; + case EHTokMin16uint3x1: + new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 0, 3, 1); + break; + case EHTokMin16uint3x2: + new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 0, 3, 2); + break; + case EHTokMin16uint3x3: + new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 0, 3, 3); + break; + case EHTokMin16uint3x4: + new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 0, 3, 4); + break; + case EHTokMin16uint4x1: + new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 0, 4, 1); + break; + case EHTokMin16uint4x2: + new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 0, 4, 2); + break; + case EHTokMin16uint4x3: + new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 0, 4, 3); + break; + case EHTokMin16uint4x4: + new(&type) TType(min16uint_bt, EvqTemporary, EpqMedium, 0, 4, 4); + break; + default: return false; } @@ -3794,7 +4085,7 @@ bool HlslGrammar::acceptIterationStatement(TIntermNode*& statement, const TAttri parseContext.unnestLooping(); --parseContext.controlFlowNestingLevel; - loopNode = intermediate.addLoop(statement, condition, 0, false, loc); + loopNode = intermediate.addLoop(statement, condition, nullptr, false, loc); statement = loopNode; break; diff --git a/third_party/glslang/glslang/HLSL/hlslGrammar.h b/third_party/glslang/glslang/HLSL/hlslGrammar.h index 27706b2b9b6..cfe294bc0da 100644 --- a/third_party/glslang/glslang/HLSL/hlslGrammar.h +++ b/third_party/glslang/glslang/HLSL/hlslGrammar.h @@ -1,6 +1,7 @@ // // Copyright (C) 2016-2018 Google, Inc. // Copyright (C) 2016 LunarG, Inc. +// Copyright (C) 2023 Mobica Limited. // // All rights reserved. // @@ -72,11 +73,12 @@ namespace glslang { bool acceptSamplerState(); bool acceptFullySpecifiedType(TType&, const TAttributes&); bool acceptFullySpecifiedType(TType&, TIntermNode*& nodeList, const TAttributes&, bool forbidDeclarators = false); - bool acceptQualifier(TQualifier&); + bool acceptPreQualifier(TQualifier&); + bool acceptPostQualifier(TQualifier&); bool acceptLayoutQualifierList(TQualifier&); bool acceptType(TType&); bool acceptType(TType&, TIntermNode*& nodeList); - bool acceptTemplateVecMatBasicType(TBasicType&); + bool acceptTemplateVecMatBasicType(TBasicType&, TPrecisionQualifier&); bool acceptVectorTemplateType(TType&); bool acceptMatrixTemplateType(TType&); bool acceptTessellationDeclType(TBuiltInVariable&); diff --git a/third_party/glslang/glslang/HLSL/hlslParseHelper.cpp b/third_party/glslang/glslang/HLSL/hlslParseHelper.cpp index 62e46a0934d..ac0dee50ca4 100755 --- a/third_party/glslang/glslang/HLSL/hlslParseHelper.cpp +++ b/third_party/glslang/glslang/HLSL/hlslParseHelper.cpp @@ -1177,10 +1177,13 @@ void HlslParseContext::flatten(const TVariable& variable, bool linkage, bool arr if (type.isBuiltIn() && !type.isStruct()) return; + auto entry = flattenMap.insert(std::make_pair(variable.getUniqueId(), TFlattenData(type.getQualifier().layoutBinding, type.getQualifier().layoutLocation))); + if (type.isStruct() && type.getStruct()->size()==0) + return; // if flattening arrayed io struct, array each member of dereferenced type if (arrayed) { const TType dereferencedType(type, 0); @@ -1596,7 +1599,7 @@ void HlslParseContext::handleFunctionDeclarator(const TSourceLoc& loc, TFunction // bool builtIn; TSymbol* symbol = symbolTable.find(function.getMangledName(), &builtIn); - const TFunction* prevDec = symbol ? symbol->getAsFunction() : 0; + const TFunction* prevDec = symbol ? symbol->getAsFunction() : nullptr; if (prototype) { // All built-in functions are defined, even though they don't have a body. @@ -2472,7 +2475,7 @@ TIntermNode* HlslParseContext::handleReturnValue(const TSourceLoc& loc, TIntermT void HlslParseContext::handleFunctionArgument(TFunction* function, TIntermTyped*& arguments, TIntermTyped* newArg) { - TParameter param = { 0, new TType, nullptr }; + TParameter param = { nullptr, new TType, nullptr }; param.type->shallowCopy(newArg->getType()); function->addParameter(param); @@ -7565,7 +7568,6 @@ const TFunction* HlslParseContext::findFunction(const TSourceLoc& loc, TFunction candidateList[0]->getBuiltInOp() == EOpMethodRestartStrip || candidateList[0]->getBuiltInOp() == EOpMethodIncrementCounter || candidateList[0]->getBuiltInOp() == EOpMethodDecrementCounter || - candidateList[0]->getBuiltInOp() == EOpMethodAppend || candidateList[0]->getBuiltInOp() == EOpMethodConsume)) { return candidateList[0]; } @@ -7790,18 +7792,18 @@ const TFunction* HlslParseContext::findFunction(const TSourceLoc& loc, TFunction // Handle aggregates: put all args into the new function call for (int arg = 0; arg < int(args->getAsAggregate()->getSequence().size()); ++arg) { // TODO: But for constness, we could avoid the new & shallowCopy, and use the pointer directly. - TParameter param = { 0, new TType, nullptr }; + TParameter param = { nullptr, new TType, nullptr }; param.type->shallowCopy(args->getAsAggregate()->getSequence()[arg]->getAsTyped()->getType()); convertedCall.addParameter(param); } } else if (args->getAsUnaryNode()) { // Handle unaries: put all args into the new function call - TParameter param = { 0, new TType, nullptr }; + TParameter param = { nullptr, new TType, nullptr }; param.type->shallowCopy(args->getAsUnaryNode()->getOperand()->getAsTyped()->getType()); convertedCall.addParameter(param); } else if (args->getAsTyped()) { // Handle bare e.g, floats, not in an aggregate. - TParameter param = { 0, new TType, nullptr }; + TParameter param = { nullptr, new TType, nullptr }; param.type->shallowCopy(args->getAsTyped()->getType()); convertedCall.addParameter(param); } else { @@ -9046,7 +9048,8 @@ void HlslParseContext::fixBlockUniformOffsets(const TQualifier& qualifier, TType // "The specified offset must be a multiple // of the base alignment of the type of the block member it qualifies, or a compile-time error results." if (! IsMultipleOfPow2(memberQualifier.layoutOffset, memberAlignment)) - error(memberLoc, "must be a multiple of the member's alignment", "offset", ""); + error(memberLoc, "must be a multiple of the member's alignment", "offset", + "(layout offset = %d | member alignment = %d)", memberQualifier.layoutOffset, memberAlignment); // "The offset qualifier forces the qualified member to start at or after the specified // integral-constant expression, which will be its byte offset from the beginning of the buffer. diff --git a/third_party/glslang/glslang/HLSL/hlslParseHelper.h b/third_party/glslang/glslang/HLSL/hlslParseHelper.h index 96d85f43479..97c52d453a1 100644 --- a/third_party/glslang/glslang/HLSL/hlslParseHelper.h +++ b/third_party/glslang/glslang/HLSL/hlslParseHelper.h @@ -147,14 +147,14 @@ class HlslParseContext : public TParseContextBase { void declareTypedef(const TSourceLoc&, const TString& identifier, const TType&); void declareStruct(const TSourceLoc&, TString& structName, TType&); TSymbol* lookupUserType(const TString&, TType&); - TIntermNode* declareVariable(const TSourceLoc&, const TString& identifier, TType&, TIntermTyped* initializer = 0); + TIntermNode* declareVariable(const TSourceLoc&, const TString& identifier, TType&, TIntermTyped* initializer = nullptr); void lengthenList(const TSourceLoc&, TIntermSequence& list, int size, TIntermTyped* scalarInit); TIntermTyped* handleConstructor(const TSourceLoc&, TIntermTyped*, const TType&); TIntermTyped* addConstructor(const TSourceLoc&, TIntermTyped*, const TType&); TIntermTyped* convertArray(TIntermTyped*, const TType&); TIntermTyped* constructAggregate(TIntermNode*, const TType&, int, const TSourceLoc&); TIntermTyped* constructBuiltIn(const TType&, TOperator, TIntermTyped*, const TSourceLoc&, bool subset); - void declareBlock(const TSourceLoc&, TType&, const TString* instanceName = 0); + void declareBlock(const TSourceLoc&, TType&, const TString* instanceName = nullptr); void declareStructBufferCounter(const TSourceLoc& loc, const TType& bufferType, const TString& name); void fixBlockLocations(const TSourceLoc&, TQualifier&, TTypeList&, bool memberWithLocation, bool memberWithoutLocation); void fixXfbOffsets(TQualifier&, TTypeList&); @@ -171,10 +171,10 @@ class HlslParseContext : public TParseContextBase { void unnestAnnotations() { --annotationNestingLevel; } int getAnnotationNestingLevel() { return annotationNestingLevel; } void pushScope() { symbolTable.push(); } - void popScope() { symbolTable.pop(0); } + void popScope() { symbolTable.pop(nullptr); } void pushThisScope(const TType&, const TVector&); - void popThisScope() { symbolTable.pop(0); } + void popThisScope() { symbolTable.pop(nullptr); } void pushImplicitThis(TVariable* thisParameter) { implicitThisStack.push_back(thisParameter); } void popImplicitThis() { implicitThisStack.pop_back(); } diff --git a/third_party/glslang/glslang/HLSL/hlslParseables.cpp b/third_party/glslang/glslang/HLSL/hlslParseables.cpp index 15918dc3769..8fb1d2909c6 100644 --- a/third_party/glslang/glslang/HLSL/hlslParseables.cpp +++ b/third_party/glslang/glslang/HLSL/hlslParseables.cpp @@ -564,8 +564,8 @@ void TBuiltInParseablesHlsl::initialize(int /*version*/, EProfile /*profile*/, c { "GetRenderTargetSamplePosition", "V2", "F", "V1", "I", EShLangAll, false }, { "GroupMemoryBarrier", nullptr, nullptr, "-", "-", EShLangCS, false }, { "GroupMemoryBarrierWithGroupSync", nullptr, nullptr, "-", "-", EShLangCS, false }, - { "InterlockedAdd", "-", "-", "SVM,,>", "UI,,", EShLangPSCS, false }, - { "InterlockedAdd", "-", "-", "SVM,", "UI,", EShLangPSCS, false }, + { "InterlockedAdd", "-", "-", "SVM,,>", "FUI,,", EShLangPSCS, false }, + { "InterlockedAdd", "-", "-", "SVM,", "FUI,", EShLangPSCS, false }, { "InterlockedAnd", "-", "-", "SVM,,>", "UI,,", EShLangPSCS, false }, { "InterlockedAnd", "-", "-", "SVM,", "UI,", EShLangPSCS, false }, { "InterlockedCompareExchange", "-", "-", "SVM,,,>", "UI,,,", EShLangPSCS, false }, diff --git a/third_party/glslang/glslang/HLSL/hlslScanContext.cpp b/third_party/glslang/glslang/HLSL/hlslScanContext.cpp index fc62672f4ef..823b17aa3f7 100644 --- a/third_party/glslang/glslang/HLSL/hlslScanContext.cpp +++ b/third_party/glslang/glslang/HLSL/hlslScanContext.cpp @@ -312,6 +312,86 @@ void HlslScanContext::fillInKeywordMap() (*KeywordMap)["double4x2"] = EHTokDouble4x2; (*KeywordMap)["double4x3"] = EHTokDouble4x3; (*KeywordMap)["double4x4"] = EHTokDouble4x4; + (*KeywordMap)["min16float1x1"] = EHTokMin16float1x1; + (*KeywordMap)["min16float1x2"] = EHTokMin16float1x2; + (*KeywordMap)["min16float1x3"] = EHTokMin16float1x3; + (*KeywordMap)["min16float1x4"] = EHTokMin16float1x4; + (*KeywordMap)["min16float2x1"] = EHTokMin16float2x1; + (*KeywordMap)["min16float2x2"] = EHTokMin16float2x2; + (*KeywordMap)["min16float2x3"] = EHTokMin16float2x3; + (*KeywordMap)["min16float2x4"] = EHTokMin16float2x4; + (*KeywordMap)["min16float3x1"] = EHTokMin16float3x1; + (*KeywordMap)["min16float3x2"] = EHTokMin16float3x2; + (*KeywordMap)["min16float3x3"] = EHTokMin16float3x3; + (*KeywordMap)["min16float3x4"] = EHTokMin16float3x4; + (*KeywordMap)["min16float4x1"] = EHTokMin16float4x1; + (*KeywordMap)["min16float4x2"] = EHTokMin16float4x2; + (*KeywordMap)["min16float4x3"] = EHTokMin16float4x3; + (*KeywordMap)["min16float4x4"] = EHTokMin16float4x4; + (*KeywordMap)["min10float1x1"] = EHTokMin10float1x1; + (*KeywordMap)["min10float1x2"] = EHTokMin10float1x2; + (*KeywordMap)["min10float1x3"] = EHTokMin10float1x3; + (*KeywordMap)["min10float1x4"] = EHTokMin10float1x4; + (*KeywordMap)["min10float2x1"] = EHTokMin10float2x1; + (*KeywordMap)["min10float2x2"] = EHTokMin10float2x2; + (*KeywordMap)["min10float2x3"] = EHTokMin10float2x3; + (*KeywordMap)["min10float2x4"] = EHTokMin10float2x4; + (*KeywordMap)["min10float3x1"] = EHTokMin10float3x1; + (*KeywordMap)["min10float3x2"] = EHTokMin10float3x2; + (*KeywordMap)["min10float3x3"] = EHTokMin10float3x3; + (*KeywordMap)["min10float3x4"] = EHTokMin10float3x4; + (*KeywordMap)["min10float4x1"] = EHTokMin10float4x1; + (*KeywordMap)["min10float4x2"] = EHTokMin10float4x2; + (*KeywordMap)["min10float4x3"] = EHTokMin10float4x3; + (*KeywordMap)["min10float4x4"] = EHTokMin10float4x4; + (*KeywordMap)["min16int1x1"] = EHTokMin16int1x1; + (*KeywordMap)["min16int1x2"] = EHTokMin16int1x2; + (*KeywordMap)["min16int1x3"] = EHTokMin16int1x3; + (*KeywordMap)["min16int1x4"] = EHTokMin16int1x4; + (*KeywordMap)["min16int2x1"] = EHTokMin16int2x1; + (*KeywordMap)["min16int2x2"] = EHTokMin16int2x2; + (*KeywordMap)["min16int2x3"] = EHTokMin16int2x3; + (*KeywordMap)["min16int2x4"] = EHTokMin16int2x4; + (*KeywordMap)["min16int3x1"] = EHTokMin16int3x1; + (*KeywordMap)["min16int3x2"] = EHTokMin16int3x2; + (*KeywordMap)["min16int3x3"] = EHTokMin16int3x3; + (*KeywordMap)["min16int3x4"] = EHTokMin16int3x4; + (*KeywordMap)["min16int4x1"] = EHTokMin16int4x1; + (*KeywordMap)["min16int4x2"] = EHTokMin16int4x2; + (*KeywordMap)["min16int4x3"] = EHTokMin16int4x3; + (*KeywordMap)["min16int4x4"] = EHTokMin16int4x4; + (*KeywordMap)["min12int1x1"] = EHTokMin12int1x1; + (*KeywordMap)["min12int1x2"] = EHTokMin12int1x2; + (*KeywordMap)["min12int1x3"] = EHTokMin12int1x3; + (*KeywordMap)["min12int1x4"] = EHTokMin12int1x4; + (*KeywordMap)["min12int2x1"] = EHTokMin12int2x1; + (*KeywordMap)["min12int2x2"] = EHTokMin12int2x2; + (*KeywordMap)["min12int2x3"] = EHTokMin12int2x3; + (*KeywordMap)["min12int2x4"] = EHTokMin12int2x4; + (*KeywordMap)["min12int3x1"] = EHTokMin12int3x1; + (*KeywordMap)["min12int3x2"] = EHTokMin12int3x2; + (*KeywordMap)["min12int3x3"] = EHTokMin12int3x3; + (*KeywordMap)["min12int3x4"] = EHTokMin12int3x4; + (*KeywordMap)["min12int4x1"] = EHTokMin12int4x1; + (*KeywordMap)["min12int4x2"] = EHTokMin12int4x2; + (*KeywordMap)["min12int4x3"] = EHTokMin12int4x3; + (*KeywordMap)["min12int4x4"] = EHTokMin12int4x4; + (*KeywordMap)["min16uint1x1"] = EHTokMin16uint1x1; + (*KeywordMap)["min16uint1x2"] = EHTokMin16uint1x2; + (*KeywordMap)["min16uint1x3"] = EHTokMin16uint1x3; + (*KeywordMap)["min16uint1x4"] = EHTokMin16uint1x4; + (*KeywordMap)["min16uint2x1"] = EHTokMin16uint2x1; + (*KeywordMap)["min16uint2x2"] = EHTokMin16uint2x2; + (*KeywordMap)["min16uint2x3"] = EHTokMin16uint2x3; + (*KeywordMap)["min16uint2x4"] = EHTokMin16uint2x4; + (*KeywordMap)["min16uint3x1"] = EHTokMin16uint3x1; + (*KeywordMap)["min16uint3x2"] = EHTokMin16uint3x2; + (*KeywordMap)["min16uint3x3"] = EHTokMin16uint3x3; + (*KeywordMap)["min16uint3x4"] = EHTokMin16uint3x4; + (*KeywordMap)["min16uint4x1"] = EHTokMin16uint4x1; + (*KeywordMap)["min16uint4x2"] = EHTokMin16uint4x2; + (*KeywordMap)["min16uint4x3"] = EHTokMin16uint4x3; + (*KeywordMap)["min16uint4x4"] = EHTokMin16uint4x4; (*KeywordMap)["sampler"] = EHTokSampler; (*KeywordMap)["sampler1D"] = EHTokSampler1d; @@ -806,6 +886,86 @@ EHlslTokenClass HlslScanContext::tokenizeIdentifier() case EHTokDouble4x2: case EHTokDouble4x3: case EHTokDouble4x4: + case EHTokMin16float1x1: + case EHTokMin16float1x2: + case EHTokMin16float1x3: + case EHTokMin16float1x4: + case EHTokMin16float2x1: + case EHTokMin16float2x2: + case EHTokMin16float2x3: + case EHTokMin16float2x4: + case EHTokMin16float3x1: + case EHTokMin16float3x2: + case EHTokMin16float3x3: + case EHTokMin16float3x4: + case EHTokMin16float4x1: + case EHTokMin16float4x2: + case EHTokMin16float4x3: + case EHTokMin16float4x4: + case EHTokMin10float1x1: + case EHTokMin10float1x2: + case EHTokMin10float1x3: + case EHTokMin10float1x4: + case EHTokMin10float2x1: + case EHTokMin10float2x2: + case EHTokMin10float2x3: + case EHTokMin10float2x4: + case EHTokMin10float3x1: + case EHTokMin10float3x2: + case EHTokMin10float3x3: + case EHTokMin10float3x4: + case EHTokMin10float4x1: + case EHTokMin10float4x2: + case EHTokMin10float4x3: + case EHTokMin10float4x4: + case EHTokMin16int1x1: + case EHTokMin16int1x2: + case EHTokMin16int1x3: + case EHTokMin16int1x4: + case EHTokMin16int2x1: + case EHTokMin16int2x2: + case EHTokMin16int2x3: + case EHTokMin16int2x4: + case EHTokMin16int3x1: + case EHTokMin16int3x2: + case EHTokMin16int3x3: + case EHTokMin16int3x4: + case EHTokMin16int4x1: + case EHTokMin16int4x2: + case EHTokMin16int4x3: + case EHTokMin16int4x4: + case EHTokMin12int1x1: + case EHTokMin12int1x2: + case EHTokMin12int1x3: + case EHTokMin12int1x4: + case EHTokMin12int2x1: + case EHTokMin12int2x2: + case EHTokMin12int2x3: + case EHTokMin12int2x4: + case EHTokMin12int3x1: + case EHTokMin12int3x2: + case EHTokMin12int3x3: + case EHTokMin12int3x4: + case EHTokMin12int4x1: + case EHTokMin12int4x2: + case EHTokMin12int4x3: + case EHTokMin12int4x4: + case EHTokMin16uint1x1: + case EHTokMin16uint1x2: + case EHTokMin16uint1x3: + case EHTokMin16uint1x4: + case EHTokMin16uint2x1: + case EHTokMin16uint2x2: + case EHTokMin16uint2x3: + case EHTokMin16uint2x4: + case EHTokMin16uint3x1: + case EHTokMin16uint3x2: + case EHTokMin16uint3x3: + case EHTokMin16uint3x4: + case EHTokMin16uint4x1: + case EHTokMin16uint4x2: + case EHTokMin16uint4x3: + case EHTokMin16uint4x4: return keyword; // texturing types diff --git a/third_party/glslang/glslang/HLSL/hlslTokens.h b/third_party/glslang/glslang/HLSL/hlslTokens.h index 4426bccecb5..a7c129907fb 100644 --- a/third_party/glslang/glslang/HLSL/hlslTokens.h +++ b/third_party/glslang/glslang/HLSL/hlslTokens.h @@ -249,6 +249,86 @@ enum EHlslTokenClass { EHTokDouble4x2, EHTokDouble4x3, EHTokDouble4x4, + EHTokMin16float1x1, + EHTokMin16float1x2, + EHTokMin16float1x3, + EHTokMin16float1x4, + EHTokMin16float2x1, + EHTokMin16float2x2, + EHTokMin16float2x3, + EHTokMin16float2x4, + EHTokMin16float3x1, + EHTokMin16float3x2, + EHTokMin16float3x3, + EHTokMin16float3x4, + EHTokMin16float4x1, + EHTokMin16float4x2, + EHTokMin16float4x3, + EHTokMin16float4x4, + EHTokMin10float1x1, + EHTokMin10float1x2, + EHTokMin10float1x3, + EHTokMin10float1x4, + EHTokMin10float2x1, + EHTokMin10float2x2, + EHTokMin10float2x3, + EHTokMin10float2x4, + EHTokMin10float3x1, + EHTokMin10float3x2, + EHTokMin10float3x3, + EHTokMin10float3x4, + EHTokMin10float4x1, + EHTokMin10float4x2, + EHTokMin10float4x3, + EHTokMin10float4x4, + EHTokMin16int1x1, + EHTokMin16int1x2, + EHTokMin16int1x3, + EHTokMin16int1x4, + EHTokMin16int2x1, + EHTokMin16int2x2, + EHTokMin16int2x3, + EHTokMin16int2x4, + EHTokMin16int3x1, + EHTokMin16int3x2, + EHTokMin16int3x3, + EHTokMin16int3x4, + EHTokMin16int4x1, + EHTokMin16int4x2, + EHTokMin16int4x3, + EHTokMin16int4x4, + EHTokMin12int1x1, + EHTokMin12int1x2, + EHTokMin12int1x3, + EHTokMin12int1x4, + EHTokMin12int2x1, + EHTokMin12int2x2, + EHTokMin12int2x3, + EHTokMin12int2x4, + EHTokMin12int3x1, + EHTokMin12int3x2, + EHTokMin12int3x3, + EHTokMin12int3x4, + EHTokMin12int4x1, + EHTokMin12int4x2, + EHTokMin12int4x3, + EHTokMin12int4x4, + EHTokMin16uint1x1, + EHTokMin16uint1x2, + EHTokMin16uint1x3, + EHTokMin16uint1x4, + EHTokMin16uint2x1, + EHTokMin16uint2x2, + EHTokMin16uint2x3, + EHTokMin16uint2x4, + EHTokMin16uint3x1, + EHTokMin16uint3x2, + EHTokMin16uint3x3, + EHTokMin16uint3x4, + EHTokMin16uint4x1, + EHTokMin16uint4x2, + EHTokMin16uint4x3, + EHTokMin16uint4x4, // texturing types EHTokSampler, diff --git a/third_party/glslang/glslang/Include/BaseTypes.h b/third_party/glslang/glslang/Include/BaseTypes.h index 156d98b9af0..64bffa89265 100644 --- a/third_party/glslang/glslang/Include/BaseTypes.h +++ b/third_party/glslang/glslang/Include/BaseTypes.h @@ -65,10 +65,10 @@ enum TBasicType { EbtAccStruct, EbtReference, EbtRayQuery, -#ifndef GLSLANG_WEB + EbtHitObjectNV, + EbtCoopmat, // SPIR-V type defined by spirv_type EbtSpirvType, -#endif // HLSL types that live only temporarily. EbtString, @@ -95,15 +95,14 @@ enum TStorageQualifier { EvqUniform, // read only, shared with app EvqBuffer, // read/write, shared with app EvqShared, // compute shader's read/write 'shared' qualifier -#ifndef GLSLANG_WEB EvqSpirvStorageClass, // spirv_storage_class -#endif EvqPayload, EvqPayloadIn, EvqHitAttr, EvqCallableData, EvqCallableDataIn, + EvqHitObjectAttrNV, EvqtaskPayloadSharedEXT, @@ -132,6 +131,8 @@ enum TStorageQualifier { EvqFragDepth, EvqFragStencil, + EvqTileImageEXT, + // end of list EvqLast }; @@ -289,6 +290,12 @@ enum TBuiltInVariable { EbvLayerPerViewNV, EbvMeshViewCountNV, EbvMeshViewIndicesNV, + + EbvMicroTrianglePositionNV, + EbvMicroTriangleBaryNV, + EbvHitKindFrontFacingMicroTriangleNV, + EbvHitKindBackFacingMicroTriangleNV, + //GL_EXT_mesh_shader EbvPrimitivePointIndicesEXT, EbvPrimitiveLineIndicesEXT, @@ -316,6 +323,15 @@ enum TBuiltInVariable { EbvByteAddressBuffer, EbvRWByteAddressBuffer, + // ARM specific core builtins + EbvCoreCountARM, + EbvCoreIDARM, + EbvCoreMaxIDARM, + EbvWarpIDARM, + EbvWarpMaxIDARM, + + EbvPositionFetch, + EbvLast }; @@ -328,10 +344,6 @@ enum TPrecisionQualifier { EpqHigh }; -#ifdef GLSLANG_WEB -__inline const char* GetStorageQualifierString(TStorageQualifier q) { return ""; } -__inline const char* GetPrecisionQualifierString(TPrecisionQualifier p) { return ""; } -#else // These will show up in error messages __inline const char* GetStorageQualifierString(TStorageQualifier q) { @@ -340,9 +352,7 @@ __inline const char* GetStorageQualifierString(TStorageQualifier q) case EvqGlobal: return "global"; break; case EvqConst: return "const"; break; case EvqConstReadOnly: return "const (read only)"; break; -#ifndef GLSLANG_WEB case EvqSpirvStorageClass: return "spirv_storage_class"; break; -#endif case EvqVaryingIn: return "in"; break; case EvqVaryingOut: return "out"; break; case EvqUniform: return "uniform"; break; @@ -368,6 +378,7 @@ __inline const char* GetStorageQualifierString(TStorageQualifier q) case EvqCallableData: return "callableDataNV"; break; case EvqCallableDataIn: return "callableDataInNV"; break; case EvqtaskPayloadSharedEXT: return "taskPayloadSharedEXT"; break; + case EvqHitObjectAttrNV:return "hitObjectAttributeNV"; break; default: return "unknown qualifier"; } } @@ -518,6 +529,9 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v) case EbvShadingRateKHR: return "ShadingRateKHR"; case EbvPrimitiveShadingRateKHR: return "PrimitiveShadingRateKHR"; + case EbvHitKindFrontFacingMicroTriangleNV: return "HitKindFrontFacingMicroTriangleNV"; + case EbvHitKindBackFacingMicroTriangleNV: return "HitKindBackFacingMicroTriangleNV"; + default: return "unknown built-in variable"; } } @@ -532,7 +546,6 @@ __inline const char* GetPrecisionQualifierString(TPrecisionQualifier p) default: return "unknown precision qualifier"; } } -#endif __inline bool isTypeSignedInt(TBasicType type) { diff --git a/third_party/glslang/glslang/Include/Common.h b/third_party/glslang/glslang/Include/Common.h index 9042a1aa27a..080b8071e4d 100644 --- a/third_party/glslang/glslang/Include/Common.h +++ b/third_party/glslang/glslang/Include/Common.h @@ -44,6 +44,7 @@ #else #include #endif +#include #include #include #include @@ -54,7 +55,7 @@ #include #include -#if defined(__ANDROID__) || (defined(_MSC_VER) && _MSC_VER < 1700) +#if defined(__ANDROID__) #include namespace std { template @@ -66,7 +67,7 @@ std::string to_string(const T& val) { } #endif -#if (defined(_MSC_VER) && _MSC_VER < 1900 /*vs2015*/) || MINGW_HAS_SECURE_API +#if defined(MINGW_HAS_SECURE_API) && MINGW_HAS_SECURE_API #include #ifndef snprintf #define snprintf sprintf_s @@ -82,22 +83,6 @@ std::string to_string(const T& val) { #define UINT_PTR uintptr_t #endif -#if defined(_MSC_VER) && _MSC_VER < 1800 - #include - inline long long int strtoll (const char* str, char** endptr, int base) - { - return _strtoi64(str, endptr, base); - } - inline unsigned long long int strtoull (const char* str, char** endptr, int base) - { - return _strtoui64(str, endptr, base); - } - inline long long int atoll (const char* str) - { - return strtoll(str, NULL, 10); - } -#endif - #if defined(_MSC_VER) #define strdup _strdup #endif @@ -218,7 +203,7 @@ template T Max(const T a, const T b) { return a > b ? a : b; } // // Create a TString object from an integer. // -#if defined _MSC_VER || MINGW_HAS_SECURE_API +#if defined(_MSC_VER) || (defined(MINGW_HAS_SECURE_API) && MINGW_HAS_SECURE_API) inline const TString String(const int i, const int base = 10) { char text[16]; // 32 bit ints are at most 10 digits in base 10 diff --git a/third_party/glslang/glslang/Include/ConstantUnion.h b/third_party/glslang/glslang/Include/ConstantUnion.h index c4ffb85771b..1f39fc59309 100644 --- a/third_party/glslang/glslang/Include/ConstantUnion.h +++ b/third_party/glslang/glslang/Include/ConstantUnion.h @@ -234,7 +234,6 @@ class TConstUnion { break; -#ifndef GLSLANG_WEB case EbtInt16: if (constant.i16Const == i16Const) return true; @@ -265,7 +264,6 @@ class TConstUnion { return true; break; -#endif default: assert(false && "Default missing"); } @@ -347,7 +345,6 @@ class TConstUnion { return true; return false; -#ifndef GLSLANG_WEB case EbtInt8: if (i8Const > constant.i8Const) return true; @@ -378,7 +375,6 @@ class TConstUnion { return true; return false; -#endif default: assert(false && "Default missing"); return false; @@ -389,7 +385,6 @@ class TConstUnion { { assert(type == constant.type); switch (type) { -#ifndef GLSLANG_WEB case EbtInt8: if (i8Const < constant.i8Const) return true; @@ -419,7 +414,6 @@ class TConstUnion { return true; return false; -#endif case EbtDouble: if (dConst < constant.dConst) return true; @@ -449,14 +443,12 @@ class TConstUnion { case EbtInt: returnValue.setIConst(iConst + constant.iConst); break; case EbtUint: returnValue.setUConst(uConst + constant.uConst); break; case EbtDouble: returnValue.setDConst(dConst + constant.dConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setI8Const(i8Const + constant.i8Const); break; case EbtInt16: returnValue.setI16Const(i16Const + constant.i16Const); break; case EbtInt64: returnValue.setI64Const(i64Const + constant.i64Const); break; case EbtUint8: returnValue.setU8Const(u8Const + constant.u8Const); break; case EbtUint16: returnValue.setU16Const(u16Const + constant.u16Const); break; case EbtUint64: returnValue.setU64Const(u64Const + constant.u64Const); break; -#endif default: assert(false && "Default missing"); } @@ -471,14 +463,12 @@ class TConstUnion { case EbtInt: returnValue.setIConst(iConst - constant.iConst); break; case EbtUint: returnValue.setUConst(uConst - constant.uConst); break; case EbtDouble: returnValue.setDConst(dConst - constant.dConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setI8Const(i8Const - constant.i8Const); break; case EbtInt16: returnValue.setI16Const(i16Const - constant.i16Const); break; case EbtInt64: returnValue.setI64Const(i64Const - constant.i64Const); break; case EbtUint8: returnValue.setU8Const(u8Const - constant.u8Const); break; case EbtUint16: returnValue.setU16Const(u16Const - constant.u16Const); break; case EbtUint64: returnValue.setU64Const(u64Const - constant.u64Const); break; -#endif default: assert(false && "Default missing"); } @@ -493,14 +483,12 @@ class TConstUnion { case EbtInt: returnValue.setIConst(iConst * constant.iConst); break; case EbtUint: returnValue.setUConst(uConst * constant.uConst); break; case EbtDouble: returnValue.setDConst(dConst * constant.dConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setI8Const(i8Const * constant.i8Const); break; case EbtInt16: returnValue.setI16Const(i16Const * constant.i16Const); break; case EbtInt64: returnValue.setI64Const(i64Const * constant.i64Const); break; case EbtUint8: returnValue.setU8Const(u8Const * constant.u8Const); break; case EbtUint16: returnValue.setU16Const(u16Const * constant.u16Const); break; case EbtUint64: returnValue.setU64Const(u64Const * constant.u64Const); break; -#endif default: assert(false && "Default missing"); } @@ -514,14 +502,12 @@ class TConstUnion { switch (type) { case EbtInt: returnValue.setIConst(iConst % constant.iConst); break; case EbtUint: returnValue.setUConst(uConst % constant.uConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setI8Const(i8Const % constant.i8Const); break; case EbtInt16: returnValue.setI8Const(i8Const % constant.i16Const); break; case EbtInt64: returnValue.setI64Const(i64Const % constant.i64Const); break; case EbtUint8: returnValue.setU8Const(u8Const % constant.u8Const); break; case EbtUint16: returnValue.setU16Const(u16Const % constant.u16Const); break; case EbtUint64: returnValue.setU64Const(u64Const % constant.u64Const); break; -#endif default: assert(false && "Default missing"); } @@ -532,7 +518,6 @@ class TConstUnion { { TConstUnion returnValue; switch (type) { -#ifndef GLSLANG_WEB case EbtInt8: switch (constant.type) { case EbtInt8: returnValue.setI8Const(i8Const >> constant.i8Const); break; @@ -585,19 +570,16 @@ class TConstUnion { default: assert(false && "Default missing"); } break; -#endif case EbtInt: switch (constant.type) { case EbtInt: returnValue.setIConst(iConst >> constant.iConst); break; case EbtUint: returnValue.setIConst(iConst >> constant.uConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setIConst(iConst >> constant.i8Const); break; case EbtUint8: returnValue.setIConst(iConst >> constant.u8Const); break; case EbtInt16: returnValue.setIConst(iConst >> constant.i16Const); break; case EbtUint16: returnValue.setIConst(iConst >> constant.u16Const); break; case EbtInt64: returnValue.setIConst(iConst >> constant.i64Const); break; case EbtUint64: returnValue.setIConst(iConst >> constant.u64Const); break; -#endif default: assert(false && "Default missing"); } break; @@ -605,18 +587,15 @@ class TConstUnion { switch (constant.type) { case EbtInt: returnValue.setUConst(uConst >> constant.iConst); break; case EbtUint: returnValue.setUConst(uConst >> constant.uConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setUConst(uConst >> constant.i8Const); break; case EbtUint8: returnValue.setUConst(uConst >> constant.u8Const); break; case EbtInt16: returnValue.setUConst(uConst >> constant.i16Const); break; case EbtUint16: returnValue.setUConst(uConst >> constant.u16Const); break; case EbtInt64: returnValue.setUConst(uConst >> constant.i64Const); break; case EbtUint64: returnValue.setUConst(uConst >> constant.u64Const); break; -#endif default: assert(false && "Default missing"); } break; -#ifndef GLSLANG_WEB case EbtInt64: switch (constant.type) { case EbtInt8: returnValue.setI64Const(i64Const >> constant.i8Const); break; @@ -643,7 +622,6 @@ class TConstUnion { default: assert(false && "Default missing"); } break; -#endif default: assert(false && "Default missing"); } @@ -654,7 +632,6 @@ class TConstUnion { { TConstUnion returnValue; switch (type) { -#ifndef GLSLANG_WEB case EbtInt8: switch (constant.type) { case EbtInt8: returnValue.setI8Const(i8Const << constant.i8Const); break; @@ -733,19 +710,16 @@ class TConstUnion { default: assert(false && "Default missing"); } break; -#endif case EbtInt: switch (constant.type) { case EbtInt: returnValue.setIConst(iConst << constant.iConst); break; case EbtUint: returnValue.setIConst(iConst << constant.uConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setIConst(iConst << constant.i8Const); break; case EbtUint8: returnValue.setIConst(iConst << constant.u8Const); break; case EbtInt16: returnValue.setIConst(iConst << constant.i16Const); break; case EbtUint16: returnValue.setIConst(iConst << constant.u16Const); break; case EbtInt64: returnValue.setIConst(iConst << constant.i64Const); break; case EbtUint64: returnValue.setIConst(iConst << constant.u64Const); break; -#endif default: assert(false && "Default missing"); } break; @@ -753,14 +727,12 @@ class TConstUnion { switch (constant.type) { case EbtInt: returnValue.setUConst(uConst << constant.iConst); break; case EbtUint: returnValue.setUConst(uConst << constant.uConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setUConst(uConst << constant.i8Const); break; case EbtUint8: returnValue.setUConst(uConst << constant.u8Const); break; case EbtInt16: returnValue.setUConst(uConst << constant.i16Const); break; case EbtUint16: returnValue.setUConst(uConst << constant.u16Const); break; case EbtInt64: returnValue.setUConst(uConst << constant.i64Const); break; case EbtUint64: returnValue.setUConst(uConst << constant.u64Const); break; -#endif default: assert(false && "Default missing"); } break; @@ -777,14 +749,12 @@ class TConstUnion { switch (type) { case EbtInt: returnValue.setIConst(iConst & constant.iConst); break; case EbtUint: returnValue.setUConst(uConst & constant.uConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setI8Const(i8Const & constant.i8Const); break; case EbtUint8: returnValue.setU8Const(u8Const & constant.u8Const); break; case EbtInt16: returnValue.setI16Const(i16Const & constant.i16Const); break; case EbtUint16: returnValue.setU16Const(u16Const & constant.u16Const); break; case EbtInt64: returnValue.setI64Const(i64Const & constant.i64Const); break; case EbtUint64: returnValue.setU64Const(u64Const & constant.u64Const); break; -#endif default: assert(false && "Default missing"); } @@ -798,14 +768,12 @@ class TConstUnion { switch (type) { case EbtInt: returnValue.setIConst(iConst | constant.iConst); break; case EbtUint: returnValue.setUConst(uConst | constant.uConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setI8Const(i8Const | constant.i8Const); break; case EbtUint8: returnValue.setU8Const(u8Const | constant.u8Const); break; case EbtInt16: returnValue.setI16Const(i16Const | constant.i16Const); break; case EbtUint16: returnValue.setU16Const(u16Const | constant.u16Const); break; case EbtInt64: returnValue.setI64Const(i64Const | constant.i64Const); break; case EbtUint64: returnValue.setU64Const(u64Const | constant.u64Const); break; -#endif default: assert(false && "Default missing"); } @@ -819,14 +787,12 @@ class TConstUnion { switch (type) { case EbtInt: returnValue.setIConst(iConst ^ constant.iConst); break; case EbtUint: returnValue.setUConst(uConst ^ constant.uConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setI8Const(i8Const ^ constant.i8Const); break; case EbtUint8: returnValue.setU8Const(u8Const ^ constant.u8Const); break; case EbtInt16: returnValue.setI16Const(i16Const ^ constant.i16Const); break; case EbtUint16: returnValue.setU16Const(u16Const ^ constant.u16Const); break; case EbtInt64: returnValue.setI64Const(i64Const ^ constant.i64Const); break; case EbtUint64: returnValue.setU64Const(u64Const ^ constant.u64Const); break; -#endif default: assert(false && "Default missing"); } @@ -839,14 +805,12 @@ class TConstUnion { switch (type) { case EbtInt: returnValue.setIConst(~iConst); break; case EbtUint: returnValue.setUConst(~uConst); break; -#ifndef GLSLANG_WEB case EbtInt8: returnValue.setI8Const(~i8Const); break; case EbtUint8: returnValue.setU8Const(~u8Const); break; case EbtInt16: returnValue.setI16Const(~i16Const); break; case EbtUint16: returnValue.setU16Const(~u16Const); break; case EbtInt64: returnValue.setI64Const(~i64Const); break; case EbtUint64: returnValue.setU64Const(~u64Const); break; -#endif default: assert(false && "Default missing"); } diff --git a/third_party/glslang/glslang/Include/InitializeGlobals.h b/third_party/glslang/glslang/Include/InitializeGlobals.h index 95d0a40e99a..b7fdd7aabcb 100644 --- a/third_party/glslang/glslang/Include/InitializeGlobals.h +++ b/third_party/glslang/glslang/Include/InitializeGlobals.h @@ -37,7 +37,7 @@ namespace glslang { -bool InitializePoolIndex(); +inline bool InitializePoolIndex() { return true; } // DEPRECATED: No need to call } // end namespace glslang diff --git a/third_party/glslang/glslang/Include/PoolAlloc.h b/third_party/glslang/glslang/Include/PoolAlloc.h index 1f5cac76de2..e84ac52cd2c 100644 --- a/third_party/glslang/glslang/Include/PoolAlloc.h +++ b/third_party/glslang/glslang/Include/PoolAlloc.h @@ -37,7 +37,7 @@ #ifndef _POOLALLOC_INCLUDED_ #define _POOLALLOC_INCLUDED_ -#ifdef _DEBUG +#ifndef NDEBUG # define GUARD_BLOCKS // define to enable guard block sanity checking #endif @@ -74,7 +74,7 @@ namespace glslang { class TAllocation { public: - TAllocation(size_t size, unsigned char* mem, TAllocation* prev = 0) : + TAllocation(size_t size, unsigned char* mem, TAllocation* prev = nullptr) : size(size), mem(mem), prevAlloc(prev) { // Allocations are bracketed: // [allocationHeader][initialGuardBlock][userData][finalGuardBlock] @@ -118,11 +118,16 @@ class TAllocation { unsigned char* mem; // beginning of our allocation (pts to header) TAllocation* prevAlloc; // prior allocation in the chain - const static unsigned char guardBlockBeginVal; - const static unsigned char guardBlockEndVal; - const static unsigned char userDataFill; + static inline constexpr unsigned char guardBlockBeginVal = 0xfb; + static inline constexpr unsigned char guardBlockEndVal = 0xfe; + static inline constexpr unsigned char userDataFill = 0xcd; + +# ifdef GUARD_BLOCKS + static inline constexpr size_t guardBlockSize = 16; +# else + static inline constexpr size_t guardBlockSize = 0; +# endif - const static size_t guardBlockSize; # ifdef GUARD_BLOCKS inline static size_t headerSize() { return sizeof(TAllocation); } # else @@ -171,7 +176,7 @@ class TPoolAllocator { void popAll(); // - // Call allocate() to actually acquire memory. Returns 0 if no memory + // Call allocate() to actually acquire memory. Returns nullptr if no memory // available, otherwise a properly aligned pointer to 'numBytes' of memory. // void* allocate(size_t numBytes); @@ -189,7 +194,7 @@ class TPoolAllocator { struct tHeader { tHeader(tHeader* nextPage, size_t pageCount) : #ifdef GUARD_BLOCKS - lastAllocation(0), + lastAllocation(nullptr), #endif nextPage(nextPage), pageCount(pageCount) { } diff --git a/third_party/glslang/glslang/Include/ShHandle.h b/third_party/glslang/glslang/Include/ShHandle.h index df07bd8edad..dee47c0dfd4 100644 --- a/third_party/glslang/glslang/Include/ShHandle.h +++ b/third_party/glslang/glslang/Include/ShHandle.h @@ -58,9 +58,9 @@ class TShHandleBase { public: TShHandleBase() { pool = new glslang::TPoolAllocator; } virtual ~TShHandleBase() { delete pool; } - virtual TCompiler* getAsCompiler() { return 0; } - virtual TLinker* getAsLinker() { return 0; } - virtual TUniformMap* getAsUniformMap() { return 0; } + virtual TCompiler* getAsCompiler() { return nullptr; } + virtual TLinker* getAsLinker() { return nullptr; } + virtual TUniformMap* getAsUniformMap() { return nullptr; } virtual glslang::TPoolAllocator* getPool() const { return pool; } private: glslang::TPoolAllocator* pool; @@ -123,11 +123,11 @@ class TLinker : public TShHandleBase { infoSink(iSink), executable(e), haveReturnableObjectCode(false), - appAttributeBindings(0), - fixedAttributeBindings(0), - excludedAttributes(0), + appAttributeBindings(nullptr), + fixedAttributeBindings(nullptr), + excludedAttributes(nullptr), excludedCount(0), - uniformBindings(0) { } + uniformBindings(nullptr) { } virtual TLinker* getAsLinker() { return this; } virtual ~TLinker() { } virtual bool link(TCompilerList&, TUniformMap*) = 0; @@ -137,7 +137,7 @@ class TLinker : public TShHandleBase { virtual void getAttributeBindings(ShBindingTable const **t) const = 0; virtual void setExcludedAttributes(const int* attributes, int count) { excludedAttributes = attributes; excludedCount = count; } virtual ShBindingTable* getUniformBindings() const { return uniformBindings; } - virtual const void* getObjectCode() const { return 0; } // a real compiler would be returning object code here + virtual const void* getObjectCode() const { return nullptr; } // a real compiler would be returning object code here virtual TInfoSink& getInfoSink() { return infoSink; } TInfoSink& infoSink; protected: diff --git a/third_party/glslang/glslang/Include/SpirvIntrinsics.h b/third_party/glslang/glslang/Include/SpirvIntrinsics.h index 3c7d72ce97f..0082a4d4eb3 100644 --- a/third_party/glslang/glslang/Include/SpirvIntrinsics.h +++ b/third_party/glslang/glslang/Include/SpirvIntrinsics.h @@ -35,12 +35,11 @@ #pragma once -#ifndef GLSLANG_WEB - // // GL_EXT_spirv_intrinsics // #include "Common.h" +#include namespace glslang { @@ -98,12 +97,27 @@ struct TSpirvInstruction { struct TSpirvTypeParameter { POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator()) - TSpirvTypeParameter(const TIntermConstantUnion* arg) { constant = arg; } + TSpirvTypeParameter(const TIntermConstantUnion* arg) { value = arg; } + TSpirvTypeParameter(const TType* arg) { value = arg; } - bool operator==(const TSpirvTypeParameter& rhs) const { return constant == rhs.constant; } + const TIntermConstantUnion* getAsConstant() const + { + if (value.index() == 0) + return std::get(value); + return nullptr; + } + const TType* getAsType() const + { + if (value.index() == 1) + return std::get(value); + return nullptr; + } + + bool operator==(const TSpirvTypeParameter& rhs) const; bool operator!=(const TSpirvTypeParameter& rhs) const { return !operator==(rhs); } - const TIntermConstantUnion* constant; + // Parameter value: constant expression or type specifier + std::variant value; }; typedef TVector TSpirvTypeParameters; @@ -124,5 +138,3 @@ struct TSpirvType { }; } // end namespace glslang - -#endif // GLSLANG_WEB diff --git a/third_party/glslang/glslang/Include/Types.h b/third_party/glslang/glslang/Include/Types.h index 05f90ac2136..26aba9bbf4a 100644 --- a/third_party/glslang/glslang/Include/Types.h +++ b/third_party/glslang/glslang/Include/Types.h @@ -72,6 +72,7 @@ enum TSamplerDim { EsdRect, EsdBuffer, EsdSubpass, // goes only with non-sampled image (image is true) + EsdAttachmentEXT, EsdNumDims }; @@ -85,19 +86,6 @@ struct TSampler { // misnomer now; includes images, textures without sampler, bool combined : 1; // true means texture is combined with a sampler, false means texture with no sampler bool sampler : 1; // true means a pure sampler, other fields should be clear() -#ifdef GLSLANG_WEB - bool is1D() const { return false; } - bool isBuffer() const { return false; } - bool isRect() const { return false; } - bool isSubpass() const { return false; } - bool isCombined() const { return true; } - bool isImage() const { return false; } - bool isImageClass() const { return false; } - bool isMultiSample() const { return false; } - bool isExternal() const { return false; } - void setExternal(bool e) { } - bool isYuv() const { return false; } -#else unsigned int vectorSize : 3; // vector return type size. // Some languages support structures as sample results. Storing the whole structure in the // TSampler is too large, so there is an index to a separate table. @@ -122,14 +110,14 @@ struct TSampler { // misnomer now; includes images, textures without sampler, bool isBuffer() const { return dim == EsdBuffer; } bool isRect() const { return dim == EsdRect; } bool isSubpass() const { return dim == EsdSubpass; } + bool isAttachmentEXT() const { return dim == EsdAttachmentEXT; } bool isCombined() const { return combined; } - bool isImage() const { return image && !isSubpass(); } + bool isImage() const { return image && !isSubpass() && !isAttachmentEXT();} bool isImageClass() const { return image; } bool isMultiSample() const { return ms; } bool isExternal() const { return external; } void setExternal(bool e) { external = e; } bool isYuv() const { return yuv; } -#endif bool isTexture() const { return !sampler && !image; } bool isPureSampler() const { return sampler; } @@ -149,10 +137,8 @@ struct TSampler { // misnomer now; includes images, textures without sampler, image = false; combined = false; sampler = false; -#ifndef GLSLANG_WEB external = false; yuv = false; -#endif #ifdef ENABLE_HLSL clearReturnStruct(); @@ -204,7 +190,6 @@ struct TSampler { // misnomer now; includes images, textures without sampler, shadow = s; } -#ifndef GLSLANG_WEB // make a subpass input attachment void setSubpass(TBasicType t, bool m = false) { @@ -214,7 +199,15 @@ struct TSampler { // misnomer now; includes images, textures without sampler, dim = EsdSubpass; ms = m; } -#endif + + // make an AttachmentEXT + void setAttachmentEXT(TBasicType t) + { + clear(); + type = t; + image = true; + dim = EsdAttachmentEXT; + } bool operator==(const TSampler& right) const { @@ -252,7 +245,6 @@ struct TSampler { // misnomer now; includes images, textures without sampler, switch (type) { case EbtInt: s.append("i"); break; case EbtUint: s.append("u"); break; -#ifndef GLSLANG_WEB case EbtFloat16: s.append("f16"); break; case EbtInt8: s.append("i8"); break; case EbtUint16: s.append("u8"); break; @@ -260,11 +252,12 @@ struct TSampler { // misnomer now; includes images, textures without sampler, case EbtUint8: s.append("u16"); break; case EbtInt64: s.append("i64"); break; case EbtUint64: s.append("u64"); break; -#endif default: break; } if (isImageClass()) { - if (isSubpass()) + if (isAttachmentEXT()) + s.append("attachmentEXT"); + else if (isSubpass()) s.append("subpass"); else s.append("image"); @@ -284,12 +277,11 @@ struct TSampler { // misnomer now; includes images, textures without sampler, case Esd2D: s.append("2D"); break; case Esd3D: s.append("3D"); break; case EsdCube: s.append("Cube"); break; -#ifndef GLSLANG_WEB - case Esd1D: s.append("1D"); break; - case EsdRect: s.append("2DRect"); break; - case EsdBuffer: s.append("Buffer"); break; - case EsdSubpass: s.append("Input"); break; -#endif + case Esd1D: s.append("1D"); break; + case EsdRect: s.append("2DRect"); break; + case EsdBuffer: s.append("Buffer"); break; + case EsdSubpass: s.append("Input"); break; + case EsdAttachmentEXT: s.append(""); break; default: break; // some compilers want this } if (isMultiSample()) @@ -429,6 +421,12 @@ enum TLayoutFormat { ElfR16ui, ElfR8ui, ElfR64ui, + ElfExtSizeGuard, // to help with comparisons + ElfSize1x8, + ElfSize1x16, + ElfSize1x32, + ElfSize2x32, + ElfSize4x32, ElfCount }; @@ -512,12 +510,10 @@ class TQualifier { invariant = false; makeTemporary(); declaredBuiltIn = EbvNone; -#ifndef GLSLANG_WEB noContraction = false; nullInit = false; spirvByReference = false; spirvLiteral = false; -#endif defaultBlock = false; } @@ -534,21 +530,17 @@ class TQualifier { nullInit = false; defaultBlock = false; clearLayout(); -#ifndef GLSLANG_WEB spirvStorageClass = -1; spirvDecorate = nullptr; spirvByReference = false; spirvLiteral = false; -#endif } void clearInterstage() { clearInterpolation(); -#ifndef GLSLANG_WEB patch = false; sample = false; -#endif } void clearInterpolation() @@ -556,20 +548,17 @@ class TQualifier { centroid = false; smooth = false; flat = false; -#ifndef GLSLANG_WEB nopersp = false; explicitInterp = false; pervertexNV = false; perPrimitiveNV = false; perViewNV = false; perTaskNV = false; -#endif pervertexEXT = false; } void clearMemory() { -#ifndef GLSLANG_WEB coherent = false; devicecoherent = false; queuefamilycoherent = false; @@ -581,7 +570,6 @@ class TQualifier { restrict = false; readonly = false; writeonly = false; -#endif } const char* semanticName; @@ -600,31 +588,6 @@ class TQualifier { bool explicitOffset : 1; bool defaultBlock : 1; // default blocks with matching names have structures merged when linking -#ifdef GLSLANG_WEB - bool isWriteOnly() const { return false; } - bool isReadOnly() const { return false; } - bool isRestrict() const { return false; } - bool isCoherent() const { return false; } - bool isVolatile() const { return false; } - bool isSample() const { return false; } - bool isMemory() const { return false; } - bool isMemoryQualifierImageAndSSBOOnly() const { return false; } - bool bufferReferenceNeedsVulkanMemoryModel() const { return false; } - bool isInterpolation() const { return flat || smooth; } - bool isExplicitInterpolation() const { return false; } - bool isAuxiliary() const { return centroid; } - bool isPatch() const { return false; } - bool isNoContraction() const { return false; } - void setNoContraction() { } - bool isPervertexNV() const { return false; } - bool isPervertexEXT() const { return pervertexEXT; } - void setNullInit() {} - bool isNullInit() const { return false; } - void setSpirvByReference() { } - bool isSpirvByReference() { return false; } - void setSpirvLiteral() { } - bool isSpirvLiteral() { return false; } -#else bool noContraction: 1; // prevent contraction and reassociation, e.g., for 'precise' keyword, and expressions it affects bool nopersp : 1; bool explicitInterp : 1; @@ -691,7 +654,6 @@ class TQualifier { bool isSpirvByReference() const { return spirvByReference; } void setSpirvLiteral() { spirvLiteral = true; } bool isSpirvLiteral() const { return spirvLiteral; } -#endif bool isPipeInput() const { @@ -822,9 +784,7 @@ class TQualifier { } void setBlockStorage(TBlockStorageClass newBacking) { -#ifndef GLSLANG_WEB layoutPushConstant = (newBacking == EbsPushConstant); -#endif switch (newBacking) { case EbsUniform : if (layoutPacking == ElpStd430) { @@ -836,23 +796,16 @@ class TQualifier { case EbsStorageBuffer : storage = EvqBuffer; break; -#ifndef GLSLANG_WEB case EbsPushConstant : storage = EvqUniform; layoutSet = TQualifier::layoutSetEnd; layoutBinding = TQualifier::layoutBindingEnd; break; -#endif default: break; } } -#ifdef GLSLANG_WEB - bool isPerView() const { return false; } - bool isTaskMemory() const { return false; } - bool isArrayedIo(EShLanguage language) const { return false; } -#else bool isPerPrimitive() const { return perPrimitiveNV; } bool isPerView() const { return perViewNV; } bool isTaskMemory() const { return perTaskNV; } @@ -863,6 +816,9 @@ class TQualifier { bool isAnyCallable() const { return storage == EvqCallableData || storage == EvqCallableDataIn; } + bool isHitObjectAttrNV() const { + return storage == EvqHitObjectAttrNV; + } // True if this type of IO is supposed to be arrayed with extra level for per-vertex data bool isArrayedIo(EShLanguage language) const @@ -875,7 +831,7 @@ class TQualifier { case EShLangTessEvaluation: return ! patch && isPipeInput(); case EShLangFragment: - return pervertexNV && isPipeInput(); + return (pervertexNV || pervertexEXT) && isPipeInput(); case EShLangMesh: return ! perTaskNV && isPipeOutput(); @@ -883,14 +839,12 @@ class TQualifier { return false; } } -#endif // Implementing an embedded layout-qualifier class here, since C++ can't have a real class bitfield void clearLayout() // all layout { clearUniformLayout(); -#ifndef GLSLANG_WEB layoutPushConstant = false; layoutBufferReference = false; layoutPassthrough = false; @@ -898,9 +852,11 @@ class TQualifier { // -2048 as the default value indicating layoutSecondaryViewportRelative is not set layoutSecondaryViewportRelativeOffset = -2048; layoutShaderRecord = false; + layoutHitObjectShaderRecordNV = false; + layoutBindlessSampler = false; + layoutBindlessImage = false; layoutBufferReferenceAlign = layoutBufferReferenceAlignEnd; layoutFormat = ElfNone; -#endif clearInterstageLayout(); @@ -910,14 +866,11 @@ class TQualifier { { layoutLocation = layoutLocationEnd; layoutComponent = layoutComponentEnd; -#ifndef GLSLANG_WEB layoutIndex = layoutIndexEnd; clearStreamLayout(); clearXfbLayout(); -#endif } -#ifndef GLSLANG_WEB void clearStreamLayout() { layoutStream = layoutStreamEnd; @@ -928,7 +881,6 @@ class TQualifier { layoutXfbStride = layoutXfbStrideEnd; layoutXfbOffset = layoutXfbOffsetEnd; } -#endif bool hasNonXfbLayout() const { @@ -984,7 +936,6 @@ class TQualifier { unsigned int layoutSpecConstantId : 11; static const unsigned int layoutSpecConstantIdEnd = 0x7FF; -#ifndef GLSLANG_WEB // stored as log2 of the actual alignment value unsigned int layoutBufferReferenceAlign : 6; static const unsigned int layoutBufferReferenceAlignEnd = 0x3F; @@ -997,11 +948,14 @@ class TQualifier { bool layoutViewportRelative; int layoutSecondaryViewportRelativeOffset; bool layoutShaderRecord; + bool layoutHitObjectShaderRecordNV; // GL_EXT_spirv_intrinsics int spirvStorageClass; TSpirvDecorate* spirvDecorate; -#endif + + bool layoutBindlessSampler; + bool layoutBindlessImage; bool hasUniformLayout() const { @@ -1021,9 +975,7 @@ class TQualifier { layoutSet = layoutSetEnd; layoutBinding = layoutBindingEnd; -#ifndef GLSLANG_WEB layoutAttachment = layoutAttachmentEnd; -#endif } bool hasMatrix() const @@ -1056,26 +1008,6 @@ class TQualifier { { return layoutBinding != layoutBindingEnd; } -#ifdef GLSLANG_WEB - bool hasOffset() const { return false; } - bool isNonPerspective() const { return false; } - bool hasIndex() const { return false; } - unsigned getIndex() const { return 0; } - bool hasComponent() const { return false; } - bool hasStream() const { return false; } - bool hasFormat() const { return false; } - bool hasXfb() const { return false; } - bool hasXfbBuffer() const { return false; } - bool hasXfbStride() const { return false; } - bool hasXfbOffset() const { return false; } - bool hasAttachment() const { return false; } - TLayoutFormat getFormat() const { return ElfNone; } - bool isPushConstant() const { return false; } - bool isShaderRecord() const { return false; } - bool hasBufferReference() const { return false; } - bool hasBufferReferenceAlign() const { return false; } - bool isNonUniform() const { return false; } -#else bool hasOffset() const { return layoutOffset != layoutNotSet; @@ -1123,6 +1055,7 @@ class TQualifier { TLayoutFormat getFormat() const { return layoutFormat; } bool isPushConstant() const { return layoutPushConstant; } bool isShaderRecord() const { return layoutShaderRecord; } + bool hasHitObjectShaderRecordNV() const { return layoutHitObjectShaderRecordNV; } bool hasBufferReference() const { return layoutBufferReference; } bool hasBufferReferenceAlign() const { @@ -1132,6 +1065,14 @@ class TQualifier { { return nonUniform; } + bool isBindlessSampler() const + { + return layoutBindlessSampler; + } + bool isBindlessImage() const + { + return layoutBindlessImage; + } // GL_EXT_spirv_intrinsics bool hasSprivDecorate() const { return spirvDecorate != nullptr; } @@ -1141,7 +1082,7 @@ class TQualifier { const TSpirvDecorate& getSpirvDecorate() const { assert(spirvDecorate); return *spirvDecorate; } TSpirvDecorate& getSpirvDecorate() { assert(spirvDecorate); return *spirvDecorate; } TString getSpirvDecorateQualifierString() const; -#endif + bool hasSpecConstantId() const { // Not the same thing as being a specialization constant, this @@ -1175,12 +1116,10 @@ class TQualifier { { switch (packing) { case ElpStd140: return "std140"; -#ifndef GLSLANG_WEB case ElpPacked: return "packed"; case ElpShared: return "shared"; case ElpStd430: return "std430"; case ElpScalar: return "scalar"; -#endif default: return "none"; } } @@ -1192,9 +1131,6 @@ class TQualifier { default: return "none"; } } -#ifdef GLSLANG_WEB - static const char* getLayoutFormatString(TLayoutFormat f) { return "none"; } -#else static const char* getLayoutFormatString(TLayoutFormat f) { switch (f) { @@ -1241,6 +1177,11 @@ class TQualifier { case ElfR8ui: return "r8ui"; case ElfR64ui: return "r64ui"; case ElfR64i: return "r64i"; + case ElfSize1x8: return "size1x8"; + case ElfSize1x16: return "size1x16"; + case ElfSize1x32: return "size1x32"; + case ElfSize2x32: return "size2x32"; + case ElfSize4x32: return "size4x32"; default: return "none"; } } @@ -1343,7 +1284,6 @@ class TQualifier { default: return "none"; } } -#endif }; // Qualifiers that don't need to be keep per object. They have shader scope, not object scope. @@ -1360,10 +1300,12 @@ struct TShaderQualifiers { int localSize[3]; // compute shader bool localSizeNotDefault[3]; // compute shader int localSizeSpecId[3]; // compute shader specialization id for gl_WorkGroupSize -#ifndef GLSLANG_WEB bool earlyFragmentTests; // fragment input bool postDepthCoverage; // fragment input bool earlyAndLateFragmentTestsAMD; //fragment input + bool nonCoherentColorAttachmentReadEXT; // fragment input + bool nonCoherentDepthAttachmentReadEXT; // fragment input + bool nonCoherentStencilAttachmentReadEXT; // fragment input TLayoutDepth layoutDepth; TLayoutStencil layoutStencil; bool blendEquation; // true if any blend equation was specified @@ -1376,9 +1318,6 @@ struct TShaderQualifiers { bool layoutPrimitiveCulling; // true if layout primitive_culling set TLayoutDepth getDepth() const { return layoutDepth; } TLayoutStencil getStencil() const { return layoutStencil; } -#else - TLayoutDepth getDepth() const { return EldNone; } -#endif void init() { @@ -1399,10 +1338,12 @@ struct TShaderQualifiers { localSizeSpecId[0] = TQualifier::layoutNotSet; localSizeSpecId[1] = TQualifier::layoutNotSet; localSizeSpecId[2] = TQualifier::layoutNotSet; -#ifndef GLSLANG_WEB earlyFragmentTests = false; earlyAndLateFragmentTestsAMD = false; postDepthCoverage = false; + nonCoherentColorAttachmentReadEXT = false; + nonCoherentDepthAttachmentReadEXT = false; + nonCoherentStencilAttachmentReadEXT = false; layoutDepth = EldNone; layoutStencil = ElsNone; blendEquation = false; @@ -1413,14 +1354,9 @@ struct TShaderQualifiers { layoutPrimitiveCulling = false; primitives = TQualifier::layoutNotSet; interlockOrdering = EioNone; -#endif } -#ifdef GLSLANG_WEB - bool hasBlendEquation() const { return false; } -#else bool hasBlendEquation() const { return blendEquation; } -#endif // Merge in characteristics from the 'src' qualifier. They can override when // set, but never erase when not set. @@ -1453,13 +1389,18 @@ struct TShaderQualifiers { if (src.localSizeSpecId[i] != TQualifier::layoutNotSet) localSizeSpecId[i] = src.localSizeSpecId[i]; } -#ifndef GLSLANG_WEB if (src.earlyFragmentTests) earlyFragmentTests = true; if (src.earlyAndLateFragmentTestsAMD) earlyAndLateFragmentTestsAMD = true; if (src.postDepthCoverage) postDepthCoverage = true; + if (src.nonCoherentColorAttachmentReadEXT) + nonCoherentColorAttachmentReadEXT = true; + if (src.nonCoherentDepthAttachmentReadEXT) + nonCoherentDepthAttachmentReadEXT = true; + if (src.nonCoherentStencilAttachmentReadEXT) + nonCoherentStencilAttachmentReadEXT = true; if (src.layoutDepth) layoutDepth = src.layoutDepth; if (src.layoutStencil) @@ -1480,10 +1421,22 @@ struct TShaderQualifiers { interlockOrdering = src.interlockOrdering; if (src.layoutPrimitiveCulling) layoutPrimitiveCulling = src.layoutPrimitiveCulling; -#endif } }; +class TTypeParameters { +public: + POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator()) + + TTypeParameters() : basicType(EbtVoid), arraySizes(nullptr) {} + + TBasicType basicType; + TArraySizes *arraySizes; + + bool operator==(const TTypeParameters& rhs) const { return basicType == rhs.basicType && *arraySizes == *rhs.arraySizes; } + bool operator!=(const TTypeParameters& rhs) const { return basicType != rhs.basicType || *arraySizes != *rhs.arraySizes; } +}; + // // TPublicType is just temporarily used while parsing and not quite the same // information kept per node in TType. Due to the bison stack, it can't have @@ -1498,24 +1451,21 @@ class TPublicType { TSampler sampler; TQualifier qualifier; TShaderQualifiers shaderQualifiers; - int vectorSize : 4; - int matrixCols : 4; - int matrixRows : 4; - bool coopmat : 1; + int vectorSize : 4; + int matrixCols : 4; + int matrixRows : 4; + bool coopmatNV : 1; + bool coopmatKHR : 1; TArraySizes* arraySizes; const TType* userDef; TSourceLoc loc; - TArraySizes* typeParameters; -#ifndef GLSLANG_WEB + TTypeParameters* typeParameters; // SPIR-V type defined by spirv_type directive TSpirvType* spirvType; -#endif -#ifdef GLSLANG_WEB - bool isCoopmat() const { return false; } -#else - bool isCoopmat() const { return coopmat; } -#endif + bool isCoopmat() const { return coopmatNV || coopmatKHR; } + bool isCoopmatNV() const { return coopmatNV; } + bool isCoopmatKHR() const { return coopmatKHR; } void initType(const TSourceLoc& l) { @@ -1527,10 +1477,9 @@ class TPublicType { userDef = nullptr; loc = l; typeParameters = nullptr; - coopmat = false; -#ifndef GLSLANG_WEB + coopmatNV = false; + coopmatKHR = false; spirvType = nullptr; -#endif } void initQualifiers(bool global = false) @@ -1567,14 +1516,13 @@ class TPublicType { return matrixCols == 0 && vectorSize == 1 && arraySizes == nullptr && userDef == nullptr; } -#ifndef GLSLANG_WEB // GL_EXT_spirv_intrinsics void setSpirvType(const TSpirvInstruction& spirvInst, const TSpirvTypeParameters* typeParams = nullptr); -#endif // "Image" is a superset of "Subpass" - bool isImage() const { return basicType == EbtSampler && sampler.isImage(); } - bool isSubpass() const { return basicType == EbtSampler && sampler.isSubpass(); } + bool isImage() const { return basicType == EbtSampler && sampler.isImage(); } + bool isSubpass() const { return basicType == EbtSampler && sampler.isSubpass(); } + bool isAttachmentEXT() const { return basicType == EbtSampler && sampler.isAttachmentEXT(); } }; // @@ -1587,11 +1535,9 @@ class TType { // for "empty" type (no args) or simple scalar/vector/matrix explicit TType(TBasicType t = EbtVoid, TStorageQualifier q = EvqTemporary, int vs = 1, int mc = 0, int mr = 0, bool isVector = false) : - basicType(t), vectorSize(vs), matrixCols(mc), matrixRows(mr), vector1(isVector && vs == 1), coopmat(false), - arraySizes(nullptr), structure(nullptr), fieldName(nullptr), typeName(nullptr), typeParameters(nullptr) -#ifndef GLSLANG_WEB - , spirvType(nullptr) -#endif + basicType(t), vectorSize(vs), matrixCols(mc), matrixRows(mr), vector1(isVector && vs == 1), coopmatNV(false), coopmatKHR(false), coopmatKHRuse(-1), + arraySizes(nullptr), structure(nullptr), fieldName(nullptr), typeName(nullptr), typeParameters(nullptr), + spirvType(nullptr) { sampler.clear(); qualifier.clear(); @@ -1601,11 +1547,9 @@ class TType { // for explicit precision qualifier TType(TBasicType t, TStorageQualifier q, TPrecisionQualifier p, int vs = 1, int mc = 0, int mr = 0, bool isVector = false) : - basicType(t), vectorSize(vs), matrixCols(mc), matrixRows(mr), vector1(isVector && vs == 1), coopmat(false), - arraySizes(nullptr), structure(nullptr), fieldName(nullptr), typeName(nullptr), typeParameters(nullptr) -#ifndef GLSLANG_WEB - , spirvType(nullptr) -#endif + basicType(t), vectorSize(vs), matrixCols(mc), matrixRows(mr), vector1(isVector && vs == 1), coopmatNV(false), coopmatKHR(false), coopmatKHRuse(-1), + arraySizes(nullptr), structure(nullptr), fieldName(nullptr), typeName(nullptr), typeParameters(nullptr), + spirvType(nullptr) { sampler.clear(); qualifier.clear(); @@ -1617,11 +1561,9 @@ class TType { // for turning a TPublicType into a TType, using a shallow copy explicit TType(const TPublicType& p) : basicType(p.basicType), - vectorSize(p.vectorSize), matrixCols(p.matrixCols), matrixRows(p.matrixRows), vector1(false), coopmat(p.coopmat), - arraySizes(p.arraySizes), structure(nullptr), fieldName(nullptr), typeName(nullptr), typeParameters(p.typeParameters) -#ifndef GLSLANG_WEB - , spirvType(p.spirvType) -#endif + vectorSize(p.vectorSize), matrixCols(p.matrixCols), matrixRows(p.matrixRows), vector1(false), coopmatNV(p.coopmatNV), coopmatKHR(p.coopmatKHR), coopmatKHRuse(-1), + arraySizes(p.arraySizes), structure(nullptr), fieldName(nullptr), typeName(nullptr), typeParameters(p.typeParameters), + spirvType(p.spirvType) { if (basicType == EbtSampler) sampler = p.sampler; @@ -1637,28 +1579,39 @@ class TType { } typeName = NewPoolTString(p.userDef->getTypeName().c_str()); } - if (p.isCoopmat() && p.typeParameters && p.typeParameters->getNumDims() > 0) { - int numBits = p.typeParameters->getDimSize(0); + if (p.isCoopmatNV() && p.typeParameters && p.typeParameters->arraySizes->getNumDims() > 0) { + int numBits = p.typeParameters->arraySizes->getDimSize(0); if (p.basicType == EbtFloat && numBits == 16) { basicType = EbtFloat16; qualifier.precision = EpqNone; } else if (p.basicType == EbtUint && numBits == 8) { basicType = EbtUint8; qualifier.precision = EpqNone; + } else if (p.basicType == EbtUint && numBits == 16) { + basicType = EbtUint16; + qualifier.precision = EpqNone; } else if (p.basicType == EbtInt && numBits == 8) { basicType = EbtInt8; qualifier.precision = EpqNone; + } else if (p.basicType == EbtInt && numBits == 16) { + basicType = EbtInt16; + qualifier.precision = EpqNone; + } + } + if (p.isCoopmatKHR() && p.typeParameters && p.typeParameters->arraySizes->getNumDims() > 0) { + basicType = p.typeParameters->basicType; + + if (p.typeParameters->arraySizes->getNumDims() == 4) { + coopmatKHRuse = p.typeParameters->arraySizes->getDimSize(3); + p.typeParameters->arraySizes->removeLastSize(); } } } // for construction of sampler types TType(const TSampler& sampler, TStorageQualifier q = EvqUniform, TArraySizes* as = nullptr) : - basicType(EbtSampler), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false), coopmat(false), + basicType(EbtSampler), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false), coopmatNV(false), coopmatKHR(false), coopmatKHRuse(-1), arraySizes(as), structure(nullptr), fieldName(nullptr), typeName(nullptr), - sampler(sampler), typeParameters(nullptr) -#ifndef GLSLANG_WEB - , spirvType(nullptr) -#endif + sampler(sampler), typeParameters(nullptr), spirvType(nullptr) { qualifier.clear(); qualifier.storage = q; @@ -1700,18 +1653,18 @@ class TType { vectorSize = 1; vector1 = false; } else if (isCoopMat()) { - coopmat = false; + coopmatNV = false; + coopmatKHR = false; + coopmatKHRuse = -1; typeParameters = nullptr; } } } // for making structures, ... TType(TTypeList* userDef, const TString& n) : - basicType(EbtStruct), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false), coopmat(false), - arraySizes(nullptr), structure(userDef), fieldName(nullptr), typeParameters(nullptr) -#ifndef GLSLANG_WEB - , spirvType(nullptr) -#endif + basicType(EbtStruct), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false), coopmatNV(false), coopmatKHR(false), coopmatKHRuse(-1), + arraySizes(nullptr), structure(userDef), fieldName(nullptr), typeParameters(nullptr), + spirvType(nullptr) { sampler.clear(); qualifier.clear(); @@ -1719,25 +1672,22 @@ class TType { } // For interface blocks TType(TTypeList* userDef, const TString& n, const TQualifier& q) : - basicType(EbtBlock), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false), coopmat(false), - qualifier(q), arraySizes(nullptr), structure(userDef), fieldName(nullptr), typeParameters(nullptr) -#ifndef GLSLANG_WEB - , spirvType(nullptr) -#endif + basicType(EbtBlock), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false), coopmatNV(false), coopmatKHR(false), coopmatKHRuse(-1), + qualifier(q), arraySizes(nullptr), structure(userDef), fieldName(nullptr), typeParameters(nullptr), + spirvType(nullptr) { sampler.clear(); typeName = NewPoolTString(n.c_str()); } // for block reference (first parameter must be EbtReference) explicit TType(TBasicType t, const TType &p, const TString& n) : - basicType(t), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false), - arraySizes(nullptr), structure(nullptr), fieldName(nullptr), typeName(nullptr) -#ifndef GLSLANG_WEB - , spirvType(nullptr) -#endif + basicType(t), vectorSize(1), matrixCols(0), matrixRows(0), vector1(false), coopmatNV(false), coopmatKHR(false), coopmatKHRuse(-1), + arraySizes(nullptr), structure(nullptr), fieldName(nullptr), typeName(nullptr), typeParameters(nullptr), + spirvType(nullptr) { assert(t == EbtReference); typeName = NewPoolTString(n.c_str()); + sampler.clear(); qualifier.clear(); qualifier.storage = p.qualifier.storage; referentType = p.clone(); @@ -1765,10 +1715,10 @@ class TType { referentType = copyOf.referentType; } typeParameters = copyOf.typeParameters; -#ifndef GLSLANG_WEB spirvType = copyOf.spirvType; -#endif - coopmat = copyOf.isCoopMat(); + coopmatNV = copyOf.isCoopMatNV(); + coopmatKHR = copyOf.isCoopMatKHR(); + coopmatKHRuse = copyOf.coopmatKHRuse; } // Make complete copy of the whole type graph rooted at 'copyOf'. @@ -1844,17 +1794,13 @@ class TType { virtual int getOuterArraySize() const { return arraySizes->getOuterSize(); } virtual TIntermTyped* getOuterArrayNode() const { return arraySizes->getOuterNode(); } virtual int getCumulativeArraySize() const { return arraySizes->getCumulativeSize(); } -#ifdef GLSLANG_WEB - bool isArrayOfArrays() const { return false; } -#else bool isArrayOfArrays() const { return arraySizes != nullptr && arraySizes->getNumDims() > 1; } -#endif virtual int getImplicitArraySize() const { return arraySizes->getImplicitSize(); } virtual const TArraySizes* getArraySizes() const { return arraySizes; } virtual TArraySizes* getArraySizes() { return arraySizes; } virtual TType* getReferentType() const { return referentType; } - virtual const TArraySizes* getTypeParameters() const { return typeParameters; } - virtual TArraySizes* getTypeParameters() { return typeParameters; } + virtual const TTypeParameters* getTypeParameters() const { return typeParameters; } + virtual TTypeParameters* getTypeParameters() { return typeParameters; } virtual bool isScalar() const { return ! isVector() && ! isMatrix() && ! isStruct() && ! isArray(); } virtual bool isScalarOrVec1() const { return isScalar() || vector1; } @@ -1864,9 +1810,11 @@ class TType { virtual bool isArray() const { return arraySizes != nullptr; } virtual bool isSizedArray() const { return isArray() && arraySizes->isSized(); } virtual bool isUnsizedArray() const { return isArray() && !arraySizes->isSized(); } + virtual bool isImplicitlySizedArray() const { return isArray() && arraySizes->isImplicitlySized(); } virtual bool isArrayVariablyIndexed() const { assert(isArray()); return arraySizes->isVariablyIndexed(); } virtual void setArrayVariablyIndexed() { assert(isArray()); arraySizes->setVariablyIndexed(); } virtual void updateImplicitArraySize(int size) { assert(isArray()); arraySizes->updateImplicitSize(size); } + virtual void setImplicitlySized(bool isImplicitSized) { arraySizes->setImplicitlySized(isImplicitSized); } virtual bool isStruct() const { return basicType == EbtStruct || basicType == EbtBlock; } virtual bool isFloatingDomain() const { return basicType == EbtFloat || basicType == EbtDouble || basicType == EbtFloat16; } virtual bool isIntegerDomain() const @@ -1888,30 +1836,26 @@ class TType { return false; } virtual bool isOpaque() const { return basicType == EbtSampler -#ifndef GLSLANG_WEB || basicType == EbtAtomicUint || basicType == EbtAccStruct || basicType == EbtRayQuery -#endif - ; } + || basicType == EbtHitObjectNV; } virtual bool isBuiltIn() const { return getQualifier().builtIn != EbvNone; } - // "Image" is a superset of "Subpass" - virtual bool isImage() const { return basicType == EbtSampler && getSampler().isImage(); } + virtual bool isAttachmentEXT() const { return basicType == EbtSampler && getSampler().isAttachmentEXT(); } + virtual bool isImage() const { return basicType == EbtSampler && getSampler().isImage(); } virtual bool isSubpass() const { return basicType == EbtSampler && getSampler().isSubpass(); } virtual bool isTexture() const { return basicType == EbtSampler && getSampler().isTexture(); } + virtual bool isBindlessImage() const { return isImage() && qualifier.layoutBindlessImage; } + virtual bool isBindlessTexture() const { return isTexture() && qualifier.layoutBindlessSampler; } // Check the block-name convention of creating a block without populating it's members: virtual bool isUnusableName() const { return isStruct() && structure == nullptr; } virtual bool isParameterized() const { return typeParameters != nullptr; } -#ifdef GLSLANG_WEB - bool isAtomic() const { return false; } - bool isCoopMat() const { return false; } - bool isReference() const { return false; } - bool isSpirvType() const { return false; } -#else bool isAtomic() const { return basicType == EbtAtomicUint; } - bool isCoopMat() const { return coopmat; } + bool isCoopMat() const { return coopmatNV || coopmatKHR; } + bool isCoopMatNV() const { return coopmatNV; } + bool isCoopMatKHR() const { return coopmatKHR; } bool isReference() const { return getBasicType() == EbtReference; } bool isSpirvType() const { return getBasicType() == EbtSpirvType; } -#endif + int getCoopMatKHRuse() const { return coopmatKHRuse; } // return true if this type contains any subtype which satisfies the given predicate. template @@ -1954,6 +1898,11 @@ class TType { return contains([](const TType* t) { return t->isOpaque(); } ); } + virtual bool containsSampler() const + { + return contains([](const TType* t) { return t->isTexture() || t->isImage(); }); + } + // Recursively checks if the type contains a built-in variable virtual bool containsBuiltIn() const { @@ -1992,15 +1941,6 @@ class TType { return contains([](const TType* t) { return t->isArray() && t->arraySizes->isOuterSpecialization(); } ); } -#ifdef GLSLANG_WEB - bool containsDouble() const { return false; } - bool contains16BitFloat() const { return false; } - bool contains64BitInt() const { return false; } - bool contains16BitInt() const { return false; } - bool contains8BitInt() const { return false; } - bool containsCoopMat() const { return false; } - bool containsReference() const { return false; } -#else bool containsDouble() const { return containsBasicType(EbtDouble); @@ -2023,13 +1963,12 @@ class TType { } bool containsCoopMat() const { - return contains([](const TType* t) { return t->coopmat; } ); + return contains([](const TType* t) { return t->coopmatNV || t->coopmatKHR; } ); } bool containsReference() const { return containsBasicType(EbtReference); } -#endif // Array editing methods. Array descriptors can be shared across // type instances. This allows all uses of the same array @@ -2087,8 +2026,12 @@ class TType { // an explicit array. void adoptImplicitArraySizes(bool skipNonvariablyIndexed) { - if (isUnsizedArray() && !(skipNonvariablyIndexed || isArrayVariablyIndexed())) + if (isUnsizedArray() && + (qualifier.builtIn == EbvSampleMask || + !(skipNonvariablyIndexed || isArrayVariablyIndexed()))) { changeOuterArraySize(getImplicitArraySize()); + setImplicitlySized(true); + } // For multi-dim per-view arrays, set unsized inner dimension size to 1 if (qualifier.isPerView() && arraySizes && arraySizes->isInnerUnsized()) arraySizes->clearInnerUnsized(); @@ -2101,43 +2044,12 @@ class TType { } } - - void updateTypeParameters(const TType& type) - { - // For when we may already be sharing existing array descriptors, - // keeping the pointers the same, just updating the contents. - assert(typeParameters != nullptr); - assert(type.typeParameters != nullptr); - *typeParameters = *type.typeParameters; - } - void copyTypeParameters(const TArraySizes& s) + void copyTypeParameters(const TTypeParameters& s) { // For setting a fresh new set of type parameters, not yet worrying about sharing. - typeParameters = new TArraySizes; + typeParameters = new TTypeParameters; *typeParameters = s; } - void transferTypeParameters(TArraySizes* s) - { - // For setting an already allocated set of sizes that this type can use - // (no copy made). - typeParameters = s; - } - void clearTypeParameters() - { - typeParameters = nullptr; - } - - // Add inner array sizes, to any existing sizes, via copy; the - // sizes passed in can still be reused for other purposes. - void copyTypeParametersInnerSizes(const TArraySizes* s) - { - if (s != nullptr) { - if (typeParameters == nullptr) - copyTypeParameters(*s); - else - typeParameters->addInnerSizes(*s); - } - } const char* getBasicString() const { @@ -2151,7 +2063,6 @@ class TType { case EbtInt: return "int"; case EbtUint: return "uint"; case EbtSampler: return "sampler/image"; -#ifndef GLSLANG_WEB case EbtVoid: return "void"; case EbtDouble: return "double"; case EbtFloat16: return "float16_t"; @@ -2170,18 +2081,11 @@ class TType { case EbtReference: return "reference"; case EbtString: return "string"; case EbtSpirvType: return "spirv_type"; -#endif + case EbtCoopmat: return "coopmat"; default: return "unknown type"; } } -#ifdef GLSLANG_WEB - TString getCompleteString() const { return ""; } - const char* getStorageQualifierString() const { return ""; } - const char* getBuiltInVariableString() const { return ""; } - const char* getPrecisionQualifierString() const { return ""; } - TString getBasicTypeString() const { return ""; } -#else TString getCompleteString(bool syntactic = false, bool getQualifiers = true, bool getPrecision = true, bool getType = true, TString name = "", TString structName = "") const { @@ -2283,8 +2187,16 @@ class TType { appendStr(" layoutSecondaryViewportRelativeOffset="); appendInt(qualifier.layoutSecondaryViewportRelativeOffset); } + if (qualifier.layoutShaderRecord) appendStr(" shaderRecordNV"); + if (qualifier.layoutHitObjectShaderRecordNV) + appendStr(" hitobjectshaderrecordnv"); + + if (qualifier.layoutBindlessSampler) + appendStr(" layoutBindlessSampler"); + if (qualifier.layoutBindlessImage) + appendStr(" layoutBindlessImage"); appendStr(")"); } @@ -2472,12 +2384,21 @@ class TType { } } if (isParameterized()) { + if (isCoopMatKHR()) { + appendStr(" "); + appendStr("coopmat"); + } + appendStr("<"); - for (int i = 0; i < (int)typeParameters->getNumDims(); ++i) { - appendInt(typeParameters->getDimSize(i)); - if (i != (int)typeParameters->getNumDims() - 1) + for (int i = 0; i < (int)typeParameters->arraySizes->getNumDims(); ++i) { + appendInt(typeParameters->arraySizes->getDimSize(i)); + if (i != (int)typeParameters->arraySizes->getNumDims() - 1) appendStr(", "); } + if (coopmatKHRuse != -1) { + appendStr(", "); + appendInt(coopmatKHRuse); + } appendStr(">"); } if (getPrecision && qualifier.precision != EpqNone) { @@ -2538,12 +2459,12 @@ class TType { const char* getStorageQualifierString() const { return GetStorageQualifierString(qualifier.storage); } const char* getBuiltInVariableString() const { return GetBuiltInVariableString(qualifier.builtIn); } const char* getPrecisionQualifierString() const { return GetPrecisionQualifierString(qualifier.precision); } -#endif const TTypeList* getStruct() const { assert(isStruct()); return structure; } void setStruct(TTypeList* s) { assert(isStruct()); structure = s; } TTypeList* getWritableStruct() const { assert(isStruct()); return structure; } // This should only be used when known to not be sharing with other threads void setBasicType(const TBasicType& t) { basicType = t; } + void setVectorSize(int s) { vectorSize = s; } int computeNumComponents() const { @@ -2711,7 +2632,10 @@ class TType { bool sameArrayness(const TType& right) const { return ((arraySizes == nullptr && right.arraySizes == nullptr) || - (arraySizes != nullptr && right.arraySizes != nullptr && *arraySizes == *right.arraySizes)); + (arraySizes != nullptr && right.arraySizes != nullptr && + (*arraySizes == *right.arraySizes || + (arraySizes->isImplicitlySized() && right.arraySizes->isDefaultImplicitlySized()) || + (right.arraySizes->isImplicitlySized() && arraySizes->isDefaultImplicitlySized())))); } // See if two type's arrayness match in everything except their outer dimension @@ -2728,14 +2652,12 @@ class TType { (typeParameters != nullptr && right.typeParameters != nullptr && *typeParameters == *right.typeParameters)); } -#ifndef GLSLANG_WEB // See if two type's SPIR-V type contents match bool sameSpirvType(const TType& right) const { return ((spirvType == nullptr && right.spirvType == nullptr) || (spirvType != nullptr && right.spirvType != nullptr && *spirvType == *right.spirvType)); } -#endif // See if two type's elements match in all ways except basic type // If mismatch in structure members, return member indices in lpidx and rpidx. @@ -2750,7 +2672,8 @@ class TType { matrixCols == right.matrixCols && matrixRows == right.matrixRows && vector1 == right.vector1 && - isCoopMat() == right.isCoopMat() && + isCoopMatNV() == right.isCoopMatNV() && + isCoopMatKHR() == right.isCoopMatKHR() && sameStructType(right, lpidx, rpidx) && sameReferenceType(right); } @@ -2759,32 +2682,69 @@ class TType { // an OK function parameter bool coopMatParameterOK(const TType& right) const { - return isCoopMat() && right.isCoopMat() && (getBasicType() == right.getBasicType()) && - typeParameters == nullptr && right.typeParameters != nullptr; + if (isCoopMatNV()) { + return right.isCoopMatNV() && (getBasicType() == right.getBasicType()) && typeParameters == nullptr && + right.typeParameters != nullptr; + } + if (isCoopMatKHR() && right.isCoopMatKHR()) { + return ((getBasicType() == right.getBasicType()) || (getBasicType() == EbtCoopmat) || + (right.getBasicType() == EbtCoopmat)) && + typeParameters == nullptr && right.typeParameters != nullptr; + } + return false; } bool sameCoopMatBaseType(const TType &right) const { - bool rv = coopmat && right.coopmat; - if (getBasicType() == EbtFloat || getBasicType() == EbtFloat16) - rv = right.getBasicType() == EbtFloat || right.getBasicType() == EbtFloat16; - else if (getBasicType() == EbtUint || getBasicType() == EbtUint8) - rv = right.getBasicType() == EbtUint || right.getBasicType() == EbtUint8; - else if (getBasicType() == EbtInt || getBasicType() == EbtInt8) - rv = right.getBasicType() == EbtInt || right.getBasicType() == EbtInt8; - else - rv = false; + bool rv = false; + + if (isCoopMatNV()) { + rv = isCoopMatNV() && right.isCoopMatNV(); + if (getBasicType() == EbtFloat || getBasicType() == EbtFloat16) + rv = right.getBasicType() == EbtFloat || right.getBasicType() == EbtFloat16; + else if (getBasicType() == EbtUint || getBasicType() == EbtUint8 || getBasicType() == EbtUint16) + rv = right.getBasicType() == EbtUint || right.getBasicType() == EbtUint8 || right.getBasicType() == EbtUint16; + else if (getBasicType() == EbtInt || getBasicType() == EbtInt8 || getBasicType() == EbtInt16) + rv = right.getBasicType() == EbtInt || right.getBasicType() == EbtInt8 || right.getBasicType() == EbtInt16; + else + rv = false; + } else if (isCoopMatKHR() && right.isCoopMatKHR()) { + if (getBasicType() == EbtFloat || getBasicType() == EbtFloat16) + rv = right.getBasicType() == EbtFloat || right.getBasicType() == EbtFloat16 || right.getBasicType() == EbtCoopmat; + else if (getBasicType() == EbtUint || getBasicType() == EbtUint8 || getBasicType() == EbtUint16) + rv = right.getBasicType() == EbtUint || right.getBasicType() == EbtUint8 || right.getBasicType() == EbtUint16 || right.getBasicType() == EbtCoopmat; + else if (getBasicType() == EbtInt || getBasicType() == EbtInt8 || getBasicType() == EbtInt16) + rv = right.getBasicType() == EbtInt || right.getBasicType() == EbtInt8 || right.getBasicType() == EbtInt16 || right.getBasicType() == EbtCoopmat; + else + rv = false; + } return rv; } + bool sameCoopMatUse(const TType &right) const { + return coopmatKHRuse == right.coopmatKHRuse; + } + + bool sameCoopMatShapeAndUse(const TType &right) const + { + if (!isCoopMat() || !right.isCoopMat() || isCoopMatKHR() != right.isCoopMatKHR()) + return false; + + if (coopmatKHRuse != right.coopmatKHRuse) + return false; + + // Skip bit width type parameter (first array size) for coopmatNV + int firstArrayDimToCompare = isCoopMatNV() ? 1 : 0; + for (int i = firstArrayDimToCompare; i < typeParameters->arraySizes->getNumDims(); ++i) { + if (typeParameters->arraySizes->getDimSize(i) != right.typeParameters->arraySizes->getDimSize(i)) + return false; + } + return true; + } // See if two types match in all ways (just the actual type, not qualification) bool operator==(const TType& right) const { -#ifndef GLSLANG_WEB - return sameElementType(right) && sameArrayness(right) && sameTypeParameters(right) && sameSpirvType(right); -#else - return sameElementType(right) && sameArrayness(right) && sameTypeParameters(right); -#endif + return sameElementType(right) && sameArrayness(right) && sameTypeParameters(right) && sameCoopMatUse(right) && sameSpirvType(right); } bool operator!=(const TType& right) const @@ -2794,18 +2754,14 @@ class TType { unsigned int getBufferReferenceAlignment() const { -#ifndef GLSLANG_WEB if (getBasicType() == glslang::EbtReference) { return getReferentType()->getQualifier().hasBufferReferenceAlign() ? (1u << getReferentType()->getQualifier().layoutBufferReferenceAlign) : 16u; } -#endif return 0; } -#ifndef GLSLANG_WEB const TSpirvType& getSpirvType() const { assert(spirvType); return *spirvType; } -#endif protected: // Require consumer to pick between deep copy and shallow copy. @@ -2819,7 +2775,6 @@ class TType { { shallowCopy(copyOf); -#ifndef GLSLANG_WEB // GL_EXT_spirv_intrinsics if (copyOf.qualifier.spirvDecorate) { qualifier.spirvDecorate = new TSpirvDecorate; @@ -2830,7 +2785,6 @@ class TType { spirvType = new TSpirvType; *spirvType = *copyOf.spirvType; } -#endif if (copyOf.arraySizes) { arraySizes = new TArraySizes; @@ -2838,8 +2792,10 @@ class TType { } if (copyOf.typeParameters) { - typeParameters = new TArraySizes; - *typeParameters = *copyOf.typeParameters; + typeParameters = new TTypeParameters; + typeParameters->arraySizes = new TArraySizes; + *typeParameters->arraySizes = *copyOf.typeParameters->arraySizes; + typeParameters->basicType = copyOf.basicType; } if (copyOf.isStruct() && copyOf.structure) { @@ -2877,7 +2833,9 @@ class TType { // functionality is added. // HLSL does have a 1-component vectors, so this will be true to disambiguate // from a scalar. - bool coopmat : 1; + bool coopmatNV : 1; + bool coopmatKHR : 1; + int coopmatKHRuse : 4; // Accepts one of three values: 0, 1, 2 (gl_MatrixUseA, gl_MatrixUseB, gl_MatrixUseAccumulator) TQualifier qualifier; TArraySizes* arraySizes; // nullptr unless an array; can be shared across types @@ -2890,10 +2848,8 @@ class TType { TString *fieldName; // for structure field names TString *typeName; // for structure type name TSampler sampler; - TArraySizes* typeParameters;// nullptr unless a parameterized type; can be shared across types -#ifndef GLSLANG_WEB + TTypeParameters *typeParameters;// nullptr unless a parameterized type; can be shared across types TSpirvType* spirvType; // SPIR-V type defined by spirv_type directive -#endif }; } // end namespace glslang diff --git a/third_party/glslang/glslang/Include/arrays.h b/third_party/glslang/glslang/Include/arrays.h index 7f047d9fb13..91e1908355d 100644 --- a/third_party/glslang/glslang/Include/arrays.h +++ b/third_party/glslang/glslang/Include/arrays.h @@ -147,6 +147,15 @@ struct TSmallArrayVector { sizes->erase(sizes->begin()); } + void pop_back() + { + assert(sizes != nullptr && sizes->size() > 0); + if (sizes->size() == 1) + dealloc(); + else + sizes->resize(sizes->size() - 1); + } + // 'this' should currently not be holding anything, and copyNonFront // will make it hold a copy of all but the first element of rhs. // (This would be useful for making a type that is dereferenced by @@ -222,7 +231,7 @@ struct TSmallArrayVector { struct TArraySizes { POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator()) - TArraySizes() : implicitArraySize(1), variablyIndexed(false) { } + TArraySizes() : implicitArraySize(0), implicitlySized(true), variablyIndexed(false){ } // For breaking into two non-shared copies, independently modifiable. TArraySizes& operator=(const TArraySizes& from) @@ -230,6 +239,7 @@ struct TArraySizes { implicitArraySize = from.implicitArraySize; variablyIndexed = from.variablyIndexed; sizes = from.sizes; + implicitlySized = from.implicitlySized; return *this; } @@ -256,11 +266,17 @@ struct TArraySizes { void addInnerSize(int s, TIntermTyped* n) { sizes.push_back((unsigned)s, n); } void addInnerSize(TArraySize pair) { sizes.push_back(pair.size, pair.node); + implicitlySized = false; } void addInnerSizes(const TArraySizes& s) { sizes.push_back(s.sizes); } - void changeOuterSize(int s) { sizes.changeFront((unsigned)s); } - int getImplicitSize() const { return implicitArraySize; } - void updateImplicitSize(int s) { implicitArraySize = std::max(implicitArraySize, s); } + void changeOuterSize(int s) { + sizes.changeFront((unsigned)s); + implicitlySized = false; + } + int getImplicitSize() const { return implicitArraySize > 0 ? implicitArraySize : 1; } + void updateImplicitSize(int s) { + implicitArraySize = (std::max)(implicitArraySize, s); + } bool isInnerUnsized() const { for (int d = 1; d < sizes.size(); ++d) { @@ -295,7 +311,11 @@ struct TArraySizes { bool hasUnsized() const { return getOuterSize() == UnsizedArraySize || isInnerUnsized(); } bool isSized() const { return getOuterSize() != UnsizedArraySize; } + bool isImplicitlySized() const { return implicitlySized; } + bool isDefaultImplicitlySized() const { return implicitlySized && implicitArraySize == 0; } + void setImplicitlySized(bool isImplicitSizing) { implicitlySized = isImplicitSizing; } void dereference() { sizes.pop_front(); } + void removeLastSize() { sizes.pop_back(); } void copyDereferenced(const TArraySizes& rhs) { assert(sizes.size() == 0); @@ -333,6 +353,7 @@ struct TArraySizes { // the implicit size of the array, if not variably indexed and // otherwise legal. int implicitArraySize; + bool implicitlySized; bool variablyIndexed; // true if array is indexed with a non compile-time constant }; diff --git a/third_party/glslang/glslang/Include/glslang_c_interface.h b/third_party/glslang/glslang/Include/glslang_c_interface.h index 9e5608c5b3b..7fa1a05d51f 100644 --- a/third_party/glslang/glslang/Include/glslang_c_interface.h +++ b/third_party/glslang/glslang/Include/glslang_c_interface.h @@ -157,28 +157,17 @@ typedef struct glslang_resource_s { int max_task_work_group_size_y_ext; int max_task_work_group_size_z_ext; int max_mesh_view_count_ext; - int maxDualSourceDrawBuffersEXT; + union + { + int max_dual_source_draw_buffers_ext; + + /* Incorrectly capitalized name retained for backward compatibility */ + int maxDualSourceDrawBuffersEXT; + }; glslang_limits_t limits; } glslang_resource_t; -typedef struct glslang_input_s { - glslang_source_t language; - glslang_stage_t stage; - glslang_client_t client; - glslang_target_client_version_t client_version; - glslang_target_language_t target_language; - glslang_target_language_version_t target_language_version; - /** Shader source code */ - const char* code; - int default_version; - glslang_profile_t default_profile; - int force_default_version_and_profile; - int forward_compatible; - glslang_messages_t messages; - const glslang_resource_t* resource; -} glslang_input_t; - /* Inclusion result structure allocated by C include_local/include_system callbacks */ typedef struct glsl_include_result_s { /* Header file name or NULL if inclusion failed */ @@ -208,6 +197,25 @@ typedef struct glsl_include_callbacks_s { glsl_free_include_result_func free_include_result; } glsl_include_callbacks_t; +typedef struct glslang_input_s { + glslang_source_t language; + glslang_stage_t stage; + glslang_client_t client; + glslang_target_client_version_t client_version; + glslang_target_language_t target_language; + glslang_target_language_version_t target_language_version; + /** Shader source code */ + const char* code; + int default_version; + glslang_profile_t default_profile; + int force_default_version_and_profile; + int forward_compatible; + glslang_messages_t messages; + const glslang_resource_t* resource; + glsl_include_callbacks_t callbacks; + void* callbacks_ctx; +} glslang_input_t; + /* SpvOptions counterpart */ typedef struct glslang_spv_options_s { bool generate_debug_info; @@ -218,6 +226,7 @@ typedef struct glslang_spv_options_s { bool validate; bool emit_nonsemantic_shader_debug_info; bool emit_nonsemantic_shader_debug_source; + bool compile_only; } glslang_spv_options_t; #ifdef __cplusplus @@ -240,11 +249,12 @@ extern "C" { #define GLSLANG_EXPORT #endif -GLSLANG_EXPORT int glslang_initialize_process(); -GLSLANG_EXPORT void glslang_finalize_process(); +GLSLANG_EXPORT int glslang_initialize_process(void); +GLSLANG_EXPORT void glslang_finalize_process(void); GLSLANG_EXPORT glslang_shader_t* glslang_shader_create(const glslang_input_t* input); GLSLANG_EXPORT void glslang_shader_delete(glslang_shader_t* shader); +GLSLANG_EXPORT void glslang_shader_set_preamble(glslang_shader_t* shader, const char* s); GLSLANG_EXPORT void glslang_shader_shift_binding(glslang_shader_t* shader, glslang_resource_type_t res, unsigned int base); GLSLANG_EXPORT void glslang_shader_shift_binding_for_set(glslang_shader_t* shader, glslang_resource_type_t res, unsigned int base, unsigned int set); GLSLANG_EXPORT void glslang_shader_set_options(glslang_shader_t* shader, int options); // glslang_shader_options_t @@ -255,7 +265,7 @@ GLSLANG_EXPORT const char* glslang_shader_get_preprocessed_code(glslang_shader_t GLSLANG_EXPORT const char* glslang_shader_get_info_log(glslang_shader_t* shader); GLSLANG_EXPORT const char* glslang_shader_get_info_debug_log(glslang_shader_t* shader); -GLSLANG_EXPORT glslang_program_t* glslang_program_create(); +GLSLANG_EXPORT glslang_program_t* glslang_program_create(void); GLSLANG_EXPORT void glslang_program_delete(glslang_program_t* program); GLSLANG_EXPORT void glslang_program_add_shader(glslang_program_t* program, glslang_shader_t* shader); GLSLANG_EXPORT int glslang_program_link(glslang_program_t* program, int messages); // glslang_messages_t diff --git a/third_party/glslang/glslang/Include/intermediate.h b/third_party/glslang/glslang/Include/intermediate.h index a0240028d13..9d311d60b56 100644 --- a/third_party/glslang/glslang/Include/intermediate.h +++ b/third_party/glslang/glslang/Include/intermediate.h @@ -72,9 +72,7 @@ enum TOperator { EOpFunctionCall, EOpFunction, // For function definition EOpParameters, // an aggregate listing the parameters to a function -#ifndef GLSLANG_WEB EOpSpirvInst, -#endif // // Unary operators @@ -629,6 +627,9 @@ enum TOperator { EOpCooperativeMatrixLoad, EOpCooperativeMatrixStore, EOpCooperativeMatrixMulAdd, + EOpCooperativeMatrixLoadNV, + EOpCooperativeMatrixStoreNV, + EOpCooperativeMatrixMulAddNV, EOpBeginInvocationInterlock, // Fragment only EOpEndInvocationInterlock, // Fragment only @@ -766,7 +767,8 @@ enum TOperator { EOpConstructTextureSampler, EOpConstructNonuniform, // expected to be transformed away, not present in final AST EOpConstructReference, - EOpConstructCooperativeMatrix, + EOpConstructCooperativeMatrixNV, + EOpConstructCooperativeMatrixKHR, EOpConstructAccStruct, EOpConstructGuardEnd, @@ -827,6 +829,7 @@ enum TOperator { EOpSubpassLoadMS, EOpSparseImageLoad, EOpSparseImageLoadLod, + EOpColorAttachmentReadEXT, // Fragment only EOpImageGuardEnd, @@ -968,7 +971,44 @@ enum TOperator { EOpRayQueryGetIntersectionObjectToWorld, EOpRayQueryGetIntersectionWorldToObject, + // + // GL_NV_shader_invocation_reorder // + + EOpHitObjectTraceRayNV, + EOpHitObjectTraceRayMotionNV, + EOpHitObjectRecordHitNV, + EOpHitObjectRecordHitMotionNV, + EOpHitObjectRecordHitWithIndexNV, + EOpHitObjectRecordHitWithIndexMotionNV, + EOpHitObjectRecordMissNV, + EOpHitObjectRecordMissMotionNV, + EOpHitObjectRecordEmptyNV, + EOpHitObjectExecuteShaderNV, + EOpHitObjectIsEmptyNV, + EOpHitObjectIsMissNV, + EOpHitObjectIsHitNV, + EOpHitObjectGetRayTMinNV, + EOpHitObjectGetRayTMaxNV, + EOpHitObjectGetObjectRayOriginNV, + EOpHitObjectGetObjectRayDirectionNV, + EOpHitObjectGetWorldRayOriginNV, + EOpHitObjectGetWorldRayDirectionNV, + EOpHitObjectGetWorldToObjectNV, + EOpHitObjectGetObjectToWorldNV, + EOpHitObjectGetInstanceCustomIndexNV, + EOpHitObjectGetInstanceIdNV, + EOpHitObjectGetGeometryIndexNV, + EOpHitObjectGetPrimitiveIndexNV, + EOpHitObjectGetHitKindNV, + EOpHitObjectGetShaderBindingTableRecordIndexNV, + EOpHitObjectGetShaderRecordBufferHandleNV, + EOpHitObjectGetAttributesNV, + EOpHitObjectGetCurrentTimeNV, + EOpReorderThreadNV, + EOpFetchMicroTriangleVertexPositionNV, + EOpFetchMicroTriangleVertexBarycentricNV, + // HLSL operations // @@ -1055,6 +1095,24 @@ enum TOperator { // Shader Clock Ops EOpReadClockSubgroupKHR, EOpReadClockDeviceKHR, + + // GL_EXT_ray_tracing_position_fetch + EOpRayQueryGetIntersectionTriangleVertexPositionsEXT, + + // Shader tile image ops + EOpStencilAttachmentReadEXT, // Fragment only + EOpDepthAttachmentReadEXT, // Fragment only + + // Image processing + EOpImageSampleWeightedQCOM, + EOpImageBoxFilterQCOM, + EOpImageBlockMatchSADQCOM, + EOpImageBlockMatchSSDQCOM, +}; + +enum TLinkType { + ELinkNone, + ELinkExport, }; class TIntermTraverser; @@ -1086,31 +1144,31 @@ class TIntermNode { virtual const glslang::TSourceLoc& getLoc() const { return loc; } virtual void setLoc(const glslang::TSourceLoc& l) { loc = l; } virtual void traverse(glslang::TIntermTraverser*) = 0; - virtual glslang::TIntermTyped* getAsTyped() { return 0; } - virtual glslang::TIntermOperator* getAsOperator() { return 0; } - virtual glslang::TIntermConstantUnion* getAsConstantUnion() { return 0; } - virtual glslang::TIntermAggregate* getAsAggregate() { return 0; } - virtual glslang::TIntermUnary* getAsUnaryNode() { return 0; } - virtual glslang::TIntermBinary* getAsBinaryNode() { return 0; } - virtual glslang::TIntermSelection* getAsSelectionNode() { return 0; } - virtual glslang::TIntermSwitch* getAsSwitchNode() { return 0; } - virtual glslang::TIntermMethod* getAsMethodNode() { return 0; } - virtual glslang::TIntermSymbol* getAsSymbolNode() { return 0; } - virtual glslang::TIntermBranch* getAsBranchNode() { return 0; } - virtual glslang::TIntermLoop* getAsLoopNode() { return 0; } - - virtual const glslang::TIntermTyped* getAsTyped() const { return 0; } - virtual const glslang::TIntermOperator* getAsOperator() const { return 0; } - virtual const glslang::TIntermConstantUnion* getAsConstantUnion() const { return 0; } - virtual const glslang::TIntermAggregate* getAsAggregate() const { return 0; } - virtual const glslang::TIntermUnary* getAsUnaryNode() const { return 0; } - virtual const glslang::TIntermBinary* getAsBinaryNode() const { return 0; } - virtual const glslang::TIntermSelection* getAsSelectionNode() const { return 0; } - virtual const glslang::TIntermSwitch* getAsSwitchNode() const { return 0; } - virtual const glslang::TIntermMethod* getAsMethodNode() const { return 0; } - virtual const glslang::TIntermSymbol* getAsSymbolNode() const { return 0; } - virtual const glslang::TIntermBranch* getAsBranchNode() const { return 0; } - virtual const glslang::TIntermLoop* getAsLoopNode() const { return 0; } + virtual glslang::TIntermTyped* getAsTyped() { return nullptr; } + virtual glslang::TIntermOperator* getAsOperator() { return nullptr; } + virtual glslang::TIntermConstantUnion* getAsConstantUnion() { return nullptr; } + virtual glslang::TIntermAggregate* getAsAggregate() { return nullptr; } + virtual glslang::TIntermUnary* getAsUnaryNode() { return nullptr; } + virtual glslang::TIntermBinary* getAsBinaryNode() { return nullptr; } + virtual glslang::TIntermSelection* getAsSelectionNode() { return nullptr; } + virtual glslang::TIntermSwitch* getAsSwitchNode() { return nullptr; } + virtual glslang::TIntermMethod* getAsMethodNode() { return nullptr; } + virtual glslang::TIntermSymbol* getAsSymbolNode() { return nullptr; } + virtual glslang::TIntermBranch* getAsBranchNode() { return nullptr; } + virtual glslang::TIntermLoop* getAsLoopNode() { return nullptr; } + + virtual const glslang::TIntermTyped* getAsTyped() const { return nullptr; } + virtual const glslang::TIntermOperator* getAsOperator() const { return nullptr; } + virtual const glslang::TIntermConstantUnion* getAsConstantUnion() const { return nullptr; } + virtual const glslang::TIntermAggregate* getAsAggregate() const { return nullptr; } + virtual const glslang::TIntermUnary* getAsUnaryNode() const { return nullptr; } + virtual const glslang::TIntermBinary* getAsBinaryNode() const { return nullptr; } + virtual const glslang::TIntermSelection* getAsSelectionNode() const { return nullptr; } + virtual const glslang::TIntermSwitch* getAsSwitchNode() const { return nullptr; } + virtual const glslang::TIntermMethod* getAsMethodNode() const { return nullptr; } + virtual const glslang::TIntermSymbol* getAsSymbolNode() const { return nullptr; } + virtual const glslang::TIntermBranch* getAsBranchNode() const { return nullptr; } + virtual const glslang::TIntermLoop* getAsLoopNode() const { return nullptr; } virtual ~TIntermNode() { } protected: @@ -1274,9 +1332,11 @@ class TIntermMethod : public TIntermTyped { virtual const TString& getMethodName() const { return method; } virtual TIntermTyped* getObject() const { return object; } virtual void traverse(TIntermTraverser*); + void setExport() { linkType = ELinkExport; } protected: TIntermTyped* object; TString method; + TLinkType linkType; }; // @@ -1288,12 +1348,7 @@ class TIntermSymbol : public TIntermTyped { // per process threadPoolAllocator, then it causes increased memory usage per compile // it is essential to use "symbol = sym" to assign to symbol TIntermSymbol(long long i, const TString& n, const TType& t) - : TIntermTyped(t), id(i), -#ifndef GLSLANG_WEB - flattenSubset(-1), -#endif - constSubtree(nullptr) - { name = n; } + : TIntermTyped(t), id(i), flattenSubset(-1), constSubtree(nullptr) { name = n; } virtual long long getId() const { return id; } virtual void changeId(long long i) { id = i; } virtual const TString& getName() const { return name; } @@ -1304,12 +1359,10 @@ class TIntermSymbol : public TIntermTyped { const TConstUnionArray& getConstArray() const { return constArray; } void setConstSubtree(TIntermTyped* subtree) { constSubtree = subtree; } TIntermTyped* getConstSubtree() const { return constSubtree; } -#ifndef GLSLANG_WEB void setFlattenSubset(int subset) { flattenSubset = subset; } virtual const TString& getAccessName() const; int getFlattenSubset() const { return flattenSubset; } // -1 means full object -#endif // This is meant for cases where a node has already been constructed, and // later on, it becomes necessary to switch to a different symbol. @@ -1317,9 +1370,7 @@ class TIntermSymbol : public TIntermTyped { protected: long long id; // the unique id of the symbol this node represents -#ifndef GLSLANG_WEB int flattenSubset; // how deeply the flattened object rooted at id has been dereferenced -#endif TString name; // the name of the symbol this node represents TConstUnionArray constArray; // if the symbol is a front-end compile-time constant, this is its value TIntermTyped* constSubtree; @@ -1358,6 +1409,7 @@ struct TCrackedTextureOp { bool subpass; bool lodClamp; bool fragMask; + bool attachmentEXT; }; // @@ -1373,19 +1425,11 @@ class TIntermOperator : public TIntermTyped { bool isConstructor() const; bool isTexture() const { return op > EOpTextureGuardBegin && op < EOpTextureGuardEnd; } bool isSampling() const { return op > EOpSamplingGuardBegin && op < EOpSamplingGuardEnd; } -#ifdef GLSLANG_WEB - bool isImage() const { return false; } - bool isSparseTexture() const { return false; } - bool isImageFootprint() const { return false; } - bool isSparseImage() const { return false; } - bool isSubgroup() const { return false; } -#else bool isImage() const { return op > EOpImageGuardBegin && op < EOpImageGuardEnd; } bool isSparseTexture() const { return op > EOpSparseTextureGuardBegin && op < EOpSparseTextureGuardEnd; } bool isImageFootprint() const { return op > EOpImageFootprintGuardBegin && op < EOpImageFootprintGuardEnd; } bool isSparseImage() const { return op == EOpSparseImageLoad; } bool isSubgroup() const { return op > EOpSubgroupGuardStart && op < EOpSubgroupGuardStop; } -#endif void setOperationPrecision(TPrecisionQualifier p) { operationPrecision = p; } TPrecisionQualifier getOperationPrecision() const { return operationPrecision != EpqNone ? @@ -1414,6 +1458,7 @@ class TIntermOperator : public TIntermTyped { cracked.gather = false; cracked.grad = false; cracked.subpass = false; + cracked.attachmentEXT = false; cracked.lodClamp = false; cracked.fragMask = false; @@ -1490,7 +1535,6 @@ class TIntermOperator : public TIntermTyped { cracked.offset = true; cracked.proj = true; break; -#ifndef GLSLANG_WEB case EOpTextureClamp: case EOpSparseTextureClamp: cracked.lodClamp = true; @@ -1574,7 +1618,9 @@ class TIntermOperator : public TIntermTyped { case EOpSubpassLoadMS: cracked.subpass = true; break; -#endif + case EOpColorAttachmentReadEXT: + cracked.attachmentEXT = true; + break; default: break; } @@ -1616,8 +1662,8 @@ class TIntermBinary : public TIntermOperator { // class TIntermUnary : public TIntermOperator { public: - TIntermUnary(TOperator o, TType& t) : TIntermOperator(o, t), operand(0) {} - TIntermUnary(TOperator o) : TIntermOperator(o), operand(0) {} + TIntermUnary(TOperator o, TType& t) : TIntermOperator(o, t), operand(nullptr) {} + TIntermUnary(TOperator o) : TIntermOperator(o), operand(nullptr) {} virtual void traverse(TIntermTraverser*); virtual void setOperand(TIntermTyped* o) { operand = o; } virtual TIntermTyped* getOperand() { return operand; } @@ -1625,15 +1671,11 @@ class TIntermUnary : public TIntermOperator { virtual TIntermUnary* getAsUnaryNode() { return this; } virtual const TIntermUnary* getAsUnaryNode() const { return this; } virtual void updatePrecision(); -#ifndef GLSLANG_WEB void setSpirvInstruction(const TSpirvInstruction& inst) { spirvInst = inst; } const TSpirvInstruction& getSpirvInstruction() const { return spirvInst; } -#endif protected: TIntermTyped* operand; -#ifndef GLSLANG_WEB TSpirvInstruction spirvInst; -#endif }; typedef TVector TIntermSequence; @@ -1665,10 +1707,11 @@ class TIntermAggregate : public TIntermOperator { bool getDebug() const { return debug; } void setPragmaTable(const TPragmaTable& pTable); const TPragmaTable& getPragmaTable() const { return *pragmaTable; } -#ifndef GLSLANG_WEB void setSpirvInstruction(const TSpirvInstruction& inst) { spirvInst = inst; } const TSpirvInstruction& getSpirvInstruction() const { return spirvInst; } -#endif + + void setLinkType(TLinkType l) { linkType = l; } + TLinkType getLinkType() const { return linkType; } protected: TIntermAggregate(const TIntermAggregate&); // disallow copy constructor TIntermAggregate& operator=(const TIntermAggregate&); // disallow assignment operator @@ -1679,9 +1722,8 @@ class TIntermAggregate : public TIntermOperator { bool optimize; bool debug; TPragmaTable* pragmaTable; -#ifndef GLSLANG_WEB TSpirvInstruction spirvInst; -#endif + TLinkType linkType = ELinkNone; }; // @@ -1819,7 +1861,7 @@ class TIntermTraverser { TIntermNode *getParentNode() { - return path.size() == 0 ? NULL : path.back(); + return path.size() == 0 ? nullptr : path.back(); } const bool preVisit; diff --git a/third_party/glslang/glslang/MachineIndependent/Constant.cpp b/third_party/glslang/glslang/MachineIndependent/Constant.cpp index 5fc61dbb791..8acf9e5526d 100644 --- a/third_party/glslang/glslang/MachineIndependent/Constant.cpp +++ b/third_party/glslang/glslang/MachineIndependent/Constant.cpp @@ -177,7 +177,6 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TIntermTyped* right newConstArray[i].setUConst(leftUnionArray[i].getUConst() / rightUnionArray[i].getUConst()); break; -#ifndef GLSLANG_WEB case EbtInt8: if (rightUnionArray[i] == (signed char)0) newConstArray[i].setI8Const((signed char)0x7F); @@ -212,9 +211,9 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TIntermTyped* right case EbtInt64: if (rightUnionArray[i] == 0ll) - newConstArray[i].setI64Const(0x7FFFFFFFFFFFFFFFll); - else if (rightUnionArray[i].getI64Const() == -1 && leftUnionArray[i].getI64Const() == (long long)-0x8000000000000000ll) - newConstArray[i].setI64Const((long long)-0x8000000000000000ll); + newConstArray[i].setI64Const(LLONG_MAX); + else if (rightUnionArray[i].getI64Const() == -1 && leftUnionArray[i].getI64Const() == LLONG_MIN) + newConstArray[i].setI64Const(LLONG_MIN); else newConstArray[i].setI64Const(leftUnionArray[i].getI64Const() / rightUnionArray[i].getI64Const()); break; @@ -226,8 +225,7 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TIntermTyped* right newConstArray[i].setU64Const(leftUnionArray[i].getU64Const() / rightUnionArray[i].getU64Const()); break; default: - return 0; -#endif + return nullptr; } } break; @@ -266,7 +264,6 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TIntermTyped* right newConstArray[i].setIConst(0); break; } else goto modulo_default; -#ifndef GLSLANG_WEB case EbtInt64: if (rightUnionArray[i].getI64Const() == -1 && leftUnionArray[i].getI64Const() == LLONG_MIN) { newConstArray[i].setI64Const(0); @@ -277,7 +274,6 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TIntermTyped* right newConstArray[i].setIConst(0); break; } else goto modulo_default; -#endif default: modulo_default: newConstArray[i] = leftUnionArray[i] % rightUnionArray[i]; @@ -354,7 +350,7 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TIntermTyped* right break; default: - return 0; + return nullptr; } TIntermConstantUnion *newNode = new TIntermConstantUnion(newConstArray, returnType); @@ -507,14 +503,12 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType) : -unionArray[i].getIConst()); break; case EbtUint: newConstArray[i].setUConst(static_cast(-static_cast(unionArray[i].getUConst()))); break; -#ifndef GLSLANG_WEB case EbtInt8: newConstArray[i].setI8Const(-unionArray[i].getI8Const()); break; case EbtUint8: newConstArray[i].setU8Const(static_cast(-static_cast(unionArray[i].getU8Const()))); break; case EbtInt16: newConstArray[i].setI16Const(-unionArray[i].getI16Const()); break; case EbtUint16:newConstArray[i].setU16Const(static_cast(-static_cast(unionArray[i].getU16Const()))); break; case EbtInt64: newConstArray[i].setI64Const(-unionArray[i].getI64Const()); break; case EbtUint64: newConstArray[i].setU64Const(static_cast(-static_cast(unionArray[i].getU64Const()))); break; -#endif default: return nullptr; } @@ -684,7 +678,6 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType) case EOpConvDoubleToInt: newConstArray[i].setIConst(static_cast(unionArray[i].getDConst())); break; -#ifndef GLSLANG_WEB case EOpConvInt8ToBool: newConstArray[i].setBConst(unionArray[i].getI8Const() != 0); break; case EOpConvUint8ToBool: @@ -919,7 +912,6 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType) case EOpConvUint64ToPtr: case EOpConstructReference: newConstArray[i].setU64Const(unionArray[i].getU64Const()); break; -#endif // TODO: 3.0 Functionality: unary constant folding: the rest of the ops have to be fleshed out @@ -1066,7 +1058,6 @@ TIntermTyped* TIntermediate::fold(TIntermAggregate* aggrNode) case EbtUint: newConstArray[comp].setUConst(std::min(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst())); break; -#ifndef GLSLANG_WEB case EbtInt8: newConstArray[comp].setI8Const(std::min(childConstUnions[0][arg0comp].getI8Const(), childConstUnions[1][arg1comp].getI8Const())); break; @@ -1085,7 +1076,6 @@ TIntermTyped* TIntermediate::fold(TIntermAggregate* aggrNode) case EbtUint64: newConstArray[comp].setU64Const(std::min(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const())); break; -#endif default: assert(false && "Default missing"); } break; @@ -1102,7 +1092,6 @@ TIntermTyped* TIntermediate::fold(TIntermAggregate* aggrNode) case EbtUint: newConstArray[comp].setUConst(std::max(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst())); break; -#ifndef GLSLANG_WEB case EbtInt8: newConstArray[comp].setI8Const(std::max(childConstUnions[0][arg0comp].getI8Const(), childConstUnions[1][arg1comp].getI8Const())); break; @@ -1121,7 +1110,6 @@ TIntermTyped* TIntermediate::fold(TIntermAggregate* aggrNode) case EbtUint64: newConstArray[comp].setU64Const(std::max(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const())); break; -#endif default: assert(false && "Default missing"); } break; @@ -1137,7 +1125,6 @@ TIntermTyped* TIntermediate::fold(TIntermAggregate* aggrNode) newConstArray[comp].setUConst(std::min(std::max(childConstUnions[0][arg0comp].getUConst(), childConstUnions[1][arg1comp].getUConst()), childConstUnions[2][arg2comp].getUConst())); break; -#ifndef GLSLANG_WEB case EbtInt8: newConstArray[comp].setI8Const(std::min(std::max(childConstUnions[0][arg0comp].getI8Const(), childConstUnions[1][arg1comp].getI8Const()), childConstUnions[2][arg2comp].getI8Const())); @@ -1166,7 +1153,6 @@ TIntermTyped* TIntermediate::fold(TIntermAggregate* aggrNode) newConstArray[comp].setU64Const(std::min(std::max(childConstUnions[0][arg0comp].getU64Const(), childConstUnions[1][arg1comp].getU64Const()), childConstUnions[2][arg2comp].getU64Const())); break; -#endif default: assert(false && "Default missing"); } break; @@ -1345,7 +1331,7 @@ TIntermTyped* TIntermediate::foldDereference(TIntermTyped* node, int index, cons { TType dereferencedType(node->getType(), index); dereferencedType.getQualifier().storage = EvqConst; - TIntermTyped* result = 0; + TIntermTyped* result = nullptr; int size = dereferencedType.computeNumComponents(); // arrays, vectors, matrices, all use simple multiplicative math @@ -1365,7 +1351,7 @@ TIntermTyped* TIntermediate::foldDereference(TIntermTyped* node, int index, cons result = addConstantUnion(TConstUnionArray(node->getAsConstantUnion()->getConstArray(), start, size), node->getType(), loc); - if (result == 0) + if (result == nullptr) result = node; else result->setType(dereferencedType); @@ -1387,7 +1373,7 @@ TIntermTyped* TIntermediate::foldSwizzle(TIntermTyped* node, TSwizzleSelectorsgetType(), loc); - if (result == 0) + if (result == nullptr) result = node; else result->setType(TType(node->getBasicType(), EvqConst, selectors.size())); diff --git a/third_party/glslang/glslang/MachineIndependent/Initialize.cpp b/third_party/glslang/glslang/MachineIndependent/Initialize.cpp index 35681a5f55c..8d5ce9af8c3 100644 --- a/third_party/glslang/glslang/MachineIndependent/Initialize.cpp +++ b/third_party/glslang/glslang/MachineIndependent/Initialize.cpp @@ -51,7 +51,6 @@ // including identifying what extensions are needed if a version does not allow a symbol // -#include "../Include/intermediate.h" #include "Initialize.h" namespace glslang { @@ -61,10 +60,6 @@ const bool ARBCompatibility = true; const bool ForwardCompatibility = false; -// change this back to false if depending on textual spellings of texturing calls when consuming the AST -// Using PureOperatorBuiltins=false is deprecated. -bool PureOperatorBuiltins = true; - namespace { // @@ -144,14 +139,6 @@ struct Versioning { EProfile EDesktopProfile = static_cast(ENoProfile | ECoreProfile | ECompatibilityProfile); // Declare pointers to put into the table for versioning. -#ifdef GLSLANG_WEB - const Versioning* Es300Desktop130 = nullptr; - const Versioning* Es310Desktop420 = nullptr; -#elif defined(GLSLANG_ANGLE) - const Versioning* Es300Desktop130 = nullptr; - const Versioning* Es310Desktop420 = nullptr; - const Versioning* Es310Desktop450 = nullptr; -#else const Versioning Es300Desktop130Version[] = { { EEsProfile, 0, 300, 0, nullptr }, { EDesktopProfile, 0, 130, 0, nullptr }, { EBadProfile } }; @@ -166,7 +153,6 @@ EProfile EDesktopProfile = static_cast(ENoProfile | ECoreProfile | ECo { EDesktopProfile, 0, 450, 0, nullptr }, { EBadProfile } }; const Versioning* Es310Desktop450 = &Es310Desktop450Version[0]; -#endif // The main descriptor of what a set of function prototypes can look like, and // a pointer to extra versioning information, when needed. @@ -268,10 +254,8 @@ const BuiltInFunction BaseFunctions[] = { { EOpAtomicXor, "atomicXor", 2, TypeIU, ClassV1FIOCV, Es310Desktop420 }, { EOpAtomicExchange, "atomicExchange", 2, TypeIU, ClassV1FIOCV, Es310Desktop420 }, { EOpAtomicCompSwap, "atomicCompSwap", 3, TypeIU, ClassV1FIOCV, Es310Desktop420 }, -#ifndef GLSLANG_WEB { EOpMix, "mix", 3, TypeB, ClassRegular, Es310Desktop450 }, { EOpMix, "mix", 3, TypeIU, ClassLB, Es310Desktop450 }, -#endif { EOpNull } }; @@ -390,10 +374,8 @@ void AddTabledBuiltin(TString& decls, const BuiltInFunction& function) if (arg == function.numArguments - 1 && (function.classes & ClassLO)) decls.append("out "); if (arg == 0) { -#ifndef GLSLANG_WEB if (function.classes & ClassCV) decls.append("coherent volatile "); -#endif if (function.classes & ClassFIO) decls.append("inout "); if (function.classes & ClassFO) @@ -420,11 +402,6 @@ void AddTabledBuiltin(TString& decls, const BuiltInFunction& function) // See if the tabled versioning information allows the current version. bool ValidVersion(const BuiltInFunction& function, int version, EProfile profile, const SpvVersion& /* spVersion */) { -#if defined(GLSLANG_WEB) || defined(GLSLANG_ANGLE) - // all entries in table are valid - return true; -#endif - // nullptr means always valid if (function.versioning == nullptr) return true; @@ -505,7 +482,6 @@ TBuiltIns::TBuiltIns() prefixes[EbtFloat] = ""; prefixes[EbtInt] = "i"; prefixes[EbtUint] = "u"; -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) prefixes[EbtFloat16] = "f16"; prefixes[EbtInt8] = "i8"; prefixes[EbtUint8] = "u8"; @@ -513,7 +489,6 @@ TBuiltIns::TBuiltIns() prefixes[EbtUint16] = "u16"; prefixes[EbtInt64] = "i64"; prefixes[EbtUint64] = "u64"; -#endif postfixes[2] = "2"; postfixes[3] = "3"; @@ -523,14 +498,11 @@ TBuiltIns::TBuiltIns() dimMap[Esd2D] = 2; dimMap[Esd3D] = 3; dimMap[EsdCube] = 3; -#ifndef GLSLANG_WEB -#ifndef GLSLANG_ANGLE dimMap[Esd1D] = 1; -#endif dimMap[EsdRect] = 2; dimMap[EsdBuffer] = 1; dimMap[EsdSubpass] = 2; // potentially unused for now -#endif + dimMap[EsdAttachmentEXT] = 2; // potentially unused for now } TBuiltIns::~TBuiltIns() @@ -548,13 +520,6 @@ TBuiltIns::~TBuiltIns() // void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvVersion) { -#ifdef GLSLANG_WEB - version = 310; - profile = EEsProfile; -#elif defined(GLSLANG_ANGLE) - version = 450; - profile = ECoreProfile; -#endif addTabledBuiltins(version, profile, spvVersion); //============================================================================ @@ -563,7 +528,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV // //============================================================================ -#ifndef GLSLANG_WEB // // Derivatives Functions. // @@ -599,7 +563,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "vec4 fwidthCoarse(vec4 p);" ); -#ifndef GLSLANG_ANGLE TString derivativesAndControl16bits ( "float16_t dFdx(float16_t);" "f16vec2 dFdx(f16vec2);" @@ -1393,7 +1356,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n" ); } -#endif // !GLSLANG_ANGLE if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 430)) { @@ -1431,7 +1393,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#ifndef GLSLANG_ANGLE if (profile != EEsProfile && version >= 440) { commonBuiltins.append( "uint64_t atomicMin(coherent volatile inout uint64_t, uint64_t);" @@ -1511,8 +1472,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "void atomicStore(coherent volatile out double, double, int, int, int);" "\n"); } -#endif // !GLSLANG_ANGLE -#endif // !GLSLANG_WEB if ((profile == EEsProfile && version >= 300) || (profile != EEsProfile && version >= 150)) { // GL_ARB_shader_bit_encoding @@ -1540,7 +1499,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#ifndef GLSLANG_WEB if ((profile != EEsProfile && version >= 400) || (profile == EEsProfile && version >= 310)) { // GL_OES_gpu_shader5 @@ -1552,7 +1510,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#ifndef GLSLANG_ANGLE if (profile != EEsProfile && version >= 150) { // ARB_gpu_shader_fp64 commonBuiltins.append( "double fma(double, double, double);" @@ -1570,7 +1527,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "f64vec4 fma(f64vec4, f64vec4, f64vec4 );" "\n"); } -#endif if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 400)) { @@ -1588,7 +1544,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#ifndef GLSLANG_ANGLE if (profile != EEsProfile && version >= 150) { // ARB_gpu_shader_fp64 commonBuiltins.append( "double frexp(double, out int);" @@ -1621,8 +1576,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#endif -#endif if ((profile == EEsProfile && version >= 300) || (profile != EEsProfile && version >= 150)) { @@ -1651,7 +1604,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#ifndef GLSLANG_WEB if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 150)) { commonBuiltins.append( @@ -1671,7 +1623,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "vec4 unpackUnorm4x8(highp uint);" "\n"); } -#endif // // Matrix Functions. @@ -1730,8 +1681,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV } } -#ifndef GLSLANG_WEB -#ifndef GLSLANG_ANGLE // // Original-style texture functions existing in all stages. // (Per-stage functions below.) @@ -1926,7 +1875,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } } -#endif // !GLSLANG_ANGLE // Bitfield if ((profile == EEsProfile && version >= 310) || @@ -2069,7 +2017,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#ifndef GLSLANG_ANGLE // GL_ARB_shader_ballot if (profile != EEsProfile && version >= 450) { commonBuiltins.append( @@ -3390,7 +3337,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "bool textureFootprintGradClampNV(sampler2D, vec2, vec2, vec2, float, int, bool, out gl_TextureFootprint2DNV);" "\n"); } -#endif // !GLSLANG_ANGLE if ((profile == EEsProfile && version >= 300 && version < 310) || (profile != EEsProfile && version >= 150 && version < 450)) { // GL_EXT_shader_integer_mix @@ -3410,7 +3356,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#ifndef GLSLANG_ANGLE // GL_AMD_gpu_shader_half_float/Explicit types if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 310)) { commonBuiltins.append( @@ -4163,6 +4108,19 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } + // Builtins for GL_EXT_texture_shadow_lod + if ((profile == EEsProfile && version >= 300) || ((profile != EEsProfile && version >= 130))) { + commonBuiltins.append( + "float texture(sampler2DArrayShadow, vec4, float);" + "float texture(samplerCubeArrayShadow, vec4, float, float);" + "float textureLod(sampler2DArrayShadow, vec4, float);" + "float textureLod(samplerCubeShadow, vec4, float);" + "float textureLod(samplerCubeArrayShadow, vec4, float, float);" + "float textureLodOffset(sampler2DArrayShadow, vec4, float, ivec2);" + "float textureOffset(sampler2DArrayShadow, vec4 , ivec2, float);" + "\n"); + } + if (profile != EEsProfile && version >= 450) { stageBuiltins[EShLangFragment].append(derivativesAndControl64bits); stageBuiltins[EShLangFragment].append( @@ -4184,7 +4142,18 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#endif // !GLSLANG_ANGLE + + // QCOM_image_processing + if ((profile == EEsProfile && version >= 310) || + (profile != EEsProfile && version >= 140)) { + commonBuiltins.append( + "vec4 textureWeightedQCOM(sampler2D, vec2, sampler2DArray);" + "vec4 textureWeightedQCOM(sampler2D, vec2, sampler1DArray);" + "vec4 textureBoxFilterQCOM(sampler2D, vec2, vec2);" + "vec4 textureBlockMatchSADQCOM(sampler2D, uvec2, sampler2D, uvec2, uvec2);" + "vec4 textureBlockMatchSSDQCOM(sampler2D, uvec2, sampler2D, uvec2, uvec2);" + "\n"); + } //============================================================================ // @@ -4200,7 +4169,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV if (spvVersion.vulkan == 0 && IncludeLegacy(version, profile, spvVersion)) stageBuiltins[EShLangVertex].append("vec4 ftransform();"); -#ifndef GLSLANG_ANGLE // // Original-style texture Functions with lod. // @@ -4260,7 +4228,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } } -#endif // !GLSLANG_ANGLE if ((profile != EEsProfile && version >= 150) || (profile == EEsProfile && version >= 310)) { @@ -4281,7 +4248,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "void EndPrimitive();" "\n"); } -#endif // !GLSLANG_WEB //============================================================================ // @@ -4318,7 +4284,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "void groupMemoryBarrier();" ); } -#ifndef GLSLANG_WEB if ((profile != EEsProfile && version >= 420) || esBarrier) { if (spvVersion.vulkan == 0 || spvVersion.vulkanRelaxed) { commonBuiltins.append("void memoryBarrierAtomicCounter();"); @@ -4341,7 +4306,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV commonBuiltins.append("void debugPrintfEXT();\n"); -#ifndef GLSLANG_ANGLE if (profile != EEsProfile && version >= 450) { // coopMatStoreNV perhaps ought to have "out" on the buf parameter, but // adding it introduces undesirable tempArgs on the stack. What we want @@ -4422,6 +4386,94 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "icoopmatNV coopMatMulAddNV(icoopmatNV A, icoopmatNV B, icoopmatNV C);\n" "ucoopmatNV coopMatMulAddNV(ucoopmatNV A, ucoopmatNV B, ucoopmatNV C);\n" ); + + std::string cooperativeMatrixFuncs = + "void coopMatLoad(out coopmat m, volatile coherent int8_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent int16_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent int32_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent int64_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent uint8_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent uint16_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent uint32_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent uint64_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent float16_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent float[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent float64_t[] buf, uint element, uint stride, int matrixLayout);\n" + + "void coopMatLoad(out coopmat m, volatile coherent i8vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent i16vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent i32vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent i64vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent u8vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent u16vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent u32vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent u64vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent f16vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent f32vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent f64vec2[] buf, uint element, uint stride, int matrixLayout);\n" + + "void coopMatLoad(out coopmat m, volatile coherent i8vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent i16vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent i32vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent i64vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent u8vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent u16vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent u32vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent u64vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent f16vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent f32vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatLoad(out coopmat m, volatile coherent f64vec4[] buf, uint element, uint stride, int matrixLayout);\n" + + "void coopMatStore(coopmat m, volatile coherent int8_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent int16_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent int32_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent int64_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent uint8_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent uint16_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent uint32_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent uint64_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent float16_t[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent float[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent float64_t[] buf, uint element, uint stride, int matrixLayout);\n" + + "void coopMatStore(coopmat m, volatile coherent i8vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent i16vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent i32vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent i64vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent u8vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent u16vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent u32vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent u64vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent f16vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent f32vec2[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent f64vec2[] buf, uint element, uint stride, int matrixLayout);\n" + + "void coopMatStore(coopmat m, volatile coherent i8vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent i16vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent i32vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent i64vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent u8vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent u16vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent u32vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent u64vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent f16vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent f32vec4[] buf, uint element, uint stride, int matrixLayout);\n" + "void coopMatStore(coopmat m, volatile coherent f64vec4[] buf, uint element, uint stride, int matrixLayout);\n" + + "coopmat coopMatMulAdd(coopmat A, coopmat B, coopmat C);\n" + "coopmat coopMatMulAdd(coopmat A, coopmat B, coopmat C, int matrixOperands);\n"; + + commonBuiltins.append(cooperativeMatrixFuncs.c_str()); + + commonBuiltins.append( + "const int gl_MatrixUseA = 0;\n" + "const int gl_MatrixUseB = 1;\n" + "const int gl_MatrixUseAccumulator = 2;\n" + "const int gl_MatrixOperandsSaturatingAccumulation = 0x10;\n" + "const int gl_CooperativeMatrixLayoutRowMajor = 0;\n" + "const int gl_CooperativeMatrixLayoutColumnMajor = 1;\n" + "\n" + ); } //============================================================================ @@ -4465,7 +4517,24 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#endif // !GLSLANG_ANGLE + + // GL_EXT_shader_tile_image + if (spvVersion.vulkan > 0) { + stageBuiltins[EShLangFragment].append( + "lowp uint stencilAttachmentReadEXT();" + "lowp uint stencilAttachmentReadEXT(int);" + "highp float depthAttachmentReadEXT();" + "highp float depthAttachmentReadEXT(int);" + "\n"); + stageBuiltins[EShLangFragment].append( + "vec4 colorAttachmentReadEXT(attachmentEXT);" + "vec4 colorAttachmentReadEXT(attachmentEXT, int);" + "ivec4 colorAttachmentReadEXT(iattachmentEXT);" + "ivec4 colorAttachmentReadEXT(iattachmentEXT, int);" + "uvec4 colorAttachmentReadEXT(uattachmentEXT);" + "uvec4 colorAttachmentReadEXT(uattachmentEXT, int);" + "\n"); + } // GL_ARB_derivative_control if (profile != EEsProfile && version >= 400) { @@ -4503,7 +4572,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "bool helperInvocationEXT();" "\n"); -#ifndef GLSLANG_ANGLE // GL_AMD_shader_explicit_vertex_parameter if (profile != EEsProfile && version >= 450) { stageBuiltins[EShLangFragment].append( @@ -4576,9 +4644,10 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "uvec4 fragmentFetchAMD(usubpassInputMS, uint);" "\n"); - } + } - // Builtins for GL_NV_ray_tracing/GL_NV_ray_tracing_motion_blur/GL_EXT_ray_tracing/GL_EXT_ray_query + // Builtins for GL_NV_ray_tracing/GL_NV_ray_tracing_motion_blur/GL_EXT_ray_tracing/GL_EXT_ray_query/ + // GL_NV_shader_invocation_reorder/GL_KHR_ray_tracing_position_Fetch if (profile != EEsProfile && version >= 460) { commonBuiltins.append("void rayQueryInitializeEXT(rayQueryEXT, accelerationStructureEXT, uint, uint, vec3, float, vec3, float);" "void rayQueryTerminateEXT(rayQueryEXT);" @@ -4603,6 +4672,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "vec3 rayQueryGetIntersectionObjectRayOriginEXT(rayQueryEXT, bool);" "mat4x3 rayQueryGetIntersectionObjectToWorldEXT(rayQueryEXT, bool);" "mat4x3 rayQueryGetIntersectionWorldToObjectEXT(rayQueryEXT, bool);" + "void rayQueryGetIntersectionTriangleVertexPositionsEXT(rayQueryEXT, bool, out vec3[3]);" "\n"); stageBuiltins[EShLangRayGen].append( @@ -4611,6 +4681,41 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "void traceRayEXT(accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" "void executeCallableNV(uint, int);" "void executeCallableEXT(uint, int);" + "void hitObjectTraceRayNV(hitObjectNV,accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" + "void hitObjectTraceRayMotionNV(hitObjectNV,accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,float,int);" + "void hitObjectRecordHitNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,uint,vec3,float,vec3,float,int);" + "void hitObjectRecordHitMotionNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,uint,vec3,float,vec3,float,float,int);" + "void hitObjectRecordHitWithIndexNV(hitObjectNV, accelerationStructureEXT,int,int,int,uint,uint,vec3,float,vec3,float,int);" + "void hitObjectRecordHitWithIndexMotionNV(hitObjectNV, accelerationStructureEXT,int,int,int,uint,uint,vec3,float,vec3,float,float,int);" + "void hitObjectRecordMissNV(hitObjectNV,uint,vec3,float,vec3,float);" + "void hitObjectRecordMissMotionNV(hitObjectNV,uint,vec3,float,vec3,float,float);" + "void hitObjectRecordEmptyNV(hitObjectNV);" + "void hitObjectExecuteShaderNV(hitObjectNV,int);" + "bool hitObjectIsEmptyNV(hitObjectNV);" + "bool hitObjectIsMissNV(hitObjectNV);" + "bool hitObjectIsHitNV(hitObjectNV);" + "float hitObjectGetRayTMinNV(hitObjectNV);" + "float hitObjectGetRayTMaxNV(hitObjectNV);" + "vec3 hitObjectGetWorldRayOriginNV(hitObjectNV);" + "vec3 hitObjectGetWorldRayDirectionNV(hitObjectNV);" + "vec3 hitObjectGetObjectRayOriginNV(hitObjectNV);" + "vec3 hitObjectGetObjectRayDirectionNV(hitObjectNV);" + "mat4x3 hitObjectGetWorldToObjectNV(hitObjectNV);" + "mat4x3 hitObjectGetObjectToWorldNV(hitObjectNV);" + "int hitObjectGetInstanceCustomIndexNV(hitObjectNV);" + "int hitObjectGetInstanceIdNV(hitObjectNV);" + "int hitObjectGetGeometryIndexNV(hitObjectNV);" + "int hitObjectGetPrimitiveIndexNV(hitObjectNV);" + "uint hitObjectGetHitKindNV(hitObjectNV);" + "void hitObjectGetAttributesNV(hitObjectNV,int);" + "float hitObjectGetCurrentTimeNV(hitObjectNV);" + "uint hitObjectGetShaderBindingTableRecordIndexNV(hitObjectNV);" + "uvec2 hitObjectGetShaderRecordBufferHandleNV(hitObjectNV);" + "void reorderThreadNV(uint, uint);" + "void reorderThreadNV(hitObjectNV);" + "void reorderThreadNV(hitObjectNV, uint, uint);" + "vec3 fetchMicroTriangleVertexPositionNV(accelerationStructureEXT, int, int, int, ivec2);" + "vec2 fetchMicroTriangleVertexBarycentricNV(accelerationStructureEXT, int, int, int, ivec2);" "\n"); stageBuiltins[EShLangIntersect].append( "bool reportIntersectionNV(float, uint);" @@ -4626,6 +4731,36 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "void traceRayEXT(accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" "void executeCallableNV(uint, int);" "void executeCallableEXT(uint, int);" + "void hitObjectTraceRayNV(hitObjectNV,accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" + "void hitObjectTraceRayMotionNV(hitObjectNV,accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,float,int);" + "void hitObjectRecordHitNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,uint,vec3,float,vec3,float,int);" + "void hitObjectRecordHitMotionNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,uint,vec3,float,vec3,float,float,int);" + "void hitObjectRecordHitWithIndexNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,vec3,float,vec3,float,int);" + "void hitObjectRecordHitWithIndexMotionNV(hitObjectNV, accelerationStructureEXT,int,int,int,uint,uint,vec3,float,vec3,float,float,int);" + "void hitObjectRecordMissNV(hitObjectNV, uint, vec3, float, vec3, float);" + "void hitObjectRecordMissMotionNV(hitObjectNV,uint,vec3,float,vec3,float,float);" + "void hitObjectRecordEmptyNV(hitObjectNV);" + "void hitObjectExecuteShaderNV(hitObjectNV, int);" + "bool hitObjectIsEmptyNV(hitObjectNV);" + "bool hitObjectIsMissNV(hitObjectNV);" + "bool hitObjectIsHitNV(hitObjectNV);" + "float hitObjectGetRayTMinNV(hitObjectNV);" + "float hitObjectGetRayTMaxNV(hitObjectNV);" + "vec3 hitObjectGetWorldRayOriginNV(hitObjectNV);" + "vec3 hitObjectGetWorldRayDirectionNV(hitObjectNV);" + "vec3 hitObjectGetObjectRayOriginNV(hitObjectNV);" + "vec3 hitObjectGetObjectRayDirectionNV(hitObjectNV);" + "mat4x3 hitObjectGetWorldToObjectNV(hitObjectNV);" + "mat4x3 hitObjectGetObjectToWorldNV(hitObjectNV);" + "int hitObjectGetInstanceCustomIndexNV(hitObjectNV);" + "int hitObjectGetInstanceIdNV(hitObjectNV);" + "int hitObjectGetGeometryIndexNV(hitObjectNV);" + "int hitObjectGetPrimitiveIndexNV(hitObjectNV);" + "uint hitObjectGetHitKindNV(hitObjectNV);" + "void hitObjectGetAttributesNV(hitObjectNV,int);" + "float hitObjectGetCurrentTimeNV(hitObjectNV);" + "uint hitObjectGetShaderBindingTableRecordIndexNV(hitObjectNV);" + "uvec2 hitObjectGetShaderRecordBufferHandleNV(hitObjectNV);" "\n"); stageBuiltins[EShLangMiss].append( "void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" @@ -4633,20 +4768,48 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "void traceRayEXT(accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" "void executeCallableNV(uint, int);" "void executeCallableEXT(uint, int);" + "void hitObjectTraceRayNV(hitObjectNV,accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" + "void hitObjectTraceRayMotionNV(hitObjectNV,accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,float,int);" + "void hitObjectRecordHitNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,uint,vec3,float,vec3,float,int);" + "void hitObjectRecordHitMotionNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,uint,vec3,float,vec3,float,float,int);" + "void hitObjectRecordHitWithIndexNV(hitObjectNV,accelerationStructureEXT,int,int,int,uint,uint,vec3,float,vec3,float,int);" + "void hitObjectRecordHitWithIndexMotionNV(hitObjectNV, accelerationStructureEXT,int,int,int,uint,uint,vec3,float,vec3,float,float,int);" + "void hitObjectRecordMissNV(hitObjectNV, uint, vec3, float, vec3, float);" + "void hitObjectRecordMissMotionNV(hitObjectNV,uint,vec3,float,vec3,float,float);" + "void hitObjectRecordEmptyNV(hitObjectNV);" + "void hitObjectExecuteShaderNV(hitObjectNV, int);" + "bool hitObjectIsEmptyNV(hitObjectNV);" + "bool hitObjectIsMissNV(hitObjectNV);" + "bool hitObjectIsHitNV(hitObjectNV);" + "float hitObjectGetRayTMinNV(hitObjectNV);" + "float hitObjectGetRayTMaxNV(hitObjectNV);" + "vec3 hitObjectGetWorldRayOriginNV(hitObjectNV);" + "vec3 hitObjectGetWorldRayDirectionNV(hitObjectNV);" + "vec3 hitObjectGetObjectRayOriginNV(hitObjectNV);" + "vec3 hitObjectGetObjectRayDirectionNV(hitObjectNV);" + "mat4x3 hitObjectGetWorldToObjectNV(hitObjectNV);" + "mat4x3 hitObjectGetObjectToWorldNV(hitObjectNV);" + "int hitObjectGetInstanceCustomIndexNV(hitObjectNV);" + "int hitObjectGetInstanceIdNV(hitObjectNV);" + "int hitObjectGetGeometryIndexNV(hitObjectNV);" + "int hitObjectGetPrimitiveIndexNV(hitObjectNV);" + "uint hitObjectGetHitKindNV(hitObjectNV);" + "void hitObjectGetAttributesNV(hitObjectNV,int);" + "float hitObjectGetCurrentTimeNV(hitObjectNV);" + "uint hitObjectGetShaderBindingTableRecordIndexNV(hitObjectNV);" + "uvec2 hitObjectGetShaderRecordBufferHandleNV(hitObjectNV);" "\n"); stageBuiltins[EShLangCallable].append( "void executeCallableNV(uint, int);" "void executeCallableEXT(uint, int);" "\n"); } -#endif // !GLSLANG_ANGLE //E_SPV_NV_compute_shader_derivatives if ((profile == EEsProfile && version >= 320) || (profile != EEsProfile && version >= 450)) { stageBuiltins[EShLangCompute].append(derivativeControls); stageBuiltins[EShLangCompute].append("\n"); } -#ifndef GLSLANG_ANGLE if (profile != EEsProfile && version >= 450) { stageBuiltins[EShLangCompute].append(derivativesAndControl16bits); stageBuiltins[EShLangCompute].append(derivativesAndControl64bits); @@ -4670,8 +4833,20 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "void SetMeshOutputsEXT(uint, uint);" "\n"); } -#endif // !GLSLANG_ANGLE -#endif // !GLSLANG_WEB + // Builtins for GL_NV_displacement_micromap + if ((profile != EEsProfile && version >= 460) || (profile == EEsProfile && version >= 320)) { + stageBuiltins[EShLangMesh].append( + "vec3 fetchMicroTriangleVertexPositionNV(accelerationStructureEXT, int, int, int, ivec2);" + "vec2 fetchMicroTriangleVertexBarycentricNV(accelerationStructureEXT, int, int, int, ivec2);" + "\n"); + + stageBuiltins[EShLangCompute].append( + "vec3 fetchMicroTriangleVertexPositionNV(accelerationStructureEXT, int, int, int, ivec2);" + "vec2 fetchMicroTriangleVertexBarycentricNV(accelerationStructureEXT, int, int, int, ivec2);" + "\n"); + + } + //============================================================================ // @@ -4693,13 +4868,11 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "highp float diff;" // f - n ); } else { -#ifndef GLSLANG_WEB commonBuiltins.append( "float near;" // n "float far;" // f "float diff;" // f - n ); -#endif } commonBuiltins.append( @@ -4708,7 +4881,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) if (spvVersion.spv == 0 && IncludeLegacy(version, profile, spvVersion)) { // // Matrix state. p. 31, 32, 37, 39, 40. @@ -4826,7 +4998,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#endif // !GLSLANG_WEB && !GLSLANG_ANGLE //============================================================================ // @@ -4856,8 +5027,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#ifndef GLSLANG_WEB -#ifndef GLSLANG_ANGLE //============================================================================ // // Define the interface to the mesh/task shader. @@ -4974,7 +5143,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } } -#endif // !GLSLANG_ANGLE //============================================================================ // @@ -5141,19 +5309,15 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "in highp int gl_InstanceID;" // needs qualifier fixed later ); if (spvVersion.vulkan > 0) -#endif stageBuiltins[EShLangVertex].append( "in highp int gl_VertexIndex;" "in highp int gl_InstanceIndex;" ); -#ifndef GLSLANG_WEB if (version < 310) -#endif stageBuiltins[EShLangVertex].append( "highp vec4 gl_Position;" // needs qualifier fixed later "highp float gl_PointSize;" // needs qualifier fixed later ); -#ifndef GLSLANG_WEB else stageBuiltins[EShLangVertex].append( "out gl_PerVertex {" @@ -5631,7 +5795,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "mediump vec2 gl_PointCoord;" // needs qualifier fixed later ); } -#endif if (version >= 300) { stageBuiltins[EShLangFragment].append( "highp vec4 gl_FragCoord;" // needs qualifier fixed later @@ -5640,7 +5803,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "highp float gl_FragDepth;" // needs qualifier fixed later ); } -#ifndef GLSLANG_WEB if (version >= 310) { stageBuiltins[EShLangFragment].append( "bool gl_HelperInvocation;" // needs qualifier fixed later @@ -5685,15 +5847,12 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "flat in highp int gl_ShadingRateEXT;" // GL_EXT_fragment_shading_rate ); } -#endif stageBuiltins[EShLangFragment].append("\n"); if (version >= 130) add2ndGenerationSamplingImaging(version, profile, spvVersion); -#ifndef GLSLANG_WEB - if ((profile != EEsProfile && version >= 140) || (profile == EEsProfile && version >= 310)) { stageBuiltins[EShLangFragment].append( @@ -5708,7 +5867,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } -#ifndef GLSLANG_ANGLE // GL_ARB_shader_ballot if (profile != EEsProfile && version >= 450) { const char* ballotDecls = @@ -5771,6 +5929,12 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "in highp uint gl_SMCountNV;" "in highp uint gl_WarpIDNV;" "in highp uint gl_SMIDNV;" + // GL_ARM_shader_core_builtins + "in highp uint gl_CoreIDARM;" + "in highp uint gl_CoreCountARM;" + "in highp uint gl_CoreMaxIDARM;" + "in highp uint gl_WarpIDARM;" + "in highp uint gl_WarpMaxIDARM;" "\n"; const char* fragmentSubgroupDecls = "flat in mediump uint gl_SubgroupSize;" @@ -5785,6 +5949,12 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "flat in highp uint gl_SMCountNV;" "flat in highp uint gl_WarpIDNV;" "flat in highp uint gl_SMIDNV;" + // GL_ARM_shader_core_builtins + "flat in highp uint gl_CoreIDARM;" + "flat in highp uint gl_CoreCountARM;" + "flat in highp uint gl_CoreMaxIDARM;" + "flat in highp uint gl_WarpIDARM;" + "flat in highp uint gl_WarpMaxIDARM;" "\n"; const char* computeSubgroupDecls = "in highp uint gl_NumSubgroups;" @@ -5804,6 +5974,12 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "in highp uint gl_SMCountNV;" "in highp volatile uint gl_WarpIDNV;" "in highp volatile uint gl_SMIDNV;" + // GL_ARM_shader_core_builtins + "in highp uint gl_CoreIDARM;" + "in highp uint gl_CoreCountARM;" + "in highp uint gl_CoreMaxIDARM;" + "in highp uint gl_WarpIDARM;" + "in highp uint gl_WarpMaxIDARM;" "\n"; stageBuiltins[EShLangVertex] .append(subgroupDecls); @@ -5850,8 +6026,11 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "const uint gl_RayFlagsCullNoOpaqueEXT = 128U;" "const uint gl_RayFlagsSkipTrianglesEXT = 256U;" "const uint gl_RayFlagsSkipAABBEXT = 512U;" + "const uint gl_RayFlagsForceOpacityMicromap2StateEXT = 1024U;" "const uint gl_HitKindFrontFacingTriangleEXT = 254U;" "const uint gl_HitKindBackFacingTriangleEXT = 255U;" + "in uint gl_HitKindFrontFacingMicroTriangleNV;" + "in uint gl_HitKindBackFacingMicroTriangleNV;" "\n"; const char *constRayQueryIntersection = @@ -5939,7 +6118,11 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "in uint gl_IncomingRayFlagsEXT;" "in float gl_CurrentRayTimeNV;" "in uint gl_CullMaskEXT;" + "in vec3 gl_HitTriangleVertexPositionsEXT[3];" + "in vec3 gl_HitMicroTriangleVertexPositionsNV[3];" + "in vec2 gl_HitMicroTriangleVertexBarycentricsNV[3];" "\n"; + const char *missDecls = "in uvec3 gl_LaunchIDNV;" "in uvec3 gl_LaunchIDEXT;" @@ -6066,9 +6249,6 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV } } } -#endif // !GLSLANG_ANGLE - -#endif // !GLSLANG_WEB // printf("%s\n", commonBuiltins.c_str()); // printf("%s\n", stageBuiltins[EShLangFragment].c_str()); @@ -6087,26 +6267,14 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c // enumerate all the types const TBasicType bTypes[] = { EbtFloat, EbtInt, EbtUint, -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - EbtFloat16 -#endif + EbtFloat16 }; -#ifdef GLSLANG_WEB - bool skipBuffer = true; - bool skipCubeArrayed = true; - const int image = 0; -#else bool skipBuffer = (profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 140); bool skipCubeArrayed = (profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 130); for (int image = 0; image <= 1; ++image) // loop over "bool" image vs sampler -#endif { for (int shadow = 0; shadow <= 1; ++shadow) { // loop over "bool" shadow or not -#ifdef GLSLANG_WEB - const int ms = 0; -#else for (int ms = 0; ms <= 1; ++ms) // loop over "bool" multisample or not -#endif { if ((ms || image) && shadow) continue; @@ -6118,14 +6286,9 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c continue; for (int arrayed = 0; arrayed <= 1; ++arrayed) { // loop over "bool" arrayed or not -#ifdef GLSLANG_WEB - for (int dim = Esd2D; dim <= EsdCube; ++dim) { // 2D, 3D, and Cube -#else -#if defined(GLSLANG_ANGLE) - for (int dim = Esd2D; dim < EsdNumDims; ++dim) { // 2D, ..., buffer, subpass -#else for (int dim = Esd1D; dim < EsdNumDims; ++dim) { // 1D, ..., buffer, subpass -#endif + if (dim == EsdAttachmentEXT) + continue; if (dim == EsdSubpass && spvVersion.vulkan == 0) continue; if (dim == EsdSubpass && (image || shadow || arrayed)) @@ -6146,7 +6309,6 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c continue; if (ms && arrayed && profile == EEsProfile && version < 310) continue; -#endif if (dim == Esd3D && shadow) continue; if (dim == EsdCube && arrayed && skipCubeArrayed) @@ -6156,23 +6318,21 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c // Loop over the bTypes for (size_t bType = 0; bType < sizeof(bTypes)/sizeof(TBasicType); ++bType) { -#ifndef GLSLANG_WEB if (bTypes[bType] == EbtFloat16 && (profile == EEsProfile || version < 450)) continue; if (dim == EsdRect && version < 140 && bType > 0) continue; -#endif if (shadow && (bTypes[bType] == EbtInt || bTypes[bType] == EbtUint)) continue; // // Now, make all the function prototypes for the type we just built... // TSampler sampler; -#ifndef GLSLANG_WEB if (dim == EsdSubpass) { sampler.setSubpass(bTypes[bType], ms ? true : false); + } else if (dim == EsdAttachmentEXT) { + sampler.setAttachmentEXT(bTypes[bType]); } else -#endif if (image) { sampler.setImage(bTypes[bType], (TSamplerDim)dim, arrayed ? true : false, shadow ? true : false, @@ -6185,12 +6345,10 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c TString typeName = sampler.getString(); -#ifndef GLSLANG_WEB if (dim == EsdSubpass) { addSubpassSampling(sampler, typeName, version, profile); continue; } -#endif addQueryFunctions(sampler, typeName, version, profile); @@ -6198,7 +6356,6 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c addImageFunctions(sampler, typeName, version, profile); else { addSamplingFunctions(sampler, typeName, version, profile); -#ifndef GLSLANG_WEB addGatherFunctions(sampler, typeName, version, profile); if (spvVersion.vulkan > 0 && sampler.isCombined() && !sampler.shadow) { // Base Vulkan allows texelFetch() for @@ -6214,7 +6371,6 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c addSamplingFunctions(sampler, textureTypeName, version, profile); addQueryFunctions(sampler, textureTypeName, version, profile); } -#endif } } } @@ -6245,16 +6401,6 @@ void TBuiltIns::addQueryFunctions(TSampler sampler, const TString& typeName, int int sizeDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0) - (sampler.dim == EsdCube ? 1 : 0); -#ifdef GLSLANG_WEB - commonBuiltins.append("highp "); - commonBuiltins.append("ivec"); - commonBuiltins.append(postfixes[sizeDims]); - commonBuiltins.append(" textureSize("); - commonBuiltins.append(typeName); - commonBuiltins.append(",int);\n"); - return; -#endif - if (sampler.isImage() && ((profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 420))) return; @@ -6574,14 +6720,6 @@ void TBuiltIns::addSubpassSampling(TSampler sampler, const TString& typeName, in // void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName, int version, EProfile profile) { -#ifdef GLSLANG_WEB - profile = EEsProfile; - version = 310; -#elif defined(GLSLANG_ANGLE) - profile = ECoreProfile; - version = 450; -#endif - // // texturing // @@ -6656,11 +6794,7 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName, continue; // loop over 16-bit floating-point texel addressing -#if defined(GLSLANG_WEB) || defined(GLSLANG_ANGLE) - const int f16TexAddr = 0; -#else for (int f16TexAddr = 0; f16TexAddr <= 1; ++f16TexAddr) -#endif { if (f16TexAddr && sampler.type != EbtFloat16) continue; @@ -6669,11 +6803,7 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName, totalDims--; } // loop over "bool" lod clamp -#if defined(GLSLANG_WEB) || defined(GLSLANG_ANGLE) - const int lodClamp = 0; -#else for (int lodClamp = 0; lodClamp <= 1 ;++lodClamp) -#endif { if (lodClamp && (profile == EEsProfile || version < 450)) continue; @@ -6681,11 +6811,7 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName, continue; // loop over "bool" sparse or not -#if defined(GLSLANG_WEB) || defined(GLSLANG_ANGLE) - const int sparse = 0; -#else for (int sparse = 0; sparse <= 1; ++sparse) -#endif { if (sparse && (profile == EEsProfile || version < 450)) continue; @@ -6862,14 +6988,6 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName, // void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, int version, EProfile profile) { -#ifdef GLSLANG_WEB - profile = EEsProfile; - version = 310; -#elif defined(GLSLANG_ANGLE) - profile = ECoreProfile; - version = 450; -#endif - switch (sampler.dim) { case Esd2D: case EsdRect: @@ -7108,14 +7226,6 @@ void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, in // void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language) { -#ifdef GLSLANG_WEB - version = 310; - profile = EEsProfile; -#elif defined(GLSLANG_ANGLE) - version = 450; - profile = ECoreProfile; -#endif - // // Initialize the context-dependent (resource-dependent) built-in strings for parsing. // @@ -7173,7 +7283,6 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf s.append(builtInConstant); } -#ifndef GLSLANG_WEB if (version >= 310) { // geometry @@ -7496,7 +7605,6 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf snprintf(builtInConstant, maxSize, "const int gl_MaxTransformFeedbackInterleavedComponents = %d;", resources.maxTransformFeedbackInterleavedComponents); s.append(builtInConstant); } -#endif } // compute @@ -7518,7 +7626,6 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf s.append("\n"); } -#ifndef GLSLANG_WEB // images (some in compute below) if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 130)) { @@ -7546,7 +7653,6 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf s.append("\n"); } -#ifndef GLSLANG_ANGLE // atomic counters (some in compute below) if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 420)) { @@ -7583,7 +7689,6 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf s.append("\n"); } -#endif // !GLSLANG_ANGLE // GL_ARB_cull_distance if (profile != EEsProfile && version >= 450) { @@ -7600,7 +7705,6 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf s.append(builtInConstant); } -#ifndef GLSLANG_ANGLE // SPV_NV_mesh_shader if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) { snprintf(builtInConstant, maxSize, "const int gl_MaxMeshOutputVerticesNV = %d;", resources.maxMeshOutputVerticesNV); @@ -7623,8 +7727,6 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf s.append("\n"); } -#endif -#endif s.append("\n"); } @@ -7653,6 +7755,23 @@ static void SpecialQualifier(const char* name, TStorageQualifier qualifier, TBui symQualifier.builtIn = builtIn; } +// +// Modify the symbol's flat decoration. +// +// Safe to call even if name is not present. +// +// Originally written to transform gl_SubGroupSizeARB from uniform to fragment input in Vulkan. +// +static void ModifyFlatDecoration(const char* name, bool flat, TSymbolTable& symbolTable) +{ + TSymbol* symbol = symbolTable.find(name); + if (symbol == nullptr) + return; + + TQualifier& symQualifier = symbol->getWritableType().getQualifier(); + symQualifier.flat = flat; +} + // // To tag built-in variables with their TBuiltInVariable enum. Use this when the // normal declaration text already gets the qualifier right, and all that's needed @@ -7710,14 +7829,6 @@ static void BuiltInVariable(const char* blockName, const char* name, TBuiltInVar // void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable) { -#ifdef GLSLANG_WEB - version = 310; - profile = EEsProfile; -#elif defined(GLSLANG_ANGLE) - version = 450; - profile = ECoreProfile; -#endif - // // Tag built-in variables and functions with additional qualifier and extension information // that cannot be declared with the text strings. @@ -7737,7 +7848,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_InstanceIndex", EbvInstanceIndex, symbolTable); } -#ifndef GLSLANG_WEB if (spvVersion.vulkan == 0) { SpecialQualifier("gl_VertexID", EvqVertexId, EbvVertexId, symbolTable); SpecialQualifier("gl_InstanceID", EvqInstanceId, EbvInstanceId, symbolTable); @@ -7911,7 +8021,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion case EShLangTessEvaluation: case EShLangGeometry: -#endif // !GLSLANG_WEB SpecialQualifier("gl_Position", EvqPosition, EbvPosition, symbolTable); SpecialQualifier("gl_PointSize", EvqPointSize, EbvPointSize, symbolTable); @@ -7921,7 +8030,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_out", "gl_Position", EbvPosition, symbolTable); BuiltInVariable("gl_out", "gl_PointSize", EbvPointSize, symbolTable); -#ifndef GLSLANG_WEB SpecialQualifier("gl_ClipVertex", EvqClipVertex, EbvClipVertex, symbolTable); BuiltInVariable("gl_in", "gl_ClipDistance", EbvClipDistance, symbolTable); @@ -8028,7 +8136,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable); } - if (profile != EEsProfile) { + if (profile != EEsProfile) { BuiltInVariable("gl_SubGroupInvocationARB", EbvSubGroupInvocation, symbolTable); BuiltInVariable("gl_SubGroupEqMaskARB", EbvSubGroupEqMask, symbolTable); BuiltInVariable("gl_SubGroupGeMaskARB", EbvSubGroupGeMask, symbolTable); @@ -8036,9 +8144,12 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable); BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable); - if (spvVersion.vulkan > 0) + if (spvVersion.vulkan > 0) { // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable); + if (language == EShLangFragment) + ModifyFlatDecoration("gl_SubGroupSizeARB", true, symbolTable); + } else BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable); } @@ -8071,6 +8182,19 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SMCountNV", EbvSMCount, symbolTable); BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable); BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable); + + // GL_ARM_shader_core_builtins + symbolTable.setVariableExtensions("gl_CoreCountARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + + BuiltInVariable("gl_CoreCountARM", EbvCoreCountARM, symbolTable); + BuiltInVariable("gl_CoreIDARM", EbvCoreIDARM, symbolTable); + BuiltInVariable("gl_CoreMaxIDARM", EbvCoreMaxIDARM, symbolTable); + BuiltInVariable("gl_WarpIDARM", EbvWarpIDARM, symbolTable); + BuiltInVariable("gl_WarpMaxIDARM", EbvWarpMaxIDARM, symbolTable); } if (language == EShLangGeometry || language == EShLangVertex) { @@ -8085,8 +8209,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate); } } - -#endif // !GLSLANG_WEB break; case EShLangFragment: @@ -8103,7 +8225,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion } } SpecialQualifier("gl_FragDepth", EvqFragDepth, EbvFragDepth, symbolTable); -#ifndef GLSLANG_WEB SpecialQualifier("gl_FragDepthEXT", EvqFragDepth, EbvFragDepth, symbolTable); SpecialQualifier("gl_FragStencilRefARB", EvqFragStencil, EbvFragStencilRef, symbolTable); SpecialQualifier("gl_HelperInvocation", EvqVaryingIn, EbvHelperInvocation, symbolTable); @@ -8145,8 +8266,10 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setFunctionExtensions("rayQueryGetIntersectionWorldToObjectEXT", 1, &E_GL_EXT_ray_query); symbolTable.setFunctionExtensions("rayQueryGetWorldRayOriginEXT", 1, &E_GL_EXT_ray_query); symbolTable.setFunctionExtensions("rayQueryGetWorldRayDirectionEXT", 1, &E_GL_EXT_ray_query); + symbolTable.setFunctionExtensions("rayQueryGetIntersectionTriangleVertexPositionsEXT", 1, &E_GL_EXT_ray_tracing_position_fetch); symbolTable.setVariableExtensions("gl_RayFlagsSkipAABBEXT", 1, &E_GL_EXT_ray_flags_primitive_culling); symbolTable.setVariableExtensions("gl_RayFlagsSkipTrianglesEXT", 1, &E_GL_EXT_ray_flags_primitive_culling); + symbolTable.setVariableExtensions("gl_RayFlagsForceOpacityMicromap2StateEXT", 1, &E_GL_EXT_opacity_micromap); } if ((profile != EEsProfile && version >= 130) || @@ -8470,9 +8593,12 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable); BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable); - if (spvVersion.vulkan > 0) + if (spvVersion.vulkan > 0) { // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable); + if (language == EShLangFragment) + ModifyFlatDecoration("gl_SubGroupSizeARB", true, symbolTable); + } else BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable); } @@ -8582,6 +8708,19 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SMCountNV", EbvSMCount, symbolTable); BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable); BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable); + + // GL_ARM_shader_core_builtins + symbolTable.setVariableExtensions("gl_CoreCountARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + + BuiltInVariable("gl_CoreCountARM", EbvCoreCountARM, symbolTable); + BuiltInVariable("gl_CoreIDARM", EbvCoreIDARM, symbolTable); + BuiltInVariable("gl_CoreMaxIDARM", EbvCoreMaxIDARM, symbolTable); + BuiltInVariable("gl_WarpIDARM", EbvWarpIDARM, symbolTable); + BuiltInVariable("gl_WarpMaxIDARM", EbvWarpMaxIDARM, symbolTable); } if (profile == EEsProfile) { @@ -8622,7 +8761,19 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate); symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate); } -#endif // !GLSLANG_WEB + + // GL_EXT_shader_tile_image + symbolTable.setFunctionExtensions("stencilAttachmentReadEXT", 1, &E_GL_EXT_shader_tile_image); + symbolTable.setFunctionExtensions("depthAttachmentReadEXT", 1, &E_GL_EXT_shader_tile_image); + symbolTable.setFunctionExtensions("colorAttachmentReadEXT", 1, &E_GL_EXT_shader_tile_image); + + if ((profile == EEsProfile && version >= 310) || + (profile != EEsProfile && version >= 140)) { + symbolTable.setFunctionExtensions("textureWeightedQCOM", 1, &E_GL_QCOM_image_processing); + symbolTable.setFunctionExtensions("textureBoxFilterQCOM", 1, &E_GL_QCOM_image_processing); + symbolTable.setFunctionExtensions("textureBlockMatchSADQCOM", 1, &E_GL_QCOM_image_processing); + symbolTable.setFunctionExtensions("textureBlockMatchSSDQCOM", 1, &E_GL_QCOM_image_processing); + } break; case EShLangCompute: @@ -8635,7 +8786,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable); BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable); -#ifndef GLSLANG_WEB if ((profile != EEsProfile && version >= 140) || (profile == EEsProfile && version >= 310)) { symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group); @@ -8687,9 +8837,12 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable); BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable); - if (spvVersion.vulkan > 0) + if (spvVersion.vulkan > 0) { // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable); + if (language == EShLangFragment) + ModifyFlatDecoration("gl_SubGroupSizeARB", true, symbolTable); + } else BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable); } @@ -8722,6 +8875,19 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SMCountNV", EbvSMCount, symbolTable); BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable); BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable); + + // GL_ARM_shader_core_builtins + symbolTable.setVariableExtensions("gl_CoreCountARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + + BuiltInVariable("gl_CoreCountARM", EbvCoreCountARM, symbolTable); + BuiltInVariable("gl_CoreIDARM", EbvCoreIDARM, symbolTable); + BuiltInVariable("gl_CoreMaxIDARM", EbvCoreMaxIDARM, symbolTable); + BuiltInVariable("gl_WarpIDARM", EbvWarpIDARM, symbolTable); + BuiltInVariable("gl_WarpMaxIDARM", EbvWarpMaxIDARM, symbolTable); } // GL_KHR_shader_subgroup @@ -8743,6 +8909,12 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setFunctionExtensions("coopMatMulAddNV", 2, coopExt); } + { + symbolTable.setFunctionExtensions("coopMatLoad", 1, &E_GL_KHR_cooperative_matrix); + symbolTable.setFunctionExtensions("coopMatStore", 1, &E_GL_KHR_cooperative_matrix); + symbolTable.setFunctionExtensions("coopMatMulAdd", 1, &E_GL_KHR_cooperative_matrix); + } + if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) { symbolTable.setFunctionExtensions("dFdx", 1, &E_GL_NV_compute_shader_derivatives); symbolTable.setFunctionExtensions("dFdy", 1, &E_GL_NV_compute_shader_derivatives); @@ -8762,10 +8934,13 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate); symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate); } -#endif // !GLSLANG_WEB + + if ((profile != EEsProfile && version >= 460)) { + symbolTable.setFunctionExtensions("fetchMicroTriangleVertexPositionNV", 1, &E_GL_NV_displacement_micromap); + symbolTable.setFunctionExtensions("fetchMicroTriangleVertexBarycentricNV", 1, &E_GL_NV_displacement_micromap); + } break; -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) case EShLangRayGen: case EShLangIntersect: case EShLangAnyHit: @@ -8809,6 +8984,9 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_IncomingRayFlagsNV", 1, &E_GL_NV_ray_tracing); symbolTable.setVariableExtensions("gl_IncomingRayFlagsEXT", 1, &E_GL_EXT_ray_tracing); symbolTable.setVariableExtensions("gl_CurrentRayTimeNV", 1, &E_GL_NV_ray_tracing_motion_blur); + symbolTable.setVariableExtensions("gl_HitTriangleVertexPositionsEXT", 1, &E_GL_EXT_ray_tracing_position_fetch); + symbolTable.setVariableExtensions("gl_HitMicroTriangleVertexPositionsNV", 1, &E_GL_NV_displacement_micromap); + symbolTable.setVariableExtensions("gl_HitMicroTriangleVertexBarycentricsNV", 1, &E_GL_NV_displacement_micromap); symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group); @@ -8823,6 +9001,40 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setFunctionExtensions("executeCallableNV", 1, &E_GL_NV_ray_tracing); symbolTable.setFunctionExtensions("executeCallableEXT", 1, &E_GL_EXT_ray_tracing); + symbolTable.setFunctionExtensions("hitObjectTraceRayNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectTraceRayMotionNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectRecordHitNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectRecordHitMotionNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectRecordHitWithIndexNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectRecordHitWithIndexMotionNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectRecordMissNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectRecordMissMotionNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectRecordEmptyNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectExecuteShaderNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectIsEmptyNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectIsMissNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectIsHitNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetRayTMinNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetRayTMaxNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetObjectRayOriginNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetObjectRayDirectionNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetWorldRayOriginNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetWorldRayDirectionNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetWorldToObjectNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetbjectToWorldNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetInstanceCustomIndexNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetInstanceIdNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetGeometryIndexNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetPrimitiveIndexNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetHitKindNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetAttributesNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetCurrentTimeNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetShaderBindingTableRecordIndexNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("hitObjectGetShaderRecordBufferHandleNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("reorderThreadNV", 1, &E_GL_NV_shader_invocation_reorder); + symbolTable.setFunctionExtensions("fetchMicroTriangleVertexPositionNV", 1, &E_GL_NV_displacement_micromap); + symbolTable.setFunctionExtensions("fetchMicroTriangleVertexBarycentricNV", 1, &E_GL_NV_displacement_micromap); + BuiltInVariable("gl_LaunchIDNV", EbvLaunchId, symbolTable); BuiltInVariable("gl_LaunchIDEXT", EbvLaunchId, symbolTable); @@ -8860,6 +9072,11 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_IncomingRayFlagsEXT", EbvIncomingRayFlags, symbolTable); BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable); BuiltInVariable("gl_CurrentRayTimeNV", EbvCurrentRayTimeNV, symbolTable); + BuiltInVariable("gl_HitTriangleVertexPositionsEXT", EbvPositionFetch, symbolTable); + BuiltInVariable("gl_HitMicroTriangleVertexPositionsNV", EbvMicroTrianglePositionNV, symbolTable); + BuiltInVariable("gl_HitMicroTriangleVertexBarycentricsNV", EbvMicroTriangleBaryNV, symbolTable); + BuiltInVariable("gl_HitKindFrontFacingMicroTriangleNV", EbvHitKindFrontFacingMicroTriangleNV, symbolTable); + BuiltInVariable("gl_HitKindBackFacingMicroTriangleNV", EbvHitKindBackFacingMicroTriangleNV, symbolTable); // GL_ARB_shader_ballot symbolTable.setVariableExtensions("gl_SubGroupSizeARB", 1, &E_GL_ARB_shader_ballot); @@ -8877,9 +9094,12 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable); BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable); - if (spvVersion.vulkan > 0) + if (spvVersion.vulkan > 0) { // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable); + if (language == EShLangFragment) + ModifyFlatDecoration("gl_SubGroupSizeARB", true, symbolTable); + } else BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable); @@ -8913,6 +9133,19 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SMCountNV", EbvSMCount, symbolTable); BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable); BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable); + + // GL_ARM_shader_core_builtins + symbolTable.setVariableExtensions("gl_CoreCountARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + + BuiltInVariable("gl_CoreCountARM", EbvCoreCountARM, symbolTable); + BuiltInVariable("gl_CoreIDARM", EbvCoreIDARM, symbolTable); + BuiltInVariable("gl_CoreMaxIDARM", EbvCoreMaxIDARM, symbolTable); + BuiltInVariable("gl_WarpIDARM", EbvWarpIDARM, symbolTable); + BuiltInVariable("gl_WarpMaxIDARM", EbvWarpMaxIDARM, symbolTable); } if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 450)) { @@ -9035,7 +9268,11 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_MeshPrimitivesEXT", "gl_Layer", 1, &E_GL_EXT_mesh_shader); symbolTable.setVariableExtensions("gl_MeshPrimitivesEXT", "gl_ViewportIndex", 1, &E_GL_EXT_mesh_shader); symbolTable.setVariableExtensions("gl_MeshPrimitivesEXT", "gl_CullPrimitiveEXT", 1, &E_GL_EXT_mesh_shader); - symbolTable.setVariableExtensions("gl_MeshPrimitivesEXT", "gl_PrimitiveShadingRateEXT", 1, &E_GL_EXT_mesh_shader); + + // note: technically this member requires both GL_EXT_mesh_shader and GL_EXT_fragment_shading_rate + // since setVariableExtensions only needs *one of* the extensions to validate, it's more useful to specify EXT_fragment_shading_rate + // GL_EXT_mesh_shader will be required in practice by use of other fields of gl_MeshPrimitivesEXT + symbolTable.setVariableExtensions("gl_MeshPrimitivesEXT", "gl_PrimitiveShadingRateEXT", 1, &E_GL_EXT_fragment_shading_rate); BuiltInVariable("gl_MeshPrimitivesEXT", "gl_PrimitiveID", EbvPrimitiveId, symbolTable); BuiltInVariable("gl_MeshPrimitivesEXT", "gl_Layer", EbvLayer, symbolTable); @@ -9075,9 +9312,12 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable); BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable); - if (spvVersion.vulkan > 0) + if (spvVersion.vulkan > 0) { // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable); + if (language == EShLangFragment) + ModifyFlatDecoration("gl_SubGroupSizeARB", true, symbolTable); + } else BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable); } @@ -9116,6 +9356,19 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SMCountNV", EbvSMCount, symbolTable); BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable); BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable); + + // GL_ARM_shader_core_builtins + symbolTable.setVariableExtensions("gl_CoreCountARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + + BuiltInVariable("gl_CoreCountARM", EbvCoreCountARM, symbolTable); + BuiltInVariable("gl_CoreIDARM", EbvCoreIDARM, symbolTable); + BuiltInVariable("gl_CoreMaxIDARM", EbvCoreMaxIDARM, symbolTable); + BuiltInVariable("gl_WarpIDARM", EbvWarpIDARM, symbolTable); + BuiltInVariable("gl_WarpMaxIDARM", EbvWarpMaxIDARM, symbolTable); } if ((profile == EEsProfile && version >= 310) || @@ -9125,6 +9378,13 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate); symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate); } + + // Builtins for GL_NV_displacment_micromap + if ((profile != EEsProfile && version >= 460)) { + symbolTable.setFunctionExtensions("fetchMicroTriangleVertexPositionNV", 1, &E_GL_NV_displacement_micromap); + symbolTable.setFunctionExtensions("fetchMicroTriangleVertexBarycentricNV", 1, &E_GL_NV_displacement_micromap); + } + break; case EShLangTask: @@ -9202,9 +9462,12 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable); BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable); - if (spvVersion.vulkan > 0) + if (spvVersion.vulkan > 0) { // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable); + if (language == EShLangFragment) + ModifyFlatDecoration("gl_SubGroupSizeARB", true, symbolTable); + } else BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable); } @@ -9243,6 +9506,19 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_SMCountNV", EbvSMCount, symbolTable); BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable); BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable); + + // GL_ARM_shader_core_builtins + symbolTable.setVariableExtensions("gl_CoreCountARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_CoreMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpIDARM", 1, &E_GL_ARM_shader_core_builtins); + symbolTable.setVariableExtensions("gl_WarpMaxIDARM", 1, &E_GL_ARM_shader_core_builtins); + + BuiltInVariable("gl_CoreCountARM", EbvCoreCountARM, symbolTable); + BuiltInVariable("gl_CoreIDARM", EbvCoreIDARM, symbolTable); + BuiltInVariable("gl_CoreMaxIDARM", EbvCoreMaxIDARM, symbolTable); + BuiltInVariable("gl_WarpIDARM", EbvWarpIDARM, symbolTable); + BuiltInVariable("gl_WarpMaxIDARM", EbvWarpMaxIDARM, symbolTable); } if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 450)) { @@ -9252,7 +9528,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate); } break; -#endif default: assert(false && "Language not supported"); @@ -9268,7 +9543,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion relateTabledBuiltins(version, profile, spvVersion, language, symbolTable); -#ifndef GLSLANG_WEB symbolTable.relateToOperator("doubleBitsToInt64", EOpDoubleBitsToInt64); symbolTable.relateToOperator("doubleBitsToUint64", EOpDoubleBitsToUint64); symbolTable.relateToOperator("int64BitsToDouble", EOpInt64BitsToDouble); @@ -9685,6 +9959,14 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.relateToOperator("shadow2DEXT", EOpTexture); symbolTable.relateToOperator("shadow2DProjEXT", EOpTextureProj); } + + if ((profile == EEsProfile && version >= 310) || + (profile != EEsProfile && version >= 140)) { + symbolTable.relateToOperator("textureWeightedQCOM", EOpImageSampleWeightedQCOM); + symbolTable.relateToOperator("textureBoxFilterQCOM", EOpImageBoxFilterQCOM); + symbolTable.relateToOperator("textureBlockMatchSADQCOM", EOpImageBlockMatchSADQCOM); + symbolTable.relateToOperator("textureBlockMatchSSDQCOM", EOpImageBlockMatchSSDQCOM); + } } switch(language) { @@ -9736,6 +10018,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.relateToOperator("rayQueryGetWorldRayOriginEXT", EOpRayQueryGetWorldRayOrigin); symbolTable.relateToOperator("rayQueryGetIntersectionObjectToWorldEXT", EOpRayQueryGetIntersectionObjectToWorld); symbolTable.relateToOperator("rayQueryGetIntersectionWorldToObjectEXT", EOpRayQueryGetIntersectionWorldToObject); + symbolTable.relateToOperator("rayQueryGetIntersectionTriangleVertexPositionsEXT", EOpRayQueryGetIntersectionTriangleVertexPositionsEXT); } symbolTable.relateToOperator("interpolateAtCentroid", EOpInterpolateAtCentroid); @@ -9748,6 +10031,10 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.relateToOperator("beginInvocationInterlockARB", EOpBeginInvocationInterlock); symbolTable.relateToOperator("endInvocationInterlockARB", EOpEndInvocationInterlock); + symbolTable.relateToOperator("stencilAttachmentReadEXT", EOpStencilAttachmentReadEXT); + symbolTable.relateToOperator("depthAttachmentReadEXT", EOpDepthAttachmentReadEXT); + symbolTable.relateToOperator("colorAttachmentReadEXT", EOpColorAttachmentReadEXT); + break; case EShLangCompute: @@ -9764,12 +10051,25 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.relateToOperator("dFdyCoarse", EOpDPdyCoarse); symbolTable.relateToOperator("fwidthCoarse",EOpFwidthCoarse); } - symbolTable.relateToOperator("coopMatLoadNV", EOpCooperativeMatrixLoad); - symbolTable.relateToOperator("coopMatStoreNV", EOpCooperativeMatrixStore); - symbolTable.relateToOperator("coopMatMulAddNV", EOpCooperativeMatrixMulAdd); + symbolTable.relateToOperator("coopMatLoadNV", EOpCooperativeMatrixLoadNV); + symbolTable.relateToOperator("coopMatStoreNV", EOpCooperativeMatrixStoreNV); + symbolTable.relateToOperator("coopMatMulAddNV", EOpCooperativeMatrixMulAddNV); + + symbolTable.relateToOperator("coopMatLoad", EOpCooperativeMatrixLoad); + symbolTable.relateToOperator("coopMatStore", EOpCooperativeMatrixStore); + symbolTable.relateToOperator("coopMatMulAdd", EOpCooperativeMatrixMulAdd); + + if (profile != EEsProfile && version >= 460) { + symbolTable.relateToOperator("fetchMicroTriangleVertexPositionNV", EOpFetchMicroTriangleVertexPositionNV); + symbolTable.relateToOperator("fetchMicroTriangleVertexBarycentricNV", EOpFetchMicroTriangleVertexBarycentricNV); + } break; case EShLangRayGen: + if (profile != EEsProfile && version >= 460) { + symbolTable.relateToOperator("fetchMicroTriangleVertexPositionNV", EOpFetchMicroTriangleVertexPositionNV); + symbolTable.relateToOperator("fetchMicroTriangleVertexBarycentricNV", EOpFetchMicroTriangleVertexBarycentricNV); + } // fallthrough case EShLangClosestHit: case EShLangMiss: if (profile != EEsProfile && version >= 460) { @@ -9778,13 +10078,45 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.relateToOperator("traceRayEXT", EOpTraceKHR); symbolTable.relateToOperator("executeCallableNV", EOpExecuteCallableNV); symbolTable.relateToOperator("executeCallableEXT", EOpExecuteCallableKHR); + + symbolTable.relateToOperator("hitObjectTraceRayNV", EOpHitObjectTraceRayNV); + symbolTable.relateToOperator("hitObjectTraceRayMotionNV", EOpHitObjectTraceRayMotionNV); + symbolTable.relateToOperator("hitObjectRecordHitNV", EOpHitObjectRecordHitNV); + symbolTable.relateToOperator("hitObjectRecordHitMotionNV", EOpHitObjectRecordHitMotionNV); + symbolTable.relateToOperator("hitObjectRecordHitWithIndexNV", EOpHitObjectRecordHitWithIndexNV); + symbolTable.relateToOperator("hitObjectRecordHitWithIndexMotionNV", EOpHitObjectRecordHitWithIndexMotionNV); + symbolTable.relateToOperator("hitObjectRecordMissNV", EOpHitObjectRecordMissNV); + symbolTable.relateToOperator("hitObjectRecordMissMotionNV", EOpHitObjectRecordMissMotionNV); + symbolTable.relateToOperator("hitObjectRecordEmptyNV", EOpHitObjectRecordEmptyNV); + symbolTable.relateToOperator("hitObjectExecuteShaderNV", EOpHitObjectExecuteShaderNV); + symbolTable.relateToOperator("hitObjectIsEmptyNV", EOpHitObjectIsEmptyNV); + symbolTable.relateToOperator("hitObjectIsMissNV", EOpHitObjectIsMissNV); + symbolTable.relateToOperator("hitObjectIsHitNV", EOpHitObjectIsHitNV); + symbolTable.relateToOperator("hitObjectGetRayTMinNV", EOpHitObjectGetRayTMinNV); + symbolTable.relateToOperator("hitObjectGetRayTMaxNV", EOpHitObjectGetRayTMaxNV); + symbolTable.relateToOperator("hitObjectGetObjectRayOriginNV", EOpHitObjectGetObjectRayOriginNV); + symbolTable.relateToOperator("hitObjectGetObjectRayDirectionNV", EOpHitObjectGetObjectRayDirectionNV); + symbolTable.relateToOperator("hitObjectGetWorldRayOriginNV", EOpHitObjectGetWorldRayOriginNV); + symbolTable.relateToOperator("hitObjectGetWorldRayDirectionNV", EOpHitObjectGetWorldRayDirectionNV); + symbolTable.relateToOperator("hitObjectGetWorldToObjectNV", EOpHitObjectGetWorldToObjectNV); + symbolTable.relateToOperator("hitObjectGetObjectToWorldNV", EOpHitObjectGetObjectToWorldNV); + symbolTable.relateToOperator("hitObjectGetInstanceCustomIndexNV", EOpHitObjectGetInstanceCustomIndexNV); + symbolTable.relateToOperator("hitObjectGetInstanceIdNV", EOpHitObjectGetInstanceIdNV); + symbolTable.relateToOperator("hitObjectGetGeometryIndexNV", EOpHitObjectGetGeometryIndexNV); + symbolTable.relateToOperator("hitObjectGetPrimitiveIndexNV", EOpHitObjectGetPrimitiveIndexNV); + symbolTable.relateToOperator("hitObjectGetHitKindNV", EOpHitObjectGetHitKindNV); + symbolTable.relateToOperator("hitObjectGetAttributesNV", EOpHitObjectGetAttributesNV); + symbolTable.relateToOperator("hitObjectGetCurrentTimeNV", EOpHitObjectGetCurrentTimeNV); + symbolTable.relateToOperator("hitObjectGetShaderBindingTableRecordIndexNV", EOpHitObjectGetShaderBindingTableRecordIndexNV); + symbolTable.relateToOperator("hitObjectGetShaderRecordBufferHandleNV", EOpHitObjectGetShaderRecordBufferHandleNV); + symbolTable.relateToOperator("reorderThreadNV", EOpReorderThreadNV); } break; case EShLangIntersect: if (profile != EEsProfile && version >= 460) { symbolTable.relateToOperator("reportIntersectionNV", EOpReportIntersection); symbolTable.relateToOperator("reportIntersectionEXT", EOpReportIntersection); - } + } break; case EShLangAnyHit: if (profile != EEsProfile && version >= 460) { @@ -9809,6 +10141,12 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion if (profile != EEsProfile && version >= 450) { symbolTable.relateToOperator("SetMeshOutputsEXT", EOpSetMeshOutputsEXT); } + + if (profile != EEsProfile && version >= 460) { + // Builtins for GL_NV_displacement_micromap. + symbolTable.relateToOperator("fetchMicroTriangleVertexPositionNV", EOpFetchMicroTriangleVertexPositionNV); + symbolTable.relateToOperator("fetchMicroTriangleVertexBarycentricNV", EOpFetchMicroTriangleVertexBarycentricNV); + } break; case EShLangTask: if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) { @@ -9824,7 +10162,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion default: assert(false && "Language not supported"); } -#endif // !GLSLANG_WEB } // @@ -9838,11 +10175,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion // void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources) { -#ifndef GLSLANG_WEB -#if defined(GLSLANG_ANGLE) - profile = ECoreProfile; - version = 450; -#endif if (profile != EEsProfile && version >= 430 && version < 440) { symbolTable.setVariableExtensions("gl_MaxTransformFeedbackBuffers", 1, &E_GL_ARB_enhanced_layouts); symbolTable.setVariableExtensions("gl_MaxTransformFeedbackInterleavedComponents", 1, &E_GL_ARB_enhanced_layouts); @@ -9914,7 +10246,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion default: break; } -#endif } } // end namespace glslang diff --git a/third_party/glslang/glslang/MachineIndependent/Initialize.h b/third_party/glslang/glslang/MachineIndependent/Initialize.h index ac8ec33e996..42c32ddbb7f 100644 --- a/third_party/glslang/glslang/MachineIndependent/Initialize.h +++ b/third_party/glslang/glslang/MachineIndependent/Initialize.h @@ -107,6 +107,9 @@ class TBuiltIns : public TBuiltInParseables { int dimMap[EsdNumDims]; }; +// change this back to false if depending on textual spellings of texturing calls when consuming the AST +// Using PureOperatorBuiltins=false is deprecated. +constexpr bool PureOperatorBuiltins = true; } // end namespace glslang #endif // _INITIALIZE_INCLUDED_ diff --git a/third_party/glslang/glslang/MachineIndependent/Intermediate.cpp b/third_party/glslang/glslang/MachineIndependent/Intermediate.cpp index 6a43ef3e847..a8e3b38bfdd 100755 --- a/third_party/glslang/glslang/MachineIndependent/Intermediate.cpp +++ b/third_party/glslang/glslang/MachineIndependent/Intermediate.cpp @@ -352,7 +352,7 @@ TIntermTyped* TIntermediate::addIndex(TOperator op, TIntermTyped* base, TIntermT TIntermTyped* TIntermediate::addUnaryMath(TOperator op, TIntermTyped* child, const TSourceLoc& loc) { - if (child == 0) + if (child == nullptr) return nullptr; if (child->getType().getBasicType() == EbtBlock) @@ -388,7 +388,6 @@ TIntermTyped* TIntermediate::addUnaryMath(TOperator op, TIntermTyped* child, case EOpConstructFloat: newType = EbtFloat; break; case EOpConstructInt: newType = EbtInt; break; case EOpConstructUint: newType = EbtUint; break; -#ifndef GLSLANG_WEB case EOpConstructInt8: newType = EbtInt8; break; case EOpConstructUint8: newType = EbtUint8; break; case EOpConstructInt16: newType = EbtInt16; break; @@ -397,7 +396,6 @@ TIntermTyped* TIntermediate::addUnaryMath(TOperator op, TIntermTyped* child, case EOpConstructUint64: newType = EbtUint64; break; case EOpConstructDouble: newType = EbtDouble; break; case EOpConstructFloat16: newType = EbtFloat16; break; -#endif default: break; // some compilers want this } @@ -569,7 +567,6 @@ bool TIntermediate::isConversionAllowed(TOperator op, TIntermTyped* node) const bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& newOp) const { switch (dst) { -#ifndef GLSLANG_WEB case EbtDouble: switch (src) { case EbtUint: newOp = EOpConvUintToDouble; break; @@ -587,13 +584,11 @@ bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& ne return false; } break; -#endif case EbtFloat: switch (src) { case EbtInt: newOp = EOpConvIntToFloat; break; case EbtUint: newOp = EOpConvUintToFloat; break; case EbtBool: newOp = EOpConvBoolToFloat; break; -#ifndef GLSLANG_WEB case EbtDouble: newOp = EOpConvDoubleToFloat; break; case EbtInt8: newOp = EOpConvInt8ToFloat; break; case EbtUint8: newOp = EOpConvUint8ToFloat; break; @@ -602,12 +597,10 @@ bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& ne case EbtFloat16: newOp = EOpConvFloat16ToFloat; break; case EbtInt64: newOp = EOpConvInt64ToFloat; break; case EbtUint64: newOp = EOpConvUint64ToFloat; break; -#endif default: return false; } break; -#ifndef GLSLANG_WEB case EbtFloat16: switch (src) { case EbtInt8: newOp = EOpConvInt8ToFloat16; break; @@ -625,13 +618,11 @@ bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& ne return false; } break; -#endif case EbtBool: switch (src) { case EbtInt: newOp = EOpConvIntToBool; break; case EbtUint: newOp = EOpConvUintToBool; break; case EbtFloat: newOp = EOpConvFloatToBool; break; -#ifndef GLSLANG_WEB case EbtDouble: newOp = EOpConvDoubleToBool; break; case EbtInt8: newOp = EOpConvInt8ToBool; break; case EbtUint8: newOp = EOpConvUint8ToBool; break; @@ -640,12 +631,10 @@ bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& ne case EbtFloat16: newOp = EOpConvFloat16ToBool; break; case EbtInt64: newOp = EOpConvInt64ToBool; break; case EbtUint64: newOp = EOpConvUint64ToBool; break; -#endif default: return false; } break; -#ifndef GLSLANG_WEB case EbtInt8: switch (src) { case EbtUint8: newOp = EOpConvUint8ToInt8; break; @@ -715,14 +704,12 @@ bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& ne return false; } break; -#endif case EbtInt: switch (src) { case EbtUint: newOp = EOpConvUintToInt; break; case EbtBool: newOp = EOpConvBoolToInt; break; case EbtFloat: newOp = EOpConvFloatToInt; break; -#ifndef GLSLANG_WEB case EbtInt8: newOp = EOpConvInt8ToInt; break; case EbtUint8: newOp = EOpConvUint8ToInt; break; case EbtInt16: newOp = EOpConvInt16ToInt; break; @@ -731,7 +718,6 @@ bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& ne case EbtFloat16: newOp = EOpConvFloat16ToInt; break; case EbtInt64: newOp = EOpConvInt64ToInt; break; case EbtUint64: newOp = EOpConvUint64ToInt; break; -#endif default: return false; } @@ -741,7 +727,6 @@ bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& ne case EbtInt: newOp = EOpConvIntToUint; break; case EbtBool: newOp = EOpConvBoolToUint; break; case EbtFloat: newOp = EOpConvFloatToUint; break; -#ifndef GLSLANG_WEB case EbtInt8: newOp = EOpConvInt8ToUint; break; case EbtUint8: newOp = EOpConvUint8ToUint; break; case EbtInt16: newOp = EOpConvInt16ToUint; break; @@ -750,12 +735,15 @@ bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& ne case EbtFloat16: newOp = EOpConvFloat16ToUint; break; case EbtInt64: newOp = EOpConvInt64ToUint; break; case EbtUint64: newOp = EOpConvUint64ToUint; break; -#endif + // For bindless texture type conversion, add a dummy convert op, just + // to generate a new TIntermTyped + // uvec2(any sampler type) + // uvec2(any image type) + case EbtSampler: newOp = EOpConvIntToUint; break; default: return false; } break; -#ifndef GLSLANG_WEB case EbtInt64: switch (src) { case EbtInt8: newOp = EOpConvInt8ToInt64; break; @@ -790,7 +778,6 @@ bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& ne return false; } break; -#endif default: return false; } @@ -806,7 +793,6 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped // Add a new newNode for the conversion. // -#ifndef GLSLANG_WEB bool convertToIntTypes = (convertTo == EbtInt8 || convertTo == EbtUint8 || convertTo == EbtInt16 || convertTo == EbtUint16 || convertTo == EbtInt || convertTo == EbtUint || @@ -843,7 +829,6 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped return nullptr; } } -#endif TIntermUnary* newNode = nullptr; TOperator newOp = EOpNull; @@ -855,13 +840,11 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped newNode = addUnaryNode(newOp, node, node->getLoc(), newType); if (node->getAsConstantUnion()) { -#ifndef GLSLANG_WEB // 8/16-bit storage extensions don't support 8/16-bit constants, so don't fold conversions // to those types if ((getArithemeticInt8Enabled() || !(convertTo == EbtInt8 || convertTo == EbtUint8)) && (getArithemeticInt16Enabled() || !(convertTo == EbtInt16 || convertTo == EbtUint16)) && (getArithemeticFloat16Enabled() || !(convertTo == EbtFloat16))) -#endif { TIntermTyped* folded = node->getAsConstantUnion()->fold(newOp, newType); if (folded) @@ -1044,6 +1027,12 @@ TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TInt if (type.isArray() || node->getType().isArray()) return nullptr; + // Reject implicit conversions to cooperative matrix types + if (node->getType().isCoopMat() && + op != EOpConstructCooperativeMatrixNV && + op != EOpConstructCooperativeMatrixKHR) + return nullptr; + // Note: callers are responsible for other aspects of shape, // like vector and matrix sizes. @@ -1055,7 +1044,6 @@ TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TInt case EOpConstructFloat: case EOpConstructInt: case EOpConstructUint: -#ifndef GLSLANG_WEB case EOpConstructDouble: case EOpConstructFloat16: case EOpConstructInt8: @@ -1066,8 +1054,6 @@ TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TInt case EOpConstructUint64: break; -#endif - // // Implicit conversions // @@ -1112,7 +1098,8 @@ TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TInt case EOpSequence: case EOpConstructStruct: - case EOpConstructCooperativeMatrix: + case EOpConstructCooperativeMatrixNV: + case EOpConstructCooperativeMatrixKHR: if (type.isReference() || node->getType().isReference()) { // types must match to assign a reference @@ -1154,7 +1141,6 @@ TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TInt } bool canPromoteConstant = true; -#ifndef GLSLANG_WEB // GL_EXT_shader_16bit_storage can't do OpConstantComposite with // 16-bit types, so disable promotion for those types. // Many issues with this, from JohnK: @@ -1182,7 +1168,6 @@ TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TInt default: break; } -#endif if (canPromoteConstant && node->getAsConstantUnion()) return promoteConstantUnion(type.getBasicType(), node->getAsConstantUnion()); @@ -1479,10 +1464,6 @@ bool TIntermediate::isFPPromotion(TBasicType from, TBasicType to) const bool TIntermediate::isIntegralConversion(TBasicType from, TBasicType to) const { -#ifdef GLSLANG_WEB - return false; -#endif - switch (from) { case EbtInt: switch(to) { @@ -1563,10 +1544,6 @@ bool TIntermediate::isIntegralConversion(TBasicType from, TBasicType to) const bool TIntermediate::isFPConversion(TBasicType from, TBasicType to) const { -#ifdef GLSLANG_WEB - return false; -#endif - if (to == EbtFloat && from == EbtFloat16) { return true; } else { @@ -1587,7 +1564,6 @@ bool TIntermediate::isFPIntegralConversion(TBasicType from, TBasicType to) const break; } break; -#ifndef GLSLANG_WEB case EbtInt8: case EbtUint8: case EbtInt16: @@ -1607,7 +1583,6 @@ bool TIntermediate::isFPIntegralConversion(TBasicType from, TBasicType to) const return true; } break; -#endif default: break; } @@ -1809,10 +1784,6 @@ bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperat static bool canSignedIntTypeRepresentAllUnsignedValues(TBasicType sintType, TBasicType uintType) { -#ifdef GLSLANG_WEB - return false; -#endif - switch(sintType) { case EbtInt8: switch(uintType) { @@ -1873,11 +1844,6 @@ static bool canSignedIntTypeRepresentAllUnsignedValues(TBasicType sintType, TBas static TBasicType getCorrespondingUnsignedType(TBasicType type) { -#ifdef GLSLANG_WEB - assert(type == EbtInt); - return EbtUint; -#endif - switch(type) { case EbtInt8: return EbtUint8; @@ -2003,8 +1969,11 @@ TOperator TIntermediate::mapTypeToConstructorOp(const TType& type) const if (type.getQualifier().isNonUniform()) return EOpConstructNonuniform; - if (type.isCoopMat()) - return EOpConstructCooperativeMatrix; + if (type.isCoopMatNV()) + return EOpConstructCooperativeMatrixNV; + + if (type.isCoopMatKHR()) + return EOpConstructCooperativeMatrixKHR; switch (type.getBasicType()) { case EbtStruct: @@ -2167,7 +2136,6 @@ TOperator TIntermediate::mapTypeToConstructorOp(const TType& type) const } } break; -#ifndef GLSLANG_WEB case EbtDouble: if (type.getMatrixCols()) { switch (type.getMatrixCols()) { @@ -2306,7 +2274,6 @@ TOperator TIntermediate::mapTypeToConstructorOp(const TType& type) const case EbtAccStruct: op = EOpConstructAccStruct; break; -#endif default: break; } @@ -2787,7 +2754,6 @@ bool TIntermediate::postProcess(TIntermNode* root, EShLanguage /*language*/) if (aggRoot && aggRoot->getOp() == EOpNull) aggRoot->setOperator(EOpSequence); -#ifndef GLSLANG_WEB // Propagate 'noContraction' label in backward from 'precise' variables. glslang::PropagateNoContraction(*this); @@ -2801,7 +2767,6 @@ bool TIntermediate::postProcess(TIntermNode* root, EShLanguage /*language*/) assert(0); break; } -#endif return true; } @@ -3521,20 +3486,28 @@ bool TIntermediate::promoteBinary(TIntermBinary& node) } if (left->getType().isCoopMat() || right->getType().isCoopMat()) { + // Operations on two cooperative matrices must have identical types if (left->getType().isCoopMat() && right->getType().isCoopMat() && - *left->getType().getTypeParameters() != *right->getType().getTypeParameters()) { + left->getType() != right->getType()) { return false; } switch (op) { case EOpMul: case EOpMulAssign: - if (left->getType().isCoopMat() && right->getType().isCoopMat()) { + // Mul not supported in NV_cooperative_matrix + if (left->getType().isCoopMatNV() && right->getType().isCoopMatNV()) { return false; } - if (op == EOpMulAssign && right->getType().isCoopMat()) { + // NV_cooperative_matrix supports MulAssign is for mat*=scalar only. + // KHR_cooperative_matrix supports it for mat*=mat as well. + if (op == EOpMulAssign && right->getType().isCoopMatNV()) { return false; } - node.setOp(op == EOpMulAssign ? EOpMatrixTimesScalarAssign : EOpMatrixTimesScalar); + // Use MatrixTimesScalar if either operand is not a matrix. Otherwise use Mul. + if (!left->getType().isCoopMat() || !right->getType().isCoopMat()) { + node.setOp(op == EOpMulAssign ? EOpMatrixTimesScalarAssign : EOpMatrixTimesScalar); + } + // In case of scalar*matrix, take the result type from the matrix. if (right->getType().isCoopMat()) { node.setType(right->getType()); } @@ -3887,16 +3860,6 @@ TIntermTyped* TIntermediate::promoteConstantUnion(TBasicType promoteTo, TIntermC #define PROMOTE(Set, CType, Get) leftUnionArray[i].Set(static_cast(rightUnionArray[i].Get())) #define PROMOTE_TO_BOOL(Get) leftUnionArray[i].setBConst(rightUnionArray[i].Get() != 0) -#ifdef GLSLANG_WEB -#define TO_ALL(Get) \ - switch (promoteTo) { \ - case EbtFloat: PROMOTE(setDConst, double, Get); break; \ - case EbtInt: PROMOTE(setIConst, int, Get); break; \ - case EbtUint: PROMOTE(setUConst, unsigned int, Get); break; \ - case EbtBool: PROMOTE_TO_BOOL(Get); break; \ - default: return node; \ - } -#else #define TO_ALL(Get) \ switch (promoteTo) { \ case EbtFloat16: PROMOTE(setDConst, double, Get); break; \ @@ -3913,14 +3876,12 @@ TIntermTyped* TIntermediate::promoteConstantUnion(TBasicType promoteTo, TIntermC case EbtBool: PROMOTE_TO_BOOL(Get); break; \ default: return node; \ } -#endif switch (node->getType().getBasicType()) { case EbtFloat: TO_ALL(getDConst); break; case EbtInt: TO_ALL(getIConst); break; case EbtUint: TO_ALL(getUConst); break; case EbtBool: TO_ALL(getBConst); break; -#ifndef GLSLANG_WEB case EbtFloat16: TO_ALL(getDConst); break; case EbtDouble: TO_ALL(getDConst); break; case EbtInt8: TO_ALL(getI8Const); break; @@ -3929,7 +3890,6 @@ TIntermTyped* TIntermediate::promoteConstantUnion(TBasicType promoteTo, TIntermC case EbtUint8: TO_ALL(getU8Const); break; case EbtUint16: TO_ALL(getU16Const); break; case EbtUint64: TO_ALL(getU64Const); break; -#endif default: return node; } } diff --git a/third_party/glslang/glslang/MachineIndependent/ParseContextBase.cpp b/third_party/glslang/glslang/MachineIndependent/ParseContextBase.cpp index 616580f993e..d73f403b801 100644 --- a/third_party/glslang/glslang/MachineIndependent/ParseContextBase.cpp +++ b/third_party/glslang/glslang/MachineIndependent/ParseContextBase.cpp @@ -67,8 +67,6 @@ void TParseContextBase::outputMessage(const TSourceLoc& loc, const char* szReaso } } -#if !defined(GLSLANG_WEB) || defined(GLSLANG_WEB_DEVEL) - void C_DECL TParseContextBase::error(const TSourceLoc& loc, const char* szReason, const char* szToken, const char* szExtraInfoFormat, ...) { @@ -118,8 +116,6 @@ void C_DECL TParseContextBase::ppWarn(const TSourceLoc& loc, const char* szReaso va_end(args); } -#endif - // // Both test and if necessary, spit out an error, to see if the node is really // an l-value that can be operated on this way. @@ -140,7 +136,6 @@ bool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op, case EvqConst: message = "can't modify a const"; break; case EvqConstReadOnly: message = "can't modify a const"; break; case EvqUniform: message = "can't modify a uniform"; break; -#ifndef GLSLANG_WEB case EvqBuffer: if (node->getQualifier().isReadOnly()) message = "can't modify a readonly buffer"; @@ -151,7 +146,6 @@ bool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op, if (language != EShLangIntersect) message = "cannot modify hitAttributeNV in this stage"; break; -#endif default: // @@ -159,12 +153,12 @@ bool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op, // switch (node->getBasicType()) { case EbtSampler: - message = "can't modify a sampler"; + if (extensionTurnedOn(E_GL_ARB_bindless_texture) == false) + message = "can't modify a sampler"; break; case EbtVoid: message = "can't modify void"; break; -#ifndef GLSLANG_WEB case EbtAtomicUint: message = "can't modify an atomic_uint"; break; @@ -174,7 +168,9 @@ bool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op, case EbtRayQuery: message = "can't modify rayQueryEXT"; break; -#endif + case EbtHitObjectNV: + message = "can't modify hitObjectNV"; + break; default: break; } @@ -231,12 +227,12 @@ bool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op, // Test for and give an error if the node can't be read from. void TParseContextBase::rValueErrorCheck(const TSourceLoc& loc, const char* op, TIntermTyped* node) { - TIntermBinary* binaryNode = node->getAsBinaryNode(); - const TIntermSymbol* symNode = node->getAsSymbolNode(); - if (! node) return; + TIntermBinary* binaryNode = node->getAsBinaryNode(); + const TIntermSymbol* symNode = node->getAsSymbolNode(); + if (node->getQualifier().isWriteOnly()) { const TIntermTyped* leftMostTypeNode = TIntermediate::findLValueBase(node, true); diff --git a/third_party/glslang/glslang/MachineIndependent/ParseHelper.cpp b/third_party/glslang/glslang/MachineIndependent/ParseHelper.cpp index e2ac43ca19c..592e9aa8ada 100644 --- a/third_party/glslang/glslang/MachineIndependent/ParseHelper.cpp +++ b/third_party/glslang/glslang/MachineIndependent/ParseHelper.cpp @@ -38,6 +38,7 @@ // #include "ParseHelper.h" +#include "Initialize.h" #include "Scan.h" #include "../OSDependent/osinclude.h" @@ -57,11 +58,8 @@ TParseContext::TParseContext(TSymbolTable& symbolTable, TIntermediate& interm, b infoSink, forwardCompatible, messages, entryPoint), inMain(false), blockName(nullptr), - limits(resources.limits) -#ifndef GLSLANG_WEB - , + limits(resources.limits), atomicUintOffsets(nullptr), anyIndexLimits(false) -#endif { // decide whether precision qualifiers should be ignored or respected if (isEsProfile() || spvVersion.vulkan > 0) { @@ -80,10 +78,6 @@ TParseContext::TParseContext(TSymbolTable& symbolTable, TIntermediate& interm, b globalBufferDefaults.layoutMatrix = ElmColumnMajor; globalBufferDefaults.layoutPacking = spvVersion.spv != 0 ? ElpStd430 : ElpShared; - // use storage buffer on SPIR-V 1.3 and up - if (spvVersion.spv >= EShTargetSpv_1_3) - intermediate.setUseStorageBuffer(); - globalInputDefaults.clear(); globalOutputDefaults.clear(); @@ -91,7 +85,6 @@ TParseContext::TParseContext(TSymbolTable& symbolTable, TIntermediate& interm, b globalSharedDefaults.layoutMatrix = ElmColumnMajor; globalSharedDefaults.layoutPacking = ElpStd430; -#ifndef GLSLANG_WEB // "Shaders in the transform // feedback capturing mode have an initial global default of // layout(xfb_buffer = 0) out;" @@ -103,7 +96,6 @@ TParseContext::TParseContext(TSymbolTable& symbolTable, TIntermediate& interm, b if (language == EShLangGeometry) globalOutputDefaults.layoutStream = 0; -#endif if (entryPoint != nullptr && entryPoint->size() > 0 && *entryPoint != "main") infoSink.info.message(EPrefixError, "Source entry point must be \"main\""); @@ -111,9 +103,7 @@ TParseContext::TParseContext(TSymbolTable& symbolTable, TIntermediate& interm, b TParseContext::~TParseContext() { -#ifndef GLSLANG_WEB delete [] atomicUintOffsets; -#endif } // Set up all default precisions as needed by the current environment. @@ -177,7 +167,6 @@ void TParseContext::setLimits(const TBuiltInResource& r) resources = r; intermediate.setLimits(r); -#ifndef GLSLANG_WEB anyIndexLimits = ! limits.generalAttributeMatrixVectorIndexing || ! limits.generalConstantMatrixVectorIndexing || ! limits.generalSamplerIndexing || @@ -192,7 +181,6 @@ void TParseContext::setLimits(const TBuiltInResource& r) atomicUintOffsets = new int[resources.maxAtomicCounterBindings]; for (int b = 0; b < resources.maxAtomicCounterBindings; ++b) atomicUintOffsets[b] = 0; -#endif } // @@ -339,7 +327,6 @@ void TParseContext::setInvariant(const TSourceLoc& loc, const char* builtin) { void TParseContext::handlePragma(const TSourceLoc& loc, const TVector& tokens) { -#ifndef GLSLANG_WEB if (pragmaCallback) pragmaCallback(loc.line, tokens); @@ -441,7 +428,6 @@ void TParseContext::handlePragma(const TSourceLoc& loc, const TVector& setInvariant(loc, "gl_FragColor"); setInvariant(loc, "gl_FragData"); } -#endif } // @@ -455,7 +441,6 @@ TIntermTyped* TParseContext::handleVariable(const TSourceLoc& loc, TSymbol* symb if (symbol && symbol->getNumExtensions()) requireExtensions(loc, symbol->getNumExtensions(), symbol->getExtensions(), symbol->getName().c_str()); -#ifndef GLSLANG_WEB if (symbol && symbol->isReadOnly()) { // All shared things containing an unsized array must be copied up // on first use, so that all future references will share its array structure, @@ -475,7 +460,6 @@ TIntermTyped* TParseContext::handleVariable(const TSourceLoc& loc, TSymbol* symb makeEditable(symbol); } } -#endif const TVariable* variable; const TAnonMember* anon = symbol ? symbol->getAsAnonMember() : nullptr; @@ -580,7 +564,6 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn // at least one of base and index is not a front-end constant variable... TIntermTyped* result = nullptr; -#ifndef GLSLANG_WEB if (base->isReference() && ! base->isArray()) { requireExtensions(loc, 1, &E_GL_EXT_buffer_reference2, "buffer reference indexing"); if (base->getType().getReferentType()->containsUnsizedArray()) { @@ -599,15 +582,22 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn } if (base->getAsSymbolNode() && isIoResizeArray(base->getType())) handleIoResizeArrayAccess(loc, base); -#endif if (index->getQualifier().isFrontEndConstant()) checkIndex(loc, base->getType(), indexValue); if (index->getQualifier().isFrontEndConstant()) { -#ifndef GLSLANG_WEB if (base->getType().isUnsizedArray()) { base->getWritableType().updateImplicitArraySize(indexValue + 1); + base->getWritableType().setImplicitlySized(true); + if (base->getQualifier().builtIn == EbvClipDistance && + indexValue >= resources.maxClipDistances) { + error(loc, "gl_ClipDistance", "[", "array index out of range '%d'", indexValue); + } + else if (base->getQualifier().builtIn == EbvCullDistance && + indexValue >= resources.maxCullDistances) { + error(loc, "gl_CullDistance", "[", "array index out of range '%d'", indexValue); + } // For 2D per-view builtin arrays, update the inner dimension size in parent type if (base->getQualifier().isPerView() && base->getQualifier().builtIn != EbvNone) { TIntermBinary* binaryNode = base->getAsBinaryNode(); @@ -619,11 +609,9 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn } } } else -#endif checkIndex(loc, base->getType(), indexValue); result = intermediate.addIndex(EOpIndexDirect, base, index, loc); } else { -#ifndef GLSLANG_WEB if (base->getType().isUnsizedArray()) { // we have a variable index into an unsized array, which is okay, // depending on the situation @@ -635,7 +623,6 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn } base->getWritableType().setArrayVariablyIndexed(); } -#endif if (base->getBasicType() == EbtBlock) { if (base->getQualifier().storage == EvqBuffer) requireProfile(base->getLoc(), ~EEsProfile, "variable indexing buffer block array"); @@ -671,7 +658,6 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn } result->setType(newType); -#ifndef GLSLANG_WEB inheritMemoryQualifiers(base->getQualifier(), result->getWritableType().getQualifier()); // Propagate nonuniform @@ -680,13 +666,10 @@ TIntermTyped* TParseContext::handleBracketDereference(const TSourceLoc& loc, TIn if (anyIndexLimits) handleIndexLimits(loc, base, index); -#endif return result; } -#ifndef GLSLANG_WEB - // for ES 2.0 (version 100) limitations for almost all index operations except vertex-shader uniforms void TParseContext::handleIndexLimits(const TSourceLoc& /*loc*/, TIntermTyped* base, TIntermTyped* index) { @@ -836,12 +819,16 @@ int TParseContext::getIoArrayImplicitSize(const TQualifier &qualifier, TString * } else if (language == EShLangMesh) { unsigned int maxPrimitives = intermediate.getPrimitives() != TQualifier::layoutNotSet ? intermediate.getPrimitives() : 0; - if (qualifier.builtIn == EbvPrimitiveIndicesNV || qualifier.builtIn == EbvPrimitiveTriangleIndicesEXT || - qualifier.builtIn == EbvPrimitiveLineIndicesEXT || qualifier.builtIn == EbvPrimitivePointIndicesEXT) { + if (qualifier.builtIn == EbvPrimitiveIndicesNV) { expectedSize = maxPrimitives * TQualifier::mapGeometryToSize(intermediate.getOutputPrimitive()); str = "max_primitives*"; str += TQualifier::getGeometryString(intermediate.getOutputPrimitive()); } + else if (qualifier.builtIn == EbvPrimitiveTriangleIndicesEXT || qualifier.builtIn == EbvPrimitiveLineIndicesEXT || + qualifier.builtIn == EbvPrimitivePointIndicesEXT) { + expectedSize = maxPrimitives; + str = "max_primitives"; + } else if (qualifier.isPerPrimitive()) { expectedSize = maxPrimitives; str = "max_primitives"; @@ -876,8 +863,6 @@ void TParseContext::checkIoArrayConsistency(const TSourceLoc& loc, int requiredS } } -#endif // GLSLANG_WEB - // Handle seeing a binary node with a math operation. // Returns nullptr if not semantically allowed. TIntermTyped* TParseContext::handleBinaryMath(const TSourceLoc& loc, const char* str, TOperator op, TIntermTyped* left, TIntermTyped* right) @@ -1022,14 +1007,22 @@ TIntermTyped* TParseContext::handleDotDereference(const TSourceLoc& loc, TInterm inheritMemoryQualifiers(base->getQualifier(), result->getWritableType().getQualifier()); } else { auto baseSymbol = base; - while (baseSymbol->getAsSymbolNode() == nullptr) - baseSymbol = baseSymbol->getAsBinaryNode()->getLeft(); - TString structName; - structName.append("\'").append(baseSymbol->getAsSymbolNode()->getName().c_str()).append( "\'"); - error(loc, "no such field in structure", field.c_str(), structName.c_str()); + while (baseSymbol->getAsSymbolNode() == nullptr) { + auto binaryNode = baseSymbol->getAsBinaryNode(); + if (binaryNode == nullptr) break; + baseSymbol = binaryNode->getLeft(); + } + if (baseSymbol->getAsSymbolNode() != nullptr) { + TString structName; + structName.append("\'").append(baseSymbol->getAsSymbolNode()->getName().c_str()).append("\'"); + error(loc, "no such field in structure", field.c_str(), structName.c_str()); + } else { + error(loc, "no such field in structure", field.c_str(), ""); + } } } else - error(loc, "does not apply to this type:", field.c_str(), base->getType().getCompleteString(intermediate.getEnhancedMsgs()).c_str()); + error(loc, "does not apply to this type:", field.c_str(), + base->getType().getCompleteString(intermediate.getEnhancedMsgs()).c_str()); // Propagate noContraction up the dereference chain if (base->getQualifier().isNoContraction()) @@ -1148,7 +1141,6 @@ TFunction* TParseContext::handleFunctionDeclarator(const TSourceLoc& loc, TFunct TSymbol* symbol = symbolTable.find(function.getMangledName(), &builtIn); if (symbol && symbol->getAsFunction() && builtIn) requireProfile(loc, ~EEsProfile, "redefinition of built-in function"); -#ifndef GLSLANG_WEB // Check the validity of using spirv_literal qualifier for (int i = 0; i < function.getParamCount(); ++i) { if (function[i].type->getQualifier().isSpirvLiteral() && function.getBuiltInOp() != EOpSpirvInst) @@ -1160,19 +1152,16 @@ TFunction* TParseContext::handleFunctionDeclarator(const TSourceLoc& loc, TFunct // respect this redeclared one. if (symbol && builtIn && function.getBuiltInOp() == EOpSpirvInst) symbol = nullptr; -#endif - const TFunction* prevDec = symbol ? symbol->getAsFunction() : 0; + const TFunction* prevDec = symbol ? symbol->getAsFunction() : nullptr; if (prevDec) { if (prevDec->isPrototyped() && prototype) profileRequires(loc, EEsProfile, 300, nullptr, "multiple prototypes for same function"); if (prevDec->getType() != function.getType()) error(loc, "overloaded functions must have the same return type", function.getName().c_str(), ""); -#ifndef GLSLANG_WEB if (prevDec->getSpirvInstruction() != function.getSpirvInstruction()) { error(loc, "overloaded functions must have the same qualifiers", function.getName().c_str(), "spirv_instruction"); } -#endif for (int i = 0; i < prevDec->getParamCount(); ++i) { if ((*prevDec)[i].type->getQualifier().storage != function[i].type->getQualifier().storage) error(loc, "overloaded functions must have the same parameter storage qualifiers for argument", function[i].type->getStorageQualifierString(), "%d", i+1); @@ -1254,6 +1243,8 @@ TIntermAggregate* TParseContext::handleFunctionDefinition(const TSourceLoc& loc, error(loc, "function cannot take any parameter(s)", function.getName().c_str(), ""); if (function.getType().getBasicType() != EbtVoid) error(loc, "", function.getType().getBasicTypeString().c_str(), "entry point cannot return a value"); + if (function.getLinkType() != ELinkNone) + error(loc, "main function cannot be exported", "", ""); } // @@ -1290,6 +1281,7 @@ TIntermAggregate* TParseContext::handleFunctionDefinition(const TSourceLoc& loc, } else paramNodes = intermediate.growAggregate(paramNodes, intermediate.addSymbol(*param.type, loc), loc); } + paramNodes->setLinkType(function.getLinkType()); intermediate.setAggregateOperator(paramNodes, EOpParameters, TType(EbtVoid), loc); loopNestingLevel = 0; statementNestingLevel = 0; @@ -1374,7 +1366,6 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction if (lValueErrorCheck(arguments->getLoc(), "assign", arg->getAsTyped())) error(arguments->getLoc(), "Non-L-value cannot be passed for 'out' or 'inout' parameters.", "out", ""); } -#ifndef GLSLANG_WEB if (formalQualifier.isSpirvLiteral()) { if (!arg->getAsTyped()->getQualifier().isFrontEndConstant()) { error(arguments->getLoc(), @@ -1382,12 +1373,11 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction "spirv_literal", ""); } } -#endif const TType& argType = arg->getAsTyped()->getType(); const TQualifier& argQualifier = argType.getQualifier(); - if (argQualifier.isMemory() && (argType.containsOpaque() || argType.isReference())) { + bool containsBindlessSampler = intermediate.getBindlessMode() && argType.containsSampler(); + if (argQualifier.isMemory() && !containsBindlessSampler && (argType.containsOpaque() || argType.isReference())) { const char* message = "argument cannot drop memory qualifier when passed to formal parameter"; -#ifndef GLSLANG_WEB if (argQualifier.volatil && ! formalQualifier.volatil) error(arguments->getLoc(), message, "volatile", ""); if (argQualifier.coherent && ! (formalQualifier.devicecoherent || formalQualifier.coherent)) @@ -1407,7 +1397,6 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction // Don't check 'restrict', it is different than the rest: // "...but only restrict can be taken away from a calling argument, by a formal parameter that // lacks the restrict qualifier..." -#endif } if (!builtIn && argQualifier.getFormat() != formalQualifier.getFormat()) { // we have mismatched formats, which should only be allowed if writeonly @@ -1437,11 +1426,9 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction if (builtIn && fnCandidate->getBuiltInOp() != EOpNull) { // A function call mapped to a built-in operation. result = handleBuiltInFunctionCall(loc, arguments, *fnCandidate); -#ifndef GLSLANG_WEB } else if (fnCandidate->getBuiltInOp() == EOpSpirvInst) { // When SPIR-V instruction qualifier is specified, the function call is still mapped to a built-in operation. result = handleBuiltInFunctionCall(loc, arguments, *fnCandidate); -#endif } else { // This is a function call not mapped to built-in operator. // It could still be a built-in function, but only if PureOperatorBuiltins == false. @@ -1461,11 +1448,9 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction intermediate.addToCallGraph(infoSink, currentCaller, fnCandidate->getMangledName()); } -#ifndef GLSLANG_WEB if (builtIn) nonOpBuiltInCheck(loc, *fnCandidate, *call); else -#endif userFunctionCallCheck(loc, *call); } @@ -1483,7 +1468,8 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction if (result->getAsTyped()->getType().isCoopMat() && !result->getAsTyped()->getType().isParameterized()) { - assert(fnCandidate->getBuiltInOp() == EOpCooperativeMatrixMulAdd); + assert(fnCandidate->getBuiltInOp() == EOpCooperativeMatrixMulAdd || + fnCandidate->getBuiltInOp() == EOpCooperativeMatrixMulAddNV); result->setType(result->getAsAggregate()->getSequence()[2]->getAsTyped()->getType()); } @@ -1519,7 +1505,6 @@ TIntermTyped* TParseContext::handleBuiltInFunctionCall(TSourceLoc loc, TIntermNo } else if (result->getAsOperator()) builtInOpCheck(loc, function, *result->getAsOperator()); -#ifndef GLSLANG_WEB // Special handling for function call with SPIR-V instruction qualifier specified if (function.getBuiltInOp() == EOpSpirvInst) { if (auto agg = result->getAsAggregate()) { @@ -1546,7 +1531,6 @@ TIntermTyped* TParseContext::handleBuiltInFunctionCall(TSourceLoc loc, TIntermNo } else assert(0); } -#endif return result; } @@ -1649,9 +1633,7 @@ void TParseContext::computeBuiltinPrecisions(TIntermTyped& node, const TFunction TIntermNode* TParseContext::handleReturnValue(const TSourceLoc& loc, TIntermTyped* value) { -#ifndef GLSLANG_WEB storage16BitAssignmentCheck(loc, value->getType(), "return"); -#endif functionReturnsValue = true; TIntermBranch* branch = nullptr; @@ -1671,9 +1653,13 @@ TIntermNode* TParseContext::handleReturnValue(const TSourceLoc& loc, TIntermType error(loc, "type does not match, or is not convertible to, the function's return type", "return", ""); branch = intermediate.addBranch(EOpReturn, value, loc); } - } else + } else { + if (value->getType().isTexture() || value->getType().isImage()) { + if (!extensionTurnedOn(E_GL_ARB_bindless_texture)) + error(loc, "sampler or image can be used as return type only when the extension GL_ARB_bindless_texture enabled", "return", ""); + } branch = intermediate.addBranch(EOpReturn, value, loc); - + } branch->updatePrecision(currentFunctionType->getQualifier().precision); return branch; } @@ -1681,7 +1667,6 @@ TIntermNode* TParseContext::handleReturnValue(const TSourceLoc& loc, TIntermType // See if the operation is being done in an illegal location. void TParseContext::checkLocation(const TSourceLoc& loc, TOperator op) { -#ifndef GLSLANG_WEB switch (op) { case EOpBarrier: if (language == EShLangTessControl) { @@ -1734,7 +1719,6 @@ void TParseContext::checkLocation(const TSourceLoc& loc, TOperator op) default: break; } -#endif } // Finish processing object.length(). This started earlier in handleDotDereference(), where @@ -1752,7 +1736,6 @@ TIntermTyped* TParseContext::handleLengthMethod(const TSourceLoc& loc, TFunction const TType& type = intermNode->getAsTyped()->getType(); if (type.isArray()) { if (type.isUnsizedArray()) { -#ifndef GLSLANG_WEB if (intermNode->getAsSymbolNode() && isIoResizeArray(type)) { // We could be between a layout declaration that gives a built-in io array implicit size and // a user redeclaration of that array, meaning we have to substitute its implicit size here @@ -1764,16 +1747,13 @@ TIntermTyped* TParseContext::handleLengthMethod(const TSourceLoc& loc, TFunction length = getIoArrayImplicitSize(type.getQualifier()); } } -#endif if (length == 0) { -#ifndef GLSLANG_WEB if (intermNode->getAsSymbolNode() && isIoResizeArray(type)) error(loc, "", function->getName().c_str(), "array must first be sized by a redeclaration or layout qualifier"); else if (isRuntimeLength(*intermNode->getAsTyped())) { // Create a unary op and let the back end handle it return intermediate.addBuiltInFunctionCall(loc, EOpArrayLength, true, intermNode, TType(EbtInt)); } else -#endif error(loc, "", function->getName().c_str(), "array must be declared with a size before using this method"); } } else if (type.getOuterArrayNode()) { @@ -1806,7 +1786,6 @@ TIntermTyped* TParseContext::handleLengthMethod(const TSourceLoc& loc, TFunction // void TParseContext::addInputArgumentConversions(const TFunction& function, TIntermNode*& arguments) const { -#ifndef GLSLANG_WEB TIntermAggregate* aggregate = arguments->getAsAggregate(); // Process each argument's conversion @@ -1834,7 +1813,6 @@ void TParseContext::addInputArgumentConversions(const TFunction& function, TInte } } } -#endif } // @@ -1846,9 +1824,6 @@ void TParseContext::addInputArgumentConversions(const TFunction& function, TInte // TIntermTyped* TParseContext::addOutputArgumentConversions(const TFunction& function, TIntermAggregate& intermNode) const { -#ifdef GLSLANG_WEB - return &intermNode; -#else TIntermSequence& arguments = intermNode.getSequence(); // Will there be any output conversions? @@ -1916,7 +1891,6 @@ TIntermTyped* TParseContext::addOutputArgumentConversions(const TFunction& funct conversionTree = intermediate.setAggregateOperator(conversionTree, EOpComma, intermNode.getType(), intermNode.getLoc()); return conversionTree; -#endif } TIntermTyped* TParseContext::addAssign(const TSourceLoc& loc, TOperator op, TIntermTyped* left, TIntermTyped* right) @@ -1924,6 +1898,9 @@ TIntermTyped* TParseContext::addAssign(const TSourceLoc& loc, TOperator op, TInt if ((op == EOpAddAssign || op == EOpSubAssign) && left->isReference()) requireExtensions(loc, 1, &E_GL_EXT_buffer_reference2, "+= and -= on a buffer reference"); + if (op == EOpAssign && left->getBasicType() == EbtSampler && right->getBasicType() == EbtSampler) + requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, "sampler assignment for bindless texture"); + return intermediate.addAssign(op, left, right, loc); } @@ -2123,7 +2100,6 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan TString featureString; const char* feature = nullptr; switch (callNode.getOp()) { -#ifndef GLSLANG_WEB case EOpTextureGather: case EOpTextureGatherOffset: case EOpTextureGatherOffsets: @@ -2196,6 +2172,37 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan } break; } + + case EOpTexture: + case EOpTextureLod: + { + if ((fnCandidate.getParamCount() > 2) && ((*argp)[1]->getAsTyped()->getType().getBasicType() == EbtFloat) && + ((*argp)[1]->getAsTyped()->getType().getVectorSize() == 4) && fnCandidate[0].type->getSampler().shadow) { + featureString = fnCandidate.getName(); + if (callNode.getOp() == EOpTexture) + featureString += "(..., float bias)"; + else + featureString += "(..., float lod)"; + feature = featureString.c_str(); + + if ((fnCandidate[0].type->getSampler().dim == Esd2D && fnCandidate[0].type->getSampler().arrayed) || //2D Array Shadow + (fnCandidate[0].type->getSampler().dim == EsdCube && fnCandidate[0].type->getSampler().arrayed && fnCandidate.getParamCount() > 3) || // Cube Array Shadow + (fnCandidate[0].type->getSampler().dim == EsdCube && callNode.getOp() == EOpTextureLod)) { // Cube Shadow + requireExtensions(loc, 1, &E_GL_EXT_texture_shadow_lod, feature); + if (isEsProfile()) { + if (version < 320 && + !extensionsTurnedOn(Num_AEP_texture_cube_map_array, AEP_texture_cube_map_array)) + error(loc, "GL_EXT_texture_shadow_lod not supported for this ES version", feature, ""); + else + profileRequires(loc, EEsProfile, 320, nullptr, feature); + } else { // Desktop + profileRequires(loc, ~EEsProfile, 130, nullptr, feature); + } + } + } + break; + } + case EOpSparseTextureGather: case EOpSparseTextureGatherOffset: case EOpSparseTextureGatherOffsets: @@ -2264,7 +2271,6 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan break; } -#endif case EOpTextureOffset: case EOpTextureFetchOffset: @@ -2292,12 +2298,10 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan if (arg > 0) { -#ifndef GLSLANG_WEB bool f16ShadowCompare = (*argp)[1]->getAsTyped()->getBasicType() == EbtFloat16 && arg0->getType().getSampler().shadow; if (f16ShadowCompare) ++arg; -#endif if (! (*argp)[arg]->getAsTyped()->getQualifier().isConstant()) error(loc, "argument must be compile-time constant", "texel offset", ""); else if ((*argp)[arg]->getAsConstantUnion()) { @@ -2313,18 +2317,41 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan if (callNode.getOp() == EOpTextureOffset) { TSampler s = arg0->getType().getSampler(); if (s.is2D() && s.isArrayed() && s.isShadow()) { - if (isEsProfile()) + if ( + ((*argp)[1]->getAsTyped()->getType().getBasicType() == EbtFloat) && + ((*argp)[1]->getAsTyped()->getType().getVectorSize() == 4) && + (fnCandidate.getParamCount() == 4)) { + featureString = fnCandidate.getName() + " for sampler2DArrayShadow"; + feature = featureString.c_str(); + requireExtensions(loc, 1, &E_GL_EXT_texture_shadow_lod, feature); + profileRequires(loc, EEsProfile, 300, nullptr, feature); + profileRequires(loc, ~EEsProfile, 130, nullptr, feature); + } + else if (isEsProfile()) error(loc, "TextureOffset does not support sampler2DArrayShadow : ", "sampler", "ES Profile"); else if (version <= 420) error(loc, "TextureOffset does not support sampler2DArrayShadow : ", "sampler", "version <= 420"); } } + + if (callNode.getOp() == EOpTextureLodOffset) { + TSampler s = arg0->getType().getSampler(); + if (s.is2D() && s.isArrayed() && s.isShadow() && + ((*argp)[1]->getAsTyped()->getType().getBasicType() == EbtFloat) && + ((*argp)[1]->getAsTyped()->getType().getVectorSize() == 4) && + (fnCandidate.getParamCount() == 4)) { + featureString = fnCandidate.getName() + " for sampler2DArrayShadow"; + feature = featureString.c_str(); + profileRequires(loc, EEsProfile, 300, nullptr, feature); + profileRequires(loc, ~EEsProfile, 130, nullptr, feature); + requireExtensions(loc, 1, &E_GL_EXT_texture_shadow_lod, feature); + } + } } break; } -#ifndef GLSLANG_WEB case EOpTraceNV: if (!(*argp)[10]->getAsConstantUnion()) error(loc, "argument must be compile-time constant", "payload number", "a"); @@ -2356,6 +2383,79 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan } break; + case EOpHitObjectTraceRayNV: + if (!(*argp)[11]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "payload number", ""); + else { + unsigned int location = (*argp)[11]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst(); + if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(0, location) < 0) + error(loc, "with layout(location =", "no rayPayloadEXT/rayPayloadInEXT declared", "%d)", location); + } + break; + case EOpHitObjectTraceRayMotionNV: + if (!(*argp)[12]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "payload number", ""); + else { + unsigned int location = (*argp)[12]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst(); + if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(0, location) < 0) + error(loc, "with layout(location =", "no rayPayloadEXT/rayPayloadInEXT declared", "%d)", location); + } + break; + case EOpHitObjectExecuteShaderNV: + if (!(*argp)[1]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "payload number", ""); + else { + unsigned int location = (*argp)[1]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst(); + if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(0, location) < 0) + error(loc, "with layout(location =", "no rayPayloadEXT/rayPayloadInEXT declared", "%d)", location); + } + break; + case EOpHitObjectRecordHitNV: + if (!(*argp)[12]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "hitobjectattribute number", ""); + else { + unsigned int location = (*argp)[12]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst(); + if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(2, location) < 0) + error(loc, "with layout(location =", "no hitObjectAttributeNV declared", "%d)", location); + } + break; + case EOpHitObjectRecordHitMotionNV: + if (!(*argp)[13]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "hitobjectattribute number", ""); + else { + unsigned int location = (*argp)[13]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst(); + if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(2, location) < 0) + error(loc, "with layout(location =", "no hitObjectAttributeNV declared", "%d)", location); + } + break; + case EOpHitObjectRecordHitWithIndexNV: + if (!(*argp)[11]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "hitobjectattribute number", ""); + else { + unsigned int location = (*argp)[11]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst(); + if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(2, location) < 0) + error(loc, "with layout(location =", "no hitObjectAttributeNV declared", "%d)", location); + } + break; + case EOpHitObjectRecordHitWithIndexMotionNV: + if (!(*argp)[12]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "hitobjectattribute number", ""); + else { + unsigned int location = (*argp)[12]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst(); + if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(2, location) < 0) + error(loc, "with layout(location =", "no hitObjectAttributeNV declared", "%d)", location); + } + break; + case EOpHitObjectGetAttributesNV: + if (!(*argp)[1]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "hitobjectattribute number", ""); + else { + unsigned int location = (*argp)[1]->getAsConstantUnion()->getAsConstantUnion()->getConstArray()[0].getUConst(); + if (!extensionTurnedOn(E_GL_EXT_spirv_intrinsics) && intermediate.checkLocationRT(2, location) < 0) + error(loc, "with layout(location =", "no hitObjectAttributeNV declared", "%d)", location); + } + break; + case EOpRayQueryGetIntersectionType: case EOpRayQueryGetIntersectionT: case EOpRayQueryGetIntersectionInstanceCustomIndex: @@ -2369,6 +2469,7 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan case EOpRayQueryGetIntersectionObjectRayOrigin: case EOpRayQueryGetIntersectionObjectToWorld: case EOpRayQueryGetIntersectionWorldToObject: + case EOpRayQueryGetIntersectionTriangleVertexPositionsEXT: if (!(*argp)[1]->getAsConstantUnion()) error(loc, "argument must be compile-time constant", "committed", ""); break; @@ -2471,11 +2572,18 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan } const TIntermTyped* base = TIntermediate::findLValueBase(arg0, true , true); - const TType* refType = (base->getType().isReference()) ? base->getType().getReferentType() : nullptr; - const TQualifier& qualifier = (refType != nullptr) ? refType->getQualifier() : base->getType().getQualifier(); - if (qualifier.storage != EvqShared && qualifier.storage != EvqBuffer && qualifier.storage != EvqtaskPayloadSharedEXT) - error(loc,"Atomic memory function can only be used for shader storage block member or shared variable.", - fnCandidate.getName().c_str(), ""); + const char* errMsg = "Only l-values corresponding to shader block storage or shared variables can be used with " + "atomic memory functions."; + if (base) { + const TType* refType = (base->getType().isReference()) ? base->getType().getReferentType() : nullptr; + const TQualifier& qualifier = + (refType != nullptr) ? refType->getQualifier() : base->getType().getQualifier(); + if (qualifier.storage != EvqShared && qualifier.storage != EvqBuffer && + qualifier.storage != EvqtaskPayloadSharedEXT) + error(loc, errMsg, fnCandidate.getName().c_str(), ""); + } else { + error(loc, errMsg, fnCandidate.getName().c_str(), ""); + } break; } @@ -2581,7 +2689,6 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan } break; -#endif default: break; @@ -2644,9 +2751,6 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan } } -#ifndef GLSLANG_WEB - -extern bool PureOperatorBuiltins; // Deprecated! Use PureOperatorBuiltins == true instead, in which case this // functionality is handled in builtInOpCheck() instead of here. @@ -2772,8 +2876,6 @@ void TParseContext::nonOpBuiltInCheck(const TSourceLoc& loc, const TFunction& fn } } -#endif - // // Do any extra checking for a user function call. // @@ -2807,6 +2909,14 @@ TFunction* TParseContext::handleConstructorCall(const TSourceLoc& loc, const TPu profileRequires(loc, EEsProfile, 300, nullptr, "arrayed constructor"); } + // Reuse EOpConstructTextureSampler for bindless image constructor + // uvec2 imgHandle; + // imageLoad(image1D(imgHandle), 0); + if (type.isImage() && extensionTurnedOn(E_GL_ARB_bindless_texture)) + { + intermediate.setBindlessImageMode(currentCaller, AstRefTypeFunc); + } + TOperator op = intermediate.mapTypeToConstructorOp(type); if (op == EOpNull) { @@ -2924,7 +3034,6 @@ bool TParseContext::lValueErrorCheck(const TSourceLoc& loc, const char* op, TInt bool errorReturn = false; switch(binaryNode->getOp()) { -#ifndef GLSLANG_WEB case EOpIndexDirect: case EOpIndexIndirect: // ... tessellation control shader ... @@ -2941,7 +3050,6 @@ bool TParseContext::lValueErrorCheck(const TSourceLoc& loc, const char* op, TInt } } break; // left node is checked by base class -#endif case EOpVectorSwizzle: errorReturn = lValueErrorCheck(loc, op, binaryNode->getLeft()); if (!errorReturn) { @@ -3136,7 +3244,7 @@ void TParseContext::reservedPpErrorCheck(const TSourceLoc& loc, const char* iden ppWarn(loc, "\"defined\" is (un)defined:", op, identifier); else ppError(loc, "\"defined\" can't be (un)defined:", op, identifier); - else if (strstr(identifier, "__") != 0 && !extensionTurnedOn(E_GL_EXT_spirv_intrinsics)) { + else if (strstr(identifier, "__") != nullptr && !extensionTurnedOn(E_GL_EXT_spirv_intrinsics)) { // The extension GL_EXT_spirv_intrinsics allows us to declare macros prefixed with "__". if (isEsProfile() && version >= 300 && (strcmp(identifier, "__LINE__") == 0 || @@ -3159,10 +3267,6 @@ void TParseContext::reservedPpErrorCheck(const TSourceLoc& loc, const char* iden // bool TParseContext::lineContinuationCheck(const TSourceLoc& loc, bool endOfComment) { -#ifdef GLSLANG_WEB - return true; -#endif - const char* message = "line continuation"; bool lineContinuationAllowed = (isEsProfile() && version >= 300) || @@ -3219,7 +3323,6 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T // it, in which case the type comes from the argument instead of from the // constructor function. switch (op) { -#ifndef GLSLANG_WEB case EOpConstructNonuniform: if (node != nullptr && node->getAsTyped() != nullptr) { type.shallowCopy(node->getAsTyped()->getType()); @@ -3227,7 +3330,6 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T type.getQualifier().nonUniform = true; } break; -#endif default: type.shallowCopy(function.getType()); break; @@ -3253,7 +3355,6 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T case EOpConstructMat4x2: case EOpConstructMat4x3: case EOpConstructMat4x4: -#ifndef GLSLANG_WEB case EOpConstructDMat2x2: case EOpConstructDMat2x3: case EOpConstructDMat2x4: @@ -3272,7 +3373,6 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T case EOpConstructF16Mat4x2: case EOpConstructF16Mat4x3: case EOpConstructF16Mat4x4: -#endif constructingMatrix = true; break; default: @@ -3339,7 +3439,6 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T if (op == EOpConstructNonuniform) constType = false; -#ifndef GLSLANG_WEB switch (op) { case EOpConstructFloat16: case EOpConstructF16Vec2: @@ -3379,7 +3478,6 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T default: break; } -#endif // inherit constness from children if (constType) { @@ -3400,7 +3498,6 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T case EOpConstructUVec2: case EOpConstructUVec3: case EOpConstructUVec4: -#ifndef GLSLANG_WEB case EOpConstructUint8: case EOpConstructInt16: case EOpConstructUint16: @@ -3424,7 +3521,6 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T case EOpConstructU64Vec2: case EOpConstructU64Vec3: case EOpConstructU64Vec4: -#endif // This was the list of valid ones, if they aren't converting from float // and aren't making an array. makeSpecConst = ! floatArgument && ! type.isArray(); @@ -3535,13 +3631,24 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T } TIntermTyped* typed = node->getAsTyped(); + if (type.isCoopMat() && typed->getType().isCoopMat() && + !type.sameCoopMatShapeAndUse(typed->getType())) { + error(loc, "Cooperative matrix type parameters mismatch", constructorString.c_str(), ""); + return true; + } + if (typed == nullptr) { error(loc, "constructor argument does not have a type", constructorString.c_str(), ""); return true; } if (op != EOpConstructStruct && op != EOpConstructNonuniform && typed->getBasicType() == EbtSampler) { - error(loc, "cannot convert a sampler", constructorString.c_str(), ""); - return true; + if (op == EOpConstructUVec2 && extensionTurnedOn(E_GL_ARB_bindless_texture)) { + intermediate.setBindlessTextureMode(currentCaller, AstRefTypeFunc); + } + else { + error(loc, "cannot convert a sampler", constructorString.c_str(), ""); + return true; + } } if (op != EOpConstructStruct && typed->isAtomic()) { error(loc, "cannot convert an atomic_uint", constructorString.c_str(), ""); @@ -3561,6 +3668,26 @@ bool TParseContext::constructorTextureSamplerError(const TSourceLoc& loc, const { TString constructorName = function.getType().getBasicTypeString(); // TODO: performance: should not be making copy; interface needs to change const char* token = constructorName.c_str(); + // verify the constructor for bindless texture, the input must be ivec2 or uvec2 + if (function.getParamCount() == 1) { + TType* pType = function[0].type; + TBasicType basicType = pType->getBasicType(); + bool isIntegerVec2 = ((basicType == EbtUint || basicType == EbtInt) && pType->getVectorSize() == 2); + bool bindlessMode = extensionTurnedOn(E_GL_ARB_bindless_texture); + if (isIntegerVec2 && bindlessMode) { + if (pType->getSampler().isImage()) + intermediate.setBindlessImageMode(currentCaller, AstRefTypeFunc); + else + intermediate.setBindlessTextureMode(currentCaller, AstRefTypeFunc); + return false; + } else { + if (!bindlessMode) + error(loc, "sampler-constructor requires the extension GL_ARB_bindless_texture enabled", token, ""); + else + error(loc, "sampler-constructor requires the input to be ivec2 or uvec2", token, ""); + return true; + } + } // exactly two arguments needed if (function.getParamCount() != 2) { @@ -3656,18 +3783,38 @@ void TParseContext::samplerCheck(const TSourceLoc& loc, const TType& type, const if (type.getQualifier().storage == EvqUniform) return; - if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtSampler)) - error(loc, "non-uniform struct contains a sampler or image:", type.getBasicTypeString().c_str(), identifier.c_str()); + if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtSampler)) { + // For bindless texture, sampler can be declared as an struct member + if (extensionTurnedOn(E_GL_ARB_bindless_texture)) { + if (type.getSampler().isImage()) + intermediate.setBindlessImageMode(currentCaller, AstRefTypeVar); + else + intermediate.setBindlessTextureMode(currentCaller, AstRefTypeVar); + } + else { + error(loc, "non-uniform struct contains a sampler or image:", type.getBasicTypeString().c_str(), identifier.c_str()); + } + } else if (type.getBasicType() == EbtSampler && type.getQualifier().storage != EvqUniform) { - // non-uniform sampler - // not yet: okay if it has an initializer - // if (! initializer) - error(loc, "sampler/image types can only be used in uniform variables or function parameters:", type.getBasicTypeString().c_str(), identifier.c_str()); + // For bindless texture, sampler can be declared as an input/output/block member + if (extensionTurnedOn(E_GL_ARB_bindless_texture)) { + if (type.getSampler().isImage()) + intermediate.setBindlessImageMode(currentCaller, AstRefTypeVar); + else + intermediate.setBindlessTextureMode(currentCaller, AstRefTypeVar); + } + else { + // non-uniform sampler + // not yet: okay if it has an initializer + // if (! initializer) + if (type.getSampler().isAttachmentEXT() && type.getQualifier().storage != EvqTileImageEXT) + error(loc, "can only be used in tileImageEXT variables or function parameters:", type.getBasicTypeString().c_str(), identifier.c_str()); + else if (type.getQualifier().storage != EvqTileImageEXT) + error(loc, "sampler/image types can only be used in uniform variables or function parameters:", type.getBasicTypeString().c_str(), identifier.c_str()); + } } } -#ifndef GLSLANG_WEB - void TParseContext::atomicUintCheck(const TSourceLoc& loc, const TType& type, const TString& identifier) { if (type.getQualifier().storage == EvqUniform) @@ -3692,8 +3839,6 @@ void TParseContext::accStructCheck(const TSourceLoc& loc, const TType& type, con } -#endif // GLSLANG_WEB - void TParseContext::transparentOpaqueCheck(const TSourceLoc& loc, const TType& type, const TString& identifier) { if (parsingBuiltins) @@ -3728,7 +3873,7 @@ void TParseContext::memberQualifierCheck(glslang::TPublicType& publicType) // // Check/fix just a full qualifier (no variables or types yet, but qualifier is complete) at global level. // -void TParseContext::globalQualifierFixCheck(const TSourceLoc& loc, TQualifier& qualifier, bool isMemberCheck) +void TParseContext::globalQualifierFixCheck(const TSourceLoc& loc, TQualifier& qualifier, bool isMemberCheck, const TPublicType* publicType) { bool nonuniformOkay = false; @@ -3764,6 +3909,11 @@ void TParseContext::globalQualifierFixCheck(const TSourceLoc& loc, TQualifier& q { requireExtensions(loc, 1, &E_GL_EXT_scalar_block_layout, "default std430 layout for uniform"); } + + if (publicType != nullptr && publicType->isImage() && + (qualifier.layoutFormat > ElfExtSizeGuard && qualifier.layoutFormat < ElfCount)) + qualifier.layoutFormat = mapLegacyLayoutFormat(qualifier.layoutFormat, publicType->sampler.getBasicType()); + break; default: break; @@ -3772,13 +3922,11 @@ void TParseContext::globalQualifierFixCheck(const TSourceLoc& loc, TQualifier& q if (!nonuniformOkay && qualifier.isNonUniform()) error(loc, "for non-parameter, can only apply to 'in' or no storage qualifier", "nonuniformEXT", ""); -#ifndef GLSLANG_WEB if (qualifier.isSpirvByReference()) error(loc, "can only apply to parameter", "spirv_by_reference", ""); if (qualifier.isSpirvLiteral()) error(loc, "can only apply to parameter", "spirv_literal", ""); -#endif // Storage qualifier isn't ready for memberQualifierCheck, we should skip invariantCheck for it. if (!isMemberCheck || structNestingLevel > 0) @@ -3824,8 +3972,10 @@ void TParseContext::globalQualifierTypeCheck(const TSourceLoc& loc, const TQuali return; } - if (isTypeInt(publicType.basicType) || publicType.basicType == EbtDouble) - profileRequires(loc, EEsProfile, 300, nullptr, "shader input/output"); + if (isTypeInt(publicType.basicType) || publicType.basicType == EbtDouble) { + profileRequires(loc, EEsProfile, 300, nullptr, "non-float shader input/output"); + profileRequires(loc, ~EEsProfile, 130, nullptr, "non-float shader input/output"); + } if (!qualifier.flat && !qualifier.isExplicitInterpolation() && !qualifier.isPervertexNV() && !qualifier.isPervertexEXT()) { if (isTypeInt(publicType.basicType) || @@ -3856,7 +4006,7 @@ void TParseContext::globalQualifierTypeCheck(const TSourceLoc& loc, const TQuali switch (language) { case EShLangVertex: if (publicType.basicType == EbtStruct) { - error(loc, "cannot be a structure or array", GetStorageQualifierString(qualifier.storage), ""); + error(loc, "cannot be a structure", GetStorageQualifierString(qualifier.storage), ""); return; } if (publicType.arraySizes) { @@ -3882,12 +4032,10 @@ void TParseContext::globalQualifierTypeCheck(const TSourceLoc& loc, const TQuali if (! symbolTable.atBuiltInLevel()) error(loc, "global storage input qualifier cannot be used in a compute shader", "in", ""); break; -#ifndef GLSLANG_WEB case EShLangTessControl: if (qualifier.patch) error(loc, "can only use on output in tessellation-control shader", "patch", ""); break; -#endif default: break; } @@ -3926,12 +4074,10 @@ void TParseContext::globalQualifierTypeCheck(const TSourceLoc& loc, const TQuali case EShLangCompute: error(loc, "global storage output qualifier cannot be used in a compute shader", "out", ""); break; -#ifndef GLSLANG_WEB case EShLangTessEvaluation: if (qualifier.patch) error(loc, "can only use on input in tessellation-evaluation shader", "patch", ""); break; -#endif default: break; } @@ -3999,7 +4145,6 @@ void TParseContext::mergeQualifiers(const TSourceLoc& loc, TQualifier& dst, cons if (dst.precision == EpqNone || (force && src.precision != EpqNone)) dst.precision = src.precision; -#ifndef GLSLANG_WEB if (!force && ((src.coherent && (dst.devicecoherent || dst.queuefamilycoherent || dst.workgroupcoherent || dst.subgroupcoherent || dst.shadercallcoherent)) || (src.devicecoherent && (dst.coherent || dst.queuefamilycoherent || dst.workgroupcoherent || dst.subgroupcoherent || dst.shadercallcoherent)) || (src.queuefamilycoherent && (dst.coherent || dst.devicecoherent || dst.workgroupcoherent || dst.subgroupcoherent || dst.shadercallcoherent)) || @@ -4009,7 +4154,7 @@ void TParseContext::mergeQualifiers(const TSourceLoc& loc, TQualifier& dst, cons error(loc, "only one coherent/devicecoherent/queuefamilycoherent/workgroupcoherent/subgroupcoherent/shadercallcoherent qualifier allowed", GetPrecisionQualifierString(src.precision), ""); } -#endif + // Layout qualifiers mergeObjectLayoutQualifiers(dst, src, false); @@ -4021,7 +4166,6 @@ void TParseContext::mergeQualifiers(const TSourceLoc& loc, TQualifier& dst, cons MERGE_SINGLETON(smooth); MERGE_SINGLETON(flat); MERGE_SINGLETON(specConstant); -#ifndef GLSLANG_WEB MERGE_SINGLETON(noContraction); MERGE_SINGLETON(nopersp); MERGE_SINGLETON(explicitInterp); @@ -4042,9 +4186,7 @@ void TParseContext::mergeQualifiers(const TSourceLoc& loc, TQualifier& dst, cons MERGE_SINGLETON(readonly); MERGE_SINGLETON(writeonly); MERGE_SINGLETON(nonUniform); -#endif -#ifndef GLSLANG_WEB // SPIR-V storage class qualifier (GL_EXT_spirv_intrinsics) dst.spirvStorageClass = src.spirvStorageClass; @@ -4071,13 +4213,12 @@ void TParseContext::mergeQualifiers(const TSourceLoc& loc, TQualifier& dst, cons if (dstSpirvDecorate.decorates.find(decorateString.first) != dstSpirvDecorate.decorates.end()) error(loc, "too many SPIR-V decorate qualifiers", "spirv_decorate_string", "(decoration=%u)", decorateString.first); else - dstSpirvDecorate.decorates.insert(decorateString); + dstSpirvDecorate.decorateStrings.insert(decorateString); } } else { dst.spirvDecorate = src.spirvDecorate; } } -#endif if (repeated) error(loc, "replicated qualifiers", "", ""); @@ -4141,17 +4282,18 @@ TPrecisionQualifier TParseContext::getDefaultPrecision(TPublicType& publicType) return defaultPrecision[publicType.basicType]; } -void TParseContext::precisionQualifierCheck(const TSourceLoc& loc, TBasicType baseType, TQualifier& qualifier) +void TParseContext::precisionQualifierCheck(const TSourceLoc& loc, TBasicType baseType, TQualifier& qualifier, bool isCoopMat) { // Built-in symbols are allowed some ambiguous precisions, to be pinned down // later by context. if (! obeyPrecisionQualifiers() || parsingBuiltins) return; -#ifndef GLSLANG_WEB if (baseType == EbtAtomicUint && qualifier.precision != EpqNone && qualifier.precision != EpqHigh) error(loc, "atomic counters can only be highp", "atomic_uint", ""); -#endif + + if (isCoopMat) + return; if (baseType == EbtFloat || baseType == EbtUint || baseType == EbtInt || baseType == EbtSampler || baseType == EbtAtomicUint) { if (qualifier.precision == EpqNone) { @@ -4168,7 +4310,7 @@ void TParseContext::precisionQualifierCheck(const TSourceLoc& loc, TBasicType ba void TParseContext::parameterTypeCheck(const TSourceLoc& loc, TStorageQualifier qualifier, const TType& type) { - if ((qualifier == EvqOut || qualifier == EvqInOut) && type.isOpaque()) + if ((qualifier == EvqOut || qualifier == EvqInOut) && type.isOpaque() && !intermediate.getBindlessMode()) error(loc, "samplers and atomic_uints cannot be output parameters", type.getBasicTypeString().c_str(), ""); if (!parsingBuiltins && type.contains16BitFloat()) requireFloat16Arithmetic(loc, type.getBasicTypeString().c_str(), "float16 types can only be in uniform block or buffer storage"); @@ -4197,7 +4339,8 @@ bool TParseContext::containsFieldWithBasicType(const TType& type, TBasicType bas // // Do size checking for an array type's size. // -void TParseContext::arraySizeCheck(const TSourceLoc& loc, TIntermTyped* expr, TArraySize& sizePair, const char *sizeType) +void TParseContext::arraySizeCheck(const TSourceLoc& loc, TIntermTyped* expr, TArraySize& sizePair, + const char* sizeType, const bool allowZero) { bool isConst = false; sizePair.node = nullptr; @@ -4217,9 +4360,8 @@ void TParseContext::arraySizeCheck(const TSourceLoc& loc, TIntermTyped* expr, TA TIntermSymbol* symbol = expr->getAsSymbolNode(); if (symbol && symbol->getConstArray().size() > 0) size = symbol->getConstArray()[0].getIConst(); - } else if (expr->getAsUnaryNode() && - expr->getAsUnaryNode()->getOp() == glslang::EOpArrayLength && - expr->getAsUnaryNode()->getOperand()->getType().isCoopMat()) { + } else if (expr->getAsUnaryNode() && expr->getAsUnaryNode()->getOp() == glslang::EOpArrayLength && + expr->getAsUnaryNode()->getOperand()->getType().isCoopMatNV()) { isConst = true; size = 1; sizePair.node = expr->getAsUnaryNode(); @@ -4233,9 +4375,16 @@ void TParseContext::arraySizeCheck(const TSourceLoc& loc, TIntermTyped* expr, TA return; } - if (size <= 0) { - error(loc, sizeType, "", "must be a positive integer"); - return; + if (allowZero) { + if (size < 0) { + error(loc, sizeType, "", "must be a non-negative integer"); + return; + } + } else { + if (size <= 0) { + error(loc, sizeType, "", "must be a positive integer"); + return; + } } } @@ -4333,8 +4482,6 @@ void TParseContext::arraySizesCheck(const TSourceLoc& loc, const TQualifier& qua (qualifier.storage != EvqTemporary && qualifier.storage != EvqGlobal && qualifier.storage != EvqShared && qualifier.storage != EvqConst)) error(loc, "only outermost dimension of an array of arrays can be a specialization constant", "[]", ""); -#ifndef GLSLANG_WEB - // desktop always allows outer-dimension-unsized variable arrays, if (!isEsProfile()) return; @@ -4374,8 +4521,6 @@ void TParseContext::arraySizesCheck(const TSourceLoc& loc, const TQualifier& qua break; } -#endif - // last member of ssbo block exception: if (qualifier.storage == EvqBuffer && lastMember) return; @@ -4420,7 +4565,6 @@ void TParseContext::declareArray(const TSourceLoc& loc, const TString& identifie if (symbolTable.atGlobalLevel()) trackLinkage(*symbol); -#ifndef GLSLANG_WEB if (! symbolTable.atBuiltInLevel()) { if (isIoResizeArray(type)) { ioArraySymbolResizeList.push_back(symbol); @@ -4428,7 +4572,6 @@ void TParseContext::declareArray(const TSourceLoc& loc, const TString& identifie } else fixIoArraySize(loc, symbol->getWritableType()); } -#endif return; } @@ -4466,7 +4609,6 @@ void TParseContext::declareArray(const TSourceLoc& loc, const TString& identifie return; } -#ifndef GLSLANG_WEB if (existingType.isSizedArray()) { // be more leniant for input arrays to geometry shaders and tessellation control outputs, where the redeclaration is the same size if (! (isIoResizeArray(type) && existingType.getOuterArraySize() == type.getOuterArraySize())) @@ -4480,11 +4622,8 @@ void TParseContext::declareArray(const TSourceLoc& loc, const TString& identifie if (isIoResizeArray(type)) checkIoArraysConsistency(loc); -#endif } -#ifndef GLSLANG_WEB - // Policy and error check for needing a runtime sized array. void TParseContext::checkRuntimeSizable(const TSourceLoc& loc, const TIntermTyped& base) { @@ -4512,7 +4651,7 @@ void TParseContext::checkRuntimeSizable(const TSourceLoc& loc, const TIntermType // check for additional things allowed by GL_EXT_nonuniform_qualifier if (base.getBasicType() == EbtSampler || base.getBasicType() == EbtAccStruct || base.getBasicType() == EbtRayQuery || - (base.getBasicType() == EbtBlock && base.getType().getQualifier().isUniformOrBuffer())) + base.getBasicType() == EbtHitObjectNV || (base.getBasicType() == EbtBlock && base.getType().getQualifier().isUniformOrBuffer())) requireExtensions(loc, 1, &E_GL_EXT_nonuniform_qualifier, "variable index"); else error(loc, "", "[", "array must be redeclared with a size before being indexed with a variable"); @@ -4567,8 +4706,6 @@ void TParseContext::checkAndResizeMeshViewDim(const TSourceLoc& loc, TType& type } } -#endif // GLSLANG_WEB - // Returns true if the first argument to the #line directive is the line number for the next line. // // Desktop, pre-version 3.30: "After processing this directive @@ -4611,7 +4748,6 @@ void TParseContext::nonInitConstCheck(const TSourceLoc& loc, TString& identifier TSymbol* TParseContext::redeclareBuiltinVariable(const TSourceLoc& loc, const TString& identifier, const TQualifier& qualifier, const TShaderQualifiers& publicType) { -#ifndef GLSLANG_WEB if (! builtInName(identifier) || symbolTable.atBuiltInLevel() || ! symbolTable.atGlobalLevel()) return nullptr; @@ -4774,7 +4910,6 @@ TSymbol* TParseContext::redeclareBuiltinVariable(const TSourceLoc& loc, const TS return symbol; } -#endif return nullptr; } @@ -4786,7 +4921,6 @@ TSymbol* TParseContext::redeclareBuiltinVariable(const TSourceLoc& loc, const TS void TParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& newTypeList, const TString& blockName, const TString* instanceName, TArraySizes* arraySizes) { -#ifndef GLSLANG_WEB const char* feature = "built-in block redeclaration"; profileRequires(loc, EEsProfile, 320, Num_AEP_shader_io_blocks, AEP_shader_io_blocks, feature); profileRequires(loc, ~EEsProfile, 410, E_GL_ARB_separate_shader_objects, feature); @@ -5002,7 +5136,6 @@ void TParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& newT // Save it in the AST for linker use. trackLinkage(*block); -#endif // GLSLANG_WEB } void TParseContext::paramCheckFixStorage(const TSourceLoc& loc, const TStorageQualifier& qualifier, TType& type) @@ -5015,6 +5148,7 @@ void TParseContext::paramCheckFixStorage(const TSourceLoc& loc, const TStorageQu case EvqIn: case EvqOut: case EvqInOut: + case EvqTileImageEXT: type.getQualifier().storage = qualifier; break; case EvqGlobal: @@ -5030,7 +5164,6 @@ void TParseContext::paramCheckFixStorage(const TSourceLoc& loc, const TStorageQu void TParseContext::paramCheckFix(const TSourceLoc& loc, const TQualifier& qualifier, TType& type) { -#ifndef GLSLANG_WEB if (qualifier.isMemory()) { type.getQualifier().volatil = qualifier.volatil; type.getQualifier().coherent = qualifier.coherent; @@ -5044,7 +5177,6 @@ void TParseContext::paramCheckFix(const TSourceLoc& loc, const TQualifier& quali type.getQualifier().writeonly = qualifier.writeonly; type.getQualifier().restrict = qualifier.restrict; } -#endif if (qualifier.isAuxiliary() || qualifier.isInterpolation()) @@ -5061,7 +5193,6 @@ void TParseContext::paramCheckFix(const TSourceLoc& loc, const TQualifier& quali } if (qualifier.isNonUniform()) type.getQualifier().nonUniform = qualifier.nonUniform; -#ifndef GLSLANG_WEB if (qualifier.isSpirvByReference()) type.getQualifier().setSpirvByReference(); if (qualifier.isSpirvLiteral()) { @@ -5070,7 +5201,6 @@ void TParseContext::paramCheckFix(const TSourceLoc& loc, const TQualifier& quali type.getQualifier().setSpirvLiteral(); else error(loc, "cannot use spirv_literal qualifier", type.getBasicTypeString().c_str(), ""); -#endif } paramCheckFixStorage(loc, qualifier.storage, type); @@ -5101,21 +5231,18 @@ void TParseContext::arrayObjectCheck(const TSourceLoc& loc, const TType& type, c void TParseContext::opaqueCheck(const TSourceLoc& loc, const TType& type, const char* op) { - if (containsFieldWithBasicType(type, EbtSampler)) + if (containsFieldWithBasicType(type, EbtSampler) && !extensionTurnedOn(E_GL_ARB_bindless_texture)) error(loc, "can't use with samplers or structs containing samplers", op, ""); } void TParseContext::referenceCheck(const TSourceLoc& loc, const TType& type, const char* op) { -#ifndef GLSLANG_WEB if (containsFieldWithBasicType(type, EbtReference)) error(loc, "can't use with reference types", op, ""); -#endif } void TParseContext::storage16BitAssignmentCheck(const TSourceLoc& loc, const TType& type, const char* op) { -#ifndef GLSLANG_WEB if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtFloat16)) requireFloat16Arithmetic(loc, op, "can't use with structs containing float16"); @@ -5145,7 +5272,6 @@ void TParseContext::storage16BitAssignmentCheck(const TSourceLoc& loc, const TTy if (type.isArray() && type.getBasicType() == EbtUint8) requireInt8Arithmetic(loc, op, "can't use with arrays containing uint8"); -#endif } void TParseContext::specializationCheck(const TSourceLoc& loc, const TType& type, const char* op) @@ -5197,12 +5323,11 @@ void TParseContext::structTypeCheck(const TSourceLoc& /*loc*/, TPublicType& publ // void TParseContext::inductiveLoopCheck(const TSourceLoc& loc, TIntermNode* init, TIntermLoop* loop) { -#ifndef GLSLANG_WEB // loop index init must exist and be a declaration, which shows up in the AST as an aggregate of size 1 of the declaration bool badInit = false; if (! init || ! init->getAsAggregate() || init->getAsAggregate()->getSequence().size() != 1) badInit = true; - TIntermBinary* binaryInit = 0; + TIntermBinary* binaryInit = nullptr; if (! badInit) { // get the declaration assignment binaryInit = init->getAsAggregate()->getSequence()[0]->getAsBinaryNode(); @@ -5293,10 +5418,8 @@ void TParseContext::inductiveLoopCheck(const TSourceLoc& loc, TIntermNode* init, // the body inductiveLoopBodyCheck(loop->getBody(), loopIndex, symbolTable); -#endif } -#ifndef GLSLANG_WEB // Do limit checks for built-in arrays. void TParseContext::arrayLimitCheck(const TSourceLoc& loc, const TString& identifier, int size) { @@ -5311,7 +5434,6 @@ void TParseContext::arrayLimitCheck(const TSourceLoc& loc, const TString& identi else if (identifier.compare("gl_CullDistancePerViewNV") == 0) limitCheck(loc, size, "gl_MaxCullDistances", "gl_CullDistancePerViewNV array size"); } -#endif // GLSLANG_WEB // See if the provided value is less than or equal to the symbol indicated by limit, // which should be a constant in the symbol table. @@ -5325,8 +5447,6 @@ void TParseContext::limitCheck(const TSourceLoc& loc, int value, const char* lim error(loc, "must be less than or equal to", feature, "%s (%d)", limit, constArray[0].getIConst()); } -#ifndef GLSLANG_WEB - // // Do any additional error checking, etc., once we know the parsing is done. // @@ -5392,7 +5512,6 @@ void TParseContext::finish() } } } -#endif // GLSLANG_WEB // // Layout qualifier stuff. @@ -5436,7 +5555,6 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi publicType.qualifier.layoutPacking = ElpStd140; return; } -#ifndef GLSLANG_WEB if (id == TQualifier::getLayoutPackingString(ElpStd430)) { requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, "std430"); profileRequires(loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_shader_storage_buffer_object, "std430"); @@ -5476,6 +5594,28 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi intermediate.setUsePhysicalStorageBuffer(); return; } + if (id == "bindless_sampler") { + requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, "bindless_sampler"); + publicType.qualifier.layoutBindlessSampler = true; + intermediate.setBindlessTextureMode(currentCaller, AstRefTypeLayout); + return; + } + if (id == "bindless_image") { + requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, "bindless_image"); + publicType.qualifier.layoutBindlessImage = true; + intermediate.setBindlessImageMode(currentCaller, AstRefTypeLayout); + return; + } + if (id == "bound_sampler") { + requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, "bound_sampler"); + publicType.qualifier.layoutBindlessSampler = false; + return; + } + if (id == "bound_image") { + requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, "bound_image"); + publicType.qualifier.layoutBindlessImage = false; + return; + } if (language == EShLangGeometry || language == EShLangTessEvaluation || language == EShLangMesh) { if (id == TQualifier::getGeometryString(ElgTriangles)) { publicType.shaderQualifiers.geometry = ElgTriangles; @@ -5600,6 +5740,22 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi publicType.shaderQualifiers.postDepthCoverage = true; return; } + /* id is transformed into lower case in the beginning of this function. */ + if (id == "non_coherent_color_attachment_readext") { + requireExtensions(loc, 1, &E_GL_EXT_shader_tile_image, "non_coherent_color_attachment_readEXT"); + publicType.shaderQualifiers.nonCoherentColorAttachmentReadEXT = true; + return; + } + if (id == "non_coherent_depth_attachment_readext") { + requireExtensions(loc, 1, &E_GL_EXT_shader_tile_image, "non_coherent_depth_attachment_readEXT"); + publicType.shaderQualifiers.nonCoherentDepthAttachmentReadEXT = true; + return; + } + if (id == "non_coherent_stencil_attachment_readext") { + requireExtensions(loc, 1, &E_GL_EXT_shader_tile_image, "non_coherent_stencil_attachment_readEXT"); + publicType.shaderQualifiers.nonCoherentStencilAttachmentReadEXT = true; + return; + } for (TLayoutDepth depth = (TLayoutDepth)(EldNone + 1); depth < EldCount; depth = (TLayoutDepth)(depth+1)) { if (id == TQualifier::getLayoutDepthString(depth)) { requireProfile(loc, ECoreProfile | ECompatibilityProfile, "depth layout qualifier"); @@ -5670,6 +5826,10 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi } publicType.qualifier.layoutShaderRecord = true; return; + } else if (id == "hitobjectshaderrecordnv") { + requireExtensions(loc, 1, &E_GL_NV_shader_invocation_reorder, "hitobject shader record NV"); + publicType.qualifier.layoutHitObjectShaderRecordNV = true; + return; } } @@ -5692,7 +5852,6 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi publicType.shaderQualifiers.layoutPrimitiveCulling = true; return; } -#endif error(loc, "unrecognized layout identifier, or qualifier requires assignment (e.g., binding = 4)", id.c_str(), ""); } @@ -5780,10 +5939,8 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi error(loc, "needs a literal integer", "set", ""); return; } else if (id == "binding") { -#ifndef GLSLANG_WEB profileRequires(loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, "binding"); profileRequires(loc, EEsProfile, 310, nullptr, "binding"); -#endif if ((unsigned int)value >= TQualifier::layoutBindingEnd) error(loc, "binding is too large", id.c_str(), ""); else @@ -5806,7 +5963,6 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi error(loc, "needs a literal integer", "constant_id", ""); return; } -#ifndef GLSLANG_WEB if (id == "component") { requireProfile(loc, ECoreProfile | ECompatibilityProfile, "component"); profileRequires(loc, ECoreProfile | ECompatibilityProfile, 440, E_GL_ARB_enhanced_layouts, "component"); @@ -5904,10 +6060,8 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi error(loc, "needs a literal integer", "buffer_reference_align", ""); return; } -#endif switch (language) { -#ifndef GLSLANG_WEB case EShLangTessControl: if (id == "vertices") { if (value == 0) @@ -5973,8 +6127,14 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi if (id == "max_vertices") { requireExtensions(loc, Num_AEP_mesh_shader, AEP_mesh_shader, "max_vertices"); publicType.shaderQualifiers.vertices = value; - if (value > resources.maxMeshOutputVerticesNV) - error(loc, "too large, must be less than gl_MaxMeshOutputVerticesNV", "max_vertices", ""); + int max = extensionTurnedOn(E_GL_EXT_mesh_shader) ? resources.maxMeshOutputVerticesEXT + : resources.maxMeshOutputVerticesNV; + if (value > max) { + TString maxsErrtring = "too large, must be less than "; + maxsErrtring.append(extensionTurnedOn(E_GL_EXT_mesh_shader) ? "gl_MaxMeshOutputVerticesEXT" + : "gl_MaxMeshOutputVerticesNV"); + error(loc, maxsErrtring.c_str(), "max_vertices", ""); + } if (nonLiteral) error(loc, "needs a literal integer", "max_vertices", ""); return; @@ -5982,8 +6142,14 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi if (id == "max_primitives") { requireExtensions(loc, Num_AEP_mesh_shader, AEP_mesh_shader, "max_primitives"); publicType.shaderQualifiers.primitives = value; - if (value > resources.maxMeshOutputPrimitivesNV) - error(loc, "too large, must be less than gl_MaxMeshOutputPrimitivesNV", "max_primitives", ""); + int max = extensionTurnedOn(E_GL_EXT_mesh_shader) ? resources.maxMeshOutputPrimitivesEXT + : resources.maxMeshOutputPrimitivesNV; + if (value > max) { + TString maxsErrtring = "too large, must be less than "; + maxsErrtring.append(extensionTurnedOn(E_GL_EXT_mesh_shader) ? "gl_MaxMeshOutputPrimitivesEXT" + : "gl_MaxMeshOutputPrimitivesNV"); + error(loc, maxsErrtring.c_str(), "max_primitives", ""); + } if (nonLiteral) error(loc, "needs a literal integer", "max_primitives", ""); return; @@ -5992,17 +6158,14 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi case EShLangTask: // Fall through -#endif case EShLangCompute: if (id.compare(0, 11, "local_size_") == 0) { -#ifndef GLSLANG_WEB if (language == EShLangMesh || language == EShLangTask) { requireExtensions(loc, Num_AEP_mesh_shader, AEP_mesh_shader, "gl_WorkGroupSize"); } else { - profileRequires(loc, EEsProfile, 310, 0, "gl_WorkGroupSize"); + profileRequires(loc, EEsProfile, 310, nullptr, "gl_WorkGroupSize"); profileRequires(loc, ~EEsProfile, 430, E_GL_ARB_compute_shader, "gl_WorkGroupSize"); } -#endif if (nonLiteral) error(loc, "needs a literal integer", "local_size", ""); if (id.size() == 12 && value == 0) { @@ -6069,7 +6232,6 @@ void TParseContext::mergeObjectLayoutQualifiers(TQualifier& dst, const TQualifie if (src.hasPacking()) dst.layoutPacking = src.layoutPacking; -#ifndef GLSLANG_WEB if (src.hasStream()) dst.layoutStream = src.layoutStream; if (src.hasFormat()) @@ -6078,7 +6240,6 @@ void TParseContext::mergeObjectLayoutQualifiers(TQualifier& dst, const TQualifie dst.layoutXfbBuffer = src.layoutXfbBuffer; if (src.hasBufferReferenceAlign()) dst.layoutBufferReferenceAlign = src.layoutBufferReferenceAlign; -#endif if (src.hasAlign()) dst.layoutAlign = src.layoutAlign; @@ -6096,7 +6257,6 @@ void TParseContext::mergeObjectLayoutQualifiers(TQualifier& dst, const TQualifie if (src.hasSpecConstantId()) dst.layoutSpecConstantId = src.layoutSpecConstantId; -#ifndef GLSLANG_WEB if (src.hasComponent()) dst.layoutComponent = src.layoutComponent; if (src.hasIndex()) @@ -6121,11 +6281,16 @@ void TParseContext::mergeObjectLayoutQualifiers(TQualifier& dst, const TQualifie dst.layoutSecondaryViewportRelativeOffset = src.layoutSecondaryViewportRelativeOffset; if (src.layoutShaderRecord) dst.layoutShaderRecord = true; + if (src.layoutBindlessSampler) + dst.layoutBindlessSampler = true; + if (src.layoutBindlessImage) + dst.layoutBindlessImage = true; if (src.pervertexNV) dst.pervertexNV = true; if (src.pervertexEXT) dst.pervertexEXT = true; -#endif + if (src.layoutHitObjectShaderRecordNV) + dst.layoutHitObjectShaderRecordNV = true; } } @@ -6162,9 +6327,7 @@ void TParseContext::layoutObjectCheck(const TSourceLoc& loc, const TSymbol& symb case EvqVaryingIn: case EvqVaryingOut: if (!type.getQualifier().isTaskMemory() && -#ifndef GLSLANG_WEB !type.getQualifier().hasSprivDecorate() && -#endif (type.getBasicType() != EbtBlock || (!(*type.getStruct())[0].type->getQualifier().hasLocation() && (*type.getStruct())[0].type->getQualifier().builtIn == EbvNone))) @@ -6226,11 +6389,6 @@ void TParseContext::layoutMemberLocationArrayCheck(const TSourceLoc& loc, bool m // Do layout error checking with respect to a type. void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) { -#ifndef GLSLANG_WEB - if (extensionTurnedOn(E_GL_EXT_spirv_intrinsics)) - return; // Skip any check if GL_EXT_spirv_intrinsics is turned on -#endif - const TQualifier& qualifier = type.getQualifier(); // first, intra-layout qualifier-only error checking @@ -6272,18 +6430,22 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) case EvqBuffer: if (type.getBasicType() == EbtBlock) error(loc, "cannot apply to uniform or buffer block", "location", ""); + else if (type.getBasicType() == EbtSampler && type.getSampler().isAttachmentEXT()) + error(loc, "only applies to", "location", "%s with storage tileImageEXT", type.getBasicTypeString().c_str()); break; case EvqtaskPayloadSharedEXT: error(loc, "cannot apply to taskPayloadSharedEXT", "location", ""); break; -#ifndef GLSLANG_WEB case EvqPayload: case EvqPayloadIn: case EvqHitAttr: case EvqCallableData: case EvqCallableDataIn: + case EvqHitObjectAttrNV: + case EvqSpirvStorageClass: + break; + case EvqTileImageEXT: break; -#endif default: error(loc, "can only apply to uniform, buffer, in, or out storage qualifiers", "location", ""); break; @@ -6293,13 +6455,12 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) int repeated = intermediate.addUsedLocation(qualifier, type, typeCollision); if (repeated >= 0 && ! typeCollision) error(loc, "overlapping use of location", "location", "%d", repeated); - // "fragment-shader outputs ... if two variables are placed within the same + // "fragment-shader outputs/tileImageEXT ... if two variables are placed within the same // location, they must have the same underlying type (floating-point or integer)" - if (typeCollision && language == EShLangFragment && qualifier.isPipeOutput()) - error(loc, "fragment outputs sharing the same location must be the same basic type", "location", "%d", repeated); + if (typeCollision && language == EShLangFragment && (qualifier.isPipeOutput() || qualifier.storage == EvqTileImageEXT)) + error(loc, "fragment outputs or tileImageEXTs sharing the same location", "location", "%d must be the same basic type", repeated); } -#ifndef GLSLANG_WEB if (qualifier.hasXfbOffset() && qualifier.hasXfbBuffer()) { if (type.isUnsizedArray()) { error(loc, "unsized array", "xfb_offset", "in buffer %d", qualifier.layoutXfbBuffer); @@ -6328,7 +6489,6 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) if (! intermediate.setXfbBufferStride(qualifier.layoutXfbBuffer, qualifier.layoutXfbStride)) error(loc, "all stride settings must match for xfb buffer", "xfb_stride", "%d", qualifier.layoutXfbBuffer); } -#endif if (qualifier.hasBinding()) { // Binding checking, from the spec: @@ -6339,7 +6499,7 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) // an array of size N, all elements of the array from binding through binding + N - 1 must be within this // range." // - if (! type.isOpaque() && type.getBasicType() != EbtBlock) + if (!type.isOpaque() && type.getBasicType() != EbtBlock && type.getBasicType() != EbtSpirvType) error(loc, "requires block, or sampler/image, or atomic-counter type", "binding", ""); if (type.getBasicType() == EbtSampler) { int lastBinding = qualifier.layoutBinding; @@ -6348,16 +6508,12 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) if (type.isSizedArray()) lastBinding += (type.getCumulativeArraySize() - 1); else { -#ifndef GLSLANG_WEB warn(loc, "assuming binding count of one for compile-time checking of binding numbers for unsized array", "[]", ""); -#endif } } } -#ifndef GLSLANG_WEB if (spvVersion.vulkan == 0 && lastBinding >= resources.maxCombinedTextureImageUnits) error(loc, "sampler binding not less than gl_MaxCombinedTextureImageUnits", "binding", type.isArray() ? "(using array)" : ""); -#endif } if (type.isAtomic() && !spvVersion.vulkanRelaxed) { if (qualifier.layoutBinding >= (unsigned int)resources.maxAtomicCounterBindings) { @@ -6380,7 +6536,7 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) !qualifier.hasAttachment() && !qualifier.hasBufferReference()) error(loc, "uniform/buffer blocks require layout(binding=X)", "binding", ""); - else if (spvVersion.vulkan > 0 && type.getBasicType() == EbtSampler) + else if (spvVersion.vulkan > 0 && type.getBasicType() == EbtSampler && !type.getSampler().isAttachmentEXT()) error(loc, "sampler/texture/image requires layout(binding=X)", "binding", ""); } } @@ -6402,7 +6558,7 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) // Image format if (qualifier.hasFormat()) { - if (! type.isImage()) + if (! type.isImage() && !intermediate.getBindlessImageMode()) error(loc, "only apply to images", TQualifier::getLayoutFormatString(qualifier.getFormat()), ""); else { if (type.getSampler().type == EbtFloat && qualifier.getFormat() > ElfFloatGuard) @@ -6421,7 +6577,7 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) } } } - } else if (type.isImage() && ! qualifier.isWriteOnly()) { + } else if (type.isImage() && ! qualifier.isWriteOnly() && !intermediate.getBindlessImageMode()) { const char *explanation = "image variables not declared 'writeonly' and without a format layout qualifier"; requireProfile(loc, ECoreProfile | ECompatibilityProfile, explanation); profileRequires(loc, ECoreProfile | ECompatibilityProfile, 0, E_GL_EXT_shader_image_load_formatted, explanation); @@ -6442,6 +6598,8 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type) // input attachment if (type.isSubpass()) { + if (extensionTurnedOn(E_GL_EXT_shader_tile_image)) + error(loc, "can not be used with GL_EXT_shader_tile_image enabled", type.getSampler().getString().c_str(), ""); if (! qualifier.hasAttachment()) error(loc, "requires an input_attachment_index layout qualifier", "subpass", ""); } else { @@ -6511,7 +6669,6 @@ void TParseContext::layoutQualifierCheck(const TSourceLoc& loc, const TQualifier // output block declarations, and output block member declarations." switch (qualifier.storage) { -#ifndef GLSLANG_WEB case EvqVaryingIn: { const char* feature = "location qualifier on input"; @@ -6546,7 +6703,6 @@ void TParseContext::layoutQualifierCheck(const TSourceLoc& loc, const TQualifier } break; } -#endif case EvqUniform: case EvqBuffer: { @@ -6609,6 +6765,14 @@ void TParseContext::layoutQualifierCheck(const TSourceLoc& loc, const TQualifier error(loc, "cannot be used with shaderRecordNV", "set", ""); } + + if (qualifier.storage == EvqTileImageEXT) { + if (qualifier.hasSet()) + error(loc, "cannot be used with tileImageEXT", "set", ""); + if (!qualifier.hasLocation()) + error(loc, "can only be used with an explicit location", "tileImageEXT", ""); + } + if (qualifier.storage == EvqHitAttr && qualifier.hasLayout()) { error(loc, "cannot apply layout qualifiers to hitAttributeNV variable", "hitAttributeNV", ""); } @@ -6617,7 +6781,6 @@ void TParseContext::layoutQualifierCheck(const TSourceLoc& loc, const TQualifier // For places that can't have shader-level layout qualifiers void TParseContext::checkNoShaderLayouts(const TSourceLoc& loc, const TShaderQualifiers& shaderQualifiers) { -#ifndef GLSLANG_WEB const char* message = "can only apply to a standalone qualifier"; if (shaderQualifiers.geometry != ElgNone) @@ -6648,6 +6811,12 @@ void TParseContext::checkNoShaderLayouts(const TSourceLoc& loc, const TShaderQua error(loc, message, "early_fragment_tests", ""); if (shaderQualifiers.postDepthCoverage) error(loc, message, "post_depth_coverage", ""); + if (shaderQualifiers.nonCoherentColorAttachmentReadEXT) + error(loc, message, "non_coherent_color_attachment_readEXT", ""); + if (shaderQualifiers.nonCoherentDepthAttachmentReadEXT) + error(loc, message, "non_coherent_depth_attachment_readEXT", ""); + if (shaderQualifiers.nonCoherentStencilAttachmentReadEXT) + error(loc, message, "non_coherent_stencil_attachment_readEXT", ""); if (shaderQualifiers.primitives != TQualifier::layoutNotSet) { if (language == EShLangMesh) error(loc, message, "max_primitives", ""); @@ -6662,14 +6831,12 @@ void TParseContext::checkNoShaderLayouts(const TSourceLoc& loc, const TShaderQua error(loc, message, TQualifier::getInterlockOrderingString(shaderQualifiers.interlockOrdering), ""); if (shaderQualifiers.layoutPrimitiveCulling) error(loc, "can only be applied as standalone", "primitive_culling", ""); -#endif } // Correct and/or advance an object's offset layout qualifier. void TParseContext::fixOffset(const TSourceLoc& loc, TSymbol& symbol) { const TQualifier& qualifier = symbol.getType().getQualifier(); -#ifndef GLSLANG_WEB if (symbol.getType().isAtomic()) { if (qualifier.hasBinding() && (int)qualifier.layoutBinding < resources.maxAtomicCounterBindings) { @@ -6703,7 +6870,6 @@ void TParseContext::fixOffset(const TSourceLoc& loc, TSymbol& symbol) atomicUintOffsets[qualifier.layoutBinding] = offset + numOffsets; } } -#endif } // @@ -6718,10 +6884,6 @@ const TFunction* TParseContext::findFunction(const TSourceLoc& loc, const TFunct return nullptr; } -#ifdef GLSLANG_WEB - return findFunctionExact(loc, call, builtIn); -#endif - const TFunction* function = nullptr; // debugPrintfEXT has var args and is in the symbol table as "debugPrintfEXT()", @@ -7048,7 +7210,6 @@ TIntermTyped* TParseContext::vkRelaxedRemapFunctionCall(const TSourceLoc& loc, T { TIntermTyped* result = nullptr; -#ifndef GLSLANG_WEB if (function->getBuiltInOp() != EOpNull) { return nullptr; } @@ -7066,7 +7227,7 @@ TIntermTyped* TParseContext::vkRelaxedRemapFunctionCall(const TSourceLoc& loc, T realFunc.addParameter(TParameter().copyParam((*function)[i])); } - TParameter tmpP = { 0, &uintType }; + TParameter tmpP = { nullptr, &uintType }; realFunc.addParameter(TParameter().copyParam(tmpP)); arguments = intermediate.growAggregate(arguments, intermediate.addConstantUnion(1, loc, true)); @@ -7083,7 +7244,7 @@ TIntermTyped* TParseContext::vkRelaxedRemapFunctionCall(const TSourceLoc& loc, T realFunc.addParameter(TParameter().copyParam((*function)[i])); } - TParameter tmpP = { 0, &uintType }; + TParameter tmpP = { nullptr, &uintType }; realFunc.addParameter(TParameter().copyParam(tmpP)); arguments = intermediate.growAggregate(arguments, intermediate.addConstantUnion(-1, loc, true)); @@ -7099,7 +7260,6 @@ TIntermTyped* TParseContext::vkRelaxedRemapFunctionCall(const TSourceLoc& loc, T result = arguments->getAsTyped(); } } -#endif return result; } @@ -7108,7 +7268,6 @@ TIntermTyped* TParseContext::vkRelaxedRemapFunctionCall(const TSourceLoc& loc, T // to establish defaults. void TParseContext::declareTypeDefaults(const TSourceLoc& loc, const TPublicType& publicType) { -#ifndef GLSLANG_WEB if (publicType.basicType == EbtAtomicUint && publicType.qualifier.hasBinding()) { if (publicType.qualifier.layoutBinding >= (unsigned int)resources.maxAtomicCounterBindings) { error(loc, "atomic_uint binding is too large", "binding", ""); @@ -7125,7 +7284,41 @@ void TParseContext::declareTypeDefaults(const TSourceLoc& loc, const TPublicType if (publicType.qualifier.hasLayout() && !publicType.qualifier.hasBufferReference()) warn(loc, "useless application of layout qualifier", "layout", ""); -#endif +} + +void TParseContext::coopMatTypeParametersCheck(const TSourceLoc& loc, const TPublicType& publicType) +{ + if (parsingBuiltins) + return; + if (publicType.isCoopmatKHR()) { + if (publicType.typeParameters == nullptr) { + error(loc, "coopmat missing type parameters", "", ""); + return; + } + switch (publicType.typeParameters->basicType) { + case EbtFloat: + case EbtFloat16: + case EbtInt: + case EbtInt8: + case EbtInt16: + case EbtUint: + case EbtUint8: + case EbtUint16: + break; + default: + error(loc, "coopmat invalid basic type", TType::getBasicString(publicType.typeParameters->basicType), ""); + break; + } + if (publicType.typeParameters->arraySizes->getNumDims() != 4) { + error(loc, "coopmat incorrect number of type parameters", "", ""); + return; + } + int use = publicType.typeParameters->arraySizes->getDimSize(3); + if (use < 0 || use > 2) { + error(loc, "coopmat invalid matrix Use", "", ""); + return; + } + } } bool TParseContext::vkRelaxedRemapUniformVariable(const TSourceLoc& loc, TString& identifier, const TPublicType&, @@ -7133,11 +7326,7 @@ bool TParseContext::vkRelaxedRemapUniformVariable(const TSourceLoc& loc, TString { if (parsingBuiltins || symbolTable.atBuiltInLevel() || !symbolTable.atGlobalLevel() || type.getQualifier().storage != EvqUniform || - !(type.containsNonOpaque() -#ifndef GLSLANG_WEB - || type.getBasicType() == EbtAtomicUint -#endif - )) { + !(type.containsNonOpaque()|| type.getBasicType() == EbtAtomicUint)) { return false; } @@ -7166,7 +7355,6 @@ bool TParseContext::vkRelaxedRemapUniformVariable(const TSourceLoc& loc, TString int bufferBinding = TQualifier::layoutBindingEnd; TVariable* updatedBlock = nullptr; -#ifndef GLSLANG_WEB // Convert atomic_uint into members of a buffer block if (type.isAtomic()) { type.setBasicType(EbtUint); @@ -7182,7 +7370,6 @@ bool TParseContext::vkRelaxedRemapUniformVariable(const TSourceLoc& loc, TString growAtomicCounterBlock(bufferBinding, loc, type, identifier, nullptr); updatedBlock = atomicCounterBuffers[bufferBinding]; } -#endif if (!updatedBlock) { growGlobalUniformBlock(loc, type, identifier, nullptr); @@ -7237,32 +7424,49 @@ TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& iden if (initializer) { if (type.getBasicType() == EbtRayQuery) { error(loc, "ray queries can only be initialized by using the rayQueryInitializeEXT intrinsic:", "=", identifier.c_str()); + } else if (type.getBasicType() == EbtHitObjectNV) { + error(loc, "hit objects cannot be initialized using initializers", "=", identifier.c_str()); } + } - if (type.isCoopMat()) { + if (type.isCoopMatKHR()) { + intermediate.setUseVulkanMemoryModel(); + intermediate.setUseStorageBuffer(); + + if (!publicType.typeParameters || !publicType.typeParameters->arraySizes || + publicType.typeParameters->arraySizes->getNumDims() != 3) { + error(loc, "unexpected number type parameters", identifier.c_str(), ""); + } + if (publicType.typeParameters) { + if (!isTypeFloat(publicType.typeParameters->basicType) && !isTypeInt(publicType.typeParameters->basicType)) { + error(loc, "expected 8, 16, 32, or 64 bit signed or unsigned integer or 16, 32, or 64 bit float type", identifier.c_str(), ""); + } + } + } + else if (type.isCoopMatNV()) { intermediate.setUseVulkanMemoryModel(); intermediate.setUseStorageBuffer(); - if (!publicType.typeParameters || publicType.typeParameters->getNumDims() != 4) { + if (!publicType.typeParameters || publicType.typeParameters->arraySizes->getNumDims() != 4) { error(loc, "expected four type parameters", identifier.c_str(), ""); } if (publicType.typeParameters) { if (isTypeFloat(publicType.basicType) && - publicType.typeParameters->getDimSize(0) != 16 && - publicType.typeParameters->getDimSize(0) != 32 && - publicType.typeParameters->getDimSize(0) != 64) { + publicType.typeParameters->arraySizes->getDimSize(0) != 16 && + publicType.typeParameters->arraySizes->getDimSize(0) != 32 && + publicType.typeParameters->arraySizes->getDimSize(0) != 64) { error(loc, "expected 16, 32, or 64 bits for first type parameter", identifier.c_str(), ""); } if (isTypeInt(publicType.basicType) && - publicType.typeParameters->getDimSize(0) != 8 && - publicType.typeParameters->getDimSize(0) != 32) { - error(loc, "expected 8 or 32 bits for first type parameter", identifier.c_str(), ""); + publicType.typeParameters->arraySizes->getDimSize(0) != 8 && + publicType.typeParameters->arraySizes->getDimSize(0) != 16 && + publicType.typeParameters->arraySizes->getDimSize(0) != 32) { + error(loc, "expected 8, 16, or 32 bits for first type parameter", identifier.c_str(), ""); } } - } else { - if (publicType.typeParameters && publicType.typeParameters->getNumDims() != 0) { + if (publicType.typeParameters && publicType.typeParameters->arraySizes->getNumDims() != 0) { error(loc, "unexpected type parameters", identifier.c_str(), ""); } } @@ -7277,11 +7481,9 @@ TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& iden samplerCheck(loc, type, identifier, initializer); transparentOpaqueCheck(loc, type, identifier); -#ifndef GLSLANG_WEB atomicUintCheck(loc, type, identifier); accStructCheck(loc, type, identifier); checkAndResizeMeshViewDim(loc, type, /*isBlockMember*/ false); -#endif if (type.getQualifier().storage == EvqConst && type.containsReference()) { error(loc, "variables with reference type can't have qualifier 'const'", "qualifier", ""); } @@ -7384,14 +7586,12 @@ TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& iden // Pick up global defaults from the provide global defaults into dst. void TParseContext::inheritGlobalDefaults(TQualifier& dst) const { -#ifndef GLSLANG_WEB if (dst.storage == EvqVaryingOut) { if (! dst.hasStream() && language == EShLangGeometry) dst.layoutStream = globalOutputDefaults.layoutStream; if (! dst.hasXfbBuffer()) dst.layoutXfbBuffer = globalOutputDefaults.layoutXfbBuffer; } -#endif } // @@ -7420,9 +7620,7 @@ TVariable* TParseContext::declareNonArray(const TSourceLoc& loc, const TString& // make a new variable TVariable* variable = new TVariable(&identifier, type); -#ifndef GLSLANG_WEB ioArrayCheck(loc, type, identifier); -#endif // add variable to symbol table if (symbolTable.insert(*variable)) { @@ -7499,9 +7697,7 @@ TIntermNode* TParseContext::executeInitializer(const TSourceLoc& loc, TIntermTyp TType skeletalType; skeletalType.shallowCopy(variable->getType()); skeletalType.getQualifier().makeTemporary(); -#ifndef GLSLANG_WEB initializer = convertInitializerList(loc, skeletalType, initializer); -#endif if (! initializer) { // error recovery; don't leave const without constant values if (qualifier == EvqConst) @@ -7729,12 +7925,14 @@ TIntermTyped* TParseContext::addConstructor(const TSourceLoc& loc, TIntermNode* // Combined texture-sampler constructors are completely semantic checked // in constructorTextureSamplerError() if (op == EOpConstructTextureSampler) { - if (aggrNode->getSequence()[1]->getAsTyped()->getType().getSampler().shadow) { - // Transfer depth into the texture (SPIR-V image) type, as a hint - // for tools to know this texture/image is a depth image. - aggrNode->getSequence()[0]->getAsTyped()->getWritableType().getSampler().shadow = true; + if (aggrNode != nullptr) { + if (aggrNode->getSequence()[1]->getAsTyped()->getType().getSampler().shadow) { + // Transfer depth into the texture (SPIR-V image) type, as a hint + // for tools to know this texture/image is a depth image. + aggrNode->getSequence()[0]->getAsTyped()->getWritableType().getSampler().shadow = true; + } + return intermediate.setAggregateOperator(aggrNode, op, type, loc); } - return intermediate.setAggregateOperator(aggrNode, op, type, loc); } TTypeList::const_iterator memberTypes; @@ -7869,6 +8067,16 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T TIntermTyped* newNode = intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConvPtrToUvec2, true, node, type); return newNode; + } else if (node->getType().getBasicType() == EbtSampler) { + requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, "sampler conversion to uvec2"); + // force the basic type of the constructor param to uvec2, otherwise spv builder will + // report some errors + TIntermTyped* newSrcNode = intermediate.createConversion(EbtUint, node); + newSrcNode->getAsTyped()->getWritableType().setVectorSize(2); + + TIntermTyped* newNode = + intermediate.addBuiltInFunctionCall(node->getLoc(), EOpConstructUVec2, false, newSrcNode, type); + return newNode; } case EOpConstructUVec3: case EOpConstructUVec4: @@ -7882,9 +8090,15 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T case EOpConstructBool: basicOp = EOpConstructBool; break; - -#ifndef GLSLANG_WEB - + case EOpConstructTextureSampler: + if ((node->getType().getBasicType() == EbtUint || node->getType().getBasicType() == EbtInt) && + node->getType().getVectorSize() == 2) { + requireExtensions(loc, 1, &E_GL_ARB_bindless_texture, "ivec2/uvec2 convert to texture handle"); + // No matter ivec2 or uvec2, Set EOpPackUint2x32 just to generate an opBitcast op code + TIntermTyped* newNode = + intermediate.addBuiltInFunctionCall(node->getLoc(), EOpPackUint2x32, true, node, type); + return newNode; + } case EOpConstructDVec2: case EOpConstructDVec3: case EOpConstructDVec4: @@ -8070,14 +8284,18 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T return nullptr; } - case EOpConstructCooperativeMatrix: + case EOpConstructCooperativeMatrixNV: + case EOpConstructCooperativeMatrixKHR: + if (node->getType() == type) { + return node; + } if (!node->getType().isCoopMat()) { if (type.getBasicType() != node->getType().getBasicType()) { node = intermediate.addConversion(type.getBasicType(), node); if (node == nullptr) return nullptr; } - node = intermediate.setAggregateOperator(node, EOpConstructCooperativeMatrix, type, node->getLoc()); + node = intermediate.setAggregateOperator(node, op, type, node->getLoc()); } else { TOperator op = EOpNull; switch (type.getBasicType()) { @@ -8090,6 +8308,8 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T case EbtFloat16: op = EOpConvFloat16ToInt; break; case EbtUint8: op = EOpConvUint8ToInt; break; case EbtInt8: op = EOpConvInt8ToInt; break; + case EbtUint16: op = EOpConvUint16ToInt; break; + case EbtInt16: op = EOpConvInt16ToInt; break; case EbtUint: op = EOpConvUintToInt; break; default: assert(0); } @@ -8100,8 +8320,33 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T case EbtFloat16: op = EOpConvFloat16ToUint; break; case EbtUint8: op = EOpConvUint8ToUint; break; case EbtInt8: op = EOpConvInt8ToUint; break; + case EbtUint16: op = EOpConvUint16ToUint; break; + case EbtInt16: op = EOpConvInt16ToUint; break; case EbtInt: op = EOpConvIntToUint; break; - case EbtUint: op = EOpConvUintToInt8; break; + default: assert(0); + } + break; + case EbtInt16: + switch (node->getType().getBasicType()) { + case EbtFloat: op = EOpConvFloatToInt16; break; + case EbtFloat16: op = EOpConvFloat16ToInt16; break; + case EbtUint8: op = EOpConvUint8ToInt16; break; + case EbtInt8: op = EOpConvInt8ToInt16; break; + case EbtUint16: op = EOpConvUint16ToInt16; break; + case EbtInt: op = EOpConvIntToInt16; break; + case EbtUint: op = EOpConvUintToInt16; break; + default: assert(0); + } + break; + case EbtUint16: + switch (node->getType().getBasicType()) { + case EbtFloat: op = EOpConvFloatToUint16; break; + case EbtFloat16: op = EOpConvFloat16ToUint16; break; + case EbtUint8: op = EOpConvUint8ToUint16; break; + case EbtInt8: op = EOpConvInt8ToUint16; break; + case EbtInt16: op = EOpConvInt16ToUint16; break; + case EbtInt: op = EOpConvIntToUint16; break; + case EbtUint: op = EOpConvUintToUint16; break; default: assert(0); } break; @@ -8110,6 +8355,8 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T case EbtFloat: op = EOpConvFloatToInt8; break; case EbtFloat16: op = EOpConvFloat16ToInt8; break; case EbtUint8: op = EOpConvUint8ToInt8; break; + case EbtInt16: op = EOpConvInt16ToInt8; break; + case EbtUint16: op = EOpConvUint16ToInt8; break; case EbtInt: op = EOpConvIntToInt8; break; case EbtUint: op = EOpConvUintToInt8; break; default: assert(0); @@ -8120,6 +8367,8 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T case EbtFloat: op = EOpConvFloatToUint8; break; case EbtFloat16: op = EOpConvFloat16ToUint8; break; case EbtInt8: op = EOpConvInt8ToUint8; break; + case EbtInt16: op = EOpConvInt16ToUint8; break; + case EbtUint16: op = EOpConvUint16ToUint8; break; case EbtInt: op = EOpConvIntToUint8; break; case EbtUint: op = EOpConvUintToUint8; break; default: assert(0); @@ -8130,6 +8379,8 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T case EbtFloat16: op = EOpConvFloat16ToFloat; break; case EbtInt8: op = EOpConvInt8ToFloat; break; case EbtUint8: op = EOpConvUint8ToFloat; break; + case EbtInt16: op = EOpConvInt16ToFloat; break; + case EbtUint16: op = EOpConvUint16ToFloat; break; case EbtInt: op = EOpConvIntToFloat; break; case EbtUint: op = EOpConvUintToFloat; break; default: assert(0); @@ -8140,6 +8391,8 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T case EbtFloat: op = EOpConvFloatToFloat16; break; case EbtInt8: op = EOpConvInt8ToFloat16; break; case EbtUint8: op = EOpConvUint8ToFloat16; break; + case EbtInt16: op = EOpConvInt16ToFloat16; break; + case EbtUint16: op = EOpConvUint16ToFloat16; break; case EbtInt: op = EOpConvIntToFloat16; break; case EbtUint: op = EOpConvUintToFloat16; break; default: assert(0); @@ -8168,7 +8421,6 @@ TIntermTyped* TParseContext::constructBuiltIn(const TType& type, TOperator op, T type); } else return nullptr; -#endif // GLSLANG_WEB default: error(loc, "unsupported construction", "", ""); @@ -8215,7 +8467,6 @@ TIntermTyped* TParseContext::constructAggregate(TIntermNode* node, const TType& // If a memory qualifier is present in 'to', also make it present in 'from'. void TParseContext::inheritMemoryQualifiers(const TQualifier& from, TQualifier& to) { -#ifndef GLSLANG_WEB if (from.isReadOnly()) to.readonly = from.readonly; if (from.isWriteOnly()) @@ -8226,7 +8477,30 @@ void TParseContext::inheritMemoryQualifiers(const TQualifier& from, TQualifier& to.volatil = from.volatil; if (from.restrict) to.restrict = from.restrict; -#endif +} + +// +// Update qualifier layoutBindlessImage & layoutBindlessSampler on block member +// +void TParseContext::updateBindlessQualifier(TType& memberType) +{ + if (memberType.containsSampler()) { + if (memberType.isStruct()) { + TTypeList* typeList = memberType.getWritableStruct(); + for (unsigned int member = 0; member < typeList->size(); ++member) { + TType* subMemberType = (*typeList)[member].type; + updateBindlessQualifier(*subMemberType); + } + } + else if (memberType.getSampler().isImage()) { + intermediate.setBindlessImageMode(currentCaller, AstRefTypeLayout); + memberType.getQualifier().layoutBindlessImage = true; + } + else { + intermediate.setBindlessTextureMode(currentCaller, AstRefTypeLayout); + memberType.getQualifier().layoutBindlessSampler = true; + } + } } // @@ -8255,7 +8529,6 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con error(memberLoc, "member storage qualifier cannot contradict block storage qualifier", memberType.getFieldName().c_str(), ""); memberQualifier.storage = currentBlockQualifier.storage; globalQualifierFixCheck(memberLoc, memberQualifier); -#ifndef GLSLANG_WEB inheritMemoryQualifiers(currentBlockQualifier, memberQualifier); if (currentBlockQualifier.perPrimitiveNV) memberQualifier.perPrimitiveNV = currentBlockQualifier.perPrimitiveNV; @@ -8269,7 +8542,6 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con error(memberLoc, "member cannot have a spirv_storage_class qualifier", memberType.getFieldName().c_str(), ""); if (memberQualifier.hasSprivDecorate() && !memberQualifier.getSpirvDecorate().decorateIds.empty()) error(memberLoc, "member cannot have a spirv_decorate_id qualifier", memberType.getFieldName().c_str(), ""); -#endif if ((currentBlockQualifier.storage == EvqUniform || currentBlockQualifier.storage == EvqBuffer) && (memberQualifier.isInterpolation() || memberQualifier.isAuxiliary())) error(memberLoc, "member of uniform or buffer block cannot have an auxiliary or interpolation qualifier", memberType.getFieldName().c_str(), ""); if (memberType.isArray()) @@ -8281,8 +8553,13 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con } } - if (memberType.containsOpaque()) - error(memberLoc, "member of block cannot be or contain a sampler, image, or atomic_uint type", typeList[member].type->getFieldName().c_str(), ""); + // For bindless texture, sampler can be declared as uniform/storage block member, + if (memberType.containsOpaque()) { + if (memberType.containsSampler() && extensionTurnedOn(E_GL_ARB_bindless_texture)) + updateBindlessQualifier(memberType); + else + error(memberLoc, "member of block cannot be or contain a sampler, image, or atomic_uint type", typeList[member].type->getFieldName().c_str(), ""); + } if (memberType.containsCoopMat()) error(memberLoc, "member of block cannot be or contain a cooperative matrix type", typeList[member].type->getFieldName().c_str(), ""); @@ -8344,7 +8621,6 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con for (unsigned int member = 0; member < typeList.size(); ++member) { TQualifier& memberQualifier = typeList[member].type->getQualifier(); const TSourceLoc& memberLoc = typeList[member].loc; -#ifndef GLSLANG_WEB if (memberQualifier.hasStream()) { if (defaultQualification.layoutStream != memberQualifier.layoutStream) error(memberLoc, "member cannot contradict block", "stream", ""); @@ -8358,14 +8634,12 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con if (defaultQualification.layoutXfbBuffer != memberQualifier.layoutXfbBuffer) error(memberLoc, "member cannot contradict block (or what block inherited from global)", "xfb_buffer", ""); } -#endif if (memberQualifier.hasPacking()) error(memberLoc, "member of block cannot have a packing layout qualifier", typeList[member].type->getFieldName().c_str(), ""); if (memberQualifier.hasLocation()) { const char* feature = "location on block member"; switch (currentBlockQualifier.storage) { -#ifndef GLSLANG_WEB case EvqVaryingIn: case EvqVaryingOut: requireProfile(memberLoc, ECoreProfile | ECompatibilityProfile | EEsProfile, feature); @@ -8373,7 +8647,6 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con profileRequires(memberLoc, EEsProfile, 320, Num_AEP_shader_io_blocks, AEP_shader_io_blocks, feature); memberWithLocation = true; break; -#endif default: error(memberLoc, "can only use in an in/out block", feature, ""); break; @@ -8401,7 +8674,6 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con layoutMemberLocationArrayCheck(loc, memberWithLocation, arraySizes); -#ifndef GLSLANG_WEB // Ensure that the block has an XfbBuffer assigned. This is needed // because if the block has a XfbOffset assigned, then it is // assumed that it has implicitly assigned the current global @@ -8411,7 +8683,6 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con if (!currentBlockQualifier.hasXfbBuffer() && currentBlockQualifier.hasXfbOffset()) currentBlockQualifier.layoutXfbBuffer = globalOutputDefaults.layoutXfbBuffer; } -#endif // Process the members fixBlockLocations(loc, currentBlockQualifier, typeList, memberWithLocation, memberWithoutLocation); @@ -8422,13 +8693,11 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con for (unsigned int member = 0; member < typeList.size(); ++member) layoutTypeCheck(typeList[member].loc, *typeList[member].type); -#ifndef GLSLANG_WEB if (memberWithPerViewQualifier) { for (unsigned int member = 0; member < typeList.size(); ++member) { checkAndResizeMeshViewDim(typeList[member].loc, *typeList[member].type, /*isBlockMember*/ true); } } -#endif // reverse merge, so that currentBlockQualifier now has all layout information // (can't use defaultQualification directly, it's missing other non-layout-default-class qualifiers) @@ -8442,7 +8711,6 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con if (arraySizes != nullptr) blockType.transferArraySizes(arraySizes); -#ifndef GLSLANG_WEB if (arraySizes == nullptr) ioArrayCheck(loc, blockType, instanceName ? *instanceName : *blockName); if (currentBlockQualifier.hasBufferReference()) { @@ -8469,9 +8737,7 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con if (!instanceName) { return; } - } else -#endif - { + } else { // // Don't make a user-defined type out of block name; that will cause an error // if the same block name gets reused in a different interface. @@ -8519,14 +8785,12 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con // Check for general layout qualifier errors layoutObjectCheck(loc, variable); -#ifndef GLSLANG_WEB // fix up if (isIoResizeArray(blockType)) { ioArraySymbolResizeList.push_back(&variable); checkIoArraysConsistency(loc, true); } else fixIoArraySize(loc, variable.getWritableType()); -#endif // Save it in the AST for linker use. trackLinkage(variable); @@ -8591,7 +8855,6 @@ void TParseContext::blockStageIoCheck(const TSourceLoc& loc, const TQualifier& q } profileRequires(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, 0, E_GL_EXT_shared_memory_block, "shared block"); break; -#ifndef GLSLANG_WEB case EvqPayload: profileRequires(loc, ~EEsProfile, 460, 2, extsrt, "rayPayloadNV block"); requireStage(loc, (EShLanguageMask)(EShLangRayGenMask | EShLangAnyHitMask | EShLangClosestHitMask | EShLangMissMask), @@ -8615,7 +8878,10 @@ void TParseContext::blockStageIoCheck(const TSourceLoc& loc, const TQualifier& q profileRequires(loc, ~EEsProfile, 460, 2, extsrt, "callableDataInNV block"); requireStage(loc, (EShLanguageMask)(EShLangCallableMask), "callableDataInNV block"); break; -#endif + case EvqHitObjectAttrNV: + profileRequires(loc, ~EEsProfile, 460, E_GL_NV_shader_invocation_reorder, "hitObjectAttributeNV block"); + requireStage(loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask | EShLangMissMask), "hitObjectAttributeNV block"); + break; default: error(loc, "only uniform, buffer, in, or out blocks are supported", blockName->c_str(), ""); break; @@ -8704,7 +8970,6 @@ void TParseContext::fixBlockLocations(const TSourceLoc& loc, TQualifier& qualifi void TParseContext::fixXfbOffsets(TQualifier& qualifier, TTypeList& typeList) { -#ifndef GLSLANG_WEB // "If a block is qualified with xfb_offset, all its // members are assigned transform feedback buffer offsets. If a block is not qualified with xfb_offset, any // members of that block not qualified with an xfb_offset will not be assigned transform feedback buffer @@ -8738,7 +9003,6 @@ void TParseContext::fixXfbOffsets(TQualifier& qualifier, TTypeList& typeList) // The above gave all block members an offset, so we can take it off the block now, // which will avoid double counting the offset usage. qualifier.layoutXfbOffset = TQualifier::layoutXfbOffsetEnd; -#endif } // Calculate and save the offset of each block member, using the recursively @@ -8771,7 +9035,8 @@ void TParseContext::fixBlockUniformOffsets(TQualifier& qualifier, TTypeList& typ // "The specified offset must be a multiple // of the base alignment of the type of the block member it qualifies, or a compile-time error results." if (! IsMultipleOfPow2(memberQualifier.layoutOffset, memberAlignment)) - error(memberLoc, "must be a multiple of the member's alignment", "offset", ""); + error(memberLoc, "must be a multiple of the member's alignment", "offset", + "(layout offset = %d | member alignment = %d)", memberQualifier.layoutOffset, memberAlignment); // GLSL: "It is a compile-time error to specify an offset that is smaller than the offset of the previous // member in the block or that lies within the previous member of the block" @@ -8914,7 +9179,7 @@ void TParseContext::addQualifierToExisting(const TSourceLoc& loc, TQualifier qua // TParseContext::declareBlock. if (!symbol && qualifier.hasBufferReference()) { TTypeList typeList; - TType blockType(&typeList, identifier, qualifier);; + TType blockType(&typeList, identifier, qualifier); TType blockNameType(EbtReference, blockType, identifier); TVariable* blockNameVar = new TVariable(&identifier, blockNameType, true); if (! symbolTable.insert(*blockNameVar)) { @@ -8993,7 +9258,6 @@ void TParseContext::invariantCheck(const TSourceLoc& loc, const TQualifier& qual // void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, const TPublicType& publicType) { -#ifndef GLSLANG_WEB if (publicType.shaderQualifiers.vertices != TQualifier::layoutNotSet) { assert(language == EShLangTessControl || language == EShLangGeometry || language == EShLangMesh); const char* id = (language == EShLangTessControl) ? "vertices" : "max_vertices"; @@ -9085,7 +9349,7 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con else error(loc, "can only apply to 'in'", "point_mode", ""); } -#endif + for (int i = 0; i < 3; ++i) { if (publicType.shaderQualifiers.localSizeNotDefault[i]) { if (publicType.qualifier.storage == EvqVaryingIn) { @@ -9102,9 +9366,7 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con } if (intermediate.getLocalSize(i) > (unsigned int)max) error(loc, "too large; see gl_MaxComputeWorkGroupSize", "local_size", ""); - } -#ifndef GLSLANG_WEB - else if (language == EShLangMesh) { + } else if (language == EShLangMesh) { switch (i) { case 0: max = extensionTurnedOn(E_GL_EXT_mesh_shader) ? @@ -9154,9 +9416,7 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con "gl_MaxTaskWorkGroupSizeEXT" : "gl_MaxTaskWorkGroupSizeNV"); error(loc, maxsErrtring.c_str(), "local_size", ""); } - } -#endif - else { + } else { assert(0); } @@ -9181,7 +9441,6 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con } } -#ifndef GLSLANG_WEB if (publicType.shaderQualifiers.earlyFragmentTests) { if (publicType.qualifier.storage == EvqVaryingIn) intermediate.setEarlyFragmentTests(); @@ -9200,6 +9459,24 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con else error(loc, "can only apply to 'in'", "post_coverage_coverage", ""); } + if (publicType.shaderQualifiers.nonCoherentColorAttachmentReadEXT) { + if (publicType.qualifier.storage == EvqVaryingIn) + intermediate.setNonCoherentColorAttachmentReadEXT(); + else + error(loc, "can only apply to 'in'", "non_coherent_color_attachment_readEXT", ""); + } + if (publicType.shaderQualifiers.nonCoherentDepthAttachmentReadEXT) { + if (publicType.qualifier.storage == EvqVaryingIn) + intermediate.setNonCoherentDepthAttachmentReadEXT(); + else + error(loc, "can only apply to 'in'", "non_coherent_depth_attachment_readEXT", ""); + } + if (publicType.shaderQualifiers.nonCoherentStencilAttachmentReadEXT) { + if (publicType.qualifier.storage == EvqVaryingIn) + intermediate.setNonCoherentStencilAttachmentReadEXT(); + else + error(loc, "can only apply to 'in'", "non_coherent_stencil_attachment_readEXT", ""); + } if (publicType.shaderQualifiers.hasBlendEquation()) { if (publicType.qualifier.storage != EvqVaryingOut) error(loc, "can only apply to 'out'", "blend equation", ""); @@ -9259,7 +9536,7 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con // Exit early as further checks are not valid return; } -#endif + const TQualifier& qualifier = publicType.qualifier; if (qualifier.isAuxiliary() || @@ -9292,7 +9569,6 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con case EvqVaryingIn: break; case EvqVaryingOut: -#ifndef GLSLANG_WEB if (qualifier.hasStream()) globalOutputDefaults.layoutStream = qualifier.layoutStream; if (qualifier.hasXfbBuffer()) @@ -9301,7 +9577,6 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con if (! intermediate.setXfbBufferStride(globalOutputDefaults.layoutXfbBuffer, qualifier.layoutXfbStride)) error(loc, "all stride settings must match for xfb buffer", "xfb_stride", "%d", qualifier.layoutXfbBuffer); } -#endif break; case EvqShared: if (qualifier.hasMatrix()) @@ -9456,4 +9731,38 @@ const TTypeList* TParseContext::recordStructCopy(TStructRecord& record, const TT return originStruct; } +TLayoutFormat TParseContext::mapLegacyLayoutFormat(TLayoutFormat legacyLayoutFormat, TBasicType imageType) +{ + TLayoutFormat layoutFormat = ElfNone; + if (imageType == EbtFloat) { + switch (legacyLayoutFormat) { + case ElfSize1x16: layoutFormat = ElfR16f; break; + case ElfSize1x32: layoutFormat = ElfR32f; break; + case ElfSize2x32: layoutFormat = ElfRg32f; break; + case ElfSize4x32: layoutFormat = ElfRgba32f; break; + default: break; + } + } else if (imageType == EbtUint) { + switch (legacyLayoutFormat) { + case ElfSize1x8: layoutFormat = ElfR8ui; break; + case ElfSize1x16: layoutFormat = ElfR16ui; break; + case ElfSize1x32: layoutFormat = ElfR32ui; break; + case ElfSize2x32: layoutFormat = ElfRg32ui; break; + case ElfSize4x32: layoutFormat = ElfRgba32ui; break; + default: break; + } + } else if (imageType == EbtInt) { + switch (legacyLayoutFormat) { + case ElfSize1x8: layoutFormat = ElfR8i; break; + case ElfSize1x16: layoutFormat = ElfR16i; break; + case ElfSize1x32: layoutFormat = ElfR32i; break; + case ElfSize2x32: layoutFormat = ElfRg32i; break; + case ElfSize4x32: layoutFormat = ElfRgba32i; break; + default: break; + } + } + + return layoutFormat; +} + } // end namespace glslang diff --git a/third_party/glslang/glslang/MachineIndependent/ParseHelper.h b/third_party/glslang/glslang/MachineIndependent/ParseHelper.h index 885fd90810f..05ebca275df 100644 --- a/third_party/glslang/glslang/MachineIndependent/ParseHelper.h +++ b/third_party/glslang/glslang/MachineIndependent/ParseHelper.h @@ -95,12 +95,15 @@ class TParseContextBase : public TParseVersions { globalUniformSet(TQualifier::layoutSetEnd), atomicCounterBlockSet(TQualifier::layoutSetEnd) { + // use storage buffer on SPIR-V 1.3 and up + if (spvVersion.spv >= EShTargetSpv_1_3) + intermediate.setUseStorageBuffer(); + if (entryPoint != nullptr) sourceEntryPointName = *entryPoint; } virtual ~TParseContextBase() { } -#if !defined(GLSLANG_WEB) || defined(GLSLANG_WEB_DEVEL) virtual void C_DECL error(const TSourceLoc&, const char* szReason, const char* szToken, const char* szExtraInfoFormat, ...); virtual void C_DECL warn(const TSourceLoc&, const char* szReason, const char* szToken, @@ -109,7 +112,6 @@ class TParseContextBase : public TParseVersions { const char* szExtraInfoFormat, ...); virtual void C_DECL ppWarn(const TSourceLoc&, const char* szReason, const char* szToken, const char* szExtraInfoFormat, ...); -#endif virtual void setLimits(const TBuiltInResource&) = 0; @@ -194,6 +196,7 @@ class TParseContextBase : public TParseVersions { struct TPragma contextPragma; int beginInvocationInterlockCount; int endInvocationInterlockCount; + bool compileOnly = false; protected: TParseContextBase(TParseContextBase&); @@ -327,10 +330,8 @@ class TParseContext : public TParseContextBase { TIntermTyped* handleBracketDereference(const TSourceLoc&, TIntermTyped* base, TIntermTyped* index); void handleIndexLimits(const TSourceLoc&, TIntermTyped* base, TIntermTyped* index); -#ifndef GLSLANG_WEB void makeEditable(TSymbol*&) override; void ioArrayCheck(const TSourceLoc&, const TType&, const TString& identifier); -#endif bool isIoResizeArray(const TType&) const; void fixIoArraySize(const TSourceLoc&, TType&); void handleIoResizeArrayAccess(const TSourceLoc&, TIntermTyped* base); @@ -378,7 +379,7 @@ class TParseContext : public TParseContextBase { void globalCheck(const TSourceLoc&, const char* token); bool constructorError(const TSourceLoc&, TIntermNode*, TFunction&, TOperator, TType&); bool constructorTextureSamplerError(const TSourceLoc&, const TFunction&); - void arraySizeCheck(const TSourceLoc&, TIntermTyped* expr, TArraySize&, const char *sizeType); + void arraySizeCheck(const TSourceLoc&, TIntermTyped* expr, TArraySize&, const char *sizeType, const bool allowZero = false); bool arrayQualifierError(const TSourceLoc&, const TQualifier&); bool arrayError(const TSourceLoc&, const TType&); void arraySizeRequiredCheck(const TSourceLoc&, const TArraySizes&); @@ -393,14 +394,14 @@ class TParseContext : public TParseContextBase { void accStructCheck(const TSourceLoc & loc, const TType & type, const TString & identifier); void transparentOpaqueCheck(const TSourceLoc&, const TType&, const TString& identifier); void memberQualifierCheck(glslang::TPublicType&); - void globalQualifierFixCheck(const TSourceLoc&, TQualifier&, bool isMemberCheck = false); + void globalQualifierFixCheck(const TSourceLoc&, TQualifier&, bool isMemberCheck = false, const TPublicType* publicType = nullptr); void globalQualifierTypeCheck(const TSourceLoc&, const TQualifier&, const TPublicType&); bool structQualifierErrorCheck(const TSourceLoc&, const TPublicType& pType); void mergeQualifiers(const TSourceLoc&, TQualifier& dst, const TQualifier& src, bool force); void setDefaultPrecision(const TSourceLoc&, TPublicType&, TPrecisionQualifier); int computeSamplerTypeIndex(TSampler&); TPrecisionQualifier getDefaultPrecision(TPublicType&); - void precisionQualifierCheck(const TSourceLoc&, TBasicType, TQualifier&); + void precisionQualifierCheck(const TSourceLoc&, TBasicType, TQualifier&, bool isCoopMat); void parameterTypeCheck(const TSourceLoc&, TStorageQualifier qualifier, const TType& type); bool containsFieldWithBasicType(const TType& type ,TBasicType basicType); TSymbol* redeclareBuiltinVariable(const TSourceLoc&, const TString&, const TQualifier&, const TShaderQualifiers&); @@ -418,6 +419,7 @@ class TParseContext : public TParseContextBase { void inductiveLoopCheck(const TSourceLoc&, TIntermNode* init, TIntermLoop* loop); void arrayLimitCheck(const TSourceLoc&, const TString&, int size); void limitCheck(const TSourceLoc&, int value, const char* limit, const char* feature); + void coopMatTypeParametersCheck(const TSourceLoc&, const TPublicType&); void inductiveLoopBodyCheck(TIntermNode*, long long loopIndexId, TSymbolTable&); void constantIndexExpressionCheck(TIntermNode*); @@ -438,12 +440,12 @@ class TParseContext : public TParseContextBase { const TFunction* findFunction400(const TSourceLoc& loc, const TFunction& call, bool& builtIn); const TFunction* findFunctionExplicitTypes(const TSourceLoc& loc, const TFunction& call, bool& builtIn); void declareTypeDefaults(const TSourceLoc&, const TPublicType&); - TIntermNode* declareVariable(const TSourceLoc&, TString& identifier, const TPublicType&, TArraySizes* typeArray = 0, TIntermTyped* initializer = 0); + TIntermNode* declareVariable(const TSourceLoc&, TString& identifier, const TPublicType&, TArraySizes* typeArray = nullptr, TIntermTyped* initializer = nullptr); TIntermTyped* addConstructor(const TSourceLoc&, TIntermNode*, const TType&); TIntermTyped* constructAggregate(TIntermNode*, const TType&, int, const TSourceLoc&); TIntermTyped* constructBuiltIn(const TType&, TOperator, TIntermTyped*, const TSourceLoc&, bool subset); void inheritMemoryQualifiers(const TQualifier& from, TQualifier& to); - void declareBlock(const TSourceLoc&, TTypeList& typeList, const TString* instanceName = 0, TArraySizes* arraySizes = 0); + void declareBlock(const TSourceLoc&, TTypeList& typeList, const TString* instanceName = nullptr, TArraySizes* arraySizes = nullptr); void blockStorageRemap(const TSourceLoc&, const TString*, TQualifier&); void blockStageIoCheck(const TSourceLoc&, const TQualifier&); void blockQualifierCheck(const TSourceLoc&, const TQualifier&, bool instanceName); @@ -456,11 +458,12 @@ class TParseContext : public TParseContextBase { void addQualifierToExisting(const TSourceLoc&, TQualifier, TIdentifierList&); void invariantCheck(const TSourceLoc&, const TQualifier&); void updateStandaloneQualifierDefaults(const TSourceLoc&, const TPublicType&); + void updateBindlessQualifier(TType& memberType); void wrapupSwitchSubsequence(TIntermAggregate* statements, TIntermNode* branchNode); TIntermNode* addSwitch(const TSourceLoc&, TIntermTyped* expression, TIntermAggregate* body); const TTypeList* recordStructCopy(TStructRecord&, const TType*, const TType*); + TLayoutFormat mapLegacyLayoutFormat(TLayoutFormat legacyLayoutFormat, TBasicType imageType); -#ifndef GLSLANG_WEB TAttributeType attributeFromName(const TString& name) const; TAttributes* makeAttributes(const TString& identifier) const; TAttributes* makeAttributes(const TString& identifier, TIntermNode* node) const; @@ -480,14 +483,13 @@ class TParseContext : public TParseContextBase { TSpirvRequirement* mergeSpirvRequirements(const TSourceLoc& loc, TSpirvRequirement* spirvReq1, TSpirvRequirement* spirvReq2); TSpirvTypeParameters* makeSpirvTypeParameters(const TSourceLoc& loc, const TIntermConstantUnion* constant); + TSpirvTypeParameters* makeSpirvTypeParameters(const TSourceLoc& loc, const TPublicType& type); TSpirvTypeParameters* mergeSpirvTypeParameters(TSpirvTypeParameters* spirvTypeParams1, TSpirvTypeParameters* spirvTypeParams2); TSpirvInstruction* makeSpirvInstruction(const TSourceLoc& loc, const TString& name, const TString& value); TSpirvInstruction* makeSpirvInstruction(const TSourceLoc& loc, const TString& name, int value); TSpirvInstruction* mergeSpirvInstruction(const TSourceLoc& loc, TSpirvInstruction* spirvInst1, TSpirvInstruction* spirvInst2); -#endif - void checkAndResizeMeshViewDim(const TSourceLoc&, TType&, bool isBlockMember); protected: @@ -500,9 +502,7 @@ class TParseContext : public TParseContextBase { bool isRuntimeLength(const TIntermTyped&) const; TIntermNode* executeInitializer(const TSourceLoc&, TIntermTyped* initializer, TVariable* variable); TIntermTyped* convertInitializerList(const TSourceLoc&, const TType&, TIntermTyped* initializer); -#ifndef GLSLANG_WEB void finish() override; -#endif virtual const char* getGlobalUniformBlockName() const override; virtual void finalizeGlobalUniformBlockLayout(TVariable&) override; @@ -539,7 +539,6 @@ class TParseContext : public TParseContextBase { TQualifier globalOutputDefaults; TQualifier globalSharedDefaults; TString currentCaller; // name of last function body entered (not valid when at global scope) -#ifndef GLSLANG_WEB int* atomicUintOffsets; // to become an array of the right size to hold an offset per binding point bool anyIndexLimits; TIdSetType inductiveLoopIds; @@ -580,7 +579,6 @@ class TParseContext : public TParseContextBase { // array-sizing declarations // TVector ioArraySymbolResizeList; -#endif }; } // end namespace glslang diff --git a/third_party/glslang/glslang/MachineIndependent/PoolAlloc.cpp b/third_party/glslang/glslang/MachineIndependent/PoolAlloc.cpp index 84c40f4e795..5d7173c9db8 100644 --- a/third_party/glslang/glslang/MachineIndependent/PoolAlloc.cpp +++ b/third_party/glslang/glslang/MachineIndependent/PoolAlloc.cpp @@ -35,34 +35,28 @@ #include "../Include/Common.h" #include "../Include/PoolAlloc.h" -#include "../Include/InitializeGlobals.h" -#include "../OSDependent/osinclude.h" - namespace glslang { -// Process-wide TLS index -OS_TLSIndex PoolIndex; +namespace { +thread_local TPoolAllocator* threadPoolAllocator = nullptr; + +TPoolAllocator* GetDefaultThreadPoolAllocator() +{ + thread_local TPoolAllocator defaultAllocator; + return &defaultAllocator; +} +} // anonymous namespace // Return the thread-specific current pool. TPoolAllocator& GetThreadPoolAllocator() { - return *static_cast(OS_GetTLSValue(PoolIndex)); + return *(threadPoolAllocator ? threadPoolAllocator : GetDefaultThreadPoolAllocator()); } // Set the thread-specific current pool. void SetThreadPoolAllocator(TPoolAllocator* poolAllocator) { - OS_SetTLSValue(PoolIndex, poolAllocator); -} - -// Process-wide set up of the TLS pool storage. -bool InitializePoolIndex() -{ - // Allocate a TLS index. - if ((PoolIndex = OS_AllocTLSIndex()) == OS_INVALID_TLS_INDEX) - return false; - - return true; + threadPoolAllocator = poolAllocator; } // @@ -137,16 +131,6 @@ TPoolAllocator::~TPoolAllocator() } } -const unsigned char TAllocation::guardBlockBeginVal = 0xfb; -const unsigned char TAllocation::guardBlockEndVal = 0xfe; -const unsigned char TAllocation::userDataFill = 0xcd; - -# ifdef GUARD_BLOCKS - const size_t TAllocation::guardBlockSize = 16; -# else - const size_t TAllocation::guardBlockSize = 0; -# endif - // // Check a single guard block for damage // @@ -267,8 +251,8 @@ void* TPoolAllocator::allocate(size_t numBytes) // size_t numBytesToAlloc = allocationSize + headerSkip; tHeader* memory = reinterpret_cast(::new char[numBytesToAlloc]); - if (memory == 0) - return 0; + if (memory == nullptr) + return nullptr; // Use placement-new to initialize header new(memory) tHeader(inUseList, (numBytesToAlloc + pageSize - 1) / pageSize); @@ -289,8 +273,8 @@ void* TPoolAllocator::allocate(size_t numBytes) freeList = freeList->nextPage; } else { memory = reinterpret_cast(::new char[pageSize]); - if (memory == 0) - return 0; + if (memory == nullptr) + return nullptr; } // Use placement-new to initialize header @@ -308,7 +292,7 @@ void* TPoolAllocator::allocate(size_t numBytes) // void TAllocation::checkAllocList() const { - for (const TAllocation* alloc = this; alloc != 0; alloc = alloc->prevAlloc) + for (const TAllocation* alloc = this; alloc != nullptr; alloc = alloc->prevAlloc) alloc->check(); } diff --git a/third_party/glslang/glslang/MachineIndependent/Scan.cpp b/third_party/glslang/glslang/MachineIndependent/Scan.cpp index 7f51173ebc3..5c7e2e662e8 100644 --- a/third_party/glslang/glslang/MachineIndependent/Scan.cpp +++ b/third_party/glslang/glslang/MachineIndependent/Scan.cpp @@ -324,11 +324,9 @@ struct str_hash // A single global usable by all threads, by all versions, by all languages. // After a single process-level initialization, this is read only and thread safe std::unordered_map* KeywordMap = nullptr; -#ifndef GLSLANG_WEB std::unordered_set* ReservedSet = nullptr; -#endif -}; +} namespace glslang { @@ -343,6 +341,7 @@ void TScanContext::fillInKeywordMap() (*KeywordMap)["const"] = CONST; (*KeywordMap)["uniform"] = UNIFORM; + (*KeywordMap)["tileImageEXT"] = TILEIMAGEEXT; (*KeywordMap)["buffer"] = BUFFER; (*KeywordMap)["in"] = IN; (*KeywordMap)["out"] = OUT; @@ -408,7 +407,6 @@ void TScanContext::fillInKeywordMap() (*KeywordMap)["uvec3"] = UVEC3; (*KeywordMap)["uvec4"] = UVEC4; -#ifndef GLSLANG_WEB (*KeywordMap)["nonuniformEXT"] = NONUNIFORM; (*KeywordMap)["demote"] = DEMOTE; (*KeywordMap)["attribute"] = ATTRIBUTE; @@ -598,7 +596,6 @@ void TScanContext::fillInKeywordMap() (*KeywordMap)["spirv_storage_class"] = SPIRV_STORAGE_CLASS; (*KeywordMap)["spirv_by_reference"] = SPIRV_BY_REFERENCE; (*KeywordMap)["spirv_literal"] = SPIRV_LITERAL; -#endif (*KeywordMap)["sampler2D"] = SAMPLER2D; (*KeywordMap)["samplerCube"] = SAMPLERCUBE; @@ -632,7 +629,6 @@ void TScanContext::fillInKeywordMap() (*KeywordMap)["sampler"] = SAMPLER; (*KeywordMap)["samplerShadow"] = SAMPLERSHADOW; -#ifndef GLSLANG_WEB (*KeywordMap)["textureCubeArray"] = TEXTURECUBEARRAY; (*KeywordMap)["itextureCubeArray"] = ITEXTURECUBEARRAY; (*KeywordMap)["utextureCubeArray"] = UTEXTURECUBEARRAY; @@ -685,6 +681,10 @@ void TScanContext::fillInKeywordMap() (*KeywordMap)["texture2DRect"] = TEXTURE2DRECT; (*KeywordMap)["texture1DArray"] = TEXTURE1DARRAY; + (*KeywordMap)["attachmentEXT"] = ATTACHMENTEXT; + (*KeywordMap)["iattachmentEXT"] = IATTACHMENTEXT; + (*KeywordMap)["uattachmentEXT"] = UATTACHMENTEXT; + (*KeywordMap)["subpassInput"] = SUBPASSINPUT; (*KeywordMap)["subpassInputMS"] = SUBPASSINPUTMS; (*KeywordMap)["isubpassInput"] = ISUBPASSINPUT; @@ -765,6 +765,11 @@ void TScanContext::fillInKeywordMap() (*KeywordMap)["icoopmatNV"] = ICOOPMATNV; (*KeywordMap)["ucoopmatNV"] = UCOOPMATNV; + (*KeywordMap)["coopmat"] = COOPMAT; + + (*KeywordMap)["hitObjectNV"] = HITOBJECTNV; + (*KeywordMap)["hitObjectAttributeNV"] = HITOBJECTATTRNV; + ReservedSet = new std::unordered_set; ReservedSet->insert("common"); @@ -804,17 +809,14 @@ void TScanContext::fillInKeywordMap() ReservedSet->insert("cast"); ReservedSet->insert("namespace"); ReservedSet->insert("using"); -#endif } void TScanContext::deleteKeywordMap() { delete KeywordMap; KeywordMap = nullptr; -#ifndef GLSLANG_WEB delete ReservedSet; ReservedSet = nullptr; -#endif } // Called by yylex to get the next token. @@ -895,14 +897,12 @@ int TScanContext::tokenize(TPpContext* pp, TParserToken& token) case PpAtomConstInt: parserToken->sType.lex.i = ppToken.ival; return INTCONSTANT; case PpAtomConstUint: parserToken->sType.lex.i = ppToken.ival; return UINTCONSTANT; case PpAtomConstFloat: parserToken->sType.lex.d = ppToken.dval; return FLOATCONSTANT; -#ifndef GLSLANG_WEB case PpAtomConstInt16: parserToken->sType.lex.i = ppToken.ival; return INT16CONSTANT; case PpAtomConstUint16: parserToken->sType.lex.i = ppToken.ival; return UINT16CONSTANT; case PpAtomConstInt64: parserToken->sType.lex.i64 = ppToken.i64val; return INT64CONSTANT; case PpAtomConstUint64: parserToken->sType.lex.i64 = ppToken.i64val; return UINT64CONSTANT; case PpAtomConstDouble: parserToken->sType.lex.d = ppToken.dval; return DOUBLECONSTANT; case PpAtomConstFloat16: parserToken->sType.lex.d = ppToken.dval; return FLOAT16CONSTANT; -#endif case PpAtomIdentifier: { int token = tokenizeIdentifier(); @@ -924,10 +924,8 @@ int TScanContext::tokenize(TPpContext* pp, TParserToken& token) int TScanContext::tokenizeIdentifier() { -#ifndef GLSLANG_WEB if (ReservedSet->find(tokenText) != ReservedSet->end()) return reservedWord(); -#endif auto it = KeywordMap->find(tokenText); if (it == KeywordMap->end()) { @@ -939,6 +937,7 @@ int TScanContext::tokenizeIdentifier() switch (keyword) { case CONST: case UNIFORM: + case TILEIMAGEEXT: case IN: case OUT: case INOUT: @@ -1049,7 +1048,6 @@ int TScanContext::tokenizeIdentifier() return identifierOrReserved(reserved); } -#ifndef GLSLANG_WEB case NOPERSPECTIVE: if (parseContext.extensionTurnedOn(E_GL_NV_shader_noperspective_interpolation)) return keyword; @@ -1075,12 +1073,18 @@ int TScanContext::tokenizeIdentifier() parseContext.extensionTurnedOn(E_GL_NV_ray_tracing)) return keyword; return identifierOrType(); + case ACCSTRUCTEXT: + if (parseContext.symbolTable.atBuiltInLevel() || + parseContext.extensionTurnedOn(E_GL_EXT_ray_tracing) || + parseContext.extensionTurnedOn(E_GL_EXT_ray_query) || + parseContext.extensionTurnedOn(E_GL_NV_displacement_micromap)) + return keyword; + return identifierOrType(); case PAYLOADEXT: case PAYLOADINEXT: case HITATTREXT: case CALLDATAEXT: case CALLDATAINEXT: - case ACCSTRUCTEXT: if (parseContext.symbolTable.atBuiltInLevel() || parseContext.extensionTurnedOn(E_GL_EXT_ray_tracing) || parseContext.extensionTurnedOn(E_GL_EXT_ray_query)) @@ -1136,7 +1140,7 @@ int TScanContext::tokenizeIdentifier() case SUBROUTINE: return es30ReservedFromGLSL(400); -#endif + case SHARED: if ((parseContext.isEsProfile() && parseContext.version < 300) || (!parseContext.isEsProfile() && parseContext.version < 140)) @@ -1171,7 +1175,6 @@ int TScanContext::tokenizeIdentifier() case MAT4X4: return matNxM(); -#ifndef GLSLANG_WEB case DMAT2: case DMAT3: case DMAT4: @@ -1476,7 +1479,6 @@ int TScanContext::tokenizeIdentifier() return keyword; else return identifierOrType(); -#endif case UINT: case UVEC2: @@ -1531,7 +1533,6 @@ int TScanContext::tokenizeIdentifier() else return identifierOrType(); -#ifndef GLSLANG_WEB case ISAMPLER1D: case ISAMPLER1DARRAY: case SAMPLER1DARRAYSHADOW: @@ -1655,6 +1656,9 @@ int TScanContext::tokenizeIdentifier() case ISUBPASSINPUTMS: case USUBPASSINPUT: case USUBPASSINPUTMS: + case ATTACHMENTEXT: + case IATTACHMENTEXT: + case UATTACHMENTEXT: if (parseContext.spvVersion.vulkan > 0) return keyword; else @@ -1769,6 +1773,13 @@ int TScanContext::tokenizeIdentifier() return keyword; return identifierOrType(); + case COOPMAT: + afterType = true; + if (parseContext.symbolTable.atBuiltInLevel() || + parseContext.extensionTurnedOn(E_GL_KHR_cooperative_matrix)) + return keyword; + return identifierOrType(); + case DEMOTE: if (parseContext.extensionTurnedOn(E_GL_EXT_demote_to_helper_invocation)) return keyword; @@ -1789,7 +1800,20 @@ int TScanContext::tokenizeIdentifier() parseContext.extensionTurnedOn(E_GL_EXT_spirv_intrinsics)) return keyword; return identifierOrType(); -#endif + + case HITOBJECTNV: + if (parseContext.symbolTable.atBuiltInLevel() || + (!parseContext.isEsProfile() && parseContext.version >= 460 + && parseContext.extensionTurnedOn(E_GL_NV_shader_invocation_reorder))) + return keyword; + return identifierOrType(); + + case HITOBJECTATTRNV: + if (parseContext.symbolTable.atBuiltInLevel() || + (!parseContext.isEsProfile() && parseContext.version >= 460 + && parseContext.extensionTurnedOn(E_GL_NV_shader_invocation_reorder))) + return keyword; + return identifierOrType(); default: parseContext.infoSink.info.message(EPrefixInternalError, "Unknown glslang keyword", loc); diff --git a/third_party/glslang/glslang/MachineIndependent/ShaderLang.cpp b/third_party/glslang/glslang/MachineIndependent/ShaderLang.cpp index 57e3423a763..9a42acae911 100644 --- a/third_party/glslang/glslang/MachineIndependent/ShaderLang.cpp +++ b/third_party/glslang/glslang/MachineIndependent/ShaderLang.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include "SymbolTable.h" #include "ParseHelper.h" #include "Scan.h" @@ -81,6 +82,9 @@ namespace { // anonymous namespace for file-local functions and symbols // Shared global; access should be protected by a global mutex/critical section. int NumberOfClients = 0; +// global initialization lock +std::mutex init_lock; + using namespace glslang; // Create a language specific version of parseables. @@ -295,14 +299,6 @@ void InitializeStageSymbolTable(TBuiltInParseables& builtInParseables, int versi EShLanguage language, EShSource source, TInfoSink& infoSink, TSymbolTable** commonTable, TSymbolTable** symbolTables) { -#ifdef GLSLANG_WEB - profile = EEsProfile; - version = 310; -#elif defined(GLSLANG_ANGLE) - profile = ECoreProfile; - version = 450; -#endif - (*symbolTables[language]).adoptLevels(*commonTable[CommonIndex(profile, language)]); InitializeSymbolTable(builtInParseables.getStageString(language), version, profile, spvVersion, language, source, infoSink, *symbolTables[language]); @@ -319,14 +315,6 @@ void InitializeStageSymbolTable(TBuiltInParseables& builtInParseables, int versi // bool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable, TSymbolTable** symbolTables, int version, EProfile profile, const SpvVersion& spvVersion, EShSource source) { -#ifdef GLSLANG_WEB - profile = EEsProfile; - version = 310; -#elif defined(GLSLANG_ANGLE) - profile = ECoreProfile; - version = 450; -#endif - std::unique_ptr builtInParseables(CreateBuiltInParseables(infoSink, source)); if (builtInParseables == nullptr) @@ -349,7 +337,6 @@ bool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable, TS InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangFragment, source, infoSink, commonTable, symbolTables); -#ifndef GLSLANG_WEB // check for tessellation if ((profile != EEsProfile && version >= 150) || (profile == EEsProfile && version >= 310)) { @@ -371,7 +358,6 @@ bool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable, TS InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangCompute, source, infoSink, commonTable, symbolTables); -#ifndef GLSLANG_ANGLE // check for ray tracing stages if (profile != EEsProfile && version >= 450) { InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangRayGen, source, @@ -399,8 +385,6 @@ bool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable, TS (profile == EEsProfile && version >= 320)) InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangTask, source, infoSink, commonTable, symbolTables); -#endif // !GLSLANG_ANGLE -#endif // !GLSLANG_WEB return true; } @@ -437,18 +421,15 @@ void SetupBuiltinSymbolTable(int version, EProfile profile, const SpvVersion& sp TInfoSink infoSink; // Make sure only one thread tries to do this at a time - glslang::GetGlobalLock(); + const std::lock_guard lock(init_lock); // See if it's already been done for this version/profile combination int versionIndex = MapVersionToIndex(version); int spvVersionIndex = MapSpvVersionToIndex(spvVersion); int profileIndex = MapProfileToIndex(profile); int sourceIndex = MapSourceToIndex(source); - if (CommonSymbolTable[versionIndex][spvVersionIndex][profileIndex][sourceIndex][EPcGeneral]) { - glslang::ReleaseGlobalLock(); - + if (CommonSymbolTable[versionIndex][spvVersionIndex][profileIndex][sourceIndex][EPcGeneral]) return; - } // Switch to a new pool TPoolAllocator& previousAllocator = GetThreadPoolAllocator(); @@ -495,20 +476,16 @@ void SetupBuiltinSymbolTable(int version, EProfile profile, const SpvVersion& sp delete builtInPoolAllocator; SetThreadPoolAllocator(&previousAllocator); - - glslang::ReleaseGlobalLock(); } // Function to Print all builtins void DumpBuiltinSymbolTable(TInfoSink& infoSink, const TSymbolTable& symbolTable) { -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) infoSink.debug << "BuiltinSymbolTable {\n"; symbolTable.dump(infoSink, true); infoSink.debug << "}\n"; -#endif } // Return true if the shader was correctly specified for version/profile/stage. @@ -606,7 +583,6 @@ bool DeduceVersionProfile(TInfoSink& infoSink, EShLanguage stage, bool versionNo break; } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) // Correct for stage type... switch (stage) { case EShLangGeometry: @@ -694,7 +670,6 @@ bool DeduceVersionProfile(TInfoSink& infoSink, EShLanguage stage, bool versionNo break; } } -#endif return correct; } @@ -821,7 +796,8 @@ bool ProcessDeferred( bool requireNonempty, TShader::Includer& includer, const std::string sourceEntryPointName = "", - const TEnvironment* environment = nullptr) // optional way of fully setting all versions, overriding the above + const TEnvironment* environment = nullptr, // optional way of fully setting all versions, overriding the above + bool compileOnly = false) { // This must be undone (.pop()) by the caller, after it finishes consuming the created tree. GetThreadPoolAllocator().push(); @@ -884,7 +860,6 @@ bool ProcessDeferred( : userInput.scanVersion(version, profile, versionNotFirstToken); bool versionNotFound = version == 0; if (forceDefaultVersionAndProfile && source == EShSourceGlsl) { -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) if (! (messages & EShMsgSuppressWarnings) && ! versionNotFound && (version != defaultVersion || profile != defaultProfile)) { compiler->infoSink.info << "Warning, (version, profile) forced to be (" @@ -892,7 +867,7 @@ bool ProcessDeferred( << "), while in source code it is (" << version << ", " << ProfileName(profile) << ")\n"; } -#endif + if (versionNotFound) { versionNotFirstToken = false; versionNotFirst = false; @@ -907,16 +882,7 @@ bool ProcessDeferred( bool goodVersion = DeduceVersionProfile(compiler->infoSink, stage, versionNotFirst, defaultVersion, source, version, profile, spvVersion); -#ifdef GLSLANG_WEB - profile = EEsProfile; - version = 310; -#elif defined(GLSLANG_ANGLE) - profile = ECoreProfile; - version = 450; -#endif - bool versionWillBeError = (versionNotFound || (profile == EEsProfile && version >= 300 && versionNotFirst)); -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) bool warnVersionNotFirst = false; if (! versionWillBeError && versionNotFirstToken) { if (messages & EShMsgRelaxedErrors) @@ -924,7 +890,6 @@ bool ProcessDeferred( else versionWillBeError = true; } -#endif intermediate.setSource(source); intermediate.setVersion(version); @@ -978,6 +943,7 @@ bool ProcessDeferred( std::unique_ptr parseContext(CreateParseContext(*symbolTable, intermediate, version, profile, source, stage, compiler->infoSink, spvVersion, forwardCompatible, messages, false, sourceEntryPointName)); + parseContext->compileOnly = compileOnly; TPpContext ppContext(*parseContext, names[numPre] ? names[numPre] : "", includer); // only GLSL (bison triggered, really) needs an externally set scan context @@ -989,13 +955,11 @@ bool ProcessDeferred( parseContext->setLimits(*resources); if (! goodVersion) parseContext->addError(); -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) if (warnVersionNotFirst) { TSourceLoc loc; loc.init(); parseContext->warn(loc, "Illegal to have non-comment, non-whitespace tokens before #version", "#version", ""); } -#endif parseContext->initializeExtensionBehavior(); @@ -1027,8 +991,6 @@ bool ProcessDeferred( return success; } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - // Responsible for keeping track of the most recent source string and line in // the preprocessor and outputting newlines appropriately if the source string // or line changes. @@ -1106,8 +1068,8 @@ struct DoPreprocessing { EShOptimizationLevel, EShMessages) { // This is a list of tokens that do not require a space before or after. - static const std::string unNeededSpaceTokens = ";()[]"; - static const std::string noSpaceBeforeTokens = ","; + static const std::string noNeededSpaceBeforeTokens = ";)[].,"; + static const std::string noNeededSpaceAfterTokens = ".(["; glslang::TPpToken ppToken; parseContext.setScanner(&input); @@ -1180,6 +1142,7 @@ struct DoPreprocessing { }); int lastToken = EndOfInput; // lastToken records the last token processed. + std::string lastTokenName; do { int token = ppContext.tokenize(ppToken); if (token == EndOfInput) @@ -1198,12 +1161,23 @@ struct DoPreprocessing { // Output a space in between tokens, but not at the start of a line, // and also not around special tokens. This helps with readability // and consistency. - if (!isNewString && !isNewLine && lastToken != EndOfInput && - (unNeededSpaceTokens.find((char)token) == std::string::npos) && - (unNeededSpaceTokens.find((char)lastToken) == std::string::npos) && - (noSpaceBeforeTokens.find((char)token) == std::string::npos)) { - outputBuffer += ' '; + if (!isNewString && !isNewLine && lastToken != EndOfInput) { + // left parenthesis need a leading space, except it is in a function-call-like context. + // examples: `for (xxx)`, `a * (b + c)`, `vec(2.0)`, `foo(x, y, z)` + if (token == '(') { + if (lastToken != PpAtomIdentifier || + lastTokenName == "if" || + lastTokenName == "for" || + lastTokenName == "while" || + lastTokenName == "switch") + outputBuffer += ' '; + } else if ((noNeededSpaceBeforeTokens.find((char)token) == std::string::npos) && + (noNeededSpaceAfterTokens.find((char)lastToken) == std::string::npos)) { + outputBuffer += ' '; + } } + if (token == PpAtomIdentifier) + lastTokenName = ppToken.name; lastToken = token; if (token == PpAtomConstString) outputBuffer += "\""; @@ -1225,8 +1199,6 @@ struct DoPreprocessing { std::string* outputString; }; -#endif - // DoFullParse is a valid ProcessingConext template argument for fully // parsing the shader. It populates the "intermediate" with the AST. struct DoFullParse{ @@ -1250,16 +1222,13 @@ struct DoFullParse{ parseContext.infoSink.info << parseContext.getNumErrors() << " compilation errors. No code generated.\n\n"; } -#ifndef GLSLANG_ANGLE if (messages & EShMsgAST) intermediate.output(parseContext.infoSink, true); -#endif return success; } }; -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) // Take a single compilation unit, and run the preprocessor on it. // Return: True if there were no issues found in preprocessing, // False if during preprocessing any unknown version, pragmas or @@ -1294,7 +1263,6 @@ bool PreprocessDeferred( forwardCompatible, messages, intermediate, parser, false, includer, "", environment); } -#endif // // do a partial compile on the given strings for a single compilation unit @@ -1325,14 +1293,15 @@ bool CompileDeferred( TIntermediate& intermediate,// returned tree, etc. TShader::Includer& includer, const std::string sourceEntryPointName = "", - TEnvironment* environment = nullptr) + TEnvironment* environment = nullptr, + bool compileOnly = false) { DoFullParse parser; return ProcessDeferred(compiler, shaderStrings, numStrings, inputLengths, stringNames, preamble, optLevel, resources, defaultVersion, defaultProfile, forceDefaultVersionAndProfile, overrideVersion, forwardCompatible, messages, intermediate, parser, - true, includer, sourceEntryPointName, environment); + true, includer, sourceEntryPointName, environment, compileOnly); } } // end anonymous namespace for local functions @@ -1342,12 +1311,10 @@ bool CompileDeferred( // int ShInitialize() { - glslang::InitGlobalLock(); - if (! InitProcess()) return 0; - glslang::GetGlobalLock(); + const std::lock_guard lock(init_lock); ++NumberOfClients; if (PerProcessGPA == nullptr) @@ -1358,7 +1325,6 @@ int ShInitialize() glslang::HlslScanContext::fillInKeywordMap(); #endif - glslang::ReleaseGlobalLock(); return 1; } @@ -1370,7 +1336,7 @@ int ShInitialize() ShHandle ShConstructCompiler(const EShLanguage language, int debugOptions) { if (!InitThread()) - return 0; + return nullptr; TShHandleBase* base = static_cast(ConstructCompiler(language, debugOptions)); @@ -1380,7 +1346,7 @@ ShHandle ShConstructCompiler(const EShLanguage language, int debugOptions) ShHandle ShConstructLinker(const EShExecutable executable, int debugOptions) { if (!InitThread()) - return 0; + return nullptr; TShHandleBase* base = static_cast(ConstructLinker(executable, debugOptions)); @@ -1390,7 +1356,7 @@ ShHandle ShConstructLinker(const EShExecutable executable, int debugOptions) ShHandle ShConstructUniformMap() { if (!InitThread()) - return 0; + return nullptr; TShHandleBase* base = static_cast(ConstructUniformMap()); @@ -1399,7 +1365,7 @@ ShHandle ShConstructUniformMap() void ShDestruct(ShHandle handle) { - if (handle == 0) + if (handle == nullptr) return; TShHandleBase* base = static_cast(handle); @@ -1417,14 +1383,11 @@ void ShDestruct(ShHandle handle) // int ShFinalize() { - glslang::GetGlobalLock(); + const std::lock_guard lock(init_lock); --NumberOfClients; assert(NumberOfClients >= 0); - bool finalize = NumberOfClients == 0; - if (! finalize) { - glslang::ReleaseGlobalLock(); + if (NumberOfClients > 0) return 1; - } for (int version = 0; version < VersionCount; ++version) { for (int spvVersion = 0; spvVersion < SpvVersionCount; ++spvVersion) { @@ -1432,7 +1395,7 @@ int ShFinalize() for (int source = 0; source < SourceCount; ++source) { for (int stage = 0; stage < EShLangCount; ++stage) { delete SharedSymbolTables[version][spvVersion][p][source][stage]; - SharedSymbolTables[version][spvVersion][p][source][stage] = 0; + SharedSymbolTables[version][spvVersion][p][source][stage] = nullptr; } } } @@ -1445,7 +1408,7 @@ int ShFinalize() for (int source = 0; source < SourceCount; ++source) { for (int pc = 0; pc < EPcCount; ++pc) { delete CommonSymbolTable[version][spvVersion][p][source][pc]; - CommonSymbolTable[version][spvVersion][p][source][pc] = 0; + CommonSymbolTable[version][spvVersion][p][source][pc] = nullptr; } } } @@ -1462,7 +1425,6 @@ int ShFinalize() glslang::HlslScanContext::deleteKeywordMap(); #endif - glslang::ReleaseGlobalLock(); return 1; } @@ -1488,12 +1450,12 @@ int ShCompile( ) { // Map the generic handle to the C++ object - if (handle == 0) + if (handle == nullptr) return 0; TShHandleBase* base = reinterpret_cast(handle); TCompiler* compiler = base->getAsCompiler(); - if (compiler == 0) + if (compiler == nullptr) return 0; SetThreadPoolAllocator(compiler->getPool()); @@ -1533,13 +1495,13 @@ int ShLinkExt( const ShHandle compHandles[], const int numHandles) { - if (linkHandle == 0 || numHandles == 0) + if (linkHandle == nullptr || numHandles == 0) return 0; THandleList cObjects; for (int i = 0; i < numHandles; ++i) { - if (compHandles[i] == 0) + if (compHandles[i] == nullptr) return 0; TShHandleBase* base = reinterpret_cast(compHandles[i]); if (base->getAsLinker()) { @@ -1548,18 +1510,17 @@ int ShLinkExt( if (base->getAsCompiler()) cObjects.push_back(base->getAsCompiler()); - if (cObjects[i] == 0) + if (cObjects[i] == nullptr) return 0; } TShHandleBase* base = reinterpret_cast(linkHandle); TLinker* linker = static_cast(base->getAsLinker()); - SetThreadPoolAllocator(linker->getPool()); - - if (linker == 0) + if (linker == nullptr) return 0; - + + SetThreadPoolAllocator(linker->getPool()); linker->infoSink.info.erase(); for (int i = 0; i < numHandles; ++i) { @@ -1582,7 +1543,7 @@ int ShLinkExt( // void ShSetEncryptionMethod(ShHandle handle) { - if (handle == 0) + if (handle == nullptr) return; } @@ -1591,8 +1552,8 @@ void ShSetEncryptionMethod(ShHandle handle) // const char* ShGetInfoLog(const ShHandle handle) { - if (handle == 0) - return 0; + if (handle == nullptr) + return nullptr; TShHandleBase* base = static_cast(handle); TInfoSink* infoSink; @@ -1602,7 +1563,7 @@ const char* ShGetInfoLog(const ShHandle handle) else if (base->getAsLinker()) infoSink = &(base->getAsLinker()->getInfoSink()); else - return 0; + return nullptr; infoSink->info << infoSink->debug.c_str(); return infoSink->info.c_str(); @@ -1614,14 +1575,14 @@ const char* ShGetInfoLog(const ShHandle handle) // const void* ShGetExecutable(const ShHandle handle) { - if (handle == 0) - return 0; + if (handle == nullptr) + return nullptr; TShHandleBase* base = reinterpret_cast(handle); TLinker* linker = static_cast(base->getAsLinker()); - if (linker == 0) - return 0; + if (linker == nullptr) + return nullptr; return linker->getObjectCode(); } @@ -1636,13 +1597,13 @@ const void* ShGetExecutable(const ShHandle handle) // int ShSetVirtualAttributeBindings(const ShHandle handle, const ShBindingTable* table) { - if (handle == 0) + if (handle == nullptr) return 0; TShHandleBase* base = reinterpret_cast(handle); TLinker* linker = static_cast(base->getAsLinker()); - if (linker == 0) + if (linker == nullptr) return 0; linker->setAppAttributeBindings(table); @@ -1655,13 +1616,13 @@ int ShSetVirtualAttributeBindings(const ShHandle handle, const ShBindingTable* t // int ShSetFixedAttributeBindings(const ShHandle handle, const ShBindingTable* table) { - if (handle == 0) + if (handle == nullptr) return 0; TShHandleBase* base = reinterpret_cast(handle); TLinker* linker = static_cast(base->getAsLinker()); - if (linker == 0) + if (linker == nullptr) return 0; linker->setFixedAttributeBindings(table); @@ -1673,12 +1634,12 @@ int ShSetFixedAttributeBindings(const ShHandle handle, const ShBindingTable* tab // int ShExcludeAttributes(const ShHandle handle, int *attributes, int count) { - if (handle == 0) + if (handle == nullptr) return 0; TShHandleBase* base = reinterpret_cast(handle); TLinker* linker = static_cast(base->getAsLinker()); - if (linker == 0) + if (linker == nullptr) return 0; linker->setExcludedAttributes(attributes, count); @@ -1694,12 +1655,12 @@ int ShExcludeAttributes(const ShHandle handle, int *attributes, int count) // int ShGetUniformLocation(const ShHandle handle, const char* name) { - if (handle == 0) + if (handle == nullptr) return -1; TShHandleBase* base = reinterpret_cast(handle); TUniformMap* uniformMap= base->getAsUniformMap(); - if (uniformMap == 0) + if (uniformMap == nullptr) return -1; return uniformMap->getLocation(name); @@ -1845,8 +1806,6 @@ void TShader::setDxPositionW(bool invert) { intermediate->setDxPos void TShader::setEnhancedMsgs() { intermediate->setEnhancedMsgs(); } void TShader::setNanMinMaxClamp(bool useNonNan) { intermediate->setNanMinMaxClamp(useNonNan); } -#ifndef GLSLANG_WEB - // Set binding base for given resource type void TShader::setShiftBinding(TResourceType res, unsigned int base) { intermediate->setShiftBinding(res, base); @@ -1888,7 +1847,6 @@ void TShader::setUniformLocationBase(int base) void TShader::setNoStorageFormat(bool useUnknownFormat) { intermediate->setNoStorageFormat(useUnknownFormat); } void TShader::setResourceSetBinding(const std::vector& base) { intermediate->setResourceSetBinding(base); } void TShader::setTextureSamplerTransformMode(EShTextureSamplerTransformMode mode) { intermediate->setTextureSamplerTransformMode(mode); } -#endif void TShader::addBlockStorageOverride(const char* nameStr, TBlockStorageClass backing) { intermediate->addBlockStorageOverride(nameStr, backing); } @@ -1924,10 +1882,9 @@ bool TShader::parse(const TBuiltInResource* builtInResources, int defaultVersion preamble, EShOptNone, builtInResources, defaultVersion, defaultProfile, forceDefaultVersionAndProfile, overrideVersion, forwardCompatible, messages, *intermediate, includer, sourceEntryPointName, - &environment); + &environment, compileOnly); } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) // Fill in a string with the result of preprocessing ShaderStrings // Returns true if all extensions, pragmas and version strings were valid. // @@ -1953,7 +1910,6 @@ bool TShader::preprocess(const TBuiltInResource* builtInResources, forwardCompatible, message, includer, *intermediate, output_string, &environment); } -#endif const char* TShader::getInfoLog() { @@ -1965,16 +1921,12 @@ const char* TShader::getInfoDebugLog() return infoSink->debug.c_str(); } -TProgram::TProgram() : -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - reflection(0), -#endif - linked(false) +TProgram::TProgram() : reflection(nullptr), linked(false) { pool = new TPoolAllocator; infoSink = new TInfoSink; for (int s = 0; s < EShLangCount; ++s) { - intermediate[s] = 0; + intermediate[s] = nullptr; newedIntermediate[s] = false; } } @@ -1982,9 +1934,7 @@ TProgram::TProgram() : TProgram::~TProgram() { delete infoSink; -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) delete reflection; -#endif for (int s = 0; s < EShLangCount; ++s) if (newedIntermediate[s]) @@ -2032,7 +1982,6 @@ bool TProgram::linkStage(EShLanguage stage, EShMessages messages) if (stages[stage].size() == 0) return true; -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) int numEsShaders = 0, numNonEsShaders = 0; for (auto it = stages[stage].begin(); it != stages[stage].end(); ++it) { if ((*it)->intermediate->getProfile() == EEsProfile) { @@ -2083,15 +2032,10 @@ bool TProgram::linkStage(EShLanguage stage, EShMessages messages) for (it = stages[stage].begin(); it != stages[stage].end(); ++it) intermediate[stage]->merge(*infoSink, *(*it)->intermediate); } -#else - intermediate[stage] = stages[stage].front()->intermediate; -#endif intermediate[stage]->finalCheck(*infoSink, (messages & EShMsgKeepUncalled) != 0); -#ifndef GLSLANG_ANGLE if (messages & EShMsgAST) intermediate[stage]->output(*infoSink, true); -#endif return intermediate[stage]->getNumErrors() == 0; } @@ -2169,8 +2113,6 @@ const char* TProgram::getInfoDebugLog() return infoSink->debug.c_str(); } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - // // Reflection implementation. // @@ -2251,6 +2193,4 @@ bool TProgram::mapIO(TIoMapResolver* pResolver, TIoMapper* pIoMapper) return ioMapper->doMap(pResolver, *infoSink); } -#endif // !GLSLANG_WEB && !GLSLANG_ANGLE - } // end namespace glslang diff --git a/third_party/glslang/glslang/MachineIndependent/SpirvIntrinsics.cpp b/third_party/glslang/glslang/MachineIndependent/SpirvIntrinsics.cpp index 6650f7d9eed..1d08797ac2e 100644 --- a/third_party/glslang/glslang/MachineIndependent/SpirvIntrinsics.cpp +++ b/third_party/glslang/glslang/MachineIndependent/SpirvIntrinsics.cpp @@ -33,8 +33,6 @@ // POSSIBILITY OF SUCH DAMAGE. // -#ifndef GLSLANG_WEB - // // GL_EXT_spirv_intrinsics // @@ -45,6 +43,15 @@ namespace glslang { +bool TSpirvTypeParameter::operator==(const TSpirvTypeParameter& rhs) const +{ + if (getAsConstant() != nullptr) + return getAsConstant()->getConstArray() == rhs.getAsConstant()->getConstArray(); + + assert(getAsType() != nullptr); + return *getAsType() == *rhs.getAsType(); +} + // // Handle SPIR-V requirements // @@ -67,7 +74,7 @@ TSpirvRequirement* TParseContext::makeSpirvRequirement(const TSourceLoc& loc, co spirvReq->capabilities.insert(capability->getAsConstantUnion()->getConstArray()[0].getIConst()); } } else - error(loc, "unknow SPIR-V requirement", name.c_str(), ""); + error(loc, "unknown SPIR-V requirement", name.c_str(), ""); return spirvReq; } @@ -168,7 +175,7 @@ void TQualifier::setSpirvDecorateId(int decoration, const TIntermAggregate* args TVector extraOperands; for (auto arg : args->getSequence()) { auto extraOperand = arg->getAsTyped(); - assert(extraOperand != nullptr && extraOperand->getQualifier().isConstant()); + assert(extraOperand != nullptr); extraOperands.push_back(extraOperand); } spirvDecorate->decorateIds[decoration] = extraOperands; @@ -202,30 +209,29 @@ TString TQualifier::getSpirvDecorateQualifierString() const const auto appendStr = [&](const char* s) { qualifierString.append(s); }; const auto appendDecorate = [&](const TIntermTyped* constant) { - auto& constArray = constant->getAsConstantUnion() != nullptr ? constant->getAsConstantUnion()->getConstArray() - : constant->getAsSymbolNode()->getConstArray(); - if (constant->getBasicType() == EbtFloat) { - float value = static_cast(constArray[0].getDConst()); - appendFloat(value); - } - else if (constant->getBasicType() == EbtInt) { - int value = constArray[0].getIConst(); - appendInt(value); - } - else if (constant->getBasicType() == EbtUint) { - unsigned value = constArray[0].getUConst(); - appendUint(value); - } - else if (constant->getBasicType() == EbtBool) { - bool value = constArray[0].getBConst(); - appendBool(value); + if (constant->getAsConstantUnion()) { + auto& constArray = constant->getAsConstantUnion()->getConstArray(); + if (constant->getBasicType() == EbtFloat) { + float value = static_cast(constArray[0].getDConst()); + appendFloat(value); + } else if (constant->getBasicType() == EbtInt) { + int value = constArray[0].getIConst(); + appendInt(value); + } else if (constant->getBasicType() == EbtUint) { + unsigned value = constArray[0].getUConst(); + appendUint(value); + } else if (constant->getBasicType() == EbtBool) { + bool value = constArray[0].getBConst(); + appendBool(value); + } else if (constant->getBasicType() == EbtString) { + const TString* value = constArray[0].getSConst(); + appendStr(value->c_str()); + } else + assert(0); + } else { + assert(constant->getAsSymbolNode()); + appendStr(constant->getAsSymbolNode()->getName().c_str()); } - else if (constant->getBasicType() == EbtString) { - const TString* value = constArray[0].getSConst(); - appendStr(value->c_str()); - } - else - assert(0); }; for (auto& decorate : spirvDecorate->decorates) { @@ -284,14 +290,20 @@ TSpirvTypeParameters* TParseContext::makeSpirvTypeParameters(const TSourceLoc& l constant->getBasicType() != EbtBool && constant->getBasicType() != EbtString) error(loc, "this type not allowed", constant->getType().getBasicString(), ""); - else { - assert(constant); + else spirvTypeParams->push_back(TSpirvTypeParameter(constant)); - } return spirvTypeParams; } +TSpirvTypeParameters* TParseContext::makeSpirvTypeParameters(const TSourceLoc& /* loc */, + const TPublicType& type) +{ + TSpirvTypeParameters* spirvTypeParams = new TSpirvTypeParameters; + spirvTypeParams->push_back(TSpirvTypeParameter(new TType(type))); + return spirvTypeParams; +} + TSpirvTypeParameters* TParseContext::mergeSpirvTypeParameters(TSpirvTypeParameters* spirvTypeParams1, TSpirvTypeParameters* spirvTypeParams2) { // Merge SPIR-V type parameters of the second one to the first one @@ -346,5 +358,3 @@ TSpirvInstruction* TParseContext::mergeSpirvInstruction(const TSourceLoc& loc, T } } // end namespace glslang - -#endif // GLSLANG_WEB diff --git a/third_party/glslang/glslang/MachineIndependent/SymbolTable.cpp b/third_party/glslang/glslang/MachineIndependent/SymbolTable.cpp index 2f1b5ac3cb0..dae5a8b9183 100644 --- a/third_party/glslang/glslang/MachineIndependent/SymbolTable.cpp +++ b/third_party/glslang/glslang/MachineIndependent/SymbolTable.cpp @@ -65,7 +65,6 @@ void TType::buildMangledName(TString& mangledName) const case EbtInt: mangledName += 'i'; break; case EbtUint: mangledName += 'u'; break; case EbtBool: mangledName += 'b'; break; -#ifndef GLSLANG_WEB case EbtDouble: mangledName += 'd'; break; case EbtFloat16: mangledName += "f16"; break; case EbtInt8: mangledName += "i8"; break; @@ -78,12 +77,10 @@ void TType::buildMangledName(TString& mangledName) const case EbtAccStruct: mangledName += "as"; break; case EbtRayQuery: mangledName += "rq"; break; case EbtSpirvType: mangledName += "spv-t"; break; -#endif + case EbtHitObjectNV: mangledName += "ho"; break; case EbtSampler: switch (sampler.type) { -#ifndef GLSLANG_WEB case EbtFloat16: mangledName += "f16"; break; -#endif case EbtInt: mangledName += "i"; break; case EbtUint: mangledName += "u"; break; case EbtInt64: mangledName += "i64"; break; @@ -110,12 +107,10 @@ void TType::buildMangledName(TString& mangledName) const case Esd2D: mangledName += "2"; break; case Esd3D: mangledName += "3"; break; case EsdCube: mangledName += "C"; break; -#ifndef GLSLANG_WEB case Esd1D: mangledName += "1"; break; case EsdRect: mangledName += "R2"; break; case EsdBuffer: mangledName += "B"; break; case EsdSubpass: mangledName += "P"; break; -#endif default: break; // some compilers want this } @@ -183,8 +178,6 @@ void TType::buildMangledName(TString& mangledName) const } } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - // // Dump functions. // @@ -263,8 +256,6 @@ void TSymbolTable::dump(TInfoSink& infoSink, bool complete) const } } -#endif - // // Functions have buried pointers to delete. // @@ -327,6 +318,16 @@ void TSymbolTableLevel::setFunctionExtensions(const char* name, int num, const c } } +// Make a single function require an extension(s). i.e., this will only set the extensions for the symbol that matches 'name' exactly. +// This is different from setFunctionExtensions, which uses std::map::lower_bound to effectively set all symbols that start with 'name'. +// Should only be used for a version/profile that actually needs the extension(s). +void TSymbolTableLevel::setSingleFunctionExtensions(const char* name, int num, const char* const extensions[]) +{ + if (auto candidate = level.find(name); candidate != level.end()) { + candidate->second->setExtensions(num, extensions); + } +} + // // Make all symbols in this table level read only. // @@ -381,7 +382,7 @@ TVariable* TVariable::clone() const TFunction::TFunction(const TFunction& copyOf) : TSymbol(copyOf) { for (unsigned int i = 0; i < copyOf.parameters.size(); ++i) { - TParameter param; + TParameter param{}; parameters.push_back(param); (void)parameters.back().copyParam(copyOf.parameters[i]); } @@ -397,9 +398,7 @@ TFunction::TFunction(const TFunction& copyOf) : TSymbol(copyOf) implicitThis = copyOf.implicitThis; illegalImplicitThis = copyOf.illegalImplicitThis; defaultParamCount = copyOf.defaultParamCount; -#ifndef GLSLANG_WEB spirvInst = copyOf.spirvInst; -#endif } TFunction* TFunction::clone() const @@ -416,7 +415,7 @@ TAnonMember* TAnonMember::clone() const // copy of the original container. assert(0); - return 0; + return nullptr; } TSymbolTableLevel* TSymbolTableLevel::clone() const diff --git a/third_party/glslang/glslang/MachineIndependent/SymbolTable.h b/third_party/glslang/glslang/MachineIndependent/SymbolTable.h index 2e570bb3bc7..94c3929da23 100644 --- a/third_party/glslang/glslang/MachineIndependent/SymbolTable.h +++ b/third_party/glslang/glslang/MachineIndependent/SymbolTable.h @@ -84,7 +84,7 @@ typedef TVector TExtensionList; class TSymbol { public: POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator()) - explicit TSymbol(const TString *n) : name(n), uniqueId(0), extensions(0), writable(true) { } + explicit TSymbol(const TString *n) : name(n), uniqueId(0), extensions(nullptr), writable(true) { } virtual TSymbol* clone() const = 0; virtual ~TSymbol() { } // rely on all symbol owned memory coming from the pool @@ -97,18 +97,18 @@ class TSymbol { changeName(NewPoolTString(newName.c_str())); } virtual const TString& getMangledName() const { return getName(); } - virtual TFunction* getAsFunction() { return 0; } - virtual const TFunction* getAsFunction() const { return 0; } - virtual TVariable* getAsVariable() { return 0; } - virtual const TVariable* getAsVariable() const { return 0; } - virtual const TAnonMember* getAsAnonMember() const { return 0; } + virtual TFunction* getAsFunction() { return nullptr; } + virtual const TFunction* getAsFunction() const { return nullptr; } + virtual TVariable* getAsVariable() { return nullptr; } + virtual const TVariable* getAsVariable() const { return nullptr; } + virtual const TAnonMember* getAsAnonMember() const { return nullptr; } virtual const TType& getType() const = 0; virtual TType& getWritableType() = 0; virtual void setUniqueId(long long id) { uniqueId = id; } virtual long long getUniqueId() const { return uniqueId; } virtual void setExtensions(int numExts, const char* const exts[]) { - assert(extensions == 0); + assert(extensions == nullptr); assert(numExts > 0); extensions = NewPoolObject(extensions); for (int e = 0; e < numExts; ++e) @@ -117,10 +117,8 @@ class TSymbol { virtual int getNumExtensions() const { return extensions == nullptr ? 0 : (int)extensions->size(); } virtual const char** getExtensions() const { return extensions->data(); } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) virtual void dump(TInfoSink& infoSink, bool complete = false) const = 0; void dumpExtensions(TInfoSink& infoSink) const; -#endif virtual bool isReadOnly() const { return ! writable; } virtual void makeReadOnly() { writable = false; } @@ -196,9 +194,7 @@ class TVariable : public TSymbol { } virtual const char** getMemberExtensions(int member) const { return (*memberExtensions)[member].data(); } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) virtual void dump(TInfoSink& infoSink, bool complete = false) const; -#endif protected: explicit TVariable(const TVariable&); @@ -229,7 +225,7 @@ struct TParameter { if (param.name) name = NewPoolTString(param.name->c_str()); else - name = 0; + name = nullptr; type = param.type->clone(); defaultValue = param.defaultValue; return *this; @@ -243,14 +239,15 @@ struct TParameter { class TFunction : public TSymbol { public: explicit TFunction(TOperator o) : - TSymbol(0), + TSymbol(nullptr), op(o), defined(false), prototyped(false), implicitThis(false), illegalImplicitThis(false), defaultParamCount(0) { } TFunction(const TString *name, const TType& retType, TOperator tOp = EOpNull) : TSymbol(name), mangledName(*name + '('), op(tOp), - defined(false), prototyped(false), implicitThis(false), illegalImplicitThis(false), defaultParamCount(0) + defined(false), prototyped(false), implicitThis(false), illegalImplicitThis(false), defaultParamCount(0), + linkType(ELinkNone) { returnType.shallowCopy(retType); declaredBuiltIn = retType.getQualifier().builtIn; @@ -319,19 +316,19 @@ class TFunction : public TSymbol { virtual TParameter& operator[](int i) { assert(writable); return parameters[i]; } virtual const TParameter& operator[](int i) const { return parameters[i]; } + const TQualifier& getQualifier() const { return returnType.getQualifier(); } -#ifndef GLSLANG_WEB virtual void setSpirvInstruction(const TSpirvInstruction& inst) { relateToOperator(EOpSpirvInst); spirvInst = inst; } virtual const TSpirvInstruction& getSpirvInstruction() const { return spirvInst; } -#endif -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) virtual void dump(TInfoSink& infoSink, bool complete = false) const override; -#endif + + void setExport() { linkType = ELinkExport; } + TLinkType getLinkType() const { return linkType; } protected: explicit TFunction(const TFunction&); @@ -353,9 +350,8 @@ class TFunction : public TSymbol { // but is not allowed to use them, or see hidden symbols instead. int defaultParamCount; -#ifndef GLSLANG_WEB TSpirvInstruction spirvInst; // SPIR-V instruction qualifiers -#endif + TLinkType linkType; }; // @@ -395,9 +391,7 @@ class TAnonMember : public TSymbol { virtual const char** getExtensions() const override { return anonContainer.getMemberExtensions(memberNumber); } virtual int getAnonId() const { return anonId; } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) virtual void dump(TInfoSink& infoSink, bool complete = false) const override; -#endif protected: explicit TAnonMember(const TAnonMember&); @@ -411,7 +405,7 @@ class TAnonMember : public TSymbol { class TSymbolTableLevel { public: POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator()) - TSymbolTableLevel() : defaultPrecision(0), anonId(0), thisLevel(false) { } + TSymbolTableLevel() : defaultPrecision(nullptr), anonId(0), thisLevel(false) { } ~TSymbolTableLevel(); bool insert(const TString& name, TSymbol* symbol) { @@ -493,7 +487,7 @@ class TSymbolTableLevel { { tLevel::const_iterator it = level.find(name); if (it == level.end()) - return 0; + return nullptr; else return (*it).second; } @@ -561,7 +555,7 @@ class TSymbolTableLevel { { // can call multiple times at one scope, will only latch on first call, // as we're tracking the previous scope's values, not the current values - if (defaultPrecision != 0) + if (defaultPrecision != nullptr) return; defaultPrecision = new TPrecisionQualifier[EbtNumTypes]; @@ -573,7 +567,7 @@ class TSymbolTableLevel { { // can be called for table level pops that didn't set the // defaults - if (defaultPrecision == 0 || p == 0) + if (defaultPrecision == nullptr || p == nullptr) return; for (int t = 0; t < EbtNumTypes; ++t) @@ -582,9 +576,8 @@ class TSymbolTableLevel { void relateToOperator(const char* name, TOperator op); void setFunctionExtensions(const char* name, int num, const char* const extensions[]); -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) + void setSingleFunctionExtensions(const char* name, int num, const char* const extensions[]); void dump(TInfoSink& infoSink, bool complete = false) const; -#endif TSymbolTableLevel* clone() const; void readOnly(); @@ -622,7 +615,7 @@ class TSymbolTable { // don't deallocate levels passed in from elsewhere while (table.size() > adoptedLevels) - pop(0); + pop(nullptr); } void adoptLevels(TSymbolTable& symTable) @@ -783,7 +776,7 @@ class TSymbolTable { // Normal find of a symbol, that can optionally say whether the symbol was found // at a built-in level or the current top-scope level. - TSymbol* find(const TString& name, bool* builtIn = 0, bool* currentScope = 0, int* thisDepthP = 0) + TSymbol* find(const TString& name, bool* builtIn = nullptr, bool* currentScope = nullptr, int* thisDepthP = nullptr) { int level = currentLevel(); TSymbol* symbol; @@ -827,7 +820,7 @@ class TSymbolTable { ++thisDepth; symbol = table[level]->find(name); --level; - } while (symbol == 0 && level >= 0); + } while (symbol == nullptr && level >= 0); if (! table[level + 1]->isThisLevel()) thisDepth = 0; @@ -885,6 +878,12 @@ class TSymbolTable { table[level]->setFunctionExtensions(name, num, extensions); } + void setSingleFunctionExtensions(const char* name, int num, const char* const extensions[]) + { + for (unsigned int level = 0; level < table.size(); ++level) + table[level]->setSingleFunctionExtensions(name, num, extensions); + } + void setVariableExtensions(const char* name, int numExts, const char* const extensions[]) { TSymbol* symbol = find(TString(name)); @@ -912,9 +911,7 @@ class TSymbolTable { } long long getMaxSymbolId() { return uniqueId; } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) void dump(TInfoSink& infoSink, bool complete = false) const; -#endif void copyTable(const TSymbolTable& copyOf); void setPreviousDefaultPrecisions(TPrecisionQualifier *p) { table[currentLevel()]->setPreviousDefaultPrecisions(p); } diff --git a/third_party/glslang/glslang/MachineIndependent/Versions.cpp b/third_party/glslang/glslang/MachineIndependent/Versions.cpp index 226e9467405..bede71604e4 100644 --- a/third_party/glslang/glslang/MachineIndependent/Versions.cpp +++ b/third_party/glslang/glslang/MachineIndependent/Versions.cpp @@ -151,8 +151,6 @@ namespace glslang { -#ifndef GLSLANG_WEB - // // Initialize all extensions, almost always to 'disable', as once their features // are incorporated into a core version, their features are supported through allowing that @@ -227,6 +225,7 @@ void TParseVersions::initializeExtensionBehavior() extensionBehavior[E_GL_ARB_texture_query_lod] = EBhDisable; extensionBehavior[E_GL_ARB_vertex_attrib_64bit] = EBhDisable; extensionBehavior[E_GL_ARB_draw_instanced] = EBhDisable; + extensionBehavior[E_GL_ARB_bindless_texture] = EBhDisable; extensionBehavior[E_GL_ARB_fragment_coord_conventions] = EBhDisable; @@ -262,6 +261,8 @@ void TParseVersions::initializeExtensionBehavior() extensionBehavior[E_GL_EXT_fragment_shader_barycentric] = EBhDisable; + extensionBehavior[E_GL_KHR_cooperative_matrix] = EBhDisable; + // #line and #include extensionBehavior[E_GL_GOOGLE_cpp_style_line_directive] = EBhDisable; extensionBehavior[E_GL_GOOGLE_include_directive] = EBhDisable; @@ -296,10 +297,17 @@ void TParseVersions::initializeExtensionBehavior() extensionBehavior[E_GL_NV_compute_shader_derivatives] = EBhDisable; extensionBehavior[E_GL_NV_shader_texture_footprint] = EBhDisable; extensionBehavior[E_GL_NV_mesh_shader] = EBhDisable; - extensionBehavior[E_GL_NV_cooperative_matrix] = EBhDisable; extensionBehavior[E_GL_NV_shader_sm_builtins] = EBhDisable; extensionBehavior[E_GL_NV_integer_cooperative_matrix] = EBhDisable; + extensionBehavior[E_GL_NV_shader_invocation_reorder] = EBhDisable; + extensionBehavior[E_GL_NV_displacement_micromap] = EBhDisable; + + // ARM + extensionBehavior[E_GL_ARM_shader_core_builtins] = EBhDisable; + + // QCOM + extensionBehavior[E_GL_QCOM_image_processing] = EBhDisable; // AEP extensionBehavior[E_GL_ANDROID_extension_pack_es31a] = EBhDisable; @@ -342,11 +350,15 @@ void TParseVersions::initializeExtensionBehavior() extensionBehavior[E_GL_EXT_blend_func_extended] = EBhDisable; extensionBehavior[E_GL_EXT_shader_implicit_conversions] = EBhDisable; extensionBehavior[E_GL_EXT_fragment_shading_rate] = EBhDisable; - extensionBehavior[E_GL_EXT_shader_image_int64] = EBhDisable; + extensionBehavior[E_GL_EXT_shader_image_int64] = EBhDisable; extensionBehavior[E_GL_EXT_terminate_invocation] = EBhDisable; extensionBehavior[E_GL_EXT_shared_memory_block] = EBhDisable; extensionBehavior[E_GL_EXT_spirv_intrinsics] = EBhDisable; extensionBehavior[E_GL_EXT_mesh_shader] = EBhDisable; + extensionBehavior[E_GL_EXT_opacity_micromap] = EBhDisable; + extensionBehavior[E_GL_EXT_ray_tracing_position_fetch] = EBhDisable; + extensionBehavior[E_GL_EXT_shader_tile_image] = EBhDisable; + extensionBehavior[E_GL_EXT_texture_shadow_lod] = EBhDisable; // OVR extensions extensionBehavior[E_GL_OVR_multiview] = EBhDisable; @@ -369,9 +381,10 @@ void TParseVersions::initializeExtensionBehavior() extensionBehavior[E_GL_EXT_shader_subgroup_extended_types_float16] = EBhDisable; extensionBehavior[E_GL_EXT_shader_atomic_float] = EBhDisable; extensionBehavior[E_GL_EXT_shader_atomic_float2] = EBhDisable; -} -#endif // GLSLANG_WEB + // Record extensions not for spv. + spvUnsupportedExt.push_back(E_GL_ARB_bindless_texture); +} // Get code that is not part of a shared symbol table, is specific to this shader, // or needed by the preprocessor (which does not use a shared symbol table). @@ -381,9 +394,6 @@ void TParseVersions::getPreamble(std::string& preamble) preamble = "#define GL_ES 1\n" "#define GL_FRAGMENT_PRECISION_HIGH 1\n" -#ifdef GLSLANG_WEB - ; -#else "#define GL_OES_texture_3D 1\n" "#define GL_OES_standard_derivatives 1\n" "#define GL_EXT_frag_depth 1\n" @@ -424,6 +434,8 @@ void TParseVersions::getPreamble(std::string& preamble) "#define GL_OES_texture_buffer 1\n" "#define GL_OES_texture_cube_map_array 1\n" "#define GL_EXT_shader_non_constant_global_initializers 1\n" + + "#define GL_QCOM_image_processing 1\n" ; if (version >= 300) { @@ -436,7 +448,6 @@ void TParseVersions::getPreamble(std::string& preamble) } else { // !isEsProfile() preamble = - "#define GL_FRAGMENT_PRECISION_HIGH 1\n" "#define GL_ARB_texture_rectangle 1\n" "#define GL_ARB_shading_language_420pack 1\n" "#define GL_ARB_texture_gather 1\n" @@ -476,6 +487,7 @@ void TParseVersions::getPreamble(std::string& preamble) "#define GL_ARB_vertex_attrib_64bit 1\n" "#define GL_ARB_draw_instanced 1\n" "#define GL_ARB_fragment_coord_conventions 1\n" + "#define GL_ARB_bindless_texture 1\n" "#define GL_EXT_shader_non_constant_global_initializers 1\n" "#define GL_EXT_shader_image_load_formatted 1\n" "#define GL_EXT_post_depth_coverage 1\n" @@ -505,6 +517,8 @@ void TParseVersions::getPreamble(std::string& preamble) "#define GL_KHR_shader_subgroup_clustered 1\n" "#define GL_KHR_shader_subgroup_quad 1\n" + "#define GL_KHR_cooperative_matrix 1\n" + "#define GL_EXT_shader_image_int64 1\n" "#define GL_EXT_shader_atomic_int64 1\n" "#define GL_EXT_shader_realtime_clock 1\n" @@ -512,6 +526,7 @@ void TParseVersions::getPreamble(std::string& preamble) "#define GL_EXT_ray_query 1\n" "#define GL_EXT_ray_flags_primitive_culling 1\n" "#define GL_EXT_ray_cull_mask 1\n" + "#define GL_EXT_ray_tracing_position_fetch 1\n" "#define GL_EXT_spirv_intrinsics 1\n" "#define GL_EXT_mesh_shader 1\n" @@ -543,6 +558,9 @@ void TParseVersions::getPreamble(std::string& preamble) "#define GL_NV_mesh_shader 1\n" "#define GL_NV_cooperative_matrix 1\n" "#define GL_NV_integer_cooperative_matrix 1\n" + "#define GL_NV_shader_invocation_reorder 1\n" + + "#define GL_QCOM_image_processing 1\n" "#define GL_EXT_shader_explicit_arithmetic_types 1\n" "#define GL_EXT_shader_explicit_arithmetic_types_int8 1\n" @@ -575,10 +593,11 @@ void TParseVersions::getPreamble(std::string& preamble) preamble += "#define GL_EXT_null_initializer 1\n"; preamble += "#define GL_EXT_subgroup_uniform_control_flow 1\n"; } -#endif // GLSLANG_WEB + if (version >= 130) { + preamble +="#define GL_FRAGMENT_PRECISION_HIGH 1\n"; + } } -#ifndef GLSLANG_WEB if ((!isEsProfile() && version >= 140) || (isEsProfile() && version >= 310)) { preamble += @@ -606,7 +625,6 @@ void TParseVersions::getPreamble(std::string& preamble) preamble += "#define GL_EXT_terminate_invocation 1\n" ; -#endif // #define VULKAN XXXX const int numberBufSize = 12; @@ -618,7 +636,6 @@ void TParseVersions::getPreamble(std::string& preamble) preamble += "\n"; } -#ifndef GLSLANG_WEB // #define GL_SPIRV XXXX if (spvVersion.openGl > 0) { preamble += "#define GL_SPIRV "; @@ -626,9 +643,7 @@ void TParseVersions::getPreamble(std::string& preamble) preamble += numberBuf; preamble += "\n"; } -#endif -#ifndef GLSLANG_WEB // GL_EXT_spirv_intrinsics if (!isEsProfile()) { switch (language) { @@ -649,7 +664,6 @@ void TParseVersions::getPreamble(std::string& preamble) default: break; } } -#endif } // @@ -661,7 +675,6 @@ const char* StageName(EShLanguage stage) case EShLangVertex: return "vertex"; case EShLangFragment: return "fragment"; case EShLangCompute: return "compute"; -#ifndef GLSLANG_WEB case EShLangTessControl: return "tessellation control"; case EShLangTessEvaluation: return "tessellation evaluation"; case EShLangGeometry: return "geometry"; @@ -673,7 +686,6 @@ const char* StageName(EShLanguage stage) case EShLangCallable: return "callable"; case EShLangMesh: return "mesh"; case EShLangTask: return "task"; -#endif default: return "unknown stage"; } } @@ -698,7 +710,6 @@ void TParseVersions::requireStage(const TSourceLoc& loc, EShLanguage stage, cons requireStage(loc, static_cast(1 << stage), featureDesc); } -#ifndef GLSLANG_WEB // // When to use requireProfile(): // @@ -736,7 +747,6 @@ void TParseVersions::profileRequires(const TSourceLoc& loc, int profileMask, int { if (profile & profileMask) { bool okay = minVersion > 0 && version >= minVersion; -#ifndef GLSLANG_WEB for (int i = 0; i < numExtensions; ++i) { switch (getExtensionBehavior(extensions[i])) { case EBhWarn: @@ -749,7 +759,6 @@ void TParseVersions::profileRequires(const TSourceLoc& loc, int profileMask, int default: break; // some compilers want this } } -#endif if (! okay) error(loc, "not supported for this version or the enabled extensions", featureDesc, ""); } @@ -1065,8 +1074,8 @@ void TParseVersions::checkExtensionStage(const TSourceLoc& loc, const char * con if (strcmp(extension, "GL_NV_mesh_shader") == 0) { requireStage(loc, (EShLanguageMask)(EShLangTaskMask | EShLangMeshMask | EShLangFragmentMask), "#extension GL_NV_mesh_shader"); - profileRequires(loc, ECoreProfile, 450, 0, "#extension GL_NV_mesh_shader"); - profileRequires(loc, EEsProfile, 320, 0, "#extension GL_NV_mesh_shader"); + profileRequires(loc, ECoreProfile, 450, nullptr, "#extension GL_NV_mesh_shader"); + profileRequires(loc, EEsProfile, 320, nullptr, "#extension GL_NV_mesh_shader"); if (extensionTurnedOn(E_GL_EXT_mesh_shader)) { error(loc, "GL_EXT_mesh_shader is already turned on, and not allowed with", "#extension", extension); } @@ -1074,8 +1083,8 @@ void TParseVersions::checkExtensionStage(const TSourceLoc& loc, const char * con else if (strcmp(extension, "GL_EXT_mesh_shader") == 0) { requireStage(loc, (EShLanguageMask)(EShLangTaskMask | EShLangMeshMask | EShLangFragmentMask), "#extension GL_EXT_mesh_shader"); - profileRequires(loc, ECoreProfile, 450, 0, "#extension GL_EXT_mesh_shader"); - profileRequires(loc, EEsProfile, 320, 0, "#extension GL_EXT_mesh_shader"); + profileRequires(loc, ECoreProfile, 450, nullptr, "#extension GL_EXT_mesh_shader"); + profileRequires(loc, EEsProfile, 320, nullptr, "#extension GL_EXT_mesh_shader"); if (extensionTurnedOn(E_GL_NV_mesh_shader)) { error(loc, "GL_NV_mesh_shader is already turned on, and not allowed with", "#extension", extension); } @@ -1098,6 +1107,13 @@ void TParseVersions::extensionRequires(const TSourceLoc &loc, const char * const minSpvVersion = iter->second; requireSpv(loc, extension, minSpvVersion); } + + if (spvVersion.spv != 0){ + for (auto ext : spvUnsupportedExt){ + if (strcmp(extension, ext.c_str()) == 0) + error(loc, "not allowed when using generating SPIR-V codes", extension, ""); + } + } } // Call for any operation needing full GLSL integer data-type support. @@ -1310,7 +1326,7 @@ void TParseVersions::int64Check(const TSourceLoc& loc, const char* op, bool buil } } -void TParseVersions::fcoopmatCheck(const TSourceLoc& loc, const char* op, bool builtIn) +void TParseVersions::fcoopmatCheckNV(const TSourceLoc& loc, const char* op, bool builtIn) { if (!builtIn) { const char* const extensions[] = {E_GL_NV_cooperative_matrix}; @@ -1318,14 +1334,22 @@ void TParseVersions::fcoopmatCheck(const TSourceLoc& loc, const char* op, bool b } } -void TParseVersions::intcoopmatCheck(const TSourceLoc& loc, const char* op, bool builtIn) +void TParseVersions::intcoopmatCheckNV(const TSourceLoc& loc, const char* op, bool builtIn) { if (!builtIn) { const char* const extensions[] = {E_GL_NV_integer_cooperative_matrix}; requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op); } } -#endif // GLSLANG_WEB + +void TParseVersions::coopmatCheck(const TSourceLoc& loc, const char* op, bool builtIn) +{ + if (!builtIn) { + const char* const extensions[] = {E_GL_KHR_cooperative_matrix}; + requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op); + } +} + // Call for any operation removed because SPIR-V is in use. void TParseVersions::spvRemoved(const TSourceLoc& loc, const char* op) { @@ -1343,26 +1367,20 @@ void TParseVersions::vulkanRemoved(const TSourceLoc& loc, const char* op) // Call for any operation that requires Vulkan. void TParseVersions::requireVulkan(const TSourceLoc& loc, const char* op) { -#ifndef GLSLANG_WEB if (spvVersion.vulkan == 0) error(loc, "only allowed when using GLSL for Vulkan", op, ""); -#endif } // Call for any operation that requires SPIR-V. void TParseVersions::requireSpv(const TSourceLoc& loc, const char* op) { -#ifndef GLSLANG_WEB if (spvVersion.spv == 0) error(loc, "only allowed when generating SPIR-V", op, ""); -#endif } void TParseVersions::requireSpv(const TSourceLoc& loc, const char *op, unsigned int version) { -#ifndef GLSLANG_WEB if (spvVersion.spv < version) error(loc, "not supported for current targeted SPIR-V version", op, ""); -#endif } } // end namespace glslang diff --git a/third_party/glslang/glslang/MachineIndependent/Versions.h b/third_party/glslang/glslang/MachineIndependent/Versions.h index 6ab37880fe1..0ebace9bb24 100644 --- a/third_party/glslang/glslang/MachineIndependent/Versions.h +++ b/third_party/glslang/glslang/MachineIndependent/Versions.h @@ -163,6 +163,7 @@ const char* const E_GL_ARB_texture_query_lod = "GL_ARB_texture_query_ const char* const E_GL_ARB_vertex_attrib_64bit = "GL_ARB_vertex_attrib_64bit"; const char* const E_GL_ARB_draw_instanced = "GL_ARB_draw_instanced"; const char* const E_GL_ARB_fragment_coord_conventions = "GL_ARB_fragment_coord_conventions"; +const char* const E_GL_ARB_bindless_texture = "GL_ARB_bindless_texture"; const char* const E_GL_KHR_shader_subgroup_basic = "GL_KHR_shader_subgroup_basic"; const char* const E_GL_KHR_shader_subgroup_vote = "GL_KHR_shader_subgroup_vote"; @@ -173,6 +174,7 @@ const char* const E_GL_KHR_shader_subgroup_shuffle_relative = "GL_KHR_shader_sub const char* const E_GL_KHR_shader_subgroup_clustered = "GL_KHR_shader_subgroup_clustered"; const char* const E_GL_KHR_shader_subgroup_quad = "GL_KHR_shader_subgroup_quad"; const char* const E_GL_KHR_memory_scope_semantics = "GL_KHR_memory_scope_semantics"; +const char* const E_GL_KHR_cooperative_matrix = "GL_KHR_cooperative_matrix"; const char* const E_GL_EXT_shader_atomic_int64 = "GL_EXT_shader_atomic_int64"; @@ -212,6 +214,7 @@ const char* const E_GL_EXT_subgroup_uniform_control_flow = "GL_EXT_subgroup_u const char* const E_GL_EXT_spirv_intrinsics = "GL_EXT_spirv_intrinsics"; const char* const E_GL_EXT_fragment_shader_barycentric = "GL_EXT_fragment_shader_barycentric"; const char* const E_GL_EXT_mesh_shader = "GL_EXT_mesh_shader"; +const char* const E_GL_EXT_opacity_micromap = "GL_EXT_opacity_micromap"; // Arrays of extensions for the above viewportEXTs duplications @@ -263,15 +266,23 @@ const char* const E_GL_NV_fragment_shader_barycentric = "GL_NV_fragmen const char* const E_GL_NV_compute_shader_derivatives = "GL_NV_compute_shader_derivatives"; const char* const E_GL_NV_shader_texture_footprint = "GL_NV_shader_texture_footprint"; const char* const E_GL_NV_mesh_shader = "GL_NV_mesh_shader"; +const char* const E_GL_NV_cooperative_matrix = "GL_NV_cooperative_matrix"; +const char* const E_GL_NV_shader_sm_builtins = "GL_NV_shader_sm_builtins"; +const char* const E_GL_NV_integer_cooperative_matrix = "GL_NV_integer_cooperative_matrix"; +const char* const E_GL_NV_shader_invocation_reorder = "GL_NV_shader_invocation_reorder"; +const char* const E_GL_EXT_ray_tracing_position_fetch = "GL_EXT_ray_tracing_position_fetch"; +const char* const E_GL_NV_displacement_micromap = "GL_NV_displacement_micromap"; + +// ARM +const char* const E_GL_ARM_shader_core_builtins = "GL_ARM_shader_core_builtins"; // Arrays of extensions for the above viewportEXTs duplications const char* const viewportEXTs[] = { E_GL_ARB_shader_viewport_layer_array, E_GL_NV_viewport_array2 }; const int Num_viewportEXTs = sizeof(viewportEXTs) / sizeof(viewportEXTs[0]); -const char* const E_GL_NV_cooperative_matrix = "GL_NV_cooperative_matrix"; -const char* const E_GL_NV_shader_sm_builtins = "GL_NV_shader_sm_builtins"; -const char* const E_GL_NV_integer_cooperative_matrix = "GL_NV_integer_cooperative_matrix"; + +const char* const E_GL_QCOM_image_processing = "GL_QCOM_image_processing"; // AEP const char* const E_GL_ANDROID_extension_pack_es31a = "GL_ANDROID_extension_pack_es31a"; @@ -321,6 +332,10 @@ const char* const E_GL_EXT_terminate_invocation = "GL_EXT_terminate_invocation"; const char* const E_GL_EXT_shader_atomic_float = "GL_EXT_shader_atomic_float"; const char* const E_GL_EXT_shader_atomic_float2 = "GL_EXT_shader_atomic_float2"; +const char* const E_GL_EXT_shader_tile_image = "GL_EXT_shader_tile_image"; + +const char* const E_GL_EXT_texture_shadow_lod = "GL_EXT_texture_shadow_lod"; + // Arrays of extensions for the above AEP duplications const char* const AEP_geometry_shader[] = { E_GL_EXT_geometry_shader, E_GL_OES_geometry_shader }; diff --git a/third_party/glslang/glslang/MachineIndependent/attribute.cpp b/third_party/glslang/glslang/MachineIndependent/attribute.cpp index df7fdc2a60f..a167c494fbc 100644 --- a/third_party/glslang/glslang/MachineIndependent/attribute.cpp +++ b/third_party/glslang/glslang/MachineIndependent/attribute.cpp @@ -34,8 +34,6 @@ // POSSIBILITY OF SUCH DAMAGE. // -#ifndef GLSLANG_WEB - #include "attribute.h" #include "../Include/intermediate.h" #include "ParseHelper.h" @@ -125,6 +123,8 @@ TAttributeType TParseContext::attributeFromName(const TString& name) const return EatPartialCount; else if (name == "subgroup_uniform_control_flow") return EatSubgroupUniformControlFlow; + else if (name == "export") + return EatExport; else return EatNone; } @@ -357,6 +357,7 @@ void TParseContext::handleFunctionAttributes(const TSourceLoc& loc, const TAttri switch (it->name) { case EatSubgroupUniformControlFlow: + requireExtensions(loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute"); intermediate.setSubgroupUniformControlFlow(); break; default: @@ -367,5 +368,3 @@ void TParseContext::handleFunctionAttributes(const TSourceLoc& loc, const TAttri } } // end namespace glslang - -#endif // GLSLANG_WEB diff --git a/third_party/glslang/glslang/MachineIndependent/attribute.h b/third_party/glslang/glslang/MachineIndependent/attribute.h index c5b29176c49..a0c4c43d45e 100644 --- a/third_party/glslang/glslang/MachineIndependent/attribute.h +++ b/third_party/glslang/glslang/MachineIndependent/attribute.h @@ -120,6 +120,7 @@ namespace glslang { EatNonWritable, EatNonReadable, EatSubgroupUniformControlFlow, + EatExport, }; class TIntermAggregate; diff --git a/third_party/glslang/glslang/MachineIndependent/glslang.m4 b/third_party/glslang/glslang/MachineIndependent/glslang.m4 deleted file mode 100644 index a59da443d9c..00000000000 --- a/third_party/glslang/glslang/MachineIndependent/glslang.m4 +++ /dev/null @@ -1,4422 +0,0 @@ -// -// Copyright (C) 2002-2005 3Dlabs Inc. Ltd. -// Copyright (C) 2012-2013 LunarG, Inc. -// Copyright (C) 2017 ARM Limited. -// Copyright (C) 2015-2019 Google, Inc. -// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved. -// -// 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 3Dlabs Inc. Ltd. 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 HOLDERS 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. -// - -// -// Do not edit the .y file, only edit the .m4 file. -// The .y bison file is not a source file, it is a derivative of the .m4 file. -// The m4 file needs to be processed by m4 to generate the .y bison file. -// -// Code sandwiched between a pair: -// -// GLSLANG_WEB_EXCLUDE_ON -// ... -// ... -// ... -// GLSLANG_WEB_EXCLUDE_OFF -// -// Will be excluded from the grammar when m4 is executed as: -// -// m4 -P -DGLSLANG_WEB -// -// It will be included when m4 is executed as: -// -// m4 -P -// - -m4_define(`GLSLANG_WEB_EXCLUDE_ON', `m4_ifdef(`GLSLANG_WEB', `m4_divert(`-1')')') -m4_define(`GLSLANG_WEB_EXCLUDE_OFF', `m4_ifdef(`GLSLANG_WEB', `m4_divert')') - -/** - * This is bison grammar and productions for parsing all versions of the - * GLSL shading languages. - */ -%{ - -/* Based on: -ANSI C Yacc grammar - -In 1985, Jeff Lee published his Yacc grammar (which is accompanied by a -matching Lex specification) for the April 30, 1985 draft version of the -ANSI C standard. Tom Stockfisch reposted it to net.sources in 1987; that -original, as mentioned in the answer to question 17.25 of the comp.lang.c -FAQ, can be ftp'ed from ftp.uu.net, file usenet/net.sources/ansi.c.grammar.Z. - -I intend to keep this version as close to the current C Standard grammar as -possible; please let me know if you discover discrepancies. - -Jutta Degener, 1995 -*/ - -#include "SymbolTable.h" -#include "ParseHelper.h" -#include "../Public/ShaderLang.h" -#include "attribute.h" - -using namespace glslang; - -%} - -%define parse.error verbose - -%union { - struct { - glslang::TSourceLoc loc; - union { - glslang::TString *string; - int i; - unsigned int u; - long long i64; - unsigned long long u64; - bool b; - double d; - }; - glslang::TSymbol* symbol; - } lex; - struct { - glslang::TSourceLoc loc; - glslang::TOperator op; - union { - TIntermNode* intermNode; - glslang::TIntermNodePair nodePair; - glslang::TIntermTyped* intermTypedNode; - glslang::TAttributes* attributes; - glslang::TSpirvRequirement* spirvReq; - glslang::TSpirvInstruction* spirvInst; - glslang::TSpirvTypeParameters* spirvTypeParams; - }; - union { - glslang::TPublicType type; - glslang::TFunction* function; - glslang::TParameter param; - glslang::TTypeLoc typeLine; - glslang::TTypeList* typeList; - glslang::TArraySizes* arraySizes; - glslang::TIdentifierList* identifierList; - }; - glslang::TArraySizes* typeParameters; - } interm; -} - -%{ - -/* windows only pragma */ -#ifdef _MSC_VER - #pragma warning(disable : 4065) - #pragma warning(disable : 4127) - #pragma warning(disable : 4244) -#endif - -#define parseContext (*pParseContext) -#define yyerror(context, msg) context->parserError(msg) - -extern int yylex(YYSTYPE*, TParseContext&); - -%} - -%parse-param {glslang::TParseContext* pParseContext} -%lex-param {parseContext} -%pure-parser // enable thread safety -%expect 1 // One shift reduce conflict because of if | else - -%token CONST BOOL INT UINT FLOAT -%token BVEC2 BVEC3 BVEC4 -%token IVEC2 IVEC3 IVEC4 -%token UVEC2 UVEC3 UVEC4 -%token VEC2 VEC3 VEC4 -%token MAT2 MAT3 MAT4 -%token MAT2X2 MAT2X3 MAT2X4 -%token MAT3X2 MAT3X3 MAT3X4 -%token MAT4X2 MAT4X3 MAT4X4 - -// combined image/sampler -%token SAMPLER2D SAMPLER3D SAMPLERCUBE SAMPLER2DSHADOW -%token SAMPLERCUBESHADOW SAMPLER2DARRAY -%token SAMPLER2DARRAYSHADOW ISAMPLER2D ISAMPLER3D ISAMPLERCUBE -%token ISAMPLER2DARRAY USAMPLER2D USAMPLER3D -%token USAMPLERCUBE USAMPLER2DARRAY - -// separate image/sampler -%token SAMPLER SAMPLERSHADOW -%token TEXTURE2D TEXTURE3D TEXTURECUBE TEXTURE2DARRAY -%token ITEXTURE2D ITEXTURE3D ITEXTURECUBE ITEXTURE2DARRAY -%token UTEXTURE2D UTEXTURE3D UTEXTURECUBE UTEXTURE2DARRAY - -GLSLANG_WEB_EXCLUDE_ON - -%token ATTRIBUTE VARYING -%token FLOAT16_T FLOAT32_T DOUBLE FLOAT64_T -%token INT64_T UINT64_T INT32_T UINT32_T INT16_T UINT16_T INT8_T UINT8_T -%token I64VEC2 I64VEC3 I64VEC4 -%token U64VEC2 U64VEC3 U64VEC4 -%token I32VEC2 I32VEC3 I32VEC4 -%token U32VEC2 U32VEC3 U32VEC4 -%token I16VEC2 I16VEC3 I16VEC4 -%token U16VEC2 U16VEC3 U16VEC4 -%token I8VEC2 I8VEC3 I8VEC4 -%token U8VEC2 U8VEC3 U8VEC4 -%token DVEC2 DVEC3 DVEC4 DMAT2 DMAT3 DMAT4 -%token F16VEC2 F16VEC3 F16VEC4 F16MAT2 F16MAT3 F16MAT4 -%token F32VEC2 F32VEC3 F32VEC4 F32MAT2 F32MAT3 F32MAT4 -%token F64VEC2 F64VEC3 F64VEC4 F64MAT2 F64MAT3 F64MAT4 -%token DMAT2X2 DMAT2X3 DMAT2X4 -%token DMAT3X2 DMAT3X3 DMAT3X4 -%token DMAT4X2 DMAT4X3 DMAT4X4 -%token F16MAT2X2 F16MAT2X3 F16MAT2X4 -%token F16MAT3X2 F16MAT3X3 F16MAT3X4 -%token F16MAT4X2 F16MAT4X3 F16MAT4X4 -%token F32MAT2X2 F32MAT2X3 F32MAT2X4 -%token F32MAT3X2 F32MAT3X3 F32MAT3X4 -%token F32MAT4X2 F32MAT4X3 F32MAT4X4 -%token F64MAT2X2 F64MAT2X3 F64MAT2X4 -%token F64MAT3X2 F64MAT3X3 F64MAT3X4 -%token F64MAT4X2 F64MAT4X3 F64MAT4X4 -%token ATOMIC_UINT -%token ACCSTRUCTNV -%token ACCSTRUCTEXT -%token RAYQUERYEXT -%token FCOOPMATNV ICOOPMATNV UCOOPMATNV - -// combined image/sampler -%token SAMPLERCUBEARRAY SAMPLERCUBEARRAYSHADOW -%token ISAMPLERCUBEARRAY USAMPLERCUBEARRAY -%token SAMPLER1D SAMPLER1DARRAY SAMPLER1DARRAYSHADOW ISAMPLER1D SAMPLER1DSHADOW -%token SAMPLER2DRECT SAMPLER2DRECTSHADOW ISAMPLER2DRECT USAMPLER2DRECT -%token SAMPLERBUFFER ISAMPLERBUFFER USAMPLERBUFFER -%token SAMPLER2DMS ISAMPLER2DMS USAMPLER2DMS -%token SAMPLER2DMSARRAY ISAMPLER2DMSARRAY USAMPLER2DMSARRAY -%token SAMPLEREXTERNALOES -%token SAMPLEREXTERNAL2DY2YEXT -%token ISAMPLER1DARRAY USAMPLER1D USAMPLER1DARRAY -%token F16SAMPLER1D F16SAMPLER2D F16SAMPLER3D F16SAMPLER2DRECT F16SAMPLERCUBE -%token F16SAMPLER1DARRAY F16SAMPLER2DARRAY F16SAMPLERCUBEARRAY -%token F16SAMPLERBUFFER F16SAMPLER2DMS F16SAMPLER2DMSARRAY -%token F16SAMPLER1DSHADOW F16SAMPLER2DSHADOW F16SAMPLER1DARRAYSHADOW F16SAMPLER2DARRAYSHADOW -%token F16SAMPLER2DRECTSHADOW F16SAMPLERCUBESHADOW F16SAMPLERCUBEARRAYSHADOW - -// images -%token IMAGE1D IIMAGE1D UIMAGE1D IMAGE2D IIMAGE2D -%token UIMAGE2D IMAGE3D IIMAGE3D UIMAGE3D -%token IMAGE2DRECT IIMAGE2DRECT UIMAGE2DRECT -%token IMAGECUBE IIMAGECUBE UIMAGECUBE -%token IMAGEBUFFER IIMAGEBUFFER UIMAGEBUFFER -%token IMAGE1DARRAY IIMAGE1DARRAY UIMAGE1DARRAY -%token IMAGE2DARRAY IIMAGE2DARRAY UIMAGE2DARRAY -%token IMAGECUBEARRAY IIMAGECUBEARRAY UIMAGECUBEARRAY -%token IMAGE2DMS IIMAGE2DMS UIMAGE2DMS -%token IMAGE2DMSARRAY IIMAGE2DMSARRAY UIMAGE2DMSARRAY - -%token F16IMAGE1D F16IMAGE2D F16IMAGE3D F16IMAGE2DRECT -%token F16IMAGECUBE F16IMAGE1DARRAY F16IMAGE2DARRAY F16IMAGECUBEARRAY -%token F16IMAGEBUFFER F16IMAGE2DMS F16IMAGE2DMSARRAY - -%token I64IMAGE1D U64IMAGE1D -%token I64IMAGE2D U64IMAGE2D -%token I64IMAGE3D U64IMAGE3D -%token I64IMAGE2DRECT U64IMAGE2DRECT -%token I64IMAGECUBE U64IMAGECUBE -%token I64IMAGEBUFFER U64IMAGEBUFFER -%token I64IMAGE1DARRAY U64IMAGE1DARRAY -%token I64IMAGE2DARRAY U64IMAGE2DARRAY -%token I64IMAGECUBEARRAY U64IMAGECUBEARRAY -%token I64IMAGE2DMS U64IMAGE2DMS -%token I64IMAGE2DMSARRAY U64IMAGE2DMSARRAY - -// texture without sampler -%token TEXTURECUBEARRAY ITEXTURECUBEARRAY UTEXTURECUBEARRAY -%token TEXTURE1D ITEXTURE1D UTEXTURE1D -%token TEXTURE1DARRAY ITEXTURE1DARRAY UTEXTURE1DARRAY -%token TEXTURE2DRECT ITEXTURE2DRECT UTEXTURE2DRECT -%token TEXTUREBUFFER ITEXTUREBUFFER UTEXTUREBUFFER -%token TEXTURE2DMS ITEXTURE2DMS UTEXTURE2DMS -%token TEXTURE2DMSARRAY ITEXTURE2DMSARRAY UTEXTURE2DMSARRAY - -%token F16TEXTURE1D F16TEXTURE2D F16TEXTURE3D F16TEXTURE2DRECT F16TEXTURECUBE -%token F16TEXTURE1DARRAY F16TEXTURE2DARRAY F16TEXTURECUBEARRAY -%token F16TEXTUREBUFFER F16TEXTURE2DMS F16TEXTURE2DMSARRAY - -// input attachments -%token SUBPASSINPUT SUBPASSINPUTMS ISUBPASSINPUT ISUBPASSINPUTMS USUBPASSINPUT USUBPASSINPUTMS -%token F16SUBPASSINPUT F16SUBPASSINPUTMS - -// spirv intrinsics -%token SPIRV_INSTRUCTION SPIRV_EXECUTION_MODE SPIRV_EXECUTION_MODE_ID -%token SPIRV_DECORATE SPIRV_DECORATE_ID SPIRV_DECORATE_STRING -%token SPIRV_TYPE SPIRV_STORAGE_CLASS SPIRV_BY_REFERENCE SPIRV_LITERAL - -GLSLANG_WEB_EXCLUDE_OFF - -%token LEFT_OP RIGHT_OP -%token INC_OP DEC_OP LE_OP GE_OP EQ_OP NE_OP -%token AND_OP OR_OP XOR_OP MUL_ASSIGN DIV_ASSIGN ADD_ASSIGN -%token MOD_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN XOR_ASSIGN OR_ASSIGN -%token SUB_ASSIGN -%token STRING_LITERAL - -%token LEFT_PAREN RIGHT_PAREN LEFT_BRACKET RIGHT_BRACKET LEFT_BRACE RIGHT_BRACE DOT -%token COMMA COLON EQUAL SEMICOLON BANG DASH TILDE PLUS STAR SLASH PERCENT -%token LEFT_ANGLE RIGHT_ANGLE VERTICAL_BAR CARET AMPERSAND QUESTION - -%token INVARIANT -%token HIGH_PRECISION MEDIUM_PRECISION LOW_PRECISION PRECISION -%token PACKED RESOURCE SUPERP - -%token FLOATCONSTANT INTCONSTANT UINTCONSTANT BOOLCONSTANT -%token IDENTIFIER TYPE_NAME -%token CENTROID IN OUT INOUT -%token STRUCT VOID WHILE -%token BREAK CONTINUE DO ELSE FOR IF DISCARD RETURN SWITCH CASE DEFAULT -%token TERMINATE_INVOCATION -%token TERMINATE_RAY IGNORE_INTERSECTION -%token UNIFORM SHARED BUFFER -%token FLAT SMOOTH LAYOUT - -GLSLANG_WEB_EXCLUDE_ON -%token DOUBLECONSTANT INT16CONSTANT UINT16CONSTANT FLOAT16CONSTANT INT32CONSTANT UINT32CONSTANT -%token INT64CONSTANT UINT64CONSTANT -%token SUBROUTINE DEMOTE -%token PAYLOADNV PAYLOADINNV HITATTRNV CALLDATANV CALLDATAINNV -%token PAYLOADEXT PAYLOADINEXT HITATTREXT CALLDATAEXT CALLDATAINEXT -%token PATCH SAMPLE NONUNIFORM -%token COHERENT VOLATILE RESTRICT READONLY WRITEONLY DEVICECOHERENT QUEUEFAMILYCOHERENT WORKGROUPCOHERENT -%token SUBGROUPCOHERENT NONPRIVATE SHADERCALLCOHERENT -%token NOPERSPECTIVE EXPLICITINTERPAMD PERVERTEXEXT PERVERTEXNV PERPRIMITIVENV PERVIEWNV PERTASKNV PERPRIMITIVEEXT TASKPAYLOADWORKGROUPEXT -%token PRECISE -GLSLANG_WEB_EXCLUDE_OFF - -%type assignment_operator unary_operator -%type variable_identifier primary_expression postfix_expression -%type expression integer_expression assignment_expression -%type unary_expression multiplicative_expression additive_expression -%type relational_expression equality_expression -%type conditional_expression constant_expression -%type logical_or_expression logical_xor_expression logical_and_expression -%type shift_expression and_expression exclusive_or_expression inclusive_or_expression -%type function_call initializer condition conditionopt - -%type translation_unit function_definition -%type statement simple_statement -%type statement_list switch_statement_list compound_statement -%type declaration_statement selection_statement selection_statement_nonattributed expression_statement -%type switch_statement switch_statement_nonattributed case_label -%type declaration external_declaration -%type for_init_statement compound_statement_no_new_scope -%type selection_rest_statement for_rest_statement -%type iteration_statement iteration_statement_nonattributed jump_statement statement_no_new_scope statement_scoped -%type single_declaration init_declarator_list - -%type parameter_declaration parameter_declarator parameter_type_specifier - -%type array_specifier -%type invariant_qualifier interpolation_qualifier storage_qualifier precision_qualifier -%type layout_qualifier layout_qualifier_id_list layout_qualifier_id - -%type type_parameter_specifier -%type type_parameter_specifier_opt -%type type_parameter_specifier_list - -%type type_qualifier fully_specified_type type_specifier -%type single_type_qualifier -%type type_specifier_nonarray -%type struct_specifier -%type struct_declarator -%type struct_declarator_list struct_declaration struct_declaration_list -%type block_structure -%type function_header function_declarator -%type function_header_with_parameters -%type function_call_header_with_parameters function_call_header_no_parameters function_call_generic function_prototype -%type function_call_or_method function_identifier function_call_header - -%type identifier_list - -GLSLANG_WEB_EXCLUDE_ON -%type precise_qualifier non_uniform_qualifier -%type type_name_list -%type attribute attribute_list single_attribute -%type demote_statement -%type initializer_list -%type spirv_requirements_list spirv_requirements_parameter -%type spirv_extension_list spirv_capability_list -%type spirv_execution_mode_qualifier -%type spirv_execution_mode_parameter_list spirv_execution_mode_parameter spirv_execution_mode_id_parameter_list -%type spirv_storage_class_qualifier -%type spirv_decorate_qualifier -%type spirv_decorate_parameter_list spirv_decorate_parameter -%type spirv_decorate_id_parameter_list -%type spirv_decorate_string_parameter_list -%type spirv_type_specifier -%type spirv_type_parameter_list spirv_type_parameter -%type spirv_instruction_qualifier -%type spirv_instruction_qualifier_list spirv_instruction_qualifier_id -GLSLANG_WEB_EXCLUDE_OFF - -%start translation_unit -%% - -variable_identifier - : IDENTIFIER { - $$ = parseContext.handleVariable($1.loc, $1.symbol, $1.string); - } - ; - -primary_expression - : variable_identifier { - $$ = $1; - } - | LEFT_PAREN expression RIGHT_PAREN { - $$ = $2; - if ($$->getAsConstantUnion()) - $$->getAsConstantUnion()->setExpression(); - } - | FLOATCONSTANT { - $$ = parseContext.intermediate.addConstantUnion($1.d, EbtFloat, $1.loc, true); - } - | INTCONSTANT { - $$ = parseContext.intermediate.addConstantUnion($1.i, $1.loc, true); - } - | UINTCONSTANT { - parseContext.fullIntegerCheck($1.loc, "unsigned literal"); - $$ = parseContext.intermediate.addConstantUnion($1.u, $1.loc, true); - } - | BOOLCONSTANT { - $$ = parseContext.intermediate.addConstantUnion($1.b, $1.loc, true); - } -GLSLANG_WEB_EXCLUDE_ON - | STRING_LITERAL { - $$ = parseContext.intermediate.addConstantUnion($1.string, $1.loc, true); - } - | INT32CONSTANT { - parseContext.explicitInt32Check($1.loc, "32-bit signed literal"); - $$ = parseContext.intermediate.addConstantUnion($1.i, $1.loc, true); - } - | UINT32CONSTANT { - parseContext.explicitInt32Check($1.loc, "32-bit signed literal"); - $$ = parseContext.intermediate.addConstantUnion($1.u, $1.loc, true); - } - | INT64CONSTANT { - parseContext.int64Check($1.loc, "64-bit integer literal"); - $$ = parseContext.intermediate.addConstantUnion($1.i64, $1.loc, true); - } - | UINT64CONSTANT { - parseContext.int64Check($1.loc, "64-bit unsigned integer literal"); - $$ = parseContext.intermediate.addConstantUnion($1.u64, $1.loc, true); - } - | INT16CONSTANT { - parseContext.explicitInt16Check($1.loc, "16-bit integer literal"); - $$ = parseContext.intermediate.addConstantUnion((short)$1.i, $1.loc, true); - } - | UINT16CONSTANT { - parseContext.explicitInt16Check($1.loc, "16-bit unsigned integer literal"); - $$ = parseContext.intermediate.addConstantUnion((unsigned short)$1.u, $1.loc, true); - } - | DOUBLECONSTANT { - parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double literal"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck($1.loc, "double literal"); - $$ = parseContext.intermediate.addConstantUnion($1.d, EbtDouble, $1.loc, true); - } - | FLOAT16CONSTANT { - parseContext.float16Check($1.loc, "half float literal"); - $$ = parseContext.intermediate.addConstantUnion($1.d, EbtFloat16, $1.loc, true); - } -GLSLANG_WEB_EXCLUDE_OFF - ; - -postfix_expression - : primary_expression { - $$ = $1; - } - | postfix_expression LEFT_BRACKET integer_expression RIGHT_BRACKET { - $$ = parseContext.handleBracketDereference($2.loc, $1, $3); - } - | function_call { - $$ = $1; - } - | postfix_expression DOT IDENTIFIER { - $$ = parseContext.handleDotDereference($3.loc, $1, *$3.string); - } - | postfix_expression INC_OP { - parseContext.variableCheck($1); - parseContext.lValueErrorCheck($2.loc, "++", $1); - $$ = parseContext.handleUnaryMath($2.loc, "++", EOpPostIncrement, $1); - } - | postfix_expression DEC_OP { - parseContext.variableCheck($1); - parseContext.lValueErrorCheck($2.loc, "--", $1); - $$ = parseContext.handleUnaryMath($2.loc, "--", EOpPostDecrement, $1); - } - ; - -integer_expression - : expression { - parseContext.integerCheck($1, "[]"); - $$ = $1; - } - ; - -function_call - : function_call_or_method { - $$ = parseContext.handleFunctionCall($1.loc, $1.function, $1.intermNode); - delete $1.function; - } - ; - -function_call_or_method - : function_call_generic { - $$ = $1; - } - ; - -function_call_generic - : function_call_header_with_parameters RIGHT_PAREN { - $$ = $1; - $$.loc = $2.loc; - } - | function_call_header_no_parameters RIGHT_PAREN { - $$ = $1; - $$.loc = $2.loc; - } - ; - -function_call_header_no_parameters - : function_call_header VOID { - $$ = $1; - } - | function_call_header { - $$ = $1; - } - ; - -function_call_header_with_parameters - : function_call_header assignment_expression { - TParameter param = { 0, new TType }; - param.type->shallowCopy($2->getType()); - $1.function->addParameter(param); - $$.function = $1.function; - $$.intermNode = $2; - } - | function_call_header_with_parameters COMMA assignment_expression { - TParameter param = { 0, new TType }; - param.type->shallowCopy($3->getType()); - $1.function->addParameter(param); - $$.function = $1.function; - $$.intermNode = parseContext.intermediate.growAggregate($1.intermNode, $3, $2.loc); - } - ; - -function_call_header - : function_identifier LEFT_PAREN { - $$ = $1; - } - ; - -// Grammar Note: Constructors look like functions, but are recognized as types. - -function_identifier - : type_specifier { - // Constructor - $$.intermNode = 0; - $$.function = parseContext.handleConstructorCall($1.loc, $1); - } - | postfix_expression { - // - // Should be a method or subroutine call, but we haven't recognized the arguments yet. - // - $$.function = 0; - $$.intermNode = 0; - - TIntermMethod* method = $1->getAsMethodNode(); - if (method) { - $$.function = new TFunction(&method->getMethodName(), TType(EbtInt), EOpArrayLength); - $$.intermNode = method->getObject(); - } else { - TIntermSymbol* symbol = $1->getAsSymbolNode(); - if (symbol) { - parseContext.reservedErrorCheck(symbol->getLoc(), symbol->getName()); - TFunction *function = new TFunction(&symbol->getName(), TType(EbtVoid)); - $$.function = function; - } else - parseContext.error($1->getLoc(), "function call, method, or subroutine call expected", "", ""); - } - - if ($$.function == 0) { - // error recover - TString* empty = NewPoolTString(""); - $$.function = new TFunction(empty, TType(EbtVoid), EOpNull); - } - } -GLSLANG_WEB_EXCLUDE_ON - | non_uniform_qualifier { - // Constructor - $$.intermNode = 0; - $$.function = parseContext.handleConstructorCall($1.loc, $1); - } -GLSLANG_WEB_EXCLUDE_OFF - ; - -unary_expression - : postfix_expression { - parseContext.variableCheck($1); - $$ = $1; - if (TIntermMethod* method = $1->getAsMethodNode()) - parseContext.error($1->getLoc(), "incomplete method syntax", method->getMethodName().c_str(), ""); - } - | INC_OP unary_expression { - parseContext.lValueErrorCheck($1.loc, "++", $2); - $$ = parseContext.handleUnaryMath($1.loc, "++", EOpPreIncrement, $2); - } - | DEC_OP unary_expression { - parseContext.lValueErrorCheck($1.loc, "--", $2); - $$ = parseContext.handleUnaryMath($1.loc, "--", EOpPreDecrement, $2); - } - | unary_operator unary_expression { - if ($1.op != EOpNull) { - char errorOp[2] = {0, 0}; - switch($1.op) { - case EOpNegative: errorOp[0] = '-'; break; - case EOpLogicalNot: errorOp[0] = '!'; break; - case EOpBitwiseNot: errorOp[0] = '~'; break; - default: break; // some compilers want this - } - $$ = parseContext.handleUnaryMath($1.loc, errorOp, $1.op, $2); - } else { - $$ = $2; - if ($$->getAsConstantUnion()) - $$->getAsConstantUnion()->setExpression(); - } - } - ; -// Grammar Note: No traditional style type casts. - -unary_operator - : PLUS { $$.loc = $1.loc; $$.op = EOpNull; } - | DASH { $$.loc = $1.loc; $$.op = EOpNegative; } - | BANG { $$.loc = $1.loc; $$.op = EOpLogicalNot; } - | TILDE { $$.loc = $1.loc; $$.op = EOpBitwiseNot; - parseContext.fullIntegerCheck($1.loc, "bitwise not"); } - ; -// Grammar Note: No '*' or '&' unary ops. Pointers are not supported. - -multiplicative_expression - : unary_expression { $$ = $1; } - | multiplicative_expression STAR unary_expression { - $$ = parseContext.handleBinaryMath($2.loc, "*", EOpMul, $1, $3); - if ($$ == 0) - $$ = $1; - } - | multiplicative_expression SLASH unary_expression { - $$ = parseContext.handleBinaryMath($2.loc, "/", EOpDiv, $1, $3); - if ($$ == 0) - $$ = $1; - } - | multiplicative_expression PERCENT unary_expression { - parseContext.fullIntegerCheck($2.loc, "%"); - $$ = parseContext.handleBinaryMath($2.loc, "%", EOpMod, $1, $3); - if ($$ == 0) - $$ = $1; - } - ; - -additive_expression - : multiplicative_expression { $$ = $1; } - | additive_expression PLUS multiplicative_expression { - $$ = parseContext.handleBinaryMath($2.loc, "+", EOpAdd, $1, $3); - if ($$ == 0) - $$ = $1; - } - | additive_expression DASH multiplicative_expression { - $$ = parseContext.handleBinaryMath($2.loc, "-", EOpSub, $1, $3); - if ($$ == 0) - $$ = $1; - } - ; - -shift_expression - : additive_expression { $$ = $1; } - | shift_expression LEFT_OP additive_expression { - parseContext.fullIntegerCheck($2.loc, "bit shift left"); - $$ = parseContext.handleBinaryMath($2.loc, "<<", EOpLeftShift, $1, $3); - if ($$ == 0) - $$ = $1; - } - | shift_expression RIGHT_OP additive_expression { - parseContext.fullIntegerCheck($2.loc, "bit shift right"); - $$ = parseContext.handleBinaryMath($2.loc, ">>", EOpRightShift, $1, $3); - if ($$ == 0) - $$ = $1; - } - ; - -relational_expression - : shift_expression { $$ = $1; } - | relational_expression LEFT_ANGLE shift_expression { - $$ = parseContext.handleBinaryMath($2.loc, "<", EOpLessThan, $1, $3); - if ($$ == 0) - $$ = parseContext.intermediate.addConstantUnion(false, $2.loc); - } - | relational_expression RIGHT_ANGLE shift_expression { - $$ = parseContext.handleBinaryMath($2.loc, ">", EOpGreaterThan, $1, $3); - if ($$ == 0) - $$ = parseContext.intermediate.addConstantUnion(false, $2.loc); - } - | relational_expression LE_OP shift_expression { - $$ = parseContext.handleBinaryMath($2.loc, "<=", EOpLessThanEqual, $1, $3); - if ($$ == 0) - $$ = parseContext.intermediate.addConstantUnion(false, $2.loc); - } - | relational_expression GE_OP shift_expression { - $$ = parseContext.handleBinaryMath($2.loc, ">=", EOpGreaterThanEqual, $1, $3); - if ($$ == 0) - $$ = parseContext.intermediate.addConstantUnion(false, $2.loc); - } - ; - -equality_expression - : relational_expression { $$ = $1; } - | equality_expression EQ_OP relational_expression { - parseContext.arrayObjectCheck($2.loc, $1->getType(), "array comparison"); - parseContext.opaqueCheck($2.loc, $1->getType(), "=="); - parseContext.specializationCheck($2.loc, $1->getType(), "=="); - parseContext.referenceCheck($2.loc, $1->getType(), "=="); - $$ = parseContext.handleBinaryMath($2.loc, "==", EOpEqual, $1, $3); - if ($$ == 0) - $$ = parseContext.intermediate.addConstantUnion(false, $2.loc); - } - | equality_expression NE_OP relational_expression { - parseContext.arrayObjectCheck($2.loc, $1->getType(), "array comparison"); - parseContext.opaqueCheck($2.loc, $1->getType(), "!="); - parseContext.specializationCheck($2.loc, $1->getType(), "!="); - parseContext.referenceCheck($2.loc, $1->getType(), "!="); - $$ = parseContext.handleBinaryMath($2.loc, "!=", EOpNotEqual, $1, $3); - if ($$ == 0) - $$ = parseContext.intermediate.addConstantUnion(false, $2.loc); - } - ; - -and_expression - : equality_expression { $$ = $1; } - | and_expression AMPERSAND equality_expression { - parseContext.fullIntegerCheck($2.loc, "bitwise and"); - $$ = parseContext.handleBinaryMath($2.loc, "&", EOpAnd, $1, $3); - if ($$ == 0) - $$ = $1; - } - ; - -exclusive_or_expression - : and_expression { $$ = $1; } - | exclusive_or_expression CARET and_expression { - parseContext.fullIntegerCheck($2.loc, "bitwise exclusive or"); - $$ = parseContext.handleBinaryMath($2.loc, "^", EOpExclusiveOr, $1, $3); - if ($$ == 0) - $$ = $1; - } - ; - -inclusive_or_expression - : exclusive_or_expression { $$ = $1; } - | inclusive_or_expression VERTICAL_BAR exclusive_or_expression { - parseContext.fullIntegerCheck($2.loc, "bitwise inclusive or"); - $$ = parseContext.handleBinaryMath($2.loc, "|", EOpInclusiveOr, $1, $3); - if ($$ == 0) - $$ = $1; - } - ; - -logical_and_expression - : inclusive_or_expression { $$ = $1; } - | logical_and_expression AND_OP inclusive_or_expression { - $$ = parseContext.handleBinaryMath($2.loc, "&&", EOpLogicalAnd, $1, $3); - if ($$ == 0) - $$ = parseContext.intermediate.addConstantUnion(false, $2.loc); - } - ; - -logical_xor_expression - : logical_and_expression { $$ = $1; } - | logical_xor_expression XOR_OP logical_and_expression { - $$ = parseContext.handleBinaryMath($2.loc, "^^", EOpLogicalXor, $1, $3); - if ($$ == 0) - $$ = parseContext.intermediate.addConstantUnion(false, $2.loc); - } - ; - -logical_or_expression - : logical_xor_expression { $$ = $1; } - | logical_or_expression OR_OP logical_xor_expression { - $$ = parseContext.handleBinaryMath($2.loc, "||", EOpLogicalOr, $1, $3); - if ($$ == 0) - $$ = parseContext.intermediate.addConstantUnion(false, $2.loc); - } - ; - -conditional_expression - : logical_or_expression { $$ = $1; } - | logical_or_expression QUESTION { - ++parseContext.controlFlowNestingLevel; - } - expression COLON assignment_expression { - --parseContext.controlFlowNestingLevel; - parseContext.boolCheck($2.loc, $1); - parseContext.rValueErrorCheck($2.loc, "?", $1); - parseContext.rValueErrorCheck($5.loc, ":", $4); - parseContext.rValueErrorCheck($5.loc, ":", $6); - $$ = parseContext.intermediate.addSelection($1, $4, $6, $2.loc); - if ($$ == 0) { - parseContext.binaryOpError($2.loc, ":", $4->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), $6->getCompleteString(parseContext.intermediate.getEnhancedMsgs())); - $$ = $6; - } - } - ; - -assignment_expression - : conditional_expression { $$ = $1; } - | unary_expression assignment_operator assignment_expression { - parseContext.arrayObjectCheck($2.loc, $1->getType(), "array assignment"); - parseContext.opaqueCheck($2.loc, $1->getType(), "="); - parseContext.storage16BitAssignmentCheck($2.loc, $1->getType(), "="); - parseContext.specializationCheck($2.loc, $1->getType(), "="); - parseContext.lValueErrorCheck($2.loc, "assign", $1); - parseContext.rValueErrorCheck($2.loc, "assign", $3); - $$ = parseContext.addAssign($2.loc, $2.op, $1, $3); - if ($$ == 0) { - parseContext.assignError($2.loc, "assign", $1->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), $3->getCompleteString(parseContext.intermediate.getEnhancedMsgs())); - $$ = $1; - } - } - ; - -assignment_operator - : EQUAL { - $$.loc = $1.loc; - $$.op = EOpAssign; - } - | MUL_ASSIGN { - $$.loc = $1.loc; - $$.op = EOpMulAssign; - } - | DIV_ASSIGN { - $$.loc = $1.loc; - $$.op = EOpDivAssign; - } - | MOD_ASSIGN { - parseContext.fullIntegerCheck($1.loc, "%="); - $$.loc = $1.loc; - $$.op = EOpModAssign; - } - | ADD_ASSIGN { - $$.loc = $1.loc; - $$.op = EOpAddAssign; - } - | SUB_ASSIGN { - $$.loc = $1.loc; - $$.op = EOpSubAssign; - } - | LEFT_ASSIGN { - parseContext.fullIntegerCheck($1.loc, "bit-shift left assign"); - $$.loc = $1.loc; $$.op = EOpLeftShiftAssign; - } - | RIGHT_ASSIGN { - parseContext.fullIntegerCheck($1.loc, "bit-shift right assign"); - $$.loc = $1.loc; $$.op = EOpRightShiftAssign; - } - | AND_ASSIGN { - parseContext.fullIntegerCheck($1.loc, "bitwise-and assign"); - $$.loc = $1.loc; $$.op = EOpAndAssign; - } - | XOR_ASSIGN { - parseContext.fullIntegerCheck($1.loc, "bitwise-xor assign"); - $$.loc = $1.loc; $$.op = EOpExclusiveOrAssign; - } - | OR_ASSIGN { - parseContext.fullIntegerCheck($1.loc, "bitwise-or assign"); - $$.loc = $1.loc; $$.op = EOpInclusiveOrAssign; - } - ; - -expression - : assignment_expression { - $$ = $1; - } - | expression COMMA assignment_expression { - parseContext.samplerConstructorLocationCheck($2.loc, ",", $3); - $$ = parseContext.intermediate.addComma($1, $3, $2.loc); - if ($$ == 0) { - parseContext.binaryOpError($2.loc, ",", $1->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), $3->getCompleteString(parseContext.intermediate.getEnhancedMsgs())); - $$ = $3; - } - } - ; - -constant_expression - : conditional_expression { - parseContext.constantValueCheck($1, ""); - $$ = $1; - } - ; - -declaration - : function_prototype SEMICOLON { - parseContext.handleFunctionDeclarator($1.loc, *$1.function, true /* prototype */); - $$ = 0; - // TODO: 4.0 functionality: subroutines: make the identifier a user type for this signature - } -GLSLANG_WEB_EXCLUDE_ON - | spirv_instruction_qualifier function_prototype SEMICOLON { - parseContext.requireExtensions($2.loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V instruction qualifier"); - $2.function->setSpirvInstruction(*$1); // Attach SPIR-V intruction qualifier - parseContext.handleFunctionDeclarator($2.loc, *$2.function, true /* prototype */); - $$ = 0; - // TODO: 4.0 functionality: subroutines: make the identifier a user type for this signature - } - | spirv_execution_mode_qualifier SEMICOLON { - parseContext.globalCheck($2.loc, "SPIR-V execution mode qualifier"); - parseContext.requireExtensions($2.loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V execution mode qualifier"); - $$ = 0; - } -GLSLANG_WEB_EXCLUDE_OFF - | init_declarator_list SEMICOLON { - if ($1.intermNode && $1.intermNode->getAsAggregate()) - $1.intermNode->getAsAggregate()->setOperator(EOpSequence); - $$ = $1.intermNode; - } - | PRECISION precision_qualifier type_specifier SEMICOLON { - parseContext.profileRequires($1.loc, ENoProfile, 130, 0, "precision statement"); - // lazy setting of the previous scope's defaults, has effect only the first time it is called in a particular scope - parseContext.symbolTable.setPreviousDefaultPrecisions(&parseContext.defaultPrecision[0]); - parseContext.setDefaultPrecision($1.loc, $3, $2.qualifier.precision); - $$ = 0; - } - | block_structure SEMICOLON { - parseContext.declareBlock($1.loc, *$1.typeList); - $$ = 0; - } - | block_structure IDENTIFIER SEMICOLON { - parseContext.declareBlock($1.loc, *$1.typeList, $2.string); - $$ = 0; - } - | block_structure IDENTIFIER array_specifier SEMICOLON { - parseContext.declareBlock($1.loc, *$1.typeList, $2.string, $3.arraySizes); - $$ = 0; - } - | type_qualifier SEMICOLON { - parseContext.globalQualifierFixCheck($1.loc, $1.qualifier); - parseContext.updateStandaloneQualifierDefaults($1.loc, $1); - $$ = 0; - } - | type_qualifier IDENTIFIER SEMICOLON { - parseContext.checkNoShaderLayouts($1.loc, $1.shaderQualifiers); - parseContext.addQualifierToExisting($1.loc, $1.qualifier, *$2.string); - $$ = 0; - } - | type_qualifier IDENTIFIER identifier_list SEMICOLON { - parseContext.checkNoShaderLayouts($1.loc, $1.shaderQualifiers); - $3->push_back($2.string); - parseContext.addQualifierToExisting($1.loc, $1.qualifier, *$3); - $$ = 0; - } - ; - -block_structure - : type_qualifier IDENTIFIER LEFT_BRACE { parseContext.nestedBlockCheck($1.loc); } struct_declaration_list RIGHT_BRACE { - --parseContext.blockNestingLevel; - parseContext.blockName = $2.string; - parseContext.globalQualifierFixCheck($1.loc, $1.qualifier); - parseContext.checkNoShaderLayouts($1.loc, $1.shaderQualifiers); - parseContext.currentBlockQualifier = $1.qualifier; - $$.loc = $1.loc; - $$.typeList = $5; - } - -identifier_list - : COMMA IDENTIFIER { - $$ = new TIdentifierList; - $$->push_back($2.string); - } - | identifier_list COMMA IDENTIFIER { - $$ = $1; - $$->push_back($3.string); - } - ; - -function_prototype - : function_declarator RIGHT_PAREN { - $$.function = $1; - $$.loc = $2.loc; - } - | function_declarator RIGHT_PAREN attribute { - $$.function = $1; - $$.loc = $2.loc; - parseContext.requireExtensions($2.loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute"); - parseContext.handleFunctionAttributes($2.loc, *$3); - } - | attribute function_declarator RIGHT_PAREN { - $$.function = $2; - $$.loc = $3.loc; - parseContext.requireExtensions($3.loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute"); - parseContext.handleFunctionAttributes($3.loc, *$1); - } - | attribute function_declarator RIGHT_PAREN attribute { - $$.function = $2; - $$.loc = $3.loc; - parseContext.requireExtensions($3.loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute"); - parseContext.handleFunctionAttributes($3.loc, *$1); - parseContext.handleFunctionAttributes($3.loc, *$4); - } - ; - -function_declarator - : function_header { - $$ = $1; - } - | function_header_with_parameters { - $$ = $1; - } - ; - - -function_header_with_parameters - : function_header parameter_declaration { - // Add the parameter - $$ = $1; - if ($2.param.type->getBasicType() != EbtVoid) - $1->addParameter($2.param); - else - delete $2.param.type; - } - | function_header_with_parameters COMMA parameter_declaration { - // - // Only first parameter of one-parameter functions can be void - // The check for named parameters not being void is done in parameter_declarator - // - if ($3.param.type->getBasicType() == EbtVoid) { - // - // This parameter > first is void - // - parseContext.error($2.loc, "cannot be an argument type except for '(void)'", "void", ""); - delete $3.param.type; - } else { - // Add the parameter - $$ = $1; - $1->addParameter($3.param); - } - } - ; - -function_header - : fully_specified_type IDENTIFIER LEFT_PAREN { - if ($1.qualifier.storage != EvqGlobal && $1.qualifier.storage != EvqTemporary) { - parseContext.error($2.loc, "no qualifiers allowed for function return", - GetStorageQualifierString($1.qualifier.storage), ""); - } - if ($1.arraySizes) - parseContext.arraySizeRequiredCheck($1.loc, *$1.arraySizes); - - // Add the function as a prototype after parsing it (we do not support recursion) - TFunction *function; - TType type($1); - - // Potentially rename shader entry point function. No-op most of the time. - parseContext.renameShaderFunction($2.string); - - // Make the function - function = new TFunction($2.string, type); - $$ = function; - } - ; - -parameter_declarator - // Type + name - : type_specifier IDENTIFIER { - if ($1.arraySizes) { - parseContext.profileRequires($1.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); - parseContext.profileRequires($1.loc, EEsProfile, 300, 0, "arrayed type"); - parseContext.arraySizeRequiredCheck($1.loc, *$1.arraySizes); - } - if ($1.basicType == EbtVoid) { - parseContext.error($2.loc, "illegal use of type 'void'", $2.string->c_str(), ""); - } - parseContext.reservedErrorCheck($2.loc, *$2.string); - - TParameter param = {$2.string, new TType($1)}; - $$.loc = $2.loc; - $$.param = param; - } - | type_specifier IDENTIFIER array_specifier { - if ($1.arraySizes) { - parseContext.profileRequires($1.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); - parseContext.profileRequires($1.loc, EEsProfile, 300, 0, "arrayed type"); - parseContext.arraySizeRequiredCheck($1.loc, *$1.arraySizes); - } - TType* type = new TType($1); - type->transferArraySizes($3.arraySizes); - type->copyArrayInnerSizes($1.arraySizes); - - parseContext.arrayOfArrayVersionCheck($2.loc, type->getArraySizes()); - parseContext.arraySizeRequiredCheck($3.loc, *$3.arraySizes); - parseContext.reservedErrorCheck($2.loc, *$2.string); - - TParameter param = { $2.string, type }; - - $$.loc = $2.loc; - $$.param = param; - } - ; - -parameter_declaration - // - // With name - // - : type_qualifier parameter_declarator { - $$ = $2; - if ($1.qualifier.precision != EpqNone) - $$.param.type->getQualifier().precision = $1.qualifier.precision; - parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier()); - - parseContext.checkNoShaderLayouts($1.loc, $1.shaderQualifiers); - parseContext.parameterTypeCheck($2.loc, $1.qualifier.storage, *$$.param.type); - parseContext.paramCheckFix($1.loc, $1.qualifier, *$$.param.type); - - } - | parameter_declarator { - $$ = $1; - - parseContext.parameterTypeCheck($1.loc, EvqIn, *$1.param.type); - parseContext.paramCheckFixStorage($1.loc, EvqTemporary, *$$.param.type); - parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier()); - } - // - // Without name - // - | type_qualifier parameter_type_specifier { - $$ = $2; - if ($1.qualifier.precision != EpqNone) - $$.param.type->getQualifier().precision = $1.qualifier.precision; - parseContext.precisionQualifierCheck($1.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier()); - - parseContext.checkNoShaderLayouts($1.loc, $1.shaderQualifiers); - parseContext.parameterTypeCheck($2.loc, $1.qualifier.storage, *$$.param.type); - parseContext.paramCheckFix($1.loc, $1.qualifier, *$$.param.type); - } - | parameter_type_specifier { - $$ = $1; - - parseContext.parameterTypeCheck($1.loc, EvqIn, *$1.param.type); - parseContext.paramCheckFixStorage($1.loc, EvqTemporary, *$$.param.type); - parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier()); - } - ; - -parameter_type_specifier - : type_specifier { - TParameter param = { 0, new TType($1) }; - $$.param = param; - if ($1.arraySizes) - parseContext.arraySizeRequiredCheck($1.loc, *$1.arraySizes); - } - ; - -init_declarator_list - : single_declaration { - $$ = $1; - } - | init_declarator_list COMMA IDENTIFIER { - $$ = $1; - parseContext.declareVariable($3.loc, *$3.string, $1.type); - } - | init_declarator_list COMMA IDENTIFIER array_specifier { - $$ = $1; - parseContext.declareVariable($3.loc, *$3.string, $1.type, $4.arraySizes); - } - | init_declarator_list COMMA IDENTIFIER array_specifier EQUAL initializer { - $$.type = $1.type; - TIntermNode* initNode = parseContext.declareVariable($3.loc, *$3.string, $1.type, $4.arraySizes, $6); - $$.intermNode = parseContext.intermediate.growAggregate($1.intermNode, initNode, $5.loc); - } - | init_declarator_list COMMA IDENTIFIER EQUAL initializer { - $$.type = $1.type; - TIntermNode* initNode = parseContext.declareVariable($3.loc, *$3.string, $1.type, 0, $5); - $$.intermNode = parseContext.intermediate.growAggregate($1.intermNode, initNode, $4.loc); - } - ; - -single_declaration - : fully_specified_type { - $$.type = $1; - $$.intermNode = 0; -GLSLANG_WEB_EXCLUDE_ON - parseContext.declareTypeDefaults($$.loc, $$.type); -GLSLANG_WEB_EXCLUDE_OFF - } - | fully_specified_type IDENTIFIER { - $$.type = $1; - $$.intermNode = 0; - parseContext.declareVariable($2.loc, *$2.string, $1); - } - | fully_specified_type IDENTIFIER array_specifier { - $$.type = $1; - $$.intermNode = 0; - parseContext.declareVariable($2.loc, *$2.string, $1, $3.arraySizes); - } - | fully_specified_type IDENTIFIER array_specifier EQUAL initializer { - $$.type = $1; - TIntermNode* initNode = parseContext.declareVariable($2.loc, *$2.string, $1, $3.arraySizes, $5); - $$.intermNode = parseContext.intermediate.growAggregate(0, initNode, $4.loc); - } - | fully_specified_type IDENTIFIER EQUAL initializer { - $$.type = $1; - TIntermNode* initNode = parseContext.declareVariable($2.loc, *$2.string, $1, 0, $4); - $$.intermNode = parseContext.intermediate.growAggregate(0, initNode, $3.loc); - } - -// Grammar Note: No 'enum', or 'typedef'. - -fully_specified_type - : type_specifier { - $$ = $1; - - parseContext.globalQualifierTypeCheck($1.loc, $1.qualifier, $$); - if ($1.arraySizes) { - parseContext.profileRequires($1.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); - parseContext.profileRequires($1.loc, EEsProfile, 300, 0, "arrayed type"); - } - parseContext.precisionQualifierCheck($$.loc, $$.basicType, $$.qualifier); - } - | type_qualifier type_specifier { - parseContext.globalQualifierFixCheck($1.loc, $1.qualifier); - parseContext.globalQualifierTypeCheck($1.loc, $1.qualifier, $2); - - if ($2.arraySizes) { - parseContext.profileRequires($2.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); - parseContext.profileRequires($2.loc, EEsProfile, 300, 0, "arrayed type"); - } - - if ($2.arraySizes && parseContext.arrayQualifierError($2.loc, $1.qualifier)) - $2.arraySizes = nullptr; - - parseContext.checkNoShaderLayouts($2.loc, $1.shaderQualifiers); - $2.shaderQualifiers.merge($1.shaderQualifiers); - parseContext.mergeQualifiers($2.loc, $2.qualifier, $1.qualifier, true); - parseContext.precisionQualifierCheck($2.loc, $2.basicType, $2.qualifier); - - $$ = $2; - - if (! $$.qualifier.isInterpolation() && - ((parseContext.language == EShLangVertex && $$.qualifier.storage == EvqVaryingOut) || - (parseContext.language == EShLangFragment && $$.qualifier.storage == EvqVaryingIn))) - $$.qualifier.smooth = true; - } - ; - -invariant_qualifier - : INVARIANT { - parseContext.globalCheck($1.loc, "invariant"); - parseContext.profileRequires($$.loc, ENoProfile, 120, 0, "invariant"); - $$.init($1.loc); - $$.qualifier.invariant = true; - } - ; - -interpolation_qualifier - : SMOOTH { - parseContext.globalCheck($1.loc, "smooth"); - parseContext.profileRequires($1.loc, ENoProfile, 130, 0, "smooth"); - parseContext.profileRequires($1.loc, EEsProfile, 300, 0, "smooth"); - $$.init($1.loc); - $$.qualifier.smooth = true; - } - | FLAT { - parseContext.globalCheck($1.loc, "flat"); - parseContext.profileRequires($1.loc, ENoProfile, 130, 0, "flat"); - parseContext.profileRequires($1.loc, EEsProfile, 300, 0, "flat"); - $$.init($1.loc); - $$.qualifier.flat = true; - } -GLSLANG_WEB_EXCLUDE_ON - | NOPERSPECTIVE { - parseContext.globalCheck($1.loc, "noperspective"); - parseContext.profileRequires($1.loc, EEsProfile, 0, E_GL_NV_shader_noperspective_interpolation, "noperspective"); - parseContext.profileRequires($1.loc, ENoProfile, 130, 0, "noperspective"); - $$.init($1.loc); - $$.qualifier.nopersp = true; - } - | EXPLICITINTERPAMD { - parseContext.globalCheck($1.loc, "__explicitInterpAMD"); - parseContext.profileRequires($1.loc, ECoreProfile, 450, E_GL_AMD_shader_explicit_vertex_parameter, "explicit interpolation"); - parseContext.profileRequires($1.loc, ECompatibilityProfile, 450, E_GL_AMD_shader_explicit_vertex_parameter, "explicit interpolation"); - $$.init($1.loc); - $$.qualifier.explicitInterp = true; - } - | PERVERTEXNV { - parseContext.globalCheck($1.loc, "pervertexNV"); - parseContext.profileRequires($1.loc, ECoreProfile, 0, E_GL_NV_fragment_shader_barycentric, "fragment shader barycentric"); - parseContext.profileRequires($1.loc, ECompatibilityProfile, 0, E_GL_NV_fragment_shader_barycentric, "fragment shader barycentric"); - parseContext.profileRequires($1.loc, EEsProfile, 0, E_GL_NV_fragment_shader_barycentric, "fragment shader barycentric"); - $$.init($1.loc); - $$.qualifier.pervertexNV = true; - } - | PERVERTEXEXT { - parseContext.globalCheck($1.loc, "pervertexEXT"); - parseContext.profileRequires($1.loc, ECoreProfile, 0, E_GL_EXT_fragment_shader_barycentric, "fragment shader barycentric"); - parseContext.profileRequires($1.loc, ECompatibilityProfile, 0, E_GL_EXT_fragment_shader_barycentric, "fragment shader barycentric"); - parseContext.profileRequires($1.loc, EEsProfile, 0, E_GL_EXT_fragment_shader_barycentric, "fragment shader barycentric"); - $$.init($1.loc); - $$.qualifier.pervertexEXT = true; - } - | PERPRIMITIVENV { - // No need for profile version or extension check. Shader stage already checks both. - parseContext.globalCheck($1.loc, "perprimitiveNV"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangFragmentMask | EShLangMeshMask), "perprimitiveNV"); - // Fragment shader stage doesn't check for extension. So we explicitly add below extension check. - if (parseContext.language == EShLangFragment) - parseContext.requireExtensions($1.loc, 1, &E_GL_NV_mesh_shader, "perprimitiveNV"); - $$.init($1.loc); - $$.qualifier.perPrimitiveNV = true; - } - | PERPRIMITIVEEXT { - // No need for profile version or extension check. Shader stage already checks both. - parseContext.globalCheck($1.loc, "perprimitiveEXT"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangFragmentMask | EShLangMeshMask), "perprimitiveEXT"); - // Fragment shader stage doesn't check for extension. So we explicitly add below extension check. - if (parseContext.language == EShLangFragment) - parseContext.requireExtensions($1.loc, 1, &E_GL_EXT_mesh_shader, "perprimitiveEXT"); - $$.init($1.loc); - $$.qualifier.perPrimitiveNV = true; - } - | PERVIEWNV { - // No need for profile version or extension check. Shader stage already checks both. - parseContext.globalCheck($1.loc, "perviewNV"); - parseContext.requireStage($1.loc, EShLangMesh, "perviewNV"); - $$.init($1.loc); - $$.qualifier.perViewNV = true; - } - | PERTASKNV { - // No need for profile version or extension check. Shader stage already checks both. - parseContext.globalCheck($1.loc, "taskNV"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangTaskMask | EShLangMeshMask), "taskNV"); - $$.init($1.loc); - $$.qualifier.perTaskNV = true; - } -GLSLANG_WEB_EXCLUDE_OFF - ; - -layout_qualifier - : LAYOUT LEFT_PAREN layout_qualifier_id_list RIGHT_PAREN { - $$ = $3; - } - ; - -layout_qualifier_id_list - : layout_qualifier_id { - $$ = $1; - } - | layout_qualifier_id_list COMMA layout_qualifier_id { - $$ = $1; - $$.shaderQualifiers.merge($3.shaderQualifiers); - parseContext.mergeObjectLayoutQualifiers($$.qualifier, $3.qualifier, false); - } - -layout_qualifier_id - : IDENTIFIER { - $$.init($1.loc); - parseContext.setLayoutQualifier($1.loc, $$, *$1.string); - } - | IDENTIFIER EQUAL constant_expression { - $$.init($1.loc); - parseContext.setLayoutQualifier($1.loc, $$, *$1.string, $3); - } - | SHARED { // because "shared" is both an identifier and a keyword - $$.init($1.loc); - TString strShared("shared"); - parseContext.setLayoutQualifier($1.loc, $$, strShared); - } - ; - -GLSLANG_WEB_EXCLUDE_ON -precise_qualifier - : PRECISE { - parseContext.profileRequires($$.loc, ECoreProfile | ECompatibilityProfile, 400, E_GL_ARB_gpu_shader5, "precise"); - parseContext.profileRequires($1.loc, EEsProfile, 320, Num_AEP_gpu_shader5, AEP_gpu_shader5, "precise"); - $$.init($1.loc); - $$.qualifier.noContraction = true; - } - ; -GLSLANG_WEB_EXCLUDE_OFF - -type_qualifier - : single_type_qualifier { - $$ = $1; - } - | type_qualifier single_type_qualifier { - $$ = $1; - if ($$.basicType == EbtVoid) - $$.basicType = $2.basicType; - - $$.shaderQualifiers.merge($2.shaderQualifiers); - parseContext.mergeQualifiers($$.loc, $$.qualifier, $2.qualifier, false); - } - ; - -single_type_qualifier - : storage_qualifier { - $$ = $1; - } - | layout_qualifier { - $$ = $1; - } - | precision_qualifier { - parseContext.checkPrecisionQualifier($1.loc, $1.qualifier.precision); - $$ = $1; - } - | interpolation_qualifier { - // allow inheritance of storage qualifier from block declaration - $$ = $1; - } - | invariant_qualifier { - // allow inheritance of storage qualifier from block declaration - $$ = $1; - } -GLSLANG_WEB_EXCLUDE_ON - | precise_qualifier { - // allow inheritance of storage qualifier from block declaration - $$ = $1; - } - | non_uniform_qualifier { - $$ = $1; - } - | spirv_storage_class_qualifier { - parseContext.globalCheck($1.loc, "spirv_storage_class"); - parseContext.requireExtensions($1.loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V storage class qualifier"); - $$ = $1; - } - | spirv_decorate_qualifier { - parseContext.requireExtensions($1.loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V decorate qualifier"); - $$ = $1; - } - | SPIRV_BY_REFERENCE { - parseContext.requireExtensions($1.loc, 1, &E_GL_EXT_spirv_intrinsics, "spirv_by_reference"); - $$.init($1.loc); - $$.qualifier.setSpirvByReference(); - } - | SPIRV_LITERAL { - parseContext.requireExtensions($1.loc, 1, &E_GL_EXT_spirv_intrinsics, "spirv_by_literal"); - $$.init($1.loc); - $$.qualifier.setSpirvLiteral(); - } -GLSLANG_WEB_EXCLUDE_OFF - ; - -storage_qualifier - : CONST { - $$.init($1.loc); - $$.qualifier.storage = EvqConst; // will later turn into EvqConstReadOnly, if the initializer is not constant - } - | INOUT { - parseContext.globalCheck($1.loc, "inout"); - $$.init($1.loc); - $$.qualifier.storage = EvqInOut; - } - | IN { - parseContext.globalCheck($1.loc, "in"); - $$.init($1.loc); - // whether this is a parameter "in" or a pipeline "in" will get sorted out a bit later - $$.qualifier.storage = EvqIn; - } - | OUT { - parseContext.globalCheck($1.loc, "out"); - $$.init($1.loc); - // whether this is a parameter "out" or a pipeline "out" will get sorted out a bit later - $$.qualifier.storage = EvqOut; - } - | CENTROID { - parseContext.profileRequires($1.loc, ENoProfile, 120, 0, "centroid"); - parseContext.profileRequires($1.loc, EEsProfile, 300, 0, "centroid"); - parseContext.globalCheck($1.loc, "centroid"); - $$.init($1.loc); - $$.qualifier.centroid = true; - } - | UNIFORM { - parseContext.globalCheck($1.loc, "uniform"); - $$.init($1.loc); - $$.qualifier.storage = EvqUniform; - } - | SHARED { - parseContext.globalCheck($1.loc, "shared"); - parseContext.profileRequires($1.loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_compute_shader, "shared"); - parseContext.profileRequires($1.loc, EEsProfile, 310, 0, "shared"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangComputeMask | EShLangMeshMask | EShLangTaskMask), "shared"); - $$.init($1.loc); - $$.qualifier.storage = EvqShared; - } - | BUFFER { - parseContext.globalCheck($1.loc, "buffer"); - $$.init($1.loc); - $$.qualifier.storage = EvqBuffer; - } -GLSLANG_WEB_EXCLUDE_ON - | ATTRIBUTE { - parseContext.requireStage($1.loc, EShLangVertex, "attribute"); - parseContext.checkDeprecated($1.loc, ECoreProfile, 130, "attribute"); - parseContext.checkDeprecated($1.loc, ENoProfile, 130, "attribute"); - parseContext.requireNotRemoved($1.loc, ECoreProfile, 420, "attribute"); - parseContext.requireNotRemoved($1.loc, EEsProfile, 300, "attribute"); - - parseContext.globalCheck($1.loc, "attribute"); - - $$.init($1.loc); - $$.qualifier.storage = EvqVaryingIn; - } - | VARYING { - parseContext.checkDeprecated($1.loc, ENoProfile, 130, "varying"); - parseContext.checkDeprecated($1.loc, ECoreProfile, 130, "varying"); - parseContext.requireNotRemoved($1.loc, ECoreProfile, 420, "varying"); - parseContext.requireNotRemoved($1.loc, EEsProfile, 300, "varying"); - - parseContext.globalCheck($1.loc, "varying"); - - $$.init($1.loc); - if (parseContext.language == EShLangVertex) - $$.qualifier.storage = EvqVaryingOut; - else - $$.qualifier.storage = EvqVaryingIn; - } - | PATCH { - parseContext.globalCheck($1.loc, "patch"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangTessControlMask | EShLangTessEvaluationMask), "patch"); - $$.init($1.loc); - $$.qualifier.patch = true; - } - | SAMPLE { - parseContext.globalCheck($1.loc, "sample"); - $$.init($1.loc); - $$.qualifier.sample = true; - } - | HITATTRNV { - parseContext.globalCheck($1.loc, "hitAttributeNV"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangIntersectMask | EShLangClosestHitMask - | EShLangAnyHitMask), "hitAttributeNV"); - parseContext.profileRequires($1.loc, ECoreProfile, 460, E_GL_NV_ray_tracing, "hitAttributeNV"); - $$.init($1.loc); - $$.qualifier.storage = EvqHitAttr; - } - | HITATTREXT { - parseContext.globalCheck($1.loc, "hitAttributeEXT"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangIntersectMask | EShLangClosestHitMask - | EShLangAnyHitMask), "hitAttributeEXT"); - parseContext.profileRequires($1.loc, ECoreProfile, 460, E_GL_EXT_ray_tracing, "hitAttributeNV"); - $$.init($1.loc); - $$.qualifier.storage = EvqHitAttr; - } - | PAYLOADNV { - parseContext.globalCheck($1.loc, "rayPayloadNV"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask | - EShLangAnyHitMask | EShLangMissMask), "rayPayloadNV"); - parseContext.profileRequires($1.loc, ECoreProfile, 460, E_GL_NV_ray_tracing, "rayPayloadNV"); - $$.init($1.loc); - $$.qualifier.storage = EvqPayload; - } - | PAYLOADEXT { - parseContext.globalCheck($1.loc, "rayPayloadEXT"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask | - EShLangAnyHitMask | EShLangMissMask), "rayPayloadEXT"); - parseContext.profileRequires($1.loc, ECoreProfile, 460, E_GL_EXT_ray_tracing, "rayPayloadEXT"); - $$.init($1.loc); - $$.qualifier.storage = EvqPayload; - } - | PAYLOADINNV { - parseContext.globalCheck($1.loc, "rayPayloadInNV"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangClosestHitMask | - EShLangAnyHitMask | EShLangMissMask), "rayPayloadInNV"); - parseContext.profileRequires($1.loc, ECoreProfile, 460, E_GL_NV_ray_tracing, "rayPayloadInNV"); - $$.init($1.loc); - $$.qualifier.storage = EvqPayloadIn; - } - | PAYLOADINEXT { - parseContext.globalCheck($1.loc, "rayPayloadInEXT"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangClosestHitMask | - EShLangAnyHitMask | EShLangMissMask), "rayPayloadInEXT"); - parseContext.profileRequires($1.loc, ECoreProfile, 460, E_GL_EXT_ray_tracing, "rayPayloadInEXT"); - $$.init($1.loc); - $$.qualifier.storage = EvqPayloadIn; - } - | CALLDATANV { - parseContext.globalCheck($1.loc, "callableDataNV"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangRayGenMask | - EShLangClosestHitMask | EShLangMissMask | EShLangCallableMask), "callableDataNV"); - parseContext.profileRequires($1.loc, ECoreProfile, 460, E_GL_NV_ray_tracing, "callableDataNV"); - $$.init($1.loc); - $$.qualifier.storage = EvqCallableData; - } - | CALLDATAEXT { - parseContext.globalCheck($1.loc, "callableDataEXT"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangRayGenMask | - EShLangClosestHitMask | EShLangMissMask | EShLangCallableMask), "callableDataEXT"); - parseContext.profileRequires($1.loc, ECoreProfile, 460, E_GL_EXT_ray_tracing, "callableDataEXT"); - $$.init($1.loc); - $$.qualifier.storage = EvqCallableData; - } - | CALLDATAINNV { - parseContext.globalCheck($1.loc, "callableDataInNV"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangCallableMask), "callableDataInNV"); - parseContext.profileRequires($1.loc, ECoreProfile, 460, E_GL_NV_ray_tracing, "callableDataInNV"); - $$.init($1.loc); - $$.qualifier.storage = EvqCallableDataIn; - } - | CALLDATAINEXT { - parseContext.globalCheck($1.loc, "callableDataInEXT"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangCallableMask), "callableDataInEXT"); - parseContext.profileRequires($1.loc, ECoreProfile, 460, E_GL_EXT_ray_tracing, "callableDataInEXT"); - $$.init($1.loc); - $$.qualifier.storage = EvqCallableDataIn; - } - | COHERENT { - $$.init($1.loc); - $$.qualifier.coherent = true; - } - | DEVICECOHERENT { - $$.init($1.loc); - parseContext.requireExtensions($1.loc, 1, &E_GL_KHR_memory_scope_semantics, "devicecoherent"); - $$.qualifier.devicecoherent = true; - } - | QUEUEFAMILYCOHERENT { - $$.init($1.loc); - parseContext.requireExtensions($1.loc, 1, &E_GL_KHR_memory_scope_semantics, "queuefamilycoherent"); - $$.qualifier.queuefamilycoherent = true; - } - | WORKGROUPCOHERENT { - $$.init($1.loc); - parseContext.requireExtensions($1.loc, 1, &E_GL_KHR_memory_scope_semantics, "workgroupcoherent"); - $$.qualifier.workgroupcoherent = true; - } - | SUBGROUPCOHERENT { - $$.init($1.loc); - parseContext.requireExtensions($1.loc, 1, &E_GL_KHR_memory_scope_semantics, "subgroupcoherent"); - $$.qualifier.subgroupcoherent = true; - } - | NONPRIVATE { - $$.init($1.loc); - parseContext.requireExtensions($1.loc, 1, &E_GL_KHR_memory_scope_semantics, "nonprivate"); - $$.qualifier.nonprivate = true; - } - | SHADERCALLCOHERENT { - $$.init($1.loc); - parseContext.requireExtensions($1.loc, 1, &E_GL_EXT_ray_tracing, "shadercallcoherent"); - $$.qualifier.shadercallcoherent = true; - } - | VOLATILE { - $$.init($1.loc); - $$.qualifier.volatil = true; - } - | RESTRICT { - $$.init($1.loc); - $$.qualifier.restrict = true; - } - | READONLY { - $$.init($1.loc); - $$.qualifier.readonly = true; - } - | WRITEONLY { - $$.init($1.loc); - $$.qualifier.writeonly = true; - } - | SUBROUTINE { - parseContext.spvRemoved($1.loc, "subroutine"); - parseContext.globalCheck($1.loc, "subroutine"); - parseContext.unimplemented($1.loc, "subroutine"); - $$.init($1.loc); - } - | SUBROUTINE LEFT_PAREN type_name_list RIGHT_PAREN { - parseContext.spvRemoved($1.loc, "subroutine"); - parseContext.globalCheck($1.loc, "subroutine"); - parseContext.unimplemented($1.loc, "subroutine"); - $$.init($1.loc); - } - | TASKPAYLOADWORKGROUPEXT { - // No need for profile version or extension check. Shader stage already checks both. - parseContext.globalCheck($1.loc, "taskPayloadSharedEXT"); - parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangTaskMask | EShLangMeshMask), "taskPayloadSharedEXT "); - $$.init($1.loc); - $$.qualifier.storage = EvqtaskPayloadSharedEXT; - } -GLSLANG_WEB_EXCLUDE_OFF - ; - -GLSLANG_WEB_EXCLUDE_ON -non_uniform_qualifier - : NONUNIFORM { - $$.init($1.loc); - $$.qualifier.nonUniform = true; - } - ; - -type_name_list - : IDENTIFIER { - // TODO - } - | type_name_list COMMA IDENTIFIER { - // TODO: 4.0 semantics: subroutines - // 1) make sure each identifier is a type declared earlier with SUBROUTINE - // 2) save all of the identifiers for future comparison with the declared function - } - ; -GLSLANG_WEB_EXCLUDE_OFF - -type_specifier - : type_specifier_nonarray type_parameter_specifier_opt { - $$ = $1; - $$.qualifier.precision = parseContext.getDefaultPrecision($$); - $$.typeParameters = $2; - } - | type_specifier_nonarray type_parameter_specifier_opt array_specifier { - parseContext.arrayOfArrayVersionCheck($3.loc, $3.arraySizes); - $$ = $1; - $$.qualifier.precision = parseContext.getDefaultPrecision($$); - $$.typeParameters = $2; - $$.arraySizes = $3.arraySizes; - } - ; - -array_specifier - : LEFT_BRACKET RIGHT_BRACKET { - $$.loc = $1.loc; - $$.arraySizes = new TArraySizes; - $$.arraySizes->addInnerSize(); - } - | LEFT_BRACKET conditional_expression RIGHT_BRACKET { - $$.loc = $1.loc; - $$.arraySizes = new TArraySizes; - - TArraySize size; - parseContext.arraySizeCheck($2->getLoc(), $2, size, "array size"); - $$.arraySizes->addInnerSize(size); - } - | array_specifier LEFT_BRACKET RIGHT_BRACKET { - $$ = $1; - $$.arraySizes->addInnerSize(); - } - | array_specifier LEFT_BRACKET conditional_expression RIGHT_BRACKET { - $$ = $1; - - TArraySize size; - parseContext.arraySizeCheck($3->getLoc(), $3, size, "array size"); - $$.arraySizes->addInnerSize(size); - } - ; - -type_parameter_specifier_opt - : type_parameter_specifier { - $$ = $1; - } - | /* May be null */ { - $$ = 0; - } - ; - -type_parameter_specifier - : LEFT_ANGLE type_parameter_specifier_list RIGHT_ANGLE { - $$ = $2; - } - ; - -type_parameter_specifier_list - : unary_expression { - $$ = new TArraySizes; - - TArraySize size; - parseContext.arraySizeCheck($1->getLoc(), $1, size, "type parameter"); - $$->addInnerSize(size); - } - | type_parameter_specifier_list COMMA unary_expression { - $$ = $1; - - TArraySize size; - parseContext.arraySizeCheck($3->getLoc(), $3, size, "type parameter"); - $$->addInnerSize(size); - } - ; - -type_specifier_nonarray - : VOID { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtVoid; - } - | FLOAT { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - } - | INT { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt; - } - | UINT { - parseContext.fullIntegerCheck($1.loc, "unsigned integer"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint; - } - | BOOL { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtBool; - } - | VEC2 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setVector(2); - } - | VEC3 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setVector(3); - } - | VEC4 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setVector(4); - } - | BVEC2 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtBool; - $$.setVector(2); - } - | BVEC3 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtBool; - $$.setVector(3); - } - | BVEC4 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtBool; - $$.setVector(4); - } - | IVEC2 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt; - $$.setVector(2); - } - | IVEC3 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt; - $$.setVector(3); - } - | IVEC4 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt; - $$.setVector(4); - } - | UVEC2 { - parseContext.fullIntegerCheck($1.loc, "unsigned integer vector"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint; - $$.setVector(2); - } - | UVEC3 { - parseContext.fullIntegerCheck($1.loc, "unsigned integer vector"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint; - $$.setVector(3); - } - | UVEC4 { - parseContext.fullIntegerCheck($1.loc, "unsigned integer vector"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint; - $$.setVector(4); - } - | MAT2 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(2, 2); - } - | MAT3 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(3, 3); - } - | MAT4 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(4, 4); - } - | MAT2X2 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(2, 2); - } - | MAT2X3 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(2, 3); - } - | MAT2X4 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(2, 4); - } - | MAT3X2 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(3, 2); - } - | MAT3X3 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(3, 3); - } - | MAT3X4 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(3, 4); - } - | MAT4X2 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(4, 2); - } - | MAT4X3 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(4, 3); - } - | MAT4X4 { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(4, 4); - } -GLSLANG_WEB_EXCLUDE_ON - | DOUBLE { - parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck($1.loc, "double"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - } - | FLOAT16_T { - parseContext.float16ScalarVectorCheck($1.loc, "float16_t", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat16; - } - | FLOAT32_T { - parseContext.explicitFloat32Check($1.loc, "float32_t", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - } - | FLOAT64_T { - parseContext.explicitFloat64Check($1.loc, "float64_t", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - } - | INT8_T { - parseContext.int8ScalarVectorCheck($1.loc, "8-bit signed integer", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt8; - } - | UINT8_T { - parseContext.int8ScalarVectorCheck($1.loc, "8-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint8; - } - | INT16_T { - parseContext.int16ScalarVectorCheck($1.loc, "16-bit signed integer", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt16; - } - | UINT16_T { - parseContext.int16ScalarVectorCheck($1.loc, "16-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint16; - } - | INT32_T { - parseContext.explicitInt32Check($1.loc, "32-bit signed integer", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt; - } - | UINT32_T { - parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint; - } - | INT64_T { - parseContext.int64Check($1.loc, "64-bit integer", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt64; - } - | UINT64_T { - parseContext.int64Check($1.loc, "64-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint64; - } - | DVEC2 { - parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double vector"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck($1.loc, "double vector"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setVector(2); - } - | DVEC3 { - parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double vector"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck($1.loc, "double vector"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setVector(3); - } - | DVEC4 { - parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double vector"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck($1.loc, "double vector"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setVector(4); - } - | F16VEC2 { - parseContext.float16ScalarVectorCheck($1.loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat16; - $$.setVector(2); - } - | F16VEC3 { - parseContext.float16ScalarVectorCheck($1.loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat16; - $$.setVector(3); - } - | F16VEC4 { - parseContext.float16ScalarVectorCheck($1.loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat16; - $$.setVector(4); - } - | F32VEC2 { - parseContext.explicitFloat32Check($1.loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setVector(2); - } - | F32VEC3 { - parseContext.explicitFloat32Check($1.loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setVector(3); - } - | F32VEC4 { - parseContext.explicitFloat32Check($1.loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setVector(4); - } - | F64VEC2 { - parseContext.explicitFloat64Check($1.loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setVector(2); - } - | F64VEC3 { - parseContext.explicitFloat64Check($1.loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setVector(3); - } - | F64VEC4 { - parseContext.explicitFloat64Check($1.loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setVector(4); - } - | I8VEC2 { - parseContext.int8ScalarVectorCheck($1.loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt8; - $$.setVector(2); - } - | I8VEC3 { - parseContext.int8ScalarVectorCheck($1.loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt8; - $$.setVector(3); - } - | I8VEC4 { - parseContext.int8ScalarVectorCheck($1.loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt8; - $$.setVector(4); - } - | I16VEC2 { - parseContext.int16ScalarVectorCheck($1.loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt16; - $$.setVector(2); - } - | I16VEC3 { - parseContext.int16ScalarVectorCheck($1.loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt16; - $$.setVector(3); - } - | I16VEC4 { - parseContext.int16ScalarVectorCheck($1.loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt16; - $$.setVector(4); - } - | I32VEC2 { - parseContext.explicitInt32Check($1.loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt; - $$.setVector(2); - } - | I32VEC3 { - parseContext.explicitInt32Check($1.loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt; - $$.setVector(3); - } - | I32VEC4 { - parseContext.explicitInt32Check($1.loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt; - $$.setVector(4); - } - | I64VEC2 { - parseContext.int64Check($1.loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt64; - $$.setVector(2); - } - | I64VEC3 { - parseContext.int64Check($1.loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt64; - $$.setVector(3); - } - | I64VEC4 { - parseContext.int64Check($1.loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt64; - $$.setVector(4); - } - | U8VEC2 { - parseContext.int8ScalarVectorCheck($1.loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint8; - $$.setVector(2); - } - | U8VEC3 { - parseContext.int8ScalarVectorCheck($1.loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint8; - $$.setVector(3); - } - | U8VEC4 { - parseContext.int8ScalarVectorCheck($1.loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint8; - $$.setVector(4); - } - | U16VEC2 { - parseContext.int16ScalarVectorCheck($1.loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint16; - $$.setVector(2); - } - | U16VEC3 { - parseContext.int16ScalarVectorCheck($1.loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint16; - $$.setVector(3); - } - | U16VEC4 { - parseContext.int16ScalarVectorCheck($1.loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint16; - $$.setVector(4); - } - | U32VEC2 { - parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint; - $$.setVector(2); - } - | U32VEC3 { - parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint; - $$.setVector(3); - } - | U32VEC4 { - parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint; - $$.setVector(4); - } - | U64VEC2 { - parseContext.int64Check($1.loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint64; - $$.setVector(2); - } - | U64VEC3 { - parseContext.int64Check($1.loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint64; - $$.setVector(3); - } - | U64VEC4 { - parseContext.int64Check($1.loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint64; - $$.setVector(4); - } - | DMAT2 { - parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double matrix"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck($1.loc, "double matrix"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(2, 2); - } - | DMAT3 { - parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double matrix"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck($1.loc, "double matrix"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(3, 3); - } - | DMAT4 { - parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double matrix"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck($1.loc, "double matrix"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(4, 4); - } - | DMAT2X2 { - parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double matrix"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck($1.loc, "double matrix"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(2, 2); - } - | DMAT2X3 { - parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double matrix"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck($1.loc, "double matrix"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(2, 3); - } - | DMAT2X4 { - parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double matrix"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck($1.loc, "double matrix"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(2, 4); - } - | DMAT3X2 { - parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double matrix"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck($1.loc, "double matrix"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(3, 2); - } - | DMAT3X3 { - parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double matrix"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck($1.loc, "double matrix"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(3, 3); - } - | DMAT3X4 { - parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double matrix"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck($1.loc, "double matrix"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(3, 4); - } - | DMAT4X2 { - parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double matrix"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck($1.loc, "double matrix"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(4, 2); - } - | DMAT4X3 { - parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double matrix"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck($1.loc, "double matrix"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(4, 3); - } - | DMAT4X4 { - parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double matrix"); - if (! parseContext.symbolTable.atBuiltInLevel()) - parseContext.doubleCheck($1.loc, "double matrix"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(4, 4); - } - | F16MAT2 { - parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat16; - $$.setMatrix(2, 2); - } - | F16MAT3 { - parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat16; - $$.setMatrix(3, 3); - } - | F16MAT4 { - parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat16; - $$.setMatrix(4, 4); - } - | F16MAT2X2 { - parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat16; - $$.setMatrix(2, 2); - } - | F16MAT2X3 { - parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat16; - $$.setMatrix(2, 3); - } - | F16MAT2X4 { - parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat16; - $$.setMatrix(2, 4); - } - | F16MAT3X2 { - parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat16; - $$.setMatrix(3, 2); - } - | F16MAT3X3 { - parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat16; - $$.setMatrix(3, 3); - } - | F16MAT3X4 { - parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat16; - $$.setMatrix(3, 4); - } - | F16MAT4X2 { - parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat16; - $$.setMatrix(4, 2); - } - | F16MAT4X3 { - parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat16; - $$.setMatrix(4, 3); - } - | F16MAT4X4 { - parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat16; - $$.setMatrix(4, 4); - } - | F32MAT2 { - parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(2, 2); - } - | F32MAT3 { - parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(3, 3); - } - | F32MAT4 { - parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(4, 4); - } - | F32MAT2X2 { - parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(2, 2); - } - | F32MAT2X3 { - parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(2, 3); - } - | F32MAT2X4 { - parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(2, 4); - } - | F32MAT3X2 { - parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(3, 2); - } - | F32MAT3X3 { - parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(3, 3); - } - | F32MAT3X4 { - parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(3, 4); - } - | F32MAT4X2 { - parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(4, 2); - } - | F32MAT4X3 { - parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(4, 3); - } - | F32MAT4X4 { - parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.setMatrix(4, 4); - } - | F64MAT2 { - parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(2, 2); - } - | F64MAT3 { - parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(3, 3); - } - | F64MAT4 { - parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(4, 4); - } - | F64MAT2X2 { - parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(2, 2); - } - | F64MAT2X3 { - parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(2, 3); - } - | F64MAT2X4 { - parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(2, 4); - } - | F64MAT3X2 { - parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(3, 2); - } - | F64MAT3X3 { - parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(3, 3); - } - | F64MAT3X4 { - parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(3, 4); - } - | F64MAT4X2 { - parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(4, 2); - } - | F64MAT4X3 { - parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(4, 3); - } - | F64MAT4X4 { - parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtDouble; - $$.setMatrix(4, 4); - } - | ACCSTRUCTNV { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtAccStruct; - } - | ACCSTRUCTEXT { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtAccStruct; - } - | RAYQUERYEXT { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtRayQuery; - } - | ATOMIC_UINT { - parseContext.vulkanRemoved($1.loc, "atomic counter types"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtAtomicUint; - } - | SAMPLER1D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, Esd1D); - } -GLSLANG_WEB_EXCLUDE_OFF - | SAMPLER2D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, Esd2D); - } - | SAMPLER3D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, Esd3D); - } - | SAMPLERCUBE { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, EsdCube); - } - | SAMPLER2DSHADOW { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, Esd2D, false, true); - } - | SAMPLERCUBESHADOW { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, EsdCube, false, true); - } - | SAMPLER2DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, Esd2D, true); - } - | SAMPLER2DARRAYSHADOW { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, Esd2D, true, true); - } -GLSLANG_WEB_EXCLUDE_ON - | SAMPLER1DSHADOW { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, Esd1D, false, true); - } - | SAMPLER1DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, Esd1D, true); - } - | SAMPLER1DARRAYSHADOW { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, Esd1D, true, true); - } - | SAMPLERCUBEARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, EsdCube, true); - } - | SAMPLERCUBEARRAYSHADOW { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, EsdCube, true, true); - } - | F16SAMPLER1D { - parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat16, Esd1D); - } - | F16SAMPLER2D { - parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat16, Esd2D); - } - | F16SAMPLER3D { - parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat16, Esd3D); - } - | F16SAMPLERCUBE { - parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat16, EsdCube); - } - | F16SAMPLER1DSHADOW { - parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat16, Esd1D, false, true); - } - | F16SAMPLER2DSHADOW { - parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat16, Esd2D, false, true); - } - | F16SAMPLERCUBESHADOW { - parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat16, EsdCube, false, true); - } - | F16SAMPLER1DARRAY { - parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat16, Esd1D, true); - } - | F16SAMPLER2DARRAY { - parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat16, Esd2D, true); - } - | F16SAMPLER1DARRAYSHADOW { - parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat16, Esd1D, true, true); - } - | F16SAMPLER2DARRAYSHADOW { - parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat16, Esd2D, true, true); - } - | F16SAMPLERCUBEARRAY { - parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat16, EsdCube, true); - } - | F16SAMPLERCUBEARRAYSHADOW { - parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat16, EsdCube, true, true); - } - | ISAMPLER1D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtInt, Esd1D); - } -GLSLANG_WEB_EXCLUDE_OFF - | ISAMPLER2D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtInt, Esd2D); - } - | ISAMPLER3D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtInt, Esd3D); - } - | ISAMPLERCUBE { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtInt, EsdCube); - } - | ISAMPLER2DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtInt, Esd2D, true); - } - | USAMPLER2D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtUint, Esd2D); - } - | USAMPLER3D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtUint, Esd3D); - } - | USAMPLERCUBE { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtUint, EsdCube); - } -GLSLANG_WEB_EXCLUDE_ON - | ISAMPLER1DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtInt, Esd1D, true); - } - | ISAMPLERCUBEARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtInt, EsdCube, true); - } - | USAMPLER1D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtUint, Esd1D); - } - | USAMPLER1DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtUint, Esd1D, true); - } - | USAMPLERCUBEARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtUint, EsdCube, true); - } - | TEXTURECUBEARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat, EsdCube, true); - } - | ITEXTURECUBEARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtInt, EsdCube, true); - } - | UTEXTURECUBEARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtUint, EsdCube, true); - } -GLSLANG_WEB_EXCLUDE_OFF - | USAMPLER2DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtUint, Esd2D, true); - } - | TEXTURE2D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat, Esd2D); - } - | TEXTURE3D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat, Esd3D); - } - | TEXTURE2DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat, Esd2D, true); - } - | TEXTURECUBE { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat, EsdCube); - } - | ITEXTURE2D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtInt, Esd2D); - } - | ITEXTURE3D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtInt, Esd3D); - } - | ITEXTURECUBE { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtInt, EsdCube); - } - | ITEXTURE2DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtInt, Esd2D, true); - } - | UTEXTURE2D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtUint, Esd2D); - } - | UTEXTURE3D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtUint, Esd3D); - } - | UTEXTURECUBE { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtUint, EsdCube); - } - | UTEXTURE2DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtUint, Esd2D, true); - } - | SAMPLER { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setPureSampler(false); - } - | SAMPLERSHADOW { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setPureSampler(true); - } -GLSLANG_WEB_EXCLUDE_ON - | SAMPLER2DRECT { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, EsdRect); - } - | SAMPLER2DRECTSHADOW { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, EsdRect, false, true); - } - | F16SAMPLER2DRECT { - parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat16, EsdRect); - } - | F16SAMPLER2DRECTSHADOW { - parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat16, EsdRect, false, true); - } - | ISAMPLER2DRECT { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtInt, EsdRect); - } - | USAMPLER2DRECT { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtUint, EsdRect); - } - | SAMPLERBUFFER { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, EsdBuffer); - } - | F16SAMPLERBUFFER { - parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat16, EsdBuffer); - } - | ISAMPLERBUFFER { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtInt, EsdBuffer); - } - | USAMPLERBUFFER { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtUint, EsdBuffer); - } - | SAMPLER2DMS { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, Esd2D, false, false, true); - } - | F16SAMPLER2DMS { - parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat16, Esd2D, false, false, true); - } - | ISAMPLER2DMS { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtInt, Esd2D, false, false, true); - } - | USAMPLER2DMS { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtUint, Esd2D, false, false, true); - } - | SAMPLER2DMSARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, Esd2D, true, false, true); - } - | F16SAMPLER2DMSARRAY { - parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat16, Esd2D, true, false, true); - } - | ISAMPLER2DMSARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtInt, Esd2D, true, false, true); - } - | USAMPLER2DMSARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtUint, Esd2D, true, false, true); - } - | TEXTURE1D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat, Esd1D); - } - | F16TEXTURE1D { - parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat16, Esd1D); - } - | F16TEXTURE2D { - parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat16, Esd2D); - } - | F16TEXTURE3D { - parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat16, Esd3D); - } - | F16TEXTURECUBE { - parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat16, EsdCube); - } - | TEXTURE1DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat, Esd1D, true); - } - | F16TEXTURE1DARRAY { - parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat16, Esd1D, true); - } - | F16TEXTURE2DARRAY { - parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat16, Esd2D, true); - } - | F16TEXTURECUBEARRAY { - parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat16, EsdCube, true); - } - | ITEXTURE1D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtInt, Esd1D); - } - | ITEXTURE1DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtInt, Esd1D, true); - } - | UTEXTURE1D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtUint, Esd1D); - } - | UTEXTURE1DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtUint, Esd1D, true); - } - | TEXTURE2DRECT { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat, EsdRect); - } - | F16TEXTURE2DRECT { - parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat16, EsdRect); - } - | ITEXTURE2DRECT { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtInt, EsdRect); - } - | UTEXTURE2DRECT { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtUint, EsdRect); - } - | TEXTUREBUFFER { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat, EsdBuffer); - } - | F16TEXTUREBUFFER { - parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat16, EsdBuffer); - } - | ITEXTUREBUFFER { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtInt, EsdBuffer); - } - | UTEXTUREBUFFER { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtUint, EsdBuffer); - } - | TEXTURE2DMS { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat, Esd2D, false, false, true); - } - | F16TEXTURE2DMS { - parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat16, Esd2D, false, false, true); - } - | ITEXTURE2DMS { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtInt, Esd2D, false, false, true); - } - | UTEXTURE2DMS { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtUint, Esd2D, false, false, true); - } - | TEXTURE2DMSARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat, Esd2D, true, false, true); - } - | F16TEXTURE2DMSARRAY { - parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtFloat16, Esd2D, true, false, true); - } - | ITEXTURE2DMSARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtInt, Esd2D, true, false, true); - } - | UTEXTURE2DMSARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setTexture(EbtUint, Esd2D, true, false, true); - } - | IMAGE1D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat, Esd1D); - } - | F16IMAGE1D { - parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat16, Esd1D); - } - | IIMAGE1D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt, Esd1D); - } - | UIMAGE1D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint, Esd1D); - } - | IMAGE2D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat, Esd2D); - } - | F16IMAGE2D { - parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat16, Esd2D); - } - | IIMAGE2D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt, Esd2D); - } - | UIMAGE2D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint, Esd2D); - } - | IMAGE3D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat, Esd3D); - } - | F16IMAGE3D { - parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat16, Esd3D); - } - | IIMAGE3D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt, Esd3D); - } - | UIMAGE3D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint, Esd3D); - } - | IMAGE2DRECT { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat, EsdRect); - } - | F16IMAGE2DRECT { - parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat16, EsdRect); - } - | IIMAGE2DRECT { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt, EsdRect); - } - | UIMAGE2DRECT { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint, EsdRect); - } - | IMAGECUBE { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat, EsdCube); - } - | F16IMAGECUBE { - parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat16, EsdCube); - } - | IIMAGECUBE { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt, EsdCube); - } - | UIMAGECUBE { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint, EsdCube); - } - | IMAGEBUFFER { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat, EsdBuffer); - } - | F16IMAGEBUFFER { - parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat16, EsdBuffer); - } - | IIMAGEBUFFER { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt, EsdBuffer); - } - | UIMAGEBUFFER { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint, EsdBuffer); - } - | IMAGE1DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat, Esd1D, true); - } - | F16IMAGE1DARRAY { - parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat16, Esd1D, true); - } - | IIMAGE1DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt, Esd1D, true); - } - | UIMAGE1DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint, Esd1D, true); - } - | IMAGE2DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat, Esd2D, true); - } - | F16IMAGE2DARRAY { - parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat16, Esd2D, true); - } - | IIMAGE2DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt, Esd2D, true); - } - | UIMAGE2DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint, Esd2D, true); - } - | IMAGECUBEARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat, EsdCube, true); - } - | F16IMAGECUBEARRAY { - parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat16, EsdCube, true); - } - | IIMAGECUBEARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt, EsdCube, true); - } - | UIMAGECUBEARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint, EsdCube, true); - } - | IMAGE2DMS { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat, Esd2D, false, false, true); - } - | F16IMAGE2DMS { - parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat16, Esd2D, false, false, true); - } - | IIMAGE2DMS { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt, Esd2D, false, false, true); - } - | UIMAGE2DMS { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint, Esd2D, false, false, true); - } - | IMAGE2DMSARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat, Esd2D, true, false, true); - } - | F16IMAGE2DMSARRAY { - parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtFloat16, Esd2D, true, false, true); - } - | IIMAGE2DMSARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt, Esd2D, true, false, true); - } - | UIMAGE2DMSARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint, Esd2D, true, false, true); - } - | I64IMAGE1D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt64, Esd1D); - } - | U64IMAGE1D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint64, Esd1D); - } - | I64IMAGE2D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt64, Esd2D); - } - | U64IMAGE2D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint64, Esd2D); - } - | I64IMAGE3D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt64, Esd3D); - } - | U64IMAGE3D { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint64, Esd3D); - } - | I64IMAGE2DRECT { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt64, EsdRect); - } - | U64IMAGE2DRECT { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint64, EsdRect); - } - | I64IMAGECUBE { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt64, EsdCube); - } - | U64IMAGECUBE { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint64, EsdCube); - } - | I64IMAGEBUFFER { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt64, EsdBuffer); - } - | U64IMAGEBUFFER { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint64, EsdBuffer); - } - | I64IMAGE1DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt64, Esd1D, true); - } - | U64IMAGE1DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint64, Esd1D, true); - } - | I64IMAGE2DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt64, Esd2D, true); - } - | U64IMAGE2DARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint64, Esd2D, true); - } - | I64IMAGECUBEARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt64, EsdCube, true); - } - | U64IMAGECUBEARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint64, EsdCube, true); - } - | I64IMAGE2DMS { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt64, Esd2D, false, false, true); - } - | U64IMAGE2DMS { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint64, Esd2D, false, false, true); - } - | I64IMAGE2DMSARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtInt64, Esd2D, true, false, true); - } - | U64IMAGE2DMSARRAY { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setImage(EbtUint64, Esd2D, true, false, true); - } - | SAMPLEREXTERNALOES { // GL_OES_EGL_image_external - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, Esd2D); - $$.sampler.external = true; - } - | SAMPLEREXTERNAL2DY2YEXT { // GL_EXT_YUV_target - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.set(EbtFloat, Esd2D); - $$.sampler.yuv = true; - } - | SUBPASSINPUT { - parseContext.requireStage($1.loc, EShLangFragment, "subpass input"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setSubpass(EbtFloat); - } - | SUBPASSINPUTMS { - parseContext.requireStage($1.loc, EShLangFragment, "subpass input"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setSubpass(EbtFloat, true); - } - | F16SUBPASSINPUT { - parseContext.float16OpaqueCheck($1.loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel()); - parseContext.requireStage($1.loc, EShLangFragment, "subpass input"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setSubpass(EbtFloat16); - } - | F16SUBPASSINPUTMS { - parseContext.float16OpaqueCheck($1.loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel()); - parseContext.requireStage($1.loc, EShLangFragment, "subpass input"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setSubpass(EbtFloat16, true); - } - | ISUBPASSINPUT { - parseContext.requireStage($1.loc, EShLangFragment, "subpass input"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setSubpass(EbtInt); - } - | ISUBPASSINPUTMS { - parseContext.requireStage($1.loc, EShLangFragment, "subpass input"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setSubpass(EbtInt, true); - } - | USUBPASSINPUT { - parseContext.requireStage($1.loc, EShLangFragment, "subpass input"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setSubpass(EbtUint); - } - | USUBPASSINPUTMS { - parseContext.requireStage($1.loc, EShLangFragment, "subpass input"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtSampler; - $$.sampler.setSubpass(EbtUint, true); - } - | FCOOPMATNV { - parseContext.fcoopmatCheck($1.loc, "fcoopmatNV", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtFloat; - $$.coopmat = true; - } - | ICOOPMATNV { - parseContext.intcoopmatCheck($1.loc, "icoopmatNV", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtInt; - $$.coopmat = true; - } - | UCOOPMATNV { - parseContext.intcoopmatCheck($1.loc, "ucoopmatNV", parseContext.symbolTable.atBuiltInLevel()); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtUint; - $$.coopmat = true; - } - | spirv_type_specifier { - parseContext.requireExtensions($1.loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V type specifier"); - $$ = $1; - } -GLSLANG_WEB_EXCLUDE_OFF - | struct_specifier { - $$ = $1; - $$.qualifier.storage = parseContext.symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary; - parseContext.structTypeCheck($$.loc, $$); - } - | TYPE_NAME { - // - // This is for user defined type names. The lexical phase looked up the - // type. - // - if (const TVariable* variable = ($1.symbol)->getAsVariable()) { - const TType& structure = variable->getType(); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.basicType = EbtStruct; - $$.userDef = &structure; - } else - parseContext.error($1.loc, "expected type name", $1.string->c_str(), ""); - } - ; - -precision_qualifier - : HIGH_PRECISION { - parseContext.profileRequires($1.loc, ENoProfile, 130, 0, "highp precision qualifier"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - parseContext.handlePrecisionQualifier($1.loc, $$.qualifier, EpqHigh); - } - | MEDIUM_PRECISION { - parseContext.profileRequires($1.loc, ENoProfile, 130, 0, "mediump precision qualifier"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - parseContext.handlePrecisionQualifier($1.loc, $$.qualifier, EpqMedium); - } - | LOW_PRECISION { - parseContext.profileRequires($1.loc, ENoProfile, 130, 0, "lowp precision qualifier"); - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - parseContext.handlePrecisionQualifier($1.loc, $$.qualifier, EpqLow); - } - ; - -struct_specifier - : STRUCT IDENTIFIER LEFT_BRACE { parseContext.nestedStructCheck($1.loc); } struct_declaration_list RIGHT_BRACE { - TType* structure = new TType($5, *$2.string); - parseContext.structArrayCheck($2.loc, *structure); - TVariable* userTypeDef = new TVariable($2.string, *structure, true); - if (! parseContext.symbolTable.insert(*userTypeDef)) - parseContext.error($2.loc, "redefinition", $2.string->c_str(), "struct"); - $$.init($1.loc); - $$.basicType = EbtStruct; - $$.userDef = structure; - --parseContext.structNestingLevel; - } - | STRUCT LEFT_BRACE { parseContext.nestedStructCheck($1.loc); } struct_declaration_list RIGHT_BRACE { - TType* structure = new TType($4, TString("")); - $$.init($1.loc); - $$.basicType = EbtStruct; - $$.userDef = structure; - --parseContext.structNestingLevel; - } - ; - -struct_declaration_list - : struct_declaration { - $$ = $1; - } - | struct_declaration_list struct_declaration { - $$ = $1; - for (unsigned int i = 0; i < $2->size(); ++i) { - for (unsigned int j = 0; j < $$->size(); ++j) { - if ((*$$)[j].type->getFieldName() == (*$2)[i].type->getFieldName()) - parseContext.error((*$2)[i].loc, "duplicate member name:", "", (*$2)[i].type->getFieldName().c_str()); - } - $$->push_back((*$2)[i]); - } - } - ; - -struct_declaration - : type_specifier struct_declarator_list SEMICOLON { - if ($1.arraySizes) { - parseContext.profileRequires($1.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); - parseContext.profileRequires($1.loc, EEsProfile, 300, 0, "arrayed type"); - if (parseContext.isEsProfile()) - parseContext.arraySizeRequiredCheck($1.loc, *$1.arraySizes); - } - - $$ = $2; - - parseContext.voidErrorCheck($1.loc, (*$2)[0].type->getFieldName(), $1.basicType); - parseContext.precisionQualifierCheck($1.loc, $1.basicType, $1.qualifier); - - for (unsigned int i = 0; i < $$->size(); ++i) { - TType type($1); - type.setFieldName((*$$)[i].type->getFieldName()); - type.transferArraySizes((*$$)[i].type->getArraySizes()); - type.copyArrayInnerSizes($1.arraySizes); - parseContext.arrayOfArrayVersionCheck((*$$)[i].loc, type.getArraySizes()); - (*$$)[i].type->shallowCopy(type); - } - } - | type_qualifier type_specifier struct_declarator_list SEMICOLON { - if ($2.arraySizes) { - parseContext.profileRequires($2.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); - parseContext.profileRequires($2.loc, EEsProfile, 300, 0, "arrayed type"); - if (parseContext.isEsProfile()) - parseContext.arraySizeRequiredCheck($2.loc, *$2.arraySizes); - } - - $$ = $3; - - parseContext.memberQualifierCheck($1); - parseContext.voidErrorCheck($2.loc, (*$3)[0].type->getFieldName(), $2.basicType); - parseContext.mergeQualifiers($2.loc, $2.qualifier, $1.qualifier, true); - parseContext.precisionQualifierCheck($2.loc, $2.basicType, $2.qualifier); - - for (unsigned int i = 0; i < $$->size(); ++i) { - TType type($2); - type.setFieldName((*$$)[i].type->getFieldName()); - type.transferArraySizes((*$$)[i].type->getArraySizes()); - type.copyArrayInnerSizes($2.arraySizes); - parseContext.arrayOfArrayVersionCheck((*$$)[i].loc, type.getArraySizes()); - (*$$)[i].type->shallowCopy(type); - } - } - ; - -struct_declarator_list - : struct_declarator { - $$ = new TTypeList; - $$->push_back($1); - } - | struct_declarator_list COMMA struct_declarator { - $$->push_back($3); - } - ; - -struct_declarator - : IDENTIFIER { - $$.type = new TType(EbtVoid); - $$.loc = $1.loc; - $$.type->setFieldName(*$1.string); - } - | IDENTIFIER array_specifier { - parseContext.arrayOfArrayVersionCheck($1.loc, $2.arraySizes); - - $$.type = new TType(EbtVoid); - $$.loc = $1.loc; - $$.type->setFieldName(*$1.string); - $$.type->transferArraySizes($2.arraySizes); - } - ; - -initializer - : assignment_expression { - $$ = $1; - } -GLSLANG_WEB_EXCLUDE_ON - | LEFT_BRACE initializer_list RIGHT_BRACE { - const char* initFeature = "{ } style initializers"; - parseContext.requireProfile($1.loc, ~EEsProfile, initFeature); - parseContext.profileRequires($1.loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature); - $$ = $2; - } - | LEFT_BRACE initializer_list COMMA RIGHT_BRACE { - const char* initFeature = "{ } style initializers"; - parseContext.requireProfile($1.loc, ~EEsProfile, initFeature); - parseContext.profileRequires($1.loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature); - $$ = $2; - } - | LEFT_BRACE RIGHT_BRACE { - const char* initFeature = "empty { } initializer"; - parseContext.profileRequires($1.loc, EEsProfile, 0, E_GL_EXT_null_initializer, initFeature); - parseContext.profileRequires($1.loc, ~EEsProfile, 0, E_GL_EXT_null_initializer, initFeature); - $$ = parseContext.intermediate.makeAggregate($1.loc); - } -GLSLANG_WEB_EXCLUDE_OFF - ; - -GLSLANG_WEB_EXCLUDE_ON -initializer_list - : initializer { - $$ = parseContext.intermediate.growAggregate(0, $1, $1->getLoc()); - } - | initializer_list COMMA initializer { - $$ = parseContext.intermediate.growAggregate($1, $3); - } - ; -GLSLANG_WEB_EXCLUDE_OFF - -declaration_statement - : declaration { $$ = $1; } - ; - -statement - : compound_statement { $$ = $1; } - | simple_statement { $$ = $1; } - ; - -// Grammar Note: labeled statements for switch statements only; 'goto' is not supported. - -simple_statement - : declaration_statement { $$ = $1; } - | expression_statement { $$ = $1; } - | selection_statement { $$ = $1; } - | switch_statement { $$ = $1; } - | case_label { $$ = $1; } - | iteration_statement { $$ = $1; } - | jump_statement { $$ = $1; } -GLSLANG_WEB_EXCLUDE_ON - | demote_statement { $$ = $1; } -GLSLANG_WEB_EXCLUDE_OFF - ; - -GLSLANG_WEB_EXCLUDE_ON -demote_statement - : DEMOTE SEMICOLON { - parseContext.requireStage($1.loc, EShLangFragment, "demote"); - parseContext.requireExtensions($1.loc, 1, &E_GL_EXT_demote_to_helper_invocation, "demote"); - $$ = parseContext.intermediate.addBranch(EOpDemote, $1.loc); - } - ; -GLSLANG_WEB_EXCLUDE_OFF - -compound_statement - : LEFT_BRACE RIGHT_BRACE { $$ = 0; } - | LEFT_BRACE { - parseContext.symbolTable.push(); - ++parseContext.statementNestingLevel; - } - statement_list { - parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); - --parseContext.statementNestingLevel; - } - RIGHT_BRACE { - if ($3 && $3->getAsAggregate()) - $3->getAsAggregate()->setOperator(parseContext.intermediate.getDebugInfo() ? EOpScope : EOpSequence); - $$ = $3; - } - ; - -statement_no_new_scope - : compound_statement_no_new_scope { $$ = $1; } - | simple_statement { $$ = $1; } - ; - -statement_scoped - : { - ++parseContext.controlFlowNestingLevel; - } - compound_statement { - --parseContext.controlFlowNestingLevel; - $$ = $2; - } - | { - parseContext.symbolTable.push(); - ++parseContext.statementNestingLevel; - ++parseContext.controlFlowNestingLevel; - } - simple_statement { - parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); - --parseContext.statementNestingLevel; - --parseContext.controlFlowNestingLevel; - $$ = $2; - } - -compound_statement_no_new_scope - // Statement that doesn't create a new scope, for selection_statement, iteration_statement - : LEFT_BRACE RIGHT_BRACE { - $$ = 0; - } - | LEFT_BRACE statement_list RIGHT_BRACE { - if ($2 && $2->getAsAggregate()) - $2->getAsAggregate()->setOperator(EOpSequence); - $$ = $2; - } - ; - -statement_list - : statement { - $$ = parseContext.intermediate.makeAggregate($1); - if ($1 && $1->getAsBranchNode() && ($1->getAsBranchNode()->getFlowOp() == EOpCase || - $1->getAsBranchNode()->getFlowOp() == EOpDefault)) { - parseContext.wrapupSwitchSubsequence(0, $1); - $$ = 0; // start a fresh subsequence for what's after this case - } - } - | statement_list statement { - if ($2 && $2->getAsBranchNode() && ($2->getAsBranchNode()->getFlowOp() == EOpCase || - $2->getAsBranchNode()->getFlowOp() == EOpDefault)) { - parseContext.wrapupSwitchSubsequence($1 ? $1->getAsAggregate() : 0, $2); - $$ = 0; // start a fresh subsequence for what's after this case - } else - $$ = parseContext.intermediate.growAggregate($1, $2); - } - ; - -expression_statement - : SEMICOLON { $$ = 0; } - | expression SEMICOLON { $$ = static_cast($1); } - ; - -selection_statement - : selection_statement_nonattributed { - $$ = $1; - } -GLSLANG_WEB_EXCLUDE_ON - | attribute selection_statement_nonattributed { - parseContext.requireExtensions($2->getLoc(), 1, &E_GL_EXT_control_flow_attributes, "attribute"); - parseContext.handleSelectionAttributes(*$1, $2); - $$ = $2; - } -GLSLANG_WEB_EXCLUDE_OFF - -selection_statement_nonattributed - : IF LEFT_PAREN expression RIGHT_PAREN selection_rest_statement { - parseContext.boolCheck($1.loc, $3); - $$ = parseContext.intermediate.addSelection($3, $5, $1.loc); - } - ; - -selection_rest_statement - : statement_scoped ELSE statement_scoped { - $$.node1 = $1; - $$.node2 = $3; - } - | statement_scoped { - $$.node1 = $1; - $$.node2 = 0; - } - ; - -condition - // In 1996 c++ draft, conditions can include single declarations - : expression { - $$ = $1; - parseContext.boolCheck($1->getLoc(), $1); - } - | fully_specified_type IDENTIFIER EQUAL initializer { - parseContext.boolCheck($2.loc, $1); - - TType type($1); - TIntermNode* initNode = parseContext.declareVariable($2.loc, *$2.string, $1, 0, $4); - if (initNode) - $$ = initNode->getAsTyped(); - else - $$ = 0; - } - ; - -switch_statement - : switch_statement_nonattributed { - $$ = $1; - } -GLSLANG_WEB_EXCLUDE_ON - | attribute switch_statement_nonattributed { - parseContext.requireExtensions($2->getLoc(), 1, &E_GL_EXT_control_flow_attributes, "attribute"); - parseContext.handleSwitchAttributes(*$1, $2); - $$ = $2; - } -GLSLANG_WEB_EXCLUDE_OFF - -switch_statement_nonattributed - : SWITCH LEFT_PAREN expression RIGHT_PAREN { - // start new switch sequence on the switch stack - ++parseContext.controlFlowNestingLevel; - ++parseContext.statementNestingLevel; - parseContext.switchSequenceStack.push_back(new TIntermSequence); - parseContext.switchLevel.push_back(parseContext.statementNestingLevel); - parseContext.symbolTable.push(); - } - LEFT_BRACE switch_statement_list RIGHT_BRACE { - $$ = parseContext.addSwitch($1.loc, $3, $7 ? $7->getAsAggregate() : 0); - delete parseContext.switchSequenceStack.back(); - parseContext.switchSequenceStack.pop_back(); - parseContext.switchLevel.pop_back(); - parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); - --parseContext.statementNestingLevel; - --parseContext.controlFlowNestingLevel; - } - ; - -switch_statement_list - : /* nothing */ { - $$ = 0; - } - | statement_list { - $$ = $1; - } - ; - -case_label - : CASE expression COLON { - $$ = 0; - if (parseContext.switchLevel.size() == 0) - parseContext.error($1.loc, "cannot appear outside switch statement", "case", ""); - else if (parseContext.switchLevel.back() != parseContext.statementNestingLevel) - parseContext.error($1.loc, "cannot be nested inside control flow", "case", ""); - else { - parseContext.constantValueCheck($2, "case"); - parseContext.integerCheck($2, "case"); - $$ = parseContext.intermediate.addBranch(EOpCase, $2, $1.loc); - } - } - | DEFAULT COLON { - $$ = 0; - if (parseContext.switchLevel.size() == 0) - parseContext.error($1.loc, "cannot appear outside switch statement", "default", ""); - else if (parseContext.switchLevel.back() != parseContext.statementNestingLevel) - parseContext.error($1.loc, "cannot be nested inside control flow", "default", ""); - else - $$ = parseContext.intermediate.addBranch(EOpDefault, $1.loc); - } - ; - -iteration_statement - : iteration_statement_nonattributed { - $$ = $1; - } -GLSLANG_WEB_EXCLUDE_ON - | attribute iteration_statement_nonattributed { - parseContext.requireExtensions($2->getLoc(), 1, &E_GL_EXT_control_flow_attributes, "attribute"); - parseContext.handleLoopAttributes(*$1, $2); - $$ = $2; - } -GLSLANG_WEB_EXCLUDE_OFF - -iteration_statement_nonattributed - : WHILE LEFT_PAREN { - if (! parseContext.limits.whileLoops) - parseContext.error($1.loc, "while loops not available", "limitation", ""); - parseContext.symbolTable.push(); - ++parseContext.loopNestingLevel; - ++parseContext.statementNestingLevel; - ++parseContext.controlFlowNestingLevel; - } - condition RIGHT_PAREN statement_no_new_scope { - parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); - $$ = parseContext.intermediate.addLoop($6, $4, 0, true, $1.loc); - --parseContext.loopNestingLevel; - --parseContext.statementNestingLevel; - --parseContext.controlFlowNestingLevel; - } - | DO { - parseContext.symbolTable.push(); - ++parseContext.loopNestingLevel; - ++parseContext.statementNestingLevel; - ++parseContext.controlFlowNestingLevel; - } - statement WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON { - if (! parseContext.limits.whileLoops) - parseContext.error($1.loc, "do-while loops not available", "limitation", ""); - - parseContext.boolCheck($8.loc, $6); - - $$ = parseContext.intermediate.addLoop($3, $6, 0, false, $4.loc); - parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); - --parseContext.loopNestingLevel; - --parseContext.statementNestingLevel; - --parseContext.controlFlowNestingLevel; - } - | FOR LEFT_PAREN { - parseContext.symbolTable.push(); - ++parseContext.loopNestingLevel; - ++parseContext.statementNestingLevel; - ++parseContext.controlFlowNestingLevel; - } - for_init_statement for_rest_statement RIGHT_PAREN statement_no_new_scope { - parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); - $$ = parseContext.intermediate.makeAggregate($4, $2.loc); - TIntermLoop* forLoop = parseContext.intermediate.addLoop($7, reinterpret_cast($5.node1), reinterpret_cast($5.node2), true, $1.loc); - if (! parseContext.limits.nonInductiveForLoops) - parseContext.inductiveLoopCheck($1.loc, $4, forLoop); - $$ = parseContext.intermediate.growAggregate($$, forLoop, $1.loc); - $$->getAsAggregate()->setOperator(EOpSequence); - --parseContext.loopNestingLevel; - --parseContext.statementNestingLevel; - --parseContext.controlFlowNestingLevel; - } - ; - -for_init_statement - : expression_statement { - $$ = $1; - } - | declaration_statement { - $$ = $1; - } - ; - -conditionopt - : condition { - $$ = $1; - } - | /* May be null */ { - $$ = 0; - } - ; - -for_rest_statement - : conditionopt SEMICOLON { - $$.node1 = $1; - $$.node2 = 0; - } - | conditionopt SEMICOLON expression { - $$.node1 = $1; - $$.node2 = $3; - } - ; - -jump_statement - : CONTINUE SEMICOLON { - if (parseContext.loopNestingLevel <= 0) - parseContext.error($1.loc, "continue statement only allowed in loops", "", ""); - $$ = parseContext.intermediate.addBranch(EOpContinue, $1.loc); - } - | BREAK SEMICOLON { - if (parseContext.loopNestingLevel + parseContext.switchSequenceStack.size() <= 0) - parseContext.error($1.loc, "break statement only allowed in switch and loops", "", ""); - $$ = parseContext.intermediate.addBranch(EOpBreak, $1.loc); - } - | RETURN SEMICOLON { - $$ = parseContext.intermediate.addBranch(EOpReturn, $1.loc); - if (parseContext.currentFunctionType->getBasicType() != EbtVoid) - parseContext.error($1.loc, "non-void function must return a value", "return", ""); - if (parseContext.inMain) - parseContext.postEntryPointReturn = true; - } - | RETURN expression SEMICOLON { - $$ = parseContext.handleReturnValue($1.loc, $2); - } - | DISCARD SEMICOLON { - parseContext.requireStage($1.loc, EShLangFragment, "discard"); - $$ = parseContext.intermediate.addBranch(EOpKill, $1.loc); - } - | TERMINATE_INVOCATION SEMICOLON { - parseContext.requireStage($1.loc, EShLangFragment, "terminateInvocation"); - $$ = parseContext.intermediate.addBranch(EOpTerminateInvocation, $1.loc); - } -GLSLANG_WEB_EXCLUDE_ON - | TERMINATE_RAY SEMICOLON { - parseContext.requireStage($1.loc, EShLangAnyHit, "terminateRayEXT"); - $$ = parseContext.intermediate.addBranch(EOpTerminateRayKHR, $1.loc); - } - | IGNORE_INTERSECTION SEMICOLON { - parseContext.requireStage($1.loc, EShLangAnyHit, "ignoreIntersectionEXT"); - $$ = parseContext.intermediate.addBranch(EOpIgnoreIntersectionKHR, $1.loc); - } -GLSLANG_WEB_EXCLUDE_OFF - ; - -// Grammar Note: No 'goto'. Gotos are not supported. - -translation_unit - : external_declaration { - $$ = $1; - parseContext.intermediate.setTreeRoot($$); - } - | translation_unit external_declaration { - if ($2 != nullptr) { - $$ = parseContext.intermediate.growAggregate($1, $2); - parseContext.intermediate.setTreeRoot($$); - } - } - ; - -external_declaration - : function_definition { - $$ = $1; - } - | declaration { - $$ = $1; - } -GLSLANG_WEB_EXCLUDE_ON - | SEMICOLON { - parseContext.requireProfile($1.loc, ~EEsProfile, "extraneous semicolon"); - parseContext.profileRequires($1.loc, ~EEsProfile, 460, nullptr, "extraneous semicolon"); - $$ = nullptr; - } -GLSLANG_WEB_EXCLUDE_OFF - ; - -function_definition - : function_prototype { - $1.function = parseContext.handleFunctionDeclarator($1.loc, *$1.function, false /* not prototype */); - $1.intermNode = parseContext.handleFunctionDefinition($1.loc, *$1.function); - - // For ES 100 only, according to ES shading language 100 spec: A function - // body has a scope nested inside the function's definition. - if (parseContext.profile == EEsProfile && parseContext.version == 100) - { - parseContext.symbolTable.push(); - ++parseContext.statementNestingLevel; - } - } - compound_statement_no_new_scope { - // May be best done as post process phase on intermediate code - if (parseContext.currentFunctionType->getBasicType() != EbtVoid && ! parseContext.functionReturnsValue) - parseContext.error($1.loc, "function does not return a value:", "", $1.function->getName().c_str()); - parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); - $$ = parseContext.intermediate.growAggregate($1.intermNode, $3); - parseContext.intermediate.setAggregateOperator($$, EOpFunction, $1.function->getType(), $1.loc); - $$->getAsAggregate()->setName($1.function->getMangledName().c_str()); - - // store the pragma information for debug and optimize and other vendor specific - // information. This information can be queried from the parse tree - $$->getAsAggregate()->setOptimize(parseContext.contextPragma.optimize); - $$->getAsAggregate()->setDebug(parseContext.contextPragma.debug); - $$->getAsAggregate()->setPragmaTable(parseContext.contextPragma.pragmaTable); - - // Set currentFunctionType to empty pointer when goes outside of the function - parseContext.currentFunctionType = nullptr; - - // For ES 100 only, according to ES shading language 100 spec: A function - // body has a scope nested inside the function's definition. - if (parseContext.profile == EEsProfile && parseContext.version == 100) - { - parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); - --parseContext.statementNestingLevel; - } - } - ; - -GLSLANG_WEB_EXCLUDE_ON -attribute - : LEFT_BRACKET LEFT_BRACKET attribute_list RIGHT_BRACKET RIGHT_BRACKET { - $$ = $3; - } - -attribute_list - : single_attribute { - $$ = $1; - } - | attribute_list COMMA single_attribute { - $$ = parseContext.mergeAttributes($1, $3); - } - -single_attribute - : IDENTIFIER { - $$ = parseContext.makeAttributes(*$1.string); - } - | IDENTIFIER LEFT_PAREN constant_expression RIGHT_PAREN { - $$ = parseContext.makeAttributes(*$1.string, $3); - } -GLSLANG_WEB_EXCLUDE_OFF - -GLSLANG_WEB_EXCLUDE_ON -spirv_requirements_list - : spirv_requirements_parameter { - $$ = $1; - } - | spirv_requirements_list COMMA spirv_requirements_parameter { - $$ = parseContext.mergeSpirvRequirements($2.loc, $1, $3); - } - -spirv_requirements_parameter - : IDENTIFIER EQUAL LEFT_BRACKET spirv_extension_list RIGHT_BRACKET { - $$ = parseContext.makeSpirvRequirement($2.loc, *$1.string, $4->getAsAggregate(), nullptr); - } - | IDENTIFIER EQUAL LEFT_BRACKET spirv_capability_list RIGHT_BRACKET { - $$ = parseContext.makeSpirvRequirement($2.loc, *$1.string, nullptr, $4->getAsAggregate()); - } - -spirv_extension_list - : STRING_LITERAL { - $$ = parseContext.intermediate.makeAggregate(parseContext.intermediate.addConstantUnion($1.string, $1.loc, true)); - } - | spirv_extension_list COMMA STRING_LITERAL { - $$ = parseContext.intermediate.growAggregate($1, parseContext.intermediate.addConstantUnion($3.string, $3.loc, true)); - } - -spirv_capability_list - : INTCONSTANT { - $$ = parseContext.intermediate.makeAggregate(parseContext.intermediate.addConstantUnion($1.i, $1.loc, true)); - } - | spirv_capability_list COMMA INTCONSTANT { - $$ = parseContext.intermediate.growAggregate($1, parseContext.intermediate.addConstantUnion($3.i, $3.loc, true)); - } - -spirv_execution_mode_qualifier - : SPIRV_EXECUTION_MODE LEFT_PAREN INTCONSTANT RIGHT_PAREN { - parseContext.intermediate.insertSpirvExecutionMode($3.i); - $$ = 0; - } - | SPIRV_EXECUTION_MODE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT RIGHT_PAREN { - parseContext.intermediate.insertSpirvRequirement($3); - parseContext.intermediate.insertSpirvExecutionMode($5.i); - $$ = 0; - } - | SPIRV_EXECUTION_MODE LEFT_PAREN INTCONSTANT COMMA spirv_execution_mode_parameter_list RIGHT_PAREN { - parseContext.intermediate.insertSpirvExecutionMode($3.i, $5->getAsAggregate()); - $$ = 0; - } - | SPIRV_EXECUTION_MODE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_execution_mode_parameter_list RIGHT_PAREN { - parseContext.intermediate.insertSpirvRequirement($3); - parseContext.intermediate.insertSpirvExecutionMode($5.i, $7->getAsAggregate()); - $$ = 0; - } - | SPIRV_EXECUTION_MODE_ID LEFT_PAREN INTCONSTANT COMMA spirv_execution_mode_id_parameter_list RIGHT_PAREN { - parseContext.intermediate.insertSpirvExecutionModeId($3.i, $5->getAsAggregate()); - $$ = 0; - } - | SPIRV_EXECUTION_MODE_ID LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_execution_mode_id_parameter_list RIGHT_PAREN { - parseContext.intermediate.insertSpirvRequirement($3); - parseContext.intermediate.insertSpirvExecutionModeId($5.i, $7->getAsAggregate()); - $$ = 0; - } - -spirv_execution_mode_parameter_list - : spirv_execution_mode_parameter { - $$ = parseContext.intermediate.makeAggregate($1); - } - | spirv_execution_mode_parameter_list COMMA spirv_execution_mode_parameter { - $$ = parseContext.intermediate.growAggregate($1, $3); - } - -spirv_execution_mode_parameter - : FLOATCONSTANT { - $$ = parseContext.intermediate.addConstantUnion($1.d, EbtFloat, $1.loc, true); - } - | INTCONSTANT { - $$ = parseContext.intermediate.addConstantUnion($1.i, $1.loc, true); - } - | UINTCONSTANT { - $$ = parseContext.intermediate.addConstantUnion($1.u, $1.loc, true); - } - | BOOLCONSTANT { - $$ = parseContext.intermediate.addConstantUnion($1.b, $1.loc, true); - } - | STRING_LITERAL { - $$ = parseContext.intermediate.addConstantUnion($1.string, $1.loc, true); - } - -spirv_execution_mode_id_parameter_list - : constant_expression { - if ($1->getBasicType() != EbtFloat && - $1->getBasicType() != EbtInt && - $1->getBasicType() != EbtUint && - $1->getBasicType() != EbtBool && - $1->getBasicType() != EbtString) - parseContext.error($1->getLoc(), "this type not allowed", $1->getType().getBasicString(), ""); - $$ = parseContext.intermediate.makeAggregate($1); - } - | spirv_execution_mode_id_parameter_list COMMA constant_expression { - if ($3->getBasicType() != EbtFloat && - $3->getBasicType() != EbtInt && - $3->getBasicType() != EbtUint && - $3->getBasicType() != EbtBool && - $3->getBasicType() != EbtString) - parseContext.error($3->getLoc(), "this type not allowed", $3->getType().getBasicString(), ""); - $$ = parseContext.intermediate.growAggregate($1, $3); - } - -spirv_storage_class_qualifier - : SPIRV_STORAGE_CLASS LEFT_PAREN INTCONSTANT RIGHT_PAREN { - $$.init($1.loc); - $$.qualifier.storage = EvqSpirvStorageClass; - $$.qualifier.spirvStorageClass = $3.i; - } - | SPIRV_STORAGE_CLASS LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT RIGHT_PAREN { - $$.init($1.loc); - parseContext.intermediate.insertSpirvRequirement($3); - $$.qualifier.storage = EvqSpirvStorageClass; - $$.qualifier.spirvStorageClass = $5.i; - } - -spirv_decorate_qualifier - : SPIRV_DECORATE LEFT_PAREN INTCONSTANT RIGHT_PAREN{ - $$.init($1.loc); - $$.qualifier.setSpirvDecorate($3.i); - } - | SPIRV_DECORATE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT RIGHT_PAREN{ - $$.init($1.loc); - parseContext.intermediate.insertSpirvRequirement($3); - $$.qualifier.setSpirvDecorate($5.i); - } - | SPIRV_DECORATE LEFT_PAREN INTCONSTANT COMMA spirv_decorate_parameter_list RIGHT_PAREN { - $$.init($1.loc); - $$.qualifier.setSpirvDecorate($3.i, $5->getAsAggregate()); - } - | SPIRV_DECORATE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_decorate_parameter_list RIGHT_PAREN { - $$.init($1.loc); - parseContext.intermediate.insertSpirvRequirement($3); - $$.qualifier.setSpirvDecorate($5.i, $7->getAsAggregate()); - } - | SPIRV_DECORATE_ID LEFT_PAREN INTCONSTANT COMMA spirv_decorate_id_parameter_list RIGHT_PAREN { - $$.init($1.loc); - $$.qualifier.setSpirvDecorateId($3.i, $5->getAsAggregate()); - } - | SPIRV_DECORATE_ID LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_decorate_id_parameter_list RIGHT_PAREN { - $$.init($1.loc); - parseContext.intermediate.insertSpirvRequirement($3); - $$.qualifier.setSpirvDecorateId($5.i, $7->getAsAggregate()); - } - | SPIRV_DECORATE_STRING LEFT_PAREN INTCONSTANT COMMA spirv_decorate_string_parameter_list RIGHT_PAREN { - $$.init($1.loc); - $$.qualifier.setSpirvDecorateString($3.i, $5->getAsAggregate()); - } - | SPIRV_DECORATE_STRING LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_decorate_string_parameter_list RIGHT_PAREN { - $$.init($1.loc); - parseContext.intermediate.insertSpirvRequirement($3); - $$.qualifier.setSpirvDecorateString($5.i, $7->getAsAggregate()); - } - -spirv_decorate_parameter_list - : spirv_decorate_parameter { - $$ = parseContext.intermediate.makeAggregate($1); - } - | spirv_decorate_parameter_list COMMA spirv_decorate_parameter { - $$ = parseContext.intermediate.growAggregate($1, $3); - } - -spirv_decorate_parameter - : FLOATCONSTANT { - $$ = parseContext.intermediate.addConstantUnion($1.d, EbtFloat, $1.loc, true); - } - | INTCONSTANT { - $$ = parseContext.intermediate.addConstantUnion($1.i, $1.loc, true); - } - | UINTCONSTANT { - $$ = parseContext.intermediate.addConstantUnion($1.u, $1.loc, true); - } - | BOOLCONSTANT { - $$ = parseContext.intermediate.addConstantUnion($1.b, $1.loc, true); - } - -spirv_decorate_id_parameter_list - : constant_expression { - if ($1->getBasicType() != EbtFloat && - $1->getBasicType() != EbtInt && - $1->getBasicType() != EbtUint && - $1->getBasicType() != EbtBool) - parseContext.error($1->getLoc(), "this type not allowed", $1->getType().getBasicString(), ""); - $$ = parseContext.intermediate.makeAggregate($1); - } - | spirv_decorate_id_parameter_list COMMA constant_expression { - if ($3->getBasicType() != EbtFloat && - $3->getBasicType() != EbtInt && - $3->getBasicType() != EbtUint && - $3->getBasicType() != EbtBool) - parseContext.error($3->getLoc(), "this type not allowed", $3->getType().getBasicString(), ""); - $$ = parseContext.intermediate.growAggregate($1, $3); - } - -spirv_decorate_string_parameter_list - : STRING_LITERAL { - $$ = parseContext.intermediate.makeAggregate( - parseContext.intermediate.addConstantUnion($1.string, $1.loc, true)); - } - | spirv_decorate_string_parameter_list COMMA STRING_LITERAL { - $$ = parseContext.intermediate.growAggregate($1, parseContext.intermediate.addConstantUnion($3.string, $3.loc, true)); - } - -spirv_type_specifier - : SPIRV_TYPE LEFT_PAREN spirv_instruction_qualifier_list COMMA spirv_type_parameter_list RIGHT_PAREN { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.setSpirvType(*$3, $5); - } - | SPIRV_TYPE LEFT_PAREN spirv_requirements_list COMMA spirv_instruction_qualifier_list COMMA spirv_type_parameter_list RIGHT_PAREN { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - parseContext.intermediate.insertSpirvRequirement($3); - $$.setSpirvType(*$5, $7); - } - | SPIRV_TYPE LEFT_PAREN spirv_instruction_qualifier_list RIGHT_PAREN { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - $$.setSpirvType(*$3); - } - | SPIRV_TYPE LEFT_PAREN spirv_requirements_list COMMA spirv_instruction_qualifier_list RIGHT_PAREN { - $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); - parseContext.intermediate.insertSpirvRequirement($3); - $$.setSpirvType(*$5); - } - -spirv_type_parameter_list - : spirv_type_parameter { - $$ = $1; - } - | spirv_type_parameter_list COMMA spirv_type_parameter { - $$ = parseContext.mergeSpirvTypeParameters($1, $3); - } - -spirv_type_parameter - : constant_expression { - $$ = parseContext.makeSpirvTypeParameters($1->getLoc(), $1->getAsConstantUnion()); - } - -spirv_instruction_qualifier - : SPIRV_INSTRUCTION LEFT_PAREN spirv_instruction_qualifier_list RIGHT_PAREN { - $$ = $3; - } - | SPIRV_INSTRUCTION LEFT_PAREN spirv_requirements_list COMMA spirv_instruction_qualifier_list RIGHT_PAREN { - parseContext.intermediate.insertSpirvRequirement($3); - $$ = $5; - } - -spirv_instruction_qualifier_list - : spirv_instruction_qualifier_id { - $$ = $1; - } - | spirv_instruction_qualifier_list COMMA spirv_instruction_qualifier_id { - $$ = parseContext.mergeSpirvInstruction($2.loc, $1, $3); - } - -spirv_instruction_qualifier_id - : IDENTIFIER EQUAL STRING_LITERAL { - $$ = parseContext.makeSpirvInstruction($2.loc, *$1.string, *$3.string); - } - | IDENTIFIER EQUAL INTCONSTANT { - $$ = parseContext.makeSpirvInstruction($2.loc, *$1.string, $3.i); - } -GLSLANG_WEB_EXCLUDE_OFF - -%% diff --git a/third_party/glslang/glslang/MachineIndependent/glslang.y b/third_party/glslang/glslang/MachineIndependent/glslang.y index 35242f21578..99f0d388bc7 100644 --- a/third_party/glslang/glslang/MachineIndependent/glslang.y +++ b/third_party/glslang/glslang/MachineIndependent/glslang.y @@ -37,31 +37,6 @@ // POSSIBILITY OF SUCH DAMAGE. // -// -// Do not edit the .y file, only edit the .m4 file. -// The .y bison file is not a source file, it is a derivative of the .m4 file. -// The m4 file needs to be processed by m4 to generate the .y bison file. -// -// Code sandwiched between a pair: -// -// GLSLANG_WEB_EXCLUDE_ON -// ... -// ... -// ... -// GLSLANG_WEB_EXCLUDE_OFF -// -// Will be excluded from the grammar when m4 is executed as: -// -// m4 -P -DGLSLANG_WEB -// -// It will be included when m4 is executed as: -// -// m4 -P -// - - - - /** * This is bison grammar and productions for parsing all versions of the * GLSL shading languages. @@ -129,7 +104,7 @@ using namespace glslang; glslang::TArraySizes* arraySizes; glslang::TIdentifierList* identifierList; }; - glslang::TArraySizes* typeParameters; + glslang::TTypeParameters* typeParameters; } interm; } @@ -151,7 +126,7 @@ extern int yylex(YYSTYPE*, TParseContext&); %parse-param {glslang::TParseContext* pParseContext} %lex-param {parseContext} -%define api.pure // enable thread safety +%pure-parser // enable thread safety %expect 1 // One shift reduce conflict because of if | else %token CONST BOOL INT UINT FLOAT @@ -177,8 +152,6 @@ extern int yylex(YYSTYPE*, TParseContext&); %token ITEXTURE2D ITEXTURE3D ITEXTURECUBE ITEXTURE2DARRAY %token UTEXTURE2D UTEXTURE3D UTEXTURECUBE UTEXTURE2DARRAY - - %token ATTRIBUTE VARYING %token FLOAT16_T FLOAT32_T DOUBLE FLOAT64_T %token INT64_T UINT64_T INT32_T UINT32_T INT16_T UINT16_T INT8_T UINT8_T @@ -211,6 +184,8 @@ extern int yylex(YYSTYPE*, TParseContext&); %token ACCSTRUCTEXT %token RAYQUERYEXT %token FCOOPMATNV ICOOPMATNV UCOOPMATNV +%token COOPMAT +%token HITOBJECTNV HITOBJECTATTRNV // combined image/sampler %token SAMPLERCUBEARRAY SAMPLERCUBEARRAYSHADOW @@ -278,8 +253,7 @@ extern int yylex(YYSTYPE*, TParseContext&); %token SPIRV_INSTRUCTION SPIRV_EXECUTION_MODE SPIRV_EXECUTION_MODE_ID %token SPIRV_DECORATE SPIRV_DECORATE_ID SPIRV_DECORATE_STRING %token SPIRV_TYPE SPIRV_STORAGE_CLASS SPIRV_BY_REFERENCE SPIRV_LITERAL - - +%token ATTACHMENTEXT IATTACHMENTEXT UATTACHMENTEXT %token LEFT_OP RIGHT_OP %token INC_OP DEC_OP LE_OP GE_OP EQ_OP NE_OP @@ -303,14 +277,13 @@ extern int yylex(YYSTYPE*, TParseContext&); %token BREAK CONTINUE DO ELSE FOR IF DISCARD RETURN SWITCH CASE DEFAULT %token TERMINATE_INVOCATION %token TERMINATE_RAY IGNORE_INTERSECTION -%token UNIFORM SHARED BUFFER +%token UNIFORM SHARED BUFFER TILEIMAGEEXT %token FLAT SMOOTH LAYOUT - %token DOUBLECONSTANT INT16CONSTANT UINT16CONSTANT FLOAT16CONSTANT INT32CONSTANT UINT32CONSTANT %token INT64CONSTANT UINT64CONSTANT %token SUBROUTINE DEMOTE -%token PAYLOADNV PAYLOADINNV HITATTRNV CALLDATANV CALLDATAINNV +%token PAYLOADNV PAYLOADINNV HITATTRNV CALLDATANV CALLDATAINNV %token PAYLOADEXT PAYLOADINEXT HITATTREXT CALLDATAEXT CALLDATAINEXT %token PATCH SAMPLE NONUNIFORM %token COHERENT VOLATILE RESTRICT READONLY WRITEONLY DEVICECOHERENT QUEUEFAMILYCOHERENT WORKGROUPCOHERENT @@ -318,7 +291,6 @@ extern int yylex(YYSTYPE*, TParseContext&); %token NOPERSPECTIVE EXPLICITINTERPAMD PERVERTEXEXT PERVERTEXNV PERPRIMITIVENV PERVIEWNV PERTASKNV PERPRIMITIVEEXT TASKPAYLOADWORKGROUPEXT %token PRECISE - %type assignment_operator unary_operator %type variable_identifier primary_expression postfix_expression %type expression integer_expression assignment_expression @@ -364,7 +336,6 @@ extern int yylex(YYSTYPE*, TParseContext&); %type identifier_list - %type precise_qualifier non_uniform_qualifier %type type_name_list %type attribute attribute_list single_attribute @@ -377,14 +348,13 @@ extern int yylex(YYSTYPE*, TParseContext&); %type spirv_storage_class_qualifier %type spirv_decorate_qualifier %type spirv_decorate_parameter_list spirv_decorate_parameter -%type spirv_decorate_id_parameter_list +%type spirv_decorate_id_parameter_list spirv_decorate_id_parameter %type spirv_decorate_string_parameter_list %type spirv_type_specifier %type spirv_type_parameter_list spirv_type_parameter %type spirv_instruction_qualifier %type spirv_instruction_qualifier_list spirv_instruction_qualifier_id - %start translation_unit %% @@ -416,7 +386,6 @@ primary_expression | BOOLCONSTANT { $$ = parseContext.intermediate.addConstantUnion($1.b, $1.loc, true); } - | STRING_LITERAL { $$ = parseContext.intermediate.addConstantUnion($1.string, $1.loc, true); } @@ -454,7 +423,6 @@ primary_expression parseContext.float16Check($1.loc, "half float literal"); $$ = parseContext.intermediate.addConstantUnion($1.d, EbtFloat16, $1.loc, true); } - ; postfix_expression @@ -580,13 +548,11 @@ function_identifier $$.function = new TFunction(empty, TType(EbtVoid), EOpNull); } } - | non_uniform_qualifier { // Constructor $$.intermNode = 0; $$.function = parseContext.handleConstructorCall($1.loc, $1); } - ; unary_expression @@ -896,7 +862,6 @@ declaration $$ = 0; // TODO: 4.0 functionality: subroutines: make the identifier a user type for this signature } - | spirv_instruction_qualifier function_prototype SEMICOLON { parseContext.requireExtensions($2.loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V instruction qualifier"); $2.function->setSpirvInstruction(*$1); // Attach SPIR-V intruction qualifier @@ -909,7 +874,6 @@ declaration parseContext.requireExtensions($2.loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V execution mode qualifier"); $$ = 0; } - | init_declarator_list SEMICOLON { if ($1.intermNode && $1.intermNode->getAsAggregate()) $1.intermNode->getAsAggregate()->setOperator(EOpSequence); @@ -977,24 +941,25 @@ identifier_list function_prototype : function_declarator RIGHT_PAREN { $$.function = $1; + if (parseContext.compileOnly) $$.function->setExport(); $$.loc = $2.loc; } | function_declarator RIGHT_PAREN attribute { $$.function = $1; + if (parseContext.compileOnly) $$.function->setExport(); $$.loc = $2.loc; - parseContext.requireExtensions($2.loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute"); parseContext.handleFunctionAttributes($2.loc, *$3); } | attribute function_declarator RIGHT_PAREN { $$.function = $2; + if (parseContext.compileOnly) $$.function->setExport(); $$.loc = $3.loc; - parseContext.requireExtensions($3.loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute"); parseContext.handleFunctionAttributes($3.loc, *$1); } | attribute function_declarator RIGHT_PAREN attribute { $$.function = $2; + if (parseContext.compileOnly) $$.function->setExport(); $$.loc = $3.loc; - parseContext.requireExtensions($3.loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute"); parseContext.handleFunctionAttributes($3.loc, *$1); parseContext.handleFunctionAttributes($3.loc, *$4); } @@ -1106,7 +1071,7 @@ parameter_declaration $$ = $2; if ($1.qualifier.precision != EpqNone) $$.param.type->getQualifier().precision = $1.qualifier.precision; - parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier()); + parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier(), $$.param.type->isCoopMat()); parseContext.checkNoShaderLayouts($1.loc, $1.shaderQualifiers); parseContext.parameterTypeCheck($2.loc, $1.qualifier.storage, *$$.param.type); @@ -1118,7 +1083,7 @@ parameter_declaration parseContext.parameterTypeCheck($1.loc, EvqIn, *$1.param.type); parseContext.paramCheckFixStorage($1.loc, EvqTemporary, *$$.param.type); - parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier()); + parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier(), $$.param.type->isCoopMat()); } // // Without name @@ -1127,7 +1092,7 @@ parameter_declaration $$ = $2; if ($1.qualifier.precision != EpqNone) $$.param.type->getQualifier().precision = $1.qualifier.precision; - parseContext.precisionQualifierCheck($1.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier()); + parseContext.precisionQualifierCheck($1.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier(), $$.param.type->isCoopMat()); parseContext.checkNoShaderLayouts($1.loc, $1.shaderQualifiers); parseContext.parameterTypeCheck($2.loc, $1.qualifier.storage, *$$.param.type); @@ -1138,7 +1103,7 @@ parameter_declaration parseContext.parameterTypeCheck($1.loc, EvqIn, *$1.param.type); parseContext.paramCheckFixStorage($1.loc, EvqTemporary, *$$.param.type); - parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier()); + parseContext.precisionQualifierCheck($$.loc, $$.param.type->getBasicType(), $$.param.type->getQualifier(), $$.param.type->isCoopMat()); } ; @@ -1179,9 +1144,7 @@ single_declaration : fully_specified_type { $$.type = $1; $$.intermNode = 0; - parseContext.declareTypeDefaults($$.loc, $$.type); - } | fully_specified_type IDENTIFIER { $$.type = $1; @@ -1215,10 +1178,10 @@ fully_specified_type parseContext.profileRequires($1.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); parseContext.profileRequires($1.loc, EEsProfile, 300, 0, "arrayed type"); } - parseContext.precisionQualifierCheck($$.loc, $$.basicType, $$.qualifier); + parseContext.precisionQualifierCheck($$.loc, $$.basicType, $$.qualifier, $$.isCoopmat()); } | type_qualifier type_specifier { - parseContext.globalQualifierFixCheck($1.loc, $1.qualifier); + parseContext.globalQualifierFixCheck($1.loc, $1.qualifier, false, &$2); parseContext.globalQualifierTypeCheck($1.loc, $1.qualifier, $2); if ($2.arraySizes) { @@ -1232,7 +1195,7 @@ fully_specified_type parseContext.checkNoShaderLayouts($2.loc, $1.shaderQualifiers); $2.shaderQualifiers.merge($1.shaderQualifiers); parseContext.mergeQualifiers($2.loc, $2.qualifier, $1.qualifier, true); - parseContext.precisionQualifierCheck($2.loc, $2.basicType, $2.qualifier); + parseContext.precisionQualifierCheck($2.loc, $2.basicType, $2.qualifier, $2.isCoopmat()); $$ = $2; @@ -1267,7 +1230,6 @@ interpolation_qualifier $$.init($1.loc); $$.qualifier.flat = true; } - | NOPERSPECTIVE { parseContext.globalCheck($1.loc, "noperspective"); parseContext.profileRequires($1.loc, EEsProfile, 0, E_GL_NV_shader_noperspective_interpolation, "noperspective"); @@ -1332,7 +1294,6 @@ interpolation_qualifier $$.init($1.loc); $$.qualifier.perTaskNV = true; } - ; layout_qualifier @@ -1367,7 +1328,6 @@ layout_qualifier_id } ; - precise_qualifier : PRECISE { parseContext.profileRequires($$.loc, ECoreProfile | ECompatibilityProfile, 400, E_GL_ARB_gpu_shader5, "precise"); @@ -1377,7 +1337,6 @@ precise_qualifier } ; - type_qualifier : single_type_qualifier { $$ = $1; @@ -1411,7 +1370,6 @@ single_type_qualifier // allow inheritance of storage qualifier from block declaration $$ = $1; } - | precise_qualifier { // allow inheritance of storage qualifier from block declaration $$ = $1; @@ -1438,7 +1396,6 @@ single_type_qualifier $$.init($1.loc); $$.qualifier.setSpirvLiteral(); } - ; storage_qualifier @@ -1475,6 +1432,11 @@ storage_qualifier $$.init($1.loc); $$.qualifier.storage = EvqUniform; } + | TILEIMAGEEXT { + parseContext.globalCheck($1.loc, "tileImageEXT"); + $$.init($1.loc); + $$.qualifier.storage = EvqTileImageEXT; + } | SHARED { parseContext.globalCheck($1.loc, "shared"); parseContext.profileRequires($1.loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_compute_shader, "shared"); @@ -1488,7 +1450,6 @@ storage_qualifier $$.init($1.loc); $$.qualifier.storage = EvqBuffer; } - | ATTRIBUTE { parseContext.requireStage($1.loc, EShLangVertex, "attribute"); parseContext.checkDeprecated($1.loc, ECoreProfile, 130, "attribute"); @@ -1534,6 +1495,14 @@ storage_qualifier $$.init($1.loc); $$.qualifier.storage = EvqHitAttr; } + | HITOBJECTATTRNV { + parseContext.globalCheck($1.loc, "hitAttributeNV"); + parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask + | EShLangMissMask), "hitObjectAttributeNV"); + parseContext.profileRequires($1.loc, ECoreProfile, 460, E_GL_NV_shader_invocation_reorder, "hitObjectAttributeNV"); + $$.init($1.loc); + $$.qualifier.storage = EvqHitObjectAttrNV; + } | HITATTREXT { parseContext.globalCheck($1.loc, "hitAttributeEXT"); parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangIntersectMask | EShLangClosestHitMask @@ -1673,10 +1642,8 @@ storage_qualifier $$.init($1.loc); $$.qualifier.storage = EvqtaskPayloadSharedEXT; } - ; - non_uniform_qualifier : NONUNIFORM { $$.init($1.loc); @@ -1695,12 +1662,13 @@ type_name_list } ; - type_specifier : type_specifier_nonarray type_parameter_specifier_opt { $$ = $1; $$.qualifier.precision = parseContext.getDefaultPrecision($$); $$.typeParameters = $2; + parseContext.coopMatTypeParametersCheck($1.loc, $$); + } | type_specifier_nonarray type_parameter_specifier_opt array_specifier { parseContext.arrayOfArrayVersionCheck($3.loc, $3.arraySizes); @@ -1708,6 +1676,7 @@ type_specifier $$.qualifier.precision = parseContext.getDefaultPrecision($$); $$.typeParameters = $2; $$.arraySizes = $3.arraySizes; + parseContext.coopMatTypeParametersCheck($1.loc, $$); } ; @@ -1754,19 +1723,25 @@ type_parameter_specifier ; type_parameter_specifier_list - : unary_expression { - $$ = new TArraySizes; + : type_specifier { + $$ = new TTypeParameters; + $$->arraySizes = new TArraySizes; + $$->basicType = $1.basicType; + } + | unary_expression { + $$ = new TTypeParameters; + $$->arraySizes = new TArraySizes; TArraySize size; - parseContext.arraySizeCheck($1->getLoc(), $1, size, "type parameter"); - $$->addInnerSize(size); + parseContext.arraySizeCheck($1->getLoc(), $1, size, "type parameter", true); + $$->arraySizes->addInnerSize(size); } | type_parameter_specifier_list COMMA unary_expression { $$ = $1; TArraySize size; - parseContext.arraySizeCheck($3->getLoc(), $3, size, "type parameter"); - $$->addInnerSize(size); + parseContext.arraySizeCheck($3->getLoc(), $3, size, "type parameter", true); + $$->arraySizes->addInnerSize(size); } ; @@ -1915,7 +1890,6 @@ type_specifier_nonarray $$.basicType = EbtFloat; $$.setMatrix(4, 4); } - | DOUBLE { parseContext.requireProfile($1.loc, ECoreProfile | ECompatibilityProfile, "double"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -2534,7 +2508,6 @@ type_specifier_nonarray $$.basicType = EbtSampler; $$.sampler.set(EbtFloat, Esd1D); } - | SAMPLER2D { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2570,7 +2543,6 @@ type_specifier_nonarray $$.basicType = EbtSampler; $$.sampler.set(EbtFloat, Esd2D, true, true); } - | SAMPLER1DSHADOW { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2679,7 +2651,6 @@ type_specifier_nonarray $$.basicType = EbtSampler; $$.sampler.set(EbtInt, Esd1D); } - | ISAMPLER2D { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2715,7 +2686,6 @@ type_specifier_nonarray $$.basicType = EbtSampler; $$.sampler.set(EbtUint, EsdCube); } - | ISAMPLER1DARRAY { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2756,7 +2726,6 @@ type_specifier_nonarray $$.basicType = EbtSampler; $$.sampler.setTexture(EbtUint, EsdCube, true); } - | USAMPLER2DARRAY { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -2832,7 +2801,6 @@ type_specifier_nonarray $$.basicType = EbtSampler; $$.sampler.setPureSampler(true); } - | SAMPLER2DRECT { $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtSampler; @@ -3437,6 +3405,24 @@ type_specifier_nonarray $$.sampler.set(EbtFloat, Esd2D); $$.sampler.yuv = true; } + | ATTACHMENTEXT { + parseContext.requireStage($1.loc, EShLangFragment, "attachmentEXT input"); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setAttachmentEXT(EbtFloat); + } + | IATTACHMENTEXT { + parseContext.requireStage($1.loc, EShLangFragment, "attachmentEXT input"); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setAttachmentEXT(EbtInt); + } + | UATTACHMENTEXT { + parseContext.requireStage($1.loc, EShLangFragment, "attachmentEXT input"); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtSampler; + $$.sampler.setAttachmentEXT(EbtUint); + } | SUBPASSINPUT { parseContext.requireStage($1.loc, EShLangFragment, "subpass input"); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); @@ -3488,28 +3474,41 @@ type_specifier_nonarray $$.sampler.setSubpass(EbtUint, true); } | FCOOPMATNV { - parseContext.fcoopmatCheck($1.loc, "fcoopmatNV", parseContext.symbolTable.atBuiltInLevel()); + parseContext.fcoopmatCheckNV($1.loc, "fcoopmatNV", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtFloat; - $$.coopmat = true; + $$.coopmatNV = true; + $$.coopmatKHR = false; } | ICOOPMATNV { - parseContext.intcoopmatCheck($1.loc, "icoopmatNV", parseContext.symbolTable.atBuiltInLevel()); + parseContext.intcoopmatCheckNV($1.loc, "icoopmatNV", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtInt; - $$.coopmat = true; + $$.coopmatNV = true; + $$.coopmatKHR = false; } | UCOOPMATNV { - parseContext.intcoopmatCheck($1.loc, "ucoopmatNV", parseContext.symbolTable.atBuiltInLevel()); + parseContext.intcoopmatCheckNV($1.loc, "ucoopmatNV", parseContext.symbolTable.atBuiltInLevel()); $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); $$.basicType = EbtUint; - $$.coopmat = true; + $$.coopmatNV = true; + $$.coopmatKHR = false; + } + | COOPMAT { + parseContext.coopmatCheck($1.loc, "coopmat", parseContext.symbolTable.atBuiltInLevel()); + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtCoopmat; + $$.coopmatNV = false; + $$.coopmatKHR = true; } | spirv_type_specifier { parseContext.requireExtensions($1.loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V type specifier"); $$ = $1; } - + | HITOBJECTNV { + $$.init($1.loc, parseContext.symbolTable.atGlobalLevel()); + $$.basicType = EbtHitObjectNV; + } | struct_specifier { $$ = $1; $$.qualifier.storage = parseContext.symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary; @@ -3597,7 +3596,7 @@ struct_declaration $$ = $2; parseContext.voidErrorCheck($1.loc, (*$2)[0].type->getFieldName(), $1.basicType); - parseContext.precisionQualifierCheck($1.loc, $1.basicType, $1.qualifier); + parseContext.precisionQualifierCheck($1.loc, $1.basicType, $1.qualifier, $1.isCoopmat()); for (unsigned int i = 0; i < $$->size(); ++i) { TType type($1); @@ -3621,7 +3620,7 @@ struct_declaration parseContext.memberQualifierCheck($1); parseContext.voidErrorCheck($2.loc, (*$3)[0].type->getFieldName(), $2.basicType); parseContext.mergeQualifiers($2.loc, $2.qualifier, $1.qualifier, true); - parseContext.precisionQualifierCheck($2.loc, $2.basicType, $2.qualifier); + parseContext.precisionQualifierCheck($2.loc, $2.basicType, $2.qualifier, $2.isCoopmat()); for (unsigned int i = 0; i < $$->size(); ++i) { TType type($2); @@ -3664,7 +3663,6 @@ initializer : assignment_expression { $$ = $1; } - | LEFT_BRACE initializer_list RIGHT_BRACE { const char* initFeature = "{ } style initializers"; parseContext.requireProfile($1.loc, ~EEsProfile, initFeature); @@ -3683,10 +3681,8 @@ initializer parseContext.profileRequires($1.loc, ~EEsProfile, 0, E_GL_EXT_null_initializer, initFeature); $$ = parseContext.intermediate.makeAggregate($1.loc); } - ; - initializer_list : initializer { $$ = parseContext.intermediate.growAggregate(0, $1, $1->getLoc()); @@ -3696,7 +3692,6 @@ initializer_list } ; - declaration_statement : declaration { $$ = $1; } ; @@ -3716,12 +3711,9 @@ simple_statement | case_label { $$ = $1; } | iteration_statement { $$ = $1; } | jump_statement { $$ = $1; } - | demote_statement { $$ = $1; } - ; - demote_statement : DEMOTE SEMICOLON { parseContext.requireStage($1.loc, EShLangFragment, "demote"); @@ -3730,7 +3722,6 @@ demote_statement } ; - compound_statement : LEFT_BRACE RIGHT_BRACE { $$ = 0; } | LEFT_BRACE { @@ -3813,14 +3804,12 @@ selection_statement : selection_statement_nonattributed { $$ = $1; } - | attribute selection_statement_nonattributed { parseContext.requireExtensions($2->getLoc(), 1, &E_GL_EXT_control_flow_attributes, "attribute"); parseContext.handleSelectionAttributes(*$1, $2); $$ = $2; } - selection_statement_nonattributed : IF LEFT_PAREN expression RIGHT_PAREN selection_rest_statement { parseContext.boolCheck($1.loc, $3); @@ -3861,14 +3850,12 @@ switch_statement : switch_statement_nonattributed { $$ = $1; } - | attribute switch_statement_nonattributed { parseContext.requireExtensions($2->getLoc(), 1, &E_GL_EXT_control_flow_attributes, "attribute"); parseContext.handleSwitchAttributes(*$1, $2); $$ = $2; } - switch_statement_nonattributed : SWITCH LEFT_PAREN expression RIGHT_PAREN { // start new switch sequence on the switch stack @@ -3926,14 +3913,12 @@ iteration_statement : iteration_statement_nonattributed { $$ = $1; } - | attribute iteration_statement_nonattributed { parseContext.requireExtensions($2->getLoc(), 1, &E_GL_EXT_control_flow_attributes, "attribute"); parseContext.handleLoopAttributes(*$1, $2); $$ = $2; } - iteration_statement_nonattributed : WHILE LEFT_PAREN { if (! parseContext.limits.whileLoops) @@ -4046,7 +4031,6 @@ jump_statement parseContext.requireStage($1.loc, EShLangFragment, "terminateInvocation"); $$ = parseContext.intermediate.addBranch(EOpTerminateInvocation, $1.loc); } - | TERMINATE_RAY SEMICOLON { parseContext.requireStage($1.loc, EShLangAnyHit, "terminateRayEXT"); $$ = parseContext.intermediate.addBranch(EOpTerminateRayKHR, $1.loc); @@ -4055,7 +4039,6 @@ jump_statement parseContext.requireStage($1.loc, EShLangAnyHit, "ignoreIntersectionEXT"); $$ = parseContext.intermediate.addBranch(EOpIgnoreIntersectionKHR, $1.loc); } - ; // Grammar Note: No 'goto'. Gotos are not supported. @@ -4080,13 +4063,11 @@ external_declaration | declaration { $$ = $1; } - | SEMICOLON { parseContext.requireProfile($1.loc, ~EEsProfile, "extraneous semicolon"); parseContext.profileRequires($1.loc, ~EEsProfile, 460, nullptr, "extraneous semicolon"); $$ = nullptr; } - ; function_definition @@ -4108,6 +4089,7 @@ function_definition parseContext.error($1.loc, "function does not return a value:", "", $1.function->getName().c_str()); parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); $$ = parseContext.intermediate.growAggregate($1.intermNode, $3); + $$->getAsAggregate()->setLinkType($1.function->getLinkType()); parseContext.intermediate.setAggregateOperator($$, EOpFunction, $1.function->getType(), $1.loc); $$->getAsAggregate()->setName($1.function->getMangledName().c_str()); @@ -4130,7 +4112,6 @@ function_definition } ; - attribute : LEFT_BRACKET LEFT_BRACKET attribute_list RIGHT_BRACKET RIGHT_BRACKET { $$ = $3; @@ -4152,8 +4133,6 @@ single_attribute $$ = parseContext.makeAttributes(*$1.string, $3); } - - spirv_requirements_list : spirv_requirements_parameter { $$ = $1; @@ -4334,23 +4313,33 @@ spirv_decorate_parameter } spirv_decorate_id_parameter_list - : constant_expression { - if ($1->getBasicType() != EbtFloat && - $1->getBasicType() != EbtInt && - $1->getBasicType() != EbtUint && - $1->getBasicType() != EbtBool) - parseContext.error($1->getLoc(), "this type not allowed", $1->getType().getBasicString(), ""); + : spirv_decorate_id_parameter { $$ = parseContext.intermediate.makeAggregate($1); } - | spirv_decorate_id_parameter_list COMMA constant_expression { - if ($3->getBasicType() != EbtFloat && - $3->getBasicType() != EbtInt && - $3->getBasicType() != EbtUint && - $3->getBasicType() != EbtBool) - parseContext.error($3->getLoc(), "this type not allowed", $3->getType().getBasicString(), ""); + | spirv_decorate_id_parameter_list COMMA spirv_decorate_id_parameter { $$ = parseContext.intermediate.growAggregate($1, $3); } +spirv_decorate_id_parameter + : variable_identifier { + if ($1->getAsConstantUnion() || $1->getAsSymbolNode()) + $$ = $1; + else + parseContext.error($1->getLoc(), "only allow constants or variables which are not elements of a composite", "", ""); + } + | FLOATCONSTANT { + $$ = parseContext.intermediate.addConstantUnion($1.d, EbtFloat, $1.loc, true); + } + | INTCONSTANT { + $$ = parseContext.intermediate.addConstantUnion($1.i, $1.loc, true); + } + | UINTCONSTANT { + $$ = parseContext.intermediate.addConstantUnion($1.u, $1.loc, true); + } + | BOOLCONSTANT { + $$ = parseContext.intermediate.addConstantUnion($1.b, $1.loc, true); + } + spirv_decorate_string_parameter_list : STRING_LITERAL { $$ = parseContext.intermediate.makeAggregate( @@ -4392,6 +4381,9 @@ spirv_type_parameter : constant_expression { $$ = parseContext.makeSpirvTypeParameters($1->getLoc(), $1->getAsConstantUnion()); } + | type_specifier_nonarray { + $$ = parseContext.makeSpirvTypeParameters($1.loc, $1); + } spirv_instruction_qualifier : SPIRV_INSTRUCTION LEFT_PAREN spirv_instruction_qualifier_list RIGHT_PAREN { @@ -4418,5 +4410,4 @@ spirv_instruction_qualifier_id $$ = parseContext.makeSpirvInstruction($2.loc, *$1.string, $3.i); } - %% diff --git a/third_party/glslang/glslang/MachineIndependent/glslang_tab.cpp b/third_party/glslang/glslang/MachineIndependent/glslang_tab.cpp index 7ca3e711b20..534bee13cb0 100644 --- a/third_party/glslang/glslang/MachineIndependent/glslang_tab.cpp +++ b/third_party/glslang/glslang/MachineIndependent/glslang_tab.cpp @@ -1,8 +1,8 @@ -/* A Bison parser, made by GNU Bison 3.7.4. */ +/* A Bison parser, made by GNU Bison 3.8.2. */ /* Bison implementation for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . */ + along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work @@ -46,10 +46,10 @@ USER NAME SPACE" below. */ /* Identify Bison output, and Bison version. */ -#define YYBISON 30704 +#define YYBISON 30802 /* Bison version string. */ -#define YYBISON_VERSION "3.7.4" +#define YYBISON_VERSION "3.8.2" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -67,7 +67,7 @@ /* First part of user prologue. */ -#line 69 "MachineIndependent/glslang.y" +#line 44 "MachineIndependent/glslang.y" /* Based on: @@ -287,435 +287,443 @@ enum yysymbol_kind_t YYSYMBOL_FCOOPMATNV = 163, /* FCOOPMATNV */ YYSYMBOL_ICOOPMATNV = 164, /* ICOOPMATNV */ YYSYMBOL_UCOOPMATNV = 165, /* UCOOPMATNV */ - YYSYMBOL_SAMPLERCUBEARRAY = 166, /* SAMPLERCUBEARRAY */ - YYSYMBOL_SAMPLERCUBEARRAYSHADOW = 167, /* SAMPLERCUBEARRAYSHADOW */ - YYSYMBOL_ISAMPLERCUBEARRAY = 168, /* ISAMPLERCUBEARRAY */ - YYSYMBOL_USAMPLERCUBEARRAY = 169, /* USAMPLERCUBEARRAY */ - YYSYMBOL_SAMPLER1D = 170, /* SAMPLER1D */ - YYSYMBOL_SAMPLER1DARRAY = 171, /* SAMPLER1DARRAY */ - YYSYMBOL_SAMPLER1DARRAYSHADOW = 172, /* SAMPLER1DARRAYSHADOW */ - YYSYMBOL_ISAMPLER1D = 173, /* ISAMPLER1D */ - YYSYMBOL_SAMPLER1DSHADOW = 174, /* SAMPLER1DSHADOW */ - YYSYMBOL_SAMPLER2DRECT = 175, /* SAMPLER2DRECT */ - YYSYMBOL_SAMPLER2DRECTSHADOW = 176, /* SAMPLER2DRECTSHADOW */ - YYSYMBOL_ISAMPLER2DRECT = 177, /* ISAMPLER2DRECT */ - YYSYMBOL_USAMPLER2DRECT = 178, /* USAMPLER2DRECT */ - YYSYMBOL_SAMPLERBUFFER = 179, /* SAMPLERBUFFER */ - YYSYMBOL_ISAMPLERBUFFER = 180, /* ISAMPLERBUFFER */ - YYSYMBOL_USAMPLERBUFFER = 181, /* USAMPLERBUFFER */ - YYSYMBOL_SAMPLER2DMS = 182, /* SAMPLER2DMS */ - YYSYMBOL_ISAMPLER2DMS = 183, /* ISAMPLER2DMS */ - YYSYMBOL_USAMPLER2DMS = 184, /* USAMPLER2DMS */ - YYSYMBOL_SAMPLER2DMSARRAY = 185, /* SAMPLER2DMSARRAY */ - YYSYMBOL_ISAMPLER2DMSARRAY = 186, /* ISAMPLER2DMSARRAY */ - YYSYMBOL_USAMPLER2DMSARRAY = 187, /* USAMPLER2DMSARRAY */ - YYSYMBOL_SAMPLEREXTERNALOES = 188, /* SAMPLEREXTERNALOES */ - YYSYMBOL_SAMPLEREXTERNAL2DY2YEXT = 189, /* SAMPLEREXTERNAL2DY2YEXT */ - YYSYMBOL_ISAMPLER1DARRAY = 190, /* ISAMPLER1DARRAY */ - YYSYMBOL_USAMPLER1D = 191, /* USAMPLER1D */ - YYSYMBOL_USAMPLER1DARRAY = 192, /* USAMPLER1DARRAY */ - YYSYMBOL_F16SAMPLER1D = 193, /* F16SAMPLER1D */ - YYSYMBOL_F16SAMPLER2D = 194, /* F16SAMPLER2D */ - YYSYMBOL_F16SAMPLER3D = 195, /* F16SAMPLER3D */ - YYSYMBOL_F16SAMPLER2DRECT = 196, /* F16SAMPLER2DRECT */ - YYSYMBOL_F16SAMPLERCUBE = 197, /* F16SAMPLERCUBE */ - YYSYMBOL_F16SAMPLER1DARRAY = 198, /* F16SAMPLER1DARRAY */ - YYSYMBOL_F16SAMPLER2DARRAY = 199, /* F16SAMPLER2DARRAY */ - YYSYMBOL_F16SAMPLERCUBEARRAY = 200, /* F16SAMPLERCUBEARRAY */ - YYSYMBOL_F16SAMPLERBUFFER = 201, /* F16SAMPLERBUFFER */ - YYSYMBOL_F16SAMPLER2DMS = 202, /* F16SAMPLER2DMS */ - YYSYMBOL_F16SAMPLER2DMSARRAY = 203, /* F16SAMPLER2DMSARRAY */ - YYSYMBOL_F16SAMPLER1DSHADOW = 204, /* F16SAMPLER1DSHADOW */ - YYSYMBOL_F16SAMPLER2DSHADOW = 205, /* F16SAMPLER2DSHADOW */ - YYSYMBOL_F16SAMPLER1DARRAYSHADOW = 206, /* F16SAMPLER1DARRAYSHADOW */ - YYSYMBOL_F16SAMPLER2DARRAYSHADOW = 207, /* F16SAMPLER2DARRAYSHADOW */ - YYSYMBOL_F16SAMPLER2DRECTSHADOW = 208, /* F16SAMPLER2DRECTSHADOW */ - YYSYMBOL_F16SAMPLERCUBESHADOW = 209, /* F16SAMPLERCUBESHADOW */ - YYSYMBOL_F16SAMPLERCUBEARRAYSHADOW = 210, /* F16SAMPLERCUBEARRAYSHADOW */ - YYSYMBOL_IMAGE1D = 211, /* IMAGE1D */ - YYSYMBOL_IIMAGE1D = 212, /* IIMAGE1D */ - YYSYMBOL_UIMAGE1D = 213, /* UIMAGE1D */ - YYSYMBOL_IMAGE2D = 214, /* IMAGE2D */ - YYSYMBOL_IIMAGE2D = 215, /* IIMAGE2D */ - YYSYMBOL_UIMAGE2D = 216, /* UIMAGE2D */ - YYSYMBOL_IMAGE3D = 217, /* IMAGE3D */ - YYSYMBOL_IIMAGE3D = 218, /* IIMAGE3D */ - YYSYMBOL_UIMAGE3D = 219, /* UIMAGE3D */ - YYSYMBOL_IMAGE2DRECT = 220, /* IMAGE2DRECT */ - YYSYMBOL_IIMAGE2DRECT = 221, /* IIMAGE2DRECT */ - YYSYMBOL_UIMAGE2DRECT = 222, /* UIMAGE2DRECT */ - YYSYMBOL_IMAGECUBE = 223, /* IMAGECUBE */ - YYSYMBOL_IIMAGECUBE = 224, /* IIMAGECUBE */ - YYSYMBOL_UIMAGECUBE = 225, /* UIMAGECUBE */ - YYSYMBOL_IMAGEBUFFER = 226, /* IMAGEBUFFER */ - YYSYMBOL_IIMAGEBUFFER = 227, /* IIMAGEBUFFER */ - YYSYMBOL_UIMAGEBUFFER = 228, /* UIMAGEBUFFER */ - YYSYMBOL_IMAGE1DARRAY = 229, /* IMAGE1DARRAY */ - YYSYMBOL_IIMAGE1DARRAY = 230, /* IIMAGE1DARRAY */ - YYSYMBOL_UIMAGE1DARRAY = 231, /* UIMAGE1DARRAY */ - YYSYMBOL_IMAGE2DARRAY = 232, /* IMAGE2DARRAY */ - YYSYMBOL_IIMAGE2DARRAY = 233, /* IIMAGE2DARRAY */ - YYSYMBOL_UIMAGE2DARRAY = 234, /* UIMAGE2DARRAY */ - YYSYMBOL_IMAGECUBEARRAY = 235, /* IMAGECUBEARRAY */ - YYSYMBOL_IIMAGECUBEARRAY = 236, /* IIMAGECUBEARRAY */ - YYSYMBOL_UIMAGECUBEARRAY = 237, /* UIMAGECUBEARRAY */ - YYSYMBOL_IMAGE2DMS = 238, /* IMAGE2DMS */ - YYSYMBOL_IIMAGE2DMS = 239, /* IIMAGE2DMS */ - YYSYMBOL_UIMAGE2DMS = 240, /* UIMAGE2DMS */ - YYSYMBOL_IMAGE2DMSARRAY = 241, /* IMAGE2DMSARRAY */ - YYSYMBOL_IIMAGE2DMSARRAY = 242, /* IIMAGE2DMSARRAY */ - YYSYMBOL_UIMAGE2DMSARRAY = 243, /* UIMAGE2DMSARRAY */ - YYSYMBOL_F16IMAGE1D = 244, /* F16IMAGE1D */ - YYSYMBOL_F16IMAGE2D = 245, /* F16IMAGE2D */ - YYSYMBOL_F16IMAGE3D = 246, /* F16IMAGE3D */ - YYSYMBOL_F16IMAGE2DRECT = 247, /* F16IMAGE2DRECT */ - YYSYMBOL_F16IMAGECUBE = 248, /* F16IMAGECUBE */ - YYSYMBOL_F16IMAGE1DARRAY = 249, /* F16IMAGE1DARRAY */ - YYSYMBOL_F16IMAGE2DARRAY = 250, /* F16IMAGE2DARRAY */ - YYSYMBOL_F16IMAGECUBEARRAY = 251, /* F16IMAGECUBEARRAY */ - YYSYMBOL_F16IMAGEBUFFER = 252, /* F16IMAGEBUFFER */ - YYSYMBOL_F16IMAGE2DMS = 253, /* F16IMAGE2DMS */ - YYSYMBOL_F16IMAGE2DMSARRAY = 254, /* F16IMAGE2DMSARRAY */ - YYSYMBOL_I64IMAGE1D = 255, /* I64IMAGE1D */ - YYSYMBOL_U64IMAGE1D = 256, /* U64IMAGE1D */ - YYSYMBOL_I64IMAGE2D = 257, /* I64IMAGE2D */ - YYSYMBOL_U64IMAGE2D = 258, /* U64IMAGE2D */ - YYSYMBOL_I64IMAGE3D = 259, /* I64IMAGE3D */ - YYSYMBOL_U64IMAGE3D = 260, /* U64IMAGE3D */ - YYSYMBOL_I64IMAGE2DRECT = 261, /* I64IMAGE2DRECT */ - YYSYMBOL_U64IMAGE2DRECT = 262, /* U64IMAGE2DRECT */ - YYSYMBOL_I64IMAGECUBE = 263, /* I64IMAGECUBE */ - YYSYMBOL_U64IMAGECUBE = 264, /* U64IMAGECUBE */ - YYSYMBOL_I64IMAGEBUFFER = 265, /* I64IMAGEBUFFER */ - YYSYMBOL_U64IMAGEBUFFER = 266, /* U64IMAGEBUFFER */ - YYSYMBOL_I64IMAGE1DARRAY = 267, /* I64IMAGE1DARRAY */ - YYSYMBOL_U64IMAGE1DARRAY = 268, /* U64IMAGE1DARRAY */ - YYSYMBOL_I64IMAGE2DARRAY = 269, /* I64IMAGE2DARRAY */ - YYSYMBOL_U64IMAGE2DARRAY = 270, /* U64IMAGE2DARRAY */ - YYSYMBOL_I64IMAGECUBEARRAY = 271, /* I64IMAGECUBEARRAY */ - YYSYMBOL_U64IMAGECUBEARRAY = 272, /* U64IMAGECUBEARRAY */ - YYSYMBOL_I64IMAGE2DMS = 273, /* I64IMAGE2DMS */ - YYSYMBOL_U64IMAGE2DMS = 274, /* U64IMAGE2DMS */ - YYSYMBOL_I64IMAGE2DMSARRAY = 275, /* I64IMAGE2DMSARRAY */ - YYSYMBOL_U64IMAGE2DMSARRAY = 276, /* U64IMAGE2DMSARRAY */ - YYSYMBOL_TEXTURECUBEARRAY = 277, /* TEXTURECUBEARRAY */ - YYSYMBOL_ITEXTURECUBEARRAY = 278, /* ITEXTURECUBEARRAY */ - YYSYMBOL_UTEXTURECUBEARRAY = 279, /* UTEXTURECUBEARRAY */ - YYSYMBOL_TEXTURE1D = 280, /* TEXTURE1D */ - YYSYMBOL_ITEXTURE1D = 281, /* ITEXTURE1D */ - YYSYMBOL_UTEXTURE1D = 282, /* UTEXTURE1D */ - YYSYMBOL_TEXTURE1DARRAY = 283, /* TEXTURE1DARRAY */ - YYSYMBOL_ITEXTURE1DARRAY = 284, /* ITEXTURE1DARRAY */ - YYSYMBOL_UTEXTURE1DARRAY = 285, /* UTEXTURE1DARRAY */ - YYSYMBOL_TEXTURE2DRECT = 286, /* TEXTURE2DRECT */ - YYSYMBOL_ITEXTURE2DRECT = 287, /* ITEXTURE2DRECT */ - YYSYMBOL_UTEXTURE2DRECT = 288, /* UTEXTURE2DRECT */ - YYSYMBOL_TEXTUREBUFFER = 289, /* TEXTUREBUFFER */ - YYSYMBOL_ITEXTUREBUFFER = 290, /* ITEXTUREBUFFER */ - YYSYMBOL_UTEXTUREBUFFER = 291, /* UTEXTUREBUFFER */ - YYSYMBOL_TEXTURE2DMS = 292, /* TEXTURE2DMS */ - YYSYMBOL_ITEXTURE2DMS = 293, /* ITEXTURE2DMS */ - YYSYMBOL_UTEXTURE2DMS = 294, /* UTEXTURE2DMS */ - YYSYMBOL_TEXTURE2DMSARRAY = 295, /* TEXTURE2DMSARRAY */ - YYSYMBOL_ITEXTURE2DMSARRAY = 296, /* ITEXTURE2DMSARRAY */ - YYSYMBOL_UTEXTURE2DMSARRAY = 297, /* UTEXTURE2DMSARRAY */ - YYSYMBOL_F16TEXTURE1D = 298, /* F16TEXTURE1D */ - YYSYMBOL_F16TEXTURE2D = 299, /* F16TEXTURE2D */ - YYSYMBOL_F16TEXTURE3D = 300, /* F16TEXTURE3D */ - YYSYMBOL_F16TEXTURE2DRECT = 301, /* F16TEXTURE2DRECT */ - YYSYMBOL_F16TEXTURECUBE = 302, /* F16TEXTURECUBE */ - YYSYMBOL_F16TEXTURE1DARRAY = 303, /* F16TEXTURE1DARRAY */ - YYSYMBOL_F16TEXTURE2DARRAY = 304, /* F16TEXTURE2DARRAY */ - YYSYMBOL_F16TEXTURECUBEARRAY = 305, /* F16TEXTURECUBEARRAY */ - YYSYMBOL_F16TEXTUREBUFFER = 306, /* F16TEXTUREBUFFER */ - YYSYMBOL_F16TEXTURE2DMS = 307, /* F16TEXTURE2DMS */ - YYSYMBOL_F16TEXTURE2DMSARRAY = 308, /* F16TEXTURE2DMSARRAY */ - YYSYMBOL_SUBPASSINPUT = 309, /* SUBPASSINPUT */ - YYSYMBOL_SUBPASSINPUTMS = 310, /* SUBPASSINPUTMS */ - YYSYMBOL_ISUBPASSINPUT = 311, /* ISUBPASSINPUT */ - YYSYMBOL_ISUBPASSINPUTMS = 312, /* ISUBPASSINPUTMS */ - YYSYMBOL_USUBPASSINPUT = 313, /* USUBPASSINPUT */ - YYSYMBOL_USUBPASSINPUTMS = 314, /* USUBPASSINPUTMS */ - YYSYMBOL_F16SUBPASSINPUT = 315, /* F16SUBPASSINPUT */ - YYSYMBOL_F16SUBPASSINPUTMS = 316, /* F16SUBPASSINPUTMS */ - YYSYMBOL_SPIRV_INSTRUCTION = 317, /* SPIRV_INSTRUCTION */ - YYSYMBOL_SPIRV_EXECUTION_MODE = 318, /* SPIRV_EXECUTION_MODE */ - YYSYMBOL_SPIRV_EXECUTION_MODE_ID = 319, /* SPIRV_EXECUTION_MODE_ID */ - YYSYMBOL_SPIRV_DECORATE = 320, /* SPIRV_DECORATE */ - YYSYMBOL_SPIRV_DECORATE_ID = 321, /* SPIRV_DECORATE_ID */ - YYSYMBOL_SPIRV_DECORATE_STRING = 322, /* SPIRV_DECORATE_STRING */ - YYSYMBOL_SPIRV_TYPE = 323, /* SPIRV_TYPE */ - YYSYMBOL_SPIRV_STORAGE_CLASS = 324, /* SPIRV_STORAGE_CLASS */ - YYSYMBOL_SPIRV_BY_REFERENCE = 325, /* SPIRV_BY_REFERENCE */ - YYSYMBOL_SPIRV_LITERAL = 326, /* SPIRV_LITERAL */ - YYSYMBOL_LEFT_OP = 327, /* LEFT_OP */ - YYSYMBOL_RIGHT_OP = 328, /* RIGHT_OP */ - YYSYMBOL_INC_OP = 329, /* INC_OP */ - YYSYMBOL_DEC_OP = 330, /* DEC_OP */ - YYSYMBOL_LE_OP = 331, /* LE_OP */ - YYSYMBOL_GE_OP = 332, /* GE_OP */ - YYSYMBOL_EQ_OP = 333, /* EQ_OP */ - YYSYMBOL_NE_OP = 334, /* NE_OP */ - YYSYMBOL_AND_OP = 335, /* AND_OP */ - YYSYMBOL_OR_OP = 336, /* OR_OP */ - YYSYMBOL_XOR_OP = 337, /* XOR_OP */ - YYSYMBOL_MUL_ASSIGN = 338, /* MUL_ASSIGN */ - YYSYMBOL_DIV_ASSIGN = 339, /* DIV_ASSIGN */ - YYSYMBOL_ADD_ASSIGN = 340, /* ADD_ASSIGN */ - YYSYMBOL_MOD_ASSIGN = 341, /* MOD_ASSIGN */ - YYSYMBOL_LEFT_ASSIGN = 342, /* LEFT_ASSIGN */ - YYSYMBOL_RIGHT_ASSIGN = 343, /* RIGHT_ASSIGN */ - YYSYMBOL_AND_ASSIGN = 344, /* AND_ASSIGN */ - YYSYMBOL_XOR_ASSIGN = 345, /* XOR_ASSIGN */ - YYSYMBOL_OR_ASSIGN = 346, /* OR_ASSIGN */ - YYSYMBOL_SUB_ASSIGN = 347, /* SUB_ASSIGN */ - YYSYMBOL_STRING_LITERAL = 348, /* STRING_LITERAL */ - YYSYMBOL_LEFT_PAREN = 349, /* LEFT_PAREN */ - YYSYMBOL_RIGHT_PAREN = 350, /* RIGHT_PAREN */ - YYSYMBOL_LEFT_BRACKET = 351, /* LEFT_BRACKET */ - YYSYMBOL_RIGHT_BRACKET = 352, /* RIGHT_BRACKET */ - YYSYMBOL_LEFT_BRACE = 353, /* LEFT_BRACE */ - YYSYMBOL_RIGHT_BRACE = 354, /* RIGHT_BRACE */ - YYSYMBOL_DOT = 355, /* DOT */ - YYSYMBOL_COMMA = 356, /* COMMA */ - YYSYMBOL_COLON = 357, /* COLON */ - YYSYMBOL_EQUAL = 358, /* EQUAL */ - YYSYMBOL_SEMICOLON = 359, /* SEMICOLON */ - YYSYMBOL_BANG = 360, /* BANG */ - YYSYMBOL_DASH = 361, /* DASH */ - YYSYMBOL_TILDE = 362, /* TILDE */ - YYSYMBOL_PLUS = 363, /* PLUS */ - YYSYMBOL_STAR = 364, /* STAR */ - YYSYMBOL_SLASH = 365, /* SLASH */ - YYSYMBOL_PERCENT = 366, /* PERCENT */ - YYSYMBOL_LEFT_ANGLE = 367, /* LEFT_ANGLE */ - YYSYMBOL_RIGHT_ANGLE = 368, /* RIGHT_ANGLE */ - YYSYMBOL_VERTICAL_BAR = 369, /* VERTICAL_BAR */ - YYSYMBOL_CARET = 370, /* CARET */ - YYSYMBOL_AMPERSAND = 371, /* AMPERSAND */ - YYSYMBOL_QUESTION = 372, /* QUESTION */ - YYSYMBOL_INVARIANT = 373, /* INVARIANT */ - YYSYMBOL_HIGH_PRECISION = 374, /* HIGH_PRECISION */ - YYSYMBOL_MEDIUM_PRECISION = 375, /* MEDIUM_PRECISION */ - YYSYMBOL_LOW_PRECISION = 376, /* LOW_PRECISION */ - YYSYMBOL_PRECISION = 377, /* PRECISION */ - YYSYMBOL_PACKED = 378, /* PACKED */ - YYSYMBOL_RESOURCE = 379, /* RESOURCE */ - YYSYMBOL_SUPERP = 380, /* SUPERP */ - YYSYMBOL_FLOATCONSTANT = 381, /* FLOATCONSTANT */ - YYSYMBOL_INTCONSTANT = 382, /* INTCONSTANT */ - YYSYMBOL_UINTCONSTANT = 383, /* UINTCONSTANT */ - YYSYMBOL_BOOLCONSTANT = 384, /* BOOLCONSTANT */ - YYSYMBOL_IDENTIFIER = 385, /* IDENTIFIER */ - YYSYMBOL_TYPE_NAME = 386, /* TYPE_NAME */ - YYSYMBOL_CENTROID = 387, /* CENTROID */ - YYSYMBOL_IN = 388, /* IN */ - YYSYMBOL_OUT = 389, /* OUT */ - YYSYMBOL_INOUT = 390, /* INOUT */ - YYSYMBOL_STRUCT = 391, /* STRUCT */ - YYSYMBOL_VOID = 392, /* VOID */ - YYSYMBOL_WHILE = 393, /* WHILE */ - YYSYMBOL_BREAK = 394, /* BREAK */ - YYSYMBOL_CONTINUE = 395, /* CONTINUE */ - YYSYMBOL_DO = 396, /* DO */ - YYSYMBOL_ELSE = 397, /* ELSE */ - YYSYMBOL_FOR = 398, /* FOR */ - YYSYMBOL_IF = 399, /* IF */ - YYSYMBOL_DISCARD = 400, /* DISCARD */ - YYSYMBOL_RETURN = 401, /* RETURN */ - YYSYMBOL_SWITCH = 402, /* SWITCH */ - YYSYMBOL_CASE = 403, /* CASE */ - YYSYMBOL_DEFAULT = 404, /* DEFAULT */ - YYSYMBOL_TERMINATE_INVOCATION = 405, /* TERMINATE_INVOCATION */ - YYSYMBOL_TERMINATE_RAY = 406, /* TERMINATE_RAY */ - YYSYMBOL_IGNORE_INTERSECTION = 407, /* IGNORE_INTERSECTION */ - YYSYMBOL_UNIFORM = 408, /* UNIFORM */ - YYSYMBOL_SHARED = 409, /* SHARED */ - YYSYMBOL_BUFFER = 410, /* BUFFER */ - YYSYMBOL_FLAT = 411, /* FLAT */ - YYSYMBOL_SMOOTH = 412, /* SMOOTH */ - YYSYMBOL_LAYOUT = 413, /* LAYOUT */ - YYSYMBOL_DOUBLECONSTANT = 414, /* DOUBLECONSTANT */ - YYSYMBOL_INT16CONSTANT = 415, /* INT16CONSTANT */ - YYSYMBOL_UINT16CONSTANT = 416, /* UINT16CONSTANT */ - YYSYMBOL_FLOAT16CONSTANT = 417, /* FLOAT16CONSTANT */ - YYSYMBOL_INT32CONSTANT = 418, /* INT32CONSTANT */ - YYSYMBOL_UINT32CONSTANT = 419, /* UINT32CONSTANT */ - YYSYMBOL_INT64CONSTANT = 420, /* INT64CONSTANT */ - YYSYMBOL_UINT64CONSTANT = 421, /* UINT64CONSTANT */ - YYSYMBOL_SUBROUTINE = 422, /* SUBROUTINE */ - YYSYMBOL_DEMOTE = 423, /* DEMOTE */ - YYSYMBOL_PAYLOADNV = 424, /* PAYLOADNV */ - YYSYMBOL_PAYLOADINNV = 425, /* PAYLOADINNV */ - YYSYMBOL_HITATTRNV = 426, /* HITATTRNV */ - YYSYMBOL_CALLDATANV = 427, /* CALLDATANV */ - YYSYMBOL_CALLDATAINNV = 428, /* CALLDATAINNV */ - YYSYMBOL_PAYLOADEXT = 429, /* PAYLOADEXT */ - YYSYMBOL_PAYLOADINEXT = 430, /* PAYLOADINEXT */ - YYSYMBOL_HITATTREXT = 431, /* HITATTREXT */ - YYSYMBOL_CALLDATAEXT = 432, /* CALLDATAEXT */ - YYSYMBOL_CALLDATAINEXT = 433, /* CALLDATAINEXT */ - YYSYMBOL_PATCH = 434, /* PATCH */ - YYSYMBOL_SAMPLE = 435, /* SAMPLE */ - YYSYMBOL_NONUNIFORM = 436, /* NONUNIFORM */ - YYSYMBOL_COHERENT = 437, /* COHERENT */ - YYSYMBOL_VOLATILE = 438, /* VOLATILE */ - YYSYMBOL_RESTRICT = 439, /* RESTRICT */ - YYSYMBOL_READONLY = 440, /* READONLY */ - YYSYMBOL_WRITEONLY = 441, /* WRITEONLY */ - YYSYMBOL_DEVICECOHERENT = 442, /* DEVICECOHERENT */ - YYSYMBOL_QUEUEFAMILYCOHERENT = 443, /* QUEUEFAMILYCOHERENT */ - YYSYMBOL_WORKGROUPCOHERENT = 444, /* WORKGROUPCOHERENT */ - YYSYMBOL_SUBGROUPCOHERENT = 445, /* SUBGROUPCOHERENT */ - YYSYMBOL_NONPRIVATE = 446, /* NONPRIVATE */ - YYSYMBOL_SHADERCALLCOHERENT = 447, /* SHADERCALLCOHERENT */ - YYSYMBOL_NOPERSPECTIVE = 448, /* NOPERSPECTIVE */ - YYSYMBOL_EXPLICITINTERPAMD = 449, /* EXPLICITINTERPAMD */ - YYSYMBOL_PERVERTEXEXT = 450, /* PERVERTEXEXT */ - YYSYMBOL_PERVERTEXNV = 451, /* PERVERTEXNV */ - YYSYMBOL_PERPRIMITIVENV = 452, /* PERPRIMITIVENV */ - YYSYMBOL_PERVIEWNV = 453, /* PERVIEWNV */ - YYSYMBOL_PERTASKNV = 454, /* PERTASKNV */ - YYSYMBOL_PERPRIMITIVEEXT = 455, /* PERPRIMITIVEEXT */ - YYSYMBOL_TASKPAYLOADWORKGROUPEXT = 456, /* TASKPAYLOADWORKGROUPEXT */ - YYSYMBOL_PRECISE = 457, /* PRECISE */ - YYSYMBOL_YYACCEPT = 458, /* $accept */ - YYSYMBOL_variable_identifier = 459, /* variable_identifier */ - YYSYMBOL_primary_expression = 460, /* primary_expression */ - YYSYMBOL_postfix_expression = 461, /* postfix_expression */ - YYSYMBOL_integer_expression = 462, /* integer_expression */ - YYSYMBOL_function_call = 463, /* function_call */ - YYSYMBOL_function_call_or_method = 464, /* function_call_or_method */ - YYSYMBOL_function_call_generic = 465, /* function_call_generic */ - YYSYMBOL_function_call_header_no_parameters = 466, /* function_call_header_no_parameters */ - YYSYMBOL_function_call_header_with_parameters = 467, /* function_call_header_with_parameters */ - YYSYMBOL_function_call_header = 468, /* function_call_header */ - YYSYMBOL_function_identifier = 469, /* function_identifier */ - YYSYMBOL_unary_expression = 470, /* unary_expression */ - YYSYMBOL_unary_operator = 471, /* unary_operator */ - YYSYMBOL_multiplicative_expression = 472, /* multiplicative_expression */ - YYSYMBOL_additive_expression = 473, /* additive_expression */ - YYSYMBOL_shift_expression = 474, /* shift_expression */ - YYSYMBOL_relational_expression = 475, /* relational_expression */ - YYSYMBOL_equality_expression = 476, /* equality_expression */ - YYSYMBOL_and_expression = 477, /* and_expression */ - YYSYMBOL_exclusive_or_expression = 478, /* exclusive_or_expression */ - YYSYMBOL_inclusive_or_expression = 479, /* inclusive_or_expression */ - YYSYMBOL_logical_and_expression = 480, /* logical_and_expression */ - YYSYMBOL_logical_xor_expression = 481, /* logical_xor_expression */ - YYSYMBOL_logical_or_expression = 482, /* logical_or_expression */ - YYSYMBOL_conditional_expression = 483, /* conditional_expression */ - YYSYMBOL_484_1 = 484, /* $@1 */ - YYSYMBOL_assignment_expression = 485, /* assignment_expression */ - YYSYMBOL_assignment_operator = 486, /* assignment_operator */ - YYSYMBOL_expression = 487, /* expression */ - YYSYMBOL_constant_expression = 488, /* constant_expression */ - YYSYMBOL_declaration = 489, /* declaration */ - YYSYMBOL_block_structure = 490, /* block_structure */ - YYSYMBOL_491_2 = 491, /* $@2 */ - YYSYMBOL_identifier_list = 492, /* identifier_list */ - YYSYMBOL_function_prototype = 493, /* function_prototype */ - YYSYMBOL_function_declarator = 494, /* function_declarator */ - YYSYMBOL_function_header_with_parameters = 495, /* function_header_with_parameters */ - YYSYMBOL_function_header = 496, /* function_header */ - YYSYMBOL_parameter_declarator = 497, /* parameter_declarator */ - YYSYMBOL_parameter_declaration = 498, /* parameter_declaration */ - YYSYMBOL_parameter_type_specifier = 499, /* parameter_type_specifier */ - YYSYMBOL_init_declarator_list = 500, /* init_declarator_list */ - YYSYMBOL_single_declaration = 501, /* single_declaration */ - YYSYMBOL_fully_specified_type = 502, /* fully_specified_type */ - YYSYMBOL_invariant_qualifier = 503, /* invariant_qualifier */ - YYSYMBOL_interpolation_qualifier = 504, /* interpolation_qualifier */ - YYSYMBOL_layout_qualifier = 505, /* layout_qualifier */ - YYSYMBOL_layout_qualifier_id_list = 506, /* layout_qualifier_id_list */ - YYSYMBOL_layout_qualifier_id = 507, /* layout_qualifier_id */ - YYSYMBOL_precise_qualifier = 508, /* precise_qualifier */ - YYSYMBOL_type_qualifier = 509, /* type_qualifier */ - YYSYMBOL_single_type_qualifier = 510, /* single_type_qualifier */ - YYSYMBOL_storage_qualifier = 511, /* storage_qualifier */ - YYSYMBOL_non_uniform_qualifier = 512, /* non_uniform_qualifier */ - YYSYMBOL_type_name_list = 513, /* type_name_list */ - YYSYMBOL_type_specifier = 514, /* type_specifier */ - YYSYMBOL_array_specifier = 515, /* array_specifier */ - YYSYMBOL_type_parameter_specifier_opt = 516, /* type_parameter_specifier_opt */ - YYSYMBOL_type_parameter_specifier = 517, /* type_parameter_specifier */ - YYSYMBOL_type_parameter_specifier_list = 518, /* type_parameter_specifier_list */ - YYSYMBOL_type_specifier_nonarray = 519, /* type_specifier_nonarray */ - YYSYMBOL_precision_qualifier = 520, /* precision_qualifier */ - YYSYMBOL_struct_specifier = 521, /* struct_specifier */ - YYSYMBOL_522_3 = 522, /* $@3 */ - YYSYMBOL_523_4 = 523, /* $@4 */ - YYSYMBOL_struct_declaration_list = 524, /* struct_declaration_list */ - YYSYMBOL_struct_declaration = 525, /* struct_declaration */ - YYSYMBOL_struct_declarator_list = 526, /* struct_declarator_list */ - YYSYMBOL_struct_declarator = 527, /* struct_declarator */ - YYSYMBOL_initializer = 528, /* initializer */ - YYSYMBOL_initializer_list = 529, /* initializer_list */ - YYSYMBOL_declaration_statement = 530, /* declaration_statement */ - YYSYMBOL_statement = 531, /* statement */ - YYSYMBOL_simple_statement = 532, /* simple_statement */ - YYSYMBOL_demote_statement = 533, /* demote_statement */ - YYSYMBOL_compound_statement = 534, /* compound_statement */ - YYSYMBOL_535_5 = 535, /* $@5 */ - YYSYMBOL_536_6 = 536, /* $@6 */ - YYSYMBOL_statement_no_new_scope = 537, /* statement_no_new_scope */ - YYSYMBOL_statement_scoped = 538, /* statement_scoped */ - YYSYMBOL_539_7 = 539, /* $@7 */ - YYSYMBOL_540_8 = 540, /* $@8 */ - YYSYMBOL_compound_statement_no_new_scope = 541, /* compound_statement_no_new_scope */ - YYSYMBOL_statement_list = 542, /* statement_list */ - YYSYMBOL_expression_statement = 543, /* expression_statement */ - YYSYMBOL_selection_statement = 544, /* selection_statement */ - YYSYMBOL_selection_statement_nonattributed = 545, /* selection_statement_nonattributed */ - YYSYMBOL_selection_rest_statement = 546, /* selection_rest_statement */ - YYSYMBOL_condition = 547, /* condition */ - YYSYMBOL_switch_statement = 548, /* switch_statement */ - YYSYMBOL_switch_statement_nonattributed = 549, /* switch_statement_nonattributed */ - YYSYMBOL_550_9 = 550, /* $@9 */ - YYSYMBOL_switch_statement_list = 551, /* switch_statement_list */ - YYSYMBOL_case_label = 552, /* case_label */ - YYSYMBOL_iteration_statement = 553, /* iteration_statement */ - YYSYMBOL_iteration_statement_nonattributed = 554, /* iteration_statement_nonattributed */ - YYSYMBOL_555_10 = 555, /* $@10 */ - YYSYMBOL_556_11 = 556, /* $@11 */ - YYSYMBOL_557_12 = 557, /* $@12 */ - YYSYMBOL_for_init_statement = 558, /* for_init_statement */ - YYSYMBOL_conditionopt = 559, /* conditionopt */ - YYSYMBOL_for_rest_statement = 560, /* for_rest_statement */ - YYSYMBOL_jump_statement = 561, /* jump_statement */ - YYSYMBOL_translation_unit = 562, /* translation_unit */ - YYSYMBOL_external_declaration = 563, /* external_declaration */ - YYSYMBOL_function_definition = 564, /* function_definition */ - YYSYMBOL_565_13 = 565, /* $@13 */ - YYSYMBOL_attribute = 566, /* attribute */ - YYSYMBOL_attribute_list = 567, /* attribute_list */ - YYSYMBOL_single_attribute = 568, /* single_attribute */ - YYSYMBOL_spirv_requirements_list = 569, /* spirv_requirements_list */ - YYSYMBOL_spirv_requirements_parameter = 570, /* spirv_requirements_parameter */ - YYSYMBOL_spirv_extension_list = 571, /* spirv_extension_list */ - YYSYMBOL_spirv_capability_list = 572, /* spirv_capability_list */ - YYSYMBOL_spirv_execution_mode_qualifier = 573, /* spirv_execution_mode_qualifier */ - YYSYMBOL_spirv_execution_mode_parameter_list = 574, /* spirv_execution_mode_parameter_list */ - YYSYMBOL_spirv_execution_mode_parameter = 575, /* spirv_execution_mode_parameter */ - YYSYMBOL_spirv_execution_mode_id_parameter_list = 576, /* spirv_execution_mode_id_parameter_list */ - YYSYMBOL_spirv_storage_class_qualifier = 577, /* spirv_storage_class_qualifier */ - YYSYMBOL_spirv_decorate_qualifier = 578, /* spirv_decorate_qualifier */ - YYSYMBOL_spirv_decorate_parameter_list = 579, /* spirv_decorate_parameter_list */ - YYSYMBOL_spirv_decorate_parameter = 580, /* spirv_decorate_parameter */ - YYSYMBOL_spirv_decorate_id_parameter_list = 581, /* spirv_decorate_id_parameter_list */ - YYSYMBOL_spirv_decorate_string_parameter_list = 582, /* spirv_decorate_string_parameter_list */ - YYSYMBOL_spirv_type_specifier = 583, /* spirv_type_specifier */ - YYSYMBOL_spirv_type_parameter_list = 584, /* spirv_type_parameter_list */ - YYSYMBOL_spirv_type_parameter = 585, /* spirv_type_parameter */ - YYSYMBOL_spirv_instruction_qualifier = 586, /* spirv_instruction_qualifier */ - YYSYMBOL_spirv_instruction_qualifier_list = 587, /* spirv_instruction_qualifier_list */ - YYSYMBOL_spirv_instruction_qualifier_id = 588 /* spirv_instruction_qualifier_id */ + YYSYMBOL_COOPMAT = 166, /* COOPMAT */ + YYSYMBOL_HITOBJECTNV = 167, /* HITOBJECTNV */ + YYSYMBOL_HITOBJECTATTRNV = 168, /* HITOBJECTATTRNV */ + YYSYMBOL_SAMPLERCUBEARRAY = 169, /* SAMPLERCUBEARRAY */ + YYSYMBOL_SAMPLERCUBEARRAYSHADOW = 170, /* SAMPLERCUBEARRAYSHADOW */ + YYSYMBOL_ISAMPLERCUBEARRAY = 171, /* ISAMPLERCUBEARRAY */ + YYSYMBOL_USAMPLERCUBEARRAY = 172, /* USAMPLERCUBEARRAY */ + YYSYMBOL_SAMPLER1D = 173, /* SAMPLER1D */ + YYSYMBOL_SAMPLER1DARRAY = 174, /* SAMPLER1DARRAY */ + YYSYMBOL_SAMPLER1DARRAYSHADOW = 175, /* SAMPLER1DARRAYSHADOW */ + YYSYMBOL_ISAMPLER1D = 176, /* ISAMPLER1D */ + YYSYMBOL_SAMPLER1DSHADOW = 177, /* SAMPLER1DSHADOW */ + YYSYMBOL_SAMPLER2DRECT = 178, /* SAMPLER2DRECT */ + YYSYMBOL_SAMPLER2DRECTSHADOW = 179, /* SAMPLER2DRECTSHADOW */ + YYSYMBOL_ISAMPLER2DRECT = 180, /* ISAMPLER2DRECT */ + YYSYMBOL_USAMPLER2DRECT = 181, /* USAMPLER2DRECT */ + YYSYMBOL_SAMPLERBUFFER = 182, /* SAMPLERBUFFER */ + YYSYMBOL_ISAMPLERBUFFER = 183, /* ISAMPLERBUFFER */ + YYSYMBOL_USAMPLERBUFFER = 184, /* USAMPLERBUFFER */ + YYSYMBOL_SAMPLER2DMS = 185, /* SAMPLER2DMS */ + YYSYMBOL_ISAMPLER2DMS = 186, /* ISAMPLER2DMS */ + YYSYMBOL_USAMPLER2DMS = 187, /* USAMPLER2DMS */ + YYSYMBOL_SAMPLER2DMSARRAY = 188, /* SAMPLER2DMSARRAY */ + YYSYMBOL_ISAMPLER2DMSARRAY = 189, /* ISAMPLER2DMSARRAY */ + YYSYMBOL_USAMPLER2DMSARRAY = 190, /* USAMPLER2DMSARRAY */ + YYSYMBOL_SAMPLEREXTERNALOES = 191, /* SAMPLEREXTERNALOES */ + YYSYMBOL_SAMPLEREXTERNAL2DY2YEXT = 192, /* SAMPLEREXTERNAL2DY2YEXT */ + YYSYMBOL_ISAMPLER1DARRAY = 193, /* ISAMPLER1DARRAY */ + YYSYMBOL_USAMPLER1D = 194, /* USAMPLER1D */ + YYSYMBOL_USAMPLER1DARRAY = 195, /* USAMPLER1DARRAY */ + YYSYMBOL_F16SAMPLER1D = 196, /* F16SAMPLER1D */ + YYSYMBOL_F16SAMPLER2D = 197, /* F16SAMPLER2D */ + YYSYMBOL_F16SAMPLER3D = 198, /* F16SAMPLER3D */ + YYSYMBOL_F16SAMPLER2DRECT = 199, /* F16SAMPLER2DRECT */ + YYSYMBOL_F16SAMPLERCUBE = 200, /* F16SAMPLERCUBE */ + YYSYMBOL_F16SAMPLER1DARRAY = 201, /* F16SAMPLER1DARRAY */ + YYSYMBOL_F16SAMPLER2DARRAY = 202, /* F16SAMPLER2DARRAY */ + YYSYMBOL_F16SAMPLERCUBEARRAY = 203, /* F16SAMPLERCUBEARRAY */ + YYSYMBOL_F16SAMPLERBUFFER = 204, /* F16SAMPLERBUFFER */ + YYSYMBOL_F16SAMPLER2DMS = 205, /* F16SAMPLER2DMS */ + YYSYMBOL_F16SAMPLER2DMSARRAY = 206, /* F16SAMPLER2DMSARRAY */ + YYSYMBOL_F16SAMPLER1DSHADOW = 207, /* F16SAMPLER1DSHADOW */ + YYSYMBOL_F16SAMPLER2DSHADOW = 208, /* F16SAMPLER2DSHADOW */ + YYSYMBOL_F16SAMPLER1DARRAYSHADOW = 209, /* F16SAMPLER1DARRAYSHADOW */ + YYSYMBOL_F16SAMPLER2DARRAYSHADOW = 210, /* F16SAMPLER2DARRAYSHADOW */ + YYSYMBOL_F16SAMPLER2DRECTSHADOW = 211, /* F16SAMPLER2DRECTSHADOW */ + YYSYMBOL_F16SAMPLERCUBESHADOW = 212, /* F16SAMPLERCUBESHADOW */ + YYSYMBOL_F16SAMPLERCUBEARRAYSHADOW = 213, /* F16SAMPLERCUBEARRAYSHADOW */ + YYSYMBOL_IMAGE1D = 214, /* IMAGE1D */ + YYSYMBOL_IIMAGE1D = 215, /* IIMAGE1D */ + YYSYMBOL_UIMAGE1D = 216, /* UIMAGE1D */ + YYSYMBOL_IMAGE2D = 217, /* IMAGE2D */ + YYSYMBOL_IIMAGE2D = 218, /* IIMAGE2D */ + YYSYMBOL_UIMAGE2D = 219, /* UIMAGE2D */ + YYSYMBOL_IMAGE3D = 220, /* IMAGE3D */ + YYSYMBOL_IIMAGE3D = 221, /* IIMAGE3D */ + YYSYMBOL_UIMAGE3D = 222, /* UIMAGE3D */ + YYSYMBOL_IMAGE2DRECT = 223, /* IMAGE2DRECT */ + YYSYMBOL_IIMAGE2DRECT = 224, /* IIMAGE2DRECT */ + YYSYMBOL_UIMAGE2DRECT = 225, /* UIMAGE2DRECT */ + YYSYMBOL_IMAGECUBE = 226, /* IMAGECUBE */ + YYSYMBOL_IIMAGECUBE = 227, /* IIMAGECUBE */ + YYSYMBOL_UIMAGECUBE = 228, /* UIMAGECUBE */ + YYSYMBOL_IMAGEBUFFER = 229, /* IMAGEBUFFER */ + YYSYMBOL_IIMAGEBUFFER = 230, /* IIMAGEBUFFER */ + YYSYMBOL_UIMAGEBUFFER = 231, /* UIMAGEBUFFER */ + YYSYMBOL_IMAGE1DARRAY = 232, /* IMAGE1DARRAY */ + YYSYMBOL_IIMAGE1DARRAY = 233, /* IIMAGE1DARRAY */ + YYSYMBOL_UIMAGE1DARRAY = 234, /* UIMAGE1DARRAY */ + YYSYMBOL_IMAGE2DARRAY = 235, /* IMAGE2DARRAY */ + YYSYMBOL_IIMAGE2DARRAY = 236, /* IIMAGE2DARRAY */ + YYSYMBOL_UIMAGE2DARRAY = 237, /* UIMAGE2DARRAY */ + YYSYMBOL_IMAGECUBEARRAY = 238, /* IMAGECUBEARRAY */ + YYSYMBOL_IIMAGECUBEARRAY = 239, /* IIMAGECUBEARRAY */ + YYSYMBOL_UIMAGECUBEARRAY = 240, /* UIMAGECUBEARRAY */ + YYSYMBOL_IMAGE2DMS = 241, /* IMAGE2DMS */ + YYSYMBOL_IIMAGE2DMS = 242, /* IIMAGE2DMS */ + YYSYMBOL_UIMAGE2DMS = 243, /* UIMAGE2DMS */ + YYSYMBOL_IMAGE2DMSARRAY = 244, /* IMAGE2DMSARRAY */ + YYSYMBOL_IIMAGE2DMSARRAY = 245, /* IIMAGE2DMSARRAY */ + YYSYMBOL_UIMAGE2DMSARRAY = 246, /* UIMAGE2DMSARRAY */ + YYSYMBOL_F16IMAGE1D = 247, /* F16IMAGE1D */ + YYSYMBOL_F16IMAGE2D = 248, /* F16IMAGE2D */ + YYSYMBOL_F16IMAGE3D = 249, /* F16IMAGE3D */ + YYSYMBOL_F16IMAGE2DRECT = 250, /* F16IMAGE2DRECT */ + YYSYMBOL_F16IMAGECUBE = 251, /* F16IMAGECUBE */ + YYSYMBOL_F16IMAGE1DARRAY = 252, /* F16IMAGE1DARRAY */ + YYSYMBOL_F16IMAGE2DARRAY = 253, /* F16IMAGE2DARRAY */ + YYSYMBOL_F16IMAGECUBEARRAY = 254, /* F16IMAGECUBEARRAY */ + YYSYMBOL_F16IMAGEBUFFER = 255, /* F16IMAGEBUFFER */ + YYSYMBOL_F16IMAGE2DMS = 256, /* F16IMAGE2DMS */ + YYSYMBOL_F16IMAGE2DMSARRAY = 257, /* F16IMAGE2DMSARRAY */ + YYSYMBOL_I64IMAGE1D = 258, /* I64IMAGE1D */ + YYSYMBOL_U64IMAGE1D = 259, /* U64IMAGE1D */ + YYSYMBOL_I64IMAGE2D = 260, /* I64IMAGE2D */ + YYSYMBOL_U64IMAGE2D = 261, /* U64IMAGE2D */ + YYSYMBOL_I64IMAGE3D = 262, /* I64IMAGE3D */ + YYSYMBOL_U64IMAGE3D = 263, /* U64IMAGE3D */ + YYSYMBOL_I64IMAGE2DRECT = 264, /* I64IMAGE2DRECT */ + YYSYMBOL_U64IMAGE2DRECT = 265, /* U64IMAGE2DRECT */ + YYSYMBOL_I64IMAGECUBE = 266, /* I64IMAGECUBE */ + YYSYMBOL_U64IMAGECUBE = 267, /* U64IMAGECUBE */ + YYSYMBOL_I64IMAGEBUFFER = 268, /* I64IMAGEBUFFER */ + YYSYMBOL_U64IMAGEBUFFER = 269, /* U64IMAGEBUFFER */ + YYSYMBOL_I64IMAGE1DARRAY = 270, /* I64IMAGE1DARRAY */ + YYSYMBOL_U64IMAGE1DARRAY = 271, /* U64IMAGE1DARRAY */ + YYSYMBOL_I64IMAGE2DARRAY = 272, /* I64IMAGE2DARRAY */ + YYSYMBOL_U64IMAGE2DARRAY = 273, /* U64IMAGE2DARRAY */ + YYSYMBOL_I64IMAGECUBEARRAY = 274, /* I64IMAGECUBEARRAY */ + YYSYMBOL_U64IMAGECUBEARRAY = 275, /* U64IMAGECUBEARRAY */ + YYSYMBOL_I64IMAGE2DMS = 276, /* I64IMAGE2DMS */ + YYSYMBOL_U64IMAGE2DMS = 277, /* U64IMAGE2DMS */ + YYSYMBOL_I64IMAGE2DMSARRAY = 278, /* I64IMAGE2DMSARRAY */ + YYSYMBOL_U64IMAGE2DMSARRAY = 279, /* U64IMAGE2DMSARRAY */ + YYSYMBOL_TEXTURECUBEARRAY = 280, /* TEXTURECUBEARRAY */ + YYSYMBOL_ITEXTURECUBEARRAY = 281, /* ITEXTURECUBEARRAY */ + YYSYMBOL_UTEXTURECUBEARRAY = 282, /* UTEXTURECUBEARRAY */ + YYSYMBOL_TEXTURE1D = 283, /* TEXTURE1D */ + YYSYMBOL_ITEXTURE1D = 284, /* ITEXTURE1D */ + YYSYMBOL_UTEXTURE1D = 285, /* UTEXTURE1D */ + YYSYMBOL_TEXTURE1DARRAY = 286, /* TEXTURE1DARRAY */ + YYSYMBOL_ITEXTURE1DARRAY = 287, /* ITEXTURE1DARRAY */ + YYSYMBOL_UTEXTURE1DARRAY = 288, /* UTEXTURE1DARRAY */ + YYSYMBOL_TEXTURE2DRECT = 289, /* TEXTURE2DRECT */ + YYSYMBOL_ITEXTURE2DRECT = 290, /* ITEXTURE2DRECT */ + YYSYMBOL_UTEXTURE2DRECT = 291, /* UTEXTURE2DRECT */ + YYSYMBOL_TEXTUREBUFFER = 292, /* TEXTUREBUFFER */ + YYSYMBOL_ITEXTUREBUFFER = 293, /* ITEXTUREBUFFER */ + YYSYMBOL_UTEXTUREBUFFER = 294, /* UTEXTUREBUFFER */ + YYSYMBOL_TEXTURE2DMS = 295, /* TEXTURE2DMS */ + YYSYMBOL_ITEXTURE2DMS = 296, /* ITEXTURE2DMS */ + YYSYMBOL_UTEXTURE2DMS = 297, /* UTEXTURE2DMS */ + YYSYMBOL_TEXTURE2DMSARRAY = 298, /* TEXTURE2DMSARRAY */ + YYSYMBOL_ITEXTURE2DMSARRAY = 299, /* ITEXTURE2DMSARRAY */ + YYSYMBOL_UTEXTURE2DMSARRAY = 300, /* UTEXTURE2DMSARRAY */ + YYSYMBOL_F16TEXTURE1D = 301, /* F16TEXTURE1D */ + YYSYMBOL_F16TEXTURE2D = 302, /* F16TEXTURE2D */ + YYSYMBOL_F16TEXTURE3D = 303, /* F16TEXTURE3D */ + YYSYMBOL_F16TEXTURE2DRECT = 304, /* F16TEXTURE2DRECT */ + YYSYMBOL_F16TEXTURECUBE = 305, /* F16TEXTURECUBE */ + YYSYMBOL_F16TEXTURE1DARRAY = 306, /* F16TEXTURE1DARRAY */ + YYSYMBOL_F16TEXTURE2DARRAY = 307, /* F16TEXTURE2DARRAY */ + YYSYMBOL_F16TEXTURECUBEARRAY = 308, /* F16TEXTURECUBEARRAY */ + YYSYMBOL_F16TEXTUREBUFFER = 309, /* F16TEXTUREBUFFER */ + YYSYMBOL_F16TEXTURE2DMS = 310, /* F16TEXTURE2DMS */ + YYSYMBOL_F16TEXTURE2DMSARRAY = 311, /* F16TEXTURE2DMSARRAY */ + YYSYMBOL_SUBPASSINPUT = 312, /* SUBPASSINPUT */ + YYSYMBOL_SUBPASSINPUTMS = 313, /* SUBPASSINPUTMS */ + YYSYMBOL_ISUBPASSINPUT = 314, /* ISUBPASSINPUT */ + YYSYMBOL_ISUBPASSINPUTMS = 315, /* ISUBPASSINPUTMS */ + YYSYMBOL_USUBPASSINPUT = 316, /* USUBPASSINPUT */ + YYSYMBOL_USUBPASSINPUTMS = 317, /* USUBPASSINPUTMS */ + YYSYMBOL_F16SUBPASSINPUT = 318, /* F16SUBPASSINPUT */ + YYSYMBOL_F16SUBPASSINPUTMS = 319, /* F16SUBPASSINPUTMS */ + YYSYMBOL_SPIRV_INSTRUCTION = 320, /* SPIRV_INSTRUCTION */ + YYSYMBOL_SPIRV_EXECUTION_MODE = 321, /* SPIRV_EXECUTION_MODE */ + YYSYMBOL_SPIRV_EXECUTION_MODE_ID = 322, /* SPIRV_EXECUTION_MODE_ID */ + YYSYMBOL_SPIRV_DECORATE = 323, /* SPIRV_DECORATE */ + YYSYMBOL_SPIRV_DECORATE_ID = 324, /* SPIRV_DECORATE_ID */ + YYSYMBOL_SPIRV_DECORATE_STRING = 325, /* SPIRV_DECORATE_STRING */ + YYSYMBOL_SPIRV_TYPE = 326, /* SPIRV_TYPE */ + YYSYMBOL_SPIRV_STORAGE_CLASS = 327, /* SPIRV_STORAGE_CLASS */ + YYSYMBOL_SPIRV_BY_REFERENCE = 328, /* SPIRV_BY_REFERENCE */ + YYSYMBOL_SPIRV_LITERAL = 329, /* SPIRV_LITERAL */ + YYSYMBOL_ATTACHMENTEXT = 330, /* ATTACHMENTEXT */ + YYSYMBOL_IATTACHMENTEXT = 331, /* IATTACHMENTEXT */ + YYSYMBOL_UATTACHMENTEXT = 332, /* UATTACHMENTEXT */ + YYSYMBOL_LEFT_OP = 333, /* LEFT_OP */ + YYSYMBOL_RIGHT_OP = 334, /* RIGHT_OP */ + YYSYMBOL_INC_OP = 335, /* INC_OP */ + YYSYMBOL_DEC_OP = 336, /* DEC_OP */ + YYSYMBOL_LE_OP = 337, /* LE_OP */ + YYSYMBOL_GE_OP = 338, /* GE_OP */ + YYSYMBOL_EQ_OP = 339, /* EQ_OP */ + YYSYMBOL_NE_OP = 340, /* NE_OP */ + YYSYMBOL_AND_OP = 341, /* AND_OP */ + YYSYMBOL_OR_OP = 342, /* OR_OP */ + YYSYMBOL_XOR_OP = 343, /* XOR_OP */ + YYSYMBOL_MUL_ASSIGN = 344, /* MUL_ASSIGN */ + YYSYMBOL_DIV_ASSIGN = 345, /* DIV_ASSIGN */ + YYSYMBOL_ADD_ASSIGN = 346, /* ADD_ASSIGN */ + YYSYMBOL_MOD_ASSIGN = 347, /* MOD_ASSIGN */ + YYSYMBOL_LEFT_ASSIGN = 348, /* LEFT_ASSIGN */ + YYSYMBOL_RIGHT_ASSIGN = 349, /* RIGHT_ASSIGN */ + YYSYMBOL_AND_ASSIGN = 350, /* AND_ASSIGN */ + YYSYMBOL_XOR_ASSIGN = 351, /* XOR_ASSIGN */ + YYSYMBOL_OR_ASSIGN = 352, /* OR_ASSIGN */ + YYSYMBOL_SUB_ASSIGN = 353, /* SUB_ASSIGN */ + YYSYMBOL_STRING_LITERAL = 354, /* STRING_LITERAL */ + YYSYMBOL_LEFT_PAREN = 355, /* LEFT_PAREN */ + YYSYMBOL_RIGHT_PAREN = 356, /* RIGHT_PAREN */ + YYSYMBOL_LEFT_BRACKET = 357, /* LEFT_BRACKET */ + YYSYMBOL_RIGHT_BRACKET = 358, /* RIGHT_BRACKET */ + YYSYMBOL_LEFT_BRACE = 359, /* LEFT_BRACE */ + YYSYMBOL_RIGHT_BRACE = 360, /* RIGHT_BRACE */ + YYSYMBOL_DOT = 361, /* DOT */ + YYSYMBOL_COMMA = 362, /* COMMA */ + YYSYMBOL_COLON = 363, /* COLON */ + YYSYMBOL_EQUAL = 364, /* EQUAL */ + YYSYMBOL_SEMICOLON = 365, /* SEMICOLON */ + YYSYMBOL_BANG = 366, /* BANG */ + YYSYMBOL_DASH = 367, /* DASH */ + YYSYMBOL_TILDE = 368, /* TILDE */ + YYSYMBOL_PLUS = 369, /* PLUS */ + YYSYMBOL_STAR = 370, /* STAR */ + YYSYMBOL_SLASH = 371, /* SLASH */ + YYSYMBOL_PERCENT = 372, /* PERCENT */ + YYSYMBOL_LEFT_ANGLE = 373, /* LEFT_ANGLE */ + YYSYMBOL_RIGHT_ANGLE = 374, /* RIGHT_ANGLE */ + YYSYMBOL_VERTICAL_BAR = 375, /* VERTICAL_BAR */ + YYSYMBOL_CARET = 376, /* CARET */ + YYSYMBOL_AMPERSAND = 377, /* AMPERSAND */ + YYSYMBOL_QUESTION = 378, /* QUESTION */ + YYSYMBOL_INVARIANT = 379, /* INVARIANT */ + YYSYMBOL_HIGH_PRECISION = 380, /* HIGH_PRECISION */ + YYSYMBOL_MEDIUM_PRECISION = 381, /* MEDIUM_PRECISION */ + YYSYMBOL_LOW_PRECISION = 382, /* LOW_PRECISION */ + YYSYMBOL_PRECISION = 383, /* PRECISION */ + YYSYMBOL_PACKED = 384, /* PACKED */ + YYSYMBOL_RESOURCE = 385, /* RESOURCE */ + YYSYMBOL_SUPERP = 386, /* SUPERP */ + YYSYMBOL_FLOATCONSTANT = 387, /* FLOATCONSTANT */ + YYSYMBOL_INTCONSTANT = 388, /* INTCONSTANT */ + YYSYMBOL_UINTCONSTANT = 389, /* UINTCONSTANT */ + YYSYMBOL_BOOLCONSTANT = 390, /* BOOLCONSTANT */ + YYSYMBOL_IDENTIFIER = 391, /* IDENTIFIER */ + YYSYMBOL_TYPE_NAME = 392, /* TYPE_NAME */ + YYSYMBOL_CENTROID = 393, /* CENTROID */ + YYSYMBOL_IN = 394, /* IN */ + YYSYMBOL_OUT = 395, /* OUT */ + YYSYMBOL_INOUT = 396, /* INOUT */ + YYSYMBOL_STRUCT = 397, /* STRUCT */ + YYSYMBOL_VOID = 398, /* VOID */ + YYSYMBOL_WHILE = 399, /* WHILE */ + YYSYMBOL_BREAK = 400, /* BREAK */ + YYSYMBOL_CONTINUE = 401, /* CONTINUE */ + YYSYMBOL_DO = 402, /* DO */ + YYSYMBOL_ELSE = 403, /* ELSE */ + YYSYMBOL_FOR = 404, /* FOR */ + YYSYMBOL_IF = 405, /* IF */ + YYSYMBOL_DISCARD = 406, /* DISCARD */ + YYSYMBOL_RETURN = 407, /* RETURN */ + YYSYMBOL_SWITCH = 408, /* SWITCH */ + YYSYMBOL_CASE = 409, /* CASE */ + YYSYMBOL_DEFAULT = 410, /* DEFAULT */ + YYSYMBOL_TERMINATE_INVOCATION = 411, /* TERMINATE_INVOCATION */ + YYSYMBOL_TERMINATE_RAY = 412, /* TERMINATE_RAY */ + YYSYMBOL_IGNORE_INTERSECTION = 413, /* IGNORE_INTERSECTION */ + YYSYMBOL_UNIFORM = 414, /* UNIFORM */ + YYSYMBOL_SHARED = 415, /* SHARED */ + YYSYMBOL_BUFFER = 416, /* BUFFER */ + YYSYMBOL_TILEIMAGEEXT = 417, /* TILEIMAGEEXT */ + YYSYMBOL_FLAT = 418, /* FLAT */ + YYSYMBOL_SMOOTH = 419, /* SMOOTH */ + YYSYMBOL_LAYOUT = 420, /* LAYOUT */ + YYSYMBOL_DOUBLECONSTANT = 421, /* DOUBLECONSTANT */ + YYSYMBOL_INT16CONSTANT = 422, /* INT16CONSTANT */ + YYSYMBOL_UINT16CONSTANT = 423, /* UINT16CONSTANT */ + YYSYMBOL_FLOAT16CONSTANT = 424, /* FLOAT16CONSTANT */ + YYSYMBOL_INT32CONSTANT = 425, /* INT32CONSTANT */ + YYSYMBOL_UINT32CONSTANT = 426, /* UINT32CONSTANT */ + YYSYMBOL_INT64CONSTANT = 427, /* INT64CONSTANT */ + YYSYMBOL_UINT64CONSTANT = 428, /* UINT64CONSTANT */ + YYSYMBOL_SUBROUTINE = 429, /* SUBROUTINE */ + YYSYMBOL_DEMOTE = 430, /* DEMOTE */ + YYSYMBOL_PAYLOADNV = 431, /* PAYLOADNV */ + YYSYMBOL_PAYLOADINNV = 432, /* PAYLOADINNV */ + YYSYMBOL_HITATTRNV = 433, /* HITATTRNV */ + YYSYMBOL_CALLDATANV = 434, /* CALLDATANV */ + YYSYMBOL_CALLDATAINNV = 435, /* CALLDATAINNV */ + YYSYMBOL_PAYLOADEXT = 436, /* PAYLOADEXT */ + YYSYMBOL_PAYLOADINEXT = 437, /* PAYLOADINEXT */ + YYSYMBOL_HITATTREXT = 438, /* HITATTREXT */ + YYSYMBOL_CALLDATAEXT = 439, /* CALLDATAEXT */ + YYSYMBOL_CALLDATAINEXT = 440, /* CALLDATAINEXT */ + YYSYMBOL_PATCH = 441, /* PATCH */ + YYSYMBOL_SAMPLE = 442, /* SAMPLE */ + YYSYMBOL_NONUNIFORM = 443, /* NONUNIFORM */ + YYSYMBOL_COHERENT = 444, /* COHERENT */ + YYSYMBOL_VOLATILE = 445, /* VOLATILE */ + YYSYMBOL_RESTRICT = 446, /* RESTRICT */ + YYSYMBOL_READONLY = 447, /* READONLY */ + YYSYMBOL_WRITEONLY = 448, /* WRITEONLY */ + YYSYMBOL_DEVICECOHERENT = 449, /* DEVICECOHERENT */ + YYSYMBOL_QUEUEFAMILYCOHERENT = 450, /* QUEUEFAMILYCOHERENT */ + YYSYMBOL_WORKGROUPCOHERENT = 451, /* WORKGROUPCOHERENT */ + YYSYMBOL_SUBGROUPCOHERENT = 452, /* SUBGROUPCOHERENT */ + YYSYMBOL_NONPRIVATE = 453, /* NONPRIVATE */ + YYSYMBOL_SHADERCALLCOHERENT = 454, /* SHADERCALLCOHERENT */ + YYSYMBOL_NOPERSPECTIVE = 455, /* NOPERSPECTIVE */ + YYSYMBOL_EXPLICITINTERPAMD = 456, /* EXPLICITINTERPAMD */ + YYSYMBOL_PERVERTEXEXT = 457, /* PERVERTEXEXT */ + YYSYMBOL_PERVERTEXNV = 458, /* PERVERTEXNV */ + YYSYMBOL_PERPRIMITIVENV = 459, /* PERPRIMITIVENV */ + YYSYMBOL_PERVIEWNV = 460, /* PERVIEWNV */ + YYSYMBOL_PERTASKNV = 461, /* PERTASKNV */ + YYSYMBOL_PERPRIMITIVEEXT = 462, /* PERPRIMITIVEEXT */ + YYSYMBOL_TASKPAYLOADWORKGROUPEXT = 463, /* TASKPAYLOADWORKGROUPEXT */ + YYSYMBOL_PRECISE = 464, /* PRECISE */ + YYSYMBOL_YYACCEPT = 465, /* $accept */ + YYSYMBOL_variable_identifier = 466, /* variable_identifier */ + YYSYMBOL_primary_expression = 467, /* primary_expression */ + YYSYMBOL_postfix_expression = 468, /* postfix_expression */ + YYSYMBOL_integer_expression = 469, /* integer_expression */ + YYSYMBOL_function_call = 470, /* function_call */ + YYSYMBOL_function_call_or_method = 471, /* function_call_or_method */ + YYSYMBOL_function_call_generic = 472, /* function_call_generic */ + YYSYMBOL_function_call_header_no_parameters = 473, /* function_call_header_no_parameters */ + YYSYMBOL_function_call_header_with_parameters = 474, /* function_call_header_with_parameters */ + YYSYMBOL_function_call_header = 475, /* function_call_header */ + YYSYMBOL_function_identifier = 476, /* function_identifier */ + YYSYMBOL_unary_expression = 477, /* unary_expression */ + YYSYMBOL_unary_operator = 478, /* unary_operator */ + YYSYMBOL_multiplicative_expression = 479, /* multiplicative_expression */ + YYSYMBOL_additive_expression = 480, /* additive_expression */ + YYSYMBOL_shift_expression = 481, /* shift_expression */ + YYSYMBOL_relational_expression = 482, /* relational_expression */ + YYSYMBOL_equality_expression = 483, /* equality_expression */ + YYSYMBOL_and_expression = 484, /* and_expression */ + YYSYMBOL_exclusive_or_expression = 485, /* exclusive_or_expression */ + YYSYMBOL_inclusive_or_expression = 486, /* inclusive_or_expression */ + YYSYMBOL_logical_and_expression = 487, /* logical_and_expression */ + YYSYMBOL_logical_xor_expression = 488, /* logical_xor_expression */ + YYSYMBOL_logical_or_expression = 489, /* logical_or_expression */ + YYSYMBOL_conditional_expression = 490, /* conditional_expression */ + YYSYMBOL_491_1 = 491, /* $@1 */ + YYSYMBOL_assignment_expression = 492, /* assignment_expression */ + YYSYMBOL_assignment_operator = 493, /* assignment_operator */ + YYSYMBOL_expression = 494, /* expression */ + YYSYMBOL_constant_expression = 495, /* constant_expression */ + YYSYMBOL_declaration = 496, /* declaration */ + YYSYMBOL_block_structure = 497, /* block_structure */ + YYSYMBOL_498_2 = 498, /* $@2 */ + YYSYMBOL_identifier_list = 499, /* identifier_list */ + YYSYMBOL_function_prototype = 500, /* function_prototype */ + YYSYMBOL_function_declarator = 501, /* function_declarator */ + YYSYMBOL_function_header_with_parameters = 502, /* function_header_with_parameters */ + YYSYMBOL_function_header = 503, /* function_header */ + YYSYMBOL_parameter_declarator = 504, /* parameter_declarator */ + YYSYMBOL_parameter_declaration = 505, /* parameter_declaration */ + YYSYMBOL_parameter_type_specifier = 506, /* parameter_type_specifier */ + YYSYMBOL_init_declarator_list = 507, /* init_declarator_list */ + YYSYMBOL_single_declaration = 508, /* single_declaration */ + YYSYMBOL_fully_specified_type = 509, /* fully_specified_type */ + YYSYMBOL_invariant_qualifier = 510, /* invariant_qualifier */ + YYSYMBOL_interpolation_qualifier = 511, /* interpolation_qualifier */ + YYSYMBOL_layout_qualifier = 512, /* layout_qualifier */ + YYSYMBOL_layout_qualifier_id_list = 513, /* layout_qualifier_id_list */ + YYSYMBOL_layout_qualifier_id = 514, /* layout_qualifier_id */ + YYSYMBOL_precise_qualifier = 515, /* precise_qualifier */ + YYSYMBOL_type_qualifier = 516, /* type_qualifier */ + YYSYMBOL_single_type_qualifier = 517, /* single_type_qualifier */ + YYSYMBOL_storage_qualifier = 518, /* storage_qualifier */ + YYSYMBOL_non_uniform_qualifier = 519, /* non_uniform_qualifier */ + YYSYMBOL_type_name_list = 520, /* type_name_list */ + YYSYMBOL_type_specifier = 521, /* type_specifier */ + YYSYMBOL_array_specifier = 522, /* array_specifier */ + YYSYMBOL_type_parameter_specifier_opt = 523, /* type_parameter_specifier_opt */ + YYSYMBOL_type_parameter_specifier = 524, /* type_parameter_specifier */ + YYSYMBOL_type_parameter_specifier_list = 525, /* type_parameter_specifier_list */ + YYSYMBOL_type_specifier_nonarray = 526, /* type_specifier_nonarray */ + YYSYMBOL_precision_qualifier = 527, /* precision_qualifier */ + YYSYMBOL_struct_specifier = 528, /* struct_specifier */ + YYSYMBOL_529_3 = 529, /* $@3 */ + YYSYMBOL_530_4 = 530, /* $@4 */ + YYSYMBOL_struct_declaration_list = 531, /* struct_declaration_list */ + YYSYMBOL_struct_declaration = 532, /* struct_declaration */ + YYSYMBOL_struct_declarator_list = 533, /* struct_declarator_list */ + YYSYMBOL_struct_declarator = 534, /* struct_declarator */ + YYSYMBOL_initializer = 535, /* initializer */ + YYSYMBOL_initializer_list = 536, /* initializer_list */ + YYSYMBOL_declaration_statement = 537, /* declaration_statement */ + YYSYMBOL_statement = 538, /* statement */ + YYSYMBOL_simple_statement = 539, /* simple_statement */ + YYSYMBOL_demote_statement = 540, /* demote_statement */ + YYSYMBOL_compound_statement = 541, /* compound_statement */ + YYSYMBOL_542_5 = 542, /* $@5 */ + YYSYMBOL_543_6 = 543, /* $@6 */ + YYSYMBOL_statement_no_new_scope = 544, /* statement_no_new_scope */ + YYSYMBOL_statement_scoped = 545, /* statement_scoped */ + YYSYMBOL_546_7 = 546, /* $@7 */ + YYSYMBOL_547_8 = 547, /* $@8 */ + YYSYMBOL_compound_statement_no_new_scope = 548, /* compound_statement_no_new_scope */ + YYSYMBOL_statement_list = 549, /* statement_list */ + YYSYMBOL_expression_statement = 550, /* expression_statement */ + YYSYMBOL_selection_statement = 551, /* selection_statement */ + YYSYMBOL_selection_statement_nonattributed = 552, /* selection_statement_nonattributed */ + YYSYMBOL_selection_rest_statement = 553, /* selection_rest_statement */ + YYSYMBOL_condition = 554, /* condition */ + YYSYMBOL_switch_statement = 555, /* switch_statement */ + YYSYMBOL_switch_statement_nonattributed = 556, /* switch_statement_nonattributed */ + YYSYMBOL_557_9 = 557, /* $@9 */ + YYSYMBOL_switch_statement_list = 558, /* switch_statement_list */ + YYSYMBOL_case_label = 559, /* case_label */ + YYSYMBOL_iteration_statement = 560, /* iteration_statement */ + YYSYMBOL_iteration_statement_nonattributed = 561, /* iteration_statement_nonattributed */ + YYSYMBOL_562_10 = 562, /* $@10 */ + YYSYMBOL_563_11 = 563, /* $@11 */ + YYSYMBOL_564_12 = 564, /* $@12 */ + YYSYMBOL_for_init_statement = 565, /* for_init_statement */ + YYSYMBOL_conditionopt = 566, /* conditionopt */ + YYSYMBOL_for_rest_statement = 567, /* for_rest_statement */ + YYSYMBOL_jump_statement = 568, /* jump_statement */ + YYSYMBOL_translation_unit = 569, /* translation_unit */ + YYSYMBOL_external_declaration = 570, /* external_declaration */ + YYSYMBOL_function_definition = 571, /* function_definition */ + YYSYMBOL_572_13 = 572, /* $@13 */ + YYSYMBOL_attribute = 573, /* attribute */ + YYSYMBOL_attribute_list = 574, /* attribute_list */ + YYSYMBOL_single_attribute = 575, /* single_attribute */ + YYSYMBOL_spirv_requirements_list = 576, /* spirv_requirements_list */ + YYSYMBOL_spirv_requirements_parameter = 577, /* spirv_requirements_parameter */ + YYSYMBOL_spirv_extension_list = 578, /* spirv_extension_list */ + YYSYMBOL_spirv_capability_list = 579, /* spirv_capability_list */ + YYSYMBOL_spirv_execution_mode_qualifier = 580, /* spirv_execution_mode_qualifier */ + YYSYMBOL_spirv_execution_mode_parameter_list = 581, /* spirv_execution_mode_parameter_list */ + YYSYMBOL_spirv_execution_mode_parameter = 582, /* spirv_execution_mode_parameter */ + YYSYMBOL_spirv_execution_mode_id_parameter_list = 583, /* spirv_execution_mode_id_parameter_list */ + YYSYMBOL_spirv_storage_class_qualifier = 584, /* spirv_storage_class_qualifier */ + YYSYMBOL_spirv_decorate_qualifier = 585, /* spirv_decorate_qualifier */ + YYSYMBOL_spirv_decorate_parameter_list = 586, /* spirv_decorate_parameter_list */ + YYSYMBOL_spirv_decorate_parameter = 587, /* spirv_decorate_parameter */ + YYSYMBOL_spirv_decorate_id_parameter_list = 588, /* spirv_decorate_id_parameter_list */ + YYSYMBOL_spirv_decorate_id_parameter = 589, /* spirv_decorate_id_parameter */ + YYSYMBOL_spirv_decorate_string_parameter_list = 590, /* spirv_decorate_string_parameter_list */ + YYSYMBOL_spirv_type_specifier = 591, /* spirv_type_specifier */ + YYSYMBOL_spirv_type_parameter_list = 592, /* spirv_type_parameter_list */ + YYSYMBOL_spirv_type_parameter = 593, /* spirv_type_parameter */ + YYSYMBOL_spirv_instruction_qualifier = 594, /* spirv_instruction_qualifier */ + YYSYMBOL_spirv_instruction_qualifier_list = 595, /* spirv_instruction_qualifier_list */ + YYSYMBOL_spirv_instruction_qualifier_id = 596 /* spirv_instruction_qualifier_id */ }; typedef enum yysymbol_kind_t yysymbol_kind_t; /* Second part of user prologue. */ -#line 136 "MachineIndependent/glslang.y" +#line 111 "MachineIndependent/glslang.y" /* windows only pragma */ @@ -731,7 +739,7 @@ typedef enum yysymbol_kind_t yysymbol_kind_t; extern int yylex(YYSTYPE*, TParseContext&); -#line 735 "MachineIndependent/glslang_tab.cpp" +#line 743 "MachineIndependent/glslang_tab.cpp" #ifdef short @@ -771,6 +779,18 @@ typedef int_least16_t yytype_int16; typedef short yytype_int16; #endif +/* Work around bug in HP-UX 11.23, which defines these macros + incorrectly for preprocessor constants. This workaround can likely + be removed in 2023, as HPE has promised support for HP-UX 11.23 + (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of + . */ +#ifdef __hpux +# undef UINT_LEAST8_MAX +# undef UINT_LEAST16_MAX +# define UINT_LEAST8_MAX 255 +# define UINT_LEAST16_MAX 65535 +#endif + #if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ typedef __UINT_LEAST8_TYPE__ yytype_uint8; #elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ @@ -868,17 +888,23 @@ typedef int yy_state_fast_t; /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ -# define YYUSE(E) ((void) (E)) +# define YY_USE(E) ((void) (E)) #else -# define YYUSE(E) /* empty */ +# define YY_USE(E) /* empty */ #endif -#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ /* Suppress an incorrect diagnostic about yylval being uninitialized. */ -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ +#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__ +# if __GNUC__ * 100 + __GNUC_MINOR__ < 407 +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") +# else +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# endif # define YY_IGNORE_MAYBE_UNINITIALIZED_END \ _Pragma ("GCC diagnostic pop") #else @@ -1035,21 +1061,21 @@ union yyalloc #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ -#define YYFINAL 445 +#define YYFINAL 452 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 12503 +#define YYLAST 12701 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 458 +#define YYNTOKENS 465 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 131 +#define YYNNTS 132 /* YYNRULES -- Number of rules. */ -#define YYNRULES 686 +#define YYNRULES 700 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 932 +#define YYNSTATES 946 /* YYMAXUTOK -- Last valid token kind. */ -#define YYMAXUTOK 712 +#define YYMAXUTOK 719 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM @@ -1134,82 +1160,84 @@ static const yytype_int16 yytranslate[] = 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 455, 456, 457 + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464 }; #if YYDEBUG - /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { - 0, 392, 392, 398, 401, 406, 409, 412, 416, 420, - 423, 427, 431, 435, 439, 443, 447, 453, 461, 464, - 467, 470, 473, 478, 486, 493, 500, 506, 510, 517, - 520, 526, 533, 543, 551, 556, 584, 593, 599, 603, - 607, 627, 628, 629, 630, 636, 637, 642, 647, 656, - 657, 662, 670, 671, 677, 686, 687, 692, 697, 702, - 710, 711, 720, 732, 733, 742, 743, 752, 753, 762, - 763, 771, 772, 780, 781, 789, 790, 790, 808, 809, - 825, 829, 833, 837, 842, 846, 850, 854, 858, 862, - 866, 873, 876, 887, 894, 900, 907, 913, 918, 925, - 929, 933, 937, 942, 947, 956, 956, 967, 971, 978, - 982, 988, 994, 1004, 1007, 1014, 1022, 1042, 1065, 1080, - 1105, 1116, 1126, 1136, 1146, 1155, 1158, 1162, 1166, 1171, - 1179, 1186, 1191, 1196, 1201, 1210, 1220, 1247, 1256, 1263, - 1271, 1278, 1285, 1293, 1301, 1311, 1321, 1328, 1339, 1345, - 1348, 1355, 1359, 1363, 1372, 1382, 1385, 1396, 1399, 1402, - 1406, 1410, 1415, 1419, 1422, 1427, 1431, 1436, 1445, 1449, - 1454, 1460, 1466, 1473, 1478, 1486, 1492, 1504, 1518, 1524, - 1529, 1537, 1545, 1553, 1561, 1569, 1577, 1585, 1593, 1600, - 1607, 1611, 1616, 1621, 1626, 1631, 1636, 1641, 1645, 1649, - 1653, 1657, 1663, 1669, 1681, 1688, 1691, 1700, 1705, 1715, - 1720, 1728, 1732, 1742, 1745, 1751, 1757, 1764, 1774, 1778, - 1782, 1786, 1791, 1795, 1800, 1805, 1810, 1815, 1820, 1825, - 1830, 1835, 1840, 1846, 1852, 1858, 1863, 1868, 1873, 1878, - 1883, 1888, 1893, 1898, 1903, 1908, 1913, 1919, 1926, 1931, - 1936, 1941, 1946, 1951, 1956, 1961, 1966, 1971, 1976, 1981, - 1989, 1997, 2005, 2011, 2017, 2023, 2029, 2035, 2041, 2047, - 2053, 2059, 2065, 2071, 2077, 2083, 2089, 2095, 2101, 2107, - 2113, 2119, 2125, 2131, 2137, 2143, 2149, 2155, 2161, 2167, - 2173, 2179, 2185, 2191, 2197, 2203, 2211, 2219, 2227, 2235, - 2243, 2251, 2259, 2267, 2275, 2283, 2291, 2299, 2305, 2311, - 2317, 2323, 2329, 2335, 2341, 2347, 2353, 2359, 2365, 2371, - 2377, 2383, 2389, 2395, 2401, 2407, 2413, 2419, 2425, 2431, - 2437, 2443, 2449, 2455, 2461, 2467, 2473, 2479, 2485, 2491, - 2497, 2503, 2509, 2515, 2519, 2523, 2527, 2532, 2538, 2543, - 2548, 2553, 2558, 2563, 2568, 2574, 2579, 2584, 2589, 2594, - 2599, 2605, 2611, 2617, 2623, 2629, 2635, 2641, 2647, 2653, - 2659, 2665, 2671, 2677, 2683, 2688, 2693, 2698, 2703, 2708, - 2713, 2719, 2724, 2729, 2734, 2739, 2744, 2749, 2754, 2760, - 2765, 2770, 2775, 2780, 2785, 2790, 2795, 2800, 2805, 2810, - 2815, 2820, 2825, 2830, 2836, 2841, 2846, 2852, 2858, 2863, - 2868, 2873, 2879, 2884, 2889, 2894, 2900, 2905, 2910, 2915, - 2921, 2926, 2931, 2936, 2942, 2948, 2954, 2960, 2965, 2971, - 2977, 2983, 2988, 2993, 2998, 3003, 3008, 3014, 3019, 3024, - 3029, 3035, 3040, 3045, 3050, 3056, 3061, 3066, 3071, 3077, - 3082, 3087, 3092, 3098, 3103, 3108, 3113, 3119, 3124, 3129, - 3134, 3140, 3145, 3150, 3155, 3161, 3166, 3171, 3176, 3182, - 3187, 3192, 3197, 3203, 3208, 3213, 3218, 3224, 3229, 3234, - 3239, 3245, 3250, 3255, 3260, 3266, 3271, 3276, 3281, 3287, - 3292, 3297, 3302, 3308, 3313, 3318, 3323, 3328, 3333, 3338, - 3343, 3348, 3353, 3358, 3363, 3368, 3373, 3378, 3383, 3388, - 3393, 3398, 3403, 3408, 3413, 3418, 3423, 3428, 3434, 3440, - 3446, 3452, 3459, 3466, 3472, 3478, 3484, 3490, 3496, 3502, - 3508, 3513, 3518, 3534, 3539, 3544, 3552, 3552, 3563, 3563, - 3573, 3576, 3589, 3611, 3638, 3642, 3648, 3653, 3664, 3668, - 3674, 3680, 3691, 3694, 3701, 3705, 3706, 3712, 3713, 3714, - 3715, 3716, 3717, 3718, 3720, 3726, 3735, 3736, 3740, 3736, - 3752, 3753, 3757, 3757, 3764, 3764, 3778, 3781, 3789, 3797, - 3808, 3809, 3813, 3817, 3825, 3832, 3836, 3844, 3848, 3861, - 3865, 3873, 3873, 3893, 3896, 3902, 3914, 3926, 3930, 3938, - 3938, 3953, 3953, 3971, 3971, 3992, 3995, 4001, 4004, 4010, - 4014, 4021, 4026, 4031, 4038, 4041, 4045, 4050, 4054, 4064, - 4068, 4077, 4080, 4084, 4093, 4093, 4135, 4140, 4143, 4148, - 4151, 4158, 4161, 4166, 4169, 4174, 4177, 4182, 4185, 4190, - 4194, 4199, 4203, 4208, 4212, 4219, 4222, 4227, 4230, 4233, - 4236, 4239, 4244, 4253, 4264, 4269, 4277, 4281, 4286, 4290, - 4295, 4299, 4304, 4308, 4315, 4318, 4323, 4326, 4329, 4332, - 4337, 4345, 4355, 4359, 4364, 4368, 4373, 4377, 4384, 4387, - 4392, 4397, 4400, 4406, 4409, 4414, 4417 + 0, 362, 362, 368, 371, 376, 379, 382, 386, 389, + 392, 396, 400, 404, 408, 412, 416, 422, 429, 432, + 435, 438, 441, 446, 454, 461, 468, 474, 478, 485, + 488, 494, 501, 511, 519, 524, 551, 559, 565, 569, + 573, 593, 594, 595, 596, 602, 603, 608, 613, 622, + 623, 628, 636, 637, 643, 652, 653, 658, 663, 668, + 676, 677, 686, 698, 699, 708, 709, 718, 719, 728, + 729, 737, 738, 746, 747, 755, 756, 756, 774, 775, + 791, 795, 799, 803, 808, 812, 816, 820, 824, 828, + 832, 839, 842, 853, 860, 865, 872, 877, 882, 889, + 893, 897, 901, 906, 911, 920, 920, 931, 935, 942, + 947, 953, 959, 969, 972, 979, 987, 1007, 1030, 1045, + 1070, 1081, 1091, 1101, 1111, 1120, 1123, 1127, 1131, 1136, + 1144, 1149, 1154, 1159, 1164, 1173, 1183, 1210, 1219, 1226, + 1233, 1240, 1247, 1255, 1263, 1273, 1283, 1290, 1300, 1306, + 1309, 1316, 1320, 1324, 1332, 1341, 1344, 1355, 1358, 1361, + 1365, 1369, 1373, 1377, 1380, 1385, 1389, 1394, 1402, 1406, + 1411, 1417, 1423, 1430, 1435, 1440, 1448, 1453, 1465, 1479, + 1485, 1490, 1498, 1506, 1514, 1522, 1530, 1538, 1546, 1554, + 1562, 1569, 1576, 1580, 1585, 1590, 1595, 1600, 1605, 1610, + 1614, 1618, 1622, 1626, 1632, 1638, 1648, 1655, 1658, 1666, + 1673, 1684, 1689, 1697, 1701, 1711, 1714, 1720, 1726, 1731, + 1739, 1749, 1753, 1757, 1761, 1766, 1770, 1775, 1780, 1785, + 1790, 1795, 1800, 1805, 1810, 1815, 1821, 1827, 1833, 1838, + 1843, 1848, 1853, 1858, 1863, 1868, 1873, 1878, 1883, 1888, + 1893, 1900, 1905, 1910, 1915, 1920, 1925, 1930, 1935, 1940, + 1945, 1950, 1955, 1963, 1971, 1979, 1985, 1991, 1997, 2003, + 2009, 2015, 2021, 2027, 2033, 2039, 2045, 2051, 2057, 2063, + 2069, 2075, 2081, 2087, 2093, 2099, 2105, 2111, 2117, 2123, + 2129, 2135, 2141, 2147, 2153, 2159, 2165, 2171, 2177, 2185, + 2193, 2201, 2209, 2217, 2225, 2233, 2241, 2249, 2257, 2265, + 2273, 2279, 2285, 2291, 2297, 2303, 2309, 2315, 2321, 2327, + 2333, 2339, 2345, 2351, 2357, 2363, 2369, 2375, 2381, 2387, + 2393, 2399, 2405, 2411, 2417, 2423, 2429, 2435, 2441, 2447, + 2453, 2459, 2465, 2471, 2477, 2483, 2489, 2493, 2497, 2501, + 2506, 2511, 2516, 2521, 2526, 2531, 2536, 2541, 2546, 2551, + 2556, 2561, 2566, 2571, 2577, 2583, 2589, 2595, 2601, 2607, + 2613, 2619, 2625, 2631, 2637, 2643, 2649, 2654, 2659, 2664, + 2669, 2674, 2679, 2684, 2689, 2694, 2699, 2704, 2709, 2714, + 2719, 2724, 2729, 2734, 2739, 2744, 2749, 2754, 2759, 2764, + 2769, 2774, 2779, 2784, 2789, 2794, 2799, 2804, 2809, 2814, + 2820, 2826, 2831, 2836, 2841, 2847, 2852, 2857, 2862, 2868, + 2873, 2878, 2883, 2889, 2894, 2899, 2904, 2910, 2916, 2922, + 2928, 2933, 2939, 2945, 2951, 2956, 2961, 2966, 2971, 2976, + 2982, 2987, 2992, 2997, 3003, 3008, 3013, 3018, 3024, 3029, + 3034, 3039, 3045, 3050, 3055, 3060, 3066, 3071, 3076, 3081, + 3087, 3092, 3097, 3102, 3108, 3113, 3118, 3123, 3129, 3134, + 3139, 3144, 3150, 3155, 3160, 3165, 3171, 3176, 3181, 3186, + 3192, 3197, 3202, 3207, 3213, 3218, 3223, 3228, 3234, 3239, + 3244, 3249, 3255, 3260, 3265, 3270, 3276, 3281, 3286, 3291, + 3296, 3301, 3306, 3311, 3316, 3321, 3326, 3331, 3336, 3341, + 3346, 3351, 3356, 3361, 3366, 3371, 3376, 3381, 3386, 3391, + 3396, 3402, 3408, 3414, 3420, 3426, 3432, 3438, 3445, 3452, + 3458, 3464, 3470, 3476, 3483, 3490, 3497, 3504, 3508, 3512, + 3517, 3533, 3538, 3543, 3551, 3551, 3562, 3562, 3572, 3575, + 3588, 3610, 3637, 3641, 3647, 3652, 3663, 3666, 3672, 3678, + 3687, 3690, 3696, 3700, 3701, 3707, 3708, 3709, 3710, 3711, + 3712, 3713, 3714, 3718, 3726, 3727, 3731, 3727, 3743, 3744, + 3748, 3748, 3755, 3755, 3769, 3772, 3780, 3788, 3799, 3800, + 3804, 3807, 3814, 3821, 3825, 3833, 3837, 3850, 3853, 3860, + 3860, 3880, 3883, 3889, 3901, 3913, 3916, 3923, 3923, 3938, + 3938, 3956, 3956, 3977, 3980, 3986, 3989, 3995, 3999, 4006, + 4011, 4016, 4023, 4026, 4030, 4034, 4038, 4047, 4051, 4060, + 4063, 4066, 4074, 4074, 4116, 4121, 4124, 4129, 4132, 4137, + 4140, 4145, 4148, 4153, 4156, 4161, 4164, 4169, 4173, 4178, + 4182, 4187, 4191, 4198, 4201, 4206, 4209, 4212, 4215, 4218, + 4223, 4232, 4243, 4248, 4256, 4260, 4265, 4269, 4274, 4278, + 4283, 4287, 4294, 4297, 4302, 4305, 4308, 4311, 4316, 4319, + 4324, 4330, 4333, 4336, 4339, 4344, 4348, 4353, 4357, 4362, + 4366, 4373, 4376, 4381, 4384, 4389, 4392, 4398, 4401, 4406, + 4409 }; #endif @@ -1254,16 +1282,17 @@ static const char *const yytname[] = "F32MAT4X2", "F32MAT4X3", "F32MAT4X4", "F64MAT2X2", "F64MAT2X3", "F64MAT2X4", "F64MAT3X2", "F64MAT3X3", "F64MAT3X4", "F64MAT4X2", "F64MAT4X3", "F64MAT4X4", "ATOMIC_UINT", "ACCSTRUCTNV", "ACCSTRUCTEXT", - "RAYQUERYEXT", "FCOOPMATNV", "ICOOPMATNV", "UCOOPMATNV", - "SAMPLERCUBEARRAY", "SAMPLERCUBEARRAYSHADOW", "ISAMPLERCUBEARRAY", - "USAMPLERCUBEARRAY", "SAMPLER1D", "SAMPLER1DARRAY", - "SAMPLER1DARRAYSHADOW", "ISAMPLER1D", "SAMPLER1DSHADOW", "SAMPLER2DRECT", - "SAMPLER2DRECTSHADOW", "ISAMPLER2DRECT", "USAMPLER2DRECT", - "SAMPLERBUFFER", "ISAMPLERBUFFER", "USAMPLERBUFFER", "SAMPLER2DMS", - "ISAMPLER2DMS", "USAMPLER2DMS", "SAMPLER2DMSARRAY", "ISAMPLER2DMSARRAY", - "USAMPLER2DMSARRAY", "SAMPLEREXTERNALOES", "SAMPLEREXTERNAL2DY2YEXT", - "ISAMPLER1DARRAY", "USAMPLER1D", "USAMPLER1DARRAY", "F16SAMPLER1D", - "F16SAMPLER2D", "F16SAMPLER3D", "F16SAMPLER2DRECT", "F16SAMPLERCUBE", + "RAYQUERYEXT", "FCOOPMATNV", "ICOOPMATNV", "UCOOPMATNV", "COOPMAT", + "HITOBJECTNV", "HITOBJECTATTRNV", "SAMPLERCUBEARRAY", + "SAMPLERCUBEARRAYSHADOW", "ISAMPLERCUBEARRAY", "USAMPLERCUBEARRAY", + "SAMPLER1D", "SAMPLER1DARRAY", "SAMPLER1DARRAYSHADOW", "ISAMPLER1D", + "SAMPLER1DSHADOW", "SAMPLER2DRECT", "SAMPLER2DRECTSHADOW", + "ISAMPLER2DRECT", "USAMPLER2DRECT", "SAMPLERBUFFER", "ISAMPLERBUFFER", + "USAMPLERBUFFER", "SAMPLER2DMS", "ISAMPLER2DMS", "USAMPLER2DMS", + "SAMPLER2DMSARRAY", "ISAMPLER2DMSARRAY", "USAMPLER2DMSARRAY", + "SAMPLEREXTERNALOES", "SAMPLEREXTERNAL2DY2YEXT", "ISAMPLER1DARRAY", + "USAMPLER1D", "USAMPLER1DARRAY", "F16SAMPLER1D", "F16SAMPLER2D", + "F16SAMPLER3D", "F16SAMPLER2DRECT", "F16SAMPLERCUBE", "F16SAMPLER1DARRAY", "F16SAMPLER2DARRAY", "F16SAMPLERCUBEARRAY", "F16SAMPLERBUFFER", "F16SAMPLER2DMS", "F16SAMPLER2DMSARRAY", "F16SAMPLER1DSHADOW", "F16SAMPLER2DSHADOW", "F16SAMPLER1DARRAYSHADOW", @@ -1299,33 +1328,34 @@ static const char *const yytname[] = "F16SUBPASSINPUTMS", "SPIRV_INSTRUCTION", "SPIRV_EXECUTION_MODE", "SPIRV_EXECUTION_MODE_ID", "SPIRV_DECORATE", "SPIRV_DECORATE_ID", "SPIRV_DECORATE_STRING", "SPIRV_TYPE", "SPIRV_STORAGE_CLASS", - "SPIRV_BY_REFERENCE", "SPIRV_LITERAL", "LEFT_OP", "RIGHT_OP", "INC_OP", - "DEC_OP", "LE_OP", "GE_OP", "EQ_OP", "NE_OP", "AND_OP", "OR_OP", - "XOR_OP", "MUL_ASSIGN", "DIV_ASSIGN", "ADD_ASSIGN", "MOD_ASSIGN", - "LEFT_ASSIGN", "RIGHT_ASSIGN", "AND_ASSIGN", "XOR_ASSIGN", "OR_ASSIGN", - "SUB_ASSIGN", "STRING_LITERAL", "LEFT_PAREN", "RIGHT_PAREN", - "LEFT_BRACKET", "RIGHT_BRACKET", "LEFT_BRACE", "RIGHT_BRACE", "DOT", - "COMMA", "COLON", "EQUAL", "SEMICOLON", "BANG", "DASH", "TILDE", "PLUS", - "STAR", "SLASH", "PERCENT", "LEFT_ANGLE", "RIGHT_ANGLE", "VERTICAL_BAR", - "CARET", "AMPERSAND", "QUESTION", "INVARIANT", "HIGH_PRECISION", - "MEDIUM_PRECISION", "LOW_PRECISION", "PRECISION", "PACKED", "RESOURCE", - "SUPERP", "FLOATCONSTANT", "INTCONSTANT", "UINTCONSTANT", "BOOLCONSTANT", + "SPIRV_BY_REFERENCE", "SPIRV_LITERAL", "ATTACHMENTEXT", "IATTACHMENTEXT", + "UATTACHMENTEXT", "LEFT_OP", "RIGHT_OP", "INC_OP", "DEC_OP", "LE_OP", + "GE_OP", "EQ_OP", "NE_OP", "AND_OP", "OR_OP", "XOR_OP", "MUL_ASSIGN", + "DIV_ASSIGN", "ADD_ASSIGN", "MOD_ASSIGN", "LEFT_ASSIGN", "RIGHT_ASSIGN", + "AND_ASSIGN", "XOR_ASSIGN", "OR_ASSIGN", "SUB_ASSIGN", "STRING_LITERAL", + "LEFT_PAREN", "RIGHT_PAREN", "LEFT_BRACKET", "RIGHT_BRACKET", + "LEFT_BRACE", "RIGHT_BRACE", "DOT", "COMMA", "COLON", "EQUAL", + "SEMICOLON", "BANG", "DASH", "TILDE", "PLUS", "STAR", "SLASH", "PERCENT", + "LEFT_ANGLE", "RIGHT_ANGLE", "VERTICAL_BAR", "CARET", "AMPERSAND", + "QUESTION", "INVARIANT", "HIGH_PRECISION", "MEDIUM_PRECISION", + "LOW_PRECISION", "PRECISION", "PACKED", "RESOURCE", "SUPERP", + "FLOATCONSTANT", "INTCONSTANT", "UINTCONSTANT", "BOOLCONSTANT", "IDENTIFIER", "TYPE_NAME", "CENTROID", "IN", "OUT", "INOUT", "STRUCT", "VOID", "WHILE", "BREAK", "CONTINUE", "DO", "ELSE", "FOR", "IF", "DISCARD", "RETURN", "SWITCH", "CASE", "DEFAULT", "TERMINATE_INVOCATION", "TERMINATE_RAY", "IGNORE_INTERSECTION", "UNIFORM", "SHARED", "BUFFER", - "FLAT", "SMOOTH", "LAYOUT", "DOUBLECONSTANT", "INT16CONSTANT", - "UINT16CONSTANT", "FLOAT16CONSTANT", "INT32CONSTANT", "UINT32CONSTANT", - "INT64CONSTANT", "UINT64CONSTANT", "SUBROUTINE", "DEMOTE", "PAYLOADNV", - "PAYLOADINNV", "HITATTRNV", "CALLDATANV", "CALLDATAINNV", "PAYLOADEXT", - "PAYLOADINEXT", "HITATTREXT", "CALLDATAEXT", "CALLDATAINEXT", "PATCH", - "SAMPLE", "NONUNIFORM", "COHERENT", "VOLATILE", "RESTRICT", "READONLY", - "WRITEONLY", "DEVICECOHERENT", "QUEUEFAMILYCOHERENT", - "WORKGROUPCOHERENT", "SUBGROUPCOHERENT", "NONPRIVATE", - "SHADERCALLCOHERENT", "NOPERSPECTIVE", "EXPLICITINTERPAMD", - "PERVERTEXEXT", "PERVERTEXNV", "PERPRIMITIVENV", "PERVIEWNV", - "PERTASKNV", "PERPRIMITIVEEXT", "TASKPAYLOADWORKGROUPEXT", "PRECISE", - "$accept", "variable_identifier", "primary_expression", + "TILEIMAGEEXT", "FLAT", "SMOOTH", "LAYOUT", "DOUBLECONSTANT", + "INT16CONSTANT", "UINT16CONSTANT", "FLOAT16CONSTANT", "INT32CONSTANT", + "UINT32CONSTANT", "INT64CONSTANT", "UINT64CONSTANT", "SUBROUTINE", + "DEMOTE", "PAYLOADNV", "PAYLOADINNV", "HITATTRNV", "CALLDATANV", + "CALLDATAINNV", "PAYLOADEXT", "PAYLOADINEXT", "HITATTREXT", + "CALLDATAEXT", "CALLDATAINEXT", "PATCH", "SAMPLE", "NONUNIFORM", + "COHERENT", "VOLATILE", "RESTRICT", "READONLY", "WRITEONLY", + "DEVICECOHERENT", "QUEUEFAMILYCOHERENT", "WORKGROUPCOHERENT", + "SUBGROUPCOHERENT", "NONPRIVATE", "SHADERCALLCOHERENT", "NOPERSPECTIVE", + "EXPLICITINTERPAMD", "PERVERTEXEXT", "PERVERTEXNV", "PERPRIMITIVENV", + "PERVIEWNV", "PERTASKNV", "PERPRIMITIVEEXT", "TASKPAYLOADWORKGROUPEXT", + "PRECISE", "$accept", "variable_identifier", "primary_expression", "postfix_expression", "integer_expression", "function_call", "function_call_or_method", "function_call_generic", "function_call_header_no_parameters", @@ -1370,7 +1400,7 @@ static const char *const yytname[] = "spirv_execution_mode_id_parameter_list", "spirv_storage_class_qualifier", "spirv_decorate_qualifier", "spirv_decorate_parameter_list", "spirv_decorate_parameter", - "spirv_decorate_id_parameter_list", + "spirv_decorate_id_parameter_list", "spirv_decorate_id_parameter", "spirv_decorate_string_parameter_list", "spirv_type_specifier", "spirv_type_parameter_list", "spirv_type_parameter", "spirv_instruction_qualifier", "spirv_instruction_qualifier_list", @@ -1384,636 +1414,543 @@ yysymbol_name (yysymbol_kind_t yysymbol) } #endif -#ifdef YYPRINT -/* YYTOKNUM[NUM] -- (External) token number corresponding to the - (internal) symbol number NUM (which must be that of a token). */ -static const yytype_int16 yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, - 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, - 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, - 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, - 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, - 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, - 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, - 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, - 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, - 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, - 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, - 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, - 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, - 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, - 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, - 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, - 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, - 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712 -}; -#endif - -#define YYPACT_NINF (-813) +#define YYPACT_NINF (-872) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) -#define YYTABLE_NINF (-573) +#define YYTABLE_NINF (-695) #define yytable_value_is_error(Yyn) \ 0 - /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ static const yytype_int16 yypact[] = { - 4575, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -300, -272, -219, -123, -120, - -118, -105, -87, -813, -813, -317, -813, -813, -813, -813, - -813, -62, -813, -813, -813, -813, -813, -324, -813, -813, - -813, -813, -813, -813, -76, -64, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -319, -260, -133, -174, 7760, -191, -813, -166, -813, - -813, -813, -813, 5485, -813, -813, -813, -813, -61, -813, - -813, 935, -813, -813, 7760, -39, -813, -813, -813, 5940, - -50, -335, -267, -162, -152, -139, -50, -137, -46, 12111, - -813, -29, -339, -43, -813, -268, -813, -27, -6, 7760, - -813, -813, -813, 7760, -37, -36, -813, -298, -813, -237, - -813, -813, 10812, -5, -813, -813, -813, 1, -33, 7760, - -813, -4, -2, -3, -813, -236, -813, -227, -1, 3, - 4, 5, -225, 6, 10, 12, 13, 14, 17, -223, - 8, 18, 16, -304, -813, 21, 7760, -813, 19, -813, - -222, -813, -813, -207, 9080, -813, -247, 1390, -813, -813, - -813, -813, -813, -5, -270, -813, 9513, -250, -813, -22, - -813, -132, 10812, 10812, -813, 10812, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -265, -813, -813, -813, 25, - -204, 11245, 27, -813, 10812, -813, -813, -314, 30, -6, - 33, -813, -315, -50, -813, 15, -813, -325, 32, -130, - 10812, -129, -813, -146, -125, 10812, -124, 39, -119, -50, - -813, 11678, -813, -115, 10812, 36, -46, -813, 7760, 20, - 6395, -813, 7760, 10812, -813, -339, -813, 29, -813, -813, - -47, -83, -59, -288, -18, -17, 22, 26, 54, 59, - -309, 46, 9946, -813, 37, -813, -813, 50, 56, 58, - -813, 72, 74, 65, 10379, 76, 10812, 69, 68, 73, - 75, 77, -168, -813, -813, -82, -813, -260, 79, 82, - -813, -813, -813, -813, -813, 1845, -813, -813, -813, -813, - -813, -813, -813, -813, -813, 5030, 30, 9513, -241, 8214, - -813, -813, 9513, 7760, -813, 52, -813, -813, -813, -202, - -813, -813, 10812, 55, -813, -813, 10812, 85, -813, -813, - -813, 10812, -813, -813, -813, -310, -813, -813, -197, 81, - -813, -813, -813, -813, -813, -813, -195, -813, -194, -813, - -813, -190, 87, -813, -813, -813, -813, -169, -813, -167, - -813, -165, 89, -813, -158, 90, -157, 81, -813, -156, - -813, 91, 97, -813, -813, 20, -5, -77, -813, -813, - -813, 6850, -813, -813, -813, 10812, 10812, 10812, 10812, 10812, - 10812, 10812, 10812, 10812, 10812, 10812, 10812, 10812, 10812, 10812, - 10812, 10812, 10812, 10812, -813, -813, -813, 96, -813, 2300, - -813, -813, -813, 2300, -813, 10812, -813, -813, -49, 10812, - -26, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, 10812, 10812, -813, - -813, -813, -813, -813, -813, -813, 9513, -813, -813, -31, - -813, 7305, -813, -813, 98, 95, -813, -813, -813, -813, - -813, -172, -134, -813, -307, -813, -325, -813, -325, -813, - 10812, 10812, -813, -146, -813, -146, -813, 10812, 10812, -813, - 104, 39, -813, 11678, -813, 10812, -813, -813, -48, 30, - 20, -813, -813, -813, -813, -813, -47, -47, -83, -83, - -59, -59, -59, -59, -288, -288, -18, -17, 22, 26, - 54, 59, 10812, -813, 2300, 4120, 60, 3665, -155, -813, - -154, -813, -813, -813, -813, -813, 8647, -813, -813, -813, - 106, -813, -15, -813, -147, -813, -145, -813, -144, -813, - -143, -813, -142, -140, -813, -813, -813, -24, 101, 95, - 71, 107, 110, -813, -813, 4120, 109, -813, -813, -813, - -813, -813, -813, -813, -813, -813, -813, -813, 10812, -813, - 102, 2755, 10812, -813, 105, 113, 70, 112, 3210, -813, - 115, -813, 9513, -813, -813, -813, -135, 10812, 2755, 109, - -813, -813, 2300, -813, 111, 95, -813, -813, 2300, 117, - -813, -813 + 4648, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -305, -301, + -289, -276, -246, -238, -227, -182, -872, -872, -872, -872, + -872, -168, -872, -872, -872, -872, -872, -55, -872, -872, + -872, -872, -872, -319, -872, -872, -872, -872, -872, -872, + -872, -135, -120, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -327, -114, + -81, -124, 7882, -313, -872, -101, -872, -872, -872, -872, + 5572, -872, -872, -872, -872, -94, -872, -872, 952, -872, + -872, 7882, -73, -872, -872, -872, 6034, -78, -252, -250, + -216, -197, -136, -78, -127, -49, 12303, -872, -13, -346, + -39, -872, -309, -872, -10, -9, 7882, -872, -872, -872, + 7882, -38, -37, -872, -267, -872, -236, -872, -872, 10983, + -2, -872, -872, -872, 3, -35, 7882, -872, -8, -6, + -1, -872, -256, -872, -255, -4, 4, 7, 8, -237, + 10, 11, 13, 14, 15, 18, -232, 9, 19, 27, + -188, -872, -3, 7882, -872, 20, -872, -229, -872, -872, + -219, 9223, -872, -272, 1414, -872, -872, -872, -872, -872, + -2, -277, -872, 9663, -265, -872, -23, -872, -112, 10983, + 10983, -872, 10983, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -253, -872, -872, -872, 29, -204, 11423, 28, + -872, 10983, -872, 31, -321, 17, -9, 32, -872, -325, + -78, -872, 5, -872, -330, 33, -125, 10983, -123, -872, + -130, -119, -146, -118, 34, -103, -78, -872, 11863, -872, + -74, 10983, 36, -49, -872, 7882, 24, 6496, -872, 7882, + 10983, -872, -346, -872, 30, -872, -872, -33, -133, -105, + -303, -11, -14, 21, 23, 48, 52, -316, 41, -872, + 10103, -872, 42, -872, -872, 46, 38, 40, -872, 64, + 67, 60, 10543, 74, 10983, 68, 65, 69, 70, 73, + -167, -872, -872, -47, -872, -114, 77, 31, -872, -872, + -872, -872, -872, 1876, -872, -872, -872, -872, -872, -872, + -872, -872, -872, 5110, 17, 9663, -261, 8343, -872, -872, + 9663, 7882, -872, 50, -872, -872, -872, -203, -872, -872, + 10983, 51, -872, -872, 10983, 87, -872, -872, -872, 10983, + -872, -872, -872, -312, -872, -872, -200, 80, -872, -872, + -872, -872, -872, -872, -199, -872, -196, -872, -872, -195, + 71, -872, -872, -872, -872, -169, -872, -164, -872, -872, + -872, -872, -872, -161, -872, 83, -872, -160, 84, -153, + 80, -872, -278, -152, -872, 91, 94, -872, -872, 24, + -2, -43, -872, -872, -872, 6958, -872, -872, -872, 10983, + 10983, 10983, 10983, 10983, 10983, 10983, 10983, 10983, 10983, 10983, + 10983, 10983, 10983, 10983, 10983, 10983, 10983, 10983, -872, -872, + -872, 93, -872, 2338, -872, -872, -872, 2338, -872, 10983, + -872, -872, -42, 10983, -32, -872, -872, -872, -872, -872, + -872, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, 10983, 10983, -872, -872, -872, -872, -872, -872, -872, + 9663, -872, -872, -76, -872, 7420, -872, -872, 96, 95, + -872, -872, -872, -872, -872, -132, -131, -872, -311, -872, + -330, -872, -330, -872, 10983, 10983, -872, -130, -872, -130, + -872, -146, -146, -872, 101, 34, -872, 11863, -872, 10983, + -872, -872, -41, 17, 24, -872, -872, -872, -872, -872, + -33, -33, -133, -133, -105, -105, -105, -105, -303, -303, + -11, -14, 21, 23, 48, 52, 10983, -872, 2338, 4186, + 59, 3724, -151, -872, -150, -872, -872, -872, -872, -872, + 8783, -872, -872, -872, 105, -872, 72, -872, -149, -872, + -148, -872, -141, -872, -140, -872, -139, -138, -872, -872, + -872, -28, 102, 95, 75, 107, 106, -872, -872, 4186, + 108, -872, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, 10983, -872, 100, 2800, 10983, -872, 104, 109, + 76, 112, 3262, -872, 113, -872, 9663, -872, -872, -872, + -137, 10983, 2800, 108, -872, -872, 2338, -872, 110, 95, + -872, -872, 2338, 114, -872, -872 }; - /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. - Performed when YYTABLE does not specify something else to do. Zero - means the default is an error. */ +/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ static const yytype_int16 yydefact[] = { - 0, 168, 222, 220, 221, 219, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 223, 224, 225, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 348, 349, 350, 351, 352, 353, 354, 374, 375, 376, - 377, 378, 379, 380, 389, 402, 403, 390, 391, 393, - 392, 394, 395, 396, 397, 398, 399, 400, 401, 176, - 177, 248, 249, 247, 250, 257, 258, 255, 256, 253, - 254, 251, 252, 280, 281, 282, 292, 293, 294, 277, - 278, 279, 289, 290, 291, 274, 275, 276, 286, 287, - 288, 271, 272, 273, 283, 284, 285, 259, 260, 261, - 295, 296, 297, 262, 263, 264, 307, 308, 309, 265, - 266, 267, 319, 320, 321, 268, 269, 270, 331, 332, - 333, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 322, - 323, 324, 325, 326, 327, 328, 329, 330, 334, 335, - 336, 337, 338, 339, 340, 341, 342, 346, 343, 344, - 345, 527, 528, 529, 358, 359, 382, 385, 347, 356, - 357, 373, 355, 404, 405, 408, 409, 410, 412, 413, - 414, 416, 417, 418, 420, 421, 517, 518, 381, 383, - 384, 360, 361, 362, 406, 363, 367, 368, 371, 411, - 415, 419, 364, 365, 369, 370, 407, 366, 372, 451, - 453, 454, 455, 457, 458, 459, 461, 462, 463, 465, - 466, 467, 469, 470, 471, 473, 474, 475, 477, 478, - 479, 481, 482, 483, 485, 486, 487, 489, 490, 491, - 493, 494, 452, 456, 460, 464, 468, 476, 480, 484, - 472, 488, 492, 495, 496, 497, 498, 499, 500, 501, + 0, 168, 225, 223, 224, 222, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 226, 227, 228, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 351, 352, 353, 354, 355, 356, 357, 377, 378, 379, + 380, 381, 382, 383, 392, 405, 406, 393, 394, 396, + 395, 397, 398, 399, 400, 401, 402, 403, 404, 177, + 178, 251, 252, 250, 253, 260, 261, 258, 259, 256, + 257, 254, 255, 283, 284, 285, 295, 296, 297, 280, + 281, 282, 292, 293, 294, 277, 278, 279, 289, 290, + 291, 274, 275, 276, 286, 287, 288, 262, 263, 264, + 298, 299, 300, 265, 266, 267, 310, 311, 312, 268, + 269, 270, 322, 323, 324, 271, 272, 273, 334, 335, + 336, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 349, 346, 347, + 348, 533, 534, 535, 536, 538, 182, 361, 362, 385, + 388, 350, 359, 360, 376, 358, 407, 408, 411, 412, + 413, 415, 416, 417, 419, 420, 421, 423, 424, 520, + 521, 384, 386, 387, 363, 364, 365, 409, 366, 370, + 371, 374, 414, 418, 422, 367, 368, 372, 373, 410, + 369, 375, 454, 456, 457, 458, 460, 461, 462, 464, + 465, 466, 468, 469, 470, 472, 473, 474, 476, 477, + 478, 480, 481, 482, 484, 485, 486, 488, 489, 490, + 492, 493, 494, 496, 497, 455, 459, 463, 467, 471, + 479, 483, 487, 475, 491, 495, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 516, 386, 387, 388, 422, 431, - 433, 427, 432, 434, 435, 437, 438, 439, 441, 442, - 443, 445, 446, 447, 449, 450, 423, 424, 425, 436, - 426, 428, 429, 430, 440, 444, 448, 519, 520, 523, - 524, 525, 526, 521, 522, 0, 0, 0, 0, 0, - 0, 0, 0, 166, 167, 0, 623, 137, 533, 534, - 535, 0, 532, 172, 170, 171, 169, 0, 218, 173, - 174, 175, 139, 138, 0, 201, 182, 184, 180, 186, - 188, 183, 185, 181, 187, 189, 178, 179, 204, 190, - 197, 198, 199, 200, 191, 192, 193, 194, 195, 196, - 140, 141, 143, 142, 144, 146, 147, 145, 203, 154, - 622, 0, 624, 0, 114, 113, 0, 125, 130, 161, - 160, 158, 162, 0, 155, 157, 163, 135, 214, 159, - 531, 0, 619, 621, 0, 0, 164, 165, 530, 0, + 512, 513, 514, 515, 516, 517, 518, 519, 389, 390, + 391, 425, 434, 436, 430, 435, 437, 438, 440, 441, + 442, 444, 445, 446, 448, 449, 450, 452, 453, 426, + 427, 428, 439, 429, 431, 432, 433, 443, 447, 451, + 525, 526, 529, 530, 531, 532, 527, 528, 0, 0, + 0, 0, 0, 0, 0, 0, 166, 167, 522, 523, + 524, 0, 631, 137, 541, 542, 543, 0, 540, 172, + 170, 171, 169, 0, 221, 173, 175, 176, 174, 139, + 138, 0, 203, 184, 186, 181, 188, 190, 185, 187, + 183, 189, 191, 179, 180, 206, 192, 199, 200, 201, + 202, 193, 194, 195, 196, 197, 198, 140, 141, 143, + 142, 144, 146, 147, 145, 205, 154, 630, 0, 632, + 0, 114, 113, 0, 125, 130, 161, 160, 158, 162, + 0, 155, 157, 163, 135, 216, 159, 539, 0, 627, + 629, 0, 0, 164, 165, 537, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 546, 0, 0, + 0, 99, 0, 94, 0, 109, 0, 121, 115, 123, + 0, 124, 0, 97, 131, 102, 0, 156, 136, 0, + 209, 215, 1, 628, 0, 0, 0, 96, 0, 0, + 0, 639, 0, 697, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, + 0, 635, 0, 0, 544, 151, 153, 0, 149, 207, + 0, 0, 100, 0, 0, 633, 110, 116, 120, 122, + 118, 126, 117, 0, 132, 105, 0, 103, 0, 0, + 0, 9, 0, 43, 42, 44, 41, 5, 6, 7, + 8, 2, 16, 14, 15, 17, 10, 11, 12, 13, + 3, 18, 37, 20, 25, 26, 0, 0, 30, 0, + 219, 0, 36, 218, 0, 210, 111, 0, 95, 0, + 0, 695, 0, 647, 0, 0, 0, 0, 0, 664, + 0, 0, 0, 0, 0, 0, 0, 689, 0, 662, + 0, 0, 0, 0, 98, 0, 0, 0, 548, 0, + 0, 148, 0, 204, 0, 211, 45, 49, 52, 55, + 60, 63, 65, 67, 69, 71, 73, 75, 0, 34, + 0, 101, 575, 584, 588, 0, 0, 0, 609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 538, 0, 0, 0, 99, 0, 94, 0, 109, 0, - 121, 115, 123, 0, 124, 0, 97, 131, 102, 0, - 156, 136, 0, 207, 213, 1, 620, 0, 0, 0, - 96, 0, 0, 0, 631, 0, 683, 0, 0, 0, + 45, 78, 91, 0, 562, 0, 163, 135, 565, 586, + 564, 572, 563, 0, 566, 567, 590, 568, 597, 569, + 570, 605, 571, 0, 119, 0, 127, 0, 556, 134, + 0, 0, 107, 0, 104, 38, 39, 0, 22, 23, + 0, 0, 28, 27, 0, 221, 31, 33, 40, 0, + 217, 112, 699, 0, 700, 640, 0, 0, 698, 659, + 655, 656, 657, 658, 0, 653, 0, 93, 660, 0, + 0, 674, 675, 676, 677, 0, 672, 0, 681, 682, + 683, 684, 680, 0, 678, 0, 685, 0, 0, 0, + 2, 693, 216, 0, 691, 0, 0, 634, 636, 0, + 554, 0, 552, 547, 549, 0, 152, 150, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 629, 0, 627, 0, 0, 536, 151, 153, - 0, 149, 205, 0, 0, 100, 0, 0, 625, 110, - 116, 120, 122, 118, 126, 117, 0, 132, 105, 0, - 103, 0, 0, 0, 9, 0, 43, 42, 44, 41, - 5, 6, 7, 8, 2, 16, 14, 15, 17, 10, - 11, 12, 13, 3, 18, 37, 20, 25, 26, 0, - 0, 30, 0, 216, 0, 36, 34, 0, 208, 111, - 0, 95, 0, 0, 681, 0, 639, 0, 0, 0, - 0, 0, 656, 0, 0, 0, 0, 0, 0, 0, - 676, 0, 654, 0, 0, 0, 0, 98, 0, 0, - 0, 540, 0, 0, 148, 0, 202, 0, 209, 45, - 49, 52, 55, 60, 63, 65, 67, 69, 71, 73, - 75, 0, 0, 101, 567, 576, 580, 0, 0, 0, - 601, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 45, 78, 91, 0, 554, 0, 163, 135, - 557, 578, 556, 564, 555, 0, 558, 559, 582, 560, - 589, 561, 562, 597, 563, 0, 119, 0, 127, 0, - 548, 134, 0, 0, 107, 0, 104, 38, 39, 0, - 22, 23, 0, 0, 28, 27, 0, 218, 31, 33, - 40, 0, 215, 112, 685, 0, 686, 632, 0, 0, - 684, 651, 647, 648, 649, 650, 0, 645, 0, 93, - 652, 0, 0, 666, 667, 668, 669, 0, 664, 0, - 670, 0, 0, 672, 0, 0, 0, 2, 680, 0, - 678, 0, 0, 626, 628, 0, 546, 0, 544, 539, - 541, 0, 152, 150, 206, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 76, 210, 211, 0, 566, 0, - 599, 612, 611, 0, 603, 0, 615, 613, 0, 0, - 0, 596, 616, 617, 618, 565, 81, 82, 84, 83, - 86, 87, 88, 89, 90, 85, 80, 0, 0, 581, - 577, 579, 583, 590, 598, 129, 0, 551, 552, 0, - 133, 0, 108, 4, 0, 24, 21, 32, 217, 635, - 637, 0, 0, 682, 0, 641, 0, 640, 0, 643, - 0, 0, 658, 0, 657, 0, 660, 0, 0, 662, - 0, 0, 677, 0, 674, 0, 655, 630, 0, 547, - 0, 542, 537, 46, 47, 48, 51, 50, 53, 54, - 58, 59, 56, 57, 61, 62, 64, 66, 68, 70, - 72, 74, 0, 212, 568, 0, 0, 0, 0, 614, - 0, 595, 79, 92, 128, 549, 0, 106, 19, 633, - 0, 634, 0, 646, 0, 653, 0, 665, 0, 671, - 0, 673, 0, 0, 679, 543, 545, 0, 0, 587, - 0, 0, 0, 606, 605, 608, 574, 591, 550, 553, - 636, 638, 642, 644, 659, 661, 663, 675, 0, 569, - 0, 0, 0, 607, 0, 0, 586, 0, 0, 584, - 0, 77, 0, 571, 600, 570, 0, 609, 0, 574, - 573, 575, 593, 588, 0, 610, 604, 585, 594, 0, - 602, 592 + 0, 0, 0, 0, 0, 0, 0, 0, 76, 212, + 213, 0, 574, 0, 607, 620, 619, 0, 611, 0, + 623, 621, 0, 0, 0, 604, 624, 625, 626, 573, + 81, 82, 84, 83, 86, 87, 88, 89, 90, 85, + 80, 0, 0, 589, 585, 587, 591, 598, 606, 129, + 0, 559, 560, 0, 133, 0, 108, 4, 0, 24, + 21, 32, 220, 643, 645, 0, 0, 696, 0, 649, + 0, 648, 0, 651, 0, 0, 666, 0, 665, 0, + 668, 0, 0, 670, 0, 0, 690, 0, 687, 0, + 663, 638, 0, 555, 0, 550, 545, 46, 47, 48, + 51, 50, 53, 54, 58, 59, 56, 57, 61, 62, + 64, 66, 68, 70, 72, 74, 0, 214, 576, 0, + 0, 0, 0, 622, 0, 603, 79, 92, 128, 557, + 0, 106, 19, 641, 0, 642, 0, 654, 0, 661, + 0, 673, 0, 679, 0, 686, 0, 0, 692, 551, + 553, 0, 0, 595, 0, 0, 0, 614, 613, 616, + 582, 599, 558, 561, 644, 646, 650, 652, 667, 669, + 671, 688, 0, 577, 0, 0, 0, 615, 0, 0, + 594, 0, 0, 592, 0, 77, 0, 579, 608, 578, + 0, 617, 0, 582, 581, 583, 601, 596, 0, 618, + 612, 593, 602, 0, 610, 600 }; - /* YYPGOTO[NTERM-NUM]. */ +/* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -813, -813, -813, -813, -813, -813, -813, -813, -813, -813, - -813, -813, -429, -813, -381, -380, -483, -383, -262, -257, - -261, -258, -255, -259, -813, -479, -813, -492, -813, -495, - -536, 11, -813, -813, -813, 7, -388, -813, -813, 42, - 49, 47, -813, -813, -401, -813, -813, -813, -813, -96, - -813, -384, -371, -813, 9, -813, 0, -425, -813, -813, - -813, -813, 150, -813, -813, -813, -546, -553, -217, -338, - -607, -813, -364, -619, -812, -813, -421, -813, -813, -428, - -430, -813, -813, 64, -718, -355, -813, -141, -813, -390, - -813, -138, -813, -813, -813, -813, -136, -813, -813, -813, - -813, -813, -813, -813, -813, 92, -813, -813, 2, -813, - -68, -275, -456, -813, -813, -813, -296, -293, -301, -813, - -813, -299, -295, -303, -302, -813, -306, -311, -813, -392, - -530 + -872, -544, -872, -872, -872, -872, -872, -872, -872, -872, + -872, -872, -436, -872, -392, -391, -490, -390, -269, -266, + -268, -264, -262, -260, -872, -482, -872, -499, -872, -492, + -534, 6, -872, -872, -872, 1, -403, -872, -872, 45, + 44, 49, -872, -872, -406, -872, -872, -872, -872, -104, + -872, -389, -375, -872, 12, -872, 0, -433, -872, -872, + -872, -553, 145, -872, -872, -872, -560, -556, -233, -344, + -614, -872, -373, -626, -871, -872, -430, -872, -872, -440, + -437, -872, -872, 63, -737, -363, -872, -144, -872, -399, + -872, -142, -872, -872, -872, -872, -134, -872, -872, -872, + -872, -872, -872, -872, -872, 97, -872, -872, 2, -872, + -71, -308, -416, -872, -872, -872, -304, -307, -302, -872, + -872, -315, -310, -306, -300, -314, -872, -299, -317, -872, + -395, -538 }; - /* YYDEFGOTO[NTERM-NUM]. */ +/* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 523, 524, 525, 784, 526, 527, 528, 529, 530, - 531, 532, 612, 534, 580, 581, 582, 583, 584, 585, - 586, 587, 588, 589, 590, 613, 842, 614, 767, 615, - 698, 616, 381, 643, 501, 617, 383, 384, 385, 430, - 431, 432, 386, 387, 388, 389, 390, 391, 480, 481, - 392, 393, 394, 395, 535, 483, 536, 486, 443, 444, - 537, 398, 399, 400, 572, 476, 570, 571, 707, 708, - 641, 779, 620, 621, 622, 623, 624, 739, 878, 914, - 906, 907, 908, 915, 625, 626, 627, 628, 909, 881, - 629, 630, 910, 929, 631, 632, 633, 845, 743, 847, - 885, 904, 905, 634, 401, 402, 403, 427, 635, 473, - 474, 453, 454, 791, 792, 405, 676, 677, 681, 406, - 407, 687, 688, 691, 694, 408, 699, 700, 409, 455, - 456 + 0, 530, 531, 532, 798, 533, 534, 535, 536, 537, + 538, 539, 620, 541, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 621, 856, 622, 781, 623, + 711, 624, 388, 651, 508, 625, 390, 391, 392, 437, + 438, 439, 393, 394, 395, 396, 397, 398, 487, 488, + 399, 400, 401, 402, 542, 490, 599, 493, 450, 451, + 544, 405, 406, 407, 579, 483, 577, 578, 721, 722, + 649, 793, 628, 629, 630, 631, 632, 753, 892, 928, + 920, 921, 922, 929, 633, 634, 635, 636, 923, 895, + 637, 638, 924, 943, 639, 640, 641, 859, 757, 861, + 899, 918, 919, 642, 408, 409, 410, 434, 643, 480, + 481, 460, 461, 805, 806, 412, 684, 685, 689, 413, + 414, 695, 696, 703, 704, 707, 415, 713, 714, 416, + 462, 463 }; - /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule whose - number is the opposite. If YYTABLE_NINF, syntax error. */ +/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 397, 433, 404, 448, 640, 591, 771, 382, 448, 396, - 649, 380, 497, 533, 680, 670, 447, 710, 538, 690, - 449, 844, 440, 671, 469, 449, 711, 733, 702, 420, - 775, 670, 778, 664, 418, 780, 665, 712, 789, 658, - 424, 664, 661, 722, 723, 433, 478, 457, 565, 410, - 458, 495, 566, 484, 662, 579, 672, 673, 674, 675, - 496, 421, 440, 734, 650, 651, 425, 666, 636, 638, - 479, 679, 790, 647, 648, 666, 679, 411, 440, 724, - 725, 484, 679, 484, -35, 679, 652, 667, 637, 913, - 653, 485, 568, 667, 679, 667, 921, 781, 667, 426, - 667, 592, 667, 667, 592, 660, 913, 667, 642, 748, - 592, 750, 593, 737, 544, 460, 498, 776, 458, 499, - 545, 579, 500, 546, 846, 552, 579, 560, 574, 547, - 412, 553, 579, 561, 575, 579, 459, 461, 463, 465, - 467, 468, 471, 576, 579, 640, 655, 640, 783, 577, - 640, 668, 656, 793, 768, 795, 797, 785, 710, 545, - 799, 796, 798, 579, 787, 435, 800, 696, 436, 854, - 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, - 859, 802, 429, 804, 860, 806, 568, 803, 568, 805, - 766, 807, 809, 812, 814, 886, 887, 440, 810, 813, - 815, 768, 768, 892, 928, 893, 894, 895, 896, 796, - 897, 800, 803, 807, 810, 924, 815, 428, 861, 437, - 462, 768, 862, 458, 645, 771, 413, 646, 710, 414, - 464, 415, 788, 458, 448, 683, 684, 685, 686, 830, - 831, 832, 833, 466, 416, 470, 458, 447, 458, 889, - 848, 449, 678, 682, 850, 458, 458, 689, 692, 568, - 458, 458, 417, 695, 865, 680, 458, 701, 720, 721, - 458, 869, 690, 422, 768, 852, 853, 769, 718, 820, - 719, 819, 821, 670, 640, 423, 823, 824, 825, 579, - 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, - 579, 579, 579, 579, 579, 923, 442, 768, 820, 771, - 849, 875, 328, 329, 330, 726, 727, 715, 716, 717, - 450, 679, 679, 855, 477, 856, 487, 568, 679, 679, - 768, 851, 768, 898, 679, 452, 679, 826, 827, 472, - 828, 829, 482, 834, 835, 325, 484, 877, 493, 494, - 879, 539, 540, 543, 728, 541, 542, 548, 562, 549, - 550, 551, 554, 644, 640, 564, 555, 891, 556, 557, - 558, 579, 579, 559, 563, 654, 659, 573, 579, 579, - 567, 592, 495, 665, 579, 434, 579, 693, 703, 731, - 879, 738, 729, 441, 396, 730, 732, 568, 735, 740, - 669, 397, 396, 404, 397, 706, 911, 916, 382, 397, - 396, 404, 380, 396, 714, 741, 451, 742, 396, 475, - 640, 744, 925, 745, 746, 749, 751, 752, -36, 434, - 489, -34, 753, 434, 754, -29, 755, 782, 396, 794, - 786, 816, 396, 801, 880, 808, 811, 817, 843, 441, - 858, 768, 871, 882, 890, 899, 900, 901, 396, 902, - 912, 449, -572, 918, 917, 594, 836, 919, 922, 838, - 930, 931, 837, 839, 841, 491, 569, 840, 490, 713, - 492, 419, 876, 883, 880, 396, 920, 619, 818, 927, - 926, 488, 884, 446, 772, 903, 618, 773, 704, 774, - 866, 449, 864, 863, 874, 870, 868, 873, 867, 872, + 404, 389, 411, 440, 648, 455, 387, 785, 454, 598, + 455, 504, 403, 540, 678, 712, 858, 545, 702, 725, + 657, 724, 456, 688, 679, 447, 747, 456, 476, 672, + 678, 789, 673, 792, 736, 737, 794, 716, 431, 666, + 427, 669, 803, 672, 927, 485, 726, 440, 491, 442, + 417, 935, 443, 670, 418, 586, 492, 680, 681, 682, + 683, 927, 748, 674, 432, 447, 419, 644, 646, 486, + 738, 739, 428, 655, 656, 687, 804, 674, -694, 420, + 491, 447, 658, 659, -694, 600, 687, 645, 502, 687, + 491, 795, 600, 601, 575, 449, 600, 503, 687, 650, + 551, 553, -35, 790, 660, 668, 552, 554, 661, 421, + 466, 468, 470, 472, 474, 475, 478, 422, 751, 559, + 762, 586, 764, 505, 567, 560, 506, 581, 423, 507, + 568, 860, 586, 582, 675, 586, 464, 583, 467, 465, + 675, 465, 675, 584, 586, 675, 648, 675, 648, 675, + 675, 648, 663, 797, 675, 676, 807, 809, 664, 782, + 811, 813, 552, 810, 586, 801, 812, 814, 799, 724, + 572, 709, 469, 424, 573, 465, 868, 770, 771, 772, + 773, 774, 775, 776, 777, 778, 779, 816, 575, 425, + 575, 471, 818, 817, 465, 820, 823, 780, 819, 942, + 447, 821, 824, 826, 828, 900, 901, 906, 907, 827, + 829, 782, 782, 810, 814, 908, 909, 910, 911, 938, + 429, 817, 821, 824, 829, 782, 873, 875, 734, 735, + 874, 876, 785, 802, 732, 430, 733, 455, 436, 724, + 454, 698, 699, 700, 701, 521, 844, 845, 846, 847, + 653, 433, 473, 654, 456, 465, 903, 691, 692, 693, + 694, 477, 575, 686, 465, 690, 465, 862, 465, 697, + 705, 864, 465, 465, 712, 435, 712, 702, 702, 449, + 879, 688, 866, 867, 869, 708, 870, 833, 465, 678, + 444, 648, 457, 837, 838, 839, 586, 586, 586, 586, + 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, + 586, 586, 937, 459, 715, 782, 785, 465, 783, 834, + 782, 834, 835, 863, 889, 334, 335, 336, 740, 741, + 782, 865, 687, 687, 782, 912, 575, 729, 730, 731, + 840, 841, 479, 842, 843, 687, 484, 687, 331, 494, + 848, 849, 489, 500, 501, 491, 547, 548, 549, 546, + 555, 550, 574, 742, 891, 569, 556, 893, 652, 557, + 558, 648, 561, 562, 600, 563, 564, 565, 586, 586, + 566, 570, 571, 667, 580, 662, -34, 502, 706, 745, + 673, 586, 441, 586, 717, 746, 677, 743, 744, 749, + 448, 754, 752, 755, 403, 756, 575, 893, 404, 389, + 411, 404, 403, 925, 387, 720, 404, 458, 411, 758, + 403, 728, 759, 403, 930, 760, 482, 648, 403, 763, + 766, 765, -36, 815, 767, 768, 441, 496, 769, 939, + 441, 796, 800, -29, 808, 822, 825, 830, 403, 543, + 831, 857, 403, 894, 872, 885, 448, 782, 896, 904, + 905, 916, 913, 915, 926, 932, 914, -580, 403, 931, + 456, 602, 936, 850, 945, 944, 852, 851, 727, 933, + 497, 853, 426, 576, 854, 498, 832, 855, 897, 499, + 890, 934, 940, 894, 627, 403, 941, 495, 898, 786, + 917, 787, 718, 877, 882, 453, 626, 881, 878, 788, + 456, 886, 888, 880, 0, 0, 884, 0, 0, 0, + 0, 883, 0, 0, 0, 0, 0, 0, 887, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 663, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 719, 0, 576, 0, 576, + 0, 0, 0, 0, 0, 0, 0, 403, 0, 403, + 0, 403, 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, 705, 0, - 569, 0, 569, 0, 0, 0, 0, 396, 0, 396, - 0, 396, 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, 627, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 404, 0, 626, 0, 0, 0, 0, + 0, 576, 0, 0, 0, 403, 0, 0, 0, 0, + 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 619, 0, 0, 0, 0, - 0, 0, 0, 0, 618, 397, 0, 0, 0, 0, - 0, 0, 0, 569, 396, 0, 0, 0, 0, 0, - 0, 0, 396, 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, 576, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 569, 0, 0, 0, 0, 0, 0, 0, 0, - 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 619, - 0, 0, 0, 619, 0, 0, 0, 0, 618, 0, - 0, 0, 618, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 627, 0, 0, 0, 627, 0, 0, + 0, 0, 0, 0, 0, 626, 0, 0, 0, 626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 569, 0, 0, 0, 0, 0, 0, 0, 0, - 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 576, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 403, 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, 619, 619, 0, 619, 0, 404, - 0, 0, 0, 618, 618, 0, 618, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 627, 627, + 0, 627, 0, 411, 0, 0, 0, 0, 0, 0, + 626, 626, 0, 626, 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, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 619, 0, 0, 0, 0, - 0, 0, 0, 0, 618, 0, 0, 0, 0, 0, - 0, 619, 0, 0, 0, 0, 0, 0, 619, 0, - 618, 0, 0, 0, 0, 0, 0, 618, 619, 0, - 0, 0, 619, 0, 0, 0, 0, 618, 619, 0, - 0, 618, 0, 0, 0, 445, 0, 618, 1, 2, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 626, 0, 0, 0, 627, 0, 0, 0, 0, + 0, 0, 627, 0, 0, 0, 0, 626, 0, 0, + 0, 0, 627, 0, 626, 0, 627, 0, 0, 0, + 0, 0, 627, 0, 626, 0, 0, 0, 626, 0, + 0, 0, 452, 0, 626, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 325, 0, 0, 0, - 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 327, 328, - 329, 330, 331, 0, 0, 0, 0, 0, 0, 0, - 0, 332, 333, 334, 335, 336, 337, 338, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, + 0, 0, 0, 0, 0, 0, 0, 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 339, 340, 341, 342, 343, 344, 0, - 0, 0, 0, 0, 0, 0, 0, 345, 0, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 0, 0, 502, - 503, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 504, 505, - 0, 325, 0, 594, 595, 0, 0, 0, 0, 596, - 506, 507, 508, 509, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 327, 328, 329, 330, 331, 0, 0, - 0, 510, 511, 512, 513, 514, 332, 333, 334, 335, - 336, 337, 338, 597, 598, 599, 600, 0, 601, 602, - 603, 604, 605, 606, 607, 608, 609, 610, 339, 340, - 341, 342, 343, 344, 515, 516, 517, 518, 519, 520, - 521, 522, 345, 611, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 1, 2, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 0, 0, 502, 503, 0, 0, 0, 0, + 0, 333, 334, 335, 336, 337, 0, 0, 0, 0, + 0, 0, 0, 0, 338, 339, 340, 341, 342, 343, + 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 351, 0, 0, 0, 0, 0, 0, 0, + 0, 352, 0, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 1, 2, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 0, 0, 509, + 510, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 511, 512, + 0, 331, 0, 602, 603, 0, 0, 0, 0, 604, + 513, 514, 515, 516, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 333, 334, 335, 336, 337, 0, 0, + 0, 517, 518, 519, 520, 521, 338, 339, 340, 341, + 342, 343, 344, 605, 606, 607, 608, 0, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 345, 346, + 347, 348, 349, 350, 351, 522, 523, 524, 525, 526, + 527, 528, 529, 352, 619, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 0, + 0, 509, 510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 504, 505, 0, 325, 0, 594, 770, - 0, 0, 0, 0, 596, 506, 507, 508, 509, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 327, 328, - 329, 330, 331, 0, 0, 0, 510, 511, 512, 513, - 514, 332, 333, 334, 335, 336, 337, 338, 597, 598, - 599, 600, 0, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 339, 340, 341, 342, 343, 344, 515, - 516, 517, 518, 519, 520, 521, 522, 345, 611, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 0, 0, 502, - 503, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 504, 505, - 0, 325, 0, 594, 0, 0, 0, 0, 0, 596, - 506, 507, 508, 509, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 327, 328, 329, 330, 331, 0, 0, - 0, 510, 511, 512, 513, 514, 332, 333, 334, 335, - 336, 337, 338, 597, 598, 599, 600, 0, 601, 602, - 603, 604, 605, 606, 607, 608, 609, 610, 339, 340, - 341, 342, 343, 344, 515, 516, 517, 518, 519, 520, - 521, 522, 345, 611, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 1, 2, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 0, 0, 502, 503, 0, 0, 0, 0, + 511, 512, 0, 331, 0, 602, 784, 0, 0, 0, + 0, 604, 513, 514, 515, 516, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 333, 334, 335, 336, 337, + 0, 0, 0, 517, 518, 519, 520, 521, 338, 339, + 340, 341, 342, 343, 344, 605, 606, 607, 608, 0, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 345, 346, 347, 348, 349, 350, 351, 522, 523, 524, + 525, 526, 527, 528, 529, 352, 619, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 0, 0, 509, 510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 504, 505, 0, 325, 0, 487, 0, - 0, 0, 0, 0, 596, 506, 507, 508, 509, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 327, 328, - 329, 330, 331, 0, 0, 0, 510, 511, 512, 513, - 514, 332, 333, 334, 335, 336, 337, 338, 597, 598, - 599, 600, 0, 601, 602, 603, 604, 605, 606, 607, - 608, 609, 610, 339, 340, 341, 342, 343, 344, 515, - 516, 517, 518, 519, 520, 521, 522, 345, 611, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 1, 2, 3, 4, 5, 6, 7, + 0, 0, 511, 512, 0, 331, 0, 602, 0, 0, + 0, 0, 0, 604, 513, 514, 515, 516, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 333, 334, 335, + 336, 337, 0, 0, 0, 517, 518, 519, 520, 521, + 338, 339, 340, 341, 342, 343, 344, 605, 606, 607, + 608, 0, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 345, 346, 347, 348, 349, 350, 351, 522, + 523, 524, 525, 526, 527, 528, 529, 352, 619, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, @@ -2045,339 +1982,206 @@ static const yytype_int16 yytable[] = 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 0, 0, 502, - 503, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 504, 505, - 0, 325, 0, 0, 0, 0, 0, 0, 0, 596, - 506, 507, 508, 509, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 327, 328, 329, 330, 331, 0, 0, - 0, 510, 511, 512, 513, 514, 332, 333, 334, 335, - 336, 337, 338, 597, 598, 599, 600, 0, 601, 602, - 603, 604, 605, 606, 607, 608, 609, 610, 339, 340, - 341, 342, 343, 344, 515, 516, 517, 518, 519, 520, - 521, 522, 345, 611, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 1, 2, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 0, 0, 502, 503, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 504, 505, 0, 325, 0, 0, 0, - 0, 0, 0, 0, 596, 506, 507, 508, 509, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 327, 328, - 329, 330, 331, 0, 0, 0, 510, 511, 512, 513, - 514, 332, 333, 334, 335, 336, 337, 338, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 339, 340, 341, 342, 343, 344, 515, - 516, 517, 518, 519, 520, 521, 522, 345, 0, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 0, 0, 0, - 318, 319, 320, 321, 322, 323, 324, 0, 0, 502, - 503, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 504, 505, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 0, 0, 509, 510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 506, 507, 508, 509, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 327, 328, 329, 330, 0, 0, 0, - 0, 510, 511, 512, 513, 514, 332, 333, 334, 335, - 336, 337, 338, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 339, 340, - 341, 342, 343, 344, 515, 516, 517, 518, 519, 520, - 521, 522, 345, 0, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 0, 0, 0, 0, 511, 512, 0, 331, 0, 494, + 0, 0, 0, 0, 0, 604, 513, 514, 515, 516, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, + 334, 335, 336, 337, 0, 0, 0, 517, 518, 519, + 520, 521, 338, 339, 340, 341, 342, 343, 344, 605, + 606, 607, 608, 0, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 345, 346, 347, 348, 349, 350, + 351, 522, 523, 524, 525, 526, 527, 528, 529, 352, + 619, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 1, 2, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 325, 0, 0, 0, - 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 327, 328, - 329, 330, 331, 0, 0, 0, 0, 0, 0, 0, - 0, 332, 333, 334, 335, 336, 337, 338, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 339, 340, 341, 342, 343, 344, 0, - 0, 0, 0, 0, 0, 0, 0, 345, 0, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 0, 0, 0, - 318, 319, 320, 321, 322, 323, 324, 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, 327, 328, 329, 330, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 332, 333, 334, 335, - 336, 337, 338, 597, 0, 0, 600, 0, 601, 602, - 0, 0, 605, 0, 0, 0, 0, 0, 339, 340, - 341, 342, 343, 344, 0, 0, 0, 0, 0, 0, - 0, 0, 345, 0, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 1, 2, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 0, 0, 0, 318, 319, 320, 321, 322, - 323, 324, 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, 438, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 327, 328, - 329, 330, 0, 0, 0, 0, 0, 0, 0, 0, - 439, 332, 333, 334, 335, 336, 337, 338, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 339, 340, 341, 342, 343, 344, 0, - 0, 0, 0, 0, 0, 0, 0, 345, 0, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 0, 0, 0, - 318, 319, 320, 321, 322, 323, 324, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 0, 0, 509, 510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 325, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 511, 512, 0, 331, + 0, 0, 0, 0, 0, 0, 0, 604, 513, 514, + 515, 516, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 333, 334, 335, 336, 337, 0, 0, 0, 517, + 518, 519, 520, 521, 338, 339, 340, 341, 342, 343, + 344, 605, 606, 607, 608, 0, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 345, 346, 347, 348, + 349, 350, 351, 522, 523, 524, 525, 526, 527, 528, + 529, 352, 619, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 1, 2, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 0, 0, 509, + 510, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 511, 512, + 0, 331, 0, 0, 0, 0, 0, 0, 0, 604, + 513, 514, 515, 516, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 333, 334, 335, 336, 337, 0, 0, + 0, 517, 518, 519, 520, 521, 338, 339, 340, 341, + 342, 343, 344, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 345, 346, + 347, 348, 349, 350, 351, 522, 523, 524, 525, 526, + 527, 528, 529, 352, 0, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 0, 0, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 0, + 0, 509, 510, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 327, 328, 329, 330, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 332, 333, 334, 335, - 336, 337, 338, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 339, 340, - 341, 342, 343, 344, 0, 0, 0, 0, 0, 0, - 0, 0, 345, 0, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 1, 2, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 0, 0, 0, 318, 319, 320, 321, 322, - 323, 324, 0, 0, 0, 0, 0, 0, 0, 0, + 511, 512, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 513, 514, 515, 516, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 333, 334, 335, 336, 0, + 0, 0, 0, 517, 518, 519, 520, 521, 338, 339, + 340, 341, 342, 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 709, + 345, 346, 347, 348, 349, 350, 351, 522, 523, 524, + 525, 526, 527, 528, 529, 352, 0, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 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, 327, 328, - 329, 330, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 332, 333, 334, 335, 336, 337, 338, 0, 0, + 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, + 0, 0, 0, 332, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 333, 334, 335, + 336, 337, 0, 0, 0, 0, 0, 0, 0, 0, + 338, 339, 340, 341, 342, 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 339, 340, 341, 342, 343, 344, 0, - 0, 0, 0, 0, 0, 0, 0, 345, 0, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 1, 2, 3, 4, 5, 6, 7, + 0, 0, 345, 346, 347, 348, 349, 350, 351, 0, + 0, 0, 0, 0, 0, 0, 0, 352, 0, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, @@ -2408,118 +2212,74 @@ static const yytype_int16 yytable[] = 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 0, 0, 0, - 318, 319, 320, 321, 322, 323, 324, 0, 0, 0, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 0, 0, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 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, 822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 327, 328, 329, 330, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 332, 333, 334, 335, - 336, 337, 338, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 339, 340, - 341, 342, 343, 344, 0, 0, 0, 0, 0, 0, - 0, 0, 345, 0, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, + 334, 335, 336, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 338, 339, 340, 341, 342, 343, 344, 605, + 0, 0, 608, 0, 609, 610, 0, 0, 613, 0, + 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, + 351, 0, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 1, 2, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 0, 0, 0, 318, 319, 320, 321, 322, - 323, 324, 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, 857, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 327, 328, - 329, 330, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 332, 333, 334, 335, 336, 337, 338, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 339, 340, 341, 342, 343, 344, 0, - 0, 0, 0, 0, 0, 0, 0, 345, 0, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 0, 0, 0, - 318, 319, 320, 321, 322, 323, 324, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 0, 0, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 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, 445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 327, 328, 329, 330, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 332, 333, 334, 335, - 336, 337, 338, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 339, 340, - 341, 342, 343, 344, 0, 0, 0, 0, 0, 0, - 0, 0, 345, 0, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 2, 3, + 0, 333, 334, 335, 336, 0, 0, 0, 0, 0, + 0, 0, 0, 446, 338, 339, 340, 341, 342, 343, + 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 351, 0, 0, 0, 0, 0, 0, 0, + 0, 352, 0, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 0, 0, 61, 62, 63, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, @@ -2545,154 +2305,27 @@ static const yytype_int16 yytable[] = 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 0, 0, 0, 0, 0, 0, 321, 0, 0, - 0, 0, 0, 502, 503, 0, 0, 0, 0, 0, + 314, 315, 316, 317, 0, 0, 0, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 504, 505, 0, 0, 0, 639, 777, 0, - 0, 0, 0, 0, 506, 507, 508, 509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 510, 511, 512, 513, 514, - 332, 0, 0, 0, 0, 337, 338, 0, 0, 0, + 0, 331, 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, 515, 516, - 517, 518, 519, 520, 521, 522, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 358, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 0, 0, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 0, 0, 0, 0, 0, 0, - 321, 0, 0, 0, 0, 0, 502, 503, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 504, 505, 0, 0, 0, - 639, 888, 0, 0, 0, 0, 0, 506, 507, 508, - 509, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 510, 511, - 512, 513, 514, 332, 0, 0, 0, 0, 337, 338, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 515, 516, 517, 518, 519, 520, 521, 522, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 358, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 0, 0, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 0, 0, 0, - 0, 0, 0, 321, 0, 0, 0, 0, 0, 502, - 503, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 504, 505, - 0, 0, 578, 0, 0, 0, 0, 0, 0, 0, - 506, 507, 508, 509, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 510, 511, 512, 513, 514, 332, 0, 0, 0, - 0, 337, 338, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 515, 516, 517, 518, 519, 520, - 521, 522, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 358, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 0, 0, 0, 0, 0, 0, 321, 0, 0, 0, - 0, 0, 502, 503, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 504, 505, 0, 0, 0, 639, 0, 0, 0, - 0, 0, 0, 506, 507, 508, 509, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 510, 511, 512, 513, 514, 332, - 0, 0, 0, 0, 337, 338, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 515, 516, 517, - 518, 519, 520, 521, 522, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, + 0, 0, 0, 333, 334, 335, 336, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 338, 339, 340, 341, + 342, 343, 344, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 345, 346, + 347, 348, 349, 350, 351, 0, 0, 0, 0, 0, + 0, 0, 0, 352, 0, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 0, 0, 61, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, @@ -2718,68 +2351,120 @@ static const yytype_int16 yytable[] = 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 0, 0, 0, 0, 0, 0, 321, - 0, 0, 0, 0, 0, 502, 503, 0, 0, 0, + 312, 313, 314, 315, 316, 317, 0, 0, 0, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 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, 504, 505, 0, 0, 736, 0, - 0, 0, 0, 0, 0, 0, 506, 507, 508, 509, + 0, 0, 0, 0, 0, 0, 723, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 510, 511, 512, - 513, 514, 332, 0, 0, 0, 0, 337, 338, 0, + 0, 0, 0, 0, 0, 333, 334, 335, 336, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 338, 339, + 340, 341, 342, 343, 344, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 345, 346, 347, 348, 349, 350, 351, 0, 0, 0, + 0, 0, 0, 0, 0, 352, 0, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 0, + 0, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 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, 836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 515, 516, 517, 518, 519, 520, 521, 522, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 333, 334, 335, + 336, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 338, 339, 340, 341, 342, 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 358, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 0, 0, 0, 0, - 0, 0, 321, 0, 0, 0, 0, 0, 502, 503, + 0, 0, 345, 346, 347, 348, 349, 350, 351, 0, + 0, 0, 0, 0, 0, 0, 0, 352, 0, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 0, 0, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 504, 505, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 747, 506, - 507, 508, 509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 510, 511, 512, 513, 514, 332, 0, 0, 0, 0, - 337, 338, 0, 0, 0, 0, 0, 0, 0, 0, + 871, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, + 334, 335, 336, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 338, 339, 340, 341, 342, 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 515, 516, 517, 518, 519, 520, 521, - 522, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 358, 2, 3, 4, 5, + 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, + 351, 0, 0, 0, 0, 0, 0, 0, 0, 352, + 0, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 0, 0, 61, 62, 63, 64, 65, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, @@ -2804,249 +2489,28 @@ static const yytype_int16 yytable[] = 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, 311, 312, 313, 314, 0, - 0, 0, 0, 0, 0, 321, 0, 0, 0, 0, - 0, 502, 503, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 504, 505, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 506, 507, 508, 509, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 510, 511, 512, 513, 514, 332, 0, - 0, 0, 0, 337, 338, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 515, 516, 517, 518, - 519, 520, 521, 522, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 358, 2, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 0, 0, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 0, 0, 0, 0, 0, 0, 321, 0, - 0, 0, 0, 0, 502, 503, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 504, 505, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 507, 508, 509, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 510, 511, 512, 513, - 514, 332, 0, 0, 0, 0, 337, 657, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 515, - 516, 517, 518, 519, 520, 521, 522, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 358, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 0, - 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 0, 0, 0, 0, 0, - 0, 321, 0, 0, 0, 0, 0, 502, 503, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 504, 505, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 506, 507, - 508, 509, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 510, - 511, 512, 513, 697, 332, 0, 0, 0, 0, 337, - 338, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 515, 516, 517, 518, 519, 520, 521, 522, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 358, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 0, 0, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, - 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 0, 0, - 0, 0, 0, 0, 321, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 0, 0, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 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, 332, 0, 0, - 0, 0, 337, 338 -}; - -static const yytype_int16 yycheck[] = -{ - 0, 385, 0, 404, 496, 484, 625, 0, 409, 0, - 505, 0, 437, 442, 550, 545, 404, 570, 443, 555, - 404, 739, 393, 348, 416, 409, 572, 336, 564, 353, - 637, 561, 639, 348, 351, 642, 351, 573, 348, 531, - 359, 348, 356, 331, 332, 429, 385, 382, 352, 349, - 385, 349, 356, 351, 368, 484, 381, 382, 383, 384, - 358, 385, 433, 372, 329, 330, 385, 382, 493, 494, - 409, 550, 382, 502, 503, 382, 555, 349, 449, 367, - 368, 351, 561, 351, 349, 564, 351, 543, 358, 901, - 355, 359, 476, 549, 573, 551, 908, 643, 554, 359, - 556, 351, 558, 559, 351, 534, 918, 563, 358, 604, - 351, 606, 359, 592, 350, 382, 353, 358, 385, 356, - 356, 550, 359, 350, 743, 350, 555, 350, 350, 356, - 349, 356, 561, 356, 356, 564, 411, 412, 413, 414, - 415, 416, 417, 350, 573, 637, 350, 639, 350, 356, - 642, 543, 356, 350, 356, 350, 350, 652, 711, 356, - 350, 356, 356, 592, 656, 356, 356, 559, 359, 776, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, - 352, 350, 356, 350, 356, 350, 570, 356, 572, 356, - 358, 356, 350, 350, 350, 350, 350, 568, 356, 356, - 356, 356, 356, 350, 922, 350, 350, 350, 350, 356, - 350, 356, 356, 356, 356, 350, 356, 350, 352, 385, - 382, 356, 356, 385, 356, 844, 349, 359, 781, 349, - 382, 349, 661, 385, 635, 381, 382, 383, 384, 722, - 723, 724, 725, 382, 349, 382, 385, 635, 385, 856, - 745, 635, 382, 382, 749, 385, 385, 382, 382, 643, - 385, 385, 349, 382, 800, 801, 385, 382, 327, 328, - 385, 807, 808, 349, 356, 767, 768, 359, 361, 356, - 363, 706, 359, 813, 776, 349, 715, 716, 717, 718, - 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 729, 730, 731, 732, 733, 912, 367, 356, 356, 928, - 359, 359, 374, 375, 376, 333, 334, 364, 365, 366, - 359, 800, 801, 354, 353, 356, 353, 711, 807, 808, - 356, 357, 356, 357, 813, 385, 815, 718, 719, 385, - 720, 721, 385, 726, 727, 351, 351, 842, 385, 385, - 845, 350, 385, 356, 371, 359, 358, 358, 350, 356, - 356, 356, 356, 385, 856, 349, 356, 382, 356, 356, - 356, 800, 801, 356, 356, 350, 349, 358, 807, 808, - 359, 351, 349, 351, 813, 385, 815, 348, 352, 335, - 885, 354, 370, 393, 385, 369, 337, 781, 352, 349, - 385, 401, 393, 401, 404, 385, 898, 902, 401, 409, - 401, 409, 401, 404, 385, 359, 409, 359, 409, 419, - 912, 349, 917, 349, 359, 349, 357, 359, 349, 429, - 428, 349, 359, 433, 359, 350, 359, 385, 429, 358, - 385, 350, 433, 356, 845, 356, 356, 350, 352, 449, - 352, 356, 348, 393, 348, 354, 385, 350, 449, 349, - 358, 845, 353, 350, 359, 353, 728, 397, 353, 730, - 359, 354, 729, 731, 733, 433, 476, 732, 429, 575, - 433, 331, 820, 847, 885, 476, 907, 487, 705, 919, - 918, 427, 847, 401, 635, 885, 487, 635, 566, 635, - 801, 885, 798, 796, 815, 808, 805, 813, 803, 811, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 539, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 568, -1, - 570, -1, 572, -1, -1, -1, -1, 568, -1, 570, - -1, 572, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 625, -1, -1, -1, -1, - -1, -1, -1, -1, 625, 635, -1, -1, -1, -1, - -1, -1, -1, 643, 635, -1, -1, -1, -1, -1, - -1, -1, 643, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 711, -1, -1, -1, -1, -1, -1, -1, -1, - 711, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 739, - -1, -1, -1, 743, -1, -1, -1, -1, 739, -1, - -1, -1, 743, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 781, -1, -1, -1, -1, -1, -1, -1, -1, - 781, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 844, 845, -1, 847, -1, 847, - -1, -1, -1, 844, 845, -1, 847, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 885, -1, -1, -1, -1, - -1, -1, -1, -1, 885, -1, -1, -1, -1, -1, - -1, 901, -1, -1, -1, -1, -1, -1, 908, -1, - 901, -1, -1, -1, -1, -1, -1, 908, 918, -1, - -1, -1, 922, -1, -1, -1, -1, 918, 928, -1, - -1, 922, -1, -1, -1, 0, -1, 928, 3, 4, + 0, 333, 334, 335, 336, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 338, 339, 340, 341, 342, 343, + 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 351, 0, 0, 0, 0, 0, 0, 0, + 0, 352, 0, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, @@ -3057,7 +2521,7 @@ static const yytype_int16 yycheck[] = 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, @@ -3072,72 +2536,25 @@ static const yytype_int16 yycheck[] = 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 351, -1, -1, -1, - -1, -1, -1, -1, 359, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 373, 374, - 375, 376, 377, -1, -1, -1, -1, -1, -1, -1, - -1, 386, 387, 388, 389, 390, 391, 392, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 408, 409, 410, 411, 412, 413, -1, - -1, -1, -1, -1, -1, -1, -1, 422, -1, 424, - 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 455, 456, 457, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, 324, 325, 326, -1, -1, 329, - 330, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 348, 349, - -1, 351, -1, 353, 354, -1, -1, -1, -1, 359, - 360, 361, 362, 363, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 373, 374, 375, 376, 377, -1, -1, - -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, - 390, 391, 392, 393, 394, 395, 396, -1, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, - 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 455, 456, 457, 3, 4, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 509, 510, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 511, 512, 0, + 0, 0, 647, 791, 0, 0, 0, 0, 0, 513, + 514, 515, 516, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 517, 518, 519, 520, 521, 338, 0, 0, 0, 0, + 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 524, 525, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 365, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, @@ -3148,7 +2565,7 @@ static const yytype_int16 yycheck[] = 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, @@ -3163,72 +2580,25 @@ static const yytype_int16 yycheck[] = 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, -1, -1, 329, 330, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 348, 349, -1, 351, -1, 353, 354, - -1, -1, -1, -1, 359, 360, 361, 362, 363, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 373, 374, - 375, 376, 377, -1, -1, -1, 381, 382, 383, 384, - 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, -1, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 455, 456, 457, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, 324, 325, 326, -1, -1, 329, - 330, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 348, 349, - -1, 351, -1, 353, -1, -1, -1, -1, -1, 359, - 360, 361, 362, 363, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 373, 374, 375, 376, 377, -1, -1, - -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, - 390, 391, 392, 393, 394, 395, 396, -1, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, - 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 455, 456, 457, 3, 4, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 509, 510, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 511, 512, 0, + 0, 0, 647, 902, 0, 0, 0, 0, 0, 513, + 514, 515, 516, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 517, 518, 519, 520, 521, 338, 0, 0, 0, 0, + 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 524, 525, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 365, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, @@ -3239,7 +2609,7 @@ static const yytype_int16 yycheck[] = 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, @@ -3254,72 +2624,25 @@ static const yytype_int16 yycheck[] = 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, -1, -1, 329, 330, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 348, 349, -1, 351, -1, 353, -1, - -1, -1, -1, -1, 359, 360, 361, 362, 363, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 373, 374, - 375, 376, 377, -1, -1, -1, 381, 382, 383, 384, - 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, -1, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 455, 456, 457, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, 324, 325, 326, -1, -1, 329, - 330, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 348, 349, - -1, 351, -1, -1, -1, -1, -1, -1, -1, 359, - 360, 361, 362, 363, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 373, 374, 375, 376, 377, -1, -1, - -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, - 390, 391, 392, 393, 394, 395, 396, -1, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, - 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 455, 456, 457, 3, 4, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 509, 510, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 511, 512, 0, + 0, 585, 0, 0, 0, 0, 0, 0, 0, 513, + 514, 515, 516, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 517, 518, 519, 520, 521, 338, 0, 0, 0, 0, + 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 524, 525, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 365, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, @@ -3330,7 +2653,7 @@ static const yytype_int16 yycheck[] = 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, @@ -3345,72 +2668,25 @@ static const yytype_int16 yycheck[] = 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, -1, -1, 329, 330, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 348, 349, -1, 351, -1, -1, -1, - -1, -1, -1, -1, 359, 360, 361, 362, 363, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 373, 374, - 375, 376, 377, -1, -1, -1, 381, 382, 383, 384, - 385, 386, 387, 388, 389, 390, 391, 392, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, -1, 424, - 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 455, 456, 457, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, -1, -1, -1, - 320, 321, 322, 323, 324, 325, 326, -1, -1, 329, - 330, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 348, 349, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 360, 361, 362, 363, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 373, 374, 375, 376, -1, -1, -1, - -1, 381, 382, 383, 384, 385, 386, 387, 388, 389, - 390, 391, 392, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, -1, 424, 425, 426, 427, 428, 429, - 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 455, 456, 457, 3, 4, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 509, 510, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 511, 512, 0, + 0, 0, 647, 0, 0, 0, 0, 0, 0, 513, + 514, 515, 516, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 517, 518, 519, 520, 521, 338, 0, 0, 0, 0, + 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 524, 525, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 365, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, @@ -3421,7 +2697,7 @@ static const yytype_int16 yycheck[] = 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, @@ -3436,72 +2712,25 @@ static const yytype_int16 yycheck[] = 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 351, -1, -1, -1, - -1, -1, -1, -1, 359, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 373, 374, - 375, 376, 377, -1, -1, -1, -1, -1, -1, -1, - -1, 386, 387, 388, 389, 390, 391, 392, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 408, 409, 410, 411, 412, 413, -1, - -1, -1, -1, -1, -1, -1, -1, 422, -1, 424, - 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 455, 456, 457, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, -1, -1, -1, - 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 373, 374, 375, 376, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 386, 387, 388, 389, - 390, 391, 392, 393, -1, -1, 396, -1, 398, 399, - -1, -1, 402, -1, -1, -1, -1, -1, 408, 409, - 410, 411, 412, 413, -1, -1, -1, -1, -1, -1, - -1, -1, 422, -1, 424, 425, 426, 427, 428, 429, - 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 455, 456, 457, 3, 4, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 509, 510, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 511, 512, 0, + 0, 750, 0, 0, 0, 0, 0, 0, 0, 513, + 514, 515, 516, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 517, 518, 519, 520, 521, 338, 0, 0, 0, 0, + 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 524, 525, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 365, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, @@ -3512,7 +2741,7 @@ static const yytype_int16 yycheck[] = 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, @@ -3527,72 +2756,25 @@ static const yytype_int16 yycheck[] = 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, -1, -1, -1, 320, 321, 322, 323, 324, - 325, 326, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 359, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 373, 374, - 375, 376, -1, -1, -1, -1, -1, -1, -1, -1, - 385, 386, 387, 388, 389, 390, 391, 392, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 408, 409, 410, 411, 412, 413, -1, - -1, -1, -1, -1, -1, -1, -1, 422, -1, 424, - 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 455, 456, 457, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, -1, -1, -1, - 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 351, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 373, 374, 375, 376, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 386, 387, 388, 389, - 390, 391, 392, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 408, 409, - 410, 411, 412, 413, -1, -1, -1, -1, -1, -1, - -1, -1, 422, -1, 424, 425, 426, 427, 428, 429, - 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 455, 456, 457, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 509, 510, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 511, 512, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 761, 513, + 514, 515, 516, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 517, 518, 519, 520, 521, 338, 0, 0, 0, 0, + 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 524, 525, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 365, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, @@ -3603,7 +2785,7 @@ static const yytype_int16 yycheck[] = 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, @@ -3618,72 +2800,25 @@ static const yytype_int16 yycheck[] = 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, -1, -1, -1, 320, 321, 322, 323, 324, - 325, 326, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 354, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 373, 374, - 375, 376, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 386, 387, 388, 389, 390, 391, 392, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 408, 409, 410, 411, 412, 413, -1, - -1, -1, -1, -1, -1, -1, -1, 422, -1, 424, - 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 455, 456, 457, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, -1, -1, -1, - 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 354, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 373, 374, 375, 376, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 386, 387, 388, 389, - 390, 391, 392, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 408, 409, - 410, 411, 412, 413, -1, -1, -1, -1, -1, -1, - -1, -1, 422, -1, 424, 425, 426, 427, 428, 429, - 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 455, 456, 457, 3, 4, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 509, 510, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 511, 512, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 513, + 514, 515, 516, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 517, 518, 519, 520, 521, 338, 0, 0, 0, 0, + 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 524, 525, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 365, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, @@ -3694,7 +2829,95 @@ static const yytype_int16 yycheck[] = 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 509, 510, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 511, 512, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 513, + 514, 515, 516, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 517, 518, 519, 520, 521, 338, 0, 0, 0, 0, + 343, 665, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 524, 525, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 365, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 0, 0, 509, 510, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 511, 512, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 513, + 514, 515, 516, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 517, 518, 519, 520, 710, 338, 0, 0, 0, 0, + 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 524, 525, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 365, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, @@ -3709,72 +2932,167 @@ static const yytype_int16 yycheck[] = 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, -1, -1, -1, 320, 321, 322, 323, 324, - 325, 326, -1, -1, -1, -1, -1, -1, -1, -1, + 315, 316, 317, 0, 0, 0, 0, 0, 0, 324, + 0, 0, 0, 328, 329, 330, 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, 338, 0, 0, 0, 0, + 343, 344 +}; + +static const yytype_int16 yycheck[] = +{ + 0, 0, 0, 392, 503, 411, 0, 633, 411, 491, + 416, 444, 0, 449, 552, 568, 753, 450, 562, 579, + 512, 577, 411, 557, 354, 400, 342, 416, 423, 354, + 568, 645, 357, 647, 337, 338, 650, 571, 365, 538, + 359, 362, 354, 354, 915, 391, 580, 436, 357, 362, + 355, 922, 365, 374, 355, 491, 365, 387, 388, 389, + 390, 932, 378, 388, 391, 440, 355, 500, 501, 415, + 373, 374, 391, 509, 510, 557, 388, 388, 356, 355, + 357, 456, 335, 336, 362, 357, 568, 364, 355, 571, + 357, 651, 357, 365, 483, 373, 357, 364, 580, 364, + 356, 356, 355, 364, 357, 541, 362, 362, 361, 355, + 418, 419, 420, 421, 422, 423, 424, 355, 600, 356, + 612, 557, 614, 359, 356, 362, 362, 356, 355, 365, + 362, 757, 568, 362, 550, 571, 388, 356, 388, 391, + 556, 391, 558, 362, 580, 561, 645, 563, 647, 565, + 566, 650, 356, 356, 570, 550, 356, 356, 362, 362, + 356, 356, 362, 362, 600, 664, 362, 362, 660, 725, + 358, 566, 388, 355, 362, 391, 790, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 356, 577, 357, + 579, 388, 356, 362, 391, 356, 356, 364, 362, 936, + 575, 362, 362, 356, 356, 356, 356, 356, 356, 362, + 362, 362, 362, 362, 362, 356, 356, 356, 356, 356, + 355, 362, 362, 362, 362, 362, 358, 358, 333, 334, + 362, 362, 858, 669, 367, 355, 369, 643, 362, 795, + 643, 387, 388, 389, 390, 391, 736, 737, 738, 739, + 362, 365, 388, 365, 643, 391, 870, 387, 388, 389, + 390, 388, 651, 388, 391, 388, 391, 759, 391, 388, + 388, 763, 391, 391, 827, 356, 829, 821, 822, 373, + 814, 815, 781, 782, 360, 388, 362, 720, 391, 827, + 391, 790, 365, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 926, 391, 388, 362, 942, 391, 365, 362, + 362, 362, 365, 365, 365, 380, 381, 382, 339, 340, + 362, 363, 814, 815, 362, 363, 725, 370, 371, 372, + 732, 733, 391, 734, 735, 827, 359, 829, 357, 359, + 740, 741, 391, 391, 391, 357, 391, 365, 364, 356, + 364, 362, 365, 377, 856, 356, 362, 859, 391, 362, + 362, 870, 362, 362, 357, 362, 362, 362, 814, 815, + 362, 362, 355, 355, 364, 356, 355, 355, 354, 341, + 357, 827, 392, 829, 358, 343, 391, 376, 375, 358, + 400, 355, 360, 365, 392, 365, 795, 899, 408, 408, + 408, 411, 400, 912, 408, 391, 416, 416, 416, 355, + 408, 391, 355, 411, 916, 365, 426, 926, 416, 355, + 365, 363, 355, 362, 365, 365, 436, 435, 365, 931, + 440, 391, 391, 356, 364, 362, 362, 356, 436, 449, + 356, 358, 440, 859, 358, 354, 456, 362, 399, 354, + 388, 355, 360, 356, 364, 356, 391, 359, 456, 365, + 859, 359, 359, 742, 360, 365, 744, 743, 582, 403, + 436, 745, 337, 483, 746, 440, 719, 747, 861, 440, + 834, 921, 932, 899, 494, 483, 933, 434, 861, 643, + 899, 643, 573, 810, 819, 408, 494, 817, 812, 643, + 899, 825, 829, 815, -1, -1, 822, -1, -1, -1, + -1, 821, -1, -1, -1, -1, -1, -1, 827, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 354, + -1, -1, -1, -1, -1, -1, -1, -1, 546, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 373, 374, - 375, 376, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 386, 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 408, 409, 410, 411, 412, 413, -1, - -1, -1, -1, -1, -1, -1, -1, 422, -1, 424, - 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 455, 456, 457, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, - 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, -1, -1, -1, - 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, -1, -1, -1, -1, 575, -1, 577, -1, 579, + -1, -1, -1, -1, -1, -1, -1, 575, -1, 577, + -1, 579, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 633, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 643, -1, 633, -1, -1, -1, -1, + -1, 651, -1, -1, -1, 643, -1, -1, -1, -1, + -1, -1, -1, 651, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 373, 374, 375, 376, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 386, 387, 388, 389, - 390, 391, 392, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 408, 409, - 410, 411, 412, 413, -1, -1, -1, -1, -1, -1, - -1, -1, 422, -1, 424, 425, 426, 427, 428, 429, - 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 455, 456, 457, 4, 5, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 725, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 725, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 753, -1, -1, -1, 757, -1, -1, + -1, -1, -1, -1, -1, 753, -1, -1, -1, 757, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 795, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 795, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 858, 859, + -1, 861, -1, 861, -1, -1, -1, -1, -1, -1, + 858, 859, -1, 861, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 899, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 899, -1, -1, -1, 915, -1, -1, -1, -1, + -1, -1, 922, -1, -1, -1, -1, 915, -1, -1, + -1, -1, 932, -1, 922, -1, 936, -1, -1, -1, + -1, -1, 942, -1, 932, -1, -1, -1, 936, -1, + -1, -1, 0, -1, 942, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 357, + -1, -1, -1, -1, -1, -1, -1, 365, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 379, 380, 381, 382, 383, -1, -1, -1, -1, + -1, -1, -1, -1, 392, 393, 394, 395, 396, 397, + 398, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 414, 415, 416, 417, + 418, 419, 420, -1, -1, -1, -1, -1, -1, -1, + -1, 429, -1, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, -1, -1, 63, 64, 65, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, @@ -3800,68 +3118,351 @@ static const yytype_int16 yycheck[] = 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, -1, -1, -1, -1, -1, -1, 323, -1, -1, - -1, -1, -1, 329, 330, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 348, 349, -1, -1, -1, 353, 354, -1, - -1, -1, -1, -1, 360, 361, 362, 363, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 381, 382, 383, 384, 385, - 386, -1, -1, -1, -1, 391, 392, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 414, 415, - 416, 417, 418, 419, 420, 421, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 436, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, -1, -1, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, -1, -1, -1, -1, -1, -1, - 323, -1, -1, -1, -1, -1, 329, 330, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 348, 349, -1, -1, -1, - 353, 354, -1, -1, -1, -1, -1, 360, 361, 362, - 363, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 381, 382, - 383, 384, 385, 386, -1, -1, -1, -1, 391, 392, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 414, 415, 416, 417, 418, 419, 420, 421, -1, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, -1, -1, 335, + 336, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, + -1, 357, -1, 359, 360, -1, -1, -1, -1, 365, + 366, 367, 368, 369, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 379, 380, 381, 382, 383, -1, -1, + -1, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, -1, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, -1, + -1, 335, 336, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 436, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, -1, -1, 63, 64, 65, 66, 67, 68, 69, + 354, 355, -1, 357, -1, 359, 360, -1, -1, -1, + -1, 365, 366, 367, 368, 369, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 379, 380, 381, 382, 383, + -1, -1, -1, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, -1, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, -1, -1, 335, 336, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 354, 355, -1, 357, -1, 359, -1, -1, + -1, -1, -1, 365, 366, 367, 368, 369, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 379, 380, 381, + 382, 383, -1, -1, -1, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, -1, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, -1, -1, 335, 336, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 354, 355, -1, 357, -1, 359, + -1, -1, -1, -1, -1, 365, 366, 367, 368, 369, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 379, + 380, 381, 382, 383, -1, -1, -1, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, -1, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, -1, -1, 335, 336, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 354, 355, -1, 357, + -1, -1, -1, -1, -1, -1, -1, 365, 366, 367, + 368, 369, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 379, 380, 381, 382, 383, -1, -1, -1, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, -1, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, -1, -1, 335, + 336, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 354, 355, + -1, 357, -1, -1, -1, -1, -1, -1, -1, 365, + 366, 367, 368, 369, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 379, 380, 381, 382, 383, -1, -1, + -1, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, -1, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, -1, -1, -1, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, -1, + -1, 335, 336, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 354, 355, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 366, 367, 368, 369, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 379, 380, 381, 382, -1, + -1, -1, -1, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, -1, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 357, -1, -1, -1, -1, + -1, -1, -1, 365, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 379, 380, 381, + 382, 383, -1, -1, -1, -1, -1, -1, -1, -1, + 392, 393, 394, 395, 396, 397, 398, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 414, 415, 416, 417, 418, 419, 420, -1, + -1, -1, -1, -1, -1, -1, -1, 429, -1, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, @@ -3886,19 +3487,651 @@ static const yytype_int16 yycheck[] = 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, -1, -1, -1, - -1, -1, -1, 323, -1, -1, -1, -1, -1, 329, - 330, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 348, 349, - -1, -1, 352, -1, -1, -1, -1, -1, -1, -1, - 360, 361, 362, 363, -1, -1, -1, -1, -1, -1, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + -1, -1, -1, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 381, 382, 383, 384, 385, 386, -1, -1, -1, - -1, 391, 392, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 379, + 380, 381, 382, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 392, 393, 394, 395, 396, 397, 398, 399, + -1, -1, 402, -1, 404, 405, -1, -1, 408, -1, -1, -1, -1, -1, 414, 415, 416, 417, 418, 419, - 420, 421, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 436, 4, 5, 6, + 420, -1, -1, -1, -1, -1, -1, -1, -1, 429, + -1, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, -1, -1, -1, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 365, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 379, 380, 381, 382, -1, -1, -1, -1, -1, + -1, -1, -1, 391, 392, 393, 394, 395, 396, 397, + 398, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 414, 415, 416, 417, + 418, 419, 420, -1, -1, -1, -1, -1, -1, -1, + -1, 429, -1, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, -1, -1, -1, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 357, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 379, 380, 381, 382, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 392, 393, 394, 395, + 396, 397, 398, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 414, 415, + 416, 417, 418, 419, 420, -1, -1, -1, -1, -1, + -1, -1, -1, 429, -1, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, -1, -1, -1, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 360, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 379, 380, 381, 382, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 392, 393, + 394, 395, 396, 397, 398, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 414, 415, 416, 417, 418, 419, 420, -1, -1, -1, + -1, -1, -1, -1, -1, 429, -1, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, -1, -1, + -1, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 360, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 379, 380, 381, + 382, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 392, 393, 394, 395, 396, 397, 398, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 414, 415, 416, 417, 418, 419, 420, -1, + -1, -1, -1, -1, -1, -1, -1, 429, -1, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + -1, -1, -1, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 360, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 379, + 380, 381, 382, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 392, 393, 394, 395, 396, 397, 398, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 414, 415, 416, 417, 418, 419, + 420, -1, -1, -1, -1, -1, -1, -1, -1, 429, + -1, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, -1, -1, -1, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 379, 380, 381, 382, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 392, 393, 394, 395, 396, 397, + 398, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 414, 415, 416, 417, + 418, 419, 420, -1, -1, -1, -1, -1, -1, -1, + -1, 429, -1, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, 335, 336, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, + -1, -1, 359, 360, -1, -1, -1, -1, -1, 366, + 367, 368, 369, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, + 397, 398, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 421, 422, 423, 424, 425, 426, + 427, 428, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 443, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, 335, 336, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, + -1, -1, 359, 360, -1, -1, -1, -1, -1, 366, + 367, 368, 369, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, + 397, 398, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 421, 422, 423, 424, 425, 426, + 427, 428, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 443, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, 335, 336, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, + -1, 358, -1, -1, -1, -1, -1, -1, -1, 366, + 367, 368, 369, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, + 397, 398, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 421, 422, 423, 424, 425, 426, + 427, 428, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 443, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, 335, 336, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, + -1, -1, 359, -1, -1, -1, -1, -1, -1, 366, + 367, 368, 369, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, + 397, 398, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 421, 422, 423, 424, 425, 426, + 427, 428, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 443, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, 335, 336, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, + -1, 358, -1, -1, -1, -1, -1, -1, -1, 366, + 367, 368, 369, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, + 397, 398, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 421, 422, 423, 424, 425, 426, + 427, 428, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 443, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, 335, 336, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 365, 366, + 367, 368, 369, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, + 397, 398, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 421, 422, 423, 424, 425, 426, + 427, 428, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 443, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, 335, 336, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 366, + 367, 368, 369, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, + 397, 398, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 421, 422, 423, 424, 425, 426, + 427, 428, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 443, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, 335, 336, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 366, + 367, 368, 369, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, + 397, 398, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 421, 422, 423, 424, 425, 426, + 427, 428, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 443, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, @@ -3915,7 +4148,7 @@ static const yytype_int16 yycheck[] = 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, @@ -3930,278 +4163,63 @@ static const yytype_int16 yycheck[] = 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - -1, -1, -1, -1, -1, -1, 323, -1, -1, -1, - -1, -1, 329, 330, -1, -1, -1, -1, -1, -1, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, 335, 336, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 348, 349, -1, -1, -1, 353, -1, -1, -1, - -1, -1, -1, 360, 361, 362, 363, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 354, 355, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 366, + 367, 368, 369, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 381, 382, 383, 384, 385, 386, - -1, -1, -1, -1, 391, 392, -1, -1, -1, -1, + 387, 388, 389, 390, 391, 392, -1, -1, -1, -1, + 397, 398, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 414, 415, 416, - 417, 418, 419, 420, 421, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 436, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, -1, -1, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, - 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, - 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, -1, -1, -1, -1, -1, -1, 323, - -1, -1, -1, -1, -1, 329, 330, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 348, 349, -1, -1, 352, -1, - -1, -1, -1, -1, -1, -1, 360, 361, 362, 363, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 381, 382, 383, - 384, 385, 386, -1, -1, -1, -1, 391, 392, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 414, 415, 416, 417, 418, 419, 420, 421, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 436, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - -1, -1, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, -1, -1, -1, -1, - -1, -1, 323, -1, -1, -1, -1, -1, 329, 330, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 348, 349, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 359, 360, - 361, 362, 363, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 381, 382, 383, 384, 385, 386, -1, -1, -1, -1, - 391, 392, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 414, 415, 416, 417, 418, 419, 420, - 421, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 436, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, -1, -1, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, -1, - -1, -1, -1, -1, -1, 323, -1, -1, -1, -1, - -1, 329, 330, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 348, 349, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 360, 361, 362, 363, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 381, 382, 383, 384, 385, 386, -1, - -1, -1, -1, 391, 392, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 414, 415, 416, 417, - 418, 419, 420, 421, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 436, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, -1, -1, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, - 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, -1, -1, -1, -1, -1, -1, 323, -1, - -1, -1, -1, -1, 329, 330, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 348, 349, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 360, 361, 362, 363, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 381, 382, 383, 384, - 385, 386, -1, -1, -1, -1, 391, 392, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 414, - 415, 416, 417, 418, 419, 420, 421, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 436, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, -1, - -1, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, -1, -1, -1, -1, -1, - -1, 323, -1, -1, -1, -1, -1, 329, 330, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 348, 349, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 360, 361, - 362, 363, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 381, - 382, 383, 384, 385, 386, -1, -1, -1, -1, 391, - 392, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 414, 415, 416, 417, 418, 419, 420, 421, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 436, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, -1, -1, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, - 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, -1, -1, - -1, -1, -1, -1, 323, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 421, 422, 423, 424, 425, 426, + 427, 428, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 443, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, -1, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, 330, 331, 332, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 386, -1, -1, - -1, -1, 391, 392 + -1, -1, -1, -1, -1, 392, -1, -1, -1, -1, + 397, 398 }; - /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ +/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of + state STATE-NUM. */ static const yytype_int16 yystos[] = { 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, @@ -4236,145 +4254,148 @@ static const yytype_int16 yystos[] = 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 351, 359, 373, 374, 375, - 376, 377, 386, 387, 388, 389, 390, 391, 392, 408, - 409, 410, 411, 412, 413, 422, 424, 425, 426, 427, - 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 357, 365, 379, 380, 381, 382, 383, 392, 393, + 394, 395, 396, 397, 398, 414, 415, 416, 417, 418, + 419, 420, 429, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 489, 490, 493, 494, 495, 496, 500, 501, 502, 503, - 504, 505, 508, 509, 510, 511, 512, 514, 519, 520, - 521, 562, 563, 564, 566, 573, 577, 578, 583, 586, - 349, 349, 349, 349, 349, 349, 349, 349, 351, 520, - 353, 385, 349, 349, 359, 385, 359, 565, 350, 356, - 497, 498, 499, 509, 514, 356, 359, 385, 359, 385, - 510, 514, 367, 516, 517, 0, 563, 494, 502, 509, - 359, 493, 385, 569, 570, 587, 588, 382, 385, 569, - 382, 569, 382, 569, 382, 569, 382, 569, 569, 587, - 382, 569, 385, 567, 568, 514, 523, 353, 385, 409, - 506, 507, 385, 513, 351, 359, 515, 353, 541, 566, - 498, 497, 499, 385, 385, 349, 358, 515, 353, 356, - 359, 492, 329, 330, 348, 349, 360, 361, 362, 363, - 381, 382, 383, 384, 385, 414, 415, 416, 417, 418, - 419, 420, 421, 459, 460, 461, 463, 464, 465, 466, - 467, 468, 469, 470, 471, 512, 514, 518, 515, 350, - 385, 359, 358, 356, 350, 356, 350, 356, 358, 356, - 356, 356, 350, 356, 356, 356, 356, 356, 356, 356, - 350, 356, 350, 356, 349, 352, 356, 359, 509, 514, - 524, 525, 522, 358, 350, 356, 350, 356, 352, 470, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 351, 359, 353, 354, 359, 393, 394, 395, - 396, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 407, 423, 470, 483, 485, 487, 489, 493, 512, 514, - 530, 531, 532, 533, 534, 542, 543, 544, 545, 548, - 549, 552, 553, 554, 561, 566, 515, 358, 515, 353, - 485, 528, 358, 491, 385, 356, 359, 470, 470, 487, - 329, 330, 351, 355, 350, 350, 356, 392, 485, 349, - 470, 356, 368, 566, 348, 351, 382, 570, 587, 385, - 588, 348, 381, 382, 383, 384, 574, 575, 382, 483, - 488, 576, 382, 381, 382, 383, 384, 579, 580, 382, - 488, 581, 382, 348, 582, 382, 587, 385, 488, 584, - 585, 382, 488, 352, 568, 514, 385, 526, 527, 354, - 525, 524, 488, 507, 385, 364, 365, 366, 361, 363, - 327, 328, 331, 332, 367, 368, 333, 334, 371, 370, - 369, 335, 337, 336, 372, 352, 352, 483, 354, 535, - 349, 359, 359, 556, 349, 349, 359, 359, 487, 349, - 487, 357, 359, 359, 359, 359, 338, 339, 340, 341, - 342, 343, 344, 345, 346, 347, 358, 486, 356, 359, - 354, 531, 545, 549, 554, 528, 358, 354, 528, 529, - 528, 524, 385, 350, 462, 487, 385, 485, 470, 348, - 382, 571, 572, 350, 358, 350, 356, 350, 356, 350, - 356, 356, 350, 356, 350, 356, 350, 356, 356, 350, - 356, 356, 350, 356, 350, 356, 350, 350, 526, 515, - 356, 359, 354, 470, 470, 470, 472, 472, 473, 473, - 474, 474, 474, 474, 475, 475, 476, 477, 478, 479, - 480, 481, 484, 352, 542, 555, 531, 557, 487, 359, - 487, 357, 485, 485, 528, 354, 356, 354, 352, 352, - 356, 352, 356, 575, 574, 488, 576, 580, 579, 488, - 581, 348, 582, 584, 585, 359, 527, 487, 536, 487, - 502, 547, 393, 530, 543, 558, 350, 350, 354, 528, - 348, 382, 350, 350, 350, 350, 350, 350, 357, 354, - 385, 350, 349, 547, 559, 560, 538, 539, 540, 546, - 550, 485, 358, 532, 537, 541, 487, 359, 350, 397, - 534, 532, 353, 528, 350, 487, 537, 538, 542, 551, - 359, 354 + 458, 459, 460, 461, 462, 463, 464, 496, 497, 500, + 501, 502, 503, 507, 508, 509, 510, 511, 512, 515, + 516, 517, 518, 519, 521, 526, 527, 528, 569, 570, + 571, 573, 580, 584, 585, 591, 594, 355, 355, 355, + 355, 355, 355, 355, 355, 357, 527, 359, 391, 355, + 355, 365, 391, 365, 572, 356, 362, 504, 505, 506, + 516, 521, 362, 365, 391, 365, 391, 517, 521, 373, + 523, 524, 0, 570, 501, 509, 516, 365, 500, 391, + 576, 577, 595, 596, 388, 391, 576, 388, 576, 388, + 576, 388, 576, 388, 576, 576, 595, 388, 576, 391, + 574, 575, 521, 530, 359, 391, 415, 513, 514, 391, + 520, 357, 365, 522, 359, 548, 573, 505, 504, 506, + 391, 391, 355, 364, 522, 359, 362, 365, 499, 335, + 336, 354, 355, 366, 367, 368, 369, 387, 388, 389, + 390, 391, 421, 422, 423, 424, 425, 426, 427, 428, + 466, 467, 468, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 519, 521, 525, 522, 356, 391, 365, 364, + 362, 356, 362, 356, 362, 364, 362, 362, 362, 356, + 362, 362, 362, 362, 362, 362, 362, 356, 362, 356, + 362, 355, 358, 362, 365, 516, 521, 531, 532, 529, + 364, 356, 362, 356, 362, 358, 477, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 521, + 357, 365, 359, 360, 365, 399, 400, 401, 402, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 430, + 477, 490, 492, 494, 496, 500, 519, 521, 537, 538, + 539, 540, 541, 549, 550, 551, 552, 555, 556, 559, + 560, 561, 568, 573, 522, 364, 522, 359, 492, 535, + 364, 498, 391, 362, 365, 477, 477, 494, 335, 336, + 357, 361, 356, 356, 362, 398, 492, 355, 477, 362, + 374, 573, 354, 357, 388, 577, 595, 391, 596, 354, + 387, 388, 389, 390, 581, 582, 388, 490, 495, 583, + 388, 387, 388, 389, 390, 586, 587, 388, 387, 388, + 389, 390, 466, 588, 589, 388, 354, 590, 388, 595, + 391, 495, 526, 592, 593, 388, 495, 358, 575, 521, + 391, 533, 534, 360, 532, 531, 495, 514, 391, 370, + 371, 372, 367, 369, 333, 334, 337, 338, 373, 374, + 339, 340, 377, 376, 375, 341, 343, 342, 378, 358, + 358, 490, 360, 542, 355, 365, 365, 563, 355, 355, + 365, 365, 494, 355, 494, 363, 365, 365, 365, 365, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 364, 493, 362, 365, 360, 538, 552, 556, 561, 535, + 364, 360, 535, 536, 535, 531, 391, 356, 469, 494, + 391, 492, 477, 354, 388, 578, 579, 356, 364, 356, + 362, 356, 362, 356, 362, 362, 356, 362, 356, 362, + 356, 362, 362, 356, 362, 362, 356, 362, 356, 362, + 356, 356, 533, 522, 362, 365, 360, 477, 477, 477, + 479, 479, 480, 480, 481, 481, 481, 481, 482, 482, + 483, 484, 485, 486, 487, 488, 491, 358, 549, 562, + 538, 564, 494, 365, 494, 363, 492, 492, 535, 360, + 362, 360, 358, 358, 362, 358, 362, 582, 581, 495, + 583, 587, 586, 589, 588, 354, 590, 592, 593, 365, + 534, 494, 543, 494, 509, 554, 399, 537, 550, 565, + 356, 356, 360, 535, 354, 388, 356, 356, 356, 356, + 356, 356, 363, 360, 391, 356, 355, 554, 566, 567, + 545, 546, 547, 553, 557, 492, 364, 539, 544, 548, + 494, 365, 356, 403, 541, 539, 359, 535, 356, 494, + 544, 545, 549, 558, 365, 360 }; - /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ static const yytype_int16 yyr1[] = { - 0, 458, 459, 460, 460, 460, 460, 460, 460, 460, - 460, 460, 460, 460, 460, 460, 460, 460, 461, 461, - 461, 461, 461, 461, 462, 463, 464, 465, 465, 466, - 466, 467, 467, 468, 469, 469, 469, 470, 470, 470, - 470, 471, 471, 471, 471, 472, 472, 472, 472, 473, - 473, 473, 474, 474, 474, 475, 475, 475, 475, 475, - 476, 476, 476, 477, 477, 478, 478, 479, 479, 480, - 480, 481, 481, 482, 482, 483, 484, 483, 485, 485, - 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, - 486, 487, 487, 488, 489, 489, 489, 489, 489, 489, - 489, 489, 489, 489, 489, 491, 490, 492, 492, 493, - 493, 493, 493, 494, 494, 495, 495, 496, 497, 497, - 498, 498, 498, 498, 499, 500, 500, 500, 500, 500, - 501, 501, 501, 501, 501, 502, 502, 503, 504, 504, - 504, 504, 504, 504, 504, 504, 504, 504, 505, 506, - 506, 507, 507, 507, 508, 509, 509, 510, 510, 510, - 510, 510, 510, 510, 510, 510, 510, 510, 511, 511, - 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, - 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, - 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, - 511, 511, 511, 511, 512, 513, 513, 514, 514, 515, - 515, 515, 515, 516, 516, 517, 518, 518, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, - 519, 519, 519, 520, 520, 520, 522, 521, 523, 521, - 524, 524, 525, 525, 526, 526, 527, 527, 528, 528, - 528, 528, 529, 529, 530, 531, 531, 532, 532, 532, - 532, 532, 532, 532, 532, 533, 534, 535, 536, 534, - 537, 537, 539, 538, 540, 538, 541, 541, 542, 542, - 543, 543, 544, 544, 545, 546, 546, 547, 547, 548, - 548, 550, 549, 551, 551, 552, 552, 553, 553, 555, - 554, 556, 554, 557, 554, 558, 558, 559, 559, 560, - 560, 561, 561, 561, 561, 561, 561, 561, 561, 562, - 562, 563, 563, 563, 565, 564, 566, 567, 567, 568, - 568, 569, 569, 570, 570, 571, 571, 572, 572, 573, - 573, 573, 573, 573, 573, 574, 574, 575, 575, 575, - 575, 575, 576, 576, 577, 577, 578, 578, 578, 578, - 578, 578, 578, 578, 579, 579, 580, 580, 580, 580, - 581, 581, 582, 582, 583, 583, 583, 583, 584, 584, - 585, 586, 586, 587, 587, 588, 588 + 0, 465, 466, 467, 467, 467, 467, 467, 467, 467, + 467, 467, 467, 467, 467, 467, 467, 467, 468, 468, + 468, 468, 468, 468, 469, 470, 471, 472, 472, 473, + 473, 474, 474, 475, 476, 476, 476, 477, 477, 477, + 477, 478, 478, 478, 478, 479, 479, 479, 479, 480, + 480, 480, 481, 481, 481, 482, 482, 482, 482, 482, + 483, 483, 483, 484, 484, 485, 485, 486, 486, 487, + 487, 488, 488, 489, 489, 490, 491, 490, 492, 492, + 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, + 493, 494, 494, 495, 496, 496, 496, 496, 496, 496, + 496, 496, 496, 496, 496, 498, 497, 499, 499, 500, + 500, 500, 500, 501, 501, 502, 502, 503, 504, 504, + 505, 505, 505, 505, 506, 507, 507, 507, 507, 507, + 508, 508, 508, 508, 508, 509, 509, 510, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 512, 513, + 513, 514, 514, 514, 515, 516, 516, 517, 517, 517, + 517, 517, 517, 517, 517, 517, 517, 517, 518, 518, + 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, + 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, + 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, + 518, 518, 518, 518, 518, 518, 519, 520, 520, 521, + 521, 522, 522, 522, 522, 523, 523, 524, 525, 525, + 525, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, + 526, 527, 527, 527, 529, 528, 530, 528, 531, 531, + 532, 532, 533, 533, 534, 534, 535, 535, 535, 535, + 536, 536, 537, 538, 538, 539, 539, 539, 539, 539, + 539, 539, 539, 540, 541, 542, 543, 541, 544, 544, + 546, 545, 547, 545, 548, 548, 549, 549, 550, 550, + 551, 551, 552, 553, 553, 554, 554, 555, 555, 557, + 556, 558, 558, 559, 559, 560, 560, 562, 561, 563, + 561, 564, 561, 565, 565, 566, 566, 567, 567, 568, + 568, 568, 568, 568, 568, 568, 568, 569, 569, 570, + 570, 570, 572, 571, 573, 574, 574, 575, 575, 576, + 576, 577, 577, 578, 578, 579, 579, 580, 580, 580, + 580, 580, 580, 581, 581, 582, 582, 582, 582, 582, + 583, 583, 584, 584, 585, 585, 585, 585, 585, 585, + 585, 585, 586, 586, 587, 587, 587, 587, 588, 588, + 589, 589, 589, 589, 589, 590, 590, 591, 591, 591, + 591, 592, 592, 593, 593, 594, 594, 595, 595, 596, + 596 }; - /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ +/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ static const yytype_int8 yyr2[] = { 0, 2, 1, 1, 3, 1, 1, 1, 1, 1, @@ -4397,8 +4418,9 @@ static const yytype_int8 yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 4, 1, 1, 1, 3, 2, 3, 2, - 3, 3, 4, 1, 0, 3, 1, 3, 1, 1, + 1, 1, 1, 1, 4, 1, 1, 1, 3, 2, + 3, 2, 3, 3, 4, 1, 0, 3, 1, 1, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -4430,22 +4452,23 @@ static const yytype_int8 yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 6, 0, 5, - 1, 2, 3, 4, 1, 3, 1, 2, 1, 3, - 4, 2, 1, 3, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 2, 0, 0, 5, - 1, 1, 0, 2, 0, 2, 2, 3, 1, 2, - 1, 2, 1, 2, 5, 3, 1, 1, 4, 1, - 2, 0, 8, 0, 1, 3, 2, 1, 2, 0, - 6, 0, 8, 0, 7, 1, 1, 1, 0, 2, - 3, 2, 2, 2, 3, 2, 2, 2, 2, 1, - 2, 1, 1, 1, 0, 3, 5, 1, 3, 1, - 4, 1, 3, 5, 5, 1, 3, 1, 3, 4, - 6, 6, 8, 6, 8, 1, 3, 1, 1, 1, - 1, 1, 1, 3, 4, 6, 4, 6, 6, 8, - 6, 8, 6, 8, 1, 3, 1, 1, 1, 1, - 1, 3, 1, 3, 6, 8, 4, 6, 1, 3, - 1, 4, 6, 1, 3, 3, 3 + 1, 1, 1, 1, 0, 6, 0, 5, 1, 2, + 3, 4, 1, 3, 1, 2, 1, 3, 4, 2, + 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 0, 0, 5, 1, 1, + 0, 2, 0, 2, 2, 3, 1, 2, 1, 2, + 1, 2, 5, 3, 1, 1, 4, 1, 2, 0, + 8, 0, 1, 3, 2, 1, 2, 0, 6, 0, + 8, 0, 7, 1, 1, 1, 0, 2, 3, 2, + 2, 2, 3, 2, 2, 2, 2, 1, 2, 1, + 1, 1, 0, 3, 5, 1, 3, 1, 4, 1, + 3, 5, 5, 1, 3, 1, 3, 4, 6, 6, + 8, 6, 8, 1, 3, 1, 1, 1, 1, 1, + 1, 3, 4, 6, 4, 6, 6, 8, 6, 8, + 6, 8, 1, 3, 1, 1, 1, 1, 1, 3, + 1, 1, 1, 1, 1, 1, 3, 6, 8, 4, + 6, 1, 3, 1, 1, 4, 6, 1, 3, 3, + 3 }; @@ -4457,6 +4480,7 @@ enum { YYENOMEM = -2 }; #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab +#define YYNOMEM goto yyexhaustedlab #define YYRECOVERING() (!!yyerrstatus) @@ -4497,10 +4521,7 @@ do { \ YYFPRINTF Args; \ } while (0) -/* This macro is provided for backward compatibility. */ -# ifndef YY_LOCATION_PRINT -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif + # define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ @@ -4524,16 +4545,12 @@ yy_symbol_value_print (FILE *yyo, yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, glslang::TParseContext* pParseContext) { FILE *yyoutput = yyo; - YYUSE (yyoutput); - YYUSE (pParseContext); + YY_USE (yyoutput); + YY_USE (pParseContext); if (!yyvaluep) return; -# ifdef YYPRINT - if (yykind < YYNTOKENS) - YYPRINT (yyo, yytoknum[yykind], *yyvaluep); -# endif YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - YYUSE (yykind); + YY_USE (yykind); YY_IGNORE_MAYBE_UNINITIALIZED_END } @@ -4914,14 +4931,14 @@ static void yydestruct (const char *yymsg, yysymbol_kind_t yykind, YYSTYPE *yyvaluep, glslang::TParseContext* pParseContext) { - YYUSE (yyvaluep); - YYUSE (pParseContext); + YY_USE (yyvaluep); + YY_USE (pParseContext); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - YYUSE (yykind); + YY_USE (yykind); YY_IGNORE_MAYBE_UNINITIALIZED_END } @@ -4993,6 +5010,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); YYDPRINTF ((stderr, "Starting parse\n")); yychar = YYEMPTY; /* Cause a token to be read. */ + goto yysetstate; @@ -5018,7 +5036,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (yyss + yystacksize - 1 <= yyssp) #if !defined yyoverflow && !defined YYSTACK_RELOCATE - goto yyexhaustedlab; + YYNOMEM; #else { /* Get the current used size of the three stacks, in elements. */ @@ -5046,7 +5064,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); # else /* defined YYSTACK_RELOCATE */ /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; + YYNOMEM; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; @@ -5057,7 +5075,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); YY_CAST (union yyalloc *, YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); if (! yyptr) - goto yyexhaustedlab; + YYNOMEM; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE @@ -5079,6 +5097,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } #endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ + if (yystate == YYFINAL) YYACCEPT; @@ -5191,260 +5210,260 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); switch (yyn) { case 2: /* variable_identifier: IDENTIFIER */ -#line 392 "MachineIndependent/glslang.y" +#line 362 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleVariable((yyvsp[0].lex).loc, (yyvsp[0].lex).symbol, (yyvsp[0].lex).string); } -#line 5199 "MachineIndependent/glslang_tab.cpp" +#line 5218 "MachineIndependent/glslang_tab.cpp" break; case 3: /* primary_expression: variable_identifier */ -#line 398 "MachineIndependent/glslang.y" +#line 368 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5207 "MachineIndependent/glslang_tab.cpp" +#line 5226 "MachineIndependent/glslang_tab.cpp" break; case 4: /* primary_expression: LEFT_PAREN expression RIGHT_PAREN */ -#line 401 "MachineIndependent/glslang.y" +#line 371 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode); if ((yyval.interm.intermTypedNode)->getAsConstantUnion()) (yyval.interm.intermTypedNode)->getAsConstantUnion()->setExpression(); } -#line 5217 "MachineIndependent/glslang_tab.cpp" +#line 5236 "MachineIndependent/glslang_tab.cpp" break; case 5: /* primary_expression: FLOATCONSTANT */ -#line 406 "MachineIndependent/glslang.y" +#line 376 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat, (yyvsp[0].lex).loc, true); } -#line 5225 "MachineIndependent/glslang_tab.cpp" +#line 5244 "MachineIndependent/glslang_tab.cpp" break; case 6: /* primary_expression: INTCONSTANT */ -#line 409 "MachineIndependent/glslang.y" +#line 379 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true); } -#line 5233 "MachineIndependent/glslang_tab.cpp" +#line 5252 "MachineIndependent/glslang_tab.cpp" break; case 7: /* primary_expression: UINTCONSTANT */ -#line 412 "MachineIndependent/glslang.y" +#line 382 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true); } -#line 5242 "MachineIndependent/glslang_tab.cpp" +#line 5261 "MachineIndependent/glslang_tab.cpp" break; case 8: /* primary_expression: BOOLCONSTANT */ -#line 416 "MachineIndependent/glslang.y" +#line 386 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).b, (yyvsp[0].lex).loc, true); } -#line 5250 "MachineIndependent/glslang_tab.cpp" +#line 5269 "MachineIndependent/glslang_tab.cpp" break; case 9: /* primary_expression: STRING_LITERAL */ -#line 420 "MachineIndependent/glslang.y" +#line 389 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true); } -#line 5258 "MachineIndependent/glslang_tab.cpp" +#line 5277 "MachineIndependent/glslang_tab.cpp" break; case 10: /* primary_expression: INT32CONSTANT */ -#line 423 "MachineIndependent/glslang.y" +#line 392 "MachineIndependent/glslang.y" { parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true); } -#line 5267 "MachineIndependent/glslang_tab.cpp" +#line 5286 "MachineIndependent/glslang_tab.cpp" break; case 11: /* primary_expression: UINT32CONSTANT */ -#line 427 "MachineIndependent/glslang.y" +#line 396 "MachineIndependent/glslang.y" { parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true); } -#line 5276 "MachineIndependent/glslang_tab.cpp" +#line 5295 "MachineIndependent/glslang_tab.cpp" break; case 12: /* primary_expression: INT64CONSTANT */ -#line 431 "MachineIndependent/glslang.y" +#line 400 "MachineIndependent/glslang.y" { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i64, (yyvsp[0].lex).loc, true); } -#line 5285 "MachineIndependent/glslang_tab.cpp" +#line 5304 "MachineIndependent/glslang_tab.cpp" break; case 13: /* primary_expression: UINT64CONSTANT */ -#line 435 "MachineIndependent/glslang.y" +#line 404 "MachineIndependent/glslang.y" { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u64, (yyvsp[0].lex).loc, true); } -#line 5294 "MachineIndependent/glslang_tab.cpp" +#line 5313 "MachineIndependent/glslang_tab.cpp" break; case 14: /* primary_expression: INT16CONSTANT */ -#line 439 "MachineIndependent/glslang.y" +#line 408 "MachineIndependent/glslang.y" { parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit integer literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((short)(yyvsp[0].lex).i, (yyvsp[0].lex).loc, true); } -#line 5303 "MachineIndependent/glslang_tab.cpp" +#line 5322 "MachineIndependent/glslang_tab.cpp" break; case 15: /* primary_expression: UINT16CONSTANT */ -#line 443 "MachineIndependent/glslang.y" +#line 412 "MachineIndependent/glslang.y" { parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit unsigned integer literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((unsigned short)(yyvsp[0].lex).u, (yyvsp[0].lex).loc, true); } -#line 5312 "MachineIndependent/glslang_tab.cpp" +#line 5331 "MachineIndependent/glslang_tab.cpp" break; case 16: /* primary_expression: DOUBLECONSTANT */ -#line 447 "MachineIndependent/glslang.y" +#line 416 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double literal"); if (! parseContext.symbolTable.atBuiltInLevel()) parseContext.doubleCheck((yyvsp[0].lex).loc, "double literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtDouble, (yyvsp[0].lex).loc, true); } -#line 5323 "MachineIndependent/glslang_tab.cpp" +#line 5342 "MachineIndependent/glslang_tab.cpp" break; case 17: /* primary_expression: FLOAT16CONSTANT */ -#line 453 "MachineIndependent/glslang.y" +#line 422 "MachineIndependent/glslang.y" { parseContext.float16Check((yyvsp[0].lex).loc, "half float literal"); (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat16, (yyvsp[0].lex).loc, true); } -#line 5332 "MachineIndependent/glslang_tab.cpp" +#line 5351 "MachineIndependent/glslang_tab.cpp" break; case 18: /* postfix_expression: primary_expression */ -#line 461 "MachineIndependent/glslang.y" +#line 429 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5340 "MachineIndependent/glslang_tab.cpp" +#line 5359 "MachineIndependent/glslang_tab.cpp" break; case 19: /* postfix_expression: postfix_expression LEFT_BRACKET integer_expression RIGHT_BRACKET */ -#line 464 "MachineIndependent/glslang.y" +#line 432 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBracketDereference((yyvsp[-2].lex).loc, (yyvsp[-3].interm.intermTypedNode), (yyvsp[-1].interm.intermTypedNode)); } -#line 5348 "MachineIndependent/glslang_tab.cpp" +#line 5367 "MachineIndependent/glslang_tab.cpp" break; case 20: /* postfix_expression: function_call */ -#line 467 "MachineIndependent/glslang.y" +#line 435 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5356 "MachineIndependent/glslang_tab.cpp" +#line 5375 "MachineIndependent/glslang_tab.cpp" break; case 21: /* postfix_expression: postfix_expression DOT IDENTIFIER */ -#line 470 "MachineIndependent/glslang.y" +#line 438 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleDotDereference((yyvsp[0].lex).loc, (yyvsp[-2].interm.intermTypedNode), *(yyvsp[0].lex).string); } -#line 5364 "MachineIndependent/glslang_tab.cpp" +#line 5383 "MachineIndependent/glslang_tab.cpp" break; case 22: /* postfix_expression: postfix_expression INC_OP */ -#line 473 "MachineIndependent/glslang.y" +#line 441 "MachineIndependent/glslang.y" { parseContext.variableCheck((yyvsp[-1].interm.intermTypedNode)); parseContext.lValueErrorCheck((yyvsp[0].lex).loc, "++", (yyvsp[-1].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[0].lex).loc, "++", EOpPostIncrement, (yyvsp[-1].interm.intermTypedNode)); } -#line 5374 "MachineIndependent/glslang_tab.cpp" +#line 5393 "MachineIndependent/glslang_tab.cpp" break; case 23: /* postfix_expression: postfix_expression DEC_OP */ -#line 478 "MachineIndependent/glslang.y" +#line 446 "MachineIndependent/glslang.y" { parseContext.variableCheck((yyvsp[-1].interm.intermTypedNode)); parseContext.lValueErrorCheck((yyvsp[0].lex).loc, "--", (yyvsp[-1].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[0].lex).loc, "--", EOpPostDecrement, (yyvsp[-1].interm.intermTypedNode)); } -#line 5384 "MachineIndependent/glslang_tab.cpp" +#line 5403 "MachineIndependent/glslang_tab.cpp" break; case 24: /* integer_expression: expression */ -#line 486 "MachineIndependent/glslang.y" +#line 454 "MachineIndependent/glslang.y" { parseContext.integerCheck((yyvsp[0].interm.intermTypedNode), "[]"); (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5393 "MachineIndependent/glslang_tab.cpp" +#line 5412 "MachineIndependent/glslang_tab.cpp" break; case 25: /* function_call: function_call_or_method */ -#line 493 "MachineIndependent/glslang.y" +#line 461 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleFunctionCall((yyvsp[0].interm).loc, (yyvsp[0].interm).function, (yyvsp[0].interm).intermNode); delete (yyvsp[0].interm).function; } -#line 5402 "MachineIndependent/glslang_tab.cpp" +#line 5421 "MachineIndependent/glslang_tab.cpp" break; case 26: /* function_call_or_method: function_call_generic */ -#line 500 "MachineIndependent/glslang.y" +#line 468 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[0].interm); } -#line 5410 "MachineIndependent/glslang_tab.cpp" +#line 5429 "MachineIndependent/glslang_tab.cpp" break; case 27: /* function_call_generic: function_call_header_with_parameters RIGHT_PAREN */ -#line 506 "MachineIndependent/glslang.y" +#line 474 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[-1].interm); (yyval.interm).loc = (yyvsp[0].lex).loc; } -#line 5419 "MachineIndependent/glslang_tab.cpp" +#line 5438 "MachineIndependent/glslang_tab.cpp" break; case 28: /* function_call_generic: function_call_header_no_parameters RIGHT_PAREN */ -#line 510 "MachineIndependent/glslang.y" +#line 478 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[-1].interm); (yyval.interm).loc = (yyvsp[0].lex).loc; } -#line 5428 "MachineIndependent/glslang_tab.cpp" +#line 5447 "MachineIndependent/glslang_tab.cpp" break; case 29: /* function_call_header_no_parameters: function_call_header VOID */ -#line 517 "MachineIndependent/glslang.y" +#line 485 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[-1].interm); } -#line 5436 "MachineIndependent/glslang_tab.cpp" +#line 5455 "MachineIndependent/glslang_tab.cpp" break; case 30: /* function_call_header_no_parameters: function_call_header */ -#line 520 "MachineIndependent/glslang.y" +#line 488 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[0].interm); } -#line 5444 "MachineIndependent/glslang_tab.cpp" +#line 5463 "MachineIndependent/glslang_tab.cpp" break; case 31: /* function_call_header_with_parameters: function_call_header assignment_expression */ -#line 526 "MachineIndependent/glslang.y" +#line 494 "MachineIndependent/glslang.y" { TParameter param = { 0, new TType }; param.type->shallowCopy((yyvsp[0].interm.intermTypedNode)->getType()); @@ -5452,11 +5471,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm).function = (yyvsp[-1].interm).function; (yyval.interm).intermNode = (yyvsp[0].interm.intermTypedNode); } -#line 5456 "MachineIndependent/glslang_tab.cpp" +#line 5475 "MachineIndependent/glslang_tab.cpp" break; case 32: /* function_call_header_with_parameters: function_call_header_with_parameters COMMA assignment_expression */ -#line 533 "MachineIndependent/glslang.y" +#line 501 "MachineIndependent/glslang.y" { TParameter param = { 0, new TType }; param.type->shallowCopy((yyvsp[0].interm.intermTypedNode)->getType()); @@ -5464,29 +5483,29 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm).function = (yyvsp[-2].interm).function; (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-2].interm).intermNode, (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc); } -#line 5468 "MachineIndependent/glslang_tab.cpp" +#line 5487 "MachineIndependent/glslang_tab.cpp" break; case 33: /* function_call_header: function_identifier LEFT_PAREN */ -#line 543 "MachineIndependent/glslang.y" +#line 511 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[-1].interm); } -#line 5476 "MachineIndependent/glslang_tab.cpp" +#line 5495 "MachineIndependent/glslang_tab.cpp" break; case 34: /* function_identifier: type_specifier */ -#line 551 "MachineIndependent/glslang.y" +#line 519 "MachineIndependent/glslang.y" { // Constructor (yyval.interm).intermNode = 0; (yyval.interm).function = parseContext.handleConstructorCall((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type)); } -#line 5486 "MachineIndependent/glslang_tab.cpp" +#line 5505 "MachineIndependent/glslang_tab.cpp" break; case 35: /* function_identifier: postfix_expression */ -#line 556 "MachineIndependent/glslang.y" +#line 524 "MachineIndependent/glslang.y" { // // Should be a method or subroutine call, but we haven't recognized the arguments yet. @@ -5514,50 +5533,50 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm).function = new TFunction(empty, TType(EbtVoid), EOpNull); } } -#line 5518 "MachineIndependent/glslang_tab.cpp" +#line 5537 "MachineIndependent/glslang_tab.cpp" break; case 36: /* function_identifier: non_uniform_qualifier */ -#line 584 "MachineIndependent/glslang.y" +#line 551 "MachineIndependent/glslang.y" { // Constructor (yyval.interm).intermNode = 0; (yyval.interm).function = parseContext.handleConstructorCall((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type)); } -#line 5528 "MachineIndependent/glslang_tab.cpp" +#line 5547 "MachineIndependent/glslang_tab.cpp" break; case 37: /* unary_expression: postfix_expression */ -#line 593 "MachineIndependent/glslang.y" +#line 559 "MachineIndependent/glslang.y" { parseContext.variableCheck((yyvsp[0].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); if (TIntermMethod* method = (yyvsp[0].interm.intermTypedNode)->getAsMethodNode()) parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), "incomplete method syntax", method->getMethodName().c_str(), ""); } -#line 5539 "MachineIndependent/glslang_tab.cpp" +#line 5558 "MachineIndependent/glslang_tab.cpp" break; case 38: /* unary_expression: INC_OP unary_expression */ -#line 599 "MachineIndependent/glslang.y" +#line 565 "MachineIndependent/glslang.y" { parseContext.lValueErrorCheck((yyvsp[-1].lex).loc, "++", (yyvsp[0].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[-1].lex).loc, "++", EOpPreIncrement, (yyvsp[0].interm.intermTypedNode)); } -#line 5548 "MachineIndependent/glslang_tab.cpp" +#line 5567 "MachineIndependent/glslang_tab.cpp" break; case 39: /* unary_expression: DEC_OP unary_expression */ -#line 603 "MachineIndependent/glslang.y" +#line 569 "MachineIndependent/glslang.y" { parseContext.lValueErrorCheck((yyvsp[-1].lex).loc, "--", (yyvsp[0].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[-1].lex).loc, "--", EOpPreDecrement, (yyvsp[0].interm.intermTypedNode)); } -#line 5557 "MachineIndependent/glslang_tab.cpp" +#line 5576 "MachineIndependent/glslang_tab.cpp" break; case 40: /* unary_expression: unary_operator unary_expression */ -#line 607 "MachineIndependent/glslang.y" +#line 573 "MachineIndependent/glslang.y" { if ((yyvsp[-1].interm).op != EOpNull) { char errorOp[2] = {0, 0}; @@ -5574,179 +5593,179 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.intermTypedNode)->getAsConstantUnion()->setExpression(); } } -#line 5578 "MachineIndependent/glslang_tab.cpp" +#line 5597 "MachineIndependent/glslang_tab.cpp" break; case 41: /* unary_operator: PLUS */ -#line 627 "MachineIndependent/glslang.y" +#line 593 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNull; } -#line 5584 "MachineIndependent/glslang_tab.cpp" +#line 5603 "MachineIndependent/glslang_tab.cpp" break; case 42: /* unary_operator: DASH */ -#line 628 "MachineIndependent/glslang.y" +#line 594 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNegative; } -#line 5590 "MachineIndependent/glslang_tab.cpp" +#line 5609 "MachineIndependent/glslang_tab.cpp" break; case 43: /* unary_operator: BANG */ -#line 629 "MachineIndependent/glslang.y" +#line 595 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLogicalNot; } -#line 5596 "MachineIndependent/glslang_tab.cpp" +#line 5615 "MachineIndependent/glslang_tab.cpp" break; case 44: /* unary_operator: TILDE */ -#line 630 "MachineIndependent/glslang.y" +#line 596 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpBitwiseNot; parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise not"); } -#line 5603 "MachineIndependent/glslang_tab.cpp" +#line 5622 "MachineIndependent/glslang_tab.cpp" break; case 45: /* multiplicative_expression: unary_expression */ -#line 636 "MachineIndependent/glslang.y" +#line 602 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5609 "MachineIndependent/glslang_tab.cpp" +#line 5628 "MachineIndependent/glslang_tab.cpp" break; case 46: /* multiplicative_expression: multiplicative_expression STAR unary_expression */ -#line 637 "MachineIndependent/glslang.y" +#line 603 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "*", EOpMul, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5619 "MachineIndependent/glslang_tab.cpp" +#line 5638 "MachineIndependent/glslang_tab.cpp" break; case 47: /* multiplicative_expression: multiplicative_expression SLASH unary_expression */ -#line 642 "MachineIndependent/glslang.y" +#line 608 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "/", EOpDiv, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5629 "MachineIndependent/glslang_tab.cpp" +#line 5648 "MachineIndependent/glslang_tab.cpp" break; case 48: /* multiplicative_expression: multiplicative_expression PERCENT unary_expression */ -#line 647 "MachineIndependent/glslang.y" +#line 613 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "%"); (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "%", EOpMod, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5640 "MachineIndependent/glslang_tab.cpp" +#line 5659 "MachineIndependent/glslang_tab.cpp" break; case 49: /* additive_expression: multiplicative_expression */ -#line 656 "MachineIndependent/glslang.y" +#line 622 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5646 "MachineIndependent/glslang_tab.cpp" +#line 5665 "MachineIndependent/glslang_tab.cpp" break; case 50: /* additive_expression: additive_expression PLUS multiplicative_expression */ -#line 657 "MachineIndependent/glslang.y" +#line 623 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "+", EOpAdd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5656 "MachineIndependent/glslang_tab.cpp" +#line 5675 "MachineIndependent/glslang_tab.cpp" break; case 51: /* additive_expression: additive_expression DASH multiplicative_expression */ -#line 662 "MachineIndependent/glslang.y" +#line 628 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "-", EOpSub, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5666 "MachineIndependent/glslang_tab.cpp" +#line 5685 "MachineIndependent/glslang_tab.cpp" break; case 52: /* shift_expression: additive_expression */ -#line 670 "MachineIndependent/glslang.y" +#line 636 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5672 "MachineIndependent/glslang_tab.cpp" +#line 5691 "MachineIndependent/glslang_tab.cpp" break; case 53: /* shift_expression: shift_expression LEFT_OP additive_expression */ -#line 671 "MachineIndependent/glslang.y" +#line 637 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bit shift left"); (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "<<", EOpLeftShift, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5683 "MachineIndependent/glslang_tab.cpp" +#line 5702 "MachineIndependent/glslang_tab.cpp" break; case 54: /* shift_expression: shift_expression RIGHT_OP additive_expression */ -#line 677 "MachineIndependent/glslang.y" +#line 643 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bit shift right"); (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, ">>", EOpRightShift, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5694 "MachineIndependent/glslang_tab.cpp" +#line 5713 "MachineIndependent/glslang_tab.cpp" break; case 55: /* relational_expression: shift_expression */ -#line 686 "MachineIndependent/glslang.y" +#line 652 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5700 "MachineIndependent/glslang_tab.cpp" +#line 5719 "MachineIndependent/glslang_tab.cpp" break; case 56: /* relational_expression: relational_expression LEFT_ANGLE shift_expression */ -#line 687 "MachineIndependent/glslang.y" +#line 653 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "<", EOpLessThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 5710 "MachineIndependent/glslang_tab.cpp" +#line 5729 "MachineIndependent/glslang_tab.cpp" break; case 57: /* relational_expression: relational_expression RIGHT_ANGLE shift_expression */ -#line 692 "MachineIndependent/glslang.y" +#line 658 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, ">", EOpGreaterThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 5720 "MachineIndependent/glslang_tab.cpp" +#line 5739 "MachineIndependent/glslang_tab.cpp" break; case 58: /* relational_expression: relational_expression LE_OP shift_expression */ -#line 697 "MachineIndependent/glslang.y" +#line 663 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "<=", EOpLessThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 5730 "MachineIndependent/glslang_tab.cpp" +#line 5749 "MachineIndependent/glslang_tab.cpp" break; case 59: /* relational_expression: relational_expression GE_OP shift_expression */ -#line 702 "MachineIndependent/glslang.y" +#line 668 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, ">=", EOpGreaterThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 5740 "MachineIndependent/glslang_tab.cpp" +#line 5759 "MachineIndependent/glslang_tab.cpp" break; case 60: /* equality_expression: relational_expression */ -#line 710 "MachineIndependent/glslang.y" +#line 676 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5746 "MachineIndependent/glslang_tab.cpp" +#line 5765 "MachineIndependent/glslang_tab.cpp" break; case 61: /* equality_expression: equality_expression EQ_OP relational_expression */ -#line 711 "MachineIndependent/glslang.y" +#line 677 "MachineIndependent/glslang.y" { parseContext.arrayObjectCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array comparison"); parseContext.opaqueCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "=="); @@ -5756,11 +5775,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 5760 "MachineIndependent/glslang_tab.cpp" +#line 5779 "MachineIndependent/glslang_tab.cpp" break; case 62: /* equality_expression: equality_expression NE_OP relational_expression */ -#line 720 "MachineIndependent/glslang.y" +#line 686 "MachineIndependent/glslang.y" { parseContext.arrayObjectCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array comparison"); parseContext.opaqueCheck((yyvsp[-1].lex).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "!="); @@ -5770,124 +5789,124 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 5774 "MachineIndependent/glslang_tab.cpp" +#line 5793 "MachineIndependent/glslang_tab.cpp" break; case 63: /* and_expression: equality_expression */ -#line 732 "MachineIndependent/glslang.y" +#line 698 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5780 "MachineIndependent/glslang_tab.cpp" +#line 5799 "MachineIndependent/glslang_tab.cpp" break; case 64: /* and_expression: and_expression AMPERSAND equality_expression */ -#line 733 "MachineIndependent/glslang.y" +#line 699 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise and"); (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "&", EOpAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5791 "MachineIndependent/glslang_tab.cpp" +#line 5810 "MachineIndependent/glslang_tab.cpp" break; case 65: /* exclusive_or_expression: and_expression */ -#line 742 "MachineIndependent/glslang.y" +#line 708 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5797 "MachineIndependent/glslang_tab.cpp" +#line 5816 "MachineIndependent/glslang_tab.cpp" break; case 66: /* exclusive_or_expression: exclusive_or_expression CARET and_expression */ -#line 743 "MachineIndependent/glslang.y" +#line 709 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise exclusive or"); (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "^", EOpExclusiveOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5808 "MachineIndependent/glslang_tab.cpp" +#line 5827 "MachineIndependent/glslang_tab.cpp" break; case 67: /* inclusive_or_expression: exclusive_or_expression */ -#line 752 "MachineIndependent/glslang.y" +#line 718 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5814 "MachineIndependent/glslang_tab.cpp" +#line 5833 "MachineIndependent/glslang_tab.cpp" break; case 68: /* inclusive_or_expression: inclusive_or_expression VERTICAL_BAR exclusive_or_expression */ -#line 753 "MachineIndependent/glslang.y" +#line 719 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[-1].lex).loc, "bitwise inclusive or"); (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "|", EOpInclusiveOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 5825 "MachineIndependent/glslang_tab.cpp" +#line 5844 "MachineIndependent/glslang_tab.cpp" break; case 69: /* logical_and_expression: inclusive_or_expression */ -#line 762 "MachineIndependent/glslang.y" +#line 728 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5831 "MachineIndependent/glslang_tab.cpp" +#line 5850 "MachineIndependent/glslang_tab.cpp" break; case 70: /* logical_and_expression: logical_and_expression AND_OP inclusive_or_expression */ -#line 763 "MachineIndependent/glslang.y" +#line 729 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "&&", EOpLogicalAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 5841 "MachineIndependent/glslang_tab.cpp" +#line 5860 "MachineIndependent/glslang_tab.cpp" break; case 71: /* logical_xor_expression: logical_and_expression */ -#line 771 "MachineIndependent/glslang.y" +#line 737 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5847 "MachineIndependent/glslang_tab.cpp" +#line 5866 "MachineIndependent/glslang_tab.cpp" break; case 72: /* logical_xor_expression: logical_xor_expression XOR_OP logical_and_expression */ -#line 772 "MachineIndependent/glslang.y" +#line 738 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "^^", EOpLogicalXor, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 5857 "MachineIndependent/glslang_tab.cpp" +#line 5876 "MachineIndependent/glslang_tab.cpp" break; case 73: /* logical_or_expression: logical_xor_expression */ -#line 780 "MachineIndependent/glslang.y" +#line 746 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5863 "MachineIndependent/glslang_tab.cpp" +#line 5882 "MachineIndependent/glslang_tab.cpp" break; case 74: /* logical_or_expression: logical_or_expression OR_OP logical_xor_expression */ -#line 781 "MachineIndependent/glslang.y" +#line 747 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.handleBinaryMath((yyvsp[-1].lex).loc, "||", EOpLogicalOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); if ((yyval.interm.intermTypedNode) == 0) (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc); } -#line 5873 "MachineIndependent/glslang_tab.cpp" +#line 5892 "MachineIndependent/glslang_tab.cpp" break; case 75: /* conditional_expression: logical_or_expression */ -#line 789 "MachineIndependent/glslang.y" +#line 755 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5879 "MachineIndependent/glslang_tab.cpp" +#line 5898 "MachineIndependent/glslang_tab.cpp" break; case 76: /* $@1: %empty */ -#line 790 "MachineIndependent/glslang.y" +#line 756 "MachineIndependent/glslang.y" { ++parseContext.controlFlowNestingLevel; } -#line 5887 "MachineIndependent/glslang_tab.cpp" +#line 5906 "MachineIndependent/glslang_tab.cpp" break; case 77: /* conditional_expression: logical_or_expression QUESTION $@1 expression COLON assignment_expression */ -#line 793 "MachineIndependent/glslang.y" +#line 759 "MachineIndependent/glslang.y" { --parseContext.controlFlowNestingLevel; parseContext.boolCheck((yyvsp[-4].lex).loc, (yyvsp[-5].interm.intermTypedNode)); @@ -5900,17 +5919,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } } -#line 5904 "MachineIndependent/glslang_tab.cpp" +#line 5923 "MachineIndependent/glslang_tab.cpp" break; case 78: /* assignment_expression: conditional_expression */ -#line 808 "MachineIndependent/glslang.y" +#line 774 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 5910 "MachineIndependent/glslang_tab.cpp" +#line 5929 "MachineIndependent/glslang_tab.cpp" break; case 79: /* assignment_expression: unary_expression assignment_operator assignment_expression */ -#line 809 "MachineIndependent/glslang.y" +#line 775 "MachineIndependent/glslang.y" { parseContext.arrayObjectCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "array assignment"); parseContext.opaqueCheck((yyvsp[-1].interm).loc, (yyvsp[-2].interm.intermTypedNode)->getType(), "="); @@ -5924,119 +5943,119 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } } -#line 5928 "MachineIndependent/glslang_tab.cpp" +#line 5947 "MachineIndependent/glslang_tab.cpp" break; case 80: /* assignment_operator: EQUAL */ -#line 825 "MachineIndependent/glslang.y" +#line 791 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpAssign; } -#line 5937 "MachineIndependent/glslang_tab.cpp" +#line 5956 "MachineIndependent/glslang_tab.cpp" break; case 81: /* assignment_operator: MUL_ASSIGN */ -#line 829 "MachineIndependent/glslang.y" +#line 795 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpMulAssign; } -#line 5946 "MachineIndependent/glslang_tab.cpp" +#line 5965 "MachineIndependent/glslang_tab.cpp" break; case 82: /* assignment_operator: DIV_ASSIGN */ -#line 833 "MachineIndependent/glslang.y" +#line 799 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpDivAssign; } -#line 5955 "MachineIndependent/glslang_tab.cpp" +#line 5974 "MachineIndependent/glslang_tab.cpp" break; case 83: /* assignment_operator: MOD_ASSIGN */ -#line 837 "MachineIndependent/glslang.y" +#line 803 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "%="); (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpModAssign; } -#line 5965 "MachineIndependent/glslang_tab.cpp" +#line 5984 "MachineIndependent/glslang_tab.cpp" break; case 84: /* assignment_operator: ADD_ASSIGN */ -#line 842 "MachineIndependent/glslang.y" +#line 808 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpAddAssign; } -#line 5974 "MachineIndependent/glslang_tab.cpp" +#line 5993 "MachineIndependent/glslang_tab.cpp" break; case 85: /* assignment_operator: SUB_ASSIGN */ -#line 846 "MachineIndependent/glslang.y" +#line 812 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpSubAssign; } -#line 5983 "MachineIndependent/glslang_tab.cpp" +#line 6002 "MachineIndependent/glslang_tab.cpp" break; case 86: /* assignment_operator: LEFT_ASSIGN */ -#line 850 "MachineIndependent/glslang.y" +#line 816 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bit-shift left assign"); (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLeftShiftAssign; } -#line 5992 "MachineIndependent/glslang_tab.cpp" +#line 6011 "MachineIndependent/glslang_tab.cpp" break; case 87: /* assignment_operator: RIGHT_ASSIGN */ -#line 854 "MachineIndependent/glslang.y" +#line 820 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bit-shift right assign"); (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpRightShiftAssign; } -#line 6001 "MachineIndependent/glslang_tab.cpp" +#line 6020 "MachineIndependent/glslang_tab.cpp" break; case 88: /* assignment_operator: AND_ASSIGN */ -#line 858 "MachineIndependent/glslang.y" +#line 824 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-and assign"); (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpAndAssign; } -#line 6010 "MachineIndependent/glslang_tab.cpp" +#line 6029 "MachineIndependent/glslang_tab.cpp" break; case 89: /* assignment_operator: XOR_ASSIGN */ -#line 862 "MachineIndependent/glslang.y" +#line 828 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-xor assign"); (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpExclusiveOrAssign; } -#line 6019 "MachineIndependent/glslang_tab.cpp" +#line 6038 "MachineIndependent/glslang_tab.cpp" break; case 90: /* assignment_operator: OR_ASSIGN */ -#line 866 "MachineIndependent/glslang.y" +#line 832 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-or assign"); (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpInclusiveOrAssign; } -#line 6028 "MachineIndependent/glslang_tab.cpp" +#line 6047 "MachineIndependent/glslang_tab.cpp" break; case 91: /* expression: assignment_expression */ -#line 873 "MachineIndependent/glslang.y" +#line 839 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 6036 "MachineIndependent/glslang_tab.cpp" +#line 6055 "MachineIndependent/glslang_tab.cpp" break; case 92: /* expression: expression COMMA assignment_expression */ -#line 876 "MachineIndependent/glslang.y" +#line 842 "MachineIndependent/glslang.y" { parseContext.samplerConstructorLocationCheck((yyvsp[-1].lex).loc, ",", (yyvsp[0].interm.intermTypedNode)); (yyval.interm.intermTypedNode) = parseContext.intermediate.addComma((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc); @@ -6045,30 +6064,30 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } } -#line 6049 "MachineIndependent/glslang_tab.cpp" +#line 6068 "MachineIndependent/glslang_tab.cpp" break; case 93: /* constant_expression: conditional_expression */ -#line 887 "MachineIndependent/glslang.y" +#line 853 "MachineIndependent/glslang.y" { parseContext.constantValueCheck((yyvsp[0].interm.intermTypedNode), ""); (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 6058 "MachineIndependent/glslang_tab.cpp" +#line 6077 "MachineIndependent/glslang_tab.cpp" break; case 94: /* declaration: function_prototype SEMICOLON */ -#line 894 "MachineIndependent/glslang.y" +#line 860 "MachineIndependent/glslang.y" { parseContext.handleFunctionDeclarator((yyvsp[-1].interm).loc, *(yyvsp[-1].interm).function, true /* prototype */); (yyval.interm.intermNode) = 0; // TODO: 4.0 functionality: subroutines: make the identifier a user type for this signature } -#line 6068 "MachineIndependent/glslang_tab.cpp" +#line 6087 "MachineIndependent/glslang_tab.cpp" break; case 95: /* declaration: spirv_instruction_qualifier function_prototype SEMICOLON */ -#line 900 "MachineIndependent/glslang.y" +#line 865 "MachineIndependent/glslang.y" { parseContext.requireExtensions((yyvsp[-1].interm).loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V instruction qualifier"); (yyvsp[-1].interm).function->setSpirvInstruction(*(yyvsp[-2].interm.spirvInst)); // Attach SPIR-V intruction qualifier @@ -6076,31 +6095,31 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.intermNode) = 0; // TODO: 4.0 functionality: subroutines: make the identifier a user type for this signature } -#line 6080 "MachineIndependent/glslang_tab.cpp" +#line 6099 "MachineIndependent/glslang_tab.cpp" break; case 96: /* declaration: spirv_execution_mode_qualifier SEMICOLON */ -#line 907 "MachineIndependent/glslang.y" +#line 872 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "SPIR-V execution mode qualifier"); parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V execution mode qualifier"); (yyval.interm.intermNode) = 0; } -#line 6090 "MachineIndependent/glslang_tab.cpp" +#line 6109 "MachineIndependent/glslang_tab.cpp" break; case 97: /* declaration: init_declarator_list SEMICOLON */ -#line 913 "MachineIndependent/glslang.y" +#line 877 "MachineIndependent/glslang.y" { if ((yyvsp[-1].interm).intermNode && (yyvsp[-1].interm).intermNode->getAsAggregate()) (yyvsp[-1].interm).intermNode->getAsAggregate()->setOperator(EOpSequence); (yyval.interm.intermNode) = (yyvsp[-1].interm).intermNode; } -#line 6100 "MachineIndependent/glslang_tab.cpp" +#line 6119 "MachineIndependent/glslang_tab.cpp" break; case 98: /* declaration: PRECISION precision_qualifier type_specifier SEMICOLON */ -#line 918 "MachineIndependent/glslang.y" +#line 882 "MachineIndependent/glslang.y" { parseContext.profileRequires((yyvsp[-3].lex).loc, ENoProfile, 130, 0, "precision statement"); // lazy setting of the previous scope's defaults, has effect only the first time it is called in a particular scope @@ -6108,75 +6127,75 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); parseContext.setDefaultPrecision((yyvsp[-3].lex).loc, (yyvsp[-1].interm.type), (yyvsp[-2].interm.type).qualifier.precision); (yyval.interm.intermNode) = 0; } -#line 6112 "MachineIndependent/glslang_tab.cpp" +#line 6131 "MachineIndependent/glslang_tab.cpp" break; case 99: /* declaration: block_structure SEMICOLON */ -#line 925 "MachineIndependent/glslang.y" +#line 889 "MachineIndependent/glslang.y" { parseContext.declareBlock((yyvsp[-1].interm).loc, *(yyvsp[-1].interm).typeList); (yyval.interm.intermNode) = 0; } -#line 6121 "MachineIndependent/glslang_tab.cpp" +#line 6140 "MachineIndependent/glslang_tab.cpp" break; case 100: /* declaration: block_structure IDENTIFIER SEMICOLON */ -#line 929 "MachineIndependent/glslang.y" +#line 893 "MachineIndependent/glslang.y" { parseContext.declareBlock((yyvsp[-2].interm).loc, *(yyvsp[-2].interm).typeList, (yyvsp[-1].lex).string); (yyval.interm.intermNode) = 0; } -#line 6130 "MachineIndependent/glslang_tab.cpp" +#line 6149 "MachineIndependent/glslang_tab.cpp" break; case 101: /* declaration: block_structure IDENTIFIER array_specifier SEMICOLON */ -#line 933 "MachineIndependent/glslang.y" +#line 897 "MachineIndependent/glslang.y" { parseContext.declareBlock((yyvsp[-3].interm).loc, *(yyvsp[-3].interm).typeList, (yyvsp[-2].lex).string, (yyvsp[-1].interm).arraySizes); (yyval.interm.intermNode) = 0; } -#line 6139 "MachineIndependent/glslang_tab.cpp" +#line 6158 "MachineIndependent/glslang_tab.cpp" break; case 102: /* declaration: type_qualifier SEMICOLON */ -#line 937 "MachineIndependent/glslang.y" +#line 901 "MachineIndependent/glslang.y" { parseContext.globalQualifierFixCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier); parseContext.updateStandaloneQualifierDefaults((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type)); (yyval.interm.intermNode) = 0; } -#line 6149 "MachineIndependent/glslang_tab.cpp" +#line 6168 "MachineIndependent/glslang_tab.cpp" break; case 103: /* declaration: type_qualifier IDENTIFIER SEMICOLON */ -#line 942 "MachineIndependent/glslang.y" +#line 906 "MachineIndependent/glslang.y" { parseContext.checkNoShaderLayouts((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).shaderQualifiers); parseContext.addQualifierToExisting((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).qualifier, *(yyvsp[-1].lex).string); (yyval.interm.intermNode) = 0; } -#line 6159 "MachineIndependent/glslang_tab.cpp" +#line 6178 "MachineIndependent/glslang_tab.cpp" break; case 104: /* declaration: type_qualifier IDENTIFIER identifier_list SEMICOLON */ -#line 947 "MachineIndependent/glslang.y" +#line 911 "MachineIndependent/glslang.y" { parseContext.checkNoShaderLayouts((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).shaderQualifiers); (yyvsp[-1].interm.identifierList)->push_back((yyvsp[-2].lex).string); parseContext.addQualifierToExisting((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).qualifier, *(yyvsp[-1].interm.identifierList)); (yyval.interm.intermNode) = 0; } -#line 6170 "MachineIndependent/glslang_tab.cpp" +#line 6189 "MachineIndependent/glslang_tab.cpp" break; case 105: /* $@2: %empty */ -#line 956 "MachineIndependent/glslang.y" +#line 920 "MachineIndependent/glslang.y" { parseContext.nestedBlockCheck((yyvsp[-2].interm.type).loc); } -#line 6176 "MachineIndependent/glslang_tab.cpp" +#line 6195 "MachineIndependent/glslang_tab.cpp" break; case 106: /* block_structure: type_qualifier IDENTIFIER LEFT_BRACE $@2 struct_declaration_list RIGHT_BRACE */ -#line 956 "MachineIndependent/glslang.y" +#line 920 "MachineIndependent/glslang.y" { --parseContext.blockNestingLevel; parseContext.blockName = (yyvsp[-4].lex).string; @@ -6186,88 +6205,89 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm).loc = (yyvsp[-5].interm.type).loc; (yyval.interm).typeList = (yyvsp[-1].interm.typeList); } -#line 6190 "MachineIndependent/glslang_tab.cpp" +#line 6209 "MachineIndependent/glslang_tab.cpp" break; case 107: /* identifier_list: COMMA IDENTIFIER */ -#line 967 "MachineIndependent/glslang.y" +#line 931 "MachineIndependent/glslang.y" { (yyval.interm.identifierList) = new TIdentifierList; (yyval.interm.identifierList)->push_back((yyvsp[0].lex).string); } -#line 6199 "MachineIndependent/glslang_tab.cpp" +#line 6218 "MachineIndependent/glslang_tab.cpp" break; case 108: /* identifier_list: identifier_list COMMA IDENTIFIER */ -#line 971 "MachineIndependent/glslang.y" +#line 935 "MachineIndependent/glslang.y" { (yyval.interm.identifierList) = (yyvsp[-2].interm.identifierList); (yyval.interm.identifierList)->push_back((yyvsp[0].lex).string); } -#line 6208 "MachineIndependent/glslang_tab.cpp" +#line 6227 "MachineIndependent/glslang_tab.cpp" break; case 109: /* function_prototype: function_declarator RIGHT_PAREN */ -#line 978 "MachineIndependent/glslang.y" +#line 942 "MachineIndependent/glslang.y" { (yyval.interm).function = (yyvsp[-1].interm.function); + if (parseContext.compileOnly) (yyval.interm).function->setExport(); (yyval.interm).loc = (yyvsp[0].lex).loc; } -#line 6217 "MachineIndependent/glslang_tab.cpp" +#line 6237 "MachineIndependent/glslang_tab.cpp" break; case 110: /* function_prototype: function_declarator RIGHT_PAREN attribute */ -#line 982 "MachineIndependent/glslang.y" +#line 947 "MachineIndependent/glslang.y" { (yyval.interm).function = (yyvsp[-2].interm.function); + if (parseContext.compileOnly) (yyval.interm).function->setExport(); (yyval.interm).loc = (yyvsp[-1].lex).loc; - parseContext.requireExtensions((yyvsp[-1].lex).loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute"); parseContext.handleFunctionAttributes((yyvsp[-1].lex).loc, *(yyvsp[0].interm.attributes)); } -#line 6228 "MachineIndependent/glslang_tab.cpp" +#line 6248 "MachineIndependent/glslang_tab.cpp" break; case 111: /* function_prototype: attribute function_declarator RIGHT_PAREN */ -#line 988 "MachineIndependent/glslang.y" +#line 953 "MachineIndependent/glslang.y" { (yyval.interm).function = (yyvsp[-1].interm.function); + if (parseContext.compileOnly) (yyval.interm).function->setExport(); (yyval.interm).loc = (yyvsp[0].lex).loc; - parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute"); parseContext.handleFunctionAttributes((yyvsp[0].lex).loc, *(yyvsp[-2].interm.attributes)); } -#line 6239 "MachineIndependent/glslang_tab.cpp" +#line 6259 "MachineIndependent/glslang_tab.cpp" break; case 112: /* function_prototype: attribute function_declarator RIGHT_PAREN attribute */ -#line 994 "MachineIndependent/glslang.y" +#line 959 "MachineIndependent/glslang.y" { (yyval.interm).function = (yyvsp[-2].interm.function); + if (parseContext.compileOnly) (yyval.interm).function->setExport(); (yyval.interm).loc = (yyvsp[-1].lex).loc; - parseContext.requireExtensions((yyvsp[-1].lex).loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute"); parseContext.handleFunctionAttributes((yyvsp[-1].lex).loc, *(yyvsp[-3].interm.attributes)); parseContext.handleFunctionAttributes((yyvsp[-1].lex).loc, *(yyvsp[0].interm.attributes)); } -#line 6251 "MachineIndependent/glslang_tab.cpp" +#line 6271 "MachineIndependent/glslang_tab.cpp" break; case 113: /* function_declarator: function_header */ -#line 1004 "MachineIndependent/glslang.y" +#line 969 "MachineIndependent/glslang.y" { (yyval.interm.function) = (yyvsp[0].interm.function); } -#line 6259 "MachineIndependent/glslang_tab.cpp" +#line 6279 "MachineIndependent/glslang_tab.cpp" break; case 114: /* function_declarator: function_header_with_parameters */ -#line 1007 "MachineIndependent/glslang.y" +#line 972 "MachineIndependent/glslang.y" { (yyval.interm.function) = (yyvsp[0].interm.function); } -#line 6267 "MachineIndependent/glslang_tab.cpp" +#line 6287 "MachineIndependent/glslang_tab.cpp" break; case 115: /* function_header_with_parameters: function_header parameter_declaration */ -#line 1014 "MachineIndependent/glslang.y" +#line 979 "MachineIndependent/glslang.y" { // Add the parameter (yyval.interm.function) = (yyvsp[-1].interm.function); @@ -6276,11 +6296,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); else delete (yyvsp[0].interm).param.type; } -#line 6280 "MachineIndependent/glslang_tab.cpp" +#line 6300 "MachineIndependent/glslang_tab.cpp" break; case 116: /* function_header_with_parameters: function_header_with_parameters COMMA parameter_declaration */ -#line 1022 "MachineIndependent/glslang.y" +#line 987 "MachineIndependent/glslang.y" { // // Only first parameter of one-parameter functions can be void @@ -6298,11 +6318,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyvsp[-2].interm.function)->addParameter((yyvsp[0].interm).param); } } -#line 6302 "MachineIndependent/glslang_tab.cpp" +#line 6322 "MachineIndependent/glslang_tab.cpp" break; case 117: /* function_header: fully_specified_type IDENTIFIER LEFT_PAREN */ -#line 1042 "MachineIndependent/glslang.y" +#line 1007 "MachineIndependent/glslang.y" { if ((yyvsp[-2].interm.type).qualifier.storage != EvqGlobal && (yyvsp[-2].interm.type).qualifier.storage != EvqTemporary) { parseContext.error((yyvsp[-1].lex).loc, "no qualifiers allowed for function return", @@ -6322,11 +6342,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); function = new TFunction((yyvsp[-1].lex).string, type); (yyval.interm.function) = function; } -#line 6326 "MachineIndependent/glslang_tab.cpp" +#line 6346 "MachineIndependent/glslang_tab.cpp" break; case 118: /* parameter_declarator: type_specifier IDENTIFIER */ -#line 1065 "MachineIndependent/glslang.y" +#line 1030 "MachineIndependent/glslang.y" { if ((yyvsp[-1].interm.type).arraySizes) { parseContext.profileRequires((yyvsp[-1].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); @@ -6342,11 +6362,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).param = param; } -#line 6346 "MachineIndependent/glslang_tab.cpp" +#line 6366 "MachineIndependent/glslang_tab.cpp" break; case 119: /* parameter_declarator: type_specifier IDENTIFIER array_specifier */ -#line 1080 "MachineIndependent/glslang.y" +#line 1045 "MachineIndependent/glslang.y" { if ((yyvsp[-2].interm.type).arraySizes) { parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); @@ -6366,175 +6386,173 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm).loc = (yyvsp[-1].lex).loc; (yyval.interm).param = param; } -#line 6370 "MachineIndependent/glslang_tab.cpp" +#line 6390 "MachineIndependent/glslang_tab.cpp" break; case 120: /* parameter_declaration: type_qualifier parameter_declarator */ -#line 1105 "MachineIndependent/glslang.y" +#line 1070 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[0].interm); if ((yyvsp[-1].interm.type).qualifier.precision != EpqNone) (yyval.interm).param.type->getQualifier().precision = (yyvsp[-1].interm.type).qualifier.precision; - parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier()); + parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier(), (yyval.interm).param.type->isCoopMat()); parseContext.checkNoShaderLayouts((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).shaderQualifiers); parseContext.parameterTypeCheck((yyvsp[0].interm).loc, (yyvsp[-1].interm.type).qualifier.storage, *(yyval.interm).param.type); parseContext.paramCheckFix((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, *(yyval.interm).param.type); } -#line 6386 "MachineIndependent/glslang_tab.cpp" +#line 6406 "MachineIndependent/glslang_tab.cpp" break; case 121: /* parameter_declaration: parameter_declarator */ -#line 1116 "MachineIndependent/glslang.y" +#line 1081 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[0].interm); parseContext.parameterTypeCheck((yyvsp[0].interm).loc, EvqIn, *(yyvsp[0].interm).param.type); parseContext.paramCheckFixStorage((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type); - parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier()); + parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier(), (yyval.interm).param.type->isCoopMat()); } -#line 6398 "MachineIndependent/glslang_tab.cpp" +#line 6418 "MachineIndependent/glslang_tab.cpp" break; case 122: /* parameter_declaration: type_qualifier parameter_type_specifier */ -#line 1126 "MachineIndependent/glslang.y" +#line 1091 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[0].interm); if ((yyvsp[-1].interm.type).qualifier.precision != EpqNone) (yyval.interm).param.type->getQualifier().precision = (yyvsp[-1].interm.type).qualifier.precision; - parseContext.precisionQualifierCheck((yyvsp[-1].interm.type).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier()); + parseContext.precisionQualifierCheck((yyvsp[-1].interm.type).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier(), (yyval.interm).param.type->isCoopMat()); parseContext.checkNoShaderLayouts((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).shaderQualifiers); parseContext.parameterTypeCheck((yyvsp[0].interm).loc, (yyvsp[-1].interm.type).qualifier.storage, *(yyval.interm).param.type); parseContext.paramCheckFix((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, *(yyval.interm).param.type); } -#line 6413 "MachineIndependent/glslang_tab.cpp" +#line 6433 "MachineIndependent/glslang_tab.cpp" break; case 123: /* parameter_declaration: parameter_type_specifier */ -#line 1136 "MachineIndependent/glslang.y" +#line 1101 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[0].interm); parseContext.parameterTypeCheck((yyvsp[0].interm).loc, EvqIn, *(yyvsp[0].interm).param.type); parseContext.paramCheckFixStorage((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type); - parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier()); + parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier(), (yyval.interm).param.type->isCoopMat()); } -#line 6425 "MachineIndependent/glslang_tab.cpp" +#line 6445 "MachineIndependent/glslang_tab.cpp" break; case 124: /* parameter_type_specifier: type_specifier */ -#line 1146 "MachineIndependent/glslang.y" +#line 1111 "MachineIndependent/glslang.y" { TParameter param = { 0, new TType((yyvsp[0].interm.type)) }; (yyval.interm).param = param; if ((yyvsp[0].interm.type).arraySizes) parseContext.arraySizeRequiredCheck((yyvsp[0].interm.type).loc, *(yyvsp[0].interm.type).arraySizes); } -#line 6436 "MachineIndependent/glslang_tab.cpp" +#line 6456 "MachineIndependent/glslang_tab.cpp" break; case 125: /* init_declarator_list: single_declaration */ -#line 1155 "MachineIndependent/glslang.y" +#line 1120 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[0].interm); } -#line 6444 "MachineIndependent/glslang_tab.cpp" +#line 6464 "MachineIndependent/glslang_tab.cpp" break; case 126: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER */ -#line 1158 "MachineIndependent/glslang.y" +#line 1123 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[-2].interm); parseContext.declareVariable((yyvsp[0].lex).loc, *(yyvsp[0].lex).string, (yyvsp[-2].interm).type); } -#line 6453 "MachineIndependent/glslang_tab.cpp" +#line 6473 "MachineIndependent/glslang_tab.cpp" break; case 127: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER array_specifier */ -#line 1162 "MachineIndependent/glslang.y" +#line 1127 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[-3].interm); parseContext.declareVariable((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string, (yyvsp[-3].interm).type, (yyvsp[0].interm).arraySizes); } -#line 6462 "MachineIndependent/glslang_tab.cpp" +#line 6482 "MachineIndependent/glslang_tab.cpp" break; case 128: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER array_specifier EQUAL initializer */ -#line 1166 "MachineIndependent/glslang.y" +#line 1131 "MachineIndependent/glslang.y" { (yyval.interm).type = (yyvsp[-5].interm).type; TIntermNode* initNode = parseContext.declareVariable((yyvsp[-3].lex).loc, *(yyvsp[-3].lex).string, (yyvsp[-5].interm).type, (yyvsp[-2].interm).arraySizes, (yyvsp[0].interm.intermTypedNode)); (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-5].interm).intermNode, initNode, (yyvsp[-1].lex).loc); } -#line 6472 "MachineIndependent/glslang_tab.cpp" +#line 6492 "MachineIndependent/glslang_tab.cpp" break; case 129: /* init_declarator_list: init_declarator_list COMMA IDENTIFIER EQUAL initializer */ -#line 1171 "MachineIndependent/glslang.y" +#line 1136 "MachineIndependent/glslang.y" { (yyval.interm).type = (yyvsp[-4].interm).type; TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-4].interm).type, 0, (yyvsp[0].interm.intermTypedNode)); (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-4].interm).intermNode, initNode, (yyvsp[-1].lex).loc); } -#line 6482 "MachineIndependent/glslang_tab.cpp" +#line 6502 "MachineIndependent/glslang_tab.cpp" break; case 130: /* single_declaration: fully_specified_type */ -#line 1179 "MachineIndependent/glslang.y" +#line 1144 "MachineIndependent/glslang.y" { (yyval.interm).type = (yyvsp[0].interm.type); (yyval.interm).intermNode = 0; - parseContext.declareTypeDefaults((yyval.interm).loc, (yyval.interm).type); - } -#line 6494 "MachineIndependent/glslang_tab.cpp" +#line 6512 "MachineIndependent/glslang_tab.cpp" break; case 131: /* single_declaration: fully_specified_type IDENTIFIER */ -#line 1186 "MachineIndependent/glslang.y" +#line 1149 "MachineIndependent/glslang.y" { (yyval.interm).type = (yyvsp[-1].interm.type); (yyval.interm).intermNode = 0; parseContext.declareVariable((yyvsp[0].lex).loc, *(yyvsp[0].lex).string, (yyvsp[-1].interm.type)); } -#line 6504 "MachineIndependent/glslang_tab.cpp" +#line 6522 "MachineIndependent/glslang_tab.cpp" break; case 132: /* single_declaration: fully_specified_type IDENTIFIER array_specifier */ -#line 1191 "MachineIndependent/glslang.y" +#line 1154 "MachineIndependent/glslang.y" { (yyval.interm).type = (yyvsp[-2].interm.type); (yyval.interm).intermNode = 0; parseContext.declareVariable((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string, (yyvsp[-2].interm.type), (yyvsp[0].interm).arraySizes); } -#line 6514 "MachineIndependent/glslang_tab.cpp" +#line 6532 "MachineIndependent/glslang_tab.cpp" break; case 133: /* single_declaration: fully_specified_type IDENTIFIER array_specifier EQUAL initializer */ -#line 1196 "MachineIndependent/glslang.y" +#line 1159 "MachineIndependent/glslang.y" { (yyval.interm).type = (yyvsp[-4].interm.type); TIntermNode* initNode = parseContext.declareVariable((yyvsp[-3].lex).loc, *(yyvsp[-3].lex).string, (yyvsp[-4].interm.type), (yyvsp[-2].interm).arraySizes, (yyvsp[0].interm.intermTypedNode)); (yyval.interm).intermNode = parseContext.intermediate.growAggregate(0, initNode, (yyvsp[-1].lex).loc); } -#line 6524 "MachineIndependent/glslang_tab.cpp" +#line 6542 "MachineIndependent/glslang_tab.cpp" break; case 134: /* single_declaration: fully_specified_type IDENTIFIER EQUAL initializer */ -#line 1201 "MachineIndependent/glslang.y" +#line 1164 "MachineIndependent/glslang.y" { (yyval.interm).type = (yyvsp[-3].interm.type); TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-3].interm.type), 0, (yyvsp[0].interm.intermTypedNode)); (yyval.interm).intermNode = parseContext.intermediate.growAggregate(0, initNode, (yyvsp[-1].lex).loc); } -#line 6534 "MachineIndependent/glslang_tab.cpp" +#line 6552 "MachineIndependent/glslang_tab.cpp" break; case 135: /* fully_specified_type: type_specifier */ -#line 1210 "MachineIndependent/glslang.y" +#line 1173 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[0].interm.type); @@ -6543,15 +6561,15 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); parseContext.profileRequires((yyvsp[0].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); parseContext.profileRequires((yyvsp[0].interm.type).loc, EEsProfile, 300, 0, "arrayed type"); } - parseContext.precisionQualifierCheck((yyval.interm.type).loc, (yyval.interm.type).basicType, (yyval.interm.type).qualifier); + parseContext.precisionQualifierCheck((yyval.interm.type).loc, (yyval.interm.type).basicType, (yyval.interm.type).qualifier, (yyval.interm.type).isCoopmat()); } -#line 6549 "MachineIndependent/glslang_tab.cpp" +#line 6567 "MachineIndependent/glslang_tab.cpp" break; case 136: /* fully_specified_type: type_qualifier type_specifier */ -#line 1220 "MachineIndependent/glslang.y" +#line 1183 "MachineIndependent/glslang.y" { - parseContext.globalQualifierFixCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier); + parseContext.globalQualifierFixCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, false, &(yyvsp[0].interm.type)); parseContext.globalQualifierTypeCheck((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, (yyvsp[0].interm.type)); if ((yyvsp[0].interm.type).arraySizes) { @@ -6565,7 +6583,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); parseContext.checkNoShaderLayouts((yyvsp[0].interm.type).loc, (yyvsp[-1].interm.type).shaderQualifiers); (yyvsp[0].interm.type).shaderQualifiers.merge((yyvsp[-1].interm.type).shaderQualifiers); parseContext.mergeQualifiers((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier, (yyvsp[-1].interm.type).qualifier, true); - parseContext.precisionQualifierCheck((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).basicType, (yyvsp[0].interm.type).qualifier); + parseContext.precisionQualifierCheck((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).basicType, (yyvsp[0].interm.type).qualifier, (yyvsp[0].interm.type).isCoopmat()); (yyval.interm.type) = (yyvsp[0].interm.type); @@ -6574,22 +6592,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (parseContext.language == EShLangFragment && (yyval.interm.type).qualifier.storage == EvqVaryingIn))) (yyval.interm.type).qualifier.smooth = true; } -#line 6578 "MachineIndependent/glslang_tab.cpp" +#line 6596 "MachineIndependent/glslang_tab.cpp" break; case 137: /* invariant_qualifier: INVARIANT */ -#line 1247 "MachineIndependent/glslang.y" +#line 1210 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "invariant"); parseContext.profileRequires((yyval.interm.type).loc, ENoProfile, 120, 0, "invariant"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.invariant = true; } -#line 6589 "MachineIndependent/glslang_tab.cpp" +#line 6607 "MachineIndependent/glslang_tab.cpp" break; case 138: /* interpolation_qualifier: SMOOTH */ -#line 1256 "MachineIndependent/glslang.y" +#line 1219 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "smooth"); parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "smooth"); @@ -6597,11 +6615,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.smooth = true; } -#line 6601 "MachineIndependent/glslang_tab.cpp" +#line 6619 "MachineIndependent/glslang_tab.cpp" break; case 139: /* interpolation_qualifier: FLAT */ -#line 1263 "MachineIndependent/glslang.y" +#line 1226 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "flat"); parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "flat"); @@ -6609,11 +6627,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.flat = true; } -#line 6613 "MachineIndependent/glslang_tab.cpp" +#line 6631 "MachineIndependent/glslang_tab.cpp" break; case 140: /* interpolation_qualifier: NOPERSPECTIVE */ -#line 1271 "MachineIndependent/glslang.y" +#line 1233 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "noperspective"); parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 0, E_GL_NV_shader_noperspective_interpolation, "noperspective"); @@ -6621,11 +6639,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.nopersp = true; } -#line 6625 "MachineIndependent/glslang_tab.cpp" +#line 6643 "MachineIndependent/glslang_tab.cpp" break; case 141: /* interpolation_qualifier: EXPLICITINTERPAMD */ -#line 1278 "MachineIndependent/glslang.y" +#line 1240 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "__explicitInterpAMD"); parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 450, E_GL_AMD_shader_explicit_vertex_parameter, "explicit interpolation"); @@ -6633,11 +6651,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.explicitInterp = true; } -#line 6637 "MachineIndependent/glslang_tab.cpp" +#line 6655 "MachineIndependent/glslang_tab.cpp" break; case 142: /* interpolation_qualifier: PERVERTEXNV */ -#line 1285 "MachineIndependent/glslang.y" +#line 1247 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "pervertexNV"); parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 0, E_GL_NV_fragment_shader_barycentric, "fragment shader barycentric"); @@ -6646,11 +6664,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.pervertexNV = true; } -#line 6650 "MachineIndependent/glslang_tab.cpp" +#line 6668 "MachineIndependent/glslang_tab.cpp" break; case 143: /* interpolation_qualifier: PERVERTEXEXT */ -#line 1293 "MachineIndependent/glslang.y" +#line 1255 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "pervertexEXT"); parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 0, E_GL_EXT_fragment_shader_barycentric, "fragment shader barycentric"); @@ -6659,11 +6677,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.pervertexEXT = true; } -#line 6663 "MachineIndependent/glslang_tab.cpp" +#line 6681 "MachineIndependent/glslang_tab.cpp" break; case 144: /* interpolation_qualifier: PERPRIMITIVENV */ -#line 1301 "MachineIndependent/glslang.y" +#line 1263 "MachineIndependent/glslang.y" { // No need for profile version or extension check. Shader stage already checks both. parseContext.globalCheck((yyvsp[0].lex).loc, "perprimitiveNV"); @@ -6674,11 +6692,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.perPrimitiveNV = true; } -#line 6678 "MachineIndependent/glslang_tab.cpp" +#line 6696 "MachineIndependent/glslang_tab.cpp" break; case 145: /* interpolation_qualifier: PERPRIMITIVEEXT */ -#line 1311 "MachineIndependent/glslang.y" +#line 1273 "MachineIndependent/glslang.y" { // No need for profile version or extension check. Shader stage already checks both. parseContext.globalCheck((yyvsp[0].lex).loc, "perprimitiveEXT"); @@ -6689,11 +6707,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.perPrimitiveNV = true; } -#line 6693 "MachineIndependent/glslang_tab.cpp" +#line 6711 "MachineIndependent/glslang_tab.cpp" break; case 146: /* interpolation_qualifier: PERVIEWNV */ -#line 1321 "MachineIndependent/glslang.y" +#line 1283 "MachineIndependent/glslang.y" { // No need for profile version or extension check. Shader stage already checks both. parseContext.globalCheck((yyvsp[0].lex).loc, "perviewNV"); @@ -6701,11 +6719,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.perViewNV = true; } -#line 6705 "MachineIndependent/glslang_tab.cpp" +#line 6723 "MachineIndependent/glslang_tab.cpp" break; case 147: /* interpolation_qualifier: PERTASKNV */ -#line 1328 "MachineIndependent/glslang.y" +#line 1290 "MachineIndependent/glslang.y" { // No need for profile version or extension check. Shader stage already checks both. parseContext.globalCheck((yyvsp[0].lex).loc, "taskNV"); @@ -6713,84 +6731,84 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.perTaskNV = true; } -#line 6717 "MachineIndependent/glslang_tab.cpp" +#line 6735 "MachineIndependent/glslang_tab.cpp" break; case 148: /* layout_qualifier: LAYOUT LEFT_PAREN layout_qualifier_id_list RIGHT_PAREN */ -#line 1339 "MachineIndependent/glslang.y" +#line 1300 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[-1].interm.type); } -#line 6725 "MachineIndependent/glslang_tab.cpp" +#line 6743 "MachineIndependent/glslang_tab.cpp" break; case 149: /* layout_qualifier_id_list: layout_qualifier_id */ -#line 1345 "MachineIndependent/glslang.y" +#line 1306 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6733 "MachineIndependent/glslang_tab.cpp" +#line 6751 "MachineIndependent/glslang_tab.cpp" break; case 150: /* layout_qualifier_id_list: layout_qualifier_id_list COMMA layout_qualifier_id */ -#line 1348 "MachineIndependent/glslang.y" +#line 1309 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[-2].interm.type); (yyval.interm.type).shaderQualifiers.merge((yyvsp[0].interm.type).shaderQualifiers); parseContext.mergeObjectLayoutQualifiers((yyval.interm.type).qualifier, (yyvsp[0].interm.type).qualifier, false); } -#line 6743 "MachineIndependent/glslang_tab.cpp" +#line 6761 "MachineIndependent/glslang_tab.cpp" break; case 151: /* layout_qualifier_id: IDENTIFIER */ -#line 1355 "MachineIndependent/glslang.y" +#line 1316 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); parseContext.setLayoutQualifier((yyvsp[0].lex).loc, (yyval.interm.type), *(yyvsp[0].lex).string); } -#line 6752 "MachineIndependent/glslang_tab.cpp" +#line 6770 "MachineIndependent/glslang_tab.cpp" break; case 152: /* layout_qualifier_id: IDENTIFIER EQUAL constant_expression */ -#line 1359 "MachineIndependent/glslang.y" +#line 1320 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-2].lex).loc); parseContext.setLayoutQualifier((yyvsp[-2].lex).loc, (yyval.interm.type), *(yyvsp[-2].lex).string, (yyvsp[0].interm.intermTypedNode)); } -#line 6761 "MachineIndependent/glslang_tab.cpp" +#line 6779 "MachineIndependent/glslang_tab.cpp" break; case 153: /* layout_qualifier_id: SHARED */ -#line 1363 "MachineIndependent/glslang.y" +#line 1324 "MachineIndependent/glslang.y" { // because "shared" is both an identifier and a keyword (yyval.interm.type).init((yyvsp[0].lex).loc); TString strShared("shared"); parseContext.setLayoutQualifier((yyvsp[0].lex).loc, (yyval.interm.type), strShared); } -#line 6771 "MachineIndependent/glslang_tab.cpp" +#line 6789 "MachineIndependent/glslang_tab.cpp" break; case 154: /* precise_qualifier: PRECISE */ -#line 1372 "MachineIndependent/glslang.y" +#line 1332 "MachineIndependent/glslang.y" { parseContext.profileRequires((yyval.interm.type).loc, ECoreProfile | ECompatibilityProfile, 400, E_GL_ARB_gpu_shader5, "precise"); parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 320, Num_AEP_gpu_shader5, AEP_gpu_shader5, "precise"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.noContraction = true; } -#line 6782 "MachineIndependent/glslang_tab.cpp" +#line 6800 "MachineIndependent/glslang_tab.cpp" break; case 155: /* type_qualifier: single_type_qualifier */ -#line 1382 "MachineIndependent/glslang.y" +#line 1341 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6790 "MachineIndependent/glslang_tab.cpp" +#line 6808 "MachineIndependent/glslang_tab.cpp" break; case 156: /* type_qualifier: type_qualifier single_type_qualifier */ -#line 1385 "MachineIndependent/glslang.y" +#line 1344 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[-1].interm.type); if ((yyval.interm.type).basicType == EbtVoid) @@ -6799,151 +6817,151 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).shaderQualifiers.merge((yyvsp[0].interm.type).shaderQualifiers); parseContext.mergeQualifiers((yyval.interm.type).loc, (yyval.interm.type).qualifier, (yyvsp[0].interm.type).qualifier, false); } -#line 6803 "MachineIndependent/glslang_tab.cpp" +#line 6821 "MachineIndependent/glslang_tab.cpp" break; case 157: /* single_type_qualifier: storage_qualifier */ -#line 1396 "MachineIndependent/glslang.y" +#line 1355 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6811 "MachineIndependent/glslang_tab.cpp" +#line 6829 "MachineIndependent/glslang_tab.cpp" break; case 158: /* single_type_qualifier: layout_qualifier */ -#line 1399 "MachineIndependent/glslang.y" +#line 1358 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6819 "MachineIndependent/glslang_tab.cpp" +#line 6837 "MachineIndependent/glslang_tab.cpp" break; case 159: /* single_type_qualifier: precision_qualifier */ -#line 1402 "MachineIndependent/glslang.y" +#line 1361 "MachineIndependent/glslang.y" { parseContext.checkPrecisionQualifier((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier.precision); (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6828 "MachineIndependent/glslang_tab.cpp" +#line 6846 "MachineIndependent/glslang_tab.cpp" break; case 160: /* single_type_qualifier: interpolation_qualifier */ -#line 1406 "MachineIndependent/glslang.y" +#line 1365 "MachineIndependent/glslang.y" { // allow inheritance of storage qualifier from block declaration (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6837 "MachineIndependent/glslang_tab.cpp" +#line 6855 "MachineIndependent/glslang_tab.cpp" break; case 161: /* single_type_qualifier: invariant_qualifier */ -#line 1410 "MachineIndependent/glslang.y" +#line 1369 "MachineIndependent/glslang.y" { // allow inheritance of storage qualifier from block declaration (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6846 "MachineIndependent/glslang_tab.cpp" +#line 6864 "MachineIndependent/glslang_tab.cpp" break; case 162: /* single_type_qualifier: precise_qualifier */ -#line 1415 "MachineIndependent/glslang.y" +#line 1373 "MachineIndependent/glslang.y" { // allow inheritance of storage qualifier from block declaration (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6855 "MachineIndependent/glslang_tab.cpp" +#line 6873 "MachineIndependent/glslang_tab.cpp" break; case 163: /* single_type_qualifier: non_uniform_qualifier */ -#line 1419 "MachineIndependent/glslang.y" +#line 1377 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6863 "MachineIndependent/glslang_tab.cpp" +#line 6881 "MachineIndependent/glslang_tab.cpp" break; case 164: /* single_type_qualifier: spirv_storage_class_qualifier */ -#line 1422 "MachineIndependent/glslang.y" +#line 1380 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].interm.type).loc, "spirv_storage_class"); parseContext.requireExtensions((yyvsp[0].interm.type).loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V storage class qualifier"); (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6873 "MachineIndependent/glslang_tab.cpp" +#line 6891 "MachineIndependent/glslang_tab.cpp" break; case 165: /* single_type_qualifier: spirv_decorate_qualifier */ -#line 1427 "MachineIndependent/glslang.y" +#line 1385 "MachineIndependent/glslang.y" { parseContext.requireExtensions((yyvsp[0].interm.type).loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V decorate qualifier"); (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 6882 "MachineIndependent/glslang_tab.cpp" +#line 6900 "MachineIndependent/glslang_tab.cpp" break; case 166: /* single_type_qualifier: SPIRV_BY_REFERENCE */ -#line 1431 "MachineIndependent/glslang.y" +#line 1389 "MachineIndependent/glslang.y" { parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_EXT_spirv_intrinsics, "spirv_by_reference"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.setSpirvByReference(); } -#line 6892 "MachineIndependent/glslang_tab.cpp" +#line 6910 "MachineIndependent/glslang_tab.cpp" break; case 167: /* single_type_qualifier: SPIRV_LITERAL */ -#line 1436 "MachineIndependent/glslang.y" +#line 1394 "MachineIndependent/glslang.y" { parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_EXT_spirv_intrinsics, "spirv_by_literal"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.setSpirvLiteral(); } -#line 6902 "MachineIndependent/glslang_tab.cpp" +#line 6920 "MachineIndependent/glslang_tab.cpp" break; case 168: /* storage_qualifier: CONST */ -#line 1445 "MachineIndependent/glslang.y" +#line 1402 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqConst; // will later turn into EvqConstReadOnly, if the initializer is not constant } -#line 6911 "MachineIndependent/glslang_tab.cpp" +#line 6929 "MachineIndependent/glslang_tab.cpp" break; case 169: /* storage_qualifier: INOUT */ -#line 1449 "MachineIndependent/glslang.y" +#line 1406 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "inout"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqInOut; } -#line 6921 "MachineIndependent/glslang_tab.cpp" +#line 6939 "MachineIndependent/glslang_tab.cpp" break; case 170: /* storage_qualifier: IN */ -#line 1454 "MachineIndependent/glslang.y" +#line 1411 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "in"); (yyval.interm.type).init((yyvsp[0].lex).loc); // whether this is a parameter "in" or a pipeline "in" will get sorted out a bit later (yyval.interm.type).qualifier.storage = EvqIn; } -#line 6932 "MachineIndependent/glslang_tab.cpp" +#line 6950 "MachineIndependent/glslang_tab.cpp" break; case 171: /* storage_qualifier: OUT */ -#line 1460 "MachineIndependent/glslang.y" +#line 1417 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "out"); (yyval.interm.type).init((yyvsp[0].lex).loc); // whether this is a parameter "out" or a pipeline "out" will get sorted out a bit later (yyval.interm.type).qualifier.storage = EvqOut; } -#line 6943 "MachineIndependent/glslang_tab.cpp" +#line 6961 "MachineIndependent/glslang_tab.cpp" break; case 172: /* storage_qualifier: CENTROID */ -#line 1466 "MachineIndependent/glslang.y" +#line 1423 "MachineIndependent/glslang.y" { parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 120, 0, "centroid"); parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, "centroid"); @@ -6951,21 +6969,31 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.centroid = true; } -#line 6955 "MachineIndependent/glslang_tab.cpp" +#line 6973 "MachineIndependent/glslang_tab.cpp" break; case 173: /* storage_qualifier: UNIFORM */ -#line 1473 "MachineIndependent/glslang.y" +#line 1430 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "uniform"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqUniform; } -#line 6965 "MachineIndependent/glslang_tab.cpp" +#line 6983 "MachineIndependent/glslang_tab.cpp" + break; + + case 174: /* storage_qualifier: TILEIMAGEEXT */ +#line 1435 "MachineIndependent/glslang.y" + { + parseContext.globalCheck((yyvsp[0].lex).loc, "tileImageEXT"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.storage = EvqTileImageEXT; + } +#line 6993 "MachineIndependent/glslang_tab.cpp" break; - case 174: /* storage_qualifier: SHARED */ -#line 1478 "MachineIndependent/glslang.y" + case 175: /* storage_qualifier: SHARED */ +#line 1440 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "shared"); parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_compute_shader, "shared"); @@ -6974,21 +7002,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqShared; } -#line 6978 "MachineIndependent/glslang_tab.cpp" +#line 7006 "MachineIndependent/glslang_tab.cpp" break; - case 175: /* storage_qualifier: BUFFER */ -#line 1486 "MachineIndependent/glslang.y" + case 176: /* storage_qualifier: BUFFER */ +#line 1448 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "buffer"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqBuffer; } -#line 6988 "MachineIndependent/glslang_tab.cpp" +#line 7016 "MachineIndependent/glslang_tab.cpp" break; - case 176: /* storage_qualifier: ATTRIBUTE */ -#line 1492 "MachineIndependent/glslang.y" + case 177: /* storage_qualifier: ATTRIBUTE */ +#line 1453 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[0].lex).loc, EShLangVertex, "attribute"); parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, "attribute"); @@ -7001,11 +7029,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqVaryingIn; } -#line 7005 "MachineIndependent/glslang_tab.cpp" +#line 7033 "MachineIndependent/glslang_tab.cpp" break; - case 177: /* storage_qualifier: VARYING */ -#line 1504 "MachineIndependent/glslang.y" + case 178: /* storage_qualifier: VARYING */ +#line 1465 "MachineIndependent/glslang.y" { parseContext.checkDeprecated((yyvsp[0].lex).loc, ENoProfile, 130, "varying"); parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, "varying"); @@ -7020,32 +7048,32 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); else (yyval.interm.type).qualifier.storage = EvqVaryingIn; } -#line 7024 "MachineIndependent/glslang_tab.cpp" +#line 7052 "MachineIndependent/glslang_tab.cpp" break; - case 178: /* storage_qualifier: PATCH */ -#line 1518 "MachineIndependent/glslang.y" + case 179: /* storage_qualifier: PATCH */ +#line 1479 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "patch"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangTessControlMask | EShLangTessEvaluationMask), "patch"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.patch = true; } -#line 7035 "MachineIndependent/glslang_tab.cpp" +#line 7063 "MachineIndependent/glslang_tab.cpp" break; - case 179: /* storage_qualifier: SAMPLE */ -#line 1524 "MachineIndependent/glslang.y" + case 180: /* storage_qualifier: SAMPLE */ +#line 1485 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "sample"); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.sample = true; } -#line 7045 "MachineIndependent/glslang_tab.cpp" +#line 7073 "MachineIndependent/glslang_tab.cpp" break; - case 180: /* storage_qualifier: HITATTRNV */ -#line 1529 "MachineIndependent/glslang.y" + case 181: /* storage_qualifier: HITATTRNV */ +#line 1490 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "hitAttributeNV"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangIntersectMask | EShLangClosestHitMask @@ -7054,11 +7082,24 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqHitAttr; } -#line 7058 "MachineIndependent/glslang_tab.cpp" +#line 7086 "MachineIndependent/glslang_tab.cpp" + break; + + case 182: /* storage_qualifier: HITOBJECTATTRNV */ +#line 1498 "MachineIndependent/glslang.y" + { + parseContext.globalCheck((yyvsp[0].lex).loc, "hitAttributeNV"); + parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask + | EShLangMissMask), "hitObjectAttributeNV"); + parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile, 460, E_GL_NV_shader_invocation_reorder, "hitObjectAttributeNV"); + (yyval.interm.type).init((yyvsp[0].lex).loc); + (yyval.interm.type).qualifier.storage = EvqHitObjectAttrNV; + } +#line 7099 "MachineIndependent/glslang_tab.cpp" break; - case 181: /* storage_qualifier: HITATTREXT */ -#line 1537 "MachineIndependent/glslang.y" + case 183: /* storage_qualifier: HITATTREXT */ +#line 1506 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "hitAttributeEXT"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangIntersectMask | EShLangClosestHitMask @@ -7067,11 +7108,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqHitAttr; } -#line 7071 "MachineIndependent/glslang_tab.cpp" +#line 7112 "MachineIndependent/glslang_tab.cpp" break; - case 182: /* storage_qualifier: PAYLOADNV */ -#line 1545 "MachineIndependent/glslang.y" + case 184: /* storage_qualifier: PAYLOADNV */ +#line 1514 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "rayPayloadNV"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask | @@ -7080,11 +7121,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqPayload; } -#line 7084 "MachineIndependent/glslang_tab.cpp" +#line 7125 "MachineIndependent/glslang_tab.cpp" break; - case 183: /* storage_qualifier: PAYLOADEXT */ -#line 1553 "MachineIndependent/glslang.y" + case 185: /* storage_qualifier: PAYLOADEXT */ +#line 1522 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "rayPayloadEXT"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask | EShLangClosestHitMask | @@ -7093,11 +7134,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqPayload; } -#line 7097 "MachineIndependent/glslang_tab.cpp" +#line 7138 "MachineIndependent/glslang_tab.cpp" break; - case 184: /* storage_qualifier: PAYLOADINNV */ -#line 1561 "MachineIndependent/glslang.y" + case 186: /* storage_qualifier: PAYLOADINNV */ +#line 1530 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "rayPayloadInNV"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangClosestHitMask | @@ -7106,11 +7147,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqPayloadIn; } -#line 7110 "MachineIndependent/glslang_tab.cpp" +#line 7151 "MachineIndependent/glslang_tab.cpp" break; - case 185: /* storage_qualifier: PAYLOADINEXT */ -#line 1569 "MachineIndependent/glslang.y" + case 187: /* storage_qualifier: PAYLOADINEXT */ +#line 1538 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "rayPayloadInEXT"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangClosestHitMask | @@ -7119,11 +7160,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqPayloadIn; } -#line 7123 "MachineIndependent/glslang_tab.cpp" +#line 7164 "MachineIndependent/glslang_tab.cpp" break; - case 186: /* storage_qualifier: CALLDATANV */ -#line 1577 "MachineIndependent/glslang.y" + case 188: /* storage_qualifier: CALLDATANV */ +#line 1546 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "callableDataNV"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask | @@ -7132,11 +7173,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqCallableData; } -#line 7136 "MachineIndependent/glslang_tab.cpp" +#line 7177 "MachineIndependent/glslang_tab.cpp" break; - case 187: /* storage_qualifier: CALLDATAEXT */ -#line 1585 "MachineIndependent/glslang.y" + case 189: /* storage_qualifier: CALLDATAEXT */ +#line 1554 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "callableDataEXT"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangRayGenMask | @@ -7145,11 +7186,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqCallableData; } -#line 7149 "MachineIndependent/glslang_tab.cpp" +#line 7190 "MachineIndependent/glslang_tab.cpp" break; - case 188: /* storage_qualifier: CALLDATAINNV */ -#line 1593 "MachineIndependent/glslang.y" + case 190: /* storage_qualifier: CALLDATAINNV */ +#line 1562 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "callableDataInNV"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangCallableMask), "callableDataInNV"); @@ -7157,11 +7198,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqCallableDataIn; } -#line 7161 "MachineIndependent/glslang_tab.cpp" +#line 7202 "MachineIndependent/glslang_tab.cpp" break; - case 189: /* storage_qualifier: CALLDATAINEXT */ -#line 1600 "MachineIndependent/glslang.y" + case 191: /* storage_qualifier: CALLDATAINEXT */ +#line 1569 "MachineIndependent/glslang.y" { parseContext.globalCheck((yyvsp[0].lex).loc, "callableDataInEXT"); parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangCallableMask), "callableDataInEXT"); @@ -7169,138 +7210,138 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqCallableDataIn; } -#line 7173 "MachineIndependent/glslang_tab.cpp" +#line 7214 "MachineIndependent/glslang_tab.cpp" break; - case 190: /* storage_qualifier: COHERENT */ -#line 1607 "MachineIndependent/glslang.y" + case 192: /* storage_qualifier: COHERENT */ +#line 1576 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.coherent = true; } -#line 7182 "MachineIndependent/glslang_tab.cpp" +#line 7223 "MachineIndependent/glslang_tab.cpp" break; - case 191: /* storage_qualifier: DEVICECOHERENT */ -#line 1611 "MachineIndependent/glslang.y" + case 193: /* storage_qualifier: DEVICECOHERENT */ +#line 1580 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "devicecoherent"); (yyval.interm.type).qualifier.devicecoherent = true; } -#line 7192 "MachineIndependent/glslang_tab.cpp" +#line 7233 "MachineIndependent/glslang_tab.cpp" break; - case 192: /* storage_qualifier: QUEUEFAMILYCOHERENT */ -#line 1616 "MachineIndependent/glslang.y" + case 194: /* storage_qualifier: QUEUEFAMILYCOHERENT */ +#line 1585 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "queuefamilycoherent"); (yyval.interm.type).qualifier.queuefamilycoherent = true; } -#line 7202 "MachineIndependent/glslang_tab.cpp" +#line 7243 "MachineIndependent/glslang_tab.cpp" break; - case 193: /* storage_qualifier: WORKGROUPCOHERENT */ -#line 1621 "MachineIndependent/glslang.y" + case 195: /* storage_qualifier: WORKGROUPCOHERENT */ +#line 1590 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "workgroupcoherent"); (yyval.interm.type).qualifier.workgroupcoherent = true; } -#line 7212 "MachineIndependent/glslang_tab.cpp" +#line 7253 "MachineIndependent/glslang_tab.cpp" break; - case 194: /* storage_qualifier: SUBGROUPCOHERENT */ -#line 1626 "MachineIndependent/glslang.y" + case 196: /* storage_qualifier: SUBGROUPCOHERENT */ +#line 1595 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "subgroupcoherent"); (yyval.interm.type).qualifier.subgroupcoherent = true; } -#line 7222 "MachineIndependent/glslang_tab.cpp" +#line 7263 "MachineIndependent/glslang_tab.cpp" break; - case 195: /* storage_qualifier: NONPRIVATE */ -#line 1631 "MachineIndependent/glslang.y" + case 197: /* storage_qualifier: NONPRIVATE */ +#line 1600 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_KHR_memory_scope_semantics, "nonprivate"); (yyval.interm.type).qualifier.nonprivate = true; } -#line 7232 "MachineIndependent/glslang_tab.cpp" +#line 7273 "MachineIndependent/glslang_tab.cpp" break; - case 196: /* storage_qualifier: SHADERCALLCOHERENT */ -#line 1636 "MachineIndependent/glslang.y" + case 198: /* storage_qualifier: SHADERCALLCOHERENT */ +#line 1605 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); parseContext.requireExtensions((yyvsp[0].lex).loc, 1, &E_GL_EXT_ray_tracing, "shadercallcoherent"); (yyval.interm.type).qualifier.shadercallcoherent = true; } -#line 7242 "MachineIndependent/glslang_tab.cpp" +#line 7283 "MachineIndependent/glslang_tab.cpp" break; - case 197: /* storage_qualifier: VOLATILE */ -#line 1641 "MachineIndependent/glslang.y" + case 199: /* storage_qualifier: VOLATILE */ +#line 1610 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.volatil = true; } -#line 7251 "MachineIndependent/glslang_tab.cpp" +#line 7292 "MachineIndependent/glslang_tab.cpp" break; - case 198: /* storage_qualifier: RESTRICT */ -#line 1645 "MachineIndependent/glslang.y" + case 200: /* storage_qualifier: RESTRICT */ +#line 1614 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.restrict = true; } -#line 7260 "MachineIndependent/glslang_tab.cpp" +#line 7301 "MachineIndependent/glslang_tab.cpp" break; - case 199: /* storage_qualifier: READONLY */ -#line 1649 "MachineIndependent/glslang.y" + case 201: /* storage_qualifier: READONLY */ +#line 1618 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.readonly = true; } -#line 7269 "MachineIndependent/glslang_tab.cpp" +#line 7310 "MachineIndependent/glslang_tab.cpp" break; - case 200: /* storage_qualifier: WRITEONLY */ -#line 1653 "MachineIndependent/glslang.y" + case 202: /* storage_qualifier: WRITEONLY */ +#line 1622 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.writeonly = true; } -#line 7278 "MachineIndependent/glslang_tab.cpp" +#line 7319 "MachineIndependent/glslang_tab.cpp" break; - case 201: /* storage_qualifier: SUBROUTINE */ -#line 1657 "MachineIndependent/glslang.y" + case 203: /* storage_qualifier: SUBROUTINE */ +#line 1626 "MachineIndependent/glslang.y" { parseContext.spvRemoved((yyvsp[0].lex).loc, "subroutine"); parseContext.globalCheck((yyvsp[0].lex).loc, "subroutine"); parseContext.unimplemented((yyvsp[0].lex).loc, "subroutine"); (yyval.interm.type).init((yyvsp[0].lex).loc); } -#line 7289 "MachineIndependent/glslang_tab.cpp" +#line 7330 "MachineIndependent/glslang_tab.cpp" break; - case 202: /* storage_qualifier: SUBROUTINE LEFT_PAREN type_name_list RIGHT_PAREN */ -#line 1663 "MachineIndependent/glslang.y" + case 204: /* storage_qualifier: SUBROUTINE LEFT_PAREN type_name_list RIGHT_PAREN */ +#line 1632 "MachineIndependent/glslang.y" { parseContext.spvRemoved((yyvsp[-3].lex).loc, "subroutine"); parseContext.globalCheck((yyvsp[-3].lex).loc, "subroutine"); parseContext.unimplemented((yyvsp[-3].lex).loc, "subroutine"); (yyval.interm.type).init((yyvsp[-3].lex).loc); } -#line 7300 "MachineIndependent/glslang_tab.cpp" +#line 7341 "MachineIndependent/glslang_tab.cpp" break; - case 203: /* storage_qualifier: TASKPAYLOADWORKGROUPEXT */ -#line 1669 "MachineIndependent/glslang.y" + case 205: /* storage_qualifier: TASKPAYLOADWORKGROUPEXT */ +#line 1638 "MachineIndependent/glslang.y" { // No need for profile version or extension check. Shader stage already checks both. parseContext.globalCheck((yyvsp[0].lex).loc, "taskPayloadSharedEXT"); @@ -7308,70 +7349,73 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.storage = EvqtaskPayloadSharedEXT; } -#line 7312 "MachineIndependent/glslang_tab.cpp" +#line 7353 "MachineIndependent/glslang_tab.cpp" break; - case 204: /* non_uniform_qualifier: NONUNIFORM */ -#line 1681 "MachineIndependent/glslang.y" + case 206: /* non_uniform_qualifier: NONUNIFORM */ +#line 1648 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc); (yyval.interm.type).qualifier.nonUniform = true; } -#line 7321 "MachineIndependent/glslang_tab.cpp" +#line 7362 "MachineIndependent/glslang_tab.cpp" break; - case 205: /* type_name_list: IDENTIFIER */ -#line 1688 "MachineIndependent/glslang.y" + case 207: /* type_name_list: IDENTIFIER */ +#line 1655 "MachineIndependent/glslang.y" { // TODO } -#line 7329 "MachineIndependent/glslang_tab.cpp" +#line 7370 "MachineIndependent/glslang_tab.cpp" break; - case 206: /* type_name_list: type_name_list COMMA IDENTIFIER */ -#line 1691 "MachineIndependent/glslang.y" + case 208: /* type_name_list: type_name_list COMMA IDENTIFIER */ +#line 1658 "MachineIndependent/glslang.y" { // TODO: 4.0 semantics: subroutines // 1) make sure each identifier is a type declared earlier with SUBROUTINE // 2) save all of the identifiers for future comparison with the declared function } -#line 7339 "MachineIndependent/glslang_tab.cpp" +#line 7380 "MachineIndependent/glslang_tab.cpp" break; - case 207: /* type_specifier: type_specifier_nonarray type_parameter_specifier_opt */ -#line 1700 "MachineIndependent/glslang.y" + case 209: /* type_specifier: type_specifier_nonarray type_parameter_specifier_opt */ +#line 1666 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[-1].interm.type); (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type)); (yyval.interm.type).typeParameters = (yyvsp[0].interm.typeParameters); + parseContext.coopMatTypeParametersCheck((yyvsp[-1].interm.type).loc, (yyval.interm.type)); + } -#line 7349 "MachineIndependent/glslang_tab.cpp" +#line 7392 "MachineIndependent/glslang_tab.cpp" break; - case 208: /* type_specifier: type_specifier_nonarray type_parameter_specifier_opt array_specifier */ -#line 1705 "MachineIndependent/glslang.y" + case 210: /* type_specifier: type_specifier_nonarray type_parameter_specifier_opt array_specifier */ +#line 1673 "MachineIndependent/glslang.y" { parseContext.arrayOfArrayVersionCheck((yyvsp[0].interm).loc, (yyvsp[0].interm).arraySizes); (yyval.interm.type) = (yyvsp[-2].interm.type); (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type)); (yyval.interm.type).typeParameters = (yyvsp[-1].interm.typeParameters); (yyval.interm.type).arraySizes = (yyvsp[0].interm).arraySizes; + parseContext.coopMatTypeParametersCheck((yyvsp[-2].interm.type).loc, (yyval.interm.type)); } -#line 7361 "MachineIndependent/glslang_tab.cpp" +#line 7405 "MachineIndependent/glslang_tab.cpp" break; - case 209: /* array_specifier: LEFT_BRACKET RIGHT_BRACKET */ -#line 1715 "MachineIndependent/glslang.y" + case 211: /* array_specifier: LEFT_BRACKET RIGHT_BRACKET */ +#line 1684 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[-1].lex).loc; (yyval.interm).arraySizes = new TArraySizes; (yyval.interm).arraySizes->addInnerSize(); } -#line 7371 "MachineIndependent/glslang_tab.cpp" +#line 7415 "MachineIndependent/glslang_tab.cpp" break; - case 210: /* array_specifier: LEFT_BRACKET conditional_expression RIGHT_BRACKET */ -#line 1720 "MachineIndependent/glslang.y" + case 212: /* array_specifier: LEFT_BRACKET conditional_expression RIGHT_BRACKET */ +#line 1689 "MachineIndependent/glslang.y" { (yyval.interm).loc = (yyvsp[-2].lex).loc; (yyval.interm).arraySizes = new TArraySizes; @@ -7380,20 +7424,20 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size, "array size"); (yyval.interm).arraySizes->addInnerSize(size); } -#line 7384 "MachineIndependent/glslang_tab.cpp" +#line 7428 "MachineIndependent/glslang_tab.cpp" break; - case 211: /* array_specifier: array_specifier LEFT_BRACKET RIGHT_BRACKET */ -#line 1728 "MachineIndependent/glslang.y" + case 213: /* array_specifier: array_specifier LEFT_BRACKET RIGHT_BRACKET */ +#line 1697 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[-2].interm); (yyval.interm).arraySizes->addInnerSize(); } -#line 7393 "MachineIndependent/glslang_tab.cpp" +#line 7437 "MachineIndependent/glslang_tab.cpp" break; - case 212: /* array_specifier: array_specifier LEFT_BRACKET conditional_expression RIGHT_BRACKET */ -#line 1732 "MachineIndependent/glslang.y" + case 214: /* array_specifier: array_specifier LEFT_BRACKET conditional_expression RIGHT_BRACKET */ +#line 1701 "MachineIndependent/glslang.y" { (yyval.interm) = (yyvsp[-3].interm); @@ -7401,348 +7445,359 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size, "array size"); (yyval.interm).arraySizes->addInnerSize(size); } -#line 7405 "MachineIndependent/glslang_tab.cpp" +#line 7449 "MachineIndependent/glslang_tab.cpp" break; - case 213: /* type_parameter_specifier_opt: type_parameter_specifier */ -#line 1742 "MachineIndependent/glslang.y" + case 215: /* type_parameter_specifier_opt: type_parameter_specifier */ +#line 1711 "MachineIndependent/glslang.y" { (yyval.interm.typeParameters) = (yyvsp[0].interm.typeParameters); } -#line 7413 "MachineIndependent/glslang_tab.cpp" +#line 7457 "MachineIndependent/glslang_tab.cpp" break; - case 214: /* type_parameter_specifier_opt: %empty */ -#line 1745 "MachineIndependent/glslang.y" + case 216: /* type_parameter_specifier_opt: %empty */ +#line 1714 "MachineIndependent/glslang.y" { (yyval.interm.typeParameters) = 0; } -#line 7421 "MachineIndependent/glslang_tab.cpp" +#line 7465 "MachineIndependent/glslang_tab.cpp" break; - case 215: /* type_parameter_specifier: LEFT_ANGLE type_parameter_specifier_list RIGHT_ANGLE */ -#line 1751 "MachineIndependent/glslang.y" + case 217: /* type_parameter_specifier: LEFT_ANGLE type_parameter_specifier_list RIGHT_ANGLE */ +#line 1720 "MachineIndependent/glslang.y" { (yyval.interm.typeParameters) = (yyvsp[-1].interm.typeParameters); } -#line 7429 "MachineIndependent/glslang_tab.cpp" +#line 7473 "MachineIndependent/glslang_tab.cpp" break; - case 216: /* type_parameter_specifier_list: unary_expression */ -#line 1757 "MachineIndependent/glslang.y" + case 218: /* type_parameter_specifier_list: type_specifier */ +#line 1726 "MachineIndependent/glslang.y" + { + (yyval.interm.typeParameters) = new TTypeParameters; + (yyval.interm.typeParameters)->arraySizes = new TArraySizes; + (yyval.interm.typeParameters)->basicType = (yyvsp[0].interm.type).basicType; + } +#line 7483 "MachineIndependent/glslang_tab.cpp" + break; + + case 219: /* type_parameter_specifier_list: unary_expression */ +#line 1731 "MachineIndependent/glslang.y" { - (yyval.interm.typeParameters) = new TArraySizes; + (yyval.interm.typeParameters) = new TTypeParameters; + (yyval.interm.typeParameters)->arraySizes = new TArraySizes; TArraySize size; - parseContext.arraySizeCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode), size, "type parameter"); - (yyval.interm.typeParameters)->addInnerSize(size); + parseContext.arraySizeCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode), size, "type parameter", true); + (yyval.interm.typeParameters)->arraySizes->addInnerSize(size); } -#line 7441 "MachineIndependent/glslang_tab.cpp" +#line 7496 "MachineIndependent/glslang_tab.cpp" break; - case 217: /* type_parameter_specifier_list: type_parameter_specifier_list COMMA unary_expression */ -#line 1764 "MachineIndependent/glslang.y" + case 220: /* type_parameter_specifier_list: type_parameter_specifier_list COMMA unary_expression */ +#line 1739 "MachineIndependent/glslang.y" { (yyval.interm.typeParameters) = (yyvsp[-2].interm.typeParameters); TArraySize size; - parseContext.arraySizeCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode), size, "type parameter"); - (yyval.interm.typeParameters)->addInnerSize(size); + parseContext.arraySizeCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode), size, "type parameter", true); + (yyval.interm.typeParameters)->arraySizes->addInnerSize(size); } -#line 7453 "MachineIndependent/glslang_tab.cpp" +#line 7508 "MachineIndependent/glslang_tab.cpp" break; - case 218: /* type_specifier_nonarray: VOID */ -#line 1774 "MachineIndependent/glslang.y" + case 221: /* type_specifier_nonarray: VOID */ +#line 1749 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtVoid; } -#line 7462 "MachineIndependent/glslang_tab.cpp" +#line 7517 "MachineIndependent/glslang_tab.cpp" break; - case 219: /* type_specifier_nonarray: FLOAT */ -#line 1778 "MachineIndependent/glslang.y" + case 222: /* type_specifier_nonarray: FLOAT */ +#line 1753 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; } -#line 7471 "MachineIndependent/glslang_tab.cpp" +#line 7526 "MachineIndependent/glslang_tab.cpp" break; - case 220: /* type_specifier_nonarray: INT */ -#line 1782 "MachineIndependent/glslang.y" + case 223: /* type_specifier_nonarray: INT */ +#line 1757 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt; } -#line 7480 "MachineIndependent/glslang_tab.cpp" +#line 7535 "MachineIndependent/glslang_tab.cpp" break; - case 221: /* type_specifier_nonarray: UINT */ -#line 1786 "MachineIndependent/glslang.y" + case 224: /* type_specifier_nonarray: UINT */ +#line 1761 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint; } -#line 7490 "MachineIndependent/glslang_tab.cpp" +#line 7545 "MachineIndependent/glslang_tab.cpp" break; - case 222: /* type_specifier_nonarray: BOOL */ -#line 1791 "MachineIndependent/glslang.y" + case 225: /* type_specifier_nonarray: BOOL */ +#line 1766 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtBool; } -#line 7499 "MachineIndependent/glslang_tab.cpp" +#line 7554 "MachineIndependent/glslang_tab.cpp" break; - case 223: /* type_specifier_nonarray: VEC2 */ -#line 1795 "MachineIndependent/glslang.y" + case 226: /* type_specifier_nonarray: VEC2 */ +#line 1770 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setVector(2); } -#line 7509 "MachineIndependent/glslang_tab.cpp" +#line 7564 "MachineIndependent/glslang_tab.cpp" break; - case 224: /* type_specifier_nonarray: VEC3 */ -#line 1800 "MachineIndependent/glslang.y" + case 227: /* type_specifier_nonarray: VEC3 */ +#line 1775 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setVector(3); } -#line 7519 "MachineIndependent/glslang_tab.cpp" +#line 7574 "MachineIndependent/glslang_tab.cpp" break; - case 225: /* type_specifier_nonarray: VEC4 */ -#line 1805 "MachineIndependent/glslang.y" + case 228: /* type_specifier_nonarray: VEC4 */ +#line 1780 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setVector(4); } -#line 7529 "MachineIndependent/glslang_tab.cpp" +#line 7584 "MachineIndependent/glslang_tab.cpp" break; - case 226: /* type_specifier_nonarray: BVEC2 */ -#line 1810 "MachineIndependent/glslang.y" + case 229: /* type_specifier_nonarray: BVEC2 */ +#line 1785 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtBool; (yyval.interm.type).setVector(2); } -#line 7539 "MachineIndependent/glslang_tab.cpp" +#line 7594 "MachineIndependent/glslang_tab.cpp" break; - case 227: /* type_specifier_nonarray: BVEC3 */ -#line 1815 "MachineIndependent/glslang.y" + case 230: /* type_specifier_nonarray: BVEC3 */ +#line 1790 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtBool; (yyval.interm.type).setVector(3); } -#line 7549 "MachineIndependent/glslang_tab.cpp" +#line 7604 "MachineIndependent/glslang_tab.cpp" break; - case 228: /* type_specifier_nonarray: BVEC4 */ -#line 1820 "MachineIndependent/glslang.y" + case 231: /* type_specifier_nonarray: BVEC4 */ +#line 1795 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtBool; (yyval.interm.type).setVector(4); } -#line 7559 "MachineIndependent/glslang_tab.cpp" +#line 7614 "MachineIndependent/glslang_tab.cpp" break; - case 229: /* type_specifier_nonarray: IVEC2 */ -#line 1825 "MachineIndependent/glslang.y" + case 232: /* type_specifier_nonarray: IVEC2 */ +#line 1800 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt; (yyval.interm.type).setVector(2); } -#line 7569 "MachineIndependent/glslang_tab.cpp" +#line 7624 "MachineIndependent/glslang_tab.cpp" break; - case 230: /* type_specifier_nonarray: IVEC3 */ -#line 1830 "MachineIndependent/glslang.y" + case 233: /* type_specifier_nonarray: IVEC3 */ +#line 1805 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt; (yyval.interm.type).setVector(3); } -#line 7579 "MachineIndependent/glslang_tab.cpp" +#line 7634 "MachineIndependent/glslang_tab.cpp" break; - case 231: /* type_specifier_nonarray: IVEC4 */ -#line 1835 "MachineIndependent/glslang.y" + case 234: /* type_specifier_nonarray: IVEC4 */ +#line 1810 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt; (yyval.interm.type).setVector(4); } -#line 7589 "MachineIndependent/glslang_tab.cpp" +#line 7644 "MachineIndependent/glslang_tab.cpp" break; - case 232: /* type_specifier_nonarray: UVEC2 */ -#line 1840 "MachineIndependent/glslang.y" + case 235: /* type_specifier_nonarray: UVEC2 */ +#line 1815 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint; (yyval.interm.type).setVector(2); } -#line 7600 "MachineIndependent/glslang_tab.cpp" +#line 7655 "MachineIndependent/glslang_tab.cpp" break; - case 233: /* type_specifier_nonarray: UVEC3 */ -#line 1846 "MachineIndependent/glslang.y" + case 236: /* type_specifier_nonarray: UVEC3 */ +#line 1821 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint; (yyval.interm.type).setVector(3); } -#line 7611 "MachineIndependent/glslang_tab.cpp" +#line 7666 "MachineIndependent/glslang_tab.cpp" break; - case 234: /* type_specifier_nonarray: UVEC4 */ -#line 1852 "MachineIndependent/glslang.y" + case 237: /* type_specifier_nonarray: UVEC4 */ +#line 1827 "MachineIndependent/glslang.y" { parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint; (yyval.interm.type).setVector(4); } -#line 7622 "MachineIndependent/glslang_tab.cpp" +#line 7677 "MachineIndependent/glslang_tab.cpp" break; - case 235: /* type_specifier_nonarray: MAT2 */ -#line 1858 "MachineIndependent/glslang.y" + case 238: /* type_specifier_nonarray: MAT2 */ +#line 1833 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 2); } -#line 7632 "MachineIndependent/glslang_tab.cpp" +#line 7687 "MachineIndependent/glslang_tab.cpp" break; - case 236: /* type_specifier_nonarray: MAT3 */ -#line 1863 "MachineIndependent/glslang.y" + case 239: /* type_specifier_nonarray: MAT3 */ +#line 1838 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 3); } -#line 7642 "MachineIndependent/glslang_tab.cpp" +#line 7697 "MachineIndependent/glslang_tab.cpp" break; - case 237: /* type_specifier_nonarray: MAT4 */ -#line 1868 "MachineIndependent/glslang.y" + case 240: /* type_specifier_nonarray: MAT4 */ +#line 1843 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 4); } -#line 7652 "MachineIndependent/glslang_tab.cpp" +#line 7707 "MachineIndependent/glslang_tab.cpp" break; - case 238: /* type_specifier_nonarray: MAT2X2 */ -#line 1873 "MachineIndependent/glslang.y" + case 241: /* type_specifier_nonarray: MAT2X2 */ +#line 1848 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 2); } -#line 7662 "MachineIndependent/glslang_tab.cpp" +#line 7717 "MachineIndependent/glslang_tab.cpp" break; - case 239: /* type_specifier_nonarray: MAT2X3 */ -#line 1878 "MachineIndependent/glslang.y" + case 242: /* type_specifier_nonarray: MAT2X3 */ +#line 1853 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 3); } -#line 7672 "MachineIndependent/glslang_tab.cpp" +#line 7727 "MachineIndependent/glslang_tab.cpp" break; - case 240: /* type_specifier_nonarray: MAT2X4 */ -#line 1883 "MachineIndependent/glslang.y" + case 243: /* type_specifier_nonarray: MAT2X4 */ +#line 1858 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 4); } -#line 7682 "MachineIndependent/glslang_tab.cpp" +#line 7737 "MachineIndependent/glslang_tab.cpp" break; - case 241: /* type_specifier_nonarray: MAT3X2 */ -#line 1888 "MachineIndependent/glslang.y" + case 244: /* type_specifier_nonarray: MAT3X2 */ +#line 1863 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 2); } -#line 7692 "MachineIndependent/glslang_tab.cpp" +#line 7747 "MachineIndependent/glslang_tab.cpp" break; - case 242: /* type_specifier_nonarray: MAT3X3 */ -#line 1893 "MachineIndependent/glslang.y" + case 245: /* type_specifier_nonarray: MAT3X3 */ +#line 1868 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 3); } -#line 7702 "MachineIndependent/glslang_tab.cpp" +#line 7757 "MachineIndependent/glslang_tab.cpp" break; - case 243: /* type_specifier_nonarray: MAT3X4 */ -#line 1898 "MachineIndependent/glslang.y" + case 246: /* type_specifier_nonarray: MAT3X4 */ +#line 1873 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 4); } -#line 7712 "MachineIndependent/glslang_tab.cpp" +#line 7767 "MachineIndependent/glslang_tab.cpp" break; - case 244: /* type_specifier_nonarray: MAT4X2 */ -#line 1903 "MachineIndependent/glslang.y" + case 247: /* type_specifier_nonarray: MAT4X2 */ +#line 1878 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 2); } -#line 7722 "MachineIndependent/glslang_tab.cpp" +#line 7777 "MachineIndependent/glslang_tab.cpp" break; - case 245: /* type_specifier_nonarray: MAT4X3 */ -#line 1908 "MachineIndependent/glslang.y" + case 248: /* type_specifier_nonarray: MAT4X3 */ +#line 1883 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 3); } -#line 7732 "MachineIndependent/glslang_tab.cpp" +#line 7787 "MachineIndependent/glslang_tab.cpp" break; - case 246: /* type_specifier_nonarray: MAT4X4 */ -#line 1913 "MachineIndependent/glslang.y" + case 249: /* type_specifier_nonarray: MAT4X4 */ +#line 1888 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 4); } -#line 7742 "MachineIndependent/glslang_tab.cpp" +#line 7797 "MachineIndependent/glslang_tab.cpp" break; - case 247: /* type_specifier_nonarray: DOUBLE */ -#line 1919 "MachineIndependent/glslang.y" + case 250: /* type_specifier_nonarray: DOUBLE */ +#line 1893 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -7750,121 +7805,121 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; } -#line 7754 "MachineIndependent/glslang_tab.cpp" +#line 7809 "MachineIndependent/glslang_tab.cpp" break; - case 248: /* type_specifier_nonarray: FLOAT16_T */ -#line 1926 "MachineIndependent/glslang.y" + case 251: /* type_specifier_nonarray: FLOAT16_T */ +#line 1900 "MachineIndependent/glslang.y" { parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "float16_t", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat16; } -#line 7764 "MachineIndependent/glslang_tab.cpp" +#line 7819 "MachineIndependent/glslang_tab.cpp" break; - case 249: /* type_specifier_nonarray: FLOAT32_T */ -#line 1931 "MachineIndependent/glslang.y" + case 252: /* type_specifier_nonarray: FLOAT32_T */ +#line 1905 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; } -#line 7774 "MachineIndependent/glslang_tab.cpp" +#line 7829 "MachineIndependent/glslang_tab.cpp" break; - case 250: /* type_specifier_nonarray: FLOAT64_T */ -#line 1936 "MachineIndependent/glslang.y" + case 253: /* type_specifier_nonarray: FLOAT64_T */ +#line 1910 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; } -#line 7784 "MachineIndependent/glslang_tab.cpp" +#line 7839 "MachineIndependent/glslang_tab.cpp" break; - case 251: /* type_specifier_nonarray: INT8_T */ -#line 1941 "MachineIndependent/glslang.y" + case 254: /* type_specifier_nonarray: INT8_T */ +#line 1915 "MachineIndependent/glslang.y" { parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt8; } -#line 7794 "MachineIndependent/glslang_tab.cpp" +#line 7849 "MachineIndependent/glslang_tab.cpp" break; - case 252: /* type_specifier_nonarray: UINT8_T */ -#line 1946 "MachineIndependent/glslang.y" + case 255: /* type_specifier_nonarray: UINT8_T */ +#line 1920 "MachineIndependent/glslang.y" { parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint8; } -#line 7804 "MachineIndependent/glslang_tab.cpp" +#line 7859 "MachineIndependent/glslang_tab.cpp" break; - case 253: /* type_specifier_nonarray: INT16_T */ -#line 1951 "MachineIndependent/glslang.y" + case 256: /* type_specifier_nonarray: INT16_T */ +#line 1925 "MachineIndependent/glslang.y" { parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt16; } -#line 7814 "MachineIndependent/glslang_tab.cpp" +#line 7869 "MachineIndependent/glslang_tab.cpp" break; - case 254: /* type_specifier_nonarray: UINT16_T */ -#line 1956 "MachineIndependent/glslang.y" + case 257: /* type_specifier_nonarray: UINT16_T */ +#line 1930 "MachineIndependent/glslang.y" { parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint16; } -#line 7824 "MachineIndependent/glslang_tab.cpp" +#line 7879 "MachineIndependent/glslang_tab.cpp" break; - case 255: /* type_specifier_nonarray: INT32_T */ -#line 1961 "MachineIndependent/glslang.y" + case 258: /* type_specifier_nonarray: INT32_T */ +#line 1935 "MachineIndependent/glslang.y" { parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt; } -#line 7834 "MachineIndependent/glslang_tab.cpp" +#line 7889 "MachineIndependent/glslang_tab.cpp" break; - case 256: /* type_specifier_nonarray: UINT32_T */ -#line 1966 "MachineIndependent/glslang.y" + case 259: /* type_specifier_nonarray: UINT32_T */ +#line 1940 "MachineIndependent/glslang.y" { parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint; } -#line 7844 "MachineIndependent/glslang_tab.cpp" +#line 7899 "MachineIndependent/glslang_tab.cpp" break; - case 257: /* type_specifier_nonarray: INT64_T */ -#line 1971 "MachineIndependent/glslang.y" + case 260: /* type_specifier_nonarray: INT64_T */ +#line 1945 "MachineIndependent/glslang.y" { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt64; } -#line 7854 "MachineIndependent/glslang_tab.cpp" +#line 7909 "MachineIndependent/glslang_tab.cpp" break; - case 258: /* type_specifier_nonarray: UINT64_T */ -#line 1976 "MachineIndependent/glslang.y" + case 261: /* type_specifier_nonarray: UINT64_T */ +#line 1950 "MachineIndependent/glslang.y" { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint64; } -#line 7864 "MachineIndependent/glslang_tab.cpp" +#line 7919 "MachineIndependent/glslang_tab.cpp" break; - case 259: /* type_specifier_nonarray: DVEC2 */ -#line 1981 "MachineIndependent/glslang.y" + case 262: /* type_specifier_nonarray: DVEC2 */ +#line 1955 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double vector"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -7873,11 +7928,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setVector(2); } -#line 7877 "MachineIndependent/glslang_tab.cpp" +#line 7932 "MachineIndependent/glslang_tab.cpp" break; - case 260: /* type_specifier_nonarray: DVEC3 */ -#line 1989 "MachineIndependent/glslang.y" + case 263: /* type_specifier_nonarray: DVEC3 */ +#line 1963 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double vector"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -7886,11 +7941,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setVector(3); } -#line 7890 "MachineIndependent/glslang_tab.cpp" +#line 7945 "MachineIndependent/glslang_tab.cpp" break; - case 261: /* type_specifier_nonarray: DVEC4 */ -#line 1997 "MachineIndependent/glslang.y" + case 264: /* type_specifier_nonarray: DVEC4 */ +#line 1971 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double vector"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -7899,374 +7954,374 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setVector(4); } -#line 7903 "MachineIndependent/glslang_tab.cpp" +#line 7958 "MachineIndependent/glslang_tab.cpp" break; - case 262: /* type_specifier_nonarray: F16VEC2 */ -#line 2005 "MachineIndependent/glslang.y" + case 265: /* type_specifier_nonarray: F16VEC2 */ +#line 1979 "MachineIndependent/glslang.y" { parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat16; (yyval.interm.type).setVector(2); } -#line 7914 "MachineIndependent/glslang_tab.cpp" +#line 7969 "MachineIndependent/glslang_tab.cpp" break; - case 263: /* type_specifier_nonarray: F16VEC3 */ -#line 2011 "MachineIndependent/glslang.y" + case 266: /* type_specifier_nonarray: F16VEC3 */ +#line 1985 "MachineIndependent/glslang.y" { parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat16; (yyval.interm.type).setVector(3); } -#line 7925 "MachineIndependent/glslang_tab.cpp" +#line 7980 "MachineIndependent/glslang_tab.cpp" break; - case 264: /* type_specifier_nonarray: F16VEC4 */ -#line 2017 "MachineIndependent/glslang.y" + case 267: /* type_specifier_nonarray: F16VEC4 */ +#line 1991 "MachineIndependent/glslang.y" { parseContext.float16ScalarVectorCheck((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat16; (yyval.interm.type).setVector(4); } -#line 7936 "MachineIndependent/glslang_tab.cpp" +#line 7991 "MachineIndependent/glslang_tab.cpp" break; - case 265: /* type_specifier_nonarray: F32VEC2 */ -#line 2023 "MachineIndependent/glslang.y" + case 268: /* type_specifier_nonarray: F32VEC2 */ +#line 1997 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setVector(2); } -#line 7947 "MachineIndependent/glslang_tab.cpp" +#line 8002 "MachineIndependent/glslang_tab.cpp" break; - case 266: /* type_specifier_nonarray: F32VEC3 */ -#line 2029 "MachineIndependent/glslang.y" + case 269: /* type_specifier_nonarray: F32VEC3 */ +#line 2003 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setVector(3); } -#line 7958 "MachineIndependent/glslang_tab.cpp" +#line 8013 "MachineIndependent/glslang_tab.cpp" break; - case 267: /* type_specifier_nonarray: F32VEC4 */ -#line 2035 "MachineIndependent/glslang.y" + case 270: /* type_specifier_nonarray: F32VEC4 */ +#line 2009 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setVector(4); } -#line 7969 "MachineIndependent/glslang_tab.cpp" +#line 8024 "MachineIndependent/glslang_tab.cpp" break; - case 268: /* type_specifier_nonarray: F64VEC2 */ -#line 2041 "MachineIndependent/glslang.y" + case 271: /* type_specifier_nonarray: F64VEC2 */ +#line 2015 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setVector(2); } -#line 7980 "MachineIndependent/glslang_tab.cpp" +#line 8035 "MachineIndependent/glslang_tab.cpp" break; - case 269: /* type_specifier_nonarray: F64VEC3 */ -#line 2047 "MachineIndependent/glslang.y" + case 272: /* type_specifier_nonarray: F64VEC3 */ +#line 2021 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setVector(3); } -#line 7991 "MachineIndependent/glslang_tab.cpp" +#line 8046 "MachineIndependent/glslang_tab.cpp" break; - case 270: /* type_specifier_nonarray: F64VEC4 */ -#line 2053 "MachineIndependent/glslang.y" + case 273: /* type_specifier_nonarray: F64VEC4 */ +#line 2027 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setVector(4); } -#line 8002 "MachineIndependent/glslang_tab.cpp" +#line 8057 "MachineIndependent/glslang_tab.cpp" break; - case 271: /* type_specifier_nonarray: I8VEC2 */ -#line 2059 "MachineIndependent/glslang.y" + case 274: /* type_specifier_nonarray: I8VEC2 */ +#line 2033 "MachineIndependent/glslang.y" { parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt8; (yyval.interm.type).setVector(2); } -#line 8013 "MachineIndependent/glslang_tab.cpp" +#line 8068 "MachineIndependent/glslang_tab.cpp" break; - case 272: /* type_specifier_nonarray: I8VEC3 */ -#line 2065 "MachineIndependent/glslang.y" + case 275: /* type_specifier_nonarray: I8VEC3 */ +#line 2039 "MachineIndependent/glslang.y" { parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt8; (yyval.interm.type).setVector(3); } -#line 8024 "MachineIndependent/glslang_tab.cpp" +#line 8079 "MachineIndependent/glslang_tab.cpp" break; - case 273: /* type_specifier_nonarray: I8VEC4 */ -#line 2071 "MachineIndependent/glslang.y" + case 276: /* type_specifier_nonarray: I8VEC4 */ +#line 2045 "MachineIndependent/glslang.y" { parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt8; (yyval.interm.type).setVector(4); } -#line 8035 "MachineIndependent/glslang_tab.cpp" +#line 8090 "MachineIndependent/glslang_tab.cpp" break; - case 274: /* type_specifier_nonarray: I16VEC2 */ -#line 2077 "MachineIndependent/glslang.y" + case 277: /* type_specifier_nonarray: I16VEC2 */ +#line 2051 "MachineIndependent/glslang.y" { parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt16; (yyval.interm.type).setVector(2); } -#line 8046 "MachineIndependent/glslang_tab.cpp" +#line 8101 "MachineIndependent/glslang_tab.cpp" break; - case 275: /* type_specifier_nonarray: I16VEC3 */ -#line 2083 "MachineIndependent/glslang.y" + case 278: /* type_specifier_nonarray: I16VEC3 */ +#line 2057 "MachineIndependent/glslang.y" { parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt16; (yyval.interm.type).setVector(3); } -#line 8057 "MachineIndependent/glslang_tab.cpp" +#line 8112 "MachineIndependent/glslang_tab.cpp" break; - case 276: /* type_specifier_nonarray: I16VEC4 */ -#line 2089 "MachineIndependent/glslang.y" + case 279: /* type_specifier_nonarray: I16VEC4 */ +#line 2063 "MachineIndependent/glslang.y" { parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt16; (yyval.interm.type).setVector(4); } -#line 8068 "MachineIndependent/glslang_tab.cpp" +#line 8123 "MachineIndependent/glslang_tab.cpp" break; - case 277: /* type_specifier_nonarray: I32VEC2 */ -#line 2095 "MachineIndependent/glslang.y" + case 280: /* type_specifier_nonarray: I32VEC2 */ +#line 2069 "MachineIndependent/glslang.y" { parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt; (yyval.interm.type).setVector(2); } -#line 8079 "MachineIndependent/glslang_tab.cpp" +#line 8134 "MachineIndependent/glslang_tab.cpp" break; - case 278: /* type_specifier_nonarray: I32VEC3 */ -#line 2101 "MachineIndependent/glslang.y" + case 281: /* type_specifier_nonarray: I32VEC3 */ +#line 2075 "MachineIndependent/glslang.y" { parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt; (yyval.interm.type).setVector(3); } -#line 8090 "MachineIndependent/glslang_tab.cpp" +#line 8145 "MachineIndependent/glslang_tab.cpp" break; - case 279: /* type_specifier_nonarray: I32VEC4 */ -#line 2107 "MachineIndependent/glslang.y" + case 282: /* type_specifier_nonarray: I32VEC4 */ +#line 2081 "MachineIndependent/glslang.y" { parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt; (yyval.interm.type).setVector(4); } -#line 8101 "MachineIndependent/glslang_tab.cpp" +#line 8156 "MachineIndependent/glslang_tab.cpp" break; - case 280: /* type_specifier_nonarray: I64VEC2 */ -#line 2113 "MachineIndependent/glslang.y" + case 283: /* type_specifier_nonarray: I64VEC2 */ +#line 2087 "MachineIndependent/glslang.y" { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt64; (yyval.interm.type).setVector(2); } -#line 8112 "MachineIndependent/glslang_tab.cpp" +#line 8167 "MachineIndependent/glslang_tab.cpp" break; - case 281: /* type_specifier_nonarray: I64VEC3 */ -#line 2119 "MachineIndependent/glslang.y" + case 284: /* type_specifier_nonarray: I64VEC3 */ +#line 2093 "MachineIndependent/glslang.y" { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt64; (yyval.interm.type).setVector(3); } -#line 8123 "MachineIndependent/glslang_tab.cpp" +#line 8178 "MachineIndependent/glslang_tab.cpp" break; - case 282: /* type_specifier_nonarray: I64VEC4 */ -#line 2125 "MachineIndependent/glslang.y" + case 285: /* type_specifier_nonarray: I64VEC4 */ +#line 2099 "MachineIndependent/glslang.y" { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt64; (yyval.interm.type).setVector(4); } -#line 8134 "MachineIndependent/glslang_tab.cpp" +#line 8189 "MachineIndependent/glslang_tab.cpp" break; - case 283: /* type_specifier_nonarray: U8VEC2 */ -#line 2131 "MachineIndependent/glslang.y" + case 286: /* type_specifier_nonarray: U8VEC2 */ +#line 2105 "MachineIndependent/glslang.y" { parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint8; (yyval.interm.type).setVector(2); } -#line 8145 "MachineIndependent/glslang_tab.cpp" +#line 8200 "MachineIndependent/glslang_tab.cpp" break; - case 284: /* type_specifier_nonarray: U8VEC3 */ -#line 2137 "MachineIndependent/glslang.y" + case 287: /* type_specifier_nonarray: U8VEC3 */ +#line 2111 "MachineIndependent/glslang.y" { parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint8; (yyval.interm.type).setVector(3); } -#line 8156 "MachineIndependent/glslang_tab.cpp" +#line 8211 "MachineIndependent/glslang_tab.cpp" break; - case 285: /* type_specifier_nonarray: U8VEC4 */ -#line 2143 "MachineIndependent/glslang.y" + case 288: /* type_specifier_nonarray: U8VEC4 */ +#line 2117 "MachineIndependent/glslang.y" { parseContext.int8ScalarVectorCheck((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint8; (yyval.interm.type).setVector(4); } -#line 8167 "MachineIndependent/glslang_tab.cpp" +#line 8222 "MachineIndependent/glslang_tab.cpp" break; - case 286: /* type_specifier_nonarray: U16VEC2 */ -#line 2149 "MachineIndependent/glslang.y" + case 289: /* type_specifier_nonarray: U16VEC2 */ +#line 2123 "MachineIndependent/glslang.y" { parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint16; (yyval.interm.type).setVector(2); } -#line 8178 "MachineIndependent/glslang_tab.cpp" +#line 8233 "MachineIndependent/glslang_tab.cpp" break; - case 287: /* type_specifier_nonarray: U16VEC3 */ -#line 2155 "MachineIndependent/glslang.y" + case 290: /* type_specifier_nonarray: U16VEC3 */ +#line 2129 "MachineIndependent/glslang.y" { parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint16; (yyval.interm.type).setVector(3); } -#line 8189 "MachineIndependent/glslang_tab.cpp" +#line 8244 "MachineIndependent/glslang_tab.cpp" break; - case 288: /* type_specifier_nonarray: U16VEC4 */ -#line 2161 "MachineIndependent/glslang.y" + case 291: /* type_specifier_nonarray: U16VEC4 */ +#line 2135 "MachineIndependent/glslang.y" { parseContext.int16ScalarVectorCheck((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint16; (yyval.interm.type).setVector(4); } -#line 8200 "MachineIndependent/glslang_tab.cpp" +#line 8255 "MachineIndependent/glslang_tab.cpp" break; - case 289: /* type_specifier_nonarray: U32VEC2 */ -#line 2167 "MachineIndependent/glslang.y" + case 292: /* type_specifier_nonarray: U32VEC2 */ +#line 2141 "MachineIndependent/glslang.y" { parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint; (yyval.interm.type).setVector(2); } -#line 8211 "MachineIndependent/glslang_tab.cpp" +#line 8266 "MachineIndependent/glslang_tab.cpp" break; - case 290: /* type_specifier_nonarray: U32VEC3 */ -#line 2173 "MachineIndependent/glslang.y" + case 293: /* type_specifier_nonarray: U32VEC3 */ +#line 2147 "MachineIndependent/glslang.y" { parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint; (yyval.interm.type).setVector(3); } -#line 8222 "MachineIndependent/glslang_tab.cpp" +#line 8277 "MachineIndependent/glslang_tab.cpp" break; - case 291: /* type_specifier_nonarray: U32VEC4 */ -#line 2179 "MachineIndependent/glslang.y" + case 294: /* type_specifier_nonarray: U32VEC4 */ +#line 2153 "MachineIndependent/glslang.y" { parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint; (yyval.interm.type).setVector(4); } -#line 8233 "MachineIndependent/glslang_tab.cpp" +#line 8288 "MachineIndependent/glslang_tab.cpp" break; - case 292: /* type_specifier_nonarray: U64VEC2 */ -#line 2185 "MachineIndependent/glslang.y" + case 295: /* type_specifier_nonarray: U64VEC2 */ +#line 2159 "MachineIndependent/glslang.y" { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint64; (yyval.interm.type).setVector(2); } -#line 8244 "MachineIndependent/glslang_tab.cpp" +#line 8299 "MachineIndependent/glslang_tab.cpp" break; - case 293: /* type_specifier_nonarray: U64VEC3 */ -#line 2191 "MachineIndependent/glslang.y" + case 296: /* type_specifier_nonarray: U64VEC3 */ +#line 2165 "MachineIndependent/glslang.y" { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint64; (yyval.interm.type).setVector(3); } -#line 8255 "MachineIndependent/glslang_tab.cpp" +#line 8310 "MachineIndependent/glslang_tab.cpp" break; - case 294: /* type_specifier_nonarray: U64VEC4 */ -#line 2197 "MachineIndependent/glslang.y" + case 297: /* type_specifier_nonarray: U64VEC4 */ +#line 2171 "MachineIndependent/glslang.y" { parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint64; (yyval.interm.type).setVector(4); } -#line 8266 "MachineIndependent/glslang_tab.cpp" +#line 8321 "MachineIndependent/glslang_tab.cpp" break; - case 295: /* type_specifier_nonarray: DMAT2 */ -#line 2203 "MachineIndependent/glslang.y" + case 298: /* type_specifier_nonarray: DMAT2 */ +#line 2177 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8275,11 +8330,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 2); } -#line 8279 "MachineIndependent/glslang_tab.cpp" +#line 8334 "MachineIndependent/glslang_tab.cpp" break; - case 296: /* type_specifier_nonarray: DMAT3 */ -#line 2211 "MachineIndependent/glslang.y" + case 299: /* type_specifier_nonarray: DMAT3 */ +#line 2185 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8288,11 +8343,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 3); } -#line 8292 "MachineIndependent/glslang_tab.cpp" +#line 8347 "MachineIndependent/glslang_tab.cpp" break; - case 297: /* type_specifier_nonarray: DMAT4 */ -#line 2219 "MachineIndependent/glslang.y" + case 300: /* type_specifier_nonarray: DMAT4 */ +#line 2193 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8301,11 +8356,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(4, 4); } -#line 8305 "MachineIndependent/glslang_tab.cpp" +#line 8360 "MachineIndependent/glslang_tab.cpp" break; - case 298: /* type_specifier_nonarray: DMAT2X2 */ -#line 2227 "MachineIndependent/glslang.y" + case 301: /* type_specifier_nonarray: DMAT2X2 */ +#line 2201 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8314,11 +8369,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 2); } -#line 8318 "MachineIndependent/glslang_tab.cpp" +#line 8373 "MachineIndependent/glslang_tab.cpp" break; - case 299: /* type_specifier_nonarray: DMAT2X3 */ -#line 2235 "MachineIndependent/glslang.y" + case 302: /* type_specifier_nonarray: DMAT2X3 */ +#line 2209 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8327,11 +8382,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 3); } -#line 8331 "MachineIndependent/glslang_tab.cpp" +#line 8386 "MachineIndependent/glslang_tab.cpp" break; - case 300: /* type_specifier_nonarray: DMAT2X4 */ -#line 2243 "MachineIndependent/glslang.y" + case 303: /* type_specifier_nonarray: DMAT2X4 */ +#line 2217 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8340,11 +8395,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 4); } -#line 8344 "MachineIndependent/glslang_tab.cpp" +#line 8399 "MachineIndependent/glslang_tab.cpp" break; - case 301: /* type_specifier_nonarray: DMAT3X2 */ -#line 2251 "MachineIndependent/glslang.y" + case 304: /* type_specifier_nonarray: DMAT3X2 */ +#line 2225 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8353,11 +8408,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 2); } -#line 8357 "MachineIndependent/glslang_tab.cpp" +#line 8412 "MachineIndependent/glslang_tab.cpp" break; - case 302: /* type_specifier_nonarray: DMAT3X3 */ -#line 2259 "MachineIndependent/glslang.y" + case 305: /* type_specifier_nonarray: DMAT3X3 */ +#line 2233 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8366,11 +8421,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 3); } -#line 8370 "MachineIndependent/glslang_tab.cpp" +#line 8425 "MachineIndependent/glslang_tab.cpp" break; - case 303: /* type_specifier_nonarray: DMAT3X4 */ -#line 2267 "MachineIndependent/glslang.y" + case 306: /* type_specifier_nonarray: DMAT3X4 */ +#line 2241 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8379,11 +8434,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 4); } -#line 8383 "MachineIndependent/glslang_tab.cpp" +#line 8438 "MachineIndependent/glslang_tab.cpp" break; - case 304: /* type_specifier_nonarray: DMAT4X2 */ -#line 2275 "MachineIndependent/glslang.y" + case 307: /* type_specifier_nonarray: DMAT4X2 */ +#line 2249 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8392,11 +8447,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(4, 2); } -#line 8396 "MachineIndependent/glslang_tab.cpp" +#line 8451 "MachineIndependent/glslang_tab.cpp" break; - case 305: /* type_specifier_nonarray: DMAT4X3 */ -#line 2283 "MachineIndependent/glslang.y" + case 308: /* type_specifier_nonarray: DMAT4X3 */ +#line 2257 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8405,11 +8460,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(4, 3); } -#line 8409 "MachineIndependent/glslang_tab.cpp" +#line 8464 "MachineIndependent/glslang_tab.cpp" break; - case 306: /* type_specifier_nonarray: DMAT4X4 */ -#line 2291 "MachineIndependent/glslang.y" + case 309: /* type_specifier_nonarray: DMAT4X4 */ +#line 2265 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, "double matrix"); if (! parseContext.symbolTable.atBuiltInLevel()) @@ -8418,2228 +8473,2261 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(4, 4); } -#line 8422 "MachineIndependent/glslang_tab.cpp" +#line 8477 "MachineIndependent/glslang_tab.cpp" break; - case 307: /* type_specifier_nonarray: F16MAT2 */ -#line 2299 "MachineIndependent/glslang.y" + case 310: /* type_specifier_nonarray: F16MAT2 */ +#line 2273 "MachineIndependent/glslang.y" { parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat16; (yyval.interm.type).setMatrix(2, 2); } -#line 8433 "MachineIndependent/glslang_tab.cpp" +#line 8488 "MachineIndependent/glslang_tab.cpp" break; - case 308: /* type_specifier_nonarray: F16MAT3 */ -#line 2305 "MachineIndependent/glslang.y" + case 311: /* type_specifier_nonarray: F16MAT3 */ +#line 2279 "MachineIndependent/glslang.y" { parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat16; (yyval.interm.type).setMatrix(3, 3); } -#line 8444 "MachineIndependent/glslang_tab.cpp" +#line 8499 "MachineIndependent/glslang_tab.cpp" break; - case 309: /* type_specifier_nonarray: F16MAT4 */ -#line 2311 "MachineIndependent/glslang.y" + case 312: /* type_specifier_nonarray: F16MAT4 */ +#line 2285 "MachineIndependent/glslang.y" { parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat16; (yyval.interm.type).setMatrix(4, 4); } -#line 8455 "MachineIndependent/glslang_tab.cpp" +#line 8510 "MachineIndependent/glslang_tab.cpp" break; - case 310: /* type_specifier_nonarray: F16MAT2X2 */ -#line 2317 "MachineIndependent/glslang.y" + case 313: /* type_specifier_nonarray: F16MAT2X2 */ +#line 2291 "MachineIndependent/glslang.y" { parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat16; (yyval.interm.type).setMatrix(2, 2); } -#line 8466 "MachineIndependent/glslang_tab.cpp" +#line 8521 "MachineIndependent/glslang_tab.cpp" break; - case 311: /* type_specifier_nonarray: F16MAT2X3 */ -#line 2323 "MachineIndependent/glslang.y" + case 314: /* type_specifier_nonarray: F16MAT2X3 */ +#line 2297 "MachineIndependent/glslang.y" { parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat16; (yyval.interm.type).setMatrix(2, 3); } -#line 8477 "MachineIndependent/glslang_tab.cpp" +#line 8532 "MachineIndependent/glslang_tab.cpp" break; - case 312: /* type_specifier_nonarray: F16MAT2X4 */ -#line 2329 "MachineIndependent/glslang.y" + case 315: /* type_specifier_nonarray: F16MAT2X4 */ +#line 2303 "MachineIndependent/glslang.y" { parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat16; (yyval.interm.type).setMatrix(2, 4); } -#line 8488 "MachineIndependent/glslang_tab.cpp" +#line 8543 "MachineIndependent/glslang_tab.cpp" break; - case 313: /* type_specifier_nonarray: F16MAT3X2 */ -#line 2335 "MachineIndependent/glslang.y" + case 316: /* type_specifier_nonarray: F16MAT3X2 */ +#line 2309 "MachineIndependent/glslang.y" { parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat16; (yyval.interm.type).setMatrix(3, 2); } -#line 8499 "MachineIndependent/glslang_tab.cpp" +#line 8554 "MachineIndependent/glslang_tab.cpp" break; - case 314: /* type_specifier_nonarray: F16MAT3X3 */ -#line 2341 "MachineIndependent/glslang.y" + case 317: /* type_specifier_nonarray: F16MAT3X3 */ +#line 2315 "MachineIndependent/glslang.y" { parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat16; (yyval.interm.type).setMatrix(3, 3); } -#line 8510 "MachineIndependent/glslang_tab.cpp" +#line 8565 "MachineIndependent/glslang_tab.cpp" break; - case 315: /* type_specifier_nonarray: F16MAT3X4 */ -#line 2347 "MachineIndependent/glslang.y" + case 318: /* type_specifier_nonarray: F16MAT3X4 */ +#line 2321 "MachineIndependent/glslang.y" { parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat16; (yyval.interm.type).setMatrix(3, 4); } -#line 8521 "MachineIndependent/glslang_tab.cpp" +#line 8576 "MachineIndependent/glslang_tab.cpp" break; - case 316: /* type_specifier_nonarray: F16MAT4X2 */ -#line 2353 "MachineIndependent/glslang.y" + case 319: /* type_specifier_nonarray: F16MAT4X2 */ +#line 2327 "MachineIndependent/glslang.y" { parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat16; (yyval.interm.type).setMatrix(4, 2); } -#line 8532 "MachineIndependent/glslang_tab.cpp" +#line 8587 "MachineIndependent/glslang_tab.cpp" break; - case 317: /* type_specifier_nonarray: F16MAT4X3 */ -#line 2359 "MachineIndependent/glslang.y" + case 320: /* type_specifier_nonarray: F16MAT4X3 */ +#line 2333 "MachineIndependent/glslang.y" { parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat16; (yyval.interm.type).setMatrix(4, 3); } -#line 8543 "MachineIndependent/glslang_tab.cpp" +#line 8598 "MachineIndependent/glslang_tab.cpp" break; - case 318: /* type_specifier_nonarray: F16MAT4X4 */ -#line 2365 "MachineIndependent/glslang.y" + case 321: /* type_specifier_nonarray: F16MAT4X4 */ +#line 2339 "MachineIndependent/glslang.y" { parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat16; (yyval.interm.type).setMatrix(4, 4); } -#line 8554 "MachineIndependent/glslang_tab.cpp" +#line 8609 "MachineIndependent/glslang_tab.cpp" break; - case 319: /* type_specifier_nonarray: F32MAT2 */ -#line 2371 "MachineIndependent/glslang.y" + case 322: /* type_specifier_nonarray: F32MAT2 */ +#line 2345 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 2); } -#line 8565 "MachineIndependent/glslang_tab.cpp" +#line 8620 "MachineIndependent/glslang_tab.cpp" break; - case 320: /* type_specifier_nonarray: F32MAT3 */ -#line 2377 "MachineIndependent/glslang.y" + case 323: /* type_specifier_nonarray: F32MAT3 */ +#line 2351 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 3); } -#line 8576 "MachineIndependent/glslang_tab.cpp" +#line 8631 "MachineIndependent/glslang_tab.cpp" break; - case 321: /* type_specifier_nonarray: F32MAT4 */ -#line 2383 "MachineIndependent/glslang.y" + case 324: /* type_specifier_nonarray: F32MAT4 */ +#line 2357 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 4); } -#line 8587 "MachineIndependent/glslang_tab.cpp" +#line 8642 "MachineIndependent/glslang_tab.cpp" break; - case 322: /* type_specifier_nonarray: F32MAT2X2 */ -#line 2389 "MachineIndependent/glslang.y" + case 325: /* type_specifier_nonarray: F32MAT2X2 */ +#line 2363 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 2); } -#line 8598 "MachineIndependent/glslang_tab.cpp" +#line 8653 "MachineIndependent/glslang_tab.cpp" break; - case 323: /* type_specifier_nonarray: F32MAT2X3 */ -#line 2395 "MachineIndependent/glslang.y" + case 326: /* type_specifier_nonarray: F32MAT2X3 */ +#line 2369 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 3); } -#line 8609 "MachineIndependent/glslang_tab.cpp" +#line 8664 "MachineIndependent/glslang_tab.cpp" break; - case 324: /* type_specifier_nonarray: F32MAT2X4 */ -#line 2401 "MachineIndependent/glslang.y" + case 327: /* type_specifier_nonarray: F32MAT2X4 */ +#line 2375 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(2, 4); } -#line 8620 "MachineIndependent/glslang_tab.cpp" +#line 8675 "MachineIndependent/glslang_tab.cpp" break; - case 325: /* type_specifier_nonarray: F32MAT3X2 */ -#line 2407 "MachineIndependent/glslang.y" + case 328: /* type_specifier_nonarray: F32MAT3X2 */ +#line 2381 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 2); } -#line 8631 "MachineIndependent/glslang_tab.cpp" +#line 8686 "MachineIndependent/glslang_tab.cpp" break; - case 326: /* type_specifier_nonarray: F32MAT3X3 */ -#line 2413 "MachineIndependent/glslang.y" + case 329: /* type_specifier_nonarray: F32MAT3X3 */ +#line 2387 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 3); } -#line 8642 "MachineIndependent/glslang_tab.cpp" +#line 8697 "MachineIndependent/glslang_tab.cpp" break; - case 327: /* type_specifier_nonarray: F32MAT3X4 */ -#line 2419 "MachineIndependent/glslang.y" + case 330: /* type_specifier_nonarray: F32MAT3X4 */ +#line 2393 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(3, 4); } -#line 8653 "MachineIndependent/glslang_tab.cpp" +#line 8708 "MachineIndependent/glslang_tab.cpp" break; - case 328: /* type_specifier_nonarray: F32MAT4X2 */ -#line 2425 "MachineIndependent/glslang.y" + case 331: /* type_specifier_nonarray: F32MAT4X2 */ +#line 2399 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 2); } -#line 8664 "MachineIndependent/glslang_tab.cpp" +#line 8719 "MachineIndependent/glslang_tab.cpp" break; - case 329: /* type_specifier_nonarray: F32MAT4X3 */ -#line 2431 "MachineIndependent/glslang.y" + case 332: /* type_specifier_nonarray: F32MAT4X3 */ +#line 2405 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 3); } -#line 8675 "MachineIndependent/glslang_tab.cpp" +#line 8730 "MachineIndependent/glslang_tab.cpp" break; - case 330: /* type_specifier_nonarray: F32MAT4X4 */ -#line 2437 "MachineIndependent/glslang.y" + case 333: /* type_specifier_nonarray: F32MAT4X4 */ +#line 2411 "MachineIndependent/glslang.y" { parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; (yyval.interm.type).setMatrix(4, 4); } -#line 8686 "MachineIndependent/glslang_tab.cpp" +#line 8741 "MachineIndependent/glslang_tab.cpp" break; - case 331: /* type_specifier_nonarray: F64MAT2 */ -#line 2443 "MachineIndependent/glslang.y" + case 334: /* type_specifier_nonarray: F64MAT2 */ +#line 2417 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 2); } -#line 8697 "MachineIndependent/glslang_tab.cpp" +#line 8752 "MachineIndependent/glslang_tab.cpp" break; - case 332: /* type_specifier_nonarray: F64MAT3 */ -#line 2449 "MachineIndependent/glslang.y" + case 335: /* type_specifier_nonarray: F64MAT3 */ +#line 2423 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 3); } -#line 8708 "MachineIndependent/glslang_tab.cpp" +#line 8763 "MachineIndependent/glslang_tab.cpp" break; - case 333: /* type_specifier_nonarray: F64MAT4 */ -#line 2455 "MachineIndependent/glslang.y" + case 336: /* type_specifier_nonarray: F64MAT4 */ +#line 2429 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(4, 4); } -#line 8719 "MachineIndependent/glslang_tab.cpp" +#line 8774 "MachineIndependent/glslang_tab.cpp" break; - case 334: /* type_specifier_nonarray: F64MAT2X2 */ -#line 2461 "MachineIndependent/glslang.y" + case 337: /* type_specifier_nonarray: F64MAT2X2 */ +#line 2435 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 2); } -#line 8730 "MachineIndependent/glslang_tab.cpp" +#line 8785 "MachineIndependent/glslang_tab.cpp" break; - case 335: /* type_specifier_nonarray: F64MAT2X3 */ -#line 2467 "MachineIndependent/glslang.y" + case 338: /* type_specifier_nonarray: F64MAT2X3 */ +#line 2441 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 3); } -#line 8741 "MachineIndependent/glslang_tab.cpp" +#line 8796 "MachineIndependent/glslang_tab.cpp" break; - case 336: /* type_specifier_nonarray: F64MAT2X4 */ -#line 2473 "MachineIndependent/glslang.y" + case 339: /* type_specifier_nonarray: F64MAT2X4 */ +#line 2447 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(2, 4); } -#line 8752 "MachineIndependent/glslang_tab.cpp" +#line 8807 "MachineIndependent/glslang_tab.cpp" break; - case 337: /* type_specifier_nonarray: F64MAT3X2 */ -#line 2479 "MachineIndependent/glslang.y" + case 340: /* type_specifier_nonarray: F64MAT3X2 */ +#line 2453 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 2); } -#line 8763 "MachineIndependent/glslang_tab.cpp" +#line 8818 "MachineIndependent/glslang_tab.cpp" break; - case 338: /* type_specifier_nonarray: F64MAT3X3 */ -#line 2485 "MachineIndependent/glslang.y" + case 341: /* type_specifier_nonarray: F64MAT3X3 */ +#line 2459 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 3); } -#line 8774 "MachineIndependent/glslang_tab.cpp" +#line 8829 "MachineIndependent/glslang_tab.cpp" break; - case 339: /* type_specifier_nonarray: F64MAT3X4 */ -#line 2491 "MachineIndependent/glslang.y" + case 342: /* type_specifier_nonarray: F64MAT3X4 */ +#line 2465 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(3, 4); } -#line 8785 "MachineIndependent/glslang_tab.cpp" +#line 8840 "MachineIndependent/glslang_tab.cpp" break; - case 340: /* type_specifier_nonarray: F64MAT4X2 */ -#line 2497 "MachineIndependent/glslang.y" + case 343: /* type_specifier_nonarray: F64MAT4X2 */ +#line 2471 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(4, 2); } -#line 8796 "MachineIndependent/glslang_tab.cpp" +#line 8851 "MachineIndependent/glslang_tab.cpp" break; - case 341: /* type_specifier_nonarray: F64MAT4X3 */ -#line 2503 "MachineIndependent/glslang.y" + case 344: /* type_specifier_nonarray: F64MAT4X3 */ +#line 2477 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(4, 3); } -#line 8807 "MachineIndependent/glslang_tab.cpp" +#line 8862 "MachineIndependent/glslang_tab.cpp" break; - case 342: /* type_specifier_nonarray: F64MAT4X4 */ -#line 2509 "MachineIndependent/glslang.y" + case 345: /* type_specifier_nonarray: F64MAT4X4 */ +#line 2483 "MachineIndependent/glslang.y" { parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtDouble; (yyval.interm.type).setMatrix(4, 4); } -#line 8818 "MachineIndependent/glslang_tab.cpp" +#line 8873 "MachineIndependent/glslang_tab.cpp" break; - case 343: /* type_specifier_nonarray: ACCSTRUCTNV */ -#line 2515 "MachineIndependent/glslang.y" + case 346: /* type_specifier_nonarray: ACCSTRUCTNV */ +#line 2489 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtAccStruct; } -#line 8827 "MachineIndependent/glslang_tab.cpp" +#line 8882 "MachineIndependent/glslang_tab.cpp" break; - case 344: /* type_specifier_nonarray: ACCSTRUCTEXT */ -#line 2519 "MachineIndependent/glslang.y" + case 347: /* type_specifier_nonarray: ACCSTRUCTEXT */ +#line 2493 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtAccStruct; } -#line 8836 "MachineIndependent/glslang_tab.cpp" +#line 8891 "MachineIndependent/glslang_tab.cpp" break; - case 345: /* type_specifier_nonarray: RAYQUERYEXT */ -#line 2523 "MachineIndependent/glslang.y" + case 348: /* type_specifier_nonarray: RAYQUERYEXT */ +#line 2497 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtRayQuery; } -#line 8845 "MachineIndependent/glslang_tab.cpp" +#line 8900 "MachineIndependent/glslang_tab.cpp" break; - case 346: /* type_specifier_nonarray: ATOMIC_UINT */ -#line 2527 "MachineIndependent/glslang.y" + case 349: /* type_specifier_nonarray: ATOMIC_UINT */ +#line 2501 "MachineIndependent/glslang.y" { parseContext.vulkanRemoved((yyvsp[0].lex).loc, "atomic counter types"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtAtomicUint; } -#line 8855 "MachineIndependent/glslang_tab.cpp" +#line 8910 "MachineIndependent/glslang_tab.cpp" break; - case 347: /* type_specifier_nonarray: SAMPLER1D */ -#line 2532 "MachineIndependent/glslang.y" + case 350: /* type_specifier_nonarray: SAMPLER1D */ +#line 2506 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd1D); } -#line 8865 "MachineIndependent/glslang_tab.cpp" +#line 8920 "MachineIndependent/glslang_tab.cpp" break; - case 348: /* type_specifier_nonarray: SAMPLER2D */ -#line 2538 "MachineIndependent/glslang.y" + case 351: /* type_specifier_nonarray: SAMPLER2D */ +#line 2511 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd2D); } -#line 8875 "MachineIndependent/glslang_tab.cpp" +#line 8930 "MachineIndependent/glslang_tab.cpp" break; - case 349: /* type_specifier_nonarray: SAMPLER3D */ -#line 2543 "MachineIndependent/glslang.y" + case 352: /* type_specifier_nonarray: SAMPLER3D */ +#line 2516 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd3D); } -#line 8885 "MachineIndependent/glslang_tab.cpp" +#line 8940 "MachineIndependent/glslang_tab.cpp" break; - case 350: /* type_specifier_nonarray: SAMPLERCUBE */ -#line 2548 "MachineIndependent/glslang.y" + case 353: /* type_specifier_nonarray: SAMPLERCUBE */ +#line 2521 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, EsdCube); } -#line 8895 "MachineIndependent/glslang_tab.cpp" +#line 8950 "MachineIndependent/glslang_tab.cpp" break; - case 351: /* type_specifier_nonarray: SAMPLER2DSHADOW */ -#line 2553 "MachineIndependent/glslang.y" + case 354: /* type_specifier_nonarray: SAMPLER2DSHADOW */ +#line 2526 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, true); } -#line 8905 "MachineIndependent/glslang_tab.cpp" +#line 8960 "MachineIndependent/glslang_tab.cpp" break; - case 352: /* type_specifier_nonarray: SAMPLERCUBESHADOW */ -#line 2558 "MachineIndependent/glslang.y" + case 355: /* type_specifier_nonarray: SAMPLERCUBESHADOW */ +#line 2531 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, EsdCube, false, true); } -#line 8915 "MachineIndependent/glslang_tab.cpp" +#line 8970 "MachineIndependent/glslang_tab.cpp" break; - case 353: /* type_specifier_nonarray: SAMPLER2DARRAY */ -#line 2563 "MachineIndependent/glslang.y" + case 356: /* type_specifier_nonarray: SAMPLER2DARRAY */ +#line 2536 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true); } -#line 8925 "MachineIndependent/glslang_tab.cpp" +#line 8980 "MachineIndependent/glslang_tab.cpp" break; - case 354: /* type_specifier_nonarray: SAMPLER2DARRAYSHADOW */ -#line 2568 "MachineIndependent/glslang.y" + case 357: /* type_specifier_nonarray: SAMPLER2DARRAYSHADOW */ +#line 2541 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, true); } -#line 8935 "MachineIndependent/glslang_tab.cpp" +#line 8990 "MachineIndependent/glslang_tab.cpp" break; - case 355: /* type_specifier_nonarray: SAMPLER1DSHADOW */ -#line 2574 "MachineIndependent/glslang.y" + case 358: /* type_specifier_nonarray: SAMPLER1DSHADOW */ +#line 2546 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd1D, false, true); } -#line 8945 "MachineIndependent/glslang_tab.cpp" +#line 9000 "MachineIndependent/glslang_tab.cpp" break; - case 356: /* type_specifier_nonarray: SAMPLER1DARRAY */ -#line 2579 "MachineIndependent/glslang.y" + case 359: /* type_specifier_nonarray: SAMPLER1DARRAY */ +#line 2551 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true); } -#line 8955 "MachineIndependent/glslang_tab.cpp" +#line 9010 "MachineIndependent/glslang_tab.cpp" break; - case 357: /* type_specifier_nonarray: SAMPLER1DARRAYSHADOW */ -#line 2584 "MachineIndependent/glslang.y" + case 360: /* type_specifier_nonarray: SAMPLER1DARRAYSHADOW */ +#line 2556 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true, true); } -#line 8965 "MachineIndependent/glslang_tab.cpp" +#line 9020 "MachineIndependent/glslang_tab.cpp" break; - case 358: /* type_specifier_nonarray: SAMPLERCUBEARRAY */ -#line 2589 "MachineIndependent/glslang.y" + case 361: /* type_specifier_nonarray: SAMPLERCUBEARRAY */ +#line 2561 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true); } -#line 8975 "MachineIndependent/glslang_tab.cpp" +#line 9030 "MachineIndependent/glslang_tab.cpp" break; - case 359: /* type_specifier_nonarray: SAMPLERCUBEARRAYSHADOW */ -#line 2594 "MachineIndependent/glslang.y" + case 362: /* type_specifier_nonarray: SAMPLERCUBEARRAYSHADOW */ +#line 2566 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true, true); } -#line 8985 "MachineIndependent/glslang_tab.cpp" +#line 9040 "MachineIndependent/glslang_tab.cpp" break; - case 360: /* type_specifier_nonarray: F16SAMPLER1D */ -#line 2599 "MachineIndependent/glslang.y" + case 363: /* type_specifier_nonarray: F16SAMPLER1D */ +#line 2571 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd1D); } -#line 8996 "MachineIndependent/glslang_tab.cpp" +#line 9051 "MachineIndependent/glslang_tab.cpp" break; - case 361: /* type_specifier_nonarray: F16SAMPLER2D */ -#line 2605 "MachineIndependent/glslang.y" + case 364: /* type_specifier_nonarray: F16SAMPLER2D */ +#line 2577 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd2D); } -#line 9007 "MachineIndependent/glslang_tab.cpp" +#line 9062 "MachineIndependent/glslang_tab.cpp" break; - case 362: /* type_specifier_nonarray: F16SAMPLER3D */ -#line 2611 "MachineIndependent/glslang.y" + case 365: /* type_specifier_nonarray: F16SAMPLER3D */ +#line 2583 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd3D); } -#line 9018 "MachineIndependent/glslang_tab.cpp" +#line 9073 "MachineIndependent/glslang_tab.cpp" break; - case 363: /* type_specifier_nonarray: F16SAMPLERCUBE */ -#line 2617 "MachineIndependent/glslang.y" + case 366: /* type_specifier_nonarray: F16SAMPLERCUBE */ +#line 2589 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, EsdCube); } -#line 9029 "MachineIndependent/glslang_tab.cpp" +#line 9084 "MachineIndependent/glslang_tab.cpp" break; - case 364: /* type_specifier_nonarray: F16SAMPLER1DSHADOW */ -#line 2623 "MachineIndependent/glslang.y" + case 367: /* type_specifier_nonarray: F16SAMPLER1DSHADOW */ +#line 2595 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, false, true); } -#line 9040 "MachineIndependent/glslang_tab.cpp" +#line 9095 "MachineIndependent/glslang_tab.cpp" break; - case 365: /* type_specifier_nonarray: F16SAMPLER2DSHADOW */ -#line 2629 "MachineIndependent/glslang.y" + case 368: /* type_specifier_nonarray: F16SAMPLER2DSHADOW */ +#line 2601 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, false, true); } -#line 9051 "MachineIndependent/glslang_tab.cpp" +#line 9106 "MachineIndependent/glslang_tab.cpp" break; - case 366: /* type_specifier_nonarray: F16SAMPLERCUBESHADOW */ -#line 2635 "MachineIndependent/glslang.y" + case 369: /* type_specifier_nonarray: F16SAMPLERCUBESHADOW */ +#line 2607 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, false, true); } -#line 9062 "MachineIndependent/glslang_tab.cpp" +#line 9117 "MachineIndependent/glslang_tab.cpp" break; - case 367: /* type_specifier_nonarray: F16SAMPLER1DARRAY */ -#line 2641 "MachineIndependent/glslang.y" + case 370: /* type_specifier_nonarray: F16SAMPLER1DARRAY */ +#line 2613 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, true); } -#line 9073 "MachineIndependent/glslang_tab.cpp" +#line 9128 "MachineIndependent/glslang_tab.cpp" break; - case 368: /* type_specifier_nonarray: F16SAMPLER2DARRAY */ -#line 2647 "MachineIndependent/glslang.y" + case 371: /* type_specifier_nonarray: F16SAMPLER2DARRAY */ +#line 2619 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true); } -#line 9084 "MachineIndependent/glslang_tab.cpp" +#line 9139 "MachineIndependent/glslang_tab.cpp" break; - case 369: /* type_specifier_nonarray: F16SAMPLER1DARRAYSHADOW */ -#line 2653 "MachineIndependent/glslang.y" + case 372: /* type_specifier_nonarray: F16SAMPLER1DARRAYSHADOW */ +#line 2625 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, true, true); } -#line 9095 "MachineIndependent/glslang_tab.cpp" +#line 9150 "MachineIndependent/glslang_tab.cpp" break; - case 370: /* type_specifier_nonarray: F16SAMPLER2DARRAYSHADOW */ -#line 2659 "MachineIndependent/glslang.y" + case 373: /* type_specifier_nonarray: F16SAMPLER2DARRAYSHADOW */ +#line 2631 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true, true); } -#line 9106 "MachineIndependent/glslang_tab.cpp" +#line 9161 "MachineIndependent/glslang_tab.cpp" break; - case 371: /* type_specifier_nonarray: F16SAMPLERCUBEARRAY */ -#line 2665 "MachineIndependent/glslang.y" + case 374: /* type_specifier_nonarray: F16SAMPLERCUBEARRAY */ +#line 2637 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, true); } -#line 9117 "MachineIndependent/glslang_tab.cpp" +#line 9172 "MachineIndependent/glslang_tab.cpp" break; - case 372: /* type_specifier_nonarray: F16SAMPLERCUBEARRAYSHADOW */ -#line 2671 "MachineIndependent/glslang.y" + case 375: /* type_specifier_nonarray: F16SAMPLERCUBEARRAYSHADOW */ +#line 2643 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, true, true); } -#line 9128 "MachineIndependent/glslang_tab.cpp" +#line 9183 "MachineIndependent/glslang_tab.cpp" break; - case 373: /* type_specifier_nonarray: ISAMPLER1D */ -#line 2677 "MachineIndependent/glslang.y" + case 376: /* type_specifier_nonarray: ISAMPLER1D */ +#line 2649 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, Esd1D); } -#line 9138 "MachineIndependent/glslang_tab.cpp" +#line 9193 "MachineIndependent/glslang_tab.cpp" break; - case 374: /* type_specifier_nonarray: ISAMPLER2D */ -#line 2683 "MachineIndependent/glslang.y" + case 377: /* type_specifier_nonarray: ISAMPLER2D */ +#line 2654 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, Esd2D); } -#line 9148 "MachineIndependent/glslang_tab.cpp" +#line 9203 "MachineIndependent/glslang_tab.cpp" break; - case 375: /* type_specifier_nonarray: ISAMPLER3D */ -#line 2688 "MachineIndependent/glslang.y" + case 378: /* type_specifier_nonarray: ISAMPLER3D */ +#line 2659 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, Esd3D); } -#line 9158 "MachineIndependent/glslang_tab.cpp" +#line 9213 "MachineIndependent/glslang_tab.cpp" break; - case 376: /* type_specifier_nonarray: ISAMPLERCUBE */ -#line 2693 "MachineIndependent/glslang.y" + case 379: /* type_specifier_nonarray: ISAMPLERCUBE */ +#line 2664 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, EsdCube); } -#line 9168 "MachineIndependent/glslang_tab.cpp" +#line 9223 "MachineIndependent/glslang_tab.cpp" break; - case 377: /* type_specifier_nonarray: ISAMPLER2DARRAY */ -#line 2698 "MachineIndependent/glslang.y" + case 380: /* type_specifier_nonarray: ISAMPLER2DARRAY */ +#line 2669 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, Esd2D, true); } -#line 9178 "MachineIndependent/glslang_tab.cpp" +#line 9233 "MachineIndependent/glslang_tab.cpp" break; - case 378: /* type_specifier_nonarray: USAMPLER2D */ -#line 2703 "MachineIndependent/glslang.y" + case 381: /* type_specifier_nonarray: USAMPLER2D */ +#line 2674 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, Esd2D); } -#line 9188 "MachineIndependent/glslang_tab.cpp" +#line 9243 "MachineIndependent/glslang_tab.cpp" break; - case 379: /* type_specifier_nonarray: USAMPLER3D */ -#line 2708 "MachineIndependent/glslang.y" + case 382: /* type_specifier_nonarray: USAMPLER3D */ +#line 2679 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, Esd3D); } -#line 9198 "MachineIndependent/glslang_tab.cpp" +#line 9253 "MachineIndependent/glslang_tab.cpp" break; - case 380: /* type_specifier_nonarray: USAMPLERCUBE */ -#line 2713 "MachineIndependent/glslang.y" + case 383: /* type_specifier_nonarray: USAMPLERCUBE */ +#line 2684 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, EsdCube); } -#line 9208 "MachineIndependent/glslang_tab.cpp" +#line 9263 "MachineIndependent/glslang_tab.cpp" break; - case 381: /* type_specifier_nonarray: ISAMPLER1DARRAY */ -#line 2719 "MachineIndependent/glslang.y" + case 384: /* type_specifier_nonarray: ISAMPLER1DARRAY */ +#line 2689 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, Esd1D, true); } -#line 9218 "MachineIndependent/glslang_tab.cpp" +#line 9273 "MachineIndependent/glslang_tab.cpp" break; - case 382: /* type_specifier_nonarray: ISAMPLERCUBEARRAY */ -#line 2724 "MachineIndependent/glslang.y" + case 385: /* type_specifier_nonarray: ISAMPLERCUBEARRAY */ +#line 2694 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, EsdCube, true); } -#line 9228 "MachineIndependent/glslang_tab.cpp" +#line 9283 "MachineIndependent/glslang_tab.cpp" break; - case 383: /* type_specifier_nonarray: USAMPLER1D */ -#line 2729 "MachineIndependent/glslang.y" + case 386: /* type_specifier_nonarray: USAMPLER1D */ +#line 2699 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, Esd1D); } -#line 9238 "MachineIndependent/glslang_tab.cpp" +#line 9293 "MachineIndependent/glslang_tab.cpp" break; - case 384: /* type_specifier_nonarray: USAMPLER1DARRAY */ -#line 2734 "MachineIndependent/glslang.y" + case 387: /* type_specifier_nonarray: USAMPLER1DARRAY */ +#line 2704 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, Esd1D, true); } -#line 9248 "MachineIndependent/glslang_tab.cpp" +#line 9303 "MachineIndependent/glslang_tab.cpp" break; - case 385: /* type_specifier_nonarray: USAMPLERCUBEARRAY */ -#line 2739 "MachineIndependent/glslang.y" + case 388: /* type_specifier_nonarray: USAMPLERCUBEARRAY */ +#line 2709 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, EsdCube, true); } -#line 9258 "MachineIndependent/glslang_tab.cpp" +#line 9313 "MachineIndependent/glslang_tab.cpp" break; - case 386: /* type_specifier_nonarray: TEXTURECUBEARRAY */ -#line 2744 "MachineIndependent/glslang.y" + case 389: /* type_specifier_nonarray: TEXTURECUBEARRAY */ +#line 2714 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube, true); } -#line 9268 "MachineIndependent/glslang_tab.cpp" +#line 9323 "MachineIndependent/glslang_tab.cpp" break; - case 387: /* type_specifier_nonarray: ITEXTURECUBEARRAY */ -#line 2749 "MachineIndependent/glslang.y" + case 390: /* type_specifier_nonarray: ITEXTURECUBEARRAY */ +#line 2719 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, EsdCube, true); } -#line 9278 "MachineIndependent/glslang_tab.cpp" +#line 9333 "MachineIndependent/glslang_tab.cpp" break; - case 388: /* type_specifier_nonarray: UTEXTURECUBEARRAY */ -#line 2754 "MachineIndependent/glslang.y" + case 391: /* type_specifier_nonarray: UTEXTURECUBEARRAY */ +#line 2724 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, EsdCube, true); } -#line 9288 "MachineIndependent/glslang_tab.cpp" +#line 9343 "MachineIndependent/glslang_tab.cpp" break; - case 389: /* type_specifier_nonarray: USAMPLER2DARRAY */ -#line 2760 "MachineIndependent/glslang.y" + case 392: /* type_specifier_nonarray: USAMPLER2DARRAY */ +#line 2729 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, Esd2D, true); } -#line 9298 "MachineIndependent/glslang_tab.cpp" +#line 9353 "MachineIndependent/glslang_tab.cpp" break; - case 390: /* type_specifier_nonarray: TEXTURE2D */ -#line 2765 "MachineIndependent/glslang.y" + case 393: /* type_specifier_nonarray: TEXTURE2D */ +#line 2734 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D); } -#line 9308 "MachineIndependent/glslang_tab.cpp" +#line 9363 "MachineIndependent/glslang_tab.cpp" break; - case 391: /* type_specifier_nonarray: TEXTURE3D */ -#line 2770 "MachineIndependent/glslang.y" + case 394: /* type_specifier_nonarray: TEXTURE3D */ +#line 2739 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, Esd3D); } -#line 9318 "MachineIndependent/glslang_tab.cpp" +#line 9373 "MachineIndependent/glslang_tab.cpp" break; - case 392: /* type_specifier_nonarray: TEXTURE2DARRAY */ -#line 2775 "MachineIndependent/glslang.y" + case 395: /* type_specifier_nonarray: TEXTURE2DARRAY */ +#line 2744 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true); } -#line 9328 "MachineIndependent/glslang_tab.cpp" +#line 9383 "MachineIndependent/glslang_tab.cpp" break; - case 393: /* type_specifier_nonarray: TEXTURECUBE */ -#line 2780 "MachineIndependent/glslang.y" + case 396: /* type_specifier_nonarray: TEXTURECUBE */ +#line 2749 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube); } -#line 9338 "MachineIndependent/glslang_tab.cpp" +#line 9393 "MachineIndependent/glslang_tab.cpp" break; - case 394: /* type_specifier_nonarray: ITEXTURE2D */ -#line 2785 "MachineIndependent/glslang.y" + case 397: /* type_specifier_nonarray: ITEXTURE2D */ +#line 2754 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D); } -#line 9348 "MachineIndependent/glslang_tab.cpp" +#line 9403 "MachineIndependent/glslang_tab.cpp" break; - case 395: /* type_specifier_nonarray: ITEXTURE3D */ -#line 2790 "MachineIndependent/glslang.y" + case 398: /* type_specifier_nonarray: ITEXTURE3D */ +#line 2759 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd3D); } -#line 9358 "MachineIndependent/glslang_tab.cpp" +#line 9413 "MachineIndependent/glslang_tab.cpp" break; - case 396: /* type_specifier_nonarray: ITEXTURECUBE */ -#line 2795 "MachineIndependent/glslang.y" + case 399: /* type_specifier_nonarray: ITEXTURECUBE */ +#line 2764 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, EsdCube); } -#line 9368 "MachineIndependent/glslang_tab.cpp" +#line 9423 "MachineIndependent/glslang_tab.cpp" break; - case 397: /* type_specifier_nonarray: ITEXTURE2DARRAY */ -#line 2800 "MachineIndependent/glslang.y" + case 400: /* type_specifier_nonarray: ITEXTURE2DARRAY */ +#line 2769 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, true); } -#line 9378 "MachineIndependent/glslang_tab.cpp" +#line 9433 "MachineIndependent/glslang_tab.cpp" break; - case 398: /* type_specifier_nonarray: UTEXTURE2D */ -#line 2805 "MachineIndependent/glslang.y" + case 401: /* type_specifier_nonarray: UTEXTURE2D */ +#line 2774 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D); } -#line 9388 "MachineIndependent/glslang_tab.cpp" +#line 9443 "MachineIndependent/glslang_tab.cpp" break; - case 399: /* type_specifier_nonarray: UTEXTURE3D */ -#line 2810 "MachineIndependent/glslang.y" + case 402: /* type_specifier_nonarray: UTEXTURE3D */ +#line 2779 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd3D); } -#line 9398 "MachineIndependent/glslang_tab.cpp" +#line 9453 "MachineIndependent/glslang_tab.cpp" break; - case 400: /* type_specifier_nonarray: UTEXTURECUBE */ -#line 2815 "MachineIndependent/glslang.y" + case 403: /* type_specifier_nonarray: UTEXTURECUBE */ +#line 2784 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, EsdCube); } -#line 9408 "MachineIndependent/glslang_tab.cpp" +#line 9463 "MachineIndependent/glslang_tab.cpp" break; - case 401: /* type_specifier_nonarray: UTEXTURE2DARRAY */ -#line 2820 "MachineIndependent/glslang.y" + case 404: /* type_specifier_nonarray: UTEXTURE2DARRAY */ +#line 2789 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, true); } -#line 9418 "MachineIndependent/glslang_tab.cpp" +#line 9473 "MachineIndependent/glslang_tab.cpp" break; - case 402: /* type_specifier_nonarray: SAMPLER */ -#line 2825 "MachineIndependent/glslang.y" + case 405: /* type_specifier_nonarray: SAMPLER */ +#line 2794 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setPureSampler(false); } -#line 9428 "MachineIndependent/glslang_tab.cpp" +#line 9483 "MachineIndependent/glslang_tab.cpp" break; - case 403: /* type_specifier_nonarray: SAMPLERSHADOW */ -#line 2830 "MachineIndependent/glslang.y" + case 406: /* type_specifier_nonarray: SAMPLERSHADOW */ +#line 2799 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setPureSampler(true); } -#line 9438 "MachineIndependent/glslang_tab.cpp" +#line 9493 "MachineIndependent/glslang_tab.cpp" break; - case 404: /* type_specifier_nonarray: SAMPLER2DRECT */ -#line 2836 "MachineIndependent/glslang.y" + case 407: /* type_specifier_nonarray: SAMPLER2DRECT */ +#line 2804 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, EsdRect); } -#line 9448 "MachineIndependent/glslang_tab.cpp" +#line 9503 "MachineIndependent/glslang_tab.cpp" break; - case 405: /* type_specifier_nonarray: SAMPLER2DRECTSHADOW */ -#line 2841 "MachineIndependent/glslang.y" + case 408: /* type_specifier_nonarray: SAMPLER2DRECTSHADOW */ +#line 2809 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, EsdRect, false, true); } -#line 9458 "MachineIndependent/glslang_tab.cpp" +#line 9513 "MachineIndependent/glslang_tab.cpp" break; - case 406: /* type_specifier_nonarray: F16SAMPLER2DRECT */ -#line 2846 "MachineIndependent/glslang.y" + case 409: /* type_specifier_nonarray: F16SAMPLER2DRECT */ +#line 2814 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, EsdRect); } -#line 9469 "MachineIndependent/glslang_tab.cpp" +#line 9524 "MachineIndependent/glslang_tab.cpp" break; - case 407: /* type_specifier_nonarray: F16SAMPLER2DRECTSHADOW */ -#line 2852 "MachineIndependent/glslang.y" + case 410: /* type_specifier_nonarray: F16SAMPLER2DRECTSHADOW */ +#line 2820 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, EsdRect, false, true); } -#line 9480 "MachineIndependent/glslang_tab.cpp" +#line 9535 "MachineIndependent/glslang_tab.cpp" break; - case 408: /* type_specifier_nonarray: ISAMPLER2DRECT */ -#line 2858 "MachineIndependent/glslang.y" + case 411: /* type_specifier_nonarray: ISAMPLER2DRECT */ +#line 2826 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, EsdRect); } -#line 9490 "MachineIndependent/glslang_tab.cpp" +#line 9545 "MachineIndependent/glslang_tab.cpp" break; - case 409: /* type_specifier_nonarray: USAMPLER2DRECT */ -#line 2863 "MachineIndependent/glslang.y" + case 412: /* type_specifier_nonarray: USAMPLER2DRECT */ +#line 2831 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, EsdRect); } -#line 9500 "MachineIndependent/glslang_tab.cpp" +#line 9555 "MachineIndependent/glslang_tab.cpp" break; - case 410: /* type_specifier_nonarray: SAMPLERBUFFER */ -#line 2868 "MachineIndependent/glslang.y" + case 413: /* type_specifier_nonarray: SAMPLERBUFFER */ +#line 2836 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, EsdBuffer); } -#line 9510 "MachineIndependent/glslang_tab.cpp" +#line 9565 "MachineIndependent/glslang_tab.cpp" break; - case 411: /* type_specifier_nonarray: F16SAMPLERBUFFER */ -#line 2873 "MachineIndependent/glslang.y" + case 414: /* type_specifier_nonarray: F16SAMPLERBUFFER */ +#line 2841 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, EsdBuffer); } -#line 9521 "MachineIndependent/glslang_tab.cpp" +#line 9576 "MachineIndependent/glslang_tab.cpp" break; - case 412: /* type_specifier_nonarray: ISAMPLERBUFFER */ -#line 2879 "MachineIndependent/glslang.y" + case 415: /* type_specifier_nonarray: ISAMPLERBUFFER */ +#line 2847 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, EsdBuffer); } -#line 9531 "MachineIndependent/glslang_tab.cpp" +#line 9586 "MachineIndependent/glslang_tab.cpp" break; - case 413: /* type_specifier_nonarray: USAMPLERBUFFER */ -#line 2884 "MachineIndependent/glslang.y" + case 416: /* type_specifier_nonarray: USAMPLERBUFFER */ +#line 2852 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, EsdBuffer); } -#line 9541 "MachineIndependent/glslang_tab.cpp" +#line 9596 "MachineIndependent/glslang_tab.cpp" break; - case 414: /* type_specifier_nonarray: SAMPLER2DMS */ -#line 2889 "MachineIndependent/glslang.y" + case 417: /* type_specifier_nonarray: SAMPLER2DMS */ +#line 2857 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, false, true); } -#line 9551 "MachineIndependent/glslang_tab.cpp" +#line 9606 "MachineIndependent/glslang_tab.cpp" break; - case 415: /* type_specifier_nonarray: F16SAMPLER2DMS */ -#line 2894 "MachineIndependent/glslang.y" + case 418: /* type_specifier_nonarray: F16SAMPLER2DMS */ +#line 2862 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, false, false, true); } -#line 9562 "MachineIndependent/glslang_tab.cpp" +#line 9617 "MachineIndependent/glslang_tab.cpp" break; - case 416: /* type_specifier_nonarray: ISAMPLER2DMS */ -#line 2900 "MachineIndependent/glslang.y" + case 419: /* type_specifier_nonarray: ISAMPLER2DMS */ +#line 2868 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, Esd2D, false, false, true); } -#line 9572 "MachineIndependent/glslang_tab.cpp" +#line 9627 "MachineIndependent/glslang_tab.cpp" break; - case 417: /* type_specifier_nonarray: USAMPLER2DMS */ -#line 2905 "MachineIndependent/glslang.y" + case 420: /* type_specifier_nonarray: USAMPLER2DMS */ +#line 2873 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, Esd2D, false, false, true); } -#line 9582 "MachineIndependent/glslang_tab.cpp" +#line 9637 "MachineIndependent/glslang_tab.cpp" break; - case 418: /* type_specifier_nonarray: SAMPLER2DMSARRAY */ -#line 2910 "MachineIndependent/glslang.y" + case 421: /* type_specifier_nonarray: SAMPLER2DMSARRAY */ +#line 2878 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, false, true); } -#line 9592 "MachineIndependent/glslang_tab.cpp" +#line 9647 "MachineIndependent/glslang_tab.cpp" break; - case 419: /* type_specifier_nonarray: F16SAMPLER2DMSARRAY */ -#line 2915 "MachineIndependent/glslang.y" + case 422: /* type_specifier_nonarray: F16SAMPLER2DMSARRAY */ +#line 2883 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true, false, true); } -#line 9603 "MachineIndependent/glslang_tab.cpp" +#line 9658 "MachineIndependent/glslang_tab.cpp" break; - case 420: /* type_specifier_nonarray: ISAMPLER2DMSARRAY */ -#line 2921 "MachineIndependent/glslang.y" + case 423: /* type_specifier_nonarray: ISAMPLER2DMSARRAY */ +#line 2889 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtInt, Esd2D, true, false, true); } -#line 9613 "MachineIndependent/glslang_tab.cpp" +#line 9668 "MachineIndependent/glslang_tab.cpp" break; - case 421: /* type_specifier_nonarray: USAMPLER2DMSARRAY */ -#line 2926 "MachineIndependent/glslang.y" + case 424: /* type_specifier_nonarray: USAMPLER2DMSARRAY */ +#line 2894 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtUint, Esd2D, true, false, true); } -#line 9623 "MachineIndependent/glslang_tab.cpp" +#line 9678 "MachineIndependent/glslang_tab.cpp" break; - case 422: /* type_specifier_nonarray: TEXTURE1D */ -#line 2931 "MachineIndependent/glslang.y" + case 425: /* type_specifier_nonarray: TEXTURE1D */ +#line 2899 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D); } -#line 9633 "MachineIndependent/glslang_tab.cpp" +#line 9688 "MachineIndependent/glslang_tab.cpp" break; - case 423: /* type_specifier_nonarray: F16TEXTURE1D */ -#line 2936 "MachineIndependent/glslang.y" + case 426: /* type_specifier_nonarray: F16TEXTURE1D */ +#line 2904 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd1D); } -#line 9644 "MachineIndependent/glslang_tab.cpp" +#line 9699 "MachineIndependent/glslang_tab.cpp" break; - case 424: /* type_specifier_nonarray: F16TEXTURE2D */ -#line 2942 "MachineIndependent/glslang.y" + case 427: /* type_specifier_nonarray: F16TEXTURE2D */ +#line 2910 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D); } -#line 9655 "MachineIndependent/glslang_tab.cpp" +#line 9710 "MachineIndependent/glslang_tab.cpp" break; - case 425: /* type_specifier_nonarray: F16TEXTURE3D */ -#line 2948 "MachineIndependent/glslang.y" + case 428: /* type_specifier_nonarray: F16TEXTURE3D */ +#line 2916 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd3D); } -#line 9666 "MachineIndependent/glslang_tab.cpp" +#line 9721 "MachineIndependent/glslang_tab.cpp" break; - case 426: /* type_specifier_nonarray: F16TEXTURECUBE */ -#line 2954 "MachineIndependent/glslang.y" + case 429: /* type_specifier_nonarray: F16TEXTURECUBE */ +#line 2922 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdCube); } -#line 9677 "MachineIndependent/glslang_tab.cpp" +#line 9732 "MachineIndependent/glslang_tab.cpp" break; - case 427: /* type_specifier_nonarray: TEXTURE1DARRAY */ -#line 2960 "MachineIndependent/glslang.y" + case 430: /* type_specifier_nonarray: TEXTURE1DARRAY */ +#line 2928 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D, true); } -#line 9687 "MachineIndependent/glslang_tab.cpp" +#line 9742 "MachineIndependent/glslang_tab.cpp" break; - case 428: /* type_specifier_nonarray: F16TEXTURE1DARRAY */ -#line 2965 "MachineIndependent/glslang.y" + case 431: /* type_specifier_nonarray: F16TEXTURE1DARRAY */ +#line 2933 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd1D, true); } -#line 9698 "MachineIndependent/glslang_tab.cpp" +#line 9753 "MachineIndependent/glslang_tab.cpp" break; - case 429: /* type_specifier_nonarray: F16TEXTURE2DARRAY */ -#line 2971 "MachineIndependent/glslang.y" + case 432: /* type_specifier_nonarray: F16TEXTURE2DARRAY */ +#line 2939 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, true); } -#line 9709 "MachineIndependent/glslang_tab.cpp" +#line 9764 "MachineIndependent/glslang_tab.cpp" break; - case 430: /* type_specifier_nonarray: F16TEXTURECUBEARRAY */ -#line 2977 "MachineIndependent/glslang.y" + case 433: /* type_specifier_nonarray: F16TEXTURECUBEARRAY */ +#line 2945 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdCube, true); } -#line 9720 "MachineIndependent/glslang_tab.cpp" +#line 9775 "MachineIndependent/glslang_tab.cpp" break; - case 431: /* type_specifier_nonarray: ITEXTURE1D */ -#line 2983 "MachineIndependent/glslang.y" + case 434: /* type_specifier_nonarray: ITEXTURE1D */ +#line 2951 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd1D); } -#line 9730 "MachineIndependent/glslang_tab.cpp" +#line 9785 "MachineIndependent/glslang_tab.cpp" break; - case 432: /* type_specifier_nonarray: ITEXTURE1DARRAY */ -#line 2988 "MachineIndependent/glslang.y" + case 435: /* type_specifier_nonarray: ITEXTURE1DARRAY */ +#line 2956 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd1D, true); } -#line 9740 "MachineIndependent/glslang_tab.cpp" +#line 9795 "MachineIndependent/glslang_tab.cpp" break; - case 433: /* type_specifier_nonarray: UTEXTURE1D */ -#line 2993 "MachineIndependent/glslang.y" + case 436: /* type_specifier_nonarray: UTEXTURE1D */ +#line 2961 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd1D); } -#line 9750 "MachineIndependent/glslang_tab.cpp" +#line 9805 "MachineIndependent/glslang_tab.cpp" break; - case 434: /* type_specifier_nonarray: UTEXTURE1DARRAY */ -#line 2998 "MachineIndependent/glslang.y" + case 437: /* type_specifier_nonarray: UTEXTURE1DARRAY */ +#line 2966 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd1D, true); } -#line 9760 "MachineIndependent/glslang_tab.cpp" +#line 9815 "MachineIndependent/glslang_tab.cpp" break; - case 435: /* type_specifier_nonarray: TEXTURE2DRECT */ -#line 3003 "MachineIndependent/glslang.y" + case 438: /* type_specifier_nonarray: TEXTURE2DRECT */ +#line 2971 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, EsdRect); } -#line 9770 "MachineIndependent/glslang_tab.cpp" +#line 9825 "MachineIndependent/glslang_tab.cpp" break; - case 436: /* type_specifier_nonarray: F16TEXTURE2DRECT */ -#line 3008 "MachineIndependent/glslang.y" + case 439: /* type_specifier_nonarray: F16TEXTURE2DRECT */ +#line 2976 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdRect); } -#line 9781 "MachineIndependent/glslang_tab.cpp" +#line 9836 "MachineIndependent/glslang_tab.cpp" break; - case 437: /* type_specifier_nonarray: ITEXTURE2DRECT */ -#line 3014 "MachineIndependent/glslang.y" + case 440: /* type_specifier_nonarray: ITEXTURE2DRECT */ +#line 2982 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, EsdRect); } -#line 9791 "MachineIndependent/glslang_tab.cpp" +#line 9846 "MachineIndependent/glslang_tab.cpp" break; - case 438: /* type_specifier_nonarray: UTEXTURE2DRECT */ -#line 3019 "MachineIndependent/glslang.y" + case 441: /* type_specifier_nonarray: UTEXTURE2DRECT */ +#line 2987 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, EsdRect); } -#line 9801 "MachineIndependent/glslang_tab.cpp" +#line 9856 "MachineIndependent/glslang_tab.cpp" break; - case 439: /* type_specifier_nonarray: TEXTUREBUFFER */ -#line 3024 "MachineIndependent/glslang.y" + case 442: /* type_specifier_nonarray: TEXTUREBUFFER */ +#line 2992 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, EsdBuffer); } -#line 9811 "MachineIndependent/glslang_tab.cpp" +#line 9866 "MachineIndependent/glslang_tab.cpp" break; - case 440: /* type_specifier_nonarray: F16TEXTUREBUFFER */ -#line 3029 "MachineIndependent/glslang.y" + case 443: /* type_specifier_nonarray: F16TEXTUREBUFFER */ +#line 2997 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdBuffer); } -#line 9822 "MachineIndependent/glslang_tab.cpp" +#line 9877 "MachineIndependent/glslang_tab.cpp" break; - case 441: /* type_specifier_nonarray: ITEXTUREBUFFER */ -#line 3035 "MachineIndependent/glslang.y" + case 444: /* type_specifier_nonarray: ITEXTUREBUFFER */ +#line 3003 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, EsdBuffer); } -#line 9832 "MachineIndependent/glslang_tab.cpp" +#line 9887 "MachineIndependent/glslang_tab.cpp" break; - case 442: /* type_specifier_nonarray: UTEXTUREBUFFER */ -#line 3040 "MachineIndependent/glslang.y" + case 445: /* type_specifier_nonarray: UTEXTUREBUFFER */ +#line 3008 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, EsdBuffer); } -#line 9842 "MachineIndependent/glslang_tab.cpp" +#line 9897 "MachineIndependent/glslang_tab.cpp" break; - case 443: /* type_specifier_nonarray: TEXTURE2DMS */ -#line 3045 "MachineIndependent/glslang.y" + case 446: /* type_specifier_nonarray: TEXTURE2DMS */ +#line 3013 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, false, false, true); } -#line 9852 "MachineIndependent/glslang_tab.cpp" +#line 9907 "MachineIndependent/glslang_tab.cpp" break; - case 444: /* type_specifier_nonarray: F16TEXTURE2DMS */ -#line 3050 "MachineIndependent/glslang.y" + case 447: /* type_specifier_nonarray: F16TEXTURE2DMS */ +#line 3018 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, false, false, true); } -#line 9863 "MachineIndependent/glslang_tab.cpp" +#line 9918 "MachineIndependent/glslang_tab.cpp" break; - case 445: /* type_specifier_nonarray: ITEXTURE2DMS */ -#line 3056 "MachineIndependent/glslang.y" + case 448: /* type_specifier_nonarray: ITEXTURE2DMS */ +#line 3024 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, false, false, true); } -#line 9873 "MachineIndependent/glslang_tab.cpp" +#line 9928 "MachineIndependent/glslang_tab.cpp" break; - case 446: /* type_specifier_nonarray: UTEXTURE2DMS */ -#line 3061 "MachineIndependent/glslang.y" + case 449: /* type_specifier_nonarray: UTEXTURE2DMS */ +#line 3029 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, false, false, true); } -#line 9883 "MachineIndependent/glslang_tab.cpp" +#line 9938 "MachineIndependent/glslang_tab.cpp" break; - case 447: /* type_specifier_nonarray: TEXTURE2DMSARRAY */ -#line 3066 "MachineIndependent/glslang.y" + case 450: /* type_specifier_nonarray: TEXTURE2DMSARRAY */ +#line 3034 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true, false, true); } -#line 9893 "MachineIndependent/glslang_tab.cpp" +#line 9948 "MachineIndependent/glslang_tab.cpp" break; - case 448: /* type_specifier_nonarray: F16TEXTURE2DMSARRAY */ -#line 3071 "MachineIndependent/glslang.y" + case 451: /* type_specifier_nonarray: F16TEXTURE2DMSARRAY */ +#line 3039 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, true, false, true); } -#line 9904 "MachineIndependent/glslang_tab.cpp" +#line 9959 "MachineIndependent/glslang_tab.cpp" break; - case 449: /* type_specifier_nonarray: ITEXTURE2DMSARRAY */ -#line 3077 "MachineIndependent/glslang.y" + case 452: /* type_specifier_nonarray: ITEXTURE2DMSARRAY */ +#line 3045 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, true, false, true); } -#line 9914 "MachineIndependent/glslang_tab.cpp" +#line 9969 "MachineIndependent/glslang_tab.cpp" break; - case 450: /* type_specifier_nonarray: UTEXTURE2DMSARRAY */ -#line 3082 "MachineIndependent/glslang.y" + case 453: /* type_specifier_nonarray: UTEXTURE2DMSARRAY */ +#line 3050 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, true, false, true); } -#line 9924 "MachineIndependent/glslang_tab.cpp" +#line 9979 "MachineIndependent/glslang_tab.cpp" break; - case 451: /* type_specifier_nonarray: IMAGE1D */ -#line 3087 "MachineIndependent/glslang.y" + case 454: /* type_specifier_nonarray: IMAGE1D */ +#line 3055 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd1D); } -#line 9934 "MachineIndependent/glslang_tab.cpp" +#line 9989 "MachineIndependent/glslang_tab.cpp" break; - case 452: /* type_specifier_nonarray: F16IMAGE1D */ -#line 3092 "MachineIndependent/glslang.y" + case 455: /* type_specifier_nonarray: F16IMAGE1D */ +#line 3060 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, Esd1D); } -#line 9945 "MachineIndependent/glslang_tab.cpp" +#line 10000 "MachineIndependent/glslang_tab.cpp" break; - case 453: /* type_specifier_nonarray: IIMAGE1D */ -#line 3098 "MachineIndependent/glslang.y" + case 456: /* type_specifier_nonarray: IIMAGE1D */ +#line 3066 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd1D); } -#line 9955 "MachineIndependent/glslang_tab.cpp" +#line 10010 "MachineIndependent/glslang_tab.cpp" break; - case 454: /* type_specifier_nonarray: UIMAGE1D */ -#line 3103 "MachineIndependent/glslang.y" + case 457: /* type_specifier_nonarray: UIMAGE1D */ +#line 3071 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd1D); } -#line 9965 "MachineIndependent/glslang_tab.cpp" +#line 10020 "MachineIndependent/glslang_tab.cpp" break; - case 455: /* type_specifier_nonarray: IMAGE2D */ -#line 3108 "MachineIndependent/glslang.y" + case 458: /* type_specifier_nonarray: IMAGE2D */ +#line 3076 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D); } -#line 9975 "MachineIndependent/glslang_tab.cpp" +#line 10030 "MachineIndependent/glslang_tab.cpp" break; - case 456: /* type_specifier_nonarray: F16IMAGE2D */ -#line 3113 "MachineIndependent/glslang.y" + case 459: /* type_specifier_nonarray: F16IMAGE2D */ +#line 3081 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D); } -#line 9986 "MachineIndependent/glslang_tab.cpp" +#line 10041 "MachineIndependent/glslang_tab.cpp" break; - case 457: /* type_specifier_nonarray: IIMAGE2D */ -#line 3119 "MachineIndependent/glslang.y" + case 460: /* type_specifier_nonarray: IIMAGE2D */ +#line 3087 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd2D); } -#line 9996 "MachineIndependent/glslang_tab.cpp" +#line 10051 "MachineIndependent/glslang_tab.cpp" break; - case 458: /* type_specifier_nonarray: UIMAGE2D */ -#line 3124 "MachineIndependent/glslang.y" + case 461: /* type_specifier_nonarray: UIMAGE2D */ +#line 3092 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd2D); } -#line 10006 "MachineIndependent/glslang_tab.cpp" +#line 10061 "MachineIndependent/glslang_tab.cpp" break; - case 459: /* type_specifier_nonarray: IMAGE3D */ -#line 3129 "MachineIndependent/glslang.y" + case 462: /* type_specifier_nonarray: IMAGE3D */ +#line 3097 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd3D); } -#line 10016 "MachineIndependent/glslang_tab.cpp" +#line 10071 "MachineIndependent/glslang_tab.cpp" break; - case 460: /* type_specifier_nonarray: F16IMAGE3D */ -#line 3134 "MachineIndependent/glslang.y" + case 463: /* type_specifier_nonarray: F16IMAGE3D */ +#line 3102 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, Esd3D); } -#line 10027 "MachineIndependent/glslang_tab.cpp" +#line 10082 "MachineIndependent/glslang_tab.cpp" break; - case 461: /* type_specifier_nonarray: IIMAGE3D */ -#line 3140 "MachineIndependent/glslang.y" + case 464: /* type_specifier_nonarray: IIMAGE3D */ +#line 3108 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd3D); } -#line 10037 "MachineIndependent/glslang_tab.cpp" +#line 10092 "MachineIndependent/glslang_tab.cpp" break; - case 462: /* type_specifier_nonarray: UIMAGE3D */ -#line 3145 "MachineIndependent/glslang.y" + case 465: /* type_specifier_nonarray: UIMAGE3D */ +#line 3113 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd3D); } -#line 10047 "MachineIndependent/glslang_tab.cpp" +#line 10102 "MachineIndependent/glslang_tab.cpp" break; - case 463: /* type_specifier_nonarray: IMAGE2DRECT */ -#line 3150 "MachineIndependent/glslang.y" + case 466: /* type_specifier_nonarray: IMAGE2DRECT */ +#line 3118 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, EsdRect); } -#line 10057 "MachineIndependent/glslang_tab.cpp" +#line 10112 "MachineIndependent/glslang_tab.cpp" break; - case 464: /* type_specifier_nonarray: F16IMAGE2DRECT */ -#line 3155 "MachineIndependent/glslang.y" + case 467: /* type_specifier_nonarray: F16IMAGE2DRECT */ +#line 3123 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, EsdRect); } -#line 10068 "MachineIndependent/glslang_tab.cpp" +#line 10123 "MachineIndependent/glslang_tab.cpp" break; - case 465: /* type_specifier_nonarray: IIMAGE2DRECT */ -#line 3161 "MachineIndependent/glslang.y" + case 468: /* type_specifier_nonarray: IIMAGE2DRECT */ +#line 3129 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, EsdRect); } -#line 10078 "MachineIndependent/glslang_tab.cpp" +#line 10133 "MachineIndependent/glslang_tab.cpp" break; - case 466: /* type_specifier_nonarray: UIMAGE2DRECT */ -#line 3166 "MachineIndependent/glslang.y" + case 469: /* type_specifier_nonarray: UIMAGE2DRECT */ +#line 3134 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, EsdRect); } -#line 10088 "MachineIndependent/glslang_tab.cpp" +#line 10143 "MachineIndependent/glslang_tab.cpp" break; - case 467: /* type_specifier_nonarray: IMAGECUBE */ -#line 3171 "MachineIndependent/glslang.y" + case 470: /* type_specifier_nonarray: IMAGECUBE */ +#line 3139 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, EsdCube); } -#line 10098 "MachineIndependent/glslang_tab.cpp" +#line 10153 "MachineIndependent/glslang_tab.cpp" break; - case 468: /* type_specifier_nonarray: F16IMAGECUBE */ -#line 3176 "MachineIndependent/glslang.y" + case 471: /* type_specifier_nonarray: F16IMAGECUBE */ +#line 3144 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, EsdCube); } -#line 10109 "MachineIndependent/glslang_tab.cpp" +#line 10164 "MachineIndependent/glslang_tab.cpp" break; - case 469: /* type_specifier_nonarray: IIMAGECUBE */ -#line 3182 "MachineIndependent/glslang.y" + case 472: /* type_specifier_nonarray: IIMAGECUBE */ +#line 3150 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, EsdCube); } -#line 10119 "MachineIndependent/glslang_tab.cpp" +#line 10174 "MachineIndependent/glslang_tab.cpp" break; - case 470: /* type_specifier_nonarray: UIMAGECUBE */ -#line 3187 "MachineIndependent/glslang.y" + case 473: /* type_specifier_nonarray: UIMAGECUBE */ +#line 3155 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, EsdCube); } -#line 10129 "MachineIndependent/glslang_tab.cpp" +#line 10184 "MachineIndependent/glslang_tab.cpp" break; - case 471: /* type_specifier_nonarray: IMAGEBUFFER */ -#line 3192 "MachineIndependent/glslang.y" + case 474: /* type_specifier_nonarray: IMAGEBUFFER */ +#line 3160 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, EsdBuffer); } -#line 10139 "MachineIndependent/glslang_tab.cpp" +#line 10194 "MachineIndependent/glslang_tab.cpp" break; - case 472: /* type_specifier_nonarray: F16IMAGEBUFFER */ -#line 3197 "MachineIndependent/glslang.y" + case 475: /* type_specifier_nonarray: F16IMAGEBUFFER */ +#line 3165 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, EsdBuffer); } -#line 10150 "MachineIndependent/glslang_tab.cpp" +#line 10205 "MachineIndependent/glslang_tab.cpp" break; - case 473: /* type_specifier_nonarray: IIMAGEBUFFER */ -#line 3203 "MachineIndependent/glslang.y" + case 476: /* type_specifier_nonarray: IIMAGEBUFFER */ +#line 3171 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, EsdBuffer); } -#line 10160 "MachineIndependent/glslang_tab.cpp" +#line 10215 "MachineIndependent/glslang_tab.cpp" break; - case 474: /* type_specifier_nonarray: UIMAGEBUFFER */ -#line 3208 "MachineIndependent/glslang.y" + case 477: /* type_specifier_nonarray: UIMAGEBUFFER */ +#line 3176 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, EsdBuffer); } -#line 10170 "MachineIndependent/glslang_tab.cpp" +#line 10225 "MachineIndependent/glslang_tab.cpp" break; - case 475: /* type_specifier_nonarray: IMAGE1DARRAY */ -#line 3213 "MachineIndependent/glslang.y" + case 478: /* type_specifier_nonarray: IMAGE1DARRAY */ +#line 3181 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd1D, true); } -#line 10180 "MachineIndependent/glslang_tab.cpp" +#line 10235 "MachineIndependent/glslang_tab.cpp" break; - case 476: /* type_specifier_nonarray: F16IMAGE1DARRAY */ -#line 3218 "MachineIndependent/glslang.y" + case 479: /* type_specifier_nonarray: F16IMAGE1DARRAY */ +#line 3186 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, Esd1D, true); } -#line 10191 "MachineIndependent/glslang_tab.cpp" +#line 10246 "MachineIndependent/glslang_tab.cpp" break; - case 477: /* type_specifier_nonarray: IIMAGE1DARRAY */ -#line 3224 "MachineIndependent/glslang.y" + case 480: /* type_specifier_nonarray: IIMAGE1DARRAY */ +#line 3192 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd1D, true); } -#line 10201 "MachineIndependent/glslang_tab.cpp" +#line 10256 "MachineIndependent/glslang_tab.cpp" break; - case 478: /* type_specifier_nonarray: UIMAGE1DARRAY */ -#line 3229 "MachineIndependent/glslang.y" + case 481: /* type_specifier_nonarray: UIMAGE1DARRAY */ +#line 3197 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd1D, true); } -#line 10211 "MachineIndependent/glslang_tab.cpp" +#line 10266 "MachineIndependent/glslang_tab.cpp" break; - case 479: /* type_specifier_nonarray: IMAGE2DARRAY */ -#line 3234 "MachineIndependent/glslang.y" + case 482: /* type_specifier_nonarray: IMAGE2DARRAY */ +#line 3202 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, true); } -#line 10221 "MachineIndependent/glslang_tab.cpp" +#line 10276 "MachineIndependent/glslang_tab.cpp" break; - case 480: /* type_specifier_nonarray: F16IMAGE2DARRAY */ -#line 3239 "MachineIndependent/glslang.y" + case 483: /* type_specifier_nonarray: F16IMAGE2DARRAY */ +#line 3207 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, true); } -#line 10232 "MachineIndependent/glslang_tab.cpp" +#line 10287 "MachineIndependent/glslang_tab.cpp" break; - case 481: /* type_specifier_nonarray: IIMAGE2DARRAY */ -#line 3245 "MachineIndependent/glslang.y" + case 484: /* type_specifier_nonarray: IIMAGE2DARRAY */ +#line 3213 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, true); } -#line 10242 "MachineIndependent/glslang_tab.cpp" +#line 10297 "MachineIndependent/glslang_tab.cpp" break; - case 482: /* type_specifier_nonarray: UIMAGE2DARRAY */ -#line 3250 "MachineIndependent/glslang.y" + case 485: /* type_specifier_nonarray: UIMAGE2DARRAY */ +#line 3218 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, true); } -#line 10252 "MachineIndependent/glslang_tab.cpp" +#line 10307 "MachineIndependent/glslang_tab.cpp" break; - case 483: /* type_specifier_nonarray: IMAGECUBEARRAY */ -#line 3255 "MachineIndependent/glslang.y" + case 486: /* type_specifier_nonarray: IMAGECUBEARRAY */ +#line 3223 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, EsdCube, true); } -#line 10262 "MachineIndependent/glslang_tab.cpp" +#line 10317 "MachineIndependent/glslang_tab.cpp" break; - case 484: /* type_specifier_nonarray: F16IMAGECUBEARRAY */ -#line 3260 "MachineIndependent/glslang.y" + case 487: /* type_specifier_nonarray: F16IMAGECUBEARRAY */ +#line 3228 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, EsdCube, true); } -#line 10273 "MachineIndependent/glslang_tab.cpp" +#line 10328 "MachineIndependent/glslang_tab.cpp" break; - case 485: /* type_specifier_nonarray: IIMAGECUBEARRAY */ -#line 3266 "MachineIndependent/glslang.y" + case 488: /* type_specifier_nonarray: IIMAGECUBEARRAY */ +#line 3234 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, EsdCube, true); } -#line 10283 "MachineIndependent/glslang_tab.cpp" +#line 10338 "MachineIndependent/glslang_tab.cpp" break; - case 486: /* type_specifier_nonarray: UIMAGECUBEARRAY */ -#line 3271 "MachineIndependent/glslang.y" + case 489: /* type_specifier_nonarray: UIMAGECUBEARRAY */ +#line 3239 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, EsdCube, true); } -#line 10293 "MachineIndependent/glslang_tab.cpp" +#line 10348 "MachineIndependent/glslang_tab.cpp" break; - case 487: /* type_specifier_nonarray: IMAGE2DMS */ -#line 3276 "MachineIndependent/glslang.y" + case 490: /* type_specifier_nonarray: IMAGE2DMS */ +#line 3244 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, false, false, true); } -#line 10303 "MachineIndependent/glslang_tab.cpp" +#line 10358 "MachineIndependent/glslang_tab.cpp" break; - case 488: /* type_specifier_nonarray: F16IMAGE2DMS */ -#line 3281 "MachineIndependent/glslang.y" + case 491: /* type_specifier_nonarray: F16IMAGE2DMS */ +#line 3249 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, false, false, true); } -#line 10314 "MachineIndependent/glslang_tab.cpp" +#line 10369 "MachineIndependent/glslang_tab.cpp" break; - case 489: /* type_specifier_nonarray: IIMAGE2DMS */ -#line 3287 "MachineIndependent/glslang.y" + case 492: /* type_specifier_nonarray: IIMAGE2DMS */ +#line 3255 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, false, false, true); } -#line 10324 "MachineIndependent/glslang_tab.cpp" +#line 10379 "MachineIndependent/glslang_tab.cpp" break; - case 490: /* type_specifier_nonarray: UIMAGE2DMS */ -#line 3292 "MachineIndependent/glslang.y" + case 493: /* type_specifier_nonarray: UIMAGE2DMS */ +#line 3260 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, false, false, true); } -#line 10334 "MachineIndependent/glslang_tab.cpp" +#line 10389 "MachineIndependent/glslang_tab.cpp" break; - case 491: /* type_specifier_nonarray: IMAGE2DMSARRAY */ -#line 3297 "MachineIndependent/glslang.y" + case 494: /* type_specifier_nonarray: IMAGE2DMSARRAY */ +#line 3265 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, true, false, true); } -#line 10344 "MachineIndependent/glslang_tab.cpp" +#line 10399 "MachineIndependent/glslang_tab.cpp" break; - case 492: /* type_specifier_nonarray: F16IMAGE2DMSARRAY */ -#line 3302 "MachineIndependent/glslang.y" + case 495: /* type_specifier_nonarray: F16IMAGE2DMSARRAY */ +#line 3270 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, true, false, true); } -#line 10355 "MachineIndependent/glslang_tab.cpp" +#line 10410 "MachineIndependent/glslang_tab.cpp" break; - case 493: /* type_specifier_nonarray: IIMAGE2DMSARRAY */ -#line 3308 "MachineIndependent/glslang.y" + case 496: /* type_specifier_nonarray: IIMAGE2DMSARRAY */ +#line 3276 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, true, false, true); } -#line 10365 "MachineIndependent/glslang_tab.cpp" +#line 10420 "MachineIndependent/glslang_tab.cpp" break; - case 494: /* type_specifier_nonarray: UIMAGE2DMSARRAY */ -#line 3313 "MachineIndependent/glslang.y" + case 497: /* type_specifier_nonarray: UIMAGE2DMSARRAY */ +#line 3281 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, true, false, true); } -#line 10375 "MachineIndependent/glslang_tab.cpp" +#line 10430 "MachineIndependent/glslang_tab.cpp" break; - case 495: /* type_specifier_nonarray: I64IMAGE1D */ -#line 3318 "MachineIndependent/glslang.y" + case 498: /* type_specifier_nonarray: I64IMAGE1D */ +#line 3286 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, Esd1D); } -#line 10385 "MachineIndependent/glslang_tab.cpp" +#line 10440 "MachineIndependent/glslang_tab.cpp" break; - case 496: /* type_specifier_nonarray: U64IMAGE1D */ -#line 3323 "MachineIndependent/glslang.y" + case 499: /* type_specifier_nonarray: U64IMAGE1D */ +#line 3291 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, Esd1D); } -#line 10395 "MachineIndependent/glslang_tab.cpp" +#line 10450 "MachineIndependent/glslang_tab.cpp" break; - case 497: /* type_specifier_nonarray: I64IMAGE2D */ -#line 3328 "MachineIndependent/glslang.y" + case 500: /* type_specifier_nonarray: I64IMAGE2D */ +#line 3296 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D); } -#line 10405 "MachineIndependent/glslang_tab.cpp" +#line 10460 "MachineIndependent/glslang_tab.cpp" break; - case 498: /* type_specifier_nonarray: U64IMAGE2D */ -#line 3333 "MachineIndependent/glslang.y" + case 501: /* type_specifier_nonarray: U64IMAGE2D */ +#line 3301 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D); } -#line 10415 "MachineIndependent/glslang_tab.cpp" +#line 10470 "MachineIndependent/glslang_tab.cpp" break; - case 499: /* type_specifier_nonarray: I64IMAGE3D */ -#line 3338 "MachineIndependent/glslang.y" + case 502: /* type_specifier_nonarray: I64IMAGE3D */ +#line 3306 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, Esd3D); } -#line 10425 "MachineIndependent/glslang_tab.cpp" +#line 10480 "MachineIndependent/glslang_tab.cpp" break; - case 500: /* type_specifier_nonarray: U64IMAGE3D */ -#line 3343 "MachineIndependent/glslang.y" + case 503: /* type_specifier_nonarray: U64IMAGE3D */ +#line 3311 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, Esd3D); } -#line 10435 "MachineIndependent/glslang_tab.cpp" +#line 10490 "MachineIndependent/glslang_tab.cpp" break; - case 501: /* type_specifier_nonarray: I64IMAGE2DRECT */ -#line 3348 "MachineIndependent/glslang.y" + case 504: /* type_specifier_nonarray: I64IMAGE2DRECT */ +#line 3316 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, EsdRect); } -#line 10445 "MachineIndependent/glslang_tab.cpp" +#line 10500 "MachineIndependent/glslang_tab.cpp" break; - case 502: /* type_specifier_nonarray: U64IMAGE2DRECT */ -#line 3353 "MachineIndependent/glslang.y" + case 505: /* type_specifier_nonarray: U64IMAGE2DRECT */ +#line 3321 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, EsdRect); } -#line 10455 "MachineIndependent/glslang_tab.cpp" +#line 10510 "MachineIndependent/glslang_tab.cpp" break; - case 503: /* type_specifier_nonarray: I64IMAGECUBE */ -#line 3358 "MachineIndependent/glslang.y" + case 506: /* type_specifier_nonarray: I64IMAGECUBE */ +#line 3326 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, EsdCube); } -#line 10465 "MachineIndependent/glslang_tab.cpp" +#line 10520 "MachineIndependent/glslang_tab.cpp" break; - case 504: /* type_specifier_nonarray: U64IMAGECUBE */ -#line 3363 "MachineIndependent/glslang.y" + case 507: /* type_specifier_nonarray: U64IMAGECUBE */ +#line 3331 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, EsdCube); } -#line 10475 "MachineIndependent/glslang_tab.cpp" +#line 10530 "MachineIndependent/glslang_tab.cpp" break; - case 505: /* type_specifier_nonarray: I64IMAGEBUFFER */ -#line 3368 "MachineIndependent/glslang.y" + case 508: /* type_specifier_nonarray: I64IMAGEBUFFER */ +#line 3336 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, EsdBuffer); } -#line 10485 "MachineIndependent/glslang_tab.cpp" +#line 10540 "MachineIndependent/glslang_tab.cpp" break; - case 506: /* type_specifier_nonarray: U64IMAGEBUFFER */ -#line 3373 "MachineIndependent/glslang.y" + case 509: /* type_specifier_nonarray: U64IMAGEBUFFER */ +#line 3341 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, EsdBuffer); } -#line 10495 "MachineIndependent/glslang_tab.cpp" +#line 10550 "MachineIndependent/glslang_tab.cpp" break; - case 507: /* type_specifier_nonarray: I64IMAGE1DARRAY */ -#line 3378 "MachineIndependent/glslang.y" + case 510: /* type_specifier_nonarray: I64IMAGE1DARRAY */ +#line 3346 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, Esd1D, true); } -#line 10505 "MachineIndependent/glslang_tab.cpp" +#line 10560 "MachineIndependent/glslang_tab.cpp" break; - case 508: /* type_specifier_nonarray: U64IMAGE1DARRAY */ -#line 3383 "MachineIndependent/glslang.y" + case 511: /* type_specifier_nonarray: U64IMAGE1DARRAY */ +#line 3351 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, Esd1D, true); } -#line 10515 "MachineIndependent/glslang_tab.cpp" +#line 10570 "MachineIndependent/glslang_tab.cpp" break; - case 509: /* type_specifier_nonarray: I64IMAGE2DARRAY */ -#line 3388 "MachineIndependent/glslang.y" + case 512: /* type_specifier_nonarray: I64IMAGE2DARRAY */ +#line 3356 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D, true); } -#line 10525 "MachineIndependent/glslang_tab.cpp" +#line 10580 "MachineIndependent/glslang_tab.cpp" break; - case 510: /* type_specifier_nonarray: U64IMAGE2DARRAY */ -#line 3393 "MachineIndependent/glslang.y" + case 513: /* type_specifier_nonarray: U64IMAGE2DARRAY */ +#line 3361 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D, true); } -#line 10535 "MachineIndependent/glslang_tab.cpp" +#line 10590 "MachineIndependent/glslang_tab.cpp" break; - case 511: /* type_specifier_nonarray: I64IMAGECUBEARRAY */ -#line 3398 "MachineIndependent/glslang.y" + case 514: /* type_specifier_nonarray: I64IMAGECUBEARRAY */ +#line 3366 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, EsdCube, true); } -#line 10545 "MachineIndependent/glslang_tab.cpp" +#line 10600 "MachineIndependent/glslang_tab.cpp" break; - case 512: /* type_specifier_nonarray: U64IMAGECUBEARRAY */ -#line 3403 "MachineIndependent/glslang.y" + case 515: /* type_specifier_nonarray: U64IMAGECUBEARRAY */ +#line 3371 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, EsdCube, true); } -#line 10555 "MachineIndependent/glslang_tab.cpp" +#line 10610 "MachineIndependent/glslang_tab.cpp" break; - case 513: /* type_specifier_nonarray: I64IMAGE2DMS */ -#line 3408 "MachineIndependent/glslang.y" + case 516: /* type_specifier_nonarray: I64IMAGE2DMS */ +#line 3376 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D, false, false, true); } -#line 10565 "MachineIndependent/glslang_tab.cpp" +#line 10620 "MachineIndependent/glslang_tab.cpp" break; - case 514: /* type_specifier_nonarray: U64IMAGE2DMS */ -#line 3413 "MachineIndependent/glslang.y" + case 517: /* type_specifier_nonarray: U64IMAGE2DMS */ +#line 3381 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D, false, false, true); } -#line 10575 "MachineIndependent/glslang_tab.cpp" +#line 10630 "MachineIndependent/glslang_tab.cpp" break; - case 515: /* type_specifier_nonarray: I64IMAGE2DMSARRAY */ -#line 3418 "MachineIndependent/glslang.y" + case 518: /* type_specifier_nonarray: I64IMAGE2DMSARRAY */ +#line 3386 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtInt64, Esd2D, true, false, true); } -#line 10585 "MachineIndependent/glslang_tab.cpp" +#line 10640 "MachineIndependent/glslang_tab.cpp" break; - case 516: /* type_specifier_nonarray: U64IMAGE2DMSARRAY */ -#line 3423 "MachineIndependent/glslang.y" + case 519: /* type_specifier_nonarray: U64IMAGE2DMSARRAY */ +#line 3391 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setImage(EbtUint64, Esd2D, true, false, true); } -#line 10595 "MachineIndependent/glslang_tab.cpp" +#line 10650 "MachineIndependent/glslang_tab.cpp" break; - case 517: /* type_specifier_nonarray: SAMPLEREXTERNALOES */ -#line 3428 "MachineIndependent/glslang.y" + case 520: /* type_specifier_nonarray: SAMPLEREXTERNALOES */ +#line 3396 "MachineIndependent/glslang.y" { // GL_OES_EGL_image_external (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd2D); (yyval.interm.type).sampler.external = true; } -#line 10606 "MachineIndependent/glslang_tab.cpp" +#line 10661 "MachineIndependent/glslang_tab.cpp" break; - case 518: /* type_specifier_nonarray: SAMPLEREXTERNAL2DY2YEXT */ -#line 3434 "MachineIndependent/glslang.y" + case 521: /* type_specifier_nonarray: SAMPLEREXTERNAL2DY2YEXT */ +#line 3402 "MachineIndependent/glslang.y" { // GL_EXT_YUV_target (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.set(EbtFloat, Esd2D); (yyval.interm.type).sampler.yuv = true; } -#line 10617 "MachineIndependent/glslang_tab.cpp" +#line 10672 "MachineIndependent/glslang_tab.cpp" + break; + + case 522: /* type_specifier_nonarray: ATTACHMENTEXT */ +#line 3408 "MachineIndependent/glslang.y" + { + parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "attachmentEXT input"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setAttachmentEXT(EbtFloat); + } +#line 10683 "MachineIndependent/glslang_tab.cpp" + break; + + case 523: /* type_specifier_nonarray: IATTACHMENTEXT */ +#line 3414 "MachineIndependent/glslang.y" + { + parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "attachmentEXT input"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setAttachmentEXT(EbtInt); + } +#line 10694 "MachineIndependent/glslang_tab.cpp" + break; + + case 524: /* type_specifier_nonarray: UATTACHMENTEXT */ +#line 3420 "MachineIndependent/glslang.y" + { + parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "attachmentEXT input"); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtSampler; + (yyval.interm.type).sampler.setAttachmentEXT(EbtUint); + } +#line 10705 "MachineIndependent/glslang_tab.cpp" break; - case 519: /* type_specifier_nonarray: SUBPASSINPUT */ -#line 3440 "MachineIndependent/glslang.y" + case 525: /* type_specifier_nonarray: SUBPASSINPUT */ +#line 3426 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtFloat); } -#line 10628 "MachineIndependent/glslang_tab.cpp" +#line 10716 "MachineIndependent/glslang_tab.cpp" break; - case 520: /* type_specifier_nonarray: SUBPASSINPUTMS */ -#line 3446 "MachineIndependent/glslang.y" + case 526: /* type_specifier_nonarray: SUBPASSINPUTMS */ +#line 3432 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtFloat, true); } -#line 10639 "MachineIndependent/glslang_tab.cpp" +#line 10727 "MachineIndependent/glslang_tab.cpp" break; - case 521: /* type_specifier_nonarray: F16SUBPASSINPUT */ -#line 3452 "MachineIndependent/glslang.y" + case 527: /* type_specifier_nonarray: F16SUBPASSINPUT */ +#line 3438 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel()); parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); @@ -10647,11 +10735,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtFloat16); } -#line 10651 "MachineIndependent/glslang_tab.cpp" +#line 10739 "MachineIndependent/glslang_tab.cpp" break; - case 522: /* type_specifier_nonarray: F16SUBPASSINPUTMS */ -#line 3459 "MachineIndependent/glslang.y" + case 528: /* type_specifier_nonarray: F16SUBPASSINPUTMS */ +#line 3445 "MachineIndependent/glslang.y" { parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel()); parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); @@ -10659,107 +10747,131 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtFloat16, true); } -#line 10663 "MachineIndependent/glslang_tab.cpp" +#line 10751 "MachineIndependent/glslang_tab.cpp" break; - case 523: /* type_specifier_nonarray: ISUBPASSINPUT */ -#line 3466 "MachineIndependent/glslang.y" + case 529: /* type_specifier_nonarray: ISUBPASSINPUT */ +#line 3452 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtInt); } -#line 10674 "MachineIndependent/glslang_tab.cpp" +#line 10762 "MachineIndependent/glslang_tab.cpp" break; - case 524: /* type_specifier_nonarray: ISUBPASSINPUTMS */ -#line 3472 "MachineIndependent/glslang.y" + case 530: /* type_specifier_nonarray: ISUBPASSINPUTMS */ +#line 3458 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtInt, true); } -#line 10685 "MachineIndependent/glslang_tab.cpp" +#line 10773 "MachineIndependent/glslang_tab.cpp" break; - case 525: /* type_specifier_nonarray: USUBPASSINPUT */ -#line 3478 "MachineIndependent/glslang.y" + case 531: /* type_specifier_nonarray: USUBPASSINPUT */ +#line 3464 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtUint); } -#line 10696 "MachineIndependent/glslang_tab.cpp" +#line 10784 "MachineIndependent/glslang_tab.cpp" break; - case 526: /* type_specifier_nonarray: USUBPASSINPUTMS */ -#line 3484 "MachineIndependent/glslang.y" + case 532: /* type_specifier_nonarray: USUBPASSINPUTMS */ +#line 3470 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtSampler; (yyval.interm.type).sampler.setSubpass(EbtUint, true); } -#line 10707 "MachineIndependent/glslang_tab.cpp" +#line 10795 "MachineIndependent/glslang_tab.cpp" break; - case 527: /* type_specifier_nonarray: FCOOPMATNV */ -#line 3490 "MachineIndependent/glslang.y" + case 533: /* type_specifier_nonarray: FCOOPMATNV */ +#line 3476 "MachineIndependent/glslang.y" { - parseContext.fcoopmatCheck((yyvsp[0].lex).loc, "fcoopmatNV", parseContext.symbolTable.atBuiltInLevel()); + parseContext.fcoopmatCheckNV((yyvsp[0].lex).loc, "fcoopmatNV", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtFloat; - (yyval.interm.type).coopmat = true; + (yyval.interm.type).coopmatNV = true; + (yyval.interm.type).coopmatKHR = false; } -#line 10718 "MachineIndependent/glslang_tab.cpp" +#line 10807 "MachineIndependent/glslang_tab.cpp" break; - case 528: /* type_specifier_nonarray: ICOOPMATNV */ -#line 3496 "MachineIndependent/glslang.y" + case 534: /* type_specifier_nonarray: ICOOPMATNV */ +#line 3483 "MachineIndependent/glslang.y" { - parseContext.intcoopmatCheck((yyvsp[0].lex).loc, "icoopmatNV", parseContext.symbolTable.atBuiltInLevel()); + parseContext.intcoopmatCheckNV((yyvsp[0].lex).loc, "icoopmatNV", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtInt; - (yyval.interm.type).coopmat = true; + (yyval.interm.type).coopmatNV = true; + (yyval.interm.type).coopmatKHR = false; } -#line 10729 "MachineIndependent/glslang_tab.cpp" +#line 10819 "MachineIndependent/glslang_tab.cpp" break; - case 529: /* type_specifier_nonarray: UCOOPMATNV */ -#line 3502 "MachineIndependent/glslang.y" + case 535: /* type_specifier_nonarray: UCOOPMATNV */ +#line 3490 "MachineIndependent/glslang.y" { - parseContext.intcoopmatCheck((yyvsp[0].lex).loc, "ucoopmatNV", parseContext.symbolTable.atBuiltInLevel()); + parseContext.intcoopmatCheckNV((yyvsp[0].lex).loc, "ucoopmatNV", parseContext.symbolTable.atBuiltInLevel()); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).basicType = EbtUint; - (yyval.interm.type).coopmat = true; + (yyval.interm.type).coopmatNV = true; + (yyval.interm.type).coopmatKHR = false; } -#line 10740 "MachineIndependent/glslang_tab.cpp" +#line 10831 "MachineIndependent/glslang_tab.cpp" break; - case 530: /* type_specifier_nonarray: spirv_type_specifier */ -#line 3508 "MachineIndependent/glslang.y" + case 536: /* type_specifier_nonarray: COOPMAT */ +#line 3497 "MachineIndependent/glslang.y" + { + parseContext.coopmatCheck((yyvsp[0].lex).loc, "coopmat", parseContext.symbolTable.atBuiltInLevel()); + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtCoopmat; + (yyval.interm.type).coopmatNV = false; + (yyval.interm.type).coopmatKHR = true; + } +#line 10843 "MachineIndependent/glslang_tab.cpp" + break; + + case 537: /* type_specifier_nonarray: spirv_type_specifier */ +#line 3504 "MachineIndependent/glslang.y" { parseContext.requireExtensions((yyvsp[0].interm.type).loc, 1, &E_GL_EXT_spirv_intrinsics, "SPIR-V type specifier"); (yyval.interm.type) = (yyvsp[0].interm.type); } -#line 10749 "MachineIndependent/glslang_tab.cpp" +#line 10852 "MachineIndependent/glslang_tab.cpp" + break; + + case 538: /* type_specifier_nonarray: HITOBJECTNV */ +#line 3508 "MachineIndependent/glslang.y" + { + (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); + (yyval.interm.type).basicType = EbtHitObjectNV; + } +#line 10861 "MachineIndependent/glslang_tab.cpp" break; - case 531: /* type_specifier_nonarray: struct_specifier */ -#line 3513 "MachineIndependent/glslang.y" + case 539: /* type_specifier_nonarray: struct_specifier */ +#line 3512 "MachineIndependent/glslang.y" { (yyval.interm.type) = (yyvsp[0].interm.type); (yyval.interm.type).qualifier.storage = parseContext.symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary; parseContext.structTypeCheck((yyval.interm.type).loc, (yyval.interm.type)); } -#line 10759 "MachineIndependent/glslang_tab.cpp" +#line 10871 "MachineIndependent/glslang_tab.cpp" break; - case 532: /* type_specifier_nonarray: TYPE_NAME */ -#line 3518 "MachineIndependent/glslang.y" + case 540: /* type_specifier_nonarray: TYPE_NAME */ +#line 3517 "MachineIndependent/glslang.y" { // // This is for user defined type names. The lexical phase looked up the @@ -10773,47 +10885,47 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } else parseContext.error((yyvsp[0].lex).loc, "expected type name", (yyvsp[0].lex).string->c_str(), ""); } -#line 10777 "MachineIndependent/glslang_tab.cpp" +#line 10889 "MachineIndependent/glslang_tab.cpp" break; - case 533: /* precision_qualifier: HIGH_PRECISION */ -#line 3534 "MachineIndependent/glslang.y" + case 541: /* precision_qualifier: HIGH_PRECISION */ +#line 3533 "MachineIndependent/glslang.y" { parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "highp precision qualifier"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqHigh); } -#line 10787 "MachineIndependent/glslang_tab.cpp" +#line 10899 "MachineIndependent/glslang_tab.cpp" break; - case 534: /* precision_qualifier: MEDIUM_PRECISION */ -#line 3539 "MachineIndependent/glslang.y" + case 542: /* precision_qualifier: MEDIUM_PRECISION */ +#line 3538 "MachineIndependent/glslang.y" { parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "mediump precision qualifier"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqMedium); } -#line 10797 "MachineIndependent/glslang_tab.cpp" +#line 10909 "MachineIndependent/glslang_tab.cpp" break; - case 535: /* precision_qualifier: LOW_PRECISION */ -#line 3544 "MachineIndependent/glslang.y" + case 543: /* precision_qualifier: LOW_PRECISION */ +#line 3543 "MachineIndependent/glslang.y" { parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "lowp precision qualifier"); (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel()); parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqLow); } -#line 10807 "MachineIndependent/glslang_tab.cpp" +#line 10919 "MachineIndependent/glslang_tab.cpp" break; - case 536: /* $@3: %empty */ -#line 3552 "MachineIndependent/glslang.y" + case 544: /* $@3: %empty */ +#line 3551 "MachineIndependent/glslang.y" { parseContext.nestedStructCheck((yyvsp[-2].lex).loc); } -#line 10813 "MachineIndependent/glslang_tab.cpp" +#line 10925 "MachineIndependent/glslang_tab.cpp" break; - case 537: /* struct_specifier: STRUCT IDENTIFIER LEFT_BRACE $@3 struct_declaration_list RIGHT_BRACE */ -#line 3552 "MachineIndependent/glslang.y" + case 545: /* struct_specifier: STRUCT IDENTIFIER LEFT_BRACE $@3 struct_declaration_list RIGHT_BRACE */ +#line 3551 "MachineIndependent/glslang.y" { TType* structure = new TType((yyvsp[-1].interm.typeList), *(yyvsp[-4].lex).string); parseContext.structArrayCheck((yyvsp[-4].lex).loc, *structure); @@ -10825,17 +10937,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).userDef = structure; --parseContext.structNestingLevel; } -#line 10829 "MachineIndependent/glslang_tab.cpp" +#line 10941 "MachineIndependent/glslang_tab.cpp" break; - case 538: /* $@4: %empty */ -#line 3563 "MachineIndependent/glslang.y" + case 546: /* $@4: %empty */ +#line 3562 "MachineIndependent/glslang.y" { parseContext.nestedStructCheck((yyvsp[-1].lex).loc); } -#line 10835 "MachineIndependent/glslang_tab.cpp" +#line 10947 "MachineIndependent/glslang_tab.cpp" break; - case 539: /* struct_specifier: STRUCT LEFT_BRACE $@4 struct_declaration_list RIGHT_BRACE */ -#line 3563 "MachineIndependent/glslang.y" + case 547: /* struct_specifier: STRUCT LEFT_BRACE $@4 struct_declaration_list RIGHT_BRACE */ +#line 3562 "MachineIndependent/glslang.y" { TType* structure = new TType((yyvsp[-1].interm.typeList), TString("")); (yyval.interm.type).init((yyvsp[-4].lex).loc); @@ -10843,19 +10955,19 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.type).userDef = structure; --parseContext.structNestingLevel; } -#line 10847 "MachineIndependent/glslang_tab.cpp" +#line 10959 "MachineIndependent/glslang_tab.cpp" break; - case 540: /* struct_declaration_list: struct_declaration */ -#line 3573 "MachineIndependent/glslang.y" + case 548: /* struct_declaration_list: struct_declaration */ +#line 3572 "MachineIndependent/glslang.y" { (yyval.interm.typeList) = (yyvsp[0].interm.typeList); } -#line 10855 "MachineIndependent/glslang_tab.cpp" +#line 10967 "MachineIndependent/glslang_tab.cpp" break; - case 541: /* struct_declaration_list: struct_declaration_list struct_declaration */ -#line 3576 "MachineIndependent/glslang.y" + case 549: /* struct_declaration_list: struct_declaration_list struct_declaration */ +#line 3575 "MachineIndependent/glslang.y" { (yyval.interm.typeList) = (yyvsp[-1].interm.typeList); for (unsigned int i = 0; i < (yyvsp[0].interm.typeList)->size(); ++i) { @@ -10866,11 +10978,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.typeList)->push_back((*(yyvsp[0].interm.typeList))[i]); } } -#line 10870 "MachineIndependent/glslang_tab.cpp" +#line 10982 "MachineIndependent/glslang_tab.cpp" break; - case 542: /* struct_declaration: type_specifier struct_declarator_list SEMICOLON */ -#line 3589 "MachineIndependent/glslang.y" + case 550: /* struct_declaration: type_specifier struct_declarator_list SEMICOLON */ +#line 3588 "MachineIndependent/glslang.y" { if ((yyvsp[-2].interm.type).arraySizes) { parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); @@ -10882,7 +10994,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.typeList) = (yyvsp[-1].interm.typeList); parseContext.voidErrorCheck((yyvsp[-2].interm.type).loc, (*(yyvsp[-1].interm.typeList))[0].type->getFieldName(), (yyvsp[-2].interm.type).basicType); - parseContext.precisionQualifierCheck((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).basicType, (yyvsp[-2].interm.type).qualifier); + parseContext.precisionQualifierCheck((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).basicType, (yyvsp[-2].interm.type).qualifier, (yyvsp[-2].interm.type).isCoopmat()); for (unsigned int i = 0; i < (yyval.interm.typeList)->size(); ++i) { TType type((yyvsp[-2].interm.type)); @@ -10893,11 +11005,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (*(yyval.interm.typeList))[i].type->shallowCopy(type); } } -#line 10897 "MachineIndependent/glslang_tab.cpp" +#line 11009 "MachineIndependent/glslang_tab.cpp" break; - case 543: /* struct_declaration: type_qualifier type_specifier struct_declarator_list SEMICOLON */ -#line 3611 "MachineIndependent/glslang.y" + case 551: /* struct_declaration: type_qualifier type_specifier struct_declarator_list SEMICOLON */ +#line 3610 "MachineIndependent/glslang.y" { if ((yyvsp[-2].interm.type).arraySizes) { parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type"); @@ -10911,7 +11023,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); parseContext.memberQualifierCheck((yyvsp[-3].interm.type)); parseContext.voidErrorCheck((yyvsp[-2].interm.type).loc, (*(yyvsp[-1].interm.typeList))[0].type->getFieldName(), (yyvsp[-2].interm.type).basicType); parseContext.mergeQualifiers((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).qualifier, (yyvsp[-3].interm.type).qualifier, true); - parseContext.precisionQualifierCheck((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).basicType, (yyvsp[-2].interm.type).qualifier); + parseContext.precisionQualifierCheck((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).basicType, (yyvsp[-2].interm.type).qualifier, (yyvsp[-2].interm.type).isCoopmat()); for (unsigned int i = 0; i < (yyval.interm.typeList)->size(); ++i) { TType type((yyvsp[-2].interm.type)); @@ -10922,38 +11034,38 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (*(yyval.interm.typeList))[i].type->shallowCopy(type); } } -#line 10926 "MachineIndependent/glslang_tab.cpp" +#line 11038 "MachineIndependent/glslang_tab.cpp" break; - case 544: /* struct_declarator_list: struct_declarator */ -#line 3638 "MachineIndependent/glslang.y" + case 552: /* struct_declarator_list: struct_declarator */ +#line 3637 "MachineIndependent/glslang.y" { (yyval.interm.typeList) = new TTypeList; (yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine)); } -#line 10935 "MachineIndependent/glslang_tab.cpp" +#line 11047 "MachineIndependent/glslang_tab.cpp" break; - case 545: /* struct_declarator_list: struct_declarator_list COMMA struct_declarator */ -#line 3642 "MachineIndependent/glslang.y" + case 553: /* struct_declarator_list: struct_declarator_list COMMA struct_declarator */ +#line 3641 "MachineIndependent/glslang.y" { (yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine)); } -#line 10943 "MachineIndependent/glslang_tab.cpp" +#line 11055 "MachineIndependent/glslang_tab.cpp" break; - case 546: /* struct_declarator: IDENTIFIER */ -#line 3648 "MachineIndependent/glslang.y" + case 554: /* struct_declarator: IDENTIFIER */ +#line 3647 "MachineIndependent/glslang.y" { (yyval.interm.typeLine).type = new TType(EbtVoid); (yyval.interm.typeLine).loc = (yyvsp[0].lex).loc; (yyval.interm.typeLine).type->setFieldName(*(yyvsp[0].lex).string); } -#line 10953 "MachineIndependent/glslang_tab.cpp" +#line 11065 "MachineIndependent/glslang_tab.cpp" break; - case 547: /* struct_declarator: IDENTIFIER array_specifier */ -#line 3653 "MachineIndependent/glslang.y" + case 555: /* struct_declarator: IDENTIFIER array_specifier */ +#line 3652 "MachineIndependent/glslang.y" { parseContext.arrayOfArrayVersionCheck((yyvsp[-1].lex).loc, (yyvsp[0].interm).arraySizes); @@ -10962,246 +11074,246 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.typeLine).type->setFieldName(*(yyvsp[-1].lex).string); (yyval.interm.typeLine).type->transferArraySizes((yyvsp[0].interm).arraySizes); } -#line 10966 "MachineIndependent/glslang_tab.cpp" +#line 11078 "MachineIndependent/glslang_tab.cpp" break; - case 548: /* initializer: assignment_expression */ -#line 3664 "MachineIndependent/glslang.y" + case 556: /* initializer: assignment_expression */ +#line 3663 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 10974 "MachineIndependent/glslang_tab.cpp" +#line 11086 "MachineIndependent/glslang_tab.cpp" break; - case 549: /* initializer: LEFT_BRACE initializer_list RIGHT_BRACE */ -#line 3668 "MachineIndependent/glslang.y" + case 557: /* initializer: LEFT_BRACE initializer_list RIGHT_BRACE */ +#line 3666 "MachineIndependent/glslang.y" { const char* initFeature = "{ } style initializers"; parseContext.requireProfile((yyvsp[-2].lex).loc, ~EEsProfile, initFeature); parseContext.profileRequires((yyvsp[-2].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature); (yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode); } -#line 10985 "MachineIndependent/glslang_tab.cpp" +#line 11097 "MachineIndependent/glslang_tab.cpp" break; - case 550: /* initializer: LEFT_BRACE initializer_list COMMA RIGHT_BRACE */ -#line 3674 "MachineIndependent/glslang.y" + case 558: /* initializer: LEFT_BRACE initializer_list COMMA RIGHT_BRACE */ +#line 3672 "MachineIndependent/glslang.y" { const char* initFeature = "{ } style initializers"; parseContext.requireProfile((yyvsp[-3].lex).loc, ~EEsProfile, initFeature); parseContext.profileRequires((yyvsp[-3].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature); (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode); } -#line 10996 "MachineIndependent/glslang_tab.cpp" +#line 11108 "MachineIndependent/glslang_tab.cpp" break; - case 551: /* initializer: LEFT_BRACE RIGHT_BRACE */ -#line 3680 "MachineIndependent/glslang.y" + case 559: /* initializer: LEFT_BRACE RIGHT_BRACE */ +#line 3678 "MachineIndependent/glslang.y" { const char* initFeature = "empty { } initializer"; parseContext.profileRequires((yyvsp[-1].lex).loc, EEsProfile, 0, E_GL_EXT_null_initializer, initFeature); parseContext.profileRequires((yyvsp[-1].lex).loc, ~EEsProfile, 0, E_GL_EXT_null_initializer, initFeature); (yyval.interm.intermTypedNode) = parseContext.intermediate.makeAggregate((yyvsp[-1].lex).loc); } -#line 11007 "MachineIndependent/glslang_tab.cpp" +#line 11119 "MachineIndependent/glslang_tab.cpp" break; - case 552: /* initializer_list: initializer */ -#line 3691 "MachineIndependent/glslang.y" + case 560: /* initializer_list: initializer */ +#line 3687 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate(0, (yyvsp[0].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)->getLoc()); } -#line 11015 "MachineIndependent/glslang_tab.cpp" +#line 11127 "MachineIndependent/glslang_tab.cpp" break; - case 553: /* initializer_list: initializer_list COMMA initializer */ -#line 3694 "MachineIndependent/glslang.y" + case 561: /* initializer_list: initializer_list COMMA initializer */ +#line 3690 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)); } -#line 11023 "MachineIndependent/glslang_tab.cpp" +#line 11135 "MachineIndependent/glslang_tab.cpp" break; - case 554: /* declaration_statement: declaration */ -#line 3701 "MachineIndependent/glslang.y" + case 562: /* declaration_statement: declaration */ +#line 3696 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11029 "MachineIndependent/glslang_tab.cpp" +#line 11141 "MachineIndependent/glslang_tab.cpp" break; - case 555: /* statement: compound_statement */ -#line 3705 "MachineIndependent/glslang.y" + case 563: /* statement: compound_statement */ +#line 3700 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11035 "MachineIndependent/glslang_tab.cpp" +#line 11147 "MachineIndependent/glslang_tab.cpp" break; - case 556: /* statement: simple_statement */ -#line 3706 "MachineIndependent/glslang.y" + case 564: /* statement: simple_statement */ +#line 3701 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11041 "MachineIndependent/glslang_tab.cpp" +#line 11153 "MachineIndependent/glslang_tab.cpp" break; - case 557: /* simple_statement: declaration_statement */ -#line 3712 "MachineIndependent/glslang.y" + case 565: /* simple_statement: declaration_statement */ +#line 3707 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11047 "MachineIndependent/glslang_tab.cpp" +#line 11159 "MachineIndependent/glslang_tab.cpp" break; - case 558: /* simple_statement: expression_statement */ -#line 3713 "MachineIndependent/glslang.y" + case 566: /* simple_statement: expression_statement */ +#line 3708 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11053 "MachineIndependent/glslang_tab.cpp" +#line 11165 "MachineIndependent/glslang_tab.cpp" break; - case 559: /* simple_statement: selection_statement */ -#line 3714 "MachineIndependent/glslang.y" + case 567: /* simple_statement: selection_statement */ +#line 3709 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11059 "MachineIndependent/glslang_tab.cpp" +#line 11171 "MachineIndependent/glslang_tab.cpp" break; - case 560: /* simple_statement: switch_statement */ -#line 3715 "MachineIndependent/glslang.y" + case 568: /* simple_statement: switch_statement */ +#line 3710 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11065 "MachineIndependent/glslang_tab.cpp" +#line 11177 "MachineIndependent/glslang_tab.cpp" break; - case 561: /* simple_statement: case_label */ -#line 3716 "MachineIndependent/glslang.y" + case 569: /* simple_statement: case_label */ +#line 3711 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11071 "MachineIndependent/glslang_tab.cpp" +#line 11183 "MachineIndependent/glslang_tab.cpp" break; - case 562: /* simple_statement: iteration_statement */ -#line 3717 "MachineIndependent/glslang.y" + case 570: /* simple_statement: iteration_statement */ +#line 3712 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11077 "MachineIndependent/glslang_tab.cpp" +#line 11189 "MachineIndependent/glslang_tab.cpp" break; - case 563: /* simple_statement: jump_statement */ -#line 3718 "MachineIndependent/glslang.y" + case 571: /* simple_statement: jump_statement */ +#line 3713 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11083 "MachineIndependent/glslang_tab.cpp" +#line 11195 "MachineIndependent/glslang_tab.cpp" break; - case 564: /* simple_statement: demote_statement */ -#line 3720 "MachineIndependent/glslang.y" + case 572: /* simple_statement: demote_statement */ +#line 3714 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11089 "MachineIndependent/glslang_tab.cpp" +#line 11201 "MachineIndependent/glslang_tab.cpp" break; - case 565: /* demote_statement: DEMOTE SEMICOLON */ -#line 3726 "MachineIndependent/glslang.y" + case 573: /* demote_statement: DEMOTE SEMICOLON */ +#line 3718 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, "demote"); parseContext.requireExtensions((yyvsp[-1].lex).loc, 1, &E_GL_EXT_demote_to_helper_invocation, "demote"); (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpDemote, (yyvsp[-1].lex).loc); } -#line 11099 "MachineIndependent/glslang_tab.cpp" +#line 11211 "MachineIndependent/glslang_tab.cpp" break; - case 566: /* compound_statement: LEFT_BRACE RIGHT_BRACE */ -#line 3735 "MachineIndependent/glslang.y" + case 574: /* compound_statement: LEFT_BRACE RIGHT_BRACE */ +#line 3726 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = 0; } -#line 11105 "MachineIndependent/glslang_tab.cpp" +#line 11217 "MachineIndependent/glslang_tab.cpp" break; - case 567: /* $@5: %empty */ -#line 3736 "MachineIndependent/glslang.y" + case 575: /* $@5: %empty */ +#line 3727 "MachineIndependent/glslang.y" { parseContext.symbolTable.push(); ++parseContext.statementNestingLevel; } -#line 11114 "MachineIndependent/glslang_tab.cpp" +#line 11226 "MachineIndependent/glslang_tab.cpp" break; - case 568: /* $@6: %empty */ -#line 3740 "MachineIndependent/glslang.y" + case 576: /* $@6: %empty */ +#line 3731 "MachineIndependent/glslang.y" { parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); --parseContext.statementNestingLevel; } -#line 11123 "MachineIndependent/glslang_tab.cpp" +#line 11235 "MachineIndependent/glslang_tab.cpp" break; - case 569: /* compound_statement: LEFT_BRACE $@5 statement_list $@6 RIGHT_BRACE */ -#line 3744 "MachineIndependent/glslang.y" + case 577: /* compound_statement: LEFT_BRACE $@5 statement_list $@6 RIGHT_BRACE */ +#line 3735 "MachineIndependent/glslang.y" { if ((yyvsp[-2].interm.intermNode) && (yyvsp[-2].interm.intermNode)->getAsAggregate()) (yyvsp[-2].interm.intermNode)->getAsAggregate()->setOperator(parseContext.intermediate.getDebugInfo() ? EOpScope : EOpSequence); (yyval.interm.intermNode) = (yyvsp[-2].interm.intermNode); } -#line 11133 "MachineIndependent/glslang_tab.cpp" +#line 11245 "MachineIndependent/glslang_tab.cpp" break; - case 570: /* statement_no_new_scope: compound_statement_no_new_scope */ -#line 3752 "MachineIndependent/glslang.y" + case 578: /* statement_no_new_scope: compound_statement_no_new_scope */ +#line 3743 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11139 "MachineIndependent/glslang_tab.cpp" +#line 11251 "MachineIndependent/glslang_tab.cpp" break; - case 571: /* statement_no_new_scope: simple_statement */ -#line 3753 "MachineIndependent/glslang.y" + case 579: /* statement_no_new_scope: simple_statement */ +#line 3744 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11145 "MachineIndependent/glslang_tab.cpp" +#line 11257 "MachineIndependent/glslang_tab.cpp" break; - case 572: /* $@7: %empty */ -#line 3757 "MachineIndependent/glslang.y" + case 580: /* $@7: %empty */ +#line 3748 "MachineIndependent/glslang.y" { ++parseContext.controlFlowNestingLevel; } -#line 11153 "MachineIndependent/glslang_tab.cpp" +#line 11265 "MachineIndependent/glslang_tab.cpp" break; - case 573: /* statement_scoped: $@7 compound_statement */ -#line 3760 "MachineIndependent/glslang.y" + case 581: /* statement_scoped: $@7 compound_statement */ +#line 3751 "MachineIndependent/glslang.y" { --parseContext.controlFlowNestingLevel; (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11162 "MachineIndependent/glslang_tab.cpp" +#line 11274 "MachineIndependent/glslang_tab.cpp" break; - case 574: /* $@8: %empty */ -#line 3764 "MachineIndependent/glslang.y" + case 582: /* $@8: %empty */ +#line 3755 "MachineIndependent/glslang.y" { parseContext.symbolTable.push(); ++parseContext.statementNestingLevel; ++parseContext.controlFlowNestingLevel; } -#line 11172 "MachineIndependent/glslang_tab.cpp" +#line 11284 "MachineIndependent/glslang_tab.cpp" break; - case 575: /* statement_scoped: $@8 simple_statement */ -#line 3769 "MachineIndependent/glslang.y" + case 583: /* statement_scoped: $@8 simple_statement */ +#line 3760 "MachineIndependent/glslang.y" { parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); --parseContext.statementNestingLevel; --parseContext.controlFlowNestingLevel; (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11183 "MachineIndependent/glslang_tab.cpp" +#line 11295 "MachineIndependent/glslang_tab.cpp" break; - case 576: /* compound_statement_no_new_scope: LEFT_BRACE RIGHT_BRACE */ -#line 3778 "MachineIndependent/glslang.y" + case 584: /* compound_statement_no_new_scope: LEFT_BRACE RIGHT_BRACE */ +#line 3769 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = 0; } -#line 11191 "MachineIndependent/glslang_tab.cpp" +#line 11303 "MachineIndependent/glslang_tab.cpp" break; - case 577: /* compound_statement_no_new_scope: LEFT_BRACE statement_list RIGHT_BRACE */ -#line 3781 "MachineIndependent/glslang.y" + case 585: /* compound_statement_no_new_scope: LEFT_BRACE statement_list RIGHT_BRACE */ +#line 3772 "MachineIndependent/glslang.y" { if ((yyvsp[-1].interm.intermNode) && (yyvsp[-1].interm.intermNode)->getAsAggregate()) (yyvsp[-1].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence); (yyval.interm.intermNode) = (yyvsp[-1].interm.intermNode); } -#line 11201 "MachineIndependent/glslang_tab.cpp" +#line 11313 "MachineIndependent/glslang_tab.cpp" break; - case 578: /* statement_list: statement */ -#line 3789 "MachineIndependent/glslang.y" + case 586: /* statement_list: statement */ +#line 3780 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode)); if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase || @@ -11210,11 +11322,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.intermNode) = 0; // start a fresh subsequence for what's after this case } } -#line 11214 "MachineIndependent/glslang_tab.cpp" +#line 11326 "MachineIndependent/glslang_tab.cpp" break; - case 579: /* statement_list: statement_list statement */ -#line 3797 "MachineIndependent/glslang.y" + case 587: /* statement_list: statement_list statement */ +#line 3788 "MachineIndependent/glslang.y" { if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase || (yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpDefault)) { @@ -11223,77 +11335,77 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } else (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode)); } -#line 11227 "MachineIndependent/glslang_tab.cpp" +#line 11339 "MachineIndependent/glslang_tab.cpp" break; - case 580: /* expression_statement: SEMICOLON */ -#line 3808 "MachineIndependent/glslang.y" + case 588: /* expression_statement: SEMICOLON */ +#line 3799 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = 0; } -#line 11233 "MachineIndependent/glslang_tab.cpp" +#line 11345 "MachineIndependent/glslang_tab.cpp" break; - case 581: /* expression_statement: expression SEMICOLON */ -#line 3809 "MachineIndependent/glslang.y" + case 589: /* expression_statement: expression SEMICOLON */ +#line 3800 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = static_cast((yyvsp[-1].interm.intermTypedNode)); } -#line 11239 "MachineIndependent/glslang_tab.cpp" +#line 11351 "MachineIndependent/glslang_tab.cpp" break; - case 582: /* selection_statement: selection_statement_nonattributed */ -#line 3813 "MachineIndependent/glslang.y" + case 590: /* selection_statement: selection_statement_nonattributed */ +#line 3804 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11247 "MachineIndependent/glslang_tab.cpp" +#line 11359 "MachineIndependent/glslang_tab.cpp" break; - case 583: /* selection_statement: attribute selection_statement_nonattributed */ -#line 3817 "MachineIndependent/glslang.y" + case 591: /* selection_statement: attribute selection_statement_nonattributed */ +#line 3807 "MachineIndependent/glslang.y" { parseContext.requireExtensions((yyvsp[0].interm.intermNode)->getLoc(), 1, &E_GL_EXT_control_flow_attributes, "attribute"); parseContext.handleSelectionAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode)); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11257 "MachineIndependent/glslang_tab.cpp" +#line 11369 "MachineIndependent/glslang_tab.cpp" break; - case 584: /* selection_statement_nonattributed: IF LEFT_PAREN expression RIGHT_PAREN selection_rest_statement */ -#line 3825 "MachineIndependent/glslang.y" + case 592: /* selection_statement_nonattributed: IF LEFT_PAREN expression RIGHT_PAREN selection_rest_statement */ +#line 3814 "MachineIndependent/glslang.y" { parseContext.boolCheck((yyvsp[-4].lex).loc, (yyvsp[-2].interm.intermTypedNode)); (yyval.interm.intermNode) = parseContext.intermediate.addSelection((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.nodePair), (yyvsp[-4].lex).loc); } -#line 11266 "MachineIndependent/glslang_tab.cpp" +#line 11378 "MachineIndependent/glslang_tab.cpp" break; - case 585: /* selection_rest_statement: statement_scoped ELSE statement_scoped */ -#line 3832 "MachineIndependent/glslang.y" + case 593: /* selection_rest_statement: statement_scoped ELSE statement_scoped */ +#line 3821 "MachineIndependent/glslang.y" { (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode); (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermNode); } -#line 11275 "MachineIndependent/glslang_tab.cpp" +#line 11387 "MachineIndependent/glslang_tab.cpp" break; - case 586: /* selection_rest_statement: statement_scoped */ -#line 3836 "MachineIndependent/glslang.y" + case 594: /* selection_rest_statement: statement_scoped */ +#line 3825 "MachineIndependent/glslang.y" { (yyval.interm.nodePair).node1 = (yyvsp[0].interm.intermNode); (yyval.interm.nodePair).node2 = 0; } -#line 11284 "MachineIndependent/glslang_tab.cpp" +#line 11396 "MachineIndependent/glslang_tab.cpp" break; - case 587: /* condition: expression */ -#line 3844 "MachineIndependent/glslang.y" + case 595: /* condition: expression */ +#line 3833 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); parseContext.boolCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode)); } -#line 11293 "MachineIndependent/glslang_tab.cpp" +#line 11405 "MachineIndependent/glslang_tab.cpp" break; - case 588: /* condition: fully_specified_type IDENTIFIER EQUAL initializer */ -#line 3848 "MachineIndependent/glslang.y" + case 596: /* condition: fully_specified_type IDENTIFIER EQUAL initializer */ +#line 3837 "MachineIndependent/glslang.y" { parseContext.boolCheck((yyvsp[-2].lex).loc, (yyvsp[-3].interm.type)); @@ -11304,29 +11416,29 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); else (yyval.interm.intermTypedNode) = 0; } -#line 11308 "MachineIndependent/glslang_tab.cpp" +#line 11420 "MachineIndependent/glslang_tab.cpp" break; - case 589: /* switch_statement: switch_statement_nonattributed */ -#line 3861 "MachineIndependent/glslang.y" + case 597: /* switch_statement: switch_statement_nonattributed */ +#line 3850 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11316 "MachineIndependent/glslang_tab.cpp" +#line 11428 "MachineIndependent/glslang_tab.cpp" break; - case 590: /* switch_statement: attribute switch_statement_nonattributed */ -#line 3865 "MachineIndependent/glslang.y" + case 598: /* switch_statement: attribute switch_statement_nonattributed */ +#line 3853 "MachineIndependent/glslang.y" { parseContext.requireExtensions((yyvsp[0].interm.intermNode)->getLoc(), 1, &E_GL_EXT_control_flow_attributes, "attribute"); parseContext.handleSwitchAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode)); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11326 "MachineIndependent/glslang_tab.cpp" +#line 11438 "MachineIndependent/glslang_tab.cpp" break; - case 591: /* $@9: %empty */ -#line 3873 "MachineIndependent/glslang.y" + case 599: /* $@9: %empty */ +#line 3860 "MachineIndependent/glslang.y" { // start new switch sequence on the switch stack ++parseContext.controlFlowNestingLevel; @@ -11335,11 +11447,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); parseContext.switchLevel.push_back(parseContext.statementNestingLevel); parseContext.symbolTable.push(); } -#line 11339 "MachineIndependent/glslang_tab.cpp" +#line 11451 "MachineIndependent/glslang_tab.cpp" break; - case 592: /* switch_statement_nonattributed: SWITCH LEFT_PAREN expression RIGHT_PAREN $@9 LEFT_BRACE switch_statement_list RIGHT_BRACE */ -#line 3881 "MachineIndependent/glslang.y" + case 600: /* switch_statement_nonattributed: SWITCH LEFT_PAREN expression RIGHT_PAREN $@9 LEFT_BRACE switch_statement_list RIGHT_BRACE */ +#line 3868 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.addSwitch((yyvsp[-7].lex).loc, (yyvsp[-5].interm.intermTypedNode), (yyvsp[-1].interm.intermNode) ? (yyvsp[-1].interm.intermNode)->getAsAggregate() : 0); delete parseContext.switchSequenceStack.back(); @@ -11349,27 +11461,27 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); --parseContext.statementNestingLevel; --parseContext.controlFlowNestingLevel; } -#line 11353 "MachineIndependent/glslang_tab.cpp" +#line 11465 "MachineIndependent/glslang_tab.cpp" break; - case 593: /* switch_statement_list: %empty */ -#line 3893 "MachineIndependent/glslang.y" + case 601: /* switch_statement_list: %empty */ +#line 3880 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = 0; } -#line 11361 "MachineIndependent/glslang_tab.cpp" +#line 11473 "MachineIndependent/glslang_tab.cpp" break; - case 594: /* switch_statement_list: statement_list */ -#line 3896 "MachineIndependent/glslang.y" + case 602: /* switch_statement_list: statement_list */ +#line 3883 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11369 "MachineIndependent/glslang_tab.cpp" +#line 11481 "MachineIndependent/glslang_tab.cpp" break; - case 595: /* case_label: CASE expression COLON */ -#line 3902 "MachineIndependent/glslang.y" + case 603: /* case_label: CASE expression COLON */ +#line 3889 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = 0; if (parseContext.switchLevel.size() == 0) @@ -11382,11 +11494,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpCase, (yyvsp[-1].interm.intermTypedNode), (yyvsp[-2].lex).loc); } } -#line 11386 "MachineIndependent/glslang_tab.cpp" +#line 11498 "MachineIndependent/glslang_tab.cpp" break; - case 596: /* case_label: DEFAULT COLON */ -#line 3914 "MachineIndependent/glslang.y" + case 604: /* case_label: DEFAULT COLON */ +#line 3901 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = 0; if (parseContext.switchLevel.size() == 0) @@ -11396,29 +11508,29 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); else (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpDefault, (yyvsp[-1].lex).loc); } -#line 11400 "MachineIndependent/glslang_tab.cpp" +#line 11512 "MachineIndependent/glslang_tab.cpp" break; - case 597: /* iteration_statement: iteration_statement_nonattributed */ -#line 3926 "MachineIndependent/glslang.y" + case 605: /* iteration_statement: iteration_statement_nonattributed */ +#line 3913 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11408 "MachineIndependent/glslang_tab.cpp" +#line 11520 "MachineIndependent/glslang_tab.cpp" break; - case 598: /* iteration_statement: attribute iteration_statement_nonattributed */ -#line 3930 "MachineIndependent/glslang.y" + case 606: /* iteration_statement: attribute iteration_statement_nonattributed */ +#line 3916 "MachineIndependent/glslang.y" { parseContext.requireExtensions((yyvsp[0].interm.intermNode)->getLoc(), 1, &E_GL_EXT_control_flow_attributes, "attribute"); parseContext.handleLoopAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode)); (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11418 "MachineIndependent/glslang_tab.cpp" +#line 11530 "MachineIndependent/glslang_tab.cpp" break; - case 599: /* $@10: %empty */ -#line 3938 "MachineIndependent/glslang.y" + case 607: /* $@10: %empty */ +#line 3923 "MachineIndependent/glslang.y" { if (! parseContext.limits.whileLoops) parseContext.error((yyvsp[-1].lex).loc, "while loops not available", "limitation", ""); @@ -11427,11 +11539,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); ++parseContext.statementNestingLevel; ++parseContext.controlFlowNestingLevel; } -#line 11431 "MachineIndependent/glslang_tab.cpp" +#line 11543 "MachineIndependent/glslang_tab.cpp" break; - case 600: /* iteration_statement_nonattributed: WHILE LEFT_PAREN $@10 condition RIGHT_PAREN statement_no_new_scope */ -#line 3946 "MachineIndependent/glslang.y" + case 608: /* iteration_statement_nonattributed: WHILE LEFT_PAREN $@10 condition RIGHT_PAREN statement_no_new_scope */ +#line 3931 "MachineIndependent/glslang.y" { parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); (yyval.interm.intermNode) = parseContext.intermediate.addLoop((yyvsp[0].interm.intermNode), (yyvsp[-2].interm.intermTypedNode), 0, true, (yyvsp[-5].lex).loc); @@ -11439,22 +11551,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); --parseContext.statementNestingLevel; --parseContext.controlFlowNestingLevel; } -#line 11443 "MachineIndependent/glslang_tab.cpp" +#line 11555 "MachineIndependent/glslang_tab.cpp" break; - case 601: /* $@11: %empty */ -#line 3953 "MachineIndependent/glslang.y" + case 609: /* $@11: %empty */ +#line 3938 "MachineIndependent/glslang.y" { parseContext.symbolTable.push(); ++parseContext.loopNestingLevel; ++parseContext.statementNestingLevel; ++parseContext.controlFlowNestingLevel; } -#line 11454 "MachineIndependent/glslang_tab.cpp" +#line 11566 "MachineIndependent/glslang_tab.cpp" break; - case 602: /* iteration_statement_nonattributed: DO $@11 statement WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON */ -#line 3959 "MachineIndependent/glslang.y" + case 610: /* iteration_statement_nonattributed: DO $@11 statement WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON */ +#line 3944 "MachineIndependent/glslang.y" { if (! parseContext.limits.whileLoops) parseContext.error((yyvsp[-7].lex).loc, "do-while loops not available", "limitation", ""); @@ -11467,22 +11579,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); --parseContext.statementNestingLevel; --parseContext.controlFlowNestingLevel; } -#line 11471 "MachineIndependent/glslang_tab.cpp" +#line 11583 "MachineIndependent/glslang_tab.cpp" break; - case 603: /* $@12: %empty */ -#line 3971 "MachineIndependent/glslang.y" + case 611: /* $@12: %empty */ +#line 3956 "MachineIndependent/glslang.y" { parseContext.symbolTable.push(); ++parseContext.loopNestingLevel; ++parseContext.statementNestingLevel; ++parseContext.controlFlowNestingLevel; } -#line 11482 "MachineIndependent/glslang_tab.cpp" +#line 11594 "MachineIndependent/glslang_tab.cpp" break; - case 604: /* iteration_statement_nonattributed: FOR LEFT_PAREN $@12 for_init_statement for_rest_statement RIGHT_PAREN statement_no_new_scope */ -#line 3977 "MachineIndependent/glslang.y" + case 612: /* iteration_statement_nonattributed: FOR LEFT_PAREN $@12 for_init_statement for_rest_statement RIGHT_PAREN statement_no_new_scope */ +#line 3962 "MachineIndependent/glslang.y" { parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[-3].interm.intermNode), (yyvsp[-5].lex).loc); @@ -11495,81 +11607,81 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); --parseContext.statementNestingLevel; --parseContext.controlFlowNestingLevel; } -#line 11499 "MachineIndependent/glslang_tab.cpp" +#line 11611 "MachineIndependent/glslang_tab.cpp" break; - case 605: /* for_init_statement: expression_statement */ -#line 3992 "MachineIndependent/glslang.y" + case 613: /* for_init_statement: expression_statement */ +#line 3977 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11507 "MachineIndependent/glslang_tab.cpp" +#line 11619 "MachineIndependent/glslang_tab.cpp" break; - case 606: /* for_init_statement: declaration_statement */ -#line 3995 "MachineIndependent/glslang.y" + case 614: /* for_init_statement: declaration_statement */ +#line 3980 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11515 "MachineIndependent/glslang_tab.cpp" +#line 11627 "MachineIndependent/glslang_tab.cpp" break; - case 607: /* conditionopt: condition */ -#line 4001 "MachineIndependent/glslang.y" + case 615: /* conditionopt: condition */ +#line 3986 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); } -#line 11523 "MachineIndependent/glslang_tab.cpp" +#line 11635 "MachineIndependent/glslang_tab.cpp" break; - case 608: /* conditionopt: %empty */ -#line 4004 "MachineIndependent/glslang.y" + case 616: /* conditionopt: %empty */ +#line 3989 "MachineIndependent/glslang.y" { (yyval.interm.intermTypedNode) = 0; } -#line 11531 "MachineIndependent/glslang_tab.cpp" +#line 11643 "MachineIndependent/glslang_tab.cpp" break; - case 609: /* for_rest_statement: conditionopt SEMICOLON */ -#line 4010 "MachineIndependent/glslang.y" + case 617: /* for_rest_statement: conditionopt SEMICOLON */ +#line 3995 "MachineIndependent/glslang.y" { (yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode); (yyval.interm.nodePair).node2 = 0; } -#line 11540 "MachineIndependent/glslang_tab.cpp" +#line 11652 "MachineIndependent/glslang_tab.cpp" break; - case 610: /* for_rest_statement: conditionopt SEMICOLON expression */ -#line 4014 "MachineIndependent/glslang.y" + case 618: /* for_rest_statement: conditionopt SEMICOLON expression */ +#line 3999 "MachineIndependent/glslang.y" { (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode); (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermTypedNode); } -#line 11549 "MachineIndependent/glslang_tab.cpp" +#line 11661 "MachineIndependent/glslang_tab.cpp" break; - case 611: /* jump_statement: CONTINUE SEMICOLON */ -#line 4021 "MachineIndependent/glslang.y" + case 619: /* jump_statement: CONTINUE SEMICOLON */ +#line 4006 "MachineIndependent/glslang.y" { if (parseContext.loopNestingLevel <= 0) parseContext.error((yyvsp[-1].lex).loc, "continue statement only allowed in loops", "", ""); (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpContinue, (yyvsp[-1].lex).loc); } -#line 11559 "MachineIndependent/glslang_tab.cpp" +#line 11671 "MachineIndependent/glslang_tab.cpp" break; - case 612: /* jump_statement: BREAK SEMICOLON */ -#line 4026 "MachineIndependent/glslang.y" + case 620: /* jump_statement: BREAK SEMICOLON */ +#line 4011 "MachineIndependent/glslang.y" { if (parseContext.loopNestingLevel + parseContext.switchSequenceStack.size() <= 0) parseContext.error((yyvsp[-1].lex).loc, "break statement only allowed in switch and loops", "", ""); (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpBreak, (yyvsp[-1].lex).loc); } -#line 11569 "MachineIndependent/glslang_tab.cpp" +#line 11681 "MachineIndependent/glslang_tab.cpp" break; - case 613: /* jump_statement: RETURN SEMICOLON */ -#line 4031 "MachineIndependent/glslang.y" + case 621: /* jump_statement: RETURN SEMICOLON */ +#line 4016 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpReturn, (yyvsp[-1].lex).loc); if (parseContext.currentFunctionType->getBasicType() != EbtVoid) @@ -11577,101 +11689,101 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (parseContext.inMain) parseContext.postEntryPointReturn = true; } -#line 11581 "MachineIndependent/glslang_tab.cpp" +#line 11693 "MachineIndependent/glslang_tab.cpp" break; - case 614: /* jump_statement: RETURN expression SEMICOLON */ -#line 4038 "MachineIndependent/glslang.y" + case 622: /* jump_statement: RETURN expression SEMICOLON */ +#line 4023 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.handleReturnValue((yyvsp[-2].lex).loc, (yyvsp[-1].interm.intermTypedNode)); } -#line 11589 "MachineIndependent/glslang_tab.cpp" +#line 11701 "MachineIndependent/glslang_tab.cpp" break; - case 615: /* jump_statement: DISCARD SEMICOLON */ -#line 4041 "MachineIndependent/glslang.y" + case 623: /* jump_statement: DISCARD SEMICOLON */ +#line 4026 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, "discard"); (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpKill, (yyvsp[-1].lex).loc); } -#line 11598 "MachineIndependent/glslang_tab.cpp" +#line 11710 "MachineIndependent/glslang_tab.cpp" break; - case 616: /* jump_statement: TERMINATE_INVOCATION SEMICOLON */ -#line 4045 "MachineIndependent/glslang.y" + case 624: /* jump_statement: TERMINATE_INVOCATION SEMICOLON */ +#line 4030 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, "terminateInvocation"); (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpTerminateInvocation, (yyvsp[-1].lex).loc); } -#line 11607 "MachineIndependent/glslang_tab.cpp" +#line 11719 "MachineIndependent/glslang_tab.cpp" break; - case 617: /* jump_statement: TERMINATE_RAY SEMICOLON */ -#line 4050 "MachineIndependent/glslang.y" + case 625: /* jump_statement: TERMINATE_RAY SEMICOLON */ +#line 4034 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[-1].lex).loc, EShLangAnyHit, "terminateRayEXT"); (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpTerminateRayKHR, (yyvsp[-1].lex).loc); } -#line 11616 "MachineIndependent/glslang_tab.cpp" +#line 11728 "MachineIndependent/glslang_tab.cpp" break; - case 618: /* jump_statement: IGNORE_INTERSECTION SEMICOLON */ -#line 4054 "MachineIndependent/glslang.y" + case 626: /* jump_statement: IGNORE_INTERSECTION SEMICOLON */ +#line 4038 "MachineIndependent/glslang.y" { parseContext.requireStage((yyvsp[-1].lex).loc, EShLangAnyHit, "ignoreIntersectionEXT"); (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpIgnoreIntersectionKHR, (yyvsp[-1].lex).loc); } -#line 11625 "MachineIndependent/glslang_tab.cpp" +#line 11737 "MachineIndependent/glslang_tab.cpp" break; - case 619: /* translation_unit: external_declaration */ -#line 4064 "MachineIndependent/glslang.y" + case 627: /* translation_unit: external_declaration */ +#line 4047 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); parseContext.intermediate.setTreeRoot((yyval.interm.intermNode)); } -#line 11634 "MachineIndependent/glslang_tab.cpp" +#line 11746 "MachineIndependent/glslang_tab.cpp" break; - case 620: /* translation_unit: translation_unit external_declaration */ -#line 4068 "MachineIndependent/glslang.y" + case 628: /* translation_unit: translation_unit external_declaration */ +#line 4051 "MachineIndependent/glslang.y" { if ((yyvsp[0].interm.intermNode) != nullptr) { (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode)); parseContext.intermediate.setTreeRoot((yyval.interm.intermNode)); } } -#line 11645 "MachineIndependent/glslang_tab.cpp" +#line 11757 "MachineIndependent/glslang_tab.cpp" break; - case 621: /* external_declaration: function_definition */ -#line 4077 "MachineIndependent/glslang.y" + case 629: /* external_declaration: function_definition */ +#line 4060 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11653 "MachineIndependent/glslang_tab.cpp" +#line 11765 "MachineIndependent/glslang_tab.cpp" break; - case 622: /* external_declaration: declaration */ -#line 4080 "MachineIndependent/glslang.y" + case 630: /* external_declaration: declaration */ +#line 4063 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); } -#line 11661 "MachineIndependent/glslang_tab.cpp" +#line 11773 "MachineIndependent/glslang_tab.cpp" break; - case 623: /* external_declaration: SEMICOLON */ -#line 4084 "MachineIndependent/glslang.y" + case 631: /* external_declaration: SEMICOLON */ +#line 4066 "MachineIndependent/glslang.y" { parseContext.requireProfile((yyvsp[0].lex).loc, ~EEsProfile, "extraneous semicolon"); parseContext.profileRequires((yyvsp[0].lex).loc, ~EEsProfile, 460, nullptr, "extraneous semicolon"); (yyval.interm.intermNode) = nullptr; } -#line 11671 "MachineIndependent/glslang_tab.cpp" +#line 11783 "MachineIndependent/glslang_tab.cpp" break; - case 624: /* $@13: %empty */ -#line 4093 "MachineIndependent/glslang.y" + case 632: /* $@13: %empty */ +#line 4074 "MachineIndependent/glslang.y" { (yyvsp[0].interm).function = parseContext.handleFunctionDeclarator((yyvsp[0].interm).loc, *(yyvsp[0].interm).function, false /* not prototype */); (yyvsp[0].interm).intermNode = parseContext.handleFunctionDefinition((yyvsp[0].interm).loc, *(yyvsp[0].interm).function); @@ -11684,17 +11796,18 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); ++parseContext.statementNestingLevel; } } -#line 11688 "MachineIndependent/glslang_tab.cpp" +#line 11800 "MachineIndependent/glslang_tab.cpp" break; - case 625: /* function_definition: function_prototype $@13 compound_statement_no_new_scope */ -#line 4105 "MachineIndependent/glslang.y" + case 633: /* function_definition: function_prototype $@13 compound_statement_no_new_scope */ +#line 4086 "MachineIndependent/glslang.y" { // May be best done as post process phase on intermediate code if (parseContext.currentFunctionType->getBasicType() != EbtVoid && ! parseContext.functionReturnsValue) parseContext.error((yyvsp[-2].interm).loc, "function does not return a value:", "", (yyvsp[-2].interm).function->getName().c_str()); parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]); (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm).intermNode, (yyvsp[0].interm.intermNode)); + (yyval.interm.intermNode)->getAsAggregate()->setLinkType((yyvsp[-2].interm).function->getLinkType()); parseContext.intermediate.setAggregateOperator((yyval.interm.intermNode), EOpFunction, (yyvsp[-2].interm).function->getType(), (yyvsp[-2].interm).loc); (yyval.interm.intermNode)->getAsAggregate()->setName((yyvsp[-2].interm).function->getMangledName().c_str()); @@ -11715,228 +11828,228 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); --parseContext.statementNestingLevel; } } -#line 11719 "MachineIndependent/glslang_tab.cpp" +#line 11832 "MachineIndependent/glslang_tab.cpp" break; - case 626: /* attribute: LEFT_BRACKET LEFT_BRACKET attribute_list RIGHT_BRACKET RIGHT_BRACKET */ -#line 4135 "MachineIndependent/glslang.y" + case 634: /* attribute: LEFT_BRACKET LEFT_BRACKET attribute_list RIGHT_BRACKET RIGHT_BRACKET */ +#line 4116 "MachineIndependent/glslang.y" { (yyval.interm.attributes) = (yyvsp[-2].interm.attributes); } -#line 11727 "MachineIndependent/glslang_tab.cpp" +#line 11840 "MachineIndependent/glslang_tab.cpp" break; - case 627: /* attribute_list: single_attribute */ -#line 4140 "MachineIndependent/glslang.y" + case 635: /* attribute_list: single_attribute */ +#line 4121 "MachineIndependent/glslang.y" { (yyval.interm.attributes) = (yyvsp[0].interm.attributes); } -#line 11735 "MachineIndependent/glslang_tab.cpp" +#line 11848 "MachineIndependent/glslang_tab.cpp" break; - case 628: /* attribute_list: attribute_list COMMA single_attribute */ -#line 4143 "MachineIndependent/glslang.y" + case 636: /* attribute_list: attribute_list COMMA single_attribute */ +#line 4124 "MachineIndependent/glslang.y" { (yyval.interm.attributes) = parseContext.mergeAttributes((yyvsp[-2].interm.attributes), (yyvsp[0].interm.attributes)); } -#line 11743 "MachineIndependent/glslang_tab.cpp" +#line 11856 "MachineIndependent/glslang_tab.cpp" break; - case 629: /* single_attribute: IDENTIFIER */ -#line 4148 "MachineIndependent/glslang.y" + case 637: /* single_attribute: IDENTIFIER */ +#line 4129 "MachineIndependent/glslang.y" { (yyval.interm.attributes) = parseContext.makeAttributes(*(yyvsp[0].lex).string); } -#line 11751 "MachineIndependent/glslang_tab.cpp" +#line 11864 "MachineIndependent/glslang_tab.cpp" break; - case 630: /* single_attribute: IDENTIFIER LEFT_PAREN constant_expression RIGHT_PAREN */ -#line 4151 "MachineIndependent/glslang.y" + case 638: /* single_attribute: IDENTIFIER LEFT_PAREN constant_expression RIGHT_PAREN */ +#line 4132 "MachineIndependent/glslang.y" { (yyval.interm.attributes) = parseContext.makeAttributes(*(yyvsp[-3].lex).string, (yyvsp[-1].interm.intermTypedNode)); } -#line 11759 "MachineIndependent/glslang_tab.cpp" +#line 11872 "MachineIndependent/glslang_tab.cpp" break; - case 631: /* spirv_requirements_list: spirv_requirements_parameter */ -#line 4158 "MachineIndependent/glslang.y" + case 639: /* spirv_requirements_list: spirv_requirements_parameter */ +#line 4137 "MachineIndependent/glslang.y" { (yyval.interm.spirvReq) = (yyvsp[0].interm.spirvReq); } -#line 11767 "MachineIndependent/glslang_tab.cpp" +#line 11880 "MachineIndependent/glslang_tab.cpp" break; - case 632: /* spirv_requirements_list: spirv_requirements_list COMMA spirv_requirements_parameter */ -#line 4161 "MachineIndependent/glslang.y" + case 640: /* spirv_requirements_list: spirv_requirements_list COMMA spirv_requirements_parameter */ +#line 4140 "MachineIndependent/glslang.y" { (yyval.interm.spirvReq) = parseContext.mergeSpirvRequirements((yyvsp[-1].lex).loc, (yyvsp[-2].interm.spirvReq), (yyvsp[0].interm.spirvReq)); } -#line 11775 "MachineIndependent/glslang_tab.cpp" +#line 11888 "MachineIndependent/glslang_tab.cpp" break; - case 633: /* spirv_requirements_parameter: IDENTIFIER EQUAL LEFT_BRACKET spirv_extension_list RIGHT_BRACKET */ -#line 4166 "MachineIndependent/glslang.y" + case 641: /* spirv_requirements_parameter: IDENTIFIER EQUAL LEFT_BRACKET spirv_extension_list RIGHT_BRACKET */ +#line 4145 "MachineIndependent/glslang.y" { (yyval.interm.spirvReq) = parseContext.makeSpirvRequirement((yyvsp[-3].lex).loc, *(yyvsp[-4].lex).string, (yyvsp[-1].interm.intermNode)->getAsAggregate(), nullptr); } -#line 11783 "MachineIndependent/glslang_tab.cpp" +#line 11896 "MachineIndependent/glslang_tab.cpp" break; - case 634: /* spirv_requirements_parameter: IDENTIFIER EQUAL LEFT_BRACKET spirv_capability_list RIGHT_BRACKET */ -#line 4169 "MachineIndependent/glslang.y" + case 642: /* spirv_requirements_parameter: IDENTIFIER EQUAL LEFT_BRACKET spirv_capability_list RIGHT_BRACKET */ +#line 4148 "MachineIndependent/glslang.y" { (yyval.interm.spirvReq) = parseContext.makeSpirvRequirement((yyvsp[-3].lex).loc, *(yyvsp[-4].lex).string, nullptr, (yyvsp[-1].interm.intermNode)->getAsAggregate()); } -#line 11791 "MachineIndependent/glslang_tab.cpp" +#line 11904 "MachineIndependent/glslang_tab.cpp" break; - case 635: /* spirv_extension_list: STRING_LITERAL */ -#line 4174 "MachineIndependent/glslang.y" + case 643: /* spirv_extension_list: STRING_LITERAL */ +#line 4153 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate(parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true)); } -#line 11799 "MachineIndependent/glslang_tab.cpp" +#line 11912 "MachineIndependent/glslang_tab.cpp" break; - case 636: /* spirv_extension_list: spirv_extension_list COMMA STRING_LITERAL */ -#line 4177 "MachineIndependent/glslang.y" + case 644: /* spirv_extension_list: spirv_extension_list COMMA STRING_LITERAL */ +#line 4156 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true)); } -#line 11807 "MachineIndependent/glslang_tab.cpp" +#line 11920 "MachineIndependent/glslang_tab.cpp" break; - case 637: /* spirv_capability_list: INTCONSTANT */ -#line 4182 "MachineIndependent/glslang.y" + case 645: /* spirv_capability_list: INTCONSTANT */ +#line 4161 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate(parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true)); } -#line 11815 "MachineIndependent/glslang_tab.cpp" +#line 11928 "MachineIndependent/glslang_tab.cpp" break; - case 638: /* spirv_capability_list: spirv_capability_list COMMA INTCONSTANT */ -#line 4185 "MachineIndependent/glslang.y" + case 646: /* spirv_capability_list: spirv_capability_list COMMA INTCONSTANT */ +#line 4164 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true)); } -#line 11823 "MachineIndependent/glslang_tab.cpp" +#line 11936 "MachineIndependent/glslang_tab.cpp" break; - case 639: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN INTCONSTANT RIGHT_PAREN */ -#line 4190 "MachineIndependent/glslang.y" + case 647: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN INTCONSTANT RIGHT_PAREN */ +#line 4169 "MachineIndependent/glslang.y" { parseContext.intermediate.insertSpirvExecutionMode((yyvsp[-1].lex).i); (yyval.interm.intermNode) = 0; } -#line 11832 "MachineIndependent/glslang_tab.cpp" +#line 11945 "MachineIndependent/glslang_tab.cpp" break; - case 640: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT RIGHT_PAREN */ -#line 4194 "MachineIndependent/glslang.y" + case 648: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT RIGHT_PAREN */ +#line 4173 "MachineIndependent/glslang.y" { parseContext.intermediate.insertSpirvRequirement((yyvsp[-3].interm.spirvReq)); parseContext.intermediate.insertSpirvExecutionMode((yyvsp[-1].lex).i); (yyval.interm.intermNode) = 0; } -#line 11842 "MachineIndependent/glslang_tab.cpp" +#line 11955 "MachineIndependent/glslang_tab.cpp" break; - case 641: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN INTCONSTANT COMMA spirv_execution_mode_parameter_list RIGHT_PAREN */ -#line 4199 "MachineIndependent/glslang.y" + case 649: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN INTCONSTANT COMMA spirv_execution_mode_parameter_list RIGHT_PAREN */ +#line 4178 "MachineIndependent/glslang.y" { parseContext.intermediate.insertSpirvExecutionMode((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); (yyval.interm.intermNode) = 0; } -#line 11851 "MachineIndependent/glslang_tab.cpp" +#line 11964 "MachineIndependent/glslang_tab.cpp" break; - case 642: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_execution_mode_parameter_list RIGHT_PAREN */ -#line 4203 "MachineIndependent/glslang.y" + case 650: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_execution_mode_parameter_list RIGHT_PAREN */ +#line 4182 "MachineIndependent/glslang.y" { parseContext.intermediate.insertSpirvRequirement((yyvsp[-5].interm.spirvReq)); parseContext.intermediate.insertSpirvExecutionMode((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); (yyval.interm.intermNode) = 0; } -#line 11861 "MachineIndependent/glslang_tab.cpp" +#line 11974 "MachineIndependent/glslang_tab.cpp" break; - case 643: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE_ID LEFT_PAREN INTCONSTANT COMMA spirv_execution_mode_id_parameter_list RIGHT_PAREN */ -#line 4208 "MachineIndependent/glslang.y" + case 651: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE_ID LEFT_PAREN INTCONSTANT COMMA spirv_execution_mode_id_parameter_list RIGHT_PAREN */ +#line 4187 "MachineIndependent/glslang.y" { parseContext.intermediate.insertSpirvExecutionModeId((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); (yyval.interm.intermNode) = 0; } -#line 11870 "MachineIndependent/glslang_tab.cpp" +#line 11983 "MachineIndependent/glslang_tab.cpp" break; - case 644: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE_ID LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_execution_mode_id_parameter_list RIGHT_PAREN */ -#line 4212 "MachineIndependent/glslang.y" + case 652: /* spirv_execution_mode_qualifier: SPIRV_EXECUTION_MODE_ID LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_execution_mode_id_parameter_list RIGHT_PAREN */ +#line 4191 "MachineIndependent/glslang.y" { parseContext.intermediate.insertSpirvRequirement((yyvsp[-5].interm.spirvReq)); parseContext.intermediate.insertSpirvExecutionModeId((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); (yyval.interm.intermNode) = 0; } -#line 11880 "MachineIndependent/glslang_tab.cpp" +#line 11993 "MachineIndependent/glslang_tab.cpp" break; - case 645: /* spirv_execution_mode_parameter_list: spirv_execution_mode_parameter */ -#line 4219 "MachineIndependent/glslang.y" + case 653: /* spirv_execution_mode_parameter_list: spirv_execution_mode_parameter */ +#line 4198 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode)); } -#line 11888 "MachineIndependent/glslang_tab.cpp" +#line 12001 "MachineIndependent/glslang_tab.cpp" break; - case 646: /* spirv_execution_mode_parameter_list: spirv_execution_mode_parameter_list COMMA spirv_execution_mode_parameter */ -#line 4222 "MachineIndependent/glslang.y" + case 654: /* spirv_execution_mode_parameter_list: spirv_execution_mode_parameter_list COMMA spirv_execution_mode_parameter */ +#line 4201 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), (yyvsp[0].interm.intermNode)); } -#line 11896 "MachineIndependent/glslang_tab.cpp" +#line 12009 "MachineIndependent/glslang_tab.cpp" break; - case 647: /* spirv_execution_mode_parameter: FLOATCONSTANT */ -#line 4227 "MachineIndependent/glslang.y" + case 655: /* spirv_execution_mode_parameter: FLOATCONSTANT */ +#line 4206 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat, (yyvsp[0].lex).loc, true); } -#line 11904 "MachineIndependent/glslang_tab.cpp" +#line 12017 "MachineIndependent/glslang_tab.cpp" break; - case 648: /* spirv_execution_mode_parameter: INTCONSTANT */ -#line 4230 "MachineIndependent/glslang.y" + case 656: /* spirv_execution_mode_parameter: INTCONSTANT */ +#line 4209 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true); } -#line 11912 "MachineIndependent/glslang_tab.cpp" +#line 12025 "MachineIndependent/glslang_tab.cpp" break; - case 649: /* spirv_execution_mode_parameter: UINTCONSTANT */ -#line 4233 "MachineIndependent/glslang.y" + case 657: /* spirv_execution_mode_parameter: UINTCONSTANT */ +#line 4212 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true); } -#line 11920 "MachineIndependent/glslang_tab.cpp" +#line 12033 "MachineIndependent/glslang_tab.cpp" break; - case 650: /* spirv_execution_mode_parameter: BOOLCONSTANT */ -#line 4236 "MachineIndependent/glslang.y" + case 658: /* spirv_execution_mode_parameter: BOOLCONSTANT */ +#line 4215 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).b, (yyvsp[0].lex).loc, true); } -#line 11928 "MachineIndependent/glslang_tab.cpp" +#line 12041 "MachineIndependent/glslang_tab.cpp" break; - case 651: /* spirv_execution_mode_parameter: STRING_LITERAL */ -#line 4239 "MachineIndependent/glslang.y" + case 659: /* spirv_execution_mode_parameter: STRING_LITERAL */ +#line 4218 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true); } -#line 11936 "MachineIndependent/glslang_tab.cpp" +#line 12049 "MachineIndependent/glslang_tab.cpp" break; - case 652: /* spirv_execution_mode_id_parameter_list: constant_expression */ -#line 4244 "MachineIndependent/glslang.y" + case 660: /* spirv_execution_mode_id_parameter_list: constant_expression */ +#line 4223 "MachineIndependent/glslang.y" { if ((yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtFloat && (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtInt && @@ -11946,11 +12059,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), "this type not allowed", (yyvsp[0].interm.intermTypedNode)->getType().getBasicString(), ""); (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermTypedNode)); } -#line 11950 "MachineIndependent/glslang_tab.cpp" +#line 12063 "MachineIndependent/glslang_tab.cpp" break; - case 653: /* spirv_execution_mode_id_parameter_list: spirv_execution_mode_id_parameter_list COMMA constant_expression */ -#line 4253 "MachineIndependent/glslang.y" + case 661: /* spirv_execution_mode_id_parameter_list: spirv_execution_mode_id_parameter_list COMMA constant_expression */ +#line 4232 "MachineIndependent/glslang.y" { if ((yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtFloat && (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtInt && @@ -11960,310 +12073,351 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), "this type not allowed", (yyvsp[0].interm.intermTypedNode)->getType().getBasicString(), ""); (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), (yyvsp[0].interm.intermTypedNode)); } -#line 11964 "MachineIndependent/glslang_tab.cpp" +#line 12077 "MachineIndependent/glslang_tab.cpp" break; - case 654: /* spirv_storage_class_qualifier: SPIRV_STORAGE_CLASS LEFT_PAREN INTCONSTANT RIGHT_PAREN */ -#line 4264 "MachineIndependent/glslang.y" + case 662: /* spirv_storage_class_qualifier: SPIRV_STORAGE_CLASS LEFT_PAREN INTCONSTANT RIGHT_PAREN */ +#line 4243 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-3].lex).loc); (yyval.interm.type).qualifier.storage = EvqSpirvStorageClass; (yyval.interm.type).qualifier.spirvStorageClass = (yyvsp[-1].lex).i; } -#line 11974 "MachineIndependent/glslang_tab.cpp" +#line 12087 "MachineIndependent/glslang_tab.cpp" break; - case 655: /* spirv_storage_class_qualifier: SPIRV_STORAGE_CLASS LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT RIGHT_PAREN */ -#line 4269 "MachineIndependent/glslang.y" + case 663: /* spirv_storage_class_qualifier: SPIRV_STORAGE_CLASS LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT RIGHT_PAREN */ +#line 4248 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-5].lex).loc); parseContext.intermediate.insertSpirvRequirement((yyvsp[-3].interm.spirvReq)); (yyval.interm.type).qualifier.storage = EvqSpirvStorageClass; (yyval.interm.type).qualifier.spirvStorageClass = (yyvsp[-1].lex).i; } -#line 11985 "MachineIndependent/glslang_tab.cpp" +#line 12098 "MachineIndependent/glslang_tab.cpp" break; - case 656: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN INTCONSTANT RIGHT_PAREN */ -#line 4277 "MachineIndependent/glslang.y" + case 664: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN INTCONSTANT RIGHT_PAREN */ +#line 4256 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-3].lex).loc); (yyval.interm.type).qualifier.setSpirvDecorate((yyvsp[-1].lex).i); } -#line 11994 "MachineIndependent/glslang_tab.cpp" +#line 12107 "MachineIndependent/glslang_tab.cpp" break; - case 657: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT RIGHT_PAREN */ -#line 4281 "MachineIndependent/glslang.y" + case 665: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT RIGHT_PAREN */ +#line 4260 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-5].lex).loc); parseContext.intermediate.insertSpirvRequirement((yyvsp[-3].interm.spirvReq)); (yyval.interm.type).qualifier.setSpirvDecorate((yyvsp[-1].lex).i); } -#line 12004 "MachineIndependent/glslang_tab.cpp" +#line 12117 "MachineIndependent/glslang_tab.cpp" break; - case 658: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN INTCONSTANT COMMA spirv_decorate_parameter_list RIGHT_PAREN */ -#line 4286 "MachineIndependent/glslang.y" + case 666: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN INTCONSTANT COMMA spirv_decorate_parameter_list RIGHT_PAREN */ +#line 4265 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-5].lex).loc); (yyval.interm.type).qualifier.setSpirvDecorate((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); } -#line 12013 "MachineIndependent/glslang_tab.cpp" +#line 12126 "MachineIndependent/glslang_tab.cpp" break; - case 659: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_decorate_parameter_list RIGHT_PAREN */ -#line 4290 "MachineIndependent/glslang.y" + case 667: /* spirv_decorate_qualifier: SPIRV_DECORATE LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_decorate_parameter_list RIGHT_PAREN */ +#line 4269 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-7].lex).loc); parseContext.intermediate.insertSpirvRequirement((yyvsp[-5].interm.spirvReq)); (yyval.interm.type).qualifier.setSpirvDecorate((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); } -#line 12023 "MachineIndependent/glslang_tab.cpp" +#line 12136 "MachineIndependent/glslang_tab.cpp" break; - case 660: /* spirv_decorate_qualifier: SPIRV_DECORATE_ID LEFT_PAREN INTCONSTANT COMMA spirv_decorate_id_parameter_list RIGHT_PAREN */ -#line 4295 "MachineIndependent/glslang.y" + case 668: /* spirv_decorate_qualifier: SPIRV_DECORATE_ID LEFT_PAREN INTCONSTANT COMMA spirv_decorate_id_parameter_list RIGHT_PAREN */ +#line 4274 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-5].lex).loc); (yyval.interm.type).qualifier.setSpirvDecorateId((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); } -#line 12032 "MachineIndependent/glslang_tab.cpp" +#line 12145 "MachineIndependent/glslang_tab.cpp" break; - case 661: /* spirv_decorate_qualifier: SPIRV_DECORATE_ID LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_decorate_id_parameter_list RIGHT_PAREN */ -#line 4299 "MachineIndependent/glslang.y" + case 669: /* spirv_decorate_qualifier: SPIRV_DECORATE_ID LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_decorate_id_parameter_list RIGHT_PAREN */ +#line 4278 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-7].lex).loc); parseContext.intermediate.insertSpirvRequirement((yyvsp[-5].interm.spirvReq)); (yyval.interm.type).qualifier.setSpirvDecorateId((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); } -#line 12042 "MachineIndependent/glslang_tab.cpp" +#line 12155 "MachineIndependent/glslang_tab.cpp" break; - case 662: /* spirv_decorate_qualifier: SPIRV_DECORATE_STRING LEFT_PAREN INTCONSTANT COMMA spirv_decorate_string_parameter_list RIGHT_PAREN */ -#line 4304 "MachineIndependent/glslang.y" + case 670: /* spirv_decorate_qualifier: SPIRV_DECORATE_STRING LEFT_PAREN INTCONSTANT COMMA spirv_decorate_string_parameter_list RIGHT_PAREN */ +#line 4283 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-5].lex).loc); (yyval.interm.type).qualifier.setSpirvDecorateString((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); } -#line 12051 "MachineIndependent/glslang_tab.cpp" +#line 12164 "MachineIndependent/glslang_tab.cpp" break; - case 663: /* spirv_decorate_qualifier: SPIRV_DECORATE_STRING LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_decorate_string_parameter_list RIGHT_PAREN */ -#line 4308 "MachineIndependent/glslang.y" + case 671: /* spirv_decorate_qualifier: SPIRV_DECORATE_STRING LEFT_PAREN spirv_requirements_list COMMA INTCONSTANT COMMA spirv_decorate_string_parameter_list RIGHT_PAREN */ +#line 4287 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-7].lex).loc); parseContext.intermediate.insertSpirvRequirement((yyvsp[-5].interm.spirvReq)); (yyval.interm.type).qualifier.setSpirvDecorateString((yyvsp[-3].lex).i, (yyvsp[-1].interm.intermNode)->getAsAggregate()); } -#line 12061 "MachineIndependent/glslang_tab.cpp" +#line 12174 "MachineIndependent/glslang_tab.cpp" break; - case 664: /* spirv_decorate_parameter_list: spirv_decorate_parameter */ -#line 4315 "MachineIndependent/glslang.y" + case 672: /* spirv_decorate_parameter_list: spirv_decorate_parameter */ +#line 4294 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode)); } -#line 12069 "MachineIndependent/glslang_tab.cpp" +#line 12182 "MachineIndependent/glslang_tab.cpp" break; - case 665: /* spirv_decorate_parameter_list: spirv_decorate_parameter_list COMMA spirv_decorate_parameter */ -#line 4318 "MachineIndependent/glslang.y" + case 673: /* spirv_decorate_parameter_list: spirv_decorate_parameter_list COMMA spirv_decorate_parameter */ +#line 4297 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), (yyvsp[0].interm.intermNode)); } -#line 12077 "MachineIndependent/glslang_tab.cpp" +#line 12190 "MachineIndependent/glslang_tab.cpp" break; - case 666: /* spirv_decorate_parameter: FLOATCONSTANT */ -#line 4323 "MachineIndependent/glslang.y" + case 674: /* spirv_decorate_parameter: FLOATCONSTANT */ +#line 4302 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat, (yyvsp[0].lex).loc, true); } -#line 12085 "MachineIndependent/glslang_tab.cpp" +#line 12198 "MachineIndependent/glslang_tab.cpp" break; - case 667: /* spirv_decorate_parameter: INTCONSTANT */ -#line 4326 "MachineIndependent/glslang.y" + case 675: /* spirv_decorate_parameter: INTCONSTANT */ +#line 4305 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true); } -#line 12093 "MachineIndependent/glslang_tab.cpp" +#line 12206 "MachineIndependent/glslang_tab.cpp" break; - case 668: /* spirv_decorate_parameter: UINTCONSTANT */ -#line 4329 "MachineIndependent/glslang.y" + case 676: /* spirv_decorate_parameter: UINTCONSTANT */ +#line 4308 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true); } -#line 12101 "MachineIndependent/glslang_tab.cpp" +#line 12214 "MachineIndependent/glslang_tab.cpp" break; - case 669: /* spirv_decorate_parameter: BOOLCONSTANT */ -#line 4332 "MachineIndependent/glslang.y" + case 677: /* spirv_decorate_parameter: BOOLCONSTANT */ +#line 4311 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).b, (yyvsp[0].lex).loc, true); } -#line 12109 "MachineIndependent/glslang_tab.cpp" +#line 12222 "MachineIndependent/glslang_tab.cpp" + break; + + case 678: /* spirv_decorate_id_parameter_list: spirv_decorate_id_parameter */ +#line 4316 "MachineIndependent/glslang.y" + { + (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode)); + } +#line 12230 "MachineIndependent/glslang_tab.cpp" + break; + + case 679: /* spirv_decorate_id_parameter_list: spirv_decorate_id_parameter_list COMMA spirv_decorate_id_parameter */ +#line 4319 "MachineIndependent/glslang.y" + { + (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), (yyvsp[0].interm.intermNode)); + } +#line 12238 "MachineIndependent/glslang_tab.cpp" break; - case 670: /* spirv_decorate_id_parameter_list: constant_expression */ -#line 4337 "MachineIndependent/glslang.y" + case 680: /* spirv_decorate_id_parameter: variable_identifier */ +#line 4324 "MachineIndependent/glslang.y" { - if ((yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtFloat && - (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtInt && - (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtUint && - (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtBool) - parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), "this type not allowed", (yyvsp[0].interm.intermTypedNode)->getType().getBasicString(), ""); - (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermTypedNode)); + if ((yyvsp[0].interm.intermTypedNode)->getAsConstantUnion() || (yyvsp[0].interm.intermTypedNode)->getAsSymbolNode()) + (yyval.interm.intermNode) = (yyvsp[0].interm.intermTypedNode); + else + parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), "only allow constants or variables which are not elements of a composite", "", ""); } -#line 12122 "MachineIndependent/glslang_tab.cpp" +#line 12249 "MachineIndependent/glslang_tab.cpp" break; - case 671: /* spirv_decorate_id_parameter_list: spirv_decorate_id_parameter_list COMMA constant_expression */ -#line 4345 "MachineIndependent/glslang.y" - { - if ((yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtFloat && - (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtInt && - (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtUint && - (yyvsp[0].interm.intermTypedNode)->getBasicType() != EbtBool) - parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), "this type not allowed", (yyvsp[0].interm.intermTypedNode)->getType().getBasicString(), ""); - (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), (yyvsp[0].interm.intermTypedNode)); + case 681: /* spirv_decorate_id_parameter: FLOATCONSTANT */ +#line 4330 "MachineIndependent/glslang.y" + { + (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat, (yyvsp[0].lex).loc, true); + } +#line 12257 "MachineIndependent/glslang_tab.cpp" + break; + + case 682: /* spirv_decorate_id_parameter: INTCONSTANT */ +#line 4333 "MachineIndependent/glslang.y" + { + (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true); + } +#line 12265 "MachineIndependent/glslang_tab.cpp" + break; + + case 683: /* spirv_decorate_id_parameter: UINTCONSTANT */ +#line 4336 "MachineIndependent/glslang.y" + { + (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true); + } +#line 12273 "MachineIndependent/glslang_tab.cpp" + break; + + case 684: /* spirv_decorate_id_parameter: BOOLCONSTANT */ +#line 4339 "MachineIndependent/glslang.y" + { + (yyval.interm.intermNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).b, (yyvsp[0].lex).loc, true); } -#line 12135 "MachineIndependent/glslang_tab.cpp" +#line 12281 "MachineIndependent/glslang_tab.cpp" break; - case 672: /* spirv_decorate_string_parameter_list: STRING_LITERAL */ -#line 4355 "MachineIndependent/glslang.y" + case 685: /* spirv_decorate_string_parameter_list: STRING_LITERAL */ +#line 4344 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate( parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true)); } -#line 12144 "MachineIndependent/glslang_tab.cpp" +#line 12290 "MachineIndependent/glslang_tab.cpp" break; - case 673: /* spirv_decorate_string_parameter_list: spirv_decorate_string_parameter_list COMMA STRING_LITERAL */ -#line 4359 "MachineIndependent/glslang.y" + case 686: /* spirv_decorate_string_parameter_list: spirv_decorate_string_parameter_list COMMA STRING_LITERAL */ +#line 4348 "MachineIndependent/glslang.y" { (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermNode), parseContext.intermediate.addConstantUnion((yyvsp[0].lex).string, (yyvsp[0].lex).loc, true)); } -#line 12152 "MachineIndependent/glslang_tab.cpp" +#line 12298 "MachineIndependent/glslang_tab.cpp" break; - case 674: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_instruction_qualifier_list COMMA spirv_type_parameter_list RIGHT_PAREN */ -#line 4364 "MachineIndependent/glslang.y" + case 687: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_instruction_qualifier_list COMMA spirv_type_parameter_list RIGHT_PAREN */ +#line 4353 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-5].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).setSpirvType(*(yyvsp[-3].interm.spirvInst), (yyvsp[-1].interm.spirvTypeParams)); } -#line 12161 "MachineIndependent/glslang_tab.cpp" +#line 12307 "MachineIndependent/glslang_tab.cpp" break; - case 675: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_requirements_list COMMA spirv_instruction_qualifier_list COMMA spirv_type_parameter_list RIGHT_PAREN */ -#line 4368 "MachineIndependent/glslang.y" + case 688: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_requirements_list COMMA spirv_instruction_qualifier_list COMMA spirv_type_parameter_list RIGHT_PAREN */ +#line 4357 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-7].lex).loc, parseContext.symbolTable.atGlobalLevel()); parseContext.intermediate.insertSpirvRequirement((yyvsp[-5].interm.spirvReq)); (yyval.interm.type).setSpirvType(*(yyvsp[-3].interm.spirvInst), (yyvsp[-1].interm.spirvTypeParams)); } -#line 12171 "MachineIndependent/glslang_tab.cpp" +#line 12317 "MachineIndependent/glslang_tab.cpp" break; - case 676: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_instruction_qualifier_list RIGHT_PAREN */ -#line 4373 "MachineIndependent/glslang.y" + case 689: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_instruction_qualifier_list RIGHT_PAREN */ +#line 4362 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-3].lex).loc, parseContext.symbolTable.atGlobalLevel()); (yyval.interm.type).setSpirvType(*(yyvsp[-1].interm.spirvInst)); } -#line 12180 "MachineIndependent/glslang_tab.cpp" +#line 12326 "MachineIndependent/glslang_tab.cpp" break; - case 677: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_requirements_list COMMA spirv_instruction_qualifier_list RIGHT_PAREN */ -#line 4377 "MachineIndependent/glslang.y" + case 690: /* spirv_type_specifier: SPIRV_TYPE LEFT_PAREN spirv_requirements_list COMMA spirv_instruction_qualifier_list RIGHT_PAREN */ +#line 4366 "MachineIndependent/glslang.y" { (yyval.interm.type).init((yyvsp[-5].lex).loc, parseContext.symbolTable.atGlobalLevel()); parseContext.intermediate.insertSpirvRequirement((yyvsp[-3].interm.spirvReq)); (yyval.interm.type).setSpirvType(*(yyvsp[-1].interm.spirvInst)); } -#line 12190 "MachineIndependent/glslang_tab.cpp" +#line 12336 "MachineIndependent/glslang_tab.cpp" break; - case 678: /* spirv_type_parameter_list: spirv_type_parameter */ -#line 4384 "MachineIndependent/glslang.y" + case 691: /* spirv_type_parameter_list: spirv_type_parameter */ +#line 4373 "MachineIndependent/glslang.y" { (yyval.interm.spirvTypeParams) = (yyvsp[0].interm.spirvTypeParams); } -#line 12198 "MachineIndependent/glslang_tab.cpp" +#line 12344 "MachineIndependent/glslang_tab.cpp" break; - case 679: /* spirv_type_parameter_list: spirv_type_parameter_list COMMA spirv_type_parameter */ -#line 4387 "MachineIndependent/glslang.y" + case 692: /* spirv_type_parameter_list: spirv_type_parameter_list COMMA spirv_type_parameter */ +#line 4376 "MachineIndependent/glslang.y" { (yyval.interm.spirvTypeParams) = parseContext.mergeSpirvTypeParameters((yyvsp[-2].interm.spirvTypeParams), (yyvsp[0].interm.spirvTypeParams)); } -#line 12206 "MachineIndependent/glslang_tab.cpp" +#line 12352 "MachineIndependent/glslang_tab.cpp" break; - case 680: /* spirv_type_parameter: constant_expression */ -#line 4392 "MachineIndependent/glslang.y" + case 693: /* spirv_type_parameter: constant_expression */ +#line 4381 "MachineIndependent/glslang.y" { (yyval.interm.spirvTypeParams) = parseContext.makeSpirvTypeParameters((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode)->getAsConstantUnion()); } -#line 12214 "MachineIndependent/glslang_tab.cpp" +#line 12360 "MachineIndependent/glslang_tab.cpp" + break; + + case 694: /* spirv_type_parameter: type_specifier_nonarray */ +#line 4384 "MachineIndependent/glslang.y" + { + (yyval.interm.spirvTypeParams) = parseContext.makeSpirvTypeParameters((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type)); + } +#line 12368 "MachineIndependent/glslang_tab.cpp" break; - case 681: /* spirv_instruction_qualifier: SPIRV_INSTRUCTION LEFT_PAREN spirv_instruction_qualifier_list RIGHT_PAREN */ -#line 4397 "MachineIndependent/glslang.y" + case 695: /* spirv_instruction_qualifier: SPIRV_INSTRUCTION LEFT_PAREN spirv_instruction_qualifier_list RIGHT_PAREN */ +#line 4389 "MachineIndependent/glslang.y" { (yyval.interm.spirvInst) = (yyvsp[-1].interm.spirvInst); } -#line 12222 "MachineIndependent/glslang_tab.cpp" +#line 12376 "MachineIndependent/glslang_tab.cpp" break; - case 682: /* spirv_instruction_qualifier: SPIRV_INSTRUCTION LEFT_PAREN spirv_requirements_list COMMA spirv_instruction_qualifier_list RIGHT_PAREN */ -#line 4400 "MachineIndependent/glslang.y" + case 696: /* spirv_instruction_qualifier: SPIRV_INSTRUCTION LEFT_PAREN spirv_requirements_list COMMA spirv_instruction_qualifier_list RIGHT_PAREN */ +#line 4392 "MachineIndependent/glslang.y" { parseContext.intermediate.insertSpirvRequirement((yyvsp[-3].interm.spirvReq)); (yyval.interm.spirvInst) = (yyvsp[-1].interm.spirvInst); } -#line 12231 "MachineIndependent/glslang_tab.cpp" +#line 12385 "MachineIndependent/glslang_tab.cpp" break; - case 683: /* spirv_instruction_qualifier_list: spirv_instruction_qualifier_id */ -#line 4406 "MachineIndependent/glslang.y" + case 697: /* spirv_instruction_qualifier_list: spirv_instruction_qualifier_id */ +#line 4398 "MachineIndependent/glslang.y" { (yyval.interm.spirvInst) = (yyvsp[0].interm.spirvInst); } -#line 12239 "MachineIndependent/glslang_tab.cpp" +#line 12393 "MachineIndependent/glslang_tab.cpp" break; - case 684: /* spirv_instruction_qualifier_list: spirv_instruction_qualifier_list COMMA spirv_instruction_qualifier_id */ -#line 4409 "MachineIndependent/glslang.y" + case 698: /* spirv_instruction_qualifier_list: spirv_instruction_qualifier_list COMMA spirv_instruction_qualifier_id */ +#line 4401 "MachineIndependent/glslang.y" { (yyval.interm.spirvInst) = parseContext.mergeSpirvInstruction((yyvsp[-1].lex).loc, (yyvsp[-2].interm.spirvInst), (yyvsp[0].interm.spirvInst)); } -#line 12247 "MachineIndependent/glslang_tab.cpp" +#line 12401 "MachineIndependent/glslang_tab.cpp" break; - case 685: /* spirv_instruction_qualifier_id: IDENTIFIER EQUAL STRING_LITERAL */ -#line 4414 "MachineIndependent/glslang.y" + case 699: /* spirv_instruction_qualifier_id: IDENTIFIER EQUAL STRING_LITERAL */ +#line 4406 "MachineIndependent/glslang.y" { (yyval.interm.spirvInst) = parseContext.makeSpirvInstruction((yyvsp[-1].lex).loc, *(yyvsp[-2].lex).string, *(yyvsp[0].lex).string); } -#line 12255 "MachineIndependent/glslang_tab.cpp" +#line 12409 "MachineIndependent/glslang_tab.cpp" break; - case 686: /* spirv_instruction_qualifier_id: IDENTIFIER EQUAL INTCONSTANT */ -#line 4417 "MachineIndependent/glslang.y" + case 700: /* spirv_instruction_qualifier_id: IDENTIFIER EQUAL INTCONSTANT */ +#line 4409 "MachineIndependent/glslang.y" { (yyval.interm.spirvInst) = parseContext.makeSpirvInstruction((yyvsp[-1].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[0].lex).i); } -#line 12263 "MachineIndependent/glslang_tab.cpp" +#line 12417 "MachineIndependent/glslang_tab.cpp" break; -#line 12267 "MachineIndependent/glslang_tab.cpp" +#line 12421 "MachineIndependent/glslang_tab.cpp" default: break; } @@ -12339,7 +12493,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } yyerror (pParseContext, yymsgp); if (yysyntax_error_status == YYENOMEM) - goto yyexhaustedlab; + YYNOMEM; } } @@ -12375,6 +12529,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); label yyerrorlab therefore never appears in user code. */ if (0) YYERROR; + ++yynerrs; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ @@ -12435,7 +12590,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); `-------------------------------------*/ yyacceptlab: yyresult = 0; - goto yyreturn; + goto yyreturnlab; /*-----------------------------------. @@ -12443,24 +12598,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); `-----------------------------------*/ yyabortlab: yyresult = 1; - goto yyreturn; + goto yyreturnlab; -#if 1 -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ +/*-----------------------------------------------------------. +| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. | +`-----------------------------------------------------------*/ yyexhaustedlab: yyerror (pParseContext, YY_("memory exhausted")); yyresult = 2; - goto yyreturn; -#endif + goto yyreturnlab; -/*-------------------------------------------------------. -| yyreturn -- parsing is finished, clean up and return. | -`-------------------------------------------------------*/ -yyreturn: +/*----------------------------------------------------------. +| yyreturnlab -- parsing is finished, clean up and return. | +`----------------------------------------------------------*/ +yyreturnlab: if (yychar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at @@ -12488,5 +12641,5 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); return yyresult; } -#line 4422 "MachineIndependent/glslang.y" +#line 4413 "MachineIndependent/glslang.y" diff --git a/third_party/glslang/glslang/MachineIndependent/glslang_tab.cpp.h b/third_party/glslang/glslang/MachineIndependent/glslang_tab.cpp.h index 18cef4688ef..d6484924d61 100644 --- a/third_party/glslang/glslang/MachineIndependent/glslang_tab.cpp.h +++ b/third_party/glslang/glslang/MachineIndependent/glslang_tab.cpp.h @@ -1,8 +1,8 @@ -/* A Bison parser, made by GNU Bison 3.7.4. */ +/* A Bison parser, made by GNU Bison 3.8.2. */ /* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . */ + along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work @@ -217,298 +217,305 @@ extern int yydebug; FCOOPMATNV = 418, /* FCOOPMATNV */ ICOOPMATNV = 419, /* ICOOPMATNV */ UCOOPMATNV = 420, /* UCOOPMATNV */ - SAMPLERCUBEARRAY = 421, /* SAMPLERCUBEARRAY */ - SAMPLERCUBEARRAYSHADOW = 422, /* SAMPLERCUBEARRAYSHADOW */ - ISAMPLERCUBEARRAY = 423, /* ISAMPLERCUBEARRAY */ - USAMPLERCUBEARRAY = 424, /* USAMPLERCUBEARRAY */ - SAMPLER1D = 425, /* SAMPLER1D */ - SAMPLER1DARRAY = 426, /* SAMPLER1DARRAY */ - SAMPLER1DARRAYSHADOW = 427, /* SAMPLER1DARRAYSHADOW */ - ISAMPLER1D = 428, /* ISAMPLER1D */ - SAMPLER1DSHADOW = 429, /* SAMPLER1DSHADOW */ - SAMPLER2DRECT = 430, /* SAMPLER2DRECT */ - SAMPLER2DRECTSHADOW = 431, /* SAMPLER2DRECTSHADOW */ - ISAMPLER2DRECT = 432, /* ISAMPLER2DRECT */ - USAMPLER2DRECT = 433, /* USAMPLER2DRECT */ - SAMPLERBUFFER = 434, /* SAMPLERBUFFER */ - ISAMPLERBUFFER = 435, /* ISAMPLERBUFFER */ - USAMPLERBUFFER = 436, /* USAMPLERBUFFER */ - SAMPLER2DMS = 437, /* SAMPLER2DMS */ - ISAMPLER2DMS = 438, /* ISAMPLER2DMS */ - USAMPLER2DMS = 439, /* USAMPLER2DMS */ - SAMPLER2DMSARRAY = 440, /* SAMPLER2DMSARRAY */ - ISAMPLER2DMSARRAY = 441, /* ISAMPLER2DMSARRAY */ - USAMPLER2DMSARRAY = 442, /* USAMPLER2DMSARRAY */ - SAMPLEREXTERNALOES = 443, /* SAMPLEREXTERNALOES */ - SAMPLEREXTERNAL2DY2YEXT = 444, /* SAMPLEREXTERNAL2DY2YEXT */ - ISAMPLER1DARRAY = 445, /* ISAMPLER1DARRAY */ - USAMPLER1D = 446, /* USAMPLER1D */ - USAMPLER1DARRAY = 447, /* USAMPLER1DARRAY */ - F16SAMPLER1D = 448, /* F16SAMPLER1D */ - F16SAMPLER2D = 449, /* F16SAMPLER2D */ - F16SAMPLER3D = 450, /* F16SAMPLER3D */ - F16SAMPLER2DRECT = 451, /* F16SAMPLER2DRECT */ - F16SAMPLERCUBE = 452, /* F16SAMPLERCUBE */ - F16SAMPLER1DARRAY = 453, /* F16SAMPLER1DARRAY */ - F16SAMPLER2DARRAY = 454, /* F16SAMPLER2DARRAY */ - F16SAMPLERCUBEARRAY = 455, /* F16SAMPLERCUBEARRAY */ - F16SAMPLERBUFFER = 456, /* F16SAMPLERBUFFER */ - F16SAMPLER2DMS = 457, /* F16SAMPLER2DMS */ - F16SAMPLER2DMSARRAY = 458, /* F16SAMPLER2DMSARRAY */ - F16SAMPLER1DSHADOW = 459, /* F16SAMPLER1DSHADOW */ - F16SAMPLER2DSHADOW = 460, /* F16SAMPLER2DSHADOW */ - F16SAMPLER1DARRAYSHADOW = 461, /* F16SAMPLER1DARRAYSHADOW */ - F16SAMPLER2DARRAYSHADOW = 462, /* F16SAMPLER2DARRAYSHADOW */ - F16SAMPLER2DRECTSHADOW = 463, /* F16SAMPLER2DRECTSHADOW */ - F16SAMPLERCUBESHADOW = 464, /* F16SAMPLERCUBESHADOW */ - F16SAMPLERCUBEARRAYSHADOW = 465, /* F16SAMPLERCUBEARRAYSHADOW */ - IMAGE1D = 466, /* IMAGE1D */ - IIMAGE1D = 467, /* IIMAGE1D */ - UIMAGE1D = 468, /* UIMAGE1D */ - IMAGE2D = 469, /* IMAGE2D */ - IIMAGE2D = 470, /* IIMAGE2D */ - UIMAGE2D = 471, /* UIMAGE2D */ - IMAGE3D = 472, /* IMAGE3D */ - IIMAGE3D = 473, /* IIMAGE3D */ - UIMAGE3D = 474, /* UIMAGE3D */ - IMAGE2DRECT = 475, /* IMAGE2DRECT */ - IIMAGE2DRECT = 476, /* IIMAGE2DRECT */ - UIMAGE2DRECT = 477, /* UIMAGE2DRECT */ - IMAGECUBE = 478, /* IMAGECUBE */ - IIMAGECUBE = 479, /* IIMAGECUBE */ - UIMAGECUBE = 480, /* UIMAGECUBE */ - IMAGEBUFFER = 481, /* IMAGEBUFFER */ - IIMAGEBUFFER = 482, /* IIMAGEBUFFER */ - UIMAGEBUFFER = 483, /* UIMAGEBUFFER */ - IMAGE1DARRAY = 484, /* IMAGE1DARRAY */ - IIMAGE1DARRAY = 485, /* IIMAGE1DARRAY */ - UIMAGE1DARRAY = 486, /* UIMAGE1DARRAY */ - IMAGE2DARRAY = 487, /* IMAGE2DARRAY */ - IIMAGE2DARRAY = 488, /* IIMAGE2DARRAY */ - UIMAGE2DARRAY = 489, /* UIMAGE2DARRAY */ - IMAGECUBEARRAY = 490, /* IMAGECUBEARRAY */ - IIMAGECUBEARRAY = 491, /* IIMAGECUBEARRAY */ - UIMAGECUBEARRAY = 492, /* UIMAGECUBEARRAY */ - IMAGE2DMS = 493, /* IMAGE2DMS */ - IIMAGE2DMS = 494, /* IIMAGE2DMS */ - UIMAGE2DMS = 495, /* UIMAGE2DMS */ - IMAGE2DMSARRAY = 496, /* IMAGE2DMSARRAY */ - IIMAGE2DMSARRAY = 497, /* IIMAGE2DMSARRAY */ - UIMAGE2DMSARRAY = 498, /* UIMAGE2DMSARRAY */ - F16IMAGE1D = 499, /* F16IMAGE1D */ - F16IMAGE2D = 500, /* F16IMAGE2D */ - F16IMAGE3D = 501, /* F16IMAGE3D */ - F16IMAGE2DRECT = 502, /* F16IMAGE2DRECT */ - F16IMAGECUBE = 503, /* F16IMAGECUBE */ - F16IMAGE1DARRAY = 504, /* F16IMAGE1DARRAY */ - F16IMAGE2DARRAY = 505, /* F16IMAGE2DARRAY */ - F16IMAGECUBEARRAY = 506, /* F16IMAGECUBEARRAY */ - F16IMAGEBUFFER = 507, /* F16IMAGEBUFFER */ - F16IMAGE2DMS = 508, /* F16IMAGE2DMS */ - F16IMAGE2DMSARRAY = 509, /* F16IMAGE2DMSARRAY */ - I64IMAGE1D = 510, /* I64IMAGE1D */ - U64IMAGE1D = 511, /* U64IMAGE1D */ - I64IMAGE2D = 512, /* I64IMAGE2D */ - U64IMAGE2D = 513, /* U64IMAGE2D */ - I64IMAGE3D = 514, /* I64IMAGE3D */ - U64IMAGE3D = 515, /* U64IMAGE3D */ - I64IMAGE2DRECT = 516, /* I64IMAGE2DRECT */ - U64IMAGE2DRECT = 517, /* U64IMAGE2DRECT */ - I64IMAGECUBE = 518, /* I64IMAGECUBE */ - U64IMAGECUBE = 519, /* U64IMAGECUBE */ - I64IMAGEBUFFER = 520, /* I64IMAGEBUFFER */ - U64IMAGEBUFFER = 521, /* U64IMAGEBUFFER */ - I64IMAGE1DARRAY = 522, /* I64IMAGE1DARRAY */ - U64IMAGE1DARRAY = 523, /* U64IMAGE1DARRAY */ - I64IMAGE2DARRAY = 524, /* I64IMAGE2DARRAY */ - U64IMAGE2DARRAY = 525, /* U64IMAGE2DARRAY */ - I64IMAGECUBEARRAY = 526, /* I64IMAGECUBEARRAY */ - U64IMAGECUBEARRAY = 527, /* U64IMAGECUBEARRAY */ - I64IMAGE2DMS = 528, /* I64IMAGE2DMS */ - U64IMAGE2DMS = 529, /* U64IMAGE2DMS */ - I64IMAGE2DMSARRAY = 530, /* I64IMAGE2DMSARRAY */ - U64IMAGE2DMSARRAY = 531, /* U64IMAGE2DMSARRAY */ - TEXTURECUBEARRAY = 532, /* TEXTURECUBEARRAY */ - ITEXTURECUBEARRAY = 533, /* ITEXTURECUBEARRAY */ - UTEXTURECUBEARRAY = 534, /* UTEXTURECUBEARRAY */ - TEXTURE1D = 535, /* TEXTURE1D */ - ITEXTURE1D = 536, /* ITEXTURE1D */ - UTEXTURE1D = 537, /* UTEXTURE1D */ - TEXTURE1DARRAY = 538, /* TEXTURE1DARRAY */ - ITEXTURE1DARRAY = 539, /* ITEXTURE1DARRAY */ - UTEXTURE1DARRAY = 540, /* UTEXTURE1DARRAY */ - TEXTURE2DRECT = 541, /* TEXTURE2DRECT */ - ITEXTURE2DRECT = 542, /* ITEXTURE2DRECT */ - UTEXTURE2DRECT = 543, /* UTEXTURE2DRECT */ - TEXTUREBUFFER = 544, /* TEXTUREBUFFER */ - ITEXTUREBUFFER = 545, /* ITEXTUREBUFFER */ - UTEXTUREBUFFER = 546, /* UTEXTUREBUFFER */ - TEXTURE2DMS = 547, /* TEXTURE2DMS */ - ITEXTURE2DMS = 548, /* ITEXTURE2DMS */ - UTEXTURE2DMS = 549, /* UTEXTURE2DMS */ - TEXTURE2DMSARRAY = 550, /* TEXTURE2DMSARRAY */ - ITEXTURE2DMSARRAY = 551, /* ITEXTURE2DMSARRAY */ - UTEXTURE2DMSARRAY = 552, /* UTEXTURE2DMSARRAY */ - F16TEXTURE1D = 553, /* F16TEXTURE1D */ - F16TEXTURE2D = 554, /* F16TEXTURE2D */ - F16TEXTURE3D = 555, /* F16TEXTURE3D */ - F16TEXTURE2DRECT = 556, /* F16TEXTURE2DRECT */ - F16TEXTURECUBE = 557, /* F16TEXTURECUBE */ - F16TEXTURE1DARRAY = 558, /* F16TEXTURE1DARRAY */ - F16TEXTURE2DARRAY = 559, /* F16TEXTURE2DARRAY */ - F16TEXTURECUBEARRAY = 560, /* F16TEXTURECUBEARRAY */ - F16TEXTUREBUFFER = 561, /* F16TEXTUREBUFFER */ - F16TEXTURE2DMS = 562, /* F16TEXTURE2DMS */ - F16TEXTURE2DMSARRAY = 563, /* F16TEXTURE2DMSARRAY */ - SUBPASSINPUT = 564, /* SUBPASSINPUT */ - SUBPASSINPUTMS = 565, /* SUBPASSINPUTMS */ - ISUBPASSINPUT = 566, /* ISUBPASSINPUT */ - ISUBPASSINPUTMS = 567, /* ISUBPASSINPUTMS */ - USUBPASSINPUT = 568, /* USUBPASSINPUT */ - USUBPASSINPUTMS = 569, /* USUBPASSINPUTMS */ - F16SUBPASSINPUT = 570, /* F16SUBPASSINPUT */ - F16SUBPASSINPUTMS = 571, /* F16SUBPASSINPUTMS */ - SPIRV_INSTRUCTION = 572, /* SPIRV_INSTRUCTION */ - SPIRV_EXECUTION_MODE = 573, /* SPIRV_EXECUTION_MODE */ - SPIRV_EXECUTION_MODE_ID = 574, /* SPIRV_EXECUTION_MODE_ID */ - SPIRV_DECORATE = 575, /* SPIRV_DECORATE */ - SPIRV_DECORATE_ID = 576, /* SPIRV_DECORATE_ID */ - SPIRV_DECORATE_STRING = 577, /* SPIRV_DECORATE_STRING */ - SPIRV_TYPE = 578, /* SPIRV_TYPE */ - SPIRV_STORAGE_CLASS = 579, /* SPIRV_STORAGE_CLASS */ - SPIRV_BY_REFERENCE = 580, /* SPIRV_BY_REFERENCE */ - SPIRV_LITERAL = 581, /* SPIRV_LITERAL */ - LEFT_OP = 582, /* LEFT_OP */ - RIGHT_OP = 583, /* RIGHT_OP */ - INC_OP = 584, /* INC_OP */ - DEC_OP = 585, /* DEC_OP */ - LE_OP = 586, /* LE_OP */ - GE_OP = 587, /* GE_OP */ - EQ_OP = 588, /* EQ_OP */ - NE_OP = 589, /* NE_OP */ - AND_OP = 590, /* AND_OP */ - OR_OP = 591, /* OR_OP */ - XOR_OP = 592, /* XOR_OP */ - MUL_ASSIGN = 593, /* MUL_ASSIGN */ - DIV_ASSIGN = 594, /* DIV_ASSIGN */ - ADD_ASSIGN = 595, /* ADD_ASSIGN */ - MOD_ASSIGN = 596, /* MOD_ASSIGN */ - LEFT_ASSIGN = 597, /* LEFT_ASSIGN */ - RIGHT_ASSIGN = 598, /* RIGHT_ASSIGN */ - AND_ASSIGN = 599, /* AND_ASSIGN */ - XOR_ASSIGN = 600, /* XOR_ASSIGN */ - OR_ASSIGN = 601, /* OR_ASSIGN */ - SUB_ASSIGN = 602, /* SUB_ASSIGN */ - STRING_LITERAL = 603, /* STRING_LITERAL */ - LEFT_PAREN = 604, /* LEFT_PAREN */ - RIGHT_PAREN = 605, /* RIGHT_PAREN */ - LEFT_BRACKET = 606, /* LEFT_BRACKET */ - RIGHT_BRACKET = 607, /* RIGHT_BRACKET */ - LEFT_BRACE = 608, /* LEFT_BRACE */ - RIGHT_BRACE = 609, /* RIGHT_BRACE */ - DOT = 610, /* DOT */ - COMMA = 611, /* COMMA */ - COLON = 612, /* COLON */ - EQUAL = 613, /* EQUAL */ - SEMICOLON = 614, /* SEMICOLON */ - BANG = 615, /* BANG */ - DASH = 616, /* DASH */ - TILDE = 617, /* TILDE */ - PLUS = 618, /* PLUS */ - STAR = 619, /* STAR */ - SLASH = 620, /* SLASH */ - PERCENT = 621, /* PERCENT */ - LEFT_ANGLE = 622, /* LEFT_ANGLE */ - RIGHT_ANGLE = 623, /* RIGHT_ANGLE */ - VERTICAL_BAR = 624, /* VERTICAL_BAR */ - CARET = 625, /* CARET */ - AMPERSAND = 626, /* AMPERSAND */ - QUESTION = 627, /* QUESTION */ - INVARIANT = 628, /* INVARIANT */ - HIGH_PRECISION = 629, /* HIGH_PRECISION */ - MEDIUM_PRECISION = 630, /* MEDIUM_PRECISION */ - LOW_PRECISION = 631, /* LOW_PRECISION */ - PRECISION = 632, /* PRECISION */ - PACKED = 633, /* PACKED */ - RESOURCE = 634, /* RESOURCE */ - SUPERP = 635, /* SUPERP */ - FLOATCONSTANT = 636, /* FLOATCONSTANT */ - INTCONSTANT = 637, /* INTCONSTANT */ - UINTCONSTANT = 638, /* UINTCONSTANT */ - BOOLCONSTANT = 639, /* BOOLCONSTANT */ - IDENTIFIER = 640, /* IDENTIFIER */ - TYPE_NAME = 641, /* TYPE_NAME */ - CENTROID = 642, /* CENTROID */ - IN = 643, /* IN */ - OUT = 644, /* OUT */ - INOUT = 645, /* INOUT */ - STRUCT = 646, /* STRUCT */ - VOID = 647, /* VOID */ - WHILE = 648, /* WHILE */ - BREAK = 649, /* BREAK */ - CONTINUE = 650, /* CONTINUE */ - DO = 651, /* DO */ - ELSE = 652, /* ELSE */ - FOR = 653, /* FOR */ - IF = 654, /* IF */ - DISCARD = 655, /* DISCARD */ - RETURN = 656, /* RETURN */ - SWITCH = 657, /* SWITCH */ - CASE = 658, /* CASE */ - DEFAULT = 659, /* DEFAULT */ - TERMINATE_INVOCATION = 660, /* TERMINATE_INVOCATION */ - TERMINATE_RAY = 661, /* TERMINATE_RAY */ - IGNORE_INTERSECTION = 662, /* IGNORE_INTERSECTION */ - UNIFORM = 663, /* UNIFORM */ - SHARED = 664, /* SHARED */ - BUFFER = 665, /* BUFFER */ - FLAT = 666, /* FLAT */ - SMOOTH = 667, /* SMOOTH */ - LAYOUT = 668, /* LAYOUT */ - DOUBLECONSTANT = 669, /* DOUBLECONSTANT */ - INT16CONSTANT = 670, /* INT16CONSTANT */ - UINT16CONSTANT = 671, /* UINT16CONSTANT */ - FLOAT16CONSTANT = 672, /* FLOAT16CONSTANT */ - INT32CONSTANT = 673, /* INT32CONSTANT */ - UINT32CONSTANT = 674, /* UINT32CONSTANT */ - INT64CONSTANT = 675, /* INT64CONSTANT */ - UINT64CONSTANT = 676, /* UINT64CONSTANT */ - SUBROUTINE = 677, /* SUBROUTINE */ - DEMOTE = 678, /* DEMOTE */ - PAYLOADNV = 679, /* PAYLOADNV */ - PAYLOADINNV = 680, /* PAYLOADINNV */ - HITATTRNV = 681, /* HITATTRNV */ - CALLDATANV = 682, /* CALLDATANV */ - CALLDATAINNV = 683, /* CALLDATAINNV */ - PAYLOADEXT = 684, /* PAYLOADEXT */ - PAYLOADINEXT = 685, /* PAYLOADINEXT */ - HITATTREXT = 686, /* HITATTREXT */ - CALLDATAEXT = 687, /* CALLDATAEXT */ - CALLDATAINEXT = 688, /* CALLDATAINEXT */ - PATCH = 689, /* PATCH */ - SAMPLE = 690, /* SAMPLE */ - NONUNIFORM = 691, /* NONUNIFORM */ - COHERENT = 692, /* COHERENT */ - VOLATILE = 693, /* VOLATILE */ - RESTRICT = 694, /* RESTRICT */ - READONLY = 695, /* READONLY */ - WRITEONLY = 696, /* WRITEONLY */ - DEVICECOHERENT = 697, /* DEVICECOHERENT */ - QUEUEFAMILYCOHERENT = 698, /* QUEUEFAMILYCOHERENT */ - WORKGROUPCOHERENT = 699, /* WORKGROUPCOHERENT */ - SUBGROUPCOHERENT = 700, /* SUBGROUPCOHERENT */ - NONPRIVATE = 701, /* NONPRIVATE */ - SHADERCALLCOHERENT = 702, /* SHADERCALLCOHERENT */ - NOPERSPECTIVE = 703, /* NOPERSPECTIVE */ - EXPLICITINTERPAMD = 704, /* EXPLICITINTERPAMD */ - PERVERTEXEXT = 705, /* PERVERTEXEXT */ - PERVERTEXNV = 706, /* PERVERTEXNV */ - PERPRIMITIVENV = 707, /* PERPRIMITIVENV */ - PERVIEWNV = 708, /* PERVIEWNV */ - PERTASKNV = 709, /* PERTASKNV */ - PERPRIMITIVEEXT = 710, /* PERPRIMITIVEEXT */ - TASKPAYLOADWORKGROUPEXT = 711, /* TASKPAYLOADWORKGROUPEXT */ - PRECISE = 712 /* PRECISE */ + COOPMAT = 421, /* COOPMAT */ + HITOBJECTNV = 422, /* HITOBJECTNV */ + HITOBJECTATTRNV = 423, /* HITOBJECTATTRNV */ + SAMPLERCUBEARRAY = 424, /* SAMPLERCUBEARRAY */ + SAMPLERCUBEARRAYSHADOW = 425, /* SAMPLERCUBEARRAYSHADOW */ + ISAMPLERCUBEARRAY = 426, /* ISAMPLERCUBEARRAY */ + USAMPLERCUBEARRAY = 427, /* USAMPLERCUBEARRAY */ + SAMPLER1D = 428, /* SAMPLER1D */ + SAMPLER1DARRAY = 429, /* SAMPLER1DARRAY */ + SAMPLER1DARRAYSHADOW = 430, /* SAMPLER1DARRAYSHADOW */ + ISAMPLER1D = 431, /* ISAMPLER1D */ + SAMPLER1DSHADOW = 432, /* SAMPLER1DSHADOW */ + SAMPLER2DRECT = 433, /* SAMPLER2DRECT */ + SAMPLER2DRECTSHADOW = 434, /* SAMPLER2DRECTSHADOW */ + ISAMPLER2DRECT = 435, /* ISAMPLER2DRECT */ + USAMPLER2DRECT = 436, /* USAMPLER2DRECT */ + SAMPLERBUFFER = 437, /* SAMPLERBUFFER */ + ISAMPLERBUFFER = 438, /* ISAMPLERBUFFER */ + USAMPLERBUFFER = 439, /* USAMPLERBUFFER */ + SAMPLER2DMS = 440, /* SAMPLER2DMS */ + ISAMPLER2DMS = 441, /* ISAMPLER2DMS */ + USAMPLER2DMS = 442, /* USAMPLER2DMS */ + SAMPLER2DMSARRAY = 443, /* SAMPLER2DMSARRAY */ + ISAMPLER2DMSARRAY = 444, /* ISAMPLER2DMSARRAY */ + USAMPLER2DMSARRAY = 445, /* USAMPLER2DMSARRAY */ + SAMPLEREXTERNALOES = 446, /* SAMPLEREXTERNALOES */ + SAMPLEREXTERNAL2DY2YEXT = 447, /* SAMPLEREXTERNAL2DY2YEXT */ + ISAMPLER1DARRAY = 448, /* ISAMPLER1DARRAY */ + USAMPLER1D = 449, /* USAMPLER1D */ + USAMPLER1DARRAY = 450, /* USAMPLER1DARRAY */ + F16SAMPLER1D = 451, /* F16SAMPLER1D */ + F16SAMPLER2D = 452, /* F16SAMPLER2D */ + F16SAMPLER3D = 453, /* F16SAMPLER3D */ + F16SAMPLER2DRECT = 454, /* F16SAMPLER2DRECT */ + F16SAMPLERCUBE = 455, /* F16SAMPLERCUBE */ + F16SAMPLER1DARRAY = 456, /* F16SAMPLER1DARRAY */ + F16SAMPLER2DARRAY = 457, /* F16SAMPLER2DARRAY */ + F16SAMPLERCUBEARRAY = 458, /* F16SAMPLERCUBEARRAY */ + F16SAMPLERBUFFER = 459, /* F16SAMPLERBUFFER */ + F16SAMPLER2DMS = 460, /* F16SAMPLER2DMS */ + F16SAMPLER2DMSARRAY = 461, /* F16SAMPLER2DMSARRAY */ + F16SAMPLER1DSHADOW = 462, /* F16SAMPLER1DSHADOW */ + F16SAMPLER2DSHADOW = 463, /* F16SAMPLER2DSHADOW */ + F16SAMPLER1DARRAYSHADOW = 464, /* F16SAMPLER1DARRAYSHADOW */ + F16SAMPLER2DARRAYSHADOW = 465, /* F16SAMPLER2DARRAYSHADOW */ + F16SAMPLER2DRECTSHADOW = 466, /* F16SAMPLER2DRECTSHADOW */ + F16SAMPLERCUBESHADOW = 467, /* F16SAMPLERCUBESHADOW */ + F16SAMPLERCUBEARRAYSHADOW = 468, /* F16SAMPLERCUBEARRAYSHADOW */ + IMAGE1D = 469, /* IMAGE1D */ + IIMAGE1D = 470, /* IIMAGE1D */ + UIMAGE1D = 471, /* UIMAGE1D */ + IMAGE2D = 472, /* IMAGE2D */ + IIMAGE2D = 473, /* IIMAGE2D */ + UIMAGE2D = 474, /* UIMAGE2D */ + IMAGE3D = 475, /* IMAGE3D */ + IIMAGE3D = 476, /* IIMAGE3D */ + UIMAGE3D = 477, /* UIMAGE3D */ + IMAGE2DRECT = 478, /* IMAGE2DRECT */ + IIMAGE2DRECT = 479, /* IIMAGE2DRECT */ + UIMAGE2DRECT = 480, /* UIMAGE2DRECT */ + IMAGECUBE = 481, /* IMAGECUBE */ + IIMAGECUBE = 482, /* IIMAGECUBE */ + UIMAGECUBE = 483, /* UIMAGECUBE */ + IMAGEBUFFER = 484, /* IMAGEBUFFER */ + IIMAGEBUFFER = 485, /* IIMAGEBUFFER */ + UIMAGEBUFFER = 486, /* UIMAGEBUFFER */ + IMAGE1DARRAY = 487, /* IMAGE1DARRAY */ + IIMAGE1DARRAY = 488, /* IIMAGE1DARRAY */ + UIMAGE1DARRAY = 489, /* UIMAGE1DARRAY */ + IMAGE2DARRAY = 490, /* IMAGE2DARRAY */ + IIMAGE2DARRAY = 491, /* IIMAGE2DARRAY */ + UIMAGE2DARRAY = 492, /* UIMAGE2DARRAY */ + IMAGECUBEARRAY = 493, /* IMAGECUBEARRAY */ + IIMAGECUBEARRAY = 494, /* IIMAGECUBEARRAY */ + UIMAGECUBEARRAY = 495, /* UIMAGECUBEARRAY */ + IMAGE2DMS = 496, /* IMAGE2DMS */ + IIMAGE2DMS = 497, /* IIMAGE2DMS */ + UIMAGE2DMS = 498, /* UIMAGE2DMS */ + IMAGE2DMSARRAY = 499, /* IMAGE2DMSARRAY */ + IIMAGE2DMSARRAY = 500, /* IIMAGE2DMSARRAY */ + UIMAGE2DMSARRAY = 501, /* UIMAGE2DMSARRAY */ + F16IMAGE1D = 502, /* F16IMAGE1D */ + F16IMAGE2D = 503, /* F16IMAGE2D */ + F16IMAGE3D = 504, /* F16IMAGE3D */ + F16IMAGE2DRECT = 505, /* F16IMAGE2DRECT */ + F16IMAGECUBE = 506, /* F16IMAGECUBE */ + F16IMAGE1DARRAY = 507, /* F16IMAGE1DARRAY */ + F16IMAGE2DARRAY = 508, /* F16IMAGE2DARRAY */ + F16IMAGECUBEARRAY = 509, /* F16IMAGECUBEARRAY */ + F16IMAGEBUFFER = 510, /* F16IMAGEBUFFER */ + F16IMAGE2DMS = 511, /* F16IMAGE2DMS */ + F16IMAGE2DMSARRAY = 512, /* F16IMAGE2DMSARRAY */ + I64IMAGE1D = 513, /* I64IMAGE1D */ + U64IMAGE1D = 514, /* U64IMAGE1D */ + I64IMAGE2D = 515, /* I64IMAGE2D */ + U64IMAGE2D = 516, /* U64IMAGE2D */ + I64IMAGE3D = 517, /* I64IMAGE3D */ + U64IMAGE3D = 518, /* U64IMAGE3D */ + I64IMAGE2DRECT = 519, /* I64IMAGE2DRECT */ + U64IMAGE2DRECT = 520, /* U64IMAGE2DRECT */ + I64IMAGECUBE = 521, /* I64IMAGECUBE */ + U64IMAGECUBE = 522, /* U64IMAGECUBE */ + I64IMAGEBUFFER = 523, /* I64IMAGEBUFFER */ + U64IMAGEBUFFER = 524, /* U64IMAGEBUFFER */ + I64IMAGE1DARRAY = 525, /* I64IMAGE1DARRAY */ + U64IMAGE1DARRAY = 526, /* U64IMAGE1DARRAY */ + I64IMAGE2DARRAY = 527, /* I64IMAGE2DARRAY */ + U64IMAGE2DARRAY = 528, /* U64IMAGE2DARRAY */ + I64IMAGECUBEARRAY = 529, /* I64IMAGECUBEARRAY */ + U64IMAGECUBEARRAY = 530, /* U64IMAGECUBEARRAY */ + I64IMAGE2DMS = 531, /* I64IMAGE2DMS */ + U64IMAGE2DMS = 532, /* U64IMAGE2DMS */ + I64IMAGE2DMSARRAY = 533, /* I64IMAGE2DMSARRAY */ + U64IMAGE2DMSARRAY = 534, /* U64IMAGE2DMSARRAY */ + TEXTURECUBEARRAY = 535, /* TEXTURECUBEARRAY */ + ITEXTURECUBEARRAY = 536, /* ITEXTURECUBEARRAY */ + UTEXTURECUBEARRAY = 537, /* UTEXTURECUBEARRAY */ + TEXTURE1D = 538, /* TEXTURE1D */ + ITEXTURE1D = 539, /* ITEXTURE1D */ + UTEXTURE1D = 540, /* UTEXTURE1D */ + TEXTURE1DARRAY = 541, /* TEXTURE1DARRAY */ + ITEXTURE1DARRAY = 542, /* ITEXTURE1DARRAY */ + UTEXTURE1DARRAY = 543, /* UTEXTURE1DARRAY */ + TEXTURE2DRECT = 544, /* TEXTURE2DRECT */ + ITEXTURE2DRECT = 545, /* ITEXTURE2DRECT */ + UTEXTURE2DRECT = 546, /* UTEXTURE2DRECT */ + TEXTUREBUFFER = 547, /* TEXTUREBUFFER */ + ITEXTUREBUFFER = 548, /* ITEXTUREBUFFER */ + UTEXTUREBUFFER = 549, /* UTEXTUREBUFFER */ + TEXTURE2DMS = 550, /* TEXTURE2DMS */ + ITEXTURE2DMS = 551, /* ITEXTURE2DMS */ + UTEXTURE2DMS = 552, /* UTEXTURE2DMS */ + TEXTURE2DMSARRAY = 553, /* TEXTURE2DMSARRAY */ + ITEXTURE2DMSARRAY = 554, /* ITEXTURE2DMSARRAY */ + UTEXTURE2DMSARRAY = 555, /* UTEXTURE2DMSARRAY */ + F16TEXTURE1D = 556, /* F16TEXTURE1D */ + F16TEXTURE2D = 557, /* F16TEXTURE2D */ + F16TEXTURE3D = 558, /* F16TEXTURE3D */ + F16TEXTURE2DRECT = 559, /* F16TEXTURE2DRECT */ + F16TEXTURECUBE = 560, /* F16TEXTURECUBE */ + F16TEXTURE1DARRAY = 561, /* F16TEXTURE1DARRAY */ + F16TEXTURE2DARRAY = 562, /* F16TEXTURE2DARRAY */ + F16TEXTURECUBEARRAY = 563, /* F16TEXTURECUBEARRAY */ + F16TEXTUREBUFFER = 564, /* F16TEXTUREBUFFER */ + F16TEXTURE2DMS = 565, /* F16TEXTURE2DMS */ + F16TEXTURE2DMSARRAY = 566, /* F16TEXTURE2DMSARRAY */ + SUBPASSINPUT = 567, /* SUBPASSINPUT */ + SUBPASSINPUTMS = 568, /* SUBPASSINPUTMS */ + ISUBPASSINPUT = 569, /* ISUBPASSINPUT */ + ISUBPASSINPUTMS = 570, /* ISUBPASSINPUTMS */ + USUBPASSINPUT = 571, /* USUBPASSINPUT */ + USUBPASSINPUTMS = 572, /* USUBPASSINPUTMS */ + F16SUBPASSINPUT = 573, /* F16SUBPASSINPUT */ + F16SUBPASSINPUTMS = 574, /* F16SUBPASSINPUTMS */ + SPIRV_INSTRUCTION = 575, /* SPIRV_INSTRUCTION */ + SPIRV_EXECUTION_MODE = 576, /* SPIRV_EXECUTION_MODE */ + SPIRV_EXECUTION_MODE_ID = 577, /* SPIRV_EXECUTION_MODE_ID */ + SPIRV_DECORATE = 578, /* SPIRV_DECORATE */ + SPIRV_DECORATE_ID = 579, /* SPIRV_DECORATE_ID */ + SPIRV_DECORATE_STRING = 580, /* SPIRV_DECORATE_STRING */ + SPIRV_TYPE = 581, /* SPIRV_TYPE */ + SPIRV_STORAGE_CLASS = 582, /* SPIRV_STORAGE_CLASS */ + SPIRV_BY_REFERENCE = 583, /* SPIRV_BY_REFERENCE */ + SPIRV_LITERAL = 584, /* SPIRV_LITERAL */ + ATTACHMENTEXT = 585, /* ATTACHMENTEXT */ + IATTACHMENTEXT = 586, /* IATTACHMENTEXT */ + UATTACHMENTEXT = 587, /* UATTACHMENTEXT */ + LEFT_OP = 588, /* LEFT_OP */ + RIGHT_OP = 589, /* RIGHT_OP */ + INC_OP = 590, /* INC_OP */ + DEC_OP = 591, /* DEC_OP */ + LE_OP = 592, /* LE_OP */ + GE_OP = 593, /* GE_OP */ + EQ_OP = 594, /* EQ_OP */ + NE_OP = 595, /* NE_OP */ + AND_OP = 596, /* AND_OP */ + OR_OP = 597, /* OR_OP */ + XOR_OP = 598, /* XOR_OP */ + MUL_ASSIGN = 599, /* MUL_ASSIGN */ + DIV_ASSIGN = 600, /* DIV_ASSIGN */ + ADD_ASSIGN = 601, /* ADD_ASSIGN */ + MOD_ASSIGN = 602, /* MOD_ASSIGN */ + LEFT_ASSIGN = 603, /* LEFT_ASSIGN */ + RIGHT_ASSIGN = 604, /* RIGHT_ASSIGN */ + AND_ASSIGN = 605, /* AND_ASSIGN */ + XOR_ASSIGN = 606, /* XOR_ASSIGN */ + OR_ASSIGN = 607, /* OR_ASSIGN */ + SUB_ASSIGN = 608, /* SUB_ASSIGN */ + STRING_LITERAL = 609, /* STRING_LITERAL */ + LEFT_PAREN = 610, /* LEFT_PAREN */ + RIGHT_PAREN = 611, /* RIGHT_PAREN */ + LEFT_BRACKET = 612, /* LEFT_BRACKET */ + RIGHT_BRACKET = 613, /* RIGHT_BRACKET */ + LEFT_BRACE = 614, /* LEFT_BRACE */ + RIGHT_BRACE = 615, /* RIGHT_BRACE */ + DOT = 616, /* DOT */ + COMMA = 617, /* COMMA */ + COLON = 618, /* COLON */ + EQUAL = 619, /* EQUAL */ + SEMICOLON = 620, /* SEMICOLON */ + BANG = 621, /* BANG */ + DASH = 622, /* DASH */ + TILDE = 623, /* TILDE */ + PLUS = 624, /* PLUS */ + STAR = 625, /* STAR */ + SLASH = 626, /* SLASH */ + PERCENT = 627, /* PERCENT */ + LEFT_ANGLE = 628, /* LEFT_ANGLE */ + RIGHT_ANGLE = 629, /* RIGHT_ANGLE */ + VERTICAL_BAR = 630, /* VERTICAL_BAR */ + CARET = 631, /* CARET */ + AMPERSAND = 632, /* AMPERSAND */ + QUESTION = 633, /* QUESTION */ + INVARIANT = 634, /* INVARIANT */ + HIGH_PRECISION = 635, /* HIGH_PRECISION */ + MEDIUM_PRECISION = 636, /* MEDIUM_PRECISION */ + LOW_PRECISION = 637, /* LOW_PRECISION */ + PRECISION = 638, /* PRECISION */ + PACKED = 639, /* PACKED */ + RESOURCE = 640, /* RESOURCE */ + SUPERP = 641, /* SUPERP */ + FLOATCONSTANT = 642, /* FLOATCONSTANT */ + INTCONSTANT = 643, /* INTCONSTANT */ + UINTCONSTANT = 644, /* UINTCONSTANT */ + BOOLCONSTANT = 645, /* BOOLCONSTANT */ + IDENTIFIER = 646, /* IDENTIFIER */ + TYPE_NAME = 647, /* TYPE_NAME */ + CENTROID = 648, /* CENTROID */ + IN = 649, /* IN */ + OUT = 650, /* OUT */ + INOUT = 651, /* INOUT */ + STRUCT = 652, /* STRUCT */ + VOID = 653, /* VOID */ + WHILE = 654, /* WHILE */ + BREAK = 655, /* BREAK */ + CONTINUE = 656, /* CONTINUE */ + DO = 657, /* DO */ + ELSE = 658, /* ELSE */ + FOR = 659, /* FOR */ + IF = 660, /* IF */ + DISCARD = 661, /* DISCARD */ + RETURN = 662, /* RETURN */ + SWITCH = 663, /* SWITCH */ + CASE = 664, /* CASE */ + DEFAULT = 665, /* DEFAULT */ + TERMINATE_INVOCATION = 666, /* TERMINATE_INVOCATION */ + TERMINATE_RAY = 667, /* TERMINATE_RAY */ + IGNORE_INTERSECTION = 668, /* IGNORE_INTERSECTION */ + UNIFORM = 669, /* UNIFORM */ + SHARED = 670, /* SHARED */ + BUFFER = 671, /* BUFFER */ + TILEIMAGEEXT = 672, /* TILEIMAGEEXT */ + FLAT = 673, /* FLAT */ + SMOOTH = 674, /* SMOOTH */ + LAYOUT = 675, /* LAYOUT */ + DOUBLECONSTANT = 676, /* DOUBLECONSTANT */ + INT16CONSTANT = 677, /* INT16CONSTANT */ + UINT16CONSTANT = 678, /* UINT16CONSTANT */ + FLOAT16CONSTANT = 679, /* FLOAT16CONSTANT */ + INT32CONSTANT = 680, /* INT32CONSTANT */ + UINT32CONSTANT = 681, /* UINT32CONSTANT */ + INT64CONSTANT = 682, /* INT64CONSTANT */ + UINT64CONSTANT = 683, /* UINT64CONSTANT */ + SUBROUTINE = 684, /* SUBROUTINE */ + DEMOTE = 685, /* DEMOTE */ + PAYLOADNV = 686, /* PAYLOADNV */ + PAYLOADINNV = 687, /* PAYLOADINNV */ + HITATTRNV = 688, /* HITATTRNV */ + CALLDATANV = 689, /* CALLDATANV */ + CALLDATAINNV = 690, /* CALLDATAINNV */ + PAYLOADEXT = 691, /* PAYLOADEXT */ + PAYLOADINEXT = 692, /* PAYLOADINEXT */ + HITATTREXT = 693, /* HITATTREXT */ + CALLDATAEXT = 694, /* CALLDATAEXT */ + CALLDATAINEXT = 695, /* CALLDATAINEXT */ + PATCH = 696, /* PATCH */ + SAMPLE = 697, /* SAMPLE */ + NONUNIFORM = 698, /* NONUNIFORM */ + COHERENT = 699, /* COHERENT */ + VOLATILE = 700, /* VOLATILE */ + RESTRICT = 701, /* RESTRICT */ + READONLY = 702, /* READONLY */ + WRITEONLY = 703, /* WRITEONLY */ + DEVICECOHERENT = 704, /* DEVICECOHERENT */ + QUEUEFAMILYCOHERENT = 705, /* QUEUEFAMILYCOHERENT */ + WORKGROUPCOHERENT = 706, /* WORKGROUPCOHERENT */ + SUBGROUPCOHERENT = 707, /* SUBGROUPCOHERENT */ + NONPRIVATE = 708, /* NONPRIVATE */ + SHADERCALLCOHERENT = 709, /* SHADERCALLCOHERENT */ + NOPERSPECTIVE = 710, /* NOPERSPECTIVE */ + EXPLICITINTERPAMD = 711, /* EXPLICITINTERPAMD */ + PERVERTEXEXT = 712, /* PERVERTEXEXT */ + PERVERTEXNV = 713, /* PERVERTEXNV */ + PERPRIMITIVENV = 714, /* PERPRIMITIVENV */ + PERVIEWNV = 715, /* PERVIEWNV */ + PERTASKNV = 716, /* PERTASKNV */ + PERPRIMITIVEEXT = 717, /* PERPRIMITIVEEXT */ + TASKPAYLOADWORKGROUPEXT = 718, /* TASKPAYLOADWORKGROUPEXT */ + PRECISE = 719 /* PRECISE */ }; typedef enum yytokentype yytoken_kind_t; #endif @@ -517,7 +524,7 @@ extern int yydebug; #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { -#line 97 "MachineIndependent/glslang.y" +#line 72 "MachineIndependent/glslang.y" struct { glslang::TSourceLoc loc; @@ -553,10 +560,10 @@ union YYSTYPE glslang::TArraySizes* arraySizes; glslang::TIdentifierList* identifierList; }; - glslang::TArraySizes* typeParameters; + glslang::TTypeParameters* typeParameters; } interm; -#line 560 "MachineIndependent/glslang_tab.cpp.h" +#line 567 "MachineIndependent/glslang_tab.cpp.h" }; typedef union YYSTYPE YYSTYPE; @@ -566,6 +573,8 @@ typedef union YYSTYPE YYSTYPE; + int yyparse (glslang::TParseContext* pParseContext); + #endif /* !YY_YY_MACHINEINDEPENDENT_GLSLANG_TAB_CPP_H_INCLUDED */ diff --git a/third_party/glslang/glslang/MachineIndependent/intermOut.cpp b/third_party/glslang/glslang/MachineIndependent/intermOut.cpp index 987556128ba..32c3c573f95 100644 --- a/third_party/glslang/glslang/MachineIndependent/intermOut.cpp +++ b/third_party/glslang/glslang/MachineIndependent/intermOut.cpp @@ -36,8 +36,6 @@ // POSSIBILITY OF SUCH DAMAGE. // -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - #include "localintermediate.h" #include "../Include/InfoSink.h" @@ -663,13 +661,13 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node) case EOpSubpassLoad: out.debug << "subpassLoad"; break; case EOpSubpassLoadMS: out.debug << "subpassLoadMS"; break; + case EOpColorAttachmentReadEXT: out.debug << "colorAttachmentReadEXT"; break; + case EOpConstructReference: out.debug << "Construct reference type"; break; case EOpDeclare: out.debug << "Declare"; break; -#ifndef GLSLANG_WEB case EOpSpirvInst: out.debug << "spirv_instruction"; break; -#endif default: out.debug.message(EPrefixError, "Bad unary op"); } @@ -807,7 +805,8 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node case EOpConstructStruct: out.debug << "Construct structure"; break; case EOpConstructTextureSampler: out.debug << "Construct combined texture-sampler"; break; case EOpConstructReference: out.debug << "Construct reference"; break; - case EOpConstructCooperativeMatrix: out.debug << "Construct cooperative matrix"; break; + case EOpConstructCooperativeMatrixNV: out.debug << "Construct cooperative matrix NV"; break; + case EOpConstructCooperativeMatrixKHR: out.debug << "Construct cooperative matrix KHR"; break; case EOpConstructAccStruct: out.debug << "Construct acceleration structure"; break; case EOpLessThan: out.debug << "Compare Less Than"; break; @@ -1060,6 +1059,8 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node case EOpSubpassLoad: out.debug << "subpassLoad"; break; case EOpSubpassLoadMS: out.debug << "subpassLoadMS"; break; + case EOpColorAttachmentReadEXT: out.debug << "colorAttachmentReadEXT"; break; + case EOpTraceNV: out.debug << "traceNV"; break; case EOpTraceRayMotionNV: out.debug << "traceRayMotionNV"; break; case EOpTraceKHR: out.debug << "traceRayKHR"; break; @@ -1097,17 +1098,55 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node case EOpRayQueryGetWorldRayOrigin: out.debug << "rayQueryGetWorldRayOriginEXT"; break; case EOpRayQueryGetIntersectionObjectToWorld: out.debug << "rayQueryGetIntersectionObjectToWorldEXT"; break; case EOpRayQueryGetIntersectionWorldToObject: out.debug << "rayQueryGetIntersectionWorldToObjectEXT"; break; + case EOpRayQueryGetIntersectionTriangleVertexPositionsEXT: out.debug << "rayQueryGetIntersectionTriangleVertexPositionsEXT"; break; - case EOpCooperativeMatrixLoad: out.debug << "Load cooperative matrix"; break; - case EOpCooperativeMatrixStore: out.debug << "Store cooperative matrix"; break; - case EOpCooperativeMatrixMulAdd: out.debug << "MulAdd cooperative matrices"; break; + case EOpCooperativeMatrixLoad: out.debug << "Load cooperative matrix KHR"; break; + case EOpCooperativeMatrixStore: out.debug << "Store cooperative matrix KHR"; break; + case EOpCooperativeMatrixMulAdd: out.debug << "MulAdd cooperative matrices KHR"; break; + case EOpCooperativeMatrixLoadNV: out.debug << "Load cooperative matrix NV"; break; + case EOpCooperativeMatrixStoreNV: out.debug << "Store cooperative matrix NV"; break; + case EOpCooperativeMatrixMulAddNV: out.debug << "MulAdd cooperative matrices NV"; break; case EOpIsHelperInvocation: out.debug << "IsHelperInvocation"; break; case EOpDebugPrintf: out.debug << "Debug printf"; break; -#ifndef GLSLANG_WEB + case EOpHitObjectTraceRayNV: out.debug << "HitObjectTraceRayNV"; break; + case EOpHitObjectTraceRayMotionNV: out.debug << "HitObjectTraceRayMotionNV"; break; + case EOpHitObjectRecordHitNV: out.debug << "HitObjectRecordHitNV"; break; + case EOpHitObjectRecordHitMotionNV: out.debug << "HitObjectRecordHitMotionNV"; break; + case EOpHitObjectRecordHitWithIndexNV: out.debug << "HitObjectRecordHitWithIndexNV"; break; + case EOpHitObjectRecordHitWithIndexMotionNV: out.debug << "HitObjectRecordHitWithIndexMotionNV"; break; + case EOpHitObjectRecordMissNV: out.debug << "HitObjectRecordMissNV"; break; + case EOpHitObjectRecordMissMotionNV: out.debug << "HitObjectRecordMissMotionNV"; break; + case EOpHitObjectRecordEmptyNV: out.debug << "HitObjectRecordEmptyNV"; break; + case EOpHitObjectExecuteShaderNV: out.debug << "HitObjectExecuteShaderNV"; break; + case EOpHitObjectIsEmptyNV: out.debug << "HitObjectIsEmptyNV"; break; + case EOpHitObjectIsMissNV: out.debug << "HitObjectIsMissNV"; break; + case EOpHitObjectIsHitNV: out.debug << "HitObjectIsHitNV"; break; + case EOpHitObjectGetRayTMinNV: out.debug << "HitObjectGetRayTMinNV"; break; + case EOpHitObjectGetRayTMaxNV: out.debug << "HitObjectGetRayTMaxNV"; break; + case EOpHitObjectGetObjectRayOriginNV: out.debug << "HitObjectGetObjectRayOriginNV"; break; + case EOpHitObjectGetObjectRayDirectionNV: out.debug << "HitObjectGetObjectRayDirectionNV"; break; + case EOpHitObjectGetWorldRayOriginNV: out.debug << "HitObjectGetWorldRayOriginNV"; break; + case EOpHitObjectGetWorldRayDirectionNV: out.debug << "HitObjectGetWorldRayDirectionNV"; break; + case EOpHitObjectGetObjectToWorldNV: out.debug << "HitObjectGetObjectToWorldNV"; break; + case EOpHitObjectGetWorldToObjectNV: out.debug << "HitObjectGetWorldToObjectNV"; break; + case EOpHitObjectGetInstanceCustomIndexNV: out.debug<< "HitObjectGetInstanceCustomIndexNV"; break; + case EOpHitObjectGetInstanceIdNV: out.debug << "HitObjectGetInstaneIdNV"; break; + case EOpHitObjectGetGeometryIndexNV: out.debug << "HitObjectGetGeometryIndexNV"; break; + case EOpHitObjectGetPrimitiveIndexNV: out.debug << "HitObjectGetPrimitiveIndexNV"; break; + case EOpHitObjectGetHitKindNV: out.debug << "HitObjectGetHitKindNV"; break; + case EOpHitObjectGetAttributesNV: out.debug << "HitObjectGetAttributesNV"; break; + case EOpHitObjectGetCurrentTimeNV: out.debug << "HitObjectGetCurrentTimeNV"; break; + case EOpHitObjectGetShaderBindingTableRecordIndexNV: out.debug << "HitObjectGetShaderBindingTableRecordIndexNV"; break; + case EOpHitObjectGetShaderRecordBufferHandleNV: out.debug << "HitObjectReadShaderRecordBufferHandleNV"; break; + case EOpReorderThreadNV: out.debug << "ReorderThreadNV"; break; + case EOpFetchMicroTriangleVertexPositionNV: out.debug << "MicroTriangleVertexPositionNV"; break; + case EOpFetchMicroTriangleVertexBarycentricNV: out.debug << "MicroTriangleVertexBarycentricNV"; break; + case EOpSpirvInst: out.debug << "spirv_instruction"; break; -#endif + case EOpStencilAttachmentReadEXT: out.debug << "stencilAttachmentReadEXT"; break; + case EOpDepthAttachmentReadEXT: out.debug << "depthAttachmentReadEXT"; break; default: out.debug.message(EPrefixError, "Bad aggregation op"); } @@ -1512,6 +1551,12 @@ void TIntermediate::output(TInfoSink& infoSink, bool tree) infoSink.debug << "using early_fragment_tests\n"; if (postDepthCoverage) infoSink.debug << "using post_depth_coverage\n"; + if (nonCoherentColorAttachmentReadEXT) + infoSink.debug << "using non_coherent_color_attachment_readEXT\n"; + if (nonCoherentDepthAttachmentReadEXT) + infoSink.debug << "using non_coherent_depth_attachment_readEXT\n"; + if (nonCoherentStencilAttachmentReadEXT) + infoSink.debug << "using non_coherent_stencil_attachment_readEXT\n"; if (depthLayout != EldNone) infoSink.debug << "using " << TQualifier::getLayoutDepthString(depthLayout) << "\n"; if (blendEquations != 0) { @@ -1552,7 +1597,7 @@ void TIntermediate::output(TInfoSink& infoSink, bool tree) break; } - if (treeRoot == 0 || ! tree) + if (treeRoot == nullptr || ! tree) return; TOutputTraverser it(infoSink); @@ -1562,5 +1607,3 @@ void TIntermediate::output(TInfoSink& infoSink, bool tree) } } // end namespace glslang - -#endif // !GLSLANG_WEB && !GLSLANG_ANGLE diff --git a/third_party/glslang/glslang/MachineIndependent/iomapper.cpp b/third_party/glslang/glslang/MachineIndependent/iomapper.cpp index 4250e92da60..63dedf76c65 100644 --- a/third_party/glslang/glslang/MachineIndependent/iomapper.cpp +++ b/third_party/glslang/glslang/MachineIndependent/iomapper.cpp @@ -33,8 +33,6 @@ // POSSIBILITY OF SUCH DAMAGE. // -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - #include "../Include/Common.h" #include "../Include/InfoSink.h" #include "../Include/Types.h" @@ -145,6 +143,8 @@ class TVarSetTraverser : public TLiveTraverser base->getWritableType().getQualifier().layoutComponent = at->second.newComponent; if (at->second.newIndex != -1) base->getWritableType().getQualifier().layoutIndex = at->second.newIndex; + if (at->second.upgradedToPushConstant) + base->getWritableType().getQualifier().layoutPushConstant = true; } private: @@ -1670,31 +1670,34 @@ bool TGlslIoMapper::doMap(TIoMapResolver* resolver, TInfoSink& infoSink) { } } } - // If it's been upgraded to push_constant, then remove it from the uniformVector + // If it's been upgraded to push_constant, then set the flag so when its traversed + // in the next for loop, all references to this symbol will get their flag changed. // so it doesn't get a set/binding assigned to it. if (upgraded) { - while (1) { - auto at = std::find_if(uniformVector.begin(), uniformVector.end(), - [this](const TVarLivePair& p) { return p.first == autoPushConstantBlockName; }); - if (at != uniformVector.end()) - uniformVector.erase(at); - else - break; - } + std::for_each(uniformVector.begin(), uniformVector.end(), + [this](TVarLivePair& p) { + if (p.first == autoPushConstantBlockName) { + p.second.upgradedToPushConstant = true; + } + }); } } for (size_t stage = 0; stage < EShLangCount; stage++) { if (intermediates[stage] != nullptr) { // traverse each stage, set new location to each input/output and unifom symbol, set new binding to - // ubo, ssbo and opaque symbols + // ubo, ssbo and opaque symbols. Assign push_constant upgrades as well. TVarLiveMap** pUniformVarMap = uniformResolve.uniformVarMap; std::for_each(uniformVector.begin(), uniformVector.end(), [pUniformVarMap, stage](TVarLivePair p) { auto at = pUniformVarMap[stage]->find(p.second.symbol->getAccessName()); if (at != pUniformVarMap[stage]->end() && at->second.id == p.second.id){ - int resolvedBinding = at->second.newBinding; - at->second = p.second; - if (resolvedBinding > 0) - at->second.newBinding = resolvedBinding; + if (p.second.upgradedToPushConstant) { + at->second.upgradedToPushConstant = true; + } else { + int resolvedBinding = at->second.newBinding; + at->second = p.second; + if (resolvedBinding > 0) + at->second.newBinding = resolvedBinding; + } } }); TVarSetTraverser iter_iomap(*intermediates[stage], *inVarMaps[stage], *outVarMaps[stage], @@ -1709,5 +1712,3 @@ bool TGlslIoMapper::doMap(TIoMapResolver* resolver, TInfoSink& infoSink) { } } // end namespace glslang - -#endif // !GLSLANG_WEB && !GLSLANG_ANGLE diff --git a/third_party/glslang/glslang/MachineIndependent/iomapper.h b/third_party/glslang/glslang/MachineIndependent/iomapper.h index ba7bc3bbc7f..35babbce1bb 100644 --- a/third_party/glslang/glslang/MachineIndependent/iomapper.h +++ b/third_party/glslang/glslang/MachineIndependent/iomapper.h @@ -33,8 +33,6 @@ // POSSIBILITY OF SUCH DAMAGE. // -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - #ifndef _IOMAPPER_INCLUDED #define _IOMAPPER_INCLUDED @@ -55,6 +53,7 @@ struct TVarEntryInfo { long long id; TIntermSymbol* symbol; bool live; + bool upgradedToPushConstant; int newBinding; int newSet; int newLocation; @@ -63,6 +62,7 @@ struct TVarEntryInfo { EShLanguage stage; void clearNewAssignments() { + upgradedToPushConstant = false; newBinding = -1; newSet = -1; newLocation = -1; @@ -357,5 +357,3 @@ class TGlslIoMapper : public TIoMapper { } // end namespace glslang #endif // _IOMAPPER_INCLUDED - -#endif // !GLSLANG_WEB && !GLSLANG_ANGLE diff --git a/third_party/glslang/glslang/MachineIndependent/limits.cpp b/third_party/glslang/glslang/MachineIndependent/limits.cpp index 391570579da..4404beca4f4 100644 --- a/third_party/glslang/glslang/MachineIndependent/limits.cpp +++ b/third_party/glslang/glslang/MachineIndependent/limits.cpp @@ -187,14 +187,12 @@ bool TIndexTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node) // void TParseContext::constantIndexExpressionCheck(TIntermNode* index) { -#ifndef GLSLANG_WEB TIndexTraverser it(inductiveLoopIds); index->traverse(&it); if (it.bad) error(it.badLoc, "Non-constant-index-expression", "limitations", ""); -#endif } } // end namespace glslang diff --git a/third_party/glslang/glslang/MachineIndependent/linkValidate.cpp b/third_party/glslang/glslang/MachineIndependent/linkValidate.cpp index e8ef5aefd12..d69300b84d4 100755 --- a/third_party/glslang/glslang/MachineIndependent/linkValidate.cpp +++ b/third_party/glslang/glslang/MachineIndependent/linkValidate.cpp @@ -57,13 +57,11 @@ namespace glslang { // void TIntermediate::error(TInfoSink& infoSink, const char* message, EShLanguage unitStage) { -#ifndef GLSLANG_WEB infoSink.info.prefix(EPrefixError); if (unitStage < EShLangCount) infoSink.info << "Linking " << StageName(getStage()) << " and " << StageName(unitStage) << " stages: " << message << "\n"; else infoSink.info << "Linking " << StageName(language) << " stage: " << message << "\n"; -#endif ++numErrors; } @@ -71,13 +69,11 @@ void TIntermediate::error(TInfoSink& infoSink, const char* message, EShLanguage // Link-time warning. void TIntermediate::warn(TInfoSink& infoSink, const char* message, EShLanguage unitStage) { -#ifndef GLSLANG_WEB infoSink.info.prefix(EPrefixWarning); if (unitStage < EShLangCount) infoSink.info << "Linking " << StageName(language) << " and " << StageName(unitStage) << " stages: " << message << "\n"; else infoSink.info << "Linking " << StageName(language) << " stage: " << message << "\n"; -#endif } // TODO: 4.4 offset/align: "Two blocks linked together in the same program with the same block @@ -89,11 +85,9 @@ void TIntermediate::warn(TInfoSink& infoSink, const char* message, EShLanguage u // void TIntermediate::merge(TInfoSink& infoSink, TIntermediate& unit) { -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) mergeCallGraphs(infoSink, unit); mergeModes(infoSink, unit); mergeTrees(infoSink, unit); -#endif } // @@ -161,8 +155,6 @@ void TIntermediate::mergeCallGraphs(TInfoSink& infoSink, TIntermediate& unit) callGraph.insert(callGraph.end(), unit.callGraph.begin(), unit.callGraph.end()); } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - #define MERGE_MAX(member) member = std::max(member, unit.member) #define MERGE_TRUE(member) if (unit.member) member = unit.member; @@ -271,6 +263,9 @@ void TIntermediate::mergeModes(TInfoSink& infoSink, TIntermediate& unit) MERGE_TRUE(earlyFragmentTests); MERGE_TRUE(postDepthCoverage); + MERGE_TRUE(nonCoherentColorAttachmentReadEXT); + MERGE_TRUE(nonCoherentDepthAttachmentReadEXT); + MERGE_TRUE(nonCoherentStencilAttachmentReadEXT); if (depthLayout == EldNone) depthLayout = unit.depthLayout; @@ -378,8 +373,6 @@ void TIntermediate::mergeTrees(TInfoSink& infoSink, TIntermediate& unit) ioAccessed.insert(unit.ioAccessed.begin(), unit.ioAccessed.end()); } -#endif - static const TString& getNameForIdMap(TIntermSymbol* symbol) { TShaderInterface si = symbol->getType().getShaderInterface(); @@ -638,18 +631,18 @@ void TIntermediate::mergeBlockDefinitions(TInfoSink& infoSink, TIntermSymbol* bl class TMergeBlockTraverser : public TIntermTraverser { public: TMergeBlockTraverser(const TIntermSymbol* newSym) - : newSymbol(newSym), unitType(nullptr), unit(nullptr), memberIndexUpdates(nullptr) + : newSymbol(newSym), newType(nullptr), unit(nullptr), memberIndexUpdates(nullptr) { } TMergeBlockTraverser(const TIntermSymbol* newSym, const glslang::TType* unitType, glslang::TIntermediate* unit, const std::map* memberIdxUpdates) - : TIntermTraverser(false, true), newSymbol(newSym), unitType(unitType), unit(unit), memberIndexUpdates(memberIdxUpdates) + : TIntermTraverser(false, true), newSymbol(newSym), newType(unitType), unit(unit), memberIndexUpdates(memberIdxUpdates) { } virtual ~TMergeBlockTraverser() {} const TIntermSymbol* newSymbol; - const glslang::TType* unitType; // copy of original type + const glslang::TType* newType; // shallow copy of the new type glslang::TIntermediate* unit; // intermediate that is being updated const std::map* memberIndexUpdates; @@ -665,10 +658,10 @@ void TIntermediate::mergeBlockDefinitions(TInfoSink& infoSink, TIntermSymbol* bl virtual bool visitBinary(TVisit, glslang::TIntermBinary* node) { - if (!unit || !unitType || !memberIndexUpdates || memberIndexUpdates->empty()) + if (!unit || !newType || !memberIndexUpdates || memberIndexUpdates->empty()) return true; - if (node->getOp() == EOpIndexDirectStruct && node->getLeft()->getType() == *unitType) { + if (node->getOp() == EOpIndexDirectStruct && node->getLeft()->getType() == *newType) { // this is a dereference to a member of the block since the // member list changed, need to update this to point to the // right index @@ -696,9 +689,9 @@ void TIntermediate::mergeBlockDefinitions(TInfoSink& infoSink, TIntermSymbol* bl // The 'unit' intermediate needs the block structures update, but also structure entry indices // may have changed from the old block to the new one that it was merged into, so update those // in 'visitBinary' - TType unitType; - unitType.shallowCopy(unitBlock->getType()); - TMergeBlockTraverser unitFinalLinkTraverser(block, &unitType, unit, &memberIndexUpdates); + TType newType; + newType.shallowCopy(block->getType()); + TMergeBlockTraverser unitFinalLinkTraverser(block, &newType, unit, &memberIndexUpdates); unit->getTreeRoot()->traverse(&unitFinalLinkTraverser); // update the member list @@ -749,6 +742,21 @@ void TIntermediate::mergeLinkerObjects(TInfoSink& infoSink, TIntermSequence& lin symbol->getQualifier().layoutLocation = unitSymbol->getQualifier().layoutLocation; } + // Update implicit array sizes + if (symbol->getWritableType().isImplicitlySizedArray() && unitSymbol->getType().isImplicitlySizedArray()) { + if (unitSymbol->getType().getImplicitArraySize() > symbol->getType().getImplicitArraySize()){ + symbol->getWritableType().updateImplicitArraySize(unitSymbol->getType().getImplicitArraySize()); + } + } + else if (symbol->getWritableType().isImplicitlySizedArray() && unitSymbol->getType().isSizedArray()) { + if (symbol->getWritableType().getImplicitArraySize() > unitSymbol->getType().getOuterArraySize()) + error(infoSink, "Implicit size of unsized array doesn't match same symbol among multiple shaders."); + } + else if (unitSymbol->getType().isImplicitlySizedArray() && symbol->getWritableType().isSizedArray()) { + if (unitSymbol->getType().getImplicitArraySize() > symbol->getWritableType().getOuterArraySize()) + error(infoSink, "Implicit size of unsized array doesn't match same symbol among multiple shaders."); + } + // Update implicit array sizes mergeImplicitArraySizes(symbol->getWritableType(), unitSymbol->getType()); @@ -759,6 +767,19 @@ void TIntermediate::mergeLinkerObjects(TInfoSink& infoSink, TIntermSequence& lin else if (symbol->getQualifier().isPushConstant() && unitSymbol->getQualifier().isPushConstant() && getStage() == unitStage) error(infoSink, "Only one push_constant block is allowed per stage"); } + + // Check conflicts between preset primitives and sizes of I/O variables among multiple geometry shaders + if (language == EShLangGeometry && unitStage == EShLangGeometry) + { + TIntermSymbol* unitSymbol = unitLinkerObjects[unitLinkObj]->getAsSymbolNode(); + if (unitSymbol->isArray() && unitSymbol->getQualifier().storage == EvqVaryingIn && unitSymbol->getQualifier().builtIn == EbvNone) + if ((unitSymbol->getArraySizes()->isImplicitlySized() && + unitSymbol->getArraySizes()->getImplicitSize() != TQualifier::mapGeometryToSize(getInputPrimitive())) || + (! unitSymbol->getArraySizes()->isImplicitlySized() && + unitSymbol->getArraySizes()->getDimSize(0) != TQualifier::mapGeometryToSize(getInputPrimitive()))) + error(infoSink, "Not all array sizes match across all geometry shaders in the program"); + } + if (merge) { linkerObjects.push_back(unitLinkerObjects[unitLinkObj]); @@ -828,7 +849,6 @@ void TIntermediate::mergeImplicitArraySizes(TType& type, const TType& unitType) // void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& symbol, const TIntermSymbol& unitSymbol, EShLanguage unitStage) { -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) bool crossStage = getStage() != unitStage; bool writeTypeComparison = false; bool errorReported = false; @@ -863,7 +883,8 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy else { arraysMatch = symbol.getType().sameArrayness(unitSymbol.getType()) || (symbol.getType().isArray() && unitSymbol.getType().isArray() && - (symbol.getType().isUnsizedArray() || unitSymbol.getType().isUnsizedArray())); + (symbol.getType().isImplicitlySizedArray() || unitSymbol.getType().isImplicitlySizedArray() || + symbol.getType().isUnsizedArray() || unitSymbol.getType().isUnsizedArray())); } int lpidx = -1; @@ -1155,7 +1176,6 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy } } } -#endif } void TIntermediate::sharedBlockCheck(TInfoSink& infoSink) @@ -1202,7 +1222,6 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled) // overlap/alias/missing I/O, etc. inOutLocationCheck(infoSink); -#ifndef GLSLANG_WEB if (getNumPushConstants() > 1) error(infoSink, "Only one push_constant block is allowed per stage"); @@ -1360,7 +1379,6 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled) } finalLinkTraverser; treeRoot->traverse(&finalLinkTraverser); -#endif } // @@ -1383,7 +1401,7 @@ void TIntermediate::checkCallGraphCycles(TInfoSink& infoSink) TCall* newRoot; do { // See if we have unvisited parts of the graph. - newRoot = 0; + newRoot = nullptr; for (TGraph::iterator call = callGraph.begin(); call != callGraph.end(); ++call) { if (! call->visited) { newRoot = &(*call); @@ -1517,7 +1535,10 @@ void TIntermediate::checkCallGraphBodies(TInfoSink& infoSink, bool keepUncalled) if (! keepUncalled) { for (int f = 0; f < (int)functionSequence.size(); ++f) { if (! reachable[f]) + { + resetTopLevelUncalledStatus(functionSequence[f]->getAsAggregate()->getName()); functionSequence[f] = nullptr; + } } functionSequence.erase(std::remove(functionSequence.begin(), functionSequence.end(), nullptr), functionSequence.end()); } @@ -1585,7 +1606,7 @@ bool TIntermediate::userOutputUsed() const return found; } -// Accumulate locations used for inputs, outputs, and uniforms, payload and callable data +// Accumulate locations used for inputs, outputs, and uniforms, payload, callable data, and tileImageEXT // and check for collisions as the accumulation is done. // // Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value. @@ -1598,7 +1619,6 @@ int TIntermediate::addUsedLocation(const TQualifier& qualifier, const TType& typ typeCollision = false; int set; - int setRT; if (qualifier.isPipeInput()) set = 0; else if (qualifier.isPipeOutput()) @@ -1607,10 +1627,14 @@ int TIntermediate::addUsedLocation(const TQualifier& qualifier, const TType& typ set = 2; else if (qualifier.storage == EvqBuffer) set = 3; + else if (qualifier.storage == EvqTileImageEXT) + set = 4; else if (qualifier.isAnyPayload()) - setRT = 0; + set = 0; else if (qualifier.isAnyCallable()) - setRT = 1; + set = 1; + else if (qualifier.isHitObjectAttrNV()) + set = 2; else return -1; @@ -1649,13 +1673,14 @@ int TIntermediate::addUsedLocation(const TQualifier& qualifier, const TType& typ // For raytracing IO (payloads and callabledata) each declaration occupies a single // slot irrespective of type. int collision = -1; // no collision -#ifndef GLSLANG_WEB - if (qualifier.isAnyPayload() || qualifier.isAnyCallable()) { + if (qualifier.isAnyPayload() || qualifier.isAnyCallable() || qualifier.isHitObjectAttrNV()) { TRange range(qualifier.layoutLocation, qualifier.layoutLocation); - collision = checkLocationRT(setRT, qualifier.layoutLocation); + collision = checkLocationRT(set, qualifier.layoutLocation); if (collision < 0) - usedIoRT[setRT].push_back(range); - } else if (size == 2 && type.getBasicType() == EbtDouble && type.getVectorSize() == 3 && + usedIoRT[set].push_back(range); + return collision; + } + if (size == 2 && type.getBasicType() == EbtDouble && type.getVectorSize() == 3 && (qualifier.isPipeInput() || qualifier.isPipeOutput())) { // Dealing with dvec3 in/out split across two locations. // Need two io-ranges. @@ -1681,31 +1706,33 @@ int TIntermediate::addUsedLocation(const TQualifier& qualifier, const TType& typ if (collision < 0) usedIo[set].push_back(range2); } - } else -#endif - { - // Not a dvec3 in/out split across two locations, generic path. - // Need a single IO-range block. + return collision; + } - TRange locationRange(qualifier.layoutLocation, qualifier.layoutLocation + size - 1); - TRange componentRange(0, 3); - if (qualifier.hasComponent() || type.getVectorSize() > 0) { - int consumedComponents = type.getVectorSize() * (type.getBasicType() == EbtDouble ? 2 : 1); - if (qualifier.hasComponent()) - componentRange.start = qualifier.layoutComponent; - componentRange.last = componentRange.start + consumedComponents - 1; - } + // Not a dvec3 in/out split across two locations, generic path. + // Need a single IO-range block. - // combine location and component ranges - TIoRange range(locationRange, componentRange, type.getBasicType(), qualifier.hasIndex() ? qualifier.getIndex() : 0); + TRange locationRange(qualifier.layoutLocation, qualifier.layoutLocation + size - 1); + TRange componentRange(0, 3); + if (qualifier.hasComponent() || type.getVectorSize() > 0) { + int consumedComponents = type.getVectorSize() * (type.getBasicType() == EbtDouble ? 2 : 1); + if (qualifier.hasComponent()) + componentRange.start = qualifier.layoutComponent; + componentRange.last = componentRange.start + consumedComponents - 1; + } - // check for collisions, except for vertex inputs on desktop targeting OpenGL - if (! (!isEsProfile() && language == EShLangVertex && qualifier.isPipeInput()) || spvVersion.vulkan > 0) - collision = checkLocationRange(set, range, type, typeCollision); + // combine location and component ranges + TBasicType basicTy = type.getBasicType(); + if (basicTy == EbtSampler && type.getSampler().isAttachmentEXT()) + basicTy = type.getSampler().type; + TIoRange range(locationRange, componentRange, basicTy, qualifier.hasIndex() ? qualifier.getIndex() : 0); - if (collision < 0) - usedIo[set].push_back(range); - } + // check for collisions, except for vertex inputs on desktop targeting OpenGL + if (! (!isEsProfile() && language == EShLangVertex && qualifier.isPipeInput()) || spvVersion.vulkan > 0) + collision = checkLocationRange(set, range, type, typeCollision); + + if (collision < 0) + usedIo[set].push_back(range); return collision; } @@ -1728,6 +1755,19 @@ int TIntermediate::checkLocationRange(int set, const TIoRange& range, const TTyp } } + // check typeCollision between tileImageEXT and out + if (set == 4 || set == 1) { + // if the set is "tileImageEXT", check against "out" and vice versa + int againstSet = (set == 4) ? 1 : 4; + for (size_t r = 0; r < usedIo[againstSet].size(); ++r) { + if (range.location.overlap(usedIo[againstSet][r].location) && type.getBasicType() != usedIo[againstSet][r].basicType) { + // aliased-type mismatch + typeCollision = true; + return std::max(range.location.start, usedIo[againstSet][r].location.start); + } + } + } + return -1; // no collision } @@ -1791,10 +1831,8 @@ int TIntermediate::computeTypeLocationSize(const TType& type, EShLanguage stage) if (type.isSizedArray() && !type.getQualifier().isPerView()) return type.getOuterArraySize() * computeTypeLocationSize(elementType, stage); else { -#ifndef GLSLANG_WEB // unset perViewNV attributes for arrayed per-view outputs: "perviewNV vec4 v[MAX_VIEWS][3];" elementType.getQualifier().perViewNV = false; -#endif return computeTypeLocationSize(elementType, stage); } } @@ -1870,8 +1908,6 @@ int TIntermediate::computeTypeUniformLocationSize(const TType& type) return 1; } -#ifndef GLSLANG_WEB - // Accumulate xfb buffer ranges and check for collisions as the accumulation is done. // // Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value. @@ -1989,8 +2025,6 @@ unsigned int TIntermediate::computeTypeXfbSize(const TType& type, bool& contains } } -#endif - const int baseAlignmentVec4Std140 = 16; // Return the size and alignment of a component of the given type. @@ -1998,10 +2032,6 @@ const int baseAlignmentVec4Std140 = 16; // Return value is the alignment.. int TIntermediate::getBaseAlignmentScalar(const TType& type, int& size) { -#ifdef GLSLANG_WEB - size = 4; return 4; -#endif - switch (type.getBasicType()) { case EbtInt64: case EbtUint64: @@ -2012,6 +2042,15 @@ int TIntermediate::getBaseAlignmentScalar(const TType& type, int& size) case EbtInt16: case EbtUint16: size = 2; return 2; case EbtReference: size = 8; return 8; + case EbtSampler: + { + if (type.isBindlessImage() || type.isBindlessTexture()) { + size = 8; return 8; + } + else { + size = 4; return 4; + } + } default: size = 4; return 4; } } @@ -2332,7 +2371,6 @@ int TIntermediate::computeBufferReferenceTypeSize(const TType& type) return size; } -#ifndef GLSLANG_WEB bool TIntermediate::isIoResizeArray(const TType& type, EShLanguage language) { return type.isArray() && ((language == EShLangGeometry && type.getQualifier().storage == EvqVaryingIn) || @@ -2344,6 +2382,5 @@ bool TIntermediate::isIoResizeArray(const TType& type, EShLanguage language) { (language == EShLangMesh && type.getQualifier().storage == EvqVaryingOut && !type.getQualifier().perTaskNV)); } -#endif // not GLSLANG_WEB } // end namespace glslang diff --git a/third_party/glslang/glslang/MachineIndependent/localintermediate.h b/third_party/glslang/glslang/MachineIndependent/localintermediate.h index e7a171cde1f..2f0e65ce39e 100644 --- a/third_party/glslang/glslang/MachineIndependent/localintermediate.h +++ b/third_party/glslang/glslang/MachineIndependent/localintermediate.h @@ -147,7 +147,6 @@ struct TOffsetRange { TRange offset; }; -#ifndef GLSLANG_WEB // Things that need to be tracked per xfb buffer. struct TXfbBuffer { TXfbBuffer() : stride(TQualifier::layoutXfbStrideEnd), implicitStride(0), contains64BitType(false), @@ -159,7 +158,6 @@ struct TXfbBuffer { bool contains32BitType; bool contains16BitType; }; -#endif // Track a set of strings describing how the module was processed. // This includes command line options, transforms, etc., ideally inclusive enough @@ -225,6 +223,16 @@ enum ComputeDerivativeMode { LayoutDerivativeGroupLinear, // derivative_group_linearNV }; +// +// Status type on AST level. Some uncalled status or functions would be reset in call graph. +// Currently we will keep status set by explicitly declared layout or variable decl. +// +enum AstRefType { + AstRefTypeVar, // Status set by variable decl + AstRefTypeFunc, // Status set by function decl + AstRefTypeLayout, // Status set by layout decl +}; + class TIdMaps { public: TMap& operator[](long long i) { return maps[i]; } @@ -283,10 +291,8 @@ class TIntermediate { public: explicit TIntermediate(EShLanguage l, int v = 0, EProfile p = ENoProfile) : language(l), -#ifndef GLSLANG_ANGLE profile(p), version(v), -#endif - treeRoot(0), + treeRoot(nullptr), resources(TBuiltInResource{}), numEntryPoints(0), numErrors(0), numPushConstants(0), recursive(false), invertY(false), @@ -303,9 +309,7 @@ class TIntermediate { atomicCounterBlockName(""), globalUniformBlockSet(TQualifier::layoutSetEnd), globalUniformBlockBinding(TQualifier::layoutBindingEnd), - atomicCounterBlockSet(TQualifier::layoutSetEnd) -#ifndef GLSLANG_WEB - , + atomicCounterBlockSet(TQualifier::layoutSetEnd), implicitThisName("@this"), implicitCounterName("@count"), source(EShSourceNone), useVulkanMemoryModel(false), @@ -313,7 +317,12 @@ class TIntermediate { inputPrimitive(ElgNone), outputPrimitive(ElgNone), pixelCenterInteger(false), originUpperLeft(false),texCoordBuiltinRedeclared(false), vertexSpacing(EvsNone), vertexOrder(EvoNone), interlockOrdering(EioNone), pointMode(false), earlyFragmentTests(false), - postDepthCoverage(false), earlyAndLateFragmentTestsAMD(false), depthLayout(EldNone), stencilLayout(ElsNone), + postDepthCoverage(false), earlyAndLateFragmentTestsAMD(false), + nonCoherentColorAttachmentReadEXT(false), + nonCoherentDepthAttachmentReadEXT(false), + nonCoherentStencilAttachmentReadEXT(false), + depthLayout(EldNone), + stencilLayout(ElsNone), hlslFunctionality1(false), blendEquations(0), xfbMode(false), multiStream(false), layoutOverrideCoverage(false), @@ -339,7 +348,6 @@ class TIntermediate { spirvRequirement(nullptr), spirvExecutionMode(nullptr), uniformLocationBase(0) -#endif { localSize[0] = 1; localSize[1] = 1; @@ -350,23 +358,17 @@ class TIntermediate { localSizeSpecId[0] = TQualifier::layoutNotSet; localSizeSpecId[1] = TQualifier::layoutNotSet; localSizeSpecId[2] = TQualifier::layoutNotSet; -#ifndef GLSLANG_WEB xfbBuffers.resize(TQualifier::layoutXfbBufferEnd); shiftBinding.fill(0); -#endif } void setVersion(int v) { -#ifndef GLSLANG_ANGLE version = v; -#endif } void setProfile(EProfile p) { -#ifndef GLSLANG_ANGLE profile = p; -#endif } int getVersion() const { return version; } @@ -627,35 +629,6 @@ class TIntermediate { localSizeSpecId[1] != TQualifier::layoutNotSet || localSizeSpecId[2] != TQualifier::layoutNotSet; } -#ifdef GLSLANG_WEB - void output(TInfoSink&, bool tree) { } - - bool isEsProfile() const { return false; } - bool getXfbMode() const { return false; } - bool isMultiStream() const { return false; } - TLayoutGeometry getOutputPrimitive() const { return ElgNone; } - bool getPostDepthCoverage() const { return false; } - bool getEarlyFragmentTests() const { return false; } - TLayoutDepth getDepth() const { return EldNone; } - bool getPixelCenterInteger() const { return false; } - void setOriginUpperLeft() { } - bool getOriginUpperLeft() const { return true; } - TInterlockOrdering getInterlockOrdering() const { return EioNone; } - - bool getAutoMapBindings() const { return false; } - bool getAutoMapLocations() const { return false; } - int getNumPushConstants() const { return 0; } - void addShaderRecordCount() { } - void addTaskNVCount() { } - void addTaskPayloadEXTCount() { } - void setUseVulkanMemoryModel() { } - bool usingVulkanMemoryModel() const { return false; } - bool usingPhysicalStorageBuffer() const { return false; } - bool usingVariablePointers() const { return false; } - unsigned getXfbStride(int buffer) const { return 0; } - bool hasLayoutDerivativeModeNone() const { return false; } - ComputeDerivativeMode getLayoutDerivativeModeNone() const { return LayoutDerivativeNone; } -#else void output(TInfoSink&, bool tree); bool isEsProfile() const { return profile == EEsProfile; } @@ -750,6 +723,65 @@ class TIntermediate { useVariablePointers = true; processes.addProcess("use-variable-pointers"); } + // Set the global flag for bindless texture + void setBindlessTextureMode(const TString& currentCaller, AstRefType type) + { + // When type is not func, currentCaller should be "" (empty string) + bindlessTextureModeCaller[currentCaller] = type; + } + + // Get the global flag for bindless texture + bool getBindlessTextureMode() const + { + return (bindlessTextureModeCaller.size() > 0); + } + + // Set the global flag for bindless image + void setBindlessImageMode(const TString& currentCaller, AstRefType type) + { + // When type is not func, currentCaller should be "" (empty string) + bindlessImageModeCaller[currentCaller] = type; + } + + // Get the global flag for bindless image + bool getBindlessImageMode() const + { + return (bindlessImageModeCaller.size() > 0); + } + + // Get the global flag for bindless texture + bool resetTopLevelUncalledStatus(const TString& deadCaller) + { + // For reflection collection purpose, currently uniform layout setting and some + // flags introduced by variables (IO, global, etc,.) won't be reset here. + // Remove each global status (AST top level) introduced by uncalled functions. + // If a status is set by several functions, keep those which in call graph. + bool result = false; + + // For two types of bindless mode flag, we would only reset which is set by an uncalled function. + // If one status flag's key in caller vec is empty, it should be come from a non-function setting. + if (!bindlessTextureModeCaller.empty()) { + auto caller = bindlessTextureModeCaller.find(deadCaller); + if (caller != bindlessTextureModeCaller.end() && bindlessTextureModeCaller[deadCaller] == AstRefTypeFunc) { + bindlessTextureModeCaller.erase(caller); + result = true; + } + } + if (!bindlessImageModeCaller.empty()) { + auto caller = bindlessImageModeCaller.find(deadCaller); + if (caller != bindlessImageModeCaller.end() && bindlessImageModeCaller[deadCaller] == AstRefTypeFunc) { + bindlessImageModeCaller.erase(caller); + result = true; + } + } + return result; + } + + bool getBindlessMode() const + { + return getBindlessTextureMode() || getBindlessImageMode(); + } + bool usingVariablePointers() const { return useVariablePointers; } #ifdef ENABLE_HLSL @@ -831,6 +863,12 @@ class TIntermediate { return true; } TLayoutGeometry getOutputPrimitive() const { return outputPrimitive; } + void setNonCoherentColorAttachmentReadEXT() { nonCoherentColorAttachmentReadEXT = true; } + bool getNonCoherentColorAttachmentReadEXT() const { return nonCoherentColorAttachmentReadEXT; } + void setNonCoherentDepthAttachmentReadEXT() { nonCoherentDepthAttachmentReadEXT = true; } + bool getNonCoherentDepthAttachmentReadEXT() const { return nonCoherentDepthAttachmentReadEXT; } + void setNonCoherentStencilAttachmentReadEXT() { nonCoherentStencilAttachmentReadEXT = true; } + bool getNonCoherentStencilAttachmentReadEXT() const { return nonCoherentStencilAttachmentReadEXT; } void setPostDepthCoverage() { postDepthCoverage = true; } bool getPostDepthCoverage() const { return postDepthCoverage; } void setEarlyFragmentTests() { earlyFragmentTests = true; } @@ -929,7 +967,6 @@ class TIntermediate { void insertSpirvExecutionModeId(int executionMode, const TIntermAggregate* args); bool hasSpirvExecutionMode() const { return spirvExecutionMode != nullptr; } const TSpirvExecutionMode& getSpirvExecutionMode() const { return *spirvExecutionMode; } -#endif // GLSLANG_WEB void addBlockStorageOverride(const char* nameStr, TBlockStorageClass backing) { @@ -1036,12 +1073,6 @@ class TIntermediate { void setUniqueId(unsigned long long id) { uniqueId = id; } // Certain explicit conversions are allowed conditionally -#ifdef GLSLANG_WEB - bool getArithemeticInt8Enabled() const { return false; } - bool getArithemeticInt16Enabled() const { return false; } - bool getArithemeticFloat16Enabled() const { return false; } - void updateNumericFeature(TNumericFeatures::feature f, bool on) { } -#else bool getArithemeticInt8Enabled() const { return numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types) || numericFeatures.contains(TNumericFeatures::shader_explicit_arithmetic_types_int8); @@ -1059,7 +1090,6 @@ class TIntermediate { } void updateNumericFeature(TNumericFeatures::feature f, bool on) { on ? numericFeatures.insert(f) : numericFeatures.erase(f); } -#endif protected: TIntermSymbol* addSymbol(long long Id, const TString&, const TType&, const TConstUnionArray&, TIntermTyped* subtree, const TSourceLoc&); @@ -1101,13 +1131,8 @@ class TIntermediate { typedef std::list TGraph; TGraph callGraph; -#ifdef GLSLANG_ANGLE - const EProfile profile = ECoreProfile; - const int version = 450; -#else EProfile profile; // source profile int version; // source version -#endif SpvVersion spvVersion; TIntermNode* treeRoot; std::set requestedExtensions; // cumulation of all enabled or required extensions; not connected to what subset of the shader used them @@ -1136,7 +1161,6 @@ class TIntermediate { unsigned int globalUniformBlockBinding; unsigned int atomicCounterBlockSet; -#ifndef GLSLANG_WEB public: const char* const implicitThisName; const char* const implicitCounterName; @@ -1157,6 +1181,9 @@ class TIntermediate { bool earlyFragmentTests; bool postDepthCoverage; bool earlyAndLateFragmentTestsAMD; + bool nonCoherentColorAttachmentReadEXT; + bool nonCoherentDepthAttachmentReadEXT; + bool nonCoherentStencilAttachmentReadEXT; TLayoutDepth depthLayout; TLayoutStencil stencilLayout; bool hlslFunctionality1; @@ -1199,18 +1226,19 @@ class TIntermediate { TSpirvRequirement* spirvRequirement; TSpirvExecutionMode* spirvExecutionMode; - + std::map bindlessTextureModeCaller; + std::map bindlessImageModeCaller; std::unordered_map uniformLocationOverrides; int uniformLocationBase; TNumericFeatures numericFeatures; -#endif std::unordered_map blockBackingOverrides; std::unordered_set usedConstantId; // specialization constant ids used std::vector usedAtomics; // sets of bindings used by atomic counters std::vector usedIo[4]; // sets of used locations, one for each of in, out, uniform, and buffers - std::vector usedIoRT[2]; // sets of used location, one for rayPayload/rayPayloadIN and other - // for callableData/callableDataIn + std::vector usedIoRT[4]; // sets of used location, one for rayPayload/rayPayloadIN, + // one for callableData/callableDataIn, one for hitObjectAttributeNV and + // one for shaderrecordhitobjectNV // set of names of statically read/written I/O that might need extra checking std::set ioAccessed; diff --git a/third_party/glslang/glslang/MachineIndependent/parseConst.cpp b/third_party/glslang/glslang/MachineIndependent/parseConst.cpp index 6c182991f51..835097234ea 100644 --- a/third_party/glslang/glslang/MachineIndependent/parseConst.cpp +++ b/third_party/glslang/glslang/MachineIndependent/parseConst.cpp @@ -198,7 +198,7 @@ void TConstTraverser::visitConstantUnion(TIntermConstantUnion* node) bool TIntermediate::parseConstTree(TIntermNode* root, TConstUnionArray unionArray, TOperator constructorType, const TType& t, bool singleConstantParam) { - if (root == 0) + if (root == nullptr) return false; TConstTraverser it(unionArray, singleConstantParam, constructorType, t); diff --git a/third_party/glslang/glslang/MachineIndependent/parseVersions.h b/third_party/glslang/glslang/MachineIndependent/parseVersions.h index 7248354e4b6..63841c408a4 100644 --- a/third_party/glslang/glslang/MachineIndependent/parseVersions.h +++ b/third_party/glslang/glslang/MachineIndependent/parseVersions.h @@ -58,72 +58,18 @@ class TParseVersions { const SpvVersion& spvVersion, EShLanguage language, TInfoSink& infoSink, bool forwardCompatible, EShMessages messages) : -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) forwardCompatible(forwardCompatible), profile(profile), -#endif infoSink(infoSink), version(version), language(language), spvVersion(spvVersion), - intermediate(interm), messages(messages), numErrors(0), currentScanner(0) { } + intermediate(interm), messages(messages), numErrors(0), currentScanner(nullptr) { } virtual ~TParseVersions() { } void requireStage(const TSourceLoc&, EShLanguageMask, const char* featureDesc); void requireStage(const TSourceLoc&, EShLanguage, const char* featureDesc); -#ifdef GLSLANG_WEB - const EProfile profile = EEsProfile; - bool isEsProfile() const { return true; } - void requireProfile(const TSourceLoc& loc, int profileMask, const char* featureDesc) - { - if (! (EEsProfile & profileMask)) - error(loc, "not supported with this profile:", featureDesc, ProfileName(profile)); - } - void profileRequires(const TSourceLoc& loc, int profileMask, int minVersion, int numExtensions, - const char* const extensions[], const char* featureDesc) - { - if ((EEsProfile & profileMask) && (minVersion == 0 || version < minVersion)) - error(loc, "not supported for this version or the enabled extensions", featureDesc, ""); - } - void profileRequires(const TSourceLoc& loc, int profileMask, int minVersion, const char* extension, - const char* featureDesc) - { - profileRequires(loc, profileMask, minVersion, extension ? 1 : 0, &extension, featureDesc); - } - void initializeExtensionBehavior() { } - void checkDeprecated(const TSourceLoc&, int queryProfiles, int depVersion, const char* featureDesc) { } - void requireNotRemoved(const TSourceLoc&, int queryProfiles, int removedVersion, const char* featureDesc) { } - void requireExtensions(const TSourceLoc&, int numExtensions, const char* const extensions[], - const char* featureDesc) { } - void ppRequireExtensions(const TSourceLoc&, int numExtensions, const char* const extensions[], - const char* featureDesc) { } - TExtensionBehavior getExtensionBehavior(const char*) { return EBhMissing; } - bool extensionTurnedOn(const char* const extension) { return false; } - bool extensionsTurnedOn(int numExtensions, const char* const extensions[]) { return false; } - void updateExtensionBehavior(int line, const char* const extension, const char* behavior) { } - void updateExtensionBehavior(const char* const extension, TExtensionBehavior) { } - void checkExtensionStage(const TSourceLoc&, const char* const extension) { } - void extensionRequires(const TSourceLoc&, const char* const extension, const char* behavior) { } - void fullIntegerCheck(const TSourceLoc&, const char* op) { } - void doubleCheck(const TSourceLoc&, const char* op) { } - bool float16Arithmetic() { return false; } - void requireFloat16Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc) { } - bool int16Arithmetic() { return false; } - void requireInt16Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc) { } - bool int8Arithmetic() { return false; } - void requireInt8Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc) { } - void int64Check(const TSourceLoc&, const char* op, bool builtIn = false) { } - void explicitFloat32Check(const TSourceLoc&, const char* op, bool builtIn = false) { } - void explicitFloat64Check(const TSourceLoc&, const char* op, bool builtIn = false) { } - bool relaxedErrors() const { return false; } - bool suppressWarnings() const { return true; } - bool isForwardCompatible() const { return false; } -#else -#ifdef GLSLANG_ANGLE - const bool forwardCompatible = true; - const EProfile profile = ECoreProfile; -#else + bool forwardCompatible; // true if errors are to be given for use of deprecated features EProfile profile; // the declared profile in the shader (core by default) -#endif bool isEsProfile() const { return profile == EEsProfile; } void requireProfile(const TSourceLoc& loc, int profileMask, const char* featureDesc); void profileRequires(const TSourceLoc& loc, int profileMask, int minVersion, int numExtensions, @@ -167,29 +113,19 @@ class TParseVersions { virtual void explicitInt32Check(const TSourceLoc&, const char* op, bool builtIn = false); virtual void explicitFloat32Check(const TSourceLoc&, const char* op, bool builtIn = false); virtual void explicitFloat64Check(const TSourceLoc&, const char* op, bool builtIn = false); - virtual void fcoopmatCheck(const TSourceLoc&, const char* op, bool builtIn = false); - virtual void intcoopmatCheck(const TSourceLoc&, const char *op, bool builtIn = false); + virtual void fcoopmatCheckNV(const TSourceLoc&, const char* op, bool builtIn = false); + virtual void intcoopmatCheckNV(const TSourceLoc&, const char *op, bool builtIn = false); + virtual void coopmatCheck(const TSourceLoc&, const char* op, bool builtIn = false); bool relaxedErrors() const { return (messages & EShMsgRelaxedErrors) != 0; } bool suppressWarnings() const { return (messages & EShMsgSuppressWarnings) != 0; } bool isForwardCompatible() const { return forwardCompatible; } -#endif // GLSLANG_WEB + virtual void spvRemoved(const TSourceLoc&, const char* op); virtual void vulkanRemoved(const TSourceLoc&, const char* op); virtual void requireVulkan(const TSourceLoc&, const char* op); virtual void requireSpv(const TSourceLoc&, const char* op); virtual void requireSpv(const TSourceLoc&, const char *op, unsigned int version); - -#if defined(GLSLANG_WEB) && !defined(GLSLANG_WEB_DEVEL) - void C_DECL error(const TSourceLoc&, const char* szReason, const char* szToken, - const char* szExtraInfoFormat, ...) { addError(); } - void C_DECL warn(const TSourceLoc&, const char* szReason, const char* szToken, - const char* szExtraInfoFormat, ...) { } - void C_DECL ppError(const TSourceLoc&, const char* szReason, const char* szToken, - const char* szExtraInfoFormat, ...) { addError(); } - void C_DECL ppWarn(const TSourceLoc&, const char* szReason, const char* szToken, - const char* szExtraInfoFormat, ...) { } -#else virtual void C_DECL error(const TSourceLoc&, const char* szReason, const char* szToken, const char* szExtraInfoFormat, ...) = 0; virtual void C_DECL warn(const TSourceLoc&, const char* szReason, const char* szToken, @@ -198,7 +134,6 @@ class TParseVersions { const char* szExtraInfoFormat, ...) = 0; virtual void C_DECL ppWarn(const TSourceLoc&, const char* szReason, const char* szToken, const char* szExtraInfoFormat, ...) = 0; -#endif void addError() { ++numErrors; } int getNumErrors() const { return numErrors; } @@ -231,6 +166,7 @@ class TParseVersions { protected: TMap extensionBehavior; // for each extension string, what its current behavior is TMap extensionMinSpv; // for each extension string, store minimum spirv required + TVector spvUnsupportedExt; // for extensions reserved for spv usage. EShMessages messages; // errors/warnings/rule-sets int numErrors; // number of compile-time errors encountered TInputScanner* currentScanner; diff --git a/third_party/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp b/third_party/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp index aa1e0d74516..16b9d243763 100644 --- a/third_party/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp +++ b/third_party/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp @@ -378,8 +378,6 @@ namespace { int op_cmpl(int a) { return ~a; } int op_not(int a) { return !a; } -}; - struct TBinop { int token, precedence, (*op)(int, int); } binop[] = { @@ -412,6 +410,8 @@ struct TUnop { { '!', op_not }, }; +} // anonymous namespace + #define NUM_ELEMENTS(A) (sizeof(A) / sizeof(A[0])) int TPpContext::eval(int token, int precedence, bool shortCircuit, int& res, bool& err, TPpToken* ppToken) @@ -736,7 +736,6 @@ int TPpContext::CPPline(TPpToken* ppToken) parseContext.setCurrentLine(lineRes); if (token != '\n') { -#ifndef GLSLANG_WEB if (token == PpAtomConstString) { parseContext.ppRequireExtensions(directiveLoc, 1, &E_GL_GOOGLE_cpp_style_line_directive, "filename-based #line"); // We need to save a copy of the string instead of pointing @@ -746,9 +745,7 @@ int TPpContext::CPPline(TPpToken* ppToken) parseContext.setCurrentSourceName(sourceName); hasFile = true; token = scanToken(ppToken); - } else -#endif - { + } else { token = eval(token, MIN_PRECEDENCE, false, fileRes, fileErr, ppToken); if (! fileErr) { parseContext.setCurrentString(fileRes); @@ -974,7 +971,6 @@ int TPpContext::readCPPline(TPpToken* ppToken) case PpAtomLine: token = CPPline(ppToken); break; -#ifndef GLSLANG_WEB case PpAtomInclude: if(!parseContext.isReadingHLSL()) { parseContext.ppRequireExtensions(ppToken->loc, 1, &E_GL_GOOGLE_include_directive, "#include"); @@ -984,7 +980,6 @@ int TPpContext::readCPPline(TPpToken* ppToken) case PpAtomPragma: token = CPPpragma(ppToken); break; -#endif case PpAtomUndef: token = CPPundef(ppToken); break; @@ -1126,9 +1121,6 @@ int TPpContext::tMacroInput::scan(TPpToken* ppToken) pasting = true; } - // HLSL does expand macros before concatenation - if (pasting && pp->parseContext.isReadingHLSL()) - pasting = false; // TODO: preprocessor: properly handle whitespace (or lack of it) between tokens when expanding if (token == PpAtomIdentifier) { @@ -1138,9 +1130,12 @@ int TPpContext::tMacroInput::scan(TPpToken* ppToken) break; if (i >= 0) { TokenStream* arg = expandedArgs[i]; - if (arg == nullptr || pasting) + bool expanded = !!arg && !pasting; + // HLSL does expand macros before concatenation + if (arg == nullptr || (pasting && !pp->parseContext.isReadingHLSL()) ) { arg = args[i]; - pp->pushTokenStreamInput(*arg, prepaste); + } + pp->pushTokenStreamInput(*arg, prepaste, expanded); return pp->scanToken(ppToken); } @@ -1183,6 +1178,9 @@ MacroExpandResult TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, b { ppToken->space = false; int macroAtom = atomStrings.getAtom(ppToken->name); + if (ppToken->fullyExpanded) + return MacroExpandNotStarted; + switch (macroAtom) { case PpAtomLineMacro: // Arguments which are macro have been replaced in the first stage. @@ -1214,8 +1212,10 @@ MacroExpandResult TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, b MacroSymbol* macro = macroAtom == 0 ? nullptr : lookupMacroDef(macroAtom); // no recursive expansions - if (macro != nullptr && macro->busy) + if (macro != nullptr && macro->busy) { + ppToken->fullyExpanded = true; return MacroExpandNotStarted; + } // not expanding undefined macros if ((macro == nullptr || macro->undef) && ! expandUndef) diff --git a/third_party/glslang/glslang/MachineIndependent/preprocessor/PpContext.cpp b/third_party/glslang/glslang/MachineIndependent/preprocessor/PpContext.cpp index 1363ce2be04..70f511978c7 100644 --- a/third_party/glslang/glslang/MachineIndependent/preprocessor/PpContext.cpp +++ b/third_party/glslang/glslang/MachineIndependent/preprocessor/PpContext.cpp @@ -85,7 +85,7 @@ NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace glslang { TPpContext::TPpContext(TParseContextBase& pc, const std::string& rootFileName, TShader::Includer& inclr) : - preamble(0), strings(0), previous_token('\n'), parseContext(pc), includer(inclr), inComment(false), + preamble(nullptr), strings(nullptr), previous_token('\n'), parseContext(pc), includer(inclr), inComment(false), rootFileName(rootFileName), currentSourceFile(rootFileName), disableEscapeSequences(false) diff --git a/third_party/glslang/glslang/MachineIndependent/preprocessor/PpContext.h b/third_party/glslang/glslang/MachineIndependent/preprocessor/PpContext.h index 714b5eadba4..590eab6b207 100644 --- a/third_party/glslang/glslang/MachineIndependent/preprocessor/PpContext.h +++ b/third_party/glslang/glslang/MachineIndependent/preprocessor/PpContext.h @@ -102,6 +102,7 @@ class TPpToken { i64val = 0; loc.init(); name[0] = 0; + fullyExpanded = false; } // Used for comparing macro definitions, so checks what is relevant for that. @@ -117,6 +118,8 @@ class TPpToken { // True if a space (for white space or a removed comment) should also be // recognized, in front of the token returned: bool space; + + bool fullyExpanded; // Numeric value of the token: union { int ival; @@ -475,16 +478,27 @@ class TPpContext { // // From PpTokens.cpp // - void pushTokenStreamInput(TokenStream&, bool pasting = false); + void pushTokenStreamInput(TokenStream&, bool pasting = false, bool expanded = false); void UngetToken(int token, TPpToken*); class tTokenInput : public tInput { public: - tTokenInput(TPpContext* pp, TokenStream* t, bool prepasting) : + tTokenInput(TPpContext* pp, TokenStream* t, bool prepasting, bool expanded) : tInput(pp), tokens(t), - lastTokenPastes(prepasting) { } - virtual int scan(TPpToken *ppToken) override { return tokens->getToken(pp->parseContext, ppToken); } + lastTokenPastes(prepasting), + preExpanded(expanded) { } + virtual int scan(TPpToken *ppToken) override { + int token = tokens->getToken(pp->parseContext, ppToken); + ppToken->fullyExpanded = preExpanded; + if (tokens->atEnd() && token == PpAtomIdentifier) { + int macroAtom = pp->atomStrings.getAtom(ppToken->name); + MacroSymbol* macro = macroAtom == 0 ? nullptr : pp->lookupMacroDef(macroAtom); + if (macro && macro->functionLike) + ppToken->fullyExpanded = false; + } + return token; + } virtual int getch() override { assert(0); return EndOfInput; } virtual void ungetch() override { assert(0); } virtual bool peekPasting() override { return tokens->peekTokenizedPasting(lastTokenPastes); } @@ -492,6 +506,7 @@ class TPpContext { protected: TokenStream* tokens; bool lastTokenPastes; // true if the last token in the input is to be pasted, rather than consumed as a token + bool preExpanded; }; class tUngotTokenInput : public tInput { diff --git a/third_party/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp b/third_party/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp index ad11792002c..34dec20769a 100644 --- a/third_party/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp +++ b/third_party/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp @@ -3,6 +3,7 @@ // Copyright (C) 2013 LunarG, Inc. // Copyright (C) 2017 ARM Limited. // Copyright (C) 2015-2018 Google, Inc. +// Copyright (c) 2023, Mobica Limited // // All rights reserved. // @@ -259,7 +260,6 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken) // Suffix: bool isDouble = false; bool isFloat16 = false; -#ifndef GLSLANG_WEB if (ch == 'l' || ch == 'L') { if (ifdepth == 0 && parseContext.intermediate.getSource() == EShSourceGlsl) parseContext.doubleCheck(ppToken->loc, "double floating-point suffix"); @@ -299,14 +299,11 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken) isFloat16 = true; } } else -#endif if (ch == 'f' || ch == 'F') { -#ifndef GLSLANG_WEB if (ifdepth == 0) parseContext.profileRequires(ppToken->loc, EEsProfile, 300, nullptr, "floating-point suffix"); if (ifdepth == 0 && !parseContext.relaxedErrors()) parseContext.profileRequires(ppToken->loc, ~EEsProfile, 120, nullptr, "floating-point suffix"); -#endif if (ifdepth == 0 && !hasDecimalOrExponent) parseContext.ppError(ppToken->loc, "float literal needs a decimal point or exponent", "", ""); saveName(ch); @@ -480,9 +477,7 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken) E_GL_EXT_shader_explicit_arithmetic_types_int16 }; static const int Num_Int16_Extensions = sizeof(Int16_Extensions) / sizeof(Int16_Extensions[0]); - ppToken->ival = 0; - ppToken->i64val = 0; - ppToken->space = false; + ppToken->clear(); ch = getch(); for (;;) { while (ch == ' ' || ch == '\t') { @@ -551,7 +546,7 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken) ival = 0; do { - if (len < MaxTokenLength && ival <= 0x0fffffffffffffffull) { + if (len < MaxTokenLength && ival <= 0x7fffffffffffffffull) { ppToken->name[len++] = (char)ch; if (ch >= '0' && ch <= '9') { ii = ch - '0'; @@ -584,7 +579,6 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken) ppToken->name[len++] = (char)ch; isUnsigned = true; -#ifndef GLSLANG_WEB int nextCh = getch(); if (nextCh == 'l' || nextCh == 'L') { if (len < MaxTokenLength) @@ -610,7 +604,6 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken) if (len < MaxTokenLength) ppToken->name[len++] = (char)ch; isInt16 = true; -#endif } else ungetch(); ppToken->name[len] = '\0'; @@ -641,6 +634,108 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken) ppToken->ival = (int)ival; return isUnsigned ? PpAtomConstUint : PpAtomConstInt; } + } else if ((ch == 'b' || ch == 'B') && pp->parseContext.intermediate.getSource() == EShSourceHlsl) { + // must be binary + bool isUnsigned = false; + bool isInt64 = false; + bool isInt16 = false; + ppToken->name[len++] = (char)ch; + ch = getch(); + + // Check value + if ((ch == '0' || ch == '1')) + { + ival = 0; + do { + if (len < MaxTokenLength && ival <= 0x7fffffffffffffffull) { + ppToken->name[len++] = (char)ch; + if (ch == '0' || ch == '1') { + ii = ch - '0'; + } else { + pp->parseContext.ppError(ppToken->loc, "bad digit in binary literal", "", ""); + } + ival = (ival << 1) | ii; + } + else + { + if (! AlreadyComplained) { + if(len < MaxTokenLength) + pp->parseContext.ppError(ppToken->loc, "binary literal too big", "", ""); + else + pp->parseContext.ppError(ppToken->loc, "binary literal too long", "", ""); + AlreadyComplained = 1; + } + ival = 0xffffffffffffffffull; + } + ch = getch(); + } while (ch == '0' || ch == '1'); + } + else + { + pp->parseContext.ppError(ppToken->loc, "bad digit in binary literal", "", ""); + } + + // check type + if (ch == 'u' || ch == 'U') { + if (len < MaxTokenLength) + ppToken->name[len++] = (char)ch; + isUnsigned = true; + + int nextCh = getch(); + if (nextCh == 'l' || nextCh == 'L') { + if (len < MaxTokenLength) + ppToken->name[len++] = (char)nextCh; + isInt64 = true; + } else + ungetch(); + + nextCh = getch(); + if ((nextCh == 's' || nextCh == 'S') && + pp->parseContext.intermediate.getSource() == EShSourceGlsl) { + if (len < MaxTokenLength) + ppToken->name[len++] = (char)nextCh; + isInt16 = true; + } else + ungetch(); + } else if (ch == 'l' || ch == 'L') { + if (len < MaxTokenLength) + ppToken->name[len++] = (char)ch; + isInt64 = true; + } else if ((ch == 's' || ch == 'S') && + pp->parseContext.intermediate.getSource() == EShSourceGlsl) { + if (len < MaxTokenLength) + ppToken->name[len++] = (char)ch; + isInt16 = true; + } else { + ungetch(); + } + ppToken->name[len] = '\0'; + + // Assign value + if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) { + if (pp->ifdepth == 0) { + pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile, + "64-bit binary literal"); + pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, + Num_Int64_Extensions, Int64_Extensions, "64-bit binary literal"); + } + ppToken->i64val = ival; + return isUnsigned ? PpAtomConstUint64 : PpAtomConstInt64; + } else if (isInt16) { + if (pp->ifdepth == 0) { + if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) { + pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile, + "16-bit binary literal"); + pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, + Num_Int16_Extensions, Int16_Extensions, "16-bit binary literal"); + } + } + ppToken->ival = (int)ival; + return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16; + } else { + ppToken->ival = (int)ival; + return isUnsigned ? PpAtomConstUint : PpAtomConstInt; + } } else { // could be octal integer or floating point, speculative pursue octal until it must be floating point @@ -692,7 +787,6 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken) ppToken->name[len++] = (char)ch; isUnsigned = true; -#ifndef GLSLANG_WEB int nextCh = getch(); if (nextCh == 'l' || nextCh == 'L') { if (len < MaxTokenLength) @@ -718,7 +812,6 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken) if (len < MaxTokenLength) ppToken->name[len++] = (char)ch; isInt16 = true; -#endif } else ungetch(); ppToken->name[len] = '\0'; @@ -781,7 +874,6 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken) ppToken->name[len++] = (char)ch; isUnsigned = true; -#ifndef GLSLANG_WEB int nextCh = getch(); if (nextCh == 'l' || nextCh == 'L') { if (len < MaxTokenLength) @@ -807,7 +899,6 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken) if (len < MaxTokenLength) ppToken->name[len++] = (char)ch; isInt16 = true; -#endif } else ungetch(); diff --git a/third_party/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp b/third_party/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp index 7ed58703f2c..e6ee64cf9e7 100755 --- a/third_party/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp +++ b/third_party/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp @@ -85,9 +85,6 @@ NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #endif -#if (defined(_MSC_VER) && _MSC_VER < 1900 /*vs2015*/) -#define snprintf sprintf_s -#endif #include #include @@ -116,17 +113,15 @@ int TPpContext::TokenStream::getToken(TParseContextBase& parseContext, TPpToken int atom = stream[currentPos++].get(*ppToken); ppToken->loc = parseContext.getCurrentLoc(); -#ifndef GLSLANG_WEB // Check for ##, unless the current # is the last character if (atom == '#') { if (peekToken('#')) { parseContext.requireProfile(ppToken->loc, ~EEsProfile, "token pasting (##)"); - parseContext.profileRequires(ppToken->loc, ~EEsProfile, 130, 0, "token pasting (##)"); + parseContext.profileRequires(ppToken->loc, ~EEsProfile, 130, nullptr, "token pasting (##)"); currentPos++; atom = PpAtomPaste; } } -#endif return atom; } @@ -195,9 +190,9 @@ bool TPpContext::TokenStream::peekUntokenizedPasting() return pasting; } -void TPpContext::pushTokenStreamInput(TokenStream& ts, bool prepasting) +void TPpContext::pushTokenStreamInput(TokenStream& ts, bool prepasting, bool expanded) { - pushInput(new tTokenInput(this, &ts, prepasting)); + pushInput(new tTokenInput(this, &ts, prepasting, expanded)); ts.reset(); } diff --git a/third_party/glslang/glslang/MachineIndependent/propagateNoContraction.cpp b/third_party/glslang/glslang/MachineIndependent/propagateNoContraction.cpp index 9def592bafa..7b5cd03fa6b 100644 --- a/third_party/glslang/glslang/MachineIndependent/propagateNoContraction.cpp +++ b/third_party/glslang/glslang/MachineIndependent/propagateNoContraction.cpp @@ -37,8 +37,6 @@ // propagate the 'noContraction' qualifier. // -#ifndef GLSLANG_WEB - #include "propagateNoContraction.h" #include @@ -423,7 +421,7 @@ getSymbolToDefinitionMappingAndPreciseSymbolIDs(const glslang::TIntermediate& in ReturnBranchNodeSet()); TIntermNode* root = intermediate.getTreeRoot(); - if (root == 0) + if (root == nullptr) return result_tuple; NodeMapping& symbol_definition_mapping = std::get<0>(result_tuple); @@ -865,6 +863,4 @@ void PropagateNoContraction(const glslang::TIntermediate& intermediate) precise_object_accesschains.erase(precise_object_accesschain); } } -}; - -#endif // GLSLANG_WEB +} diff --git a/third_party/glslang/glslang/MachineIndependent/reflection.cpp b/third_party/glslang/glslang/MachineIndependent/reflection.cpp index 9ea48c452df..6c7d3a2c997 100644 --- a/third_party/glslang/glslang/MachineIndependent/reflection.cpp +++ b/third_party/glslang/glslang/MachineIndependent/reflection.cpp @@ -33,8 +33,6 @@ // POSSIBILITY OF SUCH DAMAGE. // -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - #include "../Include/Common.h" #include "reflection.h" #include "LiveTraverser.h" @@ -682,7 +680,7 @@ class TReflectionTraverser : public TIntermTraverser { } // For a binary operation indexing into an aggregate, chase down the base of the aggregate. - // Return 0 if the topology does not fit this situation. + // Return nullptr if the topology does not fit this situation. TIntermSymbol* findBase(const TIntermBinary* node) { TIntermSymbol *base = node->getLeft()->getAsSymbolNode(); @@ -1270,5 +1268,3 @@ void TReflection::dump() } } // end namespace glslang - -#endif // !GLSLANG_WEB && !GLSLANG_ANGLE diff --git a/third_party/glslang/glslang/MachineIndependent/reflection.h b/third_party/glslang/glslang/MachineIndependent/reflection.h index 5af4467c1fb..221d93f8b5d 100644 --- a/third_party/glslang/glslang/MachineIndependent/reflection.h +++ b/third_party/glslang/glslang/MachineIndependent/reflection.h @@ -33,8 +33,6 @@ // POSSIBILITY OF SUCH DAMAGE. // -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - #ifndef _REFLECTION_INCLUDED #define _REFLECTION_INCLUDED @@ -219,5 +217,3 @@ class TReflection { } // end namespace glslang #endif // _REFLECTION_INCLUDED - -#endif // !GLSLANG_WEB && !GLSLANG_ANGLE diff --git a/third_party/glslang/glslang/OSDependent/Unix/CMakeLists.txt b/third_party/glslang/glslang/OSDependent/Unix/CMakeLists.txt index ec1eda4a372..f6b1c6afb7a 100644 --- a/third_party/glslang/glslang/OSDependent/Unix/CMakeLists.txt +++ b/third_party/glslang/glslang/OSDependent/Unix/CMakeLists.txt @@ -36,23 +36,11 @@ set_property(TARGET OSDependent PROPERTY FOLDER glslang) set_property(TARGET OSDependent PROPERTY POSITION_INDEPENDENT_CODE ON) # Link pthread -set(CMAKE_THREAD_PREFER_PTHREAD ON) -if(${CMAKE_VERSION} VERSION_LESS "3.1.0" OR CMAKE_CROSSCOMPILING) - # Needed as long as we support CMake 2.8 for Ubuntu 14.04, - # which does not support the recommended Threads::Threads target. - # https://cmake.org/cmake/help/v2.8.12/cmake.html#module:FindThreads - # Also needed when cross-compiling to work around - # https://gitlab.kitware.com/cmake/cmake/issues/16920 - find_package(Threads) - target_link_libraries(OSDependent ${CMAKE_THREAD_LIBS_INIT}) -else() - # This is the recommended way, so we use it for 3.1+. - set(THREADS_PREFER_PTHREAD_FLAG ON) - find_package(Threads) - target_link_libraries(OSDependent Threads::Threads) -endif() +set(THREADS_PREFER_PTHREAD_FLAG ON) +find_package(Threads REQUIRED) +target_link_libraries(OSDependent Threads::Threads) -if(ENABLE_GLSLANG_INSTALL) +if(ENABLE_GLSLANG_INSTALL AND NOT BUILD_SHARED_LIBS) install(TARGETS OSDependent EXPORT glslang-targets) # Backward compatibility @@ -60,7 +48,7 @@ if(ENABLE_GLSLANG_INSTALL) message(WARNING \"Using `OSDependentTargets.cmake` is deprecated: use `find_package(glslang)` to find glslang CMake targets.\") if (NOT TARGET glslang::OSDependent) - include(\"\${CMAKE_CURRENT_LIST_DIR}/../../${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/glslang-targets.cmake\") + include(\"${CMAKE_INSTALL_FULL_LIBDIR}/cmake/${PROJECT_NAME}/glslang-targets.cmake\") endif() add_library(OSDependent ALIAS glslang::OSDependent) diff --git a/third_party/glslang/glslang/OSDependent/Unix/ossource.cpp b/third_party/glslang/glslang/OSDependent/Unix/ossource.cpp index b98df9348de..fbb51f7bd11 100644 --- a/third_party/glslang/glslang/OSDependent/Unix/ossource.cpp +++ b/third_party/glslang/glslang/OSDependent/Unix/ossource.cpp @@ -36,15 +36,8 @@ // This file contains the Linux-specific functions // #include "../osinclude.h" -#include "../../../OGLCompilersDLL/InitializeDll.h" -#include -#include -#include -#include -#include #include -#include #if !defined(__Fuchsia__) #include @@ -52,104 +45,6 @@ namespace glslang { -// -// Thread cleanup -// - -// -// Thread Local Storage Operations -// -inline OS_TLSIndex PthreadKeyToTLSIndex(pthread_key_t key) -{ - return (OS_TLSIndex)((uintptr_t)key + 1); -} - -inline pthread_key_t TLSIndexToPthreadKey(OS_TLSIndex nIndex) -{ - return (pthread_key_t)((uintptr_t)nIndex - 1); -} - -OS_TLSIndex OS_AllocTLSIndex() -{ - pthread_key_t pPoolIndex; - - // - // Create global pool key. - // - if ((pthread_key_create(&pPoolIndex, NULL)) != 0) { - assert(0 && "OS_AllocTLSIndex(): Unable to allocate Thread Local Storage"); - return OS_INVALID_TLS_INDEX; - } - else - return PthreadKeyToTLSIndex(pPoolIndex); -} - -bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue) -{ - if (nIndex == OS_INVALID_TLS_INDEX) { - assert(0 && "OS_SetTLSValue(): Invalid TLS Index"); - return false; - } - - if (pthread_setspecific(TLSIndexToPthreadKey(nIndex), lpvValue) == 0) - return true; - else - return false; -} - -void* OS_GetTLSValue(OS_TLSIndex nIndex) -{ - // - // This function should return 0 if nIndex is invalid. - // - assert(nIndex != OS_INVALID_TLS_INDEX); - return pthread_getspecific(TLSIndexToPthreadKey(nIndex)); -} - -bool OS_FreeTLSIndex(OS_TLSIndex nIndex) -{ - if (nIndex == OS_INVALID_TLS_INDEX) { - assert(0 && "OS_SetTLSValue(): Invalid TLS Index"); - return false; - } - - // - // Delete the global pool key. - // - if (pthread_key_delete(TLSIndexToPthreadKey(nIndex)) == 0) - return true; - else - return false; -} - -namespace { - pthread_mutex_t gMutex; -} - -static void InitMutex(void) -{ - pthread_mutexattr_t mutexattr; - pthread_mutexattr_init(&mutexattr); - pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE); - pthread_mutex_init(&gMutex, &mutexattr); -} - -void InitGlobalLock() -{ - static pthread_once_t once = PTHREAD_ONCE_INIT; - pthread_once(&once, InitMutex); -} - -void GetGlobalLock() -{ - pthread_mutex_lock(&gMutex); -} - -void ReleaseGlobalLock() -{ - pthread_mutex_unlock(&gMutex); -} - // #define DUMP_COUNTERS void OS_DumpMemoryCounters() diff --git a/third_party/glslang/glslang/OSDependent/Web/CMakeLists.txt b/third_party/glslang/glslang/OSDependent/Web/CMakeLists.txt index 5bfbed415cc..5d174960880 100644 --- a/third_party/glslang/glslang/OSDependent/Web/CMakeLists.txt +++ b/third_party/glslang/glslang/OSDependent/Web/CMakeLists.txt @@ -53,6 +53,9 @@ if(ENABLE_GLSLANG_JS) target_link_libraries(glslang.js "-s ALLOW_MEMORY_GROWTH=1") target_link_libraries(glslang.js "-s FILESYSTEM=0") + # We use ccall in glslang.pre.js, so make sure it's exposed + target_link_libraries(glslang.js "-s EXPORTED_RUNTIME_METHODS=ccall") + if(ENABLE_EMSCRIPTEN_SINGLE_FILE) target_link_libraries(glslang.js "-s SINGLE_FILE=1") endif() @@ -64,8 +67,28 @@ if(ENABLE_GLSLANG_JS) endif() if(NOT ENABLE_EMSCRIPTEN_ENVIRONMENT_NODE) - add_custom_command(TARGET glslang.js POST_BUILD - COMMAND cat ${CMAKE_CURRENT_SOURCE_DIR}/glslang.after.js >> ${CMAKE_CURRENT_BINARY_DIR}/glslang.js) + if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.18") + add_custom_command(TARGET glslang.js POST_BUILD + COMMAND ${CMAKE_COMMAND} -E cat ${CMAKE_CURRENT_SOURCE_DIR}/glslang.after.js >> ${CMAKE_CURRENT_BINARY_DIR}/glslang.js + ) + else() + if (MINGW) + message(FATAL_ERROR "Must use at least CMake 3.18") + endif() + + if (CMAKE_HOST_SYSTEM MATCHES "Windows.*") + # There are several ways we could append one file to another on Windows, but unfortunately 'cat' is not one of them + # (there is no 'cat' command in cmd). Also, since this will ultimately run in cmd and not pwsh, we need to ensure + # Windows path separators are used. + file(TO_NATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}/glslang.js" glslang_js_path) + file(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/glslang.after.js" glslang_after_js_path) + add_custom_command(TARGET glslang.js POST_BUILD + COMMAND type "${glslang_after_js_path}" >> "${glslang_js_path}") + else() + add_custom_command(TARGET glslang.js POST_BUILD + COMMAND cat ${CMAKE_CURRENT_SOURCE_DIR}/glslang.after.js >> ${CMAKE_CURRENT_BINARY_DIR}/glslang.js) + endif() + endif() endif() endif() -endif() +endif() \ No newline at end of file diff --git a/third_party/glslang/glslang/OSDependent/Web/glslang.js.cpp b/third_party/glslang/glslang/OSDependent/Web/glslang.js.cpp index f2306a60922..c820da6aa41 100644 --- a/third_party/glslang/glslang/OSDependent/Web/glslang.js.cpp +++ b/third_party/glslang/glslang/OSDependent/Web/glslang.js.cpp @@ -141,6 +141,15 @@ const TBuiltInResource DefaultTBuiltInResource = { /* .maxTaskWorkGroupSizeY_NV = */ 1, /* .maxTaskWorkGroupSizeZ_NV = */ 1, /* .maxMeshViewCountNV = */ 4, + /* .maxMeshOutputVerticesEXT = */ 256, + /* .maxMeshOutputPrimitivesEXT = */ 512, + /* .maxMeshWorkGroupSizeX_EXT = */ 32, + /* .maxMeshWorkGroupSizeY_EXT = */ 1, + /* .maxMeshWorkGroupSizeZ_EXT = */ 1, + /* .maxTaskWorkGroupSizeX_EXT = */ 32, + /* .maxTaskWorkGroupSizeY_EXT = */ 1, + /* .maxTaskWorkGroupSizeZ_EXT = */ 1, + /* .maxMeshViewCountEXT = */ 4, /* .maxDualSourceDrawBuffersEXT = */ 1, /* .limits = */ { diff --git a/third_party/glslang/glslang/OSDependent/Web/glslang.pre.js b/third_party/glslang/glslang/OSDependent/Web/glslang.pre.js index 46a569506d7..390390e99fb 100644 --- a/third_party/glslang/glslang/OSDependent/Web/glslang.pre.js +++ b/third_party/glslang/glslang/OSDependent/Web/glslang.pre.js @@ -25,7 +25,7 @@ Module['compileGLSLZeroCopy'] = function(glsl, shader_stage, gen_debug, spirv_ve var p_output = Module['_malloc'](4); var p_output_len = Module['_malloc'](4); - var id = ccall('convert_glsl_to_spirv', + var id = Module['ccall']('convert_glsl_to_spirv', 'number', ['string', 'number', 'boolean', 'number', 'number', 'number'], [glsl, shader_stage_int, gen_debug, spirv_version_int, p_output, p_output_len]); diff --git a/third_party/glslang/glslang/OSDependent/Windows/CMakeLists.txt b/third_party/glslang/glslang/OSDependent/Windows/CMakeLists.txt index 6048bb872dc..882133ab308 100644 --- a/third_party/glslang/glslang/OSDependent/Windows/CMakeLists.txt +++ b/third_party/glslang/glslang/OSDependent/Windows/CMakeLists.txt @@ -55,7 +55,7 @@ if(ENABLE_GLSLANG_INSTALL) message(WARNING \"Using `OSDependentTargets.cmake` is deprecated: use `find_package(glslang)` to find glslang CMake targets.\") if (NOT TARGET glslang::OSDependent) - include(\"\${CMAKE_CURRENT_LIST_DIR}/../../${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/glslang-targets.cmake\") + include(\"${CMAKE_INSTALL_FULL_LIBDIR}/cmake/${PROJECT_NAME}/glslang-targets.cmake\") endif() add_library(OSDependent ALIAS glslang::OSDependent) diff --git a/third_party/glslang/glslang/OSDependent/Windows/ossource.cpp b/third_party/glslang/glslang/OSDependent/Windows/ossource.cpp index 870840c56ea..d7f89f71b64 100644 --- a/third_party/glslang/glslang/OSDependent/Windows/ossource.cpp +++ b/third_party/glslang/glslang/OSDependent/Windows/ossource.cpp @@ -37,11 +37,9 @@ #define STRICT #define VC_EXTRALEAN 1 #include -#include #include #include #include -#include // // This file contains the Window-OS-specific functions @@ -53,84 +51,6 @@ namespace glslang { -inline OS_TLSIndex ToGenericTLSIndex (DWORD handle) -{ - return (OS_TLSIndex)((uintptr_t)handle + 1); -} - -inline DWORD ToNativeTLSIndex (OS_TLSIndex nIndex) -{ - return (DWORD)((uintptr_t)nIndex - 1); -} - -// -// Thread Local Storage Operations -// -OS_TLSIndex OS_AllocTLSIndex() -{ - DWORD dwIndex = TlsAlloc(); - if (dwIndex == TLS_OUT_OF_INDEXES) { - assert(0 && "OS_AllocTLSIndex(): Unable to allocate Thread Local Storage"); - return OS_INVALID_TLS_INDEX; - } - - return ToGenericTLSIndex(dwIndex); -} - -bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue) -{ - if (nIndex == OS_INVALID_TLS_INDEX) { - assert(0 && "OS_SetTLSValue(): Invalid TLS Index"); - return false; - } - - if (TlsSetValue(ToNativeTLSIndex(nIndex), lpvValue)) - return true; - else - return false; -} - -void* OS_GetTLSValue(OS_TLSIndex nIndex) -{ - assert(nIndex != OS_INVALID_TLS_INDEX); - return TlsGetValue(ToNativeTLSIndex(nIndex)); -} - -bool OS_FreeTLSIndex(OS_TLSIndex nIndex) -{ - if (nIndex == OS_INVALID_TLS_INDEX) { - assert(0 && "OS_SetTLSValue(): Invalid TLS Index"); - return false; - } - - if (TlsFree(ToNativeTLSIndex(nIndex))) - return true; - else - return false; -} - -HANDLE GlobalLock; - -void InitGlobalLock() -{ - GlobalLock = CreateMutex(0, false, 0); -} - -void GetGlobalLock() -{ - WaitForSingleObject(GlobalLock, INFINITE); -} - -void ReleaseGlobalLock() -{ - ReleaseMutex(GlobalLock); -} - -unsigned int __stdcall EnterGenericThread (void* entry) -{ - return ((TThreadEntrypoint)entry)(0); -} - //#define DUMP_COUNTERS void OS_DumpMemoryCounters() diff --git a/third_party/glslang/glslang/OSDependent/osinclude.h b/third_party/glslang/glslang/OSDependent/osinclude.h index fcfeff2cc41..0d677e4afdf 100644 --- a/third_party/glslang/glslang/OSDependent/osinclude.h +++ b/third_party/glslang/glslang/OSDependent/osinclude.h @@ -37,23 +37,6 @@ namespace glslang { -// -// Thread Local Storage Operations -// -typedef void* OS_TLSIndex; -#define OS_INVALID_TLS_INDEX ((void*)0) - -OS_TLSIndex OS_AllocTLSIndex(); -bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue); -bool OS_FreeTLSIndex(OS_TLSIndex nIndex); -void* OS_GetTLSValue(OS_TLSIndex nIndex); - -void InitGlobalLock(); -void GetGlobalLock(); -void ReleaseGlobalLock(); - -typedef unsigned int (*TThreadEntrypoint)(void*); - void OS_DumpMemoryCounters(); } // end namespace glslang diff --git a/third_party/glslang/StandAlone/ResourceLimits.h b/third_party/glslang/glslang/Public/ResourceLimits.h similarity index 90% rename from third_party/glslang/StandAlone/ResourceLimits.h rename to third_party/glslang/glslang/Public/ResourceLimits.h index 736248eb390..f70be8172a6 100644 --- a/third_party/glslang/StandAlone/ResourceLimits.h +++ b/third_party/glslang/glslang/Public/ResourceLimits.h @@ -37,14 +37,16 @@ #include -#include "../glslang/Include/ResourceLimits.h" +#include "../Include/ResourceLimits.h" -namespace glslang { +// Return pointer to user-writable Resource to pass through API in +// future-proof way. +extern TBuiltInResource* GetResources(); // These are the default resources for TBuiltInResources, used for both // - parsing this string for the case where the user didn't supply one, // - dumping out a template for user construction of a config file. -extern const TBuiltInResource DefaultTBuiltInResource; +extern const TBuiltInResource* GetDefaultResources(); // Returns the DefaultTBuiltInResource as a human-readable string. std::string GetDefaultTBuiltInResourceString(); @@ -52,6 +54,4 @@ std::string GetDefaultTBuiltInResourceString(); // Decodes the resource limits from |config| to |resources|. void DecodeResourceLimits(TBuiltInResource* resources, char* config); -} // end namespace glslang - #endif // _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_ diff --git a/third_party/glslang/glslang/Public/ShaderLang.h b/third_party/glslang/glslang/Public/ShaderLang.h index 78dd323a2e4..c22cb2b43e3 100644 --- a/third_party/glslang/glslang/Public/ShaderLang.h +++ b/third_party/glslang/glslang/Public/ShaderLang.h @@ -573,6 +573,9 @@ class TShader { void setEnvInputVulkanRulesRelaxed() { environment.input.vulkanRulesRelaxed = true; } bool getEnvInputVulkanRulesRelaxed() const { return environment.input.vulkanRulesRelaxed; } + void setCompileOnly() { compileOnly = true; } + bool getCompileOnly() const { return compileOnly; } + // Interface to #include handlers. // // To support #include, a client of Glslang does the following: @@ -722,14 +725,15 @@ class TShader { TEnvironment environment; + // Indicates this shader is meant to be used without linking + bool compileOnly = false; + friend class TProgram; private: TShader& operator=(TShader&); }; -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - // // A reflection database and its interface, consistent with the OpenGL API reflection queries. // @@ -846,8 +850,6 @@ class TIoMapResolver virtual void addStage(EShLanguage stage, TIntermediate& stageIntermediate) = 0; }; -#endif // !GLSLANG_WEB && !GLSLANG_ANGLE - // Make one TProgram per set of shaders that will get linked together. Add all // the shaders that are to be linked together. After calling shader.parse() // for all shaders, call link(). @@ -867,8 +869,6 @@ class TProgram { TIntermediate* getIntermediate(EShLanguage stage) const { return intermediate[stage]; } -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - // Reflection Interface // call first, to do liveness analysis, index mapping, etc.; returns false on failure @@ -961,7 +961,6 @@ class TProgram { // If resolver is not provided it uses the previous approach // and respects auto assignment and offsets. GLSLANG_EXPORT bool mapIO(TIoMapResolver* pResolver = nullptr, TIoMapper* pIoMapper = nullptr); -#endif // !GLSLANG_WEB && !GLSLANG_ANGLE protected: GLSLANG_EXPORT bool linkStage(EShLanguage, EShMessages); @@ -972,9 +971,7 @@ class TProgram { TIntermediate* intermediate[EShLangCount]; bool newedIntermediate[EShLangCount]; // track which intermediate were "new" versus reusing a singleton unit in a stage TInfoSink* infoSink; -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) TReflection* reflection; -#endif bool linked; private: diff --git a/third_party/glslang/StandAlone/resource_limits_c.h b/third_party/glslang/glslang/Public/resource_limits_c.h similarity index 93% rename from third_party/glslang/StandAlone/resource_limits_c.h rename to third_party/glslang/glslang/Public/resource_limits_c.h index 108fd5e21ed..05aa8eb0269 100644 --- a/third_party/glslang/StandAlone/resource_limits_c.h +++ b/third_party/glslang/glslang/Public/resource_limits_c.h @@ -29,12 +29,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_ #define _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_ -#include "../glslang/Include/glslang_c_interface.h" +#include "../Include/glslang_c_interface.h" #ifdef __cplusplus extern "C" { #endif +// Returns a struct that can be use to create custom resource values. +glslang_resource_t* glslang_resource(void); + // These are the default resources for TBuiltInResources, used for both // - parsing this string for the case where the user didn't supply one, // - dumping out a template for user construction of a config file. diff --git a/third_party/glslang/StandAlone/ResourceLimits.cpp b/third_party/glslang/glslang/ResourceLimits/ResourceLimits.cpp similarity index 99% rename from third_party/glslang/StandAlone/ResourceLimits.cpp rename to third_party/glslang/glslang/ResourceLimits/ResourceLimits.cpp index 1a76bf62d27..0e9d1b5480c 100644 --- a/third_party/glslang/StandAlone/ResourceLimits.cpp +++ b/third_party/glslang/glslang/ResourceLimits/ResourceLimits.cpp @@ -37,9 +37,9 @@ #include #include -#include "ResourceLimits.h" +#include "glslang/Public/ResourceLimits.h" -namespace glslang { +TBuiltInResource Resources; const TBuiltInResource DefaultTBuiltInResource = { /* .MaxLights = */ 32, @@ -505,6 +505,8 @@ void DecodeResourceLimits(TBuiltInResource* resources, char* config) resources->maxTaskWorkGroupSizeZ_EXT = value; else if (tokenStr == "MaxMeshViewCountEXT") resources->maxMeshViewCountEXT = value; + else if (tokenStr == "MaxDualSourceDrawBuffersEXT") + resources->maxDualSourceDrawBuffersEXT = value; else if (tokenStr == "nonInductiveForLoops") resources->limits.nonInductiveForLoops = (value != 0); else if (tokenStr == "whileLoops") @@ -529,4 +531,12 @@ void DecodeResourceLimits(TBuiltInResource* resources, char* config) } } -} // end namespace glslang +TBuiltInResource* GetResources() +{ + return &Resources; +} + +const TBuiltInResource* GetDefaultResources() +{ + return &DefaultTBuiltInResource; +} diff --git a/third_party/glslang/StandAlone/resource_limits_c.cpp b/third_party/glslang/glslang/ResourceLimits/resource_limits_c.cpp similarity index 82% rename from third_party/glslang/StandAlone/resource_limits_c.cpp rename to third_party/glslang/glslang/ResourceLimits/resource_limits_c.cpp index a1f681c7b8f..0eeac23a5ea 100644 --- a/third_party/glslang/StandAlone/resource_limits_c.cpp +++ b/third_party/glslang/glslang/ResourceLimits/resource_limits_c.cpp @@ -26,15 +26,20 @@ 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 "resource_limits_c.h" -#include "ResourceLimits.h" +#include "glslang/Public/resource_limits_c.h" +#include "glslang/Public/ResourceLimits.h" #include #include #include +glslang_resource_t* glslang_resource(void) +{ + return reinterpret_cast(GetResources()); +} + const glslang_resource_t* glslang_default_resource(void) { - return reinterpret_cast(&glslang::DefaultTBuiltInResource); + return reinterpret_cast(GetDefaultResources()); } #if defined(__clang__) || defined(__GNUC__) @@ -47,7 +52,7 @@ const glslang_resource_t* glslang_default_resource(void) const char* glslang_default_resource_string() { - std::string cpp_str = glslang::GetDefaultTBuiltInResourceString(); + std::string cpp_str = GetDefaultTBuiltInResourceString(); char* c_str = (char*)malloc(cpp_str.length() + 1); strcpy(c_str, cpp_str.c_str()); return c_str; @@ -61,5 +66,5 @@ const char* glslang_default_resource_string() void glslang_decode_resource_limits(glslang_resource_t* resources, char* config) { - glslang::DecodeResourceLimits(reinterpret_cast(resources), config); + DecodeResourceLimits(reinterpret_cast(resources), config); } diff --git a/third_party/glslang/glslang/updateGrammar b/third_party/glslang/glslang/updateGrammar index 9209493f380..a15dc24b309 100755 --- a/third_party/glslang/glslang/updateGrammar +++ b/third_party/glslang/glslang/updateGrammar @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # Copyright (C) 2020 The Khronos Group Inc. # @@ -33,17 +33,4 @@ # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. -if [ "$1" = 'web' ] -then - m4 -P -DGLSLANG_WEB MachineIndependent/glslang.m4 > MachineIndependent/glslang.y -elif [ "$#" -eq 0 ] -then - m4 -P MachineIndependent/glslang.m4 > MachineIndependent/glslang.y -else - echo usage: - echo $0 web - echo $0 - exit -fi - bison --defines=MachineIndependent/glslang_tab.cpp.h -t MachineIndependent/glslang.y -o MachineIndependent/glslang_tab.cpp diff --git a/third_party/glslang/gtests/AST.FromFile.cpp b/third_party/glslang/gtests/AST.FromFile.cpp index 1d975464f1c..828dabec475 100644 --- a/third_party/glslang/gtests/AST.FromFile.cpp +++ b/third_party/glslang/gtests/AST.FromFile.cpp @@ -211,6 +211,7 @@ INSTANTIATE_TEST_SUITE_P( "runtimeArray.vert", "simpleFunctionCall.frag", "stringToDouble.vert", + "struct.error.frag", "structAssignment.frag", "structDeref.frag", "structure.frag", @@ -280,6 +281,8 @@ INSTANTIATE_TEST_SUITE_P( "glsl.es320.subgroupShuffleRelative.comp", "glsl.es320.subgroupQuad.comp", "glsl.es320.subgroupVote.comp", + "glsl.es320.extTextureShadowLod.frag", + "glsl.ext.textureShadowLod.frag", "terminate.frag", "terminate.vert", "negativeWorkGroupSize.comp", @@ -291,6 +294,7 @@ INSTANTIATE_TEST_SUITE_P( "GL_EXT_shader_integer_mix.vert", "GL_ARB_draw_instanced.vert", "GL_ARB_fragment_coord_conventions.vert", + "GL_ARB_bindless_texture.frag", "BestMatchFunction.vert", "EndStreamPrimitive.geom", "floatBitsToInt.vert", diff --git a/third_party/glslang/gtests/BuiltInResource.FromFile.cpp b/third_party/glslang/gtests/BuiltInResource.FromFile.cpp index da81fe98c39..eeea51187d2 100644 --- a/third_party/glslang/gtests/BuiltInResource.FromFile.cpp +++ b/third_party/glslang/gtests/BuiltInResource.FromFile.cpp @@ -36,7 +36,7 @@ #include -#include "StandAlone/ResourceLimits.h" +#include "glslang/Public/ResourceLimits.h" #include "TestFixture.h" namespace glslangtest { @@ -49,9 +49,19 @@ TEST_F(DefaultResourceTest, FromFile) const std::string path = GlobalTestSettings.testRoot + "/baseResults/test.conf"; std::string expectedConfig; tryLoadFile(path, "expected resource limit", &expectedConfig); - const std::string realConfig = glslang::GetDefaultTBuiltInResourceString(); + const std::string realConfig = GetDefaultTBuiltInResourceString(); ASSERT_EQ(expectedConfig, realConfig); } +TEST_F(DefaultResourceTest, UnrecognizedLimit) +{ + const std::string defaultConfig = GetDefaultTBuiltInResourceString(); + testing::internal::CaptureStdout(); + TBuiltInResource resources; + DecodeResourceLimits(&resources, const_cast(defaultConfig.c_str())); + std::string output = testing::internal::GetCapturedStdout(); + ASSERT_EQ(output.find("unrecognized limit"), std::string::npos); +} + } // anonymous namespace } // namespace glslangtest diff --git a/third_party/glslang/gtests/CMakeLists.txt b/third_party/glslang/gtests/CMakeLists.txt index 8dff7ede028..408a92db536 100644 --- a/third_party/glslang/gtests/CMakeLists.txt +++ b/third_party/glslang/gtests/CMakeLists.txt @@ -76,7 +76,7 @@ if(BUILD_TESTING) message(WARNING \"Using `glslangtestsTargets.cmake` is deprecated: use `find_package(glslang)` to find glslang CMake targets.\") if (NOT TARGET glslang::glslangtests) - include(\"\${CMAKE_CURRENT_LIST_DIR}/../../${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/glslang-targets.cmake\") + include(\"${CMAKE_INSTALL_FULL_LIBDIR}/cmake/${PROJECT_NAME}/glslang-targets.cmake\") endif() add_library(glslangtests ALIAS glslang::glslangtests) diff --git a/third_party/glslang/gtests/Config.FromFile.cpp b/third_party/glslang/gtests/Config.FromFile.cpp index dd18c13a93b..05107e78708 100644 --- a/third_party/glslang/gtests/Config.FromFile.cpp +++ b/third_party/glslang/gtests/Config.FromFile.cpp @@ -32,7 +32,7 @@ // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. -#include "StandAlone/ResourceLimits.h" +#include "glslang/Public/ResourceLimits.h" #include "TestFixture.h" namespace glslangtest { @@ -65,7 +65,7 @@ TEST_P(ConfigTest, FromFile) char* configChars = new char[len + 1]; memcpy(configChars, configContents.data(), len); configChars[len] = 0; - glslang::DecodeResourceLimits(&resources, configChars); + DecodeResourceLimits(&resources, configChars); delete[] configChars; } diff --git a/third_party/glslang/gtests/GlslMapIO.FromFile.cpp b/third_party/glslang/gtests/GlslMapIO.FromFile.cpp index aabb4ae203a..1dba5c0c99b 100644 --- a/third_party/glslang/gtests/GlslMapIO.FromFile.cpp +++ b/third_party/glslang/gtests/GlslMapIO.FromFile.cpp @@ -42,7 +42,6 @@ #include "glslang/MachineIndependent/iomapper.h" #include "glslang/MachineIndependent/reflection.h" -#ifndef GLSLANG_WEB namespace glslangtest { namespace { @@ -352,4 +351,3 @@ INSTANTIATE_TEST_SUITE_P( } // anonymous namespace } // namespace glslangtest -#endif diff --git a/third_party/glslang/gtests/Hlsl.FromFile.cpp b/third_party/glslang/gtests/Hlsl.FromFile.cpp index 59742576209..9f32495580b 100755 --- a/third_party/glslang/gtests/Hlsl.FromFile.cpp +++ b/third_party/glslang/gtests/Hlsl.FromFile.cpp @@ -59,6 +59,7 @@ std::string FileNameAsCustomTestSuffix( using HlslCompileTest = GlslangTest<::testing::TestWithParam>; using HlslVulkan1_1CompileTest = GlslangTest<::testing::TestWithParam>; +using HlslVulkan1_2CompileTest = GlslangTest<::testing::TestWithParam>; using HlslSpv1_6CompileTest = GlslangTest<::testing::TestWithParam>; using HlslCompileAndFlattenTest = GlslangTest<::testing::TestWithParam>; using HlslLegalizeTest = GlslangTest<::testing::TestWithParam>; @@ -83,6 +84,13 @@ TEST_P(HlslVulkan1_1CompileTest, FromFile) Target::BothASTAndSpv, true, GetParam().entryPoint); } +TEST_P(HlslVulkan1_2CompileTest, FromFile) +{ + loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName, Source::HLSL, Semantics::Vulkan, + glslang::EShTargetVulkan_1_2, glslang::EShTargetSpv_1_4, Target::BothASTAndSpv, true, + GetParam().entryPoint); +} + TEST_P(HlslSpv1_6CompileTest, FromFile) { loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName, @@ -205,6 +213,7 @@ INSTANTIATE_TEST_SUITE_P( {"hlsl.earlydepthstencil.frag", "main"}, {"hlsl.emptystructreturn.frag", "main"}, {"hlsl.emptystructreturn.vert", "main"}, + {"hlsl.emptystructreturn.tesc", "main"}, {"hlsl.emptystruct.init.vert", "main"}, {"hlsl.entry-in.frag", "PixelShaderFunction"}, {"hlsl.entry-out.frag", "PixelShaderFunction"}, @@ -312,6 +321,7 @@ INSTANTIATE_TEST_SUITE_P( {"hlsl.matrixindex.frag", "main"}, {"hlsl.nonstaticMemberFunction.frag", "main"}, {"hlsl.numericsuffixes.frag", "main"}, + {"hlsl.numericsuffixes.negative.frag", "main"}, {"hlsl.numthreads.comp", "main_aux2"}, {"hlsl.overload.frag", "PixelShaderFunction"}, {"hlsl.opaque-type-bug.frag", "main"}, @@ -402,6 +412,7 @@ INSTANTIATE_TEST_SUITE_P( {"hlsl.structbuffer.rw.frag", "main"}, {"hlsl.structbuffer.rwbyte.frag", "main"}, {"hlsl.structbuffer.rwbyte2.comp", "main"}, + {"hlsl.structcopy.comp", "main"}, {"hlsl.structin.vert", "main"}, {"hlsl.structIoFourWay.frag", "main"}, {"hlsl.structStructName.frag", "main"}, @@ -417,6 +428,7 @@ INSTANTIATE_TEST_SUITE_P( {"hlsl.matType.bool.frag", "main"}, {"hlsl.matType.int.frag", "main"}, {"hlsl.max.frag", "PixelShaderFunction"}, + {"hlsl.nested-runtimeArray.frag", "main"}, {"hlsl.preprocessor.frag", "main"}, {"hlsl.precedence.frag", "PixelShaderFunction"}, {"hlsl.precedence2.frag", "PixelShaderFunction"}, @@ -465,13 +477,22 @@ INSTANTIATE_TEST_SUITE_P( }), FileNameAsCustomTestSuffix ); + +INSTANTIATE_TEST_SUITE_P( + ToSpirv, HlslVulkan1_2CompileTest, + ::testing::ValuesIn(std::vector{ + {"hlsl.buffer_ref_parameter.comp", "main"}, + }), + FileNameAsCustomTestSuffix +); // clang-format on // clang-format off INSTANTIATE_TEST_SUITE_P( ToSpirv, HlslSpv1_6CompileTest, ::testing::ValuesIn(std::vector{ - {"hlsl.spv.1.6.discard.frag", "PixelShaderFunction"} + {"hlsl.spv.1.6.discard.frag", "PixelShaderFunction"}, + {"hlsl.structcopylogical.comp","main"}, }), FileNameAsCustomTestSuffix ); diff --git a/third_party/glslang/gtests/Link.FromFile.Vk.cpp b/third_party/glslang/gtests/Link.FromFile.Vk.cpp index 4db71c2c968..fed5d260cf4 100755 --- a/third_party/glslang/gtests/Link.FromFile.Vk.cpp +++ b/third_party/glslang/gtests/Link.FromFile.Vk.cpp @@ -75,10 +75,8 @@ TEST_P(LinkTestVulkan, FromFile) result.linkingOutput = program.getInfoLog(); result.linkingError = program.getInfoDebugLog(); -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - if (success) - program.mapIO(); -#endif + if (success) + program.mapIO(); if (success && (controls & EShMsgSpvRules)) { spv::SpvBuildLogger logger; diff --git a/third_party/glslang/gtests/Link.FromFile.cpp b/third_party/glslang/gtests/Link.FromFile.cpp index 9e029fc7b23..3b769bbb6eb 100755 --- a/third_party/glslang/gtests/Link.FromFile.cpp +++ b/third_party/glslang/gtests/Link.FromFile.cpp @@ -90,6 +90,9 @@ INSTANTIATE_TEST_SUITE_P( Glsl, LinkTest, ::testing::ValuesIn(std::vector>({ {"mains1.frag", "mains2.frag", "noMain1.geom", "noMain2.geom"}, + {"implicitArraySize.vert", "implicitArraySize.frag"}, + {"implicitArraySizeBuiltin.vert", "implicitArraySizeBuiltin.geom"}, + {"implicitArraySize1.geom", "implicitArraySize2.geom"}, {"noMain.vert", "mains.frag"}, {"link1.frag", "link2.frag", "link3.frag"}, {"recurse1.vert", "recurse1.frag", "recurse2.frag"}, diff --git a/third_party/glslang/gtests/Spv.FromFile.cpp b/third_party/glslang/gtests/Spv.FromFile.cpp index ed0f5cada52..80eff330e7b 100644 --- a/third_party/glslang/gtests/Spv.FromFile.cpp +++ b/third_party/glslang/gtests/Spv.FromFile.cpp @@ -65,6 +65,7 @@ std::string FileNameAsCustomTestSuffixIoMap( } using CompileVulkanToSpirvTest = GlslangTest<::testing::TestWithParam>; +using CompileVulkanToSpirvTestNoLink = GlslangTest<::testing::TestWithParam>; using CompileVulkanToSpirvDeadCodeElimTest = GlslangTest<::testing::TestWithParam>; using CompileVulkanToDebugSpirvTest = GlslangTest<::testing::TestWithParam>; using CompileVulkan1_1ToSpirvTest = GlslangTest<::testing::TestWithParam>; @@ -76,6 +77,7 @@ using OpenGLSemantics = GlslangTest<::testing::TestWithParam>; using VulkanAstSemantics = GlslangTest<::testing::TestWithParam>; using HlslIoMap = GlslangTest<::testing::TestWithParam>; using GlslIoMap = GlslangTest<::testing::TestWithParam>; +using CompileVulkanToSpirvTestQCOM = GlslangTest<::testing::TestWithParam>; using CompileVulkanToSpirvTestAMD = GlslangTest<::testing::TestWithParam>; using CompileVulkanToSpirvTestNV = GlslangTest<::testing::TestWithParam>; using CompileVulkanToSpirv14TestNV = GlslangTest<::testing::TestWithParam>; @@ -91,6 +93,16 @@ TEST_P(CompileVulkanToSpirvTest, FromFile) Target::Spv); } +// Compiling GLSL to SPIR-V under Vulkan semantics without linking. Expected to successfully generate SPIR-V. +TEST_P(CompileVulkanToSpirvTestNoLink, FromFile) +{ + options().compileOnly = true; + // NOTE: Vulkan 1.3 is currently required to use the linkage capability + // TODO(ncesario) make sure this is actually necessary + loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), Source::GLSL, Semantics::Vulkan, + glslang::EShTargetVulkan_1_3, glslang::EShTargetSpv_1_0, Target::Spv); +} + TEST_P(CompileVulkanToSpirvDeadCodeElimTest, FromFile) { loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), @@ -196,6 +208,15 @@ TEST_P(GlslIoMap, FromFile) GetParam().flattenUniforms); } +// Compiling GLSL to SPIR-V under Vulkan semantics (QCOM extensions enabled). +// Expected to successfully generate SPIR-V. +TEST_P(CompileVulkanToSpirvTestQCOM, FromFile) +{ + loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), + Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0, + Target::Spv); +} + // Compiling GLSL to SPIR-V under Vulkan semantics (AMD extensions enabled). // Expected to successfully generate SPIR-V. TEST_P(CompileVulkanToSpirvTestAMD, FromFile) @@ -345,6 +366,12 @@ INSTANTIATE_TEST_SUITE_P( "spv.conversion.frag", "spv.coopmat.comp", "spv.coopmat_Error.comp", + "spv.coopmatKHR.comp", + "spv.coopmatKHR_arithmetic.comp", + "spv.coopmatKHR_arithmeticError.comp", + "spv.coopmatKHR_Error.comp", + "spv.coopmatKHR_constructor.comp", + "spv.coopmatKHR_constructorError.comp", "spv.dataOut.frag", "spv.dataOutIndirect.frag", "spv.dataOutIndirect.vert", @@ -357,6 +384,12 @@ INSTANTIATE_TEST_SUITE_P( "spv.discard-dce.frag", "spv.doWhileLoop.frag", "spv.earlyReturnDiscard.frag", + "spv.ext.ShaderTileImage.color.frag", + "spv.ext.ShaderTileImage.depth_stencil.frag", + "spv.ext.ShaderTileImage.subpassinput.frag", + "spv.ext.ShaderTileImage.typemismatch.frag", + "spv.ext.ShaderTileImage.overlap.frag", + "spv.ext.ShaderTileImage.wronglayout.frag", "spv.extPostDepthCoverage.frag", "spv.extPostDepthCoverage_Error.frag", "spv.float16convertonlyarith.comp", @@ -384,12 +417,15 @@ INSTANTIATE_TEST_SUITE_P( "spv.intOps.vert", "spv.intrinsicsSpirvByReference.vert", "spv.intrinsicsSpirvDecorate.frag", + "spv.intrinsicsSpirvDecorateId.comp", + "spv.intrinsicsSpirvDecorateString.comp", "spv.intrinsicsSpirvExecutionMode.frag", "spv.intrinsicsSpirvInstruction.vert", "spv.intrinsicsSpirvLiteral.vert", "spv.intrinsicsSpirvStorageClass.rchit", "spv.intrinsicsSpirvType.rgen", "spv.intrinsicsSpirvTypeLocalVar.vert", + "spv.intrinsicsSpirvTypeWithTypeSpecifier.vert", "spv.invariantAll.vert", "spv.layer.tese", "spv.layoutNested.vert", @@ -441,6 +477,7 @@ INSTANTIATE_TEST_SUITE_P( "spv.sparseTexture.frag", "spv.sparseTextureClamp.frag", "spv.structAssignment.frag", + "spv.structCopy.comp", "spv.structDeref.frag", "spv.structure.frag", "spv.switch.frag", @@ -480,6 +517,7 @@ INSTANTIATE_TEST_SUITE_P( "spv.storageBuffer.vert", "spv.terminate.frag", "spv.subgroupUniformControlFlow.vert", + "spv.subgroupSizeARB.frag", "spv.precise.tese", "spv.precise.tesc", "spv.viewportindex.tese", @@ -492,11 +530,25 @@ INSTANTIATE_TEST_SUITE_P( "spv.samplerlessTextureFunctions.frag", "spv.smBuiltins.vert", "spv.smBuiltins.frag", + "spv.ARMCoreBuiltIns.vert", + "spv.ARMCoreBuiltIns.frag", "spv.builtin.PrimitiveShadingRateEXT.vert", "spv.builtin.ShadingRateEXT.frag", "spv.atomicAdd.bufferReference.comp", "spv.fragmentShaderBarycentric3.frag", "spv.fragmentShaderBarycentric4.frag", + "spv.ext.textureShadowLod.frag", + "spv.ext.textureShadowLod.error.frag", + "spv.floatFetch.frag", + "spv.atomicRvalue.error.vert", + })), + FileNameAsCustomTestSuffix +); + +INSTANTIATE_TEST_SUITE_P( + Glsl, CompileVulkanToSpirvTestNoLink, + ::testing::ValuesIn(std::vector({ + "spv.exportFunctions.comp", })), FileNameAsCustomTestSuffix ); @@ -641,6 +693,7 @@ INSTANTIATE_TEST_SUITE_P( // SPV_EXT_mesh_shader "spv.ext.meshShaderBuiltins.mesh", + "spv.ext.meshShaderBuiltinsShadingRate.mesh", "spv.ext.meshShaderRedeclBuiltins.mesh", "spv.ext.meshShaderTaskMem.mesh", "spv.ext.meshShaderUserDefined.mesh", @@ -649,6 +702,21 @@ INSTANTIATE_TEST_SUITE_P( "spv.atomiAddEXT.task", "spv.460.subgroupEXT.task", "spv.460.subgroupEXT.mesh", + + // SPV_NV_shader_execution_reorder + + "spv.nv.hitobject-allops.rgen", + "spv.nv.hitobject-allops.rchit", + "spv.nv.hitobject-allops.rmiss", + + + // SPV_NV_displacment_micromap + + "spv.nv.dmm-allops.rgen", + "spv.nv.dmm-allops.rchit", + "spv.nv.dmm-allops.rahit", + "spv.nv.dmm-allops.mesh", + "spv.nv.dmm-allops.comp", })), FileNameAsCustomTestSuffix ); @@ -659,6 +727,7 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn(std::vector({ "spv.1.6.conditionalDiscard.frag", "spv.1.6.helperInvocation.frag", + "spv.1.6.helperInvocation.memmodel.frag", "spv.1.6.specConstant.comp", "spv.1.6.samplerBuffer.frag", "spv.1.6.separate.frag", @@ -730,6 +799,7 @@ INSTANTIATE_TEST_SUITE_P( "vulkan.vert", "vulkan.comp", "samplerlessTextureFunctions.frag", + "spv.intrinsicsFakeEnable.vert", "spv.specConstArrayCheck.vert", })), FileNameAsCustomTestSuffix @@ -755,6 +825,18 @@ INSTANTIATE_TEST_SUITE_P( FileNameAsCustomTestSuffix ); +INSTANTIATE_TEST_SUITE_P( + Glsl, CompileVulkanToSpirvTestQCOM, + ::testing::ValuesIn(std::vector({ + "spv.tpipSampleWeighted.frag", + "spv.tpipBoxFilter.frag", + "spv.tpipBlockMatchSSD.frag", + "spv.tpipBlockMatchSAD.frag", + "spv.tpipTextureArrays.frag", + })), + FileNameAsCustomTestSuffix +); + INSTANTIATE_TEST_SUITE_P( Glsl, CompileVulkanToSpirvTestAMD, ::testing::ValuesIn(std::vector({ @@ -848,7 +930,9 @@ INSTANTIATE_TEST_SUITE_P( "spv.debuginfo.glsl.comp", "spv.debuginfo.glsl.geom", "spv.debuginfo.glsl.tesc", - "spv.debuginfo.glsl.tese" + "spv.debuginfo.glsl.tese", + "spv.debuginfo.const_params.glsl.comp", + "spv.debuginfo.scalar_types.glsl.frag", })), FileNameAsCustomTestSuffix ); diff --git a/third_party/glslang/gtests/TestFixture.h b/third_party/glslang/gtests/TestFixture.h index d087d6ddc65..df3433bfcef 100755 --- a/third_party/glslang/gtests/TestFixture.h +++ b/third_party/glslang/gtests/TestFixture.h @@ -48,7 +48,7 @@ #include "SPIRV/disassemble.h" #include "SPIRV/doc.h" #include "SPIRV/SPVRemapper.h" -#include "StandAlone/ResourceLimits.h" +#include "glslang/Public/ResourceLimits.h" #include "glslang/Public/ShaderLang.h" #include "Initializer.h" @@ -199,7 +199,7 @@ class GlslangTest : public GT { shader->setStringsWithLengths(&shaderStrings, &shaderLengths, 1); if (!entryPointName.empty()) shader->setEntryPoint(entryPointName.c_str()); return shader->parse( - (resources ? resources : &glslang::DefaultTBuiltInResource), + (resources ? resources : GetDefaultResources()), defaultVersion, isForwardCompatible, controls); } @@ -248,38 +248,58 @@ class GlslangTest : public GT { } } + if (options().compileOnly) + shader.setCompileOnly(); + bool success = compile( &shader, code, entryPointName, controls, nullptr, &shaderName); glslang::TProgram program; - program.addShader(&shader); - success &= program.link(controls); -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) - if (success) - program.mapIO(); -#endif - - if (success && (controls & EShMsgSpvRules)) { - spv::SpvBuildLogger logger; - std::vector spirv_binary; + spv::SpvBuildLogger logger; + std::vector spirv_binary; + + if (!options().compileOnly) { + program.addShader(&shader); + success &= program.link(controls); + if (success) + program.mapIO(); + + if (success && (controls & EShMsgSpvRules)) { + options().disableOptimizer = !enableOptimizer; + options().generateDebugInfo = enableDebug; + options().emitNonSemanticShaderDebugInfo = enableNonSemanticShaderDebugInfo; + options().emitNonSemanticShaderDebugSource = enableNonSemanticShaderDebugInfo; + glslang::GlslangToSpv(*program.getIntermediate(stage), spirv_binary, &logger, &options()); + } else { + return {{ + {shaderName, shader.getInfoLog(), shader.getInfoDebugLog()}, + }, + program.getInfoLog(), + program.getInfoDebugLog(), + true, + "", + ""}; + } + } else { options().disableOptimizer = !enableOptimizer; options().generateDebugInfo = enableDebug; options().emitNonSemanticShaderDebugInfo = enableNonSemanticShaderDebugInfo; options().emitNonSemanticShaderDebugSource = enableNonSemanticShaderDebugInfo; - glslang::GlslangToSpv(*program.getIntermediate(stage), - spirv_binary, &logger, &options()); - - std::ostringstream disassembly_stream; - spv::Parameterize(); - spv::Disassemble(disassembly_stream, spirv_binary); - bool validation_result = !options().validate || logger.getAllMessages().empty(); - return {{{shaderName, shader.getInfoLog(), shader.getInfoDebugLog()},}, - program.getInfoLog(), program.getInfoDebugLog(), - validation_result, logger.getAllMessages(), disassembly_stream.str()}; - } else { - return {{{shaderName, shader.getInfoLog(), shader.getInfoDebugLog()},}, - program.getInfoLog(), program.getInfoDebugLog(), true, "", ""}; + glslang::GlslangToSpv(*shader.getIntermediate(), spirv_binary, &logger, &options()); } + + std::ostringstream disassembly_stream; + spv::Parameterize(); + spv::Disassemble(disassembly_stream, spirv_binary); + bool validation_result = !options().validate || logger.getAllMessages().empty(); + return {{ + {shaderName, shader.getInfoLog(), shader.getInfoDebugLog()}, + }, + program.getInfoLog(), + program.getInfoDebugLog(), + validation_result, + logger.getAllMessages(), + disassembly_stream.str()}; } // Compiles and links the given source |code| of the given shader @@ -318,10 +338,8 @@ class GlslangTest : public GT { program.addShader(&shader); success &= program.link(controls); -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) if (success) program.mapIO(); -#endif spv::SpvBuildLogger logger; @@ -363,10 +381,8 @@ class GlslangTest : public GT { glslang::TProgram program; program.addShader(&shader); success &= program.link(controls); -#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE) if (success) program.mapIO(); -#endif if (success && (controls & EShMsgSpvRules)) { spv::SpvBuildLogger logger; @@ -471,7 +487,7 @@ class GlslangTest : public GT { targetLanguageVersion, false, EShTexSampTransKeep, enableOptimizer, enableDebug, enableNonSemanticShaderDebugInfo, automap); - // Generate the hybrid output in the way of glslangValidator. + // Generate the hybrid output in the way of glslang. std::ostringstream stream; outputResultToStream(&stream, result, controls); @@ -501,7 +517,7 @@ class GlslangTest : public GT { GlslangResult result = compileAndLink(testName, input, entryPointName, controls, clientTargetVersion, targetLanguageVersion, false, EShTexSampTransKeep, false, automap); - // Generate the hybrid output in the way of glslangValidator. + // Generate the hybrid output in the way of glslang. std::ostringstream stream; outputResultToStream(&stream, result, controls); @@ -527,7 +543,7 @@ class GlslangTest : public GT { GlslangResult result = compileAndLink(testName, input, entryPointName, controls, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0, true); - // Generate the hybrid output in the way of glslangValidator. + // Generate the hybrid output in the way of glslang. std::ostringstream stream; outputResultToStream(&stream, result, controls); @@ -564,7 +580,7 @@ class GlslangTest : public GT { autoMapBindings, flattenUniformArrays); - // Generate the hybrid output in the way of glslangValidator. + // Generate the hybrid output in the way of glslang. std::ostringstream stream; outputResultToStream(&stream, result, controls); @@ -591,7 +607,7 @@ class GlslangTest : public GT { const EShMessages controls = DeriveOptions(source, semantics, target); GlslangResult result = compileLinkRemap(testName, input, entryPointName, controls, remapOptions); - // Generate the hybrid output in the way of glslangValidator. + // Generate the hybrid output in the way of glslang. std::ostringstream stream; outputResultToStream(&stream, result, controls); @@ -618,7 +634,7 @@ class GlslangTest : public GT { const EShMessages controls = DeriveOptions(source, semantics, target); GlslangResult result = remap(testName, input, controls, remapOptions); - // Generate the hybrid output in the way of glslangValidator. + // Generate the hybrid output in the way of glslang. std::ostringstream stream; outputResultToStream(&stream, result, controls); @@ -640,7 +656,7 @@ class GlslangTest : public GT { std::string ppShader; glslang::TShader::ForbidIncluder includer; const bool success = shader.preprocess( - &glslang::DefaultTBuiltInResource, defaultVersion, defaultProfile, + GetDefaultResources(), defaultVersion, defaultProfile, forceVersionProfile, isForwardCompatible, (EShMessages)(EShMsgOnlyPreprocessor | EShMsgCascadingErrors), &ppShader, includer); @@ -698,7 +714,7 @@ class GlslangTest : public GT { glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0, false, EShTexSampTransUpgradeTextureRemoveSampler); - // Generate the hybrid output in the way of glslangValidator. + // Generate the hybrid output in the way of glslang. std::ostringstream stream; outputResultToStream(&stream, result, controls); diff --git a/third_party/glslang/gtests/VkRelaxed.FromFile.cpp b/third_party/glslang/gtests/VkRelaxed.FromFile.cpp index 96cd3cf69a1..67e55017143 100644 --- a/third_party/glslang/gtests/VkRelaxed.FromFile.cpp +++ b/third_party/glslang/gtests/VkRelaxed.FromFile.cpp @@ -42,7 +42,6 @@ #include "glslang/MachineIndependent/iomapper.h" #include "glslang/MachineIndependent/reflection.h" -#ifndef GLSLANG_WEB namespace glslangtest { namespace { @@ -303,4 +302,3 @@ INSTANTIATE_TEST_SUITE_P( } // anonymous namespace } // namespace glslangtest -#endif diff --git a/third_party/glslang/hlsl/CMakeLists.txt b/third_party/glslang/hlsl/CMakeLists.txt index b34df3aeafb..058a67b0869 100644 --- a/third_party/glslang/hlsl/CMakeLists.txt +++ b/third_party/glslang/hlsl/CMakeLists.txt @@ -38,8 +38,11 @@ # projects that referenced this target. add_library(HLSL ${LIB_TYPE} "stub.cpp") -set_property(TARGET HLSL PROPERTY FOLDER hlsl) -set_property(TARGET HLSL PROPERTY POSITION_INDEPENDENT_CODE ON) +set_target_properties(HLSL PROPERTIES + FOLDER hlsl + POSITION_INDEPENDENT_CODE ON + VERSION "${GLSLANG_VERSION}" + SOVERSION "${GLSLANG_VERSION_MAJOR}") if(WIN32 AND BUILD_SHARED_LIBS) set_target_properties(HLSL PROPERTIES PREFIX "") @@ -52,7 +55,7 @@ if(ENABLE_GLSLANG_INSTALL) message(WARNING \"Using `HLSLTargets.cmake` is deprecated: use `find_package(glslang)` to find glslang CMake targets.\") if (NOT TARGET glslang::HLSL) - include(\"\${CMAKE_CURRENT_LIST_DIR}/../../${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/glslang-targets.cmake\") + include(\"${CMAKE_INSTALL_FULL_LIBDIR}/cmake/${PROJECT_NAME}/glslang-targets.cmake\") endif() add_library(HLSL ALIAS glslang::HLSL) diff --git a/third_party/glslang/known_good.json b/third_party/glslang/known_good.json index 1d8d3713524..a523015e0bc 100644 --- a/third_party/glslang/known_good.json +++ b/third_party/glslang/known_good.json @@ -5,14 +5,14 @@ "site" : "github", "subrepo" : "KhronosGroup/SPIRV-Tools", "subdir" : "External/spirv-tools", - "commit" : "59cf5b1346d8b029add67a919f801c29ea13cc49" + "commit" : "a996591b1c67e789e88e99ae3881272f5fc47374" }, { "name" : "spirv-tools/external/spirv-headers", "site" : "github", "subrepo" : "KhronosGroup/SPIRV-Headers", "subdir" : "External/spirv-tools/external/spirv-headers", - "commit" : "87d5b782bec60822aa878941e6b13c0a9a954c9b" + "commit" : "f8a4f5d876e56c9930344041171192f04f244f61" } ] } diff --git a/third_party/glslang/kokoro/android-ndk-build/build-docker.sh b/third_party/glslang/kokoro/android-ndk-build/build-docker.sh index 2b23b27a758..94edcd3fc4e 100755 --- a/third_party/glslang/kokoro/android-ndk-build/build-docker.sh +++ b/third_party/glslang/kokoro/android-ndk-build/build-docker.sh @@ -43,6 +43,7 @@ using ndk-r21d export NDK_PROJECT_PATH="${ROOT_DIR}/ndk_test" export APP_BUILD_SCRIPT="${ROOT_DIR}/ndk_test/Android.mk" +export APP_PLATFORM=android-24 # Vulkan introduced in API 24 echo "Building..." ndk-build -j diff --git a/third_party/glslang/kokoro/linux-clang-cmake/build-docker.sh b/third_party/glslang/kokoro/linux-clang-cmake/build-docker.sh index c5fdcd23568..6b1d3e1ae15 100755 --- a/third_party/glslang/kokoro/linux-clang-cmake/build-docker.sh +++ b/third_party/glslang/kokoro/linux-clang-cmake/build-docker.sh @@ -46,5 +46,5 @@ using ninja-1.10.0 echo "Building..." mkdir /build && cd /build -cmake "$ROOT_DIR" -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$(pwd)/install" -DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS +cmake "$ROOT_DIR" -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$(pwd)/install" -DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS -DENABLE_OPT=0 ninja install diff --git a/third_party/glslang/kokoro/linux-clang-gn/build-docker.sh b/third_party/glslang/kokoro/linux-clang-gn/build-docker.sh index 1035ab88ce8..6540b1be0d3 100755 --- a/third_party/glslang/kokoro/linux-clang-gn/build-docker.sh +++ b/third_party/glslang/kokoro/linux-clang-gn/build-docker.sh @@ -34,8 +34,17 @@ # POSSIBILITY OF SUCH DAMAGE. set -e # Fail on any error. + +. /bin/using.sh # Declare the bash `using` function for configuring toolchains. + set -x # Display commands being run. +using ninja-1.10.0 + +# Disable git's "detected dubious ownership" error - kokoro checks out the repo +# with a different user, and we don't care about this warning. +git config --global --add safe.directory '*' + echo "Fetching external projects..." ./update_glslang_sources.py diff --git a/third_party/glslang/kokoro/linux-clang-gn/build.sh b/third_party/glslang/kokoro/linux-clang-gn/build.sh index 563432a1ad5..111f5294eec 100755 --- a/third_party/glslang/kokoro/linux-clang-gn/build.sh +++ b/third_party/glslang/kokoro/linux-clang-gn/build.sh @@ -38,6 +38,7 @@ set -e # Fail on any error. SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd )" ROOT_DIR="$( cd "${SCRIPT_DIR}/../.." >/dev/null 2>&1 && pwd )" +set +e # Allow build failure docker run --rm -i \ --volume "${ROOT_DIR}:${ROOT_DIR}" \ --workdir "${ROOT_DIR}" \ @@ -46,4 +47,9 @@ docker run --rm -i \ --entrypoint "${SCRIPT_DIR}/build-docker.sh" \ "gcr.io/shaderc-build/radial-build:latest" +# This is important. If the permissions are not fixed, kokoro will fail +# to pull build artifacts, and put the build in tool-failure state, which +# blocks the logs. +RESULT=$? sudo chown -R "$(id -u):$(id -g)" "${ROOT_DIR}" +exit $RESULT diff --git a/third_party/glslang/kokoro/linux-clang-release-bazel/build.sh b/third_party/glslang/kokoro/linux-clang-release-bazel/build.sh deleted file mode 100644 index 190e3d7024a..00000000000 --- a/third_party/glslang/kokoro/linux-clang-release-bazel/build.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash - -# Copyright (C) 2019 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 HOLDERS 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. - -# Linux Build Script. - -# Fail on any error. -set -e -# Display commands being run. -set -x - -CC=clang -CXX=clang++ -SRC=$PWD/github/glslang -cd $SRC - -# Bazel limitation: No 'External' directory is allowed!! -mv External third_party - -gsutil cp gs://bazel/0.29.1/release/bazel-0.29.1-linux-x86_64 . -chmod +x bazel-0.29.1-linux-x86_64 - -echo $(date): Build everything... -./bazel-0.29.1-linux-x86_64 build :all -echo $(date): Build completed. - -echo $(date): Starting bazel test... -./bazel-0.29.1-linux-x86_64 test :all --test_output=all -echo $(date): Bazel test completed. diff --git a/third_party/glslang/kokoro/linux-clang-release-bazel/continuous.cfg b/third_party/glslang/kokoro/linux-clang-release-bazel/continuous.cfg deleted file mode 100644 index 767556d0b4b..00000000000 --- a/third_party/glslang/kokoro/linux-clang-release-bazel/continuous.cfg +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (C) 2019 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 HOLDERS 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. - -# Continuous build configuration. -build_file: "glslang/kokoro/linux-clang-release-bazel/build.sh" diff --git a/third_party/glslang/kokoro/linux-clang-release-bazel/presubmit.cfg b/third_party/glslang/kokoro/linux-clang-release-bazel/presubmit.cfg deleted file mode 100644 index 669491f8294..00000000000 --- a/third_party/glslang/kokoro/linux-clang-release-bazel/presubmit.cfg +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (C) 2019 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 HOLDERS 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. - -# Presubmit build configuration. -build_file: "glslang/kokoro/linux-clang-release-bazel/build.sh" diff --git a/third_party/glslang/kokoro/linux-gcc-cmake/build-docker.sh b/third_party/glslang/kokoro/linux-gcc-cmake/build-docker.sh index 0edc05e24bc..558695c8a7e 100755 --- a/third_party/glslang/kokoro/linux-gcc-cmake/build-docker.sh +++ b/third_party/glslang/kokoro/linux-gcc-cmake/build-docker.sh @@ -46,5 +46,5 @@ using ninja-1.10.0 echo "Building..." mkdir /build && cd /build -cmake "$ROOT_DIR" -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$(pwd)/install" -DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS +cmake "$ROOT_DIR" -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$(pwd)/install" -DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS -DENABLE_OPT=0 ninja install diff --git a/third_party/glslang/kokoro/macos-clang-release-bazel/build.sh b/third_party/glslang/kokoro/macos-clang-release-bazel/build.sh deleted file mode 100644 index 8f1b2516b2f..00000000000 --- a/third_party/glslang/kokoro/macos-clang-release-bazel/build.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash - -# Copyright (C) 2019 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 HOLDERS 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. - -# macOS Build Script. - -# Fail on any error. -set -e -# Display commands being run. -set -x - -CC=clang -CXX=clang++ -SRC=$PWD/github/glslang -cd $SRC - -mv External third_party - -# Get bazel 0.29.1. -gsutil cp gs://bazel/0.29.1/release/bazel-0.29.1-darwin-x86_64 . -chmod +x bazel-0.29.1-darwin-x86_64 - -echo $(date): Build everything... -./bazel-0.29.1-darwin-x86_64 build :all -echo $(date): Build completed. - -echo $(date): Starting bazel test... -./bazel-0.29.1-darwin-x86_64 test :all --test_output=all -echo $(date): Bazel test completed. diff --git a/third_party/glslang/kokoro/macos-clang-release-bazel/continuous.cfg b/third_party/glslang/kokoro/macos-clang-release-bazel/continuous.cfg deleted file mode 100644 index f1980790e28..00000000000 --- a/third_party/glslang/kokoro/macos-clang-release-bazel/continuous.cfg +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (C) 2019 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 HOLDERS 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. - -# Continuous build configuration. -build_file: "glslang/kokoro/macos-clang-release-bazel/build.sh" diff --git a/third_party/glslang/kokoro/macos-clang-release-bazel/presubmit.cfg b/third_party/glslang/kokoro/macos-clang-release-bazel/presubmit.cfg deleted file mode 100644 index daa30be5cb1..00000000000 --- a/third_party/glslang/kokoro/macos-clang-release-bazel/presubmit.cfg +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (C) 2019 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 HOLDERS 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. - -# Presubmit build configuration. -build_file: "glslang/kokoro/macos-clang-release-bazel/build.sh" diff --git a/third_party/glslang/kokoro/windows-msvc-2015-release-bazel/build.bat b/third_party/glslang/kokoro/windows-msvc-2015-release-bazel/build.bat deleted file mode 100644 index fb2009b1870..00000000000 --- a/third_party/glslang/kokoro/windows-msvc-2015-release-bazel/build.bat +++ /dev/null @@ -1,75 +0,0 @@ -:: Copyright (C) 2019 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 HOLDERS 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. -:: Copyright (c) 2019 Google LLC. -:: -:: Windows Build Script. - -@echo on - -set SRC=%cd%\github\glslang - -:: Force usage of python 3.6 -set PATH=C:\python36;%PATH% -cd %SRC% - -mv External third_party - -:: REM Install Bazel. -wget -q https://github.com/bazelbuild/bazel/releases/download/0.29.1/bazel-0.29.1-windows-x86_64.zip -unzip -q bazel-0.29.1-windows-x86_64.zip - -:: Set up MSVC -call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 -set BAZEL_VS=C:\Program Files (x86)\Microsoft Visual Studio 14.0 -set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC -set BAZEL_SH=c:\tools\msys64\usr\bin\bash.exe -set BAZEL_PYTHON=c:\tools\python2\python.exe - -:: ######################################### -:: Start building. -:: ######################################### -echo "Build everything... %DATE% %TIME%" -bazel.exe build :all -if %ERRORLEVEL% NEQ 0 exit /b %ERRORLEVEL% -echo "Build Completed %DATE% %TIME%" - -:: ############## -:: Run the tests -:: ############## -echo "Running Tests... %DATE% %TIME%" -bazel.exe test :all --test_output=all -if %ERRORLEVEL% NEQ 0 exit /b %ERRORLEVEL% -echo "Tests Completed %DATE% %TIME%" - -exit /b 0 - diff --git a/third_party/glslang/kokoro/windows-msvc-2015-release-bazel/continuous.cfg b/third_party/glslang/kokoro/windows-msvc-2015-release-bazel/continuous.cfg deleted file mode 100644 index 554d29de573..00000000000 --- a/third_party/glslang/kokoro/windows-msvc-2015-release-bazel/continuous.cfg +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (C) 2019 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 HOLDERS 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. - -# Continuous build configuration. -build_file: "glslang/kokoro/windows-msvc-2015-release-bazel/build.bat" diff --git a/third_party/glslang/kokoro/windows-msvc-2015-release-bazel/presubmit.cfg b/third_party/glslang/kokoro/windows-msvc-2015-release-bazel/presubmit.cfg deleted file mode 100644 index 4980bb6b581..00000000000 --- a/third_party/glslang/kokoro/windows-msvc-2015-release-bazel/presubmit.cfg +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (C) 2019 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 HOLDERS 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. - -# Presubmit build configuration. -build_file: "glslang/kokoro/windows-msvc-2015-release-bazel/build.bat" diff --git a/third_party/glslang/ndk_test/Android.mk b/third_party/glslang/ndk_test/Android.mk index b1b2207c441..d2e93da52c5 100644 --- a/third_party/glslang/ndk_test/Android.mk +++ b/third_party/glslang/ndk_test/Android.mk @@ -38,7 +38,7 @@ LOCAL_CPP_EXTENSION := .cc .cpp .cxx LOCAL_SRC_FILES:=test.cpp LOCAL_MODULE:=glslang_ndk_test LOCAL_LDLIBS:=-landroid -LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti -Werror +LOCAL_CXXFLAGS:=-std=c++17 -fno-exceptions -fno-rtti -Werror LOCAL_STATIC_LIBRARIES:=glslang SPIRV HLSL include $(BUILD_SHARED_LIBRARY) diff --git a/third_party/glslang/ndk_test/jni/Application.mk b/third_party/glslang/ndk_test/jni/Application.mk index 07b7615733b..0eb8ffdf66a 100644 --- a/third_party/glslang/ndk_test/jni/Application.mk +++ b/third_party/glslang/ndk_test/jni/Application.mk @@ -34,5 +34,5 @@ APP_ABI := all APP_BUILD_SCRIPT := Android.mk APP_STL := c++_static -APP_PLATFORM := android-9 +APP_PLATFORM := android-24 NDK_TOOLCHAIN_VERSION := 4.9 diff --git a/third_party/hat-trie/CMakeLists.txt b/third_party/hat-trie/CMakeLists.txt deleted file mode 100644 index 167840a25e2..00000000000 --- a/third_party/hat-trie/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -cmake_minimum_required(VERSION 3.1) - -project(tsl_hat_trie) - -add_library(tsl_hat_trie INTERFACE) -# Use tsl::hat_trie as target, more consistent with other libraries conventions (Boost, Qt, ...) -add_library(tsl::hat_trie ALIAS tsl_hat_trie) - -target_include_directories(tsl_hat_trie INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include") -target_sources(tsl_hat_trie INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include/tsl/array-hash/array_growth_policy.h" - "${CMAKE_CURRENT_SOURCE_DIR}/include/tsl/array-hash/array_hash.h" - "${CMAKE_CURRENT_SOURCE_DIR}/include/tsl/array-hash/array_map.h" - "${CMAKE_CURRENT_SOURCE_DIR}/include/tsl/array-hash/array_set.h" - "${CMAKE_CURRENT_SOURCE_DIR}/include/tsl/htrie_hash.h" - "${CMAKE_CURRENT_SOURCE_DIR}/include/tsl/htrie_map.h" - "${CMAKE_CURRENT_SOURCE_DIR}/include/tsl/htrie_set.h") - - -if(${CMAKE_VERSION} VERSION_GREATER "3.7") - # Only available since version 3.8 - target_compile_features(tsl_hat_trie INTERFACE cxx_std_11) -endif() diff --git a/third_party/hat-trie/LICENSE b/third_party/hat-trie/LICENSE deleted file mode 100644 index e9c5ae95f36..00000000000 --- a/third_party/hat-trie/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Thibaut Goetghebuer-Planchon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -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 Software. - -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 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/third_party/hat-trie/README.md b/third_party/hat-trie/README.md deleted file mode 100644 index 4e58960ad67..00000000000 --- a/third_party/hat-trie/README.md +++ /dev/null @@ -1,531 +0,0 @@ -[![Build Status](https://travis-ci.org/Tessil/hat-trie.svg?branch=master)](https://travis-ci.org/Tessil/hat-trie) [![Build status](https://ci.appveyor.com/api/projects/status/ieafyj08ewb7dfa7/branch/master?svg=true)](https://ci.appveyor.com/project/Tessil/hat-trie/branch/master) -## A C++ implementation of a fast and memory efficient HAT-trie - -Trie implementation based on the "HAT-trie: A Cache-conscious Trie-based Data Structure for Strings." (Askitis Nikolas and Sinha Ranjan, 2007) paper. For now, only the pure HAT-trie has been implemented, the hybrid version may arrive later. Details regarding the HAT-trie data structure can be found [here](https://tessil.github.io/2017/06/22/hat-trie.html). - -The library provides an efficient and compact way to store a set or a map of strings by compressing the common prefixes. It also allows to search for keys that match a prefix. Note though that the default parameters of the structure are geared toward optimizing exact searches, if you do a lot of prefix searches you may want to reduce the burst threshold through the `burst_threshold` method. - -It's a well adapted structure to store a large number of strings. - -

    - -

    - -For the array hash part, the [array-hash](https://github.com/Tessil/array-hash) project is used and included in the repository. - -The library provides two classes: `tsl::htrie_map` and `tsl::htrie_set`. - -### Overview - -- Header-only library, just add the [include](include/) directory to your include path and you are ready to go. If you use CMake, you can also use the `tsl::hat_trie` exported target from the [CMakeLists.txt](CMakeLists.txt). -- Low memory usage while keeping reasonable performances (see [benchmark](#benchmark)). -- Support prefix searches through `equal_prefix_range` (useful for autocompletion for example) and prefix erasures through `erase_prefix`. -- Support longest matching prefix searches through `longest_prefix`. -- Support for efficient serialization and deserialization (see [example](#serialization) and the `serialize/deserialize` methods in the [API](https://tessil.github.io/hat-trie/doc/html/classtsl_1_1htrie__map.html) for details). -- Keys are not ordered as they are partially stored in a hash map. -- All operations modifying the data structure (insert, emplace, erase, ...) invalidate the iterators. -- Support null characters in the key (you can thus store binary data in the trie). -- Support for any type of value as long at it's either copy-constructible or both nothrow move constructible and nothrow move assignable. -- The balance between speed and memory usage can be modified through the `max_load_factor` method. A lower max load factor will increase the speed, a higher one will reduce the memory usage. Its default value is set to 8.0. -- The default burst threshold, which is the maximum size of an array hash node before a burst occurs, is set to 16 384 which provides good performances for exact searches. If you mainly use prefix searches, you may want to reduce it to something like 1024 or lower for faster iteration on the results through the `burst_threshold` method. -- By default the maximum allowed size for a key is set to 65 535. This can be raised through the `KeySizeT` template parameter. - -Thread-safety and exception guarantees are similar to the STL containers. - -### Hash function - -The default hash function used by the structure depends on the presence of `std::string_view`. If it is available, `std::hash` is used, otherwise a simple [FNV-1a](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function#FNV-1a_hash) hash function is used to avoid any dependency. - -If you can't use C++17 or later, we recommend to replace the hash function with something like [CityHash](https://github.com/google/cityhash), MurmurHash, [FarmHash](https://github.com/google/farmhash), ... for better performances. On the tests we did, CityHash64 offers a ~20% improvement on reads compared to FNV-1a. - - -```c++ -#include - -struct str_hash { - std::size_t operator()(const char* key, std::size_t key_size) const { - return CityHash64(key, key_size); - } -}; - -tsl::htrie_map map; -``` - -The `std::hash` can't be used efficiently as the structure doesn't store any `std::string` object. Any time a hash would be needed, a temporary `std::string` would have to be created. - - -### Benchmark - -#### Wikipedia dataset -The benchmark consists in inserting all the titles from the main namespace of the Wikipedia archive into the data structure, check the used memory space after the insert (including potential memory fragmentation) and search for all the titles again in the data structure. The peak memory usage during the insert process is also measured with [time(1)](https://linux.die.net/man/1/time). - -* Dataset: [enwiki-20170320-all-titles-in-ns0.gz](https://dumps.wikimedia.org/enwiki/20170320/) -* Size: 262.7 MiB -* Number of keys: 13 099 148 -* Average key length: 19.90 -* Median key length: 17 -* Max key length: 251 - -Each title is associated with an int (32 bits). All the hash based structures use [CityHash64](https://github.com/google/cityhash) as hash function. For the tests marked *with reserve*, the `reserve` function is called beforehand to avoid any rehash. - -Note that `tsl::hopscotch_map`, `std::unordered_map`, `google::dense_hash_map` and `spp::sparse_hash_map` use `std::string` as key which imposes a minimum size of 32 bytes (on x64) even if the key is only one character long. Other structures may be able to store one-character keys with 1 byte + 8 bytes for a pointer (on x64). - -The benchmark was compiled with GCC 6.3 and ran on Debian Stretch x64 with an Intel i5-5200u and 8Go of RAM. Best of 20 runs was taken. - -The code of the benchmark can be found on [Gist](https://gist.github.com/Tessil/72e11891fc155f5b2eb53de22cbc4053). - -##### Unsorted - -The *enwiki-20170320-all-titles-in-ns0.gz* dataset is alphabetically sorted. For this benchmark, we first shuffle the dataset through [shuf(1)](https://linux.die.net/man/1/shuf) to avoid a biased sorted dataset. - -| Library | Data structure | Peak memory (MiB) | Memory (MiB) | Insert (ns/key) | Read (ns/key) | -|---------|----------------|------------------:|-------------:|----------------:|--------------:| -| [tsl::htrie_map](https://github.com/Tessil/hat-trie) | HAT-trie | **405.22** | **402.25** | 643.10 | 250.87 | -| [tsl::htrie_map](https://github.com/Tessil/hat-trie)
    max_load_factor=4 | HAT-trie | 471.85 | 468.50 | 638.66 | 212.90 | -| [tsl::htrie_map](https://github.com/Tessil/hat-trie)
    max_load_factor=2 | HAT-trie | 569.76 | 566.52 | 630.61 | 201.10 | -| [tsl::htrie_map](https://github.com/Tessil/hat-trie)
    max_load_factor=1 | HAT-trie | 713.44 | 709.81 | 645.76 | 190.87 | -| [cedar::da](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) | Double-array trie | 1269.68 | 1254.41 | 1102.93 | 557.20 | -| [cedar::da](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) ORDERED=false | Double-array trie | 1269.80 | 1254.41 | 1089.78 | 570.13 | -| [cedar::da](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) | Double-array reduced trie | 1183.07 | 1167.79 | 1076.68 | 645.79 | -| [cedar::da](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) ORDERED=false | Double-array reduced trie | 1183.14 | 1167.85 | 1065.43 | 641.98 | -| [cedar::da](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) | Double-array prefix trie | 498.69 | 496.54 | 1096.90 | 628.01 | -| [cedar::da](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) ORDERED=false | Double-array prefix trie | 498.65 | 496.60 | 1048.40 | 628.94 | -| [hat-trie](https://github.com/dcjones/hat-trie)1 (C) | HAT-trie | 504.07 | 501.50 | 917.49 | 261.00 | -| [qp trie](https://github.com/fanf2/qp) (C) | QP trie | 941.23 | 938.17 | 1349.25 | 1281.46 | -| [crit-bit trie](https://github.com/fanf2/qp) (C) | Crit-bit trie | 1074.96 | 1071.98 | 2930.42 | 2869.74 | -| [JudySL](http://judy.sourceforge.net/) (C) | Judy array | 631.09 | 628.37 | 884.29 | 803.58 | -| [JudyHS](http://judy.sourceforge.net/) (C) | Judy array | 723.44 | 719.47 | 476.79 | 417.15 | -| [tsl::array_map](https://github.com/Tessil/array-hash) | Array hash table | 823.54 | 678.73 | 603.94 | 138.24 | -| [tsl::array_map](https://github.com/Tessil/array-hash)
    with reserve | Array hash table | 564.26 | 555.91 | 249.52 | 128.28 | -| [tsl::hopscotch_map](https://github.com/Tessil/hopscotch-map) | Hash table | 1325.83 | 1077.99 | 368.26 | **119.49** | -| [tsl::hopscotch_map](https://github.com/Tessil/hopscotch-map)
    with reserve | Hash table | 1080.51 | 1077.98 | **240.58** | 119.91 | -| [google::dense_hash_map](https://github.com/sparsehash/sparsehash) | Hash table | 2319.40 | 1677.11 | 466.60 | 138.87 | -| [google::dense_hash_map](https://github.com/sparsehash/sparsehash)
    with reserve | Hash table | 1592.51 | 1589.99 | 259.56 | 120.40 | -| [spp::sparse_hash_map](https://github.com/greg7mdp/sparsepp) | Sparse hash table | 918.67 | 917.10 | 769.00 | 175.59 | -| [spp::sparse_hash_map](https://github.com/greg7mdp/sparsepp)
    with reserve | Sparse hash table | 913.35 | 910.65 | 427.22 | 159.08 | -| [std::unordered_map](http://en.cppreference.com/w/cpp/container/unordered_map) | Hash table | 1249.05 | 1246.60 | 590.88 | 173.58 | -| [std::unordered_map](http://en.cppreference.com/w/cpp/container/unordered_map)
    with reserve | Hash table | 1212.23 | 1209.71 | 350.33 | 178.70 | - -1. As the hash function can't be passed in parameter, the code of the library itself is modified to use CityHash64. - -##### Sorted - -The key are inserted and read in alphabetical order. - -| Library | Data structure | Peak memory (MiB) | Memory (MiB) | Insert (ns/key) | Read (ns/key) | -|---------|----------------|------------------:|-------------:|----------------:|--------------:| -| [tsl::htrie_map](https://github.com/Tessil/hat-trie) | HAT-trie | **396.10** | **393.22** | 255.76 | 68.08 | -| [tsl::htrie_map](https://github.com/Tessil/hat-trie)
    max_load_factor=4 | HAT-trie | 465.02 | 461.80 | 248.88 | 59.23 | -| [tsl::htrie_map](https://github.com/Tessil/hat-trie)
    max_load_factor=2 | HAT-trie | 543.99 | 541.21 | 230.13 | 53.50 | -| [tsl::htrie_map](https://github.com/Tessil/hat-trie)
    max_load_factor=1 | HAT-trie | 692.29 | 689.70 | 243.84 | **49.22** | -| [cedar::da](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) | Double-array trie | 1269.58 | 1254.41 | 278.51 | 54.72 | -| [cedar::da](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) ORDERED=false | Double-array trie | 1269.66 | 1254.41 | 264.43 | 56.02 | -| [cedar::da](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) | Double-array reduced trie | 1183.01 | 1167.78 | 254.60 | 69.18 | -| [cedar::da](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) ORDERED=false | Double-array reduced trie | 1183.03 | 1167.78 | 241.45 | 69.67 | -| [cedar::da](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) | Double-array prefix trie | 621.59 | 619.38 | 246.88 | 57.83 | -| [cedar::da](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) ORDERED=false | Double-array prefix trie | 621.59 | 619.38 | **187.98** | 58.56 | -| [hat-trie](https://github.com/dcjones/hat-trie)2 (C) | HAT-trie | 521.25 | 518.52 | 503.01 | 86.40 | -| [qp trie](https://github.com/fanf2/qp) (C) | QP trie | 940.65 | 937.66 | 392.86 | 190.19 | -| [crit-bit trie](https://github.com/fanf2/qp) (C) | Crit-bit trie | 1074.87 | 1071.98 | 430.04 | 347.60 | -| [JudySL](http://judy.sourceforge.net/) (C) | Judy array | 616.95 | 614.27 | 279.07 | 114.47 | -| [JudyHS](http://judy.sourceforge.net/) (C) | Judy array | 722.29 | 719.47 | 439.66 | 372.25 | -| [tsl::array_map](https://github.com/Tessil/array-hash) | Array hash table | 826.98 | 682.99 | 612.31 | 139.16 | -| [tsl::array_map](https://github.com/Tessil/array-hash)
    with reserve | Array hash table | 565.37 | 555.35 | 246.55 | 126.32 | -| [tsl::hopscotch_map](https://github.com/Tessil/hopscotch-map) | Hash table | 1331.87 | 1078.02 | 375.19 | 118.08 | -| [tsl::hopscotch_map](https://github.com/Tessil/hopscotch-map)
    with reserve | Hash table | 1080.51 | 1077.97 | 238.93 | 117.20 | -| [google::dense_hash_map](https://github.com/sparsehash/sparsehash) | Hash table | 2325.27 | 1683.07 | 483.95 | 137.09 | -| [google::dense_hash_map](https://github.com/sparsehash/sparsehash)
    with reserve | Hash table | 1592.54 | 1589.99 | 257.22 | 113.71 | -| [spp::sparse_hash_map](https://github.com/greg7mdp/sparsepp) | Sparse hash table | 920.96 | 918.70 | 772.03 | 176.64 | -| [spp::sparse_hash_map](https://github.com/greg7mdp/sparsepp)
    with reserve | Sparse hash table | 914.84 | 912.47 | 422.85 | 158.73 | -| [std::unordered_map](http://en.cppreference.com/w/cpp/container/unordered_map) | Hash table | 1249.09 | 1246.65 | 594.85 | 173.54 | -| [std::unordered_map](http://en.cppreference.com/w/cpp/container/unordered_map)
    with reserve | Hash table | 1212.21 | 1209.71 | 347.40 | 176.49 | - -2. As the hash function can't be passed in parameter, the code of the library itself is modified to use CityHash64. - - -#### Dr. Askitis dataset - -The benchmark consists in inserting all the words from the "Distinct Strings" dataset of Dr. Askitis into the data structure, check the used memory space and search for all the words from the "Skew String Set 1" dataset (where a string can be present multiple times) in the data structure. Note that the strings in this dataset have a quite short average and median key length (which may not be a realistic use case compared to the Wikipedia dataset used above). It's similar to the one on the [cedar](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) homepage. - -* Dataset: [distinct_1](http://web.archive.org/web/20120206015921/http://www.naskitis.com/) (write) / [skew1_1](http://web.archive.org/web/20120206015921/http://www.naskitis.com/) (read) -* Size: 290.45 MiB / 1 029.46 MiB -* Number of keys: 28 772 169 / 177 999 203 -* Average key length: 9.59 / 5.06 -* Median key length: 8 / 4 -* Max key length: 126 / 62 - -The benchmark protocol is the same as for the [Wikipedia dataset](https://github.com/Tessil/hat-trie#wikipedia-dataset). - - -| Library | Data structure | Peak memory (MiB) | Memory (MiB) | Insert (ns/key) | Read (ns/key) | -|---------|----------------|------------------:|-------------:|----------------:|--------------:| -| [tsl::htrie_map](https://github.com/Tessil/hat-trie) | HAT-trie | **604.76** | **601.79** | 485.45 | 77.80 | -| [tsl::htrie_map](https://github.com/Tessil/hat-trie)
    max_load_factor=4 | HAT-trie | 768.10 | 764.98 | 491.78 | 75.48 | -| [tsl::htrie_map](https://github.com/Tessil/hat-trie)
    max_load_factor=2 | HAT-trie | 1002.42 | 999.34 | 496.78 | 72.53 | -| [tsl::htrie_map](https://github.com/Tessil/hat-trie)
    max_load_factor=1 | HAT-trie | 1344.98 | 1341.97 | 520.66 | 72.45 | -| [cedar::da](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) | Double-array trie | 1105.45 | 1100.05 | 682.25 | 71.98 | -| [cedar::da](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) ORDERED=false | Double-array trie | 1105.47 | 1100.05 | 668.75 | 71.95 | -| [cedar::da](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) | Double-array reduced trie | 941.16 | 926.04 | 684.38 | 79.11 | -| [cedar::da](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) ORDERED=false | Double-array reduced trie | 941.16 | 925.98 | 672.14 | 79.02 | -| [cedar::da](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) | Double-array prefix trie | 714.58 | 712.59 | 831.71 | 75.83 | -| [cedar::da](http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/) ORDERED=false | Double-array prefix trie | 714.66 | 712.31 | 786.93 | 75.89 | -| [hat-trie](https://github.com/dcjones/hat-trie)3 (C) | HAT-trie | 786.93 | 784.32 | 743.34 | 93.58 | -| [qp trie](https://github.com/fanf2/qp) (C) | QP trie | 1800.02 | 1797.21 | 987.95 | 428.51 | -| [crit-bit trie](https://github.com/fanf2/qp) (C) | Crit-bit trie | 2210.52 | 2207.64 | 1986.19 | 1109.88 | -| [JudySL](http://judy.sourceforge.net/) (C) | Judy array | 1025.59 | 1023.11 | 535.02 | 202.36 | -| [JudyHS](http://judy.sourceforge.net/) (C) | Judy array | 1002.50 | 999.97 | 456.09 | 148.36 | -| [tsl::array_map](https://github.com/Tessil/array-hash) | Array hash table | 1308.08 | 1031.67 | 545.82 | 46.41 | -| [tsl::array_map](https://github.com/Tessil/array-hash)
    with reserve | Array hash table | 979.44 | 921.363 | 244.19 | 45.74 | -| [tsl::hopscotch_map](https://github.com/Tessil/hopscotch-map) | Hash table | 2336.39 | 1611.54 | 288.70 | 47.05 | -| [tsl::hopscotch_map](https://github.com/Tessil/hopscotch-map)
    with reserve | Hash table | 1614.22 | 1611.64 | **220.67** | 46.39 | -| [google::dense_hash_map](https://github.com/sparsehash/sparsehash) | Hash table | 3913.64 | 2636.31 | 317.66 | 43.62 | -| [google::dense_hash_map](https://github.com/sparsehash/sparsehash)
    with reserve | Hash table | 2638.19 | 2635.68 | 227.58 | **43.09** | -| [spp::sparse_hash_map](https://github.com/greg7mdp/sparsepp) | Sparse hash table | 1419.69 | 1417.61 | 586.26 | 56.00 | -| [spp::sparse_hash_map](https://github.com/greg7mdp/sparsepp)
    with reserve | Sparse hash table | 1424.21 | 1421.69 | 392.76 | 55.73 | -| [std::unordered_map](http://en.cppreference.com/w/cpp/container/unordered_map) | Hash table | 2112.66 | 2110.19 | 554.02 | 105.05 | -| [std::unordered_map](http://en.cppreference.com/w/cpp/container/unordered_map)
    with reserve | Hash table | 2053.95 | 2051.67 | 309.06 | 109.89 | - -3. As the hash function can't be passed in parameter, the code of the library itself is modified to use CityHash64. - -### Installation -To use the library, just add the [include](include/) directory to your include path. It is a **header-only** library. - -If you use CMake, you can also use the `tsl::hat_trie` exported target from the [CMakeLists.txt](CMakeLists.txt) with `target_link_libraries`. -```cmake -# Example where the hat-trie project is stored in a third-party directory -add_subdirectory(third-party/hat-trie) -target_link_libraries(your_target PRIVATE tsl::hat_trie) -``` - -The code should work with any C++11 standard-compliant compiler and has been tested with GCC 4.8.4, Clang 3.5.0 and Visual Studio 2015. - -To run the tests you will need the Boost Test library and CMake. - -```bash -git clone https://github.com/Tessil/hat-trie.git -cd hat-trie/tests -mkdir build -cd build -cmake .. -cmake --build . -./tsl_hat_trie_tests -``` - -### Usage - -The API can be found [here](https://tessil.github.io/hat-trie/doc_without_string_view/html). If `std::string_view` is available, the API changes slightly and can be found [here](https://tessil.github.io/hat-trie/doc/html/). - -### Example - -```c++ -#include -#include -#include -#include - - -int main() { - /* - * Map of strings to int having char as character type. - * There is no support for wchar_t, char16_t or char32_t yet, - * but UTF-8 strings will work fine. - */ - tsl::htrie_map map = {{"one", 1}, {"two", 2}}; - map["three"] = 3; - map["four"] = 4; - - map.insert("five", 5); - map.insert_ks("six_with_extra_chars_we_ignore", 3, 6); - - map.erase("two"); - - /* - * Due to the compression on the common prefixes, the letters of the string - * are not always stored contiguously. When we retrieve the key, we have to - * construct it. - * - * To avoid a heap-allocation at each iteration (when SSO doesn't occur), - * we reuse the key_buffer to construct the key. - */ - std::string key_buffer; - for(auto it = map.begin(); it != map.end(); ++it) { - it.key(key_buffer); - std::cout << "{" << key_buffer << ", " << it.value() << "}" << std::endl; - } - - /* - * If you don't care about the allocation. - */ - for(auto it = map.begin(); it != map.end(); ++it) { - std::cout << "{" << it.key() << ", " << *it << "}" << std::endl; - } - - - - - tsl::htrie_map map2 = {{"apple", 1}, {"mango", 2}, {"apricot", 3}, - {"mandarin", 4}, {"melon", 5}, {"macadamia", 6}}; - - // Prefix search - auto prefix_range = map2.equal_prefix_range("ma"); - - // {mandarin, 4} {mango, 2} {macadamia, 6} - for(auto it = prefix_range.first; it != prefix_range.second; ++it) { - std::cout << "{" << it.key() << ", " << *it << "}" << std::endl; - } - - // Find longest match prefix. - auto longest_prefix = map2.longest_prefix("apple juice"); - if(longest_prefix != map2.end()) { - // {apple, 1} - std::cout << "{" << longest_prefix.key() << ", " - << *longest_prefix << "}" << std::endl; - } - - // Prefix erase - map2.erase_prefix("ma"); - - // {apricot, 3} {melon, 5} {apple, 1} - for(auto it = map2.begin(); it != map2.end(); ++it) { - std::cout << "{" << it.key() << ", " << *it << "}" << std::endl; - } - - - - - tsl::htrie_set set = {"one", "two", "three"}; - set.insert({"four", "five"}); - - // {one} {two} {five} {four} {three} - for(auto it = set.begin(); it != set.end(); ++it) { - it.key(key_buffer); - std::cout << "{" << key_buffer << "}" << std::endl; - } -} -``` - -#### Serialization - -The library provides an efficient way to serialize and deserialize a map or a set so that it can be saved to a file or send through the network. -To do so, it requires the user to provide a function object for both serialization and deserialization. - -```c++ -struct serializer { - // Must support the following types for U: std::uint64_t, float and T if a map is used. - template - void operator()(const U& value); - void operator()(const CharT* value, std::size_t value_size); -}; -``` - -```c++ -struct deserializer { - // Must support the following types for U: std::uint64_t, float and T if a map is used. - template - U operator()(); - void operator()(CharT* value_out, std::size_t value_size); -}; -``` - -Note that the implementation leaves binary compatibility (endianness, float binary representation, size of int, ...) of the types it serializes/deserializes in the hands of the provided function objects if compatibility is required. - -More details regarding the `serialize` and `deserialize` methods can be found in the [API](https://tessil.github.io/hat-trie/doc/html/classtsl_1_1htrie__map.html). - -```c++ -#include -#include -#include -#include -#include - - -class serializer { -public: - serializer(const char* file_name) { - m_ostream.exceptions(m_ostream.badbit | m_ostream.failbit); - m_ostream.open(file_name); - } - - template::value>::type* = nullptr> - void operator()(const T& value) { - m_ostream.write(reinterpret_cast(&value), sizeof(T)); - } - - void operator()(const char* value, std::size_t value_size) { - m_ostream.write(value, value_size); - } - -private: - std::ofstream m_ostream; -}; - -class deserializer { -public: - deserializer(const char* file_name) { - m_istream.exceptions(m_istream.badbit | m_istream.failbit | m_istream.eofbit); - m_istream.open(file_name); - } - - template::value>::type* = nullptr> - T operator()() { - T value; - m_istream.read(reinterpret_cast(&value), sizeof(T)); - - return value; - } - - void operator()(char* value_out, std::size_t value_size) { - m_istream.read(value_out, value_size); - } - -private: - std::ifstream m_istream; -}; - - -int main() { - const tsl::htrie_map map = {{"one", 1}, {"two", 2}, - {"three", 3}, {"four", 4}}; - - - const char* file_name = "htrie_map.data"; - { - serializer serial(file_name); - map.serialize(serial); - } - - { - deserializer dserial(file_name); - auto map_deserialized = tsl::htrie_map::deserialize(dserial); - - assert(map == map_deserialized); - } - - { - deserializer dserial(file_name); - - /** - * If the serialized and deserialized map are hash compatibles (see conditions in API), - * setting the argument to true speed-up the deserialization process as we don't have - * to recalculate the hash of each key. We also know how much space each bucket needs. - */ - const bool hash_compatible = true; - auto map_deserialized = - tsl::htrie_map::deserialize(dserial, hash_compatible); - - assert(map == map_deserialized); - } -} -``` - -##### Serialization with Boost Serialization and compression with zlib - -It's possible to use a serialization library to avoid some of the boilerplate if the types to serialize are more complex. - -The following example uses Boost Serialization with the Boost zlib compression stream to reduce the size of the resulting serialized file. - - -```c++ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -template -struct serializer { - Archive& ar; - - template - void operator()(const T& val) { ar & val; } - - template - void operator()(const CharT* val, std::size_t val_size) { - ar.save_binary(reinterpret_cast(val), val_size*sizeof(CharT)); - } -}; - -template -struct deserializer { - Archive& ar; - - template - T operator()() { T val; ar & val; return val; } - - template - void operator()(CharT* val_out, std::size_t val_size) { - ar.load_binary(reinterpret_cast(val_out), val_size*sizeof(CharT)); - } -}; - -namespace boost { namespace serialization { -template -void serialize(Archive & ar, tsl::htrie_map& map, const unsigned int version) { - split_free(ar, map, version); -} - -template -void save(Archive & ar, const tsl::htrie_map& map, const unsigned int version) { - serializer serial{ar}; - map.serialize(serial); -} - - -template -void load(Archive & ar, tsl::htrie_map& map, const unsigned int version) { - deserializer deserial{ar}; - map = tsl::htrie_map::deserialize(deserial); -} -}} - - -int main() { - const tsl::htrie_map map = {{"one", 1}, {"two", 2}, - {"three", 3}, {"four", 4}}; - - - const char* file_name = "htrie_map.data"; - { - std::ofstream ofs; - ofs.exceptions(ofs.badbit | ofs.failbit); - ofs.open(file_name, std::ios::binary); - - boost::iostreams::filtering_ostream fo; - fo.push(boost::iostreams::zlib_compressor()); - fo.push(ofs); - - boost::archive::binary_oarchive oa(fo); - - oa << map; - } - - { - std::ifstream ifs; - ifs.exceptions(ifs.badbit | ifs.failbit | ifs.eofbit); - ifs.open(file_name, std::ios::binary); - - boost::iostreams::filtering_istream fi; - fi.push(boost::iostreams::zlib_decompressor()); - fi.push(ifs); - - boost::archive::binary_iarchive ia(fi); - - tsl::htrie_map map_deserialized; - ia >> map_deserialized; - - assert(map == map_deserialized); - } -} -``` - -### License - -The code is licensed under the MIT license, see the [LICENSE file](LICENSE) for details. diff --git a/third_party/hat-trie/appveyor.yml b/third_party/hat-trie/appveyor.yml deleted file mode 100644 index 5f0d339ba6f..00000000000 --- a/third_party/hat-trie/appveyor.yml +++ /dev/null @@ -1,39 +0,0 @@ -environment: - BOOST_ROOT: C:\Libraries\boost_1_67_0 - matrix: - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - ARCH: Win32 - BOOST_LIBRARYDIR: C:\Libraries\boost_1_67_0\lib32-msvc-14.0 - CMAKE_GENERATOR: Visual Studio 14 2015 - - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - ARCH: x64 - BOOST_LIBRARYDIR: C:\Libraries\boost_1_67_0\lib64-msvc-14.0 - CMAKE_GENERATOR: Visual Studio 14 2015 Win64 - - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - ARCH: Win32 - BOOST_LIBRARYDIR: C:\Libraries\boost_1_67_0\lib32-msvc-14.1 - CMAKE_GENERATOR: Visual Studio 15 2017 - CXXFLAGS: /permissive- - - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - ARCH: x64 - BOOST_LIBRARYDIR: C:\Libraries\boost_1_67_0\lib64-msvc-14.1 - CMAKE_GENERATOR: Visual Studio 15 2017 Win64 - CXXFLAGS: /permissive- - -configuration: - - Debug - - Release - -build_script: - - cd tests - - mkdir build - - cd build - - cmake -DCMAKE_BUILD_TYPE=%CONFIGURATION% -G"%CMAKE_GENERATOR%" .. - - cmake --build . --config %CONFIGURATION% - -test_script: - - set PATH=%PATH%;%BOOST_LIBRARYDIR% - - .\%CONFIGURATION%\tsl_hat_trie_tests.exe diff --git a/third_party/hat-trie/doxygen.conf b/third_party/hat-trie/doxygen.conf deleted file mode 100644 index e24a1448edb..00000000000 --- a/third_party/hat-trie/doxygen.conf +++ /dev/null @@ -1,2481 +0,0 @@ -# Doxyfile 1.8.11 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a double hash (##) is considered a comment and is placed in -# front of the TAG it is preceding. -# -# All text after a single hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists, items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (\" \"). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all text -# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv -# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv -# for the list of possible encodings. -# The default value is: UTF-8. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by -# double-quotes, unless you are using Doxywizard) that should identify the -# project for which the documentation is generated. This name is used in the -# title of most generated pages and in a few other places. -# The default value is: My Project. - -PROJECT_NAME = hat-trie - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. This -# could be handy for archiving the generated documentation or if some version -# control system is used. - -PROJECT_NUMBER = - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer a -# quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = - -# With the PROJECT_LOGO tag one can specify a logo or an icon that is included -# in the documentation. The maximum height of the logo should not exceed 55 -# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy -# the logo to the output directory. - -PROJECT_LOGO = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path -# into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where doxygen was started. If -# left blank the current directory will be used. - -OUTPUT_DIRECTORY = doc/ - -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this -# option can be useful when feeding doxygen a huge amount of source files, where -# putting all generated files in the same directory would otherwise causes -# performance problems for the file system. -# The default value is: NO. - -CREATE_SUBDIRS = NO - -# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII -# characters to appear in the names of generated files. If set to NO, non-ASCII -# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode -# U+3044. -# The default value is: NO. - -ALLOW_UNICODE_NAMES = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. -# The default value is: English. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member -# descriptions after the members that are listed in the file and class -# documentation (similar to Javadoc). Set to NO to disable this. -# The default value is: YES. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief -# description of a member or function before the detailed description -# -# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. -# The default value is: YES. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator that is -# used to form the text in various listings. Each string in this list, if found -# as the leading text of the brief description, will be stripped from the text -# and the result, after processing the whole list, is used as the annotated -# text. Otherwise, the brief description is used as-is. If left blank, the -# following values are used ($name is automatically replaced with the name of -# the entity):The $name class, The $name widget, The $name file, is, provides, -# specifies, contains, represents, a, an and the. - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# doxygen will generate a detailed section even if there is only a brief -# description. -# The default value is: NO. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. -# The default value is: NO. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path -# before files name in the file list and in the header files. If set to NO the -# shortest path that makes the file name unique will be used -# The default value is: YES. - -FULL_PATH_NAMES = YES - -# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. -# Stripping is only done if one of the specified strings matches the left-hand -# part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the path to -# strip. -# -# Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where doxygen is started. -# This tag requires that the tag FULL_PATH_NAMES is set to YES. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the -# path mentioned in the documentation of a class, which tells the reader which -# header file to include in order to use a class. If left blank only the name of -# the header file containing the class definition is used. Otherwise one should -# specify the list of include paths that are normally passed to the compiler -# using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but -# less readable) file names. This can be useful is your file systems doesn't -# support long names like on DOS, Mac, or CD-ROM. -# The default value is: NO. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the -# first line (until the first dot) of a Javadoc-style comment as the brief -# description. If set to NO, the Javadoc-style will behave just like regular Qt- -# style comments (thus requiring an explicit @brief command for a brief -# description.) -# The default value is: NO. - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first -# line (until the first dot) of a Qt-style comment as the brief description. If -# set to NO, the Qt-style will behave just like regular Qt-style comments (thus -# requiring an explicit \brief command for a brief description.) -# The default value is: NO. - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a -# multi-line C++ special comment block (i.e. a block of //! or /// comments) as -# a brief description. This used to be the default behavior. The new default is -# to treat a multi-line C++ comment block as a detailed description. Set this -# tag to YES if you prefer the old behavior instead. -# -# Note that setting this tag to YES also means that rational rose comments are -# not recognized any more. -# The default value is: NO. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the -# documentation from any documented member that it re-implements. -# The default value is: YES. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new -# page for each member. If set to NO, the documentation of a member will be part -# of the file/class/namespace that contains it. -# The default value is: NO. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen -# uses this value to replace tabs by spaces in code fragments. -# Minimum value: 1, maximum value: 16, default value: 4. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that act as commands in -# the documentation. An alias has the form: -# name=value -# For example adding -# "sideeffect=@par Side Effects:\n" -# will allow you to put the command \sideeffect (or @sideeffect) in the -# documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines. - -ALIASES = - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. For -# instance, some of the names that are used will be different. The list of all -# members will be omitted, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or -# Python sources only. Doxygen will then generate output that is more tailored -# for that language. For instance, namespaces will be presented as packages, -# qualified scopes will look different, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources. Doxygen will then generate output that is tailored for Fortran. -# The default value is: NO. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for VHDL. -# The default value is: NO. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, -# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: -# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: -# Fortran. In the later case the parser tries to guess whether the code is fixed -# or free formatted code, this is the default for Fortran type files), VHDL. For -# instance to make doxygen treat .inc files as Fortran files (default is PHP), -# and .f files as C (default is Fortran), use: inc=Fortran f=C. -# -# Note: For files without extension you can use no_extension as a placeholder. -# -# Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments -# according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in -# case of backward compatibilities issues. -# The default value is: YES. - -MARKDOWN_SUPPORT = YES - -# When enabled doxygen tries to link words that correspond to documented -# classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by putting a % sign in front of the word or -# globally by setting AUTOLINK_SUPPORT to NO. -# The default value is: YES. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. -# The default value is: NO. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. -# The default value is: NO. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. -# The default value is: NO. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. -# This will only work if the methods are indeed getting or setting a simple -# type. If this is not the case, or you want to show the methods anyway, you -# should set this option to NO. -# The default value is: YES. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. -# The default value is: NO. - -DISTRIBUTE_GROUP_DOC = NO - -# If one adds a struct or class to a group and this option is enabled, then also -# any nested class or struct is added to the same group. By default this option -# is disabled and one has to add nested compounds explicitly via \ingroup. -# The default value is: NO. - -GROUP_NESTED_COMPOUNDS = NO - -# Set the SUBGROUPING tag to YES to allow class member groups of the same type -# (for instance a group of public functions) to be put as a subgroup of that -# type (e.g. under the Public Functions section). Set it to NO to prevent -# subgrouping. Alternatively, this can be done per class using the -# \nosubgrouping command. -# The default value is: YES. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions -# are shown inside the group in which they are included (e.g. using \ingroup) -# instead of on a separate page (for HTML and Man pages) or section (for LaTeX -# and RTF). -# -# Note that this feature does not work in combination with -# SEPARATE_MEMBER_PAGES. -# The default value is: NO. - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions -# with only public data fields or simple typedef fields will be shown inline in -# the documentation of the scope in which they are defined (i.e. file, -# namespace, or group documentation), provided this scope is documented. If set -# to NO, structs, classes, and unions are shown on a separate page (for HTML and -# Man pages) or section (for LaTeX and RTF). -# The default value is: NO. - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or -# enum is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically be -# useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. -# The default value is: NO. - -TYPEDEF_HIDES_STRUCT = NO - -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This -# cache is used to resolve symbols given their name and scope. Since this can be -# an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The -# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range -# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest -# the optimal cache size from a speed point of view. -# Minimum value: 0, maximum value: 9, default value: 0. - -LOOKUP_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in -# documentation are documented, even if no documentation was available. Private -# class members and static file members will be hidden unless the -# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. -# Note: This will also disable the warnings about undocumented members that are -# normally produced when WARNINGS is set to YES. -# The default value is: NO. - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will -# be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal -# scope will be included in the documentation. -# The default value is: NO. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be -# included in the documentation. -# The default value is: NO. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO, -# only classes defined in header files are included. Does not have any effect -# for Java sources. -# The default value is: YES. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. If set to YES, local methods, -# which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO, only methods in the interface are -# included. -# The default value is: NO. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base name of -# the file that contains the anonymous namespace. By default anonymous namespace -# are hidden. -# The default value is: NO. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all -# undocumented members inside documented classes or files. If set to NO these -# members will be included in the various overviews, but no documentation -# section is generated. This option has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. If set -# to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO, these declarations will be -# included in the documentation. -# The default value is: NO. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO, these -# blocks will be appended to the function's detailed documentation block. -# The default value is: NO. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation that is typed after a -# \internal command is included. If the tag is set to NO then the documentation -# will be excluded. Set it to YES to include the internal documentation. -# The default value is: NO. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES, upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. -# The default value is: system dependent. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES, the -# scope will be hidden. -# The default value is: NO. - -HIDE_SCOPE_NAMES = NO - -# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will -# append additional text to a page's title, such as Class Reference. If set to -# YES the compound reference will be hidden. -# The default value is: NO. - -HIDE_COMPOUND_REFERENCE= NO - -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of -# the files that are included by a file in the documentation of that file. -# The default value is: YES. - -SHOW_INCLUDE_FILES = YES - -# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each -# grouped member an include statement to the documentation, telling the reader -# which file to include in order to use the member. -# The default value is: NO. - -SHOW_GROUPED_MEMB_INC = NO - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include -# files with double quotes in the documentation rather than with sharp brackets. -# The default value is: NO. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the -# documentation for inline members. -# The default value is: YES. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the -# (detailed) documentation of file and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. -# The default value is: YES. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief -# descriptions of file, namespace and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. Note that -# this will also influence the order of the classes in the class list. -# The default value is: NO. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the -# (brief and detailed) documentation of class members so that constructors and -# destructors are listed first. If set to NO the constructors will appear in the -# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. -# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief -# member documentation. -# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting -# detailed member documentation. -# The default value is: NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy -# of group names into alphabetical order. If set to NO the group names will -# appear in their defined order. -# The default value is: NO. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by -# fully-qualified names, including namespaces. If set to NO, the class list will -# be sorted only by class name, not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the alphabetical -# list. -# The default value is: NO. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper -# type resolution of all parameters of a function it will reject a match between -# the prototype and the implementation of a member function even if there is -# only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still -# accept a match between prototype and implementation in such cases. -# The default value is: NO. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo -# list. This list is created by putting \todo commands in the documentation. -# The default value is: YES. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test -# list. This list is created by putting \test commands in the documentation. -# The default value is: YES. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug -# list. This list is created by putting \bug commands in the documentation. -# The default value is: YES. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) -# the deprecated list. This list is created by putting \deprecated commands in -# the documentation. -# The default value is: YES. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional documentation -# sections, marked by \if ... \endif and \cond -# ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the -# initial value of a variable or macro / define can have for it to appear in the -# documentation. If the initializer consists of more lines than specified here -# it will be hidden. Use a value of 0 to hide initializers completely. The -# appearance of the value of individual variables and macros / defines can be -# controlled using \showinitializer or \hideinitializer command in the -# documentation regardless of this setting. -# Minimum value: 0, maximum value: 10000, default value: 30. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES, the -# list will mention the files that were used to generate the documentation. -# The default value is: YES. - -SHOW_USED_FILES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This -# will remove the Files entry from the Quick Index and from the Folder Tree View -# (if specified). -# The default value is: YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces -# page. This will remove the Namespaces entry from the Quick Index and from the -# Folder Tree View (if specified). -# The default value is: YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command command input-file, where command is the value of the -# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file -# version. For an example see the documentation. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can -# optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. -# -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE -# tag is left empty. - -LAYOUT_FILE = - -# The CITE_BIB_FILES tag can be used to specify one or more bib files containing -# the reference definitions. This must be a list of .bib files. The .bib -# extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. -# For LaTeX the style of the bibliography can be controlled using -# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the -# search path. See also \cite for info how to create references. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# Configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the -# messages are off. -# The default value is: NO. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES -# this implies that the warnings are on. -# -# Tip: Turn warnings on while writing the documentation. -# The default value is: YES. - -WARNINGS = YES - -# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate -# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag -# will automatically be disabled. -# The default value is: YES. - -WARN_IF_UNDOCUMENTED = YES - -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. -# The default value is: YES. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that -# are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. -# The default value is: NO. - -WARN_NO_PARAMDOC = NO - -# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. -# The default value is: NO. - -WARN_AS_ERROR = NO - -# The WARN_FORMAT tag determines the format of the warning messages that doxygen -# can produce. The string should contain the $file, $line, and $text tags, which -# will be replaced by the file and line number from which the warning originated -# and the warning text. Optionally the format may contain $version, which will -# be replaced by the version of the file (if it could be obtained via -# FILE_VERSION_FILTER) -# The default value is: $file:$line: $text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning and error -# messages should be written. If left blank the output is written to standard -# error (stderr). - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# Configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag is used to specify the files and/or directories that contain -# documented source files. You may enter file names like myfile.cpp or -# directories like /usr/src/myproject. Separate the files or directories with -# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING -# Note: If this tag is empty the current directory is searched. - -INPUT = include/tsl/ README.md - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses -# libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: http://www.gnu.org/software/libiconv) for the list of -# possible encodings. -# The default value is: UTF-8. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# read by doxygen. -# -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, -# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl, -# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js. - -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.idl \ - *.ddl \ - *.odl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.cs \ - *.d \ - *.php \ - *.php4 \ - *.php5 \ - *.phtml \ - *.inc \ - *.m \ - *.markdown \ - *.md \ - *.mm \ - *.dox \ - *.py \ - *.pyw \ - *.f90 \ - *.f \ - *.for \ - *.tcl \ - *.vhd \ - *.vhdl \ - *.ucf \ - *.qsf \ - *.as \ - *.js - -# The RECURSIVE tag can be used to specify whether or not subdirectories should -# be searched for input files as well. -# The default value is: NO. - -RECURSIVE = NO - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. -# The default value is: NO. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* - -EXCLUDE_SYMBOLS = \ -tsl::detail_htrie_hash::value_node* \ -tsl::detail_htrie_hash::is_related* - -# The EXAMPLE_PATH tag can be used to specify one or more files or directories -# that contain example code fragments that are included (see the \include -# command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank all -# files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude commands -# irrespective of the value of the RECURSIVE tag. -# The default value is: NO. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or directories -# that contain images that are to be included in the documentation (see the -# \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command: -# -# -# -# where is the value of the INPUT_FILTER tag, and is the -# name of an input file. Doxygen will then use the output that the filter -# program writes to standard output. If FILTER_PATTERNS is specified, this tag -# will be ignored. -# -# Note that the filter must not add or remove lines; it is applied before the -# code is scanned, but not when the output code is generated. If lines are added -# or removed, the anchors will not be placed correctly. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: pattern=filter -# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how -# filters are used. If the FILTER_PATTERNS tag is empty or if none of the -# patterns match the file name, INPUT_FILTER is applied. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will also be used to filter the input files that are used for -# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). -# The default value is: NO. - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and -# it is also possible to disable source filtering for a specific pattern using -# *.ext= (so without naming a filter). -# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page -# (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = README.md - -#--------------------------------------------------------------------------- -# Configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will be -# generated. Documented entities will be cross-referenced with these sources. -# -# Note: To get rid of all source code in the generated output, make sure that -# also VERBATIM_HEADERS is set to NO. -# The default value is: NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. -# The default value is: NO. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any -# special comment blocks from generated source code fragments. Normal C, C++ and -# Fortran comments will always remain visible. -# The default value is: YES. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# function all documented functions referencing it will be listed. -# The default value is: NO. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES then for each documented function -# all documented entities called/used by that function will be listed. -# The default value is: NO. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES then the hyperlinks from functions in REFERENCES_RELATION and -# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will -# link to the documentation. -# The default value is: YES. - -REFERENCES_LINK_SOURCE = YES - -# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the -# source code will show a tooltip with additional information such as prototype, -# brief description and links to the definition and documentation. Since this -# will make the HTML file larger and loading of large files a bit slower, you -# can opt to disable this feature. -# The default value is: YES. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -SOURCE_TOOLTIPS = YES - -# If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of doxygen built-in -# source browser. The htags tool is part of GNU's global source tagging system -# (see http://www.gnu.org/software/global/global.html). You will need version -# 4.8.6 or higher. -# -# To use it do the following: -# - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the config file -# - Make sure the INPUT points to the root of the source tree -# - Run doxygen as normal -# -# Doxygen will invoke htags (and that will in turn invoke gtags), so these -# tools must be available from the command line (i.e. in the search path). -# -# The result: instead of the source browser generated by doxygen, the links to -# source code will now point to the output of htags. -# The default value is: NO. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a -# verbatim copy of the header file for each class for which an include is -# specified. Set to NO to disable this. -# See also: Section \class. -# The default value is: YES. - -VERBATIM_HEADERS = YES - -# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the -# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the -# cost of reduced performance. This can be particularly helpful with template -# rich C++ code for which doxygen's built-in parser lacks the necessary type -# information. -# Note: The availability of this option depends on whether or not doxygen was -# generated with the -Duse-libclang=ON option for CMake. -# The default value is: NO. - -CLANG_ASSISTED_PARSING = YES - -# If clang assisted parsing is enabled you can provide the compiler with command -# line options that you would normally use when invoking the compiler. Note that -# the include paths will already be set by doxygen for the files and directories -# specified with INPUT and INCLUDE_PATH. -# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. - -CLANG_OPTIONS = -std=c++11 - -#--------------------------------------------------------------------------- -# Configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all -# compounds will be generated. Enable this if the project contains a lot of -# classes, structs, unions or interfaces. -# The default value is: YES. - -ALPHABETICAL_INDEX = YES - -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output -# The default value is: YES. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each -# generated HTML page (for example: .htm, .php, .asp). -# The default value is: .html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a -# standard header. -# -# To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. -# the setting GENERATE_TREEVIEW). It is highly recommended to start with a -# default header using -# doxygen -w html new_header.html new_footer.html new_stylesheet.css -# YourConfigFile -# and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally -# uses. -# Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description -# of the possible markers and block names see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard -# footer. See HTML_HEADER for more information on how to generate a default -# footer and what special commands can be used inside the footer. See also -# section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style -# sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. -# See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. -# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as -# it is more robust and this tag (HTML_STYLESHEET) will in the future become -# obsolete. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_STYLESHEET = - -# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined -# cascading style sheets that are included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. -# This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefore more robust against future updates. -# Doxygen will copy the style sheet files to the output directory. -# Note: The order of the extra style sheet files is of importance (e.g. the last -# style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that the -# files will be copied as-is; there are no commands or markers available. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see -# http://en.wikipedia.org/wiki/Hue for more information. For instance the value -# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 -# purple, and 360 is red again. -# Minimum value: 0, maximum value: 359, default value: 220. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A -# value of 255 will produce the most vivid colors. -# Minimum value: 0, maximum value: 255, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the -# luminance component of the colors in the HTML output. Values below 100 -# gradually make the output lighter, whereas values above 100 make the output -# darker. The value divided by 100 is the actual gamma applied, so 80 represents -# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not -# change the gamma. -# Minimum value: 40, maximum value: 240, default value: 80. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = NO - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_SECTIONS = NO - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries -# shown in the various tree structured indices initially; the user can expand -# and collapse entries dynamically later on. Doxygen will expand the tree to -# such a level that at most the specified number of entries are visible (unless -# a fully collapsed tree already exceeds this amount). So setting the number of -# entries 1 will produce a full collapsed tree by default. 0 is a special value -# representing an infinite number of entries and will result in a full expanded -# tree by default. -# Minimum value: 0, maximum value: 9999, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files will be -# generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: http://developer.apple.com/tools/xcode/), introduced with -# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_DOCSET = NO - -# This tag determines the name of the docset feed. A documentation feed provides -# an umbrella under which multiple documentation sets from a single provider -# (such as a company or product suite) can be grouped. -# The default value is: Doxygen generated docs. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# This tag specifies a string that should uniquely identify the documentation -# set bundle. This should be a reverse domain-name style string, e.g. -# com.mycompany.MyDocSet. Doxygen will append .docset to the name. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. -# The default value is: org.doxygen.Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. -# The default value is: Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three -# additional HTML index files: index.hhp, index.hhc, and index.hhk. The -# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. -# -# The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML -# files are now used as the Windows 98 help format, and will replace the old -# Windows help format (.hlp) on all Windows platforms in the future. Compressed -# HTML files also contain an index, a table of contents, and you can search for -# words in the documentation. The HTML workshop also contains a viewer for -# compressed HTML files. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_HTMLHELP = NO - -# The CHM_FILE tag can be used to specify the file name of the resulting .chm -# file. You can add a path in front of the file if the result should not be -# written to the html output directory. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_FILE = - -# The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler (hhc.exe). If non-empty, -# doxygen will try to run the HTML help compiler on the generated index.hhp. -# The file has to be specified with full path. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -HHC_LOCATION = - -# The GENERATE_CHI flag controls if a separate .chi index file is generated -# (YES) or that it should be included in the master .chm file (NO). -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -GENERATE_CHI = NO - -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) -# and project file content. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_INDEX_ENCODING = - -# The BINARY_TOC flag controls whether a binary table of contents is generated -# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it -# enables the Previous and Next buttons. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members to -# the table of contents of the HTML help documentation and to the tree view. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that -# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help -# (.qch) of the generated HTML documentation. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify -# the file name of the resulting .qch file. The path specified is relative to -# the HTML output folder. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help -# Project output. For more information please see Qt Help Project / Namespace -# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt -# Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- -# folders). -# The default value is: doc. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_VIRTUAL_FOLDER = doc - -# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom -# filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_SECT_FILTER_ATTRS = - -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be -# generated, together with the HTML files, they form an Eclipse help plugin. To -# install this plugin and make it available under the help contents menu in -# Eclipse, the contents of the directory containing the HTML and XML files needs -# to be copied into the plugins directory of eclipse. The name of the directory -# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. -# After copying Eclipse needs to be restarted before the help appears. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the Eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have this -# name. Each documentation set should have its own identifier. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# If you want full control over the layout of the generated HTML pages it might -# be necessary to disable the index and replace it with your own. The -# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top -# of each HTML page. A value of NO enables the index and the value YES disables -# it. Since the tabs in the index contain the same information as the navigation -# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. If the tag -# value is set to YES, a side panel will be generated containing a tree-like -# index structure (just like the one that is generated for HTML Help). For this -# to work a browser that supports JavaScript, DHTML, CSS and frames is required -# (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_TREEVIEW = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. -# -# Note that a value of 0 will completely suppress the enum values from appearing -# in the overview section. -# Minimum value: 0, maximum value: 20, default value: 4. -# This tag requires that the tag GENERATE_HTML is set to YES. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used -# to set the initial width (in pixels) of the frame in which the tree is shown. -# Minimum value: 0, maximum value: 1500, default value: 250. -# This tag requires that the tag GENERATE_HTML is set to YES. - -TREEVIEW_WIDTH = 250 - -# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to -# external symbols imported via tag files in a separate window. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of LaTeX formulas included as images in -# the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML -# output directory to force them to be regenerated. -# Minimum value: 8, maximum value: 50, default value: 10. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# http://www.mathjax.org) which uses client side Javascript for the rendering -# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX -# installed or if you want to formulas look prettier in the HTML output. When -# enabled you may also need to install MathJax separately and configure the path -# to it using the MATHJAX_RELPATH option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -USE_MATHJAX = NO - -# When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. -# Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. -# The default value is: HTML-CSS. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the HTML -# output directory using the MATHJAX_RELPATH option. The destination directory -# should contain the MathJax.js script. For instance, if the mathjax directory -# is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax -# Content Delivery Network so you can quickly see the result without installing -# MathJax. However, it is strongly recommended to install a local copy of -# MathJax from http://www.mathjax.org before deployment. -# The default value is: http://cdn.mathjax.org/mathjax/latest. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest - -# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax -# extension names that should be enabled during MathJax rendering. For example -# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_EXTENSIONS = - -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces -# of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an -# example see the documentation. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_CODEFILE = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and -# should work on any modern browser. Note that when using HTML help -# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) -# there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then -# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to -# search using the keyboard; to jump to the search box use + S -# (what the is depends on the OS and browser, but it is typically -# , /
    -ryg + +---- + +[![Build Status](https://github.com/ocornut/imgui/workflows/build/badge.svg)](https://github.com/ocornut/imgui/actions?workflow=build) [![Static Analysis Status](https://github.com/ocornut/imgui/workflows/static-analysis/badge.svg)](https://github.com/ocornut/imgui/actions?workflow=static-analysis) [![Tests Status](https://github.com/ocornut/imgui_test_engine/workflows/tests/badge.svg)](https://github.com/ocornut/imgui_test_engine/actions?workflow=tests) (This library is available under a free and permissive license, but needs financial support to sustain its continued improvements. In addition to maintenance and stability there are many desirable features yet to be added. If your company is using Dear ImGui, please consider reaching out.) -Businesses: support continued development and maintenance via invoiced technical support, maintenance, sponsoring contracts: +Businesses: support continued development and maintenance via invoiced sponsoring/support contracts:
      _E-mail: contact @ dearimgui dot com_ +
    Individuals: support continued development and maintenance [here](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=WGHNC6MBFLZ2S). Also see [Funding](https://github.com/ocornut/imgui/wiki/Funding) page. -Individuals: support continued development and maintenance [here](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=WGHNC6MBFLZ2S). - -Also see [Sponsors](https://github.com/ocornut/imgui/wiki/Sponsors) page. +| [The Pitch](#the-pitch) - [Usage](#usage) - [How it works](#how-it-works) - [Releases & Changelogs](#releases--changelogs) - [Demo](#demo) - [Integration](#integration) | +:----------------------------------------------------------: | +| [Gallery](#gallery) - [Support, FAQ](#support-frequently-asked-questions-faq) - [How to help](#how-to-help) - **[Funding & Sponsors](https://github.com/ocornut/imgui/wiki/Funding)** - [Credits](#credits) - [License](#license) | +| [Wiki](https://github.com/ocornut/imgui/wiki) - [Extensions](https://github.com/ocornut/imgui/wiki/Useful-Extensions) - [Languages bindings & frameworks backends](https://github.com/ocornut/imgui/wiki/Bindings) - [Software using Dear ImGui](https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui) - [User quotes](https://github.com/ocornut/imgui/wiki/Quotes) | ----- +### The Pitch -Dear ImGui is a **bloat-free graphical user interface library for C++**. It outputs optimized vertex buffers that you can render anytime in your 3D-pipeline enabled application. It is fast, portable, renderer agnostic and self-contained (no external dependencies). +Dear ImGui is a **bloat-free graphical user interface library for C++**. It outputs optimized vertex buffers that you can render anytime in your 3D-pipeline-enabled application. It is fast, portable, renderer agnostic, and self-contained (no external dependencies). -Dear ImGui is designed to **enable fast iterations** and to **empower programmers** to create **content creation tools and visualization / debug tools** (as opposed to UI for the average end-user). It favors simplicity and productivity toward this goal, and lacks certain features normally found in more high-level libraries. +Dear ImGui is designed to **enable fast iterations** and to **empower programmers** to create **content creation tools and visualization / debug tools** (as opposed to UI for the average end-user). It favors simplicity and productivity toward this goal and lacks certain features commonly found in more high-level libraries. -Dear ImGui is particularly suited to integration in games engine (for tooling), real-time 3D applications, fullscreen applications, embedded applications, or any applications on consoles platforms where operating system features are non-standard. +Dear ImGui is particularly suited to integration in game engines (for tooling), real-time 3D applications, fullscreen applications, embedded applications, or any applications on console platforms where operating system features are non-standard. -| [Usage](#usage) - [How it works](#how-it-works) - [Releases & Changelogs](#releases--changelogs) - [Demo](#demo) - [Integration](#integration) | -:----------------------------------------------------------: | -| [Upcoming changes](#upcoming-changes) - [Gallery](#gallery) - [Support, FAQ](#support-frequently-asked-questions-faq) - [How to help](#how-to-help) - [Sponsors](#sponsors) - [Credits](#credits) - [License](#license) | -| [Wiki](https://github.com/ocornut/imgui/wiki) - [Languages & frameworks backends/bindings](https://github.com/ocornut/imgui/wiki/Bindings) - [Software using Dear ImGui](https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui) - [User quotes](https://github.com/ocornut/imgui/wiki/Quotes) | + - Minimize state synchronization. + - Minimize UI-related state storage on user side. + - Minimize setup and maintenance. + - Easy to use to create dynamic UI which are the reflection of a dynamic data set. + - Easy to use to create code-driven and data-driven tools. + - Easy to use to create ad hoc short-lived tools and long-lived, more elaborate tools. + - Easy to hack and improve. + - Portable, minimize dependencies, run on target (consoles, phones, etc.). + - Efficient runtime and memory consumption. + - Battle-tested, used by [many major actors in the game industry](https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui). ### Usage -**The core of Dear ImGui is self-contained within a few platform-agnostic files** which you can easily compile in your application/engine. They are all the files in the root folder of the repository (imgui*.cpp, imgui*.h). +**The core of Dear ImGui is self-contained within a few platform-agnostic files** which you can easily compile in your application/engine. They are all the files in the root folder of the repository (imgui*.cpp, imgui*.h). **No specific build process is required**. You can add the .cpp files into your existing project. -**No specific build process is required**. You can add the .cpp files to your existing project. +**Backends for a variety of graphics API and rendering platforms** are provided in the [backends/](https://github.com/ocornut/imgui/tree/master/backends) folder, along with example applications in the [examples/](https://github.com/ocornut/imgui/tree/master/examples) folder. You may also create your own backend. Anywhere where you can render textured triangles, you can render Dear ImGui. -You will need a backend to integrate Dear ImGui in your app. The backend passes mouse/keyboard/gamepad inputs and variety of settings to Dear ImGui, and is in charge of rendering the resulting vertices. +See the [Getting Started](https://github.com/ocornut/imgui/wiki/Getting-Started) guide and [Integration](#integration) section of this document for more details. -**Backends for a variety of graphics api and rendering platforms** are provided in the [backends/](https://github.com/ocornut/imgui/tree/master/backends) folder, along with example applications in the [examples/](https://github.com/ocornut/imgui/tree/master/examples) folder. See the [Integration](#integration) section of this document for details. You may also create your own backend. Anywhere where you can render textured triangles, you can render Dear ImGui. - -After Dear ImGui is setup in your application, you can use it from \_anywhere\_ in your program loop: - -Code: +After Dear ImGui is set up in your application, you can use it from \_anywhere\_ in your program loop: ```cpp ImGui::Text("Hello, world %d", 123); if (ImGui::Button("Save")) @@ -45,11 +53,9 @@ if (ImGui::Button("Save")) ImGui::InputText("string", buf, IM_ARRAYSIZE(buf)); ImGui::SliderFloat("float", &f, 0.0f, 1.0f); ``` -Result: -
    ![sample code output (dark)](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v175/capture_readme_styles_0001.png) ![sample code output (light)](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v175/capture_readme_styles_0002.png) -
    _(settings: Dark style (left), Light style (right) / Font: Roboto-Medium, 16px)_ +![sample code output (dark, segoeui font, freetype)](https://user-images.githubusercontent.com/8225057/191050833-b7ecf528-bfae-4a9f-ac1b-f3d83437a2f4.png) +![sample code output (light, segoeui font, freetype)](https://user-images.githubusercontent.com/8225057/191050838-8742efd4-504d-4334-a9a2-e756d15bc2ab.png) -Code: ```cpp // Create a window called "My First Tool", with a menu bar. ImGui::Begin("My First Tool", &my_tool_active, ImGuiWindowFlags_MenuBar); @@ -65,12 +71,14 @@ if (ImGui::BeginMenuBar()) ImGui::EndMenuBar(); } -// Edit a color (stored as ~4 floats) +// Edit a color stored as 4 floats ImGui::ColorEdit4("Color", my_color); -// Plot some values -const float my_values[] = { 0.2f, 0.1f, 1.0f, 0.5f, 0.9f, 2.2f }; -ImGui::PlotLines("Frame Times", my_values, IM_ARRAYSIZE(my_values)); +// Generate samples and plot them +float samples[100]; +for (int n = 0; n < 100; n++) + samples[n] = sinf(n * 0.2f + ImGui::GetTime() * 1.5f); +ImGui::PlotLines("Samples", samples, 100); // Display contents in a scrolling region ImGui::TextColored(ImVec4(1,1,0,1), "Important Stuff"); @@ -80,137 +88,110 @@ for (int n = 0; n < 50; n++) ImGui::EndChild(); ImGui::End(); ``` -Result: -
    ![sample code output](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v180/code_sample_04_color.gif) +![my_first_tool_v188](https://user-images.githubusercontent.com/8225057/191055698-690a5651-458f-4856-b5a9-e8cc95c543e2.gif) -Dear ImGui allows you to **create elaborate tools** as well as very short-lived ones. On the extreme side of short-livedness: using the Edit&Continue (hot code reload) feature of modern compilers you can add a few widgets to tweaks variables while your application is running, and remove the code a minute later! Dear ImGui is not just for tweaking values. You can use it to trace a running algorithm by just emitting text commands. You can use it along with your own reflection data to browse your dataset live. You can use it to expose the internals of a subsystem in your engine, to create a logger, an inspection tool, a profiler, a debugger, an entire game making editor/framework, etc. +Dear ImGui allows you to **create elaborate tools** as well as very short-lived ones. On the extreme side of short-livedness: using the Edit&Continue (hot code reload) feature of modern compilers you can add a few widgets to tweak variables while your application is running, and remove the code a minute later! Dear ImGui is not just for tweaking values. You can use it to trace a running algorithm by just emitting text commands. You can use it along with your own reflection data to browse your dataset live. You can use it to expose the internals of a subsystem in your engine, to create a logger, an inspection tool, a profiler, a debugger, an entire game-making editor/framework, etc. ### How it works -Check out the Wiki's [About the IMGUI paradigm](https://github.com/ocornut/imgui/wiki#about-the-imgui-paradigm) section if you want to understand the core principles behind the IMGUI paradigm. An IMGUI tries to minimize superfluous state duplication, state synchronization and state retention from the user's point of view. It is less error prone (less code and less bugs) than traditional retained-mode interfaces, and lends itself to create dynamic user interfaces. +The IMGUI paradigm through its API tries to minimize superfluous state duplication, state synchronization, and state retention from the user's point of view. It is less error-prone (less code and fewer bugs) than traditional retained-mode interfaces, and lends itself to creating dynamic user interfaces. Check out the Wiki's [About the IMGUI paradigm](https://github.com/ocornut/imgui/wiki#about-the-imgui-paradigm) section for more details. Dear ImGui outputs vertex buffers and command lists that you can easily render in your application. The number of draw calls and state changes required to render them is fairly small. Because Dear ImGui doesn't know or touch graphics state directly, you can call its functions anywhere in your code (e.g. in the middle of a running algorithm, or in the middle of your own rendering process). Refer to the sample applications in the examples/ folder for instructions on how to integrate Dear ImGui with your existing codebase. -_A common misunderstanding is to mistake immediate mode gui for immediate mode rendering, which usually implies hammering your driver/GPU with a bunch of inefficient draw calls and state changes as the gui functions are called. This is NOT what Dear ImGui does. Dear ImGui outputs vertex buffers and a small list of draw calls batches. It never touches your GPU directly. The draw call batches are decently optimal and you can render them later, in your app or even remotely._ +_A common misunderstanding is to mistake immediate mode GUI for immediate mode rendering, which usually implies hammering your driver/GPU with a bunch of inefficient draw calls and state changes as the GUI functions are called. This is NOT what Dear ImGui does. Dear ImGui outputs vertex buffers and a small list of draw calls batches. It never touches your GPU directly. The draw call batches are decently optimal and you can render them later, in your app or even remotely._ ### Releases & Changelogs -See [Releases](https://github.com/ocornut/imgui/releases) page. +See [Releases](https://github.com/ocornut/imgui/releases) page for decorated Changelogs. Reading the changelogs is a good way to keep up to date with the things Dear ImGui has to offer, and maybe will give you ideas of some features that you've been ignoring until now! ### Demo -Calling the `ImGui::ShowDemoWindow()` function will create a demo window showcasing variety of features and examples. The code is always available for reference in `imgui_demo.cpp`. +Calling the `ImGui::ShowDemoWindow()` function will create a demo window showcasing a variety of features and examples. The code is always available for reference in `imgui_demo.cpp`. [Here's how the demo looks](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v167/v167-misc.png). -![screenshot demo](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v167/v167-misc.png) +You should be able to build the examples from sources. If you don't, let us know! If you want to have a quick look at some Dear ImGui features, you can download Windows binaries of the demo app here: +- [imgui-demo-binaries-20240105.zip](https://www.dearimgui.com/binaries/imgui-demo-binaries-20240105.zip) (Windows, 1.90.1 WIP, built 2024/01/05, master) or [older binaries](https://www.dearimgui.com/binaries). -You should be able to build the examples from sources (tested on Windows/Mac/Linux). If you don't, let us know! If you want to have a quick look at some Dear ImGui features, you can download Windows binaries of the demo app here: -- [imgui-demo-binaries-20210331.zip](https://www.dearimgui.org/binaries/imgui-demo-binaries-20210331.zip) (Windows, 1.83 WIP, built 2021/03/31, master branch) or [older demo binaries](https://www.dearimgui.org/binaries). - -The demo applications are not DPI aware so expect some blurriness on a 4K screen. For DPI awareness in your application, you can load/reload your font at different scale, and scale your style with `style.ScaleAllSizes()` (see [FAQ](https://www.dearimgui.org/faq)). +The demo applications are not DPI aware so expect some blurriness on a 4K screen. For DPI awareness in your application, you can load/reload your font at a different scale and scale your style with `style.ScaleAllSizes()` (see [FAQ](https://www.dearimgui.com/faq)). ### Integration -On most platforms and when using C++, **you should be able to use a combination of the [imgui_impl_xxxx](https://github.com/ocornut/imgui/tree/master/backends) backends without modification** (e.g. `imgui_impl_win32.cpp` + `imgui_impl_dx11.cpp`). If your engine supports multiple platforms, consider using more of the imgui_impl_xxxx files instead of rewriting them: this will be less work for you and you can get Dear ImGui running immediately. You can _later_ decide to rewrite a custom backend using your custom engine functions if you wish so. +See the [Getting Started](https://github.com/ocornut/imgui/wiki/Getting-Started) guide for details. + +On most platforms and when using C++, **you should be able to use a combination of the [imgui_impl_xxxx](https://github.com/ocornut/imgui/tree/master/backends) backends without modification** (e.g. `imgui_impl_win32.cpp` + `imgui_impl_dx11.cpp`). If your engine supports multiple platforms, consider using more imgui_impl_xxxx files instead of rewriting them: this will be less work for you, and you can get Dear ImGui running immediately. You can _later_ decide to rewrite a custom backend using your custom engine functions if you wish so. -Integrating Dear ImGui within your custom engine is a matter of 1) wiring mouse/keyboard/gamepad inputs 2) uploading one texture to your GPU/render engine 3) providing a render function that can bind textures and render textured triangles. The [examples/](https://github.com/ocornut/imgui/tree/master/examples) folder is populated with applications doing just that. If you are an experienced programmer at ease with those concepts, it should take you less than two hours to integrate Dear ImGui in your custom engine. **Make sure to spend time reading the [FAQ](https://www.dearimgui.org/faq), comments, and some of the examples/ application!** +Integrating Dear ImGui within your custom engine is a matter of 1) wiring mouse/keyboard/gamepad inputs 2) uploading a texture to your GPU/render engine 3) providing a render function that can bind textures and render textured triangles, which is essentially what Backends are doing. The [examples/](https://github.com/ocornut/imgui/tree/master/examples) folder is populated with applications doing just that: setting up a window and using backends. If you follow the [Getting Started](https://github.com/ocornut/imgui/wiki/Getting-Started) guide it should in theory takes you less than an hour to integrate Dear ImGui. **Make sure to spend time reading the [FAQ](https://www.dearimgui.com/faq), comments, and the examples applications!** Officially maintained backends/bindings (in repository): - Renderers: DirectX9, DirectX10, DirectX11, DirectX12, Metal, OpenGL/ES/ES2, SDL_Renderer, Vulkan, WebGPU. -- Platforms: GLFW, SDL2, Win32, Glut, OSX, Android. +- Platforms: GLFW, SDL2/SDL3, Win32, Glut, OSX, Android. - Frameworks: Allegro5, Emscripten. [Third-party backends/bindings](https://github.com/ocornut/imgui/wiki/Bindings) wiki page: -- Languages: C, C# and: Beef, ChaiScript, Crystal, D, Go, Haskell, Haxe/hxcpp, Java, JavaScript, Julia, Kotlin, Lobster, Lua, Odin, Pascal, PureBasic, Python, Ruby, Rust, Swift... -- Frameworks: AGS/Adventure Game Studio, Amethyst, Blender, bsf, Cinder, Cocos2d-x, Diligent Engine, Flexium, GML/Game Maker Studio2, GLEQ, Godot, GTK3+OpenGL3, Irrlicht Engine, LÖVE+LUA, Magnum, Monogame, NanoRT, nCine, Nim Game Lib, Nintendo 3DS & Switch (homebrew), Ogre, openFrameworks, OSG/OpenSceneGraph, Orx, Photoshop, px_render, Qt/QtDirect3D, SDL_Renderer, SFML, Sokol, Unity, Unreal Engine 4, vtk, VulkanHpp, VulkanSceneGraph, Win32 GDI, WxWidgets. -- Note that C bindings ([cimgui](https://github.com/cimgui/cimgui)) are auto-generated, you can use its json/lua output to generate bindings for other languages. +- Languages: C, C# and: Beef, ChaiScript, CovScript, Crystal, D, Go, Haskell, Haxe/hxcpp, Java, JavaScript, Julia, Kotlin, Lobster, Lua, Nim, Odin, Pascal, PureBasic, Python, ReaScript, Ruby, Rust, Swift, Zig... +- Frameworks: AGS/Adventure Game Studio, Amethyst, Blender, bsf, Cinder, Cocos2d-x, Defold, Diligent Engine, Ebiten, Flexium, GML/Game Maker Studio, GLEQ, Godot, GTK3, Irrlicht Engine, JUCE, LÖVE+LUA, Mach Engine, Magnum, Marmalade, Monogame, NanoRT, nCine, Nim Game Lib, Nintendo 3DS/Switch/WiiU (homebrew), Ogre, openFrameworks, OSG/OpenSceneGraph, Orx, Photoshop, px_render, Qt/QtDirect3D, raylib, SFML, Sokol, Unity, Unreal Engine 4/5, UWP, vtk, VulkanHpp, VulkanSceneGraph, Win32 GDI, WxWidgets. +- Many bindings are auto-generated (by good old [cimgui](https://github.com/cimgui/cimgui) or newer/experimental [dear_bindings](https://github.com/dearimgui/dear_bindings)), you can use their metadata output to generate bindings for other languages. [Useful Extensions/Widgets](https://github.com/ocornut/imgui/wiki/Useful-Extensions) wiki page: -- Text editors, node editors, timeline editors, plotting, software renderers, remote network access, memory editors, gizmos etc. +- Automation/testing, Text editors, node editors, timeline editors, plotting, software renderers, remote network access, memory editors, gizmos, etc. Notable and well supported extensions include [ImPlot](https://github.com/epezent/implot) and [Dear ImGui Test Engine](https://github.com/ocornut/imgui_test_engine). Also see [Wiki](https://github.com/ocornut/imgui/wiki) for more links and ideas. -### Upcoming Changes - -Some of the goals for 2021 are: -- Work on Docking (see [#2109](https://github.com/ocornut/imgui/issues/2109), in public [docking](https://github.com/ocornut/imgui/tree/docking) branch) -- Work on Multi-Viewport / Multiple OS windows. (see [#1542](https://github.com/ocornut/imgui/issues/1542), in public [docking](https://github.com/ocornut/imgui/tree/docking) branch looking for feedback) -- Work on gamepad/keyboard controls. (see [#787](https://github.com/ocornut/imgui/issues/787)) -- Work on automation and testing system, both to test the library and end-user apps. (see [#435](https://github.com/ocornut/imgui/issues/435)) -- Make the examples look better, improve styles, improve font support, make the examples hi-DPI and multi-DPI aware. - ### Gallery -For more user-submitted screenshots of projects using Dear ImGui, check out the [Gallery Threads](https://github.com/ocornut/imgui/issues/4451)! +Examples projects using Dear ImGui: [Tracy](https://github.com/wolfpld/tracy) (profiler), [ImHex](https://github.com/WerWolv/ImHex) (hex editor/data analysis), [RemedyBG](https://remedybg.itch.io/remedybg) (debugger) and [hundreds of others](https://github.com/ocornut/imgui/wiki/Software-using-Dear-ImGui). -For a list of third-party widgets and extensions, check out the [Useful Extensions/Widgets](https://github.com/ocornut/imgui/wiki/Useful-Extensions) wiki page. +For more user-submitted screenshots of projects using Dear ImGui, check out the [Gallery Threads](https://github.com/ocornut/imgui/issues/7503)! -Custom engine -[![screenshot game](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v149/gallery_TheDragonsTrap-01-thumb.jpg)](https://cloud.githubusercontent.com/assets/8225057/20628927/33e14cac-b329-11e6-80f6-9524e93b048a.png) - -Custom engine -[![screenshot tool](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v160/editor_white_preview.jpg)](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v160/editor_white.png) +For a list of third-party widgets and extensions, check out the [Useful Extensions/Widgets](https://github.com/ocornut/imgui/wiki/Useful-Extensions) wiki page. -[Tracy Profiler](https://github.com/wolfpld/tracy) -![tracy profiler](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v176/tracy_profiler.png) +| | | +|--|--| +| Custom engine [erhe](https://github.com/tksuoran/erhe) (docking branch)
    [![erhe](https://user-images.githubusercontent.com/8225057/190203358-6988b846-0686-480e-8663-1311fbd18abd.jpg)](https://user-images.githubusercontent.com/994606/147875067-a848991e-2ad2-4fd3-bf71-4aeb8a547bcf.png) | Custom engine for [Wonder Boy: The Dragon's Trap](http://www.TheDragonsTrap.com) (2017)
    [![the dragon's trap](https://user-images.githubusercontent.com/8225057/190203379-57fcb80e-4aec-4fec-959e-17ddd3cd71e5.jpg)](https://cloud.githubusercontent.com/assets/8225057/20628927/33e14cac-b329-11e6-80f6-9524e93b048a.png) | +| Custom engine (untitled)
    [![editor white](https://user-images.githubusercontent.com/8225057/190203393-c5ac9f22-b900-4d1e-bfeb-6027c63e3d92.jpg)](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v160/editor_white.png) | Tracy Profiler ([github](https://github.com/wolfpld/tracy))
    [![tracy profiler](https://user-images.githubusercontent.com/8225057/190203401-7b595f6e-607c-44d3-97ea-4c2673244dfb.jpg)](https://raw.githubusercontent.com/wiki/ocornut/imgui/web/v176/tracy_profiler.png) | ### Support, Frequently Asked Questions (FAQ) See: [Frequently Asked Questions (FAQ)](https://github.com/ocornut/imgui/blob/master/docs/FAQ.md) where common questions are answered. -See: [Wiki](https://github.com/ocornut/imgui/wiki) for many links, references, articles. +See: [Getting Started](https://github.com/ocornut/imgui/wiki/Getting-Started) and [Wiki](https://github.com/ocornut/imgui/wiki) for many links, references, articles. See: [Articles about the IMGUI paradigm](https://github.com/ocornut/imgui/wiki#about-the-imgui-paradigm) to read/learn about the Immediate Mode GUI paradigm. -Getting started? For first-time users having issues compiling/linking/running or issues loading fonts, please use [GitHub Discussions](https://github.com/ocornut/imgui/discussions). +See: [Upcoming Changes](https://github.com/ocornut/imgui/wiki/Upcoming-Changes). + +See: [Dear ImGui Test Engine + Test Suite](https://github.com/ocornut/imgui_test_engine) for Automation & Testing. + +For the purposes of getting search engines to crawl the wiki, here's a link to the [Crawlable Wiki](https://github-wiki-see.page/m/ocornut/imgui/wiki) (not for humans, [here's why](https://github-wiki-see.page/)). -For other questions, bug reports, requests, feedback, you may post on [GitHub Issues](https://github.com/ocornut/imgui/issues). Please read and fill the New Issue template carefully. +Getting started? For first-time users having issues compiling/linking/running or issues loading fonts, please use [GitHub Discussions](https://github.com/ocornut/imgui/discussions). For ANY other questions, bug reports, requests, feedback, please post on [GitHub Issues](https://github.com/ocornut/imgui/issues). Please read and fill the New Issue template carefully. Private support is available for paying business customers (E-mail: _contact @ dearimgui dot com_). **Which version should I get?** -We occasionally tag [Releases](https://github.com/ocornut/imgui/releases) but it is generally safe and recommended to sync to master/latest. The library is fairly stable and regressions tend to be fixed fast when reported. - -Advanced users may want to use the `docking` branch with [Multi-Viewport](https://github.com/ocornut/imgui/issues/1542) and [Docking](https://github.com/ocornut/imgui/issues/2109) features. This branch is kept in sync with master regularly. +We occasionally tag [Releases](https://github.com/ocornut/imgui/releases) (with nice releases notes) but it is generally safe and recommended to sync to latest `master` or `docking` branch. The library is fairly stable and regressions tend to be fixed fast when reported. Advanced users may want to use the `docking` branch with [Multi-Viewport](https://github.com/ocornut/imgui/issues/1542) and [Docking](https://github.com/ocornut/imgui/issues/2109) features. This branch is kept in sync with master regularly. **Who uses Dear ImGui?** -See the [Quotes](https://github.com/ocornut/imgui/wiki/Quotes), [Sponsors](https://github.com/ocornut/imgui/wiki/Sponsors), [Software using dear imgui](https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui) Wiki pages for an idea of who is using Dear ImGui. Please add your game/software if you can! Also see the [Gallery Threads](https://github.com/ocornut/imgui/issues/4451)! +See the [Quotes](https://github.com/ocornut/imgui/wiki/Quotes), [Funding & Sponsors](https://github.com/ocornut/imgui/wiki/Funding), and [Software using Dear ImGui](https://github.com/ocornut/imgui/wiki/Software-using-dear-imgui) Wiki pages for an idea of who is using Dear ImGui. Please add your game/software if you can! Also, see the [Gallery Threads](https://github.com/ocornut/imgui/issues/7503)! How to help ----------- **How can I help?** -- See [GitHub Forum/issues](https://github.com/ocornut/imgui/issues) and [Github Discussions](https://github.com/ocornut/imgui/discussions). -- You may help with development and submit pull requests! Please understand that by submitting a PR you are also submitting a request for the maintainer to review your code and then take over its maintenance forever. PR should be crafted both in the interest in the end-users and also to ease the maintainer into understanding and accepting it. +- See [GitHub Forum/Issues](https://github.com/ocornut/imgui/issues). +- You may help with development and submit pull requests! Please understand that by submitting a PR you are also submitting a request for the maintainer to review your code and then take over its maintenance forever. PR should be crafted both in the interest of the end-users and also to ease the maintainer into understanding and accepting it. - See [Help wanted](https://github.com/ocornut/imgui/wiki/Help-Wanted) on the [Wiki](https://github.com/ocornut/imgui/wiki/) for some more ideas. -- Have your company financially support this project (please reach by e-mail) - -**How can I help financing further development of Dear ImGui?** - -See [Sponsors](https://github.com/ocornut/imgui/wiki/Sponsors) page. +- Be a [Funding Supporter](https://github.com/ocornut/imgui/wiki/Funding)! Have your company financially support this project via invoiced sponsors/maintenance or by buying a license for [Dear ImGui Test Engine](https://github.com/ocornut/imgui_test_engine) (please reach out: omar AT dearimgui DOT com). Sponsors -------- -Ongoing Dear ImGui development is currently financially supported by users and private sponsors: - -*Platinum-chocolate sponsors* -- [Blizzard](https://careers.blizzard.com/en-us/openings/engineering/all/all/all/1) - -*Double-chocolate sponsors* -- [Ubisoft](https://montreal.ubisoft.com/en/ubisoft-sponsors-user-interface-library-for-c-dear-imgui), [Supercell](https://supercell.com) - -*Chocolate sponsors* -- [Activision](https://careers.activision.com/c/programmingsoftware-engineering-jobs), [Adobe](https://www.adobe.com/products/medium.html), [Aras Pranckevičius](https://aras-p.info), [Arkane Studios](https://www.arkane-studios.com), [Epic](https://www.unrealengine.com/en-US/megagrants), [Google](https://github.com/google/filament), [Nvidia](https://developer.nvidia.com/nvidia-omniverse), [RAD Game Tools](http://www.radgametools.com/) - -*Salty-caramel sponsors* -- [Framefield](http://framefield.com), [Grinding Gear Games](https://www.grindinggear.com), [Kylotonn](https://www.kylotonn.com), [Next Level Games](https://www.nextlevelgames.com), [O-Net Communications (USA)](http://en.o-netcom.com) - -Please see [detailed list of Dear ImGui supporters](https://github.com/ocornut/imgui/wiki/Sponsors) for past sponsors. -From November 2014 to December 2019, ongoing development has also been financially supported by its users on Patreon and through individual donations. +Ongoing Dear ImGui development is and has been financially supported by users and private sponsors. +
    Please see the **[detailed list of current and past Dear ImGui funding supporters and sponsors](https://github.com/ocornut/imgui/wiki/Funding)** for details. +
    From November 2014 to December 2019, ongoing development has also been financially supported by its users on Patreon and through individual donations. **THANK YOU to all past and present supporters for helping to keep this project alive and thriving!** @@ -224,16 +205,14 @@ Credits Developed by [Omar Cornut](https://www.miracleworld.net) and every direct or indirect [contributors](https://github.com/ocornut/imgui/graphs/contributors) to the GitHub. The early version of this library was developed with the support of [Media Molecule](https://www.mediamolecule.com) and first used internally on the game [Tearaway](https://tearaway.mediamolecule.com) (PS Vita). -Recurring contributors (2020): Omar Cornut [@ocornut](https://github.com/ocornut), Rokas Kupstys [@rokups](https://github.com/rokups), Ben Carter [@ShironekoBen](https://github.com/ShironekoBen). -A large portion of work on automation systems, regression tests and other features are currently unpublished. +Recurring contributors include Rokas Kupstys [@rokups](https://github.com/rokups) (2020-2022): a good portion of work on automation system and regression tests now available in [Dear ImGui Test Engine](https://github.com/ocornut/imgui_test_engine). -Sponsoring, support contracts and other B2B transactions are hosted and handled by [Lizardcube](https://www.lizardcube.com). +Maintenance/support contracts, sponsoring invoices and other B2B transactions are hosted and handled by [Disco Hello](https://www.discohello.com). Omar: "I first discovered the IMGUI paradigm at [Q-Games](https://www.q-games.com) where Atman Binstock had dropped his own simple implementation in the codebase, which I spent quite some time improving and thinking about. It turned out that Atman was exposed to the concept directly by working with Casey. When I moved to Media Molecule I rewrote a new library trying to overcome the flaws and limitations of the first one I've worked with. It became this library and since then I have spent an unreasonable amount of time iterating and improving it." -Embeds [ProggyClean.ttf](http://upperbounds.net) font by Tristan Grimmer (MIT license). - -Embeds [stb_textedit.h, stb_truetype.h, stb_rect_pack.h](https://github.com/nothings/stb/) by Sean Barrett (public domain). +Embeds [ProggyClean.ttf](https://www.proggyfonts.net) font by Tristan Grimmer (MIT license). +
    Embeds [stb_textedit.h, stb_truetype.h, stb_rect_pack.h](https://github.com/nothings/stb/) by Sean Barrett (public domain). Inspiration, feedback, and testing for early versions: Casey Muratori, Atman Binstock, Mikko Mononen, Emmanuel Briney, Stefan Kamoda, Anton Mikhailov, Matt Willis. Also thank you to everyone posting feedback, questions and patches on GitHub. diff --git a/third_party/imgui/docs/TODO.txt b/third_party/imgui/docs/TODO.txt index 9d005ed4e60..eecce6b42cb 100644 --- a/third_party/imgui/docs/TODO.txt +++ b/third_party/imgui/docs/TODO.txt @@ -1,111 +1,94 @@ dear imgui ISSUES & TODO LIST -Issue numbers (#) refer to github issues listed at https://github.com/ocornut/imgui/issues/XXXX +Issue numbers (#) refer to GitHub issues listed at https://github.com/ocornut/imgui/issues/XXXX +THIS LIST IS NOT WELL MAINTAINED. MOST OF THE WORK HAPPENS ON GITHUB NOWADAYS. The list below consist mostly of ideas noted down before they are requested/discussed by users (at which point they usually exist on the github issue tracker). It's mostly a bunch of personal notes, probably incomplete. Feel free to query if you have any questions. - - doc/test: add a proper documentation+regression testing system (#435) - - doc/test: checklist app to verify backends/integration of imgui (test inputs, rendering, callback, etc.). + - doc: add a proper documentation system (maybe relying on automation? #435) + - doc: checklist app to verify backends/integration of imgui (test inputs, rendering, callback, etc.). - doc/tips: tips of the day: website? applet in imgui_club? - doc/wiki: work on the wiki https://github.com/ocornut/imgui/wiki - - window: preserve/restore relative focus ordering (persistent or not) (#2304) -> also see docking reference to same #. + - window: preserve/restore relative focus ordering (persistent or not), and e.g. of multiple reappearing windows (#2304) -> also see docking reference to same #. - window: calling SetNextWindowSize() every frame with <= 0 doesn't do anything, may be useful to allow (particularly when used for a single axis). (#690) - window: add a way for very transient windows (non-saved, temporary overlay over hundreds of objects) to "clean" up from the global window list. perhaps a lightweight explicit cleanup pass. - window: auto-fit feedback loop when user relies on any dynamic layout (window width multiplier, column) appears weird to end-user. clarify. - window: begin with *p_open == false could return false. - window: get size/pos helpers given names (see discussion in #249) - - window: a collapsed window can be stuck behind the main menu bar? - window: when window is very small, prioritize resize button over close button. - - window: detect extra End() call that pop the "Debug" window out and assert at End() call site instead of at end of frame. - - window: increase minimum size of a window with menus or fix the menu rendering so that it doesn't look odd. - - window: double-clicking on title bar to minimize isn't consistent, perhaps move to single-click on left-most collapse icon? + - window: double-clicking on title bar to minimize isn't consistent interaction, perhaps move to single-click on left-most collapse icon? - window: expose contents size. (#1045) - window: using SetWindowPos() inside Begin() and moving the window with the mouse reacts a very ugly glitch. We should just defer the SetWindowPos() call. - window: GetWindowSize() returns (0,0) when not calculated? (#1045) - window: investigate better auto-positioning for new windows. - - window: top most window flag? (#2574) + - window: top most window flag? more z-order contrl? (#2574) - window/size: manually triggered auto-fit (double-click on grip) shouldn't resize window down to viewport size? - window/size: how to allow to e.g. auto-size vertically to fit contents, but be horizontally resizable? Assuming SetNextWindowSize() is modified to treat -1.0f on each axis as "keep as-is" (would be good but might break erroneous code): Problem is UpdateWindowManualResize() and lots of code treat (window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0) together. - window/opt: freeze window flag: if not focused/hovered, return false, render with previous ImDrawList. and/or reduce refresh rate. -> this may require enforcing that it is illegal to submit contents if Begin returns false. - window/child: background options for child windows, border option (disable rounding). - window/child: allow resizing of child windows (possibly given min/max for each axis?.) - - window/child: the first draw command of a child window could be moved into the current draw command of the parent window (unless child+tooltip?). - - window/child: border could be emitted in parent as well. - window/child: allow SetNextWindowContentSize() to work on child windows. - window/clipping: some form of clipping when DisplaySize (or corresponding viewport) is zero. - - window/tabbing: add a way to signify that a window or docked window requires attention (e.g. blinking title bar). - - window/id_stack: add e.g. window->GetIDFromPath() with support for leading / and ../ (#1390, #331) + - window/tabbing: add a way to signify that a window or docked window requires attention (e.g. blinking title bar, trying to click behind a modal). + - window/id_stack: add e.g. window->GetIDFromPath() with support for leading / and ../ (#1390, #331) -> model from test engine. ! scrolling: exposing horizontal scrolling with Shift+Wheel even when scrollbar is disabled expose lots of issues (#2424, #1463) - scrolling: while holding down a scrollbar, try to keep the same contents visible (at least while not moving mouse) - scrolling: allow immediately effective change of scroll after Begin() if we haven't appended items yet. - scrolling: forward mouse wheel scrolling to parent window when at the edge of scrolling limits? (useful for listbox,tables?) - - scrolling/clipping: separator on the initial position of a window is not visible (cursorpos.y <= clippos.y). (2017-08-20: can't repro) - scrolling/style: shadows on scrollable areas to denote that there is more contents (see e.g. DaVinci Resolve ui) - - drawdata: make it easy to clone (or swap?) a full ImDrawData so user can easily save that data if they use threaded rendering. (e.g. #2646) - ! drawlist: add calctextsize func to facilitate consistent code from user pov (currently need to use ImGui or ImFont alternatives!) - - drawlist: end-user probably can't call Clear() directly because we expect a texture to be pushed in the stack. - - drawlist: maintaining bounding box per command would allow to merge draw command when clipping isn't relied on (typical non-scrolling window or non-overflowing column would merge with previous command). - - drawlist: primitives/helpers to manipulate vertices post submission, so e.g. a quad/rect can be resized to fit later submitted content, _without_ using the ChannelSplit api + - drawdata: make it easy to deep-copy (or swap?) a full ImDrawData so user can easily save that data if they use threaded rendering. (#1860 see ImDrawDataSnapshot) + ! drawlist: add CalcTextSize() func to facilitate consistent code from user pov (currently need to use ImGui or ImFont alternatives!) + - drawlist: maintaining bounding box per command would allow to merge draw command when clipping isn't relied on (typical non-scrolling window or non-overflowing column would merge with previous command). (WIP branch) - drawlist: make it easier to toggle AA per primitive, so we can use e.g. non-AA fill + AA borders more naturally - drawlist: non-AA strokes have gaps between points (#593, #288), glitch especially on RenderCheckmark() and ColorPicker4(). - - drawlist: would be good to be able to deep copy of ImDrawData (we have a deep copy of ImDrawList now). - - drawlist: rendering: provide a way for imgui to output to a single/global vertex buffer, re-order indices only at the end of the frame (ref: https://gist.github.com/floooh/10388a0afbe08fce9e617d8aefa7d302) - drawlist: callback: add an extra void* in ImDrawCallback to allow passing render-local data to the callback (would break API). - drawlist: AddRect vs AddLine position confusing (#2441) - - drawlist: channel splitter should be external helper and not stored in ImDrawList. - - drawlist: Add quadratic bezier curves? (#3127) - drawlist/opt: store rounded corners in texture to use 1 quad per corner (filled and wireframe) to lower the cost of rounding. (#1962) - drawlist/opt: AddRect() axis aligned pixel aligned (no-aa) could use 8 triangles instead of 16 and no normal calculation. - drawlist/opt: thick AA line could be doable in same number of triangles as 1.0 AA line by storing gradient+full color in atlas. - - main: find a way to preserve relative orders of multiple reappearing windows (so an app toggling between "modes" e.g. fullscreen vs all tools) won't lose relative ordering. - - main: IsItemHovered() make it more consistent for various type of widgets, widgets with multiple components, etc. also effectively IsHovered() region sometimes differs from hot region, e.g tree nodes - - main: IsItemHovered() info stored in a stack? so that 'if TreeNode() { Text; TreePop; } if IsHovered' return the hover state of the TreeNode? + - items: IsItemHovered() info stored in a stack? so that 'if TreeNode() { Text; TreePop; } if IsHovered' return the hover state of the TreeNode? - widgets: display mode: widget-label, label-widget (aligned on column or using fixed size), label-newline-tab-widget etc. (#395) - widgets: clean up widgets internal toward exposing everything and stabilizing imgui_internals.h. - - widgets: add visuals for Disabled/ReadOnly mode and expose publicly (#211) - widgets: add always-allow-overlap mode. This should perhaps be the default? one problem is that highlight after mouse-wheel scrolling gets deferred, makes scrolling more flickery. - widgets: start exposing PushItemFlag() and ImGuiItemFlags - widgets: alignment options in style (e.g. center Selectable, Right-Align within Button, etc.) #1260 - widgets: activate by identifier (trigger button, focus given id) - - widgets: a way to represent "mixed" values, so e.g. all values replaced with *, including check-boxes, colors, etc. with support for multi-components widgets (e.g. SliderFloat3, make only "Y" mixed) (#2644) - - widgets: checkbox: checkbox with custom glyph inside frame. + - widgets: custom glyph/shapes replacements for stock sapes. (also #6090 #2431 #2235 #6517) - widgets: coloredit: keep reporting as active when picker is on? - widgets: group/scalarn functions: expose more per-component information. e.g. store NextItemData.ComponentIdx set by scalarn function, groups can expose them back somehow. - selectable: using (size.x == 0.0f) and (SelectableTextAlign.x > 0.0f) followed by SameLine() is currently not supported. - - selectable: generic BeginSelectable()/EndSelectable() mechanism. + - selectable: generic BeginSelectable()/EndSelectable() mechanism. (work out alongside range-select branch) - selectable: a way to visualize partial/mixed selection (e.g. parent tree node has children with mixed selection) - - input text: clean up the mess caused by converting UTF-8 <> wchar. the code is rather inefficient right now and super fragile. + - input text: clean up the mess caused by converting UTF-8 <> wchar. the code is rather inefficient right now and super fragile. (WIP branch) - input text: preserve scrolling when unfocused? - input text: reorganize event handling, allow CharFilter to modify buffers, allow multiple events? (#541) - input text: expose CursorPos in char filter event (#816) - input text: try usage idiom of using InputText with data only exposed through get/set accessors, without extraneous copy/alloc. (#3009) - - input text: access public fields via a non-callback API e.g. InputTextGetState("xxx") that may return NULL if not active. + - input text: access public fields via a non-callback API e.g. InputTextGetState("xxx") that may return nullptr if not active (available in internals) - input text: flag to disable live update of the user buffer (also applies to float/int text input) (#701) - input text: hover tooltip could show unclamped text - input text: support for INSERT key to toggle overwrite mode. currently disabled because stb_textedit behavior is unsatisfactory on multi-line. (#2863) - input text: option to Tab after an Enter validation. - input text: add ImGuiInputTextFlags_EnterToApply? (off #218) - input text: easier ways to update buffer (from source char*) while owned. preserve some sort of cursor position for multi-line text. - - input text: add flag (e.g. ImGuiInputTextFlags_EscapeClearsBuffer) to clear instead of revert. what to do with focus? (also see #2890) - input text: add discard flag (e.g. ImGuiInputTextFlags_DiscardActiveBuffer) or make it easier to clear active focus for text replacement during edition (#725) - input text: display bug when clicking a drag/slider after an input text in a different window has all-selected text (order dependent). actually a very old bug but no one appears to have noticed it. - input text: allow centering/positioning text so that ctrl+clicking Drag or Slider keeps the textual value at the same pixel position. - - input text: decorrelate layout from inputs - e.g. what's the easiest way to implement a nice IP/Mac address input editor? + - input text: decorrelate display layout from inputs with custom template - e.g. what's the easiest way to implement a nice IP/Mac address input editor? - input text: global callback system so user can plug in an expression evaluator easily. (#1691) - input text: force scroll to end or scroll to a given line/contents (so user can implement a log or a search feature) - input text: a way to preview completion (e.g. disabled text completing from the cursor) - input text: a side bar that could e.g. preview where errors are. probably left to the user to draw but we'd need to give them the info there. - input text: a way for the user to provide syntax coloring. - input text: Shift+TAB with ImGuiInputTextFlags_AllowTabInput could eat preceding blanks, up to tab_count. - - input text: facilitate patterns like if (InputText(..., obj.get_string_ref()) { obj.set_string(...); } relying on internally held buffer. - input text multi-line: don't directly call AddText() which does an unnecessary vertex reserve for character count prior to clipping. and/or more line-based clipping to AddText(). and/or reorganize TextUnformatted/RenderText for more efficiency for large text (e.g TextUnformatted could clip and log separately, etc). - - input text multi-line: support for cut/paste without selection (cut/paste the current line) + - input text multi-line: support for copy/cut without selection (copy/cut current line?) - input text multi-line: line numbers? status bar? (follow up on #200) - input text multi-line: behave better when user changes input buffer while editing is active (even though it is illegal behavior). namely, the change of buffer can create a scrollbar glitch (#725) - input text multi-line: better horizontal scrolling support (#383, #1224) @@ -113,7 +96,6 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i - input number: optional range min/max for Input*() functions - input number: holding [-]/[+] buttons could increase the step speed non-linearly (or user-controlled) - input number: use mouse wheel to step up/down - - input number: applying arithmetics ops (+,-,*,/) messes up with text edit undo stack. - layout: helper or a way to express ImGui::SameLine(ImGui::GetCursorStartPos().x + ImGui::CalcItemWidth() + ImGui::GetStyle().ItemInnerSpacing.x); in a simpler manner. - layout, font: horizontal tab support, A) text mode: forward only tabs (e.g. every 4 characters/N pixels from pos x1), B) manual mode: explicit tab stops acting as mini columns, no clipping (for menu items, many kind of uses, also vaguely relate to #267, #395) @@ -126,21 +108,17 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i - layout: (R&D) local multi-pass layout mode. - layout: (R&D) bind authored layout data (created by an off-line tool), items fetch their pos/size at submission, self-optimize data structures to stable linear access. + - tables: see https://github.com/ocornut/imgui/issues/2957#issuecomment-569726095 + - group: BeginGroup() needs a border option. (~#1496) - - group: IsHovered() after EndGroup() covers whole aabb rather than the intersection of individual items. Is that desirable? + - group: IsItemHovered() after EndGroup() covers whole AABB rather than the intersection of individual items. Is that desirable? - group: merge deactivation/activation within same group (fwd WasEdited flag). (#2550) !- color: the color conversion helpers/types are a mess and needs sorting out. - color: (api breaking) ImGui::ColorConvertXXX functions should be loose ImColorConvertXX to match imgui_internals.h - - plot: full featured plot/graph api w/ scrolling, zooming etc. all bell & whistle. why not! - - plot: PlotLines() should use the polygon-stroke facilities, less vertices (currently issues with averaging normals) - - plot: make it easier for user to draw extra stuff into the graph (e.g: draw basis, highlight certain points, 2d plots, multiple plots) - - plot: "smooth" automatic scale over time, user give an input 0.0(full user scale) 1.0(full derived from value) - - plot: option/feature: draw the zero line - - plot: option/feature: draw grid, vertical markers - - plot: option/feature: draw unit - - plot: add a helper e.g. Plot(char* label, float value, float time_span=2.0f) that stores values and Plot them for you - probably another function name. and/or automatically allow to plot ANY displayed value (more reliance on stable ID) + - plot: full featured plot/graph api w/ scrolling, zooming etc. --> promote using ImPlot + - (plot: deleted all other todo lines on 2023-06-28) - clipper: ability to disable the clipping through a simple flag/bool. - clipper: ability to run without knowing full count in advance. @@ -148,28 +126,19 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i - separator: expose flags (#759) - separator: take indent into consideration (optional) - - separator: width, thickness, centering (#1643) + - separator: width, thickness, centering (#1643, #2657) - splitter: formalize the splitter idiom into an official api (we want to handle n-way split) (#319) - - dock: merge docking branch (#2109) - - dock: dock out from a collapsing header? would work nicely but need emitting window to keep submitting the code. + - docking: merge docking branch (#2109) - - tabs: "there is currently a problem because TabItem() will try to submit their own tooltip after 0.50 second, and this will have the effect of making your tooltip flicker once." -> tooltip priority work - - tabs: close button tends to overlap unsaved-document star - - tabs: consider showing the star at the same spot as the close button, like VS Code does. + - tabs: "there is currently a problem because TabItem() will try to submit their own tooltip after 0.50 second, and this will have the effect of making your tooltip flicker once." -> tooltip priority work (WIP branch) - tabs: make EndTabBar fail if users doesn't respect BeginTabBar return value, for consistency/future-proofing. - tabs: persistent order/focus in BeginTabBar() api (#261, #351) - - tabs: TabItem could honor SetNextItemWidth()? - tabs: explicit api (even if internal) to cleanly manipulate tab order. - - tabs: Mouse wheel over tab bar could scroll? (#2702) - image/image button: misalignment on padded/bordered button? - image/image button: parameters are confusing, image() has tint_col,border_col whereas imagebutton() has bg_col/tint_col. Even thou they are different parameters ordering could be more consistent. can we fix that? - - image button: not taking an explicit id can be problematic. (#2464, #1390) - - button: provide a button that looks framed. (?) - - slider/drag: ctrl+click when format doesn't include a % character.. disable? display underlying value in default format? (see TempInputTextScalar) - slider: allow using the [-]/[+] buttons used by InputFloat()/InputInt() - - slider: initial absolute click is imprecise. change to relative movement slider (same as scrollbar). (#1946) - slider: add dragging-based widgets to edit values with mouse (on 2 axises), saving screen real-estate. - slider: tint background based on value (e.g. v_min -> v_max, or use 0.0f either side of the sign) - slider: relative dragging? + precision dragging @@ -181,16 +150,12 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i - drag float: power != 0.0f with current value being outside the range keeps the value stuck. - drag float: added leeway on edge (e.g. a few invisible steps past the clamp limits) - - combo: use clipper: make it easier to disable clipper with a single flag. - - combo: flag for BeginCombo to not return true when unchanged (#1182) - - combo: a way/helper to customize the combo preview (#1658) -> exeperimental BeginComboPreview() + - combo: a way/helper to customize the combo preview (#1658) -> experimental BeginComboPreview() - combo/listbox: keyboard control. need InputText-like non-active focus + key handling. considering keyboard for custom listbox (pr #203) - - listbox: multiple selection. + - listbox: multiple selection (WIP range-select branch) - listbox: unselect option (#1208) - - listbox: make it easier/more natural to implement range-select (need some sort of info/ref about the last clicked/focused item that user can translate to an index?) (wip stash) + - listbox: make it easier/more natural to implement range-select (need some sort of info/ref about the last clicked/focused item that user can translate to an index?) (WIP range-select branch) - listbox: user may want to initial scroll to focus on the one selected value? - - listbox: expose hovered item for a simplified ListBox api - - listbox: keyboard navigation. - listbox: disable capturing mouse wheel if the listbox has no scrolling. (#1681) - listbox: scrolling should track modified selection. - listbox: future api should allow to enable horizontal scrolling (#2510) @@ -202,23 +167,19 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i - popups: clicking outside (to close popup) and holding shouldn't drag window below. - popups: add variant using global identifier similar to Begin/End (#402) - popups: border options. richer api like BeginChild() perhaps? (#197) - - popups: flags could be reworked to allow both mouse buttons as index (0..5 and as flags using higher-bit) allowing to or them. - popups/modals: although it is sometimes convenient that popups/modals lifetime is owned by imgui, we could also a bool-owned-by-user api as long as Begin() return value testing is enforced. - tooltip: drag and drop with tooltip near monitor edges lose/changes its last direction instead of locking one. The drag and drop tooltip should always follow without changing direction. - tooltip: allow to set the width of a tooltip to allow TextWrapped() etc. while keeping the height automatic. - - tooltip: tooltips with delay timers? or general timer policy? (instantaneous vs timed): IsItemHovered() with timer + implicit aabb-id for items with no ID. (#1485) - - tooltip: drag tooltip hovering over source widget with IsItemHovered/SetTooltip flickers. + - tooltip: drag tooltip hovering over source widget with IsItemHovered/SetTooltip flickers (WIP branch) + - tooltip: tooltip priorities to override a stock tooltip (e.g. shortcut tooltip) - - menus: menu bars inside modal windows are acting weird. - - status-bar: add a per-window status bar helper similar to what menu-bar does. + - status-bar: add a per-window status bar helper similar to what menu-bar does. generalize concept of layer0 rect in window (can make _MenuBar window flag obsolete too). + - shortcuts: store multiple keychords in ImGuiKeyChord + - shortcuts: Hovered route (lower than Focused, higher than Global) - shortcuts: local-style shortcut api, e.g. parse "&Save" - shortcuts,menus: global-style shortcut api e.g. "Save (CTRL+S)" -> explicit flag for recursing into closed menu - - shortcuts: programmatically access shortcuts "Focus("&Save")) - - menus: hovering a disabled BeginMenu or MenuItem won't close another menu - - menus: menu-bar: main menu-bar could affect clamping of windows position (~ akin to modifying DisplayMin) - - menus: hovering from menu to menu on a menu-bar has 1 frame without any menu, which is a little annoying. ideally either 0 either longer. - - menus: could merge draw call in most cases (how about storing an optional aabb in ImDrawCmd to move the burden of merging in a single spot). + - menus: hovering from menu to menu on a menu-bar has 1 frame without any menu, which is a little annoying. ideally zero. - menus: would be nice if the Selectable() supported horizontal alignment (must be given the equivalent of WorkRect.Max.x matching the position of the shortcut column) - tree node: add treenode/treepush int variants? not there because (void*) cast from int warns on some platforms/settings? @@ -226,7 +187,6 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i - tree node / selectable render mismatch which is visible if you use them both next to each other (e.g. cf. property viewer) - tree node: tweak color scheme to distinguish headers from selected tree node (#581) - tree node: leaf/non-leaf highlight mismatch. - - tree node: flag to disable formatting and/or detect "%s" - tree node/opt: could avoid formatting when clipped (flag assuming we don't care about width/height, assume single line height? format only %s/%c to be able to count height?) - settings: write more decent code to allow saving/loading new fields: columns, selected tree nodes? @@ -253,20 +213,17 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i - log: have more control over the log scope (e.g. stop logging when leaving current tree node scope) - log: be able to log anything (e.g. right-click on a window/tree-node, shows context menu? log into tty/file/clipboard) - log: let user copy any window content to clipboard easily (CTRL+C on windows? while moving it? context menu?). code is commented because it fails with multiple Begin/End pairs. - - log: obsolete LogButtons() all together. - - log: LogButtons() options for specifying depth and/or hiding depth slider + - log: obsolete LogButtons().... (was: LogButtons() options for specifying depth and/or hiding depth slider) - - filters: set a current filter that tree node can automatically query to hide themselves + - filters: set a current filter that certains items (e.g. tree node) can automatically query to hide themselves - filters: handle wild-cards (with implicit leading/trailing *), reg-exprs - filters: fuzzy matches (may use code at blog.forrestthewoods.com/4cffeed33fdb) - - drag and drop: fix/support/options for overlapping drag sources. - drag and drop: focus drag target window on hold (even without open) - drag and drop: releasing a drop shows the "..." tooltip for one frame - since e13e598 (#1725) - drag and drop: drag source on a group object (would need e.g. an invisible button covering group in EndGroup) https://twitter.com/paniq/status/1121446364909535233 - drag and drop: have some way to know when a drag begin from BeginDragDropSource() pov. (see 2018/01/11 post in #143) - drag and drop: allow preview tooltip to be submitted from a different place than the drag source. (#1725) - - drag and drop: allow using with other mouse buttons (where activeid won't be set). (#1637) - drag and drop: make it easier and provide a demo to have tooltip both are source and target site, with a more detailed one on target site (tooltip ordering problem) - drag and drop: demo with reordering nodes (in a list, or a tree node). (#143) - drag and drop: test integrating with os drag and drop (make it easy to do a naive WM_DROPFILE integration) @@ -275,13 +232,10 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i - drag and drop: (#143) "both an in-process pointer and a promise to generate a serialized version, for whether the drag ends inside or outside the same process" - drag and drop: feedback when hovering a region blocked by modal (mouse cursor "NO"?) - - node/graph editors (#306) (also see https://github.com/ocornut/imgui/wiki#node-editors) - - pie menus patterns (#434) - - markup: simple markup language for color change? (#902) + - markup: simple markup language for color change? (#902, #3130) - text: selectable text (for copy) as a generic feature (ItemFlags?) - text: proper alignment options in imgui_internal.h - - text: it's currently impossible to have a window title with "##". perhaps an official workaround would be nice. \ style inhibitor? non-visible ascii code to insert between #? - text: provided a framed text helper, e.g. https://pastebin.com/1Laxy8bT - text: refactor TextUnformatted (or underlying function) to more explicitly request if we need width measurement or not - text/layout/tabs: \t pulling position from base pos + step, or offset array (e.g. could be used in text edit, menus for simple icon+text alignment, etc.) @@ -317,17 +271,13 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i - font: add support for kerning, probably optional. A) perhaps default to (32..128)^2 matrix ~ 9K entries = 36KB, then hash for non-ascii?. B) or sparse lookup into per-char list? - font: add a simpler CalcTextSizeA() api? current one ok but not welcome if user needs to call it directly (without going through ImGui::CalcTextSize) - font: fix AddRemapChar() to work before atlas has been built. - - font: support for unicode codepoints higher than 0xFFFF? (pr #2815) - font: (api breaking) remove "TTF" from symbol names. also because it now supports OTF. - font/opt: Considering storing standalone AdvanceX table as 16-bit fixed point integer? - - font/opt: Glyph currently 40 bytes (2+9*4). Consider storing UV as 16 bits integer? (->32 bytes). X0/Y0/X1/Y1 as 16 fixed-point integers? Or X0/Y0 as float and X1/Y1 as fixed8_8? + - font/opt: Glyph currently 40 bytes (2+9*4). Consider storing UV as 16-bits integer? (->32 bytes). X0/Y0/X1/Y1 as 16 fixed-point integers? Or X0/Y0 as float and X1/Y1 as fixed8_8? - - nav: some features such as PageUp/Down/Home/End should probably work without ImGuiConfigFlags_NavEnableKeyboard? (where do we draw the line?) - - nav: configuration flag to disable global shortcuts (currently only CTRL-Tab) ? + - nav: some features such as PageUp/Down/Home/End should probably work without ImGuiConfigFlags_NavEnableKeyboard? (where do we draw the line? how about CTRL+Tab) ! nav: never clear NavId on some setup (e.g. gamepad centric) - - nav: scroll up/down if possible when move request fails - nav: there's currently no way to completely clear focus with the keyboard. depending on patterns used by the application to dispatch inputs, it may be desirable. - - nav: code to focus child-window on restoring NavId appears to have issue: e.g. when focus change is implicit because of window closure. - nav: Home/End behavior when navigable item is not fully visible at the edge of scrolling? should be backtrack to keep item into view? - nav: NavScrollToBringItemIntoView() with item bigger than view should focus top-right? Repro: using Nav in "About Window" - nav: wrap around logic to allow e.g. grid based layout (pressing NavRight on the right-most element would go to the next row, etc.). see internal's NavMoveRequestTryWrapping(). @@ -339,22 +289,19 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i - nav: NavFlattened: ESC on a flattened child should select something. - nav: NavFlattened: broken: in typical usage scenario, the items of a fully clipped child are currently not considered to enter into a NavFlattened child. - nav: NavFlattened: cannot access menu-bar of a flattened child window with Alt/menu key (not a very common use case..). - - nav: simulate right-click or context activation? (SHIFT+F10) + - nav: simulate right-click or context activation? (SHIFT+F10, keyboard Menu key?) - nav/popup: esc/enter default behavior for popups, e.g. be able to mark an "ok" or "cancel" button that would get triggered by those keys, default validation button, etc. - nav/treenode: left within a tree node block as a fallback (ImGuiTreeNodeFlags_NavLeftJumpsBackHere by default?) - nav/menus: pressing left-right on a vertically clipped menu bar tends to jump to the collapse/close buttons. - nav/menus: allow pressing Menu to leave a sub-menu. - nav/menus: a way to access the main menu bar with Alt? (currently needs CTRL+TAB) or last focused window menu bar? - nav/menus: when using the main menu bar, even though we restore focus after, the underlying window loses its title bar highlight during menu manipulation. could we prevent it? - - nav/menus: main menu bar currently cannot restore a NULL focus. Could save NavWindow at the time of being focused, similarly to what popup do? + - nav/menus: main menu bar currently cannot restore a nullptr focus. Could save NavWindow at the time of being focused, similarly to what popup do? - nav/menus: Alt,Up could open the first menu (e.g. "File") currently it tends to nav into the window/collapse menu. Do do that we would need custom transition? - - nav/windowing: configure fade-in/fade-out delay on Ctrl+Tab? - - nav/windowing: when CTRL-Tab/windowing is active, the HoveredWindow detection doesn't take account of the window display re-ordering. + - nav/windowing: when CTRL+Tab/windowing is active, the HoveredWindow detection doesn't take account of the window display re-ordering. - nav/windowing: Resizing window will currently fail with certain types of resizing constraints/callback applied - focus: preserve ActiveId/focus stack state, e.g. when opening a menu and close it, previously selected InputText() focus gets restored (#622) - - inputs: we need an explicit flag about whether the imgui window is focused, to be able to distinguish focused key releases vs alt-tabbing all release behaviors. - - inputs: rework IO system to be able to pass actual ordered/timestamped events. use an event queue? (~#335, #71) - inputs: support track pad style scrolling & slider edit. - inputs/io: backspace and arrows in the context of a text input could use system repeat rate. - inputs/io: clarify/standardize/expose repeat rate and repeat delays (#1808) @@ -367,12 +314,8 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i - misc: make the ImGuiCond values linear (non-power-of-two). internal storage for ImGuiWindow can use integers to combine into flags (Why?) - misc: PushItemFlag(): add a flag to disable keyboard capture when used with mouse? (#1682) - misc: use more size_t in public api? - - misc: possible compile-time support for string view/range instead of char* would e.g. facilitate usage with Rust (#683) - - misc: possible compile-time support for wchar_t instead of char*? - - - remote: make a system like RemoteImGui first-class citizen/project (#75) + - misc: support for string view/range instead of char* would e.g. facilitate usage with Rust (#683, #3038, WIP string_view branch) - - demo: find a way to demonstrate textures in the examples application, as it such a common issue for new users. - demo: demonstrate using PushStyleVar() in more details. - demo: add vertical separator demo - demo: add virtual scrolling example? @@ -382,23 +325,20 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i - examples: window minimize, maximize (#583) - examples: provide a zero frame-rate/idle example. - examples: dx11/dx12: try to use new swapchain blit models (#2970) - - backends: move to backends/ folder? - backends: report it better when not able to create texture? - - backends: apple: example_apple should be using modern GL3. - backends: glfw: could go idle when minimized? if (glfwGetWindowAttrib(window, GLFW_ICONIFIED)) { glfwWaitEvents(); continue; } // issue: DeltaTime will be super high on resume, perhaps provide a way to let impl know (#440) - backends: opengl: rename imgui_impl_opengl2 to impl_opengl_legacy and imgui_impl_opengl3 to imgui_impl_opengl? (#1900) - backends: opengl: could use a single vertex buffer and glBufferSubData for uploads? - backends: opengl: explicitly disable GL_STENCIL_TEST in bindings. - backends: vulkan: viewport: support for synchronized swapping of multiple swap chains. - backends: bgfx: https://gist.github.com/RichardGale/6e2b74bc42b3005e08397236e4be0fd0 - - backends: mscriptem: with refactored examples, we could provide a direct imgui_impl_emscripten platform layer (see eg. https://github.com/floooh/sokol-samples/blob/master/html5/imgui-emsc.cc#L42) + - backends: emscriptem: with refactored examples, we could provide a direct imgui_impl_emscripten platform layer (see eg. https://github.com/floooh/sokol-samples/blob/master/html5/imgui-emsc.cc#L42) - - bindings: ways to use clang ast dump to generate bindings or helpers for bindings? (e.g. clang++ -Xclang -ast-dump=json imgui.h) + - bindings: ways to use clang ast dump to generate bindings or helpers for bindings? (e.g. clang++ -Xclang -ast-dump=json imgui.h) (--> use https://github.com/dearimgui/dear_bindings) - - optimization: replace vsnprintf with stb_printf? using IMGUI_USE_STB_SPRINTF.(#1038) + - optimization: replace vsnprintf with stb_printf? using IMGUI_USE_STB_SPRINTF. (#1038 + needed for string_view) - optimization: add clipping for multi-component widgets (SliderFloatX, ColorEditX, etc.). one problem is that nav branch can't easily clip parent group when there is a move request. - optimization: add a flag to disable most of rendering, for the case where the user expect to skip it (#335) - optimization: fully covered window (covered by another with non-translucent bg + WindowRounding worth of padding) may want to clip rendering. - optimization: use another hash function than crc32, e.g. FNV1a - - optimization/render: merge command-lists with same clip-rect into one even if they aren't sequential? (as long as in-between clip rectangle don't overlap)? - optimization: turn some the various stack vectors into statically-sized arrays diff --git a/third_party/imgui/examples/example_allegro5/README.md b/third_party/imgui/examples/example_allegro5/README.md index d6d812eabd3..4af31f6f3a2 100644 --- a/third_party/imgui/examples/example_allegro5/README.md +++ b/third_party/imgui/examples/example_allegro5/README.md @@ -12,7 +12,7 @@ Note that the backend supports _BOTH_ 16-bit and 32-bit indices, but 32-bit indi ### On Ubuntu 14.04+ and macOS ```bash -g++ -DIMGUI_USER_CONFIG=\"examples/example_allegro5/imconfig_allegro5.h\" -I .. -I ../.. main.cpp ../../backends/imgui_impl_allegro5.cpp ../../imgui*.cpp -lallegro -lallegro_main -lallegro_primitives -o allegro5_example +g++ -DIMGUI_USER_CONFIG=\"examples/example_allegro5/imconfig_allegro5.h\" -I .. -I ../.. -I ../../backends main.cpp ../../backends/imgui_impl_allegro5.cpp ../../imgui*.cpp -lallegro -lallegro_main -lallegro_primitives -o allegro5_example ``` On macOS, install Allegro with homebrew: `brew install allegro`. @@ -32,5 +32,5 @@ vcpkg integrate install ; register include / libs in Visual Studio Build: ``` set ALLEGRODIR=path_to_your_allegro5_folder -cl /Zi /MD /I %ALLEGRODIR%\include /DIMGUI_USER_CONFIG=\"examples/example_allegro5/imconfig_allegro5.h\" /I .. /I ..\.. main.cpp ..\..\backends\imgui_impl_allegro5.cpp ..\..\imgui*.cpp /link /LIBPATH:%ALLEGRODIR%\lib allegro-5.0.10-monolith-md.lib user32.lib +cl /Zi /MD /utf-8 /I %ALLEGRODIR%\include /DIMGUI_USER_CONFIG=\"examples/example_allegro5/imconfig_allegro5.h\" /I .. /I ..\.. /I ..\..\backends main.cpp ..\..\backends\imgui_impl_allegro5.cpp ..\..\imgui*.cpp /link /LIBPATH:%ALLEGRODIR%\lib allegro-5.0.10-monolith-md.lib user32.lib ``` diff --git a/third_party/imgui/examples/example_allegro5/example_allegro5.vcxproj b/third_party/imgui/examples/example_allegro5/example_allegro5.vcxproj index 69b0ece3081..02f6a474123 100644 --- a/third_party/imgui/examples/example_allegro5/example_allegro5.vcxproj +++ b/third_party/imgui/examples/example_allegro5/example_allegro5.vcxproj @@ -91,6 +91,7 @@ Level4 Disabled ..\..;..\..\backends;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) true @@ -105,6 +106,7 @@ Level4 Disabled ..\..;..\..\backends;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) true @@ -122,6 +124,7 @@ true ..\..;..\..\backends;%(AdditionalIncludeDirectories) false + /utf-8 %(AdditionalOptions) true @@ -142,6 +145,7 @@ true ..\..;..\..\backends;%(AdditionalIncludeDirectories) false + /utf-8 %(AdditionalOptions) true @@ -171,10 +175,11 @@ + - + \ No newline at end of file diff --git a/third_party/imgui/examples/example_allegro5/example_allegro5.vcxproj.filters b/third_party/imgui/examples/example_allegro5/example_allegro5.vcxproj.filters index 7fea78b3ca6..84881d37158 100644 --- a/third_party/imgui/examples/example_allegro5/example_allegro5.vcxproj.filters +++ b/third_party/imgui/examples/example_allegro5/example_allegro5.vcxproj.filters @@ -52,7 +52,10 @@ - sources + imgui + + + imgui - + \ No newline at end of file diff --git a/third_party/imgui/examples/example_allegro5/main.cpp b/third_party/imgui/examples/example_allegro5/main.cpp index 4fd379a393b..3ca061cc697 100644 --- a/third_party/imgui/examples/example_allegro5/main.cpp +++ b/third_party/imgui/examples/example_allegro5/main.cpp @@ -1,6 +1,10 @@ // Dear ImGui: standalone example application for Allegro 5 -// 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 // On Windows, you can install Allegro5 using vcpkg: // git clone https://github.com/Microsoft/vcpkg @@ -35,11 +39,11 @@ int main(int, char**) IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls // Setup Dear ImGui style ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); + //ImGui::StyleColorsLight(); // Setup Platform/Renderer backends ImGui_ImplAllegro5_Init(display); @@ -47,17 +51,18 @@ int main(int, char**) // Load Fonts // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. // - Read 'docs/FONTS.md' for more instructions and details. // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); bool show_demo_window = true; bool show_another_window = false; @@ -69,8 +74,8 @@ int main(int, char**) { // Poll and handle events (inputs, window resize, etc.) // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. - // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. - // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. ALLEGRO_EVENT ev; while (al_get_next_event(queue, &ev)) @@ -94,7 +99,7 @@ int main(int, char**) if (show_demo_window) ImGui::ShowDemoWindow(&show_demo_window); - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. { static float f = 0.0f; static int counter = 0; @@ -113,7 +118,7 @@ int main(int, char**) ImGui::SameLine(); ImGui::Text("counter = %d", counter); - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); ImGui::End(); } diff --git a/third_party/imgui/examples/example_android_opengl3/android/app/build.gradle b/third_party/imgui/examples/example_android_opengl3/android/app/build.gradle index aa7f0eadd69..53181baa215 100644 --- a/third_party/imgui/examples/example_android_opengl3/android/app/build.gradle +++ b/third_party/imgui/examples/example_android_opengl3/android/app/build.gradle @@ -2,13 +2,15 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' android { - compileSdkVersion 29 - buildToolsVersion "30.0.3" - ndkVersion "21.4.7075529" + compileSdkVersion 33 + buildToolsVersion "33.0.2" + ndkVersion "25.2.9519653" + defaultConfig { applicationId "imgui.example.android" - minSdkVersion 23 - targetSdkVersion 29 + namespace "imgui.example.android" + minSdkVersion 24 + targetSdkVersion 33 versionCode 1 versionName "1.0" } @@ -20,9 +22,19 @@ android { } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget="11" + } + externalNativeBuild { cmake { path "../../CMakeLists.txt" + version '3.22.1' } } } diff --git a/third_party/imgui/examples/example_android_opengl3/android/app/src/main/AndroidManifest.xml b/third_party/imgui/examples/example_android_opengl3/android/app/src/main/AndroidManifest.xml index c4009e5291f..a87b95b4f8f 100644 --- a/third_party/imgui/examples/example_android_opengl3/android/app/src/main/AndroidManifest.xml +++ b/third_party/imgui/examples/example_android_opengl3/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + + android:configChanges="orientation|keyboardHidden|screenSize" + android:exported="false"> diff --git a/third_party/imgui/examples/example_android_opengl3/android/build.gradle b/third_party/imgui/examples/example_android_opengl3/android/build.gradle index 59f9c78e4dc..ccd218524cb 100644 --- a/third_party/imgui/examples/example_android_opengl3/android/build.gradle +++ b/third_party/imgui/examples/example_android_opengl3/android/build.gradle @@ -1,12 +1,12 @@ buildscript { - ext.kotlin_version = '1.4.31' + ext.kotlin_version = '1.8.0' repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.0' + classpath 'com.android.tools.build:gradle:7.4.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } diff --git a/third_party/imgui/examples/example_android_opengl3/main.cpp b/third_party/imgui/examples/example_android_opengl3/main.cpp index 5ab6903489b..e0ad5f9360c 100644 --- a/third_party/imgui/examples/example_android_opengl3/main.cpp +++ b/third_party/imgui/examples/example_android_opengl3/main.cpp @@ -1,5 +1,10 @@ // dear imgui: standalone example application for Android + OpenGL ES 3 -// If you are new to dear imgui, see examples/README.txt and documentation at the top of imgui.cpp. + +// 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 #include "imgui.h" #include "imgui_impl_android.h" @@ -9,21 +14,84 @@ #include #include #include +#include // Data static EGLDisplay g_EglDisplay = EGL_NO_DISPLAY; static EGLSurface g_EglSurface = EGL_NO_SURFACE; static EGLContext g_EglContext = EGL_NO_CONTEXT; -static struct android_app* g_App = NULL; +static struct android_app* g_App = nullptr; static bool g_Initialized = false; static char g_LogTag[] = "ImGuiExample"; +static std::string g_IniFilename = ""; // Forward declarations of helper functions +static void Init(struct android_app* app); +static void Shutdown(); +static void MainLoopStep(); static int ShowSoftKeyboardInput(); static int PollUnicodeChars(); static int GetAssetData(const char* filename, void** out_data); -void init(struct android_app* app) +// Main code +static void handleAppCmd(struct android_app* app, int32_t appCmd) +{ + switch (appCmd) + { + case APP_CMD_SAVE_STATE: + break; + case APP_CMD_INIT_WINDOW: + Init(app); + break; + case APP_CMD_TERM_WINDOW: + Shutdown(); + break; + case APP_CMD_GAINED_FOCUS: + case APP_CMD_LOST_FOCUS: + break; + } +} + +static int32_t handleInputEvent(struct android_app* app, AInputEvent* inputEvent) +{ + return ImGui_ImplAndroid_HandleInputEvent(inputEvent); +} + +void android_main(struct android_app* app) +{ + app->onAppCmd = handleAppCmd; + app->onInputEvent = handleInputEvent; + + while (true) + { + int out_events; + struct android_poll_source* out_data; + + // Poll all events. If the app is not visible, this loop blocks until g_Initialized == true. + while (ALooper_pollAll(g_Initialized ? 0 : -1, nullptr, &out_events, (void**)&out_data) >= 0) + { + // Process one event + if (out_data != nullptr) + out_data->process(app, out_data); + + // Exit the app by returning from within the infinite loop + if (app->destroyRequested != 0) + { + // shutdown() should have been called already while processing the + // app command APP_CMD_TERM_WINDOW. But we play save here + if (!g_Initialized) + Shutdown(); + + return; + } + } + + // Initiate a new frame + MainLoopStep(); + } +} + +void Init(struct android_app* app) { if (g_Initialized) return; @@ -61,7 +129,7 @@ void init(struct android_app* app) if (g_EglContext == EGL_NO_CONTEXT) __android_log_print(ANDROID_LOG_ERROR, g_LogTag, "%s", "eglCreateContext() returned EGL_NO_CONTEXT"); - g_EglSurface = eglCreateWindowSurface(g_EglDisplay, egl_config, g_App->window, NULL); + g_EglSurface = eglCreateWindowSurface(g_EglDisplay, egl_config, g_App->window, nullptr); eglMakeCurrent(g_EglDisplay, g_EglSurface, g_EglSurface, g_EglContext); } @@ -70,13 +138,14 @@ void init(struct android_app* app) ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); - // Disable loading/saving of .ini file from disk. - // FIXME: Consider using LoadIniSettingsFromMemory() / SaveIniSettingsToMemory() to save in appropriate location for Android. - io.IniFilename = NULL; + // Redirect loading/saving of .ini file to our location. + // Make sure 'g_IniFilename' persists while we use Dear ImGui. + g_IniFilename = std::string(app->activity->internalDataPath) + "/imgui.ini"; + io.IniFilename = g_IniFilename.c_str();; // Setup Dear ImGui style ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); + //ImGui::StyleColorsLight(); // Setup Platform/Renderer backends ImGui_ImplAndroid_Init(g_App->window); @@ -84,7 +153,7 @@ void init(struct android_app* app) // Load Fonts // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. // - Read 'docs/FONTS.md' for more instructions and details. // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! @@ -92,28 +161,28 @@ void init(struct android_app* app) // We load the default font with increased size to improve readability on many devices with "high" DPI. // FIXME: Put some effort into DPI awareness. - // Important: when calling AddFontFromMemoryTTF(), ownership of font_data is transfered by Dear ImGui by default (deleted is handled by Dear ImGui), unless we set FontDataOwnedByAtlas=false in ImFontConfig + // Important: when calling AddFontFromMemoryTTF(), ownership of font_data is transferred by Dear ImGui by default (deleted is handled by Dear ImGui), unless we set FontDataOwnedByAtlas=false in ImFontConfig ImFontConfig font_cfg; font_cfg.SizePixels = 22.0f; io.Fonts->AddFontDefault(&font_cfg); //void* font_data; //int font_data_size; //ImFont* font; + //font_data_size = GetAssetData("segoeui.ttf", &font_data); + //font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 16.0f); + //IM_ASSERT(font != nullptr); + //font_data_size = GetAssetData("DroidSans.ttf", &font_data); + //font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 16.0f); + //IM_ASSERT(font != nullptr); //font_data_size = GetAssetData("Roboto-Medium.ttf", &font_data); //font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 16.0f); - //IM_ASSERT(font != NULL); + //IM_ASSERT(font != nullptr); //font_data_size = GetAssetData("Cousine-Regular.ttf", &font_data); //font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 15.0f); - //IM_ASSERT(font != NULL); - //font_data_size = GetAssetData("DroidSans.ttf", &font_data); - //font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 16.0f); - //IM_ASSERT(font != NULL); - //font_data_size = GetAssetData("ProggyTiny.ttf", &font_data); - //font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 10.0f); - //IM_ASSERT(font != NULL); + //IM_ASSERT(font != nullptr); //font_data_size = GetAssetData("ArialUni.ttf", &font_data); - //font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); + //font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); // Arbitrary scale-up // FIXME: Put some effort into DPI awareness @@ -122,13 +191,14 @@ void init(struct android_app* app) g_Initialized = true; } -void tick() +void MainLoopStep() { ImGuiIO& io = ImGui::GetIO(); if (g_EglDisplay == EGL_NO_DISPLAY) return; // Our state + // (we use static, which essentially makes the variable globals, as a convenience to keep the example code easy to follow) static bool show_demo_window = true; static bool show_another_window = false; static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); @@ -152,7 +222,7 @@ void tick() if (show_demo_window) ImGui::ShowDemoWindow(&show_demo_window); - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. { static float f = 0.0f; static int counter = 0; @@ -171,7 +241,7 @@ void tick() ImGui::SameLine(); ImGui::Text("counter = %d", counter); - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); ImGui::End(); } @@ -194,7 +264,7 @@ void tick() eglSwapBuffers(g_EglDisplay, g_EglSurface); } -void shutdown() +void Shutdown() { if (!g_Initialized) return; @@ -225,85 +295,29 @@ void shutdown() g_Initialized = false; } -static void handleAppCmd(struct android_app* app, int32_t appCmd) -{ - switch (appCmd) - { - case APP_CMD_SAVE_STATE: - break; - case APP_CMD_INIT_WINDOW: - init(app); - break; - case APP_CMD_TERM_WINDOW: - shutdown(); - break; - case APP_CMD_GAINED_FOCUS: - break; - case APP_CMD_LOST_FOCUS: - break; - } -} - -static int32_t handleInputEvent(struct android_app* app, AInputEvent* inputEvent) -{ - return ImGui_ImplAndroid_HandleInputEvent(inputEvent); -} - -void android_main(struct android_app* app) -{ - app->onAppCmd = handleAppCmd; - app->onInputEvent = handleInputEvent; - - while (true) - { - int out_events; - struct android_poll_source* out_data; - - // Poll all events. If the app is not visible, this loop blocks until g_Initialized == true. - while (ALooper_pollAll(g_Initialized ? 0 : -1, NULL, &out_events, (void**)&out_data) >= 0) - { - // Process one event - if (out_data != NULL) - out_data->process(app, out_data); - - // Exit the app by returning from within the infinite loop - if (app->destroyRequested != 0) - { - // shutdown() should have been called already while processing the - // app command APP_CMD_TERM_WINDOW. But we play save here - if (!g_Initialized) - shutdown(); - - return; - } - } - - // Initiate a new frame - tick(); - } -} +// Helper functions // Unfortunately, there is no way to show the on-screen input from native code. // Therefore, we call ShowSoftKeyboardInput() of the main activity implemented in MainActivity.kt via JNI. static int ShowSoftKeyboardInput() { JavaVM* java_vm = g_App->activity->vm; - JNIEnv* java_env = NULL; + JNIEnv* java_env = nullptr; jint jni_return = java_vm->GetEnv((void**)&java_env, JNI_VERSION_1_6); if (jni_return == JNI_ERR) return -1; - jni_return = java_vm->AttachCurrentThread(&java_env, NULL); + jni_return = java_vm->AttachCurrentThread(&java_env, nullptr); if (jni_return != JNI_OK) return -2; jclass native_activity_clazz = java_env->GetObjectClass(g_App->activity->clazz); - if (native_activity_clazz == NULL) + if (native_activity_clazz == nullptr) return -3; jmethodID method_id = java_env->GetMethodID(native_activity_clazz, "showSoftInput", "()V"); - if (method_id == NULL) + if (method_id == nullptr) return -4; java_env->CallVoidMethod(g_App->activity->clazz, method_id); @@ -321,22 +335,22 @@ static int ShowSoftKeyboardInput() static int PollUnicodeChars() { JavaVM* java_vm = g_App->activity->vm; - JNIEnv* java_env = NULL; + JNIEnv* java_env = nullptr; jint jni_return = java_vm->GetEnv((void**)&java_env, JNI_VERSION_1_6); if (jni_return == JNI_ERR) return -1; - jni_return = java_vm->AttachCurrentThread(&java_env, NULL); + jni_return = java_vm->AttachCurrentThread(&java_env, nullptr); if (jni_return != JNI_OK) return -2; jclass native_activity_clazz = java_env->GetObjectClass(g_App->activity->clazz); - if (native_activity_clazz == NULL) + if (native_activity_clazz == nullptr) return -3; jmethodID method_id = java_env->GetMethodID(native_activity_clazz, "pollUnicodeChar", "()I"); - if (method_id == NULL) + if (method_id == nullptr) return -4; // Send the actual characters to Dear ImGui diff --git a/third_party/imgui/examples/example_apple_metal/README.md b/third_party/imgui/examples/example_apple_metal/README.md index c13df2f1c05..48a2b570294 100644 --- a/third_party/imgui/examples/example_apple_metal/README.md +++ b/third_party/imgui/examples/example_apple_metal/README.md @@ -4,7 +4,7 @@ This example shows how to integrate Dear ImGui with Metal. It is based on the "cross-platform" game template provided with Xcode as of Xcode 9. -Consider basing your work off the example_glfw_metal/ or example_sdl_metal/ examples. They are better supported and will be portable unlike this one. +Consider basing your work off the example_glfw_metal/ or example_sdl2_metal/ examples. They are better supported and will be portable unlike this one. diff --git a/third_party/imgui/examples/example_apple_metal/main.mm b/third_party/imgui/examples/example_apple_metal/main.mm index bbe51d31f29..109ef6153c3 100644 --- a/third_party/imgui/examples/example_apple_metal/main.mm +++ b/third_party/imgui/examples/example_apple_metal/main.mm @@ -1,6 +1,10 @@ // Dear ImGui: standalone example application for OSX + Metal. -// 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 #import @@ -17,7 +21,7 @@ #include "imgui_impl_metal.h" #if TARGET_OS_OSX #include "imgui_impl_osx.h" -@interface AppViewController : NSViewController +@interface AppViewController : NSViewController @end #else @interface AppViewController : UIViewController @@ -54,12 +58,12 @@ -(instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullabl IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls // Setup Dear ImGui style ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); + //ImGui::StyleColorsLight(); // Setup Renderer backend ImGui_ImplMetal_Init(_device); @@ -67,17 +71,18 @@ -(instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullabl // Load Fonts // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. - // - Read 'docs/FONTS.txt' for more instructions and details. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); return self; } @@ -100,27 +105,8 @@ -(void)viewDidLoad self.mtkView.delegate = self; #if TARGET_OS_OSX - // Add a tracking area in order to receive mouse events whenever the mouse is within the bounds of our view - NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:NSZeroRect - options:NSTrackingMouseMoved | NSTrackingInVisibleRect | NSTrackingActiveAlways - owner:self - userInfo:nil]; - [self.view addTrackingArea:trackingArea]; - - // If we want to receive key events, we either need to be in the responder chain of the key view, - // or else we can install a local monitor. The consequence of this heavy-handed approach is that - // we receive events for all controls, not just Dear ImGui widgets. If we had native controls in our - // window, we'd want to be much more careful than just ingesting the complete event stream. - // To match the behavior of other backends, we pass every event down to the OS. - NSEventMask eventMask = NSEventMaskKeyDown | NSEventMaskKeyUp | NSEventMaskFlagsChanged; - [NSEvent addLocalMonitorForEventsMatchingMask:eventMask handler:^NSEvent * _Nullable(NSEvent *event) - { - ImGui_ImplOSX_HandleEvent(event, self.view); - return event; - }]; - ImGui_ImplOSX_Init(self.view); - + [NSApp activateIgnoringOtherApps:YES]; #endif } @@ -137,8 +123,6 @@ -(void)drawInMTKView:(MTKView*)view #endif io.DisplayFramebufferScale = ImVec2(framebufferScale, framebufferScale); - io.DeltaTime = 1 / float(view.preferredFramesPerSecond ?: 60); - id commandBuffer = [self.commandQueue commandBuffer]; MTLRenderPassDescriptor* renderPassDescriptor = view.currentRenderPassDescriptor; @@ -164,7 +148,7 @@ -(void)drawInMTKView:(MTKView*)view if (show_demo_window) ImGui::ShowDemoWindow(&show_demo_window); - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. { static float f = 0.0f; static int counter = 0; @@ -183,7 +167,7 @@ -(void)drawInMTKView:(MTKView*)view ImGui::SameLine(); ImGui::Text("counter = %d", counter); - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); ImGui::End(); } @@ -223,21 +207,18 @@ -(void)mtkView:(MTKView*)view drawableSizeWillChange:(CGSize)size #if TARGET_OS_OSX -// Forward Mouse/Keyboard events to Dear ImGui OSX backend. -// Other events are registered via addLocalMonitorForEventsMatchingMask() --(void)mouseDown:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); } --(void)rightMouseDown:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); } --(void)otherMouseDown:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); } --(void)mouseUp:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); } --(void)rightMouseUp:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); } --(void)otherMouseUp:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); } --(void)mouseMoved:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); } --(void)mouseDragged:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); } --(void)rightMouseMoved:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); } --(void)rightMouseDragged:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); } --(void)otherMouseMoved:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); } --(void)otherMouseDragged:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); } --(void)scrollWheel:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self.view); } +- (void)viewWillAppear +{ + [super viewWillAppear]; + self.view.window.delegate = self; +} + +- (void)windowWillClose:(NSNotification *)notification +{ + ImGui_ImplMetal_Shutdown(); + ImGui_ImplOSX_Shutdown(); + ImGui::DestroyContext(); +} #else @@ -251,7 +232,8 @@ -(void)updateIOWithTouchEvent:(UIEvent *)event UITouch *anyTouch = event.allTouches.anyObject; CGPoint touchLocation = [anyTouch locationInView:self.view]; ImGuiIO &io = ImGui::GetIO(); - io.MousePos = ImVec2(touchLocation.x, touchLocation.y); + io.AddMouseSourceEvent(ImGuiMouseSource_TouchScreen); + io.AddMousePosEvent(touchLocation.x, touchLocation.y); BOOL hasActiveTouch = NO; for (UITouch *touch in event.allTouches) @@ -262,7 +244,7 @@ -(void)updateIOWithTouchEvent:(UIEvent *)event break; } } - io.MouseDown[0] = hasActiveTouch; + io.AddMouseButtonEvent(0, hasActiveTouch); } -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self updateIOWithTouchEvent:event]; } @@ -301,9 +283,8 @@ -(instancetype)init backing:NSBackingStoreBuffered defer:NO]; self.window.contentViewController = rootViewController; - [self.window orderFront:self]; [self.window center]; - [self.window becomeKeyWindow]; + [self.window makeKeyAndOrderFront:self]; } return self; } diff --git a/third_party/imgui/examples/example_apple_opengl2/main.mm b/third_party/imgui/examples/example_apple_opengl2/main.mm index f859162e5d8..815c0f72e14 100644 --- a/third_party/imgui/examples/example_apple_opengl2/main.mm +++ b/third_party/imgui/examples/example_apple_opengl2/main.mm @@ -1,6 +1,10 @@ // Dear ImGui: standalone example application for OSX + OpenGL2, using legacy fixed pipeline -// 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 #import #import @@ -36,26 +40,17 @@ -(void)prepareOpenGL -(void)initialize { - // Some events do not raise callbacks of AppView in some circumstances (for example when CMD key is held down). - // This monitor taps into global event stream and captures these events. - NSEventMask eventMask = NSEventMaskKeyDown | NSEventMaskKeyUp | NSEventMaskFlagsChanged; - [NSEvent addLocalMonitorForEventsMatchingMask:eventMask handler:^NSEvent * _Nullable(NSEvent *event) - { - ImGui_ImplOSX_HandleEvent(event, self); - return event; - }]; - // Setup Dear ImGui context // FIXME: This example doesn't have proper cleanup... IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls // Setup Dear ImGui style ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); + //ImGui::StyleColorsLight(); // Setup Platform/Renderer backends ImGui_ImplOSX_Init(self); @@ -64,22 +59,24 @@ -(void)initialize // Load Fonts // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. - // - Read 'docs/FONTS.txt' for more instructions and details. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); } -(void)updateAndDrawDemoView { // Start the Dear ImGui frame + ImGuiIO& io = ImGui::GetIO(); ImGui_ImplOpenGL2_NewFrame(); ImGui_ImplOSX_NewFrame(self); ImGui::NewFrame(); @@ -93,7 +90,7 @@ -(void)updateAndDrawDemoView if (show_demo_window) ImGui::ShowDemoWindow(&show_demo_window); - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. { static float f = 0.0f; static int counter = 0; @@ -112,7 +109,7 @@ -(void)updateAndDrawDemoView ImGui::SameLine(); ImGui::Text("counter = %d", counter); - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); ImGui::End(); } @@ -151,26 +148,6 @@ -(void)drawRect:(NSRect)bounds { [self updateAndDrawDemoView]; } -(void)animationTimerFired:(NSTimer*)timer { [self setNeedsDisplay:YES]; } -(void)dealloc { animationTimer = nil; } -//----------------------------------------------------------------------------------- -// Input processing -//----------------------------------------------------------------------------------- - -// Forward Mouse/Keyboard events to Dear ImGui OSX backend. -// Other events are registered via addLocalMonitorForEventsMatchingMask() --(void)mouseDown:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); } --(void)rightMouseDown:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); } --(void)otherMouseDown:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); } --(void)mouseUp:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); } --(void)rightMouseUp:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); } --(void)otherMouseUp:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); } --(void)mouseMoved:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); } --(void)mouseDragged:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); } --(void)rightMouseMoved:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); } --(void)rightMouseDragged:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); } --(void)otherMouseMoved:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); } --(void)otherMouseDragged:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); } --(void)scrollWheel:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); } - @end //----------------------------------------------------------------------------------- diff --git a/third_party/imgui/examples/example_emscripten_opengl3/Makefile b/third_party/imgui/examples/example_emscripten_opengl3/Makefile deleted file mode 100644 index b2933e10845..00000000000 --- a/third_party/imgui/examples/example_emscripten_opengl3/Makefile +++ /dev/null @@ -1,91 +0,0 @@ -# -# Makefile to use with emscripten -# See https://emscripten.org/docs/getting_started/downloads.html -# for installation instructions. -# -# This Makefile assumes you have loaded emscripten's environment. -# (On Windows, you may need to execute emsdk_env.bat or encmdprompt.bat ahead) -# -# Running `make` will produce three files: -# - web/index.html -# - web/index.js -# - web/index.wasm -# -# All three are needed to run the demo. - -CC = emcc -CXX = em++ -WEB_DIR = web -EXE = $(WEB_DIR)/index.html -IMGUI_DIR = ../.. -SOURCES = main.cpp -SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp -SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl3.cpp -OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) -UNAME_S := $(shell uname -s) -CPPFLAGS = -LDFLAGS = -EMS = - -##--------------------------------------------------------------------- -## EMSCRIPTEN OPTIONS -##--------------------------------------------------------------------- - -# ("EMS" options gets added to both CPPFLAGS and LDFLAGS, whereas some options are for linker only) -EMS += -s USE_SDL=2 -EMS += -s DISABLE_EXCEPTION_CATCHING=1 -LDFLAGS += -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=0 -s ASSERTIONS=1 - -# Uncomment next line to fix possible rendering bugs with Emscripten version older then 1.39.0 (https://github.com/ocornut/imgui/issues/2877) -#EMS += -s BINARYEN_TRAP_MODE=clamp -#EMS += -s SAFE_HEAP=1 ## Adds overhead - -# Emscripten allows preloading a file or folder to be accessible at runtime. -# The Makefile for this example project suggests embedding the misc/fonts/ folder into our application, it will then be accessible as "/fonts" -# See documentation for more details: https://emscripten.org/docs/porting/files/packaging_files.html -# (Default value is 0. Set to 1 to enable file-system and include the misc/fonts/ folder as part of the build.) -USE_FILE_SYSTEM ?= 0 -ifeq ($(USE_FILE_SYSTEM), 0) -LDFLAGS += -s NO_FILESYSTEM=1 -CPPFLAGS += -DIMGUI_DISABLE_FILE_FUNCTIONS -endif -ifeq ($(USE_FILE_SYSTEM), 1) -LDFLAGS += --no-heap-copy --preload-file ../../misc/fonts@/fonts -endif - -##--------------------------------------------------------------------- -## FINAL BUILD FLAGS -##--------------------------------------------------------------------- - -CPPFLAGS += -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends -#CPPFLAGS += -g -CPPFLAGS += -Wall -Wformat -Os $(EMS) -LDFLAGS += --shell-file shell_minimal.html $(EMS) - -##--------------------------------------------------------------------- -## BUILD RULES -##--------------------------------------------------------------------- - -%.o:%.cpp - $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< - -%.o:$(IMGUI_DIR)/%.cpp - $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< - -%.o:$(IMGUI_DIR)/backends/%.cpp - $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< - -all: $(EXE) - @echo Build complete for $(EXE) - -$(WEB_DIR): - mkdir $@ - -serve: all - python3 -m http.server -d $(WEB_DIR) - -$(EXE): $(OBJS) $(WEB_DIR) - $(CXX) -o $@ $(OBJS) $(LDFLAGS) - -clean: - rm -rf $(OBJS) $(WEB_DIR) diff --git a/third_party/imgui/examples/example_emscripten_opengl3/README.md b/third_party/imgui/examples/example_emscripten_opengl3/README.md deleted file mode 100644 index e2b19e44bd0..00000000000 --- a/third_party/imgui/examples/example_emscripten_opengl3/README.md +++ /dev/null @@ -1,26 +0,0 @@ -## How to Build - -- You need to install Emscripten from https://emscripten.org/docs/getting_started/downloads.html, and have the environment variables set, as described in https://emscripten.org/docs/getting_started/downloads.html#installation-instructions - -- Depending on your configuration, in Windows you may need to run `emsdk/emsdk_env.bat` in your console to access the Emscripten command-line tools. - -- You may also refer to our [Continuous Integration setup](https://github.com/ocornut/imgui/tree/master/.github/workflows) for Emscripten setup. - -- Then build using `make` while in the `example_emscripten_opengl3/` directory. - -## How to Run - -To run on a local machine: -- `make serve` will use Python3 to spawn a local webserver, you can then browse http://localhost:8000 to access your build. -- Otherwise, generally you will need a local webserver: - - Quoting [https://emscripten.org/docs/getting_started](https://emscripten.org/docs/getting_started/Tutorial.html#generating-html):
    -_"Unfortunately several browsers (including Chrome, Safari, and Internet Explorer) do not support file:// [XHR](https://emscripten.org/docs/site/glossary.html#term-xhr) requests, and can’t load extra files needed by the HTML (like a .wasm file, or packaged file data as mentioned lower down). For these browsers you’ll need to serve the files using a [local webserver](https://emscripten.org/docs/getting_started/FAQ.html#faq-local-webserver) and then open http://localhost:8000/hello.html."_ - - Emscripten SDK has a handy `emrun` command: `emrun web/example_emscripten_opengl3.html --browser firefox` which will spawn a temporary local webserver (in Firefox). See https://emscripten.org/docs/compiling/Running-html-files-with-emrun.html for details. - - You may use Python 3 builtin webserver: `python -m http.server -d web` (this is what `make serve` uses). - - You may use Python 2 builtin webserver: `cd web && python -m SimpleHTTPServer`. - - If you are accessing the files over a network, certain browsers, such as Firefox, will restrict Gamepad API access to secure contexts only (e.g. https only). - -## Obsolete features: - -- Emscripten 2.0 (August 2020) obsoleted the fastcomp backend, only llvm is supported. -- Emscripten 1.39.0 (October 2019) obsoleted the `BINARYEN_TRAP_MODE=clamp` compilation flag which was required with version older than 1.39.0 to avoid rendering artefacts. See [#2877](https://github.com/ocornut/imgui/issues/2877) for details. If you use an older version, uncomment this line in the Makefile: `#EMS += -s BINARYEN_TRAP_MODE=clamp` diff --git a/third_party/imgui/examples/example_emscripten_opengl3/main.cpp b/third_party/imgui/examples/example_emscripten_opengl3/main.cpp deleted file mode 100644 index be338a8316b..00000000000 --- a/third_party/imgui/examples/example_emscripten_opengl3/main.cpp +++ /dev/null @@ -1,174 +0,0 @@ -// Dear ImGui: standalone example application for Emscripten, using SDL2 + OpenGL3 -// (Emscripten is a C++-to-javascript compiler, used to publish executables for the web. See https://emscripten.org/) -// 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 - -// This is mostly the same code as the SDL2 + OpenGL3 example, simply with the modifications needed to run on Emscripten. -// It is possible to combine both code into a single source file that will compile properly on Desktop and using Emscripten. -// See https://github.com/ocornut/imgui/pull/2492 as an example on how to do just that. - -#include "imgui.h" -#include "imgui_impl_sdl.h" -#include "imgui_impl_opengl3.h" -#include -#include -#include -#include - -// Emscripten requires to have full control over the main loop. We're going to store our SDL book-keeping variables globally. -// Having a single function that acts as a loop prevents us to store state in the stack of said function. So we need some location for this. -SDL_Window* g_Window = NULL; -SDL_GLContext g_GLContext = NULL; - -// For clarity, our main loop code is declared at the end. -static void main_loop(void*); - -int main(int, char**) -{ - // Setup SDL - if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) - { - printf("Error: %s\n", SDL_GetError()); - return -1; - } - - // For the browser using Emscripten, we are going to use WebGL1 with GL ES2. See the Makefile. for requirement details. - // It is very likely the generated file won't work in many browsers. Firefox is the only sure bet, but I have successfully - // run this code on Chrome for Android for example. - const char* glsl_version = "#version 100"; - //const char* glsl_version = "#version 300 es"; - SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); - - // Create window with graphics context - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); - SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); - SDL_DisplayMode current; - SDL_GetCurrentDisplayMode(0, ¤t); - SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); - g_Window = SDL_CreateWindow("Dear ImGui Emscripten example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); - g_GLContext = SDL_GL_CreateContext(g_Window); - if (!g_GLContext) - { - fprintf(stderr, "Failed to initialize WebGL context!\n"); - return 1; - } - SDL_GL_SetSwapInterval(1); // Enable vsync - - // Setup Dear ImGui context - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); - ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls - - // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file. - // You may manually call LoadIniSettingsFromMemory() to load settings from your own storage. - io.IniFilename = NULL; - - // Setup Dear ImGui style - ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); - - // Setup Platform/Renderer backends - ImGui_ImplSDL2_InitForOpenGL(g_Window, g_GLContext); - ImGui_ImplOpenGL3_Init(glsl_version); - - // Load Fonts - // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. - // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). - // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. - // - Read 'docs/FONTS.md' for more instructions and details. - // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! - // - Emscripten allows preloading a file or folder to be accessible at runtime. See Makefile for details. - //io.Fonts->AddFontDefault(); -#ifndef IMGUI_DISABLE_FILE_FUNCTIONS - io.Fonts->AddFontFromFileTTF("fonts/Roboto-Medium.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("fonts/ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); -#endif - - // This function call won't return, and will engage in an infinite loop, processing events from the browser, and dispatching them. - emscripten_set_main_loop_arg(main_loop, NULL, 0, true); -} - -static void main_loop(void* arg) -{ - ImGuiIO& io = ImGui::GetIO(); - IM_UNUSED(arg); // We can pass this argument as the second parameter of emscripten_set_main_loop_arg(), but we don't use that. - - // Our state (make them static = more or less global) as a convenience to keep the example terse. - static bool show_demo_window = true; - static bool show_another_window = false; - static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - - // Poll and handle events (inputs, window resize, etc.) - // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. - // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. - // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. - // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. - SDL_Event event; - while (SDL_PollEvent(&event)) - { - ImGui_ImplSDL2_ProcessEvent(&event); - // Capture events here, based on io.WantCaptureMouse and io.WantCaptureKeyboard - } - - // Start the Dear ImGui frame - ImGui_ImplOpenGL3_NewFrame(); - ImGui_ImplSDL2_NewFrame(); - ImGui::NewFrame(); - - // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). - if (show_demo_window) - ImGui::ShowDemoWindow(&show_demo_window); - - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. - { - static float f = 0.0f; - static int counter = 0; - - ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. - - ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) - ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state - ImGui::Checkbox("Another Window", &show_another_window); - - ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f - ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color - - if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) - counter++; - ImGui::SameLine(); - ImGui::Text("counter = %d", counter); - - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::End(); - } - - // 3. Show another simple window. - if (show_another_window) - { - ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) - ImGui::Text("Hello from another window!"); - if (ImGui::Button("Close Me")) - show_another_window = false; - ImGui::End(); - } - - // Rendering - ImGui::Render(); - SDL_GL_MakeCurrent(g_Window, g_GLContext); - glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); - glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); - glClear(GL_COLOR_BUFFER_BIT); - ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); - SDL_GL_SwapWindow(g_Window); -} diff --git a/third_party/imgui/examples/example_emscripten_wgpu/README.md b/third_party/imgui/examples/example_emscripten_wgpu/README.md deleted file mode 100644 index c4c4dec76fa..00000000000 --- a/third_party/imgui/examples/example_emscripten_wgpu/README.md +++ /dev/null @@ -1,24 +0,0 @@ -## How to Build - -- You need to install Emscripten from https://emscripten.org/docs/getting_started/downloads.html, and have the environment variables set, as described in https://emscripten.org/docs/getting_started/downloads.html#installation-instructions - -- Depending on your configuration, in Windows you may need to run `emsdk/emsdk_env.bat` in your console to access the Emscripten command-line tools. - -- You may also refer to our [Continuous Integration setup](https://github.com/ocornut/imgui/tree/master/.github/workflows) for Emscripten setup. - -- Then build using `make` while in the `example_emscripten_wgpu/` directory. - -- Requires recent Emscripten as WGPU is still a work-in-progress API. - -## How to Run - -To run on a local machine: -- Make sure your browse supports WGPU and it is enabled. WGPU is still WIP not enabled by default in most browser. -- `make serve` will use Python3 to spawn a local webserver, you can then browse http://localhost:8000 to access your build. -- Otherwise, generally you will need a local webserver: - - Quoting [https://emscripten.org/docs/getting_started](https://emscripten.org/docs/getting_started/Tutorial.html#generating-html):
    -_"Unfortunately several browsers (including Chrome, Safari, and Internet Explorer) do not support file:// [XHR](https://emscripten.org/docs/site/glossary.html#term-xhr) requests, and can’t load extra files needed by the HTML (like a .wasm file, or packaged file data as mentioned lower down). For these browsers you’ll need to serve the files using a [local webserver](https://emscripten.org/docs/getting_started/FAQ.html#faq-local-webserver) and then open http://localhost:8000/hello.html."_ - - Emscripten SDK has a handy `emrun` command: `emrun web/example_emscripten_opengl3.html --browser firefox` which will spawn a temporary local webserver (in Firefox). See https://emscripten.org/docs/compiling/Running-html-files-with-emrun.html for details. - - You may use Python 3 builtin webserver: `python -m http.server -d web` (this is what `make serve` uses). - - You may use Python 2 builtin webserver: `cd web && python -m SimpleHTTPServer`. - - If you are accessing the files over a network, certain browsers, such as Firefox, will restrict Gamepad API access to secure contexts only (e.g. https only). diff --git a/third_party/imgui/examples/example_emscripten_wgpu/main.cpp b/third_party/imgui/examples/example_emscripten_wgpu/main.cpp deleted file mode 100644 index d11d906c8a9..00000000000 --- a/third_party/imgui/examples/example_emscripten_wgpu/main.cpp +++ /dev/null @@ -1,245 +0,0 @@ -// Dear ImGui: standalone example application for Emscripten, using GLFW + WebGPU -// (Emscripten is a C++-to-javascript compiler, used to publish executables for the web. See https://emscripten.org/) -// 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 - -#include "imgui.h" -#include "imgui_impl_glfw.h" -#include "imgui_impl_wgpu.h" -#include -#include -#include -#include -#include -#include -#include - -// Global WebGPU required states -static WGPUDevice wgpu_device = NULL; -static WGPUSurface wgpu_surface = NULL; -static WGPUSwapChain wgpu_swap_chain = NULL; -static int wgpu_swap_chain_width = 0; -static int wgpu_swap_chain_height = 0; - -// States tracked across render frames -static bool show_demo_window = true; -static bool show_another_window = false; -static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - -// Forward declarations -static bool init_wgpu(); -static void main_loop(void* window); -static void print_glfw_error(int error, const char* description); -static void print_wgpu_error(WGPUErrorType error_type, const char* message, void*); - -int main(int, char**) -{ - glfwSetErrorCallback(print_glfw_error); - if (!glfwInit()) - return 1; - - // Make sure GLFW does not initialize any graphics context. - // This needs to be done explicitly later - glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); - - GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+WebGPU example", NULL, NULL); - if (!window) - { - glfwTerminate(); - return 1; - } - - // Initialize the WebGPU environment - if (!init_wgpu()) - { - if (window) - glfwDestroyWindow(window); - glfwTerminate(); - return 1; - } - glfwShowWindow(window); - - // Setup Dear ImGui context - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); - ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls - - // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file. - // You may manually call LoadIniSettingsFromMemory() to load settings from your own storage. - io.IniFilename = NULL; - - // Setup Dear ImGui style - ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); - - // Setup Platform/Renderer backends - ImGui_ImplGlfw_InitForOther(window, true); - ImGui_ImplWGPU_Init(wgpu_device, 3, WGPUTextureFormat_RGBA8Unorm); - - // Load Fonts - // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. - // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). - // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. - // - Read 'docs/FONTS.md' for more instructions and details. - // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! - // - Emscripten allows preloading a file or folder to be accessible at runtime. See Makefile for details. - //io.Fonts->AddFontDefault(); -#ifndef IMGUI_DISABLE_FILE_FUNCTIONS - io.Fonts->AddFontFromFileTTF("fonts/Roboto-Medium.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("fonts/ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); -#endif - - // This function will directly return and exit the main function. - // Make sure that no required objects get cleaned up. - // This way we can use the browsers 'requestAnimationFrame' to control the rendering. - emscripten_set_main_loop_arg(main_loop, window, 0, false); - - return 0; -} - -static bool init_wgpu() -{ - wgpu_device = emscripten_webgpu_get_device(); - if (!wgpu_device) - return false; - - wgpuDeviceSetUncapturedErrorCallback(wgpu_device, print_wgpu_error, NULL); - - // Use C++ wrapper due to misbehavior in Emscripten. - // Some offset computation for wgpuInstanceCreateSurface in JavaScript - // seem to be inline with struct alignments in the C++ structure - wgpu::SurfaceDescriptorFromCanvasHTMLSelector html_surface_desc = {}; - html_surface_desc.selector = "#canvas"; - - wgpu::SurfaceDescriptor surface_desc = {}; - surface_desc.nextInChain = &html_surface_desc; - - // Use 'null' instance - wgpu::Instance instance = {}; - wgpu_surface = instance.CreateSurface(&surface_desc).Release(); - - return true; -} - -static void main_loop(void* window) -{ - glfwPollEvents(); - - int width, height; - glfwGetFramebufferSize((GLFWwindow*) window, &width, &height); - - // React to changes in screen size - if (width != wgpu_swap_chain_width && height != wgpu_swap_chain_height) - { - ImGui_ImplWGPU_InvalidateDeviceObjects(); - - if (wgpu_swap_chain) - wgpuSwapChainRelease(wgpu_swap_chain); - - wgpu_swap_chain_width = width; - wgpu_swap_chain_height = height; - - WGPUSwapChainDescriptor swap_chain_desc = {}; - swap_chain_desc.usage = WGPUTextureUsage_RenderAttachment; - swap_chain_desc.format = WGPUTextureFormat_RGBA8Unorm; - swap_chain_desc.width = width; - swap_chain_desc.height = height; - swap_chain_desc.presentMode = WGPUPresentMode_Fifo; - wgpu_swap_chain = wgpuDeviceCreateSwapChain(wgpu_device, wgpu_surface, &swap_chain_desc); - - ImGui_ImplWGPU_CreateDeviceObjects(); - } - - // Start the Dear ImGui frame - ImGui_ImplWGPU_NewFrame(); - ImGui_ImplGlfw_NewFrame(); - ImGui::NewFrame(); - - // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). - if (show_demo_window) - ImGui::ShowDemoWindow(&show_demo_window); - - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. - { - static float f = 0.0f; - static int counter = 0; - - ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. - - ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) - ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state - ImGui::Checkbox("Another Window", &show_another_window); - - ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f - ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color - - if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) - counter++; - ImGui::SameLine(); - ImGui::Text("counter = %d", counter); - - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::End(); - } - - // 3. Show another simple window. - if (show_another_window) - { - ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) - ImGui::Text("Hello from another window!"); - if (ImGui::Button("Close Me")) - show_another_window = false; - ImGui::End(); - } - - // Rendering - ImGui::Render(); - - WGPURenderPassColorAttachment color_attachments = {}; - color_attachments.loadOp = WGPULoadOp_Clear; - color_attachments.storeOp = WGPUStoreOp_Store; - color_attachments.clearColor = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w }; - color_attachments.view = wgpuSwapChainGetCurrentTextureView(wgpu_swap_chain); - WGPURenderPassDescriptor render_pass_desc = {}; - render_pass_desc.colorAttachmentCount = 1; - render_pass_desc.colorAttachments = &color_attachments; - render_pass_desc.depthStencilAttachment = NULL; - - WGPUCommandEncoderDescriptor enc_desc = {}; - WGPUCommandEncoder encoder = wgpuDeviceCreateCommandEncoder(wgpu_device, &enc_desc); - - WGPURenderPassEncoder pass = wgpuCommandEncoderBeginRenderPass(encoder, &render_pass_desc); - ImGui_ImplWGPU_RenderDrawData(ImGui::GetDrawData(), pass); - wgpuRenderPassEncoderEndPass(pass); - - WGPUCommandBufferDescriptor cmd_buffer_desc = {}; - WGPUCommandBuffer cmd_buffer = wgpuCommandEncoderFinish(encoder, &cmd_buffer_desc); - WGPUQueue queue = wgpuDeviceGetQueue(wgpu_device); - wgpuQueueSubmit(queue, 1, &cmd_buffer); -} - -static void print_glfw_error(int error, const char* description) -{ - printf("Glfw Error %d: %s\n", error, description); -} - -static void print_wgpu_error(WGPUErrorType error_type, const char* message, void*) -{ - const char* error_type_lbl = ""; - switch (error_type) - { - case WGPUErrorType_Validation: error_type_lbl = "Validation"; break; - case WGPUErrorType_OutOfMemory: error_type_lbl = "Out of memory"; break; - case WGPUErrorType_Unknown: error_type_lbl = "Unknown"; break; - case WGPUErrorType_DeviceLost: error_type_lbl = "Device lost"; break; - default: error_type_lbl = "Unknown"; - } - printf("%s error: %s\n", error_type_lbl, message); -} diff --git a/third_party/imgui/examples/example_emscripten_wgpu/web/index.html b/third_party/imgui/examples/example_emscripten_wgpu/web/index.html deleted file mode 100644 index 82b1c422151..00000000000 --- a/third_party/imgui/examples/example_emscripten_wgpu/web/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - Dear ImGui Emscripten+WebGPU example - - - - - - - diff --git a/third_party/imgui/examples/example_glfw_metal/Makefile b/third_party/imgui/examples/example_glfw_metal/Makefile index a174bc8f290..32a7aeca239 100644 --- a/third_party/imgui/examples/example_glfw_metal/Makefile +++ b/third_party/imgui/examples/example_glfw_metal/Makefile @@ -14,10 +14,10 @@ SOURCES += $(IMGUI_DIR)/backends/imgui_impl_glfw.cpp $(IMGUI_DIR)/backends/imgui OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) LIBS = -framework Metal -framework MetalKit -framework Cocoa -framework IOKit -framework CoreVideo -framework QuartzCore -LIBS += -L/usr/local/lib -L/opt/homebrew/lib +LIBS += -L/usr/local/lib -L/opt/homebrew/lib -L/opt/local/lib LIBS += -lglfw -CXXFLAGS = -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends -I/usr/local/include -I/opt/homebrew/include +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends -I/usr/local/include -I/opt/homebrew/include -I/opt/local/include CXXFLAGS += -Wall -Wformat CFLAGS = $(CXXFLAGS) diff --git a/third_party/imgui/examples/example_glfw_metal/main.mm b/third_party/imgui/examples/example_glfw_metal/main.mm index 2776ba2e735..e9bc63acb1c 100644 --- a/third_party/imgui/examples/example_glfw_metal/main.mm +++ b/third_party/imgui/examples/example_glfw_metal/main.mm @@ -1,7 +1,11 @@ // Dear ImGui: standalone example application for GLFW + Metal, using programmable pipeline // (GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) -// 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 #include "imgui.h" #include "imgui_impl_glfw.h" @@ -27,27 +31,28 @@ int main(int, char**) IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls // Setup style ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); + //ImGui::StyleColorsLight(); // Load Fonts // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. - // - Read 'docs/FONTS.txt' for more instructions and details. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); // Setup window glfwSetErrorCallback(glfw_error_callback); @@ -56,8 +61,8 @@ int main(int, char**) // Create window with graphics context glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); - GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+Metal example", NULL, NULL); - if (window == NULL) + GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+Metal example", nullptr, nullptr); + if (window == nullptr) return 1; id device = MTLCreateSystemDefaultDevice(); @@ -88,8 +93,8 @@ int main(int, char**) { // Poll and handle events (inputs, window resize, etc.) // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. - // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. - // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. glfwPollEvents(); @@ -115,7 +120,7 @@ int main(int, char**) if (show_demo_window) ImGui::ShowDemoWindow(&show_demo_window); - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. { static float f = 0.0f; static int counter = 0; @@ -134,7 +139,7 @@ int main(int, char**) ImGui::SameLine(); ImGui::Text("counter = %d", counter); - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); ImGui::End(); } diff --git a/third_party/imgui/examples/example_glfw_opengl2/Makefile b/third_party/imgui/examples/example_glfw_opengl2/Makefile index 5c19a27f19e..1f15c15c068 100644 --- a/third_party/imgui/examples/example_glfw_opengl2/Makefile +++ b/third_party/imgui/examples/example_glfw_opengl2/Makefile @@ -22,7 +22,7 @@ SOURCES += $(IMGUI_DIR)/backends/imgui_impl_glfw.cpp $(IMGUI_DIR)/backends/imgui OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) UNAME_S := $(shell uname -s) -CXXFLAGS = -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends CXXFLAGS += -g -Wall -Wformat LIBS = diff --git a/third_party/imgui/examples/example_glfw_opengl2/build_win32.bat b/third_party/imgui/examples/example_glfw_opengl2/build_win32.bat index a0a75f90607..24c0e08fda7 100644 --- a/third_party/imgui/examples/example_glfw_opengl2/build_win32.bat +++ b/third_party/imgui/examples/example_glfw_opengl2/build_win32.bat @@ -5,4 +5,4 @@ @set SOURCES=main.cpp ..\..\backends\imgui_impl_opengl2.cpp ..\..\backends\imgui_impl_glfw.cpp ..\..\imgui*.cpp @set LIBS=/LIBPATH:..\libs\glfw\lib-vc2010-32 glfw3.lib opengl32.lib gdi32.lib shell32.lib mkdir %OUT_DIR% -cl /nologo /Zi /MD %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% +cl /nologo /Zi /MD /utf-8 %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/third_party/imgui/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj b/third_party/imgui/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj index faf6d9a5ae8..2aa25506e2f 100644 --- a/third_party/imgui/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj +++ b/third_party/imgui/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj @@ -91,6 +91,7 @@ Level4 Disabled ..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) true @@ -105,6 +106,7 @@ Level4 Disabled ..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) true @@ -122,6 +124,7 @@ true ..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories) false + /utf-8 %(AdditionalOptions) true @@ -142,6 +145,7 @@ true ..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories) false + /utf-8 %(AdditionalOptions) true @@ -172,6 +176,7 @@ + diff --git a/third_party/imgui/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj.filters b/third_party/imgui/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj.filters index 69b285d1af4..049b0b1a312 100644 --- a/third_party/imgui/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj.filters +++ b/third_party/imgui/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj.filters @@ -55,7 +55,10 @@ - sources + imgui + + + imgui - + \ No newline at end of file diff --git a/third_party/imgui/examples/example_glfw_opengl2/main.cpp b/third_party/imgui/examples/example_glfw_opengl2/main.cpp index ee785b1f51b..5e47b000847 100644 --- a/third_party/imgui/examples/example_glfw_opengl2/main.cpp +++ b/third_party/imgui/examples/example_glfw_opengl2/main.cpp @@ -1,7 +1,11 @@ // Dear ImGui: standalone example application for GLFW + OpenGL2, using legacy fixed pipeline // (GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) -// 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 // **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)** // **Prefer using the code in the example_glfw_opengl2/ folder** @@ -25,17 +29,19 @@ static void glfw_error_callback(int error, const char* description) { - fprintf(stderr, "Glfw Error %d: %s\n", error, description); + fprintf(stderr, "GLFW Error %d: %s\n", error, description); } +// Main code int main(int, char**) { - // Setup window glfwSetErrorCallback(glfw_error_callback); if (!glfwInit()) return 1; - GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+OpenGL2 example", NULL, NULL); - if (window == NULL) + + // Create window with graphics context + GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+OpenGL2 example", nullptr, nullptr); + if (window == nullptr) return 1; glfwMakeContextCurrent(window); glfwSwapInterval(1); // Enable vsync @@ -44,12 +50,12 @@ int main(int, char**) IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls // Setup Dear ImGui style ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); + //ImGui::StyleColorsLight(); // Setup Platform/Renderer backends ImGui_ImplGlfw_InitForOpenGL(window, true); @@ -58,17 +64,18 @@ int main(int, char**) // Load Fonts // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. // - Read 'docs/FONTS.md' for more instructions and details. // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); // Our state bool show_demo_window = true; @@ -80,8 +87,8 @@ int main(int, char**) { // Poll and handle events (inputs, window resize, etc.) // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. - // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. - // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. glfwPollEvents(); @@ -94,7 +101,7 @@ int main(int, char**) if (show_demo_window) ImGui::ShowDemoWindow(&show_demo_window); - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. { static float f = 0.0f; static int counter = 0; @@ -113,7 +120,7 @@ int main(int, char**) ImGui::SameLine(); ImGui::Text("counter = %d", counter); - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); ImGui::End(); } diff --git a/third_party/imgui/examples/example_glfw_opengl3/Makefile b/third_party/imgui/examples/example_glfw_opengl3/Makefile index 672a7059c76..252ce571442 100644 --- a/third_party/imgui/examples/example_glfw_opengl3/Makefile +++ b/third_party/imgui/examples/example_glfw_opengl3/Makefile @@ -23,7 +23,7 @@ OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) UNAME_S := $(shell uname -s) LINUX_GL_LIBS = -lGL -CXXFLAGS = -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends CXXFLAGS += -g -Wall -Wformat LIBS = diff --git a/third_party/imgui/examples/example_glfw_opengl3/Makefile.emscripten b/third_party/imgui/examples/example_glfw_opengl3/Makefile.emscripten new file mode 100644 index 00000000000..bd972abffc8 --- /dev/null +++ b/third_party/imgui/examples/example_glfw_opengl3/Makefile.emscripten @@ -0,0 +1,91 @@ +# +# Makefile to use with GLFW+emscripten +# See https://emscripten.org/docs/getting_started/downloads.html +# for installation instructions. +# +# This Makefile assumes you have loaded emscripten's environment. +# (On Windows, you may need to execute emsdk_env.bat or encmdprompt.bat ahead) +# +# Running `make -f Makefile.emscripten` will produce three files: +# - web/index.html +# - web/index.js +# - web/index.wasm +# +# All three are needed to run the demo. + +CC = emcc +CXX = em++ +WEB_DIR = web +EXE = $(WEB_DIR)/index.html +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_glfw.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl3.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) +CPPFLAGS = +LDFLAGS = +EMS = + +##--------------------------------------------------------------------- +## EMSCRIPTEN OPTIONS +##--------------------------------------------------------------------- + +# ("EMS" options gets added to both CPPFLAGS and LDFLAGS, whereas some options are for linker only) +EMS += -s DISABLE_EXCEPTION_CATCHING=1 +LDFLAGS += -s USE_GLFW=3 -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=0 -s ASSERTIONS=1 + +# Uncomment next line to fix possible rendering bugs with Emscripten version older then 1.39.0 (https://github.com/ocornut/imgui/issues/2877) +#EMS += -s BINARYEN_TRAP_MODE=clamp +#EMS += -s SAFE_HEAP=1 ## Adds overhead + +# Emscripten allows preloading a file or folder to be accessible at runtime. +# The Makefile for this example project suggests embedding the misc/fonts/ folder into our application, it will then be accessible as "/fonts" +# See documentation for more details: https://emscripten.org/docs/porting/files/packaging_files.html +# (Default value is 0. Set to 1 to enable file-system and include the misc/fonts/ folder as part of the build.) +USE_FILE_SYSTEM ?= 0 +ifeq ($(USE_FILE_SYSTEM), 0) +LDFLAGS += -s NO_FILESYSTEM=1 +CPPFLAGS += -DIMGUI_DISABLE_FILE_FUNCTIONS +endif +ifeq ($(USE_FILE_SYSTEM), 1) +LDFLAGS += --no-heap-copy --preload-file ../../misc/fonts@/fonts +endif + +##--------------------------------------------------------------------- +## FINAL BUILD FLAGS +##--------------------------------------------------------------------- + +CPPFLAGS += -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +#CPPFLAGS += -g +CPPFLAGS += -Wall -Wformat -Os $(EMS) +LDFLAGS += --shell-file ../libs/emscripten/shell_minimal.html +LDFLAGS += $(EMS) + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(EXE) + +$(WEB_DIR): + mkdir $@ + +serve: all + python3 -m http.server -d $(WEB_DIR) + +$(EXE): $(OBJS) $(WEB_DIR) + $(CXX) -o $@ $(OBJS) $(LDFLAGS) + +clean: + rm -rf $(OBJS) $(WEB_DIR) diff --git a/third_party/imgui/examples/example_glfw_opengl3/build_win32.bat b/third_party/imgui/examples/example_glfw_opengl3/build_win32.bat index 4ba58d8c9d4..b5979ad4939 100644 --- a/third_party/imgui/examples/example_glfw_opengl3/build_win32.bat +++ b/third_party/imgui/examples/example_glfw_opengl3/build_win32.bat @@ -5,4 +5,4 @@ @set SOURCES=main.cpp ..\..\backends\imgui_impl_glfw.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp @set LIBS=/LIBPATH:..\libs\glfw\lib-vc2010-32 glfw3.lib opengl32.lib gdi32.lib shell32.lib mkdir %OUT_DIR% -cl /nologo /Zi /MD %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% +cl /nologo /Zi /MD /utf-8 %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/third_party/imgui/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj b/third_party/imgui/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj index 7721c8ffacb..4bd503afe33 100644 --- a/third_party/imgui/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj +++ b/third_party/imgui/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj @@ -91,6 +91,7 @@ Level4 Disabled ..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) true @@ -105,6 +106,7 @@ Level4 Disabled ..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) true @@ -122,6 +124,7 @@ true ..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories) false + /utf-8 %(AdditionalOptions) true @@ -142,6 +145,7 @@ true ..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories) false + /utf-8 %(AdditionalOptions) true @@ -173,10 +177,11 @@ + - + \ No newline at end of file diff --git a/third_party/imgui/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj.filters b/third_party/imgui/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj.filters index fd2f8071453..bc79bb197d4 100644 --- a/third_party/imgui/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj.filters +++ b/third_party/imgui/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj.filters @@ -58,7 +58,10 @@ - sources + imgui + + + imgui - + \ No newline at end of file diff --git a/third_party/imgui/examples/example_glfw_opengl3/main.cpp b/third_party/imgui/examples/example_glfw_opengl3/main.cpp index f8e8a02cf68..4438fa5bb6c 100644 --- a/third_party/imgui/examples/example_glfw_opengl3/main.cpp +++ b/third_party/imgui/examples/example_glfw_opengl3/main.cpp @@ -1,12 +1,17 @@ // Dear ImGui: standalone example application for GLFW + OpenGL 3, using programmable pipeline // (GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) -// 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 #include "imgui.h" #include "imgui_impl_glfw.h" #include "imgui_impl_opengl3.h" #include +#define GL_SILENCE_DEPRECATION #if defined(IMGUI_IMPL_OPENGL_ES2) #include #endif @@ -19,14 +24,19 @@ #pragma comment(lib, "legacy_stdio_definitions") #endif +// This example can also compile and run with Emscripten! See 'Makefile.emscripten' for details. +#ifdef __EMSCRIPTEN__ +#include "../libs/emscripten/emscripten_mainloop_stub.h" +#endif + static void glfw_error_callback(int error, const char* description) { - fprintf(stderr, "Glfw Error %d: %s\n", error, description); + fprintf(stderr, "GLFW Error %d: %s\n", error, description); } +// Main code int main(int, char**) { - // Setup window glfwSetErrorCallback(glfw_error_callback); if (!glfwInit()) return 1; @@ -55,8 +65,8 @@ int main(int, char**) #endif // Create window with graphics context - GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+OpenGL3 example", NULL, NULL); - if (window == NULL) + GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+OpenGL3 example", nullptr, nullptr); + if (window == nullptr) return 1; glfwMakeContextCurrent(window); glfwSwapInterval(1); // Enable vsync @@ -65,31 +75,36 @@ int main(int, char**) IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls // Setup Dear ImGui style ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); + //ImGui::StyleColorsLight(); // Setup Platform/Renderer backends ImGui_ImplGlfw_InitForOpenGL(window, true); +#ifdef __EMSCRIPTEN__ + ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback("#canvas"); +#endif ImGui_ImplOpenGL3_Init(glsl_version); // Load Fonts // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. // - Read 'docs/FONTS.md' for more instructions and details. // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + // - Our Emscripten build process allows embedding fonts to be accessible at runtime from the "fonts/" folder. See Makefile.emscripten for details. //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); // Our state bool show_demo_window = true; @@ -97,12 +112,19 @@ int main(int, char**) ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); // Main loop +#ifdef __EMSCRIPTEN__ + // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file. + // You may manually call LoadIniSettingsFromMemory() to load settings from your own storage. + io.IniFilename = nullptr; + EMSCRIPTEN_MAINLOOP_BEGIN +#else while (!glfwWindowShouldClose(window)) +#endif { // Poll and handle events (inputs, window resize, etc.) // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. - // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. - // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. glfwPollEvents(); @@ -115,7 +137,7 @@ int main(int, char**) if (show_demo_window) ImGui::ShowDemoWindow(&show_demo_window); - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. { static float f = 0.0f; static int counter = 0; @@ -134,7 +156,7 @@ int main(int, char**) ImGui::SameLine(); ImGui::Text("counter = %d", counter); - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); ImGui::End(); } @@ -159,6 +181,9 @@ int main(int, char**) glfwSwapBuffers(window); } +#ifdef __EMSCRIPTEN__ + EMSCRIPTEN_MAINLOOP_END; +#endif // Cleanup ImGui_ImplOpenGL3_Shutdown(); diff --git a/third_party/imgui/examples/example_glfw_vulkan/CMakeLists.txt b/third_party/imgui/examples/example_glfw_vulkan/CMakeLists.txt index 05eab3bc520..a6e5bf910fd 100644 --- a/third_party/imgui/examples/example_glfw_vulkan/CMakeLists.txt +++ b/third_party/imgui/examples/example_glfw_vulkan/CMakeLists.txt @@ -10,6 +10,7 @@ if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE) endif() +set(CMAKE_CXX_STANDARD 11) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DVK_PROTOTYPES") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVK_PROTOTYPES") @@ -41,3 +42,4 @@ file(GLOB sources *.cpp) add_executable(example_glfw_vulkan ${sources} ${IMGUI_DIR}/backends/imgui_impl_glfw.cpp ${IMGUI_DIR}/backends/imgui_impl_vulkan.cpp ${IMGUI_DIR}/imgui.cpp ${IMGUI_DIR}/imgui_draw.cpp ${IMGUI_DIR}/imgui_demo.cpp ${IMGUI_DIR}/imgui_tables.cpp ${IMGUI_DIR}/imgui_widgets.cpp) target_link_libraries(example_glfw_vulkan ${LIBRARIES}) +target_compile_definitions(example_glfw_vulkan PUBLIC -DImTextureID=ImU64) diff --git a/third_party/imgui/examples/example_glfw_vulkan/build_win32.bat b/third_party/imgui/examples/example_glfw_vulkan/build_win32.bat index f49cbd77de8..be92398162e 100644 --- a/third_party/imgui/examples/example_glfw_vulkan/build_win32.bat +++ b/third_party/imgui/examples/example_glfw_vulkan/build_win32.bat @@ -7,8 +7,8 @@ @set OUT_DIR=Debug mkdir %OUT_DIR% -cl /nologo /Zi /MD %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% +cl /nologo /Zi /MD /utf-8 %INCLUDES% /D ImTextureID=ImU64 %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% @set OUT_DIR=Release mkdir %OUT_DIR% -cl /nologo /Zi /MD /Ox /Oi %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% +cl /nologo /Zi /MD /utf-8 /Ox /Oi %INCLUDES% /D ImTextureID=ImU64 %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/third_party/imgui/examples/example_glfw_vulkan/build_win64.bat b/third_party/imgui/examples/example_glfw_vulkan/build_win64.bat index 893f296f499..c60b027893b 100644 --- a/third_party/imgui/examples/example_glfw_vulkan/build_win64.bat +++ b/third_party/imgui/examples/example_glfw_vulkan/build_win64.bat @@ -6,8 +6,8 @@ @set OUT_DIR=Debug mkdir %OUT_DIR% -cl /nologo /Zi /MD %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% +cl /nologo /Zi /MD /utf-8 %INCLUDES% /D ImTextureID=ImU64 %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% @set OUT_DIR=Release mkdir %OUT_DIR% -cl /nologo /Zi /MD /Ox /Oi %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% +cl /nologo /Zi /MD /utf-8 /Ox /Oi %INCLUDES% /D ImTextureID=ImU64 %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/third_party/imgui/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj b/third_party/imgui/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj index 34b3f21c5b6..d0d1c5f88df 100644 --- a/third_party/imgui/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj +++ b/third_party/imgui/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj @@ -91,6 +91,8 @@ Level4 Disabled ..\..;..\..\backends;%VULKAN_SDK%\include;..\libs\glfw\include;%(AdditionalIncludeDirectories) + ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions) + /utf-8 %(AdditionalOptions) true @@ -105,6 +107,8 @@ Level4 Disabled ..\..;..\..\backends;%VULKAN_SDK%\include;..\libs\glfw\include;%(AdditionalIncludeDirectories) + ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions) + /utf-8 %(AdditionalOptions) true @@ -122,6 +126,8 @@ true ..\..;..\..\backends;%VULKAN_SDK%\include;..\libs\glfw\include;%(AdditionalIncludeDirectories) false + ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions) + /utf-8 %(AdditionalOptions) true @@ -142,6 +148,8 @@ true ..\..;..\..\backends;%VULKAN_SDK%\include;..\libs\glfw\include;%(AdditionalIncludeDirectories) false + ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions) + /utf-8 %(AdditionalOptions) true @@ -172,6 +180,7 @@ + diff --git a/third_party/imgui/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj.filters b/third_party/imgui/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj.filters index adc3365cec0..510fc8547a3 100644 --- a/third_party/imgui/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj.filters +++ b/third_party/imgui/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj.filters @@ -55,7 +55,10 @@ - sources + imgui + + + imgui - + \ No newline at end of file diff --git a/third_party/imgui/examples/example_glfw_vulkan/main.cpp b/third_party/imgui/examples/example_glfw_vulkan/main.cpp index 615f2ee1d10..e1f099e3d3c 100644 --- a/third_party/imgui/examples/example_glfw_vulkan/main.cpp +++ b/third_party/imgui/examples/example_glfw_vulkan/main.cpp @@ -1,6 +1,10 @@ // Dear ImGui: standalone example application for Glfw + Vulkan -// 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 // 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. @@ -17,7 +21,12 @@ #define GLFW_INCLUDE_NONE #define GLFW_INCLUDE_VULKAN #include -#include + +// Volk headers +#ifdef IMGUI_IMPL_VULKAN_USE_VOLK +#define VOLK_IMPLEMENTATION +#include +#endif // [Win32] Our example includes a copy of glfw3.lib pre-compiled with VS2010 to maximize ease of testing and compatibility with old VS compilers. // To link with VS2010-era libraries, VS2015+ requires linking with legacy_stdio_definitions.lib, which we do using this pragma. @@ -26,12 +35,13 @@ #pragma comment(lib, "legacy_stdio_definitions") #endif -//#define IMGUI_UNLIMITED_FRAME_RATE +//#define APP_USE_UNLIMITED_FRAME_RATE #ifdef _DEBUG -#define IMGUI_VULKAN_DEBUG_REPORT +#define APP_USE_VULKAN_DEBUG_REPORT #endif -static VkAllocationCallbacks* g_Allocator = NULL; +// Data +static VkAllocationCallbacks* g_Allocator = nullptr; static VkInstance g_Instance = VK_NULL_HANDLE; static VkPhysicalDevice g_PhysicalDevice = VK_NULL_HANDLE; static VkDevice g_Device = VK_NULL_HANDLE; @@ -45,6 +55,10 @@ static ImGui_ImplVulkanH_Window g_MainWindowData; static int g_MinImageCount = 2; static bool g_SwapChainRebuild = false; +static void glfw_error_callback(int error, const char* description) +{ + fprintf(stderr, "GLFW Error %d: %s\n", error, description); +} static void check_vk_result(VkResult err) { if (err == 0) @@ -54,97 +68,121 @@ static void check_vk_result(VkResult err) abort(); } -#ifdef IMGUI_VULKAN_DEBUG_REPORT +#ifdef APP_USE_VULKAN_DEBUG_REPORT static VKAPI_ATTR VkBool32 VKAPI_CALL debug_report(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char* pLayerPrefix, const char* pMessage, void* pUserData) { (void)flags; (void)object; (void)location; (void)messageCode; (void)pUserData; (void)pLayerPrefix; // Unused arguments fprintf(stderr, "[vulkan] Debug report from ObjectType: %i\nMessage: %s\n\n", objectType, pMessage); return VK_FALSE; } -#endif // IMGUI_VULKAN_DEBUG_REPORT +#endif // APP_USE_VULKAN_DEBUG_REPORT + +static bool IsExtensionAvailable(const ImVector& properties, const char* extension) +{ + for (const VkExtensionProperties& p : properties) + if (strcmp(p.extensionName, extension) == 0) + return true; + return false; +} + +static VkPhysicalDevice SetupVulkan_SelectPhysicalDevice() +{ + uint32_t gpu_count; + VkResult err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, nullptr); + check_vk_result(err); + IM_ASSERT(gpu_count > 0); + + ImVector gpus; + gpus.resize(gpu_count); + err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, gpus.Data); + check_vk_result(err); + + // If a number >1 of GPUs got reported, find discrete GPU if present, or use first one available. This covers + // most common cases (multi-gpu/integrated+dedicated graphics). Handling more complicated setups (multiple + // dedicated GPUs) is out of scope of this sample. + for (VkPhysicalDevice& device : gpus) + { + VkPhysicalDeviceProperties properties; + vkGetPhysicalDeviceProperties(device, &properties); + if (properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) + return device; + } + + // Use first GPU (Integrated) is a Discrete one is not available. + if (gpu_count > 0) + return gpus[0]; + return VK_NULL_HANDLE; +} -static void SetupVulkan(const char** extensions, uint32_t extensions_count) +static void SetupVulkan(ImVector instance_extensions) { VkResult err; +#ifdef IMGUI_IMPL_VULKAN_USE_VOLK + volkInitialize(); +#endif // Create Vulkan Instance { VkInstanceCreateInfo create_info = {}; create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; - create_info.enabledExtensionCount = extensions_count; - create_info.ppEnabledExtensionNames = extensions; -#ifdef IMGUI_VULKAN_DEBUG_REPORT + + // Enumerate available extensions + uint32_t properties_count; + ImVector properties; + vkEnumerateInstanceExtensionProperties(nullptr, &properties_count, nullptr); + properties.resize(properties_count); + err = vkEnumerateInstanceExtensionProperties(nullptr, &properties_count, properties.Data); + check_vk_result(err); + + // Enable required extensions + if (IsExtensionAvailable(properties, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) + instance_extensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); +#ifdef VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME + if (IsExtensionAvailable(properties, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)) + { + instance_extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); + create_info.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; + } +#endif + // Enabling validation layers +#ifdef APP_USE_VULKAN_DEBUG_REPORT const char* layers[] = { "VK_LAYER_KHRONOS_validation" }; create_info.enabledLayerCount = 1; create_info.ppEnabledLayerNames = layers; - - // Enable debug report extension (we need additional storage, so we duplicate the user array to add our new extension to it) - const char** extensions_ext = (const char**)malloc(sizeof(const char*) * (extensions_count + 1)); - memcpy(extensions_ext, extensions, extensions_count * sizeof(const char*)); - extensions_ext[extensions_count] = "VK_EXT_debug_report"; - create_info.enabledExtensionCount = extensions_count + 1; - create_info.ppEnabledExtensionNames = extensions_ext; + instance_extensions.push_back("VK_EXT_debug_report"); +#endif // Create Vulkan Instance + create_info.enabledExtensionCount = (uint32_t)instance_extensions.Size; + create_info.ppEnabledExtensionNames = instance_extensions.Data; err = vkCreateInstance(&create_info, g_Allocator, &g_Instance); check_vk_result(err); - free(extensions_ext); - - // Get the function pointer (required for any extensions) - auto vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkCreateDebugReportCallbackEXT"); - IM_ASSERT(vkCreateDebugReportCallbackEXT != NULL); +#ifdef IMGUI_IMPL_VULKAN_USE_VOLK + volkLoadInstance(g_Instance); +#endif // Setup the debug report callback +#ifdef APP_USE_VULKAN_DEBUG_REPORT + auto f_vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkCreateDebugReportCallbackEXT"); + IM_ASSERT(f_vkCreateDebugReportCallbackEXT != nullptr); VkDebugReportCallbackCreateInfoEXT debug_report_ci = {}; debug_report_ci.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT; debug_report_ci.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT; debug_report_ci.pfnCallback = debug_report; - debug_report_ci.pUserData = NULL; - err = vkCreateDebugReportCallbackEXT(g_Instance, &debug_report_ci, g_Allocator, &g_DebugReport); + debug_report_ci.pUserData = nullptr; + err = f_vkCreateDebugReportCallbackEXT(g_Instance, &debug_report_ci, g_Allocator, &g_DebugReport); check_vk_result(err); -#else - // Create Vulkan Instance without any debug feature - err = vkCreateInstance(&create_info, g_Allocator, &g_Instance); - check_vk_result(err); - IM_UNUSED(g_DebugReport); #endif } - // Select GPU - { - uint32_t gpu_count; - err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, NULL); - check_vk_result(err); - IM_ASSERT(gpu_count > 0); - - VkPhysicalDevice* gpus = (VkPhysicalDevice*)malloc(sizeof(VkPhysicalDevice) * gpu_count); - err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, gpus); - check_vk_result(err); - - // If a number >1 of GPUs got reported, find discrete GPU if present, or use first one available. This covers - // most common cases (multi-gpu/integrated+dedicated graphics). Handling more complicated setups (multiple - // dedicated GPUs) is out of scope of this sample. - int use_gpu = 0; - for (int i = 0; i < (int)gpu_count; i++) - { - VkPhysicalDeviceProperties properties; - vkGetPhysicalDeviceProperties(gpus[i], &properties); - if (properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) - { - use_gpu = i; - break; - } - } - - g_PhysicalDevice = gpus[use_gpu]; - free(gpus); - } + // Select Physical Device (GPU) + g_PhysicalDevice = SetupVulkan_SelectPhysicalDevice(); // Select graphics queue family { uint32_t count; - vkGetPhysicalDeviceQueueFamilyProperties(g_PhysicalDevice, &count, NULL); + vkGetPhysicalDeviceQueueFamilyProperties(g_PhysicalDevice, &count, nullptr); VkQueueFamilyProperties* queues = (VkQueueFamilyProperties*)malloc(sizeof(VkQueueFamilyProperties) * count); vkGetPhysicalDeviceQueueFamilyProperties(g_PhysicalDevice, &count, queues); for (uint32_t i = 0; i < count; i++) @@ -159,8 +197,20 @@ static void SetupVulkan(const char** extensions, uint32_t extensions_count) // Create Logical Device (with 1 queue) { - int device_extension_count = 1; - const char* device_extensions[] = { "VK_KHR_swapchain" }; + ImVector device_extensions; + device_extensions.push_back("VK_KHR_swapchain"); + + // Enumerate physical device extension + uint32_t properties_count; + ImVector properties; + vkEnumerateDeviceExtensionProperties(g_PhysicalDevice, nullptr, &properties_count, nullptr); + properties.resize(properties_count); + vkEnumerateDeviceExtensionProperties(g_PhysicalDevice, nullptr, &properties_count, properties.Data); +#ifdef VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME + if (IsExtensionAvailable(properties, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME)) + device_extensions.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME); +#endif + const float queue_priority[] = { 1.0f }; VkDeviceQueueCreateInfo queue_info[1] = {}; queue_info[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; @@ -171,33 +221,25 @@ static void SetupVulkan(const char** extensions, uint32_t extensions_count) create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; create_info.queueCreateInfoCount = sizeof(queue_info) / sizeof(queue_info[0]); create_info.pQueueCreateInfos = queue_info; - create_info.enabledExtensionCount = device_extension_count; - create_info.ppEnabledExtensionNames = device_extensions; + create_info.enabledExtensionCount = (uint32_t)device_extensions.Size; + create_info.ppEnabledExtensionNames = device_extensions.Data; err = vkCreateDevice(g_PhysicalDevice, &create_info, g_Allocator, &g_Device); check_vk_result(err); vkGetDeviceQueue(g_Device, g_QueueFamily, 0, &g_Queue); } // Create Descriptor Pool + // The example only requires a single combined image sampler descriptor for the font image and only uses one descriptor set (for that) + // If you wish to load e.g. additional textures you may need to alter pools sizes. { VkDescriptorPoolSize pool_sizes[] = { - { VK_DESCRIPTOR_TYPE_SAMPLER, 1000 }, - { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1000 }, - { VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1000 }, - { VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1000 }, - { VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1000 }, - { VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1000 }, - { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1000 }, - { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1000 }, - { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1000 }, - { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, 1000 }, - { VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1000 } + { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1 }, }; VkDescriptorPoolCreateInfo pool_info = {}; pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; - pool_info.maxSets = 1000 * IM_ARRAYSIZE(pool_sizes); + pool_info.maxSets = 1; pool_info.poolSizeCount = (uint32_t)IM_ARRAYSIZE(pool_sizes); pool_info.pPoolSizes = pool_sizes; err = vkCreateDescriptorPool(g_Device, &pool_info, g_Allocator, &g_DescriptorPool); @@ -226,7 +268,7 @@ static void SetupVulkanWindow(ImGui_ImplVulkanH_Window* wd, VkSurfaceKHR surface wd->SurfaceFormat = ImGui_ImplVulkanH_SelectSurfaceFormat(g_PhysicalDevice, wd->Surface, requestSurfaceImageFormat, (size_t)IM_ARRAYSIZE(requestSurfaceImageFormat), requestSurfaceColorSpace); // Select Present Mode -#ifdef IMGUI_UNLIMITED_FRAME_RATE +#ifdef APP_USE_UNLIMITED_FRAME_RATE VkPresentModeKHR present_modes[] = { VK_PRESENT_MODE_MAILBOX_KHR, VK_PRESENT_MODE_IMMEDIATE_KHR, VK_PRESENT_MODE_FIFO_KHR }; #else VkPresentModeKHR present_modes[] = { VK_PRESENT_MODE_FIFO_KHR }; @@ -243,11 +285,11 @@ static void CleanupVulkan() { vkDestroyDescriptorPool(g_Device, g_DescriptorPool, g_Allocator); -#ifdef IMGUI_VULKAN_DEBUG_REPORT +#ifdef APP_USE_VULKAN_DEBUG_REPORT // Remove the debug report callback - auto vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkDestroyDebugReportCallbackEXT"); - vkDestroyDebugReportCallbackEXT(g_Instance, g_DebugReport, g_Allocator); -#endif // IMGUI_VULKAN_DEBUG_REPORT + auto f_vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkDestroyDebugReportCallbackEXT"); + f_vkDestroyDebugReportCallbackEXT(g_Instance, g_DebugReport, g_Allocator); +#endif // APP_USE_VULKAN_DEBUG_REPORT vkDestroyDevice(g_Device, g_Allocator); vkDestroyInstance(g_Instance, g_Allocator); @@ -344,33 +386,31 @@ static void FramePresent(ImGui_ImplVulkanH_Window* wd) return; } check_vk_result(err); - wd->SemaphoreIndex = (wd->SemaphoreIndex + 1) % wd->ImageCount; // Now we can use the next set of semaphores -} - -static void glfw_error_callback(int error, const char* description) -{ - fprintf(stderr, "Glfw Error %d: %s\n", error, description); + wd->SemaphoreIndex = (wd->SemaphoreIndex + 1) % wd->SemaphoreCount; // Now we can use the next set of semaphores } +// Main code int main(int, char**) { - // Setup GLFW window glfwSetErrorCallback(glfw_error_callback); if (!glfwInit()) return 1; + // Create window with Vulkan context glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); - GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+Vulkan example", NULL, NULL); - - // Setup Vulkan + GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+Vulkan example", nullptr, nullptr); if (!glfwVulkanSupported()) { printf("GLFW: Vulkan Not Supported\n"); return 1; } + + ImVector extensions; uint32_t extensions_count = 0; - const char** extensions = glfwGetRequiredInstanceExtensions(&extensions_count); - SetupVulkan(extensions, extensions_count); + const char** glfw_extensions = glfwGetRequiredInstanceExtensions(&extensions_count); + for (uint32_t i = 0; i < extensions_count; i++) + extensions.push_back(glfw_extensions[i]); + SetupVulkan(extensions); // Create Window Surface VkSurfaceKHR surface; @@ -387,12 +427,12 @@ int main(int, char**) IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls // Setup Dear ImGui style ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); + //ImGui::StyleColorsLight(); // Setup Platform/Renderer backends ImGui_ImplGlfw_InitForVulkan(window, true); @@ -404,56 +444,30 @@ int main(int, char**) init_info.Queue = g_Queue; init_info.PipelineCache = g_PipelineCache; init_info.DescriptorPool = g_DescriptorPool; - init_info.Allocator = g_Allocator; + init_info.RenderPass = wd->RenderPass; + init_info.Subpass = 0; init_info.MinImageCount = g_MinImageCount; init_info.ImageCount = wd->ImageCount; + init_info.MSAASamples = VK_SAMPLE_COUNT_1_BIT; + init_info.Allocator = g_Allocator; init_info.CheckVkResultFn = check_vk_result; - ImGui_ImplVulkan_Init(&init_info, wd->RenderPass); + ImGui_ImplVulkan_Init(&init_info); // Load Fonts // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. // - Read 'docs/FONTS.md' for more instructions and details. // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); - - // Upload Fonts - { - // Use any command queue - VkCommandPool command_pool = wd->Frames[wd->FrameIndex].CommandPool; - VkCommandBuffer command_buffer = wd->Frames[wd->FrameIndex].CommandBuffer; - - err = vkResetCommandPool(g_Device, command_pool, 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(command_buffer, &begin_info); - check_vk_result(err); - - ImGui_ImplVulkan_CreateFontsTexture(command_buffer); - - VkSubmitInfo end_info = {}; - end_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - end_info.commandBufferCount = 1; - end_info.pCommandBuffers = &command_buffer; - err = vkEndCommandBuffer(command_buffer); - check_vk_result(err); - err = vkQueueSubmit(g_Queue, 1, &end_info, VK_NULL_HANDLE); - check_vk_result(err); - - err = vkDeviceWaitIdle(g_Device); - check_vk_result(err); - ImGui_ImplVulkan_DestroyFontUploadObjects(); - } + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); // Our state bool show_demo_window = true; @@ -465,23 +479,20 @@ int main(int, char**) { // Poll and handle events (inputs, window resize, etc.) // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. - // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. - // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. glfwPollEvents(); // Resize swap chain? - if (g_SwapChainRebuild) + int fb_width, fb_height; + glfwGetFramebufferSize(window, &fb_width, &fb_height); + if (fb_width > 0 && fb_height > 0 && (g_SwapChainRebuild || g_MainWindowData.Width != fb_width || g_MainWindowData.Height != fb_height)) { - int width, height; - glfwGetFramebufferSize(window, &width, &height); - if (width > 0 && height > 0) - { - ImGui_ImplVulkan_SetMinImageCount(g_MinImageCount); - ImGui_ImplVulkanH_CreateOrResizeWindow(g_Instance, g_PhysicalDevice, g_Device, &g_MainWindowData, g_QueueFamily, g_Allocator, width, height, g_MinImageCount); - g_MainWindowData.FrameIndex = 0; - g_SwapChainRebuild = false; - } + ImGui_ImplVulkan_SetMinImageCount(g_MinImageCount); + ImGui_ImplVulkanH_CreateOrResizeWindow(g_Instance, g_PhysicalDevice, g_Device, &g_MainWindowData, g_QueueFamily, g_Allocator, fb_width, fb_height, g_MinImageCount); + g_MainWindowData.FrameIndex = 0; + g_SwapChainRebuild = false; } // Start the Dear ImGui frame @@ -493,7 +504,7 @@ int main(int, char**) if (show_demo_window) ImGui::ShowDemoWindow(&show_demo_window); - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. { static float f = 0.0f; static int counter = 0; @@ -512,7 +523,7 @@ int main(int, char**) ImGui::SameLine(); ImGui::Text("counter = %d", counter); - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); ImGui::End(); } diff --git a/third_party/imgui/examples/example_glfw_wgpu/CMakeLists.txt b/third_party/imgui/examples/example_glfw_wgpu/CMakeLists.txt new file mode 100644 index 00000000000..e682836ddb5 --- /dev/null +++ b/third_party/imgui/examples/example_glfw_wgpu/CMakeLists.txt @@ -0,0 +1,100 @@ +# Building for desktop (WebGPU-native) with Dawn: +# 1. git clone https://github.com/google/dawn dawn +# 2. cmake -B build -DIMGUI_DAWN_DIR=dawn +# 3. cmake --build build +# The resulting binary will be found at one of the following locations: +# * build/Debug/example_glfw_wgpu[.exe] +# * build/example_glfw_wgpu[.exe] + +# Building for Emscripten: +# 1. Install Emscripten SDK following the instructions: https://emscripten.org/docs/getting_started/downloads.html +# 2. Install Ninja build system +# 3. emcmake cmake -G Ninja -B build +# 3. cmake --build build +# 4. emrun build/index.html + +cmake_minimum_required(VERSION 3.10.2) +project(imgui_example_glfw_wgpu C CXX) + +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE) +endif() + +set(CMAKE_CXX_STANDARD 17) # Dawn requires C++17 + +# Dear ImGui +set(IMGUI_DIR ../../) + +# Libraries +if(EMSCRIPTEN) + set(LIBRARIES glfw) + add_compile_options(-sDISABLE_EXCEPTION_CATCHING=1 -DIMGUI_DISABLE_FILE_FUNCTIONS=1) +else() + # Dawn wgpu desktop + set(DAWN_FETCH_DEPENDENCIES ON) + set(IMGUI_DAWN_DIR CACHE PATH "Path to Dawn repository") + if (NOT IMGUI_DAWN_DIR) + message(FATAL_ERROR "Please specify the Dawn repository by setting IMGUI_DAWN_DIR") + endif() + + option(DAWN_FETCH_DEPENDENCIES "Use fetch_dawn_dependencies.py as an alternative to using depot_tools" ON) + + # Dawn builds many things by default - disable things we don't need + option(DAWN_BUILD_SAMPLES "Enables building Dawn's samples" OFF) + option(TINT_BUILD_CMD_TOOLS "Build the Tint command line tools" OFF) + option(TINT_BUILD_DOCS "Build documentation" OFF) + option(TINT_BUILD_TESTS "Build tests" OFF) + if (NOT APPLE) + option(TINT_BUILD_MSL_WRITER "Build the MSL output writer" OFF) + endif() + if(WIN32) + option(TINT_BUILD_SPV_READER "Build the SPIR-V input reader" OFF) + option(TINT_BUILD_WGSL_READER "Build the WGSL input reader" ON) + option(TINT_BUILD_GLSL_WRITER "Build the GLSL output writer" OFF) + option(TINT_BUILD_GLSL_VALIDATOR "Build the GLSL output validator" OFF) + option(TINT_BUILD_SPV_WRITER "Build the SPIR-V output writer" OFF) + option(TINT_BUILD_WGSL_WRITER "Build the WGSL output writer" ON) + endif() + + add_subdirectory("${IMGUI_DAWN_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/dawn" EXCLUDE_FROM_ALL) + + set(LIBRARIES webgpu_dawn webgpu_cpp webgpu_glfw glfw) +endif() + +add_executable(example_glfw_wgpu + main.cpp + # backend files + ${IMGUI_DIR}/backends/imgui_impl_glfw.cpp + ${IMGUI_DIR}/backends/imgui_impl_wgpu.cpp + # Dear ImGui files + ${IMGUI_DIR}/imgui.cpp + ${IMGUI_DIR}/imgui_draw.cpp + ${IMGUI_DIR}/imgui_demo.cpp + ${IMGUI_DIR}/imgui_tables.cpp + ${IMGUI_DIR}/imgui_widgets.cpp +) +target_include_directories(example_glfw_wgpu PUBLIC + ${IMGUI_DIR} + ${IMGUI_DIR}/backends +) + +target_link_libraries(example_glfw_wgpu PUBLIC ${LIBRARIES}) + +# Emscripten settings +if(EMSCRIPTEN) + target_link_options(example_glfw_wgpu PRIVATE + "-sUSE_WEBGPU=1" + "-sUSE_GLFW=3" + "-sWASM=1" + "-sALLOW_MEMORY_GROWTH=1" + "-sNO_EXIT_RUNTIME=0" + "-sASSERTIONS=1" + "-sDISABLE_EXCEPTION_CATCHING=1" + "-sNO_FILESYSTEM=1" + ) + set_target_properties(example_glfw_wgpu PROPERTIES OUTPUT_NAME "index") + # copy our custom index.html to build directory + add_custom_command(TARGET example_glfw_wgpu POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_LIST_DIR}/web/index.html" $ + ) +endif() diff --git a/third_party/imgui/examples/example_emscripten_wgpu/Makefile b/third_party/imgui/examples/example_glfw_wgpu/Makefile.emscripten similarity index 100% rename from third_party/imgui/examples/example_emscripten_wgpu/Makefile rename to third_party/imgui/examples/example_glfw_wgpu/Makefile.emscripten diff --git a/third_party/imgui/examples/example_glfw_wgpu/README.md b/third_party/imgui/examples/example_glfw_wgpu/README.md new file mode 100644 index 00000000000..399d431ffaa --- /dev/null +++ b/third_party/imgui/examples/example_glfw_wgpu/README.md @@ -0,0 +1,24 @@ +## How to Build + +- You need to install Emscripten from https://emscripten.org/docs/getting_started/downloads.html, and have the environment variables set, as described in https://emscripten.org/docs/getting_started/downloads.html#installation-instructions + +- Depending on your configuration, in Windows you may need to run `emsdk/emsdk_env.bat` in your console to access the Emscripten command-line tools. + +- You may also refer to our [Continuous Integration setup](https://github.com/ocornut/imgui/tree/master/.github/workflows) for Emscripten setup. + +- Then build using `make -f Makefile.emscripten` while in the `example_glfw_wgpu/` directory. + +- Requires recent Emscripten as WGPU is still a work-in-progress API. + +## How to Run + +To run on a local machine: +- Make sure your browse supports WGPU and it is enabled. WGPU is still WIP not enabled by default in most browser. +- `make serve` will use Python3 to spawn a local webserver, you can then browse http://localhost:8000 to access your build. +- Otherwise, generally you will need a local webserver: + - Quoting [https://emscripten.org/docs/getting_started](https://emscripten.org/docs/getting_started/Tutorial.html#generating-html):
    +_"Unfortunately several browsers (including Chrome, Safari, and Internet Explorer) do not support file:// [XHR](https://emscripten.org/docs/site/glossary.html#term-xhr) requests, and can’t load extra files needed by the HTML (like a .wasm file, or packaged file data as mentioned lower down). For these browsers you’ll need to serve the files using a [local webserver](https://emscripten.org/docs/getting_started/FAQ.html#faq-local-webserver) and then open http://localhost:8000/hello.html."_ + - Emscripten SDK has a handy `emrun` command: `emrun web/example_glfw_wgpu.html --browser firefox` which will spawn a temporary local webserver (in Firefox). See https://emscripten.org/docs/compiling/Running-html-files-with-emrun.html for details. + - You may use Python 3 builtin webserver: `python -m http.server -d web` (this is what `make serve` uses). + - You may use Python 2 builtin webserver: `cd web && python -m SimpleHTTPServer`. + - If you are accessing the files over a network, certain browsers, such as Firefox, will restrict Gamepad API access to secure contexts only (e.g. https only). diff --git a/third_party/imgui/examples/example_glfw_wgpu/main.cpp b/third_party/imgui/examples/example_glfw_wgpu/main.cpp new file mode 100644 index 00000000000..4e47b8323bd --- /dev/null +++ b/third_party/imgui/examples/example_glfw_wgpu/main.cpp @@ -0,0 +1,345 @@ +// Dear ImGui: standalone example application for using GLFW + WebGPU +// - Emscripten is supported for publishing on web. See https://emscripten.org. +// - Dawn is used as a WebGPU implementation on desktop. + +// 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 + +#include "imgui.h" +#include "imgui_impl_glfw.h" +#include "imgui_impl_wgpu.h" +#include + +#ifdef __EMSCRIPTEN__ +#include +#include +#include +#else +#include +#endif + +#include +#include +#include + +// This example can also compile and run with Emscripten! See 'Makefile.emscripten' for details. +#ifdef __EMSCRIPTEN__ +#include "../libs/emscripten/emscripten_mainloop_stub.h" +#endif + +// Global WebGPU required states +static WGPUInstance wgpu_instance = nullptr; +static WGPUDevice wgpu_device = nullptr; +static WGPUSurface wgpu_surface = nullptr; +static WGPUTextureFormat wgpu_preferred_fmt = WGPUTextureFormat_RGBA8Unorm; +static WGPUSwapChain wgpu_swap_chain = nullptr; +static int wgpu_swap_chain_width = 1280; +static int wgpu_swap_chain_height = 720; + +// Forward declarations +static bool InitWGPU(GLFWwindow* window); +static void CreateSwapChain(int width, int height); + +static void glfw_error_callback(int error, const char* description) +{ + printf("GLFW Error %d: %s\n", error, description); +} + +static void wgpu_error_callback(WGPUErrorType error_type, const char* message, void*) +{ + const char* error_type_lbl = ""; + switch (error_type) + { + case WGPUErrorType_Validation: error_type_lbl = "Validation"; break; + case WGPUErrorType_OutOfMemory: error_type_lbl = "Out of memory"; break; + case WGPUErrorType_Unknown: error_type_lbl = "Unknown"; break; + case WGPUErrorType_DeviceLost: error_type_lbl = "Device lost"; break; + default: error_type_lbl = "Unknown"; + } + printf("%s error: %s\n", error_type_lbl, message); +} + +// Main code +int main(int, char**) +{ + glfwSetErrorCallback(glfw_error_callback); + if (!glfwInit()) + return 1; + + // Make sure GLFW does not initialize any graphics context. + // This needs to be done explicitly later. + glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); + GLFWwindow* window = glfwCreateWindow(wgpu_swap_chain_width, wgpu_swap_chain_height, "Dear ImGui GLFW+WebGPU example", nullptr, nullptr); + if (window == nullptr) + return 1; + + // Initialize the WebGPU environment + if (!InitWGPU(window)) + { + if (window) + glfwDestroyWindow(window); + glfwTerminate(); + return 1; + } + CreateSwapChain(wgpu_swap_chain_width, wgpu_swap_chain_height); + glfwShowWindow(window); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplGlfw_InitForOther(window, true); +#ifdef __EMSCRIPTEN__ + ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback("#canvas"); +#endif + ImGui_ImplWGPU_InitInfo init_info; + init_info.Device = wgpu_device; + init_info.NumFramesInFlight = 3; + init_info.RenderTargetFormat = wgpu_preferred_fmt; + init_info.DepthStencilFormat = WGPUTextureFormat_Undefined; + ImGui_ImplWGPU_Init(&init_info); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + // - Emscripten allows preloading a file or folder to be accessible at runtime. See Makefile for details. + //io.Fonts->AddFontDefault(); +#ifndef IMGUI_DISABLE_FILE_FUNCTIONS + //io.Fonts->AddFontFromFileTTF("fonts/segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("fonts/Cousine-Regular.ttf", 15.0f); + //io.Fonts->AddFontFromFileTTF("fonts/ProggyTiny.ttf", 10.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("fonts/ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); +#endif + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop +#ifdef __EMSCRIPTEN__ + // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file. + // You may manually call LoadIniSettingsFromMemory() to load settings from your own storage. + io.IniFilename = nullptr; + EMSCRIPTEN_MAINLOOP_BEGIN +#else + while (!glfwWindowShouldClose(window)) +#endif + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + glfwPollEvents(); + + // React to changes in screen size + int width, height; + glfwGetFramebufferSize((GLFWwindow*)window, &width, &height); + if (width != wgpu_swap_chain_width || height != wgpu_swap_chain_height) + { + ImGui_ImplWGPU_InvalidateDeviceObjects(); + CreateSwapChain(width, height); + ImGui_ImplWGPU_CreateDeviceObjects(); + } + + // Start the Dear ImGui frame + ImGui_ImplWGPU_NewFrame(); + ImGui_ImplGlfw_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + +#ifndef __EMSCRIPTEN__ + // Tick needs to be called in Dawn to display validation errors + wgpuDeviceTick(wgpu_device); +#endif + + WGPURenderPassColorAttachment color_attachments = {}; + color_attachments.depthSlice = WGPU_DEPTH_SLICE_UNDEFINED; + color_attachments.loadOp = WGPULoadOp_Clear; + color_attachments.storeOp = WGPUStoreOp_Store; + color_attachments.clearValue = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w }; + color_attachments.view = wgpuSwapChainGetCurrentTextureView(wgpu_swap_chain); + + WGPURenderPassDescriptor render_pass_desc = {}; + render_pass_desc.colorAttachmentCount = 1; + render_pass_desc.colorAttachments = &color_attachments; + render_pass_desc.depthStencilAttachment = nullptr; + + WGPUCommandEncoderDescriptor enc_desc = {}; + WGPUCommandEncoder encoder = wgpuDeviceCreateCommandEncoder(wgpu_device, &enc_desc); + + WGPURenderPassEncoder pass = wgpuCommandEncoderBeginRenderPass(encoder, &render_pass_desc); + ImGui_ImplWGPU_RenderDrawData(ImGui::GetDrawData(), pass); + wgpuRenderPassEncoderEnd(pass); + + WGPUCommandBufferDescriptor cmd_buffer_desc = {}; + WGPUCommandBuffer cmd_buffer = wgpuCommandEncoderFinish(encoder, &cmd_buffer_desc); + WGPUQueue queue = wgpuDeviceGetQueue(wgpu_device); + wgpuQueueSubmit(queue, 1, &cmd_buffer); + +#ifndef __EMSCRIPTEN__ + wgpuSwapChainPresent(wgpu_swap_chain); +#endif + + wgpuTextureViewRelease(color_attachments.view); + wgpuRenderPassEncoderRelease(pass); + wgpuCommandEncoderRelease(encoder); + wgpuCommandBufferRelease(cmd_buffer); + } +#ifdef __EMSCRIPTEN__ + EMSCRIPTEN_MAINLOOP_END; +#endif + + // Cleanup + ImGui_ImplWGPU_Shutdown(); + ImGui_ImplGlfw_Shutdown(); + ImGui::DestroyContext(); + + glfwDestroyWindow(window); + glfwTerminate(); + + return 0; +} + +#ifndef __EMSCRIPTEN__ +static WGPUAdapter RequestAdapter(WGPUInstance instance) +{ + auto onAdapterRequestEnded = [](WGPURequestAdapterStatus status, WGPUAdapter adapter, const char* message, void* pUserData) + { + if (status == WGPURequestAdapterStatus_Success) + *(WGPUAdapter*)(pUserData) = adapter; + else + printf("Could not get WebGPU adapter: %s\n", message); +}; + WGPUAdapter adapter; + wgpuInstanceRequestAdapter(instance, nullptr, onAdapterRequestEnded, (void*)&adapter); + return adapter; +} + +static WGPUDevice RequestDevice(WGPUAdapter& adapter) +{ + auto onDeviceRequestEnded = [](WGPURequestDeviceStatus status, WGPUDevice device, const char* message, void* pUserData) + { + if (status == WGPURequestDeviceStatus_Success) + *(WGPUDevice*)(pUserData) = device; + else + printf("Could not get WebGPU device: %s\n", message); + }; + WGPUDevice device; + wgpuAdapterRequestDevice(adapter, nullptr, onDeviceRequestEnded, (void*)&device); + return device; +} +#endif + +static bool InitWGPU(GLFWwindow* window) +{ + wgpu::Instance instance = wgpuCreateInstance(nullptr); + +#ifdef __EMSCRIPTEN__ + wgpu_device = emscripten_webgpu_get_device(); + if (!wgpu_device) + return false; +#else + WGPUAdapter adapter = RequestAdapter(instance.Get()); + if (!adapter) + return false; + wgpu_device = RequestDevice(adapter); +#endif + +#ifdef __EMSCRIPTEN__ + wgpu::SurfaceDescriptorFromCanvasHTMLSelector html_surface_desc = {}; + html_surface_desc.selector = "#canvas"; + wgpu::SurfaceDescriptor surface_desc = {}; + surface_desc.nextInChain = &html_surface_desc; + wgpu::Surface surface = instance.CreateSurface(&surface_desc); + + wgpu::Adapter adapter = {}; + wgpu_preferred_fmt = (WGPUTextureFormat)surface.GetPreferredFormat(adapter); +#else + wgpu::Surface surface = wgpu::glfw::CreateSurfaceForWindow(instance, window); + if (!surface) + return false; + wgpu_preferred_fmt = WGPUTextureFormat_BGRA8Unorm; +#endif + + wgpu_instance = instance.MoveToCHandle(); + wgpu_surface = surface.MoveToCHandle(); + + wgpuDeviceSetUncapturedErrorCallback(wgpu_device, wgpu_error_callback, nullptr); + + return true; +} + +static void CreateSwapChain(int width, int height) +{ + if (wgpu_swap_chain) + wgpuSwapChainRelease(wgpu_swap_chain); + wgpu_swap_chain_width = width; + wgpu_swap_chain_height = height; + WGPUSwapChainDescriptor swap_chain_desc = {}; + swap_chain_desc.usage = WGPUTextureUsage_RenderAttachment; + swap_chain_desc.format = wgpu_preferred_fmt; + swap_chain_desc.width = width; + swap_chain_desc.height = height; + swap_chain_desc.presentMode = WGPUPresentMode_Fifo; + wgpu_swap_chain = wgpuDeviceCreateSwapChain(wgpu_device, wgpu_surface, &swap_chain_desc); +} diff --git a/third_party/imgui/examples/example_glut_opengl2/Makefile b/third_party/imgui/examples/example_glut_opengl2/Makefile index a980f56fb04..7af289dc492 100644 --- a/third_party/imgui/examples/example_glut_opengl2/Makefile +++ b/third_party/imgui/examples/example_glut_opengl2/Makefile @@ -17,7 +17,7 @@ SOURCES += $(IMGUI_DIR)/backends/imgui_impl_glut.cpp $(IMGUI_DIR)/backends/imgui OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) UNAME_S := $(shell uname -s) -CXXFLAGS = -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends CXXFLAGS += -g -Wall -Wformat LIBS = diff --git a/third_party/imgui/examples/example_glut_opengl2/example_glut_opengl2.vcxproj b/third_party/imgui/examples/example_glut_opengl2/example_glut_opengl2.vcxproj index 4c9d00f5cab..c56452b26c5 100644 --- a/third_party/imgui/examples/example_glut_opengl2/example_glut_opengl2.vcxproj +++ b/third_party/imgui/examples/example_glut_opengl2/example_glut_opengl2.vcxproj @@ -91,6 +91,7 @@ Level4 Disabled $(GLUT_INCLUDE_DIR);..\..;..\..\backends;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) true @@ -105,6 +106,7 @@ Level4 Disabled $(GLUT_INCLUDE_DIR);..\..;..\..\backends;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) true @@ -122,6 +124,7 @@ true $(GLUT_INCLUDE_DIR);..\..;..\..\backends;%(AdditionalIncludeDirectories) false + /utf-8 %(AdditionalOptions) true @@ -142,6 +145,7 @@ true $(GLUT_INCLUDE_DIR);..\..;..\..\backends;%(AdditionalIncludeDirectories) false + /utf-8 %(AdditionalOptions) true @@ -172,6 +176,7 @@ + diff --git a/third_party/imgui/examples/example_glut_opengl2/example_glut_opengl2.vcxproj.filters b/third_party/imgui/examples/example_glut_opengl2/example_glut_opengl2.vcxproj.filters index 3c017ba94aa..0ac4a0b2ed0 100644 --- a/third_party/imgui/examples/example_glut_opengl2/example_glut_opengl2.vcxproj.filters +++ b/third_party/imgui/examples/example_glut_opengl2/example_glut_opengl2.vcxproj.filters @@ -55,7 +55,10 @@ - sources + imgui + + + imgui - + \ No newline at end of file diff --git a/third_party/imgui/examples/example_glut_opengl2/main.cpp b/third_party/imgui/examples/example_glut_opengl2/main.cpp index fed62b52c5f..58539ca5f91 100644 --- a/third_party/imgui/examples/example_glut_opengl2/main.cpp +++ b/third_party/imgui/examples/example_glut_opengl2/main.cpp @@ -1,6 +1,10 @@ // Dear ImGui: standalone example application for GLUT/FreeGLUT + OpenGL2, using legacy fixed pipeline -// 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 // !!! GLUT/FreeGLUT IS OBSOLETE PREHISTORIC SOFTWARE. Using GLUT is not recommended unless you really miss the 90's. !!! // !!! If someone or something is teaching you GLUT today, you are being abused. Please show some resistance. !!! @@ -17,28 +21,104 @@ #include "imgui.h" #include "imgui_impl_glut.h" #include "imgui_impl_opengl2.h" +#define GL_SILENCE_DEPRECATION #ifdef __APPLE__ - #include +#include #else - #include +#include #endif #ifdef _MSC_VER #pragma warning (disable: 4505) // unreferenced local function has been removed #endif +// Forward declarations of helper functions +void MainLoopStep(); + // Our state static bool show_demo_window = true; static bool show_another_window = false; static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); -void my_display_code() +int main(int argc, char** argv) +{ + // Create GLUT window + glutInit(&argc, argv); +#ifdef __FREEGLUT_EXT_H__ + glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS); +#endif + glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_MULTISAMPLE); + glutInitWindowSize(1280, 720); + glutCreateWindow("Dear ImGui GLUT+OpenGL2 Example"); + + // Setup GLUT display function + // We will also call ImGui_ImplGLUT_InstallFuncs() to get all the other functions installed for us, + // otherwise it is possible to install our own functions and call the imgui_impl_glut.h functions ourselves. + glutDisplayFunc(MainLoopStep); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + // FIXME: Consider reworking this example to install our own GLUT funcs + forward calls ImGui_ImplGLUT_XXX ones, instead of using ImGui_ImplGLUT_InstallFuncs(). + ImGui_ImplGLUT_Init(); + ImGui_ImplOpenGL2_Init(); + + // Install GLUT handlers (glutReshapeFunc(), glutMotionFunc(), glutPassiveMotionFunc(), glutMouseFunc(), glutKeyboardFunc() etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + ImGui_ImplGLUT_InstallFuncs(); + + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); + + // Main loop + glutMainLoop(); + + // Cleanup + ImGui_ImplOpenGL2_Shutdown(); + ImGui_ImplGLUT_Shutdown(); + ImGui::DestroyContext(); + + return 0; +} + +void MainLoopStep() { + // Start the Dear ImGui frame + ImGui_ImplOpenGL2_NewFrame(); + ImGui_ImplGLUT_NewFrame(); + ImGui::NewFrame(); + ImGuiIO& io = ImGui::GetIO(); + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). if (show_demo_window) ImGui::ShowDemoWindow(&show_demo_window); - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. { static float f = 0.0f; static int counter = 0; @@ -57,7 +137,7 @@ void my_display_code() ImGui::SameLine(); ImGui::Text("counter = %d", counter); - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); ImGui::End(); } @@ -70,19 +150,9 @@ void my_display_code() show_another_window = false; ImGui::End(); } -} - -void glut_display_func() -{ - // Start the Dear ImGui frame - ImGui_ImplOpenGL2_NewFrame(); - ImGui_ImplGLUT_NewFrame(); - - my_display_code(); // Rendering ImGui::Render(); - ImGuiIO& io = ImGui::GetIO(); glViewport(0, 0, (GLsizei)io.DisplaySize.x, (GLsizei)io.DisplaySize.y); glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); glClear(GL_COLOR_BUFFER_BIT); @@ -92,64 +162,3 @@ void glut_display_func() glutSwapBuffers(); glutPostRedisplay(); } - -// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. -// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. -// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. -// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. - -int main(int argc, char** argv) -{ - // Create GLUT window - glutInit(&argc, argv); -#ifdef __FREEGLUT_EXT_H__ - glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS); -#endif - glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_MULTISAMPLE); - glutInitWindowSize(1280, 720); - glutCreateWindow("Dear ImGui GLUT+OpenGL2 Example"); - - // Setup GLUT display function - // We will also call ImGui_ImplGLUT_InstallFuncs() to get all the other functions installed for us, - // otherwise it is possible to install our own functions and call the imgui_impl_glut.h functions ourselves. - glutDisplayFunc(glut_display_func); - - // Setup Dear ImGui context - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); - ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - - // Setup Dear ImGui style - ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); - - // Setup Platform/Renderer backends - ImGui_ImplGLUT_Init(); - ImGui_ImplGLUT_InstallFuncs(); - ImGui_ImplOpenGL2_Init(); - - // Load Fonts - // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. - // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). - // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. - // - Read 'docs/FONTS.md' for more instructions and details. - // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! - //io.Fonts->AddFontDefault(); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); - - glutMainLoop(); - - // Cleanup - ImGui_ImplOpenGL2_Shutdown(); - ImGui_ImplGLUT_Shutdown(); - ImGui::DestroyContext(); - - return 0; -} diff --git a/third_party/imgui/examples/example_null/Makefile b/third_party/imgui/examples/example_null/Makefile index 9208e8a080a..9ceb353493b 100644 --- a/third_party/imgui/examples/example_null/Makefile +++ b/third_party/imgui/examples/example_null/Makefile @@ -17,7 +17,7 @@ SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) UNAME_S := $(shell uname -s) -CXXFLAGS += -I$(IMGUI_DIR) +CXXFLAGS += -std=c++11 -I$(IMGUI_DIR) CXXFLAGS += -g -Wall -Wformat LIBS = @@ -52,7 +52,7 @@ endif ifeq ($(UNAME_S), Darwin) #APPLE ECHO_MESSAGE = "Mac OS X" ifeq ($(WITH_EXTRA_WARNINGS), 1) - CXXFLAGS += -Weverything -Wno-reserved-id-macro -Wno-c++98-compat-pedantic -Wno-padded -Wno-c++11-long-long -Wno-poison-system-directories + CXXFLAGS += -Weverything -Wno-reserved-id-macro -Wno-c++98-compat-pedantic -Wno-padded -Wno-poison-system-directories endif CFLAGS = $(CXXFLAGS) endif diff --git a/third_party/imgui/examples/example_null/build_win32.bat b/third_party/imgui/examples/example_null/build_win32.bat index 0cdfdc93b8f..be81d80936f 100644 --- a/third_party/imgui/examples/example_null/build_win32.bat +++ b/third_party/imgui/examples/example_null/build_win32.bat @@ -1,3 +1,3 @@ @REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. mkdir Debug -cl /nologo /Zi /MD /I ..\.. %* *.cpp ..\..\*.cpp /FeDebug/example_null.exe /FoDebug/ /link gdi32.lib shell32.lib imm32.lib +cl /nologo /Zi /MD /utf-8 /I ..\.. %* *.cpp ..\..\*.cpp /FeDebug/example_null.exe /FoDebug/ /link gdi32.lib shell32.lib imm32.lib diff --git a/third_party/imgui/examples/example_null/main.cpp b/third_party/imgui/examples/example_null/main.cpp index 72381f0afa6..f7153cc4888 100644 --- a/third_party/imgui/examples/example_null/main.cpp +++ b/third_party/imgui/examples/example_null/main.cpp @@ -11,7 +11,7 @@ int main(int, char**) ImGuiIO& io = ImGui::GetIO(); // Build atlas - unsigned char* tex_pixels = NULL; + unsigned char* tex_pixels = nullptr; int tex_w, tex_h; io.Fonts->GetTexDataAsRGBA32(&tex_pixels, &tex_w, &tex_h); @@ -26,7 +26,7 @@ int main(int, char**) ImGui::Text("Hello, world!"); ImGui::SliderFloat("float", &f, 0.0f, 1.0f); ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); - ImGui::ShowDemoWindow(NULL); + ImGui::ShowDemoWindow(nullptr); ImGui::Render(); } diff --git a/third_party/imgui/examples/example_sdl2_directx11/build_win32.bat b/third_party/imgui/examples/example_sdl2_directx11/build_win32.bat new file mode 100644 index 00000000000..f0b485ca68b --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_directx11/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_sdl2_directx11 +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include /I "%WindowsSdkDir%Include\um" /I "%WindowsSdkDir%Include\shared" /I "%DXSDK_DIR%Include" +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_dx11.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib /LIBPATH:"%DXSDK_DIR%/Lib/x86" d3d11.lib d3dcompiler.lib shell32.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/third_party/imgui/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj b/third_party/imgui/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj new file mode 100644 index 00000000000..c23800c9e4a --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj @@ -0,0 +1,187 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {9E1987E3-1F19-45CA-B9C9-D31E791836D8} + example_sdl2_directx11 + 8.1 + example_sdl2_directx11 + + + + Application + true + MultiByte + v140 + + + Application + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) + + + true + %SDL2_DIR%\lib\x86;$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories) + SDL2.lib;SDL2main.lib;d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) + + + true + %SDL2_DIR%\lib\x64;$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories) + SDL2.lib;SDL2main.lib;d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + false + /utf-8 %(AdditionalOptions) + + + true + true + true + %SDL2_DIR%\lib\x86;$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories) + SDL2.lib;SDL2main.lib;d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + Console + + + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + false + /utf-8 %(AdditionalOptions) + + + true + true + true + %SDL2_DIR%\lib\x64;$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories) + SDL2.lib;SDL2main.lib;d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/imgui/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj.filters b/third_party/imgui/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj.filters new file mode 100644 index 00000000000..92d11f88e91 --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj.filters @@ -0,0 +1,63 @@ + + + + + {0587d7a3-f2ce-4d56-b84f-a0005d3bfce6} + + + {08e36723-ce4f-4cff-9662-c40801cf1acf} + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + imgui + + + sources + + + imgui + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + + imgui + + + imgui + + + \ No newline at end of file diff --git a/third_party/imgui/examples/example_sdl2_directx11/main.cpp b/third_party/imgui/examples/example_sdl2_directx11/main.cpp new file mode 100644 index 00000000000..3275bafde50 --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_directx11/main.cpp @@ -0,0 +1,245 @@ +// Dear ImGui: standalone example application for SDL2 + DirectX 11 +// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) + +// 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 + +#include "imgui.h" +#include "imgui_impl_sdl2.h" +#include "imgui_impl_dx11.h" +#include +#include +#include +#include + +// Data +static ID3D11Device* g_pd3dDevice = nullptr; +static ID3D11DeviceContext* g_pd3dDeviceContext = nullptr; +static IDXGISwapChain* g_pSwapChain = nullptr; +static ID3D11RenderTargetView* g_mainRenderTargetView = nullptr; + +// Forward declarations of helper functions +bool CreateDeviceD3D(HWND hWnd); +void CleanupDeviceD3D(); +void CreateRenderTarget(); +void CleanupRenderTarget(); + +// Main code +int main(int, char**) +{ + // Setup SDL + // (Some versions of SDL before <2.0.10 appears to have performance/stalling issues on a minority of Windows systems, + // depending on whether SDL_INIT_GAMECONTROLLER is enabled or disabled.. updating to the latest version of SDL is recommended!) + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) + { + printf("Error: %s\n", SDL_GetError()); + return -1; + } + + // From 2.0.18: Enable native IME. +#ifdef SDL_HINT_IME_SHOW_UI + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + + // Setup window + SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); + SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+DirectX11 example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); + if (window == nullptr) + { + printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); + return -1; + } + + SDL_SysWMinfo wmInfo; + SDL_VERSION(&wmInfo.version); + SDL_GetWindowWMInfo(window, &wmInfo); + HWND hwnd = (HWND)wmInfo.info.win.window; + + // Initialize Direct3D + if (!CreateDeviceD3D(hwnd)) + { + CleanupDeviceD3D(); + return 1; + } + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplSDL2_InitForD3D(window); + ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + bool done = false; + while (!done) + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + SDL_Event event; + while (SDL_PollEvent(&event)) + { + ImGui_ImplSDL2_ProcessEvent(&event); + if (event.type == SDL_QUIT) + done = true; + if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) + done = true; + if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_RESIZED && event.window.windowID == SDL_GetWindowID(window)) + { + // Release all outstanding references to the swap chain's buffers before resizing. + CleanupRenderTarget(); + g_pSwapChain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0); + CreateRenderTarget(); + } + } + + // Start the Dear ImGui frame + ImGui_ImplDX11_NewFrame(); + ImGui_ImplSDL2_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + const float clear_color_with_alpha[4] = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w }; + g_pd3dDeviceContext->OMSetRenderTargets(1, &g_mainRenderTargetView, nullptr); + g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView, clear_color_with_alpha); + ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); + + g_pSwapChain->Present(1, 0); // Present with vsync + //g_pSwapChain->Present(0, 0); // Present without vsync + } + + // Cleanup + ImGui_ImplDX11_Shutdown(); + ImGui_ImplSDL2_Shutdown(); + ImGui::DestroyContext(); + + CleanupDeviceD3D(); + SDL_DestroyWindow(window); + SDL_Quit(); + + return 0; +} + +// Helper functions to use DirectX11 +bool CreateDeviceD3D(HWND hWnd) +{ + // Setup swap chain + DXGI_SWAP_CHAIN_DESC sd; + ZeroMemory(&sd, sizeof(sd)); + sd.BufferCount = 2; + sd.BufferDesc.Width = 0; + sd.BufferDesc.Height = 0; + sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + sd.BufferDesc.RefreshRate.Numerator = 60; + sd.BufferDesc.RefreshRate.Denominator = 1; + sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; + sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + sd.OutputWindow = hWnd; + sd.SampleDesc.Count = 1; + sd.SampleDesc.Quality = 0; + sd.Windowed = TRUE; + sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; + + UINT createDeviceFlags = 0; + //createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; + D3D_FEATURE_LEVEL featureLevel; + const D3D_FEATURE_LEVEL featureLevelArray[2] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_0, }; + if (D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext) != S_OK) + return false; + + CreateRenderTarget(); + return true; +} + +void CleanupDeviceD3D() +{ + CleanupRenderTarget(); + if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = nullptr; } + if (g_pd3dDeviceContext) { g_pd3dDeviceContext->Release(); g_pd3dDeviceContext = nullptr; } + if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = nullptr; } +} + +void CreateRenderTarget() +{ + ID3D11Texture2D* pBackBuffer; + g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer)); + g_pd3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, &g_mainRenderTargetView); + pBackBuffer->Release(); +} + +void CleanupRenderTarget() +{ + if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = nullptr; } +} diff --git a/third_party/imgui/examples/example_sdl2_metal/Makefile b/third_party/imgui/examples/example_sdl2_metal/Makefile new file mode 100644 index 00000000000..53c5f75db37 --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_metal/Makefile @@ -0,0 +1,47 @@ +# +# You will need SDL2 (http://www.libsdl.org): +# brew install sdl2 +# + +#CXX = g++ +#CXX = clang++ + +EXE = example_sdl2_metal +IMGUI_DIR = ../.. +SOURCES = main.mm +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl2.cpp $(IMGUI_DIR)/backends/imgui_impl_metal.mm +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) + +LIBS = -framework Metal -framework MetalKit -framework Cocoa -framework IOKit -framework CoreVideo -framework QuartzCore +LIBS += `sdl2-config --libs` +LIBS += -L/usr/local/lib + +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends -I/usr/local/include +CXXFLAGS += `sdl2-config --cflags` +CXXFLAGS += -Wall -Wformat +CFLAGS = $(CXXFLAGS) + +%.o:%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:%.mm + $(CXX) $(CXXFLAGS) -ObjC++ -fobjc-weak -fobjc-arc -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.mm + $(CXX) $(CXXFLAGS) -ObjC++ -fobjc-weak -fobjc-arc -c -o $@ $< + +all: $(EXE) + @echo Build complete + +$(EXE): $(OBJS) + $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) + +clean: + rm -f $(EXE) $(OBJS) diff --git a/third_party/imgui/examples/example_sdl_metal/main.mm b/third_party/imgui/examples/example_sdl2_metal/main.mm similarity index 84% rename from third_party/imgui/examples/example_sdl_metal/main.mm rename to third_party/imgui/examples/example_sdl2_metal/main.mm index caa86e644da..d54812710c5 100644 --- a/third_party/imgui/examples/example_sdl_metal/main.mm +++ b/third_party/imgui/examples/example_sdl2_metal/main.mm @@ -1,10 +1,14 @@ // Dear ImGui: standalone example application for SDL2 + Metal // (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) -// 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 #include "imgui.h" -#include "imgui_impl_sdl.h" +#include "imgui_impl_sdl2.h" #include "imgui_impl_metal.h" #include #include @@ -18,27 +22,28 @@ int main(int, char**) IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls // Setup style ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); + //ImGui::StyleColorsLight(); // Load Fonts // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. - // - Read 'docs/FONTS.txt' for more instructions and details. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); // Setup SDL // (Some versions of SDL before <2.0.10 appears to have performance/stalling issues on a minority of Windows systems, @@ -52,15 +57,18 @@ int main(int, char**) // Inform SDL that we will be using metal for rendering. Without this hint initialization of metal renderer may fail. SDL_SetHint(SDL_HINT_RENDER_DRIVER, "metal"); + // Enable native IME. + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); + SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL+Metal example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); - if (window == NULL) + if (window == nullptr) { printf("Error creating window: %s\n", SDL_GetError()); return -2; } SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); - if (renderer == NULL) + if (renderer == nullptr) { printf("Error creating renderer: %s\n", SDL_GetError()); return -3; @@ -88,8 +96,8 @@ int main(int, char**) { // Poll and handle events (inputs, window resize, etc.) // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. - // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. - // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. SDL_Event event; while (SDL_PollEvent(&event)) @@ -123,7 +131,7 @@ int main(int, char**) if (show_demo_window) ImGui::ShowDemoWindow(&show_demo_window); - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. { static float f = 0.0f; static int counter = 0; @@ -142,7 +150,7 @@ int main(int, char**) ImGui::SameLine(); ImGui::Text("counter = %d", counter); - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); ImGui::End(); } diff --git a/third_party/imgui/examples/example_sdl2_opengl2/Makefile b/third_party/imgui/examples/example_sdl2_opengl2/Makefile new file mode 100644 index 00000000000..a85ced0232a --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_opengl2/Makefile @@ -0,0 +1,79 @@ +# +# Cross Platform Makefile +# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X +# +# You will need SDL2 (http://www.libsdl.org): +# Linux: +# apt-get install libsdl2-dev +# Mac OS X: +# brew install sdl2 +# MSYS2: +# pacman -S mingw-w64-i686-SDL2 +# + +#CXX = g++ +#CXX = clang++ + +EXE = example_sdl2_opengl2 +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl2.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl2.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) + +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +CXXFLAGS += -g -Wall -Wformat +LIBS = + +##--------------------------------------------------------------------- +## BUILD FLAGS PER PLATFORM +##--------------------------------------------------------------------- + +ifeq ($(UNAME_S), Linux) #LINUX + ECHO_MESSAGE = "Linux" + LIBS += -lGL -ldl `sdl2-config --libs` + + CXXFLAGS += `sdl2-config --cflags` + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(UNAME_S), Darwin) #APPLE + ECHO_MESSAGE = "Mac OS X" + LIBS += -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo `sdl2-config --libs` + LIBS += -L/usr/local/lib -L/opt/local/lib + + CXXFLAGS += `sdl2-config --cflags` + CXXFLAGS += -I/usr/local/include -I/opt/local/include + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(OS), Windows_NT) + ECHO_MESSAGE = "MinGW" + LIBS += -lgdi32 -lopengl32 -limm32 `pkg-config --static --libs sdl2` + + CXXFLAGS += `pkg-config --cflags sdl2` + CFLAGS = $(CXXFLAGS) +endif + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(ECHO_MESSAGE) + +$(EXE): $(OBJS) + $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) + +clean: + rm -f $(EXE) $(OBJS) diff --git a/third_party/imgui/examples/example_sdl2_opengl2/README.md b/third_party/imgui/examples/example_sdl2_opengl2/README.md new file mode 100644 index 00000000000..40a49e691bb --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_opengl2/README.md @@ -0,0 +1,29 @@ + +# How to Build + +- On Windows with Visual Studio's IDE + +Use the provided project file (.vcxproj). Add to solution (imgui_examples.sln) if necessary. + +- On Windows with Visual Studio's CLI + +``` +set SDL2_DIR=path_to_your_sdl2_folder +cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_opengl2.cpp ..\..\imgui*.cpp /FeDebug/example_sdl2_opengl2.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console +# ^^ include paths ^^ source files ^^ output exe ^^ output dir ^^ libraries +# or for 64-bit: +cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_opengl2.cpp ..\..\imgui*.cpp /FeDebug/example_sdl2_opengl2.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x64 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console +``` + +- On Linux and similar Unixes + +``` +c++ `sdl2-config --cflags` -I .. -I ../.. -I ../../backends main.cpp ../../backends/imgui_impl_sdl2.cpp ../../backends/imgui_impl_opengl2.cpp ../../imgui*.cpp `sdl2-config --libs` -lGL +``` + +- On Mac OS X + +``` +brew install sdl2 +c++ `sdl2-config --cflags` -I .. -I ../.. -I ../../backends main.cpp ../../backends/imgui_impl_sdl2.cpp ../../backends/imgui_impl_opengl2.cpp ../../imgui*.cpp `sdl2-config --libs` -framework OpenGl +``` diff --git a/third_party/imgui/examples/example_sdl2_opengl2/build_win32.bat b/third_party/imgui/examples/example_sdl2_opengl2/build_win32.bat new file mode 100644 index 00000000000..7543edafc3d --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_opengl2/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_sdl2_opengl2 +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_opengl2.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib opengl32.lib shell32.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/third_party/imgui/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj b/third_party/imgui/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj new file mode 100644 index 00000000000..036463f96bf --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj @@ -0,0 +1,186 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741} + example_sdl2_opengl2 + 8.1 + + + + Application + true + MultiByte + v140 + + + Application + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) + + + true + %SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) + opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) + + + true + %SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) + opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + false + /utf-8 %(AdditionalOptions) + + + true + true + true + %SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) + opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + + + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + false + /utf-8 %(AdditionalOptions) + + + true + true + true + %SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) + opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/imgui/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj.filters b/third_party/imgui/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj.filters new file mode 100644 index 00000000000..752a1965d9f --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj.filters @@ -0,0 +1,64 @@ + + + + + {20b90ce4-7fcb-4731-b9a0-075f875de82d} + + + {f18ab499-84e1-499f-8eff-9754361e0e52} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + imgui + + + imgui + + + imgui + + + sources + + + imgui + + + imgui + + + sources + + + sources + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + + imgui + + + imgui + + + \ No newline at end of file diff --git a/third_party/imgui/examples/example_sdl2_opengl2/main.cpp b/third_party/imgui/examples/example_sdl2_opengl2/main.cpp new file mode 100644 index 00000000000..efb28edbc41 --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_opengl2/main.cpp @@ -0,0 +1,171 @@ +// Dear ImGui: standalone example application for SDL2 + OpenGL +// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) + +// 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 + +// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)** +// **Prefer using the code in the example_sdl2_opengl3/ folder** +// See imgui_impl_sdl2.cpp for details. + +#include "imgui.h" +#include "imgui_impl_sdl2.h" +#include "imgui_impl_opengl2.h" +#include +#include +#include + +// Main code +int main(int, char**) +{ + // Setup SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) + { + printf("Error: %s\n", SDL_GetError()); + return -1; + } + + // From 2.0.18: Enable native IME. +#ifdef SDL_HINT_IME_SHOW_UI + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + + // Setup window + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); + SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); + SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); + SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+OpenGL example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); + if (window == nullptr) + { + printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); + return -1; + } + + SDL_GLContext gl_context = SDL_GL_CreateContext(window); + SDL_GL_MakeCurrent(window, gl_context); + SDL_GL_SetSwapInterval(1); // Enable vsync + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplSDL2_InitForOpenGL(window, gl_context); + ImGui_ImplOpenGL2_Init(); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + bool done = false; + while (!done) + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + SDL_Event event; + while (SDL_PollEvent(&event)) + { + ImGui_ImplSDL2_ProcessEvent(&event); + if (event.type == SDL_QUIT) + done = true; + if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) + done = true; + } + + // Start the Dear ImGui frame + ImGui_ImplOpenGL2_NewFrame(); + ImGui_ImplSDL2_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); + glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); + glClear(GL_COLOR_BUFFER_BIT); + //glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context where shaders may be bound + ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData()); + SDL_GL_SwapWindow(window); + } + + // Cleanup + ImGui_ImplOpenGL2_Shutdown(); + ImGui_ImplSDL2_Shutdown(); + ImGui::DestroyContext(); + + SDL_GL_DeleteContext(gl_context); + SDL_DestroyWindow(window); + SDL_Quit(); + + return 0; +} diff --git a/third_party/imgui/examples/example_sdl2_opengl3/Makefile b/third_party/imgui/examples/example_sdl2_opengl3/Makefile new file mode 100644 index 00000000000..5b4f9419c08 --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_opengl3/Makefile @@ -0,0 +1,91 @@ +# +# Cross Platform Makefile +# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X +# +# You will need SDL2 (http://www.libsdl.org): +# Linux: +# apt-get install libsdl2-dev +# Mac OS X: +# brew install sdl2 +# MSYS2: +# pacman -S mingw-w64-i686-SDL2 +# + +#CXX = g++ +#CXX = clang++ + +EXE = example_sdl2_opengl3 +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl2.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl3.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) +LINUX_GL_LIBS = -lGL + +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +CXXFLAGS += -g -Wall -Wformat +LIBS = + +##--------------------------------------------------------------------- +## OPENGL ES +##--------------------------------------------------------------------- + +## This assumes a GL ES library available in the system, e.g. libGLESv2.so +# CXXFLAGS += -DIMGUI_IMPL_OPENGL_ES2 +# LINUX_GL_LIBS = -lGLESv2 +## If you're on a Raspberry Pi and want to use the legacy drivers, +## use the following instead: +# LINUX_GL_LIBS = -L/opt/vc/lib -lbrcmGLESv2 + +##--------------------------------------------------------------------- +## BUILD FLAGS PER PLATFORM +##--------------------------------------------------------------------- + +ifeq ($(UNAME_S), Linux) #LINUX + ECHO_MESSAGE = "Linux" + LIBS += $(LINUX_GL_LIBS) -ldl `sdl2-config --libs` + + CXXFLAGS += `sdl2-config --cflags` + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(UNAME_S), Darwin) #APPLE + ECHO_MESSAGE = "Mac OS X" + LIBS += -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo `sdl2-config --libs` + LIBS += -L/usr/local/lib -L/opt/local/lib + + CXXFLAGS += `sdl2-config --cflags` + CXXFLAGS += -I/usr/local/include -I/opt/local/include + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(OS), Windows_NT) + ECHO_MESSAGE = "MinGW" + LIBS += -lgdi32 -lopengl32 -limm32 `pkg-config --static --libs sdl2` + + CXXFLAGS += `pkg-config --cflags sdl2` + CFLAGS = $(CXXFLAGS) +endif + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(ECHO_MESSAGE) + +$(EXE): $(OBJS) + $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) + +clean: + rm -f $(EXE) $(OBJS) diff --git a/third_party/imgui/examples/example_sdl2_opengl3/Makefile.emscripten b/third_party/imgui/examples/example_sdl2_opengl3/Makefile.emscripten new file mode 100644 index 00000000000..da0348435d0 --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_opengl3/Makefile.emscripten @@ -0,0 +1,92 @@ +# +# Makefile to use with SDL+emscripten +# See https://emscripten.org/docs/getting_started/downloads.html +# for installation instructions. +# +# This Makefile assumes you have loaded emscripten's environment. +# (On Windows, you may need to execute emsdk_env.bat or encmdprompt.bat ahead) +# +# Running `make -f Makefile.emscripten` will produce three files: +# - web/index.html +# - web/index.js +# - web/index.wasm +# +# All three are needed to run the demo. + +CC = emcc +CXX = em++ +WEB_DIR = web +EXE = $(WEB_DIR)/index.html +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl2.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl3.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) +CPPFLAGS = +LDFLAGS = +EMS = + +##--------------------------------------------------------------------- +## EMSCRIPTEN OPTIONS +##--------------------------------------------------------------------- + +# ("EMS" options gets added to both CPPFLAGS and LDFLAGS, whereas some options are for linker only) +EMS += -s USE_SDL=2 +EMS += -s DISABLE_EXCEPTION_CATCHING=1 +LDFLAGS += -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=0 -s ASSERTIONS=1 + +# Uncomment next line to fix possible rendering bugs with Emscripten version older then 1.39.0 (https://github.com/ocornut/imgui/issues/2877) +#EMS += -s BINARYEN_TRAP_MODE=clamp +#EMS += -s SAFE_HEAP=1 ## Adds overhead + +# Emscripten allows preloading a file or folder to be accessible at runtime. +# The Makefile for this example project suggests embedding the misc/fonts/ folder into our application, it will then be accessible as "/fonts" +# See documentation for more details: https://emscripten.org/docs/porting/files/packaging_files.html +# (Default value is 0. Set to 1 to enable file-system and include the misc/fonts/ folder as part of the build.) +USE_FILE_SYSTEM ?= 0 +ifeq ($(USE_FILE_SYSTEM), 0) +LDFLAGS += -s NO_FILESYSTEM=1 +CPPFLAGS += -DIMGUI_DISABLE_FILE_FUNCTIONS +endif +ifeq ($(USE_FILE_SYSTEM), 1) +LDFLAGS += --no-heap-copy --preload-file ../../misc/fonts@/fonts +endif + +##--------------------------------------------------------------------- +## FINAL BUILD FLAGS +##--------------------------------------------------------------------- + +CPPFLAGS += -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +#CPPFLAGS += -g +CPPFLAGS += -Wall -Wformat -Os $(EMS) +LDFLAGS += --shell-file ../libs/emscripten/shell_minimal.html +LDFLAGS += $(EMS) + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(EXE) + +$(WEB_DIR): + mkdir $@ + +serve: all + python3 -m http.server -d $(WEB_DIR) + +$(EXE): $(OBJS) $(WEB_DIR) + $(CXX) -o $@ $(OBJS) $(LDFLAGS) + +clean: + rm -rf $(OBJS) $(WEB_DIR) diff --git a/third_party/imgui/examples/example_sdl2_opengl3/README.md b/third_party/imgui/examples/example_sdl2_opengl3/README.md new file mode 100644 index 00000000000..81fd9fe7b7d --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_opengl3/README.md @@ -0,0 +1,57 @@ + +# How to Build + +## Windows with Visual Studio's IDE + +Use the provided project file (.vcxproj). Add to solution (imgui_examples.sln) if necessary. + +## Windows with Visual Studio's CLI + +Use build_win32.bat or directly: +``` +set SDL2_DIR=path_to_your_sdl2_folder +cl /Zi /MD /utf-8 /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp /FeDebug/example_sdl2_opengl3.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console +# ^^ include paths ^^ source files ^^ output exe ^^ output dir ^^ libraries +# or for 64-bit: +cl /Zi /MD /utf-8 /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp /FeDebug/example_sdl2_opengl3.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x64 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console +``` + +## Linux and similar Unixes + +Use our Makefile or directly: +``` +c++ `sdl2-config --cflags` -I .. -I ../.. -I ../../backends + main.cpp ../../backends/imgui_impl_sdl2.cpp ../../backends/imgui_impl_opengl3.cpp ../../imgui*.cpp + `sdl2-config --libs` -lGL -ldl +``` + +## macOS + +Use our Makefile or directly: +``` +brew install sdl2 +c++ `sdl2-config --cflags` -I .. -I ../.. -I ../../backends + main.cpp ../../backends/imgui_impl_sdl2.cpp ../../backends/imgui_impl_opengl3.cpp ../../imgui*.cpp + `sdl2-config --libs` -framework OpenGl -framework CoreFoundation +``` + +## Emscripten + +**Building** + +You need to install Emscripten from https://emscripten.org/docs/getting_started/downloads.html, and have the environment variables set, as described in https://emscripten.org/docs/getting_started/downloads.html#installation-instructions + +- Depending on your configuration, in Windows you may need to run `emsdk/emsdk_env.bat` in your console to access the Emscripten command-line tools. +- You may also refer to our [Continuous Integration setup](https://github.com/ocornut/imgui/tree/master/.github/workflows) for Emscripten setup. +- Then build using `make -f Makefile.emscripten` while in the current directory. + +**Running an Emscripten project** + +To run on a local machine: +- `make -f Makefile.emscripten serve` will use Python3 to spawn a local webserver, you can then browse http://localhost:8000 to access your build. +- Otherwise, generally you will need a local webserver. Quoting [https://emscripten.org/docs/getting_started](https://emscripten.org/docs/getting_started/Tutorial.html#generating-html):
    +_"Unfortunately several browsers (including Chrome, Safari, and Internet Explorer) do not support file:// [XHR](https://emscripten.org/docs/site/glossary.html#term-xhr) requests, and can’t load extra files needed by the HTML (like a .wasm file, or packaged file data as mentioned lower down). For these browsers you’ll need to serve the files using a [local webserver](https://emscripten.org/docs/getting_started/FAQ.html#faq-local-webserver) and then open http://localhost:8000/hello.html."_ +- Emscripten SDK has a handy `emrun` command: `emrun web/index.html --browser firefox` which will spawn a temporary local webserver (in Firefox). See https://emscripten.org/docs/compiling/Running-html-files-with-emrun.html for details. +- You may use Python 3 builtin webserver: `python -m http.server -d web` (this is what `make serve` uses). +- You may use Python 2 builtin webserver: `cd web && python -m SimpleHTTPServer`. +- If you are accessing the files over a network, certain browsers, such as Firefox, will restrict Gamepad API access to secure contexts only (e.g. https only). diff --git a/third_party/imgui/examples/example_sdl2_opengl3/build_win32.bat b/third_party/imgui/examples/example_sdl2_opengl3/build_win32.bat new file mode 100644 index 00000000000..7b2fac9223f --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_opengl3/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_sdl2_opengl3 +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib opengl32.lib shell32.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/third_party/imgui/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj b/third_party/imgui/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj new file mode 100644 index 00000000000..6a81c67704b --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj @@ -0,0 +1,187 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {BBAEB705-1669-40F3-8567-04CF6A991F4C} + example_sdl2_opengl3 + 8.1 + + + + Application + true + MultiByte + v140 + + + Application + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) + + + true + %SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) + opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) + + + true + %SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) + opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + false + /utf-8 %(AdditionalOptions) + + + true + true + true + %SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) + opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + + + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + false + /utf-8 %(AdditionalOptions) + + + true + true + true + %SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) + opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/imgui/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj.filters b/third_party/imgui/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj.filters new file mode 100644 index 00000000000..846d5575957 --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj.filters @@ -0,0 +1,67 @@ + + + + + {20b90ce4-7fcb-4731-b9a0-075f875de82d} + + + {f18ab499-84e1-499f-8eff-9754361e0e52} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + sources + + + imgui + + + imgui + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + sources + + + + + + imgui + + + imgui + + + \ No newline at end of file diff --git a/third_party/imgui/examples/example_sdl2_opengl3/main.cpp b/third_party/imgui/examples/example_sdl2_opengl3/main.cpp new file mode 100644 index 00000000000..d748c1360bb --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_opengl3/main.cpp @@ -0,0 +1,208 @@ +// Dear ImGui: standalone example application for SDL2 + OpenGL +// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) + +// 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 + +#include "imgui.h" +#include "imgui_impl_sdl2.h" +#include "imgui_impl_opengl3.h" +#include +#include +#if defined(IMGUI_IMPL_OPENGL_ES2) +#include +#else +#include +#endif + +// This example can also compile and run with Emscripten! See 'Makefile.emscripten' for details. +#ifdef __EMSCRIPTEN__ +#include "../libs/emscripten/emscripten_mainloop_stub.h" +#endif + +// Main code +int main(int, char**) +{ + // Setup SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) + { + printf("Error: %s\n", SDL_GetError()); + return -1; + } + + // Decide GL+GLSL versions +#if defined(IMGUI_IMPL_OPENGL_ES2) + // GL ES 2.0 + GLSL 100 + const char* glsl_version = "#version 100"; + SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); +#elif defined(__APPLE__) + // GL 3.2 Core + GLSL 150 + const char* glsl_version = "#version 150"; + SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); // Always required on Mac + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); +#else + // GL 3.0 + GLSL 130 + const char* glsl_version = "#version 130"; + SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); +#endif + + // From 2.0.18: Enable native IME. +#ifdef SDL_HINT_IME_SHOW_UI + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + + // Create window with graphics context + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); + SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); + SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); + SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+OpenGL3 example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); + if (window == nullptr) + { + printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); + return -1; + } + + SDL_GLContext gl_context = SDL_GL_CreateContext(window); + SDL_GL_MakeCurrent(window, gl_context); + SDL_GL_SetSwapInterval(1); // Enable vsync + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplSDL2_InitForOpenGL(window, gl_context); + ImGui_ImplOpenGL3_Init(glsl_version); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + // - Our Emscripten build process allows embedding fonts to be accessible at runtime from the "fonts/" folder. See Makefile.emscripten for details. + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + bool done = false; +#ifdef __EMSCRIPTEN__ + // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file. + // You may manually call LoadIniSettingsFromMemory() to load settings from your own storage. + io.IniFilename = nullptr; + EMSCRIPTEN_MAINLOOP_BEGIN +#else + while (!done) +#endif + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + SDL_Event event; + while (SDL_PollEvent(&event)) + { + ImGui_ImplSDL2_ProcessEvent(&event); + if (event.type == SDL_QUIT) + done = true; + if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) + done = true; + } + + // Start the Dear ImGui frame + ImGui_ImplOpenGL3_NewFrame(); + ImGui_ImplSDL2_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); + glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); + glClear(GL_COLOR_BUFFER_BIT); + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + SDL_GL_SwapWindow(window); + } +#ifdef __EMSCRIPTEN__ + EMSCRIPTEN_MAINLOOP_END; +#endif + + // Cleanup + ImGui_ImplOpenGL3_Shutdown(); + ImGui_ImplSDL2_Shutdown(); + ImGui::DestroyContext(); + + SDL_GL_DeleteContext(gl_context); + SDL_DestroyWindow(window); + SDL_Quit(); + + return 0; +} diff --git a/third_party/imgui/examples/example_sdl2_sdlrenderer2/Makefile b/third_party/imgui/examples/example_sdl2_sdlrenderer2/Makefile new file mode 100644 index 00000000000..5820d9bc718 --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_sdlrenderer2/Makefile @@ -0,0 +1,79 @@ +# +# Cross Platform Makefile +# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X +# +# You will need SDL2 (http://www.libsdl.org): +# Linux: +# apt-get install libsdl2-dev +# Mac OS X: +# brew install sdl2 +# MSYS2: +# pacman -S mingw-w64-i686-SDL2 +# + +#CXX = g++ +#CXX = clang++ + +EXE = example_sdl2_sdlrenderer2 +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl2.cpp $(IMGUI_DIR)/backends/imgui_impl_sdlrenderer2.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) + +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +CXXFLAGS += -g -Wall -Wformat +LIBS = + +##--------------------------------------------------------------------- +## BUILD FLAGS PER PLATFORM +##--------------------------------------------------------------------- + +ifeq ($(UNAME_S), Linux) #LINUX + ECHO_MESSAGE = "Linux" + LIBS += -lGL -ldl `sdl2-config --libs` + + CXXFLAGS += `sdl2-config --cflags` + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(UNAME_S), Darwin) #APPLE + ECHO_MESSAGE = "Mac OS X" + LIBS += -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo `sdl2-config --libs` + LIBS += -L/usr/local/lib -L/opt/local/lib + + CXXFLAGS += `sdl2-config --cflags` + CXXFLAGS += -I/usr/local/include -I/opt/local/include + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(OS), Windows_NT) + ECHO_MESSAGE = "MinGW" + LIBS += -lgdi32 -lopengl32 -limm32 `pkg-config --static --libs sdl2` + + CXXFLAGS += `pkg-config --cflags sdl2` + CFLAGS = $(CXXFLAGS) +endif + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(ECHO_MESSAGE) + +$(EXE): $(OBJS) + $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) + +clean: + rm -f $(EXE) $(OBJS) diff --git a/third_party/imgui/examples/example_sdl2_sdlrenderer2/README.md b/third_party/imgui/examples/example_sdl2_sdlrenderer2/README.md new file mode 100644 index 00000000000..ef6fe85a53b --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_sdlrenderer2/README.md @@ -0,0 +1,25 @@ + +# How to Build + +- On Windows with Visual Studio's CLI + +``` +set SDL2_DIR=path_to_your_sdl2_folder +cl /Zi /MD /utf-8 /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_sdlrenderer2.cpp ..\..\imgui*.cpp /FeDebug/example_sdl2_sdlrenderer.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib /subsystem:console +# ^^ include paths ^^ source files ^^ output exe ^^ output dir ^^ libraries +# or for 64-bit: +cl /Zi /MD /utf-8 /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_sdlrenderer2.cpp ..\..\imgui*.cpp /FeDebug/example_sdl2_sdlrenderer.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x64 SDL2.lib SDL2main.lib /subsystem:console +``` + +- On Linux and similar Unixes + +``` +c++ `sdl2-config --cflags` -I .. -I ../.. main.cpp ../../backends/imgui_impl_sdl2.cpp ../../backends/imgui_impl_sdlrenderer2.cpp ../../imgui*.cpp `sdl2-config --libs` -lGL +``` + +- On Mac OS X + +``` +brew install sdl2 +c++ `sdl2-config --cflags` -I .. -I ../.. main.cpp ../../backends/imgui_impl_sdl2.cpp ../../backends/imgui_impl_sdlrenderer2.cpp ../../imgui*.cpp `sdl2-config --libs` -framework OpenGl +``` diff --git a/third_party/imgui/examples/example_sdl2_sdlrenderer2/build_win32.bat b/third_party/imgui/examples/example_sdl2_sdlrenderer2/build_win32.bat new file mode 100644 index 00000000000..e311bfcd0fa --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_sdlrenderer2/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_sdl2_sdlrenderer_ +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_sdlrenderer2.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/third_party/imgui/examples/example_sdl2_sdlrenderer2/example_sdl2_sdlrenderer2.vcxproj b/third_party/imgui/examples/example_sdl2_sdlrenderer2/example_sdl2_sdlrenderer2.vcxproj new file mode 100644 index 00000000000..cf2c890bba1 --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_sdlrenderer2/example_sdl2_sdlrenderer2.vcxproj @@ -0,0 +1,187 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {0C0B2BEA-311F-473C-9652-87923EF639E3} + example_sdl2_sdlrenderer2 + 8.1 + example_sdl2_sdlrenderer2 + + + + Application + true + MultiByte + v140 + + + Application + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL2_DIR%\include;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) + + + true + %SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) + SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL2_DIR%\include;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) + + + true + %SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) + SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL2_DIR%\include;%(AdditionalIncludeDirectories) + false + /utf-8 %(AdditionalOptions) + + + true + true + true + %SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) + SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + + + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL2_DIR%\include;%(AdditionalIncludeDirectories) + false + /utf-8 %(AdditionalOptions) + + + true + true + true + %SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) + SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/imgui/examples/example_sdl2_sdlrenderer2/example_sdl2_sdlrenderer2.vcxproj.filters b/third_party/imgui/examples/example_sdl2_sdlrenderer2/example_sdl2_sdlrenderer2.vcxproj.filters new file mode 100644 index 00000000000..5c6da42e337 --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_sdlrenderer2/example_sdl2_sdlrenderer2.vcxproj.filters @@ -0,0 +1,64 @@ + + + + + {20b90ce4-7fcb-4731-b9a0-075f875de82d} + + + {f18ab499-84e1-499f-8eff-9754361e0e52} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + imgui + + + imgui + + + imgui + + + sources + + + imgui + + + imgui + + + sources + + + sources + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + + imgui + + + imgui + + + diff --git a/third_party/imgui/examples/example_sdl2_sdlrenderer2/main.cpp b/third_party/imgui/examples/example_sdl2_sdlrenderer2/main.cpp new file mode 100644 index 00000000000..8bb3099205c --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_sdlrenderer2/main.cpp @@ -0,0 +1,172 @@ +// Dear ImGui: standalone example application for SDL2 + SDL_Renderer +// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) + +// 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 to understand: SDL_Renderer is an _optional_ component of SDL2. +// For a multi-platform app consider using e.g. SDL+DirectX on Windows and SDL+OpenGL on Linux/OSX. + +#include "imgui.h" +#include "imgui_impl_sdl2.h" +#include "imgui_impl_sdlrenderer2.h" +#include +#include + +#if !SDL_VERSION_ATLEAST(2,0,17) +#error This backend requires SDL 2.0.17+ because of SDL_RenderGeometry() function +#endif + +// Main code +int main(int, char**) +{ + // Setup SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) + { + printf("Error: %s\n", SDL_GetError()); + return -1; + } + + // From 2.0.18: Enable native IME. +#ifdef SDL_HINT_IME_SHOW_UI + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + + // Create window with SDL_Renderer graphics context + SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); + SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+SDL_Renderer example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); + if (window == nullptr) + { + printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); + return -1; + } + SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); + if (renderer == nullptr) + { + SDL_Log("Error creating SDL_Renderer!"); + return 0; + } + //SDL_RendererInfo info; + //SDL_GetRendererInfo(renderer, &info); + //SDL_Log("Current SDL_Renderer: %s", info.name); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplSDL2_InitForSDLRenderer(window, renderer); + ImGui_ImplSDLRenderer2_Init(renderer); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + bool done = false; + while (!done) + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + SDL_Event event; + while (SDL_PollEvent(&event)) + { + ImGui_ImplSDL2_ProcessEvent(&event); + if (event.type == SDL_QUIT) + done = true; + if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) + done = true; + } + + // Start the Dear ImGui frame + ImGui_ImplSDLRenderer2_NewFrame(); + ImGui_ImplSDL2_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + SDL_RenderSetScale(renderer, io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); + SDL_SetRenderDrawColor(renderer, (Uint8)(clear_color.x * 255), (Uint8)(clear_color.y * 255), (Uint8)(clear_color.z * 255), (Uint8)(clear_color.w * 255)); + SDL_RenderClear(renderer); + ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData(), renderer); + SDL_RenderPresent(renderer); + } + + // Cleanup + ImGui_ImplSDLRenderer2_Shutdown(); + ImGui_ImplSDL2_Shutdown(); + ImGui::DestroyContext(); + + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + + return 0; +} diff --git a/third_party/imgui/examples/example_sdl2_vulkan/build_win32.bat b/third_party/imgui/examples/example_sdl2_vulkan/build_win32.bat new file mode 100644 index 00000000000..8a4aefc223b --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_vulkan/build_win32.bat @@ -0,0 +1,10 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. + +@set OUT_EXE=example_sdl2_vulkan +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include /I %VULKAN_SDK%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_vulkan.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 /libpath:%VULKAN_SDK%\lib32 SDL2.lib SDL2main.lib shell32.lib vulkan-1.lib + +@set OUT_DIR=Debug +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% /D ImTextureID=ImU64 %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/third_party/imgui/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj b/third_party/imgui/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj new file mode 100644 index 00000000000..ba6afaf72b7 --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj @@ -0,0 +1,190 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3} + example_sdl2_vulkan + 8.1 + + + + Application + true + MultiByte + v140 + + + Application + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + + Level4 + Disabled + ..\..;..\..\backends;%VULKAN_SDK%\include;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions) + /utf-8 %(AdditionalOptions) + + + true + %VULKAN_SDK%\lib32;%SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) + vulkan-1.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + Disabled + ..\..;..\..\backends;%VULKAN_SDK%\include;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions) + /utf-8 %(AdditionalOptions) + + + true + %VULKAN_SDK%\lib;%SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) + vulkan-1.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%VULKAN_SDK%\include;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + false + ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions) + /utf-8 %(AdditionalOptions) + + + true + true + true + %VULKAN_SDK%\lib32;%SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) + vulkan-1.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + + + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%VULKAN_SDK%\include;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + false + ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions) + /utf-8 %(AdditionalOptions) + + + true + true + true + %VULKAN_SDK%\lib;%SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) + vulkan-1.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/imgui/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj.filters b/third_party/imgui/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj.filters new file mode 100644 index 00000000000..ab424851540 --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj.filters @@ -0,0 +1,64 @@ + + + + + {20b90ce4-7fcb-4731-b9a0-075f875de82d} + + + {f18ab499-84e1-499f-8eff-9754361e0e52} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + sources + + + imgui + + + imgui + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + + imgui + + + imgui + + + \ No newline at end of file diff --git a/third_party/imgui/examples/example_sdl2_vulkan/main.cpp b/third_party/imgui/examples/example_sdl2_vulkan/main.cpp new file mode 100644 index 00000000000..afcebf1b913 --- /dev/null +++ b/third_party/imgui/examples/example_sdl2_vulkan/main.cpp @@ -0,0 +1,578 @@ +// Dear ImGui: standalone example application for SDL2 + Vulkan + +// 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. +// - Helper ImGui_ImplVulkanH_XXX functions and structures are only used by this example (main.cpp) and by +// the backend itself (imgui_impl_vulkan.cpp), but should PROBABLY NOT be used by your own engine/app code. +// Read comments in imgui_impl_vulkan.h. + +#include "imgui.h" +#include "imgui_impl_sdl2.h" +#include "imgui_impl_vulkan.h" +#include // printf, fprintf +#include // abort +#include +#include + +// Volk headers +#ifdef IMGUI_IMPL_VULKAN_USE_VOLK +#define VOLK_IMPLEMENTATION +#include +#endif + +//#define APP_USE_UNLIMITED_FRAME_RATE +#ifdef _DEBUG +#define APP_USE_VULKAN_DEBUG_REPORT +#endif + +// Data +static VkAllocationCallbacks* g_Allocator = nullptr; +static VkInstance g_Instance = VK_NULL_HANDLE; +static VkPhysicalDevice g_PhysicalDevice = VK_NULL_HANDLE; +static VkDevice g_Device = VK_NULL_HANDLE; +static uint32_t g_QueueFamily = (uint32_t)-1; +static VkQueue g_Queue = VK_NULL_HANDLE; +static VkDebugReportCallbackEXT g_DebugReport = VK_NULL_HANDLE; +static VkPipelineCache g_PipelineCache = VK_NULL_HANDLE; +static VkDescriptorPool g_DescriptorPool = VK_NULL_HANDLE; + +static ImGui_ImplVulkanH_Window g_MainWindowData; +static uint32_t g_MinImageCount = 2; +static bool g_SwapChainRebuild = false; + +static void check_vk_result(VkResult err) +{ + if (err == 0) + return; + fprintf(stderr, "[vulkan] Error: VkResult = %d\n", err); + if (err < 0) + abort(); +} + +#ifdef APP_USE_VULKAN_DEBUG_REPORT +static VKAPI_ATTR VkBool32 VKAPI_CALL debug_report(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char* pLayerPrefix, const char* pMessage, void* pUserData) +{ + (void)flags; (void)object; (void)location; (void)messageCode; (void)pUserData; (void)pLayerPrefix; // Unused arguments + fprintf(stderr, "[vulkan] Debug report from ObjectType: %i\nMessage: %s\n\n", objectType, pMessage); + return VK_FALSE; +} +#endif // APP_USE_VULKAN_DEBUG_REPORT + +static bool IsExtensionAvailable(const ImVector& properties, const char* extension) +{ + for (const VkExtensionProperties& p : properties) + if (strcmp(p.extensionName, extension) == 0) + return true; + return false; +} + +static VkPhysicalDevice SetupVulkan_SelectPhysicalDevice() +{ + uint32_t gpu_count; + VkResult err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, nullptr); + check_vk_result(err); + IM_ASSERT(gpu_count > 0); + + ImVector gpus; + gpus.resize(gpu_count); + err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, gpus.Data); + check_vk_result(err); + + // If a number >1 of GPUs got reported, find discrete GPU if present, or use first one available. This covers + // most common cases (multi-gpu/integrated+dedicated graphics). Handling more complicated setups (multiple + // dedicated GPUs) is out of scope of this sample. + for (VkPhysicalDevice& device : gpus) + { + VkPhysicalDeviceProperties properties; + vkGetPhysicalDeviceProperties(device, &properties); + if (properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) + return device; + } + + // Use first GPU (Integrated) is a Discrete one is not available. + if (gpu_count > 0) + return gpus[0]; + return VK_NULL_HANDLE; +} + +static void SetupVulkan(ImVector instance_extensions) +{ + VkResult err; +#ifdef IMGUI_IMPL_VULKAN_USE_VOLK + volkInitialize(); +#endif + + // Create Vulkan Instance + { + VkInstanceCreateInfo create_info = {}; + create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + + // Enumerate available extensions + uint32_t properties_count; + ImVector properties; + vkEnumerateInstanceExtensionProperties(nullptr, &properties_count, nullptr); + properties.resize(properties_count); + err = vkEnumerateInstanceExtensionProperties(nullptr, &properties_count, properties.Data); + check_vk_result(err); + + // Enable required extensions + if (IsExtensionAvailable(properties, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) + instance_extensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); +#ifdef VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME + if (IsExtensionAvailable(properties, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)) + { + instance_extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); + create_info.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; + } +#endif + + // Enabling validation layers +#ifdef APP_USE_VULKAN_DEBUG_REPORT + const char* layers[] = { "VK_LAYER_KHRONOS_validation" }; + create_info.enabledLayerCount = 1; + create_info.ppEnabledLayerNames = layers; + instance_extensions.push_back("VK_EXT_debug_report"); +#endif + + // Create Vulkan Instance + create_info.enabledExtensionCount = (uint32_t)instance_extensions.Size; + create_info.ppEnabledExtensionNames = instance_extensions.Data; + err = vkCreateInstance(&create_info, g_Allocator, &g_Instance); + check_vk_result(err); +#ifdef IMGUI_IMPL_VULKAN_USE_VOLK + volkLoadInstance(g_Instance); +#endif + + // Setup the debug report callback +#ifdef APP_USE_VULKAN_DEBUG_REPORT + auto f_vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkCreateDebugReportCallbackEXT"); + IM_ASSERT(f_vkCreateDebugReportCallbackEXT != nullptr); + VkDebugReportCallbackCreateInfoEXT debug_report_ci = {}; + debug_report_ci.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT; + debug_report_ci.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT; + debug_report_ci.pfnCallback = debug_report; + debug_report_ci.pUserData = nullptr; + err = f_vkCreateDebugReportCallbackEXT(g_Instance, &debug_report_ci, g_Allocator, &g_DebugReport); + check_vk_result(err); +#endif + } + + // Select Physical Device (GPU) + g_PhysicalDevice = SetupVulkan_SelectPhysicalDevice(); + + // Select graphics queue family + { + uint32_t count; + vkGetPhysicalDeviceQueueFamilyProperties(g_PhysicalDevice, &count, nullptr); + VkQueueFamilyProperties* queues = (VkQueueFamilyProperties*)malloc(sizeof(VkQueueFamilyProperties) * count); + vkGetPhysicalDeviceQueueFamilyProperties(g_PhysicalDevice, &count, queues); + for (uint32_t i = 0; i < count; i++) + if (queues[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) + { + g_QueueFamily = i; + break; + } + free(queues); + IM_ASSERT(g_QueueFamily != (uint32_t)-1); + } + + // Create Logical Device (with 1 queue) + { + ImVector device_extensions; + device_extensions.push_back("VK_KHR_swapchain"); + + // Enumerate physical device extension + uint32_t properties_count; + ImVector properties; + vkEnumerateDeviceExtensionProperties(g_PhysicalDevice, nullptr, &properties_count, nullptr); + properties.resize(properties_count); + vkEnumerateDeviceExtensionProperties(g_PhysicalDevice, nullptr, &properties_count, properties.Data); +#ifdef VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME + if (IsExtensionAvailable(properties, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME)) + device_extensions.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME); +#endif + + const float queue_priority[] = { 1.0f }; + VkDeviceQueueCreateInfo queue_info[1] = {}; + queue_info[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + queue_info[0].queueFamilyIndex = g_QueueFamily; + queue_info[0].queueCount = 1; + queue_info[0].pQueuePriorities = queue_priority; + VkDeviceCreateInfo create_info = {}; + create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; + create_info.queueCreateInfoCount = sizeof(queue_info) / sizeof(queue_info[0]); + create_info.pQueueCreateInfos = queue_info; + create_info.enabledExtensionCount = (uint32_t)device_extensions.Size; + create_info.ppEnabledExtensionNames = device_extensions.Data; + err = vkCreateDevice(g_PhysicalDevice, &create_info, g_Allocator, &g_Device); + check_vk_result(err); + vkGetDeviceQueue(g_Device, g_QueueFamily, 0, &g_Queue); + } + + // Create Descriptor Pool + // The example only requires a single combined image sampler descriptor for the font image and only uses one descriptor set (for that) + // If you wish to load e.g. additional textures you may need to alter pools sizes. + { + VkDescriptorPoolSize pool_sizes[] = + { + { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1 }, + }; + VkDescriptorPoolCreateInfo pool_info = {}; + pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; + pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; + pool_info.maxSets = 1; + pool_info.poolSizeCount = (uint32_t)IM_ARRAYSIZE(pool_sizes); + pool_info.pPoolSizes = pool_sizes; + err = vkCreateDescriptorPool(g_Device, &pool_info, g_Allocator, &g_DescriptorPool); + check_vk_result(err); + } +} + +// All the ImGui_ImplVulkanH_XXX structures/functions are optional helpers used by the demo. +// Your real engine/app may not use them. +static void SetupVulkanWindow(ImGui_ImplVulkanH_Window* wd, VkSurfaceKHR surface, int width, int height) +{ + wd->Surface = surface; + + // Check for WSI support + VkBool32 res; + vkGetPhysicalDeviceSurfaceSupportKHR(g_PhysicalDevice, g_QueueFamily, wd->Surface, &res); + if (res != VK_TRUE) + { + fprintf(stderr, "Error no WSI support on physical device 0\n"); + exit(-1); + } + + // Select Surface Format + const VkFormat requestSurfaceImageFormat[] = { VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_B8G8R8_UNORM, VK_FORMAT_R8G8B8_UNORM }; + const VkColorSpaceKHR requestSurfaceColorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR; + wd->SurfaceFormat = ImGui_ImplVulkanH_SelectSurfaceFormat(g_PhysicalDevice, wd->Surface, requestSurfaceImageFormat, (size_t)IM_ARRAYSIZE(requestSurfaceImageFormat), requestSurfaceColorSpace); + + // Select Present Mode +#ifdef APP_UNLIMITED_FRAME_RATE + VkPresentModeKHR present_modes[] = { VK_PRESENT_MODE_MAILBOX_KHR, VK_PRESENT_MODE_IMMEDIATE_KHR, VK_PRESENT_MODE_FIFO_KHR }; +#else + VkPresentModeKHR present_modes[] = { VK_PRESENT_MODE_FIFO_KHR }; +#endif + wd->PresentMode = ImGui_ImplVulkanH_SelectPresentMode(g_PhysicalDevice, wd->Surface, &present_modes[0], IM_ARRAYSIZE(present_modes)); + //printf("[vulkan] Selected PresentMode = %d\n", wd->PresentMode); + + // Create SwapChain, RenderPass, Framebuffer, etc. + IM_ASSERT(g_MinImageCount >= 2); + ImGui_ImplVulkanH_CreateOrResizeWindow(g_Instance, g_PhysicalDevice, g_Device, wd, g_QueueFamily, g_Allocator, width, height, g_MinImageCount); +} + +static void CleanupVulkan() +{ + vkDestroyDescriptorPool(g_Device, g_DescriptorPool, g_Allocator); + +#ifdef APP_USE_VULKAN_DEBUG_REPORT + // Remove the debug report callback + auto f_vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkDestroyDebugReportCallbackEXT"); + f_vkDestroyDebugReportCallbackEXT(g_Instance, g_DebugReport, g_Allocator); +#endif // APP_USE_VULKAN_DEBUG_REPORT + + vkDestroyDevice(g_Device, g_Allocator); + vkDestroyInstance(g_Instance, g_Allocator); +} + +static void CleanupVulkanWindow() +{ + ImGui_ImplVulkanH_DestroyWindow(g_Instance, g_Device, &g_MainWindowData, g_Allocator); +} + +static void FrameRender(ImGui_ImplVulkanH_Window* wd, ImDrawData* draw_data) +{ + VkResult err; + + VkSemaphore image_acquired_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].ImageAcquiredSemaphore; + VkSemaphore render_complete_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].RenderCompleteSemaphore; + err = vkAcquireNextImageKHR(g_Device, wd->Swapchain, UINT64_MAX, image_acquired_semaphore, VK_NULL_HANDLE, &wd->FrameIndex); + if (err == VK_ERROR_OUT_OF_DATE_KHR || err == VK_SUBOPTIMAL_KHR) + { + g_SwapChainRebuild = true; + return; + } + check_vk_result(err); + + ImGui_ImplVulkanH_Frame* fd = &wd->Frames[wd->FrameIndex]; + { + err = vkWaitForFences(g_Device, 1, &fd->Fence, VK_TRUE, UINT64_MAX); // wait indefinitely instead of periodically checking + check_vk_result(err); + + err = vkResetFences(g_Device, 1, &fd->Fence); + check_vk_result(err); + } + { + err = vkResetCommandPool(g_Device, fd->CommandPool, 0); + check_vk_result(err); + VkCommandBufferBeginInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + info.flags |= VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + err = vkBeginCommandBuffer(fd->CommandBuffer, &info); + check_vk_result(err); + } + { + VkRenderPassBeginInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; + info.renderPass = wd->RenderPass; + info.framebuffer = fd->Framebuffer; + info.renderArea.extent.width = wd->Width; + info.renderArea.extent.height = wd->Height; + info.clearValueCount = 1; + info.pClearValues = &wd->ClearValue; + vkCmdBeginRenderPass(fd->CommandBuffer, &info, VK_SUBPASS_CONTENTS_INLINE); + } + + // Record dear imgui primitives into command buffer + ImGui_ImplVulkan_RenderDrawData(draw_data, fd->CommandBuffer); + + // Submit command buffer + vkCmdEndRenderPass(fd->CommandBuffer); + { + VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + VkSubmitInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + info.waitSemaphoreCount = 1; + info.pWaitSemaphores = &image_acquired_semaphore; + info.pWaitDstStageMask = &wait_stage; + info.commandBufferCount = 1; + info.pCommandBuffers = &fd->CommandBuffer; + info.signalSemaphoreCount = 1; + info.pSignalSemaphores = &render_complete_semaphore; + + err = vkEndCommandBuffer(fd->CommandBuffer); + check_vk_result(err); + err = vkQueueSubmit(g_Queue, 1, &info, fd->Fence); + check_vk_result(err); + } +} + +static void FramePresent(ImGui_ImplVulkanH_Window* wd) +{ + if (g_SwapChainRebuild) + return; + VkSemaphore render_complete_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].RenderCompleteSemaphore; + VkPresentInfoKHR info = {}; + info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; + info.waitSemaphoreCount = 1; + info.pWaitSemaphores = &render_complete_semaphore; + info.swapchainCount = 1; + info.pSwapchains = &wd->Swapchain; + info.pImageIndices = &wd->FrameIndex; + VkResult err = vkQueuePresentKHR(g_Queue, &info); + if (err == VK_ERROR_OUT_OF_DATE_KHR || err == VK_SUBOPTIMAL_KHR) + { + g_SwapChainRebuild = true; + return; + } + check_vk_result(err); + wd->SemaphoreIndex = (wd->SemaphoreIndex + 1) % wd->SemaphoreCount; // Now we can use the next set of semaphores +} + +// Main code +int main(int, char**) +{ + // Setup SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) + { + printf("Error: %s\n", SDL_GetError()); + return -1; + } + + // From 2.0.18: Enable native IME. +#ifdef SDL_HINT_IME_SHOW_UI + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + + // Create window with Vulkan graphics context + SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); + SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+Vulkan example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); + if (window == nullptr) + { + printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); + return -1; + } + + ImVector extensions; + uint32_t extensions_count = 0; + SDL_Vulkan_GetInstanceExtensions(window, &extensions_count, nullptr); + extensions.resize(extensions_count); + SDL_Vulkan_GetInstanceExtensions(window, &extensions_count, extensions.Data); + SetupVulkan(extensions); + + // Create Window Surface + VkSurfaceKHR surface; + VkResult err; + if (SDL_Vulkan_CreateSurface(window, g_Instance, &surface) == 0) + { + printf("Failed to create Vulkan surface.\n"); + return 1; + } + + // Create Framebuffers + int w, h; + SDL_GetWindowSize(window, &w, &h); + ImGui_ImplVulkanH_Window* wd = &g_MainWindowData; + SetupVulkanWindow(wd, surface, w, h); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplSDL2_InitForVulkan(window); + ImGui_ImplVulkan_InitInfo init_info = {}; + init_info.Instance = g_Instance; + init_info.PhysicalDevice = g_PhysicalDevice; + init_info.Device = g_Device; + init_info.QueueFamily = g_QueueFamily; + init_info.Queue = g_Queue; + init_info.PipelineCache = g_PipelineCache; + init_info.DescriptorPool = g_DescriptorPool; + init_info.RenderPass = wd->RenderPass; + init_info.Subpass = 0; + init_info.MinImageCount = g_MinImageCount; + init_info.ImageCount = wd->ImageCount; + init_info.MSAASamples = VK_SAMPLE_COUNT_1_BIT; + init_info.Allocator = g_Allocator; + init_info.CheckVkResultFn = check_vk_result; + ImGui_ImplVulkan_Init(&init_info); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + bool done = false; + while (!done) + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + SDL_Event event; + while (SDL_PollEvent(&event)) + { + ImGui_ImplSDL2_ProcessEvent(&event); + if (event.type == SDL_QUIT) + done = true; + if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) + done = true; + } + + // Resize swap chain? + int fb_width, fb_height; + SDL_GetWindowSize(window, &fb_width, &fb_height); + if (fb_width > 0 && fb_height > 0 && (g_SwapChainRebuild || g_MainWindowData.Width != fb_width || g_MainWindowData.Height != fb_height)) + { + ImGui_ImplVulkan_SetMinImageCount(g_MinImageCount); + ImGui_ImplVulkanH_CreateOrResizeWindow(g_Instance, g_PhysicalDevice, g_Device, &g_MainWindowData, g_QueueFamily, g_Allocator, fb_width, fb_height, g_MinImageCount); + g_MainWindowData.FrameIndex = 0; + g_SwapChainRebuild = false; + } + + // Start the Dear ImGui frame + ImGui_ImplVulkan_NewFrame(); + ImGui_ImplSDL2_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + ImDrawData* draw_data = ImGui::GetDrawData(); + const bool is_minimized = (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f); + if (!is_minimized) + { + wd->ClearValue.color.float32[0] = clear_color.x * clear_color.w; + wd->ClearValue.color.float32[1] = clear_color.y * clear_color.w; + wd->ClearValue.color.float32[2] = clear_color.z * clear_color.w; + wd->ClearValue.color.float32[3] = clear_color.w; + FrameRender(wd, draw_data); + FramePresent(wd); + } + } + + // Cleanup + err = vkDeviceWaitIdle(g_Device); + check_vk_result(err); + ImGui_ImplVulkan_Shutdown(); + ImGui_ImplSDL2_Shutdown(); + ImGui::DestroyContext(); + + CleanupVulkanWindow(); + CleanupVulkan(); + + SDL_DestroyWindow(window); + SDL_Quit(); + + return 0; +} diff --git a/third_party/imgui/examples/example_sdl3_opengl3/Makefile b/third_party/imgui/examples/example_sdl3_opengl3/Makefile new file mode 100644 index 00000000000..741e97d0c27 --- /dev/null +++ b/third_party/imgui/examples/example_sdl3_opengl3/Makefile @@ -0,0 +1,84 @@ +# +# Cross Platform Makefile +# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X +# +# You will need SDL3 (http://www.libsdl.org) which is still unreleased/unpackaged. + +#CXX = g++ +#CXX = clang++ + +EXE = example_sdl3_opengl3 +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl3.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl3.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) +LINUX_GL_LIBS = -lGL + +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +CXXFLAGS += -g -Wall -Wformat +LIBS = + +##--------------------------------------------------------------------- +## OPENGL ES +##--------------------------------------------------------------------- + +## This assumes a GL ES library available in the system, e.g. libGLESv2.so +# CXXFLAGS += -DIMGUI_IMPL_OPENGL_ES2 +# LINUX_GL_LIBS = -lGLESv2 +## If you're on a Raspberry Pi and want to use the legacy drivers, +## use the following instead: +# LINUX_GL_LIBS = -L/opt/vc/lib -lbrcmGLESv2 + +##--------------------------------------------------------------------- +## BUILD FLAGS PER PLATFORM +##--------------------------------------------------------------------- + +ifeq ($(UNAME_S), Linux) #LINUX + ECHO_MESSAGE = "Linux" + LIBS += $(LINUX_GL_LIBS) -ldl `pkg-config sdl3 --libs` + + CXXFLAGS += `pkg-config sdl3 --cflags` + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(UNAME_S), Darwin) #APPLE + ECHO_MESSAGE = "Mac OS X" + LIBS += -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo `sdl3-config --libs` + LIBS += -L/usr/local/lib -L/opt/local/lib + + CXXFLAGS += `pkg-config sdl3 --cflags` + CXXFLAGS += -I/usr/local/include -I/opt/local/include + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(OS), Windows_NT) + ECHO_MESSAGE = "MinGW" + LIBS += -lgdi32 -lopengl32 -limm32 `pkg-config --static --libs sdl3` + + CXXFLAGS += `pkg-config --cflags sdl3` + CFLAGS = $(CXXFLAGS) +endif + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(ECHO_MESSAGE) + +$(EXE): $(OBJS) + $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) + +clean: + rm -f $(EXE) $(OBJS) diff --git a/third_party/imgui/examples/example_sdl3_opengl3/Makefile.emscripten b/third_party/imgui/examples/example_sdl3_opengl3/Makefile.emscripten new file mode 100644 index 00000000000..9e9ffd6034f --- /dev/null +++ b/third_party/imgui/examples/example_sdl3_opengl3/Makefile.emscripten @@ -0,0 +1,96 @@ + +# IMPORTANT: SDL3 IS IN DEVELOPMENT, AS OF 2023-05-30, EMSCRIPTEN DOESN'T SUPPORT SDL3 YET. +# WE ARE LEAVING THIS MAKEFILE AROUND FOR THE DAY IT WILL SUPPORT IT. + +# +# Makefile to use with SDL+emscripten +# See https://emscripten.org/docs/getting_started/downloads.html +# for installation instructions. +# +# This Makefile assumes you have loaded emscripten's environment. +# (On Windows, you may need to execute emsdk_env.bat or encmdprompt.bat ahead) +# +# Running `make -f Makefile.emscripten` will produce three files: +# - web/index.html +# - web/index.js +# - web/index.wasm +# +# All three are needed to run the demo. + +CC = emcc +CXX = em++ +WEB_DIR = web +EXE = $(WEB_DIR)/index.html +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl3.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl3.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) +CPPFLAGS = +LDFLAGS = +EMS = + +##--------------------------------------------------------------------- +## EMSCRIPTEN OPTIONS +##--------------------------------------------------------------------- + +# ("EMS" options gets added to both CPPFLAGS and LDFLAGS, whereas some options are for linker only) +EMS += -s USE_SDL=2 +EMS += -s DISABLE_EXCEPTION_CATCHING=1 +LDFLAGS += -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=0 -s ASSERTIONS=1 + +# Uncomment next line to fix possible rendering bugs with Emscripten version older then 1.39.0 (https://github.com/ocornut/imgui/issues/2877) +#EMS += -s BINARYEN_TRAP_MODE=clamp +#EMS += -s SAFE_HEAP=1 ## Adds overhead + +# Emscripten allows preloading a file or folder to be accessible at runtime. +# The Makefile for this example project suggests embedding the misc/fonts/ folder into our application, it will then be accessible as "/fonts" +# See documentation for more details: https://emscripten.org/docs/porting/files/packaging_files.html +# (Default value is 0. Set to 1 to enable file-system and include the misc/fonts/ folder as part of the build.) +USE_FILE_SYSTEM ?= 0 +ifeq ($(USE_FILE_SYSTEM), 0) +LDFLAGS += -s NO_FILESYSTEM=1 +CPPFLAGS += -DIMGUI_DISABLE_FILE_FUNCTIONS +endif +ifeq ($(USE_FILE_SYSTEM), 1) +LDFLAGS += --no-heap-copy --preload-file ../../misc/fonts@/fonts +endif + +##--------------------------------------------------------------------- +## FINAL BUILD FLAGS +##--------------------------------------------------------------------- + +CPPFLAGS += -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +#CPPFLAGS += -g +CPPFLAGS += -Wall -Wformat -Os $(EMS) +LDFLAGS += --shell-file ../libs/emscripten/shell_minimal.html +LDFLAGS += $(EMS) + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(EXE) + +$(WEB_DIR): + mkdir $@ + +serve: all + python3 -m http.server -d $(WEB_DIR) + +$(EXE): $(OBJS) $(WEB_DIR) + $(CXX) -o $@ $(OBJS) $(LDFLAGS) + +clean: + rm -rf $(OBJS) $(WEB_DIR) diff --git a/third_party/imgui/examples/example_sdl3_opengl3/README.md b/third_party/imgui/examples/example_sdl3_opengl3/README.md new file mode 100644 index 00000000000..5828e4bfc71 --- /dev/null +++ b/third_party/imgui/examples/example_sdl3_opengl3/README.md @@ -0,0 +1,40 @@ + +# How to Build + +## Windows with Visual Studio's IDE + +Use the provided project file (.vcxproj). Add to solution (imgui_examples.sln) if necessary. + +## Windows with Visual Studio's CLI + +Use build_win32.bat or directly: +``` +set SDL2_DIR=path_to_your_sdl3_folder +cl /Zi /MD /utf-8 /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl3.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp /FeDebug/example_sdl3_opengl3.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x86 SDL3.lib opengl32.lib /subsystem:console +# ^^ include paths ^^ source files ^^ output exe ^^ output dir ^^ libraries +# or for 64-bit: +cl /Zi /MD /utf-8 /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl3.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp /FeDebug/example_sdl3_opengl3.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x64 SDL3.lib SDL2mainopengl32.lib /subsystem:console +``` + +## Linux and similar Unixes + +Use our Makefile or directly: +``` +c++ `sdl3-config --cflags` -I .. -I ../.. -I ../../backends + main.cpp ../../backends/imgui_impl_sdl3.cpp ../../backends/imgui_impl_opengl3.cpp ../../imgui*.cpp + `sdl3-config --libs` -lGL -ldl +``` + +## macOS + +Use our Makefile or directly: +``` +brew install sdl3 +c++ `sdl3-config --cflags` -I .. -I ../.. -I ../../backends + main.cpp ../../backends/imgui_impl_sdl3.cpp ../../backends/imgui_impl_opengl3.cpp ../../imgui*.cpp + `sdl3-config --libs` -framework OpenGl -framework CoreFoundation +``` + +## Emscripten + +As of 2023-05-30 Emscripten doesn't support SDL3 yet. diff --git a/third_party/imgui/examples/example_sdl3_opengl3/build_win32.bat b/third_party/imgui/examples/example_sdl3_opengl3/build_win32.bat new file mode 100644 index 00000000000..5b8d5f87136 --- /dev/null +++ b/third_party/imgui/examples/example_sdl3_opengl3/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_sdl3_opengl3 +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL3_DIR%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl3.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL3_DIR%\lib\x86 SDL3.lib opengl32.lib shell32.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/third_party/imgui/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj b/third_party/imgui/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj new file mode 100644 index 00000000000..051f87d764f --- /dev/null +++ b/third_party/imgui/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj @@ -0,0 +1,187 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {84AAA301-84FE-428B-9E3E-817BC8123C0C} + example_sdl3_opengl3 + 8.1 + + + + Application + true + MultiByte + v140 + + + Application + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) + + + true + %SDL3_DIR%\lib\x86;%(AdditionalLibraryDirectories) + opengl32.lib;SDL3.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) + + + true + %SDL3_DIR%\lib\x64;%(AdditionalLibraryDirectories) + opengl32.lib;SDL3.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories) + false + /utf-8 %(AdditionalOptions) + + + true + true + true + %SDL3_DIR%\lib\x86;%(AdditionalLibraryDirectories) + opengl32.lib;SDL3.lib;%(AdditionalDependencies) + Console + + + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories) + false + /utf-8 %(AdditionalOptions) + + + true + true + true + %SDL3_DIR%\lib\x64;%(AdditionalLibraryDirectories) + opengl32.lib;SDL3.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/imgui/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj.filters b/third_party/imgui/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj.filters new file mode 100644 index 00000000000..f365473c4a6 --- /dev/null +++ b/third_party/imgui/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj.filters @@ -0,0 +1,67 @@ + + + + + {20b90ce4-7fcb-4731-b9a0-075f875de82d} + + + {f18ab499-84e1-499f-8eff-9754361e0e52} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + sources + + + imgui + + + imgui + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + sources + + + + + + imgui + + + imgui + + + \ No newline at end of file diff --git a/third_party/imgui/examples/example_sdl3_opengl3/main.cpp b/third_party/imgui/examples/example_sdl3_opengl3/main.cpp new file mode 100644 index 00000000000..7ce36b4e860 --- /dev/null +++ b/third_party/imgui/examples/example_sdl3_opengl3/main.cpp @@ -0,0 +1,204 @@ +// Dear ImGui: standalone example application for SDL3 + OpenGL +// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) + +// 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 + +#include "imgui.h" +#include "imgui_impl_sdl3.h" +#include "imgui_impl_opengl3.h" +#include +#include +#if defined(IMGUI_IMPL_OPENGL_ES2) +#include +#else +#include +#endif + +// This example doesn't compile with Emscripten yet! Awaiting SDL3 support. +#ifdef __EMSCRIPTEN__ +#include "../libs/emscripten/emscripten_mainloop_stub.h" +#endif + +// Main code +int main(int, char**) +{ + // Setup SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMEPAD) != 0) + { + printf("Error: SDL_Init(): %s\n", SDL_GetError()); + return -1; + } + + // Decide GL+GLSL versions +#if defined(IMGUI_IMPL_OPENGL_ES2) + // GL ES 2.0 + GLSL 100 + const char* glsl_version = "#version 100"; + SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); +#elif defined(__APPLE__) + // GL 3.2 Core + GLSL 150 + const char* glsl_version = "#version 150"; + SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); // Always required on Mac + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); +#else + // GL 3.0 + GLSL 130 + const char* glsl_version = "#version 130"; + SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); +#endif + + // Create window with graphics context + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); + SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); + Uint32 window_flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIDDEN; + SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL3+OpenGL3 example", 1280, 720, window_flags); + if (window == nullptr) + { + printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); + return -1; + } + SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); + SDL_GLContext gl_context = SDL_GL_CreateContext(window); + SDL_GL_MakeCurrent(window, gl_context); + SDL_GL_SetSwapInterval(1); // Enable vsync + SDL_ShowWindow(window); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplSDL3_InitForOpenGL(window, gl_context); + ImGui_ImplOpenGL3_Init(glsl_version); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + // - Our Emscripten build process allows embedding fonts to be accessible at runtime from the "fonts/" folder. See Makefile.emscripten for details. + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + bool done = false; +#ifdef __EMSCRIPTEN__ + // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file. + // You may manually call LoadIniSettingsFromMemory() to load settings from your own storage. + io.IniFilename = nullptr; + EMSCRIPTEN_MAINLOOP_BEGIN +#else + while (!done) +#endif + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + SDL_Event event; + while (SDL_PollEvent(&event)) + { + ImGui_ImplSDL3_ProcessEvent(&event); + if (event.type == SDL_EVENT_QUIT) + done = true; + if (event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED && event.window.windowID == SDL_GetWindowID(window)) + done = true; + } + + // Start the Dear ImGui frame + ImGui_ImplOpenGL3_NewFrame(); + ImGui_ImplSDL3_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); + glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); + glClear(GL_COLOR_BUFFER_BIT); + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + SDL_GL_SwapWindow(window); + } +#ifdef __EMSCRIPTEN__ + EMSCRIPTEN_MAINLOOP_END; +#endif + + // Cleanup + ImGui_ImplOpenGL3_Shutdown(); + ImGui_ImplSDL3_Shutdown(); + ImGui::DestroyContext(); + + SDL_GL_DeleteContext(gl_context); + SDL_DestroyWindow(window); + SDL_Quit(); + + return 0; +} diff --git a/third_party/imgui/examples/example_sdl3_sdlrenderer3/Makefile b/third_party/imgui/examples/example_sdl3_sdlrenderer3/Makefile new file mode 100644 index 00000000000..238576c7c34 --- /dev/null +++ b/third_party/imgui/examples/example_sdl3_sdlrenderer3/Makefile @@ -0,0 +1,73 @@ +# +# Cross Platform Makefile +# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X +# +# You will need SDL3 (http://www.libsdl.org) which is still unreleased/unpackaged. + +#CXX = g++ +#CXX = clang++ + +EXE = example_sdl3_sdlrenderer3 +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl3.cpp $(IMGUI_DIR)/backends/imgui_impl_sdlrenderer3.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) +LINUX_GL_LIBS = -lGL + +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +CXXFLAGS += -g -Wall -Wformat +LIBS = + +##--------------------------------------------------------------------- +## BUILD FLAGS PER PLATFORM +##--------------------------------------------------------------------- + +ifeq ($(UNAME_S), Linux) #LINUX + ECHO_MESSAGE = "Linux" + LIBS += -ldl `pkg-config sdl3 --libs` + + CXXFLAGS += `pkg-config sdl3 --cflags` + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(UNAME_S), Darwin) #APPLE + ECHO_MESSAGE = "Mac OS X" + LIBS += -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo `sdl3-config --libs` + LIBS += -L/usr/local/lib -L/opt/local/lib + + CXXFLAGS += `pkg-config sdl3 --cflags` + CXXFLAGS += -I/usr/local/include -I/opt/local/include + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(OS), Windows_NT) + ECHO_MESSAGE = "MinGW" + LIBS += -lgdi32 -lopengl32 -limm32 `pkg-config --static --libs sdl3` + + CXXFLAGS += `pkg-config --cflags sdl3` + CFLAGS = $(CXXFLAGS) +endif + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(ECHO_MESSAGE) + +$(EXE): $(OBJS) + $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) + +clean: + rm -f $(EXE) $(OBJS) diff --git a/third_party/imgui/examples/example_sdl3_sdlrenderer3/build_win32.bat b/third_party/imgui/examples/example_sdl3_sdlrenderer3/build_win32.bat new file mode 100644 index 00000000000..7bc131a6af4 --- /dev/null +++ b/third_party/imgui/examples/example_sdl3_sdlrenderer3/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_sdl3_sdlrenderer3 +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL3_DIR%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl3.cpp ..\..\backends\imgui_impl_sdlrenderer3.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL3_DIR%\lib\x86 SDL3.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/third_party/imgui/examples/example_sdl3_sdlrenderer3/example_sdl3_sdlrenderer3.vcxproj b/third_party/imgui/examples/example_sdl3_sdlrenderer3/example_sdl3_sdlrenderer3.vcxproj new file mode 100644 index 00000000000..8b71324cc75 --- /dev/null +++ b/third_party/imgui/examples/example_sdl3_sdlrenderer3/example_sdl3_sdlrenderer3.vcxproj @@ -0,0 +1,186 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {C0290D21-3AD2-4A35-ABBC-A2F5F48326DA} + example_sdl3_opengl3 + 8.1 + + + + Application + true + MultiByte + v140 + + + Application + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) + + + true + %SDL3_DIR%\lib\x86;%(AdditionalLibraryDirectories) + opengl32.lib;SDL3.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) + + + true + %SDL3_DIR%\lib\x64;%(AdditionalLibraryDirectories) + opengl32.lib;SDL3.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories) + false + /utf-8 %(AdditionalOptions) + + + true + true + true + %SDL3_DIR%\lib\x86;%(AdditionalLibraryDirectories) + opengl32.lib;SDL3.lib;%(AdditionalDependencies) + Console + + + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories) + false + /utf-8 %(AdditionalOptions) + + + true + true + true + %SDL3_DIR%\lib\x64;%(AdditionalLibraryDirectories) + opengl32.lib;SDL3.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/imgui/examples/example_sdl3_sdlrenderer3/example_sdl3_sdlrenderer3.vcxproj.filters b/third_party/imgui/examples/example_sdl3_sdlrenderer3/example_sdl3_sdlrenderer3.vcxproj.filters new file mode 100644 index 00000000000..c41210d677a --- /dev/null +++ b/third_party/imgui/examples/example_sdl3_sdlrenderer3/example_sdl3_sdlrenderer3.vcxproj.filters @@ -0,0 +1,64 @@ + + + + + {20b90ce4-7fcb-4731-b9a0-075f875de82d} + + + {f18ab499-84e1-499f-8eff-9754361e0e52} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + imgui + + + imgui + + + sources + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + + imgui + + + imgui + + + \ No newline at end of file diff --git a/third_party/imgui/examples/example_sdl3_sdlrenderer3/main.cpp b/third_party/imgui/examples/example_sdl3_sdlrenderer3/main.cpp new file mode 100644 index 00000000000..607d00b6b7b --- /dev/null +++ b/third_party/imgui/examples/example_sdl3_sdlrenderer3/main.cpp @@ -0,0 +1,176 @@ +// Dear ImGui: standalone example application for SDL3 + SDL_Renderer +// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) + +// 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 to understand: SDL_Renderer is an _optional_ component of SDL3. +// For a multi-platform app consider using e.g. SDL+DirectX on Windows and SDL+OpenGL on Linux/OSX. + +#include "imgui.h" +#include "imgui_impl_sdl3.h" +#include "imgui_impl_sdlrenderer3.h" +#include +#include +#if defined(IMGUI_IMPL_OPENGL_ES2) +#include +#else +#include +#endif + +// Main code +int main(int, char**) +{ + // Setup SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMEPAD) != 0) + { + printf("Error: SDL_Init(): %s\n", SDL_GetError()); + return -1; + } + + // Create window with SDL_Renderer graphics context + Uint32 window_flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIDDEN; + SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL3+SDL_Renderer example", 1280, 720, window_flags); + if (window == nullptr) + { + printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); + return -1; + } + SDL_Renderer* renderer = SDL_CreateRenderer(window, nullptr); + SDL_SetRenderVSync(renderer, 1); + if (renderer == nullptr) + { + SDL_Log("Error: SDL_CreateRenderer(): %s\n", SDL_GetError()); + return -1; + } + SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); + SDL_ShowWindow(window); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplSDL3_InitForSDLRenderer(window, renderer); + ImGui_ImplSDLRenderer3_Init(renderer); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + // - Our Emscripten build process allows embedding fonts to be accessible at runtime from the "fonts/" folder. See Makefile.emscripten for details. + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + bool done = false; +#ifdef __EMSCRIPTEN__ + // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file. + // You may manually call LoadIniSettingsFromMemory() to load settings from your own storage. + io.IniFilename = nullptr; + EMSCRIPTEN_MAINLOOP_BEGIN +#else + while (!done) +#endif + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + SDL_Event event; + while (SDL_PollEvent(&event)) + { + ImGui_ImplSDL3_ProcessEvent(&event); + if (event.type == SDL_EVENT_QUIT) + done = true; + if (event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED && event.window.windowID == SDL_GetWindowID(window)) + done = true; + } + + // Start the Dear ImGui frame + ImGui_ImplSDLRenderer3_NewFrame(); + ImGui_ImplSDL3_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + //SDL_RenderSetScale(renderer, io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); + SDL_SetRenderDrawColorFloat(renderer, clear_color.x, clear_color.y, clear_color.z, clear_color.w); + SDL_RenderClear(renderer); + ImGui_ImplSDLRenderer3_RenderDrawData(ImGui::GetDrawData(), renderer); + SDL_RenderPresent(renderer); + } + + // Cleanup + ImGui_ImplSDLRenderer3_Shutdown(); + ImGui_ImplSDL3_Shutdown(); + ImGui::DestroyContext(); + + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + + return 0; +} diff --git a/third_party/imgui/examples/example_sdl_directx11/build_win32.bat b/third_party/imgui/examples/example_sdl_directx11/build_win32.bat deleted file mode 100644 index b93082704e4..00000000000 --- a/third_party/imgui/examples/example_sdl_directx11/build_win32.bat +++ /dev/null @@ -1,8 +0,0 @@ -@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. -@set OUT_DIR=Debug -@set OUT_EXE=example_sdl_directx11 -@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include /I "%WindowsSdkDir%Include\um" /I "%WindowsSdkDir%Include\shared" /I "%DXSDK_DIR%Include" -@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl.cpp ..\..\backends\imgui_impl_dx11.cpp ..\..\imgui*.cpp -@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib /LIBPATH:"%DXSDK_DIR%/Lib/x86" d3d11.lib d3dcompiler.lib shell32.lib -mkdir %OUT_DIR% -cl /nologo /Zi /MD %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/third_party/imgui/examples/example_sdl_directx11/example_sdl_directx11.vcxproj b/third_party/imgui/examples/example_sdl_directx11/example_sdl_directx11.vcxproj deleted file mode 100644 index ac636d2f339..00000000000 --- a/third_party/imgui/examples/example_sdl_directx11/example_sdl_directx11.vcxproj +++ /dev/null @@ -1,182 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {9E1987E3-1F19-45CA-B9C9-D31E791836D8} - example_sdl_directx11 - 8.1 - example_sdl_directx11 - - - - Application - true - MultiByte - v140 - - - Application - true - MultiByte - v140 - - - Application - false - true - MultiByte - v140 - - - Application - false - true - MultiByte - v140 - - - - - - - - - - - - - - - - - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - - Level4 - Disabled - ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) - - - true - %SDL2_DIR%\lib\x86;$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories) - SDL2.lib;SDL2main.lib;d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) - Console - msvcrt.lib - - - - - Level4 - Disabled - ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) - - - true - %SDL2_DIR%\lib\x64;$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories) - SDL2.lib;SDL2main.lib;d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) - Console - msvcrt.lib - - - - - Level4 - MaxSpeed - true - true - ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) - false - - - true - true - true - %SDL2_DIR%\lib\x86;$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories) - SDL2.lib;SDL2main.lib;d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) - Console - - - - - - - Level4 - MaxSpeed - true - true - ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) - false - - - true - true - true - %SDL2_DIR%\lib\x64;$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories) - SDL2.lib;SDL2main.lib;d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) - Console - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/third_party/imgui/examples/example_sdl_directx11/example_sdl_directx11.vcxproj.filters b/third_party/imgui/examples/example_sdl_directx11/example_sdl_directx11.vcxproj.filters deleted file mode 100644 index 15fc8533561..00000000000 --- a/third_party/imgui/examples/example_sdl_directx11/example_sdl_directx11.vcxproj.filters +++ /dev/null @@ -1,60 +0,0 @@ - - - - - {0587d7a3-f2ce-4d56-b84f-a0005d3bfce6} - - - {08e36723-ce4f-4cff-9662-c40801cf1acf} - - - - - imgui - - - imgui - - - imgui - - - sources - - - sources - - - - - imgui - - - sources - - - imgui - - - imgui - - - imgui - - - imgui - - - sources - - - sources - - - - - - sources - - - diff --git a/third_party/imgui/examples/example_sdl_directx11/main.cpp b/third_party/imgui/examples/example_sdl_directx11/main.cpp deleted file mode 100644 index fc517152082..00000000000 --- a/third_party/imgui/examples/example_sdl_directx11/main.cpp +++ /dev/null @@ -1,230 +0,0 @@ -// Dear ImGui: standalone example application for SDL2 + DirectX 11 -// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) -// 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 - -#include "imgui.h" -#include "imgui_impl_sdl.h" -#include "imgui_impl_dx11.h" -#include -#include -#include -#include - -// Data -static ID3D11Device* g_pd3dDevice = NULL; -static ID3D11DeviceContext* g_pd3dDeviceContext = NULL; -static IDXGISwapChain* g_pSwapChain = NULL; -static ID3D11RenderTargetView* g_mainRenderTargetView = NULL; - -// Forward declarations of helper functions -bool CreateDeviceD3D(HWND hWnd); -void CleanupDeviceD3D(); -void CreateRenderTarget(); -void CleanupRenderTarget(); - -// Main code -int main(int, char**) -{ - // Setup SDL - // (Some versions of SDL before <2.0.10 appears to have performance/stalling issues on a minority of Windows systems, - // depending on whether SDL_INIT_GAMECONTROLLER is enabled or disabled.. updating to latest version of SDL is recommended!) - if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) - { - printf("Error: %s\n", SDL_GetError()); - return -1; - } - - // Setup window - SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); - SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+DirectX11 example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); - SDL_SysWMinfo wmInfo; - SDL_VERSION(&wmInfo.version); - SDL_GetWindowWMInfo(window, &wmInfo); - HWND hwnd = (HWND)wmInfo.info.win.window; - - // Initialize Direct3D - if (!CreateDeviceD3D(hwnd)) - { - CleanupDeviceD3D(); - return 1; - } - - // Setup Dear ImGui context - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); - ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls - - // Setup Dear ImGui style - ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); - - // Setup Platform/Renderer backends - ImGui_ImplSDL2_InitForD3D(window); - ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext); - - // Load Fonts - // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. - // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). - // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. - // - Read 'docs/FONTS.md' for more instructions and details. - // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! - //io.Fonts->AddFontDefault(); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); - - // Our state - bool show_demo_window = true; - bool show_another_window = false; - ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - - // Main loop - bool done = false; - while (!done) - { - // Poll and handle events (inputs, window resize, etc.) - // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. - // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. - // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. - // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. - SDL_Event event; - while (SDL_PollEvent(&event)) - { - ImGui_ImplSDL2_ProcessEvent(&event); - if (event.type == SDL_QUIT) - done = true; - if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) - done = true; - if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_RESIZED && event.window.windowID == SDL_GetWindowID(window)) - { - // Release all outstanding references to the swap chain's buffers before resizing. - CleanupRenderTarget(); - g_pSwapChain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0); - CreateRenderTarget(); - } - } - - // Start the Dear ImGui frame - ImGui_ImplDX11_NewFrame(); - ImGui_ImplSDL2_NewFrame(); - ImGui::NewFrame(); - - // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). - if (show_demo_window) - ImGui::ShowDemoWindow(&show_demo_window); - - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. - { - static float f = 0.0f; - static int counter = 0; - - ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. - - ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) - ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state - ImGui::Checkbox("Another Window", &show_another_window); - - ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f - ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color - - if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) - counter++; - ImGui::SameLine(); - ImGui::Text("counter = %d", counter); - - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::End(); - } - - // 3. Show another simple window. - if (show_another_window) - { - ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) - ImGui::Text("Hello from another window!"); - if (ImGui::Button("Close Me")) - show_another_window = false; - ImGui::End(); - } - - // Rendering - ImGui::Render(); - const float clear_color_with_alpha[4] = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w }; - g_pd3dDeviceContext->OMSetRenderTargets(1, &g_mainRenderTargetView, NULL); - g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView, clear_color_with_alpha); - ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); - - g_pSwapChain->Present(1, 0); // Present with vsync - //g_pSwapChain->Present(0, 0); // Present without vsync - } - - // Cleanup - ImGui_ImplDX11_Shutdown(); - ImGui_ImplSDL2_Shutdown(); - ImGui::DestroyContext(); - - CleanupDeviceD3D(); - SDL_DestroyWindow(window); - SDL_Quit(); - - return 0; -} - -// Helper functions - -bool CreateDeviceD3D(HWND hWnd) -{ - // Setup swap chain - DXGI_SWAP_CHAIN_DESC sd; - ZeroMemory(&sd, sizeof(sd)); - sd.BufferCount = 2; - sd.BufferDesc.Width = 0; - sd.BufferDesc.Height = 0; - sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - sd.BufferDesc.RefreshRate.Numerator = 60; - sd.BufferDesc.RefreshRate.Denominator = 1; - sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; - sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - sd.OutputWindow = hWnd; - sd.SampleDesc.Count = 1; - sd.SampleDesc.Quality = 0; - sd.Windowed = TRUE; - sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; - - UINT createDeviceFlags = 0; - //createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; - D3D_FEATURE_LEVEL featureLevel; - const D3D_FEATURE_LEVEL featureLevelArray[2] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_0, }; - if (D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext) != S_OK) - return false; - - CreateRenderTarget(); - return true; -} - -void CleanupDeviceD3D() -{ - CleanupRenderTarget(); - if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = NULL; } - if (g_pd3dDeviceContext) { g_pd3dDeviceContext->Release(); g_pd3dDeviceContext = NULL; } - if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; } -} - -void CreateRenderTarget() -{ - ID3D11Texture2D* pBackBuffer; - g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer)); - g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, &g_mainRenderTargetView); - pBackBuffer->Release(); -} - -void CleanupRenderTarget() -{ - if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = NULL; } -} diff --git a/third_party/imgui/examples/example_sdl_metal/Makefile b/third_party/imgui/examples/example_sdl_metal/Makefile deleted file mode 100644 index 042bb04cce9..00000000000 --- a/third_party/imgui/examples/example_sdl_metal/Makefile +++ /dev/null @@ -1,47 +0,0 @@ -# -# You will need SDL2 (http://www.libsdl.org): -# brew install sdl2 -# - -#CXX = g++ -#CXX = clang++ - -EXE = example_sdl_metal -IMGUI_DIR = ../.. -SOURCES = main.mm -SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp -SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl.cpp $(IMGUI_DIR)/backends/imgui_impl_metal.mm -OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) - -LIBS = -framework Metal -framework MetalKit -framework Cocoa -framework IOKit -framework CoreVideo -framework QuartzCore -LIBS += `sdl2-config --libs` -LIBS += -L/usr/local/lib - -CXXFLAGS = -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends -I/usr/local/include -CXXFLAGS += `sdl2-config --cflags` -CXXFLAGS += -Wall -Wformat -CFLAGS = $(CXXFLAGS) - -%.o:%.cpp - $(CXX) $(CXXFLAGS) -c -o $@ $< - -%.o:$(IMGUI_DIR)/%.cpp - $(CXX) $(CXXFLAGS) -c -o $@ $< - -%.o:$(IMGUI_DIR)/backends/%.cpp - $(CXX) $(CXXFLAGS) -c -o $@ $< - -%.o:%.mm - $(CXX) $(CXXFLAGS) -ObjC++ -fobjc-weak -fobjc-arc -c -o $@ $< - -%.o:$(IMGUI_DIR)/backends/%.mm - $(CXX) $(CXXFLAGS) -ObjC++ -fobjc-weak -fobjc-arc -c -o $@ $< - -all: $(EXE) - @echo Build complete - -$(EXE): $(OBJS) - $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) - -clean: - rm -f $(EXE) $(OBJS) diff --git a/third_party/imgui/examples/example_sdl_opengl2/Makefile b/third_party/imgui/examples/example_sdl_opengl2/Makefile deleted file mode 100644 index 92e0554bbfa..00000000000 --- a/third_party/imgui/examples/example_sdl_opengl2/Makefile +++ /dev/null @@ -1,79 +0,0 @@ -# -# Cross Platform Makefile -# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X -# -# You will need SDL2 (http://www.libsdl.org): -# Linux: -# apt-get install libsdl2-dev -# Mac OS X: -# brew install sdl2 -# MSYS2: -# pacman -S mingw-w64-i686-SDL2 -# - -#CXX = g++ -#CXX = clang++ - -EXE = example_sdl_opengl2 -IMGUI_DIR = ../.. -SOURCES = main.cpp -SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp -SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl2.cpp -OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) -UNAME_S := $(shell uname -s) - -CXXFLAGS = -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends -CXXFLAGS += -g -Wall -Wformat -LIBS = - -##--------------------------------------------------------------------- -## BUILD FLAGS PER PLATFORM -##--------------------------------------------------------------------- - -ifeq ($(UNAME_S), Linux) #LINUX - ECHO_MESSAGE = "Linux" - LIBS += -lGL -ldl `sdl2-config --libs` - - CXXFLAGS += `sdl2-config --cflags` - CFLAGS = $(CXXFLAGS) -endif - -ifeq ($(UNAME_S), Darwin) #APPLE - ECHO_MESSAGE = "Mac OS X" - LIBS += -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo `sdl2-config --libs` - LIBS += -L/usr/local/lib -L/opt/local/lib - - CXXFLAGS += `sdl2-config --cflags` - CXXFLAGS += -I/usr/local/include -I/opt/local/include - CFLAGS = $(CXXFLAGS) -endif - -ifeq ($(OS), Windows_NT) - ECHO_MESSAGE = "MinGW" - LIBS += -lgdi32 -lopengl32 -limm32 `pkg-config --static --libs sdl2` - - CXXFLAGS += `pkg-config --cflags sdl2` - CFLAGS = $(CXXFLAGS) -endif - -##--------------------------------------------------------------------- -## BUILD RULES -##--------------------------------------------------------------------- - -%.o:%.cpp - $(CXX) $(CXXFLAGS) -c -o $@ $< - -%.o:$(IMGUI_DIR)/%.cpp - $(CXX) $(CXXFLAGS) -c -o $@ $< - -%.o:$(IMGUI_DIR)/backends/%.cpp - $(CXX) $(CXXFLAGS) -c -o $@ $< - -all: $(EXE) - @echo Build complete for $(ECHO_MESSAGE) - -$(EXE): $(OBJS) - $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) - -clean: - rm -f $(EXE) $(OBJS) diff --git a/third_party/imgui/examples/example_sdl_opengl2/README.md b/third_party/imgui/examples/example_sdl_opengl2/README.md deleted file mode 100644 index 2bf4d03adf9..00000000000 --- a/third_party/imgui/examples/example_sdl_opengl2/README.md +++ /dev/null @@ -1,29 +0,0 @@ - -# How to Build - -- On Windows with Visual Studio's IDE - -Use the provided project file (.vcxproj). Add to solution (imgui_examples.sln) if necessary. - -- On Windows with Visual Studio's CLI - -``` -set SDL2_DIR=path_to_your_sdl2_folder -cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl.cpp ..\..\backends\imgui_impl_opengl2.cpp ..\..\imgui*.cpp /FeDebug/example_sdl_opengl2.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console -# ^^ include paths ^^ source files ^^ output exe ^^ output dir ^^ libraries -# or for 64-bit: -cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl.cpp ..\..\backends\imgui_impl_opengl2.cpp ..\..\imgui*.cpp /FeDebug/example_sdl_opengl2.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x64 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console -``` - -- On Linux and similar Unixes - -``` -c++ `sdl2-config --cflags` -I .. -I ../.. -I ../../backends main.cpp ../../backends/imgui_impl_sdl.cpp ../../backends/imgui_impl_opengl2.cpp ../../imgui*.cpp `sdl2-config --libs` -lGL -``` - -- On Mac OS X - -``` -brew install sdl2 -c++ `sdl2-config --cflags` -I .. -I ../.. -I ../../backends main.cpp ../../backends/imgui_impl_sdl.cpp ../../backends/imgui_impl_opengl2.cpp ../../imgui*.cpp `sdl2-config --libs` -framework OpenGl -``` diff --git a/third_party/imgui/examples/example_sdl_opengl2/build_win32.bat b/third_party/imgui/examples/example_sdl_opengl2/build_win32.bat deleted file mode 100644 index 47529e289dd..00000000000 --- a/third_party/imgui/examples/example_sdl_opengl2/build_win32.bat +++ /dev/null @@ -1,8 +0,0 @@ -@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. -@set OUT_DIR=Debug -@set OUT_EXE=example_sdl_opengl2 -@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include -@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl.cpp ..\..\backends\imgui_impl_opengl2.cpp ..\..\imgui*.cpp -@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib opengl32.lib shell32.lib -mkdir %OUT_DIR% -cl /nologo /Zi /MD %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/third_party/imgui/examples/example_sdl_opengl2/example_sdl_opengl2.vcxproj b/third_party/imgui/examples/example_sdl_opengl2/example_sdl_opengl2.vcxproj deleted file mode 100644 index d22a67baed7..00000000000 --- a/third_party/imgui/examples/example_sdl_opengl2/example_sdl_opengl2.vcxproj +++ /dev/null @@ -1,181 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741} - example_sdl_opengl2 - 8.1 - - - - Application - true - MultiByte - v140 - - - Application - true - MultiByte - v140 - - - Application - false - true - MultiByte - v140 - - - Application - false - true - MultiByte - v140 - - - - - - - - - - - - - - - - - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - - Level4 - Disabled - ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) - - - true - %SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) - opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) - Console - msvcrt.lib - - - - - Level4 - Disabled - ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) - - - true - %SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) - opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) - Console - msvcrt.lib - - - - - Level4 - MaxSpeed - true - true - ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) - false - - - true - true - true - %SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) - opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) - Console - - - - - - - Level4 - MaxSpeed - true - true - ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) - false - - - true - true - true - %SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) - opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) - Console - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/third_party/imgui/examples/example_sdl_opengl2/example_sdl_opengl2.vcxproj.filters b/third_party/imgui/examples/example_sdl_opengl2/example_sdl_opengl2.vcxproj.filters deleted file mode 100644 index 2253b8656bf..00000000000 --- a/third_party/imgui/examples/example_sdl_opengl2/example_sdl_opengl2.vcxproj.filters +++ /dev/null @@ -1,61 +0,0 @@ - - - - - {20b90ce4-7fcb-4731-b9a0-075f875de82d} - - - {f18ab499-84e1-499f-8eff-9754361e0e52} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - - - imgui - - - imgui - - - imgui - - - sources - - - imgui - - - imgui - - - sources - - - sources - - - - - imgui - - - imgui - - - imgui - - - sources - - - sources - - - - - - sources - - - diff --git a/third_party/imgui/examples/example_sdl_opengl2/main.cpp b/third_party/imgui/examples/example_sdl_opengl2/main.cpp deleted file mode 100644 index a81f8564039..00000000000 --- a/third_party/imgui/examples/example_sdl_opengl2/main.cpp +++ /dev/null @@ -1,157 +0,0 @@ -// Dear ImGui: standalone example application for SDL2 + OpenGL -// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) -// 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 - -// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)** -// **Prefer using the code in the example_sdl_opengl3/ folder** -// See imgui_impl_sdl.cpp for details. - -#include "imgui.h" -#include "imgui_impl_sdl.h" -#include "imgui_impl_opengl2.h" -#include -#include -#include - -// Main code -int main(int, char**) -{ - // Setup SDL - // (Some versions of SDL before <2.0.10 appears to have performance/stalling issues on a minority of Windows systems, - // depending on whether SDL_INIT_GAMECONTROLLER is enabled or disabled.. updating to latest version of SDL is recommended!) - if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) - { - printf("Error: %s\n", SDL_GetError()); - return -1; - } - - // Setup window - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); - SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); - SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); - SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+OpenGL example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); - SDL_GLContext gl_context = SDL_GL_CreateContext(window); - SDL_GL_MakeCurrent(window, gl_context); - SDL_GL_SetSwapInterval(1); // Enable vsync - - // Setup Dear ImGui context - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); - ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls - - // Setup Dear ImGui style - ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); - - // Setup Platform/Renderer backends - ImGui_ImplSDL2_InitForOpenGL(window, gl_context); - ImGui_ImplOpenGL2_Init(); - - // Load Fonts - // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. - // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). - // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. - // - Read 'docs/FONTS.md' for more instructions and details. - // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! - //io.Fonts->AddFontDefault(); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); - - // Our state - bool show_demo_window = true; - bool show_another_window = false; - ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - - // Main loop - bool done = false; - while (!done) - { - // Poll and handle events (inputs, window resize, etc.) - // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. - // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. - // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. - // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. - SDL_Event event; - while (SDL_PollEvent(&event)) - { - ImGui_ImplSDL2_ProcessEvent(&event); - if (event.type == SDL_QUIT) - done = true; - if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) - done = true; - } - - // Start the Dear ImGui frame - ImGui_ImplOpenGL2_NewFrame(); - ImGui_ImplSDL2_NewFrame(); - ImGui::NewFrame(); - - // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). - if (show_demo_window) - ImGui::ShowDemoWindow(&show_demo_window); - - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. - { - static float f = 0.0f; - static int counter = 0; - - ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. - - ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) - ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state - ImGui::Checkbox("Another Window", &show_another_window); - - ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f - ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color - - if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) - counter++; - ImGui::SameLine(); - ImGui::Text("counter = %d", counter); - - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::End(); - } - - // 3. Show another simple window. - if (show_another_window) - { - ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) - ImGui::Text("Hello from another window!"); - if (ImGui::Button("Close Me")) - show_another_window = false; - ImGui::End(); - } - - // Rendering - ImGui::Render(); - glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); - glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); - glClear(GL_COLOR_BUFFER_BIT); - //glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context where shaders may be bound - ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData()); - SDL_GL_SwapWindow(window); - } - - // Cleanup - ImGui_ImplOpenGL2_Shutdown(); - ImGui_ImplSDL2_Shutdown(); - ImGui::DestroyContext(); - - SDL_GL_DeleteContext(gl_context); - SDL_DestroyWindow(window); - SDL_Quit(); - - return 0; -} diff --git a/third_party/imgui/examples/example_sdl_opengl3/Makefile b/third_party/imgui/examples/example_sdl_opengl3/Makefile deleted file mode 100644 index 1b8ab422722..00000000000 --- a/third_party/imgui/examples/example_sdl_opengl3/Makefile +++ /dev/null @@ -1,91 +0,0 @@ -# -# Cross Platform Makefile -# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X -# -# You will need SDL2 (http://www.libsdl.org): -# Linux: -# apt-get install libsdl2-dev -# Mac OS X: -# brew install sdl2 -# MSYS2: -# pacman -S mingw-w64-i686-SDL2 -# - -#CXX = g++ -#CXX = clang++ - -EXE = example_sdl_opengl3 -IMGUI_DIR = ../.. -SOURCES = main.cpp -SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp -SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl3.cpp -OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) -UNAME_S := $(shell uname -s) -LINUX_GL_LIBS = -lGL - -CXXFLAGS = -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends -CXXFLAGS += -g -Wall -Wformat -LIBS = - -##--------------------------------------------------------------------- -## OPENGL ES -##--------------------------------------------------------------------- - -## This assumes a GL ES library available in the system, e.g. libGLESv2.so -# CXXFLAGS += -DIMGUI_IMPL_OPENGL_ES2 -# LINUX_GL_LIBS = -lGLESv2 -## If you're on a Raspberry Pi and want to use the legacy drivers, -## use the following instead: -# LINUX_GL_LIBS = -L/opt/vc/lib -lbrcmGLESv2 - -##--------------------------------------------------------------------- -## BUILD FLAGS PER PLATFORM -##--------------------------------------------------------------------- - -ifeq ($(UNAME_S), Linux) #LINUX - ECHO_MESSAGE = "Linux" - LIBS += $(LINUX_GL_LIBS) -ldl `sdl2-config --libs` - - CXXFLAGS += `sdl2-config --cflags` - CFLAGS = $(CXXFLAGS) -endif - -ifeq ($(UNAME_S), Darwin) #APPLE - ECHO_MESSAGE = "Mac OS X" - LIBS += -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo `sdl2-config --libs` - LIBS += -L/usr/local/lib -L/opt/local/lib - - CXXFLAGS += `sdl2-config --cflags` - CXXFLAGS += -I/usr/local/include -I/opt/local/include - CFLAGS = $(CXXFLAGS) -endif - -ifeq ($(OS), Windows_NT) - ECHO_MESSAGE = "MinGW" - LIBS += -lgdi32 -lopengl32 -limm32 `pkg-config --static --libs sdl2` - - CXXFLAGS += `pkg-config --cflags sdl2` - CFLAGS = $(CXXFLAGS) -endif - -##--------------------------------------------------------------------- -## BUILD RULES -##--------------------------------------------------------------------- - -%.o:%.cpp - $(CXX) $(CXXFLAGS) -c -o $@ $< - -%.o:$(IMGUI_DIR)/%.cpp - $(CXX) $(CXXFLAGS) -c -o $@ $< - -%.o:$(IMGUI_DIR)/backends/%.cpp - $(CXX) $(CXXFLAGS) -c -o $@ $< - -all: $(EXE) - @echo Build complete for $(ECHO_MESSAGE) - -$(EXE): $(OBJS) - $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) - -clean: - rm -f $(EXE) $(OBJS) diff --git a/third_party/imgui/examples/example_sdl_opengl3/README.md b/third_party/imgui/examples/example_sdl_opengl3/README.md deleted file mode 100644 index 06d4b2d337f..00000000000 --- a/third_party/imgui/examples/example_sdl_opengl3/README.md +++ /dev/null @@ -1,29 +0,0 @@ - -# How to Build - -- On Windows with Visual Studio's IDE - -Use the provided project file (.vcxproj). Add to solution (imgui_examples.sln) if necessary. - -- On Windows with Visual Studio's CLI - -``` -set SDL2_DIR=path_to_your_sdl2_folder -cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp /FeDebug/example_sdl_opengl3.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console -# ^^ include paths ^^ source files ^^ output exe ^^ output dir ^^ libraries -# or for 64-bit: -cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp /FeDebug/example_sdl_opengl3.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x64 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console -``` - -- On Linux and similar Unixes - -``` -c++ `sdl2-config --cflags` -I .. -I ../.. -I ../../backends main.cpp ../../backends/imgui_impl_sdl.cpp ../../backends/imgui_impl_opengl3.cpp ../../imgui*.cpp `sdl2-config --libs` -lGL -ldl -``` - -- On Mac OS X - -``` -brew install sdl2 -c++ `sdl2-config --cflags` -I .. -I ../.. -I ../../backends main.cpp ../../backends/imgui_impl_sdl.cpp ../../backends/imgui_impl_opengl3.cpp ../../imgui*.cpp `sdl2-config --libs` -framework OpenGl -framework CoreFoundation -``` diff --git a/third_party/imgui/examples/example_sdl_opengl3/build_win32.bat b/third_party/imgui/examples/example_sdl_opengl3/build_win32.bat deleted file mode 100644 index 20851bff6f1..00000000000 --- a/third_party/imgui/examples/example_sdl_opengl3/build_win32.bat +++ /dev/null @@ -1,8 +0,0 @@ -@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. -@set OUT_DIR=Debug -@set OUT_EXE=example_sdl_opengl3 -@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include -@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp -@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib opengl32.lib shell32.lib -mkdir %OUT_DIR% -cl /nologo /Zi /MD %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/third_party/imgui/examples/example_sdl_opengl3/example_sdl_opengl3.vcxproj b/third_party/imgui/examples/example_sdl_opengl3/example_sdl_opengl3.vcxproj deleted file mode 100644 index ace041df26b..00000000000 --- a/third_party/imgui/examples/example_sdl_opengl3/example_sdl_opengl3.vcxproj +++ /dev/null @@ -1,182 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {BBAEB705-1669-40F3-8567-04CF6A991F4C} - example_sdl_opengl3 - 8.1 - - - - Application - true - MultiByte - v140 - - - Application - true - MultiByte - v140 - - - Application - false - true - MultiByte - v140 - - - Application - false - true - MultiByte - v140 - - - - - - - - - - - - - - - - - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - - Level4 - Disabled - ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) - - - true - %SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) - opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) - Console - msvcrt.lib - - - - - Level4 - Disabled - ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) - - - true - %SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) - opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) - Console - msvcrt.lib - - - - - Level4 - MaxSpeed - true - true - ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) - false - - - true - true - true - %SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) - opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) - Console - - - - - - - Level4 - MaxSpeed - true - true - ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) - false - - - true - true - true - %SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) - opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) - Console - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/third_party/imgui/examples/example_sdl_opengl3/example_sdl_opengl3.vcxproj.filters b/third_party/imgui/examples/example_sdl_opengl3/example_sdl_opengl3.vcxproj.filters deleted file mode 100644 index c8dbeae4c22..00000000000 --- a/third_party/imgui/examples/example_sdl_opengl3/example_sdl_opengl3.vcxproj.filters +++ /dev/null @@ -1,64 +0,0 @@ - - - - - {20b90ce4-7fcb-4731-b9a0-075f875de82d} - - - {f18ab499-84e1-499f-8eff-9754361e0e52} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - - - imgui - - - imgui - - - imgui - - - sources - - - sources - - - sources - - - imgui - - - imgui - - - - - imgui - - - imgui - - - imgui - - - sources - - - sources - - - sources - - - - - - sources - - - diff --git a/third_party/imgui/examples/example_sdl_opengl3/main.cpp b/third_party/imgui/examples/example_sdl_opengl3/main.cpp deleted file mode 100644 index a7e7fc014cd..00000000000 --- a/third_party/imgui/examples/example_sdl_opengl3/main.cpp +++ /dev/null @@ -1,178 +0,0 @@ -// Dear ImGui: standalone example application for SDL2 + OpenGL -// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) -// 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 - -#include "imgui.h" -#include "imgui_impl_sdl.h" -#include "imgui_impl_opengl3.h" -#include -#include -#if defined(IMGUI_IMPL_OPENGL_ES2) -#include -#else -#include -#endif - -// Main code -int main(int, char**) -{ - // Setup SDL - // (Some versions of SDL before <2.0.10 appears to have performance/stalling issues on a minority of Windows systems, - // depending on whether SDL_INIT_GAMECONTROLLER is enabled or disabled.. updating to latest version of SDL is recommended!) - if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) - { - printf("Error: %s\n", SDL_GetError()); - return -1; - } - - // Decide GL+GLSL versions -#if defined(IMGUI_IMPL_OPENGL_ES2) - // GL ES 2.0 + GLSL 100 - const char* glsl_version = "#version 100"; - SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); -#elif defined(__APPLE__) - // GL 3.2 Core + GLSL 150 - const char* glsl_version = "#version 150"; - SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); // Always required on Mac - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); -#else - // GL 3.0 + GLSL 130 - const char* glsl_version = "#version 130"; - SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); -#endif - - // Create window with graphics context - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); - SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); - SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); - SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+OpenGL3 example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); - SDL_GLContext gl_context = SDL_GL_CreateContext(window); - SDL_GL_MakeCurrent(window, gl_context); - SDL_GL_SetSwapInterval(1); // Enable vsync - - // Setup Dear ImGui context - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); - ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls - - // Setup Dear ImGui style - ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); - - // Setup Platform/Renderer backends - ImGui_ImplSDL2_InitForOpenGL(window, gl_context); - ImGui_ImplOpenGL3_Init(glsl_version); - - // Load Fonts - // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. - // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). - // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. - // - Read 'docs/FONTS.md' for more instructions and details. - // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! - //io.Fonts->AddFontDefault(); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); - - // Our state - bool show_demo_window = true; - bool show_another_window = false; - ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - - // Main loop - bool done = false; - while (!done) - { - // Poll and handle events (inputs, window resize, etc.) - // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. - // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. - // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. - // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. - SDL_Event event; - while (SDL_PollEvent(&event)) - { - ImGui_ImplSDL2_ProcessEvent(&event); - if (event.type == SDL_QUIT) - done = true; - if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) - done = true; - } - - // Start the Dear ImGui frame - ImGui_ImplOpenGL3_NewFrame(); - ImGui_ImplSDL2_NewFrame(); - ImGui::NewFrame(); - - // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). - if (show_demo_window) - ImGui::ShowDemoWindow(&show_demo_window); - - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. - { - static float f = 0.0f; - static int counter = 0; - - ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. - - ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) - ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state - ImGui::Checkbox("Another Window", &show_another_window); - - ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f - ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color - - if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) - counter++; - ImGui::SameLine(); - ImGui::Text("counter = %d", counter); - - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::End(); - } - - // 3. Show another simple window. - if (show_another_window) - { - ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) - ImGui::Text("Hello from another window!"); - if (ImGui::Button("Close Me")) - show_another_window = false; - ImGui::End(); - } - - // Rendering - ImGui::Render(); - glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); - glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); - glClear(GL_COLOR_BUFFER_BIT); - ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); - SDL_GL_SwapWindow(window); - } - - // Cleanup - ImGui_ImplOpenGL3_Shutdown(); - ImGui_ImplSDL2_Shutdown(); - ImGui::DestroyContext(); - - SDL_GL_DeleteContext(gl_context); - SDL_DestroyWindow(window); - SDL_Quit(); - - return 0; -} diff --git a/third_party/imgui/examples/example_sdl_sdlrenderer/Makefile b/third_party/imgui/examples/example_sdl_sdlrenderer/Makefile deleted file mode 100644 index 5667789af03..00000000000 --- a/third_party/imgui/examples/example_sdl_sdlrenderer/Makefile +++ /dev/null @@ -1,79 +0,0 @@ -# -# Cross Platform Makefile -# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X -# -# You will need SDL2 (http://www.libsdl.org): -# Linux: -# apt-get install libsdl2-dev -# Mac OS X: -# brew install sdl2 -# MSYS2: -# pacman -S mingw-w64-i686-SDL2 -# - -#CXX = g++ -#CXX = clang++ - -EXE = example_sdl_sdlrenderer -IMGUI_DIR = ../.. -SOURCES = main.cpp -SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp -SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl.cpp $(IMGUI_DIR)/backends/imgui_impl_sdlrenderer.cpp -OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) -UNAME_S := $(shell uname -s) - -CXXFLAGS = -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends -CXXFLAGS += -g -Wall -Wformat -LIBS = - -##--------------------------------------------------------------------- -## BUILD FLAGS PER PLATFORM -##--------------------------------------------------------------------- - -ifeq ($(UNAME_S), Linux) #LINUX - ECHO_MESSAGE = "Linux" - LIBS += -lGL -ldl `sdl2-config --libs` - - CXXFLAGS += `sdl2-config --cflags` - CFLAGS = $(CXXFLAGS) -endif - -ifeq ($(UNAME_S), Darwin) #APPLE - ECHO_MESSAGE = "Mac OS X" - LIBS += -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo `sdl2-config --libs` - LIBS += -L/usr/local/lib -L/opt/local/lib - - CXXFLAGS += `sdl2-config --cflags` - CXXFLAGS += -I/usr/local/include -I/opt/local/include - CFLAGS = $(CXXFLAGS) -endif - -ifeq ($(OS), Windows_NT) - ECHO_MESSAGE = "MinGW" - LIBS += -lgdi32 -lopengl32 -limm32 `pkg-config --static --libs sdl2` - - CXXFLAGS += `pkg-config --cflags sdl2` - CFLAGS = $(CXXFLAGS) -endif - -##--------------------------------------------------------------------- -## BUILD RULES -##--------------------------------------------------------------------- - -%.o:%.cpp - $(CXX) $(CXXFLAGS) -c -o $@ $< - -%.o:$(IMGUI_DIR)/%.cpp - $(CXX) $(CXXFLAGS) -c -o $@ $< - -%.o:$(IMGUI_DIR)/backends/%.cpp - $(CXX) $(CXXFLAGS) -c -o $@ $< - -all: $(EXE) - @echo Build complete for $(ECHO_MESSAGE) - -$(EXE): $(OBJS) - $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) - -clean: - rm -f $(EXE) $(OBJS) diff --git a/third_party/imgui/examples/example_sdl_sdlrenderer/README.md b/third_party/imgui/examples/example_sdl_sdlrenderer/README.md deleted file mode 100644 index 209f15acf05..00000000000 --- a/third_party/imgui/examples/example_sdl_sdlrenderer/README.md +++ /dev/null @@ -1,25 +0,0 @@ - -# How to Build - -- On Windows with Visual Studio's CLI - -``` -set SDL2_DIR=path_to_your_sdl2_folder -cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl.cpp ..\..\backends\imgui_impl_sdlrenderer.cpp ..\..\imgui*.cpp /FeDebug/example_sdl_sdlrenderer.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib /subsystem:console -# ^^ include paths ^^ source files ^^ output exe ^^ output dir ^^ libraries -# or for 64-bit: -cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl.cpp ..\..\backends\imgui_impl_sdlrenderer.cpp ..\..\imgui*.cpp /FeDebug/example_sdl_sdlrenderer.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x64 SDL2.lib SDL2main.lib /subsystem:console -``` - -- On Linux and similar Unixes - -``` -c++ `sdl2-config --cflags` -I .. -I ../.. main.cpp ../../backends/imgui_impl_sdl.cpp ../../backends/imgui_impl_sdlrenderer.cpp ../../imgui*.cpp `sdl2-config --libs` -lGL -``` - -- On Mac OS X - -``` -brew install sdl2 -c++ `sdl2-config --cflags` -I .. -I ../.. main.cpp ../../backends/imgui_impl_sdl.cpp ../../backends/imgui_impl_sdlrenderer.cpp ../../imgui*.cpp `sdl2-config --libs` -framework OpenGl -``` diff --git a/third_party/imgui/examples/example_sdl_sdlrenderer/build_win32.bat b/third_party/imgui/examples/example_sdl_sdlrenderer/build_win32.bat deleted file mode 100644 index 6c1b5fde054..00000000000 --- a/third_party/imgui/examples/example_sdl_sdlrenderer/build_win32.bat +++ /dev/null @@ -1,8 +0,0 @@ -@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. -@set OUT_DIR=Debug -@set OUT_EXE=example_sdl_sdlrenderer_ -@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include -@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl.cpp ..\..\backends\imgui_impl_sdlrenderer.cpp ..\..\imgui*.cpp -@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib -mkdir %OUT_DIR% -cl /nologo /Zi /MD %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/third_party/imgui/examples/example_sdl_sdlrenderer/example_sdl_sdlrenderer.vcxproj b/third_party/imgui/examples/example_sdl_sdlrenderer/example_sdl_sdlrenderer.vcxproj deleted file mode 100644 index 4d502ab67d5..00000000000 --- a/third_party/imgui/examples/example_sdl_sdlrenderer/example_sdl_sdlrenderer.vcxproj +++ /dev/null @@ -1,181 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741} - example_sdl_sdlrenderer - 8.1 - - - - Application - true - MultiByte - v140 - - - Application - true - MultiByte - v140 - - - Application - false - true - MultiByte - v140 - - - Application - false - true - MultiByte - v140 - - - - - - - - - - - - - - - - - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - - Level4 - Disabled - ..\..;..\..\backends;%SDL2_DIR%\include;%(AdditionalIncludeDirectories) - - - true - %SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) - SDL2.lib;SDL2main.lib;%(AdditionalDependencies) - Console - msvcrt.lib - - - - - Level4 - Disabled - ..\..;..\..\backends;%SDL2_DIR%\include;%(AdditionalIncludeDirectories) - - - true - %SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) - SDL2.lib;SDL2main.lib;%(AdditionalDependencies) - Console - msvcrt.lib - - - - - Level4 - MaxSpeed - true - true - ..\..;..\..\backends;%SDL2_DIR%\include;%(AdditionalIncludeDirectories) - false - - - true - true - true - %SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) - SDL2.lib;SDL2main.lib;%(AdditionalDependencies) - Console - - - - - - - Level4 - MaxSpeed - true - true - ..\..;..\..\backends;%SDL2_DIR%\include;%(AdditionalIncludeDirectories) - false - - - true - true - true - %SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) - SDL2.lib;SDL2main.lib;%(AdditionalDependencies) - Console - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/third_party/imgui/examples/example_sdl_sdlrenderer/example_sdl_sdlrenderer.vcxproj.filters b/third_party/imgui/examples/example_sdl_sdlrenderer/example_sdl_sdlrenderer.vcxproj.filters deleted file mode 100644 index 01e98fcbc93..00000000000 --- a/third_party/imgui/examples/example_sdl_sdlrenderer/example_sdl_sdlrenderer.vcxproj.filters +++ /dev/null @@ -1,61 +0,0 @@ - - - - - {20b90ce4-7fcb-4731-b9a0-075f875de82d} - - - {f18ab499-84e1-499f-8eff-9754361e0e52} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - - - imgui - - - imgui - - - imgui - - - sources - - - imgui - - - imgui - - - sources - - - sources - - - - - imgui - - - imgui - - - imgui - - - sources - - - sources - - - - - - sources - - - diff --git a/third_party/imgui/examples/example_sdl_sdlrenderer/main.cpp b/third_party/imgui/examples/example_sdl_sdlrenderer/main.cpp deleted file mode 100644 index aee4a7855a7..00000000000 --- a/third_party/imgui/examples/example_sdl_sdlrenderer/main.cpp +++ /dev/null @@ -1,161 +0,0 @@ -// Dear ImGui: standalone example application for SDL2 + SDL_Renderer -// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) -// 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 - -// Important to understand: SDL_Renderer is an _optional_ component of SDL. We do not recommend you use SDL_Renderer -// because it provide a rather limited API to the end-user. We provide this backend for the sake of completeness. -// For a multi-platform app consider using e.g. SDL+DirectX on Windows and SDL+OpenGL on Linux/OSX. - -#include "imgui.h" -#include "imgui_impl_sdl.h" -#include "imgui_impl_sdlrenderer.h" -#include -#include - -#if !SDL_VERSION_ATLEAST(2,0,17) -#error This backend requires SDL 2.0.17+ because of SDL_RenderGeometry() function -#endif - -// Main code -int main(int, char**) -{ - // Setup SDL - // (Some versions of SDL before <2.0.10 appears to have performance/stalling issues on a minority of Windows systems, - // depending on whether SDL_INIT_GAMECONTROLLER is enabled or disabled.. updating to latest version of SDL is recommended!) - if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) - { - printf("Error: %s\n", SDL_GetError()); - return -1; - } - - // Setup window - SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); - SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+SDL_Renderer example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); - - // Setup SDL_Renderer instance - SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); - if (renderer == NULL) - { - SDL_Log("Error creating SDL_Renderer!"); - return false; - } - //SDL_RendererInfo info; - //SDL_GetRendererInfo(renderer, &info); - //SDL_Log("Current SDL_Renderer: %s", info.name); - - // Setup Dear ImGui context - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); - ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls - - // Setup Dear ImGui style - ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); - - // Setup Platform/Renderer backends - ImGui_ImplSDL2_InitForSDLRenderer(window); - ImGui_ImplSDLRenderer_Init(renderer); - - // Load Fonts - // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. - // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). - // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. - // - Read 'docs/FONTS.md' for more instructions and details. - // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! - //io.Fonts->AddFontDefault(); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); - - // Our state - bool show_demo_window = true; - bool show_another_window = false; - ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - - // Main loop - bool done = false; - while (!done) - { - // Poll and handle events (inputs, window resize, etc.) - // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. - // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. - // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. - // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. - SDL_Event event; - while (SDL_PollEvent(&event)) - { - ImGui_ImplSDL2_ProcessEvent(&event); - if (event.type == SDL_QUIT) - done = true; - if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) - done = true; - } - - // Start the Dear ImGui frame - ImGui_ImplSDLRenderer_NewFrame(); - ImGui_ImplSDL2_NewFrame(window); - ImGui::NewFrame(); - - // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). - if (show_demo_window) - ImGui::ShowDemoWindow(&show_demo_window); - - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. - { - static float f = 0.0f; - static int counter = 0; - - ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. - - ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) - ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state - ImGui::Checkbox("Another Window", &show_another_window); - - ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f - ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color - - if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) - counter++; - ImGui::SameLine(); - ImGui::Text("counter = %d", counter); - - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::End(); - } - - // 3. Show another simple window. - if (show_another_window) - { - ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) - ImGui::Text("Hello from another window!"); - if (ImGui::Button("Close Me")) - show_another_window = false; - ImGui::End(); - } - - // Rendering - ImGui::Render(); - SDL_SetRenderDrawColor(renderer, (Uint8)(clear_color.x * 255), (Uint8)(clear_color.y * 255), (Uint8)(clear_color.z * 255), (Uint8)(clear_color.w * 255)); - SDL_RenderClear(renderer); - ImGui_ImplSDLRenderer_RenderDrawData(ImGui::GetDrawData()); - SDL_RenderPresent(renderer); - } - - // Cleanup - ImGui_ImplSDLRenderer_Shutdown(); - ImGui_ImplSDL2_Shutdown(); - ImGui::DestroyContext(); - - SDL_DestroyRenderer(renderer); - SDL_DestroyWindow(window); - SDL_Quit(); - - return 0; -} diff --git a/third_party/imgui/examples/example_sdl_vulkan/build_win32.bat b/third_party/imgui/examples/example_sdl_vulkan/build_win32.bat deleted file mode 100644 index 21b5ea314be..00000000000 --- a/third_party/imgui/examples/example_sdl_vulkan/build_win32.bat +++ /dev/null @@ -1,10 +0,0 @@ -@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. - -@set OUT_EXE=example_sdl_vulkan -@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include /I %VULKAN_SDK%\include -@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl.cpp ..\..\backends\imgui_impl_vulkan.cpp ..\..\imgui*.cpp -@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 /libpath:%VULKAN_SDK%\lib32 SDL2.lib SDL2main.lib shell32.lib vulkan-1.lib - -@set OUT_DIR=Debug -mkdir %OUT_DIR% -cl /nologo /Zi /MD %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/third_party/imgui/examples/example_sdl_vulkan/example_sdl_vulkan.vcxproj b/third_party/imgui/examples/example_sdl_vulkan/example_sdl_vulkan.vcxproj deleted file mode 100644 index 5cc3eab2a6a..00000000000 --- a/third_party/imgui/examples/example_sdl_vulkan/example_sdl_vulkan.vcxproj +++ /dev/null @@ -1,181 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3} - example_sdl_vulkan - 8.1 - - - - Application - true - MultiByte - v140 - - - Application - true - MultiByte - v140 - - - Application - false - true - MultiByte - v140 - - - Application - false - true - MultiByte - v140 - - - - - - - - - - - - - - - - - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - $(ProjectDir)$(Configuration)\ - $(ProjectDir)$(Configuration)\ - $(IncludePath) - - - - Level4 - Disabled - ..\..;..\..\backends;%VULKAN_SDK%\include;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) - - - true - %VULKAN_SDK%\lib32;%SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) - vulkan-1.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) - Console - msvcrt.lib - - - - - Level4 - Disabled - ..\..;..\..\backends;%VULKAN_SDK%\include;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) - - - true - %VULKAN_SDK%\lib;%SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) - vulkan-1.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) - Console - msvcrt.lib - - - - - Level4 - MaxSpeed - true - true - ..\..;..\..\backends;%VULKAN_SDK%\include;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) - false - - - true - true - true - %VULKAN_SDK%\lib32;%SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) - vulkan-1.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) - Console - - - - - - - Level4 - MaxSpeed - true - true - ..\..;..\..\backends;%VULKAN_SDK%\include;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) - false - - - true - true - true - %VULKAN_SDK%\lib;%SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) - vulkan-1.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) - Console - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/third_party/imgui/examples/example_sdl_vulkan/example_sdl_vulkan.vcxproj.filters b/third_party/imgui/examples/example_sdl_vulkan/example_sdl_vulkan.vcxproj.filters deleted file mode 100644 index 063a5936f1c..00000000000 --- a/third_party/imgui/examples/example_sdl_vulkan/example_sdl_vulkan.vcxproj.filters +++ /dev/null @@ -1,61 +0,0 @@ - - - - - {20b90ce4-7fcb-4731-b9a0-075f875de82d} - - - {f18ab499-84e1-499f-8eff-9754361e0e52} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - - - imgui - - - imgui - - - imgui - - - sources - - - sources - - - sources - - - imgui - - - sources - - - - - imgui - - - imgui - - - imgui - - - sources - - - sources - - - - - - sources - - - \ No newline at end of file diff --git a/third_party/imgui/examples/example_sdl_vulkan/main.cpp b/third_party/imgui/examples/example_sdl_vulkan/main.cpp deleted file mode 100644 index 2c01afef106..00000000000 --- a/third_party/imgui/examples/example_sdl_vulkan/main.cpp +++ /dev/null @@ -1,559 +0,0 @@ -// Dear ImGui: standalone example application for SDL2 + Vulkan -// 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 - -// 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. -// - Helper ImGui_ImplVulkanH_XXX functions and structures are only used by this example (main.cpp) and by -// the backend itself (imgui_impl_vulkan.cpp), but should PROBABLY NOT be used by your own engine/app code. -// Read comments in imgui_impl_vulkan.h. - -#include "imgui.h" -#include "imgui_impl_sdl.h" -#include "imgui_impl_vulkan.h" -#include // printf, fprintf -#include // abort -#include -#include -#include - -//#define IMGUI_UNLIMITED_FRAME_RATE -#ifdef _DEBUG -#define IMGUI_VULKAN_DEBUG_REPORT -#endif - -static VkAllocationCallbacks* g_Allocator = NULL; -static VkInstance g_Instance = VK_NULL_HANDLE; -static VkPhysicalDevice g_PhysicalDevice = VK_NULL_HANDLE; -static VkDevice g_Device = VK_NULL_HANDLE; -static uint32_t g_QueueFamily = (uint32_t)-1; -static VkQueue g_Queue = VK_NULL_HANDLE; -static VkDebugReportCallbackEXT g_DebugReport = VK_NULL_HANDLE; -static VkPipelineCache g_PipelineCache = VK_NULL_HANDLE; -static VkDescriptorPool g_DescriptorPool = VK_NULL_HANDLE; - -static ImGui_ImplVulkanH_Window g_MainWindowData; -static uint32_t g_MinImageCount = 2; -static bool g_SwapChainRebuild = false; - -static void check_vk_result(VkResult err) -{ - if (err == 0) - return; - fprintf(stderr, "[vulkan] Error: VkResult = %d\n", err); - if (err < 0) - abort(); -} - -#ifdef IMGUI_VULKAN_DEBUG_REPORT -static VKAPI_ATTR VkBool32 VKAPI_CALL debug_report(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char* pLayerPrefix, const char* pMessage, void* pUserData) -{ - (void)flags; (void)object; (void)location; (void)messageCode; (void)pUserData; (void)pLayerPrefix; // Unused arguments - fprintf(stderr, "[vulkan] Debug report from ObjectType: %i\nMessage: %s\n\n", objectType, pMessage); - return VK_FALSE; -} -#endif // IMGUI_VULKAN_DEBUG_REPORT - -static void SetupVulkan(const char** extensions, uint32_t extensions_count) -{ - VkResult err; - - // Create Vulkan Instance - { - VkInstanceCreateInfo create_info = {}; - create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; - create_info.enabledExtensionCount = extensions_count; - create_info.ppEnabledExtensionNames = extensions; -#ifdef IMGUI_VULKAN_DEBUG_REPORT - // Enabling validation layers - const char* layers[] = { "VK_LAYER_KHRONOS_validation" }; - create_info.enabledLayerCount = 1; - create_info.ppEnabledLayerNames = layers; - - // Enable debug report extension (we need additional storage, so we duplicate the user array to add our new extension to it) - const char** extensions_ext = (const char**)malloc(sizeof(const char*) * (extensions_count + 1)); - memcpy(extensions_ext, extensions, extensions_count * sizeof(const char*)); - extensions_ext[extensions_count] = "VK_EXT_debug_report"; - create_info.enabledExtensionCount = extensions_count + 1; - create_info.ppEnabledExtensionNames = extensions_ext; - - // Create Vulkan Instance - err = vkCreateInstance(&create_info, g_Allocator, &g_Instance); - check_vk_result(err); - free(extensions_ext); - - // Get the function pointer (required for any extensions) - auto vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkCreateDebugReportCallbackEXT"); - IM_ASSERT(vkCreateDebugReportCallbackEXT != NULL); - - // Setup the debug report callback - VkDebugReportCallbackCreateInfoEXT debug_report_ci = {}; - debug_report_ci.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT; - debug_report_ci.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT; - debug_report_ci.pfnCallback = debug_report; - debug_report_ci.pUserData = NULL; - err = vkCreateDebugReportCallbackEXT(g_Instance, &debug_report_ci, g_Allocator, &g_DebugReport); - check_vk_result(err); -#else - // Create Vulkan Instance without any debug feature - err = vkCreateInstance(&create_info, g_Allocator, &g_Instance); - check_vk_result(err); - IM_UNUSED(g_DebugReport); -#endif - } - - // Select GPU - { - uint32_t gpu_count; - err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, NULL); - check_vk_result(err); - IM_ASSERT(gpu_count > 0); - - VkPhysicalDevice* gpus = (VkPhysicalDevice*)malloc(sizeof(VkPhysicalDevice) * gpu_count); - err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, gpus); - check_vk_result(err); - - // If a number >1 of GPUs got reported, find discrete GPU if present, or use first one available. This covers - // most common cases (multi-gpu/integrated+dedicated graphics). Handling more complicated setups (multiple - // dedicated GPUs) is out of scope of this sample. - int use_gpu = 0; - for (int i = 0; i < (int)gpu_count; i++) - { - VkPhysicalDeviceProperties properties; - vkGetPhysicalDeviceProperties(gpus[i], &properties); - if (properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) - { - use_gpu = i; - break; - } - } - - g_PhysicalDevice = gpus[use_gpu]; - free(gpus); - } - - // Select graphics queue family - { - uint32_t count; - vkGetPhysicalDeviceQueueFamilyProperties(g_PhysicalDevice, &count, NULL); - VkQueueFamilyProperties* queues = (VkQueueFamilyProperties*)malloc(sizeof(VkQueueFamilyProperties) * count); - vkGetPhysicalDeviceQueueFamilyProperties(g_PhysicalDevice, &count, queues); - for (uint32_t i = 0; i < count; i++) - if (queues[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) - { - g_QueueFamily = i; - break; - } - free(queues); - IM_ASSERT(g_QueueFamily != (uint32_t)-1); - } - - // Create Logical Device (with 1 queue) - { - int device_extension_count = 1; - const char* device_extensions[] = { "VK_KHR_swapchain" }; - const float queue_priority[] = { 1.0f }; - VkDeviceQueueCreateInfo queue_info[1] = {}; - queue_info[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; - queue_info[0].queueFamilyIndex = g_QueueFamily; - queue_info[0].queueCount = 1; - queue_info[0].pQueuePriorities = queue_priority; - VkDeviceCreateInfo create_info = {}; - create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; - create_info.queueCreateInfoCount = sizeof(queue_info) / sizeof(queue_info[0]); - create_info.pQueueCreateInfos = queue_info; - create_info.enabledExtensionCount = device_extension_count; - create_info.ppEnabledExtensionNames = device_extensions; - err = vkCreateDevice(g_PhysicalDevice, &create_info, g_Allocator, &g_Device); - check_vk_result(err); - vkGetDeviceQueue(g_Device, g_QueueFamily, 0, &g_Queue); - } - - // Create Descriptor Pool - { - VkDescriptorPoolSize pool_sizes[] = - { - { VK_DESCRIPTOR_TYPE_SAMPLER, 1000 }, - { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1000 }, - { VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1000 }, - { VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1000 }, - { VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1000 }, - { VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1000 }, - { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1000 }, - { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1000 }, - { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1000 }, - { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, 1000 }, - { VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1000 } - }; - VkDescriptorPoolCreateInfo pool_info = {}; - pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; - pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; - pool_info.maxSets = 1000 * IM_ARRAYSIZE(pool_sizes); - pool_info.poolSizeCount = (uint32_t)IM_ARRAYSIZE(pool_sizes); - pool_info.pPoolSizes = pool_sizes; - err = vkCreateDescriptorPool(g_Device, &pool_info, g_Allocator, &g_DescriptorPool); - check_vk_result(err); - } -} - -// All the ImGui_ImplVulkanH_XXX structures/functions are optional helpers used by the demo. -// Your real engine/app may not use them. -static void SetupVulkanWindow(ImGui_ImplVulkanH_Window* wd, VkSurfaceKHR surface, int width, int height) -{ - wd->Surface = surface; - - // Check for WSI support - VkBool32 res; - vkGetPhysicalDeviceSurfaceSupportKHR(g_PhysicalDevice, g_QueueFamily, wd->Surface, &res); - if (res != VK_TRUE) - { - fprintf(stderr, "Error no WSI support on physical device 0\n"); - exit(-1); - } - - // Select Surface Format - const VkFormat requestSurfaceImageFormat[] = { VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_B8G8R8_UNORM, VK_FORMAT_R8G8B8_UNORM }; - const VkColorSpaceKHR requestSurfaceColorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR; - wd->SurfaceFormat = ImGui_ImplVulkanH_SelectSurfaceFormat(g_PhysicalDevice, wd->Surface, requestSurfaceImageFormat, (size_t)IM_ARRAYSIZE(requestSurfaceImageFormat), requestSurfaceColorSpace); - - // Select Present Mode -#ifdef IMGUI_UNLIMITED_FRAME_RATE - VkPresentModeKHR present_modes[] = { VK_PRESENT_MODE_MAILBOX_KHR, VK_PRESENT_MODE_IMMEDIATE_KHR, VK_PRESENT_MODE_FIFO_KHR }; -#else - VkPresentModeKHR present_modes[] = { VK_PRESENT_MODE_FIFO_KHR }; -#endif - wd->PresentMode = ImGui_ImplVulkanH_SelectPresentMode(g_PhysicalDevice, wd->Surface, &present_modes[0], IM_ARRAYSIZE(present_modes)); - //printf("[vulkan] Selected PresentMode = %d\n", wd->PresentMode); - - // Create SwapChain, RenderPass, Framebuffer, etc. - IM_ASSERT(g_MinImageCount >= 2); - ImGui_ImplVulkanH_CreateOrResizeWindow(g_Instance, g_PhysicalDevice, g_Device, wd, g_QueueFamily, g_Allocator, width, height, g_MinImageCount); -} - -static void CleanupVulkan() -{ - vkDestroyDescriptorPool(g_Device, g_DescriptorPool, g_Allocator); - -#ifdef IMGUI_VULKAN_DEBUG_REPORT - // Remove the debug report callback - auto vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkDestroyDebugReportCallbackEXT"); - vkDestroyDebugReportCallbackEXT(g_Instance, g_DebugReport, g_Allocator); -#endif // IMGUI_VULKAN_DEBUG_REPORT - - vkDestroyDevice(g_Device, g_Allocator); - vkDestroyInstance(g_Instance, g_Allocator); -} - -static void CleanupVulkanWindow() -{ - ImGui_ImplVulkanH_DestroyWindow(g_Instance, g_Device, &g_MainWindowData, g_Allocator); -} - -static void FrameRender(ImGui_ImplVulkanH_Window* wd, ImDrawData* draw_data) -{ - VkResult err; - - VkSemaphore image_acquired_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].ImageAcquiredSemaphore; - VkSemaphore render_complete_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].RenderCompleteSemaphore; - err = vkAcquireNextImageKHR(g_Device, wd->Swapchain, UINT64_MAX, image_acquired_semaphore, VK_NULL_HANDLE, &wd->FrameIndex); - if (err == VK_ERROR_OUT_OF_DATE_KHR || err == VK_SUBOPTIMAL_KHR) - { - g_SwapChainRebuild = true; - return; - } - check_vk_result(err); - - ImGui_ImplVulkanH_Frame* fd = &wd->Frames[wd->FrameIndex]; - { - err = vkWaitForFences(g_Device, 1, &fd->Fence, VK_TRUE, UINT64_MAX); // wait indefinitely instead of periodically checking - check_vk_result(err); - - err = vkResetFences(g_Device, 1, &fd->Fence); - check_vk_result(err); - } - { - err = vkResetCommandPool(g_Device, fd->CommandPool, 0); - check_vk_result(err); - VkCommandBufferBeginInfo info = {}; - info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - info.flags |= VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - err = vkBeginCommandBuffer(fd->CommandBuffer, &info); - check_vk_result(err); - } - { - VkRenderPassBeginInfo info = {}; - info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; - info.renderPass = wd->RenderPass; - info.framebuffer = fd->Framebuffer; - info.renderArea.extent.width = wd->Width; - info.renderArea.extent.height = wd->Height; - info.clearValueCount = 1; - info.pClearValues = &wd->ClearValue; - vkCmdBeginRenderPass(fd->CommandBuffer, &info, VK_SUBPASS_CONTENTS_INLINE); - } - - // Record dear imgui primitives into command buffer - ImGui_ImplVulkan_RenderDrawData(draw_data, fd->CommandBuffer); - - // Submit command buffer - vkCmdEndRenderPass(fd->CommandBuffer); - { - VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - VkSubmitInfo info = {}; - info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - info.waitSemaphoreCount = 1; - info.pWaitSemaphores = &image_acquired_semaphore; - info.pWaitDstStageMask = &wait_stage; - info.commandBufferCount = 1; - info.pCommandBuffers = &fd->CommandBuffer; - info.signalSemaphoreCount = 1; - info.pSignalSemaphores = &render_complete_semaphore; - - err = vkEndCommandBuffer(fd->CommandBuffer); - check_vk_result(err); - err = vkQueueSubmit(g_Queue, 1, &info, fd->Fence); - check_vk_result(err); - } -} - -static void FramePresent(ImGui_ImplVulkanH_Window* wd) -{ - if (g_SwapChainRebuild) - return; - VkSemaphore render_complete_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].RenderCompleteSemaphore; - VkPresentInfoKHR info = {}; - info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; - info.waitSemaphoreCount = 1; - info.pWaitSemaphores = &render_complete_semaphore; - info.swapchainCount = 1; - info.pSwapchains = &wd->Swapchain; - info.pImageIndices = &wd->FrameIndex; - VkResult err = vkQueuePresentKHR(g_Queue, &info); - if (err == VK_ERROR_OUT_OF_DATE_KHR || err == VK_SUBOPTIMAL_KHR) - { - g_SwapChainRebuild = true; - return; - } - check_vk_result(err); - wd->SemaphoreIndex = (wd->SemaphoreIndex + 1) % wd->ImageCount; // Now we can use the next set of semaphores -} - -int main(int, char**) -{ - // Setup SDL - if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) - { - printf("Error: %s\n", SDL_GetError()); - return -1; - } - - // Setup window - SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); - SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+Vulkan example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); - - // Setup Vulkan - uint32_t extensions_count = 0; - SDL_Vulkan_GetInstanceExtensions(window, &extensions_count, NULL); - const char** extensions = new const char*[extensions_count]; - SDL_Vulkan_GetInstanceExtensions(window, &extensions_count, extensions); - SetupVulkan(extensions, extensions_count); - delete[] extensions; - - // Create Window Surface - VkSurfaceKHR surface; - VkResult err; - if (SDL_Vulkan_CreateSurface(window, g_Instance, &surface) == 0) - { - printf("Failed to create Vulkan surface.\n"); - return 1; - } - - // Create Framebuffers - int w, h; - SDL_GetWindowSize(window, &w, &h); - ImGui_ImplVulkanH_Window* wd = &g_MainWindowData; - SetupVulkanWindow(wd, surface, w, h); - - // Setup Dear ImGui context - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); - ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls - - // Setup Dear ImGui style - ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); - - // Setup Platform/Renderer backends - ImGui_ImplSDL2_InitForVulkan(window); - ImGui_ImplVulkan_InitInfo init_info = {}; - init_info.Instance = g_Instance; - init_info.PhysicalDevice = g_PhysicalDevice; - init_info.Device = g_Device; - init_info.QueueFamily = g_QueueFamily; - init_info.Queue = g_Queue; - init_info.PipelineCache = g_PipelineCache; - init_info.DescriptorPool = g_DescriptorPool; - init_info.Allocator = g_Allocator; - init_info.MinImageCount = g_MinImageCount; - init_info.ImageCount = wd->ImageCount; - init_info.CheckVkResultFn = check_vk_result; - ImGui_ImplVulkan_Init(&init_info, wd->RenderPass); - - // Load Fonts - // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. - // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). - // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. - // - Read 'docs/FONTS.md' for more instructions and details. - // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! - //io.Fonts->AddFontDefault(); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); - - // Upload Fonts - { - // Use any command queue - VkCommandPool command_pool = wd->Frames[wd->FrameIndex].CommandPool; - VkCommandBuffer command_buffer = wd->Frames[wd->FrameIndex].CommandBuffer; - - err = vkResetCommandPool(g_Device, command_pool, 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(command_buffer, &begin_info); - check_vk_result(err); - - ImGui_ImplVulkan_CreateFontsTexture(command_buffer); - - VkSubmitInfo end_info = {}; - end_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - end_info.commandBufferCount = 1; - end_info.pCommandBuffers = &command_buffer; - err = vkEndCommandBuffer(command_buffer); - check_vk_result(err); - err = vkQueueSubmit(g_Queue, 1, &end_info, VK_NULL_HANDLE); - check_vk_result(err); - - err = vkDeviceWaitIdle(g_Device); - check_vk_result(err); - ImGui_ImplVulkan_DestroyFontUploadObjects(); - } - - // Our state - bool show_demo_window = true; - bool show_another_window = false; - ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - - // Main loop - bool done = false; - while (!done) - { - // Poll and handle events (inputs, window resize, etc.) - // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. - // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. - // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. - // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. - SDL_Event event; - while (SDL_PollEvent(&event)) - { - ImGui_ImplSDL2_ProcessEvent(&event); - if (event.type == SDL_QUIT) - done = true; - if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) - done = true; - } - - // Resize swap chain? - if (g_SwapChainRebuild) - { - int width, height; - SDL_GetWindowSize(window, &width, &height); - if (width > 0 && height > 0) - { - ImGui_ImplVulkan_SetMinImageCount(g_MinImageCount); - ImGui_ImplVulkanH_CreateOrResizeWindow(g_Instance, g_PhysicalDevice, g_Device, &g_MainWindowData, g_QueueFamily, g_Allocator, width, height, g_MinImageCount); - g_MainWindowData.FrameIndex = 0; - g_SwapChainRebuild = false; - } - } - - // Start the Dear ImGui frame - ImGui_ImplVulkan_NewFrame(); - ImGui_ImplSDL2_NewFrame(); - ImGui::NewFrame(); - - // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). - if (show_demo_window) - ImGui::ShowDemoWindow(&show_demo_window); - - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. - { - static float f = 0.0f; - static int counter = 0; - - ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. - - ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) - ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state - ImGui::Checkbox("Another Window", &show_another_window); - - ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f - ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color - - if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) - counter++; - ImGui::SameLine(); - ImGui::Text("counter = %d", counter); - - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::End(); - } - - // 3. Show another simple window. - if (show_another_window) - { - ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) - ImGui::Text("Hello from another window!"); - if (ImGui::Button("Close Me")) - show_another_window = false; - ImGui::End(); - } - - // Rendering - ImGui::Render(); - ImDrawData* draw_data = ImGui::GetDrawData(); - const bool is_minimized = (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f); - if (!is_minimized) - { - wd->ClearValue.color.float32[0] = clear_color.x * clear_color.w; - wd->ClearValue.color.float32[1] = clear_color.y * clear_color.w; - wd->ClearValue.color.float32[2] = clear_color.z * clear_color.w; - wd->ClearValue.color.float32[3] = clear_color.w; - FrameRender(wd, draw_data); - FramePresent(wd); - } - } - - // Cleanup - err = vkDeviceWaitIdle(g_Device); - check_vk_result(err); - ImGui_ImplVulkan_Shutdown(); - ImGui_ImplSDL2_Shutdown(); - ImGui::DestroyContext(); - - CleanupVulkanWindow(); - CleanupVulkan(); - - SDL_DestroyWindow(window); - SDL_Quit(); - - return 0; -} diff --git a/third_party/imgui/examples/example_win32_directx10/build_win32.bat b/third_party/imgui/examples/example_win32_directx10/build_win32.bat index fd742239cae..78a6e374d57 100644 --- a/third_party/imgui/examples/example_win32_directx10/build_win32.bat +++ b/third_party/imgui/examples/example_win32_directx10/build_win32.bat @@ -5,4 +5,4 @@ @set SOURCES=main.cpp ..\..\backends\imgui_impl_win32.cpp ..\..\backends\imgui_impl_dx10.cpp ..\..\imgui*.cpp @set LIBS=/LIBPATH:"%DXSDK_DIR%/Lib/x86" d3d10.lib d3dcompiler.lib mkdir %OUT_DIR% -cl /nologo /Zi /MD %INCLUDES% /D UNICODE /D _UNICODE %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% +cl /nologo /Zi /MD /utf-8 %INCLUDES% /D UNICODE /D _UNICODE %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/third_party/imgui/examples/example_win32_directx10/example_win32_directx10.vcxproj b/third_party/imgui/examples/example_win32_directx10/example_win32_directx10.vcxproj index e71cb0a79e8..d11aed88387 100644 --- a/third_party/imgui/examples/example_win32_directx10/example_win32_directx10.vcxproj +++ b/third_party/imgui/examples/example_win32_directx10/example_win32_directx10.vcxproj @@ -87,6 +87,7 @@ Level4 Disabled ..\..;..\..\backends;%(AdditionalIncludeDirectories); + /utf-8 %(AdditionalOptions) true @@ -100,6 +101,7 @@ Level4 Disabled ..\..;..\..\backends;%(AdditionalIncludeDirectories); + /utf-8 %(AdditionalOptions) true @@ -116,6 +118,7 @@ true ..\..;..\..\backends;%(AdditionalIncludeDirectories); false + /utf-8 %(AdditionalOptions) true @@ -134,6 +137,7 @@ true ..\..;..\..\backends;%(AdditionalIncludeDirectories); false + /utf-8 %(AdditionalOptions) true @@ -162,6 +166,7 @@ + diff --git a/third_party/imgui/examples/example_win32_directx10/example_win32_directx10.vcxproj.filters b/third_party/imgui/examples/example_win32_directx10/example_win32_directx10.vcxproj.filters index 11ad8f90f06..33ab99b5189 100644 --- a/third_party/imgui/examples/example_win32_directx10/example_win32_directx10.vcxproj.filters +++ b/third_party/imgui/examples/example_win32_directx10/example_win32_directx10.vcxproj.filters @@ -54,7 +54,10 @@ - sources + imgui + + + imgui - + \ No newline at end of file diff --git a/third_party/imgui/examples/example_win32_directx10/main.cpp b/third_party/imgui/examples/example_win32_directx10/main.cpp index ad88d1e9607..21198da9ae5 100644 --- a/third_party/imgui/examples/example_win32_directx10/main.cpp +++ b/third_party/imgui/examples/example_win32_directx10/main.cpp @@ -1,6 +1,10 @@ // Dear ImGui: standalone example application for DirectX 10 -// 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 #include "imgui.h" #include "imgui_impl_win32.h" @@ -10,9 +14,11 @@ #include // Data -static ID3D10Device* g_pd3dDevice = NULL; -static IDXGISwapChain* g_pSwapChain = NULL; -static ID3D10RenderTargetView* g_mainRenderTargetView = NULL; +static ID3D10Device* g_pd3dDevice = nullptr; +static IDXGISwapChain* g_pSwapChain = nullptr; +static bool g_SwapChainOccluded = false; +static UINT g_ResizeWidth = 0, g_ResizeHeight = 0; +static ID3D10RenderTargetView* g_mainRenderTargetView = nullptr; // Forward declarations of helper functions bool CreateDeviceD3D(HWND hWnd); @@ -26,15 +32,15 @@ int main(int, char**) { // Create application window //ImGui_ImplWin32_EnableDpiAwareness(); - WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, _T("ImGui Example"), NULL }; - ::RegisterClassEx(&wc); - HWND hwnd = ::CreateWindow(wc.lpszClassName, _T("Dear ImGui DirectX10 Example"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL); + WNDCLASSEXW wc = { sizeof(wc), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(nullptr), nullptr, nullptr, nullptr, nullptr, L"ImGui Example", nullptr }; + ::RegisterClassExW(&wc); + HWND hwnd = ::CreateWindowW(wc.lpszClassName, L"Dear ImGui DirectX10 Example", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, nullptr, nullptr, wc.hInstance, nullptr); // Initialize Direct3D if (!CreateDeviceD3D(hwnd)) { CleanupDeviceD3D(); - ::UnregisterClass(wc.lpszClassName, wc.hInstance); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); return 1; } @@ -46,12 +52,12 @@ int main(int, char**) IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls // Setup Dear ImGui style ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); + //ImGui::StyleColorsLight(); // Setup Platform/Renderer backends ImGui_ImplWin32_Init(hwnd); @@ -60,17 +66,18 @@ int main(int, char**) // Load Fonts // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. // - Read 'docs/FONTS.md' for more instructions and details. // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); // Our state bool show_demo_window = true; @@ -82,12 +89,9 @@ int main(int, char**) while (!done) { // Poll and handle messages (inputs, window resize, etc.) - // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. - // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. - // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. - // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + // See the WndProc() function below for our to dispatch events to the Win32 backend. MSG msg; - while (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) + while (::PeekMessage(&msg, nullptr, 0U, 0U, PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); @@ -97,6 +101,23 @@ int main(int, char**) if (done) break; + // Handle window being minimized or screen locked + if (g_SwapChainOccluded && g_pSwapChain->Present(0, DXGI_PRESENT_TEST) == DXGI_STATUS_OCCLUDED) + { + ::Sleep(10); + continue; + } + g_SwapChainOccluded = false; + + // Handle window resize (we don't resize directly in the WM_SIZE handler) + if (g_ResizeWidth != 0 && g_ResizeHeight != 0) + { + CleanupRenderTarget(); + g_pSwapChain->ResizeBuffers(0, g_ResizeWidth, g_ResizeHeight, DXGI_FORMAT_UNKNOWN, 0); + g_ResizeWidth = g_ResizeHeight = 0; + CreateRenderTarget(); + } + // Start the Dear ImGui frame ImGui_ImplDX10_NewFrame(); ImGui_ImplWin32_NewFrame(); @@ -106,7 +127,7 @@ int main(int, char**) if (show_demo_window) ImGui::ShowDemoWindow(&show_demo_window); - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. { static float f = 0.0f; static int counter = 0; @@ -125,7 +146,7 @@ int main(int, char**) ImGui::SameLine(); ImGui::Text("counter = %d", counter); - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); ImGui::End(); } @@ -142,21 +163,24 @@ int main(int, char**) // Rendering ImGui::Render(); const float clear_color_with_alpha[4] = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w }; - g_pd3dDevice->OMSetRenderTargets(1, &g_mainRenderTargetView, NULL); + g_pd3dDevice->OMSetRenderTargets(1, &g_mainRenderTargetView, nullptr); g_pd3dDevice->ClearRenderTargetView(g_mainRenderTargetView, clear_color_with_alpha); ImGui_ImplDX10_RenderDrawData(ImGui::GetDrawData()); - g_pSwapChain->Present(1, 0); // Present with vsync - //g_pSwapChain->Present(0, 0); // Present without vsync + // Present + HRESULT hr = g_pSwapChain->Present(1, 0); // Present with vsync + //HRESULT hr = g_pSwapChain->Present(0, 0); // Present without vsync + g_SwapChainOccluded = (hr == DXGI_STATUS_OCCLUDED); } + // Cleanup ImGui_ImplDX10_Shutdown(); ImGui_ImplWin32_Shutdown(); ImGui::DestroyContext(); CleanupDeviceD3D(); ::DestroyWindow(hwnd); - ::UnregisterClass(wc.lpszClassName, wc.hInstance); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); return 0; } @@ -184,7 +208,10 @@ bool CreateDeviceD3D(HWND hWnd) UINT createDeviceFlags = 0; //createDeviceFlags |= D3D10_CREATE_DEVICE_DEBUG; - if (D3D10CreateDeviceAndSwapChain(NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice) != S_OK) + HRESULT res = D3D10CreateDeviceAndSwapChain(nullptr, D3D10_DRIVER_TYPE_HARDWARE, nullptr, createDeviceFlags, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice); + if (res == DXGI_ERROR_UNSUPPORTED) // Try high-performance WARP software driver if hardware is not available. + res = D3D10CreateDeviceAndSwapChain(nullptr, D3D10_DRIVER_TYPE_WARP, nullptr, createDeviceFlags, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice); + if (res != S_OK) return false; CreateRenderTarget(); @@ -194,27 +221,31 @@ bool CreateDeviceD3D(HWND hWnd) void CleanupDeviceD3D() { CleanupRenderTarget(); - if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = NULL; } - if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; } + if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = nullptr; } + if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = nullptr; } } void CreateRenderTarget() { ID3D10Texture2D* pBackBuffer; g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer)); - g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, &g_mainRenderTargetView); + g_pd3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, &g_mainRenderTargetView); pBackBuffer->Release(); } void CleanupRenderTarget() { - if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = NULL; } + if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = nullptr; } } // Forward declare message handler from imgui_impl_win32.cpp extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); // Win32 message handler +// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. +// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. +// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. +// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) @@ -223,12 +254,10 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) switch (msg) { case WM_SIZE: - if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED) - { - CleanupRenderTarget(); - g_pSwapChain->ResizeBuffers(0, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam), DXGI_FORMAT_UNKNOWN, 0); - CreateRenderTarget(); - } + if (wParam == SIZE_MINIMIZED) + return 0; + g_ResizeWidth = (UINT)LOWORD(lParam); // Queue resize + g_ResizeHeight = (UINT)HIWORD(lParam); return 0; case WM_SYSCOMMAND: if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu @@ -238,5 +267,5 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) ::PostQuitMessage(0); return 0; } - return ::DefWindowProc(hWnd, msg, wParam, lParam); + return ::DefWindowProcW(hWnd, msg, wParam, lParam); } diff --git a/third_party/imgui/examples/example_win32_directx11/build_win32.bat b/third_party/imgui/examples/example_win32_directx11/build_win32.bat index b1cf7d1cb84..c9a717c60a6 100644 --- a/third_party/imgui/examples/example_win32_directx11/build_win32.bat +++ b/third_party/imgui/examples/example_win32_directx11/build_win32.bat @@ -5,5 +5,5 @@ @set SOURCES=main.cpp ..\..\backends\imgui_impl_dx11.cpp ..\..\backends\imgui_impl_win32.cpp ..\..\imgui*.cpp @set LIBS=/LIBPATH:"%DXSDK_DIR%/Lib/x86" d3d11.lib d3dcompiler.lib mkdir %OUT_DIR% -cl /nologo /Zi /MD %INCLUDES% /D UNICODE /D _UNICODE %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% +cl /nologo /Zi /MD /utf-8 %INCLUDES% /D UNICODE /D _UNICODE %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/third_party/imgui/examples/example_win32_directx11/example_win32_directx11.vcxproj b/third_party/imgui/examples/example_win32_directx11/example_win32_directx11.vcxproj index 273d351cb74..bace6a2c836 100644 --- a/third_party/imgui/examples/example_win32_directx11/example_win32_directx11.vcxproj +++ b/third_party/imgui/examples/example_win32_directx11/example_win32_directx11.vcxproj @@ -86,6 +86,7 @@ Level4 Disabled ..\..;..\..\backends;%(AdditionalIncludeDirectories); + /utf-8 %(AdditionalOptions) true @@ -99,6 +100,7 @@ Level4 Disabled ..\..;..\..\backends;%(AdditionalIncludeDirectories); + /utf-8 %(AdditionalOptions) true @@ -115,6 +117,7 @@ true ..\..;..\..\backends;%(AdditionalIncludeDirectories); false + /utf-8 %(AdditionalOptions) true @@ -133,6 +136,7 @@ true ..\..;..\..\backends;%(AdditionalIncludeDirectories); false + /utf-8 %(AdditionalOptions) true @@ -161,6 +165,7 @@ + diff --git a/third_party/imgui/examples/example_win32_directx11/example_win32_directx11.vcxproj.filters b/third_party/imgui/examples/example_win32_directx11/example_win32_directx11.vcxproj.filters index 02cf18cabe6..63032a6aa58 100644 --- a/third_party/imgui/examples/example_win32_directx11/example_win32_directx11.vcxproj.filters +++ b/third_party/imgui/examples/example_win32_directx11/example_win32_directx11.vcxproj.filters @@ -54,7 +54,10 @@ - sources + imgui + + + imgui - + \ No newline at end of file diff --git a/third_party/imgui/examples/example_win32_directx11/main.cpp b/third_party/imgui/examples/example_win32_directx11/main.cpp index 7f1b4b896a3..5285df10225 100644 --- a/third_party/imgui/examples/example_win32_directx11/main.cpp +++ b/third_party/imgui/examples/example_win32_directx11/main.cpp @@ -1,6 +1,10 @@ // Dear ImGui: standalone example application for DirectX 11 -// 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 #include "imgui.h" #include "imgui_impl_win32.h" @@ -9,10 +13,12 @@ #include // Data -static ID3D11Device* g_pd3dDevice = NULL; -static ID3D11DeviceContext* g_pd3dDeviceContext = NULL; -static IDXGISwapChain* g_pSwapChain = NULL; -static ID3D11RenderTargetView* g_mainRenderTargetView = NULL; +static ID3D11Device* g_pd3dDevice = nullptr; +static ID3D11DeviceContext* g_pd3dDeviceContext = nullptr; +static IDXGISwapChain* g_pSwapChain = nullptr; +static bool g_SwapChainOccluded = false; +static UINT g_ResizeWidth = 0, g_ResizeHeight = 0; +static ID3D11RenderTargetView* g_mainRenderTargetView = nullptr; // Forward declarations of helper functions bool CreateDeviceD3D(HWND hWnd); @@ -26,15 +32,15 @@ int main(int, char**) { // Create application window //ImGui_ImplWin32_EnableDpiAwareness(); - WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, _T("ImGui Example"), NULL }; - ::RegisterClassEx(&wc); - HWND hwnd = ::CreateWindow(wc.lpszClassName, _T("Dear ImGui DirectX11 Example"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL); + WNDCLASSEXW wc = { sizeof(wc), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(nullptr), nullptr, nullptr, nullptr, nullptr, L"ImGui Example", nullptr }; + ::RegisterClassExW(&wc); + HWND hwnd = ::CreateWindowW(wc.lpszClassName, L"Dear ImGui DirectX11 Example", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, nullptr, nullptr, wc.hInstance, nullptr); // Initialize Direct3D if (!CreateDeviceD3D(hwnd)) { CleanupDeviceD3D(); - ::UnregisterClass(wc.lpszClassName, wc.hInstance); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); return 1; } @@ -46,12 +52,12 @@ int main(int, char**) IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls // Setup Dear ImGui style ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); + //ImGui::StyleColorsLight(); // Setup Platform/Renderer backends ImGui_ImplWin32_Init(hwnd); @@ -60,17 +66,18 @@ int main(int, char**) // Load Fonts // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. // - Read 'docs/FONTS.md' for more instructions and details. // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); // Our state bool show_demo_window = true; @@ -82,12 +89,9 @@ int main(int, char**) while (!done) { // Poll and handle messages (inputs, window resize, etc.) - // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. - // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. - // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. - // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + // See the WndProc() function below for our to dispatch events to the Win32 backend. MSG msg; - while (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) + while (::PeekMessage(&msg, nullptr, 0U, 0U, PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); @@ -97,6 +101,23 @@ int main(int, char**) if (done) break; + // Handle window being minimized or screen locked + if (g_SwapChainOccluded && g_pSwapChain->Present(0, DXGI_PRESENT_TEST) == DXGI_STATUS_OCCLUDED) + { + ::Sleep(10); + continue; + } + g_SwapChainOccluded = false; + + // Handle window resize (we don't resize directly in the WM_SIZE handler) + if (g_ResizeWidth != 0 && g_ResizeHeight != 0) + { + CleanupRenderTarget(); + g_pSwapChain->ResizeBuffers(0, g_ResizeWidth, g_ResizeHeight, DXGI_FORMAT_UNKNOWN, 0); + g_ResizeWidth = g_ResizeHeight = 0; + CreateRenderTarget(); + } + // Start the Dear ImGui frame ImGui_ImplDX11_NewFrame(); ImGui_ImplWin32_NewFrame(); @@ -106,7 +127,7 @@ int main(int, char**) if (show_demo_window) ImGui::ShowDemoWindow(&show_demo_window); - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. { static float f = 0.0f; static int counter = 0; @@ -125,7 +146,7 @@ int main(int, char**) ImGui::SameLine(); ImGui::Text("counter = %d", counter); - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); ImGui::End(); } @@ -142,12 +163,14 @@ int main(int, char**) // Rendering ImGui::Render(); const float clear_color_with_alpha[4] = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w }; - g_pd3dDeviceContext->OMSetRenderTargets(1, &g_mainRenderTargetView, NULL); + g_pd3dDeviceContext->OMSetRenderTargets(1, &g_mainRenderTargetView, nullptr); g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView, clear_color_with_alpha); ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); - g_pSwapChain->Present(1, 0); // Present with vsync - //g_pSwapChain->Present(0, 0); // Present without vsync + // Present + HRESULT hr = g_pSwapChain->Present(1, 0); // Present with vsync + //HRESULT hr = g_pSwapChain->Present(0, 0); // Present without vsync + g_SwapChainOccluded = (hr == DXGI_STATUS_OCCLUDED); } // Cleanup @@ -157,7 +180,7 @@ int main(int, char**) CleanupDeviceD3D(); ::DestroyWindow(hwnd); - ::UnregisterClass(wc.lpszClassName, wc.hInstance); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); return 0; } @@ -187,7 +210,10 @@ bool CreateDeviceD3D(HWND hWnd) //createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; D3D_FEATURE_LEVEL featureLevel; const D3D_FEATURE_LEVEL featureLevelArray[2] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_0, }; - if (D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext) != S_OK) + HRESULT res = D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext); + if (res == DXGI_ERROR_UNSUPPORTED) // Try high-performance WARP software driver if hardware is not available. + res = D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_WARP, nullptr, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext); + if (res != S_OK) return false; CreateRenderTarget(); @@ -197,28 +223,32 @@ bool CreateDeviceD3D(HWND hWnd) void CleanupDeviceD3D() { CleanupRenderTarget(); - if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = NULL; } - if (g_pd3dDeviceContext) { g_pd3dDeviceContext->Release(); g_pd3dDeviceContext = NULL; } - if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; } + if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = nullptr; } + if (g_pd3dDeviceContext) { g_pd3dDeviceContext->Release(); g_pd3dDeviceContext = nullptr; } + if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = nullptr; } } void CreateRenderTarget() { ID3D11Texture2D* pBackBuffer; g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer)); - g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, &g_mainRenderTargetView); + g_pd3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, &g_mainRenderTargetView); pBackBuffer->Release(); } void CleanupRenderTarget() { - if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = NULL; } + if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = nullptr; } } // Forward declare message handler from imgui_impl_win32.cpp extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); // Win32 message handler +// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. +// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. +// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. +// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) @@ -227,12 +257,10 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) switch (msg) { case WM_SIZE: - if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED) - { - CleanupRenderTarget(); - g_pSwapChain->ResizeBuffers(0, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam), DXGI_FORMAT_UNKNOWN, 0); - CreateRenderTarget(); - } + if (wParam == SIZE_MINIMIZED) + return 0; + g_ResizeWidth = (UINT)LOWORD(lParam); // Queue resize + g_ResizeHeight = (UINT)HIWORD(lParam); return 0; case WM_SYSCOMMAND: if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu @@ -242,5 +270,5 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) ::PostQuitMessage(0); return 0; } - return ::DefWindowProc(hWnd, msg, wParam, lParam); + return ::DefWindowProcW(hWnd, msg, wParam, lParam); } diff --git a/third_party/imgui/examples/example_win32_directx12/build_win32.bat b/third_party/imgui/examples/example_win32_directx12/build_win32.bat index 48dadb29943..68e3c921e39 100644 --- a/third_party/imgui/examples/example_win32_directx12/build_win32.bat +++ b/third_party/imgui/examples/example_win32_directx12/build_win32.bat @@ -6,4 +6,4 @@ @set SOURCES=main.cpp ..\..\backends\imgui_impl_dx12.cpp ..\..\backends\imgui_impl_win32.cpp ..\..\imgui*.cpp @set LIBS=d3d12.lib d3dcompiler.lib dxgi.lib mkdir Debug -cl /nologo /Zi /MD %INCLUDES% /D ImTextureID=ImU64 /D UNICODE /D _UNICODE %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% +cl /nologo /Zi /MD /utf-8 %INCLUDES% /D ImTextureID=ImU64 /D UNICODE /D _UNICODE %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/third_party/imgui/examples/example_win32_directx12/example_win32_directx12.vcxproj b/third_party/imgui/examples/example_win32_directx12/example_win32_directx12.vcxproj index 3fed30d9445..7b64371eff8 100644 --- a/third_party/imgui/examples/example_win32_directx12/example_win32_directx12.vcxproj +++ b/third_party/imgui/examples/example_win32_directx12/example_win32_directx12.vcxproj @@ -88,6 +88,7 @@ Disabled ..\..;..\..\backends;%(AdditionalIncludeDirectories) ImTextureID=ImU64;_UNICODE;UNICODE;%(PreprocessorDefinitions) + /utf-8 %(AdditionalOptions) true @@ -102,6 +103,7 @@ Disabled ..\..;..\..\backends;%(AdditionalIncludeDirectories) ImTextureID=ImU64;_UNICODE;UNICODE;%(PreprocessorDefinitions) + /utf-8 %(AdditionalOptions) true @@ -118,6 +120,7 @@ true ..\..;..\..\backends;%(AdditionalIncludeDirectories) ImTextureID=ImU64;_UNICODE;UNICODE;%(PreprocessorDefinitions) + /utf-8 %(AdditionalOptions) true @@ -136,6 +139,7 @@ true ..\..;..\..\backends;%(AdditionalIncludeDirectories) ImTextureID=ImU64;_UNICODE;UNICODE;%(PreprocessorDefinitions) + /utf-8 %(AdditionalOptions) true @@ -164,8 +168,12 @@ + + + + diff --git a/third_party/imgui/examples/example_win32_directx12/example_win32_directx12.vcxproj.filters b/third_party/imgui/examples/example_win32_directx12/example_win32_directx12.vcxproj.filters index 91fc7343d89..23a99526f7d 100644 --- a/third_party/imgui/examples/example_win32_directx12/example_win32_directx12.vcxproj.filters +++ b/third_party/imgui/examples/example_win32_directx12/example_win32_directx12.vcxproj.filters @@ -53,5 +53,13 @@ + + imgui + + + + + imgui + - + \ No newline at end of file diff --git a/third_party/imgui/examples/example_win32_directx12/main.cpp b/third_party/imgui/examples/example_win32_directx12/main.cpp index 74bfef326df..57a481c710f 100644 --- a/third_party/imgui/examples/example_win32_directx12/main.cpp +++ b/third_party/imgui/examples/example_win32_directx12/main.cpp @@ -1,6 +1,10 @@ // Dear ImGui: standalone example application for DirectX 12 -// 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 // Important: to compile on 32-bit systems, the DirectX12 backend requires code to be compiled with '#define ImTextureID ImU64'. // This is because we need ImTextureID to carry a 64-bit value and by default ImTextureID is defined as void*. @@ -22,6 +26,8 @@ #pragma comment(lib, "dxguid.lib") #endif +#include "imgui_internal.h" + struct FrameContext { ID3D12CommandAllocator* CommandAllocator; @@ -34,16 +40,17 @@ static FrameContext g_frameContext[NUM_FRAMES_IN_FLIGHT] = {}; static UINT g_frameIndex = 0; static int const NUM_BACK_BUFFERS = 3; -static ID3D12Device* g_pd3dDevice = NULL; -static ID3D12DescriptorHeap* g_pd3dRtvDescHeap = NULL; -static ID3D12DescriptorHeap* g_pd3dSrvDescHeap = NULL; -static ID3D12CommandQueue* g_pd3dCommandQueue = NULL; -static ID3D12GraphicsCommandList* g_pd3dCommandList = NULL; -static ID3D12Fence* g_fence = NULL; -static HANDLE g_fenceEvent = NULL; +static ID3D12Device* g_pd3dDevice = nullptr; +static ID3D12DescriptorHeap* g_pd3dRtvDescHeap = nullptr; +static ID3D12DescriptorHeap* g_pd3dSrvDescHeap = nullptr; +static ID3D12CommandQueue* g_pd3dCommandQueue = nullptr; +static ID3D12GraphicsCommandList* g_pd3dCommandList = nullptr; +static ID3D12Fence* g_fence = nullptr; +static HANDLE g_fenceEvent = nullptr; static UINT64 g_fenceLastSignaledValue = 0; -static IDXGISwapChain3* g_pSwapChain = NULL; -static HANDLE g_hSwapChainWaitableObject = NULL; +static IDXGISwapChain3* g_pSwapChain = nullptr; +static bool g_SwapChainOccluded = false; +static HANDLE g_hSwapChainWaitableObject = nullptr; static ID3D12Resource* g_mainRenderTargetResource[NUM_BACK_BUFFERS] = {}; static D3D12_CPU_DESCRIPTOR_HANDLE g_mainRenderTargetDescriptor[NUM_BACK_BUFFERS] = {}; @@ -61,15 +68,15 @@ int main(int, char**) { // Create application window //ImGui_ImplWin32_EnableDpiAwareness(); - WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, _T("ImGui Example"), NULL }; - ::RegisterClassEx(&wc); - HWND hwnd = ::CreateWindow(wc.lpszClassName, _T("Dear ImGui DirectX12 Example"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL); + WNDCLASSEXW wc = { sizeof(wc), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(nullptr), nullptr, nullptr, nullptr, nullptr, L"ImGui Example", nullptr }; + ::RegisterClassExW(&wc); + HWND hwnd = ::CreateWindowW(wc.lpszClassName, L"Dear ImGui DirectX12 Example", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, nullptr, nullptr, wc.hInstance, nullptr); // Initialize Direct3D if (!CreateDeviceD3D(hwnd)) { CleanupDeviceD3D(); - ::UnregisterClass(wc.lpszClassName, wc.hInstance); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); return 1; } @@ -81,12 +88,12 @@ int main(int, char**) IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls // Setup Dear ImGui style ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); + //ImGui::StyleColorsLight(); // Setup Platform/Renderer backends ImGui_ImplWin32_Init(hwnd); @@ -98,17 +105,18 @@ int main(int, char**) // Load Fonts // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. // - Read 'docs/FONTS.md' for more instructions and details. // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); // Our state bool show_demo_window = true; @@ -120,12 +128,9 @@ int main(int, char**) while (!done) { // Poll and handle messages (inputs, window resize, etc.) - // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. - // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. - // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. - // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + // See the WndProc() function below for our to dispatch events to the Win32 backend. MSG msg; - while (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) + while (::PeekMessage(&msg, nullptr, 0U, 0U, PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); @@ -135,6 +140,14 @@ int main(int, char**) if (done) break; + // Handle window screen locked + if (g_SwapChainOccluded && g_pSwapChain->Present(0, DXGI_PRESENT_TEST) == DXGI_STATUS_OCCLUDED) + { + ::Sleep(10); + continue; + } + g_SwapChainOccluded = false; + // Start the Dear ImGui frame ImGui_ImplDX12_NewFrame(); ImGui_ImplWin32_NewFrame(); @@ -144,7 +157,7 @@ int main(int, char**) if (show_demo_window) ImGui::ShowDemoWindow(&show_demo_window); - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. { static float f = 0.0f; static int counter = 0; @@ -163,7 +176,7 @@ int main(int, char**) ImGui::SameLine(); ImGui::Text("counter = %d", counter); - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); ImGui::End(); } @@ -191,13 +204,13 @@ int main(int, char**) barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_PRESENT; barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_RENDER_TARGET; - g_pd3dCommandList->Reset(frameCtx->CommandAllocator, NULL); + g_pd3dCommandList->Reset(frameCtx->CommandAllocator, nullptr); g_pd3dCommandList->ResourceBarrier(1, &barrier); // Render Dear ImGui graphics const float clear_color_with_alpha[4] = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w }; - g_pd3dCommandList->ClearRenderTargetView(g_mainRenderTargetDescriptor[backBufferIdx], clear_color_with_alpha, 0, NULL); - g_pd3dCommandList->OMSetRenderTargets(1, &g_mainRenderTargetDescriptor[backBufferIdx], FALSE, NULL); + g_pd3dCommandList->ClearRenderTargetView(g_mainRenderTargetDescriptor[backBufferIdx], clear_color_with_alpha, 0, nullptr); + g_pd3dCommandList->OMSetRenderTargets(1, &g_mainRenderTargetDescriptor[backBufferIdx], FALSE, nullptr); g_pd3dCommandList->SetDescriptorHeaps(1, &g_pd3dSrvDescHeap); ImGui_ImplDX12_RenderDrawData(ImGui::GetDrawData(), g_pd3dCommandList); barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET; @@ -207,8 +220,10 @@ int main(int, char**) g_pd3dCommandQueue->ExecuteCommandLists(1, (ID3D12CommandList* const*)&g_pd3dCommandList); - g_pSwapChain->Present(1, 0); // Present with vsync - //g_pSwapChain->Present(0, 0); // Present without vsync + // Present + HRESULT hr = g_pSwapChain->Present(1, 0); // Present with vsync + //HRESULT hr = g_pSwapChain->Present(0, 0); // Present without vsync + g_SwapChainOccluded = (hr == DXGI_STATUS_OCCLUDED); UINT64 fenceValue = g_fenceLastSignaledValue + 1; g_pd3dCommandQueue->Signal(g_fence, fenceValue); @@ -225,7 +240,7 @@ int main(int, char**) CleanupDeviceD3D(); ::DestroyWindow(hwnd); - ::UnregisterClass(wc.lpszClassName, wc.hInstance); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); return 0; } @@ -254,21 +269,21 @@ bool CreateDeviceD3D(HWND hWnd) // [DEBUG] Enable debug interface #ifdef DX12_ENABLE_DEBUG_LAYER - ID3D12Debug* pdx12Debug = NULL; + ID3D12Debug* pdx12Debug = nullptr; if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&pdx12Debug)))) pdx12Debug->EnableDebugLayer(); #endif // Create device D3D_FEATURE_LEVEL featureLevel = D3D_FEATURE_LEVEL_11_0; - if (D3D12CreateDevice(NULL, featureLevel, IID_PPV_ARGS(&g_pd3dDevice)) != S_OK) + if (D3D12CreateDevice(nullptr, featureLevel, IID_PPV_ARGS(&g_pd3dDevice)) != S_OK) return false; // [DEBUG] Setup debug interface to break on any warnings/errors #ifdef DX12_ENABLE_DEBUG_LAYER - if (pdx12Debug != NULL) + if (pdx12Debug != nullptr) { - ID3D12InfoQueue* pInfoQueue = NULL; + ID3D12InfoQueue* pInfoQueue = nullptr; g_pd3dDevice->QueryInterface(IID_PPV_ARGS(&pInfoQueue)); pInfoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_ERROR, true); pInfoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_CORRUPTION, true); @@ -318,23 +333,23 @@ bool CreateDeviceD3D(HWND hWnd) if (g_pd3dDevice->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&g_frameContext[i].CommandAllocator)) != S_OK) return false; - if (g_pd3dDevice->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, g_frameContext[0].CommandAllocator, NULL, IID_PPV_ARGS(&g_pd3dCommandList)) != S_OK || + if (g_pd3dDevice->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, g_frameContext[0].CommandAllocator, nullptr, IID_PPV_ARGS(&g_pd3dCommandList)) != S_OK || g_pd3dCommandList->Close() != S_OK) return false; if (g_pd3dDevice->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&g_fence)) != S_OK) return false; - g_fenceEvent = CreateEvent(NULL, FALSE, FALSE, NULL); - if (g_fenceEvent == NULL) + g_fenceEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); + if (g_fenceEvent == nullptr) return false; { - IDXGIFactory4* dxgiFactory = NULL; - IDXGISwapChain1* swapChain1 = NULL; + IDXGIFactory4* dxgiFactory = nullptr; + IDXGISwapChain1* swapChain1 = nullptr; if (CreateDXGIFactory1(IID_PPV_ARGS(&dxgiFactory)) != S_OK) return false; - if (dxgiFactory->CreateSwapChainForHwnd(g_pd3dCommandQueue, hWnd, &sd, NULL, NULL, &swapChain1) != S_OK) + if (dxgiFactory->CreateSwapChainForHwnd(g_pd3dCommandQueue, hWnd, &sd, nullptr, nullptr, &swapChain1) != S_OK) return false; if (swapChain1->QueryInterface(IID_PPV_ARGS(&g_pSwapChain)) != S_OK) return false; @@ -351,20 +366,20 @@ bool CreateDeviceD3D(HWND hWnd) void CleanupDeviceD3D() { CleanupRenderTarget(); - if (g_pSwapChain) { g_pSwapChain->SetFullscreenState(false, NULL); g_pSwapChain->Release(); g_pSwapChain = NULL; } - if (g_hSwapChainWaitableObject != NULL) { CloseHandle(g_hSwapChainWaitableObject); } + if (g_pSwapChain) { g_pSwapChain->SetFullscreenState(false, nullptr); g_pSwapChain->Release(); g_pSwapChain = nullptr; } + if (g_hSwapChainWaitableObject != nullptr) { CloseHandle(g_hSwapChainWaitableObject); } for (UINT i = 0; i < NUM_FRAMES_IN_FLIGHT; i++) - if (g_frameContext[i].CommandAllocator) { g_frameContext[i].CommandAllocator->Release(); g_frameContext[i].CommandAllocator = NULL; } - if (g_pd3dCommandQueue) { g_pd3dCommandQueue->Release(); g_pd3dCommandQueue = NULL; } - if (g_pd3dCommandList) { g_pd3dCommandList->Release(); g_pd3dCommandList = NULL; } - if (g_pd3dRtvDescHeap) { g_pd3dRtvDescHeap->Release(); g_pd3dRtvDescHeap = NULL; } - if (g_pd3dSrvDescHeap) { g_pd3dSrvDescHeap->Release(); g_pd3dSrvDescHeap = NULL; } - if (g_fence) { g_fence->Release(); g_fence = NULL; } - if (g_fenceEvent) { CloseHandle(g_fenceEvent); g_fenceEvent = NULL; } - if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; } + if (g_frameContext[i].CommandAllocator) { g_frameContext[i].CommandAllocator->Release(); g_frameContext[i].CommandAllocator = nullptr; } + if (g_pd3dCommandQueue) { g_pd3dCommandQueue->Release(); g_pd3dCommandQueue = nullptr; } + if (g_pd3dCommandList) { g_pd3dCommandList->Release(); g_pd3dCommandList = nullptr; } + if (g_pd3dRtvDescHeap) { g_pd3dRtvDescHeap->Release(); g_pd3dRtvDescHeap = nullptr; } + if (g_pd3dSrvDescHeap) { g_pd3dSrvDescHeap->Release(); g_pd3dSrvDescHeap = nullptr; } + if (g_fence) { g_fence->Release(); g_fence = nullptr; } + if (g_fenceEvent) { CloseHandle(g_fenceEvent); g_fenceEvent = nullptr; } + if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = nullptr; } #ifdef DX12_ENABLE_DEBUG_LAYER - IDXGIDebug1* pDebug = NULL; + IDXGIDebug1* pDebug = nullptr; if (SUCCEEDED(DXGIGetDebugInterface1(0, IID_PPV_ARGS(&pDebug)))) { pDebug->ReportLiveObjects(DXGI_DEBUG_ALL, DXGI_DEBUG_RLO_SUMMARY); @@ -377,9 +392,9 @@ void CreateRenderTarget() { for (UINT i = 0; i < NUM_BACK_BUFFERS; i++) { - ID3D12Resource* pBackBuffer = NULL; + ID3D12Resource* pBackBuffer = nullptr; g_pSwapChain->GetBuffer(i, IID_PPV_ARGS(&pBackBuffer)); - g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, g_mainRenderTargetDescriptor[i]); + g_pd3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, g_mainRenderTargetDescriptor[i]); g_mainRenderTargetResource[i] = pBackBuffer; } } @@ -389,7 +404,7 @@ void CleanupRenderTarget() WaitForLastSubmittedFrame(); for (UINT i = 0; i < NUM_BACK_BUFFERS; i++) - if (g_mainRenderTargetResource[i]) { g_mainRenderTargetResource[i]->Release(); g_mainRenderTargetResource[i] = NULL; } + if (g_mainRenderTargetResource[i]) { g_mainRenderTargetResource[i]->Release(); g_mainRenderTargetResource[i] = nullptr; } } void WaitForLastSubmittedFrame() @@ -413,7 +428,7 @@ FrameContext* WaitForNextFrameResources() UINT nextFrameIndex = g_frameIndex + 1; g_frameIndex = nextFrameIndex; - HANDLE waitableObjects[] = { g_hSwapChainWaitableObject, NULL }; + HANDLE waitableObjects[] = { g_hSwapChainWaitableObject, nullptr }; DWORD numWaitableObjects = 1; FrameContext* frameCtx = &g_frameContext[nextFrameIndex % NUM_FRAMES_IN_FLIGHT]; @@ -435,6 +450,10 @@ FrameContext* WaitForNextFrameResources() extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); // Win32 message handler +// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. +// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. +// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. +// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) @@ -443,7 +462,7 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) switch (msg) { case WM_SIZE: - if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED) + if (g_pd3dDevice != nullptr && wParam != SIZE_MINIMIZED) { WaitForLastSubmittedFrame(); CleanupRenderTarget(); @@ -460,5 +479,5 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) ::PostQuitMessage(0); return 0; } - return ::DefWindowProc(hWnd, msg, wParam, lParam); + return ::DefWindowProcW(hWnd, msg, wParam, lParam); } diff --git a/third_party/imgui/examples/example_win32_directx9/build_win32.bat b/third_party/imgui/examples/example_win32_directx9/build_win32.bat index bbd4b13ca94..ece5ea1ba0a 100644 --- a/third_party/imgui/examples/example_win32_directx9/build_win32.bat +++ b/third_party/imgui/examples/example_win32_directx9/build_win32.bat @@ -5,4 +5,4 @@ @set SOURCES=main.cpp ..\..\backends\imgui_impl_dx9.cpp ..\..\backends\imgui_impl_win32.cpp ..\..\imgui*.cpp @set LIBS=/LIBPATH:"%DXSDK_DIR%/Lib/x86" d3d9.lib mkdir %OUT_DIR% -cl /nologo /Zi /MD %INCLUDES% /D UNICODE /D _UNICODE %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% +cl /nologo /Zi /MD /utf-8 %INCLUDES% /D UNICODE /D _UNICODE %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/third_party/imgui/examples/example_win32_directx9/example_win32_directx9.vcxproj b/third_party/imgui/examples/example_win32_directx9/example_win32_directx9.vcxproj index e01eca14620..8c3f99589bb 100644 --- a/third_party/imgui/examples/example_win32_directx9/example_win32_directx9.vcxproj +++ b/third_party/imgui/examples/example_win32_directx9/example_win32_directx9.vcxproj @@ -87,6 +87,7 @@ Level4 Disabled ..\..;..\..\backends;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include; + /utf-8 %(AdditionalOptions) true @@ -100,6 +101,7 @@ Level4 Disabled ..\..;..\..\backends;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include; + /utf-8 %(AdditionalOptions) true @@ -116,6 +118,7 @@ true ..\..;..\..\backends;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include; false + /utf-8 %(AdditionalOptions) true @@ -134,6 +137,7 @@ true ..\..;..\..\backends;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include; false + /utf-8 %(AdditionalOptions) true @@ -162,6 +166,7 @@ + diff --git a/third_party/imgui/examples/example_win32_directx9/example_win32_directx9.vcxproj.filters b/third_party/imgui/examples/example_win32_directx9/example_win32_directx9.vcxproj.filters index 9493970b64c..5ed89d6fde4 100644 --- a/third_party/imgui/examples/example_win32_directx9/example_win32_directx9.vcxproj.filters +++ b/third_party/imgui/examples/example_win32_directx9/example_win32_directx9.vcxproj.filters @@ -55,7 +55,10 @@ - sources + imgui + + + imgui - + \ No newline at end of file diff --git a/third_party/imgui/examples/example_win32_directx9/main.cpp b/third_party/imgui/examples/example_win32_directx9/main.cpp index bdcd8b3e8c0..422248bcbf6 100644 --- a/third_party/imgui/examples/example_win32_directx9/main.cpp +++ b/third_party/imgui/examples/example_win32_directx9/main.cpp @@ -1,6 +1,10 @@ // Dear ImGui: standalone example application for DirectX 9 -// 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 #include "imgui.h" #include "imgui_impl_dx9.h" @@ -9,8 +13,10 @@ #include // Data -static LPDIRECT3D9 g_pD3D = NULL; -static LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; +static LPDIRECT3D9 g_pD3D = nullptr; +static LPDIRECT3DDEVICE9 g_pd3dDevice = nullptr; +static bool g_DeviceLost = false; +static UINT g_ResizeWidth = 0, g_ResizeHeight = 0; static D3DPRESENT_PARAMETERS g_d3dpp = {}; // Forward declarations of helper functions @@ -24,15 +30,15 @@ int main(int, char**) { // Create application window //ImGui_ImplWin32_EnableDpiAwareness(); - WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, _T("ImGui Example"), NULL }; - ::RegisterClassEx(&wc); - HWND hwnd = ::CreateWindow(wc.lpszClassName, _T("Dear ImGui DirectX9 Example"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL); + WNDCLASSEXW wc = { sizeof(wc), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(nullptr), nullptr, nullptr, nullptr, nullptr, L"ImGui Example", nullptr }; + ::RegisterClassExW(&wc); + HWND hwnd = ::CreateWindowW(wc.lpszClassName, L"Dear ImGui DirectX9 Example", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, nullptr, nullptr, wc.hInstance, nullptr); // Initialize Direct3D if (!CreateDeviceD3D(hwnd)) { CleanupDeviceD3D(); - ::UnregisterClass(wc.lpszClassName, wc.hInstance); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); return 1; } @@ -44,12 +50,12 @@ int main(int, char**) IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls // Setup Dear ImGui style ImGui::StyleColorsDark(); - //ImGui::StyleColorsClassic(); + //ImGui::StyleColorsLight(); // Setup Platform/Renderer backends ImGui_ImplWin32_Init(hwnd); @@ -58,17 +64,18 @@ int main(int, char**) // Load Fonts // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. // - Read 'docs/FONTS.md' for more instructions and details. // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != NULL); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); // Our state bool show_demo_window = true; @@ -80,12 +87,9 @@ int main(int, char**) while (!done) { // Poll and handle messages (inputs, window resize, etc.) - // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. - // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application. - // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application. - // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + // See the WndProc() function below for our to dispatch events to the Win32 backend. MSG msg; - while (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) + while (::PeekMessage(&msg, nullptr, 0U, 0U, PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); @@ -95,6 +99,29 @@ int main(int, char**) if (done) break; + // Handle lost D3D9 device + if (g_DeviceLost) + { + HRESULT hr = g_pd3dDevice->TestCooperativeLevel(); + if (hr == D3DERR_DEVICELOST) + { + ::Sleep(10); + continue; + } + if (hr == D3DERR_DEVICENOTRESET) + ResetDevice(); + g_DeviceLost = false; + } + + // Handle window resize (we don't resize directly in the WM_SIZE handler) + if (g_ResizeWidth != 0 && g_ResizeHeight != 0) + { + g_d3dpp.BackBufferWidth = g_ResizeWidth; + g_d3dpp.BackBufferHeight = g_ResizeHeight; + g_ResizeWidth = g_ResizeHeight = 0; + ResetDevice(); + } + // Start the Dear ImGui frame ImGui_ImplDX9_NewFrame(); ImGui_ImplWin32_NewFrame(); @@ -104,7 +131,7 @@ int main(int, char**) if (show_demo_window) ImGui::ShowDemoWindow(&show_demo_window); - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window. + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. { static float f = 0.0f; static int counter = 0; @@ -123,7 +150,7 @@ int main(int, char**) ImGui::SameLine(); ImGui::Text("counter = %d", counter); - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); ImGui::End(); } @@ -143,27 +170,26 @@ int main(int, char**) g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); g_pd3dDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); D3DCOLOR clear_col_dx = D3DCOLOR_RGBA((int)(clear_color.x*clear_color.w*255.0f), (int)(clear_color.y*clear_color.w*255.0f), (int)(clear_color.z*clear_color.w*255.0f), (int)(clear_color.w*255.0f)); - g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, clear_col_dx, 1.0f, 0); + g_pd3dDevice->Clear(0, nullptr, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, clear_col_dx, 1.0f, 0); if (g_pd3dDevice->BeginScene() >= 0) { ImGui::Render(); ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData()); g_pd3dDevice->EndScene(); } - HRESULT result = g_pd3dDevice->Present(NULL, NULL, NULL, NULL); - - // Handle loss of D3D9 device - if (result == D3DERR_DEVICELOST && g_pd3dDevice->TestCooperativeLevel() == D3DERR_DEVICENOTRESET) - ResetDevice(); + HRESULT result = g_pd3dDevice->Present(nullptr, nullptr, nullptr, nullptr); + if (result == D3DERR_DEVICELOST) + g_DeviceLost = true; } + // Cleanup ImGui_ImplDX9_Shutdown(); ImGui_ImplWin32_Shutdown(); ImGui::DestroyContext(); CleanupDeviceD3D(); ::DestroyWindow(hwnd); - ::UnregisterClass(wc.lpszClassName, wc.hInstance); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); return 0; } @@ -172,7 +198,7 @@ int main(int, char**) bool CreateDeviceD3D(HWND hWnd) { - if ((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL) + if ((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == nullptr) return false; // Create the D3DDevice @@ -192,8 +218,8 @@ bool CreateDeviceD3D(HWND hWnd) void CleanupDeviceD3D() { - if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; } - if (g_pD3D) { g_pD3D->Release(); g_pD3D = NULL; } + if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = nullptr; } + if (g_pD3D) { g_pD3D->Release(); g_pD3D = nullptr; } } void ResetDevice() @@ -209,6 +235,10 @@ void ResetDevice() extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); // Win32 message handler +// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. +// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. +// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. +// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) @@ -217,12 +247,10 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) switch (msg) { case WM_SIZE: - if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED) - { - g_d3dpp.BackBufferWidth = LOWORD(lParam); - g_d3dpp.BackBufferHeight = HIWORD(lParam); - ResetDevice(); - } + if (wParam == SIZE_MINIMIZED) + return 0; + g_ResizeWidth = (UINT)LOWORD(lParam); // Queue resize + g_ResizeHeight = (UINT)HIWORD(lParam); return 0; case WM_SYSCOMMAND: if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu @@ -232,5 +260,5 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) ::PostQuitMessage(0); return 0; } - return ::DefWindowProc(hWnd, msg, wParam, lParam); + return ::DefWindowProcW(hWnd, msg, wParam, lParam); } diff --git a/third_party/imgui/examples/example_win32_opengl3/build_win32.bat b/third_party/imgui/examples/example_win32_opengl3/build_win32.bat new file mode 100644 index 00000000000..48df0808708 --- /dev/null +++ b/third_party/imgui/examples/example_win32_opengl3/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_win32_opengl3 +@set INCLUDES=/I..\.. /I..\..\backends +@set SOURCES=main.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\backends\imgui_impl_win32.cpp ..\..\imgui*.cpp +@set LIBS=opengl32.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% /D UNICODE /D _UNICODE %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/third_party/imgui/examples/example_win32_opengl3/example_win32_opengl3.vcxproj b/third_party/imgui/examples/example_win32_opengl3/example_win32_opengl3.vcxproj new file mode 100644 index 00000000000..98fc38fd34d --- /dev/null +++ b/third_party/imgui/examples/example_win32_opengl3/example_win32_opengl3.vcxproj @@ -0,0 +1,176 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {C624E5FF-D4FE-4D35-9164-B8A91864F98E} + example_win32_opengl2 + 8.1 + + + + Application + true + Unicode + v140 + + + Application + true + Unicode + v140 + + + Application + false + true + Unicode + v140 + + + Application + false + true + Unicode + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + + Level4 + Disabled + ..\..;..\..\backends; + /utf-8 %(AdditionalOptions) + + + true + %(AdditionalLibraryDirectories) + opengl32.lib;%(AdditionalDependencies) + Console + + + + + Level4 + Disabled + ..\..;..\..\backends; + /utf-8 %(AdditionalOptions) + + + true + %(AdditionalLibraryDirectories) + opengl32.lib;%(AdditionalDependencies) + Console + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends; + false + /utf-8 %(AdditionalOptions) + + + true + true + true + %(AdditionalLibraryDirectories) + opengl32.lib;%(AdditionalDependencies) + Console + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends; + false + /utf-8 %(AdditionalOptions) + + + true + true + true + %(AdditionalLibraryDirectories) + opengl32.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/third_party/imgui/examples/example_win32_opengl3/example_win32_opengl3.vcxproj.filters b/third_party/imgui/examples/example_win32_opengl3/example_win32_opengl3.vcxproj.filters new file mode 100644 index 00000000000..47ed299bc70 --- /dev/null +++ b/third_party/imgui/examples/example_win32_opengl3/example_win32_opengl3.vcxproj.filters @@ -0,0 +1,64 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {a82cba23-9de0-45c2-b1e3-2eb1666702de} + + + + + sources + + + imgui + + + imgui + + + imgui + + + imgui + + + sources + + + imgui + + + sources + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + sources + + + + + + sources + + + \ No newline at end of file diff --git a/third_party/imgui/examples/example_win32_opengl3/main.cpp b/third_party/imgui/examples/example_win32_opengl3/main.cpp new file mode 100644 index 00000000000..594931dca83 --- /dev/null +++ b/third_party/imgui/examples/example_win32_opengl3/main.cpp @@ -0,0 +1,238 @@ +// Dear ImGui: standalone example application for Win32 + OpenGL 3 + +// 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 + +// This is provided for completeness, however it is strongly recommended you use OpenGL with SDL or GLFW. + +#include "imgui.h" +#include "imgui_impl_opengl3.h" +#include "imgui_impl_win32.h" +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#include +#include + +// Data stored per platform window +struct WGL_WindowData { HDC hDC; }; + +// Data +static HGLRC g_hRC; +static WGL_WindowData g_MainWindow; +static int g_Width; +static int g_Height; + +// Forward declarations of helper functions +bool CreateDeviceWGL(HWND hWnd, WGL_WindowData* data); +void CleanupDeviceWGL(HWND hWnd, WGL_WindowData* data); +void ResetDeviceWGL(); +LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +// Main code +int main(int, char**) +{ + // Create application window + //ImGui_ImplWin32_EnableDpiAwareness(); + WNDCLASSEXW wc = { sizeof(wc), CS_OWNDC, WndProc, 0L, 0L, GetModuleHandle(nullptr), nullptr, nullptr, nullptr, nullptr, L"ImGui Example", nullptr }; + ::RegisterClassExW(&wc); + HWND hwnd = ::CreateWindowW(wc.lpszClassName, L"Dear ImGui Win32+OpenGL3 Example", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, nullptr, nullptr, wc.hInstance, nullptr); + + // Initialize OpenGL + if (!CreateDeviceWGL(hwnd, &g_MainWindow)) + { + CleanupDeviceWGL(hwnd, &g_MainWindow); + ::DestroyWindow(hwnd); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); + return 1; + } + wglMakeCurrent(g_MainWindow.hDC, g_hRC); + + // Show the window + ::ShowWindow(hwnd, SW_SHOWDEFAULT); + ::UpdateWindow(hwnd); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsClassic(); + + // Setup Platform/Renderer backends + ImGui_ImplWin32_InitForOpenGL(hwnd); + ImGui_ImplOpenGL3_Init(); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + bool done = false; + while (!done) + { + // Poll and handle messages (inputs, window resize, etc.) + // See the WndProc() function below for our to dispatch events to the Win32 backend. + MSG msg; + while (::PeekMessage(&msg, nullptr, 0U, 0U, PM_REMOVE)) + { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + if (msg.message == WM_QUIT) + done = true; + } + if (done) + break; + + // Start the Dear ImGui frame + ImGui_ImplOpenGL3_NewFrame(); + ImGui_ImplWin32_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + glViewport(0, 0, g_Width, g_Height); + glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w); + glClear(GL_COLOR_BUFFER_BIT); + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + + // Present + ::SwapBuffers(g_MainWindow.hDC); + } + + ImGui_ImplOpenGL3_Shutdown(); + ImGui_ImplWin32_Shutdown(); + ImGui::DestroyContext(); + + CleanupDeviceWGL(hwnd, &g_MainWindow); + wglDeleteContext(g_hRC); + ::DestroyWindow(hwnd); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); + + return 0; +} + +// Helper functions +bool CreateDeviceWGL(HWND hWnd, WGL_WindowData* data) +{ + HDC hDc = ::GetDC(hWnd); + PIXELFORMATDESCRIPTOR pfd = { 0 }; + pfd.nSize = sizeof(pfd); + pfd.nVersion = 1; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cColorBits = 32; + + const int pf = ::ChoosePixelFormat(hDc, &pfd); + if (pf == 0) + return false; + if (::SetPixelFormat(hDc, pf, &pfd) == FALSE) + return false; + ::ReleaseDC(hWnd, hDc); + + data->hDC = ::GetDC(hWnd); + if (!g_hRC) + g_hRC = wglCreateContext(data->hDC); + return true; +} + +void CleanupDeviceWGL(HWND hWnd, WGL_WindowData* data) +{ + wglMakeCurrent(nullptr, nullptr); + ::ReleaseDC(hWnd, data->hDC); +} + +// Forward declare message handler from imgui_impl_win32.cpp +extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +// Win32 message handler +// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. +// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. +// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. +// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. +LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) + return true; + + switch (msg) + { + case WM_SIZE: + if (wParam != SIZE_MINIMIZED) + { + g_Width = LOWORD(lParam); + g_Height = HIWORD(lParam); + } + return 0; + case WM_SYSCOMMAND: + if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu + return 0; + break; + case WM_DESTROY: + ::PostQuitMessage(0); + return 0; + } + return ::DefWindowProcW(hWnd, msg, wParam, lParam); +} diff --git a/third_party/imgui/examples/imgui_examples.sln b/third_party/imgui/examples/imgui_examples.sln index df1006d54e6..071bcbd6382 100644 --- a/third_party/imgui/examples/imgui_examples.sln +++ b/third_party/imgui/examples/imgui_examples.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32616.157 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_win32_directx9", "example_win32_directx9\example_win32_directx9.vcxproj", "{4165A294-21F2-44CA-9B38-E3F935ABADF5}" EndProject @@ -17,6 +17,18 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_glfw_opengl3", "exa EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_glfw_vulkan", "example_glfw_vulkan\example_glfw_vulkan.vcxproj", "{57E2DF5A-6FC8-45BB-99DD-91A18C646E80}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl2_directx11", "example_sdl2_directx11\example_sdl2_directx11.vcxproj", "{9E1987E3-1F19-45CA-B9C9-D31E791836D8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl2_opengl2", "example_sdl2_opengl2\example_sdl2_opengl2.vcxproj", "{2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl2_opengl3", "example_sdl2_opengl3\example_sdl2_opengl3.vcxproj", "{BBAEB705-1669-40F3-8567-04CF6A991F4C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl2_vulkan", "example_sdl2_vulkan\example_sdl2_vulkan.vcxproj", "{BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_win32_opengl3", "example_win32_opengl3\example_win32_opengl3.vcxproj", "{C624E5FF-D4FE-4D35-9164-B8A91864F98E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl2_sdlrenderer2", "example_sdl2_sdlrenderer2\example_sdl2_sdlrenderer2.vcxproj", "{0C0B2BEA-311F-473C-9652-87923EF639E3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -81,8 +93,59 @@ Global {57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Release|Win32.Build.0 = Release|Win32 {57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Release|x64.ActiveCfg = Release|x64 {57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Release|x64.Build.0 = Release|x64 + {9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Debug|Win32.ActiveCfg = Debug|Win32 + {9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Debug|Win32.Build.0 = Debug|Win32 + {9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Debug|x64.ActiveCfg = Debug|x64 + {9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Debug|x64.Build.0 = Debug|x64 + {9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Release|Win32.ActiveCfg = Release|Win32 + {9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Release|Win32.Build.0 = Release|Win32 + {9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Release|x64.ActiveCfg = Release|x64 + {9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Release|x64.Build.0 = Release|x64 + {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Debug|Win32.ActiveCfg = Debug|Win32 + {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Debug|Win32.Build.0 = Debug|Win32 + {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Debug|x64.ActiveCfg = Debug|x64 + {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Debug|x64.Build.0 = Debug|x64 + {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Release|Win32.ActiveCfg = Release|Win32 + {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Release|Win32.Build.0 = Release|Win32 + {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Release|x64.ActiveCfg = Release|x64 + {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Release|x64.Build.0 = Release|x64 + {BBAEB705-1669-40F3-8567-04CF6A991F4C}.Debug|Win32.ActiveCfg = Debug|Win32 + {BBAEB705-1669-40F3-8567-04CF6A991F4C}.Debug|Win32.Build.0 = Debug|Win32 + {BBAEB705-1669-40F3-8567-04CF6A991F4C}.Debug|x64.ActiveCfg = Debug|x64 + {BBAEB705-1669-40F3-8567-04CF6A991F4C}.Debug|x64.Build.0 = Debug|x64 + {BBAEB705-1669-40F3-8567-04CF6A991F4C}.Release|Win32.ActiveCfg = Release|Win32 + {BBAEB705-1669-40F3-8567-04CF6A991F4C}.Release|Win32.Build.0 = Release|Win32 + {BBAEB705-1669-40F3-8567-04CF6A991F4C}.Release|x64.ActiveCfg = Release|x64 + {BBAEB705-1669-40F3-8567-04CF6A991F4C}.Release|x64.Build.0 = Release|x64 + {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Debug|Win32.ActiveCfg = Debug|Win32 + {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Debug|Win32.Build.0 = Debug|Win32 + {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Debug|x64.ActiveCfg = Debug|x64 + {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Debug|x64.Build.0 = Debug|x64 + {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Release|Win32.ActiveCfg = Release|Win32 + {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Release|Win32.Build.0 = Release|Win32 + {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Release|x64.ActiveCfg = Release|x64 + {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Release|x64.Build.0 = Release|x64 + {C624E5FF-D4FE-4D35-9164-B8A91864F98E}.Debug|Win32.ActiveCfg = Debug|Win32 + {C624E5FF-D4FE-4D35-9164-B8A91864F98E}.Debug|Win32.Build.0 = Debug|Win32 + {C624E5FF-D4FE-4D35-9164-B8A91864F98E}.Debug|x64.ActiveCfg = Debug|x64 + {C624E5FF-D4FE-4D35-9164-B8A91864F98E}.Debug|x64.Build.0 = Debug|x64 + {C624E5FF-D4FE-4D35-9164-B8A91864F98E}.Release|Win32.ActiveCfg = Release|Win32 + {C624E5FF-D4FE-4D35-9164-B8A91864F98E}.Release|Win32.Build.0 = Release|Win32 + {C624E5FF-D4FE-4D35-9164-B8A91864F98E}.Release|x64.ActiveCfg = Release|x64 + {C624E5FF-D4FE-4D35-9164-B8A91864F98E}.Release|x64.Build.0 = Release|x64 + {0C0B2BEA-311F-473C-9652-87923EF639E3}.Debug|Win32.ActiveCfg = Debug|Win32 + {0C0B2BEA-311F-473C-9652-87923EF639E3}.Debug|Win32.Build.0 = Debug|Win32 + {0C0B2BEA-311F-473C-9652-87923EF639E3}.Debug|x64.ActiveCfg = Debug|x64 + {0C0B2BEA-311F-473C-9652-87923EF639E3}.Debug|x64.Build.0 = Debug|x64 + {0C0B2BEA-311F-473C-9652-87923EF639E3}.Release|Win32.ActiveCfg = Release|Win32 + {0C0B2BEA-311F-473C-9652-87923EF639E3}.Release|Win32.Build.0 = Release|Win32 + {0C0B2BEA-311F-473C-9652-87923EF639E3}.Release|x64.ActiveCfg = Release|x64 + {0C0B2BEA-311F-473C-9652-87923EF639E3}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B1ACFD20-A0A9-4A4C-ADBA-E7608F0E2BEE} + EndGlobalSection EndGlobal diff --git a/third_party/imgui/examples/libs/emscripten/emscripten_mainloop_stub.h b/third_party/imgui/examples/libs/emscripten/emscripten_mainloop_stub.h new file mode 100644 index 00000000000..05cf60fed73 --- /dev/null +++ b/third_party/imgui/examples/libs/emscripten/emscripten_mainloop_stub.h @@ -0,0 +1,37 @@ +// What does this file solves? +// - Since Dear ImGui 1.00 we took pride that most of our examples applications had their entire +// main-loop inside the main() function. That's because: +// - It makes the examples easier to read, keeping the code sequential. +// - It permit the use of local variables, making it easier to try things and perform quick +// changes when someone needs to quickly test something (vs having to structure the example +// in order to pass data around). This is very important because people use those examples +// to craft easy-to-past repro when they want to discuss features or report issues. +// - It conveys at a glance that this is a no-BS framework, it won't take your main loop away from you. +// - It is generally nice and elegant. +// - However, comes Emscripten... it is a wonderful and magical tech but it requires a "main loop" function. +// - Only some of our examples would run on Emscripten. Typically the ones rendering with GL or WGPU ones. +// - I tried to refactor those examples but felt it was problematic that other examples didn't follow the +// same layout. Why would the SDL+GL example be structured one way and the SGL+DX11 be structured differently? +// Especially as we are trying hard to convey that using a Dear ImGui backend in an *existing application* +// should requires only a few dozens lines of code, and this should be consistent and symmetrical for all backends. +// - So the next logical step was to refactor all examples to follow that layout of using a "main loop" function. +// This worked, but it made us lose all the nice things we had... + +// Since only about 3 examples really need to run with Emscripten, here's our solution: +// - Use some weird macros and capturing lambda to turn a loop in main() into a function. +// - Hide all that crap in this file so it doesn't make our examples unusually ugly. +// As a stance and principle of Dear ImGui development we don't use C++ headers and we don't +// want to suggest to the newcomer that we would ever use C++ headers as this would affect +// the initial judgment of many of our target audience. +// - Technique is based on this idea: https://github.com/ocornut/imgui/pull/2492/ +#ifdef __EMSCRIPTEN__ +#include +#include +static std::function MainLoopForEmscriptenP; +static void MainLoopForEmscripten() { MainLoopForEmscriptenP(); } +#define EMSCRIPTEN_MAINLOOP_BEGIN MainLoopForEmscriptenP = [&]() +#define EMSCRIPTEN_MAINLOOP_END ; emscripten_set_main_loop(MainLoopForEmscripten, 0, true) +#else +#define EMSCRIPTEN_MAINLOOP_BEGIN +#define EMSCRIPTEN_MAINLOOP_END +#endif diff --git a/third_party/imgui/examples/example_emscripten_opengl3/shell_minimal.html b/third_party/imgui/examples/libs/emscripten/shell_minimal.html similarity index 95% rename from third_party/imgui/examples/example_emscripten_opengl3/shell_minimal.html rename to third_party/imgui/examples/libs/emscripten/shell_minimal.html index 514385d7cf5..bcf626261f5 100644 --- a/third_party/imgui/examples/example_emscripten_opengl3/shell_minimal.html +++ b/third_party/imgui/examples/libs/emscripten/shell_minimal.html @@ -6,6 +6,7 @@ Dear ImGui Emscripten example